diff --git a/Demos/AllBulletDemos/CMakeLists.txt b/Demos/AllBulletDemos/CMakeLists.txt index 177795421..0b8d14e2e 100644 --- a/Demos/AllBulletDemos/CMakeLists.txt +++ b/Demos/AllBulletDemos/CMakeLists.txt @@ -1,101 +1,101 @@ -# 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 -######################################################## - -LINK_DIRECTORIES( -"C:/MinGW/lib" -) - -INCLUDE_DIRECTORIES( -${BULLET_PHYSICS_SOURCE_DIR}/Extras -${BULLET_PHYSICS_SOURCE_DIR}/Extras/GIMPACTUtils -${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition -${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML -${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include -${BULLET_PHYSICS_SOURCE_DIR}/src -${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter -) - -LINK_LIBRARIES( -GLUI GIMPACTUtils ConvexDecomposition OpenGLSupport BulletWorldImporter BulletSoftBody BulletDynamics BulletCollision BulletFileLoader LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -SET(AllBulletDemos_SRCS - Main.cpp - DemoEntries.cpp - ../CcdPhysicsDemo/CcdPhysicsDemo.cpp - ../BasicDemo/BasicDemo.cpp - ../BspDemo/BspDemo.cpp - ../BspDemo/BspConverter.cpp - ../BspDemo/BspLoader.cpp - ../DynamicControlDemo/MotorDemo.cpp - ../ConcaveDemo/ConcavePhysicsDemo.cpp - ../ConcaveRaycastDemo/ConcaveRaycastDemo.cpp - ../ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp - ../ConvexDecompositionDemo/ConvexDecompositionDemo.cpp - ../SliderConstraintDemo/SliderConstraintDemo.cpp - ../RagdollDemo/RagdollDemo.cpp - ../GimpactTestDemo/GimpactTestDemo.cpp - ../Raytracer/Raytracer.cpp - ../GjkConvexCastDemo/LinearConvexCastDemo.cpp - ../ForkLiftDemo/ForkLiftDemo.cpp - ../SoftDemo/SoftDemo.cpp - ../ConstraintDemo/ConstraintDemo.cpp -) - -IF (WIN32) - ADD_EXECUTABLE(AppAllBulletDemos - ${AllBulletDemos_SRCS} - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ELSE() - ADD_EXECUTABLE(AppAllBulletDemos - ${AllBulletDemos_SRCS} - ) -ENDIF() - - -IF (WIN32) - IF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppAllBulletDemos - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppAllBulletDemos - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) -ENDIF(WIN32) - - -IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ADD_CUSTOM_COMMAND( - TARGET AppAllBulletDemos - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/SerializeDemo/testFile.bullet ${CMAKE_CURRENT_BINARY_DIR}/testFile.bullet - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/file.obj ${CMAKE_CURRENT_BINARY_DIR} - ) -ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - - - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppAllBulletDemos PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppAllBulletDemos PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppAllBulletDemos PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") -ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) +# 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 +######################################################## + +LINK_DIRECTORIES( +"C:/MinGW/lib" +) + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/Extras +${BULLET_PHYSICS_SOURCE_DIR}/Extras/GIMPACTUtils +${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition +${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML +${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include +${BULLET_PHYSICS_SOURCE_DIR}/src +${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter +) + +LINK_LIBRARIES( +GLUI GIMPACTUtils ConvexDecomposition OpenGLSupport BulletWorldImporter BulletSoftBody BulletDynamics BulletCollision BulletFileLoader LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +SET(AllBulletDemos_SRCS + Main.cpp + DemoEntries.cpp + ../CcdPhysicsDemo/CcdPhysicsDemo.cpp + ../BasicDemo/BasicDemo.cpp + ../BspDemo/BspDemo.cpp + ../BspDemo/BspConverter.cpp + ../BspDemo/BspLoader.cpp + ../DynamicControlDemo/MotorDemo.cpp + ../ConcaveDemo/ConcavePhysicsDemo.cpp + ../ConcaveRaycastDemo/ConcaveRaycastDemo.cpp + ../ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp + ../ConvexDecompositionDemo/ConvexDecompositionDemo.cpp + ../SliderConstraintDemo/SliderConstraintDemo.cpp + ../RagdollDemo/RagdollDemo.cpp + ../GimpactTestDemo/GimpactTestDemo.cpp + ../Raytracer/Raytracer.cpp + ../GjkConvexCastDemo/LinearConvexCastDemo.cpp + ../ForkLiftDemo/ForkLiftDemo.cpp + ../SoftDemo/SoftDemo.cpp + ../ConstraintDemo/ConstraintDemo.cpp +) + +IF (WIN32) + ADD_EXECUTABLE(AppAllBulletDemos + ${AllBulletDemos_SRCS} + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ELSE() + ADD_EXECUTABLE(AppAllBulletDemos + ${AllBulletDemos_SRCS} + ) +ENDIF() + + +IF (WIN32) + IF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppAllBulletDemos + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppAllBulletDemos + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) +ENDIF(WIN32) + + +IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ADD_CUSTOM_COMMAND( + TARGET AppAllBulletDemos + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/SerializeDemo/testFile.bullet ${CMAKE_CURRENT_BINARY_DIR}/testFile.bullet + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/file.obj ${CMAKE_CURRENT_BINARY_DIR} + ) +ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + + + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppAllBulletDemos PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppAllBulletDemos PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppAllBulletDemos PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/Demos/AllBulletDemos/DemoEntries.cpp b/Demos/AllBulletDemos/DemoEntries.cpp index ea4409ea0..0bbe86dd0 100644 --- a/Demos/AllBulletDemos/DemoEntries.cpp +++ b/Demos/AllBulletDemos/DemoEntries.cpp @@ -1,174 +1,174 @@ -/* -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 "DemoEntries.h" - -#include "../CcdPhysicsDemo/CcdPhysicsDemo.h" -#include "../BspDemo/BspDemo.h" -#include "../BasicDemo/BasicDemo.h" -#include "../ConcaveDemo/ConcaveDemo.h" -#include "../ConcaveRaycastDemo/ConcaveRaycastDemo.h" -#include "../ConcaveConvexcastDemo/ConcaveConvexcastDemo.h" -#include "../ConvexDecompositionDemo/ConvexDecompositionDemo.h" -#include "../DynamicControlDemo/MotorDemo.h" -#include "../SliderConstraintDemo/SliderConstraintDemo.h" -#include "../RagdollDemo/RagdollDemo.h" -#include "../GimpactTestDemo/GimpactTestDemo.h" -#include "../Raytracer/Raytracer.h" -#include "../GjkConvexCastDemo/LinearConvexCastDemo.h" -#include "../ForkLiftDemo/ForkLiftDemo.h" -#include "../ConstraintDemo/ConstraintDemo.h" -//#include "../Benchmarks/BenchmarkDemo.h" -#include "../SoftDemo/SoftDemo.h" -#include "GLDebugFont.h" - -#include "GlutStuff.h"//OpenGL stuff - - -extern int gNumAlignedAllocs; -extern int gNumAlignedFree; -extern int gTotalBytesAlignedAllocs; - -class btEmptyDebugDemo : public GlutDemoApplication -{ -public: - btEmptyDebugDemo() - { - - } - - virtual void clientMoveAndDisplay() - { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - 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,"gNumAlignedAllocs= %d",gNumAlignedAllocs); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"gNumAlignedFree= %d",gNumAlignedFree); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"# alloc-free = %d",gNumAlignedAllocs-gNumAlignedFree); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; -#ifdef BT_DEBUG_MEMORY_ALLOCATIONS - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"gTotalBytesAlignedAllocs = %d",gTotalBytesAlignedAllocs); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; -#endif //BT_DEBUG_MEMORY_ALLOCATIONS - - glFlush(); - glutSwapBuffers(); - - } - - virtual void initPhysics() {} - - static DemoApplication* Create() - { - btEmptyDebugDemo* demo = new btEmptyDebugDemo(); - demo->myinit(); - return demo; - } - -}; - - -btDemoEntry g_demoEntries[] = -{ - - {"ConstraintDemo",ConstraintDemo::Create}, - {"ForkLift Demo",ForkLiftDemo::Create}, - {"Ragdoll Demo",RagdollDemo::Create}, - {"Basic Demo", BasicDemo::Create}, - {"CcdPhysicsDemo", CcdPhysicsDemo::Create}, - {"Convex Decomposition",ConvexDecompositionDemo::Create}, - {"Concave Moving", GimpactConcaveDemo::Create}, - {"Dynamic Control Demo",MotorDemo::Create}, - {"ConcaveDemo",ConcaveDemo::Create}, - {"Concave Convexcast Demo",ConcaveConvexcastDemo::Create}, - {"SoftBody Cluster Collide1",SoftDemo19::Create}, - - {"SoftBody Ropes Attach",SoftDemo4::Create}, - - {"SoftBody Cloth Attach",SoftDemo5::Create}, - - {"SoftBody Cloth",SoftDemo0::Create}, - -// {"SoftBody Volume",SoftDemo2::Create}, - {"SoftBody Pressure",SoftDemo1::Create}, - {"SoftBody Cluster Car",SoftDemo24::Create}, - {"SoftBody Cluster Robot",SoftDemo25::Create}, - // {"SoftBody Ropes",SoftDemo3::Create}, - {"SoftBody Sticks",SoftDemo6::Create}, - {"SoftBody Collide",SoftDemo7::Create}, - {"SoftBody Collide2",SoftDemo8::Create}, -// {"SoftBody Collide3",SoftDemo9::Create}, -// {"SoftBody Impact",SoftDemo10::Create}, - {"SoftBody Aero",SoftDemo11::Create}, - {"SoftBody Friction",SoftDemo12::Create}, -// {"SoftBody Torus",SoftDemo13::Create}, -// {"SoftBody Torus Match",SoftDemo14::Create}, -// {"SoftBody Bunny",SoftDemo15::Create}, -// {"SoftBody Bunny Match",SoftDemo16::Create}, - {"SoftBody Init Cutting",SoftDemo17::Create}, -// {"SoftBody Cluster Deform",SoftDemo18::Create}, - -// {"SoftBody Cluster Collide2",SoftDemo20::Create}, -// {"SoftBody Cluster Socket",SoftDemo21::Create}, - {"SoftBody Cluster Hinge",SoftDemo22::Create}, - {"SoftBody Cluster Combine",SoftDemo23::Create}, -// {"SoftBody Cluster Stack Soft",SoftDemo26::Create}, - {"SoftBody Cluster Stack Mixed",SoftDemo27::Create}, - - {"SoftBody TetGen Tetrahedral Cube",SoftDemo28::Create}, - {"SoftBody TetGen Tetrahedral Bunny",SoftDemo29::Create}, - - -// {"SliderConstraint",SliderConstraintDemo::Create}, - -// {"ConcaveRaycastDemo",ConcaveRaycastDemo::Create}, - //{"BspDemo", BspDemo::Create}, -// {"Raytracer Test",Raytracer::Create}, -// {"GjkConvexCast",LinearConvexCastDemo::Create}, -// {"Benchmark 3000 FALL",BenchmarkDemo1::Create}, -// {"Benchmark 1000 STACK",BenchmarkDemo2::Create}, -// {"Benchmark 136 RAGDOLLS",BenchmarkDemo3::Create}, -// {"Benchmark 1000 CONVEX",BenchmarkDemo4::Create}, -// {"Benchmark Mesh-Prim",BenchmarkDemo5::Create}, -// {"Benchmark Mesh-Convex",BenchmarkDemo6::Create}, -// {"Benchmark Raycast",BenchmarkDemo7::Create}, - - {"MemoryLeak Checker",btEmptyDebugDemo::Create}, - {0, 0} -}; - - +/* +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 "DemoEntries.h" + +#include "../CcdPhysicsDemo/CcdPhysicsDemo.h" +#include "../BspDemo/BspDemo.h" +#include "../BasicDemo/BasicDemo.h" +#include "../ConcaveDemo/ConcaveDemo.h" +#include "../ConcaveRaycastDemo/ConcaveRaycastDemo.h" +#include "../ConcaveConvexcastDemo/ConcaveConvexcastDemo.h" +#include "../ConvexDecompositionDemo/ConvexDecompositionDemo.h" +#include "../DynamicControlDemo/MotorDemo.h" +#include "../SliderConstraintDemo/SliderConstraintDemo.h" +#include "../RagdollDemo/RagdollDemo.h" +#include "../GimpactTestDemo/GimpactTestDemo.h" +#include "../Raytracer/Raytracer.h" +#include "../GjkConvexCastDemo/LinearConvexCastDemo.h" +#include "../ForkLiftDemo/ForkLiftDemo.h" +#include "../ConstraintDemo/ConstraintDemo.h" +//#include "../Benchmarks/BenchmarkDemo.h" +#include "../SoftDemo/SoftDemo.h" +#include "GLDebugFont.h" + +#include "GlutStuff.h"//OpenGL stuff + + +extern int gNumAlignedAllocs; +extern int gNumAlignedFree; +extern int gTotalBytesAlignedAllocs; + +class btEmptyDebugDemo : public GlutDemoApplication +{ +public: + btEmptyDebugDemo() + { + + } + + virtual void clientMoveAndDisplay() + { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + 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,"gNumAlignedAllocs= %d",gNumAlignedAllocs); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumAlignedFree= %d",gNumAlignedFree); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# alloc-free = %d",gNumAlignedAllocs-gNumAlignedFree); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; +#ifdef BT_DEBUG_MEMORY_ALLOCATIONS + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gTotalBytesAlignedAllocs = %d",gTotalBytesAlignedAllocs); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; +#endif //BT_DEBUG_MEMORY_ALLOCATIONS + + glFlush(); + glutSwapBuffers(); + + } + + virtual void initPhysics() {} + + static DemoApplication* Create() + { + btEmptyDebugDemo* demo = new btEmptyDebugDemo(); + demo->myinit(); + return demo; + } + +}; + + +btDemoEntry g_demoEntries[] = +{ + + {"ConstraintDemo",ConstraintDemo::Create}, + {"ForkLift Demo",ForkLiftDemo::Create}, + {"Ragdoll Demo",RagdollDemo::Create}, + {"Basic Demo", BasicDemo::Create}, + {"CcdPhysicsDemo", CcdPhysicsDemo::Create}, + {"Convex Decomposition",ConvexDecompositionDemo::Create}, + {"Concave Moving", GimpactConcaveDemo::Create}, + {"Dynamic Control Demo",MotorDemo::Create}, + {"ConcaveDemo",ConcaveDemo::Create}, + {"Concave Convexcast Demo",ConcaveConvexcastDemo::Create}, + {"SoftBody Cluster Collide1",SoftDemo19::Create}, + + {"SoftBody Ropes Attach",SoftDemo4::Create}, + + {"SoftBody Cloth Attach",SoftDemo5::Create}, + + {"SoftBody Cloth",SoftDemo0::Create}, + +// {"SoftBody Volume",SoftDemo2::Create}, + {"SoftBody Pressure",SoftDemo1::Create}, + {"SoftBody Cluster Car",SoftDemo24::Create}, + {"SoftBody Cluster Robot",SoftDemo25::Create}, + // {"SoftBody Ropes",SoftDemo3::Create}, + {"SoftBody Sticks",SoftDemo6::Create}, + {"SoftBody Collide",SoftDemo7::Create}, + {"SoftBody Collide2",SoftDemo8::Create}, +// {"SoftBody Collide3",SoftDemo9::Create}, +// {"SoftBody Impact",SoftDemo10::Create}, + {"SoftBody Aero",SoftDemo11::Create}, + {"SoftBody Friction",SoftDemo12::Create}, +// {"SoftBody Torus",SoftDemo13::Create}, +// {"SoftBody Torus Match",SoftDemo14::Create}, +// {"SoftBody Bunny",SoftDemo15::Create}, +// {"SoftBody Bunny Match",SoftDemo16::Create}, + {"SoftBody Init Cutting",SoftDemo17::Create}, +// {"SoftBody Cluster Deform",SoftDemo18::Create}, + +// {"SoftBody Cluster Collide2",SoftDemo20::Create}, +// {"SoftBody Cluster Socket",SoftDemo21::Create}, + {"SoftBody Cluster Hinge",SoftDemo22::Create}, + {"SoftBody Cluster Combine",SoftDemo23::Create}, +// {"SoftBody Cluster Stack Soft",SoftDemo26::Create}, + {"SoftBody Cluster Stack Mixed",SoftDemo27::Create}, + + {"SoftBody TetGen Tetrahedral Cube",SoftDemo28::Create}, + {"SoftBody TetGen Tetrahedral Bunny",SoftDemo29::Create}, + + +// {"SliderConstraint",SliderConstraintDemo::Create}, + +// {"ConcaveRaycastDemo",ConcaveRaycastDemo::Create}, + //{"BspDemo", BspDemo::Create}, +// {"Raytracer Test",Raytracer::Create}, +// {"GjkConvexCast",LinearConvexCastDemo::Create}, +// {"Benchmark 3000 FALL",BenchmarkDemo1::Create}, +// {"Benchmark 1000 STACK",BenchmarkDemo2::Create}, +// {"Benchmark 136 RAGDOLLS",BenchmarkDemo3::Create}, +// {"Benchmark 1000 CONVEX",BenchmarkDemo4::Create}, +// {"Benchmark Mesh-Prim",BenchmarkDemo5::Create}, +// {"Benchmark Mesh-Convex",BenchmarkDemo6::Create}, +// {"Benchmark Raycast",BenchmarkDemo7::Create}, + + {"MemoryLeak Checker",btEmptyDebugDemo::Create}, + {0, 0} +}; + + diff --git a/Demos/AllBulletDemos/DemoEntries.h b/Demos/AllBulletDemos/DemoEntries.h index 631e59389..41fd8571a 100644 --- a/Demos/AllBulletDemos/DemoEntries.h +++ b/Demos/AllBulletDemos/DemoEntries.h @@ -1,34 +1,34 @@ -/* -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_DEMO_ENTRIES_H -#define BT_DEMO_ENTRIES_H - - -class DemoApplication; - -typedef DemoApplication* DemoCreateFcn(); - -struct btDemoEntry -{ - const char *name; - DemoCreateFcn *createFcn; -}; - -extern btDemoEntry g_demoEntries[]; - - - -#endif //BT_DEMO_ENTRIES_H +/* +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_DEMO_ENTRIES_H +#define BT_DEMO_ENTRIES_H + + +class DemoApplication; + +typedef DemoApplication* DemoCreateFcn(); + +struct btDemoEntry +{ + const char *name; + DemoCreateFcn *createFcn; +}; + +extern btDemoEntry g_demoEntries[]; + + + +#endif //BT_DEMO_ENTRIES_H diff --git a/Demos/AllBulletDemos/Main.cpp b/Demos/AllBulletDemos/Main.cpp index e6f132146..29053d5a2 100644 --- a/Demos/AllBulletDemos/Main.cpp +++ b/Demos/AllBulletDemos/Main.cpp @@ -1,553 +1,553 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* 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 "glui/GL/glui.h" -#include "LinearMath/btScalar.h" -#include "LinearMath/btMinMax.h" -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" -#include "DemoApplication.h" -#include "DemoEntries.h" -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" - -#include "GLDebugDrawer.h" - -#include "LinearMath/btQuickprof.h" - - - -namespace -{ - int testIndex=1; - int testSelection=0; - btDemoEntry* entry; - DemoApplication* demo; - int iterationCount; - int width; - int height; - int framePeriod;//todo: test if this value should be 0 - int mainWindow; - GLUI *glui; - float hz; - float viewZoom=20.f; - float viewX; - float viewY; - int tx, ty, tw, th; - int gDrawAabb; - int gWireFrame; - int gHelpText; - int gDebugConstraints; - int gDebugContacts; - int gDrawTextures=1; - int gDrawShadows=0; - int gDrawClusters=0; - int gDebugNoDeactivation; - int gUseWarmstarting; - int gRandomizeConstraints; - int gUseSplitImpulse; - float gErp; - float gSlop; - float gErp2; - float gWarmStartingParameter; -} - - - -void setDefaultSettings() -{ - viewX = 0.0f; - viewY = 0.0f; - framePeriod = 6;//16;//16;//todo: test if this value should be 0 - - width = 800;//640; - height = 600;//1024;//480; - iterationCount = 10; - gDrawAabb=0; - gWireFrame=0; - gDebugContacts=0; - //enable constraint debug visualization for first demo, only if user hasn't overridden the setting - if (testSelection>1) - { - gDebugConstraints=0; - } else - { - gDebugConstraints=1; - } - gHelpText = 0; - gDrawTextures=1; - gDrawShadows=0; - gDrawClusters=0; - - gDebugNoDeactivation = 0; - gUseSplitImpulse = 0; - gUseWarmstarting = 1; - gRandomizeConstraints = 1; - gErp = 0.2f; - gSlop=0.0f; - gErp2 = 0.1f; - gWarmStartingParameter = 0.85f; - -} - -void setDefaultSettingsAndSync() -{ - setDefaultSettings(); - glui->sync_live(); -} - - -void TogglePause() -{ - if (demo) - demo->toggleIdle(); -} - -void ResetScene() -{ - if (demo) - demo->clientResetScene(); -} - -void NextScene() -{ - testSelection++; - if (testSelection>1) - { - gDebugConstraints=0; - } else - { - gDebugConstraints=1; - } - - if(testSelection>28) - testSelection=0; - if (glui) - glui->sync_live(); -} - - -void SingleSimulationStep() -{ - if (demo) - demo->clientMoveAndDisplay(); -} - - -void Resize(int w, int h) -{ - width = w; - height = h; - - GLUI_Master.get_viewport_area( &tx, &ty, &tw, &th ); - glViewport( tx, ty, tw, th ); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - if (demo) - demo->reshape(tw, th); -} - -DemoApplication* CreatDemo(btDemoEntry* entry) -{ - DemoApplication* demo = entry->createFcn(); - btAssert(demo); - if (demo->getDynamicsWorld()) - { - demo->getDynamicsWorld()->setDebugDrawer(new GLDebugDrawer()); - gDrawTextures = demo->getTexturing(); - gDrawShadows = demo->getShadows(); - if (glui) - glui->sync_live(); - } - -#ifndef BT_NO_PROFILE - CProfileManager::Reset(); -#endif //BT_NO_PROFILE - - return demo; - -} - -/*b2Vec2 ConvertScreenToWorld(int x, int y) -{ - b2Vec2 p; - - float ratio = float(tw) / float(th); - float u = x / float(tw); - float v = (th - y) / float(th); - p.x = viewZoom * (viewX - ratio) * (1.0f - u) + viewZoom * (ratio + viewX) * u; - p.y = viewZoom * (viewY - 0.1f) * (1.0f - v) + viewZoom * (viewY + 1.9f) * v; - return p; -} -*/ - -// This is used to control the frame rate (60Hz). -void Timer(int) -{ - glutSetWindow(mainWindow); - glutPostRedisplay(); - glutTimerFunc(framePeriod, Timer, 0); -} - -void SimulationLoop() -{ - Resize(width, height); - - - - if (gDrawAabb) - { - demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawAabb); - } else - { - demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb)); - } - if (gWireFrame) - { - demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe); - } else - { - demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe)); - - } - if (gHelpText) - { - demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoHelpText)); - } else - { - demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoHelpText); - } - if (gDebugConstraints) - { - demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits); - } else - { - demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits)); - } - if (gDebugContacts) - { - demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints); - } else - { - demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawContactPoints)); - } - - demo->setTexturing(0!=gDrawTextures); - demo->setShadows(0!=gDrawShadows); - demo->setDrawClusters(0!=gDrawClusters); - - if (gDebugNoDeactivation) - { - demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoDeactivation); - } else - { - demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoDeactivation)); - } - - - - - if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getWorldType() == BT_DISCRETE_DYNAMICS_WORLD) - { - btDiscreteDynamicsWorld* discreteWorld = (btDiscreteDynamicsWorld*) demo->getDynamicsWorld(); - discreteWorld->getSolverInfo().m_numIterations = iterationCount; - discreteWorld->getSolverInfo().m_erp = gErp; - discreteWorld->getSolverInfo().m_erp2 = gErp2; - - discreteWorld->getSolverInfo().m_linearSlop = gSlop; - - discreteWorld->getSolverInfo().m_warmstartingFactor = gWarmStartingParameter; - discreteWorld->getSolverInfo().m_splitImpulse = gUseSplitImpulse; - - btSequentialImpulseConstraintSolver* solver = ((btSequentialImpulseConstraintSolver*) discreteWorld->getConstraintSolver()); - - if (gUseWarmstarting) - { - discreteWorld->getSolverInfo().m_solverMode |= SOLVER_USE_WARMSTARTING; - } else - { - discreteWorld->getSolverInfo().m_solverMode &= (~SOLVER_USE_WARMSTARTING); - } - if (gRandomizeConstraints) - { - discreteWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER; - } else - { - discreteWorld->getSolverInfo().m_solverMode &= (~SOLVER_RANDMIZE_ORDER); - } - } - - if (!demo->isIdle()) - { - demo->clientMoveAndDisplay(); - - - } - else - { - demo->displayCallback(); - } - if (testSelection != testIndex) - { - if (testSelection>1) - { - gDebugConstraints=0; - } else - { - gDebugConstraints=1; - } - - testIndex = testSelection; - if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) - delete demo->getDynamicsWorld()->getDebugDrawer(); - delete demo; - entry = g_demoEntries + testIndex; - demo = CreatDemo(entry); - viewZoom = 20.0f; - viewX = 0.0f; - viewY = 0.0f; - Resize(width, height); - } -} - -void RestartScene() -{ - if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) - delete demo->getDynamicsWorld()->getDebugDrawer(); - delete demo; - entry = g_demoEntries + testIndex; - demo = CreatDemo(entry); - viewZoom = 20.0f; - viewX = 0.0f; - viewY = 0.0f; - Resize(width, height); -} - -void Keyboard(unsigned char key, int x, int y) -{ - - - - - switch (key) - { - case 27: - exit(0); - break; - - // Press 'r' to reset. - case 'r': - if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) - delete demo->getDynamicsWorld()->getDebugDrawer(); - delete demo; - demo = CreatDemo(entry); - Resize(width,height); - break; - - default: - if (demo) - { - demo->keyboardCallback(key,x,y); - } - } -} - -void KeyboardSpecialUp(int key, int x, int y) -{ - if (demo) - { - demo->specialKeyboardUp(key,x,y); - } - -} - - -void GlutIdleFunc() -{ - int current_window, new_window; - current_window = glutGetWindow(); - if (GLUI_Master.gluis.first_child() != NULL ) - { - new_window = ((GLUI_Main*)GLUI_Master.gluis.first_child())->getMainWindowId(); - } - if ( (new_window > 0) && (new_window != current_window )) - { - //--- Window is changed only if its not already the current window --- - glutSetWindow( new_window ); - } - - if (demo) - demo->moveAndDisplay(); - - glutSetWindow( current_window ); -} - -void KeyboardSpecial(int key, int x, int y) -{ - - if (demo) - { - demo->specialKeyboard(key,x,y); - } - -} - - -void Mouse(int button, int state, int x, int y) -{ - if (demo) - demo->mouseFunc(button,state,x,y); -} - -void MouseMotion(int x, int y) -{ - demo->mouseMotionFunc(x,y); -} - -#ifdef BT_USE_FREEGLUT -#include "GL/freeglut_ext.h" -#endif - -int main(int argc, char** argv) -{ - -//#define CHECK_FPU_EXCEPTIONS 1 -#ifdef CHECK_FPU_EXCEPTIONS - - int cw = _control87(0, 0); - - // Set the exception masks off, turn exceptions on - cw &= ~(EM_ZERODIVIDE | EM_INVALID); - - printf("control87 = %#x\n", cw); - - // Set the control word - _control87(cw, MCW_EM); -#endif //CHECK_FPU_EXCEPTIONS - - - setDefaultSettings(); - - int bulletVersion = btGetVersion(); - printf("Bullet version %d\n",bulletVersion); - - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE |GLUT_DEPTH | GLUT_STENCIL); - glutInitWindowSize(width, height); - mainWindow = glutCreateWindow("http://bulletphysics.com"); -#ifdef BT_USE_FREEGLUT - glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); -#endif - entry = g_demoEntries + testIndex; - demo = CreatDemo(entry); - - glutDisplayFunc(SimulationLoop); - GLUI_Master.set_glutReshapeFunc(Resize); - GLUI_Master.set_glutKeyboardFunc(Keyboard); - GLUI_Master.set_glutSpecialFunc(KeyboardSpecial); - GLUI_Master.set_glutIdleFunc(GlutIdleFunc); - GLUI_Master.set_glutSpecialUpFunc(KeyboardSpecialUp); - GLUI_Master.set_glutMouseFunc(Mouse); - glutMotionFunc(MouseMotion); - - - glui = GLUI_Master.create_glui_subwindow( mainWindow, - GLUI_SUBWINDOW_RIGHT ); - - - - glui->add_statictext("Tests"); - GLUI_Listbox* testList = - glui->add_listbox("", &testSelection); - glui->add_button("Next Scene", 0,(GLUI_Update_CB)NextScene); - - glui->add_separator(); - - GLUI_Spinner* iterationSpinner = - glui->add_spinner("Iterations", GLUI_SPINNER_INT, &iterationCount); - iterationSpinner->set_int_limits(1, 250); - -/* GLUI_Spinner* hertzSpinner = - glui->add_spinner("Hertz", GLUI_SPINNER_FLOAT, &hz); - hertzSpinner->set_float_limits(5.0f, 200.0f); -*/ - - - glui->add_checkbox("DisableDeactivation", &gDebugNoDeactivation); - glui->add_checkbox("Split Impulse", &gUseSplitImpulse); - GLUI_Spinner* spinner = 0; - - spinner = glui->add_spinner("ERP", GLUI_SPINNER_FLOAT, &gErp); -// spinner->set_float_limits(0.f,1.f); -// spinner = glui->add_spinner("ERP2", GLUI_SPINNER_FLOAT, &gErp2); - spinner->set_float_limits(0.f,1.f); - spinner = glui->add_spinner("Slop", GLUI_SPINNER_FLOAT, &gSlop); - spinner->set_float_limits(0.f,1.f); -// spinner = glui->add_spinner("WSP", GLUI_SPINNER_FLOAT,&gWarmStartingParameter); -// spinner->set_float_limits (0.f,1.0); - glui->add_checkbox("Warmstarting", &gUseWarmstarting); - glui->add_checkbox("Randomize Constraints", &gRandomizeConstraints); - - - glui->add_button("Reset Defaults", 0,(GLUI_Update_CB)setDefaultSettingsAndSync); - glui->add_separator(); - - GLUI_Panel* drawPanel = glui->add_panel("Debug Draw"); - - - glui->add_checkbox_to_panel(drawPanel, "Help", &gHelpText); - glui->add_checkbox_to_panel(drawPanel, "AABBs", &gDrawAabb); - glui->add_checkbox_to_panel(drawPanel, "Wireframe", &gWireFrame); - glui->add_checkbox_to_panel(drawPanel, "Contacts", &gDebugContacts); - glui->add_checkbox_to_panel(drawPanel, "Constraints", &gDebugConstraints); - - glui->add_checkbox_to_panel(drawPanel, "Textures", &gDrawTextures); - glui->add_checkbox_to_panel(drawPanel, "Shadows", &gDrawShadows); - glui->add_checkbox_to_panel(drawPanel, "Clusters", &gDrawClusters); - - int testCount = 0; - btDemoEntry* e = g_demoEntries; - while (e->createFcn) - { - testList->add_item(testCount, e->name); - ++testCount; - ++e; - } - - glui->add_separator(); - - glui->add_button("Toggle Pause", 0,(GLUI_Update_CB)TogglePause); - - glui->add_button("Single Step", 0,(GLUI_Update_CB)SingleSimulationStep); - glui->add_button("Reset Scene", 0,(GLUI_Update_CB)ResetScene); - glui->add_button("Restart Scene", 0,(GLUI_Update_CB)RestartScene); - - glui->add_separator(); - -// glui->add_button("Exit", 0,(GLUI_Update_CB)exit); - - glui->set_main_gfx_window( mainWindow ); - - // Use a timer to control the frame rate. - glutTimerFunc(framePeriod, Timer, 0); - - glutMainLoop(); - - return 0; -} +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* 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 "glui/GL/glui.h" +#include "LinearMath/btScalar.h" +#include "LinearMath/btMinMax.h" +#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" +#include "DemoApplication.h" +#include "DemoEntries.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +#include "GLDebugDrawer.h" + +#include "LinearMath/btQuickprof.h" + + + +namespace +{ + int testIndex=1; + int testSelection=0; + btDemoEntry* entry; + DemoApplication* demo; + int iterationCount; + int width; + int height; + int framePeriod;//todo: test if this value should be 0 + int mainWindow; + GLUI *glui; + float hz; + float viewZoom=20.f; + float viewX; + float viewY; + int tx, ty, tw, th; + int gDrawAabb; + int gWireFrame; + int gHelpText; + int gDebugConstraints; + int gDebugContacts; + int gDrawTextures=1; + int gDrawShadows=0; + int gDrawClusters=0; + int gDebugNoDeactivation; + int gUseWarmstarting; + int gRandomizeConstraints; + int gUseSplitImpulse; + float gErp; + float gSlop; + float gErp2; + float gWarmStartingParameter; +} + + + +void setDefaultSettings() +{ + viewX = 0.0f; + viewY = 0.0f; + framePeriod = 6;//16;//16;//todo: test if this value should be 0 + + width = 800;//640; + height = 600;//1024;//480; + iterationCount = 10; + gDrawAabb=0; + gWireFrame=0; + gDebugContacts=0; + //enable constraint debug visualization for first demo, only if user hasn't overridden the setting + if (testSelection>1) + { + gDebugConstraints=0; + } else + { + gDebugConstraints=1; + } + gHelpText = 0; + gDrawTextures=1; + gDrawShadows=0; + gDrawClusters=0; + + gDebugNoDeactivation = 0; + gUseSplitImpulse = 0; + gUseWarmstarting = 1; + gRandomizeConstraints = 1; + gErp = 0.2f; + gSlop=0.0f; + gErp2 = 0.1f; + gWarmStartingParameter = 0.85f; + +} + +void setDefaultSettingsAndSync() +{ + setDefaultSettings(); + glui->sync_live(); +} + + +void TogglePause() +{ + if (demo) + demo->toggleIdle(); +} + +void ResetScene() +{ + if (demo) + demo->clientResetScene(); +} + +void NextScene() +{ + testSelection++; + if (testSelection>1) + { + gDebugConstraints=0; + } else + { + gDebugConstraints=1; + } + + if(testSelection>28) + testSelection=0; + if (glui) + glui->sync_live(); +} + + +void SingleSimulationStep() +{ + if (demo) + demo->clientMoveAndDisplay(); +} + + +void Resize(int w, int h) +{ + width = w; + height = h; + + GLUI_Master.get_viewport_area( &tx, &ty, &tw, &th ); + glViewport( tx, ty, tw, th ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + if (demo) + demo->reshape(tw, th); +} + +DemoApplication* CreatDemo(btDemoEntry* entry) +{ + DemoApplication* demo = entry->createFcn(); + btAssert(demo); + if (demo->getDynamicsWorld()) + { + demo->getDynamicsWorld()->setDebugDrawer(new GLDebugDrawer()); + gDrawTextures = demo->getTexturing(); + gDrawShadows = demo->getShadows(); + if (glui) + glui->sync_live(); + } + +#ifndef BT_NO_PROFILE + CProfileManager::Reset(); +#endif //BT_NO_PROFILE + + return demo; + +} + +/*b2Vec2 ConvertScreenToWorld(int x, int y) +{ + b2Vec2 p; + + float ratio = float(tw) / float(th); + float u = x / float(tw); + float v = (th - y) / float(th); + p.x = viewZoom * (viewX - ratio) * (1.0f - u) + viewZoom * (ratio + viewX) * u; + p.y = viewZoom * (viewY - 0.1f) * (1.0f - v) + viewZoom * (viewY + 1.9f) * v; + return p; +} +*/ + +// This is used to control the frame rate (60Hz). +void Timer(int) +{ + glutSetWindow(mainWindow); + glutPostRedisplay(); + glutTimerFunc(framePeriod, Timer, 0); +} + +void SimulationLoop() +{ + Resize(width, height); + + + + if (gDrawAabb) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawAabb); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb)); + } + if (gWireFrame) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe)); + + } + if (gHelpText) + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoHelpText)); + } else + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoHelpText); + } + if (gDebugConstraints) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits)); + } + if (gDebugContacts) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawContactPoints)); + } + + demo->setTexturing(0!=gDrawTextures); + demo->setShadows(0!=gDrawShadows); + demo->setDrawClusters(0!=gDrawClusters); + + if (gDebugNoDeactivation) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoDeactivation); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoDeactivation)); + } + + + + + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getWorldType() == BT_DISCRETE_DYNAMICS_WORLD) + { + btDiscreteDynamicsWorld* discreteWorld = (btDiscreteDynamicsWorld*) demo->getDynamicsWorld(); + discreteWorld->getSolverInfo().m_numIterations = iterationCount; + discreteWorld->getSolverInfo().m_erp = gErp; + discreteWorld->getSolverInfo().m_erp2 = gErp2; + + discreteWorld->getSolverInfo().m_linearSlop = gSlop; + + discreteWorld->getSolverInfo().m_warmstartingFactor = gWarmStartingParameter; + discreteWorld->getSolverInfo().m_splitImpulse = gUseSplitImpulse; + + btSequentialImpulseConstraintSolver* solver = ((btSequentialImpulseConstraintSolver*) discreteWorld->getConstraintSolver()); + + if (gUseWarmstarting) + { + discreteWorld->getSolverInfo().m_solverMode |= SOLVER_USE_WARMSTARTING; + } else + { + discreteWorld->getSolverInfo().m_solverMode &= (~SOLVER_USE_WARMSTARTING); + } + if (gRandomizeConstraints) + { + discreteWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER; + } else + { + discreteWorld->getSolverInfo().m_solverMode &= (~SOLVER_RANDMIZE_ORDER); + } + } + + if (!demo->isIdle()) + { + demo->clientMoveAndDisplay(); + + + } + else + { + demo->displayCallback(); + } + if (testSelection != testIndex) + { + if (testSelection>1) + { + gDebugConstraints=0; + } else + { + gDebugConstraints=1; + } + + testIndex = testSelection; + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + delete demo; + entry = g_demoEntries + testIndex; + demo = CreatDemo(entry); + viewZoom = 20.0f; + viewX = 0.0f; + viewY = 0.0f; + Resize(width, height); + } +} + +void RestartScene() +{ + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + delete demo; + entry = g_demoEntries + testIndex; + demo = CreatDemo(entry); + viewZoom = 20.0f; + viewX = 0.0f; + viewY = 0.0f; + Resize(width, height); +} + +void Keyboard(unsigned char key, int x, int y) +{ + + + + + switch (key) + { + case 27: + exit(0); + break; + + // Press 'r' to reset. + case 'r': + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + delete demo; + demo = CreatDemo(entry); + Resize(width,height); + break; + + default: + if (demo) + { + demo->keyboardCallback(key,x,y); + } + } +} + +void KeyboardSpecialUp(int key, int x, int y) +{ + if (demo) + { + demo->specialKeyboardUp(key,x,y); + } + +} + + +void GlutIdleFunc() +{ + int current_window, new_window; + current_window = glutGetWindow(); + if (GLUI_Master.gluis.first_child() != NULL ) + { + new_window = ((GLUI_Main*)GLUI_Master.gluis.first_child())->getMainWindowId(); + } + if ( (new_window > 0) && (new_window != current_window )) + { + //--- Window is changed only if its not already the current window --- + glutSetWindow( new_window ); + } + + if (demo) + demo->moveAndDisplay(); + + glutSetWindow( current_window ); +} + +void KeyboardSpecial(int key, int x, int y) +{ + + if (demo) + { + demo->specialKeyboard(key,x,y); + } + +} + + +void Mouse(int button, int state, int x, int y) +{ + if (demo) + demo->mouseFunc(button,state,x,y); +} + +void MouseMotion(int x, int y) +{ + demo->mouseMotionFunc(x,y); +} + +#ifdef BT_USE_FREEGLUT +#include "GL/freeglut_ext.h" +#endif + +int main(int argc, char** argv) +{ + +//#define CHECK_FPU_EXCEPTIONS 1 +#ifdef CHECK_FPU_EXCEPTIONS + + int cw = _control87(0, 0); + + // Set the exception masks off, turn exceptions on + cw &= ~(EM_ZERODIVIDE | EM_INVALID); + + printf("control87 = %#x\n", cw); + + // Set the control word + _control87(cw, MCW_EM); +#endif //CHECK_FPU_EXCEPTIONS + + + setDefaultSettings(); + + int bulletVersion = btGetVersion(); + printf("Bullet version %d\n",bulletVersion); + + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE |GLUT_DEPTH | GLUT_STENCIL); + glutInitWindowSize(width, height); + mainWindow = glutCreateWindow("http://bulletphysics.com"); +#ifdef BT_USE_FREEGLUT + glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); +#endif + entry = g_demoEntries + testIndex; + demo = CreatDemo(entry); + + glutDisplayFunc(SimulationLoop); + GLUI_Master.set_glutReshapeFunc(Resize); + GLUI_Master.set_glutKeyboardFunc(Keyboard); + GLUI_Master.set_glutSpecialFunc(KeyboardSpecial); + GLUI_Master.set_glutIdleFunc(GlutIdleFunc); + GLUI_Master.set_glutSpecialUpFunc(KeyboardSpecialUp); + GLUI_Master.set_glutMouseFunc(Mouse); + glutMotionFunc(MouseMotion); + + + glui = GLUI_Master.create_glui_subwindow( mainWindow, + GLUI_SUBWINDOW_RIGHT ); + + + + glui->add_statictext("Tests"); + GLUI_Listbox* testList = + glui->add_listbox("", &testSelection); + glui->add_button("Next Scene", 0,(GLUI_Update_CB)NextScene); + + glui->add_separator(); + + GLUI_Spinner* iterationSpinner = + glui->add_spinner("Iterations", GLUI_SPINNER_INT, &iterationCount); + iterationSpinner->set_int_limits(1, 250); + +/* GLUI_Spinner* hertzSpinner = + glui->add_spinner("Hertz", GLUI_SPINNER_FLOAT, &hz); + hertzSpinner->set_float_limits(5.0f, 200.0f); +*/ + + + glui->add_checkbox("DisableDeactivation", &gDebugNoDeactivation); + glui->add_checkbox("Split Impulse", &gUseSplitImpulse); + GLUI_Spinner* spinner = 0; + + spinner = glui->add_spinner("ERP", GLUI_SPINNER_FLOAT, &gErp); +// spinner->set_float_limits(0.f,1.f); +// spinner = glui->add_spinner("ERP2", GLUI_SPINNER_FLOAT, &gErp2); + spinner->set_float_limits(0.f,1.f); + spinner = glui->add_spinner("Slop", GLUI_SPINNER_FLOAT, &gSlop); + spinner->set_float_limits(0.f,1.f); +// spinner = glui->add_spinner("WSP", GLUI_SPINNER_FLOAT,&gWarmStartingParameter); +// spinner->set_float_limits (0.f,1.0); + glui->add_checkbox("Warmstarting", &gUseWarmstarting); + glui->add_checkbox("Randomize Constraints", &gRandomizeConstraints); + + + glui->add_button("Reset Defaults", 0,(GLUI_Update_CB)setDefaultSettingsAndSync); + glui->add_separator(); + + GLUI_Panel* drawPanel = glui->add_panel("Debug Draw"); + + + glui->add_checkbox_to_panel(drawPanel, "Help", &gHelpText); + glui->add_checkbox_to_panel(drawPanel, "AABBs", &gDrawAabb); + glui->add_checkbox_to_panel(drawPanel, "Wireframe", &gWireFrame); + glui->add_checkbox_to_panel(drawPanel, "Contacts", &gDebugContacts); + glui->add_checkbox_to_panel(drawPanel, "Constraints", &gDebugConstraints); + + glui->add_checkbox_to_panel(drawPanel, "Textures", &gDrawTextures); + glui->add_checkbox_to_panel(drawPanel, "Shadows", &gDrawShadows); + glui->add_checkbox_to_panel(drawPanel, "Clusters", &gDrawClusters); + + int testCount = 0; + btDemoEntry* e = g_demoEntries; + while (e->createFcn) + { + testList->add_item(testCount, e->name); + ++testCount; + ++e; + } + + glui->add_separator(); + + glui->add_button("Toggle Pause", 0,(GLUI_Update_CB)TogglePause); + + glui->add_button("Single Step", 0,(GLUI_Update_CB)SingleSimulationStep); + glui->add_button("Reset Scene", 0,(GLUI_Update_CB)ResetScene); + glui->add_button("Restart Scene", 0,(GLUI_Update_CB)RestartScene); + + glui->add_separator(); + +// glui->add_button("Exit", 0,(GLUI_Update_CB)exit); + + glui->set_main_gfx_window( mainWindow ); + + // Use a timer to control the frame rate. + glutTimerFunc(framePeriod, Timer, 0); + + glutMainLoop(); + + return 0; +} diff --git a/Demos/BasicDemo/BasicDemo.cpp b/Demos/BasicDemo/BasicDemo.cpp index 840367ba0..e945074e1 100644 --- a/Demos/BasicDemo/BasicDemo.cpp +++ b/Demos/BasicDemo/BasicDemo.cpp @@ -1,266 +1,266 @@ -/* -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. -*/ - -//#define TEST_SERIALIZATION 1 - -///create 125 (5x5x5) dynamic object -#define ARRAY_SIZE_X 5 -#define ARRAY_SIZE_Y 5 -#define ARRAY_SIZE_Z 5 - -//maximum number of objects (and allow user to shoot additional boxes) -#define MAX_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z + 1024) - -///scaling of the objects (0.1 = 20 centimeter boxes ) -#define SCALING 1. -#define START_POS_X -5 -#define START_POS_Y -5 -#define START_POS_Z -3 - -#include "BasicDemo.h" -#include "GlutStuff.h" -///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. -#include "btBulletDynamicsCommon.h" -#ifdef TEST_SERIALIZATION -#include "LinearMath/btSerializer.h" -#endif //TEST_SERIALIZATION - -#include //printf debugging - - -void BasicDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - ///step the simulation - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(ms / 1000000.f); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - - renderme(); - - glFlush(); - - swapBuffers(); - -} - - - -void BasicDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing to detect problems - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - swapBuffers(); -} - - - - - -void BasicDemo::initPhysics() -{ - setTexturing(true); - setShadows(true); - - setCameraDistance(btScalar(SCALING*50.)); - - ///collision configuration contains default setup for memory, collision setup - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - //m_collisionConfiguration->setConvexConvexMultipointIterations(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - m_broadphase = new btDbvtBroadphase(); - - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; - m_solver = sol; - - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - - ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); -// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); - - m_collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-50,0)); - - //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: - { - btScalar mass(0.); - - //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) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - m_dynamicsWorld->addRigidBody(body); - } - - - { - //create a few dynamic rigidbodies - // Re-using the same collision is better for memory usage and performance - - btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); - //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - 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;ksetActivationState(ISLAND_SLEEPING); - - m_dynamicsWorld->addRigidBody(body); - body->setActivationState(ISLAND_SLEEPING); - } - } - } - } - - - clientResetScene(); - - -#ifdef TEST_SERIALIZATION - //test serializing this - - int maxSerializeBufferSize = 1024*1024*5; - - btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); - m_dynamicsWorld->serialize(serializer); - - FILE* f2 = fopen("testFile.bullet","wb"); - fwrite(serializer->m_buffer,serializer->m_currentSize,1,f2); - fclose(f2); -#endif - -#if 0 - bParse::btBulletFile* bulletFile2 = new bParse::btBulletFile("testFile.bullet"); - bool ok = (bulletFile2->getFlags()& bParse::FD_OK)!=0; - bool verboseDumpAllTypes = true; - if (ok) - bulletFile2->parse(verboseDumpAllTypes); - - if (verboseDumpAllTypes) - { - bulletFile2->dumpChunks(bulletFile2->getFileDNA()); - } -#endif //TEST_SERIALIZATION - -} - - -void BasicDemo::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 //printf debugging + + +void BasicDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + glFlush(); + + swapBuffers(); + +} + + + +void BasicDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + swapBuffers(); +} + + + + + +void BasicDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(SCALING*50.)); + + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + //m_collisionConfiguration->setConvexConvexMultipointIterations(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + m_broadphase = new btDbvtBroadphase(); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + m_solver = sol; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); +// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //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) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + 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;ksetActivationState(ISLAND_SLEEPING); + + m_dynamicsWorld->addRigidBody(body); + body->setActivationState(ISLAND_SLEEPING); + } + } + } + } + + + clientResetScene(); + + +#ifdef TEST_SERIALIZATION + //test serializing this + + int maxSerializeBufferSize = 1024*1024*5; + + btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); + m_dynamicsWorld->serialize(serializer); + + FILE* f2 = fopen("testFile.bullet","wb"); + fwrite(serializer->m_buffer,serializer->m_currentSize,1,f2); + fclose(f2); +#endif + +#if 0 + bParse::btBulletFile* bulletFile2 = new bParse::btBulletFile("testFile.bullet"); + bool ok = (bulletFile2->getFlags()& bParse::FD_OK)!=0; + bool verboseDumpAllTypes = true; + if (ok) + bulletFile2->parse(verboseDumpAllTypes); + + if (verboseDumpAllTypes) + { + bulletFile2->dumpChunks(bulletFile2->getFileDNA()); + } +#endif //TEST_SERIALIZATION + +} + + +void BasicDemo::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_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - public: - - BasicDemo() - { - } - virtual ~BasicDemo() - { - exitPhysics(); - } - void initPhysics(); - - void exitPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - BasicDemo* demo = new BasicDemo; - demo->myinit(); - demo->initPhysics(); - return demo; - } - - -}; - -#endif //BASIC_DEMO_H - +/* +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 BASIC_DEMO_H +#define BASIC_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +///BasicDemo is good starting point for learning the code base and porting. + +class BasicDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + public: + + BasicDemo() + { + } + virtual ~BasicDemo() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + BasicDemo* demo = new BasicDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + +}; + +#endif //BASIC_DEMO_H + diff --git a/Demos/BasicDemo/Win32BasicDemo.cpp b/Demos/BasicDemo/Win32BasicDemo.cpp index a55fb67eb..72f92a15f 100644 --- a/Demos/BasicDemo/Win32BasicDemo.cpp +++ b/Demos/BasicDemo/Win32BasicDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "BasicDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new BasicDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "BasicDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new BasicDemo(); +} + +#endif diff --git a/Demos/Benchmarks/BenchmarkDemo.cpp b/Demos/Benchmarks/BenchmarkDemo.cpp index 1a22346a1..a6e313b90 100644 --- a/Demos/Benchmarks/BenchmarkDemo.cpp +++ b/Demos/Benchmarks/BenchmarkDemo.cpp @@ -1,1267 +1,1267 @@ -/* -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. -*/ - - - -// Collision Radius -#define COLLISION_RADIUS 0.0f - -#include "BenchmarkDemo.h" -#ifdef USE_GRAPHICAL_BENCHMARK -#include "GlutStuff.h" -#endif //USE_GRAPHICAL_BENCHMARK - -///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. -#include "btBulletDynamicsCommon.h" -#include //printf debugging -#include "Taru.mdl" -#include "landscape.mdl" -#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" -#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" -#include "BulletMultiThreaded/SequentialThreadSupport.h" -#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" - - -#ifdef USE_PARALLEL_DISPATCHER_BENCHMARK -#include "BulletMultiThreaded/Win32ThreadSupport.h" -#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" - -#endif - -#undef USE_PARALLEL_SOLVER_BENCHMARK -#ifdef USE_PARALLEL_SOLVER_BENCHMARK -#include "BulletMultiThreaded/btParallelConstraintSolver.h" -#endif - -class btRaycastBar2 -{ -public: - btVector3 source[NUMRAYS]; - btVector3 dest[NUMRAYS]; - btVector3 direction[NUMRAYS]; - btVector3 hit[NUMRAYS]; - btVector3 normal[NUMRAYS]; - - int frame_counter; - int ms; - int sum_ms; - int sum_ms_samples; - int min_ms; - int max_ms; - -#ifdef USE_BT_CLOCK - btClock frame_timer; -#endif //USE_BT_CLOCK - - btScalar dx; - btScalar min_x; - btScalar max_x; - btScalar max_y; - btScalar sign; - - btRaycastBar2 () - { - ms = 0; - max_ms = 0; - min_ms = 9999; - sum_ms_samples = 0; - sum_ms = 0; - } - - - - btRaycastBar2 (btScalar ray_length, btScalar z,btScalar max_y) - { - frame_counter = 0; - ms = 0; - max_ms = 0; - min_ms = 9999; - sum_ms_samples = 0; - sum_ms = 0; - dx = 10.0; - min_x = 0; - max_x = 0; - this->max_y = max_y; - sign = 1.0; - btScalar dalpha = 2*SIMD_2_PI/NUMRAYS; - for (int i = 0; i < NUMRAYS; i++) - { - btScalar alpha = dalpha * i; - // rotate around by alpha degrees y - btQuaternion q(btVector3(0.0, 1.0, 0.0), alpha); - direction[i] = btVector3(1.0, 0.0, 0.0); - direction[i] = quatRotate(q , direction[i]); - direction[i] = direction[i] * ray_length; - - - source[i] = btVector3(min_x, max_y, z); - dest[i] = source[i] + direction[i]; - dest[i][1]=-1000; - normal[i] = btVector3(1.0, 0.0, 0.0); - } - } - - void move (btScalar dt) - { - if (dt > btScalar(1.0/60.0)) - dt = btScalar(1.0/60.0); - for (int i = 0; i < NUMRAYS; i++) - { - source[i][0] += dx * dt * sign; - dest[i][0] += dx * dt * sign; - } - if (source[0][0] < min_x) - sign = 1.0; - else if (source[0][0] > max_x) - sign = -1.0; - } - - void cast (btCollisionWorld* cw) - { -#ifdef USE_BT_CLOCK - frame_timer.reset (); -#endif //USE_BT_CLOCK - -#ifdef BATCH_RAYCASTER - if (!gBatchRaycaster) - return; - - gBatchRaycaster->clearRays (); - for (int i = 0; i < NUMRAYS; i++) - { - gBatchRaycaster->addRay (source[i], dest[i]); - } - gBatchRaycaster->performBatchRaycast (); - for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) - { - const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; - hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); - normal[i] = out.hitNormal; - normal[i].normalize (); - } -#else - for (int i = 0; i < NUMRAYS; i++) - { - btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); - - cw->rayTest (source[i], dest[i], cb); - if (cb.hasHit ()) - { - hit[i] = cb.m_hitPointWorld; - normal[i] = cb.m_hitNormalWorld; - normal[i].normalize (); - } else { - hit[i] = dest[i]; - normal[i] = btVector3(1.0, 0.0, 0.0); - } - - } -#ifdef USE_BT_CLOCK - ms += frame_timer.getTimeMilliseconds (); -#endif //USE_BT_CLOCK - frame_counter++; - if (frame_counter > 50) - { - min_ms = ms < min_ms ? ms : min_ms; - max_ms = ms > max_ms ? ms : max_ms; - sum_ms += ms; - sum_ms_samples++; - btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; - printf("%d rays in %d ms %d %d %f\n", NUMRAYS * frame_counter, ms, min_ms, max_ms, mean_ms); - ms = 0; - frame_counter = 0; - } -#endif - } - - void draw () - { -#ifdef USE_GRAPHICAL_BENCHMARK - glDisable (GL_LIGHTING); - glColor3f (0.0, 1.0, 0.0); - glBegin (GL_LINES); - int i; - - for (i = 0; i < NUMRAYS; i++) - { - glVertex3f (source[i][0], source[i][1], source[i][2]); - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - } - glEnd (); - glColor3f (1.0, 1.0, 1.0); - glBegin (GL_LINES); - for (i = 0; i < NUMRAYS; i++) - { - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); - } - glEnd (); - glColor3f (0.0, 1.0, 1.0); - glBegin (GL_POINTS); - for ( i = 0; i < NUMRAYS; i++) - { - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - } - glEnd (); - glEnable (GL_LIGHTING); -#endif //USE_GRAPHICAL_BENCHMARK - - } -}; - - -static btRaycastBar2 raycastBar; - - -void BenchmarkDemo::clientMoveAndDisplay() -{ -#ifdef USE_GRAPHICAL_BENCHMARK - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#endif //USE_GRAPHICAL_BENCHMARK - - //simple dynamics world doesn't handle fixed-time-stepping - //float ms = getDeltaTimeMicroseconds(); - - ///step the simulation - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(btScalar(1./60.)); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - - if (m_benchmark==7) - { - castRays(); - - raycastBar.draw(); - - } - - renderme(); - -#ifdef USE_GRAPHICAL_BENCHMARK - glFlush(); - - swapBuffers(); -#endif //USE_GRAPHICAL_BENCHMARK - -} - - - -void BenchmarkDemo::displayCallback(void) -{ - -#ifdef USE_GRAPHICAL_BENCHMARK - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing to detect problems - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - swapBuffers(); -#endif //USE_GRAPHICAL_BENCHMARK -} - - - - -void BenchmarkDemo::initPhysics() -{ - - setCameraDistance(btScalar(100.)); - - ///collision configuration contains default setup for memory, collision setup - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - -#if USE_PARALLEL_DISPATCHER_BENCHMARK - - int maxNumOutstandingTasks = 4; - Win32ThreadSupport* threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( "collision",processCollisionTask, createCollisionLocalStoreMemory,maxNumOutstandingTasks)); - //SequentialThreadSupport::SequentialThreadConstructionInfo sci("spuCD", processCollisionTask, createCollisionLocalStoreMemory); - //SequentialThreadSupport* seq = new SequentialThreadSupport(sci); - m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupportCollision,1,m_collisionConfiguration); -#endif - - - ///the maximum size of the collision world. Make sure objects stay within these boundaries - ///Don't make the world AABB size too large, it will harm simulation quality and performance - btVector3 worldAabbMin(-1000,-1000,-1000); - btVector3 worldAabbMax(1000,1000,1000); - - btHashedOverlappingPairCache* pairCache = new btHashedOverlappingPairCache(); - m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,3500,pairCache); -// m_overlappingPairCache = new btSimpleBroadphase(); -// m_overlappingPairCache = new btDbvtBroadphase(); - - - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) -#ifdef USE_PARALLEL_SOLVER_BENCHMARK - btConstraintSolver* sol = new btParallelConstraintSolver; -#else - btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; -#endif //USE_PARALLEL_DISPATCHER_BENCHMARK - - - m_solver = sol; - - btDiscreteDynamicsWorld* dynamicsWorld; - m_dynamicsWorld = dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver,m_collisionConfiguration); - - ///the following 3 lines increase the performance dramatically, with a little bit of loss of quality - m_dynamicsWorld->getSolverInfo().m_solverMode |=SOLVER_ENABLE_FRICTION_DIRECTION_CACHING; //don't recalculate friction values each frame - dynamicsWorld->getSolverInfo().m_numIterations = 4; //few solver iterations - m_defaultContactProcessingThreshold = 0.f;//used when creating bodies: body->setContactProcessingThreshold(...); - - - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - - if (m_benchmark<5) - { - ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(250.),btScalar(50.),btScalar(250.))); - // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),0); - - m_collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-50,0)); - - //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: - { - btScalar mass(0.); - - //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) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - m_dynamicsWorld->addRigidBody(body); - } - } - - switch (m_benchmark) - { - case 1: - { - createTest1(); - break; - } - case 2: - { - createTest2(); - break; - } - case 3: - { - createTest3(); - break; - } - case 4: - { - createTest4(); - break; - } - case 5: - { - createTest5(); - break; - } - case 6: - { - createTest6(); - break; - } - case 7: - { - createTest7(); - break; - } - - - default: - { - } - } - - - clientResetScene(); -} - - -void BenchmarkDemo::createTest1() -{ - // 3000 - int size = 8; - const float cubeSize = 1.0f; - float spacing = cubeSize; - btVector3 pos(0.0f, cubeSize * 2,0.f); - float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; - - btBoxShape* blockShape = new btBoxShape(btVector3(cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS)); - btVector3 localInertia(0,0,0); - float mass = 2.f; - blockShape->calculateLocalInertia(mass,localInertia); - - btTransform trans; - trans.setIdentity(); - - for(int k=0;k<47;k++) { - for(int j=0;jcalculateLocalInertia(mass,localInertia); - -// btScalar diffX = boxSize[0] * 1.0f; - btScalar diffY = boxSize[1] * 1.0f; - btScalar diffZ = boxSize[2] * 1.0f; - - btScalar offset = -stackSize * (diffZ * 2.0f) * 0.5f; - btVector3 pos(0.0f, diffY, 0.0f); - - btTransform trans; - trans.setIdentity(); - - while(stackSize) { - for(int i=0;icalculateLocalInertia(mass,localInertia); - - - btScalar diffX = boxSize[0]; - btScalar diffY = boxSize[1]; - btScalar diffZ = boxSize[2]; - - btScalar offsetX = -stackSize * (diffX * 2.0f + space) * 0.5f; - btScalar offsetZ = -stackSize * (diffZ * 2.0f + space) * 0.5f; - while(stackSize) { - for(int j=0;jlocalCreateRigidBody(mass,trans,blockShape); - - - } - } - offsetX += diffX; - offsetZ += diffZ; - pos[1] += (diffY * 2.0f + space); - stackSize--; - } - -} - - const btVector3 rotate( const btQuaternion& quat, const btVector3 & vec ) -{ - float tmpX, tmpY, tmpZ, tmpW; - tmpX = ( ( ( quat.getW() * vec.getX() ) + ( quat.getY() * vec.getZ() ) ) - ( quat.getZ() * vec.getY() ) ); - tmpY = ( ( ( quat.getW() * vec.getY() ) + ( quat.getZ() * vec.getX() ) ) - ( quat.getX() * vec.getZ() ) ); - tmpZ = ( ( ( quat.getW() * vec.getZ() ) + ( quat.getX() * vec.getY() ) ) - ( quat.getY() * vec.getX() ) ); - tmpW = ( ( ( quat.getX() * vec.getX() ) + ( quat.getY() * vec.getY() ) ) + ( quat.getZ() * vec.getZ() ) ); - return btVector3( - ( ( ( ( tmpW * quat.getX() ) + ( tmpX * quat.getW() ) ) - ( tmpY * quat.getZ() ) ) + ( tmpZ * quat.getY() ) ), - ( ( ( ( tmpW * quat.getY() ) + ( tmpY * quat.getW() ) ) - ( tmpZ * quat.getX() ) ) + ( tmpX * quat.getZ() ) ), - ( ( ( ( tmpW * quat.getZ() ) + ( tmpZ * quat.getW() ) ) - ( tmpX * quat.getY() ) ) + ( tmpY * quat.getX() ) ) - ); -} - -void BenchmarkDemo::createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize) -{ - - btBoxShape* blockShape = new btBoxShape(btVector3(boxSize[0]-COLLISION_RADIUS,boxSize[1]-COLLISION_RADIUS,boxSize[2]-COLLISION_RADIUS)); - - btTransform trans; - trans.setIdentity(); - - float mass = 1.f; - btVector3 localInertia(0,0,0); - blockShape->calculateLocalInertia(mass,localInertia); - - - float radius = 1.3f * rotSize * boxSize[0] / SIMD_PI; - - // create active boxes - btQuaternion rotY(0,1,0,0); - float posY = boxSize[1]; - - for(int i=0;icalculateLocalInertia(mass,localInertia); - - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - m_ownerWorld->addRigidBody(body); - - return body; - } - -public: - RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,btScalar scale) - : m_ownerWorld (ownerWorld) - { - // Setup the geometry - m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.20)*scale); - m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.28)*scale); - m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10)*scale, btScalar(0.05)*scale); - m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); - m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); - m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); - m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); - m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); - m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); - m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); - m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); - - // Setup all the rigid bodies - btTransform offset; offset.setIdentity(); - offset.setOrigin(positionOffset); - - btTransform transform; - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); - m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); - m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); - m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); - m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); - m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); - m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); - m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,M_PI_2); - m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,M_PI_2); - m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,-M_PI_2); - m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); - - transform.setIdentity(); - transform.setOrigin(scale*btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,-M_PI_2); - m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); - - // Setup some damping on the m_bodies - for (int i = 0; i < BODYPART_COUNT; ++i) - { - m_bodies[i]->setDamping(btScalar(0.05), btScalar(0.85)); - m_bodies[i]->setDeactivationTime(btScalar(0.8)); - m_bodies[i]->setSleepingThresholds(btScalar(1.6), btScalar(2.5)); - } - - // Now setup the constraints - btHingeConstraint* hingeC; - btConeTwistConstraint* coneC; - - btTransform localA, localB; - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); - hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); - m_joints[JOINT_PELVIS_SPINE] = hingeC; - m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); - coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); - m_joints[JOINT_SPINE_HEAD] = coneC; - m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); - coneC->setLimit(M_PI_4, M_PI_4, 0); - m_joints[JOINT_LEFT_HIP] = coneC; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); - hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); - m_joints[JOINT_LEFT_KNEE] = hingeC; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(scale*btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); - coneC->setLimit(M_PI_4, M_PI_4, 0); - m_joints[JOINT_RIGHT_HIP] = coneC; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); - hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); - m_joints[JOINT_RIGHT_KNEE] = hingeC; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(scale*btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); - coneC->setLimit(M_PI_2, M_PI_2, 0); - m_joints[JOINT_LEFT_SHOULDER] = coneC; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); - hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); - m_joints[JOINT_LEFT_ELBOW] = hingeC; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); - - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(scale*btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); - coneC->setLimit(M_PI_2, M_PI_2, 0); - m_joints[JOINT_RIGHT_SHOULDER] = coneC; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); - hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); - m_joints[JOINT_RIGHT_ELBOW] = hingeC; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); - } - - virtual ~RagDoll () - { - int i; - - // Remove all constraints - for ( i = 0; i < JOINT_COUNT; ++i) - { - m_ownerWorld->removeConstraint(m_joints[i]); - delete m_joints[i]; m_joints[i] = 0; - } - - // Remove all bodies and shapes - for ( i = 0; i < BODYPART_COUNT; ++i) - { - m_ownerWorld->removeRigidBody(m_bodies[i]); - - delete m_bodies[i]->getMotionState(); - - delete m_bodies[i]; m_bodies[i] = 0; - delete m_shapes[i]; m_shapes[i] = 0; - } - } -}; - -void BenchmarkDemo::createTest3() -{ - setCameraDistance(btScalar(50.)); - - int size = 16; - - float sizeX = 1.f; - float sizeY = 1.f; - - //int rc=0; - - btScalar scale(3.5); - btVector3 pos(0.0f, sizeY, 0.0f); - while(size) { - float offset = -size * (sizeX * 6.0f) * 0.5f; - for(int i=0;isetLocalScaling(btVector3(scaling,scaling,scaling)); - - for (int i=0;iaddPoint(vtx*btScalar(1./scaling)); - } - - btTransform trans; - trans.setIdentity(); - - float mass = 1.f; - btVector3 localInertia(0,0,0); - convexHullShape->calculateLocalInertia(mass,localInertia); - - for(int k=0;k<15;k++) { - for(int j=0;jaddIndexedMesh(part,PHY_SHORT); - - bool useQuantizedAabbCompression = true; - btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface,useQuantizedAabbCompression); - btVector3 localInertia(0,0,0); - trans.setOrigin(btVector3(0,-25,0)); - - btRigidBody* body = localCreateRigidBody(0,trans,trimeshShape); - body->setFriction (btScalar(0.9)); - - } - -} - - -void BenchmarkDemo::createTest5() -{ - setCameraDistance(btScalar(250.)); - btVector3 boxSize(1.5f,1.5f,1.5f); - float boxMass = 1.0f; - float sphereRadius = 1.5f; - float sphereMass = 1.0f; - float capsuleHalf = 2.0f; - float capsuleRadius = 1.0f; - float capsuleMass = 1.0f; - - { - int size = 10; - int height = 10; - - const float cubeSize = boxSize[0]; - float spacing = 2.0f; - btVector3 pos(0.0f, 20.0f, 0.0f); - float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; - - int numBodies = 0; - - for(int k=0;kaddPoint(vtx); - } - - btTransform trans; - trans.setIdentity(); - - float mass = 1.f; - btVector3 localInertia(0,0,0); - convexHullShape->calculateLocalInertia(mass,localInertia); - - - { - int size = 10; - int height = 10; - - const float cubeSize = boxSize[0]; - float spacing = 2.0f; - btVector3 pos(0.0f, 20.0f, 0.0f); - float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; - - - for(int k=0;kgetNumCollisionObjects()-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;jgetShapeType() != INVALID_SHAPE_PROXYTYPE)); - - //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) - shape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - - btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); - body->setWorldTransform(startTransform); - body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); - m_dynamicsWorld->addRigidBody(body); - - return body; -} -#endif //USE_GRAPHICAL_BENCHMARK - +/* +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. +*/ + + + +// Collision Radius +#define COLLISION_RADIUS 0.0f + +#include "BenchmarkDemo.h" +#ifdef USE_GRAPHICAL_BENCHMARK +#include "GlutStuff.h" +#endif //USE_GRAPHICAL_BENCHMARK + +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging +#include "Taru.mdl" +#include "landscape.mdl" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/SequentialThreadSupport.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" + + +#ifdef USE_PARALLEL_DISPATCHER_BENCHMARK +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" + +#endif + +#undef USE_PARALLEL_SOLVER_BENCHMARK +#ifdef USE_PARALLEL_SOLVER_BENCHMARK +#include "BulletMultiThreaded/btParallelConstraintSolver.h" +#endif + +class btRaycastBar2 +{ +public: + btVector3 source[NUMRAYS]; + btVector3 dest[NUMRAYS]; + btVector3 direction[NUMRAYS]; + btVector3 hit[NUMRAYS]; + btVector3 normal[NUMRAYS]; + + int frame_counter; + int ms; + int sum_ms; + int sum_ms_samples; + int min_ms; + int max_ms; + +#ifdef USE_BT_CLOCK + btClock frame_timer; +#endif //USE_BT_CLOCK + + btScalar dx; + btScalar min_x; + btScalar max_x; + btScalar max_y; + btScalar sign; + + btRaycastBar2 () + { + ms = 0; + max_ms = 0; + min_ms = 9999; + sum_ms_samples = 0; + sum_ms = 0; + } + + + + btRaycastBar2 (btScalar ray_length, btScalar z,btScalar max_y) + { + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = 0; + max_x = 0; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS; + for (int i = 0; i < NUMRAYS; i++) + { + btScalar alpha = dalpha * i; + // rotate around by alpha degrees y + btQuaternion q(btVector3(0.0, 1.0, 0.0), alpha); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = quatRotate(q , direction[i]); + direction[i] = direction[i] * ray_length; + + + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i]; + dest[i][1]=-1000; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > btScalar(1.0/60.0)) + dt = btScalar(1.0/60.0); + for (int i = 0; i < NUMRAYS; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + +#ifdef BATCH_RAYCASTER + if (!gBatchRaycaster) + return; + + gBatchRaycaster->clearRays (); + for (int i = 0; i < NUMRAYS; i++) + { + gBatchRaycaster->addRay (source[i], dest[i]); + } + gBatchRaycaster->performBatchRaycast (); + for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) + { + const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; + hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); + normal[i] = out.hitNormal; + normal[i].normalize (); + } +#else + for (int i = 0; i < NUMRAYS; i++) + { + btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); + + cw->rayTest (source[i], dest[i], cb); + if (cb.hasHit ()) + { + hit[i] = cb.m_hitPointWorld; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit[i] = dest[i]; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + printf("%d rays in %d ms %d %d %f\n", NUMRAYS * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } +#endif + } + + void draw () + { +#ifdef USE_GRAPHICAL_BENCHMARK + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + + for (i = 0; i < NUMRAYS; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + for (i = 0; i < NUMRAYS; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + glBegin (GL_POINTS); + for ( i = 0; i < NUMRAYS; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glEnable (GL_LIGHTING); +#endif //USE_GRAPHICAL_BENCHMARK + + } +}; + + +static btRaycastBar2 raycastBar; + + +void BenchmarkDemo::clientMoveAndDisplay() +{ +#ifdef USE_GRAPHICAL_BENCHMARK + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +#endif //USE_GRAPHICAL_BENCHMARK + + //simple dynamics world doesn't handle fixed-time-stepping + //float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(btScalar(1./60.)); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + if (m_benchmark==7) + { + castRays(); + + raycastBar.draw(); + + } + + renderme(); + +#ifdef USE_GRAPHICAL_BENCHMARK + glFlush(); + + swapBuffers(); +#endif //USE_GRAPHICAL_BENCHMARK + +} + + + +void BenchmarkDemo::displayCallback(void) +{ + +#ifdef USE_GRAPHICAL_BENCHMARK + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + swapBuffers(); +#endif //USE_GRAPHICAL_BENCHMARK +} + + + + +void BenchmarkDemo::initPhysics() +{ + + setCameraDistance(btScalar(100.)); + + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + +#if USE_PARALLEL_DISPATCHER_BENCHMARK + + int maxNumOutstandingTasks = 4; + Win32ThreadSupport* threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( "collision",processCollisionTask, createCollisionLocalStoreMemory,maxNumOutstandingTasks)); + //SequentialThreadSupport::SequentialThreadConstructionInfo sci("spuCD", processCollisionTask, createCollisionLocalStoreMemory); + //SequentialThreadSupport* seq = new SequentialThreadSupport(sci); + m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupportCollision,1,m_collisionConfiguration); +#endif + + + ///the maximum size of the collision world. Make sure objects stay within these boundaries + ///Don't make the world AABB size too large, it will harm simulation quality and performance + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + btHashedOverlappingPairCache* pairCache = new btHashedOverlappingPairCache(); + m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,3500,pairCache); +// m_overlappingPairCache = new btSimpleBroadphase(); +// m_overlappingPairCache = new btDbvtBroadphase(); + + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) +#ifdef USE_PARALLEL_SOLVER_BENCHMARK + btConstraintSolver* sol = new btParallelConstraintSolver; +#else + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; +#endif //USE_PARALLEL_DISPATCHER_BENCHMARK + + + m_solver = sol; + + btDiscreteDynamicsWorld* dynamicsWorld; + m_dynamicsWorld = dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver,m_collisionConfiguration); + + ///the following 3 lines increase the performance dramatically, with a little bit of loss of quality + m_dynamicsWorld->getSolverInfo().m_solverMode |=SOLVER_ENABLE_FRICTION_DIRECTION_CACHING; //don't recalculate friction values each frame + dynamicsWorld->getSolverInfo().m_numIterations = 4; //few solver iterations + m_defaultContactProcessingThreshold = 0.f;//used when creating bodies: body->setContactProcessingThreshold(...); + + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + if (m_benchmark<5) + { + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(250.),btScalar(50.),btScalar(250.))); + // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),0); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //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) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + } + + switch (m_benchmark) + { + case 1: + { + createTest1(); + break; + } + case 2: + { + createTest2(); + break; + } + case 3: + { + createTest3(); + break; + } + case 4: + { + createTest4(); + break; + } + case 5: + { + createTest5(); + break; + } + case 6: + { + createTest6(); + break; + } + case 7: + { + createTest7(); + break; + } + + + default: + { + } + } + + + clientResetScene(); +} + + +void BenchmarkDemo::createTest1() +{ + // 3000 + int size = 8; + const float cubeSize = 1.0f; + float spacing = cubeSize; + btVector3 pos(0.0f, cubeSize * 2,0.f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + btBoxShape* blockShape = new btBoxShape(btVector3(cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS)); + btVector3 localInertia(0,0,0); + float mass = 2.f; + blockShape->calculateLocalInertia(mass,localInertia); + + btTransform trans; + trans.setIdentity(); + + for(int k=0;k<47;k++) { + for(int j=0;jcalculateLocalInertia(mass,localInertia); + +// btScalar diffX = boxSize[0] * 1.0f; + btScalar diffY = boxSize[1] * 1.0f; + btScalar diffZ = boxSize[2] * 1.0f; + + btScalar offset = -stackSize * (diffZ * 2.0f) * 0.5f; + btVector3 pos(0.0f, diffY, 0.0f); + + btTransform trans; + trans.setIdentity(); + + while(stackSize) { + for(int i=0;icalculateLocalInertia(mass,localInertia); + + + btScalar diffX = boxSize[0]; + btScalar diffY = boxSize[1]; + btScalar diffZ = boxSize[2]; + + btScalar offsetX = -stackSize * (diffX * 2.0f + space) * 0.5f; + btScalar offsetZ = -stackSize * (diffZ * 2.0f + space) * 0.5f; + while(stackSize) { + for(int j=0;jlocalCreateRigidBody(mass,trans,blockShape); + + + } + } + offsetX += diffX; + offsetZ += diffZ; + pos[1] += (diffY * 2.0f + space); + stackSize--; + } + +} + + const btVector3 rotate( const btQuaternion& quat, const btVector3 & vec ) +{ + float tmpX, tmpY, tmpZ, tmpW; + tmpX = ( ( ( quat.getW() * vec.getX() ) + ( quat.getY() * vec.getZ() ) ) - ( quat.getZ() * vec.getY() ) ); + tmpY = ( ( ( quat.getW() * vec.getY() ) + ( quat.getZ() * vec.getX() ) ) - ( quat.getX() * vec.getZ() ) ); + tmpZ = ( ( ( quat.getW() * vec.getZ() ) + ( quat.getX() * vec.getY() ) ) - ( quat.getY() * vec.getX() ) ); + tmpW = ( ( ( quat.getX() * vec.getX() ) + ( quat.getY() * vec.getY() ) ) + ( quat.getZ() * vec.getZ() ) ); + return btVector3( + ( ( ( ( tmpW * quat.getX() ) + ( tmpX * quat.getW() ) ) - ( tmpY * quat.getZ() ) ) + ( tmpZ * quat.getY() ) ), + ( ( ( ( tmpW * quat.getY() ) + ( tmpY * quat.getW() ) ) - ( tmpZ * quat.getX() ) ) + ( tmpX * quat.getZ() ) ), + ( ( ( ( tmpW * quat.getZ() ) + ( tmpZ * quat.getW() ) ) - ( tmpX * quat.getY() ) ) + ( tmpY * quat.getX() ) ) + ); +} + +void BenchmarkDemo::createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize) +{ + + btBoxShape* blockShape = new btBoxShape(btVector3(boxSize[0]-COLLISION_RADIUS,boxSize[1]-COLLISION_RADIUS,boxSize[2]-COLLISION_RADIUS)); + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + blockShape->calculateLocalInertia(mass,localInertia); + + + float radius = 1.3f * rotSize * boxSize[0] / SIMD_PI; + + // create active boxes + btQuaternion rotY(0,1,0,0); + float posY = boxSize[1]; + + for(int i=0;icalculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + +public: + RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,btScalar scale) + : m_ownerWorld (ownerWorld) + { + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.20)*scale); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.28)*scale); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10)*scale, btScalar(0.05)*scale); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(btScalar(0.05), btScalar(0.85)); + m_bodies[i]->setDeactivationTime(btScalar(0.8)); + m_bodies[i]->setSleepingThresholds(btScalar(1.6), btScalar(2.5)); + } + + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(scale*btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(scale*btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); + hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(scale*btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); + hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } + + virtual ~RagDoll () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } +}; + +void BenchmarkDemo::createTest3() +{ + setCameraDistance(btScalar(50.)); + + int size = 16; + + float sizeX = 1.f; + float sizeY = 1.f; + + //int rc=0; + + btScalar scale(3.5); + btVector3 pos(0.0f, sizeY, 0.0f); + while(size) { + float offset = -size * (sizeX * 6.0f) * 0.5f; + for(int i=0;isetLocalScaling(btVector3(scaling,scaling,scaling)); + + for (int i=0;iaddPoint(vtx*btScalar(1./scaling)); + } + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + convexHullShape->calculateLocalInertia(mass,localInertia); + + for(int k=0;k<15;k++) { + for(int j=0;jaddIndexedMesh(part,PHY_SHORT); + + bool useQuantizedAabbCompression = true; + btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface,useQuantizedAabbCompression); + btVector3 localInertia(0,0,0); + trans.setOrigin(btVector3(0,-25,0)); + + btRigidBody* body = localCreateRigidBody(0,trans,trimeshShape); + body->setFriction (btScalar(0.9)); + + } + +} + + +void BenchmarkDemo::createTest5() +{ + setCameraDistance(btScalar(250.)); + btVector3 boxSize(1.5f,1.5f,1.5f); + float boxMass = 1.0f; + float sphereRadius = 1.5f; + float sphereMass = 1.0f; + float capsuleHalf = 2.0f; + float capsuleRadius = 1.0f; + float capsuleMass = 1.0f; + + { + int size = 10; + int height = 10; + + const float cubeSize = boxSize[0]; + float spacing = 2.0f; + btVector3 pos(0.0f, 20.0f, 0.0f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + int numBodies = 0; + + for(int k=0;kaddPoint(vtx); + } + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + convexHullShape->calculateLocalInertia(mass,localInertia); + + + { + int size = 10; + int height = 10; + + const float cubeSize = boxSize[0]; + float spacing = 2.0f; + btVector3 pos(0.0f, 20.0f, 0.0f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + + for(int k=0;kgetNumCollisionObjects()-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;jgetShapeType() != INVALID_SHAPE_PROXYTYPE)); + + //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) + shape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + body->setWorldTransform(startTransform); + body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); + m_dynamicsWorld->addRigidBody(body); + + return body; +} +#endif //USE_GRAPHICAL_BENCHMARK + diff --git a/Demos/Benchmarks/BenchmarkDemo.h b/Demos/Benchmarks/BenchmarkDemo.h index 3beac1cbb..b9f105214 100644 --- a/Demos/Benchmarks/BenchmarkDemo.h +++ b/Demos/Benchmarks/BenchmarkDemo.h @@ -1,265 +1,265 @@ -/* -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 BENCHMARK_DEMO_H -#define BENCHMARK_DEMO_H - - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" - -class btDynamicsWorld; - -#define NUMRAYS 500 - -class btRigidBody; -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; - - -#ifndef USE_GRAPHICAL_BENCHMARK -///empty placeholder -class DemoApplication -{ -protected: - - btDynamicsWorld* m_dynamicsWorld; - btScalar m_defaultContactProcessingThreshold; - -public: - DemoApplication() - :m_defaultContactProcessingThreshold(BT_LARGE_FLOAT) - { - } - virtual void myinit() {} - virtual btDynamicsWorld* getDynamicsWorld() - { - return m_dynamicsWorld; - } - - btScalar getDeltaTimeMicroseconds() - { - return 1.f; - } - - void renderme() {} - void setCameraDistance(btScalar dist){} - void clientResetScene(){} - btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); - -}; -///BenchmarkDemo is provides several performance tests -#define PlatformDemoApplication DemoApplication -#else //USE_GRAPHICAL_BENCHMARK - -#ifdef _WINDOWS -#include "Win32DemoApplication.h" -#define PlatformDemoApplication Win32DemoApplication -#else -#include "GlutDemoApplication.h" -#define PlatformDemoApplication GlutDemoApplication -#endif - -#endif //USE_GRAPHICAL_BENCHMARK - - -class BenchmarkDemo : public PlatformDemoApplication -{ - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btAlignedObjectArray m_ragdolls; - - btBroadphaseInterface* m_overlappingPairCache; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - int m_benchmark; - - void createTest1(); - void createTest2(); - void createTest3(); - void createTest4(); - void createTest5(); - void createTest6(); - void createTest7(); - - void createWall(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); - void createPyramid(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); - void createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize); - void createLargeMeshBody(); - - - class SpuBatchRaycaster* m_batchRaycaster; - class btThreadSupportInterface* m_batchRaycasterThreadSupport; - - void castRays(); - void initRays(); - - public: - - BenchmarkDemo(int benchmark) - :m_benchmark(benchmark) - { - } - virtual ~BenchmarkDemo() - { - exitPhysics(); - } - void initPhysics(); - - void exitPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - - - -}; - -class BenchmarkDemo1 : public BenchmarkDemo -{ -public: - BenchmarkDemo1() - :BenchmarkDemo(1) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo1* demo = new BenchmarkDemo1; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -class BenchmarkDemo2 : public BenchmarkDemo -{ -public: - BenchmarkDemo2() - :BenchmarkDemo(2) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo2* demo = new BenchmarkDemo2; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -class BenchmarkDemo3 : public BenchmarkDemo -{ -public: - BenchmarkDemo3() - :BenchmarkDemo(3) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo3* demo = new BenchmarkDemo3; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -class BenchmarkDemo4 : public BenchmarkDemo -{ -public: - BenchmarkDemo4() - :BenchmarkDemo(4) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo4* demo = new BenchmarkDemo4; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - - -class BenchmarkDemo5 : public BenchmarkDemo -{ -public: - BenchmarkDemo5() - :BenchmarkDemo(5) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo5* demo = new BenchmarkDemo5; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - - -class BenchmarkDemo6 : public BenchmarkDemo -{ -public: - BenchmarkDemo6() - :BenchmarkDemo(6) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo6* demo = new BenchmarkDemo6; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -class BenchmarkDemo7 : public BenchmarkDemo -{ -public: - BenchmarkDemo7() - :BenchmarkDemo(7) - { - } - - static DemoApplication* Create() - { - BenchmarkDemo7* demo = new BenchmarkDemo7; - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -#endif //BENCHMARK_DEMO_H - +/* +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 BENCHMARK_DEMO_H +#define BENCHMARK_DEMO_H + + +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btTransform.h" + +class btDynamicsWorld; + +#define NUMRAYS 500 + +class btRigidBody; +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + + +#ifndef USE_GRAPHICAL_BENCHMARK +///empty placeholder +class DemoApplication +{ +protected: + + btDynamicsWorld* m_dynamicsWorld; + btScalar m_defaultContactProcessingThreshold; + +public: + DemoApplication() + :m_defaultContactProcessingThreshold(BT_LARGE_FLOAT) + { + } + virtual void myinit() {} + virtual btDynamicsWorld* getDynamicsWorld() + { + return m_dynamicsWorld; + } + + btScalar getDeltaTimeMicroseconds() + { + return 1.f; + } + + void renderme() {} + void setCameraDistance(btScalar dist){} + void clientResetScene(){} + btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); + +}; +///BenchmarkDemo is provides several performance tests +#define PlatformDemoApplication DemoApplication +#else //USE_GRAPHICAL_BENCHMARK + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#endif //USE_GRAPHICAL_BENCHMARK + + +class BenchmarkDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btAlignedObjectArray m_ragdolls; + + btBroadphaseInterface* m_overlappingPairCache; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + int m_benchmark; + + void createTest1(); + void createTest2(); + void createTest3(); + void createTest4(); + void createTest5(); + void createTest6(); + void createTest7(); + + void createWall(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); + void createPyramid(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); + void createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize); + void createLargeMeshBody(); + + + class SpuBatchRaycaster* m_batchRaycaster; + class btThreadSupportInterface* m_batchRaycasterThreadSupport; + + void castRays(); + void initRays(); + + public: + + BenchmarkDemo(int benchmark) + :m_benchmark(benchmark) + { + } + virtual ~BenchmarkDemo() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + + + +}; + +class BenchmarkDemo1 : public BenchmarkDemo +{ +public: + BenchmarkDemo1() + :BenchmarkDemo(1) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo1* demo = new BenchmarkDemo1; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo2 : public BenchmarkDemo +{ +public: + BenchmarkDemo2() + :BenchmarkDemo(2) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo2* demo = new BenchmarkDemo2; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo3 : public BenchmarkDemo +{ +public: + BenchmarkDemo3() + :BenchmarkDemo(3) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo3* demo = new BenchmarkDemo3; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo4 : public BenchmarkDemo +{ +public: + BenchmarkDemo4() + :BenchmarkDemo(4) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo4* demo = new BenchmarkDemo4; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + +class BenchmarkDemo5 : public BenchmarkDemo +{ +public: + BenchmarkDemo5() + :BenchmarkDemo(5) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo5* demo = new BenchmarkDemo5; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + +class BenchmarkDemo6 : public BenchmarkDemo +{ +public: + BenchmarkDemo6() + :BenchmarkDemo(6) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo6* demo = new BenchmarkDemo6; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo7 : public BenchmarkDemo +{ +public: + BenchmarkDemo7() + :BenchmarkDemo(7) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo7* demo = new BenchmarkDemo7; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //BENCHMARK_DEMO_H + diff --git a/Demos/Benchmarks/CMakeLists.txt b/Demos/Benchmarks/CMakeLists.txt index 23097227e..ab4277875 100644 --- a/Demos/Benchmarks/CMakeLists.txt +++ b/Demos/Benchmarks/CMakeLists.txt @@ -1,105 +1,105 @@ -# 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 -######################################################## - -IF (USE_GRAPHICAL_BENCHMARK) -IF (USE_GLUT) - INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src - ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL - ) - - IF (USE_MULTITHREADED_BENCHMARK) - LINK_LIBRARIES( OpenGLSupport BulletMultiThreaded BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) - ELSE() - LINK_LIBRARIES( OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) - ENDIF(USE_MULTITHREADED_BENCHMARK) - - IF (WIN32) - ADD_EXECUTABLE(AppBenchmarks - main.cpp - BenchmarkDemo.cpp - BenchmarkDemo.h - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) - ELSE() - ADD_EXECUTABLE(AppBenchmarks - main.cpp - BenchmarkDemo.cpp - BenchmarkDemo.h - ) - ENDIF () - IF (WIN32) - IF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppBenchmarks - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppBenchmarks - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) - IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppBenchmarks PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppBenchmarks PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppBenchmarks PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") - ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - - ENDIF(WIN32) -ELSE (USE_GLUT) - INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src - ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL - ) - - IF (USE_MULTITHREADED_BENCHMARK) - LINK_LIBRARIES( - OpenGLSupport BulletMultiThreaded BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - ELSE() - LINK_LIBRARIES( - OpenGLSupport BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - ENDIF() - - ADD_EXECUTABLE(AppBenchmarks - WIN32 - ../OpenGL/Win32AppMain.cpp - BenchmarkDemo.cpp - BenchmarkDemo.h - Win32BenchmarkDemo.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ENDIF (USE_GLUT) -ELSE (USE_GRAPHICAL_BENCHMARK) - - INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src - ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL - ) - - IF (USE_MULTITHREADED_BENCHMARK) - LINK_LIBRARIES( BulletMultiThreaded BulletDynamics BulletCollision LinearMath ) - ELSE() - LINK_LIBRARIES( BulletDynamics BulletCollision LinearMath ) - ENDIF() - - - ADD_EXECUTABLE(AppBenchmarks - main.cpp - BenchmarkDemo.cpp - ) +# 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 +######################################################## + +IF (USE_GRAPHICAL_BENCHMARK) +IF (USE_GLUT) + INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src + ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL + ) + + IF (USE_MULTITHREADED_BENCHMARK) + LINK_LIBRARIES( OpenGLSupport BulletMultiThreaded BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + ELSE() + LINK_LIBRARIES( OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + ENDIF(USE_MULTITHREADED_BENCHMARK) + + IF (WIN32) + ADD_EXECUTABLE(AppBenchmarks + main.cpp + BenchmarkDemo.cpp + BenchmarkDemo.h + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) + ELSE() + ADD_EXECUTABLE(AppBenchmarks + main.cpp + BenchmarkDemo.cpp + BenchmarkDemo.h + ) + ENDIF () + IF (WIN32) + IF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppBenchmarks + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppBenchmarks + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES) + IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppBenchmarks PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppBenchmarks PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppBenchmarks PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") + ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + + ENDIF(WIN32) +ELSE (USE_GLUT) + INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src + ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL + ) + + IF (USE_MULTITHREADED_BENCHMARK) + LINK_LIBRARIES( + OpenGLSupport BulletMultiThreaded BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + ELSE() + LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + ENDIF() + + ADD_EXECUTABLE(AppBenchmarks + WIN32 + ../OpenGL/Win32AppMain.cpp + BenchmarkDemo.cpp + BenchmarkDemo.h + Win32BenchmarkDemo.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ENDIF (USE_GLUT) +ELSE (USE_GRAPHICAL_BENCHMARK) + + INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src + ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL + ) + + IF (USE_MULTITHREADED_BENCHMARK) + LINK_LIBRARIES( BulletMultiThreaded BulletDynamics BulletCollision LinearMath ) + ELSE() + LINK_LIBRARIES( BulletDynamics BulletCollision LinearMath ) + ENDIF() + + + ADD_EXECUTABLE(AppBenchmarks + main.cpp + BenchmarkDemo.cpp + ) ENDIF (USE_GRAPHICAL_BENCHMARK) \ No newline at end of file diff --git a/Demos/Benchmarks/Taru.mdl b/Demos/Benchmarks/Taru.mdl index 4ebc5039d..73f708c82 100644 --- a/Demos/Benchmarks/Taru.mdl +++ b/Demos/Benchmarks/Taru.mdl @@ -1,49 +1,49 @@ -#define TaruVtxCount 43 -#define TaruIdxCount 132 - -static float TaruVtx[] = { -1.08664f,-1.99237f,0.0f, -0.768369f,-1.99237f,-0.768369f, -1.28852f,1.34412e-007f,-1.28852f, -1.82224f,1.90735e-007f,0.0f, -0.0f,-1.99237f,-1.08664f, -0.0f,0.0f,-1.82224f, -0.0f,-1.99237f,-1.08664f, --0.768369f,-1.99237f,-0.768369f, --1.28852f,1.34412e-007f,-1.28852f, -0.0f,0.0f,-1.82224f, --1.08664f,-1.99237f,1.82086e-007f, --1.82224f,1.90735e-007f,1.59305e-007f, --0.768369f,-1.99237f,0.76837f, --1.28852f,2.47058e-007f,1.28852f, -1.42495e-007f,-1.99237f,1.08664f, -2.38958e-007f,2.70388e-007f,1.82224f, -0.768369f,-1.99237f,0.768369f, -1.28852f,2.47058e-007f,1.28852f, -0.768369f,1.99237f,-0.768369f, -1.08664f,1.99237f,0.0f, -0.0f,1.99237f,-1.08664f, --0.768369f,1.99237f,-0.768369f, -0.0f,1.99237f,-1.08664f, --1.08664f,1.99237f,0.0f, --0.768369f,1.99237f,0.768369f, -1.42495e-007f,1.99237f,1.08664f, -0.768369f,1.99237f,0.768369f, -1.42495e-007f,-1.99237f,1.08664f, --0.768369f,-1.99237f,0.76837f, --1.08664f,-1.99237f,1.82086e-007f, --0.768369f,-1.99237f,-0.768369f, -0.0f,-1.99237f,-1.08664f, -0.768369f,-1.99237f,-0.768369f, -1.08664f,-1.99237f,0.0f, -0.768369f,-1.99237f,0.768369f, -0.768369f,1.99237f,-0.768369f, -0.0f,1.99237f,-1.08664f, --0.768369f,1.99237f,-0.768369f, --1.08664f,1.99237f,0.0f, --0.768369f,1.99237f,0.768369f, -1.42495e-007f,1.99237f,1.08664f, -0.768369f,1.99237f,0.768369f, -1.08664f,1.99237f,0.0f, -}; - +#define TaruVtxCount 43 +#define TaruIdxCount 132 + +static float TaruVtx[] = { +1.08664f,-1.99237f,0.0f, +0.768369f,-1.99237f,-0.768369f, +1.28852f,1.34412e-007f,-1.28852f, +1.82224f,1.90735e-007f,0.0f, +0.0f,-1.99237f,-1.08664f, +0.0f,0.0f,-1.82224f, +0.0f,-1.99237f,-1.08664f, +-0.768369f,-1.99237f,-0.768369f, +-1.28852f,1.34412e-007f,-1.28852f, +0.0f,0.0f,-1.82224f, +-1.08664f,-1.99237f,1.82086e-007f, +-1.82224f,1.90735e-007f,1.59305e-007f, +-0.768369f,-1.99237f,0.76837f, +-1.28852f,2.47058e-007f,1.28852f, +1.42495e-007f,-1.99237f,1.08664f, +2.38958e-007f,2.70388e-007f,1.82224f, +0.768369f,-1.99237f,0.768369f, +1.28852f,2.47058e-007f,1.28852f, +0.768369f,1.99237f,-0.768369f, +1.08664f,1.99237f,0.0f, +0.0f,1.99237f,-1.08664f, +-0.768369f,1.99237f,-0.768369f, +0.0f,1.99237f,-1.08664f, +-1.08664f,1.99237f,0.0f, +-0.768369f,1.99237f,0.768369f, +1.42495e-007f,1.99237f,1.08664f, +0.768369f,1.99237f,0.768369f, +1.42495e-007f,-1.99237f,1.08664f, +-0.768369f,-1.99237f,0.76837f, +-1.08664f,-1.99237f,1.82086e-007f, +-0.768369f,-1.99237f,-0.768369f, +0.0f,-1.99237f,-1.08664f, +0.768369f,-1.99237f,-0.768369f, +1.08664f,-1.99237f,0.0f, +0.768369f,-1.99237f,0.768369f, +0.768369f,1.99237f,-0.768369f, +0.0f,1.99237f,-1.08664f, +-0.768369f,1.99237f,-0.768369f, +-1.08664f,1.99237f,0.0f, +-0.768369f,1.99237f,0.768369f, +1.42495e-007f,1.99237f,1.08664f, +0.768369f,1.99237f,0.768369f, +1.08664f,1.99237f,0.0f, +}; + diff --git a/Demos/Benchmarks/Win32BenchmarkDemo.cpp b/Demos/Benchmarks/Win32BenchmarkDemo.cpp index 092bb0f62..486f308a9 100644 --- a/Demos/Benchmarks/Win32BenchmarkDemo.cpp +++ b/Demos/Benchmarks/Win32BenchmarkDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "BenchmarkDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new BenchmarkDemo(1); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "BenchmarkDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new BenchmarkDemo(1); +} + +#endif diff --git a/Demos/Benchmarks/landscape.mdl b/Demos/Benchmarks/landscape.mdl index a7711f26e..6b879b23e 100644 --- a/Demos/Benchmarks/landscape.mdl +++ b/Demos/Benchmarks/landscape.mdl @@ -1,84369 +1,84369 @@ -#define Landscape02VtxCount 1980 -#define Landscape02IdxCount 11310 -#include "LinearMath/btScalar.h" - -btScalar Landscape02Vtx[] = { --250.0f,2.99192f,113.281f, --250.0f,2.18397f,117.188f, --246.094f,1.62262f,113.281f, --246.094f,1.51628f,117.188f, --242.188f,0.847411f,113.281f, --242.188f,0.628327f,117.188f, --238.281f,-0.697436f,113.281f, --238.281f,-0.567933f,117.188f, --234.375f,-2.65115f,113.281f, --234.375f,-2.01568f,117.188f, --230.469f,-3.82201f,113.281f, --230.469f,-3.41089f,117.188f, --226.563f,-3.99138f,113.281f, --226.563f,-3.82758f,117.188f, --222.656f,-5.51066f,113.281f, --222.656f,-5.01586f,117.188f, --218.75f,-5.62904f,113.281f, --218.75f,-4.74822f,117.188f, --214.844f,-4.90514f,113.281f, --214.844f,-3.30853f,117.188f, --210.938f,-2.9572f,113.281f, --210.938f,-2.32499f,117.188f, --207.031f,-2.44242f,113.281f, --207.031f,-1.71509f,117.188f, --203.125f,-1.5086f,113.281f, --203.125f,-1.19203f,117.188f, --199.219f,-0.130838f,113.281f, --199.219f,0.219498f,117.188f, --195.313f,0.985417f,113.281f, --195.313f,1.66304f,117.188f, --191.406f,3.20064f,113.281f, --191.406f,4.35105f,117.188f, --187.5f,4.6779f,113.281f, --187.5f,6.33228f,117.188f, --183.594f,6.16902f,113.281f, --183.594f,8.00972f,117.188f, --179.688f,8.18835f,113.281f, --179.688f,9.71486f,117.188f, --175.781f,9.35082f,113.281f, --175.781f,10.7727f,117.188f, --171.875f,9.50665f,113.281f, --171.875f,11.358f,117.188f, --167.969f,12.1301f,113.281f, --167.969f,12.5239f,117.188f, --164.063f,14.8728f,113.281f, --164.063f,14.6278f,117.188f, --160.156f,16.3761f,113.281f, --160.156f,17.2069f,117.188f, --156.25f,18.5367f,113.281f, --156.25f,19.9779f,117.188f, --152.344f,22.4636f,113.281f, --152.344f,23.4607f,117.188f, --148.438f,26.1459f,113.281f, --148.438f,26.6108f,117.188f, --144.531f,28.6071f,113.281f, --144.531f,28.4635f,117.188f, --140.625f,30.2795f,113.281f, --140.625f,29.7705f,117.188f, --136.719f,32.2229f,113.281f, --136.719f,31.0684f,117.188f, --132.813f,32.8919f,113.281f, --132.813f,31.8395f,117.188f, --128.906f,33.5143f,113.281f, --128.906f,32.1658f,117.188f, --125.0f,34.6963f,113.281f, --125.0f,34.7478f,117.188f, --121.094f,37.3995f,113.281f, --121.094f,36.0624f,117.188f, --117.188f,38.0464f,113.281f, --117.188f,37.2702f,117.188f, --113.281f,37.8506f,113.281f, --113.281f,37.3474f,117.188f, --109.375f,37.8984f,113.281f, --109.375f,37.242f,117.188f, --105.469f,36.0464f,113.281f, --105.469f,36.1544f,117.188f, --101.563f,34.1136f,113.281f, --101.563f,33.403f,117.188f, --97.6563f,32.0925f,113.281f, --97.6563f,31.294f,117.188f, --93.75f,29.8306f,113.281f, --93.75f,29.4961f,117.188f, --89.8438f,30.1499f,113.281f, --89.8438f,29.0556f,117.188f, --85.9375f,28.8377f,113.281f, --85.9375f,28.2757f,117.188f, --82.0313f,26.9726f,113.281f, --82.0313f,26.6322f,117.188f, --78.125f,25.4597f,113.281f, --78.125f,24.8286f,117.188f, --74.2188f,23.3572f,113.281f, --74.2188f,22.7019f,117.188f, --70.3125f,21.1615f,113.281f, --70.3125f,20.4725f,117.188f, --66.4063f,18.1212f,113.281f, --66.4063f,17.984f,117.188f, --62.5f,16.3411f,113.281f, --62.5f,16.3033f,117.188f, --58.5938f,15.075f,113.281f, --58.5938f,14.2087f,117.188f, --54.6875f,14.2482f,113.281f, --54.6875f,12.8086f,117.188f, --50.7813f,13.7945f,113.281f, --50.7813f,12.5463f,117.188f, --46.875f,12.7086f,113.281f, --46.875f,12.1781f,117.188f, --42.9688f,10.5756f,113.281f, --42.9688f,11.1391f,117.188f, --39.0625f,9.99343f,113.281f, --39.0625f,10.4623f,117.188f, --35.1563f,11.0936f,113.281f, --35.1563f,11.0528f,117.188f, --31.25f,11.9553f,113.281f, --31.25f,11.454f,117.188f, --27.3438f,11.5734f,113.281f, --27.3438f,10.5577f,117.188f, --23.4375f,11.0397f,113.281f, --23.4375f,10.6328f,117.188f, --19.5313f,12.5166f,113.281f, --19.5313f,12.5569f,117.188f, --15.625f,13.856f,113.281f, --15.625f,13.5389f,117.188f, --11.7188f,14.525f,113.281f, --11.7188f,14.3792f,117.188f, --7.8125f,14.7554f,113.281f, --7.8125f,15.4809f,117.188f, --3.90625f,15.9168f,113.281f, --3.90625f,16.1008f,117.188f, -0.0f,17.0728f,113.281f, -0.0f,17.3675f,117.188f, -3.90625f,18.3498f,113.281f, -3.90625f,18.919f,117.188f, --250.0f,4.66213f,109.375f, --246.094f,2.25542f,109.375f, --242.188f,0.972654f,109.375f, --238.281f,-1.95429f,109.375f, --234.375f,-2.74128f,109.375f, --230.469f,-3.62525f,109.375f, --226.563f,-4.55305f,109.375f, --222.656f,-6.4124f,109.375f, --218.75f,-6.73329f,109.375f, --214.844f,-5.91703f,109.375f, --210.938f,-4.73996f,109.375f, --207.031f,-3.31105f,109.375f, --203.125f,-2.06764f,109.375f, --199.219f,-0.969242f,109.375f, --195.313f,0.268778f,109.375f, --191.406f,1.94799f,109.375f, --187.5f,2.80754f,109.375f, --183.594f,4.22131f,109.375f, --179.688f,5.20723f,109.375f, --175.781f,7.47197f,109.375f, --171.875f,9.45267f,109.375f, --167.969f,12.6425f,109.375f, --164.063f,14.9382f,109.375f, --160.156f,16.7967f,109.375f, --156.25f,19.5153f,109.375f, --152.344f,21.4005f,109.375f, --148.438f,25.1259f,109.375f, --144.531f,28.4102f,109.375f, --140.625f,30.7572f,109.375f, --136.719f,33.0194f,109.375f, --132.813f,33.072f,109.375f, --128.906f,33.1358f,109.375f, --125.0f,35.0549f,109.375f, --121.094f,36.4427f,109.375f, --117.188f,38.3265f,109.375f, --113.281f,38.5339f,109.375f, --109.375f,37.0126f,109.375f, --105.469f,34.9063f,109.375f, --101.563f,32.9886f,109.375f, --97.6563f,30.8964f,109.375f, --93.75f,30.5048f,109.375f, --89.8438f,30.4943f,109.375f, --85.9375f,28.8782f,109.375f, --82.0313f,28.1966f,109.375f, --78.125f,25.9164f,109.375f, --74.2188f,23.3428f,109.375f, --70.3125f,20.9839f,109.375f, --66.4063f,18.3885f,109.375f, --62.5f,16.9034f,109.375f, --58.5938f,15.2602f,109.375f, --54.6875f,14.3223f,109.375f, --50.7813f,13.3767f,109.375f, --46.875f,12.5798f,109.375f, --42.9688f,11.3276f,109.375f, --39.0625f,11.0169f,109.375f, --35.1563f,11.7482f,109.375f, --31.25f,12.5037f,109.375f, --27.3438f,12.3832f,109.375f, --23.4375f,12.3097f,109.375f, --19.5313f,12.6165f,109.375f, --15.625f,13.7744f,109.375f, --11.7188f,14.363f,109.375f, --7.8125f,14.828f,109.375f, --3.90625f,15.599f,109.375f, -0.0f,16.3885f,109.375f, -3.90625f,18.0017f,109.375f, --250.0f,5.23892f,105.469f, --246.094f,2.90481f,105.469f, --242.188f,0.264647f,105.469f, --238.281f,-0.288927f,105.469f, --234.375f,-0.910295f,105.469f, --230.469f,-2.20742f,105.469f, --226.563f,-3.6968f,105.469f, --222.656f,-5.2145f,105.469f, --218.75f,-6.07198f,105.469f, --214.844f,-5.42535f,105.469f, --210.938f,-4.82182f,105.469f, --207.031f,-3.22017f,105.469f, --203.125f,-2.28037f,105.469f, --199.219f,-1.51966f,105.469f, --195.313f,-0.0464115f,105.469f, --191.406f,1.73523f,105.469f, --187.5f,2.72489f,105.469f, --183.594f,4.39996f,105.469f, --179.688f,5.48007f,105.469f, --175.781f,7.27769f,105.469f, --171.875f,10.1115f,105.469f, --167.969f,13.0557f,105.469f, --164.063f,15.7105f,105.469f, --160.156f,17.8448f,105.469f, --156.25f,19.8398f,105.469f, --152.344f,21.6672f,105.469f, --148.438f,24.1475f,105.469f, --144.531f,28.4217f,105.469f, --140.625f,31.6921f,105.469f, --136.719f,34.3814f,105.469f, --132.813f,34.9011f,105.469f, --128.906f,33.8056f,105.469f, --125.0f,34.3226f,105.469f, --121.094f,35.6061f,105.469f, --117.188f,37.9636f,105.469f, --113.281f,38.6673f,105.469f, --109.375f,36.8831f,105.469f, --105.469f,34.5846f,105.469f, --101.563f,32.2221f,105.469f, --97.6563f,30.3826f,105.469f, --93.75f,30.4243f,105.469f, --89.8438f,30.7761f,105.469f, --85.9375f,29.8335f,105.469f, --82.0313f,28.0208f,105.469f, --78.125f,25.7215f,105.469f, --74.2188f,22.9019f,105.469f, --70.3125f,20.9096f,105.469f, --66.4063f,18.2558f,105.469f, --62.5f,16.689f,105.469f, --58.5938f,15.8032f,105.469f, --54.6875f,14.8311f,105.469f, --50.7813f,13.7628f,105.469f, --46.875f,13.0048f,105.469f, --42.9688f,11.9222f,105.469f, --39.0625f,12.021f,105.469f, --35.1563f,12.2727f,105.469f, --31.25f,12.6336f,105.469f, --27.3438f,12.6865f,105.469f, --23.4375f,12.3758f,105.469f, --19.5313f,13.0149f,105.469f, --15.625f,14.0448f,105.469f, --11.7188f,14.6064f,105.469f, --7.8125f,15.1105f,105.469f, --3.90625f,15.8367f,105.469f, -0.0f,16.822f,105.469f, -3.90625f,17.9608f,105.469f, --250.0f,4.27755f,101.563f, --246.094f,2.84639f,101.563f, --242.188f,2.00001f,101.563f, --238.281f,1.59426f,101.563f, --234.375f,0.494548f,101.563f, --230.469f,-1.78619f,101.563f, --226.563f,-2.8668f,101.563f, --222.656f,-5.00406f,101.563f, --218.75f,-6.01721f,101.563f, --214.844f,-5.29731f,101.563f, --210.938f,-4.08939f,101.563f, --207.031f,-3.76734f,101.563f, --203.125f,-2.53974f,101.563f, --199.219f,-1.06933f,101.563f, --195.313f,-0.447271f,101.563f, --191.406f,1.52362f,101.563f, --187.5f,3.40783f,101.563f, --183.594f,4.48418f,101.563f, --179.688f,6.791f,101.563f, --175.781f,8.68642f,101.563f, --171.875f,11.1511f,101.563f, --167.969f,14.4536f,101.563f, --164.063f,17.5923f,101.563f, --160.156f,19.4108f,101.563f, --156.25f,20.7669f,101.563f, --152.344f,22.2683f,101.563f, --148.438f,24.0251f,101.563f, --144.531f,27.7431f,101.563f, --140.625f,31.4827f,101.563f, --136.719f,34.3945f,101.563f, --132.813f,35.3451f,101.563f, --128.906f,34.9912f,101.563f, --125.0f,34.2253f,101.563f, --121.094f,35.1765f,101.563f, --117.188f,37.3095f,101.563f, --113.281f,37.7256f,101.563f, --109.375f,36.2331f,101.563f, --105.469f,34.435f,101.563f, --101.563f,32.1021f,101.563f, --97.6563f,31.0728f,101.563f, --93.75f,30.7462f,101.563f, --89.8438f,30.8125f,101.563f, --85.9375f,29.6802f,101.563f, --82.0313f,27.3023f,101.563f, --78.125f,25.1113f,101.563f, --74.2188f,22.6475f,101.563f, --70.3125f,20.1315f,101.563f, --66.4063f,18.0132f,101.563f, --62.5f,17.1414f,101.563f, --58.5938f,16.7884f,101.563f, --54.6875f,15.7107f,101.563f, --50.7813f,14.6855f,101.563f, --46.875f,13.3626f,101.563f, --42.9688f,11.6073f,101.563f, --39.0625f,11.3359f,101.563f, --35.1563f,12.4227f,101.563f, --31.25f,13.068f,101.563f, --27.3438f,12.4485f,101.563f, --23.4375f,11.8491f,101.563f, --19.5313f,13.6925f,101.563f, --15.625f,14.7114f,101.563f, --11.7188f,14.963f,101.563f, --7.8125f,15.0631f,101.563f, --3.90625f,16.1214f,101.563f, -0.0f,17.0818f,101.563f, -3.90625f,17.7074f,101.563f, --250.0f,4.24758f,97.6563f, --246.094f,3.92716f,97.6563f, --242.188f,3.12473f,97.6563f, --238.281f,2.07357f,97.6563f, --234.375f,0.407895f,97.6563f, --230.469f,-0.904646f,97.6563f, --226.563f,-2.62182f,97.6563f, --222.656f,-3.89204f,97.6563f, --218.75f,-5.61944f,97.6563f, --214.844f,-4.00077f,97.6563f, --210.938f,-2.40041f,97.6563f, --207.031f,-2.40061f,97.6563f, --203.125f,-1.96286f,97.6563f, --199.219f,-1.48062f,97.6563f, --195.313f,-0.101653f,97.6563f, --191.406f,1.73583f,97.6563f, --187.5f,3.67572f,97.6563f, --183.594f,5.12213f,97.6563f, --179.688f,7.63637f,97.6563f, --175.781f,10.1724f,97.6563f, --171.875f,12.2812f,97.6563f, --167.969f,15.2851f,97.6563f, --164.063f,18.2233f,97.6563f, --160.156f,20.4971f,97.6563f, --156.25f,21.878f,97.6563f, --152.344f,23.2306f,97.6563f, --148.438f,24.2686f,97.6563f, --144.531f,28.1874f,97.6563f, --140.625f,31.2597f,97.6563f, --136.719f,33.3133f,97.6563f, --132.813f,35.319f,97.6563f, --128.906f,35.1009f,97.6563f, --125.0f,34.8265f,97.6563f, --121.094f,34.2935f,97.6563f, --117.188f,36.4908f,97.6563f, --113.281f,37.1964f,97.6563f, --109.375f,36.1354f,97.6563f, --105.469f,34.3852f,97.6563f, --101.563f,30.8829f,97.6563f, --97.6563f,30.1091f,97.6563f, --93.75f,30.9329f,97.6563f, --89.8438f,30.8751f,97.6563f, --85.9375f,29.018f,97.6563f, --82.0313f,27.3105f,97.6563f, --78.125f,25.0087f,97.6563f, --74.2188f,21.6466f,97.6563f, --70.3125f,18.5043f,97.6563f, --66.4063f,18.66f,97.6563f, --62.5f,18.1592f,97.6563f, --58.5938f,17.521f,97.6563f, --54.6875f,16.3389f,97.6563f, --50.7813f,14.8664f,97.6563f, --46.875f,13.5991f,97.6563f, --42.9688f,11.873f,97.6563f, --39.0625f,11.498f,97.6563f, --35.1563f,11.5171f,97.6563f, --31.25f,12.5588f,97.6563f, --27.3438f,12.2172f,97.6563f, --23.4375f,11.2491f,97.6563f, --19.5313f,13.2373f,97.6563f, --15.625f,13.5683f,97.6563f, --11.7188f,14.0875f,97.6563f, --7.8125f,14.6591f,97.6563f, --3.90625f,15.1275f,97.6563f, -0.0f,15.8243f,97.6563f, -3.90625f,18.0176f,97.6563f, --250.0f,4.93619f,93.75f, --246.094f,3.50077f,93.75f, --242.188f,2.88532f,93.75f, --238.281f,2.19691f,93.75f, --234.375f,1.45343f,93.75f, --230.469f,-0.151238f,93.75f, --226.563f,-1.0856f,93.75f, --222.656f,-2.29205f,93.75f, --218.75f,-3.83678f,93.75f, --214.844f,-2.73856f,93.75f, --210.938f,-2.19574f,93.75f, --207.031f,-0.222008f,93.75f, --203.125f,-0.117961f,93.75f, --199.219f,-0.17607f,93.75f, --195.313f,1.32212f,93.75f, --191.406f,2.64292f,93.75f, --187.5f,3.72678f,93.75f, --183.594f,5.78729f,93.75f, --179.688f,9.09616f,93.75f, --175.781f,11.4833f,93.75f, --171.875f,13.1923f,93.75f, --167.969f,15.68f,93.75f, --164.063f,17.9844f,93.75f, --160.156f,20.7688f,93.75f, --156.25f,23.4925f,93.75f, --152.344f,25.2252f,93.75f, --148.438f,25.9373f,93.75f, --144.531f,28.1941f,93.75f, --140.625f,31.9896f,93.75f, --136.719f,33.5688f,93.75f, --132.813f,34.7177f,93.75f, --128.906f,35.1459f,93.75f, --125.0f,34.9785f,93.75f, --121.094f,34.3971f,93.75f, --117.188f,35.2455f,93.75f, --113.281f,36.0209f,93.75f, --109.375f,35.244f,93.75f, --105.469f,33.4542f,93.75f, --101.563f,30.3707f,93.75f, --97.6563f,30.709f,93.75f, --93.75f,31.2489f,93.75f, --89.8438f,30.5476f,93.75f, --85.9375f,28.5982f,93.75f, --82.0313f,26.6838f,93.75f, --78.125f,24.1646f,93.75f, --74.2188f,21.261f,93.75f, --70.3125f,19.8206f,93.75f, --66.4063f,19.4952f,93.75f, --62.5f,18.3276f,93.75f, --58.5938f,18.1028f,93.75f, --54.6875f,17.0878f,93.75f, --50.7813f,15.0144f,93.75f, --46.875f,13.5565f,93.75f, --42.9688f,11.0211f,93.75f, --39.0625f,11.1986f,93.75f, --35.1563f,10.4097f,93.75f, --31.25f,11.2207f,93.75f, --27.3438f,11.4539f,93.75f, --23.4375f,11.4014f,93.75f, --19.5313f,12.2344f,93.75f, --15.625f,13.5348f,93.75f, --11.7188f,14.2772f,93.75f, --7.8125f,14.0447f,93.75f, --3.90625f,14.1587f,93.75f, -0.0f,15.3266f,93.75f, -3.90625f,17.1671f,93.75f, --250.0f,5.40499f,89.8438f, --246.094f,3.9236f,89.8438f, --242.188f,2.78029f,89.8438f, --238.281f,2.337f,89.8438f, --234.375f,1.45614f,89.8438f, --230.469f,0.487402f,89.8438f, --226.563f,0.814658f,89.8438f, --222.656f,-0.244101f,89.8438f, --218.75f,-2.09422f,89.8438f, --214.844f,-1.48441f,89.8438f, --210.938f,-0.695794f,89.8438f, --207.031f,0.742314f,89.8438f, --203.125f,1.30594f,89.8438f, --199.219f,1.49011f,89.8438f, --195.313f,2.5687f,89.8438f, --191.406f,3.72318f,89.8438f, --187.5f,4.658f,89.8438f, --183.594f,7.20615f,89.8438f, --179.688f,9.85211f,89.8438f, --175.781f,12.8482f,89.8438f, --171.875f,14.6361f,89.8438f, --167.969f,16.6036f,89.8438f, --164.063f,19.7308f,89.8438f, --160.156f,22.7068f,89.8438f, --156.25f,24.421f,89.8438f, --152.344f,25.8961f,89.8438f, --148.438f,27.1249f,89.8438f, --144.531f,29.0138f,89.8438f, --140.625f,31.6384f,89.8438f, --136.719f,33.9142f,89.8438f, --132.813f,34.3317f,89.8438f, --128.906f,36.0856f,89.8438f, --125.0f,35.5134f,89.8438f, --121.094f,34.7035f,89.8438f, --117.188f,33.6847f,89.8438f, --113.281f,34.2624f,89.8438f, --109.375f,34.2147f,89.8438f, --105.469f,32.2925f,89.8438f, --101.563f,30.4889f,89.8438f, --97.6563f,30.8562f,89.8438f, --93.75f,31.4717f,89.8438f, --89.8438f,30.2623f,89.8438f, --85.9375f,28.4623f,89.8438f, --82.0313f,26.6117f,89.8438f, --78.125f,24.1755f,89.8438f, --74.2188f,22.4752f,89.8438f, --70.3125f,20.3246f,89.8438f, --66.4063f,19.488f,89.8438f, --62.5f,18.6447f,89.8438f, --58.5938f,17.8933f,89.8438f, --54.6875f,16.177f,89.8438f, --50.7813f,15.2537f,89.8438f, --46.875f,13.5232f,89.8438f, --42.9688f,11.842f,89.8438f, --39.0625f,10.223f,89.8438f, --35.1563f,9.54441f,89.8438f, --31.25f,9.73488f,89.8438f, --27.3438f,10.7057f,89.8438f, --23.4375f,11.9185f,89.8438f, --19.5313f,13.2106f,89.8438f, --15.625f,13.0807f,89.8438f, --11.7188f,12.8112f,89.8438f, --7.8125f,12.7972f,89.8438f, --3.90625f,14.1049f,89.8438f, -0.0f,14.9674f,89.8438f, -3.90625f,15.6427f,89.8438f, --250.0f,6.21462f,85.9375f, --246.094f,4.66025f,85.9375f, --242.188f,3.36279f,85.9375f, --238.281f,1.97426f,85.9375f, --234.375f,0.590897f,85.9375f, --230.469f,2.01222f,85.9375f, --226.563f,2.15192f,85.9375f, --222.656f,0.78006f,85.9375f, --218.75f,-0.424968f,85.9375f, --214.844f,-0.512869f,85.9375f, --210.938f,0.00319427f,85.9375f, --207.031f,1.05715f,85.9375f, --203.125f,2.11926f,85.9375f, --199.219f,2.48862f,85.9375f, --195.313f,3.89944f,85.9375f, --191.406f,5.71899f,85.9375f, --187.5f,6.41674f,85.9375f, --183.594f,7.94295f,85.9375f, --179.688f,10.9562f,85.9375f, --175.781f,13.1951f,85.9375f, --171.875f,15.7827f,85.9375f, --167.969f,17.6951f,85.9375f, --164.063f,20.2261f,85.9375f, --160.156f,22.5211f,85.9375f, --156.25f,24.8103f,85.9375f, --152.344f,26.6666f,85.9375f, --148.438f,27.7052f,85.9375f, --144.531f,29.2234f,85.9375f, --140.625f,31.4629f,85.9375f, --136.719f,34.0955f,85.9375f, --132.813f,34.7124f,85.9375f, --128.906f,36.1712f,85.9375f, --125.0f,36.4743f,85.9375f, --121.094f,35.3967f,85.9375f, --117.188f,34.3505f,85.9375f, --113.281f,33.5175f,85.9375f, --109.375f,32.9976f,85.9375f, --105.469f,31.7882f,85.9375f, --101.563f,31.1746f,85.9375f, --97.6563f,31.0271f,85.9375f, --93.75f,31.5303f,85.9375f, --89.8438f,30.8744f,85.9375f, --85.9375f,28.1434f,85.9375f, --82.0313f,25.9196f,85.9375f, --78.125f,24.4044f,85.9375f, --74.2188f,21.9984f,85.9375f, --70.3125f,20.0411f,85.9375f, --66.4063f,19.9449f,85.9375f, --62.5f,18.3893f,85.9375f, --58.5938f,16.9846f,85.9375f, --54.6875f,15.6155f,85.9375f, --50.7813f,14.6152f,85.9375f, --46.875f,12.7358f,85.9375f, --42.9688f,12.1599f,85.9375f, --39.0625f,10.1045f,85.9375f, --35.1563f,9.61416f,85.9375f, --31.25f,10.0784f,85.9375f, --27.3438f,10.2188f,85.9375f, --23.4375f,11.574f,85.9375f, --19.5313f,11.8712f,85.9375f, --15.625f,11.9109f,85.9375f, --11.7188f,11.509f,85.9375f, --7.8125f,13.9979f,85.9375f, --3.90625f,14.8453f,85.9375f, -0.0f,14.7941f,85.9375f, -3.90625f,15.5916f,85.9375f, --250.0f,6.94324f,82.0313f, --246.094f,4.77131f,82.0313f, --242.188f,3.62143f,82.0313f, --238.281f,2.50324f,82.0313f, --234.375f,1.40345f,82.0313f, --230.469f,2.05881f,82.0313f, --226.563f,2.41769f,82.0313f, --222.656f,1.23736f,82.0313f, --218.75f,1.59545f,82.0313f, --214.844f,1.25313f,82.0313f, --210.938f,1.53594f,82.0313f, --207.031f,2.33073f,82.0313f, --203.125f,2.59696f,82.0313f, --199.219f,4.25487f,82.0313f, --195.313f,5.86136f,82.0313f, --191.406f,7.54631f,82.0313f, --187.5f,8.7315f,82.0313f, --183.594f,9.65737f,82.0313f, --179.688f,11.5328f,82.0313f, --175.781f,14.3069f,82.0313f, --171.875f,16.2889f,82.0313f, --167.969f,17.6379f,82.0313f, --164.063f,20.4422f,82.0313f, --160.156f,22.9557f,82.0313f, --156.25f,25.0731f,82.0313f, --152.344f,27.3881f,82.0313f, --148.438f,28.7955f,82.0313f, --144.531f,30.2575f,82.0313f, --140.625f,32.5888f,82.0313f, --136.719f,33.9884f,82.0313f, --132.813f,34.4838f,82.0313f, --128.906f,35.7672f,82.0313f, --125.0f,36.1002f,82.0313f, --121.094f,35.9318f,82.0313f, --117.188f,34.9715f,82.0313f, --113.281f,33.3187f,82.0313f, --109.375f,31.9477f,82.0313f, --105.469f,31.4437f,82.0313f, --101.563f,31.2817f,82.0313f, --97.6563f,32.08f,82.0313f, --93.75f,31.4037f,82.0313f, --89.8438f,30.2769f,82.0313f, --85.9375f,28.1374f,82.0313f, --82.0313f,25.4814f,82.0313f, --78.125f,24.1831f,82.0313f, --74.2188f,22.6148f,82.0313f, --70.3125f,19.2585f,82.0313f, --66.4063f,18.6785f,82.0313f, --62.5f,17.7889f,82.0313f, --58.5938f,16.5855f,82.0313f, --54.6875f,14.6918f,82.0313f, --50.7813f,12.9532f,82.0313f, --46.875f,12.1502f,82.0313f, --42.9688f,11.3533f,82.0313f, --39.0625f,9.8302f,82.0313f, --35.1563f,9.95311f,82.0313f, --31.25f,10.7631f,82.0313f, --27.3438f,10.2187f,82.0313f, --23.4375f,10.1072f,82.0313f, --19.5313f,11.299f,82.0313f, --15.625f,11.5563f,82.0313f, --11.7188f,13.9188f,82.0313f, --7.8125f,15.247f,82.0313f, --3.90625f,15.6866f,82.0313f, -0.0f,15.9694f,82.0313f, -3.90625f,16.9644f,82.0313f, --250.0f,6.39735f,78.125f, --246.094f,5.09353f,78.125f, --242.188f,4.53503f,78.125f, --238.281f,3.72522f,78.125f, --234.375f,3.02648f,78.125f, --230.469f,3.02057f,78.125f, --226.563f,3.8807f,78.125f, --222.656f,4.47382f,78.125f, --218.75f,3.84005f,78.125f, --214.844f,2.7347f,78.125f, --210.938f,4.55018f,78.125f, --207.031f,5.04579f,78.125f, --203.125f,4.45937f,78.125f, --199.219f,5.32656f,78.125f, --195.313f,7.13791f,78.125f, --191.406f,8.89822f,78.125f, --187.5f,10.3911f,78.125f, --183.594f,11.3679f,78.125f, --179.688f,13.4068f,78.125f, --175.781f,16.3393f,78.125f, --171.875f,17.801f,78.125f, --167.969f,19.0455f,78.125f, --164.063f,21.4178f,78.125f, --160.156f,23.555f,78.125f, --156.25f,25.3953f,78.125f, --152.344f,26.9657f,78.125f, --148.438f,28.8194f,78.125f, --144.531f,31.456f,78.125f, --140.625f,33.3499f,78.125f, --136.719f,34.2296f,78.125f, --132.813f,34.5964f,78.125f, --128.906f,35.7399f,78.125f, --125.0f,35.4576f,78.125f, --121.094f,35.7986f,78.125f, --117.188f,34.4641f,78.125f, --113.281f,33.925f,78.125f, --109.375f,32.0574f,78.125f, --105.469f,31.6743f,78.125f, --101.563f,31.65f,78.125f, --97.6563f,31.9461f,78.125f, --93.75f,31.2261f,78.125f, --89.8438f,30.4701f,78.125f, --85.9375f,27.7569f,78.125f, --82.0313f,25.4553f,78.125f, --78.125f,23.3917f,78.125f, --74.2188f,21.6944f,78.125f, --70.3125f,18.6818f,78.125f, --66.4063f,17.4066f,78.125f, --62.5f,17.1317f,78.125f, --58.5938f,16.5093f,78.125f, --54.6875f,14.9512f,78.125f, --50.7813f,13.228f,78.125f, --46.875f,11.4638f,78.125f, --42.9688f,10.3877f,78.125f, --39.0625f,9.7131f,78.125f, --35.1563f,10.0477f,78.125f, --31.25f,10.325f,78.125f, --27.3438f,10.317f,78.125f, --23.4375f,10.9076f,78.125f, --19.5313f,11.7808f,78.125f, --15.625f,14.1905f,78.125f, --11.7188f,15.6035f,78.125f, --7.8125f,16.0979f,78.125f, --3.90625f,16.6425f,78.125f, -0.0f,17.2837f,78.125f, -3.90625f,18.8244f,78.125f, --250.0f,6.03592f,74.2188f, --246.094f,5.17606f,74.2188f, --242.188f,3.7036f,74.2188f, --238.281f,3.69f,74.2188f, --234.375f,4.60611f,74.2188f, --230.469f,4.52682f,74.2188f, --226.563f,5.59937f,74.2188f, --222.656f,6.25837f,74.2188f, --218.75f,5.11517f,74.2188f, --214.844f,4.67242f,74.2188f, --210.938f,5.76173f,74.2188f, --207.031f,6.80461f,74.2188f, --203.125f,6.95083f,74.2188f, --199.219f,7.35893f,74.2188f, --195.313f,8.63949f,74.2188f, --191.406f,10.4144f,74.2188f, --187.5f,11.8105f,74.2188f, --183.594f,13.4583f,74.2188f, --179.688f,15.5665f,74.2188f, --175.781f,18.2568f,74.2188f, --171.875f,19.1732f,74.2188f, --167.969f,21.3098f,74.2188f, --164.063f,23.6359f,74.2188f, --160.156f,25.3154f,74.2188f, --156.25f,27.6289f,74.2188f, --152.344f,28.8953f,74.2188f, --148.438f,30.5098f,74.2188f, --144.531f,32.3942f,74.2188f, --140.625f,33.3325f,74.2188f, --136.719f,33.8009f,74.2188f, --132.813f,35.0803f,74.2188f, --128.906f,34.737f,74.2188f, --125.0f,34.3656f,74.2188f, --121.094f,34.2107f,74.2188f, --117.188f,33.1645f,74.2188f, --113.281f,32.0615f,74.2188f, --109.375f,32.0827f,74.2188f, --105.469f,32.4658f,74.2188f, --101.563f,31.6315f,74.2188f, --97.6563f,30.9698f,74.2188f, --93.75f,30.6464f,74.2188f, --89.8438f,29.9645f,74.2188f, --85.9375f,27.4393f,74.2188f, --82.0313f,25.2807f,74.2188f, --78.125f,23.57f,74.2188f, --74.2188f,20.653f,74.2188f, --70.3125f,18.1395f,74.2188f, --66.4063f,17.6585f,74.2188f, --62.5f,17.2798f,74.2188f, --58.5938f,16.6041f,74.2188f, --54.6875f,14.6913f,74.2188f, --50.7813f,13.1416f,74.2188f, --46.875f,10.9374f,74.2188f, --42.9688f,9.39485f,74.2188f, --39.0625f,9.21956f,74.2188f, --35.1563f,9.74875f,74.2188f, --31.25f,10.3932f,74.2188f, --27.3438f,10.7996f,74.2188f, --23.4375f,11.5538f,74.2188f, --19.5313f,13.5418f,74.2188f, --15.625f,15.6336f,74.2188f, --11.7188f,16.3846f,74.2188f, --7.8125f,17.738f,74.2188f, --3.90625f,17.98f,74.2188f, -0.0f,19.1669f,74.2188f, -3.90625f,20.6829f,74.2188f, --250.0f,5.45149f,70.3125f, --246.094f,4.83779f,70.3125f, --242.188f,3.60093f,70.3125f, --238.281f,3.26469f,70.3125f, --234.375f,4.06145f,70.3125f, --230.469f,5.31565f,70.3125f, --226.563f,6.65809f,70.3125f, --222.656f,6.70538f,70.3125f, --218.75f,6.93258f,70.3125f, --214.844f,6.84841f,70.3125f, --210.938f,6.9662f,70.3125f, --207.031f,7.74003f,70.3125f, --203.125f,8.68749f,70.3125f, --199.219f,9.06225f,70.3125f, --195.313f,10.0803f,70.3125f, --191.406f,12.202f,70.3125f, --187.5f,14.063f,70.3125f, --183.594f,15.732f,70.3125f, --179.688f,18.3972f,70.3125f, --175.781f,19.5054f,70.3125f, --171.875f,20.8927f,70.3125f, --167.969f,23.3843f,70.3125f, --164.063f,25.5894f,70.3125f, --160.156f,27.0506f,70.3125f, --156.25f,28.6483f,70.3125f, --152.344f,31.3986f,70.3125f, --148.438f,32.5255f,70.3125f, --144.531f,33.0315f,70.3125f, --140.625f,33.0927f,70.3125f, --136.719f,33.7595f,70.3125f, --132.813f,34.1872f,70.3125f, --128.906f,33.4924f,70.3125f, --125.0f,34.1817f,70.3125f, --121.094f,33.4642f,70.3125f, --117.188f,32.3231f,70.3125f, --113.281f,32.1235f,70.3125f, --109.375f,32.674f,70.3125f, --105.469f,32.7558f,70.3125f, --101.563f,32.4896f,70.3125f, --97.6563f,30.7945f,70.3125f, --93.75f,30.1182f,70.3125f, --89.8438f,28.6969f,70.3125f, --85.9375f,26.606f,70.3125f, --82.0313f,24.8053f,70.3125f, --78.125f,23.3599f,70.3125f, --74.2188f,20.5363f,70.3125f, --70.3125f,18.2858f,70.3125f, --66.4063f,17.647f,70.3125f, --62.5f,17.3761f,70.3125f, --58.5938f,16.3124f,70.3125f, --54.6875f,14.016f,70.3125f, --50.7813f,11.6317f,70.3125f, --46.875f,9.68832f,70.3125f, --42.9688f,8.63692f,70.3125f, --39.0625f,8.52412f,70.3125f, --35.1563f,10.3549f,70.3125f, --31.25f,11.1185f,70.3125f, --27.3438f,12.8223f,70.3125f, --23.4375f,14.2548f,70.3125f, --19.5313f,15.4066f,70.3125f, --15.625f,16.875f,70.3125f, --11.7188f,17.7202f,70.3125f, --7.8125f,18.6716f,70.3125f, --3.90625f,19.72f,70.3125f, -0.0f,21.3086f,70.3125f, -3.90625f,22.948f,70.3125f, --250.0f,4.53118f,66.4063f, --246.094f,3.73568f,66.4063f, --242.188f,3.80679f,66.4063f, --238.281f,4.42509f,66.4063f, --234.375f,5.0317f,66.4063f, --230.469f,6.63484f,66.4063f, --226.563f,7.65599f,66.4063f, --222.656f,8.55305f,66.4063f, --218.75f,8.71866f,66.4063f, --214.844f,7.68897f,66.4063f, --210.938f,8.59141f,66.4063f, --207.031f,9.73811f,66.4063f, --203.125f,10.1348f,66.4063f, --199.219f,10.1075f,66.4063f, --195.313f,11.1394f,66.4063f, --191.406f,13.5829f,66.4063f, --187.5f,15.4951f,66.4063f, --183.594f,17.5574f,66.4063f, --179.688f,19.9291f,66.4063f, --175.781f,21.0567f,66.4063f, --171.875f,22.5003f,66.4063f, --167.969f,25.5993f,66.4063f, --164.063f,27.0097f,66.4063f, --160.156f,27.9166f,66.4063f, --156.25f,29.8989f,66.4063f, --152.344f,32.1785f,66.4063f, --148.438f,34.0669f,66.4063f, --144.531f,34.5129f,66.4063f, --140.625f,34.1795f,66.4063f, --136.719f,33.3311f,66.4063f, --132.813f,32.969f,66.4063f, --128.906f,32.9477f,66.4063f, --125.0f,33.5186f,66.4063f, --121.094f,32.9715f,66.4063f, --117.188f,32.4898f,66.4063f, --113.281f,33.0858f,66.4063f, --109.375f,32.6501f,66.4063f, --105.469f,32.847f,66.4063f, --101.563f,32.8074f,66.4063f, --97.6563f,31.5661f,66.4063f, --93.75f,29.4807f,66.4063f, --89.8438f,28.6706f,66.4063f, --85.9375f,26.408f,66.4063f, --82.0313f,24.3989f,66.4063f, --78.125f,22.4069f,66.4063f, --74.2188f,20.2026f,66.4063f, --70.3125f,18.5513f,66.4063f, --66.4063f,17.0548f,66.4063f, --62.5f,17.0623f,66.4063f, --58.5938f,15.9909f,66.4063f, --54.6875f,13.3885f,66.4063f, --50.7813f,11.8657f,66.4063f, --46.875f,9.02652f,66.4063f, --42.9688f,8.99046f,66.4063f, --39.0625f,10.0543f,66.4063f, --35.1563f,11.7078f,66.4063f, --31.25f,12.4956f,66.4063f, --27.3438f,14.0575f,66.4063f, --23.4375f,15.2147f,66.4063f, --19.5313f,16.7089f,66.4063f, --15.625f,17.8009f,66.4063f, --11.7188f,19.0086f,66.4063f, --7.8125f,20.9864f,66.4063f, --3.90625f,22.6943f,66.4063f, -0.0f,23.9641f,66.4063f, -3.90625f,25.5564f,66.4063f, --250.0f,4.6779f,62.5f, --246.094f,4.41735f,62.5f, --242.188f,3.93647f,62.5f, --238.281f,4.50648f,62.5f, --234.375f,5.52163f,62.5f, --230.469f,7.10395f,62.5f, --226.563f,8.10257f,62.5f, --222.656f,8.36726f,62.5f, --218.75f,8.58321f,62.5f, --214.844f,8.56809f,62.5f, --210.938f,9.95321f,62.5f, --207.031f,10.4904f,62.5f, --203.125f,10.812f,62.5f, --199.219f,11.5942f,62.5f, --195.313f,13.0371f,62.5f, --191.406f,14.6432f,62.5f, --187.5f,16.7375f,62.5f, --183.594f,18.4129f,62.5f, --179.688f,20.9534f,62.5f, --175.781f,23.1161f,62.5f, --171.875f,25.0267f,62.5f, --167.969f,26.7355f,62.5f, --164.063f,27.6983f,62.5f, --160.156f,29.1111f,62.5f, --156.25f,31.1905f,62.5f, --152.344f,32.9766f,62.5f, --148.438f,33.4703f,62.5f, --144.531f,33.714f,62.5f, --140.625f,33.649f,62.5f, --136.719f,33.0246f,62.5f, --132.813f,32.7386f,62.5f, --128.906f,32.6069f,62.5f, --125.0f,32.6579f,62.5f, --121.094f,31.5955f,62.5f, --117.188f,31.8589f,62.5f, --113.281f,32.7188f,62.5f, --109.375f,32.889f,62.5f, --105.469f,32.7317f,62.5f, --101.563f,32.4229f,62.5f, --97.6563f,31.2118f,62.5f, --93.75f,30.6824f,62.5f, --89.8438f,28.584f,62.5f, --85.9375f,26.1183f,62.5f, --82.0313f,23.8148f,62.5f, --78.125f,22.0333f,62.5f, --74.2188f,20.178f,62.5f, --70.3125f,18.704f,62.5f, --66.4063f,16.8036f,62.5f, --62.5f,15.7173f,62.5f, --58.5938f,13.9284f,62.5f, --54.6875f,13.0731f,62.5f, --50.7813f,11.8974f,62.5f, --46.875f,9.91347f,62.5f, --42.9688f,10.1439f,62.5f, --39.0625f,11.304f,62.5f, --35.1563f,12.5111f,62.5f, --31.25f,14.112f,62.5f, --27.3438f,15.3325f,62.5f, --23.4375f,16.6214f,62.5f, --19.5313f,17.8469f,62.5f, --15.625f,19.2987f,62.5f, --11.7188f,20.9518f,62.5f, --7.8125f,23.4289f,62.5f, --3.90625f,24.9379f,62.5f, -0.0f,26.156f,62.5f, -3.90625f,27.1929f,62.5f, --250.0f,4.23938f,58.5938f, --246.094f,4.819f,58.5938f, --242.188f,4.63067f,58.5938f, --238.281f,5.29023f,58.5938f, --234.375f,6.48193f,58.5938f, --230.469f,6.85856f,58.5938f, --226.563f,8.4748f,58.5938f, --222.656f,8.76416f,58.5938f, --218.75f,9.24425f,58.5938f, --214.844f,9.67654f,58.5938f, --210.938f,10.8063f,58.5938f, --207.031f,12.3237f,58.5938f, --203.125f,12.7409f,58.5938f, --199.219f,12.7587f,58.5938f, --195.313f,14.3653f,58.5938f, --191.406f,16.1467f,58.5938f, --187.5f,17.0489f,58.5938f, --183.594f,19.2091f,58.5938f, --179.688f,21.7856f,58.5938f, --175.781f,24.7829f,58.5938f, --171.875f,26.2396f,58.5938f, --167.969f,27.2756f,58.5938f, --164.063f,28.2919f,58.5938f, --160.156f,30.5945f,58.5938f, --156.25f,32.2617f,58.5938f, --152.344f,32.9049f,58.5938f, --148.438f,32.8002f,58.5938f, --144.531f,32.4751f,58.5938f, --140.625f,32.4049f,58.5938f, --136.719f,33.5631f,58.5938f, --132.813f,33.3828f,58.5938f, --128.906f,33.1064f,58.5938f, --125.0f,32.3054f,58.5938f, --121.094f,32.5047f,58.5938f, --117.188f,32.3246f,58.5938f, --113.281f,32.4393f,58.5938f, --109.375f,32.553f,58.5938f, --105.469f,32.9281f,58.5938f, --101.563f,31.8539f,58.5938f, --97.6563f,30.9253f,58.5938f, --93.75f,30.4328f,58.5938f, --89.8438f,28.3295f,58.5938f, --85.9375f,25.5393f,58.5938f, --82.0313f,23.0691f,58.5938f, --78.125f,21.505f,58.5938f, --74.2188f,21.0748f,58.5938f, --70.3125f,19.1186f,58.5938f, --66.4063f,16.7814f,58.5938f, --62.5f,15.2179f,58.5938f, --58.5938f,14.1291f,58.5938f, --54.6875f,13.2351f,58.5938f, --50.7813f,11.896f,58.5938f, --46.875f,11.0911f,58.5938f, --42.9688f,12.7485f,58.5938f, --39.0625f,13.7045f,58.5938f, --35.1563f,14.6128f,58.5938f, --31.25f,15.546f,58.5938f, --27.3438f,16.7828f,58.5938f, --23.4375f,18.7578f,58.5938f, --19.5313f,19.7951f,58.5938f, --15.625f,21.8594f,58.5938f, --11.7188f,22.7269f,58.5938f, --7.8125f,24.983f,58.5938f, --3.90625f,26.43f,58.5938f, -0.0f,27.4466f,58.5938f, -3.90625f,28.3495f,58.5938f, --250.0f,3.62748f,54.6875f, --246.094f,3.83329f,54.6875f, --242.188f,4.44022f,54.6875f, --238.281f,5.27514f,54.6875f, --234.375f,7.43995f,54.6875f, --230.469f,7.59176f,54.6875f, --226.563f,8.28985f,54.6875f, --222.656f,9.62184f,54.6875f, --218.75f,10.6613f,54.6875f, --214.844f,11.0914f,54.6875f, --210.938f,12.2186f,54.6875f, --207.031f,13.1985f,54.6875f, --203.125f,13.9982f,54.6875f, --199.219f,14.3187f,54.6875f, --195.313f,14.8791f,54.6875f, --191.406f,16.5829f,54.6875f, --187.5f,18.231f,54.6875f, --183.594f,20.0621f,54.6875f, --179.688f,22.8941f,54.6875f, --175.781f,25.0841f,54.6875f, --171.875f,26.5655f,54.6875f, --167.969f,27.3542f,54.6875f, --164.063f,29.2247f,54.6875f, --160.156f,30.91f,54.6875f, --156.25f,33.3376f,54.6875f, --152.344f,32.8808f,54.6875f, --148.438f,32.5783f,54.6875f, --144.531f,32.6138f,54.6875f, --140.625f,32.9002f,54.6875f, --136.719f,34.2312f,54.6875f, --132.813f,33.8335f,54.6875f, --128.906f,32.8545f,54.6875f, --125.0f,33.6683f,54.6875f, --121.094f,32.9953f,54.6875f, --117.188f,32.5096f,54.6875f, --113.281f,32.4307f,54.6875f, --109.375f,31.8214f,54.6875f, --105.469f,31.851f,54.6875f, --101.563f,31.6383f,54.6875f, --97.6563f,30.4359f,54.6875f, --93.75f,28.9306f,54.6875f, --89.8438f,26.5955f,54.6875f, --85.9375f,24.7234f,54.6875f, --82.0313f,23.0595f,54.6875f, --78.125f,21.3558f,54.6875f, --74.2188f,20.3788f,54.6875f, --70.3125f,19.3201f,54.6875f, --66.4063f,16.9597f,54.6875f, --62.5f,14.6652f,54.6875f, --58.5938f,14.4899f,54.6875f, --54.6875f,13.3432f,54.6875f, --50.7813f,12.3286f,54.6875f, --46.875f,12.6498f,54.6875f, --42.9688f,14.2651f,54.6875f, --39.0625f,15.6887f,54.6875f, --35.1563f,16.2038f,54.6875f, --31.25f,17.2337f,54.6875f, --27.3438f,18.7628f,54.6875f, --23.4375f,20.2472f,54.6875f, --19.5313f,21.6809f,54.6875f, --15.625f,24.084f,54.6875f, --11.7188f,25.1582f,54.6875f, --7.8125f,26.7f,54.6875f, --3.90625f,27.5421f,54.6875f, -0.0f,28.3244f,54.6875f, -3.90625f,29.2057f,54.6875f, --250.0f,3.74657f,50.7813f, --246.094f,3.89172f,50.7813f, --242.188f,4.12295f,50.7813f, --238.281f,5.16915f,50.7813f, --234.375f,6.30394f,50.7813f, --230.469f,7.21975f,50.7813f, --226.563f,8.61249f,50.7813f, --222.656f,10.1295f,50.7813f, --218.75f,12.2813f,50.7813f, --214.844f,12.3309f,50.7813f, --210.938f,13.3907f,50.7813f, --207.031f,14.1528f,50.7813f, --203.125f,14.0334f,50.7813f, --199.219f,14.814f,50.7813f, --195.313f,16.69f,50.7813f, --191.406f,17.639f,50.7813f, --187.5f,19.261f,50.7813f, --183.594f,20.748f,50.7813f, --179.688f,23.3343f,50.7813f, --175.781f,25.4837f,50.7813f, --171.875f,26.8456f,50.7813f, --167.969f,27.7788f,50.7813f, --164.063f,30.0174f,50.7813f, --160.156f,31.0689f,50.7813f, --156.25f,32.5898f,50.7813f, --152.344f,32.5672f,50.7813f, --148.438f,32.4654f,50.7813f, --144.531f,33.702f,50.7813f, --140.625f,34.7593f,50.7813f, --136.719f,33.9086f,50.7813f, --132.813f,33.681f,50.7813f, --128.906f,33.6369f,50.7813f, --125.0f,34.0371f,50.7813f, --121.094f,34.0479f,50.7813f, --117.188f,34.513f,50.7813f, --113.281f,33.7072f,50.7813f, --109.375f,32.2763f,50.7813f, --105.469f,32.0608f,50.7813f, --101.563f,31.0833f,50.7813f, --97.6563f,29.9168f,50.7813f, --93.75f,28.7604f,50.7813f, --89.8438f,26.9563f,50.7813f, --85.9375f,24.7908f,50.7813f, --82.0313f,23.7925f,50.7813f, --78.125f,21.7037f,50.7813f, --74.2188f,19.5308f,50.7813f, --70.3125f,19.3367f,50.7813f, --66.4063f,17.8482f,50.7813f, --62.5f,14.2491f,50.7813f, --58.5938f,14.7414f,50.7813f, --54.6875f,14.0395f,50.7813f, --50.7813f,12.9738f,50.7813f, --46.875f,13.9471f,50.7813f, --42.9688f,15.8319f,50.7813f, --39.0625f,16.6566f,50.7813f, --35.1563f,17.1252f,50.7813f, --31.25f,18.6998f,50.7813f, --27.3438f,20.877f,50.7813f, --23.4375f,22.0249f,50.7813f, --19.5313f,22.9369f,50.7813f, --15.625f,25.686f,50.7813f, --11.7188f,26.1758f,50.7813f, --7.8125f,28.3828f,50.7813f, --3.90625f,28.7973f,50.7813f, -0.0f,29.7276f,50.7813f, -3.90625f,30.4306f,50.7813f, --250.0f,3.69244f,46.875f, --246.094f,3.88583f,46.875f, --242.188f,3.98468f,46.875f, --238.281f,5.01772f,46.875f, --234.375f,7.23791f,46.875f, --230.469f,7.78117f,46.875f, --226.563f,8.55298f,46.875f, --222.656f,10.2684f,46.875f, --218.75f,11.1917f,46.875f, --214.844f,12.411f,46.875f, --210.938f,13.7214f,46.875f, --207.031f,14.4662f,46.875f, --203.125f,15.536f,46.875f, --199.219f,15.6035f,46.875f, --195.313f,16.8456f,46.875f, --191.406f,18.4656f,46.875f, --187.5f,19.415f,46.875f, --183.594f,20.8504f,46.875f, --179.688f,23.9388f,46.875f, --175.781f,26.2956f,46.875f, --171.875f,27.6728f,46.875f, --167.969f,28.2497f,46.875f, --164.063f,29.6503f,46.875f, --160.156f,31.9344f,46.875f, --156.25f,33.4163f,46.875f, --152.344f,33.428f,46.875f, --148.438f,33.3157f,46.875f, --144.531f,33.6261f,46.875f, --140.625f,35.1888f,46.875f, --136.719f,34.8434f,46.875f, --132.813f,34.1219f,46.875f, --128.906f,34.4564f,46.875f, --125.0f,34.9729f,46.875f, --121.094f,34.8811f,46.875f, --117.188f,35.185f,46.875f, --113.281f,34.138f,46.875f, --109.375f,32.7077f,46.875f, --105.469f,32.2219f,46.875f, --101.563f,31.2475f,46.875f, --97.6563f,29.9637f,46.875f, --93.75f,28.1214f,46.875f, --89.8438f,27.0889f,46.875f, --85.9375f,25.092f,46.875f, --82.0313f,23.3983f,46.875f, --78.125f,22.275f,46.875f, --74.2188f,19.8598f,46.875f, --70.3125f,18.8797f,46.875f, --66.4063f,17.2468f,46.875f, --62.5f,15.4985f,46.875f, --58.5938f,14.5357f,46.875f, --54.6875f,14.6964f,46.875f, --50.7813f,13.3496f,46.875f, --46.875f,15.6354f,46.875f, --42.9688f,16.7177f,46.875f, --39.0625f,17.4527f,46.875f, --35.1563f,18.2826f,46.875f, --31.25f,20.3293f,46.875f, --27.3438f,22.684f,46.875f, --23.4375f,23.538f,46.875f, --19.5313f,24.3046f,46.875f, --15.625f,26.1113f,46.875f, --11.7188f,27.4881f,46.875f, --7.8125f,29.3572f,46.875f, --3.90625f,29.786f,46.875f, -0.0f,30.3637f,46.875f, -3.90625f,30.8772f,46.875f, --250.0f,4.08083f,42.9688f, --246.094f,4.09778f,42.9688f, --242.188f,3.87631f,42.9688f, --238.281f,5.12214f,42.9688f, --234.375f,6.70993f,42.9688f, --230.469f,7.75806f,42.9688f, --226.563f,8.13676f,42.9688f, --222.656f,8.85151f,42.9688f, --218.75f,10.9378f,42.9688f, --214.844f,12.4043f,42.9688f, --210.938f,13.4636f,42.9688f, --207.031f,14.7352f,42.9688f, --203.125f,15.605f,42.9688f, --199.219f,15.7497f,42.9688f, --195.313f,17.184f,42.9688f, --191.406f,19.3679f,42.9688f, --187.5f,21.1701f,42.9688f, --183.594f,22.7204f,42.9688f, --179.688f,24.8128f,42.9688f, --175.781f,26.7707f,42.9688f, --171.875f,27.7521f,42.9688f, --167.969f,28.8689f,42.9688f, --164.063f,31.1205f,42.9688f, --160.156f,33.289f,42.9688f, --156.25f,34.2815f,42.9688f, --152.344f,33.9797f,42.9688f, --148.438f,34.2527f,42.9688f, --144.531f,34.1886f,42.9688f, --140.625f,34.868f,42.9688f, --136.719f,35.6569f,42.9688f, --132.813f,35.4999f,42.9688f, --128.906f,35.4373f,42.9688f, --125.0f,36.373f,42.9688f, --121.094f,35.4304f,42.9688f, --117.188f,34.3543f,42.9688f, --113.281f,35.0651f,42.9688f, --109.375f,33.5051f,42.9688f, --105.469f,32.471f,42.9688f, --101.563f,31.2764f,42.9688f, --97.6563f,29.7633f,42.9688f, --93.75f,27.9107f,42.9688f, --89.8438f,26.5273f,42.9688f, --85.9375f,25.2444f,42.9688f, --82.0313f,23.6093f,42.9688f, --78.125f,21.9684f,42.9688f, --74.2188f,19.4992f,42.9688f, --70.3125f,17.8231f,42.9688f, --66.4063f,17.4082f,42.9688f, --62.5f,17.0938f,42.9688f, --58.5938f,15.3348f,42.9688f, --54.6875f,14.7964f,42.9688f, --50.7813f,14.9948f,42.9688f, --46.875f,17.1807f,42.9688f, --42.9688f,18.118f,42.9688f, --39.0625f,19.0809f,42.9688f, --35.1563f,19.6971f,42.9688f, --31.25f,21.652f,42.9688f, --27.3438f,23.4343f,42.9688f, --23.4375f,24.5708f,42.9688f, --19.5313f,25.2003f,42.9688f, --15.625f,26.8391f,42.9688f, --11.7188f,28.9343f,42.9688f, --7.8125f,29.9079f,42.9688f, --3.90625f,31.268f,42.9688f, -0.0f,31.3916f,42.9688f, -3.90625f,31.8945f,42.9688f, --250.0f,4.27976f,39.0625f, --246.094f,4.20341f,39.0625f, --242.188f,3.80298f,39.0625f, --238.281f,4.79243f,39.0625f, --234.375f,5.51846f,39.0625f, --230.469f,6.91597f,39.0625f, --226.563f,8.25726f,39.0625f, --222.656f,8.85037f,39.0625f, --218.75f,9.57429f,39.0625f, --214.844f,11.3899f,39.0625f, --210.938f,12.5806f,39.0625f, --207.031f,14.2509f,39.0625f, --203.125f,14.7828f,39.0625f, --199.219f,15.9801f,39.0625f, --195.313f,17.4225f,39.0625f, --191.406f,19.6018f,39.0625f, --187.5f,22.1095f,39.0625f, --183.594f,23.8333f,39.0625f, --179.688f,25.0671f,39.0625f, --175.781f,27.1067f,39.0625f, --171.875f,28.5f,39.0625f, --167.969f,29.9625f,39.0625f, --164.063f,32.3895f,39.0625f, --160.156f,33.8224f,39.0625f, --156.25f,34.3349f,39.0625f, --152.344f,34.4661f,39.0625f, --148.438f,34.7236f,39.0625f, --144.531f,34.1129f,39.0625f, --140.625f,34.9033f,39.0625f, --136.719f,35.6229f,39.0625f, --132.813f,35.7143f,39.0625f, --128.906f,36.7151f,39.0625f, --125.0f,36.9574f,39.0625f, --121.094f,36.0729f,39.0625f, --117.188f,35.2171f,39.0625f, --113.281f,34.9343f,39.0625f, --109.375f,34.5707f,39.0625f, --105.469f,33.5046f,39.0625f, --101.563f,31.353f,39.0625f, --97.6563f,30.0283f,39.0625f, --93.75f,28.6272f,39.0625f, --89.8438f,26.4389f,39.0625f, --85.9375f,24.8159f,39.0625f, --82.0313f,23.0295f,39.0625f, --78.125f,21.1082f,39.0625f, --74.2188f,19.1239f,39.0625f, --70.3125f,18.0914f,39.0625f, --66.4063f,17.3227f,39.0625f, --62.5f,17.1022f,39.0625f, --58.5938f,16.4298f,39.0625f, --54.6875f,15.6704f,39.0625f, --50.7813f,16.5664f,39.0625f, --46.875f,18.478f,39.0625f, --42.9688f,19.4144f,39.0625f, --39.0625f,19.9351f,39.0625f, --35.1563f,20.3447f,39.0625f, --31.25f,22.4348f,39.0625f, --27.3438f,24.5713f,39.0625f, --23.4375f,25.5465f,39.0625f, --19.5313f,26.485f,39.0625f, --15.625f,28.292f,39.0625f, --11.7188f,30.0016f,39.0625f, --7.8125f,32.2532f,39.0625f, --3.90625f,33.6327f,39.0625f, -0.0f,33.835f,39.0625f, -3.90625f,34.9171f,39.0625f, --250.0f,3.91889f,35.1563f, --246.094f,3.38127f,35.1563f, --242.188f,3.26935f,35.1563f, --238.281f,4.06778f,35.1563f, --234.375f,4.87411f,35.1563f, --230.469f,6.48873f,35.1563f, --226.563f,7.17326f,35.1563f, --222.656f,8.21235f,35.1563f, --218.75f,8.21965f,35.1563f, --214.844f,10.417f,35.1563f, --210.938f,11.9497f,35.1563f, --207.031f,13.4145f,35.1563f, --203.125f,14.0876f,35.1563f, --199.219f,15.5077f,35.1563f, --195.313f,16.9011f,35.1563f, --191.406f,20.4395f,35.1563f, --187.5f,23.001f,35.1563f, --183.594f,24.0199f,35.1563f, --179.688f,25.7082f,35.1563f, --175.781f,27.3018f,35.1563f, --171.875f,28.9584f,35.1563f, --167.969f,31.1478f,35.1563f, --164.063f,32.8635f,35.1563f, --160.156f,33.5517f,35.1563f, --156.25f,34.5761f,35.1563f, --152.344f,34.5761f,35.1563f, --148.438f,34.2002f,35.1563f, --144.531f,34.7177f,35.1563f, --140.625f,35.5653f,35.1563f, --136.719f,35.7993f,35.1563f, --132.813f,37.1127f,35.1563f, --128.906f,37.2477f,35.1563f, --125.0f,36.8734f,35.1563f, --121.094f,35.4154f,35.1563f, --117.188f,34.8545f,35.1563f, --113.281f,35.4317f,35.1563f, --109.375f,34.9205f,35.1563f, --105.469f,33.5115f,35.1563f, --101.563f,32.2368f,35.1563f, --97.6563f,30.3601f,35.1563f, --93.75f,29.2913f,35.1563f, --89.8438f,27.4791f,35.1563f, --85.9375f,24.811f,35.1563f, --82.0313f,23.4984f,35.1563f, --78.125f,21.456f,35.1563f, --74.2188f,19.8992f,35.1563f, --70.3125f,17.7354f,35.1563f, --66.4063f,17.3066f,35.1563f, --62.5f,17.1745f,35.1563f, --58.5938f,16.5285f,35.1563f, --54.6875f,17.2826f,35.1563f, --50.7813f,18.6936f,35.1563f, --46.875f,19.4228f,35.1563f, --42.9688f,20.2022f,35.1563f, --39.0625f,21.4261f,35.1563f, --35.1563f,21.5779f,35.1563f, --31.25f,24.0097f,35.1563f, --27.3438f,25.4481f,35.1563f, --23.4375f,26.0036f,35.1563f, --19.5313f,27.4346f,35.1563f, --15.625f,30.2459f,35.1563f, --11.7188f,32.81f,35.1563f, --7.8125f,34.7924f,35.1563f, --3.90625f,35.8907f,35.1563f, -0.0f,36.9755f,35.1563f, -3.90625f,38.5427f,35.1563f, --250.0f,2.28536f,31.25f, --246.094f,1.63842f,31.25f, --242.188f,2.40273f,31.25f, --238.281f,3.19518f,31.25f, --234.375f,3.99394f,31.25f, --230.469f,4.99674f,31.25f, --226.563f,5.63235f,31.25f, --222.656f,6.86331f,31.25f, --218.75f,7.37515f,31.25f, --214.844f,9.34737f,31.25f, --210.938f,11.7034f,31.25f, --207.031f,13.4309f,31.25f, --203.125f,14.4474f,31.25f, --199.219f,15.8817f,31.25f, --195.313f,17.87f,31.25f, --191.406f,20.9938f,31.25f, --187.5f,23.5333f,31.25f, --183.594f,24.4107f,31.25f, --179.688f,26.0811f,31.25f, --175.781f,27.9797f,31.25f, --171.875f,29.4813f,31.25f, --167.969f,31.7071f,31.25f, --164.063f,33.0836f,31.25f, --160.156f,33.5998f,31.25f, --156.25f,33.5304f,31.25f, --152.344f,33.9929f,31.25f, --148.438f,35.4297f,31.25f, --144.531f,36.4531f,31.25f, --140.625f,35.9197f,31.25f, --136.719f,36.6849f,31.25f, --132.813f,37.8161f,31.25f, --128.906f,37.6166f,31.25f, --125.0f,36.9426f,31.25f, --121.094f,35.6388f,31.25f, --117.188f,35.0026f,31.25f, --113.281f,35.386f,31.25f, --109.375f,34.6287f,31.25f, --105.469f,33.8962f,31.25f, --101.563f,32.1844f,31.25f, --97.6563f,30.7868f,31.25f, --93.75f,29.267f,31.25f, --89.8438f,27.2585f,31.25f, --85.9375f,25.4236f,31.25f, --82.0313f,23.0281f,31.25f, --78.125f,21.4593f,31.25f, --74.2188f,19.4556f,31.25f, --70.3125f,18.0982f,31.25f, --66.4063f,17.1214f,31.25f, --62.5f,17.1751f,31.25f, --58.5938f,17.1429f,31.25f, --54.6875f,18.4434f,31.25f, --50.7813f,19.9422f,31.25f, --46.875f,21.2124f,31.25f, --42.9688f,21.2106f,31.25f, --39.0625f,22.1346f,31.25f, --35.1563f,23.3082f,31.25f, --31.25f,24.7044f,31.25f, --27.3438f,26.2688f,31.25f, --23.4375f,27.5692f,31.25f, --19.5313f,30.4099f,31.25f, --15.625f,33.0453f,31.25f, --11.7188f,34.9857f,31.25f, --7.8125f,37.0727f,31.25f, --3.90625f,39.2219f,31.25f, -0.0f,40.3658f,31.25f, -3.90625f,41.4381f,31.25f, --250.0f,0.4773f,27.3438f, --246.094f,0.631847f,27.3438f, --242.188f,1.21449f,27.3438f, --238.281f,1.52728f,27.3438f, --234.375f,2.73146f,27.3438f, --230.469f,3.65375f,27.3438f, --226.563f,5.03467f,27.3438f, --222.656f,6.27065f,27.3438f, --218.75f,7.56964f,27.3438f, --214.844f,9.63719f,27.3438f, --210.938f,11.4022f,27.3438f, --207.031f,12.7085f,27.3438f, --203.125f,14.3808f,27.3438f, --199.219f,15.9121f,27.3438f, --195.313f,17.8953f,27.3438f, --191.406f,20.8456f,27.3438f, --187.5f,22.7705f,27.3438f, --183.594f,24.5794f,27.3437f, --179.688f,27.055f,27.3438f, --175.781f,29.3548f,27.3437f, --171.875f,30.4534f,27.3438f, --167.969f,32.4366f,27.3437f, --164.063f,34.4967f,27.3438f, --160.156f,34.9614f,27.3437f, --156.25f,34.9405f,27.3438f, --152.344f,35.7165f,27.3437f, --148.438f,37.0387f,27.3438f, --144.531f,38.0934f,27.3437f, --140.625f,37.3872f,27.3438f, --136.719f,36.4336f,27.3437f, --132.813f,37.0365f,27.3438f, --128.906f,37.2591f,27.3437f, --125.0f,36.5502f,27.3438f, --121.094f,35.4814f,27.3437f, --117.188f,35.3267f,27.3438f, --113.281f,34.3757f,27.3437f, --109.375f,34.2455f,27.3438f, --105.469f,33.6851f,27.3437f, --101.563f,32.3527f,27.3438f, --97.6563f,30.111f,27.3437f, --93.75f,28.4912f,27.3438f, --89.8438f,27.0398f,27.3437f, --85.9375f,24.9699f,27.3438f, --82.0313f,22.9703f,27.3437f, --78.125f,21.7502f,27.3438f, --74.2188f,18.8537f,27.3438f, --70.3125f,18.2353f,27.3438f, --66.4063f,18.3708f,27.3438f, --62.5f,18.6738f,27.3438f, --58.5938f,18.5559f,27.3438f, --54.6875f,19.1603f,27.3438f, --50.7813f,20.8349f,27.3438f, --46.875f,21.6092f,27.3438f, --42.9688f,21.9317f,27.3437f, --39.0625f,23.0486f,27.3438f, --35.1563f,24.8675f,27.3437f, --31.25f,25.6906f,27.3438f, --27.3438f,27.9695f,27.3437f, --23.4375f,30.3105f,27.3438f, --19.5313f,33.9897f,27.3437f, --15.625f,35.6988f,27.3438f, --11.7188f,37.9213f,27.3437f, --7.8125f,40.1355f,27.3438f, --3.90625f,41.6062f,27.3437f, -0.0f,42.273f,27.3438f, -3.90625f,42.7334f,27.3437f, --250.0f,0.178144f,23.4375f, --246.094f,1.07943f,23.4375f, --242.188f,1.52473f,23.4375f, --238.281f,2.58652f,23.4375f, --234.375f,3.51451f,23.4375f, --230.469f,4.23103f,23.4375f, --226.563f,5.80506f,23.4375f, --222.656f,7.26086f,23.4375f, --218.75f,8.85201f,23.4375f, --214.844f,10.9029f,23.4375f, --210.938f,12.7138f,23.4375f, --207.031f,14.9249f,23.4375f, --203.125f,15.6506f,23.4375f, --199.219f,16.529f,23.4375f, --195.313f,17.1535f,23.4375f, --191.406f,20.5632f,23.4375f, --187.5f,23.1009f,23.4375f, --183.594f,24.7859f,23.4375f, --179.688f,26.8635f,23.4375f, --175.781f,28.5723f,23.4375f, --171.875f,30.2918f,23.4375f, --167.969f,32.7768f,23.4375f, --164.063f,34.6199f,23.4375f, --160.156f,35.6902f,23.4375f, --156.25f,37.1166f,23.4375f, --152.344f,37.0816f,23.4375f, --148.438f,37.9995f,23.4375f, --144.531f,38.687f,23.4375f, --140.625f,37.9261f,23.4375f, --136.719f,36.7476f,23.4375f, --132.813f,37.1839f,23.4375f, --128.906f,36.8682f,23.4375f, --125.0f,36.2555f,23.4375f, --121.094f,34.8461f,23.4375f, --117.188f,34.5757f,23.4375f, --113.281f,33.8965f,23.4375f, --109.375f,33.4987f,23.4375f, --105.469f,33.02f,23.4375f, --101.563f,31.4543f,23.4375f, --97.6563f,29.5899f,23.4375f, --93.75f,27.8808f,23.4375f, --89.8438f,26.4886f,23.4375f, --85.9375f,24.5413f,23.4375f, --82.0313f,22.6097f,23.4375f, --78.125f,21.38f,23.4375f, --74.2188f,19.2574f,23.4375f, --70.3125f,19.6862f,23.4375f, --66.4063f,19.3283f,23.4375f, --62.5f,20.3608f,23.4375f, --58.5938f,20.9969f,23.4375f, --54.6875f,20.5645f,23.4375f, --50.7813f,21.6338f,23.4375f, --46.875f,22.0705f,23.4375f, --42.9688f,23.2924f,23.4375f, --39.0625f,24.8627f,23.4375f, --35.1563f,25.9292f,23.4375f, --31.25f,27.2133f,23.4375f, --27.3438f,29.7296f,23.4375f, --23.4375f,32.8149f,23.4375f, --19.5313f,35.5321f,23.4375f, --15.625f,38.2144f,23.4375f, --11.7188f,40.2421f,23.4375f, --7.8125f,41.7479f,23.4375f, --3.90625f,43.372f,23.4375f, -0.0f,43.7526f,23.4375f, -3.90625f,44.6783f,23.4375f, --250.0f,0.138221f,19.5313f, --246.094f,1.4004f,19.5313f, --242.188f,3.26515f,19.5313f, --238.281f,3.65276f,19.5313f, --234.375f,4.90602f,19.5313f, --230.469f,6.03349f,19.5313f, --226.563f,7.99773f,19.5313f, --222.656f,9.41728f,19.5313f, --218.75f,10.0435f,19.5313f, --214.844f,12.1613f,19.5313f, --210.938f,13.6999f,19.5313f, --207.031f,15.7603f,19.5313f, --203.125f,16.1549f,19.5313f, --199.219f,17.1021f,19.5313f, --195.313f,18.1867f,19.5313f, --191.406f,20.6836f,19.5313f, --187.5f,23.0865f,19.5312f, --183.594f,24.3015f,19.5313f, --179.688f,26.6623f,19.5312f, --175.781f,28.232f,19.5313f, --171.875f,30.6454f,19.5312f, --167.969f,32.8674f,19.5313f, --164.063f,35.0881f,19.5312f, --160.156f,37.2715f,19.5313f, --156.25f,38.6025f,19.5312f, --152.344f,38.2781f,19.5313f, --148.438f,38.4813f,19.5312f, --144.531f,38.3281f,19.5313f, --140.625f,38.1441f,19.5312f, --136.719f,37.6066f,19.5312f, --132.813f,37.2097f,19.5312f, --128.906f,36.5694f,19.5312f, --125.0f,36.2416f,19.5312f, --121.094f,34.5305f,19.5312f, --117.188f,33.3684f,19.5312f, --113.281f,32.7805f,19.5312f, --109.375f,31.8563f,19.5312f, --105.469f,31.3398f,19.5312f, --101.563f,29.7387f,19.5312f, --97.6563f,28.7121f,19.5312f, --93.75f,27.8904f,19.5312f, --89.8438f,26.0256f,19.5312f, --85.9375f,24.5469f,19.5312f, --82.0313f,23.3531f,19.5312f, --78.125f,21.4621f,19.5313f, --74.2188f,20.3507f,19.5313f, --70.3125f,20.1879f,19.5313f, --66.4063f,20.9838f,19.5313f, --62.5f,22.229f,19.5312f, --58.5938f,22.355f,19.5312f, --54.6875f,22.7659f,19.5312f, --50.7813f,22.9258f,19.5312f, --46.875f,23.554f,19.5312f, --42.9688f,24.3861f,19.5312f, --39.0625f,25.5112f,19.5312f, --35.1563f,26.8691f,19.5312f, --31.25f,28.968f,19.5312f, --27.3438f,31.0124f,19.5312f, --23.4375f,34.8357f,19.5312f, --19.5313f,37.2362f,19.5312f, --15.625f,39.5924f,19.5312f, --11.7188f,41.5691f,19.5312f, --7.8125f,43.2441f,19.5312f, --3.90625f,45.1168f,19.5312f, -0.0f,45.7555f,19.5312f, -3.90625f,46.9055f,19.5312f, --250.0f,0.462936f,15.625f, --246.094f,2.15489f,15.625f, --242.188f,3.69232f,15.625f, --238.281f,4.89361f,15.625f, --234.375f,6.95706f,15.625f, --230.469f,8.37916f,15.625f, --226.563f,9.21515f,15.625f, --222.656f,10.0624f,15.625f, --218.75f,11.6477f,15.625f, --214.844f,13.257f,15.625f, --210.938f,14.8699f,15.625f, --207.031f,15.9852f,15.625f, --203.125f,17.025f,15.625f, --199.219f,17.8511f,15.625f, --195.313f,20.3581f,15.625f, --191.406f,22.0829f,15.625f, --187.5f,24.4216f,15.625f, --183.594f,25.5625f,15.625f, --179.688f,27.0961f,15.625f, --175.781f,30.0958f,15.625f, --171.875f,31.7977f,15.625f, --167.969f,34.7043f,15.625f, --164.063f,37.1655f,15.625f, --160.156f,37.6823f,15.625f, --156.25f,37.6204f,15.625f, --152.344f,37.8037f,15.625f, --148.438f,37.8555f,15.625f, --144.531f,37.9638f,15.625f, --140.625f,37.4821f,15.625f, --136.719f,37.0202f,15.625f, --132.813f,36.4604f,15.625f, --128.906f,36.1575f,15.625f, --125.0f,35.4218f,15.625f, --121.094f,33.5202f,15.625f, --117.188f,32.116f,15.625f, --113.281f,30.9352f,15.625f, --109.375f,29.8297f,15.625f, --105.469f,29.9146f,15.625f, --101.563f,28.7245f,15.625f, --97.6563f,27.7205f,15.625f, --93.75f,27.4217f,15.625f, --89.8438f,25.8557f,15.625f, --85.9375f,24.0609f,15.625f, --82.0313f,22.7869f,15.625f, --78.125f,20.4923f,15.625f, --74.2188f,21.0025f,15.625f, --70.3125f,21.2985f,15.625f, --66.4063f,22.5717f,15.625f, --62.5f,23.0569f,15.625f, --58.5938f,23.2123f,15.625f, --54.6875f,24.1861f,15.625f, --50.7813f,24.5626f,15.625f, --46.875f,25.1259f,15.625f, --42.9688f,25.9995f,15.625f, --39.0625f,26.8682f,15.625f, --35.1563f,27.8593f,15.625f, --31.25f,29.8924f,15.625f, --27.3438f,32.8894f,15.625f, --23.4375f,36.2901f,15.625f, --19.5313f,38.2475f,15.625f, --15.625f,40.593f,15.625f, --11.7188f,42.2973f,15.625f, --7.8125f,45.3308f,15.625f, --3.90625f,47.345f,15.625f, -0.0f,48.9808f,15.625f, -3.90625f,49.2295f,15.625f, --250.0f,1.16646f,11.7188f, --246.094f,2.99331f,11.7188f, --242.188f,4.37829f,11.7188f, --238.281f,5.21593f,11.7188f, --234.375f,6.84374f,11.7188f, --230.469f,8.34616f,11.7188f, --226.563f,9.2826f,11.7188f, --222.656f,9.90104f,11.7188f, --218.75f,10.9211f,11.7187f, --214.844f,13.6881f,11.7187f, --210.938f,15.7745f,11.7187f, --207.031f,16.2325f,11.7187f, --203.125f,17.2525f,11.7187f, --199.219f,19.1108f,11.7187f, --195.313f,21.4743f,11.7187f, --191.406f,24.021f,11.7187f, --187.5f,25.8676f,11.7187f, --183.594f,27.021f,11.7187f, --179.688f,28.254f,11.7187f, --175.781f,31.6036f,11.7187f, --171.875f,32.629f,11.7187f, --167.969f,34.9526f,11.7187f, --164.063f,36.8236f,11.7187f, --160.156f,37.152f,11.7187f, --156.25f,37.6659f,11.7187f, --152.344f,37.4102f,11.7187f, --148.438f,37.0806f,11.7187f, --144.531f,37.6299f,11.7187f, --140.625f,36.7269f,11.7187f, --136.719f,36.4841f,11.7187f, --132.813f,35.2557f,11.7187f, --128.906f,34.7066f,11.7187f, --125.0f,34.0947f,11.7187f, --121.094f,32.7343f,11.7187f, --117.188f,31.5605f,11.7187f, --113.281f,30.7492f,11.7187f, --109.375f,30.1608f,11.7187f, --105.469f,29.9144f,11.7187f, --101.563f,28.5532f,11.7187f, --97.6563f,26.2051f,11.7187f, --93.75f,26.0432f,11.7187f, --89.8438f,25.1831f,11.7187f, --85.9375f,23.7935f,11.7187f, --82.0313f,22.6952f,11.7187f, --78.125f,21.9812f,11.7187f, --74.2188f,22.3423f,11.7187f, --70.3125f,22.4959f,11.7187f, --66.4063f,22.9438f,11.7187f, --62.5f,23.6591f,11.7187f, --58.5938f,24.1634f,11.7187f, --54.6875f,24.8781f,11.7187f, --50.7813f,25.3471f,11.7187f, --46.875f,25.7599f,11.7187f, --42.9688f,26.61f,11.7187f, --39.0625f,27.5033f,11.7187f, --35.1563f,29.2751f,11.7187f, --31.25f,31.9147f,11.7187f, --27.3438f,34.1964f,11.7187f, --23.4375f,36.7734f,11.7187f, --19.5313f,39.2441f,11.7187f, --15.625f,41.3269f,11.7187f, --11.7188f,44.2682f,11.7187f, --7.8125f,47.2458f,11.7187f, --3.90625f,49.2199f,11.7187f, -0.0f,50.2546f,11.7187f, -3.90625f,51.1233f,11.7187f, --250.0f,1.52698f,7.8125f, --246.094f,2.97227f,7.8125f, --242.188f,3.77319f,7.8125f, --238.281f,4.81095f,7.8125f, --234.375f,5.94458f,7.8125f, --230.469f,7.45352f,7.8125f, --226.563f,8.9683f,7.8125f, --222.656f,9.37348f,7.8125f, --218.75f,10.3818f,7.8125f, --214.844f,13.0632f,7.8125f, --210.938f,15.5836f,7.8125f, --207.031f,17.1532f,7.8125f, --203.125f,19.3065f,7.8125f, --199.219f,21.746f,7.8125f, --195.313f,23.0026f,7.8125f, --191.406f,25.1876f,7.8125f, --187.5f,27.4911f,7.8125f, --183.594f,28.651f,7.8125f, --179.688f,28.9685f,7.8125f, --175.781f,31.1275f,7.8125f, --171.875f,32.457f,7.8125f, --167.969f,34.4336f,7.8125f, --164.063f,35.9124f,7.8125f, --160.156f,36.5078f,7.8125f, --156.25f,36.9999f,7.8125f, --152.344f,36.9517f,7.8125f, --148.438f,37.9713f,7.8125f, --144.531f,37.929f,7.8125f, --140.625f,37.5334f,7.8125f, --136.719f,36.2798f,7.8125f, --132.813f,35.1904f,7.8125f, --128.906f,33.7356f,7.8125f, --125.0f,34.0968f,7.8125f, --121.094f,33.5838f,7.8125f, --117.188f,32.9371f,7.8125f, --113.281f,32.0353f,7.8125f, --109.375f,31.4623f,7.8125f, --105.469f,30.5184f,7.8125f, --101.563f,28.7396f,7.8125f, --97.6563f,27.2715f,7.8125f, --93.75f,26.1242f,7.8125f, --89.8438f,24.5691f,7.8125f, --85.9375f,23.931f,7.8125f, --82.0313f,23.7643f,7.8125f, --78.125f,22.4588f,7.8125f, --74.2188f,22.5395f,7.8125f, --70.3125f,22.9322f,7.8125f, --66.4063f,23.4361f,7.8125f, --62.5f,24.2733f,7.8125f, --58.5938f,24.1873f,7.8125f, --54.6875f,24.2666f,7.8125f, --50.7813f,25.2522f,7.8125f, --46.875f,26.3494f,7.8125f, --42.9688f,26.8365f,7.8125f, --39.0625f,27.5515f,7.8125f, --35.1563f,30.4441f,7.8125f, --31.25f,33.5547f,7.8125f, --27.3438f,36.1409f,7.8125f, --23.4375f,38.1103f,7.8125f, --19.5313f,39.8171f,7.8125f, --15.625f,42.1146f,7.8125f, --11.7188f,45.3603f,7.8125f, --7.8125f,47.6602f,7.8125f, --3.90625f,49.963f,7.8125f, -0.0f,51.8119f,7.8125f, -3.90625f,52.2527f,7.8125f, --250.0f,0.139875f,3.90625f, --246.094f,1.72995f,3.90625f, --242.188f,2.60122f,3.90625f, --238.281f,4.01346f,3.90625f, --234.375f,5.13654f,3.90625f, --230.469f,6.69665f,3.90625f, --226.563f,8.43203f,3.90625f, --222.656f,9.83442f,3.90625f, --218.75f,11.3645f,3.90625f, --214.844f,14.222f,3.90625f, --210.938f,16.1758f,3.90625f, --207.031f,18.9127f,3.90625f, --203.125f,21.2478f,3.90625f, --199.219f,23.0589f,3.90625f, --195.313f,24.6025f,3.90625f, --191.406f,25.8143f,3.90625f, --187.5f,27.5696f,3.90625f, --183.594f,29.2176f,3.90625f, --179.688f,29.6835f,3.90625f, --175.781f,30.7416f,3.90625f, --171.875f,31.4405f,3.90625f, --167.969f,33.0831f,3.90625f, --164.063f,34.6225f,3.90625f, --160.156f,35.4992f,3.90625f, --156.25f,37.4126f,3.90625f, --152.344f,38.453f,3.90625f, --148.438f,38.9974f,3.90625f, --144.531f,38.7871f,3.90625f, --140.625f,37.6021f,3.90625f, --136.719f,36.1797f,3.90625f, --132.813f,34.9906f,3.90625f, --128.906f,34.1304f,3.90625f, --125.0f,34.3517f,3.90625f, --121.094f,33.6612f,3.90625f, --117.188f,32.7047f,3.90625f, --113.281f,32.3958f,3.90625f, --109.375f,31.0818f,3.90625f, --105.469f,30.9536f,3.90625f, --101.563f,29.8205f,3.90625f, --97.6563f,28.4796f,3.90625f, --93.75f,27.6494f,3.90625f, --89.8438f,25.5721f,3.90625f, --85.9375f,24.227f,3.90625f, --82.0313f,23.2611f,3.90625f, --78.125f,22.4589f,3.90625f, --74.2188f,23.2261f,3.90625f, --70.3125f,23.5025f,3.90625f, --66.4063f,23.6913f,3.90625f, --62.5f,24.6785f,3.90625f, --58.5938f,25.4946f,3.90625f, --54.6875f,25.9722f,3.90625f, --50.7813f,26.1977f,3.90625f, --46.875f,26.8539f,3.90625f, --42.9688f,27.7268f,3.90625f, --39.0625f,29.2046f,3.90625f, --35.1563f,31.79f,3.90625f, --31.25f,34.2658f,3.90625f, --27.3438f,35.9914f,3.90625f, --23.4375f,38.3776f,3.90625f, --19.5313f,39.8852f,3.90625f, --15.625f,43.1455f,3.90625f, --11.7188f,45.5059f,3.90625f, --7.8125f,47.4257f,3.90625f, --3.90625f,49.9032f,3.90625f, -0.0f,52.0322f,3.90625f, -3.90625f,52.6186f,3.90625f, -}; - -btScalar Landscape02Nml[] = { -0.376889f,0.897995f,0.227068f, -0.251083f,0.961355f,0.112931f, -0.256071f,0.961946f,0.0953332f, -0.188246f,0.981544f,0.0336933f, -0.321782f,0.946812f,0.00191405f, -0.277829f,0.960055f,0.0332431f, -0.366908f,0.922321f,-0.121252f, -0.346681f,0.936118f,-0.0591191f, -0.34598f,0.936023f,-0.0644918f, -0.326882f,0.934733f,-0.139364f, -0.195537f,0.979014f,-0.0574119f, -0.208421f,0.974173f,-0.0868766f, -0.220158f,0.96963f,-0.106528f, -0.21764f,0.974169f,-0.0602246f, -0.194781f,0.966032f,-0.169831f, -0.137923f,0.97923f,-0.148611f, --0.0890295f,0.968844f,-0.231118f, --0.164208f,0.952108f,-0.257926f, --0.299547f,0.905883f,-0.299413f, --0.331781f,0.892916f,-0.304338f, --0.275234f,0.921181f,-0.275086f, --0.190055f,0.968186f,-0.162776f, --0.191147f,0.964101f,-0.184313f, --0.167051f,0.973656f,-0.155201f, --0.260549f,0.956867f,-0.128527f, --0.236175f,0.968373f,-0.080466f, --0.305083f,0.942279f,-0.137969f, --0.32302f,0.940678f,-0.103844f, --0.376654f,0.91108f,-0.167524f, --0.43665f,0.882087f,-0.176802f, --0.404697f,0.87224f,-0.274621f, --0.461396f,0.842558f,-0.277868f, --0.340534f,0.861872f,-0.375783f, --0.381498f,0.847049f,-0.370091f, --0.349262f,0.83292f,-0.429255f, --0.383821f,0.842401f,-0.378209f, --0.350717f,0.827302f,-0.438826f, --0.312636f,0.886963f,-0.339934f, --0.202637f,0.921293f,-0.331899f, --0.164853f,0.917655f,-0.361571f, --0.320762f,0.929092f,-0.184116f, --0.291289f,0.89543f,-0.336684f, --0.523923f,0.850919f,-0.0379686f, --0.415222f,0.907809f,-0.0589323f, --0.464751f,0.884928f,0.030152f, --0.464228f,0.885715f,0.00114487f, --0.460666f,0.887573f,-0.00119475f, --0.527574f,0.824073f,-0.206324f, --0.569463f,0.819886f,-0.0591577f, --0.624043f,0.739025f,-0.253797f, --0.677912f,0.708815f,-0.19498f, --0.654991f,0.737431f,-0.164874f, --0.612102f,0.778841f,-0.136883f, --0.555251f,0.829082f,-0.0657209f, --0.466796f,0.884362f,-0.00238444f, --0.393172f,0.917844f,0.0545768f, --0.415266f,0.902781f,0.111985f, --0.346174f,0.92512f,0.155936f, --0.270143f,0.942251f,0.197955f, --0.242693f,0.931939f,0.269424f, --0.146828f,0.979561f,0.137484f, --0.151815f,0.949716f,0.273847f, --0.23746f,0.962635f,0.130183f, --0.242269f,0.936807f,0.252385f, --0.439066f,0.897439f,0.0427119f, --0.506925f,0.859633f,0.0637107f, --0.369534f,0.927612f,0.0545955f, --0.266432f,0.921234f,0.283447f, --0.0849634f,0.983229f,0.161377f, --0.142422f,0.97399f,0.176238f, -0.059987f,0.992193f,0.109333f, --0.00609097f,0.990503f,0.137353f, -0.218751f,0.975042f,-0.0379662f, -0.195675f,0.973574f,0.117747f, -0.412438f,0.903178f,-0.119012f, -0.389829f,0.920771f,0.01463f, -0.471887f,0.878868f,-0.0700914f, -0.512637f,0.843878f,0.158344f, -0.438398f,0.898776f,-0.0028899f, -0.463505f,0.872879f,0.152466f, -0.213581f,0.96879f,0.125817f, -0.217949f,0.966902f,0.132661f, -0.150053f,0.978231f,0.143348f, -0.183142f,0.954792f,0.234161f, -0.324547f,0.937949f,0.122152f, -0.305949f,0.944044f,0.123194f, -0.404781f,0.90011f,0.161105f, -0.386685f,0.917163f,0.0963685f, -0.43511f,0.894378f,0.103764f, -0.444378f,0.884165f,0.144156f, -0.485066f,0.871945f,0.0665013f, -0.480511f,0.864609f,0.146835f, -0.542329f,0.83784f,0.0624783f, -0.538258f,0.834152f,0.120286f, -0.497652f,0.86488f,0.0657686f, -0.471897f,0.881288f,0.0253797f, -0.368509f,0.927548f,0.0620863f, -0.391828f,0.918428f,0.0544149f, -0.284879f,0.953389f,0.0994662f, -0.359932f,0.902669f,0.235877f, -0.19297f,0.969614f,0.150374f, -0.198191f,0.923716f,0.327825f, -0.174784f,0.978101f,0.113003f, -0.121688f,0.95783f,0.260297f, -0.3291f,0.939598f,0.094074f, -0.241925f,0.967997f,0.066744f, -0.275982f,0.959352f,0.0589789f, -0.207349f,0.969048f,-0.133986f, --0.048418f,0.997403f,0.0533214f, --0.0214229f,0.995947f,-0.0873486f, --0.224808f,0.97209f,0.0671032f, --0.154526f,0.98721f,0.0392114f, --0.0539424f,0.990401f,0.127262f, -0.0294265f,0.986864f,0.158851f, -0.115045f,0.967726f,0.224212f, -0.135755f,0.967813f,0.211917f, --0.0987201f,0.976534f,0.191406f, --0.208734f,0.974954f,0.0767793f, --0.346094f,0.938088f,0.0144628f, --0.364883f,0.930977f,0.0119327f, --0.234075f,0.972082f,0.0162811f, --0.216489f,0.973875f,0.0685516f, --0.126585f,0.991898f,0.0107448f, --0.188432f,0.981937f,-0.0171439f, --0.186728f,0.980312f,-0.0641921f, --0.243763f,0.959118f,-0.14378f, --0.256453f,0.962392f,-0.0896326f, --0.227009f,0.972481f,-0.0524148f, --0.308642f,0.945388f,-0.104794f, --0.322884f,0.94242f,-0.0871231f, --0.32494f,0.940988f,-0.0946312f, --0.365791f,0.920972f,-0.134189f, -0.507209f,0.830952f,0.228598f, -0.427157f,0.893788f,0.136676f, -0.390358f,0.920644f,0.00595094f, -0.357f,0.931227f,0.0732586f, -0.253669f,0.95455f,0.156478f, -0.247974f,0.954291f,0.166849f, -0.303694f,0.950352f,0.0678299f, -0.260247f,0.965246f,0.0238949f, --0.0615746f,0.996768f,-0.0515863f, --0.225111f,0.970921f,-0.0814727f, --0.33579f,0.924057f,-0.18266f, --0.286567f,0.949099f,-0.13073f, --0.266283f,0.957101f,-0.114241f, --0.297972f,0.942451f,-0.151651f, --0.345158f,0.930403f,-0.123358f, --0.323606f,0.933615f,-0.153759f, --0.295216f,0.935234f,-0.195409f, --0.294262f,0.935546f,-0.195355f, --0.367877f,0.896699f,-0.246165f, --0.460611f,0.856308f,-0.233612f, --0.493615f,0.869663f,0.00556421f, --0.56572f,0.819247f,0.0937815f, --0.482796f,0.868728f,0.110547f, --0.473443f,0.870107f,0.136985f, --0.486628f,0.863931f,0.12968f, --0.584612f,0.809918f,-0.0475519f, --0.673803f,0.720247f,-0.165027f, --0.584438f,0.811258f,-0.0171189f, --0.49626f,0.855798f,0.146063f, --0.266763f,0.927018f,0.26358f, --0.000318467f,0.974136f,0.225963f, --0.2098f,0.977621f,0.015525f, --0.363964f,0.929076f,-0.0659462f, --0.427799f,0.890708f,-0.153708f, --0.226888f,0.973494f,-0.0288381f, -0.176474f,0.981f,0.080593f, -0.382766f,0.920418f,-0.0794987f, -0.4558f,0.874041f,-0.16822f, -0.44168f,0.87342f,-0.205075f, -0.269141f,0.944688f,-0.187422f, -0.0983269f,0.994746f,0.0285051f, -0.164874f,0.980231f,0.10938f, -0.300398f,0.949423f,0.0914149f, -0.370498f,0.925363f,0.0802133f, -0.51325f,0.857062f,0.0449297f, -0.515688f,0.85628f,-0.0291725f, -0.532902f,0.845818f,-0.0246416f, -0.470584f,0.882352f,0.00224652f, -0.358364f,0.932053f,0.0534101f, -0.299916f,0.948938f,0.0978121f, -0.234125f,0.96956f,0.0716857f, -0.201429f,0.97943f,0.0119968f, -0.257021f,0.965839f,0.0330825f, -0.205585f,0.966488f,0.153741f, --0.0291083f,0.972977f,0.22906f, --0.183781f,0.97216f,0.145362f, --0.0880966f,0.991634f,0.0943445f, -0.0404056f,0.991359f,0.124796f, --0.0259416f,0.986408f,0.162256f, --0.213262f,0.97241f,0.0945471f, --0.221976f,0.974645f,0.0281856f, --0.137418f,0.990413f,0.014064f, --0.147111f,0.988464f,0.0360112f, --0.213681f,0.97687f,0.00813376f, --0.286716f,0.957516f,-0.0309366f, --0.362687f,0.929548f,-0.0663186f, -0.471826f,0.881687f,0.00273101f, -0.493844f,0.862721f,0.108764f, -0.305852f,0.940961f,0.145073f, -0.225186f,0.91763f,0.327484f, -0.255894f,0.905552f,0.33837f, -0.302798f,0.922674f,0.238719f, -0.353759f,0.914443f,0.196594f, -0.301669f,0.941039f,0.153105f, -0.00675732f,0.993813f,0.110864f, --0.180673f,0.978312f,0.101302f, --0.247784f,0.966857f,0.0615767f, --0.309703f,0.949482f,-0.0506691f, --0.243038f,0.969623f,-0.0276337f, --0.257234f,0.966017f,-0.0253295f, --0.381367f,0.920413f,-0.0860151f, --0.354157f,0.93479f,-0.027217f, --0.299485f,0.952671f,0.0522246f, --0.356888f,0.9323f,0.0587106f, --0.335176f,0.924244f,0.182839f, --0.500593f,0.855036f,0.135351f, --0.576428f,0.801243f,0.160441f, --0.583679f,0.788168f,0.195218f, --0.491918f,0.829821f,0.263465f, --0.431671f,0.862042f,0.2656f, --0.443518f,0.883408f,0.151265f, --0.464317f,0.881859f,0.0820666f, --0.652068f,0.753609f,-0.0829502f, --0.681939f,0.728217f,-0.068254f, --0.591161f,0.804152f,0.0621953f, --0.352647f,0.921747f,0.161318f, -0.0545396f,0.95959f,0.276065f, -0.0694942f,0.971972f,0.224591f, --0.253858f,0.964902f,-0.0672354f, --0.408551f,0.900688f,-0.147807f, --0.327666f,0.933936f,-0.142825f, -0.129878f,0.985787f,-0.106564f, -0.442239f,0.89421f,-0.0693695f, -0.506959f,0.860716f,-0.0464834f, -0.440087f,0.895465f,-0.0668225f, -0.226441f,0.974021f,0.00265329f, --0.0272959f,0.999596f,0.00787303f, -0.0903893f,0.995643f,0.0228958f, -0.359925f,0.931179f,0.0579615f, -0.431266f,0.899788f,-0.0662666f, -0.53735f,0.839722f,-0.0782406f, -0.525898f,0.846474f,-0.0831443f, -0.503404f,0.859213f,-0.0913118f, -0.450901f,0.892319f,-0.0213084f, -0.278054f,0.959353f,0.048252f, -0.254295f,0.953824f,0.159853f, -0.246692f,0.953779f,0.171608f, -0.237766f,0.960301f,0.145908f, -0.249319f,0.965473f,0.0755121f, -0.140552f,0.989905f,0.0182753f, --0.0589195f,0.996842f,0.0532477f, --0.101426f,0.988847f,0.109061f, --0.043669f,0.99706f,0.0629708f, -0.0474685f,0.998853f,-0.0063145f, --0.0867729f,0.996136f,-0.0135299f, --0.196161f,0.972844f,0.12286f, --0.192413f,0.974994f,0.111196f, --0.123107f,0.990318f,0.0641543f, --0.164426f,0.985628f,0.0387435f, --0.213922f,0.974633f,0.0657922f, --0.241049f,0.968373f,0.0644173f, --0.307154f,0.951627f,-0.00792363f, -0.280771f,0.958227f,-0.0544817f, -0.299035f,0.949091f,0.0990176f, -0.225174f,0.937279f,0.266091f, -0.201765f,0.945847f,0.254291f, -0.341377f,0.920786f,0.18872f, -0.3743f,0.913661f,0.158502f, -0.359138f,0.923211f,0.136755f, -0.36518f,0.919296f,0.146759f, -0.0046348f,0.996002f,0.0892048f, --0.241229f,0.954179f,0.177061f, --0.158349f,0.951157f,0.265002f, --0.207545f,0.971279f,0.116375f, --0.289845f,0.957072f,0.00156201f, --0.257416f,0.96626f,0.00885102f, --0.326801f,0.944936f,0.0172234f, --0.439204f,0.898379f,-0.00377194f, --0.336537f,0.936282f,0.100589f, --0.407285f,0.907139f,0.105914f, --0.44858f,0.865076f,0.224543f, --0.454994f,0.838311f,0.300358f, --0.578424f,0.785375f,0.220483f, --0.613986f,0.761879f,0.206302f, --0.509143f,0.819763f,0.262226f, --0.364105f,0.879908f,0.30527f, --0.344494f,0.905138f,0.249097f, --0.369295f,0.913195f,0.172323f, --0.574832f,0.817482f,0.0359178f, --0.689125f,0.724332f,-0.0212343f, --0.619919f,0.781232f,-0.0733212f, --0.441345f,0.892835f,-0.0897783f, --0.0649595f,0.996915f,0.0440505f, -0.146397f,0.977716f,0.150467f, --0.0177868f,0.998167f,0.0578468f, --0.37006f,0.91802f,-0.14246f, --0.30849f,0.937533f,-0.160828f, -0.107382f,0.980696f,-0.163415f, -0.392635f,0.914926f,-0.093533f, -0.501877f,0.862749f,-0.0615151f, -0.381618f,0.912204f,-0.14917f, -0.160415f,0.986769f,-0.0235493f, -0.0253729f,0.99703f,0.0727145f, -0.144484f,0.989507f,0.000443305f, -0.379228f,0.922372f,-0.073601f, -0.493599f,0.867009f,-0.0682314f, -0.529895f,0.842151f,-0.099967f, -0.549367f,0.821638f,-0.152008f, -0.439412f,0.876451f,-0.196851f, -0.349224f,0.935858f,0.0470259f, -0.182079f,0.971589f,0.151205f, -0.194383f,0.962201f,0.190749f, -0.266182f,0.94835f,0.172569f, -0.284034f,0.949535f,0.133071f, -0.347472f,0.93345f,0.089069f, -0.226103f,0.974059f,0.00925465f, --0.0773561f,0.993257f,-0.0863519f, --0.200366f,0.974099f,-0.104811f, --0.00292133f,0.99995f,-0.00953497f, -0.144264f,0.988303f,-0.0494442f, --0.155865f,0.979469f,-0.127857f, --0.286146f,0.957784f,-0.0277406f, --0.165259f,0.985103f,-0.0475661f, --0.069504f,0.996782f,-0.0399387f, --0.139315f,0.988254f,-0.0628056f, --0.230813f,0.967463f,-0.103639f, --0.24543f,0.966984f,-0.0686046f, --0.189537f,0.981091f,0.0391957f, -0.151487f,0.988375f,0.0128779f, -0.16936f,0.984329f,0.0491336f, -0.218781f,0.968894f,0.115672f, -0.279098f,0.952669f,0.120523f, -0.344688f,0.931221f,0.118397f, -0.359727f,0.914297f,0.186165f, -0.326371f,0.918389f,0.223703f, -0.361839f,0.886899f,0.287197f, --0.000924981f,0.965442f,0.260617f, --0.321168f,0.914653f,0.24548f, --0.23578f,0.933549f,0.269988f, --0.0519805f,0.910912f,0.409313f, --0.120702f,0.947306f,0.296721f, --0.257649f,0.956241f,0.138637f, --0.340179f,0.924947f,0.169564f, --0.415425f,0.90289f,0.110507f, --0.41038f,0.91038f,0.0528755f, --0.447459f,0.881081f,0.153222f, --0.521314f,0.820871f,0.233245f, --0.470597f,0.83806f,0.27603f, --0.530303f,0.820989f,0.211554f, --0.59428f,0.795918f,0.11552f, --0.564828f,0.823165f,0.0580397f, --0.435129f,0.882511f,0.17843f, --0.320859f,0.891866f,0.318787f, --0.272192f,0.902535f,0.33368f, --0.476067f,0.856837f,0.197967f, --0.671403f,0.739101f,0.0543033f, --0.548598f,0.834125f,0.0572312f, --0.459373f,0.883769f,-0.0890421f, --0.194341f,0.977153f,-0.0860449f, -0.0638196f,0.997784f,0.0188364f, -0.119241f,0.989813f,0.0777976f, --0.189205f,0.978439f,-0.0828203f, --0.328042f,0.913868f,-0.239234f, -0.0439005f,0.976566f,-0.210694f, -0.345392f,0.929362f,-0.130351f, -0.531991f,0.841029f,-0.0982628f, -0.385958f,0.912021f,-0.13876f, -0.00996624f,0.998173f,-0.059598f, --0.0397997f,0.999182f,0.00710574f, -0.22423f,0.974041f,-0.0310806f, -0.399529f,0.909843f,-0.112084f, -0.472825f,0.876316f,-0.0922302f, -0.567959f,0.818431f,-0.0871407f, -0.591097f,0.802347f,-0.0827227f, -0.294969f,0.954774f,-0.0374031f, -0.136562f,0.986139f,0.0942395f, -0.140836f,0.978895f,0.148089f, -0.208743f,0.962024f,0.175889f, -0.331657f,0.931412f,0.149918f, -0.32318f,0.945148f,0.0474422f, -0.378499f,0.925602f,0.000447487f, -0.240237f,0.969087f,-0.0561752f, -0.0676245f,0.996927f,-0.0395359f, --0.154966f,0.962822f,-0.221268f, --0.087338f,0.971663f,-0.219642f, -0.144581f,0.983839f,-0.105631f, --0.0884322f,0.993076f,-0.0773351f, --0.293638f,0.94457f,-0.146848f, --0.135408f,0.983934f,-0.116358f, --0.103543f,0.987494f,-0.11889f, --0.104597f,0.98248f,-0.15425f, --0.176622f,0.962045f,-0.208023f, --0.325467f,0.923065f,-0.204992f, --0.403927f,0.903415f,-0.143824f, -0.344389f,0.929213f,0.134014f, -0.233815f,0.972165f,0.0150206f, -0.162621f,0.985815f,-0.0415186f, -0.195602f,0.980526f,0.0175561f, -0.28987f,0.950331f,0.113346f, -0.255987f,0.942074f,0.216718f, -0.263495f,0.890351f,0.371275f, -0.315069f,0.864416f,0.391812f, -0.0646003f,0.916859f,0.39395f, --0.213657f,0.9234f,0.318877f, --0.307635f,0.926495f,0.216719f, --0.201977f,0.923807f,0.325246f, --0.0210673f,0.916391f,0.399731f, --0.17042f,0.919713f,0.353674f, --0.316748f,0.899919f,0.299695f, --0.294061f,0.92391f,0.244781f, --0.396636f,0.905857f,0.14867f, --0.523471f,0.83043f,0.190696f, --0.568887f,0.791598f,0.223024f, --0.446362f,0.844948f,0.294659f, --0.453253f,0.853996f,0.255447f, --0.541011f,0.824142f,0.167623f, --0.550736f,0.81694f,0.171169f, --0.53915f,0.819657f,0.193597f, --0.444412f,0.862352f,0.242584f, --0.285315f,0.907749f,0.30755f, --0.329395f,0.886574f,0.324786f, --0.610599f,0.78547f,0.101022f, --0.543486f,0.838015f,0.0485148f, --0.319704f,0.945394f,0.0634074f, --0.262212f,0.963421f,-0.055354f, -0.000253525f,0.995852f,0.0909893f, -0.105619f,0.991464f,0.0764441f, -0.0245363f,0.999682f,-0.00586488f, --0.22917f,0.926966f,-0.29701f, --0.0159754f,0.943632f,-0.33061f, -0.309925f,0.920539f,-0.237812f, -0.48714f,0.850311f,-0.199165f, -0.288684f,0.955866f,-0.0546085f, --0.0787222f,0.994967f,0.0619939f, -0.0273777f,0.99772f,0.0616831f, -0.291481f,0.955243f,-0.0505022f, -0.438727f,0.89664f,-0.0596253f, -0.485213f,0.871546f,-0.0705428f, -0.5406f,0.839608f,-0.0530067f, -0.49511f,0.866937f,0.0573254f, -0.280189f,0.947413f,0.154605f, -0.158816f,0.979113f,0.126949f, -0.168625f,0.983554f,0.0647105f, -0.187616f,0.98216f,0.0127302f, -0.334023f,0.942557f,0.00379923f, -0.401318f,0.914355f,0.0538517f, -0.424638f,0.905172f,0.0185914f, -0.289448f,0.956081f,-0.0461475f, -0.0899479f,0.980871f,-0.172633f, --0.00560791f,0.970967f,-0.23915f, --0.153691f,0.938842f,-0.308149f, --0.0450622f,0.984719f,-0.168219f, --0.0818032f,0.994271f,0.0687937f, --0.254478f,0.967062f,-0.0056871f, --0.190127f,0.974114f,-0.122284f, --0.0615121f,0.986397f,-0.152435f, --0.0478084f,0.984317f,-0.169808f, --0.157882f,0.979732f,-0.123284f, --0.307356f,0.93941f,-0.151791f, --0.432596f,0.869844f,-0.237133f, -0.35469f,0.923204f,0.147951f, -0.317903f,0.938384f,0.135547f, -0.209784f,0.976723f,0.0447562f, -0.188401f,0.980806f,-0.0502544f, -0.153267f,0.987748f,-0.0293859f, -0.102074f,0.966336f,0.236167f, -0.128463f,0.933972f,0.333456f, -0.308207f,0.882627f,0.354934f, -0.141883f,0.91146f,0.386148f, --0.174863f,0.945456f,0.274837f, --0.248524f,0.937312f,0.244299f, --0.268339f,0.945888f,0.182456f, --0.0843285f,0.960488f,0.265238f, --0.151825f,0.934815f,0.321045f, --0.286064f,0.900967f,0.326231f, --0.240679f,0.904695f,0.351568f, --0.362345f,0.88785f,0.2836f, --0.538142f,0.813225f,0.221511f, --0.57294f,0.797677f,0.188284f, --0.51091f,0.838129f,0.191079f, --0.412611f,0.865658f,0.283528f, --0.528395f,0.821979f,0.212483f, --0.579097f,0.792111f,0.192891f, --0.502268f,0.843036f,0.192398f, --0.402738f,0.896524f,0.184518f, --0.323371f,0.930281f,0.173231f, --0.341027f,0.92193f,0.183699f, --0.49586f,0.861123f,0.112209f, --0.562176f,0.82675f,-0.0210484f, --0.29935f,0.952705f,0.0523715f, --0.273263f,0.96182f,0.0151701f, --0.127856f,0.984802f,0.117552f, -0.16681f,0.967622f,0.189425f, -0.219885f,0.966852f,0.1298f, -0.0444925f,0.994595f,-0.093817f, --0.0559771f,0.948894f,-0.31059f, -0.229668f,0.93439f,-0.272337f, -0.391338f,0.907289f,-0.153889f, -0.215699f,0.975228f,0.0490428f, --0.1202f,0.992098f,0.0359644f, -0.0568932f,0.997098f,0.0505773f, -0.369571f,0.928802f,0.0272646f, -0.435039f,0.898005f,-0.0657877f, -0.45866f,0.886154f,-0.0660444f, -0.484136f,0.874975f,0.00559808f, -0.464546f,0.884206f,0.0487577f, -0.311084f,0.947795f,0.0700806f, -0.215922f,0.975139f,0.0498078f, -0.229266f,0.973122f,-0.0216826f, -0.269391f,0.956816f,-0.109228f, -0.297276f,0.941247f,-0.160256f, -0.352506f,0.931874f,-0.0857318f, -0.363875f,0.92958f,-0.0589632f, -0.421372f,0.901903f,0.094954f, -0.220959f,0.972251f,-0.0768509f, -0.0552433f,0.994093f,-0.0934223f, --0.134577f,0.980922f,-0.140288f, --0.247593f,0.953903f,-0.169607f, --0.238891f,0.96987f,-0.0477791f, --0.130123f,0.990325f,-0.0482061f, -0.00814361f,0.986901f,-0.161119f, --0.0740374f,0.970051f,-0.231345f, --0.135238f,0.990526f,-0.0238593f, --0.204897f,0.978574f,0.0202582f, --0.205889f,0.977122f,-0.0533174f, --0.236999f,0.963982f,-0.120711f, -0.399314f,0.905653f,0.142621f, -0.334882f,0.936094f,0.107618f, -0.310789f,0.943606f,0.114093f, -0.298988f,0.952609f,0.0560503f, -0.00373107f,0.999894f,-0.0140921f, --0.127729f,0.983543f,0.12778f, -0.134365f,0.969696f,0.204046f, -0.250753f,0.938877f,0.235867f, -0.172971f,0.901933f,0.395725f, --0.0661635f,0.938085f,0.340027f, --0.190026f,0.944561f,0.267758f, --0.246469f,0.952194f,0.180498f, --0.199636f,0.962622f,0.183041f, --0.204824f,0.924659f,0.321019f, --0.345906f,0.869848f,0.351729f, --0.272906f,0.86539f,0.420265f, --0.23738f,0.86577f,0.44056f, --0.476597f,0.838274f,0.264863f, --0.549692f,0.815624f,0.180542f, --0.521659f,0.837826f,0.160993f, --0.461012f,0.874551f,0.150426f, --0.498406f,0.858536f,0.120447f, --0.538861f,0.837113f,0.0941878f, --0.51696f,0.855065f,0.0401927f, --0.464195f,0.882878f,0.0710582f, --0.339798f,0.923706f,0.176929f, --0.307071f,0.929998f,0.202016f, --0.435636f,0.887155f,0.152245f, --0.50925f,0.856289f,0.0862179f, --0.352613f,0.935762f,-0.00363908f, --0.24432f,0.969666f,0.0074465f, --0.223693f,0.974193f,-0.0301471f, -0.0924619f,0.993171f,0.071143f, -0.248444f,0.955155f,0.161104f, -0.25541f,0.957577f,0.133462f, -0.152224f,0.983188f,-0.100846f, -0.175485f,0.954332f,-0.241774f, -0.229817f,0.96697f,-0.110245f, -0.104087f,0.990176f,0.0933667f, --0.0251916f,0.99085f,0.132593f, -0.0299952f,0.999356f,-0.0197015f, -0.374506f,0.927216f,-0.00387803f, -0.523769f,0.851516f,-0.0242066f, -0.412003f,0.903869f,-0.115217f, -0.44751f,0.89427f,-0.00401492f, -0.502351f,0.864643f,-0.0060566f, -0.261187f,0.953407f,-0.150988f, -0.201827f,0.974066f,-0.102283f, -0.328474f,0.941424f,-0.0763319f, -0.327281f,0.932573f,-0.152297f, -0.312159f,0.927432f,-0.205977f, -0.304739f,0.922289f,-0.237734f, -0.291399f,0.941708f,-0.168142f, -0.325323f,0.94222f,-0.0799213f, -0.270502f,0.962573f,-0.0167793f, --0.00135827f,0.998382f,0.0568385f, --0.0464612f,0.993882f,0.100202f, --0.163616f,0.983349f,-0.0790802f, --0.219372f,0.956704f,-0.191292f, --0.0798083f,0.976764f,-0.198904f, --0.0362508f,0.993161f,-0.11098f, --0.194493f,0.976824f,0.0893684f, --0.303508f,0.929002f,0.211751f, --0.120982f,0.967912f,0.220249f, --0.126864f,0.979558f,0.156117f, --0.190168f,0.969475f,0.154773f, -0.442277f,0.894635f,0.0633978f, -0.351901f,0.932017f,0.0866602f, -0.271089f,0.951246f,0.147111f, -0.263373f,0.940704f,0.2138f, -0.0780789f,0.961317f,0.264145f, --0.165165f,0.972713f,0.162944f, -0.054241f,0.96435f,0.259011f, -0.119009f,0.928226f,0.352467f, -0.062551f,0.905107f,0.420558f, --0.0376962f,0.903166f,0.427633f, --0.119235f,0.864868f,0.487634f, --0.107099f,0.89512f,0.43277f, --0.228241f,0.933808f,0.275515f, --0.34367f,0.891778f,0.294319f, --0.360994f,0.863066f,0.353271f, --0.329935f,0.870805f,0.364474f, --0.225803f,0.873787f,0.430708f, --0.324138f,0.85889f,0.396537f, --0.511071f,0.812187f,0.281352f, --0.475013f,0.824987f,0.306202f, --0.392033f,0.887928f,0.240612f, --0.45534f,0.876633f,0.155499f, --0.547025f,0.829694f,0.111226f, --0.496064f,0.862275f,0.101992f, --0.479515f,0.87606f,0.0508306f, --0.424535f,0.90465f,0.0371277f, --0.362147f,0.919497f,0.152886f, --0.412742f,0.878092f,0.24207f, --0.402299f,0.893898f,0.197745f, --0.26297f,0.963672f,0.0467231f, --0.219075f,0.975598f,-0.0146319f, --0.186267f,0.980099f,-0.0686323f, --0.0357984f,0.992879f,-0.113625f, -0.180598f,0.983509f,0.00973344f, -0.28459f,0.957748f,0.0415635f, -0.350884f,0.934731f,0.0561944f, -0.201029f,0.975728f,-0.0868401f, -0.10163f,0.994331f,-0.0312587f, --0.0498772f,0.998294f,0.0303674f, -0.0144565f,0.996475f,0.082632f, -0.17671f,0.984206f,0.0105968f, -0.384098f,0.921983f,-0.049144f, -0.526508f,0.848767f,-0.048829f, -0.451141f,0.890087f,-0.0649363f, -0.349978f,0.927792f,-0.129298f, -0.525028f,0.849511f,-0.051734f, -0.403316f,0.902994f,-0.148114f, -0.146493f,0.950082f,-0.275472f, -0.257494f,0.953663f,-0.155639f, -0.363336f,0.930153f,-0.0529431f, -0.407301f,0.911128f,-0.0628641f, -0.309341f,0.935596f,-0.170201f, -0.234661f,0.952473f,-0.194238f, -0.248922f,0.950735f,-0.18477f, -0.176271f,0.982701f,-0.0568089f, --0.0817466f,0.996475f,0.0188703f, --0.0390696f,0.99855f,0.0370285f, -0.0392849f,0.997614f,0.0567754f, --0.165147f,0.985538f,-0.0379532f, --0.216905f,0.97598f,0.020392f, --0.25871f,0.942954f,0.209538f, --0.318314f,0.87576f,0.362933f, --0.238112f,0.92993f,0.280235f, --0.11178f,0.963059f,0.244995f, --0.156033f,0.939968f,0.303502f, --0.219558f,0.904757f,0.364977f, -0.29059f,0.953077f,-0.0848643f, -0.282679f,0.959209f,-0.00326087f, -0.165956f,0.986031f,0.0141778f, -0.145774f,0.971701f,0.185869f, -0.0971539f,0.92606f,0.364656f, --0.126893f,0.938591f,0.320851f, --0.158756f,0.918948f,0.361014f, -0.0576791f,0.877286f,0.47649f, -0.151465f,0.884095f,0.442079f, --0.0842052f,0.912347f,0.400665f, --0.236928f,0.870703f,0.430978f, --0.0173538f,0.858153f,0.513101f, --0.0453547f,0.868839f,0.493013f, --0.308698f,0.88215f,0.355692f, --0.391959f,0.868398f,0.303732f, --0.360504f,0.877037f,0.317558f, --0.289644f,0.88703f,0.359561f, --0.323579f,0.85156f,0.412484f, --0.483914f,0.781191f,0.39442f, --0.428744f,0.813324f,0.393297f, --0.337017f,0.871068f,0.357294f, --0.382215f,0.837599f,0.390306f, --0.472752f,0.816976f,0.330237f, --0.454132f,0.848356f,0.272131f, --0.386129f,0.879637f,0.277745f, --0.408175f,0.895196f,0.178931f, --0.461039f,0.873474f,0.15648f, --0.444429f,0.876284f,0.186035f, --0.324725f,0.941951f,0.085336f, --0.200261f,0.979518f,0.0209972f, --0.146655f,0.98862f,0.0335086f, --0.105669f,0.986512f,-0.125016f, --0.0113758f,0.977088f,-0.21253f, -0.125756f,0.969156f,-0.211948f, -0.231535f,0.947003f,-0.222657f, -0.267937f,0.954488f,-0.131005f, -0.231299f,0.971277f,0.055871f, -0.0809071f,0.991774f,0.0991925f, -0.000207679f,0.999953f,0.00973996f, -0.0247831f,0.993578f,-0.110402f, -0.181304f,0.979201f,-0.0910725f, -0.390907f,0.919373f,-0.0441033f, -0.523664f,0.849877f,-0.0590321f, -0.487061f,0.873094f,-0.0218679f, -0.442794f,0.892691f,-0.0838822f, -0.486459f,0.850567f,-0.199735f, -0.449595f,0.886474f,-0.10967f, -0.172841f,0.979158f,-0.106661f, -0.134151f,0.987388f,-0.084069f, -0.292984f,0.955775f,-0.0255695f, -0.391346f,0.920229f,-0.00512785f, -0.418943f,0.907957f,0.00999318f, -0.324262f,0.936698f,-0.1321f, -0.190686f,0.957473f,-0.216527f, -0.0619887f,0.993289f,-0.097645f, --0.0829846f,0.99633f,-0.0209901f, --0.0646754f,0.997763f,-0.0169202f, --0.0614217f,0.996217f,0.0614677f, --0.189778f,0.963623f,0.188191f, --0.363861f,0.896503f,0.25276f, --0.348308f,0.859996f,0.372945f, --0.264506f,0.906439f,0.329249f, --0.140762f,0.939057f,0.31362f, --0.154941f,0.944783f,0.288752f, --0.237481f,0.904164f,0.355093f, --0.314839f,0.867723f,0.38462f, -0.199283f,0.97456f,-0.102566f, -0.290362f,0.956152f,-0.0382605f, -0.163603f,0.98144f,-0.10005f, --0.0845537f,0.992536f,-0.0878854f, --0.0995819f,0.988025f,0.117859f, --0.128698f,0.94862f,0.289062f, --0.181988f,0.934999f,0.304396f, -0.0121717f,0.953274f,0.301863f, -0.15771f,0.909532f,0.384551f, --0.030083f,0.904525f,0.425359f, --0.262213f,0.918561f,0.295788f, --0.150427f,0.932893f,0.327234f, --0.0433771f,0.888915f,0.456013f, --0.194904f,0.882492f,0.428042f, --0.359771f,0.865678f,0.348089f, --0.358104f,0.856009f,0.37284f, --0.334766f,0.853069f,0.400257f, --0.382047f,0.809514f,0.445788f, --0.440041f,0.772384f,0.458024f, --0.392897f,0.847233f,0.357532f, --0.352962f,0.862399f,0.362885f, --0.432462f,0.797784f,0.42014f, --0.40741f,0.807767f,0.426063f, --0.417686f,0.831448f,0.366378f, --0.406533f,0.835025f,0.370761f, --0.302917f,0.831265f,0.466089f, --0.354465f,0.85583f,0.376708f, --0.320875f,0.930472f,0.17681f, --0.210666f,0.977556f,0.00208309f, --0.202152f,0.976764f,-0.0711849f, --0.0734606f,0.993473f,-0.0872598f, -0.0104554f,0.979699f,-0.2002f, -0.0812548f,0.981491f,-0.173417f, -0.133484f,0.953074f,-0.271721f, -0.239226f,0.941558f,-0.23715f, -0.0986638f,0.979162f,-0.177504f, -0.0167662f,0.999807f,0.0102821f, -0.0608252f,0.989728f,0.129377f, -0.193478f,0.976369f,0.0962839f, -0.105893f,0.986391f,-0.125774f, -0.159018f,0.972139f,-0.17222f, -0.348199f,0.916375f,-0.197521f, -0.506641f,0.853561f,-0.121441f, -0.438954f,0.895697f,-0.0710352f, -0.508211f,0.861156f,-0.0114456f, -0.538629f,0.837641f,-0.0907543f, -0.350973f,0.934296f,-0.0625226f, -0.130826f,0.991364f,0.00901604f, -0.142249f,0.989581f,0.0222434f, -0.314713f,0.948656f,-0.0317428f, -0.413134f,0.902882f,-0.118849f, -0.421178f,0.889709f,-0.176143f, -0.40304f,0.897538f,-0.178843f, -0.190553f,0.961133f,-0.199782f, --0.0704956f,0.989551f,-0.125772f, --0.145721f,0.988685f,0.035603f, --0.158165f,0.979549f,0.124366f, --0.141884f,0.945197f,0.294061f, --0.282634f,0.89813f,0.336869f, --0.398539f,0.847577f,0.350398f, --0.326007f,0.891199f,0.31541f, --0.257935f,0.930645f,0.259558f, --0.189362f,0.933131f,0.305628f, --0.181998f,0.908713f,0.375656f, --0.284451f,0.857477f,0.428743f, --0.324962f,0.834267f,0.445419f, -0.162722f,0.967013f,-0.19598f, -0.196801f,0.96943f,-0.146541f, -0.171798f,0.98444f,0.0369126f, --0.0614366f,0.993745f,0.0932502f, --0.263807f,0.962515f,0.063023f, --0.262644f,0.943232f,0.203304f, --0.183229f,0.945939f,0.267632f, --0.0512022f,0.955564f,0.290302f, -0.0500709f,0.932925f,0.356571f, --0.017607f,0.930336f,0.366286f, --0.141345f,0.917863f,0.370876f, --0.196664f,0.921785f,0.334121f, --0.123639f,0.931227f,0.342826f, --0.166673f,0.929929f,0.327799f, --0.365314f,0.882118f,0.297345f, --0.422119f,0.842584f,0.334465f, --0.378137f,0.838603f,0.392119f, --0.433991f,0.800503f,0.413336f, --0.373446f,0.819157f,0.435339f, --0.321191f,0.877582f,0.35593f, --0.410179f,0.839146f,0.357194f, --0.450466f,0.792998f,0.410164f, --0.383405f,0.853385f,0.353178f, --0.361072f,0.88078f,0.306355f, --0.471517f,0.844691f,0.253315f, --0.399349f,0.852332f,0.337713f, --0.193735f,0.889811f,0.413163f, --0.0964184f,0.953204f,0.28654f, --0.0731968f,0.993583f,0.0862245f, --0.107213f,0.990087f,-0.0907379f, --0.0139207f,0.976637f,-0.214443f, --0.00517032f,0.976967f,-0.213328f, -0.032564f,0.990278f,-0.135238f, -0.193406f,0.974103f,-0.117123f, -0.137302f,0.989014f,-0.0547632f, -0.0149454f,0.997504f,0.06901f, --0.0673257f,0.995987f,0.0589639f, -0.00671915f,0.997834f,0.0654375f, -0.236496f,0.961793f,0.137925f, -0.296243f,0.953456f,0.0562338f, -0.227931f,0.966806f,-0.11547f, -0.392626f,0.909868f,-0.134105f, -0.455312f,0.880641f,-0.131003f, -0.402519f,0.906647f,-0.126375f, -0.459051f,0.879656f,-0.124406f, -0.531911f,0.846049f,-0.0356662f, -0.366681f,0.930218f,0.0155094f, -0.101768f,0.992829f,-0.0627213f, -0.169781f,0.984995f,-0.0309622f, -0.383193f,0.921183f,-0.0677109f, -0.483652f,0.86784f,-0.113728f, -0.481548f,0.864447f,-0.144373f, -0.322376f,0.925659f,-0.198063f, -0.121084f,0.992307f,-0.0257868f, --0.189201f,0.97803f,0.0875253f, --0.272481f,0.941614f,0.197779f, --0.28107f,0.929157f,0.240138f, --0.316277f,0.890261f,0.327726f, --0.284096f,0.875896f,0.389994f, --0.304764f,0.879665f,0.365114f, --0.295018f,0.913863f,0.278959f, --0.233864f,0.913909f,0.331779f, --0.25276f,0.886942f,0.386584f, --0.254968f,0.846261f,0.467797f, --0.324913f,0.811645f,0.485452f, --0.330966f,0.801562f,0.497956f, -0.166281f,0.984047f,-0.0632562f, -0.102172f,0.992786f,-0.0627485f, --0.0446214f,0.999004f,-0.000325965f, --0.137659f,0.980871f,0.13763f, --0.270041f,0.94552f,0.18185f, --0.300503f,0.932348f,0.201063f, --0.224552f,0.960314f,0.165452f, --0.109331f,0.978965f,0.17226f, -0.0684226f,0.972288f,0.223551f, --0.0281009f,0.965962f,0.257154f, --0.203983f,0.927334f,0.313757f, --0.170837f,0.935943f,0.307937f, --0.0844776f,0.951083f,0.29716f, --0.140439f,0.935294f,0.32481f, --0.360713f,0.879742f,0.309743f, --0.466354f,0.845167f,0.261162f, --0.425659f,0.859392f,0.283303f, --0.470194f,0.836884f,0.280256f, --0.410878f,0.856359f,0.312777f, --0.293557f,0.864483f,0.408036f, --0.429097f,0.81157f,0.396523f, --0.438172f,0.837036f,0.327683f, --0.303084f,0.911643f,0.277574f, --0.346895f,0.902405f,0.255594f, --0.444307f,0.857916f,0.258015f, --0.440123f,0.885255f,0.150386f, --0.246442f,0.965625f,0.0826743f, --0.0242341f,0.995753f,0.0888192f, -0.128537f,0.987977f,0.085905f, -0.10291f,0.993755f,-0.0431449f, -0.0280177f,0.986869f,-0.159076f, --0.0318503f,0.988236f,-0.149584f, -0.00777626f,0.97932f,-0.202168f, -0.111085f,0.970769f,-0.212762f, --0.00220326f,0.997417f,-0.0718009f, --0.0152092f,0.997571f,0.0679693f, -0.0100591f,0.998816f,0.0476033f, --0.00783919f,0.999851f,-0.0153546f, -0.1632f,0.986482f,-0.0148045f, -0.356551f,0.93118f,0.0760001f, -0.33409f,0.940767f,0.0578066f, -0.378555f,0.924836f,-0.0370621f, -0.481573f,0.874509f,-0.0576253f, -0.443664f,0.890369f,-0.102011f, -0.449245f,0.88434f,-0.126968f, -0.449063f,0.892098f,-0.05003f, -0.400085f,0.916232f,0.0212355f, -0.189459f,0.975149f,-0.114846f, -0.154225f,0.96178f,-0.226258f, -0.36559f,0.902984f,-0.225751f, -0.443305f,0.891814f,-0.0902669f, -0.481296f,0.876165f,0.0262584f, -0.274557f,0.96003f,0.0544047f, --0.0951468f,0.983236f,0.155547f, --0.272231f,0.920302f,0.280953f, --0.309095f,0.909629f,0.277553f, --0.260629f,0.904898f,0.336501f, --0.319906f,0.899874f,0.296456f, --0.309019f,0.910231f,0.275658f, --0.301457f,0.909911f,0.284931f, --0.289244f,0.908198f,0.302514f, --0.349317f,0.867088f,0.355157f, --0.355035f,0.811266f,0.46454f, --0.291879f,0.804435f,0.517388f, --0.292737f,0.815956f,0.498519f, --0.341117f,0.83204f,0.437434f, -0.012939f,0.999781f,0.0164623f, -0.101117f,0.986501f,0.12881f, --0.0315137f,0.991787f,0.123953f, --0.202813f,0.972667f,0.113078f, --0.267039f,0.954882f,0.129964f, --0.329248f,0.943109f,0.0462825f, --0.158801f,0.981787f,0.104294f, --0.0896983f,0.994441f,0.0551561f, --0.03797f,0.996172f,0.0787436f, --0.124773f,0.970658f,0.205561f, --0.242396f,0.92942f,0.278248f, --0.1236f,0.936757f,0.327428f, --0.115597f,0.950099f,0.289742f, --0.242269f,0.924532f,0.294187f, --0.335063f,0.873272f,0.353736f, --0.402827f,0.872268f,0.27727f, --0.433494f,0.882428f,0.182769f, --0.472347f,0.860126f,0.192541f, --0.516304f,0.829671f,0.212311f, --0.401557f,0.840095f,0.364681f, --0.365647f,0.853697f,0.370816f, --0.342203f,0.911984f,0.226234f, --0.319568f,0.928553f,0.188855f, --0.368607f,0.886665f,0.279203f, --0.401013f,0.885839f,0.233406f, --0.263462f,0.961384f,0.0795548f, --0.119336f,0.983737f,-0.134243f, --0.028348f,0.969034f,-0.245295f, -0.0404463f,0.983879f,-0.174201f, -0.11875f,0.992593f,0.0256534f, -0.0602272f,0.997166f,0.0450923f, -0.0340291f,0.999414f,-0.00366965f, -0.0708792f,0.992684f,-0.097743f, -0.0958935f,0.99395f,-0.0535485f, --0.0943801f,0.993296f,-0.0667466f, --0.119267f,0.988594f,-0.0919588f, -0.000759128f,0.999891f,-0.0147216f, -0.0724665f,0.997368f,-0.00256206f, -0.170906f,0.979948f,-0.10244f, -0.214916f,0.97339f,-0.079521f, -0.347938f,0.935698f,0.0583811f, -0.479062f,0.877734f,-0.00909944f, -0.517939f,0.850313f,-0.0933121f, -0.446396f,0.884197f,-0.137574f, -0.389313f,0.918353f,-0.0711587f, -0.410982f,0.908412f,0.0766878f, -0.41147f,0.910096f,0.0491837f, -0.356411f,0.933637f,-0.0359751f, -0.291892f,0.941315f,-0.169483f, -0.292525f,0.936947f,-0.191205f, -0.303478f,0.950202f,-0.0708325f, -0.350076f,0.936333f,0.0269695f, -0.186651f,0.94527f,0.26763f, --0.145022f,0.9031f,0.404201f, --0.257588f,0.88179f,0.395088f, --0.316433f,0.892435f,0.321607f, --0.301856f,0.895088f,0.328177f, --0.311714f,0.888624f,0.336427f, --0.275146f,0.879635f,0.387991f, --0.320358f,0.874704f,0.363681f, --0.312957f,0.856468f,0.410514f, --0.417707f,0.826376f,0.377656f, --0.402058f,0.821773f,0.403779f, --0.299174f,0.86271f,0.407708f, --0.252864f,0.886408f,0.387737f, --0.266831f,0.899401f,0.346235f, --0.121912f,0.980245f,-0.155747f, --0.0467045f,0.996241f,-0.0729522f, --0.0560423f,0.996609f,0.0602479f, --0.253613f,0.959854f,0.119832f, --0.17852f,0.958289f,0.223189f, --0.25091f,0.965294f,0.0724672f, --0.244405f,0.968888f,0.0390022f, --0.111828f,0.978686f,0.172245f, --0.104286f,0.963728f,0.245667f, --0.172657f,0.941673f,0.288863f, --0.302965f,0.917419f,0.257981f, --0.21274f,0.929075f,0.302592f, --0.0577232f,0.923128f,0.380136f, --0.183983f,0.930078f,0.31797f, --0.384056f,0.900387f,0.204463f, --0.327378f,0.913703f,0.240771f, --0.374063f,0.905896f,0.198566f, --0.504219f,0.846296f,0.17189f, --0.555467f,0.810974f,0.183786f, --0.456478f,0.86757f,0.197356f, --0.300554f,0.935674f,0.184881f, --0.295051f,0.948068f,0.118792f, --0.362387f,0.917821f,0.162113f, --0.440667f,0.875232f,0.199453f, --0.248631f,0.939944f,0.233854f, --0.0966352f,0.995188f,0.0161918f, -0.0243217f,0.996259f,-0.0829196f, -0.0213875f,0.994057f,-0.106741f, --0.13683f,0.98707f,-0.0834831f, --0.0593385f,0.994125f,0.0905282f, -0.0836318f,0.990077f,0.112932f, -0.079675f,0.993049f,0.0866394f, -0.0726138f,0.990126f,0.119908f, -0.0468689f,0.990824f,0.126776f, -0.00048966f,0.99587f,0.0907856f, --0.0299455f,0.998898f,-0.0361395f, --0.0528047f,0.988171f,-0.143981f, -0.0771474f,0.992034f,-0.0995875f, -0.233f,0.968973f,-0.0824758f, -0.215078f,0.967265f,-0.134683f, -0.299646f,0.93128f,-0.207193f, -0.500666f,0.844143f,-0.191721f, -0.5316f,0.838001f,-0.123112f, -0.45137f,0.888237f,-0.0854371f, -0.26295f,0.958984f,-0.105862f, -0.297072f,0.954855f,-0.000735176f, -0.467586f,0.880091f,0.0824758f, -0.451683f,0.892137f,0.00862833f, -0.280097f,0.955995f,-0.0872873f, -0.27353f,0.961001f,0.0407195f, -0.263182f,0.963734f,0.044184f, -0.22357f,0.970136f,0.0940863f, --0.055048f,0.955137f,0.291002f, --0.267739f,0.863744f,0.426921f, --0.199104f,0.857693f,0.474046f, --0.21681f,0.879018f,0.424642f, --0.270209f,0.885026f,0.379098f, --0.341336f,0.865644f,0.366267f, --0.32372f,0.861174f,0.391898f, --0.34092f,0.838889f,0.42431f, --0.295898f,0.818794f,0.491956f, --0.331f,0.829823f,0.449258f, --0.389842f,0.853312f,0.34624f, --0.281201f,0.9123f,0.297716f, --0.234572f,0.935622f,0.263795f, --0.225355f,0.942001f,0.248696f, --0.0486057f,0.996635f,-0.0660014f, --0.101682f,0.988174f,-0.114771f, --0.162649f,0.983215f,-0.0826606f, --0.318288f,0.946728f,-0.048975f, --0.258454f,0.965864f,-0.0175802f, --0.136613f,0.987862f,0.0739351f, --0.281595f,0.958211f,0.0503573f, --0.28706f,0.943479f,0.165663f, --0.148179f,0.930819f,0.334095f, --0.182832f,0.931383f,0.314798f, --0.242578f,0.923022f,0.298642f, --0.204404f,0.955935f,0.21073f, --0.142784f,0.976536f,0.161212f, --0.136962f,0.950722f,0.278153f, --0.274249f,0.920019f,0.279915f, --0.389723f,0.904453f,0.173436f, --0.370261f,0.901011f,0.226022f, --0.50377f,0.847021f,0.169619f, --0.52553f,0.835875f,0.158529f, --0.435894f,0.894864f,0.0959897f, --0.279872f,0.956869f,0.07793f, --0.331658f,0.940229f,0.0772765f, --0.372127f,0.91403f,0.161461f, --0.456876f,0.888328f,0.0462339f, --0.204408f,0.978272f,0.0346564f, -0.0554954f,0.998458f,-0.00157713f, --0.0102256f,0.999947f,0.00149442f, --0.0507499f,0.985345f,0.162848f, --0.124313f,0.970082f,0.208536f, --0.111836f,0.992788f,0.0431796f, -0.135986f,0.987999f,0.0732526f, -0.00980425f,0.997155f,0.0747439f, -0.00734776f,0.982792f,0.184568f, -0.0872171f,0.965097f,0.246944f, -0.0795152f,0.966423f,0.244345f, -0.106439f,0.984803f,0.137237f, -0.0584187f,0.998092f,-0.0199996f, -0.0370568f,0.991888f,-0.121591f, -0.199554f,0.972297f,-0.121727f, -0.308311f,0.945569f,-0.104131f, -0.399439f,0.904394f,-0.150064f, -0.468199f,0.870932f,-0.149223f, -0.412212f,0.907025f,-0.0859413f, -0.425915f,0.903304f,0.0513667f, -0.351639f,0.936099f,-0.00832492f, -0.20857f,0.966693f,-0.148333f, -0.395551f,0.918183f,0.0219088f, -0.538432f,0.838724f,0.0814483f, -0.24402f,0.966591f,-0.0784634f, -0.178953f,0.981938f,0.0614245f, -0.258979f,0.960241f,0.104243f, -0.0759782f,0.986383f,0.145865f, --0.19655f,0.929601f,0.311786f, --0.328358f,0.883678f,0.333607f, --0.21216f,0.920721f,0.327507f, --0.208125f,0.923292f,0.322823f, --0.300181f,0.87973f,0.368737f, --0.312111f,0.847974f,0.428401f, --0.324858f,0.873038f,0.363693f, --0.410275f,0.846963f,0.338124f, --0.346514f,0.853308f,0.389607f, --0.303825f,0.86928f,0.389926f, --0.270707f,0.881074f,0.387848f, --0.213937f,0.928705f,0.302885f, --0.20202f,0.939889f,0.275312f, --0.214102f,0.943299f,0.253667f, --0.0402111f,0.999126f,0.011392f, --0.0458289f,0.99894f,0.00442323f, --0.170695f,0.984267f,-0.0456311f, --0.29333f,0.955986f,-0.00691228f, --0.274679f,0.961535f,-0.00118788f, --0.240876f,0.970372f,-0.0188751f, --0.335158f,0.942005f,0.0172014f, --0.387782f,0.921031f,0.0364391f, --0.254694f,0.964339f,0.0719752f, --0.156383f,0.970864f,0.181569f, --0.223749f,0.957301f,0.183063f, --0.122594f,0.972034f,0.200303f, --0.0910709f,0.976799f,0.193828f, --0.28429f,0.950625f,0.124466f, --0.315477f,0.924742f,0.212902f, --0.305454f,0.925312f,0.224713f, --0.365063f,0.920836f,0.137077f, --0.474911f,0.873286f,0.108772f, --0.523018f,0.843362f,0.123259f, --0.405348f,0.903149f,0.141474f, --0.272593f,0.953587f,0.127925f, --0.342778f,0.935924f,0.0809316f, --0.402631f,0.912044f,0.0778773f, --0.324862f,0.935409f,0.139553f, --0.213356f,0.97623f,0.0381383f, -0.0301299f,0.998064f,0.0544045f, --0.104927f,0.992798f,0.0578138f, --0.261101f,0.959724f,0.103713f, --0.0217785f,0.964552f,0.262994f, -0.0803134f,0.988499f,0.128142f, -0.028164f,0.998669f,0.043203f, --0.0183001f,0.984341f,0.175323f, --0.0612635f,0.982917f,0.173556f, --0.0331225f,0.977326f,0.209135f, -0.0728156f,0.957515f,0.279039f, -0.245559f,0.942697f,0.225881f, -0.183786f,0.974714f,0.127102f, -0.141547f,0.988409f,0.0548866f, -0.245636f,0.968932f,-0.0288843f, -0.304552f,0.94926f,-0.0784495f, -0.340339f,0.936344f,-0.0861948f, -0.460805f,0.886321f,0.0457651f, -0.380493f,0.924294f,0.030084f, -0.352595f,0.93478f,0.0431689f, -0.472573f,0.87479f,0.106851f, -0.264087f,0.962772f,-0.057695f, -0.234368f,0.968348f,-0.0858683f, -0.503248f,0.863251f,0.0392276f, -0.302957f,0.950423f,0.0700943f, -0.0199528f,0.999731f,0.0118377f, -0.239816f,0.960125f,0.143695f, --0.0259597f,0.9852f,0.16943f, --0.288371f,0.907451f,0.305574f, --0.301113f,0.913287f,0.274296f, --0.184882f,0.952263f,0.242927f, --0.251998f,0.931999f,0.260528f, --0.398011f,0.856633f,0.32828f, --0.335641f,0.851294f,0.403292f, --0.239383f,0.893387f,0.380205f, --0.388171f,0.875539f,0.287671f, --0.364652f,0.897686f,0.247364f, --0.31107f,0.908317f,0.279636f, --0.277708f,0.915298f,0.291733f, --0.164862f,0.947448f,0.274159f, --0.18884f,0.953184f,0.236178f, --0.183001f,0.960107f,0.211435f, --0.0382166f,0.998778f,0.0313295f, --0.025601f,0.999566f,0.0145695f, --0.151993f,0.98817f,-0.0204673f, --0.361566f,0.932093f,-0.021731f, --0.304279f,0.951825f,0.0379804f, --0.164708f,0.984119f,0.0661845f, --0.289794f,0.954555f,-0.0695987f, --0.339732f,0.933497f,-0.114741f, --0.304944f,0.945342f,-0.115492f, --0.266385f,0.963249f,-0.0345067f, --0.261205f,0.96511f,0.0183122f, --0.220073f,0.973176f,0.06706f, --0.108437f,0.981443f,0.158152f, --0.188668f,0.971426f,0.143996f, --0.373149f,0.923277f,0.0912126f, --0.308957f,0.927563f,0.210174f, --0.302984f,0.922237f,0.240167f, --0.457665f,0.867903f,0.193102f, --0.548023f,0.825328f,0.136032f, --0.407198f,0.903776f,0.131829f, --0.253292f,0.959077f,0.126545f, --0.271541f,0.948088f,0.165511f, --0.43428f,0.889355f,0.142997f, --0.382973f,0.89965f,0.20967f, --0.169509f,0.965022f,0.199998f, -0.00160887f,0.982078f,0.188467f, --0.0137168f,0.977172f,0.212005f, --0.230009f,0.971053f,0.0644371f, --0.165502f,0.985539f,0.036359f, -0.129892f,0.967237f,0.218131f, -0.0422409f,0.973374f,0.225299f, --0.105762f,0.968925f,0.223604f, --0.0226547f,0.965849f,0.258115f, -0.0138374f,0.990856f,0.134211f, -0.0309349f,0.998739f,0.0395399f, -0.294589f,0.940971f,0.166706f, -0.248856f,0.959421f,0.132596f, -0.181153f,0.982002f,0.053445f, -0.283788f,0.958737f,0.0169453f, -0.366617f,0.930251f,-0.0149969f, -0.332578f,0.93839f,-0.0938972f, -0.358957f,0.931691f,-0.0557027f, -0.429022f,0.901938f,0.0494683f, -0.332897f,0.942781f,-0.0185381f, -0.429131f,0.903242f,-0.000810457f, -0.405301f,0.91403f,-0.0167607f, -0.256936f,0.958211f,-0.12576f, -0.354456f,0.935063f,-0.00433271f, -0.385431f,0.888673f,0.248403f, -0.0742527f,0.992531f,0.0967874f, -0.121836f,0.985927f,0.11447f, --0.100545f,0.965192f,0.241444f, --0.337975f,0.881899f,0.328674f, --0.242866f,0.922974f,0.298555f, --0.185171f,0.940279f,0.285633f, --0.313033f,0.906226f,0.28419f, --0.448562f,0.843983f,0.294082f, --0.356046f,0.888609f,0.289144f, --0.196811f,0.931399f,0.306206f, --0.298585f,0.916744f,0.265384f, --0.410663f,0.894937f,0.17448f, --0.325435f,0.90586f,0.271126f, --0.301755f,0.928362f,0.216998f, --0.109278f,0.952007f,0.285903f, --0.14523f,0.965578f,0.215795f, --0.139372f,0.971047f,0.194018f, -0.00163448f,0.997617f,0.0689798f, -0.026224f,0.998835f,0.04051f, --0.128032f,0.991559f,-0.0204567f, --0.309968f,0.948873f,-0.0596736f, --0.340105f,0.924291f,-0.173245f, --0.190965f,0.977348f,-0.0912302f, --0.146645f,0.988782f,-0.028384f, --0.31072f,0.935549f,-0.167929f, --0.380234f,0.90209f,-0.204096f, --0.300275f,0.945729f,-0.124224f, --0.302914f,0.945705f,-0.117837f, --0.237161f,0.970049f,-0.0525309f, --0.165718f,0.984724f,-0.0534418f, --0.190643f,0.98063f,0.0449474f, --0.411915f,0.909141f,0.0615588f, --0.453396f,0.88136f,0.1328f, --0.362905f,0.886473f,0.287169f, --0.380477f,0.872742f,0.305874f, --0.476636f,0.866585f,0.147809f, --0.366115f,0.923073f,0.117878f, --0.278065f,0.952821f,0.121709f, --0.370509f,0.910147f,0.18535f, --0.442894f,0.857435f,0.26201f, --0.347292f,0.915122f,0.204794f, --0.111317f,0.983727f,0.141034f, --0.00583658f,0.989977f,0.14111f, -0.00293304f,0.989031f,0.147679f, --0.0932614f,0.992658f,0.0770272f, --0.209442f,0.977765f,-0.0104574f, --0.0521744f,0.996134f,0.0706788f, -0.0111918f,0.977173f,0.21215f, --0.0985288f,0.958328f,0.268141f, -0.0097532f,0.972945f,0.23083f, -0.214151f,0.960047f,0.180136f, -0.0316331f,0.999392f,0.014672f, -0.114623f,0.990459f,0.0765015f, -0.302992f,0.926463f,0.223298f, -0.283203f,0.948444f,0.142303f, -0.315435f,0.948621f,0.0248881f, -0.37741f,0.92565f,0.0270755f, -0.401819f,0.915069f,0.0345122f, -0.321768f,0.943567f,-0.0784028f, -0.371664f,0.926589f,-0.0574381f, -0.394659f,0.917373f,-0.0516908f, -0.434962f,0.894125f,-0.106531f, -0.447382f,0.892016f,-0.0644733f, -0.241542f,0.966428f,-0.0876093f, -0.127706f,0.991493f,-0.0251536f, -0.250404f,0.953051f,0.170269f, -0.250954f,0.937023f,0.242919f, --0.000559693f,0.986358f,0.164614f, --0.211006f,0.922632f,0.32284f, --0.34675f,0.881023f,0.321811f, --0.216454f,0.925604f,0.310492f, --0.177379f,0.942447f,0.283426f, --0.307121f,0.917748f,0.251824f, --0.427987f,0.86998f,0.244872f, --0.348579f,0.908707f,0.229659f, --0.214211f,0.945769f,0.244201f, --0.272299f,0.924949f,0.265184f, --0.413173f,0.878684f,0.239168f, --0.359354f,0.883418f,0.300728f, --0.292273f,0.892332f,0.343978f, --0.146355f,0.897543f,0.415929f, --0.0984727f,0.903088f,0.418013f, --0.114958f,0.888054f,0.445134f, -0.0486539f,0.997583f,-0.0496084f, -0.0486095f,0.995772f,-0.0779487f, --0.0727955f,0.994312f,-0.0777426f, --0.222675f,0.967501f,-0.119823f, --0.286744f,0.93984f,-0.185682f, --0.296641f,0.937378f,-0.182555f, --0.219022f,0.967026f,-0.12996f, --0.147314f,0.984117f,-0.0990538f, --0.3428f,0.902622f,-0.26031f, --0.347893f,0.908635f,-0.230983f, --0.327008f,0.925901f,-0.189136f, --0.254527f,0.952486f,-0.167289f, --0.228332f,0.958887f,-0.168522f, --0.287734f,0.955666f,-0.0625468f, --0.451431f,0.892304f,0.00185963f, --0.510909f,0.851571f,0.11747f, --0.434919f,0.884052f,0.171166f, --0.355658f,0.920763f,0.16032f, --0.392075f,0.91242f,0.117331f, --0.40418f,0.912194f,0.0673793f, --0.347001f,0.925636f,0.15096f, --0.406528f,0.883834f,0.231457f, --0.406378f,0.897555f,0.171031f, --0.271349f,0.960134f,0.0671726f, --0.0926357f,0.994526f,0.0483373f, --0.0156467f,0.998994f,0.0420269f, -0.00801384f,0.999533f,0.0295044f, --0.0412004f,0.995482f,0.0855485f, --0.171347f,0.982792f,0.068987f, --0.142796f,0.988044f,0.0581328f, --0.101871f,0.981247f,0.163632f, --0.103189f,0.979569f,0.172615f, -0.0761964f,0.994828f,0.0671726f, -0.210538f,0.977574f,0.00485915f, -0.123577f,0.988892f,0.0825912f, -0.0553491f,0.995759f,0.0734865f, -0.223203f,0.966768f,0.124662f, -0.344575f,0.927512f,0.144881f, -0.388873f,0.91351f,0.119485f, -0.324349f,0.942843f,0.0764535f, -0.411999f,0.8978f,0.155603f, -0.440079f,0.892774f,0.0963553f, -0.378616f,0.925121f,-0.0283174f, -0.428515f,0.90345f,-0.0123871f, -0.429626f,0.902172f,-0.0388249f, -0.396609f,0.917987f,-0.000717735f, -0.233551f,0.972137f,-0.020091f, -0.111169f,0.993801f,0.000982701f, -0.115357f,0.993291f,0.00809163f, -0.164275f,0.973308f,0.160266f, --0.0349159f,0.947849f,0.316803f, --0.267423f,0.890391f,0.368361f, --0.327503f,0.90805f,0.261125f, --0.196107f,0.942247f,0.271499f, --0.118776f,0.949723f,0.289686f, --0.296931f,0.925681f,0.234405f, --0.445051f,0.862967f,0.239201f, --0.335704f,0.917243f,0.2144f, --0.25181f,0.948438f,0.1925f, --0.329983f,0.903347f,0.274f, --0.391867f,0.838521f,0.378579f, --0.417038f,0.817641f,0.396917f, --0.341558f,0.812981f,0.471594f, --0.188106f,0.834488f,0.517925f, --0.137025f,0.804598f,0.577794f, --0.18711f,0.76127f,0.620852f, -0.138194f,0.960364f,-0.242082f, -0.0401358f,0.96162f,-0.271434f, --0.076195f,0.979732f,-0.185256f, --0.203103f,0.960439f,-0.190543f, --0.267864f,0.941416f,-0.2049f, --0.261748f,0.936741f,-0.232388f, --0.231434f,0.930091f,-0.285254f, --0.126583f,0.962607f,-0.239509f, --0.258776f,0.934905f,-0.242872f, --0.430322f,0.876496f,-0.215819f, --0.353956f,0.929119f,-0.107016f, --0.27861f,0.956787f,-0.0832819f, --0.250796f,0.967007f,-0.0447179f, --0.348257f,0.937394f,-0.0030026f, --0.497787f,0.866258f,0.0424905f, --0.584411f,0.803193f,0.115522f, --0.394257f,0.905213f,0.158588f, --0.343138f,0.935038f,0.0892179f, --0.380878f,0.917442f,0.115034f, --0.389256f,0.914513f,0.11021f, --0.431967f,0.895633f,0.10605f, --0.414636f,0.893675f,0.171528f, --0.300214f,0.948969f,0.0965901f, --0.20281f,0.978452f,-0.0387339f, --0.123855f,0.987388f,-0.098611f, --0.0140563f,0.999899f,0.0019046f, --0.052066f,0.991601f,0.118388f, --0.0936165f,0.973604f,0.208163f, --0.149626f,0.978491f,0.142013f, --0.198198f,0.970011f,0.140699f, --0.130637f,0.968649f,0.211313f, -0.013631f,0.991214f,0.131563f, -0.20118f,0.979295f,0.0225449f, -0.231889f,0.971935f,-0.0396138f, -0.0131145f,0.999014f,-0.0424166f, -0.0264969f,0.999403f,0.0221517f, -0.210411f,0.977103f,0.0315571f, -0.327081f,0.943965f,0.0441437f, -0.381166f,0.920813f,0.0825546f, -0.346088f,0.933621f,0.0925967f, -0.356105f,0.932513f,0.0600724f, -0.479238f,0.87232f,0.0968908f, -0.446186f,0.89276f,0.062428f, -0.391504f,0.920172f,-0.00287489f, -0.426134f,0.9041f,0.0318405f, -0.417296f,0.907685f,0.0444148f, -0.286592f,0.957965f,0.012947f, -0.07628f,0.996621f,-0.030475f, -0.0820652f,0.99629f,0.0259114f, --0.0280556f,0.994071f,0.105053f, --0.213977f,0.933546f,0.287585f, --0.245374f,0.890565f,0.382995f, --0.189692f,0.923736f,0.332759f, --0.238316f,0.94737f,0.213765f, --0.176209f,0.945132f,0.275092f, --0.265622f,0.907592f,0.32515f, --0.420635f,0.873046f,0.246691f, --0.275407f,0.930254f,0.242441f, --0.273955f,0.921146f,0.276474f, --0.415501f,0.828882f,0.374585f, --0.488833f,0.76092f,0.426664f, --0.43149f,0.76785f,0.473522f, --0.33634f,0.787599f,0.516297f, --0.228347f,0.790629f,0.568123f, --0.231089f,0.763668f,0.602835f, --0.28515f,0.752352f,0.593849f, -0.109283f,0.926796f,-0.359314f, --0.0105223f,0.944186f,-0.329244f, --0.147017f,0.945286f,-0.29124f, --0.202823f,0.935685f,-0.288714f, --0.214861f,0.941374f,-0.260095f, --0.2356f,0.926477f,-0.293483f, --0.224333f,0.941495f,-0.251519f, --0.230404f,0.948768f,-0.216226f, --0.277442f,0.956386f,-0.0913908f, --0.472179f,0.876647f,-0.0923929f, --0.428177f,0.898465f,-0.0970806f, --0.3387f,0.938243f,-0.0705803f, --0.291725f,0.956079f,0.0284457f, --0.399526f,0.915525f,0.0468393f, --0.527082f,0.845186f,0.0885769f, --0.577694f,0.815576f,0.0332458f, --0.408723f,0.912647f,0.00457497f, --0.331162f,0.938989f,0.0929031f, --0.4185f,0.893481f,0.162938f, --0.372755f,0.902119f,0.217335f, --0.419905f,0.891761f,0.168648f, --0.426162f,0.889671f,0.163929f, --0.238048f,0.949403f,0.20486f, --0.0631417f,0.981494f,0.180781f, --0.0934621f,0.991987f,0.0850084f, --0.209815f,0.971464f,0.110612f, --0.239382f,0.928806f,0.282871f, --0.0385152f,0.924665f,0.378829f, --0.0229585f,0.976683f,0.213458f, --0.204415f,0.977814f,0.0457583f, --0.131276f,0.991302f,0.00937849f, -0.100844f,0.99484f,0.0110965f, -0.227419f,0.973508f,-0.0237273f, -0.22975f,0.97307f,0.0187244f, -0.0718328f,0.997222f,0.0197173f, -0.0214849f,0.994143f,-0.105917f, -0.174121f,0.982096f,-0.0718949f, -0.303053f,0.952921f,0.010044f, -0.38012f,0.924935f,0.00218727f, -0.364895f,0.929903f,-0.0461611f, -0.383009f,0.921386f,-0.0659776f, -0.441676f,0.895702f,-0.0513817f, -0.484548f,0.87476f,0.00284626f, -0.413676f,0.910113f,-0.0237944f, -0.449057f,0.893501f,-0.00212143f, -0.360983f,0.928147f,-0.090746f, -0.274993f,0.958661f,0.0731286f, -0.0881261f,0.984394f,0.15232f, -0.00584658f,0.984704f,0.174138f, --0.113749f,0.971528f,0.207834f, --0.320112f,0.923512f,0.211313f, --0.308899f,0.921582f,0.23509f, --0.147069f,0.956187f,0.253135f, --0.14137f,0.959806f,0.242461f, --0.277438f,0.935166f,0.220209f, --0.254545f,0.906523f,0.336782f, --0.385464f,0.89189f,0.236535f, --0.346902f,0.887297f,0.303913f, --0.404152f,0.809818f,0.425271f, --0.45263f,0.705418f,0.545446f, --0.436346f,0.733679f,0.520882f, --0.40606f,0.758487f,0.509719f, --0.399991f,0.76519f,0.504471f, --0.29927f,0.789873f,0.535292f, --0.216265f,0.823324f,0.524754f, --0.25441f,0.854784f,0.452349f, --0.0876585f,0.974972f,-0.204317f, --0.064531f,0.993199f,-0.096908f, --0.142906f,0.98657f,-0.0790982f, --0.190225f,0.979959f,-0.0591132f, --0.245075f,0.966633f,-0.0745641f, --0.286525f,0.954682f,-0.0805399f, --0.302328f,0.953201f,0.00253574f, --0.315251f,0.947498f,0.0535207f, --0.363913f,0.92013f,0.144666f, --0.433014f,0.884677f,0.172759f, --0.39903f,0.904384f,0.151207f, --0.340877f,0.927749f,0.15194f, --0.34367f,0.933336f,0.103799f, --0.371228f,0.927804f,0.0370044f, --0.540653f,0.838686f,-0.0655789f, --0.541683f,0.840171f,-0.0263209f, --0.443789f,0.895468f,-0.0344719f, --0.446175f,0.894923f,0.00646964f, --0.489716f,0.870366f,0.0513954f, --0.393228f,0.91623f,0.0767741f, --0.386844f,0.914535f,0.118231f, --0.456614f,0.881467f,0.1205f, --0.291641f,0.939064f,0.181947f, --0.0983466f,0.949337f,0.298474f, --0.0663966f,0.917799f,0.391455f, --0.225097f,0.912905f,0.340494f, --0.270333f,0.917625f,0.291349f, --0.0378823f,0.963845f,0.263756f, -0.203246f,0.94956f,0.238803f, --0.00658121f,0.998329f,0.057403f, --0.104339f,0.991332f,-0.0798442f, -0.0714998f,0.99184f,-0.105548f, -0.229254f,0.968801f,-0.0941692f, -0.162963f,0.980447f,-0.110304f, -0.144794f,0.987619f,-0.0603599f, -0.1028f,0.982727f,-0.153883f, -0.103742f,0.981824f,-0.158931f, -0.242509f,0.962807f,-0.119129f, -0.409757f,0.908112f,-0.0862081f, -0.420763f,0.899369f,-0.118717f, -0.356993f,0.920491f,-0.158908f, -0.417923f,0.902816f,-0.101306f, -0.45294f,0.886743f,-0.0923743f, -0.388277f,0.919595f,-0.0598771f, -0.442705f,0.896663f,-0.00260706f, -0.330753f,0.943188f,0.0316099f, -0.0976556f,0.983098f,0.154858f, --0.0408134f,0.964902f,0.259421f, --0.0353778f,0.920067f,0.39016f, --0.0336634f,0.909873f,0.413518f, --0.27131f,0.928078f,0.255075f, --0.276299f,0.942343f,0.188808f, --0.178846f,0.97249f,0.149254f, --0.173925f,0.95192f,0.252185f, --0.312455f,0.905292f,0.287781f, --0.299358f,0.905887f,0.299588f, --0.361522f,0.88183f,0.302783f, --0.474485f,0.805519f,0.35497f, --0.514467f,0.728892f,0.451708f, --0.495653f,0.729457f,0.471404f, --0.395267f,0.75904f,0.517322f, --0.414244f,0.765988f,0.491594f, --0.375453f,0.800102f,0.467837f, --0.23686f,0.857078f,0.457509f, --0.153599f,0.897001f,0.414483f, --0.139778f,0.900978f,0.410733f, --0.246424f,0.968956f,-0.0200009f, --0.187575f,0.975459f,0.115309f, --0.169324f,0.958565f,0.229092f, --0.227196f,0.942917f,0.243495f, --0.216356f,0.935609f,0.278972f, --0.279085f,0.916546f,0.286453f, --0.337088f,0.885038f,0.32106f, --0.317388f,0.891504f,0.323242f, --0.400555f,0.875243f,0.271117f, --0.420396f,0.865286f,0.273034f, --0.438864f,0.863369f,0.248983f, --0.296161f,0.903481f,0.309855f, --0.22181f,0.945018f,0.240296f, --0.217483f,0.959525f,0.178924f, --0.432196f,0.899705f,0.0611361f, --0.592514f,0.805005f,-0.029893f, --0.445437f,0.89528f,0.00770123f, --0.444106f,0.895735f,-0.0207082f, --0.441178f,0.89658f,-0.0387967f, --0.433316f,0.896401f,-0.0932815f, --0.448061f,0.893999f,-0.00273746f, --0.479681f,0.876222f,0.046264f, --0.38049f,0.918735f,0.105607f, --0.274091f,0.928692f,0.249812f, --0.115693f,0.919238f,0.37632f, --0.109076f,0.943601f,0.312601f, --0.183297f,0.969532f,0.162513f, --0.0200265f,0.998099f,0.0582807f, -0.217564f,0.969248f,0.114995f, -0.107422f,0.986137f,0.126469f, --0.0101958f,0.999802f,0.0170616f, -0.0917708f,0.993871f,-0.0616322f, -0.259886f,0.964354f,-0.049807f, -0.22181f,0.965636f,-0.135454f, -0.11068f,0.965795f,-0.234499f, -0.156396f,0.962982f,-0.219561f, -0.0996902f,0.954613f,-0.28067f, -0.240821f,0.930419f,-0.276271f, -0.362585f,0.892287f,-0.268992f, -0.39828f,0.905306f,-0.147629f, -0.377219f,0.92249f,-0.0819651f, -0.379471f,0.918832f,-0.108391f, -0.428571f,0.902988f,-0.0306522f, -0.390587f,0.920304f,0.0219829f, -0.365451f,0.930816f,-0.00527733f, -0.226127f,0.963781f,0.141399f, --0.014879f,0.969939f,0.242893f, --0.0990439f,0.938525f,0.330697f, --0.160986f,0.911469f,0.37856f, --0.0311141f,0.900531f,0.433676f, --0.0818559f,0.904519f,0.418503f, --0.202897f,0.939947f,0.274469f, --0.199596f,0.951915f,0.232421f, --0.290928f,0.922977f,0.251942f, --0.30301f,0.91121f,0.279072f, --0.315746f,0.908229f,0.274635f, --0.386173f,0.858884f,0.336435f, --0.56045f,0.768828f,0.307894f, --0.529456f,0.742805f,0.409776f, --0.545227f,0.770059f,0.331265f, --0.460487f,0.804404f,0.375346f, --0.384041f,0.835484f,0.393038f, --0.366328f,0.856374f,0.363907f, --0.227066f,0.886912f,0.40228f, --0.162423f,0.896635f,0.411903f, --0.18398f,0.877261f,0.443356f, --0.33059f,0.941987f,0.0580528f, --0.349053f,0.930827f,0.108275f, --0.250298f,0.937413f,0.242089f, --0.231173f,0.921233f,0.312871f, --0.267366f,0.883285f,0.385127f, --0.300638f,0.858727f,0.414975f, --0.348846f,0.869854f,0.348799f, --0.262698f,0.902187f,0.342122f, --0.319043f,0.887638f,0.33213f, --0.407631f,0.874264f,0.263628f, --0.391131f,0.891388f,0.229006f, --0.306387f,0.939971f,0.150271f, --0.172289f,0.969062f,0.176734f, --0.280735f,0.939942f,0.194158f, --0.35822f,0.876748f,0.320922f, --0.540223f,0.822439f,0.178196f, --0.415201f,0.897062f,0.151285f, --0.398489f,0.913332f,0.0838552f, --0.47388f,0.879024f,0.052479f, --0.430994f,0.889287f,0.153011f, --0.501585f,0.850518f,0.158213f, --0.493115f,0.843586f,0.212601f, --0.437044f,0.869936f,0.228482f, --0.335665f,0.928238f,0.160321f, --0.135997f,0.987913f,0.0743886f, -0.0115105f,0.995614f,0.0928467f, --0.0367985f,0.999249f,0.0121783f, -0.0254956f,0.996874f,-0.0747791f, -0.107382f,0.991622f,-0.0717932f, -0.144184f,0.989518f,0.00810907f, -0.0943487f,0.994079f,-0.0539027f, -0.124876f,0.987862f,-0.0923827f, -0.25534f,0.960035f,-0.114602f, -0.339105f,0.927956f,-0.154613f, -0.200588f,0.937015f,-0.285951f, -0.184172f,0.917658f,-0.352115f, -0.137125f,0.909076f,-0.393417f, -0.231522f,0.90798f,-0.349242f, -0.299652f,0.902049f,-0.310671f, -0.23061f,0.944613f,-0.233507f, -0.336481f,0.938772f,-0.0740748f, -0.38792f,0.918977f,-0.070704f, -0.337723f,0.938393f,-0.073227f, -0.392706f,0.919584f,-0.012147f, -0.294051f,0.954956f,-0.0399037f, -0.173344f,0.964432f,0.199555f, --0.108669f,0.967119f,0.22994f, --0.18728f,0.925976f,0.327863f, --0.156223f,0.937505f,0.310931f, --0.0961609f,0.948752f,0.301037f, --0.051031f,0.914222f,0.401987f, --0.116652f,0.921592f,0.370216f, --0.16747f,0.919727f,0.355044f, --0.233888f,0.917713f,0.321092f, --0.296558f,0.924646f,0.23892f, --0.384099f,0.898594f,0.212122f, --0.451252f,0.843433f,0.291535f, --0.561019f,0.766309f,0.313095f, --0.56702f,0.761029f,0.315156f, --0.502958f,0.815049f,0.287624f, --0.46769f,0.845823f,0.256612f, --0.438846f,0.860082f,0.260142f, --0.380472f,0.841841f,0.382812f, --0.286801f,0.84573f,0.449984f, --0.166497f,0.837941f,0.519744f, --0.237954f,0.844014f,0.480644f, --0.400938f,0.907575f,0.124721f, --0.36178f,0.91645f,0.170983f, --0.326178f,0.936068f,0.131852f, --0.348093f,0.925471f,0.149445f, --0.380521f,0.903785f,0.195901f, --0.261965f,0.932138f,0.249988f, --0.229009f,0.957451f,0.175621f, --0.296226f,0.953377f,0.0576446f, --0.385007f,0.916429f,0.109216f, --0.396898f,0.895963f,0.199304f, --0.30002f,0.927264f,0.223985f, --0.290512f,0.953204f,0.083697f, --0.240862f,0.959505f,0.146069f, --0.368638f,0.900621f,0.230189f, --0.437205f,0.833732f,0.337256f, --0.435531f,0.825298f,0.359438f, --0.382764f,0.869714f,0.311593f, --0.302351f,0.902083f,0.307944f, --0.504704f,0.84016f,0.198507f, --0.44412f,0.839306f,0.313565f, --0.494888f,0.841296f,0.217503f, --0.530329f,0.827106f,0.186138f, --0.314084f,0.933199f,0.174614f, --0.124034f,0.990967f,0.050983f, --0.0452003f,0.995178f,-0.0870557f, --0.00182424f,0.990385f,-0.138326f, --0.0388611f,0.986686f,-0.157927f, -0.0684221f,0.991564f,-0.11009f, -0.102533f,0.981475f,-0.161848f, -0.149983f,0.975213f,-0.162681f, -0.108711f,0.963953f,-0.24285f, -0.134579f,0.963238f,-0.232511f, -0.280754f,0.932346f,-0.227832f, -0.370391f,0.907723f,-0.197103f, -0.290987f,0.936165f,-0.197286f, -0.244643f,0.947659f,-0.205165f, -0.12819f,0.972148f,-0.196204f, -0.159014f,0.967422f,-0.197002f, -0.312607f,0.930748f,-0.189697f, -0.153027f,0.941997f,-0.298704f, -0.218578f,0.950985f,-0.218748f, -0.390534f,0.915543f,-0.0962525f, -0.350134f,0.933592f,-0.0762398f, -0.369694f,0.928637f,-0.030973f, -0.182224f,0.981373f,0.0608345f, --0.0452136f,0.980467f,0.191416f, --0.152401f,0.95767f,0.244216f, --0.205784f,0.951891f,0.22706f, --0.112228f,0.971017f,0.211022f, --0.130106f,0.967854f,0.215247f, --0.151633f,0.958079f,0.243087f, --0.104162f,0.953804f,0.281796f, --0.17561f,0.947845f,0.265989f, --0.209606f,0.941523f,0.263816f, --0.251275f,0.930745f,0.265659f, --0.361f,0.884718f,0.294879f, --0.50281f,0.813876f,0.291185f, --0.583247f,0.763934f,0.276094f, --0.556622f,0.802134f,0.216224f, --0.473532f,0.851987f,0.223352f, --0.473757f,0.85285f,0.219548f, --0.491496f,0.823107f,0.284477f, --0.477559f,0.793154f,0.377946f, --0.368868f,0.830921f,0.416542f, --0.202419f,0.861608f,0.465466f, --0.095407f,0.855544f,0.508864f, --0.40239f,0.909528f,0.104118f, --0.357524f,0.930915f,0.0746555f, --0.280797f,0.959558f,0.0200349f, --0.296463f,0.954936f,-0.0143765f, --0.381172f,0.918388f,-0.106166f, --0.308734f,0.946435f,-0.094572f, --0.184864f,0.981918f,-0.0407667f, --0.211096f,0.97426f,-0.0790985f, --0.431269f,0.892976f,-0.128847f, --0.508723f,0.860224f,-0.0348507f, --0.315588f,0.942693f,0.108326f, --0.229963f,0.954167f,0.191527f, --0.338476f,0.90391f,0.261495f, --0.399866f,0.843393f,0.358882f, --0.508212f,0.817205f,0.271838f, --0.45663f,0.829465f,0.321678f, --0.343829f,0.869846f,0.353765f, --0.25214f,0.908629f,0.332893f, --0.465924f,0.864347f,0.189262f, --0.451321f,0.885092f,0.11367f, --0.398038f,0.913426f,0.0849568f, --0.473433f,0.880353f,-0.0289816f, --0.282123f,0.951018f,-0.126376f, --0.111297f,0.983512f,-0.142537f, --0.0203568f,0.995748f,-0.089847f, -0.0177076f,0.998505f,-0.0517153f, --0.0210973f,0.999746f,0.00787929f, -0.0422415f,0.999104f,-0.00245387f, -0.162083f,0.986673f,-0.0143034f, -0.184873f,0.978111f,-0.0954998f, -0.225836f,0.960454f,-0.162869f, -0.105652f,0.960265f,-0.25832f, -0.22096f,0.965567f,-0.137321f, -0.306187f,0.951906f,0.0111556f, -0.252563f,0.963728f,0.0862585f, -0.185211f,0.975091f,0.122044f, -0.141716f,0.976503f,0.162355f, -0.200688f,0.976886f,0.0736112f, -0.398894f,0.916482f,0.0307355f, -0.27456f,0.96012f,-0.0527967f, -0.152825f,0.971043f,-0.183632f, -0.271211f,0.950001f,-0.154736f, -0.286301f,0.958137f,0.00244849f, -0.246502f,0.96458f,0.0939299f, -0.102065f,0.977178f,0.186298f, --0.0761105f,0.976837f,0.19999f, --0.0810786f,0.974651f,0.208524f, --0.174214f,0.975155f,0.136831f, --0.127689f,0.983595f,0.127422f, --0.123239f,0.988203f,0.0909257f, --0.173027f,0.984333f,0.033919f, --0.13019f,0.985916f,0.104975f, --0.151236f,0.977557f,0.146665f, --0.212082f,0.972216f,0.0990861f, --0.346196f,0.93167f,0.110181f, --0.461867f,0.845088f,0.269268f, --0.491314f,0.790968f,0.364663f, --0.499721f,0.798886f,0.334753f, --0.533877f,0.823302f,0.192741f, --0.489959f,0.855912f,0.165393f, --0.540105f,0.823669f,0.172786f, --0.55174f,0.789596f,0.268553f, --0.518837f,0.818462f,0.246838f, --0.35793f,0.879679f,0.31313f, --0.226645f,0.914368f,0.335505f, --0.174062f,0.93173f,0.31872f, --0.352372f,0.928926f,-0.113715f, --0.283164f,0.949292f,-0.13661f, --0.253833f,0.949289f,-0.185523f, --0.258433f,0.953837f,-0.152994f, --0.329686f,0.925665f,-0.185613f, --0.360482f,0.913899f,-0.186657f, --0.246398f,0.964945f,-0.0903879f, --0.197613f,0.98019f,0.013309f, --0.409684f,0.910684f,0.0530475f, --0.545574f,0.83677f,0.0465257f, --0.477964f,0.876264f,0.060934f, --0.386247f,0.882258f,0.269135f, --0.437443f,0.816448f,0.376904f, --0.381546f,0.830459f,0.405906f, --0.378931f,0.857772f,0.347329f, --0.484349f,0.854204f,0.189053f, --0.391934f,0.899277f,0.194136f, --0.180618f,0.947297f,0.264585f, --0.285059f,0.943094f,0.171219f, --0.41449f,0.905591f,-0.0900102f, --0.367364f,0.916679f,-0.157298f, --0.4046f,0.892318f,-0.200168f, --0.265207f,0.933534f,-0.241204f, --0.171437f,0.970625f,-0.168809f, --0.091648f,0.995789f,0.00231266f, --0.0988725f,0.989781f,0.102747f, --0.0749525f,0.978356f,0.192877f, -0.0618361f,0.988236f,0.139875f, -0.222758f,0.971067f,0.0860673f, -0.260459f,0.965435f,-0.00983276f, -0.296216f,0.954928f,-0.0191894f, -0.108089f,0.992937f,-0.0489145f, -0.0559635f,0.998425f,-0.00391097f, -0.182072f,0.980129f,0.0787236f, -0.189029f,0.972269f,0.137697f, -0.20292f,0.962368f,0.180751f, -0.162611f,0.977583f,0.133749f, -0.283117f,0.944546f,0.166365f, -0.362781f,0.917623f,0.162352f, -0.322808f,0.912852f,0.249991f, -0.306817f,0.930382f,0.200629f, -0.265368f,0.963264f,0.0412725f, -0.150516f,0.988588f,0.00624705f, -0.192187f,0.980013f,0.0513622f, -0.111093f,0.98864f,0.101236f, --0.0652663f,0.990994f,0.116922f, --0.0960853f,0.989279f,0.109972f, --0.171018f,0.980514f,0.0966674f, --0.118023f,0.981194f,0.152737f, --0.0297124f,0.980668f,0.19341f, --0.130364f,0.983461f,0.125733f, --0.228583f,0.970632f,0.0749913f, --0.187681f,0.973906f,0.127608f, --0.18184f,0.968481f,0.170233f, --0.382626f,0.904754f,0.187128f, --0.565004f,0.795638f,0.218473f, --0.54964f,0.808473f,0.210397f, --0.494188f,0.848001f,0.191501f, --0.42417f,0.88632f,0.185785f, --0.490729f,0.864039f,0.112346f, --0.547278f,0.819965f,0.167765f, --0.555649f,0.823683f,0.113141f, --0.525063f,0.850181f,0.0387426f, --0.465555f,0.881687f,0.0767294f, --0.25104f,0.948586f,0.19278f, --0.134177f,0.968986f,0.207515f, --0.358148f,0.879839f,-0.31243f, --0.281248f,0.911984f,-0.298639f, --0.261128f,0.923339f,-0.281526f, --0.281121f,0.935581f,-0.213678f, --0.316696f,0.928992f,-0.191515f, --0.378661f,0.908066f,-0.178974f, --0.357733f,0.923356f,-0.139433f, --0.295419f,0.953886f,0.0531873f, --0.456379f,0.869265f,0.18999f, --0.492836f,0.836159f,0.240731f, --0.533039f,0.832034f,0.153586f, --0.471339f,0.822176f,0.319166f, --0.417097f,0.817012f,0.398149f, --0.397475f,0.860419f,0.318894f, --0.295585f,0.889222f,0.349162f, --0.397825f,0.896297f,0.195927f, --0.426121f,0.903442f,0.0470364f, --0.225108f,0.967792f,0.11272f, --0.180332f,0.969123f,0.168172f, --0.283694f,0.958436f,-0.0303046f, --0.31011f,0.929142f,-0.201316f, --0.379988f,0.880118f,-0.284609f, --0.280631f,0.91033f,-0.304213f, --0.299273f,0.919298f,-0.255591f, --0.271669f,0.962178f,0.0202533f, --0.127278f,0.946024f,0.298058f, --0.0668081f,0.957542f,0.280447f, -0.156177f,0.962373f,0.222366f, -0.269377f,0.960799f,0.0655824f, -0.307217f,0.951527f,-0.0146071f, -0.247019f,0.968029f,-0.0436127f, -0.117286f,0.99106f,0.0635867f, -0.0498813f,0.996011f,0.0739844f, -0.194956f,0.980335f,0.0305971f, -0.139483f,0.989424f,-0.0398183f, -0.235447f,0.970519f,0.0515568f, -0.132445f,0.989845f,-0.05162f, -0.206421f,0.976844f,0.0562743f, -0.330371f,0.919083f,0.214804f, -0.266375f,0.922982f,0.277756f, -0.331232f,0.885792f,0.325049f, -0.36267f,0.895106f,0.259337f, -0.240431f,0.963714f,0.115964f, -0.171746f,0.982113f,-0.0771883f, -0.0351621f,0.99889f,-0.0313443f, --0.0882653f,0.987488f,0.130674f, --0.0658856f,0.986287f,0.151318f, --0.167193f,0.982329f,0.0841182f, --0.21476f,0.97234f,0.0918338f, --0.104496f,0.958461f,0.265392f, --0.0605561f,0.923444f,0.378926f, --0.152497f,0.949101f,0.275594f, --0.216118f,0.964594f,0.151167f, --0.26219f,0.945639f,0.192413f, --0.408309f,0.854572f,0.320922f, --0.530012f,0.797788f,0.28744f, --0.48417f,0.855541f,0.183383f, --0.504616f,0.863257f,0.012294f, --0.421367f,0.905956f,0.0411587f, --0.517653f,0.855189f,0.0262018f, --0.533316f,0.826853f,0.178574f, --0.514944f,0.854185f,0.0721125f, --0.506113f,0.861889f,-0.0315744f, --0.499639f,0.865958f,-0.0218358f, --0.302149f,0.952465f,0.038937f, --0.129933f,0.988738f,0.0742583f, -}; - -btScalar Landscape02Tex[] = { -0.0f,0.273438f, -0.0f,0.265625f, -0.0078125f,0.273438f, -0.0078125f,0.265625f, -0.015625f,0.273438f, -0.015625f,0.265625f, -0.0234375f,0.273438f, -0.0234375f,0.265625f, -0.03125f,0.273438f, -0.03125f,0.265625f, -0.0390625f,0.273438f, -0.0390625f,0.265625f, -0.046875f,0.273438f, -0.046875f,0.265625f, -0.0546875f,0.273438f, -0.0546875f,0.265625f, -0.0625f,0.273438f, -0.0625f,0.265625f, -0.0703125f,0.273438f, -0.0703125f,0.265625f, -0.078125f,0.273438f, -0.078125f,0.265625f, -0.0859375f,0.273438f, -0.0859375f,0.265625f, -0.09375f,0.273438f, -0.09375f,0.265625f, -0.101563f,0.273438f, -0.101563f,0.265625f, -0.109375f,0.273438f, -0.109375f,0.265625f, -0.117188f,0.273438f, -0.117188f,0.265625f, -0.125f,0.273438f, -0.125f,0.265625f, -0.132813f,0.273438f, -0.132813f,0.265625f, -0.140625f,0.273438f, -0.140625f,0.265625f, -0.148438f,0.273438f, -0.148438f,0.265625f, -0.15625f,0.273438f, -0.15625f,0.265625f, -0.164063f,0.273438f, -0.164063f,0.265625f, -0.171875f,0.273438f, -0.171875f,0.265625f, -0.179688f,0.273438f, -0.179688f,0.265625f, -0.1875f,0.273438f, -0.1875f,0.265625f, -0.195313f,0.273438f, -0.195313f,0.265625f, -0.203125f,0.273438f, -0.203125f,0.265625f, -0.210938f,0.273438f, -0.210938f,0.265625f, -0.21875f,0.273438f, -0.21875f,0.265625f, -0.226563f,0.273438f, -0.226563f,0.265625f, -0.234375f,0.273438f, -0.234375f,0.265625f, -0.242188f,0.273438f, -0.242188f,0.265625f, -0.25f,0.273438f, -0.25f,0.265625f, -0.257813f,0.273438f, -0.257813f,0.265625f, -0.265625f,0.273438f, -0.265625f,0.265625f, -0.273438f,0.273438f, -0.273438f,0.265625f, -0.28125f,0.273438f, -0.28125f,0.265625f, -0.289063f,0.273438f, -0.289063f,0.265625f, -0.296875f,0.273438f, -0.296875f,0.265625f, -0.304688f,0.273438f, -0.304688f,0.265625f, -0.3125f,0.273438f, -0.3125f,0.265625f, -0.320313f,0.273438f, -0.320313f,0.265625f, -0.328125f,0.273438f, -0.328125f,0.265625f, -0.335938f,0.273438f, -0.335938f,0.265625f, -0.34375f,0.273438f, -0.34375f,0.265625f, -0.351563f,0.273438f, -0.351563f,0.265625f, -0.359375f,0.273438f, -0.359375f,0.265625f, -0.367188f,0.273438f, -0.367188f,0.265625f, -0.375f,0.273438f, -0.375f,0.265625f, -0.382813f,0.273438f, -0.382813f,0.265625f, -0.390625f,0.273438f, -0.390625f,0.265625f, -0.398438f,0.273438f, -0.398438f,0.265625f, -0.40625f,0.273438f, -0.40625f,0.265625f, -0.414063f,0.273438f, -0.414063f,0.265625f, -0.421875f,0.273438f, -0.421875f,0.265625f, -0.429688f,0.273438f, -0.429688f,0.265625f, -0.4375f,0.273438f, -0.4375f,0.265625f, -0.445313f,0.273438f, -0.445313f,0.265625f, -0.453125f,0.273438f, -0.453125f,0.265625f, -0.460938f,0.273438f, -0.460938f,0.265625f, -0.46875f,0.273438f, -0.46875f,0.265625f, -0.476563f,0.273438f, -0.476563f,0.265625f, -0.484375f,0.273438f, -0.484375f,0.265625f, -0.492188f,0.273438f, -0.492188f,0.265625f, -0.5f,0.273438f, -0.5f,0.265625f, -0.507813f,0.273438f, -0.507813f,0.265625f, -0.0f,0.28125f, -0.0078125f,0.28125f, -0.015625f,0.28125f, -0.0234375f,0.28125f, -0.03125f,0.28125f, -0.0390625f,0.28125f, -0.046875f,0.28125f, -0.0546875f,0.28125f, -0.0625f,0.28125f, -0.0703125f,0.28125f, -0.078125f,0.28125f, -0.0859375f,0.28125f, -0.09375f,0.28125f, -0.101563f,0.28125f, -0.109375f,0.28125f, -0.117188f,0.28125f, -0.125f,0.28125f, -0.132813f,0.28125f, -0.140625f,0.28125f, -0.148438f,0.28125f, -0.15625f,0.28125f, -0.164063f,0.28125f, -0.171875f,0.28125f, -0.179688f,0.28125f, -0.1875f,0.28125f, -0.195313f,0.28125f, -0.203125f,0.28125f, -0.210938f,0.28125f, -0.21875f,0.28125f, -0.226563f,0.28125f, -0.234375f,0.28125f, -0.242188f,0.28125f, -0.25f,0.28125f, -0.257813f,0.28125f, -0.265625f,0.28125f, -0.273438f,0.28125f, -0.28125f,0.28125f, -0.289063f,0.28125f, -0.296875f,0.28125f, -0.304688f,0.28125f, -0.3125f,0.28125f, -0.320313f,0.28125f, -0.328125f,0.28125f, -0.335938f,0.28125f, -0.34375f,0.28125f, -0.351563f,0.28125f, -0.359375f,0.28125f, -0.367188f,0.28125f, -0.375f,0.28125f, -0.382813f,0.28125f, -0.390625f,0.28125f, -0.398438f,0.28125f, -0.40625f,0.28125f, -0.414063f,0.28125f, -0.421875f,0.28125f, -0.429688f,0.28125f, -0.4375f,0.28125f, -0.445313f,0.28125f, -0.453125f,0.28125f, -0.460938f,0.28125f, -0.46875f,0.28125f, -0.476563f,0.28125f, -0.484375f,0.28125f, -0.492188f,0.28125f, -0.5f,0.28125f, -0.507813f,0.28125f, -0.0f,0.289063f, -0.0078125f,0.289063f, -0.015625f,0.289063f, -0.0234375f,0.289063f, -0.03125f,0.289063f, -0.0390625f,0.289063f, -0.046875f,0.289063f, -0.0546875f,0.289063f, -0.0625f,0.289063f, -0.0703125f,0.289063f, -0.078125f,0.289063f, -0.0859375f,0.289063f, -0.09375f,0.289063f, -0.101563f,0.289063f, -0.109375f,0.289063f, -0.117188f,0.289063f, -0.125f,0.289063f, -0.132813f,0.289063f, -0.140625f,0.289063f, -0.148438f,0.289063f, -0.15625f,0.289063f, -0.164063f,0.289063f, -0.171875f,0.289063f, -0.179688f,0.289063f, -0.1875f,0.289063f, -0.195313f,0.289063f, -0.203125f,0.289063f, -0.210938f,0.289063f, -0.21875f,0.289063f, -0.226563f,0.289063f, -0.234375f,0.289063f, -0.242188f,0.289063f, -0.25f,0.289063f, -0.257813f,0.289063f, -0.265625f,0.289063f, -0.273438f,0.289063f, -0.28125f,0.289063f, -0.289063f,0.289063f, -0.296875f,0.289063f, -0.304688f,0.289063f, -0.3125f,0.289063f, -0.320313f,0.289063f, -0.328125f,0.289063f, -0.335938f,0.289063f, -0.34375f,0.289063f, -0.351563f,0.289063f, -0.359375f,0.289063f, -0.367188f,0.289063f, -0.375f,0.289063f, -0.382813f,0.289063f, -0.390625f,0.289063f, -0.398438f,0.289063f, -0.40625f,0.289063f, -0.414063f,0.289063f, -0.421875f,0.289063f, -0.429688f,0.289063f, -0.4375f,0.289063f, -0.445313f,0.289063f, -0.453125f,0.289063f, -0.460938f,0.289063f, -0.46875f,0.289063f, -0.476563f,0.289063f, -0.484375f,0.289063f, -0.492188f,0.289063f, -0.5f,0.289063f, -0.507813f,0.289063f, -0.0f,0.296875f, -0.0078125f,0.296875f, -0.015625f,0.296875f, -0.0234375f,0.296875f, -0.03125f,0.296875f, -0.0390625f,0.296875f, -0.046875f,0.296875f, -0.0546875f,0.296875f, -0.0625f,0.296875f, -0.0703125f,0.296875f, -0.078125f,0.296875f, -0.0859375f,0.296875f, -0.09375f,0.296875f, -0.101563f,0.296875f, -0.109375f,0.296875f, -0.117188f,0.296875f, -0.125f,0.296875f, -0.132813f,0.296875f, -0.140625f,0.296875f, -0.148438f,0.296875f, -0.15625f,0.296875f, -0.164063f,0.296875f, -0.171875f,0.296875f, -0.179688f,0.296875f, -0.1875f,0.296875f, -0.195313f,0.296875f, -0.203125f,0.296875f, -0.210938f,0.296875f, -0.21875f,0.296875f, -0.226563f,0.296875f, -0.234375f,0.296875f, -0.242188f,0.296875f, -0.25f,0.296875f, -0.257813f,0.296875f, -0.265625f,0.296875f, -0.273438f,0.296875f, -0.28125f,0.296875f, -0.289063f,0.296875f, -0.296875f,0.296875f, -0.304688f,0.296875f, -0.3125f,0.296875f, -0.320313f,0.296875f, -0.328125f,0.296875f, -0.335938f,0.296875f, -0.34375f,0.296875f, -0.351563f,0.296875f, -0.359375f,0.296875f, -0.367188f,0.296875f, -0.375f,0.296875f, -0.382813f,0.296875f, -0.390625f,0.296875f, -0.398438f,0.296875f, -0.40625f,0.296875f, -0.414063f,0.296875f, -0.421875f,0.296875f, -0.429688f,0.296875f, -0.4375f,0.296875f, -0.445313f,0.296875f, -0.453125f,0.296875f, -0.460938f,0.296875f, -0.46875f,0.296875f, -0.476563f,0.296875f, -0.484375f,0.296875f, -0.492188f,0.296875f, -0.5f,0.296875f, -0.507813f,0.296875f, -0.0f,0.304688f, -0.0078125f,0.304688f, -0.015625f,0.304688f, -0.0234375f,0.304688f, -0.03125f,0.304688f, -0.0390625f,0.304688f, -0.046875f,0.304688f, -0.0546875f,0.304688f, -0.0625f,0.304688f, -0.0703125f,0.304688f, -0.078125f,0.304688f, -0.0859375f,0.304688f, -0.09375f,0.304688f, -0.101563f,0.304688f, -0.109375f,0.304688f, -0.117188f,0.304688f, -0.125f,0.304688f, -0.132813f,0.304688f, -0.140625f,0.304688f, -0.148438f,0.304688f, -0.15625f,0.304688f, -0.164063f,0.304688f, -0.171875f,0.304688f, -0.179688f,0.304688f, -0.1875f,0.304688f, -0.195313f,0.304688f, -0.203125f,0.304688f, -0.210938f,0.304688f, -0.21875f,0.304688f, -0.226563f,0.304688f, -0.234375f,0.304688f, -0.242188f,0.304688f, -0.25f,0.304688f, -0.257813f,0.304688f, -0.265625f,0.304688f, -0.273438f,0.304688f, -0.28125f,0.304688f, -0.289063f,0.304688f, -0.296875f,0.304688f, -0.304688f,0.304688f, -0.3125f,0.304688f, -0.320313f,0.304688f, -0.328125f,0.304688f, -0.335938f,0.304688f, -0.34375f,0.304688f, -0.351563f,0.304688f, -0.359375f,0.304688f, -0.367188f,0.304688f, -0.375f,0.304688f, -0.382813f,0.304688f, -0.390625f,0.304688f, -0.398438f,0.304688f, -0.40625f,0.304688f, -0.414063f,0.304688f, -0.421875f,0.304688f, -0.429688f,0.304688f, -0.4375f,0.304688f, -0.445313f,0.304688f, -0.453125f,0.304688f, -0.460938f,0.304688f, -0.46875f,0.304688f, -0.476563f,0.304688f, -0.484375f,0.304688f, -0.492188f,0.304688f, -0.5f,0.304688f, -0.507813f,0.304688f, -0.0f,0.3125f, -0.0078125f,0.3125f, -0.015625f,0.3125f, -0.0234375f,0.3125f, -0.03125f,0.3125f, -0.0390625f,0.3125f, -0.046875f,0.3125f, -0.0546875f,0.3125f, -0.0625f,0.3125f, -0.0703125f,0.3125f, -0.078125f,0.3125f, -0.0859375f,0.3125f, -0.09375f,0.3125f, -0.101563f,0.3125f, -0.109375f,0.3125f, -0.117188f,0.3125f, -0.125f,0.3125f, -0.132813f,0.3125f, -0.140625f,0.3125f, -0.148438f,0.3125f, -0.15625f,0.3125f, -0.164063f,0.3125f, -0.171875f,0.3125f, -0.179688f,0.3125f, -0.1875f,0.3125f, -0.195313f,0.3125f, -0.203125f,0.3125f, -0.210938f,0.3125f, -0.21875f,0.3125f, -0.226563f,0.3125f, -0.234375f,0.3125f, -0.242188f,0.3125f, -0.25f,0.3125f, -0.257813f,0.3125f, -0.265625f,0.3125f, -0.273438f,0.3125f, -0.28125f,0.3125f, -0.289063f,0.3125f, -0.296875f,0.3125f, -0.304688f,0.3125f, -0.3125f,0.3125f, -0.320313f,0.3125f, -0.328125f,0.3125f, -0.335938f,0.3125f, -0.34375f,0.3125f, -0.351563f,0.3125f, -0.359375f,0.3125f, -0.367188f,0.3125f, -0.375f,0.3125f, -0.382813f,0.3125f, -0.390625f,0.3125f, -0.398438f,0.3125f, -0.40625f,0.3125f, -0.414063f,0.3125f, -0.421875f,0.3125f, -0.429688f,0.3125f, -0.4375f,0.3125f, -0.445313f,0.3125f, -0.453125f,0.3125f, -0.460938f,0.3125f, -0.46875f,0.3125f, -0.476563f,0.3125f, -0.484375f,0.3125f, -0.492188f,0.3125f, -0.5f,0.3125f, -0.507813f,0.3125f, -0.0f,0.320313f, -0.0078125f,0.320313f, -0.015625f,0.320313f, -0.0234375f,0.320313f, -0.03125f,0.320313f, -0.0390625f,0.320313f, -0.046875f,0.320313f, -0.0546875f,0.320313f, -0.0625f,0.320313f, -0.0703125f,0.320313f, -0.078125f,0.320313f, -0.0859375f,0.320313f, -0.09375f,0.320313f, -0.101563f,0.320313f, -0.109375f,0.320313f, -0.117188f,0.320313f, -0.125f,0.320313f, -0.132813f,0.320313f, -0.140625f,0.320313f, -0.148438f,0.320313f, -0.15625f,0.320313f, -0.164063f,0.320313f, -0.171875f,0.320313f, -0.179688f,0.320313f, -0.1875f,0.320313f, -0.195313f,0.320313f, -0.203125f,0.320313f, -0.210938f,0.320313f, -0.21875f,0.320313f, -0.226563f,0.320313f, -0.234375f,0.320313f, -0.242188f,0.320313f, -0.25f,0.320313f, -0.257813f,0.320313f, -0.265625f,0.320313f, -0.273438f,0.320313f, -0.28125f,0.320313f, -0.289063f,0.320313f, -0.296875f,0.320313f, -0.304688f,0.320313f, -0.3125f,0.320313f, -0.320313f,0.320313f, -0.328125f,0.320313f, -0.335938f,0.320313f, -0.34375f,0.320313f, -0.351563f,0.320313f, -0.359375f,0.320313f, -0.367188f,0.320313f, -0.375f,0.320313f, -0.382813f,0.320313f, -0.390625f,0.320313f, -0.398438f,0.320313f, -0.40625f,0.320313f, -0.414063f,0.320313f, -0.421875f,0.320313f, -0.429688f,0.320313f, -0.4375f,0.320313f, -0.445313f,0.320313f, -0.453125f,0.320313f, -0.460938f,0.320313f, -0.46875f,0.320313f, -0.476563f,0.320313f, -0.484375f,0.320313f, -0.492188f,0.320313f, -0.5f,0.320313f, -0.507813f,0.320313f, -0.0f,0.328125f, -0.0078125f,0.328125f, -0.015625f,0.328125f, -0.0234375f,0.328125f, -0.03125f,0.328125f, -0.0390625f,0.328125f, -0.046875f,0.328125f, -0.0546875f,0.328125f, -0.0625f,0.328125f, -0.0703125f,0.328125f, -0.078125f,0.328125f, -0.0859375f,0.328125f, -0.09375f,0.328125f, -0.101563f,0.328125f, -0.109375f,0.328125f, -0.117188f,0.328125f, -0.125f,0.328125f, -0.132813f,0.328125f, -0.140625f,0.328125f, -0.148438f,0.328125f, -0.15625f,0.328125f, -0.164063f,0.328125f, -0.171875f,0.328125f, -0.179688f,0.328125f, -0.1875f,0.328125f, -0.195313f,0.328125f, -0.203125f,0.328125f, -0.210938f,0.328125f, -0.21875f,0.328125f, -0.226563f,0.328125f, -0.234375f,0.328125f, -0.242188f,0.328125f, -0.25f,0.328125f, -0.257813f,0.328125f, -0.265625f,0.328125f, -0.273438f,0.328125f, -0.28125f,0.328125f, -0.289063f,0.328125f, -0.296875f,0.328125f, -0.304688f,0.328125f, -0.3125f,0.328125f, -0.320313f,0.328125f, -0.328125f,0.328125f, -0.335938f,0.328125f, -0.34375f,0.328125f, -0.351563f,0.328125f, -0.359375f,0.328125f, -0.367188f,0.328125f, -0.375f,0.328125f, -0.382813f,0.328125f, -0.390625f,0.328125f, -0.398438f,0.328125f, -0.40625f,0.328125f, -0.414063f,0.328125f, -0.421875f,0.328125f, -0.429688f,0.328125f, -0.4375f,0.328125f, -0.445313f,0.328125f, -0.453125f,0.328125f, -0.460938f,0.328125f, -0.46875f,0.328125f, -0.476563f,0.328125f, -0.484375f,0.328125f, -0.492188f,0.328125f, -0.5f,0.328125f, -0.507813f,0.328125f, -0.0f,0.335938f, -0.0078125f,0.335938f, -0.015625f,0.335938f, -0.0234375f,0.335938f, -0.03125f,0.335938f, -0.0390625f,0.335938f, -0.046875f,0.335938f, -0.0546875f,0.335938f, -0.0625f,0.335938f, -0.0703125f,0.335938f, -0.078125f,0.335938f, -0.0859375f,0.335938f, -0.09375f,0.335938f, -0.101563f,0.335938f, -0.109375f,0.335938f, -0.117188f,0.335938f, -0.125f,0.335938f, -0.132813f,0.335938f, -0.140625f,0.335938f, -0.148438f,0.335938f, -0.15625f,0.335938f, -0.164063f,0.335938f, -0.171875f,0.335938f, -0.179688f,0.335938f, -0.1875f,0.335938f, -0.195313f,0.335938f, -0.203125f,0.335938f, -0.210938f,0.335938f, -0.21875f,0.335938f, -0.226563f,0.335938f, -0.234375f,0.335938f, -0.242188f,0.335938f, -0.25f,0.335938f, -0.257813f,0.335938f, -0.265625f,0.335938f, -0.273438f,0.335938f, -0.28125f,0.335938f, -0.289063f,0.335938f, -0.296875f,0.335938f, -0.304688f,0.335938f, -0.3125f,0.335938f, -0.320313f,0.335938f, -0.328125f,0.335938f, -0.335938f,0.335938f, -0.34375f,0.335938f, -0.351563f,0.335938f, -0.359375f,0.335938f, -0.367188f,0.335938f, -0.375f,0.335938f, -0.382813f,0.335938f, -0.390625f,0.335938f, -0.398438f,0.335938f, -0.40625f,0.335938f, -0.414063f,0.335938f, -0.421875f,0.335938f, -0.429688f,0.335938f, -0.4375f,0.335938f, -0.445313f,0.335938f, -0.453125f,0.335938f, -0.460938f,0.335938f, -0.46875f,0.335938f, -0.476563f,0.335938f, -0.484375f,0.335938f, -0.492188f,0.335938f, -0.5f,0.335938f, -0.507813f,0.335938f, -0.0f,0.34375f, -0.0078125f,0.34375f, -0.015625f,0.34375f, -0.0234375f,0.34375f, -0.03125f,0.34375f, -0.0390625f,0.34375f, -0.046875f,0.34375f, -0.0546875f,0.34375f, -0.0625f,0.34375f, -0.0703125f,0.34375f, -0.078125f,0.34375f, -0.0859375f,0.34375f, -0.09375f,0.34375f, -0.101563f,0.34375f, -0.109375f,0.34375f, -0.117188f,0.34375f, -0.125f,0.34375f, -0.132813f,0.34375f, -0.140625f,0.34375f, -0.148438f,0.34375f, -0.15625f,0.34375f, -0.164063f,0.34375f, -0.171875f,0.34375f, -0.179688f,0.34375f, -0.1875f,0.34375f, -0.195313f,0.34375f, -0.203125f,0.34375f, -0.210938f,0.34375f, -0.21875f,0.34375f, -0.226563f,0.34375f, -0.234375f,0.34375f, -0.242188f,0.34375f, -0.25f,0.34375f, -0.257813f,0.34375f, -0.265625f,0.34375f, -0.273438f,0.34375f, -0.28125f,0.34375f, -0.289063f,0.34375f, -0.296875f,0.34375f, -0.304688f,0.34375f, -0.3125f,0.34375f, -0.320313f,0.34375f, -0.328125f,0.34375f, -0.335938f,0.34375f, -0.34375f,0.34375f, -0.351563f,0.34375f, -0.359375f,0.34375f, -0.367188f,0.34375f, -0.375f,0.34375f, -0.382813f,0.34375f, -0.390625f,0.34375f, -0.398438f,0.34375f, -0.40625f,0.34375f, -0.414063f,0.34375f, -0.421875f,0.34375f, -0.429688f,0.34375f, -0.4375f,0.34375f, -0.445313f,0.34375f, -0.453125f,0.34375f, -0.460938f,0.34375f, -0.46875f,0.34375f, -0.476563f,0.34375f, -0.484375f,0.34375f, -0.492188f,0.34375f, -0.5f,0.34375f, -0.507813f,0.34375f, -0.0f,0.351563f, -0.0078125f,0.351563f, -0.015625f,0.351563f, -0.0234375f,0.351563f, -0.03125f,0.351563f, -0.0390625f,0.351563f, -0.046875f,0.351563f, -0.0546875f,0.351563f, -0.0625f,0.351563f, -0.0703125f,0.351563f, -0.078125f,0.351563f, -0.0859375f,0.351563f, -0.09375f,0.351563f, -0.101563f,0.351563f, -0.109375f,0.351563f, -0.117188f,0.351563f, -0.125f,0.351563f, -0.132813f,0.351563f, -0.140625f,0.351563f, -0.148438f,0.351563f, -0.15625f,0.351563f, -0.164063f,0.351563f, -0.171875f,0.351563f, -0.179688f,0.351563f, -0.1875f,0.351563f, -0.195313f,0.351563f, -0.203125f,0.351563f, -0.210938f,0.351563f, -0.21875f,0.351563f, -0.226563f,0.351563f, -0.234375f,0.351563f, -0.242188f,0.351563f, -0.25f,0.351563f, -0.257813f,0.351563f, -0.265625f,0.351563f, -0.273438f,0.351563f, -0.28125f,0.351563f, -0.289063f,0.351563f, -0.296875f,0.351563f, -0.304688f,0.351563f, -0.3125f,0.351563f, -0.320313f,0.351563f, -0.328125f,0.351563f, -0.335938f,0.351563f, -0.34375f,0.351563f, -0.351563f,0.351563f, -0.359375f,0.351563f, -0.367188f,0.351563f, -0.375f,0.351563f, -0.382813f,0.351563f, -0.390625f,0.351563f, -0.398438f,0.351563f, -0.40625f,0.351563f, -0.414063f,0.351563f, -0.421875f,0.351563f, -0.429688f,0.351563f, -0.4375f,0.351563f, -0.445313f,0.351563f, -0.453125f,0.351563f, -0.460938f,0.351563f, -0.46875f,0.351563f, -0.476563f,0.351563f, -0.484375f,0.351563f, -0.492188f,0.351563f, -0.5f,0.351563f, -0.507813f,0.351563f, -0.0f,0.359375f, -0.0078125f,0.359375f, -0.015625f,0.359375f, -0.0234375f,0.359375f, -0.03125f,0.359375f, -0.0390625f,0.359375f, -0.046875f,0.359375f, -0.0546875f,0.359375f, -0.0625f,0.359375f, -0.0703125f,0.359375f, -0.078125f,0.359375f, -0.0859375f,0.359375f, -0.09375f,0.359375f, -0.101563f,0.359375f, -0.109375f,0.359375f, -0.117188f,0.359375f, -0.125f,0.359375f, -0.132813f,0.359375f, -0.140625f,0.359375f, -0.148438f,0.359375f, -0.15625f,0.359375f, -0.164063f,0.359375f, -0.171875f,0.359375f, -0.179688f,0.359375f, -0.1875f,0.359375f, -0.195313f,0.359375f, -0.203125f,0.359375f, -0.210938f,0.359375f, -0.21875f,0.359375f, -0.226563f,0.359375f, -0.234375f,0.359375f, -0.242188f,0.359375f, -0.25f,0.359375f, -0.257813f,0.359375f, -0.265625f,0.359375f, -0.273438f,0.359375f, -0.28125f,0.359375f, -0.289063f,0.359375f, -0.296875f,0.359375f, -0.304688f,0.359375f, -0.3125f,0.359375f, -0.320313f,0.359375f, -0.328125f,0.359375f, -0.335938f,0.359375f, -0.34375f,0.359375f, -0.351563f,0.359375f, -0.359375f,0.359375f, -0.367188f,0.359375f, -0.375f,0.359375f, -0.382813f,0.359375f, -0.390625f,0.359375f, -0.398438f,0.359375f, -0.40625f,0.359375f, -0.414063f,0.359375f, -0.421875f,0.359375f, -0.429688f,0.359375f, -0.4375f,0.359375f, -0.445313f,0.359375f, -0.453125f,0.359375f, -0.460938f,0.359375f, -0.46875f,0.359375f, -0.476563f,0.359375f, -0.484375f,0.359375f, -0.492188f,0.359375f, -0.5f,0.359375f, -0.507813f,0.359375f, -0.0f,0.367188f, -0.0078125f,0.367188f, -0.015625f,0.367188f, -0.0234375f,0.367188f, -0.03125f,0.367188f, -0.0390625f,0.367188f, -0.046875f,0.367188f, -0.0546875f,0.367188f, -0.0625f,0.367188f, -0.0703125f,0.367188f, -0.078125f,0.367188f, -0.0859375f,0.367188f, -0.09375f,0.367188f, -0.101563f,0.367188f, -0.109375f,0.367188f, -0.117188f,0.367188f, -0.125f,0.367188f, -0.132813f,0.367188f, -0.140625f,0.367188f, -0.148438f,0.367188f, -0.15625f,0.367188f, -0.164063f,0.367188f, -0.171875f,0.367188f, -0.179688f,0.367188f, -0.1875f,0.367188f, -0.195313f,0.367188f, -0.203125f,0.367188f, -0.210938f,0.367188f, -0.21875f,0.367188f, -0.226563f,0.367188f, -0.234375f,0.367188f, -0.242188f,0.367188f, -0.25f,0.367188f, -0.257813f,0.367188f, -0.265625f,0.367188f, -0.273438f,0.367188f, -0.28125f,0.367188f, -0.289063f,0.367188f, -0.296875f,0.367188f, -0.304688f,0.367188f, -0.3125f,0.367188f, -0.320313f,0.367188f, -0.328125f,0.367188f, -0.335938f,0.367188f, -0.34375f,0.367188f, -0.351563f,0.367188f, -0.359375f,0.367188f, -0.367188f,0.367188f, -0.375f,0.367188f, -0.382813f,0.367188f, -0.390625f,0.367188f, -0.398438f,0.367188f, -0.40625f,0.367188f, -0.414063f,0.367188f, -0.421875f,0.367188f, -0.429688f,0.367188f, -0.4375f,0.367188f, -0.445313f,0.367188f, -0.453125f,0.367188f, -0.460938f,0.367188f, -0.46875f,0.367188f, -0.476563f,0.367188f, -0.484375f,0.367188f, -0.492188f,0.367188f, -0.5f,0.367188f, -0.507813f,0.367188f, -0.0f,0.375f, -0.0078125f,0.375f, -0.015625f,0.375f, -0.0234375f,0.375f, -0.03125f,0.375f, -0.0390625f,0.375f, -0.046875f,0.375f, -0.0546875f,0.375f, -0.0625f,0.375f, -0.0703125f,0.375f, -0.078125f,0.375f, -0.0859375f,0.375f, -0.09375f,0.375f, -0.101563f,0.375f, -0.109375f,0.375f, -0.117188f,0.375f, -0.125f,0.375f, -0.132813f,0.375f, -0.140625f,0.375f, -0.148438f,0.375f, -0.15625f,0.375f, -0.164063f,0.375f, -0.171875f,0.375f, -0.179688f,0.375f, -0.1875f,0.375f, -0.195313f,0.375f, -0.203125f,0.375f, -0.210938f,0.375f, -0.21875f,0.375f, -0.226563f,0.375f, -0.234375f,0.375f, -0.242188f,0.375f, -0.25f,0.375f, -0.257813f,0.375f, -0.265625f,0.375f, -0.273438f,0.375f, -0.28125f,0.375f, -0.289063f,0.375f, -0.296875f,0.375f, -0.304688f,0.375f, -0.3125f,0.375f, -0.320313f,0.375f, -0.328125f,0.375f, -0.335938f,0.375f, -0.34375f,0.375f, -0.351563f,0.375f, -0.359375f,0.375f, -0.367188f,0.375f, -0.375f,0.375f, -0.382813f,0.375f, -0.390625f,0.375f, -0.398438f,0.375f, -0.40625f,0.375f, -0.414063f,0.375f, -0.421875f,0.375f, -0.429688f,0.375f, -0.4375f,0.375f, -0.445313f,0.375f, -0.453125f,0.375f, -0.460938f,0.375f, -0.46875f,0.375f, -0.476563f,0.375f, -0.484375f,0.375f, -0.492188f,0.375f, -0.5f,0.375f, -0.507813f,0.375f, -0.0f,0.382813f, -0.0078125f,0.382813f, -0.015625f,0.382813f, -0.0234375f,0.382813f, -0.03125f,0.382813f, -0.0390625f,0.382813f, -0.046875f,0.382813f, -0.0546875f,0.382813f, -0.0625f,0.382813f, -0.0703125f,0.382813f, -0.078125f,0.382813f, -0.0859375f,0.382813f, -0.09375f,0.382813f, -0.101563f,0.382813f, -0.109375f,0.382813f, -0.117188f,0.382813f, -0.125f,0.382813f, -0.132813f,0.382813f, -0.140625f,0.382813f, -0.148438f,0.382813f, -0.15625f,0.382813f, -0.164063f,0.382813f, -0.171875f,0.382813f, -0.179688f,0.382813f, -0.1875f,0.382813f, -0.195313f,0.382813f, -0.203125f,0.382813f, -0.210938f,0.382813f, -0.21875f,0.382813f, -0.226563f,0.382813f, -0.234375f,0.382813f, -0.242188f,0.382813f, -0.25f,0.382813f, -0.257813f,0.382813f, -0.265625f,0.382813f, -0.273438f,0.382813f, -0.28125f,0.382813f, -0.289063f,0.382813f, -0.296875f,0.382813f, -0.304688f,0.382813f, -0.3125f,0.382813f, -0.320313f,0.382813f, -0.328125f,0.382813f, -0.335938f,0.382813f, -0.34375f,0.382813f, -0.351563f,0.382813f, -0.359375f,0.382813f, -0.367188f,0.382813f, -0.375f,0.382813f, -0.382813f,0.382813f, -0.390625f,0.382813f, -0.398438f,0.382813f, -0.40625f,0.382813f, -0.414063f,0.382813f, -0.421875f,0.382813f, -0.429688f,0.382813f, -0.4375f,0.382813f, -0.445313f,0.382813f, -0.453125f,0.382813f, -0.460938f,0.382813f, -0.46875f,0.382813f, -0.476563f,0.382813f, -0.484375f,0.382813f, -0.492188f,0.382813f, -0.5f,0.382813f, -0.507813f,0.382813f, -0.0f,0.390625f, -0.0078125f,0.390625f, -0.015625f,0.390625f, -0.0234375f,0.390625f, -0.03125f,0.390625f, -0.0390625f,0.390625f, -0.046875f,0.390625f, -0.0546875f,0.390625f, -0.0625f,0.390625f, -0.0703125f,0.390625f, -0.078125f,0.390625f, -0.0859375f,0.390625f, -0.09375f,0.390625f, -0.101563f,0.390625f, -0.109375f,0.390625f, -0.117188f,0.390625f, -0.125f,0.390625f, -0.132813f,0.390625f, -0.140625f,0.390625f, -0.148438f,0.390625f, -0.15625f,0.390625f, -0.164063f,0.390625f, -0.171875f,0.390625f, -0.179688f,0.390625f, -0.1875f,0.390625f, -0.195313f,0.390625f, -0.203125f,0.390625f, -0.210938f,0.390625f, -0.21875f,0.390625f, -0.226563f,0.390625f, -0.234375f,0.390625f, -0.242188f,0.390625f, -0.25f,0.390625f, -0.257813f,0.390625f, -0.265625f,0.390625f, -0.273438f,0.390625f, -0.28125f,0.390625f, -0.289063f,0.390625f, -0.296875f,0.390625f, -0.304688f,0.390625f, -0.3125f,0.390625f, -0.320313f,0.390625f, -0.328125f,0.390625f, -0.335938f,0.390625f, -0.34375f,0.390625f, -0.351563f,0.390625f, -0.359375f,0.390625f, -0.367188f,0.390625f, -0.375f,0.390625f, -0.382813f,0.390625f, -0.390625f,0.390625f, -0.398438f,0.390625f, -0.40625f,0.390625f, -0.414063f,0.390625f, -0.421875f,0.390625f, -0.429688f,0.390625f, -0.4375f,0.390625f, -0.445313f,0.390625f, -0.453125f,0.390625f, -0.460938f,0.390625f, -0.46875f,0.390625f, -0.476563f,0.390625f, -0.484375f,0.390625f, -0.492188f,0.390625f, -0.5f,0.390625f, -0.507813f,0.390625f, -0.0f,0.398438f, -0.0078125f,0.398438f, -0.015625f,0.398438f, -0.0234375f,0.398438f, -0.03125f,0.398438f, -0.0390625f,0.398438f, -0.046875f,0.398438f, -0.0546875f,0.398438f, -0.0625f,0.398438f, -0.0703125f,0.398438f, -0.078125f,0.398438f, -0.0859375f,0.398438f, -0.09375f,0.398438f, -0.101563f,0.398438f, -0.109375f,0.398438f, -0.117188f,0.398438f, -0.125f,0.398438f, -0.132813f,0.398438f, -0.140625f,0.398438f, -0.148438f,0.398438f, -0.15625f,0.398438f, -0.164063f,0.398438f, -0.171875f,0.398438f, -0.179688f,0.398438f, -0.1875f,0.398438f, -0.195313f,0.398438f, -0.203125f,0.398438f, -0.210938f,0.398438f, -0.21875f,0.398438f, -0.226563f,0.398438f, -0.234375f,0.398438f, -0.242188f,0.398438f, -0.25f,0.398438f, -0.257813f,0.398438f, -0.265625f,0.398438f, -0.273438f,0.398438f, -0.28125f,0.398438f, -0.289063f,0.398438f, -0.296875f,0.398438f, -0.304688f,0.398438f, -0.3125f,0.398438f, -0.320313f,0.398438f, -0.328125f,0.398438f, -0.335938f,0.398438f, -0.34375f,0.398438f, -0.351563f,0.398438f, -0.359375f,0.398438f, -0.367188f,0.398438f, -0.375f,0.398438f, -0.382813f,0.398438f, -0.390625f,0.398438f, -0.398438f,0.398438f, -0.40625f,0.398438f, -0.414063f,0.398438f, -0.421875f,0.398438f, -0.429688f,0.398438f, -0.4375f,0.398438f, -0.445313f,0.398438f, -0.453125f,0.398438f, -0.460938f,0.398438f, -0.46875f,0.398438f, -0.476563f,0.398438f, -0.484375f,0.398438f, -0.492188f,0.398438f, -0.5f,0.398438f, -0.507813f,0.398438f, -0.0f,0.40625f, -0.0078125f,0.40625f, -0.015625f,0.40625f, -0.0234375f,0.40625f, -0.03125f,0.40625f, -0.0390625f,0.40625f, -0.046875f,0.40625f, -0.0546875f,0.40625f, -0.0625f,0.40625f, -0.0703125f,0.40625f, -0.078125f,0.40625f, -0.0859375f,0.40625f, -0.09375f,0.40625f, -0.101563f,0.40625f, -0.109375f,0.40625f, -0.117188f,0.40625f, -0.125f,0.40625f, -0.132813f,0.40625f, -0.140625f,0.40625f, -0.148438f,0.40625f, -0.15625f,0.40625f, -0.164063f,0.40625f, -0.171875f,0.40625f, -0.179688f,0.40625f, -0.1875f,0.40625f, -0.195313f,0.40625f, -0.203125f,0.40625f, -0.210938f,0.40625f, -0.21875f,0.40625f, -0.226563f,0.40625f, -0.234375f,0.40625f, -0.242188f,0.40625f, -0.25f,0.40625f, -0.257813f,0.40625f, -0.265625f,0.40625f, -0.273438f,0.40625f, -0.28125f,0.40625f, -0.289063f,0.40625f, -0.296875f,0.40625f, -0.304688f,0.40625f, -0.3125f,0.40625f, -0.320313f,0.40625f, -0.328125f,0.40625f, -0.335938f,0.40625f, -0.34375f,0.40625f, -0.351563f,0.40625f, -0.359375f,0.40625f, -0.367188f,0.40625f, -0.375f,0.40625f, -0.382813f,0.40625f, -0.390625f,0.40625f, -0.398438f,0.40625f, -0.40625f,0.40625f, -0.414063f,0.40625f, -0.421875f,0.40625f, -0.429688f,0.40625f, -0.4375f,0.40625f, -0.445313f,0.40625f, -0.453125f,0.40625f, -0.460938f,0.40625f, -0.46875f,0.40625f, -0.476563f,0.40625f, -0.484375f,0.40625f, -0.492188f,0.40625f, -0.5f,0.40625f, -0.507813f,0.40625f, -0.0f,0.414063f, -0.0078125f,0.414063f, -0.015625f,0.414063f, -0.0234375f,0.414063f, -0.03125f,0.414063f, -0.0390625f,0.414063f, -0.046875f,0.414063f, -0.0546875f,0.414063f, -0.0625f,0.414063f, -0.0703125f,0.414063f, -0.078125f,0.414063f, -0.0859375f,0.414063f, -0.09375f,0.414063f, -0.101563f,0.414063f, -0.109375f,0.414063f, -0.117188f,0.414063f, -0.125f,0.414063f, -0.132813f,0.414063f, -0.140625f,0.414063f, -0.148438f,0.414063f, -0.15625f,0.414063f, -0.164063f,0.414063f, -0.171875f,0.414063f, -0.179688f,0.414063f, -0.1875f,0.414063f, -0.195313f,0.414063f, -0.203125f,0.414063f, -0.210938f,0.414063f, -0.21875f,0.414063f, -0.226563f,0.414063f, -0.234375f,0.414063f, -0.242188f,0.414063f, -0.25f,0.414063f, -0.257813f,0.414063f, -0.265625f,0.414063f, -0.273438f,0.414063f, -0.28125f,0.414063f, -0.289063f,0.414063f, -0.296875f,0.414063f, -0.304688f,0.414063f, -0.3125f,0.414063f, -0.320313f,0.414063f, -0.328125f,0.414063f, -0.335938f,0.414063f, -0.34375f,0.414063f, -0.351563f,0.414063f, -0.359375f,0.414063f, -0.367188f,0.414063f, -0.375f,0.414063f, -0.382813f,0.414063f, -0.390625f,0.414063f, -0.398438f,0.414063f, -0.40625f,0.414063f, -0.414063f,0.414063f, -0.421875f,0.414063f, -0.429688f,0.414063f, -0.4375f,0.414063f, -0.445313f,0.414063f, -0.453125f,0.414063f, -0.460938f,0.414063f, -0.46875f,0.414063f, -0.476563f,0.414063f, -0.484375f,0.414063f, -0.492188f,0.414063f, -0.5f,0.414063f, -0.507813f,0.414063f, -0.0f,0.421875f, -0.0078125f,0.421875f, -0.015625f,0.421875f, -0.0234375f,0.421875f, -0.03125f,0.421875f, -0.0390625f,0.421875f, -0.046875f,0.421875f, -0.0546875f,0.421875f, -0.0625f,0.421875f, -0.0703125f,0.421875f, -0.078125f,0.421875f, -0.0859375f,0.421875f, -0.09375f,0.421875f, -0.101563f,0.421875f, -0.109375f,0.421875f, -0.117188f,0.421875f, -0.125f,0.421875f, -0.132813f,0.421875f, -0.140625f,0.421875f, -0.148438f,0.421875f, -0.15625f,0.421875f, -0.164063f,0.421875f, -0.171875f,0.421875f, -0.179688f,0.421875f, -0.1875f,0.421875f, -0.195313f,0.421875f, -0.203125f,0.421875f, -0.210938f,0.421875f, -0.21875f,0.421875f, -0.226563f,0.421875f, -0.234375f,0.421875f, -0.242188f,0.421875f, -0.25f,0.421875f, -0.257813f,0.421875f, -0.265625f,0.421875f, -0.273438f,0.421875f, -0.28125f,0.421875f, -0.289063f,0.421875f, -0.296875f,0.421875f, -0.304688f,0.421875f, -0.3125f,0.421875f, -0.320313f,0.421875f, -0.328125f,0.421875f, -0.335938f,0.421875f, -0.34375f,0.421875f, -0.351563f,0.421875f, -0.359375f,0.421875f, -0.367188f,0.421875f, -0.375f,0.421875f, -0.382813f,0.421875f, -0.390625f,0.421875f, -0.398438f,0.421875f, -0.40625f,0.421875f, -0.414063f,0.421875f, -0.421875f,0.421875f, -0.429688f,0.421875f, -0.4375f,0.421875f, -0.445313f,0.421875f, -0.453125f,0.421875f, -0.460938f,0.421875f, -0.46875f,0.421875f, -0.476563f,0.421875f, -0.484375f,0.421875f, -0.492188f,0.421875f, -0.5f,0.421875f, -0.507813f,0.421875f, -0.0f,0.429688f, -0.0078125f,0.429688f, -0.015625f,0.429688f, -0.0234375f,0.429688f, -0.03125f,0.429688f, -0.0390625f,0.429688f, -0.046875f,0.429688f, -0.0546875f,0.429688f, -0.0625f,0.429688f, -0.0703125f,0.429688f, -0.078125f,0.429688f, -0.0859375f,0.429688f, -0.09375f,0.429688f, -0.101563f,0.429688f, -0.109375f,0.429688f, -0.117188f,0.429688f, -0.125f,0.429688f, -0.132813f,0.429688f, -0.140625f,0.429688f, -0.148438f,0.429688f, -0.15625f,0.429688f, -0.164063f,0.429688f, -0.171875f,0.429688f, -0.179688f,0.429688f, -0.1875f,0.429688f, -0.195313f,0.429688f, -0.203125f,0.429688f, -0.210938f,0.429688f, -0.21875f,0.429688f, -0.226563f,0.429688f, -0.234375f,0.429688f, -0.242188f,0.429688f, -0.25f,0.429688f, -0.257813f,0.429688f, -0.265625f,0.429688f, -0.273438f,0.429688f, -0.28125f,0.429688f, -0.289063f,0.429688f, -0.296875f,0.429688f, -0.304688f,0.429688f, -0.3125f,0.429688f, -0.320313f,0.429688f, -0.328125f,0.429688f, -0.335938f,0.429688f, -0.34375f,0.429688f, -0.351563f,0.429688f, -0.359375f,0.429688f, -0.367188f,0.429688f, -0.375f,0.429688f, -0.382813f,0.429688f, -0.390625f,0.429688f, -0.398438f,0.429688f, -0.40625f,0.429688f, -0.414063f,0.429688f, -0.421875f,0.429688f, -0.429688f,0.429688f, -0.4375f,0.429688f, -0.445313f,0.429688f, -0.453125f,0.429688f, -0.460938f,0.429688f, -0.46875f,0.429688f, -0.476563f,0.429688f, -0.484375f,0.429688f, -0.492188f,0.429688f, -0.5f,0.429688f, -0.507813f,0.429688f, -0.0f,0.4375f, -0.0078125f,0.4375f, -0.015625f,0.4375f, -0.0234375f,0.4375f, -0.03125f,0.4375f, -0.0390625f,0.4375f, -0.046875f,0.4375f, -0.0546875f,0.4375f, -0.0625f,0.4375f, -0.0703125f,0.4375f, -0.078125f,0.4375f, -0.0859375f,0.4375f, -0.09375f,0.4375f, -0.101563f,0.4375f, -0.109375f,0.4375f, -0.117188f,0.4375f, -0.125f,0.4375f, -0.132813f,0.4375f, -0.140625f,0.4375f, -0.148438f,0.4375f, -0.15625f,0.4375f, -0.164063f,0.4375f, -0.171875f,0.4375f, -0.179688f,0.4375f, -0.1875f,0.4375f, -0.195313f,0.4375f, -0.203125f,0.4375f, -0.210938f,0.4375f, -0.21875f,0.4375f, -0.226563f,0.4375f, -0.234375f,0.4375f, -0.242188f,0.4375f, -0.25f,0.4375f, -0.257813f,0.4375f, -0.265625f,0.4375f, -0.273438f,0.4375f, -0.28125f,0.4375f, -0.289063f,0.4375f, -0.296875f,0.4375f, -0.304688f,0.4375f, -0.3125f,0.4375f, -0.320313f,0.4375f, -0.328125f,0.4375f, -0.335938f,0.4375f, -0.34375f,0.4375f, -0.351563f,0.4375f, -0.359375f,0.4375f, -0.367188f,0.4375f, -0.375f,0.4375f, -0.382813f,0.4375f, -0.390625f,0.4375f, -0.398438f,0.4375f, -0.40625f,0.4375f, -0.414063f,0.4375f, -0.421875f,0.4375f, -0.429688f,0.4375f, -0.4375f,0.4375f, -0.445313f,0.4375f, -0.453125f,0.4375f, -0.460938f,0.4375f, -0.46875f,0.4375f, -0.476563f,0.4375f, -0.484375f,0.4375f, -0.492188f,0.4375f, -0.5f,0.4375f, -0.507813f,0.4375f, -0.0f,0.445313f, -0.0078125f,0.445313f, -0.015625f,0.445313f, -0.0234375f,0.445313f, -0.03125f,0.445313f, -0.0390625f,0.445313f, -0.046875f,0.445313f, -0.0546875f,0.445313f, -0.0625f,0.445313f, -0.0703125f,0.445313f, -0.078125f,0.445313f, -0.0859375f,0.445313f, -0.09375f,0.445313f, -0.101563f,0.445313f, -0.109375f,0.445313f, -0.117188f,0.445313f, -0.125f,0.445313f, -0.132813f,0.445313f, -0.140625f,0.445313f, -0.148438f,0.445313f, -0.15625f,0.445313f, -0.164063f,0.445313f, -0.171875f,0.445313f, -0.179688f,0.445313f, -0.1875f,0.445313f, -0.195313f,0.445313f, -0.203125f,0.445313f, -0.210938f,0.445313f, -0.21875f,0.445313f, -0.226563f,0.445313f, -0.234375f,0.445313f, -0.242188f,0.445313f, -0.25f,0.445313f, -0.257813f,0.445313f, -0.265625f,0.445313f, -0.273438f,0.445313f, -0.28125f,0.445313f, -0.289063f,0.445313f, -0.296875f,0.445313f, -0.304688f,0.445313f, -0.3125f,0.445313f, -0.320313f,0.445313f, -0.328125f,0.445313f, -0.335938f,0.445313f, -0.34375f,0.445313f, -0.351563f,0.445313f, -0.359375f,0.445313f, -0.367188f,0.445313f, -0.375f,0.445313f, -0.382813f,0.445313f, -0.390625f,0.445313f, -0.398438f,0.445313f, -0.40625f,0.445313f, -0.414063f,0.445313f, -0.421875f,0.445313f, -0.429688f,0.445313f, -0.4375f,0.445313f, -0.445313f,0.445313f, -0.453125f,0.445313f, -0.460938f,0.445313f, -0.46875f,0.445313f, -0.476563f,0.445313f, -0.484375f,0.445313f, -0.492188f,0.445313f, -0.5f,0.445313f, -0.507813f,0.445313f, -0.0f,0.453125f, -0.0078125f,0.453125f, -0.015625f,0.453125f, -0.0234375f,0.453125f, -0.03125f,0.453125f, -0.0390625f,0.453125f, -0.046875f,0.453125f, -0.0546875f,0.453125f, -0.0625f,0.453125f, -0.0703125f,0.453125f, -0.078125f,0.453125f, -0.0859375f,0.453125f, -0.09375f,0.453125f, -0.101563f,0.453125f, -0.109375f,0.453125f, -0.117188f,0.453125f, -0.125f,0.453125f, -0.132813f,0.453125f, -0.140625f,0.453125f, -0.148438f,0.453125f, -0.15625f,0.453125f, -0.164063f,0.453125f, -0.171875f,0.453125f, -0.179688f,0.453125f, -0.1875f,0.453125f, -0.195313f,0.453125f, -0.203125f,0.453125f, -0.210938f,0.453125f, -0.21875f,0.453125f, -0.226563f,0.453125f, -0.234375f,0.453125f, -0.242188f,0.453125f, -0.25f,0.453125f, -0.257813f,0.453125f, -0.265625f,0.453125f, -0.273438f,0.453125f, -0.28125f,0.453125f, -0.289063f,0.453125f, -0.296875f,0.453125f, -0.304688f,0.453125f, -0.3125f,0.453125f, -0.320313f,0.453125f, -0.328125f,0.453125f, -0.335938f,0.453125f, -0.34375f,0.453125f, -0.351563f,0.453125f, -0.359375f,0.453125f, -0.367188f,0.453125f, -0.375f,0.453125f, -0.382813f,0.453125f, -0.390625f,0.453125f, -0.398438f,0.453125f, -0.40625f,0.453125f, -0.414063f,0.453125f, -0.421875f,0.453125f, -0.429688f,0.453125f, -0.4375f,0.453125f, -0.445313f,0.453125f, -0.453125f,0.453125f, -0.460938f,0.453125f, -0.46875f,0.453125f, -0.476563f,0.453125f, -0.484375f,0.453125f, -0.492188f,0.453125f, -0.5f,0.453125f, -0.507813f,0.453125f, -0.0f,0.460938f, -0.0078125f,0.460938f, -0.015625f,0.460938f, -0.0234375f,0.460938f, -0.03125f,0.460938f, -0.0390625f,0.460938f, -0.046875f,0.460938f, -0.0546875f,0.460938f, -0.0625f,0.460938f, -0.0703125f,0.460938f, -0.078125f,0.460938f, -0.0859375f,0.460938f, -0.09375f,0.460938f, -0.101563f,0.460938f, -0.109375f,0.460938f, -0.117188f,0.460938f, -0.125f,0.460938f, -0.132813f,0.460938f, -0.140625f,0.460938f, -0.148438f,0.460938f, -0.15625f,0.460938f, -0.164063f,0.460938f, -0.171875f,0.460938f, -0.179688f,0.460938f, -0.1875f,0.460938f, -0.195313f,0.460938f, -0.203125f,0.460938f, -0.210938f,0.460938f, -0.21875f,0.460938f, -0.226563f,0.460938f, -0.234375f,0.460938f, -0.242188f,0.460938f, -0.25f,0.460938f, -0.257813f,0.460938f, -0.265625f,0.460938f, -0.273438f,0.460938f, -0.28125f,0.460938f, -0.289063f,0.460938f, -0.296875f,0.460938f, -0.304688f,0.460938f, -0.3125f,0.460938f, -0.320313f,0.460938f, -0.328125f,0.460938f, -0.335938f,0.460938f, -0.34375f,0.460938f, -0.351563f,0.460938f, -0.359375f,0.460938f, -0.367188f,0.460938f, -0.375f,0.460938f, -0.382813f,0.460938f, -0.390625f,0.460938f, -0.398438f,0.460938f, -0.40625f,0.460938f, -0.414063f,0.460938f, -0.421875f,0.460938f, -0.429688f,0.460938f, -0.4375f,0.460938f, -0.445313f,0.460938f, -0.453125f,0.460938f, -0.460938f,0.460938f, -0.46875f,0.460938f, -0.476563f,0.460938f, -0.484375f,0.460938f, -0.492188f,0.460938f, -0.5f,0.460938f, -0.507813f,0.460938f, -0.0f,0.46875f, -0.0078125f,0.46875f, -0.015625f,0.46875f, -0.0234375f,0.46875f, -0.03125f,0.46875f, -0.0390625f,0.46875f, -0.046875f,0.46875f, -0.0546875f,0.46875f, -0.0625f,0.46875f, -0.0703125f,0.46875f, -0.078125f,0.46875f, -0.0859375f,0.46875f, -0.09375f,0.46875f, -0.101563f,0.46875f, -0.109375f,0.46875f, -0.117188f,0.46875f, -0.125f,0.46875f, -0.132813f,0.46875f, -0.140625f,0.46875f, -0.148438f,0.46875f, -0.15625f,0.46875f, -0.164063f,0.46875f, -0.171875f,0.46875f, -0.179688f,0.46875f, -0.1875f,0.46875f, -0.195313f,0.46875f, -0.203125f,0.46875f, -0.210938f,0.46875f, -0.21875f,0.46875f, -0.226563f,0.46875f, -0.234375f,0.46875f, -0.242188f,0.46875f, -0.25f,0.46875f, -0.257813f,0.46875f, -0.265625f,0.46875f, -0.273438f,0.46875f, -0.28125f,0.46875f, -0.289063f,0.46875f, -0.296875f,0.46875f, -0.304688f,0.46875f, -0.3125f,0.46875f, -0.320313f,0.46875f, -0.328125f,0.46875f, -0.335938f,0.46875f, -0.34375f,0.46875f, -0.351563f,0.46875f, -0.359375f,0.46875f, -0.367188f,0.46875f, -0.375f,0.46875f, -0.382813f,0.46875f, -0.390625f,0.46875f, -0.398438f,0.46875f, -0.40625f,0.46875f, -0.414063f,0.46875f, -0.421875f,0.46875f, -0.429688f,0.46875f, -0.4375f,0.46875f, -0.445313f,0.46875f, -0.453125f,0.46875f, -0.460938f,0.46875f, -0.46875f,0.46875f, -0.476563f,0.46875f, -0.484375f,0.46875f, -0.492188f,0.46875f, -0.5f,0.46875f, -0.507813f,0.46875f, -0.0f,0.476563f, -0.0078125f,0.476563f, -0.015625f,0.476563f, -0.0234375f,0.476563f, -0.03125f,0.476563f, -0.0390625f,0.476563f, -0.046875f,0.476563f, -0.0546875f,0.476563f, -0.0625f,0.476563f, -0.0703125f,0.476563f, -0.078125f,0.476563f, -0.0859375f,0.476563f, -0.09375f,0.476563f, -0.101563f,0.476563f, -0.109375f,0.476563f, -0.117188f,0.476563f, -0.125f,0.476563f, -0.132813f,0.476563f, -0.140625f,0.476563f, -0.148438f,0.476563f, -0.15625f,0.476563f, -0.164063f,0.476563f, -0.171875f,0.476563f, -0.179688f,0.476563f, -0.1875f,0.476563f, -0.195313f,0.476563f, -0.203125f,0.476563f, -0.210938f,0.476563f, -0.21875f,0.476563f, -0.226563f,0.476563f, -0.234375f,0.476563f, -0.242188f,0.476563f, -0.25f,0.476563f, -0.257813f,0.476563f, -0.265625f,0.476563f, -0.273438f,0.476563f, -0.28125f,0.476563f, -0.289063f,0.476563f, -0.296875f,0.476563f, -0.304688f,0.476563f, -0.3125f,0.476563f, -0.320313f,0.476563f, -0.328125f,0.476563f, -0.335938f,0.476563f, -0.34375f,0.476563f, -0.351563f,0.476563f, -0.359375f,0.476563f, -0.367188f,0.476563f, -0.375f,0.476563f, -0.382813f,0.476563f, -0.390625f,0.476563f, -0.398438f,0.476563f, -0.40625f,0.476563f, -0.414063f,0.476563f, -0.421875f,0.476563f, -0.429688f,0.476563f, -0.4375f,0.476563f, -0.445313f,0.476563f, -0.453125f,0.476563f, -0.460938f,0.476563f, -0.46875f,0.476563f, -0.476563f,0.476563f, -0.484375f,0.476563f, -0.492188f,0.476563f, -0.5f,0.476563f, -0.507813f,0.476563f, -0.0f,0.484375f, -0.0078125f,0.484375f, -0.015625f,0.484375f, -0.0234375f,0.484375f, -0.03125f,0.484375f, -0.0390625f,0.484375f, -0.046875f,0.484375f, -0.0546875f,0.484375f, -0.0625f,0.484375f, -0.0703125f,0.484375f, -0.078125f,0.484375f, -0.0859375f,0.484375f, -0.09375f,0.484375f, -0.101563f,0.484375f, -0.109375f,0.484375f, -0.117188f,0.484375f, -0.125f,0.484375f, -0.132813f,0.484375f, -0.140625f,0.484375f, -0.148438f,0.484375f, -0.15625f,0.484375f, -0.164063f,0.484375f, -0.171875f,0.484375f, -0.179688f,0.484375f, -0.1875f,0.484375f, -0.195313f,0.484375f, -0.203125f,0.484375f, -0.210938f,0.484375f, -0.21875f,0.484375f, -0.226563f,0.484375f, -0.234375f,0.484375f, -0.242188f,0.484375f, -0.25f,0.484375f, -0.257813f,0.484375f, -0.265625f,0.484375f, -0.273438f,0.484375f, -0.28125f,0.484375f, -0.289063f,0.484375f, -0.296875f,0.484375f, -0.304688f,0.484375f, -0.3125f,0.484375f, -0.320313f,0.484375f, -0.328125f,0.484375f, -0.335938f,0.484375f, -0.34375f,0.484375f, -0.351563f,0.484375f, -0.359375f,0.484375f, -0.367188f,0.484375f, -0.375f,0.484375f, -0.382813f,0.484375f, -0.390625f,0.484375f, -0.398438f,0.484375f, -0.40625f,0.484375f, -0.414063f,0.484375f, -0.421875f,0.484375f, -0.429688f,0.484375f, -0.4375f,0.484375f, -0.445313f,0.484375f, -0.453125f,0.484375f, -0.460938f,0.484375f, -0.46875f,0.484375f, -0.476563f,0.484375f, -0.484375f,0.484375f, -0.492188f,0.484375f, -0.5f,0.484375f, -0.507813f,0.484375f, -0.0f,0.492188f, -0.0078125f,0.492188f, -0.015625f,0.492188f, -0.0234375f,0.492188f, -0.03125f,0.492188f, -0.0390625f,0.492188f, -0.046875f,0.492188f, -0.0546875f,0.492188f, -0.0625f,0.492188f, -0.0703125f,0.492188f, -0.078125f,0.492188f, -0.0859375f,0.492188f, -0.09375f,0.492188f, -0.101563f,0.492188f, -0.109375f,0.492188f, -0.117188f,0.492188f, -0.125f,0.492188f, -0.132813f,0.492188f, -0.140625f,0.492188f, -0.148438f,0.492188f, -0.15625f,0.492188f, -0.164063f,0.492188f, -0.171875f,0.492188f, -0.179688f,0.492188f, -0.1875f,0.492188f, -0.195313f,0.492188f, -0.203125f,0.492188f, -0.210938f,0.492188f, -0.21875f,0.492188f, -0.226563f,0.492188f, -0.234375f,0.492188f, -0.242188f,0.492188f, -0.25f,0.492188f, -0.257813f,0.492188f, -0.265625f,0.492188f, -0.273438f,0.492188f, -0.28125f,0.492188f, -0.289063f,0.492188f, -0.296875f,0.492188f, -0.304688f,0.492188f, -0.3125f,0.492188f, -0.320313f,0.492188f, -0.328125f,0.492188f, -0.335938f,0.492188f, -0.34375f,0.492188f, -0.351563f,0.492188f, -0.359375f,0.492188f, -0.367188f,0.492188f, -0.375f,0.492188f, -0.382813f,0.492188f, -0.390625f,0.492188f, -0.398438f,0.492188f, -0.40625f,0.492188f, -0.414063f,0.492188f, -0.421875f,0.492188f, -0.429688f,0.492188f, -0.4375f,0.492188f, -0.445313f,0.492188f, -0.453125f,0.492188f, -0.460938f,0.492188f, -0.46875f,0.492188f, -0.476563f,0.492188f, -0.484375f,0.492188f, -0.492188f,0.492188f, -0.5f,0.492188f, -0.507813f,0.492188f, -}; - -unsigned short Landscape02Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -126,127,128, -129,128,127, -128,129,130, -131,130,129, -132,0,133, -2,133,0, -133,2,134, -4,134,2, -134,4,135, -6,135,4, -135,6,136, -8,136,6, -136,8,137, -10,137,8, -137,10,138, -12,138,10, -138,12,139, -14,139,12, -139,14,140, -16,140,14, -140,16,141, -18,141,16, -141,18,142, -20,142,18, -142,20,143, -22,143,20, -143,22,144, -24,144,22, -144,24,145, -26,145,24, -145,26,146, -28,146,26, -146,28,147, -30,147,28, -147,30,148, -32,148,30, -148,32,149, -34,149,32, -149,34,150, -36,150,34, -150,36,151, -38,151,36, -151,38,152, -40,152,38, -152,40,153, -42,153,40, -153,42,154, -44,154,42, -154,44,155, -46,155,44, -155,46,156, -48,156,46, -156,48,157, -50,157,48, -157,50,158, -52,158,50, -158,52,159, -54,159,52, -159,54,160, -56,160,54, -160,56,161, -58,161,56, -161,58,162, -60,162,58, -162,60,163, -62,163,60, -163,62,164, -64,164,62, -164,64,165, -66,165,64, -165,66,166, -68,166,66, -166,68,167, -70,167,68, -167,70,168, -72,168,70, -168,72,169, -74,169,72, -169,74,170, -76,170,74, -170,76,171, -78,171,76, -171,78,172, -80,172,78, -172,80,173, -82,173,80, -173,82,174, -84,174,82, -174,84,175, -86,175,84, -175,86,176, -88,176,86, -176,88,177, -90,177,88, -177,90,178, -92,178,90, -178,92,179, -94,179,92, -179,94,180, -96,180,94, -180,96,181, -98,181,96, -181,98,182, -100,182,98, -182,100,183, -102,183,100, -183,102,184, -104,184,102, -184,104,185, -106,185,104, -185,106,186, -108,186,106, -186,108,187, -110,187,108, -187,110,188, -112,188,110, -188,112,189, -114,189,112, -189,114,190, -116,190,114, -190,116,191, -118,191,116, -191,118,192, -120,192,118, -192,120,193, -122,193,120, -193,122,194, -124,194,122, -194,124,195, -126,195,124, -195,126,196, -128,196,126, -196,128,197, -130,197,128, -198,132,199, -133,199,132, -199,133,200, -134,200,133, -200,134,201, -135,201,134, -201,135,202, -136,202,135, -202,136,203, -137,203,136, -203,137,204, -138,204,137, -204,138,205, -139,205,138, -205,139,206, -140,206,139, -206,140,207, -141,207,140, -207,141,208, -142,208,141, -208,142,209, -143,209,142, -209,143,210, -144,210,143, -210,144,211, -145,211,144, -211,145,212, -146,212,145, -212,146,213, -147,213,146, -213,147,214, -148,214,147, -214,148,215, -149,215,148, -215,149,216, -150,216,149, -216,150,217, -151,217,150, -217,151,218, -152,218,151, -218,152,219, -153,219,152, -219,153,220, -154,220,153, -220,154,221, -155,221,154, -221,155,222, -156,222,155, -222,156,223, -157,223,156, -223,157,224, -158,224,157, -224,158,225, -159,225,158, -225,159,226, -160,226,159, -226,160,227, -161,227,160, -227,161,228, -162,228,161, -228,162,229, -163,229,162, -229,163,230, -164,230,163, -230,164,231, -165,231,164, -231,165,232, -166,232,165, -232,166,233, -167,233,166, -233,167,234, -168,234,167, -234,168,235, -169,235,168, -235,169,236, -170,236,169, -236,170,237, -171,237,170, -237,171,238, -172,238,171, -238,172,239, -173,239,172, -239,173,240, -174,240,173, -240,174,241, -175,241,174, -241,175,242, -176,242,175, -242,176,243, -177,243,176, -243,177,244, -178,244,177, -244,178,245, -179,245,178, -245,179,246, -180,246,179, -246,180,247, -181,247,180, -247,181,248, -182,248,181, -248,182,249, -183,249,182, -249,183,250, -184,250,183, -250,184,251, -185,251,184, -251,185,252, -186,252,185, -252,186,253, -187,253,186, -253,187,254, -188,254,187, -254,188,255, -189,255,188, -255,189,256, -190,256,189, -256,190,257, -191,257,190, -257,191,258, -192,258,191, -258,192,259, -193,259,192, -259,193,260, -194,260,193, -260,194,261, -195,261,194, -261,195,262, -196,262,195, -262,196,263, -197,263,196, -264,198,265, -199,265,198, -265,199,266, -200,266,199, -266,200,267, -201,267,200, -267,201,268, -202,268,201, -268,202,269, -203,269,202, -269,203,270, -204,270,203, -270,204,271, -205,271,204, -271,205,272, -206,272,205, -272,206,273, -207,273,206, -273,207,274, -208,274,207, -274,208,275, -209,275,208, -275,209,276, -210,276,209, -276,210,277, -211,277,210, -277,211,278, -212,278,211, -278,212,279, -213,279,212, -279,213,280, -214,280,213, -280,214,281, -215,281,214, -281,215,282, -216,282,215, -282,216,283, -217,283,216, -283,217,284, -218,284,217, -284,218,285, -219,285,218, -285,219,286, -220,286,219, -286,220,287, -221,287,220, -287,221,288, -222,288,221, -288,222,289, -223,289,222, -289,223,290, -224,290,223, -290,224,291, -225,291,224, -291,225,292, -226,292,225, -292,226,293, -227,293,226, -293,227,294, -228,294,227, -294,228,295, -229,295,228, -295,229,296, -230,296,229, -296,230,297, -231,297,230, -297,231,298, -232,298,231, -298,232,299, -233,299,232, -299,233,300, -234,300,233, -300,234,301, -235,301,234, -301,235,302, -236,302,235, -302,236,303, -237,303,236, -303,237,304, -238,304,237, -304,238,305, -239,305,238, -305,239,306, -240,306,239, -306,240,307, -241,307,240, -307,241,308, -242,308,241, -308,242,309, -243,309,242, -309,243,310, -244,310,243, -310,244,311, -245,311,244, -311,245,312, -246,312,245, -312,246,313, -247,313,246, -313,247,314, -248,314,247, -314,248,315, -249,315,248, -315,249,316, -250,316,249, -316,250,317, -251,317,250, -317,251,318, -252,318,251, -318,252,319, -253,319,252, -319,253,320, -254,320,253, -320,254,321, -255,321,254, -321,255,322, -256,322,255, -322,256,323, -257,323,256, -323,257,324, -258,324,257, -324,258,325, -259,325,258, -325,259,326, -260,326,259, -326,260,327, -261,327,260, -327,261,328, -262,328,261, -328,262,329, -263,329,262, -330,264,331, -265,331,264, -331,265,332, -266,332,265, -332,266,333, -267,333,266, -333,267,334, -268,334,267, -334,268,335, -269,335,268, -335,269,336, -270,336,269, -336,270,337, -271,337,270, -337,271,338, -272,338,271, -338,272,339, -273,339,272, -339,273,340, -274,340,273, -340,274,341, -275,341,274, -341,275,342, -276,342,275, -342,276,343, -277,343,276, -343,277,344, -278,344,277, -344,278,345, -279,345,278, -345,279,346, -280,346,279, -346,280,347, -281,347,280, -347,281,348, -282,348,281, -348,282,349, -283,349,282, -349,283,350, -284,350,283, -350,284,351, -285,351,284, -351,285,352, -286,352,285, -352,286,353, -287,353,286, -353,287,354, -288,354,287, -354,288,355, -289,355,288, -355,289,356, -290,356,289, -356,290,357, -291,357,290, -357,291,358, -292,358,291, -358,292,359, -293,359,292, -359,293,360, -294,360,293, -360,294,361, -295,361,294, -361,295,362, -296,362,295, -362,296,363, -297,363,296, -363,297,364, -298,364,297, -364,298,365, -299,365,298, -365,299,366, -300,366,299, -366,300,367, -301,367,300, -367,301,368, -302,368,301, -368,302,369, -303,369,302, -369,303,370, -304,370,303, -370,304,371, -305,371,304, -371,305,372, -306,372,305, -372,306,373, -307,373,306, -373,307,374, -308,374,307, -374,308,375, -309,375,308, -375,309,376, -310,376,309, -376,310,377, -311,377,310, -377,311,378, -312,378,311, -378,312,379, -313,379,312, -379,313,380, -314,380,313, -380,314,381, -315,381,314, -381,315,382, -316,382,315, -382,316,383, -317,383,316, -383,317,384, -318,384,317, -384,318,385, -319,385,318, -385,319,386, -320,386,319, -386,320,387, -321,387,320, -387,321,388, -322,388,321, -388,322,389, -323,389,322, -389,323,390, -324,390,323, -390,324,391, -325,391,324, -391,325,392, -326,392,325, -392,326,393, -327,393,326, -393,327,394, -328,394,327, -394,328,395, -329,395,328, -396,330,397, -331,397,330, -397,331,398, -332,398,331, -398,332,399, -333,399,332, -399,333,400, -334,400,333, -400,334,401, -335,401,334, -401,335,402, -336,402,335, -402,336,403, -337,403,336, -403,337,404, -338,404,337, -404,338,405, -339,405,338, -405,339,406, -340,406,339, -406,340,407, -341,407,340, -407,341,408, -342,408,341, -408,342,409, -343,409,342, -409,343,410, -344,410,343, -410,344,411, -345,411,344, -411,345,412, -346,412,345, -412,346,413, -347,413,346, -413,347,414, -348,414,347, -414,348,415, -349,415,348, -415,349,416, -350,416,349, -416,350,417, -351,417,350, -417,351,418, -352,418,351, -418,352,419, -353,419,352, -419,353,420, -354,420,353, -420,354,421, -355,421,354, -421,355,422, -356,422,355, -422,356,423, -357,423,356, -423,357,424, -358,424,357, -424,358,425, -359,425,358, -425,359,426, -360,426,359, -426,360,427, -361,427,360, -427,361,428, -362,428,361, -428,362,429, -363,429,362, -429,363,430, -364,430,363, -430,364,431, -365,431,364, -431,365,432, -366,432,365, -432,366,433, -367,433,366, -433,367,434, -368,434,367, -434,368,435, -369,435,368, -435,369,436, -370,436,369, -436,370,437, -371,437,370, -437,371,438, -372,438,371, -438,372,439, -373,439,372, -439,373,440, -374,440,373, -440,374,441, -375,441,374, -441,375,442, -376,442,375, -442,376,443, -377,443,376, -443,377,444, -378,444,377, -444,378,445, -379,445,378, -445,379,446, -380,446,379, -446,380,447, -381,447,380, -447,381,448, -382,448,381, -448,382,449, -383,449,382, -449,383,450, -384,450,383, -450,384,451, -385,451,384, -451,385,452, -386,452,385, -452,386,453, -387,453,386, -453,387,454, -388,454,387, -454,388,455, -389,455,388, -455,389,456, -390,456,389, -456,390,457, -391,457,390, -457,391,458, -392,458,391, -458,392,459, -393,459,392, -459,393,460, -394,460,393, -460,394,461, -395,461,394, -462,396,463, -397,463,396, -463,397,464, -398,464,397, -464,398,465, -399,465,398, -465,399,466, -400,466,399, -466,400,467, -401,467,400, -467,401,468, -402,468,401, -468,402,469, -403,469,402, -469,403,470, -404,470,403, -470,404,471, -405,471,404, -471,405,472, -406,472,405, -472,406,473, -407,473,406, -473,407,474, -408,474,407, -474,408,475, -409,475,408, -475,409,476, -410,476,409, -476,410,477, -411,477,410, -477,411,478, -412,478,411, -478,412,479, -413,479,412, -479,413,480, -414,480,413, -480,414,481, -415,481,414, -481,415,482, -416,482,415, -482,416,483, -417,483,416, -483,417,484, -418,484,417, -484,418,485, -419,485,418, -485,419,486, -420,486,419, -486,420,487, -421,487,420, -487,421,488, -422,488,421, -488,422,489, -423,489,422, -489,423,490, -424,490,423, -490,424,491, -425,491,424, -491,425,492, -426,492,425, -492,426,493, -427,493,426, -493,427,494, -428,494,427, -494,428,495, -429,495,428, -495,429,496, -430,496,429, -496,430,497, -431,497,430, -497,431,498, -432,498,431, -498,432,499, -433,499,432, -499,433,500, -434,500,433, -500,434,501, -435,501,434, -501,435,502, -436,502,435, -502,436,503, -437,503,436, -503,437,504, -438,504,437, -504,438,505, -439,505,438, -505,439,506, -440,506,439, -506,440,507, -441,507,440, -507,441,508, -442,508,441, -508,442,509, -443,509,442, -509,443,510, -444,510,443, -510,444,511, -445,511,444, -511,445,512, -446,512,445, -512,446,513, -447,513,446, -513,447,514, -448,514,447, -514,448,515, -449,515,448, -515,449,516, -450,516,449, -516,450,517, -451,517,450, -517,451,518, -452,518,451, -518,452,519, -453,519,452, -519,453,520, -454,520,453, -520,454,521, -455,521,454, -521,455,522, -456,522,455, -522,456,523, -457,523,456, -523,457,524, -458,524,457, -524,458,525, -459,525,458, -525,459,526, -460,526,459, -526,460,527, -461,527,460, -528,462,529, -463,529,462, -529,463,530, -464,530,463, -530,464,531, -465,531,464, -531,465,532, -466,532,465, -532,466,533, -467,533,466, -533,467,534, -468,534,467, -534,468,535, -469,535,468, -535,469,536, -470,536,469, -536,470,537, -471,537,470, -537,471,538, -472,538,471, -538,472,539, -473,539,472, -539,473,540, -474,540,473, -540,474,541, -475,541,474, -541,475,542, -476,542,475, -542,476,543, -477,543,476, -543,477,544, -478,544,477, -544,478,545, -479,545,478, -545,479,546, -480,546,479, -546,480,547, -481,547,480, -547,481,548, -482,548,481, -548,482,549, -483,549,482, -549,483,550, -484,550,483, -550,484,551, -485,551,484, -551,485,552, -486,552,485, -552,486,553, -487,553,486, -553,487,554, -488,554,487, -554,488,555, -489,555,488, -555,489,556, -490,556,489, -556,490,557, -491,557,490, -557,491,558, -492,558,491, -558,492,559, -493,559,492, -559,493,560, -494,560,493, -560,494,561, -495,561,494, -561,495,562, -496,562,495, -562,496,563, -497,563,496, -563,497,564, -498,564,497, -564,498,565, -499,565,498, -565,499,566, -500,566,499, -566,500,567, -501,567,500, -567,501,568, -502,568,501, -568,502,569, -503,569,502, -569,503,570, -504,570,503, -570,504,571, -505,571,504, -571,505,572, -506,572,505, -572,506,573, -507,573,506, -573,507,574, -508,574,507, -574,508,575, -509,575,508, -575,509,576, -510,576,509, -576,510,577, -511,577,510, -577,511,578, -512,578,511, -578,512,579, -513,579,512, -579,513,580, -514,580,513, -580,514,581, -515,581,514, -581,515,582, -516,582,515, -582,516,583, -517,583,516, -583,517,584, -518,584,517, -584,518,585, -519,585,518, -585,519,586, -520,586,519, -586,520,587, -521,587,520, -587,521,588, -522,588,521, -588,522,589, -523,589,522, -589,523,590, -524,590,523, -590,524,591, -525,591,524, -591,525,592, -526,592,525, -592,526,593, -527,593,526, -594,528,595, -529,595,528, -595,529,596, -530,596,529, -596,530,597, -531,597,530, -597,531,598, -532,598,531, -598,532,599, -533,599,532, -599,533,600, -534,600,533, -600,534,601, -535,601,534, -601,535,602, -536,602,535, -602,536,603, -537,603,536, -603,537,604, -538,604,537, -604,538,605, -539,605,538, -605,539,606, -540,606,539, -606,540,607, -541,607,540, -607,541,608, -542,608,541, -608,542,609, -543,609,542, -609,543,610, -544,610,543, -610,544,611, -545,611,544, -611,545,612, -546,612,545, -612,546,613, -547,613,546, -613,547,614, -548,614,547, -614,548,615, -549,615,548, -615,549,616, -550,616,549, -616,550,617, -551,617,550, -617,551,618, -552,618,551, -618,552,619, -553,619,552, -619,553,620, -554,620,553, -620,554,621, -555,621,554, -621,555,622, -556,622,555, -622,556,623, -557,623,556, -623,557,624, -558,624,557, -624,558,625, -559,625,558, -625,559,626, -560,626,559, -626,560,627, -561,627,560, -627,561,628, -562,628,561, -628,562,629, -563,629,562, -629,563,630, -564,630,563, -630,564,631, -565,631,564, -631,565,632, -566,632,565, -632,566,633, -567,633,566, -633,567,634, -568,634,567, -634,568,635, -569,635,568, -635,569,636, -570,636,569, -636,570,637, -571,637,570, -637,571,638, -572,638,571, -638,572,639, -573,639,572, -639,573,640, -574,640,573, -640,574,641, -575,641,574, -641,575,642, -576,642,575, -642,576,643, -577,643,576, -643,577,644, -578,644,577, -644,578,645, -579,645,578, -645,579,646, -580,646,579, -646,580,647, -581,647,580, -647,581,648, -582,648,581, -648,582,649, -583,649,582, -649,583,650, -584,650,583, -650,584,651, -585,651,584, -651,585,652, -586,652,585, -652,586,653, -587,653,586, -653,587,654, -588,654,587, -654,588,655, -589,655,588, -655,589,656, -590,656,589, -656,590,657, -591,657,590, -657,591,658, -592,658,591, -658,592,659, -593,659,592, -660,594,661, -595,661,594, -661,595,662, -596,662,595, -662,596,663, -597,663,596, -663,597,664, -598,664,597, -664,598,665, -599,665,598, -665,599,666, -600,666,599, -666,600,667, -601,667,600, -667,601,668, -602,668,601, -668,602,669, -603,669,602, -669,603,670, -604,670,603, -670,604,671, -605,671,604, -671,605,672, -606,672,605, -672,606,673, -607,673,606, -673,607,674, -608,674,607, -674,608,675, -609,675,608, -675,609,676, -610,676,609, -676,610,677, -611,677,610, -677,611,678, -612,678,611, -678,612,679, -613,679,612, -679,613,680, -614,680,613, -680,614,681, -615,681,614, -681,615,682, -616,682,615, -682,616,683, -617,683,616, -683,617,684, -618,684,617, -684,618,685, -619,685,618, -685,619,686, -620,686,619, -686,620,687, -621,687,620, -687,621,688, -622,688,621, -688,622,689, -623,689,622, -689,623,690, -624,690,623, -690,624,691, -625,691,624, -691,625,692, -626,692,625, -692,626,693, -627,693,626, -693,627,694, -628,694,627, -694,628,695, -629,695,628, -695,629,696, -630,696,629, -696,630,697, -631,697,630, -697,631,698, -632,698,631, -698,632,699, -633,699,632, -699,633,700, -634,700,633, -700,634,701, -635,701,634, -701,635,702, -636,702,635, -702,636,703, -637,703,636, -703,637,704, -638,704,637, -704,638,705, -639,705,638, -705,639,706, -640,706,639, -706,640,707, -641,707,640, -707,641,708, -642,708,641, -708,642,709, -643,709,642, -709,643,710, -644,710,643, -710,644,711, -645,711,644, -711,645,712, -646,712,645, -712,646,713, -647,713,646, -713,647,714, -648,714,647, -714,648,715, -649,715,648, -715,649,716, -650,716,649, -716,650,717, -651,717,650, -717,651,718, -652,718,651, -718,652,719, -653,719,652, -719,653,720, -654,720,653, -720,654,721, -655,721,654, -721,655,722, -656,722,655, -722,656,723, -657,723,656, -723,657,724, -658,724,657, -724,658,725, -659,725,658, -726,660,727, -661,727,660, -727,661,728, -662,728,661, -728,662,729, -663,729,662, -729,663,730, -664,730,663, -730,664,731, -665,731,664, -731,665,732, -666,732,665, -732,666,733, -667,733,666, -733,667,734, -668,734,667, -734,668,735, -669,735,668, -735,669,736, -670,736,669, -736,670,737, -671,737,670, -737,671,738, -672,738,671, -738,672,739, -673,739,672, -739,673,740, -674,740,673, -740,674,741, -675,741,674, -741,675,742, -676,742,675, -742,676,743, -677,743,676, -743,677,744, -678,744,677, -744,678,745, -679,745,678, -745,679,746, -680,746,679, -746,680,747, -681,747,680, -747,681,748, -682,748,681, -748,682,749, -683,749,682, -749,683,750, -684,750,683, -750,684,751, -685,751,684, -751,685,752, -686,752,685, -752,686,753, -687,753,686, -753,687,754, -688,754,687, -754,688,755, -689,755,688, -755,689,756, -690,756,689, -756,690,757, -691,757,690, -757,691,758, -692,758,691, -758,692,759, -693,759,692, -759,693,760, -694,760,693, -760,694,761, -695,761,694, -761,695,762, -696,762,695, -762,696,763, -697,763,696, -763,697,764, -698,764,697, -764,698,765, -699,765,698, -765,699,766, -700,766,699, -766,700,767, -701,767,700, -767,701,768, -702,768,701, -768,702,769, -703,769,702, -769,703,770, -704,770,703, -770,704,771, -705,771,704, -771,705,772, -706,772,705, -772,706,773, -707,773,706, -773,707,774, -708,774,707, -774,708,775, -709,775,708, -775,709,776, -710,776,709, -776,710,777, -711,777,710, -777,711,778, -712,778,711, -778,712,779, -713,779,712, -779,713,780, -714,780,713, -780,714,781, -715,781,714, -781,715,782, -716,782,715, -782,716,783, -717,783,716, -783,717,784, -718,784,717, -784,718,785, -719,785,718, -785,719,786, -720,786,719, -786,720,787, -721,787,720, -787,721,788, -722,788,721, -788,722,789, -723,789,722, -789,723,790, -724,790,723, -790,724,791, -725,791,724, -792,726,793, -727,793,726, -793,727,794, -728,794,727, -794,728,795, -729,795,728, -795,729,796, -730,796,729, -796,730,797, -731,797,730, -797,731,798, -732,798,731, -798,732,799, -733,799,732, -799,733,800, -734,800,733, -800,734,801, -735,801,734, -801,735,802, -736,802,735, -802,736,803, -737,803,736, -803,737,804, -738,804,737, -804,738,805, -739,805,738, -805,739,806, -740,806,739, -806,740,807, -741,807,740, -807,741,808, -742,808,741, -808,742,809, -743,809,742, -809,743,810, -744,810,743, -810,744,811, -745,811,744, -811,745,812, -746,812,745, -812,746,813, -747,813,746, -813,747,814, -748,814,747, -814,748,815, -749,815,748, -815,749,816, -750,816,749, -816,750,817, -751,817,750, -817,751,818, -752,818,751, -818,752,819, -753,819,752, -819,753,820, -754,820,753, -820,754,821, -755,821,754, -821,755,822, -756,822,755, -822,756,823, -757,823,756, -823,757,824, -758,824,757, -824,758,825, -759,825,758, -825,759,826, -760,826,759, -826,760,827, -761,827,760, -827,761,828, -762,828,761, -828,762,829, -763,829,762, -829,763,830, -764,830,763, -830,764,831, -765,831,764, -831,765,832, -766,832,765, -832,766,833, -767,833,766, -833,767,834, -768,834,767, -834,768,835, -769,835,768, -835,769,836, -770,836,769, -836,770,837, -771,837,770, -837,771,838, -772,838,771, -838,772,839, -773,839,772, -839,773,840, -774,840,773, -840,774,841, -775,841,774, -841,775,842, -776,842,775, -842,776,843, -777,843,776, -843,777,844, -778,844,777, -844,778,845, -779,845,778, -845,779,846, -780,846,779, -846,780,847, -781,847,780, -847,781,848, -782,848,781, -848,782,849, -783,849,782, -849,783,850, -784,850,783, -850,784,851, -785,851,784, -851,785,852, -786,852,785, -852,786,853, -787,853,786, -853,787,854, -788,854,787, -854,788,855, -789,855,788, -855,789,856, -790,856,789, -856,790,857, -791,857,790, -858,792,859, -793,859,792, -859,793,860, -794,860,793, -860,794,861, -795,861,794, -861,795,862, -796,862,795, -862,796,863, -797,863,796, -863,797,864, -798,864,797, -864,798,865, -799,865,798, -865,799,866, -800,866,799, -866,800,867, -801,867,800, -867,801,868, -802,868,801, -868,802,869, -803,869,802, -869,803,870, -804,870,803, -870,804,871, -805,871,804, -871,805,872, -806,872,805, -872,806,873, -807,873,806, -873,807,874, -808,874,807, -874,808,875, -809,875,808, -875,809,876, -810,876,809, -876,810,877, -811,877,810, -877,811,878, -812,878,811, -878,812,879, -813,879,812, -879,813,880, -814,880,813, -880,814,881, -815,881,814, -881,815,882, -816,882,815, -882,816,883, -817,883,816, -883,817,884, -818,884,817, -884,818,885, -819,885,818, -885,819,886, -820,886,819, -886,820,887, -821,887,820, -887,821,888, -822,888,821, -888,822,889, -823,889,822, -889,823,890, -824,890,823, -890,824,891, -825,891,824, -891,825,892, -826,892,825, -892,826,893, -827,893,826, -893,827,894, -828,894,827, -894,828,895, -829,895,828, -895,829,896, -830,896,829, -896,830,897, -831,897,830, -897,831,898, -832,898,831, -898,832,899, -833,899,832, -899,833,900, -834,900,833, -900,834,901, -835,901,834, -901,835,902, -836,902,835, -902,836,903, -837,903,836, -903,837,904, -838,904,837, -904,838,905, -839,905,838, -905,839,906, -840,906,839, -906,840,907, -841,907,840, -907,841,908, -842,908,841, -908,842,909, -843,909,842, -909,843,910, -844,910,843, -910,844,911, -845,911,844, -911,845,912, -846,912,845, -912,846,913, -847,913,846, -913,847,914, -848,914,847, -914,848,915, -849,915,848, -915,849,916, -850,916,849, -916,850,917, -851,917,850, -917,851,918, -852,918,851, -918,852,919, -853,919,852, -919,853,920, -854,920,853, -920,854,921, -855,921,854, -921,855,922, -856,922,855, -922,856,923, -857,923,856, -924,858,925, -859,925,858, -925,859,926, -860,926,859, -926,860,927, -861,927,860, -927,861,928, -862,928,861, -928,862,929, -863,929,862, -929,863,930, -864,930,863, -930,864,931, -865,931,864, -931,865,932, -866,932,865, -932,866,933, -867,933,866, -933,867,934, -868,934,867, -934,868,935, -869,935,868, -935,869,936, -870,936,869, -936,870,937, -871,937,870, -937,871,938, -872,938,871, -938,872,939, -873,939,872, -939,873,940, -874,940,873, -940,874,941, -875,941,874, -941,875,942, -876,942,875, -942,876,943, -877,943,876, -943,877,944, -878,944,877, -944,878,945, -879,945,878, -945,879,946, -880,946,879, -946,880,947, -881,947,880, -947,881,948, -882,948,881, -948,882,949, -883,949,882, -949,883,950, -884,950,883, -950,884,951, -885,951,884, -951,885,952, -886,952,885, -952,886,953, -887,953,886, -953,887,954, -888,954,887, -954,888,955, -889,955,888, -955,889,956, -890,956,889, -956,890,957, -891,957,890, -957,891,958, -892,958,891, -958,892,959, -893,959,892, -959,893,960, -894,960,893, -960,894,961, -895,961,894, -961,895,962, -896,962,895, -962,896,963, -897,963,896, -963,897,964, -898,964,897, -964,898,965, -899,965,898, -965,899,966, -900,966,899, -966,900,967, -901,967,900, -967,901,968, -902,968,901, -968,902,969, -903,969,902, -969,903,970, -904,970,903, -970,904,971, -905,971,904, -971,905,972, -906,972,905, -972,906,973, -907,973,906, -973,907,974, -908,974,907, -974,908,975, -909,975,908, -975,909,976, -910,976,909, -976,910,977, -911,977,910, -977,911,978, -912,978,911, -978,912,979, -913,979,912, -979,913,980, -914,980,913, -980,914,981, -915,981,914, -981,915,982, -916,982,915, -982,916,983, -917,983,916, -983,917,984, -918,984,917, -984,918,985, -919,985,918, -985,919,986, -920,986,919, -986,920,987, -921,987,920, -987,921,988, -922,988,921, -988,922,989, -923,989,922, -990,924,991, -925,991,924, -991,925,992, -926,992,925, -992,926,993, -927,993,926, -993,927,994, -928,994,927, -994,928,995, -929,995,928, -995,929,996, -930,996,929, -996,930,997, -931,997,930, -997,931,998, -932,998,931, -998,932,999, -933,999,932, -999,933,1000, -934,1000,933, -1000,934,1001, -935,1001,934, -1001,935,1002, -936,1002,935, -1002,936,1003, -937,1003,936, -1003,937,1004, -938,1004,937, -1004,938,1005, -939,1005,938, -1005,939,1006, -940,1006,939, -1006,940,1007, -941,1007,940, -1007,941,1008, -942,1008,941, -1008,942,1009, -943,1009,942, -1009,943,1010, -944,1010,943, -1010,944,1011, -945,1011,944, -1011,945,1012, -946,1012,945, -1012,946,1013, -947,1013,946, -1013,947,1014, -948,1014,947, -1014,948,1015, -949,1015,948, -1015,949,1016, -950,1016,949, -1016,950,1017, -951,1017,950, -1017,951,1018, -952,1018,951, -1018,952,1019, -953,1019,952, -1019,953,1020, -954,1020,953, -1020,954,1021, -955,1021,954, -1021,955,1022, -956,1022,955, -1022,956,1023, -957,1023,956, -1023,957,1024, -958,1024,957, -1024,958,1025, -959,1025,958, -1025,959,1026, -960,1026,959, -1026,960,1027, -961,1027,960, -1027,961,1028, -962,1028,961, -1028,962,1029, -963,1029,962, -1029,963,1030, -964,1030,963, -1030,964,1031, -965,1031,964, -1031,965,1032, -966,1032,965, -1032,966,1033, -967,1033,966, -1033,967,1034, -968,1034,967, -1034,968,1035, -969,1035,968, -1035,969,1036, -970,1036,969, -1036,970,1037, -971,1037,970, -1037,971,1038, -972,1038,971, -1038,972,1039, -973,1039,972, -1039,973,1040, -974,1040,973, -1040,974,1041, -975,1041,974, -1041,975,1042, -976,1042,975, -1042,976,1043, -977,1043,976, -1043,977,1044, -978,1044,977, -1044,978,1045, -979,1045,978, -1045,979,1046, -980,1046,979, -1046,980,1047, -981,1047,980, -1047,981,1048, -982,1048,981, -1048,982,1049, -983,1049,982, -1049,983,1050, -984,1050,983, -1050,984,1051, -985,1051,984, -1051,985,1052, -986,1052,985, -1052,986,1053, -987,1053,986, -1053,987,1054, -988,1054,987, -1054,988,1055, -989,1055,988, -1056,990,1057, -991,1057,990, -1057,991,1058, -992,1058,991, -1058,992,1059, -993,1059,992, -1059,993,1060, -994,1060,993, -1060,994,1061, -995,1061,994, -1061,995,1062, -996,1062,995, -1062,996,1063, -997,1063,996, -1063,997,1064, -998,1064,997, -1064,998,1065, -999,1065,998, -1065,999,1066, -1000,1066,999, -1066,1000,1067, -1001,1067,1000, -1067,1001,1068, -1002,1068,1001, -1068,1002,1069, -1003,1069,1002, -1069,1003,1070, -1004,1070,1003, -1070,1004,1071, -1005,1071,1004, -1071,1005,1072, -1006,1072,1005, -1072,1006,1073, -1007,1073,1006, -1073,1007,1074, -1008,1074,1007, -1074,1008,1075, -1009,1075,1008, -1075,1009,1076, -1010,1076,1009, -1076,1010,1077, -1011,1077,1010, -1077,1011,1078, -1012,1078,1011, -1078,1012,1079, -1013,1079,1012, -1079,1013,1080, -1014,1080,1013, -1080,1014,1081, -1015,1081,1014, -1081,1015,1082, -1016,1082,1015, -1082,1016,1083, -1017,1083,1016, -1083,1017,1084, -1018,1084,1017, -1084,1018,1085, -1019,1085,1018, -1085,1019,1086, -1020,1086,1019, -1086,1020,1087, -1021,1087,1020, -1087,1021,1088, -1022,1088,1021, -1088,1022,1089, -1023,1089,1022, -1089,1023,1090, -1024,1090,1023, -1090,1024,1091, -1025,1091,1024, -1091,1025,1092, -1026,1092,1025, -1092,1026,1093, -1027,1093,1026, -1093,1027,1094, -1028,1094,1027, -1094,1028,1095, -1029,1095,1028, -1095,1029,1096, -1030,1096,1029, -1096,1030,1097, -1031,1097,1030, -1097,1031,1098, -1032,1098,1031, -1098,1032,1099, -1033,1099,1032, -1099,1033,1100, -1034,1100,1033, -1100,1034,1101, -1035,1101,1034, -1101,1035,1102, -1036,1102,1035, -1102,1036,1103, -1037,1103,1036, -1103,1037,1104, -1038,1104,1037, -1104,1038,1105, -1039,1105,1038, -1105,1039,1106, -1040,1106,1039, -1106,1040,1107, -1041,1107,1040, -1107,1041,1108, -1042,1108,1041, -1108,1042,1109, -1043,1109,1042, -1109,1043,1110, -1044,1110,1043, -1110,1044,1111, -1045,1111,1044, -1111,1045,1112, -1046,1112,1045, -1112,1046,1113, -1047,1113,1046, -1113,1047,1114, -1048,1114,1047, -1114,1048,1115, -1049,1115,1048, -1115,1049,1116, -1050,1116,1049, -1116,1050,1117, -1051,1117,1050, -1117,1051,1118, -1052,1118,1051, -1118,1052,1119, -1053,1119,1052, -1119,1053,1120, -1054,1120,1053, -1120,1054,1121, -1055,1121,1054, -1122,1056,1123, -1057,1123,1056, -1123,1057,1124, -1058,1124,1057, -1124,1058,1125, -1059,1125,1058, -1125,1059,1126, -1060,1126,1059, -1126,1060,1127, -1061,1127,1060, -1127,1061,1128, -1062,1128,1061, -1128,1062,1129, -1063,1129,1062, -1129,1063,1130, -1064,1130,1063, -1130,1064,1131, -1065,1131,1064, -1131,1065,1132, -1066,1132,1065, -1132,1066,1133, -1067,1133,1066, -1133,1067,1134, -1068,1134,1067, -1134,1068,1135, -1069,1135,1068, -1135,1069,1136, -1070,1136,1069, -1136,1070,1137, -1071,1137,1070, -1137,1071,1138, -1072,1138,1071, -1138,1072,1139, -1073,1139,1072, -1139,1073,1140, -1074,1140,1073, -1140,1074,1141, -1075,1141,1074, -1141,1075,1142, -1076,1142,1075, -1142,1076,1143, -1077,1143,1076, -1143,1077,1144, -1078,1144,1077, -1144,1078,1145, -1079,1145,1078, -1145,1079,1146, -1080,1146,1079, -1146,1080,1147, -1081,1147,1080, -1147,1081,1148, -1082,1148,1081, -1148,1082,1149, -1083,1149,1082, -1149,1083,1150, -1084,1150,1083, -1150,1084,1151, -1085,1151,1084, -1151,1085,1152, -1086,1152,1085, -1152,1086,1153, -1087,1153,1086, -1153,1087,1154, -1088,1154,1087, -1154,1088,1155, -1089,1155,1088, -1155,1089,1156, -1090,1156,1089, -1156,1090,1157, -1091,1157,1090, -1157,1091,1158, -1092,1158,1091, -1158,1092,1159, -1093,1159,1092, -1159,1093,1160, -1094,1160,1093, -1160,1094,1161, -1095,1161,1094, -1161,1095,1162, -1096,1162,1095, -1162,1096,1163, -1097,1163,1096, -1163,1097,1164, -1098,1164,1097, -1164,1098,1165, -1099,1165,1098, -1165,1099,1166, -1100,1166,1099, -1166,1100,1167, -1101,1167,1100, -1167,1101,1168, -1102,1168,1101, -1168,1102,1169, -1103,1169,1102, -1169,1103,1170, -1104,1170,1103, -1170,1104,1171, -1105,1171,1104, -1171,1105,1172, -1106,1172,1105, -1172,1106,1173, -1107,1173,1106, -1173,1107,1174, -1108,1174,1107, -1174,1108,1175, -1109,1175,1108, -1175,1109,1176, -1110,1176,1109, -1176,1110,1177, -1111,1177,1110, -1177,1111,1178, -1112,1178,1111, -1178,1112,1179, -1113,1179,1112, -1179,1113,1180, -1114,1180,1113, -1180,1114,1181, -1115,1181,1114, -1181,1115,1182, -1116,1182,1115, -1182,1116,1183, -1117,1183,1116, -1183,1117,1184, -1118,1184,1117, -1184,1118,1185, -1119,1185,1118, -1185,1119,1186, -1120,1186,1119, -1186,1120,1187, -1121,1187,1120, -1188,1122,1189, -1123,1189,1122, -1189,1123,1190, -1124,1190,1123, -1190,1124,1191, -1125,1191,1124, -1191,1125,1192, -1126,1192,1125, -1192,1126,1193, -1127,1193,1126, -1193,1127,1194, -1128,1194,1127, -1194,1128,1195, -1129,1195,1128, -1195,1129,1196, -1130,1196,1129, -1196,1130,1197, -1131,1197,1130, -1197,1131,1198, -1132,1198,1131, -1198,1132,1199, -1133,1199,1132, -1199,1133,1200, -1134,1200,1133, -1200,1134,1201, -1135,1201,1134, -1201,1135,1202, -1136,1202,1135, -1202,1136,1203, -1137,1203,1136, -1203,1137,1204, -1138,1204,1137, -1204,1138,1205, -1139,1205,1138, -1205,1139,1206, -1140,1206,1139, -1206,1140,1207, -1141,1207,1140, -1207,1141,1208, -1142,1208,1141, -1208,1142,1209, -1143,1209,1142, -1209,1143,1210, -1144,1210,1143, -1210,1144,1211, -1145,1211,1144, -1211,1145,1212, -1146,1212,1145, -1212,1146,1213, -1147,1213,1146, -1213,1147,1214, -1148,1214,1147, -1214,1148,1215, -1149,1215,1148, -1215,1149,1216, -1150,1216,1149, -1216,1150,1217, -1151,1217,1150, -1217,1151,1218, -1152,1218,1151, -1218,1152,1219, -1153,1219,1152, -1219,1153,1220, -1154,1220,1153, -1220,1154,1221, -1155,1221,1154, -1221,1155,1222, -1156,1222,1155, -1222,1156,1223, -1157,1223,1156, -1223,1157,1224, -1158,1224,1157, -1224,1158,1225, -1159,1225,1158, -1225,1159,1226, -1160,1226,1159, -1226,1160,1227, -1161,1227,1160, -1227,1161,1228, -1162,1228,1161, -1228,1162,1229, -1163,1229,1162, -1229,1163,1230, -1164,1230,1163, -1230,1164,1231, -1165,1231,1164, -1231,1165,1232, -1166,1232,1165, -1232,1166,1233, -1167,1233,1166, -1233,1167,1234, -1168,1234,1167, -1234,1168,1235, -1169,1235,1168, -1235,1169,1236, -1170,1236,1169, -1236,1170,1237, -1171,1237,1170, -1237,1171,1238, -1172,1238,1171, -1238,1172,1239, -1173,1239,1172, -1239,1173,1240, -1174,1240,1173, -1240,1174,1241, -1175,1241,1174, -1241,1175,1242, -1176,1242,1175, -1242,1176,1243, -1177,1243,1176, -1243,1177,1244, -1178,1244,1177, -1244,1178,1245, -1179,1245,1178, -1245,1179,1246, -1180,1246,1179, -1246,1180,1247, -1181,1247,1180, -1247,1181,1248, -1182,1248,1181, -1248,1182,1249, -1183,1249,1182, -1249,1183,1250, -1184,1250,1183, -1250,1184,1251, -1185,1251,1184, -1251,1185,1252, -1186,1252,1185, -1252,1186,1253, -1187,1253,1186, -1254,1188,1255, -1189,1255,1188, -1255,1189,1256, -1190,1256,1189, -1256,1190,1257, -1191,1257,1190, -1257,1191,1258, -1192,1258,1191, -1258,1192,1259, -1193,1259,1192, -1259,1193,1260, -1194,1260,1193, -1260,1194,1261, -1195,1261,1194, -1261,1195,1262, -1196,1262,1195, -1262,1196,1263, -1197,1263,1196, -1263,1197,1264, -1198,1264,1197, -1264,1198,1265, -1199,1265,1198, -1265,1199,1266, -1200,1266,1199, -1266,1200,1267, -1201,1267,1200, -1267,1201,1268, -1202,1268,1201, -1268,1202,1269, -1203,1269,1202, -1269,1203,1270, -1204,1270,1203, -1270,1204,1271, -1205,1271,1204, -1271,1205,1272, -1206,1272,1205, -1272,1206,1273, -1207,1273,1206, -1273,1207,1274, -1208,1274,1207, -1274,1208,1275, -1209,1275,1208, -1275,1209,1276, -1210,1276,1209, -1276,1210,1277, -1211,1277,1210, -1277,1211,1278, -1212,1278,1211, -1278,1212,1279, -1213,1279,1212, -1279,1213,1280, -1214,1280,1213, -1280,1214,1281, -1215,1281,1214, -1281,1215,1282, -1216,1282,1215, -1282,1216,1283, -1217,1283,1216, -1283,1217,1284, -1218,1284,1217, -1284,1218,1285, -1219,1285,1218, -1285,1219,1286, -1220,1286,1219, -1286,1220,1287, -1221,1287,1220, -1287,1221,1288, -1222,1288,1221, -1288,1222,1289, -1223,1289,1222, -1289,1223,1290, -1224,1290,1223, -1290,1224,1291, -1225,1291,1224, -1291,1225,1292, -1226,1292,1225, -1292,1226,1293, -1227,1293,1226, -1293,1227,1294, -1228,1294,1227, -1294,1228,1295, -1229,1295,1228, -1295,1229,1296, -1230,1296,1229, -1296,1230,1297, -1231,1297,1230, -1297,1231,1298, -1232,1298,1231, -1298,1232,1299, -1233,1299,1232, -1299,1233,1300, -1234,1300,1233, -1300,1234,1301, -1235,1301,1234, -1301,1235,1302, -1236,1302,1235, -1302,1236,1303, -1237,1303,1236, -1303,1237,1304, -1238,1304,1237, -1304,1238,1305, -1239,1305,1238, -1305,1239,1306, -1240,1306,1239, -1306,1240,1307, -1241,1307,1240, -1307,1241,1308, -1242,1308,1241, -1308,1242,1309, -1243,1309,1242, -1309,1243,1310, -1244,1310,1243, -1310,1244,1311, -1245,1311,1244, -1311,1245,1312, -1246,1312,1245, -1312,1246,1313, -1247,1313,1246, -1313,1247,1314, -1248,1314,1247, -1314,1248,1315, -1249,1315,1248, -1315,1249,1316, -1250,1316,1249, -1316,1250,1317, -1251,1317,1250, -1317,1251,1318, -1252,1318,1251, -1318,1252,1319, -1253,1319,1252, -1320,1254,1321, -1255,1321,1254, -1321,1255,1322, -1256,1322,1255, -1322,1256,1323, -1257,1323,1256, -1323,1257,1324, -1258,1324,1257, -1324,1258,1325, -1259,1325,1258, -1325,1259,1326, -1260,1326,1259, -1326,1260,1327, -1261,1327,1260, -1327,1261,1328, -1262,1328,1261, -1328,1262,1329, -1263,1329,1262, -1329,1263,1330, -1264,1330,1263, -1330,1264,1331, -1265,1331,1264, -1331,1265,1332, -1266,1332,1265, -1332,1266,1333, -1267,1333,1266, -1333,1267,1334, -1268,1334,1267, -1334,1268,1335, -1269,1335,1268, -1335,1269,1336, -1270,1336,1269, -1336,1270,1337, -1271,1337,1270, -1337,1271,1338, -1272,1338,1271, -1338,1272,1339, -1273,1339,1272, -1339,1273,1340, -1274,1340,1273, -1340,1274,1341, -1275,1341,1274, -1341,1275,1342, -1276,1342,1275, -1342,1276,1343, -1277,1343,1276, -1343,1277,1344, -1278,1344,1277, -1344,1278,1345, -1279,1345,1278, -1345,1279,1346, -1280,1346,1279, -1346,1280,1347, -1281,1347,1280, -1347,1281,1348, -1282,1348,1281, -1348,1282,1349, -1283,1349,1282, -1349,1283,1350, -1284,1350,1283, -1350,1284,1351, -1285,1351,1284, -1351,1285,1352, -1286,1352,1285, -1352,1286,1353, -1287,1353,1286, -1353,1287,1354, -1288,1354,1287, -1354,1288,1355, -1289,1355,1288, -1355,1289,1356, -1290,1356,1289, -1356,1290,1357, -1291,1357,1290, -1357,1291,1358, -1292,1358,1291, -1358,1292,1359, -1293,1359,1292, -1359,1293,1360, -1294,1360,1293, -1360,1294,1361, -1295,1361,1294, -1361,1295,1362, -1296,1362,1295, -1362,1296,1363, -1297,1363,1296, -1363,1297,1364, -1298,1364,1297, -1364,1298,1365, -1299,1365,1298, -1365,1299,1366, -1300,1366,1299, -1366,1300,1367, -1301,1367,1300, -1367,1301,1368, -1302,1368,1301, -1368,1302,1369, -1303,1369,1302, -1369,1303,1370, -1304,1370,1303, -1370,1304,1371, -1305,1371,1304, -1371,1305,1372, -1306,1372,1305, -1372,1306,1373, -1307,1373,1306, -1373,1307,1374, -1308,1374,1307, -1374,1308,1375, -1309,1375,1308, -1375,1309,1376, -1310,1376,1309, -1376,1310,1377, -1311,1377,1310, -1377,1311,1378, -1312,1378,1311, -1378,1312,1379, -1313,1379,1312, -1379,1313,1380, -1314,1380,1313, -1380,1314,1381, -1315,1381,1314, -1381,1315,1382, -1316,1382,1315, -1382,1316,1383, -1317,1383,1316, -1383,1317,1384, -1318,1384,1317, -1384,1318,1385, -1319,1385,1318, -1386,1320,1387, -1321,1387,1320, -1387,1321,1388, -1322,1388,1321, -1388,1322,1389, -1323,1389,1322, -1389,1323,1390, -1324,1390,1323, -1390,1324,1391, -1325,1391,1324, -1391,1325,1392, -1326,1392,1325, -1392,1326,1393, -1327,1393,1326, -1393,1327,1394, -1328,1394,1327, -1394,1328,1395, -1329,1395,1328, -1395,1329,1396, -1330,1396,1329, -1396,1330,1397, -1331,1397,1330, -1397,1331,1398, -1332,1398,1331, -1398,1332,1399, -1333,1399,1332, -1399,1333,1400, -1334,1400,1333, -1400,1334,1401, -1335,1401,1334, -1401,1335,1402, -1336,1402,1335, -1402,1336,1403, -1337,1403,1336, -1403,1337,1404, -1338,1404,1337, -1404,1338,1405, -1339,1405,1338, -1405,1339,1406, -1340,1406,1339, -1406,1340,1407, -1341,1407,1340, -1407,1341,1408, -1342,1408,1341, -1408,1342,1409, -1343,1409,1342, -1409,1343,1410, -1344,1410,1343, -1410,1344,1411, -1345,1411,1344, -1411,1345,1412, -1346,1412,1345, -1412,1346,1413, -1347,1413,1346, -1413,1347,1414, -1348,1414,1347, -1414,1348,1415, -1349,1415,1348, -1415,1349,1416, -1350,1416,1349, -1416,1350,1417, -1351,1417,1350, -1417,1351,1418, -1352,1418,1351, -1418,1352,1419, -1353,1419,1352, -1419,1353,1420, -1354,1420,1353, -1420,1354,1421, -1355,1421,1354, -1421,1355,1422, -1356,1422,1355, -1422,1356,1423, -1357,1423,1356, -1423,1357,1424, -1358,1424,1357, -1424,1358,1425, -1359,1425,1358, -1425,1359,1426, -1360,1426,1359, -1426,1360,1427, -1361,1427,1360, -1427,1361,1428, -1362,1428,1361, -1428,1362,1429, -1363,1429,1362, -1429,1363,1430, -1364,1430,1363, -1430,1364,1431, -1365,1431,1364, -1431,1365,1432, -1366,1432,1365, -1432,1366,1433, -1367,1433,1366, -1433,1367,1434, -1368,1434,1367, -1434,1368,1435, -1369,1435,1368, -1435,1369,1436, -1370,1436,1369, -1436,1370,1437, -1371,1437,1370, -1437,1371,1438, -1372,1438,1371, -1438,1372,1439, -1373,1439,1372, -1439,1373,1440, -1374,1440,1373, -1440,1374,1441, -1375,1441,1374, -1441,1375,1442, -1376,1442,1375, -1442,1376,1443, -1377,1443,1376, -1443,1377,1444, -1378,1444,1377, -1444,1378,1445, -1379,1445,1378, -1445,1379,1446, -1380,1446,1379, -1446,1380,1447, -1381,1447,1380, -1447,1381,1448, -1382,1448,1381, -1448,1382,1449, -1383,1449,1382, -1449,1383,1450, -1384,1450,1383, -1450,1384,1451, -1385,1451,1384, -1452,1386,1453, -1387,1453,1386, -1453,1387,1454, -1388,1454,1387, -1454,1388,1455, -1389,1455,1388, -1455,1389,1456, -1390,1456,1389, -1456,1390,1457, -1391,1457,1390, -1457,1391,1458, -1392,1458,1391, -1458,1392,1459, -1393,1459,1392, -1459,1393,1460, -1394,1460,1393, -1460,1394,1461, -1395,1461,1394, -1461,1395,1462, -1396,1462,1395, -1462,1396,1463, -1397,1463,1396, -1463,1397,1464, -1398,1464,1397, -1464,1398,1465, -1399,1465,1398, -1465,1399,1466, -1400,1466,1399, -1466,1400,1467, -1401,1467,1400, -1467,1401,1468, -1402,1468,1401, -1468,1402,1469, -1403,1469,1402, -1469,1403,1470, -1404,1470,1403, -1470,1404,1471, -1405,1471,1404, -1471,1405,1472, -1406,1472,1405, -1472,1406,1473, -1407,1473,1406, -1473,1407,1474, -1408,1474,1407, -1474,1408,1475, -1409,1475,1408, -1475,1409,1476, -1410,1476,1409, -1476,1410,1477, -1411,1477,1410, -1477,1411,1478, -1412,1478,1411, -1478,1412,1479, -1413,1479,1412, -1479,1413,1480, -1414,1480,1413, -1480,1414,1481, -1415,1481,1414, -1481,1415,1482, -1416,1482,1415, -1482,1416,1483, -1417,1483,1416, -1483,1417,1484, -1418,1484,1417, -1484,1418,1485, -1419,1485,1418, -1485,1419,1486, -1420,1486,1419, -1486,1420,1487, -1421,1487,1420, -1487,1421,1488, -1422,1488,1421, -1488,1422,1489, -1423,1489,1422, -1489,1423,1490, -1424,1490,1423, -1490,1424,1491, -1425,1491,1424, -1491,1425,1492, -1426,1492,1425, -1492,1426,1493, -1427,1493,1426, -1493,1427,1494, -1428,1494,1427, -1494,1428,1495, -1429,1495,1428, -1495,1429,1496, -1430,1496,1429, -1496,1430,1497, -1431,1497,1430, -1497,1431,1498, -1432,1498,1431, -1498,1432,1499, -1433,1499,1432, -1499,1433,1500, -1434,1500,1433, -1500,1434,1501, -1435,1501,1434, -1501,1435,1502, -1436,1502,1435, -1502,1436,1503, -1437,1503,1436, -1503,1437,1504, -1438,1504,1437, -1504,1438,1505, -1439,1505,1438, -1505,1439,1506, -1440,1506,1439, -1506,1440,1507, -1441,1507,1440, -1507,1441,1508, -1442,1508,1441, -1508,1442,1509, -1443,1509,1442, -1509,1443,1510, -1444,1510,1443, -1510,1444,1511, -1445,1511,1444, -1511,1445,1512, -1446,1512,1445, -1512,1446,1513, -1447,1513,1446, -1513,1447,1514, -1448,1514,1447, -1514,1448,1515, -1449,1515,1448, -1515,1449,1516, -1450,1516,1449, -1516,1450,1517, -1451,1517,1450, -1518,1452,1519, -1453,1519,1452, -1519,1453,1520, -1454,1520,1453, -1520,1454,1521, -1455,1521,1454, -1521,1455,1522, -1456,1522,1455, -1522,1456,1523, -1457,1523,1456, -1523,1457,1524, -1458,1524,1457, -1524,1458,1525, -1459,1525,1458, -1525,1459,1526, -1460,1526,1459, -1526,1460,1527, -1461,1527,1460, -1527,1461,1528, -1462,1528,1461, -1528,1462,1529, -1463,1529,1462, -1529,1463,1530, -1464,1530,1463, -1530,1464,1531, -1465,1531,1464, -1531,1465,1532, -1466,1532,1465, -1532,1466,1533, -1467,1533,1466, -1533,1467,1534, -1468,1534,1467, -1534,1468,1535, -1469,1535,1468, -1535,1469,1536, -1470,1536,1469, -1536,1470,1537, -1471,1537,1470, -1537,1471,1538, -1472,1538,1471, -1538,1472,1539, -1473,1539,1472, -1539,1473,1540, -1474,1540,1473, -1540,1474,1541, -1475,1541,1474, -1541,1475,1542, -1476,1542,1475, -1542,1476,1543, -1477,1543,1476, -1543,1477,1544, -1478,1544,1477, -1544,1478,1545, -1479,1545,1478, -1545,1479,1546, -1480,1546,1479, -1546,1480,1547, -1481,1547,1480, -1547,1481,1548, -1482,1548,1481, -1548,1482,1549, -1483,1549,1482, -1549,1483,1550, -1484,1550,1483, -1550,1484,1551, -1485,1551,1484, -1551,1485,1552, -1486,1552,1485, -1552,1486,1553, -1487,1553,1486, -1553,1487,1554, -1488,1554,1487, -1554,1488,1555, -1489,1555,1488, -1555,1489,1556, -1490,1556,1489, -1556,1490,1557, -1491,1557,1490, -1557,1491,1558, -1492,1558,1491, -1558,1492,1559, -1493,1559,1492, -1559,1493,1560, -1494,1560,1493, -1560,1494,1561, -1495,1561,1494, -1561,1495,1562, -1496,1562,1495, -1562,1496,1563, -1497,1563,1496, -1563,1497,1564, -1498,1564,1497, -1564,1498,1565, -1499,1565,1498, -1565,1499,1566, -1500,1566,1499, -1566,1500,1567, -1501,1567,1500, -1567,1501,1568, -1502,1568,1501, -1568,1502,1569, -1503,1569,1502, -1569,1503,1570, -1504,1570,1503, -1570,1504,1571, -1505,1571,1504, -1571,1505,1572, -1506,1572,1505, -1572,1506,1573, -1507,1573,1506, -1573,1507,1574, -1508,1574,1507, -1574,1508,1575, -1509,1575,1508, -1575,1509,1576, -1510,1576,1509, -1576,1510,1577, -1511,1577,1510, -1577,1511,1578, -1512,1578,1511, -1578,1512,1579, -1513,1579,1512, -1579,1513,1580, -1514,1580,1513, -1580,1514,1581, -1515,1581,1514, -1581,1515,1582, -1516,1582,1515, -1582,1516,1583, -1517,1583,1516, -1584,1518,1585, -1519,1585,1518, -1585,1519,1586, -1520,1586,1519, -1586,1520,1587, -1521,1587,1520, -1587,1521,1588, -1522,1588,1521, -1588,1522,1589, -1523,1589,1522, -1589,1523,1590, -1524,1590,1523, -1590,1524,1591, -1525,1591,1524, -1591,1525,1592, -1526,1592,1525, -1592,1526,1593, -1527,1593,1526, -1593,1527,1594, -1528,1594,1527, -1594,1528,1595, -1529,1595,1528, -1595,1529,1596, -1530,1596,1529, -1596,1530,1597, -1531,1597,1530, -1597,1531,1598, -1532,1598,1531, -1598,1532,1599, -1533,1599,1532, -1599,1533,1600, -1534,1600,1533, -1600,1534,1601, -1535,1601,1534, -1601,1535,1602, -1536,1602,1535, -1602,1536,1603, -1537,1603,1536, -1603,1537,1604, -1538,1604,1537, -1604,1538,1605, -1539,1605,1538, -1605,1539,1606, -1540,1606,1539, -1606,1540,1607, -1541,1607,1540, -1607,1541,1608, -1542,1608,1541, -1608,1542,1609, -1543,1609,1542, -1609,1543,1610, -1544,1610,1543, -1610,1544,1611, -1545,1611,1544, -1611,1545,1612, -1546,1612,1545, -1612,1546,1613, -1547,1613,1546, -1613,1547,1614, -1548,1614,1547, -1614,1548,1615, -1549,1615,1548, -1615,1549,1616, -1550,1616,1549, -1616,1550,1617, -1551,1617,1550, -1617,1551,1618, -1552,1618,1551, -1618,1552,1619, -1553,1619,1552, -1619,1553,1620, -1554,1620,1553, -1620,1554,1621, -1555,1621,1554, -1621,1555,1622, -1556,1622,1555, -1622,1556,1623, -1557,1623,1556, -1623,1557,1624, -1558,1624,1557, -1624,1558,1625, -1559,1625,1558, -1625,1559,1626, -1560,1626,1559, -1626,1560,1627, -1561,1627,1560, -1627,1561,1628, -1562,1628,1561, -1628,1562,1629, -1563,1629,1562, -1629,1563,1630, -1564,1630,1563, -1630,1564,1631, -1565,1631,1564, -1631,1565,1632, -1566,1632,1565, -1632,1566,1633, -1567,1633,1566, -1633,1567,1634, -1568,1634,1567, -1634,1568,1635, -1569,1635,1568, -1635,1569,1636, -1570,1636,1569, -1636,1570,1637, -1571,1637,1570, -1637,1571,1638, -1572,1638,1571, -1638,1572,1639, -1573,1639,1572, -1639,1573,1640, -1574,1640,1573, -1640,1574,1641, -1575,1641,1574, -1641,1575,1642, -1576,1642,1575, -1642,1576,1643, -1577,1643,1576, -1643,1577,1644, -1578,1644,1577, -1644,1578,1645, -1579,1645,1578, -1645,1579,1646, -1580,1646,1579, -1646,1580,1647, -1581,1647,1580, -1647,1581,1648, -1582,1648,1581, -1648,1582,1649, -1583,1649,1582, -1650,1584,1651, -1585,1651,1584, -1651,1585,1652, -1586,1652,1585, -1652,1586,1653, -1587,1653,1586, -1653,1587,1654, -1588,1654,1587, -1654,1588,1655, -1589,1655,1588, -1655,1589,1656, -1590,1656,1589, -1656,1590,1657, -1591,1657,1590, -1657,1591,1658, -1592,1658,1591, -1658,1592,1659, -1593,1659,1592, -1659,1593,1660, -1594,1660,1593, -1660,1594,1661, -1595,1661,1594, -1661,1595,1662, -1596,1662,1595, -1662,1596,1663, -1597,1663,1596, -1663,1597,1664, -1598,1664,1597, -1664,1598,1665, -1599,1665,1598, -1665,1599,1666, -1600,1666,1599, -1666,1600,1667, -1601,1667,1600, -1667,1601,1668, -1602,1668,1601, -1668,1602,1669, -1603,1669,1602, -1669,1603,1670, -1604,1670,1603, -1670,1604,1671, -1605,1671,1604, -1671,1605,1672, -1606,1672,1605, -1672,1606,1673, -1607,1673,1606, -1673,1607,1674, -1608,1674,1607, -1674,1608,1675, -1609,1675,1608, -1675,1609,1676, -1610,1676,1609, -1676,1610,1677, -1611,1677,1610, -1677,1611,1678, -1612,1678,1611, -1678,1612,1679, -1613,1679,1612, -1679,1613,1680, -1614,1680,1613, -1680,1614,1681, -1615,1681,1614, -1681,1615,1682, -1616,1682,1615, -1682,1616,1683, -1617,1683,1616, -1683,1617,1684, -1618,1684,1617, -1684,1618,1685, -1619,1685,1618, -1685,1619,1686, -1620,1686,1619, -1686,1620,1687, -1621,1687,1620, -1687,1621,1688, -1622,1688,1621, -1688,1622,1689, -1623,1689,1622, -1689,1623,1690, -1624,1690,1623, -1690,1624,1691, -1625,1691,1624, -1691,1625,1692, -1626,1692,1625, -1692,1626,1693, -1627,1693,1626, -1693,1627,1694, -1628,1694,1627, -1694,1628,1695, -1629,1695,1628, -1695,1629,1696, -1630,1696,1629, -1696,1630,1697, -1631,1697,1630, -1697,1631,1698, -1632,1698,1631, -1698,1632,1699, -1633,1699,1632, -1699,1633,1700, -1634,1700,1633, -1700,1634,1701, -1635,1701,1634, -1701,1635,1702, -1636,1702,1635, -1702,1636,1703, -1637,1703,1636, -1703,1637,1704, -1638,1704,1637, -1704,1638,1705, -1639,1705,1638, -1705,1639,1706, -1640,1706,1639, -1706,1640,1707, -1641,1707,1640, -1707,1641,1708, -1642,1708,1641, -1708,1642,1709, -1643,1709,1642, -1709,1643,1710, -1644,1710,1643, -1710,1644,1711, -1645,1711,1644, -1711,1645,1712, -1646,1712,1645, -1712,1646,1713, -1647,1713,1646, -1713,1647,1714, -1648,1714,1647, -1714,1648,1715, -1649,1715,1648, -1716,1650,1717, -1651,1717,1650, -1717,1651,1718, -1652,1718,1651, -1718,1652,1719, -1653,1719,1652, -1719,1653,1720, -1654,1720,1653, -1720,1654,1721, -1655,1721,1654, -1721,1655,1722, -1656,1722,1655, -1722,1656,1723, -1657,1723,1656, -1723,1657,1724, -1658,1724,1657, -1724,1658,1725, -1659,1725,1658, -1725,1659,1726, -1660,1726,1659, -1726,1660,1727, -1661,1727,1660, -1727,1661,1728, -1662,1728,1661, -1728,1662,1729, -1663,1729,1662, -1729,1663,1730, -1664,1730,1663, -1730,1664,1731, -1665,1731,1664, -1731,1665,1732, -1666,1732,1665, -1732,1666,1733, -1667,1733,1666, -1733,1667,1734, -1668,1734,1667, -1734,1668,1735, -1669,1735,1668, -1735,1669,1736, -1670,1736,1669, -1736,1670,1737, -1671,1737,1670, -1737,1671,1738, -1672,1738,1671, -1738,1672,1739, -1673,1739,1672, -1739,1673,1740, -1674,1740,1673, -1740,1674,1741, -1675,1741,1674, -1741,1675,1742, -1676,1742,1675, -1742,1676,1743, -1677,1743,1676, -1743,1677,1744, -1678,1744,1677, -1744,1678,1745, -1679,1745,1678, -1745,1679,1746, -1680,1746,1679, -1746,1680,1747, -1681,1747,1680, -1747,1681,1748, -1682,1748,1681, -1748,1682,1749, -1683,1749,1682, -1749,1683,1750, -1684,1750,1683, -1750,1684,1751, -1685,1751,1684, -1751,1685,1752, -1686,1752,1685, -1752,1686,1753, -1687,1753,1686, -1753,1687,1754, -1688,1754,1687, -1754,1688,1755, -1689,1755,1688, -1755,1689,1756, -1690,1756,1689, -1756,1690,1757, -1691,1757,1690, -1757,1691,1758, -1692,1758,1691, -1758,1692,1759, -1693,1759,1692, -1759,1693,1760, -1694,1760,1693, -1760,1694,1761, -1695,1761,1694, -1761,1695,1762, -1696,1762,1695, -1762,1696,1763, -1697,1763,1696, -1763,1697,1764, -1698,1764,1697, -1764,1698,1765, -1699,1765,1698, -1765,1699,1766, -1700,1766,1699, -1766,1700,1767, -1701,1767,1700, -1767,1701,1768, -1702,1768,1701, -1768,1702,1769, -1703,1769,1702, -1769,1703,1770, -1704,1770,1703, -1770,1704,1771, -1705,1771,1704, -1771,1705,1772, -1706,1772,1705, -1772,1706,1773, -1707,1773,1706, -1773,1707,1774, -1708,1774,1707, -1774,1708,1775, -1709,1775,1708, -1775,1709,1776, -1710,1776,1709, -1776,1710,1777, -1711,1777,1710, -1777,1711,1778, -1712,1778,1711, -1778,1712,1779, -1713,1779,1712, -1779,1713,1780, -1714,1780,1713, -1780,1714,1781, -1715,1781,1714, -1782,1716,1783, -1717,1783,1716, -1783,1717,1784, -1718,1784,1717, -1784,1718,1785, -1719,1785,1718, -1785,1719,1786, -1720,1786,1719, -1786,1720,1787, -1721,1787,1720, -1787,1721,1788, -1722,1788,1721, -1788,1722,1789, -1723,1789,1722, -1789,1723,1790, -1724,1790,1723, -1790,1724,1791, -1725,1791,1724, -1791,1725,1792, -1726,1792,1725, -1792,1726,1793, -1727,1793,1726, -1793,1727,1794, -1728,1794,1727, -1794,1728,1795, -1729,1795,1728, -1795,1729,1796, -1730,1796,1729, -1796,1730,1797, -1731,1797,1730, -1797,1731,1798, -1732,1798,1731, -1798,1732,1799, -1733,1799,1732, -1799,1733,1800, -1734,1800,1733, -1800,1734,1801, -1735,1801,1734, -1801,1735,1802, -1736,1802,1735, -1802,1736,1803, -1737,1803,1736, -1803,1737,1804, -1738,1804,1737, -1804,1738,1805, -1739,1805,1738, -1805,1739,1806, -1740,1806,1739, -1806,1740,1807, -1741,1807,1740, -1807,1741,1808, -1742,1808,1741, -1808,1742,1809, -1743,1809,1742, -1809,1743,1810, -1744,1810,1743, -1810,1744,1811, -1745,1811,1744, -1811,1745,1812, -1746,1812,1745, -1812,1746,1813, -1747,1813,1746, -1813,1747,1814, -1748,1814,1747, -1814,1748,1815, -1749,1815,1748, -1815,1749,1816, -1750,1816,1749, -1816,1750,1817, -1751,1817,1750, -1817,1751,1818, -1752,1818,1751, -1818,1752,1819, -1753,1819,1752, -1819,1753,1820, -1754,1820,1753, -1820,1754,1821, -1755,1821,1754, -1821,1755,1822, -1756,1822,1755, -1822,1756,1823, -1757,1823,1756, -1823,1757,1824, -1758,1824,1757, -1824,1758,1825, -1759,1825,1758, -1825,1759,1826, -1760,1826,1759, -1826,1760,1827, -1761,1827,1760, -1827,1761,1828, -1762,1828,1761, -1828,1762,1829, -1763,1829,1762, -1829,1763,1830, -1764,1830,1763, -1830,1764,1831, -1765,1831,1764, -1831,1765,1832, -1766,1832,1765, -1832,1766,1833, -1767,1833,1766, -1833,1767,1834, -1768,1834,1767, -1834,1768,1835, -1769,1835,1768, -1835,1769,1836, -1770,1836,1769, -1836,1770,1837, -1771,1837,1770, -1837,1771,1838, -1772,1838,1771, -1838,1772,1839, -1773,1839,1772, -1839,1773,1840, -1774,1840,1773, -1840,1774,1841, -1775,1841,1774, -1841,1775,1842, -1776,1842,1775, -1842,1776,1843, -1777,1843,1776, -1843,1777,1844, -1778,1844,1777, -1844,1778,1845, -1779,1845,1778, -1845,1779,1846, -1780,1846,1779, -1846,1780,1847, -1781,1847,1780, -1848,1782,1849, -1783,1849,1782, -1849,1783,1850, -1784,1850,1783, -1850,1784,1851, -1785,1851,1784, -1851,1785,1852, -1786,1852,1785, -1852,1786,1853, -1787,1853,1786, -1853,1787,1854, -1788,1854,1787, -1854,1788,1855, -1789,1855,1788, -1855,1789,1856, -1790,1856,1789, -1856,1790,1857, -1791,1857,1790, -1857,1791,1858, -1792,1858,1791, -1858,1792,1859, -1793,1859,1792, -1859,1793,1860, -1794,1860,1793, -1860,1794,1861, -1795,1861,1794, -1861,1795,1862, -1796,1862,1795, -1862,1796,1863, -1797,1863,1796, -1863,1797,1864, -1798,1864,1797, -1864,1798,1865, -1799,1865,1798, -1865,1799,1866, -1800,1866,1799, -1866,1800,1867, -1801,1867,1800, -1867,1801,1868, -1802,1868,1801, -1868,1802,1869, -1803,1869,1802, -1869,1803,1870, -1804,1870,1803, -1870,1804,1871, -1805,1871,1804, -1871,1805,1872, -1806,1872,1805, -1872,1806,1873, -1807,1873,1806, -1873,1807,1874, -1808,1874,1807, -1874,1808,1875, -1809,1875,1808, -1875,1809,1876, -1810,1876,1809, -1876,1810,1877, -1811,1877,1810, -1877,1811,1878, -1812,1878,1811, -1878,1812,1879, -1813,1879,1812, -1879,1813,1880, -1814,1880,1813, -1880,1814,1881, -1815,1881,1814, -1881,1815,1882, -1816,1882,1815, -1882,1816,1883, -1817,1883,1816, -1883,1817,1884, -1818,1884,1817, -1884,1818,1885, -1819,1885,1818, -1885,1819,1886, -1820,1886,1819, -1886,1820,1887, -1821,1887,1820, -1887,1821,1888, -1822,1888,1821, -1888,1822,1889, -1823,1889,1822, -1889,1823,1890, -1824,1890,1823, -1890,1824,1891, -1825,1891,1824, -1891,1825,1892, -1826,1892,1825, -1892,1826,1893, -1827,1893,1826, -1893,1827,1894, -1828,1894,1827, -1894,1828,1895, -1829,1895,1828, -1895,1829,1896, -1830,1896,1829, -1896,1830,1897, -1831,1897,1830, -1897,1831,1898, -1832,1898,1831, -1898,1832,1899, -1833,1899,1832, -1899,1833,1900, -1834,1900,1833, -1900,1834,1901, -1835,1901,1834, -1901,1835,1902, -1836,1902,1835, -1902,1836,1903, -1837,1903,1836, -1903,1837,1904, -1838,1904,1837, -1904,1838,1905, -1839,1905,1838, -1905,1839,1906, -1840,1906,1839, -1906,1840,1907, -1841,1907,1840, -1907,1841,1908, -1842,1908,1841, -1908,1842,1909, -1843,1909,1842, -1909,1843,1910, -1844,1910,1843, -1910,1844,1911, -1845,1911,1844, -1911,1845,1912, -1846,1912,1845, -1912,1846,1913, -1847,1913,1846, -1914,1848,1915, -1849,1915,1848, -1915,1849,1916, -1850,1916,1849, -1916,1850,1917, -1851,1917,1850, -1917,1851,1918, -1852,1918,1851, -1918,1852,1919, -1853,1919,1852, -1919,1853,1920, -1854,1920,1853, -1920,1854,1921, -1855,1921,1854, -1921,1855,1922, -1856,1922,1855, -1922,1856,1923, -1857,1923,1856, -1923,1857,1924, -1858,1924,1857, -1924,1858,1925, -1859,1925,1858, -1925,1859,1926, -1860,1926,1859, -1926,1860,1927, -1861,1927,1860, -1927,1861,1928, -1862,1928,1861, -1928,1862,1929, -1863,1929,1862, -1929,1863,1930, -1864,1930,1863, -1930,1864,1931, -1865,1931,1864, -1931,1865,1932, -1866,1932,1865, -1932,1866,1933, -1867,1933,1866, -1933,1867,1934, -1868,1934,1867, -1934,1868,1935, -1869,1935,1868, -1935,1869,1936, -1870,1936,1869, -1936,1870,1937, -1871,1937,1870, -1937,1871,1938, -1872,1938,1871, -1938,1872,1939, -1873,1939,1872, -1939,1873,1940, -1874,1940,1873, -1940,1874,1941, -1875,1941,1874, -1941,1875,1942, -1876,1942,1875, -1942,1876,1943, -1877,1943,1876, -1943,1877,1944, -1878,1944,1877, -1944,1878,1945, -1879,1945,1878, -1945,1879,1946, -1880,1946,1879, -1946,1880,1947, -1881,1947,1880, -1947,1881,1948, -1882,1948,1881, -1948,1882,1949, -1883,1949,1882, -1949,1883,1950, -1884,1950,1883, -1950,1884,1951, -1885,1951,1884, -1951,1885,1952, -1886,1952,1885, -1952,1886,1953, -1887,1953,1886, -1953,1887,1954, -1888,1954,1887, -1954,1888,1955, -1889,1955,1888, -1955,1889,1956, -1890,1956,1889, -1956,1890,1957, -1891,1957,1890, -1957,1891,1958, -1892,1958,1891, -1958,1892,1959, -1893,1959,1892, -1959,1893,1960, -1894,1960,1893, -1960,1894,1961, -1895,1961,1894, -1961,1895,1962, -1896,1962,1895, -1962,1896,1963, -1897,1963,1896, -1963,1897,1964, -1898,1964,1897, -1964,1898,1965, -1899,1965,1898, -1965,1899,1966, -1900,1966,1899, -1966,1900,1967, -1901,1967,1900, -1967,1901,1968, -1902,1968,1901, -1968,1902,1969, -1903,1969,1902, -1969,1903,1970, -1904,1970,1903, -1970,1904,1971, -1905,1971,1904, -1971,1905,1972, -1906,1972,1905, -1972,1906,1973, -1907,1973,1906, -1973,1907,1974, -1908,1974,1907, -1974,1908,1975, -1909,1975,1908, -1975,1909,1976, -1910,1976,1909, -1976,1910,1977, -1911,1977,1910, -1977,1911,1978, -1912,1978,1911, -1978,1912,1979, -1913,1979,1912, -}; - -#define Landscape03VtxCount 2048 -#define Landscape03IdxCount 11718 - -btScalar Landscape03Vtx[] = { -3.90625f,50.3865f,-2.20246e-006f, -3.90625f,52.6186f,3.90625f, -7.8125f,50.3905f,-2.20264e-006f, -7.8125f,51.8648f,3.90625f, -11.7188f,49.8171f,-2.17758e-006f, -11.7188f,51.1949f,3.90625f, -15.625f,50.595f,-2.21158e-006f, -15.625f,50.2102f,3.90625f, -19.5313f,50.405f,-2.20327e-006f, -19.5313f,50.6058f,3.90625f, -23.4375f,50.9679f,-2.22788e-006f, -23.4375f,50.7008f,3.90625f, -27.3438f,52.4635f,-2.29325e-006f, -27.3438f,51.2163f,3.90625f, -31.25f,53.1505f,-2.32328e-006f, -31.25f,51.4263f,3.90625f, -35.1563f,53.061f,-2.31937e-006f, -35.1563f,52.1968f,3.90625f, -39.0625f,53.6772f,-2.34631e-006f, -39.0625f,53.9783f,3.90625f, -42.9688f,54.3062f,-2.3738e-006f, -42.9688f,53.8927f,3.90625f, -46.875f,54.6795f,-2.39012e-006f, -46.875f,53.3266f,3.90625f, -50.7813f,55.3188f,-2.41806e-006f, -50.7813f,53.5901f,3.90625f, -54.6875f,56.913f,-2.48775e-006f, -54.6875f,55.5679f,3.90625f, -58.5938f,57.4575f,-2.51155e-006f, -58.5938f,55.1819f,3.90625f, -62.5f,56.5398f,-2.47143e-006f, -62.5f,53.6891f,3.90625f, -66.4063f,55.8786f,-2.44253e-006f, -66.4063f,53.0541f,3.90625f, -70.3125f,53.6497f,-2.3451e-006f, -70.3125f,51.6665f,3.90625f, -74.2188f,51.6447f,-2.25746e-006f, -74.2188f,51.4469f,3.90625f, -78.125f,51.8145f,-2.26488e-006f, -78.125f,51.9591f,3.90625f, -82.0313f,51.335f,-2.24392e-006f, -82.0313f,51.0418f,3.90625f, -85.9375f,50.1836f,-2.1936e-006f, -85.9375f,49.7513f,3.90625f, -89.8438f,49.0536f,-2.1442e-006f, -89.8438f,48.7329f,3.90625f, -93.75f,47.3968f,-2.07178e-006f, -93.75f,46.8713f,3.90625f, -97.6563f,45.8014f,-2.00204e-006f, -97.6563f,46.3905f,3.90625f, -101.563f,45.2347f,-1.97727e-006f, -101.563f,45.4241f,3.90625f, -105.469f,44.6501f,-1.95172e-006f, -105.469f,45.6811f,3.90625f, -109.375f,44.3569f,-1.9389e-006f, -109.375f,45.3238f,3.90625f, -113.281f,44.1147f,-1.92831e-006f, -113.281f,43.6112f,3.90625f, -117.188f,43.4037f,-1.89723e-006f, -117.188f,42.1291f,3.90625f, -121.094f,41.1606f,-1.79919e-006f, -121.094f,40.4747f,3.90625f, -125.0f,40.195f,-1.75698e-006f, -125.0f,39.3351f,3.90625f, -128.906f,39.5659f,-1.72948e-006f, -128.906f,38.0742f,3.90625f, -132.813f,38.2592f,-1.67236e-006f, -132.813f,36.7758f,3.90625f, -136.719f,36.4337f,-1.59257e-006f, -136.719f,34.9213f,3.90625f, -140.625f,34.1507f,-1.49277e-006f, -140.625f,32.3643f,3.90625f, -144.531f,31.5531f,-1.37923e-006f, -144.531f,31.7157f,3.90625f, -148.438f,29.9056f,-1.30722e-006f, -148.438f,30.6005f,3.90625f, -152.344f,30.5219f,-1.33416e-006f, -152.344f,31.6034f,3.90625f, -156.25f,31.1254f,-1.36053e-006f, -156.25f,32.6503f,3.90625f, -160.156f,31.8976f,-1.39429e-006f, -160.156f,33.3131f,3.90625f, -164.063f,31.5364f,-1.3785e-006f, -164.063f,32.5745f,3.90625f, -167.969f,30.5585f,-1.33575e-006f, -167.969f,31.5017f,3.90625f, -171.875f,30.0528f,-1.31365e-006f, -171.875f,30.6842f,3.90625f, -175.781f,29.2833f,-1.28002e-006f, -175.781f,29.8734f,3.90625f, -179.688f,28.3316f,-1.23841e-006f, -179.688f,28.6537f,3.90625f, -183.594f,27.0177f,-1.18098e-006f, -183.594f,27.2073f,3.90625f, -187.5f,24.7626f,-1.08241e-006f, -187.5f,25.4367f,3.90625f, -191.406f,22.7371f,-9.9387e-007f, -191.406f,24.1609f,3.90625f, -195.313f,21.6497f,-9.46338e-007f, -195.313f,23.9724f,3.90625f, -199.219f,21.3313f,-9.32422e-007f, -199.219f,23.7702f,3.90625f, -203.125f,20.9148f,-9.14215e-007f, -203.125f,22.4031f,3.90625f, -207.031f,19.4875f,-8.51826e-007f, -207.031f,22.1587f,3.90625f, -210.938f,19.0037f,-8.30679e-007f, -210.938f,21.6154f,3.90625f, -214.844f,18.408f,-8.0464e-007f, -214.844f,21.8202f,3.90625f, -218.75f,18.7855f,-8.2114e-007f, -218.75f,21.017f,3.90625f, -222.656f,18.1497f,-7.9335e-007f, -222.656f,19.3736f,3.90625f, -226.563f,17.6889f,-7.73205e-007f, -226.563f,18.2127f,3.90625f, -230.469f,16.8429f,-7.36228e-007f, -230.469f,17.2263f,3.90625f, -234.375f,16.3712f,-7.15609e-007f, -234.375f,16.2938f,3.90625f, -238.281f,14.3259f,-6.26204e-007f, -238.281f,14.4518f,3.90625f, -242.188f,12.4394f,-5.43742e-007f, -242.188f,13.6398f,3.90625f, -246.094f,12.3876f,-5.41479e-007f, -246.094f,13.2404f,3.90625f, -250.0f,11.9236f,-5.21196e-007f, -250.0f,12.7102f,3.90625f, -3.90625f,48.8559f,-3.90625f, -7.8125f,49.3575f,-3.90625f, -11.7188f,49.963f,-3.90625f, -15.625f,50.1126f,-3.90625f, -19.5313f,51.6247f,-3.90625f, -23.4375f,52.1716f,-3.90625f, -27.3438f,52.8679f,-3.90625f, -31.25f,53.978f,-3.90625f, -35.1563f,53.8948f,-3.90625f, -39.0625f,54.8492f,-3.90625f, -42.9688f,56.1714f,-3.90625f, -46.875f,56.4915f,-3.90625f, -50.7813f,56.5729f,-3.90625f, -54.6875f,57.9767f,-3.90625f, -58.5938f,58.6125f,-3.90625f, -62.5f,58.0023f,-3.90625f, -66.4063f,57.5742f,-3.90625f, -70.3125f,55.4949f,-3.90625f, -74.2188f,53.7219f,-3.90625f, -78.125f,53.233f,-3.90625f, -82.0313f,52.5499f,-3.90625f, -85.9375f,51.1842f,-3.90625f, -89.8438f,49.6534f,-3.90625f, -93.75f,47.6829f,-3.90625f, -97.6563f,45.813f,-3.90625f, -101.563f,44.7099f,-3.90625f, -105.469f,45.0932f,-3.90625f, -109.375f,44.8326f,-3.90625f, -113.281f,44.5197f,-3.90625f, -117.188f,43.7399f,-3.90625f, -121.094f,42.3088f,-3.90625f, -125.0f,40.4224f,-3.90625f, -128.906f,39.437f,-3.90625f, -132.813f,39.825f,-3.90625f, -136.719f,38.2979f,-3.90625f, -140.625f,35.2095f,-3.90625f, -144.531f,32.0692f,-3.90625f, -148.438f,31.1765f,-3.90625f, -152.344f,32.2065f,-3.90625f, -156.25f,31.4774f,-3.90625f, -160.156f,31.7166f,-3.90625f, -164.063f,31.7667f,-3.90625f, -167.969f,31.1742f,-3.90625f, -171.875f,29.6515f,-3.90625f, -175.781f,28.7845f,-3.90625f, -179.688f,28.3154f,-3.90625f, -183.594f,26.6187f,-3.90625f, -187.5f,24.7363f,-3.90625f, -191.406f,22.9162f,-3.90625f, -195.313f,21.5211f,-3.90625f, -199.219f,19.7693f,-3.90625f, -203.125f,18.9792f,-3.90625f, -207.031f,18.8399f,-3.90625f, -210.938f,18.8797f,-3.90625f, -214.844f,18.8123f,-3.90625f, -218.75f,18.5136f,-3.90625f, -222.656f,18.5607f,-3.90625f, -226.563f,17.5053f,-3.90625f, -230.469f,17.4838f,-3.90625f, -234.375f,16.6728f,-3.90625f, -238.281f,14.8594f,-3.90625f, -242.188f,12.9613f,-3.90625f, -246.094f,12.8624f,-3.90625f, -250.0f,11.5894f,-3.90625f, -3.90625f,48.7225f,-7.8125f, -7.8125f,49.1281f,-7.8125f, -11.7188f,50.0005f,-7.8125f, -15.625f,50.5896f,-7.8125f, -19.5313f,51.5499f,-7.8125f, -23.4375f,52.9511f,-7.8125f, -27.3438f,53.117f,-7.8125f, -31.25f,54.0682f,-7.8125f, -35.1563f,55.2353f,-7.8125f, -39.0625f,57.2741f,-7.8125f, -42.9688f,57.4338f,-7.8125f, -46.875f,57.766f,-7.8125f, -50.7813f,57.2724f,-7.8125f, -54.6875f,58.0147f,-7.8125f, -58.5938f,58.764f,-7.8125f, -62.5f,58.6375f,-7.8125f, -66.4063f,57.2699f,-7.8125f, -70.3125f,55.9883f,-7.8125f, -74.2188f,54.8767f,-7.8125f, -78.125f,54.5266f,-7.8125f, -82.0313f,53.7148f,-7.8125f, -85.9375f,52.3735f,-7.8125f, -89.8438f,50.9637f,-7.8125f, -93.75f,48.4983f,-7.8125f, -97.6563f,45.9034f,-7.8125f, -101.563f,45.0863f,-7.8125f, -105.469f,44.2432f,-7.8125f, -109.375f,43.9561f,-7.8125f, -113.281f,43.3015f,-7.8125f, -117.188f,43.254f,-7.8125f, -121.094f,42.7388f,-7.8125f, -125.0f,41.1851f,-7.8125f, -128.906f,39.7522f,-7.8125f, -132.813f,39.8116f,-7.8125f, -136.719f,38.7148f,-7.8125f, -140.625f,36.0845f,-7.8125f, -144.531f,34.0308f,-7.8125f, -148.438f,33.0368f,-7.8125f, -152.344f,32.5867f,-7.8125f, -156.25f,32.8758f,-7.8125f, -160.156f,32.65f,-7.8125f, -164.063f,32.6826f,-7.8125f, -167.969f,31.5243f,-7.8125f, -171.875f,30.4061f,-7.8125f, -175.781f,29.2721f,-7.8125f, -179.688f,28.0417f,-7.8125f, -183.594f,26.2041f,-7.8125f, -187.5f,24.2168f,-7.8125f, -191.406f,22.7847f,-7.8125f, -195.313f,20.5069f,-7.8125f, -199.219f,18.6189f,-7.8125f, -203.125f,17.5296f,-7.8125f, -207.031f,18.0846f,-7.8125f, -210.938f,18.4802f,-7.8125f, -214.844f,18.5436f,-7.8125f, -218.75f,18.3296f,-7.8125f, -222.656f,17.9158f,-7.8125f, -226.563f,17.0318f,-7.8125f, -230.469f,16.2818f,-7.8125f, -234.375f,15.4949f,-7.8125f, -238.281f,13.4891f,-7.8125f, -242.188f,13.3349f,-7.8125f, -246.094f,12.2716f,-7.8125f, -250.0f,10.9901f,-7.8125f, -3.90625f,49.6298f,-11.7188f, -7.8125f,50.0683f,-11.7188f, -11.7188f,50.6295f,-11.7188f, -15.625f,51.0495f,-11.7188f, -19.5313f,52.4884f,-11.7188f, -23.4375f,53.3147f,-11.7188f, -27.3438f,54.4311f,-11.7188f, -31.25f,55.2874f,-11.7188f, -35.1563f,56.5549f,-11.7188f, -39.0625f,57.9376f,-11.7188f, -42.9688f,58.2302f,-11.7188f, -46.875f,59.1419f,-11.7188f, -50.7813f,58.8724f,-11.7188f, -54.6875f,58.5393f,-11.7188f, -58.5938f,58.6416f,-11.7188f, -62.5f,58.1973f,-11.7188f, -66.4063f,57.9168f,-11.7188f, -70.3125f,56.4347f,-11.7188f, -74.2188f,55.7911f,-11.7188f, -78.125f,55.946f,-11.7188f, -82.0313f,54.9033f,-11.7188f, -85.9375f,53.0954f,-11.7188f, -89.8438f,51.7428f,-11.7188f, -93.75f,49.2198f,-11.7188f, -97.6563f,46.1127f,-11.7188f, -101.563f,43.9953f,-11.7188f, -105.469f,43.5777f,-11.7188f, -109.375f,43.3284f,-11.7188f, -113.281f,43.5152f,-11.7188f, -117.188f,43.6687f,-11.7188f, -121.094f,42.5477f,-11.7188f, -125.0f,41.4079f,-11.7188f, -128.906f,39.4512f,-11.7188f, -132.813f,39.5183f,-11.7188f, -136.719f,37.8068f,-11.7188f, -140.625f,36.5652f,-11.7188f, -144.531f,34.8202f,-11.7188f, -148.438f,34.0166f,-11.7188f, -152.344f,33.5311f,-11.7188f, -156.25f,34.1672f,-11.7188f, -160.156f,33.8602f,-11.7188f, -164.063f,33.8717f,-11.7188f, -167.969f,33.1703f,-11.7188f, -171.875f,31.0241f,-11.7188f, -175.781f,30.2798f,-11.7188f, -179.688f,28.3241f,-11.7188f, -183.594f,26.4432f,-11.7188f, -187.5f,24.9758f,-11.7188f, -191.406f,22.2834f,-11.7188f, -195.313f,19.3875f,-11.7188f, -199.219f,18.4079f,-11.7188f, -203.125f,16.6498f,-11.7188f, -207.031f,16.1235f,-11.7188f, -210.938f,16.9462f,-11.7188f, -214.844f,17.2638f,-11.7188f, -218.75f,17.0386f,-11.7188f, -222.656f,16.7666f,-11.7188f, -226.563f,15.3591f,-11.7188f, -230.469f,14.4048f,-11.7188f, -234.375f,13.3079f,-11.7188f, -238.281f,13.0895f,-11.7188f, -242.188f,12.8462f,-11.7188f, -246.094f,12.6287f,-11.7188f, -250.0f,11.4682f,-11.7188f, -3.90625f,50.6915f,-15.625f, -7.8125f,51.2382f,-15.625f, -11.7188f,52.3659f,-15.625f, -15.625f,52.3873f,-15.625f, -19.5313f,53.1083f,-15.625f, -23.4375f,54.652f,-15.625f, -27.3438f,56.0359f,-15.625f, -31.25f,56.4398f,-15.625f, -35.1563f,57.3156f,-15.625f, -39.0625f,58.2355f,-15.625f, -42.9688f,59.4547f,-15.625f, -46.875f,59.9176f,-15.625f, -50.7813f,60.0789f,-15.625f, -54.6875f,59.004f,-15.625f, -58.5938f,59.3361f,-15.625f, -62.5f,59.2681f,-15.625f, -66.4063f,58.5571f,-15.625f, -70.3125f,57.1801f,-15.625f, -74.2188f,56.2048f,-15.625f, -78.125f,56.9427f,-15.625f, -82.0313f,55.401f,-15.625f, -85.9375f,53.0457f,-15.625f, -89.8438f,51.6378f,-15.625f, -93.75f,49.1297f,-15.625f, -97.6563f,46.6267f,-15.625f, -101.563f,44.7255f,-15.625f, -105.469f,43.3819f,-15.625f, -109.375f,42.8703f,-15.625f, -113.281f,42.7636f,-15.625f, -117.188f,42.1897f,-15.625f, -121.094f,41.9269f,-15.625f, -125.0f,41.5365f,-15.625f, -128.906f,39.5408f,-15.625f, -132.813f,38.9178f,-15.625f, -136.719f,38.1447f,-15.625f, -140.625f,36.5145f,-15.625f, -144.531f,34.8696f,-15.625f, -148.438f,34.8203f,-15.625f, -152.344f,34.409f,-15.625f, -156.25f,35.1394f,-15.625f, -160.156f,35.619f,-15.625f, -164.063f,34.7784f,-15.625f, -167.969f,33.6548f,-15.625f, -171.875f,32.1822f,-15.625f, -175.781f,31.1666f,-15.625f, -179.688f,28.9574f,-15.625f, -183.594f,27.3989f,-15.625f, -187.5f,24.7201f,-15.625f, -191.406f,21.7859f,-15.625f, -195.313f,19.2508f,-15.625f, -199.219f,18.0209f,-15.625f, -203.125f,16.8441f,-15.625f, -207.031f,15.8846f,-15.625f, -210.938f,15.6902f,-15.625f, -214.844f,15.3143f,-15.625f, -218.75f,15.3862f,-15.625f, -222.656f,14.2743f,-15.625f, -226.563f,13.5791f,-15.625f, -230.469f,13.4953f,-15.625f, -234.375f,13.3484f,-15.625f, -238.281f,13.2722f,-15.625f, -242.188f,13.4455f,-15.625f, -246.094f,13.0725f,-15.625f, -250.0f,11.5558f,-15.625f, -3.90625f,52.1028f,-19.5313f, -7.8125f,52.877f,-19.5313f, -11.7188f,54.5397f,-19.5313f, -15.625f,54.8941f,-19.5313f, -19.5313f,54.9009f,-19.5313f, -23.4375f,56.1681f,-19.5313f, -27.3438f,56.5579f,-19.5313f, -31.25f,57.7962f,-19.5313f, -35.1563f,58.728f,-19.5313f, -39.0625f,59.4794f,-19.5313f, -42.9688f,60.2636f,-19.5313f, -46.875f,61.2139f,-19.5313f, -50.7813f,60.4636f,-19.5313f, -54.6875f,59.681f,-19.5313f, -58.5938f,60.2068f,-19.5313f, -62.5f,59.1055f,-19.5313f, -66.4063f,57.6126f,-19.5313f, -70.3125f,56.6416f,-19.5313f, -74.2188f,56.4864f,-19.5313f, -78.125f,56.1784f,-19.5313f, -82.0313f,54.8451f,-19.5313f, -85.9375f,53.4094f,-19.5313f, -89.8438f,51.7161f,-19.5313f, -93.75f,48.9933f,-19.5313f, -97.6563f,47.5116f,-19.5313f, -101.563f,45.7701f,-19.5313f, -105.469f,44.0377f,-19.5313f, -109.375f,43.0918f,-19.5313f, -113.281f,42.3992f,-19.5313f, -117.188f,42.0928f,-19.5313f, -121.094f,42.0543f,-19.5313f, -125.0f,41.793f,-19.5313f, -128.906f,39.3232f,-19.5313f, -132.813f,39.1149f,-19.5313f, -136.719f,38.2381f,-19.5313f, -140.625f,36.1019f,-19.5313f, -144.531f,36.4503f,-19.5313f, -148.438f,35.6809f,-19.5313f, -152.344f,35.8022f,-19.5313f, -156.25f,36.4955f,-19.5313f, -160.156f,36.3187f,-19.5313f, -164.063f,35.0268f,-19.5313f, -167.969f,34.0134f,-19.5313f, -171.875f,33.6455f,-19.5313f, -175.781f,31.5932f,-19.5313f, -179.688f,30.0326f,-19.5313f, -183.594f,28.3453f,-19.5313f, -187.5f,25.3719f,-19.5313f, -191.406f,22.0833f,-19.5313f, -195.313f,18.7475f,-19.5313f, -199.219f,17.5517f,-19.5313f, -203.125f,16.1528f,-19.5313f, -207.031f,15.6144f,-19.5313f, -210.938f,14.9281f,-19.5313f, -214.844f,14.5711f,-19.5313f, -218.75f,13.8446f,-19.5313f, -222.656f,13.6892f,-19.5313f, -226.563f,13.1595f,-19.5313f, -230.469f,13.2872f,-19.5313f, -234.375f,13.6153f,-19.5313f, -238.281f,12.8725f,-19.5313f, -242.188f,12.7128f,-19.5313f, -246.094f,13.0658f,-19.5313f, -250.0f,11.5414f,-19.5313f, -3.90625f,54.332f,-23.4375f, -7.8125f,55.636f,-23.4375f, -11.7188f,56.3899f,-23.4375f, -15.625f,56.3763f,-23.4375f, -19.5313f,56.9523f,-23.4375f, -23.4375f,57.5593f,-23.4375f, -27.3438f,57.8056f,-23.4375f, -31.25f,58.5489f,-23.4375f, -35.1563f,59.2321f,-23.4375f, -39.0625f,60.5971f,-23.4375f, -42.9688f,60.1728f,-23.4375f, -46.875f,60.9341f,-23.4375f, -50.7813f,59.5118f,-23.4375f, -54.6875f,59.7552f,-23.4375f, -58.5938f,59.9126f,-23.4375f, -62.5f,58.501f,-23.4375f, -66.4063f,57.8539f,-23.4375f, -70.3125f,56.8693f,-23.4375f, -74.2188f,56.0687f,-23.4375f, -78.125f,55.4392f,-23.4375f, -82.0313f,53.7167f,-23.4375f, -85.9375f,52.1078f,-23.4375f, -89.8438f,50.8869f,-23.4375f, -93.75f,49.9812f,-23.4375f, -97.6563f,47.9233f,-23.4375f, -101.563f,46.1166f,-23.4375f, -105.469f,44.4826f,-23.4375f, -109.375f,42.8924f,-23.4375f, -113.281f,41.9991f,-23.4375f, -117.188f,41.1759f,-23.4375f, -121.094f,41.1189f,-23.4375f, -125.0f,39.9128f,-23.4375f, -128.906f,39.8641f,-23.4375f, -132.813f,39.8777f,-23.4375f, -136.719f,38.3567f,-23.4375f, -140.625f,37.4926f,-23.4375f, -144.531f,37.0275f,-23.4375f, -148.438f,36.7211f,-23.4375f, -152.344f,36.9355f,-23.4375f, -156.25f,37.7455f,-23.4375f, -160.156f,37.3585f,-23.4375f, -164.063f,36.1837f,-23.4375f, -167.969f,34.768f,-23.4375f, -171.875f,33.2179f,-23.4375f, -175.781f,31.6883f,-23.4375f, -179.688f,30.1136f,-23.4375f, -183.594f,28.1155f,-23.4375f, -187.5f,25.4881f,-23.4375f, -191.406f,22.8498f,-23.4375f, -195.313f,19.4425f,-23.4375f, -199.219f,17.1253f,-23.4375f, -203.125f,14.8354f,-23.4375f, -207.031f,14.1771f,-23.4375f, -210.938f,13.9227f,-23.4375f, -214.844f,13.3404f,-23.4375f, -218.75f,13.0525f,-23.4375f, -222.656f,13.0744f,-23.4375f, -226.563f,13.0432f,-23.4375f, -230.469f,13.3341f,-23.4375f, -234.375f,13.6022f,-23.4375f, -238.281f,13.3878f,-23.4375f, -242.188f,12.5812f,-23.4375f, -246.094f,11.8699f,-23.4375f, -250.0f,11.3395f,-23.4375f, -3.90625f,57.5273f,-27.3438f, -7.8125f,57.8217f,-27.3438f, -11.7188f,57.5626f,-27.3438f, -15.625f,57.7794f,-27.3438f, -19.5313f,58.7949f,-27.3438f, -23.4375f,59.3547f,-27.3438f, -27.3438f,59.2359f,-27.3438f, -31.25f,58.8772f,-27.3438f, -35.1563f,58.7149f,-27.3438f, -39.0625f,59.7221f,-27.3438f, -42.9688f,60.0457f,-27.3438f, -46.875f,59.6559f,-27.3438f, -50.7813f,59.9346f,-27.3438f, -54.6875f,60.4095f,-27.3438f, -58.5938f,59.3107f,-27.3438f, -62.5f,57.9086f,-27.3438f, -66.4063f,57.3034f,-27.3438f, -70.3125f,55.5758f,-27.3438f, -74.2188f,54.7167f,-27.3438f, -78.125f,54.405f,-27.3438f, -82.0313f,53.0644f,-27.3438f, -85.9375f,50.9689f,-27.3438f, -89.8438f,49.5959f,-27.3438f, -93.75f,49.2817f,-27.3438f, -97.6563f,48.9188f,-27.3438f, -101.563f,47.0066f,-27.3438f, -105.469f,44.4266f,-27.3438f, -109.375f,42.4539f,-27.3438f, -113.281f,41.5486f,-27.3438f, -117.188f,41.4419f,-27.3438f, -121.094f,41.2039f,-27.3438f, -125.0f,40.188f,-27.3438f, -128.906f,40.4744f,-27.3438f, -132.813f,40.1187f,-27.3438f, -136.719f,38.8055f,-27.3438f, -140.625f,38.024f,-27.3438f, -144.531f,37.5255f,-27.3438f, -148.438f,36.8676f,-27.3438f, -152.344f,37.8967f,-27.3438f, -156.25f,38.4708f,-27.3438f, -160.156f,37.8284f,-27.3438f, -164.063f,36.6094f,-27.3438f, -167.969f,34.4523f,-27.3438f, -171.875f,32.2936f,-27.3438f, -175.781f,31.7467f,-27.3438f, -179.688f,29.9455f,-27.3438f, -183.594f,27.7546f,-27.3438f, -187.5f,25.1902f,-27.3438f, -191.406f,22.537f,-27.3438f, -195.313f,19.5657f,-27.3438f, -199.219f,17.4406f,-27.3438f, -203.125f,15.5459f,-27.3438f, -207.031f,14.92f,-27.3438f, -210.938f,13.472f,-27.3438f, -214.844f,12.9933f,-27.3438f, -218.75f,13.2849f,-27.3438f, -222.656f,12.3375f,-27.3438f, -226.563f,12.0553f,-27.3438f, -230.469f,12.4756f,-27.3438f, -234.375f,12.0857f,-27.3438f, -238.281f,12.1988f,-27.3438f, -242.188f,11.9091f,-27.3438f, -246.094f,10.7301f,-27.3438f, -250.0f,10.1068f,-27.3438f, -3.90625f,59.4204f,-31.25f, -7.8125f,59.5424f,-31.25f, -11.7188f,58.7785f,-31.25f, -15.625f,59.7851f,-31.25f, -19.5313f,60.4897f,-31.25f, -23.4375f,60.6095f,-31.25f, -27.3438f,60.3384f,-31.25f, -31.25f,59.5445f,-31.25f, -35.1563f,58.6838f,-31.25f, -39.0625f,58.847f,-31.25f, -42.9688f,59.3885f,-31.25f, -46.875f,59.447f,-31.25f, -50.7813f,59.5998f,-31.25f, -54.6875f,58.9947f,-31.25f, -58.5938f,58.7482f,-31.25f, -62.5f,56.5947f,-31.25f, -66.4063f,56.2941f,-31.25f, -70.3125f,54.6423f,-31.25f, -74.2188f,53.7392f,-31.25f, -78.125f,53.2955f,-31.25f, -82.0313f,52.8233f,-31.25f, -85.9375f,52.1194f,-31.25f, -89.8438f,51.3335f,-31.25f, -93.75f,49.9201f,-31.25f, -97.6563f,49.1642f,-31.25f, -101.563f,47.4466f,-31.25f, -105.469f,44.6086f,-31.25f, -109.375f,42.885f,-31.25f, -113.281f,42.947f,-31.25f, -117.188f,42.2436f,-31.25f, -121.094f,41.6479f,-31.25f, -125.0f,41.6151f,-31.25f, -128.906f,41.2079f,-31.25f, -132.813f,40.7975f,-31.25f, -136.719f,39.8341f,-31.25f, -140.625f,38.7649f,-31.25f, -144.531f,37.7387f,-31.25f, -148.438f,37.2112f,-31.25f, -152.344f,38.3278f,-31.25f, -156.25f,38.7659f,-31.25f, -160.156f,37.5608f,-31.25f, -164.063f,35.9966f,-31.25f, -167.969f,33.737f,-31.25f, -171.875f,32.0109f,-31.25f, -175.781f,31.1169f,-31.25f, -179.688f,30.0211f,-31.25f, -183.594f,27.5633f,-31.25f, -187.5f,25.0292f,-31.25f, -191.406f,22.8265f,-31.25f, -195.313f,19.8972f,-31.25f, -199.219f,17.6714f,-31.25f, -203.125f,16.2679f,-31.25f, -207.031f,15.0546f,-31.25f, -210.938f,14.037f,-31.25f, -214.844f,12.5501f,-31.25f, -218.75f,12.1528f,-31.25f, -222.656f,12.0576f,-31.25f, -226.563f,11.2847f,-31.25f, -230.469f,11.5946f,-31.25f, -234.375f,10.9216f,-31.25f, -238.281f,10.9182f,-31.25f, -242.188f,11.2826f,-31.25f, -246.094f,11.5781f,-31.25f, -250.0f,11.536f,-31.25f, -3.90625f,60.2212f,-35.1563f, -7.8125f,59.3731f,-35.1563f, -11.7188f,58.5327f,-35.1563f, -15.625f,59.5785f,-35.1563f, -19.5313f,60.1491f,-35.1563f, -23.4375f,60.5297f,-35.1563f, -27.3438f,60.5336f,-35.1563f, -31.25f,60.162f,-35.1563f, -35.1563f,58.5927f,-35.1563f, -39.0625f,57.9369f,-35.1563f, -42.9688f,58.4405f,-35.1563f, -46.875f,58.7374f,-35.1563f, -50.7813f,57.6198f,-35.1563f, -54.6875f,57.3277f,-35.1563f, -58.5938f,56.6423f,-35.1563f, -62.5f,56.2444f,-35.1563f, -66.4063f,56.132f,-35.1563f, -70.3125f,54.6673f,-35.1563f, -74.2188f,53.2924f,-35.1563f, -78.125f,53.2569f,-35.1563f, -82.0313f,52.0828f,-35.1563f, -85.9375f,51.9661f,-35.1563f, -89.8438f,50.9045f,-35.1563f, -93.75f,49.4997f,-35.1563f, -97.6563f,48.0748f,-35.1563f, -101.563f,46.3182f,-35.1563f, -105.469f,44.0878f,-35.1563f, -109.375f,42.863f,-35.1563f, -113.281f,42.8044f,-35.1563f, -117.188f,42.9648f,-35.1563f, -121.094f,42.3221f,-35.1563f, -125.0f,41.6576f,-35.1563f, -128.906f,41.1606f,-35.1563f, -132.813f,39.59f,-35.1563f, -136.719f,38.5602f,-35.1563f, -140.625f,37.9389f,-35.1563f, -144.531f,37.2602f,-35.1563f, -148.438f,37.3784f,-35.1563f, -152.344f,37.8906f,-35.1563f, -156.25f,37.8221f,-35.1563f, -160.156f,36.3088f,-35.1563f, -164.063f,35.1881f,-35.1563f, -167.969f,33.2601f,-35.1563f, -171.875f,31.8157f,-35.1563f, -175.781f,31.3416f,-35.1563f, -179.688f,30.0265f,-35.1563f, -183.594f,27.3943f,-35.1563f, -187.5f,24.641f,-35.1563f, -191.406f,22.2525f,-35.1563f, -195.313f,20.2011f,-35.1563f, -199.219f,18.7104f,-35.1563f, -203.125f,17.3459f,-35.1563f, -207.031f,15.2838f,-35.1563f, -210.938f,13.6157f,-35.1563f, -214.844f,13.3893f,-35.1563f, -218.75f,12.9319f,-35.1563f, -222.656f,11.5191f,-35.1563f, -226.563f,10.4878f,-35.1563f, -230.469f,9.83031f,-35.1563f, -234.375f,9.91945f,-35.1563f, -238.281f,10.9647f,-35.1563f, -242.188f,11.5866f,-35.1563f, -246.094f,11.8313f,-35.1563f, -250.0f,11.9419f,-35.1563f, -3.90625f,59.9094f,-39.0625f, -7.8125f,58.6207f,-39.0625f, -11.7188f,57.735f,-39.0625f, -15.625f,58.9909f,-39.0625f, -19.5313f,60.0678f,-39.0625f, -23.4375f,60.5419f,-39.0625f, -27.3438f,60.4672f,-39.0625f, -31.25f,59.5824f,-39.0625f, -35.1563f,58.4068f,-39.0625f, -39.0625f,57.5098f,-39.0625f, -42.9688f,57.6631f,-39.0625f, -46.875f,57.8211f,-39.0625f, -50.7813f,57.1897f,-39.0625f, -54.6875f,55.6789f,-39.0625f, -58.5938f,55.3212f,-39.0625f, -62.5f,55.2941f,-39.0625f, -66.4063f,55.8101f,-39.0625f, -70.3125f,54.309f,-39.0625f, -74.2188f,53.6313f,-39.0625f, -78.125f,52.7246f,-39.0625f, -82.0313f,51.5473f,-39.0625f, -85.9375f,51.5315f,-39.0625f, -89.8438f,50.6121f,-39.0625f, -93.75f,50.3734f,-39.0625f, -97.6563f,48.8877f,-39.0625f, -101.563f,47.0081f,-39.0625f, -105.469f,44.4827f,-39.0625f, -109.375f,43.5851f,-39.0625f, -113.281f,43.2668f,-39.0625f, -117.188f,43.4016f,-39.0625f, -121.094f,41.962f,-39.0625f, -125.0f,41.4641f,-39.0625f, -128.906f,40.2221f,-39.0625f, -132.813f,38.9234f,-39.0625f, -136.719f,37.7062f,-39.0625f, -140.625f,37.6455f,-39.0625f, -144.531f,37.8691f,-39.0625f, -148.438f,37.4139f,-39.0625f, -152.344f,37.204f,-39.0625f, -156.25f,36.7774f,-39.0625f, -160.156f,35.8962f,-39.0625f, -164.063f,34.5247f,-39.0625f, -167.969f,32.7322f,-39.0625f, -171.875f,32.1044f,-39.0625f, -175.781f,31.321f,-39.0625f, -179.688f,29.7775f,-39.0625f, -183.594f,26.7381f,-39.0625f, -187.5f,24.0216f,-39.0625f, -191.406f,22.277f,-39.0625f, -195.313f,21.2497f,-39.0625f, -199.219f,19.9529f,-39.0625f, -203.125f,18.3349f,-39.0625f, -207.031f,16.7961f,-39.0625f, -210.938f,15.071f,-39.0625f, -214.844f,13.5616f,-39.0625f, -218.75f,13.1679f,-39.0625f, -222.656f,11.2729f,-39.0625f, -226.563f,10.5025f,-39.0625f, -230.469f,9.72086f,-39.0625f, -234.375f,9.90489f,-39.0625f, -238.281f,10.7231f,-39.0625f, -242.188f,11.2573f,-39.0625f, -246.094f,12.0761f,-39.0625f, -250.0f,11.902f,-39.0625f, -3.90625f,59.5207f,-42.9688f, -7.8125f,58.2483f,-42.9688f, -11.7188f,58.069f,-42.9688f, -15.625f,59.4248f,-42.9688f, -19.5313f,60.5261f,-42.9688f, -23.4375f,60.668f,-42.9688f, -27.3438f,60.0252f,-42.9688f, -31.25f,58.0523f,-42.9688f, -35.1563f,56.7426f,-42.9688f, -39.0625f,57.2045f,-42.9688f, -42.9688f,57.166f,-42.9688f, -46.875f,56.9465f,-42.9688f, -50.7813f,55.7381f,-42.9688f, -54.6875f,55.2924f,-42.9688f, -58.5938f,54.6074f,-42.9688f, -62.5f,54.1882f,-42.9688f, -66.4063f,53.672f,-42.9688f, -70.3125f,53.3122f,-42.9688f, -74.2188f,53.0852f,-42.9688f, -78.125f,52.6173f,-42.9688f, -82.0313f,51.616f,-42.9688f, -85.9375f,50.148f,-42.9688f, -89.8438f,49.4823f,-42.9688f, -93.75f,50.0221f,-42.9688f, -97.6563f,48.9931f,-42.9688f, -101.563f,47.1045f,-42.9688f, -105.469f,44.442f,-42.9688f, -109.375f,44.5071f,-42.9688f, -113.281f,44.1005f,-42.9688f, -117.188f,42.8414f,-42.9688f, -121.094f,42.5419f,-42.9688f, -125.0f,41.5451f,-42.9688f, -128.906f,39.4272f,-42.9688f, -132.813f,39.8815f,-42.9688f, -136.719f,39.1366f,-42.9688f, -140.625f,38.7457f,-42.9688f, -144.531f,38.4257f,-42.9688f, -148.438f,37.9899f,-42.9688f, -152.344f,37.1716f,-42.9688f, -156.25f,36.0431f,-42.9688f, -160.156f,35.0784f,-42.9688f, -164.063f,33.3564f,-42.9688f, -167.969f,32.1522f,-42.9688f, -171.875f,30.9698f,-42.9688f, -175.781f,29.7186f,-42.9688f, -179.688f,28.0509f,-42.9688f, -183.594f,25.8254f,-42.9688f, -187.5f,24.8502f,-42.9688f, -191.406f,22.9031f,-42.9688f, -195.313f,20.8135f,-42.9688f, -199.219f,19.6651f,-42.9688f, -203.125f,18.4753f,-42.9688f, -207.031f,17.2259f,-42.9688f, -210.938f,15.6171f,-42.9688f, -214.844f,13.2953f,-42.9688f, -218.75f,13.1679f,-42.9688f, -222.656f,10.7772f,-42.9688f, -226.563f,9.62294f,-42.9688f, -230.469f,9.27609f,-42.9688f, -234.375f,9.47241f,-42.9688f, -238.281f,10.2411f,-42.9688f, -242.188f,11.3745f,-42.9688f, -246.094f,10.981f,-42.9688f, -250.0f,9.93179f,-42.9688f, -3.90625f,58.9086f,-46.875f, -7.8125f,58.895f,-46.875f, -11.7188f,59.1807f,-46.875f, -15.625f,60.2442f,-46.875f, -19.5313f,60.6114f,-46.875f, -23.4375f,59.9439f,-46.875f, -27.3438f,58.704f,-46.875f, -31.25f,58.3729f,-46.875f, -35.1563f,57.0256f,-46.875f, -39.0625f,57.069f,-46.875f, -42.9688f,57.0536f,-46.875f, -46.875f,55.7912f,-46.875f, -50.7813f,54.8674f,-46.875f, -54.6875f,53.8265f,-46.875f, -58.5938f,53.563f,-46.875f, -62.5f,52.5979f,-46.875f, -66.4063f,52.3986f,-46.875f, -70.3125f,52.1891f,-46.875f, -74.2188f,52.2468f,-46.875f, -78.125f,52.3398f,-46.875f, -82.0313f,50.9875f,-46.875f, -85.9375f,49.4072f,-46.875f, -89.8438f,48.3295f,-46.875f, -93.75f,48.9009f,-46.875f, -97.6563f,47.6633f,-46.875f, -101.563f,44.4101f,-46.875f, -105.469f,44.0249f,-46.875f, -109.375f,43.7395f,-46.875f, -113.281f,44.0967f,-46.875f, -117.188f,43.3593f,-46.875f, -121.094f,42.11f,-46.875f, -125.0f,40.8903f,-46.875f, -128.906f,40.3861f,-46.875f, -132.813f,40.075f,-46.875f, -136.719f,39.6347f,-46.875f, -140.625f,38.7369f,-46.875f, -144.531f,37.9042f,-46.875f, -148.438f,36.8546f,-46.875f, -152.344f,36.4012f,-46.875f, -156.25f,35.3977f,-46.875f, -160.156f,34.0947f,-46.875f, -164.063f,32.2545f,-46.875f, -167.969f,30.0086f,-46.875f, -171.875f,29.202f,-46.875f, -175.781f,28.0362f,-46.875f, -179.688f,26.7114f,-46.875f, -183.594f,25.9577f,-46.875f, -187.5f,25.3242f,-46.875f, -191.406f,23.8586f,-46.875f, -195.313f,20.6056f,-46.875f, -199.219f,19.3835f,-46.875f, -203.125f,17.4503f,-46.875f, -207.031f,16.5736f,-46.875f, -210.938f,14.945f,-46.875f, -214.844f,12.5914f,-46.875f, -218.75f,11.835f,-46.875f, -222.656f,10.1636f,-46.875f, -226.563f,9.71281f,-46.875f, -230.469f,9.27988f,-46.875f, -234.375f,8.50394f,-46.875f, -238.281f,9.20978f,-46.875f, -242.188f,9.21707f,-46.875f, -246.094f,9.40089f,-46.875f, -250.0f,8.55411f,-46.875f, -3.90625f,59.8509f,-50.7813f, -7.8125f,59.6141f,-50.7813f, -11.7188f,59.7453f,-50.7813f, -15.625f,60.4259f,-50.7813f, -19.5313f,59.4314f,-50.7813f, -23.4375f,59.033f,-50.7813f, -27.3438f,57.561f,-50.7813f, -31.25f,57.9511f,-50.7813f, -35.1563f,57.0088f,-50.7813f, -39.0625f,56.2469f,-50.7813f, -42.9688f,55.8604f,-50.7813f, -46.875f,55.2326f,-50.7813f, -50.7813f,54.8965f,-50.7813f, -54.6875f,53.1713f,-50.7813f, -58.5938f,52.6122f,-50.7813f, -62.5f,50.9097f,-50.7813f, -66.4063f,50.8144f,-50.7813f, -70.3125f,50.2702f,-50.7813f, -74.2188f,51.4962f,-50.7813f, -78.125f,50.7879f,-50.7813f, -82.0313f,49.5502f,-50.7813f, -85.9375f,48.3386f,-50.7813f, -89.8438f,48.0143f,-50.7813f, -93.75f,46.7527f,-50.7813f, -97.6563f,45.5374f,-50.7813f, -101.563f,44.3542f,-50.7813f, -105.469f,44.8366f,-50.7813f, -109.375f,45.0192f,-50.7813f, -113.281f,44.4763f,-50.7813f, -117.188f,43.4751f,-50.7813f, -121.094f,42.029f,-50.7813f, -125.0f,40.9708f,-50.7813f, -128.906f,40.3658f,-50.7813f, -132.813f,40.0768f,-50.7813f, -136.719f,40.0333f,-50.7813f, -140.625f,38.2667f,-50.7813f, -144.531f,36.5326f,-50.7813f, -148.438f,35.8183f,-50.7813f, -152.344f,35.3934f,-50.7813f, -156.25f,34.9787f,-50.7813f, -160.156f,33.4969f,-50.7813f, -164.063f,31.7517f,-50.7813f, -167.969f,29.499f,-50.7813f, -171.875f,27.1729f,-50.7813f, -175.781f,25.4931f,-50.7813f, -179.688f,25.2745f,-50.7813f, -183.594f,25.2315f,-50.7813f, -187.5f,24.531f,-50.7813f, -191.406f,23.4387f,-50.7813f, -195.313f,21.3665f,-50.7813f, -199.219f,19.2834f,-50.7813f, -203.125f,17.7694f,-50.7813f, -207.031f,16.0247f,-50.7813f, -210.938f,13.9451f,-50.7813f, -214.844f,12.3369f,-50.7813f, -218.75f,10.9033f,-50.7813f, -222.656f,10.0734f,-50.7813f, -226.563f,9.08212f,-50.7813f, -230.469f,9.04527f,-50.7813f, -234.375f,8.83458f,-50.7813f, -238.281f,9.03578f,-50.7813f, -242.188f,9.06782f,-50.7813f, -246.094f,9.03068f,-50.7813f, -250.0f,9.66685f,-50.7813f, -3.90625f,60.3928f,-54.6875f, -7.8125f,60.9235f,-54.6875f, -11.7188f,60.8946f,-54.6875f, -15.625f,60.5131f,-54.6875f, -19.5313f,58.455f,-54.6875f, -23.4375f,57.9712f,-54.6875f, -27.3438f,57.0716f,-54.6875f, -31.25f,56.9372f,-54.6875f, -35.1563f,57.5607f,-54.6875f, -39.0625f,56.6778f,-54.6875f, -42.9688f,56.24f,-54.6875f, -46.875f,55.0661f,-54.6875f, -50.7813f,54.3546f,-54.6875f, -54.6875f,52.1641f,-54.6875f, -58.5938f,51.2643f,-54.6875f, -62.5f,49.4484f,-54.6875f, -66.4063f,48.4401f,-54.6875f, -70.3125f,48.0181f,-54.6875f, -74.2188f,48.8036f,-54.6875f, -78.125f,48.2106f,-54.6875f, -82.0313f,47.8181f,-54.6875f, -85.9375f,47.3982f,-54.6875f, -89.8438f,46.4776f,-54.6875f, -93.75f,45.3848f,-54.6875f, -97.6563f,44.5336f,-54.6875f, -101.563f,45.1445f,-54.6875f, -105.469f,45.5775f,-54.6875f, -109.375f,45.4274f,-54.6875f, -113.281f,44.4184f,-54.6875f, -117.188f,43.6208f,-54.6875f, -121.094f,43.0133f,-54.6875f, -125.0f,41.2193f,-54.6875f, -128.906f,40.0465f,-54.6875f, -132.813f,40.3451f,-54.6875f, -136.719f,39.4272f,-54.6875f, -140.625f,37.2935f,-54.6875f, -144.531f,35.9597f,-54.6875f, -148.438f,34.766f,-54.6875f, -152.344f,33.3503f,-54.6875f, -156.25f,33.6732f,-54.6875f, -160.156f,32.5764f,-54.6875f, -164.063f,30.6942f,-54.6875f, -167.969f,28.8727f,-54.6875f, -171.875f,26.8203f,-54.6875f, -175.781f,24.7162f,-54.6875f, -179.688f,23.5533f,-54.6875f, -183.594f,23.5154f,-54.6875f, -187.5f,23.3554f,-54.6875f, -191.406f,22.7735f,-54.6875f, -195.313f,22.2741f,-54.6875f, -199.219f,20.9717f,-54.6875f, -203.125f,18.5469f,-54.6875f, -207.031f,16.0531f,-54.6875f, -210.938f,13.6058f,-54.6875f, -214.844f,11.0674f,-54.6875f, -218.75f,9.89862f,-54.6875f, -222.656f,9.6172f,-54.6875f, -226.563f,8.63026f,-54.6875f, -230.469f,8.95799f,-54.6875f, -234.375f,8.84522f,-54.6875f, -238.281f,8.9176f,-54.6875f, -242.188f,9.19248f,-54.6875f, -246.094f,9.16691f,-54.6875f, -250.0f,9.42022f,-54.6875f, -3.90625f,61.5747f,-58.5938f, -7.8125f,61.244f,-58.5938f, -11.7188f,60.3982f,-58.5938f, -15.625f,59.4267f,-58.5938f, -19.5313f,58.5294f,-58.5938f, -23.4375f,56.6412f,-58.5938f, -27.3438f,56.0648f,-58.5938f, -31.25f,56.4883f,-58.5938f, -35.1563f,56.5562f,-58.5938f, -39.0625f,56.745f,-58.5938f, -42.9688f,55.6505f,-58.5938f, -46.875f,54.6622f,-58.5938f, -50.7813f,53.7206f,-58.5938f, -54.6875f,51.9309f,-58.5938f, -58.5938f,50.4214f,-58.5938f, -62.5f,48.4353f,-58.5938f, -66.4063f,47.1373f,-58.5938f, -70.3125f,46.0037f,-58.5938f, -74.2188f,45.9795f,-58.5938f, -78.125f,45.2396f,-58.5938f, -82.0313f,45.264f,-58.5938f, -85.9375f,45.2603f,-58.5938f, -89.8438f,45.3076f,-58.5938f, -93.75f,44.8744f,-58.5938f, -97.6563f,44.3646f,-58.5938f, -101.563f,45.1043f,-58.5938f, -105.469f,45.6336f,-58.5938f, -109.375f,44.6129f,-58.5938f, -113.281f,44.3333f,-58.5938f, -117.188f,44.3267f,-58.5938f, -121.094f,42.9064f,-58.5938f, -125.0f,40.63f,-58.5938f, -128.906f,41.2828f,-58.5938f, -132.813f,40.2801f,-58.5938f, -136.719f,39.4089f,-58.5938f, -140.625f,37.0919f,-58.5938f, -144.531f,34.889f,-58.5938f, -148.438f,32.5161f,-58.5938f, -152.344f,31.9597f,-58.5938f, -156.25f,31.5986f,-58.5938f, -160.156f,31.1966f,-58.5938f, -164.063f,30.4149f,-58.5938f, -167.969f,29.0304f,-58.5938f, -171.875f,27.2929f,-58.5938f, -175.781f,26.0835f,-58.5938f, -179.688f,24.7373f,-58.5938f, -183.594f,23.6409f,-58.5938f, -187.5f,23.3059f,-58.5938f, -191.406f,22.8781f,-58.5938f, -195.313f,22.319f,-58.5938f, -199.219f,21.2986f,-58.5938f, -203.125f,19.8613f,-58.5938f, -207.031f,16.8941f,-58.5938f, -210.938f,13.7519f,-58.5938f, -214.844f,11.895f,-58.5938f, -218.75f,9.64673f,-58.5938f, -222.656f,9.27102f,-58.5938f, -226.563f,9.40316f,-58.5938f, -230.469f,8.90628f,-58.5938f, -234.375f,8.63691f,-58.5938f, -238.281f,9.10736f,-58.5938f, -242.188f,9.6506f,-58.5938f, -246.094f,9.20945f,-58.5938f, -250.0f,10.1973f,-58.5938f, -3.90625f,62.1111f,-62.5f, -7.8125f,60.6401f,-62.5f, -11.7188f,59.5734f,-62.5f, -15.625f,59.219f,-62.5f, -19.5313f,57.489f,-62.5f, -23.4375f,55.7813f,-62.5f, -27.3438f,55.9775f,-62.5f, -31.25f,55.9857f,-62.5f, -35.1563f,55.7053f,-62.5f, -39.0625f,55.9712f,-62.5f, -42.9688f,54.6904f,-62.5f, -46.875f,53.8065f,-62.5f, -50.7813f,52.4182f,-62.5f, -54.6875f,50.8531f,-62.5f, -58.5938f,49.1994f,-62.5f, -62.5f,47.7017f,-62.5f, -66.4063f,45.469f,-62.5f, -70.3125f,44.3384f,-62.5f, -74.2188f,43.2272f,-62.5f, -78.125f,43.8591f,-62.5f, -82.0313f,44.3452f,-62.5f, -85.9375f,44.3048f,-62.5f, -89.8438f,44.2242f,-62.5f, -93.75f,44.0587f,-62.5f, -97.6563f,43.7317f,-62.5f, -101.563f,44.5392f,-62.5f, -105.469f,44.5257f,-62.5f, -109.375f,43.5595f,-62.5f, -113.281f,44.5114f,-62.5f, -117.188f,43.2895f,-62.5f, -121.094f,41.6188f,-62.5f, -125.0f,39.9989f,-62.5f, -128.906f,40.9613f,-62.5f, -132.813f,39.8454f,-62.5f, -136.719f,38.9499f,-62.5f, -140.625f,36.7405f,-62.5f, -144.531f,34.8983f,-62.5f, -148.438f,33.5172f,-62.5f, -152.344f,31.5497f,-62.5f, -156.25f,31.3001f,-62.5f, -160.156f,30.8035f,-62.5f, -164.063f,30.3361f,-62.5f, -167.969f,29.7129f,-62.5f, -171.875f,28.9356f,-62.5f, -175.781f,27.3605f,-62.5f, -179.688f,26.5354f,-62.5f, -183.594f,25.1923f,-62.5f, -187.5f,23.8745f,-62.5f, -191.406f,22.6444f,-62.5f, -195.313f,22.0412f,-62.5f, -199.219f,20.9675f,-62.5f, -203.125f,18.5243f,-62.5f, -207.031f,15.5154f,-62.5f, -210.938f,13.2419f,-62.5f, -214.844f,11.0082f,-62.5f, -218.75f,9.92645f,-62.5f, -222.656f,9.66787f,-62.5f, -226.563f,10.141f,-62.5f, -230.469f,9.5559f,-62.5f, -234.375f,8.93799f,-62.5f, -238.281f,9.36179f,-62.5f, -242.188f,9.32325f,-62.5f, -246.094f,9.89448f,-62.5f, -250.0f,11.3062f,-62.5f, -3.90625f,60.8569f,-66.4063f, -7.8125f,59.3087f,-66.4063f, -11.7188f,58.6192f,-66.4063f, -15.625f,57.567f,-66.4063f, -19.5313f,54.6351f,-66.4063f, -23.4375f,53.6183f,-66.4063f, -27.3438f,54.0844f,-66.4063f, -31.25f,54.4962f,-66.4063f, -35.1563f,53.9539f,-66.4063f, -39.0625f,53.4324f,-66.4063f, -42.9688f,52.6655f,-66.4063f, -46.875f,51.9681f,-66.4063f, -50.7813f,51.1623f,-66.4063f, -54.6875f,50.0114f,-66.4063f, -58.5938f,47.9598f,-66.4063f, -62.5f,46.2999f,-66.4063f, -66.4063f,44.4466f,-66.4063f, -70.3125f,42.2001f,-66.4063f, -74.2188f,41.2192f,-66.4063f, -78.125f,41.7209f,-66.4063f, -82.0313f,42.7363f,-66.4063f, -85.9375f,42.9552f,-66.4063f, -89.8438f,43.0346f,-66.4063f, -93.75f,43.4604f,-66.4063f, -97.6563f,42.6437f,-66.4063f, -101.563f,42.6894f,-66.4063f, -105.469f,43.1054f,-66.4063f, -109.375f,42.7138f,-66.4063f, -113.281f,42.4744f,-66.4063f, -117.188f,42.2299f,-66.4063f, -121.094f,41.2421f,-66.4063f, -125.0f,40.3737f,-66.4063f, -128.906f,40.1758f,-66.4063f, -132.813f,39.5421f,-66.4063f, -136.719f,39.0437f,-66.4063f, -140.625f,37.1531f,-66.4063f, -144.531f,34.9841f,-66.4063f, -148.438f,33.2713f,-66.4063f, -152.344f,32.4185f,-66.4063f, -156.25f,31.779f,-66.4063f, -160.156f,30.7377f,-66.4063f, -164.063f,30.5524f,-66.4063f, -167.969f,29.5693f,-66.4063f, -171.875f,28.9756f,-66.4063f, -175.781f,27.4499f,-66.4063f, -179.688f,26.7907f,-66.4063f, -183.594f,25.5886f,-66.4063f, -187.5f,24.2807f,-66.4063f, -191.406f,22.1754f,-66.4063f, -195.313f,20.7766f,-66.4063f, -199.219f,19.914f,-66.4063f, -203.125f,17.149f,-66.4063f, -207.031f,14.0043f,-66.4063f, -210.938f,11.404f,-66.4063f, -214.844f,10.0012f,-66.4063f, -218.75f,8.65109f,-66.4063f, -222.656f,9.38897f,-66.4063f, -226.563f,9.4612f,-66.4063f, -230.469f,8.86613f,-66.4063f, -234.375f,8.68429f,-66.4063f, -238.281f,9.75985f,-66.4063f, -242.188f,10.3807f,-66.4063f, -246.094f,10.966f,-66.4063f, -250.0f,11.4354f,-66.4063f, -3.90625f,59.1482f,-70.3125f, -7.8125f,57.7892f,-70.3125f, -11.7188f,55.5839f,-70.3125f, -15.625f,54.3451f,-70.3125f, -19.5313f,52.0576f,-70.3125f, -23.4375f,50.5935f,-70.3125f, -27.3438f,50.8648f,-70.3125f, -31.25f,51.3182f,-70.3125f, -35.1563f,51.6726f,-70.3125f, -39.0625f,51.1264f,-70.3125f, -42.9688f,51.6239f,-70.3125f, -46.875f,49.728f,-70.3125f, -50.7813f,48.7924f,-70.3125f, -54.6875f,47.3884f,-70.3125f, -58.5938f,46.4477f,-70.3125f, -62.5f,45.2447f,-70.3125f, -66.4063f,42.8677f,-70.3125f, -70.3125f,40.9023f,-70.3125f, -74.2188f,39.5284f,-70.3125f, -78.125f,39.6524f,-70.3125f, -82.0313f,40.5173f,-70.3125f, -85.9375f,41.0204f,-70.3125f, -89.8438f,41.9366f,-70.3125f, -93.75f,42.1341f,-70.3125f, -97.6563f,41.4699f,-70.3125f, -101.563f,40.6754f,-70.3125f, -105.469f,41.2206f,-70.3125f, -109.375f,40.9668f,-70.3125f, -113.281f,41.1079f,-70.3125f, -117.188f,40.7056f,-70.3125f, -121.094f,39.8305f,-70.3125f, -125.0f,40.959f,-70.3125f, -128.906f,41.7481f,-70.3125f, -132.813f,41.1255f,-70.3125f, -136.719f,39.8634f,-70.3125f, -140.625f,37.8454f,-70.3125f, -144.531f,35.3914f,-70.3125f, -148.438f,33.8462f,-70.3125f, -152.344f,33.0994f,-70.3125f, -156.25f,32.4757f,-70.3125f, -160.156f,31.4779f,-70.3125f, -164.063f,29.4211f,-70.3125f, -167.969f,28.0779f,-70.3125f, -171.875f,27.802f,-70.3125f, -175.781f,26.7406f,-70.3125f, -179.688f,25.4777f,-70.3125f, -183.594f,24.7569f,-70.3125f, -187.5f,22.9331f,-70.3125f, -191.406f,21.2419f,-70.3125f, -195.313f,19.5082f,-70.3125f, -199.219f,17.6022f,-70.3125f, -203.125f,15.316f,-70.3125f, -207.031f,12.7546f,-70.3125f, -210.938f,10.3646f,-70.3125f, -214.844f,8.2502f,-70.3125f, -218.75f,8.14317f,-70.3125f, -222.656f,8.65089f,-70.3125f, -226.563f,8.60005f,-70.3125f, -230.469f,8.58165f,-70.3125f, -234.375f,9.40162f,-70.3125f, -238.281f,9.96281f,-70.3125f, -242.188f,9.81934f,-70.3125f, -246.094f,10.3078f,-70.3125f, -250.0f,10.4404f,-70.3125f, -3.90625f,56.5167f,-74.2188f, -7.8125f,55.7237f,-74.2188f, -11.7188f,53.4039f,-74.2188f, -15.625f,51.0313f,-74.2188f, -19.5313f,49.1141f,-74.2188f, -23.4375f,47.8398f,-74.2188f, -27.3438f,47.778f,-74.2188f, -31.25f,48.3917f,-74.2188f, -35.1563f,48.2503f,-74.2188f, -39.0625f,49.1497f,-74.2188f, -42.9688f,48.8224f,-74.2188f, -46.875f,47.4358f,-74.2188f, -50.7813f,47.051f,-74.2188f, -54.6875f,45.4218f,-74.2188f, -58.5938f,44.3385f,-74.2188f, -62.5f,42.9758f,-74.2188f, -66.4063f,41.4743f,-74.2188f, -70.3125f,39.4251f,-74.2188f, -74.2188f,37.5972f,-74.2188f, -78.125f,37.8246f,-74.2188f, -82.0313f,38.9578f,-74.2188f, -85.9375f,40.148f,-74.2188f, -89.8438f,41.1035f,-74.2188f, -93.75f,40.631f,-74.2188f, -97.6563f,40.0863f,-74.2188f, -101.563f,40.3273f,-74.2188f, -105.469f,40.0413f,-74.2188f, -109.375f,40.0514f,-74.2188f, -113.281f,39.4849f,-74.2188f, -117.188f,39.5903f,-74.2188f, -121.094f,40.1543f,-74.2188f, -125.0f,40.3424f,-74.2188f, -128.906f,41.779f,-74.2188f, -132.813f,41.4976f,-74.2188f, -136.719f,41.1475f,-74.2188f, -140.625f,38.8105f,-74.2188f, -144.531f,35.834f,-74.2188f, -148.438f,34.6385f,-74.2188f, -152.344f,33.7088f,-74.2188f, -156.25f,32.7137f,-74.2188f, -160.156f,30.7745f,-74.2188f, -164.063f,28.172f,-74.2188f, -167.969f,27.1433f,-74.2188f, -171.875f,26.7248f,-74.2188f, -175.781f,25.7807f,-74.2188f, -179.688f,24.8758f,-74.2188f, -183.594f,23.4994f,-74.2188f, -187.5f,23.3209f,-74.2188f, -191.406f,22.3523f,-74.2188f, -195.313f,20.3275f,-74.2188f, -199.219f,17.2927f,-74.2188f, -203.125f,15.0486f,-74.2188f, -207.031f,12.2721f,-74.2188f, -210.938f,9.60109f,-74.2188f, -214.844f,7.36411f,-74.2188f, -218.75f,7.27514f,-74.2188f, -222.656f,8.35951f,-74.2188f, -226.563f,8.18334f,-74.2188f, -230.469f,8.98708f,-74.2188f, -234.375f,8.98011f,-74.2188f, -238.281f,9.03329f,-74.2188f, -242.188f,8.88664f,-74.2188f, -246.094f,8.62938f,-74.2188f, -250.0f,9.6823f,-74.2188f, -3.90625f,54.4402f,-78.125f, -7.8125f,53.0525f,-78.125f, -11.7188f,51.2204f,-78.125f, -15.625f,48.7251f,-78.125f, -19.5313f,45.9841f,-78.125f, -23.4375f,45.0227f,-78.125f, -27.3438f,45.3099f,-78.125f, -31.25f,45.9225f,-78.125f, -35.1563f,46.8025f,-78.125f, -39.0625f,46.8434f,-78.125f, -42.9688f,46.0024f,-78.125f, -46.875f,45.6669f,-78.125f, -50.7813f,45.4624f,-78.125f, -54.6875f,43.4573f,-78.125f, -58.5938f,42.1273f,-78.125f, -62.5f,41.0088f,-78.125f, -66.4063f,38.8967f,-78.125f, -70.3125f,38.002f,-78.125f, -74.2188f,36.5282f,-78.125f, -78.125f,37.0499f,-78.125f, -82.0313f,37.3419f,-78.125f, -85.9375f,38.6056f,-78.125f, -89.8438f,39.7527f,-78.125f, -93.75f,40.3513f,-78.125f, -97.6563f,40.6919f,-78.125f, -101.563f,40.7736f,-78.125f, -105.469f,40.3007f,-78.125f, -109.375f,39.3023f,-78.125f, -113.281f,39.1369f,-78.125f, -117.188f,39.884f,-78.125f, -121.094f,40.5674f,-78.125f, -125.0f,40.8192f,-78.125f, -128.906f,41.893f,-78.125f, -132.813f,42.3647f,-78.125f, -136.719f,41.2455f,-78.125f, -140.625f,38.7064f,-78.125f, -144.531f,36.9679f,-78.125f, -148.438f,36.03f,-78.125f, -152.344f,33.9946f,-78.125f, -156.25f,32.2274f,-78.125f, -160.156f,30.474f,-78.125f, -164.063f,28.4739f,-78.125f, -167.969f,27.222f,-78.125f, -171.875f,26.6935f,-78.125f, -175.781f,25.0624f,-78.125f, -179.688f,24.162f,-78.125f, -183.594f,24.0176f,-78.125f, -187.5f,24.0379f,-78.125f, -191.406f,22.4301f,-78.125f, -195.313f,19.7078f,-78.125f, -199.219f,17.0911f,-78.125f, -203.125f,14.784f,-78.125f, -207.031f,11.8835f,-78.125f, -210.938f,9.34715f,-78.125f, -214.844f,7.23075f,-78.125f, -218.75f,7.91637f,-78.125f, -222.656f,8.69702f,-78.125f, -226.563f,8.56112f,-78.125f, -230.469f,9.86446f,-78.125f, -234.375f,9.26431f,-78.125f, -238.281f,8.47473f,-78.125f, -242.188f,7.8386f,-78.125f, -246.094f,7.82236f,-78.125f, -250.0f,8.68625f,-78.125f, -3.90625f,51.949f,-82.0313f, -7.8125f,50.1159f,-82.0313f, -11.7188f,48.9067f,-82.0313f, -15.625f,46.6417f,-82.0313f, -19.5313f,44.5725f,-82.0313f, -23.4375f,43.435f,-82.0313f, -27.3438f,43.6749f,-82.0313f, -31.25f,44.8399f,-82.0313f, -35.1563f,45.0253f,-82.0313f, -39.0625f,44.7335f,-82.0313f, -42.9688f,44.4485f,-82.0313f, -46.875f,44.8284f,-82.0313f, -50.7813f,43.5547f,-82.0313f, -54.6875f,41.2266f,-82.0313f, -58.5938f,40.4716f,-82.0313f, -62.5f,38.4361f,-82.0313f, -66.4063f,36.3554f,-82.0313f, -70.3125f,35.5722f,-82.0313f, -74.2188f,35.0069f,-82.0313f, -78.125f,35.8289f,-82.0313f, -82.0313f,37.0933f,-82.0313f, -85.9375f,38.1008f,-82.0313f, -89.8438f,38.9582f,-82.0313f, -93.75f,40.0751f,-82.0313f, -97.6563f,40.3989f,-82.0313f, -101.563f,40.2487f,-82.0313f, -105.469f,39.9234f,-82.0313f, -109.375f,40.0277f,-82.0313f, -113.281f,40.6647f,-82.0313f, -117.188f,40.69f,-82.0313f, -121.094f,40.7857f,-82.0313f, -125.0f,41.5688f,-82.0313f, -128.906f,41.836f,-82.0313f, -132.813f,41.6054f,-82.0313f, -136.719f,39.6237f,-82.0313f, -140.625f,38.6765f,-82.0313f, -144.531f,36.9959f,-82.0313f, -148.438f,35.8215f,-82.0313f, -152.344f,34.799f,-82.0313f, -156.25f,33.2398f,-82.0313f, -160.156f,30.7864f,-82.0313f, -164.063f,28.6776f,-82.0313f, -167.969f,26.6558f,-82.0313f, -171.875f,25.8282f,-82.0313f, -175.781f,24.7932f,-82.0313f, -179.688f,22.3283f,-82.0313f, -183.594f,23.1666f,-82.0313f, -187.5f,23.1721f,-82.0313f, -191.406f,21.3358f,-82.0313f, -195.313f,18.8226f,-82.0313f, -199.219f,16.5471f,-82.0313f, -203.125f,14.4667f,-82.0313f, -207.031f,11.1533f,-82.0313f, -210.938f,8.28389f,-82.0313f, -214.844f,8.02411f,-82.0313f, -218.75f,8.03784f,-82.0313f, -222.656f,8.27638f,-82.0313f, -226.563f,8.14824f,-82.0313f, -230.469f,8.45286f,-82.0313f, -234.375f,8.21959f,-82.0313f, -238.281f,8.25224f,-82.0313f, -242.188f,7.67129f,-82.0313f, -246.094f,8.04143f,-82.0313f, -250.0f,8.6199f,-82.0313f, -3.90625f,50.007f,-85.9375f, -7.8125f,48.4593f,-85.9375f, -11.7188f,46.0233f,-85.9375f, -15.625f,44.0556f,-85.9375f, -19.5313f,42.3324f,-85.9375f, -23.4375f,41.8982f,-85.9375f, -27.3438f,42.3931f,-85.9375f, -31.25f,43.1153f,-85.9375f, -35.1563f,43.1285f,-85.9375f, -39.0625f,43.422f,-85.9375f, -42.9688f,43.5417f,-85.9375f, -46.875f,42.2294f,-85.9375f, -50.7813f,40.9068f,-85.9375f, -54.6875f,39.4177f,-85.9375f, -58.5938f,37.2575f,-85.9375f, -62.5f,35.2254f,-85.9375f, -66.4063f,33.8821f,-85.9375f, -70.3125f,33.1531f,-85.9375f, -74.2188f,34.2747f,-85.9375f, -78.125f,35.599f,-85.9375f, -82.0313f,37.007f,-85.9375f, -85.9375f,37.5018f,-85.9375f, -89.8438f,38.1376f,-85.9375f, -93.75f,38.9449f,-85.9375f, -97.6563f,38.9221f,-85.9375f, -101.563f,38.8555f,-85.9375f, -105.469f,39.5572f,-85.9375f, -109.375f,40.1231f,-85.9375f, -113.281f,40.7416f,-85.9375f, -117.188f,40.3888f,-85.9375f, -121.094f,40.6715f,-85.9375f, -125.0f,40.7246f,-85.9375f, -128.906f,40.6124f,-85.9375f, -132.813f,39.685f,-85.9375f, -136.719f,39.2043f,-85.9375f, -140.625f,38.1816f,-85.9375f, -144.531f,36.598f,-85.9375f, -148.438f,36.2907f,-85.9375f, -152.344f,34.8832f,-85.9375f, -156.25f,33.4024f,-85.9375f, -160.156f,31.2463f,-85.9375f, -164.063f,29.1669f,-85.9375f, -167.969f,26.7298f,-85.9375f, -171.875f,24.3407f,-85.9375f, -175.781f,23.4854f,-85.9375f, -179.688f,21.3474f,-85.9375f, -183.594f,21.2953f,-85.9375f, -187.5f,21.7398f,-85.9375f, -191.406f,20.4218f,-85.9375f, -195.313f,17.9433f,-85.9375f, -199.219f,15.3133f,-85.9375f, -203.125f,13.0586f,-85.9375f, -207.031f,9.24996f,-85.9375f, -210.938f,7.18408f,-85.9375f, -214.844f,7.59758f,-85.9375f, -218.75f,8.04641f,-85.9375f, -222.656f,8.01634f,-85.9375f, -226.563f,7.95015f,-85.9375f, -230.469f,7.86343f,-85.9375f, -234.375f,6.21751f,-85.9375f, -238.281f,7.40112f,-85.9375f, -242.188f,7.60481f,-85.9375f, -246.094f,6.77129f,-85.9375f, -250.0f,7.87753f,-85.9375f, -3.90625f,47.6596f,-89.8438f, -7.8125f,45.9136f,-89.8438f, -11.7188f,44.0495f,-89.8438f, -15.625f,42.5127f,-89.8438f, -19.5313f,41.5996f,-89.8438f, -23.4375f,41.2638f,-89.8438f, -27.3438f,41.2672f,-89.8438f, -31.25f,41.5402f,-89.8438f, -35.1563f,42.558f,-89.8438f, -39.0625f,42.49f,-89.8438f, -42.9688f,42.2839f,-89.8438f, -46.875f,40.9401f,-89.8438f, -50.7813f,38.7346f,-89.8438f, -54.6875f,36.624f,-89.8438f, -58.5938f,35.1978f,-89.8438f, -62.5f,34.9272f,-89.8438f, -66.4063f,32.893f,-89.8438f, -70.3125f,32.4101f,-89.8438f, -74.2188f,33.9814f,-89.8438f, -78.125f,35.8825f,-89.8438f, -82.0313f,37.1245f,-89.8438f, -85.9375f,37.3954f,-89.8438f, -89.8438f,38.0118f,-89.8438f, -93.75f,37.5426f,-89.8438f, -97.6563f,38.0776f,-89.8438f, -101.563f,37.9785f,-89.8438f, -105.469f,38.6389f,-89.8438f, -109.375f,39.284f,-89.8438f, -113.281f,40.0027f,-89.8438f, -117.188f,41.2412f,-89.8438f, -121.094f,41.2301f,-89.8438f, -125.0f,40.7611f,-89.8438f, -128.906f,39.7426f,-89.8438f, -132.813f,39.1387f,-89.8438f, -136.719f,38.499f,-89.8438f, -140.625f,37.714f,-89.8438f, -144.531f,36.6379f,-89.8438f, -148.438f,36.1196f,-89.8438f, -152.344f,35.7001f,-89.8438f, -156.25f,33.9038f,-89.8438f, -160.156f,32.0706f,-89.8438f, -164.063f,29.746f,-89.8438f, -167.969f,26.4482f,-89.8438f, -171.875f,23.8046f,-89.8438f, -175.781f,21.9675f,-89.8438f, -179.688f,20.7011f,-89.8438f, -183.594f,20.6699f,-89.8438f, -187.5f,20.1508f,-89.8438f, -191.406f,17.8245f,-89.8438f, -195.313f,16.2785f,-89.8438f, -199.219f,13.4596f,-89.8438f, -203.125f,9.54647f,-89.8438f, -207.031f,6.02727f,-89.8438f, -210.938f,5.88903f,-89.8438f, -214.844f,6.47568f,-89.8438f, -218.75f,6.20004f,-89.8438f, -222.656f,6.0849f,-89.8438f, -226.563f,6.84648f,-89.8438f, -230.469f,6.3424f,-89.8438f, -234.375f,5.81853f,-89.8438f, -238.281f,5.89205f,-89.8438f, -242.188f,6.84078f,-89.8438f, -246.094f,6.32426f,-89.8438f, -250.0f,6.29368f,-89.8438f, -3.90625f,45.4182f,-93.75f, -7.8125f,44.5664f,-93.75f, -11.7188f,44.0207f,-93.75f, -15.625f,42.2553f,-93.75f, -19.5313f,40.8951f,-93.75f, -23.4375f,40.7665f,-93.75f, -27.3438f,40.5756f,-93.75f, -31.25f,41.2988f,-93.75f, -35.1563f,40.6862f,-93.75f, -39.0625f,40.6007f,-93.75f, -42.9688f,39.5329f,-93.75f, -46.875f,38.2364f,-93.75f, -50.7813f,36.1442f,-93.75f, -54.6875f,34.7353f,-93.75f, -58.5938f,34.4214f,-93.75f, -62.5f,33.9528f,-93.75f, -66.4063f,32.4931f,-93.75f, -70.3125f,32.5145f,-93.75f, -74.2188f,33.393f,-93.75f, -78.125f,34.9658f,-93.75f, -82.0313f,36.3611f,-93.75f, -85.9375f,37.568f,-93.75f, -89.8438f,37.012f,-93.75f, -93.75f,37.6392f,-93.75f, -97.6563f,38.4371f,-93.75f, -101.563f,38.3719f,-93.75f, -105.469f,39.1179f,-93.75f, -109.375f,38.5168f,-93.75f, -113.281f,40.0403f,-93.75f, -117.188f,40.2277f,-93.75f, -121.094f,40.8985f,-93.75f, -125.0f,40.189f,-93.75f, -128.906f,39.9435f,-93.75f, -132.813f,39.6824f,-93.75f, -136.719f,38.844f,-93.75f, -140.625f,37.4579f,-93.75f, -144.531f,36.8375f,-93.75f, -148.438f,36.2601f,-93.75f, -152.344f,35.6484f,-93.75f, -156.25f,34.179f,-93.75f, -160.156f,32.0651f,-93.75f, -164.063f,28.6431f,-93.75f, -167.969f,25.1239f,-93.75f, -171.875f,22.4459f,-93.75f, -175.781f,19.5301f,-93.75f, -179.688f,18.4371f,-93.75f, -183.594f,18.6076f,-93.75f, -187.5f,17.488f,-93.75f, -191.406f,15.1604f,-93.75f, -195.313f,13.0197f,-93.75f, -199.219f,9.4702f,-93.75f, -203.125f,5.597f,-93.75f, -207.031f,3.59409f,-93.75f, -210.938f,4.28966f,-93.75f, -214.844f,4.21811f,-93.75f, -218.75f,4.11546f,-93.75f, -222.656f,5.40815f,-93.75f, -226.563f,5.56249f,-93.75f, -230.469f,5.35075f,-93.75f, -234.375f,5.24306f,-93.75f, -238.281f,4.85548f,-93.75f, -242.188f,5.02825f,-93.75f, -246.094f,5.32318f,-93.75f, -250.0f,5.59512f,-93.75f, -3.90625f,44.9637f,-97.6563f, -7.8125f,44.7813f,-97.6563f, -11.7188f,43.457f,-97.6563f, -15.625f,42.5329f,-97.6563f, -19.5313f,40.506f,-97.6563f, -23.4375f,39.8146f,-97.6563f, -27.3438f,40.2245f,-97.6563f, -31.25f,39.497f,-97.6563f, -35.1563f,38.8152f,-97.6563f, -39.0625f,38.3406f,-97.6563f, -42.9688f,37.57f,-97.6563f, -46.875f,36.3128f,-97.6563f, -50.7813f,34.2277f,-97.6563f, -54.6875f,33.3395f,-97.6563f, -58.5938f,32.972f,-97.6563f, -62.5f,32.6315f,-97.6563f, -66.4063f,32.4796f,-97.6563f, -70.3125f,31.6472f,-97.6563f, -74.2188f,32.2256f,-97.6563f, -78.125f,33.8073f,-97.6563f, -82.0313f,35.7591f,-97.6563f, -85.9375f,36.5001f,-97.6563f, -89.8438f,36.9113f,-97.6563f, -93.75f,37.6902f,-97.6563f, -97.6563f,37.9643f,-97.6563f, -101.563f,38.9556f,-97.6563f, -105.469f,39.6823f,-97.6563f, -109.375f,38.9917f,-97.6563f, -113.281f,40.0872f,-97.6563f, -117.188f,40.44f,-97.6563f, -121.094f,39.6877f,-97.6563f, -125.0f,39.0011f,-97.6563f, -128.906f,39.8735f,-97.6563f, -132.813f,39.5503f,-97.6563f, -136.719f,37.743f,-97.6563f, -140.625f,36.4691f,-97.6563f, -144.531f,36.1765f,-97.6563f, -148.438f,35.9476f,-97.6563f, -152.344f,35.1141f,-97.6563f, -156.25f,33.2516f,-97.6563f, -160.156f,30.654f,-97.6563f, -164.063f,27.2318f,-97.6563f, -167.969f,23.3975f,-97.6563f, -171.875f,20.6722f,-97.6563f, -175.781f,18.394f,-97.6563f, -179.688f,17.6475f,-97.6563f, -183.594f,16.1037f,-97.6563f, -187.5f,14.761f,-97.6563f, -191.406f,12.2456f,-97.6563f, -195.313f,9.43327f,-97.6563f, -199.219f,6.9118f,-97.6563f, -203.125f,4.26334f,-97.6563f, -207.031f,3.47413f,-97.6563f, -210.938f,3.74872f,-97.6563f, -214.844f,3.7631f,-97.6563f, -218.75f,3.80513f,-97.6563f, -222.656f,4.23443f,-97.6563f, -226.563f,3.71016f,-97.6563f, -230.469f,3.772f,-97.6563f, -234.375f,3.80374f,-97.6563f, -238.281f,3.70762f,-97.6563f, -242.188f,4.23931f,-97.6563f, -246.094f,4.40519f,-97.6563f, -250.0f,4.5119f,-97.6563f, -3.90625f,44.5311f,-101.563f, -7.8125f,44.4181f,-101.563f, -11.7188f,43.4864f,-101.563f, -15.625f,42.259f,-101.563f, -19.5313f,41.0558f,-101.563f, -23.4375f,39.9996f,-101.563f, -27.3438f,39.3917f,-101.563f, -31.25f,39.5691f,-101.563f, -35.1563f,37.0889f,-101.563f, -39.0625f,36.4296f,-101.563f, -42.9688f,36.543f,-101.563f, -46.875f,35.4365f,-101.563f, -50.7813f,33.3641f,-101.563f, -54.6875f,32.0629f,-101.563f, -58.5938f,32.175f,-101.563f, -62.5f,32.775f,-101.563f, -66.4063f,31.6335f,-101.563f, -70.3125f,32.1001f,-101.563f, -74.2188f,32.5906f,-101.563f, -78.125f,33.1502f,-101.563f, -82.0313f,35.1972f,-101.563f, -85.9375f,36.0132f,-101.563f, -89.8438f,37.3442f,-101.563f, -93.75f,37.6109f,-101.563f, -97.6563f,38.1601f,-101.563f, -101.563f,39.77f,-101.563f, -105.469f,39.6862f,-101.563f, -109.375f,39.4829f,-101.563f, -113.281f,40.1383f,-101.563f, -117.188f,40.8908f,-101.563f, -121.094f,39.3517f,-101.563f, -125.0f,38.9321f,-101.563f, -128.906f,39.2537f,-101.563f, -132.813f,38.4876f,-101.563f, -136.719f,36.6755f,-101.563f, -140.625f,35.2803f,-101.563f, -144.531f,35.8754f,-101.563f, -148.438f,36.2761f,-101.563f, -152.344f,34.7815f,-101.563f, -156.25f,32.2662f,-101.563f, -160.156f,29.8191f,-101.563f, -164.063f,25.8929f,-101.563f, -167.969f,22.552f,-101.563f, -171.875f,20.3186f,-101.563f, -175.781f,17.2917f,-101.563f, -179.688f,16.8305f,-101.563f, -183.594f,14.7168f,-101.563f, -187.5f,12.0609f,-101.563f, -191.406f,9.91022f,-101.563f, -195.313f,7.22029f,-101.563f, -199.219f,5.48379f,-101.563f, -203.125f,3.03759f,-101.563f, -207.031f,3.02148f,-101.563f, -210.938f,2.88667f,-101.563f, -214.844f,3.08795f,-101.563f, -218.75f,3.43814f,-101.563f, -222.656f,3.58591f,-101.563f, -226.563f,3.17855f,-101.563f, -230.469f,2.48711f,-101.563f, -234.375f,2.66471f,-101.563f, -238.281f,2.06432f,-101.563f, -242.188f,2.49704f,-101.563f, -246.094f,3.05219f,-101.563f, -250.0f,3.69155f,-101.563f, -3.90625f,44.8466f,-105.469f, -7.8125f,44.3102f,-105.469f, -11.7188f,43.8936f,-105.469f, -15.625f,43.2285f,-105.469f, -19.5313f,42.7384f,-105.469f, -23.4375f,41.2954f,-105.469f, -27.3438f,39.4813f,-105.469f, -31.25f,38.4483f,-105.469f, -35.1563f,35.8264f,-105.469f, -39.0625f,35.0991f,-105.469f, -42.9688f,35.1929f,-105.469f, -46.875f,34.3044f,-105.469f, -50.7813f,31.4169f,-105.469f, -54.6875f,30.8206f,-105.469f, -58.5938f,31.2902f,-105.469f, -62.5f,32.2869f,-105.469f, -66.4063f,32.5121f,-105.469f, -70.3125f,32.772f,-105.469f, -74.2188f,32.5422f,-105.469f, -78.125f,34.0506f,-105.469f, -82.0313f,35.4894f,-105.469f, -85.9375f,36.753f,-105.469f, -89.8438f,37.6901f,-105.469f, -93.75f,37.848f,-105.469f, -97.6563f,38.9724f,-105.469f, -101.563f,40.0724f,-105.469f, -105.469f,39.7381f,-105.469f, -109.375f,39.3905f,-105.469f, -113.281f,39.8577f,-105.469f, -117.188f,40.4957f,-105.469f, -121.094f,39.554f,-105.469f, -125.0f,39.0384f,-105.469f, -128.906f,38.2112f,-105.469f, -132.813f,36.7141f,-105.469f, -136.719f,34.736f,-105.469f, -140.625f,34.2236f,-105.469f, -144.531f,35.4181f,-105.469f, -148.438f,35.4456f,-105.469f, -152.344f,33.4389f,-105.469f, -156.25f,29.9708f,-105.469f, -160.156f,27.2392f,-105.469f, -164.063f,24.3409f,-105.469f, -167.969f,22.4438f,-105.469f, -171.875f,19.5326f,-105.469f, -175.781f,16.9951f,-105.469f, -179.688f,14.77f,-105.469f, -183.594f,13.1816f,-105.469f, -187.5f,10.3711f,-105.469f, -191.406f,7.10511f,-105.469f, -195.313f,5.43711f,-105.469f, -199.219f,3.35463f,-105.469f, -203.125f,2.41276f,-105.469f, -207.031f,2.35357f,-105.469f, -210.938f,2.28627f,-105.469f, -214.844f,1.61561f,-105.469f, -218.75f,2.61087f,-105.469f, -222.656f,2.34638f,-105.469f, -226.563f,1.47074f,-105.469f, -230.469f,0.63025f,-105.469f, -234.375f,0.847991f,-105.469f, -238.281f,1.35199f,-105.469f, -242.188f,2.21032f,-105.469f, -246.094f,3.01323f,-105.469f, -250.0f,3.12713f,-105.469f, -3.90625f,45.3987f,-109.375f, -7.8125f,44.6273f,-109.375f, -11.7188f,44.5674f,-109.375f, -15.625f,44.2998f,-109.375f, -19.5313f,43.5383f,-109.375f, -23.4375f,42.0306f,-109.375f, -27.3438f,40.7068f,-109.375f, -31.25f,39.6497f,-109.375f, -35.1563f,36.2161f,-109.375f, -39.0625f,34.8769f,-109.375f, -42.9688f,35.1989f,-109.375f, -46.875f,33.9714f,-109.375f, -50.7813f,30.9979f,-109.375f, -54.6875f,31.9366f,-109.375f, -58.5938f,31.5755f,-109.375f, -62.5f,31.572f,-109.375f, -66.4063f,33.0668f,-109.375f, -70.3125f,33.6444f,-109.375f, -74.2188f,32.5467f,-109.375f, -78.125f,34.2686f,-109.375f, -82.0313f,36.0633f,-109.375f, -85.9375f,37.5569f,-109.375f, -89.8438f,38.5599f,-109.375f, -93.75f,38.6708f,-109.375f, -97.6563f,39.2558f,-109.375f, -101.563f,39.9111f,-109.375f, -105.469f,39.9236f,-109.375f, -109.375f,39.5666f,-109.375f, -113.281f,40.1532f,-109.375f, -117.188f,40.8773f,-109.375f, -121.094f,40.133f,-109.375f, -125.0f,38.348f,-109.375f, -128.906f,36.9174f,-109.375f, -132.813f,34.8975f,-109.375f, -136.719f,32.9097f,-109.375f, -140.625f,32.6666f,-109.375f, -144.531f,33.1207f,-109.375f, -148.438f,32.6024f,-109.375f, -152.344f,31.1149f,-109.375f, -156.25f,27.7885f,-109.375f, -160.156f,24.9665f,-109.375f, -164.063f,22.789f,-109.375f, -167.969f,20.4907f,-109.375f, -171.875f,18.2402f,-109.375f, -175.781f,15.9409f,-109.375f, -179.688f,12.7122f,-109.375f, -183.594f,10.9582f,-109.375f, -187.5f,7.47226f,-109.375f, -191.406f,4.87747f,-109.375f, -195.313f,2.78589f,-109.375f, -199.219f,1.53429f,-109.375f, -203.125f,1.61775f,-109.375f, -207.031f,1.772f,-109.375f, -210.938f,1.15444f,-109.375f, -214.844f,0.342505f,-109.375f, -218.75f,0.510183f,-109.375f, -222.656f,0.254977f,-109.375f, -226.563f,-0.22727f,-109.375f, -230.469f,-0.840625f,-109.375f, -234.375f,-0.282154f,-109.375f, -238.281f,0.424945f,-109.375f, -242.188f,1.73577f,-109.375f, -246.094f,1.80217f,-109.375f, -250.0f,1.60105f,-109.375f, -3.90625f,47.4869f,-113.281f, -7.8125f,46.3185f,-113.281f, -11.7188f,46.4911f,-113.281f, -15.625f,45.2506f,-113.281f, -19.5313f,43.7939f,-113.281f, -23.4375f,42.6062f,-113.281f, -27.3438f,41.6674f,-113.281f, -31.25f,39.5196f,-113.281f, -35.1563f,36.6784f,-113.281f, -39.0625f,35.8546f,-113.281f, -42.9688f,35.2647f,-113.281f, -46.875f,33.0882f,-113.281f, -50.7813f,31.1331f,-113.281f, -54.6875f,31.9095f,-113.281f, -58.5938f,31.5715f,-113.281f, -62.5f,32.3642f,-113.281f, -66.4063f,33.2578f,-113.281f, -70.3125f,33.1847f,-113.281f, -74.2188f,33.6624f,-113.281f, -78.125f,35.6582f,-113.281f, -82.0313f,36.7989f,-113.281f, -85.9375f,37.9951f,-113.281f, -89.8438f,38.7063f,-113.281f, -93.75f,39.9727f,-113.281f, -97.6563f,39.641f,-113.281f, -101.563f,40.1318f,-113.281f, -105.469f,40.117f,-113.281f, -109.375f,40.0678f,-113.281f, -113.281f,40.1534f,-113.281f, -117.188f,40.7841f,-113.281f, -121.094f,39.3312f,-113.281f, -125.0f,38.1823f,-113.281f, -128.906f,37.0921f,-113.281f, -132.813f,34.9687f,-113.281f, -136.719f,32.6631f,-113.281f, -140.625f,30.9601f,-113.281f, -144.531f,31.0644f,-113.281f, -148.438f,29.6495f,-113.281f, -152.344f,27.5095f,-113.281f, -156.25f,24.9361f,-113.281f, -160.156f,22.6206f,-113.281f, -164.063f,20.1136f,-113.281f, -167.969f,17.9862f,-113.281f, -171.875f,16.1252f,-113.281f, -175.781f,14.2991f,-113.281f, -179.688f,11.4262f,-113.281f, -183.594f,8.55749f,-113.281f, -187.5f,6.02067f,-113.281f, -191.406f,3.1883f,-113.281f, -195.313f,1.54808f,-113.281f, -199.219f,0.0223479f,-113.281f, -203.125f,-0.0807506f,-113.281f, -207.031f,-0.420855f,-113.281f, -210.938f,-0.531322f,-113.281f, -214.844f,-1.34393f,-113.281f, -218.75f,-2.28346f,-113.281f, -222.656f,-2.245f,-113.281f, -226.563f,-2.22932f,-113.281f, -230.469f,-1.47268f,-113.281f, -234.375f,-0.543695f,-113.281f, -238.281f,-0.391948f,-113.281f, -242.188f,-0.270077f,-113.281f, -246.094f,-0.650629f,-113.281f, -250.0f,0.111517f,-113.281f, -3.90625f,48.3887f,-117.188f, -7.8125f,48.004f,-117.188f, -11.7188f,46.8723f,-117.188f, -15.625f,45.5005f,-117.188f, -19.5313f,43.3644f,-117.188f, -23.4375f,42.3352f,-117.188f, -27.3438f,41.1562f,-117.188f, -31.25f,39.1736f,-117.188f, -35.1563f,38.0627f,-117.188f, -39.0625f,36.4728f,-117.188f, -42.9688f,34.8001f,-117.188f, -46.875f,32.5103f,-117.188f, -50.7813f,31.6328f,-117.188f, -54.6875f,31.6106f,-117.188f, -58.5938f,32.3004f,-117.188f, -62.5f,32.696f,-117.188f, -66.4063f,33.3795f,-117.188f, -70.3125f,33.9696f,-117.188f, -74.2188f,34.9211f,-117.188f, -78.125f,36.7686f,-117.188f, -82.0313f,37.7676f,-117.188f, -85.9375f,37.8174f,-117.188f, -89.8438f,38.2878f,-117.188f, -93.75f,39.6151f,-117.188f, -97.6563f,39.7422f,-117.188f, -101.563f,40.9611f,-117.188f, -105.469f,40.8932f,-117.188f, -109.375f,40.6603f,-117.188f, -113.281f,40.2935f,-117.188f, -117.188f,39.8681f,-117.188f, -121.094f,39.0965f,-117.188f, -125.0f,37.1333f,-117.188f, -128.906f,35.5222f,-117.188f, -132.813f,33.9068f,-117.188f, -136.719f,32.2618f,-117.188f, -140.625f,29.8657f,-117.188f, -144.531f,28.1704f,-117.188f, -148.438f,27.1495f,-117.188f, -152.344f,24.5217f,-117.188f, -156.25f,22.0419f,-117.188f, -160.156f,19.9238f,-117.188f, -164.063f,17.6875f,-117.188f, -167.969f,15.5636f,-117.188f, -171.875f,13.5497f,-117.188f, -175.781f,11.2761f,-117.188f, -179.688f,8.95864f,-117.188f, -183.594f,7.04623f,-117.188f, -187.5f,4.83635f,-117.188f, -191.406f,2.76046f,-117.188f, -195.313f,0.190119f,-117.188f, -199.219f,-0.558379f,-117.188f, -203.125f,-1.03303f,-117.188f, -207.031f,-2.17563f,-117.188f, -210.938f,-1.91155f,-117.188f, -214.844f,-3.00018f,-117.188f, -218.75f,-4.26691f,-117.188f, -222.656f,-5.15855f,-117.188f, -226.563f,-3.46348f,-117.188f, -230.469f,-2.16077f,-117.188f, -234.375f,-1.47785f,-117.188f, -238.281f,-1.78424f,-117.188f, -242.188f,-1.00317f,-117.188f, -246.094f,-1.97981f,-117.188f, -250.0f,-2.29372f,-117.188f, -}; - -btScalar Landscape03Nml[] = { --0.0301669f,0.913898f,-0.404822f, -0.0925944f,0.901922f,-0.421856f, -0.0550338f,0.955133f,-0.291019f, -0.163554f,0.924847f,-0.343379f, --0.00160556f,0.985516f,-0.169577f, -0.0975687f,0.967908f,-0.23159f, --0.0718641f,0.997324f,-0.0134097f, -0.108884f,0.992259f,0.0597208f, --0.0649193f,0.987727f,0.142057f, --0.0923076f,0.995503f,-0.0212622f, --0.212176f,0.966905f,0.141687f, --0.135924f,0.982555f,0.126925f, --0.248136f,0.950917f,0.184892f, --0.114969f,0.937595f,0.328173f, --0.0596382f,0.954355f,0.292661f, --0.0673134f,0.931098f,0.358506f, --0.100514f,0.963905f,0.246544f, --0.237357f,0.960335f,0.146353f, --0.210275f,0.964506f,0.159726f, --0.243879f,0.969407f,-0.027797f, --0.0995316f,0.963559f,0.248291f, -0.0232774f,0.986211f,0.163848f, --0.0780955f,0.939808f,0.33266f, -0.0143543f,0.937354f,0.348083f, --0.242603f,0.911487f,0.332166f, --0.217791f,0.899583f,0.378572f, --0.259297f,0.919695f,0.294833f, --0.235372f,0.900382f,0.365939f, -0.0548314f,0.924698f,0.376733f, -0.17577f,0.83537f,0.520828f, -0.183628f,0.8685f,0.460423f, -0.206319f,0.791195f,0.57571f, -0.291585f,0.831097f,0.473557f, -0.258977f,0.806104f,0.532097f, -0.406441f,0.807616f,0.427274f, -0.279416f,0.89888f,0.337552f, -0.161449f,0.944511f,0.286064f, --0.0153595f,0.999467f,0.0288015f, -0.0344442f,0.986316f,0.16123f, -0.0228147f,0.999694f,-0.00950936f, -0.221267f,0.961345f,0.163882f, -0.262982f,0.961437f,0.0804904f, -0.292545f,0.943495f,0.155677f, -0.287728f,0.952627f,0.0985627f, -0.338791f,0.935036f,0.104535f, -0.332042f,0.939101f,0.0885263f, -0.395865f,0.914692f,0.0814219f, -0.342439f,0.937891f,0.0556409f, -0.24643f,0.967531f,-0.0561722f, -0.155524f,0.980084f,-0.12348f, -0.12756f,0.989194f,-0.0722747f, -0.141529f,0.984734f,-0.10133f, -0.0842668f,0.99539f,-0.0458028f, -0.00840046f,0.967846f,-0.251403f, -0.0723924f,0.995277f,-0.0646756f, -0.161395f,0.974624f,-0.155111f, -0.168526f,0.983485f,0.0660013f, -0.32936f,0.929371f,0.166709f, -0.334018f,0.924548f,0.18342f, -0.39263f,0.883836f,0.254313f, -0.373683f,0.906029f,0.198675f, -0.318503f,0.931732f,0.174444f, -0.214891f,0.969497f,0.117891f, -0.248914f,0.936934f,0.245348f, -0.199074f,0.96113f,0.19131f, -0.293417f,0.893252f,0.340597f, -0.339667f,0.873015f,0.349959f, -0.354613f,0.873548f,0.333412f, -0.457963f,0.824157f,0.333219f, -0.455319f,0.825254f,0.334127f, -0.52695f,0.805593f,0.270821f, -0.439193f,0.858556f,0.264557f, -0.401282f,0.908751f,0.114652f, -0.249111f,0.965853f,-0.0712114f, -0.0897089f,0.991664f,0.0924929f, -0.0376765f,0.979393f,-0.19842f, --0.126991f,0.990951f,0.0434627f, --0.217753f,0.933113f,-0.286154f, --0.167574f,0.97576f,-0.140749f, --0.203937f,0.914317f,-0.349907f, --0.0608955f,0.980207f,-0.188379f, --0.0120075f,0.947447f,-0.319686f, -0.167601f,0.980952f,-0.0982003f, -0.212052f,0.945824f,-0.245868f, -0.218606f,0.972968f,-0.0744646f, -0.212851f,0.953898f,-0.211596f, -0.171647f,0.974969f,-0.141323f, -0.199197f,0.967793f,-0.153938f, -0.200412f,0.972091f,-0.121957f, -0.23265f,0.963849f,-0.129883f, -0.296235f,0.953212f,-0.060261f, -0.314311f,0.946698f,-0.0705058f, -0.404868f,0.912189f,-0.0631982f, -0.403087f,0.912504f,-0.0696997f, -0.463227f,0.884095f,-0.0616207f, -0.39479f,0.897802f,-0.195171f, -0.35121f,0.926619f,-0.13427f, -0.220773f,0.898508f,-0.379398f, -0.189824f,0.93595f,-0.296589f, -0.0483901f,0.855509f,-0.515522f, -0.0904515f,0.884685f,-0.457329f, -0.120283f,0.865017f,-0.487112f, -0.203986f,0.900002f,-0.385209f, -0.248454f,0.881227f,-0.402131f, -0.178575f,0.929214f,-0.323532f, -0.0792679f,0.824417f,-0.560404f, -0.115378f,0.950213f,-0.289454f, -0.0725597f,0.807744f,-0.585051f, -0.0327706f,0.953791f,-0.298679f, -0.0099385f,0.78612f,-0.617994f, -0.0403637f,0.952173f,-0.302881f, -0.215114f,0.87002f,-0.443611f, -0.182967f,0.972742f,-0.142465f, -0.292542f,0.923312f,-0.248827f, -0.159782f,0.983577f,-0.0839386f, -0.255356f,0.959339f,-0.120256f, -0.180088f,0.983508f,0.0167535f, -0.210595f,0.975243f,-0.0674566f, -0.305089f,0.951559f,0.0381592f, -0.342154f,0.939613f,0.00764387f, -0.44387f,0.894627f,0.0512048f, -0.377004f,0.921573f,-0.0925792f, -0.197535f,0.978807f,-0.0540106f, -0.128094f,0.953819f,-0.271702f, -0.10228f,0.991256f,-0.0833686f, -0.111348f,0.971755f,-0.208074f, -0.120727f,0.982203f,-0.143886f, -0.131919f,0.971754f,-0.195681f, --0.118481f,0.971727f,-0.204228f, --0.131824f,0.977685f,-0.163569f, --0.0725384f,0.997366f,-0.000133281f, --0.204047f,0.978951f,0.00446862f, --0.227431f,0.966677f,0.117515f, --0.137601f,0.963906f,0.227929f, --0.242399f,0.965055f,0.0995586f, --0.153062f,0.97808f,0.141178f, --0.129415f,0.948353f,0.289617f, --0.22442f,0.902886f,0.366649f, --0.173979f,0.92147f,0.34731f, --0.0318649f,0.93595f,0.350687f, --0.176397f,0.955508f,0.236408f, --0.254551f,0.956811f,0.140418f, --0.0162894f,0.984782f,0.173032f, -0.167302f,0.961803f,0.216667f, -0.267797f,0.948626f,0.168505f, -0.412955f,0.869957f,0.269525f, -0.258065f,0.893814f,0.366742f, -0.124905f,0.932115f,0.339941f, -0.234805f,0.927845f,0.289777f, -0.325979f,0.90761f,0.264542f, -0.401458f,0.890435f,0.214374f, -0.44845f,0.886659f,0.112823f, -0.337292f,0.940965f,0.0286028f, -0.110729f,0.992952f,-0.0422648f, -0.0165495f,0.996512f,-0.0817925f, -0.0843804f,0.994583f,-0.0606957f, -0.1131f,0.990749f,-0.0749933f, -0.241223f,0.970417f,0.0100747f, -0.396578f,0.902933f,0.165644f, -0.324808f,0.936808f,0.129963f, -0.0728626f,0.997053f,0.0240034f, -0.167633f,0.975741f,0.140815f, -0.474631f,0.846984f,0.239465f, -0.567824f,0.786908f,0.24156f, -0.402496f,0.873451f,0.274008f, -0.0459982f,0.950641f,0.306865f, --0.0582337f,0.962437f,0.265188f, -0.030037f,0.970181f,0.240514f, --0.0533502f,0.992438f,0.110548f, -0.0995416f,0.988544f,0.11346f, -0.255626f,0.959556f,0.11793f, -0.26735f,0.961569f,0.0625254f, -0.18836f,0.981833f,-0.0228855f, -0.278864f,0.958778f,-0.0545789f, -0.407529f,0.909061f,-0.086769f, -0.427129f,0.902011f,-0.0627458f, -0.408272f,0.912551f,-0.0237565f, -0.36375f,0.922794f,-0.127037f, -0.266363f,0.919721f,-0.28838f, -0.0788795f,0.927162f,-0.366263f, -0.0391177f,0.978258f,-0.20367f, -0.0160429f,0.996725f,-0.0792609f, -0.0608773f,0.998141f,0.00292939f, -0.025245f,0.998361f,-0.0513526f, -0.140845f,0.988959f,-0.046063f, -0.138979f,0.986427f,-0.0874468f, -0.128983f,0.987322f,-0.0925141f, -0.303074f,0.948227f,-0.0949297f, -0.392011f,0.918105f,-0.0584085f, -0.26566f,0.960779f,0.0795528f, -0.166068f,0.98603f,-0.0129125f, -0.262845f,0.962536f,-0.0666132f, --0.104783f,0.989703f,0.0975085f, --0.153604f,0.984769f,0.0814646f, --0.17021f,0.98292f,0.0699758f, --0.192965f,0.974203f,0.117018f, --0.286836f,0.952199f,0.105086f, --0.195248f,0.969752f,0.146488f, --0.150662f,0.967412f,0.203504f, --0.264752f,0.950334f,0.163619f, --0.315905f,0.913283f,0.257134f, --0.224744f,0.91965f,0.322078f, --0.108929f,0.947464f,0.300743f, -0.0128823f,0.944776f,0.327463f, --0.0190359f,0.964202f,0.264485f, --0.187346f,0.97974f,0.0707926f, --0.0647113f,0.997854f,-0.0100069f, -0.163923f,0.98566f,0.0400324f, -0.299244f,0.952147f,0.0622031f, -0.300231f,0.948028f,0.105378f, -0.182306f,0.951449f,0.248009f, -0.15023f,0.937487f,0.313924f, -0.264855f,0.926023f,0.268948f, -0.322593f,0.919374f,0.225135f, -0.43093f,0.873406f,0.22685f, -0.536094f,0.828094f,0.163899f, -0.40435f,0.914491f,0.0144028f, -0.203744f,0.975451f,-0.0835749f, -0.102706f,0.983162f,-0.151145f, -0.0912494f,0.98262f,-0.161654f, -0.0714052f,0.991795f,-0.106042f, -0.113839f,0.992199f,-0.0508211f, -0.266818f,0.963676f,0.0116937f, -0.379059f,0.920849f,0.091386f, -0.155245f,0.98775f,0.0158058f, -0.135484f,0.989724f,-0.0457313f, -0.394833f,0.917954f,-0.0383045f, -0.510875f,0.847518f,0.143943f, -0.369724f,0.884704f,0.283906f, -0.16927f,0.926331f,0.336538f, --0.0368298f,0.974452f,0.221557f, -0.0247064f,0.955492f,0.293981f, -0.0101397f,0.960739f,0.27727f, -0.120365f,0.954563f,0.272621f, -0.285189f,0.933274f,0.218327f, -0.27356f,0.947401f,0.16612f, -0.298803f,0.939862f,0.165455f, -0.344494f,0.938521f,0.0223999f, -0.423232f,0.90602f,-0.00171397f, -0.428479f,0.903517f,-0.00795118f, -0.445837f,0.889867f,-0.0967762f, -0.420806f,0.885752f,-0.195872f, -0.361482f,0.916002f,-0.173987f, -0.0888846f,0.94798f,-0.305668f, --0.104291f,0.938663f,-0.328687f, --0.0525896f,0.969771f,-0.238281f, -0.0233793f,0.980465f,-0.1953f, -0.0772242f,0.980658f,-0.179852f, -0.158397f,0.962723f,-0.219259f, -0.207852f,0.94171f,-0.264536f, -0.167471f,0.922973f,-0.346518f, -0.273321f,0.900673f,-0.337764f, -0.244245f,0.947327f,-0.207161f, -0.179974f,0.982676f,-0.0442354f, -0.256056f,0.966655f,0.00369743f, -0.311224f,0.950239f,-0.0136096f, --0.114346f,0.96184f,0.248574f, --0.136601f,0.952445f,0.272377f, --0.118024f,0.9521f,0.282091f, --0.208962f,0.956737f,0.20246f, --0.278994f,0.940284f,0.195009f, --0.257672f,0.939434f,0.225986f, --0.195307f,0.931658f,0.306381f, --0.244185f,0.930201f,0.274044f, --0.297894f,0.926606f,0.229479f, --0.247712f,0.954952f,0.163421f, --0.130651f,0.964187f,0.230812f, --0.0752954f,0.962878f,0.259223f, -0.102408f,0.945859f,0.308f, --0.0116154f,0.986031f,0.166158f, -0.0110135f,0.994405f,0.105056f, -0.0951503f,0.992756f,0.0733669f, -0.243797f,0.961487f,0.12691f, -0.260872f,0.955085f,0.140567f, -0.0581113f,0.983556f,0.170998f, -0.136043f,0.955475f,0.261839f, -0.341254f,0.920705f,0.189336f, -0.362462f,0.927476f,0.0917096f, -0.434756f,0.897441f,0.0747436f, -0.56712f,0.819757f,0.0798336f, -0.532941f,0.840799f,0.0950342f, -0.285812f,0.957415f,-0.0408404f, -0.105292f,0.985973f,-0.129498f, -0.0183827f,0.988838f,-0.147857f, -0.00614806f,0.993133f,-0.116825f, -0.099955f,0.989102f,-0.108098f, -0.238003f,0.969438f,-0.0595305f, -0.37769f,0.925502f,0.0282058f, -0.22782f,0.973089f,-0.0345812f, -0.169707f,0.981804f,-0.085208f, -0.345833f,0.936168f,-0.0631539f, -0.390375f,0.920563f,0.0130624f, -0.292594f,0.949139f,0.116291f, -0.162356f,0.962761f,0.216174f, --0.0222207f,0.972687f,0.231055f, --0.0543181f,0.955402f,0.290271f, -0.0573363f,0.941579f,0.331875f, -0.0971816f,0.964596f,0.245172f, -0.31345f,0.917083f,0.246388f, -0.307384f,0.923753f,0.228463f, -0.331585f,0.921188f,0.203628f, -0.40966f,0.902178f,0.135106f, -0.421265f,0.901117f,0.102585f, -0.477285f,0.878068f,0.0345826f, -0.547818f,0.833857f,-0.0676607f, -0.41388f,0.899953f,-0.13707f, -0.336726f,0.938017f,-0.0820957f, -0.267129f,0.960427f,-0.0788775f, --0.0301028f,0.966021f,-0.256704f, --0.102361f,0.925067f,-0.36575f, --0.0109209f,0.925593f,-0.378364f, -0.0802595f,0.925005f,-0.371381f, -0.178475f,0.901809f,-0.393558f, -0.234643f,0.9031f,-0.359657f, -0.21073f,0.932522f,-0.29325f, -0.145492f,0.962309f,-0.22977f, -0.0986234f,0.992893f,-0.0666048f, -0.0609779f,0.998071f,0.0116837f, -0.208222f,0.976086f,0.0624398f, -0.291247f,0.954621f,0.0622453f, --0.144182f,0.940028f,0.309126f, --0.205006f,0.91833f,0.33859f, --0.12423f,0.88968f,0.43936f, --0.080186f,0.900963f,0.426423f, --0.276852f,0.915664f,0.291398f, --0.294009f,0.912157f,0.285532f, --0.229314f,0.935643f,0.268306f, --0.167187f,0.934278f,0.314918f, --0.22242f,0.937858f,0.266367f, --0.260643f,0.947201f,0.186748f, --0.191964f,0.952786f,0.235261f, --0.0626162f,0.968356f,0.24159f, -0.113658f,0.975135f,0.190246f, -0.0609991f,0.983083f,0.172707f, -0.00661942f,0.987494f,0.157516f, -0.132957f,0.988179f,0.0763221f, -0.229975f,0.973129f,-0.011475f, -0.267568f,0.962445f,0.0458956f, -0.0512446f,0.996521f,0.0657221f, -0.10251f,0.994623f,0.0147167f, -0.405413f,0.913613f,0.0308412f, -0.422693f,0.905322f,0.0415123f, -0.446493f,0.894763f,-0.00665318f, -0.517619f,0.855611f,0.00103599f, -0.493254f,0.857934f,0.143698f, -0.391227f,0.901201f,0.186488f, -0.212519f,0.97466f,0.0698119f, -0.0889638f,0.99521f,-0.0405254f, -0.0684633f,0.989971f,-0.123576f, -0.0764325f,0.983592f,-0.163418f, -0.104882f,0.990961f,-0.0836475f, -0.31755f,0.948184f,0.0104726f, -0.297752f,0.954642f,-0.00148102f, -0.157954f,0.986909f,-0.0325777f, -0.331713f,0.943333f,0.00940707f, -0.320973f,0.946975f,0.014661f, -0.220471f,0.961455f,0.164306f, -0.0647366f,0.977455f,0.200976f, --0.0349474f,0.961311f,0.273238f, --0.125874f,0.956852f,0.261896f, -0.0785055f,0.963364f,0.256449f, -0.211427f,0.962249f,0.171395f, -0.267083f,0.952021f,0.149409f, -0.340455f,0.905998f,0.251512f, -0.343062f,0.921876f,0.180149f, -0.420249f,0.886024f,0.195835f, -0.477229f,0.85754f,0.192034f, -0.564804f,0.822942f,0.0613434f, -0.583206f,0.811559f,-0.0352364f, -0.433319f,0.897576f,-0.0811897f, -0.291913f,0.950865f,-0.103166f, -0.268144f,0.961121f,-0.065914f, -0.14681f,0.986926f,-0.0665068f, -0.0393351f,0.975019f,-0.218612f, -0.042722f,0.945279f,-0.323454f, -0.104892f,0.926937f,-0.360257f, -0.188153f,0.928382f,-0.320477f, -0.104479f,0.956869f,-0.271082f, -0.039684f,0.98773f,-0.151046f, -0.0798596f,0.996734f,-0.0120106f, -0.0027229f,0.999081f,-0.0427778f, -0.0156228f,0.999853f,-0.00700924f, -0.224664f,0.97266f,0.058815f, -0.342188f,0.939164f,0.029646f, --0.199093f,0.881081f,0.429019f, --0.240385f,0.861587f,0.447083f, --0.200309f,0.881599f,0.427386f, --0.0492643f,0.888913f,0.455419f, --0.146605f,0.886582f,0.438724f, --0.194932f,0.91844f,0.344193f, --0.212452f,0.949737f,0.229922f, --0.231229f,0.946978f,0.223083f, --0.22018f,0.943947f,0.245937f, --0.155384f,0.954263f,0.255419f, --0.222552f,0.970336f,0.0944332f, -0.0103498f,0.996133f,0.0872447f, -0.133012f,0.991064f,-0.00997971f, -0.0530236f,0.995787f,0.0748093f, -0.0840279f,0.994917f,0.0554967f, -0.25995f,0.964887f,-0.0376792f, -0.277109f,0.958722f,-0.0637373f, -0.172083f,0.982525f,-0.0709421f, -0.0951551f,0.994032f,-0.0533466f, -0.177084f,0.970483f,-0.163718f, -0.336303f,0.91861f,-0.207499f, -0.381503f,0.916211f,-0.122527f, -0.437128f,0.898759f,-0.0339342f, -0.471093f,0.8784f,0.0805223f, -0.407138f,0.905658f,0.118413f, -0.402844f,0.901612f,0.157519f, -0.327464f,0.936685f,0.124046f, -0.19809f,0.980129f,0.0103207f, -0.123868f,0.987803f,-0.0943524f, -0.0527864f,0.989238f,-0.136459f, -0.072462f,0.988213f,-0.134849f, -0.248671f,0.959688f,-0.131005f, -0.280617f,0.958078f,0.0577984f, -0.169552f,0.981657f,0.0871871f, -0.315169f,0.946806f,0.0650122f, -0.205308f,0.973708f,0.0986977f, -0.0950386f,0.972165f,0.214158f, -0.053629f,0.964124f,0.259978f, --0.0859535f,0.951705f,0.294738f, --0.0564482f,0.948883f,0.31054f, -0.154105f,0.958817f,0.238582f, -0.276457f,0.946116f,0.168629f, -0.211552f,0.972531f,0.0971047f, -0.294402f,0.951062f,0.0938527f, -0.390766f,0.916003f,0.0907783f, -0.406836f,0.907458f,0.104904f, -0.487803f,0.868421f,0.0888414f, -0.60401f,0.790886f,0.0983406f, -0.637938f,0.762279f,0.109387f, -0.4874f,0.873178f,0.00117935f, -0.336067f,0.93258f,-0.131735f, -0.229766f,0.943375f,-0.239272f, -0.152224f,0.966237f,-0.207882f, -0.121199f,0.969969f,-0.210883f, -0.121425f,0.965511f,-0.230314f, -0.0800447f,0.963578f,-0.255166f, -0.0996944f,0.981315f,-0.164563f, -0.0506382f,0.996401f,-0.0679735f, --0.049503f,0.998346f,-0.0292297f, -0.050214f,0.998168f,0.0337586f, -0.113307f,0.993459f,0.014176f, --0.000723347f,0.991208f,-0.132313f, -0.134265f,0.980729f,-0.141929f, -0.363008f,0.931437f,-0.0254801f, --0.23486f,0.827656f,0.509732f, --0.18483f,0.851106f,0.491383f, --0.113579f,0.917253f,0.381767f, --0.0885467f,0.926234f,0.366401f, --0.119506f,0.895756f,0.428181f, --0.107176f,0.917761f,0.382398f, --0.0925542f,0.950614f,0.296253f, --0.166069f,0.978511f,0.12222f, --0.250375f,0.968134f,-0.00545859f, --0.116612f,0.99254f,0.0355817f, --0.0441586f,0.99869f,-0.0258397f, -0.0237183f,0.990591f,-0.134786f, -0.114156f,0.992737f,-0.0379611f, -0.0216237f,0.999568f,0.0199155f, -0.13918f,0.98521f,-0.0999564f, -0.240654f,0.960885f,-0.137059f, -0.249305f,0.964708f,-0.0847689f, -0.222546f,0.966381f,-0.128771f, -0.148234f,0.971026f,-0.187443f, -0.258813f,0.946284f,-0.193812f, -0.386195f,0.898799f,-0.207397f, -0.325896f,0.902531f,-0.281478f, -0.250321f,0.93543f,-0.249621f, -0.351402f,0.936022f,0.01949f, -0.42413f,0.889134f,0.171914f, -0.422963f,0.898638f,0.116411f, -0.393976f,0.918547f,0.0324739f, -0.283361f,0.957155f,-0.0596804f, -0.186222f,0.979389f,-0.0782236f, -0.100294f,0.99243f,-0.0708823f, -0.151138f,0.983442f,-0.0999959f, -0.115742f,0.982035f,-0.149033f, -0.0920961f,0.993962f,0.0596489f, -0.180728f,0.97583f,0.122852f, -0.267575f,0.959234f,0.0909572f, -0.204025f,0.959594f,0.193785f, -0.0830398f,0.98516f,0.150214f, -0.000808908f,0.987078f,0.160239f, --0.115905f,0.961815f,0.247948f, --0.0397732f,0.972025f,0.231484f, -0.185186f,0.964166f,0.189976f, -0.333936f,0.928543f,0.162155f, -0.358439f,0.932281f,0.0487095f, -0.30639f,0.946624f,-0.100142f, -0.389119f,0.921183f,-0.00273847f, -0.418957f,0.907889f,-0.0145855f, -0.498018f,0.86538f,-0.05563f, -0.565975f,0.823958f,-0.0276542f, -0.61235f,0.789736f,0.0366549f, -0.580326f,0.809292f,0.0909313f, -0.472624f,0.880866f,0.0264734f, -0.31167f,0.948991f,-0.0477351f, -0.149242f,0.981946f,-0.116226f, -0.114121f,0.974963f,-0.190851f, -0.0836789f,0.981905f,-0.169884f, -0.0779767f,0.990421f,-0.113957f, -0.0144442f,0.982901f,-0.183565f, --0.021091f,0.988398f,-0.150415f, --0.0454971f,0.990828f,-0.127242f, --0.0180398f,0.984723f,-0.173189f, -0.129331f,0.988095f,-0.0833159f, -0.183553f,0.978578f,-0.0932403f, -0.123107f,0.958699f,-0.256402f, -0.189949f,0.953063f,-0.235775f, --0.0544616f,0.84489f,0.53216f, --0.0113297f,0.890886f,0.454085f, --0.0462225f,0.938549f,0.342038f, --0.128436f,0.915911f,0.380277f, --0.159132f,0.90887f,0.385529f, --0.0486608f,0.932565f,0.357708f, -0.0612592f,0.9505f,0.304627f, -0.0533898f,0.988914f,0.138559f, --0.104607f,0.992177f,-0.0681298f, --0.180998f,0.963403f,-0.197725f, -0.0184775f,0.993878f,-0.108929f, --0.0166014f,0.988229f,-0.152078f, --0.0077365f,0.996975f,-0.0773314f, -0.0579939f,0.995726f,-0.071872f, -0.284878f,0.950639f,-0.123003f, -0.233331f,0.946766f,-0.221789f, -0.274724f,0.943287f,-0.186374f, -0.284827f,0.926731f,-0.245036f, -0.143673f,0.947988f,-0.284037f, -0.183874f,0.951741f,-0.245725f, -0.373811f,0.924384f,-0.0760214f, -0.370847f,0.928183f,0.0307872f, -0.230777f,0.972874f,0.0160428f, -0.116854f,0.992434f,-0.0376857f, -0.311514f,0.945104f,0.0986779f, -0.493623f,0.85792f,0.14251f, -0.47336f,0.879733f,0.0447334f, -0.299829f,0.953139f,0.0403417f, -0.142324f,0.985386f,0.0935816f, -0.0780161f,0.991843f,0.100799f, -0.120483f,0.987279f,0.10375f, -0.113666f,0.977351f,0.178507f, -0.020827f,0.987302f,0.157484f, -0.18308f,0.973453f,0.137371f, -0.268344f,0.949436f,0.162981f, -0.178652f,0.97403f,0.139099f, -0.140521f,0.985536f,0.0947243f, --0.0588959f,0.995353f,0.0761881f, --0.17043f,0.974748f,0.144293f, -0.0194468f,0.992819f,0.118038f, -0.23167f,0.972512f,0.0234243f, -0.390625f,0.920274f,-0.0225152f, -0.45457f,0.886543f,-0.086066f, -0.307368f,0.941264f,-0.13981f, -0.289942f,0.953608f,-0.0810322f, -0.455218f,0.890309f,-0.0112281f, -0.513837f,0.856124f,-0.0549855f, -0.546925f,0.836241f,-0.0396788f, -0.583367f,0.812208f,-0.00110721f, -0.552934f,0.832422f,0.0365798f, -0.448406f,0.891004f,0.0710176f, -0.325547f,0.934833f,0.141795f, -0.239603f,0.963586f,0.118709f, -0.230453f,0.97295f,0.0160981f, -0.0486317f,0.9909f,-0.125509f, -0.0743177f,0.991871f,-0.103291f, -0.139517f,0.9837f,-0.11344f, --0.0210587f,0.976395f,-0.214963f, -0.00854959f,0.97326f,-0.229548f, -0.0184659f,0.95097f,-0.308733f, -0.0120962f,0.95636f,-0.291939f, -0.153044f,0.979201f,-0.1332f, -0.190748f,0.981634f,-0.00308124f, -0.151842f,0.988041f,0.0268087f, -0.0319983f,0.964154f,0.263409f, -0.0761375f,0.979983f,0.183946f, --0.0471561f,0.98918f,0.13892f, --0.184804f,0.965808f,0.181831f, --0.118202f,0.977652f,0.173852f, --0.00263192f,0.986244f,0.165277f, -0.113935f,0.977488f,0.177586f, -0.213178f,0.965311f,0.150764f, -0.0917926f,0.995582f,-0.0197448f, --0.112968f,0.973922f,-0.196759f, --0.0750323f,0.977001f,-0.199598f, -0.0257774f,0.985322f,-0.168747f, -0.042721f,0.964979f,-0.258825f, -0.0821835f,0.934135f,-0.34733f, -0.254423f,0.923351f,-0.287563f, -0.255965f,0.951062f,-0.173101f, -0.240055f,0.959513f,-0.147338f, -0.319995f,0.939284f,-0.123892f, -0.15271f,0.974885f,-0.162111f, -0.132954f,0.978157f,-0.159787f, -0.156062f,0.978958f,-0.131476f, -0.237325f,0.969005f,0.0685979f, -0.280555f,0.951122f,0.129056f, -0.254605f,0.966124f,0.0421956f, -0.282663f,0.955227f,-0.087427f, -0.484968f,0.871846f,-0.0684877f, -0.483506f,0.87515f,-0.0182894f, -0.210764f,0.97671f,0.0402119f, -0.0804806f,0.985666f,0.148275f, -0.143859f,0.967897f,0.206108f, -0.0874346f,0.987357f,0.132215f, -0.0878227f,0.985433f,0.145635f, -0.118466f,0.990277f,0.0729134f, -0.170426f,0.983396f,-0.0623508f, -0.249461f,0.967984f,-0.0278496f, -0.240586f,0.970589f,0.00866192f, -0.158755f,0.987312f,0.00339798f, --0.0496588f,0.997869f,0.0423253f, --0.174436f,0.984473f,-0.0196346f, -0.0953847f,0.991998f,-0.0827112f, -0.301757f,0.941321f,-0.151184f, -0.416386f,0.897492f,-0.145363f, -0.439988f,0.889223f,-0.125274f, -0.313047f,0.948071f,-0.0562344f, -0.243151f,0.96888f,-0.0463665f, -0.428373f,0.903467f,-0.0156432f, -0.536849f,0.842847f,-0.0374461f, -0.521753f,0.850621f,-0.0649361f, -0.537565f,0.842885f,-0.02384f, -0.530522f,0.843125f,0.087673f, -0.408082f,0.90082f,0.148295f, -0.350282f,0.920762f,0.171756f, -0.275878f,0.960222f,0.0431791f, -0.279727f,0.959242f,0.0400889f, -0.199403f,0.977085f,0.0744484f, -0.0837631f,0.994427f,-0.0640234f, -0.142714f,0.98022f,-0.137117f, -0.0724844f,0.974795f,-0.211f, -0.0199047f,0.956284f,-0.29176f, -0.0419923f,0.973015f,-0.226887f, --0.0571486f,0.988577f,-0.139464f, --0.0620153f,0.996095f,-0.0628396f, -0.00941635f,0.995205f,0.097359f, -0.0452536f,0.980521f,0.191132f, -0.238692f,0.970551f,0.032497f, -0.18188f,0.979621f,-0.0852148f, --0.0338772f,0.991689f,-0.124115f, --0.215207f,0.972977f,-0.0836781f, --0.127875f,0.990711f,-0.0462653f, --0.0382254f,0.999079f,-0.0194842f, -0.0717625f,0.997386f,-0.00848587f, -0.235337f,0.971913f,0.00129577f, -0.258073f,0.965901f,-0.0208375f, -0.00563659f,0.988134f,-0.153488f, --0.0963466f,0.971245f,-0.217715f, -0.0933449f,0.976181f,-0.19585f, -0.172697f,0.943118f,-0.284084f, -0.114064f,0.91464f,-0.387844f, -0.105309f,0.920749f,-0.375675f, -0.0952503f,0.976152f,-0.195075f, -0.198665f,0.977736f,-0.0675672f, -0.327274f,0.944589f,-0.0253815f, -0.185125f,0.982311f,-0.0281882f, -0.161734f,0.983206f,-0.0845435f, -0.135269f,0.981463f,-0.135765f, -0.160555f,0.98307f,-0.0882893f, -0.258909f,0.96483f,-0.0454967f, -0.342126f,0.938267f,0.0510447f, -0.36458f,0.930989f,-0.0184394f, -0.461971f,0.885156f,-0.0555142f, -0.401049f,0.915892f,-0.0173601f, -0.179695f,0.981649f,0.0638365f, --0.0160491f,0.998918f,0.0436388f, -0.112643f,0.989219f,0.093583f, -0.158223f,0.986353f,0.0455405f, -0.150051f,0.988439f,-0.0217303f, -0.238384f,0.964999f,-0.10932f, -0.283357f,0.938433f,-0.197616f, -0.1814f,0.953903f,-0.239086f, -0.147672f,0.981223f,-0.124073f, -0.0988803f,0.99502f,-0.0125399f, --0.0367309f,0.999167f,-0.0177995f, --0.0641669f,0.988893f,-0.134067f, -0.155868f,0.964972f,-0.211032f, -0.311449f,0.929937f,-0.195488f, -0.363438f,0.913854f,-0.181064f, -0.379108f,0.919625f,-0.102794f, -0.251516f,0.967833f,-0.00624272f, -0.239964f,0.970767f,0.0053561f, -0.444229f,0.895407f,-0.0301255f, -0.561208f,0.823627f,-0.0817525f, -0.529532f,0.843694f,-0.0881851f, -0.463417f,0.885698f,-0.0280076f, -0.42264f,0.895689f,0.138263f, -0.360725f,0.902736f,0.234403f, -0.374064f,0.893088f,0.249939f, -0.398158f,0.891769f,0.214982f, -0.241834f,0.965676f,0.0947983f, -0.124224f,0.988267f,0.0888664f, -0.239364f,0.964398f,0.112437f, -0.252174f,0.966402f,-0.0497516f, -0.205848f,0.974166f,-0.0928869f, -0.0402048f,0.980488f,-0.192421f, --0.109787f,0.981783f,-0.155076f, --0.172809f,0.983136f,-0.0598348f, --0.119927f,0.992756f,0.00723519f, --0.0378691f,0.997707f,0.0560999f, --0.018583f,0.999146f,0.0369096f, -0.311296f,0.946614f,-0.0837655f, -0.23235f,0.967065f,-0.103921f, --0.0472012f,0.997512f,-0.0523709f, --0.280913f,0.95942f,-0.0245033f, --0.168558f,0.985462f,0.0212842f, --0.0297654f,0.999551f,-0.00345095f, -0.14783f,0.984722f,-0.0920209f, -0.234818f,0.942556f,-0.23759f, -0.226f,0.954601f,-0.194065f, -0.0915505f,0.991576f,-0.0916283f, --0.0384295f,0.986109f,-0.161594f, -0.0699749f,0.969463f,-0.235043f, -0.242042f,0.947128f,-0.210628f, -0.200696f,0.954776f,-0.21937f, -0.0684629f,0.960296f,-0.270452f, --0.0178037f,0.955193f,-0.295449f, -0.106419f,0.956511f,-0.271592f, -0.250177f,0.956337f,-0.151101f, -0.206468f,0.977841f,-0.0346042f, -0.226301f,0.972897f,-0.047521f, -0.19172f,0.975927f,-0.103973f, -0.110286f,0.969903f,-0.217085f, -0.124805f,0.979571f,-0.157684f, -0.230362f,0.972377f,0.0376307f, -0.390327f,0.9143f,0.108165f, -0.486088f,0.869528f,0.0874049f, -0.355552f,0.931184f,0.0804947f, -0.162837f,0.968115f,0.190362f, -0.0587916f,0.990094f,0.127507f, -0.122084f,0.99234f,0.0189101f, -0.227899f,0.973107f,0.0335246f, -0.245712f,0.968327f,-0.0443735f, -0.235392f,0.962107f,-0.137626f, -0.299512f,0.953154f,0.0423112f, -0.158421f,0.985528f,0.0603087f, -0.0139537f,0.99778f,0.0651181f, -0.05695f,0.991196f,0.119526f, -0.0853993f,0.993434f,0.0761332f, -0.0800124f,0.992698f,-0.0902652f, -0.152744f,0.965412f,-0.211303f, -0.298303f,0.938225f,-0.175354f, -0.346617f,0.918158f,-0.191946f, -0.306791f,0.939305f,-0.153575f, -0.213668f,0.966817f,-0.140039f, -0.269123f,0.94608f,-0.180294f, -0.462084f,0.866259f,-0.189928f, -0.547323f,0.828917f,-0.11547f, -0.492713f,0.870051f,0.0156307f, -0.377637f,0.925543f,0.0275792f, -0.309374f,0.94993f,0.0438272f, -0.339128f,0.933648f,0.115296f, -0.355844f,0.92275f,0.148012f, -0.387104f,0.898496f,0.207015f, -0.394935f,0.895155f,0.206698f, -0.187014f,0.981688f,0.0362499f, -0.286474f,0.957988f,0.0138101f, -0.315633f,0.944806f,-0.0878444f, -0.189054f,0.976628f,-0.102261f, -0.071001f,0.995263f,-0.066411f, --0.121993f,0.990638f,-0.0612738f, --0.195423f,0.978588f,-0.0646113f, --0.134933f,0.988908f,-0.0620808f, --0.0362027f,0.9885f,-0.146822f, -0.0247852f,0.975168f,-0.220074f, -0.236634f,0.970435f,-0.0475491f, -0.163622f,0.985347f,0.0481553f, --0.110204f,0.98299f,0.146921f, --0.274076f,0.953125f,0.128197f, --0.127913f,0.990913f,0.0415925f, -0.0693505f,0.994264f,-0.081428f, -0.246728f,0.957329f,-0.15049f, -0.356012f,0.927656f,-0.112735f, -0.108926f,0.979602f,-0.168863f, --0.0117435f,0.995074f,-0.0984399f, -0.0591802f,0.992813f,-0.104017f, -0.152983f,0.961405f,-0.228683f, -0.199436f,0.939216f,-0.279462f, -0.158919f,0.956661f,-0.244017f, -0.142246f,0.964436f,-0.222776f, -0.0928224f,0.948092f,-0.304146f, -0.072096f,0.927878f,-0.365849f, -0.0949024f,0.954182f,-0.28378f, -0.0839904f,0.981792f,-0.17038f, -0.207123f,0.975655f,-0.0720922f, -0.306863f,0.948734f,-0.075756f, -0.227677f,0.946857f,-0.22721f, -0.0209281f,0.957849f,-0.28651f, -0.0889558f,0.973432f,-0.210993f, -0.377519f,0.908654f,-0.178401f, -0.444767f,0.867771f,-0.22171f, -0.296477f,0.952876f,-0.0642486f, -0.049587f,0.998699f,0.0118749f, -0.185088f,0.975344f,0.120192f, -0.179316f,0.983776f,0.00553586f, -0.203508f,0.978758f,-0.0248474f, -0.30632f,0.951877f,-0.00993344f, -0.182507f,0.983075f,0.0159703f, -0.0804506f,0.991985f,0.0974322f, -0.170994f,0.963788f,0.204629f, -0.0962731f,0.986887f,0.12956f, -0.097797f,0.995201f,0.00337759f, -0.147003f,0.987459f,-0.0575677f, -0.218112f,0.972969f,-0.0758899f, -0.244949f,0.956598f,-0.157862f, -0.315584f,0.924587f,-0.213415f, -0.352441f,0.893692f,-0.277668f, -0.28482f,0.905458f,-0.31468f, -0.265138f,0.910445f,-0.317477f, -0.308383f,0.884493f,-0.350102f, -0.390084f,0.870652f,-0.299665f, -0.373263f,0.922794f,-0.0955261f, -0.378781f,0.918384f,0.114439f, -0.476669f,0.866105f,0.150494f, -0.353048f,0.93424f,-0.0505168f, -0.309942f,0.946077f,-0.0942048f, -0.298518f,0.948219f,-0.108479f, -0.350416f,0.935917f,-0.0356219f, -0.447907f,0.893892f,-0.0183155f, -0.280155f,0.95286f,-0.116492f, -0.270748f,0.951225f,-0.147871f, -0.374052f,0.922269f,-0.0974917f, -0.176754f,0.980223f,-0.0889943f, -0.0634799f,0.992926f,-0.100339f, --0.11806f,0.977045f,-0.177329f, --0.199746f,0.955239f,-0.218219f, --0.0812223f,0.969857f,-0.229739f, -0.130179f,0.951543f,-0.278602f, -0.200559f,0.919086f,-0.339202f, -0.0174361f,0.999489f,0.0268061f, -0.0105554f,0.991703f,0.128113f, --0.141198f,0.973013f,0.182506f, --0.142313f,0.985833f,0.0887713f, -0.00597934f,0.99465f,-0.103131f, -0.213448f,0.959986f,-0.181295f, -0.150446f,0.953754f,-0.260228f, -0.244008f,0.968351f,-0.0525036f, -0.184758f,0.982743f,0.00893989f, --0.00567918f,0.992902f,-0.118797f, -0.138037f,0.98016f,-0.142241f, -0.21929f,0.962205f,-0.16147f, -0.269703f,0.95408f,-0.13035f, -0.150911f,0.956731f,-0.24878f, -0.180021f,0.944452f,-0.27496f, -0.119147f,0.92214f,-0.368051f, -0.0669033f,0.930661f,-0.359714f, --0.0113587f,0.942765f,-0.333265f, -0.0142182f,0.972628f,-0.231934f, -0.163413f,0.959027f,-0.231437f, -0.324001f,0.919871f,-0.221046f, -0.291919f,0.93701f,-0.19182f, -0.107512f,0.968299f,-0.225473f, -0.0749887f,0.923898f,-0.375218f, -0.415609f,0.849812f,-0.324172f, -0.314994f,0.92041f,-0.231569f, -0.136459f,0.990645f,0.000905767f, -0.00734966f,0.998995f,0.0442195f, -0.0805668f,0.996634f,0.0151596f, -0.266119f,0.962333f,0.0556322f, -0.269187f,0.962624f,-0.0298845f, -0.209195f,0.975524f,-0.0677535f, -0.153299f,0.985902f,0.0670637f, -0.0587395f,0.996349f,0.0619523f, -0.20348f,0.97612f,0.0760684f, -0.225978f,0.971688f,-0.0689656f, -0.204562f,0.957442f,-0.203617f, -0.164418f,0.955123f,-0.246386f, -0.1725f,0.961839f,-0.212392f, -0.288653f,0.947463f,-0.137816f, -0.355829f,0.918236f,-0.173863f, -0.453757f,0.873536f,-0.176182f, -0.355645f,0.881401f,-0.310884f, -0.238917f,0.864251f,-0.442706f, -0.251593f,0.863453f,-0.437206f, -0.231383f,0.92049f,-0.314896f, -0.219172f,0.968344f,-0.119471f, -0.254773f,0.966196f,-0.0394394f, -0.482542f,0.873342f,0.0665443f, -0.470019f,0.880685f,0.0589576f, -0.359563f,0.932576f,-0.0318683f, -0.336062f,0.937393f,-0.0914179f, -0.320744f,0.932455f,-0.166285f, -0.428106f,0.887361f,-0.171217f, -0.372336f,0.918652f,-0.132074f, -0.247289f,0.941171f,-0.230314f, -0.287477f,0.950239f,-0.120008f, -0.121799f,0.989487f,-0.0779795f, -0.132326f,0.991166f,-0.00888466f, --0.00459516f,0.997934f,-0.0640824f, --0.0924696f,0.984613f,-0.148277f, --0.0479758f,0.968834f,-0.243019f, -0.052427f,0.976364f,-0.209677f, -0.223214f,0.97397f,-0.0394671f, -0.0112214f,0.972418f,0.232975f, -0.0106355f,0.967748f,0.251694f, --0.0743183f,0.979789f,0.185717f, -0.0581795f,0.9982f,0.01459f, -0.133434f,0.964693f,-0.227076f, -0.215981f,0.948544f,-0.231554f, -0.137408f,0.968029f,-0.209856f, -0.0442022f,0.987042f,-0.154256f, -0.228305f,0.972284f,0.0504f, -0.121617f,0.992241f,-0.0258404f, -0.134527f,0.985242f,-0.105833f, -0.151618f,0.980953f,-0.121423f, -0.275183f,0.956894f,-0.092891f, -0.263324f,0.945384f,-0.192117f, -0.25647f,0.929449f,-0.26523f, -0.21073f,0.904026f,-0.371926f, -0.0728135f,0.89169f,-0.446751f, --0.0691284f,0.877831f,-0.473955f, --0.019884f,0.913569f,-0.406197f, -0.178205f,0.891525f,-0.416444f, -0.263993f,0.900279f,-0.34613f, -0.210305f,0.939702f,-0.269689f, -0.208408f,0.948624f,-0.238074f, -0.229275f,0.910156f,-0.345036f, -0.227512f,0.924458f,-0.305966f, -0.142229f,0.989234f,0.0344507f, --0.0464441f,0.986357f,0.157934f, -0.073391f,0.981122f,0.178921f, -0.158555f,0.984472f,0.0753311f, -0.265489f,0.961878f,0.0656237f, -0.318063f,0.94383f,0.0895592f, -0.229589f,0.973115f,0.0183382f, -0.0918017f,0.995548f,-0.0213497f, -0.0710209f,0.997458f,0.00582691f, -0.234172f,0.971044f,-0.0473045f, -0.373198f,0.918081f,-0.133603f, -0.27855f,0.93462f,-0.221124f, -0.174681f,0.94082f,-0.290421f, -0.0816739f,0.936818f,-0.34015f, -0.233666f,0.948403f,-0.214319f, -0.373882f,0.91082f,-0.174984f, -0.44036f,0.88198f,-0.16791f, -0.496092f,0.86017f,-0.118324f, -0.420226f,0.875748f,-0.237645f, -0.228936f,0.896528f,-0.379243f, -0.0594423f,0.913794f,-0.401806f, -0.0971839f,0.949435f,-0.298544f, -0.201575f,0.953775f,-0.222894f, -0.339139f,0.935667f,-0.0975326f, -0.471026f,0.864094f,0.177416f, -0.409402f,0.896788f,0.167814f, -0.414181f,0.90532f,0.0940739f, -0.426161f,0.903473f,-0.0460849f, -0.431652f,0.886771f,-0.165266f, -0.36903f,0.909898f,-0.189479f, -0.237762f,0.950577f,-0.199683f, -0.250405f,0.963718f,-0.0924377f, -0.100123f,0.989034f,-0.108572f, -0.0410755f,0.997876f,-0.0505615f, -0.0233843f,0.999496f,0.0214792f, --0.0536722f,0.998467f,-0.0135057f, -0.00107433f,0.999993f,-0.00356525f, --0.0705196f,0.996911f,-0.0345704f, --0.0688919f,0.997514f,0.0148223f, --0.0812179f,0.983535f,0.161436f, --0.0138011f,0.988231f,0.152344f, -0.0655184f,0.995642f,0.0663652f, -0.220598f,0.973784f,-0.0554998f, -0.309629f,0.942731f,-0.124049f, -0.155774f,0.947975f,-0.27763f, -0.127196f,0.974249f,-0.186174f, --0.058769f,0.981296f,-0.183314f, -0.0497615f,0.99612f,-0.0725919f, -0.182926f,0.98205f,0.0460018f, -0.19209f,0.981195f,-0.0189005f, -0.224403f,0.972569f,-0.0612647f, -0.315645f,0.941316f,-0.119552f, -0.360736f,0.920207f,-0.151949f, -0.310465f,0.916626f,-0.251809f, -0.327403f,0.899549f,-0.28917f, -0.161725f,0.896729f,-0.411973f, --0.0141039f,0.865769f,-0.500245f, --0.0292484f,0.82172f,-0.56914f, -0.0961328f,0.815723f,-0.570398f, -0.101793f,0.868026f,-0.485972f, -0.156302f,0.922247f,-0.353597f, -0.205267f,0.935719f,-0.286871f, -0.229076f,0.948515f,-0.218729f, -0.0347356f,0.987904f,-0.151126f, --0.079026f,0.996018f,0.0412683f, --0.00943989f,0.997185f,0.0743796f, -0.111542f,0.993598f,-0.0179121f, -0.186771f,0.982172f,0.0213291f, -0.207496f,0.975443f,0.0738717f, -0.321818f,0.944637f,0.0639911f, -0.281397f,0.958917f,0.0359716f, -0.126766f,0.988281f,0.0850327f, -0.0940702f,0.995531f,0.0082479f, -0.338235f,0.93955f,-0.0533163f, -0.410978f,0.899199f,-0.150126f, -0.338008f,0.912085f,-0.232059f, -0.265939f,0.902685f,-0.338284f, -0.120839f,0.912428f,-0.39099f, -0.0943411f,0.91428f,-0.393944f, -0.326367f,0.911608f,-0.24991f, -0.410002f,0.90171f,-0.137175f, -0.446036f,0.89335f,-0.054576f, -0.453415f,0.890674f,0.0333893f, -0.369882f,0.926554f,0.0684487f, -0.15305f,0.985829f,-0.0686756f, -0.0307343f,0.980172f,-0.195752f, -0.104404f,0.981192f,-0.162361f, -0.153412f,0.984343f,-0.086793f, -0.259868f,0.962798f,0.0740869f, -0.405239f,0.886729f,0.222469f, -0.507863f,0.829218f,0.233395f, -0.530784f,0.842353f,0.0933228f, -0.515092f,0.857118f,0.0053912f, -0.421652f,0.904509f,-0.0638277f, -0.186762f,0.968676f,-0.16367f, -0.141357f,0.986443f,-0.0833539f, -0.10637f,0.994244f,0.0127965f, --0.010764f,0.999348f,-0.0344492f, --0.00443345f,0.999867f,-0.0156939f, --0.0569297f,0.998142f,0.0217125f, --0.0108274f,0.998516f,0.0533776f, --0.0518054f,0.997615f,0.0456197f, --0.08879f,0.991878f,0.0910736f, -0.15627f,0.9777f,0.14029f, -0.127078f,0.991794f,-0.0140045f, -0.182153f,0.975854f,-0.12054f, -0.236919f,0.957374f,-0.165238f, -0.354425f,0.924081f,-0.143031f, -0.22947f,0.95204f,-0.202395f, -0.0414456f,0.986576f,-0.157956f, --0.0334694f,0.988237f,-0.149222f, --0.0516418f,0.976013f,-0.2115f, -0.149794f,0.980531f,-0.126967f, -0.232135f,0.958309f,-0.166606f, -0.253821f,0.951991f,-0.171138f, -0.306434f,0.927336f,-0.214818f, -0.397399f,0.902704f,-0.164923f, -0.371523f,0.904625f,-0.208864f, -0.394746f,0.892045f,-0.220071f, -0.272791f,0.90211f,-0.334339f, -0.143123f,0.890975f,-0.430905f, -0.0302622f,0.843122f,-0.53687f, -0.0628652f,0.888185f,-0.455165f, -0.00848379f,0.914478f,-0.404546f, -0.009201f,0.926788f,-0.375473f, -0.0671766f,0.952807f,-0.296052f, -0.132209f,0.974746f,-0.179973f, --0.0203291f,0.99362f,-0.110936f, --0.138553f,0.985569f,-0.0972441f, -0.0605753f,0.989699f,-0.129717f, -0.0968295f,0.980926f,-0.168548f, -0.0979519f,0.993956f,-0.0495753f, -0.201443f,0.976928f,-0.0709446f, -0.381986f,0.916436f,-0.119294f, -0.157625f,0.97891f,-0.12996f, -0.10065f,0.993729f,0.0486956f, -0.194299f,0.980695f,-0.0220253f, -0.364962f,0.929379f,-0.0552881f, -0.487949f,0.871552f,-0.0479875f, -0.462417f,0.883871f,-0.0702998f, -0.341292f,0.927621f,-0.151788f, -0.13195f,0.962323f,-0.237746f, -0.0784249f,0.961522f,-0.263298f, -0.155522f,0.961843f,-0.225101f, -0.275269f,0.959916f,-0.0528088f, -0.354301f,0.927858f,0.116403f, -0.359914f,0.906647f,0.22012f, -0.307706f,0.904557f,0.295117f, -0.281691f,0.897787f,0.338569f, -0.169122f,0.964903f,0.200898f, -0.116857f,0.992098f,0.045666f, -0.131422f,0.991068f,-0.0226175f, -0.19688f,0.980005f,-0.0287978f, -0.332698f,0.942383f,-0.0350149f, -0.49437f,0.868541f,-0.0351363f, -0.591151f,0.806162f,-0.0253575f, -0.528595f,0.848271f,-0.0319893f, -0.452945f,0.891538f,3.96151e-005f, -0.269718f,0.962267f,0.0359679f, -0.0172075f,0.99965f,0.0201157f, -0.0836306f,0.98488f,0.151715f, -0.0817519f,0.992549f,0.0903531f, --0.0289252f,0.999464f,0.015311f, --0.0977995f,0.99488f,0.0254794f, --0.0368101f,0.998502f,0.0404932f, --0.0917396f,0.988968f,0.116306f, --0.19824f,0.961924f,0.188156f, -0.355147f,0.931267f,-0.0813196f, -0.261709f,0.946669f,-0.187953f, -0.187089f,0.954576f,-0.23191f, -0.281523f,0.925027f,-0.255086f, -0.340665f,0.862289f,-0.374707f, -0.168991f,0.920317f,-0.352786f, --0.0114217f,0.969014f,-0.246743f, -0.0275027f,0.971061f,-0.237244f, -0.0127748f,0.945787f,-0.324537f, -0.106685f,0.927276f,-0.358857f, -0.242554f,0.910981f,-0.333589f, -0.254201f,0.919334f,-0.300346f, -0.319051f,0.907348f,-0.273727f, -0.384836f,0.892504f,-0.235241f, -0.359386f,0.889916f,-0.280877f, -0.418755f,0.87516f,-0.242361f, -0.378513f,0.873068f,-0.307377f, -0.247447f,0.872868f,-0.420561f, -0.0334574f,0.868028f,-0.495387f, --0.104393f,0.897693f,-0.428077f, --0.0466408f,0.949283f,-0.310944f, -0.00907853f,0.960916f,-0.276691f, -0.00868667f,0.966036f,-0.258261f, -0.0845957f,0.976098f,-0.200192f, --0.0296926f,0.969375f,-0.243785f, --0.104852f,0.955765f,-0.274807f, -0.0855702f,0.957819f,-0.274336f, -0.0411396f,0.961225f,-0.272681f, -0.0481708f,0.973933f,-0.221661f, -0.28909f,0.93695f,-0.196346f, -0.356766f,0.919532f,-0.164859f, -0.126757f,0.9882f,-0.0859897f, -0.0144124f,0.990867f,-0.134068f, -0.233251f,0.969449f,-0.075909f, -0.354937f,0.93426f,-0.034317f, -0.469402f,0.882971f,-0.00493066f, -0.398385f,0.917184f,-0.00790304f, -0.386606f,0.918227f,0.0859925f, -0.228789f,0.970147f,0.0804364f, -0.115903f,0.993259f,0.0019484f, -0.110471f,0.992802f,-0.0462595f, -0.159257f,0.98723f,-0.00373461f, -0.193831f,0.979844f,0.0483161f, -0.304703f,0.938233f,0.163935f, -0.27363f,0.944953f,0.179417f, -0.268196f,0.936861f,0.224416f, -0.306571f,0.922686f,0.233806f, -0.304362f,0.944561f,0.123164f, -0.226364f,0.97021f,-0.0863264f, -0.198019f,0.963611f,-0.179562f, -0.39862f,0.902547f,-0.162819f, -0.534677f,0.804719f,-0.257967f, -0.537872f,0.788638f,-0.297899f, -0.486148f,0.837034f,-0.251066f, -0.374822f,0.901369f,-0.216893f, -0.171725f,0.976903f,-0.127168f, --0.0108013f,0.999941f,-0.00151679f, -0.0247265f,0.999687f,-0.00377037f, -0.135958f,0.990654f,0.0109791f, --0.00717425f,0.999252f,0.0379956f, --0.0710711f,0.991911f,0.105175f, --0.0859239f,0.990395f,0.108328f, --0.18335f,0.97033f,0.157612f, --0.315275f,0.941315f,0.120535f, -0.340669f,0.883831f,-0.320605f, -0.289176f,0.886429f,-0.361416f, -0.20883f,0.874721f,-0.437325f, -0.364068f,0.812937f,-0.454519f, -0.367133f,0.769647f,-0.522357f, -0.0748495f,0.818621f,-0.569436f, --0.0872921f,0.835085f,-0.543151f, -0.00846427f,0.872897f,-0.48783f, -0.114223f,0.886407f,-0.448593f, -0.0920189f,0.872463f,-0.479939f, -0.2125f,0.893929f,-0.394633f, -0.175058f,0.869572f,-0.461735f, -0.23988f,0.874417f,-0.421725f, -0.3397f,0.869601f,-0.358326f, -0.392151f,0.874231f,-0.286248f, -0.401032f,0.871377f,-0.282622f, -0.447169f,0.847971f,-0.28458f, -0.337548f,0.868339f,-0.363386f, -0.0674983f,0.896564f,-0.437742f, --0.167145f,0.867884f,-0.467804f, --0.130341f,0.888597f,-0.43978f, --0.0513088f,0.927515f,-0.370248f, --0.0499693f,0.955154f,-0.291861f, -0.0619562f,0.966501f,-0.249073f, -0.104114f,0.952328f,-0.28676f, --0.0782617f,0.904542f,-0.419141f, -0.00654125f,0.918336f,-0.395747f, -0.0825819f,0.944757f,-0.317199f, -0.028702f,0.9283f,-0.370722f, -0.170752f,0.927761f,-0.331819f, -0.188742f,0.965638f,-0.178664f, -0.126613f,0.983535f,0.12895f, -0.0677004f,0.989289f,0.129321f, -0.179931f,0.977134f,0.113286f, -0.301628f,0.94869f,0.0949132f, -0.473083f,0.874439f,0.107469f, -0.430087f,0.900068f,0.0700241f, -0.294529f,0.954232f,0.0519033f, -0.218538f,0.963065f,0.157309f, -0.194139f,0.967934f,0.159416f, -0.193754f,0.980213f,0.0405318f, -0.162395f,0.97825f,-0.129057f, -0.175319f,0.968352f,-0.177646f, -0.248014f,0.960103f,-0.129196f, -0.28568f,0.95369f,-0.0941428f, -0.21993f,0.968315f,-0.118312f, -0.322085f,0.944206f,-0.068818f, -0.382868f,0.918715f,-0.0968289f, -0.390317f,0.908769f,-0.147618f, -0.269935f,0.914207f,-0.30226f, -0.374262f,0.856519f,-0.355391f, -0.561588f,0.771614f,-0.298716f, -0.563679f,0.781086f,-0.268646f, -0.435393f,0.841674f,-0.319402f, -0.305805f,0.901875f,-0.305133f, -0.0714141f,0.973517f,-0.217175f, --0.0655193f,0.984454f,-0.162963f, -0.0352485f,0.985949f,-0.163286f, -0.0657594f,0.9937f,-0.0907542f, --0.080707f,0.996331f,0.0284757f, --0.168129f,0.985261f,0.0315202f, --0.129479f,0.990858f,0.0378905f, --0.12231f,0.991737f,0.0387141f, --0.178343f,0.98279f,-0.0481504f, -0.273318f,0.858026f,-0.434843f, -0.385091f,0.836836f,-0.389114f, -0.340339f,0.786413f,-0.515483f, -0.318221f,0.733035f,-0.601161f, -0.367621f,0.755443f,-0.542366f, -0.119455f,0.799665f,-0.588444f, --0.0802011f,0.78091f,-0.619473f, --0.0688818f,0.778398f,-0.623981f, -0.0140135f,0.818686f,-0.574071f, -0.0274992f,0.866697f,-0.498077f, -0.177071f,0.88196f,-0.436797f, -0.265217f,0.852958f,-0.449581f, -0.257768f,0.854407f,-0.45116f, -0.248846f,0.837431f,-0.486605f, -0.267639f,0.861569f,-0.431356f, -0.378672f,0.856274f,-0.351288f, -0.453357f,0.836299f,-0.308337f, -0.386424f,0.863215f,-0.324865f, -0.128686f,0.904609f,-0.406352f, --0.130252f,0.895612f,-0.425338f, --0.18148f,0.896143f,-0.40496f, --0.161324f,0.928509f,-0.334435f, --0.0897102f,0.95467f,-0.283825f, -0.0454642f,0.942898f,-0.329963f, -0.150896f,0.947175f,-0.283f, -0.0358472f,0.960013f,-0.277651f, --0.0385071f,0.932002f,-0.360402f, -0.0386813f,0.938718f,-0.342507f, -0.0283698f,0.934985f,-0.353551f, -0.108122f,0.956069f,-0.272473f, -0.00374271f,0.987226f,-0.159284f, --0.196358f,0.979545f,-0.0439957f, --0.00408304f,0.984849f,0.173364f, -0.19648f,0.945984f,0.257896f, -0.360526f,0.896905f,0.256092f, -0.497904f,0.850304f,0.170515f, -0.432778f,0.894142f,0.114953f, -0.285493f,0.945844f,0.154508f, -0.185631f,0.971794f,0.145459f, -0.230083f,0.969236f,0.0874248f, -0.368311f,0.929659f,-0.00905859f, -0.334163f,0.916764f,-0.218814f, -0.186339f,0.940464f,-0.284262f, -0.166871f,0.945707f,-0.278912f, -0.282007f,0.937612f,-0.20336f, -0.24104f,0.942322f,-0.232226f, -0.269154f,0.937876f,-0.218962f, -0.376707f,0.923358f,-0.0741695f, -0.419282f,0.907855f,0.00132882f, -0.443207f,0.893334f,-0.0743096f, -0.437794f,0.862232f,-0.254741f, -0.526311f,0.818963f,-0.228685f, -0.539618f,0.818293f,-0.198015f, -0.495179f,0.844909f,-0.202303f, -0.231134f,0.928947f,-0.289195f, --0.0315579f,0.980647f,-0.193222f, --0.0610949f,0.990009f,-0.12708f, --0.0213691f,0.991115f,-0.131279f, --0.0564833f,0.997988f,-0.0288065f, --0.126885f,0.991868f,-0.0099403f, --0.0683923f,0.994887f,-0.0743097f, --0.0443491f,0.981445f,-0.186542f, --0.106156f,0.962217f,-0.250737f, --0.0540242f,0.978674f,-0.198191f, -0.194886f,0.824241f,-0.531645f, -0.320074f,0.809438f,-0.492303f, -0.464438f,0.773143f,-0.431911f, -0.405677f,0.746051f,-0.528047f, -0.305674f,0.751501f,-0.584645f, -0.130892f,0.809782f,-0.571944f, --0.0644176f,0.819769f,-0.56906f, --0.0714323f,0.833301f,-0.548185f, --0.0643631f,0.853923f,-0.516404f, --0.0107306f,0.851684f,-0.523946f, -0.13746f,0.827954f,-0.543688f, -0.198685f,0.868523f,-0.454084f, -0.246871f,0.881894f,-0.401644f, -0.296117f,0.852853f,-0.430066f, -0.256816f,0.850031f,-0.459883f, -0.314177f,0.830121f,-0.460643f, -0.37334f,0.830673f,-0.413038f, -0.413553f,0.857071f,-0.30725f, -0.158679f,0.931259f,-0.327989f, --0.130088f,0.933779f,-0.333368f, --0.259668f,0.892475f,-0.368866f, --0.237565f,0.924215f,-0.298981f, --0.0871208f,0.968004f,-0.235327f, -0.0797031f,0.982117f,-0.17057f, -0.0461708f,0.99392f,-0.0999594f, -0.0445161f,0.998669f,-0.0260401f, -0.0420509f,0.9919f,-0.119856f, -0.0652827f,0.976809f,-0.203917f, -0.0163117f,0.980129f,-0.197692f, --0.0727832f,0.991022f,-0.112154f, --0.0519999f,0.997388f,0.0501216f, --0.215497f,0.976498f,0.00360735f, --0.144793f,0.989191f,0.023161f, -0.11495f,0.986032f,0.120527f, -0.332155f,0.934954f,0.124633f, -0.520936f,0.843883f,0.128405f, -0.426058f,0.883139f,0.196317f, -0.297882f,0.930389f,0.213643f, -0.255462f,0.962333f,0.0930293f, -0.330201f,0.94382f,-0.0130553f, -0.464814f,0.88236f,-0.0734001f, -0.396624f,0.912293f,-0.10203f, -0.190826f,0.974675f,-0.116592f, -0.186045f,0.970537f,-0.153119f, -0.228366f,0.951236f,-0.207361f, -0.252282f,0.958154f,-0.135261f, -0.163352f,0.984522f,-0.0635096f, -0.214627f,0.974395f,0.066997f, -0.385854f,0.917468f,0.096793f, -0.519216f,0.853803f,0.0378886f, -0.535665f,0.843867f,-0.0308472f, -0.541689f,0.838373f,-0.060851f, -0.563197f,0.822059f,-0.0838289f, -0.51966f,0.848391f,-0.100928f, -0.236369f,0.967062f,-0.0944536f, --0.111969f,0.993037f,-0.0366171f, --0.0968965f,0.995233f,-0.011032f, --0.0970566f,0.995182f,0.013894f, --0.0559363f,0.991458f,0.117821f, --0.00538008f,0.999824f,-0.0179674f, -0.0108998f,0.982438f,-0.186268f, -0.0427996f,0.970253f,-0.238279f, --0.10823f,0.95386f,-0.280066f, --0.196538f,0.942983f,-0.26862f, -0.307908f,0.814842f,-0.491147f, -0.299308f,0.78907f,-0.536455f, -0.435133f,0.777699f,-0.453699f, -0.495126f,0.764316f,-0.413124f, -0.362871f,0.81835f,-0.445676f, -0.0803271f,0.871076f,-0.484534f, --0.110099f,0.885293f,-0.451812f, --0.149245f,0.895891f,-0.418456f, --0.0670569f,0.907151f,-0.415428f, -0.0527044f,0.88691f,-0.458926f, -0.100471f,0.888224f,-0.448291f, -0.121208f,0.922825f,-0.365653f, -0.249787f,0.879883f,-0.404243f, -0.334334f,0.839973f,-0.427396f, -0.283757f,0.852792f,-0.438437f, -0.337422f,0.812854f,-0.474778f, -0.291967f,0.807546f,-0.512469f, -0.269633f,0.862064f,-0.429119f, -0.108203f,0.943068f,-0.314506f, --0.121343f,0.966872f,-0.224575f, --0.202731f,0.95836f,-0.201115f, --0.275106f,0.928104f,-0.25088f, --0.220959f,0.943196f,-0.248108f, --0.0845259f,0.990859f,-0.105139f, --0.0183112f,0.999824f,0.00404228f, -0.0398541f,0.999205f,-0.000234289f, -0.144105f,0.989245f,0.0250549f, -0.0887732f,0.994681f,0.052239f, --0.0385311f,0.993554f,0.106613f, --0.141743f,0.984863f,0.099766f, --0.130913f,0.987043f,0.0927824f, --0.138468f,0.982136f,0.12742f, --0.181593f,0.983362f,-0.00473479f, -0.124018f,0.991703f,-0.0338209f, -0.350394f,0.929846f,-0.112294f, -0.471172f,0.881999f,-0.00866642f, -0.362692f,0.927143f,0.0941279f, -0.321547f,0.934446f,0.153031f, -0.39706f,0.903274f,0.162601f, -0.408629f,0.910814f,0.0586596f, -0.440544f,0.897708f,-0.00641084f, -0.417743f,0.90832f,0.0210971f, -0.223429f,0.972702f,-0.0626924f, -0.239878f,0.966667f,-0.0895152f, -0.326998f,0.934073f,-0.143454f, -0.0984577f,0.955256f,-0.278913f, -0.055814f,0.995135f,-0.081185f, -0.198837f,0.979583f,-0.0296926f, -0.452343f,0.887429f,-0.0886289f, -0.538988f,0.831253f,-0.136052f, -0.534759f,0.840783f,-0.084361f, -0.557911f,0.827063f,-0.0685738f, -0.570718f,0.812258f,-0.120488f, -0.469437f,0.877038f,-0.102147f, -0.179725f,0.982175f,0.0550563f, --0.143773f,0.988083f,0.054972f, --0.0900032f,0.995941f,-0.00107895f, --0.112639f,0.992937f,-0.0372634f, --0.0770822f,0.995012f,-0.0633234f, -0.131283f,0.990073f,-0.0501953f, -0.151552f,0.985928f,-0.0705498f, -0.0547644f,0.990744f,-0.124209f, --0.0889999f,0.992043f,-0.0890439f, --0.225525f,0.966809f,-0.120075f, -0.367815f,0.812209f,-0.4528f, -0.333749f,0.806687f,-0.487716f, -0.350467f,0.776679f,-0.523395f, -0.428661f,0.776887f,-0.461189f, -0.344028f,0.851962f,-0.394722f, -0.0917588f,0.929121f,-0.35821f, --0.151193f,0.922445f,-0.355297f, --0.135334f,0.926245f,-0.351788f, --0.0236046f,0.919658f,-0.39201f, -0.0475929f,0.924342f,-0.378586f, -0.0534474f,0.931533f,-0.359707f, -0.122967f,0.908442f,-0.399514f, -0.333531f,0.836829f,-0.434137f, -0.345062f,0.821786f,-0.45343f, -0.298405f,0.81077f,-0.503594f, -0.369796f,0.765054f,-0.527202f, -0.289381f,0.806079f,-0.516232f, -0.106326f,0.866117f,-0.488402f, --0.0247184f,0.959589f,-0.280318f, --0.247885f,0.952117f,-0.178958f, --0.233969f,0.968302f,-0.0874651f, --0.230973f,0.963517f,-0.135224f, --0.23946f,0.950685f,-0.197121f, --0.148981f,0.968772f,-0.198205f, --0.0244446f,0.976892f,-0.212332f, -0.0214143f,0.979888f,-0.198397f, -0.0179015f,0.996249f,-0.084666f, --0.0584671f,0.995927f,0.0686411f, --0.0472317f,0.986168f,0.158874f, --0.0434315f,0.994906f,0.0909663f, --0.106857f,0.994237f,0.00858694f, --0.103595f,0.993848f,-0.0391609f, --0.0110181f,0.988269f,-0.152323f, -0.194953f,0.947451f,-0.253632f, -0.318956f,0.92262f,-0.216885f, -0.355303f,0.928796f,-0.105349f, -0.319482f,0.947371f,-0.0204796f, -0.274811f,0.961125f,0.0267891f, -0.33758f,0.938163f,0.0767414f, -0.445225f,0.885597f,0.132261f, -0.483843f,0.868855f,0.104815f, -0.473616f,0.877987f,0.069475f, -0.358094f,0.929841f,-0.0846442f, -0.209896f,0.940516f,-0.267156f, -0.398687f,0.89746f,-0.188715f, -0.164362f,0.933368f,-0.319075f, --0.0806345f,0.937721f,-0.337901f, -0.19678f,0.945117f,-0.26083f, -0.467829f,0.857531f,-0.213953f, -0.522616f,0.828828f,-0.199792f, -0.48751f,0.848849f,-0.204424f, -0.559553f,0.806974f,-0.18893f, -0.585339f,0.775984f,-0.235006f, -0.309037f,0.923705f,-0.22642f, -0.0763335f,0.997082f,0.00115348f, --0.0450053f,0.998556f,0.0293498f, --0.0333568f,0.997154f,-0.0676115f, --0.00964185f,0.995848f,-0.0905243f, -0.000956175f,0.96601f,-0.258503f, -0.00169255f,0.940578f,-0.339574f, -0.0710047f,0.988076f,-0.136617f, -0.0666563f,0.995318f,-0.0699874f, --0.123764f,0.98454f,-0.123946f, --0.163961f,0.983022f,-0.0823738f, -0.335205f,0.824436f,-0.456008f, -0.40434f,0.809075f,-0.426506f, -0.410475f,0.791681f,-0.452494f, -0.374361f,0.829194f,-0.41508f, -0.245781f,0.909811f,-0.33442f, -0.0263815f,0.954919f,-0.295693f, --0.125325f,0.941665f,-0.312348f, --0.129375f,0.929134f,-0.346369f, --0.0304152f,0.953686f,-0.299263f, --0.0235504f,0.953092f,-0.301762f, -0.153775f,0.94901f,-0.275197f, -0.274986f,0.871191f,-0.406705f, -0.301999f,0.805469f,-0.509919f, -0.376419f,0.798039f,-0.470576f, -0.361388f,0.809968f,-0.461899f, -0.38255f,0.848875f,-0.364783f, -0.240129f,0.889938f,-0.387747f, --0.0576931f,0.937865f,-0.342172f, --0.263371f,0.95113f,-0.161204f, --0.310954f,0.950327f,-0.0136276f, --0.223147f,0.974756f,-0.00746382f, --0.15809f,0.984734f,-0.0728478f, --0.146587f,0.977645f,-0.150739f, --0.120405f,0.952352f,-0.280228f, -0.00186508f,0.961595f,-0.274467f, --0.0732237f,0.95724f,-0.279876f, --0.12777f,0.973556f,-0.189377f, --0.137722f,0.985013f,-0.103834f, --0.0840689f,0.995964f,-0.0314252f, -0.00572333f,0.997438f,0.0713008f, --0.0203309f,0.999218f,0.033924f, -0.0131655f,0.994107f,-0.107599f, -0.106442f,0.965608f,-0.237214f, -0.156613f,0.948157f,-0.276534f, -0.221784f,0.959186f,-0.175425f, -0.297839f,0.94933f,-0.100322f, -0.237415f,0.96993f,-0.0535752f, -0.206724f,0.977649f,0.0383141f, -0.342833f,0.933108f,0.108513f, -0.413098f,0.906827f,0.0837554f, -0.485601f,0.86482f,0.127586f, -0.517433f,0.850444f,0.0949105f, -0.521609f,0.853001f,-0.0177076f, -0.35462f,0.907818f,-0.223854f, -0.320255f,0.896065f,-0.307417f, -0.254422f,0.945666f,-0.202447f, --0.0420832f,0.95285f,-0.300511f, -0.132146f,0.911038f,-0.390572f, -0.397135f,0.84337f,-0.361954f, -0.530962f,0.805014f,-0.264634f, -0.518015f,0.788476f,-0.331612f, -0.536794f,0.726368f,-0.429234f, -0.499189f,0.748129f,-0.437165f, -0.193048f,0.933972f,-0.300713f, --0.0642143f,0.969885f,-0.234947f, --0.0349143f,0.97216f,-0.231701f, --0.020308f,0.973327f,-0.22852f, -0.0335645f,0.983758f,-0.176336f, -0.162495f,0.963807f,-0.211356f, -0.0549435f,0.960153f,-0.274021f, --0.150243f,0.943756f,-0.294538f, -0.093877f,0.988384f,-0.119518f, --0.0288967f,0.977445f,-0.209205f, --0.228292f,0.925763f,-0.301406f, -0.329933f,0.832357f,-0.445339f, -0.354113f,0.855807f,-0.377092f, -0.402588f,0.885182f,-0.233185f, -0.310305f,0.922327f,-0.23027f, -0.169674f,0.966179f,-0.194188f, -0.0510686f,0.987038f,-0.152145f, --0.0638218f,0.978386f,-0.196689f, --0.116946f,0.960297f,-0.253286f, --0.0788814f,0.945056f,-0.317249f, -0.0429532f,0.937478f,-0.345383f, -0.160798f,0.890341f,-0.425953f, -0.370061f,0.833359f,-0.410569f, -0.405144f,0.796477f,-0.448867f, -0.330775f,0.831238f,-0.446802f, -0.214187f,0.914592f,-0.342995f, -0.302956f,0.933789f,-0.190409f, -0.260411f,0.956162f,-0.13394f, --0.0987797f,0.989363f,-0.106786f, --0.381946f,0.915584f,-0.125788f, --0.356892f,0.930397f,-0.0835967f, --0.219462f,0.974624f,-0.0441002f, --0.0826206f,0.996346f,-0.0216629f, --0.0522166f,0.993096f,-0.10504f, --0.0544454f,0.992373f,-0.110596f, --0.0392289f,0.996233f,-0.0773398f, --0.0738534f,0.995703f,-0.0558676f, --0.126249f,0.987782f,-0.0913672f, --0.191576f,0.965578f,-0.17595f, --0.204819f,0.971278f,-0.121116f, --0.121301f,0.991656f,-0.0436452f, -0.0591737f,0.997785f,0.0303762f, -0.146031f,0.988908f,-0.0271181f, -0.164489f,0.985353f,-0.0449734f, -0.1732f,0.984753f,-0.0162076f, -0.192999f,0.97944f,-0.0587201f, -0.224284f,0.970976f,-0.0830781f, -0.215597f,0.976395f,0.0130766f, -0.11857f,0.99294f,-0.00337615f, -0.283009f,0.956652f,0.0687283f, -0.418445f,0.903636f,0.0913547f, -0.498249f,0.865176f,0.0567366f, -0.572218f,0.818628f,-0.0491444f, -0.584595f,0.798602f,-0.143119f, -0.499999f,0.838004f,-0.218521f, -0.312173f,0.860973f,-0.401589f, -0.169015f,0.918853f,-0.356571f, -0.0805256f,0.94115f,-0.328258f, -0.268694f,0.864193f,-0.42541f, -0.373719f,0.773399f,-0.512044f, -0.442856f,0.749728f,-0.491717f, -0.564815f,0.671761f,-0.479293f, -0.549235f,0.627986f,-0.551338f, -0.305274f,0.788247f,-0.534298f, -0.0146963f,0.910216f,-0.413874f, --0.0347141f,0.920746f,-0.388614f, --0.0142092f,0.918584f,-0.394971f, --0.0593092f,0.944757f,-0.32236f, --0.0129026f,0.951456f,-0.307515f, -0.101136f,0.954598f,-0.280203f, -0.103786f,0.979836f,-0.170731f, --0.130724f,0.946294f,-0.2957f, --0.0475497f,0.951312f,-0.30454f, -0.068843f,0.980898f,-0.181933f, --0.0601749f,0.975587f,-0.21121f, -0.164088f,0.946673f,-0.277283f, -0.219167f,0.958752f,-0.180996f, -0.292116f,0.952214f,-0.0892046f, -0.382294f,0.923975f,-0.0110254f, -0.185963f,0.972429f,-0.140709f, -0.0282036f,0.98507f,-0.16983f, --0.0260978f,0.984942f,-0.170904f, -0.00347731f,0.966818f,-0.255444f, -0.046523f,0.915606f,-0.399376f, -0.121249f,0.881024f,-0.457269f, -0.234655f,0.843553f,-0.483069f, -0.349259f,0.806387f,-0.47724f, -0.352024f,0.817545f,-0.455741f, -0.21f,0.895765f,-0.391796f, -0.123731f,0.946466f,-0.298149f, -0.189246f,0.953263f,-0.235533f, -0.21574f,0.971887f,-0.0943018f, --0.0878709f,0.988681f,-0.12161f, --0.31365f,0.930831f,-0.187554f, --0.370884f,0.90378f,-0.213602f, --0.292833f,0.938489f,-0.182993f, --0.076513f,0.991298f,-0.107116f, --0.0492348f,0.994225f,-0.0953508f, --0.128831f,0.991129f,-0.0326479f, --0.117178f,0.99304f,0.0118732f, --0.0834857f,0.989043f,0.12175f, --0.0124631f,0.991817f,0.127061f, --0.133134f,0.991073f,-0.00703918f, --0.190067f,0.981738f,-0.00811131f, --0.0950662f,0.989352f,-0.110206f, -0.0262188f,0.977376f,-0.209877f, -0.0774906f,0.981033f,-0.177679f, -0.0911686f,0.995787f,-0.00982619f, -0.177517f,0.984043f,0.0121696f, -0.260966f,0.962001f,-0.0803208f, -0.219093f,0.96759f,-0.12557f, -0.15488f,0.986019f,-0.06147f, -0.155325f,0.987507f,-0.0265508f, -0.257438f,0.9633f,-0.0760109f, -0.429699f,0.898131f,-0.0933795f, -0.553938f,0.821258f,-0.136702f, -0.635333f,0.740056f,-0.220611f, -0.590775f,0.752696f,-0.290577f, -0.544721f,0.782975f,-0.300381f, -0.386007f,0.854199f,-0.348343f, -0.159868f,0.903698f,-0.397205f, -0.111475f,0.854344f,-0.507613f, -0.32886f,0.783243f,-0.527619f, -0.428722f,0.729381f,-0.533105f, -0.463071f,0.680849f,-0.567459f, -0.578683f,0.643078f,-0.501575f, -0.498776f,0.750313f,-0.433881f, -0.172367f,0.935224f,-0.309265f, --0.0549105f,0.957697f,-0.282492f, --0.000989137f,0.955961f,-0.293491f, --0.105185f,0.947134f,-0.303107f, --0.108598f,0.951252f,-0.288662f, --0.0192021f,0.937992f,-0.346125f, -0.0434621f,0.947915f,-0.315545f, -0.0658084f,0.965866f,-0.250542f, -0.00168367f,0.969468f,-0.245211f, --0.0752902f,0.953259f,-0.292624f, --0.0406571f,0.962797f,-0.267151f, --0.0486067f,0.969651f,-0.239615f, -0.0419974f,0.993223f,-0.108371f, -0.194169f,0.980548f,-0.0286949f, -0.261981f,0.963651f,-0.0523696f, -0.349136f,0.937066f,-0.00343362f, -0.31121f,0.950026f,0.0244779f, -0.0510089f,0.992585f,-0.110335f, -0.0314098f,0.989653f,-0.140003f, -0.185979f,0.958236f,-0.217244f, -0.136104f,0.898638f,-0.417044f, -0.108771f,0.892335f,-0.438072f, -0.238757f,0.906785f,-0.34747f, -0.373646f,0.87379f,-0.311256f, -0.340425f,0.883999f,-0.320402f, -0.14853f,0.93597f,-0.319217f, -0.0564088f,0.968057f,-0.244304f, -0.0971116f,0.979187f,-0.17822f, -0.12449f,0.986246f,-0.108724f, -0.00791995f,0.999591f,-0.0274806f, --0.236925f,0.964883f,-0.113439f, --0.404549f,0.891486f,-0.203944f, --0.302952f,0.940514f,-0.153798f, --0.187243f,0.970939f,-0.149055f, --0.103813f,0.994585f,-0.00480558f, --0.136945f,0.990579f,0.00047278f, --0.192386f,0.981319f,0.000301484f, --0.157118f,0.980577f,0.117404f, --0.0205849f,0.995936f,0.0876826f, --0.0389376f,0.992928f,0.112147f, --0.205589f,0.977918f,0.0375515f, -0.0799477f,0.995293f,0.0547661f, -0.128711f,0.981689f,-0.140426f, --0.00377139f,0.985264f,-0.170999f, --0.0186288f,0.990563f,-0.135788f, -0.247861f,0.95847f,-0.141069f, -0.335397f,0.913398f,-0.230679f, -0.164127f,0.956335f,-0.241837f, -0.0560549f,0.992155f,-0.111746f, -0.165621f,0.985752f,-0.0293729f, -0.329655f,0.93718f,-0.114108f, -0.47188f,0.859421f,-0.196784f, -0.593068f,0.774119f,-0.22138f, -0.65363f,0.716422f,-0.24394f, -0.606788f,0.760352f,-0.231675f, -0.536399f,0.810894f,-0.23394f, -0.343135f,0.901586f,-0.263439f, -0.295862f,0.930397f,-0.216396f, -0.307346f,0.85762f,-0.412342f, -0.36437f,0.770675f,-0.522776f, -0.48977f,0.726784f,-0.481571f, -0.467664f,0.727396f,-0.50218f, -0.516451f,0.759976f,-0.394608f, -0.369408f,0.883578f,-0.287798f, -0.11272f,0.986131f,-0.121821f, --0.0556185f,0.985996f,-0.157218f, --0.0141506f,0.99059f,-0.13613f, --0.0462718f,0.993931f,-0.099801f, --0.0190733f,0.9801f,-0.197584f, -0.0617351f,0.955747f,-0.287639f, --0.00791345f,0.937814f,-0.347049f, -0.0263533f,0.943249f,-0.331038f, --0.0408223f,0.937006f,-0.34692f, --0.0840519f,0.9495f,-0.302299f, --0.0536227f,0.964498f,-0.25859f, --0.0366453f,0.973297f,-0.226607f, -0.0559372f,0.997556f,-0.0418806f, -0.117658f,0.99199f,-0.0459629f, -0.260816f,0.963552f,0.059517f, -0.265721f,0.95723f,0.114473f, -0.305022f,0.92568f,0.223781f, -0.229311f,0.961539f,0.151192f, -0.0614828f,0.993074f,-0.10012f, -0.279787f,0.947394f,-0.15545f, -0.307005f,0.902601f,-0.301762f, -0.0599313f,0.924785f,-0.375741f, -0.138459f,0.941623f,-0.306881f, -0.380474f,0.890209f,-0.250536f, -0.362157f,0.883362f,-0.297512f, -0.118666f,0.951617f,-0.283449f, --0.0864913f,0.973386f,-0.212226f, -0.0535968f,0.99807f,-0.0313783f, -0.0571748f,0.998014f,0.026449f, --0.0576417f,0.995225f,0.0787756f, --0.164671f,0.983729f,0.0718444f, --0.317398f,0.947117f,0.0472105f, --0.350813f,0.936189f,-0.0219157f, --0.249283f,0.968275f,0.0173648f, --0.166219f,0.983818f,0.0668861f, --0.137263f,0.989074f,0.0537794f, --0.237615f,0.966132f,0.100634f, --0.156805f,0.98112f,0.113207f, -0.0155394f,0.999476f,0.0283817f, --0.0358194f,0.998926f,0.0293752f, --0.187269f,0.982125f,-0.01898f, -0.0856923f,0.996255f,0.0114998f, -0.21812f,0.975918f,0.00295422f, -0.0575266f,0.997525f,-0.0404377f, -0.0557844f,0.976324f,-0.208997f, -0.282723f,0.906166f,-0.314533f, -0.34017f,0.885713f,-0.315906f, -0.0703654f,0.964786f,-0.253451f, --0.0857039f,0.987005f,-0.135924f, -0.161068f,0.982423f,-0.0943491f, -0.439921f,0.879468f,-0.181673f, -0.499341f,0.805071f,-0.320185f, -0.581376f,0.752639f,-0.309089f, -0.634744f,0.735927f,-0.235609f, -0.590228f,0.797974f,-0.121932f, -0.552123f,0.824777f,-0.122079f, -0.403254f,0.893687f,-0.196749f, -0.282279f,0.904426f,-0.319896f, -0.487441f,0.821419f,-0.296095f, -0.471414f,0.771013f,-0.428146f, -0.452383f,0.750947f,-0.48107f, -0.453351f,0.789814f,-0.413117f, -0.426317f,0.829282f,-0.361311f, -0.274227f,0.935292f,-0.223671f, -0.0409647f,0.985686f,-0.16354f, -0.00611451f,0.980211f,-0.19786f, --0.0818346f,0.965065f,-0.248905f, --0.0402149f,0.984168f,-0.172615f, -0.0358772f,0.970818f,-0.237119f, -0.140843f,0.951316f,-0.274156f, -0.0386407f,0.935491f,-0.351232f, -0.02521f,0.945244f,-0.325388f, --0.00704123f,0.966541f,-0.256414f, --0.132543f,0.963814f,-0.231288f, --0.120001f,0.972985f,-0.197233f, --0.125856f,0.970406f,-0.20609f, -0.150068f,0.984139f,0.0946078f, -0.0962514f,0.994035f,0.0512922f, -0.139768f,0.98134f,0.132051f, -0.167943f,0.959948f,0.224265f, -0.248876f,0.931236f,0.266197f, -0.347088f,0.901338f,0.259075f, -0.298327f,0.935934f,0.187161f, -0.410224f,0.911771f,0.0197232f, -0.382392f,0.916875f,-0.11453f, -0.0687189f,0.981224f,-0.180215f, -0.109108f,0.978331f,-0.175964f, -0.423091f,0.889035f,-0.17496f, -0.308023f,0.9305f,-0.198221f, -0.0610242f,0.996399f,-0.0588678f, --0.139679f,0.983461f,-0.1153f, --0.178862f,0.976278f,-0.122024f, --0.0279755f,0.98865f,0.147609f, -0.0175582f,0.984678f,0.173494f, --0.182965f,0.982824f,0.0240987f, --0.334982f,0.934918f,0.117109f, --0.346361f,0.929574f,0.126201f, --0.256073f,0.950373f,0.176686f, --0.14622f,0.975847f,0.162306f, --0.145894f,0.982033f,0.119692f, --0.243091f,0.96438f,0.104295f, --0.119399f,0.991881f,0.0437603f, -0.0792305f,0.996134f,0.0379462f, --0.0234512f,0.999544f,0.0190445f, --0.148416f,0.988869f,0.0105176f, -0.0279419f,0.999576f,0.00824062f, -0.239276f,0.970159f,0.0392311f, -0.182184f,0.979477f,-0.086222f, -0.251919f,0.933495f,-0.255194f, -0.359782f,0.855042f,-0.373444f, -0.260041f,0.87469f,-0.409017f, --0.0332083f,0.931159f,-0.363099f, --0.108678f,0.933514f,-0.341673f, -0.191287f,0.909011f,-0.370282f, -0.516055f,0.783319f,-0.346553f, -0.557568f,0.726461f,-0.401711f, -0.511814f,0.738467f,-0.438991f, -0.509794f,0.789775f,-0.341125f, -0.522098f,0.819729f,-0.235496f, -0.54438f,0.815602f,-0.196071f, -0.540927f,0.823066f,-0.173089f, -0.36892f,0.838043f,-0.401972f, -0.461826f,0.790802f,-0.401684f, -0.549439f,0.728653f,-0.408878f, -0.455853f,0.753497f,-0.473751f, -0.389397f,0.799772f,-0.456875f, -0.293181f,0.868874f,-0.398878f, -0.155589f,0.965139f,-0.210473f, -0.031565f,0.984349f,-0.173382f, -0.0970165f,0.970686f,-0.219901f, --0.0352366f,0.943342f,-0.329946f, --0.0636858f,0.931929f,-0.357006f, -0.111555f,0.924517f,-0.364451f, -0.180963f,0.908751f,-0.376064f, -0.0582409f,0.924666f,-0.376299f, --0.091325f,0.934476f,-0.344113f, --0.148498f,0.963415f,-0.223113f, --0.170646f,0.976481f,-0.131776f, --0.0961794f,0.980781f,-0.169761f, --0.06221f,0.973089f,-0.221874f, -0.206636f,0.934831f,0.288777f, -0.0869406f,0.963592f,0.252847f, -0.0799701f,0.959241f,0.271038f, -0.160525f,0.963414f,0.21463f, -0.255681f,0.955661f,0.146082f, -0.323027f,0.93103f,0.169812f, -0.330118f,0.920313f,0.209873f, -0.447578f,0.884885f,0.12904f, -0.467368f,0.874534f,0.129448f, -0.130174f,0.988207f,0.0806387f, -0.145402f,0.989036f,-0.0258009f, -0.425216f,0.898822f,-0.106345f, -0.205136f,0.977985f,-0.0382811f, --0.0258123f,0.995757f,0.0883314f, --0.00518813f,0.996132f,0.0877124f, --0.192412f,0.980974f,0.0258233f, --0.196114f,0.979963f,0.0348015f, -0.0217983f,0.995754f,0.0894399f, --0.10216f,0.980256f,0.169296f, --0.384424f,0.908881f,0.161723f, --0.367551f,0.91996f,0.136309f, --0.285788f,0.948719f,0.135118f, --0.171256f,0.972185f,0.159771f, --0.0605854f,0.969905f,0.235826f, --0.167372f,0.981266f,0.0954134f, --0.0977838f,0.994994f,0.0206294f, -0.0451608f,0.997867f,0.0471292f, --0.0136124f,0.997411f,0.0706177f, --0.158818f,0.986831f,0.0306748f, -0.0267005f,0.99957f,0.0121357f, -0.289361f,0.957076f,-0.0166175f, -0.336393f,0.939976f,-0.0573177f, -0.390118f,0.913466f,-0.115702f, -0.445853f,0.875576f,-0.185959f, -0.293335f,0.914816f,-0.277609f, --0.00739937f,0.915657f,-0.401893f, -0.00533725f,0.872492f,-0.488599f, -0.197734f,0.788261f,-0.582705f, -0.43334f,0.722538f,-0.53866f, -0.548408f,0.706281f,-0.447678f, -0.484095f,0.751007f,-0.449045f, -0.458828f,0.77804f,-0.429103f, -0.441245f,0.787203f,-0.430829f, -0.474553f,0.805707f,-0.354451f, -0.550933f,0.789486f,-0.270526f, -0.502032f,0.792798f,-0.345594f, -0.478273f,0.764634f,-0.43196f, -0.556872f,0.730832f,-0.394687f, -0.471855f,0.788619f,-0.394251f, -0.354943f,0.841801f,-0.406677f, -0.154029f,0.899791f,-0.40823f, -0.0155123f,0.938951f,-0.343701f, -0.0497714f,0.948037f,-0.314243f, -0.154285f,0.935402f,-0.31815f, -0.101927f,0.920411f,-0.377432f, --0.0203862f,0.864666f,-0.501933f, -0.070179f,0.866621f,-0.494007f, -0.100294f,0.910674f,-0.400766f, -0.000402101f,0.968295f,-0.249809f, --0.128961f,0.971456f,-0.199105f, --0.199723f,0.946207f,-0.254564f, --0.134113f,0.940975f,-0.310772f, --0.0316747f,0.927512f,-0.372449f, -0.0302907f,0.938917f,-0.342807f, -0.218976f,0.899032f,0.379198f, -0.139079f,0.919337f,0.368072f, -0.135024f,0.957047f,0.256573f, -0.313512f,0.936875f,0.154838f, -0.29644f,0.95504f,0.00476296f, -0.279277f,0.959996f,0.0202722f, -0.3625f,0.931007f,0.0426625f, -0.472022f,0.881367f,0.0196857f, -0.429567f,0.887347f,0.167594f, -0.224991f,0.963227f,0.146879f, -0.296133f,0.954919f,-0.0208476f, -0.415966f,0.902166f,-0.114319f, -0.183129f,0.982743f,0.0260829f, --0.0925135f,0.995706f,-0.00325499f, --0.0437431f,0.995986f,0.0780946f, --0.179713f,0.977607f,0.109486f, --0.141385f,0.986823f,0.0786845f, --0.085949f,0.993479f,0.0749198f, --0.233157f,0.944593f,0.231044f, --0.345216f,0.897121f,0.275681f, --0.266518f,0.944857f,0.190296f, --0.236509f,0.971079f,0.032684f, --0.255527f,0.96653f,-0.0229239f, --0.0941044f,0.991025f,0.0949427f, --0.0715158f,0.990946f,0.113625f, --0.0636481f,0.988651f,0.136079f, -0.0130078f,0.992968f,0.11767f, -0.0194535f,0.99321f,0.114698f, --0.0733749f,0.997304f,0.000320173f, -0.0745089f,0.991949f,-0.102398f, -0.316045f,0.940065f,-0.128038f, -0.302503f,0.936628f,-0.176692f, -0.365578f,0.917629f,-0.155918f, -0.474055f,0.875706f,-0.091714f, -0.462666f,0.882661f,-0.0827679f, -0.197672f,0.918824f,-0.341598f, -0.1211f,0.851979f,-0.509379f, -0.340562f,0.776445f,-0.530237f, -0.411588f,0.704014f,-0.578756f, -0.454493f,0.713166f,-0.533695f, -0.463114f,0.742631f,-0.483761f, -0.44079f,0.754688f,-0.485953f, -0.400302f,0.772025f,-0.493696f, -0.38659f,0.783016f,-0.487272f, -0.457033f,0.766931f,-0.450487f, -0.547084f,0.759757f,-0.351382f, -0.508566f,0.782012f,-0.360303f, -0.54699f,0.792915f,-0.268492f, -0.489855f,0.837224f,-0.243102f, -0.350988f,0.891534f,-0.286312f, -0.195385f,0.947495f,-0.253137f, -0.0709694f,0.939176f,-0.336023f, -0.0288377f,0.903143f,-0.42837f, -0.128806f,0.91498f,-0.382389f, -0.209123f,0.895775f,-0.392243f, -0.0981301f,0.852621f,-0.513233f, --0.0414306f,0.841347f,-0.538906f, --0.0951984f,0.922571f,-0.373899f, --0.157973f,0.963972f,-0.214014f, --0.107909f,0.978829f,-0.173926f, --0.0713291f,0.969594f,-0.234092f, -0.0141898f,0.950434f,-0.310602f, --0.0202439f,0.895649f,-0.4443f, --0.114151f,0.867225f,-0.484655f, -0.0955354f,0.969912f,0.223927f, -0.218114f,0.913651f,0.343028f, -0.223104f,0.958808f,0.175816f, -0.39761f,0.915149f,0.0663907f, -0.332649f,0.940641f,-0.0673772f, -0.280455f,0.956871f,-0.0757854f, -0.359446f,0.926985f,-0.107225f, -0.369482f,0.924827f,-0.0904272f, -0.410746f,0.887001f,0.210991f, -0.335823f,0.922126f,0.192112f, -0.395669f,0.917218f,-0.0464346f, -0.353697f,0.926083f,-0.131407f, -0.179534f,0.981887f,0.0605388f, --0.13479f,0.99057f,-0.0245515f, --0.0725996f,0.990136f,0.119831f, --0.160567f,0.981095f,0.108036f, --0.173547f,0.983858f,0.0436428f, --0.151709f,0.976244f,0.154697f, --0.302597f,0.914896f,0.267208f, --0.328732f,0.906446f,0.265123f, --0.132663f,0.960039f,0.246424f, --0.138673f,0.989957f,0.0274833f, --0.234284f,0.968151f,-0.0882923f, --0.176173f,0.979923f,-0.0933525f, --0.138089f,0.990412f,-0.00402308f, --0.0957719f,0.981754f,0.164279f, -0.0343111f,0.979592f,0.198047f, -0.0638942f,0.984862f,0.161133f, -0.0719687f,0.995312f,0.0646062f, -0.0847007f,0.982914f,-0.163422f, -0.363247f,0.926697f,-0.0963506f, -0.36667f,0.908341f,-0.201173f, -0.337169f,0.882657f,-0.327465f, -0.394509f,0.879929f,-0.264742f, -0.48646f,0.864989f,-0.123088f, -0.417344f,0.883151f,-0.21417f, -0.20086f,0.830272f,-0.519907f, -0.38892f,0.767179f,-0.510077f, -0.449414f,0.718324f,-0.531072f, -0.423477f,0.726204f,-0.541567f, -0.422958f,0.74196f,-0.520194f, -0.433204f,0.760712f,-0.483374f, -0.409051f,0.775415f,-0.481049f, -0.416047f,0.762178f,-0.495973f, -0.412818f,0.728929f,-0.546117f, -0.422596f,0.756339f,-0.499363f, -0.473538f,0.806572f,-0.353841f, -0.474731f,0.838081f,-0.268794f, -0.539079f,0.832631f,-0.126962f, -0.311124f,0.910644f,-0.271898f, -0.195648f,0.962321f,-0.18884f, -0.177086f,0.961235f,-0.211349f, -0.0559264f,0.927874f,-0.368677f, -0.121016f,0.928529f,-0.350982f, -0.256538f,0.895264f,-0.364269f, -0.222607f,0.876269f,-0.427317f, --0.106542f,0.82471f,-0.55543f, --0.245122f,0.890501f,-0.383305f, --0.209725f,0.956698f,-0.201855f, --0.0624605f,0.97406f,-0.2175f, --0.0812465f,0.947824f,-0.308266f, -0.0649824f,0.972455f,-0.223851f, -0.119957f,0.950206f,-0.287609f, --0.0414767f,0.905483f,-0.422351f, -}; - -btScalar Landscape03Tex[] = { -0.507813f,0.5f, -0.507813f,0.492188f, -0.515625f,0.5f, -0.515625f,0.492188f, -0.523438f,0.5f, -0.523438f,0.492188f, -0.53125f,0.5f, -0.53125f,0.492188f, -0.539063f,0.5f, -0.539063f,0.492188f, -0.546875f,0.5f, -0.546875f,0.492188f, -0.554688f,0.5f, -0.554688f,0.492188f, -0.5625f,0.5f, -0.5625f,0.492188f, -0.570313f,0.5f, -0.570313f,0.492188f, -0.578125f,0.5f, -0.578125f,0.492188f, -0.585938f,0.5f, -0.585938f,0.492188f, -0.59375f,0.5f, -0.59375f,0.492188f, -0.601563f,0.5f, -0.601563f,0.492188f, -0.609375f,0.5f, -0.609375f,0.492188f, -0.617188f,0.5f, -0.617188f,0.492188f, -0.625f,0.5f, -0.625f,0.492188f, -0.632813f,0.5f, -0.632813f,0.492188f, -0.640625f,0.5f, -0.640625f,0.492188f, -0.648438f,0.5f, -0.648438f,0.492188f, -0.65625f,0.5f, -0.65625f,0.492188f, -0.664063f,0.5f, -0.664063f,0.492188f, -0.671875f,0.5f, -0.671875f,0.492188f, -0.679688f,0.5f, -0.679688f,0.492188f, -0.6875f,0.5f, -0.6875f,0.492188f, -0.695313f,0.5f, -0.695313f,0.492188f, -0.703125f,0.5f, -0.703125f,0.492188f, -0.710938f,0.5f, -0.710938f,0.492188f, -0.71875f,0.5f, -0.71875f,0.492188f, -0.726563f,0.5f, -0.726563f,0.492188f, -0.734375f,0.5f, -0.734375f,0.492188f, -0.742188f,0.5f, -0.742188f,0.492188f, -0.75f,0.5f, -0.75f,0.492188f, -0.757813f,0.5f, -0.757813f,0.492188f, -0.765625f,0.5f, -0.765625f,0.492188f, -0.773438f,0.5f, -0.773438f,0.492188f, -0.78125f,0.5f, -0.78125f,0.492188f, -0.789063f,0.5f, -0.789063f,0.492188f, -0.796875f,0.5f, -0.796875f,0.492188f, -0.804688f,0.5f, -0.804688f,0.492188f, -0.8125f,0.5f, -0.8125f,0.492188f, -0.820313f,0.5f, -0.820313f,0.492188f, -0.828125f,0.5f, -0.828125f,0.492188f, -0.835938f,0.5f, -0.835938f,0.492188f, -0.84375f,0.5f, -0.84375f,0.492188f, -0.851563f,0.5f, -0.851563f,0.492188f, -0.859375f,0.5f, -0.859375f,0.492188f, -0.867188f,0.5f, -0.867188f,0.492188f, -0.875f,0.5f, -0.875f,0.492188f, -0.882813f,0.5f, -0.882813f,0.492188f, -0.890625f,0.5f, -0.890625f,0.492188f, -0.898438f,0.5f, -0.898438f,0.492188f, -0.90625f,0.5f, -0.90625f,0.492188f, -0.914063f,0.5f, -0.914063f,0.492188f, -0.921875f,0.5f, -0.921875f,0.492188f, -0.929688f,0.5f, -0.929688f,0.492188f, -0.9375f,0.5f, -0.9375f,0.492188f, -0.945313f,0.5f, -0.945313f,0.492188f, -0.953125f,0.5f, -0.953125f,0.492188f, -0.960938f,0.5f, -0.960938f,0.492188f, -0.96875f,0.5f, -0.96875f,0.492188f, -0.976563f,0.5f, -0.976563f,0.492188f, -0.984375f,0.5f, -0.984375f,0.492188f, -0.992188f,0.5f, -0.992188f,0.492188f, -1.0f,0.5f, -1.0f,0.492188f, -0.507813f,0.507813f, -0.515625f,0.507813f, -0.523438f,0.507813f, -0.53125f,0.507813f, -0.539063f,0.507813f, -0.546875f,0.507813f, -0.554688f,0.507813f, -0.5625f,0.507813f, -0.570313f,0.507813f, -0.578125f,0.507813f, -0.585938f,0.507813f, -0.59375f,0.507813f, -0.601563f,0.507813f, -0.609375f,0.507813f, -0.617188f,0.507813f, -0.625f,0.507813f, -0.632813f,0.507813f, -0.640625f,0.507813f, -0.648438f,0.507813f, -0.65625f,0.507813f, -0.664063f,0.507813f, -0.671875f,0.507813f, -0.679688f,0.507813f, -0.6875f,0.507813f, -0.695313f,0.507813f, -0.703125f,0.507813f, -0.710938f,0.507813f, -0.71875f,0.507813f, -0.726563f,0.507813f, -0.734375f,0.507813f, -0.742188f,0.507813f, -0.75f,0.507813f, -0.757813f,0.507813f, -0.765625f,0.507813f, -0.773438f,0.507813f, -0.78125f,0.507813f, -0.789063f,0.507813f, -0.796875f,0.507813f, -0.804688f,0.507813f, -0.8125f,0.507813f, -0.820313f,0.507813f, -0.828125f,0.507813f, -0.835938f,0.507813f, -0.84375f,0.507813f, -0.851563f,0.507813f, -0.859375f,0.507813f, -0.867188f,0.507813f, -0.875f,0.507813f, -0.882813f,0.507813f, -0.890625f,0.507813f, -0.898438f,0.507813f, -0.90625f,0.507813f, -0.914063f,0.507813f, -0.921875f,0.507813f, -0.929688f,0.507813f, -0.9375f,0.507813f, -0.945313f,0.507813f, -0.953125f,0.507813f, -0.960938f,0.507813f, -0.96875f,0.507813f, -0.976563f,0.507813f, -0.984375f,0.507813f, -0.992188f,0.507813f, -1.0f,0.507813f, -0.507813f,0.515625f, -0.515625f,0.515625f, -0.523438f,0.515625f, -0.53125f,0.515625f, -0.539063f,0.515625f, -0.546875f,0.515625f, -0.554688f,0.515625f, -0.5625f,0.515625f, -0.570313f,0.515625f, -0.578125f,0.515625f, -0.585938f,0.515625f, -0.59375f,0.515625f, -0.601563f,0.515625f, -0.609375f,0.515625f, -0.617188f,0.515625f, -0.625f,0.515625f, -0.632813f,0.515625f, -0.640625f,0.515625f, -0.648438f,0.515625f, -0.65625f,0.515625f, -0.664063f,0.515625f, -0.671875f,0.515625f, -0.679688f,0.515625f, -0.6875f,0.515625f, -0.695313f,0.515625f, -0.703125f,0.515625f, -0.710938f,0.515625f, -0.71875f,0.515625f, -0.726563f,0.515625f, -0.734375f,0.515625f, -0.742188f,0.515625f, -0.75f,0.515625f, -0.757813f,0.515625f, -0.765625f,0.515625f, -0.773438f,0.515625f, -0.78125f,0.515625f, -0.789063f,0.515625f, -0.796875f,0.515625f, -0.804688f,0.515625f, -0.8125f,0.515625f, -0.820313f,0.515625f, -0.828125f,0.515625f, -0.835938f,0.515625f, -0.84375f,0.515625f, -0.851563f,0.515625f, -0.859375f,0.515625f, -0.867188f,0.515625f, -0.875f,0.515625f, -0.882813f,0.515625f, -0.890625f,0.515625f, -0.898438f,0.515625f, -0.90625f,0.515625f, -0.914063f,0.515625f, -0.921875f,0.515625f, -0.929688f,0.515625f, -0.9375f,0.515625f, -0.945313f,0.515625f, -0.953125f,0.515625f, -0.960938f,0.515625f, -0.96875f,0.515625f, -0.976563f,0.515625f, -0.984375f,0.515625f, -0.992188f,0.515625f, -1.0f,0.515625f, -0.507813f,0.523438f, -0.515625f,0.523438f, -0.523438f,0.523438f, -0.53125f,0.523438f, -0.539063f,0.523438f, -0.546875f,0.523438f, -0.554688f,0.523438f, -0.5625f,0.523438f, -0.570313f,0.523438f, -0.578125f,0.523438f, -0.585938f,0.523438f, -0.59375f,0.523438f, -0.601563f,0.523438f, -0.609375f,0.523438f, -0.617188f,0.523438f, -0.625f,0.523438f, -0.632813f,0.523438f, -0.640625f,0.523438f, -0.648438f,0.523438f, -0.65625f,0.523438f, -0.664063f,0.523438f, -0.671875f,0.523438f, -0.679688f,0.523438f, -0.6875f,0.523438f, -0.695313f,0.523438f, -0.703125f,0.523438f, -0.710938f,0.523438f, -0.71875f,0.523438f, -0.726563f,0.523438f, -0.734375f,0.523438f, -0.742188f,0.523438f, -0.75f,0.523438f, -0.757813f,0.523438f, -0.765625f,0.523438f, -0.773438f,0.523438f, -0.78125f,0.523438f, -0.789063f,0.523438f, -0.796875f,0.523438f, -0.804688f,0.523438f, -0.8125f,0.523438f, -0.820313f,0.523438f, -0.828125f,0.523438f, -0.835938f,0.523438f, -0.84375f,0.523438f, -0.851563f,0.523438f, -0.859375f,0.523438f, -0.867188f,0.523438f, -0.875f,0.523438f, -0.882813f,0.523438f, -0.890625f,0.523438f, -0.898438f,0.523438f, -0.90625f,0.523438f, -0.914063f,0.523438f, -0.921875f,0.523438f, -0.929688f,0.523438f, -0.9375f,0.523438f, -0.945313f,0.523438f, -0.953125f,0.523438f, -0.960938f,0.523438f, -0.96875f,0.523438f, -0.976563f,0.523438f, -0.984375f,0.523438f, -0.992188f,0.523438f, -1.0f,0.523438f, -0.507813f,0.53125f, -0.515625f,0.53125f, -0.523438f,0.53125f, -0.53125f,0.53125f, -0.539063f,0.53125f, -0.546875f,0.53125f, -0.554688f,0.53125f, -0.5625f,0.53125f, -0.570313f,0.53125f, -0.578125f,0.53125f, -0.585938f,0.53125f, -0.59375f,0.53125f, -0.601563f,0.53125f, -0.609375f,0.53125f, -0.617188f,0.53125f, -0.625f,0.53125f, -0.632813f,0.53125f, -0.640625f,0.53125f, -0.648438f,0.53125f, -0.65625f,0.53125f, -0.664063f,0.53125f, -0.671875f,0.53125f, -0.679688f,0.53125f, -0.6875f,0.53125f, -0.695313f,0.53125f, -0.703125f,0.53125f, -0.710938f,0.53125f, -0.71875f,0.53125f, -0.726563f,0.53125f, -0.734375f,0.53125f, -0.742188f,0.53125f, -0.75f,0.53125f, -0.757813f,0.53125f, -0.765625f,0.53125f, -0.773438f,0.53125f, -0.78125f,0.53125f, -0.789063f,0.53125f, -0.796875f,0.53125f, -0.804688f,0.53125f, -0.8125f,0.53125f, -0.820313f,0.53125f, -0.828125f,0.53125f, -0.835938f,0.53125f, -0.84375f,0.53125f, -0.851563f,0.53125f, -0.859375f,0.53125f, -0.867188f,0.53125f, -0.875f,0.53125f, -0.882813f,0.53125f, -0.890625f,0.53125f, -0.898438f,0.53125f, -0.90625f,0.53125f, -0.914063f,0.53125f, -0.921875f,0.53125f, -0.929688f,0.53125f, -0.9375f,0.53125f, -0.945313f,0.53125f, -0.953125f,0.53125f, -0.960938f,0.53125f, -0.96875f,0.53125f, -0.976563f,0.53125f, -0.984375f,0.53125f, -0.992188f,0.53125f, -1.0f,0.53125f, -0.507813f,0.539063f, -0.515625f,0.539063f, -0.523438f,0.539063f, -0.53125f,0.539063f, -0.539063f,0.539063f, -0.546875f,0.539063f, -0.554688f,0.539063f, -0.5625f,0.539063f, -0.570313f,0.539063f, -0.578125f,0.539063f, -0.585938f,0.539063f, -0.59375f,0.539063f, -0.601563f,0.539063f, -0.609375f,0.539063f, -0.617188f,0.539063f, -0.625f,0.539063f, -0.632813f,0.539063f, -0.640625f,0.539063f, -0.648438f,0.539063f, -0.65625f,0.539063f, -0.664063f,0.539063f, -0.671875f,0.539063f, -0.679688f,0.539063f, -0.6875f,0.539063f, -0.695313f,0.539063f, -0.703125f,0.539063f, -0.710938f,0.539063f, -0.71875f,0.539063f, -0.726563f,0.539063f, -0.734375f,0.539063f, -0.742188f,0.539063f, -0.75f,0.539063f, -0.757813f,0.539063f, -0.765625f,0.539063f, -0.773438f,0.539063f, -0.78125f,0.539063f, -0.789063f,0.539063f, -0.796875f,0.539063f, -0.804688f,0.539063f, -0.8125f,0.539063f, -0.820313f,0.539063f, -0.828125f,0.539063f, -0.835938f,0.539063f, -0.84375f,0.539063f, -0.851563f,0.539063f, -0.859375f,0.539063f, -0.867188f,0.539063f, -0.875f,0.539063f, -0.882813f,0.539063f, -0.890625f,0.539063f, -0.898438f,0.539063f, -0.90625f,0.539063f, -0.914063f,0.539063f, -0.921875f,0.539063f, -0.929688f,0.539063f, -0.9375f,0.539063f, -0.945313f,0.539063f, -0.953125f,0.539063f, -0.960938f,0.539063f, -0.96875f,0.539063f, -0.976563f,0.539063f, -0.984375f,0.539063f, -0.992188f,0.539063f, -1.0f,0.539063f, -0.507813f,0.546875f, -0.515625f,0.546875f, -0.523438f,0.546875f, -0.53125f,0.546875f, -0.539063f,0.546875f, -0.546875f,0.546875f, -0.554688f,0.546875f, -0.5625f,0.546875f, -0.570313f,0.546875f, -0.578125f,0.546875f, -0.585938f,0.546875f, -0.59375f,0.546875f, -0.601563f,0.546875f, -0.609375f,0.546875f, -0.617188f,0.546875f, -0.625f,0.546875f, -0.632813f,0.546875f, -0.640625f,0.546875f, -0.648438f,0.546875f, -0.65625f,0.546875f, -0.664063f,0.546875f, -0.671875f,0.546875f, -0.679688f,0.546875f, -0.6875f,0.546875f, -0.695313f,0.546875f, -0.703125f,0.546875f, -0.710938f,0.546875f, -0.71875f,0.546875f, -0.726563f,0.546875f, -0.734375f,0.546875f, -0.742188f,0.546875f, -0.75f,0.546875f, -0.757813f,0.546875f, -0.765625f,0.546875f, -0.773438f,0.546875f, -0.78125f,0.546875f, -0.789063f,0.546875f, -0.796875f,0.546875f, -0.804688f,0.546875f, -0.8125f,0.546875f, -0.820313f,0.546875f, -0.828125f,0.546875f, -0.835938f,0.546875f, -0.84375f,0.546875f, -0.851563f,0.546875f, -0.859375f,0.546875f, -0.867188f,0.546875f, -0.875f,0.546875f, -0.882813f,0.546875f, -0.890625f,0.546875f, -0.898438f,0.546875f, -0.90625f,0.546875f, -0.914063f,0.546875f, -0.921875f,0.546875f, -0.929688f,0.546875f, -0.9375f,0.546875f, -0.945313f,0.546875f, -0.953125f,0.546875f, -0.960938f,0.546875f, -0.96875f,0.546875f, -0.976563f,0.546875f, -0.984375f,0.546875f, -0.992188f,0.546875f, -1.0f,0.546875f, -0.507813f,0.554688f, -0.515625f,0.554688f, -0.523438f,0.554688f, -0.53125f,0.554688f, -0.539063f,0.554688f, -0.546875f,0.554688f, -0.554688f,0.554688f, -0.5625f,0.554688f, -0.570313f,0.554688f, -0.578125f,0.554688f, -0.585938f,0.554688f, -0.59375f,0.554688f, -0.601563f,0.554688f, -0.609375f,0.554688f, -0.617188f,0.554688f, -0.625f,0.554688f, -0.632813f,0.554688f, -0.640625f,0.554688f, -0.648438f,0.554688f, -0.65625f,0.554688f, -0.664063f,0.554688f, -0.671875f,0.554688f, -0.679688f,0.554688f, -0.6875f,0.554688f, -0.695313f,0.554688f, -0.703125f,0.554688f, -0.710938f,0.554688f, -0.71875f,0.554688f, -0.726563f,0.554688f, -0.734375f,0.554688f, -0.742188f,0.554688f, -0.75f,0.554688f, -0.757813f,0.554688f, -0.765625f,0.554688f, -0.773438f,0.554688f, -0.78125f,0.554688f, -0.789063f,0.554688f, -0.796875f,0.554688f, -0.804688f,0.554688f, -0.8125f,0.554688f, -0.820313f,0.554688f, -0.828125f,0.554688f, -0.835938f,0.554688f, -0.84375f,0.554688f, -0.851563f,0.554688f, -0.859375f,0.554688f, -0.867188f,0.554688f, -0.875f,0.554688f, -0.882813f,0.554688f, -0.890625f,0.554688f, -0.898438f,0.554688f, -0.90625f,0.554688f, -0.914063f,0.554688f, -0.921875f,0.554688f, -0.929688f,0.554688f, -0.9375f,0.554688f, -0.945313f,0.554688f, -0.953125f,0.554688f, -0.960938f,0.554688f, -0.96875f,0.554688f, -0.976563f,0.554688f, -0.984375f,0.554688f, -0.992188f,0.554688f, -1.0f,0.554688f, -0.507813f,0.5625f, -0.515625f,0.5625f, -0.523438f,0.5625f, -0.53125f,0.5625f, -0.539063f,0.5625f, -0.546875f,0.5625f, -0.554688f,0.5625f, -0.5625f,0.5625f, -0.570313f,0.5625f, -0.578125f,0.5625f, -0.585938f,0.5625f, -0.59375f,0.5625f, -0.601563f,0.5625f, -0.609375f,0.5625f, -0.617188f,0.5625f, -0.625f,0.5625f, -0.632813f,0.5625f, -0.640625f,0.5625f, -0.648438f,0.5625f, -0.65625f,0.5625f, -0.664063f,0.5625f, -0.671875f,0.5625f, -0.679688f,0.5625f, -0.6875f,0.5625f, -0.695313f,0.5625f, -0.703125f,0.5625f, -0.710938f,0.5625f, -0.71875f,0.5625f, -0.726563f,0.5625f, -0.734375f,0.5625f, -0.742188f,0.5625f, -0.75f,0.5625f, -0.757813f,0.5625f, -0.765625f,0.5625f, -0.773438f,0.5625f, -0.78125f,0.5625f, -0.789063f,0.5625f, -0.796875f,0.5625f, -0.804688f,0.5625f, -0.8125f,0.5625f, -0.820313f,0.5625f, -0.828125f,0.5625f, -0.835938f,0.5625f, -0.84375f,0.5625f, -0.851563f,0.5625f, -0.859375f,0.5625f, -0.867188f,0.5625f, -0.875f,0.5625f, -0.882813f,0.5625f, -0.890625f,0.5625f, -0.898438f,0.5625f, -0.90625f,0.5625f, -0.914063f,0.5625f, -0.921875f,0.5625f, -0.929688f,0.5625f, -0.9375f,0.5625f, -0.945313f,0.5625f, -0.953125f,0.5625f, -0.960938f,0.5625f, -0.96875f,0.5625f, -0.976563f,0.5625f, -0.984375f,0.5625f, -0.992188f,0.5625f, -1.0f,0.5625f, -0.507813f,0.570313f, -0.515625f,0.570313f, -0.523438f,0.570313f, -0.53125f,0.570313f, -0.539063f,0.570313f, -0.546875f,0.570313f, -0.554688f,0.570313f, -0.5625f,0.570313f, -0.570313f,0.570313f, -0.578125f,0.570313f, -0.585938f,0.570313f, -0.59375f,0.570313f, -0.601563f,0.570313f, -0.609375f,0.570313f, -0.617188f,0.570313f, -0.625f,0.570313f, -0.632813f,0.570313f, -0.640625f,0.570313f, -0.648438f,0.570313f, -0.65625f,0.570313f, -0.664063f,0.570313f, -0.671875f,0.570313f, -0.679688f,0.570313f, -0.6875f,0.570313f, -0.695313f,0.570313f, -0.703125f,0.570313f, -0.710938f,0.570313f, -0.71875f,0.570313f, -0.726563f,0.570313f, -0.734375f,0.570313f, -0.742188f,0.570313f, -0.75f,0.570313f, -0.757813f,0.570313f, -0.765625f,0.570313f, -0.773438f,0.570313f, -0.78125f,0.570313f, -0.789063f,0.570313f, -0.796875f,0.570313f, -0.804688f,0.570313f, -0.8125f,0.570313f, -0.820313f,0.570313f, -0.828125f,0.570313f, -0.835938f,0.570313f, -0.84375f,0.570313f, -0.851563f,0.570313f, -0.859375f,0.570313f, -0.867188f,0.570313f, -0.875f,0.570313f, -0.882813f,0.570313f, -0.890625f,0.570313f, -0.898438f,0.570313f, -0.90625f,0.570313f, -0.914063f,0.570313f, -0.921875f,0.570313f, -0.929688f,0.570313f, -0.9375f,0.570313f, -0.945313f,0.570313f, -0.953125f,0.570313f, -0.960938f,0.570313f, -0.96875f,0.570313f, -0.976563f,0.570313f, -0.984375f,0.570313f, -0.992188f,0.570313f, -1.0f,0.570313f, -0.507813f,0.578125f, -0.515625f,0.578125f, -0.523438f,0.578125f, -0.53125f,0.578125f, -0.539063f,0.578125f, -0.546875f,0.578125f, -0.554688f,0.578125f, -0.5625f,0.578125f, -0.570313f,0.578125f, -0.578125f,0.578125f, -0.585938f,0.578125f, -0.59375f,0.578125f, -0.601563f,0.578125f, -0.609375f,0.578125f, -0.617188f,0.578125f, -0.625f,0.578125f, -0.632813f,0.578125f, -0.640625f,0.578125f, -0.648438f,0.578125f, -0.65625f,0.578125f, -0.664063f,0.578125f, -0.671875f,0.578125f, -0.679688f,0.578125f, -0.6875f,0.578125f, -0.695313f,0.578125f, -0.703125f,0.578125f, -0.710938f,0.578125f, -0.71875f,0.578125f, -0.726563f,0.578125f, -0.734375f,0.578125f, -0.742188f,0.578125f, -0.75f,0.578125f, -0.757813f,0.578125f, -0.765625f,0.578125f, -0.773438f,0.578125f, -0.78125f,0.578125f, -0.789063f,0.578125f, -0.796875f,0.578125f, -0.804688f,0.578125f, -0.8125f,0.578125f, -0.820313f,0.578125f, -0.828125f,0.578125f, -0.835938f,0.578125f, -0.84375f,0.578125f, -0.851563f,0.578125f, -0.859375f,0.578125f, -0.867188f,0.578125f, -0.875f,0.578125f, -0.882813f,0.578125f, -0.890625f,0.578125f, -0.898438f,0.578125f, -0.90625f,0.578125f, -0.914063f,0.578125f, -0.921875f,0.578125f, -0.929688f,0.578125f, -0.9375f,0.578125f, -0.945313f,0.578125f, -0.953125f,0.578125f, -0.960938f,0.578125f, -0.96875f,0.578125f, -0.976563f,0.578125f, -0.984375f,0.578125f, -0.992188f,0.578125f, -1.0f,0.578125f, -0.507813f,0.585938f, -0.515625f,0.585938f, -0.523438f,0.585938f, -0.53125f,0.585938f, -0.539063f,0.585938f, -0.546875f,0.585938f, -0.554688f,0.585938f, -0.5625f,0.585938f, -0.570313f,0.585938f, -0.578125f,0.585938f, -0.585938f,0.585938f, -0.59375f,0.585938f, -0.601563f,0.585938f, -0.609375f,0.585938f, -0.617188f,0.585938f, -0.625f,0.585938f, -0.632813f,0.585938f, -0.640625f,0.585938f, -0.648438f,0.585938f, -0.65625f,0.585938f, -0.664063f,0.585938f, -0.671875f,0.585938f, -0.679688f,0.585938f, -0.6875f,0.585938f, -0.695313f,0.585938f, -0.703125f,0.585938f, -0.710938f,0.585938f, -0.71875f,0.585938f, -0.726563f,0.585938f, -0.734375f,0.585938f, -0.742188f,0.585938f, -0.75f,0.585938f, -0.757813f,0.585938f, -0.765625f,0.585938f, -0.773438f,0.585938f, -0.78125f,0.585938f, -0.789063f,0.585938f, -0.796875f,0.585938f, -0.804688f,0.585938f, -0.8125f,0.585938f, -0.820313f,0.585938f, -0.828125f,0.585938f, -0.835938f,0.585938f, -0.84375f,0.585938f, -0.851563f,0.585938f, -0.859375f,0.585938f, -0.867188f,0.585938f, -0.875f,0.585938f, -0.882813f,0.585938f, -0.890625f,0.585938f, -0.898438f,0.585938f, -0.90625f,0.585938f, -0.914063f,0.585938f, -0.921875f,0.585938f, -0.929688f,0.585938f, -0.9375f,0.585938f, -0.945313f,0.585938f, -0.953125f,0.585938f, -0.960938f,0.585938f, -0.96875f,0.585938f, -0.976563f,0.585938f, -0.984375f,0.585938f, -0.992188f,0.585938f, -1.0f,0.585938f, -0.507813f,0.59375f, -0.515625f,0.59375f, -0.523438f,0.59375f, -0.53125f,0.59375f, -0.539063f,0.59375f, -0.546875f,0.59375f, -0.554688f,0.59375f, -0.5625f,0.59375f, -0.570313f,0.59375f, -0.578125f,0.59375f, -0.585938f,0.59375f, -0.59375f,0.59375f, -0.601563f,0.59375f, -0.609375f,0.59375f, -0.617188f,0.59375f, -0.625f,0.59375f, -0.632813f,0.59375f, -0.640625f,0.59375f, -0.648438f,0.59375f, -0.65625f,0.59375f, -0.664063f,0.59375f, -0.671875f,0.59375f, -0.679688f,0.59375f, -0.6875f,0.59375f, -0.695313f,0.59375f, -0.703125f,0.59375f, -0.710938f,0.59375f, -0.71875f,0.59375f, -0.726563f,0.59375f, -0.734375f,0.59375f, -0.742188f,0.59375f, -0.75f,0.59375f, -0.757813f,0.59375f, -0.765625f,0.59375f, -0.773438f,0.59375f, -0.78125f,0.59375f, -0.789063f,0.59375f, -0.796875f,0.59375f, -0.804688f,0.59375f, -0.8125f,0.59375f, -0.820313f,0.59375f, -0.828125f,0.59375f, -0.835938f,0.59375f, -0.84375f,0.59375f, -0.851563f,0.59375f, -0.859375f,0.59375f, -0.867188f,0.59375f, -0.875f,0.59375f, -0.882813f,0.59375f, -0.890625f,0.59375f, -0.898438f,0.59375f, -0.90625f,0.59375f, -0.914063f,0.59375f, -0.921875f,0.59375f, -0.929688f,0.59375f, -0.9375f,0.59375f, -0.945313f,0.59375f, -0.953125f,0.59375f, -0.960938f,0.59375f, -0.96875f,0.59375f, -0.976563f,0.59375f, -0.984375f,0.59375f, -0.992188f,0.59375f, -1.0f,0.59375f, -0.507813f,0.601563f, -0.515625f,0.601563f, -0.523438f,0.601563f, -0.53125f,0.601563f, -0.539063f,0.601563f, -0.546875f,0.601563f, -0.554688f,0.601563f, -0.5625f,0.601563f, -0.570313f,0.601563f, -0.578125f,0.601563f, -0.585938f,0.601563f, -0.59375f,0.601563f, -0.601563f,0.601563f, -0.609375f,0.601563f, -0.617188f,0.601563f, -0.625f,0.601563f, -0.632813f,0.601563f, -0.640625f,0.601563f, -0.648438f,0.601563f, -0.65625f,0.601563f, -0.664063f,0.601563f, -0.671875f,0.601563f, -0.679688f,0.601563f, -0.6875f,0.601563f, -0.695313f,0.601563f, -0.703125f,0.601563f, -0.710938f,0.601563f, -0.71875f,0.601563f, -0.726563f,0.601563f, -0.734375f,0.601563f, -0.742188f,0.601563f, -0.75f,0.601563f, -0.757813f,0.601563f, -0.765625f,0.601563f, -0.773438f,0.601563f, -0.78125f,0.601563f, -0.789063f,0.601563f, -0.796875f,0.601563f, -0.804688f,0.601563f, -0.8125f,0.601563f, -0.820313f,0.601563f, -0.828125f,0.601563f, -0.835938f,0.601563f, -0.84375f,0.601563f, -0.851563f,0.601563f, -0.859375f,0.601563f, -0.867188f,0.601563f, -0.875f,0.601563f, -0.882813f,0.601563f, -0.890625f,0.601563f, -0.898438f,0.601563f, -0.90625f,0.601563f, -0.914063f,0.601563f, -0.921875f,0.601563f, -0.929688f,0.601563f, -0.9375f,0.601563f, -0.945313f,0.601563f, -0.953125f,0.601563f, -0.960938f,0.601563f, -0.96875f,0.601563f, -0.976563f,0.601563f, -0.984375f,0.601563f, -0.992188f,0.601563f, -1.0f,0.601563f, -0.507813f,0.609375f, -0.515625f,0.609375f, -0.523438f,0.609375f, -0.53125f,0.609375f, -0.539063f,0.609375f, -0.546875f,0.609375f, -0.554688f,0.609375f, -0.5625f,0.609375f, -0.570313f,0.609375f, -0.578125f,0.609375f, -0.585938f,0.609375f, -0.59375f,0.609375f, -0.601563f,0.609375f, -0.609375f,0.609375f, -0.617188f,0.609375f, -0.625f,0.609375f, -0.632813f,0.609375f, -0.640625f,0.609375f, -0.648438f,0.609375f, -0.65625f,0.609375f, -0.664063f,0.609375f, -0.671875f,0.609375f, -0.679688f,0.609375f, -0.6875f,0.609375f, -0.695313f,0.609375f, -0.703125f,0.609375f, -0.710938f,0.609375f, -0.71875f,0.609375f, -0.726563f,0.609375f, -0.734375f,0.609375f, -0.742188f,0.609375f, -0.75f,0.609375f, -0.757813f,0.609375f, -0.765625f,0.609375f, -0.773438f,0.609375f, -0.78125f,0.609375f, -0.789063f,0.609375f, -0.796875f,0.609375f, -0.804688f,0.609375f, -0.8125f,0.609375f, -0.820313f,0.609375f, -0.828125f,0.609375f, -0.835938f,0.609375f, -0.84375f,0.609375f, -0.851563f,0.609375f, -0.859375f,0.609375f, -0.867188f,0.609375f, -0.875f,0.609375f, -0.882813f,0.609375f, -0.890625f,0.609375f, -0.898438f,0.609375f, -0.90625f,0.609375f, -0.914063f,0.609375f, -0.921875f,0.609375f, -0.929688f,0.609375f, -0.9375f,0.609375f, -0.945313f,0.609375f, -0.953125f,0.609375f, -0.960938f,0.609375f, -0.96875f,0.609375f, -0.976563f,0.609375f, -0.984375f,0.609375f, -0.992188f,0.609375f, -1.0f,0.609375f, -0.507813f,0.617188f, -0.515625f,0.617188f, -0.523438f,0.617188f, -0.53125f,0.617188f, -0.539063f,0.617188f, -0.546875f,0.617188f, -0.554688f,0.617188f, -0.5625f,0.617188f, -0.570313f,0.617188f, -0.578125f,0.617188f, -0.585938f,0.617188f, -0.59375f,0.617188f, -0.601563f,0.617188f, -0.609375f,0.617188f, -0.617188f,0.617188f, -0.625f,0.617188f, -0.632813f,0.617188f, -0.640625f,0.617188f, -0.648438f,0.617188f, -0.65625f,0.617188f, -0.664063f,0.617188f, -0.671875f,0.617188f, -0.679688f,0.617188f, -0.6875f,0.617188f, -0.695313f,0.617188f, -0.703125f,0.617188f, -0.710938f,0.617188f, -0.71875f,0.617188f, -0.726563f,0.617188f, -0.734375f,0.617188f, -0.742188f,0.617188f, -0.75f,0.617188f, -0.757813f,0.617188f, -0.765625f,0.617188f, -0.773438f,0.617188f, -0.78125f,0.617188f, -0.789063f,0.617188f, -0.796875f,0.617188f, -0.804688f,0.617188f, -0.8125f,0.617188f, -0.820313f,0.617188f, -0.828125f,0.617188f, -0.835938f,0.617188f, -0.84375f,0.617188f, -0.851563f,0.617188f, -0.859375f,0.617188f, -0.867188f,0.617188f, -0.875f,0.617188f, -0.882813f,0.617188f, -0.890625f,0.617188f, -0.898438f,0.617188f, -0.90625f,0.617188f, -0.914063f,0.617188f, -0.921875f,0.617188f, -0.929688f,0.617188f, -0.9375f,0.617188f, -0.945313f,0.617188f, -0.953125f,0.617188f, -0.960938f,0.617188f, -0.96875f,0.617188f, -0.976563f,0.617188f, -0.984375f,0.617188f, -0.992188f,0.617188f, -1.0f,0.617188f, -0.507813f,0.625f, -0.515625f,0.625f, -0.523438f,0.625f, -0.53125f,0.625f, -0.539063f,0.625f, -0.546875f,0.625f, -0.554688f,0.625f, -0.5625f,0.625f, -0.570313f,0.625f, -0.578125f,0.625f, -0.585938f,0.625f, -0.59375f,0.625f, -0.601563f,0.625f, -0.609375f,0.625f, -0.617188f,0.625f, -0.625f,0.625f, -0.632813f,0.625f, -0.640625f,0.625f, -0.648438f,0.625f, -0.65625f,0.625f, -0.664063f,0.625f, -0.671875f,0.625f, -0.679688f,0.625f, -0.6875f,0.625f, -0.695313f,0.625f, -0.703125f,0.625f, -0.710938f,0.625f, -0.71875f,0.625f, -0.726563f,0.625f, -0.734375f,0.625f, -0.742188f,0.625f, -0.75f,0.625f, -0.757813f,0.625f, -0.765625f,0.625f, -0.773438f,0.625f, -0.78125f,0.625f, -0.789063f,0.625f, -0.796875f,0.625f, -0.804688f,0.625f, -0.8125f,0.625f, -0.820313f,0.625f, -0.828125f,0.625f, -0.835938f,0.625f, -0.84375f,0.625f, -0.851563f,0.625f, -0.859375f,0.625f, -0.867188f,0.625f, -0.875f,0.625f, -0.882813f,0.625f, -0.890625f,0.625f, -0.898438f,0.625f, -0.90625f,0.625f, -0.914063f,0.625f, -0.921875f,0.625f, -0.929688f,0.625f, -0.9375f,0.625f, -0.945313f,0.625f, -0.953125f,0.625f, -0.960938f,0.625f, -0.96875f,0.625f, -0.976563f,0.625f, -0.984375f,0.625f, -0.992188f,0.625f, -1.0f,0.625f, -0.507813f,0.632813f, -0.515625f,0.632813f, -0.523438f,0.632813f, -0.53125f,0.632813f, -0.539063f,0.632813f, -0.546875f,0.632813f, -0.554688f,0.632813f, -0.5625f,0.632813f, -0.570313f,0.632813f, -0.578125f,0.632813f, -0.585938f,0.632813f, -0.59375f,0.632813f, -0.601563f,0.632813f, -0.609375f,0.632813f, -0.617188f,0.632813f, -0.625f,0.632813f, -0.632813f,0.632813f, -0.640625f,0.632813f, -0.648438f,0.632813f, -0.65625f,0.632813f, -0.664063f,0.632813f, -0.671875f,0.632813f, -0.679688f,0.632813f, -0.6875f,0.632813f, -0.695313f,0.632813f, -0.703125f,0.632813f, -0.710938f,0.632813f, -0.71875f,0.632813f, -0.726563f,0.632813f, -0.734375f,0.632813f, -0.742188f,0.632813f, -0.75f,0.632813f, -0.757813f,0.632813f, -0.765625f,0.632813f, -0.773438f,0.632813f, -0.78125f,0.632813f, -0.789063f,0.632813f, -0.796875f,0.632813f, -0.804688f,0.632813f, -0.8125f,0.632813f, -0.820313f,0.632813f, -0.828125f,0.632813f, -0.835938f,0.632813f, -0.84375f,0.632813f, -0.851563f,0.632813f, -0.859375f,0.632813f, -0.867188f,0.632813f, -0.875f,0.632813f, -0.882813f,0.632813f, -0.890625f,0.632813f, -0.898438f,0.632813f, -0.90625f,0.632813f, -0.914063f,0.632813f, -0.921875f,0.632813f, -0.929688f,0.632813f, -0.9375f,0.632813f, -0.945313f,0.632813f, -0.953125f,0.632813f, -0.960938f,0.632813f, -0.96875f,0.632813f, -0.976563f,0.632813f, -0.984375f,0.632813f, -0.992188f,0.632813f, -1.0f,0.632813f, -0.507813f,0.640625f, -0.515625f,0.640625f, -0.523438f,0.640625f, -0.53125f,0.640625f, -0.539063f,0.640625f, -0.546875f,0.640625f, -0.554688f,0.640625f, -0.5625f,0.640625f, -0.570313f,0.640625f, -0.578125f,0.640625f, -0.585938f,0.640625f, -0.59375f,0.640625f, -0.601563f,0.640625f, -0.609375f,0.640625f, -0.617188f,0.640625f, -0.625f,0.640625f, -0.632813f,0.640625f, -0.640625f,0.640625f, -0.648438f,0.640625f, -0.65625f,0.640625f, -0.664063f,0.640625f, -0.671875f,0.640625f, -0.679688f,0.640625f, -0.6875f,0.640625f, -0.695313f,0.640625f, -0.703125f,0.640625f, -0.710938f,0.640625f, -0.71875f,0.640625f, -0.726563f,0.640625f, -0.734375f,0.640625f, -0.742188f,0.640625f, -0.75f,0.640625f, -0.757813f,0.640625f, -0.765625f,0.640625f, -0.773438f,0.640625f, -0.78125f,0.640625f, -0.789063f,0.640625f, -0.796875f,0.640625f, -0.804688f,0.640625f, -0.8125f,0.640625f, -0.820313f,0.640625f, -0.828125f,0.640625f, -0.835938f,0.640625f, -0.84375f,0.640625f, -0.851563f,0.640625f, -0.859375f,0.640625f, -0.867188f,0.640625f, -0.875f,0.640625f, -0.882813f,0.640625f, -0.890625f,0.640625f, -0.898438f,0.640625f, -0.90625f,0.640625f, -0.914063f,0.640625f, -0.921875f,0.640625f, -0.929688f,0.640625f, -0.9375f,0.640625f, -0.945313f,0.640625f, -0.953125f,0.640625f, -0.960938f,0.640625f, -0.96875f,0.640625f, -0.976563f,0.640625f, -0.984375f,0.640625f, -0.992188f,0.640625f, -1.0f,0.640625f, -0.507813f,0.648438f, -0.515625f,0.648438f, -0.523438f,0.648438f, -0.53125f,0.648438f, -0.539063f,0.648438f, -0.546875f,0.648438f, -0.554688f,0.648438f, -0.5625f,0.648438f, -0.570313f,0.648438f, -0.578125f,0.648438f, -0.585938f,0.648438f, -0.59375f,0.648438f, -0.601563f,0.648438f, -0.609375f,0.648438f, -0.617188f,0.648438f, -0.625f,0.648438f, -0.632813f,0.648438f, -0.640625f,0.648438f, -0.648438f,0.648438f, -0.65625f,0.648438f, -0.664063f,0.648438f, -0.671875f,0.648438f, -0.679688f,0.648438f, -0.6875f,0.648438f, -0.695313f,0.648438f, -0.703125f,0.648438f, -0.710938f,0.648438f, -0.71875f,0.648438f, -0.726563f,0.648438f, -0.734375f,0.648438f, -0.742188f,0.648438f, -0.75f,0.648438f, -0.757813f,0.648438f, -0.765625f,0.648438f, -0.773438f,0.648438f, -0.78125f,0.648438f, -0.789063f,0.648438f, -0.796875f,0.648438f, -0.804688f,0.648438f, -0.8125f,0.648438f, -0.820313f,0.648438f, -0.828125f,0.648438f, -0.835938f,0.648438f, -0.84375f,0.648438f, -0.851563f,0.648438f, -0.859375f,0.648438f, -0.867188f,0.648438f, -0.875f,0.648438f, -0.882813f,0.648438f, -0.890625f,0.648438f, -0.898438f,0.648438f, -0.90625f,0.648438f, -0.914063f,0.648438f, -0.921875f,0.648438f, -0.929688f,0.648438f, -0.9375f,0.648438f, -0.945313f,0.648438f, -0.953125f,0.648438f, -0.960938f,0.648438f, -0.96875f,0.648438f, -0.976563f,0.648438f, -0.984375f,0.648438f, -0.992188f,0.648438f, -1.0f,0.648438f, -0.507813f,0.65625f, -0.515625f,0.65625f, -0.523438f,0.65625f, -0.53125f,0.65625f, -0.539063f,0.65625f, -0.546875f,0.65625f, -0.554688f,0.65625f, -0.5625f,0.65625f, -0.570313f,0.65625f, -0.578125f,0.65625f, -0.585938f,0.65625f, -0.59375f,0.65625f, -0.601563f,0.65625f, -0.609375f,0.65625f, -0.617188f,0.65625f, -0.625f,0.65625f, -0.632813f,0.65625f, -0.640625f,0.65625f, -0.648438f,0.65625f, -0.65625f,0.65625f, -0.664063f,0.65625f, -0.671875f,0.65625f, -0.679688f,0.65625f, -0.6875f,0.65625f, -0.695313f,0.65625f, -0.703125f,0.65625f, -0.710938f,0.65625f, -0.71875f,0.65625f, -0.726563f,0.65625f, -0.734375f,0.65625f, -0.742188f,0.65625f, -0.75f,0.65625f, -0.757813f,0.65625f, -0.765625f,0.65625f, -0.773438f,0.65625f, -0.78125f,0.65625f, -0.789063f,0.65625f, -0.796875f,0.65625f, -0.804688f,0.65625f, -0.8125f,0.65625f, -0.820313f,0.65625f, -0.828125f,0.65625f, -0.835938f,0.65625f, -0.84375f,0.65625f, -0.851563f,0.65625f, -0.859375f,0.65625f, -0.867188f,0.65625f, -0.875f,0.65625f, -0.882813f,0.65625f, -0.890625f,0.65625f, -0.898438f,0.65625f, -0.90625f,0.65625f, -0.914063f,0.65625f, -0.921875f,0.65625f, -0.929688f,0.65625f, -0.9375f,0.65625f, -0.945313f,0.65625f, -0.953125f,0.65625f, -0.960938f,0.65625f, -0.96875f,0.65625f, -0.976563f,0.65625f, -0.984375f,0.65625f, -0.992188f,0.65625f, -1.0f,0.65625f, -0.507813f,0.664063f, -0.515625f,0.664063f, -0.523438f,0.664063f, -0.53125f,0.664063f, -0.539063f,0.664063f, -0.546875f,0.664063f, -0.554688f,0.664063f, -0.5625f,0.664063f, -0.570313f,0.664063f, -0.578125f,0.664063f, -0.585938f,0.664063f, -0.59375f,0.664063f, -0.601563f,0.664063f, -0.609375f,0.664063f, -0.617188f,0.664063f, -0.625f,0.664063f, -0.632813f,0.664063f, -0.640625f,0.664063f, -0.648438f,0.664063f, -0.65625f,0.664063f, -0.664063f,0.664063f, -0.671875f,0.664063f, -0.679688f,0.664063f, -0.6875f,0.664063f, -0.695313f,0.664063f, -0.703125f,0.664063f, -0.710938f,0.664063f, -0.71875f,0.664063f, -0.726563f,0.664063f, -0.734375f,0.664063f, -0.742188f,0.664063f, -0.75f,0.664063f, -0.757813f,0.664063f, -0.765625f,0.664063f, -0.773438f,0.664063f, -0.78125f,0.664063f, -0.789063f,0.664063f, -0.796875f,0.664063f, -0.804688f,0.664063f, -0.8125f,0.664063f, -0.820313f,0.664063f, -0.828125f,0.664063f, -0.835938f,0.664063f, -0.84375f,0.664063f, -0.851563f,0.664063f, -0.859375f,0.664063f, -0.867188f,0.664063f, -0.875f,0.664063f, -0.882813f,0.664063f, -0.890625f,0.664063f, -0.898438f,0.664063f, -0.90625f,0.664063f, -0.914063f,0.664063f, -0.921875f,0.664063f, -0.929688f,0.664063f, -0.9375f,0.664063f, -0.945313f,0.664063f, -0.953125f,0.664063f, -0.960938f,0.664063f, -0.96875f,0.664063f, -0.976563f,0.664063f, -0.984375f,0.664063f, -0.992188f,0.664063f, -1.0f,0.664063f, -0.507813f,0.671875f, -0.515625f,0.671875f, -0.523438f,0.671875f, -0.53125f,0.671875f, -0.539063f,0.671875f, -0.546875f,0.671875f, -0.554688f,0.671875f, -0.5625f,0.671875f, -0.570313f,0.671875f, -0.578125f,0.671875f, -0.585938f,0.671875f, -0.59375f,0.671875f, -0.601563f,0.671875f, -0.609375f,0.671875f, -0.617188f,0.671875f, -0.625f,0.671875f, -0.632813f,0.671875f, -0.640625f,0.671875f, -0.648438f,0.671875f, -0.65625f,0.671875f, -0.664063f,0.671875f, -0.671875f,0.671875f, -0.679688f,0.671875f, -0.6875f,0.671875f, -0.695313f,0.671875f, -0.703125f,0.671875f, -0.710938f,0.671875f, -0.71875f,0.671875f, -0.726563f,0.671875f, -0.734375f,0.671875f, -0.742188f,0.671875f, -0.75f,0.671875f, -0.757813f,0.671875f, -0.765625f,0.671875f, -0.773438f,0.671875f, -0.78125f,0.671875f, -0.789063f,0.671875f, -0.796875f,0.671875f, -0.804688f,0.671875f, -0.8125f,0.671875f, -0.820313f,0.671875f, -0.828125f,0.671875f, -0.835938f,0.671875f, -0.84375f,0.671875f, -0.851563f,0.671875f, -0.859375f,0.671875f, -0.867188f,0.671875f, -0.875f,0.671875f, -0.882813f,0.671875f, -0.890625f,0.671875f, -0.898438f,0.671875f, -0.90625f,0.671875f, -0.914063f,0.671875f, -0.921875f,0.671875f, -0.929688f,0.671875f, -0.9375f,0.671875f, -0.945313f,0.671875f, -0.953125f,0.671875f, -0.960938f,0.671875f, -0.96875f,0.671875f, -0.976563f,0.671875f, -0.984375f,0.671875f, -0.992188f,0.671875f, -1.0f,0.671875f, -0.507813f,0.679688f, -0.515625f,0.679688f, -0.523438f,0.679688f, -0.53125f,0.679688f, -0.539063f,0.679688f, -0.546875f,0.679688f, -0.554688f,0.679688f, -0.5625f,0.679688f, -0.570313f,0.679688f, -0.578125f,0.679688f, -0.585938f,0.679688f, -0.59375f,0.679688f, -0.601563f,0.679688f, -0.609375f,0.679688f, -0.617188f,0.679688f, -0.625f,0.679688f, -0.632813f,0.679688f, -0.640625f,0.679688f, -0.648438f,0.679688f, -0.65625f,0.679688f, -0.664063f,0.679688f, -0.671875f,0.679688f, -0.679688f,0.679688f, -0.6875f,0.679688f, -0.695313f,0.679688f, -0.703125f,0.679688f, -0.710938f,0.679688f, -0.71875f,0.679688f, -0.726563f,0.679688f, -0.734375f,0.679688f, -0.742188f,0.679688f, -0.75f,0.679688f, -0.757813f,0.679688f, -0.765625f,0.679688f, -0.773438f,0.679688f, -0.78125f,0.679688f, -0.789063f,0.679688f, -0.796875f,0.679688f, -0.804688f,0.679688f, -0.8125f,0.679688f, -0.820313f,0.679688f, -0.828125f,0.679688f, -0.835938f,0.679688f, -0.84375f,0.679688f, -0.851563f,0.679688f, -0.859375f,0.679688f, -0.867188f,0.679688f, -0.875f,0.679688f, -0.882813f,0.679688f, -0.890625f,0.679688f, -0.898438f,0.679688f, -0.90625f,0.679688f, -0.914063f,0.679688f, -0.921875f,0.679688f, -0.929688f,0.679688f, -0.9375f,0.679688f, -0.945313f,0.679688f, -0.953125f,0.679688f, -0.960938f,0.679688f, -0.96875f,0.679688f, -0.976563f,0.679688f, -0.984375f,0.679688f, -0.992188f,0.679688f, -1.0f,0.679688f, -0.507813f,0.6875f, -0.515625f,0.6875f, -0.523438f,0.6875f, -0.53125f,0.6875f, -0.539063f,0.6875f, -0.546875f,0.6875f, -0.554688f,0.6875f, -0.5625f,0.6875f, -0.570313f,0.6875f, -0.578125f,0.6875f, -0.585938f,0.6875f, -0.59375f,0.6875f, -0.601563f,0.6875f, -0.609375f,0.6875f, -0.617188f,0.6875f, -0.625f,0.6875f, -0.632813f,0.6875f, -0.640625f,0.6875f, -0.648438f,0.6875f, -0.65625f,0.6875f, -0.664063f,0.6875f, -0.671875f,0.6875f, -0.679688f,0.6875f, -0.6875f,0.6875f, -0.695313f,0.6875f, -0.703125f,0.6875f, -0.710938f,0.6875f, -0.71875f,0.6875f, -0.726563f,0.6875f, -0.734375f,0.6875f, -0.742188f,0.6875f, -0.75f,0.6875f, -0.757813f,0.6875f, -0.765625f,0.6875f, -0.773438f,0.6875f, -0.78125f,0.6875f, -0.789063f,0.6875f, -0.796875f,0.6875f, -0.804688f,0.6875f, -0.8125f,0.6875f, -0.820313f,0.6875f, -0.828125f,0.6875f, -0.835938f,0.6875f, -0.84375f,0.6875f, -0.851563f,0.6875f, -0.859375f,0.6875f, -0.867188f,0.6875f, -0.875f,0.6875f, -0.882813f,0.6875f, -0.890625f,0.6875f, -0.898438f,0.6875f, -0.90625f,0.6875f, -0.914063f,0.6875f, -0.921875f,0.6875f, -0.929688f,0.6875f, -0.9375f,0.6875f, -0.945313f,0.6875f, -0.953125f,0.6875f, -0.960938f,0.6875f, -0.96875f,0.6875f, -0.976563f,0.6875f, -0.984375f,0.6875f, -0.992188f,0.6875f, -1.0f,0.6875f, -0.507813f,0.695313f, -0.515625f,0.695313f, -0.523438f,0.695313f, -0.53125f,0.695313f, -0.539063f,0.695313f, -0.546875f,0.695313f, -0.554688f,0.695313f, -0.5625f,0.695313f, -0.570313f,0.695313f, -0.578125f,0.695313f, -0.585938f,0.695313f, -0.59375f,0.695313f, -0.601563f,0.695313f, -0.609375f,0.695313f, -0.617188f,0.695313f, -0.625f,0.695313f, -0.632813f,0.695313f, -0.640625f,0.695313f, -0.648438f,0.695313f, -0.65625f,0.695313f, -0.664063f,0.695313f, -0.671875f,0.695313f, -0.679688f,0.695313f, -0.6875f,0.695313f, -0.695313f,0.695313f, -0.703125f,0.695313f, -0.710938f,0.695313f, -0.71875f,0.695313f, -0.726563f,0.695313f, -0.734375f,0.695313f, -0.742188f,0.695313f, -0.75f,0.695313f, -0.757813f,0.695313f, -0.765625f,0.695313f, -0.773438f,0.695313f, -0.78125f,0.695313f, -0.789063f,0.695313f, -0.796875f,0.695313f, -0.804688f,0.695313f, -0.8125f,0.695313f, -0.820313f,0.695313f, -0.828125f,0.695313f, -0.835938f,0.695313f, -0.84375f,0.695313f, -0.851563f,0.695313f, -0.859375f,0.695313f, -0.867188f,0.695313f, -0.875f,0.695313f, -0.882813f,0.695313f, -0.890625f,0.695313f, -0.898438f,0.695313f, -0.90625f,0.695313f, -0.914063f,0.695313f, -0.921875f,0.695313f, -0.929688f,0.695313f, -0.9375f,0.695313f, -0.945313f,0.695313f, -0.953125f,0.695313f, -0.960938f,0.695313f, -0.96875f,0.695313f, -0.976563f,0.695313f, -0.984375f,0.695313f, -0.992188f,0.695313f, -1.0f,0.695313f, -0.507813f,0.703125f, -0.515625f,0.703125f, -0.523438f,0.703125f, -0.53125f,0.703125f, -0.539063f,0.703125f, -0.546875f,0.703125f, -0.554688f,0.703125f, -0.5625f,0.703125f, -0.570313f,0.703125f, -0.578125f,0.703125f, -0.585938f,0.703125f, -0.59375f,0.703125f, -0.601563f,0.703125f, -0.609375f,0.703125f, -0.617188f,0.703125f, -0.625f,0.703125f, -0.632813f,0.703125f, -0.640625f,0.703125f, -0.648438f,0.703125f, -0.65625f,0.703125f, -0.664063f,0.703125f, -0.671875f,0.703125f, -0.679688f,0.703125f, -0.6875f,0.703125f, -0.695313f,0.703125f, -0.703125f,0.703125f, -0.710938f,0.703125f, -0.71875f,0.703125f, -0.726563f,0.703125f, -0.734375f,0.703125f, -0.742188f,0.703125f, -0.75f,0.703125f, -0.757813f,0.703125f, -0.765625f,0.703125f, -0.773438f,0.703125f, -0.78125f,0.703125f, -0.789063f,0.703125f, -0.796875f,0.703125f, -0.804688f,0.703125f, -0.8125f,0.703125f, -0.820313f,0.703125f, -0.828125f,0.703125f, -0.835938f,0.703125f, -0.84375f,0.703125f, -0.851563f,0.703125f, -0.859375f,0.703125f, -0.867188f,0.703125f, -0.875f,0.703125f, -0.882813f,0.703125f, -0.890625f,0.703125f, -0.898438f,0.703125f, -0.90625f,0.703125f, -0.914063f,0.703125f, -0.921875f,0.703125f, -0.929688f,0.703125f, -0.9375f,0.703125f, -0.945313f,0.703125f, -0.953125f,0.703125f, -0.960938f,0.703125f, -0.96875f,0.703125f, -0.976563f,0.703125f, -0.984375f,0.703125f, -0.992188f,0.703125f, -1.0f,0.703125f, -0.507813f,0.710938f, -0.515625f,0.710938f, -0.523438f,0.710938f, -0.53125f,0.710938f, -0.539063f,0.710938f, -0.546875f,0.710938f, -0.554688f,0.710938f, -0.5625f,0.710938f, -0.570313f,0.710938f, -0.578125f,0.710938f, -0.585938f,0.710938f, -0.59375f,0.710938f, -0.601563f,0.710938f, -0.609375f,0.710938f, -0.617188f,0.710938f, -0.625f,0.710938f, -0.632813f,0.710938f, -0.640625f,0.710938f, -0.648438f,0.710938f, -0.65625f,0.710938f, -0.664063f,0.710938f, -0.671875f,0.710938f, -0.679688f,0.710938f, -0.6875f,0.710938f, -0.695313f,0.710938f, -0.703125f,0.710938f, -0.710938f,0.710938f, -0.71875f,0.710938f, -0.726563f,0.710938f, -0.734375f,0.710938f, -0.742188f,0.710938f, -0.75f,0.710938f, -0.757813f,0.710938f, -0.765625f,0.710938f, -0.773438f,0.710938f, -0.78125f,0.710938f, -0.789063f,0.710938f, -0.796875f,0.710938f, -0.804688f,0.710938f, -0.8125f,0.710938f, -0.820313f,0.710938f, -0.828125f,0.710938f, -0.835938f,0.710938f, -0.84375f,0.710938f, -0.851563f,0.710938f, -0.859375f,0.710938f, -0.867188f,0.710938f, -0.875f,0.710938f, -0.882813f,0.710938f, -0.890625f,0.710938f, -0.898438f,0.710938f, -0.90625f,0.710938f, -0.914063f,0.710938f, -0.921875f,0.710938f, -0.929688f,0.710938f, -0.9375f,0.710938f, -0.945313f,0.710938f, -0.953125f,0.710938f, -0.960938f,0.710938f, -0.96875f,0.710938f, -0.976563f,0.710938f, -0.984375f,0.710938f, -0.992188f,0.710938f, -1.0f,0.710938f, -0.507813f,0.71875f, -0.515625f,0.71875f, -0.523438f,0.71875f, -0.53125f,0.71875f, -0.539063f,0.71875f, -0.546875f,0.71875f, -0.554688f,0.71875f, -0.5625f,0.71875f, -0.570313f,0.71875f, -0.578125f,0.71875f, -0.585938f,0.71875f, -0.59375f,0.71875f, -0.601563f,0.71875f, -0.609375f,0.71875f, -0.617188f,0.71875f, -0.625f,0.71875f, -0.632813f,0.71875f, -0.640625f,0.71875f, -0.648438f,0.71875f, -0.65625f,0.71875f, -0.664063f,0.71875f, -0.671875f,0.71875f, -0.679688f,0.71875f, -0.6875f,0.71875f, -0.695313f,0.71875f, -0.703125f,0.71875f, -0.710938f,0.71875f, -0.71875f,0.71875f, -0.726563f,0.71875f, -0.734375f,0.71875f, -0.742188f,0.71875f, -0.75f,0.71875f, -0.757813f,0.71875f, -0.765625f,0.71875f, -0.773438f,0.71875f, -0.78125f,0.71875f, -0.789063f,0.71875f, -0.796875f,0.71875f, -0.804688f,0.71875f, -0.8125f,0.71875f, -0.820313f,0.71875f, -0.828125f,0.71875f, -0.835938f,0.71875f, -0.84375f,0.71875f, -0.851563f,0.71875f, -0.859375f,0.71875f, -0.867188f,0.71875f, -0.875f,0.71875f, -0.882813f,0.71875f, -0.890625f,0.71875f, -0.898438f,0.71875f, -0.90625f,0.71875f, -0.914063f,0.71875f, -0.921875f,0.71875f, -0.929688f,0.71875f, -0.9375f,0.71875f, -0.945313f,0.71875f, -0.953125f,0.71875f, -0.960938f,0.71875f, -0.96875f,0.71875f, -0.976563f,0.71875f, -0.984375f,0.71875f, -0.992188f,0.71875f, -1.0f,0.71875f, -0.507813f,0.726563f, -0.515625f,0.726563f, -0.523438f,0.726563f, -0.53125f,0.726563f, -0.539063f,0.726563f, -0.546875f,0.726563f, -0.554688f,0.726563f, -0.5625f,0.726563f, -0.570313f,0.726563f, -0.578125f,0.726563f, -0.585938f,0.726563f, -0.59375f,0.726563f, -0.601563f,0.726563f, -0.609375f,0.726563f, -0.617188f,0.726563f, -0.625f,0.726563f, -0.632813f,0.726563f, -0.640625f,0.726563f, -0.648438f,0.726563f, -0.65625f,0.726563f, -0.664063f,0.726563f, -0.671875f,0.726563f, -0.679688f,0.726563f, -0.6875f,0.726563f, -0.695313f,0.726563f, -0.703125f,0.726563f, -0.710938f,0.726563f, -0.71875f,0.726563f, -0.726563f,0.726563f, -0.734375f,0.726563f, -0.742188f,0.726563f, -0.75f,0.726563f, -0.757813f,0.726563f, -0.765625f,0.726563f, -0.773438f,0.726563f, -0.78125f,0.726563f, -0.789063f,0.726563f, -0.796875f,0.726563f, -0.804688f,0.726563f, -0.8125f,0.726563f, -0.820313f,0.726563f, -0.828125f,0.726563f, -0.835938f,0.726563f, -0.84375f,0.726563f, -0.851563f,0.726563f, -0.859375f,0.726563f, -0.867188f,0.726563f, -0.875f,0.726563f, -0.882813f,0.726563f, -0.890625f,0.726563f, -0.898438f,0.726563f, -0.90625f,0.726563f, -0.914063f,0.726563f, -0.921875f,0.726563f, -0.929688f,0.726563f, -0.9375f,0.726563f, -0.945313f,0.726563f, -0.953125f,0.726563f, -0.960938f,0.726563f, -0.96875f,0.726563f, -0.976563f,0.726563f, -0.984375f,0.726563f, -0.992188f,0.726563f, -1.0f,0.726563f, -0.507813f,0.734375f, -0.515625f,0.734375f, -0.523438f,0.734375f, -0.53125f,0.734375f, -0.539063f,0.734375f, -0.546875f,0.734375f, -0.554688f,0.734375f, -0.5625f,0.734375f, -0.570313f,0.734375f, -0.578125f,0.734375f, -0.585938f,0.734375f, -0.59375f,0.734375f, -0.601563f,0.734375f, -0.609375f,0.734375f, -0.617188f,0.734375f, -0.625f,0.734375f, -0.632813f,0.734375f, -0.640625f,0.734375f, -0.648438f,0.734375f, -0.65625f,0.734375f, -0.664063f,0.734375f, -0.671875f,0.734375f, -0.679688f,0.734375f, -0.6875f,0.734375f, -0.695313f,0.734375f, -0.703125f,0.734375f, -0.710938f,0.734375f, -0.71875f,0.734375f, -0.726563f,0.734375f, -0.734375f,0.734375f, -0.742188f,0.734375f, -0.75f,0.734375f, -0.757813f,0.734375f, -0.765625f,0.734375f, -0.773438f,0.734375f, -0.78125f,0.734375f, -0.789063f,0.734375f, -0.796875f,0.734375f, -0.804688f,0.734375f, -0.8125f,0.734375f, -0.820313f,0.734375f, -0.828125f,0.734375f, -0.835938f,0.734375f, -0.84375f,0.734375f, -0.851563f,0.734375f, -0.859375f,0.734375f, -0.867188f,0.734375f, -0.875f,0.734375f, -0.882813f,0.734375f, -0.890625f,0.734375f, -0.898438f,0.734375f, -0.90625f,0.734375f, -0.914063f,0.734375f, -0.921875f,0.734375f, -0.929688f,0.734375f, -0.9375f,0.734375f, -0.945313f,0.734375f, -0.953125f,0.734375f, -0.960938f,0.734375f, -0.96875f,0.734375f, -0.976563f,0.734375f, -0.984375f,0.734375f, -0.992188f,0.734375f, -1.0f,0.734375f, -}; - -unsigned short Landscape03Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -128,0,129, -2,129,0, -129,2,130, -4,130,2, -130,4,131, -6,131,4, -131,6,132, -8,132,6, -132,8,133, -10,133,8, -133,10,134, -12,134,10, -134,12,135, -14,135,12, -135,14,136, -16,136,14, -136,16,137, -18,137,16, -137,18,138, -20,138,18, -138,20,139, -22,139,20, -139,22,140, -24,140,22, -140,24,141, -26,141,24, -141,26,142, -28,142,26, -142,28,143, -30,143,28, -143,30,144, -32,144,30, -144,32,145, -34,145,32, -145,34,146, -36,146,34, -146,36,147, -38,147,36, -147,38,148, -40,148,38, -148,40,149, -42,149,40, -149,42,150, -44,150,42, -150,44,151, -46,151,44, -151,46,152, -48,152,46, -152,48,153, -50,153,48, -153,50,154, -52,154,50, -154,52,155, -54,155,52, -155,54,156, -56,156,54, -156,56,157, -58,157,56, -157,58,158, -60,158,58, -158,60,159, -62,159,60, -159,62,160, -64,160,62, -160,64,161, -66,161,64, -161,66,162, -68,162,66, -162,68,163, -70,163,68, -163,70,164, -72,164,70, -164,72,165, -74,165,72, -165,74,166, -76,166,74, -166,76,167, -78,167,76, -167,78,168, -80,168,78, -168,80,169, -82,169,80, -169,82,170, -84,170,82, -170,84,171, -86,171,84, -171,86,172, -88,172,86, -172,88,173, -90,173,88, -173,90,174, -92,174,90, -174,92,175, -94,175,92, -175,94,176, -96,176,94, -176,96,177, -98,177,96, -177,98,178, -100,178,98, -178,100,179, -102,179,100, -179,102,180, -104,180,102, -180,104,181, -106,181,104, -181,106,182, -108,182,106, -182,108,183, -110,183,108, -183,110,184, -112,184,110, -184,112,185, -114,185,112, -185,114,186, -116,186,114, -186,116,187, -118,187,116, -187,118,188, -120,188,118, -188,120,189, -122,189,120, -189,122,190, -124,190,122, -190,124,191, -126,191,124, -192,128,193, -129,193,128, -193,129,194, -130,194,129, -194,130,195, -131,195,130, -195,131,196, -132,196,131, -196,132,197, -133,197,132, -197,133,198, -134,198,133, -198,134,199, -135,199,134, -199,135,200, -136,200,135, -200,136,201, -137,201,136, -201,137,202, -138,202,137, -202,138,203, -139,203,138, -203,139,204, -140,204,139, -204,140,205, -141,205,140, -205,141,206, -142,206,141, -206,142,207, -143,207,142, -207,143,208, -144,208,143, -208,144,209, -145,209,144, -209,145,210, -146,210,145, -210,146,211, -147,211,146, -211,147,212, -148,212,147, -212,148,213, -149,213,148, -213,149,214, -150,214,149, -214,150,215, -151,215,150, -215,151,216, -152,216,151, -216,152,217, -153,217,152, -217,153,218, -154,218,153, -218,154,219, -155,219,154, -219,155,220, -156,220,155, -220,156,221, -157,221,156, -221,157,222, -158,222,157, -222,158,223, -159,223,158, -223,159,224, -160,224,159, -224,160,225, -161,225,160, -225,161,226, -162,226,161, -226,162,227, -163,227,162, -227,163,228, -164,228,163, -228,164,229, -165,229,164, -229,165,230, -166,230,165, -230,166,231, -167,231,166, -231,167,232, -168,232,167, -232,168,233, -169,233,168, -233,169,234, -170,234,169, -234,170,235, -171,235,170, -235,171,236, -172,236,171, -236,172,237, -173,237,172, -237,173,238, -174,238,173, -238,174,239, -175,239,174, -239,175,240, -176,240,175, -240,176,241, -177,241,176, -241,177,242, -178,242,177, -242,178,243, -179,243,178, -243,179,244, -180,244,179, -244,180,245, -181,245,180, -245,181,246, -182,246,181, -246,182,247, -183,247,182, -247,183,248, -184,248,183, -248,184,249, -185,249,184, -249,185,250, -186,250,185, -250,186,251, -187,251,186, -251,187,252, -188,252,187, -252,188,253, -189,253,188, -253,189,254, -190,254,189, -254,190,255, -191,255,190, -256,192,257, -193,257,192, -257,193,258, -194,258,193, -258,194,259, -195,259,194, -259,195,260, -196,260,195, -260,196,261, -197,261,196, -261,197,262, -198,262,197, -262,198,263, -199,263,198, -263,199,264, -200,264,199, -264,200,265, -201,265,200, -265,201,266, -202,266,201, -266,202,267, -203,267,202, -267,203,268, -204,268,203, -268,204,269, -205,269,204, -269,205,270, -206,270,205, -270,206,271, -207,271,206, -271,207,272, -208,272,207, -272,208,273, -209,273,208, -273,209,274, -210,274,209, -274,210,275, -211,275,210, -275,211,276, -212,276,211, -276,212,277, -213,277,212, -277,213,278, -214,278,213, -278,214,279, -215,279,214, -279,215,280, -216,280,215, -280,216,281, -217,281,216, -281,217,282, -218,282,217, -282,218,283, -219,283,218, -283,219,284, -220,284,219, -284,220,285, -221,285,220, -285,221,286, -222,286,221, -286,222,287, -223,287,222, -287,223,288, -224,288,223, -288,224,289, -225,289,224, -289,225,290, -226,290,225, -290,226,291, -227,291,226, -291,227,292, -228,292,227, -292,228,293, -229,293,228, -293,229,294, -230,294,229, -294,230,295, -231,295,230, -295,231,296, -232,296,231, -296,232,297, -233,297,232, -297,233,298, -234,298,233, -298,234,299, -235,299,234, -299,235,300, -236,300,235, -300,236,301, -237,301,236, -301,237,302, -238,302,237, -302,238,303, -239,303,238, -303,239,304, -240,304,239, -304,240,305, -241,305,240, -305,241,306, -242,306,241, -306,242,307, -243,307,242, -307,243,308, -244,308,243, -308,244,309, -245,309,244, -309,245,310, -246,310,245, -310,246,311, -247,311,246, -311,247,312, -248,312,247, -312,248,313, -249,313,248, -313,249,314, -250,314,249, -314,250,315, -251,315,250, -315,251,316, -252,316,251, -316,252,317, -253,317,252, -317,253,318, -254,318,253, -318,254,319, -255,319,254, -320,256,321, -257,321,256, -321,257,322, -258,322,257, -322,258,323, -259,323,258, -323,259,324, -260,324,259, -324,260,325, -261,325,260, -325,261,326, -262,326,261, -326,262,327, -263,327,262, -327,263,328, -264,328,263, -328,264,329, -265,329,264, -329,265,330, -266,330,265, -330,266,331, -267,331,266, -331,267,332, -268,332,267, -332,268,333, -269,333,268, -333,269,334, -270,334,269, -334,270,335, -271,335,270, -335,271,336, -272,336,271, -336,272,337, -273,337,272, -337,273,338, -274,338,273, -338,274,339, -275,339,274, -339,275,340, -276,340,275, -340,276,341, -277,341,276, -341,277,342, -278,342,277, -342,278,343, -279,343,278, -343,279,344, -280,344,279, -344,280,345, -281,345,280, -345,281,346, -282,346,281, -346,282,347, -283,347,282, -347,283,348, -284,348,283, -348,284,349, -285,349,284, -349,285,350, -286,350,285, -350,286,351, -287,351,286, -351,287,352, -288,352,287, -352,288,353, -289,353,288, -353,289,354, -290,354,289, -354,290,355, -291,355,290, -355,291,356, -292,356,291, -356,292,357, -293,357,292, -357,293,358, -294,358,293, -358,294,359, -295,359,294, -359,295,360, -296,360,295, -360,296,361, -297,361,296, -361,297,362, -298,362,297, -362,298,363, -299,363,298, -363,299,364, -300,364,299, -364,300,365, -301,365,300, -365,301,366, -302,366,301, -366,302,367, -303,367,302, -367,303,368, -304,368,303, -368,304,369, -305,369,304, -369,305,370, -306,370,305, -370,306,371, -307,371,306, -371,307,372, -308,372,307, -372,308,373, -309,373,308, -373,309,374, -310,374,309, -374,310,375, -311,375,310, -375,311,376, -312,376,311, -376,312,377, -313,377,312, -377,313,378, -314,378,313, -378,314,379, -315,379,314, -379,315,380, -316,380,315, -380,316,381, -317,381,316, -381,317,382, -318,382,317, -382,318,383, -319,383,318, -384,320,385, -321,385,320, -385,321,386, -322,386,321, -386,322,387, -323,387,322, -387,323,388, -324,388,323, -388,324,389, -325,389,324, -389,325,390, -326,390,325, -390,326,391, -327,391,326, -391,327,392, -328,392,327, -392,328,393, -329,393,328, -393,329,394, -330,394,329, -394,330,395, -331,395,330, -395,331,396, -332,396,331, -396,332,397, -333,397,332, -397,333,398, -334,398,333, -398,334,399, -335,399,334, -399,335,400, -336,400,335, -400,336,401, -337,401,336, -401,337,402, -338,402,337, -402,338,403, -339,403,338, -403,339,404, -340,404,339, -404,340,405, -341,405,340, -405,341,406, -342,406,341, -406,342,407, -343,407,342, -407,343,408, -344,408,343, -408,344,409, -345,409,344, -409,345,410, -346,410,345, -410,346,411, -347,411,346, -411,347,412, -348,412,347, -412,348,413, -349,413,348, -413,349,414, -350,414,349, -414,350,415, -351,415,350, -415,351,416, -352,416,351, -416,352,417, -353,417,352, -417,353,418, -354,418,353, -418,354,419, -355,419,354, -419,355,420, -356,420,355, -420,356,421, -357,421,356, -421,357,422, -358,422,357, -422,358,423, -359,423,358, -423,359,424, -360,424,359, -424,360,425, -361,425,360, -425,361,426, -362,426,361, -426,362,427, -363,427,362, -427,363,428, -364,428,363, -428,364,429, -365,429,364, -429,365,430, -366,430,365, -430,366,431, -367,431,366, -431,367,432, -368,432,367, -432,368,433, -369,433,368, -433,369,434, -370,434,369, -434,370,435, -371,435,370, -435,371,436, -372,436,371, -436,372,437, -373,437,372, -437,373,438, -374,438,373, -438,374,439, -375,439,374, -439,375,440, -376,440,375, -440,376,441, -377,441,376, -441,377,442, -378,442,377, -442,378,443, -379,443,378, -443,379,444, -380,444,379, -444,380,445, -381,445,380, -445,381,446, -382,446,381, -446,382,447, -383,447,382, -448,384,449, -385,449,384, -449,385,450, -386,450,385, -450,386,451, -387,451,386, -451,387,452, -388,452,387, -452,388,453, -389,453,388, -453,389,454, -390,454,389, -454,390,455, -391,455,390, -455,391,456, -392,456,391, -456,392,457, -393,457,392, -457,393,458, -394,458,393, -458,394,459, -395,459,394, -459,395,460, -396,460,395, -460,396,461, -397,461,396, -461,397,462, -398,462,397, -462,398,463, -399,463,398, -463,399,464, -400,464,399, -464,400,465, -401,465,400, -465,401,466, -402,466,401, -466,402,467, -403,467,402, -467,403,468, -404,468,403, -468,404,469, -405,469,404, -469,405,470, -406,470,405, -470,406,471, -407,471,406, -471,407,472, -408,472,407, -472,408,473, -409,473,408, -473,409,474, -410,474,409, -474,410,475, -411,475,410, -475,411,476, -412,476,411, -476,412,477, -413,477,412, -477,413,478, -414,478,413, -478,414,479, -415,479,414, -479,415,480, -416,480,415, -480,416,481, -417,481,416, -481,417,482, -418,482,417, -482,418,483, -419,483,418, -483,419,484, -420,484,419, -484,420,485, -421,485,420, -485,421,486, -422,486,421, -486,422,487, -423,487,422, -487,423,488, -424,488,423, -488,424,489, -425,489,424, -489,425,490, -426,490,425, -490,426,491, -427,491,426, -491,427,492, -428,492,427, -492,428,493, -429,493,428, -493,429,494, -430,494,429, -494,430,495, -431,495,430, -495,431,496, -432,496,431, -496,432,497, -433,497,432, -497,433,498, -434,498,433, -498,434,499, -435,499,434, -499,435,500, -436,500,435, -500,436,501, -437,501,436, -501,437,502, -438,502,437, -502,438,503, -439,503,438, -503,439,504, -440,504,439, -504,440,505, -441,505,440, -505,441,506, -442,506,441, -506,442,507, -443,507,442, -507,443,508, -444,508,443, -508,444,509, -445,509,444, -509,445,510, -446,510,445, -510,446,511, -447,511,446, -512,448,513, -449,513,448, -513,449,514, -450,514,449, -514,450,515, -451,515,450, -515,451,516, -452,516,451, -516,452,517, -453,517,452, -517,453,518, -454,518,453, -518,454,519, -455,519,454, -519,455,520, -456,520,455, -520,456,521, -457,521,456, -521,457,522, -458,522,457, -522,458,523, -459,523,458, -523,459,524, -460,524,459, -524,460,525, -461,525,460, -525,461,526, -462,526,461, -526,462,527, -463,527,462, -527,463,528, -464,528,463, -528,464,529, -465,529,464, -529,465,530, -466,530,465, -530,466,531, -467,531,466, -531,467,532, -468,532,467, -532,468,533, -469,533,468, -533,469,534, -470,534,469, -534,470,535, -471,535,470, -535,471,536, -472,536,471, -536,472,537, -473,537,472, -537,473,538, -474,538,473, -538,474,539, -475,539,474, -539,475,540, -476,540,475, -540,476,541, -477,541,476, -541,477,542, -478,542,477, -542,478,543, -479,543,478, -543,479,544, -480,544,479, -544,480,545, -481,545,480, -545,481,546, -482,546,481, -546,482,547, -483,547,482, -547,483,548, -484,548,483, -548,484,549, -485,549,484, -549,485,550, -486,550,485, -550,486,551, -487,551,486, -551,487,552, -488,552,487, -552,488,553, -489,553,488, -553,489,554, -490,554,489, -554,490,555, -491,555,490, -555,491,556, -492,556,491, -556,492,557, -493,557,492, -557,493,558, -494,558,493, -558,494,559, -495,559,494, -559,495,560, -496,560,495, -560,496,561, -497,561,496, -561,497,562, -498,562,497, -562,498,563, -499,563,498, -563,499,564, -500,564,499, -564,500,565, -501,565,500, -565,501,566, -502,566,501, -566,502,567, -503,567,502, -567,503,568, -504,568,503, -568,504,569, -505,569,504, -569,505,570, -506,570,505, -570,506,571, -507,571,506, -571,507,572, -508,572,507, -572,508,573, -509,573,508, -573,509,574, -510,574,509, -574,510,575, -511,575,510, -576,512,577, -513,577,512, -577,513,578, -514,578,513, -578,514,579, -515,579,514, -579,515,580, -516,580,515, -580,516,581, -517,581,516, -581,517,582, -518,582,517, -582,518,583, -519,583,518, -583,519,584, -520,584,519, -584,520,585, -521,585,520, -585,521,586, -522,586,521, -586,522,587, -523,587,522, -587,523,588, -524,588,523, -588,524,589, -525,589,524, -589,525,590, -526,590,525, -590,526,591, -527,591,526, -591,527,592, -528,592,527, -592,528,593, -529,593,528, -593,529,594, -530,594,529, -594,530,595, -531,595,530, -595,531,596, -532,596,531, -596,532,597, -533,597,532, -597,533,598, -534,598,533, -598,534,599, -535,599,534, -599,535,600, -536,600,535, -600,536,601, -537,601,536, -601,537,602, -538,602,537, -602,538,603, -539,603,538, -603,539,604, -540,604,539, -604,540,605, -541,605,540, -605,541,606, -542,606,541, -606,542,607, -543,607,542, -607,543,608, -544,608,543, -608,544,609, -545,609,544, -609,545,610, -546,610,545, -610,546,611, -547,611,546, -611,547,612, -548,612,547, -612,548,613, -549,613,548, -613,549,614, -550,614,549, -614,550,615, -551,615,550, -615,551,616, -552,616,551, -616,552,617, -553,617,552, -617,553,618, -554,618,553, -618,554,619, -555,619,554, -619,555,620, -556,620,555, -620,556,621, -557,621,556, -621,557,622, -558,622,557, -622,558,623, -559,623,558, -623,559,624, -560,624,559, -624,560,625, -561,625,560, -625,561,626, -562,626,561, -626,562,627, -563,627,562, -627,563,628, -564,628,563, -628,564,629, -565,629,564, -629,565,630, -566,630,565, -630,566,631, -567,631,566, -631,567,632, -568,632,567, -632,568,633, -569,633,568, -633,569,634, -570,634,569, -634,570,635, -571,635,570, -635,571,636, -572,636,571, -636,572,637, -573,637,572, -637,573,638, -574,638,573, -638,574,639, -575,639,574, -640,576,641, -577,641,576, -641,577,642, -578,642,577, -642,578,643, -579,643,578, -643,579,644, -580,644,579, -644,580,645, -581,645,580, -645,581,646, -582,646,581, -646,582,647, -583,647,582, -647,583,648, -584,648,583, -648,584,649, -585,649,584, -649,585,650, -586,650,585, -650,586,651, -587,651,586, -651,587,652, -588,652,587, -652,588,653, -589,653,588, -653,589,654, -590,654,589, -654,590,655, -591,655,590, -655,591,656, -592,656,591, -656,592,657, -593,657,592, -657,593,658, -594,658,593, -658,594,659, -595,659,594, -659,595,660, -596,660,595, -660,596,661, -597,661,596, -661,597,662, -598,662,597, -662,598,663, -599,663,598, -663,599,664, -600,664,599, -664,600,665, -601,665,600, -665,601,666, -602,666,601, -666,602,667, -603,667,602, -667,603,668, -604,668,603, -668,604,669, -605,669,604, -669,605,670, -606,670,605, -670,606,671, -607,671,606, -671,607,672, -608,672,607, -672,608,673, -609,673,608, -673,609,674, -610,674,609, -674,610,675, -611,675,610, -675,611,676, -612,676,611, -676,612,677, -613,677,612, -677,613,678, -614,678,613, -678,614,679, -615,679,614, -679,615,680, -616,680,615, -680,616,681, -617,681,616, -681,617,682, -618,682,617, -682,618,683, -619,683,618, -683,619,684, -620,684,619, -684,620,685, -621,685,620, -685,621,686, -622,686,621, -686,622,687, -623,687,622, -687,623,688, -624,688,623, -688,624,689, -625,689,624, -689,625,690, -626,690,625, -690,626,691, -627,691,626, -691,627,692, -628,692,627, -692,628,693, -629,693,628, -693,629,694, -630,694,629, -694,630,695, -631,695,630, -695,631,696, -632,696,631, -696,632,697, -633,697,632, -697,633,698, -634,698,633, -698,634,699, -635,699,634, -699,635,700, -636,700,635, -700,636,701, -637,701,636, -701,637,702, -638,702,637, -702,638,703, -639,703,638, -704,640,705, -641,705,640, -705,641,706, -642,706,641, -706,642,707, -643,707,642, -707,643,708, -644,708,643, -708,644,709, -645,709,644, -709,645,710, -646,710,645, -710,646,711, -647,711,646, -711,647,712, -648,712,647, -712,648,713, -649,713,648, -713,649,714, -650,714,649, -714,650,715, -651,715,650, -715,651,716, -652,716,651, -716,652,717, -653,717,652, -717,653,718, -654,718,653, -718,654,719, -655,719,654, -719,655,720, -656,720,655, -720,656,721, -657,721,656, -721,657,722, -658,722,657, -722,658,723, -659,723,658, -723,659,724, -660,724,659, -724,660,725, -661,725,660, -725,661,726, -662,726,661, -726,662,727, -663,727,662, -727,663,728, -664,728,663, -728,664,729, -665,729,664, -729,665,730, -666,730,665, -730,666,731, -667,731,666, -731,667,732, -668,732,667, -732,668,733, -669,733,668, -733,669,734, -670,734,669, -734,670,735, -671,735,670, -735,671,736, -672,736,671, -736,672,737, -673,737,672, -737,673,738, -674,738,673, -738,674,739, -675,739,674, -739,675,740, -676,740,675, -740,676,741, -677,741,676, -741,677,742, -678,742,677, -742,678,743, -679,743,678, -743,679,744, -680,744,679, -744,680,745, -681,745,680, -745,681,746, -682,746,681, -746,682,747, -683,747,682, -747,683,748, -684,748,683, -748,684,749, -685,749,684, -749,685,750, -686,750,685, -750,686,751, -687,751,686, -751,687,752, -688,752,687, -752,688,753, -689,753,688, -753,689,754, -690,754,689, -754,690,755, -691,755,690, -755,691,756, -692,756,691, -756,692,757, -693,757,692, -757,693,758, -694,758,693, -758,694,759, -695,759,694, -759,695,760, -696,760,695, -760,696,761, -697,761,696, -761,697,762, -698,762,697, -762,698,763, -699,763,698, -763,699,764, -700,764,699, -764,700,765, -701,765,700, -765,701,766, -702,766,701, -766,702,767, -703,767,702, -768,704,769, -705,769,704, -769,705,770, -706,770,705, -770,706,771, -707,771,706, -771,707,772, -708,772,707, -772,708,773, -709,773,708, -773,709,774, -710,774,709, -774,710,775, -711,775,710, -775,711,776, -712,776,711, -776,712,777, -713,777,712, -777,713,778, -714,778,713, -778,714,779, -715,779,714, -779,715,780, -716,780,715, -780,716,781, -717,781,716, -781,717,782, -718,782,717, -782,718,783, -719,783,718, -783,719,784, -720,784,719, -784,720,785, -721,785,720, -785,721,786, -722,786,721, -786,722,787, -723,787,722, -787,723,788, -724,788,723, -788,724,789, -725,789,724, -789,725,790, -726,790,725, -790,726,791, -727,791,726, -791,727,792, -728,792,727, -792,728,793, -729,793,728, -793,729,794, -730,794,729, -794,730,795, -731,795,730, -795,731,796, -732,796,731, -796,732,797, -733,797,732, -797,733,798, -734,798,733, -798,734,799, -735,799,734, -799,735,800, -736,800,735, -800,736,801, -737,801,736, -801,737,802, -738,802,737, -802,738,803, -739,803,738, -803,739,804, -740,804,739, -804,740,805, -741,805,740, -805,741,806, -742,806,741, -806,742,807, -743,807,742, -807,743,808, -744,808,743, -808,744,809, -745,809,744, -809,745,810, -746,810,745, -810,746,811, -747,811,746, -811,747,812, -748,812,747, -812,748,813, -749,813,748, -813,749,814, -750,814,749, -814,750,815, -751,815,750, -815,751,816, -752,816,751, -816,752,817, -753,817,752, -817,753,818, -754,818,753, -818,754,819, -755,819,754, -819,755,820, -756,820,755, -820,756,821, -757,821,756, -821,757,822, -758,822,757, -822,758,823, -759,823,758, -823,759,824, -760,824,759, -824,760,825, -761,825,760, -825,761,826, -762,826,761, -826,762,827, -763,827,762, -827,763,828, -764,828,763, -828,764,829, -765,829,764, -829,765,830, -766,830,765, -830,766,831, -767,831,766, -832,768,833, -769,833,768, -833,769,834, -770,834,769, -834,770,835, -771,835,770, -835,771,836, -772,836,771, -836,772,837, -773,837,772, -837,773,838, -774,838,773, -838,774,839, -775,839,774, -839,775,840, -776,840,775, -840,776,841, -777,841,776, -841,777,842, -778,842,777, -842,778,843, -779,843,778, -843,779,844, -780,844,779, -844,780,845, -781,845,780, -845,781,846, -782,846,781, -846,782,847, -783,847,782, -847,783,848, -784,848,783, -848,784,849, -785,849,784, -849,785,850, -786,850,785, -850,786,851, -787,851,786, -851,787,852, -788,852,787, -852,788,853, -789,853,788, -853,789,854, -790,854,789, -854,790,855, -791,855,790, -855,791,856, -792,856,791, -856,792,857, -793,857,792, -857,793,858, -794,858,793, -858,794,859, -795,859,794, -859,795,860, -796,860,795, -860,796,861, -797,861,796, -861,797,862, -798,862,797, -862,798,863, -799,863,798, -863,799,864, -800,864,799, -864,800,865, -801,865,800, -865,801,866, -802,866,801, -866,802,867, -803,867,802, -867,803,868, -804,868,803, -868,804,869, -805,869,804, -869,805,870, -806,870,805, -870,806,871, -807,871,806, -871,807,872, -808,872,807, -872,808,873, -809,873,808, -873,809,874, -810,874,809, -874,810,875, -811,875,810, -875,811,876, -812,876,811, -876,812,877, -813,877,812, -877,813,878, -814,878,813, -878,814,879, -815,879,814, -879,815,880, -816,880,815, -880,816,881, -817,881,816, -881,817,882, -818,882,817, -882,818,883, -819,883,818, -883,819,884, -820,884,819, -884,820,885, -821,885,820, -885,821,886, -822,886,821, -886,822,887, -823,887,822, -887,823,888, -824,888,823, -888,824,889, -825,889,824, -889,825,890, -826,890,825, -890,826,891, -827,891,826, -891,827,892, -828,892,827, -892,828,893, -829,893,828, -893,829,894, -830,894,829, -894,830,895, -831,895,830, -896,832,897, -833,897,832, -897,833,898, -834,898,833, -898,834,899, -835,899,834, -899,835,900, -836,900,835, -900,836,901, -837,901,836, -901,837,902, -838,902,837, -902,838,903, -839,903,838, -903,839,904, -840,904,839, -904,840,905, -841,905,840, -905,841,906, -842,906,841, -906,842,907, -843,907,842, -907,843,908, -844,908,843, -908,844,909, -845,909,844, -909,845,910, -846,910,845, -910,846,911, -847,911,846, -911,847,912, -848,912,847, -912,848,913, -849,913,848, -913,849,914, -850,914,849, -914,850,915, -851,915,850, -915,851,916, -852,916,851, -916,852,917, -853,917,852, -917,853,918, -854,918,853, -918,854,919, -855,919,854, -919,855,920, -856,920,855, -920,856,921, -857,921,856, -921,857,922, -858,922,857, -922,858,923, -859,923,858, -923,859,924, -860,924,859, -924,860,925, -861,925,860, -925,861,926, -862,926,861, -926,862,927, -863,927,862, -927,863,928, -864,928,863, -928,864,929, -865,929,864, -929,865,930, -866,930,865, -930,866,931, -867,931,866, -931,867,932, -868,932,867, -932,868,933, -869,933,868, -933,869,934, -870,934,869, -934,870,935, -871,935,870, -935,871,936, -872,936,871, -936,872,937, -873,937,872, -937,873,938, -874,938,873, -938,874,939, -875,939,874, -939,875,940, -876,940,875, -940,876,941, -877,941,876, -941,877,942, -878,942,877, -942,878,943, -879,943,878, -943,879,944, -880,944,879, -944,880,945, -881,945,880, -945,881,946, -882,946,881, -946,882,947, -883,947,882, -947,883,948, -884,948,883, -948,884,949, -885,949,884, -949,885,950, -886,950,885, -950,886,951, -887,951,886, -951,887,952, -888,952,887, -952,888,953, -889,953,888, -953,889,954, -890,954,889, -954,890,955, -891,955,890, -955,891,956, -892,956,891, -956,892,957, -893,957,892, -957,893,958, -894,958,893, -958,894,959, -895,959,894, -960,896,961, -897,961,896, -961,897,962, -898,962,897, -962,898,963, -899,963,898, -963,899,964, -900,964,899, -964,900,965, -901,965,900, -965,901,966, -902,966,901, -966,902,967, -903,967,902, -967,903,968, -904,968,903, -968,904,969, -905,969,904, -969,905,970, -906,970,905, -970,906,971, -907,971,906, -971,907,972, -908,972,907, -972,908,973, -909,973,908, -973,909,974, -910,974,909, -974,910,975, -911,975,910, -975,911,976, -912,976,911, -976,912,977, -913,977,912, -977,913,978, -914,978,913, -978,914,979, -915,979,914, -979,915,980, -916,980,915, -980,916,981, -917,981,916, -981,917,982, -918,982,917, -982,918,983, -919,983,918, -983,919,984, -920,984,919, -984,920,985, -921,985,920, -985,921,986, -922,986,921, -986,922,987, -923,987,922, -987,923,988, -924,988,923, -988,924,989, -925,989,924, -989,925,990, -926,990,925, -990,926,991, -927,991,926, -991,927,992, -928,992,927, -992,928,993, -929,993,928, -993,929,994, -930,994,929, -994,930,995, -931,995,930, -995,931,996, -932,996,931, -996,932,997, -933,997,932, -997,933,998, -934,998,933, -998,934,999, -935,999,934, -999,935,1000, -936,1000,935, -1000,936,1001, -937,1001,936, -1001,937,1002, -938,1002,937, -1002,938,1003, -939,1003,938, -1003,939,1004, -940,1004,939, -1004,940,1005, -941,1005,940, -1005,941,1006, -942,1006,941, -1006,942,1007, -943,1007,942, -1007,943,1008, -944,1008,943, -1008,944,1009, -945,1009,944, -1009,945,1010, -946,1010,945, -1010,946,1011, -947,1011,946, -1011,947,1012, -948,1012,947, -1012,948,1013, -949,1013,948, -1013,949,1014, -950,1014,949, -1014,950,1015, -951,1015,950, -1015,951,1016, -952,1016,951, -1016,952,1017, -953,1017,952, -1017,953,1018, -954,1018,953, -1018,954,1019, -955,1019,954, -1019,955,1020, -956,1020,955, -1020,956,1021, -957,1021,956, -1021,957,1022, -958,1022,957, -1022,958,1023, -959,1023,958, -1024,960,1025, -961,1025,960, -1025,961,1026, -962,1026,961, -1026,962,1027, -963,1027,962, -1027,963,1028, -964,1028,963, -1028,964,1029, -965,1029,964, -1029,965,1030, -966,1030,965, -1030,966,1031, -967,1031,966, -1031,967,1032, -968,1032,967, -1032,968,1033, -969,1033,968, -1033,969,1034, -970,1034,969, -1034,970,1035, -971,1035,970, -1035,971,1036, -972,1036,971, -1036,972,1037, -973,1037,972, -1037,973,1038, -974,1038,973, -1038,974,1039, -975,1039,974, -1039,975,1040, -976,1040,975, -1040,976,1041, -977,1041,976, -1041,977,1042, -978,1042,977, -1042,978,1043, -979,1043,978, -1043,979,1044, -980,1044,979, -1044,980,1045, -981,1045,980, -1045,981,1046, -982,1046,981, -1046,982,1047, -983,1047,982, -1047,983,1048, -984,1048,983, -1048,984,1049, -985,1049,984, -1049,985,1050, -986,1050,985, -1050,986,1051, -987,1051,986, -1051,987,1052, -988,1052,987, -1052,988,1053, -989,1053,988, -1053,989,1054, -990,1054,989, -1054,990,1055, -991,1055,990, -1055,991,1056, -992,1056,991, -1056,992,1057, -993,1057,992, -1057,993,1058, -994,1058,993, -1058,994,1059, -995,1059,994, -1059,995,1060, -996,1060,995, -1060,996,1061, -997,1061,996, -1061,997,1062, -998,1062,997, -1062,998,1063, -999,1063,998, -1063,999,1064, -1000,1064,999, -1064,1000,1065, -1001,1065,1000, -1065,1001,1066, -1002,1066,1001, -1066,1002,1067, -1003,1067,1002, -1067,1003,1068, -1004,1068,1003, -1068,1004,1069, -1005,1069,1004, -1069,1005,1070, -1006,1070,1005, -1070,1006,1071, -1007,1071,1006, -1071,1007,1072, -1008,1072,1007, -1072,1008,1073, -1009,1073,1008, -1073,1009,1074, -1010,1074,1009, -1074,1010,1075, -1011,1075,1010, -1075,1011,1076, -1012,1076,1011, -1076,1012,1077, -1013,1077,1012, -1077,1013,1078, -1014,1078,1013, -1078,1014,1079, -1015,1079,1014, -1079,1015,1080, -1016,1080,1015, -1080,1016,1081, -1017,1081,1016, -1081,1017,1082, -1018,1082,1017, -1082,1018,1083, -1019,1083,1018, -1083,1019,1084, -1020,1084,1019, -1084,1020,1085, -1021,1085,1020, -1085,1021,1086, -1022,1086,1021, -1086,1022,1087, -1023,1087,1022, -1088,1024,1089, -1025,1089,1024, -1089,1025,1090, -1026,1090,1025, -1090,1026,1091, -1027,1091,1026, -1091,1027,1092, -1028,1092,1027, -1092,1028,1093, -1029,1093,1028, -1093,1029,1094, -1030,1094,1029, -1094,1030,1095, -1031,1095,1030, -1095,1031,1096, -1032,1096,1031, -1096,1032,1097, -1033,1097,1032, -1097,1033,1098, -1034,1098,1033, -1098,1034,1099, -1035,1099,1034, -1099,1035,1100, -1036,1100,1035, -1100,1036,1101, -1037,1101,1036, -1101,1037,1102, -1038,1102,1037, -1102,1038,1103, -1039,1103,1038, -1103,1039,1104, -1040,1104,1039, -1104,1040,1105, -1041,1105,1040, -1105,1041,1106, -1042,1106,1041, -1106,1042,1107, -1043,1107,1042, -1107,1043,1108, -1044,1108,1043, -1108,1044,1109, -1045,1109,1044, -1109,1045,1110, -1046,1110,1045, -1110,1046,1111, -1047,1111,1046, -1111,1047,1112, -1048,1112,1047, -1112,1048,1113, -1049,1113,1048, -1113,1049,1114, -1050,1114,1049, -1114,1050,1115, -1051,1115,1050, -1115,1051,1116, -1052,1116,1051, -1116,1052,1117, -1053,1117,1052, -1117,1053,1118, -1054,1118,1053, -1118,1054,1119, -1055,1119,1054, -1119,1055,1120, -1056,1120,1055, -1120,1056,1121, -1057,1121,1056, -1121,1057,1122, -1058,1122,1057, -1122,1058,1123, -1059,1123,1058, -1123,1059,1124, -1060,1124,1059, -1124,1060,1125, -1061,1125,1060, -1125,1061,1126, -1062,1126,1061, -1126,1062,1127, -1063,1127,1062, -1127,1063,1128, -1064,1128,1063, -1128,1064,1129, -1065,1129,1064, -1129,1065,1130, -1066,1130,1065, -1130,1066,1131, -1067,1131,1066, -1131,1067,1132, -1068,1132,1067, -1132,1068,1133, -1069,1133,1068, -1133,1069,1134, -1070,1134,1069, -1134,1070,1135, -1071,1135,1070, -1135,1071,1136, -1072,1136,1071, -1136,1072,1137, -1073,1137,1072, -1137,1073,1138, -1074,1138,1073, -1138,1074,1139, -1075,1139,1074, -1139,1075,1140, -1076,1140,1075, -1140,1076,1141, -1077,1141,1076, -1141,1077,1142, -1078,1142,1077, -1142,1078,1143, -1079,1143,1078, -1143,1079,1144, -1080,1144,1079, -1144,1080,1145, -1081,1145,1080, -1145,1081,1146, -1082,1146,1081, -1146,1082,1147, -1083,1147,1082, -1147,1083,1148, -1084,1148,1083, -1148,1084,1149, -1085,1149,1084, -1149,1085,1150, -1086,1150,1085, -1150,1086,1151, -1087,1151,1086, -1152,1088,1153, -1089,1153,1088, -1153,1089,1154, -1090,1154,1089, -1154,1090,1155, -1091,1155,1090, -1155,1091,1156, -1092,1156,1091, -1156,1092,1157, -1093,1157,1092, -1157,1093,1158, -1094,1158,1093, -1158,1094,1159, -1095,1159,1094, -1159,1095,1160, -1096,1160,1095, -1160,1096,1161, -1097,1161,1096, -1161,1097,1162, -1098,1162,1097, -1162,1098,1163, -1099,1163,1098, -1163,1099,1164, -1100,1164,1099, -1164,1100,1165, -1101,1165,1100, -1165,1101,1166, -1102,1166,1101, -1166,1102,1167, -1103,1167,1102, -1167,1103,1168, -1104,1168,1103, -1168,1104,1169, -1105,1169,1104, -1169,1105,1170, -1106,1170,1105, -1170,1106,1171, -1107,1171,1106, -1171,1107,1172, -1108,1172,1107, -1172,1108,1173, -1109,1173,1108, -1173,1109,1174, -1110,1174,1109, -1174,1110,1175, -1111,1175,1110, -1175,1111,1176, -1112,1176,1111, -1176,1112,1177, -1113,1177,1112, -1177,1113,1178, -1114,1178,1113, -1178,1114,1179, -1115,1179,1114, -1179,1115,1180, -1116,1180,1115, -1180,1116,1181, -1117,1181,1116, -1181,1117,1182, -1118,1182,1117, -1182,1118,1183, -1119,1183,1118, -1183,1119,1184, -1120,1184,1119, -1184,1120,1185, -1121,1185,1120, -1185,1121,1186, -1122,1186,1121, -1186,1122,1187, -1123,1187,1122, -1187,1123,1188, -1124,1188,1123, -1188,1124,1189, -1125,1189,1124, -1189,1125,1190, -1126,1190,1125, -1190,1126,1191, -1127,1191,1126, -1191,1127,1192, -1128,1192,1127, -1192,1128,1193, -1129,1193,1128, -1193,1129,1194, -1130,1194,1129, -1194,1130,1195, -1131,1195,1130, -1195,1131,1196, -1132,1196,1131, -1196,1132,1197, -1133,1197,1132, -1197,1133,1198, -1134,1198,1133, -1198,1134,1199, -1135,1199,1134, -1199,1135,1200, -1136,1200,1135, -1200,1136,1201, -1137,1201,1136, -1201,1137,1202, -1138,1202,1137, -1202,1138,1203, -1139,1203,1138, -1203,1139,1204, -1140,1204,1139, -1204,1140,1205, -1141,1205,1140, -1205,1141,1206, -1142,1206,1141, -1206,1142,1207, -1143,1207,1142, -1207,1143,1208, -1144,1208,1143, -1208,1144,1209, -1145,1209,1144, -1209,1145,1210, -1146,1210,1145, -1210,1146,1211, -1147,1211,1146, -1211,1147,1212, -1148,1212,1147, -1212,1148,1213, -1149,1213,1148, -1213,1149,1214, -1150,1214,1149, -1214,1150,1215, -1151,1215,1150, -1216,1152,1217, -1153,1217,1152, -1217,1153,1218, -1154,1218,1153, -1218,1154,1219, -1155,1219,1154, -1219,1155,1220, -1156,1220,1155, -1220,1156,1221, -1157,1221,1156, -1221,1157,1222, -1158,1222,1157, -1222,1158,1223, -1159,1223,1158, -1223,1159,1224, -1160,1224,1159, -1224,1160,1225, -1161,1225,1160, -1225,1161,1226, -1162,1226,1161, -1226,1162,1227, -1163,1227,1162, -1227,1163,1228, -1164,1228,1163, -1228,1164,1229, -1165,1229,1164, -1229,1165,1230, -1166,1230,1165, -1230,1166,1231, -1167,1231,1166, -1231,1167,1232, -1168,1232,1167, -1232,1168,1233, -1169,1233,1168, -1233,1169,1234, -1170,1234,1169, -1234,1170,1235, -1171,1235,1170, -1235,1171,1236, -1172,1236,1171, -1236,1172,1237, -1173,1237,1172, -1237,1173,1238, -1174,1238,1173, -1238,1174,1239, -1175,1239,1174, -1239,1175,1240, -1176,1240,1175, -1240,1176,1241, -1177,1241,1176, -1241,1177,1242, -1178,1242,1177, -1242,1178,1243, -1179,1243,1178, -1243,1179,1244, -1180,1244,1179, -1244,1180,1245, -1181,1245,1180, -1245,1181,1246, -1182,1246,1181, -1246,1182,1247, -1183,1247,1182, -1247,1183,1248, -1184,1248,1183, -1248,1184,1249, -1185,1249,1184, -1249,1185,1250, -1186,1250,1185, -1250,1186,1251, -1187,1251,1186, -1251,1187,1252, -1188,1252,1187, -1252,1188,1253, -1189,1253,1188, -1253,1189,1254, -1190,1254,1189, -1254,1190,1255, -1191,1255,1190, -1255,1191,1256, -1192,1256,1191, -1256,1192,1257, -1193,1257,1192, -1257,1193,1258, -1194,1258,1193, -1258,1194,1259, -1195,1259,1194, -1259,1195,1260, -1196,1260,1195, -1260,1196,1261, -1197,1261,1196, -1261,1197,1262, -1198,1262,1197, -1262,1198,1263, -1199,1263,1198, -1263,1199,1264, -1200,1264,1199, -1264,1200,1265, -1201,1265,1200, -1265,1201,1266, -1202,1266,1201, -1266,1202,1267, -1203,1267,1202, -1267,1203,1268, -1204,1268,1203, -1268,1204,1269, -1205,1269,1204, -1269,1205,1270, -1206,1270,1205, -1270,1206,1271, -1207,1271,1206, -1271,1207,1272, -1208,1272,1207, -1272,1208,1273, -1209,1273,1208, -1273,1209,1274, -1210,1274,1209, -1274,1210,1275, -1211,1275,1210, -1275,1211,1276, -1212,1276,1211, -1276,1212,1277, -1213,1277,1212, -1277,1213,1278, -1214,1278,1213, -1278,1214,1279, -1215,1279,1214, -1280,1216,1281, -1217,1281,1216, -1281,1217,1282, -1218,1282,1217, -1282,1218,1283, -1219,1283,1218, -1283,1219,1284, -1220,1284,1219, -1284,1220,1285, -1221,1285,1220, -1285,1221,1286, -1222,1286,1221, -1286,1222,1287, -1223,1287,1222, -1287,1223,1288, -1224,1288,1223, -1288,1224,1289, -1225,1289,1224, -1289,1225,1290, -1226,1290,1225, -1290,1226,1291, -1227,1291,1226, -1291,1227,1292, -1228,1292,1227, -1292,1228,1293, -1229,1293,1228, -1293,1229,1294, -1230,1294,1229, -1294,1230,1295, -1231,1295,1230, -1295,1231,1296, -1232,1296,1231, -1296,1232,1297, -1233,1297,1232, -1297,1233,1298, -1234,1298,1233, -1298,1234,1299, -1235,1299,1234, -1299,1235,1300, -1236,1300,1235, -1300,1236,1301, -1237,1301,1236, -1301,1237,1302, -1238,1302,1237, -1302,1238,1303, -1239,1303,1238, -1303,1239,1304, -1240,1304,1239, -1304,1240,1305, -1241,1305,1240, -1305,1241,1306, -1242,1306,1241, -1306,1242,1307, -1243,1307,1242, -1307,1243,1308, -1244,1308,1243, -1308,1244,1309, -1245,1309,1244, -1309,1245,1310, -1246,1310,1245, -1310,1246,1311, -1247,1311,1246, -1311,1247,1312, -1248,1312,1247, -1312,1248,1313, -1249,1313,1248, -1313,1249,1314, -1250,1314,1249, -1314,1250,1315, -1251,1315,1250, -1315,1251,1316, -1252,1316,1251, -1316,1252,1317, -1253,1317,1252, -1317,1253,1318, -1254,1318,1253, -1318,1254,1319, -1255,1319,1254, -1319,1255,1320, -1256,1320,1255, -1320,1256,1321, -1257,1321,1256, -1321,1257,1322, -1258,1322,1257, -1322,1258,1323, -1259,1323,1258, -1323,1259,1324, -1260,1324,1259, -1324,1260,1325, -1261,1325,1260, -1325,1261,1326, -1262,1326,1261, -1326,1262,1327, -1263,1327,1262, -1327,1263,1328, -1264,1328,1263, -1328,1264,1329, -1265,1329,1264, -1329,1265,1330, -1266,1330,1265, -1330,1266,1331, -1267,1331,1266, -1331,1267,1332, -1268,1332,1267, -1332,1268,1333, -1269,1333,1268, -1333,1269,1334, -1270,1334,1269, -1334,1270,1335, -1271,1335,1270, -1335,1271,1336, -1272,1336,1271, -1336,1272,1337, -1273,1337,1272, -1337,1273,1338, -1274,1338,1273, -1338,1274,1339, -1275,1339,1274, -1339,1275,1340, -1276,1340,1275, -1340,1276,1341, -1277,1341,1276, -1341,1277,1342, -1278,1342,1277, -1342,1278,1343, -1279,1343,1278, -1344,1280,1345, -1281,1345,1280, -1345,1281,1346, -1282,1346,1281, -1346,1282,1347, -1283,1347,1282, -1347,1283,1348, -1284,1348,1283, -1348,1284,1349, -1285,1349,1284, -1349,1285,1350, -1286,1350,1285, -1350,1286,1351, -1287,1351,1286, -1351,1287,1352, -1288,1352,1287, -1352,1288,1353, -1289,1353,1288, -1353,1289,1354, -1290,1354,1289, -1354,1290,1355, -1291,1355,1290, -1355,1291,1356, -1292,1356,1291, -1356,1292,1357, -1293,1357,1292, -1357,1293,1358, -1294,1358,1293, -1358,1294,1359, -1295,1359,1294, -1359,1295,1360, -1296,1360,1295, -1360,1296,1361, -1297,1361,1296, -1361,1297,1362, -1298,1362,1297, -1362,1298,1363, -1299,1363,1298, -1363,1299,1364, -1300,1364,1299, -1364,1300,1365, -1301,1365,1300, -1365,1301,1366, -1302,1366,1301, -1366,1302,1367, -1303,1367,1302, -1367,1303,1368, -1304,1368,1303, -1368,1304,1369, -1305,1369,1304, -1369,1305,1370, -1306,1370,1305, -1370,1306,1371, -1307,1371,1306, -1371,1307,1372, -1308,1372,1307, -1372,1308,1373, -1309,1373,1308, -1373,1309,1374, -1310,1374,1309, -1374,1310,1375, -1311,1375,1310, -1375,1311,1376, -1312,1376,1311, -1376,1312,1377, -1313,1377,1312, -1377,1313,1378, -1314,1378,1313, -1378,1314,1379, -1315,1379,1314, -1379,1315,1380, -1316,1380,1315, -1380,1316,1381, -1317,1381,1316, -1381,1317,1382, -1318,1382,1317, -1382,1318,1383, -1319,1383,1318, -1383,1319,1384, -1320,1384,1319, -1384,1320,1385, -1321,1385,1320, -1385,1321,1386, -1322,1386,1321, -1386,1322,1387, -1323,1387,1322, -1387,1323,1388, -1324,1388,1323, -1388,1324,1389, -1325,1389,1324, -1389,1325,1390, -1326,1390,1325, -1390,1326,1391, -1327,1391,1326, -1391,1327,1392, -1328,1392,1327, -1392,1328,1393, -1329,1393,1328, -1393,1329,1394, -1330,1394,1329, -1394,1330,1395, -1331,1395,1330, -1395,1331,1396, -1332,1396,1331, -1396,1332,1397, -1333,1397,1332, -1397,1333,1398, -1334,1398,1333, -1398,1334,1399, -1335,1399,1334, -1399,1335,1400, -1336,1400,1335, -1400,1336,1401, -1337,1401,1336, -1401,1337,1402, -1338,1402,1337, -1402,1338,1403, -1339,1403,1338, -1403,1339,1404, -1340,1404,1339, -1404,1340,1405, -1341,1405,1340, -1405,1341,1406, -1342,1406,1341, -1406,1342,1407, -1343,1407,1342, -1408,1344,1409, -1345,1409,1344, -1409,1345,1410, -1346,1410,1345, -1410,1346,1411, -1347,1411,1346, -1411,1347,1412, -1348,1412,1347, -1412,1348,1413, -1349,1413,1348, -1413,1349,1414, -1350,1414,1349, -1414,1350,1415, -1351,1415,1350, -1415,1351,1416, -1352,1416,1351, -1416,1352,1417, -1353,1417,1352, -1417,1353,1418, -1354,1418,1353, -1418,1354,1419, -1355,1419,1354, -1419,1355,1420, -1356,1420,1355, -1420,1356,1421, -1357,1421,1356, -1421,1357,1422, -1358,1422,1357, -1422,1358,1423, -1359,1423,1358, -1423,1359,1424, -1360,1424,1359, -1424,1360,1425, -1361,1425,1360, -1425,1361,1426, -1362,1426,1361, -1426,1362,1427, -1363,1427,1362, -1427,1363,1428, -1364,1428,1363, -1428,1364,1429, -1365,1429,1364, -1429,1365,1430, -1366,1430,1365, -1430,1366,1431, -1367,1431,1366, -1431,1367,1432, -1368,1432,1367, -1432,1368,1433, -1369,1433,1368, -1433,1369,1434, -1370,1434,1369, -1434,1370,1435, -1371,1435,1370, -1435,1371,1436, -1372,1436,1371, -1436,1372,1437, -1373,1437,1372, -1437,1373,1438, -1374,1438,1373, -1438,1374,1439, -1375,1439,1374, -1439,1375,1440, -1376,1440,1375, -1440,1376,1441, -1377,1441,1376, -1441,1377,1442, -1378,1442,1377, -1442,1378,1443, -1379,1443,1378, -1443,1379,1444, -1380,1444,1379, -1444,1380,1445, -1381,1445,1380, -1445,1381,1446, -1382,1446,1381, -1446,1382,1447, -1383,1447,1382, -1447,1383,1448, -1384,1448,1383, -1448,1384,1449, -1385,1449,1384, -1449,1385,1450, -1386,1450,1385, -1450,1386,1451, -1387,1451,1386, -1451,1387,1452, -1388,1452,1387, -1452,1388,1453, -1389,1453,1388, -1453,1389,1454, -1390,1454,1389, -1454,1390,1455, -1391,1455,1390, -1455,1391,1456, -1392,1456,1391, -1456,1392,1457, -1393,1457,1392, -1457,1393,1458, -1394,1458,1393, -1458,1394,1459, -1395,1459,1394, -1459,1395,1460, -1396,1460,1395, -1460,1396,1461, -1397,1461,1396, -1461,1397,1462, -1398,1462,1397, -1462,1398,1463, -1399,1463,1398, -1463,1399,1464, -1400,1464,1399, -1464,1400,1465, -1401,1465,1400, -1465,1401,1466, -1402,1466,1401, -1466,1402,1467, -1403,1467,1402, -1467,1403,1468, -1404,1468,1403, -1468,1404,1469, -1405,1469,1404, -1469,1405,1470, -1406,1470,1405, -1470,1406,1471, -1407,1471,1406, -1472,1408,1473, -1409,1473,1408, -1473,1409,1474, -1410,1474,1409, -1474,1410,1475, -1411,1475,1410, -1475,1411,1476, -1412,1476,1411, -1476,1412,1477, -1413,1477,1412, -1477,1413,1478, -1414,1478,1413, -1478,1414,1479, -1415,1479,1414, -1479,1415,1480, -1416,1480,1415, -1480,1416,1481, -1417,1481,1416, -1481,1417,1482, -1418,1482,1417, -1482,1418,1483, -1419,1483,1418, -1483,1419,1484, -1420,1484,1419, -1484,1420,1485, -1421,1485,1420, -1485,1421,1486, -1422,1486,1421, -1486,1422,1487, -1423,1487,1422, -1487,1423,1488, -1424,1488,1423, -1488,1424,1489, -1425,1489,1424, -1489,1425,1490, -1426,1490,1425, -1490,1426,1491, -1427,1491,1426, -1491,1427,1492, -1428,1492,1427, -1492,1428,1493, -1429,1493,1428, -1493,1429,1494, -1430,1494,1429, -1494,1430,1495, -1431,1495,1430, -1495,1431,1496, -1432,1496,1431, -1496,1432,1497, -1433,1497,1432, -1497,1433,1498, -1434,1498,1433, -1498,1434,1499, -1435,1499,1434, -1499,1435,1500, -1436,1500,1435, -1500,1436,1501, -1437,1501,1436, -1501,1437,1502, -1438,1502,1437, -1502,1438,1503, -1439,1503,1438, -1503,1439,1504, -1440,1504,1439, -1504,1440,1505, -1441,1505,1440, -1505,1441,1506, -1442,1506,1441, -1506,1442,1507, -1443,1507,1442, -1507,1443,1508, -1444,1508,1443, -1508,1444,1509, -1445,1509,1444, -1509,1445,1510, -1446,1510,1445, -1510,1446,1511, -1447,1511,1446, -1511,1447,1512, -1448,1512,1447, -1512,1448,1513, -1449,1513,1448, -1513,1449,1514, -1450,1514,1449, -1514,1450,1515, -1451,1515,1450, -1515,1451,1516, -1452,1516,1451, -1516,1452,1517, -1453,1517,1452, -1517,1453,1518, -1454,1518,1453, -1518,1454,1519, -1455,1519,1454, -1519,1455,1520, -1456,1520,1455, -1520,1456,1521, -1457,1521,1456, -1521,1457,1522, -1458,1522,1457, -1522,1458,1523, -1459,1523,1458, -1523,1459,1524, -1460,1524,1459, -1524,1460,1525, -1461,1525,1460, -1525,1461,1526, -1462,1526,1461, -1526,1462,1527, -1463,1527,1462, -1527,1463,1528, -1464,1528,1463, -1528,1464,1529, -1465,1529,1464, -1529,1465,1530, -1466,1530,1465, -1530,1466,1531, -1467,1531,1466, -1531,1467,1532, -1468,1532,1467, -1532,1468,1533, -1469,1533,1468, -1533,1469,1534, -1470,1534,1469, -1534,1470,1535, -1471,1535,1470, -1536,1472,1537, -1473,1537,1472, -1537,1473,1538, -1474,1538,1473, -1538,1474,1539, -1475,1539,1474, -1539,1475,1540, -1476,1540,1475, -1540,1476,1541, -1477,1541,1476, -1541,1477,1542, -1478,1542,1477, -1542,1478,1543, -1479,1543,1478, -1543,1479,1544, -1480,1544,1479, -1544,1480,1545, -1481,1545,1480, -1545,1481,1546, -1482,1546,1481, -1546,1482,1547, -1483,1547,1482, -1547,1483,1548, -1484,1548,1483, -1548,1484,1549, -1485,1549,1484, -1549,1485,1550, -1486,1550,1485, -1550,1486,1551, -1487,1551,1486, -1551,1487,1552, -1488,1552,1487, -1552,1488,1553, -1489,1553,1488, -1553,1489,1554, -1490,1554,1489, -1554,1490,1555, -1491,1555,1490, -1555,1491,1556, -1492,1556,1491, -1556,1492,1557, -1493,1557,1492, -1557,1493,1558, -1494,1558,1493, -1558,1494,1559, -1495,1559,1494, -1559,1495,1560, -1496,1560,1495, -1560,1496,1561, -1497,1561,1496, -1561,1497,1562, -1498,1562,1497, -1562,1498,1563, -1499,1563,1498, -1563,1499,1564, -1500,1564,1499, -1564,1500,1565, -1501,1565,1500, -1565,1501,1566, -1502,1566,1501, -1566,1502,1567, -1503,1567,1502, -1567,1503,1568, -1504,1568,1503, -1568,1504,1569, -1505,1569,1504, -1569,1505,1570, -1506,1570,1505, -1570,1506,1571, -1507,1571,1506, -1571,1507,1572, -1508,1572,1507, -1572,1508,1573, -1509,1573,1508, -1573,1509,1574, -1510,1574,1509, -1574,1510,1575, -1511,1575,1510, -1575,1511,1576, -1512,1576,1511, -1576,1512,1577, -1513,1577,1512, -1577,1513,1578, -1514,1578,1513, -1578,1514,1579, -1515,1579,1514, -1579,1515,1580, -1516,1580,1515, -1580,1516,1581, -1517,1581,1516, -1581,1517,1582, -1518,1582,1517, -1582,1518,1583, -1519,1583,1518, -1583,1519,1584, -1520,1584,1519, -1584,1520,1585, -1521,1585,1520, -1585,1521,1586, -1522,1586,1521, -1586,1522,1587, -1523,1587,1522, -1587,1523,1588, -1524,1588,1523, -1588,1524,1589, -1525,1589,1524, -1589,1525,1590, -1526,1590,1525, -1590,1526,1591, -1527,1591,1526, -1591,1527,1592, -1528,1592,1527, -1592,1528,1593, -1529,1593,1528, -1593,1529,1594, -1530,1594,1529, -1594,1530,1595, -1531,1595,1530, -1595,1531,1596, -1532,1596,1531, -1596,1532,1597, -1533,1597,1532, -1597,1533,1598, -1534,1598,1533, -1598,1534,1599, -1535,1599,1534, -1600,1536,1601, -1537,1601,1536, -1601,1537,1602, -1538,1602,1537, -1602,1538,1603, -1539,1603,1538, -1603,1539,1604, -1540,1604,1539, -1604,1540,1605, -1541,1605,1540, -1605,1541,1606, -1542,1606,1541, -1606,1542,1607, -1543,1607,1542, -1607,1543,1608, -1544,1608,1543, -1608,1544,1609, -1545,1609,1544, -1609,1545,1610, -1546,1610,1545, -1610,1546,1611, -1547,1611,1546, -1611,1547,1612, -1548,1612,1547, -1612,1548,1613, -1549,1613,1548, -1613,1549,1614, -1550,1614,1549, -1614,1550,1615, -1551,1615,1550, -1615,1551,1616, -1552,1616,1551, -1616,1552,1617, -1553,1617,1552, -1617,1553,1618, -1554,1618,1553, -1618,1554,1619, -1555,1619,1554, -1619,1555,1620, -1556,1620,1555, -1620,1556,1621, -1557,1621,1556, -1621,1557,1622, -1558,1622,1557, -1622,1558,1623, -1559,1623,1558, -1623,1559,1624, -1560,1624,1559, -1624,1560,1625, -1561,1625,1560, -1625,1561,1626, -1562,1626,1561, -1626,1562,1627, -1563,1627,1562, -1627,1563,1628, -1564,1628,1563, -1628,1564,1629, -1565,1629,1564, -1629,1565,1630, -1566,1630,1565, -1630,1566,1631, -1567,1631,1566, -1631,1567,1632, -1568,1632,1567, -1632,1568,1633, -1569,1633,1568, -1633,1569,1634, -1570,1634,1569, -1634,1570,1635, -1571,1635,1570, -1635,1571,1636, -1572,1636,1571, -1636,1572,1637, -1573,1637,1572, -1637,1573,1638, -1574,1638,1573, -1638,1574,1639, -1575,1639,1574, -1639,1575,1640, -1576,1640,1575, -1640,1576,1641, -1577,1641,1576, -1641,1577,1642, -1578,1642,1577, -1642,1578,1643, -1579,1643,1578, -1643,1579,1644, -1580,1644,1579, -1644,1580,1645, -1581,1645,1580, -1645,1581,1646, -1582,1646,1581, -1646,1582,1647, -1583,1647,1582, -1647,1583,1648, -1584,1648,1583, -1648,1584,1649, -1585,1649,1584, -1649,1585,1650, -1586,1650,1585, -1650,1586,1651, -1587,1651,1586, -1651,1587,1652, -1588,1652,1587, -1652,1588,1653, -1589,1653,1588, -1653,1589,1654, -1590,1654,1589, -1654,1590,1655, -1591,1655,1590, -1655,1591,1656, -1592,1656,1591, -1656,1592,1657, -1593,1657,1592, -1657,1593,1658, -1594,1658,1593, -1658,1594,1659, -1595,1659,1594, -1659,1595,1660, -1596,1660,1595, -1660,1596,1661, -1597,1661,1596, -1661,1597,1662, -1598,1662,1597, -1662,1598,1663, -1599,1663,1598, -1664,1600,1665, -1601,1665,1600, -1665,1601,1666, -1602,1666,1601, -1666,1602,1667, -1603,1667,1602, -1667,1603,1668, -1604,1668,1603, -1668,1604,1669, -1605,1669,1604, -1669,1605,1670, -1606,1670,1605, -1670,1606,1671, -1607,1671,1606, -1671,1607,1672, -1608,1672,1607, -1672,1608,1673, -1609,1673,1608, -1673,1609,1674, -1610,1674,1609, -1674,1610,1675, -1611,1675,1610, -1675,1611,1676, -1612,1676,1611, -1676,1612,1677, -1613,1677,1612, -1677,1613,1678, -1614,1678,1613, -1678,1614,1679, -1615,1679,1614, -1679,1615,1680, -1616,1680,1615, -1680,1616,1681, -1617,1681,1616, -1681,1617,1682, -1618,1682,1617, -1682,1618,1683, -1619,1683,1618, -1683,1619,1684, -1620,1684,1619, -1684,1620,1685, -1621,1685,1620, -1685,1621,1686, -1622,1686,1621, -1686,1622,1687, -1623,1687,1622, -1687,1623,1688, -1624,1688,1623, -1688,1624,1689, -1625,1689,1624, -1689,1625,1690, -1626,1690,1625, -1690,1626,1691, -1627,1691,1626, -1691,1627,1692, -1628,1692,1627, -1692,1628,1693, -1629,1693,1628, -1693,1629,1694, -1630,1694,1629, -1694,1630,1695, -1631,1695,1630, -1695,1631,1696, -1632,1696,1631, -1696,1632,1697, -1633,1697,1632, -1697,1633,1698, -1634,1698,1633, -1698,1634,1699, -1635,1699,1634, -1699,1635,1700, -1636,1700,1635, -1700,1636,1701, -1637,1701,1636, -1701,1637,1702, -1638,1702,1637, -1702,1638,1703, -1639,1703,1638, -1703,1639,1704, -1640,1704,1639, -1704,1640,1705, -1641,1705,1640, -1705,1641,1706, -1642,1706,1641, -1706,1642,1707, -1643,1707,1642, -1707,1643,1708, -1644,1708,1643, -1708,1644,1709, -1645,1709,1644, -1709,1645,1710, -1646,1710,1645, -1710,1646,1711, -1647,1711,1646, -1711,1647,1712, -1648,1712,1647, -1712,1648,1713, -1649,1713,1648, -1713,1649,1714, -1650,1714,1649, -1714,1650,1715, -1651,1715,1650, -1715,1651,1716, -1652,1716,1651, -1716,1652,1717, -1653,1717,1652, -1717,1653,1718, -1654,1718,1653, -1718,1654,1719, -1655,1719,1654, -1719,1655,1720, -1656,1720,1655, -1720,1656,1721, -1657,1721,1656, -1721,1657,1722, -1658,1722,1657, -1722,1658,1723, -1659,1723,1658, -1723,1659,1724, -1660,1724,1659, -1724,1660,1725, -1661,1725,1660, -1725,1661,1726, -1662,1726,1661, -1726,1662,1727, -1663,1727,1662, -1728,1664,1729, -1665,1729,1664, -1729,1665,1730, -1666,1730,1665, -1730,1666,1731, -1667,1731,1666, -1731,1667,1732, -1668,1732,1667, -1732,1668,1733, -1669,1733,1668, -1733,1669,1734, -1670,1734,1669, -1734,1670,1735, -1671,1735,1670, -1735,1671,1736, -1672,1736,1671, -1736,1672,1737, -1673,1737,1672, -1737,1673,1738, -1674,1738,1673, -1738,1674,1739, -1675,1739,1674, -1739,1675,1740, -1676,1740,1675, -1740,1676,1741, -1677,1741,1676, -1741,1677,1742, -1678,1742,1677, -1742,1678,1743, -1679,1743,1678, -1743,1679,1744, -1680,1744,1679, -1744,1680,1745, -1681,1745,1680, -1745,1681,1746, -1682,1746,1681, -1746,1682,1747, -1683,1747,1682, -1747,1683,1748, -1684,1748,1683, -1748,1684,1749, -1685,1749,1684, -1749,1685,1750, -1686,1750,1685, -1750,1686,1751, -1687,1751,1686, -1751,1687,1752, -1688,1752,1687, -1752,1688,1753, -1689,1753,1688, -1753,1689,1754, -1690,1754,1689, -1754,1690,1755, -1691,1755,1690, -1755,1691,1756, -1692,1756,1691, -1756,1692,1757, -1693,1757,1692, -1757,1693,1758, -1694,1758,1693, -1758,1694,1759, -1695,1759,1694, -1759,1695,1760, -1696,1760,1695, -1760,1696,1761, -1697,1761,1696, -1761,1697,1762, -1698,1762,1697, -1762,1698,1763, -1699,1763,1698, -1763,1699,1764, -1700,1764,1699, -1764,1700,1765, -1701,1765,1700, -1765,1701,1766, -1702,1766,1701, -1766,1702,1767, -1703,1767,1702, -1767,1703,1768, -1704,1768,1703, -1768,1704,1769, -1705,1769,1704, -1769,1705,1770, -1706,1770,1705, -1770,1706,1771, -1707,1771,1706, -1771,1707,1772, -1708,1772,1707, -1772,1708,1773, -1709,1773,1708, -1773,1709,1774, -1710,1774,1709, -1774,1710,1775, -1711,1775,1710, -1775,1711,1776, -1712,1776,1711, -1776,1712,1777, -1713,1777,1712, -1777,1713,1778, -1714,1778,1713, -1778,1714,1779, -1715,1779,1714, -1779,1715,1780, -1716,1780,1715, -1780,1716,1781, -1717,1781,1716, -1781,1717,1782, -1718,1782,1717, -1782,1718,1783, -1719,1783,1718, -1783,1719,1784, -1720,1784,1719, -1784,1720,1785, -1721,1785,1720, -1785,1721,1786, -1722,1786,1721, -1786,1722,1787, -1723,1787,1722, -1787,1723,1788, -1724,1788,1723, -1788,1724,1789, -1725,1789,1724, -1789,1725,1790, -1726,1790,1725, -1790,1726,1791, -1727,1791,1726, -1792,1728,1793, -1729,1793,1728, -1793,1729,1794, -1730,1794,1729, -1794,1730,1795, -1731,1795,1730, -1795,1731,1796, -1732,1796,1731, -1796,1732,1797, -1733,1797,1732, -1797,1733,1798, -1734,1798,1733, -1798,1734,1799, -1735,1799,1734, -1799,1735,1800, -1736,1800,1735, -1800,1736,1801, -1737,1801,1736, -1801,1737,1802, -1738,1802,1737, -1802,1738,1803, -1739,1803,1738, -1803,1739,1804, -1740,1804,1739, -1804,1740,1805, -1741,1805,1740, -1805,1741,1806, -1742,1806,1741, -1806,1742,1807, -1743,1807,1742, -1807,1743,1808, -1744,1808,1743, -1808,1744,1809, -1745,1809,1744, -1809,1745,1810, -1746,1810,1745, -1810,1746,1811, -1747,1811,1746, -1811,1747,1812, -1748,1812,1747, -1812,1748,1813, -1749,1813,1748, -1813,1749,1814, -1750,1814,1749, -1814,1750,1815, -1751,1815,1750, -1815,1751,1816, -1752,1816,1751, -1816,1752,1817, -1753,1817,1752, -1817,1753,1818, -1754,1818,1753, -1818,1754,1819, -1755,1819,1754, -1819,1755,1820, -1756,1820,1755, -1820,1756,1821, -1757,1821,1756, -1821,1757,1822, -1758,1822,1757, -1822,1758,1823, -1759,1823,1758, -1823,1759,1824, -1760,1824,1759, -1824,1760,1825, -1761,1825,1760, -1825,1761,1826, -1762,1826,1761, -1826,1762,1827, -1763,1827,1762, -1827,1763,1828, -1764,1828,1763, -1828,1764,1829, -1765,1829,1764, -1829,1765,1830, -1766,1830,1765, -1830,1766,1831, -1767,1831,1766, -1831,1767,1832, -1768,1832,1767, -1832,1768,1833, -1769,1833,1768, -1833,1769,1834, -1770,1834,1769, -1834,1770,1835, -1771,1835,1770, -1835,1771,1836, -1772,1836,1771, -1836,1772,1837, -1773,1837,1772, -1837,1773,1838, -1774,1838,1773, -1838,1774,1839, -1775,1839,1774, -1839,1775,1840, -1776,1840,1775, -1840,1776,1841, -1777,1841,1776, -1841,1777,1842, -1778,1842,1777, -1842,1778,1843, -1779,1843,1778, -1843,1779,1844, -1780,1844,1779, -1844,1780,1845, -1781,1845,1780, -1845,1781,1846, -1782,1846,1781, -1846,1782,1847, -1783,1847,1782, -1847,1783,1848, -1784,1848,1783, -1848,1784,1849, -1785,1849,1784, -1849,1785,1850, -1786,1850,1785, -1850,1786,1851, -1787,1851,1786, -1851,1787,1852, -1788,1852,1787, -1852,1788,1853, -1789,1853,1788, -1853,1789,1854, -1790,1854,1789, -1854,1790,1855, -1791,1855,1790, -1856,1792,1857, -1793,1857,1792, -1857,1793,1858, -1794,1858,1793, -1858,1794,1859, -1795,1859,1794, -1859,1795,1860, -1796,1860,1795, -1860,1796,1861, -1797,1861,1796, -1861,1797,1862, -1798,1862,1797, -1862,1798,1863, -1799,1863,1798, -1863,1799,1864, -1800,1864,1799, -1864,1800,1865, -1801,1865,1800, -1865,1801,1866, -1802,1866,1801, -1866,1802,1867, -1803,1867,1802, -1867,1803,1868, -1804,1868,1803, -1868,1804,1869, -1805,1869,1804, -1869,1805,1870, -1806,1870,1805, -1870,1806,1871, -1807,1871,1806, -1871,1807,1872, -1808,1872,1807, -1872,1808,1873, -1809,1873,1808, -1873,1809,1874, -1810,1874,1809, -1874,1810,1875, -1811,1875,1810, -1875,1811,1876, -1812,1876,1811, -1876,1812,1877, -1813,1877,1812, -1877,1813,1878, -1814,1878,1813, -1878,1814,1879, -1815,1879,1814, -1879,1815,1880, -1816,1880,1815, -1880,1816,1881, -1817,1881,1816, -1881,1817,1882, -1818,1882,1817, -1882,1818,1883, -1819,1883,1818, -1883,1819,1884, -1820,1884,1819, -1884,1820,1885, -1821,1885,1820, -1885,1821,1886, -1822,1886,1821, -1886,1822,1887, -1823,1887,1822, -1887,1823,1888, -1824,1888,1823, -1888,1824,1889, -1825,1889,1824, -1889,1825,1890, -1826,1890,1825, -1890,1826,1891, -1827,1891,1826, -1891,1827,1892, -1828,1892,1827, -1892,1828,1893, -1829,1893,1828, -1893,1829,1894, -1830,1894,1829, -1894,1830,1895, -1831,1895,1830, -1895,1831,1896, -1832,1896,1831, -1896,1832,1897, -1833,1897,1832, -1897,1833,1898, -1834,1898,1833, -1898,1834,1899, -1835,1899,1834, -1899,1835,1900, -1836,1900,1835, -1900,1836,1901, -1837,1901,1836, -1901,1837,1902, -1838,1902,1837, -1902,1838,1903, -1839,1903,1838, -1903,1839,1904, -1840,1904,1839, -1904,1840,1905, -1841,1905,1840, -1905,1841,1906, -1842,1906,1841, -1906,1842,1907, -1843,1907,1842, -1907,1843,1908, -1844,1908,1843, -1908,1844,1909, -1845,1909,1844, -1909,1845,1910, -1846,1910,1845, -1910,1846,1911, -1847,1911,1846, -1911,1847,1912, -1848,1912,1847, -1912,1848,1913, -1849,1913,1848, -1913,1849,1914, -1850,1914,1849, -1914,1850,1915, -1851,1915,1850, -1915,1851,1916, -1852,1916,1851, -1916,1852,1917, -1853,1917,1852, -1917,1853,1918, -1854,1918,1853, -1918,1854,1919, -1855,1919,1854, -1920,1856,1921, -1857,1921,1856, -1921,1857,1922, -1858,1922,1857, -1922,1858,1923, -1859,1923,1858, -1923,1859,1924, -1860,1924,1859, -1924,1860,1925, -1861,1925,1860, -1925,1861,1926, -1862,1926,1861, -1926,1862,1927, -1863,1927,1862, -1927,1863,1928, -1864,1928,1863, -1928,1864,1929, -1865,1929,1864, -1929,1865,1930, -1866,1930,1865, -1930,1866,1931, -1867,1931,1866, -1931,1867,1932, -1868,1932,1867, -1932,1868,1933, -1869,1933,1868, -1933,1869,1934, -1870,1934,1869, -1934,1870,1935, -1871,1935,1870, -1935,1871,1936, -1872,1936,1871, -1936,1872,1937, -1873,1937,1872, -1937,1873,1938, -1874,1938,1873, -1938,1874,1939, -1875,1939,1874, -1939,1875,1940, -1876,1940,1875, -1940,1876,1941, -1877,1941,1876, -1941,1877,1942, -1878,1942,1877, -1942,1878,1943, -1879,1943,1878, -1943,1879,1944, -1880,1944,1879, -1944,1880,1945, -1881,1945,1880, -1945,1881,1946, -1882,1946,1881, -1946,1882,1947, -1883,1947,1882, -1947,1883,1948, -1884,1948,1883, -1948,1884,1949, -1885,1949,1884, -1949,1885,1950, -1886,1950,1885, -1950,1886,1951, -1887,1951,1886, -1951,1887,1952, -1888,1952,1887, -1952,1888,1953, -1889,1953,1888, -1953,1889,1954, -1890,1954,1889, -1954,1890,1955, -1891,1955,1890, -1955,1891,1956, -1892,1956,1891, -1956,1892,1957, -1893,1957,1892, -1957,1893,1958, -1894,1958,1893, -1958,1894,1959, -1895,1959,1894, -1959,1895,1960, -1896,1960,1895, -1960,1896,1961, -1897,1961,1896, -1961,1897,1962, -1898,1962,1897, -1962,1898,1963, -1899,1963,1898, -1963,1899,1964, -1900,1964,1899, -1964,1900,1965, -1901,1965,1900, -1965,1901,1966, -1902,1966,1901, -1966,1902,1967, -1903,1967,1902, -1967,1903,1968, -1904,1968,1903, -1968,1904,1969, -1905,1969,1904, -1969,1905,1970, -1906,1970,1905, -1970,1906,1971, -1907,1971,1906, -1971,1907,1972, -1908,1972,1907, -1972,1908,1973, -1909,1973,1908, -1973,1909,1974, -1910,1974,1909, -1974,1910,1975, -1911,1975,1910, -1975,1911,1976, -1912,1976,1911, -1976,1912,1977, -1913,1977,1912, -1977,1913,1978, -1914,1978,1913, -1978,1914,1979, -1915,1979,1914, -1979,1915,1980, -1916,1980,1915, -1980,1916,1981, -1917,1981,1916, -1981,1917,1982, -1918,1982,1917, -1982,1918,1983, -1919,1983,1918, -1984,1920,1985, -1921,1985,1920, -1985,1921,1986, -1922,1986,1921, -1986,1922,1987, -1923,1987,1922, -1987,1923,1988, -1924,1988,1923, -1988,1924,1989, -1925,1989,1924, -1989,1925,1990, -1926,1990,1925, -1990,1926,1991, -1927,1991,1926, -1991,1927,1992, -1928,1992,1927, -1992,1928,1993, -1929,1993,1928, -1993,1929,1994, -1930,1994,1929, -1994,1930,1995, -1931,1995,1930, -1995,1931,1996, -1932,1996,1931, -1996,1932,1997, -1933,1997,1932, -1997,1933,1998, -1934,1998,1933, -1998,1934,1999, -1935,1999,1934, -1999,1935,2000, -1936,2000,1935, -2000,1936,2001, -1937,2001,1936, -2001,1937,2002, -1938,2002,1937, -2002,1938,2003, -1939,2003,1938, -2003,1939,2004, -1940,2004,1939, -2004,1940,2005, -1941,2005,1940, -2005,1941,2006, -1942,2006,1941, -2006,1942,2007, -1943,2007,1942, -2007,1943,2008, -1944,2008,1943, -2008,1944,2009, -1945,2009,1944, -2009,1945,2010, -1946,2010,1945, -2010,1946,2011, -1947,2011,1946, -2011,1947,2012, -1948,2012,1947, -2012,1948,2013, -1949,2013,1948, -2013,1949,2014, -1950,2014,1949, -2014,1950,2015, -1951,2015,1950, -2015,1951,2016, -1952,2016,1951, -2016,1952,2017, -1953,2017,1952, -2017,1953,2018, -1954,2018,1953, -2018,1954,2019, -1955,2019,1954, -2019,1955,2020, -1956,2020,1955, -2020,1956,2021, -1957,2021,1956, -2021,1957,2022, -1958,2022,1957, -2022,1958,2023, -1959,2023,1958, -2023,1959,2024, -1960,2024,1959, -2024,1960,2025, -1961,2025,1960, -2025,1961,2026, -1962,2026,1961, -2026,1962,2027, -1963,2027,1962, -2027,1963,2028, -1964,2028,1963, -2028,1964,2029, -1965,2029,1964, -2029,1965,2030, -1966,2030,1965, -2030,1966,2031, -1967,2031,1966, -2031,1967,2032, -1968,2032,1967, -2032,1968,2033, -1969,2033,1968, -2033,1969,2034, -1970,2034,1969, -2034,1970,2035, -1971,2035,1970, -2035,1971,2036, -1972,2036,1971, -2036,1972,2037, -1973,2037,1972, -2037,1973,2038, -1974,2038,1973, -2038,1974,2039, -1975,2039,1974, -2039,1975,2040, -1976,2040,1975, -2040,1976,2041, -1977,2041,1976, -2041,1977,2042, -1978,2042,1977, -2042,1978,2043, -1979,2043,1978, -2043,1979,2044, -1980,2044,1979, -2044,1980,2045, -1981,2045,1980, -2045,1981,2046, -1982,2046,1981, -2046,1982,2047, -1983,2047,1982, -}; - -#define Landscape04VtxCount 2112 -#define Landscape04IdxCount 12096 - -btScalar Landscape04Vtx[] = { -3.90625f,18.9654f,125.0f, -3.90625f,20.0876f,128.906f, -7.8125f,20.5764f,125.0f, -7.8125f,21.0764f,128.906f, -11.7188f,21.5489f,125.0f, -11.7188f,21.4076f,128.906f, -15.625f,22.4963f,125.0f, -15.625f,22.6299f,128.906f, -19.5313f,22.3264f,125.0f, -19.5313f,22.1174f,128.906f, -23.4375f,20.3987f,125.0f, -23.4375f,20.3977f,128.906f, -27.3438f,18.6622f,125.0f, -27.3438f,18.7343f,128.906f, -31.25f,17.4724f,125.0f, -31.25f,17.9144f,128.906f, -35.1563f,16.4832f,125.0f, -35.1563f,17.2941f,128.906f, -39.0625f,15.2653f,125.0f, -39.0625f,16.5386f,128.906f, -42.9688f,14.379f,125.0f, -42.9688f,15.6892f,128.906f, -46.875f,13.9872f,125.0f, -46.875f,14.6414f,128.906f, -50.7813f,14.7002f,125.0f, -50.7813f,14.3505f,128.906f, -54.6875f,15.1119f,125.0f, -54.6875f,14.1604f,128.906f, -58.5938f,14.6638f,125.0f, -58.5938f,14.517f,128.906f, -62.5f,14.668f,125.0f, -62.5f,15.1057f,128.906f, -66.4063f,14.9792f,125.0f, -66.4063f,16.0684f,128.906f, -70.3125f,15.4776f,125.0f, -70.3125f,16.6251f,128.906f, -74.2188f,15.0939f,125.0f, -74.2188f,15.9689f,128.906f, -78.125f,15.5318f,125.0f, -78.125f,16.0234f,128.906f, -82.0313f,16.0777f,125.0f, -82.0313f,16.205f,128.906f, -85.9375f,17.8753f,125.0f, -85.9375f,18.8167f,128.906f, -89.8438f,18.8786f,125.0f, -89.8438f,19.6433f,128.906f, -93.75f,19.8208f,125.0f, -93.75f,20.2916f,128.906f, -97.6563f,23.2578f,125.0f, -97.6563f,23.2308f,128.906f, -101.563f,25.3117f,125.0f, -101.563f,25.882f,128.906f, -105.469f,26.8718f,125.0f, -105.469f,27.5736f,128.906f, -109.375f,28.7414f,125.0f, -109.375f,28.9662f,128.906f, -113.281f,29.9339f,125.0f, -113.281f,30.5702f,128.906f, -117.188f,30.6849f,125.0f, -117.188f,31.8627f,128.906f, -121.094f,32.4202f,125.0f, -121.094f,32.5216f,128.906f, -125.0f,34.7495f,125.0f, -125.0f,34.1918f,128.906f, -128.906f,37.137f,125.0f, -128.906f,37.0161f,128.906f, -132.813f,38.4113f,125.0f, -132.813f,38.5084f,128.906f, -136.719f,38.1788f,125.0f, -136.719f,39.1631f,128.906f, -140.625f,38.7652f,125.0f, -140.625f,39.0529f,128.906f, -144.531f,37.9353f,125.0f, -144.531f,38.9229f,128.906f, -148.438f,38.5681f,125.0f, -148.438f,38.4312f,128.906f, -152.344f,38.6243f,125.0f, -152.344f,39.1086f,128.906f, -156.25f,39.6341f,125.0f, -156.25f,39.7022f,128.906f, -160.156f,39.762f,125.0f, -160.156f,39.3007f,128.906f, -164.063f,38.5385f,125.0f, -164.063f,38.2318f,128.906f, -167.969f,36.3551f,125.0f, -167.969f,36.7493f,128.906f, -171.875f,36.1936f,125.0f, -171.875f,35.9781f,128.906f, -175.781f,35.5636f,125.0f, -175.781f,35.7712f,128.906f, -179.688f,34.6544f,125.0f, -179.688f,35.6247f,128.906f, -183.594f,34.1597f,125.0f, -183.594f,35.4808f,128.906f, -187.5f,33.5567f,125.0f, -187.5f,35.6102f,128.906f, -191.406f,33.0138f,125.0f, -191.406f,34.0305f,128.906f, -195.313f,31.2722f,125.0f, -195.313f,32.0227f,128.906f, -199.219f,29.2529f,125.0f, -199.219f,29.7666f,128.906f, -203.125f,26.9435f,125.0f, -203.125f,27.3968f,128.906f, -207.031f,25.0844f,125.0f, -207.031f,25.1642f,128.906f, -210.938f,23.6605f,125.0f, -210.938f,24.279f,128.906f, -214.844f,22.0745f,125.0f, -214.844f,22.4357f,128.906f, -218.75f,20.3206f,125.0f, -218.75f,21.7754f,128.906f, -222.656f,20.0402f,125.0f, -222.656f,19.6381f,128.906f, -226.563f,20.1162f,125.0f, -226.563f,19.78f,128.906f, -230.469f,20.2399f,125.0f, -230.469f,20.0349f,128.906f, -234.375f,19.6142f,125.0f, -234.375f,19.1534f,128.906f, -238.281f,18.6118f,125.0f, -238.281f,17.863f,128.906f, -242.188f,17.3711f,125.0f, -242.188f,17.658f,128.906f, -246.094f,17.675f,125.0f, -246.094f,16.951f,128.906f, -250.0f,17.3999f,125.0f, -250.0f,16.2961f,128.906f, -3.90625f,18.5327f,121.094f, -7.8125f,19.7267f,121.094f, -11.7188f,20.9891f,121.094f, -15.625f,22.237f,121.094f, -19.5313f,22.3238f,121.094f, -23.4375f,20.1525f,121.094f, -27.3438f,17.9536f,121.094f, -31.25f,17.647f,121.094f, -35.1563f,16.241f,121.094f, -39.0625f,14.6821f,121.094f, -42.9688f,14.4948f,121.094f, -46.875f,15.0351f,121.094f, -50.7813f,15.3893f,121.094f, -54.6875f,15.1531f,121.094f, -58.5938f,14.9284f,121.094f, -62.5f,15.1197f,121.094f, -66.4063f,15.1561f,121.094f, -70.3125f,15.1593f,121.094f, -74.2188f,15.0707f,121.094f, -78.125f,16.0455f,121.094f, -82.0313f,16.6186f,121.094f, -85.9375f,17.4149f,121.094f, -89.8438f,18.746f,121.094f, -93.75f,18.8475f,121.094f, -97.6563f,21.6899f,121.094f, -101.563f,24.567f,121.094f, -105.469f,25.7581f,121.094f, -109.375f,27.437f,121.094f, -113.281f,29.1226f,121.094f, -117.188f,30.137f,121.094f, -121.094f,32.1062f,121.094f, -125.0f,34.674f,121.094f, -128.906f,37.1044f,121.094f, -132.813f,37.8111f,121.094f, -136.719f,37.7901f,121.094f, -140.625f,37.5727f,121.094f, -144.531f,37.1561f,121.094f, -148.438f,38.1976f,121.094f, -152.344f,38.9227f,121.094f, -156.25f,40.3124f,121.094f, -160.156f,40.6867f,121.094f, -164.063f,39.5374f,121.094f, -167.969f,38.019f,121.094f, -171.875f,36.4573f,121.094f, -175.781f,35.2509f,121.094f, -179.688f,34.6709f,121.094f, -183.594f,33.5584f,121.094f, -187.5f,33.2411f,121.094f, -191.406f,31.7588f,121.094f, -195.313f,30.3558f,121.094f, -199.219f,28.879f,121.094f, -203.125f,26.7589f,121.094f, -207.031f,25.0535f,121.094f, -210.938f,23.0477f,121.094f, -214.844f,20.6897f,121.094f, -218.75f,19.3676f,121.094f, -222.656f,19.2985f,121.094f, -226.563f,20.2312f,121.094f, -230.469f,20.317f,121.094f, -234.375f,20.2468f,121.094f, -238.281f,20.3734f,121.094f, -242.188f,18.3676f,121.094f, -246.094f,16.642f,121.094f, -250.0f,17.5995f,121.094f, -3.90625f,18.919f,117.188f, -7.8125f,19.2124f,117.188f, -11.7188f,20.7659f,117.188f, -15.625f,20.5809f,117.188f, -19.5313f,20.3134f,117.188f, -23.4375f,18.6669f,117.188f, -27.3438f,17.5145f,117.188f, -31.25f,17.0813f,117.188f, -35.1563f,15.6789f,117.188f, -39.0625f,14.7581f,117.188f, -42.9688f,14.4424f,117.188f, -46.875f,14.7991f,117.188f, -50.7813f,15.0726f,117.188f, -54.6875f,14.8056f,117.188f, -58.5938f,15.756f,117.188f, -62.5f,16.3024f,117.188f, -66.4063f,16.0449f,117.188f, -70.3125f,15.9115f,117.188f, -74.2188f,16.1633f,117.188f, -78.125f,17.3323f,117.188f, -82.0313f,17.2659f,117.188f, -85.9375f,17.987f,117.188f, -89.8438f,18.3044f,117.188f, -93.75f,18.2665f,117.188f, -97.6563f,19.5364f,117.188f, -101.563f,21.7536f,117.188f, -105.469f,23.6545f,117.188f, -109.375f,25.5212f,117.188f, -113.281f,28.1179f,117.188f, -117.188f,29.5931f,117.188f, -121.094f,31.8126f,117.188f, -125.0f,34.0227f,117.188f, -128.906f,36.3895f,117.188f, -132.813f,37.0423f,117.188f, -136.719f,36.8278f,117.188f, -140.625f,36.2349f,117.188f, -144.531f,36.8825f,117.188f, -148.438f,39.6492f,117.188f, -152.344f,41.6626f,117.188f, -156.25f,42.5091f,117.188f, -160.156f,43.0711f,117.188f, -164.063f,41.7733f,117.188f, -167.969f,40.5985f,117.188f, -171.875f,38.1852f,117.188f, -175.781f,37.023f,117.188f, -179.688f,35.8533f,117.188f, -183.594f,34.5754f,117.188f, -187.5f,33.6585f,117.188f, -191.406f,32.534f,117.188f, -195.313f,31.0632f,117.188f, -199.219f,29.0243f,117.188f, -203.125f,27.0248f,117.188f, -207.031f,25.1597f,117.188f, -210.938f,22.6282f,117.188f, -214.844f,20.6205f,117.188f, -218.75f,19.2556f,117.188f, -222.656f,18.8259f,117.188f, -226.563f,19.2235f,117.188f, -230.469f,20.4441f,117.188f, -234.375f,20.5373f,117.188f, -238.281f,20.3082f,117.188f, -242.188f,19.4397f,117.188f, -246.094f,17.9806f,117.188f, -250.0f,17.3395f,117.188f, -3.90625f,18.3498f,113.281f, -7.8125f,18.7009f,113.281f, -11.7188f,19.3704f,113.281f, -15.625f,19.5203f,113.281f, -19.5313f,18.5704f,113.281f, -23.4375f,17.6697f,113.281f, -27.3438f,16.8001f,113.281f, -31.25f,16.54f,113.281f, -35.1563f,15.8558f,113.281f, -39.0625f,15.1296f,113.281f, -42.9688f,15.8599f,113.281f, -46.875f,16.437f,113.281f, -50.7813f,16.2977f,113.281f, -54.6875f,16.7076f,113.281f, -58.5938f,16.8187f,113.281f, -62.5f,17.1513f,113.281f, -66.4063f,16.5296f,113.281f, -70.3125f,15.8782f,113.281f, -74.2188f,16.614f,113.281f, -78.125f,17.0474f,113.281f, -82.0313f,17.3371f,113.281f, -85.9375f,17.9565f,113.281f, -89.8438f,18.3918f,113.281f, -93.75f,19.0258f,113.281f, -97.6563f,19.2791f,113.281f, -101.563f,20.1533f,113.281f, -105.469f,22.2922f,113.281f, -109.375f,24.6835f,113.281f, -113.281f,25.7755f,113.281f, -117.188f,28.8805f,113.281f, -121.094f,31.2119f,113.281f, -125.0f,33.4657f,113.281f, -128.906f,35.1055f,113.281f, -132.813f,36.4197f,113.281f, -136.719f,37.3017f,113.281f, -140.625f,37.1796f,113.281f, -144.531f,38.2037f,113.281f, -148.438f,41.4383f,113.281f, -152.344f,43.9714f,113.281f, -156.25f,45.0067f,113.281f, -160.156f,45.1491f,113.281f, -164.063f,43.8042f,113.281f, -167.969f,42.5165f,113.281f, -171.875f,40.361f,113.281f, -175.781f,38.3494f,113.281f, -179.688f,37.4529f,113.281f, -183.594f,35.5766f,113.281f, -187.5f,34.2438f,113.281f, -191.406f,32.0218f,113.281f, -195.313f,30.2021f,113.281f, -199.219f,28.8256f,113.281f, -203.125f,27.2081f,113.281f, -207.031f,24.992f,113.281f, -210.938f,22.5332f,113.281f, -214.844f,19.7765f,113.281f, -218.75f,18.5573f,113.281f, -222.656f,18.1469f,113.281f, -226.563f,17.9659f,113.281f, -230.469f,19.2f,113.281f, -234.375f,20.0741f,113.281f, -238.281f,20.1159f,113.281f, -242.188f,19.0382f,113.281f, -246.094f,18.3417f,113.281f, -250.0f,18.7603f,113.281f, -3.90625f,18.0017f,109.375f, -7.8125f,18.1552f,109.375f, -11.7188f,18.2026f,109.375f, -15.625f,18.2042f,109.375f, -19.5313f,17.7806f,109.375f, -23.4375f,17.5378f,109.375f, -27.3438f,16.8627f,109.375f, -31.25f,15.9329f,109.375f, -35.1563f,15.192f,109.375f, -39.0625f,16.0796f,109.375f, -42.9688f,16.1895f,109.375f, -46.875f,15.9774f,109.375f, -50.7813f,16.9529f,109.375f, -54.6875f,17.0901f,109.375f, -58.5938f,17.3722f,109.375f, -62.5f,16.5809f,109.375f, -66.4063f,16.8111f,109.375f, -70.3125f,16.9238f,109.375f, -74.2188f,16.8422f,109.375f, -78.125f,17.0401f,109.375f, -82.0313f,16.8637f,109.375f, -85.9375f,17.4071f,109.375f, -89.8438f,17.944f,109.375f, -93.75f,18.5255f,109.375f, -97.6563f,18.2829f,109.375f, -101.563f,19.0975f,109.375f, -105.469f,20.4292f,109.375f, -109.375f,22.163f,109.375f, -113.281f,25.6773f,109.375f, -117.188f,27.8617f,109.375f, -121.094f,30.6543f,109.375f, -125.0f,33.4226f,109.375f, -128.906f,34.4263f,109.375f, -132.813f,36.8747f,109.375f, -136.719f,37.4551f,109.375f, -140.625f,37.4975f,109.375f, -144.531f,40.0751f,109.375f, -148.438f,42.7524f,109.375f, -152.344f,44.7756f,109.375f, -156.25f,46.1787f,109.375f, -160.156f,46.3753f,109.375f, -164.063f,45.2089f,109.375f, -167.969f,43.7487f,109.375f, -171.875f,41.6365f,109.375f, -175.781f,39.7459f,109.375f, -179.688f,36.9804f,109.375f, -183.594f,35.6688f,109.375f, -187.5f,35.0212f,109.375f, -191.406f,32.4383f,109.375f, -195.313f,29.6046f,109.375f, -199.219f,28.1822f,109.375f, -203.125f,26.2444f,109.375f, -207.031f,24.1442f,109.375f, -210.938f,22.1072f,109.375f, -214.844f,20.0401f,109.375f, -218.75f,18.0663f,109.375f, -222.656f,16.866f,109.375f, -226.563f,16.9372f,109.375f, -230.469f,16.9853f,109.375f, -234.375f,17.6761f,109.375f, -238.281f,18.3669f,109.375f, -242.188f,18.4156f,109.375f, -246.094f,18.2171f,109.375f, -250.0f,18.5941f,109.375f, -3.90625f,17.9608f,105.469f, -7.8125f,18.4369f,105.469f, -11.7188f,18.4406f,105.469f, -15.625f,17.8685f,105.469f, -19.5313f,17.7519f,105.469f, -23.4375f,17.5734f,105.469f, -27.3438f,16.3397f,105.469f, -31.25f,15.8618f,105.469f, -35.1563f,16.1194f,105.469f, -39.0625f,16.889f,105.469f, -42.9688f,16.2804f,105.469f, -46.875f,15.8474f,105.469f, -50.7813f,16.2892f,105.469f, -54.6875f,16.2854f,105.469f, -58.5938f,16.7368f,105.469f, -62.5f,17.4055f,105.469f, -66.4063f,16.8808f,105.469f, -70.3125f,17.3183f,105.469f, -74.2188f,17.7166f,105.469f, -78.125f,17.0657f,105.469f, -82.0313f,16.7305f,105.469f, -85.9375f,16.3929f,105.469f, -89.8438f,16.6475f,105.469f, -93.75f,17.7645f,105.469f, -97.6563f,18.4212f,105.469f, -101.563f,18.4107f,105.469f, -105.469f,19.3751f,105.469f, -109.375f,21.843f,105.469f, -113.281f,25.0143f,105.469f, -117.188f,26.9168f,105.469f, -121.094f,29.8403f,105.469f, -125.0f,32.4937f,105.469f, -128.906f,34.4076f,105.469f, -132.813f,35.2497f,105.469f, -136.719f,36.4785f,105.469f, -140.625f,37.7983f,105.469f, -144.531f,40.5712f,105.469f, -148.438f,43.3698f,105.469f, -152.344f,45.784f,105.469f, -156.25f,46.9835f,105.469f, -160.156f,47.2774f,105.469f, -164.063f,46.7695f,105.469f, -167.969f,45.0199f,105.469f, -171.875f,42.588f,105.469f, -175.781f,39.988f,105.469f, -179.688f,38.0653f,105.469f, -183.594f,37.5754f,105.469f, -187.5f,35.6316f,105.469f, -191.406f,32.4143f,105.469f, -195.313f,29.5342f,105.469f, -199.219f,27.2795f,105.469f, -203.125f,26.065f,105.469f, -207.031f,24.8633f,105.469f, -210.938f,23.0216f,105.469f, -214.844f,21.1684f,105.469f, -218.75f,18.9315f,105.469f, -222.656f,17.7013f,105.469f, -226.563f,16.9466f,105.469f, -230.469f,17.1437f,105.469f, -234.375f,17.6691f,105.469f, -238.281f,17.9243f,105.469f, -242.188f,18.0005f,105.469f, -246.094f,18.6179f,105.469f, -250.0f,19.2165f,105.469f, -3.90625f,17.7074f,101.563f, -7.8125f,18.411f,101.563f, -11.7188f,17.9916f,101.563f, -15.625f,18.5349f,101.563f, -19.5313f,18.6607f,101.563f, -23.4375f,17.406f,101.563f, -27.3438f,17.2356f,101.563f, -31.25f,17.0395f,101.563f, -35.1563f,17.9903f,101.563f, -39.0625f,18.2603f,101.563f, -42.9688f,17.9037f,101.563f, -46.875f,17.2358f,101.563f, -50.7813f,16.1089f,101.563f, -54.6875f,16.6043f,101.563f, -58.5938f,16.5656f,101.563f, -62.5f,16.8655f,101.563f, -66.4063f,17.0123f,101.563f, -70.3125f,17.4985f,101.563f, -74.2188f,18.0195f,101.563f, -78.125f,17.3417f,101.563f, -82.0313f,16.8477f,101.563f, -85.9375f,15.4602f,101.563f, -89.8438f,15.6001f,101.563f, -93.75f,16.8889f,101.563f, -97.6563f,17.2944f,101.563f, -101.563f,17.3431f,101.563f, -105.469f,18.2306f,101.563f, -109.375f,20.5556f,101.563f, -113.281f,22.5598f,101.563f, -117.188f,25.0997f,101.563f, -121.094f,28.2048f,101.563f, -125.0f,30.46f,101.563f, -128.906f,32.5729f,101.563f, -132.813f,34.5568f,101.563f, -136.719f,36.463f,101.563f, -140.625f,37.8259f,101.563f, -144.531f,40.4357f,101.563f, -148.438f,43.6544f,101.563f, -152.344f,46.204f,101.563f, -156.25f,47.3874f,101.563f, -160.156f,47.5222f,101.563f, -164.063f,46.8312f,101.563f, -167.969f,44.5065f,101.563f, -171.875f,43.7648f,101.563f, -175.781f,41.9789f,101.563f, -179.688f,40.785f,101.563f, -183.594f,38.7639f,101.563f, -187.5f,36.1589f,101.563f, -191.406f,33.4197f,101.563f, -195.313f,29.7568f,101.563f, -199.219f,27.2343f,101.563f, -203.125f,26.3845f,101.563f, -207.031f,25.3149f,101.563f, -210.938f,23.4896f,101.563f, -214.844f,22.229f,101.563f, -218.75f,20.0014f,101.563f, -222.656f,19.0955f,101.563f, -226.563f,17.971f,101.563f, -230.469f,16.9303f,101.563f, -234.375f,17.3619f,101.563f, -238.281f,17.0337f,101.563f, -242.188f,17.1424f,101.563f, -246.094f,18.334f,101.563f, -250.0f,19.2744f,101.563f, -3.90625f,18.0176f,97.6563f, -7.8125f,18.1916f,97.6563f, -11.7188f,17.72f,97.6563f, -15.625f,18.3444f,97.6563f, -19.5313f,18.7102f,97.6563f, -23.4375f,17.4143f,97.6563f, -27.3438f,18.0085f,97.6563f, -31.25f,18.4924f,97.6563f, -35.1563f,19.4324f,97.6563f, -39.0625f,19.7998f,97.6563f, -42.9688f,19.5444f,97.6563f, -46.875f,19.5513f,97.6563f, -50.7813f,17.9397f,97.6563f, -54.6875f,16.6383f,97.6563f, -58.5938f,16.0619f,97.6563f, -62.5f,16.7402f,97.6563f, -66.4063f,16.955f,97.6563f, -70.3125f,17.5912f,97.6563f, -74.2188f,17.1181f,97.6563f, -78.125f,16.9063f,97.6563f, -82.0313f,16.3988f,97.6563f, -85.9375f,15.935f,97.6563f, -89.8438f,16.0664f,97.6563f, -93.75f,16.1926f,97.6563f, -97.6563f,16.5004f,97.6563f, -101.563f,17.1185f,97.6563f, -105.469f,17.2859f,97.6563f, -109.375f,19.0026f,97.6563f, -113.281f,21.0018f,97.6563f, -117.188f,23.6336f,97.6563f, -121.094f,26.4831f,97.6563f, -125.0f,29.3075f,97.6563f, -128.906f,32.5702f,97.6563f, -132.813f,34.5711f,97.6563f, -136.719f,36.1666f,97.6563f, -140.625f,37.5909f,97.6563f, -144.531f,40.3232f,97.6563f, -148.438f,42.661f,97.6563f, -152.344f,45.5604f,97.6563f, -156.25f,47.6984f,97.6563f, -160.156f,47.4129f,97.6563f, -164.063f,47.1564f,97.6563f, -167.969f,45.3058f,97.6563f, -171.875f,44.8069f,97.6563f, -175.781f,43.6847f,97.6563f, -179.688f,41.6831f,97.6563f, -183.594f,39.4072f,97.6563f, -187.5f,36.6118f,97.6563f, -191.406f,33.396f,97.6563f, -195.313f,29.9372f,97.6563f, -199.219f,28.0616f,97.6563f, -203.125f,27.3957f,97.6563f, -207.031f,25.6934f,97.6563f, -210.938f,24.4412f,97.6563f, -214.844f,23.2356f,97.6563f, -218.75f,21.445f,97.6563f, -222.656f,19.5412f,97.6563f, -226.563f,18.4898f,97.6563f, -230.469f,17.727f,97.6563f, -234.375f,16.5139f,97.6563f, -238.281f,16.2579f,97.6563f, -242.188f,16.1539f,97.6563f, -246.094f,17.0856f,97.6563f, -250.0f,18.5151f,97.6563f, -3.90625f,17.1671f,93.75f, -7.8125f,16.817f,93.75f, -11.7188f,17.5293f,93.75f, -15.625f,18.7701f,93.75f, -19.5313f,18.3362f,93.75f, -23.4375f,19.0869f,93.75f, -27.3438f,19.7557f,93.75f, -31.25f,20.0113f,93.75f, -35.1563f,20.3441f,93.75f, -39.0625f,21.4434f,93.75f, -42.9688f,21.6008f,93.75f, -46.875f,21.5423f,93.75f, -50.7813f,20.7592f,93.75f, -54.6875f,18.9207f,93.75f, -58.5938f,17.6772f,93.75f, -62.5f,17.5409f,93.75f, -66.4063f,17.599f,93.75f, -70.3125f,18.2626f,93.75f, -74.2188f,18.4046f,93.75f, -78.125f,18.215f,93.75f, -82.0313f,18.4743f,93.75f, -85.9375f,17.6579f,93.75f, -89.8438f,17.732f,93.75f, -93.75f,18.4172f,93.75f, -97.6563f,19.0439f,93.75f, -101.563f,19.7437f,93.75f, -105.469f,19.8588f,93.75f, -109.375f,19.7414f,93.75f, -113.281f,21.4756f,93.75f, -117.188f,24.1862f,93.75f, -121.094f,26.8351f,93.75f, -125.0f,29.9621f,93.75f, -128.906f,32.8267f,93.75f, -132.813f,34.6779f,93.75f, -136.719f,36.0083f,93.75f, -140.625f,36.9812f,93.75f, -144.531f,39.6087f,93.75f, -148.438f,42.2269f,93.75f, -152.344f,44.492f,93.75f, -156.25f,47.1767f,93.75f, -160.156f,47.5667f,93.75f, -164.063f,46.9625f,93.75f, -167.969f,45.6865f,93.75f, -171.875f,45.7668f,93.75f, -175.781f,44.8303f,93.75f, -179.688f,42.5904f,93.75f, -183.594f,40.3536f,93.75f, -187.5f,37.9498f,93.75f, -191.406f,35.1415f,93.75f, -195.313f,31.5011f,93.75f, -199.219f,29.695f,93.75f, -203.125f,27.7988f,93.75f, -207.031f,26.3522f,93.75f, -210.938f,25.8544f,93.75f, -214.844f,24.7269f,93.75f, -218.75f,23.7697f,93.75f, -222.656f,20.9249f,93.75f, -226.563f,19.1368f,93.75f, -230.469f,18.5704f,93.75f, -234.375f,17.554f,93.75f, -238.281f,14.9004f,93.75f, -242.188f,16.3253f,93.75f, -246.094f,16.0037f,93.75f, -250.0f,15.9921f,93.75f, -3.90625f,15.6427f,89.8438f, -7.8125f,16.2722f,89.8438f, -11.7188f,17.6471f,89.8438f, -15.625f,18.8565f,89.8438f, -19.5313f,19.651f,89.8438f, -23.4375f,20.9243f,89.8438f, -27.3438f,20.8045f,89.8438f, -31.25f,20.2274f,89.8438f, -35.1563f,21.5768f,89.8438f, -39.0625f,22.566f,89.8438f, -42.9688f,23.4111f,89.8438f, -46.875f,23.5063f,89.8438f, -50.7813f,22.9631f,89.8438f, -54.6875f,21.5642f,89.8438f, -58.5938f,20.3649f,89.8438f, -62.5f,19.6177f,89.8438f, -66.4063f,18.6758f,89.8438f, -70.3125f,18.6837f,89.8438f, -74.2188f,19.7593f,89.8438f, -78.125f,20.4356f,89.8438f, -82.0313f,20.1806f,89.8438f, -85.9375f,19.4513f,89.8438f, -89.8438f,19.2942f,89.8438f, -93.75f,19.9864f,89.8438f, -97.6563f,20.6569f,89.8438f, -101.563f,20.8985f,89.8438f, -105.469f,20.8027f,89.8438f, -109.375f,21.5099f,89.8438f, -113.281f,22.7491f,89.8438f, -117.188f,24.1938f,89.8438f, -121.094f,27.3472f,89.8438f, -125.0f,29.9546f,89.8438f, -128.906f,32.3821f,89.8438f, -132.813f,34.2078f,89.8438f, -136.719f,35.7419f,89.8438f, -140.625f,36.6408f,89.8438f, -144.531f,39.1756f,89.8438f, -148.438f,42.1721f,89.8438f, -152.344f,43.7891f,89.8438f, -156.25f,45.9566f,89.8438f, -160.156f,47.5521f,89.8438f, -164.063f,47.0165f,89.8438f, -167.969f,46.0084f,89.8438f, -171.875f,46.0374f,89.8438f, -175.781f,45.9301f,89.8438f, -179.688f,43.5326f,89.8438f, -183.594f,40.5203f,89.8438f, -187.5f,38.133f,89.8438f, -191.406f,35.8688f,89.8438f, -195.313f,33.0648f,89.8438f, -199.219f,31.0451f,89.8438f, -203.125f,27.691f,89.8438f, -207.031f,26.7927f,89.8438f, -210.938f,26.334f,89.8438f, -214.844f,25.0669f,89.8438f, -218.75f,23.4149f,89.8438f, -222.656f,20.9786f,89.8438f, -226.563f,18.963f,89.8438f, -230.469f,18.7894f,89.8438f, -234.375f,17.2683f,89.8438f, -238.281f,14.98f,89.8438f, -242.188f,15.4163f,89.8438f, -246.094f,15.4238f,89.8438f, -250.0f,15.9208f,89.8438f, -3.90625f,15.5916f,85.9375f, -7.8125f,16.3916f,85.9375f, -11.7188f,18.2047f,85.9375f, -15.625f,19.1861f,85.9375f, -19.5313f,20.7525f,85.9375f, -23.4375f,21.6364f,85.9375f, -27.3438f,21.9262f,85.9375f, -31.25f,21.6225f,85.9375f, -35.1563f,22.4806f,85.9375f, -39.0625f,23.7973f,85.9375f, -42.9688f,24.6135f,85.9375f, -46.875f,24.8421f,85.9375f, -50.7813f,24.5451f,85.9375f, -54.6875f,23.688f,85.9375f, -58.5938f,22.221f,85.9375f, -62.5f,21.5009f,85.9375f, -66.4063f,21.2241f,85.9375f, -70.3125f,20.2058f,85.9375f, -74.2188f,20.3437f,85.9375f, -78.125f,21.8786f,85.9375f, -82.0313f,21.9425f,85.9375f, -85.9375f,20.6496f,85.9375f, -89.8438f,20.6855f,85.9375f, -93.75f,20.6495f,85.9375f, -97.6563f,21.0738f,85.9375f, -101.563f,21.7991f,85.9375f, -105.469f,22.3795f,85.9375f, -109.375f,22.4292f,85.9375f, -113.281f,23.6451f,85.9375f, -117.188f,24.8457f,85.9375f, -121.094f,26.7121f,85.9375f, -125.0f,29.2236f,85.9375f, -128.906f,31.5942f,85.9375f, -132.813f,33.8517f,85.9375f, -136.719f,35.7145f,85.9375f, -140.625f,36.6808f,85.9375f, -144.531f,38.8926f,85.9375f, -148.438f,41.6484f,85.9375f, -152.344f,44.2035f,85.9375f, -156.25f,45.1997f,85.9375f, -160.156f,46.1921f,85.9375f, -164.063f,47.2097f,85.9375f, -167.969f,47.0691f,85.9375f, -171.875f,45.5257f,85.9375f, -175.781f,44.6746f,85.9375f, -179.688f,43.6223f,85.9375f, -183.594f,40.2395f,85.9375f, -187.5f,38.445f,85.9375f, -191.406f,36.5002f,85.9375f, -195.313f,33.7977f,85.9375f, -199.219f,31.5943f,85.9375f, -203.125f,28.8305f,85.9375f, -207.031f,27.4922f,85.9375f, -210.938f,26.0386f,85.9375f, -214.844f,24.1792f,85.9375f, -218.75f,22.1567f,85.9375f, -222.656f,20.1169f,85.9375f, -226.563f,19.3603f,85.9375f, -230.469f,17.7703f,85.9375f, -234.375f,16.3147f,85.9375f, -238.281f,15.0886f,85.9375f, -242.188f,15.1332f,85.9375f, -246.094f,14.7802f,85.9375f, -250.0f,15.2259f,85.9375f, -3.90625f,16.9644f,82.0313f, -7.8125f,17.8f,82.0313f, -11.7188f,19.2943f,82.0313f, -15.625f,21.0269f,82.0313f, -19.5313f,22.3312f,82.0313f, -23.4375f,23.0871f,82.0313f, -27.3438f,23.1115f,82.0313f, -31.25f,23.5304f,82.0313f, -35.1563f,24.1493f,82.0313f, -39.0625f,25.0848f,82.0313f, -42.9688f,26.0789f,82.0313f, -46.875f,26.3399f,82.0313f, -50.7813f,25.4397f,82.0313f, -54.6875f,24.894f,82.0313f, -58.5938f,24.1026f,82.0313f, -62.5f,24.0749f,82.0313f, -66.4063f,23.5256f,82.0313f, -70.3125f,21.9612f,82.0313f, -74.2188f,21.932f,82.0313f, -78.125f,22.6241f,82.0313f, -82.0313f,22.672f,82.0313f, -85.9375f,21.4303f,82.0313f, -89.8438f,21.6964f,82.0313f, -93.75f,21.7198f,82.0313f, -97.6563f,22.4953f,82.0313f, -101.563f,23.0451f,82.0313f, -105.469f,23.0285f,82.0313f, -109.375f,23.24f,82.0313f, -113.281f,23.6861f,82.0313f, -117.188f,24.7685f,82.0313f, -121.094f,26.4466f,82.0313f, -125.0f,28.8315f,82.0313f, -128.906f,30.9624f,82.0313f, -132.813f,33.7991f,82.0313f, -136.719f,35.8079f,82.0313f, -140.625f,37.0254f,82.0313f, -144.531f,38.7479f,82.0313f, -148.438f,42.0473f,82.0313f, -152.344f,43.7879f,82.0313f, -156.25f,45.1826f,82.0313f, -160.156f,46.2454f,82.0313f, -164.063f,47.0196f,82.0313f, -167.969f,47.2872f,82.0313f, -171.875f,46.2496f,82.0313f, -175.781f,44.3338f,82.0313f, -179.688f,43.1095f,82.0313f, -183.594f,40.7857f,82.0313f, -187.5f,39.646f,82.0313f, -191.406f,37.5425f,82.0313f, -195.313f,35.2951f,82.0313f, -199.219f,33.6324f,82.0313f, -203.125f,30.8911f,82.0313f, -207.031f,27.2798f,82.0313f, -210.938f,25.4308f,82.0313f, -214.844f,23.8814f,82.0313f, -218.75f,22.4441f,82.0313f, -222.656f,20.3771f,82.0313f, -226.563f,19.2073f,82.0313f, -230.469f,19.0082f,82.0313f, -234.375f,17.769f,82.0313f, -238.281f,15.8302f,82.0313f, -242.188f,14.2967f,82.0313f, -246.094f,15.1365f,82.0313f, -250.0f,14.9159f,82.0313f, -3.90625f,18.8244f,78.125f, -7.8125f,19.5283f,78.125f, -11.7188f,20.9466f,78.125f, -15.625f,22.0951f,78.125f, -19.5313f,23.2483f,78.125f, -23.4375f,23.8238f,78.125f, -27.3438f,24.6236f,78.125f, -31.25f,24.0856f,78.125f, -35.1563f,25.6129f,78.125f, -39.0625f,26.8525f,78.125f, -42.9688f,26.9859f,78.125f, -46.875f,26.6403f,78.125f, -50.7813f,26.6419f,78.125f, -54.6875f,27.4236f,78.125f, -58.5938f,26.5989f,78.125f, -62.5f,26.137f,78.125f, -66.4063f,24.8717f,78.125f, -70.3125f,23.8694f,78.125f, -74.2188f,23.2668f,78.125f, -78.125f,23.1081f,78.125f, -82.0313f,23.3134f,78.125f, -85.9375f,23.0903f,78.125f, -89.8438f,23.2822f,78.125f, -93.75f,24.291f,78.125f, -97.6563f,24.5546f,78.125f, -101.563f,24.4216f,78.125f, -105.469f,24.6379f,78.125f, -109.375f,24.5235f,78.125f, -113.281f,24.88f,78.125f, -117.188f,25.6988f,78.125f, -121.094f,26.9155f,78.125f, -125.0f,29.7499f,78.125f, -128.906f,31.361f,78.125f, -132.813f,33.9367f,78.125f, -136.719f,35.4066f,78.125f, -140.625f,36.6153f,78.125f, -144.531f,38.6091f,78.125f, -148.438f,41.2276f,78.125f, -152.344f,43.2187f,78.125f, -156.25f,45.2494f,78.125f, -160.156f,46.5334f,78.125f, -164.063f,47.1659f,78.125f, -167.969f,47.5409f,78.125f, -171.875f,46.3778f,78.125f, -175.781f,44.8935f,78.125f, -179.688f,43.7429f,78.125f, -183.594f,42.4748f,78.125f, -187.5f,40.5234f,78.125f, -191.406f,38.2806f,78.125f, -195.313f,36.297f,78.125f, -199.219f,35.0641f,78.125f, -203.125f,32.4145f,78.125f, -207.031f,29.4539f,78.125f, -210.938f,25.7399f,78.125f, -214.844f,23.157f,78.125f, -218.75f,20.9425f,78.125f, -222.656f,19.2349f,78.125f, -226.563f,18.5576f,78.125f, -230.469f,18.8407f,78.125f, -234.375f,17.6562f,78.125f, -238.281f,15.7207f,78.125f, -242.188f,14.3385f,78.125f, -246.094f,13.9958f,78.125f, -250.0f,14.6888f,78.125f, -3.90625f,20.6829f,74.2188f, -7.8125f,22.7393f,74.2188f, -11.7188f,22.9007f,74.2188f, -15.625f,23.3717f,74.2188f, -19.5313f,23.7991f,74.2188f, -23.4375f,24.5576f,74.2188f, -27.3438f,25.3464f,74.2188f, -31.25f,25.8349f,74.2188f, -35.1563f,26.2326f,74.2188f, -39.0625f,27.8003f,74.2188f, -42.9688f,28.502f,74.2188f, -46.875f,28.7947f,74.2188f, -50.7813f,29.109f,74.2188f, -54.6875f,29.4315f,74.2188f, -58.5938f,29.1948f,74.2188f, -62.5f,28.241f,74.2188f, -66.4063f,26.6727f,74.2188f, -70.3125f,25.5496f,74.2188f, -74.2188f,24.2265f,74.2188f, -78.125f,24.8641f,74.2188f, -82.0313f,24.8692f,74.2188f, -85.9375f,23.8066f,74.2188f, -89.8438f,24.5827f,74.2188f, -93.75f,25.5885f,74.2188f, -97.6563f,25.005f,74.2188f, -101.563f,25.4768f,74.2188f, -105.469f,25.8326f,74.2188f, -109.375f,25.8587f,74.2188f, -113.281f,26.8029f,74.2188f, -117.188f,27.8764f,74.2188f, -121.094f,28.8835f,74.2188f, -125.0f,30.0077f,74.2188f, -128.906f,31.9776f,74.2188f, -132.813f,34.2008f,74.2188f, -136.719f,35.4023f,74.2188f, -140.625f,36.3754f,74.2188f, -144.531f,38.9991f,74.2188f, -148.438f,41.295f,74.2188f, -152.344f,44.1131f,74.2188f, -156.25f,46.2221f,74.2188f, -160.156f,46.7797f,74.2188f, -164.063f,47.446f,74.2188f, -167.969f,47.1396f,74.2188f, -171.875f,45.9937f,74.2188f, -175.781f,45.4284f,74.2188f, -179.688f,45.018f,74.2188f, -183.594f,43.1233f,74.2188f, -187.5f,41.2272f,74.2188f, -191.406f,37.8072f,74.2188f, -195.313f,36.5304f,74.2188f, -199.219f,35.1638f,74.2188f, -203.125f,33.1538f,74.2188f, -207.031f,30.2207f,74.2188f, -210.938f,26.1665f,74.2188f, -214.844f,22.1619f,74.2188f, -218.75f,18.452f,74.2188f, -222.656f,17.0925f,74.2188f, -226.563f,17.3468f,74.2188f, -230.469f,16.447f,74.2188f, -234.375f,15.7197f,74.2188f, -238.281f,14.7889f,74.2188f, -242.188f,13.641f,74.2188f, -246.094f,12.7728f,74.2188f, -250.0f,13.3875f,74.2188f, -3.90625f,22.948f,70.3125f, -7.8125f,24.3431f,70.3125f, -11.7188f,24.6307f,70.3125f, -15.625f,24.9963f,70.3125f, -19.5313f,25.2034f,70.3125f, -23.4375f,25.2791f,70.3125f, -27.3438f,25.8257f,70.3125f, -31.25f,27.1123f,70.3125f, -35.1563f,27.8795f,70.3125f, -39.0625f,28.8437f,70.3125f, -42.9688f,29.8883f,70.3125f, -46.875f,30.6548f,70.3125f, -50.7813f,31.0396f,70.3125f, -54.6875f,31.6324f,70.3125f, -58.5938f,31.5222f,70.3125f, -62.5f,30.4696f,70.3125f, -66.4063f,28.7208f,70.3125f, -70.3125f,26.8611f,70.3125f, -74.2188f,25.6776f,70.3125f, -78.125f,26.1193f,70.3125f, -82.0313f,25.1971f,70.3125f, -85.9375f,24.4814f,70.3125f, -89.8438f,25.1213f,70.3125f, -93.75f,26.1411f,70.3125f, -97.6563f,26.4276f,70.3125f, -101.563f,26.0728f,70.3125f, -105.469f,26.113f,70.3125f, -109.375f,27.5702f,70.3125f, -113.281f,28.6199f,70.3125f, -117.188f,30.054f,70.3125f, -121.094f,30.255f,70.3125f, -125.0f,30.9839f,70.3125f, -128.906f,32.4045f,70.3125f, -132.813f,33.9858f,70.3125f, -136.719f,35.8568f,70.3125f, -140.625f,37.5803f,70.3125f, -144.531f,40.2984f,70.3125f, -148.438f,41.9326f,70.3125f, -152.344f,44.1607f,70.3125f, -156.25f,45.6454f,70.3125f, -160.156f,47.3567f,70.3125f, -164.063f,48.1147f,70.3125f, -167.969f,47.7671f,70.3125f, -171.875f,46.1009f,70.3125f, -175.781f,45.3829f,70.3125f, -179.688f,44.3458f,70.3125f, -183.594f,42.818f,70.3125f, -187.5f,40.5253f,70.3125f, -191.406f,37.6731f,70.3125f, -195.313f,36.7234f,70.3125f, -199.219f,35.0848f,70.3125f, -203.125f,33.0857f,70.3125f, -207.031f,30.0508f,70.3125f, -210.938f,26.741f,70.3125f, -214.844f,22.7613f,70.3125f, -218.75f,18.5375f,70.3125f, -222.656f,15.6052f,70.3125f, -226.563f,14.6945f,70.3125f, -230.469f,15.0013f,70.3125f, -234.375f,13.9965f,70.3125f, -238.281f,12.4404f,70.3125f, -242.188f,12.4448f,70.3125f, -246.094f,11.7446f,70.3125f, -250.0f,11.7886f,70.3125f, -3.90625f,25.5564f,66.4063f, -7.8125f,26.1216f,66.4063f, -11.7188f,26.234f,66.4063f, -15.625f,26.4553f,66.4063f, -19.5313f,26.9827f,66.4063f, -23.4375f,27.0173f,66.4063f, -27.3438f,27.3577f,66.4063f, -31.25f,28.895f,66.4063f, -35.1563f,30.1057f,66.4063f, -39.0625f,30.249f,66.4063f, -42.9688f,31.1394f,66.4063f, -46.875f,31.7197f,66.4063f, -50.7813f,33.2905f,66.4063f, -54.6875f,33.6208f,66.4063f, -58.5938f,33.5152f,66.4063f, -62.5f,31.5128f,66.4063f, -66.4063f,30.1049f,66.4063f, -70.3125f,28.9139f,66.4063f, -74.2188f,27.093f,66.4063f, -78.125f,26.8272f,66.4063f, -82.0313f,25.8777f,66.4063f, -85.9375f,25.2597f,66.4063f, -89.8438f,25.8742f,66.4063f, -93.75f,27.4783f,66.4063f, -97.6563f,27.1897f,66.4063f, -101.563f,26.8406f,66.4063f, -105.469f,27.2889f,66.4063f, -109.375f,28.6616f,66.4063f, -113.281f,29.2852f,66.4063f, -117.188f,30.3362f,66.4063f, -121.094f,32.0648f,66.4063f, -125.0f,32.6693f,66.4063f, -128.906f,33.7239f,66.4063f, -132.813f,34.8193f,66.4063f, -136.719f,36.6878f,66.4063f, -140.625f,38.5422f,66.4063f, -144.531f,40.5193f,66.4063f, -148.438f,42.0434f,66.4063f, -152.344f,43.692f,66.4063f, -156.25f,46.2f,66.4063f, -160.156f,47.7247f,66.4063f, -164.063f,48.3486f,66.4063f, -167.969f,48.4057f,66.4063f, -171.875f,47.4141f,66.4063f, -175.781f,45.925f,66.4063f, -179.688f,44.0772f,66.4063f, -183.594f,42.0866f,66.4063f, -187.5f,40.2687f,66.4063f, -191.406f,38.0236f,66.4063f, -195.313f,36.9223f,66.4063f, -199.219f,35.6323f,66.4063f, -203.125f,33.0001f,66.4063f, -207.031f,30.1425f,66.4063f, -210.938f,26.4551f,66.4063f, -214.844f,22.4224f,66.4063f, -218.75f,18.5557f,66.4063f, -222.656f,16.1428f,66.4063f, -226.563f,14.9942f,66.4063f, -230.469f,14.9221f,66.4063f, -234.375f,13.3816f,66.4063f, -238.281f,10.9914f,66.4063f, -242.188f,10.6094f,66.4063f, -246.094f,9.77905f,66.4063f, -250.0f,9.99853f,66.4063f, -3.90625f,27.1929f,62.5f, -7.8125f,28.1411f,62.5f, -11.7188f,27.9312f,62.5f, -15.625f,27.692f,62.5f, -19.5313f,27.8511f,62.5f, -23.4375f,28.2162f,62.5f, -27.3438f,29.5518f,62.5f, -31.25f,30.2367f,62.5f, -35.1563f,31.1075f,62.5f, -39.0625f,31.6239f,62.5f, -42.9688f,32.8498f,62.5f, -46.875f,33.1521f,62.5f, -50.7813f,34.6411f,62.5f, -54.6875f,35.0063f,62.5f, -58.5938f,33.8006f,62.5f, -62.5f,33.1029f,62.5f, -66.4063f,32.1466f,62.5f, -70.3125f,30.2614f,62.5f, -74.2188f,28.2978f,62.5f, -78.125f,28.0764f,62.5f, -82.0313f,27.2473f,62.5f, -85.9375f,26.2769f,62.5f, -89.8438f,26.2922f,62.5f, -93.75f,27.1235f,62.5f, -97.6563f,27.498f,62.5f, -101.563f,27.2257f,62.5f, -105.469f,28.2897f,62.5f, -109.375f,28.8921f,62.5f, -113.281f,30.563f,62.5f, -117.188f,32.1298f,62.5f, -121.094f,32.8639f,62.5f, -125.0f,34.6537f,62.5f, -128.906f,35.4867f,62.5f, -132.813f,36.6181f,62.5f, -136.719f,37.6418f,62.5f, -140.625f,39.2228f,62.5f, -144.531f,40.5105f,62.5f, -148.438f,42.215f,62.5f, -152.344f,43.5394f,62.5f, -156.25f,45.1171f,62.5f, -160.156f,46.6711f,62.5f, -164.063f,47.4274f,62.5f, -167.969f,47.6821f,62.5f, -171.875f,48.0762f,62.5f, -175.781f,46.4607f,62.5f, -179.688f,44.7623f,62.5f, -183.594f,42.6372f,62.5f, -187.5f,40.3231f,62.5f, -191.406f,38.4371f,62.5f, -195.313f,36.1978f,62.5f, -199.219f,35.38f,62.5f, -203.125f,32.0325f,62.5f, -207.031f,29.2047f,62.5f, -210.938f,27.481f,62.5f, -214.844f,24.0627f,62.5f, -218.75f,20.6235f,62.5f, -222.656f,18.5468f,62.5f, -226.563f,17.2736f,62.5f, -230.469f,15.4125f,62.5f, -234.375f,13.6775f,62.5f, -238.281f,11.4407f,62.5f, -242.188f,9.73154f,62.5f, -246.094f,8.55197f,62.5f, -250.0f,8.43693f,62.5f, -3.90625f,28.3495f,58.5938f, -7.8125f,28.8832f,58.5938f, -11.7188f,28.5512f,58.5938f, -15.625f,28.8533f,58.5938f, -19.5313f,29.0576f,58.5938f, -23.4375f,30.3079f,58.5938f, -27.3438f,31.3861f,58.5938f, -31.25f,33.0252f,58.5938f, -35.1563f,33.4087f,58.5938f, -39.0625f,34.3736f,58.5938f, -42.9688f,34.6944f,58.5938f, -46.875f,34.1156f,58.5938f, -50.7813f,34.7246f,58.5938f, -54.6875f,35.3934f,58.5938f, -58.5938f,34.9508f,58.5938f, -62.5f,34.469f,58.5938f, -66.4063f,33.1584f,58.5938f, -70.3125f,30.5913f,58.5938f, -74.2188f,30.4147f,58.5938f, -78.125f,30.821f,58.5938f, -82.0313f,29.9244f,58.5938f, -85.9375f,28.365f,58.5938f, -89.8438f,27.8694f,58.5938f, -93.75f,27.7517f,58.5938f, -97.6563f,27.9188f,58.5938f, -101.563f,27.7605f,58.5938f, -105.469f,28.252f,58.5938f, -109.375f,29.4592f,58.5938f, -113.281f,31.2608f,58.5938f, -117.188f,33.5373f,58.5938f, -121.094f,34.4995f,58.5938f, -125.0f,35.1593f,58.5938f, -128.906f,36.6148f,58.5938f, -132.813f,37.1425f,58.5938f, -136.719f,38.2148f,58.5938f, -140.625f,38.9964f,58.5938f, -144.531f,40.3196f,58.5938f, -148.438f,42.4959f,58.5938f, -152.344f,43.37f,58.5938f, -156.25f,44.3488f,58.5938f, -160.156f,45.6441f,58.5937f, -164.063f,45.6597f,58.5937f, -167.969f,46.9631f,58.5938f, -171.875f,47.0933f,58.5938f, -175.781f,45.839f,58.5937f, -179.688f,44.0491f,58.5937f, -183.594f,41.6462f,58.5938f, -187.5f,39.9012f,58.5938f, -191.406f,37.8373f,58.5938f, -195.313f,35.0871f,58.5938f, -199.219f,34.6045f,58.5938f, -203.125f,32.4469f,58.5938f, -207.031f,30.5103f,58.5938f, -210.938f,28.7194f,58.5938f, -214.844f,26.3358f,58.5938f, -218.75f,24.3668f,58.5938f, -222.656f,22.1719f,58.5938f, -226.563f,20.1708f,58.5938f, -230.469f,18.1384f,58.5938f, -234.375f,15.6994f,58.5938f, -238.281f,12.6124f,58.5938f, -242.188f,11.2279f,58.5938f, -246.094f,10.4938f,58.5938f, -250.0f,9.45058f,58.5938f, -3.90625f,29.2057f,54.6875f, -7.8125f,29.4161f,54.6875f, -11.7188f,29.6274f,54.6875f, -15.625f,29.8747f,54.6875f, -19.5313f,31.3353f,54.6875f, -23.4375f,32.5261f,54.6875f, -27.3438f,34.3893f,54.6875f, -31.25f,34.9525f,54.6875f, -35.1563f,35.8992f,54.6875f, -39.0625f,36.2066f,54.6875f, -42.9688f,36.4212f,54.6875f, -46.875f,36.1377f,54.6875f, -50.7813f,35.4213f,54.6875f, -54.6875f,35.5045f,54.6875f, -58.5938f,36.0891f,54.6875f, -62.5f,36.0244f,54.6875f, -66.4063f,34.9086f,54.6875f, -70.3125f,32.8671f,54.6875f, -74.2188f,33.5578f,54.6875f, -78.125f,33.8468f,54.6875f, -82.0313f,32.868f,54.6875f, -85.9375f,31.2245f,54.6875f, -89.8438f,29.442f,54.6875f, -93.75f,28.9144f,54.6875f, -97.6563f,27.6797f,54.6875f, -101.563f,27.9585f,54.6875f, -105.469f,28.5492f,54.6875f, -109.375f,29.119f,54.6875f, -113.281f,30.7234f,54.6875f, -117.188f,32.402f,54.6875f, -121.094f,34.3605f,54.6875f, -125.0f,35.6614f,54.6875f, -128.906f,37.1814f,54.6875f, -132.813f,37.8509f,54.6875f, -136.719f,38.3282f,54.6875f, -140.625f,39.021f,54.6875f, -144.531f,39.8455f,54.6875f, -148.438f,41.3547f,54.6875f, -152.344f,42.0848f,54.6875f, -156.25f,42.4546f,54.6875f, -160.156f,43.3035f,54.6875f, -164.063f,44.2757f,54.6875f, -167.969f,45.0917f,54.6875f, -171.875f,44.9479f,54.6875f, -175.781f,44.386f,54.6875f, -179.688f,43.1031f,54.6875f, -183.594f,41.5243f,54.6875f, -187.5f,39.9976f,54.6875f, -191.406f,37.1931f,54.6875f, -195.313f,35.2297f,54.6875f, -199.219f,34.439f,54.6875f, -203.125f,32.7399f,54.6875f, -207.031f,31.4766f,54.6875f, -210.938f,29.9402f,54.6875f, -214.844f,28.6752f,54.6875f, -218.75f,27.0387f,54.6875f, -222.656f,24.4777f,54.6875f, -226.563f,21.7169f,54.6875f, -230.469f,20.0299f,54.6875f, -234.375f,17.3103f,54.6875f, -238.281f,14.1891f,54.6875f, -242.188f,12.1605f,54.6875f, -246.094f,10.9065f,54.6875f, -250.0f,10.6619f,54.6875f, -3.90625f,30.4306f,50.7813f, -7.8125f,30.9679f,50.7813f, -11.7188f,31.3065f,50.7813f, -15.625f,32.0527f,50.7813f, -19.5313f,33.9185f,50.7813f, -23.4375f,34.6834f,50.7813f, -27.3438f,35.8025f,50.7813f, -31.25f,36.824f,50.7813f, -35.1563f,37.9949f,50.7813f, -39.0625f,38.2428f,50.7813f, -42.9688f,37.3912f,50.7813f, -46.875f,37.2849f,50.7813f, -50.7813f,36.4441f,50.7813f, -54.6875f,36.5986f,50.7813f, -58.5938f,36.7371f,50.7813f, -62.5f,36.6154f,50.7813f, -66.4063f,35.9475f,50.7813f, -70.3125f,35.1832f,50.7813f, -74.2188f,35.7876f,50.7813f, -78.125f,35.9086f,50.7813f, -82.0313f,35.0048f,50.7813f, -85.9375f,33.7202f,50.7813f, -89.8438f,32.6473f,50.7813f, -93.75f,30.9552f,50.7813f, -97.6563f,28.7453f,50.7813f, -101.563f,29.1526f,50.7813f, -105.469f,29.9957f,50.7813f, -109.375f,30.5544f,50.7813f, -113.281f,31.6947f,50.7813f, -117.188f,32.7584f,50.7813f, -121.094f,34.2518f,50.7813f, -125.0f,36.3694f,50.7813f, -128.906f,36.9477f,50.7813f, -132.813f,37.2918f,50.7813f, -136.719f,37.8325f,50.7813f, -140.625f,38.0845f,50.7813f, -144.531f,40.0088f,50.7813f, -148.438f,40.8219f,50.7813f, -152.344f,42.4039f,50.7813f, -156.25f,42.6086f,50.7813f, -160.156f,43.5487f,50.7813f, -164.063f,43.5328f,50.7813f, -167.969f,44.212f,50.7812f, -171.875f,43.6744f,50.7813f, -175.781f,43.198f,50.7813f, -179.688f,42.957f,50.7813f, -183.594f,41.4993f,50.7813f, -187.5f,39.5101f,50.7813f, -191.406f,38.1729f,50.7813f, -195.313f,35.4881f,50.7813f, -199.219f,34.6384f,50.7813f, -203.125f,34.1873f,50.7813f, -207.031f,32.1155f,50.7813f, -210.938f,30.912f,50.7813f, -214.844f,30.3391f,50.7813f, -218.75f,28.1256f,50.7813f, -222.656f,24.902f,50.7813f, -226.563f,22.2443f,50.7813f, -230.469f,20.9172f,50.7813f, -234.375f,18.8508f,50.7813f, -238.281f,15.9912f,50.7813f, -242.188f,12.7716f,50.7813f, -246.094f,11.6189f,50.7813f, -250.0f,12.2688f,50.7813f, -3.90625f,30.8772f,46.875f, -7.8125f,32.4754f,46.875f, -11.7188f,33.6983f,46.875f, -15.625f,35.14f,46.875f, -19.5313f,37.0369f,46.875f, -23.4375f,38.369f,46.875f, -27.3438f,38.6134f,46.875f, -31.25f,38.9784f,46.875f, -35.1563f,39.9891f,46.875f, -39.0625f,40.3197f,46.875f, -42.9688f,39.9692f,46.875f, -46.875f,39.6994f,46.875f, -50.7813f,39.4183f,46.875f, -54.6875f,38.2948f,46.875f, -58.5938f,38.32f,46.875f, -62.5f,38.621f,46.875f, -66.4063f,38.2134f,46.875f, -70.3125f,36.9577f,46.875f, -74.2188f,37.2936f,46.875f, -78.125f,37.8653f,46.875f, -82.0313f,36.9058f,46.875f, -85.9375f,36.1841f,46.875f, -89.8438f,34.8143f,46.875f, -93.75f,33.0783f,46.875f, -97.6563f,30.9854f,46.875f, -101.563f,30.934f,46.875f, -105.469f,32.108f,46.875f, -109.375f,33.0462f,46.875f, -113.281f,32.9253f,46.875f, -117.188f,33.3377f,46.875f, -121.094f,34.2153f,46.875f, -125.0f,35.0739f,46.875f, -128.906f,36.8239f,46.875f, -132.813f,37.1463f,46.875f, -136.719f,37.5409f,46.875f, -140.625f,38.8265f,46.875f, -144.531f,40.7241f,46.875f, -148.438f,40.9349f,46.875f, -152.344f,42.4491f,46.875f, -156.25f,43.9695f,46.875f, -160.156f,44.2191f,46.875f, -164.063f,44.9265f,46.875f, -167.969f,43.9423f,46.875f, -171.875f,43.273f,46.875f, -175.781f,43.2543f,46.875f, -179.688f,42.5328f,46.875f, -183.594f,41.1777f,46.875f, -187.5f,39.3553f,46.875f, -191.406f,37.8242f,46.875f, -195.313f,36.4649f,46.875f, -199.219f,35.6955f,46.875f, -203.125f,35.1878f,46.875f, -207.031f,32.9438f,46.875f, -210.938f,31.3677f,46.875f, -214.844f,30.7282f,46.875f, -218.75f,28.3328f,46.875f, -222.656f,25.0599f,46.875f, -226.563f,24.1932f,46.875f, -230.469f,22.3853f,46.875f, -234.375f,19.4896f,46.875f, -238.281f,16.8753f,46.875f, -242.188f,13.9469f,46.875f, -246.094f,13.2975f,46.875f, -250.0f,13.2524f,46.875f, -3.90625f,31.8945f,42.9688f, -7.8125f,34.0117f,42.9688f, -11.7188f,36.2441f,42.9688f, -15.625f,37.3622f,42.9688f, -19.5313f,39.5877f,42.9688f, -23.4375f,41.0994f,42.9688f, -27.3438f,42.0864f,42.9688f, -31.25f,42.0849f,42.9688f, -35.1563f,42.2038f,42.9688f, -39.0625f,43.473f,42.9688f, -42.9688f,42.7754f,42.9688f, -46.875f,42.3177f,42.9688f, -50.7813f,42.209f,42.9688f, -54.6875f,41.3095f,42.9688f, -58.5938f,40.8629f,42.9688f, -62.5f,40.4776f,42.9688f, -66.4063f,40.1396f,42.9688f, -70.3125f,39.1169f,42.9688f, -74.2188f,39.1382f,42.9688f, -78.125f,39.1421f,42.9688f, -82.0313f,38.9022f,42.9688f, -85.9375f,37.5711f,42.9688f, -89.8438f,36.7924f,42.9688f, -93.75f,34.7734f,42.9688f, -97.6563f,33.167f,42.9688f, -101.563f,32.4173f,42.9688f, -105.469f,33.0466f,42.9688f, -109.375f,33.3882f,42.9688f, -113.281f,33.7538f,42.9688f, -117.188f,33.5661f,42.9688f, -121.094f,33.9051f,42.9688f, -125.0f,34.9181f,42.9688f, -128.906f,35.2925f,42.9688f, -132.813f,37.1741f,42.9688f, -136.719f,38.0993f,42.9688f, -140.625f,38.7621f,42.9688f, -144.531f,39.712f,42.9688f, -148.438f,40.7257f,42.9688f, -152.344f,42.2465f,42.9688f, -156.25f,43.5331f,42.9688f, -160.156f,44.6745f,42.9687f, -164.063f,44.564f,42.9688f, -167.969f,44.6075f,42.9688f, -171.875f,43.2227f,42.9688f, -175.781f,42.5688f,42.9688f, -179.688f,41.9742f,42.9688f, -183.594f,40.3484f,42.9688f, -187.5f,38.9109f,42.9688f, -191.406f,37.7273f,42.9688f, -195.313f,36.5287f,42.9688f, -199.219f,35.9361f,42.9688f, -203.125f,35.1638f,42.9688f, -207.031f,33.6615f,42.9688f, -210.938f,31.2785f,42.9688f, -214.844f,30.1259f,42.9688f, -218.75f,28.6143f,42.9688f, -222.656f,26.1162f,42.9688f, -226.563f,24.2882f,42.9688f, -230.469f,22.5195f,42.9688f, -234.375f,20.1462f,42.9688f, -238.281f,17.4811f,42.9688f, -242.188f,15.2736f,42.9688f, -246.094f,13.788f,42.9688f, -250.0f,13.1723f,42.9688f, -3.90625f,34.9171f,39.0625f, -7.8125f,36.7711f,39.0625f, -11.7188f,38.5677f,39.0625f, -15.625f,40.0524f,39.0625f, -19.5313f,42.2392f,39.0625f, -23.4375f,43.2332f,39.0625f, -27.3438f,44.8254f,39.0625f, -31.25f,45.1808f,39.0625f, -35.1563f,44.9684f,39.0625f, -39.0625f,45.0647f,39.0625f, -42.9688f,45.0888f,39.0625f, -46.875f,45.5266f,39.0625f, -50.7813f,45.2542f,39.0625f, -54.6875f,44.1797f,39.0625f, -58.5938f,43.2658f,39.0625f, -62.5f,42.7568f,39.0625f, -66.4063f,42.4159f,39.0625f, -70.3125f,41.3883f,39.0625f, -74.2188f,41.1975f,39.0625f, -78.125f,41.3073f,39.0625f, -82.0313f,41.0587f,39.0625f, -85.9375f,40.0611f,39.0625f, -89.8438f,38.7299f,39.0625f, -93.75f,37.2923f,39.0625f, -97.6563f,35.7971f,39.0625f, -101.563f,35.1982f,39.0625f, -105.469f,33.6408f,39.0625f, -109.375f,33.2619f,39.0625f, -113.281f,33.8387f,39.0625f, -117.188f,34.7554f,39.0625f, -121.094f,33.8569f,39.0625f, -125.0f,34.7741f,39.0625f, -128.906f,35.7319f,39.0625f, -132.813f,36.6023f,39.0625f, -136.719f,37.7084f,39.0625f, -140.625f,38.2513f,39.0625f, -144.531f,39.1992f,39.0625f, -148.438f,40.2336f,39.0625f, -152.344f,41.0883f,39.0625f, -156.25f,42.4004f,39.0625f, -160.156f,42.8753f,39.0625f, -164.063f,43.1631f,39.0625f, -167.969f,43.6378f,39.0625f, -171.875f,43.2113f,39.0625f, -175.781f,42.5474f,39.0625f, -179.688f,41.3413f,39.0625f, -183.594f,39.4383f,39.0625f, -187.5f,38.9723f,39.0625f, -191.406f,37.3549f,39.0625f, -195.313f,35.8615f,39.0625f, -199.219f,34.9243f,39.0625f, -203.125f,34.598f,39.0625f, -207.031f,33.6592f,39.0625f, -210.938f,32.2347f,39.0625f, -214.844f,30.4117f,39.0625f, -218.75f,28.4787f,39.0625f, -222.656f,26.6538f,39.0625f, -226.563f,24.4892f,39.0625f, -230.469f,22.9637f,39.0625f, -234.375f,20.6363f,39.0625f, -238.281f,18.4584f,39.0625f, -242.188f,16.293f,39.0625f, -246.094f,13.7473f,39.0625f, -250.0f,13.2449f,39.0625f, -3.90625f,38.5427f,35.1563f, -7.8125f,39.2771f,35.1563f, -11.7188f,40.4801f,35.1563f, -15.625f,42.2714f,35.1563f, -19.5313f,44.0743f,35.1562f, -23.4375f,45.9071f,35.1562f, -27.3438f,47.4425f,35.1563f, -31.25f,47.765f,35.1563f, -35.1563f,46.8453f,35.1562f, -39.0625f,47.1161f,35.1562f, -42.9688f,46.591f,35.1563f, -46.875f,47.4064f,35.1563f, -50.7813f,47.2001f,35.1562f, -54.6875f,47.2372f,35.1562f, -58.5938f,46.9666f,35.1563f, -62.5f,45.3322f,35.1563f, -66.4063f,44.4351f,35.1562f, -70.3125f,43.869f,35.1562f, -74.2188f,43.7604f,35.1563f, -78.125f,43.6414f,35.1563f, -82.0313f,43.6044f,35.1563f, -85.9375f,41.9765f,35.1563f, -89.8438f,40.597f,35.1563f, -93.75f,38.8088f,35.1563f, -97.6563f,37.4254f,35.1563f, -101.563f,36.4869f,35.1563f, -105.469f,34.7975f,35.1563f, -109.375f,32.6051f,35.1563f, -113.281f,32.3929f,35.1563f, -117.188f,33.3906f,35.1563f, -121.094f,33.728f,35.1563f, -125.0f,33.8089f,35.1563f, -128.906f,35.2443f,35.1563f, -132.813f,35.9877f,35.1563f, -136.719f,36.3747f,35.1563f, -140.625f,37.6045f,35.1563f, -144.531f,38.3698f,35.1563f, -148.438f,39.393f,35.1563f, -152.344f,40.0115f,35.1563f, -156.25f,40.8722f,35.1563f, -160.156f,40.7302f,35.1563f, -164.063f,41.6767f,35.1563f, -167.969f,42.1719f,35.1563f, -171.875f,41.924f,35.1563f, -175.781f,40.9628f,35.1563f, -179.688f,39.3209f,35.1563f, -183.594f,37.9615f,35.1563f, -187.5f,37.2902f,35.1563f, -191.406f,36.1521f,35.1563f, -195.313f,35.5697f,35.1563f, -199.219f,35.0547f,35.1563f, -203.125f,33.8422f,35.1563f, -207.031f,33.1699f,35.1563f, -210.938f,32.4197f,35.1563f, -214.844f,31.0723f,35.1563f, -218.75f,29.1069f,35.1563f, -222.656f,26.4015f,35.1563f, -226.563f,23.6862f,35.1563f, -230.469f,22.3142f,35.1563f, -234.375f,20.9225f,35.1563f, -238.281f,18.6533f,35.1563f, -242.188f,16.5438f,35.1563f, -246.094f,14.5457f,35.1563f, -250.0f,13.5112f,35.1563f, -3.90625f,41.4381f,31.25f, -7.8125f,41.4661f,31.25f, -11.7188f,42.5211f,31.25f, -15.625f,44.1517f,31.25f, -19.5313f,45.8301f,31.25f, -23.4375f,47.3213f,31.25f, -27.3438f,49.1504f,31.25f, -31.25f,49.1313f,31.25f, -35.1563f,48.4621f,31.25f, -39.0625f,48.0866f,31.25f, -42.9688f,47.5259f,31.25f, -46.875f,48.2042f,31.25f, -50.7813f,48.2678f,31.25f, -54.6875f,48.6796f,31.25f, -58.5938f,49.1508f,31.25f, -62.5f,48.5261f,31.25f, -66.4063f,47.2699f,31.25f, -70.3125f,46.3239f,31.25f, -74.2188f,45.9053f,31.25f, -78.125f,45.2948f,31.25f, -82.0313f,45.1222f,31.25f, -85.9375f,44.1773f,31.25f, -89.8438f,42.0751f,31.25f, -93.75f,39.8181f,31.25f, -97.6563f,38.1904f,31.25f, -101.563f,36.9029f,31.25f, -105.469f,35.9897f,31.25f, -109.375f,34.1082f,31.25f, -113.281f,33.9882f,31.25f, -117.188f,33.4544f,31.25f, -121.094f,32.7435f,31.25f, -125.0f,32.2982f,31.25f, -128.906f,33.2893f,31.25f, -132.813f,34.4302f,31.25f, -136.719f,35.501f,31.25f, -140.625f,36.4162f,31.25f, -144.531f,38.0795f,31.25f, -148.438f,38.4184f,31.25f, -152.344f,38.1695f,31.25f, -156.25f,39.1334f,31.25f, -160.156f,39.8018f,31.25f, -164.063f,40.4009f,31.25f, -167.969f,40.6662f,31.25f, -171.875f,40.6389f,31.25f, -175.781f,40.0005f,31.25f, -179.688f,38.1437f,31.25f, -183.594f,36.1677f,31.25f, -187.5f,35.7553f,31.25f, -191.406f,35.2539f,31.25f, -195.313f,34.5258f,31.25f, -199.219f,33.9511f,31.25f, -203.125f,33.8209f,31.25f, -207.031f,32.5194f,31.25f, -210.938f,31.6797f,31.25f, -214.844f,30.494f,31.25f, -218.75f,28.9089f,31.25f, -222.656f,27.096f,31.25f, -226.563f,23.5752f,31.25f, -230.469f,22.5423f,31.25f, -234.375f,20.8438f,31.25f, -238.281f,18.7938f,31.25f, -242.188f,16.7022f,31.25f, -246.094f,14.6115f,31.25f, -250.0f,12.7758f,31.25f, -3.90625f,42.7334f,27.3437f, -7.8125f,43.3658f,27.3438f, -11.7188f,44.93f,27.3437f, -15.625f,46.7113f,27.3438f, -19.5313f,48.1031f,27.3437f, -23.4375f,48.7173f,27.3438f, -27.3438f,49.0875f,27.3437f, -31.25f,50.1272f,27.3438f, -35.1563f,49.1784f,27.3437f, -39.0625f,50.4569f,27.3438f, -42.9688f,49.7216f,27.3437f, -46.875f,49.0563f,27.3438f, -50.7813f,48.7494f,27.3437f, -54.6875f,49.0519f,27.3438f, -58.5938f,49.8264f,27.3437f, -62.5f,49.8194f,27.3438f, -66.4063f,48.9033f,27.3437f, -70.3125f,47.5002f,27.3438f, -74.2188f,46.7308f,27.3437f, -78.125f,45.8132f,27.3438f, -82.0313f,45.4303f,27.3437f, -85.9375f,44.4837f,27.3438f, -89.8438f,42.6706f,27.3437f, -93.75f,40.5108f,27.3438f, -97.6563f,38.4748f,27.3437f, -101.563f,38.2458f,27.3438f, -105.469f,37.8191f,27.3437f, -109.375f,37.5503f,27.3438f, -113.281f,36.4883f,27.3437f, -117.188f,35.7025f,27.3438f, -121.094f,34.3569f,27.3437f, -125.0f,34.052f,27.3438f, -128.906f,34.3166f,27.3437f, -132.813f,33.9873f,27.3438f, -136.719f,33.8326f,27.3437f, -140.625f,35.5138f,27.3438f, -144.531f,35.9847f,27.3437f, -148.438f,36.3159f,27.3438f, -152.344f,38.1026f,27.3437f, -156.25f,39.0191f,27.3438f, -160.156f,39.0705f,27.3437f, -164.063f,38.9644f,27.3438f, -167.969f,38.0972f,27.3437f, -171.875f,38.277f,27.3438f, -175.781f,37.5686f,27.3437f, -179.688f,35.9897f,27.3438f, -183.594f,34.1554f,27.3437f, -187.5f,33.9646f,27.3438f, -191.406f,33.9556f,27.3437f, -195.313f,33.7374f,27.3438f, -199.219f,33.3736f,27.3437f, -203.125f,32.1967f,27.3438f, -207.031f,32.2131f,27.3437f, -210.938f,30.4757f,27.3438f, -214.844f,29.0495f,27.3437f, -218.75f,27.539f,27.3438f, -222.656f,25.7435f,27.3437f, -226.563f,23.5358f,27.3438f, -230.469f,22.5305f,27.3437f, -234.375f,20.3466f,27.3438f, -238.281f,18.5956f,27.3438f, -242.188f,16.6554f,27.3438f, -246.094f,14.7633f,27.3438f, -250.0f,12.979f,27.3438f, -3.90625f,44.6783f,23.4375f, -7.8125f,46.1279f,23.4375f, -11.7188f,47.9921f,23.4375f, -15.625f,48.593f,23.4375f, -19.5313f,49.826f,23.4375f, -23.4375f,50.0111f,23.4375f, -27.3438f,49.773f,23.4375f, -31.25f,50.6443f,23.4375f, -35.1563f,50.242f,23.4375f, -39.0625f,51.5289f,23.4375f, -42.9688f,51.3905f,23.4375f, -46.875f,50.5543f,23.4375f, -50.7813f,49.96f,23.4375f, -54.6875f,51.029f,23.4375f, -58.5938f,50.4996f,23.4375f, -62.5f,50.0508f,23.4375f, -66.4063f,49.4463f,23.4375f, -70.3125f,48.7613f,23.4375f, -74.2188f,48.0188f,23.4375f, -78.125f,48.0992f,23.4375f, -82.0313f,47.1947f,23.4375f, -85.9375f,45.1889f,23.4375f, -89.8438f,43.9247f,23.4375f, -93.75f,41.7965f,23.4375f, -97.6563f,40.363f,23.4375f, -101.563f,40.3201f,23.4375f, -105.469f,39.2422f,23.4375f, -109.375f,38.6318f,23.4375f, -113.281f,37.9263f,23.4375f, -117.188f,37.113f,23.4375f, -121.094f,35.4884f,23.4375f, -125.0f,35.8385f,23.4375f, -128.906f,35.4941f,23.4375f, -132.813f,34.1911f,23.4375f, -136.719f,33.6791f,23.4375f, -140.625f,33.4506f,23.4375f, -144.531f,35.4822f,23.4375f, -148.438f,36.0187f,23.4375f, -152.344f,38.231f,23.4375f, -156.25f,39.1197f,23.4375f, -160.156f,38.9095f,23.4375f, -164.063f,38.1737f,23.4375f, -167.969f,36.7498f,23.4375f, -171.875f,36.6113f,23.4375f, -175.781f,35.5895f,23.4375f, -179.688f,34.7415f,23.4375f, -183.594f,32.6574f,23.4375f, -187.5f,32.5837f,23.4375f, -191.406f,32.5272f,23.4375f, -195.313f,32.3611f,23.4375f, -199.219f,31.4784f,23.4375f, -203.125f,30.8078f,23.4375f, -207.031f,29.9524f,23.4375f, -210.938f,29.9998f,23.4375f, -214.844f,28.4828f,23.4375f, -218.75f,26.6709f,23.4375f, -222.656f,24.9874f,23.4375f, -226.563f,23.0213f,23.4375f, -230.469f,21.3587f,23.4375f, -234.375f,19.0527f,23.4375f, -238.281f,18.1056f,23.4375f, -242.188f,16.7916f,23.4375f, -246.094f,14.9561f,23.4375f, -250.0f,13.0063f,23.4375f, -3.90625f,46.9055f,19.5312f, -7.8125f,48.3769f,19.5312f, -11.7188f,50.0613f,19.5312f, -15.625f,50.9962f,19.5312f, -19.5313f,51.161f,19.5312f, -23.4375f,51.7721f,19.5312f, -27.3438f,51.5823f,19.5312f, -31.25f,51.5274f,19.5312f, -35.1563f,51.5913f,19.5312f, -39.0625f,52.4399f,19.5312f, -42.9688f,52.5999f,19.5312f, -46.875f,51.9309f,19.5312f, -50.7813f,51.6062f,19.5312f, -54.6875f,50.86f,19.5312f, -58.5938f,51.1496f,19.5312f, -62.5f,50.1957f,19.5312f, -66.4063f,49.8047f,19.5312f, -70.3125f,49.1838f,19.5312f, -74.2188f,48.7276f,19.5312f, -78.125f,48.4967f,19.5312f, -82.0313f,47.4515f,19.5312f, -85.9375f,46.2594f,19.5312f, -89.8438f,44.6756f,19.5312f, -93.75f,43.0377f,19.5312f, -97.6563f,41.3508f,19.5312f, -101.563f,40.8261f,19.5312f, -105.469f,40.5524f,19.5312f, -109.375f,39.7289f,19.5312f, -113.281f,38.9437f,19.5312f, -117.188f,38.3781f,19.5312f, -121.094f,36.9618f,19.5312f, -125.0f,35.9735f,19.5312f, -128.906f,35.3887f,19.5312f, -132.813f,34.5133f,19.5312f, -136.719f,34.7253f,19.5312f, -140.625f,33.9228f,19.5312f, -144.531f,34.2826f,19.5312f, -148.438f,35.5643f,19.5312f, -152.344f,37.7492f,19.5312f, -156.25f,38.7871f,19.5312f, -160.156f,38.6036f,19.5312f, -164.063f,38.2702f,19.5312f, -167.969f,35.931f,19.5312f, -171.875f,34.8252f,19.5312f, -175.781f,33.99f,19.5312f, -179.688f,33.664f,19.5312f, -183.594f,31.6973f,19.5312f, -187.5f,31.3559f,19.5312f, -191.406f,31.3589f,19.5312f, -195.313f,30.7614f,19.5312f, -199.219f,29.2596f,19.5312f, -203.125f,28.7711f,19.5312f, -207.031f,27.9455f,19.5312f, -210.938f,28.3339f,19.5312f, -214.844f,28.3863f,19.5312f, -218.75f,27.4513f,19.5312f, -222.656f,25.0652f,19.5312f, -226.563f,23.2291f,19.5312f, -230.469f,20.8477f,19.5313f, -234.375f,19.424f,19.5313f, -238.281f,17.7051f,19.5313f, -242.188f,16.5977f,19.5313f, -246.094f,14.7851f,19.5313f, -250.0f,12.8344f,19.5313f, -3.90625f,49.2295f,15.625f, -7.8125f,50.0754f,15.625f, -11.7188f,51.5873f,15.625f, -15.625f,52.0525f,15.625f, -19.5313f,51.4269f,15.625f, -23.4375f,51.8405f,15.625f, -27.3438f,52.3327f,15.625f, -31.25f,53.011f,15.625f, -35.1563f,52.7359f,15.625f, -39.0625f,53.2852f,15.625f, -42.9688f,53.6617f,15.625f, -46.875f,52.4883f,15.625f, -50.7813f,51.9362f,15.625f, -54.6875f,50.8372f,15.625f, -58.5938f,50.1782f,15.625f, -62.5f,49.0401f,15.625f, -66.4063f,49.1011f,15.625f, -70.3125f,48.7903f,15.625f, -74.2188f,48.6124f,15.625f, -78.125f,48.1259f,15.625f, -82.0313f,47.7267f,15.625f, -85.9375f,46.9214f,15.625f, -89.8438f,45.0939f,15.625f, -93.75f,43.6563f,15.625f, -97.6563f,42.5709f,15.625f, -101.563f,41.9572f,15.625f, -105.469f,40.973f,15.625f, -109.375f,40.7682f,15.625f, -113.281f,39.3641f,15.625f, -117.188f,39.2768f,15.625f, -121.094f,37.5977f,15.625f, -125.0f,36.0608f,15.625f, -128.906f,36.045f,15.625f, -132.813f,35.1379f,15.625f, -136.719f,34.9875f,15.625f, -140.625f,34.0482f,15.625f, -144.531f,33.8104f,15.625f, -148.438f,34.9994f,15.625f, -152.344f,36.2664f,15.625f, -156.25f,37.7694f,15.625f, -160.156f,37.6584f,15.625f, -164.063f,36.9226f,15.625f, -167.969f,34.7519f,15.625f, -171.875f,33.2827f,15.625f, -175.781f,32.8949f,15.625f, -179.688f,32.1339f,15.625f, -183.594f,30.407f,15.625f, -187.5f,28.996f,15.625f, -191.406f,29.3357f,15.625f, -195.313f,29.1098f,15.625f, -199.219f,27.8354f,15.625f, -203.125f,26.4739f,15.625f, -207.031f,26.1829f,15.625f, -210.938f,27.387f,15.625f, -214.844f,27.4944f,15.625f, -218.75f,26.4893f,15.625f, -222.656f,24.7764f,15.625f, -226.563f,22.9689f,15.625f, -230.469f,20.4237f,15.625f, -234.375f,18.8049f,15.625f, -238.281f,17.4547f,15.625f, -242.188f,16.2758f,15.625f, -246.094f,14.2192f,15.625f, -250.0f,11.8103f,15.625f, -3.90625f,51.1233f,11.7187f, -7.8125f,51.8127f,11.7187f, -11.7188f,52.0971f,11.7187f, -15.625f,51.8317f,11.7187f, -19.5313f,52.1213f,11.7187f, -23.4375f,51.7889f,11.7187f, -27.3438f,52.2065f,11.7187f, -31.25f,52.438f,11.7187f, -35.1563f,52.6021f,11.7187f, -39.0625f,53.2864f,11.7187f, -42.9688f,52.8882f,11.7187f, -46.875f,52.6009f,11.7187f, -50.7813f,52.8442f,11.7187f, -54.6875f,52.6512f,11.7187f, -58.5938f,51.6436f,11.7187f, -62.5f,50.4271f,11.7187f, -66.4063f,49.3264f,11.7187f, -70.3125f,48.6522f,11.7187f, -74.2188f,49.5854f,11.7187f, -78.125f,50.3492f,11.7187f, -82.0313f,49.035f,11.7187f, -85.9375f,47.6474f,11.7187f, -89.8438f,46.0472f,11.7187f, -93.75f,44.7337f,11.7187f, -97.6563f,44.3349f,11.7187f, -101.563f,43.475f,11.7187f, -105.469f,42.9461f,11.7187f, -109.375f,41.7731f,11.7187f, -113.281f,40.717f,11.7187f, -117.188f,39.399f,11.7187f, -121.094f,38.1327f,11.7187f, -125.0f,36.3286f,11.7187f, -128.906f,36.2512f,11.7187f, -132.813f,35.1997f,11.7187f, -136.719f,33.9406f,11.7187f, -140.625f,33.3109f,11.7187f, -144.531f,33.8153f,11.7187f, -148.438f,33.6823f,11.7187f, -152.344f,34.7077f,11.7187f, -156.25f,35.4472f,11.7187f, -160.156f,35.6332f,11.7187f, -164.063f,34.3651f,11.7187f, -167.969f,32.9876f,11.7187f, -171.875f,32.2858f,11.7187f, -175.781f,32.1374f,11.7187f, -179.688f,30.9575f,11.7187f, -183.594f,29.1111f,11.7187f, -187.5f,28.149f,11.7187f, -191.406f,27.4443f,11.7187f, -195.313f,27.3781f,11.7187f, -199.219f,26.4413f,11.7187f, -203.125f,24.9734f,11.7187f, -207.031f,25.0959f,11.7187f, -210.938f,26.2472f,11.7187f, -214.844f,26.1569f,11.7187f, -218.75f,24.8556f,11.7187f, -222.656f,22.8797f,11.7187f, -226.563f,21.8102f,11.7187f, -230.469f,19.294f,11.7187f, -234.375f,17.5291f,11.7187f, -238.281f,16.242f,11.7187f, -242.188f,15.2738f,11.7187f, -246.094f,13.8715f,11.7187f, -250.0f,12.3043f,11.7187f, -3.90625f,52.2527f,7.8125f, -7.8125f,52.7759f,7.8125f, -11.7188f,52.1635f,7.8125f, -15.625f,52.2016f,7.8125f, -19.5313f,51.9832f,7.8125f, -23.4375f,51.4669f,7.8125f, -27.3438f,51.0033f,7.8125f, -31.25f,50.7124f,7.8125f, -35.1563f,51.6427f,7.8125f, -39.0625f,52.5008f,7.8125f, -42.9688f,53.2834f,7.8125f, -46.875f,52.5339f,7.8125f, -50.7813f,52.627f,7.8125f, -54.6875f,52.9017f,7.8125f, -58.5938f,52.8616f,7.8125f, -62.5f,51.7566f,7.8125f, -66.4063f,51.3268f,7.8125f, -70.3125f,50.6108f,7.8125f, -74.2188f,50.9277f,7.8125f, -78.125f,51.701f,7.8125f, -82.0313f,50.5549f,7.8125f, -85.9375f,48.4345f,7.8125f, -89.8438f,47.3592f,7.8125f, -93.75f,45.7216f,7.8125f, -97.6563f,45.75f,7.8125f, -101.563f,44.4249f,7.8125f, -105.469f,44.7192f,7.8125f, -109.375f,44.4938f,7.8125f, -113.281f,43.252f,7.8125f, -117.188f,41.3735f,7.8125f, -121.094f,39.8664f,7.8125f, -125.0f,37.025f,7.8125f, -128.906f,36.5094f,7.8125f, -132.813f,35.3554f,7.8125f, -136.719f,33.9389f,7.8125f, -140.625f,32.7715f,7.8125f, -144.531f,32.8295f,7.8125f, -148.438f,32.4513f,7.8125f, -152.344f,33.4598f,7.8125f, -156.25f,34.3434f,7.8125f, -160.156f,34.8633f,7.8125f, -164.063f,33.7043f,7.8125f, -167.969f,32.5629f,7.8125f, -171.875f,31.5117f,7.8125f, -175.781f,30.9816f,7.8125f, -179.688f,30.2039f,7.8125f, -183.594f,28.5054f,7.8125f, -187.5f,26.8519f,7.8125f, -191.406f,25.6078f,7.8125f, -195.313f,26.0906f,7.8125f, -199.219f,25.313f,7.8125f, -203.125f,24.0014f,7.8125f, -207.031f,24.066f,7.8125f, -210.938f,24.4935f,7.8125f, -214.844f,24.3803f,7.8125f, -218.75f,23.0075f,7.8125f, -222.656f,21.1023f,7.8125f, -226.563f,19.0418f,7.8125f, -230.469f,17.9588f,7.8125f, -234.375f,16.5211f,7.8125f, -238.281f,15.4949f,7.8125f, -242.188f,14.0938f,7.8125f, -246.094f,13.3141f,7.8125f, -250.0f,12.9595f,7.8125f, -3.90625f,52.6186f,3.90625f, -7.8125f,51.8648f,3.90625f, -11.7188f,51.1949f,3.90625f, -15.625f,50.2102f,3.90625f, -19.5313f,50.6058f,3.90625f, -23.4375f,50.7008f,3.90625f, -27.3438f,51.2163f,3.90625f, -31.25f,51.4263f,3.90625f, -35.1563f,52.1968f,3.90625f, -39.0625f,53.9783f,3.90625f, -42.9688f,53.8927f,3.90625f, -46.875f,53.3266f,3.90625f, -50.7813f,53.5901f,3.90625f, -54.6875f,55.5679f,3.90625f, -58.5938f,55.1819f,3.90625f, -62.5f,53.6891f,3.90625f, -66.4063f,53.0541f,3.90625f, -70.3125f,51.6665f,3.90625f, -74.2188f,51.4469f,3.90625f, -78.125f,51.9591f,3.90625f, -82.0313f,51.0418f,3.90625f, -85.9375f,49.7513f,3.90625f, -89.8438f,48.7329f,3.90625f, -93.75f,46.8713f,3.90625f, -97.6563f,46.3905f,3.90625f, -101.563f,45.4241f,3.90625f, -105.469f,45.6811f,3.90625f, -109.375f,45.3238f,3.90625f, -113.281f,43.6112f,3.90625f, -117.188f,42.1291f,3.90625f, -121.094f,40.4747f,3.90625f, -125.0f,39.3351f,3.90625f, -128.906f,38.0742f,3.90625f, -132.813f,36.7758f,3.90625f, -136.719f,34.9213f,3.90625f, -140.625f,32.3643f,3.90625f, -144.531f,31.7157f,3.90625f, -148.438f,30.6005f,3.90625f, -152.344f,31.6034f,3.90625f, -156.25f,32.6503f,3.90625f, -160.156f,33.3131f,3.90625f, -164.063f,32.5745f,3.90625f, -167.969f,31.5017f,3.90625f, -171.875f,30.6842f,3.90625f, -175.781f,29.8734f,3.90625f, -179.688f,28.6537f,3.90625f, -183.594f,27.2073f,3.90625f, -187.5f,25.4367f,3.90625f, -191.406f,24.1609f,3.90625f, -195.313f,23.9724f,3.90625f, -199.219f,23.7702f,3.90625f, -203.125f,22.4031f,3.90625f, -207.031f,22.1587f,3.90625f, -210.938f,21.6154f,3.90625f, -214.844f,21.8202f,3.90625f, -218.75f,21.017f,3.90625f, -222.656f,19.3736f,3.90625f, -226.563f,18.2127f,3.90625f, -230.469f,17.2263f,3.90625f, -234.375f,16.2938f,3.90625f, -238.281f,14.4518f,3.90625f, -242.188f,13.6398f,3.90625f, -246.094f,13.2404f,3.90625f, -250.0f,12.7102f,3.90625f, -}; - -btScalar Landscape04Nml[] = { --0.350125f,0.914758f,-0.201568f, --0.310159f,0.930741f,-0.193707f, --0.297809f,0.93918f,-0.171025f, --0.203808f,0.975413f,-0.083855f, --0.227869f,0.971729f,-0.0617958f, --0.175976f,0.984209f,0.0190985f, --0.113434f,0.992992f,-0.0331636f, --0.10748f,0.994138f,-0.0117748f, -0.264437f,0.964372f,0.00769155f, -0.281666f,0.958691f,0.0397075f, -0.430486f,0.901936f,-0.0345351f, -0.401178f,0.915992f,-0.00383073f, -0.323069f,0.944057f,-0.0662002f, -0.321744f,0.945983f,-0.039967f, -0.269775f,0.962292f,-0.0348534f, -0.20193f,0.970428f,-0.132266f, -0.268889f,0.954681f,-0.127604f, -0.194635f,0.954618f,-0.225435f, -0.221506f,0.956393f,-0.190387f, -0.193103f,0.932235f,-0.306022f, -0.127904f,0.985279f,-0.113427f, -0.190082f,0.941797f,-0.277285f, --0.00897869f,0.999816f,0.0169309f, -0.104995f,0.98929f,-0.101393f, --0.0904331f,0.992726f,0.0794834f, -0.0230108f,0.991613f,0.127174f, -0.0155488f,0.993572f,0.11213f, -0.0288983f,0.981821f,0.187597f, -0.0247864f,0.996149f,0.0840949f, --0.0831472f,0.996537f,0.000391199f, --0.0501709f,0.99867f,0.0118531f, --0.153f,0.976743f,-0.15021f, --0.106591f,0.988499f,-0.107277f, --0.178503f,0.946807f,-0.267757f, --0.0254657f,0.984638f,-0.172739f, --0.00387521f,0.963955f,-0.266035f, --0.0158619f,0.994497f,-0.103554f, -0.0516719f,0.979433f,-0.195043f, --0.113536f,0.993496f,-0.00869834f, --0.0532458f,0.993386f,-0.101726f, --0.240923f,0.970479f,0.0112676f, --0.272825f,0.959264f,-0.0733371f, --0.364171f,0.921854f,-0.132533f, --0.38043f,0.901643f,-0.205699f, --0.208475f,0.967633f,-0.142215f, --0.200209f,0.964847f,-0.170257f, --0.436593f,0.880066f,-0.186734f, --0.420663f,0.90307f,-0.0866427f, --0.564169f,0.813693f,-0.140058f, --0.556718f,0.83037f,-0.0234562f, --0.419122f,0.896066f,-0.146295f, --0.466908f,0.873897f,-0.135282f, --0.39151f,0.89596f,-0.209704f, --0.388383f,0.911455f,-0.135677f, --0.356022f,0.918213f,-0.173589f, --0.334437f,0.939184f,-0.0780065f, --0.257665f,0.953587f,-0.155824f, --0.309301f,0.93272f,-0.185382f, --0.315034f,0.931862f,-0.179961f, --0.295926f,0.931298f,-0.212393f, --0.436779f,0.896592f,-0.0731173f, --0.317368f,0.948237f,0.0111289f, --0.503169f,0.863334f,0.0383931f, --0.468116f,0.877337f,0.105583f, --0.41232f,0.911034f,0.00307775f, --0.465256f,0.885053f,0.0147642f, --0.139311f,0.987488f,-0.0738976f, --0.20689f,0.974976f,-0.0813499f, --0.0453849f,0.98457f,-0.169006f, --0.109269f,0.973649f,-0.20017f, -0.0405907f,0.980595f,-0.191794f, -0.0742781f,0.990348f,-0.117022f, --0.00934593f,0.982385f,-0.186633f, -0.00811898f,0.984163f,-0.177079f, --0.0726933f,0.996391f,-0.043832f, -0.0160265f,0.999861f,-0.00453309f, --0.163053f,0.986585f,0.00801872f, --0.185529f,0.978031f,-0.0950467f, --0.137829f,0.987875f,0.0714611f, --0.0578854f,0.998186f,0.0165557f, -0.148249f,0.976119f,0.158788f, -0.193139f,0.975453f,0.10578f, -0.369772f,0.912299f,0.176006f, -0.348645f,0.936628f,0.0342667f, -0.282769f,0.952501f,0.113063f, -0.239504f,0.96906f,-0.059674f, -0.137712f,0.990197f,0.0233582f, -0.149987f,0.988306f,0.0274647f, -0.169834f,0.984573f,-0.0420991f, -0.0927723f,0.990592f,-0.100603f, -0.171676f,0.97845f,-0.114732f, -0.0567364f,0.963622f,-0.261179f, -0.117062f,0.969073f,-0.217242f, -0.0434058f,0.931949f,-0.359981f, -0.148347f,0.946865f,-0.285375f, -0.103327f,0.903437f,-0.416082f, -0.28421f,0.914779f,-0.287061f, -0.391793f,0.893555f,-0.21922f, -0.419866f,0.888994f,-0.182764f, -0.461528f,0.873246f,-0.156313f, -0.483081f,0.869853f,-0.099941f, -0.503438f,0.857022f,-0.109831f, -0.46584f,0.882166f,-0.0691099f, -0.489623f,0.868073f,-0.0819641f, -0.410796f,0.910896f,-0.0389227f, -0.393119f,0.918063f,-0.0511611f, -0.359627f,0.921042f,-0.1495f, -0.306646f,0.942147f,-0.135377f, -0.381773f,0.903228f,-0.196033f, -0.360002f,0.920948f,-0.149176f, -0.203221f,0.945872f,-0.253037f, -0.218471f,0.943498f,-0.249162f, -0.0567054f,0.995659f,-0.0738017f, -0.229305f,0.968679f,0.0952866f, --0.0263963f,0.99794f,0.0584726f, --0.0422212f,0.996107f,0.0773806f, -0.0415928f,0.997459f,0.0578396f, -0.0625406f,0.995706f,0.0682456f, -0.174866f,0.970931f,0.163448f, -0.248971f,0.959664f,0.13061f, -0.296526f,0.91909f,0.259511f, -0.244457f,0.962524f,0.117427f, -0.144028f,0.988219f,0.0517682f, -0.0516566f,0.998622f,-0.00921711f, --0.0100473f,0.999479f,-0.0306849f, -0.144821f,0.968281f,0.203614f, -0.0927686f,0.985877f,0.139429f, -0.159268f,0.950036f,0.268448f, --0.238265f,0.969366f,-0.0596594f, --0.317162f,0.937667f,-0.14209f, --0.252226f,0.956124f,-0.149026f, --0.139275f,0.959516f,-0.244809f, -0.225678f,0.948782f,-0.221092f, -0.454598f,0.876109f,-0.160545f, -0.280777f,0.950726f,-0.131467f, -0.235562f,0.968875f,-0.076101f, -0.32523f,0.943278f,-0.0667146f, -0.204883f,0.977104f,-0.0573623f, --0.016814f,0.999658f,-0.0200258f, --0.0821474f,0.994185f,0.0696248f, --0.0248008f,0.998098f,0.0564331f, -0.000698274f,0.999817f,0.0191283f, -0.0007523f,0.989994f,0.141106f, --0.0137951f,0.98192f,0.188792f, --0.00956379f,0.990301f,0.138609f, --0.0156365f,0.996604f,0.0808513f, --0.104293f,0.986463f,0.126542f, --0.156424f,0.969975f,0.186228f, --0.167617f,0.975111f,0.145129f, --0.261339f,0.965118f,0.0157997f, --0.160877f,0.9832f,-0.0862302f, --0.296054f,0.934306f,-0.198555f, --0.550185f,0.752769f,-0.361436f, --0.408582f,0.840233f,-0.356467f, --0.339245f,0.876729f,-0.340968f, --0.402741f,0.85772f,-0.319556f, --0.316164f,0.924069f,-0.214795f, --0.348907f,0.927941f,-0.131109f, --0.48502f,0.870548f,-0.0830789f, --0.53006f,0.843646f,-0.085433f, --0.352226f,0.931519f,-0.0906107f, --0.0975811f,0.982258f,-0.160146f, -0.0477418f,0.981235f,-0.186812f, -0.0219054f,0.966987f,-0.253882f, --0.115057f,0.988784f,-0.0952266f, --0.238673f,0.960258f,0.144707f, --0.213447f,0.931011f,0.296071f, --0.201955f,0.923284f,0.326742f, -0.101325f,0.921693f,0.374453f, -0.294403f,0.882174f,0.367555f, -0.373397f,0.835094f,0.403971f, -0.278351f,0.921647f,0.270347f, -0.215461f,0.962466f,0.16503f, -0.225302f,0.965479f,0.13073f, -0.175997f,0.983214f,0.0481225f, -0.220124f,0.97536f,0.0147531f, -0.32343f,0.94566f,-0.0334783f, -0.369971f,0.927728f,-0.0494253f, -0.427777f,0.903113f,-0.037328f, -0.446874f,0.894597f,9.72625e-005f, -0.445338f,0.895316f,-0.00910111f, -0.463955f,0.88101f,-0.0925573f, -0.398143f,0.905258f,-0.148289f, -0.190091f,0.969836f,-0.152589f, --0.0830374f,0.980972f,-0.175495f, --0.1343f,0.985908f,-0.0997463f, --0.00843053f,0.999434f,0.0325608f, -0.021819f,0.995847f,0.0883913f, -0.206682f,0.96009f,0.188439f, -0.388829f,0.882727f,0.263827f, -0.0707915f,0.996578f,0.0426701f, --0.161491f,0.983232f,-0.0847068f, --0.0785342f,0.996721f,-0.0194704f, --0.224473f,0.966422f,-0.125062f, --0.159666f,0.968511f,-0.191032f, -0.0318558f,0.951557f,-0.305817f, -0.187349f,0.896729f,-0.400972f, -0.324927f,0.900628f,-0.288602f, -0.217775f,0.961772f,-0.16604f, -0.20019f,0.973241f,-0.112807f, -0.277242f,0.959937f,-0.0407145f, -0.14204f,0.987332f,0.0707153f, --0.0153938f,0.984428f,0.175114f, --0.0735255f,0.984081f,0.161796f, --0.0237909f,0.990594f,0.134749f, --0.0614906f,0.985818f,0.156146f, --0.143236f,0.970943f,0.191711f, --0.0137498f,0.973243f,0.229369f, -0.0567477f,0.984597f,0.165372f, --0.0347212f,0.993259f,0.110594f, --0.143386f,0.976741f,0.159429f, --0.139502f,0.982211f,0.125705f, --0.0993842f,0.989216f,0.107588f, --0.136731f,0.987843f,0.0739654f, --0.0893069f,0.995969f,0.00840628f, --0.123862f,0.992294f,-0.00315825f, --0.391175f,0.886683f,-0.246529f, --0.44403f,0.793263f,-0.41662f, --0.399761f,0.83626f,-0.375315f, --0.422675f,0.841058f,-0.33759f, --0.445112f,0.835127f,-0.323168f, --0.410733f,0.898417f,-0.155389f, --0.485628f,0.867891f,-0.104549f, --0.491383f,0.859111f,-0.143077f, --0.358033f,0.910383f,-0.207399f, --0.0910122f,0.986127f,-0.138818f, -0.0820594f,0.995842f,-0.039567f, --0.0287013f,0.999312f,-0.0234726f, --0.346268f,0.933835f,0.0897299f, --0.471073f,0.825151f,0.311795f, --0.27505f,0.819541f,0.502693f, --0.154238f,0.84574f,0.510818f, -0.0836929f,0.869512f,0.48677f, -0.266688f,0.84547f,0.462663f, -0.365749f,0.809921f,0.458537f, -0.371864f,0.832105f,0.411483f, -0.260242f,0.895369f,0.361371f, -0.283389f,0.903576f,0.321311f, -0.269874f,0.934168f,0.233448f, -0.265321f,0.957928f,0.10945f, -0.333071f,0.942841f,0.0106961f, -0.387903f,0.9217f,0.000193271f, -0.435792f,0.899834f,0.0195967f, -0.454676f,0.88982f,0.0386129f, -0.482276f,0.876019f,-0.000723308f, -0.505259f,0.860654f,-0.0631586f, -0.398328f,0.910448f,-0.111444f, -0.21929f,0.970647f,-0.0987756f, -0.0111053f,0.988208f,-0.152714f, --0.210805f,0.943357f,-0.256201f, --0.146846f,0.978658f,-0.143755f, -0.0139602f,0.999731f,-0.0184963f, -0.133096f,0.990721f,-0.0275154f, -0.2933f,0.953875f,0.0640122f, -0.228393f,0.945969f,0.230173f, -0.0546169f,0.969859f,0.237467f, --0.0762534f,0.988779f,-0.128459f, --0.106647f,0.982213f,-0.154543f, --0.122396f,0.949634f,-0.28847f, -0.0920652f,0.954226f,-0.284566f, -0.185259f,0.946785f,-0.263206f, -0.232314f,0.960849f,-0.150996f, -0.169992f,0.979263f,-0.110207f, -0.125326f,0.980516f,-0.151267f, -0.149673f,0.98818f,-0.0331477f, -0.0238199f,0.989878f,0.139909f, --0.107594f,0.981438f,0.158754f, --0.0846643f,0.982313f,0.167013f, --0.0375415f,0.970751f,0.237134f, --0.0510768f,0.964816f,0.257917f, --0.0443365f,0.980593f,0.190977f, -0.00242513f,0.997744f,0.0670872f, -0.124335f,0.983389f,0.132238f, --0.00301992f,0.993206f,0.116332f, --0.125192f,0.990103f,0.0634287f, --0.100487f,0.994519f,-0.0288746f, --0.101663f,0.992712f,-0.0647098f, --0.139647f,0.987963f,-0.0665471f, --0.130136f,0.990189f,-0.0508981f, --0.0756901f,0.997123f,-0.00415316f, --0.171558f,0.977059f,-0.126185f, --0.351855f,0.892529f,-0.282117f, --0.447333f,0.817645f,-0.362422f, --0.423851f,0.857249f,-0.29236f, --0.448058f,0.866215f,-0.221171f, --0.531086f,0.820738f,-0.210565f, --0.511898f,0.851158f,-0.116153f, --0.425868f,0.900461f,-0.0883553f, --0.399025f,0.900598f,-0.172345f, --0.24223f,0.968919f,-0.0502012f, --0.0663613f,0.996507f,0.0506899f, --0.138021f,0.972657f,0.186782f, --0.4139f,0.851097f,0.322987f, --0.550512f,0.782849f,0.289973f, --0.380287f,0.863038f,0.332486f, --0.131533f,0.903571f,0.407748f, -0.119586f,0.9109f,0.394918f, -0.299052f,0.87558f,0.379379f, -0.370047f,0.8611f,0.348671f, -0.442832f,0.822723f,0.356408f, -0.35885f,0.890772f,0.278839f, -0.314791f,0.940053f,0.131179f, -0.339464f,0.925728f,0.166711f, -0.403599f,0.900778f,0.160334f, -0.45653f,0.889636f,-0.0113152f, -0.365242f,0.916509f,-0.163124f, -0.379822f,0.91652f,-0.125407f, -0.442125f,0.891797f,-0.096041f, -0.493888f,0.864551f,-0.0928755f, -0.541781f,0.83947f,-0.041994f, -0.441424f,0.894377f,-0.0723577f, -0.226514f,0.958331f,-0.174048f, -0.0664964f,0.969681f,-0.235153f, --0.103823f,0.949537f,-0.295973f, --0.233692f,0.889012f,-0.39376f, --0.0987171f,0.939339f,-0.328477f, -0.103986f,0.972613f,-0.207871f, -0.198802f,0.974287f,-0.106033f, -0.0601774f,0.998175f,0.00500958f, --0.0421158f,0.995212f,0.0882012f, --0.0598721f,0.997785f,-0.0289851f, --0.030607f,0.999125f,-0.0285146f, --0.00697633f,0.993471f,-0.113875f, -0.0388611f,0.980882f,-0.190686f, -0.0977483f,0.98843f,-0.115983f, -0.15403f,0.986798f,-0.0500538f, -0.193054f,0.979913f,-0.0500083f, -0.157678f,0.98694f,-0.0329733f, --0.0158549f,0.999428f,0.0298765f, --0.0525571f,0.987534f,0.14837f, -0.000720533f,0.997813f,0.0660913f, --0.102677f,0.99254f,-0.0657426f, --0.099341f,0.994285f,-0.0391091f, --0.0676495f,0.996952f,-0.0388727f, -0.0225146f,0.999293f,0.0301014f, -0.0577235f,0.997453f,0.0418936f, --0.0269869f,0.999243f,0.0280361f, -0.00446401f,0.985157f,0.171599f, --0.0141502f,0.990326f,0.138035f, --0.00518586f,0.999975f,0.00477817f, --0.0328139f,0.995381f,-0.09022f, --0.128063f,0.971338f,-0.200254f, --0.151852f,0.967914f,-0.200209f, --0.0720493f,0.989055f,-0.128759f, --0.0591129f,0.991504f,-0.115868f, --0.248059f,0.943661f,-0.219024f, --0.389946f,0.877483f,-0.279225f, --0.523332f,0.810744f,-0.262332f, --0.51839f,0.842544f,-0.146256f, --0.550368f,0.815716f,-0.178051f, --0.560732f,0.813038f,-0.156683f, --0.427123f,0.899415f,-0.0928351f, --0.366593f,0.924495f,-0.104494f, --0.322547f,0.93696f,-0.134426f, --0.128035f,0.99042f,-0.0517317f, --0.291376f,0.953688f,0.0746902f, --0.520094f,0.826135f,0.216802f, --0.516864f,0.826474f,0.22314f, --0.396988f,0.892552f,0.213897f, --0.184148f,0.954818f,0.233263f, -0.0957205f,0.95579f,0.278034f, -0.314018f,0.892294f,0.32435f, -0.401668f,0.873128f,0.276243f, -0.463054f,0.857596f,0.223851f, -0.480022f,0.855973f,0.192066f, -0.375927f,0.916106f,0.13939f, -0.288789f,0.941864f,0.171735f, -0.396643f,0.909563f,0.123974f, -0.561623f,0.825897f,0.0497286f, -0.465605f,0.881752f,-0.0756653f, -0.370044f,0.915005f,-0.160728f, -0.427822f,0.898624f,-0.0971747f, -0.465206f,0.885137f,-0.0107503f, -0.468824f,0.88183f,0.0507874f, -0.478143f,0.868746f,0.12907f, -0.351411f,0.934208f,0.0613665f, -0.140442f,0.98844f,-0.0571117f, --0.0122878f,0.991421f,-0.130131f, --0.117862f,0.972142f,-0.202603f, --0.15815f,0.947613f,-0.27752f, --0.0729629f,0.95654f,-0.282325f, -0.0272484f,0.989771f,-0.14004f, --0.0137333f,0.999563f,0.0261849f, --0.0985129f,0.993299f,0.0604412f, --0.135233f,0.990548f,-0.0229695f, --0.0373153f,0.999264f,0.00888433f, -0.0352261f,0.99933f,0.00994916f, -0.061219f,0.99588f,0.0668911f, -0.0815695f,0.99444f,0.0665983f, -0.144386f,0.989424f,0.0139045f, -0.184662f,0.980318f,0.0698361f, -0.0224217f,0.989677f,0.14155f, --0.0794321f,0.954058f,0.288901f, --0.0304562f,0.959461f,0.280192f, -0.112423f,0.968918f,0.220359f, -0.0390938f,0.993037f,0.111126f, --0.0885962f,0.9933f,-0.0741985f, --0.0453085f,0.996418f,-0.0714089f, --0.123875f,0.985221f,-0.118298f, -0.00670832f,0.999925f,0.010273f, --0.0146906f,0.998569f,0.0514303f, --0.0998092f,0.992773f,0.0666264f, -0.0466126f,0.990197f,0.131669f, -0.103009f,0.992862f,0.0601126f, -0.113553f,0.993084f,-0.0298385f, --0.0128779f,0.975704f,-0.218713f, --0.177855f,0.94662f,-0.268846f, --0.191482f,0.955424f,-0.224722f, --0.0532043f,0.987628f,-0.147512f, --0.140744f,0.970833f,-0.194099f, --0.387395f,0.889373f,-0.242778f, --0.531553f,0.818908f,-0.216427f, --0.531571f,0.799354f,-0.280115f, --0.51407f,0.81292f,-0.273666f, --0.549112f,0.793924f,-0.261078f, --0.484709f,0.822384f,-0.297895f, --0.322663f,0.926066f,-0.195678f, --0.315438f,0.927311f,-0.201479f, --0.289702f,0.947148f,-0.13778f, --0.417457f,0.908684f,-0.00477603f, --0.584599f,0.810188f,0.0428868f, --0.55194f,0.828316f,0.0962071f, --0.397599f,0.904432f,0.154656f, --0.183216f,0.971572f,0.149931f, -0.0355131f,0.990243f,0.134751f, -0.298837f,0.942288f,0.150964f, -0.413659f,0.900634f,0.133206f, -0.498073f,0.828388f,0.256313f, -0.444018f,0.853405f,0.273035f, -0.327561f,0.881897f,0.339061f, -0.313826f,0.898686f,0.306392f, -0.495157f,0.851292f,0.173556f, -0.614747f,0.78345f,0.0910662f, -0.55187f,0.833866f,0.0103585f, -0.367713f,0.926545f,-0.0793776f, -0.311567f,0.950223f,0.00108255f, -0.382947f,0.917094f,0.110859f, -0.410945f,0.895808f,0.169272f, -0.455231f,0.858878f,0.234721f, -0.373673f,0.896264f,0.238911f, -0.246571f,0.935158f,0.254328f, -0.0808975f,0.990111f,0.114608f, --0.0843211f,0.99633f,-0.0147289f, --0.0859474f,0.994869f,-0.0533687f, --0.0567528f,0.986639f,-0.152718f, --0.104487f,0.984189f,-0.143019f, --0.139027f,0.990289f,8.5057e-005f, --0.137547f,0.987918f,0.0714029f, --0.144256f,0.989201f,-0.0259182f, --0.026694f,0.998838f,-0.0401331f, --0.0313342f,0.99664f,-0.0756769f, --0.0574884f,0.99781f,0.0327011f, -0.145005f,0.983413f,0.108961f, -0.119257f,0.992151f,0.0376122f, -0.0587452f,0.978725f,0.196585f, --0.0803833f,0.947865f,0.308369f, --0.127827f,0.919581f,0.371526f, --0.00616421f,0.930831f,0.365399f, -0.107639f,0.912609f,0.394409f, -0.210572f,0.88729f,0.410336f, -0.0740329f,0.980065f,0.184368f, --0.0250926f,0.999613f,0.0120275f, --0.0610433f,0.996433f,-0.05826f, --0.0708404f,0.994984f,-0.0706271f, --0.0640037f,0.997923f,-0.00726403f, --0.0949547f,0.99548f,0.00148231f, -0.00929451f,0.997943f,-0.0634315f, -0.147986f,0.988795f,-0.0195964f, -0.19874f,0.98001f,-0.00909425f, -0.119683f,0.99247f,-0.0260466f, --0.140841f,0.984951f,-0.10018f, --0.197496f,0.959342f,-0.201637f, --0.0821482f,0.973605f,-0.212945f, --0.090387f,0.978841f,-0.18358f, --0.34459f,0.903344f,-0.255395f, --0.465169f,0.833236f,-0.29889f, --0.493353f,0.789348f,-0.365421f, --0.529455f,0.773394f,-0.348624f, --0.541108f,0.776645f,-0.322528f, --0.503238f,0.814279f,-0.289312f, --0.451111f,0.869282f,-0.202106f, --0.405307f,0.906179f,-0.120689f, --0.367499f,0.92846f,-0.0539062f, --0.448648f,0.893437f,-0.0220131f, --0.582415f,0.811815f,-0.0418214f, --0.587857f,0.805915f,-0.0701802f, --0.440963f,0.897524f,0.00144435f, --0.150082f,0.985674f,0.0769547f, -0.0512849f,0.998035f,0.0359923f, -0.331471f,0.9412f,0.0653422f, -0.327057f,0.943418f,0.0547333f, -0.325027f,0.917755f,0.228216f, -0.374201f,0.856118f,0.35642f, -0.374565f,0.858588f,0.350039f, -0.460817f,0.854058f,0.241312f, -0.556465f,0.823608f,0.109619f, -0.63153f,0.770458f,0.0869767f, -0.587056f,0.806123f,0.074369f, -0.365958f,0.924908f,0.10305f, -0.26636f,0.954918f,0.131089f, -0.330741f,0.937061f,0.111923f, -0.358992f,0.918233f,0.167249f, -0.397317f,0.888574f,0.229294f, -0.378918f,0.890078f,0.253343f, -0.252398f,0.944302f,0.211161f, -0.242388f,0.947895f,0.206744f, -0.0865865f,0.99456f,0.0579091f, --0.0181168f,0.990006f,-0.139854f, -0.0162661f,0.98021f,-0.197289f, --0.148111f,0.960303f,-0.236394f, --0.255052f,0.949006f,-0.185302f, --0.211751f,0.971559f,-0.105997f, --0.0120621f,0.994912f,-0.100021f, --0.015173f,0.98959f,-0.143115f, --0.0401151f,0.99847f,-0.0380528f, --0.0979763f,0.995187f,0.00194195f, -0.0571375f,0.998251f,0.0151643f, -0.0776787f,0.976915f,0.199006f, --0.101892f,0.95655f,0.273185f, --0.133768f,0.938598f,0.318024f, --0.177801f,0.93623f,0.303084f, --0.022321f,0.922329f,0.385761f, -0.0333931f,0.905943f,0.422081f, -0.163361f,0.862964f,0.478127f, -0.305267f,0.821497f,0.481617f, -0.18106f,0.939243f,0.291615f, --0.00700511f,0.992472f,0.122275f, --0.0966012f,0.992994f,0.068052f, --0.106034f,0.991731f,0.0722919f, --0.0353039f,0.993084f,0.11197f, -0.0541772f,0.995603f,0.0764134f, -0.08347f,0.989853f,0.114994f, -0.130868f,0.975887f,0.174696f, -0.0723356f,0.969665f,0.23349f, --0.0470347f,0.960948f,0.272703f, --0.10077f,0.971805f,0.213169f, --0.119566f,0.974584f,0.189448f, --0.0774738f,0.965859f,0.247214f, --0.198029f,0.968836f,0.1488f, --0.435505f,0.897132f,-0.0740912f, --0.502708f,0.857298f,-0.111019f, --0.564282f,0.819749f,-0.0979722f, --0.594236f,0.795147f,-0.120937f, --0.591492f,0.803058f,-0.0723546f, --0.526826f,0.849968f,-0.0029614f, --0.410127f,0.912007f,0.00617969f, --0.355675f,0.932755f,-0.0588432f, --0.457125f,0.883759f,-0.100032f, --0.544765f,0.834451f,-0.0832032f, --0.554858f,0.819866f,-0.141253f, --0.535218f,0.826621f,-0.173894f, --0.203549f,0.978635f,-0.0289948f, -0.0668755f,0.997729f,0.00799418f, -0.247034f,0.968844f,0.017759f, -0.275407f,0.949712f,0.148988f, -0.19759f,0.950103f,0.241375f, -0.374575f,0.880138f,0.291635f, -0.446827f,0.865948f,0.224675f, -0.519968f,0.833624f,0.186291f, -0.587008f,0.786117f,0.193499f, -0.636373f,0.75334f,0.165857f, -0.540728f,0.822377f,0.176944f, -0.345338f,0.910903f,0.225828f, -0.278322f,0.945193f,0.170723f, -0.30876f,0.936535f,0.166043f, -0.303863f,0.916063f,0.261719f, -0.319419f,0.895614f,0.309591f, -0.43277f,0.828092f,0.356332f, -0.333077f,0.917687f,0.216587f, -0.219655f,0.964319f,0.147787f, -0.242228f,0.95005f,0.196802f, -0.204875f,0.978767f,-0.00640881f, --0.000192716f,0.97566f,-0.219288f, --0.0681124f,0.988809f,-0.132732f, --0.241144f,0.919453f,-0.310573f, --0.290276f,0.882193f,-0.370776f, -0.0292627f,0.97223f,-0.232189f, --0.0803803f,0.976804f,-0.198478f, --0.203999f,0.977793f,-0.0480039f, --0.118856f,0.989202f,0.0857425f, --0.0783112f,0.985397f,0.151198f, --0.0878718f,0.938803f,0.333059f, --0.083435f,0.948159f,0.30665f, --0.110585f,0.962509f,0.247682f, --0.186686f,0.943514f,0.273733f, --0.149516f,0.932553f,0.32862f, --0.00475332f,0.899494f,0.436906f, -0.0862131f,0.885009f,0.457522f, -0.277459f,0.815555f,0.507825f, -0.298118f,0.799955f,0.520766f, -0.14455f,0.869997f,0.471392f, -0.0121492f,0.942115f,0.335071f, --0.0752209f,0.977077f,0.199154f, --0.128636f,0.97789f,0.164878f, --0.000660482f,0.945164f,0.326595f, -0.00550592f,0.919316f,0.393482f, -0.0803772f,0.905979f,0.415621f, -0.0810259f,0.907487f,0.412192f, --0.090779f,0.919652f,0.382099f, --0.137864f,0.897436f,0.419048f, --0.130404f,0.886486f,0.444001f, --0.0852724f,0.906321f,0.413897f, --0.0259127f,0.906615f,0.421163f, --0.225351f,0.915922f,0.332119f, --0.462548f,0.869686f,0.172323f, --0.572668f,0.816922f,0.0684804f, --0.585929f,0.806118f,0.0828267f, --0.593406f,0.803366f,0.0497268f, --0.516762f,0.856027f,-0.0132014f, --0.38427f,0.922646f,-0.0325731f, --0.287245f,0.956724f,-0.0465863f, --0.413146f,0.905396f,-0.097823f, --0.564236f,0.818421f,-0.108744f, --0.507227f,0.858315f,-0.0775611f, --0.527754f,0.82927f,-0.183811f, --0.354765f,0.918321f,-0.175582f, -0.0463007f,0.998926f,-0.00175561f, -0.214268f,0.976774f,0.00151756f, -0.165544f,0.983729f,0.0698077f, -0.096445f,0.982342f,0.16032f, -0.366991f,0.896711f,0.24744f, -0.500788f,0.845195f,0.186699f, -0.507012f,0.85355f,0.119965f, -0.542994f,0.824496f,0.159261f, -0.605757f,0.757486f,0.243463f, -0.532123f,0.786802f,0.312711f, -0.44869f,0.847812f,0.282652f, -0.34333f,0.935092f,0.0879082f, -0.24319f,0.961353f,0.129073f, -0.223708f,0.954136f,0.198946f, -0.276144f,0.94134f,0.193965f, -0.41277f,0.892522f,0.181731f, -0.485836f,0.856185f,0.175815f, -0.251109f,0.963495f,0.0928509f, -0.217377f,0.969921f,0.109544f, -0.402023f,0.911537f,0.0864706f, -0.0930878f,0.988366f,-0.120284f, --0.0926141f,0.987658f,-0.126311f, --0.0129498f,0.988134f,-0.153049f, --0.0752509f,0.973537f,-0.215783f, --0.167591f,0.970187f,-0.175075f, --0.227938f,0.971032f,-0.0717025f, --0.288377f,0.95589f,0.0557925f, --0.2706f,0.959797f,0.0746015f, --0.201821f,0.948409f,0.244517f, --0.135104f,0.944724f,0.298737f, -0.0536332f,0.953012f,0.298147f, --0.104499f,0.972769f,0.206883f, --0.26012f,0.936243f,0.236192f, --0.221301f,0.933098f,0.283468f, --0.0976008f,0.934678f,0.341835f, -0.0488135f,0.920165f,0.388475f, -0.20566f,0.878417f,0.431379f, -0.294052f,0.82595f,0.480979f, -0.211093f,0.846234f,0.489211f, -0.1526f,0.86506f,0.477897f, -0.100541f,0.907805f,0.407163f, --0.126416f,0.965258f,0.228683f, --0.211306f,0.949302f,0.232755f, --0.037039f,0.912463f,0.40748f, -0.117233f,0.908378f,0.401379f, -0.101997f,0.928038f,0.35825f, --0.0502775f,0.939056f,0.340069f, --0.158243f,0.952358f,0.260718f, --0.125329f,0.958222f,0.257106f, --0.051336f,0.956723f,0.286436f, --0.0625203f,0.954305f,0.29222f, --0.207996f,0.932703f,0.294623f, --0.319481f,0.91161f,0.258649f, --0.495077f,0.865137f,0.0802322f, --0.579132f,0.814857f,-0.0247929f, --0.549115f,0.83292f,-0.0686783f, --0.493373f,0.86244f,-0.113053f, --0.402759f,0.911225f,-0.0863345f, --0.292096f,0.955556f,-0.0399004f, --0.382523f,0.923047f,-0.0407488f, --0.572187f,0.816414f,-0.0779103f, --0.512485f,0.857517f,-0.0449819f, --0.420369f,0.906318f,-0.0433336f, --0.419207f,0.879291f,-0.22608f, --0.129012f,0.980121f,-0.150729f, -0.168538f,0.98409f,0.056222f, -0.177285f,0.97778f,0.111881f, -0.0313595f,0.998166f,-0.0517722f, -0.266622f,0.963684f,-0.0150476f, -0.566513f,0.817464f,0.103999f, -0.539244f,0.841888f,0.0209898f, -0.503392f,0.861782f,0.0626771f, -0.548011f,0.825978f,0.132075f, -0.53464f,0.817691f,0.213407f, -0.52656f,0.822061f,0.21668f, -0.418461f,0.898681f,0.131391f, -0.217077f,0.97168f,0.0933593f, -0.230073f,0.97316f,0.00512693f, -0.352039f,0.933499f,-0.0681773f, -0.427612f,0.891089f,-0.152014f, -0.47402f,0.877861f,-0.0682997f, -0.292505f,0.956178f,-0.0128375f, -0.212998f,0.971167f,-0.107084f, -0.394409f,0.913171f,-0.102761f, -0.229015f,0.973422f,0.000912976f, --0.0760893f,0.988509f,-0.130618f, --0.0515625f,0.984716f,-0.166362f, --0.0928406f,0.987408f,-0.128086f, --0.200115f,0.967117f,0.156969f, --0.29324f,0.941681f,0.165066f, --0.336305f,0.919935f,0.201539f, --0.298108f,0.921775f,0.247915f, --0.262609f,0.920325f,0.289892f, --0.146209f,0.952657f,0.266586f, --0.00778438f,0.956339f,0.292158f, --0.050022f,0.92665f,0.372583f, --0.258705f,0.916977f,0.303687f, --0.247478f,0.923305f,0.293706f, --0.126717f,0.938107f,0.322331f, -0.0303988f,0.946862f,0.320201f, -0.135735f,0.944675f,0.298606f, -0.25669f,0.889672f,0.377616f, -0.215508f,0.868916f,0.44558f, -0.117717f,0.868155f,0.482129f, -0.172493f,0.853951f,0.490931f, -0.0744588f,0.909987f,0.407897f, --0.203499f,0.942765f,0.264163f, --0.165852f,0.956441f,0.240237f, -0.150303f,0.946565f,0.285349f, -0.126121f,0.955231f,0.267632f, -0.00383767f,0.957166f,0.289515f, --0.0803601f,0.965694f,0.246937f, --0.14415f,0.963474f,0.225698f, --0.128772f,0.964294f,0.231421f, --0.0634991f,0.964707f,0.255554f, --0.15178f,0.96554f,0.211412f, --0.290877f,0.950446f,0.109737f, --0.365587f,0.928197f,0.069257f, --0.512709f,0.855901f,-0.0675528f, --0.522587f,0.843414f,-0.12472f, --0.519355f,0.843468f,-0.13723f, --0.458617f,0.886978f,-0.054221f, --0.335795f,0.941914f,0.00633015f, --0.354719f,0.934449f,0.0312872f, --0.552854f,0.83289f,-0.025441f, --0.550469f,0.834453f,-0.0259307f, --0.388185f,0.921529f,-0.00983026f, --0.282899f,0.957493f,-0.056358f, --0.256814f,0.955751f,-0.143483f, --0.0731312f,0.996697f,-0.0353254f, -0.211397f,0.967055f,0.141832f, -0.27554f,0.960583f,0.0368595f, -0.217196f,0.959783f,-0.177882f, -0.479261f,0.875236f,-0.0653524f, -0.513664f,0.856169f,0.0558883f, -0.446145f,0.882397f,0.149434f, -0.498219f,0.84712f,0.184837f, -0.503236f,0.827823f,0.247916f, -0.51285f,0.815024f,0.269666f, -0.506381f,0.824734f,0.251778f, -0.333663f,0.940706f,0.0611746f, -0.353215f,0.932965f,-0.069389f, -0.414309f,0.904024f,-0.105298f, -0.451897f,0.886486f,-0.0996557f, -0.345824f,0.933767f,-0.0921138f, -0.280994f,0.95917f,0.0321915f, -0.317081f,0.945948f,0.0681282f, -0.344866f,0.938141f,0.0309596f, -0.224406f,0.974203f,0.0238892f, --0.0108486f,0.995761f,-0.0913323f, --0.00158176f,0.998953f,-0.0457292f, --0.115676f,0.985559f,-0.123663f, --0.188171f,0.911466f,0.365816f, --0.262724f,0.896783f,0.356029f, --0.358149f,0.883197f,0.302807f, --0.323424f,0.894918f,0.307438f, --0.242922f,0.924564f,0.293548f, --0.121147f,0.94907f,0.290844f, --0.0341414f,0.951299f,0.306374f, --0.132493f,0.945016f,0.298983f, --0.194216f,0.905093f,0.378268f, --0.212944f,0.914784f,0.343257f, --0.127802f,0.956235f,0.263215f, -0.0483659f,0.968777f,0.243172f, -0.117573f,0.942608f,0.312517f, -0.164225f,0.89741f,0.409494f, -0.122313f,0.88201f,0.455081f, -0.101965f,0.875392f,0.472537f, -0.209339f,0.879095f,0.428217f, -0.174899f,0.892224f,0.416349f, --0.060088f,0.941634f,0.331231f, --0.120508f,0.975773f,0.182606f, -0.112168f,0.972734f,0.202994f, -0.117253f,0.950933f,0.286318f, --0.0544328f,0.941394f,0.332887f, --0.0790068f,0.915303f,0.394942f, --0.127609f,0.917525f,0.376648f, --0.0756868f,0.941409f,0.328666f, --0.0332439f,0.958716f,0.282415f, --0.0735168f,0.965505f,0.249792f, --0.203882f,0.964791f,0.166163f, --0.320453f,0.94269f,0.0929826f, --0.471247f,0.881185f,0.0379224f, --0.492278f,0.869051f,0.0491152f, --0.532259f,0.846256f,-0.0234739f, --0.499446f,0.866138f,-0.0189645f, --0.373407f,0.92679f,-0.0403466f, --0.352534f,0.935772f,-0.00715155f, --0.527726f,0.848793f,-0.0324855f, --0.520812f,0.852354f,-0.0474108f, --0.409147f,0.909436f,-0.0743255f, --0.294722f,0.955583f,0.000817458f, --0.222255f,0.974321f,0.0360744f, --0.14278f,0.989739f,0.00545783f, -0.112175f,0.992761f,0.0429195f, -0.349968f,0.931754f,0.0967357f, -0.338116f,0.939385f,0.056869f, -0.379594f,0.923814f,0.0497667f, -0.434257f,0.879279f,0.195674f, -0.391146f,0.89525f,0.213383f, -0.465582f,0.860371f,0.207352f, -0.429826f,0.860017f,0.274991f, -0.465148f,0.815034f,0.34548f, -0.575943f,0.73808f,0.351465f, -0.535537f,0.824709f,0.181813f, -0.414278f,0.908562f,-0.0537569f, -0.380258f,0.913027f,-0.147599f, -0.408447f,0.90132f,-0.144197f, -0.367806f,0.925659f,-0.0887431f, -0.142987f,0.986995f,-0.073455f, -0.215691f,0.972786f,0.0846483f, -0.373384f,0.916381f,0.144331f, -0.381582f,0.918997f,0.0991966f, -0.0727073f,0.993287f,-0.0899678f, --0.0658262f,0.992454f,-0.103446f, -0.0138596f,0.999564f,-0.0260736f, --0.215981f,0.852322f,0.47634f, --0.206677f,0.845053f,0.493123f, --0.272991f,0.879681f,0.389406f, --0.267376f,0.924267f,0.272471f, --0.22026f,0.956955f,0.189003f, --0.175208f,0.966589f,0.187106f, --0.043064f,0.959071f,0.279872f, --0.116589f,0.955061f,0.272519f, --0.310776f,0.922421f,0.229257f, --0.169995f,0.929299f,0.32788f, --0.0175005f,0.941141f,0.337561f, -0.0138751f,0.95035f,0.310874f, --0.0519487f,0.924056f,0.37871f, -0.0171204f,0.875115f,0.483613f, -0.148666f,0.835016f,0.529761f, -0.187668f,0.864969f,0.465412f, -0.241037f,0.89408f,0.377521f, -0.22255f,0.900707f,0.373093f, -0.0517034f,0.945752f,0.320749f, --0.0271248f,0.957046f,0.288665f, -0.0325916f,0.970401f,0.239289f, -0.0171507f,0.960836f,0.276588f, --0.143534f,0.9275f,0.345169f, --0.0983366f,0.916766f,0.38713f, --0.0476997f,0.944806f,0.32414f, --0.0337303f,0.946895f,0.319767f, --0.0100366f,0.942379f,0.334396f, --0.0544901f,0.938102f,0.342046f, --0.14598f,0.916868f,0.371541f, --0.23743f,0.904478f,0.354324f, --0.411826f,0.87795f,0.244136f, --0.481531f,0.866693f,0.130273f, --0.469337f,0.874903f,0.119446f, --0.452816f,0.890509f,0.0441746f, --0.332275f,0.942324f,-0.0402274f, --0.391441f,0.91825f,-0.0599172f, --0.492183f,0.870395f,0.0129854f, --0.540952f,0.839903f,-0.0439814f, --0.452633f,0.891182f,0.0302916f, --0.353037f,0.931758f,0.0848037f, --0.230998f,0.971043f,0.0609518f, --0.110559f,0.993184f,0.0368984f, -0.0985994f,0.994896f,-0.0214387f, -0.290703f,0.956813f,-0.000841556f, -0.306742f,0.941069f,0.142471f, -0.309512f,0.928678f,0.20435f, -0.393276f,0.890035f,0.23059f, -0.472781f,0.864565f,0.170309f, -0.455511f,0.888755f,0.0512287f, -0.387199f,0.912459f,0.13227f, -0.420125f,0.891345f,0.170293f, -0.568557f,0.791084f,0.225676f, -0.642678f,0.725845f,0.245181f, -0.61301f,0.785525f,0.0846683f, -0.519083f,0.833826f,-0.187849f, -0.390386f,0.832025f,-0.394123f, -0.254733f,0.897839f,-0.359161f, -0.0968538f,0.955535f,-0.278518f, -0.110338f,0.951183f,-0.288231f, -0.337547f,0.917961f,-0.20835f, -0.382401f,0.916771f,-0.115327f, -0.232755f,0.967238f,-0.101374f, --0.075544f,0.963631f,-0.256338f, --0.111861f,0.963998f,-0.241238f, --0.403631f,0.823611f,0.398431f, --0.211285f,0.853176f,0.476917f, --0.0996818f,0.887327f,0.450237f, --0.119017f,0.926423f,0.357178f, --0.147962f,0.959424f,0.240027f, --0.17904f,0.969453f,0.167646f, --0.182698f,0.967757f,0.173402f, --0.0875162f,0.935774f,0.341566f, --0.247354f,0.926662f,0.283043f, --0.269706f,0.932828f,0.238937f, --0.116046f,0.932011f,0.34335f, --0.054572f,0.895119f,0.442474f, --0.0702883f,0.870311f,0.487462f, --0.0238769f,0.872685f,0.4877f, -0.145141f,0.847062f,0.511292f, -0.26226f,0.839585f,0.475728f, -0.307436f,0.859155f,0.409067f, -0.272452f,0.896089f,0.35042f, -0.0602872f,0.949936f,0.306572f, --0.0269541f,0.950357f,0.309992f, -0.110161f,0.964193f,0.241239f, -0.0112822f,0.980274f,0.19732f, --0.201697f,0.957263f,0.207282f, --0.0780713f,0.964435f,0.252529f, -0.00973745f,0.973101f,0.230172f, --0.0755968f,0.981149f,0.177855f, --0.0876613f,0.97114f,0.221817f, --0.111729f,0.927016f,0.357991f, --0.221124f,0.882386f,0.41533f, --0.204491f,0.867297f,0.45385f, --0.238609f,0.89578f,0.375026f, --0.38933f,0.904206f,0.175592f, --0.447525f,0.889442f,0.0928077f, --0.421271f,0.9063f,0.0339399f, --0.295839f,0.951557f,0.0837779f, --0.40469f,0.90695f,0.116906f, --0.500893f,0.852054f,0.152018f, --0.539765f,0.838827f,0.0708671f, --0.497421f,0.864837f,0.068037f, --0.338953f,0.937284f,0.0813017f, --0.178116f,0.975677f,0.127782f, --0.0428295f,0.992057f,0.118272f, -0.176596f,0.983706f,0.0336999f, -0.217356f,0.975284f,-0.0397137f, -0.172156f,0.984981f,0.0131952f, -0.279801f,0.958586f,0.0531518f, -0.429228f,0.901897f,0.0484305f, -0.537427f,0.843269f,0.00840869f, -0.461159f,0.886671f,-0.0338697f, -0.347666f,0.937337f,0.022966f, -0.390524f,0.920568f,0.00669632f, -0.544615f,0.837115f,0.0513162f, -0.64737f,0.75903f,0.0691749f, -0.709483f,0.698136f,0.0961199f, -0.69002f,0.723355f,-0.0250988f, -0.510759f,0.819636f,-0.259464f, -0.161066f,0.87948f,-0.447854f, -0.0742832f,0.901252f,-0.426881f, -0.164688f,0.896506f,-0.411284f, -0.211827f,0.873436f,-0.43845f, -0.238498f,0.898773f,-0.367868f, -0.244991f,0.941894f,-0.229815f, -0.0339169f,0.959887f,-0.278328f, --0.150927f,0.928909f,-0.338156f, --0.262269f,0.839002f,0.47675f, --0.199453f,0.89484f,0.39935f, --0.0695117f,0.920513f,0.384478f, --0.0794509f,0.922822f,0.376943f, --0.0384813f,0.923599f,0.381424f, --0.0906334f,0.946866f,0.308593f, --0.231342f,0.940055f,0.250554f, --0.228342f,0.910605f,0.344468f, --0.168052f,0.897027f,0.408779f, --0.249241f,0.920512f,0.300892f, --0.201125f,0.932701f,0.29936f, --0.156169f,0.918655f,0.362882f, --0.101964f,0.881359f,0.461314f, --0.0479674f,0.88379f,0.465418f, -0.160937f,0.878499f,0.449821f, -0.298148f,0.878819f,0.372539f, -0.363972f,0.843945f,0.394059f, -0.330687f,0.867316f,0.372033f, -0.109951f,0.941418f,0.318814f, -0.0530775f,0.967978f,0.245361f, -0.171035f,0.972595f,0.157499f, -0.0211384f,0.985036f,0.171048f, --0.223743f,0.958122f,0.178723f, --0.143003f,0.966115f,0.214875f, -0.0335442f,0.969798f,0.24159f, -0.00108957f,0.977785f,0.209606f, --0.185748f,0.96522f,0.183978f, --0.245345f,0.928456f,0.278881f, --0.278935f,0.920412f,0.273928f, --0.227379f,0.922009f,0.313367f, --0.127558f,0.911679f,0.390603f, --0.252363f,0.916101f,0.311563f, --0.353299f,0.912723f,0.205222f, --0.418007f,0.90407f,0.089031f, --0.400603f,0.906481f,0.133452f, --0.448512f,0.870078f,0.204452f, --0.467166f,0.869433f,0.160757f, --0.442544f,0.892618f,0.0859534f, --0.465336f,0.885122f,-0.00451183f, --0.389888f,0.920791f,0.0114409f, --0.26105f,0.96208f,0.079086f, --0.0611649f,0.990413f,0.123862f, -0.218817f,0.959555f,0.177126f, -0.289447f,0.944291f,0.156638f, -0.238555f,0.970242f,0.0415028f, -0.303951f,0.946528f,-0.108164f, -0.431424f,0.894504f,-0.117199f, -0.527248f,0.845956f,-0.0797999f, -0.433918f,0.900916f,0.0081213f, -0.311993f,0.948885f,0.0477355f, -0.430547f,0.901487f,0.0441572f, -0.533619f,0.845624f,-0.013065f, -0.634808f,0.772557f,-0.013228f, -0.691864f,0.721963f,0.00965866f, -0.719067f,0.694383f,0.0278453f, -0.653183f,0.756562f,0.0310991f, -0.386363f,0.918778f,-0.0810638f, -0.0570874f,0.970389f,-0.234704f, -0.136394f,0.961794f,-0.237379f, -0.31236f,0.906525f,-0.283977f, -0.169471f,0.890916f,-0.421365f, -0.117142f,0.913195f,-0.390323f, -0.0777866f,0.931625f,-0.354998f, --0.0437682f,0.92941f,-0.366443f, --0.144429f,0.859889f,0.489623f, --0.0880742f,0.890372f,0.446633f, --0.0314378f,0.923882f,0.381384f, --0.0838814f,0.944139f,0.318693f, --0.0693885f,0.945887f,0.316991f, --0.0723769f,0.923178f,0.377496f, --0.19706f,0.892458f,0.405815f, --0.297386f,0.892332f,0.339566f, --0.156962f,0.91638f,0.368254f, --0.15276f,0.919794f,0.361447f, --0.17017f,0.922781f,0.345714f, --0.253151f,0.920843f,0.296586f, --0.189094f,0.905109f,0.380816f, -0.00126887f,0.929197f,0.369582f, -0.193396f,0.936415f,0.292787f, -0.338227f,0.878943f,0.336247f, -0.32269f,0.878938f,0.351198f, -0.355444f,0.867037f,0.34915f, -0.217316f,0.918786f,0.329554f, -0.123007f,0.956146f,0.265807f, -0.19987f,0.950731f,0.236986f, -0.0209731f,0.979076f,0.202411f, --0.247784f,0.961065f,0.122302f, --0.158935f,0.979718f,0.122036f, -0.0602949f,0.986043f,0.155188f, --0.0308065f,0.985867f,0.164674f, --0.185866f,0.954971f,0.231267f, --0.272851f,0.942767f,0.191682f, --0.226832f,0.938998f,0.258516f, --0.311155f,0.923351f,0.224958f, --0.264965f,0.917378f,0.297004f, --0.186536f,0.890461f,0.41507f, --0.257136f,0.895376f,0.363569f, --0.330368f,0.897563f,0.291955f, --0.415623f,0.888172f,0.19598f, --0.414839f,0.89462f,0.166025f, --0.429244f,0.901932f,0.0476213f, --0.370358f,0.92848f,0.0275516f, --0.456696f,0.886215f,-0.0777874f, --0.424934f,0.901633f,-0.0805556f, --0.26755f,0.960865f,-0.0718042f, --0.0958709f,0.992595f,-0.0745981f, -0.0853594f,0.996177f,0.0185983f, -0.317006f,0.925486f,0.207323f, -0.362438f,0.919121f,0.154455f, -0.423147f,0.903697f,0.0654098f, -0.439077f,0.898135f,-0.0237805f, -0.463592f,0.885685f,-0.0253961f, -0.432904f,0.900567f,0.0396714f, -0.274262f,0.960561f,-0.0458644f, -0.460874f,0.887433f,0.00757752f, -0.557878f,0.824691f,-0.0930446f, -0.608392f,0.791916f,-0.0522232f, -0.68605f,0.722282f,0.0874302f, -0.697187f,0.705867f,0.125228f, -0.597474f,0.77589f,0.202532f, -0.400677f,0.868028f,0.293233f, -0.18602f,0.951589f,0.244694f, -0.190924f,0.979879f,0.0581851f, -0.431268f,0.902043f,-0.01807f, -0.329374f,0.934061f,-0.137997f, -0.144406f,0.935772f,-0.321679f, -0.0779514f,0.92222f,-0.378727f, --0.0417532f,0.914206f,-0.403093f, --0.201619f,0.929423f,0.309066f, --0.0738258f,0.948242f,0.308847f, -0.0288118f,0.952024f,0.304665f, --0.00526808f,0.951397f,0.307922f, --0.0992485f,0.952014f,0.289515f, --0.179425f,0.914994f,0.361376f, --0.223397f,0.866943f,0.445538f, --0.185005f,0.868122f,0.460584f, --0.180405f,0.90051f,0.395646f, --0.165976f,0.891215f,0.422122f, --0.142635f,0.91411f,0.37955f, --0.196593f,0.942079f,0.271733f, --0.231892f,0.955708f,0.181242f, -0.0754625f,0.968764f,0.236224f, -0.189929f,0.95814f,0.214232f, -0.245783f,0.922809f,0.29667f, -0.350212f,0.885135f,0.30641f, -0.361791f,0.894635f,0.262174f, -0.218601f,0.892888f,0.393656f, -0.122578f,0.888731f,0.441737f, -0.221602f,0.877963f,0.42435f, -0.113111f,0.927784f,0.355561f, --0.0962286f,0.967788f,0.232652f, --0.169743f,0.984124f,0.0518298f, -0.00440837f,0.997134f,0.0755295f, --0.0780505f,0.992255f,0.096638f, --0.206915f,0.971074f,0.119173f, --0.298261f,0.946469f,0.123437f, --0.365054f,0.904843f,0.219077f, --0.255666f,0.897337f,0.35975f, --0.290965f,0.914197f,0.282104f, --0.292271f,0.916518f,0.27308f, --0.219619f,0.919339f,0.326472f, --0.256286f,0.928086f,0.270137f, --0.310598f,0.93305f,0.18151f, --0.350728f,0.934452f,0.0615507f, --0.388138f,0.92156f,0.00876308f, --0.343471f,0.93847f,0.0360903f, --0.339947f,0.939272f,-0.0469463f, --0.382902f,0.903055f,-0.19462f, --0.249239f,0.929446f,-0.272047f, --0.147764f,0.944907f,-0.29209f, --0.0668186f,0.978447f,-0.19539f, -0.17553f,0.981686f,-0.0740426f, -0.388973f,0.921211f,-0.00833323f, -0.44678f,0.894539f,-0.0136777f, -0.47739f,0.878112f,-0.0318964f, -0.465567f,0.884409f,-0.0326842f, -0.484387f,0.873859f,-0.0417148f, -0.315003f,0.932104f,-0.178762f, -0.426472f,0.898104f,-0.107381f, -0.587094f,0.80929f,-0.0192587f, -0.491946f,0.869904f,0.0354452f, -0.550379f,0.808299f,0.209131f, -0.597166f,0.706874f,0.379107f, -0.503286f,0.706664f,0.497322f, -0.349603f,0.761935f,0.545191f, -0.317931f,0.791281f,0.522298f, -0.357034f,0.859818f,0.365021f, -0.457671f,0.859336f,0.22821f, -0.436038f,0.880267f,0.187085f, -0.291237f,0.949467f,0.117016f, -0.172846f,0.983353f,0.0560389f, -0.00924155f,0.999014f,-0.043417f, --0.112379f,0.966854f,0.22927f, --0.0543436f,0.980353f,0.189616f, -0.0014105f,0.977032f,0.213089f, --0.0810261f,0.954455f,0.287143f, --0.162384f,0.905883f,0.391161f, --0.248623f,0.850337f,0.463803f, --0.272281f,0.829594f,0.48748f, --0.210534f,0.842738f,0.495447f, --0.142516f,0.845822f,0.514076f, --0.128959f,0.864859f,0.485168f, --0.000520612f,0.895905f,0.444245f, -0.00320439f,0.940529f,0.339698f, --0.169376f,0.979765f,0.106637f, --0.0517963f,0.994886f,0.0867084f, -0.124214f,0.955178f,0.268711f, -0.208945f,0.916166f,0.342027f, -0.39407f,0.858275f,0.328745f, -0.248342f,0.913565f,0.322063f, -0.031165f,0.861455f,0.506877f, -0.0654094f,0.812115f,0.57982f, -0.246891f,0.786687f,0.565834f, -0.230643f,0.834381f,0.500612f, -0.069509f,0.924157f,0.375637f, -0.0080049f,0.977951f,0.208681f, --0.0216545f,0.998818f,0.043521f, --0.0416834f,0.994806f,0.0928633f, --0.209164f,0.977378f,0.0313447f, --0.33727f,0.941399f,0.00405643f, --0.445763f,0.895148f,-0.00236945f, --0.379089f,0.924127f,0.0477591f, --0.212534f,0.958583f,0.189598f, --0.289703f,0.944216f,0.156615f, --0.225857f,0.954875f,0.19288f, --0.19812f,0.968114f,0.153308f, --0.225491f,0.970896f,0.0807165f, --0.268028f,0.963292f,-0.0151842f, --0.386115f,0.917249f,-0.0978197f, --0.332792f,0.935954f,-0.115065f, --0.223332f,0.957817f,-0.180856f, --0.272615f,0.913397f,-0.302304f, --0.182015f,0.92061f,-0.345468f, --0.156497f,0.91949f,-0.36062f, --0.125465f,0.931751f,-0.340733f, -0.1054f,0.935905f,-0.336114f, -0.348771f,0.906917f,-0.236346f, -0.444797f,0.880373f,-0.164617f, -0.451025f,0.885434f,-0.112171f, -0.467976f,0.880983f,-0.0697667f, -0.499335f,0.858868f,-0.114062f, -0.349601f,0.930335f,-0.110707f, -0.307802f,0.944888f,-0.11156f, -0.473394f,0.878106f,0.0694821f, -0.43441f,0.869457f,0.23523f, -0.41901f,0.855868f,0.303184f, -0.452664f,0.775597f,0.439937f, -0.432369f,0.72522f,0.535829f, -0.415514f,0.737038f,0.533032f, -0.381011f,0.793693f,0.474217f, -0.445314f,0.773558f,0.450892f, -0.520117f,0.767192f,0.375359f, -0.457464f,0.838846f,0.295064f, -0.276432f,0.924946f,0.260884f, -0.199394f,0.937964f,0.283664f, -0.190897f,0.927436f,0.32159f, --0.0705492f,0.959049f,0.274315f, --0.0655623f,0.961527f,0.266772f, --0.0518964f,0.943387f,0.32761f, --0.202287f,0.906319f,0.371032f, --0.245861f,0.842829f,0.478739f, --0.310342f,0.836362f,0.451869f, --0.256381f,0.850522f,0.459219f, --0.198762f,0.867072f,0.456815f, --0.12379f,0.863897f,0.48822f, --0.0469651f,0.900623f,0.432056f, --8.11553e-005f,0.943721f,0.330744f, -0.129628f,0.925055f,0.357028f, -0.0340614f,0.966037f,0.256151f, --0.0890995f,0.983963f,0.154524f, --0.0322587f,0.981394f,0.189278f, -0.138447f,0.956229f,0.257794f, -0.317932f,0.883665f,0.343592f, -0.154174f,0.859961f,0.486516f, --0.0823702f,0.837125f,0.540774f, -0.067942f,0.838652f,0.540413f, -0.256779f,0.806501f,0.532561f, -0.317316f,0.771073f,0.552047f, -0.228943f,0.837474f,0.496208f, -0.221417f,0.908583f,0.354192f, -0.0661321f,0.986936f,0.146917f, --0.101631f,0.981129f,0.164493f, --0.140334f,0.967949f,0.20828f, --0.26644f,0.954208f,0.136f, --0.376833f,0.92539f,0.0406146f, --0.423125f,0.902479f,-0.0805992f, --0.378547f,0.924929f,-0.0347556f, --0.294214f,0.950388f,0.101004f, --0.253707f,0.966868f,0.0282789f, --0.1425f,0.989661f,0.0162607f, --0.152778f,0.987285f,-0.0438961f, --0.226417f,0.971142f,-0.0749508f, --0.278106f,0.959626f,-0.0421373f, --0.315252f,0.936348f,-0.154492f, --0.13807f,0.983353f,-0.118124f, --0.169891f,0.968928f,-0.179762f, --0.200272f,0.947942f,-0.247583f, --0.182846f,0.93983f,-0.288594f, --0.0836086f,0.941177f,-0.327408f, -0.0732417f,0.918516f,-0.388542f, -0.208177f,0.929929f,-0.303139f, -0.350352f,0.926406f,-0.137933f, -0.401951f,0.914196f,-0.0517823f, -0.448456f,0.893661f,-0.0160636f, -0.515556f,0.856358f,0.0291996f, -0.347689f,0.937245f,0.0261378f, -0.255909f,0.965329f,0.0514824f, -0.382053f,0.909938f,0.161395f, -0.340926f,0.922929f,0.178808f, -0.312845f,0.910786f,0.269439f, -0.364196f,0.849776f,0.381106f, -0.45928f,0.814969f,0.353394f, -0.52951f,0.800019f,0.282116f, -0.449914f,0.855375f,0.256731f, -0.454599f,0.838858f,0.299428f, -0.555327f,0.766362f,0.322957f, -0.54417f,0.781393f,0.305455f, -0.357615f,0.911759f,0.202005f, -0.139813f,0.972952f,0.183891f, -0.109083f,0.950848f,0.289808f, --0.192892f,0.944314f,0.266579f, --0.117537f,0.919218f,0.375796f, --0.132138f,0.875254f,0.465263f, --0.253971f,0.812679f,0.524453f, --0.263136f,0.777105f,0.571723f, --0.18663f,0.797568f,0.573633f, --0.239071f,0.855961f,0.458449f, --0.228946f,0.872463f,0.431732f, --0.154745f,0.876861f,0.455159f, -0.0511929f,0.876307f,0.479025f, -0.079622f,0.902874f,0.422468f, -0.0999946f,0.903351f,0.417083f, -0.103272f,0.908778f,0.404299f, --0.0300958f,0.943633f,0.329622f, --0.0276233f,0.954592f,0.296632f, -0.0865379f,0.944508f,0.316884f, -0.19572f,0.915809f,0.350694f, -0.0629871f,0.902785f,0.425456f, --0.0973105f,0.893058f,0.439293f, -0.0850344f,0.884912f,0.45793f, -0.226219f,0.859273f,0.458775f, -0.265876f,0.822998f,0.50198f, -0.299522f,0.800365f,0.519329f, -0.365936f,0.804413f,0.467986f, -0.167843f,0.908094f,0.383659f, --0.151292f,0.923022f,0.353753f, --0.16349f,0.897488f,0.409618f, --0.164454f,0.89713f,0.410016f, --0.256833f,0.931773f,0.256583f, --0.308509f,0.944441f,0.11337f, --0.397192f,0.916896f,-0.0392391f, --0.321804f,0.945652f,-0.046751f, --0.145617f,0.989197f,-0.0168656f, --0.117605f,0.989571f,-0.083174f, --0.131213f,0.988938f,-0.0691672f, --0.264465f,0.964357f,-0.00857016f, --0.279285f,0.95849f,0.0574115f, --0.308064f,0.950873f,-0.0306128f, --0.232189f,0.97071f,0.0617333f, --0.126956f,0.977263f,0.169823f, --0.134913f,0.981643f,0.134817f, --0.0643092f,0.996192f,0.0588766f, --0.0179518f,0.989177f,-0.145623f, -0.100718f,0.978365f,-0.180716f, -0.107842f,0.981772f,-0.156502f, -0.235537f,0.96668f,-0.100264f, -0.400696f,0.915349f,-0.0397433f, -0.382123f,0.921514f,-0.0692327f, -0.451191f,0.890657f,0.0561954f, -0.368356f,0.915308f,0.162865f, -0.16123f,0.974745f,0.154523f, -0.326647f,0.914341f,0.239337f, -0.365189f,0.91282f,0.182749f, -0.230086f,0.959458f,0.162792f, -0.336546f,0.918886f,0.205876f, -0.545838f,0.824177f,0.150977f, -0.544526f,0.829407f,0.124801f, -0.442013f,0.862414f,0.24671f, -0.417167f,0.87901f,0.230894f, -0.525918f,0.823184f,0.213956f, -0.591278f,0.763502f,0.259719f, -0.412761f,0.877728f,0.243355f, -0.079495f,0.961838f,0.261818f, --0.108191f,0.959339f,0.260698f, --0.395968f,0.898347f,0.190215f, --0.315805f,0.885393f,0.341095f, --0.255081f,0.831656f,0.493236f, --0.32798f,0.786298f,0.523607f, --0.31899f,0.766541f,0.557369f, --0.160414f,0.763167f,0.625974f, --0.0711111f,0.771377f,0.632393f, --0.143173f,0.825852f,0.545409f, --0.172278f,0.854223f,0.490534f, -0.0123154f,0.838365f,0.544971f, -0.0830743f,0.830631f,0.550592f, -0.0507686f,0.835031f,0.547855f, -0.149519f,0.800804f,0.579962f, -0.0893025f,0.847618f,0.523038f, --0.0238205f,0.893087f,0.449253f, -0.0209713f,0.900623f,0.434095f, -0.182588f,0.867377f,0.462945f, -0.0933756f,0.88802f,0.450223f, --0.0988317f,0.917919f,0.384262f, -0.0323919f,0.922001f,0.38583f, -0.205498f,0.882674f,0.422678f, -0.228981f,0.875897f,0.424702f, -0.330967f,0.833446f,0.442526f, -0.386545f,0.82285f,0.416534f, -0.244254f,0.85459f,0.458275f, --0.128515f,0.915454f,0.381351f, --0.221592f,0.919582f,0.324447f, --0.103305f,0.941351f,0.321226f, --0.0534104f,0.960954f,0.271504f, --0.164863f,0.980806f,0.104112f, --0.239884f,0.970598f,-0.0198681f, --0.303213f,0.937604f,-0.170178f, --0.252015f,0.951441f,-0.176773f, --0.108694f,0.994072f,0.00232095f, --0.192935f,0.981013f,0.0197642f, --0.322908f,0.946132f,0.0237552f, --0.269028f,0.963107f,-0.00704542f, --0.230013f,0.973161f,0.00722315f, --0.357365f,0.933662f,-0.0237822f, --0.204315f,0.973479f,0.102922f, --0.115797f,0.983778f,0.137007f, -0.0200406f,0.991033f,0.132107f, -0.176509f,0.981212f,0.0778953f, -0.102914f,0.991977f,-0.0734239f, -0.103634f,0.990563f,-0.0896973f, -0.246302f,0.962545f,-0.113327f, -0.365449f,0.921945f,-0.12831f, -0.388572f,0.919102f,-0.0652967f, -0.33675f,0.940592f,-0.0434361f, -0.294334f,0.951251f,0.0921318f, -0.170376f,0.973956f,0.149605f, -0.291052f,0.946977f,0.136102f, -0.448607f,0.879963f,0.156258f, -0.275208f,0.960522f,0.0407201f, -0.320727f,0.94717f,-0.00171267f, -0.563867f,0.822582f,0.0735748f, -0.458264f,0.882692f,0.104155f, -0.35932f,0.917336f,0.171414f, -0.473577f,0.85831f,0.197555f, -0.552768f,0.818756f,0.155195f, -0.56022f,0.811568f,0.165865f, -0.410483f,0.877955f,0.246373f, -0.119318f,0.965792f,0.230239f, --0.0302464f,0.98755f,0.15437f, --0.434902f,0.821345f,0.369123f, --0.425801f,0.804682f,0.41374f, --0.330648f,0.807018f,0.489278f, --0.341863f,0.793213f,0.503928f, --0.356504f,0.786512f,0.504286f, --0.269874f,0.813284f,0.515498f, --0.0937663f,0.786137f,0.610898f, --0.0122488f,0.782782f,0.622176f, --0.145176f,0.838097f,0.525849f, --0.0659853f,0.863648f,0.499758f, -0.0911511f,0.81559f,0.571406f, -0.0567409f,0.801208f,0.59569f, -0.110855f,0.801019f,0.588286f, -0.153854f,0.799367f,0.580811f, -0.0810561f,0.837494f,0.540401f, -0.0627084f,0.873537f,0.482702f, -0.153028f,0.87118f,0.466506f, -0.121758f,0.869515f,0.478663f, --0.0139367f,0.889364f,0.456987f, -0.0116753f,0.909652f,0.415206f, -0.182976f,0.873078f,0.451946f, -0.230254f,0.874104f,0.427698f, -0.299542f,0.853577f,0.42624f, -0.365816f,0.815944f,0.447677f, -0.258135f,0.828321f,0.497243f, -0.0438733f,0.899999f,0.433678f, --0.113551f,0.976415f,0.183628f, --0.115165f,0.991964f,0.0523877f, --0.0427249f,0.989973f,0.134639f, --0.000526251f,0.987641f,0.156735f, --0.182878f,0.982656f,-0.0306907f, --0.187196f,0.982029f,-0.0240342f, --0.272847f,0.956238f,-0.105656f, --0.292658f,0.95046f,-0.104775f, --0.178909f,0.983865f,0.00116467f, --0.22078f,0.973898f,-0.0527095f, --0.269354f,0.950491f,-0.154966f, --0.262457f,0.956005f,-0.131038f, --0.333574f,0.929233f,-0.158915f, --0.27846f,0.93913f,-0.201231f, --0.105722f,0.98028f,-0.166954f, --0.03086f,0.983393f,-0.178845f, -0.166296f,0.985117f,-0.0434662f, -0.22991f,0.973119f,0.0134671f, -0.156605f,0.983722f,-0.0881293f, -0.276714f,0.94824f,-0.155787f, -0.32696f,0.929339f,-0.171541f, -0.339039f,0.938238f,-0.0690071f, -0.308789f,0.948131f,-0.0754727f, -0.23717f,0.967343f,-0.0894326f, -0.163558f,0.982662f,-0.0873214f, -0.252735f,0.966333f,-0.0482272f, -0.434287f,0.896865f,0.0838305f, -0.398093f,0.912104f,0.0979158f, -0.320154f,0.94669f,-0.0357668f, -0.45783f,0.889003f,0.00810452f, -0.504235f,0.85135f,0.144742f, -0.385352f,0.920157f,0.0693918f, -0.466232f,0.882239f,0.0654287f, -0.538345f,0.833943f,0.121343f, -0.517827f,0.838051f,0.171829f, -0.46128f,0.862173f,0.209471f, -0.229103f,0.969676f,0.085091f, -0.119821f,0.992172f,0.0351865f, --0.316654f,0.75101f,0.579409f, --0.356062f,0.779142f,0.515904f, --0.357471f,0.814286f,0.457331f, --0.357809f,0.798452f,0.484198f, --0.344344f,0.806376f,0.480818f, --0.279175f,0.813317f,0.510467f, --0.188283f,0.817533f,0.544233f, -0.0108927f,0.825394f,0.564451f, -0.000505664f,0.854739f,0.519058f, --0.0291193f,0.899152f,0.436667f, --0.043893f,0.902469f,0.428513f, --0.00142614f,0.854428f,0.519568f, -0.10644f,0.82426f,0.556117f, -0.17821f,0.772022f,0.610101f, -0.155558f,0.792656f,0.58949f, -0.103298f,0.851042f,0.514837f, -0.136998f,0.86222f,0.487656f, -0.128814f,0.846529f,0.516522f, -0.0086465f,0.861582f,0.507544f, -0.0126115f,0.865086f,0.501464f, -0.152876f,0.854998f,0.495588f, -0.261992f,0.846686f,0.463122f, -0.298132f,0.855648f,0.423065f, -0.330245f,0.846388f,0.417811f, -0.241868f,0.85891f,0.451412f, -0.243399f,0.870337f,0.428102f, -0.218863f,0.950296f,0.221442f, --0.0230145f,0.994562f,-0.101567f, --0.18143f,0.968994f,-0.167732f, --0.00536077f,0.999859f,-0.0158957f, --0.0149312f,0.999841f,-0.00972481f, --0.248945f,0.961384f,-0.11733f, --0.206226f,0.978121f,-0.0273758f, --0.251569f,0.958037f,-0.137399f, --0.215501f,0.957565f,-0.191386f, --0.183194f,0.972176f,-0.145991f, --0.242363f,0.956164f,-0.164351f, --0.223675f,0.959477f,-0.171387f, --0.263678f,0.929229f,-0.25886f, --0.190809f,0.923444f,-0.332932f, --0.125476f,0.902264f,-0.412524f, --0.0800599f,0.931052f,-0.355994f, -0.00289679f,0.952892f,-0.303297f, -0.173027f,0.965415f,-0.195025f, -0.23552f,0.951626f,-0.197328f, -0.324166f,0.90746f,-0.26727f, -0.272213f,0.920502f,-0.280314f, -0.263103f,0.942676f,-0.205278f, -0.331376f,0.931643f,-0.1491f, -0.273621f,0.957062f,-0.0957296f, -0.174678f,0.976512f,-0.126141f, -0.162465f,0.97193f,-0.170168f, -0.285207f,0.956722f,-0.0577913f, -0.392887f,0.912166f,0.116586f, -0.413213f,0.901715f,0.127138f, -0.444428f,0.894805f,0.0425078f, -0.482399f,0.875952f,0.000225918f, -0.414394f,0.908379f,-0.0559034f, -0.421361f,0.906852f,-0.00856344f, -0.501069f,0.86151f,0.0820434f, -0.492896f,0.86226f,0.116453f, -0.497628f,0.854344f,0.149874f, -0.327901f,0.939568f,0.0984569f, -0.134608f,0.990256f,0.0356963f, --0.115732f,0.781457f,0.613132f, --0.224646f,0.82464f,0.519137f, --0.330602f,0.837584f,0.434919f, --0.37055f,0.826801f,0.423193f, --0.389755f,0.836631f,0.38489f, --0.35019f,0.83732f,0.419835f, --0.192063f,0.866433f,0.460875f, -0.0577661f,0.893053f,0.446228f, -0.0715028f,0.909685f,0.409097f, -0.0355467f,0.937027f,0.347443f, --0.0473295f,0.949618f,0.309815f, --0.0714543f,0.946618f,0.31434f, -0.0109848f,0.930588f,0.365903f, -0.0306039f,0.876434f,0.480548f, -0.171338f,0.790427f,0.588106f, -0.228263f,0.773415f,0.591376f, -0.15062f,0.839076f,0.522748f, -0.0933237f,0.852392f,0.514508f, -0.0403687f,0.864191f,0.501542f, -0.0159293f,0.89067f,0.454371f, -0.162582f,0.873944f,0.458028f, -0.324998f,0.838057f,0.438219f, -0.361417f,0.861814f,0.355886f, -0.357364f,0.88789f,0.289727f, -0.288052f,0.920034f,0.265637f, -0.274707f,0.932706f,0.233657f, -0.415911f,0.867317f,0.273456f, -0.214502f,0.965967f,0.144559f, --0.0739208f,0.997262f,-0.00212715f, --0.130316f,0.972201f,-0.194533f, -0.00262571f,0.981048f,-0.193747f, --0.190851f,0.93935f,-0.284951f, --0.250649f,0.92646f,-0.280798f, --0.16238f,0.957944f,-0.236595f, --0.204897f,0.9457f,-0.252327f, --0.246487f,0.945291f,-0.213705f, --0.204741f,0.966747f,-0.153234f, --0.173965f,0.952924f,-0.248341f, --0.185492f,0.924696f,-0.332461f, --0.120486f,0.929748f,-0.347926f, --0.0981061f,0.932335f,-0.348033f, --0.143961f,0.923839f,-0.354678f, --0.0348514f,0.936175f,-0.349804f, -0.141193f,0.941481f,-0.306069f, -0.298926f,0.908144f,-0.293117f, -0.339558f,0.869399f,-0.35895f, -0.236934f,0.893673f,-0.381064f, -0.188986f,0.916304f,-0.353088f, -0.222126f,0.937284f,-0.268624f, -0.165461f,0.966952f,-0.193976f, -0.194618f,0.975642f,-0.101229f, -0.225585f,0.970105f,-0.0894815f, -0.18757f,0.970367f,-0.152331f, -0.271776f,0.9587f,-0.0838549f, -0.390134f,0.920749f,0.00399703f, -0.487191f,0.870564f,0.0690114f, -0.567845f,0.821826f,0.0464111f, -0.430596f,0.898843f,-0.0816633f, -0.345462f,0.936301f,-0.063213f, -0.439054f,0.898457f,0.0025505f, -0.485886f,0.873093f,0.040301f, -0.468523f,0.882438f,0.0422951f, -0.395695f,0.916215f,0.0630502f, -0.224264f,0.974198f,-0.0253916f, --0.04074f,0.869731f,0.491842f, --0.147521f,0.861626f,0.485632f, --0.290306f,0.828918f,0.47814f, --0.344291f,0.81826f,0.460342f, --0.325822f,0.848235f,0.417537f, --0.347006f,0.892025f,0.289618f, --0.23289f,0.9484f,0.215175f, -0.0826503f,0.953848f,0.288692f, -0.0849803f,0.942357f,0.323639f, -0.0946367f,0.912864f,0.397143f, -0.0188563f,0.944615f,0.327637f, --0.0844647f,0.976435f,0.198596f, --0.0480441f,0.982086f,0.182207f, --0.108246f,0.969423f,0.220233f, -0.0163534f,0.944153f,0.329102f, -0.218936f,0.864112f,0.453186f, -0.243602f,0.846524f,0.473344f, -0.157715f,0.898021f,0.410713f, -0.124101f,0.930824f,0.343753f, -0.0887369f,0.958556f,0.270731f, -0.13199f,0.965856f,0.222935f, -0.34996f,0.900513f,0.258077f, -0.45204f,0.856515f,0.249081f, -0.434574f,0.879659f,0.19325f, -0.307812f,0.936972f,0.165332f, -0.238408f,0.942387f,0.234669f, -0.292411f,0.883524f,0.365897f, -0.235944f,0.851222f,0.468777f, -0.0834983f,0.888208f,0.45179f, -0.120252f,0.948234f,0.293925f, -0.107426f,0.988487f,0.106553f, --0.0604958f,0.997925f,0.0220282f, --0.22861f,0.965114f,-0.127644f, --0.213845f,0.934088f,-0.285919f, --0.236679f,0.925441f,-0.295876f, --0.274282f,0.922231f,-0.272506f, --0.200442f,0.934584f,-0.293896f, --0.0905439f,0.955043f,-0.282301f, --0.107977f,0.974204f,-0.198159f, --0.176859f,0.954188f,-0.241343f, --0.109412f,0.961464f,-0.252221f, --0.0832631f,0.934053f,-0.347292f, --0.0389646f,0.894623f,-0.44512f, -0.0844722f,0.90285f,-0.421576f, -0.278944f,0.884527f,-0.373902f, -0.405411f,0.845478f,-0.347577f, -0.241979f,0.880406f,-0.407837f, -0.10107f,0.917999f,-0.383487f, -0.153454f,0.950374f,-0.270631f, -0.150056f,0.964994f,-0.215103f, -0.116981f,0.964373f,-0.237277f, -0.171185f,0.966068f,-0.19341f, -0.269303f,0.954896f,-0.1251f, -0.246577f,0.939836f,-0.236448f, -0.325998f,0.915178f,-0.237011f, -0.400262f,0.89707f,-0.18723f, -0.540095f,0.838463f,-0.0726465f, -0.4591f,0.888384f,0.000734802f, -0.350121f,0.936701f,0.00262749f, -0.415959f,0.907987f,-0.0503785f, -0.469999f,0.882626f,-0.00849165f, -0.46759f,0.883776f,0.0172864f, -0.444948f,0.895095f,0.0287648f, -0.38429f,0.923043f,-0.0176926f, --0.184131f,0.893945f,0.408605f, --0.22256f,0.84592f,0.484651f, --0.306803f,0.799127f,0.516979f, --0.327467f,0.825975f,0.458836f, --0.215523f,0.873324f,0.43687f, --0.122358f,0.93676f,0.327886f, --0.214245f,0.969738f,0.117081f, -0.00165628f,0.984816f,0.173596f, --0.0471807f,0.97232f,0.228838f, --0.042786f,0.929182f,0.367137f, -0.159108f,0.885534f,0.43648f, -0.0848362f,0.945025f,0.315803f, --0.0323525f,0.969808f,0.241716f, --0.0998895f,0.964402f,0.244849f, --0.0727123f,0.986494f,0.146772f, -0.121392f,0.97688f,0.175982f, -0.260802f,0.928486f,0.264378f, -0.24004f,0.922405f,0.302572f, -0.162896f,0.94112f,0.296239f, -0.158069f,0.936377f,0.313389f, -0.18876f,0.956613f,0.221947f, -0.312407f,0.939867f,0.138025f, -0.450948f,0.870255f,0.198248f, -0.44762f,0.863366f,0.232885f, -0.235953f,0.935784f,0.261983f, -0.128819f,0.928252f,0.348933f, -0.106701f,0.927182f,0.359094f, -0.172918f,0.882203f,0.437968f, -0.183128f,0.868984f,0.459707f, -0.240959f,0.881259f,0.406597f, -0.154256f,0.918617f,0.363797f, -0.0253035f,0.919137f,0.393124f, -0.0182377f,0.964511f,0.263413f, -0.0263571f,0.99964f,0.00499089f, --0.149002f,0.961331f,-0.231604f, --0.264821f,0.912849f,-0.310769f, --0.139498f,0.954507f,-0.263548f, --0.253683f,0.93262f,-0.25664f, --0.265231f,0.9626f,-0.0552561f, --0.114883f,0.993341f,-0.00868247f, -0.0072742f,0.99351f,-0.113513f, -0.112563f,0.957036f,-0.26723f, -0.0621414f,0.905176f,-0.420469f, -0.0722297f,0.880288f,-0.468909f, -0.230329f,0.856327f,-0.462225f, -0.381575f,0.843927f,-0.377079f, -0.221134f,0.891315f,-0.395799f, -0.0308171f,0.923698f,-0.381879f, -0.0400222f,0.939112f,-0.341272f, -0.100477f,0.950816f,-0.293006f, -0.177047f,0.942783f,-0.282515f, -0.133298f,0.926135f,-0.352852f, -0.196525f,0.937661f,-0.286653f, -0.349249f,0.920399f,-0.17576f, -0.344233f,0.909171f,-0.234334f, -0.376056f,0.891226f,-0.25357f, -0.439076f,0.869021f,-0.228069f, -0.419906f,0.900431f,-0.113589f, -0.367672f,0.919513f,-0.13897f, -0.413581f,0.894358f,-0.170514f, -0.417856f,0.905717f,-0.0712231f, -0.442627f,0.896671f,0.00788109f, -0.434719f,0.900071f,0.0298519f, -0.417993f,0.908131f,0.0240916f, --0.312333f,0.839022f,0.445522f, --0.320499f,0.80841f,0.493714f, --0.254519f,0.811123f,0.526593f, --0.204612f,0.85744f,0.472156f, --0.178862f,0.910868f,0.371925f, --0.00702334f,0.926328f,0.376653f, --0.0708828f,0.954444f,0.289847f, --0.0771525f,0.977635f,0.195648f, --0.0751036f,0.961343f,0.264914f, --0.145577f,0.95681f,0.25164f, -0.127391f,0.9356f,0.329278f, -0.155803f,0.922417f,0.353372f, --0.0158909f,0.953782f,0.300078f, --0.071615f,0.974742f,0.211541f, -0.0985463f,0.976728f,0.190504f, -0.112633f,0.991267f,0.0685771f, -0.169574f,0.979892f,0.105153f, -0.189025f,0.96308f,0.191696f, -0.0919285f,0.967342f,0.236218f, -0.12853f,0.953507f,0.272588f, -0.291986f,0.918653f,0.266123f, -0.353363f,0.907675f,0.226407f, -0.385555f,0.89484f,0.224962f, -0.404454f,0.872627f,0.273752f, -0.205311f,0.929054f,0.307743f, -0.110161f,0.942272f,0.316208f, -0.185964f,0.923078f,0.336668f, -0.152054f,0.949861f,0.273212f, -0.185461f,0.938647f,0.290768f, -0.273329f,0.907935f,0.317718f, -0.1744f,0.944567f,0.278169f, -0.0252708f,0.979111f,0.20175f, -0.168508f,0.972599f,0.160178f, -0.171022f,0.978059f,0.118964f, -0.0998107f,0.989636f,0.103241f, --0.201522f,0.966723f,-0.157591f, --0.270475f,0.936595f,-0.222784f, --0.312657f,0.944755f,-0.0984088f, --0.352005f,0.934773f,-0.0478632f, --0.0861214f,0.995901f,-0.0276381f, -0.0987576f,0.994369f,-0.0384345f, -0.271502f,0.95802f,-0.0921061f, -0.198786f,0.941001f,-0.273863f, -0.12025f,0.91375f,-0.388073f, -0.19318f,0.901312f,-0.38771f, -0.347672f,0.893681f,-0.283653f, -0.243349f,0.925421f,-0.290477f, -0.0173943f,0.947888f,-0.318129f, -0.037959f,0.944705f,-0.325718f, -0.138906f,0.919468f,-0.36781f, -0.157447f,0.882137f,-0.443897f, -0.187757f,0.895179f,-0.404229f, -0.0607904f,0.891083f,-0.44975f, -0.186006f,0.945946f,-0.265685f, -0.365887f,0.929282f,-0.0506235f, -0.41897f,0.907686f,-0.0238758f, -0.421784f,0.903427f,-0.0769231f, -0.443234f,0.894342f,-0.0608035f, -0.410975f,0.898831f,-0.152323f, -0.386797f,0.913648f,-0.125039f, -0.291947f,0.94823f,-0.125004f, -0.388472f,0.921139f,-0.0243475f, -0.43729f,0.89932f,0.000909095f, -0.438439f,0.898727f,-0.00777216f, --0.28789f,0.841477f,0.457204f, --0.335895f,0.843138f,0.419871f, --0.2812f,0.876582f,0.390553f, --0.0955224f,0.927302f,0.361922f, --0.12003f,0.968207f,0.219473f, --0.0624603f,0.972133f,0.225956f, -0.00876105f,0.944888f,0.327276f, --0.0188296f,0.951986f,0.305562f, --0.0880524f,0.955492f,0.28157f, --0.14211f,0.96142f,0.235533f, -0.0867118f,0.963277f,0.254122f, -0.135173f,0.965034f,0.224584f, -0.150393f,0.96446f,0.217252f, -0.0301773f,0.99954f,0.00289386f, -0.112215f,0.991225f,-0.0698593f, -0.139936f,0.985559f,-0.0953439f, -0.125274f,0.991296f,-0.0404889f, -0.130003f,0.991461f,0.0102436f, -0.104702f,0.992835f,0.0575904f, -0.129192f,0.991077f,0.0328109f, -0.258743f,0.962487f,0.0816753f, -0.358319f,0.917773f,0.171175f, -0.362543f,0.919373f,0.152698f, -0.379026f,0.899795f,0.216122f, -0.252574f,0.930076f,0.266767f, -0.106065f,0.974915f,0.195683f, -0.13953f,0.968709f,0.205267f, -0.207814f,0.946678f,0.246198f, -0.149976f,0.969192f,0.195383f, -0.250422f,0.937237f,0.242644f, -0.308573f,0.924236f,0.224878f, -0.137327f,0.986571f,0.0884273f, -0.176869f,0.981357f,0.0752039f, -0.106914f,0.989761f,0.0945676f, -0.0990876f,0.985862f,0.135123f, -0.0562231f,0.995571f,0.0753513f, --0.246892f,0.957072f,-0.15185f, --0.351837f,0.92065f,-0.169157f, --0.377614f,0.902561f,-0.206862f, --0.10132f,0.980362f,-0.169188f, -0.0776454f,0.98254f,-0.169077f, -0.306304f,0.93954f,-0.153108f, -0.377181f,0.900422f,-0.216738f, -0.189257f,0.917577f,-0.349621f, -0.154953f,0.928643f,-0.337063f, -0.267717f,0.911458f,-0.312367f, -0.294676f,0.908518f,-0.296244f, -0.0231864f,0.917435f,-0.39721f, -0.0626224f,0.928776f,-0.365314f, -0.222796f,0.906686f,-0.358165f, -0.23143f,0.87959f,-0.415646f, -0.13808f,0.870415f,-0.472559f, -0.025291f,0.910796f,-0.412081f, --0.0453254f,0.945277f,-0.323104f, -0.159501f,0.971914f,-0.17304f, -0.38445f,0.922508f,-0.0343154f, -0.457445f,0.889226f,-0.00452937f, -0.479545f,0.877417f,-0.0132742f, -0.420093f,0.902443f,-0.0954967f, -0.386091f,0.921349f,-0.0452663f, -0.319162f,0.945851f,-0.059174f, -0.358596f,0.930564f,-0.0738904f, -0.442653f,0.891593f,-0.0955061f, -0.442432f,0.88607f,-0.138327f, --0.180108f,0.868506f,0.461799f, --0.252344f,0.891893f,0.375298f, --0.214515f,0.951228f,0.221693f, --0.0232238f,0.989215f,0.144618f, -0.0240637f,0.992144f,0.122761f, --0.119024f,0.992873f,0.00598183f, --0.113037f,0.992656f,0.0430988f, --0.0429691f,0.994091f,0.0996822f, --0.0494378f,0.98881f,0.140751f, --0.101045f,0.990831f,0.0896877f, -0.0748729f,0.995782f,0.0530223f, -0.173588f,0.976877f,0.124814f, -0.168744f,0.967443f,0.188628f, -0.211654f,0.955224f,0.206761f, -0.198232f,0.976689f,0.0823528f, -0.160641f,0.986993f,-0.00630407f, -0.0575905f,0.994633f,-0.0859521f, -0.0365841f,0.998447f,-0.0420043f, -0.0556411f,0.989086f,0.136432f, -0.127974f,0.973486f,0.1896f, -0.188609f,0.96964f,0.155643f, -0.316079f,0.935031f,0.16066f, -0.368833f,0.913789f,0.170151f, -0.28567f,0.933317f,0.217512f, -0.224877f,0.919424f,0.322631f, -0.173372f,0.927466f,0.331284f, -0.14641f,0.951279f,0.271352f, -0.199618f,0.950197f,0.239328f, -0.194716f,0.961761f,0.192616f, -0.211001f,0.970026f,0.12053f, -0.377145f,0.915922f,0.137289f, -0.173279f,0.983115f,0.0588147f, -0.137169f,0.986854f,0.085457f, -0.167124f,0.984519f,0.0528309f, -0.114693f,0.990538f,-0.0753596f, -0.120988f,0.991416f,-0.0495523f, --0.0934722f,0.99234f,-0.0807704f, --0.28812f,0.930265f,-0.227141f, --0.319246f,0.884516f,-0.340167f, --0.147049f,0.912977f,-0.380591f, -0.113837f,0.925954f,-0.360071f, -0.286328f,0.873071f,-0.394668f, -0.386305f,0.86841f,-0.310857f, -0.201568f,0.937185f,-0.284702f, -0.165365f,0.953527f,-0.251875f, -0.277218f,0.910704f,-0.306215f, -0.350715f,0.890932f,-0.288511f, -0.130261f,0.920935f,-0.367302f, --0.00793534f,0.891743f,-0.452472f, -0.173424f,0.90309f,-0.392878f, -0.309572f,0.891597f,-0.330484f, -0.155483f,0.904383f,-0.397387f, --0.0901615f,0.931774f,-0.351664f, --0.12522f,0.950283f,-0.285102f, -0.116309f,0.952999f,-0.279758f, -0.314059f,0.900664f,-0.300285f, -0.399484f,0.884115f,-0.242388f, -0.476487f,0.865346f,-0.155359f, -0.461331f,0.87037f,-0.172132f, -0.340659f,0.915541f,-0.213858f, -0.307988f,0.934535f,-0.178292f, -0.356904f,0.924065f,-0.136833f, -0.470016f,0.879468f,-0.0749671f, -0.505067f,0.862447f,-0.0330571f, --0.15355f,0.924768f,0.348175f, --0.09321f,0.949622f,0.299215f, --0.0484808f,0.991662f,0.1194f, --0.0103305f,0.999605f,0.0261285f, -0.0401188f,0.998578f,0.0351042f, --0.00661539f,0.998628f,-0.0519471f, --0.0683745f,0.981776f,-0.177318f, --0.0856989f,0.966825f,-0.240633f, --0.0983519f,0.984458f,-0.145499f, --0.0680709f,0.995572f,-0.0648268f, -0.0777629f,0.996246f,-0.0380386f, -0.0383267f,0.998901f,-0.0269619f, -0.00333347f,0.997094f,0.0761077f, -0.139217f,0.959624f,0.244419f, -0.245721f,0.912381f,0.327386f, -0.246821f,0.907772f,0.339159f, -0.175417f,0.940931f,0.289617f, --0.027159f,0.9789f,0.202525f, --0.173424f,0.953226f,0.247557f, -0.0844967f,0.921276f,0.37962f, -0.304261f,0.89366f,0.329845f, -0.31812f,0.923926f,0.21251f, -0.353311f,0.902952f,0.244642f, -0.195957f,0.945525f,0.25997f, -0.182247f,0.923305f,0.338075f, -0.134205f,0.934918f,0.328507f, -0.176553f,0.881734f,0.437463f, -0.22427f,0.87574f,0.42753f, -0.29074f,0.869795f,0.398657f, -0.272684f,0.924539f,0.266215f, -0.39631f,0.892935f,0.213556f, -0.227086f,0.96746f,0.111597f, -0.14196f,0.988195f,0.0576051f, -0.283679f,0.958555f,0.0264133f, -0.216474f,0.969698f,-0.113251f, -0.0386649f,0.982201f,-0.183812f, --0.0151491f,0.988164f,-0.152652f, --0.145516f,0.952277f,-0.268316f, --0.219857f,0.921944f,-0.318875f, --0.140821f,0.920717f,-0.363936f, -0.13255f,0.932146f,-0.33695f, -0.285156f,0.898104f,-0.334807f, -0.270867f,0.921389f,-0.278701f, -0.136545f,0.958362f,-0.250793f, -0.156889f,0.960437f,-0.230103f, -0.337521f,0.917391f,-0.210889f, -0.340375f,0.909959f,-0.236896f, -0.226521f,0.931852f,-0.283443f, -0.0467156f,0.919678f,-0.389885f, -0.11829f,0.926104f,-0.358244f, -0.284734f,0.910765f,-0.299055f, -0.155007f,0.943096f,-0.294183f, --0.117772f,0.948884f,-0.29283f, --0.124268f,0.932168f,-0.340029f, -0.155477f,0.92011f,-0.359477f, -0.348711f,0.859859f,-0.372885f, -0.344156f,0.842199f,-0.415039f, -0.367487f,0.839547f,-0.400142f, -0.45537f,0.851179f,-0.261021f, -0.340771f,0.905445f,-0.25307f, -0.281592f,0.927438f,-0.246101f, -0.270207f,0.930215f,-0.248371f, -0.337751f,0.936799f,-0.0912801f, -0.415821f,0.905383f,0.085868f, --0.0508816f,0.992949f,0.107064f, -0.00772943f,0.999926f,0.0093874f, -0.0748585f,0.990585f,-0.114623f, -0.0155266f,0.983672f,-0.179298f, -0.0579395f,0.986738f,-0.15163f, -0.0876255f,0.991018f,-0.10102f, -0.0527296f,0.995461f,-0.0792264f, --0.086898f,0.99085f,-0.103274f, --0.226618f,0.972789f,-0.0482267f, --0.175193f,0.983195f,0.0513344f, -0.0267808f,0.994997f,0.0962477f, -0.0618698f,0.991981f,0.110211f, --0.098328f,0.984739f,0.143601f, --0.00458312f,0.952299f,0.305132f, -0.173153f,0.913691f,0.367678f, -0.186464f,0.911194f,0.367365f, -0.171431f,0.905309f,0.388622f, -0.0620384f,0.93682f,0.344266f, --0.143644f,0.960893f,0.23675f, -0.0362541f,0.97893f,0.200951f, -0.349667f,0.904284f,0.244957f, -0.338175f,0.903327f,0.26389f, -0.333852f,0.898218f,0.285914f, -0.192181f,0.948404f,0.252183f, -0.15408f,0.957234f,0.244873f, -0.108314f,0.961372f,0.253046f, -0.0186373f,0.953687f,0.300223f, -0.205839f,0.914416f,0.34853f, -0.331275f,0.886521f,0.323015f, -0.368345f,0.875165f,0.313702f, -0.405591f,0.862022f,0.303997f, -0.335644f,0.884308f,0.324566f, -0.194457f,0.953987f,0.228245f, -0.317589f,0.932139f,0.173936f, -0.34707f,0.93458f,0.0781131f, -0.1429f,0.981779f,-0.125256f, -0.0457434f,0.962864f,-0.266085f, --0.0800896f,0.929514f,-0.359987f, --0.224976f,0.908098f,-0.353191f, --0.16594f,0.929111f,-0.330481f, -0.0749763f,0.957672f,-0.277928f, -0.277052f,0.936424f,-0.215295f, -0.266206f,0.947023f,-0.17967f, -0.192217f,0.96172f,-0.195315f, -0.159333f,0.947925f,-0.275775f, -0.291985f,0.916673f,-0.272864f, -0.390644f,0.893072f,-0.223205f, -0.316013f,0.901654f,-0.295223f, -0.0938304f,0.916417f,-0.38907f, -0.0371906f,0.918056f,-0.394702f, -0.249356f,0.914822f,-0.317682f, -0.159281f,0.933374f,-0.321625f, --0.034507f,0.927426f,-0.372412f, --0.0639276f,0.876921f,-0.476365f, -0.150154f,0.87361f,-0.462881f, -0.34577f,0.845394f,-0.407127f, -0.406017f,0.841234f,-0.357037f, -0.322181f,0.876026f,-0.358855f, -0.315882f,0.91236f,-0.260417f, -0.325378f,0.928704f,-0.177873f, -0.281437f,0.937288f,-0.205633f, -0.23991f,0.955112f,-0.173792f, -0.165717f,0.980838f,-0.102443f, -0.16591f,0.98582f,-0.0251575f, -0.188672f,0.97776f,0.0915829f, -0.0994257f,0.983812f,-0.14909f, -0.199087f,0.95198f,-0.232593f, -0.0121878f,0.914874f,-0.403556f, --0.0234414f,0.930265f,-0.36614f, --0.038124f,0.972539f,-0.229595f, --0.0300917f,0.999515f,-0.00796094f, --0.092201f,0.984658f,0.148144f, --0.315366f,0.938181f,0.142688f, --0.138968f,0.942311f,0.304528f, -0.0277459f,0.977812f,0.207641f, -0.0496201f,0.98101f,0.187502f, --0.256039f,0.940975f,0.22138f, --0.0796386f,0.864833f,0.495703f, -0.172206f,0.836979f,0.519434f, -0.218401f,0.8652f,0.451365f, -0.211231f,0.888948f,0.406391f, -0.153922f,0.942863f,0.295494f, --0.0705923f,0.983817f,0.164685f, -0.0334153f,0.99603f,0.0825054f, -0.282635f,0.9535f,0.104667f, -0.322121f,0.91103f,0.257413f, -0.32296f,0.89395f,0.310726f, -0.263681f,0.921808f,0.284152f, -0.145976f,0.970498f,0.191897f, -0.110214f,0.967993f,0.225482f, -0.0100073f,0.970397f,0.241307f, -0.231259f,0.94984f,0.210532f, -0.350804f,0.929639f,0.112731f, -0.388908f,0.908557f,0.152559f, -0.325259f,0.933029f,0.153831f, -0.358244f,0.845843f,0.395235f, -0.245479f,0.88292f,0.400241f, -0.340078f,0.880829f,0.329372f, -0.448713f,0.860203f,0.242295f, -0.291253f,0.956268f,-0.0268833f, -0.174446f,0.957532f,-0.229565f, --0.0246181f,0.920367f,-0.390281f, --0.230596f,0.878986f,-0.417383f, --0.188847f,0.897269f,-0.399054f, -0.0175328f,0.926292f,-0.376398f, -0.23985f,0.925856f,-0.291997f, -0.22945f,0.938275f,-0.258829f, -0.212396f,0.953082f,-0.21569f, -0.229329f,0.940641f,-0.250204f, -0.284501f,0.899212f,-0.33238f, -0.376241f,0.875275f,-0.30387f, -0.33476f,0.887829f,-0.315744f, -0.163808f,0.925647f,-0.341094f, -0.00890663f,0.895805f,-0.444357f, -0.214972f,0.896442f,-0.38753f, -0.17587f,0.912162f,-0.370177f, -0.075136f,0.903308f,-0.422362f, --0.00910936f,0.832148f,-0.55448f, -0.080579f,0.825188f,-0.559082f, -0.296201f,0.838595f,-0.457191f, -0.316267f,0.8627f,-0.39462f, -0.301959f,0.9215f,-0.24425f, -0.239667f,0.953185f,-0.184387f, -0.359606f,0.929321f,-0.0839473f, -0.264487f,0.941897f,-0.207066f, -0.184815f,0.971569f,-0.147976f, -0.141833f,0.988976f,-0.0425335f, -0.112364f,0.992816f,-0.0411276f, -}; - -btScalar Landscape04Tex[] = { -0.507813f,0.25f, -0.507813f,0.242188f, -0.515625f,0.25f, -0.515625f,0.242188f, -0.523438f,0.25f, -0.523438f,0.242188f, -0.53125f,0.25f, -0.53125f,0.242188f, -0.539063f,0.25f, -0.539063f,0.242188f, -0.546875f,0.25f, -0.546875f,0.242188f, -0.554688f,0.25f, -0.554688f,0.242188f, -0.5625f,0.25f, -0.5625f,0.242188f, -0.570313f,0.25f, -0.570313f,0.242188f, -0.578125f,0.25f, -0.578125f,0.242188f, -0.585938f,0.25f, -0.585938f,0.242188f, -0.59375f,0.25f, -0.59375f,0.242188f, -0.601563f,0.25f, -0.601563f,0.242188f, -0.609375f,0.25f, -0.609375f,0.242188f, -0.617188f,0.25f, -0.617188f,0.242188f, -0.625f,0.25f, -0.625f,0.242188f, -0.632813f,0.25f, -0.632813f,0.242188f, -0.640625f,0.25f, -0.640625f,0.242188f, -0.648438f,0.25f, -0.648438f,0.242188f, -0.65625f,0.25f, -0.65625f,0.242188f, -0.664063f,0.25f, -0.664063f,0.242188f, -0.671875f,0.25f, -0.671875f,0.242188f, -0.679688f,0.25f, -0.679688f,0.242188f, -0.6875f,0.25f, -0.6875f,0.242188f, -0.695313f,0.25f, -0.695313f,0.242188f, -0.703125f,0.25f, -0.703125f,0.242188f, -0.710938f,0.25f, -0.710938f,0.242188f, -0.71875f,0.25f, -0.71875f,0.242188f, -0.726563f,0.25f, -0.726563f,0.242188f, -0.734375f,0.25f, -0.734375f,0.242188f, -0.742188f,0.25f, -0.742188f,0.242188f, -0.75f,0.25f, -0.75f,0.242188f, -0.757813f,0.25f, -0.757813f,0.242188f, -0.765625f,0.25f, -0.765625f,0.242188f, -0.773438f,0.25f, -0.773438f,0.242188f, -0.78125f,0.25f, -0.78125f,0.242188f, -0.789063f,0.25f, -0.789063f,0.242188f, -0.796875f,0.25f, -0.796875f,0.242188f, -0.804688f,0.25f, -0.804688f,0.242188f, -0.8125f,0.25f, -0.8125f,0.242188f, -0.820313f,0.25f, -0.820313f,0.242188f, -0.828125f,0.25f, -0.828125f,0.242188f, -0.835938f,0.25f, -0.835938f,0.242188f, -0.84375f,0.25f, -0.84375f,0.242188f, -0.851563f,0.25f, -0.851563f,0.242188f, -0.859375f,0.25f, -0.859375f,0.242188f, -0.867188f,0.25f, -0.867188f,0.242188f, -0.875f,0.25f, -0.875f,0.242188f, -0.882813f,0.25f, -0.882813f,0.242188f, -0.890625f,0.25f, -0.890625f,0.242188f, -0.898438f,0.25f, -0.898438f,0.242188f, -0.90625f,0.25f, -0.90625f,0.242188f, -0.914063f,0.25f, -0.914063f,0.242188f, -0.921875f,0.25f, -0.921875f,0.242188f, -0.929688f,0.25f, -0.929688f,0.242188f, -0.9375f,0.25f, -0.9375f,0.242188f, -0.945313f,0.25f, -0.945313f,0.242188f, -0.953125f,0.25f, -0.953125f,0.242188f, -0.960938f,0.25f, -0.960938f,0.242188f, -0.96875f,0.25f, -0.96875f,0.242188f, -0.976563f,0.25f, -0.976563f,0.242188f, -0.984375f,0.25f, -0.984375f,0.242188f, -0.992188f,0.25f, -0.992188f,0.242188f, -1.0f,0.25f, -1.0f,0.242188f, -0.507813f,0.257813f, -0.515625f,0.257813f, -0.523438f,0.257813f, -0.53125f,0.257813f, -0.539063f,0.257813f, -0.546875f,0.257813f, -0.554688f,0.257813f, -0.5625f,0.257813f, -0.570313f,0.257813f, -0.578125f,0.257813f, -0.585938f,0.257813f, -0.59375f,0.257813f, -0.601563f,0.257813f, -0.609375f,0.257813f, -0.617188f,0.257813f, -0.625f,0.257813f, -0.632813f,0.257813f, -0.640625f,0.257813f, -0.648438f,0.257813f, -0.65625f,0.257813f, -0.664063f,0.257813f, -0.671875f,0.257813f, -0.679688f,0.257813f, -0.6875f,0.257813f, -0.695313f,0.257813f, -0.703125f,0.257813f, -0.710938f,0.257813f, -0.71875f,0.257813f, -0.726563f,0.257813f, -0.734375f,0.257813f, -0.742188f,0.257813f, -0.75f,0.257813f, -0.757813f,0.257813f, -0.765625f,0.257813f, -0.773438f,0.257813f, -0.78125f,0.257813f, -0.789063f,0.257813f, -0.796875f,0.257813f, -0.804688f,0.257813f, -0.8125f,0.257813f, -0.820313f,0.257813f, -0.828125f,0.257813f, -0.835938f,0.257813f, -0.84375f,0.257813f, -0.851563f,0.257813f, -0.859375f,0.257813f, -0.867188f,0.257813f, -0.875f,0.257813f, -0.882813f,0.257813f, -0.890625f,0.257813f, -0.898438f,0.257813f, -0.90625f,0.257813f, -0.914063f,0.257813f, -0.921875f,0.257813f, -0.929688f,0.257813f, -0.9375f,0.257813f, -0.945313f,0.257813f, -0.953125f,0.257813f, -0.960938f,0.257813f, -0.96875f,0.257813f, -0.976563f,0.257813f, -0.984375f,0.257813f, -0.992188f,0.257813f, -1.0f,0.257813f, -0.507813f,0.265625f, -0.515625f,0.265625f, -0.523438f,0.265625f, -0.53125f,0.265625f, -0.539063f,0.265625f, -0.546875f,0.265625f, -0.554688f,0.265625f, -0.5625f,0.265625f, -0.570313f,0.265625f, -0.578125f,0.265625f, -0.585938f,0.265625f, -0.59375f,0.265625f, -0.601563f,0.265625f, -0.609375f,0.265625f, -0.617188f,0.265625f, -0.625f,0.265625f, -0.632813f,0.265625f, -0.640625f,0.265625f, -0.648438f,0.265625f, -0.65625f,0.265625f, -0.664063f,0.265625f, -0.671875f,0.265625f, -0.679688f,0.265625f, -0.6875f,0.265625f, -0.695313f,0.265625f, -0.703125f,0.265625f, -0.710938f,0.265625f, -0.71875f,0.265625f, -0.726563f,0.265625f, -0.734375f,0.265625f, -0.742188f,0.265625f, -0.75f,0.265625f, -0.757813f,0.265625f, -0.765625f,0.265625f, -0.773438f,0.265625f, -0.78125f,0.265625f, -0.789063f,0.265625f, -0.796875f,0.265625f, -0.804688f,0.265625f, -0.8125f,0.265625f, -0.820313f,0.265625f, -0.828125f,0.265625f, -0.835938f,0.265625f, -0.84375f,0.265625f, -0.851563f,0.265625f, -0.859375f,0.265625f, -0.867188f,0.265625f, -0.875f,0.265625f, -0.882813f,0.265625f, -0.890625f,0.265625f, -0.898438f,0.265625f, -0.90625f,0.265625f, -0.914063f,0.265625f, -0.921875f,0.265625f, -0.929688f,0.265625f, -0.9375f,0.265625f, -0.945313f,0.265625f, -0.953125f,0.265625f, -0.960938f,0.265625f, -0.96875f,0.265625f, -0.976563f,0.265625f, -0.984375f,0.265625f, -0.992188f,0.265625f, -1.0f,0.265625f, -0.507813f,0.273438f, -0.515625f,0.273438f, -0.523438f,0.273438f, -0.53125f,0.273438f, -0.539063f,0.273438f, -0.546875f,0.273438f, -0.554688f,0.273438f, -0.5625f,0.273438f, -0.570313f,0.273438f, -0.578125f,0.273438f, -0.585938f,0.273438f, -0.59375f,0.273438f, -0.601563f,0.273438f, -0.609375f,0.273438f, -0.617188f,0.273438f, -0.625f,0.273438f, -0.632813f,0.273438f, -0.640625f,0.273438f, -0.648438f,0.273438f, -0.65625f,0.273438f, -0.664063f,0.273438f, -0.671875f,0.273438f, -0.679688f,0.273438f, -0.6875f,0.273438f, -0.695313f,0.273438f, -0.703125f,0.273438f, -0.710938f,0.273438f, -0.71875f,0.273438f, -0.726563f,0.273438f, -0.734375f,0.273438f, -0.742188f,0.273438f, -0.75f,0.273438f, -0.757813f,0.273438f, -0.765625f,0.273438f, -0.773438f,0.273438f, -0.78125f,0.273438f, -0.789063f,0.273438f, -0.796875f,0.273438f, -0.804688f,0.273438f, -0.8125f,0.273438f, -0.820313f,0.273438f, -0.828125f,0.273438f, -0.835938f,0.273438f, -0.84375f,0.273438f, -0.851563f,0.273438f, -0.859375f,0.273438f, -0.867188f,0.273438f, -0.875f,0.273438f, -0.882813f,0.273438f, -0.890625f,0.273438f, -0.898438f,0.273438f, -0.90625f,0.273438f, -0.914063f,0.273438f, -0.921875f,0.273438f, -0.929688f,0.273438f, -0.9375f,0.273438f, -0.945313f,0.273438f, -0.953125f,0.273438f, -0.960938f,0.273438f, -0.96875f,0.273438f, -0.976563f,0.273438f, -0.984375f,0.273438f, -0.992188f,0.273438f, -1.0f,0.273438f, -0.507813f,0.28125f, -0.515625f,0.28125f, -0.523438f,0.28125f, -0.53125f,0.28125f, -0.539063f,0.28125f, -0.546875f,0.28125f, -0.554688f,0.28125f, -0.5625f,0.28125f, -0.570313f,0.28125f, -0.578125f,0.28125f, -0.585938f,0.28125f, -0.59375f,0.28125f, -0.601563f,0.28125f, -0.609375f,0.28125f, -0.617188f,0.28125f, -0.625f,0.28125f, -0.632813f,0.28125f, -0.640625f,0.28125f, -0.648438f,0.28125f, -0.65625f,0.28125f, -0.664063f,0.28125f, -0.671875f,0.28125f, -0.679688f,0.28125f, -0.6875f,0.28125f, -0.695313f,0.28125f, -0.703125f,0.28125f, -0.710938f,0.28125f, -0.71875f,0.28125f, -0.726563f,0.28125f, -0.734375f,0.28125f, -0.742188f,0.28125f, -0.75f,0.28125f, -0.757813f,0.28125f, -0.765625f,0.28125f, -0.773438f,0.28125f, -0.78125f,0.28125f, -0.789063f,0.28125f, -0.796875f,0.28125f, -0.804688f,0.28125f, -0.8125f,0.28125f, -0.820313f,0.28125f, -0.828125f,0.28125f, -0.835938f,0.28125f, -0.84375f,0.28125f, -0.851563f,0.28125f, -0.859375f,0.28125f, -0.867188f,0.28125f, -0.875f,0.28125f, -0.882813f,0.28125f, -0.890625f,0.28125f, -0.898438f,0.28125f, -0.90625f,0.28125f, -0.914063f,0.28125f, -0.921875f,0.28125f, -0.929688f,0.28125f, -0.9375f,0.28125f, -0.945313f,0.28125f, -0.953125f,0.28125f, -0.960938f,0.28125f, -0.96875f,0.28125f, -0.976563f,0.28125f, -0.984375f,0.28125f, -0.992188f,0.28125f, -1.0f,0.28125f, -0.507813f,0.289063f, -0.515625f,0.289063f, -0.523438f,0.289063f, -0.53125f,0.289063f, -0.539063f,0.289063f, -0.546875f,0.289063f, -0.554688f,0.289063f, -0.5625f,0.289063f, -0.570313f,0.289063f, -0.578125f,0.289063f, -0.585938f,0.289063f, -0.59375f,0.289063f, -0.601563f,0.289063f, -0.609375f,0.289063f, -0.617188f,0.289063f, -0.625f,0.289063f, -0.632813f,0.289063f, -0.640625f,0.289063f, -0.648438f,0.289063f, -0.65625f,0.289063f, -0.664063f,0.289063f, -0.671875f,0.289063f, -0.679688f,0.289063f, -0.6875f,0.289063f, -0.695313f,0.289063f, -0.703125f,0.289063f, -0.710938f,0.289063f, -0.71875f,0.289063f, -0.726563f,0.289063f, -0.734375f,0.289063f, -0.742188f,0.289063f, -0.75f,0.289063f, -0.757813f,0.289063f, -0.765625f,0.289063f, -0.773438f,0.289063f, -0.78125f,0.289063f, -0.789063f,0.289063f, -0.796875f,0.289063f, -0.804688f,0.289063f, -0.8125f,0.289063f, -0.820313f,0.289063f, -0.828125f,0.289063f, -0.835938f,0.289063f, -0.84375f,0.289063f, -0.851563f,0.289063f, -0.859375f,0.289063f, -0.867188f,0.289063f, -0.875f,0.289063f, -0.882813f,0.289063f, -0.890625f,0.289063f, -0.898438f,0.289063f, -0.90625f,0.289063f, -0.914063f,0.289063f, -0.921875f,0.289063f, -0.929688f,0.289063f, -0.9375f,0.289063f, -0.945313f,0.289063f, -0.953125f,0.289063f, -0.960938f,0.289063f, -0.96875f,0.289063f, -0.976563f,0.289063f, -0.984375f,0.289063f, -0.992188f,0.289063f, -1.0f,0.289063f, -0.507813f,0.296875f, -0.515625f,0.296875f, -0.523438f,0.296875f, -0.53125f,0.296875f, -0.539063f,0.296875f, -0.546875f,0.296875f, -0.554688f,0.296875f, -0.5625f,0.296875f, -0.570313f,0.296875f, -0.578125f,0.296875f, -0.585938f,0.296875f, -0.59375f,0.296875f, -0.601563f,0.296875f, -0.609375f,0.296875f, -0.617188f,0.296875f, -0.625f,0.296875f, -0.632813f,0.296875f, -0.640625f,0.296875f, -0.648438f,0.296875f, -0.65625f,0.296875f, -0.664063f,0.296875f, -0.671875f,0.296875f, -0.679688f,0.296875f, -0.6875f,0.296875f, -0.695313f,0.296875f, -0.703125f,0.296875f, -0.710938f,0.296875f, -0.71875f,0.296875f, -0.726563f,0.296875f, -0.734375f,0.296875f, -0.742188f,0.296875f, -0.75f,0.296875f, -0.757813f,0.296875f, -0.765625f,0.296875f, -0.773438f,0.296875f, -0.78125f,0.296875f, -0.789063f,0.296875f, -0.796875f,0.296875f, -0.804688f,0.296875f, -0.8125f,0.296875f, -0.820313f,0.296875f, -0.828125f,0.296875f, -0.835938f,0.296875f, -0.84375f,0.296875f, -0.851563f,0.296875f, -0.859375f,0.296875f, -0.867188f,0.296875f, -0.875f,0.296875f, -0.882813f,0.296875f, -0.890625f,0.296875f, -0.898438f,0.296875f, -0.90625f,0.296875f, -0.914063f,0.296875f, -0.921875f,0.296875f, -0.929688f,0.296875f, -0.9375f,0.296875f, -0.945313f,0.296875f, -0.953125f,0.296875f, -0.960938f,0.296875f, -0.96875f,0.296875f, -0.976563f,0.296875f, -0.984375f,0.296875f, -0.992188f,0.296875f, -1.0f,0.296875f, -0.507813f,0.304688f, -0.515625f,0.304688f, -0.523438f,0.304688f, -0.53125f,0.304688f, -0.539063f,0.304688f, -0.546875f,0.304688f, -0.554688f,0.304688f, -0.5625f,0.304688f, -0.570313f,0.304688f, -0.578125f,0.304688f, -0.585938f,0.304688f, -0.59375f,0.304688f, -0.601563f,0.304688f, -0.609375f,0.304688f, -0.617188f,0.304688f, -0.625f,0.304688f, -0.632813f,0.304688f, -0.640625f,0.304688f, -0.648438f,0.304688f, -0.65625f,0.304688f, -0.664063f,0.304688f, -0.671875f,0.304688f, -0.679688f,0.304688f, -0.6875f,0.304688f, -0.695313f,0.304688f, -0.703125f,0.304688f, -0.710938f,0.304688f, -0.71875f,0.304688f, -0.726563f,0.304688f, -0.734375f,0.304688f, -0.742188f,0.304688f, -0.75f,0.304688f, -0.757813f,0.304688f, -0.765625f,0.304688f, -0.773438f,0.304688f, -0.78125f,0.304688f, -0.789063f,0.304688f, -0.796875f,0.304688f, -0.804688f,0.304688f, -0.8125f,0.304688f, -0.820313f,0.304688f, -0.828125f,0.304688f, -0.835938f,0.304688f, -0.84375f,0.304688f, -0.851563f,0.304688f, -0.859375f,0.304688f, -0.867188f,0.304688f, -0.875f,0.304688f, -0.882813f,0.304688f, -0.890625f,0.304688f, -0.898438f,0.304688f, -0.90625f,0.304688f, -0.914063f,0.304688f, -0.921875f,0.304688f, -0.929688f,0.304688f, -0.9375f,0.304688f, -0.945313f,0.304688f, -0.953125f,0.304688f, -0.960938f,0.304688f, -0.96875f,0.304688f, -0.976563f,0.304688f, -0.984375f,0.304688f, -0.992188f,0.304688f, -1.0f,0.304688f, -0.507813f,0.3125f, -0.515625f,0.3125f, -0.523438f,0.3125f, -0.53125f,0.3125f, -0.539063f,0.3125f, -0.546875f,0.3125f, -0.554688f,0.3125f, -0.5625f,0.3125f, -0.570313f,0.3125f, -0.578125f,0.3125f, -0.585938f,0.3125f, -0.59375f,0.3125f, -0.601563f,0.3125f, -0.609375f,0.3125f, -0.617188f,0.3125f, -0.625f,0.3125f, -0.632813f,0.3125f, -0.640625f,0.3125f, -0.648438f,0.3125f, -0.65625f,0.3125f, -0.664063f,0.3125f, -0.671875f,0.3125f, -0.679688f,0.3125f, -0.6875f,0.3125f, -0.695313f,0.3125f, -0.703125f,0.3125f, -0.710938f,0.3125f, -0.71875f,0.3125f, -0.726563f,0.3125f, -0.734375f,0.3125f, -0.742188f,0.3125f, -0.75f,0.3125f, -0.757813f,0.3125f, -0.765625f,0.3125f, -0.773438f,0.3125f, -0.78125f,0.3125f, -0.789063f,0.3125f, -0.796875f,0.3125f, -0.804688f,0.3125f, -0.8125f,0.3125f, -0.820313f,0.3125f, -0.828125f,0.3125f, -0.835938f,0.3125f, -0.84375f,0.3125f, -0.851563f,0.3125f, -0.859375f,0.3125f, -0.867188f,0.3125f, -0.875f,0.3125f, -0.882813f,0.3125f, -0.890625f,0.3125f, -0.898438f,0.3125f, -0.90625f,0.3125f, -0.914063f,0.3125f, -0.921875f,0.3125f, -0.929688f,0.3125f, -0.9375f,0.3125f, -0.945313f,0.3125f, -0.953125f,0.3125f, -0.960938f,0.3125f, -0.96875f,0.3125f, -0.976563f,0.3125f, -0.984375f,0.3125f, -0.992188f,0.3125f, -1.0f,0.3125f, -0.507813f,0.320313f, -0.515625f,0.320313f, -0.523438f,0.320313f, -0.53125f,0.320313f, -0.539063f,0.320313f, -0.546875f,0.320313f, -0.554688f,0.320313f, -0.5625f,0.320313f, -0.570313f,0.320313f, -0.578125f,0.320313f, -0.585938f,0.320313f, -0.59375f,0.320313f, -0.601563f,0.320313f, -0.609375f,0.320313f, -0.617188f,0.320313f, -0.625f,0.320313f, -0.632813f,0.320313f, -0.640625f,0.320313f, -0.648438f,0.320313f, -0.65625f,0.320313f, -0.664063f,0.320313f, -0.671875f,0.320313f, -0.679688f,0.320313f, -0.6875f,0.320313f, -0.695313f,0.320313f, -0.703125f,0.320313f, -0.710938f,0.320313f, -0.71875f,0.320313f, -0.726563f,0.320313f, -0.734375f,0.320313f, -0.742188f,0.320313f, -0.75f,0.320313f, -0.757813f,0.320313f, -0.765625f,0.320313f, -0.773438f,0.320313f, -0.78125f,0.320313f, -0.789063f,0.320313f, -0.796875f,0.320313f, -0.804688f,0.320313f, -0.8125f,0.320313f, -0.820313f,0.320313f, -0.828125f,0.320313f, -0.835938f,0.320313f, -0.84375f,0.320313f, -0.851563f,0.320313f, -0.859375f,0.320313f, -0.867188f,0.320313f, -0.875f,0.320313f, -0.882813f,0.320313f, -0.890625f,0.320313f, -0.898438f,0.320313f, -0.90625f,0.320313f, -0.914063f,0.320313f, -0.921875f,0.320313f, -0.929688f,0.320313f, -0.9375f,0.320313f, -0.945313f,0.320313f, -0.953125f,0.320313f, -0.960938f,0.320313f, -0.96875f,0.320313f, -0.976563f,0.320313f, -0.984375f,0.320313f, -0.992188f,0.320313f, -1.0f,0.320313f, -0.507813f,0.328125f, -0.515625f,0.328125f, -0.523438f,0.328125f, -0.53125f,0.328125f, -0.539063f,0.328125f, -0.546875f,0.328125f, -0.554688f,0.328125f, -0.5625f,0.328125f, -0.570313f,0.328125f, -0.578125f,0.328125f, -0.585938f,0.328125f, -0.59375f,0.328125f, -0.601563f,0.328125f, -0.609375f,0.328125f, -0.617188f,0.328125f, -0.625f,0.328125f, -0.632813f,0.328125f, -0.640625f,0.328125f, -0.648438f,0.328125f, -0.65625f,0.328125f, -0.664063f,0.328125f, -0.671875f,0.328125f, -0.679688f,0.328125f, -0.6875f,0.328125f, -0.695313f,0.328125f, -0.703125f,0.328125f, -0.710938f,0.328125f, -0.71875f,0.328125f, -0.726563f,0.328125f, -0.734375f,0.328125f, -0.742188f,0.328125f, -0.75f,0.328125f, -0.757813f,0.328125f, -0.765625f,0.328125f, -0.773438f,0.328125f, -0.78125f,0.328125f, -0.789063f,0.328125f, -0.796875f,0.328125f, -0.804688f,0.328125f, -0.8125f,0.328125f, -0.820313f,0.328125f, -0.828125f,0.328125f, -0.835938f,0.328125f, -0.84375f,0.328125f, -0.851563f,0.328125f, -0.859375f,0.328125f, -0.867188f,0.328125f, -0.875f,0.328125f, -0.882813f,0.328125f, -0.890625f,0.328125f, -0.898438f,0.328125f, -0.90625f,0.328125f, -0.914063f,0.328125f, -0.921875f,0.328125f, -0.929688f,0.328125f, -0.9375f,0.328125f, -0.945313f,0.328125f, -0.953125f,0.328125f, -0.960938f,0.328125f, -0.96875f,0.328125f, -0.976563f,0.328125f, -0.984375f,0.328125f, -0.992188f,0.328125f, -1.0f,0.328125f, -0.507813f,0.335938f, -0.515625f,0.335938f, -0.523438f,0.335938f, -0.53125f,0.335938f, -0.539063f,0.335938f, -0.546875f,0.335938f, -0.554688f,0.335938f, -0.5625f,0.335938f, -0.570313f,0.335938f, -0.578125f,0.335938f, -0.585938f,0.335938f, -0.59375f,0.335938f, -0.601563f,0.335938f, -0.609375f,0.335938f, -0.617188f,0.335938f, -0.625f,0.335938f, -0.632813f,0.335938f, -0.640625f,0.335938f, -0.648438f,0.335938f, -0.65625f,0.335938f, -0.664063f,0.335938f, -0.671875f,0.335938f, -0.679688f,0.335938f, -0.6875f,0.335938f, -0.695313f,0.335938f, -0.703125f,0.335938f, -0.710938f,0.335938f, -0.71875f,0.335938f, -0.726563f,0.335938f, -0.734375f,0.335938f, -0.742188f,0.335938f, -0.75f,0.335938f, -0.757813f,0.335938f, -0.765625f,0.335938f, -0.773438f,0.335938f, -0.78125f,0.335938f, -0.789063f,0.335938f, -0.796875f,0.335938f, -0.804688f,0.335938f, -0.8125f,0.335938f, -0.820313f,0.335938f, -0.828125f,0.335938f, -0.835938f,0.335938f, -0.84375f,0.335938f, -0.851563f,0.335938f, -0.859375f,0.335938f, -0.867188f,0.335938f, -0.875f,0.335938f, -0.882813f,0.335938f, -0.890625f,0.335938f, -0.898438f,0.335938f, -0.90625f,0.335938f, -0.914063f,0.335938f, -0.921875f,0.335938f, -0.929688f,0.335938f, -0.9375f,0.335938f, -0.945313f,0.335938f, -0.953125f,0.335938f, -0.960938f,0.335938f, -0.96875f,0.335938f, -0.976563f,0.335938f, -0.984375f,0.335938f, -0.992188f,0.335938f, -1.0f,0.335938f, -0.507813f,0.34375f, -0.515625f,0.34375f, -0.523438f,0.34375f, -0.53125f,0.34375f, -0.539063f,0.34375f, -0.546875f,0.34375f, -0.554688f,0.34375f, -0.5625f,0.34375f, -0.570313f,0.34375f, -0.578125f,0.34375f, -0.585938f,0.34375f, -0.59375f,0.34375f, -0.601563f,0.34375f, -0.609375f,0.34375f, -0.617188f,0.34375f, -0.625f,0.34375f, -0.632813f,0.34375f, -0.640625f,0.34375f, -0.648438f,0.34375f, -0.65625f,0.34375f, -0.664063f,0.34375f, -0.671875f,0.34375f, -0.679688f,0.34375f, -0.6875f,0.34375f, -0.695313f,0.34375f, -0.703125f,0.34375f, -0.710938f,0.34375f, -0.71875f,0.34375f, -0.726563f,0.34375f, -0.734375f,0.34375f, -0.742188f,0.34375f, -0.75f,0.34375f, -0.757813f,0.34375f, -0.765625f,0.34375f, -0.773438f,0.34375f, -0.78125f,0.34375f, -0.789063f,0.34375f, -0.796875f,0.34375f, -0.804688f,0.34375f, -0.8125f,0.34375f, -0.820313f,0.34375f, -0.828125f,0.34375f, -0.835938f,0.34375f, -0.84375f,0.34375f, -0.851563f,0.34375f, -0.859375f,0.34375f, -0.867188f,0.34375f, -0.875f,0.34375f, -0.882813f,0.34375f, -0.890625f,0.34375f, -0.898438f,0.34375f, -0.90625f,0.34375f, -0.914063f,0.34375f, -0.921875f,0.34375f, -0.929688f,0.34375f, -0.9375f,0.34375f, -0.945313f,0.34375f, -0.953125f,0.34375f, -0.960938f,0.34375f, -0.96875f,0.34375f, -0.976563f,0.34375f, -0.984375f,0.34375f, -0.992188f,0.34375f, -1.0f,0.34375f, -0.507813f,0.351563f, -0.515625f,0.351563f, -0.523438f,0.351563f, -0.53125f,0.351563f, -0.539063f,0.351563f, -0.546875f,0.351563f, -0.554688f,0.351563f, -0.5625f,0.351563f, -0.570313f,0.351563f, -0.578125f,0.351563f, -0.585938f,0.351563f, -0.59375f,0.351563f, -0.601563f,0.351563f, -0.609375f,0.351563f, -0.617188f,0.351563f, -0.625f,0.351563f, -0.632813f,0.351563f, -0.640625f,0.351563f, -0.648438f,0.351563f, -0.65625f,0.351563f, -0.664063f,0.351563f, -0.671875f,0.351563f, -0.679688f,0.351563f, -0.6875f,0.351563f, -0.695313f,0.351563f, -0.703125f,0.351563f, -0.710938f,0.351563f, -0.71875f,0.351563f, -0.726563f,0.351563f, -0.734375f,0.351563f, -0.742188f,0.351563f, -0.75f,0.351563f, -0.757813f,0.351563f, -0.765625f,0.351563f, -0.773438f,0.351563f, -0.78125f,0.351563f, -0.789063f,0.351563f, -0.796875f,0.351563f, -0.804688f,0.351563f, -0.8125f,0.351563f, -0.820313f,0.351563f, -0.828125f,0.351563f, -0.835938f,0.351563f, -0.84375f,0.351563f, -0.851563f,0.351563f, -0.859375f,0.351563f, -0.867188f,0.351563f, -0.875f,0.351563f, -0.882813f,0.351563f, -0.890625f,0.351563f, -0.898438f,0.351563f, -0.90625f,0.351563f, -0.914063f,0.351563f, -0.921875f,0.351563f, -0.929688f,0.351563f, -0.9375f,0.351563f, -0.945313f,0.351563f, -0.953125f,0.351563f, -0.960938f,0.351563f, -0.96875f,0.351563f, -0.976563f,0.351563f, -0.984375f,0.351563f, -0.992188f,0.351563f, -1.0f,0.351563f, -0.507813f,0.359375f, -0.515625f,0.359375f, -0.523438f,0.359375f, -0.53125f,0.359375f, -0.539063f,0.359375f, -0.546875f,0.359375f, -0.554688f,0.359375f, -0.5625f,0.359375f, -0.570313f,0.359375f, -0.578125f,0.359375f, -0.585938f,0.359375f, -0.59375f,0.359375f, -0.601563f,0.359375f, -0.609375f,0.359375f, -0.617188f,0.359375f, -0.625f,0.359375f, -0.632813f,0.359375f, -0.640625f,0.359375f, -0.648438f,0.359375f, -0.65625f,0.359375f, -0.664063f,0.359375f, -0.671875f,0.359375f, -0.679688f,0.359375f, -0.6875f,0.359375f, -0.695313f,0.359375f, -0.703125f,0.359375f, -0.710938f,0.359375f, -0.71875f,0.359375f, -0.726563f,0.359375f, -0.734375f,0.359375f, -0.742188f,0.359375f, -0.75f,0.359375f, -0.757813f,0.359375f, -0.765625f,0.359375f, -0.773438f,0.359375f, -0.78125f,0.359375f, -0.789063f,0.359375f, -0.796875f,0.359375f, -0.804688f,0.359375f, -0.8125f,0.359375f, -0.820313f,0.359375f, -0.828125f,0.359375f, -0.835938f,0.359375f, -0.84375f,0.359375f, -0.851563f,0.359375f, -0.859375f,0.359375f, -0.867188f,0.359375f, -0.875f,0.359375f, -0.882813f,0.359375f, -0.890625f,0.359375f, -0.898438f,0.359375f, -0.90625f,0.359375f, -0.914063f,0.359375f, -0.921875f,0.359375f, -0.929688f,0.359375f, -0.9375f,0.359375f, -0.945313f,0.359375f, -0.953125f,0.359375f, -0.960938f,0.359375f, -0.96875f,0.359375f, -0.976563f,0.359375f, -0.984375f,0.359375f, -0.992188f,0.359375f, -1.0f,0.359375f, -0.507813f,0.367188f, -0.515625f,0.367188f, -0.523438f,0.367188f, -0.53125f,0.367188f, -0.539063f,0.367188f, -0.546875f,0.367188f, -0.554688f,0.367188f, -0.5625f,0.367188f, -0.570313f,0.367188f, -0.578125f,0.367188f, -0.585938f,0.367188f, -0.59375f,0.367188f, -0.601563f,0.367188f, -0.609375f,0.367188f, -0.617188f,0.367188f, -0.625f,0.367188f, -0.632813f,0.367188f, -0.640625f,0.367188f, -0.648438f,0.367188f, -0.65625f,0.367188f, -0.664063f,0.367188f, -0.671875f,0.367188f, -0.679688f,0.367188f, -0.6875f,0.367188f, -0.695313f,0.367188f, -0.703125f,0.367188f, -0.710938f,0.367188f, -0.71875f,0.367188f, -0.726563f,0.367188f, -0.734375f,0.367188f, -0.742188f,0.367188f, -0.75f,0.367188f, -0.757813f,0.367188f, -0.765625f,0.367188f, -0.773438f,0.367188f, -0.78125f,0.367188f, -0.789063f,0.367188f, -0.796875f,0.367188f, -0.804688f,0.367188f, -0.8125f,0.367188f, -0.820313f,0.367188f, -0.828125f,0.367188f, -0.835938f,0.367188f, -0.84375f,0.367188f, -0.851563f,0.367188f, -0.859375f,0.367188f, -0.867188f,0.367188f, -0.875f,0.367188f, -0.882813f,0.367188f, -0.890625f,0.367188f, -0.898438f,0.367188f, -0.90625f,0.367188f, -0.914063f,0.367188f, -0.921875f,0.367188f, -0.929688f,0.367188f, -0.9375f,0.367188f, -0.945313f,0.367188f, -0.953125f,0.367188f, -0.960938f,0.367188f, -0.96875f,0.367188f, -0.976563f,0.367188f, -0.984375f,0.367188f, -0.992188f,0.367188f, -1.0f,0.367188f, -0.507813f,0.375f, -0.515625f,0.375f, -0.523438f,0.375f, -0.53125f,0.375f, -0.539063f,0.375f, -0.546875f,0.375f, -0.554688f,0.375f, -0.5625f,0.375f, -0.570313f,0.375f, -0.578125f,0.375f, -0.585938f,0.375f, -0.59375f,0.375f, -0.601563f,0.375f, -0.609375f,0.375f, -0.617188f,0.375f, -0.625f,0.375f, -0.632813f,0.375f, -0.640625f,0.375f, -0.648438f,0.375f, -0.65625f,0.375f, -0.664063f,0.375f, -0.671875f,0.375f, -0.679688f,0.375f, -0.6875f,0.375f, -0.695313f,0.375f, -0.703125f,0.375f, -0.710938f,0.375f, -0.71875f,0.375f, -0.726563f,0.375f, -0.734375f,0.375f, -0.742188f,0.375f, -0.75f,0.375f, -0.757813f,0.375f, -0.765625f,0.375f, -0.773438f,0.375f, -0.78125f,0.375f, -0.789063f,0.375f, -0.796875f,0.375f, -0.804688f,0.375f, -0.8125f,0.375f, -0.820313f,0.375f, -0.828125f,0.375f, -0.835938f,0.375f, -0.84375f,0.375f, -0.851563f,0.375f, -0.859375f,0.375f, -0.867188f,0.375f, -0.875f,0.375f, -0.882813f,0.375f, -0.890625f,0.375f, -0.898438f,0.375f, -0.90625f,0.375f, -0.914063f,0.375f, -0.921875f,0.375f, -0.929688f,0.375f, -0.9375f,0.375f, -0.945313f,0.375f, -0.953125f,0.375f, -0.960938f,0.375f, -0.96875f,0.375f, -0.976563f,0.375f, -0.984375f,0.375f, -0.992188f,0.375f, -1.0f,0.375f, -0.507813f,0.382813f, -0.515625f,0.382813f, -0.523438f,0.382813f, -0.53125f,0.382813f, -0.539063f,0.382813f, -0.546875f,0.382813f, -0.554688f,0.382813f, -0.5625f,0.382813f, -0.570313f,0.382813f, -0.578125f,0.382813f, -0.585938f,0.382813f, -0.59375f,0.382813f, -0.601563f,0.382813f, -0.609375f,0.382813f, -0.617188f,0.382813f, -0.625f,0.382813f, -0.632813f,0.382813f, -0.640625f,0.382813f, -0.648438f,0.382813f, -0.65625f,0.382813f, -0.664063f,0.382813f, -0.671875f,0.382813f, -0.679688f,0.382813f, -0.6875f,0.382813f, -0.695313f,0.382813f, -0.703125f,0.382813f, -0.710938f,0.382813f, -0.71875f,0.382813f, -0.726563f,0.382813f, -0.734375f,0.382813f, -0.742188f,0.382813f, -0.75f,0.382813f, -0.757813f,0.382813f, -0.765625f,0.382813f, -0.773438f,0.382813f, -0.78125f,0.382813f, -0.789063f,0.382813f, -0.796875f,0.382813f, -0.804688f,0.382813f, -0.8125f,0.382813f, -0.820313f,0.382813f, -0.828125f,0.382813f, -0.835938f,0.382813f, -0.84375f,0.382813f, -0.851563f,0.382813f, -0.859375f,0.382813f, -0.867188f,0.382813f, -0.875f,0.382813f, -0.882813f,0.382813f, -0.890625f,0.382813f, -0.898438f,0.382813f, -0.90625f,0.382813f, -0.914063f,0.382813f, -0.921875f,0.382813f, -0.929688f,0.382813f, -0.9375f,0.382813f, -0.945313f,0.382813f, -0.953125f,0.382813f, -0.960938f,0.382813f, -0.96875f,0.382813f, -0.976563f,0.382813f, -0.984375f,0.382813f, -0.992188f,0.382813f, -1.0f,0.382813f, -0.507813f,0.390625f, -0.515625f,0.390625f, -0.523438f,0.390625f, -0.53125f,0.390625f, -0.539063f,0.390625f, -0.546875f,0.390625f, -0.554688f,0.390625f, -0.5625f,0.390625f, -0.570313f,0.390625f, -0.578125f,0.390625f, -0.585938f,0.390625f, -0.59375f,0.390625f, -0.601563f,0.390625f, -0.609375f,0.390625f, -0.617188f,0.390625f, -0.625f,0.390625f, -0.632813f,0.390625f, -0.640625f,0.390625f, -0.648438f,0.390625f, -0.65625f,0.390625f, -0.664063f,0.390625f, -0.671875f,0.390625f, -0.679688f,0.390625f, -0.6875f,0.390625f, -0.695313f,0.390625f, -0.703125f,0.390625f, -0.710938f,0.390625f, -0.71875f,0.390625f, -0.726563f,0.390625f, -0.734375f,0.390625f, -0.742188f,0.390625f, -0.75f,0.390625f, -0.757813f,0.390625f, -0.765625f,0.390625f, -0.773438f,0.390625f, -0.78125f,0.390625f, -0.789063f,0.390625f, -0.796875f,0.390625f, -0.804688f,0.390625f, -0.8125f,0.390625f, -0.820313f,0.390625f, -0.828125f,0.390625f, -0.835938f,0.390625f, -0.84375f,0.390625f, -0.851563f,0.390625f, -0.859375f,0.390625f, -0.867188f,0.390625f, -0.875f,0.390625f, -0.882813f,0.390625f, -0.890625f,0.390625f, -0.898438f,0.390625f, -0.90625f,0.390625f, -0.914063f,0.390625f, -0.921875f,0.390625f, -0.929688f,0.390625f, -0.9375f,0.390625f, -0.945313f,0.390625f, -0.953125f,0.390625f, -0.960938f,0.390625f, -0.96875f,0.390625f, -0.976563f,0.390625f, -0.984375f,0.390625f, -0.992188f,0.390625f, -1.0f,0.390625f, -0.507813f,0.398438f, -0.515625f,0.398438f, -0.523438f,0.398438f, -0.53125f,0.398438f, -0.539063f,0.398438f, -0.546875f,0.398438f, -0.554688f,0.398438f, -0.5625f,0.398438f, -0.570313f,0.398438f, -0.578125f,0.398438f, -0.585938f,0.398438f, -0.59375f,0.398438f, -0.601563f,0.398438f, -0.609375f,0.398438f, -0.617188f,0.398438f, -0.625f,0.398438f, -0.632813f,0.398438f, -0.640625f,0.398438f, -0.648438f,0.398438f, -0.65625f,0.398438f, -0.664063f,0.398438f, -0.671875f,0.398438f, -0.679688f,0.398438f, -0.6875f,0.398438f, -0.695313f,0.398438f, -0.703125f,0.398438f, -0.710938f,0.398438f, -0.71875f,0.398438f, -0.726563f,0.398438f, -0.734375f,0.398438f, -0.742188f,0.398438f, -0.75f,0.398438f, -0.757813f,0.398438f, -0.765625f,0.398438f, -0.773438f,0.398438f, -0.78125f,0.398438f, -0.789063f,0.398438f, -0.796875f,0.398438f, -0.804688f,0.398438f, -0.8125f,0.398438f, -0.820313f,0.398438f, -0.828125f,0.398438f, -0.835938f,0.398438f, -0.84375f,0.398438f, -0.851563f,0.398438f, -0.859375f,0.398438f, -0.867188f,0.398438f, -0.875f,0.398438f, -0.882813f,0.398438f, -0.890625f,0.398438f, -0.898438f,0.398438f, -0.90625f,0.398438f, -0.914063f,0.398438f, -0.921875f,0.398438f, -0.929688f,0.398438f, -0.9375f,0.398438f, -0.945313f,0.398438f, -0.953125f,0.398438f, -0.960938f,0.398438f, -0.96875f,0.398438f, -0.976563f,0.398438f, -0.984375f,0.398438f, -0.992188f,0.398438f, -1.0f,0.398438f, -0.507813f,0.40625f, -0.515625f,0.40625f, -0.523438f,0.40625f, -0.53125f,0.40625f, -0.539063f,0.40625f, -0.546875f,0.40625f, -0.554688f,0.40625f, -0.5625f,0.40625f, -0.570313f,0.40625f, -0.578125f,0.40625f, -0.585938f,0.40625f, -0.59375f,0.40625f, -0.601563f,0.40625f, -0.609375f,0.40625f, -0.617188f,0.40625f, -0.625f,0.40625f, -0.632813f,0.40625f, -0.640625f,0.40625f, -0.648438f,0.40625f, -0.65625f,0.40625f, -0.664063f,0.40625f, -0.671875f,0.40625f, -0.679688f,0.40625f, -0.6875f,0.40625f, -0.695313f,0.40625f, -0.703125f,0.40625f, -0.710938f,0.40625f, -0.71875f,0.40625f, -0.726563f,0.40625f, -0.734375f,0.40625f, -0.742188f,0.40625f, -0.75f,0.40625f, -0.757813f,0.40625f, -0.765625f,0.40625f, -0.773438f,0.40625f, -0.78125f,0.40625f, -0.789063f,0.40625f, -0.796875f,0.40625f, -0.804688f,0.40625f, -0.8125f,0.40625f, -0.820313f,0.40625f, -0.828125f,0.40625f, -0.835938f,0.40625f, -0.84375f,0.40625f, -0.851563f,0.40625f, -0.859375f,0.40625f, -0.867188f,0.40625f, -0.875f,0.40625f, -0.882813f,0.40625f, -0.890625f,0.40625f, -0.898438f,0.40625f, -0.90625f,0.40625f, -0.914063f,0.40625f, -0.921875f,0.40625f, -0.929688f,0.40625f, -0.9375f,0.40625f, -0.945313f,0.40625f, -0.953125f,0.40625f, -0.960938f,0.40625f, -0.96875f,0.40625f, -0.976563f,0.40625f, -0.984375f,0.40625f, -0.992188f,0.40625f, -1.0f,0.40625f, -0.507813f,0.414063f, -0.515625f,0.414063f, -0.523438f,0.414063f, -0.53125f,0.414063f, -0.539063f,0.414063f, -0.546875f,0.414063f, -0.554688f,0.414063f, -0.5625f,0.414063f, -0.570313f,0.414063f, -0.578125f,0.414063f, -0.585938f,0.414063f, -0.59375f,0.414063f, -0.601563f,0.414063f, -0.609375f,0.414063f, -0.617188f,0.414063f, -0.625f,0.414063f, -0.632813f,0.414063f, -0.640625f,0.414063f, -0.648438f,0.414063f, -0.65625f,0.414063f, -0.664063f,0.414063f, -0.671875f,0.414063f, -0.679688f,0.414063f, -0.6875f,0.414063f, -0.695313f,0.414063f, -0.703125f,0.414063f, -0.710938f,0.414063f, -0.71875f,0.414063f, -0.726563f,0.414063f, -0.734375f,0.414063f, -0.742188f,0.414063f, -0.75f,0.414063f, -0.757813f,0.414063f, -0.765625f,0.414063f, -0.773438f,0.414063f, -0.78125f,0.414063f, -0.789063f,0.414063f, -0.796875f,0.414063f, -0.804688f,0.414063f, -0.8125f,0.414063f, -0.820313f,0.414063f, -0.828125f,0.414063f, -0.835938f,0.414063f, -0.84375f,0.414063f, -0.851563f,0.414063f, -0.859375f,0.414063f, -0.867188f,0.414063f, -0.875f,0.414063f, -0.882813f,0.414063f, -0.890625f,0.414063f, -0.898438f,0.414063f, -0.90625f,0.414063f, -0.914063f,0.414063f, -0.921875f,0.414063f, -0.929688f,0.414063f, -0.9375f,0.414063f, -0.945313f,0.414063f, -0.953125f,0.414063f, -0.960938f,0.414063f, -0.96875f,0.414063f, -0.976563f,0.414063f, -0.984375f,0.414063f, -0.992188f,0.414063f, -1.0f,0.414063f, -0.507813f,0.421875f, -0.515625f,0.421875f, -0.523438f,0.421875f, -0.53125f,0.421875f, -0.539063f,0.421875f, -0.546875f,0.421875f, -0.554688f,0.421875f, -0.5625f,0.421875f, -0.570313f,0.421875f, -0.578125f,0.421875f, -0.585938f,0.421875f, -0.59375f,0.421875f, -0.601563f,0.421875f, -0.609375f,0.421875f, -0.617188f,0.421875f, -0.625f,0.421875f, -0.632813f,0.421875f, -0.640625f,0.421875f, -0.648438f,0.421875f, -0.65625f,0.421875f, -0.664063f,0.421875f, -0.671875f,0.421875f, -0.679688f,0.421875f, -0.6875f,0.421875f, -0.695313f,0.421875f, -0.703125f,0.421875f, -0.710938f,0.421875f, -0.71875f,0.421875f, -0.726563f,0.421875f, -0.734375f,0.421875f, -0.742188f,0.421875f, -0.75f,0.421875f, -0.757813f,0.421875f, -0.765625f,0.421875f, -0.773438f,0.421875f, -0.78125f,0.421875f, -0.789063f,0.421875f, -0.796875f,0.421875f, -0.804688f,0.421875f, -0.8125f,0.421875f, -0.820313f,0.421875f, -0.828125f,0.421875f, -0.835938f,0.421875f, -0.84375f,0.421875f, -0.851563f,0.421875f, -0.859375f,0.421875f, -0.867188f,0.421875f, -0.875f,0.421875f, -0.882813f,0.421875f, -0.890625f,0.421875f, -0.898438f,0.421875f, -0.90625f,0.421875f, -0.914063f,0.421875f, -0.921875f,0.421875f, -0.929688f,0.421875f, -0.9375f,0.421875f, -0.945313f,0.421875f, -0.953125f,0.421875f, -0.960938f,0.421875f, -0.96875f,0.421875f, -0.976563f,0.421875f, -0.984375f,0.421875f, -0.992188f,0.421875f, -1.0f,0.421875f, -0.507813f,0.429688f, -0.515625f,0.429688f, -0.523438f,0.429688f, -0.53125f,0.429688f, -0.539063f,0.429688f, -0.546875f,0.429688f, -0.554688f,0.429688f, -0.5625f,0.429688f, -0.570313f,0.429688f, -0.578125f,0.429688f, -0.585938f,0.429688f, -0.59375f,0.429688f, -0.601563f,0.429688f, -0.609375f,0.429688f, -0.617188f,0.429688f, -0.625f,0.429688f, -0.632813f,0.429688f, -0.640625f,0.429688f, -0.648438f,0.429688f, -0.65625f,0.429688f, -0.664063f,0.429688f, -0.671875f,0.429688f, -0.679688f,0.429688f, -0.6875f,0.429688f, -0.695313f,0.429688f, -0.703125f,0.429688f, -0.710938f,0.429688f, -0.71875f,0.429688f, -0.726563f,0.429688f, -0.734375f,0.429688f, -0.742188f,0.429688f, -0.75f,0.429688f, -0.757813f,0.429688f, -0.765625f,0.429688f, -0.773438f,0.429688f, -0.78125f,0.429688f, -0.789063f,0.429688f, -0.796875f,0.429688f, -0.804688f,0.429688f, -0.8125f,0.429688f, -0.820313f,0.429688f, -0.828125f,0.429688f, -0.835938f,0.429688f, -0.84375f,0.429688f, -0.851563f,0.429688f, -0.859375f,0.429688f, -0.867188f,0.429688f, -0.875f,0.429688f, -0.882813f,0.429688f, -0.890625f,0.429688f, -0.898438f,0.429688f, -0.90625f,0.429688f, -0.914063f,0.429688f, -0.921875f,0.429688f, -0.929688f,0.429688f, -0.9375f,0.429688f, -0.945313f,0.429688f, -0.953125f,0.429688f, -0.960938f,0.429688f, -0.96875f,0.429688f, -0.976563f,0.429688f, -0.984375f,0.429688f, -0.992188f,0.429688f, -1.0f,0.429688f, -0.507813f,0.4375f, -0.515625f,0.4375f, -0.523438f,0.4375f, -0.53125f,0.4375f, -0.539063f,0.4375f, -0.546875f,0.4375f, -0.554688f,0.4375f, -0.5625f,0.4375f, -0.570313f,0.4375f, -0.578125f,0.4375f, -0.585938f,0.4375f, -0.59375f,0.4375f, -0.601563f,0.4375f, -0.609375f,0.4375f, -0.617188f,0.4375f, -0.625f,0.4375f, -0.632813f,0.4375f, -0.640625f,0.4375f, -0.648438f,0.4375f, -0.65625f,0.4375f, -0.664063f,0.4375f, -0.671875f,0.4375f, -0.679688f,0.4375f, -0.6875f,0.4375f, -0.695313f,0.4375f, -0.703125f,0.4375f, -0.710938f,0.4375f, -0.71875f,0.4375f, -0.726563f,0.4375f, -0.734375f,0.4375f, -0.742188f,0.4375f, -0.75f,0.4375f, -0.757813f,0.4375f, -0.765625f,0.4375f, -0.773438f,0.4375f, -0.78125f,0.4375f, -0.789063f,0.4375f, -0.796875f,0.4375f, -0.804688f,0.4375f, -0.8125f,0.4375f, -0.820313f,0.4375f, -0.828125f,0.4375f, -0.835938f,0.4375f, -0.84375f,0.4375f, -0.851563f,0.4375f, -0.859375f,0.4375f, -0.867188f,0.4375f, -0.875f,0.4375f, -0.882813f,0.4375f, -0.890625f,0.4375f, -0.898438f,0.4375f, -0.90625f,0.4375f, -0.914063f,0.4375f, -0.921875f,0.4375f, -0.929688f,0.4375f, -0.9375f,0.4375f, -0.945313f,0.4375f, -0.953125f,0.4375f, -0.960938f,0.4375f, -0.96875f,0.4375f, -0.976563f,0.4375f, -0.984375f,0.4375f, -0.992188f,0.4375f, -1.0f,0.4375f, -0.507813f,0.445313f, -0.515625f,0.445313f, -0.523438f,0.445313f, -0.53125f,0.445313f, -0.539063f,0.445313f, -0.546875f,0.445313f, -0.554688f,0.445313f, -0.5625f,0.445313f, -0.570313f,0.445313f, -0.578125f,0.445313f, -0.585938f,0.445313f, -0.59375f,0.445313f, -0.601563f,0.445313f, -0.609375f,0.445313f, -0.617188f,0.445313f, -0.625f,0.445313f, -0.632813f,0.445313f, -0.640625f,0.445313f, -0.648438f,0.445313f, -0.65625f,0.445313f, -0.664063f,0.445313f, -0.671875f,0.445313f, -0.679688f,0.445313f, -0.6875f,0.445313f, -0.695313f,0.445313f, -0.703125f,0.445313f, -0.710938f,0.445313f, -0.71875f,0.445313f, -0.726563f,0.445313f, -0.734375f,0.445313f, -0.742188f,0.445313f, -0.75f,0.445313f, -0.757813f,0.445313f, -0.765625f,0.445313f, -0.773438f,0.445313f, -0.78125f,0.445313f, -0.789063f,0.445313f, -0.796875f,0.445313f, -0.804688f,0.445313f, -0.8125f,0.445313f, -0.820313f,0.445313f, -0.828125f,0.445313f, -0.835938f,0.445313f, -0.84375f,0.445313f, -0.851563f,0.445313f, -0.859375f,0.445313f, -0.867188f,0.445313f, -0.875f,0.445313f, -0.882813f,0.445313f, -0.890625f,0.445313f, -0.898438f,0.445313f, -0.90625f,0.445313f, -0.914063f,0.445313f, -0.921875f,0.445313f, -0.929688f,0.445313f, -0.9375f,0.445313f, -0.945313f,0.445313f, -0.953125f,0.445313f, -0.960938f,0.445313f, -0.96875f,0.445313f, -0.976563f,0.445313f, -0.984375f,0.445313f, -0.992188f,0.445313f, -1.0f,0.445313f, -0.507813f,0.453125f, -0.515625f,0.453125f, -0.523438f,0.453125f, -0.53125f,0.453125f, -0.539063f,0.453125f, -0.546875f,0.453125f, -0.554688f,0.453125f, -0.5625f,0.453125f, -0.570313f,0.453125f, -0.578125f,0.453125f, -0.585938f,0.453125f, -0.59375f,0.453125f, -0.601563f,0.453125f, -0.609375f,0.453125f, -0.617188f,0.453125f, -0.625f,0.453125f, -0.632813f,0.453125f, -0.640625f,0.453125f, -0.648438f,0.453125f, -0.65625f,0.453125f, -0.664063f,0.453125f, -0.671875f,0.453125f, -0.679688f,0.453125f, -0.6875f,0.453125f, -0.695313f,0.453125f, -0.703125f,0.453125f, -0.710938f,0.453125f, -0.71875f,0.453125f, -0.726563f,0.453125f, -0.734375f,0.453125f, -0.742188f,0.453125f, -0.75f,0.453125f, -0.757813f,0.453125f, -0.765625f,0.453125f, -0.773438f,0.453125f, -0.78125f,0.453125f, -0.789063f,0.453125f, -0.796875f,0.453125f, -0.804688f,0.453125f, -0.8125f,0.453125f, -0.820313f,0.453125f, -0.828125f,0.453125f, -0.835938f,0.453125f, -0.84375f,0.453125f, -0.851563f,0.453125f, -0.859375f,0.453125f, -0.867188f,0.453125f, -0.875f,0.453125f, -0.882813f,0.453125f, -0.890625f,0.453125f, -0.898438f,0.453125f, -0.90625f,0.453125f, -0.914063f,0.453125f, -0.921875f,0.453125f, -0.929688f,0.453125f, -0.9375f,0.453125f, -0.945313f,0.453125f, -0.953125f,0.453125f, -0.960938f,0.453125f, -0.96875f,0.453125f, -0.976563f,0.453125f, -0.984375f,0.453125f, -0.992188f,0.453125f, -1.0f,0.453125f, -0.507813f,0.460938f, -0.515625f,0.460938f, -0.523438f,0.460938f, -0.53125f,0.460938f, -0.539063f,0.460938f, -0.546875f,0.460938f, -0.554688f,0.460938f, -0.5625f,0.460938f, -0.570313f,0.460938f, -0.578125f,0.460938f, -0.585938f,0.460938f, -0.59375f,0.460938f, -0.601563f,0.460938f, -0.609375f,0.460938f, -0.617188f,0.460938f, -0.625f,0.460938f, -0.632813f,0.460938f, -0.640625f,0.460938f, -0.648438f,0.460938f, -0.65625f,0.460938f, -0.664063f,0.460938f, -0.671875f,0.460938f, -0.679688f,0.460938f, -0.6875f,0.460938f, -0.695313f,0.460938f, -0.703125f,0.460938f, -0.710938f,0.460938f, -0.71875f,0.460938f, -0.726563f,0.460938f, -0.734375f,0.460938f, -0.742188f,0.460938f, -0.75f,0.460938f, -0.757813f,0.460938f, -0.765625f,0.460938f, -0.773438f,0.460938f, -0.78125f,0.460938f, -0.789063f,0.460938f, -0.796875f,0.460938f, -0.804688f,0.460938f, -0.8125f,0.460938f, -0.820313f,0.460938f, -0.828125f,0.460938f, -0.835938f,0.460938f, -0.84375f,0.460938f, -0.851563f,0.460938f, -0.859375f,0.460938f, -0.867188f,0.460938f, -0.875f,0.460938f, -0.882813f,0.460938f, -0.890625f,0.460938f, -0.898438f,0.460938f, -0.90625f,0.460938f, -0.914063f,0.460938f, -0.921875f,0.460938f, -0.929688f,0.460938f, -0.9375f,0.460938f, -0.945313f,0.460938f, -0.953125f,0.460938f, -0.960938f,0.460938f, -0.96875f,0.460938f, -0.976563f,0.460938f, -0.984375f,0.460938f, -0.992188f,0.460938f, -1.0f,0.460938f, -0.507813f,0.46875f, -0.515625f,0.46875f, -0.523438f,0.46875f, -0.53125f,0.46875f, -0.539063f,0.46875f, -0.546875f,0.46875f, -0.554688f,0.46875f, -0.5625f,0.46875f, -0.570313f,0.46875f, -0.578125f,0.46875f, -0.585938f,0.46875f, -0.59375f,0.46875f, -0.601563f,0.46875f, -0.609375f,0.46875f, -0.617188f,0.46875f, -0.625f,0.46875f, -0.632813f,0.46875f, -0.640625f,0.46875f, -0.648438f,0.46875f, -0.65625f,0.46875f, -0.664063f,0.46875f, -0.671875f,0.46875f, -0.679688f,0.46875f, -0.6875f,0.46875f, -0.695313f,0.46875f, -0.703125f,0.46875f, -0.710938f,0.46875f, -0.71875f,0.46875f, -0.726563f,0.46875f, -0.734375f,0.46875f, -0.742188f,0.46875f, -0.75f,0.46875f, -0.757813f,0.46875f, -0.765625f,0.46875f, -0.773438f,0.46875f, -0.78125f,0.46875f, -0.789063f,0.46875f, -0.796875f,0.46875f, -0.804688f,0.46875f, -0.8125f,0.46875f, -0.820313f,0.46875f, -0.828125f,0.46875f, -0.835938f,0.46875f, -0.84375f,0.46875f, -0.851563f,0.46875f, -0.859375f,0.46875f, -0.867188f,0.46875f, -0.875f,0.46875f, -0.882813f,0.46875f, -0.890625f,0.46875f, -0.898438f,0.46875f, -0.90625f,0.46875f, -0.914063f,0.46875f, -0.921875f,0.46875f, -0.929688f,0.46875f, -0.9375f,0.46875f, -0.945313f,0.46875f, -0.953125f,0.46875f, -0.960938f,0.46875f, -0.96875f,0.46875f, -0.976563f,0.46875f, -0.984375f,0.46875f, -0.992188f,0.46875f, -1.0f,0.46875f, -0.507813f,0.476563f, -0.515625f,0.476563f, -0.523438f,0.476563f, -0.53125f,0.476563f, -0.539063f,0.476563f, -0.546875f,0.476563f, -0.554688f,0.476563f, -0.5625f,0.476563f, -0.570313f,0.476563f, -0.578125f,0.476563f, -0.585938f,0.476563f, -0.59375f,0.476563f, -0.601563f,0.476563f, -0.609375f,0.476563f, -0.617188f,0.476563f, -0.625f,0.476563f, -0.632813f,0.476563f, -0.640625f,0.476563f, -0.648438f,0.476563f, -0.65625f,0.476563f, -0.664063f,0.476563f, -0.671875f,0.476563f, -0.679688f,0.476563f, -0.6875f,0.476563f, -0.695313f,0.476563f, -0.703125f,0.476563f, -0.710938f,0.476563f, -0.71875f,0.476563f, -0.726563f,0.476563f, -0.734375f,0.476563f, -0.742188f,0.476563f, -0.75f,0.476563f, -0.757813f,0.476563f, -0.765625f,0.476563f, -0.773438f,0.476563f, -0.78125f,0.476563f, -0.789063f,0.476563f, -0.796875f,0.476563f, -0.804688f,0.476563f, -0.8125f,0.476563f, -0.820313f,0.476563f, -0.828125f,0.476563f, -0.835938f,0.476563f, -0.84375f,0.476563f, -0.851563f,0.476563f, -0.859375f,0.476563f, -0.867188f,0.476563f, -0.875f,0.476563f, -0.882813f,0.476563f, -0.890625f,0.476563f, -0.898438f,0.476563f, -0.90625f,0.476563f, -0.914063f,0.476563f, -0.921875f,0.476563f, -0.929688f,0.476563f, -0.9375f,0.476563f, -0.945313f,0.476563f, -0.953125f,0.476563f, -0.960938f,0.476563f, -0.96875f,0.476563f, -0.976563f,0.476563f, -0.984375f,0.476563f, -0.992188f,0.476563f, -1.0f,0.476563f, -0.507813f,0.484375f, -0.515625f,0.484375f, -0.523438f,0.484375f, -0.53125f,0.484375f, -0.539063f,0.484375f, -0.546875f,0.484375f, -0.554688f,0.484375f, -0.5625f,0.484375f, -0.570313f,0.484375f, -0.578125f,0.484375f, -0.585938f,0.484375f, -0.59375f,0.484375f, -0.601563f,0.484375f, -0.609375f,0.484375f, -0.617188f,0.484375f, -0.625f,0.484375f, -0.632813f,0.484375f, -0.640625f,0.484375f, -0.648438f,0.484375f, -0.65625f,0.484375f, -0.664063f,0.484375f, -0.671875f,0.484375f, -0.679688f,0.484375f, -0.6875f,0.484375f, -0.695313f,0.484375f, -0.703125f,0.484375f, -0.710938f,0.484375f, -0.71875f,0.484375f, -0.726563f,0.484375f, -0.734375f,0.484375f, -0.742188f,0.484375f, -0.75f,0.484375f, -0.757813f,0.484375f, -0.765625f,0.484375f, -0.773438f,0.484375f, -0.78125f,0.484375f, -0.789063f,0.484375f, -0.796875f,0.484375f, -0.804688f,0.484375f, -0.8125f,0.484375f, -0.820313f,0.484375f, -0.828125f,0.484375f, -0.835938f,0.484375f, -0.84375f,0.484375f, -0.851563f,0.484375f, -0.859375f,0.484375f, -0.867188f,0.484375f, -0.875f,0.484375f, -0.882813f,0.484375f, -0.890625f,0.484375f, -0.898438f,0.484375f, -0.90625f,0.484375f, -0.914063f,0.484375f, -0.921875f,0.484375f, -0.929688f,0.484375f, -0.9375f,0.484375f, -0.945313f,0.484375f, -0.953125f,0.484375f, -0.960938f,0.484375f, -0.96875f,0.484375f, -0.976563f,0.484375f, -0.984375f,0.484375f, -0.992188f,0.484375f, -1.0f,0.484375f, -0.507813f,0.492188f, -0.515625f,0.492188f, -0.523438f,0.492188f, -0.53125f,0.492188f, -0.539063f,0.492188f, -0.546875f,0.492188f, -0.554688f,0.492188f, -0.5625f,0.492188f, -0.570313f,0.492188f, -0.578125f,0.492188f, -0.585938f,0.492188f, -0.59375f,0.492188f, -0.601563f,0.492188f, -0.609375f,0.492188f, -0.617188f,0.492188f, -0.625f,0.492188f, -0.632813f,0.492188f, -0.640625f,0.492188f, -0.648438f,0.492188f, -0.65625f,0.492188f, -0.664063f,0.492188f, -0.671875f,0.492188f, -0.679688f,0.492188f, -0.6875f,0.492188f, -0.695313f,0.492188f, -0.703125f,0.492188f, -0.710938f,0.492188f, -0.71875f,0.492188f, -0.726563f,0.492188f, -0.734375f,0.492188f, -0.742188f,0.492188f, -0.75f,0.492188f, -0.757813f,0.492188f, -0.765625f,0.492188f, -0.773438f,0.492188f, -0.78125f,0.492188f, -0.789063f,0.492188f, -0.796875f,0.492188f, -0.804688f,0.492188f, -0.8125f,0.492188f, -0.820313f,0.492188f, -0.828125f,0.492188f, -0.835938f,0.492188f, -0.84375f,0.492188f, -0.851563f,0.492188f, -0.859375f,0.492188f, -0.867188f,0.492188f, -0.875f,0.492188f, -0.882813f,0.492188f, -0.890625f,0.492188f, -0.898438f,0.492188f, -0.90625f,0.492188f, -0.914063f,0.492188f, -0.921875f,0.492188f, -0.929688f,0.492188f, -0.9375f,0.492188f, -0.945313f,0.492188f, -0.953125f,0.492188f, -0.960938f,0.492188f, -0.96875f,0.492188f, -0.976563f,0.492188f, -0.984375f,0.492188f, -0.992188f,0.492188f, -1.0f,0.492188f, -}; - -unsigned short Landscape04Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -128,0,129, -2,129,0, -129,2,130, -4,130,2, -130,4,131, -6,131,4, -131,6,132, -8,132,6, -132,8,133, -10,133,8, -133,10,134, -12,134,10, -134,12,135, -14,135,12, -135,14,136, -16,136,14, -136,16,137, -18,137,16, -137,18,138, -20,138,18, -138,20,139, -22,139,20, -139,22,140, -24,140,22, -140,24,141, -26,141,24, -141,26,142, -28,142,26, -142,28,143, -30,143,28, -143,30,144, -32,144,30, -144,32,145, -34,145,32, -145,34,146, -36,146,34, -146,36,147, -38,147,36, -147,38,148, -40,148,38, -148,40,149, -42,149,40, -149,42,150, -44,150,42, -150,44,151, -46,151,44, -151,46,152, -48,152,46, -152,48,153, -50,153,48, -153,50,154, -52,154,50, -154,52,155, -54,155,52, -155,54,156, -56,156,54, -156,56,157, -58,157,56, -157,58,158, -60,158,58, -158,60,159, -62,159,60, -159,62,160, -64,160,62, -160,64,161, -66,161,64, -161,66,162, -68,162,66, -162,68,163, -70,163,68, -163,70,164, -72,164,70, -164,72,165, -74,165,72, -165,74,166, -76,166,74, -166,76,167, -78,167,76, -167,78,168, -80,168,78, -168,80,169, -82,169,80, -169,82,170, -84,170,82, -170,84,171, -86,171,84, -171,86,172, -88,172,86, -172,88,173, -90,173,88, -173,90,174, -92,174,90, -174,92,175, -94,175,92, -175,94,176, -96,176,94, -176,96,177, -98,177,96, -177,98,178, -100,178,98, -178,100,179, -102,179,100, -179,102,180, -104,180,102, -180,104,181, -106,181,104, -181,106,182, -108,182,106, -182,108,183, -110,183,108, -183,110,184, -112,184,110, -184,112,185, -114,185,112, -185,114,186, -116,186,114, -186,116,187, -118,187,116, -187,118,188, -120,188,118, -188,120,189, -122,189,120, -189,122,190, -124,190,122, -190,124,191, -126,191,124, -192,128,193, -129,193,128, -193,129,194, -130,194,129, -194,130,195, -131,195,130, -195,131,196, -132,196,131, -196,132,197, -133,197,132, -197,133,198, -134,198,133, -198,134,199, -135,199,134, -199,135,200, -136,200,135, -200,136,201, -137,201,136, -201,137,202, -138,202,137, -202,138,203, -139,203,138, -203,139,204, -140,204,139, -204,140,205, -141,205,140, -205,141,206, -142,206,141, -206,142,207, -143,207,142, -207,143,208, -144,208,143, -208,144,209, -145,209,144, -209,145,210, -146,210,145, -210,146,211, -147,211,146, -211,147,212, -148,212,147, -212,148,213, -149,213,148, -213,149,214, -150,214,149, -214,150,215, -151,215,150, -215,151,216, -152,216,151, -216,152,217, -153,217,152, -217,153,218, -154,218,153, -218,154,219, -155,219,154, -219,155,220, -156,220,155, -220,156,221, -157,221,156, -221,157,222, -158,222,157, -222,158,223, -159,223,158, -223,159,224, -160,224,159, -224,160,225, -161,225,160, -225,161,226, -162,226,161, -226,162,227, -163,227,162, -227,163,228, -164,228,163, -228,164,229, -165,229,164, -229,165,230, -166,230,165, -230,166,231, -167,231,166, -231,167,232, -168,232,167, -232,168,233, -169,233,168, -233,169,234, -170,234,169, -234,170,235, -171,235,170, -235,171,236, -172,236,171, -236,172,237, -173,237,172, -237,173,238, -174,238,173, -238,174,239, -175,239,174, -239,175,240, -176,240,175, -240,176,241, -177,241,176, -241,177,242, -178,242,177, -242,178,243, -179,243,178, -243,179,244, -180,244,179, -244,180,245, -181,245,180, -245,181,246, -182,246,181, -246,182,247, -183,247,182, -247,183,248, -184,248,183, -248,184,249, -185,249,184, -249,185,250, -186,250,185, -250,186,251, -187,251,186, -251,187,252, -188,252,187, -252,188,253, -189,253,188, -253,189,254, -190,254,189, -254,190,255, -191,255,190, -256,192,257, -193,257,192, -257,193,258, -194,258,193, -258,194,259, -195,259,194, -259,195,260, -196,260,195, -260,196,261, -197,261,196, -261,197,262, -198,262,197, -262,198,263, -199,263,198, -263,199,264, -200,264,199, -264,200,265, -201,265,200, -265,201,266, -202,266,201, -266,202,267, -203,267,202, -267,203,268, -204,268,203, -268,204,269, -205,269,204, -269,205,270, -206,270,205, -270,206,271, -207,271,206, -271,207,272, -208,272,207, -272,208,273, -209,273,208, -273,209,274, -210,274,209, -274,210,275, -211,275,210, -275,211,276, -212,276,211, -276,212,277, -213,277,212, -277,213,278, -214,278,213, -278,214,279, -215,279,214, -279,215,280, -216,280,215, -280,216,281, -217,281,216, -281,217,282, -218,282,217, -282,218,283, -219,283,218, -283,219,284, -220,284,219, -284,220,285, -221,285,220, -285,221,286, -222,286,221, -286,222,287, -223,287,222, -287,223,288, -224,288,223, -288,224,289, -225,289,224, -289,225,290, -226,290,225, -290,226,291, -227,291,226, -291,227,292, -228,292,227, -292,228,293, -229,293,228, -293,229,294, -230,294,229, -294,230,295, -231,295,230, -295,231,296, -232,296,231, -296,232,297, -233,297,232, -297,233,298, -234,298,233, -298,234,299, -235,299,234, -299,235,300, -236,300,235, -300,236,301, -237,301,236, -301,237,302, -238,302,237, -302,238,303, -239,303,238, -303,239,304, -240,304,239, -304,240,305, -241,305,240, -305,241,306, -242,306,241, -306,242,307, -243,307,242, -307,243,308, -244,308,243, -308,244,309, -245,309,244, -309,245,310, -246,310,245, -310,246,311, -247,311,246, -311,247,312, -248,312,247, -312,248,313, -249,313,248, -313,249,314, -250,314,249, -314,250,315, -251,315,250, -315,251,316, -252,316,251, -316,252,317, -253,317,252, -317,253,318, -254,318,253, -318,254,319, -255,319,254, -320,256,321, -257,321,256, -321,257,322, -258,322,257, -322,258,323, -259,323,258, -323,259,324, -260,324,259, -324,260,325, -261,325,260, -325,261,326, -262,326,261, -326,262,327, -263,327,262, -327,263,328, -264,328,263, -328,264,329, -265,329,264, -329,265,330, -266,330,265, -330,266,331, -267,331,266, -331,267,332, -268,332,267, -332,268,333, -269,333,268, -333,269,334, -270,334,269, -334,270,335, -271,335,270, -335,271,336, -272,336,271, -336,272,337, -273,337,272, -337,273,338, -274,338,273, -338,274,339, -275,339,274, -339,275,340, -276,340,275, -340,276,341, -277,341,276, -341,277,342, -278,342,277, -342,278,343, -279,343,278, -343,279,344, -280,344,279, -344,280,345, -281,345,280, -345,281,346, -282,346,281, -346,282,347, -283,347,282, -347,283,348, -284,348,283, -348,284,349, -285,349,284, -349,285,350, -286,350,285, -350,286,351, -287,351,286, -351,287,352, -288,352,287, -352,288,353, -289,353,288, -353,289,354, -290,354,289, -354,290,355, -291,355,290, -355,291,356, -292,356,291, -356,292,357, -293,357,292, -357,293,358, -294,358,293, -358,294,359, -295,359,294, -359,295,360, -296,360,295, -360,296,361, -297,361,296, -361,297,362, -298,362,297, -362,298,363, -299,363,298, -363,299,364, -300,364,299, -364,300,365, -301,365,300, -365,301,366, -302,366,301, -366,302,367, -303,367,302, -367,303,368, -304,368,303, -368,304,369, -305,369,304, -369,305,370, -306,370,305, -370,306,371, -307,371,306, -371,307,372, -308,372,307, -372,308,373, -309,373,308, -373,309,374, -310,374,309, -374,310,375, -311,375,310, -375,311,376, -312,376,311, -376,312,377, -313,377,312, -377,313,378, -314,378,313, -378,314,379, -315,379,314, -379,315,380, -316,380,315, -380,316,381, -317,381,316, -381,317,382, -318,382,317, -382,318,383, -319,383,318, -384,320,385, -321,385,320, -385,321,386, -322,386,321, -386,322,387, -323,387,322, -387,323,388, -324,388,323, -388,324,389, -325,389,324, -389,325,390, -326,390,325, -390,326,391, -327,391,326, -391,327,392, -328,392,327, -392,328,393, -329,393,328, -393,329,394, -330,394,329, -394,330,395, -331,395,330, -395,331,396, -332,396,331, -396,332,397, -333,397,332, -397,333,398, -334,398,333, -398,334,399, -335,399,334, -399,335,400, -336,400,335, -400,336,401, -337,401,336, -401,337,402, -338,402,337, -402,338,403, -339,403,338, -403,339,404, -340,404,339, -404,340,405, -341,405,340, -405,341,406, -342,406,341, -406,342,407, -343,407,342, -407,343,408, -344,408,343, -408,344,409, -345,409,344, -409,345,410, -346,410,345, -410,346,411, -347,411,346, -411,347,412, -348,412,347, -412,348,413, -349,413,348, -413,349,414, -350,414,349, -414,350,415, -351,415,350, -415,351,416, -352,416,351, -416,352,417, -353,417,352, -417,353,418, -354,418,353, -418,354,419, -355,419,354, -419,355,420, -356,420,355, -420,356,421, -357,421,356, -421,357,422, -358,422,357, -422,358,423, -359,423,358, -423,359,424, -360,424,359, -424,360,425, -361,425,360, -425,361,426, -362,426,361, -426,362,427, -363,427,362, -427,363,428, -364,428,363, -428,364,429, -365,429,364, -429,365,430, -366,430,365, -430,366,431, -367,431,366, -431,367,432, -368,432,367, -432,368,433, -369,433,368, -433,369,434, -370,434,369, -434,370,435, -371,435,370, -435,371,436, -372,436,371, -436,372,437, -373,437,372, -437,373,438, -374,438,373, -438,374,439, -375,439,374, -439,375,440, -376,440,375, -440,376,441, -377,441,376, -441,377,442, -378,442,377, -442,378,443, -379,443,378, -443,379,444, -380,444,379, -444,380,445, -381,445,380, -445,381,446, -382,446,381, -446,382,447, -383,447,382, -448,384,449, -385,449,384, -449,385,450, -386,450,385, -450,386,451, -387,451,386, -451,387,452, -388,452,387, -452,388,453, -389,453,388, -453,389,454, -390,454,389, -454,390,455, -391,455,390, -455,391,456, -392,456,391, -456,392,457, -393,457,392, -457,393,458, -394,458,393, -458,394,459, -395,459,394, -459,395,460, -396,460,395, -460,396,461, -397,461,396, -461,397,462, -398,462,397, -462,398,463, -399,463,398, -463,399,464, -400,464,399, -464,400,465, -401,465,400, -465,401,466, -402,466,401, -466,402,467, -403,467,402, -467,403,468, -404,468,403, -468,404,469, -405,469,404, -469,405,470, -406,470,405, -470,406,471, -407,471,406, -471,407,472, -408,472,407, -472,408,473, -409,473,408, -473,409,474, -410,474,409, -474,410,475, -411,475,410, -475,411,476, -412,476,411, -476,412,477, -413,477,412, -477,413,478, -414,478,413, -478,414,479, -415,479,414, -479,415,480, -416,480,415, -480,416,481, -417,481,416, -481,417,482, -418,482,417, -482,418,483, -419,483,418, -483,419,484, -420,484,419, -484,420,485, -421,485,420, -485,421,486, -422,486,421, -486,422,487, -423,487,422, -487,423,488, -424,488,423, -488,424,489, -425,489,424, -489,425,490, -426,490,425, -490,426,491, -427,491,426, -491,427,492, -428,492,427, -492,428,493, -429,493,428, -493,429,494, -430,494,429, -494,430,495, -431,495,430, -495,431,496, -432,496,431, -496,432,497, -433,497,432, -497,433,498, -434,498,433, -498,434,499, -435,499,434, -499,435,500, -436,500,435, -500,436,501, -437,501,436, -501,437,502, -438,502,437, -502,438,503, -439,503,438, -503,439,504, -440,504,439, -504,440,505, -441,505,440, -505,441,506, -442,506,441, -506,442,507, -443,507,442, -507,443,508, -444,508,443, -508,444,509, -445,509,444, -509,445,510, -446,510,445, -510,446,511, -447,511,446, -512,448,513, -449,513,448, -513,449,514, -450,514,449, -514,450,515, -451,515,450, -515,451,516, -452,516,451, -516,452,517, -453,517,452, -517,453,518, -454,518,453, -518,454,519, -455,519,454, -519,455,520, -456,520,455, -520,456,521, -457,521,456, -521,457,522, -458,522,457, -522,458,523, -459,523,458, -523,459,524, -460,524,459, -524,460,525, -461,525,460, -525,461,526, -462,526,461, -526,462,527, -463,527,462, -527,463,528, -464,528,463, -528,464,529, -465,529,464, -529,465,530, -466,530,465, -530,466,531, -467,531,466, -531,467,532, -468,532,467, -532,468,533, -469,533,468, -533,469,534, -470,534,469, -534,470,535, -471,535,470, -535,471,536, -472,536,471, -536,472,537, -473,537,472, -537,473,538, -474,538,473, -538,474,539, -475,539,474, -539,475,540, -476,540,475, -540,476,541, -477,541,476, -541,477,542, -478,542,477, -542,478,543, -479,543,478, -543,479,544, -480,544,479, -544,480,545, -481,545,480, -545,481,546, -482,546,481, -546,482,547, -483,547,482, -547,483,548, -484,548,483, -548,484,549, -485,549,484, -549,485,550, -486,550,485, -550,486,551, -487,551,486, -551,487,552, -488,552,487, -552,488,553, -489,553,488, -553,489,554, -490,554,489, -554,490,555, -491,555,490, -555,491,556, -492,556,491, -556,492,557, -493,557,492, -557,493,558, -494,558,493, -558,494,559, -495,559,494, -559,495,560, -496,560,495, -560,496,561, -497,561,496, -561,497,562, -498,562,497, -562,498,563, -499,563,498, -563,499,564, -500,564,499, -564,500,565, -501,565,500, -565,501,566, -502,566,501, -566,502,567, -503,567,502, -567,503,568, -504,568,503, -568,504,569, -505,569,504, -569,505,570, -506,570,505, -570,506,571, -507,571,506, -571,507,572, -508,572,507, -572,508,573, -509,573,508, -573,509,574, -510,574,509, -574,510,575, -511,575,510, -576,512,577, -513,577,512, -577,513,578, -514,578,513, -578,514,579, -515,579,514, -579,515,580, -516,580,515, -580,516,581, -517,581,516, -581,517,582, -518,582,517, -582,518,583, -519,583,518, -583,519,584, -520,584,519, -584,520,585, -521,585,520, -585,521,586, -522,586,521, -586,522,587, -523,587,522, -587,523,588, -524,588,523, -588,524,589, -525,589,524, -589,525,590, -526,590,525, -590,526,591, -527,591,526, -591,527,592, -528,592,527, -592,528,593, -529,593,528, -593,529,594, -530,594,529, -594,530,595, -531,595,530, -595,531,596, -532,596,531, -596,532,597, -533,597,532, -597,533,598, -534,598,533, -598,534,599, -535,599,534, -599,535,600, -536,600,535, -600,536,601, -537,601,536, -601,537,602, -538,602,537, -602,538,603, -539,603,538, -603,539,604, -540,604,539, -604,540,605, -541,605,540, -605,541,606, -542,606,541, -606,542,607, -543,607,542, -607,543,608, -544,608,543, -608,544,609, -545,609,544, -609,545,610, -546,610,545, -610,546,611, -547,611,546, -611,547,612, -548,612,547, -612,548,613, -549,613,548, -613,549,614, -550,614,549, -614,550,615, -551,615,550, -615,551,616, -552,616,551, -616,552,617, -553,617,552, -617,553,618, -554,618,553, -618,554,619, -555,619,554, -619,555,620, -556,620,555, -620,556,621, -557,621,556, -621,557,622, -558,622,557, -622,558,623, -559,623,558, -623,559,624, -560,624,559, -624,560,625, -561,625,560, -625,561,626, -562,626,561, -626,562,627, -563,627,562, -627,563,628, -564,628,563, -628,564,629, -565,629,564, -629,565,630, -566,630,565, -630,566,631, -567,631,566, -631,567,632, -568,632,567, -632,568,633, -569,633,568, -633,569,634, -570,634,569, -634,570,635, -571,635,570, -635,571,636, -572,636,571, -636,572,637, -573,637,572, -637,573,638, -574,638,573, -638,574,639, -575,639,574, -640,576,641, -577,641,576, -641,577,642, -578,642,577, -642,578,643, -579,643,578, -643,579,644, -580,644,579, -644,580,645, -581,645,580, -645,581,646, -582,646,581, -646,582,647, -583,647,582, -647,583,648, -584,648,583, -648,584,649, -585,649,584, -649,585,650, -586,650,585, -650,586,651, -587,651,586, -651,587,652, -588,652,587, -652,588,653, -589,653,588, -653,589,654, -590,654,589, -654,590,655, -591,655,590, -655,591,656, -592,656,591, -656,592,657, -593,657,592, -657,593,658, -594,658,593, -658,594,659, -595,659,594, -659,595,660, -596,660,595, -660,596,661, -597,661,596, -661,597,662, -598,662,597, -662,598,663, -599,663,598, -663,599,664, -600,664,599, -664,600,665, -601,665,600, -665,601,666, -602,666,601, -666,602,667, -603,667,602, -667,603,668, -604,668,603, -668,604,669, -605,669,604, -669,605,670, -606,670,605, -670,606,671, -607,671,606, -671,607,672, -608,672,607, -672,608,673, -609,673,608, -673,609,674, -610,674,609, -674,610,675, -611,675,610, -675,611,676, -612,676,611, -676,612,677, -613,677,612, -677,613,678, -614,678,613, -678,614,679, -615,679,614, -679,615,680, -616,680,615, -680,616,681, -617,681,616, -681,617,682, -618,682,617, -682,618,683, -619,683,618, -683,619,684, -620,684,619, -684,620,685, -621,685,620, -685,621,686, -622,686,621, -686,622,687, -623,687,622, -687,623,688, -624,688,623, -688,624,689, -625,689,624, -689,625,690, -626,690,625, -690,626,691, -627,691,626, -691,627,692, -628,692,627, -692,628,693, -629,693,628, -693,629,694, -630,694,629, -694,630,695, -631,695,630, -695,631,696, -632,696,631, -696,632,697, -633,697,632, -697,633,698, -634,698,633, -698,634,699, -635,699,634, -699,635,700, -636,700,635, -700,636,701, -637,701,636, -701,637,702, -638,702,637, -702,638,703, -639,703,638, -704,640,705, -641,705,640, -705,641,706, -642,706,641, -706,642,707, -643,707,642, -707,643,708, -644,708,643, -708,644,709, -645,709,644, -709,645,710, -646,710,645, -710,646,711, -647,711,646, -711,647,712, -648,712,647, -712,648,713, -649,713,648, -713,649,714, -650,714,649, -714,650,715, -651,715,650, -715,651,716, -652,716,651, -716,652,717, -653,717,652, -717,653,718, -654,718,653, -718,654,719, -655,719,654, -719,655,720, -656,720,655, -720,656,721, -657,721,656, -721,657,722, -658,722,657, -722,658,723, -659,723,658, -723,659,724, -660,724,659, -724,660,725, -661,725,660, -725,661,726, -662,726,661, -726,662,727, -663,727,662, -727,663,728, -664,728,663, -728,664,729, -665,729,664, -729,665,730, -666,730,665, -730,666,731, -667,731,666, -731,667,732, -668,732,667, -732,668,733, -669,733,668, -733,669,734, -670,734,669, -734,670,735, -671,735,670, -735,671,736, -672,736,671, -736,672,737, -673,737,672, -737,673,738, -674,738,673, -738,674,739, -675,739,674, -739,675,740, -676,740,675, -740,676,741, -677,741,676, -741,677,742, -678,742,677, -742,678,743, -679,743,678, -743,679,744, -680,744,679, -744,680,745, -681,745,680, -745,681,746, -682,746,681, -746,682,747, -683,747,682, -747,683,748, -684,748,683, -748,684,749, -685,749,684, -749,685,750, -686,750,685, -750,686,751, -687,751,686, -751,687,752, -688,752,687, -752,688,753, -689,753,688, -753,689,754, -690,754,689, -754,690,755, -691,755,690, -755,691,756, -692,756,691, -756,692,757, -693,757,692, -757,693,758, -694,758,693, -758,694,759, -695,759,694, -759,695,760, -696,760,695, -760,696,761, -697,761,696, -761,697,762, -698,762,697, -762,698,763, -699,763,698, -763,699,764, -700,764,699, -764,700,765, -701,765,700, -765,701,766, -702,766,701, -766,702,767, -703,767,702, -768,704,769, -705,769,704, -769,705,770, -706,770,705, -770,706,771, -707,771,706, -771,707,772, -708,772,707, -772,708,773, -709,773,708, -773,709,774, -710,774,709, -774,710,775, -711,775,710, -775,711,776, -712,776,711, -776,712,777, -713,777,712, -777,713,778, -714,778,713, -778,714,779, -715,779,714, -779,715,780, -716,780,715, -780,716,781, -717,781,716, -781,717,782, -718,782,717, -782,718,783, -719,783,718, -783,719,784, -720,784,719, -784,720,785, -721,785,720, -785,721,786, -722,786,721, -786,722,787, -723,787,722, -787,723,788, -724,788,723, -788,724,789, -725,789,724, -789,725,790, -726,790,725, -790,726,791, -727,791,726, -791,727,792, -728,792,727, -792,728,793, -729,793,728, -793,729,794, -730,794,729, -794,730,795, -731,795,730, -795,731,796, -732,796,731, -796,732,797, -733,797,732, -797,733,798, -734,798,733, -798,734,799, -735,799,734, -799,735,800, -736,800,735, -800,736,801, -737,801,736, -801,737,802, -738,802,737, -802,738,803, -739,803,738, -803,739,804, -740,804,739, -804,740,805, -741,805,740, -805,741,806, -742,806,741, -806,742,807, -743,807,742, -807,743,808, -744,808,743, -808,744,809, -745,809,744, -809,745,810, -746,810,745, -810,746,811, -747,811,746, -811,747,812, -748,812,747, -812,748,813, -749,813,748, -813,749,814, -750,814,749, -814,750,815, -751,815,750, -815,751,816, -752,816,751, -816,752,817, -753,817,752, -817,753,818, -754,818,753, -818,754,819, -755,819,754, -819,755,820, -756,820,755, -820,756,821, -757,821,756, -821,757,822, -758,822,757, -822,758,823, -759,823,758, -823,759,824, -760,824,759, -824,760,825, -761,825,760, -825,761,826, -762,826,761, -826,762,827, -763,827,762, -827,763,828, -764,828,763, -828,764,829, -765,829,764, -829,765,830, -766,830,765, -830,766,831, -767,831,766, -832,768,833, -769,833,768, -833,769,834, -770,834,769, -834,770,835, -771,835,770, -835,771,836, -772,836,771, -836,772,837, -773,837,772, -837,773,838, -774,838,773, -838,774,839, -775,839,774, -839,775,840, -776,840,775, -840,776,841, -777,841,776, -841,777,842, -778,842,777, -842,778,843, -779,843,778, -843,779,844, -780,844,779, -844,780,845, -781,845,780, -845,781,846, -782,846,781, -846,782,847, -783,847,782, -847,783,848, -784,848,783, -848,784,849, -785,849,784, -849,785,850, -786,850,785, -850,786,851, -787,851,786, -851,787,852, -788,852,787, -852,788,853, -789,853,788, -853,789,854, -790,854,789, -854,790,855, -791,855,790, -855,791,856, -792,856,791, -856,792,857, -793,857,792, -857,793,858, -794,858,793, -858,794,859, -795,859,794, -859,795,860, -796,860,795, -860,796,861, -797,861,796, -861,797,862, -798,862,797, -862,798,863, -799,863,798, -863,799,864, -800,864,799, -864,800,865, -801,865,800, -865,801,866, -802,866,801, -866,802,867, -803,867,802, -867,803,868, -804,868,803, -868,804,869, -805,869,804, -869,805,870, -806,870,805, -870,806,871, -807,871,806, -871,807,872, -808,872,807, -872,808,873, -809,873,808, -873,809,874, -810,874,809, -874,810,875, -811,875,810, -875,811,876, -812,876,811, -876,812,877, -813,877,812, -877,813,878, -814,878,813, -878,814,879, -815,879,814, -879,815,880, -816,880,815, -880,816,881, -817,881,816, -881,817,882, -818,882,817, -882,818,883, -819,883,818, -883,819,884, -820,884,819, -884,820,885, -821,885,820, -885,821,886, -822,886,821, -886,822,887, -823,887,822, -887,823,888, -824,888,823, -888,824,889, -825,889,824, -889,825,890, -826,890,825, -890,826,891, -827,891,826, -891,827,892, -828,892,827, -892,828,893, -829,893,828, -893,829,894, -830,894,829, -894,830,895, -831,895,830, -896,832,897, -833,897,832, -897,833,898, -834,898,833, -898,834,899, -835,899,834, -899,835,900, -836,900,835, -900,836,901, -837,901,836, -901,837,902, -838,902,837, -902,838,903, -839,903,838, -903,839,904, -840,904,839, -904,840,905, -841,905,840, -905,841,906, -842,906,841, -906,842,907, -843,907,842, -907,843,908, -844,908,843, -908,844,909, -845,909,844, -909,845,910, -846,910,845, -910,846,911, -847,911,846, -911,847,912, -848,912,847, -912,848,913, -849,913,848, -913,849,914, -850,914,849, -914,850,915, -851,915,850, -915,851,916, -852,916,851, -916,852,917, -853,917,852, -917,853,918, -854,918,853, -918,854,919, -855,919,854, -919,855,920, -856,920,855, -920,856,921, -857,921,856, -921,857,922, -858,922,857, -922,858,923, -859,923,858, -923,859,924, -860,924,859, -924,860,925, -861,925,860, -925,861,926, -862,926,861, -926,862,927, -863,927,862, -927,863,928, -864,928,863, -928,864,929, -865,929,864, -929,865,930, -866,930,865, -930,866,931, -867,931,866, -931,867,932, -868,932,867, -932,868,933, -869,933,868, -933,869,934, -870,934,869, -934,870,935, -871,935,870, -935,871,936, -872,936,871, -936,872,937, -873,937,872, -937,873,938, -874,938,873, -938,874,939, -875,939,874, -939,875,940, -876,940,875, -940,876,941, -877,941,876, -941,877,942, -878,942,877, -942,878,943, -879,943,878, -943,879,944, -880,944,879, -944,880,945, -881,945,880, -945,881,946, -882,946,881, -946,882,947, -883,947,882, -947,883,948, -884,948,883, -948,884,949, -885,949,884, -949,885,950, -886,950,885, -950,886,951, -887,951,886, -951,887,952, -888,952,887, -952,888,953, -889,953,888, -953,889,954, -890,954,889, -954,890,955, -891,955,890, -955,891,956, -892,956,891, -956,892,957, -893,957,892, -957,893,958, -894,958,893, -958,894,959, -895,959,894, -960,896,961, -897,961,896, -961,897,962, -898,962,897, -962,898,963, -899,963,898, -963,899,964, -900,964,899, -964,900,965, -901,965,900, -965,901,966, -902,966,901, -966,902,967, -903,967,902, -967,903,968, -904,968,903, -968,904,969, -905,969,904, -969,905,970, -906,970,905, -970,906,971, -907,971,906, -971,907,972, -908,972,907, -972,908,973, -909,973,908, -973,909,974, -910,974,909, -974,910,975, -911,975,910, -975,911,976, -912,976,911, -976,912,977, -913,977,912, -977,913,978, -914,978,913, -978,914,979, -915,979,914, -979,915,980, -916,980,915, -980,916,981, -917,981,916, -981,917,982, -918,982,917, -982,918,983, -919,983,918, -983,919,984, -920,984,919, -984,920,985, -921,985,920, -985,921,986, -922,986,921, -986,922,987, -923,987,922, -987,923,988, -924,988,923, -988,924,989, -925,989,924, -989,925,990, -926,990,925, -990,926,991, -927,991,926, -991,927,992, -928,992,927, -992,928,993, -929,993,928, -993,929,994, -930,994,929, -994,930,995, -931,995,930, -995,931,996, -932,996,931, -996,932,997, -933,997,932, -997,933,998, -934,998,933, -998,934,999, -935,999,934, -999,935,1000, -936,1000,935, -1000,936,1001, -937,1001,936, -1001,937,1002, -938,1002,937, -1002,938,1003, -939,1003,938, -1003,939,1004, -940,1004,939, -1004,940,1005, -941,1005,940, -1005,941,1006, -942,1006,941, -1006,942,1007, -943,1007,942, -1007,943,1008, -944,1008,943, -1008,944,1009, -945,1009,944, -1009,945,1010, -946,1010,945, -1010,946,1011, -947,1011,946, -1011,947,1012, -948,1012,947, -1012,948,1013, -949,1013,948, -1013,949,1014, -950,1014,949, -1014,950,1015, -951,1015,950, -1015,951,1016, -952,1016,951, -1016,952,1017, -953,1017,952, -1017,953,1018, -954,1018,953, -1018,954,1019, -955,1019,954, -1019,955,1020, -956,1020,955, -1020,956,1021, -957,1021,956, -1021,957,1022, -958,1022,957, -1022,958,1023, -959,1023,958, -1024,960,1025, -961,1025,960, -1025,961,1026, -962,1026,961, -1026,962,1027, -963,1027,962, -1027,963,1028, -964,1028,963, -1028,964,1029, -965,1029,964, -1029,965,1030, -966,1030,965, -1030,966,1031, -967,1031,966, -1031,967,1032, -968,1032,967, -1032,968,1033, -969,1033,968, -1033,969,1034, -970,1034,969, -1034,970,1035, -971,1035,970, -1035,971,1036, -972,1036,971, -1036,972,1037, -973,1037,972, -1037,973,1038, -974,1038,973, -1038,974,1039, -975,1039,974, -1039,975,1040, -976,1040,975, -1040,976,1041, -977,1041,976, -1041,977,1042, -978,1042,977, -1042,978,1043, -979,1043,978, -1043,979,1044, -980,1044,979, -1044,980,1045, -981,1045,980, -1045,981,1046, -982,1046,981, -1046,982,1047, -983,1047,982, -1047,983,1048, -984,1048,983, -1048,984,1049, -985,1049,984, -1049,985,1050, -986,1050,985, -1050,986,1051, -987,1051,986, -1051,987,1052, -988,1052,987, -1052,988,1053, -989,1053,988, -1053,989,1054, -990,1054,989, -1054,990,1055, -991,1055,990, -1055,991,1056, -992,1056,991, -1056,992,1057, -993,1057,992, -1057,993,1058, -994,1058,993, -1058,994,1059, -995,1059,994, -1059,995,1060, -996,1060,995, -1060,996,1061, -997,1061,996, -1061,997,1062, -998,1062,997, -1062,998,1063, -999,1063,998, -1063,999,1064, -1000,1064,999, -1064,1000,1065, -1001,1065,1000, -1065,1001,1066, -1002,1066,1001, -1066,1002,1067, -1003,1067,1002, -1067,1003,1068, -1004,1068,1003, -1068,1004,1069, -1005,1069,1004, -1069,1005,1070, -1006,1070,1005, -1070,1006,1071, -1007,1071,1006, -1071,1007,1072, -1008,1072,1007, -1072,1008,1073, -1009,1073,1008, -1073,1009,1074, -1010,1074,1009, -1074,1010,1075, -1011,1075,1010, -1075,1011,1076, -1012,1076,1011, -1076,1012,1077, -1013,1077,1012, -1077,1013,1078, -1014,1078,1013, -1078,1014,1079, -1015,1079,1014, -1079,1015,1080, -1016,1080,1015, -1080,1016,1081, -1017,1081,1016, -1081,1017,1082, -1018,1082,1017, -1082,1018,1083, -1019,1083,1018, -1083,1019,1084, -1020,1084,1019, -1084,1020,1085, -1021,1085,1020, -1085,1021,1086, -1022,1086,1021, -1086,1022,1087, -1023,1087,1022, -1088,1024,1089, -1025,1089,1024, -1089,1025,1090, -1026,1090,1025, -1090,1026,1091, -1027,1091,1026, -1091,1027,1092, -1028,1092,1027, -1092,1028,1093, -1029,1093,1028, -1093,1029,1094, -1030,1094,1029, -1094,1030,1095, -1031,1095,1030, -1095,1031,1096, -1032,1096,1031, -1096,1032,1097, -1033,1097,1032, -1097,1033,1098, -1034,1098,1033, -1098,1034,1099, -1035,1099,1034, -1099,1035,1100, -1036,1100,1035, -1100,1036,1101, -1037,1101,1036, -1101,1037,1102, -1038,1102,1037, -1102,1038,1103, -1039,1103,1038, -1103,1039,1104, -1040,1104,1039, -1104,1040,1105, -1041,1105,1040, -1105,1041,1106, -1042,1106,1041, -1106,1042,1107, -1043,1107,1042, -1107,1043,1108, -1044,1108,1043, -1108,1044,1109, -1045,1109,1044, -1109,1045,1110, -1046,1110,1045, -1110,1046,1111, -1047,1111,1046, -1111,1047,1112, -1048,1112,1047, -1112,1048,1113, -1049,1113,1048, -1113,1049,1114, -1050,1114,1049, -1114,1050,1115, -1051,1115,1050, -1115,1051,1116, -1052,1116,1051, -1116,1052,1117, -1053,1117,1052, -1117,1053,1118, -1054,1118,1053, -1118,1054,1119, -1055,1119,1054, -1119,1055,1120, -1056,1120,1055, -1120,1056,1121, -1057,1121,1056, -1121,1057,1122, -1058,1122,1057, -1122,1058,1123, -1059,1123,1058, -1123,1059,1124, -1060,1124,1059, -1124,1060,1125, -1061,1125,1060, -1125,1061,1126, -1062,1126,1061, -1126,1062,1127, -1063,1127,1062, -1127,1063,1128, -1064,1128,1063, -1128,1064,1129, -1065,1129,1064, -1129,1065,1130, -1066,1130,1065, -1130,1066,1131, -1067,1131,1066, -1131,1067,1132, -1068,1132,1067, -1132,1068,1133, -1069,1133,1068, -1133,1069,1134, -1070,1134,1069, -1134,1070,1135, -1071,1135,1070, -1135,1071,1136, -1072,1136,1071, -1136,1072,1137, -1073,1137,1072, -1137,1073,1138, -1074,1138,1073, -1138,1074,1139, -1075,1139,1074, -1139,1075,1140, -1076,1140,1075, -1140,1076,1141, -1077,1141,1076, -1141,1077,1142, -1078,1142,1077, -1142,1078,1143, -1079,1143,1078, -1143,1079,1144, -1080,1144,1079, -1144,1080,1145, -1081,1145,1080, -1145,1081,1146, -1082,1146,1081, -1146,1082,1147, -1083,1147,1082, -1147,1083,1148, -1084,1148,1083, -1148,1084,1149, -1085,1149,1084, -1149,1085,1150, -1086,1150,1085, -1150,1086,1151, -1087,1151,1086, -1152,1088,1153, -1089,1153,1088, -1153,1089,1154, -1090,1154,1089, -1154,1090,1155, -1091,1155,1090, -1155,1091,1156, -1092,1156,1091, -1156,1092,1157, -1093,1157,1092, -1157,1093,1158, -1094,1158,1093, -1158,1094,1159, -1095,1159,1094, -1159,1095,1160, -1096,1160,1095, -1160,1096,1161, -1097,1161,1096, -1161,1097,1162, -1098,1162,1097, -1162,1098,1163, -1099,1163,1098, -1163,1099,1164, -1100,1164,1099, -1164,1100,1165, -1101,1165,1100, -1165,1101,1166, -1102,1166,1101, -1166,1102,1167, -1103,1167,1102, -1167,1103,1168, -1104,1168,1103, -1168,1104,1169, -1105,1169,1104, -1169,1105,1170, -1106,1170,1105, -1170,1106,1171, -1107,1171,1106, -1171,1107,1172, -1108,1172,1107, -1172,1108,1173, -1109,1173,1108, -1173,1109,1174, -1110,1174,1109, -1174,1110,1175, -1111,1175,1110, -1175,1111,1176, -1112,1176,1111, -1176,1112,1177, -1113,1177,1112, -1177,1113,1178, -1114,1178,1113, -1178,1114,1179, -1115,1179,1114, -1179,1115,1180, -1116,1180,1115, -1180,1116,1181, -1117,1181,1116, -1181,1117,1182, -1118,1182,1117, -1182,1118,1183, -1119,1183,1118, -1183,1119,1184, -1120,1184,1119, -1184,1120,1185, -1121,1185,1120, -1185,1121,1186, -1122,1186,1121, -1186,1122,1187, -1123,1187,1122, -1187,1123,1188, -1124,1188,1123, -1188,1124,1189, -1125,1189,1124, -1189,1125,1190, -1126,1190,1125, -1190,1126,1191, -1127,1191,1126, -1191,1127,1192, -1128,1192,1127, -1192,1128,1193, -1129,1193,1128, -1193,1129,1194, -1130,1194,1129, -1194,1130,1195, -1131,1195,1130, -1195,1131,1196, -1132,1196,1131, -1196,1132,1197, -1133,1197,1132, -1197,1133,1198, -1134,1198,1133, -1198,1134,1199, -1135,1199,1134, -1199,1135,1200, -1136,1200,1135, -1200,1136,1201, -1137,1201,1136, -1201,1137,1202, -1138,1202,1137, -1202,1138,1203, -1139,1203,1138, -1203,1139,1204, -1140,1204,1139, -1204,1140,1205, -1141,1205,1140, -1205,1141,1206, -1142,1206,1141, -1206,1142,1207, -1143,1207,1142, -1207,1143,1208, -1144,1208,1143, -1208,1144,1209, -1145,1209,1144, -1209,1145,1210, -1146,1210,1145, -1210,1146,1211, -1147,1211,1146, -1211,1147,1212, -1148,1212,1147, -1212,1148,1213, -1149,1213,1148, -1213,1149,1214, -1150,1214,1149, -1214,1150,1215, -1151,1215,1150, -1216,1152,1217, -1153,1217,1152, -1217,1153,1218, -1154,1218,1153, -1218,1154,1219, -1155,1219,1154, -1219,1155,1220, -1156,1220,1155, -1220,1156,1221, -1157,1221,1156, -1221,1157,1222, -1158,1222,1157, -1222,1158,1223, -1159,1223,1158, -1223,1159,1224, -1160,1224,1159, -1224,1160,1225, -1161,1225,1160, -1225,1161,1226, -1162,1226,1161, -1226,1162,1227, -1163,1227,1162, -1227,1163,1228, -1164,1228,1163, -1228,1164,1229, -1165,1229,1164, -1229,1165,1230, -1166,1230,1165, -1230,1166,1231, -1167,1231,1166, -1231,1167,1232, -1168,1232,1167, -1232,1168,1233, -1169,1233,1168, -1233,1169,1234, -1170,1234,1169, -1234,1170,1235, -1171,1235,1170, -1235,1171,1236, -1172,1236,1171, -1236,1172,1237, -1173,1237,1172, -1237,1173,1238, -1174,1238,1173, -1238,1174,1239, -1175,1239,1174, -1239,1175,1240, -1176,1240,1175, -1240,1176,1241, -1177,1241,1176, -1241,1177,1242, -1178,1242,1177, -1242,1178,1243, -1179,1243,1178, -1243,1179,1244, -1180,1244,1179, -1244,1180,1245, -1181,1245,1180, -1245,1181,1246, -1182,1246,1181, -1246,1182,1247, -1183,1247,1182, -1247,1183,1248, -1184,1248,1183, -1248,1184,1249, -1185,1249,1184, -1249,1185,1250, -1186,1250,1185, -1250,1186,1251, -1187,1251,1186, -1251,1187,1252, -1188,1252,1187, -1252,1188,1253, -1189,1253,1188, -1253,1189,1254, -1190,1254,1189, -1254,1190,1255, -1191,1255,1190, -1255,1191,1256, -1192,1256,1191, -1256,1192,1257, -1193,1257,1192, -1257,1193,1258, -1194,1258,1193, -1258,1194,1259, -1195,1259,1194, -1259,1195,1260, -1196,1260,1195, -1260,1196,1261, -1197,1261,1196, -1261,1197,1262, -1198,1262,1197, -1262,1198,1263, -1199,1263,1198, -1263,1199,1264, -1200,1264,1199, -1264,1200,1265, -1201,1265,1200, -1265,1201,1266, -1202,1266,1201, -1266,1202,1267, -1203,1267,1202, -1267,1203,1268, -1204,1268,1203, -1268,1204,1269, -1205,1269,1204, -1269,1205,1270, -1206,1270,1205, -1270,1206,1271, -1207,1271,1206, -1271,1207,1272, -1208,1272,1207, -1272,1208,1273, -1209,1273,1208, -1273,1209,1274, -1210,1274,1209, -1274,1210,1275, -1211,1275,1210, -1275,1211,1276, -1212,1276,1211, -1276,1212,1277, -1213,1277,1212, -1277,1213,1278, -1214,1278,1213, -1278,1214,1279, -1215,1279,1214, -1280,1216,1281, -1217,1281,1216, -1281,1217,1282, -1218,1282,1217, -1282,1218,1283, -1219,1283,1218, -1283,1219,1284, -1220,1284,1219, -1284,1220,1285, -1221,1285,1220, -1285,1221,1286, -1222,1286,1221, -1286,1222,1287, -1223,1287,1222, -1287,1223,1288, -1224,1288,1223, -1288,1224,1289, -1225,1289,1224, -1289,1225,1290, -1226,1290,1225, -1290,1226,1291, -1227,1291,1226, -1291,1227,1292, -1228,1292,1227, -1292,1228,1293, -1229,1293,1228, -1293,1229,1294, -1230,1294,1229, -1294,1230,1295, -1231,1295,1230, -1295,1231,1296, -1232,1296,1231, -1296,1232,1297, -1233,1297,1232, -1297,1233,1298, -1234,1298,1233, -1298,1234,1299, -1235,1299,1234, -1299,1235,1300, -1236,1300,1235, -1300,1236,1301, -1237,1301,1236, -1301,1237,1302, -1238,1302,1237, -1302,1238,1303, -1239,1303,1238, -1303,1239,1304, -1240,1304,1239, -1304,1240,1305, -1241,1305,1240, -1305,1241,1306, -1242,1306,1241, -1306,1242,1307, -1243,1307,1242, -1307,1243,1308, -1244,1308,1243, -1308,1244,1309, -1245,1309,1244, -1309,1245,1310, -1246,1310,1245, -1310,1246,1311, -1247,1311,1246, -1311,1247,1312, -1248,1312,1247, -1312,1248,1313, -1249,1313,1248, -1313,1249,1314, -1250,1314,1249, -1314,1250,1315, -1251,1315,1250, -1315,1251,1316, -1252,1316,1251, -1316,1252,1317, -1253,1317,1252, -1317,1253,1318, -1254,1318,1253, -1318,1254,1319, -1255,1319,1254, -1319,1255,1320, -1256,1320,1255, -1320,1256,1321, -1257,1321,1256, -1321,1257,1322, -1258,1322,1257, -1322,1258,1323, -1259,1323,1258, -1323,1259,1324, -1260,1324,1259, -1324,1260,1325, -1261,1325,1260, -1325,1261,1326, -1262,1326,1261, -1326,1262,1327, -1263,1327,1262, -1327,1263,1328, -1264,1328,1263, -1328,1264,1329, -1265,1329,1264, -1329,1265,1330, -1266,1330,1265, -1330,1266,1331, -1267,1331,1266, -1331,1267,1332, -1268,1332,1267, -1332,1268,1333, -1269,1333,1268, -1333,1269,1334, -1270,1334,1269, -1334,1270,1335, -1271,1335,1270, -1335,1271,1336, -1272,1336,1271, -1336,1272,1337, -1273,1337,1272, -1337,1273,1338, -1274,1338,1273, -1338,1274,1339, -1275,1339,1274, -1339,1275,1340, -1276,1340,1275, -1340,1276,1341, -1277,1341,1276, -1341,1277,1342, -1278,1342,1277, -1342,1278,1343, -1279,1343,1278, -1344,1280,1345, -1281,1345,1280, -1345,1281,1346, -1282,1346,1281, -1346,1282,1347, -1283,1347,1282, -1347,1283,1348, -1284,1348,1283, -1348,1284,1349, -1285,1349,1284, -1349,1285,1350, -1286,1350,1285, -1350,1286,1351, -1287,1351,1286, -1351,1287,1352, -1288,1352,1287, -1352,1288,1353, -1289,1353,1288, -1353,1289,1354, -1290,1354,1289, -1354,1290,1355, -1291,1355,1290, -1355,1291,1356, -1292,1356,1291, -1356,1292,1357, -1293,1357,1292, -1357,1293,1358, -1294,1358,1293, -1358,1294,1359, -1295,1359,1294, -1359,1295,1360, -1296,1360,1295, -1360,1296,1361, -1297,1361,1296, -1361,1297,1362, -1298,1362,1297, -1362,1298,1363, -1299,1363,1298, -1363,1299,1364, -1300,1364,1299, -1364,1300,1365, -1301,1365,1300, -1365,1301,1366, -1302,1366,1301, -1366,1302,1367, -1303,1367,1302, -1367,1303,1368, -1304,1368,1303, -1368,1304,1369, -1305,1369,1304, -1369,1305,1370, -1306,1370,1305, -1370,1306,1371, -1307,1371,1306, -1371,1307,1372, -1308,1372,1307, -1372,1308,1373, -1309,1373,1308, -1373,1309,1374, -1310,1374,1309, -1374,1310,1375, -1311,1375,1310, -1375,1311,1376, -1312,1376,1311, -1376,1312,1377, -1313,1377,1312, -1377,1313,1378, -1314,1378,1313, -1378,1314,1379, -1315,1379,1314, -1379,1315,1380, -1316,1380,1315, -1380,1316,1381, -1317,1381,1316, -1381,1317,1382, -1318,1382,1317, -1382,1318,1383, -1319,1383,1318, -1383,1319,1384, -1320,1384,1319, -1384,1320,1385, -1321,1385,1320, -1385,1321,1386, -1322,1386,1321, -1386,1322,1387, -1323,1387,1322, -1387,1323,1388, -1324,1388,1323, -1388,1324,1389, -1325,1389,1324, -1389,1325,1390, -1326,1390,1325, -1390,1326,1391, -1327,1391,1326, -1391,1327,1392, -1328,1392,1327, -1392,1328,1393, -1329,1393,1328, -1393,1329,1394, -1330,1394,1329, -1394,1330,1395, -1331,1395,1330, -1395,1331,1396, -1332,1396,1331, -1396,1332,1397, -1333,1397,1332, -1397,1333,1398, -1334,1398,1333, -1398,1334,1399, -1335,1399,1334, -1399,1335,1400, -1336,1400,1335, -1400,1336,1401, -1337,1401,1336, -1401,1337,1402, -1338,1402,1337, -1402,1338,1403, -1339,1403,1338, -1403,1339,1404, -1340,1404,1339, -1404,1340,1405, -1341,1405,1340, -1405,1341,1406, -1342,1406,1341, -1406,1342,1407, -1343,1407,1342, -1408,1344,1409, -1345,1409,1344, -1409,1345,1410, -1346,1410,1345, -1410,1346,1411, -1347,1411,1346, -1411,1347,1412, -1348,1412,1347, -1412,1348,1413, -1349,1413,1348, -1413,1349,1414, -1350,1414,1349, -1414,1350,1415, -1351,1415,1350, -1415,1351,1416, -1352,1416,1351, -1416,1352,1417, -1353,1417,1352, -1417,1353,1418, -1354,1418,1353, -1418,1354,1419, -1355,1419,1354, -1419,1355,1420, -1356,1420,1355, -1420,1356,1421, -1357,1421,1356, -1421,1357,1422, -1358,1422,1357, -1422,1358,1423, -1359,1423,1358, -1423,1359,1424, -1360,1424,1359, -1424,1360,1425, -1361,1425,1360, -1425,1361,1426, -1362,1426,1361, -1426,1362,1427, -1363,1427,1362, -1427,1363,1428, -1364,1428,1363, -1428,1364,1429, -1365,1429,1364, -1429,1365,1430, -1366,1430,1365, -1430,1366,1431, -1367,1431,1366, -1431,1367,1432, -1368,1432,1367, -1432,1368,1433, -1369,1433,1368, -1433,1369,1434, -1370,1434,1369, -1434,1370,1435, -1371,1435,1370, -1435,1371,1436, -1372,1436,1371, -1436,1372,1437, -1373,1437,1372, -1437,1373,1438, -1374,1438,1373, -1438,1374,1439, -1375,1439,1374, -1439,1375,1440, -1376,1440,1375, -1440,1376,1441, -1377,1441,1376, -1441,1377,1442, -1378,1442,1377, -1442,1378,1443, -1379,1443,1378, -1443,1379,1444, -1380,1444,1379, -1444,1380,1445, -1381,1445,1380, -1445,1381,1446, -1382,1446,1381, -1446,1382,1447, -1383,1447,1382, -1447,1383,1448, -1384,1448,1383, -1448,1384,1449, -1385,1449,1384, -1449,1385,1450, -1386,1450,1385, -1450,1386,1451, -1387,1451,1386, -1451,1387,1452, -1388,1452,1387, -1452,1388,1453, -1389,1453,1388, -1453,1389,1454, -1390,1454,1389, -1454,1390,1455, -1391,1455,1390, -1455,1391,1456, -1392,1456,1391, -1456,1392,1457, -1393,1457,1392, -1457,1393,1458, -1394,1458,1393, -1458,1394,1459, -1395,1459,1394, -1459,1395,1460, -1396,1460,1395, -1460,1396,1461, -1397,1461,1396, -1461,1397,1462, -1398,1462,1397, -1462,1398,1463, -1399,1463,1398, -1463,1399,1464, -1400,1464,1399, -1464,1400,1465, -1401,1465,1400, -1465,1401,1466, -1402,1466,1401, -1466,1402,1467, -1403,1467,1402, -1467,1403,1468, -1404,1468,1403, -1468,1404,1469, -1405,1469,1404, -1469,1405,1470, -1406,1470,1405, -1470,1406,1471, -1407,1471,1406, -1472,1408,1473, -1409,1473,1408, -1473,1409,1474, -1410,1474,1409, -1474,1410,1475, -1411,1475,1410, -1475,1411,1476, -1412,1476,1411, -1476,1412,1477, -1413,1477,1412, -1477,1413,1478, -1414,1478,1413, -1478,1414,1479, -1415,1479,1414, -1479,1415,1480, -1416,1480,1415, -1480,1416,1481, -1417,1481,1416, -1481,1417,1482, -1418,1482,1417, -1482,1418,1483, -1419,1483,1418, -1483,1419,1484, -1420,1484,1419, -1484,1420,1485, -1421,1485,1420, -1485,1421,1486, -1422,1486,1421, -1486,1422,1487, -1423,1487,1422, -1487,1423,1488, -1424,1488,1423, -1488,1424,1489, -1425,1489,1424, -1489,1425,1490, -1426,1490,1425, -1490,1426,1491, -1427,1491,1426, -1491,1427,1492, -1428,1492,1427, -1492,1428,1493, -1429,1493,1428, -1493,1429,1494, -1430,1494,1429, -1494,1430,1495, -1431,1495,1430, -1495,1431,1496, -1432,1496,1431, -1496,1432,1497, -1433,1497,1432, -1497,1433,1498, -1434,1498,1433, -1498,1434,1499, -1435,1499,1434, -1499,1435,1500, -1436,1500,1435, -1500,1436,1501, -1437,1501,1436, -1501,1437,1502, -1438,1502,1437, -1502,1438,1503, -1439,1503,1438, -1503,1439,1504, -1440,1504,1439, -1504,1440,1505, -1441,1505,1440, -1505,1441,1506, -1442,1506,1441, -1506,1442,1507, -1443,1507,1442, -1507,1443,1508, -1444,1508,1443, -1508,1444,1509, -1445,1509,1444, -1509,1445,1510, -1446,1510,1445, -1510,1446,1511, -1447,1511,1446, -1511,1447,1512, -1448,1512,1447, -1512,1448,1513, -1449,1513,1448, -1513,1449,1514, -1450,1514,1449, -1514,1450,1515, -1451,1515,1450, -1515,1451,1516, -1452,1516,1451, -1516,1452,1517, -1453,1517,1452, -1517,1453,1518, -1454,1518,1453, -1518,1454,1519, -1455,1519,1454, -1519,1455,1520, -1456,1520,1455, -1520,1456,1521, -1457,1521,1456, -1521,1457,1522, -1458,1522,1457, -1522,1458,1523, -1459,1523,1458, -1523,1459,1524, -1460,1524,1459, -1524,1460,1525, -1461,1525,1460, -1525,1461,1526, -1462,1526,1461, -1526,1462,1527, -1463,1527,1462, -1527,1463,1528, -1464,1528,1463, -1528,1464,1529, -1465,1529,1464, -1529,1465,1530, -1466,1530,1465, -1530,1466,1531, -1467,1531,1466, -1531,1467,1532, -1468,1532,1467, -1532,1468,1533, -1469,1533,1468, -1533,1469,1534, -1470,1534,1469, -1534,1470,1535, -1471,1535,1470, -1536,1472,1537, -1473,1537,1472, -1537,1473,1538, -1474,1538,1473, -1538,1474,1539, -1475,1539,1474, -1539,1475,1540, -1476,1540,1475, -1540,1476,1541, -1477,1541,1476, -1541,1477,1542, -1478,1542,1477, -1542,1478,1543, -1479,1543,1478, -1543,1479,1544, -1480,1544,1479, -1544,1480,1545, -1481,1545,1480, -1545,1481,1546, -1482,1546,1481, -1546,1482,1547, -1483,1547,1482, -1547,1483,1548, -1484,1548,1483, -1548,1484,1549, -1485,1549,1484, -1549,1485,1550, -1486,1550,1485, -1550,1486,1551, -1487,1551,1486, -1551,1487,1552, -1488,1552,1487, -1552,1488,1553, -1489,1553,1488, -1553,1489,1554, -1490,1554,1489, -1554,1490,1555, -1491,1555,1490, -1555,1491,1556, -1492,1556,1491, -1556,1492,1557, -1493,1557,1492, -1557,1493,1558, -1494,1558,1493, -1558,1494,1559, -1495,1559,1494, -1559,1495,1560, -1496,1560,1495, -1560,1496,1561, -1497,1561,1496, -1561,1497,1562, -1498,1562,1497, -1562,1498,1563, -1499,1563,1498, -1563,1499,1564, -1500,1564,1499, -1564,1500,1565, -1501,1565,1500, -1565,1501,1566, -1502,1566,1501, -1566,1502,1567, -1503,1567,1502, -1567,1503,1568, -1504,1568,1503, -1568,1504,1569, -1505,1569,1504, -1569,1505,1570, -1506,1570,1505, -1570,1506,1571, -1507,1571,1506, -1571,1507,1572, -1508,1572,1507, -1572,1508,1573, -1509,1573,1508, -1573,1509,1574, -1510,1574,1509, -1574,1510,1575, -1511,1575,1510, -1575,1511,1576, -1512,1576,1511, -1576,1512,1577, -1513,1577,1512, -1577,1513,1578, -1514,1578,1513, -1578,1514,1579, -1515,1579,1514, -1579,1515,1580, -1516,1580,1515, -1580,1516,1581, -1517,1581,1516, -1581,1517,1582, -1518,1582,1517, -1582,1518,1583, -1519,1583,1518, -1583,1519,1584, -1520,1584,1519, -1584,1520,1585, -1521,1585,1520, -1585,1521,1586, -1522,1586,1521, -1586,1522,1587, -1523,1587,1522, -1587,1523,1588, -1524,1588,1523, -1588,1524,1589, -1525,1589,1524, -1589,1525,1590, -1526,1590,1525, -1590,1526,1591, -1527,1591,1526, -1591,1527,1592, -1528,1592,1527, -1592,1528,1593, -1529,1593,1528, -1593,1529,1594, -1530,1594,1529, -1594,1530,1595, -1531,1595,1530, -1595,1531,1596, -1532,1596,1531, -1596,1532,1597, -1533,1597,1532, -1597,1533,1598, -1534,1598,1533, -1598,1534,1599, -1535,1599,1534, -1600,1536,1601, -1537,1601,1536, -1601,1537,1602, -1538,1602,1537, -1602,1538,1603, -1539,1603,1538, -1603,1539,1604, -1540,1604,1539, -1604,1540,1605, -1541,1605,1540, -1605,1541,1606, -1542,1606,1541, -1606,1542,1607, -1543,1607,1542, -1607,1543,1608, -1544,1608,1543, -1608,1544,1609, -1545,1609,1544, -1609,1545,1610, -1546,1610,1545, -1610,1546,1611, -1547,1611,1546, -1611,1547,1612, -1548,1612,1547, -1612,1548,1613, -1549,1613,1548, -1613,1549,1614, -1550,1614,1549, -1614,1550,1615, -1551,1615,1550, -1615,1551,1616, -1552,1616,1551, -1616,1552,1617, -1553,1617,1552, -1617,1553,1618, -1554,1618,1553, -1618,1554,1619, -1555,1619,1554, -1619,1555,1620, -1556,1620,1555, -1620,1556,1621, -1557,1621,1556, -1621,1557,1622, -1558,1622,1557, -1622,1558,1623, -1559,1623,1558, -1623,1559,1624, -1560,1624,1559, -1624,1560,1625, -1561,1625,1560, -1625,1561,1626, -1562,1626,1561, -1626,1562,1627, -1563,1627,1562, -1627,1563,1628, -1564,1628,1563, -1628,1564,1629, -1565,1629,1564, -1629,1565,1630, -1566,1630,1565, -1630,1566,1631, -1567,1631,1566, -1631,1567,1632, -1568,1632,1567, -1632,1568,1633, -1569,1633,1568, -1633,1569,1634, -1570,1634,1569, -1634,1570,1635, -1571,1635,1570, -1635,1571,1636, -1572,1636,1571, -1636,1572,1637, -1573,1637,1572, -1637,1573,1638, -1574,1638,1573, -1638,1574,1639, -1575,1639,1574, -1639,1575,1640, -1576,1640,1575, -1640,1576,1641, -1577,1641,1576, -1641,1577,1642, -1578,1642,1577, -1642,1578,1643, -1579,1643,1578, -1643,1579,1644, -1580,1644,1579, -1644,1580,1645, -1581,1645,1580, -1645,1581,1646, -1582,1646,1581, -1646,1582,1647, -1583,1647,1582, -1647,1583,1648, -1584,1648,1583, -1648,1584,1649, -1585,1649,1584, -1649,1585,1650, -1586,1650,1585, -1650,1586,1651, -1587,1651,1586, -1651,1587,1652, -1588,1652,1587, -1652,1588,1653, -1589,1653,1588, -1653,1589,1654, -1590,1654,1589, -1654,1590,1655, -1591,1655,1590, -1655,1591,1656, -1592,1656,1591, -1656,1592,1657, -1593,1657,1592, -1657,1593,1658, -1594,1658,1593, -1658,1594,1659, -1595,1659,1594, -1659,1595,1660, -1596,1660,1595, -1660,1596,1661, -1597,1661,1596, -1661,1597,1662, -1598,1662,1597, -1662,1598,1663, -1599,1663,1598, -1664,1600,1665, -1601,1665,1600, -1665,1601,1666, -1602,1666,1601, -1666,1602,1667, -1603,1667,1602, -1667,1603,1668, -1604,1668,1603, -1668,1604,1669, -1605,1669,1604, -1669,1605,1670, -1606,1670,1605, -1670,1606,1671, -1607,1671,1606, -1671,1607,1672, -1608,1672,1607, -1672,1608,1673, -1609,1673,1608, -1673,1609,1674, -1610,1674,1609, -1674,1610,1675, -1611,1675,1610, -1675,1611,1676, -1612,1676,1611, -1676,1612,1677, -1613,1677,1612, -1677,1613,1678, -1614,1678,1613, -1678,1614,1679, -1615,1679,1614, -1679,1615,1680, -1616,1680,1615, -1680,1616,1681, -1617,1681,1616, -1681,1617,1682, -1618,1682,1617, -1682,1618,1683, -1619,1683,1618, -1683,1619,1684, -1620,1684,1619, -1684,1620,1685, -1621,1685,1620, -1685,1621,1686, -1622,1686,1621, -1686,1622,1687, -1623,1687,1622, -1687,1623,1688, -1624,1688,1623, -1688,1624,1689, -1625,1689,1624, -1689,1625,1690, -1626,1690,1625, -1690,1626,1691, -1627,1691,1626, -1691,1627,1692, -1628,1692,1627, -1692,1628,1693, -1629,1693,1628, -1693,1629,1694, -1630,1694,1629, -1694,1630,1695, -1631,1695,1630, -1695,1631,1696, -1632,1696,1631, -1696,1632,1697, -1633,1697,1632, -1697,1633,1698, -1634,1698,1633, -1698,1634,1699, -1635,1699,1634, -1699,1635,1700, -1636,1700,1635, -1700,1636,1701, -1637,1701,1636, -1701,1637,1702, -1638,1702,1637, -1702,1638,1703, -1639,1703,1638, -1703,1639,1704, -1640,1704,1639, -1704,1640,1705, -1641,1705,1640, -1705,1641,1706, -1642,1706,1641, -1706,1642,1707, -1643,1707,1642, -1707,1643,1708, -1644,1708,1643, -1708,1644,1709, -1645,1709,1644, -1709,1645,1710, -1646,1710,1645, -1710,1646,1711, -1647,1711,1646, -1711,1647,1712, -1648,1712,1647, -1712,1648,1713, -1649,1713,1648, -1713,1649,1714, -1650,1714,1649, -1714,1650,1715, -1651,1715,1650, -1715,1651,1716, -1652,1716,1651, -1716,1652,1717, -1653,1717,1652, -1717,1653,1718, -1654,1718,1653, -1718,1654,1719, -1655,1719,1654, -1719,1655,1720, -1656,1720,1655, -1720,1656,1721, -1657,1721,1656, -1721,1657,1722, -1658,1722,1657, -1722,1658,1723, -1659,1723,1658, -1723,1659,1724, -1660,1724,1659, -1724,1660,1725, -1661,1725,1660, -1725,1661,1726, -1662,1726,1661, -1726,1662,1727, -1663,1727,1662, -1728,1664,1729, -1665,1729,1664, -1729,1665,1730, -1666,1730,1665, -1730,1666,1731, -1667,1731,1666, -1731,1667,1732, -1668,1732,1667, -1732,1668,1733, -1669,1733,1668, -1733,1669,1734, -1670,1734,1669, -1734,1670,1735, -1671,1735,1670, -1735,1671,1736, -1672,1736,1671, -1736,1672,1737, -1673,1737,1672, -1737,1673,1738, -1674,1738,1673, -1738,1674,1739, -1675,1739,1674, -1739,1675,1740, -1676,1740,1675, -1740,1676,1741, -1677,1741,1676, -1741,1677,1742, -1678,1742,1677, -1742,1678,1743, -1679,1743,1678, -1743,1679,1744, -1680,1744,1679, -1744,1680,1745, -1681,1745,1680, -1745,1681,1746, -1682,1746,1681, -1746,1682,1747, -1683,1747,1682, -1747,1683,1748, -1684,1748,1683, -1748,1684,1749, -1685,1749,1684, -1749,1685,1750, -1686,1750,1685, -1750,1686,1751, -1687,1751,1686, -1751,1687,1752, -1688,1752,1687, -1752,1688,1753, -1689,1753,1688, -1753,1689,1754, -1690,1754,1689, -1754,1690,1755, -1691,1755,1690, -1755,1691,1756, -1692,1756,1691, -1756,1692,1757, -1693,1757,1692, -1757,1693,1758, -1694,1758,1693, -1758,1694,1759, -1695,1759,1694, -1759,1695,1760, -1696,1760,1695, -1760,1696,1761, -1697,1761,1696, -1761,1697,1762, -1698,1762,1697, -1762,1698,1763, -1699,1763,1698, -1763,1699,1764, -1700,1764,1699, -1764,1700,1765, -1701,1765,1700, -1765,1701,1766, -1702,1766,1701, -1766,1702,1767, -1703,1767,1702, -1767,1703,1768, -1704,1768,1703, -1768,1704,1769, -1705,1769,1704, -1769,1705,1770, -1706,1770,1705, -1770,1706,1771, -1707,1771,1706, -1771,1707,1772, -1708,1772,1707, -1772,1708,1773, -1709,1773,1708, -1773,1709,1774, -1710,1774,1709, -1774,1710,1775, -1711,1775,1710, -1775,1711,1776, -1712,1776,1711, -1776,1712,1777, -1713,1777,1712, -1777,1713,1778, -1714,1778,1713, -1778,1714,1779, -1715,1779,1714, -1779,1715,1780, -1716,1780,1715, -1780,1716,1781, -1717,1781,1716, -1781,1717,1782, -1718,1782,1717, -1782,1718,1783, -1719,1783,1718, -1783,1719,1784, -1720,1784,1719, -1784,1720,1785, -1721,1785,1720, -1785,1721,1786, -1722,1786,1721, -1786,1722,1787, -1723,1787,1722, -1787,1723,1788, -1724,1788,1723, -1788,1724,1789, -1725,1789,1724, -1789,1725,1790, -1726,1790,1725, -1790,1726,1791, -1727,1791,1726, -1792,1728,1793, -1729,1793,1728, -1793,1729,1794, -1730,1794,1729, -1794,1730,1795, -1731,1795,1730, -1795,1731,1796, -1732,1796,1731, -1796,1732,1797, -1733,1797,1732, -1797,1733,1798, -1734,1798,1733, -1798,1734,1799, -1735,1799,1734, -1799,1735,1800, -1736,1800,1735, -1800,1736,1801, -1737,1801,1736, -1801,1737,1802, -1738,1802,1737, -1802,1738,1803, -1739,1803,1738, -1803,1739,1804, -1740,1804,1739, -1804,1740,1805, -1741,1805,1740, -1805,1741,1806, -1742,1806,1741, -1806,1742,1807, -1743,1807,1742, -1807,1743,1808, -1744,1808,1743, -1808,1744,1809, -1745,1809,1744, -1809,1745,1810, -1746,1810,1745, -1810,1746,1811, -1747,1811,1746, -1811,1747,1812, -1748,1812,1747, -1812,1748,1813, -1749,1813,1748, -1813,1749,1814, -1750,1814,1749, -1814,1750,1815, -1751,1815,1750, -1815,1751,1816, -1752,1816,1751, -1816,1752,1817, -1753,1817,1752, -1817,1753,1818, -1754,1818,1753, -1818,1754,1819, -1755,1819,1754, -1819,1755,1820, -1756,1820,1755, -1820,1756,1821, -1757,1821,1756, -1821,1757,1822, -1758,1822,1757, -1822,1758,1823, -1759,1823,1758, -1823,1759,1824, -1760,1824,1759, -1824,1760,1825, -1761,1825,1760, -1825,1761,1826, -1762,1826,1761, -1826,1762,1827, -1763,1827,1762, -1827,1763,1828, -1764,1828,1763, -1828,1764,1829, -1765,1829,1764, -1829,1765,1830, -1766,1830,1765, -1830,1766,1831, -1767,1831,1766, -1831,1767,1832, -1768,1832,1767, -1832,1768,1833, -1769,1833,1768, -1833,1769,1834, -1770,1834,1769, -1834,1770,1835, -1771,1835,1770, -1835,1771,1836, -1772,1836,1771, -1836,1772,1837, -1773,1837,1772, -1837,1773,1838, -1774,1838,1773, -1838,1774,1839, -1775,1839,1774, -1839,1775,1840, -1776,1840,1775, -1840,1776,1841, -1777,1841,1776, -1841,1777,1842, -1778,1842,1777, -1842,1778,1843, -1779,1843,1778, -1843,1779,1844, -1780,1844,1779, -1844,1780,1845, -1781,1845,1780, -1845,1781,1846, -1782,1846,1781, -1846,1782,1847, -1783,1847,1782, -1847,1783,1848, -1784,1848,1783, -1848,1784,1849, -1785,1849,1784, -1849,1785,1850, -1786,1850,1785, -1850,1786,1851, -1787,1851,1786, -1851,1787,1852, -1788,1852,1787, -1852,1788,1853, -1789,1853,1788, -1853,1789,1854, -1790,1854,1789, -1854,1790,1855, -1791,1855,1790, -1856,1792,1857, -1793,1857,1792, -1857,1793,1858, -1794,1858,1793, -1858,1794,1859, -1795,1859,1794, -1859,1795,1860, -1796,1860,1795, -1860,1796,1861, -1797,1861,1796, -1861,1797,1862, -1798,1862,1797, -1862,1798,1863, -1799,1863,1798, -1863,1799,1864, -1800,1864,1799, -1864,1800,1865, -1801,1865,1800, -1865,1801,1866, -1802,1866,1801, -1866,1802,1867, -1803,1867,1802, -1867,1803,1868, -1804,1868,1803, -1868,1804,1869, -1805,1869,1804, -1869,1805,1870, -1806,1870,1805, -1870,1806,1871, -1807,1871,1806, -1871,1807,1872, -1808,1872,1807, -1872,1808,1873, -1809,1873,1808, -1873,1809,1874, -1810,1874,1809, -1874,1810,1875, -1811,1875,1810, -1875,1811,1876, -1812,1876,1811, -1876,1812,1877, -1813,1877,1812, -1877,1813,1878, -1814,1878,1813, -1878,1814,1879, -1815,1879,1814, -1879,1815,1880, -1816,1880,1815, -1880,1816,1881, -1817,1881,1816, -1881,1817,1882, -1818,1882,1817, -1882,1818,1883, -1819,1883,1818, -1883,1819,1884, -1820,1884,1819, -1884,1820,1885, -1821,1885,1820, -1885,1821,1886, -1822,1886,1821, -1886,1822,1887, -1823,1887,1822, -1887,1823,1888, -1824,1888,1823, -1888,1824,1889, -1825,1889,1824, -1889,1825,1890, -1826,1890,1825, -1890,1826,1891, -1827,1891,1826, -1891,1827,1892, -1828,1892,1827, -1892,1828,1893, -1829,1893,1828, -1893,1829,1894, -1830,1894,1829, -1894,1830,1895, -1831,1895,1830, -1895,1831,1896, -1832,1896,1831, -1896,1832,1897, -1833,1897,1832, -1897,1833,1898, -1834,1898,1833, -1898,1834,1899, -1835,1899,1834, -1899,1835,1900, -1836,1900,1835, -1900,1836,1901, -1837,1901,1836, -1901,1837,1902, -1838,1902,1837, -1902,1838,1903, -1839,1903,1838, -1903,1839,1904, -1840,1904,1839, -1904,1840,1905, -1841,1905,1840, -1905,1841,1906, -1842,1906,1841, -1906,1842,1907, -1843,1907,1842, -1907,1843,1908, -1844,1908,1843, -1908,1844,1909, -1845,1909,1844, -1909,1845,1910, -1846,1910,1845, -1910,1846,1911, -1847,1911,1846, -1911,1847,1912, -1848,1912,1847, -1912,1848,1913, -1849,1913,1848, -1913,1849,1914, -1850,1914,1849, -1914,1850,1915, -1851,1915,1850, -1915,1851,1916, -1852,1916,1851, -1916,1852,1917, -1853,1917,1852, -1917,1853,1918, -1854,1918,1853, -1918,1854,1919, -1855,1919,1854, -1920,1856,1921, -1857,1921,1856, -1921,1857,1922, -1858,1922,1857, -1922,1858,1923, -1859,1923,1858, -1923,1859,1924, -1860,1924,1859, -1924,1860,1925, -1861,1925,1860, -1925,1861,1926, -1862,1926,1861, -1926,1862,1927, -1863,1927,1862, -1927,1863,1928, -1864,1928,1863, -1928,1864,1929, -1865,1929,1864, -1929,1865,1930, -1866,1930,1865, -1930,1866,1931, -1867,1931,1866, -1931,1867,1932, -1868,1932,1867, -1932,1868,1933, -1869,1933,1868, -1933,1869,1934, -1870,1934,1869, -1934,1870,1935, -1871,1935,1870, -1935,1871,1936, -1872,1936,1871, -1936,1872,1937, -1873,1937,1872, -1937,1873,1938, -1874,1938,1873, -1938,1874,1939, -1875,1939,1874, -1939,1875,1940, -1876,1940,1875, -1940,1876,1941, -1877,1941,1876, -1941,1877,1942, -1878,1942,1877, -1942,1878,1943, -1879,1943,1878, -1943,1879,1944, -1880,1944,1879, -1944,1880,1945, -1881,1945,1880, -1945,1881,1946, -1882,1946,1881, -1946,1882,1947, -1883,1947,1882, -1947,1883,1948, -1884,1948,1883, -1948,1884,1949, -1885,1949,1884, -1949,1885,1950, -1886,1950,1885, -1950,1886,1951, -1887,1951,1886, -1951,1887,1952, -1888,1952,1887, -1952,1888,1953, -1889,1953,1888, -1953,1889,1954, -1890,1954,1889, -1954,1890,1955, -1891,1955,1890, -1955,1891,1956, -1892,1956,1891, -1956,1892,1957, -1893,1957,1892, -1957,1893,1958, -1894,1958,1893, -1958,1894,1959, -1895,1959,1894, -1959,1895,1960, -1896,1960,1895, -1960,1896,1961, -1897,1961,1896, -1961,1897,1962, -1898,1962,1897, -1962,1898,1963, -1899,1963,1898, -1963,1899,1964, -1900,1964,1899, -1964,1900,1965, -1901,1965,1900, -1965,1901,1966, -1902,1966,1901, -1966,1902,1967, -1903,1967,1902, -1967,1903,1968, -1904,1968,1903, -1968,1904,1969, -1905,1969,1904, -1969,1905,1970, -1906,1970,1905, -1970,1906,1971, -1907,1971,1906, -1971,1907,1972, -1908,1972,1907, -1972,1908,1973, -1909,1973,1908, -1973,1909,1974, -1910,1974,1909, -1974,1910,1975, -1911,1975,1910, -1975,1911,1976, -1912,1976,1911, -1976,1912,1977, -1913,1977,1912, -1977,1913,1978, -1914,1978,1913, -1978,1914,1979, -1915,1979,1914, -1979,1915,1980, -1916,1980,1915, -1980,1916,1981, -1917,1981,1916, -1981,1917,1982, -1918,1982,1917, -1982,1918,1983, -1919,1983,1918, -1984,1920,1985, -1921,1985,1920, -1985,1921,1986, -1922,1986,1921, -1986,1922,1987, -1923,1987,1922, -1987,1923,1988, -1924,1988,1923, -1988,1924,1989, -1925,1989,1924, -1989,1925,1990, -1926,1990,1925, -1990,1926,1991, -1927,1991,1926, -1991,1927,1992, -1928,1992,1927, -1992,1928,1993, -1929,1993,1928, -1993,1929,1994, -1930,1994,1929, -1994,1930,1995, -1931,1995,1930, -1995,1931,1996, -1932,1996,1931, -1996,1932,1997, -1933,1997,1932, -1997,1933,1998, -1934,1998,1933, -1998,1934,1999, -1935,1999,1934, -1999,1935,2000, -1936,2000,1935, -2000,1936,2001, -1937,2001,1936, -2001,1937,2002, -1938,2002,1937, -2002,1938,2003, -1939,2003,1938, -2003,1939,2004, -1940,2004,1939, -2004,1940,2005, -1941,2005,1940, -2005,1941,2006, -1942,2006,1941, -2006,1942,2007, -1943,2007,1942, -2007,1943,2008, -1944,2008,1943, -2008,1944,2009, -1945,2009,1944, -2009,1945,2010, -1946,2010,1945, -2010,1946,2011, -1947,2011,1946, -2011,1947,2012, -1948,2012,1947, -2012,1948,2013, -1949,2013,1948, -2013,1949,2014, -1950,2014,1949, -2014,1950,2015, -1951,2015,1950, -2015,1951,2016, -1952,2016,1951, -2016,1952,2017, -1953,2017,1952, -2017,1953,2018, -1954,2018,1953, -2018,1954,2019, -1955,2019,1954, -2019,1955,2020, -1956,2020,1955, -2020,1956,2021, -1957,2021,1956, -2021,1957,2022, -1958,2022,1957, -2022,1958,2023, -1959,2023,1958, -2023,1959,2024, -1960,2024,1959, -2024,1960,2025, -1961,2025,1960, -2025,1961,2026, -1962,2026,1961, -2026,1962,2027, -1963,2027,1962, -2027,1963,2028, -1964,2028,1963, -2028,1964,2029, -1965,2029,1964, -2029,1965,2030, -1966,2030,1965, -2030,1966,2031, -1967,2031,1966, -2031,1967,2032, -1968,2032,1967, -2032,1968,2033, -1969,2033,1968, -2033,1969,2034, -1970,2034,1969, -2034,1970,2035, -1971,2035,1970, -2035,1971,2036, -1972,2036,1971, -2036,1972,2037, -1973,2037,1972, -2037,1973,2038, -1974,2038,1973, -2038,1974,2039, -1975,2039,1974, -2039,1975,2040, -1976,2040,1975, -2040,1976,2041, -1977,2041,1976, -2041,1977,2042, -1978,2042,1977, -2042,1978,2043, -1979,2043,1978, -2043,1979,2044, -1980,2044,1979, -2044,1980,2045, -1981,2045,1980, -2045,1981,2046, -1982,2046,1981, -2046,1982,2047, -1983,2047,1982, -2048,1984,2049, -1985,2049,1984, -2049,1985,2050, -1986,2050,1985, -2050,1986,2051, -1987,2051,1986, -2051,1987,2052, -1988,2052,1987, -2052,1988,2053, -1989,2053,1988, -2053,1989,2054, -1990,2054,1989, -2054,1990,2055, -1991,2055,1990, -2055,1991,2056, -1992,2056,1991, -2056,1992,2057, -1993,2057,1992, -2057,1993,2058, -1994,2058,1993, -2058,1994,2059, -1995,2059,1994, -2059,1995,2060, -1996,2060,1995, -2060,1996,2061, -1997,2061,1996, -2061,1997,2062, -1998,2062,1997, -2062,1998,2063, -1999,2063,1998, -2063,1999,2064, -2000,2064,1999, -2064,2000,2065, -2001,2065,2000, -2065,2001,2066, -2002,2066,2001, -2066,2002,2067, -2003,2067,2002, -2067,2003,2068, -2004,2068,2003, -2068,2004,2069, -2005,2069,2004, -2069,2005,2070, -2006,2070,2005, -2070,2006,2071, -2007,2071,2006, -2071,2007,2072, -2008,2072,2007, -2072,2008,2073, -2009,2073,2008, -2073,2009,2074, -2010,2074,2009, -2074,2010,2075, -2011,2075,2010, -2075,2011,2076, -2012,2076,2011, -2076,2012,2077, -2013,2077,2012, -2077,2013,2078, -2014,2078,2013, -2078,2014,2079, -2015,2079,2014, -2079,2015,2080, -2016,2080,2015, -2080,2016,2081, -2017,2081,2016, -2081,2017,2082, -2018,2082,2017, -2082,2018,2083, -2019,2083,2018, -2083,2019,2084, -2020,2084,2019, -2084,2020,2085, -2021,2085,2020, -2085,2021,2086, -2022,2086,2021, -2086,2022,2087, -2023,2087,2022, -2087,2023,2088, -2024,2088,2023, -2088,2024,2089, -2025,2089,2024, -2089,2025,2090, -2026,2090,2025, -2090,2026,2091, -2027,2091,2026, -2091,2027,2092, -2028,2092,2027, -2092,2028,2093, -2029,2093,2028, -2093,2029,2094, -2030,2094,2029, -2094,2030,2095, -2031,2095,2030, -2095,2031,2096, -2032,2096,2031, -2096,2032,2097, -2033,2097,2032, -2097,2033,2098, -2034,2098,2033, -2098,2034,2099, -2035,2099,2034, -2099,2035,2100, -2036,2100,2035, -2100,2036,2101, -2037,2101,2036, -2101,2037,2102, -2038,2102,2037, -2102,2038,2103, -2039,2103,2038, -2103,2039,2104, -2040,2104,2039, -2104,2040,2105, -2041,2105,2040, -2105,2041,2106, -2042,2106,2041, -2106,2042,2107, -2043,2107,2042, -2107,2043,2108, -2044,2108,2043, -2108,2044,2109, -2045,2109,2044, -2109,2045,2110, -2046,2110,2045, -2110,2046,2111, -2047,2111,2046, -}; - -#define Landscape05VtxCount 2244 -#define Landscape05IdxCount 12870 - -btScalar Landscape05Vtx[] = { --250.0f,-0.990273f,0.0f, --250.0f,0.139875f,3.90625f, --246.094f,0.671004f,0.0f, --246.094f,1.72995f,3.90625f, --242.188f,1.84097f,0.0f, --242.188f,2.60122f,3.90625f, --238.281f,3.67319f,-1.6056e-007f, --238.281f,4.01346f,3.90625f, --234.375f,4.96849f,-2.1718e-007f, --234.375f,5.13654f,3.90625f, --230.469f,6.56215f,-2.86841e-007f, --230.469f,6.69665f,3.90625f, --226.563f,8.30102f,-3.62849e-007f, --226.563f,8.43203f,3.90625f, --222.656f,9.94385f,-4.3466e-007f, --222.656f,9.83442f,3.90625f, --218.75f,11.5986f,-5.06992e-007f, --218.75f,11.3645f,3.90625f, --214.844f,14.3141f,-6.2569e-007f, --214.844f,14.222f,3.90625f, --210.938f,16.5538f,-7.2359e-007f, --210.938f,16.1758f,3.90625f, --207.031f,18.852f,-8.24046e-007f, --207.031f,18.9127f,3.90625f, --203.125f,21.5344f,-9.41301e-007f, --203.125f,21.2478f,3.90625f, --199.219f,22.7337f,-9.93723e-007f, --199.219f,23.0589f,3.90625f, --195.313f,24.4712f,-1.06967e-006f, --195.313f,24.6025f,3.90625f, --191.406f,26.1169f,-1.14161e-006f, --191.406f,25.8143f,3.90625f, --187.5f,26.9988f,-1.18015e-006f, --187.5f,27.5696f,3.90625f, --183.594f,28.3854f,-1.24077e-006f, --183.594f,29.2176f,3.90625f, --179.688f,29.0457f,-1.26963e-006f, --179.688f,29.6835f,3.90625f, --175.781f,29.802f,-1.30269e-006f, --175.781f,30.7416f,3.90625f, --171.875f,30.1559f,-1.31816e-006f, --171.875f,31.4405f,3.90625f, --167.969f,32.3708f,-1.41497e-006f, --167.969f,33.0831f,3.90625f, --164.063f,34.9705f,-1.52861e-006f, --164.063f,34.6225f,3.90625f, --160.156f,36.396f,-1.59092e-006f, --160.156f,35.4992f,3.90625f, --156.25f,37.2947f,-1.6302e-006f, --156.25f,37.4126f,3.90625f, --152.344f,38.248f,-1.67187e-006f, --152.344f,38.453f,3.90625f, --148.438f,38.3176f,-1.67491e-006f, --148.438f,38.9974f,3.90625f, --144.531f,38.1589f,-1.66798e-006f, --144.531f,38.7871f,3.90625f, --140.625f,36.5895f,-1.59938e-006f, --140.625f,37.6021f,3.90625f, --136.719f,35.718f,-1.56128e-006f, --136.719f,36.1797f,3.90625f, --132.813f,33.7519f,-1.47534e-006f, --132.813f,34.9906f,3.90625f, --128.906f,33.2853f,-1.45495e-006f, --128.906f,34.1304f,3.90625f, --125.0f,33.4003f,-1.45997e-006f, --125.0f,34.3517f,3.90625f, --121.094f,33.1132f,-1.44742e-006f, --121.094f,33.6612f,3.90625f, --117.188f,32.7861f,-1.43313e-006f, --117.188f,32.7047f,3.90625f, --113.281f,33.0037f,-1.44264e-006f, --113.281f,32.3958f,3.90625f, --109.375f,32.508f,-1.42097e-006f, --109.375f,31.0818f,3.90625f, --105.469f,31.8384f,-1.3917e-006f, --105.469f,30.9536f,3.90625f, --101.563f,31.1858f,-1.36317e-006f, --101.563f,29.8205f,3.90625f, --97.6563f,29.6739f,-1.29709e-006f, --97.6563f,28.4796f,3.90625f, --93.75f,27.8258f,-1.2163e-006f, --93.75f,27.6494f,3.90625f, --89.8438f,25.9046f,-1.13232e-006f, --89.8438f,25.5721f,3.90625f, --85.9375f,23.4229f,-1.02385e-006f, --85.9375f,24.227f,3.90625f, --82.0313f,23.3671f,-1.02141e-006f, --82.0313f,23.2611f,3.90625f, --78.125f,23.0585f,-1.00792e-006f, --78.125f,22.4589f,3.90625f, --74.2188f,23.9226f,-1.04569e-006f, --74.2188f,23.2261f,3.90625f, --70.3125f,23.6449f,-1.03355e-006f, --70.3125f,23.5025f,3.90625f, --66.4063f,23.2789f,-1.01755e-006f, --66.4063f,23.6913f,3.90625f, --62.5f,24.5841f,-1.07461e-006f, --62.5f,24.6785f,3.90625f, --58.5938f,25.71f,-1.12382e-006f, --58.5938f,25.4946f,3.90625f, --54.6875f,26.9872f,-1.17965e-006f, --54.6875f,25.9722f,3.90625f, --50.7813f,27.8632f,-1.21794e-006f, --50.7813f,26.1977f,3.90625f, --46.875f,28.0326f,-1.22534e-006f, --46.875f,26.8539f,3.90625f, --42.9688f,28.0866f,-1.2277e-006f, --42.9688f,27.7268f,3.90625f, --39.0625f,30.1482f,-1.31782e-006f, --39.0625f,29.2046f,3.90625f, --35.1563f,32.4049f,-1.41646e-006f, --35.1563f,31.79f,3.90625f, --31.25f,34.4714f,-1.50679e-006f, --31.25f,34.2658f,3.90625f, --27.3438f,37.2668f,-1.62898e-006f, --27.3438f,35.9914f,3.90625f, --23.4375f,38.7934f,-1.69571e-006f, --23.4375f,38.3776f,3.90625f, --19.5313f,40.4024f,-1.76605e-006f, --19.5313f,39.8852f,3.90625f, --15.625f,42.8177f,-1.87162e-006f, --15.625f,43.1455f,3.90625f, --11.7188f,45.0198f,-1.96788e-006f, --11.7188f,45.5059f,3.90625f, --7.8125f,46.7349f,-2.04285e-006f, --7.8125f,47.4257f,3.90625f, --3.90625f,48.376f,-2.11458e-006f, --3.90625f,49.9032f,3.90625f, -0.0f,49.9016f,-2.18127e-006f, -0.0f,52.0322f,3.90625f, -3.90625f,50.3865f,-2.20246e-006f, -3.90625f,52.6186f,3.90625f, --250.0f,-0.818988f,-3.90625f, --246.094f,0.671433f,-3.90625f, --242.188f,2.83415f,-3.90625f, --238.281f,4.19978f,-3.90625f, --234.375f,5.59158f,-3.90625f, --230.469f,6.94041f,-3.90625f, --226.563f,8.34599f,-3.90625f, --222.656f,9.85416f,-3.90625f, --218.75f,10.8989f,-3.90625f, --214.844f,13.6339f,-3.90625f, --210.938f,16.5116f,-3.90625f, --207.031f,17.7111f,-3.90625f, --203.125f,20.7442f,-3.90625f, --199.219f,22.5356f,-3.90625f, --195.313f,24.3988f,-3.90625f, --191.406f,25.8062f,-3.90625f, --187.5f,26.9714f,-3.90625f, --183.594f,27.7397f,-3.90625f, --179.688f,28.8632f,-3.90625f, --175.781f,29.9688f,-3.90625f, --171.875f,32.154f,-3.90625f, --167.969f,33.3799f,-3.90625f, --164.063f,35.3882f,-3.90625f, --160.156f,35.9765f,-3.90625f, --156.25f,36.5306f,-3.90625f, --152.344f,37.3214f,-3.90625f, --148.438f,36.8126f,-3.90625f, --144.531f,36.5407f,-3.90625f, --140.625f,35.696f,-3.90625f, --136.719f,35.1152f,-3.90625f, --132.813f,34.1963f,-3.90625f, --128.906f,34.0796f,-3.90625f, --125.0f,34.2398f,-3.90625f, --121.094f,34.1503f,-3.90625f, --117.188f,33.7958f,-3.90625f, --113.281f,33.856f,-3.90625f, --109.375f,33.2705f,-3.90625f, --105.469f,32.5804f,-3.90625f, --101.563f,31.911f,-3.90625f, --97.6563f,30.3705f,-3.90625f, --93.75f,29.0627f,-3.90625f, --89.8438f,26.6822f,-3.90625f, --85.9375f,24.8309f,-3.90625f, --82.0313f,23.8581f,-3.90625f, --78.125f,23.3764f,-3.90625f, --74.2188f,23.9582f,-3.90625f, --70.3125f,24.13f,-3.90625f, --66.4063f,24.4426f,-3.90625f, --62.5f,25.5839f,-3.90625f, --58.5938f,26.6899f,-3.90625f, --54.6875f,27.9086f,-3.90625f, --50.7813f,28.5131f,-3.90625f, --46.875f,29.2612f,-3.90625f, --42.9688f,29.4581f,-3.90625f, --39.0625f,30.8972f,-3.90625f, --35.1563f,32.9085f,-3.90625f, --31.25f,34.9204f,-3.90625f, --27.3438f,37.7223f,-3.90625f, --23.4375f,38.921f,-3.90625f, --19.5313f,40.2983f,-3.90625f, --15.625f,41.7689f,-3.90625f, --11.7188f,43.8388f,-3.90625f, --7.8125f,44.7599f,-3.90625f, --3.90625f,46.53f,-3.90625f, -0.0f,48.2498f,-3.90625f, -3.90625f,48.8559f,-3.90625f, --250.0f,0.432867f,-7.8125f, --246.094f,1.93096f,-7.8125f, --242.188f,3.28774f,-7.8125f, --238.281f,4.53112f,-7.8125f, --234.375f,5.67699f,-7.8125f, --230.469f,7.34068f,-7.8125f, --226.563f,8.48553f,-7.8125f, --222.656f,10.127f,-7.8125f, --218.75f,11.3267f,-7.8125f, --214.844f,13.3914f,-7.8125f, --210.938f,15.5197f,-7.8125f, --207.031f,17.9403f,-7.8125f, --203.125f,20.5644f,-7.8125f, --199.219f,22.8796f,-7.8125f, --195.313f,23.715f,-7.8125f, --191.406f,26.1312f,-7.8125f, --187.5f,28.0754f,-7.8125f, --183.594f,29.1199f,-7.8125f, --179.688f,29.5774f,-7.8125f, --175.781f,30.2676f,-7.8125f, --171.875f,31.8275f,-7.8125f, --167.969f,33.4969f,-7.8125f, --164.063f,34.4445f,-7.8125f, --160.156f,35.3881f,-7.8125f, --156.25f,36.0267f,-7.8125f, --152.344f,36.1221f,-7.8125f, --148.438f,36.7707f,-7.8125f, --144.531f,36.3067f,-7.8125f, --140.625f,36.2295f,-7.8125f, --136.719f,35.6858f,-7.8125f, --132.813f,34.6232f,-7.8125f, --128.906f,34.1675f,-7.8125f, --125.0f,34.1756f,-7.8125f, --121.094f,33.6453f,-7.8125f, --117.188f,34.2516f,-7.8125f, --113.281f,34.228f,-7.8125f, --109.375f,34.253f,-7.8125f, --105.469f,33.1798f,-7.8125f, --101.563f,32.238f,-7.8125f, --97.6563f,31.0377f,-7.8125f, --93.75f,29.6795f,-7.8125f, --89.8438f,27.5934f,-7.8125f, --85.9375f,25.7426f,-7.8125f, --82.0313f,24.4001f,-7.8125f, --78.125f,24.4095f,-7.8125f, --74.2188f,25.1494f,-7.8125f, --70.3125f,25.0193f,-7.8125f, --66.4063f,25.3902f,-7.8125f, --62.5f,25.8612f,-7.8125f, --58.5938f,26.8169f,-7.8125f, --54.6875f,28.0698f,-7.8125f, --50.7813f,28.978f,-7.8125f, --46.875f,29.1063f,-7.8125f, --42.9688f,30.6071f,-7.8125f, --39.0625f,31.7015f,-7.8125f, --35.1563f,32.6112f,-7.8125f, --31.25f,34.6006f,-7.8125f, --27.3438f,36.3005f,-7.8125f, --23.4375f,38.4757f,-7.8125f, --19.5313f,39.7014f,-7.8125f, --15.625f,40.7762f,-7.8125f, --11.7188f,42.6458f,-7.8125f, --7.8125f,45.0307f,-7.8125f, --3.90625f,47.2861f,-7.8125f, -0.0f,48.5591f,-7.8125f, -3.90625f,48.7225f,-7.8125f, --250.0f,0.568294f,-11.7188f, --246.094f,1.83097f,-11.7188f, --242.188f,3.32037f,-11.7188f, --238.281f,4.29184f,-11.7188f, --234.375f,6.04113f,-11.7188f, --230.469f,7.01872f,-11.7188f, --226.563f,8.96731f,-11.7188f, --222.656f,10.3749f,-11.7188f, --218.75f,11.568f,-11.7188f, --214.844f,13.9092f,-11.7188f, --210.938f,15.6547f,-11.7188f, --207.031f,18.2156f,-11.7188f, --203.125f,20.0116f,-11.7188f, --199.219f,21.5443f,-11.7188f, --195.313f,23.4553f,-11.7188f, --191.406f,26.2778f,-11.7188f, --187.5f,28.0543f,-11.7188f, --183.594f,29.2657f,-11.7188f, --179.688f,29.6454f,-11.7188f, --175.781f,30.699f,-11.7188f, --171.875f,30.8229f,-11.7188f, --167.969f,32.9874f,-11.7188f, --164.063f,33.581f,-11.7188f, --160.156f,34.6365f,-11.7188f, --156.25f,35.6153f,-11.7188f, --152.344f,36.2491f,-11.7188f, --148.438f,36.2996f,-11.7188f, --144.531f,36.5456f,-11.7188f, --140.625f,36.3803f,-11.7188f, --136.719f,35.2403f,-11.7188f, --132.813f,34.0595f,-11.7188f, --128.906f,34.1384f,-11.7188f, --125.0f,33.59f,-11.7188f, --121.094f,33.7745f,-11.7188f, --117.188f,33.7284f,-11.7188f, --113.281f,33.7013f,-11.7188f, --109.375f,33.6335f,-11.7188f, --105.469f,33.2451f,-11.7188f, --101.563f,32.8691f,-11.7188f, --97.6563f,31.1343f,-11.7188f, --93.75f,29.5843f,-11.7188f, --89.8438f,27.5891f,-11.7188f, --85.9375f,25.75f,-11.7188f, --82.0313f,25.4336f,-11.7188f, --78.125f,25.6207f,-11.7188f, --74.2188f,25.1627f,-11.7188f, --70.3125f,25.542f,-11.7188f, --66.4063f,25.5384f,-11.7188f, --62.5f,25.9238f,-11.7188f, --58.5938f,26.0718f,-11.7188f, --54.6875f,27.4395f,-11.7188f, --50.7813f,28.8032f,-11.7188f, --46.875f,29.9667f,-11.7188f, --42.9688f,31.7598f,-11.7188f, --39.0625f,32.2636f,-11.7188f, --35.1563f,32.5734f,-11.7188f, --31.25f,33.543f,-11.7188f, --27.3438f,35.1143f,-11.7188f, --23.4375f,37.3147f,-11.7188f, --19.5313f,39.2413f,-11.7188f, --15.625f,41.8344f,-11.7188f, --11.7188f,43.9992f,-11.7188f, --7.8125f,46.8581f,-11.7188f, --3.90625f,48.5977f,-11.7188f, -0.0f,48.7029f,-11.7188f, -3.90625f,49.6298f,-11.7188f, --250.0f,1.50235f,-15.625f, --246.094f,1.79115f,-15.625f, --242.188f,2.52523f,-15.625f, --238.281f,4.09278f,-15.625f, --234.375f,6.21068f,-15.625f, --230.469f,7.49819f,-15.625f, --226.563f,8.56548f,-15.625f, --222.656f,9.98954f,-15.625f, --218.75f,12.3263f,-15.625f, --214.844f,14.495f,-15.625f, --210.938f,15.3551f,-15.625f, --207.031f,17.6989f,-15.625f, --203.125f,19.2847f,-15.625f, --199.219f,21.1027f,-15.625f, --195.313f,23.3408f,-15.625f, --191.406f,25.3739f,-15.625f, --187.5f,27.368f,-15.625f, --183.594f,28.3731f,-15.625f, --179.688f,29.5532f,-15.625f, --175.781f,30.0011f,-15.625f, --171.875f,31.0216f,-15.625f, --167.969f,32.5546f,-15.625f, --164.063f,32.6717f,-15.625f, --160.156f,33.8465f,-15.625f, --156.25f,35.1272f,-15.625f, --152.344f,35.5572f,-15.625f, --148.438f,36.643f,-15.625f, --144.531f,36.4283f,-15.625f, --140.625f,35.6122f,-15.625f, --136.719f,35.358f,-15.625f, --132.813f,34.1938f,-15.625f, --128.906f,34.3913f,-15.625f, --125.0f,33.2147f,-15.625f, --121.094f,32.799f,-15.625f, --117.188f,33.1385f,-15.625f, --113.281f,33.1487f,-15.625f, --109.375f,33.6564f,-15.625f, --105.469f,33.2315f,-15.625f, --101.563f,32.6066f,-15.625f, --97.6563f,30.6926f,-15.625f, --93.75f,28.534f,-15.625f, --89.8438f,27.6738f,-15.625f, --85.9375f,27.4216f,-15.625f, --82.0313f,26.0324f,-15.625f, --78.125f,25.775f,-15.625f, --74.2188f,25.909f,-15.625f, --70.3125f,25.0198f,-15.625f, --66.4063f,25.9376f,-15.625f, --62.5f,26.0382f,-15.625f, --58.5938f,25.856f,-15.625f, --54.6875f,27.3648f,-15.625f, --50.7813f,28.9059f,-15.625f, --46.875f,30.6601f,-15.625f, --42.9688f,32.6996f,-15.625f, --39.0625f,32.6909f,-15.625f, --35.1563f,33.1697f,-15.625f, --31.25f,34.6947f,-15.625f, --27.3438f,35.6982f,-15.625f, --23.4375f,38.2946f,-15.625f, --19.5313f,40.6765f,-15.625f, --15.625f,43.5894f,-15.625f, --11.7188f,46.3071f,-15.625f, --7.8125f,48.6578f,-15.625f, --3.90625f,49.0003f,-15.625f, -0.0f,50.5123f,-15.625f, -3.90625f,50.6915f,-15.625f, --250.0f,1.44302f,-19.5313f, --246.094f,1.65093f,-19.5313f, --242.188f,2.94233f,-19.5313f, --238.281f,4.72065f,-19.5313f, --234.375f,6.57861f,-19.5313f, --230.469f,7.31849f,-19.5313f, --226.563f,7.90567f,-19.5313f, --222.656f,9.84414f,-19.5313f, --218.75f,12.1574f,-19.5313f, --214.844f,13.2825f,-19.5313f, --210.938f,15.2284f,-19.5313f, --207.031f,17.2765f,-19.5313f, --203.125f,19.1565f,-19.5313f, --199.219f,20.3098f,-19.5313f, --195.313f,21.9346f,-19.5313f, --191.406f,23.8549f,-19.5313f, --187.5f,26.133f,-19.5313f, --183.594f,27.5858f,-19.5313f, --179.688f,28.557f,-19.5313f, --175.781f,28.9754f,-19.5313f, --171.875f,29.9709f,-19.5313f, --167.969f,31.2632f,-19.5313f, --164.063f,31.4957f,-19.5313f, --160.156f,33.6753f,-19.5313f, --156.25f,35.1342f,-19.5313f, --152.344f,35.0617f,-19.5313f, --148.438f,34.9467f,-19.5313f, --144.531f,35.1042f,-19.5313f, --140.625f,35.0842f,-19.5313f, --136.719f,34.7766f,-19.5313f, --132.813f,33.8305f,-19.5313f, --128.906f,33.3013f,-19.5313f, --125.0f,32.5726f,-19.5313f, --121.094f,31.5139f,-19.5313f, --117.188f,31.4576f,-19.5313f, --113.281f,31.6546f,-19.5313f, --109.375f,32.4663f,-19.5313f, --105.469f,32.6148f,-19.5313f, --101.563f,31.253f,-19.5313f, --97.6563f,29.5875f,-19.5313f, --93.75f,28.4866f,-19.5313f, --89.8438f,29.106f,-19.5313f, --85.9375f,28.7092f,-19.5313f, --82.0313f,27.4567f,-19.5313f, --78.125f,26.5225f,-19.5313f, --74.2188f,26.7534f,-19.5313f, --70.3125f,26.278f,-19.5313f, --66.4063f,25.6949f,-19.5313f, --62.5f,25.7385f,-19.5313f, --58.5938f,25.8791f,-19.5313f, --54.6875f,27.42f,-19.5313f, --50.7813f,29.0777f,-19.5313f, --46.875f,31.016f,-19.5313f, --42.9688f,32.5331f,-19.5313f, --39.0625f,33.213f,-19.5313f, --35.1563f,33.9437f,-19.5313f, --31.25f,35.6737f,-19.5313f, --27.3438f,37.8841f,-19.5313f, --23.4375f,40.5289f,-19.5313f, --19.5313f,43.6786f,-19.5313f, --15.625f,47.2945f,-19.5313f, --11.7188f,49.7082f,-19.5313f, --7.8125f,51.1285f,-19.5313f, --3.90625f,51.5532f,-19.5313f, -0.0f,52.3342f,-19.5313f, -3.90625f,52.1028f,-19.5313f, --250.0f,1.05337f,-23.4375f, --246.094f,1.28315f,-23.4375f, --242.188f,3.38102f,-23.4375f, --238.281f,4.51357f,-23.4375f, --234.375f,5.63288f,-23.4375f, --230.469f,6.49498f,-23.4375f, --226.563f,7.71248f,-23.4375f, --222.656f,8.83716f,-23.4375f, --218.75f,10.4002f,-23.4375f, --214.844f,11.8049f,-23.4375f, --210.938f,13.7948f,-23.4375f, --207.031f,16.5066f,-23.4375f, --203.125f,18.598f,-23.4375f, --199.219f,20.3069f,-23.4375f, --195.313f,21.6868f,-23.4375f, --191.406f,22.5781f,-23.4375f, --187.5f,25.0292f,-23.4375f, --183.594f,26.5386f,-23.4375f, --179.688f,27.1952f,-23.4375f, --175.781f,28.4023f,-23.4375f, --171.875f,29.0264f,-23.4375f, --167.969f,29.9302f,-23.4375f, --164.063f,31.7992f,-23.4375f, --160.156f,33.4902f,-23.4375f, --156.25f,34.4307f,-23.4375f, --152.344f,34.1463f,-23.4375f, --148.438f,33.5881f,-23.4375f, --144.531f,34.0515f,-23.4375f, --140.625f,33.7128f,-23.4375f, --136.719f,33.2076f,-23.4375f, --132.813f,32.0419f,-23.4375f, --128.906f,31.3464f,-23.4375f, --125.0f,31.3552f,-23.4375f, --121.094f,30.6713f,-23.4375f, --117.188f,30.1403f,-23.4375f, --113.281f,30.1753f,-23.4375f, --109.375f,30.6182f,-23.4375f, --105.469f,31.2785f,-23.4375f, --101.563f,30.4839f,-23.4375f, --97.6563f,28.9907f,-23.4375f, --93.75f,29.3427f,-23.4375f, --89.8438f,29.5539f,-23.4375f, --85.9375f,29.4313f,-23.4375f, --82.0313f,28.0148f,-23.4375f, --78.125f,27.3569f,-23.4375f, --74.2188f,26.8569f,-23.4375f, --70.3125f,25.6193f,-23.4375f, --66.4063f,25.8188f,-23.4375f, --62.5f,25.458f,-23.4375f, --58.5938f,26.5128f,-23.4375f, --54.6875f,27.2598f,-23.4375f, --50.7813f,28.4912f,-23.4375f, --46.875f,31.0376f,-23.4375f, --42.9688f,33.0941f,-23.4375f, --39.0625f,34.4933f,-23.4375f, --35.1563f,37.1957f,-23.4375f, --31.25f,39.4612f,-23.4375f, --27.3438f,41.4598f,-23.4375f, --23.4375f,43.5893f,-23.4375f, --19.5313f,46.8054f,-23.4375f, --15.625f,49.4177f,-23.4375f, --11.7188f,51.7957f,-23.4375f, --7.8125f,53.1306f,-23.4375f, --3.90625f,53.4872f,-23.4375f, -0.0f,53.6348f,-23.4375f, -3.90625f,54.332f,-23.4375f, --250.0f,1.05459f,-27.3438f, --246.094f,2.15725f,-27.3438f, --242.188f,3.16747f,-27.3438f, --238.281f,4.17562f,-27.3438f, --234.375f,5.17097f,-27.3438f, --230.469f,6.61997f,-27.3438f, --226.563f,7.25727f,-27.3438f, --222.656f,9.26302f,-27.3438f, --218.75f,10.7606f,-27.3438f, --214.844f,11.6966f,-27.3438f, --210.938f,13.0425f,-27.3438f, --207.031f,15.0672f,-27.3438f, --203.125f,17.5971f,-27.3438f, --199.219f,19.3182f,-27.3438f, --195.313f,20.4505f,-27.3438f, --191.406f,20.7017f,-27.3438f, --187.5f,22.8054f,-27.3438f, --183.594f,24.7406f,-27.3438f, --179.688f,25.7957f,-27.3438f, --175.781f,28.4608f,-27.3438f, --171.875f,29.5031f,-27.3438f, --167.969f,29.8812f,-27.3438f, --164.063f,31.4954f,-27.3438f, --160.156f,32.6053f,-27.3438f, --156.25f,32.9274f,-27.3438f, --152.344f,32.6481f,-27.3438f, --148.438f,32.4456f,-27.3438f, --144.531f,32.0065f,-27.3438f, --140.625f,31.7655f,-27.3438f, --136.719f,31.6836f,-27.3438f, --132.813f,30.9994f,-27.3438f, --128.906f,30.4065f,-27.3438f, --125.0f,29.7478f,-27.3438f, --121.094f,29.3871f,-27.3438f, --117.188f,28.6628f,-27.3438f, --113.281f,28.88f,-27.3438f, --109.375f,29.3757f,-27.3438f, --105.469f,29.7372f,-27.3438f, --101.563f,28.9035f,-27.3438f, --97.6563f,29.0842f,-27.3438f, --93.75f,28.969f,-27.3438f, --89.8438f,29.282f,-27.3438f, --85.9375f,29.4429f,-27.3438f, --82.0313f,29.2385f,-27.3438f, --78.125f,28.2845f,-27.3438f, --74.2188f,26.9413f,-27.3438f, --70.3125f,26.3888f,-27.3438f, --66.4063f,26.4127f,-27.3438f, --62.5f,27.4297f,-27.3438f, --58.5938f,28.0301f,-27.3438f, --54.6875f,28.3682f,-27.3438f, --50.7813f,30.4624f,-27.3438f, --46.875f,32.6469f,-27.3438f, --42.9688f,34.7681f,-27.3438f, --39.0625f,37.3677f,-27.3438f, --35.1563f,40.0943f,-27.3438f, --31.25f,42.4424f,-27.3438f, --27.3438f,44.5954f,-27.3438f, --23.4375f,48.1538f,-27.3438f, --19.5313f,50.5809f,-27.3438f, --15.625f,52.7959f,-27.3438f, --11.7188f,53.9779f,-27.3438f, --7.8125f,55.2657f,-27.3438f, --3.90625f,55.7427f,-27.3438f, -0.0f,56.6047f,-27.3438f, -3.90625f,57.5273f,-27.3438f, --250.0f,1.91243f,-31.25f, --246.094f,1.77508f,-31.25f, --242.188f,2.89721f,-31.25f, --238.281f,4.82177f,-31.25f, --234.375f,5.57483f,-31.25f, --230.469f,6.15697f,-31.25f, --226.563f,7.43219f,-31.25f, --222.656f,9.10752f,-31.25f, --218.75f,10.7345f,-31.25f, --214.844f,11.7298f,-31.25f, --210.938f,13.0008f,-31.25f, --207.031f,14.4465f,-31.25f, --203.125f,16.7635f,-31.25f, --199.219f,18.7095f,-31.25f, --195.313f,19.057f,-31.25f, --191.406f,19.522f,-31.25f, --187.5f,21.0252f,-31.25f, --183.594f,22.477f,-31.25f, --179.688f,24.9456f,-31.25f, --175.781f,27.5579f,-31.25f, --171.875f,28.9367f,-31.25f, --167.969f,29.5938f,-31.25f, --164.063f,29.9491f,-31.25f, --160.156f,31.1043f,-31.25f, --156.25f,31.898f,-31.25f, --152.344f,32.025f,-31.25f, --148.438f,32.2848f,-31.25f, --144.531f,31.4433f,-31.25f, --140.625f,29.9423f,-31.25f, --136.719f,30.2535f,-31.25f, --132.813f,30.4668f,-31.25f, --128.906f,30.1261f,-31.25f, --125.0f,29.2612f,-31.25f, --121.094f,27.5496f,-31.25f, --117.188f,27.0659f,-31.25f, --113.281f,27.3359f,-31.25f, --109.375f,27.8418f,-31.25f, --105.469f,28.9814f,-31.25f, --101.563f,28.4429f,-31.25f, --97.6563f,28.5833f,-31.25f, --93.75f,28.9986f,-31.25f, --89.8438f,30.3273f,-31.25f, --85.9375f,30.5898f,-31.25f, --82.0313f,29.8768f,-31.25f, --78.125f,28.7278f,-31.25f, --74.2188f,28.2599f,-31.25f, --70.3125f,27.5942f,-31.25f, --66.4063f,28.2721f,-31.25f, --62.5f,28.9526f,-31.25f, --58.5938f,29.4527f,-31.25f, --54.6875f,30.1605f,-31.25f, --50.7813f,32.6242f,-31.25f, --46.875f,35.2708f,-31.25f, --42.9688f,37.6696f,-31.25f, --39.0625f,40.1477f,-31.25f, --35.1563f,42.5127f,-31.25f, --31.25f,45.655f,-31.25f, --27.3438f,48.5747f,-31.25f, --23.4375f,51.2069f,-31.25f, --19.5313f,53.5599f,-31.25f, --15.625f,55.3726f,-31.25f, --11.7188f,56.4687f,-31.25f, --7.8125f,56.313f,-31.25f, --3.90625f,58.0363f,-31.25f, -0.0f,59.422f,-31.25f, -3.90625f,59.4204f,-31.25f, --250.0f,1.80637f,-35.1563f, --246.094f,1.14243f,-35.1563f, --242.188f,2.08309f,-35.1563f, --238.281f,3.66548f,-35.1563f, --234.375f,4.49251f,-35.1563f, --230.469f,5.63985f,-35.1563f, --226.563f,7.33778f,-35.1563f, --222.656f,9.15183f,-35.1563f, --218.75f,10.0463f,-35.1563f, --214.844f,11.7521f,-35.1563f, --210.938f,12.6919f,-35.1563f, --207.031f,14.0216f,-35.1563f, --203.125f,14.9825f,-35.1563f, --199.219f,16.2286f,-35.1563f, --195.313f,17.2153f,-35.1563f, --191.406f,18.0692f,-35.1563f, --187.5f,19.858f,-35.1563f, --183.594f,22.2715f,-35.1563f, --179.688f,25.6457f,-35.1563f, --175.781f,27.6627f,-35.1563f, --171.875f,28.6491f,-35.1563f, --167.969f,29.5869f,-35.1563f, --164.063f,29.5582f,-35.1563f, --160.156f,30.7619f,-35.1563f, --156.25f,31.372f,-35.1563f, --152.344f,31.4423f,-35.1563f, --148.438f,31.7578f,-35.1563f, --144.531f,31.1339f,-35.1563f, --140.625f,29.3454f,-35.1563f, --136.719f,28.0675f,-35.1563f, --132.813f,28.1828f,-35.1563f, --128.906f,28.2649f,-35.1563f, --125.0f,27.2326f,-35.1563f, --121.094f,26.2567f,-35.1563f, --117.188f,25.4914f,-35.1563f, --113.281f,25.5444f,-35.1563f, --109.375f,25.8703f,-35.1563f, --105.469f,27.9373f,-35.1563f, --101.563f,27.9306f,-35.1563f, --97.6563f,27.9282f,-35.1563f, --93.75f,28.9199f,-35.1563f, --89.8438f,30.142f,-35.1563f, --85.9375f,30.3479f,-35.1563f, --82.0313f,29.749f,-35.1563f, --78.125f,29.2656f,-35.1563f, --74.2188f,28.8561f,-35.1563f, --70.3125f,28.7144f,-35.1563f, --66.4063f,29.3204f,-35.1563f, --62.5f,29.6751f,-35.1563f, --58.5938f,31.0647f,-35.1563f, --54.6875f,32.3243f,-35.1563f, --50.7813f,34.476f,-35.1563f, --46.875f,37.0984f,-35.1563f, --42.9688f,40.1281f,-35.1563f, --39.0625f,42.4472f,-35.1563f, --35.1563f,45.6772f,-35.1563f, --31.25f,49.5655f,-35.1563f, --27.3438f,51.5783f,-35.1563f, --23.4375f,53.3f,-35.1563f, --19.5313f,55.4127f,-35.1563f, --15.625f,56.8152f,-35.1563f, --11.7188f,56.8985f,-35.1563f, --7.8125f,57.5886f,-35.1563f, --3.90625f,58.9321f,-35.1563f, -0.0f,60.2297f,-35.1563f, -3.90625f,60.2212f,-35.1563f, --250.0f,2.59935f,-39.0625f, --246.094f,1.55278f,-39.0625f, --242.188f,1.42243f,-39.0625f, --238.281f,2.78238f,-39.0625f, --234.375f,3.85918f,-39.0625f, --230.469f,5.01321f,-39.0625f, --226.563f,6.56707f,-39.0625f, --222.656f,7.99762f,-39.0625f, --218.75f,9.72642f,-39.0625f, --214.844f,11.975f,-39.0625f, --210.938f,12.8008f,-39.0625f, --207.031f,13.6902f,-39.0625f, --203.125f,14.2017f,-39.0625f, --199.219f,14.8784f,-39.0625f, --195.313f,16.6265f,-39.0625f, --191.406f,17.066f,-39.0625f, --187.5f,19.3153f,-39.0625f, --183.594f,23.4017f,-39.0625f, --179.688f,26.2073f,-39.0625f, --175.781f,27.92f,-39.0625f, --171.875f,29.0435f,-39.0625f, --167.969f,28.8537f,-39.0625f, --164.063f,29.6445f,-39.0625f, --160.156f,30.2119f,-39.0625f, --156.25f,30.4693f,-39.0625f, --152.344f,30.6063f,-39.0625f, --148.438f,30.8716f,-39.0625f, --144.531f,30.3253f,-39.0625f, --140.625f,29.3941f,-39.0625f, --136.719f,27.7606f,-39.0625f, --132.813f,26.806f,-39.0625f, --128.906f,26.6501f,-39.0625f, --125.0f,25.6992f,-39.0625f, --121.094f,24.4674f,-39.0625f, --117.188f,24.1124f,-39.0625f, --113.281f,24.9142f,-39.0625f, --109.375f,25.5696f,-39.0625f, --105.469f,25.4691f,-39.0625f, --101.563f,26.7147f,-39.0625f, --97.6563f,26.7558f,-39.0625f, --93.75f,27.9278f,-39.0625f, --89.8438f,29.0149f,-39.0625f, --85.9375f,29.3557f,-39.0625f, --82.0313f,29.6134f,-39.0625f, --78.125f,29.4742f,-39.0625f, --74.2188f,29.3377f,-39.0625f, --70.3125f,29.6082f,-39.0625f, --66.4063f,29.4634f,-39.0625f, --62.5f,31.1775f,-39.0625f, --58.5938f,32.7227f,-39.0625f, --54.6875f,34.2233f,-39.0625f, --50.7813f,36.1862f,-39.0625f, --46.875f,38.7123f,-39.0625f, --42.9688f,41.2396f,-39.0625f, --39.0625f,44.5857f,-39.0625f, --35.1563f,47.0183f,-39.0625f, --31.25f,50.9933f,-39.0625f, --27.3438f,53.2967f,-39.0625f, --23.4375f,55.2026f,-39.0625f, --19.5313f,56.3858f,-39.0625f, --15.625f,57.8615f,-39.0625f, --11.7188f,57.7515f,-39.0625f, --7.8125f,58.8071f,-39.0625f, --3.90625f,59.73f,-39.0625f, -0.0f,59.8999f,-39.0625f, -3.90625f,59.9094f,-39.0625f, --250.0f,2.73015f,-42.9688f, --246.094f,1.9296f,-42.9688f, --242.188f,2.00835f,-42.9688f, --238.281f,3.16245f,-42.9688f, --234.375f,3.35198f,-42.9688f, --230.469f,4.50732f,-42.9688f, --226.563f,6.28971f,-42.9688f, --222.656f,7.89723f,-42.9688f, --218.75f,9.28447f,-42.9688f, --214.844f,11.4302f,-42.9688f, --210.938f,12.7156f,-42.9688f, --207.031f,13.6281f,-42.9688f, --203.125f,14.5932f,-42.9688f, --199.219f,14.8129f,-42.9688f, --195.313f,15.7965f,-42.9688f, --191.406f,16.3571f,-42.9688f, --187.5f,20.257f,-42.9688f, --183.594f,23.2993f,-42.9688f, --179.688f,25.4583f,-42.9688f, --175.781f,27.2887f,-42.9688f, --171.875f,27.9862f,-42.9688f, --167.969f,28.274f,-42.9688f, --164.063f,28.9264f,-42.9688f, --160.156f,29.1855f,-42.9688f, --156.25f,29.8898f,-42.9688f, --152.344f,29.4922f,-42.9688f, --148.438f,29.257f,-42.9688f, --144.531f,28.9137f,-42.9688f, --140.625f,27.618f,-42.9688f, --136.719f,26.8539f,-42.9688f, --132.813f,26.2806f,-42.9688f, --128.906f,25.1378f,-42.9688f, --125.0f,24.508f,-42.9688f, --121.094f,23.8458f,-42.9688f, --117.188f,23.501f,-42.9688f, --113.281f,24.0593f,-42.9688f, --109.375f,24.1366f,-42.9688f, --105.469f,24.075f,-42.9688f, --101.563f,24.5025f,-42.9688f, --97.6563f,24.8457f,-42.9688f, --93.75f,26.5028f,-42.9688f, --89.8438f,26.9842f,-42.9688f, --85.9375f,28.5672f,-42.9688f, --82.0313f,28.9848f,-42.9688f, --78.125f,29.1484f,-42.9688f, --74.2188f,28.8735f,-42.9688f, --70.3125f,29.9085f,-42.9688f, --66.4063f,31.647f,-42.9688f, --62.5f,32.8553f,-42.9688f, --58.5938f,34.4488f,-42.9688f, --54.6875f,35.7724f,-42.9688f, --50.7813f,38.5181f,-42.9688f, --46.875f,40.619f,-42.9688f, --42.9688f,42.6158f,-42.9688f, --39.0625f,45.9557f,-42.9688f, --35.1563f,48.8071f,-42.9688f, --31.25f,51.5425f,-42.9688f, --27.3438f,54.1461f,-42.9688f, --23.4375f,56.6935f,-42.9688f, --19.5313f,57.353f,-42.9688f, --15.625f,58.289f,-42.9688f, --11.7188f,58.4633f,-42.9688f, --7.8125f,59.0033f,-42.9688f, --3.90625f,59.61f,-42.9688f, -0.0f,59.6115f,-42.9688f, -3.90625f,59.5207f,-42.9688f, --250.0f,2.05499f,-46.875f, --246.094f,1.44228f,-46.875f, --242.188f,1.95946f,-46.875f, --238.281f,2.50642f,-46.875f, --234.375f,3.23732f,-46.875f, --230.469f,4.46051f,-46.875f, --226.563f,6.17815f,-46.875f, --222.656f,7.58101f,-46.875f, --218.75f,9.4063f,-46.875f, --214.844f,11.394f,-46.875f, --210.938f,12.4493f,-46.875f, --207.031f,13.1281f,-46.875f, --203.125f,13.8316f,-46.875f, --199.219f,14.1574f,-46.875f, --195.313f,15.0289f,-46.875f, --191.406f,17.2095f,-46.875f, --187.5f,20.3326f,-46.875f, --183.594f,22.5046f,-46.875f, --179.688f,24.7998f,-46.875f, --175.781f,26.3728f,-46.875f, --171.875f,27.3394f,-46.875f, --167.969f,27.2989f,-46.875f, --164.063f,27.5191f,-46.875f, --160.156f,28.1581f,-46.875f, --156.25f,28.357f,-46.875f, --152.344f,27.2465f,-46.875f, --148.438f,27.6591f,-46.875f, --144.531f,26.7196f,-46.875f, --140.625f,25.3776f,-46.875f, --136.719f,25.1174f,-46.875f, --132.813f,24.6913f,-46.875f, --128.906f,23.828f,-46.875f, --125.0f,22.7885f,-46.875f, --121.094f,23.6316f,-46.875f, --117.188f,23.288f,-46.875f, --113.281f,22.8849f,-46.875f, --109.375f,22.6367f,-46.875f, --105.469f,22.2282f,-46.875f, --101.563f,22.7539f,-46.875f, --97.6563f,23.4319f,-46.875f, --93.75f,25.0494f,-46.875f, --89.8438f,25.7759f,-46.875f, --85.9375f,27.2287f,-46.875f, --82.0313f,28.1554f,-46.875f, --78.125f,28.6794f,-46.875f, --74.2188f,30.4763f,-46.875f, --70.3125f,32.23f,-46.875f, --66.4063f,33.6868f,-46.875f, --62.5f,34.7841f,-46.875f, --58.5938f,36.2585f,-46.875f, --54.6875f,38.2534f,-46.875f, --50.7813f,39.5261f,-46.875f, --46.875f,41.7676f,-46.875f, --42.9688f,44.8849f,-46.875f, --39.0625f,47.6394f,-46.875f, --35.1563f,49.5783f,-46.875f, --31.25f,52.3871f,-46.875f, --27.3438f,54.9333f,-46.875f, --23.4375f,56.6705f,-46.875f, --19.5313f,56.898f,-46.875f, --15.625f,58.678f,-46.875f, --11.7188f,59.6595f,-46.875f, --7.8125f,59.0163f,-46.875f, --3.90625f,59.3587f,-46.875f, -0.0f,58.5405f,-46.875f, -3.90625f,58.9086f,-46.875f, --250.0f,2.57742f,-50.7813f, --246.094f,2.06275f,-50.7813f, --242.188f,2.26453f,-50.7813f, --238.281f,2.43527f,-50.7813f, --234.375f,2.63858f,-50.7813f, --230.469f,4.44964f,-50.7813f, --226.563f,6.50192f,-50.7813f, --222.656f,8.11006f,-50.7813f, --218.75f,10.1023f,-50.7813f, --214.844f,11.3708f,-50.7813f, --210.938f,12.7395f,-50.7813f, --207.031f,13.6541f,-50.7813f, --203.125f,13.6317f,-50.7813f, --199.219f,13.4823f,-50.7813f, --195.313f,15.3032f,-50.7813f, --191.406f,17.5085f,-50.7813f, --187.5f,19.5731f,-50.7813f, --183.594f,22.0894f,-50.7813f, --179.688f,23.8927f,-50.7813f, --175.781f,24.9335f,-50.7813f, --171.875f,26.1125f,-50.7813f, --167.969f,25.9034f,-50.7813f, --164.063f,26.9549f,-50.7813f, --160.156f,26.7939f,-50.7813f, --156.25f,26.3447f,-50.7813f, --152.344f,25.6085f,-50.7813f, --148.438f,25.2823f,-50.7813f, --144.531f,25.4854f,-50.7813f, --140.625f,23.906f,-50.7813f, --136.719f,23.7094f,-50.7813f, --132.813f,22.9599f,-50.7813f, --128.906f,22.3089f,-50.7813f, --125.0f,22.302f,-50.7813f, --121.094f,23.3289f,-50.7813f, --117.188f,23.1804f,-50.7813f, --113.281f,22.6693f,-50.7813f, --109.375f,21.2587f,-50.7813f, --105.469f,20.4638f,-50.7813f, --101.563f,21.4819f,-50.7813f, --97.6563f,22.0137f,-50.7813f, --93.75f,23.4763f,-50.7813f, --89.8438f,25.2125f,-50.7813f, --85.9375f,26.446f,-50.7813f, --82.0313f,27.5614f,-50.7813f, --78.125f,29.5641f,-50.7813f, --74.2188f,31.1552f,-50.7813f, --70.3125f,33.5337f,-50.7813f, --66.4063f,35.653f,-50.7813f, --62.5f,36.2419f,-50.7813f, --58.5938f,37.4297f,-50.7813f, --54.6875f,39.7492f,-50.7813f, --50.7813f,41.494f,-50.7813f, --46.875f,44.5449f,-50.7813f, --42.9688f,47.2689f,-50.7813f, --39.0625f,49.6705f,-50.7813f, --35.1563f,51.8942f,-50.7813f, --31.25f,53.9483f,-50.7813f, --27.3438f,55.2444f,-50.7813f, --23.4375f,56.5482f,-50.7813f, --19.5313f,58.5545f,-50.7813f, --15.625f,59.5559f,-50.7813f, --11.7188f,58.8699f,-50.7813f, --7.8125f,59.0373f,-50.7813f, --3.90625f,59.5884f,-50.7813f, -0.0f,59.6491f,-50.7813f, -3.90625f,59.8509f,-50.7813f, --250.0f,2.04136f,-54.6875f, --246.094f,2.5492f,-54.6875f, --242.188f,2.70952f,-54.6875f, --238.281f,3.00758f,-54.6875f, --234.375f,3.54707f,-54.6875f, --230.469f,5.09851f,-54.6875f, --226.563f,7.09409f,-54.6875f, --222.656f,8.40975f,-54.6875f, --218.75f,10.0555f,-54.6875f, --214.844f,11.4962f,-54.6875f, --210.938f,12.1806f,-54.6875f, --207.031f,12.7217f,-54.6875f, --203.125f,12.6935f,-54.6875f, --199.219f,14.0259f,-54.6875f, --195.313f,16.1147f,-54.6875f, --191.406f,18.3888f,-54.6875f, --187.5f,19.3549f,-54.6875f, --183.594f,21.6563f,-54.6875f, --179.688f,22.9906f,-54.6875f, --175.781f,23.7728f,-54.6875f, --171.875f,25.2286f,-54.6875f, --167.969f,26.0764f,-54.6875f, --164.063f,26.746f,-54.6875f, --160.156f,26.3029f,-54.6875f, --156.25f,25.6172f,-54.6875f, --152.344f,24.537f,-54.6875f, --148.438f,23.8458f,-54.6875f, --144.531f,23.3726f,-54.6875f, --140.625f,22.8694f,-54.6875f, --136.719f,22.5247f,-54.6875f, --132.813f,21.436f,-54.6875f, --128.906f,21.4712f,-54.6875f, --125.0f,22.1621f,-54.6875f, --121.094f,22.4599f,-54.6875f, --117.188f,21.4148f,-54.6875f, --113.281f,20.8237f,-54.6875f, --109.375f,19.6257f,-54.6875f, --105.469f,20.1462f,-54.6875f, --101.563f,21.5895f,-54.6875f, --97.6563f,22.2376f,-54.6875f, --93.75f,23.679f,-54.6875f, --89.8438f,24.9403f,-54.6875f, --85.9375f,26.4205f,-54.6875f, --82.0313f,27.9125f,-54.6875f, --78.125f,30.0689f,-54.6875f, --74.2188f,32.7388f,-54.6875f, --70.3125f,34.3502f,-54.6875f, --66.4063f,35.6763f,-54.6875f, --62.5f,37.4625f,-54.6875f, --58.5938f,38.3448f,-54.6875f, --54.6875f,40.6027f,-54.6875f, --50.7813f,44.4532f,-54.6875f, --46.875f,47.6182f,-54.6875f, --42.9688f,49.7683f,-54.6875f, --39.0625f,52.1875f,-54.6875f, --35.1563f,54.4951f,-54.6875f, --31.25f,55.9437f,-54.6875f, --27.3438f,57.1353f,-54.6875f, --23.4375f,58.016f,-54.6875f, --19.5313f,59.6013f,-54.6875f, --15.625f,59.9872f,-54.6875f, --11.7188f,59.8299f,-54.6875f, --7.8125f,60.1035f,-54.6875f, --3.90625f,60.8558f,-54.6875f, -0.0f,60.5619f,-54.6875f, -3.90625f,60.3928f,-54.6875f, --250.0f,4.01167f,-58.5938f, --246.094f,3.0694f,-58.5938f, --242.188f,3.37661f,-58.5938f, --238.281f,3.71931f,-58.5938f, --234.375f,4.08816f,-58.5938f, --230.469f,5.56386f,-58.5938f, --226.563f,7.3314f,-58.5938f, --222.656f,8.61323f,-58.5938f, --218.75f,9.77849f,-58.5938f, --214.844f,11.9744f,-58.5938f, --210.938f,12.9366f,-58.5938f, --207.031f,13.5175f,-58.5938f, --203.125f,13.948f,-58.5938f, --199.219f,14.4053f,-58.5938f, --195.313f,16.1496f,-58.5938f, --191.406f,17.8653f,-58.5938f, --187.5f,18.9853f,-58.5938f, --183.594f,21.2985f,-58.5938f, --179.688f,23.4932f,-58.5938f, --175.781f,25.3544f,-58.5938f, --171.875f,26.1087f,-58.5938f, --167.969f,26.5864f,-58.5938f, --164.063f,25.8729f,-58.5938f, --160.156f,25.0068f,-58.5938f, --156.25f,25.2867f,-58.5938f, --152.344f,23.9482f,-58.5938f, --148.438f,23.23f,-58.5938f, --144.531f,22.6171f,-58.5938f, --140.625f,21.4991f,-58.5938f, --136.719f,21.0822f,-58.5938f, --132.813f,21.0037f,-58.5938f, --128.906f,21.8362f,-58.5938f, --125.0f,21.5985f,-58.5938f, --121.094f,20.951f,-58.5938f, --117.188f,21.2066f,-58.5938f, --113.281f,19.7479f,-58.5938f, --109.375f,18.5787f,-58.5938f, --105.469f,20.3984f,-58.5938f, --101.563f,22.257f,-58.5938f, --97.6563f,23.3411f,-58.5938f, --93.75f,24.362f,-58.5938f, --89.8438f,25.7544f,-58.5938f, --85.9375f,27.7522f,-58.5938f, --82.0313f,28.9204f,-58.5938f, --78.125f,30.8124f,-58.5938f, --74.2188f,32.9097f,-58.5938f, --70.3125f,34.8737f,-58.5938f, --66.4063f,36.0518f,-58.5938f, --62.5f,38.506f,-58.5938f, --58.5938f,41.2951f,-58.5938f, --54.6875f,43.3387f,-58.5938f, --50.7813f,46.5457f,-58.5938f, --46.875f,49.2409f,-58.5938f, --42.9688f,51.3946f,-58.5938f, --39.0625f,54.0957f,-58.5938f, --35.1563f,55.8205f,-58.5938f, --31.25f,57.094f,-58.5938f, --27.3438f,58.0636f,-58.5938f, --23.4375f,58.8159f,-58.5938f, --19.5313f,59.9761f,-58.5938f, --15.625f,60.2094f,-58.5938f, --11.7188f,60.0275f,-58.5938f, --7.8125f,61.0991f,-58.5938f, --3.90625f,61.4786f,-58.5938f, -0.0f,61.4895f,-58.5938f, -3.90625f,61.5747f,-58.5938f, --250.0f,5.54938f,-62.5f, --246.094f,4.18374f,-62.5f, --242.188f,3.90057f,-62.5f, --238.281f,4.25951f,-62.5f, --234.375f,4.82365f,-62.5f, --230.469f,6.03197f,-62.5f, --226.563f,7.69909f,-62.5f, --222.656f,8.80826f,-62.5f, --218.75f,10.8241f,-62.5f, --214.844f,13.5771f,-62.5f, --210.938f,14.456f,-62.5f, --207.031f,15.0395f,-62.5f, --203.125f,14.5505f,-62.5f, --199.219f,16.1706f,-62.5f, --195.313f,16.9508f,-62.5f, --191.406f,18.2016f,-62.5f, --187.5f,19.8694f,-62.5f, --183.594f,22.6167f,-62.5f, --179.688f,24.5727f,-62.5f, --175.781f,26.0063f,-62.5f, --171.875f,26.0399f,-62.5f, --167.969f,26.6416f,-62.5f, --164.063f,25.6476f,-62.5f, --160.156f,24.4615f,-62.5f, --156.25f,23.5295f,-62.5f, --152.344f,23.7879f,-62.5f, --148.438f,22.8826f,-62.5f, --144.531f,21.6558f,-62.5f, --140.625f,20.6405f,-62.5f, --136.719f,20.1695f,-62.5f, --132.813f,20.7715f,-62.5f, --128.906f,20.5918f,-62.5f, --125.0f,20.4476f,-62.5f, --121.094f,19.9068f,-62.5f, --117.188f,19.4838f,-62.5f, --113.281f,17.843f,-62.5f, --109.375f,18.5661f,-62.5f, --105.469f,20.1106f,-62.5f, --101.563f,21.3182f,-62.5f, --97.6563f,23.2851f,-62.5f, --93.75f,24.3601f,-62.5f, --89.8438f,26.3742f,-62.5f, --85.9375f,27.7409f,-62.5f, --82.0313f,29.533f,-62.5f, --78.125f,31.5622f,-62.5f, --74.2188f,33.2773f,-62.5f, --70.3125f,35.6025f,-62.5f, --66.4063f,38.4255f,-62.5f, --62.5f,40.916f,-62.5f, --58.5938f,43.9378f,-62.5f, --54.6875f,45.9116f,-62.5f, --50.7813f,48.3177f,-62.5f, --46.875f,50.1977f,-62.5f, --42.9688f,52.4552f,-62.5f, --39.0625f,54.6779f,-62.5f, --35.1563f,56.1564f,-62.5f, --31.25f,57.5665f,-62.5f, --27.3438f,58.7762f,-62.5f, --23.4375f,59.115f,-62.5f, --19.5313f,58.5535f,-62.5f, --15.625f,58.2117f,-62.5f, --11.7188f,59.0863f,-62.5f, --7.8125f,60.3775f,-62.5f, --3.90625f,61.0192f,-62.5f, -0.0f,61.864f,-62.5f, -3.90625f,62.1111f,-62.5f, --250.0f,6.08003f,-66.4063f, --246.094f,5.13458f,-66.4063f, --242.188f,5.0967f,-66.4063f, --238.281f,5.36926f,-66.4063f, --234.375f,5.21926f,-66.4063f, --230.469f,6.37997f,-66.4063f, --226.563f,7.85032f,-66.4063f, --222.656f,9.36117f,-66.4063f, --218.75f,11.896f,-66.4063f, --214.844f,13.9549f,-66.4063f, --210.938f,15.4673f,-66.4063f, --207.031f,15.9885f,-66.4063f, --203.125f,16.4425f,-66.4063f, --199.219f,17.4253f,-66.4063f, --195.313f,18.1385f,-66.4063f, --191.406f,18.8676f,-66.4063f, --187.5f,20.1316f,-66.4063f, --183.594f,22.8534f,-66.4063f, --179.688f,24.5364f,-66.4063f, --175.781f,25.6234f,-66.4063f, --171.875f,25.9362f,-66.4063f, --167.969f,25.7735f,-66.4063f, --164.063f,25.1524f,-66.4063f, --160.156f,24.4245f,-66.4063f, --156.25f,22.8769f,-66.4063f, --152.344f,22.8762f,-66.4063f, --148.438f,21.9008f,-66.4063f, --144.531f,20.9242f,-66.4063f, --140.625f,20.1022f,-66.4063f, --136.719f,19.5823f,-66.4063f, --132.813f,19.4415f,-66.4063f, --128.906f,18.9513f,-66.4063f, --125.0f,18.9264f,-66.4063f, --121.094f,18.6878f,-66.4063f, --117.188f,17.8998f,-66.4063f, --113.281f,17.9815f,-66.4063f, --109.375f,18.2652f,-66.4063f, --105.469f,19.533f,-66.4063f, --101.563f,21.0045f,-66.4063f, --97.6563f,22.2461f,-66.4063f, --93.75f,23.7189f,-66.4063f, --89.8438f,25.574f,-66.4063f, --85.9375f,27.55f,-66.4063f, --82.0313f,29.733f,-66.4063f, --78.125f,31.0763f,-66.4063f, --74.2188f,33.9607f,-66.4063f, --70.3125f,37.3595f,-66.4063f, --66.4063f,41.019f,-66.4063f, --62.5f,43.7286f,-66.4063f, --58.5938f,46.5077f,-66.4063f, --54.6875f,47.985f,-66.4063f, --50.7813f,49.2623f,-66.4063f, --46.875f,50.9465f,-66.4063f, --42.9688f,52.912f,-66.4063f, --39.0625f,55.0349f,-66.4063f, --35.1563f,56.428f,-66.4063f, --31.25f,57.3951f,-66.4063f, --27.3438f,58.5332f,-66.4063f, --23.4375f,58.3328f,-66.4063f, --19.5313f,56.9549f,-66.4063f, --15.625f,56.9387f,-66.4063f, --11.7188f,58.3656f,-66.4063f, --7.8125f,59.6577f,-66.4063f, --3.90625f,59.8566f,-66.4063f, -0.0f,60.693f,-66.4063f, -3.90625f,60.8569f,-66.4063f, --250.0f,6.38861f,-70.3125f, --246.094f,6.37976f,-70.3125f, --242.188f,6.52455f,-70.3125f, --238.281f,6.93657f,-70.3125f, --234.375f,6.77321f,-70.3125f, --230.469f,7.26034f,-70.3125f, --226.563f,8.99316f,-70.3125f, --222.656f,10.5015f,-70.3125f, --218.75f,11.631f,-70.3125f, --214.844f,14.0548f,-70.3125f, --210.938f,15.9163f,-70.3125f, --207.031f,16.6824f,-70.3125f, --203.125f,17.1063f,-70.3125f, --199.219f,18.066f,-70.3125f, --195.313f,18.5539f,-70.3125f, --191.406f,18.8425f,-70.3125f, --187.5f,20.7731f,-70.3125f, --183.594f,22.8929f,-70.3125f, --179.688f,24.2011f,-70.3125f, --175.781f,24.5512f,-70.3125f, --171.875f,24.651f,-70.3125f, --167.969f,23.9906f,-70.3125f, --164.063f,23.6279f,-70.3125f, --160.156f,23.6162f,-70.3125f, --156.25f,22.3196f,-70.3125f, --152.344f,22.173f,-70.3125f, --148.438f,20.6833f,-70.3125f, --144.531f,19.6848f,-70.3125f, --140.625f,18.4633f,-70.3125f, --136.719f,18.2692f,-70.3125f, --132.813f,18.0595f,-70.3125f, --128.906f,17.2062f,-70.3125f, --125.0f,17.0103f,-70.3125f, --121.094f,17.1584f,-70.3125f, --117.188f,17.5441f,-70.3125f, --113.281f,17.5669f,-70.3125f, --109.375f,17.7536f,-70.3125f, --105.469f,18.3913f,-70.3125f, --101.563f,19.7264f,-70.3125f, --97.6563f,20.8943f,-70.3125f, --93.75f,22.7517f,-70.3125f, --89.8438f,25.1479f,-70.3125f, --85.9375f,27.3953f,-70.3125f, --82.0313f,29.5127f,-70.3125f, --78.125f,31.2816f,-70.3125f, --74.2188f,34.6589f,-70.3125f, --70.3125f,38.2161f,-70.3125f, --66.4063f,42.3872f,-70.3125f, --62.5f,45.4363f,-70.3125f, --58.5938f,47.0181f,-70.3125f, --54.6875f,48.7348f,-70.3125f, --50.7813f,49.8739f,-70.3125f, --46.875f,51.2434f,-70.3125f, --42.9688f,52.9444f,-70.3125f, --39.0625f,54.8413f,-70.3125f, --35.1563f,55.8776f,-70.3125f, --31.25f,56.9088f,-70.3125f, --27.3438f,56.8827f,-70.3125f, --23.4375f,56.1649f,-70.3125f, --19.5313f,54.9828f,-70.3125f, --15.625f,56.5543f,-70.3125f, --11.7188f,58.0071f,-70.3125f, --7.8125f,58.1204f,-70.3125f, --3.90625f,58.8019f,-70.3125f, -0.0f,59.3765f,-70.3125f, -3.90625f,59.1482f,-70.3125f, --250.0f,7.29753f,-74.2188f, --246.094f,6.9318f,-74.2188f, --242.188f,7.9493f,-74.2188f, --238.281f,7.61482f,-74.2188f, --234.375f,8.38948f,-74.2188f, --230.469f,8.85034f,-74.2188f, --226.563f,10.783f,-74.2188f, --222.656f,12.203f,-74.2188f, --218.75f,12.7122f,-74.2188f, --214.844f,14.2813f,-74.2188f, --210.938f,16.1159f,-74.2188f, --207.031f,16.8501f,-74.2188f, --203.125f,17.728f,-74.2188f, --199.219f,18.6948f,-74.2188f, --195.313f,19.0254f,-74.2188f, --191.406f,18.9874f,-74.2188f, --187.5f,20.7575f,-74.2188f, --183.594f,22.4682f,-74.2188f, --179.688f,23.785f,-74.2188f, --175.781f,23.136f,-74.2188f, --171.875f,22.2872f,-74.2188f, --167.969f,21.9381f,-74.2188f, --164.063f,22.818f,-74.2188f, --160.156f,21.8019f,-74.2188f, --156.25f,21.3496f,-74.2188f, --152.344f,19.9092f,-74.2188f, --148.438f,19.5338f,-74.2188f, --144.531f,19.2227f,-74.2188f, --140.625f,17.2583f,-74.2188f, --136.719f,15.7727f,-74.2188f, --132.813f,15.2069f,-74.2188f, --128.906f,15.0929f,-74.2188f, --125.0f,15.3066f,-74.2188f, --121.094f,15.1161f,-74.2188f, --117.188f,16.1171f,-74.2188f, --113.281f,17.2851f,-74.2188f, --109.375f,16.8359f,-74.2188f, --105.469f,17.6612f,-74.2188f, --101.563f,18.1651f,-74.2188f, --97.6563f,18.9354f,-74.2188f, --93.75f,21.1152f,-74.2188f, --89.8438f,23.9267f,-74.2188f, --85.9375f,26.5361f,-74.2188f, --82.0313f,29.6007f,-74.2188f, --78.125f,31.8355f,-74.2188f, --74.2188f,34.5711f,-74.2188f, --70.3125f,37.6211f,-74.2188f, --66.4063f,41.978f,-74.2188f, --62.5f,44.757f,-74.2188f, --58.5938f,47.2561f,-74.2188f, --54.6875f,48.796f,-74.2188f, --50.7813f,50.085f,-74.2188f, --46.875f,51.427f,-74.2188f, --42.9688f,52.9103f,-74.2188f, --39.0625f,53.6345f,-74.2188f, --35.1563f,55.5589f,-74.2188f, --31.25f,56.4557f,-74.2188f, --27.3438f,55.8259f,-74.2188f, --23.4375f,55.2472f,-74.2188f, --19.5313f,54.9161f,-74.2188f, --15.625f,56.2403f,-74.2188f, --11.7188f,57.7266f,-74.2188f, --7.8125f,57.6855f,-74.2188f, --3.90625f,57.4796f,-74.2188f, -0.0f,56.3955f,-74.2188f, -3.90625f,56.5167f,-74.2188f, --250.0f,8.88618f,-78.125f, --246.094f,8.31776f,-78.125f, --242.188f,8.67289f,-78.125f, --238.281f,9.52219f,-78.125f, --234.375f,9.78196f,-78.125f, --230.469f,11.3032f,-78.125f, --226.563f,13.1558f,-78.125f, --222.656f,14.4361f,-78.125f, --218.75f,15.5721f,-78.125f, --214.844f,14.3491f,-78.125f, --210.938f,15.6393f,-78.125f, --207.031f,16.9133f,-78.125f, --203.125f,18.1402f,-78.125f, --199.219f,19.179f,-78.125f, --195.313f,18.9448f,-78.125f, --191.406f,19.5289f,-78.125f, --187.5f,20.8547f,-78.125f, --183.594f,22.7611f,-78.125f, --179.688f,22.8314f,-78.125f, --175.781f,21.815f,-78.125f, --171.875f,22.2112f,-78.125f, --167.969f,21.9322f,-78.125f, --164.063f,21.3024f,-78.125f, --160.156f,20.354f,-78.125f, --156.25f,19.8588f,-78.125f, --152.344f,17.8458f,-78.125f, --148.438f,18.0613f,-78.125f, --144.531f,17.0664f,-78.125f, --140.625f,16.2256f,-78.125f, --136.719f,14.3082f,-78.125f, --132.813f,13.3463f,-78.125f, --128.906f,14.3881f,-78.125f, --125.0f,14.6865f,-78.125f, --121.094f,14.2011f,-78.125f, --117.188f,15.4562f,-78.125f, --113.281f,16.6171f,-78.125f, --109.375f,16.2869f,-78.125f, --105.469f,15.9406f,-78.125f, --101.563f,17.5579f,-78.125f, --97.6563f,19.157f,-78.125f, --93.75f,21.0678f,-78.125f, --89.8438f,23.1633f,-78.125f, --85.9375f,25.2991f,-78.125f, --82.0313f,28.9462f,-78.125f, --78.125f,31.8594f,-78.125f, --74.2188f,35.2294f,-78.125f, --70.3125f,36.9557f,-78.125f, --66.4063f,40.692f,-78.125f, --62.5f,44.5904f,-78.125f, --58.5938f,46.9805f,-78.125f, --54.6875f,48.3073f,-78.125f, --50.7813f,49.8001f,-78.125f, --46.875f,51.4881f,-78.125f, --42.9688f,52.7488f,-78.125f, --39.0625f,53.0994f,-78.125f, --35.1563f,54.6505f,-78.125f, --31.25f,55.3393f,-78.125f, --27.3438f,55.3608f,-78.125f, --23.4375f,54.3833f,-78.125f, --19.5313f,53.9595f,-78.125f, --15.625f,55.0695f,-78.125f, --11.7188f,56.423f,-78.125f, --7.8125f,56.1568f,-78.125f, --3.90625f,56.2841f,-78.125f, -0.0f,54.7508f,-78.125f, -3.90625f,54.4402f,-78.125f, --250.0f,10.7839f,-82.0313f, --246.094f,10.1255f,-82.0313f, --242.188f,10.6621f,-82.0313f, --238.281f,11.4172f,-82.0313f, --234.375f,12.3063f,-82.0313f, --230.469f,13.4915f,-82.0313f, --226.563f,14.9113f,-82.0313f, --222.656f,16.5463f,-82.0313f, --218.75f,17.3752f,-82.0313f, --214.844f,16.6701f,-82.0313f, --210.938f,15.5847f,-82.0313f, --207.031f,16.6988f,-82.0313f, --203.125f,17.6449f,-82.0313f, --199.219f,18.4976f,-82.0313f, --195.313f,18.033f,-82.0313f, --191.406f,19.1758f,-82.0313f, --187.5f,20.7116f,-82.0313f, --183.594f,21.5492f,-82.0313f, --179.688f,20.7908f,-82.0313f, --175.781f,20.6891f,-82.0313f, --171.875f,21.6368f,-82.0313f, --167.969f,21.6862f,-82.0313f, --164.063f,20.4236f,-82.0313f, --160.156f,19.4449f,-82.0313f, --156.25f,17.8718f,-82.0313f, --152.344f,16.0984f,-82.0313f, --148.438f,16.1225f,-82.0313f, --144.531f,15.3001f,-82.0313f, --140.625f,14.0113f,-82.0313f, --136.719f,12.7128f,-82.0313f, --132.813f,13.1695f,-82.0313f, --128.906f,14.1608f,-82.0313f, --125.0f,14.006f,-82.0313f, --121.094f,13.5671f,-82.0313f, --117.188f,14.799f,-82.0313f, --113.281f,15.6819f,-82.0313f, --109.375f,15.1047f,-82.0313f, --105.469f,15.4826f,-82.0313f, --101.563f,17.2178f,-82.0313f, --97.6563f,19.1794f,-82.0313f, --93.75f,21.3021f,-82.0313f, --89.8438f,21.9981f,-82.0313f, --85.9375f,24.4031f,-82.0313f, --82.0313f,28.8062f,-82.0313f, --78.125f,31.7576f,-82.0313f, --74.2188f,34.6198f,-82.0313f, --70.3125f,37.0145f,-82.0313f, --66.4063f,39.5952f,-82.0313f, --62.5f,43.4294f,-82.0313f, --58.5938f,45.9611f,-82.0313f, --54.6875f,47.398f,-82.0313f, --50.7813f,49.5672f,-82.0313f, --46.875f,51.4863f,-82.0313f, --42.9688f,52.3277f,-82.0313f, --39.0625f,52.6736f,-82.0313f, --35.1563f,53.5554f,-82.0313f, --31.25f,54.4611f,-82.0313f, --27.3438f,53.3151f,-82.0313f, --23.4375f,52.9631f,-82.0313f, --19.5313f,52.3147f,-82.0313f, --15.625f,53.7891f,-82.0313f, --11.7188f,54.3962f,-82.0313f, --7.8125f,54.2326f,-82.0313f, --3.90625f,53.6717f,-82.0313f, -0.0f,52.8681f,-82.0313f, -3.90625f,51.949f,-82.0313f, --250.0f,12.2756f,-85.9375f, --246.094f,11.9011f,-85.9375f, --242.188f,13.4495f,-85.9375f, --238.281f,14.3858f,-85.9375f, --234.375f,14.855f,-85.9375f, --230.469f,15.3384f,-85.9375f, --226.563f,17.3357f,-85.9375f, --222.656f,18.7108f,-85.9375f, --218.75f,18.0095f,-85.9375f, --214.844f,17.4308f,-85.9375f, --210.938f,17.0565f,-85.9375f, --207.031f,16.4039f,-85.9375f, --203.125f,17.3449f,-85.9375f, --199.219f,17.5816f,-85.9375f, --195.313f,17.7511f,-85.9375f, --191.406f,18.792f,-85.9375f, --187.5f,19.7983f,-85.9375f, --183.594f,19.6069f,-85.9375f, --179.688f,19.1396f,-85.9375f, --175.781f,19.0184f,-85.9375f, --171.875f,19.7492f,-85.9375f, --167.969f,19.6428f,-85.9375f, --164.063f,18.6091f,-85.9375f, --160.156f,18.1998f,-85.9375f, --156.25f,16.6809f,-85.9375f, --152.344f,15.0269f,-85.9375f, --148.438f,13.3773f,-85.9375f, --144.531f,12.7371f,-85.9375f, --140.625f,12.2537f,-85.9375f, --136.719f,12.6536f,-85.9375f, --132.813f,12.7798f,-85.9375f, --128.906f,13.2089f,-85.9375f, --125.0f,12.8356f,-85.9375f, --121.094f,12.5484f,-85.9375f, --117.188f,13.5275f,-85.9375f, --113.281f,13.5387f,-85.9375f, --109.375f,13.6111f,-85.9375f, --105.469f,14.7023f,-85.9375f, --101.563f,16.6526f,-85.9375f, --97.6563f,17.9729f,-85.9375f, --93.75f,19.8258f,-85.9375f, --89.8438f,21.7903f,-85.9375f, --85.9375f,23.4003f,-85.9375f, --82.0313f,27.4381f,-85.9375f, --78.125f,30.1644f,-85.9375f, --74.2188f,33.7682f,-85.9375f, --70.3125f,36.1779f,-85.9375f, --66.4063f,38.1368f,-85.9375f, --62.5f,41.5768f,-85.9375f, --58.5938f,43.7832f,-85.9375f, --54.6875f,45.866f,-85.9375f, --50.7813f,48.5751f,-85.9375f, --46.875f,50.4188f,-85.9375f, --42.9688f,51.0239f,-85.9375f, --39.0625f,51.2389f,-85.9375f, --35.1563f,51.8865f,-85.9375f, --31.25f,52.9036f,-85.9375f, --27.3438f,52.5405f,-85.9375f, --23.4375f,52.3296f,-85.9375f, --19.5313f,52.5889f,-85.9375f, --15.625f,52.3033f,-85.9375f, --11.7188f,52.1239f,-85.9375f, --7.8125f,52.0608f,-85.9375f, --3.90625f,51.0213f,-85.9375f, -0.0f,50.5601f,-85.9375f, -3.90625f,50.007f,-85.9375f, --250.0f,13.6424f,-89.8438f, --246.094f,14.2919f,-89.8438f, --242.188f,15.9647f,-89.8438f, --238.281f,17.1274f,-89.8438f, --234.375f,17.9206f,-89.8438f, --230.469f,17.9917f,-89.8438f, --226.563f,19.3423f,-89.8438f, --222.656f,20.1401f,-89.8438f, --218.75f,19.295f,-89.8438f, --214.844f,18.1101f,-89.8438f, --210.938f,17.3485f,-89.8438f, --207.031f,17.1077f,-89.8438f, --203.125f,17.7413f,-89.8438f, --199.219f,17.2325f,-89.8438f, --195.313f,17.6696f,-89.8438f, --191.406f,18.8437f,-89.8438f, --187.5f,19.1808f,-89.8438f, --183.594f,18.6366f,-89.8438f, --179.688f,17.3251f,-89.8438f, --175.781f,17.5752f,-89.8438f, --171.875f,18.1005f,-89.8438f, --167.969f,18.0907f,-89.8438f, --164.063f,16.519f,-89.8438f, --160.156f,15.5225f,-89.8438f, --156.25f,14.3937f,-89.8438f, --152.344f,13.4199f,-89.8438f, --148.438f,12.8584f,-89.8438f, --144.531f,12.8604f,-89.8438f, --140.625f,12.2817f,-89.8438f, --136.719f,12.4113f,-89.8438f, --132.813f,12.9949f,-89.8438f, --128.906f,11.9716f,-89.8438f, --125.0f,11.8348f,-89.8438f, --121.094f,12.2532f,-89.8438f, --117.188f,12.5983f,-89.8438f, --113.281f,13.2095f,-89.8438f, --109.375f,13.7209f,-89.8438f, --105.469f,13.8655f,-89.8438f, --101.563f,14.8679f,-89.8438f, --97.6563f,16.1039f,-89.8438f, --93.75f,17.9997f,-89.8438f, --89.8438f,20.0247f,-89.8438f, --85.9375f,22.8012f,-89.8438f, --82.0313f,25.8255f,-89.8438f, --78.125f,29.0288f,-89.8438f, --74.2188f,31.8325f,-89.8438f, --70.3125f,34.2688f,-89.8438f, --66.4063f,37.2576f,-89.8438f, --62.5f,40.8036f,-89.8438f, --58.5938f,43.0354f,-89.8438f, --54.6875f,44.5176f,-89.8438f, --50.7813f,47.4827f,-89.8438f, --46.875f,48.9307f,-89.8438f, --42.9688f,48.82f,-89.8438f, --39.0625f,48.8887f,-89.8438f, --35.1563f,50.05f,-89.8438f, --31.25f,50.9253f,-89.8438f, --27.3438f,52.3859f,-89.8438f, --23.4375f,52.2702f,-89.8438f, --19.5313f,52.0708f,-89.8438f, --15.625f,51.2832f,-89.8438f, --11.7188f,50.0989f,-89.8438f, --7.8125f,49.6111f,-89.8438f, --3.90625f,48.7785f,-89.8438f, -0.0f,48.7183f,-89.8438f, -3.90625f,47.6596f,-89.8438f, --250.0f,15.247f,-93.75f, --246.094f,17.6018f,-93.75f, --242.188f,19.2494f,-93.75f, --238.281f,20.8362f,-93.75f, --234.375f,20.4345f,-93.75f, --230.469f,21.1572f,-93.75f, --226.563f,21.3131f,-93.75f, --222.656f,20.8797f,-93.75f, --218.75f,20.5347f,-93.75f, --214.844f,19.3559f,-93.75f, --210.938f,18.2443f,-93.75f, --207.031f,17.5994f,-93.75f, --203.125f,18.0336f,-93.75f, --199.219f,18.0561f,-93.75f, --195.313f,17.673f,-93.75f, --191.406f,18.7132f,-93.75f, --187.5f,18.4272f,-93.75f, --183.594f,18.078f,-93.75f, --179.688f,16.7984f,-93.75f, --175.781f,16.1827f,-93.75f, --171.875f,16.5937f,-93.75f, --167.969f,16.0698f,-93.75f, --164.063f,14.9813f,-93.75f, --160.156f,13.1718f,-93.75f, --156.25f,12.1738f,-93.75f, --152.344f,12.229f,-93.75f, --148.438f,12.2803f,-93.75f, --144.531f,12.526f,-93.75f, --140.625f,11.9028f,-93.75f, --136.719f,12.3491f,-93.75f, --132.813f,11.7412f,-93.75f, --128.906f,11.5455f,-93.75f, --125.0f,11.6285f,-93.75f, --121.094f,11.478f,-93.75f, --117.188f,11.536f,-93.75f, --113.281f,11.8722f,-93.75f, --109.375f,12.61f,-93.75f, --105.469f,12.6899f,-93.75f, --101.563f,13.1659f,-93.75f, --97.6563f,14.5994f,-93.75f, --93.75f,16.6015f,-93.75f, --89.8438f,19.9429f,-93.75f, --85.9375f,22.8876f,-93.75f, --82.0313f,26.3209f,-93.75f, --78.125f,28.8526f,-93.75f, --74.2188f,30.2969f,-93.75f, --70.3125f,33.1597f,-93.75f, --66.4063f,36.2648f,-93.75f, --62.5f,39.1918f,-93.75f, --58.5938f,41.4171f,-93.75f, --54.6875f,43.4299f,-93.75f, --50.7813f,45.5438f,-93.75f, --46.875f,46.6281f,-93.75f, --42.9688f,46.784f,-93.75f, --39.0625f,47.3415f,-93.75f, --35.1563f,48.5539f,-93.75f, --31.25f,50.5714f,-93.75f, --27.3438f,51.0532f,-93.75f, --23.4375f,51.7685f,-93.75f, --19.5313f,51.3638f,-93.75f, --15.625f,49.6289f,-93.75f, --11.7188f,50.0322f,-93.75f, --7.8125f,48.6289f,-93.75f, --3.90625f,46.7733f,-93.75f, -0.0f,45.5993f,-93.75f, -3.90625f,45.4182f,-93.75f, --250.0f,18.5038f,-97.6563f, --246.094f,20.1199f,-97.6563f, --242.188f,22.7365f,-97.6563f, --238.281f,24.311f,-97.6563f, --234.375f,24.2572f,-97.6563f, --230.469f,24.3322f,-97.6563f, --226.563f,24.3501f,-97.6563f, --222.656f,23.3494f,-97.6563f, --218.75f,21.7677f,-97.6563f, --214.844f,20.6573f,-97.6563f, --210.938f,18.8509f,-97.6563f, --207.031f,18.1355f,-97.6563f, --203.125f,18.5785f,-97.6563f, --199.219f,18.2049f,-97.6563f, --195.313f,17.4136f,-97.6563f, --191.406f,18.6105f,-97.6563f, --187.5f,18.0859f,-97.6563f, --183.594f,17.3286f,-97.6563f, --179.688f,16.66f,-97.6563f, --175.781f,15.1619f,-97.6563f, --171.875f,14.271f,-97.6563f, --167.969f,13.4801f,-97.6563f, --164.063f,12.6373f,-97.6563f, --160.156f,11.4464f,-97.6563f, --156.25f,11.5423f,-97.6563f, --152.344f,11.795f,-97.6563f, --148.438f,10.9108f,-97.6563f, --144.531f,11.2217f,-97.6563f, --140.625f,11.0533f,-97.6563f, --136.719f,11.5512f,-97.6563f, --132.813f,11.6628f,-97.6563f, --128.906f,10.9589f,-97.6563f, --125.0f,10.3779f,-97.6563f, --121.094f,9.96294f,-97.6563f, --117.188f,10.6728f,-97.6563f, --113.281f,11.2587f,-97.6563f, --109.375f,11.2512f,-97.6563f, --105.469f,12.1215f,-97.6563f, --101.563f,12.0908f,-97.6563f, --97.6563f,13.5835f,-97.6563f, --93.75f,16.6536f,-97.6563f, --89.8438f,19.7104f,-97.6563f, --85.9375f,22.8325f,-97.6563f, --82.0313f,26.7422f,-97.6563f, --78.125f,29.4762f,-97.6563f, --74.2188f,30.148f,-97.6563f, --70.3125f,33.5961f,-97.6563f, --66.4063f,36.1685f,-97.6563f, --62.5f,37.3648f,-97.6563f, --58.5938f,39.4445f,-97.6563f, --54.6875f,40.3698f,-97.6563f, --50.7813f,43.2595f,-97.6563f, --46.875f,43.8006f,-97.6563f, --42.9688f,44.8371f,-97.6563f, --39.0625f,46.8993f,-97.6563f, --35.1563f,48.8152f,-97.6563f, --31.25f,50.2801f,-97.6563f, --27.3438f,49.7242f,-97.6563f, --23.4375f,49.8502f,-97.6563f, --19.5313f,49.8568f,-97.6563f, --15.625f,48.3267f,-97.6563f, --11.7188f,47.8521f,-97.6563f, --7.8125f,47.3364f,-97.6563f, --3.90625f,46.156f,-97.6563f, -0.0f,44.8966f,-97.6563f, -3.90625f,44.9637f,-97.6563f, --250.0f,21.0334f,-101.563f, --246.094f,23.093f,-101.563f, --242.188f,25.4189f,-101.563f, --238.281f,27.31f,-101.563f, --234.375f,26.8223f,-101.563f, --230.469f,26.375f,-101.563f, --226.563f,26.7718f,-101.563f, --222.656f,25.3642f,-101.563f, --218.75f,23.7619f,-101.563f, --214.844f,21.4458f,-101.563f, --210.938f,19.7809f,-101.563f, --207.031f,19.054f,-101.563f, --203.125f,19.6087f,-101.563f, --199.219f,19.2503f,-101.563f, --195.313f,18.0809f,-101.563f, --191.406f,17.75f,-101.563f, --187.5f,17.1292f,-101.563f, --183.594f,16.2151f,-101.563f, --179.688f,15.8928f,-101.563f, --175.781f,14.4866f,-101.563f, --171.875f,13.9039f,-101.563f, --167.969f,12.278f,-101.563f, --164.063f,11.5804f,-101.563f, --160.156f,12.0152f,-101.563f, --156.25f,11.7113f,-101.563f, --152.344f,10.7496f,-101.563f, --148.438f,9.67121f,-101.563f, --144.531f,9.72628f,-101.563f, --140.625f,9.99849f,-101.563f, --136.719f,10.504f,-101.563f, --132.813f,11.0917f,-101.563f, --128.906f,10.4997f,-101.563f, --125.0f,9.12306f,-101.563f, --121.094f,8.34841f,-101.563f, --117.188f,8.92074f,-101.563f, --113.281f,9.44857f,-101.563f, --109.375f,10.5456f,-101.563f, --105.469f,10.7435f,-101.563f, --101.563f,11.6413f,-101.563f, --97.6563f,14.2233f,-101.563f, --93.75f,17.0641f,-101.563f, --89.8438f,20.5963f,-101.563f, --85.9375f,22.9601f,-101.563f, --82.0313f,26.0881f,-101.563f, --78.125f,28.3451f,-101.563f, --74.2188f,30.4473f,-101.563f, --70.3125f,33.7644f,-101.563f, --66.4063f,36.3074f,-101.563f, --62.5f,38.0683f,-101.563f, --58.5938f,39.1597f,-101.563f, --54.6875f,40.3396f,-101.563f, --50.7813f,41.4946f,-101.563f, --46.875f,43.0029f,-101.563f, --42.9688f,44.8434f,-101.563f, --39.0625f,47.2094f,-101.563f, --35.1563f,47.3449f,-101.563f, --31.25f,49.1989f,-101.563f, --27.3438f,48.845f,-101.563f, --23.4375f,47.635f,-101.563f, --19.5313f,47.9355f,-101.563f, --15.625f,47.1439f,-101.563f, --11.7188f,45.929f,-101.563f, --7.8125f,46.9058f,-101.563f, --3.90625f,46.1235f,-101.563f, -0.0f,45.2655f,-101.563f, -3.90625f,44.5311f,-101.563f, --250.0f,24.0006f,-105.469f, --246.094f,26.733f,-105.469f, --242.188f,28.4305f,-105.469f, --238.281f,29.0431f,-105.469f, --234.375f,28.1582f,-105.469f, --230.469f,28.0178f,-105.469f, --226.563f,27.4417f,-105.469f, --222.656f,27.0081f,-105.469f, --218.75f,24.9646f,-105.469f, --214.844f,22.8713f,-105.469f, --210.938f,21.4507f,-105.469f, --207.031f,21.2058f,-105.469f, --203.125f,20.8114f,-105.469f, --199.219f,20.7281f,-105.469f, --195.313f,19.7358f,-105.469f, --191.406f,18.4733f,-105.469f, --187.5f,17.1875f,-105.469f, --183.594f,15.4383f,-105.469f, --179.688f,14.151f,-105.469f, --175.781f,13.882f,-105.469f, --171.875f,12.9008f,-105.469f, --167.969f,11.246f,-105.469f, --164.063f,11.1287f,-105.469f, --160.156f,10.748f,-105.469f, --156.25f,11.5003f,-105.469f, --152.344f,10.3683f,-105.469f, --148.438f,9.87346f,-105.469f, --144.531f,9.6524f,-105.469f, --140.625f,8.36957f,-105.469f, --136.719f,9.12242f,-105.469f, --132.813f,9.41585f,-105.469f, --128.906f,8.97735f,-105.469f, --125.0f,7.89593f,-105.469f, --121.094f,7.20155f,-105.469f, --117.188f,6.63681f,-105.469f, --113.281f,8.27572f,-105.469f, --109.375f,8.39126f,-105.469f, --105.469f,9.69363f,-105.469f, --101.563f,12.2269f,-105.469f, --97.6563f,15.3785f,-105.469f, --93.75f,18.1643f,-105.469f, --89.8438f,20.8715f,-105.469f, --85.9375f,23.5096f,-105.469f, --82.0313f,25.2072f,-105.469f, --78.125f,27.8536f,-105.469f, --74.2188f,30.8436f,-105.469f, --70.3125f,33.8966f,-105.469f, --66.4063f,36.3107f,-105.469f, --62.5f,37.9291f,-105.469f, --58.5938f,39.7963f,-105.469f, --54.6875f,40.5554f,-105.469f, --50.7813f,42.1374f,-105.469f, --46.875f,42.7622f,-105.469f, --42.9688f,44.5703f,-105.469f, --39.0625f,46.4665f,-105.469f, --35.1563f,46.6101f,-105.469f, --31.25f,47.1188f,-105.469f, --27.3438f,48.052f,-105.469f, --23.4375f,47.7845f,-105.469f, --19.5313f,47.8159f,-105.469f, --15.625f,46.7772f,-105.469f, --11.7188f,46.0033f,-105.469f, --7.8125f,47.2861f,-105.469f, --3.90625f,46.9832f,-105.469f, -0.0f,45.6472f,-105.469f, -3.90625f,44.8466f,-105.469f, --250.0f,27.0053f,-109.375f, --246.094f,28.4873f,-109.375f, --242.188f,29.8219f,-109.375f, --238.281f,30.0561f,-109.375f, --234.375f,29.2892f,-109.375f, --230.469f,29.5933f,-109.375f, --226.563f,28.8697f,-109.375f, --222.656f,27.4881f,-109.375f, --218.75f,25.7165f,-109.375f, --214.844f,23.9985f,-109.375f, --210.938f,23.3958f,-109.375f, --207.031f,23.3567f,-109.375f, --203.125f,23.3311f,-109.375f, --199.219f,22.2114f,-109.375f, --195.313f,21.0452f,-109.375f, --191.406f,20.2153f,-109.375f, --187.5f,18.8202f,-109.375f, --183.594f,16.7998f,-109.375f, --179.688f,15.8942f,-109.375f, --175.781f,14.8638f,-109.375f, --171.875f,13.1475f,-109.375f, --167.969f,12.7375f,-109.375f, --164.063f,10.7456f,-109.375f, --160.156f,10.2908f,-109.375f, --156.25f,9.65347f,-109.375f, --152.344f,10.1273f,-109.375f, --148.438f,9.91826f,-109.375f, --144.531f,8.92229f,-109.375f, --140.625f,8.34112f,-109.375f, --136.719f,7.82043f,-109.375f, --132.813f,7.17703f,-109.375f, --128.906f,7.28288f,-109.375f, --125.0f,6.94364f,-109.375f, --121.094f,6.57742f,-109.375f, --117.188f,5.68794f,-109.375f, --113.281f,5.66654f,-109.375f, --109.375f,6.9457f,-109.375f, --105.469f,9.81036f,-109.375f, --101.563f,12.6651f,-109.375f, --97.6563f,15.2246f,-109.375f, --93.75f,18.3914f,-109.375f, --89.8438f,21.0454f,-109.375f, --85.9375f,23.3579f,-109.375f, --82.0313f,25.0292f,-109.375f, --78.125f,28.9637f,-109.375f, --74.2188f,31.9858f,-109.375f, --70.3125f,34.5815f,-109.375f, --66.4063f,37.1495f,-109.375f, --62.5f,38.5371f,-109.375f, --58.5938f,39.6993f,-109.375f, --54.6875f,41.3314f,-109.375f, --50.7813f,42.3279f,-109.375f, --46.875f,43.399f,-109.375f, --42.9688f,44.8971f,-109.375f, --39.0625f,46.4515f,-109.375f, --35.1563f,46.6684f,-109.375f, --31.25f,47.2696f,-109.375f, --27.3438f,48.2082f,-109.375f, --23.4375f,47.2707f,-109.375f, --19.5313f,47.952f,-109.375f, --15.625f,47.4088f,-109.375f, --11.7188f,47.3981f,-109.375f, --7.8125f,48.0766f,-109.375f, --3.90625f,47.4974f,-109.375f, -0.0f,46.1817f,-109.375f, -3.90625f,45.3987f,-109.375f, --250.0f,28.5243f,-113.281f, --246.094f,30.3032f,-113.281f, --242.188f,31.2443f,-113.281f, --238.281f,30.733f,-113.281f, --234.375f,31.2433f,-113.281f, --230.469f,31.5829f,-113.281f, --226.563f,30.3008f,-113.281f, --222.656f,28.2348f,-113.281f, --218.75f,25.8116f,-113.281f, --214.844f,25.3702f,-113.281f, --210.938f,24.8435f,-113.281f, --207.031f,25.7524f,-113.281f, --203.125f,26.0021f,-113.281f, --199.219f,24.9024f,-113.281f, --195.313f,23.7348f,-113.281f, --191.406f,21.9608f,-113.281f, --187.5f,20.2108f,-113.281f, --183.594f,18.963f,-113.281f, --179.688f,17.7929f,-113.281f, --175.781f,16.3625f,-113.281f, --171.875f,14.6525f,-113.281f, --167.969f,13.4453f,-113.281f, --164.063f,11.5352f,-113.281f, --160.156f,10.457f,-113.281f, --156.25f,9.86849f,-113.281f, --152.344f,9.76379f,-113.281f, --148.438f,9.40799f,-113.281f, --144.531f,8.38098f,-113.281f, --140.625f,8.03078f,-113.281f, --136.719f,7.4536f,-113.281f, --132.813f,6.32375f,-113.281f, --128.906f,5.90846f,-113.281f, --125.0f,5.44126f,-113.281f, --121.094f,5.53385f,-113.281f, --117.188f,5.35081f,-113.281f, --113.281f,6.14244f,-113.281f, --109.375f,7.72509f,-113.281f, --105.469f,9.98969f,-113.281f, --101.563f,12.8924f,-113.281f, --97.6563f,15.6605f,-113.281f, --93.75f,18.4427f,-113.281f, --89.8438f,20.4633f,-113.281f, --85.9375f,22.3484f,-113.281f, --82.0313f,25.7434f,-113.281f, --78.125f,29.5649f,-113.281f, --74.2188f,32.7377f,-113.281f, --70.3125f,34.4529f,-113.281f, --66.4063f,37.0096f,-113.281f, --62.5f,38.2565f,-113.281f, --58.5938f,39.8951f,-113.281f, --54.6875f,41.291f,-113.281f, --50.7813f,42.6018f,-113.281f, --46.875f,43.3624f,-113.281f, --42.9688f,44.3449f,-113.281f, --39.0625f,45.4446f,-113.281f, --35.1563f,46.0157f,-113.281f, --31.25f,47.6632f,-113.281f, --27.3438f,47.6934f,-113.281f, --23.4375f,46.4824f,-113.281f, --19.5313f,48.2708f,-113.281f, --15.625f,48.5036f,-113.281f, --11.7188f,47.6795f,-113.281f, --7.8125f,48.4742f,-113.281f, --3.90625f,48.509f,-113.281f, -0.0f,47.4037f,-113.281f, -3.90625f,47.4869f,-113.281f, --250.0f,30.7007f,-117.188f, --246.094f,31.6625f,-117.188f, --242.188f,31.8246f,-117.188f, --238.281f,32.4951f,-117.188f, --234.375f,33.3552f,-117.188f, --230.469f,32.7471f,-117.188f, --226.563f,30.8092f,-117.188f, --222.656f,28.3135f,-117.188f, --218.75f,27.0912f,-117.188f, --214.844f,27.0184f,-117.188f, --210.938f,27.5702f,-117.188f, --207.031f,27.9311f,-117.188f, --203.125f,28.0909f,-117.188f, --199.219f,26.6916f,-117.188f, --195.313f,25.6983f,-117.188f, --191.406f,24.0617f,-117.188f, --187.5f,22.1476f,-117.188f, --183.594f,20.964f,-117.188f, --179.688f,19.1417f,-117.188f, --175.781f,18.0941f,-117.188f, --171.875f,16.3483f,-117.188f, --167.969f,13.8969f,-117.188f, --164.063f,12.2065f,-117.188f, --160.156f,10.4346f,-117.188f, --156.25f,9.28283f,-117.188f, --152.344f,8.20933f,-117.188f, --148.438f,7.69157f,-117.188f, --144.531f,7.05251f,-117.188f, --140.625f,6.38685f,-117.188f, --136.719f,5.88862f,-117.188f, --132.813f,4.48007f,-117.188f, --128.906f,4.03049f,-117.188f, --125.0f,4.96603f,-117.188f, --121.094f,6.08105f,-117.188f, --117.188f,6.76315f,-117.188f, --113.281f,7.41087f,-117.188f, --109.375f,7.5353f,-117.188f, --105.469f,9.88018f,-117.188f, --101.563f,11.8887f,-117.188f, --97.6563f,14.4702f,-117.188f, --93.75f,17.2187f,-117.188f, --89.8438f,20.2241f,-117.188f, --85.9375f,22.2766f,-117.188f, --82.0313f,25.968f,-117.188f, --78.125f,29.2923f,-117.188f, --74.2188f,31.9825f,-117.188f, --70.3125f,34.0756f,-117.188f, --66.4063f,35.9202f,-117.188f, --62.5f,37.9131f,-117.188f, --58.5938f,39.2288f,-117.188f, --54.6875f,40.591f,-117.188f, --50.7813f,42.5191f,-117.188f, --46.875f,42.7237f,-117.188f, --42.9688f,43.8388f,-117.188f, --39.0625f,45.2151f,-117.188f, --35.1563f,45.096f,-117.188f, --31.25f,45.9904f,-117.188f, --27.3438f,45.2594f,-117.188f, --23.4375f,45.7333f,-117.188f, --19.5313f,47.4248f,-117.188f, --15.625f,48.122f,-117.188f, --11.7188f,48.0312f,-117.188f, --7.8125f,49.0431f,-117.188f, --3.90625f,49.2804f,-117.188f, -0.0f,48.803f,-117.188f, -3.90625f,48.3887f,-117.188f, --250.0f,31.7497f,-121.094f, --246.094f,31.3973f,-121.094f, --242.188f,32.0742f,-121.094f, --238.281f,33.1521f,-121.094f, --234.375f,33.6068f,-121.094f, --230.469f,31.9815f,-121.094f, --226.563f,30.2957f,-121.094f, --222.656f,28.5699f,-121.094f, --218.75f,28.3353f,-121.094f, --214.844f,28.8422f,-121.094f, --210.938f,29.4292f,-121.094f, --207.031f,29.2833f,-121.094f, --203.125f,28.4123f,-121.094f, --199.219f,27.4455f,-121.094f, --195.313f,26.9053f,-121.094f, --191.406f,24.8164f,-121.094f, --187.5f,22.4409f,-121.094f, --183.594f,21.5447f,-121.094f, --179.688f,20.6668f,-121.094f, --175.781f,18.9757f,-121.094f, --171.875f,16.8092f,-121.094f, --167.969f,14.4997f,-121.094f, --164.063f,13.0122f,-121.094f, --160.156f,11.2904f,-121.094f, --156.25f,9.63825f,-121.094f, --152.344f,8.62771f,-121.094f, --148.438f,7.36842f,-121.094f, --144.531f,6.44275f,-121.094f, --140.625f,5.50805f,-121.094f, --136.719f,6.00349f,-121.094f, --132.813f,4.67796f,-121.094f, --128.906f,3.93081f,-121.094f, --125.0f,5.39329f,-121.094f, --121.094f,6.95361f,-121.094f, --117.188f,8.00676f,-121.094f, --113.281f,7.76936f,-121.094f, --109.375f,8.598f,-121.094f, --105.469f,9.71941f,-121.094f, --101.563f,11.4789f,-121.094f, --97.6563f,13.572f,-121.094f, --93.75f,16.0296f,-121.094f, --89.8438f,18.5079f,-121.094f, --85.9375f,22.5232f,-121.094f, --82.0313f,25.7298f,-121.094f, --78.125f,29.0421f,-121.094f, --74.2188f,31.8936f,-121.094f, --70.3125f,33.6857f,-121.094f, --66.4063f,35.8951f,-121.094f, --62.5f,37.4244f,-121.094f, --58.5938f,39.1337f,-121.094f, --54.6875f,40.6842f,-121.094f, --50.7813f,41.8829f,-121.094f, --46.875f,42.9851f,-121.094f, --42.9688f,42.3613f,-121.094f, --39.0625f,44.0627f,-121.094f, --35.1563f,43.3741f,-121.094f, --31.25f,43.2393f,-121.094f, --27.3438f,44.1982f,-121.094f, --23.4375f,45.2747f,-121.094f, --19.5313f,46.6461f,-121.094f, --15.625f,47.338f,-121.094f, --11.7188f,48.1318f,-121.094f, --7.8125f,49.3601f,-121.094f, --3.90625f,49.6752f,-121.094f, -0.0f,49.3611f,-121.094f, -3.90625f,49.6769f,-121.094f, --250.0f,31.4025f,-125.0f, --246.094f,31.4165f,-125.0f, --242.188f,32.314f,-125.0f, --238.281f,32.9822f,-125.0f, --234.375f,32.6962f,-125.0f, --230.469f,31.3632f,-125.0f, --226.563f,29.4391f,-125.0f, --222.656f,29.519f,-125.0f, --218.75f,29.4481f,-125.0f, --214.844f,29.8481f,-125.0f, --210.938f,30.408f,-125.0f, --207.031f,30.291f,-125.0f, --203.125f,28.7473f,-125.0f, --199.219f,28.1816f,-125.0f, --195.313f,27.2839f,-125.0f, --191.406f,25.7018f,-125.0f, --187.5f,23.2882f,-125.0f, --183.594f,22.1614f,-125.0f, --179.688f,20.658f,-125.0f, --175.781f,18.8433f,-125.0f, --171.875f,16.364f,-125.0f, --167.969f,14.7298f,-125.0f, --164.063f,12.9859f,-125.0f, --160.156f,11.3306f,-125.0f, --156.25f,10.1916f,-125.0f, --152.344f,8.3967f,-125.0f, --148.438f,6.23292f,-125.0f, --144.531f,5.48985f,-125.0f, --140.625f,5.18276f,-125.0f, --136.719f,5.56059f,-125.0f, --132.813f,5.75157f,-125.0f, --128.906f,5.32154f,-125.0f, --125.0f,6.15672f,-125.0f, --121.094f,7.53373f,-125.0f, --117.188f,8.38676f,-125.0f, --113.281f,8.64274f,-125.0f, --109.375f,8.49941f,-125.0f, --105.469f,9.24481f,-125.0f, --101.563f,11.5178f,-125.0f, --97.6563f,13.4113f,-125.0f, --93.75f,15.4997f,-125.0f, --89.8438f,17.3502f,-125.0f, --85.9375f,20.8168f,-125.0f, --82.0313f,24.9405f,-125.0f, --78.125f,27.8681f,-125.0f, --74.2188f,30.1495f,-125.0f, --70.3125f,32.4402f,-125.0f, --66.4063f,34.2537f,-125.0f, --62.5f,36.5623f,-125.0f, --58.5938f,38.9027f,-125.0f, --54.6875f,40.1192f,-125.0f, --50.7813f,41.9393f,-125.0f, --46.875f,41.8765f,-125.0f, --42.9688f,41.6371f,-125.0f, --39.0625f,41.6432f,-125.0f, --35.1563f,41.2852f,-125.0f, --31.25f,41.5629f,-125.0f, --27.3438f,42.2956f,-125.0f, --23.4375f,43.9719f,-125.0f, --19.5313f,46.2232f,-125.0f, --15.625f,47.3104f,-125.0f, --11.7188f,47.5943f,-125.0f, --7.8125f,49.1192f,-125.0f, --3.90625f,49.6341f,-125.0f, -0.0f,50.3481f,-125.0f, -3.90625f,50.3021f,-125.0f, -}; - -btScalar Landscape05Nml[] = { --0.379368f,0.918093f,-0.114827f, --0.372144f,0.893697f,-0.250627f, --0.36483f,0.925769f,-0.0992527f, --0.303739f,0.924201f,-0.231506f, --0.333317f,0.942796f,0.0059764f, --0.301915f,0.940094f,-0.158338f, --0.363026f,0.931698f,0.0122604f, --0.316966f,0.945703f,-0.0719588f, --0.334188f,0.941548f,0.0424963f, --0.326039f,0.944563f,-0.0387196f, --0.382515f,0.923758f,0.0188291f, --0.388659f,0.920843f,-0.0315106f, --0.393577f,0.919186f,-0.013971f, --0.384968f,0.922772f,-0.0170923f, --0.36589f,0.930393f,-0.0222354f, --0.357745f,0.933231f,0.0331438f, --0.482959f,0.873942f,-0.0545559f, --0.473203f,0.879732f,0.0463645f, --0.550088f,0.834035f,-0.0423024f, --0.534007f,0.844766f,0.0347315f, --0.469703f,0.882824f,0.000376011f, --0.490919f,0.868868f,0.0637728f, --0.552202f,0.826862f,-0.106641f, --0.558464f,0.829519f,0.00395409f, --0.437742f,0.897949f,-0.0454837f, --0.437659f,0.898576f,0.0318733f, --0.370538f,0.927929f,-0.0406078f, --0.403245f,0.912789f,-0.064878f, --0.385648f,0.921933f,-0.0362754f, --0.356223f,0.934382f,-0.00604283f, --0.30076f,0.953691f,-0.00400305f, --0.305622f,0.951852f,0.0239231f, --0.284526f,0.956527f,-0.0640436f, --0.380428f,0.91278f,-0.148684f, --0.270228f,0.949845f,-0.157392f, --0.258662f,0.947281f,-0.189085f, --0.182234f,0.978377f,-0.0978241f, --0.170558f,0.969333f,-0.176927f, --0.205282f,0.978149f,-0.0329196f, --0.190223f,0.949267f,-0.250415f, --0.274135f,0.959498f,0.0649128f, --0.310884f,0.912161f,-0.267046f, --0.496348f,0.868119f,0.00275513f, --0.43081f,0.896388f,-0.104358f, --0.405094f,0.913485f,0.0380057f, --0.324068f,0.9389f,0.115955f, --0.25697f,0.965908f,0.0314342f, --0.271227f,0.948776f,0.162051f, --0.254963f,0.963309f,-0.0838379f, --0.344475f,0.938191f,-0.03368f, --0.111765f,0.981495f,-0.15549f, --0.167507f,0.982459f,-0.0819529f, --0.0010222f,0.966945f,-0.254984f, --0.0444844f,0.98477f,-0.168075f, -0.186055f,0.950323f,-0.249537f, -0.1896f,0.965697f,-0.177427f, -0.271688f,0.939248f,-0.209761f, -0.279232f,0.936599f,-0.211687f, -0.322549f,0.939459f,-0.115666f, -0.354799f,0.922502f,-0.152013f, -0.252542f,0.965579f,-0.0622893f, -0.223889f,0.935481f,-0.273404f, -0.054661f,0.998373f,-0.0162575f, -0.0861707f,0.972348f,-0.217056f, -0.0124775f,0.999913f,-0.00421609f, -0.0330599f,0.976575f,-0.212621f, -0.0918366f,0.994675f,0.046771f, -0.166973f,0.980978f,-0.0990035f, -0.0387017f,0.993028f,0.111346f, -0.125297f,0.990619f,0.054541f, -0.0541059f,0.984899f,0.164456f, -0.149711f,0.968151f,0.200673f, -0.168008f,0.956272f,0.239411f, -0.195367f,0.93223f,0.304595f, -0.147118f,0.96491f,0.217497f, -0.125818f,0.960755f,0.247225f, -0.270517f,0.934497f,0.23138f, -0.29818f,0.904256f,0.305629f, -0.363841f,0.900609f,0.237745f, -0.316827f,0.923009f,0.218347f, -0.413166f,0.893779f,0.17451f, -0.334815f,0.940911f,0.0508378f, -0.474676f,0.869519f,0.136452f, -0.456974f,0.889396f,0.0122055f, -0.272216f,0.960219f,0.0622813f, -0.228855f,0.962963f,-0.142573f, -0.0810211f,0.995842f,0.0416494f, -0.189938f,0.980101f,0.0576713f, --0.0449078f,0.994712f,0.0923629f, --0.00155869f,0.98749f,0.157671f, --0.0840704f,0.991095f,0.103263f, --0.0968834f,0.985327f,0.140515f, -0.0427121f,0.991995f,0.118832f, --0.0240058f,0.999711f,0.000939081f, --0.124569f,0.986858f,0.10293f, --0.167243f,0.982306f,-0.0842863f, --0.286295f,0.953093f,0.0982316f, --0.243406f,0.969914f,-0.00444377f, --0.280466f,0.950626f,0.132851f, --0.21091f,0.972115f,0.102516f, --0.230061f,0.951476f,0.204368f, --0.123921f,0.950092f,0.286301f, --0.126792f,0.952499f,0.276893f, --0.0764868f,0.927481f,0.365962f, --0.0452811f,0.949055f,0.31184f, --0.138647f,0.960819f,0.240008f, --0.25036f,0.943892f,0.215377f, --0.314158f,0.941939f,0.118561f, --0.458647f,0.872527f,0.168342f, --0.427047f,0.882261f,0.198106f, --0.485467f,0.864542f,0.129958f, --0.523912f,0.844181f,0.113461f, --0.532843f,0.842328f,0.081008f, --0.518838f,0.84918f,0.0984888f, --0.439028f,0.883929f,0.16101f, --0.409166f,0.878784f,0.245606f, --0.386543f,0.918859f,0.0792661f, --0.447749f,0.88853f,0.100178f, --0.431191f,0.90206f,0.0190184f, --0.467639f,0.880276f,0.0801789f, --0.518882f,0.844495f,-0.132623f, --0.570181f,0.817923f,-0.076789f, --0.420368f,0.883342f,-0.207357f, --0.464447f,0.877342f,-0.120667f, --0.386958f,0.877414f,-0.283564f, --0.442101f,0.874511f,-0.199442f, --0.380012f,0.859996f,-0.340584f, --0.442865f,0.822467f,-0.356959f, --0.24551f,0.880879f,-0.404695f, --0.263304f,0.844058f,-0.467159f, --0.116714f,0.897206f,-0.425909f, --0.129252f,0.860962f,-0.491974f, --0.352237f,0.922053f,0.160457f, --0.402553f,0.906198f,0.129446f, --0.377478f,0.915341f,0.140219f, --0.336315f,0.935519f,0.10815f, --0.335675f,0.937548f,0.0912505f, --0.330532f,0.939201f,0.0930086f, --0.361761f,0.931606f,0.035208f, --0.318172f,0.947538f,0.0306247f, --0.418525f,0.907834f,-0.0259689f, --0.56364f,0.818048f,-0.114485f, --0.461029f,0.882661f,-0.0914388f, --0.472492f,0.87835f,-0.0724725f, --0.523319f,0.846244f,-0.100037f, --0.381187f,0.924062f,-0.0283799f, --0.407557f,0.911105f,-0.0615298f, --0.340677f,0.939702f,0.0299913f, --0.237849f,0.962659f,0.129291f, --0.233755f,0.968303f,0.0880164f, --0.248597f,0.967837f,0.0386268f, --0.357032f,0.933656f,0.0285478f, --0.359392f,0.919937f,0.156695f, --0.375075f,0.918577f,0.12464f, --0.326685f,0.944457f,-0.0357437f, --0.172605f,0.980131f,-0.0977257f, --0.156177f,0.9732f,-0.168789f, --0.0732432f,0.97238f,-0.221612f, -0.0871915f,0.980367f,-0.176858f, -0.1118f,0.973873f,-0.197667f, -0.197176f,0.978426f,-0.0616824f, -0.202039f,0.979229f,-0.0170475f, -0.172249f,0.982761f,0.0671591f, -0.0103709f,0.995351f,0.095751f, -0.00657151f,0.996617f,0.0819183f, -0.0314022f,0.995508f,0.0893156f, -0.0387801f,0.982532f,0.182011f, -0.0412148f,0.983254f,0.177521f, -0.166642f,0.964252f,0.20603f, -0.177047f,0.971307f,0.1588f, -0.255603f,0.956785f,0.138671f, -0.338465f,0.927074f,0.161166f, -0.418264f,0.886168f,0.199401f, -0.454161f,0.868211f,0.199869f, -0.355471f,0.903694f,0.2387f, -0.136408f,0.975339f,0.173515f, --0.0223692f,0.983821f,0.177753f, --0.0947578f,0.983833f,0.151964f, --0.0484831f,0.985895f,0.16019f, --0.137652f,0.965784f,0.219802f, --0.273035f,0.949633f,0.153782f, --0.284296f,0.949219f,0.134753f, --0.233616f,0.961781f,0.142834f, --0.158293f,0.979011f,0.128376f, --0.142079f,0.977628f,0.155106f, --0.179667f,0.940095f,0.289726f, --0.385363f,0.907468f,0.167324f, --0.462662f,0.886082f,0.0283396f, --0.500483f,0.865637f,-0.0137244f, --0.459387f,0.885328f,-0.0718224f, --0.318003f,0.947491f,-0.0336944f, --0.336522f,0.937427f,-0.0893505f, --0.421711f,0.882359f,-0.208814f, --0.386976f,0.894588f,-0.223522f, --0.348564f,0.925302f,-0.149395f, --0.389936f,0.911457f,-0.131135f, --0.262418f,0.94867f,-0.17653f, --0.142966f,0.967048f,-0.210661f, --0.341303f,0.927435f,0.152892f, --0.342877f,0.929169f,0.138133f, --0.327958f,0.941991f,0.0713955f, --0.312837f,0.949244f,0.0326933f, --0.32505f,0.944749f,0.0423311f, --0.35038f,0.936272f,0.0250833f, --0.334661f,0.939274f,0.0759313f, --0.336592f,0.939816f,0.0587454f, --0.383743f,0.919849f,0.0813597f, --0.479391f,0.876726f,0.0391772f, --0.521184f,0.850742f,-0.0678625f, --0.496942f,0.867777f,0.00353465f, --0.521763f,0.848113f,-0.0920201f, --0.373289f,0.923494f,-0.0883984f, --0.40896f,0.910065f,-0.067337f, --0.458758f,0.888254f,0.0233657f, --0.335137f,0.935384f,0.112868f, --0.174079f,0.969266f,0.173839f, --0.174994f,0.976179f,0.128265f, --0.244694f,0.967717f,0.0603988f, --0.409093f,0.90433f,-0.121779f, --0.290803f,0.954139f,-0.0710763f, --0.266076f,0.946406f,-0.183082f, --0.19492f,0.966664f,-0.166031f, --0.107014f,0.989078f,-0.101359f, --0.0950037f,0.987234f,-0.127838f, --0.0081899f,0.996807f,-0.0794301f, -0.0655685f,0.997841f,0.0038314f, -0.121704f,0.991617f,0.0433953f, -0.204125f,0.978885f,0.010797f, -0.169834f,0.985465f,0.00398161f, -0.0639966f,0.99795f,0.000581677f, -0.0389498f,0.997722f,-0.0550831f, --0.00230315f,0.998522f,-0.0543072f, --0.0428959f,0.99833f,-0.0386874f, -8.35518e-005f,0.999804f,-0.0198162f, -0.12638f,0.991004f,0.0440296f, -0.219728f,0.969155f,0.111616f, -0.270292f,0.956521f,0.109589f, -0.325159f,0.942616f,0.0758083f, -0.394886f,0.91647f,0.0644013f, -0.455483f,0.885289f,0.0937962f, -0.346134f,0.927862f,0.13879f, -0.142703f,0.967217f,0.210065f, --0.0417806f,0.973195f,0.226154f, --0.0873343f,0.983405f,0.159022f, --0.027932f,0.984118f,0.175304f, --0.101812f,0.985941f,0.132496f, --0.174734f,0.983884f,0.037939f, --0.279511f,0.957793f,-0.0671252f, --0.277834f,0.959638f,-0.04362f, --0.153076f,0.986374f,0.0602763f, --0.221825f,0.968529f,0.112897f, --0.256381f,0.940693f,0.222182f, --0.236646f,0.958592f,0.158432f, --0.345917f,0.937587f,-0.0356594f, --0.417749f,0.894423f,-0.159665f, --0.456832f,0.853011f,-0.252341f, --0.379407f,0.905637f,-0.189399f, --0.328991f,0.940983f,-0.0794707f, --0.363362f,0.931271f,0.0264943f, --0.48653f,0.873119f,0.0308429f, --0.459174f,0.871133f,0.174033f, --0.359639f,0.91236f,0.1956f, --0.2127f,0.972657f,0.0932592f, --0.0697188f,0.989689f,0.12512f, --0.251887f,0.965064f,0.0721469f, --0.317161f,0.947815f,-0.0324826f, --0.311043f,0.947329f,-0.076288f, --0.343705f,0.938452f,-0.0342691f, --0.318958f,0.946045f,0.0571365f, --0.341405f,0.939767f,0.0167816f, --0.371963f,0.928183f,-0.0109617f, --0.353511f,0.935132f,0.0236193f, --0.398287f,0.910412f,0.111881f, --0.43162f,0.897024f,0.0951448f, --0.485116f,0.874338f,-0.0140269f, --0.473699f,0.879939f,-0.03627f, --0.417805f,0.900966f,-0.117046f, --0.424936f,0.889519f,-0.167884f, --0.467852f,0.878936f,-0.0926624f, --0.493825f,0.865439f,-0.0845782f, --0.351989f,0.932075f,-0.0856709f, --0.214961f,0.974111f,-0.0700008f, --0.163285f,0.986387f,-0.0194449f, --0.162841f,0.986548f,-0.0143588f, --0.285987f,0.956112f,-0.0637334f, --0.292441f,0.94548f,-0.143341f, --0.215932f,0.955314f,-0.201864f, --0.253415f,0.950159f,-0.181603f, --0.183417f,0.974504f,-0.129231f, --0.101906f,0.993299f,-0.0545242f, --0.042238f,0.99904f,-0.0116303f, -0.0329811f,0.99907f,-0.0277622f, -0.132201f,0.990073f,-0.0477429f, -0.267032f,0.963432f,-0.0221792f, -0.1278f,0.990718f,-0.0463084f, -0.0964891f,0.995299f,-0.00830296f, -0.0476853f,0.991211f,-0.123396f, --0.00640997f,0.993203f,-0.116222f, --0.0126443f,0.992773f,-0.119338f, --0.00631822f,0.992917f,-0.118638f, -0.0563885f,0.995667f,-0.073943f, -0.12664f,0.991687f,-0.022778f, -0.273262f,0.961705f,0.021246f, -0.388375f,0.920615f,-0.0403992f, -0.37695f,0.920931f,-0.0989673f, -0.400211f,0.914808f,0.0543818f, -0.279689f,0.947142f,0.15715f, -0.0626591f,0.985325f,0.158772f, -0.0197159f,0.983213f,0.181391f, -0.0112307f,0.995546f,0.0936022f, --0.0611233f,0.998037f,0.013638f, --0.0515369f,0.996025f,0.0726543f, --0.060221f,0.998076f,0.0147593f, --0.21333f,0.972986f,-0.0882534f, --0.330599f,0.94012f,-0.0829391f, --0.311254f,0.950309f,-0.00575056f, --0.324983f,0.931955f,0.160768f, --0.245964f,0.942146f,0.227736f, --0.125195f,0.981121f,0.147403f, --0.193437f,0.975595f,0.103908f, --0.319958f,0.946961f,0.029845f, --0.440983f,0.895915f,-0.0535662f, --0.477838f,0.878381f,-0.0108058f, --0.480471f,0.872693f,0.0869201f, --0.478968f,0.83494f,0.271043f, --0.490257f,0.796981f,0.352803f, --0.434277f,0.834185f,0.339909f, --0.265882f,0.929328f,0.256236f, --0.142385f,0.958793f,0.245852f, --0.182126f,0.963412f,0.196642f, --0.0681643f,0.992157f,0.104781f, --0.176883f,0.983918f,0.024857f, --0.305513f,0.952069f,-0.0150524f, --0.401485f,0.91552f,0.0251517f, --0.372509f,0.927256f,0.0378572f, --0.265017f,0.964159f,0.0127972f, --0.342134f,0.935688f,-0.0862078f, --0.427338f,0.901948f,-0.062226f, --0.447549f,0.894216f,0.00877894f, --0.382185f,0.923573f,-0.0307708f, --0.386509f,0.921774f,-0.0307138f, --0.457766f,0.884255f,-0.0924303f, --0.384262f,0.916404f,-0.11201f, --0.431623f,0.886784f,-0.165273f, --0.460575f,0.869789f,-0.177024f, --0.471547f,0.850265f,-0.233865f, --0.351048f,0.911491f,-0.214361f, --0.263539f,0.9431f,-0.202755f, --0.173283f,0.972074f,-0.158258f, --0.19847f,0.960809f,-0.193536f, --0.275034f,0.951707f,-0.136422f, --0.217032f,0.958372f,-0.185526f, --0.201987f,0.95666f,-0.209771f, --0.299318f,0.94727f,-0.114406f, --0.187056f,0.978613f,-0.0855959f, --0.155621f,0.97153f,-0.178637f, --0.0810385f,0.981009f,-0.176221f, -0.0905036f,0.986207f,-0.138581f, -0.115825f,0.982705f,-0.14448f, -0.19636f,0.97731f,-0.0794224f, -0.143519f,0.988245f,-0.0526749f, -0.109744f,0.989619f,-0.0927937f, -0.197571f,0.972036f,-0.12693f, -0.00332495f,0.962309f,-0.271939f, --0.0356976f,0.959351f,-0.279948f, --0.0721767f,0.96735f,-0.242948f, --0.00843005f,0.989549f,-0.143952f, -0.152572f,0.983317f,-0.0990425f, -0.281378f,0.943362f,-0.175768f, -0.428891f,0.891683f,-0.144753f, -0.290445f,0.954517f,-0.0673633f, -0.176401f,0.973557f,0.145155f, -0.232983f,0.924473f,0.301776f, -0.181127f,0.950255f,0.253393f, --0.00165339f,0.991402f,0.130837f, -0.0981935f,0.976268f,0.193027f, -0.000170743f,0.996657f,0.0816968f, --0.0970384f,0.995225f,-0.0105345f, --0.00895717f,0.999951f,-0.00426387f, --0.170944f,0.985202f,-0.0124686f, --0.362907f,0.93182f,-0.00317037f, --0.388121f,0.921046f,0.0322033f, --0.407598f,0.90852f,0.0919578f, --0.247403f,0.962759f,0.109032f, --0.0829823f,0.986114f,0.143848f, --0.240859f,0.956011f,0.167424f, --0.312142f,0.912012f,0.266086f, --0.398269f,0.862926f,0.311032f, --0.511957f,0.795091f,0.325161f, --0.506846f,0.755093f,0.415864f, --0.506747f,0.718735f,0.476054f, --0.45002f,0.736589f,0.504895f, --0.287855f,0.833759f,0.471153f, --0.237765f,0.90713f,0.34725f, --0.146865f,0.915961f,0.373425f, --0.0859218f,0.935714f,0.342136f, --0.054455f,0.996952f,-0.0558782f, --0.211499f,0.976662f,-0.0374149f, --0.331452f,0.940975f,0.0686022f, --0.397421f,0.917381f,0.0216451f, --0.316207f,0.946964f,-0.0572054f, --0.202804f,0.975284f,-0.0877067f, --0.28846f,0.951091f,-0.110532f, --0.440756f,0.882415f,-0.164552f, --0.391159f,0.897816f,-0.202288f, --0.37945f,0.884355f,-0.27191f, --0.436492f,0.880924f,-0.182888f, --0.458204f,0.880643f,-0.12049f, --0.365575f,0.927969f,-0.0723085f, --0.344164f,0.93545f,-0.0805227f, --0.392565f,0.898448f,-0.196683f, --0.458844f,0.839155f,-0.292028f, --0.406986f,0.873305f,-0.267769f, --0.264536f,0.933458f,-0.242234f, --0.197907f,0.946975f,-0.253123f, --0.162416f,0.964761f,-0.207018f, --0.261287f,0.932524f,-0.249254f, --0.237723f,0.937266f,-0.25499f, --0.255938f,0.959549f,-0.117312f, --0.378394f,0.921703f,-0.0853291f, --0.154569f,0.983106f,-0.098032f, -0.020864f,0.98441f,-0.174648f, --0.0493076f,0.945704f,-0.321268f, -0.00354211f,0.950539f,-0.310586f, -0.0705741f,0.962405f,-0.262289f, -0.155003f,0.952815f,-0.260992f, -0.190084f,0.945182f,-0.265518f, -0.109466f,0.94166f,-0.318268f, -0.219465f,0.948713f,-0.227551f, -0.131592f,0.95776f,-0.255694f, --0.023132f,0.936016f,-0.351196f, --0.102398f,0.923738f,-0.369083f, --0.11778f,0.928743f,-0.351518f, -0.14699f,0.959781f,-0.239196f, -0.329451f,0.917295f,-0.223678f, -0.290403f,0.942778f,-0.163815f, -0.10086f,0.993272f,0.056896f, -0.00690717f,0.980954f,0.194116f, -0.198478f,0.949829f,0.241726f, -0.257584f,0.935998f,0.239913f, -0.0870031f,0.976807f,0.195647f, -0.0578083f,0.994066f,0.0921449f, -0.121554f,0.989161f,0.0823711f, -0.0335983f,0.999242f,0.0196737f, --0.0544848f,0.997579f,-0.0432265f, --0.170331f,0.98419f,0.0485619f, --0.366378f,0.930108f,-0.0258115f, --0.430564f,0.901925f,-0.0338598f, --0.412156f,0.909498f,0.0542308f, --0.303685f,0.949097f,0.0836093f, --0.198153f,0.949404f,0.243656f, --0.267445f,0.871756f,0.410506f, --0.393769f,0.805932f,0.442062f, --0.427473f,0.750775f,0.50359f, --0.522691f,0.707231f,0.476044f, --0.550081f,0.670741f,0.497511f, --0.518356f,0.695815f,0.49714f, --0.372017f,0.764162f,0.526934f, --0.210863f,0.841692f,0.497082f, --0.116051f,0.87101f,0.477362f, --0.106872f,0.906726f,0.407954f, -0.0295506f,0.897687f,0.439643f, --0.11391f,0.993475f,0.00559176f, --0.238885f,0.970513f,0.0322297f, --0.352278f,0.935893f,0.00201985f, --0.29155f,0.955165f,-0.0515582f, --0.283012f,0.950207f,-0.130422f, --0.233718f,0.966509f,-0.105997f, --0.293314f,0.953293f,-0.0721f, --0.344057f,0.937935f,-0.0436188f, --0.359338f,0.921856f,-0.145114f, --0.361988f,0.90939f,-0.204876f, --0.478777f,0.840974f,-0.252063f, --0.501126f,0.832032f,-0.237897f, --0.42396f,0.887247f,-0.1818f, --0.340692f,0.929815f,-0.13919f, --0.261328f,0.946412f,-0.189766f, --0.383135f,0.863856f,-0.327048f, --0.4248f,0.838392f,-0.341533f, --0.258907f,0.912327f,-0.317216f, --0.273875f,0.922352f,-0.272505f, --0.216284f,0.973372f,-0.0759435f, --0.186061f,0.980681f,-0.0603919f, --0.327344f,0.93227f,-0.15401f, --0.354135f,0.933013f,-0.0638423f, --0.30838f,0.94174f,-0.13427f, --0.0952482f,0.963393f,-0.250602f, -0.0864929f,0.957116f,-0.276491f, -0.0265645f,0.947809f,-0.31773f, --0.00743162f,0.929747f,-0.368124f, -0.0794584f,0.926075f,-0.368877f, -0.177698f,0.921503f,-0.345334f, -0.210118f,0.923104f,-0.322071f, -0.0972314f,0.929984f,-0.354507f, -0.0931107f,0.932401f,-0.349226f, -0.163846f,0.947557f,-0.274392f, -0.04099f,0.947023f,-0.318539f, --0.0637185f,0.942657f,-0.327625f, --0.131539f,0.923216f,-0.361068f, -0.0323928f,0.932437f,-0.359877f, -0.242794f,0.937436f,-0.249528f, -0.154647f,0.984538f,-0.0822692f, --0.0290139f,0.999421f,0.0177744f, --0.0330797f,0.998482f,0.0440283f, -0.157195f,0.980432f,0.118503f, -0.251646f,0.94505f,0.208697f, -0.178529f,0.966849f,0.182568f, -0.171641f,0.982807f,0.0680498f, -0.107902f,0.993714f,0.0298233f, -0.00302695f,0.994036f,0.109006f, --0.0844358f,0.977656f,0.19251f, --0.18119f,0.958323f,0.220878f, --0.285317f,0.945377f,0.157659f, --0.419121f,0.895183f,0.151606f, --0.490039f,0.857134f,0.158693f, --0.402244f,0.878123f,0.259038f, --0.398659f,0.825161f,0.400226f, --0.427626f,0.728675f,0.534948f, --0.378859f,0.704334f,0.600316f, --0.386613f,0.684959f,0.617545f, --0.440363f,0.648556f,0.62085f, --0.484249f,0.659981f,0.574394f, --0.462576f,0.728741f,0.504936f, --0.380875f,0.811463f,0.443241f, --0.190303f,0.865049f,0.464193f, --0.0749094f,0.86956f,0.488113f, --0.11614f,0.868815f,0.481323f, --0.102623f,0.843113f,0.527854f, --0.198362f,0.979655f,0.0304707f, --0.238942f,0.970277f,0.0383318f, --0.308109f,0.951351f,-0.000213496f, --0.245044f,0.968893f,0.0346459f, --0.275786f,0.960816f,-0.0278198f, --0.256726f,0.965729f,-0.0381932f, --0.318964f,0.947473f,-0.0236049f, --0.388409f,0.921405f,0.0123096f, --0.298771f,0.953298f,0.0442638f, --0.291187f,0.956662f,0.00282226f, --0.39367f,0.915026f,-0.0880448f, --0.501897f,0.840236f,-0.20519f, --0.460271f,0.863055f,-0.208055f, --0.311786f,0.925724f,-0.214066f, --0.177876f,0.937081f,-0.300397f, --0.256831f,0.902901f,-0.344683f, --0.413909f,0.808626f,-0.418096f, --0.347694f,0.845102f,-0.406092f, --0.390269f,0.881564f,-0.265585f, --0.38258f,0.915768f,-0.122479f, --0.172737f,0.984864f,-0.0142896f, --0.221138f,0.97315f,-0.0638528f, --0.32806f,0.922266f,-0.204454f, --0.20334f,0.945769f,-0.253326f, --0.0362109f,0.959773f,-0.278433f, -0.0451082f,0.968522f,-0.244806f, -0.103574f,0.977375f,-0.184421f, -0.095607f,0.942862f,-0.319172f, -0.028855f,0.903939f,-0.426688f, -0.0781753f,0.937277f,-0.339707f, -0.163597f,0.966118f,-0.199631f, -0.165445f,0.973063f,-0.160553f, -0.145787f,0.95097f,-0.272767f, -0.130591f,0.92029f,-0.368799f, -0.0531207f,0.931628f,-0.35951f, --0.0802666f,0.935074f,-0.345244f, --0.124987f,0.942063f,-0.311281f, -0.0397165f,0.963525f,-0.264653f, -0.0790619f,0.96623f,-0.245254f, -0.0277086f,0.995754f,-0.0877838f, --0.0718135f,0.997414f,0.00271225f, --0.0601764f,0.993596f,0.0956336f, -0.0305316f,0.992338f,0.119724f, -0.184993f,0.96549f,0.183324f, -0.240982f,0.949316f,0.20181f, -0.205406f,0.960305f,0.188739f, -0.0685231f,0.967991f,0.241448f, --0.121139f,0.95072f,0.285408f, --0.150135f,0.918283f,0.366355f, --0.132611f,0.919499f,0.370048f, --0.285199f,0.893271f,0.34746f, --0.428415f,0.803512f,0.413316f, --0.445474f,0.783214f,0.433738f, --0.459983f,0.771026f,0.44038f, --0.467611f,0.730475f,0.497741f, --0.48066f,0.718458f,0.502777f, --0.417628f,0.706128f,0.571814f, --0.464585f,0.665035f,0.584713f, --0.472738f,0.646587f,0.598702f, --0.412146f,0.689264f,0.595861f, --0.326825f,0.752406f,0.5719f, --0.254151f,0.834713f,0.48853f, --0.235109f,0.888903f,0.39316f, --0.153581f,0.849492f,0.504753f, --0.150095f,0.815518f,0.558929f, --0.18873f,0.837012f,0.513607f, -0.0689174f,0.995773f,0.0607139f, --0.155258f,0.983404f,-0.0938683f, --0.345692f,0.927547f,-0.141961f, --0.289881f,0.953783f,-0.079168f, --0.192407f,0.979661f,-0.0569578f, --0.267677f,0.960104f,-0.0809323f, --0.338627f,0.940905f,-0.0054102f, --0.378143f,0.925406f,-0.0251327f, --0.331689f,0.941021f,-0.0667991f, --0.266964f,0.963694f,-0.00485284f, --0.326986f,0.944023f,-0.0435962f, --0.406544f,0.902607f,-0.141498f, --0.445264f,0.84532f,-0.295253f, --0.261882f,0.90946f,-0.322956f, --0.131634f,0.928868f,-0.346231f, --0.231876f,0.922232f,-0.30939f, --0.381112f,0.87967f,-0.284489f, --0.459513f,0.85999f,-0.22196f, --0.498013f,0.864257f,-0.0710131f, --0.440544f,0.89211f,-0.100303f, --0.247938f,0.96287f,-0.106806f, --0.10732f,0.992504f,-0.0584663f, --0.221465f,0.956592f,-0.189431f, --0.229248f,0.946541f,-0.22695f, --0.0978243f,0.972744f,-0.210239f, --0.0379465f,0.985853f,-0.163259f, -0.0806013f,0.992194f,-0.0951546f, -0.280296f,0.95443f,-0.102456f, -0.155799f,0.941292f,-0.299494f, --0.0466248f,0.90184f,-0.429548f, -0.0333539f,0.93989f,-0.339845f, -0.15766f,0.95203f,-0.262264f, -0.275219f,0.92494f,-0.262186f, -0.226492f,0.914035f,-0.336513f, -0.0375497f,0.921004f,-0.387739f, --0.0841489f,0.913809f,-0.39733f, --0.216548f,0.901013f,-0.375874f, --0.0617755f,0.971104f,-0.230524f, -0.0635289f,0.988552f,-0.136856f, --0.0898172f,0.987883f,-0.126568f, --0.195744f,0.9803f,-0.0263689f, --0.163398f,0.98375f,0.0744142f, -0.0549941f,0.99236f,0.110438f, -0.19398f,0.975972f,0.0992507f, -0.191759f,0.972804f,0.129928f, -0.149866f,0.963222f,0.223034f, --0.00306242f,0.957956f,0.286898f, --0.13576f,0.938575f,0.317249f, --0.176601f,0.936485f,0.303f, --0.158083f,0.914215f,0.373122f, --0.316693f,0.854194f,0.412381f, --0.498069f,0.774619f,0.389733f, --0.492142f,0.755365f,0.432688f, --0.453311f,0.739293f,0.49795f, --0.471661f,0.730931f,0.49323f, --0.504596f,0.695479f,0.511558f, --0.486075f,0.660592f,0.572145f, --0.455536f,0.681017f,0.573326f, --0.475459f,0.732851f,0.486691f, --0.40679f,0.784517f,0.468032f, --0.294511f,0.862991f,0.410499f, --0.137096f,0.926626f,0.350098f, --0.212171f,0.92693f,0.30949f, --0.320702f,0.890591f,0.322488f, --0.144781f,0.913051f,0.381284f, --0.0467088f,0.929255f,0.366475f, -0.190524f,0.979715f,0.0621193f, --0.0159571f,0.99888f,-0.0445494f, --0.299493f,0.937414f,-0.177647f, --0.30245f,0.926474f,-0.223986f, --0.236991f,0.948637f,-0.209579f, --0.316653f,0.935173f,-0.15869f, --0.385652f,0.9143f,-0.123807f, --0.33937f,0.934637f,-0.106213f, --0.347064f,0.934195f,-0.0826249f, --0.295744f,0.955249f,0.00583919f, --0.275005f,0.961059f,-0.0271544f, --0.269439f,0.957464f,-0.103275f, --0.282112f,0.919833f,-0.272616f, --0.294141f,0.877255f,-0.379347f, --0.188084f,0.929949f,-0.315942f, --0.305781f,0.908958f,-0.283361f, --0.494244f,0.854771f,-0.158396f, --0.556326f,0.828917f,0.0582992f, --0.534005f,0.83843f,0.108964f, --0.372194f,0.92607f,0.0621723f, --0.216902f,0.97615f,-0.00922891f, --0.129625f,0.988755f,-0.0745716f, --0.137022f,0.98954f,-0.0451077f, --0.210914f,0.969697f,-0.123297f, --0.0927848f,0.980946f,-0.170691f, --0.0487293f,0.98279f,-0.178186f, -0.0377154f,0.983594f,-0.176409f, -0.270827f,0.95519f,-0.119436f, -0.365037f,0.928517f,-0.0678507f, -0.131842f,0.951604f,-0.277612f, --0.0185121f,0.905238f,-0.424502f, -0.118166f,0.903064f,-0.412931f, -0.230045f,0.8849f,-0.405008f, -0.2101f,0.906634f,-0.365886f, -0.0544702f,0.94453f,-0.323878f, --0.0630069f,0.9598f,-0.273522f, --0.203027f,0.928033f,-0.312304f, --0.22235f,0.90002f,-0.374866f, -0.0164141f,0.973192f,-0.229407f, --0.131299f,0.967472f,-0.216237f, --0.248586f,0.95668f,-0.151553f, --0.180678f,0.971697f,-0.152182f, -0.021506f,0.991774f,-0.126182f, -0.129882f,0.991187f,-0.0260519f, -0.125479f,0.988703f,0.0819803f, -0.0585413f,0.987325f,0.14752f, --0.0186301f,0.977162f,0.211676f, --0.162972f,0.968132f,0.19016f, --0.218545f,0.935778f,0.276691f, --0.284144f,0.890895f,0.354356f, --0.345593f,0.839997f,0.418295f, --0.488331f,0.792258f,0.36587f, --0.545891f,0.770241f,0.329746f, --0.533891f,0.766492f,0.357002f, --0.51665f,0.749346f,0.414189f, --0.616561f,0.690345f,0.37852f, --0.519109f,0.719346f,0.461593f, --0.392236f,0.782177f,0.484097f, --0.398436f,0.817816f,0.415241f, --0.392025f,0.864189f,0.315428f, --0.176475f,0.937288f,0.300577f, --0.137444f,0.969881f,0.201097f, --0.206545f,0.942409f,0.263066f, --0.293185f,0.938992f,0.179823f, --0.159029f,0.985376f,0.0611911f, -0.00174953f,0.998094f,0.0616789f, -0.241821f,0.962041f,0.126492f, -0.127737f,0.984773f,0.117921f, --0.17559f,0.984255f,0.0202494f, --0.277772f,0.957333f,-0.0797282f, --0.264237f,0.953214f,-0.146839f, --0.330132f,0.935063f,-0.129113f, --0.363469f,0.924563f,-0.114338f, --0.371034f,0.917638f,-0.142388f, --0.425424f,0.897691f,-0.114736f, --0.353654f,0.934652f,-0.0368062f, --0.218582f,0.975792f,0.007136f, --0.203676f,0.978799f,-0.0216238f, --0.149661f,0.987587f,-0.0476727f, --0.278943f,0.945373f,-0.1687f, --0.239375f,0.951961f,-0.190969f, --0.360119f,0.921099f,-0.147955f, --0.584157f,0.811569f,0.0107674f, --0.61484f,0.786528f,0.0578414f, --0.504089f,0.86363f,-0.00605437f, --0.333455f,0.94143f,-0.0501755f, --0.123418f,0.989972f,-0.0687344f, --0.105519f,0.985418f,-0.133478f, --0.134701f,0.9843f,-0.114061f, --0.137014f,0.977235f,-0.161985f, --0.0439551f,0.980481f,-0.191638f, --0.0327274f,0.96544f,-0.258561f, -0.0268923f,0.955378f,-0.294159f, -0.189265f,0.941783f,-0.277892f, -0.306008f,0.930356f,-0.201982f, -0.2909f,0.948465f,-0.12566f, -0.135694f,0.963424f,-0.231086f, -0.114996f,0.92781f,-0.354886f, -0.243157f,0.920361f,-0.306286f, -0.181493f,0.943785f,-0.27628f, --0.0348676f,0.964621f,-0.261325f, --0.138397f,0.964431f,-0.225208f, --0.0584572f,0.973863f,-0.219483f, --0.160488f,0.904663f,-0.394751f, --0.113572f,0.901558f,-0.417487f, --0.155065f,0.923521f,-0.350803f, --0.242307f,0.919914f,-0.308295f, --0.206106f,0.923371f,-0.323891f, --0.0753677f,0.972428f,-0.220691f, -0.00286078f,0.993423f,-0.114469f, -0.0506503f,0.998257f,-0.0302924f, --0.0328546f,0.999299f,0.017926f, --0.060813f,0.979003f,0.194565f, --0.19049f,0.94338f,0.271567f, --0.332962f,0.885593f,0.323821f, --0.330466f,0.869145f,0.367938f, --0.383415f,0.840587f,0.382632f, --0.450848f,0.795155f,0.405542f, --0.50223f,0.7918f,0.347589f, --0.586371f,0.768822f,0.255112f, --0.550176f,0.765625f,0.333355f, --0.594581f,0.747662f,0.295761f, --0.604774f,0.771025f,0.199423f, --0.461798f,0.840354f,0.283809f, --0.323989f,0.875237f,0.359155f, --0.321766f,0.916629f,0.23719f, --0.168943f,0.967667f,0.187293f, --0.107108f,0.976625f,0.186366f, --0.222921f,0.963011f,0.151379f, --0.142187f,0.985732f,0.0900906f, --0.0555822f,0.997373f,-0.0464466f, --0.00128055f,0.995901f,-0.0904418f, -0.189226f,0.980362f,-0.0555288f, -0.085267f,0.996327f,-0.00782177f, --0.128918f,0.990746f,0.042464f, --0.188312f,0.982054f,-0.0104463f, --0.196136f,0.979449f,-0.0470074f, --0.346836f,0.935484f,-0.0676365f, --0.385817f,0.920741f,-0.0581445f, --0.364523f,0.930255f,-0.0418259f, --0.413227f,0.910109f,-0.0307546f, --0.395357f,0.915702f,-0.071985f, --0.249105f,0.966325f,-0.0645241f, --0.224404f,0.97132f,-0.0786097f, --0.136636f,0.989057f,-0.0556425f, --0.161967f,0.98357f,-0.0797312f, --0.264069f,0.956689f,-0.122532f, --0.415862f,0.909427f,-0.00117779f, --0.618635f,0.784039f,0.0507281f, --0.569525f,0.818988f,-0.0700017f, --0.458442f,0.876243f,-0.148424f, --0.301532f,0.936403f,-0.179521f, --0.125352f,0.969963f,-0.208469f, --0.0885456f,0.971015f,-0.222014f, --0.127345f,0.96169f,-0.242765f, --0.111865f,0.95953f,-0.258434f, --0.00408963f,0.957803f,-0.287396f, -0.0423217f,0.932535f,-0.358592f, -0.0695614f,0.921939f,-0.381037f, -0.190852f,0.890613f,-0.412775f, -0.209386f,0.879353f,-0.427663f, -0.178912f,0.925963f,-0.332541f, -0.21012f,0.943847f,-0.254954f, -0.194248f,0.92787f,-0.318316f, -0.12116f,0.941808f,-0.313556f, -0.143074f,0.982238f,-0.121399f, -0.00445755f,0.990826f,-0.135068f, --0.0763662f,0.964673f,-0.252139f, --0.00960064f,0.938734f,-0.34451f, --0.0448775f,0.923487f,-0.380997f, --0.121038f,0.899958f,-0.418839f, --0.214432f,0.896136f,-0.388536f, --0.236628f,0.909444f,-0.341933f, --0.245801f,0.902665f,-0.353239f, --0.210816f,0.938091f,-0.274848f, --0.0790665f,0.981118f,-0.17651f, --0.0418777f,0.998086f,-0.0455073f, --0.112513f,0.981903f,0.152339f, --0.289647f,0.921573f,0.258473f, --0.276284f,0.866929f,0.414851f, --0.316808f,0.857367f,0.405653f, --0.333206f,0.853137f,0.401412f, --0.396081f,0.828088f,0.396725f, --0.485909f,0.809843f,0.328705f, --0.463328f,0.813789f,0.350819f, --0.520203f,0.774122f,0.360725f, --0.581754f,0.763678f,0.279925f, --0.55781f,0.791203f,0.250691f, --0.576356f,0.800103f,0.166282f, --0.522214f,0.839566f,0.149738f, --0.327667f,0.934488f,0.139166f, --0.239893f,0.965369f,0.102537f, --0.178401f,0.973537f,0.142826f, --0.0446164f,0.980327f,0.192274f, --0.152707f,0.98769f,0.0338934f, --0.061376f,0.996098f,-0.0634113f, --0.00816896f,0.988579f,-0.150483f, -0.0167009f,0.992551f,-0.120678f, -0.148875f,0.988771f,-0.0129578f, -0.0273451f,0.999626f,0.000950796f, --0.109359f,0.99398f,0.00672756f, --0.162948f,0.982686f,-0.0881845f, --0.242271f,0.966262f,-0.0874275f, --0.357996f,0.933723f,0.000140943f, --0.377863f,0.925289f,0.0325572f, --0.389424f,0.920391f,0.0350616f, --0.408888f,0.910343f,0.0639282f, --0.371945f,0.928232f,0.00649489f, --0.230632f,0.97289f,0.0171594f, --0.159091f,0.987197f,-0.0114848f, --0.122759f,0.984183f,-0.127724f, --0.175251f,0.974473f,-0.14032f, --0.35571f,0.933079f,-0.0532364f, --0.501387f,0.863164f,0.0596562f, --0.575441f,0.816492f,-0.0470046f, --0.501056f,0.856673f,-0.122698f, --0.414992f,0.888139f,-0.19746f, --0.309585f,0.914677f,-0.259854f, --0.0986663f,0.965073f,-0.242693f, --0.0576728f,0.965088f,-0.255499f, --0.0928316f,0.963296f,-0.251879f, --0.0710107f,0.944633f,-0.320352f, -0.0799711f,0.918771f,-0.386606f, -0.0834923f,0.89273f,-0.442789f, -0.0521243f,0.897343f,-0.438246f, -0.251171f,0.890827f,-0.378604f, -0.176541f,0.892631f,-0.414781f, -0.102505f,0.91423f,-0.392015f, -0.148543f,0.910792f,-0.385219f, -0.204336f,0.92739f,-0.313361f, -0.00672261f,0.969577f,-0.244696f, --0.0203828f,0.994006f,-0.10741f, -0.0984818f,0.994155f,-0.0442492f, -0.0884297f,0.979853f,-0.179077f, -0.079756f,0.934869f,-0.345919f, --0.0373135f,0.916973f,-0.3972f, --0.13475f,0.922044f,-0.362873f, --0.248554f,0.90561f,-0.343645f, --0.298871f,0.900649f,-0.315447f, --0.245556f,0.942684f,-0.225941f, --0.29156f,0.92569f,-0.241018f, --0.210251f,0.966564f,-0.146796f, --0.258034f,0.965595f,0.0323199f, --0.368176f,0.902709f,0.22263f, --0.350064f,0.851117f,0.391223f, --0.273287f,0.858969f,0.432996f, --0.285306f,0.881397f,0.376483f, --0.391023f,0.856564f,0.336748f, --0.346592f,0.838969f,0.419529f, --0.422742f,0.829366f,0.365295f, --0.513303f,0.775065f,0.368504f, --0.526999f,0.742246f,0.413935f, --0.485934f,0.782442f,0.389426f, --0.494091f,0.808005f,0.32094f, --0.527377f,0.820007f,0.222402f, --0.463863f,0.878834f,0.111725f, --0.310302f,0.94881f,0.0589178f, --0.228025f,0.964645f,0.132153f, --0.25901f,0.96255f,0.080067f, --0.0424596f,0.997867f,0.0495831f, --0.00646979f,0.998786f,0.048831f, -0.0235108f,0.999153f,0.033786f, -0.0350773f,0.999112f,0.0233587f, --0.06489f,0.99782f,0.0120079f, -0.0653571f,0.99589f,0.0626978f, -0.0437681f,0.989758f,0.13588f, --0.0612591f,0.992124f,0.109253f, --0.0700659f,0.993846f,0.085792f, --0.245254f,0.968292f,0.0475526f, --0.425333f,0.903383f,0.0546907f, --0.406557f,0.90921f,0.0897132f, --0.40303f,0.911526f,0.0817765f, --0.380881f,0.92142f,0.0769048f, --0.320213f,0.947262f,0.0126033f, --0.2583f,0.964583f,-0.0534921f, --0.102892f,0.993091f,-0.0564197f, --0.0482689f,0.996133f,-0.0734163f, --0.214829f,0.976629f,0.00662477f, --0.431775f,0.896672f,0.0977224f, --0.451215f,0.886255f,0.104672f, --0.522087f,0.848838f,-0.0830587f, --0.458286f,0.880944f,-0.117949f, --0.338524f,0.917937f,-0.206865f, --0.285281f,0.916752f,-0.279607f, --0.142352f,0.962006f,-0.232982f, --0.0943041f,0.983891f,-0.151875f, --0.0753867f,0.988192f,-0.133394f, -0.0592214f,0.975378f,-0.212437f, -0.135178f,0.93923f,-0.315553f, -0.146098f,0.928461f,-0.34149f, -0.0154593f,0.901088f,-0.433361f, -0.163565f,0.906515f,-0.389201f, -0.204593f,0.933049f,-0.295907f, -0.124274f,0.938076f,-0.323371f, -0.137407f,0.92485f,-0.354642f, -0.063168f,0.960879f,-0.269671f, --0.0720239f,0.98835f,-0.134077f, --0.0757271f,0.981006f,-0.178587f, -0.0897227f,0.968994f,-0.23022f, -0.219073f,0.948381f,-0.229303f, -0.192275f,0.938149f,-0.287936f, --0.0492263f,0.973953f,-0.221343f, --0.181885f,0.971294f,-0.153316f, --0.242476f,0.960686f,-0.135229f, --0.363624f,0.917475f,-0.161301f, --0.330978f,0.935565f,-0.12317f, --0.30439f,0.949195f,-0.0798413f, --0.362853f,0.931339f,-0.0307322f, --0.401675f,0.903644f,0.148607f, --0.425736f,0.872787f,0.238731f, --0.458216f,0.866256f,0.199096f, --0.325646f,0.913769f,0.242862f, --0.214745f,0.922085f,0.321938f, --0.398463f,0.884492f,0.242694f, --0.475038f,0.830832f,0.289927f, --0.448294f,0.764081f,0.463909f, --0.497042f,0.7065f,0.503792f, --0.489906f,0.735868f,0.467431f, --0.460921f,0.76339f,0.452535f, --0.40897f,0.781052f,0.471913f, --0.371818f,0.839399f,0.396435f, --0.326758f,0.904742f,0.27326f, --0.383198f,0.91056f,0.155045f, --0.284609f,0.924825f,0.252383f, --0.0749114f,0.976737f,0.200932f, -0.00799324f,0.997093f,0.0757729f, --0.0700844f,0.990942f,0.114551f, --0.0596966f,0.983848f,0.168758f, -0.00586433f,0.977052f,0.212922f, --0.0605914f,0.978841f,0.195443f, --0.0438257f,0.995801f,0.0803703f, --0.0570689f,0.993344f,0.100052f, --0.0606116f,0.987839f,0.143177f, --0.0960986f,0.983658f,0.152253f, --0.240218f,0.956553f,0.16523f, --0.410215f,0.902731f,0.129617f, --0.38596f,0.917352f,0.0974681f, --0.348531f,0.935694f,0.0547901f, --0.396424f,0.918039f,-0.00721866f, --0.26358f,0.961512f,0.0775866f, --0.177577f,0.982975f,0.0471779f, --0.0921077f,0.995708f,0.00907831f, --0.131805f,0.991186f,0.0133294f, --0.348565f,0.935587f,0.0563885f, --0.467549f,0.880933f,0.0731775f, --0.372581f,0.926945f,0.0442312f, --0.408929f,0.911847f,-0.0362219f, --0.445009f,0.893478f,-0.0605312f, --0.306432f,0.951885f,-0.00384437f, --0.259351f,0.965029f,0.0381644f, --0.265204f,0.963994f,-0.0195798f, --0.114808f,0.993343f,0.00942441f, --0.0279481f,0.990324f,-0.135929f, -0.103339f,0.977655f,-0.18306f, -0.218767f,0.966894f,-0.131368f, -0.207579f,0.958824f,-0.193824f, -0.136905f,0.960239f,-0.243308f, -0.117272f,0.934734f,-0.335438f, -0.133403f,0.937193f,-0.322294f, -0.140113f,0.948531f,-0.284001f, -0.0924439f,0.975124f,-0.201463f, --0.0405443f,0.993271f,-0.108481f, --0.0729426f,0.987394f,-0.140474f, -0.0307633f,0.972795f,-0.229615f, -0.200951f,0.951021f,-0.2349f, -0.206873f,0.91785f,-0.338755f, -0.0409109f,0.957201f,-0.286518f, --0.211311f,0.976629f,-0.0392802f, --0.256735f,0.961768f,0.0953371f, --0.237528f,0.960421f,0.145504f, --0.329105f,0.937835f,0.110248f, --0.355083f,0.930437f,0.0905737f, --0.33751f,0.931415f,0.13621f, --0.400013f,0.905919f,0.138928f, --0.505595f,0.854442f,0.119596f, --0.452675f,0.873473f,0.179247f, --0.360085f,0.917004f,0.17159f, --0.404496f,0.910531f,0.0855373f, --0.324231f,0.903855f,0.279141f, --0.336075f,0.852068f,0.40129f, --0.562491f,0.75864f,0.328737f, --0.580482f,0.703244f,0.410473f, --0.499356f,0.747889f,0.437385f, --0.47057f,0.77436f,0.423001f, --0.457721f,0.780273f,0.426221f, --0.387043f,0.830428f,0.400733f, --0.304454f,0.882516f,0.358431f, --0.240482f,0.915056f,0.323791f, --0.289179f,0.919765f,0.265345f, --0.239541f,0.954664f,0.176742f, --0.0468358f,0.993768f,0.10115f, --0.0227943f,0.987776f,0.154204f, --0.112093f,0.964309f,0.239881f, --0.0599845f,0.969963f,0.235741f, -0.0387578f,0.968143f,0.24738f, -0.0187191f,0.971458f,0.236471f, -0.242021f,0.896343f,0.371478f, -0.0480335f,0.972296f,0.228765f, --0.0779729f,0.986176f,0.146206f, --0.0941394f,0.982277f,0.16208f, --0.22083f,0.962927f,0.154936f, --0.380194f,0.918443f,0.109152f, --0.362825f,0.928988f,0.0730715f, --0.322334f,0.943799f,0.0731113f, --0.408658f,0.905696f,0.112752f, --0.342623f,0.91378f,0.218209f, --0.178962f,0.947287f,0.265744f, --0.0963031f,0.962264f,0.254507f, --0.129686f,0.959928f,0.248434f, --0.25861f,0.932715f,0.251325f, --0.400538f,0.911394f,0.0944958f, --0.371118f,0.928542f,0.00899351f, --0.395096f,0.916517f,0.0624194f, --0.492959f,0.864551f,0.097688f, --0.425957f,0.892844f,0.146255f, --0.256791f,0.9425f,0.213898f, --0.177422f,0.976398f,0.123157f, -0.0269208f,0.996881f,0.0741829f, -0.164645f,0.980831f,-0.104223f, -0.0973784f,0.963273f,-0.250244f, -0.114359f,0.965463f,-0.234102f, -0.250084f,0.96398f,-0.0905583f, -0.183861f,0.973241f,-0.137829f, -0.203921f,0.957737f,-0.202868f, -0.170155f,0.95208f,-0.254149f, -0.0373443f,0.963666f,-0.264487f, --0.0311132f,0.98854f,-0.147717f, --0.0500681f,0.990616f,-0.127173f, -0.0774781f,0.980584f,-0.180143f, -0.0416659f,0.952342f,-0.302174f, -0.183971f,0.945491f,-0.268702f, -0.234504f,0.932825f,-0.27358f, --0.0611848f,0.988685f,-0.13696f, --0.37387f,0.925543f,-0.059925f, --0.361069f,0.932447f,-0.0130774f, --0.247932f,0.961796f,0.1161f, --0.321909f,0.940217f,0.111206f, --0.373794f,0.915694f,0.147587f, --0.370927f,0.915202f,0.157537f, --0.367344f,0.908177f,0.20068f, --0.445687f,0.879826f,0.165134f, --0.480845f,0.872838f,0.0833169f, --0.396228f,0.900984f,0.176722f, --0.39533f,0.870559f,0.292987f, --0.514705f,0.791717f,0.329034f, --0.426478f,0.754312f,0.49913f, --0.476928f,0.731476f,0.487321f, --0.555203f,0.748777f,0.362053f, --0.513793f,0.811828f,0.277402f, --0.498737f,0.823176f,0.271372f, --0.459197f,0.851815f,0.252089f, --0.364638f,0.907849f,0.207f, --0.280535f,0.937686f,0.205051f, --0.204645f,0.959273f,0.194721f, --0.188424f,0.978285f,0.0863425f, --0.16576f,0.97773f,-0.128717f, --0.0413953f,0.984504f,-0.170405f, --0.119175f,0.989154f,-0.0858603f, --0.164393f,0.986215f,0.018821f, --0.0876541f,0.994439f,0.0583851f, --0.00781607f,0.987179f,0.159428f, --0.00608226f,0.980142f,0.198203f, -0.294056f,0.919888f,0.259494f, -0.176099f,0.946212f,0.271426f, --0.0256669f,0.973237f,0.228366f, --0.0934761f,0.978631f,0.183149f, --0.211202f,0.968374f,0.132837f, --0.345036f,0.933287f,0.0996237f, --0.346043f,0.935088f,0.0765773f, --0.381385f,0.918419f,0.105127f, --0.476923f,0.857096f,0.19476f, --0.397907f,0.88874f,0.227622f, --0.175271f,0.936954f,0.30232f, --0.040477f,0.944541f,0.325889f, --0.142418f,0.942444f,0.302518f, --0.246569f,0.91514f,0.318938f, --0.255277f,0.933873f,0.25043f, --0.348488f,0.92941f,0.121466f, --0.472178f,0.874219f,0.113089f, --0.490306f,0.858256f,0.151645f, --0.38804f,0.914553f,0.114097f, --0.196584f,0.979051f,0.0530513f, --0.0793551f,0.996572f,-0.0234008f, -0.0406197f,0.994776f,-0.0936505f, -0.24653f,0.966821f,-0.0669378f, -0.269235f,0.959692f,-0.0806517f, -0.0569112f,0.963296f,-0.26234f, -0.131503f,0.973945f,-0.184764f, -0.24729f,0.957434f,-0.148892f, -0.248779f,0.951221f,-0.18245f, -0.18718f,0.966303f,-0.176696f, -0.00607471f,0.977895f,-0.20901f, --0.0210706f,0.975074f,-0.220878f, -0.00501251f,0.949574f,-0.313502f, -0.0771251f,0.945518f,-0.316304f, -0.130553f,0.948445f,-0.288805f, -0.175519f,0.929764f,-0.323623f, -0.111769f,0.971665f,-0.208266f, --0.210844f,0.971563f,-0.107753f, --0.345299f,0.9344f,-0.087551f, --0.367127f,0.918607f,-0.146212f, --0.340753f,0.929779f,-0.139279f, --0.358585f,0.929839f,-0.0825605f, --0.393886f,0.919008f,-0.0166963f, --0.401193f,0.915983f,0.00451588f, --0.406108f,0.91192f,0.0589777f, --0.45609f,0.887954f,0.0593294f, --0.481921f,0.86351f,0.148669f, --0.533578f,0.80576f,0.256994f, --0.480795f,0.753832f,0.447854f, --0.502576f,0.721353f,0.476516f, --0.457582f,0.746697f,0.482766f, --0.419108f,0.791496f,0.44484f, --0.465376f,0.834036f,0.296325f, --0.468919f,0.860429f,0.199442f, --0.486627f,0.858618f,0.161151f, --0.430227f,0.89524f,0.115972f, --0.34028f,0.937953f,0.066739f, --0.311486f,0.949765f,0.0303886f, --0.166884f,0.985403f,0.0336267f, -0.0381647f,0.996782f,-0.0704869f, -0.0486826f,0.951753f,-0.302979f, --0.0940893f,0.932244f,-0.349383f, --0.229015f,0.944857f,-0.234089f, --0.214421f,0.956596f,-0.19735f, --0.17466f,0.962579f,-0.207209f, --0.106663f,0.986513f,-0.124157f, --0.0523564f,0.993983f,-0.0962102f, -0.1751f,0.970986f,0.162867f, -0.126838f,0.957099f,0.260524f, --0.0248407f,0.948904f,0.314587f, --0.0169284f,0.94527f,0.325849f, --0.126002f,0.963121f,0.237743f, --0.322368f,0.933961f,0.154262f, --0.357267f,0.920847f,0.156206f, --0.40825f,0.900639f,0.148934f, --0.500408f,0.86145f,0.0865774f, --0.437173f,0.895731f,0.0809122f, --0.234862f,0.957423f,0.167871f, --0.122112f,0.971133f,0.204913f, --0.146988f,0.949325f,0.277805f, --0.214866f,0.947227f,0.237893f, --0.166781f,0.968529f,0.184757f, --0.279132f,0.953637f,0.112522f, --0.438908f,0.892826f,0.101101f, --0.476448f,0.878957f,0.0207741f, --0.317496f,0.946313f,-0.0607282f, --0.175675f,0.968847f,-0.174568f, -0.00443594f,0.981128f,-0.193308f, -0.0639918f,0.955901f,-0.286634f, -0.156615f,0.959233f,-0.235253f, -0.281138f,0.953388f,-0.109604f, -0.173642f,0.975105f,-0.137905f, -0.125725f,0.970112f,-0.207546f, -0.23259f,0.936622f,-0.261996f, -0.234534f,0.938208f,-0.25448f, -0.160485f,0.952598f,-0.258459f, -0.0824642f,0.968528f,-0.234849f, -0.0634583f,0.946763f,-0.315614f, -0.0567562f,0.917557f,-0.393532f, -0.0240187f,0.918352f,-0.395035f, -0.0995244f,0.946786f,-0.30609f, -0.0782245f,0.971194f,-0.225085f, -0.0104903f,0.995647f,-0.0926114f, --0.185802f,0.976721f,-0.107212f, --0.328502f,0.923412f,-0.198486f, --0.311331f,0.92975f,-0.196566f, --0.349149f,0.904891f,-0.24345f, --0.388436f,0.90322f,-0.182515f, --0.447323f,0.88531f,-0.126995f, --0.452109f,0.890067f,-0.0581177f, --0.409043f,0.912515f,0.000312055f, --0.489105f,0.872225f,-0.000401423f, --0.602394f,0.789815f,0.115381f, --0.644891f,0.727938f,0.232857f, --0.581256f,0.729671f,0.360168f, --0.503025f,0.763549f,0.404917f, --0.449741f,0.833702f,0.320428f, --0.320295f,0.891402f,0.320645f, --0.365897f,0.908793f,0.200535f, --0.418513f,0.900509f,0.118029f, --0.464312f,0.883882f,0.0562756f, --0.399182f,0.916811f,0.0105308f, --0.291715f,0.956056f,-0.0293054f, --0.237447f,0.965751f,-0.104617f, --0.100041f,0.966568f,-0.236091f, -0.160871f,0.934989f,-0.316096f, -0.093049f,0.931221f,-0.352375f, --0.15859f,0.964926f,-0.209204f, --0.273524f,0.944194f,-0.183526f, --0.190425f,0.948278f,-0.253984f, --0.130985f,0.95529f,-0.265074f, --0.109109f,0.943759f,-0.312112f, --0.0442587f,0.936376f,-0.348197f, -0.0244075f,0.991066f,0.131121f, --0.0145509f,0.975134f,0.221137f, --0.0404534f,0.947565f,0.316994f, --0.0554847f,0.953641f,0.295787f, --0.0378486f,0.926136f,0.375287f, --0.276884f,0.909741f,0.309364f, --0.35531f,0.878584f,0.319132f, --0.28855f,0.905318f,0.311668f, --0.418654f,0.900829f,0.115051f, --0.470621f,0.881923f,0.0269622f, --0.302456f,0.950707f,0.0683814f, --0.155931f,0.981097f,0.114601f, --0.172528f,0.971746f,0.161072f, --0.175279f,0.972437f,0.153763f, --0.0948884f,0.989506f,0.108971f, --0.271832f,0.96203f,0.0246161f, --0.434113f,0.899816f,0.0433328f, --0.41192f,0.910729f,-0.0299284f, --0.184465f,0.976107f,-0.114836f, --0.0519711f,0.950434f,-0.306552f, -0.0510061f,0.914254f,-0.401918f, -0.0714878f,0.915457f,-0.396015f, -0.0823148f,0.944294f,-0.318643f, -0.154376f,0.938672f,-0.308322f, -0.218285f,0.948145f,-0.231024f, -0.158935f,0.938404f,-0.306818f, -0.261223f,0.9329f,-0.247912f, -0.285998f,0.932056f,-0.222434f, -0.190198f,0.913869f,-0.358703f, -0.0636773f,0.892218f,-0.447094f, -0.10205f,0.889697f,-0.445f, -0.100031f,0.900986f,-0.422159f, -0.0104969f,0.905423f,-0.424381f, --0.0688464f,0.910262f,-0.408268f, --0.0482237f,0.974352f,-0.219802f, --0.0083558f,0.994225f,-0.106992f, --0.112134f,0.979056f,-0.169927f, --0.229912f,0.945374f,-0.231102f, --0.280533f,0.899591f,-0.334719f, --0.346884f,0.867971f,-0.355384f, --0.459064f,0.843199f,-0.279779f, --0.497889f,0.848119f,-0.181111f, --0.501207f,0.860371f,-0.0924901f, --0.458162f,0.888868f,-0.00122281f, --0.514613f,0.855463f,0.0579275f, --0.647763f,0.760835f,0.0391491f, --0.704753f,0.709026f,0.0246046f, --0.656653f,0.750377f,0.0757771f, --0.504188f,0.854115f,0.127601f, --0.41033f,0.905141f,0.111126f, --0.337511f,0.936543f,0.0947305f, --0.307169f,0.946112f,0.10256f, --0.367429f,0.928128f,0.0597776f, --0.393986f,0.91872f,-0.0269814f, --0.373766f,0.918684f,-0.127743f, --0.26114f,0.960116f,-0.0999132f, --0.103927f,0.984722f,-0.139723f, -0.0511518f,0.955672f,-0.289956f, -0.187205f,0.928701f,-0.320109f, --0.0295799f,0.970029f,-0.241182f, --0.314429f,0.940081f,-0.13184f, --0.185337f,0.978913f,-0.0859053f, --0.104364f,0.967564f,-0.230061f, --0.0895833f,0.932754f,-0.349206f, --0.054587f,0.891296f,-0.450124f, -0.0297567f,0.885691f,-0.463321f, -0.100841f,0.951386f,0.291024f, --0.0719364f,0.970866f,0.22857f, --0.0950354f,0.957535f,0.272204f, --0.063148f,0.9475f,0.313457f, --0.147905f,0.922206f,0.357295f, --0.255052f,0.862392f,0.437296f, --0.348295f,0.831026f,0.433689f, --0.228735f,0.861593f,0.453141f, --0.189137f,0.904176f,0.383004f, --0.40614f,0.912877f,0.041313f, --0.322035f,0.946605f,-0.0152552f, --0.213289f,0.976152f,0.0404333f, --0.216957f,0.96919f,0.116619f, --0.143471f,0.982181f,0.121395f, --0.0619809f,0.995307f,0.0743149f, --0.20303f,0.975599f,0.0835793f, --0.415979f,0.909172f,0.0191678f, --0.336954f,0.94062f,-0.0411873f, --0.0679584f,0.981162f,-0.180839f, -0.116786f,0.956914f,-0.265849f, -0.119526f,0.96094f,-0.249616f, --0.00488697f,0.95735f,-0.288889f, -0.0539017f,0.947486f,-0.315223f, -0.147321f,0.922615f,-0.35648f, -0.255572f,0.910786f,-0.324272f, -0.156463f,0.885962f,-0.436566f, -0.1301f,0.92297f,-0.362215f, -0.25276f,0.923086f,-0.289871f, -0.383737f,0.889757f,-0.247141f, -0.211205f,0.883014f,-0.419141f, -0.0342331f,0.879599f,-0.474482f, -0.00319575f,0.938694f,-0.344735f, -0.0177214f,0.953292f,-0.301529f, --0.111253f,0.93857f,-0.326663f, --0.240335f,0.933381f,-0.26653f, --0.0538188f,0.987001f,-0.151433f, --0.0274864f,0.979377f,-0.200162f, --0.187631f,0.946384f,-0.262966f, --0.206926f,0.955659f,-0.209519f, --0.334901f,0.924406f,-0.182523f, --0.500035f,0.842333f,-0.201099f, --0.536058f,0.812568f,-0.228857f, --0.57838f,0.789021f,-0.207176f, --0.551453f,0.831854f,-0.0625953f, --0.537806f,0.840551f,0.0651045f, --0.581123f,0.812541f,0.0455343f, --0.677773f,0.725811f,-0.117567f, --0.674512f,0.726391f,-0.131871f, --0.561194f,0.823313f,-0.0849523f, --0.426155f,0.904036f,-0.0333265f, --0.350057f,0.935877f,-0.0399208f, --0.324764f,0.94579f,-0.0029281f, --0.334572f,0.942069f,0.0238272f, --0.264187f,0.96401f,-0.0298196f, --0.331302f,0.926674f,-0.177522f, --0.297768f,0.937944f,-0.177749f, --0.0551409f,0.983889f,-0.170067f, -0.144484f,0.972505f,-0.182644f, -0.119335f,0.96645f,-0.227451f, --0.0885992f,0.982619f,-0.163126f, --0.33707f,0.92576f,-0.171324f, --0.162854f,0.966557f,-0.198108f, -0.0162126f,0.974218f,-0.225026f, -0.138436f,0.947057f,-0.289688f, -0.0835536f,0.876982f,-0.473204f, --0.010237f,0.848096f,-0.529743f, -0.136921f,0.906371f,0.399681f, -0.0140824f,0.922185f,0.386492f, --0.160268f,0.929321f,0.33268f, --0.112451f,0.900092f,0.420938f, --0.203296f,0.876433f,0.436504f, --0.322996f,0.829667f,0.455332f, --0.340765f,0.827757f,0.445755f, --0.257344f,0.84669f,0.465715f, -0.00366351f,0.865541f,0.500825f, --0.0425812f,0.956742f,0.287804f, --0.322344f,0.945159f,-0.052618f, --0.280797f,0.958795f,-0.0431994f, --0.262333f,0.964629f,-0.0259446f, --0.0891831f,0.995449f,-0.0335709f, --0.0801038f,0.992742f,-0.0896982f, --0.224206f,0.974484f,0.0105758f, --0.364477f,0.9309f,-0.0241328f, --0.198506f,0.970273f,-0.138443f, -0.0492304f,0.955815f,-0.289816f, -0.0465241f,0.961334f,-0.271428f, -0.0147498f,0.993644f,-0.111598f, -0.136409f,0.989222f,-0.0532271f, -0.148553f,0.957532f,-0.247113f, -0.203722f,0.927854f,-0.312384f, -0.268253f,0.883803f,-0.383317f, -0.18614f,0.887058f,-0.422469f, -0.10218f,0.907566f,-0.407286f, -0.200645f,0.878358f,-0.433854f, -0.320433f,0.870875f,-0.372692f, -0.278243f,0.911383f,-0.303252f, --0.0169368f,0.97379f,-0.226818f, --0.116502f,0.978925f,-0.16773f, -0.0246686f,0.985931f,-0.165321f, --0.099417f,0.977857f,-0.184152f, --0.275352f,0.945128f,-0.175824f, --0.0928967f,0.974055f,-0.206368f, -0.0664566f,0.97817f,-0.196893f, --0.180659f,0.959555f,-0.21591f, --0.356529f,0.924348f,-0.135896f, --0.392702f,0.919607f,0.0104344f, --0.427591f,0.903919f,-0.00980201f, --0.491673f,0.851131f,-0.183941f, --0.597871f,0.779934f,-0.185076f, --0.630214f,0.771159f,-0.0902474f, --0.603795f,0.796392f,-0.0345128f, --0.532942f,0.846043f,0.013577f, --0.560658f,0.826581f,-0.049261f, --0.693149f,0.692482f,-0.200033f, --0.591049f,0.792583f,-0.14991f, --0.423413f,0.894971f,-0.14053f, --0.360923f,0.922234f,-0.138633f, --0.376728f,0.924323f,-0.0608465f, --0.330964f,0.94352f,-0.0152562f, --0.205049f,0.976512f,-0.0661789f, --0.221147f,0.966952f,-0.126878f, --0.282753f,0.933366f,-0.221083f, --0.0599842f,0.959615f,-0.274846f, -0.119046f,0.947951f,-0.295324f, -0.164559f,0.948383f,-0.27109f, --0.0951076f,0.948417f,-0.302424f, --0.271887f,0.913351f,-0.303098f, --0.128933f,0.917201f,-0.376985f, -0.0280066f,0.909443f,-0.414885f, -0.150608f,0.898143f,-0.413106f, -0.212115f,0.88838f,-0.407172f, -0.0467869f,0.87371f,-0.484191f, -0.135605f,0.903203f,0.407228f, --0.01172f,0.896648f,0.44259f, --0.138887f,0.847422f,0.512432f, --0.170991f,0.843044f,0.50994f, --0.191878f,0.839246f,0.508772f, --0.300268f,0.838171f,0.455311f, --0.32966f,0.831286f,0.447535f, --0.223175f,0.877254f,0.424992f, --0.0256774f,0.953915f,0.298977f, -0.199545f,0.913698f,0.354031f, --0.0319727f,0.980881f,0.191963f, --0.258985f,0.964126f,-0.0582107f, --0.212788f,0.970943f,-0.109502f, --0.0721792f,0.982085f,-0.174064f, --0.0849627f,0.985898f,-0.144175f, --0.290021f,0.949136f,-0.122591f, --0.248272f,0.954348f,-0.166075f, --0.0507313f,0.942327f,-0.330828f, -0.0792104f,0.910775f,-0.405234f, --0.0679775f,0.927432f,-0.367762f, --0.0963141f,0.945938f,-0.309718f, -0.147422f,0.952479f,-0.266555f, -0.232988f,0.930423f,-0.282895f, -0.296671f,0.921407f,-0.250989f, -0.346023f,0.880014f,-0.325337f, -0.246011f,0.893818f,-0.374924f, -0.0779935f,0.862828f,-0.499444f, -0.218748f,0.861753f,-0.457746f, -0.236169f,0.890523f,-0.388836f, -0.122215f,0.968128f,-0.218613f, --0.119249f,0.983741f,-0.134288f, --0.0975043f,0.983669f,-0.151287f, -0.0551556f,0.975975f,-0.210786f, --0.0858442f,0.972611f,-0.216008f, --0.228301f,0.939116f,-0.256789f, --0.0600278f,0.94195f,-0.330342f, --0.00498162f,0.954835f,-0.297095f, --0.236752f,0.956732f,-0.169151f, --0.404481f,0.905728f,-0.126698f, --0.442956f,0.884106f,-0.148815f, --0.353117f,0.929811f,-0.103732f, --0.367684f,0.920274f,-0.133808f, --0.620195f,0.758926f,-0.19847f, --0.650875f,0.742352f,-0.158981f, --0.60395f,0.783223f,-0.147668f, --0.562027f,0.815077f,-0.140626f, --0.504739f,0.855197f,-0.117796f, --0.629314f,0.743816f,-0.22517f, --0.590837f,0.750634f,-0.295736f, --0.432954f,0.842346f,-0.320942f, --0.414184f,0.8722f,-0.260227f, --0.438355f,0.884876f,-0.157606f, --0.309198f,0.940747f,-0.13925f, --0.155389f,0.967122f,-0.20132f, --0.14424f,0.961525f,-0.233805f, --0.235758f,0.924f,-0.301067f, -0.0151186f,0.960375f,-0.278299f, -0.144315f,0.944571f,-0.294888f, -0.112415f,0.964242f,-0.239999f, --0.0426025f,0.977992f,-0.204249f, --0.206795f,0.910666f,-0.357663f, --0.0742651f,0.885367f,-0.458922f, -0.0946583f,0.875247f,-0.474324f, -0.121834f,0.836586f,-0.534117f, -0.198513f,0.859849f,-0.470374f, -0.17646f,0.872184f,-0.456242f, -0.0304109f,0.916616f,0.39861f, --0.119037f,0.881644f,0.456655f, --0.241587f,0.81204f,0.53125f, --0.146676f,0.796898f,0.586037f, --0.0991089f,0.808485f,0.580111f, --0.265015f,0.835696f,0.481019f, --0.330941f,0.833473f,0.442495f, --0.0736129f,0.908742f,0.410816f, -0.128357f,0.956244f,0.26291f, -0.135386f,0.977167f,0.163754f, -0.135126f,0.969499f,0.204482f, --0.0826833f,0.991706f,0.0984031f, --0.125203f,0.992066f,-0.0113628f, --0.0793175f,0.988189f,-0.131112f, --0.135148f,0.988869f,-0.0622353f, --0.236045f,0.96998f,-0.0584937f, --0.106098f,0.976702f,-0.186536f, -0.0734477f,0.937214f,-0.340932f, -0.0657813f,0.913127f,-0.402333f, --0.0656411f,0.925185f,-0.373797f, --0.0812155f,0.911514f,-0.403169f, -0.138018f,0.895606f,-0.422895f, -0.180346f,0.87052f,-0.457898f, -0.220345f,0.874256f,-0.43258f, -0.337626f,0.867122f,-0.366208f, -0.351448f,0.893332f,-0.280076f, -0.206919f,0.931373f,-0.299548f, -0.143612f,0.950749f,-0.274684f, -0.0388897f,0.972032f,-0.231606f, --0.0281782f,0.996586f,-0.077599f, --0.0348963f,0.997716f,-0.0578427f, --0.0315338f,0.968969f,-0.245163f, -0.0536322f,0.969299f,-0.239965f, --0.0592746f,0.980608f,-0.186802f, --0.146447f,0.958871f,-0.243144f, --0.0489008f,0.966653f,-0.251379f, --0.0921771f,0.973026f,-0.211482f, --0.303489f,0.921788f,-0.24125f, --0.360359f,0.892722f,-0.270533f, --0.374413f,0.86994f,-0.320965f, --0.420297f,0.839321f,-0.344805f, --0.400389f,0.890168f,-0.217463f, --0.5519f,0.817694f,-0.163655f, --0.641175f,0.723209f,-0.25664f, --0.591295f,0.757829f,-0.275801f, --0.562781f,0.775127f,-0.287152f, --0.492934f,0.830818f,-0.258375f, --0.559738f,0.799568f,-0.21768f, --0.572862f,0.78051f,-0.250266f, --0.449965f,0.836305f,-0.31325f, --0.485973f,0.815927f,-0.313197f, --0.461831f,0.850292f,-0.252418f, --0.261301f,0.911823f,-0.316702f, --0.0988633f,0.911184f,-0.399961f, --0.117544f,0.902602f,-0.414118f, --0.193385f,0.896249f,-0.399173f, --0.121448f,0.924471f,-0.361392f, -0.0924319f,0.986306f,-0.136592f, -0.0129691f,0.994218f,-0.106593f, -0.0478938f,0.996018f,-0.0752017f, -0.0322924f,0.95892f,-0.281832f, -0.0176709f,0.880909f,-0.472956f, -0.117774f,0.85642f,-0.502666f, -0.141956f,0.850649f,-0.506206f, -0.133057f,0.865588f,-0.482757f, -0.139695f,0.858438f,-0.493528f, --0.227309f,0.878161f,0.420907f, --0.208802f,0.809453f,0.548805f, --0.283627f,0.767885f,0.574377f, --0.166581f,0.77975f,0.603523f, --0.0979994f,0.806409f,0.583181f, --0.132228f,0.805326f,0.577898f, --0.219374f,0.878043f,0.425342f, --0.024745f,0.955845f,0.292828f, -0.235018f,0.923494f,0.303193f, -0.225806f,0.944421f,0.238915f, -0.125193f,0.981151f,0.147203f, --0.0300197f,0.990754f,0.132305f, --0.0418198f,0.992604f,0.113964f, -0.010498f,0.998335f,0.0567192f, --0.187859f,0.981941f,-0.0223995f, --0.164152f,0.985849f,-0.0340039f, --0.00148231f,0.989313f,-0.145799f, -0.214865f,0.96059f,-0.176353f, -0.130927f,0.950976f,-0.280185f, --0.0784848f,0.932131f,-0.353513f, --0.05291f,0.922588f,-0.382142f, -0.16861f,0.90111f,-0.399463f, -0.291627f,0.864919f,-0.408495f, -0.209787f,0.830907f,-0.515347f, -0.211969f,0.855025f,-0.473287f, -0.179371f,0.927145f,-0.328982f, -0.0938016f,0.98223f,-0.162562f, -0.0948278f,0.994302f,-0.0487031f, -0.0439203f,0.998532f,-0.0316906f, --0.0612398f,0.9958f,-0.0680553f, -0.0442323f,0.992295f,-0.115732f, -0.0938163f,0.983362f,-0.155559f, --0.00984882f,0.984434f,-0.175479f, --0.064778f,0.984002f,-0.165961f, --0.129271f,0.96358f,-0.234101f, --0.126642f,0.968315f,-0.215238f, --0.066296f,0.988071f,-0.138997f, --0.153283f,0.960153f,-0.233691f, --0.288259f,0.887225f,-0.360193f, --0.349196f,0.862768f,-0.365641f, --0.457337f,0.833523f,-0.309971f, --0.510223f,0.838902f,-0.189514f, --0.576482f,0.813491f,-0.0768136f, --0.627022f,0.773599f,-0.0915885f, --0.562811f,0.806938f,-0.179152f, --0.554556f,0.77173f,-0.31129f, --0.544029f,0.784112f,-0.298665f, --0.593089f,0.773019f,-0.225135f, --0.565758f,0.788678f,-0.240633f, --0.424914f,0.871459f,-0.244963f, --0.461935f,0.845882f,-0.266647f, --0.437432f,0.833935f,-0.336461f, --0.166572f,0.89804f,-0.407159f, --0.027465f,0.893903f,-0.447419f, --0.142495f,0.890824f,-0.431426f, --0.254187f,0.896659f,-0.36248f, --0.245781f,0.925153f,-0.289282f, --0.124728f,0.970098f,-0.208211f, -0.0496061f,0.995502f,-0.0807218f, -0.134453f,0.977049f,-0.165221f, -0.178593f,0.948688f,-0.260952f, -0.203783f,0.948389f,-0.242962f, -0.169172f,0.89845f,-0.405178f, -0.129822f,0.855112f,-0.501925f, -0.114157f,0.849198f,-0.515587f, -0.207913f,0.855521f,-0.47419f, --0.447508f,0.787815f,0.423184f, --0.372189f,0.752087f,0.543911f, --0.298757f,0.721076f,0.625135f, --0.109779f,0.732409f,0.671956f, --0.05023f,0.773443f,0.631872f, --0.0721375f,0.784971f,0.615319f, -0.0161123f,0.834678f,0.550503f, -0.0881584f,0.925537f,0.368252f, -0.194291f,0.939133f,0.283338f, -0.290284f,0.915951f,0.277072f, -0.206501f,0.959193f,0.193147f, -0.0129994f,0.989588f,0.143339f, --0.0515539f,0.993638f,0.100126f, -0.0752528f,0.992857f,0.0925807f, --0.11243f,0.993659f,-0.00132253f, --0.0900456f,0.995381f,-0.0332891f, -0.0735618f,0.988585f,-0.131483f, -0.187914f,0.97058f,-0.150539f, -0.259537f,0.959521f,-0.109363f, -0.039582f,0.950958f,-0.306778f, -0.0151247f,0.899216f,-0.437243f, -0.157602f,0.861329f,-0.482984f, -0.313265f,0.852495f,-0.41847f, -0.26241f,0.877515f,-0.401384f, -0.106606f,0.940488f,-0.322671f, -0.0451106f,0.964729f,-0.259351f, --0.0198008f,0.966294f,-0.256677f, -0.0415355f,0.979836f,-0.195439f, -0.019077f,0.98811f,-0.15256f, -0.00843283f,0.995377f,-0.095676f, -0.0813095f,0.98616f,-0.14449f, -0.0601215f,0.98288f,-0.174159f, -0.0231889f,0.98066f,-0.194342f, --0.0257967f,0.969536f,-0.243588f, --0.0655874f,0.972755f,-0.222364f, --0.116074f,0.960607f,-0.252509f, --0.11539f,0.952331f,-0.282402f, --0.0547002f,0.971779f,-0.229464f, --0.238443f,0.921749f,-0.305817f, --0.409013f,0.87493f,-0.259242f, --0.537403f,0.830349f,-0.147369f, --0.604026f,0.794872f,-0.0577237f, --0.636334f,0.771366f,0.00856593f, --0.598176f,0.796287f,0.0900769f, --0.445184f,0.894265f,0.0458439f, --0.510078f,0.851049f,-0.124644f, --0.584904f,0.80616f,-0.0894032f, --0.566358f,0.809139f,-0.156631f, --0.526778f,0.78194f,-0.333278f, --0.411595f,0.815587f,-0.406703f, --0.430581f,0.806825f,-0.404517f, --0.346574f,0.828739f,-0.439406f, --0.163187f,0.84355f,-0.511658f, --0.120565f,0.900123f,-0.41862f, --0.22033f,0.94784f,-0.230335f, --0.354954f,0.922144f,-0.15381f, --0.229701f,0.962171f,-0.146509f, --0.156358f,0.938689f,-0.30727f, --0.0202846f,0.954287f,-0.298202f, -0.237025f,0.938874f,-0.24967f, -0.153523f,0.923965f,-0.350312f, -0.146234f,0.948682f,-0.280389f, -0.334575f,0.915861f,-0.221942f, -0.32488f,0.905199f,-0.273985f, -0.124349f,0.918374f,-0.375668f, -0.0853809f,0.932635f,-0.350575f, --0.326098f,0.745953f,0.580702f, --0.408924f,0.742079f,0.53113f, --0.380928f,0.732802f,0.563822f, --0.135265f,0.771831f,0.621274f, -0.0172939f,0.791015f,0.611552f, --0.0321407f,0.821651f,0.569084f, -0.110827f,0.821493f,0.559345f, -0.260047f,0.831043f,0.491674f, -0.30077f,0.882298f,0.362061f, -0.33436f,0.910333f,0.243922f, -0.27591f,0.939307f,0.203903f, -0.0278945f,0.981912f,0.18727f, --0.00885636f,0.980185f,0.197887f, -0.145141f,0.978135f,0.148949f, --0.0144219f,0.999761f,0.0164012f, --0.0725846f,0.989236f,-0.127057f, -0.156537f,0.975005f,-0.157677f, -0.153594f,0.966224f,-0.206929f, -0.277291f,0.95249f,-0.125986f, -0.254121f,0.951784f,-0.171844f, -0.192884f,0.934802f,-0.298229f, -0.176671f,0.893747f,-0.412315f, -0.195208f,0.917965f,-0.345303f, -0.157451f,0.974963f,-0.157023f, -0.0279983f,0.991052f,-0.13051f, -0.088609f,0.976865f,-0.194637f, -0.0507072f,0.953301f,-0.297735f, --0.0277167f,0.944799f,-0.326477f, --0.027462f,0.967827f,-0.250115f, --0.0885824f,0.972427f,-0.215728f, -0.0938124f,0.990405f,-0.101477f, -0.168783f,0.975825f,-0.138845f, -0.111665f,0.949064f,-0.294633f, --0.0373777f,0.928827f,-0.368623f, --0.132876f,0.934016f,-0.3316f, --0.0938993f,0.959978f,-0.263865f, --0.105226f,0.962669f,-0.249392f, --0.104341f,0.966883f,-0.232916f, --0.220802f,0.965347f,-0.13911f, --0.478375f,0.876928f,-0.0464122f, --0.604444f,0.796064f,0.0305022f, --0.611643f,0.789038f,0.0575453f, --0.651561f,0.758511f,-0.0113831f, --0.622019f,0.781788f,-0.0435906f, --0.406862f,0.913403f,-0.012587f, --0.447294f,0.893518f,0.0394196f, --0.595605f,0.801728f,0.049859f, --0.453119f,0.890822f,0.0334497f, --0.397535f,0.913376f,-0.0878049f, --0.358743f,0.901381f,-0.242521f, --0.368468f,0.876571f,-0.309604f, --0.3524f,0.834147f,-0.42428f, --0.221095f,0.907887f,-0.356171f, --0.336012f,0.912731f,-0.232418f, --0.365521f,0.924164f,-0.110978f, --0.381997f,0.913352f,-0.140951f, --0.128103f,0.980976f,-0.145863f, -0.0620369f,0.958271f,-0.279048f, --0.0393717f,0.894694f,-0.44494f, -0.166576f,0.906235f,-0.388576f, -0.257306f,0.912784f,-0.317204f, -0.0500832f,0.912737f,-0.405466f, -0.219062f,0.950498f,-0.220374f, -0.303476f,0.949102f,-0.0843104f, -0.167756f,0.983709f,-0.0646101f, --0.00137806f,0.991718f,-0.128423f, --0.411803f,0.737245f,0.535619f, --0.383529f,0.716567f,0.582612f, --0.385829f,0.756694f,0.527779f, --0.125894f,0.866623f,0.482821f, -0.0864817f,0.885592f,0.456341f, -0.0185611f,0.909875f,0.414467f, -0.0890012f,0.92755f,0.362947f, -0.3312f,0.85507f,0.39895f, -0.411118f,0.842585f,0.347898f, -0.395768f,0.87253f,0.286458f, -0.265631f,0.912624f,0.310738f, -0.0432866f,0.942781f,0.330591f, --0.0291247f,0.959608f,0.279829f, -0.17674f,0.935093f,0.307187f, -0.194038f,0.946511f,0.25781f, -0.0938941f,0.995535f,0.00965941f, -0.2133f,0.967919f,-0.132802f, -0.174202f,0.951285f,-0.254382f, -0.185706f,0.942688f,-0.277223f, -0.254853f,0.951817f,-0.170569f, -0.272452f,0.946195f,-0.174599f, -0.236374f,0.944357f,-0.228728f, -0.0622104f,0.974295f,-0.216517f, -0.00421412f,0.994674f,-0.102989f, -0.150974f,0.988535f,0.00252771f, -0.198367f,0.972494f,-0.122094f, -0.128147f,0.983415f,-0.128347f, -0.00128047f,0.972843f,-0.231463f, --0.0877992f,0.94046f,-0.328368f, --0.123322f,0.945018f,-0.302876f, -0.0120775f,0.960206f,-0.279033f, -0.230563f,0.945381f,-0.230424f, -0.231597f,0.934072f,-0.271795f, -0.0492688f,0.934225f,-0.353265f, --0.160672f,0.892999f,-0.4204f, --0.160391f,0.913064f,-0.374951f, --0.146451f,0.932705f,-0.329565f, --0.203905f,0.952995f,-0.224107f, --0.374034f,0.927408f,-0.00361175f, --0.538909f,0.826945f,0.160435f, --0.614792f,0.776175f,0.139939f, --0.589081f,0.79961f,0.116649f, --0.558852f,0.827241f,0.0579274f, --0.582196f,0.802416f,-0.131063f, --0.51435f,0.846005f,-0.140428f, --0.52517f,0.850476f,0.0297862f, --0.596917f,0.80173f,0.0303285f, --0.476386f,0.879145f,0.0126877f, --0.346071f,0.935165f,0.0755073f, --0.29506f,0.953573f,0.0603189f, --0.290873f,0.956376f,0.0271545f, --0.342792f,0.934849f,-0.0924672f, --0.36131f,0.919889f,-0.152511f, --0.440677f,0.895263f,-0.0656364f, --0.27224f,0.960453f,-0.0584458f, --0.239345f,0.939791f,-0.243941f, --0.184322f,0.924268f,-0.334296f, -0.170265f,0.967851f,-0.185131f, -0.0831722f,0.975078f,-0.205681f, -0.0764752f,0.962386f,-0.2607f, -0.25092f,0.948574f,-0.192995f, --0.000511184f,0.983325f,-0.181855f, -0.00805518f,0.99922f,-0.0386666f, -0.231558f,0.969957f,0.0745867f, -0.213284f,0.97378f,0.0791335f, -0.134707f,0.990255f,0.0353415f, --0.461887f,0.727903f,0.506772f, --0.409704f,0.769768f,0.48949f, --0.245031f,0.85373f,0.459461f, --0.000652498f,0.933053f,0.359739f, -0.0977619f,0.940993f,0.323999f, -0.0976539f,0.925223f,0.366641f, -0.122528f,0.958779f,0.256377f, -0.300256f,0.92807f,0.220301f, -0.434057f,0.868364f,0.239872f, -0.373936f,0.875783f,0.305249f, -0.188752f,0.892291f,0.41011f, -0.0749298f,0.875078f,0.478146f, -0.0539526f,0.905587f,0.420716f, -0.139771f,0.930537f,0.338475f, -0.252071f,0.902374f,0.349544f, -0.271241f,0.91149f,0.309214f, -0.343876f,0.91657f,0.204082f, -0.324141f,0.940857f,0.098591f, -0.18373f,0.982977f,-0.000581414f, -0.215424f,0.976468f,-0.0101277f, -0.272942f,0.961141f,-0.0413737f, -0.263192f,0.964688f,-0.010384f, -0.0834313f,0.988492f,-0.126183f, --0.0244777f,0.972824f,-0.230248f, -0.037395f,0.972598f,-0.229465f, -0.188221f,0.98005f,-0.0638298f, -0.133895f,0.99093f,-0.0113778f, -0.15553f,0.985289f,-0.0708293f, -0.062154f,0.97927f,-0.19279f, --0.0906565f,0.929896f,-0.356476f, --0.00537849f,0.905315f,-0.424706f, -0.162604f,0.918237f,-0.361109f, -0.211297f,0.942163f,-0.260159f, -0.166674f,0.959094f,-0.22882f, --0.0900843f,0.919646f,-0.382278f, --0.185542f,0.891522f,-0.413234f, --0.236454f,0.911319f,-0.337026f, --0.404129f,0.904849f,-0.133894f, --0.540771f,0.839361f,0.0551279f, --0.598434f,0.794978f,0.0994372f, --0.56944f,0.810652f,0.136315f, --0.572323f,0.818089f,0.0563579f, --0.472334f,0.880613f,0.0376913f, --0.539685f,0.840552f,-0.0470301f, --0.574258f,0.816988f,0.0525225f, --0.582793f,0.802613f,0.127141f, --0.577964f,0.810669f,0.0936681f, --0.453297f,0.886551f,0.0924669f, --0.392456f,0.918879f,0.0405067f, --0.316387f,0.94595f,0.0712573f, --0.278453f,0.953269f,0.117224f, --0.268053f,0.957793f,0.103824f, --0.307148f,0.94927f,0.0674248f, --0.42059f,0.907249f,-0.00173726f, --0.259446f,0.962613f,-0.0778756f, --0.0851837f,0.992966f,-0.082236f, --0.215247f,0.960313f,-0.177393f, --0.0219544f,0.989556f,-0.14247f, -0.0391647f,0.99769f,-0.0555004f, -0.102045f,0.994433f,0.0262785f, -0.194292f,0.978837f,0.0642512f, --0.0292693f,0.988875f,0.145839f, --0.101853f,0.986247f,0.130166f, -0.212882f,0.964861f,0.15403f, -0.245798f,0.960888f,0.127587f, -0.195444f,0.974318f,0.111832f, --0.321858f,0.809731f,0.490656f, --0.324834f,0.8531f,0.408293f, --0.169338f,0.931652f,0.321478f, -0.0137661f,0.965459f,0.260189f, -0.0568655f,0.931751f,0.358619f, -0.0773718f,0.91837f,0.388084f, -0.261047f,0.911575f,0.317625f, -0.360487f,0.919759f,0.155217f, -0.377368f,0.917164f,0.128078f, -0.276887f,0.917903f,0.284232f, -0.0739314f,0.913495f,0.400076f, -0.00592871f,0.863726f,0.503926f, -0.12818f,0.830694f,0.541773f, -0.218813f,0.849726f,0.479673f, -0.242686f,0.877276f,0.414115f, -0.274843f,0.886896f,0.371318f, -0.349234f,0.864992f,0.360313f, -0.316807f,0.866747f,0.385206f, -0.243026f,0.8884f,0.389467f, -0.293176f,0.904042f,0.311057f, -0.24905f,0.947495f,0.200568f, -0.307601f,0.926121f,0.21836f, -0.250581f,0.964737f,0.0805682f, -0.134636f,0.99035f,-0.0328548f, -0.000251354f,0.985828f,-0.167762f, -0.0218107f,0.990992f,-0.132131f, -0.159951f,0.984761f,-0.068279f, -0.165852f,0.977778f,-0.128229f, -0.162621f,0.98447f,-0.06613f, -0.121502f,0.975682f,-0.182435f, -0.0565286f,0.935574f,-0.348576f, -0.0461029f,0.9227f,-0.382752f, -0.0939341f,0.947555f,-0.305477f, -0.144515f,0.970016f,-0.195409f, -0.0775217f,0.989125f,-0.124991f, --0.200827f,0.965332f,-0.16674f, --0.401609f,0.907839f,-0.120577f, --0.559375f,0.828885f,-0.00699655f, --0.565805f,0.821746f,0.0678162f, --0.593147f,0.804311f,0.0354918f, --0.576294f,0.817225f,0.00543077f, --0.525544f,0.848999f,-0.0548173f, --0.499547f,0.863338f,-0.0714126f, --0.553806f,0.830814f,0.0551944f, --0.639015f,0.755184f,0.146141f, --0.555848f,0.812796f,0.174341f, --0.558245f,0.826947f,0.0672363f, --0.433561f,0.898303f,0.0712505f, --0.328723f,0.942541f,0.0596481f, --0.348698f,0.936876f,0.0259581f, --0.301092f,0.95068f,0.0745005f, --0.263015f,0.962594f,0.0650869f, --0.284818f,0.957539f,0.0446894f, --0.359379f,0.932627f,-0.032449f, --0.231945f,0.967322f,-0.102417f, --0.134462f,0.989922f,-0.0444264f, --0.162306f,0.986023f,0.0376183f, -0.00794699f,0.998548f,-0.0532871f, --0.0239448f,0.993657f,-0.109874f, --0.0216422f,0.99782f,0.0623378f, -0.109723f,0.978713f,0.173443f, --0.0637399f,0.980084f,0.188075f, --0.0488189f,0.981371f,0.185814f, -0.215314f,0.95546f,0.201833f, -0.226954f,0.944659f,0.236876f, -0.18874f,0.93582f,0.297688f, --0.35388f,0.863488f,0.359384f, --0.279389f,0.900607f,0.332938f, --0.0980507f,0.952584f,0.288043f, --0.0324622f,0.946395f,0.321377f, --0.0380375f,0.913004f,0.406173f, -0.128955f,0.929408f,0.345792f, -0.375928f,0.898621f,0.226181f, -0.446257f,0.883274f,0.143813f, -0.289683f,0.938589f,0.187442f, -0.125289f,0.928145f,0.350499f, --0.0288389f,0.895239f,0.444652f, --0.103894f,0.871209f,0.479793f, -0.105997f,0.859294f,0.500378f, -0.239743f,0.842088f,0.483127f, -0.302444f,0.818919f,0.48775f, -0.351983f,0.830309f,0.432082f, -0.318807f,0.868172f,0.380315f, -0.306771f,0.857612f,0.412787f, -0.273726f,0.881543f,0.384651f, -0.337032f,0.866043f,0.369295f, -0.363605f,0.874829f,0.320103f, -0.334634f,0.927168f,0.168463f, -0.372292f,0.916204f,0.148217f, -0.206342f,0.978274f,0.0200943f, -0.119354f,0.989819f,-0.077546f, -0.042858f,0.974765f,-0.21908f, -0.15227f,0.956258f,-0.24977f, -0.17642f,0.955622f,-0.235928f, -0.119264f,0.963567f,-0.239406f, -0.210452f,0.949288f,-0.233584f, -0.171674f,0.93622f,-0.306626f, -0.0511268f,0.942128f,-0.331333f, -0.00960037f,0.978635f,-0.205381f, --0.00181509f,0.99884f,-0.048118f, --0.0483779f,0.993619f,0.101885f, --0.221067f,0.964285f,0.145887f, --0.435375f,0.898142f,0.0615596f, --0.544434f,0.838804f,-0.00062539f, --0.579913f,0.810216f,-0.0851529f, --0.5726f,0.815766f,-0.0815813f, --0.546649f,0.832873f,-0.0865884f, --0.465735f,0.88205f,-0.071268f, --0.55864f,0.824018f,-0.0944285f, --0.642115f,0.765228f,0.0459774f, --0.656804f,0.753752f,0.0216163f, --0.520592f,0.853762f,0.00863503f, --0.481258f,0.875004f,-0.0525228f, --0.443379f,0.889071f,-0.113874f, --0.339817f,0.937077f,-0.0800719f, --0.346478f,0.935462f,-0.0697409f, --0.350474f,0.934462f,-0.0628307f, --0.228751f,0.97348f,-0.00313391f, --0.230759f,0.970493f,-0.0699589f, --0.279469f,0.954379f,-0.105155f, --0.198889f,0.96686f,-0.16008f, --0.230529f,0.946681f,-0.225058f, --0.14204f,0.970201f,-0.196301f, -0.0687794f,0.962113f,-0.263834f, --0.0677159f,0.979986f,-0.187196f, --0.220027f,0.972288f,-0.0790245f, -0.07326f,0.993712f,0.0846721f, --0.0289367f,0.993146f,0.113239f, --0.106822f,0.986395f,0.124957f, -0.128381f,0.967004f,0.22005f, -0.141757f,0.945235f,0.293998f, -0.0274083f,0.95189f,0.30521f, --0.150915f,0.940582f,0.304189f, --0.174369f,0.970549f,0.166222f, --0.140821f,0.979995f,0.140639f, --0.141606f,0.959082f,0.245171f, -0.011894f,0.972798f,0.23135f, -0.262326f,0.961504f,0.0818187f, -0.456393f,0.889018f,0.036791f, -0.382632f,0.920315f,0.0813253f, -0.174752f,0.942069f,0.286301f, --0.045852f,0.917014f,0.396211f, --0.0633233f,0.882412f,0.466197f, --0.0422981f,0.919143f,0.391647f, -0.126089f,0.949054f,0.288786f, -0.256733f,0.912921f,0.317275f, -0.315104f,0.887032f,0.337468f, -0.409846f,0.864148f,0.292018f, -0.343944f,0.901166f,0.263823f, -0.312798f,0.897029f,0.312244f, -0.323227f,0.888441f,0.325879f, -0.342446f,0.89904f,0.272869f, -0.451059f,0.860524f,0.236736f, -0.423682f,0.891569f,0.159992f, -0.404089f,0.899665f,0.165275f, -0.34072f,0.934631f,0.101855f, -0.255675f,0.966712f,-0.00994645f, -0.192495f,0.972523f,-0.130939f, -0.146493f,0.95759f,-0.248115f, -0.177747f,0.950895f,-0.253387f, -0.10258f,0.958737f,-0.265144f, -0.233714f,0.956929f,-0.172236f, -0.223818f,0.95591f,-0.190111f, --0.0753718f,0.974181f,-0.212814f, --0.223858f,0.97386f,-0.0385406f, --0.201603f,0.967155f,0.154817f, --0.110966f,0.95618f,0.270934f, --0.121146f,0.966863f,0.224722f, --0.291476f,0.94891f,0.120877f, --0.477923f,0.877529f,-0.0391374f, --0.509066f,0.849204f,-0.140369f, --0.547573f,0.807834f,-0.218101f, --0.563212f,0.785973f,-0.255028f, --0.550783f,0.817799f,-0.166865f, --0.567941f,0.823056f,0.00472398f, --0.662541f,0.748994f,-0.00687841f, --0.61971f,0.78387f,-0.03883f, --0.523314f,0.847679f,-0.0870804f, --0.447797f,0.889814f,-0.0877948f, --0.443749f,0.888577f,-0.116264f, --0.376466f,0.920201f,-0.107257f, --0.337652f,0.938208f,-0.0758775f, --0.365552f,0.926461f,-0.0896778f, --0.259904f,0.962681f,-0.0754604f, --0.126151f,0.988548f,-0.0828222f, --0.30144f,0.926166f,-0.226606f, --0.124801f,0.973148f,-0.193411f, --0.0842547f,0.941418f,-0.326548f, --0.0799027f,0.902475f,-0.423267f, --0.00736616f,0.932864f,-0.360152f, --0.199402f,0.957181f,-0.209865f, --0.285967f,0.938676f,-0.192641f, --0.0884894f,0.987166f,-0.132941f, --0.0982017f,0.994337f,0.0406204f, --0.151395f,0.982648f,0.107153f, -0.0310104f,0.988838f,0.14573f, -0.106405f,0.964191f,0.242925f, -0.070474f,0.952157f,0.297374f, -0.0656706f,0.9919f,0.108725f, --0.0894851f,0.995828f,0.0178395f, --0.190523f,0.981135f,0.0327999f, --0.155304f,0.987556f,0.0247798f, -0.115224f,0.991572f,-0.0592235f, -0.36579f,0.920032f,-0.140496f, -0.356271f,0.926984f,-0.117348f, -0.248335f,0.959842f,0.130508f, -0.000801886f,0.966476f,0.256755f, --0.114974f,0.940419f,0.319989f, --0.0524682f,0.940494f,0.335734f, -0.129742f,0.951002f,0.280646f, -0.183656f,0.974747f,0.127042f, -0.210533f,0.964529f,0.159247f, -0.299776f,0.935816f,0.185429f, -0.476652f,0.857927f,0.191739f, -0.365421f,0.920615f,0.137608f, -0.247354f,0.961561f,0.119232f, -0.333488f,0.932256f,0.140299f, -0.428629f,0.898219f,0.0973634f, -0.470887f,0.881687f,0.0298847f, -0.443595f,0.892268f,0.0841461f, -0.38152f,0.920309f,0.0864469f, -0.381462f,0.916941f,0.117074f, -0.327497f,0.93955f,0.099957f, -0.304803f,0.952409f,-0.00357992f, -0.239937f,0.959204f,-0.149528f, -0.202117f,0.965308f,-0.165315f, -0.0495866f,0.988011f,-0.146203f, -0.0854477f,0.995976f,-0.027023f, -0.244078f,0.956317f,0.160886f, --0.0753613f,0.986424f,0.145905f, --0.339089f,0.932874f,0.12151f, --0.294837f,0.942606f,0.15673f, --0.104304f,0.973462f,0.203698f, --0.0723227f,0.985619f,0.152724f, --0.210009f,0.973927f,0.0858055f, --0.391811f,0.919671f,-0.0262484f, --0.442429f,0.895892f,-0.0404195f, --0.501975f,0.857758f,-0.11078f, --0.516547f,0.834688f,-0.190982f, --0.606461f,0.747704f,-0.270451f, --0.650373f,0.745527f,-0.145618f, --0.638901f,0.762805f,-0.0996673f, --0.598555f,0.785548f,-0.156994f, --0.501024f,0.846694f,-0.179123f, --0.446137f,0.875545f,-0.185426f, --0.431282f,0.886668f,-0.16678f, --0.409115f,0.903871f,-0.125073f, --0.364534f,0.929271f,-0.0597475f, --0.342967f,0.93838f,-0.0426101f, --0.26831f,0.95962f,-0.0844963f, --0.0393852f,0.992201f,-0.118264f, --0.116204f,0.958118f,-0.261737f, --0.10396f,0.911216f,-0.398596f, -0.0690263f,0.90803f,-0.41318f, --0.107766f,0.879323f,-0.463872f, --0.204112f,0.904181f,-0.375227f, --0.300499f,0.93243f,-0.200683f, --0.27347f,0.953749f,-0.124807f, --0.169754f,0.978593f,-0.116359f, --0.231778f,0.970053f,-0.072634f, --0.190395f,0.98166f,0.00964305f, --0.0305984f,0.996687f,0.0753532f, -0.015862f,0.984083f,0.177002f, --0.0353434f,0.980638f,0.192612f, --0.00358253f,0.996067f,-0.0885361f, --0.091201f,0.995656f,-0.0187243f, --0.182622f,0.982071f,0.0467509f, --0.0739202f,0.997106f,-0.017751f, -0.154438f,0.971547f,-0.179571f, -0.395535f,0.904532f,-0.159291f, -0.194508f,0.960754f,-0.197781f, -0.113269f,0.98581f,0.123894f, --0.030891f,0.963944f,0.264306f, --0.124571f,0.959262f,0.253572f, --0.0553429f,0.968125f,0.244277f, -0.192328f,0.950681f,0.243343f, -0.217769f,0.968216f,0.123025f, -0.205296f,0.966103f,0.156522f, -0.276023f,0.954237f,0.11508f, -0.467224f,0.868183f,0.167212f, -0.402263f,0.894308f,0.195955f, -0.299601f,0.940084f,0.162733f, -0.355906f,0.933872f,0.0348486f, -0.474044f,0.880198f,-0.0230946f, -0.444725f,0.891474f,-0.0865651f, -0.431452f,0.901988f,0.0163334f, -0.385491f,0.922676f,0.00810292f, -0.339313f,0.940655f,0.00595024f, -0.37483f,0.92173f,0.099581f, -0.41171f,0.911266f,-0.00949356f, -0.281208f,0.933096f,-0.224175f, -0.138066f,0.959634f,-0.245031f, -0.0299217f,0.992057f,-0.122182f, --0.0797424f,0.99128f,-0.104905f, -0.124146f,0.977522f,0.170405f, --0.0302976f,0.947743f,0.317594f, --0.301142f,0.928457f,0.21744f, --0.278579f,0.94845f,0.151119f, --0.150217f,0.982764f,0.107745f, -0.0163995f,0.982022f,0.188052f, --0.137431f,0.989816f,0.0370977f, --0.36652f,0.926186f,-0.0885568f, --0.445397f,0.895157f,-0.0177851f, --0.463397f,0.885777f,-0.0257252f, --0.466469f,0.878885f,-0.099842f, --0.557948f,0.804805f,-0.202443f, --0.681509f,0.679149f,-0.272587f, --0.629296f,0.753928f,-0.188625f, --0.5596f,0.798482f,-0.221976f, --0.503025f,0.800303f,-0.326313f, --0.422254f,0.855253f,-0.300408f, --0.454716f,0.829192f,-0.325075f, --0.46025f,0.856807f,-0.232488f, --0.37729f,0.921922f,-0.0878209f, --0.375084f,0.920087f,-0.112928f, --0.173161f,0.984659f,-0.0214944f, --0.0348229f,0.978528f,-0.20315f, -0.0523603f,0.977312f,-0.205229f, --0.0533357f,0.893335f,-0.446215f, -0.0246713f,0.873256f,-0.486637f, --0.0923807f,0.905308f,-0.414587f, --0.269958f,0.871402f,-0.409612f, --0.388686f,0.862358f,-0.324442f, --0.340148f,0.928537f,-0.148722f, --0.147166f,0.988619f,-0.0312327f, --0.248059f,0.963625f,-0.099463f, --0.232297f,0.969578f,-0.0771772f, --0.142695f,0.989498f,-0.02308f, --0.0198137f,0.98287f,0.18323f, --0.0333475f,0.978727f,0.202438f, -}; - -btScalar Landscape05Tex[] = { -0.0f,0.5f, -0.0f,0.492188f, -0.0078125f,0.5f, -0.0078125f,0.492188f, -0.015625f,0.5f, -0.015625f,0.492188f, -0.0234375f,0.5f, -0.0234375f,0.492188f, -0.03125f,0.5f, -0.03125f,0.492188f, -0.0390625f,0.5f, -0.0390625f,0.492188f, -0.046875f,0.5f, -0.046875f,0.492188f, -0.0546875f,0.5f, -0.0546875f,0.492188f, -0.0625f,0.5f, -0.0625f,0.492188f, -0.0703125f,0.5f, -0.0703125f,0.492188f, -0.078125f,0.5f, -0.078125f,0.492188f, -0.0859375f,0.5f, -0.0859375f,0.492188f, -0.09375f,0.5f, -0.09375f,0.492188f, -0.101563f,0.5f, -0.101563f,0.492188f, -0.109375f,0.5f, -0.109375f,0.492188f, -0.117188f,0.5f, -0.117188f,0.492188f, -0.125f,0.5f, -0.125f,0.492188f, -0.132813f,0.5f, -0.132813f,0.492188f, -0.140625f,0.5f, -0.140625f,0.492188f, -0.148438f,0.5f, -0.148438f,0.492188f, -0.15625f,0.5f, -0.15625f,0.492188f, -0.164063f,0.5f, -0.164063f,0.492188f, -0.171875f,0.5f, -0.171875f,0.492188f, -0.179688f,0.5f, -0.179688f,0.492188f, -0.1875f,0.5f, -0.1875f,0.492188f, -0.195313f,0.5f, -0.195313f,0.492188f, -0.203125f,0.5f, -0.203125f,0.492188f, -0.210938f,0.5f, -0.210938f,0.492188f, -0.21875f,0.5f, -0.21875f,0.492188f, -0.226563f,0.5f, -0.226563f,0.492188f, -0.234375f,0.5f, -0.234375f,0.492188f, -0.242188f,0.5f, -0.242188f,0.492188f, -0.25f,0.5f, -0.25f,0.492188f, -0.257813f,0.5f, -0.257813f,0.492188f, -0.265625f,0.5f, -0.265625f,0.492188f, -0.273438f,0.5f, -0.273438f,0.492188f, -0.28125f,0.5f, -0.28125f,0.492188f, -0.289063f,0.5f, -0.289063f,0.492188f, -0.296875f,0.5f, -0.296875f,0.492188f, -0.304688f,0.5f, -0.304688f,0.492188f, -0.3125f,0.5f, -0.3125f,0.492188f, -0.320313f,0.5f, -0.320313f,0.492188f, -0.328125f,0.5f, -0.328125f,0.492188f, -0.335938f,0.5f, -0.335938f,0.492188f, -0.34375f,0.5f, -0.34375f,0.492188f, -0.351563f,0.5f, -0.351563f,0.492188f, -0.359375f,0.5f, -0.359375f,0.492188f, -0.367188f,0.5f, -0.367188f,0.492188f, -0.375f,0.5f, -0.375f,0.492188f, -0.382813f,0.5f, -0.382813f,0.492188f, -0.390625f,0.5f, -0.390625f,0.492188f, -0.398438f,0.5f, -0.398438f,0.492188f, -0.40625f,0.5f, -0.40625f,0.492188f, -0.414063f,0.5f, -0.414063f,0.492188f, -0.421875f,0.5f, -0.421875f,0.492188f, -0.429688f,0.5f, -0.429688f,0.492188f, -0.4375f,0.5f, -0.4375f,0.492188f, -0.445313f,0.5f, -0.445313f,0.492188f, -0.453125f,0.5f, -0.453125f,0.492188f, -0.460938f,0.5f, -0.460938f,0.492188f, -0.46875f,0.5f, -0.46875f,0.492188f, -0.476563f,0.5f, -0.476563f,0.492188f, -0.484375f,0.5f, -0.484375f,0.492188f, -0.492188f,0.5f, -0.492188f,0.492188f, -0.5f,0.5f, -0.5f,0.492188f, -0.507813f,0.5f, -0.507813f,0.492188f, -0.0f,0.507813f, -0.0078125f,0.507813f, -0.015625f,0.507813f, -0.0234375f,0.507813f, -0.03125f,0.507813f, -0.0390625f,0.507813f, -0.046875f,0.507813f, -0.0546875f,0.507813f, -0.0625f,0.507813f, -0.0703125f,0.507813f, -0.078125f,0.507813f, -0.0859375f,0.507813f, -0.09375f,0.507813f, -0.101563f,0.507813f, -0.109375f,0.507813f, -0.117188f,0.507813f, -0.125f,0.507813f, -0.132813f,0.507813f, -0.140625f,0.507813f, -0.148438f,0.507813f, -0.15625f,0.507813f, -0.164063f,0.507813f, -0.171875f,0.507813f, -0.179688f,0.507813f, -0.1875f,0.507813f, -0.195313f,0.507813f, -0.203125f,0.507813f, -0.210938f,0.507813f, -0.21875f,0.507813f, -0.226563f,0.507813f, -0.234375f,0.507813f, -0.242188f,0.507813f, -0.25f,0.507813f, -0.257813f,0.507813f, -0.265625f,0.507813f, -0.273438f,0.507813f, -0.28125f,0.507813f, -0.289063f,0.507813f, -0.296875f,0.507813f, -0.304688f,0.507813f, -0.3125f,0.507813f, -0.320313f,0.507813f, -0.328125f,0.507813f, -0.335938f,0.507813f, -0.34375f,0.507813f, -0.351563f,0.507813f, -0.359375f,0.507813f, -0.367188f,0.507813f, -0.375f,0.507813f, -0.382813f,0.507813f, -0.390625f,0.507813f, -0.398438f,0.507813f, -0.40625f,0.507813f, -0.414063f,0.507813f, -0.421875f,0.507813f, -0.429688f,0.507813f, -0.4375f,0.507813f, -0.445313f,0.507813f, -0.453125f,0.507813f, -0.460938f,0.507813f, -0.46875f,0.507813f, -0.476563f,0.507813f, -0.484375f,0.507813f, -0.492188f,0.507813f, -0.5f,0.507813f, -0.507813f,0.507813f, -0.0f,0.515625f, -0.0078125f,0.515625f, -0.015625f,0.515625f, -0.0234375f,0.515625f, -0.03125f,0.515625f, -0.0390625f,0.515625f, -0.046875f,0.515625f, -0.0546875f,0.515625f, -0.0625f,0.515625f, -0.0703125f,0.515625f, -0.078125f,0.515625f, -0.0859375f,0.515625f, -0.09375f,0.515625f, -0.101563f,0.515625f, -0.109375f,0.515625f, -0.117188f,0.515625f, -0.125f,0.515625f, -0.132813f,0.515625f, -0.140625f,0.515625f, -0.148438f,0.515625f, -0.15625f,0.515625f, -0.164063f,0.515625f, -0.171875f,0.515625f, -0.179688f,0.515625f, -0.1875f,0.515625f, -0.195313f,0.515625f, -0.203125f,0.515625f, -0.210938f,0.515625f, -0.21875f,0.515625f, -0.226563f,0.515625f, -0.234375f,0.515625f, -0.242188f,0.515625f, -0.25f,0.515625f, -0.257813f,0.515625f, -0.265625f,0.515625f, -0.273438f,0.515625f, -0.28125f,0.515625f, -0.289063f,0.515625f, -0.296875f,0.515625f, -0.304688f,0.515625f, -0.3125f,0.515625f, -0.320313f,0.515625f, -0.328125f,0.515625f, -0.335938f,0.515625f, -0.34375f,0.515625f, -0.351563f,0.515625f, -0.359375f,0.515625f, -0.367188f,0.515625f, -0.375f,0.515625f, -0.382813f,0.515625f, -0.390625f,0.515625f, -0.398438f,0.515625f, -0.40625f,0.515625f, -0.414063f,0.515625f, -0.421875f,0.515625f, -0.429688f,0.515625f, -0.4375f,0.515625f, -0.445313f,0.515625f, -0.453125f,0.515625f, -0.460938f,0.515625f, -0.46875f,0.515625f, -0.476563f,0.515625f, -0.484375f,0.515625f, -0.492188f,0.515625f, -0.5f,0.515625f, -0.507813f,0.515625f, -0.0f,0.523438f, -0.0078125f,0.523438f, -0.015625f,0.523438f, -0.0234375f,0.523438f, -0.03125f,0.523438f, -0.0390625f,0.523438f, -0.046875f,0.523438f, -0.0546875f,0.523438f, -0.0625f,0.523438f, -0.0703125f,0.523438f, -0.078125f,0.523438f, -0.0859375f,0.523438f, -0.09375f,0.523438f, -0.101563f,0.523438f, -0.109375f,0.523438f, -0.117188f,0.523438f, -0.125f,0.523438f, -0.132813f,0.523438f, -0.140625f,0.523438f, -0.148438f,0.523438f, -0.15625f,0.523438f, -0.164063f,0.523438f, -0.171875f,0.523438f, -0.179688f,0.523438f, -0.1875f,0.523438f, -0.195313f,0.523438f, -0.203125f,0.523438f, -0.210938f,0.523438f, -0.21875f,0.523438f, -0.226563f,0.523438f, -0.234375f,0.523438f, -0.242188f,0.523438f, -0.25f,0.523438f, -0.257813f,0.523438f, -0.265625f,0.523438f, -0.273438f,0.523438f, -0.28125f,0.523438f, -0.289063f,0.523438f, -0.296875f,0.523438f, -0.304688f,0.523438f, -0.3125f,0.523438f, -0.320313f,0.523438f, -0.328125f,0.523438f, -0.335938f,0.523438f, -0.34375f,0.523438f, -0.351563f,0.523438f, -0.359375f,0.523438f, -0.367188f,0.523438f, -0.375f,0.523438f, -0.382813f,0.523438f, -0.390625f,0.523438f, -0.398438f,0.523438f, -0.40625f,0.523438f, -0.414063f,0.523438f, -0.421875f,0.523438f, -0.429688f,0.523438f, -0.4375f,0.523438f, -0.445313f,0.523438f, -0.453125f,0.523438f, -0.460938f,0.523438f, -0.46875f,0.523438f, -0.476563f,0.523438f, -0.484375f,0.523438f, -0.492188f,0.523438f, -0.5f,0.523438f, -0.507813f,0.523438f, -0.0f,0.53125f, -0.0078125f,0.53125f, -0.015625f,0.53125f, -0.0234375f,0.53125f, -0.03125f,0.53125f, -0.0390625f,0.53125f, -0.046875f,0.53125f, -0.0546875f,0.53125f, -0.0625f,0.53125f, -0.0703125f,0.53125f, -0.078125f,0.53125f, -0.0859375f,0.53125f, -0.09375f,0.53125f, -0.101563f,0.53125f, -0.109375f,0.53125f, -0.117188f,0.53125f, -0.125f,0.53125f, -0.132813f,0.53125f, -0.140625f,0.53125f, -0.148438f,0.53125f, -0.15625f,0.53125f, -0.164063f,0.53125f, -0.171875f,0.53125f, -0.179688f,0.53125f, -0.1875f,0.53125f, -0.195313f,0.53125f, -0.203125f,0.53125f, -0.210938f,0.53125f, -0.21875f,0.53125f, -0.226563f,0.53125f, -0.234375f,0.53125f, -0.242188f,0.53125f, -0.25f,0.53125f, -0.257813f,0.53125f, -0.265625f,0.53125f, -0.273438f,0.53125f, -0.28125f,0.53125f, -0.289063f,0.53125f, -0.296875f,0.53125f, -0.304688f,0.53125f, -0.3125f,0.53125f, -0.320313f,0.53125f, -0.328125f,0.53125f, -0.335938f,0.53125f, -0.34375f,0.53125f, -0.351563f,0.53125f, -0.359375f,0.53125f, -0.367188f,0.53125f, -0.375f,0.53125f, -0.382813f,0.53125f, -0.390625f,0.53125f, -0.398438f,0.53125f, -0.40625f,0.53125f, -0.414063f,0.53125f, -0.421875f,0.53125f, -0.429688f,0.53125f, -0.4375f,0.53125f, -0.445313f,0.53125f, -0.453125f,0.53125f, -0.460938f,0.53125f, -0.46875f,0.53125f, -0.476563f,0.53125f, -0.484375f,0.53125f, -0.492188f,0.53125f, -0.5f,0.53125f, -0.507813f,0.53125f, -0.0f,0.539063f, -0.0078125f,0.539063f, -0.015625f,0.539063f, -0.0234375f,0.539063f, -0.03125f,0.539063f, -0.0390625f,0.539063f, -0.046875f,0.539063f, -0.0546875f,0.539063f, -0.0625f,0.539063f, -0.0703125f,0.539063f, -0.078125f,0.539063f, -0.0859375f,0.539063f, -0.09375f,0.539063f, -0.101563f,0.539063f, -0.109375f,0.539063f, -0.117188f,0.539063f, -0.125f,0.539063f, -0.132813f,0.539063f, -0.140625f,0.539063f, -0.148438f,0.539063f, -0.15625f,0.539063f, -0.164063f,0.539063f, -0.171875f,0.539063f, -0.179688f,0.539063f, -0.1875f,0.539063f, -0.195313f,0.539063f, -0.203125f,0.539063f, -0.210938f,0.539063f, -0.21875f,0.539063f, -0.226563f,0.539063f, -0.234375f,0.539063f, -0.242188f,0.539063f, -0.25f,0.539063f, -0.257813f,0.539063f, -0.265625f,0.539063f, -0.273438f,0.539063f, -0.28125f,0.539063f, -0.289063f,0.539063f, -0.296875f,0.539063f, -0.304688f,0.539063f, -0.3125f,0.539063f, -0.320313f,0.539063f, -0.328125f,0.539063f, -0.335938f,0.539063f, -0.34375f,0.539063f, -0.351563f,0.539063f, -0.359375f,0.539063f, -0.367188f,0.539063f, -0.375f,0.539063f, -0.382813f,0.539063f, -0.390625f,0.539063f, -0.398438f,0.539063f, -0.40625f,0.539063f, -0.414063f,0.539063f, -0.421875f,0.539063f, -0.429688f,0.539063f, -0.4375f,0.539063f, -0.445313f,0.539063f, -0.453125f,0.539063f, -0.460938f,0.539063f, -0.46875f,0.539063f, -0.476563f,0.539063f, -0.484375f,0.539063f, -0.492188f,0.539063f, -0.5f,0.539063f, -0.507813f,0.539063f, -0.0f,0.546875f, -0.0078125f,0.546875f, -0.015625f,0.546875f, -0.0234375f,0.546875f, -0.03125f,0.546875f, -0.0390625f,0.546875f, -0.046875f,0.546875f, -0.0546875f,0.546875f, -0.0625f,0.546875f, -0.0703125f,0.546875f, -0.078125f,0.546875f, -0.0859375f,0.546875f, -0.09375f,0.546875f, -0.101563f,0.546875f, -0.109375f,0.546875f, -0.117188f,0.546875f, -0.125f,0.546875f, -0.132813f,0.546875f, -0.140625f,0.546875f, -0.148438f,0.546875f, -0.15625f,0.546875f, -0.164063f,0.546875f, -0.171875f,0.546875f, -0.179688f,0.546875f, -0.1875f,0.546875f, -0.195313f,0.546875f, -0.203125f,0.546875f, -0.210938f,0.546875f, -0.21875f,0.546875f, -0.226563f,0.546875f, -0.234375f,0.546875f, -0.242188f,0.546875f, -0.25f,0.546875f, -0.257813f,0.546875f, -0.265625f,0.546875f, -0.273438f,0.546875f, -0.28125f,0.546875f, -0.289063f,0.546875f, -0.296875f,0.546875f, -0.304688f,0.546875f, -0.3125f,0.546875f, -0.320313f,0.546875f, -0.328125f,0.546875f, -0.335938f,0.546875f, -0.34375f,0.546875f, -0.351563f,0.546875f, -0.359375f,0.546875f, -0.367188f,0.546875f, -0.375f,0.546875f, -0.382813f,0.546875f, -0.390625f,0.546875f, -0.398438f,0.546875f, -0.40625f,0.546875f, -0.414063f,0.546875f, -0.421875f,0.546875f, -0.429688f,0.546875f, -0.4375f,0.546875f, -0.445313f,0.546875f, -0.453125f,0.546875f, -0.460938f,0.546875f, -0.46875f,0.546875f, -0.476563f,0.546875f, -0.484375f,0.546875f, -0.492188f,0.546875f, -0.5f,0.546875f, -0.507813f,0.546875f, -0.0f,0.554688f, -0.0078125f,0.554688f, -0.015625f,0.554688f, -0.0234375f,0.554688f, -0.03125f,0.554688f, -0.0390625f,0.554688f, -0.046875f,0.554688f, -0.0546875f,0.554688f, -0.0625f,0.554688f, -0.0703125f,0.554688f, -0.078125f,0.554688f, -0.0859375f,0.554688f, -0.09375f,0.554688f, -0.101563f,0.554688f, -0.109375f,0.554688f, -0.117188f,0.554688f, -0.125f,0.554688f, -0.132813f,0.554688f, -0.140625f,0.554688f, -0.148438f,0.554688f, -0.15625f,0.554688f, -0.164063f,0.554688f, -0.171875f,0.554688f, -0.179688f,0.554688f, -0.1875f,0.554688f, -0.195313f,0.554688f, -0.203125f,0.554688f, -0.210938f,0.554688f, -0.21875f,0.554688f, -0.226563f,0.554688f, -0.234375f,0.554688f, -0.242188f,0.554688f, -0.25f,0.554688f, -0.257813f,0.554688f, -0.265625f,0.554688f, -0.273438f,0.554688f, -0.28125f,0.554688f, -0.289063f,0.554688f, -0.296875f,0.554688f, -0.304688f,0.554688f, -0.3125f,0.554688f, -0.320313f,0.554688f, -0.328125f,0.554688f, -0.335938f,0.554688f, -0.34375f,0.554688f, -0.351563f,0.554688f, -0.359375f,0.554688f, -0.367188f,0.554688f, -0.375f,0.554688f, -0.382813f,0.554688f, -0.390625f,0.554688f, -0.398438f,0.554688f, -0.40625f,0.554688f, -0.414063f,0.554688f, -0.421875f,0.554688f, -0.429688f,0.554688f, -0.4375f,0.554688f, -0.445313f,0.554688f, -0.453125f,0.554688f, -0.460938f,0.554688f, -0.46875f,0.554688f, -0.476563f,0.554688f, -0.484375f,0.554688f, -0.492188f,0.554688f, -0.5f,0.554688f, -0.507813f,0.554688f, -0.0f,0.5625f, -0.0078125f,0.5625f, -0.015625f,0.5625f, -0.0234375f,0.5625f, -0.03125f,0.5625f, -0.0390625f,0.5625f, -0.046875f,0.5625f, -0.0546875f,0.5625f, -0.0625f,0.5625f, -0.0703125f,0.5625f, -0.078125f,0.5625f, -0.0859375f,0.5625f, -0.09375f,0.5625f, -0.101563f,0.5625f, -0.109375f,0.5625f, -0.117188f,0.5625f, -0.125f,0.5625f, -0.132813f,0.5625f, -0.140625f,0.5625f, -0.148438f,0.5625f, -0.15625f,0.5625f, -0.164063f,0.5625f, -0.171875f,0.5625f, -0.179688f,0.5625f, -0.1875f,0.5625f, -0.195313f,0.5625f, -0.203125f,0.5625f, -0.210938f,0.5625f, -0.21875f,0.5625f, -0.226563f,0.5625f, -0.234375f,0.5625f, -0.242188f,0.5625f, -0.25f,0.5625f, -0.257813f,0.5625f, -0.265625f,0.5625f, -0.273438f,0.5625f, -0.28125f,0.5625f, -0.289063f,0.5625f, -0.296875f,0.5625f, -0.304688f,0.5625f, -0.3125f,0.5625f, -0.320313f,0.5625f, -0.328125f,0.5625f, -0.335938f,0.5625f, -0.34375f,0.5625f, -0.351563f,0.5625f, -0.359375f,0.5625f, -0.367188f,0.5625f, -0.375f,0.5625f, -0.382813f,0.5625f, -0.390625f,0.5625f, -0.398438f,0.5625f, -0.40625f,0.5625f, -0.414063f,0.5625f, -0.421875f,0.5625f, -0.429688f,0.5625f, -0.4375f,0.5625f, -0.445313f,0.5625f, -0.453125f,0.5625f, -0.460938f,0.5625f, -0.46875f,0.5625f, -0.476563f,0.5625f, -0.484375f,0.5625f, -0.492188f,0.5625f, -0.5f,0.5625f, -0.507813f,0.5625f, -0.0f,0.570313f, -0.0078125f,0.570313f, -0.015625f,0.570313f, -0.0234375f,0.570313f, -0.03125f,0.570313f, -0.0390625f,0.570313f, -0.046875f,0.570313f, -0.0546875f,0.570313f, -0.0625f,0.570313f, -0.0703125f,0.570313f, -0.078125f,0.570313f, -0.0859375f,0.570313f, -0.09375f,0.570313f, -0.101563f,0.570313f, -0.109375f,0.570313f, -0.117188f,0.570313f, -0.125f,0.570313f, -0.132813f,0.570313f, -0.140625f,0.570313f, -0.148438f,0.570313f, -0.15625f,0.570313f, -0.164063f,0.570313f, -0.171875f,0.570313f, -0.179688f,0.570313f, -0.1875f,0.570313f, -0.195313f,0.570313f, -0.203125f,0.570313f, -0.210938f,0.570313f, -0.21875f,0.570313f, -0.226563f,0.570313f, -0.234375f,0.570313f, -0.242188f,0.570313f, -0.25f,0.570313f, -0.257813f,0.570313f, -0.265625f,0.570313f, -0.273438f,0.570313f, -0.28125f,0.570313f, -0.289063f,0.570313f, -0.296875f,0.570313f, -0.304688f,0.570313f, -0.3125f,0.570313f, -0.320313f,0.570313f, -0.328125f,0.570313f, -0.335938f,0.570313f, -0.34375f,0.570313f, -0.351563f,0.570313f, -0.359375f,0.570313f, -0.367188f,0.570313f, -0.375f,0.570313f, -0.382813f,0.570313f, -0.390625f,0.570313f, -0.398438f,0.570313f, -0.40625f,0.570313f, -0.414063f,0.570313f, -0.421875f,0.570313f, -0.429688f,0.570313f, -0.4375f,0.570313f, -0.445313f,0.570313f, -0.453125f,0.570313f, -0.460938f,0.570313f, -0.46875f,0.570313f, -0.476563f,0.570313f, -0.484375f,0.570313f, -0.492188f,0.570313f, -0.5f,0.570313f, -0.507813f,0.570313f, -0.0f,0.578125f, -0.0078125f,0.578125f, -0.015625f,0.578125f, -0.0234375f,0.578125f, -0.03125f,0.578125f, -0.0390625f,0.578125f, -0.046875f,0.578125f, -0.0546875f,0.578125f, -0.0625f,0.578125f, -0.0703125f,0.578125f, -0.078125f,0.578125f, -0.0859375f,0.578125f, -0.09375f,0.578125f, -0.101563f,0.578125f, -0.109375f,0.578125f, -0.117188f,0.578125f, -0.125f,0.578125f, -0.132813f,0.578125f, -0.140625f,0.578125f, -0.148438f,0.578125f, -0.15625f,0.578125f, -0.164063f,0.578125f, -0.171875f,0.578125f, -0.179688f,0.578125f, -0.1875f,0.578125f, -0.195313f,0.578125f, -0.203125f,0.578125f, -0.210938f,0.578125f, -0.21875f,0.578125f, -0.226563f,0.578125f, -0.234375f,0.578125f, -0.242188f,0.578125f, -0.25f,0.578125f, -0.257813f,0.578125f, -0.265625f,0.578125f, -0.273438f,0.578125f, -0.28125f,0.578125f, -0.289063f,0.578125f, -0.296875f,0.578125f, -0.304688f,0.578125f, -0.3125f,0.578125f, -0.320313f,0.578125f, -0.328125f,0.578125f, -0.335938f,0.578125f, -0.34375f,0.578125f, -0.351563f,0.578125f, -0.359375f,0.578125f, -0.367188f,0.578125f, -0.375f,0.578125f, -0.382813f,0.578125f, -0.390625f,0.578125f, -0.398438f,0.578125f, -0.40625f,0.578125f, -0.414063f,0.578125f, -0.421875f,0.578125f, -0.429688f,0.578125f, -0.4375f,0.578125f, -0.445313f,0.578125f, -0.453125f,0.578125f, -0.460938f,0.578125f, -0.46875f,0.578125f, -0.476563f,0.578125f, -0.484375f,0.578125f, -0.492188f,0.578125f, -0.5f,0.578125f, -0.507813f,0.578125f, -0.0f,0.585938f, -0.0078125f,0.585938f, -0.015625f,0.585938f, -0.0234375f,0.585938f, -0.03125f,0.585938f, -0.0390625f,0.585938f, -0.046875f,0.585938f, -0.0546875f,0.585938f, -0.0625f,0.585938f, -0.0703125f,0.585938f, -0.078125f,0.585938f, -0.0859375f,0.585938f, -0.09375f,0.585938f, -0.101563f,0.585938f, -0.109375f,0.585938f, -0.117188f,0.585938f, -0.125f,0.585938f, -0.132813f,0.585938f, -0.140625f,0.585938f, -0.148438f,0.585938f, -0.15625f,0.585938f, -0.164063f,0.585938f, -0.171875f,0.585938f, -0.179688f,0.585938f, -0.1875f,0.585938f, -0.195313f,0.585938f, -0.203125f,0.585938f, -0.210938f,0.585938f, -0.21875f,0.585938f, -0.226563f,0.585938f, -0.234375f,0.585938f, -0.242188f,0.585938f, -0.25f,0.585938f, -0.257813f,0.585938f, -0.265625f,0.585938f, -0.273438f,0.585938f, -0.28125f,0.585938f, -0.289063f,0.585938f, -0.296875f,0.585938f, -0.304688f,0.585938f, -0.3125f,0.585938f, -0.320313f,0.585938f, -0.328125f,0.585938f, -0.335938f,0.585938f, -0.34375f,0.585938f, -0.351563f,0.585938f, -0.359375f,0.585938f, -0.367188f,0.585938f, -0.375f,0.585938f, -0.382813f,0.585938f, -0.390625f,0.585938f, -0.398438f,0.585938f, -0.40625f,0.585938f, -0.414063f,0.585938f, -0.421875f,0.585938f, -0.429688f,0.585938f, -0.4375f,0.585938f, -0.445313f,0.585938f, -0.453125f,0.585938f, -0.460938f,0.585938f, -0.46875f,0.585938f, -0.476563f,0.585938f, -0.484375f,0.585938f, -0.492188f,0.585938f, -0.5f,0.585938f, -0.507813f,0.585938f, -0.0f,0.59375f, -0.0078125f,0.59375f, -0.015625f,0.59375f, -0.0234375f,0.59375f, -0.03125f,0.59375f, -0.0390625f,0.59375f, -0.046875f,0.59375f, -0.0546875f,0.59375f, -0.0625f,0.59375f, -0.0703125f,0.59375f, -0.078125f,0.59375f, -0.0859375f,0.59375f, -0.09375f,0.59375f, -0.101563f,0.59375f, -0.109375f,0.59375f, -0.117188f,0.59375f, -0.125f,0.59375f, -0.132813f,0.59375f, -0.140625f,0.59375f, -0.148438f,0.59375f, -0.15625f,0.59375f, -0.164063f,0.59375f, -0.171875f,0.59375f, -0.179688f,0.59375f, -0.1875f,0.59375f, -0.195313f,0.59375f, -0.203125f,0.59375f, -0.210938f,0.59375f, -0.21875f,0.59375f, -0.226563f,0.59375f, -0.234375f,0.59375f, -0.242188f,0.59375f, -0.25f,0.59375f, -0.257813f,0.59375f, -0.265625f,0.59375f, -0.273438f,0.59375f, -0.28125f,0.59375f, -0.289063f,0.59375f, -0.296875f,0.59375f, -0.304688f,0.59375f, -0.3125f,0.59375f, -0.320313f,0.59375f, -0.328125f,0.59375f, -0.335938f,0.59375f, -0.34375f,0.59375f, -0.351563f,0.59375f, -0.359375f,0.59375f, -0.367188f,0.59375f, -0.375f,0.59375f, -0.382813f,0.59375f, -0.390625f,0.59375f, -0.398438f,0.59375f, -0.40625f,0.59375f, -0.414063f,0.59375f, -0.421875f,0.59375f, -0.429688f,0.59375f, -0.4375f,0.59375f, -0.445313f,0.59375f, -0.453125f,0.59375f, -0.460938f,0.59375f, -0.46875f,0.59375f, -0.476563f,0.59375f, -0.484375f,0.59375f, -0.492188f,0.59375f, -0.5f,0.59375f, -0.507813f,0.59375f, -0.0f,0.601563f, -0.0078125f,0.601563f, -0.015625f,0.601563f, -0.0234375f,0.601563f, -0.03125f,0.601563f, -0.0390625f,0.601563f, -0.046875f,0.601563f, -0.0546875f,0.601563f, -0.0625f,0.601563f, -0.0703125f,0.601563f, -0.078125f,0.601563f, -0.0859375f,0.601563f, -0.09375f,0.601563f, -0.101563f,0.601563f, -0.109375f,0.601563f, -0.117188f,0.601563f, -0.125f,0.601563f, -0.132813f,0.601563f, -0.140625f,0.601563f, -0.148438f,0.601563f, -0.15625f,0.601563f, -0.164063f,0.601563f, -0.171875f,0.601563f, -0.179688f,0.601563f, -0.1875f,0.601563f, -0.195313f,0.601563f, -0.203125f,0.601563f, -0.210938f,0.601563f, -0.21875f,0.601563f, -0.226563f,0.601563f, -0.234375f,0.601563f, -0.242188f,0.601563f, -0.25f,0.601563f, -0.257813f,0.601563f, -0.265625f,0.601563f, -0.273438f,0.601563f, -0.28125f,0.601563f, -0.289063f,0.601563f, -0.296875f,0.601563f, -0.304688f,0.601563f, -0.3125f,0.601563f, -0.320313f,0.601563f, -0.328125f,0.601563f, -0.335938f,0.601563f, -0.34375f,0.601563f, -0.351563f,0.601563f, -0.359375f,0.601563f, -0.367188f,0.601563f, -0.375f,0.601563f, -0.382813f,0.601563f, -0.390625f,0.601563f, -0.398438f,0.601563f, -0.40625f,0.601563f, -0.414063f,0.601563f, -0.421875f,0.601563f, -0.429688f,0.601563f, -0.4375f,0.601563f, -0.445313f,0.601563f, -0.453125f,0.601563f, -0.460938f,0.601563f, -0.46875f,0.601563f, -0.476563f,0.601563f, -0.484375f,0.601563f, -0.492188f,0.601563f, -0.5f,0.601563f, -0.507813f,0.601563f, -0.0f,0.609375f, -0.0078125f,0.609375f, -0.015625f,0.609375f, -0.0234375f,0.609375f, -0.03125f,0.609375f, -0.0390625f,0.609375f, -0.046875f,0.609375f, -0.0546875f,0.609375f, -0.0625f,0.609375f, -0.0703125f,0.609375f, -0.078125f,0.609375f, -0.0859375f,0.609375f, -0.09375f,0.609375f, -0.101563f,0.609375f, -0.109375f,0.609375f, -0.117188f,0.609375f, -0.125f,0.609375f, -0.132813f,0.609375f, -0.140625f,0.609375f, -0.148438f,0.609375f, -0.15625f,0.609375f, -0.164063f,0.609375f, -0.171875f,0.609375f, -0.179688f,0.609375f, -0.1875f,0.609375f, -0.195313f,0.609375f, -0.203125f,0.609375f, -0.210938f,0.609375f, -0.21875f,0.609375f, -0.226563f,0.609375f, -0.234375f,0.609375f, -0.242188f,0.609375f, -0.25f,0.609375f, -0.257813f,0.609375f, -0.265625f,0.609375f, -0.273438f,0.609375f, -0.28125f,0.609375f, -0.289063f,0.609375f, -0.296875f,0.609375f, -0.304688f,0.609375f, -0.3125f,0.609375f, -0.320313f,0.609375f, -0.328125f,0.609375f, -0.335938f,0.609375f, -0.34375f,0.609375f, -0.351563f,0.609375f, -0.359375f,0.609375f, -0.367188f,0.609375f, -0.375f,0.609375f, -0.382813f,0.609375f, -0.390625f,0.609375f, -0.398438f,0.609375f, -0.40625f,0.609375f, -0.414063f,0.609375f, -0.421875f,0.609375f, -0.429688f,0.609375f, -0.4375f,0.609375f, -0.445313f,0.609375f, -0.453125f,0.609375f, -0.460938f,0.609375f, -0.46875f,0.609375f, -0.476563f,0.609375f, -0.484375f,0.609375f, -0.492188f,0.609375f, -0.5f,0.609375f, -0.507813f,0.609375f, -0.0f,0.617188f, -0.0078125f,0.617188f, -0.015625f,0.617188f, -0.0234375f,0.617188f, -0.03125f,0.617188f, -0.0390625f,0.617188f, -0.046875f,0.617188f, -0.0546875f,0.617188f, -0.0625f,0.617188f, -0.0703125f,0.617188f, -0.078125f,0.617188f, -0.0859375f,0.617188f, -0.09375f,0.617188f, -0.101563f,0.617188f, -0.109375f,0.617188f, -0.117188f,0.617188f, -0.125f,0.617188f, -0.132813f,0.617188f, -0.140625f,0.617188f, -0.148438f,0.617188f, -0.15625f,0.617188f, -0.164063f,0.617188f, -0.171875f,0.617188f, -0.179688f,0.617188f, -0.1875f,0.617188f, -0.195313f,0.617188f, -0.203125f,0.617188f, -0.210938f,0.617188f, -0.21875f,0.617188f, -0.226563f,0.617188f, -0.234375f,0.617188f, -0.242188f,0.617188f, -0.25f,0.617188f, -0.257813f,0.617188f, -0.265625f,0.617188f, -0.273438f,0.617188f, -0.28125f,0.617188f, -0.289063f,0.617188f, -0.296875f,0.617188f, -0.304688f,0.617188f, -0.3125f,0.617188f, -0.320313f,0.617188f, -0.328125f,0.617188f, -0.335938f,0.617188f, -0.34375f,0.617188f, -0.351563f,0.617188f, -0.359375f,0.617188f, -0.367188f,0.617188f, -0.375f,0.617188f, -0.382813f,0.617188f, -0.390625f,0.617188f, -0.398438f,0.617188f, -0.40625f,0.617188f, -0.414063f,0.617188f, -0.421875f,0.617188f, -0.429688f,0.617188f, -0.4375f,0.617188f, -0.445313f,0.617188f, -0.453125f,0.617188f, -0.460938f,0.617188f, -0.46875f,0.617188f, -0.476563f,0.617188f, -0.484375f,0.617188f, -0.492188f,0.617188f, -0.5f,0.617188f, -0.507813f,0.617188f, -0.0f,0.625f, -0.0078125f,0.625f, -0.015625f,0.625f, -0.0234375f,0.625f, -0.03125f,0.625f, -0.0390625f,0.625f, -0.046875f,0.625f, -0.0546875f,0.625f, -0.0625f,0.625f, -0.0703125f,0.625f, -0.078125f,0.625f, -0.0859375f,0.625f, -0.09375f,0.625f, -0.101563f,0.625f, -0.109375f,0.625f, -0.117188f,0.625f, -0.125f,0.625f, -0.132813f,0.625f, -0.140625f,0.625f, -0.148438f,0.625f, -0.15625f,0.625f, -0.164063f,0.625f, -0.171875f,0.625f, -0.179688f,0.625f, -0.1875f,0.625f, -0.195313f,0.625f, -0.203125f,0.625f, -0.210938f,0.625f, -0.21875f,0.625f, -0.226563f,0.625f, -0.234375f,0.625f, -0.242188f,0.625f, -0.25f,0.625f, -0.257813f,0.625f, -0.265625f,0.625f, -0.273438f,0.625f, -0.28125f,0.625f, -0.289063f,0.625f, -0.296875f,0.625f, -0.304688f,0.625f, -0.3125f,0.625f, -0.320313f,0.625f, -0.328125f,0.625f, -0.335938f,0.625f, -0.34375f,0.625f, -0.351563f,0.625f, -0.359375f,0.625f, -0.367188f,0.625f, -0.375f,0.625f, -0.382813f,0.625f, -0.390625f,0.625f, -0.398438f,0.625f, -0.40625f,0.625f, -0.414063f,0.625f, -0.421875f,0.625f, -0.429688f,0.625f, -0.4375f,0.625f, -0.445313f,0.625f, -0.453125f,0.625f, -0.460938f,0.625f, -0.46875f,0.625f, -0.476563f,0.625f, -0.484375f,0.625f, -0.492188f,0.625f, -0.5f,0.625f, -0.507813f,0.625f, -0.0f,0.632813f, -0.0078125f,0.632813f, -0.015625f,0.632813f, -0.0234375f,0.632813f, -0.03125f,0.632813f, -0.0390625f,0.632813f, -0.046875f,0.632813f, -0.0546875f,0.632813f, -0.0625f,0.632813f, -0.0703125f,0.632813f, -0.078125f,0.632813f, -0.0859375f,0.632813f, -0.09375f,0.632813f, -0.101563f,0.632813f, -0.109375f,0.632813f, -0.117188f,0.632813f, -0.125f,0.632813f, -0.132813f,0.632813f, -0.140625f,0.632813f, -0.148438f,0.632813f, -0.15625f,0.632813f, -0.164063f,0.632813f, -0.171875f,0.632813f, -0.179688f,0.632813f, -0.1875f,0.632813f, -0.195313f,0.632813f, -0.203125f,0.632813f, -0.210938f,0.632813f, -0.21875f,0.632813f, -0.226563f,0.632813f, -0.234375f,0.632813f, -0.242188f,0.632813f, -0.25f,0.632813f, -0.257813f,0.632813f, -0.265625f,0.632813f, -0.273438f,0.632813f, -0.28125f,0.632813f, -0.289063f,0.632813f, -0.296875f,0.632813f, -0.304688f,0.632813f, -0.3125f,0.632813f, -0.320313f,0.632813f, -0.328125f,0.632813f, -0.335938f,0.632813f, -0.34375f,0.632813f, -0.351563f,0.632813f, -0.359375f,0.632813f, -0.367188f,0.632813f, -0.375f,0.632813f, -0.382813f,0.632813f, -0.390625f,0.632813f, -0.398438f,0.632813f, -0.40625f,0.632813f, -0.414063f,0.632813f, -0.421875f,0.632813f, -0.429688f,0.632813f, -0.4375f,0.632813f, -0.445313f,0.632813f, -0.453125f,0.632813f, -0.460938f,0.632813f, -0.46875f,0.632813f, -0.476563f,0.632813f, -0.484375f,0.632813f, -0.492188f,0.632813f, -0.5f,0.632813f, -0.507813f,0.632813f, -0.0f,0.640625f, -0.0078125f,0.640625f, -0.015625f,0.640625f, -0.0234375f,0.640625f, -0.03125f,0.640625f, -0.0390625f,0.640625f, -0.046875f,0.640625f, -0.0546875f,0.640625f, -0.0625f,0.640625f, -0.0703125f,0.640625f, -0.078125f,0.640625f, -0.0859375f,0.640625f, -0.09375f,0.640625f, -0.101563f,0.640625f, -0.109375f,0.640625f, -0.117188f,0.640625f, -0.125f,0.640625f, -0.132813f,0.640625f, -0.140625f,0.640625f, -0.148438f,0.640625f, -0.15625f,0.640625f, -0.164063f,0.640625f, -0.171875f,0.640625f, -0.179688f,0.640625f, -0.1875f,0.640625f, -0.195313f,0.640625f, -0.203125f,0.640625f, -0.210938f,0.640625f, -0.21875f,0.640625f, -0.226563f,0.640625f, -0.234375f,0.640625f, -0.242188f,0.640625f, -0.25f,0.640625f, -0.257813f,0.640625f, -0.265625f,0.640625f, -0.273438f,0.640625f, -0.28125f,0.640625f, -0.289063f,0.640625f, -0.296875f,0.640625f, -0.304688f,0.640625f, -0.3125f,0.640625f, -0.320313f,0.640625f, -0.328125f,0.640625f, -0.335938f,0.640625f, -0.34375f,0.640625f, -0.351563f,0.640625f, -0.359375f,0.640625f, -0.367188f,0.640625f, -0.375f,0.640625f, -0.382813f,0.640625f, -0.390625f,0.640625f, -0.398438f,0.640625f, -0.40625f,0.640625f, -0.414063f,0.640625f, -0.421875f,0.640625f, -0.429688f,0.640625f, -0.4375f,0.640625f, -0.445313f,0.640625f, -0.453125f,0.640625f, -0.460938f,0.640625f, -0.46875f,0.640625f, -0.476563f,0.640625f, -0.484375f,0.640625f, -0.492188f,0.640625f, -0.5f,0.640625f, -0.507813f,0.640625f, -0.0f,0.648438f, -0.0078125f,0.648438f, -0.015625f,0.648438f, -0.0234375f,0.648438f, -0.03125f,0.648438f, -0.0390625f,0.648438f, -0.046875f,0.648438f, -0.0546875f,0.648438f, -0.0625f,0.648438f, -0.0703125f,0.648438f, -0.078125f,0.648438f, -0.0859375f,0.648438f, -0.09375f,0.648438f, -0.101563f,0.648438f, -0.109375f,0.648438f, -0.117188f,0.648438f, -0.125f,0.648438f, -0.132813f,0.648438f, -0.140625f,0.648438f, -0.148438f,0.648438f, -0.15625f,0.648438f, -0.164063f,0.648438f, -0.171875f,0.648438f, -0.179688f,0.648438f, -0.1875f,0.648438f, -0.195313f,0.648438f, -0.203125f,0.648438f, -0.210938f,0.648438f, -0.21875f,0.648438f, -0.226563f,0.648438f, -0.234375f,0.648438f, -0.242188f,0.648438f, -0.25f,0.648438f, -0.257813f,0.648438f, -0.265625f,0.648438f, -0.273438f,0.648438f, -0.28125f,0.648438f, -0.289063f,0.648438f, -0.296875f,0.648438f, -0.304688f,0.648438f, -0.3125f,0.648438f, -0.320313f,0.648438f, -0.328125f,0.648438f, -0.335938f,0.648438f, -0.34375f,0.648438f, -0.351563f,0.648438f, -0.359375f,0.648438f, -0.367188f,0.648438f, -0.375f,0.648438f, -0.382813f,0.648438f, -0.390625f,0.648438f, -0.398438f,0.648438f, -0.40625f,0.648438f, -0.414063f,0.648438f, -0.421875f,0.648438f, -0.429688f,0.648438f, -0.4375f,0.648438f, -0.445313f,0.648438f, -0.453125f,0.648438f, -0.460938f,0.648438f, -0.46875f,0.648438f, -0.476563f,0.648438f, -0.484375f,0.648438f, -0.492188f,0.648438f, -0.5f,0.648438f, -0.507813f,0.648438f, -0.0f,0.65625f, -0.0078125f,0.65625f, -0.015625f,0.65625f, -0.0234375f,0.65625f, -0.03125f,0.65625f, -0.0390625f,0.65625f, -0.046875f,0.65625f, -0.0546875f,0.65625f, -0.0625f,0.65625f, -0.0703125f,0.65625f, -0.078125f,0.65625f, -0.0859375f,0.65625f, -0.09375f,0.65625f, -0.101563f,0.65625f, -0.109375f,0.65625f, -0.117188f,0.65625f, -0.125f,0.65625f, -0.132813f,0.65625f, -0.140625f,0.65625f, -0.148438f,0.65625f, -0.15625f,0.65625f, -0.164063f,0.65625f, -0.171875f,0.65625f, -0.179688f,0.65625f, -0.1875f,0.65625f, -0.195313f,0.65625f, -0.203125f,0.65625f, -0.210938f,0.65625f, -0.21875f,0.65625f, -0.226563f,0.65625f, -0.234375f,0.65625f, -0.242188f,0.65625f, -0.25f,0.65625f, -0.257813f,0.65625f, -0.265625f,0.65625f, -0.273438f,0.65625f, -0.28125f,0.65625f, -0.289063f,0.65625f, -0.296875f,0.65625f, -0.304688f,0.65625f, -0.3125f,0.65625f, -0.320313f,0.65625f, -0.328125f,0.65625f, -0.335938f,0.65625f, -0.34375f,0.65625f, -0.351563f,0.65625f, -0.359375f,0.65625f, -0.367188f,0.65625f, -0.375f,0.65625f, -0.382813f,0.65625f, -0.390625f,0.65625f, -0.398438f,0.65625f, -0.40625f,0.65625f, -0.414063f,0.65625f, -0.421875f,0.65625f, -0.429688f,0.65625f, -0.4375f,0.65625f, -0.445313f,0.65625f, -0.453125f,0.65625f, -0.460938f,0.65625f, -0.46875f,0.65625f, -0.476563f,0.65625f, -0.484375f,0.65625f, -0.492188f,0.65625f, -0.5f,0.65625f, -0.507813f,0.65625f, -0.0f,0.664063f, -0.0078125f,0.664063f, -0.015625f,0.664063f, -0.0234375f,0.664063f, -0.03125f,0.664063f, -0.0390625f,0.664063f, -0.046875f,0.664063f, -0.0546875f,0.664063f, -0.0625f,0.664063f, -0.0703125f,0.664063f, -0.078125f,0.664063f, -0.0859375f,0.664063f, -0.09375f,0.664063f, -0.101563f,0.664063f, -0.109375f,0.664063f, -0.117188f,0.664063f, -0.125f,0.664063f, -0.132813f,0.664063f, -0.140625f,0.664063f, -0.148438f,0.664063f, -0.15625f,0.664063f, -0.164063f,0.664063f, -0.171875f,0.664063f, -0.179688f,0.664063f, -0.1875f,0.664063f, -0.195313f,0.664063f, -0.203125f,0.664063f, -0.210938f,0.664063f, -0.21875f,0.664063f, -0.226563f,0.664063f, -0.234375f,0.664063f, -0.242188f,0.664063f, -0.25f,0.664063f, -0.257813f,0.664063f, -0.265625f,0.664063f, -0.273438f,0.664063f, -0.28125f,0.664063f, -0.289063f,0.664063f, -0.296875f,0.664063f, -0.304688f,0.664063f, -0.3125f,0.664063f, -0.320313f,0.664063f, -0.328125f,0.664063f, -0.335938f,0.664063f, -0.34375f,0.664063f, -0.351563f,0.664063f, -0.359375f,0.664063f, -0.367188f,0.664063f, -0.375f,0.664063f, -0.382813f,0.664063f, -0.390625f,0.664063f, -0.398438f,0.664063f, -0.40625f,0.664063f, -0.414063f,0.664063f, -0.421875f,0.664063f, -0.429688f,0.664063f, -0.4375f,0.664063f, -0.445313f,0.664063f, -0.453125f,0.664063f, -0.460938f,0.664063f, -0.46875f,0.664063f, -0.476563f,0.664063f, -0.484375f,0.664063f, -0.492188f,0.664063f, -0.5f,0.664063f, -0.507813f,0.664063f, -0.0f,0.671875f, -0.0078125f,0.671875f, -0.015625f,0.671875f, -0.0234375f,0.671875f, -0.03125f,0.671875f, -0.0390625f,0.671875f, -0.046875f,0.671875f, -0.0546875f,0.671875f, -0.0625f,0.671875f, -0.0703125f,0.671875f, -0.078125f,0.671875f, -0.0859375f,0.671875f, -0.09375f,0.671875f, -0.101563f,0.671875f, -0.109375f,0.671875f, -0.117188f,0.671875f, -0.125f,0.671875f, -0.132813f,0.671875f, -0.140625f,0.671875f, -0.148438f,0.671875f, -0.15625f,0.671875f, -0.164063f,0.671875f, -0.171875f,0.671875f, -0.179688f,0.671875f, -0.1875f,0.671875f, -0.195313f,0.671875f, -0.203125f,0.671875f, -0.210938f,0.671875f, -0.21875f,0.671875f, -0.226563f,0.671875f, -0.234375f,0.671875f, -0.242188f,0.671875f, -0.25f,0.671875f, -0.257813f,0.671875f, -0.265625f,0.671875f, -0.273438f,0.671875f, -0.28125f,0.671875f, -0.289063f,0.671875f, -0.296875f,0.671875f, -0.304688f,0.671875f, -0.3125f,0.671875f, -0.320313f,0.671875f, -0.328125f,0.671875f, -0.335938f,0.671875f, -0.34375f,0.671875f, -0.351563f,0.671875f, -0.359375f,0.671875f, -0.367188f,0.671875f, -0.375f,0.671875f, -0.382813f,0.671875f, -0.390625f,0.671875f, -0.398438f,0.671875f, -0.40625f,0.671875f, -0.414063f,0.671875f, -0.421875f,0.671875f, -0.429688f,0.671875f, -0.4375f,0.671875f, -0.445313f,0.671875f, -0.453125f,0.671875f, -0.460938f,0.671875f, -0.46875f,0.671875f, -0.476563f,0.671875f, -0.484375f,0.671875f, -0.492188f,0.671875f, -0.5f,0.671875f, -0.507813f,0.671875f, -0.0f,0.679688f, -0.0078125f,0.679688f, -0.015625f,0.679688f, -0.0234375f,0.679688f, -0.03125f,0.679688f, -0.0390625f,0.679688f, -0.046875f,0.679688f, -0.0546875f,0.679688f, -0.0625f,0.679688f, -0.0703125f,0.679688f, -0.078125f,0.679688f, -0.0859375f,0.679688f, -0.09375f,0.679688f, -0.101563f,0.679688f, -0.109375f,0.679688f, -0.117188f,0.679688f, -0.125f,0.679688f, -0.132813f,0.679688f, -0.140625f,0.679688f, -0.148438f,0.679688f, -0.15625f,0.679688f, -0.164063f,0.679688f, -0.171875f,0.679688f, -0.179688f,0.679688f, -0.1875f,0.679688f, -0.195313f,0.679688f, -0.203125f,0.679688f, -0.210938f,0.679688f, -0.21875f,0.679688f, -0.226563f,0.679688f, -0.234375f,0.679688f, -0.242188f,0.679688f, -0.25f,0.679688f, -0.257813f,0.679688f, -0.265625f,0.679688f, -0.273438f,0.679688f, -0.28125f,0.679688f, -0.289063f,0.679688f, -0.296875f,0.679688f, -0.304688f,0.679688f, -0.3125f,0.679688f, -0.320313f,0.679688f, -0.328125f,0.679688f, -0.335938f,0.679688f, -0.34375f,0.679688f, -0.351563f,0.679688f, -0.359375f,0.679688f, -0.367188f,0.679688f, -0.375f,0.679688f, -0.382813f,0.679688f, -0.390625f,0.679688f, -0.398438f,0.679688f, -0.40625f,0.679688f, -0.414063f,0.679688f, -0.421875f,0.679688f, -0.429688f,0.679688f, -0.4375f,0.679688f, -0.445313f,0.679688f, -0.453125f,0.679688f, -0.460938f,0.679688f, -0.46875f,0.679688f, -0.476563f,0.679688f, -0.484375f,0.679688f, -0.492188f,0.679688f, -0.5f,0.679688f, -0.507813f,0.679688f, -0.0f,0.6875f, -0.0078125f,0.6875f, -0.015625f,0.6875f, -0.0234375f,0.6875f, -0.03125f,0.6875f, -0.0390625f,0.6875f, -0.046875f,0.6875f, -0.0546875f,0.6875f, -0.0625f,0.6875f, -0.0703125f,0.6875f, -0.078125f,0.6875f, -0.0859375f,0.6875f, -0.09375f,0.6875f, -0.101563f,0.6875f, -0.109375f,0.6875f, -0.117188f,0.6875f, -0.125f,0.6875f, -0.132813f,0.6875f, -0.140625f,0.6875f, -0.148438f,0.6875f, -0.15625f,0.6875f, -0.164063f,0.6875f, -0.171875f,0.6875f, -0.179688f,0.6875f, -0.1875f,0.6875f, -0.195313f,0.6875f, -0.203125f,0.6875f, -0.210938f,0.6875f, -0.21875f,0.6875f, -0.226563f,0.6875f, -0.234375f,0.6875f, -0.242188f,0.6875f, -0.25f,0.6875f, -0.257813f,0.6875f, -0.265625f,0.6875f, -0.273438f,0.6875f, -0.28125f,0.6875f, -0.289063f,0.6875f, -0.296875f,0.6875f, -0.304688f,0.6875f, -0.3125f,0.6875f, -0.320313f,0.6875f, -0.328125f,0.6875f, -0.335938f,0.6875f, -0.34375f,0.6875f, -0.351563f,0.6875f, -0.359375f,0.6875f, -0.367188f,0.6875f, -0.375f,0.6875f, -0.382813f,0.6875f, -0.390625f,0.6875f, -0.398438f,0.6875f, -0.40625f,0.6875f, -0.414063f,0.6875f, -0.421875f,0.6875f, -0.429688f,0.6875f, -0.4375f,0.6875f, -0.445313f,0.6875f, -0.453125f,0.6875f, -0.460938f,0.6875f, -0.46875f,0.6875f, -0.476563f,0.6875f, -0.484375f,0.6875f, -0.492188f,0.6875f, -0.5f,0.6875f, -0.507813f,0.6875f, -0.0f,0.695313f, -0.0078125f,0.695313f, -0.015625f,0.695313f, -0.0234375f,0.695313f, -0.03125f,0.695313f, -0.0390625f,0.695313f, -0.046875f,0.695313f, -0.0546875f,0.695313f, -0.0625f,0.695313f, -0.0703125f,0.695313f, -0.078125f,0.695313f, -0.0859375f,0.695313f, -0.09375f,0.695313f, -0.101563f,0.695313f, -0.109375f,0.695313f, -0.117188f,0.695313f, -0.125f,0.695313f, -0.132813f,0.695313f, -0.140625f,0.695313f, -0.148438f,0.695313f, -0.15625f,0.695313f, -0.164063f,0.695313f, -0.171875f,0.695313f, -0.179688f,0.695313f, -0.1875f,0.695313f, -0.195313f,0.695313f, -0.203125f,0.695313f, -0.210938f,0.695313f, -0.21875f,0.695313f, -0.226563f,0.695313f, -0.234375f,0.695313f, -0.242188f,0.695313f, -0.25f,0.695313f, -0.257813f,0.695313f, -0.265625f,0.695313f, -0.273438f,0.695313f, -0.28125f,0.695313f, -0.289063f,0.695313f, -0.296875f,0.695313f, -0.304688f,0.695313f, -0.3125f,0.695313f, -0.320313f,0.695313f, -0.328125f,0.695313f, -0.335938f,0.695313f, -0.34375f,0.695313f, -0.351563f,0.695313f, -0.359375f,0.695313f, -0.367188f,0.695313f, -0.375f,0.695313f, -0.382813f,0.695313f, -0.390625f,0.695313f, -0.398438f,0.695313f, -0.40625f,0.695313f, -0.414063f,0.695313f, -0.421875f,0.695313f, -0.429688f,0.695313f, -0.4375f,0.695313f, -0.445313f,0.695313f, -0.453125f,0.695313f, -0.460938f,0.695313f, -0.46875f,0.695313f, -0.476563f,0.695313f, -0.484375f,0.695313f, -0.492188f,0.695313f, -0.5f,0.695313f, -0.507813f,0.695313f, -0.0f,0.703125f, -0.0078125f,0.703125f, -0.015625f,0.703125f, -0.0234375f,0.703125f, -0.03125f,0.703125f, -0.0390625f,0.703125f, -0.046875f,0.703125f, -0.0546875f,0.703125f, -0.0625f,0.703125f, -0.0703125f,0.703125f, -0.078125f,0.703125f, -0.0859375f,0.703125f, -0.09375f,0.703125f, -0.101563f,0.703125f, -0.109375f,0.703125f, -0.117188f,0.703125f, -0.125f,0.703125f, -0.132813f,0.703125f, -0.140625f,0.703125f, -0.148438f,0.703125f, -0.15625f,0.703125f, -0.164063f,0.703125f, -0.171875f,0.703125f, -0.179688f,0.703125f, -0.1875f,0.703125f, -0.195313f,0.703125f, -0.203125f,0.703125f, -0.210938f,0.703125f, -0.21875f,0.703125f, -0.226563f,0.703125f, -0.234375f,0.703125f, -0.242188f,0.703125f, -0.25f,0.703125f, -0.257813f,0.703125f, -0.265625f,0.703125f, -0.273438f,0.703125f, -0.28125f,0.703125f, -0.289063f,0.703125f, -0.296875f,0.703125f, -0.304688f,0.703125f, -0.3125f,0.703125f, -0.320313f,0.703125f, -0.328125f,0.703125f, -0.335938f,0.703125f, -0.34375f,0.703125f, -0.351563f,0.703125f, -0.359375f,0.703125f, -0.367188f,0.703125f, -0.375f,0.703125f, -0.382813f,0.703125f, -0.390625f,0.703125f, -0.398438f,0.703125f, -0.40625f,0.703125f, -0.414063f,0.703125f, -0.421875f,0.703125f, -0.429688f,0.703125f, -0.4375f,0.703125f, -0.445313f,0.703125f, -0.453125f,0.703125f, -0.460938f,0.703125f, -0.46875f,0.703125f, -0.476563f,0.703125f, -0.484375f,0.703125f, -0.492188f,0.703125f, -0.5f,0.703125f, -0.507813f,0.703125f, -0.0f,0.710938f, -0.0078125f,0.710938f, -0.015625f,0.710938f, -0.0234375f,0.710938f, -0.03125f,0.710938f, -0.0390625f,0.710938f, -0.046875f,0.710938f, -0.0546875f,0.710938f, -0.0625f,0.710938f, -0.0703125f,0.710938f, -0.078125f,0.710938f, -0.0859375f,0.710938f, -0.09375f,0.710938f, -0.101563f,0.710938f, -0.109375f,0.710938f, -0.117188f,0.710938f, -0.125f,0.710938f, -0.132813f,0.710938f, -0.140625f,0.710938f, -0.148438f,0.710938f, -0.15625f,0.710938f, -0.164063f,0.710938f, -0.171875f,0.710938f, -0.179688f,0.710938f, -0.1875f,0.710938f, -0.195313f,0.710938f, -0.203125f,0.710938f, -0.210938f,0.710938f, -0.21875f,0.710938f, -0.226563f,0.710938f, -0.234375f,0.710938f, -0.242188f,0.710938f, -0.25f,0.710938f, -0.257813f,0.710938f, -0.265625f,0.710938f, -0.273438f,0.710938f, -0.28125f,0.710938f, -0.289063f,0.710938f, -0.296875f,0.710938f, -0.304688f,0.710938f, -0.3125f,0.710938f, -0.320313f,0.710938f, -0.328125f,0.710938f, -0.335938f,0.710938f, -0.34375f,0.710938f, -0.351563f,0.710938f, -0.359375f,0.710938f, -0.367188f,0.710938f, -0.375f,0.710938f, -0.382813f,0.710938f, -0.390625f,0.710938f, -0.398438f,0.710938f, -0.40625f,0.710938f, -0.414063f,0.710938f, -0.421875f,0.710938f, -0.429688f,0.710938f, -0.4375f,0.710938f, -0.445313f,0.710938f, -0.453125f,0.710938f, -0.460938f,0.710938f, -0.46875f,0.710938f, -0.476563f,0.710938f, -0.484375f,0.710938f, -0.492188f,0.710938f, -0.5f,0.710938f, -0.507813f,0.710938f, -0.0f,0.71875f, -0.0078125f,0.71875f, -0.015625f,0.71875f, -0.0234375f,0.71875f, -0.03125f,0.71875f, -0.0390625f,0.71875f, -0.046875f,0.71875f, -0.0546875f,0.71875f, -0.0625f,0.71875f, -0.0703125f,0.71875f, -0.078125f,0.71875f, -0.0859375f,0.71875f, -0.09375f,0.71875f, -0.101563f,0.71875f, -0.109375f,0.71875f, -0.117188f,0.71875f, -0.125f,0.71875f, -0.132813f,0.71875f, -0.140625f,0.71875f, -0.148438f,0.71875f, -0.15625f,0.71875f, -0.164063f,0.71875f, -0.171875f,0.71875f, -0.179688f,0.71875f, -0.1875f,0.71875f, -0.195313f,0.71875f, -0.203125f,0.71875f, -0.210938f,0.71875f, -0.21875f,0.71875f, -0.226563f,0.71875f, -0.234375f,0.71875f, -0.242188f,0.71875f, -0.25f,0.71875f, -0.257813f,0.71875f, -0.265625f,0.71875f, -0.273438f,0.71875f, -0.28125f,0.71875f, -0.289063f,0.71875f, -0.296875f,0.71875f, -0.304688f,0.71875f, -0.3125f,0.71875f, -0.320313f,0.71875f, -0.328125f,0.71875f, -0.335938f,0.71875f, -0.34375f,0.71875f, -0.351563f,0.71875f, -0.359375f,0.71875f, -0.367188f,0.71875f, -0.375f,0.71875f, -0.382813f,0.71875f, -0.390625f,0.71875f, -0.398438f,0.71875f, -0.40625f,0.71875f, -0.414063f,0.71875f, -0.421875f,0.71875f, -0.429688f,0.71875f, -0.4375f,0.71875f, -0.445313f,0.71875f, -0.453125f,0.71875f, -0.460938f,0.71875f, -0.46875f,0.71875f, -0.476563f,0.71875f, -0.484375f,0.71875f, -0.492188f,0.71875f, -0.5f,0.71875f, -0.507813f,0.71875f, -0.0f,0.726563f, -0.0078125f,0.726563f, -0.015625f,0.726563f, -0.0234375f,0.726563f, -0.03125f,0.726563f, -0.0390625f,0.726563f, -0.046875f,0.726563f, -0.0546875f,0.726563f, -0.0625f,0.726563f, -0.0703125f,0.726563f, -0.078125f,0.726563f, -0.0859375f,0.726563f, -0.09375f,0.726563f, -0.101563f,0.726563f, -0.109375f,0.726563f, -0.117188f,0.726563f, -0.125f,0.726563f, -0.132813f,0.726563f, -0.140625f,0.726563f, -0.148438f,0.726563f, -0.15625f,0.726563f, -0.164063f,0.726563f, -0.171875f,0.726563f, -0.179688f,0.726563f, -0.1875f,0.726563f, -0.195313f,0.726563f, -0.203125f,0.726563f, -0.210938f,0.726563f, -0.21875f,0.726563f, -0.226563f,0.726563f, -0.234375f,0.726563f, -0.242188f,0.726563f, -0.25f,0.726563f, -0.257813f,0.726563f, -0.265625f,0.726563f, -0.273438f,0.726563f, -0.28125f,0.726563f, -0.289063f,0.726563f, -0.296875f,0.726563f, -0.304688f,0.726563f, -0.3125f,0.726563f, -0.320313f,0.726563f, -0.328125f,0.726563f, -0.335938f,0.726563f, -0.34375f,0.726563f, -0.351563f,0.726563f, -0.359375f,0.726563f, -0.367188f,0.726563f, -0.375f,0.726563f, -0.382813f,0.726563f, -0.390625f,0.726563f, -0.398438f,0.726563f, -0.40625f,0.726563f, -0.414063f,0.726563f, -0.421875f,0.726563f, -0.429688f,0.726563f, -0.4375f,0.726563f, -0.445313f,0.726563f, -0.453125f,0.726563f, -0.460938f,0.726563f, -0.46875f,0.726563f, -0.476563f,0.726563f, -0.484375f,0.726563f, -0.492188f,0.726563f, -0.5f,0.726563f, -0.507813f,0.726563f, -0.0f,0.734375f, -0.0078125f,0.734375f, -0.015625f,0.734375f, -0.0234375f,0.734375f, -0.03125f,0.734375f, -0.0390625f,0.734375f, -0.046875f,0.734375f, -0.0546875f,0.734375f, -0.0625f,0.734375f, -0.0703125f,0.734375f, -0.078125f,0.734375f, -0.0859375f,0.734375f, -0.09375f,0.734375f, -0.101563f,0.734375f, -0.109375f,0.734375f, -0.117188f,0.734375f, -0.125f,0.734375f, -0.132813f,0.734375f, -0.140625f,0.734375f, -0.148438f,0.734375f, -0.15625f,0.734375f, -0.164063f,0.734375f, -0.171875f,0.734375f, -0.179688f,0.734375f, -0.1875f,0.734375f, -0.195313f,0.734375f, -0.203125f,0.734375f, -0.210938f,0.734375f, -0.21875f,0.734375f, -0.226563f,0.734375f, -0.234375f,0.734375f, -0.242188f,0.734375f, -0.25f,0.734375f, -0.257813f,0.734375f, -0.265625f,0.734375f, -0.273438f,0.734375f, -0.28125f,0.734375f, -0.289063f,0.734375f, -0.296875f,0.734375f, -0.304688f,0.734375f, -0.3125f,0.734375f, -0.320313f,0.734375f, -0.328125f,0.734375f, -0.335938f,0.734375f, -0.34375f,0.734375f, -0.351563f,0.734375f, -0.359375f,0.734375f, -0.367188f,0.734375f, -0.375f,0.734375f, -0.382813f,0.734375f, -0.390625f,0.734375f, -0.398438f,0.734375f, -0.40625f,0.734375f, -0.414063f,0.734375f, -0.421875f,0.734375f, -0.429688f,0.734375f, -0.4375f,0.734375f, -0.445313f,0.734375f, -0.453125f,0.734375f, -0.460938f,0.734375f, -0.46875f,0.734375f, -0.476563f,0.734375f, -0.484375f,0.734375f, -0.492188f,0.734375f, -0.5f,0.734375f, -0.507813f,0.734375f, -0.0f,0.742188f, -0.0078125f,0.742188f, -0.015625f,0.742188f, -0.0234375f,0.742188f, -0.03125f,0.742188f, -0.0390625f,0.742188f, -0.046875f,0.742188f, -0.0546875f,0.742188f, -0.0625f,0.742188f, -0.0703125f,0.742188f, -0.078125f,0.742188f, -0.0859375f,0.742188f, -0.09375f,0.742188f, -0.101563f,0.742188f, -0.109375f,0.742188f, -0.117188f,0.742188f, -0.125f,0.742188f, -0.132813f,0.742188f, -0.140625f,0.742188f, -0.148438f,0.742188f, -0.15625f,0.742188f, -0.164063f,0.742188f, -0.171875f,0.742188f, -0.179688f,0.742188f, -0.1875f,0.742188f, -0.195313f,0.742188f, -0.203125f,0.742188f, -0.210938f,0.742188f, -0.21875f,0.742188f, -0.226563f,0.742188f, -0.234375f,0.742188f, -0.242188f,0.742188f, -0.25f,0.742188f, -0.257813f,0.742188f, -0.265625f,0.742188f, -0.273438f,0.742188f, -0.28125f,0.742188f, -0.289063f,0.742188f, -0.296875f,0.742188f, -0.304688f,0.742188f, -0.3125f,0.742188f, -0.320313f,0.742188f, -0.328125f,0.742188f, -0.335938f,0.742188f, -0.34375f,0.742188f, -0.351563f,0.742188f, -0.359375f,0.742188f, -0.367188f,0.742188f, -0.375f,0.742188f, -0.382813f,0.742188f, -0.390625f,0.742188f, -0.398438f,0.742188f, -0.40625f,0.742188f, -0.414063f,0.742188f, -0.421875f,0.742188f, -0.429688f,0.742188f, -0.4375f,0.742188f, -0.445313f,0.742188f, -0.453125f,0.742188f, -0.460938f,0.742188f, -0.46875f,0.742188f, -0.476563f,0.742188f, -0.484375f,0.742188f, -0.492188f,0.742188f, -0.5f,0.742188f, -0.507813f,0.742188f, -0.0f,0.75f, -0.0078125f,0.75f, -0.015625f,0.75f, -0.0234375f,0.75f, -0.03125f,0.75f, -0.0390625f,0.75f, -0.046875f,0.75f, -0.0546875f,0.75f, -0.0625f,0.75f, -0.0703125f,0.75f, -0.078125f,0.75f, -0.0859375f,0.75f, -0.09375f,0.75f, -0.101563f,0.75f, -0.109375f,0.75f, -0.117188f,0.75f, -0.125f,0.75f, -0.132813f,0.75f, -0.140625f,0.75f, -0.148438f,0.75f, -0.15625f,0.75f, -0.164063f,0.75f, -0.171875f,0.75f, -0.179688f,0.75f, -0.1875f,0.75f, -0.195313f,0.75f, -0.203125f,0.75f, -0.210938f,0.75f, -0.21875f,0.75f, -0.226563f,0.75f, -0.234375f,0.75f, -0.242188f,0.75f, -0.25f,0.75f, -0.257813f,0.75f, -0.265625f,0.75f, -0.273438f,0.75f, -0.28125f,0.75f, -0.289063f,0.75f, -0.296875f,0.75f, -0.304688f,0.75f, -0.3125f,0.75f, -0.320313f,0.75f, -0.328125f,0.75f, -0.335938f,0.75f, -0.34375f,0.75f, -0.351563f,0.75f, -0.359375f,0.75f, -0.367188f,0.75f, -0.375f,0.75f, -0.382813f,0.75f, -0.390625f,0.75f, -0.398438f,0.75f, -0.40625f,0.75f, -0.414063f,0.75f, -0.421875f,0.75f, -0.429688f,0.75f, -0.4375f,0.75f, -0.445313f,0.75f, -0.453125f,0.75f, -0.460938f,0.75f, -0.46875f,0.75f, -0.476563f,0.75f, -0.484375f,0.75f, -0.492188f,0.75f, -0.5f,0.75f, -0.507813f,0.75f, -}; - -unsigned short Landscape05Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -126,127,128, -129,128,127, -128,129,130, -131,130,129, -132,0,133, -2,133,0, -133,2,134, -4,134,2, -134,4,135, -6,135,4, -135,6,136, -8,136,6, -136,8,137, -10,137,8, -137,10,138, -12,138,10, -138,12,139, -14,139,12, -139,14,140, -16,140,14, -140,16,141, -18,141,16, -141,18,142, -20,142,18, -142,20,143, -22,143,20, -143,22,144, -24,144,22, -144,24,145, -26,145,24, -145,26,146, -28,146,26, -146,28,147, -30,147,28, -147,30,148, -32,148,30, -148,32,149, -34,149,32, -149,34,150, -36,150,34, -150,36,151, -38,151,36, -151,38,152, -40,152,38, -152,40,153, -42,153,40, -153,42,154, -44,154,42, -154,44,155, -46,155,44, -155,46,156, -48,156,46, -156,48,157, -50,157,48, -157,50,158, -52,158,50, -158,52,159, -54,159,52, -159,54,160, -56,160,54, -160,56,161, -58,161,56, -161,58,162, -60,162,58, -162,60,163, -62,163,60, -163,62,164, -64,164,62, -164,64,165, -66,165,64, -165,66,166, -68,166,66, -166,68,167, -70,167,68, -167,70,168, -72,168,70, -168,72,169, -74,169,72, -169,74,170, -76,170,74, -170,76,171, -78,171,76, -171,78,172, -80,172,78, -172,80,173, -82,173,80, -173,82,174, -84,174,82, -174,84,175, -86,175,84, -175,86,176, -88,176,86, -176,88,177, -90,177,88, -177,90,178, -92,178,90, -178,92,179, -94,179,92, -179,94,180, -96,180,94, -180,96,181, -98,181,96, -181,98,182, -100,182,98, -182,100,183, -102,183,100, -183,102,184, -104,184,102, -184,104,185, -106,185,104, -185,106,186, -108,186,106, -186,108,187, -110,187,108, -187,110,188, -112,188,110, -188,112,189, -114,189,112, -189,114,190, -116,190,114, -190,116,191, -118,191,116, -191,118,192, -120,192,118, -192,120,193, -122,193,120, -193,122,194, -124,194,122, -194,124,195, -126,195,124, -195,126,196, -128,196,126, -196,128,197, -130,197,128, -198,132,199, -133,199,132, -199,133,200, -134,200,133, -200,134,201, -135,201,134, -201,135,202, -136,202,135, -202,136,203, -137,203,136, -203,137,204, -138,204,137, -204,138,205, -139,205,138, -205,139,206, -140,206,139, -206,140,207, -141,207,140, -207,141,208, -142,208,141, -208,142,209, -143,209,142, -209,143,210, -144,210,143, -210,144,211, -145,211,144, -211,145,212, -146,212,145, -212,146,213, -147,213,146, -213,147,214, -148,214,147, -214,148,215, -149,215,148, -215,149,216, -150,216,149, -216,150,217, -151,217,150, -217,151,218, -152,218,151, -218,152,219, -153,219,152, -219,153,220, -154,220,153, -220,154,221, -155,221,154, -221,155,222, -156,222,155, -222,156,223, -157,223,156, -223,157,224, -158,224,157, -224,158,225, -159,225,158, -225,159,226, -160,226,159, -226,160,227, -161,227,160, -227,161,228, -162,228,161, -228,162,229, -163,229,162, -229,163,230, -164,230,163, -230,164,231, -165,231,164, -231,165,232, -166,232,165, -232,166,233, -167,233,166, -233,167,234, -168,234,167, -234,168,235, -169,235,168, -235,169,236, -170,236,169, -236,170,237, -171,237,170, -237,171,238, -172,238,171, -238,172,239, -173,239,172, -239,173,240, -174,240,173, -240,174,241, -175,241,174, -241,175,242, -176,242,175, -242,176,243, -177,243,176, -243,177,244, -178,244,177, -244,178,245, -179,245,178, -245,179,246, -180,246,179, -246,180,247, -181,247,180, -247,181,248, -182,248,181, -248,182,249, -183,249,182, -249,183,250, -184,250,183, -250,184,251, -185,251,184, -251,185,252, -186,252,185, -252,186,253, -187,253,186, -253,187,254, -188,254,187, -254,188,255, -189,255,188, -255,189,256, -190,256,189, -256,190,257, -191,257,190, -257,191,258, -192,258,191, -258,192,259, -193,259,192, -259,193,260, -194,260,193, -260,194,261, -195,261,194, -261,195,262, -196,262,195, -262,196,263, -197,263,196, -264,198,265, -199,265,198, -265,199,266, -200,266,199, -266,200,267, -201,267,200, -267,201,268, -202,268,201, -268,202,269, -203,269,202, -269,203,270, -204,270,203, -270,204,271, -205,271,204, -271,205,272, -206,272,205, -272,206,273, -207,273,206, -273,207,274, -208,274,207, -274,208,275, -209,275,208, -275,209,276, -210,276,209, -276,210,277, -211,277,210, -277,211,278, -212,278,211, -278,212,279, -213,279,212, -279,213,280, -214,280,213, -280,214,281, -215,281,214, -281,215,282, -216,282,215, -282,216,283, -217,283,216, -283,217,284, -218,284,217, -284,218,285, -219,285,218, -285,219,286, -220,286,219, -286,220,287, -221,287,220, -287,221,288, -222,288,221, -288,222,289, -223,289,222, -289,223,290, -224,290,223, -290,224,291, -225,291,224, -291,225,292, -226,292,225, -292,226,293, -227,293,226, -293,227,294, -228,294,227, -294,228,295, -229,295,228, -295,229,296, -230,296,229, -296,230,297, -231,297,230, -297,231,298, -232,298,231, -298,232,299, -233,299,232, -299,233,300, -234,300,233, -300,234,301, -235,301,234, -301,235,302, -236,302,235, -302,236,303, -237,303,236, -303,237,304, -238,304,237, -304,238,305, -239,305,238, -305,239,306, -240,306,239, -306,240,307, -241,307,240, -307,241,308, -242,308,241, -308,242,309, -243,309,242, -309,243,310, -244,310,243, -310,244,311, -245,311,244, -311,245,312, -246,312,245, -312,246,313, -247,313,246, -313,247,314, -248,314,247, -314,248,315, -249,315,248, -315,249,316, -250,316,249, -316,250,317, -251,317,250, -317,251,318, -252,318,251, -318,252,319, -253,319,252, -319,253,320, -254,320,253, -320,254,321, -255,321,254, -321,255,322, -256,322,255, -322,256,323, -257,323,256, -323,257,324, -258,324,257, -324,258,325, -259,325,258, -325,259,326, -260,326,259, -326,260,327, -261,327,260, -327,261,328, -262,328,261, -328,262,329, -263,329,262, -330,264,331, -265,331,264, -331,265,332, -266,332,265, -332,266,333, -267,333,266, -333,267,334, -268,334,267, -334,268,335, -269,335,268, -335,269,336, -270,336,269, -336,270,337, -271,337,270, -337,271,338, -272,338,271, -338,272,339, -273,339,272, -339,273,340, -274,340,273, -340,274,341, -275,341,274, -341,275,342, -276,342,275, -342,276,343, -277,343,276, -343,277,344, -278,344,277, -344,278,345, -279,345,278, -345,279,346, -280,346,279, -346,280,347, -281,347,280, -347,281,348, -282,348,281, -348,282,349, -283,349,282, -349,283,350, -284,350,283, -350,284,351, -285,351,284, -351,285,352, -286,352,285, -352,286,353, -287,353,286, -353,287,354, -288,354,287, -354,288,355, -289,355,288, -355,289,356, -290,356,289, -356,290,357, -291,357,290, -357,291,358, -292,358,291, -358,292,359, -293,359,292, -359,293,360, -294,360,293, -360,294,361, -295,361,294, -361,295,362, -296,362,295, -362,296,363, -297,363,296, -363,297,364, -298,364,297, -364,298,365, -299,365,298, -365,299,366, -300,366,299, -366,300,367, -301,367,300, -367,301,368, -302,368,301, -368,302,369, -303,369,302, -369,303,370, -304,370,303, -370,304,371, -305,371,304, -371,305,372, -306,372,305, -372,306,373, -307,373,306, -373,307,374, -308,374,307, -374,308,375, -309,375,308, -375,309,376, -310,376,309, -376,310,377, -311,377,310, -377,311,378, -312,378,311, -378,312,379, -313,379,312, -379,313,380, -314,380,313, -380,314,381, -315,381,314, -381,315,382, -316,382,315, -382,316,383, -317,383,316, -383,317,384, -318,384,317, -384,318,385, -319,385,318, -385,319,386, -320,386,319, -386,320,387, -321,387,320, -387,321,388, -322,388,321, -388,322,389, -323,389,322, -389,323,390, -324,390,323, -390,324,391, -325,391,324, -391,325,392, -326,392,325, -392,326,393, -327,393,326, -393,327,394, -328,394,327, -394,328,395, -329,395,328, -396,330,397, -331,397,330, -397,331,398, -332,398,331, -398,332,399, -333,399,332, -399,333,400, -334,400,333, -400,334,401, -335,401,334, -401,335,402, -336,402,335, -402,336,403, -337,403,336, -403,337,404, -338,404,337, -404,338,405, -339,405,338, -405,339,406, -340,406,339, -406,340,407, -341,407,340, -407,341,408, -342,408,341, -408,342,409, -343,409,342, -409,343,410, -344,410,343, -410,344,411, -345,411,344, -411,345,412, -346,412,345, -412,346,413, -347,413,346, -413,347,414, -348,414,347, -414,348,415, -349,415,348, -415,349,416, -350,416,349, -416,350,417, -351,417,350, -417,351,418, -352,418,351, -418,352,419, -353,419,352, -419,353,420, -354,420,353, -420,354,421, -355,421,354, -421,355,422, -356,422,355, -422,356,423, -357,423,356, -423,357,424, -358,424,357, -424,358,425, -359,425,358, -425,359,426, -360,426,359, -426,360,427, -361,427,360, -427,361,428, -362,428,361, -428,362,429, -363,429,362, -429,363,430, -364,430,363, -430,364,431, -365,431,364, -431,365,432, -366,432,365, -432,366,433, -367,433,366, -433,367,434, -368,434,367, -434,368,435, -369,435,368, -435,369,436, -370,436,369, -436,370,437, -371,437,370, -437,371,438, -372,438,371, -438,372,439, -373,439,372, -439,373,440, -374,440,373, -440,374,441, -375,441,374, -441,375,442, -376,442,375, -442,376,443, -377,443,376, -443,377,444, -378,444,377, -444,378,445, -379,445,378, -445,379,446, -380,446,379, -446,380,447, -381,447,380, -447,381,448, -382,448,381, -448,382,449, -383,449,382, -449,383,450, -384,450,383, -450,384,451, -385,451,384, -451,385,452, -386,452,385, -452,386,453, -387,453,386, -453,387,454, -388,454,387, -454,388,455, -389,455,388, -455,389,456, -390,456,389, -456,390,457, -391,457,390, -457,391,458, -392,458,391, -458,392,459, -393,459,392, -459,393,460, -394,460,393, -460,394,461, -395,461,394, -462,396,463, -397,463,396, -463,397,464, -398,464,397, -464,398,465, -399,465,398, -465,399,466, -400,466,399, -466,400,467, -401,467,400, -467,401,468, -402,468,401, -468,402,469, -403,469,402, -469,403,470, -404,470,403, -470,404,471, -405,471,404, -471,405,472, -406,472,405, -472,406,473, -407,473,406, -473,407,474, -408,474,407, -474,408,475, -409,475,408, -475,409,476, -410,476,409, -476,410,477, -411,477,410, -477,411,478, -412,478,411, -478,412,479, -413,479,412, -479,413,480, -414,480,413, -480,414,481, -415,481,414, -481,415,482, -416,482,415, -482,416,483, -417,483,416, -483,417,484, -418,484,417, -484,418,485, -419,485,418, -485,419,486, -420,486,419, -486,420,487, -421,487,420, -487,421,488, -422,488,421, -488,422,489, -423,489,422, -489,423,490, -424,490,423, -490,424,491, -425,491,424, -491,425,492, -426,492,425, -492,426,493, -427,493,426, -493,427,494, -428,494,427, -494,428,495, -429,495,428, -495,429,496, -430,496,429, -496,430,497, -431,497,430, -497,431,498, -432,498,431, -498,432,499, -433,499,432, -499,433,500, -434,500,433, -500,434,501, -435,501,434, -501,435,502, -436,502,435, -502,436,503, -437,503,436, -503,437,504, -438,504,437, -504,438,505, -439,505,438, -505,439,506, -440,506,439, -506,440,507, -441,507,440, -507,441,508, -442,508,441, -508,442,509, -443,509,442, -509,443,510, -444,510,443, -510,444,511, -445,511,444, -511,445,512, -446,512,445, -512,446,513, -447,513,446, -513,447,514, -448,514,447, -514,448,515, -449,515,448, -515,449,516, -450,516,449, -516,450,517, -451,517,450, -517,451,518, -452,518,451, -518,452,519, -453,519,452, -519,453,520, -454,520,453, -520,454,521, -455,521,454, -521,455,522, -456,522,455, -522,456,523, -457,523,456, -523,457,524, -458,524,457, -524,458,525, -459,525,458, -525,459,526, -460,526,459, -526,460,527, -461,527,460, -528,462,529, -463,529,462, -529,463,530, -464,530,463, -530,464,531, -465,531,464, -531,465,532, -466,532,465, -532,466,533, -467,533,466, -533,467,534, -468,534,467, -534,468,535, -469,535,468, -535,469,536, -470,536,469, -536,470,537, -471,537,470, -537,471,538, -472,538,471, -538,472,539, -473,539,472, -539,473,540, -474,540,473, -540,474,541, -475,541,474, -541,475,542, -476,542,475, -542,476,543, -477,543,476, -543,477,544, -478,544,477, -544,478,545, -479,545,478, -545,479,546, -480,546,479, -546,480,547, -481,547,480, -547,481,548, -482,548,481, -548,482,549, -483,549,482, -549,483,550, -484,550,483, -550,484,551, -485,551,484, -551,485,552, -486,552,485, -552,486,553, -487,553,486, -553,487,554, -488,554,487, -554,488,555, -489,555,488, -555,489,556, -490,556,489, -556,490,557, -491,557,490, -557,491,558, -492,558,491, -558,492,559, -493,559,492, -559,493,560, -494,560,493, -560,494,561, -495,561,494, -561,495,562, -496,562,495, -562,496,563, -497,563,496, -563,497,564, -498,564,497, -564,498,565, -499,565,498, -565,499,566, -500,566,499, -566,500,567, -501,567,500, -567,501,568, -502,568,501, -568,502,569, -503,569,502, -569,503,570, -504,570,503, -570,504,571, -505,571,504, -571,505,572, -506,572,505, -572,506,573, -507,573,506, -573,507,574, -508,574,507, -574,508,575, -509,575,508, -575,509,576, -510,576,509, -576,510,577, -511,577,510, -577,511,578, -512,578,511, -578,512,579, -513,579,512, -579,513,580, -514,580,513, -580,514,581, -515,581,514, -581,515,582, -516,582,515, -582,516,583, -517,583,516, -583,517,584, -518,584,517, -584,518,585, -519,585,518, -585,519,586, -520,586,519, -586,520,587, -521,587,520, -587,521,588, -522,588,521, -588,522,589, -523,589,522, -589,523,590, -524,590,523, -590,524,591, -525,591,524, -591,525,592, -526,592,525, -592,526,593, -527,593,526, -594,528,595, -529,595,528, -595,529,596, -530,596,529, -596,530,597, -531,597,530, -597,531,598, -532,598,531, -598,532,599, -533,599,532, -599,533,600, -534,600,533, -600,534,601, -535,601,534, -601,535,602, -536,602,535, -602,536,603, -537,603,536, -603,537,604, -538,604,537, -604,538,605, -539,605,538, -605,539,606, -540,606,539, -606,540,607, -541,607,540, -607,541,608, -542,608,541, -608,542,609, -543,609,542, -609,543,610, -544,610,543, -610,544,611, -545,611,544, -611,545,612, -546,612,545, -612,546,613, -547,613,546, -613,547,614, -548,614,547, -614,548,615, -549,615,548, -615,549,616, -550,616,549, -616,550,617, -551,617,550, -617,551,618, -552,618,551, -618,552,619, -553,619,552, -619,553,620, -554,620,553, -620,554,621, -555,621,554, -621,555,622, -556,622,555, -622,556,623, -557,623,556, -623,557,624, -558,624,557, -624,558,625, -559,625,558, -625,559,626, -560,626,559, -626,560,627, -561,627,560, -627,561,628, -562,628,561, -628,562,629, -563,629,562, -629,563,630, -564,630,563, -630,564,631, -565,631,564, -631,565,632, -566,632,565, -632,566,633, -567,633,566, -633,567,634, -568,634,567, -634,568,635, -569,635,568, -635,569,636, -570,636,569, -636,570,637, -571,637,570, -637,571,638, -572,638,571, -638,572,639, -573,639,572, -639,573,640, -574,640,573, -640,574,641, -575,641,574, -641,575,642, -576,642,575, -642,576,643, -577,643,576, -643,577,644, -578,644,577, -644,578,645, -579,645,578, -645,579,646, -580,646,579, -646,580,647, -581,647,580, -647,581,648, -582,648,581, -648,582,649, -583,649,582, -649,583,650, -584,650,583, -650,584,651, -585,651,584, -651,585,652, -586,652,585, -652,586,653, -587,653,586, -653,587,654, -588,654,587, -654,588,655, -589,655,588, -655,589,656, -590,656,589, -656,590,657, -591,657,590, -657,591,658, -592,658,591, -658,592,659, -593,659,592, -660,594,661, -595,661,594, -661,595,662, -596,662,595, -662,596,663, -597,663,596, -663,597,664, -598,664,597, -664,598,665, -599,665,598, -665,599,666, -600,666,599, -666,600,667, -601,667,600, -667,601,668, -602,668,601, -668,602,669, -603,669,602, -669,603,670, -604,670,603, -670,604,671, -605,671,604, -671,605,672, -606,672,605, -672,606,673, -607,673,606, -673,607,674, -608,674,607, -674,608,675, -609,675,608, -675,609,676, -610,676,609, -676,610,677, -611,677,610, -677,611,678, -612,678,611, -678,612,679, -613,679,612, -679,613,680, -614,680,613, -680,614,681, -615,681,614, -681,615,682, -616,682,615, -682,616,683, -617,683,616, -683,617,684, -618,684,617, -684,618,685, -619,685,618, -685,619,686, -620,686,619, -686,620,687, -621,687,620, -687,621,688, -622,688,621, -688,622,689, -623,689,622, -689,623,690, -624,690,623, -690,624,691, -625,691,624, -691,625,692, -626,692,625, -692,626,693, -627,693,626, -693,627,694, -628,694,627, -694,628,695, -629,695,628, -695,629,696, -630,696,629, -696,630,697, -631,697,630, -697,631,698, -632,698,631, -698,632,699, -633,699,632, -699,633,700, -634,700,633, -700,634,701, -635,701,634, -701,635,702, -636,702,635, -702,636,703, -637,703,636, -703,637,704, -638,704,637, -704,638,705, -639,705,638, -705,639,706, -640,706,639, -706,640,707, -641,707,640, -707,641,708, -642,708,641, -708,642,709, -643,709,642, -709,643,710, -644,710,643, -710,644,711, -645,711,644, -711,645,712, -646,712,645, -712,646,713, -647,713,646, -713,647,714, -648,714,647, -714,648,715, -649,715,648, -715,649,716, -650,716,649, -716,650,717, -651,717,650, -717,651,718, -652,718,651, -718,652,719, -653,719,652, -719,653,720, -654,720,653, -720,654,721, -655,721,654, -721,655,722, -656,722,655, -722,656,723, -657,723,656, -723,657,724, -658,724,657, -724,658,725, -659,725,658, -726,660,727, -661,727,660, -727,661,728, -662,728,661, -728,662,729, -663,729,662, -729,663,730, -664,730,663, -730,664,731, -665,731,664, -731,665,732, -666,732,665, -732,666,733, -667,733,666, -733,667,734, -668,734,667, -734,668,735, -669,735,668, -735,669,736, -670,736,669, -736,670,737, -671,737,670, -737,671,738, -672,738,671, -738,672,739, -673,739,672, -739,673,740, -674,740,673, -740,674,741, -675,741,674, -741,675,742, -676,742,675, -742,676,743, -677,743,676, -743,677,744, -678,744,677, -744,678,745, -679,745,678, -745,679,746, -680,746,679, -746,680,747, -681,747,680, -747,681,748, -682,748,681, -748,682,749, -683,749,682, -749,683,750, -684,750,683, -750,684,751, -685,751,684, -751,685,752, -686,752,685, -752,686,753, -687,753,686, -753,687,754, -688,754,687, -754,688,755, -689,755,688, -755,689,756, -690,756,689, -756,690,757, -691,757,690, -757,691,758, -692,758,691, -758,692,759, -693,759,692, -759,693,760, -694,760,693, -760,694,761, -695,761,694, -761,695,762, -696,762,695, -762,696,763, -697,763,696, -763,697,764, -698,764,697, -764,698,765, -699,765,698, -765,699,766, -700,766,699, -766,700,767, -701,767,700, -767,701,768, -702,768,701, -768,702,769, -703,769,702, -769,703,770, -704,770,703, -770,704,771, -705,771,704, -771,705,772, -706,772,705, -772,706,773, -707,773,706, -773,707,774, -708,774,707, -774,708,775, -709,775,708, -775,709,776, -710,776,709, -776,710,777, -711,777,710, -777,711,778, -712,778,711, -778,712,779, -713,779,712, -779,713,780, -714,780,713, -780,714,781, -715,781,714, -781,715,782, -716,782,715, -782,716,783, -717,783,716, -783,717,784, -718,784,717, -784,718,785, -719,785,718, -785,719,786, -720,786,719, -786,720,787, -721,787,720, -787,721,788, -722,788,721, -788,722,789, -723,789,722, -789,723,790, -724,790,723, -790,724,791, -725,791,724, -792,726,793, -727,793,726, -793,727,794, -728,794,727, -794,728,795, -729,795,728, -795,729,796, -730,796,729, -796,730,797, -731,797,730, -797,731,798, -732,798,731, -798,732,799, -733,799,732, -799,733,800, -734,800,733, -800,734,801, -735,801,734, -801,735,802, -736,802,735, -802,736,803, -737,803,736, -803,737,804, -738,804,737, -804,738,805, -739,805,738, -805,739,806, -740,806,739, -806,740,807, -741,807,740, -807,741,808, -742,808,741, -808,742,809, -743,809,742, -809,743,810, -744,810,743, -810,744,811, -745,811,744, -811,745,812, -746,812,745, -812,746,813, -747,813,746, -813,747,814, -748,814,747, -814,748,815, -749,815,748, -815,749,816, -750,816,749, -816,750,817, -751,817,750, -817,751,818, -752,818,751, -818,752,819, -753,819,752, -819,753,820, -754,820,753, -820,754,821, -755,821,754, -821,755,822, -756,822,755, -822,756,823, -757,823,756, -823,757,824, -758,824,757, -824,758,825, -759,825,758, -825,759,826, -760,826,759, -826,760,827, -761,827,760, -827,761,828, -762,828,761, -828,762,829, -763,829,762, -829,763,830, -764,830,763, -830,764,831, -765,831,764, -831,765,832, -766,832,765, -832,766,833, -767,833,766, -833,767,834, -768,834,767, -834,768,835, -769,835,768, -835,769,836, -770,836,769, -836,770,837, -771,837,770, -837,771,838, -772,838,771, -838,772,839, -773,839,772, -839,773,840, -774,840,773, -840,774,841, -775,841,774, -841,775,842, -776,842,775, -842,776,843, -777,843,776, -843,777,844, -778,844,777, -844,778,845, -779,845,778, -845,779,846, -780,846,779, -846,780,847, -781,847,780, -847,781,848, -782,848,781, -848,782,849, -783,849,782, -849,783,850, -784,850,783, -850,784,851, -785,851,784, -851,785,852, -786,852,785, -852,786,853, -787,853,786, -853,787,854, -788,854,787, -854,788,855, -789,855,788, -855,789,856, -790,856,789, -856,790,857, -791,857,790, -858,792,859, -793,859,792, -859,793,860, -794,860,793, -860,794,861, -795,861,794, -861,795,862, -796,862,795, -862,796,863, -797,863,796, -863,797,864, -798,864,797, -864,798,865, -799,865,798, -865,799,866, -800,866,799, -866,800,867, -801,867,800, -867,801,868, -802,868,801, -868,802,869, -803,869,802, -869,803,870, -804,870,803, -870,804,871, -805,871,804, -871,805,872, -806,872,805, -872,806,873, -807,873,806, -873,807,874, -808,874,807, -874,808,875, -809,875,808, -875,809,876, -810,876,809, -876,810,877, -811,877,810, -877,811,878, -812,878,811, -878,812,879, -813,879,812, -879,813,880, -814,880,813, -880,814,881, -815,881,814, -881,815,882, -816,882,815, -882,816,883, -817,883,816, -883,817,884, -818,884,817, -884,818,885, -819,885,818, -885,819,886, -820,886,819, -886,820,887, -821,887,820, -887,821,888, -822,888,821, -888,822,889, -823,889,822, -889,823,890, -824,890,823, -890,824,891, -825,891,824, -891,825,892, -826,892,825, -892,826,893, -827,893,826, -893,827,894, -828,894,827, -894,828,895, -829,895,828, -895,829,896, -830,896,829, -896,830,897, -831,897,830, -897,831,898, -832,898,831, -898,832,899, -833,899,832, -899,833,900, -834,900,833, -900,834,901, -835,901,834, -901,835,902, -836,902,835, -902,836,903, -837,903,836, -903,837,904, -838,904,837, -904,838,905, -839,905,838, -905,839,906, -840,906,839, -906,840,907, -841,907,840, -907,841,908, -842,908,841, -908,842,909, -843,909,842, -909,843,910, -844,910,843, -910,844,911, -845,911,844, -911,845,912, -846,912,845, -912,846,913, -847,913,846, -913,847,914, -848,914,847, -914,848,915, -849,915,848, -915,849,916, -850,916,849, -916,850,917, -851,917,850, -917,851,918, -852,918,851, -918,852,919, -853,919,852, -919,853,920, -854,920,853, -920,854,921, -855,921,854, -921,855,922, -856,922,855, -922,856,923, -857,923,856, -924,858,925, -859,925,858, -925,859,926, -860,926,859, -926,860,927, -861,927,860, -927,861,928, -862,928,861, -928,862,929, -863,929,862, -929,863,930, -864,930,863, -930,864,931, -865,931,864, -931,865,932, -866,932,865, -932,866,933, -867,933,866, -933,867,934, -868,934,867, -934,868,935, -869,935,868, -935,869,936, -870,936,869, -936,870,937, -871,937,870, -937,871,938, -872,938,871, -938,872,939, -873,939,872, -939,873,940, -874,940,873, -940,874,941, -875,941,874, -941,875,942, -876,942,875, -942,876,943, -877,943,876, -943,877,944, -878,944,877, -944,878,945, -879,945,878, -945,879,946, -880,946,879, -946,880,947, -881,947,880, -947,881,948, -882,948,881, -948,882,949, -883,949,882, -949,883,950, -884,950,883, -950,884,951, -885,951,884, -951,885,952, -886,952,885, -952,886,953, -887,953,886, -953,887,954, -888,954,887, -954,888,955, -889,955,888, -955,889,956, -890,956,889, -956,890,957, -891,957,890, -957,891,958, -892,958,891, -958,892,959, -893,959,892, -959,893,960, -894,960,893, -960,894,961, -895,961,894, -961,895,962, -896,962,895, -962,896,963, -897,963,896, -963,897,964, -898,964,897, -964,898,965, -899,965,898, -965,899,966, -900,966,899, -966,900,967, -901,967,900, -967,901,968, -902,968,901, -968,902,969, -903,969,902, -969,903,970, -904,970,903, -970,904,971, -905,971,904, -971,905,972, -906,972,905, -972,906,973, -907,973,906, -973,907,974, -908,974,907, -974,908,975, -909,975,908, -975,909,976, -910,976,909, -976,910,977, -911,977,910, -977,911,978, -912,978,911, -978,912,979, -913,979,912, -979,913,980, -914,980,913, -980,914,981, -915,981,914, -981,915,982, -916,982,915, -982,916,983, -917,983,916, -983,917,984, -918,984,917, -984,918,985, -919,985,918, -985,919,986, -920,986,919, -986,920,987, -921,987,920, -987,921,988, -922,988,921, -988,922,989, -923,989,922, -990,924,991, -925,991,924, -991,925,992, -926,992,925, -992,926,993, -927,993,926, -993,927,994, -928,994,927, -994,928,995, -929,995,928, -995,929,996, -930,996,929, -996,930,997, -931,997,930, -997,931,998, -932,998,931, -998,932,999, -933,999,932, -999,933,1000, -934,1000,933, -1000,934,1001, -935,1001,934, -1001,935,1002, -936,1002,935, -1002,936,1003, -937,1003,936, -1003,937,1004, -938,1004,937, -1004,938,1005, -939,1005,938, -1005,939,1006, -940,1006,939, -1006,940,1007, -941,1007,940, -1007,941,1008, -942,1008,941, -1008,942,1009, -943,1009,942, -1009,943,1010, -944,1010,943, -1010,944,1011, -945,1011,944, -1011,945,1012, -946,1012,945, -1012,946,1013, -947,1013,946, -1013,947,1014, -948,1014,947, -1014,948,1015, -949,1015,948, -1015,949,1016, -950,1016,949, -1016,950,1017, -951,1017,950, -1017,951,1018, -952,1018,951, -1018,952,1019, -953,1019,952, -1019,953,1020, -954,1020,953, -1020,954,1021, -955,1021,954, -1021,955,1022, -956,1022,955, -1022,956,1023, -957,1023,956, -1023,957,1024, -958,1024,957, -1024,958,1025, -959,1025,958, -1025,959,1026, -960,1026,959, -1026,960,1027, -961,1027,960, -1027,961,1028, -962,1028,961, -1028,962,1029, -963,1029,962, -1029,963,1030, -964,1030,963, -1030,964,1031, -965,1031,964, -1031,965,1032, -966,1032,965, -1032,966,1033, -967,1033,966, -1033,967,1034, -968,1034,967, -1034,968,1035, -969,1035,968, -1035,969,1036, -970,1036,969, -1036,970,1037, -971,1037,970, -1037,971,1038, -972,1038,971, -1038,972,1039, -973,1039,972, -1039,973,1040, -974,1040,973, -1040,974,1041, -975,1041,974, -1041,975,1042, -976,1042,975, -1042,976,1043, -977,1043,976, -1043,977,1044, -978,1044,977, -1044,978,1045, -979,1045,978, -1045,979,1046, -980,1046,979, -1046,980,1047, -981,1047,980, -1047,981,1048, -982,1048,981, -1048,982,1049, -983,1049,982, -1049,983,1050, -984,1050,983, -1050,984,1051, -985,1051,984, -1051,985,1052, -986,1052,985, -1052,986,1053, -987,1053,986, -1053,987,1054, -988,1054,987, -1054,988,1055, -989,1055,988, -1056,990,1057, -991,1057,990, -1057,991,1058, -992,1058,991, -1058,992,1059, -993,1059,992, -1059,993,1060, -994,1060,993, -1060,994,1061, -995,1061,994, -1061,995,1062, -996,1062,995, -1062,996,1063, -997,1063,996, -1063,997,1064, -998,1064,997, -1064,998,1065, -999,1065,998, -1065,999,1066, -1000,1066,999, -1066,1000,1067, -1001,1067,1000, -1067,1001,1068, -1002,1068,1001, -1068,1002,1069, -1003,1069,1002, -1069,1003,1070, -1004,1070,1003, -1070,1004,1071, -1005,1071,1004, -1071,1005,1072, -1006,1072,1005, -1072,1006,1073, -1007,1073,1006, -1073,1007,1074, -1008,1074,1007, -1074,1008,1075, -1009,1075,1008, -1075,1009,1076, -1010,1076,1009, -1076,1010,1077, -1011,1077,1010, -1077,1011,1078, -1012,1078,1011, -1078,1012,1079, -1013,1079,1012, -1079,1013,1080, -1014,1080,1013, -1080,1014,1081, -1015,1081,1014, -1081,1015,1082, -1016,1082,1015, -1082,1016,1083, -1017,1083,1016, -1083,1017,1084, -1018,1084,1017, -1084,1018,1085, -1019,1085,1018, -1085,1019,1086, -1020,1086,1019, -1086,1020,1087, -1021,1087,1020, -1087,1021,1088, -1022,1088,1021, -1088,1022,1089, -1023,1089,1022, -1089,1023,1090, -1024,1090,1023, -1090,1024,1091, -1025,1091,1024, -1091,1025,1092, -1026,1092,1025, -1092,1026,1093, -1027,1093,1026, -1093,1027,1094, -1028,1094,1027, -1094,1028,1095, -1029,1095,1028, -1095,1029,1096, -1030,1096,1029, -1096,1030,1097, -1031,1097,1030, -1097,1031,1098, -1032,1098,1031, -1098,1032,1099, -1033,1099,1032, -1099,1033,1100, -1034,1100,1033, -1100,1034,1101, -1035,1101,1034, -1101,1035,1102, -1036,1102,1035, -1102,1036,1103, -1037,1103,1036, -1103,1037,1104, -1038,1104,1037, -1104,1038,1105, -1039,1105,1038, -1105,1039,1106, -1040,1106,1039, -1106,1040,1107, -1041,1107,1040, -1107,1041,1108, -1042,1108,1041, -1108,1042,1109, -1043,1109,1042, -1109,1043,1110, -1044,1110,1043, -1110,1044,1111, -1045,1111,1044, -1111,1045,1112, -1046,1112,1045, -1112,1046,1113, -1047,1113,1046, -1113,1047,1114, -1048,1114,1047, -1114,1048,1115, -1049,1115,1048, -1115,1049,1116, -1050,1116,1049, -1116,1050,1117, -1051,1117,1050, -1117,1051,1118, -1052,1118,1051, -1118,1052,1119, -1053,1119,1052, -1119,1053,1120, -1054,1120,1053, -1120,1054,1121, -1055,1121,1054, -1122,1056,1123, -1057,1123,1056, -1123,1057,1124, -1058,1124,1057, -1124,1058,1125, -1059,1125,1058, -1125,1059,1126, -1060,1126,1059, -1126,1060,1127, -1061,1127,1060, -1127,1061,1128, -1062,1128,1061, -1128,1062,1129, -1063,1129,1062, -1129,1063,1130, -1064,1130,1063, -1130,1064,1131, -1065,1131,1064, -1131,1065,1132, -1066,1132,1065, -1132,1066,1133, -1067,1133,1066, -1133,1067,1134, -1068,1134,1067, -1134,1068,1135, -1069,1135,1068, -1135,1069,1136, -1070,1136,1069, -1136,1070,1137, -1071,1137,1070, -1137,1071,1138, -1072,1138,1071, -1138,1072,1139, -1073,1139,1072, -1139,1073,1140, -1074,1140,1073, -1140,1074,1141, -1075,1141,1074, -1141,1075,1142, -1076,1142,1075, -1142,1076,1143, -1077,1143,1076, -1143,1077,1144, -1078,1144,1077, -1144,1078,1145, -1079,1145,1078, -1145,1079,1146, -1080,1146,1079, -1146,1080,1147, -1081,1147,1080, -1147,1081,1148, -1082,1148,1081, -1148,1082,1149, -1083,1149,1082, -1149,1083,1150, -1084,1150,1083, -1150,1084,1151, -1085,1151,1084, -1151,1085,1152, -1086,1152,1085, -1152,1086,1153, -1087,1153,1086, -1153,1087,1154, -1088,1154,1087, -1154,1088,1155, -1089,1155,1088, -1155,1089,1156, -1090,1156,1089, -1156,1090,1157, -1091,1157,1090, -1157,1091,1158, -1092,1158,1091, -1158,1092,1159, -1093,1159,1092, -1159,1093,1160, -1094,1160,1093, -1160,1094,1161, -1095,1161,1094, -1161,1095,1162, -1096,1162,1095, -1162,1096,1163, -1097,1163,1096, -1163,1097,1164, -1098,1164,1097, -1164,1098,1165, -1099,1165,1098, -1165,1099,1166, -1100,1166,1099, -1166,1100,1167, -1101,1167,1100, -1167,1101,1168, -1102,1168,1101, -1168,1102,1169, -1103,1169,1102, -1169,1103,1170, -1104,1170,1103, -1170,1104,1171, -1105,1171,1104, -1171,1105,1172, -1106,1172,1105, -1172,1106,1173, -1107,1173,1106, -1173,1107,1174, -1108,1174,1107, -1174,1108,1175, -1109,1175,1108, -1175,1109,1176, -1110,1176,1109, -1176,1110,1177, -1111,1177,1110, -1177,1111,1178, -1112,1178,1111, -1178,1112,1179, -1113,1179,1112, -1179,1113,1180, -1114,1180,1113, -1180,1114,1181, -1115,1181,1114, -1181,1115,1182, -1116,1182,1115, -1182,1116,1183, -1117,1183,1116, -1183,1117,1184, -1118,1184,1117, -1184,1118,1185, -1119,1185,1118, -1185,1119,1186, -1120,1186,1119, -1186,1120,1187, -1121,1187,1120, -1188,1122,1189, -1123,1189,1122, -1189,1123,1190, -1124,1190,1123, -1190,1124,1191, -1125,1191,1124, -1191,1125,1192, -1126,1192,1125, -1192,1126,1193, -1127,1193,1126, -1193,1127,1194, -1128,1194,1127, -1194,1128,1195, -1129,1195,1128, -1195,1129,1196, -1130,1196,1129, -1196,1130,1197, -1131,1197,1130, -1197,1131,1198, -1132,1198,1131, -1198,1132,1199, -1133,1199,1132, -1199,1133,1200, -1134,1200,1133, -1200,1134,1201, -1135,1201,1134, -1201,1135,1202, -1136,1202,1135, -1202,1136,1203, -1137,1203,1136, -1203,1137,1204, -1138,1204,1137, -1204,1138,1205, -1139,1205,1138, -1205,1139,1206, -1140,1206,1139, -1206,1140,1207, -1141,1207,1140, -1207,1141,1208, -1142,1208,1141, -1208,1142,1209, -1143,1209,1142, -1209,1143,1210, -1144,1210,1143, -1210,1144,1211, -1145,1211,1144, -1211,1145,1212, -1146,1212,1145, -1212,1146,1213, -1147,1213,1146, -1213,1147,1214, -1148,1214,1147, -1214,1148,1215, -1149,1215,1148, -1215,1149,1216, -1150,1216,1149, -1216,1150,1217, -1151,1217,1150, -1217,1151,1218, -1152,1218,1151, -1218,1152,1219, -1153,1219,1152, -1219,1153,1220, -1154,1220,1153, -1220,1154,1221, -1155,1221,1154, -1221,1155,1222, -1156,1222,1155, -1222,1156,1223, -1157,1223,1156, -1223,1157,1224, -1158,1224,1157, -1224,1158,1225, -1159,1225,1158, -1225,1159,1226, -1160,1226,1159, -1226,1160,1227, -1161,1227,1160, -1227,1161,1228, -1162,1228,1161, -1228,1162,1229, -1163,1229,1162, -1229,1163,1230, -1164,1230,1163, -1230,1164,1231, -1165,1231,1164, -1231,1165,1232, -1166,1232,1165, -1232,1166,1233, -1167,1233,1166, -1233,1167,1234, -1168,1234,1167, -1234,1168,1235, -1169,1235,1168, -1235,1169,1236, -1170,1236,1169, -1236,1170,1237, -1171,1237,1170, -1237,1171,1238, -1172,1238,1171, -1238,1172,1239, -1173,1239,1172, -1239,1173,1240, -1174,1240,1173, -1240,1174,1241, -1175,1241,1174, -1241,1175,1242, -1176,1242,1175, -1242,1176,1243, -1177,1243,1176, -1243,1177,1244, -1178,1244,1177, -1244,1178,1245, -1179,1245,1178, -1245,1179,1246, -1180,1246,1179, -1246,1180,1247, -1181,1247,1180, -1247,1181,1248, -1182,1248,1181, -1248,1182,1249, -1183,1249,1182, -1249,1183,1250, -1184,1250,1183, -1250,1184,1251, -1185,1251,1184, -1251,1185,1252, -1186,1252,1185, -1252,1186,1253, -1187,1253,1186, -1254,1188,1255, -1189,1255,1188, -1255,1189,1256, -1190,1256,1189, -1256,1190,1257, -1191,1257,1190, -1257,1191,1258, -1192,1258,1191, -1258,1192,1259, -1193,1259,1192, -1259,1193,1260, -1194,1260,1193, -1260,1194,1261, -1195,1261,1194, -1261,1195,1262, -1196,1262,1195, -1262,1196,1263, -1197,1263,1196, -1263,1197,1264, -1198,1264,1197, -1264,1198,1265, -1199,1265,1198, -1265,1199,1266, -1200,1266,1199, -1266,1200,1267, -1201,1267,1200, -1267,1201,1268, -1202,1268,1201, -1268,1202,1269, -1203,1269,1202, -1269,1203,1270, -1204,1270,1203, -1270,1204,1271, -1205,1271,1204, -1271,1205,1272, -1206,1272,1205, -1272,1206,1273, -1207,1273,1206, -1273,1207,1274, -1208,1274,1207, -1274,1208,1275, -1209,1275,1208, -1275,1209,1276, -1210,1276,1209, -1276,1210,1277, -1211,1277,1210, -1277,1211,1278, -1212,1278,1211, -1278,1212,1279, -1213,1279,1212, -1279,1213,1280, -1214,1280,1213, -1280,1214,1281, -1215,1281,1214, -1281,1215,1282, -1216,1282,1215, -1282,1216,1283, -1217,1283,1216, -1283,1217,1284, -1218,1284,1217, -1284,1218,1285, -1219,1285,1218, -1285,1219,1286, -1220,1286,1219, -1286,1220,1287, -1221,1287,1220, -1287,1221,1288, -1222,1288,1221, -1288,1222,1289, -1223,1289,1222, -1289,1223,1290, -1224,1290,1223, -1290,1224,1291, -1225,1291,1224, -1291,1225,1292, -1226,1292,1225, -1292,1226,1293, -1227,1293,1226, -1293,1227,1294, -1228,1294,1227, -1294,1228,1295, -1229,1295,1228, -1295,1229,1296, -1230,1296,1229, -1296,1230,1297, -1231,1297,1230, -1297,1231,1298, -1232,1298,1231, -1298,1232,1299, -1233,1299,1232, -1299,1233,1300, -1234,1300,1233, -1300,1234,1301, -1235,1301,1234, -1301,1235,1302, -1236,1302,1235, -1302,1236,1303, -1237,1303,1236, -1303,1237,1304, -1238,1304,1237, -1304,1238,1305, -1239,1305,1238, -1305,1239,1306, -1240,1306,1239, -1306,1240,1307, -1241,1307,1240, -1307,1241,1308, -1242,1308,1241, -1308,1242,1309, -1243,1309,1242, -1309,1243,1310, -1244,1310,1243, -1310,1244,1311, -1245,1311,1244, -1311,1245,1312, -1246,1312,1245, -1312,1246,1313, -1247,1313,1246, -1313,1247,1314, -1248,1314,1247, -1314,1248,1315, -1249,1315,1248, -1315,1249,1316, -1250,1316,1249, -1316,1250,1317, -1251,1317,1250, -1317,1251,1318, -1252,1318,1251, -1318,1252,1319, -1253,1319,1252, -1320,1254,1321, -1255,1321,1254, -1321,1255,1322, -1256,1322,1255, -1322,1256,1323, -1257,1323,1256, -1323,1257,1324, -1258,1324,1257, -1324,1258,1325, -1259,1325,1258, -1325,1259,1326, -1260,1326,1259, -1326,1260,1327, -1261,1327,1260, -1327,1261,1328, -1262,1328,1261, -1328,1262,1329, -1263,1329,1262, -1329,1263,1330, -1264,1330,1263, -1330,1264,1331, -1265,1331,1264, -1331,1265,1332, -1266,1332,1265, -1332,1266,1333, -1267,1333,1266, -1333,1267,1334, -1268,1334,1267, -1334,1268,1335, -1269,1335,1268, -1335,1269,1336, -1270,1336,1269, -1336,1270,1337, -1271,1337,1270, -1337,1271,1338, -1272,1338,1271, -1338,1272,1339, -1273,1339,1272, -1339,1273,1340, -1274,1340,1273, -1340,1274,1341, -1275,1341,1274, -1341,1275,1342, -1276,1342,1275, -1342,1276,1343, -1277,1343,1276, -1343,1277,1344, -1278,1344,1277, -1344,1278,1345, -1279,1345,1278, -1345,1279,1346, -1280,1346,1279, -1346,1280,1347, -1281,1347,1280, -1347,1281,1348, -1282,1348,1281, -1348,1282,1349, -1283,1349,1282, -1349,1283,1350, -1284,1350,1283, -1350,1284,1351, -1285,1351,1284, -1351,1285,1352, -1286,1352,1285, -1352,1286,1353, -1287,1353,1286, -1353,1287,1354, -1288,1354,1287, -1354,1288,1355, -1289,1355,1288, -1355,1289,1356, -1290,1356,1289, -1356,1290,1357, -1291,1357,1290, -1357,1291,1358, -1292,1358,1291, -1358,1292,1359, -1293,1359,1292, -1359,1293,1360, -1294,1360,1293, -1360,1294,1361, -1295,1361,1294, -1361,1295,1362, -1296,1362,1295, -1362,1296,1363, -1297,1363,1296, -1363,1297,1364, -1298,1364,1297, -1364,1298,1365, -1299,1365,1298, -1365,1299,1366, -1300,1366,1299, -1366,1300,1367, -1301,1367,1300, -1367,1301,1368, -1302,1368,1301, -1368,1302,1369, -1303,1369,1302, -1369,1303,1370, -1304,1370,1303, -1370,1304,1371, -1305,1371,1304, -1371,1305,1372, -1306,1372,1305, -1372,1306,1373, -1307,1373,1306, -1373,1307,1374, -1308,1374,1307, -1374,1308,1375, -1309,1375,1308, -1375,1309,1376, -1310,1376,1309, -1376,1310,1377, -1311,1377,1310, -1377,1311,1378, -1312,1378,1311, -1378,1312,1379, -1313,1379,1312, -1379,1313,1380, -1314,1380,1313, -1380,1314,1381, -1315,1381,1314, -1381,1315,1382, -1316,1382,1315, -1382,1316,1383, -1317,1383,1316, -1383,1317,1384, -1318,1384,1317, -1384,1318,1385, -1319,1385,1318, -1386,1320,1387, -1321,1387,1320, -1387,1321,1388, -1322,1388,1321, -1388,1322,1389, -1323,1389,1322, -1389,1323,1390, -1324,1390,1323, -1390,1324,1391, -1325,1391,1324, -1391,1325,1392, -1326,1392,1325, -1392,1326,1393, -1327,1393,1326, -1393,1327,1394, -1328,1394,1327, -1394,1328,1395, -1329,1395,1328, -1395,1329,1396, -1330,1396,1329, -1396,1330,1397, -1331,1397,1330, -1397,1331,1398, -1332,1398,1331, -1398,1332,1399, -1333,1399,1332, -1399,1333,1400, -1334,1400,1333, -1400,1334,1401, -1335,1401,1334, -1401,1335,1402, -1336,1402,1335, -1402,1336,1403, -1337,1403,1336, -1403,1337,1404, -1338,1404,1337, -1404,1338,1405, -1339,1405,1338, -1405,1339,1406, -1340,1406,1339, -1406,1340,1407, -1341,1407,1340, -1407,1341,1408, -1342,1408,1341, -1408,1342,1409, -1343,1409,1342, -1409,1343,1410, -1344,1410,1343, -1410,1344,1411, -1345,1411,1344, -1411,1345,1412, -1346,1412,1345, -1412,1346,1413, -1347,1413,1346, -1413,1347,1414, -1348,1414,1347, -1414,1348,1415, -1349,1415,1348, -1415,1349,1416, -1350,1416,1349, -1416,1350,1417, -1351,1417,1350, -1417,1351,1418, -1352,1418,1351, -1418,1352,1419, -1353,1419,1352, -1419,1353,1420, -1354,1420,1353, -1420,1354,1421, -1355,1421,1354, -1421,1355,1422, -1356,1422,1355, -1422,1356,1423, -1357,1423,1356, -1423,1357,1424, -1358,1424,1357, -1424,1358,1425, -1359,1425,1358, -1425,1359,1426, -1360,1426,1359, -1426,1360,1427, -1361,1427,1360, -1427,1361,1428, -1362,1428,1361, -1428,1362,1429, -1363,1429,1362, -1429,1363,1430, -1364,1430,1363, -1430,1364,1431, -1365,1431,1364, -1431,1365,1432, -1366,1432,1365, -1432,1366,1433, -1367,1433,1366, -1433,1367,1434, -1368,1434,1367, -1434,1368,1435, -1369,1435,1368, -1435,1369,1436, -1370,1436,1369, -1436,1370,1437, -1371,1437,1370, -1437,1371,1438, -1372,1438,1371, -1438,1372,1439, -1373,1439,1372, -1439,1373,1440, -1374,1440,1373, -1440,1374,1441, -1375,1441,1374, -1441,1375,1442, -1376,1442,1375, -1442,1376,1443, -1377,1443,1376, -1443,1377,1444, -1378,1444,1377, -1444,1378,1445, -1379,1445,1378, -1445,1379,1446, -1380,1446,1379, -1446,1380,1447, -1381,1447,1380, -1447,1381,1448, -1382,1448,1381, -1448,1382,1449, -1383,1449,1382, -1449,1383,1450, -1384,1450,1383, -1450,1384,1451, -1385,1451,1384, -1452,1386,1453, -1387,1453,1386, -1453,1387,1454, -1388,1454,1387, -1454,1388,1455, -1389,1455,1388, -1455,1389,1456, -1390,1456,1389, -1456,1390,1457, -1391,1457,1390, -1457,1391,1458, -1392,1458,1391, -1458,1392,1459, -1393,1459,1392, -1459,1393,1460, -1394,1460,1393, -1460,1394,1461, -1395,1461,1394, -1461,1395,1462, -1396,1462,1395, -1462,1396,1463, -1397,1463,1396, -1463,1397,1464, -1398,1464,1397, -1464,1398,1465, -1399,1465,1398, -1465,1399,1466, -1400,1466,1399, -1466,1400,1467, -1401,1467,1400, -1467,1401,1468, -1402,1468,1401, -1468,1402,1469, -1403,1469,1402, -1469,1403,1470, -1404,1470,1403, -1470,1404,1471, -1405,1471,1404, -1471,1405,1472, -1406,1472,1405, -1472,1406,1473, -1407,1473,1406, -1473,1407,1474, -1408,1474,1407, -1474,1408,1475, -1409,1475,1408, -1475,1409,1476, -1410,1476,1409, -1476,1410,1477, -1411,1477,1410, -1477,1411,1478, -1412,1478,1411, -1478,1412,1479, -1413,1479,1412, -1479,1413,1480, -1414,1480,1413, -1480,1414,1481, -1415,1481,1414, -1481,1415,1482, -1416,1482,1415, -1482,1416,1483, -1417,1483,1416, -1483,1417,1484, -1418,1484,1417, -1484,1418,1485, -1419,1485,1418, -1485,1419,1486, -1420,1486,1419, -1486,1420,1487, -1421,1487,1420, -1487,1421,1488, -1422,1488,1421, -1488,1422,1489, -1423,1489,1422, -1489,1423,1490, -1424,1490,1423, -1490,1424,1491, -1425,1491,1424, -1491,1425,1492, -1426,1492,1425, -1492,1426,1493, -1427,1493,1426, -1493,1427,1494, -1428,1494,1427, -1494,1428,1495, -1429,1495,1428, -1495,1429,1496, -1430,1496,1429, -1496,1430,1497, -1431,1497,1430, -1497,1431,1498, -1432,1498,1431, -1498,1432,1499, -1433,1499,1432, -1499,1433,1500, -1434,1500,1433, -1500,1434,1501, -1435,1501,1434, -1501,1435,1502, -1436,1502,1435, -1502,1436,1503, -1437,1503,1436, -1503,1437,1504, -1438,1504,1437, -1504,1438,1505, -1439,1505,1438, -1505,1439,1506, -1440,1506,1439, -1506,1440,1507, -1441,1507,1440, -1507,1441,1508, -1442,1508,1441, -1508,1442,1509, -1443,1509,1442, -1509,1443,1510, -1444,1510,1443, -1510,1444,1511, -1445,1511,1444, -1511,1445,1512, -1446,1512,1445, -1512,1446,1513, -1447,1513,1446, -1513,1447,1514, -1448,1514,1447, -1514,1448,1515, -1449,1515,1448, -1515,1449,1516, -1450,1516,1449, -1516,1450,1517, -1451,1517,1450, -1518,1452,1519, -1453,1519,1452, -1519,1453,1520, -1454,1520,1453, -1520,1454,1521, -1455,1521,1454, -1521,1455,1522, -1456,1522,1455, -1522,1456,1523, -1457,1523,1456, -1523,1457,1524, -1458,1524,1457, -1524,1458,1525, -1459,1525,1458, -1525,1459,1526, -1460,1526,1459, -1526,1460,1527, -1461,1527,1460, -1527,1461,1528, -1462,1528,1461, -1528,1462,1529, -1463,1529,1462, -1529,1463,1530, -1464,1530,1463, -1530,1464,1531, -1465,1531,1464, -1531,1465,1532, -1466,1532,1465, -1532,1466,1533, -1467,1533,1466, -1533,1467,1534, -1468,1534,1467, -1534,1468,1535, -1469,1535,1468, -1535,1469,1536, -1470,1536,1469, -1536,1470,1537, -1471,1537,1470, -1537,1471,1538, -1472,1538,1471, -1538,1472,1539, -1473,1539,1472, -1539,1473,1540, -1474,1540,1473, -1540,1474,1541, -1475,1541,1474, -1541,1475,1542, -1476,1542,1475, -1542,1476,1543, -1477,1543,1476, -1543,1477,1544, -1478,1544,1477, -1544,1478,1545, -1479,1545,1478, -1545,1479,1546, -1480,1546,1479, -1546,1480,1547, -1481,1547,1480, -1547,1481,1548, -1482,1548,1481, -1548,1482,1549, -1483,1549,1482, -1549,1483,1550, -1484,1550,1483, -1550,1484,1551, -1485,1551,1484, -1551,1485,1552, -1486,1552,1485, -1552,1486,1553, -1487,1553,1486, -1553,1487,1554, -1488,1554,1487, -1554,1488,1555, -1489,1555,1488, -1555,1489,1556, -1490,1556,1489, -1556,1490,1557, -1491,1557,1490, -1557,1491,1558, -1492,1558,1491, -1558,1492,1559, -1493,1559,1492, -1559,1493,1560, -1494,1560,1493, -1560,1494,1561, -1495,1561,1494, -1561,1495,1562, -1496,1562,1495, -1562,1496,1563, -1497,1563,1496, -1563,1497,1564, -1498,1564,1497, -1564,1498,1565, -1499,1565,1498, -1565,1499,1566, -1500,1566,1499, -1566,1500,1567, -1501,1567,1500, -1567,1501,1568, -1502,1568,1501, -1568,1502,1569, -1503,1569,1502, -1569,1503,1570, -1504,1570,1503, -1570,1504,1571, -1505,1571,1504, -1571,1505,1572, -1506,1572,1505, -1572,1506,1573, -1507,1573,1506, -1573,1507,1574, -1508,1574,1507, -1574,1508,1575, -1509,1575,1508, -1575,1509,1576, -1510,1576,1509, -1576,1510,1577, -1511,1577,1510, -1577,1511,1578, -1512,1578,1511, -1578,1512,1579, -1513,1579,1512, -1579,1513,1580, -1514,1580,1513, -1580,1514,1581, -1515,1581,1514, -1581,1515,1582, -1516,1582,1515, -1582,1516,1583, -1517,1583,1516, -1584,1518,1585, -1519,1585,1518, -1585,1519,1586, -1520,1586,1519, -1586,1520,1587, -1521,1587,1520, -1587,1521,1588, -1522,1588,1521, -1588,1522,1589, -1523,1589,1522, -1589,1523,1590, -1524,1590,1523, -1590,1524,1591, -1525,1591,1524, -1591,1525,1592, -1526,1592,1525, -1592,1526,1593, -1527,1593,1526, -1593,1527,1594, -1528,1594,1527, -1594,1528,1595, -1529,1595,1528, -1595,1529,1596, -1530,1596,1529, -1596,1530,1597, -1531,1597,1530, -1597,1531,1598, -1532,1598,1531, -1598,1532,1599, -1533,1599,1532, -1599,1533,1600, -1534,1600,1533, -1600,1534,1601, -1535,1601,1534, -1601,1535,1602, -1536,1602,1535, -1602,1536,1603, -1537,1603,1536, -1603,1537,1604, -1538,1604,1537, -1604,1538,1605, -1539,1605,1538, -1605,1539,1606, -1540,1606,1539, -1606,1540,1607, -1541,1607,1540, -1607,1541,1608, -1542,1608,1541, -1608,1542,1609, -1543,1609,1542, -1609,1543,1610, -1544,1610,1543, -1610,1544,1611, -1545,1611,1544, -1611,1545,1612, -1546,1612,1545, -1612,1546,1613, -1547,1613,1546, -1613,1547,1614, -1548,1614,1547, -1614,1548,1615, -1549,1615,1548, -1615,1549,1616, -1550,1616,1549, -1616,1550,1617, -1551,1617,1550, -1617,1551,1618, -1552,1618,1551, -1618,1552,1619, -1553,1619,1552, -1619,1553,1620, -1554,1620,1553, -1620,1554,1621, -1555,1621,1554, -1621,1555,1622, -1556,1622,1555, -1622,1556,1623, -1557,1623,1556, -1623,1557,1624, -1558,1624,1557, -1624,1558,1625, -1559,1625,1558, -1625,1559,1626, -1560,1626,1559, -1626,1560,1627, -1561,1627,1560, -1627,1561,1628, -1562,1628,1561, -1628,1562,1629, -1563,1629,1562, -1629,1563,1630, -1564,1630,1563, -1630,1564,1631, -1565,1631,1564, -1631,1565,1632, -1566,1632,1565, -1632,1566,1633, -1567,1633,1566, -1633,1567,1634, -1568,1634,1567, -1634,1568,1635, -1569,1635,1568, -1635,1569,1636, -1570,1636,1569, -1636,1570,1637, -1571,1637,1570, -1637,1571,1638, -1572,1638,1571, -1638,1572,1639, -1573,1639,1572, -1639,1573,1640, -1574,1640,1573, -1640,1574,1641, -1575,1641,1574, -1641,1575,1642, -1576,1642,1575, -1642,1576,1643, -1577,1643,1576, -1643,1577,1644, -1578,1644,1577, -1644,1578,1645, -1579,1645,1578, -1645,1579,1646, -1580,1646,1579, -1646,1580,1647, -1581,1647,1580, -1647,1581,1648, -1582,1648,1581, -1648,1582,1649, -1583,1649,1582, -1650,1584,1651, -1585,1651,1584, -1651,1585,1652, -1586,1652,1585, -1652,1586,1653, -1587,1653,1586, -1653,1587,1654, -1588,1654,1587, -1654,1588,1655, -1589,1655,1588, -1655,1589,1656, -1590,1656,1589, -1656,1590,1657, -1591,1657,1590, -1657,1591,1658, -1592,1658,1591, -1658,1592,1659, -1593,1659,1592, -1659,1593,1660, -1594,1660,1593, -1660,1594,1661, -1595,1661,1594, -1661,1595,1662, -1596,1662,1595, -1662,1596,1663, -1597,1663,1596, -1663,1597,1664, -1598,1664,1597, -1664,1598,1665, -1599,1665,1598, -1665,1599,1666, -1600,1666,1599, -1666,1600,1667, -1601,1667,1600, -1667,1601,1668, -1602,1668,1601, -1668,1602,1669, -1603,1669,1602, -1669,1603,1670, -1604,1670,1603, -1670,1604,1671, -1605,1671,1604, -1671,1605,1672, -1606,1672,1605, -1672,1606,1673, -1607,1673,1606, -1673,1607,1674, -1608,1674,1607, -1674,1608,1675, -1609,1675,1608, -1675,1609,1676, -1610,1676,1609, -1676,1610,1677, -1611,1677,1610, -1677,1611,1678, -1612,1678,1611, -1678,1612,1679, -1613,1679,1612, -1679,1613,1680, -1614,1680,1613, -1680,1614,1681, -1615,1681,1614, -1681,1615,1682, -1616,1682,1615, -1682,1616,1683, -1617,1683,1616, -1683,1617,1684, -1618,1684,1617, -1684,1618,1685, -1619,1685,1618, -1685,1619,1686, -1620,1686,1619, -1686,1620,1687, -1621,1687,1620, -1687,1621,1688, -1622,1688,1621, -1688,1622,1689, -1623,1689,1622, -1689,1623,1690, -1624,1690,1623, -1690,1624,1691, -1625,1691,1624, -1691,1625,1692, -1626,1692,1625, -1692,1626,1693, -1627,1693,1626, -1693,1627,1694, -1628,1694,1627, -1694,1628,1695, -1629,1695,1628, -1695,1629,1696, -1630,1696,1629, -1696,1630,1697, -1631,1697,1630, -1697,1631,1698, -1632,1698,1631, -1698,1632,1699, -1633,1699,1632, -1699,1633,1700, -1634,1700,1633, -1700,1634,1701, -1635,1701,1634, -1701,1635,1702, -1636,1702,1635, -1702,1636,1703, -1637,1703,1636, -1703,1637,1704, -1638,1704,1637, -1704,1638,1705, -1639,1705,1638, -1705,1639,1706, -1640,1706,1639, -1706,1640,1707, -1641,1707,1640, -1707,1641,1708, -1642,1708,1641, -1708,1642,1709, -1643,1709,1642, -1709,1643,1710, -1644,1710,1643, -1710,1644,1711, -1645,1711,1644, -1711,1645,1712, -1646,1712,1645, -1712,1646,1713, -1647,1713,1646, -1713,1647,1714, -1648,1714,1647, -1714,1648,1715, -1649,1715,1648, -1716,1650,1717, -1651,1717,1650, -1717,1651,1718, -1652,1718,1651, -1718,1652,1719, -1653,1719,1652, -1719,1653,1720, -1654,1720,1653, -1720,1654,1721, -1655,1721,1654, -1721,1655,1722, -1656,1722,1655, -1722,1656,1723, -1657,1723,1656, -1723,1657,1724, -1658,1724,1657, -1724,1658,1725, -1659,1725,1658, -1725,1659,1726, -1660,1726,1659, -1726,1660,1727, -1661,1727,1660, -1727,1661,1728, -1662,1728,1661, -1728,1662,1729, -1663,1729,1662, -1729,1663,1730, -1664,1730,1663, -1730,1664,1731, -1665,1731,1664, -1731,1665,1732, -1666,1732,1665, -1732,1666,1733, -1667,1733,1666, -1733,1667,1734, -1668,1734,1667, -1734,1668,1735, -1669,1735,1668, -1735,1669,1736, -1670,1736,1669, -1736,1670,1737, -1671,1737,1670, -1737,1671,1738, -1672,1738,1671, -1738,1672,1739, -1673,1739,1672, -1739,1673,1740, -1674,1740,1673, -1740,1674,1741, -1675,1741,1674, -1741,1675,1742, -1676,1742,1675, -1742,1676,1743, -1677,1743,1676, -1743,1677,1744, -1678,1744,1677, -1744,1678,1745, -1679,1745,1678, -1745,1679,1746, -1680,1746,1679, -1746,1680,1747, -1681,1747,1680, -1747,1681,1748, -1682,1748,1681, -1748,1682,1749, -1683,1749,1682, -1749,1683,1750, -1684,1750,1683, -1750,1684,1751, -1685,1751,1684, -1751,1685,1752, -1686,1752,1685, -1752,1686,1753, -1687,1753,1686, -1753,1687,1754, -1688,1754,1687, -1754,1688,1755, -1689,1755,1688, -1755,1689,1756, -1690,1756,1689, -1756,1690,1757, -1691,1757,1690, -1757,1691,1758, -1692,1758,1691, -1758,1692,1759, -1693,1759,1692, -1759,1693,1760, -1694,1760,1693, -1760,1694,1761, -1695,1761,1694, -1761,1695,1762, -1696,1762,1695, -1762,1696,1763, -1697,1763,1696, -1763,1697,1764, -1698,1764,1697, -1764,1698,1765, -1699,1765,1698, -1765,1699,1766, -1700,1766,1699, -1766,1700,1767, -1701,1767,1700, -1767,1701,1768, -1702,1768,1701, -1768,1702,1769, -1703,1769,1702, -1769,1703,1770, -1704,1770,1703, -1770,1704,1771, -1705,1771,1704, -1771,1705,1772, -1706,1772,1705, -1772,1706,1773, -1707,1773,1706, -1773,1707,1774, -1708,1774,1707, -1774,1708,1775, -1709,1775,1708, -1775,1709,1776, -1710,1776,1709, -1776,1710,1777, -1711,1777,1710, -1777,1711,1778, -1712,1778,1711, -1778,1712,1779, -1713,1779,1712, -1779,1713,1780, -1714,1780,1713, -1780,1714,1781, -1715,1781,1714, -1782,1716,1783, -1717,1783,1716, -1783,1717,1784, -1718,1784,1717, -1784,1718,1785, -1719,1785,1718, -1785,1719,1786, -1720,1786,1719, -1786,1720,1787, -1721,1787,1720, -1787,1721,1788, -1722,1788,1721, -1788,1722,1789, -1723,1789,1722, -1789,1723,1790, -1724,1790,1723, -1790,1724,1791, -1725,1791,1724, -1791,1725,1792, -1726,1792,1725, -1792,1726,1793, -1727,1793,1726, -1793,1727,1794, -1728,1794,1727, -1794,1728,1795, -1729,1795,1728, -1795,1729,1796, -1730,1796,1729, -1796,1730,1797, -1731,1797,1730, -1797,1731,1798, -1732,1798,1731, -1798,1732,1799, -1733,1799,1732, -1799,1733,1800, -1734,1800,1733, -1800,1734,1801, -1735,1801,1734, -1801,1735,1802, -1736,1802,1735, -1802,1736,1803, -1737,1803,1736, -1803,1737,1804, -1738,1804,1737, -1804,1738,1805, -1739,1805,1738, -1805,1739,1806, -1740,1806,1739, -1806,1740,1807, -1741,1807,1740, -1807,1741,1808, -1742,1808,1741, -1808,1742,1809, -1743,1809,1742, -1809,1743,1810, -1744,1810,1743, -1810,1744,1811, -1745,1811,1744, -1811,1745,1812, -1746,1812,1745, -1812,1746,1813, -1747,1813,1746, -1813,1747,1814, -1748,1814,1747, -1814,1748,1815, -1749,1815,1748, -1815,1749,1816, -1750,1816,1749, -1816,1750,1817, -1751,1817,1750, -1817,1751,1818, -1752,1818,1751, -1818,1752,1819, -1753,1819,1752, -1819,1753,1820, -1754,1820,1753, -1820,1754,1821, -1755,1821,1754, -1821,1755,1822, -1756,1822,1755, -1822,1756,1823, -1757,1823,1756, -1823,1757,1824, -1758,1824,1757, -1824,1758,1825, -1759,1825,1758, -1825,1759,1826, -1760,1826,1759, -1826,1760,1827, -1761,1827,1760, -1827,1761,1828, -1762,1828,1761, -1828,1762,1829, -1763,1829,1762, -1829,1763,1830, -1764,1830,1763, -1830,1764,1831, -1765,1831,1764, -1831,1765,1832, -1766,1832,1765, -1832,1766,1833, -1767,1833,1766, -1833,1767,1834, -1768,1834,1767, -1834,1768,1835, -1769,1835,1768, -1835,1769,1836, -1770,1836,1769, -1836,1770,1837, -1771,1837,1770, -1837,1771,1838, -1772,1838,1771, -1838,1772,1839, -1773,1839,1772, -1839,1773,1840, -1774,1840,1773, -1840,1774,1841, -1775,1841,1774, -1841,1775,1842, -1776,1842,1775, -1842,1776,1843, -1777,1843,1776, -1843,1777,1844, -1778,1844,1777, -1844,1778,1845, -1779,1845,1778, -1845,1779,1846, -1780,1846,1779, -1846,1780,1847, -1781,1847,1780, -1848,1782,1849, -1783,1849,1782, -1849,1783,1850, -1784,1850,1783, -1850,1784,1851, -1785,1851,1784, -1851,1785,1852, -1786,1852,1785, -1852,1786,1853, -1787,1853,1786, -1853,1787,1854, -1788,1854,1787, -1854,1788,1855, -1789,1855,1788, -1855,1789,1856, -1790,1856,1789, -1856,1790,1857, -1791,1857,1790, -1857,1791,1858, -1792,1858,1791, -1858,1792,1859, -1793,1859,1792, -1859,1793,1860, -1794,1860,1793, -1860,1794,1861, -1795,1861,1794, -1861,1795,1862, -1796,1862,1795, -1862,1796,1863, -1797,1863,1796, -1863,1797,1864, -1798,1864,1797, -1864,1798,1865, -1799,1865,1798, -1865,1799,1866, -1800,1866,1799, -1866,1800,1867, -1801,1867,1800, -1867,1801,1868, -1802,1868,1801, -1868,1802,1869, -1803,1869,1802, -1869,1803,1870, -1804,1870,1803, -1870,1804,1871, -1805,1871,1804, -1871,1805,1872, -1806,1872,1805, -1872,1806,1873, -1807,1873,1806, -1873,1807,1874, -1808,1874,1807, -1874,1808,1875, -1809,1875,1808, -1875,1809,1876, -1810,1876,1809, -1876,1810,1877, -1811,1877,1810, -1877,1811,1878, -1812,1878,1811, -1878,1812,1879, -1813,1879,1812, -1879,1813,1880, -1814,1880,1813, -1880,1814,1881, -1815,1881,1814, -1881,1815,1882, -1816,1882,1815, -1882,1816,1883, -1817,1883,1816, -1883,1817,1884, -1818,1884,1817, -1884,1818,1885, -1819,1885,1818, -1885,1819,1886, -1820,1886,1819, -1886,1820,1887, -1821,1887,1820, -1887,1821,1888, -1822,1888,1821, -1888,1822,1889, -1823,1889,1822, -1889,1823,1890, -1824,1890,1823, -1890,1824,1891, -1825,1891,1824, -1891,1825,1892, -1826,1892,1825, -1892,1826,1893, -1827,1893,1826, -1893,1827,1894, -1828,1894,1827, -1894,1828,1895, -1829,1895,1828, -1895,1829,1896, -1830,1896,1829, -1896,1830,1897, -1831,1897,1830, -1897,1831,1898, -1832,1898,1831, -1898,1832,1899, -1833,1899,1832, -1899,1833,1900, -1834,1900,1833, -1900,1834,1901, -1835,1901,1834, -1901,1835,1902, -1836,1902,1835, -1902,1836,1903, -1837,1903,1836, -1903,1837,1904, -1838,1904,1837, -1904,1838,1905, -1839,1905,1838, -1905,1839,1906, -1840,1906,1839, -1906,1840,1907, -1841,1907,1840, -1907,1841,1908, -1842,1908,1841, -1908,1842,1909, -1843,1909,1842, -1909,1843,1910, -1844,1910,1843, -1910,1844,1911, -1845,1911,1844, -1911,1845,1912, -1846,1912,1845, -1912,1846,1913, -1847,1913,1846, -1914,1848,1915, -1849,1915,1848, -1915,1849,1916, -1850,1916,1849, -1916,1850,1917, -1851,1917,1850, -1917,1851,1918, -1852,1918,1851, -1918,1852,1919, -1853,1919,1852, -1919,1853,1920, -1854,1920,1853, -1920,1854,1921, -1855,1921,1854, -1921,1855,1922, -1856,1922,1855, -1922,1856,1923, -1857,1923,1856, -1923,1857,1924, -1858,1924,1857, -1924,1858,1925, -1859,1925,1858, -1925,1859,1926, -1860,1926,1859, -1926,1860,1927, -1861,1927,1860, -1927,1861,1928, -1862,1928,1861, -1928,1862,1929, -1863,1929,1862, -1929,1863,1930, -1864,1930,1863, -1930,1864,1931, -1865,1931,1864, -1931,1865,1932, -1866,1932,1865, -1932,1866,1933, -1867,1933,1866, -1933,1867,1934, -1868,1934,1867, -1934,1868,1935, -1869,1935,1868, -1935,1869,1936, -1870,1936,1869, -1936,1870,1937, -1871,1937,1870, -1937,1871,1938, -1872,1938,1871, -1938,1872,1939, -1873,1939,1872, -1939,1873,1940, -1874,1940,1873, -1940,1874,1941, -1875,1941,1874, -1941,1875,1942, -1876,1942,1875, -1942,1876,1943, -1877,1943,1876, -1943,1877,1944, -1878,1944,1877, -1944,1878,1945, -1879,1945,1878, -1945,1879,1946, -1880,1946,1879, -1946,1880,1947, -1881,1947,1880, -1947,1881,1948, -1882,1948,1881, -1948,1882,1949, -1883,1949,1882, -1949,1883,1950, -1884,1950,1883, -1950,1884,1951, -1885,1951,1884, -1951,1885,1952, -1886,1952,1885, -1952,1886,1953, -1887,1953,1886, -1953,1887,1954, -1888,1954,1887, -1954,1888,1955, -1889,1955,1888, -1955,1889,1956, -1890,1956,1889, -1956,1890,1957, -1891,1957,1890, -1957,1891,1958, -1892,1958,1891, -1958,1892,1959, -1893,1959,1892, -1959,1893,1960, -1894,1960,1893, -1960,1894,1961, -1895,1961,1894, -1961,1895,1962, -1896,1962,1895, -1962,1896,1963, -1897,1963,1896, -1963,1897,1964, -1898,1964,1897, -1964,1898,1965, -1899,1965,1898, -1965,1899,1966, -1900,1966,1899, -1966,1900,1967, -1901,1967,1900, -1967,1901,1968, -1902,1968,1901, -1968,1902,1969, -1903,1969,1902, -1969,1903,1970, -1904,1970,1903, -1970,1904,1971, -1905,1971,1904, -1971,1905,1972, -1906,1972,1905, -1972,1906,1973, -1907,1973,1906, -1973,1907,1974, -1908,1974,1907, -1974,1908,1975, -1909,1975,1908, -1975,1909,1976, -1910,1976,1909, -1976,1910,1977, -1911,1977,1910, -1977,1911,1978, -1912,1978,1911, -1978,1912,1979, -1913,1979,1912, -1980,1914,1981, -1915,1981,1914, -1981,1915,1982, -1916,1982,1915, -1982,1916,1983, -1917,1983,1916, -1983,1917,1984, -1918,1984,1917, -1984,1918,1985, -1919,1985,1918, -1985,1919,1986, -1920,1986,1919, -1986,1920,1987, -1921,1987,1920, -1987,1921,1988, -1922,1988,1921, -1988,1922,1989, -1923,1989,1922, -1989,1923,1990, -1924,1990,1923, -1990,1924,1991, -1925,1991,1924, -1991,1925,1992, -1926,1992,1925, -1992,1926,1993, -1927,1993,1926, -1993,1927,1994, -1928,1994,1927, -1994,1928,1995, -1929,1995,1928, -1995,1929,1996, -1930,1996,1929, -1996,1930,1997, -1931,1997,1930, -1997,1931,1998, -1932,1998,1931, -1998,1932,1999, -1933,1999,1932, -1999,1933,2000, -1934,2000,1933, -2000,1934,2001, -1935,2001,1934, -2001,1935,2002, -1936,2002,1935, -2002,1936,2003, -1937,2003,1936, -2003,1937,2004, -1938,2004,1937, -2004,1938,2005, -1939,2005,1938, -2005,1939,2006, -1940,2006,1939, -2006,1940,2007, -1941,2007,1940, -2007,1941,2008, -1942,2008,1941, -2008,1942,2009, -1943,2009,1942, -2009,1943,2010, -1944,2010,1943, -2010,1944,2011, -1945,2011,1944, -2011,1945,2012, -1946,2012,1945, -2012,1946,2013, -1947,2013,1946, -2013,1947,2014, -1948,2014,1947, -2014,1948,2015, -1949,2015,1948, -2015,1949,2016, -1950,2016,1949, -2016,1950,2017, -1951,2017,1950, -2017,1951,2018, -1952,2018,1951, -2018,1952,2019, -1953,2019,1952, -2019,1953,2020, -1954,2020,1953, -2020,1954,2021, -1955,2021,1954, -2021,1955,2022, -1956,2022,1955, -2022,1956,2023, -1957,2023,1956, -2023,1957,2024, -1958,2024,1957, -2024,1958,2025, -1959,2025,1958, -2025,1959,2026, -1960,2026,1959, -2026,1960,2027, -1961,2027,1960, -2027,1961,2028, -1962,2028,1961, -2028,1962,2029, -1963,2029,1962, -2029,1963,2030, -1964,2030,1963, -2030,1964,2031, -1965,2031,1964, -2031,1965,2032, -1966,2032,1965, -2032,1966,2033, -1967,2033,1966, -2033,1967,2034, -1968,2034,1967, -2034,1968,2035, -1969,2035,1968, -2035,1969,2036, -1970,2036,1969, -2036,1970,2037, -1971,2037,1970, -2037,1971,2038, -1972,2038,1971, -2038,1972,2039, -1973,2039,1972, -2039,1973,2040, -1974,2040,1973, -2040,1974,2041, -1975,2041,1974, -2041,1975,2042, -1976,2042,1975, -2042,1976,2043, -1977,2043,1976, -2043,1977,2044, -1978,2044,1977, -2044,1978,2045, -1979,2045,1978, -2046,1980,2047, -1981,2047,1980, -2047,1981,2048, -1982,2048,1981, -2048,1982,2049, -1983,2049,1982, -2049,1983,2050, -1984,2050,1983, -2050,1984,2051, -1985,2051,1984, -2051,1985,2052, -1986,2052,1985, -2052,1986,2053, -1987,2053,1986, -2053,1987,2054, -1988,2054,1987, -2054,1988,2055, -1989,2055,1988, -2055,1989,2056, -1990,2056,1989, -2056,1990,2057, -1991,2057,1990, -2057,1991,2058, -1992,2058,1991, -2058,1992,2059, -1993,2059,1992, -2059,1993,2060, -1994,2060,1993, -2060,1994,2061, -1995,2061,1994, -2061,1995,2062, -1996,2062,1995, -2062,1996,2063, -1997,2063,1996, -2063,1997,2064, -1998,2064,1997, -2064,1998,2065, -1999,2065,1998, -2065,1999,2066, -2000,2066,1999, -2066,2000,2067, -2001,2067,2000, -2067,2001,2068, -2002,2068,2001, -2068,2002,2069, -2003,2069,2002, -2069,2003,2070, -2004,2070,2003, -2070,2004,2071, -2005,2071,2004, -2071,2005,2072, -2006,2072,2005, -2072,2006,2073, -2007,2073,2006, -2073,2007,2074, -2008,2074,2007, -2074,2008,2075, -2009,2075,2008, -2075,2009,2076, -2010,2076,2009, -2076,2010,2077, -2011,2077,2010, -2077,2011,2078, -2012,2078,2011, -2078,2012,2079, -2013,2079,2012, -2079,2013,2080, -2014,2080,2013, -2080,2014,2081, -2015,2081,2014, -2081,2015,2082, -2016,2082,2015, -2082,2016,2083, -2017,2083,2016, -2083,2017,2084, -2018,2084,2017, -2084,2018,2085, -2019,2085,2018, -2085,2019,2086, -2020,2086,2019, -2086,2020,2087, -2021,2087,2020, -2087,2021,2088, -2022,2088,2021, -2088,2022,2089, -2023,2089,2022, -2089,2023,2090, -2024,2090,2023, -2090,2024,2091, -2025,2091,2024, -2091,2025,2092, -2026,2092,2025, -2092,2026,2093, -2027,2093,2026, -2093,2027,2094, -2028,2094,2027, -2094,2028,2095, -2029,2095,2028, -2095,2029,2096, -2030,2096,2029, -2096,2030,2097, -2031,2097,2030, -2097,2031,2098, -2032,2098,2031, -2098,2032,2099, -2033,2099,2032, -2099,2033,2100, -2034,2100,2033, -2100,2034,2101, -2035,2101,2034, -2101,2035,2102, -2036,2102,2035, -2102,2036,2103, -2037,2103,2036, -2103,2037,2104, -2038,2104,2037, -2104,2038,2105, -2039,2105,2038, -2105,2039,2106, -2040,2106,2039, -2106,2040,2107, -2041,2107,2040, -2107,2041,2108, -2042,2108,2041, -2108,2042,2109, -2043,2109,2042, -2109,2043,2110, -2044,2110,2043, -2110,2044,2111, -2045,2111,2044, -2112,2046,2113, -2047,2113,2046, -2113,2047,2114, -2048,2114,2047, -2114,2048,2115, -2049,2115,2048, -2115,2049,2116, -2050,2116,2049, -2116,2050,2117, -2051,2117,2050, -2117,2051,2118, -2052,2118,2051, -2118,2052,2119, -2053,2119,2052, -2119,2053,2120, -2054,2120,2053, -2120,2054,2121, -2055,2121,2054, -2121,2055,2122, -2056,2122,2055, -2122,2056,2123, -2057,2123,2056, -2123,2057,2124, -2058,2124,2057, -2124,2058,2125, -2059,2125,2058, -2125,2059,2126, -2060,2126,2059, -2126,2060,2127, -2061,2127,2060, -2127,2061,2128, -2062,2128,2061, -2128,2062,2129, -2063,2129,2062, -2129,2063,2130, -2064,2130,2063, -2130,2064,2131, -2065,2131,2064, -2131,2065,2132, -2066,2132,2065, -2132,2066,2133, -2067,2133,2066, -2133,2067,2134, -2068,2134,2067, -2134,2068,2135, -2069,2135,2068, -2135,2069,2136, -2070,2136,2069, -2136,2070,2137, -2071,2137,2070, -2137,2071,2138, -2072,2138,2071, -2138,2072,2139, -2073,2139,2072, -2139,2073,2140, -2074,2140,2073, -2140,2074,2141, -2075,2141,2074, -2141,2075,2142, -2076,2142,2075, -2142,2076,2143, -2077,2143,2076, -2143,2077,2144, -2078,2144,2077, -2144,2078,2145, -2079,2145,2078, -2145,2079,2146, -2080,2146,2079, -2146,2080,2147, -2081,2147,2080, -2147,2081,2148, -2082,2148,2081, -2148,2082,2149, -2083,2149,2082, -2149,2083,2150, -2084,2150,2083, -2150,2084,2151, -2085,2151,2084, -2151,2085,2152, -2086,2152,2085, -2152,2086,2153, -2087,2153,2086, -2153,2087,2154, -2088,2154,2087, -2154,2088,2155, -2089,2155,2088, -2155,2089,2156, -2090,2156,2089, -2156,2090,2157, -2091,2157,2090, -2157,2091,2158, -2092,2158,2091, -2158,2092,2159, -2093,2159,2092, -2159,2093,2160, -2094,2160,2093, -2160,2094,2161, -2095,2161,2094, -2161,2095,2162, -2096,2162,2095, -2162,2096,2163, -2097,2163,2096, -2163,2097,2164, -2098,2164,2097, -2164,2098,2165, -2099,2165,2098, -2165,2099,2166, -2100,2166,2099, -2166,2100,2167, -2101,2167,2100, -2167,2101,2168, -2102,2168,2101, -2168,2102,2169, -2103,2169,2102, -2169,2103,2170, -2104,2170,2103, -2170,2104,2171, -2105,2171,2104, -2171,2105,2172, -2106,2172,2105, -2172,2106,2173, -2107,2173,2106, -2173,2107,2174, -2108,2174,2107, -2174,2108,2175, -2109,2175,2108, -2175,2109,2176, -2110,2176,2109, -2176,2110,2177, -2111,2177,2110, -2178,2112,2179, -2113,2179,2112, -2179,2113,2180, -2114,2180,2113, -2180,2114,2181, -2115,2181,2114, -2181,2115,2182, -2116,2182,2115, -2182,2116,2183, -2117,2183,2116, -2183,2117,2184, -2118,2184,2117, -2184,2118,2185, -2119,2185,2118, -2185,2119,2186, -2120,2186,2119, -2186,2120,2187, -2121,2187,2120, -2187,2121,2188, -2122,2188,2121, -2188,2122,2189, -2123,2189,2122, -2189,2123,2190, -2124,2190,2123, -2190,2124,2191, -2125,2191,2124, -2191,2125,2192, -2126,2192,2125, -2192,2126,2193, -2127,2193,2126, -2193,2127,2194, -2128,2194,2127, -2194,2128,2195, -2129,2195,2128, -2195,2129,2196, -2130,2196,2129, -2196,2130,2197, -2131,2197,2130, -2197,2131,2198, -2132,2198,2131, -2198,2132,2199, -2133,2199,2132, -2199,2133,2200, -2134,2200,2133, -2200,2134,2201, -2135,2201,2134, -2201,2135,2202, -2136,2202,2135, -2202,2136,2203, -2137,2203,2136, -2203,2137,2204, -2138,2204,2137, -2204,2138,2205, -2139,2205,2138, -2205,2139,2206, -2140,2206,2139, -2206,2140,2207, -2141,2207,2140, -2207,2141,2208, -2142,2208,2141, -2208,2142,2209, -2143,2209,2142, -2209,2143,2210, -2144,2210,2143, -2210,2144,2211, -2145,2211,2144, -2211,2145,2212, -2146,2212,2145, -2212,2146,2213, -2147,2213,2146, -2213,2147,2214, -2148,2214,2147, -2214,2148,2215, -2149,2215,2148, -2215,2149,2216, -2150,2216,2149, -2216,2150,2217, -2151,2217,2150, -2217,2151,2218, -2152,2218,2151, -2218,2152,2219, -2153,2219,2152, -2219,2153,2220, -2154,2220,2153, -2220,2154,2221, -2155,2221,2154, -2221,2155,2222, -2156,2222,2155, -2222,2156,2223, -2157,2223,2156, -2223,2157,2224, -2158,2224,2157, -2224,2158,2225, -2159,2225,2158, -2225,2159,2226, -2160,2226,2159, -2226,2160,2227, -2161,2227,2160, -2227,2161,2228, -2162,2228,2161, -2228,2162,2229, -2163,2229,2162, -2229,2163,2230, -2164,2230,2163, -2230,2164,2231, -2165,2231,2164, -2231,2165,2232, -2166,2232,2165, -2232,2166,2233, -2167,2233,2166, -2233,2167,2234, -2168,2234,2167, -2234,2168,2235, -2169,2235,2168, -2235,2169,2236, -2170,2236,2169, -2236,2170,2237, -2171,2237,2170, -2237,2171,2238, -2172,2238,2171, -2238,2172,2239, -2173,2239,2172, -2239,2173,2240, -2174,2240,2173, -2240,2174,2241, -2175,2241,2174, -2241,2175,2242, -2176,2242,2175, -2242,2176,2243, -2177,2243,2176, -}; - -#define Landscape06VtxCount 2310 -#define Landscape06IdxCount 13260 - -btScalar Landscape06Vtx[] = { --250.0f,5.63631f,246.094f, --250.0f,8.1152f,250.0f, --246.094f,7.06461f,246.094f, --246.094f,9.72778f,250.0f, --242.188f,9.8471f,246.094f, --242.188f,11.659f,250.0f, --238.281f,12.8404f,246.094f, --238.281f,12.5619f,250.0f, --234.375f,13.9879f,246.094f, --234.375f,12.9518f,250.0f, --230.469f,15.7239f,246.094f, --230.469f,15.1373f,250.0f, --226.563f,17.5095f,246.094f, --226.563f,17.0421f,250.0f, --222.656f,18.4322f,246.094f, --222.656f,17.9919f,250.0f, --218.75f,19.0755f,246.094f, --218.75f,18.7918f,250.0f, --214.844f,19.9271f,246.094f, --214.844f,19.5719f,250.0f, --210.938f,19.7244f,246.094f, --210.938f,20.0866f,250.0f, --207.031f,18.9716f,246.094f, --207.031f,19.7869f,250.0f, --203.125f,19.1922f,246.094f, --203.125f,20.0264f,250.0f, --199.219f,17.8506f,246.094f, --199.219f,19.3207f,250.0f, --195.313f,15.238f,246.094f, --195.313f,18.0244f,250.0f, --191.406f,14.6904f,246.094f, --191.406f,16.2939f,250.0f, --187.5f,12.9803f,246.094f, --187.5f,14.9619f,250.0f, --183.594f,11.6545f,246.094f, --183.594f,12.6676f,250.0f, --179.688f,12.4631f,246.094f, --179.688f,13.6712f,250.0f, --175.781f,13.1206f,246.094f, --175.781f,14.5417f,250.0f, --171.875f,13.3105f,246.094f, --171.875f,15.8974f,250.0f, --167.969f,13.4543f,246.094f, --167.969f,15.9641f,250.0f, --164.063f,13.4505f,246.094f, --164.063f,15.4826f,250.0f, --160.156f,14.6873f,246.094f, --160.156f,15.1093f,250.0f, --156.25f,14.1623f,246.094f, --156.25f,14.8119f,250.0f, --152.344f,14.0111f,246.094f, --152.344f,14.4017f,250.0f, --148.438f,13.2014f,246.094f, --148.438f,14.2916f,250.0f, --144.531f,12.8662f,246.094f, --144.531f,13.5685f,250.0f, --140.625f,13.1721f,246.094f, --140.625f,14.2972f,250.0f, --136.719f,12.9479f,246.094f, --136.719f,15.0727f,250.0f, --132.813f,13.4221f,246.094f, --132.813f,14.5344f,250.0f, --128.906f,14.0862f,246.094f, --128.906f,15.7145f,250.0f, --125.0f,13.481f,246.094f, --125.0f,15.4608f,250.0f, --121.094f,12.6228f,246.094f, --121.094f,15.1857f,250.0f, --117.188f,12.0584f,246.094f, --117.188f,15.444f,250.0f, --113.281f,12.7173f,246.094f, --113.281f,15.8882f,250.0f, --109.375f,12.3498f,246.094f, --109.375f,15.2023f,250.0f, --105.469f,13.0125f,246.094f, --105.469f,15.1747f,250.0f, --101.563f,13.7023f,246.094f, --101.563f,14.7499f,250.0f, --97.6563f,14.0674f,246.094f, --97.6563f,15.0991f,250.0f, --93.75f,13.8437f,246.094f, --93.75f,14.6676f,250.0f, --89.8438f,14.6327f,246.094f, --89.8438f,14.1527f,250.0f, --85.9375f,13.2966f,246.094f, --85.9375f,14.0388f,250.0f, --82.0313f,12.8094f,246.094f, --82.0313f,13.7786f,250.0f, --78.125f,11.8006f,246.094f, --78.125f,13.0685f,250.0f, --74.2188f,11.6837f,246.094f, --74.2188f,12.8361f,250.0f, --70.3125f,11.0326f,246.094f, --70.3125f,12.3629f,250.0f, --66.4063f,11.893f,246.094f, --66.4063f,11.1909f,250.0f, --62.5f,10.6469f,246.094f, --62.5f,9.92966f,250.0f, --58.5938f,8.55287f,246.094f, --58.5938f,8.8871f,250.0f, --54.6875f,7.1029f,246.094f, --54.6875f,7.4963f,250.0f, --50.7813f,6.9758f,246.094f, --50.7813f,6.23897f,250.0f, --46.875f,7.98262f,246.094f, --46.875f,6.88918f,250.0f, --42.9688f,9.11554f,246.094f, --42.9688f,7.29319f,250.0f, --39.0625f,8.74373f,246.094f, --39.0625f,6.89167f,250.0f, --35.1563f,7.46275f,246.094f, --35.1563f,6.659f,250.0f, --31.25f,7.67626f,246.094f, --31.25f,6.75404f,250.0f, --27.3438f,7.00511f,246.094f, --27.3438f,6.15573f,250.0f, --23.4375f,5.63813f,246.094f, --23.4375f,5.72737f,250.0f, --19.5313f,5.11885f,246.094f, --19.5313f,4.00822f,250.0f, --15.625f,3.60038f,246.094f, --15.625f,3.50471f,250.0f, --11.7188f,3.05357f,246.094f, --11.7188f,3.0992f,250.0f, --7.8125f,2.48195f,246.094f, --7.8125f,2.46052f,250.0f, --3.90625f,1.69136f,246.094f, --3.90625f,2.5505f,250.0f, -0.0f,1.14548f,246.094f, -0.0f,2.18079f,250.0f, -3.90625f,0.45291f,246.094f, -3.90625f,1.52302f,250.0f, --250.0f,5.2159f,242.188f, --246.094f,7.35218f,242.188f, --242.188f,10.2284f,242.188f, --238.281f,12.7552f,242.188f, --234.375f,14.3317f,242.188f, --230.469f,16.3594f,242.188f, --226.563f,17.8216f,242.188f, --222.656f,18.5321f,242.188f, --218.75f,18.7578f,242.188f, --214.844f,19.504f,242.188f, --210.938f,18.9422f,242.188f, --207.031f,17.9771f,242.188f, --203.125f,17.2798f,242.188f, --199.219f,15.2252f,242.188f, --195.313f,13.8769f,242.188f, --191.406f,12.8727f,242.188f, --187.5f,11.7858f,242.188f, --183.594f,12.4886f,242.188f, --179.688f,12.9814f,242.188f, --175.781f,13.5265f,242.188f, --171.875f,13.8082f,242.188f, --167.969f,13.8407f,242.188f, --164.063f,13.5872f,242.188f, --160.156f,13.8287f,242.188f, --156.25f,13.5778f,242.188f, --152.344f,13.0026f,242.188f, --148.438f,12.6259f,242.188f, --144.531f,12.4666f,242.188f, --140.625f,12.634f,242.188f, --136.719f,12.1746f,242.188f, --132.813f,11.7885f,242.188f, --128.906f,11.4539f,242.188f, --125.0f,11.0084f,242.188f, --121.094f,10.1521f,242.188f, --117.188f,10.6008f,242.188f, --113.281f,10.2088f,242.188f, --109.375f,11.0344f,242.188f, --105.469f,11.1441f,242.188f, --101.563f,12.3959f,242.188f, --97.6563f,13.3587f,242.188f, --93.75f,14.2415f,242.188f, --89.8438f,13.9809f,242.188f, --85.9375f,13.3276f,242.188f, --82.0313f,11.9639f,242.188f, --78.125f,11.5863f,242.188f, --74.2188f,11.7327f,242.188f, --70.3125f,11.5527f,242.188f, --66.4063f,12.3699f,242.188f, --62.5f,11.1959f,242.188f, --58.5938f,9.59967f,242.188f, --54.6875f,8.38887f,242.188f, --50.7813f,7.42613f,242.188f, --46.875f,8.34697f,242.188f, --42.9688f,9.7013f,242.188f, --39.0625f,9.10668f,242.188f, --35.1563f,8.24657f,242.188f, --31.25f,8.06656f,242.188f, --27.3438f,6.98555f,242.188f, --23.4375f,6.88836f,242.188f, --19.5313f,5.88079f,242.188f, --15.625f,4.43148f,242.188f, --11.7188f,3.65843f,242.188f, --7.8125f,2.85687f,242.188f, --3.90625f,1.8332f,242.188f, -0.0f,2.03971f,242.188f, -3.90625f,2.21488f,242.188f, --250.0f,5.44463f,238.281f, --246.094f,7.90885f,238.281f, --242.188f,10.3908f,238.281f, --238.281f,12.875f,238.281f, --234.375f,14.8255f,238.281f, --230.469f,16.5404f,238.281f, --226.563f,17.8109f,238.281f, --222.656f,19.0205f,238.281f, --218.75f,18.7565f,238.281f, --214.844f,18.9852f,238.281f, --210.938f,18.3753f,238.281f, --207.031f,16.6829f,238.281f, --203.125f,15.8099f,238.281f, --199.219f,13.2915f,238.281f, --195.313f,13.447f,238.281f, --191.406f,13.5971f,238.281f, --187.5f,12.1473f,238.281f, --183.594f,13.3531f,238.281f, --179.688f,14.4732f,238.281f, --175.781f,15.0267f,238.281f, --171.875f,14.7852f,238.281f, --167.969f,15.5706f,238.281f, --164.063f,14.267f,238.281f, --160.156f,14.0772f,238.281f, --156.25f,12.4965f,238.281f, --152.344f,12.1473f,238.281f, --148.438f,11.8693f,238.281f, --144.531f,11.2795f,238.281f, --140.625f,10.8173f,238.281f, --136.719f,10.792f,238.281f, --132.813f,10.8481f,238.281f, --128.906f,9.95928f,238.281f, --125.0f,10.0976f,238.281f, --121.094f,8.74444f,238.281f, --117.188f,9.1761f,238.281f, --113.281f,10.2354f,238.281f, --109.375f,10.7023f,238.281f, --105.469f,11.6386f,238.281f, --101.563f,12.7789f,238.281f, --97.6563f,13.956f,238.281f, --93.75f,14.1101f,238.281f, --89.8438f,13.2653f,238.281f, --85.9375f,12.1604f,238.281f, --82.0313f,11.6914f,238.281f, --78.125f,11.3706f,238.281f, --74.2188f,12.1449f,238.281f, --70.3125f,12.4512f,238.281f, --66.4063f,12.6436f,238.281f, --62.5f,11.6692f,238.281f, --58.5938f,10.8304f,238.281f, --54.6875f,8.88158f,238.281f, --50.7813f,7.94904f,238.281f, --46.875f,8.47525f,238.281f, --42.9688f,9.08763f,238.281f, --39.0625f,9.21095f,238.281f, --35.1563f,9.12926f,238.281f, --31.25f,8.5517f,238.281f, --27.3438f,7.86146f,238.281f, --23.4375f,7.33662f,238.281f, --19.5313f,6.37551f,238.281f, --15.625f,5.59324f,238.281f, --11.7188f,4.81831f,238.281f, --7.8125f,4.35695f,238.281f, --3.90625f,3.64159f,238.281f, -0.0f,3.70314f,238.281f, -3.90625f,3.04396f,238.281f, --250.0f,5.92848f,234.375f, --246.094f,8.10446f,234.375f, --242.188f,10.3516f,234.375f, --238.281f,12.4984f,234.375f, --234.375f,15.0991f,234.375f, --230.469f,16.0002f,234.375f, --226.563f,17.2585f,234.375f, --222.656f,18.1852f,234.375f, --218.75f,18.7811f,234.375f, --214.844f,18.4638f,234.375f, --210.938f,18.3171f,234.375f, --207.031f,16.1085f,234.375f, --203.125f,15.1926f,234.375f, --199.219f,14.1792f,234.375f, --195.313f,13.5589f,234.375f, --191.406f,13.9362f,234.375f, --187.5f,13.303f,234.375f, --183.594f,13.6602f,234.375f, --179.688f,15.1086f,234.375f, --175.781f,15.5943f,234.375f, --171.875f,15.3663f,234.375f, --167.969f,14.9609f,234.375f, --164.063f,14.4285f,234.375f, --160.156f,14.1532f,234.375f, --156.25f,13.0139f,234.375f, --152.344f,11.6503f,234.375f, --148.438f,11.6112f,234.375f, --144.531f,11.1097f,234.375f, --140.625f,10.8763f,234.375f, --136.719f,10.2321f,234.375f, --132.813f,9.71321f,234.375f, --128.906f,9.04388f,234.375f, --125.0f,9.53542f,234.375f, --121.094f,8.10006f,234.375f, --117.188f,9.16948f,234.375f, --113.281f,9.67824f,234.375f, --109.375f,10.2679f,234.375f, --105.469f,10.9669f,234.375f, --101.563f,12.2942f,234.375f, --97.6563f,13.2952f,234.375f, --93.75f,13.0932f,234.375f, --89.8438f,12.4514f,234.375f, --85.9375f,12.2395f,234.375f, --82.0313f,11.7622f,234.375f, --78.125f,11.9666f,234.375f, --74.2188f,12.2346f,234.375f, --70.3125f,13.1648f,234.375f, --66.4063f,13.506f,234.375f, --62.5f,13.1773f,234.375f, --58.5938f,11.9168f,234.375f, --54.6875f,10.0208f,234.375f, --50.7813f,9.08267f,234.375f, --46.875f,8.4406f,234.375f, --42.9688f,9.27515f,234.375f, --39.0625f,10.2228f,234.375f, --35.1563f,9.77624f,234.375f, --31.25f,9.17943f,234.375f, --27.3438f,8.83272f,234.375f, --23.4375f,8.00355f,234.375f, --19.5313f,7.37167f,234.375f, --15.625f,6.87424f,234.375f, --11.7188f,6.23994f,234.375f, --7.8125f,5.50641f,234.375f, --3.90625f,5.06839f,234.375f, -0.0f,5.06846f,234.375f, -3.90625f,5.19166f,234.375f, --250.0f,4.98265f,230.469f, --246.094f,7.878f,230.469f, --242.188f,10.9188f,230.469f, --238.281f,12.8549f,230.469f, --234.375f,14.5578f,230.469f, --230.469f,16.067f,230.469f, --226.563f,17.9938f,230.469f, --222.656f,18.3449f,230.469f, --218.75f,18.4423f,230.469f, --214.844f,18.9411f,230.469f, --210.938f,17.3131f,230.469f, --207.031f,15.3292f,230.469f, --203.125f,15.5278f,230.469f, --199.219f,14.9451f,230.469f, --195.313f,13.8026f,230.469f, --191.406f,13.1586f,230.469f, --187.5f,13.4388f,230.469f, --183.594f,14.2213f,230.469f, --179.688f,14.907f,230.469f, --175.781f,15.2295f,230.469f, --171.875f,14.8701f,230.469f, --167.969f,14.1393f,230.469f, --164.063f,13.7829f,230.469f, --160.156f,13.0614f,230.469f, --156.25f,12.3416f,230.469f, --152.344f,11.5366f,230.469f, --148.438f,11.5201f,230.469f, --144.531f,11.0918f,230.469f, --140.625f,11.139f,230.469f, --136.719f,10.0387f,230.469f, --132.813f,8.59099f,230.469f, --128.906f,7.71771f,230.469f, --125.0f,7.44273f,230.469f, --121.094f,8.17087f,230.469f, --117.188f,8.34002f,230.469f, --113.281f,9.22169f,230.469f, --109.375f,10.2195f,230.469f, --105.469f,11.523f,230.469f, --101.563f,12.7411f,230.469f, --97.6563f,12.7429f,230.469f, --93.75f,12.3959f,230.469f, --89.8438f,11.7559f,230.469f, --85.9375f,10.3669f,230.469f, --82.0313f,10.0825f,230.469f, --78.125f,11.4451f,230.469f, --74.2188f,12.235f,230.469f, --70.3125f,13.6016f,230.469f, --66.4063f,14.377f,230.469f, --62.5f,13.967f,230.469f, --58.5938f,12.862f,230.469f, --54.6875f,11.4719f,230.469f, --50.7813f,9.99381f,230.469f, --46.875f,8.68857f,230.469f, --42.9688f,9.43448f,230.469f, --39.0625f,10.4708f,230.469f, --35.1563f,11.0521f,230.469f, --31.25f,10.5864f,230.469f, --27.3438f,10.8331f,230.469f, --23.4375f,9.96112f,230.469f, --19.5313f,8.61029f,230.469f, --15.625f,7.42407f,230.469f, --11.7188f,6.43202f,230.469f, --7.8125f,6.36726f,230.469f, --3.90625f,6.52581f,230.469f, -0.0f,6.18686f,230.469f, -3.90625f,5.885f,230.469f, --250.0f,4.92227f,226.563f, --246.094f,8.66811f,226.563f, --242.188f,11.7599f,226.563f, --238.281f,13.6581f,226.563f, --234.375f,15.6409f,226.563f, --230.469f,16.7907f,226.563f, --226.563f,17.4606f,226.563f, --222.656f,18.4841f,226.563f, --218.75f,18.4506f,226.563f, --214.844f,17.5936f,226.563f, --210.938f,16.5941f,226.563f, --207.031f,14.8805f,226.563f, --203.125f,15.3743f,226.563f, --199.219f,15.4493f,226.563f, --195.313f,14.5184f,226.563f, --191.406f,12.9285f,226.563f, --187.5f,13.3898f,226.563f, --183.594f,14.0358f,226.563f, --179.688f,15.2884f,226.563f, --175.781f,14.972f,226.563f, --171.875f,14.2355f,226.563f, --167.969f,13.6786f,226.563f, --164.063f,13.0771f,226.563f, --160.156f,12.7879f,226.563f, --156.25f,12.4767f,226.563f, --152.344f,11.5156f,226.563f, --148.438f,11.1725f,226.563f, --144.531f,10.8869f,226.563f, --140.625f,9.77232f,226.563f, --136.719f,8.75728f,226.563f, --132.813f,6.77705f,226.563f, --128.906f,6.35083f,226.563f, --125.0f,6.59888f,226.563f, --121.094f,7.81295f,226.563f, --117.188f,8.10078f,226.563f, --113.281f,9.07634f,226.563f, --109.375f,10.2289f,226.563f, --105.469f,11.5342f,226.563f, --101.563f,12.9142f,226.563f, --97.6563f,12.8729f,226.563f, --93.75f,12.8149f,226.563f, --89.8438f,10.9671f,226.563f, --85.9375f,10.0649f,226.563f, --82.0313f,9.28012f,226.563f, --78.125f,10.1324f,226.563f, --74.2188f,11.8638f,226.563f, --70.3125f,12.6141f,226.563f, --66.4063f,13.6851f,226.563f, --62.5f,13.9389f,226.563f, --58.5938f,13.5413f,226.563f, --54.6875f,12.4869f,226.563f, --50.7813f,11.2774f,226.563f, --46.875f,10.6009f,226.563f, --42.9688f,11.4839f,226.563f, --39.0625f,12.5408f,226.563f, --35.1563f,12.8694f,226.563f, --31.25f,12.5253f,226.563f, --27.3438f,12.1887f,226.563f, --23.4375f,11.5356f,226.563f, --19.5313f,9.53151f,226.563f, --15.625f,8.29811f,226.563f, --11.7188f,7.38375f,226.563f, --7.8125f,7.57607f,226.563f, --3.90625f,7.41156f,226.563f, -0.0f,6.9836f,226.563f, -3.90625f,6.89682f,226.563f, --250.0f,4.66781f,222.656f, --246.094f,7.89882f,222.656f, --242.188f,10.8629f,222.656f, --238.281f,14.1235f,222.656f, --234.375f,15.6001f,222.656f, --230.469f,17.0347f,222.656f, --226.563f,17.4872f,222.656f, --222.656f,17.6157f,222.656f, --218.75f,16.8213f,222.656f, --214.844f,16.4076f,222.656f, --210.938f,15.0745f,222.656f, --207.031f,14.2914f,222.656f, --203.125f,14.6094f,222.656f, --199.219f,14.4637f,222.656f, --195.313f,14.0807f,222.656f, --191.406f,12.4559f,222.656f, --187.5f,13.0367f,222.656f, --183.594f,13.975f,222.656f, --179.688f,14.802f,222.656f, --175.781f,14.6145f,222.656f, --171.875f,13.4733f,222.656f, --167.969f,13.3385f,222.656f, --164.063f,13.721f,222.656f, --160.156f,12.5775f,222.656f, --156.25f,11.962f,222.656f, --152.344f,11.2422f,222.656f, --148.438f,10.827f,222.656f, --144.531f,10.2848f,222.656f, --140.625f,8.45922f,222.656f, --136.719f,7.72182f,222.656f, --132.813f,6.23545f,222.656f, --128.906f,5.69752f,222.656f, --125.0f,6.29925f,222.656f, --121.094f,7.1991f,222.656f, --117.188f,7.56788f,222.656f, --113.281f,8.87895f,222.656f, --109.375f,9.92302f,222.656f, --105.469f,10.2628f,222.656f, --101.563f,11.427f,222.656f, --97.6563f,12.2929f,222.656f, --93.75f,11.6083f,222.656f, --89.8438f,11.594f,222.656f, --85.9375f,10.1683f,222.656f, --82.0313f,10.4152f,222.656f, --78.125f,10.765f,222.656f, --74.2188f,11.5311f,222.656f, --70.3125f,12.8761f,222.656f, --66.4063f,14.8794f,222.656f, --62.5f,15.7341f,222.656f, --58.5938f,15.0851f,222.656f, --54.6875f,14.4719f,222.656f, --50.7813f,13.6899f,222.656f, --46.875f,13.0842f,222.656f, --42.9688f,13.1059f,222.656f, --39.0625f,13.9942f,222.656f, --35.1563f,13.8877f,222.656f, --31.25f,14.1293f,222.656f, --27.3438f,13.6276f,222.656f, --23.4375f,12.2206f,222.656f, --19.5313f,10.8481f,222.656f, --15.625f,9.71168f,222.656f, --11.7188f,8.51834f,222.656f, --7.8125f,9.04274f,222.656f, --3.90625f,8.46981f,222.656f, -0.0f,8.26045f,222.656f, -3.90625f,6.81349f,222.656f, --250.0f,5.16984f,218.75f, --246.094f,6.64731f,218.75f, --242.188f,9.50207f,218.75f, --238.281f,12.5115f,218.75f, --234.375f,15.8009f,218.75f, --230.469f,17.6139f,218.75f, --226.563f,18.128f,218.75f, --222.656f,17.3111f,218.75f, --218.75f,16.3962f,218.75f, --214.844f,16.0245f,218.75f, --210.938f,14.5344f,218.75f, --207.031f,13.4459f,218.75f, --203.125f,13.3987f,218.75f, --199.219f,13.5444f,218.75f, --195.313f,12.1973f,218.75f, --191.406f,11.8337f,218.75f, --187.5f,13.3027f,218.75f, --183.594f,13.2862f,218.75f, --179.688f,14.577f,218.75f, --175.781f,14.4312f,218.75f, --171.875f,13.3065f,218.75f, --167.969f,14.2726f,218.75f, --164.063f,14.5522f,218.75f, --160.156f,13.8269f,218.75f, --156.25f,12.4234f,218.75f, --152.344f,10.5035f,218.75f, --148.438f,9.65297f,218.75f, --144.531f,8.3692f,218.75f, --140.625f,7.39811f,218.75f, --136.719f,6.29024f,218.75f, --132.813f,5.37103f,218.75f, --128.906f,5.29069f,218.75f, --125.0f,5.59696f,218.75f, --121.094f,6.15404f,218.75f, --117.188f,7.15855f,218.75f, --113.281f,8.08243f,218.75f, --109.375f,8.97937f,218.75f, --105.469f,9.67177f,218.75f, --101.563f,10.7738f,218.75f, --97.6563f,11.4256f,218.75f, --93.75f,11.6906f,218.75f, --89.8438f,11.4527f,218.75f, --85.9375f,11.5445f,218.75f, --82.0313f,11.9384f,218.75f, --78.125f,12.452f,218.75f, --74.2188f,13.3202f,218.75f, --70.3125f,14.2351f,218.75f, --66.4063f,15.021f,218.75f, --62.5f,16.1053f,218.75f, --58.5938f,16.0633f,218.75f, --54.6875f,15.6154f,218.75f, --50.7813f,15.3347f,218.75f, --46.875f,14.8984f,218.75f, --42.9688f,14.1541f,218.75f, --39.0625f,14.8343f,218.75f, --35.1563f,14.8393f,218.75f, --31.25f,14.865f,218.75f, --27.3438f,13.9913f,218.75f, --23.4375f,13.7749f,218.75f, --19.5313f,12.6247f,218.75f, --15.625f,11.3466f,218.75f, --11.7188f,10.5048f,218.75f, --7.8125f,9.94742f,218.75f, --3.90625f,8.79577f,218.75f, -0.0f,8.31646f,218.75f, -3.90625f,8.02546f,218.75f, --250.0f,4.42455f,214.844f, --246.094f,6.15686f,214.844f, --242.188f,8.4919f,214.844f, --238.281f,12.2627f,214.844f, --234.375f,15.9215f,214.844f, --230.469f,17.6896f,214.844f, --226.563f,18.1835f,214.844f, --222.656f,17.9341f,214.844f, --218.75f,16.9803f,214.844f, --214.844f,15.6617f,214.844f, --210.938f,14.3989f,214.844f, --207.031f,12.7777f,214.844f, --203.125f,12.7635f,214.844f, --199.219f,12.8533f,214.844f, --195.313f,12.1672f,214.844f, --191.406f,12.2357f,214.844f, --187.5f,12.5806f,214.844f, --183.594f,12.5597f,214.844f, --179.688f,13.6296f,214.844f, --175.781f,13.8382f,214.844f, --171.875f,14.4001f,214.844f, --167.969f,14.3002f,214.844f, --164.063f,14.3353f,214.844f, --160.156f,14.0346f,214.844f, --156.25f,12.9823f,214.844f, --152.344f,10.8141f,214.844f, --148.438f,9.57028f,214.844f, --144.531f,8.18427f,214.844f, --140.625f,6.89938f,214.844f, --136.719f,5.79227f,214.844f, --132.813f,4.60172f,214.844f, --128.906f,4.59969f,214.844f, --125.0f,5.20294f,214.844f, --121.094f,6.17542f,214.844f, --117.188f,7.13347f,214.844f, --113.281f,8.1045f,214.844f, --109.375f,8.73005f,214.844f, --105.469f,9.96489f,214.844f, --101.563f,11.1039f,214.844f, --97.6563f,11.6791f,214.844f, --93.75f,11.9246f,214.844f, --89.8438f,12.0071f,214.844f, --85.9375f,12.8099f,214.844f, --82.0313f,13.3672f,214.844f, --78.125f,13.5811f,214.844f, --74.2188f,14.7559f,214.844f, --70.3125f,15.4274f,214.844f, --66.4063f,15.487f,214.844f, --62.5f,16.3346f,214.844f, --58.5938f,16.424f,214.844f, --54.6875f,17.1014f,214.844f, --50.7813f,17.634f,214.844f, --46.875f,16.5132f,214.844f, --42.9688f,15.1728f,214.844f, --39.0625f,15.4699f,214.844f, --35.1563f,16.154f,214.844f, --31.25f,15.8527f,214.844f, --27.3438f,15.4057f,214.844f, --23.4375f,14.6476f,214.844f, --19.5313f,13.1705f,214.844f, --15.625f,11.9754f,214.844f, --11.7188f,11.7453f,214.844f, --7.8125f,10.8384f,214.844f, --3.90625f,10.1259f,214.844f, -0.0f,9.49925f,214.844f, -3.90625f,9.25513f,214.844f, --250.0f,3.60269f,210.938f, --246.094f,5.37638f,210.938f, --242.188f,7.66914f,210.938f, --238.281f,11.9863f,210.938f, --234.375f,14.9525f,210.938f, --230.469f,16.5034f,210.938f, --226.563f,17.8663f,210.938f, --222.656f,17.1002f,210.938f, --218.75f,16.0413f,210.938f, --214.844f,14.8516f,210.938f, --210.938f,13.8904f,210.938f, --207.031f,11.9929f,210.938f, --203.125f,11.8171f,210.938f, --199.219f,11.6849f,210.938f, --195.313f,11.056f,210.938f, --191.406f,11.6318f,210.938f, --187.5f,11.9333f,210.938f, --183.594f,12.599f,210.938f, --179.688f,14.0437f,210.938f, --175.781f,14.7937f,210.938f, --171.875f,14.8844f,210.938f, --167.969f,14.3312f,210.938f, --164.063f,13.2879f,210.938f, --160.156f,12.3423f,210.938f, --156.25f,11.4768f,210.938f, --152.344f,9.94481f,210.938f, --148.438f,7.76655f,210.938f, --144.531f,6.59218f,210.938f, --140.625f,6.49848f,210.938f, --136.719f,5.2458f,210.938f, --132.813f,4.27164f,210.938f, --128.906f,4.68484f,210.938f, --125.0f,5.2746f,210.938f, --121.094f,6.12822f,210.938f, --117.188f,8.02215f,210.938f, --113.281f,8.95036f,210.938f, --109.375f,9.92538f,210.938f, --105.469f,10.4058f,210.938f, --101.563f,11.2862f,210.938f, --97.6563f,11.7274f,210.938f, --93.75f,12.3175f,210.938f, --89.8438f,12.6423f,210.938f, --85.9375f,13.2212f,210.938f, --82.0313f,13.9379f,210.938f, --78.125f,15.3332f,210.938f, --74.2188f,16.2893f,210.938f, --70.3125f,16.1032f,210.938f, --66.4063f,16.7786f,210.938f, --62.5f,16.8038f,210.938f, --58.5938f,16.1537f,210.938f, --54.6875f,17.4306f,210.938f, --50.7813f,17.313f,210.938f, --46.875f,16.2568f,210.938f, --42.9688f,16.0266f,210.938f, --39.0625f,16.9569f,210.938f, --35.1563f,18.0733f,210.938f, --31.25f,17.4779f,210.938f, --27.3438f,17.2939f,210.938f, --23.4375f,16.1477f,210.938f, --19.5313f,15.409f,210.938f, --15.625f,14.0019f,210.938f, --11.7188f,13.3531f,210.938f, --7.8125f,12.4823f,210.938f, --3.90625f,11.7842f,210.938f, -0.0f,11.0776f,210.938f, -3.90625f,10.5728f,210.938f, --250.0f,3.49901f,207.031f, --246.094f,4.00092f,207.031f, --242.188f,7.06194f,207.031f, --238.281f,10.1502f,207.031f, --234.375f,13.0262f,207.031f, --230.469f,15.541f,207.031f, --226.563f,16.4029f,207.031f, --222.656f,16.0741f,207.031f, --218.75f,15.3706f,207.031f, --214.844f,14.3529f,207.031f, --210.938f,13.1351f,207.031f, --207.031f,11.2939f,207.031f, --203.125f,11.4337f,207.031f, --199.219f,11.43f,207.031f, --195.313f,10.6048f,207.031f, --191.406f,10.859f,207.031f, --187.5f,11.8447f,207.031f, --183.594f,12.8305f,207.031f, --179.688f,14.9116f,207.031f, --175.781f,15.0225f,207.031f, --171.875f,14.847f,207.031f, --167.969f,13.7464f,207.031f, --164.063f,12.6716f,207.031f, --160.156f,10.4028f,207.031f, --156.25f,9.61156f,207.031f, --152.344f,9.08545f,207.031f, --148.438f,6.96088f,207.031f, --144.531f,6.6794f,207.031f, --140.625f,6.08012f,207.031f, --136.719f,5.02964f,207.031f, --132.813f,4.93996f,207.031f, --128.906f,4.955f,207.031f, --125.0f,5.23446f,207.031f, --121.094f,7.14164f,207.031f, --117.188f,9.21655f,207.031f, --113.281f,10.8802f,207.031f, --109.375f,11.0518f,207.031f, --105.469f,11.5707f,207.031f, --101.563f,12.2834f,207.031f, --97.6563f,12.7498f,207.031f, --93.75f,12.6608f,207.031f, --89.8438f,12.3649f,207.031f, --85.9375f,13.1678f,207.031f, --82.0313f,13.541f,207.031f, --78.125f,14.3448f,207.031f, --74.2188f,15.6006f,207.031f, --70.3125f,17.0141f,207.031f, --66.4063f,17.4107f,207.031f, --62.5f,18.0045f,207.031f, --58.5938f,17.6582f,207.031f, --54.6875f,17.0297f,207.031f, --50.7813f,16.6619f,207.031f, --46.875f,17.1267f,207.031f, --42.9688f,18.0618f,207.031f, --39.0625f,18.7698f,207.031f, --35.1563f,19.3034f,207.031f, --31.25f,19.1566f,207.031f, --27.3438f,19.1107f,207.031f, --23.4375f,17.3298f,207.031f, --19.5313f,15.7204f,207.031f, --15.625f,14.7827f,207.031f, --11.7188f,14.2027f,207.031f, --7.8125f,13.5758f,207.031f, --3.90625f,13.1935f,207.031f, -0.0f,11.8526f,207.031f, -3.90625f,10.4539f,207.031f, --250.0f,3.85941f,203.125f, --246.094f,3.80391f,203.125f, --242.188f,6.8342f,203.125f, --238.281f,10.0313f,203.125f, --234.375f,12.9894f,203.125f, --230.469f,15.1588f,203.125f, --226.563f,15.6234f,203.125f, --222.656f,15.112f,203.125f, --218.75f,14.5577f,203.125f, --214.844f,14.0703f,203.125f, --210.938f,13.3523f,203.125f, --207.031f,12.1264f,203.125f, --203.125f,11.037f,203.125f, --199.219f,10.3379f,203.125f, --195.313f,11.3f,203.125f, --191.406f,10.6845f,203.125f, --187.5f,11.7023f,203.125f, --183.594f,13.2057f,203.125f, --179.688f,13.976f,203.125f, --175.781f,14.994f,203.125f, --171.875f,14.6465f,203.125f, --167.969f,13.4879f,203.125f, --164.063f,12.0617f,203.125f, --160.156f,10.6454f,203.125f, --156.25f,10.2693f,203.125f, --152.344f,8.33279f,203.125f, --148.438f,7.60557f,203.125f, --144.531f,6.19774f,203.125f, --140.625f,5.7751f,203.125f, --136.719f,5.28903f,203.125f, --132.813f,5.10696f,203.125f, --128.906f,5.61944f,203.125f, --125.0f,7.32929f,203.125f, --121.094f,9.09158f,203.125f, --117.188f,10.6952f,203.125f, --113.281f,11.555f,203.125f, --109.375f,12.5837f,203.125f, --105.469f,13.4444f,203.125f, --101.563f,14.3191f,203.125f, --97.6563f,14.5546f,203.125f, --93.75f,13.9216f,203.125f, --89.8438f,13.07f,203.125f, --85.9375f,13.0497f,203.125f, --82.0313f,13.8884f,203.125f, --78.125f,14.2048f,203.125f, --74.2188f,16.2809f,203.125f, --70.3125f,17.1518f,203.125f, --66.4063f,18.4883f,203.125f, --62.5f,19.2231f,203.125f, --58.5938f,19.0199f,203.125f, --54.6875f,18.4606f,203.125f, --50.7813f,17.3076f,203.125f, --46.875f,17.0012f,203.125f, --42.9688f,18.4311f,203.125f, --39.0625f,19.9758f,203.125f, --35.1563f,20.1252f,203.125f, --31.25f,20.126f,203.125f, --27.3438f,18.9276f,203.125f, --23.4375f,18.3938f,203.125f, --19.5313f,16.6811f,203.125f, --15.625f,15.7398f,203.125f, --11.7188f,14.6978f,203.125f, --7.8125f,14.7567f,203.125f, --3.90625f,14.377f,203.125f, -0.0f,13.0029f,203.125f, -3.90625f,11.4706f,203.125f, --250.0f,4.68355f,199.219f, --246.094f,4.65569f,199.219f, --242.188f,6.34925f,199.219f, --238.281f,9.03665f,199.219f, --234.375f,11.4587f,199.219f, --230.469f,13.9932f,199.219f, --226.563f,14.8268f,199.219f, --222.656f,14.0552f,199.219f, --218.75f,14.4455f,199.219f, --214.844f,14.3053f,199.219f, --210.938f,12.5781f,199.219f, --207.031f,11.5778f,199.219f, --203.125f,9.91652f,199.219f, --199.219f,9.20832f,199.219f, --195.313f,10.1078f,199.219f, --191.406f,10.5638f,199.219f, --187.5f,11.6649f,199.219f, --183.594f,13.3758f,199.219f, --179.688f,15.2035f,199.219f, --175.781f,14.6909f,199.219f, --171.875f,14.0312f,199.219f, --167.969f,12.6808f,199.219f, --164.063f,12.649f,199.219f, --160.156f,11.6333f,199.219f, --156.25f,10.8896f,199.219f, --152.344f,8.72848f,199.219f, --148.438f,7.55753f,199.219f, --144.531f,6.70035f,199.219f, --140.625f,5.28209f,199.219f, --136.719f,5.47347f,199.219f, --132.813f,7.25678f,199.219f, --128.906f,9.06223f,199.219f, --125.0f,9.91604f,199.219f, --121.094f,10.882f,199.219f, --117.188f,11.8314f,199.219f, --113.281f,12.9729f,199.219f, --109.375f,14.1144f,199.219f, --105.469f,15.0374f,199.219f, --101.563f,15.4321f,199.219f, --97.6563f,15.9823f,199.219f, --93.75f,15.4663f,199.219f, --89.8438f,14.4094f,199.219f, --85.9375f,14.1599f,199.219f, --82.0313f,14.4239f,199.219f, --78.125f,14.7717f,199.219f, --74.2188f,15.3979f,199.219f, --70.3125f,16.4014f,199.219f, --66.4063f,17.9486f,199.219f, --62.5f,19.3767f,199.219f, --58.5938f,19.7322f,199.219f, --54.6875f,19.0648f,199.219f, --50.7813f,18.2481f,199.219f, --46.875f,17.1507f,199.219f, --42.9688f,18.6306f,199.219f, --39.0625f,19.2486f,199.219f, --35.1563f,20.3158f,199.219f, --31.25f,19.6441f,199.219f, --27.3438f,18.7294f,199.219f, --23.4375f,17.9051f,199.219f, --19.5313f,17.278f,199.219f, --15.625f,16.1912f,199.219f, --11.7188f,15.3685f,199.219f, --7.8125f,14.8376f,199.219f, --3.90625f,13.8988f,199.219f, -0.0f,12.5645f,199.219f, -3.90625f,12.1184f,199.219f, --250.0f,5.71048f,195.313f, --246.094f,4.68298f,195.313f, --242.188f,5.30012f,195.313f, --238.281f,7.72299f,195.313f, --234.375f,10.9797f,195.313f, --230.469f,12.6343f,195.313f, --226.563f,13.8962f,195.313f, --222.656f,13.2189f,195.313f, --218.75f,14.0254f,195.313f, --214.844f,14.5903f,195.313f, --210.938f,12.6794f,195.313f, --207.031f,9.8479f,195.313f, --203.125f,8.05763f,195.313f, --199.219f,7.68254f,195.313f, --195.313f,9.0324f,195.313f, --191.406f,10.7973f,195.313f, --187.5f,12.1516f,195.313f, --183.594f,13.1888f,195.313f, --179.688f,14.2559f,195.313f, --175.781f,14.0455f,195.313f, --171.875f,13.2785f,195.313f, --167.969f,12.7724f,195.313f, --164.063f,12.56f,195.313f, --160.156f,11.4647f,195.313f, --156.25f,10.6463f,195.313f, --152.344f,9.36927f,195.313f, --148.438f,7.87862f,195.313f, --144.531f,6.78168f,195.313f, --140.625f,5.32688f,195.313f, --136.719f,6.62928f,195.313f, --132.813f,8.97871f,195.313f, --128.906f,10.3174f,195.313f, --125.0f,11.2136f,195.313f, --121.094f,12.2822f,195.313f, --117.188f,13.7351f,195.313f, --113.281f,14.0196f,195.313f, --109.375f,15.5457f,195.313f, --105.469f,16.1402f,195.313f, --101.563f,16.6719f,195.313f, --97.6563f,16.2658f,195.313f, --93.75f,16.5379f,195.313f, --89.8438f,15.1289f,195.313f, --85.9375f,14.7687f,195.313f, --82.0313f,15.4638f,195.313f, --78.125f,15.3391f,195.313f, --74.2188f,14.8602f,195.313f, --70.3125f,16.2701f,195.313f, --66.4063f,17.9511f,195.313f, --62.5f,19.108f,195.313f, --58.5938f,19.5253f,195.313f, --54.6875f,19.1648f,195.313f, --50.7813f,18.0624f,195.313f, --46.875f,17.2201f,195.313f, --42.9688f,19.4165f,195.313f, --39.0625f,20.3781f,195.313f, --35.1563f,19.796f,195.313f, --31.25f,18.9841f,195.313f, --27.3438f,18.3143f,195.313f, --23.4375f,18.1973f,195.313f, --19.5313f,17.5121f,195.313f, --15.625f,16.5969f,195.313f, --11.7188f,15.3539f,195.313f, --7.8125f,14.4654f,195.313f, --3.90625f,13.8161f,195.313f, -0.0f,12.4727f,195.313f, -3.90625f,13.8013f,195.313f, --250.0f,6.07831f,191.406f, --246.094f,5.46721f,191.406f, --242.188f,4.48351f,191.406f, --238.281f,6.74031f,191.406f, --234.375f,9.75661f,191.406f, --230.469f,11.5382f,191.406f, --226.563f,12.9559f,191.406f, --222.656f,12.6196f,191.406f, --218.75f,12.4516f,191.406f, --214.844f,13.5738f,191.406f, --210.938f,12.2334f,191.406f, --207.031f,9.36284f,191.406f, --203.125f,7.56119f,191.406f, --199.219f,8.2975f,191.406f, --195.313f,10.0432f,191.406f, --191.406f,11.528f,191.406f, --187.5f,12.9338f,191.406f, --183.594f,13.9397f,191.406f, --179.688f,14.1423f,191.406f, --175.781f,13.7637f,191.406f, --171.875f,12.7983f,191.406f, --167.969f,12.6132f,191.406f, --164.063f,12.07f,191.406f, --160.156f,11.7037f,191.406f, --156.25f,10.3692f,191.406f, --152.344f,9.29784f,191.406f, --148.438f,7.91508f,191.406f, --144.531f,6.85636f,191.406f, --140.625f,8.06021f,191.406f, --136.719f,8.86078f,191.406f, --132.813f,11.0565f,191.406f, --128.906f,12.4031f,191.406f, --125.0f,13.4308f,191.406f, --121.094f,13.8732f,191.406f, --117.188f,15.0555f,191.406f, --113.281f,16.0219f,191.406f, --109.375f,16.8646f,191.406f, --105.469f,16.9156f,191.406f, --101.563f,16.9811f,191.406f, --97.6563f,17.1773f,191.406f, --93.75f,16.9233f,191.406f, --89.8438f,15.3563f,191.406f, --85.9375f,14.4936f,191.406f, --82.0313f,15.6108f,191.406f, --78.125f,15.9615f,191.406f, --74.2188f,14.6365f,191.406f, --70.3125f,15.5344f,191.406f, --66.4063f,17.4295f,191.406f, --62.5f,18.2646f,191.406f, --58.5938f,19.0205f,191.406f, --54.6875f,19.0503f,191.406f, --50.7813f,17.6912f,191.406f, --46.875f,17.6816f,191.406f, --42.9688f,18.8066f,191.406f, --39.0625f,19.8444f,191.406f, --35.1563f,18.7929f,191.406f, --31.25f,18.6865f,191.406f, --27.3438f,19.0671f,191.406f, --23.4375f,18.6708f,191.406f, --19.5313f,17.7215f,191.406f, --15.625f,16.4711f,191.406f, --11.7188f,15.4735f,191.406f, --7.8125f,14.6316f,191.406f, --3.90625f,13.8779f,191.406f, -0.0f,13.7777f,191.406f, -3.90625f,14.3936f,191.406f, --250.0f,6.25219f,187.5f, --246.094f,5.98752f,187.5f, --242.188f,5.50108f,187.5f, --238.281f,5.52049f,187.5f, --234.375f,7.87236f,187.5f, --230.469f,10.0244f,187.5f, --226.563f,10.9579f,187.5f, --222.656f,11.4176f,187.5f, --218.75f,11.1583f,187.5f, --214.844f,12.0797f,187.5f, --210.938f,10.8226f,187.5f, --207.031f,8.91363f,187.5f, --203.125f,7.71952f,187.5f, --199.219f,8.97116f,187.5f, --195.313f,10.8813f,187.5f, --191.406f,12.5874f,187.5f, --187.5f,13.3418f,187.5f, --183.594f,13.6407f,187.5f, --179.688f,13.8787f,187.5f, --175.781f,13.7918f,187.5f, --171.875f,12.965f,187.5f, --167.969f,12.2732f,187.5f, --164.063f,11.6063f,187.5f, --160.156f,10.9159f,187.5f, --156.25f,10.2447f,187.5f, --152.344f,9.32757f,187.5f, --148.438f,9.17721f,187.5f, --144.531f,9.53961f,187.5f, --140.625f,10.4339f,187.5f, --136.719f,11.8144f,187.5f, --132.813f,13.3081f,187.5f, --128.906f,13.571f,187.5f, --125.0f,13.9242f,187.5f, --121.094f,15.4069f,187.5f, --117.188f,16.9689f,187.5f, --113.281f,17.987f,187.5f, --109.375f,18.7838f,187.5f, --105.469f,18.7737f,187.5f, --101.563f,18.6666f,187.5f, --97.6563f,18.4809f,187.5f, --93.75f,18.3562f,187.5f, --89.8438f,16.3715f,187.5f, --85.9375f,14.5483f,187.5f, --82.0313f,14.9648f,187.5f, --78.125f,16.1061f,187.5f, --74.2188f,14.4715f,187.5f, --70.3125f,14.8322f,187.5f, --66.4063f,16.3093f,187.5f, --62.5f,17.3305f,187.5f, --58.5938f,18.3312f,187.5f, --54.6875f,18.2865f,187.5f, --50.7813f,17.4373f,187.5f, --46.875f,17.9803f,187.5f, --42.9688f,18.679f,187.5f, --39.0625f,19.2363f,187.5f, --35.1563f,19.9926f,187.5f, --31.25f,19.8827f,187.5f, --27.3438f,19.283f,187.5f, --23.4375f,19.0081f,187.5f, --19.5313f,17.5129f,187.5f, --15.625f,16.6754f,187.5f, --11.7188f,15.6685f,187.5f, --7.8125f,14.6133f,187.5f, --3.90625f,13.9468f,187.5f, -0.0f,14.2206f,187.5f, -3.90625f,14.1738f,187.5f, --250.0f,7.10023f,183.594f, --246.094f,6.39376f,183.594f, --242.188f,5.78017f,183.594f, --238.281f,5.07235f,183.594f, --234.375f,5.98564f,183.594f, --230.469f,7.6542f,183.594f, --226.563f,8.75539f,183.594f, --222.656f,9.90845f,183.594f, --218.75f,10.2067f,183.594f, --214.844f,10.2019f,183.594f, --210.938f,9.2327f,183.594f, --207.031f,7.67088f,183.594f, --203.125f,8.15546f,183.594f, --199.219f,9.42269f,183.594f, --195.313f,10.8046f,183.594f, --191.406f,13.3042f,183.594f, --187.5f,13.9971f,183.594f, --183.594f,13.621f,183.594f, --179.688f,13.5612f,183.594f, --175.781f,13.5357f,183.594f, --171.875f,12.8778f,183.594f, --167.969f,12.0385f,183.594f, --164.063f,11.4391f,183.594f, --160.156f,10.4255f,183.594f, --156.25f,10.5692f,183.594f, --152.344f,10.5452f,183.594f, --148.438f,11.506f,183.594f, --144.531f,12.1591f,183.594f, --140.625f,12.6212f,183.594f, --136.719f,13.5025f,183.594f, --132.813f,14.3363f,183.594f, --128.906f,14.5206f,183.594f, --125.0f,15.4902f,183.594f, --121.094f,17.4029f,183.594f, --117.188f,17.9537f,183.594f, --113.281f,18.5532f,183.594f, --109.375f,19.2939f,183.594f, --105.469f,19.2503f,183.594f, --101.563f,19.8772f,183.594f, --97.6563f,19.6753f,183.594f, --93.75f,18.6744f,183.594f, --89.8438f,17.7905f,183.594f, --85.9375f,16.1613f,183.594f, --82.0313f,15.7839f,183.594f, --78.125f,15.657f,183.594f, --74.2188f,14.4171f,183.594f, --70.3125f,14.6083f,183.594f, --66.4063f,15.5594f,183.594f, --62.5f,16.1338f,183.594f, --58.5938f,17.1134f,183.594f, --54.6875f,16.8192f,183.594f, --50.7813f,17.6885f,183.594f, --46.875f,18.5331f,183.594f, --42.9688f,19.7359f,183.594f, --39.0625f,20.7966f,183.594f, --35.1563f,20.414f,183.594f, --31.25f,20.1587f,183.594f, --27.3438f,19.9385f,183.594f, --23.4375f,18.4694f,183.594f, --19.5313f,16.9742f,183.594f, --15.625f,16.0698f,183.594f, --11.7188f,15.4466f,183.594f, --7.8125f,15.0614f,183.594f, --3.90625f,15.2165f,183.594f, -0.0f,14.2632f,183.594f, -3.90625f,13.9878f,183.594f, --250.0f,8.16978f,179.688f, --246.094f,7.02044f,179.688f, --242.188f,6.49336f,179.688f, --238.281f,6.17674f,179.688f, --234.375f,4.65977f,179.688f, --230.469f,5.28977f,179.688f, --226.563f,7.10711f,179.688f, --222.656f,8.03062f,179.688f, --218.75f,9.32719f,179.688f, --214.844f,9.22926f,179.688f, --210.938f,8.64588f,179.688f, --207.031f,7.76534f,179.688f, --203.125f,8.37552f,179.688f, --199.219f,8.61402f,179.688f, --195.313f,10.7567f,179.688f, --191.406f,12.1961f,179.688f, --187.5f,13.5076f,179.688f, --183.594f,13.5739f,179.688f, --179.688f,13.6032f,179.688f, --175.781f,13.5388f,179.688f, --171.875f,13.0425f,179.688f, --167.969f,13.5885f,179.688f, --164.063f,13.2666f,179.688f, --160.156f,11.7827f,179.688f, --156.25f,12.3517f,179.688f, --152.344f,13.1307f,179.688f, --148.438f,13.6688f,179.688f, --144.531f,13.758f,179.688f, --140.625f,14.023f,179.688f, --136.719f,15.1514f,179.688f, --132.813f,16.004f,179.688f, --128.906f,16.8991f,179.688f, --125.0f,17.3616f,179.688f, --121.094f,18.6059f,179.688f, --117.188f,19.3263f,179.688f, --113.281f,19.1956f,179.688f, --109.375f,19.7991f,179.688f, --105.469f,20.6907f,179.688f, --101.563f,21.7059f,179.688f, --97.6563f,21.5595f,179.688f, --93.75f,20.4072f,179.688f, --89.8438f,19.1786f,179.688f, --85.9375f,18.2895f,179.688f, --82.0313f,17.1568f,179.688f, --78.125f,15.2991f,179.688f, --74.2188f,14.0951f,179.688f, --70.3125f,14.2935f,179.688f, --66.4063f,15.0579f,179.688f, --62.5f,15.3497f,179.688f, --58.5938f,15.4148f,179.688f, --54.6875f,17.2528f,179.688f, --50.7813f,18.38f,179.688f, --46.875f,19.343f,179.688f, --42.9688f,20.2151f,179.688f, --39.0625f,21.1482f,179.688f, --35.1563f,20.8113f,179.688f, --31.25f,19.3685f,179.688f, --27.3438f,18.4966f,179.688f, --23.4375f,17.1162f,179.688f, --19.5313f,16.1739f,179.688f, --15.625f,15.1081f,179.688f, --11.7188f,15.5766f,179.688f, --7.8125f,16.3649f,179.688f, --3.90625f,16.3198f,179.688f, -0.0f,15.6844f,179.688f, -3.90625f,14.6785f,179.688f, --250.0f,9.32456f,175.781f, --246.094f,8.37571f,175.781f, --242.188f,7.57502f,175.781f, --238.281f,7.01497f,175.781f, --234.375f,5.67261f,175.781f, --230.469f,4.32895f,175.781f, --226.563f,5.20027f,175.781f, --222.656f,6.31061f,175.781f, --218.75f,7.56464f,175.781f, --214.844f,8.35874f,175.781f, --210.938f,8.24556f,175.781f, --207.031f,7.58905f,175.781f, --203.125f,8.23662f,175.781f, --199.219f,8.64236f,175.781f, --195.313f,10.4842f,175.781f, --191.406f,11.8296f,175.781f, --187.5f,13.5307f,175.781f, --183.594f,14.3422f,175.781f, --179.688f,14.0725f,175.781f, --175.781f,14.6f,175.781f, --171.875f,13.9877f,175.781f, --167.969f,13.7556f,175.781f, --164.063f,13.4564f,175.781f, --160.156f,13.6823f,175.781f, --156.25f,14.2643f,175.781f, --152.344f,14.5034f,175.781f, --148.438f,14.905f,175.781f, --144.531f,15.0207f,175.781f, --140.625f,15.2745f,175.781f, --136.719f,16.7553f,175.781f, --132.813f,17.9777f,175.781f, --128.906f,18.5468f,175.781f, --125.0f,19.2067f,175.781f, --121.094f,19.2384f,175.781f, --117.188f,19.4993f,175.781f, --113.281f,20.2276f,175.781f, --109.375f,21.3946f,175.781f, --105.469f,22.0598f,175.781f, --101.563f,23.2713f,175.781f, --97.6563f,22.6691f,175.781f, --93.75f,21.3119f,175.781f, --89.8438f,20.6083f,175.781f, --85.9375f,19.4937f,175.781f, --82.0313f,18.1998f,175.781f, --78.125f,15.7716f,175.781f, --74.2188f,14.2438f,175.781f, --70.3125f,14.4105f,175.781f, --66.4063f,15.1879f,175.781f, --62.5f,15.7946f,175.781f, --58.5938f,16.2302f,175.781f, --54.6875f,17.1058f,175.781f, --50.7813f,18.9688f,175.781f, --46.875f,19.3102f,175.781f, --42.9688f,19.3902f,175.781f, --39.0625f,19.6545f,175.781f, --35.1563f,19.2909f,175.781f, --31.25f,18.5385f,175.781f, --27.3438f,16.4388f,175.781f, --23.4375f,15.5576f,175.781f, --19.5313f,15.7726f,175.781f, --15.625f,16.3756f,175.781f, --11.7188f,16.9626f,175.781f, --7.8125f,17.219f,175.781f, --3.90625f,17.063f,175.781f, -0.0f,16.3609f,175.781f, -3.90625f,15.2963f,175.781f, --250.0f,10.0329f,171.875f, --246.094f,8.57258f,171.875f, --242.188f,7.81755f,171.875f, --238.281f,6.9951f,171.875f, --234.375f,5.59199f,171.875f, --230.469f,4.81205f,171.875f, --226.563f,4.7432f,171.875f, --222.656f,5.42683f,171.875f, --218.75f,6.16332f,171.875f, --214.844f,6.63573f,171.875f, --210.938f,6.97578f,171.875f, --207.031f,7.49804f,171.875f, --203.125f,8.51155f,171.875f, --199.219f,7.94356f,171.875f, --195.313f,9.50881f,171.875f, --191.406f,10.9726f,171.875f, --187.5f,13.1622f,171.875f, --183.594f,13.8249f,171.875f, --179.688f,15.1925f,171.875f, --175.781f,14.9284f,171.875f, --171.875f,13.915f,171.875f, --167.969f,14.2258f,171.875f, --164.063f,13.435f,171.875f, --160.156f,13.9359f,171.875f, --156.25f,14.8963f,171.875f, --152.344f,15.2933f,171.875f, --148.438f,15.0124f,171.875f, --144.531f,15.0787f,171.875f, --140.625f,15.1958f,171.875f, --136.719f,17.151f,171.875f, --132.813f,18.8799f,171.875f, --128.906f,19.5273f,171.875f, --125.0f,19.6894f,171.875f, --121.094f,19.6466f,171.875f, --117.188f,20.5941f,171.875f, --113.281f,21.5237f,171.875f, --109.375f,22.5435f,171.875f, --105.469f,23.0706f,171.875f, --101.563f,23.614f,171.875f, --97.6563f,22.4198f,171.875f, --93.75f,21.9598f,171.875f, --89.8438f,22.3051f,171.875f, --85.9375f,21.7459f,171.875f, --82.0313f,20.1308f,171.875f, --78.125f,17.6018f,171.875f, --74.2188f,15.106f,171.875f, --70.3125f,16.0838f,171.875f, --66.4063f,16.4153f,171.875f, --62.5f,16.9093f,171.875f, --58.5938f,16.7439f,171.875f, --54.6875f,16.4659f,171.875f, --50.7813f,18.0893f,171.875f, --46.875f,18.8298f,171.875f, --42.9688f,18.459f,171.875f, --39.0625f,18.0953f,171.875f, --35.1563f,18.2461f,171.875f, --31.25f,17.0625f,171.875f, --27.3438f,15.3181f,171.875f, --23.4375f,15.1837f,171.875f, --19.5313f,17.2025f,171.875f, --15.625f,18.3144f,171.875f, --11.7188f,18.4161f,171.875f, --7.8125f,18.3279f,171.875f, --3.90625f,17.5657f,171.875f, -0.0f,16.2057f,171.875f, -3.90625f,16.0791f,171.875f, --250.0f,9.46368f,167.969f, --246.094f,8.91851f,167.969f, --242.188f,7.83383f,167.969f, --238.281f,7.4147f,167.969f, --234.375f,6.33692f,167.969f, --230.469f,5.44334f,167.969f, --226.563f,4.39369f,167.969f, --222.656f,3.44146f,167.969f, --218.75f,4.44651f,167.969f, --214.844f,5.36701f,167.969f, --210.938f,6.2915f,167.969f, --207.031f,6.3588f,167.969f, --203.125f,7.36203f,167.969f, --199.219f,7.7957f,167.969f, --195.313f,9.3926f,167.969f, --191.406f,11.2699f,167.969f, --187.5f,12.3727f,167.969f, --183.594f,14.7022f,167.969f, --179.688f,15.4324f,167.969f, --175.781f,15.226f,167.969f, --171.875f,13.6658f,167.969f, --167.969f,14.0361f,167.969f, --164.063f,13.5871f,167.969f, --160.156f,14.725f,167.969f, --156.25f,15.5452f,167.969f, --152.344f,16.3685f,167.969f, --148.438f,17.0213f,167.969f, --144.531f,16.2228f,167.969f, --140.625f,15.1123f,167.969f, --136.719f,16.9339f,167.969f, --132.813f,18.4025f,167.969f, --128.906f,19.9945f,167.969f, --125.0f,20.4069f,167.969f, --121.094f,21.447f,167.969f, --117.188f,22.384f,167.969f, --113.281f,22.4822f,167.969f, --109.375f,22.9018f,167.969f, --105.469f,23.4936f,167.969f, --101.563f,23.0085f,167.969f, --97.6563f,22.8398f,167.969f, --93.75f,23.2939f,167.969f, --89.8438f,23.3336f,167.969f, --85.9375f,22.6883f,167.969f, --82.0313f,21.8752f,167.969f, --78.125f,18.7456f,167.969f, --74.2188f,16.5685f,167.969f, --70.3125f,17.179f,167.969f, --66.4063f,18.1074f,167.969f, --62.5f,18.9865f,167.969f, --58.5938f,17.4851f,167.969f, --54.6875f,17.2795f,167.969f, --50.7813f,16.9142f,167.969f, --46.875f,17.1532f,167.969f, --42.9688f,17.796f,167.969f, --39.0625f,17.6868f,167.969f, --35.1563f,16.7998f,167.969f, --31.25f,16.0556f,167.969f, --27.3438f,14.7864f,167.969f, --23.4375f,16.8386f,167.969f, --19.5313f,17.9676f,167.969f, --15.625f,18.4144f,167.969f, --11.7188f,18.9248f,167.969f, --7.8125f,18.4614f,167.969f, --3.90625f,17.2197f,167.969f, -0.0f,16.7097f,167.969f, -3.90625f,17.1455f,167.969f, --250.0f,9.27861f,164.063f, --246.094f,8.67875f,164.063f, --242.188f,8.39269f,164.063f, --238.281f,7.54041f,164.063f, --234.375f,6.37361f,164.063f, --230.469f,5.0066f,164.063f, --226.563f,3.63142f,164.063f, --222.656f,2.77898f,164.063f, --218.75f,2.89032f,164.063f, --214.844f,4.01591f,164.063f, --210.938f,4.52151f,164.063f, --207.031f,4.85596f,164.063f, --203.125f,6.21759f,164.063f, --199.219f,8.25574f,164.063f, --195.313f,10.3856f,164.063f, --191.406f,11.6593f,164.063f, --187.5f,12.5334f,164.063f, --183.594f,14.1044f,164.063f, --179.688f,14.8149f,164.063f, --175.781f,14.9916f,164.063f, --171.875f,14.6218f,164.063f, --167.969f,14.5374f,164.063f, --164.063f,13.7748f,164.063f, --160.156f,15.1069f,164.063f, --156.25f,16.5225f,164.063f, --152.344f,17.8264f,164.063f, --148.438f,18.5076f,164.063f, --144.531f,17.6099f,164.063f, --140.625f,16.4656f,164.063f, --136.719f,16.7761f,164.063f, --132.813f,19.1652f,164.063f, --128.906f,20.565f,164.063f, --125.0f,21.7781f,164.063f, --121.094f,22.7613f,164.063f, --117.188f,23.5743f,164.063f, --113.281f,23.3567f,164.063f, --109.375f,24.4075f,164.063f, --105.469f,24.4502f,164.063f, --101.563f,24.044f,164.063f, --97.6563f,24.669f,164.063f, --93.75f,24.7946f,164.063f, --89.8438f,23.9722f,164.063f, --85.9375f,23.2481f,164.063f, --82.0313f,22.4202f,164.063f, --78.125f,19.4816f,164.063f, --74.2188f,18.3571f,164.063f, --70.3125f,19.3195f,164.063f, --66.4063f,19.6276f,164.063f, --62.5f,19.775f,164.063f, --58.5938f,18.4049f,164.063f, --54.6875f,17.6998f,164.063f, --50.7813f,16.7989f,164.063f, --46.875f,16.5351f,164.063f, --42.9688f,16.0836f,164.063f, --39.0625f,16.4446f,164.063f, --35.1563f,15.0322f,164.063f, --31.25f,14.1679f,164.063f, --27.3438f,16.0461f,164.063f, --23.4375f,16.985f,164.063f, --19.5313f,17.3286f,164.063f, --15.625f,18.477f,164.063f, --11.7188f,17.8736f,164.063f, --7.8125f,17.8059f,164.063f, --3.90625f,17.2079f,164.063f, -0.0f,16.7726f,164.063f, -3.90625f,16.4621f,164.063f, --250.0f,8.56359f,160.156f, --246.094f,8.04536f,160.156f, --242.188f,7.71795f,160.156f, --238.281f,7.20369f,160.156f, --234.375f,5.51432f,160.156f, --230.469f,5.00541f,160.156f, --226.563f,4.36899f,160.156f, --222.656f,3.03865f,160.156f, --218.75f,2.92915f,160.156f, --214.844f,2.63693f,160.156f, --210.938f,2.69254f,160.156f, --207.031f,3.5578f,160.156f, --203.125f,5.61634f,160.156f, --199.219f,7.61065f,160.156f, --195.313f,9.64763f,160.156f, --191.406f,11.2848f,160.156f, --187.5f,12.7624f,160.156f, --183.594f,13.2875f,160.156f, --179.688f,15.2776f,160.156f, --175.781f,15.3268f,160.156f, --171.875f,15.211f,160.156f, --167.969f,14.343f,160.156f, --164.063f,14.8683f,160.156f, --160.156f,16.1659f,160.156f, --156.25f,16.4538f,160.156f, --152.344f,18.5601f,160.156f, --148.438f,19.2615f,160.156f, --144.531f,18.8155f,160.156f, --140.625f,17.4377f,160.156f, --136.719f,17.6478f,160.156f, --132.813f,19.7168f,160.156f, --128.906f,21.4745f,160.156f, --125.0f,23.0596f,160.156f, --121.094f,24.6069f,160.156f, --117.188f,25.9676f,160.156f, --113.281f,26.2865f,160.156f, --109.375f,27.1441f,160.156f, --105.469f,27.0334f,160.156f, --101.563f,26.0567f,160.156f, --97.6563f,26.2584f,160.156f, --93.75f,26.2751f,160.156f, --89.8438f,25.6929f,160.156f, --85.9375f,24.0275f,160.156f, --82.0313f,22.2346f,160.156f, --78.125f,20.4728f,160.156f, --74.2188f,19.6229f,160.156f, --70.3125f,20.0997f,160.156f, --66.4063f,21.118f,160.156f, --62.5f,20.4515f,160.156f, --58.5938f,19.4599f,160.156f, --54.6875f,18.2081f,160.156f, --50.7813f,16.8263f,160.156f, --46.875f,16.3719f,160.156f, --42.9688f,15.1416f,160.156f, --39.0625f,14.5969f,160.156f, --35.1563f,14.7039f,160.156f, --31.25f,14.8314f,160.156f, --27.3438f,16.4129f,160.156f, --23.4375f,16.144f,160.156f, --19.5313f,17.5764f,160.156f, --15.625f,17.9247f,160.156f, --11.7188f,17.0582f,160.156f, --7.8125f,17.1554f,160.156f, --3.90625f,16.8369f,160.156f, -0.0f,16.4316f,160.156f, -3.90625f,16.628f,160.156f, --250.0f,7.51933f,156.25f, --246.094f,7.63381f,156.25f, --242.188f,7.57378f,156.25f, --238.281f,6.94606f,156.25f, --234.375f,4.79198f,156.25f, --230.469f,4.43262f,156.25f, --226.563f,4.13314f,156.25f, --222.656f,2.75517f,156.25f, --218.75f,2.67631f,156.25f, --214.844f,3.321f,156.25f, --210.938f,3.33063f,156.25f, --207.031f,3.60719f,156.25f, --203.125f,4.44636f,156.25f, --199.219f,6.02108f,156.25f, --195.313f,8.25702f,156.25f, --191.406f,10.5762f,156.25f, --187.5f,11.4514f,156.25f, --183.594f,12.7361f,156.25f, --179.688f,15.4206f,156.25f, --175.781f,16.1997f,156.25f, --171.875f,14.8996f,156.25f, --167.969f,14.1118f,156.25f, --164.063f,16.0576f,156.25f, --160.156f,17.6078f,156.25f, --156.25f,17.7518f,156.25f, --152.344f,18.4278f,156.25f, --148.438f,19.5827f,156.25f, --144.531f,19.2756f,156.25f, --140.625f,18.2888f,156.25f, --136.719f,18.7157f,156.25f, --132.813f,20.4669f,156.25f, --128.906f,22.5748f,156.25f, --125.0f,24.648f,156.25f, --121.094f,27.1223f,156.25f, --117.188f,28.0709f,156.25f, --113.281f,28.4982f,156.25f, --109.375f,29.0927f,156.25f, --105.469f,29.2755f,156.25f, --101.563f,28.9208f,156.25f, --97.6563f,28.3829f,156.25f, --93.75f,26.8508f,156.25f, --89.8438f,25.9621f,156.25f, --85.9375f,24.2707f,156.25f, --82.0313f,22.6235f,156.25f, --78.125f,21.9368f,156.25f, --74.2188f,21.0831f,156.25f, --70.3125f,21.368f,156.25f, --66.4063f,21.3333f,156.25f, --62.5f,20.5296f,156.25f, --58.5938f,19.98f,156.25f, --54.6875f,18.5818f,156.25f, --50.7813f,17.2025f,156.25f, --46.875f,16.1859f,156.25f, --42.9688f,14.4559f,156.25f, --39.0625f,13.7597f,156.25f, --35.1563f,14.6354f,156.25f, --31.25f,15.6213f,156.25f, --27.3438f,15.683f,156.25f, --23.4375f,16.5331f,156.25f, --19.5313f,16.8272f,156.25f, --15.625f,16.551f,156.25f, --11.7188f,16.34f,156.25f, --7.8125f,16.4067f,156.25f, --3.90625f,15.8725f,156.25f, -0.0f,16.3451f,156.25f, -3.90625f,16.9346f,156.25f, --250.0f,6.48899f,152.344f, --246.094f,6.4047f,152.344f, --242.188f,6.57203f,152.344f, --238.281f,5.4628f,152.344f, --234.375f,4.20753f,152.344f, --230.469f,2.81156f,152.344f, --226.563f,1.88132f,152.344f, --222.656f,1.57153f,152.344f, --218.75f,2.48106f,152.344f, --214.844f,2.88884f,152.344f, --210.938f,2.63578f,152.344f, --207.031f,2.9717f,152.344f, --203.125f,3.6084f,152.344f, --199.219f,3.99032f,152.344f, --195.313f,7.36858f,152.344f, --191.406f,9.54951f,152.344f, --187.5f,10.6254f,152.344f, --183.594f,12.3317f,152.344f, --179.688f,14.015f,152.344f, --175.781f,14.8857f,152.344f, --171.875f,14.9944f,152.344f, --167.969f,14.7547f,152.344f, --164.063f,16.7748f,152.344f, --160.156f,18.5461f,152.344f, --156.25f,19.5932f,152.344f, --152.344f,19.1033f,152.344f, --148.438f,19.012f,152.344f, --144.531f,19.4428f,152.344f, --140.625f,19.3453f,152.344f, --136.719f,20.6611f,152.344f, --132.813f,22.2914f,152.344f, --128.906f,24.3802f,152.344f, --125.0f,26.4048f,152.344f, --121.094f,28.3525f,152.344f, --117.188f,30.0561f,152.344f, --113.281f,30.1155f,152.344f, --109.375f,30.9005f,152.344f, --105.469f,30.8767f,152.344f, --101.563f,30.9056f,152.344f, --97.6563f,30.3635f,152.344f, --93.75f,28.3996f,152.344f, --89.8438f,25.8081f,152.344f, --85.9375f,24.3731f,152.344f, --82.0313f,22.7783f,152.344f, --78.125f,22.5973f,152.344f, --74.2188f,21.8359f,152.344f, --70.3125f,21.4903f,152.344f, --66.4063f,21.0461f,152.344f, --62.5f,19.9934f,152.344f, --58.5938f,19.4729f,152.344f, --54.6875f,18.1265f,152.344f, --50.7813f,16.4684f,152.344f, --46.875f,15.0104f,152.344f, --42.9688f,13.8642f,152.344f, --39.0625f,14.8875f,152.344f, --35.1563f,15.117f,152.344f, --31.25f,15.0707f,152.344f, --27.3438f,15.3829f,152.344f, --23.4375f,15.5218f,152.344f, --19.5313f,15.215f,152.344f, --15.625f,15.2099f,152.344f, --11.7188f,15.5383f,152.344f, --7.8125f,15.6462f,152.344f, --3.90625f,15.3096f,152.344f, -0.0f,16.3854f,152.344f, -3.90625f,17.6952f,152.344f, --250.0f,5.17712f,148.438f, --246.094f,4.67214f,148.438f, --242.188f,4.31659f,148.438f, --238.281f,3.2191f,148.438f, --234.375f,2.13365f,148.438f, --230.469f,1.19555f,148.438f, --226.563f,0.110638f,148.438f, --222.656f,0.945025f,148.438f, --218.75f,1.43378f,148.438f, --214.844f,2.06915f,148.438f, --210.938f,2.27715f,148.438f, --207.031f,2.23051f,148.438f, --203.125f,2.64045f,148.438f, --199.219f,2.99575f,148.438f, --195.313f,5.40402f,148.438f, --191.406f,8.03643f,148.438f, --187.5f,10.0212f,148.438f, --183.594f,12.2205f,148.438f, --179.688f,14.1884f,148.438f, --175.781f,14.5505f,148.438f, --171.875f,15.188f,148.438f, --167.969f,15.2222f,148.438f, --164.063f,17.4791f,148.438f, --160.156f,19.6158f,148.438f, --156.25f,20.2107f,148.438f, --152.344f,20.552f,148.438f, --148.438f,20.2463f,148.438f, --144.531f,20.4526f,148.438f, --140.625f,20.9426f,148.438f, --136.719f,22.6331f,148.438f, --132.813f,25.1345f,148.438f, --128.906f,27.0299f,148.438f, --125.0f,29.381f,148.438f, --121.094f,31.0494f,148.438f, --117.188f,31.7246f,148.438f, --113.281f,31.9331f,148.438f, --109.375f,31.9517f,148.438f, --105.469f,32.217f,148.438f, --101.563f,31.9001f,148.438f, --97.6563f,30.471f,148.438f, --93.75f,28.6143f,148.438f, --89.8438f,26.5696f,148.438f, --85.9375f,24.7785f,148.438f, --82.0313f,23.3248f,148.438f, --78.125f,22.2737f,148.438f, --74.2188f,22.0395f,148.438f, --70.3125f,21.4879f,148.438f, --66.4063f,20.5539f,148.438f, --62.5f,19.3981f,148.438f, --58.5938f,18.0902f,148.438f, --54.6875f,16.6154f,148.438f, --50.7813f,15.8338f,148.438f, --46.875f,14.0809f,148.438f, --42.9688f,12.8188f,148.438f, --39.0625f,14.0819f,148.438f, --35.1563f,14.3673f,148.438f, --31.25f,14.2973f,148.438f, --27.3438f,15.1616f,148.438f, --23.4375f,13.9458f,148.438f, --19.5313f,14.9412f,148.438f, --15.625f,15.4488f,148.438f, --11.7188f,15.3397f,148.438f, --7.8125f,15.0356f,148.438f, --3.90625f,15.6431f,148.438f, -0.0f,16.6218f,148.438f, -3.90625f,18.4109f,148.438f, --250.0f,5.38918f,144.531f, --246.094f,4.29322f,144.531f, --242.188f,2.99843f,144.531f, --238.281f,2.80561f,144.531f, --234.375f,1.65282f,144.531f, --230.469f,-0.268879f,144.531f, --226.563f,-0.474469f,144.531f, --222.656f,-0.0607398f,144.531f, --218.75f,0.859532f,144.531f, --214.844f,1.28455f,144.531f, --210.938f,1.69755f,144.531f, --207.031f,2.1277f,144.531f, --203.125f,2.92014f,144.531f, --199.219f,3.85473f,144.531f, --195.313f,4.38999f,144.531f, --191.406f,6.72101f,144.531f, --187.5f,9.24433f,144.531f, --183.594f,11.6027f,144.531f, --179.688f,13.2042f,144.531f, --175.781f,14.6647f,144.531f, --171.875f,14.7252f,144.531f, --167.969f,16.1425f,144.531f, --164.063f,18.1823f,144.531f, --160.156f,19.9802f,144.531f, --156.25f,22.2009f,144.531f, --152.344f,21.9313f,144.531f, --148.438f,22.3421f,144.531f, --144.531f,21.6393f,144.531f, --140.625f,23.0621f,144.531f, --136.719f,24.695f,144.531f, --132.813f,26.6159f,144.531f, --128.906f,29.9912f,144.531f, --125.0f,31.6471f,144.531f, --121.094f,32.4919f,144.531f, --117.188f,32.9775f,144.531f, --113.281f,33.1587f,144.531f, --109.375f,33.0247f,144.531f, --105.469f,32.4654f,144.531f, --101.563f,31.5009f,144.531f, --97.6563f,30.2211f,144.531f, --93.75f,28.3655f,144.531f, --89.8438f,26.6696f,144.531f, --85.9375f,25.6101f,144.531f, --82.0313f,23.5563f,144.531f, --78.125f,21.8779f,144.531f, --74.2188f,21.4789f,144.531f, --70.3125f,21.2134f,144.531f, --66.4063f,20.0494f,144.531f, --62.5f,19.4674f,144.531f, --58.5938f,17.3288f,144.531f, --54.6875f,16.7337f,144.531f, --50.7813f,15.9259f,144.531f, --46.875f,14.3007f,144.531f, --42.9688f,13.3631f,144.531f, --39.0625f,12.7904f,144.531f, --35.1563f,13.6627f,144.531f, --31.25f,13.6872f,144.531f, --27.3438f,14.0818f,144.531f, --23.4375f,13.953f,144.531f, --19.5313f,14.0386f,144.531f, --15.625f,14.1249f,144.531f, --11.7188f,14.1069f,144.531f, --7.8125f,14.4968f,144.531f, --3.90625f,15.4283f,144.531f, -0.0f,16.5593f,144.531f, -3.90625f,17.8758f,144.531f, --250.0f,5.32443f,140.625f, --246.094f,4.53202f,140.625f, --242.188f,2.85351f,140.625f, --238.281f,1.48443f,140.625f, --234.375f,0.193579f,140.625f, --230.469f,-0.0240196f,140.625f, --226.563f,-0.195521f,140.625f, --222.656f,-0.525286f,140.625f, --218.75f,0.255241f,140.625f, --214.844f,0.505993f,140.625f, --210.938f,1.2501f,140.625f, --207.031f,2.77282f,140.625f, --203.125f,3.23678f,140.625f, --199.219f,3.81665f,140.625f, --195.313f,4.45749f,140.625f, --191.406f,6.57237f,140.625f, --187.5f,8.78049f,140.625f, --183.594f,10.653f,140.625f, --179.688f,12.1762f,140.625f, --175.781f,13.836f,140.625f, --171.875f,14.4421f,140.625f, --167.969f,16.2272f,140.625f, --164.063f,17.8194f,140.625f, --160.156f,20.3268f,140.625f, --156.25f,21.6942f,140.625f, --152.344f,21.8506f,140.625f, --148.438f,22.857f,140.625f, --144.531f,23.0189f,140.625f, --140.625f,24.7041f,140.625f, --136.719f,26.468f,140.625f, --132.813f,28.6459f,140.625f, --128.906f,30.9708f,140.625f, --125.0f,33.2917f,140.625f, --121.094f,34.9879f,140.625f, --117.188f,34.5936f,140.625f, --113.281f,34.2431f,140.625f, --109.375f,33.7219f,140.625f, --105.469f,32.9679f,140.625f, --101.563f,31.3296f,140.625f, --97.6563f,30.0001f,140.625f, --93.75f,28.0182f,140.625f, --89.8438f,26.2542f,140.625f, --85.9375f,24.9632f,140.625f, --82.0313f,23.5598f,140.625f, --78.125f,21.3613f,140.625f, --74.2188f,20.8425f,140.625f, --70.3125f,20.6976f,140.625f, --66.4063f,19.4459f,140.625f, --62.5f,17.9969f,140.625f, --58.5938f,17.2754f,140.625f, --54.6875f,16.763f,140.625f, --50.7813f,15.8668f,140.625f, --46.875f,15.2278f,140.625f, --42.9688f,14.0988f,140.625f, --39.0625f,13.4132f,140.625f, --35.1563f,12.9004f,140.625f, --31.25f,12.6267f,140.625f, --27.3438f,12.7032f,140.625f, --23.4375f,12.0508f,140.625f, --19.5313f,12.8332f,140.625f, --15.625f,12.2269f,140.625f, --11.7188f,12.2256f,140.625f, --7.8125f,13.9086f,140.625f, --3.90625f,15.559f,140.625f, -0.0f,16.8086f,140.625f, -3.90625f,18.5798f,140.625f, --250.0f,4.69677f,136.719f, --246.094f,3.45683f,136.719f, --242.188f,1.81964f,136.719f, --238.281f,1.13059f,136.719f, --234.375f,0.535221f,136.719f, --230.469f,0.868904f,136.719f, --226.563f,0.574251f,136.719f, --222.656f,0.279368f,136.719f, --218.75f,-1.1876f,136.719f, --214.844f,-0.688708f,136.719f, --210.938f,0.470686f,136.719f, --207.031f,2.00488f,136.719f, --203.125f,3.42644f,136.719f, --199.219f,4.20503f,136.719f, --195.313f,5.23588f,136.719f, --191.406f,6.02424f,136.719f, --187.5f,7.96541f,136.719f, --183.594f,10.5299f,136.719f, --179.688f,12.0941f,136.719f, --175.781f,13.5058f,136.719f, --171.875f,14.8816f,136.719f, --167.969f,16.551f,136.719f, --164.063f,17.712f,136.719f, --160.156f,19.6536f,136.719f, --156.25f,21.4322f,136.719f, --152.344f,22.672f,136.719f, --148.438f,23.3463f,136.719f, --144.531f,24.5334f,136.719f, --140.625f,26.061f,136.719f, --136.719f,27.7423f,136.719f, --132.813f,30.1692f,136.719f, --128.906f,33.3739f,136.719f, --125.0f,34.9742f,136.719f, --121.094f,35.9387f,136.719f, --117.188f,36.0925f,136.719f, --113.281f,35.6549f,136.719f, --109.375f,34.5646f,136.719f, --105.469f,34.6062f,136.719f, --101.563f,32.8375f,136.719f, --97.6563f,30.2678f,136.719f, --93.75f,27.2213f,136.719f, --89.8438f,26.1126f,136.719f, --85.9375f,24.9965f,136.719f, --82.0313f,22.5841f,136.719f, --78.125f,21.7213f,136.719f, --74.2188f,21.534f,136.719f, --70.3125f,20.5652f,136.719f, --66.4063f,19.032f,136.719f, --62.5f,17.4252f,136.719f, --58.5938f,16.7783f,136.719f, --54.6875f,15.9619f,136.719f, --50.7813f,14.8707f,136.719f, --46.875f,14.3143f,136.719f, --42.9688f,13.8793f,136.719f, --39.0625f,12.6352f,136.719f, --35.1563f,12.0433f,136.719f, --31.25f,11.8551f,136.719f, --27.3438f,12.0193f,136.719f, --23.4375f,11.2795f,136.719f, --19.5313f,11.6002f,136.719f, --15.625f,10.9143f,136.719f, --11.7188f,12.1473f,136.719f, --7.8125f,14.3093f,136.719f, --3.90625f,16.245f,136.719f, -0.0f,17.3141f,136.719f, -3.90625f,19.7224f,136.719f, --250.0f,3.94613f,132.813f, --246.094f,2.33247f,132.813f, --242.188f,1.96569f,132.813f, --238.281f,1.1741f,132.813f, --234.375f,0.606142f,132.813f, --230.469f,0.00901447f,132.813f, --226.563f,0.143339f,132.813f, --222.656f,-0.356031f,132.813f, --218.75f,-1.55439f,132.813f, --214.844f,-1.22801f,132.813f, --210.938f,-0.390443f,132.813f, --207.031f,1.15349f,132.813f, --203.125f,2.6275f,132.813f, --199.219f,3.55895f,132.813f, --195.313f,4.99281f,132.813f, --191.406f,4.99673f,132.813f, --187.5f,6.96468f,132.813f, --183.594f,10.0691f,132.813f, --179.688f,12.3783f,132.813f, --175.781f,13.2459f,132.813f, --171.875f,14.3637f,132.813f, --167.969f,16.3222f,132.813f, --164.063f,17.6984f,132.813f, --160.156f,19.3295f,132.813f, --156.25f,20.9768f,132.813f, --152.344f,23.1452f,132.813f, --148.438f,23.885f,132.813f, --144.531f,24.7169f,132.813f, --140.625f,27.1655f,132.813f, --136.719f,29.0232f,132.813f, --132.813f,30.2573f,132.813f, --128.906f,33.5563f,132.813f, --125.0f,35.1858f,132.813f, --121.094f,36.4332f,132.813f, --117.188f,36.6359f,132.813f, --113.281f,36.0253f,132.813f, --109.375f,34.7127f,132.813f, --105.469f,34.6833f,132.813f, --101.563f,33.7208f,132.813f, --97.6563f,30.9809f,132.813f, --93.75f,27.9091f,132.813f, --89.8438f,25.709f,132.813f, --85.9375f,24.452f,132.813f, --82.0313f,22.4897f,132.813f, --78.125f,22.0485f,132.813f, --74.2188f,22.1517f,132.813f, --70.3125f,20.4874f,132.813f, --66.4063f,19.0482f,132.813f, --62.5f,17.1019f,132.813f, --58.5938f,16.7815f,132.813f, --54.6875f,15.1253f,132.813f, --50.7813f,14.5074f,132.813f, --46.875f,12.7631f,132.813f, --42.9688f,12.6595f,132.813f, --39.0625f,11.9406f,132.813f, --35.1563f,11.7459f,132.813f, --31.25f,10.8406f,132.813f, --27.3438f,11.0393f,132.813f, --23.4375f,10.4798f,132.813f, --19.5313f,10.8165f,132.813f, --15.625f,12.4368f,132.813f, --11.7188f,13.2405f,132.813f, --7.8125f,14.9282f,132.813f, --3.90625f,16.4449f,132.813f, -0.0f,17.8238f,132.813f, -3.90625f,19.9574f,132.813f, --250.0f,2.5744f,128.906f, --246.094f,2.12474f,128.906f, --242.188f,0.674823f,128.906f, --238.281f,-0.305135f,128.906f, --234.375f,-0.948647f,128.906f, --230.469f,-0.982836f,128.906f, --226.563f,-1.17369f,128.906f, --222.656f,-1.48697f,128.906f, --218.75f,-2.23137f,128.906f, --214.844f,-2.13825f,128.906f, --210.938f,-1.06826f,128.906f, --207.031f,0.0666403f,128.906f, --203.125f,1.15717f,128.906f, --199.219f,3.14762f,128.906f, --195.313f,4.08858f,128.906f, --191.406f,5.07728f,128.906f, --187.5f,8.06699f,128.906f, --183.594f,10.7473f,128.906f, --179.688f,12.0801f,128.906f, --175.781f,13.1617f,128.906f, --171.875f,14.5283f,128.906f, --167.969f,15.8148f,128.906f, --164.063f,16.9067f,128.906f, --160.156f,18.6293f,128.906f, --156.25f,20.8869f,128.906f, --152.344f,22.6168f,128.906f, --148.438f,23.9359f,128.906f, --144.531f,26.521f,128.906f, --140.625f,27.4381f,128.906f, --136.719f,29.5698f,128.906f, --132.813f,30.681f,128.906f, --128.906f,33.28f,128.906f, --125.0f,35.3433f,128.906f, --121.094f,36.3509f,128.906f, --117.188f,36.2098f,128.906f, --113.281f,35.157f,128.906f, --109.375f,35.3884f,128.906f, --105.469f,35.7158f,128.906f, --101.563f,34.3449f,128.906f, --97.6563f,32.5198f,128.906f, --93.75f,29.0611f,128.906f, --89.8438f,25.9945f,128.906f, --85.9375f,24.2624f,128.906f, --82.0313f,23.0248f,128.906f, --78.125f,21.6012f,128.906f, --74.2188f,21.0399f,128.906f, --70.3125f,20.1719f,128.906f, --66.4063f,18.6862f,128.906f, --62.5f,17.3287f,128.906f, --58.5938f,16.0916f,128.906f, --54.6875f,14.1153f,128.906f, --50.7813f,12.6292f,128.906f, --46.875f,12.0431f,128.906f, --42.9688f,11.4785f,128.906f, --39.0625f,11.911f,128.906f, --35.1563f,11.6609f,128.906f, --31.25f,10.4332f,128.906f, --27.3438f,9.68026f,128.906f, --23.4375f,9.84506f,128.906f, --19.5313f,11.6097f,128.906f, --15.625f,13.2944f,128.906f, --11.7188f,14.0518f,128.906f, --7.8125f,15.2998f,128.906f, --3.90625f,16.8731f,128.906f, -0.0f,18.0594f,128.906f, -3.90625f,20.0876f,128.906f, --250.0f,2.47782f,125.0f, --246.094f,1.27263f,125.0f, --242.188f,-0.535855f,125.0f, --238.281f,-1.33089f,125.0f, --234.375f,-1.63273f,125.0f, --230.469f,-2.30607f,125.0f, --226.563f,-2.13647f,125.0f, --222.656f,-2.95807f,125.0f, --218.75f,-2.92133f,125.0f, --214.844f,-3.33811f,125.0f, --210.938f,-2.29807f,125.0f, --207.031f,-0.860766f,125.0f, --203.125f,0.507027f,125.0f, --199.219f,1.54044f,125.0f, --195.313f,3.32139f,125.0f, --191.406f,5.76593f,125.0f, --187.5f,8.17548f,125.0f, --183.594f,10.5223f,125.0f, --179.688f,11.4741f,125.0f, --175.781f,12.3545f,125.0f, --171.875f,13.5542f,125.0f, --167.969f,14.4358f,125.0f, --164.063f,16.6197f,125.0f, --160.156f,18.7561f,125.0f, --156.25f,21.2618f,125.0f, --152.344f,22.9541f,125.0f, --148.438f,24.7574f,125.0f, --144.531f,26.8375f,125.0f, --140.625f,28.3307f,125.0f, --136.719f,29.2598f,125.0f, --132.813f,31.2334f,125.0f, --128.906f,32.9236f,125.0f, --125.0f,34.4853f,125.0f, --121.094f,35.1589f,125.0f, --117.188f,34.4655f,125.0f, --113.281f,35.7692f,125.0f, --109.375f,35.9985f,125.0f, --105.469f,35.7974f,125.0f, --101.563f,34.6099f,125.0f, --97.6563f,32.4066f,125.0f, --93.75f,28.8398f,125.0f, --89.8438f,26.014f,125.0f, --85.9375f,25.0319f,125.0f, --82.0313f,23.7685f,125.0f, --78.125f,22.4099f,125.0f, --74.2188f,20.9166f,125.0f, --70.3125f,19.1502f,125.0f, --66.4063f,17.8355f,125.0f, --62.5f,16.5146f,125.0f, --58.5938f,14.9189f,125.0f, --54.6875f,13.2423f,125.0f, --50.7813f,12.2568f,125.0f, --46.875f,11.4853f,125.0f, --42.9688f,10.7795f,125.0f, --39.0625f,10.3251f,125.0f, --35.1563f,10.4077f,125.0f, --31.25f,9.96202f,125.0f, --27.3438f,9.77658f,125.0f, --23.4375f,10.6703f,125.0f, --19.5313f,12.2058f,125.0f, --15.625f,13.8385f,125.0f, --11.7188f,15.1556f,125.0f, --7.8125f,15.7626f,125.0f, --3.90625f,16.911f,125.0f, -0.0f,18.0803f,125.0f, -3.90625f,18.9654f,125.0f, --250.0f,1.97449f,121.094f, --246.094f,1.28169f,121.094f, --242.188f,0.0699786f,121.094f, --238.281f,-1.31551f,121.094f, --234.375f,-2.33115f,121.094f, --230.469f,-3.19445f,121.094f, --226.563f,-3.91693f,121.094f, --222.656f,-4.0298f,121.094f, --218.75f,-4.334f,121.094f, --214.844f,-3.5405f,121.094f, --210.938f,-2.70043f,121.094f, --207.031f,-2.86125f,121.094f, --203.125f,-1.24727f,121.094f, --199.219f,0.20797f,121.094f, --195.313f,2.52573f,121.094f, --191.406f,4.8544f,121.094f, --187.5f,7.37504f,121.094f, --183.594f,9.40828f,121.094f, --179.688f,11.0747f,121.094f, --175.781f,11.9892f,121.094f, --171.875f,12.3358f,121.094f, --167.969f,13.2084f,121.094f, --164.063f,15.8626f,121.094f, --160.156f,18.1098f,121.094f, --156.25f,20.2905f,121.094f, --152.344f,22.8183f,121.094f, --148.438f,25.3439f,121.094f, --144.531f,26.7908f,121.094f, --140.625f,29.0959f,121.094f, --136.719f,29.9478f,121.094f, --132.813f,30.8054f,121.094f, --128.906f,31.9545f,121.094f, --125.0f,33.8025f,121.094f, --121.094f,35.2826f,121.094f, --117.188f,36.2373f,121.094f, --113.281f,36.7861f,121.094f, --109.375f,36.509f,121.094f, --105.469f,35.7461f,121.094f, --101.563f,33.7802f,121.094f, --97.6563f,30.788f,121.094f, --93.75f,28.1422f,121.094f, --89.8438f,26.6316f,121.094f, --85.9375f,26.0349f,121.094f, --82.0313f,24.8022f,121.094f, --78.125f,23.5217f,121.094f, --74.2188f,21.74f,121.094f, --70.3125f,20.0101f,121.094f, --66.4063f,17.8705f,121.094f, --62.5f,15.6785f,121.094f, --58.5938f,13.74f,121.094f, --54.6875f,12.3387f,121.094f, --50.7813f,11.9457f,121.094f, --46.875f,12.0102f,121.094f, --42.9688f,11.0065f,121.094f, --39.0625f,9.84571f,121.094f, --35.1563f,10.0894f,121.094f, --31.25f,10.5366f,121.094f, --27.3438f,9.94957f,121.094f, --23.4375f,11.0038f,121.094f, --19.5313f,12.8084f,121.094f, --15.625f,13.8969f,121.094f, --11.7188f,14.9146f,121.094f, --7.8125f,15.4187f,121.094f, --3.90625f,16.094f,121.094f, -0.0f,17.0612f,121.094f, -3.90625f,18.5327f,121.094f, --250.0f,2.18397f,117.188f, --246.094f,1.51628f,117.188f, --242.188f,0.628327f,117.188f, --238.281f,-0.567933f,117.188f, --234.375f,-2.01568f,117.188f, --230.469f,-3.41089f,117.188f, --226.563f,-3.82758f,117.188f, --222.656f,-5.01586f,117.188f, --218.75f,-4.74822f,117.188f, --214.844f,-3.30853f,117.188f, --210.938f,-2.32499f,117.188f, --207.031f,-1.71509f,117.188f, --203.125f,-1.19203f,117.188f, --199.219f,0.219498f,117.188f, --195.313f,1.66304f,117.188f, --191.406f,4.35105f,117.188f, --187.5f,6.33228f,117.188f, --183.594f,8.00972f,117.188f, --179.688f,9.71486f,117.188f, --175.781f,10.7727f,117.188f, --171.875f,11.358f,117.188f, --167.969f,12.5239f,117.188f, --164.063f,14.6278f,117.188f, --160.156f,17.2069f,117.188f, --156.25f,19.9779f,117.188f, --152.344f,23.4607f,117.188f, --148.438f,26.6108f,117.188f, --144.531f,28.4635f,117.188f, --140.625f,29.7705f,117.188f, --136.719f,31.0684f,117.188f, --132.813f,31.8395f,117.188f, --128.906f,32.1658f,117.188f, --125.0f,34.7478f,117.188f, --121.094f,36.0624f,117.188f, --117.188f,37.2702f,117.188f, --113.281f,37.3474f,117.188f, --109.375f,37.242f,117.188f, --105.469f,36.1544f,117.188f, --101.563f,33.403f,117.188f, --97.6563f,31.294f,117.188f, --93.75f,29.4961f,117.188f, --89.8438f,29.0556f,117.188f, --85.9375f,28.2757f,117.188f, --82.0313f,26.6322f,117.188f, --78.125f,24.8286f,117.188f, --74.2188f,22.7019f,117.188f, --70.3125f,20.4725f,117.188f, --66.4063f,17.984f,117.188f, --62.5f,16.3033f,117.188f, --58.5938f,14.2087f,117.188f, --54.6875f,12.8086f,117.188f, --50.7813f,12.5463f,117.188f, --46.875f,12.1781f,117.188f, --42.9688f,11.1391f,117.188f, --39.0625f,10.4623f,117.188f, --35.1563f,11.0528f,117.188f, --31.25f,11.454f,117.188f, --27.3438f,10.5577f,117.188f, --23.4375f,10.6328f,117.188f, --19.5313f,12.5569f,117.188f, --15.625f,13.5389f,117.188f, --11.7188f,14.3792f,117.188f, --7.8125f,15.4809f,117.188f, --3.90625f,16.1008f,117.188f, -0.0f,17.3675f,117.188f, -3.90625f,18.919f,117.188f, -}; - -btScalar Landscape06Nml[] = { --0.373915f,0.891474f,-0.255855f, --0.31015f,0.793525f,-0.52357f, --0.450332f,0.86393f,-0.225447f, --0.404472f,0.777981f,-0.480778f, --0.557629f,0.811458f,-0.174885f, --0.428564f,0.86234f,-0.269633f, --0.414608f,0.909847f,-0.0166634f, --0.208047f,0.971233f,0.115854f, --0.328757f,0.932331f,0.150588f, --0.263029f,0.937991f,0.225808f, --0.409412f,0.900937f,0.143853f, --0.455309f,0.881347f,0.126178f, --0.31951f,0.943247f,0.0905511f, --0.33825f,0.934582f,0.1102f, --0.183669f,0.981438f,0.0551769f, --0.208308f,0.97293f,0.100072f, --0.189578f,0.981862f,-0.00282566f, --0.201983f,0.97649f,0.0752952f, --0.0672914f,0.99749f,-0.0220572f, --0.118523f,0.991949f,0.0446084f, -0.102757f,0.986595f,-0.126773f, -0.00122687f,0.992675f,-0.120808f, -0.0798054f,0.967751f,-0.238933f, -0.00875196f,0.978629f,-0.205448f, -0.141554f,0.932155f,-0.333242f, -0.0918343f,0.965319f,-0.244387f, -0.372959f,0.842559f,-0.388582f, -0.280191f,0.875069f,-0.394647f, -0.314921f,0.849656f,-0.422977f, -0.258676f,0.813335f,-0.521127f, -0.266443f,0.876708f,-0.400489f, -0.358307f,0.856764f,-0.370907f, -0.280512f,0.913716f,-0.293999f, -0.337561f,0.857178f,-0.388971f, -0.0927666f,0.994197f,-0.0544758f, -0.155544f,0.953116f,-0.259567f, --0.18671f,0.979157f,-0.0799463f, --0.20939f,0.930283f,-0.301212f, --0.117108f,0.986639f,-0.113269f, --0.190516f,0.897405f,-0.397956f, --0.0703231f,0.977433f,-0.199199f, --0.142735f,0.82748f,-0.54305f, --0.00706444f,0.969596f,-0.244609f, -0.0216131f,0.85384f,-0.520087f, --0.100606f,0.961424f,-0.256011f, -0.00977565f,0.925054f,-0.379709f, --0.0412166f,0.978641f,-0.201403f, -0.099113f,0.987693f,-0.12099f, -0.0911178f,0.982669f,-0.16143f, -0.0730708f,0.986329f,-0.147703f, -0.114859f,0.978874f,-0.169152f, -0.109302f,0.983788f,-0.142175f, -0.116167f,0.976713f,-0.180378f, -0.0784892f,0.966143f,-0.24578f, -0.0196949f,0.987682f,-0.155232f, -0.0258077f,0.978923f,-0.202593f, --0.0161862f,0.979217f,-0.202168f, --0.120896f,0.935381f,-0.332336f, --0.0291128f,0.941335f,-0.336215f, --0.0776893f,0.901631f,-0.425472f, --0.0768763f,0.919716f,-0.384983f, --0.0462705f,0.951989f,-0.302615f, --0.0260847f,0.891121f,-0.453016f, --0.0818404f,0.911776f,-0.40245f, -0.152271f,0.86407f,-0.479789f, -0.0880729f,0.874485f,-0.476991f, -0.11644f,0.855496f,-0.504548f, -0.0395982f,0.813262f,-0.580548f, -0.00631598f,0.857568f,-0.514332f, --0.0780909f,0.759651f,-0.645626f, --0.0538158f,0.822232f,-0.566603f, -0.0102932f,0.785194f,-0.619165f, --0.00905015f,0.879608f,-0.475613f, -0.0439442f,0.825793f,-0.562259f, --0.15058f,0.877556f,-0.455216f, --0.0080088f,0.902753f,-0.430085f, --0.112334f,0.946952f,-0.301104f, -0.00843129f,0.966084f,-0.258092f, --0.0520095f,0.981628f,-0.183579f, --0.0023169f,0.970009f,-0.243057f, --0.0302799f,0.995335f,-0.0916051f, -0.0376961f,0.991328f,-0.125888f, -0.0852061f,0.995425f,-0.0432221f, -0.156966f,0.986644f,0.0435404f, -0.21491f,0.973384f,-0.079613f, -0.060548f,0.977921f,-0.200013f, -0.158822f,0.967125f,-0.198606f, -0.134591f,0.957423f,-0.255396f, -0.121293f,0.978974f,-0.164008f, -0.108432f,0.947609f,-0.300465f, -0.0857608f,0.988377f,-0.125519f, -0.0956294f,0.951748f,-0.291599f, --0.0286686f,0.995404f,-0.0913747f, -0.0793846f,0.975448f,-0.205424f, -0.106071f,0.990697f,0.085251f, -0.292453f,0.941038f,0.170056f, -0.371746f,0.914213f,0.161306f, -0.341006f,0.933768f,0.108596f, -0.372402f,0.920827f,0.115737f, -0.298439f,0.950662f,-0.0847083f, -0.211549f,0.974139f,0.0793788f, -0.255698f,0.96634f,-0.0283838f, --0.0706076f,0.991212f,0.111867f, -0.0490836f,0.977096f,0.207063f, --0.256838f,0.950876f,0.172827f, --0.168627f,0.937168f,0.30542f, --0.0642391f,0.963856f,0.258562f, --0.00196823f,0.905532f,0.424274f, -0.182795f,0.945782f,0.268481f, -0.13515f,0.919671f,0.368699f, -0.107184f,0.970151f,0.217528f, -0.00985613f,0.977921f,0.208742f, -0.0734564f,0.98632f,0.147572f, -0.067487f,0.972043f,0.224896f, -0.20672f,0.968081f,0.141727f, -0.186648f,0.970679f,0.151478f, -0.213561f,0.965286f,0.150383f, -0.189498f,0.980689f,0.0483704f, -0.277013f,0.94213f,0.188824f, -0.316429f,0.927757f,0.197839f, -0.225121f,0.964838f,0.135677f, -0.124434f,0.992109f,0.0153398f, -0.14416f,0.987262f,0.0673169f, -0.128154f,0.991727f,-0.0073791f, -0.1809f,0.982671f,0.0404037f, -0.125271f,0.99083f,-0.0506329f, -0.117639f,0.992303f,-0.0386759f, -0.0449726f,0.973305f,-0.225068f, -0.124809f,0.992058f,0.0156083f, -0.127135f,0.958258f,-0.256082f, -0.171896f,0.982167f,0.0761593f, -0.160304f,0.951991f,-0.260798f, --0.494953f,0.868907f,-0.00477061f, --0.512017f,0.856533f,0.0647248f, --0.564588f,0.823588f,0.0542513f, --0.480746f,0.876502f,0.0250513f, --0.397786f,0.91419f,0.0776024f, --0.3922f,0.916181f,0.0824136f, --0.288362f,0.955571f,0.0610852f, --0.109541f,0.991807f,0.0657195f, --0.119597f,0.99188f,-0.0432477f, --0.0246849f,0.992746f,-0.117673f, -0.197846f,0.964215f,-0.176481f, -0.198977f,0.940868f,-0.274182f, -0.288209f,0.884317f,-0.367314f, -0.309487f,0.847917f,-0.430411f, -0.274335f,0.939851f,-0.20352f, -0.256503f,0.958634f,-0.123399f, -0.0454718f,0.993939f,-0.100084f, --0.104233f,0.980418f,0.167081f, --0.137204f,0.957647f,0.253153f, --0.0909923f,0.97094f,0.221352f, --0.0588081f,0.977218f,0.203928f, -0.0555628f,0.971956f,0.228506f, -0.00693538f,0.995197f,0.0976442f, -0.0112691f,0.996103f,-0.0874744f, -0.104487f,0.972486f,-0.208215f, -0.102504f,0.971128f,-0.215412f, -0.0933319f,0.976682f,-0.193342f, -0.023135f,0.974909f,-0.221399f, -0.0195254f,0.964185f,-0.264511f, -0.0843961f,0.966003f,-0.244368f, -0.0791804f,0.94997f,-0.30214f, -0.048562f,0.904645f,-0.423391f, -0.168302f,0.901104f,-0.399607f, -0.0460994f,0.899241f,-0.435018f, --0.0201301f,0.942734f,-0.332937f, --0.0651933f,0.964794f,-0.254799f, --0.107417f,0.971064f,-0.213298f, --0.17484f,0.97454f,-0.140369f, --0.26177f,0.957564f,-0.120611f, --0.18964f,0.980348f,-0.0543506f, --0.0244255f,0.999511f,-0.0195208f, -0.0943164f,0.983888f,-0.151887f, -0.241216f,0.961222f,-0.133665f, -0.186016f,0.976207f,-0.111437f, -0.0288865f,0.998091f,-0.0545842f, --0.00269516f,0.997826f,0.0658428f, --0.0454406f,0.988515f,0.144131f, -0.0349744f,0.994103f,0.102646f, -0.310638f,0.939659f,0.143339f, -0.362637f,0.904005f,0.226428f, -0.268459f,0.940968f,0.206177f, --0.0101438f,0.990408f,0.137803f, --0.259956f,0.964753f,0.0409231f, --0.105214f,0.99436f,0.0133734f, -0.151003f,0.984401f,0.0902917f, -0.153972f,0.971331f,0.181133f, -0.131893f,0.982033f,0.134962f, -0.145326f,0.983866f,0.104346f, -0.172165f,0.970545f,0.16853f, -0.260168f,0.947172f,0.18756f, -0.265906f,0.934787f,0.235514f, -0.175251f,0.956563f,0.232968f, -0.205308f,0.948623f,0.240753f, -0.093567f,0.968565f,0.230493f, -0.000708259f,0.964766f,0.263107f, -0.00657781f,0.964909f,0.262504f, --0.520396f,0.851586f,0.063156f, --0.521936f,0.850242f,0.0683468f, --0.537166f,0.843365f,0.0137284f, --0.507784f,0.86143f,-0.00972442f, --0.393238f,0.917684f,0.0567504f, --0.362634f,0.931285f,-0.0347048f, --0.298916f,0.951591f,-0.0715749f, --0.125797f,0.991634f,-0.0289454f, -0.00629701f,0.999979f,0.00117199f, -0.0170902f,0.994718f,-0.101214f, -0.290594f,0.952688f,-0.0891078f, -0.285259f,0.936469f,-0.20409f, -0.342737f,0.918097f,-0.199071f, -0.262981f,0.956466f,-0.126547f, --0.000199178f,0.996828f,-0.0795833f, -0.16652f,0.978742f,0.119733f, -0.0382843f,0.984413f,0.171653f, --0.277981f,0.950703f,0.137441f, --0.18354f,0.954113f,0.236605f, --0.0382213f,0.967232f,0.251001f, --0.0471282f,0.983482f,0.174763f, -0.05509f,0.990469f,0.126237f, -0.154415f,0.97865f,0.135647f, -0.187824f,0.979878f,0.0675348f, -0.226039f,0.971999f,-0.0642243f, -0.0780765f,0.982532f,-0.168921f, -0.109774f,0.985685f,-0.127961f, -0.112009f,0.982676f,-0.147653f, -0.0632751f,0.975786f,-0.209375f, -0.0264674f,0.962968f,-0.268312f, -0.10845f,0.959018f,-0.261771f, -0.0643921f,0.961817f,-0.266009f, -0.166593f,0.964859f,-0.203209f, -0.0747121f,0.973608f,-0.215653f, --0.165051f,0.968419f,-0.186874f, --0.148108f,0.983106f,-0.10755f, --0.179372f,0.979451f,-0.0922022f, --0.237948f,0.970437f,-0.0404116f, --0.2824f,0.959184f,-0.014723f, --0.146028f,0.988959f,-0.0252228f, -0.05616f,0.991975f,-0.113275f, -0.196359f,0.969761f,-0.144935f, -0.181455f,0.976082f,-0.119739f, -0.110973f,0.993178f,-0.035804f, --0.0390828f,0.998775f,0.0303582f, --0.136356f,0.988616f,0.0636122f, --0.0521843f,0.980102f,0.191512f, -0.0572854f,0.981374f,0.183367f, -0.238568f,0.946616f,0.216801f, -0.340107f,0.907515f,0.246464f, -0.312043f,0.926088f,0.212108f, -0.0846085f,0.98223f,0.167527f, --0.163231f,0.986101f,0.0309937f, --0.143013f,0.98971f,-0.00457425f, -0.0291614f,0.993948f,0.105909f, -0.107232f,0.980268f,0.16606f, -0.13514f,0.977368f,0.162754f, -0.171582f,0.963454f,0.205708f, -0.160805f,0.97344f,0.162963f, -0.206565f,0.959827f,0.189905f, -0.203733f,0.939018f,0.277016f, -0.156541f,0.940477f,0.30166f, -0.14264f,0.938158f,0.315457f, -0.0877292f,0.924317f,0.371405f, -0.0427952f,0.921735f,0.385453f, -0.102307f,0.915297f,0.389569f, --0.518725f,0.854828f,-0.0138881f, --0.516652f,0.85588f,0.023226f, --0.490153f,0.869598f,0.0595683f, --0.505693f,0.862598f,-0.0140982f, --0.393758f,0.918824f,-0.0267811f, --0.308114f,0.951253f,-0.0135724f, --0.25353f,0.967309f,0.00592796f, --0.183935f,0.978787f,-0.0902442f, --0.0335384f,0.998587f,-0.0412272f, -0.0888831f,0.995408f,-0.0355216f, -0.275528f,0.951614f,-0.136073f, -0.317879f,0.941106f,-0.115209f, -0.22556f,0.974028f,-0.0197739f, -0.262726f,0.954534f,0.140851f, -0.0383338f,0.998565f,0.0373963f, -0.0108706f,0.999386f,-0.0333096f, -0.0472758f,0.987524f,0.150202f, --0.22401f,0.968166f,0.111686f, --0.221122f,0.974472f,0.0388438f, --0.0303833f,0.999266f,0.0233175f, -0.0911048f,0.995841f,0.000284795f, -0.0750561f,0.987717f,-0.137044f, -0.140099f,0.985231f,-0.098447f, -0.159287f,0.981153f,-0.10939f, -0.301657f,0.953265f,-0.0169985f, -0.140836f,0.988971f,-0.0458453f, -0.074059f,0.996008f,-0.0498236f, -0.0873182f,0.996023f,-0.0176849f, -0.132872f,0.990946f,0.019257f, -0.15553f,0.982355f,-0.103875f, -0.133638f,0.955183f,-0.264135f, -0.0505536f,0.951293f,-0.304114f, -0.0663471f,0.962897f,-0.261588f, -0.0679148f,0.992885f,-0.0978063f, --0.186921f,0.976146f,-0.110452f, --0.16844f,0.980926f,-0.0970201f, --0.17716f,0.9831f,-0.0461376f, --0.252028f,0.967676f,-0.00920485f, --0.25063f,0.967236f,-0.0404965f, --0.0995772f,0.983353f,-0.151991f, -0.0940064f,0.974734f,-0.202626f, -0.146102f,0.962693f,-0.227766f, -0.10874f,0.966405f,-0.232891f, --0.0013416f,0.987029f,-0.160533f, --0.0603915f,0.998129f,0.00954783f, --0.17946f,0.98293f,0.040526f, --0.153066f,0.978461f,0.138509f, -0.00546813f,0.977756f,0.209673f, -0.202775f,0.944505f,0.258443f, -0.334531f,0.904949f,0.262976f, -0.339399f,0.898505f,0.278385f, -0.212792f,0.950144f,0.227917f, --0.0583572f,0.996371f,0.0619671f, --0.218128f,0.975136f,0.0391184f, --0.0703437f,0.983861f,0.16453f, -0.113041f,0.961301f,0.25124f, -0.0979771f,0.959037f,0.265798f, -0.151767f,0.929082f,0.337302f, -0.185905f,0.937423f,0.294409f, -0.169611f,0.955662f,0.240713f, -0.159864f,0.96582f,0.204047f, -0.151538f,0.965571f,0.211446f, -0.11661f,0.954852f,0.273241f, -0.0708035f,0.941966f,0.328158f, --0.00402057f,0.956357f,0.292174f, -0.0123647f,0.956622f,0.291069f, --0.626234f,0.777268f,-0.0607036f, --0.590408f,0.806122f,0.0398278f, --0.512253f,0.84829f,0.134171f, --0.429387f,0.891471f,0.144588f, --0.394702f,0.915407f,0.0789917f, --0.352114f,0.935018f,0.0419128f, --0.269358f,0.962596f,0.0292454f, --0.0709514f,0.996127f,0.0519312f, --0.0485279f,0.996417f,-0.069268f, -0.139101f,0.983953f,-0.111751f, -0.369972f,0.916386f,-0.152833f, -0.200502f,0.96864f,-0.146752f, -0.063154f,0.997971f,0.00814434f, -0.218613f,0.964332f,0.149236f, -0.233367f,0.966768f,0.104401f, -0.00832713f,0.995958f,-0.0894382f, --0.101235f,0.994608f,-0.0224841f, --0.188929f,0.980627f,0.051742f, --0.131276f,0.990999f,0.026226f, -0.0111642f,0.996226f,-0.0860703f, -0.127344f,0.982944f,-0.132683f, -0.133649f,0.978353f,-0.157998f, -0.127047f,0.978674f,-0.161419f, -0.154013f,0.97768f,-0.142902f, -0.207952f,0.974577f,-0.0833996f, -0.130584f,0.99044f,-0.0444555f, -0.0527996f,0.997244f,-0.0521173f, -0.0873033f,0.993919f,-0.0671111f, -0.134372f,0.9813f,-0.137819f, -0.302979f,0.937443f,-0.171475f, -0.235087f,0.922651f,-0.305694f, -0.116878f,0.945593f,-0.303632f, --0.0892912f,0.947762f,-0.306226f, --0.0487728f,0.993685f,-0.101049f, --0.161853f,0.9816f,-0.101314f, --0.226351f,0.97061f,-0.0817454f, --0.270044f,0.962691f,-0.0173905f, --0.294262f,0.954053f,0.0565031f, --0.151555f,0.985239f,0.0795882f, -0.00297078f,0.999916f,-0.0126498f, -0.158118f,0.985077f,-0.067991f, -0.232676f,0.957923f,-0.168067f, -0.184787f,0.953241f,-0.239135f, --0.102652f,0.943763f,-0.314284f, --0.249925f,0.941897f,-0.224429f, --0.230538f,0.969668f,-0.0812203f, --0.256878f,0.964046f,-0.0680376f, --0.0528332f,0.99816f,0.0297627f, -0.16253f,0.979605f,0.118148f, -0.292443f,0.935246f,0.199479f, -0.337448f,0.899957f,0.276054f, -0.288581f,0.911989f,0.291541f, -0.0381605f,0.961598f,0.271797f, --0.217082f,0.942133f,0.25546f, --0.187341f,0.947099f,0.26059f, -0.0122725f,0.939216f,0.343107f, -0.0450967f,0.927047f,0.372224f, -0.0805118f,0.921403f,0.380178f, -0.269621f,0.884781f,0.380089f, -0.278457f,0.920235f,0.275007f, -0.240432f,0.950543f,0.19662f, -0.110916f,0.980787f,0.160482f, -0.0190768f,0.974013f,0.225685f, -0.0421661f,0.96323f,0.26535f, -0.0623149f,0.965243f,0.253816f, -0.0484827f,0.970002f,0.238214f, --0.675447f,0.735679f,-0.050474f, --0.639324f,0.768795f,-0.0148056f, --0.556082f,0.830482f,0.0327513f, --0.42972f,0.893254f,0.132053f, --0.365389f,0.922739f,0.122653f, --0.226979f,0.966229f,0.121993f, --0.221717f,0.973751f,-0.051483f, --0.0779728f,0.987923f,-0.133899f, -0.0930073f,0.979917f,-0.176386f, -0.192144f,0.942491f,-0.27348f, -0.309496f,0.916222f,-0.254459f, -0.155051f,0.977443f,-0.143405f, --0.0554135f,0.989739f,-0.131708f, -0.110672f,0.991805f,-0.0638304f, -0.310319f,0.950296f,0.0252996f, -0.103349f,0.993006f,-0.0570824f, --0.143599f,0.988502f,-0.0473533f, --0.226116f,0.973312f,-0.0391734f, --0.100068f,0.994649f,-0.0257001f, -0.124656f,0.989757f,-0.0695779f, -0.137305f,0.97907f,-0.150231f, -0.12072f,0.989818f,-0.075415f, -0.132256f,0.990827f,-0.0277589f, -0.0994133f,0.991446f,-0.0845708f, -0.16457f,0.984921f,-0.0533595f, -0.161357f,0.986289f,-0.034624f, -0.0776395f,0.993281f,-0.0858198f, -0.196429f,0.972629f,-0.124127f, -0.213597f,0.93634f,-0.278645f, -0.333587f,0.906552f,-0.258619f, -0.264447f,0.928271f,-0.261499f, -0.0224352f,0.968338f,-0.248633f, --0.153007f,0.973949f,-0.167368f, --0.171971f,0.976037f,-0.133332f, --0.164739f,0.982172f,-0.0905542f, --0.256427f,0.965345f,-0.0485236f, --0.266685f,0.961164f,-0.0710119f, --0.315314f,0.936338f,-0.154429f, --0.180509f,0.974939f,-0.130043f, -0.0306802f,0.996715f,-0.0749509f, -0.181216f,0.981966f,-0.0538862f, -0.308423f,0.951239f,-0.0044789f, -0.193412f,0.981099f,-0.00609358f, --0.00883535f,0.999181f,0.039479f, --0.293629f,0.95203f,-0.0861418f, --0.288511f,0.952707f,-0.0954526f, --0.270635f,0.961763f,-0.0420598f, --0.176015f,0.982039f,0.0679556f, -0.0472003f,0.981703f,0.184478f, -0.185293f,0.947852f,0.259313f, -0.26012f,0.901797f,0.345109f, -0.219376f,0.887657f,0.404894f, -0.015248f,0.892187f,0.451408f, --0.212632f,0.887876f,0.407999f, --0.145904f,0.908525f,0.391529f, --0.0226457f,0.932703f,0.359933f, -0.0874951f,0.910834f,0.403393f, -0.125007f,0.935932f,0.329249f, -0.288568f,0.918223f,0.271284f, -0.34457f,0.896771f,0.277619f, -0.261558f,0.928634f,0.263108f, -0.0802026f,0.961218f,0.26387f, -0.0163948f,0.952196f,0.305047f, -0.0566148f,0.964684f,0.257253f, -0.102872f,0.970943f,0.216073f, -0.0353576f,0.994079f,0.102749f, --0.569322f,0.820332f,-0.0541097f, --0.616679f,0.764093f,-0.18939f, --0.605157f,0.764062f,-0.223597f, --0.50856f,0.856476f,-0.0884048f, --0.372491f,0.927008f,0.0436669f, --0.225048f,0.969626f,0.0958063f, --0.0508165f,0.996801f,0.0616925f, -0.0586358f,0.990558f,-0.123919f, -0.126111f,0.966195f,-0.224862f, -0.229194f,0.950926f,-0.207869f, -0.252375f,0.936474f,-0.243564f, -0.0944308f,0.971404f,-0.217846f, --0.0355117f,0.972557f,-0.229939f, -0.0856503f,0.962722f,-0.256575f, -0.220711f,0.941477f,-0.254769f, -0.0934053f,0.989629f,-0.109133f, --0.156897f,0.986627f,-0.0441527f, --0.224564f,0.970579f,-0.0868729f, --0.0948813f,0.992594f,-0.0758608f, -0.168753f,0.983045f,-0.0717275f, -0.110894f,0.991432f,-0.0690319f, --0.0147158f,0.998265f,0.0570193f, -0.10964f,0.979883f,0.16676f, -0.213201f,0.96906f,0.124368f, -0.195873f,0.980015f,-0.0346975f, -0.162476f,0.975738f,-0.146751f, -0.136902f,0.9692f,-0.204718f, -0.244929f,0.933568f,-0.26165f, -0.288988f,0.918188f,-0.270954f, -0.254175f,0.924529f,-0.283974f, -0.243695f,0.954587f,-0.171397f, --0.00175415f,0.99017f,-0.13986f, --0.165264f,0.975245f,-0.146916f, --0.185767f,0.967008f,-0.174319f, --0.191354f,0.972667f,-0.131541f, --0.271241f,0.952999f,-0.134987f, --0.1847f,0.972855f,-0.139424f, --0.209304f,0.957842f,-0.1968f, --0.243194f,0.936f,-0.254482f, --0.0210884f,0.983365f,-0.18041f, -0.0761402f,0.989042f,-0.126486f, -0.185372f,0.981538f,0.047127f, -0.117606f,0.973445f,0.196404f, --0.0453061f,0.954332f,0.295292f, --0.152267f,0.943756f,0.293495f, --0.272105f,0.944288f,0.185149f, --0.341417f,0.929337f,0.140592f, --0.316477f,0.938022f,0.141266f, --0.0291064f,0.965694f,0.258045f, -0.139271f,0.938861f,0.31487f, -0.16066f,0.916793f,0.36562f, -0.163005f,0.879828f,0.446466f, -0.088987f,0.884248f,0.458461f, --0.126118f,0.932849f,0.337472f, --0.101381f,0.953175f,0.284919f, --0.0233764f,0.967738f,0.250872f, -0.0600962f,0.965273f,0.254236f, -0.184472f,0.94915f,0.255117f, -0.293565f,0.911429f,0.288301f, -0.309916f,0.89217f,0.328611f, -0.260108f,0.896879f,0.357704f, -0.0945809f,0.935133f,0.341439f, -0.0335311f,0.964748f,0.261032f, -0.0942492f,0.979731f,0.176762f, -0.167685f,0.967918f,0.187127f, -0.258869f,0.942682f,0.210564f, --0.367443f,0.929937f,-0.0142236f, --0.499723f,0.853143f,-0.149749f, --0.60287f,0.768676f,-0.213739f, --0.628893f,0.759885f,-0.164524f, --0.498958f,0.866588f,-0.00814533f, --0.266358f,0.961387f,0.0691948f, -0.0209306f,0.994406f,0.103533f, -0.18825f,0.979809f,0.0673512f, -0.186929f,0.982347f,-0.00722501f, -0.221871f,0.971137f,-0.0875532f, -0.321849f,0.94224f,-0.0927163f, -0.129468f,0.975377f,-0.178544f, --0.0214597f,0.975387f,-0.219454f, -0.135606f,0.972282f,-0.19047f, -0.166947f,0.968719f,-0.18361f, --0.0604962f,0.993281f,-0.0986602f, --0.147333f,0.985679f,-0.0820398f, --0.177745f,0.972235f,-0.152201f, --0.13389f,0.979994f,-0.147259f, -0.107621f,0.993068f,-0.0472599f, -0.0496354f,0.9956f,0.0794756f, --0.114638f,0.990271f,0.0788811f, -0.0386746f,0.994961f,0.0924988f, -0.257639f,0.951075f,0.170521f, -0.371556f,0.918219f,0.137186f, -0.306734f,0.951256f,-0.0320228f, -0.251981f,0.957147f,-0.142743f, -0.259956f,0.937158f,-0.232721f, -0.273432f,0.938847f,-0.209289f, -0.242378f,0.942977f,-0.228139f, -0.135357f,0.967026f,-0.21573f, --0.0237633f,0.989278f,-0.144096f, --0.131198f,0.984621f,-0.11536f, --0.202181f,0.972555f,-0.115152f, --0.221308f,0.9725f,-0.0725642f, --0.229514f,0.969023f,-0.0912046f, --0.218972f,0.967608f,-0.125639f, --0.212632f,0.976006f,-0.0469096f, --0.218674f,0.974967f,-0.0402565f, --0.122558f,0.989962f,-0.0703905f, -0.0166378f,0.999654f,0.0203946f, --0.0104674f,0.996634f,0.0813074f, --0.0169459f,0.959611f,0.28082f, --0.0960206f,0.935549f,0.339894f, --0.167668f,0.926307f,0.337405f, --0.198261f,0.909687f,0.364915f, --0.193335f,0.935754f,0.294935f, --0.259424f,0.960196f,0.103554f, --0.126539f,0.989254f,0.073239f, -0.0445245f,0.981975f,0.183692f, -0.070195f,0.9396f,0.334999f, -0.116045f,0.901991f,0.415867f, -0.160437f,0.912696f,0.375828f, --0.00552585f,0.963507f,0.267627f, --0.111729f,0.971129f,0.210774f, -0.00935468f,0.964114f,0.265323f, -0.084172f,0.968508f,0.234323f, -0.13752f,0.967988f,0.209968f, -0.208575f,0.947382f,0.242826f, -0.289545f,0.920265f,0.263203f, -0.228797f,0.929214f,0.290195f, -0.185013f,0.916649f,0.354295f, -0.160823f,0.950358f,0.266374f, -0.183734f,0.959776f,0.212302f, -0.0865279f,0.982909f,0.162492f, -0.143782f,0.963199f,0.227098f, --0.40108f,0.898526f,-0.178287f, --0.447805f,0.881163f,-0.15173f, --0.619629f,0.769135f,-0.156501f, --0.663764f,0.743697f,-0.0795752f, --0.534645f,0.83883f,-0.102567f, --0.293541f,0.950588f,-0.101077f, --0.0154638f,0.998684f,-0.048892f, -0.170364f,0.984269f,-0.0468065f, -0.272586f,0.961403f,-0.0374194f, -0.276742f,0.955139f,-0.105472f, -0.3572f,0.929651f,-0.0903144f, -0.185848f,0.967712f,-0.170277f, --0.00167559f,0.978573f,-0.205892f, -0.0698456f,0.971595f,-0.226108f, -0.0821889f,0.985623f,-0.147624f, --0.0376538f,0.998466f,-0.0405822f, --0.0983702f,0.988409f,-0.115634f, --0.140633f,0.987279f,-0.0741791f, --0.185061f,0.981813f,-0.0423742f, --0.0718387f,0.997236f,0.0189748f, -0.00846681f,0.991398f,0.130611f, -0.00870324f,0.999937f,0.00714861f, -0.043927f,0.984772f,-0.168207f, -0.173423f,0.967972f,-0.181535f, -0.363952f,0.925731f,-0.10277f, -0.415083f,0.906279f,-0.0797799f, -0.295656f,0.934439f,-0.198525f, -0.285411f,0.94244f,-0.174208f, -0.286359f,0.952372f,-0.104818f, -0.274f,0.954057f,-0.121243f, -0.125082f,0.985323f,-0.116157f, --0.0728358f,0.994219f,-0.0788892f, --0.183935f,0.981488f,-0.0533801f, --0.254614f,0.966975f,0.0114848f, --0.238556f,0.965368f,0.105624f, --0.207746f,0.971319f,0.115674f, --0.215469f,0.971204f,0.101667f, --0.267107f,0.96138f,0.0663435f, --0.207576f,0.97646f,0.0586408f, --0.117358f,0.991748f,0.0516096f, --0.0500459f,0.994852f,0.0881198f, --0.093813f,0.986665f,0.133006f, --0.152698f,0.969858f,0.18989f, --0.1251f,0.953778f,0.273236f, --0.165614f,0.925222f,0.341373f, --0.185498f,0.929562f,0.3186f, --0.115032f,0.960173f,0.254626f, --0.110794f,0.97049f,0.214181f, --0.10146f,0.992209f,0.072301f, --0.111958f,0.99337f,0.026117f, --0.0975457f,0.980844f,0.168611f, -0.086247f,0.976994f,0.195051f, -0.241113f,0.947591f,0.20961f, -0.0868755f,0.959222f,0.268972f, --0.141994f,0.949853f,0.278599f, --0.0178282f,0.934163f,0.356401f, -0.0726972f,0.940594f,0.331659f, -0.165529f,0.917627f,0.361333f, -0.223743f,0.920886f,0.319231f, -0.302189f,0.900958f,0.311378f, -0.181249f,0.939198f,0.291642f, -0.15269f,0.934294f,0.32215f, -0.181639f,0.932767f,0.311371f, -0.174351f,0.925291f,0.336805f, -0.107261f,0.938861f,0.327163f, -0.0621733f,0.949825f,0.306542f, --0.336425f,0.924181f,-0.180852f, --0.467727f,0.856958f,-0.216458f, --0.602238f,0.781026f,-0.165251f, --0.647361f,0.734151f,-0.204809f, --0.50962f,0.821617f,-0.255407f, --0.329682f,0.908003f,-0.258533f, --0.0514578f,0.97257f,-0.226846f, -0.197411f,0.959315f,-0.201849f, -0.264136f,0.946231f,-0.186758f, -0.271989f,0.947232f,-0.169627f, -0.342182f,0.926412f,-0.157076f, -0.226068f,0.960114f,-0.164544f, -0.0298714f,0.986995f,-0.157954f, -0.0947848f,0.979734f,-0.176458f, -0.0184686f,0.978597f,-0.204958f, --0.115417f,0.979217f,-0.166771f, --0.133289f,0.987752f,-0.0811202f, --0.254272f,0.966705f,0.0287551f, --0.238007f,0.962858f,0.127508f, --0.0805244f,0.989118f,0.123135f, -0.0609568f,0.996652f,0.0544921f, -0.185345f,0.981121f,-0.0552078f, -0.246025f,0.947034f,-0.206392f, -0.188933f,0.898455f,-0.396338f, -0.253355f,0.896162f,-0.364288f, -0.431339f,0.877591f,-0.209237f, -0.33179f,0.90994f,-0.248847f, -0.173449f,0.964884f,-0.197267f, -0.195848f,0.971573f,-0.133f, -0.242458f,0.968164f,-0.0622215f, -0.0872514f,0.995924f,0.0228468f, --0.104392f,0.994289f,0.0221861f, --0.212909f,0.976423f,0.0355982f, --0.329497f,0.936369f,0.121017f, --0.322708f,0.91595f,0.238528f, --0.206447f,0.929806f,0.304697f, --0.167225f,0.947523f,0.272462f, --0.184928f,0.959175f,0.213976f, --0.173343f,0.972643f,0.154651f, --0.113658f,0.986612f,0.116951f, --0.0855668f,0.994338f,0.0630098f, --0.114452f,0.992427f,0.0446133f, --0.159653f,0.986324f,0.0409453f, --0.238644f,0.971105f,-0.00174015f, --0.263001f,0.962569f,0.0655076f, --0.150786f,0.97653f,0.153794f, --0.0789227f,0.973225f,0.21588f, --0.0862836f,0.967962f,0.235807f, -0.0429765f,0.969236f,0.242351f, --0.0440941f,0.992467f,0.114305f, --0.115348f,0.992717f,-0.0347649f, -0.0790257f,0.995351f,-0.0550642f, -0.126473f,0.98592f,0.109395f, --0.0409487f,0.953557f,0.298417f, --0.206016f,0.913735f,0.350208f, --0.0633912f,0.92675f,0.370293f, -0.0785739f,0.913264f,0.399719f, -0.177609f,0.899902f,0.398285f, -0.238034f,0.923241f,0.301604f, -0.255943f,0.926508f,0.27582f, -0.232022f,0.914012f,0.332787f, -0.162081f,0.936068f,0.312259f, -0.177513f,0.926269f,0.332437f, -0.185532f,0.921601f,0.340924f, -0.173632f,0.950356f,0.258214f, -0.111166f,0.980225f,0.163712f, --0.0923042f,0.995727f,-0.00270435f, --0.408896f,0.902709f,-0.133863f, --0.602302f,0.79183f,-0.10118f, --0.624884f,0.765307f,-0.154352f, --0.552184f,0.809036f,-0.201379f, --0.343811f,0.917937f,-0.197956f, --0.0748905f,0.960991f,-0.266248f, -0.134998f,0.958099f,-0.252631f, -0.206547f,0.962195f,-0.177534f, -0.264489f,0.960553f,-0.0859237f, -0.340814f,0.939333f,-0.0387315f, -0.235136f,0.971602f,-0.0264814f, -0.0144037f,0.991275f,-0.131023f, -0.053242f,0.991683f,-0.117173f, -0.0920982f,0.995717f,0.00816044f, --0.164789f,0.980567f,-0.106454f, --0.239234f,0.97035f,-0.0344802f, --0.316227f,0.948287f,0.0274269f, --0.260328f,0.965493f,0.00728909f, --0.00635978f,0.999169f,0.0402508f, -0.152101f,0.988094f,-0.023159f, -0.261272f,0.960304f,-0.0977355f, -0.363311f,0.923635f,-0.122082f, -0.303719f,0.94151f,-0.145994f, -0.209258f,0.960639f,-0.182713f, -0.299827f,0.935978f,-0.184526f, -0.310225f,0.948937f,-0.0572597f, -0.134013f,0.988326f,-0.0724722f, -0.173294f,0.983169f,-0.0578515f, -0.150596f,0.988589f,-0.00352276f, -0.0218728f,0.99535f,0.093809f, --0.090936f,0.980927f,0.171796f, --0.253868f,0.938693f,0.233251f, --0.400767f,0.870372f,0.286074f, --0.392418f,0.877786f,0.274773f, --0.219224f,0.925755f,0.308089f, --0.114269f,0.92983f,0.349798f, --0.147993f,0.921652f,0.358685f, --0.138523f,0.925121f,0.353501f, --0.0290531f,0.945854f,0.32329f, -0.0440242f,0.978167f,0.203106f, --0.0576599f,0.997178f,0.0480716f, --0.156038f,0.987653f,-0.0139414f, --0.143901f,0.989541f,-0.0100722f, --0.293059f,0.951458f,-0.0940478f, --0.298958f,0.953936f,-0.0251005f, --0.203233f,0.972711f,0.111937f, --0.134891f,0.965356f,0.223367f, --0.0182075f,0.958686f,0.283884f, -0.123188f,0.934113f,0.33505f, -0.0872404f,0.983488f,0.15856f, -0.00440122f,0.999845f,-0.0170726f, --0.143813f,0.987727f,0.0609306f, --0.192356f,0.942318f,0.273927f, --0.141157f,0.926207f,0.349593f, --0.0674076f,0.959831f,0.272363f, -0.0730938f,0.959591f,0.27174f, -0.173541f,0.961002f,0.215311f, -0.369237f,0.888798f,0.271483f, -0.277281f,0.944196f,0.177789f, -0.215184f,0.95909f,0.183961f, -0.13088f,0.973624f,0.186887f, -0.130607f,0.953976f,0.269946f, -0.212637f,0.930888f,0.297042f, -0.306976f,0.920481f,0.241829f, -0.280289f,0.947029f,0.156763f, -0.0123331f,0.988431f,0.151171f, --0.297868f,0.952288f,0.0664969f, --0.612229f,0.786332f,-0.0828155f, --0.600387f,0.789438f,-0.127758f, --0.542733f,0.826042f,-0.151972f, --0.320126f,0.93364f,-0.160733f, -0.000589343f,0.981171f,-0.193142f, -0.0980808f,0.971507f,-0.215763f, -0.124748f,0.986178f,-0.109047f, -0.199191f,0.978521f,-0.0531043f, -0.247764f,0.965734f,-0.0772702f, -0.318214f,0.948019f,-0.000766246f, -0.183917f,0.97162f,-0.148756f, --0.0488566f,0.965709f,-0.25499f, --0.0165518f,0.99654f,-0.0814512f, --0.0793375f,0.996823f,-0.00696945f, --0.310737f,0.950344f,-0.0169863f, --0.292329f,0.952706f,0.0830406f, --0.217409f,0.975529f,0.0328f, --0.044323f,0.995765f,-0.0805443f, -0.185778f,0.977354f,-0.101323f, -0.271832f,0.958328f,-0.0878372f, -0.32088f,0.946924f,0.019279f, -0.252443f,0.960909f,0.113697f, -0.290552f,0.947257f,0.135217f, -0.289238f,0.957058f,-0.0195476f, -0.286171f,0.957114f,0.0451517f, -0.220997f,0.975269f,0.00320969f, -0.0994052f,0.991378f,-0.0853655f, -0.0429034f,0.994069f,0.099932f, --0.0709962f,0.952332f,0.296687f, --0.214284f,0.897012f,0.38659f, --0.318505f,0.838002f,0.443066f, --0.352211f,0.849573f,0.392649f, --0.30013f,0.898851f,0.319356f, --0.250783f,0.928599f,0.273517f, --0.200191f,0.919896f,0.337217f, --0.179596f,0.907951f,0.378643f, --0.135043f,0.919145f,0.370049f, -0.0368434f,0.920312f,0.389447f, -0.16581f,0.924682f,0.34274f, -0.0946402f,0.961136f,0.259346f, --0.111217f,0.985094f,0.131228f, --0.13188f,0.98641f,0.0979915f, --0.254562f,0.966634f,0.028585f, --0.324299f,0.94515f,-0.0390035f, --0.293729f,0.954471f,-0.0520494f, --0.247862f,0.966889f,0.0607495f, --0.0794894f,0.980131f,0.181727f, -0.101373f,0.964007f,0.245794f, -0.197084f,0.947574f,0.251517f, -0.177833f,0.964662f,0.194431f, --0.161149f,0.986485f,0.0296539f, --0.316387f,0.94824f,0.02721f, --0.207789f,0.976057f,0.0643106f, --0.00905536f,0.99298f,0.117933f, -0.141544f,0.987983f,0.062088f, -0.189336f,0.98168f,-0.0213574f, -0.273454f,0.960225f,0.0564811f, -0.315806f,0.930776f,0.184181f, -0.235283f,0.955417f,0.17838f, -0.124851f,0.982004f,0.141708f, -0.0792257f,0.989953f,0.117114f, -0.210835f,0.9739f,0.0840678f, -0.31429f,0.942479f,0.113817f, -0.350241f,0.914076f,0.20444f, -0.0694749f,0.983151f,0.169077f, --0.169784f,0.982476f,0.076909f, --0.507716f,0.850133f,-0.139637f, --0.564212f,0.800379f,-0.202629f, --0.514428f,0.829332f,-0.218112f, --0.369417f,0.885582f,-0.28156f, -0.00180169f,0.974596f,-0.223965f, -0.0258344f,0.976386f,-0.214484f, --0.024f,0.996868f,-0.0753534f, -0.239975f,0.969587f,0.0481022f, -0.34797f,0.931588f,-0.105173f, -0.316295f,0.909782f,-0.268803f, -0.250422f,0.912989f,-0.322087f, --0.0369252f,0.950156f,-0.30958f, --0.207502f,0.950188f,-0.232562f, --0.167975f,0.985706f,-0.0129903f, --0.315712f,0.948273f,0.0332206f, --0.386969f,0.921609f,-0.0298463f, --0.12805f,0.991662f,0.0144567f, -0.102711f,0.991948f,-0.0740863f, -0.21217f,0.967879f,-0.134884f, -0.167738f,0.98185f,-0.0885116f, -0.176293f,0.984226f,0.0148055f, -0.233609f,0.968608f,0.0850021f, -0.30166f,0.950058f,0.0799509f, -0.387591f,0.914349f,0.117215f, -0.244561f,0.968825f,0.0395933f, -0.294792f,0.954101f,0.0528114f, -0.0843374f,0.996399f,0.00873819f, --0.221704f,0.963341f,0.151067f, --0.335663f,0.86809f,0.365719f, --0.262618f,0.850841f,0.455085f, --0.222709f,0.867235f,0.445313f, --0.24917f,0.884312f,0.39485f, --0.238336f,0.907466f,0.345978f, --0.270997f,0.917236f,0.291956f, --0.229194f,0.914337f,0.333853f, --0.15897f,0.933059f,0.322692f, --0.100911f,0.956766f,0.272794f, --0.0211523f,0.974532f,0.223248f, -0.201297f,0.933635f,0.29632f, -0.155914f,0.954519f,0.254134f, --0.0218294f,0.971898f,0.234389f, --0.079809f,0.976613f,0.199646f, --0.0874479f,0.990326f,0.10774f, --0.258167f,0.959037f,-0.116608f, --0.306401f,0.945943f,-0.106352f, --0.341562f,0.936596f,-0.0782577f, --0.199458f,0.979359f,-0.0327519f, -0.0464294f,0.997405f,0.0550308f, -0.191208f,0.978076f,0.0825056f, -0.238583f,0.96711f,0.0881811f, --0.0888379f,0.993271f,0.0743033f, --0.264236f,0.955782f,0.129075f, --0.188913f,0.981529f,0.0302016f, --0.0145673f,0.997134f,-0.0742444f, -0.169633f,0.978852f,-0.114338f, -0.20381f,0.976959f,-0.0633407f, -0.175314f,0.984354f,-0.0176521f, -0.240514f,0.967819f,0.0740208f, -0.244396f,0.964775f,0.0973589f, -0.18832f,0.980026f,0.0639107f, -0.156937f,0.987568f,-0.00896143f, -0.262584f,0.963481f,-0.0524761f, -0.165405f,0.986171f,-0.0103631f, -0.180443f,0.960877f,0.210132f, -0.22428f,0.955199f,0.193116f, -0.0674282f,0.994387f,0.0815297f, --0.367623f,0.911009f,-0.186858f, --0.569756f,0.78903f,-0.229805f, --0.492917f,0.847419f,-0.197265f, --0.366141f,0.895981f,-0.251313f, --0.0646011f,0.969824f,-0.235091f, -0.018291f,0.976889f,-0.212961f, --0.170757f,0.95698f,-0.234588f, -0.158661f,0.98264f,-0.0961541f, -0.509439f,0.859861f,-0.0333235f, -0.45757f,0.865797f,-0.202548f, -0.211042f,0.949174f,-0.233516f, --0.116125f,0.987892f,-0.102876f, --0.347298f,0.937329f,-0.028262f, --0.3353f,0.938887f,0.0778782f, --0.281604f,0.948411f,0.145656f, --0.254278f,0.964997f,0.0642133f, --0.124948f,0.985399f,-0.115656f, -0.137997f,0.981596f,-0.132006f, -0.145883f,0.979226f,-0.140833f, -0.128056f,0.990732f,-0.0452937f, -0.135002f,0.989818f,-0.0451192f, -0.250583f,0.968082f,-0.00493589f, -0.249752f,0.966686f,-0.056052f, -0.354812f,0.933896f,0.0441336f, -0.303438f,0.951308f,0.0542095f, -0.224177f,0.96836f,0.10965f, -0.0241424f,0.959753f,0.279804f, --0.360787f,0.871516f,0.332105f, --0.379082f,0.837086f,0.394442f, --0.267154f,0.880877f,0.390749f, --0.209592f,0.899886f,0.382462f, --0.280017f,0.899934f,0.33423f, --0.205094f,0.90311f,0.377265f, --0.215487f,0.908768f,0.35736f, --0.222303f,0.927919f,0.299247f, --0.133955f,0.964793f,0.226343f, --0.0310722f,0.978213f,0.205265f, -0.00222901f,0.986522f,0.163613f, -0.163026f,0.975343f,0.148754f, -0.222032f,0.968535f,0.112436f, --0.0591592f,0.996482f,0.0593585f, --0.0736093f,0.986012f,0.149538f, -0.0883465f,0.986402f,0.138585f, --0.129755f,0.988677f,-0.0753772f, --0.360418f,0.926521f,-0.10797f, --0.325602f,0.942448f,-0.0759939f, --0.212184f,0.970083f,-0.117968f, --0.0173686f,0.99664f,-0.0800487f, -0.199307f,0.979749f,-0.0191744f, -0.207601f,0.977585f,-0.0350739f, --0.111673f,0.993337f,0.0284751f, --0.348081f,0.937445f,0.00599776f, --0.0214784f,0.998661f,0.0470579f, -0.101424f,0.987937f,-0.11702f, -0.14864f,0.985437f,-0.0825872f, -0.115279f,0.993006f,0.0255073f, -0.132171f,0.98902f,0.0661133f, -0.208651f,0.976857f,0.0470664f, -0.263292f,0.96404f,0.0361305f, -0.248825f,0.968171f,0.0270552f, -0.185161f,0.982538f,-0.018271f, -0.217415f,0.97571f,0.0268649f, -0.0197241f,0.992022f,0.124516f, --0.222642f,0.960275f,0.168234f, -0.132211f,0.987109f,0.0902005f, -0.194249f,0.96722f,0.163561f, --0.121192f,0.992517f,0.0149198f, --0.530811f,0.812343f,-0.241533f, --0.504434f,0.808747f,-0.302447f, --0.34313f,0.885425f,-0.313504f, --0.137778f,0.93664f,-0.322061f, -0.0757018f,0.968813f,-0.235947f, --0.132891f,0.938587f,-0.318425f, -0.0404124f,0.947798f,-0.316301f, -0.44786f,0.871235f,-0.200923f, -0.490699f,0.867082f,-0.0859319f, -0.104719f,0.99418f,-0.0252995f, --0.266739f,0.955461f,0.126271f, --0.36926f,0.905342f,0.209771f, --0.330235f,0.922316f,0.200695f, --0.269586f,0.955277f,0.121531f, --0.151874f,0.986716f,0.0576671f, --0.0142621f,0.999832f,-0.0115305f, -0.159425f,0.986955f,-0.0224599f, -0.153623f,0.986882f,-0.0496328f, -0.106278f,0.991325f,-0.0773283f, -0.114508f,0.986134f,-0.120113f, -0.21169f,0.974687f,-0.0719165f, -0.274634f,0.961096f,-0.0295159f, -0.269382f,0.962666f,0.0266079f, -0.255851f,0.94689f,0.19478f, --0.00861224f,0.958716f,0.284234f, --0.164949f,0.853283f,0.494671f, --0.299895f,0.797641f,0.523289f, --0.348319f,0.830543f,0.434595f, --0.252787f,0.902204f,0.349467f, --0.200686f,0.920719f,0.334665f, --0.211731f,0.897332f,0.387253f, --0.253565f,0.89104f,0.376502f, --0.186105f,0.884245f,0.42834f, --0.119153f,0.910802f,0.395274f, --0.0259565f,0.945107f,0.325728f, --0.0365208f,0.969055f,0.244127f, -0.0217438f,0.965814f,0.258322f, -0.21499f,0.950394f,0.224789f, -0.314831f,0.941255f,0.12215f, --0.024099f,0.99913f,-0.0340298f, --0.193558f,0.979871f,-0.0488714f, -0.141024f,0.987427f,0.0714227f, -0.042141f,0.998281f,-0.0407328f, --0.330902f,0.928766f,-0.167024f, --0.316891f,0.928564f,-0.193256f, --0.212611f,0.956496f,-0.199781f, --0.0848317f,0.98296f,-0.163073f, -0.159095f,0.98144f,-0.107074f, -0.142493f,0.988352f,-0.0534431f, --0.0993206f,0.99343f,0.0568515f, --0.282995f,0.956355f,-0.0727984f, --0.0511781f,0.994657f,-0.0896605f, -0.128118f,0.991123f,0.0355009f, -0.0178584f,0.998165f,0.057865f, -0.0308308f,0.995199f,0.0928875f, -0.176093f,0.979878f,0.0939732f, -0.250441f,0.967914f,0.0205173f, -0.266597f,0.963616f,0.0192599f, -0.242746f,0.969766f,0.0250589f, -0.198829f,0.979834f,0.0197961f, -0.092758f,0.995177f,0.031931f, --0.00514037f,0.987257f,0.15905f, --0.197401f,0.976423f,0.0873538f, -0.0947848f,0.990346f,0.101148f, -0.11003f,0.98867f,0.102099f, -0.0979659f,0.987432f,0.124019f, --0.288467f,0.943192f,-0.16485f, --0.465875f,0.798355f,-0.381562f, --0.320527f,0.848593f,-0.420894f, --0.189264f,0.880141f,-0.435352f, --0.0157309f,0.942454f,-0.333965f, --0.0523924f,0.9528f,-0.299042f, -0.0243535f,0.924362f,-0.38074f, -0.347438f,0.877508f,-0.330555f, -0.339023f,0.92439f,-0.174834f, -0.0111821f,0.998297f,0.0572478f, --0.344224f,0.932997f,0.105009f, --0.433099f,0.895278f,0.104414f, --0.282796f,0.937116f,0.204547f, --0.130039f,0.982692f,0.131936f, --0.0814764f,0.996291f,-0.027691f, --0.0200688f,0.997106f,-0.0733289f, -0.118984f,0.992345f,-0.0330638f, -0.199561f,0.979885f,0.00110984f, -0.153394f,0.986654f,-0.0546216f, -0.176634f,0.980572f,-0.0853107f, -0.13548f,0.982889f,-0.124795f, -0.191838f,0.980855f,0.0334985f, -0.104996f,0.978045f,0.180009f, -0.00782433f,0.923816f,0.382758f, --0.0895214f,0.848914f,0.520894f, --0.239967f,0.84054f,0.485703f, --0.280756f,0.842357f,0.460011f, --0.207606f,0.901917f,0.378742f, --0.122486f,0.94404f,0.306245f, --0.244402f,0.93107f,0.270881f, --0.292773f,0.891472f,0.345777f, --0.276286f,0.909624f,0.310243f, --0.213016f,0.932947f,0.290231f, --0.0942691f,0.953854f,0.28509f, --0.0105057f,0.953135f,0.302364f, -0.0307865f,0.936068f,0.35047f, -0.0538732f,0.955717f,0.289315f, -0.209391f,0.949668f,0.232994f, -0.403861f,0.868428f,0.287628f, -0.149382f,0.968969f,0.196936f, --0.176548f,0.984269f,0.00674917f, -0.0687777f,0.996274f,-0.0520396f, -0.147821f,0.988716f,-0.0242998f, --0.223164f,0.968308f,-0.112148f, --0.295488f,0.928787f,-0.2237f, --0.23574f,0.935973f,-0.261496f, --0.100501f,0.963432f,-0.248392f, -0.0576299f,0.973773f,-0.220102f, -0.0436147f,0.999029f,-0.00621142f, --0.153496f,0.982634f,0.104254f, --0.184805f,0.972589f,0.141133f, --0.14696f,0.984535f,0.0953571f, --0.0211774f,0.989717f,0.141466f, -0.0758245f,0.9782f,0.193326f, -0.117048f,0.987762f,0.103083f, -0.217731f,0.97559f,-0.0285914f, -0.270726f,0.959521f,-0.0776314f, -0.230415f,0.971747f,-0.0511441f, -0.234903f,0.971865f,0.0172727f, -0.182122f,0.97948f,0.0863184f, -0.0884364f,0.988499f,0.122674f, --0.00977715f,0.999042f,0.0426606f, --0.0304096f,0.999492f,-0.00954367f, -0.200711f,0.957383f,0.207686f, -0.148405f,0.978101f,0.145929f, -0.14921f,0.978785f,0.140417f, -0.0273685f,0.999287f,0.0260052f, --0.3017f,0.88706f,-0.349431f, --0.32483f,0.824834f,-0.462746f, --0.238736f,0.866733f,-0.437926f, --0.174101f,0.907603f,-0.382029f, --0.0165261f,0.968715f,-0.247625f, -0.078914f,0.949167f,-0.30472f, -0.287731f,0.926482f,-0.242571f, -0.12793f,0.981688f,-0.141147f, --0.134026f,0.990975f,-0.00233563f, --0.342476f,0.939327f,-0.0193419f, --0.427311f,0.903697f,-0.027138f, --0.353742f,0.934457f,-0.0407041f, --0.055135f,0.997815f,0.0363915f, -0.0312575f,0.999385f,0.0158812f, -0.00264454f,0.999634f,-0.0269175f, -0.0835808f,0.996075f,-0.0291308f, -0.150499f,0.987413f,0.0486412f, -0.165157f,0.971811f,0.168246f, -0.215634f,0.960222f,0.177413f, -0.0835282f,0.988765f,0.123967f, --0.00975779f,0.968408f,0.249181f, --0.06977f,0.918125f,0.3901f, --0.139283f,0.878718f,0.456569f, --0.11373f,0.882765f,0.455842f, --0.169944f,0.889011f,0.42518f, --0.209287f,0.894084f,0.395996f, --0.156853f,0.920873f,0.356917f, --0.124966f,0.921391f,0.367997f, --0.29021f,0.888579f,0.355255f, --0.269725f,0.894676f,0.356094f, --0.146199f,0.945073f,0.292342f, --0.175209f,0.971632f,0.15885f, --0.117718f,0.980316f,0.158504f, --0.0825429f,0.966227f,0.244116f, --0.0312586f,0.938703f,0.343308f, -0.145253f,0.922109f,0.358632f, -0.209296f,0.943478f,0.256992f, -0.299421f,0.901575f,0.312265f, -0.248395f,0.88619f,0.39111f, -0.0914055f,0.966416f,0.240179f, -0.127765f,0.989974f,-0.0602251f, -0.140331f,0.988333f,-0.0592086f, --0.14269f,0.987394f,-0.0685058f, --0.196659f,0.96924f,-0.147981f, --0.173702f,0.951221f,-0.254961f, --0.143754f,0.948468f,-0.282389f, --0.0849965f,0.99069f,-0.106347f, --0.164159f,0.984178f,0.0666661f, --0.232036f,0.961292f,0.148586f, --0.256871f,0.951713f,0.168109f, --0.0692891f,0.973705f,0.217018f, -0.083167f,0.991239f,0.102607f, -0.0755656f,0.994003f,-0.07904f, -0.210733f,0.972404f,-0.100116f, -0.30249f,0.937213f,-0.173582f, -0.293071f,0.941554f,-0.166086f, -0.154342f,0.975072f,-0.159414f, -0.102764f,0.994605f,0.0141294f, -0.056079f,0.980415f,0.188792f, -0.109909f,0.955557f,0.273554f, -0.133139f,0.972499f,0.191102f, -0.0554464f,0.995429f,0.0777578f, -0.259868f,0.925249f,0.276374f, -0.196037f,0.949951f,0.243232f, -0.114869f,0.970528f,0.21185f, -0.223665f,0.947755f,0.227452f, -0.0930818f,0.995219f,-0.0295687f, --0.269847f,0.892223f,-0.362106f, --0.284642f,0.866853f,-0.409321f, --0.255009f,0.880625f,-0.399336f, --0.131932f,0.93993f,-0.314842f, -0.0677192f,0.974824f,-0.212442f, -0.187299f,0.973952f,-0.127815f, -0.0529524f,0.998138f,-0.0302806f, --0.109006f,0.993972f,0.0117426f, --0.296161f,0.95278f,-0.067077f, --0.391399f,0.918205f,-0.0608803f, --0.369652f,0.920023f,-0.130056f, --0.175066f,0.983052f,-0.0544101f, -0.0114037f,0.997649f,0.0675687f, --0.0112147f,0.996664f,0.0808418f, -0.0734363f,0.988721f,0.130533f, -0.0224625f,0.993745f,0.109391f, -0.0118323f,0.985875f,0.167063f, -0.164185f,0.947186f,0.275466f, -0.0854603f,0.916044f,0.391867f, --0.130673f,0.906994f,0.400358f, --0.128332f,0.898319f,0.420183f, --0.0833752f,0.911617f,0.402496f, --0.0573327f,0.932174f,0.357442f, --0.17852f,0.926686f,0.330734f, --0.230606f,0.897072f,0.376939f, --0.191094f,0.893503f,0.406369f, --0.142227f,0.886795f,0.439733f, --0.17679f,0.896492f,0.40626f, --0.238548f,0.945234f,0.222772f, --0.0952672f,0.973092f,0.209801f, --0.096256f,0.964628f,0.245412f, --0.179685f,0.951666f,0.249087f, --0.204503f,0.928081f,0.311197f, --0.0772696f,0.924068f,0.374336f, -0.158946f,0.926358f,0.341463f, -0.256333f,0.910209f,0.325291f, -0.24298f,0.91134f,0.332296f, -0.258464f,0.899993f,0.351011f, -0.335956f,0.897826f,0.28468f, -0.32299f,0.94494f,0.0525965f, -0.125001f,0.99187f,-0.0238687f, --0.121525f,0.992278f,-0.0248174f, --0.149564f,0.988264f,-0.0310731f, --0.0664528f,0.99755f,-0.021853f, --0.216702f,0.971886f,-0.0920818f, --0.313688f,0.949511f,-0.0053432f, --0.230579f,0.964148f,0.131349f, --0.200205f,0.977444f,0.06724f, --0.214561f,0.975215f,-0.0540219f, --0.0751922f,0.988525f,-0.131015f, -0.196994f,0.973692f,-0.114533f, -0.277294f,0.941009f,-0.193932f, -0.227557f,0.901482f,-0.368168f, -0.240964f,0.919471f,-0.31066f, -0.212207f,0.970864f,-0.111317f, -0.0629816f,0.997092f,0.0428958f, --0.106678f,0.985091f,0.134967f, --0.0538645f,0.972292f,0.227481f, -0.0800601f,0.969345f,0.232295f, -0.209708f,0.947853f,0.239995f, -0.200719f,0.957631f,0.206531f, -0.262538f,0.945755f,0.191366f, -0.219609f,0.958448f,0.182068f, -0.16942f,0.971857f,0.163679f, -0.226298f,0.968297f,0.105781f, -0.311569f,0.942438f,0.12139f, -0.0252626f,0.999298f,-0.0276703f, --0.250271f,0.93337f,-0.257262f, --0.253906f,0.911858f,-0.322563f, --0.227242f,0.899531f,-0.373102f, --0.0651757f,0.944171f,-0.322945f, -0.0757455f,0.97969f,-0.185662f, --0.00346825f,0.999555f,-0.0296364f, --0.101674f,0.994706f,-0.0148914f, --0.257112f,0.961591f,-0.0961018f, --0.383381f,0.91395f,-0.133094f, --0.376104f,0.917884f,-0.12663f, --0.286338f,0.956389f,-0.0577212f, --0.0969792f,0.993405f,0.061176f, --0.0181638f,0.982944f,0.183006f, -0.0407231f,0.989025f,0.142023f, -0.0858284f,0.987795f,0.129982f, -0.0586048f,0.994197f,0.0902062f, -0.00131743f,0.999561f,0.0296072f, --0.0615813f,0.973472f,0.220363f, --0.103673f,0.946783f,0.304719f, --0.0728984f,0.963065f,0.259214f, --0.0671535f,0.98356f,0.16763f, --0.0415144f,0.986558f,0.158053f, --0.226194f,0.961315f,0.157196f, --0.322442f,0.916637f,0.236235f, --0.20303f,0.923357f,0.32587f, --0.141662f,0.940817f,0.307889f, --0.0764267f,0.960304f,0.268283f, --0.0942789f,0.977491f,0.188741f, --0.142883f,0.973984f,0.175899f, --0.198273f,0.947542f,0.250702f, --0.198314f,0.931193f,0.305861f, --0.212116f,0.938506f,0.272421f, --0.0469422f,0.977819f,0.204126f, -0.196637f,0.969918f,0.1435f, -0.210661f,0.950426f,0.228718f, -0.210629f,0.90739f,0.363701f, -0.274296f,0.882172f,0.382799f, -0.402024f,0.855402f,0.326595f, -0.442462f,0.866019f,0.232889f, -0.128104f,0.97894f,0.158954f, --0.10509f,0.973708f,0.202109f, --0.168744f,0.972176f,0.162479f, --0.102712f,0.980722f,0.166234f, --0.117365f,0.985855f,0.119644f, --0.348177f,0.934585f,-0.0729569f, --0.249993f,0.967414f,-0.040164f, --0.059218f,0.996444f,-0.0599467f, --0.0488698f,0.975685f,-0.21366f, --0.0228314f,0.943327f,-0.331077f, -0.144917f,0.936565f,-0.319132f, -0.332603f,0.901794f,-0.275938f, -0.285592f,0.906866f,-0.309889f, -0.0349917f,0.981145f,-0.190079f, --0.0795345f,0.991829f,0.0997459f, --0.0793233f,0.9451f,0.317009f, --0.0879959f,0.940679f,0.327688f, --0.00912821f,0.970457f,0.241099f, -0.124716f,0.982357f,0.13936f, -0.187981f,0.977561f,0.0950669f, -0.255482f,0.951122f,0.173483f, -0.297001f,0.952441f,0.0681659f, -0.265042f,0.961574f,0.0716068f, -0.186715f,0.981446f,0.0436002f, -0.255349f,0.964505f,0.0672885f, -0.267248f,0.96042f,0.078566f, -0.154901f,0.983709f,0.0912232f, --0.0558054f,0.990723f,-0.123913f, --0.190326f,0.930089f,-0.314182f, --0.171804f,0.925365f,-0.337911f, --0.124574f,0.93618f,-0.328706f, --0.0782933f,0.960403f,-0.267387f, --0.15298f,0.970001f,-0.188931f, --0.0717491f,0.993745f,-0.0855706f, --0.147047f,0.986451f,-0.0727437f, --0.378361f,0.919377f,-0.107652f, --0.386168f,0.917464f,-0.0955771f, --0.364818f,0.925918f,-0.097894f, --0.234461f,0.971639f,0.0307667f, --0.0876095f,0.988677f,0.121826f, -0.151616f,0.984538f,0.0877402f, -0.0730881f,0.996968f,-0.0267174f, -0.0661066f,0.997404f,0.0285557f, -0.00089126f,0.998637f,0.052186f, --0.169004f,0.978667f,0.116824f, --0.169994f,0.972188f,0.161096f, --0.0375438f,0.966292f,0.254695f, -0.0282607f,0.96926f,0.244409f, -0.0134123f,0.993493f,0.113096f, --0.245106f,0.969303f,-0.0193377f, --0.4073f,0.913294f,0.000911808f, --0.297873f,0.952205f,0.0676567f, --0.106293f,0.976869f,0.185552f, --0.0629676f,0.97793f,0.199217f, --0.110366f,0.958688f,0.262177f, --0.181956f,0.936769f,0.298926f, --0.212233f,0.945122f,0.248398f, --0.195256f,0.962306f,0.189318f, --0.105775f,0.982974f,0.150248f, -0.0268617f,0.999457f,0.0191026f, -0.158413f,0.985011f,0.068261f, -0.0517671f,0.977028f,0.206729f, -0.0576574f,0.95413f,0.293788f, -0.234396f,0.901434f,0.363971f, -0.437391f,0.816127f,0.377659f, -0.504071f,0.803908f,0.315666f, -0.133347f,0.946928f,0.292483f, --0.151412f,0.933905f,0.323877f, --0.120106f,0.92207f,0.367915f, --0.00325057f,0.939171f,0.343435f, -0.0348166f,0.983178f,0.179299f, --0.135523f,0.990774f,0.00106677f, --0.269937f,0.929173f,-0.252528f, --0.0598233f,0.968739f,-0.240761f, -0.0705133f,0.981516f,-0.177915f, -0.0411605f,0.966746f,-0.252403f, -0.126252f,0.944488f,-0.30332f, -0.315542f,0.911296f,-0.264523f, -0.160596f,0.976989f,-0.140362f, --0.167382f,0.98071f,0.100946f, --0.298691f,0.934743f,0.192454f, --0.145935f,0.9608f,0.235724f, --0.00307512f,0.970287f,0.241936f, -0.110563f,0.982642f,0.148964f, -0.216043f,0.97432f,0.0634533f, -0.143964f,0.986263f,0.0809867f, -0.0914437f,0.980957f,0.17135f, -0.140934f,0.985084f,-0.0987321f, -0.206841f,0.978337f,0.00859891f, -0.190086f,0.979435f,0.0676362f, -0.201515f,0.978077f,0.0525072f, -0.267937f,0.960786f,0.0714189f, -0.246755f,0.968907f,0.0182169f, -0.214715f,0.971106f,-0.104168f, --0.0180649f,0.956568f,-0.290949f, --0.219959f,0.899081f,-0.378512f, --0.191729f,0.921961f,-0.336494f, --0.106738f,0.947718f,-0.300729f, --0.152636f,0.943663f,-0.293602f, --0.224106f,0.947646f,-0.227472f, --0.228203f,0.973419f,0.019469f, --0.388401f,0.917519f,0.0854554f, --0.336148f,0.939599f,0.0644837f, --0.402605f,0.913568f,-0.0574625f, --0.305232f,0.952235f,-0.00907982f, --0.096739f,0.995183f,-0.0159156f, -0.180076f,0.982792f,0.0411394f, -0.136148f,0.986894f,0.0866302f, -0.0219341f,0.999371f,0.0278606f, --0.0791566f,0.996134f,0.0381004f, --0.239326f,0.960376f,0.142833f, --0.218166f,0.951783f,0.215666f, --0.166214f,0.94168f,0.292596f, -0.0428911f,0.92465f,0.378394f, -0.200943f,0.923885f,0.325667f, --0.0783125f,0.985711f,0.149132f, --0.415101f,0.909654f,-0.0148509f, --0.366356f,0.929766f,0.0363078f, --0.239727f,0.962799f,0.124698f, --0.166496f,0.955565f,0.243259f, --0.200219f,0.921854f,0.331809f, --0.112297f,0.932828f,0.342375f, --0.106223f,0.957221f,0.269154f, --0.127872f,0.96503f,0.228835f, --0.0138049f,0.984551f,0.174552f, -0.0256733f,0.993774f,0.108417f, -0.00728748f,0.973829f,0.227164f, --0.00741294f,0.956693f,0.291004f, -0.0683597f,0.974464f,0.213887f, -0.177941f,0.966015f,0.187489f, -0.424978f,0.876377f,0.226619f, -0.505816f,0.827485f,0.243758f, -0.166361f,0.911198f,0.376885f, --0.17476f,0.913668f,0.366973f, --0.176728f,0.923512f,0.340431f, -0.0722139f,0.943797f,0.322541f, -0.177366f,0.957288f,0.228344f, -0.0913959f,0.986484f,0.136004f, --0.0297265f,0.993047f,-0.113903f, --0.0869422f,0.951911f,-0.293781f, --0.0450316f,0.952406f,-0.301489f, -0.143119f,0.964298f,-0.222813f, -0.165675f,0.921893f,-0.350237f, -0.164354f,0.949667f,-0.266682f, --0.039757f,0.998354f,0.0413462f, --0.291683f,0.947651f,0.12992f, --0.239728f,0.968947f,0.0605947f, --0.107127f,0.994229f,0.00574708f, --0.00468879f,0.997776f,-0.0664969f, -0.179786f,0.983119f,-0.033983f, -0.200209f,0.979349f,-0.0281487f, -0.0601426f,0.997956f,0.0216006f, --0.0759803f,0.997037f,0.0120005f, -0.14599f,0.98347f,-0.107112f, -0.111543f,0.987674f,-0.109808f, -0.157618f,0.987042f,-0.0300797f, -0.250909f,0.967637f,-0.026879f, -0.281043f,0.956928f,-0.0728269f, -0.296885f,0.954758f,-0.0172396f, -0.276747f,0.960894f,-0.00969537f, -0.102049f,0.992961f,-0.0601211f, --0.130111f,0.972079f,-0.195279f, --0.17254f,0.923261f,-0.343248f, --0.125309f,0.912244f,-0.390012f, --0.211743f,0.924189f,-0.317868f, --0.376287f,0.901788f,-0.212569f, --0.427638f,0.901509f,-0.0663888f, --0.389415f,0.920624f,0.0283935f, --0.297925f,0.953877f,0.0368632f, --0.273734f,0.961504f,0.0240644f, --0.334113f,0.936286f,-0.108341f, --0.109536f,0.993721f,-0.0228029f, -0.0288145f,0.999546f,0.00876748f, -0.119784f,0.984043f,0.131571f, -0.0511538f,0.994284f,0.0937163f, --0.0752276f,0.983313f,0.165639f, --0.293078f,0.946365f,0.136011f, --0.332793f,0.935954f,0.115063f, --0.225106f,0.941939f,0.249154f, -0.0114661f,0.958888f,0.283552f, -0.24485f,0.921506f,0.301455f, -0.100987f,0.953885f,0.282675f, --0.340266f,0.932035f,0.124616f, --0.415762f,0.898895f,0.138312f, --0.325966f,0.925955f,0.190664f, --0.250966f,0.918836f,0.304559f, --0.221816f,0.898675f,0.378392f, --0.0852583f,0.899614f,0.428282f, --0.0998073f,0.904564f,0.41449f, --0.102816f,0.885513f,0.453096f, -0.0414724f,0.91382f,0.403996f, --0.0128006f,0.939036f,0.343581f, --0.0641104f,0.924175f,0.376551f, -0.0655361f,0.926269f,0.37112f, -0.187467f,0.942186f,0.277743f, -0.21985f,0.965692f,0.138218f, -0.3812f,0.921864f,0.0696633f, -0.433954f,0.878909f,0.197998f, -0.0643484f,0.944154f,0.32316f, --0.162002f,0.923385f,0.348016f, --0.0466746f,0.93461f,0.352597f, -0.113297f,0.96975f,0.216212f, -0.268791f,0.938715f,0.215791f, -0.199257f,0.972974f,0.116695f, -0.13591f,0.990721f,-0.000598755f, -0.098836f,0.989317f,-0.107165f, -0.00840194f,0.94937f,-0.314049f, -0.0977197f,0.93606f,-0.337997f, -0.228369f,0.952655f,-0.20074f, --0.102319f,0.98537f,-0.136295f, --0.210478f,0.975126f,0.0694824f, --0.226245f,0.97389f,-0.0187694f, --0.184535f,0.981701f,-0.0470082f, --0.0356904f,0.995184f,-0.0912977f, -0.0448449f,0.980059f,-0.193583f, -0.0871766f,0.981936f,-0.167935f, -0.149691f,0.986438f,-0.0673319f, -0.081336f,0.996451f,-0.021693f, -0.0320348f,0.999323f,-0.0181162f, -0.0913657f,0.979354f,-0.180329f, -0.100696f,0.986931f,-0.125808f, -0.108832f,0.988438f,-0.105573f, -0.287509f,0.953f,-0.0955498f, -0.243655f,0.954139f,-0.173927f, -0.160509f,0.983073f,-0.0883436f, -0.264497f,0.963724f,0.0357424f, -0.162998f,0.986545f,0.0127154f, -0.0143391f,0.999851f,0.00965394f, --0.0125406f,0.999093f,-0.0406807f, --0.106874f,0.984584f,-0.138462f, --0.285824f,0.938351f,-0.194429f, --0.419998f,0.877928f,-0.22988f, --0.451562f,0.860313f,-0.236545f, --0.434075f,0.875052f,-0.214154f, --0.338822f,0.927615f,-0.157258f, --0.245036f,0.962096f,-0.119701f, --0.344114f,0.932339f,-0.111035f, --0.226404f,0.972006f,0.0628119f, -0.0419787f,0.991974f,0.119273f, -0.128473f,0.991295f,0.0288037f, --0.0257017f,0.999564f,0.0145347f, --0.185301f,0.952066f,0.243378f, --0.184541f,0.936895f,0.29694f, --0.273419f,0.950852f,0.145334f, --0.319783f,0.945196f,0.0659039f, --0.035432f,0.98966f,0.138987f, -0.220222f,0.955124f,0.19809f, -0.125192f,0.96286f,0.239224f, --0.256002f,0.939458f,0.227776f, --0.448892f,0.878586f,0.163043f, --0.385115f,0.893165f,0.232256f, --0.361248f,0.871706f,0.331103f, --0.291851f,0.846516f,0.445235f, --0.17348f,0.85884f,0.481973f, --0.107775f,0.841326f,0.529675f, --0.0921307f,0.850827f,0.517306f, -0.0950699f,0.836893f,0.539048f, -0.0822562f,0.850572f,0.519385f, -0.00749303f,0.916802f,0.399272f, -0.0761143f,0.966912f,0.243491f, -0.269493f,0.937399f,0.220582f, -0.37073f,0.916186f,0.152194f, -0.358083f,0.929944f,0.083549f, -0.335187f,0.907961f,0.251509f, -0.0578141f,0.947361f,0.314904f, --0.166707f,0.957873f,0.233855f, --0.0184246f,0.983369f,0.180682f, -0.167068f,0.976917f,0.13312f, -0.286534f,0.942354f,0.172822f, -0.301062f,0.945554f,0.123648f, -0.228175f,0.972518f,0.0463188f, -0.216797f,0.97484f,-0.0518194f, -0.199106f,0.962895f,-0.18218f, -0.00394531f,0.962307f,-0.271937f, --0.0105699f,0.99745f,-0.0705888f, --0.131705f,0.985651f,0.105578f, --0.19725f,0.980353f,0.00065076f, --0.141436f,0.988723f,-0.0492296f, --0.163841f,0.979948f,-0.113394f, -0.0189882f,0.981225f,-0.191928f, -0.0882705f,0.978772f,-0.18497f, -0.0393937f,0.981447f,-0.187645f, -0.0729287f,0.986122f,-0.149146f, -0.0148824f,0.998969f,-0.0428982f, --0.0177962f,0.999449f,0.0279995f, --0.0162323f,0.963189f,-0.268333f, -0.00641467f,0.976357f,-0.216067f, -0.107749f,0.98057f,-0.16393f, -0.293413f,0.939289f,-0.177892f, -0.308304f,0.934826f,-0.17621f, -0.101903f,0.952869f,-0.285755f, -0.182917f,0.946528f,-0.265755f, -0.146405f,0.977668f,-0.15077f, --0.0629734f,0.995858f,-0.0655825f, --0.0448201f,0.998977f,-0.00597126f, --0.0400505f,0.999191f,-0.00375744f, --0.153158f,0.98627f,-0.0617534f, --0.285484f,0.92871f,-0.236637f, --0.448842f,0.826713f,-0.339243f, --0.479202f,0.840256f,-0.253646f, --0.347296f,0.912974f,-0.214157f, --0.288381f,0.931416f,-0.222037f, --0.393139f,0.905395f,-0.160316f, --0.362299f,0.919254f,-0.153982f, -0.042344f,0.998556f,-0.0330675f, -0.205011f,0.978411f,0.0261187f, --0.127573f,0.99058f,0.0497635f, --0.371574f,0.908811f,0.189723f, --0.216831f,0.928294f,0.302084f, --0.0703165f,0.93644f,0.343708f, --0.232099f,0.969924f,0.0733245f, --0.112472f,0.99344f,-0.0206566f, -0.137846f,0.985164f,0.102232f, -0.0558694f,0.966778f,0.249437f, --0.236804f,0.911959f,0.335045f, --0.429918f,0.856338f,0.286105f, --0.441526f,0.844766f,0.302366f, --0.455345f,0.82665f,0.330622f, --0.361376f,0.843549f,0.397281f, --0.152799f,0.875871f,0.457714f, --0.118894f,0.891156f,0.437842f, --0.0896442f,0.897342f,0.432135f, -0.0157836f,0.897193f,0.441356f, -0.112602f,0.854856f,0.5065f, -0.219938f,0.859901f,0.460648f, -0.288065f,0.92641f,0.242451f, -0.293811f,0.955367f,0.0308066f, -0.390529f,0.919592f,0.0428713f, -0.271277f,0.959279f,0.0786938f, -0.217133f,0.949907f,0.22479f, -0.0884504f,0.963513f,0.252624f, --0.0236259f,0.986232f,0.163669f, -0.0800779f,0.996646f,0.0168362f, -0.165418f,0.984838f,-0.0522657f, -0.249596f,0.968284f,-0.0113122f, -0.338274f,0.940962f,-0.0126639f, -0.305431f,0.950632f,-0.0548703f, -0.294152f,0.946987f,-0.12919f, -0.225417f,0.970184f,-0.0890507f, --0.00713906f,0.99978f,0.0197001f, --0.176932f,0.984214f,-0.00420403f, --0.111846f,0.993652f,0.0120569f, --0.1391f,0.984895f,-0.103119f, --0.088794f,0.987668f,-0.128949f, --0.0465185f,0.96883f,-0.243321f, -0.0250763f,0.955082f,-0.295277f, -0.0363238f,0.977208f,-0.209152f, -0.0515148f,0.981849f,-0.182534f, --0.0181f,0.986039f,-0.165529f, --0.1292f,0.991547f,-0.0118974f, --0.123925f,0.986172f,0.110035f, -0.0445182f,0.949745f,-0.309843f, --0.00147152f,0.93224f,-0.361838f, -0.114309f,0.919114f,-0.377045f, -0.249456f,0.882365f,-0.399004f, -0.318339f,0.895336f,-0.311503f, -0.245085f,0.904168f,-0.349877f, -0.0939131f,0.907167f,-0.410156f, --0.0302879f,0.963667f,-0.265383f, --0.13844f,0.974516f,-0.176503f, --0.0411687f,0.989896f,-0.135687f, --0.00628724f,0.990542f,-0.137063f, --0.112489f,0.976976f,-0.181283f, --0.1315f,0.967086f,-0.217836f, --0.376506f,0.872387f,-0.311743f, --0.531305f,0.793042f,-0.297992f, --0.39351f,0.883689f,-0.253462f, --0.336847f,0.927504f,-0.162083f, --0.393317f,0.917094f,-0.0651222f, --0.321501f,0.93797f,-0.129808f, --0.135804f,0.972419f,-0.189625f, -0.0526632f,0.998612f,0.00112608f, --0.194024f,0.972777f,0.126724f, --0.436845f,0.883669f,0.168215f, --0.311688f,0.924669f,0.218719f, --0.0696464f,0.953993f,0.291628f, -0.0409792f,0.956788f,0.287884f, --0.0764775f,0.990645f,0.113025f, --0.0364568f,0.989186f,0.142066f, --0.121833f,0.946798f,0.297877f, --0.315082f,0.850341f,0.421476f, --0.377714f,0.797842f,0.469873f, --0.420842f,0.786479f,0.452043f, --0.397492f,0.78965f,0.467389f, --0.380055f,0.83336f,0.401334f, --0.183142f,0.896787f,0.402781f, --0.0888282f,0.916137f,0.3909f, --0.0940934f,0.935116f,0.34162f, -0.00386799f,0.937503f,0.347956f, -0.10018f,0.944394f,0.313183f, -0.280679f,0.93056f,0.235113f, -0.465087f,0.85876f,0.215002f, -0.41466f,0.904302f,0.101461f, -0.364139f,0.929581f,0.0572809f, -0.242065f,0.968602f,0.0566915f, -0.117842f,0.992149f,0.0418746f, -0.148716f,0.982681f,0.110551f, -0.0959266f,0.995185f,0.0201233f, -0.176327f,0.980433f,-0.0875236f, -0.210189f,0.965141f,-0.155959f, -0.226725f,0.946611f,-0.229181f, -0.330781f,0.920607f,-0.207526f, -0.365923f,0.916599f,-0.161081f, -0.298516f,0.923753f,-0.239936f, -0.0221976f,0.976238f,-0.215559f, --0.104515f,0.994469f,-0.0104162f, --0.0427336f,0.998984f,-0.0143091f, --0.0839971f,0.989572f,-0.117013f, --0.00725244f,0.993108f,-0.116977f, --0.0399839f,0.966361f,-0.254064f, -0.00504893f,0.980798f,-0.194961f, --0.018473f,0.987693f,-0.155309f, --0.0253738f,0.987423f,-0.15605f, -0.000452807f,0.989468f,-0.144748f, --0.0811148f,0.995994f,-0.0376225f, --0.286969f,0.957515f,0.0285449f, --0.27524f,0.951495f,0.137481f, -0.163018f,0.971572f,-0.171676f, -0.122581f,0.955248f,-0.269212f, -0.130974f,0.917919f,-0.374527f, -0.258812f,0.917892f,-0.300816f, -0.268244f,0.908354f,-0.320839f, -0.223034f,0.911459f,-0.345686f, -0.0389184f,0.957275f,-0.28655f, --0.140597f,0.964524f,-0.223439f, --0.145862f,0.970122f,-0.193875f, --0.104111f,0.974098f,-0.200733f, --0.0208986f,0.992723f,-0.118595f, --0.0701237f,0.994147f,-0.08218f, --0.122604f,0.99062f,-0.0603304f, --0.259222f,0.963912f,-0.0606481f, --0.533518f,0.797325f,-0.282189f, --0.48726f,0.821939f,-0.294948f, --0.445665f,0.877532f,-0.176975f, --0.446224f,0.888631f,-0.105925f, --0.296073f,0.952805f,-0.0671049f, --0.124475f,0.991773f,-0.0298685f, --0.112069f,0.99368f,-0.00632266f, --0.24484f,0.957295f,0.15375f, --0.472578f,0.869701f,0.142444f, --0.348902f,0.914252f,0.205937f, --0.110311f,0.945787f,0.30548f, --0.00134709f,0.941519f,0.336957f, -0.0293716f,0.928574f,0.369983f, --0.116225f,0.946895f,0.299803f, --0.223618f,0.889099f,0.399372f, --0.413824f,0.817577f,0.400396f, --0.452277f,0.775981f,0.439658f, --0.398113f,0.749968f,0.528257f, --0.374899f,0.784234f,0.494397f, --0.25264f,0.860337f,0.442712f, --0.127446f,0.920564f,0.369215f, --0.018556f,0.935495f,0.352851f, --0.0323754f,0.965116f,0.259814f, -0.0357851f,0.98547f,0.166039f, -0.195904f,0.976812f,0.0863732f, -0.361612f,0.932271f,0.0103395f, -0.440593f,0.897705f,0.00204446f, -0.433278f,0.895277f,0.103679f, -0.385805f,0.912456f,0.136304f, -0.326244f,0.9426f,0.0712044f, -0.139247f,0.987833f,-0.0692571f, -0.107504f,0.992792f,-0.0529845f, -0.186477f,0.981836f,-0.0349818f, -0.2261f,0.969793f,-0.0915407f, -0.319918f,0.94368f,-0.0843796f, -0.284455f,0.935881f,-0.207877f, -0.26738f,0.950319f,-0.159379f, -0.326413f,0.941309f,-0.085975f, -0.340028f,0.93811f,-0.0657985f, -0.0548427f,0.991972f,-0.113944f, --0.195067f,0.950504f,-0.241849f, --0.0282147f,0.982936f,-0.181769f, --0.0838232f,0.97875f,-0.187144f, -0.0287357f,0.988886f,-0.145871f, -0.0192345f,0.984318f,-0.175351f, --0.131262f,0.971109f,-0.199292f, --0.0357158f,0.988874f,-0.144408f, -0.0171216f,0.989641f,-0.142542f, --0.0610371f,0.990627f,-0.122202f, --0.174272f,0.984646f,-0.0100664f, --0.321779f,0.946758f,0.0104107f, --0.391721f,0.920071f,-0.0049163f, -0.251962f,0.967049f,0.0364793f, -0.286588f,0.95799f,-0.0110494f, -0.190653f,0.96361f,-0.187371f, -0.192921f,0.95146f,-0.239803f, -0.313234f,0.932132f,-0.181696f, -0.220402f,0.968379f,-0.116899f, -0.0241557f,0.995754f,-0.0888337f, --0.173138f,0.969731f,-0.172177f, --0.148056f,0.974915f,-0.166191f, --0.121802f,0.976444f,-0.178104f, --0.134617f,0.985638f,-0.10196f, --0.12881f,0.990748f,0.0427476f, --0.193234f,0.979772f,0.0520324f, --0.169584f,0.981577f,0.0880205f, --0.37404f,0.925821f,-0.0543154f, --0.520547f,0.83989f,-0.153672f, --0.499517f,0.851003f,-0.162103f, --0.4353f,0.881523f,-0.182841f, --0.371568f,0.902946f,-0.21593f, --0.165948f,0.980792f,-0.10251f, --0.208618f,0.975931f,-0.0635357f, --0.355123f,0.932394f,0.0673039f, --0.461506f,0.884901f,0.0629418f, --0.443442f,0.893747f,0.0676439f, --0.18907f,0.971969f,0.139742f, --0.0546977f,0.978989f,0.19644f, -0.0244551f,0.950588f,0.309492f, --0.115369f,0.932748f,0.341572f, --0.31704f,0.862788f,0.393805f, --0.382907f,0.826411f,0.412829f, --0.514077f,0.784716f,0.346333f, --0.482563f,0.790781f,0.37656f, --0.301253f,0.838125f,0.454745f, --0.149029f,0.885064f,0.440966f, --0.0699981f,0.93986f,0.33431f, -0.00541731f,0.96209f,0.272677f, -0.0875381f,0.972016f,0.217994f, -0.185287f,0.977612f,0.0997159f, -0.257792f,0.964794f,-0.0521163f, -0.377486f,0.923846f,-0.0633437f, -0.414459f,0.907288f,-0.071082f, -0.347034f,0.936287f,-0.0541691f, -0.366281f,0.930406f,0.0134975f, -0.42839f,0.903092f,0.0301138f, -0.236883f,0.966501f,-0.0988031f, -0.0750179f,0.986987f,-0.142226f, -0.187793f,0.976018f,-0.110108f, -0.233114f,0.960011f,-0.155038f, -0.295131f,0.944107f,-0.146833f, -0.293935f,0.952937f,-0.0742579f, -0.206131f,0.978459f,-0.0112805f, -0.26541f,0.963541f,0.0338617f, -0.315062f,0.940538f,0.126983f, -0.200639f,0.96888f,0.144968f, --0.0482349f,0.996749f,-0.0645292f, --0.0829471f,0.973987f,-0.210875f, --0.0395681f,0.974449f,-0.221097f, --0.0327152f,0.953444f,-0.299791f, -0.0198675f,0.970814f,-0.23901f, --0.0300308f,0.967142f,-0.252456f, --0.0212823f,0.929856f,-0.367308f, --0.0806959f,0.938686f,-0.335198f, --0.165388f,0.976093f,-0.141032f, --0.248602f,0.968455f,-0.0171025f, --0.306518f,0.951371f,0.0306604f, --0.345042f,0.93733f,0.04856f, -0.223548f,0.968386f,-0.110699f, -0.301936f,0.947319f,-0.106873f, -0.333496f,0.936283f,-0.110248f, -0.267715f,0.952143f,-0.147486f, -0.160925f,0.980864f,-0.109589f, -0.106924f,0.990465f,0.086874f, -0.0634847f,0.989163f,0.132389f, --0.00868593f,0.99995f,-0.00503069f, --0.137697f,0.961899f,-0.236198f, --0.140914f,0.964191f,-0.224676f, --0.263955f,0.951239f,-0.159597f, --0.23775f,0.971227f,-0.0138849f, --0.148246f,0.985689f,0.0802536f, --0.176705f,0.981995f,0.0667941f, --0.283636f,0.956796f,0.0639697f, --0.481368f,0.872896f,-0.0796102f, --0.48359f,0.86775f,-0.114673f, --0.410361f,0.90546f,-0.10838f, --0.368916f,0.919839f,-0.133408f, --0.290849f,0.948818f,-0.123086f, --0.265473f,0.964116f,-0.001833f, --0.375668f,0.926391f,0.025952f, --0.457607f,0.88747f,-0.0547004f, --0.428989f,0.902388f,-0.0407983f, --0.246051f,0.968578f,-0.0362744f, --0.121016f,0.990282f,0.0685327f, --0.158606f,0.977484f,0.139173f, --0.181659f,0.932387f,0.312498f, --0.374645f,0.868516f,0.324533f, --0.427131f,0.84162f,0.330508f, --0.473189f,0.797198f,0.374923f, --0.486417f,0.800363f,0.350452f, --0.401778f,0.85438f,0.329557f, --0.142919f,0.913903f,0.379941f, -0.0660554f,0.918312f,0.390308f, -0.107243f,0.947465f,0.301346f, -0.120927f,0.966132f,0.227959f, -0.280478f,0.92581f,0.253394f, -0.365712f,0.921405f,0.131406f, -0.413772f,0.910147f,-0.0206163f, -0.410674f,0.90493f,-0.111572f, -0.355567f,0.932765f,-0.0593443f, -0.345425f,0.933621f,-0.0950402f, -0.397628f,0.912297f,-0.0980078f, -0.290063f,0.956994f,0.00506036f, -0.106586f,0.994174f,-0.016042f, -0.184529f,0.978373f,-0.093465f, -0.32595f,0.937225f,-0.12396f, -0.234333f,0.947332f,-0.218287f, -0.205568f,0.971289f,-0.119751f, -0.183661f,0.977533f,-0.103434f, -0.18646f,0.974485f,-0.124944f, -0.228632f,0.97345f,-0.0111031f, -0.2372f,0.970015f,0.0529807f, -0.150741f,0.988413f,-0.0177775f, -0.0529111f,0.986113f,-0.15742f, -0.0129012f,0.976239f,-0.216311f, -0.0638914f,0.966774f,-0.247521f, --0.013106f,0.949224f,-0.314329f, -0.00301657f,0.947335f,-0.320229f, -0.0158116f,0.945699f,-0.32466f, --0.206362f,0.955554f,-0.21055f, --0.363868f,0.929813f,-0.0551994f, --0.322459f,0.943841f,0.0720059f, --0.369143f,0.923823f,0.101411f, --0.383217f,0.903675f,0.191093f, -0.316947f,0.930379f,-0.184227f, -0.292606f,0.932053f,-0.213681f, -0.281637f,0.95325f,-0.109518f, -0.181192f,0.981727f,-0.0581435f, -0.0846872f,0.996407f,0.000962506f, --0.00109762f,0.999999f,0.000234158f, -0.0777708f,0.996176f,0.0398008f, -0.205791f,0.978243f,0.0262708f, -0.0568816f,0.985436f,-0.160253f, --0.183235f,0.956309f,-0.227811f, --0.306851f,0.928821f,-0.207686f, --0.348537f,0.918038f,-0.189017f, --0.243342f,0.965099f,-0.0967916f, --0.232072f,0.972378f,-0.0249578f, --0.190489f,0.981246f,0.0294989f, --0.361119f,0.921084f,-0.145596f, --0.509056f,0.842731f,-0.175118f, --0.463553f,0.883903f,-0.0619248f, --0.339892f,0.940435f,0.00741701f, --0.334839f,0.939566f,-0.0714062f, --0.350156f,0.936419f,-0.0225887f, --0.347741f,0.937357f,0.020947f, --0.370099f,0.928938f,-0.0100614f, --0.438593f,0.892875f,-0.102033f, --0.372504f,0.925425f,-0.0694955f, --0.205666f,0.969919f,0.130228f, --0.228734f,0.96522f,0.126612f, --0.319826f,0.92691f,0.196338f, --0.371568f,0.883063f,0.286595f, --0.42486f,0.867995f,0.257059f, --0.575514f,0.802019f,0.159839f, --0.477155f,0.843037f,0.248216f, --0.322215f,0.91617f,0.238347f, --0.15776f,0.967147f,0.199344f, -0.0563134f,0.972277f,0.226949f, -0.189774f,0.959109f,0.209989f, -0.114773f,0.983426f,0.140357f, -0.195319f,0.960799f,0.196765f, -0.466014f,0.846607f,0.257076f, -0.551779f,0.823036f,0.13473f, -0.451922f,0.891695f,-0.0254353f, -0.295217f,0.951228f,-0.0895088f, -0.39575f,0.916754f,-0.0542532f, -0.335629f,0.937827f,-0.0885088f, -0.163272f,0.984979f,0.0561951f, -0.175225f,0.975709f,0.131485f, -0.276736f,0.960943f,0.00255915f, -0.374077f,0.92611f,-0.0488528f, -0.257806f,0.961501f,-0.0951409f, -0.210674f,0.973483f,-0.0891523f, -0.210996f,0.9611f,-0.178234f, -0.230566f,0.953272f,-0.195223f, -0.113631f,0.949966f,-0.290949f, -0.210906f,0.960561f,-0.181223f, -0.197018f,0.968285f,-0.153646f, -0.117662f,0.979392f,-0.164157f, -0.00452083f,0.974487f,-0.224398f, -0.0685234f,0.976453f,-0.20456f, -0.0486196f,0.979817f,-0.193895f, --0.041249f,0.985341f,-0.165533f, --0.0536621f,0.998462f,0.0138937f, --0.34438f,0.936413f,0.0673216f, --0.441342f,0.892502f,0.0930463f, --0.35428f,0.929013f,0.106864f, --0.394607f,0.91136f,0.117083f, --0.495153f,0.861045f,0.115868f, -0.317163f,0.930357f,-0.183965f, -0.258032f,0.948579f,-0.183348f, -0.18786f,0.965135f,-0.182274f, -0.168177f,0.970722f,-0.171508f, -0.130487f,0.977884f,-0.163448f, -0.0391868f,0.976408f,-0.212349f, -0.0535243f,0.973465f,-0.222489f, -0.187797f,0.962281f,-0.196843f, -0.12136f,0.981658f,-0.147035f, --0.157459f,0.973185f,-0.167681f, --0.281843f,0.941023f,-0.18719f, --0.339259f,0.910185f,-0.237625f, --0.312535f,0.920718f,-0.233666f, --0.266508f,0.952365f,-0.148237f, --0.190534f,0.974186f,-0.121073f, --0.276015f,0.959165f,-0.0617859f, --0.523368f,0.852103f,0.00254573f, --0.538f,0.84284f,-0.0133122f, --0.352764f,0.935613f,-0.0136594f, --0.269435f,0.962844f,-0.0183539f, --0.350798f,0.93502f,-0.0517468f, --0.373067f,0.922044f,-0.103225f, --0.354323f,0.929911f,-0.0985928f, --0.409705f,0.907488f,-0.0927797f, --0.42852f,0.900791f,-0.070324f, --0.329659f,0.944032f,-0.0113329f, --0.243515f,0.962301f,0.121152f, --0.341781f,0.918017f,0.201073f, --0.462572f,0.875527f,0.139571f, --0.350168f,0.914262f,0.203733f, --0.49611f,0.864935f,0.0759072f, --0.527565f,0.849514f,0.000485091f, --0.337106f,0.940759f,0.0364912f, --0.159402f,0.986691f,0.0321325f, -0.0661572f,0.997809f,-0.000201698f, -0.185343f,0.982618f,-0.0104608f, -0.145499f,0.981994f,0.120491f, -0.134704f,0.982549f,0.128264f, -0.406275f,0.89759f,0.17109f, -0.586902f,0.779785f,0.217901f, -0.565709f,0.807524f,0.166967f, -0.384632f,0.92307f,-3.36604e-005f, -0.35623f,0.932256f,-0.0632309f, -0.323525f,0.94617f,0.00968274f, -0.0775419f,0.995759f,-0.0495083f, -0.170196f,0.984289f,-0.0470022f, -0.351353f,0.935822f,-0.0280704f, -0.38341f,0.923157f,-0.0278874f, -0.285688f,0.957776f,-0.0323514f, -0.254076f,0.961785f,-0.102057f, -0.271137f,0.936424f,-0.222698f, -0.261266f,0.933845f,-0.24428f, -0.199017f,0.946563f,-0.253793f, -0.0763778f,0.960008f,-0.269355f, -0.131471f,0.985485f,-0.107402f, -0.160318f,0.984539f,-0.0705758f, -0.0961684f,0.977977f,-0.185235f, -0.0245162f,0.963631f,-0.26611f, --0.0125968f,0.989853f,-0.141538f, --0.234149f,0.972198f,0.00219358f, --0.224015f,0.949544f,0.219506f, --0.294091f,0.928539f,0.226551f, --0.388903f,0.912184f,0.129128f, --0.352208f,0.9324f,0.0811158f, --0.3962f,0.915032f,0.0757807f, --0.491066f,0.869445f,0.0540404f, -0.157697f,0.961233f,-0.226193f, -0.272083f,0.946677f,-0.172551f, -0.25297f,0.931319f,-0.262015f, -0.179666f,0.941632f,-0.284691f, -0.0998509f,0.952676f,-0.287122f, -0.0337305f,0.95661f,-0.289412f, -0.0669213f,0.956372f,-0.284383f, -0.111493f,0.948222f,-0.297395f, -0.109434f,0.973643f,-0.200107f, --0.146896f,0.95648f,-0.252126f, --0.266533f,0.937028f,-0.225695f, --0.287184f,0.932451f,-0.219226f, --0.333493f,0.906758f,-0.258015f, --0.32756f,0.915563f,-0.233343f, --0.294553f,0.94475f,-0.143827f, --0.391872f,0.91893f,0.0447686f, --0.558682f,0.823628f,0.0975275f, --0.441987f,0.895769f,0.0473795f, --0.31507f,0.944961f,-0.0882052f, --0.286026f,0.950757f,-0.119373f, --0.300544f,0.946699f,-0.115905f, --0.336723f,0.926445f,-0.168278f, --0.353572f,0.929204f,-0.107543f, --0.453641f,0.88906f,-0.0615028f, --0.438343f,0.898681f,0.0151213f, --0.388424f,0.921475f,0.00321393f, --0.409039f,0.909757f,0.0709235f, --0.363684f,0.905932f,0.216843f, --0.363969f,0.919331f,0.149522f, --0.393196f,0.918247f,0.0470974f, --0.399628f,0.911703f,0.0953624f, --0.51262f,0.855967f,-0.0673815f, --0.335242f,0.936382f,-0.103929f, --0.0973696f,0.981557f,-0.164516f, -0.067792f,0.980923f,-0.182192f, -0.0872383f,0.996018f,-0.0183907f, --0.00523703f,0.995218f,0.0975357f, -0.128581f,0.983098f,0.130327f, -0.373617f,0.921384f,0.107058f, -0.560261f,0.820373f,0.114439f, -0.627317f,0.771722f,0.104494f, -0.477878f,0.875076f,0.0766505f, -0.339671f,0.937101f,0.080413f, -0.338185f,0.931593f,0.133286f, -0.241006f,0.969638f,0.0414564f, -0.184566f,0.96984f,-0.159206f, -0.299844f,0.937156f,-0.178416f, -0.33645f,0.93097f,-0.14176f, -0.33978f,0.935566f,-0.0962638f, -0.338458f,0.922961f,-0.183273f, -0.376116f,0.905613f,-0.195964f, -0.229101f,0.942068f,-0.244989f, -0.179681f,0.964126f,-0.195387f, -0.0309568f,0.968834f,-0.245768f, -0.00573259f,0.975463f,-0.220088f, -0.156849f,0.977783f,-0.139061f, -0.21782f,0.972525f,-0.0821593f, -0.0218621f,0.99451f,-0.102332f, --0.198564f,0.980065f,-0.00663249f, --0.36267f,0.923836f,0.122463f, --0.30382f,0.935102f,0.182419f, --0.225949f,0.949998f,0.215522f, --0.338005f,0.935768f,0.100459f, --0.329518f,0.942604f,0.0540005f, --0.353044f,0.9356f,0.00366832f, --0.46383f,0.880375f,-0.0990046f, -0.265153f,0.963251f,-0.0429098f, -0.322279f,0.944597f,-0.0622248f, -0.315505f,0.945542f,-0.0800488f, -0.163962f,0.974749f,-0.151597f, -0.137337f,0.972433f,-0.188448f, -0.0704319f,0.957822f,-0.278599f, -0.0704671f,0.945462f,-0.318019f, -0.0908986f,0.948607f,-0.303121f, -0.035224f,0.968727f,-0.245614f, --0.0832465f,0.983302f,-0.161824f, --0.246429f,0.938519f,-0.241773f, --0.316726f,0.889326f,-0.329823f, --0.284897f,0.918994f,-0.272549f, --0.362325f,0.886545f,-0.287677f, --0.440048f,0.874713f,-0.203063f, --0.497142f,0.865956f,-0.0544999f, --0.523445f,0.849121f,-0.0707108f, --0.401725f,0.907593f,-0.122034f, --0.239401f,0.964528f,-0.111235f, --0.233733f,0.958501f,-0.163231f, --0.252964f,0.932836f,-0.256566f, --0.367645f,0.889692f,-0.270713f, --0.454692f,0.878935f,-0.143978f, --0.492544f,0.866924f,-0.0764391f, --0.481959f,0.875013f,-0.0454739f, --0.427088f,0.903155f,0.0436767f, --0.414523f,0.900313f,0.132691f, --0.445145f,0.893064f,0.0654368f, --0.272596f,0.94477f,0.181937f, --0.346295f,0.936658f,0.0524542f, --0.387211f,0.921676f,-0.0241059f, --0.412405f,0.90305f,-0.120098f, --0.307707f,0.940243f,-0.145806f, --0.0608418f,0.995582f,-0.0715164f, --0.0645131f,0.997917f,-0.000435129f, --0.102008f,0.988043f,0.115607f, -0.0143588f,0.992143f,0.12428f, -0.177967f,0.984035f,-0.00139713f, -0.41001f,0.908001f,-0.0861781f, -0.552955f,0.819416f,-0.150989f, -0.604866f,0.793986f,-0.061019f, -0.412532f,0.907382f,0.080473f, -0.292095f,0.937176f,0.190737f, -0.30791f,0.927063f,0.213882f, -0.344775f,0.913992f,0.21389f, -0.356481f,0.927786f,0.110156f, -0.364153f,0.931072f,-0.0223179f, -0.345291f,0.930006f,-0.125944f, -0.351321f,0.913987f,-0.20298f, -0.3587f,0.898336f,-0.253627f, -0.30452f,0.930923f,-0.201617f, -0.2074f,0.975489f,-0.0735288f, -0.18932f,0.981882f,-0.00809888f, -0.163933f,0.983471f,-0.0768774f, -0.0155138f,0.975385f,-0.219964f, -0.0271837f,0.983796f,-0.177221f, -0.116676f,0.992898f,-0.0232359f, --0.0753728f,0.996934f,0.0209924f, --0.279745f,0.951672f,0.12674f, --0.364174f,0.921867f,0.132433f, --0.344523f,0.936581f,0.0641857f, --0.216332f,0.972578f,0.0853902f, --0.223892f,0.974436f,0.0186366f, --0.28965f,0.953049f,-0.0883156f, --0.269918f,0.95756f,-0.101108f, --0.286201f,0.950564f,-0.120491f, -0.172976f,0.984286f,-0.0355076f, -0.24194f,0.969981f,0.0245291f, -0.324379f,0.937283f,0.127591f, -0.286811f,0.953171f,0.0959428f, -0.228455f,0.972614f,-0.0427886f, -0.182359f,0.97568f,-0.121631f, -0.113036f,0.971479f,-0.208452f, -0.0547152f,0.964701f,-0.257601f, --0.089806f,0.977237f,-0.192205f, --0.171631f,0.984685f,-0.0306458f, --0.116586f,0.992809f,0.0271681f, --0.181607f,0.981068f,-0.0672723f, --0.351307f,0.914748f,-0.199546f, --0.388005f,0.90325f,-0.183278f, --0.498044f,0.847159f,-0.185132f, --0.510366f,0.84434f,-0.163145f, --0.479522f,0.851128f,-0.213636f, --0.42037f,0.86671f,-0.268518f, --0.285469f,0.932257f,-0.22227f, --0.161107f,0.969121f,-0.186679f, --0.183754f,0.955302f,-0.231585f, --0.370817f,0.89935f,-0.231654f, --0.514998f,0.83014f,-0.213645f, --0.498206f,0.85286f,-0.156273f, --0.539513f,0.835182f,-0.106757f, --0.535773f,0.843208f,0.0441435f, --0.434698f,0.878206f,0.19948f, --0.415775f,0.89222f,0.176277f, --0.35414f,0.920981f,0.162413f, --0.208366f,0.953013f,0.219884f, --0.257177f,0.962661f,0.0845243f, --0.386488f,0.920792f,-0.0526133f, --0.381213f,0.924327f,0.0172227f, --0.280093f,0.955497f,0.0925905f, --0.1219f,0.953555f,0.275451f, --0.0595691f,0.973079f,0.222641f, -0.124431f,0.978938f,0.161854f, -0.328706f,0.943592f,0.0398269f, -0.495224f,0.863825f,-0.0925162f, -0.549494f,0.832161f,-0.0745945f, -0.445758f,0.890738f,0.0887957f, -0.286029f,0.911685f,0.294987f, -0.236342f,0.90766f,0.346837f, -0.306156f,0.900003f,0.310262f, -0.362522f,0.893707f,0.264322f, -0.407318f,0.891604f,0.197826f, -0.447705f,0.883296f,0.139101f, -0.451832f,0.890524f,0.0530504f, -0.450032f,0.892977f,-0.00796524f, -0.380264f,0.922022f,-0.0726326f, -0.220431f,0.973877f,-0.0545382f, -0.073814f,0.997262f,0.00436123f, -0.143916f,0.987825f,0.059083f, -0.242994f,0.967605f,0.068523f, -0.0793826f,0.995647f,0.0488496f, --0.0810126f,0.994023f,0.0731786f, -0.0550609f,0.987118f,0.150223f, --0.0403249f,0.995863f,0.0814341f, --0.341404f,0.939899f,-0.00574405f, --0.333197f,0.942331f,0.0315063f, --0.270492f,0.962353f,-0.0266656f, --0.217149f,0.973729f,-0.0685481f, --0.150518f,0.988024f,-0.0339529f, --0.227799f,0.970772f,-0.0755549f, --0.30247f,0.950166f,-0.0754703f, --0.319718f,0.946617f,-0.0411916f, -0.16825f,0.98433f,0.0527868f, -0.196178f,0.978898f,0.0572086f, -0.274186f,0.954613f,0.116347f, -0.32563f,0.930709f,0.166568f, -0.315871f,0.943308f,0.101959f, -0.191037f,0.981318f,-0.0227958f, -0.218135f,0.975914f,0.0029357f, -0.0466483f,0.982299f,-0.18142f, --0.170175f,0.975305f,-0.140788f, --0.258133f,0.965917f,0.0192531f, --0.189679f,0.978131f,0.0853348f, --0.0936377f,0.967266f,0.235858f, --0.301926f,0.950003f,0.0795937f, --0.345647f,0.93835f,0.00528925f, --0.494118f,0.858314f,-0.138363f, --0.492927f,0.860507f,-0.128646f, --0.443878f,0.87267f,-0.203517f, --0.398442f,0.869961f,-0.290537f, --0.31747f,0.894846f,-0.313789f, --0.189431f,0.934926f,-0.300049f, --0.194231f,0.947861f,-0.252654f, --0.355627f,0.917296f,-0.179159f, --0.521351f,0.821848f,-0.229692f, --0.537173f,0.817848f,-0.206322f, --0.595314f,0.798098f,-0.0929575f, --0.612312f,0.785394f,0.0907203f, --0.484809f,0.839064f,0.246843f, --0.327417f,0.875762f,0.354737f, --0.358949f,0.909479f,0.20977f, --0.221142f,0.943893f,0.245282f, --0.137619f,0.956208f,0.258316f, --0.37682f,0.920718f,0.101416f, --0.393482f,0.900899f,0.183174f, --0.309483f,0.930699f,0.194988f, --0.137506f,0.96116f,0.2393f, --0.0256175f,0.984881f,0.171327f, -0.155024f,0.972933f,0.171372f, -0.40312f,0.907825f,0.115531f, -0.491485f,0.869632f,-0.0467184f, -0.488586f,0.869843f,0.0682392f, -0.313615f,0.910806f,0.268473f, -0.190736f,0.863506f,0.466881f, -0.238952f,0.837112f,0.492083f, -0.344695f,0.840122f,0.418784f, -0.396648f,0.860615f,0.319393f, -0.456384f,0.85928f,0.230981f, -0.487857f,0.863295f,0.129295f, -0.451906f,0.891012f,0.043332f, -0.456211f,0.882737f,0.112455f, -0.397431f,0.910062f,0.117622f, -0.204941f,0.971778f,0.116821f, -0.0877111f,0.985798f,0.143208f, -0.14813f,0.986469f,0.0702648f, -0.212033f,0.976625f,0.035296f, -0.0413914f,0.99116f,0.126047f, --0.10186f,0.970634f,0.217932f, -0.0558102f,0.971334f,0.231076f, -0.0834757f,0.981533f,0.172117f, --0.293392f,0.955612f,-0.0269471f, --0.339064f,0.938377f,-0.0669636f, --0.232942f,0.969004f,-0.0822698f, --0.249298f,0.960887f,-0.120613f, --0.178309f,0.98375f,-0.0210319f, --0.23671f,0.971566f,0.00516088f, --0.322203f,0.944986f,0.0564443f, --0.359276f,0.929551f,0.0827968f, -}; - -btScalar Landscape06Tex[] = { -0.0f,0.0078125f, -0.0f,0.0f, -0.0078125f,0.0078125f, -0.0078125f,0.0f, -0.015625f,0.0078125f, -0.015625f,0.0f, -0.0234375f,0.0078125f, -0.0234375f,0.0f, -0.03125f,0.0078125f, -0.03125f,0.0f, -0.0390625f,0.0078125f, -0.0390625f,0.0f, -0.046875f,0.0078125f, -0.046875f,0.0f, -0.0546875f,0.0078125f, -0.0546875f,0.0f, -0.0625f,0.0078125f, -0.0625f,0.0f, -0.0703125f,0.0078125f, -0.0703125f,0.0f, -0.078125f,0.0078125f, -0.078125f,0.0f, -0.0859375f,0.0078125f, -0.0859375f,0.0f, -0.09375f,0.0078125f, -0.09375f,0.0f, -0.101563f,0.0078125f, -0.101563f,0.0f, -0.109375f,0.0078125f, -0.109375f,0.0f, -0.117188f,0.0078125f, -0.117188f,0.0f, -0.125f,0.0078125f, -0.125f,0.0f, -0.132813f,0.0078125f, -0.132813f,0.0f, -0.140625f,0.0078125f, -0.140625f,0.0f, -0.148438f,0.0078125f, -0.148438f,0.0f, -0.15625f,0.0078125f, -0.15625f,0.0f, -0.164063f,0.0078125f, -0.164063f,0.0f, -0.171875f,0.0078125f, -0.171875f,0.0f, -0.179688f,0.0078125f, -0.179688f,0.0f, -0.1875f,0.0078125f, -0.1875f,0.0f, -0.195313f,0.0078125f, -0.195313f,0.0f, -0.203125f,0.0078125f, -0.203125f,0.0f, -0.210938f,0.0078125f, -0.210938f,0.0f, -0.21875f,0.0078125f, -0.21875f,0.0f, -0.226563f,0.0078125f, -0.226563f,0.0f, -0.234375f,0.0078125f, -0.234375f,0.0f, -0.242188f,0.0078125f, -0.242188f,0.0f, -0.25f,0.0078125f, -0.25f,0.0f, -0.257813f,0.0078125f, -0.257813f,0.0f, -0.265625f,0.0078125f, -0.265625f,0.0f, -0.273438f,0.0078125f, -0.273438f,0.0f, -0.28125f,0.0078125f, -0.28125f,0.0f, -0.289063f,0.0078125f, -0.289063f,0.0f, -0.296875f,0.0078125f, -0.296875f,0.0f, -0.304688f,0.0078125f, -0.304688f,0.0f, -0.3125f,0.0078125f, -0.3125f,0.0f, -0.320313f,0.0078125f, -0.320313f,0.0f, -0.328125f,0.0078125f, -0.328125f,0.0f, -0.335938f,0.0078125f, -0.335938f,0.0f, -0.34375f,0.0078125f, -0.34375f,0.0f, -0.351563f,0.0078125f, -0.351563f,0.0f, -0.359375f,0.0078125f, -0.359375f,0.0f, -0.367188f,0.0078125f, -0.367188f,0.0f, -0.375f,0.0078125f, -0.375f,0.0f, -0.382813f,0.0078125f, -0.382813f,0.0f, -0.390625f,0.0078125f, -0.390625f,0.0f, -0.398438f,0.0078125f, -0.398438f,0.0f, -0.40625f,0.0078125f, -0.40625f,0.0f, -0.414063f,0.0078125f, -0.414063f,0.0f, -0.421875f,0.0078125f, -0.421875f,0.0f, -0.429688f,0.0078125f, -0.429688f,0.0f, -0.4375f,0.0078125f, -0.4375f,0.0f, -0.445313f,0.0078125f, -0.445313f,0.0f, -0.453125f,0.0078125f, -0.453125f,0.0f, -0.460938f,0.0078125f, -0.460938f,0.0f, -0.46875f,0.0078125f, -0.46875f,0.0f, -0.476563f,0.0078125f, -0.476563f,0.0f, -0.484375f,0.0078125f, -0.484375f,0.0f, -0.492188f,0.0078125f, -0.492188f,0.0f, -0.5f,0.0078125f, -0.5f,0.0f, -0.507813f,0.0078125f, -0.507813f,0.0f, -0.0f,0.015625f, -0.0078125f,0.015625f, -0.015625f,0.015625f, -0.0234375f,0.015625f, -0.03125f,0.015625f, -0.0390625f,0.015625f, -0.046875f,0.015625f, -0.0546875f,0.015625f, -0.0625f,0.015625f, -0.0703125f,0.015625f, -0.078125f,0.015625f, -0.0859375f,0.015625f, -0.09375f,0.015625f, -0.101563f,0.015625f, -0.109375f,0.015625f, -0.117188f,0.015625f, -0.125f,0.015625f, -0.132813f,0.015625f, -0.140625f,0.015625f, -0.148438f,0.015625f, -0.15625f,0.015625f, -0.164063f,0.015625f, -0.171875f,0.015625f, -0.179688f,0.015625f, -0.1875f,0.015625f, -0.195313f,0.015625f, -0.203125f,0.015625f, -0.210938f,0.015625f, -0.21875f,0.015625f, -0.226563f,0.015625f, -0.234375f,0.015625f, -0.242188f,0.015625f, -0.25f,0.015625f, -0.257813f,0.015625f, -0.265625f,0.015625f, -0.273438f,0.015625f, -0.28125f,0.015625f, -0.289063f,0.015625f, -0.296875f,0.015625f, -0.304688f,0.015625f, -0.3125f,0.015625f, -0.320313f,0.015625f, -0.328125f,0.015625f, -0.335938f,0.015625f, -0.34375f,0.015625f, -0.351563f,0.015625f, -0.359375f,0.015625f, -0.367188f,0.015625f, -0.375f,0.015625f, -0.382813f,0.015625f, -0.390625f,0.015625f, -0.398438f,0.015625f, -0.40625f,0.015625f, -0.414063f,0.015625f, -0.421875f,0.015625f, -0.429688f,0.015625f, -0.4375f,0.015625f, -0.445313f,0.015625f, -0.453125f,0.015625f, -0.460938f,0.015625f, -0.46875f,0.015625f, -0.476563f,0.015625f, -0.484375f,0.015625f, -0.492188f,0.015625f, -0.5f,0.015625f, -0.507813f,0.015625f, -0.0f,0.0234375f, -0.0078125f,0.0234375f, -0.015625f,0.0234375f, -0.0234375f,0.0234375f, -0.03125f,0.0234375f, -0.0390625f,0.0234375f, -0.046875f,0.0234375f, -0.0546875f,0.0234375f, -0.0625f,0.0234375f, -0.0703125f,0.0234375f, -0.078125f,0.0234375f, -0.0859375f,0.0234375f, -0.09375f,0.0234375f, -0.101563f,0.0234375f, -0.109375f,0.0234375f, -0.117188f,0.0234375f, -0.125f,0.0234375f, -0.132813f,0.0234375f, -0.140625f,0.0234375f, -0.148438f,0.0234375f, -0.15625f,0.0234375f, -0.164063f,0.0234375f, -0.171875f,0.0234375f, -0.179688f,0.0234375f, -0.1875f,0.0234375f, -0.195313f,0.0234375f, -0.203125f,0.0234375f, -0.210938f,0.0234375f, -0.21875f,0.0234375f, -0.226563f,0.0234375f, -0.234375f,0.0234375f, -0.242188f,0.0234375f, -0.25f,0.0234375f, -0.257813f,0.0234375f, -0.265625f,0.0234375f, -0.273438f,0.0234375f, -0.28125f,0.0234375f, -0.289063f,0.0234375f, -0.296875f,0.0234375f, -0.304688f,0.0234375f, -0.3125f,0.0234375f, -0.320313f,0.0234375f, -0.328125f,0.0234375f, -0.335938f,0.0234375f, -0.34375f,0.0234375f, -0.351563f,0.0234375f, -0.359375f,0.0234375f, -0.367188f,0.0234375f, -0.375f,0.0234375f, -0.382813f,0.0234375f, -0.390625f,0.0234375f, -0.398438f,0.0234375f, -0.40625f,0.0234375f, -0.414063f,0.0234375f, -0.421875f,0.0234375f, -0.429688f,0.0234375f, -0.4375f,0.0234375f, -0.445313f,0.0234375f, -0.453125f,0.0234375f, -0.460938f,0.0234375f, -0.46875f,0.0234375f, -0.476563f,0.0234375f, -0.484375f,0.0234375f, -0.492188f,0.0234375f, -0.5f,0.0234375f, -0.507813f,0.0234375f, -0.0f,0.03125f, -0.0078125f,0.03125f, -0.015625f,0.03125f, -0.0234375f,0.03125f, -0.03125f,0.03125f, -0.0390625f,0.03125f, -0.046875f,0.03125f, -0.0546875f,0.03125f, -0.0625f,0.03125f, -0.0703125f,0.03125f, -0.078125f,0.03125f, -0.0859375f,0.03125f, -0.09375f,0.03125f, -0.101563f,0.03125f, -0.109375f,0.03125f, -0.117188f,0.03125f, -0.125f,0.03125f, -0.132813f,0.03125f, -0.140625f,0.03125f, -0.148438f,0.03125f, -0.15625f,0.03125f, -0.164063f,0.03125f, -0.171875f,0.03125f, -0.179688f,0.03125f, -0.1875f,0.03125f, -0.195313f,0.03125f, -0.203125f,0.03125f, -0.210938f,0.03125f, -0.21875f,0.03125f, -0.226563f,0.03125f, -0.234375f,0.03125f, -0.242188f,0.03125f, -0.25f,0.03125f, -0.257813f,0.03125f, -0.265625f,0.03125f, -0.273438f,0.03125f, -0.28125f,0.03125f, -0.289063f,0.03125f, -0.296875f,0.03125f, -0.304688f,0.03125f, -0.3125f,0.03125f, -0.320313f,0.03125f, -0.328125f,0.03125f, -0.335938f,0.03125f, -0.34375f,0.03125f, -0.351563f,0.03125f, -0.359375f,0.03125f, -0.367188f,0.03125f, -0.375f,0.03125f, -0.382813f,0.03125f, -0.390625f,0.03125f, -0.398438f,0.03125f, -0.40625f,0.03125f, -0.414063f,0.03125f, -0.421875f,0.03125f, -0.429688f,0.03125f, -0.4375f,0.03125f, -0.445313f,0.03125f, -0.453125f,0.03125f, -0.460938f,0.03125f, -0.46875f,0.03125f, -0.476563f,0.03125f, -0.484375f,0.03125f, -0.492188f,0.03125f, -0.5f,0.03125f, -0.507813f,0.03125f, -0.0f,0.0390625f, -0.0078125f,0.0390625f, -0.015625f,0.0390625f, -0.0234375f,0.0390625f, -0.03125f,0.0390625f, -0.0390625f,0.0390625f, -0.046875f,0.0390625f, -0.0546875f,0.0390625f, -0.0625f,0.0390625f, -0.0703125f,0.0390625f, -0.078125f,0.0390625f, -0.0859375f,0.0390625f, -0.09375f,0.0390625f, -0.101563f,0.0390625f, -0.109375f,0.0390625f, -0.117188f,0.0390625f, -0.125f,0.0390625f, -0.132813f,0.0390625f, -0.140625f,0.0390625f, -0.148438f,0.0390625f, -0.15625f,0.0390625f, -0.164063f,0.0390625f, -0.171875f,0.0390625f, -0.179688f,0.0390625f, -0.1875f,0.0390625f, -0.195313f,0.0390625f, -0.203125f,0.0390625f, -0.210938f,0.0390625f, -0.21875f,0.0390625f, -0.226563f,0.0390625f, -0.234375f,0.0390625f, -0.242188f,0.0390625f, -0.25f,0.0390625f, -0.257813f,0.0390625f, -0.265625f,0.0390625f, -0.273438f,0.0390625f, -0.28125f,0.0390625f, -0.289063f,0.0390625f, -0.296875f,0.0390625f, -0.304688f,0.0390625f, -0.3125f,0.0390625f, -0.320313f,0.0390625f, -0.328125f,0.0390625f, -0.335938f,0.0390625f, -0.34375f,0.0390625f, -0.351563f,0.0390625f, -0.359375f,0.0390625f, -0.367188f,0.0390625f, -0.375f,0.0390625f, -0.382813f,0.0390625f, -0.390625f,0.0390625f, -0.398438f,0.0390625f, -0.40625f,0.0390625f, -0.414063f,0.0390625f, -0.421875f,0.0390625f, -0.429688f,0.0390625f, -0.4375f,0.0390625f, -0.445313f,0.0390625f, -0.453125f,0.0390625f, -0.460938f,0.0390625f, -0.46875f,0.0390625f, -0.476563f,0.0390625f, -0.484375f,0.0390625f, -0.492188f,0.0390625f, -0.5f,0.0390625f, -0.507813f,0.0390625f, -0.0f,0.046875f, -0.0078125f,0.046875f, -0.015625f,0.046875f, -0.0234375f,0.046875f, -0.03125f,0.046875f, -0.0390625f,0.046875f, -0.046875f,0.046875f, -0.0546875f,0.046875f, -0.0625f,0.046875f, -0.0703125f,0.046875f, -0.078125f,0.046875f, -0.0859375f,0.046875f, -0.09375f,0.046875f, -0.101563f,0.046875f, -0.109375f,0.046875f, -0.117188f,0.046875f, -0.125f,0.046875f, -0.132813f,0.046875f, -0.140625f,0.046875f, -0.148438f,0.046875f, -0.15625f,0.046875f, -0.164063f,0.046875f, -0.171875f,0.046875f, -0.179688f,0.046875f, -0.1875f,0.046875f, -0.195313f,0.046875f, -0.203125f,0.046875f, -0.210938f,0.046875f, -0.21875f,0.046875f, -0.226563f,0.046875f, -0.234375f,0.046875f, -0.242188f,0.046875f, -0.25f,0.046875f, -0.257813f,0.046875f, -0.265625f,0.046875f, -0.273438f,0.046875f, -0.28125f,0.046875f, -0.289063f,0.046875f, -0.296875f,0.046875f, -0.304688f,0.046875f, -0.3125f,0.046875f, -0.320313f,0.046875f, -0.328125f,0.046875f, -0.335938f,0.046875f, -0.34375f,0.046875f, -0.351563f,0.046875f, -0.359375f,0.046875f, -0.367188f,0.046875f, -0.375f,0.046875f, -0.382813f,0.046875f, -0.390625f,0.046875f, -0.398438f,0.046875f, -0.40625f,0.046875f, -0.414063f,0.046875f, -0.421875f,0.046875f, -0.429688f,0.046875f, -0.4375f,0.046875f, -0.445313f,0.046875f, -0.453125f,0.046875f, -0.460938f,0.046875f, -0.46875f,0.046875f, -0.476563f,0.046875f, -0.484375f,0.046875f, -0.492188f,0.046875f, -0.5f,0.046875f, -0.507813f,0.046875f, -0.0f,0.0546875f, -0.0078125f,0.0546875f, -0.015625f,0.0546875f, -0.0234375f,0.0546875f, -0.03125f,0.0546875f, -0.0390625f,0.0546875f, -0.046875f,0.0546875f, -0.0546875f,0.0546875f, -0.0625f,0.0546875f, -0.0703125f,0.0546875f, -0.078125f,0.0546875f, -0.0859375f,0.0546875f, -0.09375f,0.0546875f, -0.101563f,0.0546875f, -0.109375f,0.0546875f, -0.117188f,0.0546875f, -0.125f,0.0546875f, -0.132813f,0.0546875f, -0.140625f,0.0546875f, -0.148438f,0.0546875f, -0.15625f,0.0546875f, -0.164063f,0.0546875f, -0.171875f,0.0546875f, -0.179688f,0.0546875f, -0.1875f,0.0546875f, -0.195313f,0.0546875f, -0.203125f,0.0546875f, -0.210938f,0.0546875f, -0.21875f,0.0546875f, -0.226563f,0.0546875f, -0.234375f,0.0546875f, -0.242188f,0.0546875f, -0.25f,0.0546875f, -0.257813f,0.0546875f, -0.265625f,0.0546875f, -0.273438f,0.0546875f, -0.28125f,0.0546875f, -0.289063f,0.0546875f, -0.296875f,0.0546875f, -0.304688f,0.0546875f, -0.3125f,0.0546875f, -0.320313f,0.0546875f, -0.328125f,0.0546875f, -0.335938f,0.0546875f, -0.34375f,0.0546875f, -0.351563f,0.0546875f, -0.359375f,0.0546875f, -0.367188f,0.0546875f, -0.375f,0.0546875f, -0.382813f,0.0546875f, -0.390625f,0.0546875f, -0.398438f,0.0546875f, -0.40625f,0.0546875f, -0.414063f,0.0546875f, -0.421875f,0.0546875f, -0.429688f,0.0546875f, -0.4375f,0.0546875f, -0.445313f,0.0546875f, -0.453125f,0.0546875f, -0.460938f,0.0546875f, -0.46875f,0.0546875f, -0.476563f,0.0546875f, -0.484375f,0.0546875f, -0.492188f,0.0546875f, -0.5f,0.0546875f, -0.507813f,0.0546875f, -0.0f,0.0625f, -0.0078125f,0.0625f, -0.015625f,0.0625f, -0.0234375f,0.0625f, -0.03125f,0.0625f, -0.0390625f,0.0625f, -0.046875f,0.0625f, -0.0546875f,0.0625f, -0.0625f,0.0625f, -0.0703125f,0.0625f, -0.078125f,0.0625f, -0.0859375f,0.0625f, -0.09375f,0.0625f, -0.101563f,0.0625f, -0.109375f,0.0625f, -0.117188f,0.0625f, -0.125f,0.0625f, -0.132813f,0.0625f, -0.140625f,0.0625f, -0.148438f,0.0625f, -0.15625f,0.0625f, -0.164063f,0.0625f, -0.171875f,0.0625f, -0.179688f,0.0625f, -0.1875f,0.0625f, -0.195313f,0.0625f, -0.203125f,0.0625f, -0.210938f,0.0625f, -0.21875f,0.0625f, -0.226563f,0.0625f, -0.234375f,0.0625f, -0.242188f,0.0625f, -0.25f,0.0625f, -0.257813f,0.0625f, -0.265625f,0.0625f, -0.273438f,0.0625f, -0.28125f,0.0625f, -0.289063f,0.0625f, -0.296875f,0.0625f, -0.304688f,0.0625f, -0.3125f,0.0625f, -0.320313f,0.0625f, -0.328125f,0.0625f, -0.335938f,0.0625f, -0.34375f,0.0625f, -0.351563f,0.0625f, -0.359375f,0.0625f, -0.367188f,0.0625f, -0.375f,0.0625f, -0.382813f,0.0625f, -0.390625f,0.0625f, -0.398438f,0.0625f, -0.40625f,0.0625f, -0.414063f,0.0625f, -0.421875f,0.0625f, -0.429688f,0.0625f, -0.4375f,0.0625f, -0.445313f,0.0625f, -0.453125f,0.0625f, -0.460938f,0.0625f, -0.46875f,0.0625f, -0.476563f,0.0625f, -0.484375f,0.0625f, -0.492188f,0.0625f, -0.5f,0.0625f, -0.507813f,0.0625f, -0.0f,0.0703125f, -0.0078125f,0.0703125f, -0.015625f,0.0703125f, -0.0234375f,0.0703125f, -0.03125f,0.0703125f, -0.0390625f,0.0703125f, -0.046875f,0.0703125f, -0.0546875f,0.0703125f, -0.0625f,0.0703125f, -0.0703125f,0.0703125f, -0.078125f,0.0703125f, -0.0859375f,0.0703125f, -0.09375f,0.0703125f, -0.101563f,0.0703125f, -0.109375f,0.0703125f, -0.117188f,0.0703125f, -0.125f,0.0703125f, -0.132813f,0.0703125f, -0.140625f,0.0703125f, -0.148438f,0.0703125f, -0.15625f,0.0703125f, -0.164063f,0.0703125f, -0.171875f,0.0703125f, -0.179688f,0.0703125f, -0.1875f,0.0703125f, -0.195313f,0.0703125f, -0.203125f,0.0703125f, -0.210938f,0.0703125f, -0.21875f,0.0703125f, -0.226563f,0.0703125f, -0.234375f,0.0703125f, -0.242188f,0.0703125f, -0.25f,0.0703125f, -0.257813f,0.0703125f, -0.265625f,0.0703125f, -0.273438f,0.0703125f, -0.28125f,0.0703125f, -0.289063f,0.0703125f, -0.296875f,0.0703125f, -0.304688f,0.0703125f, -0.3125f,0.0703125f, -0.320313f,0.0703125f, -0.328125f,0.0703125f, -0.335938f,0.0703125f, -0.34375f,0.0703125f, -0.351563f,0.0703125f, -0.359375f,0.0703125f, -0.367188f,0.0703125f, -0.375f,0.0703125f, -0.382813f,0.0703125f, -0.390625f,0.0703125f, -0.398438f,0.0703125f, -0.40625f,0.0703125f, -0.414063f,0.0703125f, -0.421875f,0.0703125f, -0.429688f,0.0703125f, -0.4375f,0.0703125f, -0.445313f,0.0703125f, -0.453125f,0.0703125f, -0.460938f,0.0703125f, -0.46875f,0.0703125f, -0.476563f,0.0703125f, -0.484375f,0.0703125f, -0.492188f,0.0703125f, -0.5f,0.0703125f, -0.507813f,0.0703125f, -0.0f,0.078125f, -0.0078125f,0.078125f, -0.015625f,0.078125f, -0.0234375f,0.078125f, -0.03125f,0.078125f, -0.0390625f,0.078125f, -0.046875f,0.078125f, -0.0546875f,0.078125f, -0.0625f,0.078125f, -0.0703125f,0.078125f, -0.078125f,0.078125f, -0.0859375f,0.078125f, -0.09375f,0.078125f, -0.101563f,0.078125f, -0.109375f,0.078125f, -0.117188f,0.078125f, -0.125f,0.078125f, -0.132813f,0.078125f, -0.140625f,0.078125f, -0.148438f,0.078125f, -0.15625f,0.078125f, -0.164063f,0.078125f, -0.171875f,0.078125f, -0.179688f,0.078125f, -0.1875f,0.078125f, -0.195313f,0.078125f, -0.203125f,0.078125f, -0.210938f,0.078125f, -0.21875f,0.078125f, -0.226563f,0.078125f, -0.234375f,0.078125f, -0.242188f,0.078125f, -0.25f,0.078125f, -0.257813f,0.078125f, -0.265625f,0.078125f, -0.273438f,0.078125f, -0.28125f,0.078125f, -0.289063f,0.078125f, -0.296875f,0.078125f, -0.304688f,0.078125f, -0.3125f,0.078125f, -0.320313f,0.078125f, -0.328125f,0.078125f, -0.335938f,0.078125f, -0.34375f,0.078125f, -0.351563f,0.078125f, -0.359375f,0.078125f, -0.367188f,0.078125f, -0.375f,0.078125f, -0.382813f,0.078125f, -0.390625f,0.078125f, -0.398438f,0.078125f, -0.40625f,0.078125f, -0.414063f,0.078125f, -0.421875f,0.078125f, -0.429688f,0.078125f, -0.4375f,0.078125f, -0.445313f,0.078125f, -0.453125f,0.078125f, -0.460938f,0.078125f, -0.46875f,0.078125f, -0.476563f,0.078125f, -0.484375f,0.078125f, -0.492188f,0.078125f, -0.5f,0.078125f, -0.507813f,0.078125f, -0.0f,0.0859375f, -0.0078125f,0.0859375f, -0.015625f,0.0859375f, -0.0234375f,0.0859375f, -0.03125f,0.0859375f, -0.0390625f,0.0859375f, -0.046875f,0.0859375f, -0.0546875f,0.0859375f, -0.0625f,0.0859375f, -0.0703125f,0.0859375f, -0.078125f,0.0859375f, -0.0859375f,0.0859375f, -0.09375f,0.0859375f, -0.101563f,0.0859375f, -0.109375f,0.0859375f, -0.117188f,0.0859375f, -0.125f,0.0859375f, -0.132813f,0.0859375f, -0.140625f,0.0859375f, -0.148438f,0.0859375f, -0.15625f,0.0859375f, -0.164063f,0.0859375f, -0.171875f,0.0859375f, -0.179688f,0.0859375f, -0.1875f,0.0859375f, -0.195313f,0.0859375f, -0.203125f,0.0859375f, -0.210938f,0.0859375f, -0.21875f,0.0859375f, -0.226563f,0.0859375f, -0.234375f,0.0859375f, -0.242188f,0.0859375f, -0.25f,0.0859375f, -0.257813f,0.0859375f, -0.265625f,0.0859375f, -0.273438f,0.0859375f, -0.28125f,0.0859375f, -0.289063f,0.0859375f, -0.296875f,0.0859375f, -0.304688f,0.0859375f, -0.3125f,0.0859375f, -0.320313f,0.0859375f, -0.328125f,0.0859375f, -0.335938f,0.0859375f, -0.34375f,0.0859375f, -0.351563f,0.0859375f, -0.359375f,0.0859375f, -0.367188f,0.0859375f, -0.375f,0.0859375f, -0.382813f,0.0859375f, -0.390625f,0.0859375f, -0.398438f,0.0859375f, -0.40625f,0.0859375f, -0.414063f,0.0859375f, -0.421875f,0.0859375f, -0.429688f,0.0859375f, -0.4375f,0.0859375f, -0.445313f,0.0859375f, -0.453125f,0.0859375f, -0.460938f,0.0859375f, -0.46875f,0.0859375f, -0.476563f,0.0859375f, -0.484375f,0.0859375f, -0.492188f,0.0859375f, -0.5f,0.0859375f, -0.507813f,0.0859375f, -0.0f,0.09375f, -0.0078125f,0.09375f, -0.015625f,0.09375f, -0.0234375f,0.09375f, -0.03125f,0.09375f, -0.0390625f,0.09375f, -0.046875f,0.09375f, -0.0546875f,0.09375f, -0.0625f,0.09375f, -0.0703125f,0.09375f, -0.078125f,0.09375f, -0.0859375f,0.09375f, -0.09375f,0.09375f, -0.101563f,0.09375f, -0.109375f,0.09375f, -0.117188f,0.09375f, -0.125f,0.09375f, -0.132813f,0.09375f, -0.140625f,0.09375f, -0.148438f,0.09375f, -0.15625f,0.09375f, -0.164063f,0.09375f, -0.171875f,0.09375f, -0.179688f,0.09375f, -0.1875f,0.09375f, -0.195313f,0.09375f, -0.203125f,0.09375f, -0.210938f,0.09375f, -0.21875f,0.09375f, -0.226563f,0.09375f, -0.234375f,0.09375f, -0.242188f,0.09375f, -0.25f,0.09375f, -0.257813f,0.09375f, -0.265625f,0.09375f, -0.273438f,0.09375f, -0.28125f,0.09375f, -0.289063f,0.09375f, -0.296875f,0.09375f, -0.304688f,0.09375f, -0.3125f,0.09375f, -0.320313f,0.09375f, -0.328125f,0.09375f, -0.335938f,0.09375f, -0.34375f,0.09375f, -0.351563f,0.09375f, -0.359375f,0.09375f, -0.367188f,0.09375f, -0.375f,0.09375f, -0.382813f,0.09375f, -0.390625f,0.09375f, -0.398438f,0.09375f, -0.40625f,0.09375f, -0.414063f,0.09375f, -0.421875f,0.09375f, -0.429688f,0.09375f, -0.4375f,0.09375f, -0.445313f,0.09375f, -0.453125f,0.09375f, -0.460938f,0.09375f, -0.46875f,0.09375f, -0.476563f,0.09375f, -0.484375f,0.09375f, -0.492188f,0.09375f, -0.5f,0.09375f, -0.507813f,0.09375f, -0.0f,0.101563f, -0.0078125f,0.101563f, -0.015625f,0.101563f, -0.0234375f,0.101563f, -0.03125f,0.101563f, -0.0390625f,0.101563f, -0.046875f,0.101563f, -0.0546875f,0.101563f, -0.0625f,0.101563f, -0.0703125f,0.101563f, -0.078125f,0.101563f, -0.0859375f,0.101563f, -0.09375f,0.101563f, -0.101563f,0.101563f, -0.109375f,0.101563f, -0.117188f,0.101563f, -0.125f,0.101563f, -0.132813f,0.101563f, -0.140625f,0.101563f, -0.148438f,0.101563f, -0.15625f,0.101563f, -0.164063f,0.101563f, -0.171875f,0.101563f, -0.179688f,0.101563f, -0.1875f,0.101563f, -0.195313f,0.101563f, -0.203125f,0.101563f, -0.210938f,0.101563f, -0.21875f,0.101563f, -0.226563f,0.101563f, -0.234375f,0.101563f, -0.242188f,0.101563f, -0.25f,0.101563f, -0.257813f,0.101563f, -0.265625f,0.101563f, -0.273438f,0.101563f, -0.28125f,0.101563f, -0.289063f,0.101563f, -0.296875f,0.101563f, -0.304688f,0.101563f, -0.3125f,0.101563f, -0.320313f,0.101563f, -0.328125f,0.101563f, -0.335938f,0.101563f, -0.34375f,0.101563f, -0.351563f,0.101563f, -0.359375f,0.101563f, -0.367188f,0.101563f, -0.375f,0.101563f, -0.382813f,0.101563f, -0.390625f,0.101563f, -0.398438f,0.101563f, -0.40625f,0.101563f, -0.414063f,0.101563f, -0.421875f,0.101563f, -0.429688f,0.101563f, -0.4375f,0.101563f, -0.445313f,0.101563f, -0.453125f,0.101563f, -0.460938f,0.101563f, -0.46875f,0.101563f, -0.476563f,0.101563f, -0.484375f,0.101563f, -0.492188f,0.101563f, -0.5f,0.101563f, -0.507813f,0.101563f, -0.0f,0.109375f, -0.0078125f,0.109375f, -0.015625f,0.109375f, -0.0234375f,0.109375f, -0.03125f,0.109375f, -0.0390625f,0.109375f, -0.046875f,0.109375f, -0.0546875f,0.109375f, -0.0625f,0.109375f, -0.0703125f,0.109375f, -0.078125f,0.109375f, -0.0859375f,0.109375f, -0.09375f,0.109375f, -0.101563f,0.109375f, -0.109375f,0.109375f, -0.117188f,0.109375f, -0.125f,0.109375f, -0.132813f,0.109375f, -0.140625f,0.109375f, -0.148438f,0.109375f, -0.15625f,0.109375f, -0.164063f,0.109375f, -0.171875f,0.109375f, -0.179688f,0.109375f, -0.1875f,0.109375f, -0.195313f,0.109375f, -0.203125f,0.109375f, -0.210938f,0.109375f, -0.21875f,0.109375f, -0.226563f,0.109375f, -0.234375f,0.109375f, -0.242188f,0.109375f, -0.25f,0.109375f, -0.257813f,0.109375f, -0.265625f,0.109375f, -0.273438f,0.109375f, -0.28125f,0.109375f, -0.289063f,0.109375f, -0.296875f,0.109375f, -0.304688f,0.109375f, -0.3125f,0.109375f, -0.320313f,0.109375f, -0.328125f,0.109375f, -0.335938f,0.109375f, -0.34375f,0.109375f, -0.351563f,0.109375f, -0.359375f,0.109375f, -0.367188f,0.109375f, -0.375f,0.109375f, -0.382813f,0.109375f, -0.390625f,0.109375f, -0.398438f,0.109375f, -0.40625f,0.109375f, -0.414063f,0.109375f, -0.421875f,0.109375f, -0.429688f,0.109375f, -0.4375f,0.109375f, -0.445313f,0.109375f, -0.453125f,0.109375f, -0.460938f,0.109375f, -0.46875f,0.109375f, -0.476563f,0.109375f, -0.484375f,0.109375f, -0.492188f,0.109375f, -0.5f,0.109375f, -0.507813f,0.109375f, -0.0f,0.117188f, -0.0078125f,0.117188f, -0.015625f,0.117188f, -0.0234375f,0.117188f, -0.03125f,0.117188f, -0.0390625f,0.117188f, -0.046875f,0.117188f, -0.0546875f,0.117188f, -0.0625f,0.117188f, -0.0703125f,0.117188f, -0.078125f,0.117188f, -0.0859375f,0.117188f, -0.09375f,0.117188f, -0.101563f,0.117188f, -0.109375f,0.117188f, -0.117188f,0.117188f, -0.125f,0.117188f, -0.132813f,0.117188f, -0.140625f,0.117188f, -0.148438f,0.117188f, -0.15625f,0.117188f, -0.164063f,0.117188f, -0.171875f,0.117188f, -0.179688f,0.117188f, -0.1875f,0.117188f, -0.195313f,0.117188f, -0.203125f,0.117188f, -0.210938f,0.117188f, -0.21875f,0.117188f, -0.226563f,0.117188f, -0.234375f,0.117188f, -0.242188f,0.117188f, -0.25f,0.117188f, -0.257813f,0.117188f, -0.265625f,0.117188f, -0.273438f,0.117188f, -0.28125f,0.117188f, -0.289063f,0.117188f, -0.296875f,0.117188f, -0.304688f,0.117188f, -0.3125f,0.117188f, -0.320313f,0.117188f, -0.328125f,0.117188f, -0.335938f,0.117188f, -0.34375f,0.117188f, -0.351563f,0.117188f, -0.359375f,0.117188f, -0.367188f,0.117188f, -0.375f,0.117188f, -0.382813f,0.117188f, -0.390625f,0.117188f, -0.398438f,0.117188f, -0.40625f,0.117188f, -0.414063f,0.117188f, -0.421875f,0.117188f, -0.429688f,0.117188f, -0.4375f,0.117188f, -0.445313f,0.117188f, -0.453125f,0.117188f, -0.460938f,0.117188f, -0.46875f,0.117188f, -0.476563f,0.117188f, -0.484375f,0.117188f, -0.492188f,0.117188f, -0.5f,0.117188f, -0.507813f,0.117188f, -0.0f,0.125f, -0.0078125f,0.125f, -0.015625f,0.125f, -0.0234375f,0.125f, -0.03125f,0.125f, -0.0390625f,0.125f, -0.046875f,0.125f, -0.0546875f,0.125f, -0.0625f,0.125f, -0.0703125f,0.125f, -0.078125f,0.125f, -0.0859375f,0.125f, -0.09375f,0.125f, -0.101563f,0.125f, -0.109375f,0.125f, -0.117188f,0.125f, -0.125f,0.125f, -0.132813f,0.125f, -0.140625f,0.125f, -0.148438f,0.125f, -0.15625f,0.125f, -0.164063f,0.125f, -0.171875f,0.125f, -0.179688f,0.125f, -0.1875f,0.125f, -0.195313f,0.125f, -0.203125f,0.125f, -0.210938f,0.125f, -0.21875f,0.125f, -0.226563f,0.125f, -0.234375f,0.125f, -0.242188f,0.125f, -0.25f,0.125f, -0.257813f,0.125f, -0.265625f,0.125f, -0.273438f,0.125f, -0.28125f,0.125f, -0.289063f,0.125f, -0.296875f,0.125f, -0.304688f,0.125f, -0.3125f,0.125f, -0.320313f,0.125f, -0.328125f,0.125f, -0.335938f,0.125f, -0.34375f,0.125f, -0.351563f,0.125f, -0.359375f,0.125f, -0.367188f,0.125f, -0.375f,0.125f, -0.382813f,0.125f, -0.390625f,0.125f, -0.398438f,0.125f, -0.40625f,0.125f, -0.414063f,0.125f, -0.421875f,0.125f, -0.429688f,0.125f, -0.4375f,0.125f, -0.445313f,0.125f, -0.453125f,0.125f, -0.460938f,0.125f, -0.46875f,0.125f, -0.476563f,0.125f, -0.484375f,0.125f, -0.492188f,0.125f, -0.5f,0.125f, -0.507813f,0.125f, -0.0f,0.132813f, -0.0078125f,0.132813f, -0.015625f,0.132813f, -0.0234375f,0.132813f, -0.03125f,0.132813f, -0.0390625f,0.132813f, -0.046875f,0.132813f, -0.0546875f,0.132813f, -0.0625f,0.132813f, -0.0703125f,0.132813f, -0.078125f,0.132813f, -0.0859375f,0.132813f, -0.09375f,0.132813f, -0.101563f,0.132813f, -0.109375f,0.132813f, -0.117188f,0.132813f, -0.125f,0.132813f, -0.132813f,0.132813f, -0.140625f,0.132813f, -0.148438f,0.132813f, -0.15625f,0.132813f, -0.164063f,0.132813f, -0.171875f,0.132813f, -0.179688f,0.132813f, -0.1875f,0.132813f, -0.195313f,0.132813f, -0.203125f,0.132813f, -0.210938f,0.132813f, -0.21875f,0.132813f, -0.226563f,0.132813f, -0.234375f,0.132813f, -0.242188f,0.132813f, -0.25f,0.132813f, -0.257813f,0.132813f, -0.265625f,0.132813f, -0.273438f,0.132813f, -0.28125f,0.132813f, -0.289063f,0.132813f, -0.296875f,0.132813f, -0.304688f,0.132813f, -0.3125f,0.132813f, -0.320313f,0.132813f, -0.328125f,0.132813f, -0.335938f,0.132813f, -0.34375f,0.132813f, -0.351563f,0.132813f, -0.359375f,0.132813f, -0.367188f,0.132813f, -0.375f,0.132813f, -0.382813f,0.132813f, -0.390625f,0.132813f, -0.398438f,0.132813f, -0.40625f,0.132813f, -0.414063f,0.132813f, -0.421875f,0.132813f, -0.429688f,0.132813f, -0.4375f,0.132813f, -0.445313f,0.132813f, -0.453125f,0.132813f, -0.460938f,0.132813f, -0.46875f,0.132813f, -0.476563f,0.132813f, -0.484375f,0.132813f, -0.492188f,0.132813f, -0.5f,0.132813f, -0.507813f,0.132813f, -0.0f,0.140625f, -0.0078125f,0.140625f, -0.015625f,0.140625f, -0.0234375f,0.140625f, -0.03125f,0.140625f, -0.0390625f,0.140625f, -0.046875f,0.140625f, -0.0546875f,0.140625f, -0.0625f,0.140625f, -0.0703125f,0.140625f, -0.078125f,0.140625f, -0.0859375f,0.140625f, -0.09375f,0.140625f, -0.101563f,0.140625f, -0.109375f,0.140625f, -0.117188f,0.140625f, -0.125f,0.140625f, -0.132813f,0.140625f, -0.140625f,0.140625f, -0.148438f,0.140625f, -0.15625f,0.140625f, -0.164063f,0.140625f, -0.171875f,0.140625f, -0.179688f,0.140625f, -0.1875f,0.140625f, -0.195313f,0.140625f, -0.203125f,0.140625f, -0.210938f,0.140625f, -0.21875f,0.140625f, -0.226563f,0.140625f, -0.234375f,0.140625f, -0.242188f,0.140625f, -0.25f,0.140625f, -0.257813f,0.140625f, -0.265625f,0.140625f, -0.273438f,0.140625f, -0.28125f,0.140625f, -0.289063f,0.140625f, -0.296875f,0.140625f, -0.304688f,0.140625f, -0.3125f,0.140625f, -0.320313f,0.140625f, -0.328125f,0.140625f, -0.335938f,0.140625f, -0.34375f,0.140625f, -0.351563f,0.140625f, -0.359375f,0.140625f, -0.367188f,0.140625f, -0.375f,0.140625f, -0.382813f,0.140625f, -0.390625f,0.140625f, -0.398438f,0.140625f, -0.40625f,0.140625f, -0.414063f,0.140625f, -0.421875f,0.140625f, -0.429688f,0.140625f, -0.4375f,0.140625f, -0.445313f,0.140625f, -0.453125f,0.140625f, -0.460938f,0.140625f, -0.46875f,0.140625f, -0.476563f,0.140625f, -0.484375f,0.140625f, -0.492188f,0.140625f, -0.5f,0.140625f, -0.507813f,0.140625f, -0.0f,0.148438f, -0.0078125f,0.148438f, -0.015625f,0.148438f, -0.0234375f,0.148438f, -0.03125f,0.148438f, -0.0390625f,0.148438f, -0.046875f,0.148438f, -0.0546875f,0.148438f, -0.0625f,0.148438f, -0.0703125f,0.148438f, -0.078125f,0.148438f, -0.0859375f,0.148438f, -0.09375f,0.148438f, -0.101563f,0.148438f, -0.109375f,0.148438f, -0.117188f,0.148438f, -0.125f,0.148438f, -0.132813f,0.148438f, -0.140625f,0.148438f, -0.148438f,0.148438f, -0.15625f,0.148438f, -0.164063f,0.148438f, -0.171875f,0.148438f, -0.179688f,0.148438f, -0.1875f,0.148438f, -0.195313f,0.148438f, -0.203125f,0.148438f, -0.210938f,0.148438f, -0.21875f,0.148438f, -0.226563f,0.148438f, -0.234375f,0.148438f, -0.242188f,0.148438f, -0.25f,0.148438f, -0.257813f,0.148438f, -0.265625f,0.148438f, -0.273438f,0.148438f, -0.28125f,0.148438f, -0.289063f,0.148438f, -0.296875f,0.148438f, -0.304688f,0.148438f, -0.3125f,0.148438f, -0.320313f,0.148438f, -0.328125f,0.148438f, -0.335938f,0.148438f, -0.34375f,0.148438f, -0.351563f,0.148438f, -0.359375f,0.148438f, -0.367188f,0.148438f, -0.375f,0.148438f, -0.382813f,0.148438f, -0.390625f,0.148438f, -0.398438f,0.148438f, -0.40625f,0.148438f, -0.414063f,0.148438f, -0.421875f,0.148438f, -0.429688f,0.148438f, -0.4375f,0.148438f, -0.445313f,0.148438f, -0.453125f,0.148438f, -0.460938f,0.148438f, -0.46875f,0.148438f, -0.476563f,0.148438f, -0.484375f,0.148438f, -0.492188f,0.148438f, -0.5f,0.148438f, -0.507813f,0.148438f, -0.0f,0.15625f, -0.0078125f,0.15625f, -0.015625f,0.15625f, -0.0234375f,0.15625f, -0.03125f,0.15625f, -0.0390625f,0.15625f, -0.046875f,0.15625f, -0.0546875f,0.15625f, -0.0625f,0.15625f, -0.0703125f,0.15625f, -0.078125f,0.15625f, -0.0859375f,0.15625f, -0.09375f,0.15625f, -0.101563f,0.15625f, -0.109375f,0.15625f, -0.117188f,0.15625f, -0.125f,0.15625f, -0.132813f,0.15625f, -0.140625f,0.15625f, -0.148438f,0.15625f, -0.15625f,0.15625f, -0.164063f,0.15625f, -0.171875f,0.15625f, -0.179688f,0.15625f, -0.1875f,0.15625f, -0.195313f,0.15625f, -0.203125f,0.15625f, -0.210938f,0.15625f, -0.21875f,0.15625f, -0.226563f,0.15625f, -0.234375f,0.15625f, -0.242188f,0.15625f, -0.25f,0.15625f, -0.257813f,0.15625f, -0.265625f,0.15625f, -0.273438f,0.15625f, -0.28125f,0.15625f, -0.289063f,0.15625f, -0.296875f,0.15625f, -0.304688f,0.15625f, -0.3125f,0.15625f, -0.320313f,0.15625f, -0.328125f,0.15625f, -0.335938f,0.15625f, -0.34375f,0.15625f, -0.351563f,0.15625f, -0.359375f,0.15625f, -0.367188f,0.15625f, -0.375f,0.15625f, -0.382813f,0.15625f, -0.390625f,0.15625f, -0.398438f,0.15625f, -0.40625f,0.15625f, -0.414063f,0.15625f, -0.421875f,0.15625f, -0.429688f,0.15625f, -0.4375f,0.15625f, -0.445313f,0.15625f, -0.453125f,0.15625f, -0.460938f,0.15625f, -0.46875f,0.15625f, -0.476563f,0.15625f, -0.484375f,0.15625f, -0.492188f,0.15625f, -0.5f,0.15625f, -0.507813f,0.15625f, -0.0f,0.164063f, -0.0078125f,0.164063f, -0.015625f,0.164063f, -0.0234375f,0.164063f, -0.03125f,0.164063f, -0.0390625f,0.164063f, -0.046875f,0.164063f, -0.0546875f,0.164063f, -0.0625f,0.164063f, -0.0703125f,0.164063f, -0.078125f,0.164063f, -0.0859375f,0.164063f, -0.09375f,0.164063f, -0.101563f,0.164063f, -0.109375f,0.164063f, -0.117188f,0.164063f, -0.125f,0.164063f, -0.132813f,0.164063f, -0.140625f,0.164063f, -0.148438f,0.164063f, -0.15625f,0.164063f, -0.164063f,0.164063f, -0.171875f,0.164063f, -0.179688f,0.164063f, -0.1875f,0.164063f, -0.195313f,0.164063f, -0.203125f,0.164063f, -0.210938f,0.164063f, -0.21875f,0.164063f, -0.226563f,0.164063f, -0.234375f,0.164063f, -0.242188f,0.164063f, -0.25f,0.164063f, -0.257813f,0.164063f, -0.265625f,0.164063f, -0.273438f,0.164063f, -0.28125f,0.164063f, -0.289063f,0.164063f, -0.296875f,0.164063f, -0.304688f,0.164063f, -0.3125f,0.164063f, -0.320313f,0.164063f, -0.328125f,0.164063f, -0.335938f,0.164063f, -0.34375f,0.164063f, -0.351563f,0.164063f, -0.359375f,0.164063f, -0.367188f,0.164063f, -0.375f,0.164063f, -0.382813f,0.164063f, -0.390625f,0.164063f, -0.398438f,0.164063f, -0.40625f,0.164063f, -0.414063f,0.164063f, -0.421875f,0.164063f, -0.429688f,0.164063f, -0.4375f,0.164063f, -0.445313f,0.164063f, -0.453125f,0.164063f, -0.460938f,0.164063f, -0.46875f,0.164063f, -0.476563f,0.164063f, -0.484375f,0.164063f, -0.492188f,0.164063f, -0.5f,0.164063f, -0.507813f,0.164063f, -0.0f,0.171875f, -0.0078125f,0.171875f, -0.015625f,0.171875f, -0.0234375f,0.171875f, -0.03125f,0.171875f, -0.0390625f,0.171875f, -0.046875f,0.171875f, -0.0546875f,0.171875f, -0.0625f,0.171875f, -0.0703125f,0.171875f, -0.078125f,0.171875f, -0.0859375f,0.171875f, -0.09375f,0.171875f, -0.101563f,0.171875f, -0.109375f,0.171875f, -0.117188f,0.171875f, -0.125f,0.171875f, -0.132813f,0.171875f, -0.140625f,0.171875f, -0.148438f,0.171875f, -0.15625f,0.171875f, -0.164063f,0.171875f, -0.171875f,0.171875f, -0.179688f,0.171875f, -0.1875f,0.171875f, -0.195313f,0.171875f, -0.203125f,0.171875f, -0.210938f,0.171875f, -0.21875f,0.171875f, -0.226563f,0.171875f, -0.234375f,0.171875f, -0.242188f,0.171875f, -0.25f,0.171875f, -0.257813f,0.171875f, -0.265625f,0.171875f, -0.273438f,0.171875f, -0.28125f,0.171875f, -0.289063f,0.171875f, -0.296875f,0.171875f, -0.304688f,0.171875f, -0.3125f,0.171875f, -0.320313f,0.171875f, -0.328125f,0.171875f, -0.335938f,0.171875f, -0.34375f,0.171875f, -0.351563f,0.171875f, -0.359375f,0.171875f, -0.367188f,0.171875f, -0.375f,0.171875f, -0.382813f,0.171875f, -0.390625f,0.171875f, -0.398438f,0.171875f, -0.40625f,0.171875f, -0.414063f,0.171875f, -0.421875f,0.171875f, -0.429688f,0.171875f, -0.4375f,0.171875f, -0.445313f,0.171875f, -0.453125f,0.171875f, -0.460938f,0.171875f, -0.46875f,0.171875f, -0.476563f,0.171875f, -0.484375f,0.171875f, -0.492188f,0.171875f, -0.5f,0.171875f, -0.507813f,0.171875f, -0.0f,0.179688f, -0.0078125f,0.179688f, -0.015625f,0.179688f, -0.0234375f,0.179688f, -0.03125f,0.179688f, -0.0390625f,0.179688f, -0.046875f,0.179688f, -0.0546875f,0.179688f, -0.0625f,0.179688f, -0.0703125f,0.179688f, -0.078125f,0.179688f, -0.0859375f,0.179688f, -0.09375f,0.179688f, -0.101563f,0.179688f, -0.109375f,0.179688f, -0.117188f,0.179688f, -0.125f,0.179688f, -0.132813f,0.179688f, -0.140625f,0.179688f, -0.148438f,0.179688f, -0.15625f,0.179688f, -0.164063f,0.179688f, -0.171875f,0.179688f, -0.179688f,0.179688f, -0.1875f,0.179688f, -0.195313f,0.179688f, -0.203125f,0.179688f, -0.210938f,0.179688f, -0.21875f,0.179688f, -0.226563f,0.179688f, -0.234375f,0.179688f, -0.242188f,0.179688f, -0.25f,0.179688f, -0.257813f,0.179688f, -0.265625f,0.179688f, -0.273438f,0.179688f, -0.28125f,0.179688f, -0.289063f,0.179688f, -0.296875f,0.179688f, -0.304688f,0.179688f, -0.3125f,0.179688f, -0.320313f,0.179688f, -0.328125f,0.179688f, -0.335938f,0.179688f, -0.34375f,0.179688f, -0.351563f,0.179688f, -0.359375f,0.179688f, -0.367188f,0.179688f, -0.375f,0.179688f, -0.382813f,0.179688f, -0.390625f,0.179688f, -0.398438f,0.179688f, -0.40625f,0.179688f, -0.414063f,0.179688f, -0.421875f,0.179688f, -0.429688f,0.179688f, -0.4375f,0.179688f, -0.445313f,0.179688f, -0.453125f,0.179688f, -0.460938f,0.179688f, -0.46875f,0.179688f, -0.476563f,0.179688f, -0.484375f,0.179688f, -0.492188f,0.179688f, -0.5f,0.179688f, -0.507813f,0.179688f, -0.0f,0.1875f, -0.0078125f,0.1875f, -0.015625f,0.1875f, -0.0234375f,0.1875f, -0.03125f,0.1875f, -0.0390625f,0.1875f, -0.046875f,0.1875f, -0.0546875f,0.1875f, -0.0625f,0.1875f, -0.0703125f,0.1875f, -0.078125f,0.1875f, -0.0859375f,0.1875f, -0.09375f,0.1875f, -0.101563f,0.1875f, -0.109375f,0.1875f, -0.117188f,0.1875f, -0.125f,0.1875f, -0.132813f,0.1875f, -0.140625f,0.1875f, -0.148438f,0.1875f, -0.15625f,0.1875f, -0.164063f,0.1875f, -0.171875f,0.1875f, -0.179688f,0.1875f, -0.1875f,0.1875f, -0.195313f,0.1875f, -0.203125f,0.1875f, -0.210938f,0.1875f, -0.21875f,0.1875f, -0.226563f,0.1875f, -0.234375f,0.1875f, -0.242188f,0.1875f, -0.25f,0.1875f, -0.257813f,0.1875f, -0.265625f,0.1875f, -0.273438f,0.1875f, -0.28125f,0.1875f, -0.289063f,0.1875f, -0.296875f,0.1875f, -0.304688f,0.1875f, -0.3125f,0.1875f, -0.320313f,0.1875f, -0.328125f,0.1875f, -0.335938f,0.1875f, -0.34375f,0.1875f, -0.351563f,0.1875f, -0.359375f,0.1875f, -0.367188f,0.1875f, -0.375f,0.1875f, -0.382813f,0.1875f, -0.390625f,0.1875f, -0.398438f,0.1875f, -0.40625f,0.1875f, -0.414063f,0.1875f, -0.421875f,0.1875f, -0.429688f,0.1875f, -0.4375f,0.1875f, -0.445313f,0.1875f, -0.453125f,0.1875f, -0.460938f,0.1875f, -0.46875f,0.1875f, -0.476563f,0.1875f, -0.484375f,0.1875f, -0.492188f,0.1875f, -0.5f,0.1875f, -0.507813f,0.1875f, -0.0f,0.195313f, -0.0078125f,0.195313f, -0.015625f,0.195313f, -0.0234375f,0.195313f, -0.03125f,0.195313f, -0.0390625f,0.195313f, -0.046875f,0.195313f, -0.0546875f,0.195313f, -0.0625f,0.195313f, -0.0703125f,0.195313f, -0.078125f,0.195313f, -0.0859375f,0.195313f, -0.09375f,0.195313f, -0.101563f,0.195313f, -0.109375f,0.195313f, -0.117188f,0.195313f, -0.125f,0.195313f, -0.132813f,0.195313f, -0.140625f,0.195313f, -0.148438f,0.195313f, -0.15625f,0.195313f, -0.164063f,0.195313f, -0.171875f,0.195313f, -0.179688f,0.195313f, -0.1875f,0.195313f, -0.195313f,0.195313f, -0.203125f,0.195313f, -0.210938f,0.195313f, -0.21875f,0.195313f, -0.226563f,0.195313f, -0.234375f,0.195313f, -0.242188f,0.195313f, -0.25f,0.195313f, -0.257813f,0.195313f, -0.265625f,0.195313f, -0.273438f,0.195313f, -0.28125f,0.195313f, -0.289063f,0.195313f, -0.296875f,0.195313f, -0.304688f,0.195313f, -0.3125f,0.195313f, -0.320313f,0.195313f, -0.328125f,0.195313f, -0.335938f,0.195313f, -0.34375f,0.195313f, -0.351563f,0.195313f, -0.359375f,0.195313f, -0.367188f,0.195313f, -0.375f,0.195313f, -0.382813f,0.195313f, -0.390625f,0.195313f, -0.398438f,0.195313f, -0.40625f,0.195313f, -0.414063f,0.195313f, -0.421875f,0.195313f, -0.429688f,0.195313f, -0.4375f,0.195313f, -0.445313f,0.195313f, -0.453125f,0.195313f, -0.460938f,0.195313f, -0.46875f,0.195313f, -0.476563f,0.195313f, -0.484375f,0.195313f, -0.492188f,0.195313f, -0.5f,0.195313f, -0.507813f,0.195313f, -0.0f,0.203125f, -0.0078125f,0.203125f, -0.015625f,0.203125f, -0.0234375f,0.203125f, -0.03125f,0.203125f, -0.0390625f,0.203125f, -0.046875f,0.203125f, -0.0546875f,0.203125f, -0.0625f,0.203125f, -0.0703125f,0.203125f, -0.078125f,0.203125f, -0.0859375f,0.203125f, -0.09375f,0.203125f, -0.101563f,0.203125f, -0.109375f,0.203125f, -0.117188f,0.203125f, -0.125f,0.203125f, -0.132813f,0.203125f, -0.140625f,0.203125f, -0.148438f,0.203125f, -0.15625f,0.203125f, -0.164063f,0.203125f, -0.171875f,0.203125f, -0.179688f,0.203125f, -0.1875f,0.203125f, -0.195313f,0.203125f, -0.203125f,0.203125f, -0.210938f,0.203125f, -0.21875f,0.203125f, -0.226563f,0.203125f, -0.234375f,0.203125f, -0.242188f,0.203125f, -0.25f,0.203125f, -0.257813f,0.203125f, -0.265625f,0.203125f, -0.273438f,0.203125f, -0.28125f,0.203125f, -0.289063f,0.203125f, -0.296875f,0.203125f, -0.304688f,0.203125f, -0.3125f,0.203125f, -0.320313f,0.203125f, -0.328125f,0.203125f, -0.335938f,0.203125f, -0.34375f,0.203125f, -0.351563f,0.203125f, -0.359375f,0.203125f, -0.367188f,0.203125f, -0.375f,0.203125f, -0.382813f,0.203125f, -0.390625f,0.203125f, -0.398438f,0.203125f, -0.40625f,0.203125f, -0.414063f,0.203125f, -0.421875f,0.203125f, -0.429688f,0.203125f, -0.4375f,0.203125f, -0.445313f,0.203125f, -0.453125f,0.203125f, -0.460938f,0.203125f, -0.46875f,0.203125f, -0.476563f,0.203125f, -0.484375f,0.203125f, -0.492188f,0.203125f, -0.5f,0.203125f, -0.507813f,0.203125f, -0.0f,0.210938f, -0.0078125f,0.210938f, -0.015625f,0.210938f, -0.0234375f,0.210938f, -0.03125f,0.210938f, -0.0390625f,0.210938f, -0.046875f,0.210938f, -0.0546875f,0.210938f, -0.0625f,0.210938f, -0.0703125f,0.210938f, -0.078125f,0.210938f, -0.0859375f,0.210938f, -0.09375f,0.210938f, -0.101563f,0.210938f, -0.109375f,0.210938f, -0.117188f,0.210938f, -0.125f,0.210938f, -0.132813f,0.210938f, -0.140625f,0.210938f, -0.148438f,0.210938f, -0.15625f,0.210938f, -0.164063f,0.210938f, -0.171875f,0.210938f, -0.179688f,0.210938f, -0.1875f,0.210938f, -0.195313f,0.210938f, -0.203125f,0.210938f, -0.210938f,0.210938f, -0.21875f,0.210938f, -0.226563f,0.210938f, -0.234375f,0.210938f, -0.242188f,0.210938f, -0.25f,0.210938f, -0.257813f,0.210938f, -0.265625f,0.210938f, -0.273438f,0.210938f, -0.28125f,0.210938f, -0.289063f,0.210938f, -0.296875f,0.210938f, -0.304688f,0.210938f, -0.3125f,0.210938f, -0.320313f,0.210938f, -0.328125f,0.210938f, -0.335938f,0.210938f, -0.34375f,0.210938f, -0.351563f,0.210938f, -0.359375f,0.210938f, -0.367188f,0.210938f, -0.375f,0.210938f, -0.382813f,0.210938f, -0.390625f,0.210938f, -0.398438f,0.210938f, -0.40625f,0.210938f, -0.414063f,0.210938f, -0.421875f,0.210938f, -0.429688f,0.210938f, -0.4375f,0.210938f, -0.445313f,0.210938f, -0.453125f,0.210938f, -0.460938f,0.210938f, -0.46875f,0.210938f, -0.476563f,0.210938f, -0.484375f,0.210938f, -0.492188f,0.210938f, -0.5f,0.210938f, -0.507813f,0.210938f, -0.0f,0.21875f, -0.0078125f,0.21875f, -0.015625f,0.21875f, -0.0234375f,0.21875f, -0.03125f,0.21875f, -0.0390625f,0.21875f, -0.046875f,0.21875f, -0.0546875f,0.21875f, -0.0625f,0.21875f, -0.0703125f,0.21875f, -0.078125f,0.21875f, -0.0859375f,0.21875f, -0.09375f,0.21875f, -0.101563f,0.21875f, -0.109375f,0.21875f, -0.117188f,0.21875f, -0.125f,0.21875f, -0.132813f,0.21875f, -0.140625f,0.21875f, -0.148438f,0.21875f, -0.15625f,0.21875f, -0.164063f,0.21875f, -0.171875f,0.21875f, -0.179688f,0.21875f, -0.1875f,0.21875f, -0.195313f,0.21875f, -0.203125f,0.21875f, -0.210938f,0.21875f, -0.21875f,0.21875f, -0.226563f,0.21875f, -0.234375f,0.21875f, -0.242188f,0.21875f, -0.25f,0.21875f, -0.257813f,0.21875f, -0.265625f,0.21875f, -0.273438f,0.21875f, -0.28125f,0.21875f, -0.289063f,0.21875f, -0.296875f,0.21875f, -0.304688f,0.21875f, -0.3125f,0.21875f, -0.320313f,0.21875f, -0.328125f,0.21875f, -0.335938f,0.21875f, -0.34375f,0.21875f, -0.351563f,0.21875f, -0.359375f,0.21875f, -0.367188f,0.21875f, -0.375f,0.21875f, -0.382813f,0.21875f, -0.390625f,0.21875f, -0.398438f,0.21875f, -0.40625f,0.21875f, -0.414063f,0.21875f, -0.421875f,0.21875f, -0.429688f,0.21875f, -0.4375f,0.21875f, -0.445313f,0.21875f, -0.453125f,0.21875f, -0.460938f,0.21875f, -0.46875f,0.21875f, -0.476563f,0.21875f, -0.484375f,0.21875f, -0.492188f,0.21875f, -0.5f,0.21875f, -0.507813f,0.21875f, -0.0f,0.226563f, -0.0078125f,0.226563f, -0.015625f,0.226563f, -0.0234375f,0.226563f, -0.03125f,0.226563f, -0.0390625f,0.226563f, -0.046875f,0.226563f, -0.0546875f,0.226563f, -0.0625f,0.226563f, -0.0703125f,0.226563f, -0.078125f,0.226563f, -0.0859375f,0.226563f, -0.09375f,0.226563f, -0.101563f,0.226563f, -0.109375f,0.226563f, -0.117188f,0.226563f, -0.125f,0.226563f, -0.132813f,0.226563f, -0.140625f,0.226563f, -0.148438f,0.226563f, -0.15625f,0.226563f, -0.164063f,0.226563f, -0.171875f,0.226563f, -0.179688f,0.226563f, -0.1875f,0.226563f, -0.195313f,0.226563f, -0.203125f,0.226563f, -0.210938f,0.226563f, -0.21875f,0.226563f, -0.226563f,0.226563f, -0.234375f,0.226563f, -0.242188f,0.226563f, -0.25f,0.226563f, -0.257813f,0.226563f, -0.265625f,0.226563f, -0.273438f,0.226563f, -0.28125f,0.226563f, -0.289063f,0.226563f, -0.296875f,0.226563f, -0.304688f,0.226563f, -0.3125f,0.226563f, -0.320313f,0.226563f, -0.328125f,0.226563f, -0.335938f,0.226563f, -0.34375f,0.226563f, -0.351563f,0.226563f, -0.359375f,0.226563f, -0.367188f,0.226563f, -0.375f,0.226563f, -0.382813f,0.226563f, -0.390625f,0.226563f, -0.398438f,0.226563f, -0.40625f,0.226563f, -0.414063f,0.226563f, -0.421875f,0.226563f, -0.429688f,0.226563f, -0.4375f,0.226563f, -0.445313f,0.226563f, -0.453125f,0.226563f, -0.460938f,0.226563f, -0.46875f,0.226563f, -0.476563f,0.226563f, -0.484375f,0.226563f, -0.492188f,0.226563f, -0.5f,0.226563f, -0.507813f,0.226563f, -0.0f,0.234375f, -0.0078125f,0.234375f, -0.015625f,0.234375f, -0.0234375f,0.234375f, -0.03125f,0.234375f, -0.0390625f,0.234375f, -0.046875f,0.234375f, -0.0546875f,0.234375f, -0.0625f,0.234375f, -0.0703125f,0.234375f, -0.078125f,0.234375f, -0.0859375f,0.234375f, -0.09375f,0.234375f, -0.101563f,0.234375f, -0.109375f,0.234375f, -0.117188f,0.234375f, -0.125f,0.234375f, -0.132813f,0.234375f, -0.140625f,0.234375f, -0.148438f,0.234375f, -0.15625f,0.234375f, -0.164063f,0.234375f, -0.171875f,0.234375f, -0.179688f,0.234375f, -0.1875f,0.234375f, -0.195313f,0.234375f, -0.203125f,0.234375f, -0.210938f,0.234375f, -0.21875f,0.234375f, -0.226563f,0.234375f, -0.234375f,0.234375f, -0.242188f,0.234375f, -0.25f,0.234375f, -0.257813f,0.234375f, -0.265625f,0.234375f, -0.273438f,0.234375f, -0.28125f,0.234375f, -0.289063f,0.234375f, -0.296875f,0.234375f, -0.304688f,0.234375f, -0.3125f,0.234375f, -0.320313f,0.234375f, -0.328125f,0.234375f, -0.335938f,0.234375f, -0.34375f,0.234375f, -0.351563f,0.234375f, -0.359375f,0.234375f, -0.367188f,0.234375f, -0.375f,0.234375f, -0.382813f,0.234375f, -0.390625f,0.234375f, -0.398438f,0.234375f, -0.40625f,0.234375f, -0.414063f,0.234375f, -0.421875f,0.234375f, -0.429688f,0.234375f, -0.4375f,0.234375f, -0.445313f,0.234375f, -0.453125f,0.234375f, -0.460938f,0.234375f, -0.46875f,0.234375f, -0.476563f,0.234375f, -0.484375f,0.234375f, -0.492188f,0.234375f, -0.5f,0.234375f, -0.507813f,0.234375f, -0.0f,0.242188f, -0.0078125f,0.242188f, -0.015625f,0.242188f, -0.0234375f,0.242188f, -0.03125f,0.242188f, -0.0390625f,0.242188f, -0.046875f,0.242188f, -0.0546875f,0.242188f, -0.0625f,0.242188f, -0.0703125f,0.242188f, -0.078125f,0.242188f, -0.0859375f,0.242188f, -0.09375f,0.242188f, -0.101563f,0.242188f, -0.109375f,0.242188f, -0.117188f,0.242188f, -0.125f,0.242188f, -0.132813f,0.242188f, -0.140625f,0.242188f, -0.148438f,0.242188f, -0.15625f,0.242188f, -0.164063f,0.242188f, -0.171875f,0.242188f, -0.179688f,0.242188f, -0.1875f,0.242188f, -0.195313f,0.242188f, -0.203125f,0.242188f, -0.210938f,0.242188f, -0.21875f,0.242188f, -0.226563f,0.242188f, -0.234375f,0.242188f, -0.242188f,0.242188f, -0.25f,0.242188f, -0.257813f,0.242188f, -0.265625f,0.242188f, -0.273438f,0.242188f, -0.28125f,0.242188f, -0.289063f,0.242188f, -0.296875f,0.242188f, -0.304688f,0.242188f, -0.3125f,0.242188f, -0.320313f,0.242188f, -0.328125f,0.242188f, -0.335938f,0.242188f, -0.34375f,0.242188f, -0.351563f,0.242188f, -0.359375f,0.242188f, -0.367188f,0.242188f, -0.375f,0.242188f, -0.382813f,0.242188f, -0.390625f,0.242188f, -0.398438f,0.242188f, -0.40625f,0.242188f, -0.414063f,0.242188f, -0.421875f,0.242188f, -0.429688f,0.242188f, -0.4375f,0.242188f, -0.445313f,0.242188f, -0.453125f,0.242188f, -0.460938f,0.242188f, -0.46875f,0.242188f, -0.476563f,0.242188f, -0.484375f,0.242188f, -0.492188f,0.242188f, -0.5f,0.242188f, -0.507813f,0.242188f, -0.0f,0.25f, -0.0078125f,0.25f, -0.015625f,0.25f, -0.0234375f,0.25f, -0.03125f,0.25f, -0.0390625f,0.25f, -0.046875f,0.25f, -0.0546875f,0.25f, -0.0625f,0.25f, -0.0703125f,0.25f, -0.078125f,0.25f, -0.0859375f,0.25f, -0.09375f,0.25f, -0.101563f,0.25f, -0.109375f,0.25f, -0.117188f,0.25f, -0.125f,0.25f, -0.132813f,0.25f, -0.140625f,0.25f, -0.148438f,0.25f, -0.15625f,0.25f, -0.164063f,0.25f, -0.171875f,0.25f, -0.179688f,0.25f, -0.1875f,0.25f, -0.195313f,0.25f, -0.203125f,0.25f, -0.210938f,0.25f, -0.21875f,0.25f, -0.226563f,0.25f, -0.234375f,0.25f, -0.242188f,0.25f, -0.25f,0.25f, -0.257813f,0.25f, -0.265625f,0.25f, -0.273438f,0.25f, -0.28125f,0.25f, -0.289063f,0.25f, -0.296875f,0.25f, -0.304688f,0.25f, -0.3125f,0.25f, -0.320313f,0.25f, -0.328125f,0.25f, -0.335938f,0.25f, -0.34375f,0.25f, -0.351563f,0.25f, -0.359375f,0.25f, -0.367188f,0.25f, -0.375f,0.25f, -0.382813f,0.25f, -0.390625f,0.25f, -0.398438f,0.25f, -0.40625f,0.25f, -0.414063f,0.25f, -0.421875f,0.25f, -0.429688f,0.25f, -0.4375f,0.25f, -0.445313f,0.25f, -0.453125f,0.25f, -0.460938f,0.25f, -0.46875f,0.25f, -0.476563f,0.25f, -0.484375f,0.25f, -0.492188f,0.25f, -0.5f,0.25f, -0.507813f,0.25f, -0.0f,0.257813f, -0.0078125f,0.257813f, -0.015625f,0.257813f, -0.0234375f,0.257813f, -0.03125f,0.257813f, -0.0390625f,0.257813f, -0.046875f,0.257813f, -0.0546875f,0.257813f, -0.0625f,0.257813f, -0.0703125f,0.257813f, -0.078125f,0.257813f, -0.0859375f,0.257813f, -0.09375f,0.257813f, -0.101563f,0.257813f, -0.109375f,0.257813f, -0.117188f,0.257813f, -0.125f,0.257813f, -0.132813f,0.257813f, -0.140625f,0.257813f, -0.148438f,0.257813f, -0.15625f,0.257813f, -0.164063f,0.257813f, -0.171875f,0.257813f, -0.179688f,0.257813f, -0.1875f,0.257813f, -0.195313f,0.257813f, -0.203125f,0.257813f, -0.210938f,0.257813f, -0.21875f,0.257813f, -0.226563f,0.257813f, -0.234375f,0.257813f, -0.242188f,0.257813f, -0.25f,0.257813f, -0.257813f,0.257813f, -0.265625f,0.257813f, -0.273438f,0.257813f, -0.28125f,0.257813f, -0.289063f,0.257813f, -0.296875f,0.257813f, -0.304688f,0.257813f, -0.3125f,0.257813f, -0.320313f,0.257813f, -0.328125f,0.257813f, -0.335938f,0.257813f, -0.34375f,0.257813f, -0.351563f,0.257813f, -0.359375f,0.257813f, -0.367188f,0.257813f, -0.375f,0.257813f, -0.382813f,0.257813f, -0.390625f,0.257813f, -0.398438f,0.257813f, -0.40625f,0.257813f, -0.414063f,0.257813f, -0.421875f,0.257813f, -0.429688f,0.257813f, -0.4375f,0.257813f, -0.445313f,0.257813f, -0.453125f,0.257813f, -0.460938f,0.257813f, -0.46875f,0.257813f, -0.476563f,0.257813f, -0.484375f,0.257813f, -0.492188f,0.257813f, -0.5f,0.257813f, -0.507813f,0.257813f, -0.0f,0.265625f, -0.0078125f,0.265625f, -0.015625f,0.265625f, -0.0234375f,0.265625f, -0.03125f,0.265625f, -0.0390625f,0.265625f, -0.046875f,0.265625f, -0.0546875f,0.265625f, -0.0625f,0.265625f, -0.0703125f,0.265625f, -0.078125f,0.265625f, -0.0859375f,0.265625f, -0.09375f,0.265625f, -0.101563f,0.265625f, -0.109375f,0.265625f, -0.117188f,0.265625f, -0.125f,0.265625f, -0.132813f,0.265625f, -0.140625f,0.265625f, -0.148438f,0.265625f, -0.15625f,0.265625f, -0.164063f,0.265625f, -0.171875f,0.265625f, -0.179688f,0.265625f, -0.1875f,0.265625f, -0.195313f,0.265625f, -0.203125f,0.265625f, -0.210938f,0.265625f, -0.21875f,0.265625f, -0.226563f,0.265625f, -0.234375f,0.265625f, -0.242188f,0.265625f, -0.25f,0.265625f, -0.257813f,0.265625f, -0.265625f,0.265625f, -0.273438f,0.265625f, -0.28125f,0.265625f, -0.289063f,0.265625f, -0.296875f,0.265625f, -0.304688f,0.265625f, -0.3125f,0.265625f, -0.320313f,0.265625f, -0.328125f,0.265625f, -0.335938f,0.265625f, -0.34375f,0.265625f, -0.351563f,0.265625f, -0.359375f,0.265625f, -0.367188f,0.265625f, -0.375f,0.265625f, -0.382813f,0.265625f, -0.390625f,0.265625f, -0.398438f,0.265625f, -0.40625f,0.265625f, -0.414063f,0.265625f, -0.421875f,0.265625f, -0.429688f,0.265625f, -0.4375f,0.265625f, -0.445313f,0.265625f, -0.453125f,0.265625f, -0.460938f,0.265625f, -0.46875f,0.265625f, -0.476563f,0.265625f, -0.484375f,0.265625f, -0.492188f,0.265625f, -0.5f,0.265625f, -0.507813f,0.265625f, -}; - -unsigned short Landscape06Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -126,127,128, -129,128,127, -128,129,130, -131,130,129, -132,0,133, -2,133,0, -133,2,134, -4,134,2, -134,4,135, -6,135,4, -135,6,136, -8,136,6, -136,8,137, -10,137,8, -137,10,138, -12,138,10, -138,12,139, -14,139,12, -139,14,140, -16,140,14, -140,16,141, -18,141,16, -141,18,142, -20,142,18, -142,20,143, -22,143,20, -143,22,144, -24,144,22, -144,24,145, -26,145,24, -145,26,146, -28,146,26, -146,28,147, -30,147,28, -147,30,148, -32,148,30, -148,32,149, -34,149,32, -149,34,150, -36,150,34, -150,36,151, -38,151,36, -151,38,152, -40,152,38, -152,40,153, -42,153,40, -153,42,154, -44,154,42, -154,44,155, -46,155,44, -155,46,156, -48,156,46, -156,48,157, -50,157,48, -157,50,158, -52,158,50, -158,52,159, -54,159,52, -159,54,160, -56,160,54, -160,56,161, -58,161,56, -161,58,162, -60,162,58, -162,60,163, -62,163,60, -163,62,164, -64,164,62, -164,64,165, -66,165,64, -165,66,166, -68,166,66, -166,68,167, -70,167,68, -167,70,168, -72,168,70, -168,72,169, -74,169,72, -169,74,170, -76,170,74, -170,76,171, -78,171,76, -171,78,172, -80,172,78, -172,80,173, -82,173,80, -173,82,174, -84,174,82, -174,84,175, -86,175,84, -175,86,176, -88,176,86, -176,88,177, -90,177,88, -177,90,178, -92,178,90, -178,92,179, -94,179,92, -179,94,180, -96,180,94, -180,96,181, -98,181,96, -181,98,182, -100,182,98, -182,100,183, -102,183,100, -183,102,184, -104,184,102, -184,104,185, -106,185,104, -185,106,186, -108,186,106, -186,108,187, -110,187,108, -187,110,188, -112,188,110, -188,112,189, -114,189,112, -189,114,190, -116,190,114, -190,116,191, -118,191,116, -191,118,192, -120,192,118, -192,120,193, -122,193,120, -193,122,194, -124,194,122, -194,124,195, -126,195,124, -195,126,196, -128,196,126, -196,128,197, -130,197,128, -198,132,199, -133,199,132, -199,133,200, -134,200,133, -200,134,201, -135,201,134, -201,135,202, -136,202,135, -202,136,203, -137,203,136, -203,137,204, -138,204,137, -204,138,205, -139,205,138, -205,139,206, -140,206,139, -206,140,207, -141,207,140, -207,141,208, -142,208,141, -208,142,209, -143,209,142, -209,143,210, -144,210,143, -210,144,211, -145,211,144, -211,145,212, -146,212,145, -212,146,213, -147,213,146, -213,147,214, -148,214,147, -214,148,215, -149,215,148, -215,149,216, -150,216,149, -216,150,217, -151,217,150, -217,151,218, -152,218,151, -218,152,219, -153,219,152, -219,153,220, -154,220,153, -220,154,221, -155,221,154, -221,155,222, -156,222,155, -222,156,223, -157,223,156, -223,157,224, -158,224,157, -224,158,225, -159,225,158, -225,159,226, -160,226,159, -226,160,227, -161,227,160, -227,161,228, -162,228,161, -228,162,229, -163,229,162, -229,163,230, -164,230,163, -230,164,231, -165,231,164, -231,165,232, -166,232,165, -232,166,233, -167,233,166, -233,167,234, -168,234,167, -234,168,235, -169,235,168, -235,169,236, -170,236,169, -236,170,237, -171,237,170, -237,171,238, -172,238,171, -238,172,239, -173,239,172, -239,173,240, -174,240,173, -240,174,241, -175,241,174, -241,175,242, -176,242,175, -242,176,243, -177,243,176, -243,177,244, -178,244,177, -244,178,245, -179,245,178, -245,179,246, -180,246,179, -246,180,247, -181,247,180, -247,181,248, -182,248,181, -248,182,249, -183,249,182, -249,183,250, -184,250,183, -250,184,251, -185,251,184, -251,185,252, -186,252,185, -252,186,253, -187,253,186, -253,187,254, -188,254,187, -254,188,255, -189,255,188, -255,189,256, -190,256,189, -256,190,257, -191,257,190, -257,191,258, -192,258,191, -258,192,259, -193,259,192, -259,193,260, -194,260,193, -260,194,261, -195,261,194, -261,195,262, -196,262,195, -262,196,263, -197,263,196, -264,198,265, -199,265,198, -265,199,266, -200,266,199, -266,200,267, -201,267,200, -267,201,268, -202,268,201, -268,202,269, -203,269,202, -269,203,270, -204,270,203, -270,204,271, -205,271,204, -271,205,272, -206,272,205, -272,206,273, -207,273,206, -273,207,274, -208,274,207, -274,208,275, -209,275,208, -275,209,276, -210,276,209, -276,210,277, -211,277,210, -277,211,278, -212,278,211, -278,212,279, -213,279,212, -279,213,280, -214,280,213, -280,214,281, -215,281,214, -281,215,282, -216,282,215, -282,216,283, -217,283,216, -283,217,284, -218,284,217, -284,218,285, -219,285,218, -285,219,286, -220,286,219, -286,220,287, -221,287,220, -287,221,288, -222,288,221, -288,222,289, -223,289,222, -289,223,290, -224,290,223, -290,224,291, -225,291,224, -291,225,292, -226,292,225, -292,226,293, -227,293,226, -293,227,294, -228,294,227, -294,228,295, -229,295,228, -295,229,296, -230,296,229, -296,230,297, -231,297,230, -297,231,298, -232,298,231, -298,232,299, -233,299,232, -299,233,300, -234,300,233, -300,234,301, -235,301,234, -301,235,302, -236,302,235, -302,236,303, -237,303,236, -303,237,304, -238,304,237, -304,238,305, -239,305,238, -305,239,306, -240,306,239, -306,240,307, -241,307,240, -307,241,308, -242,308,241, -308,242,309, -243,309,242, -309,243,310, -244,310,243, -310,244,311, -245,311,244, -311,245,312, -246,312,245, -312,246,313, -247,313,246, -313,247,314, -248,314,247, -314,248,315, -249,315,248, -315,249,316, -250,316,249, -316,250,317, -251,317,250, -317,251,318, -252,318,251, -318,252,319, -253,319,252, -319,253,320, -254,320,253, -320,254,321, -255,321,254, -321,255,322, -256,322,255, -322,256,323, -257,323,256, -323,257,324, -258,324,257, -324,258,325, -259,325,258, -325,259,326, -260,326,259, -326,260,327, -261,327,260, -327,261,328, -262,328,261, -328,262,329, -263,329,262, -330,264,331, -265,331,264, -331,265,332, -266,332,265, -332,266,333, -267,333,266, -333,267,334, -268,334,267, -334,268,335, -269,335,268, -335,269,336, -270,336,269, -336,270,337, -271,337,270, -337,271,338, -272,338,271, -338,272,339, -273,339,272, -339,273,340, -274,340,273, -340,274,341, -275,341,274, -341,275,342, -276,342,275, -342,276,343, -277,343,276, -343,277,344, -278,344,277, -344,278,345, -279,345,278, -345,279,346, -280,346,279, -346,280,347, -281,347,280, -347,281,348, -282,348,281, -348,282,349, -283,349,282, -349,283,350, -284,350,283, -350,284,351, -285,351,284, -351,285,352, -286,352,285, -352,286,353, -287,353,286, -353,287,354, -288,354,287, -354,288,355, -289,355,288, -355,289,356, -290,356,289, -356,290,357, -291,357,290, -357,291,358, -292,358,291, -358,292,359, -293,359,292, -359,293,360, -294,360,293, -360,294,361, -295,361,294, -361,295,362, -296,362,295, -362,296,363, -297,363,296, -363,297,364, -298,364,297, -364,298,365, -299,365,298, -365,299,366, -300,366,299, -366,300,367, -301,367,300, -367,301,368, -302,368,301, -368,302,369, -303,369,302, -369,303,370, -304,370,303, -370,304,371, -305,371,304, -371,305,372, -306,372,305, -372,306,373, -307,373,306, -373,307,374, -308,374,307, -374,308,375, -309,375,308, -375,309,376, -310,376,309, -376,310,377, -311,377,310, -377,311,378, -312,378,311, -378,312,379, -313,379,312, -379,313,380, -314,380,313, -380,314,381, -315,381,314, -381,315,382, -316,382,315, -382,316,383, -317,383,316, -383,317,384, -318,384,317, -384,318,385, -319,385,318, -385,319,386, -320,386,319, -386,320,387, -321,387,320, -387,321,388, -322,388,321, -388,322,389, -323,389,322, -389,323,390, -324,390,323, -390,324,391, -325,391,324, -391,325,392, -326,392,325, -392,326,393, -327,393,326, -393,327,394, -328,394,327, -394,328,395, -329,395,328, -396,330,397, -331,397,330, -397,331,398, -332,398,331, -398,332,399, -333,399,332, -399,333,400, -334,400,333, -400,334,401, -335,401,334, -401,335,402, -336,402,335, -402,336,403, -337,403,336, -403,337,404, -338,404,337, -404,338,405, -339,405,338, -405,339,406, -340,406,339, -406,340,407, -341,407,340, -407,341,408, -342,408,341, -408,342,409, -343,409,342, -409,343,410, -344,410,343, -410,344,411, -345,411,344, -411,345,412, -346,412,345, -412,346,413, -347,413,346, -413,347,414, -348,414,347, -414,348,415, -349,415,348, -415,349,416, -350,416,349, -416,350,417, -351,417,350, -417,351,418, -352,418,351, -418,352,419, -353,419,352, -419,353,420, -354,420,353, -420,354,421, -355,421,354, -421,355,422, -356,422,355, -422,356,423, -357,423,356, -423,357,424, -358,424,357, -424,358,425, -359,425,358, -425,359,426, -360,426,359, -426,360,427, -361,427,360, -427,361,428, -362,428,361, -428,362,429, -363,429,362, -429,363,430, -364,430,363, -430,364,431, -365,431,364, -431,365,432, -366,432,365, -432,366,433, -367,433,366, -433,367,434, -368,434,367, -434,368,435, -369,435,368, -435,369,436, -370,436,369, -436,370,437, -371,437,370, -437,371,438, -372,438,371, -438,372,439, -373,439,372, -439,373,440, -374,440,373, -440,374,441, -375,441,374, -441,375,442, -376,442,375, -442,376,443, -377,443,376, -443,377,444, -378,444,377, -444,378,445, -379,445,378, -445,379,446, -380,446,379, -446,380,447, -381,447,380, -447,381,448, -382,448,381, -448,382,449, -383,449,382, -449,383,450, -384,450,383, -450,384,451, -385,451,384, -451,385,452, -386,452,385, -452,386,453, -387,453,386, -453,387,454, -388,454,387, -454,388,455, -389,455,388, -455,389,456, -390,456,389, -456,390,457, -391,457,390, -457,391,458, -392,458,391, -458,392,459, -393,459,392, -459,393,460, -394,460,393, -460,394,461, -395,461,394, -462,396,463, -397,463,396, -463,397,464, -398,464,397, -464,398,465, -399,465,398, -465,399,466, -400,466,399, -466,400,467, -401,467,400, -467,401,468, -402,468,401, -468,402,469, -403,469,402, -469,403,470, -404,470,403, -470,404,471, -405,471,404, -471,405,472, -406,472,405, -472,406,473, -407,473,406, -473,407,474, -408,474,407, -474,408,475, -409,475,408, -475,409,476, -410,476,409, -476,410,477, -411,477,410, -477,411,478, -412,478,411, -478,412,479, -413,479,412, -479,413,480, -414,480,413, -480,414,481, -415,481,414, -481,415,482, -416,482,415, -482,416,483, -417,483,416, -483,417,484, -418,484,417, -484,418,485, -419,485,418, -485,419,486, -420,486,419, -486,420,487, -421,487,420, -487,421,488, -422,488,421, -488,422,489, -423,489,422, -489,423,490, -424,490,423, -490,424,491, -425,491,424, -491,425,492, -426,492,425, -492,426,493, -427,493,426, -493,427,494, -428,494,427, -494,428,495, -429,495,428, -495,429,496, -430,496,429, -496,430,497, -431,497,430, -497,431,498, -432,498,431, -498,432,499, -433,499,432, -499,433,500, -434,500,433, -500,434,501, -435,501,434, -501,435,502, -436,502,435, -502,436,503, -437,503,436, -503,437,504, -438,504,437, -504,438,505, -439,505,438, -505,439,506, -440,506,439, -506,440,507, -441,507,440, -507,441,508, -442,508,441, -508,442,509, -443,509,442, -509,443,510, -444,510,443, -510,444,511, -445,511,444, -511,445,512, -446,512,445, -512,446,513, -447,513,446, -513,447,514, -448,514,447, -514,448,515, -449,515,448, -515,449,516, -450,516,449, -516,450,517, -451,517,450, -517,451,518, -452,518,451, -518,452,519, -453,519,452, -519,453,520, -454,520,453, -520,454,521, -455,521,454, -521,455,522, -456,522,455, -522,456,523, -457,523,456, -523,457,524, -458,524,457, -524,458,525, -459,525,458, -525,459,526, -460,526,459, -526,460,527, -461,527,460, -528,462,529, -463,529,462, -529,463,530, -464,530,463, -530,464,531, -465,531,464, -531,465,532, -466,532,465, -532,466,533, -467,533,466, -533,467,534, -468,534,467, -534,468,535, -469,535,468, -535,469,536, -470,536,469, -536,470,537, -471,537,470, -537,471,538, -472,538,471, -538,472,539, -473,539,472, -539,473,540, -474,540,473, -540,474,541, -475,541,474, -541,475,542, -476,542,475, -542,476,543, -477,543,476, -543,477,544, -478,544,477, -544,478,545, -479,545,478, -545,479,546, -480,546,479, -546,480,547, -481,547,480, -547,481,548, -482,548,481, -548,482,549, -483,549,482, -549,483,550, -484,550,483, -550,484,551, -485,551,484, -551,485,552, -486,552,485, -552,486,553, -487,553,486, -553,487,554, -488,554,487, -554,488,555, -489,555,488, -555,489,556, -490,556,489, -556,490,557, -491,557,490, -557,491,558, -492,558,491, -558,492,559, -493,559,492, -559,493,560, -494,560,493, -560,494,561, -495,561,494, -561,495,562, -496,562,495, -562,496,563, -497,563,496, -563,497,564, -498,564,497, -564,498,565, -499,565,498, -565,499,566, -500,566,499, -566,500,567, -501,567,500, -567,501,568, -502,568,501, -568,502,569, -503,569,502, -569,503,570, -504,570,503, -570,504,571, -505,571,504, -571,505,572, -506,572,505, -572,506,573, -507,573,506, -573,507,574, -508,574,507, -574,508,575, -509,575,508, -575,509,576, -510,576,509, -576,510,577, -511,577,510, -577,511,578, -512,578,511, -578,512,579, -513,579,512, -579,513,580, -514,580,513, -580,514,581, -515,581,514, -581,515,582, -516,582,515, -582,516,583, -517,583,516, -583,517,584, -518,584,517, -584,518,585, -519,585,518, -585,519,586, -520,586,519, -586,520,587, -521,587,520, -587,521,588, -522,588,521, -588,522,589, -523,589,522, -589,523,590, -524,590,523, -590,524,591, -525,591,524, -591,525,592, -526,592,525, -592,526,593, -527,593,526, -594,528,595, -529,595,528, -595,529,596, -530,596,529, -596,530,597, -531,597,530, -597,531,598, -532,598,531, -598,532,599, -533,599,532, -599,533,600, -534,600,533, -600,534,601, -535,601,534, -601,535,602, -536,602,535, -602,536,603, -537,603,536, -603,537,604, -538,604,537, -604,538,605, -539,605,538, -605,539,606, -540,606,539, -606,540,607, -541,607,540, -607,541,608, -542,608,541, -608,542,609, -543,609,542, -609,543,610, -544,610,543, -610,544,611, -545,611,544, -611,545,612, -546,612,545, -612,546,613, -547,613,546, -613,547,614, -548,614,547, -614,548,615, -549,615,548, -615,549,616, -550,616,549, -616,550,617, -551,617,550, -617,551,618, -552,618,551, -618,552,619, -553,619,552, -619,553,620, -554,620,553, -620,554,621, -555,621,554, -621,555,622, -556,622,555, -622,556,623, -557,623,556, -623,557,624, -558,624,557, -624,558,625, -559,625,558, -625,559,626, -560,626,559, -626,560,627, -561,627,560, -627,561,628, -562,628,561, -628,562,629, -563,629,562, -629,563,630, -564,630,563, -630,564,631, -565,631,564, -631,565,632, -566,632,565, -632,566,633, -567,633,566, -633,567,634, -568,634,567, -634,568,635, -569,635,568, -635,569,636, -570,636,569, -636,570,637, -571,637,570, -637,571,638, -572,638,571, -638,572,639, -573,639,572, -639,573,640, -574,640,573, -640,574,641, -575,641,574, -641,575,642, -576,642,575, -642,576,643, -577,643,576, -643,577,644, -578,644,577, -644,578,645, -579,645,578, -645,579,646, -580,646,579, -646,580,647, -581,647,580, -647,581,648, -582,648,581, -648,582,649, -583,649,582, -649,583,650, -584,650,583, -650,584,651, -585,651,584, -651,585,652, -586,652,585, -652,586,653, -587,653,586, -653,587,654, -588,654,587, -654,588,655, -589,655,588, -655,589,656, -590,656,589, -656,590,657, -591,657,590, -657,591,658, -592,658,591, -658,592,659, -593,659,592, -660,594,661, -595,661,594, -661,595,662, -596,662,595, -662,596,663, -597,663,596, -663,597,664, -598,664,597, -664,598,665, -599,665,598, -665,599,666, -600,666,599, -666,600,667, -601,667,600, -667,601,668, -602,668,601, -668,602,669, -603,669,602, -669,603,670, -604,670,603, -670,604,671, -605,671,604, -671,605,672, -606,672,605, -672,606,673, -607,673,606, -673,607,674, -608,674,607, -674,608,675, -609,675,608, -675,609,676, -610,676,609, -676,610,677, -611,677,610, -677,611,678, -612,678,611, -678,612,679, -613,679,612, -679,613,680, -614,680,613, -680,614,681, -615,681,614, -681,615,682, -616,682,615, -682,616,683, -617,683,616, -683,617,684, -618,684,617, -684,618,685, -619,685,618, -685,619,686, -620,686,619, -686,620,687, -621,687,620, -687,621,688, -622,688,621, -688,622,689, -623,689,622, -689,623,690, -624,690,623, -690,624,691, -625,691,624, -691,625,692, -626,692,625, -692,626,693, -627,693,626, -693,627,694, -628,694,627, -694,628,695, -629,695,628, -695,629,696, -630,696,629, -696,630,697, -631,697,630, -697,631,698, -632,698,631, -698,632,699, -633,699,632, -699,633,700, -634,700,633, -700,634,701, -635,701,634, -701,635,702, -636,702,635, -702,636,703, -637,703,636, -703,637,704, -638,704,637, -704,638,705, -639,705,638, -705,639,706, -640,706,639, -706,640,707, -641,707,640, -707,641,708, -642,708,641, -708,642,709, -643,709,642, -709,643,710, -644,710,643, -710,644,711, -645,711,644, -711,645,712, -646,712,645, -712,646,713, -647,713,646, -713,647,714, -648,714,647, -714,648,715, -649,715,648, -715,649,716, -650,716,649, -716,650,717, -651,717,650, -717,651,718, -652,718,651, -718,652,719, -653,719,652, -719,653,720, -654,720,653, -720,654,721, -655,721,654, -721,655,722, -656,722,655, -722,656,723, -657,723,656, -723,657,724, -658,724,657, -724,658,725, -659,725,658, -726,660,727, -661,727,660, -727,661,728, -662,728,661, -728,662,729, -663,729,662, -729,663,730, -664,730,663, -730,664,731, -665,731,664, -731,665,732, -666,732,665, -732,666,733, -667,733,666, -733,667,734, -668,734,667, -734,668,735, -669,735,668, -735,669,736, -670,736,669, -736,670,737, -671,737,670, -737,671,738, -672,738,671, -738,672,739, -673,739,672, -739,673,740, -674,740,673, -740,674,741, -675,741,674, -741,675,742, -676,742,675, -742,676,743, -677,743,676, -743,677,744, -678,744,677, -744,678,745, -679,745,678, -745,679,746, -680,746,679, -746,680,747, -681,747,680, -747,681,748, -682,748,681, -748,682,749, -683,749,682, -749,683,750, -684,750,683, -750,684,751, -685,751,684, -751,685,752, -686,752,685, -752,686,753, -687,753,686, -753,687,754, -688,754,687, -754,688,755, -689,755,688, -755,689,756, -690,756,689, -756,690,757, -691,757,690, -757,691,758, -692,758,691, -758,692,759, -693,759,692, -759,693,760, -694,760,693, -760,694,761, -695,761,694, -761,695,762, -696,762,695, -762,696,763, -697,763,696, -763,697,764, -698,764,697, -764,698,765, -699,765,698, -765,699,766, -700,766,699, -766,700,767, -701,767,700, -767,701,768, -702,768,701, -768,702,769, -703,769,702, -769,703,770, -704,770,703, -770,704,771, -705,771,704, -771,705,772, -706,772,705, -772,706,773, -707,773,706, -773,707,774, -708,774,707, -774,708,775, -709,775,708, -775,709,776, -710,776,709, -776,710,777, -711,777,710, -777,711,778, -712,778,711, -778,712,779, -713,779,712, -779,713,780, -714,780,713, -780,714,781, -715,781,714, -781,715,782, -716,782,715, -782,716,783, -717,783,716, -783,717,784, -718,784,717, -784,718,785, -719,785,718, -785,719,786, -720,786,719, -786,720,787, -721,787,720, -787,721,788, -722,788,721, -788,722,789, -723,789,722, -789,723,790, -724,790,723, -790,724,791, -725,791,724, -792,726,793, -727,793,726, -793,727,794, -728,794,727, -794,728,795, -729,795,728, -795,729,796, -730,796,729, -796,730,797, -731,797,730, -797,731,798, -732,798,731, -798,732,799, -733,799,732, -799,733,800, -734,800,733, -800,734,801, -735,801,734, -801,735,802, -736,802,735, -802,736,803, -737,803,736, -803,737,804, -738,804,737, -804,738,805, -739,805,738, -805,739,806, -740,806,739, -806,740,807, -741,807,740, -807,741,808, -742,808,741, -808,742,809, -743,809,742, -809,743,810, -744,810,743, -810,744,811, -745,811,744, -811,745,812, -746,812,745, -812,746,813, -747,813,746, -813,747,814, -748,814,747, -814,748,815, -749,815,748, -815,749,816, -750,816,749, -816,750,817, -751,817,750, -817,751,818, -752,818,751, -818,752,819, -753,819,752, -819,753,820, -754,820,753, -820,754,821, -755,821,754, -821,755,822, -756,822,755, -822,756,823, -757,823,756, -823,757,824, -758,824,757, -824,758,825, -759,825,758, -825,759,826, -760,826,759, -826,760,827, -761,827,760, -827,761,828, -762,828,761, -828,762,829, -763,829,762, -829,763,830, -764,830,763, -830,764,831, -765,831,764, -831,765,832, -766,832,765, -832,766,833, -767,833,766, -833,767,834, -768,834,767, -834,768,835, -769,835,768, -835,769,836, -770,836,769, -836,770,837, -771,837,770, -837,771,838, -772,838,771, -838,772,839, -773,839,772, -839,773,840, -774,840,773, -840,774,841, -775,841,774, -841,775,842, -776,842,775, -842,776,843, -777,843,776, -843,777,844, -778,844,777, -844,778,845, -779,845,778, -845,779,846, -780,846,779, -846,780,847, -781,847,780, -847,781,848, -782,848,781, -848,782,849, -783,849,782, -849,783,850, -784,850,783, -850,784,851, -785,851,784, -851,785,852, -786,852,785, -852,786,853, -787,853,786, -853,787,854, -788,854,787, -854,788,855, -789,855,788, -855,789,856, -790,856,789, -856,790,857, -791,857,790, -858,792,859, -793,859,792, -859,793,860, -794,860,793, -860,794,861, -795,861,794, -861,795,862, -796,862,795, -862,796,863, -797,863,796, -863,797,864, -798,864,797, -864,798,865, -799,865,798, -865,799,866, -800,866,799, -866,800,867, -801,867,800, -867,801,868, -802,868,801, -868,802,869, -803,869,802, -869,803,870, -804,870,803, -870,804,871, -805,871,804, -871,805,872, -806,872,805, -872,806,873, -807,873,806, -873,807,874, -808,874,807, -874,808,875, -809,875,808, -875,809,876, -810,876,809, -876,810,877, -811,877,810, -877,811,878, -812,878,811, -878,812,879, -813,879,812, -879,813,880, -814,880,813, -880,814,881, -815,881,814, -881,815,882, -816,882,815, -882,816,883, -817,883,816, -883,817,884, -818,884,817, -884,818,885, -819,885,818, -885,819,886, -820,886,819, -886,820,887, -821,887,820, -887,821,888, -822,888,821, -888,822,889, -823,889,822, -889,823,890, -824,890,823, -890,824,891, -825,891,824, -891,825,892, -826,892,825, -892,826,893, -827,893,826, -893,827,894, -828,894,827, -894,828,895, -829,895,828, -895,829,896, -830,896,829, -896,830,897, -831,897,830, -897,831,898, -832,898,831, -898,832,899, -833,899,832, -899,833,900, -834,900,833, -900,834,901, -835,901,834, -901,835,902, -836,902,835, -902,836,903, -837,903,836, -903,837,904, -838,904,837, -904,838,905, -839,905,838, -905,839,906, -840,906,839, -906,840,907, -841,907,840, -907,841,908, -842,908,841, -908,842,909, -843,909,842, -909,843,910, -844,910,843, -910,844,911, -845,911,844, -911,845,912, -846,912,845, -912,846,913, -847,913,846, -913,847,914, -848,914,847, -914,848,915, -849,915,848, -915,849,916, -850,916,849, -916,850,917, -851,917,850, -917,851,918, -852,918,851, -918,852,919, -853,919,852, -919,853,920, -854,920,853, -920,854,921, -855,921,854, -921,855,922, -856,922,855, -922,856,923, -857,923,856, -924,858,925, -859,925,858, -925,859,926, -860,926,859, -926,860,927, -861,927,860, -927,861,928, -862,928,861, -928,862,929, -863,929,862, -929,863,930, -864,930,863, -930,864,931, -865,931,864, -931,865,932, -866,932,865, -932,866,933, -867,933,866, -933,867,934, -868,934,867, -934,868,935, -869,935,868, -935,869,936, -870,936,869, -936,870,937, -871,937,870, -937,871,938, -872,938,871, -938,872,939, -873,939,872, -939,873,940, -874,940,873, -940,874,941, -875,941,874, -941,875,942, -876,942,875, -942,876,943, -877,943,876, -943,877,944, -878,944,877, -944,878,945, -879,945,878, -945,879,946, -880,946,879, -946,880,947, -881,947,880, -947,881,948, -882,948,881, -948,882,949, -883,949,882, -949,883,950, -884,950,883, -950,884,951, -885,951,884, -951,885,952, -886,952,885, -952,886,953, -887,953,886, -953,887,954, -888,954,887, -954,888,955, -889,955,888, -955,889,956, -890,956,889, -956,890,957, -891,957,890, -957,891,958, -892,958,891, -958,892,959, -893,959,892, -959,893,960, -894,960,893, -960,894,961, -895,961,894, -961,895,962, -896,962,895, -962,896,963, -897,963,896, -963,897,964, -898,964,897, -964,898,965, -899,965,898, -965,899,966, -900,966,899, -966,900,967, -901,967,900, -967,901,968, -902,968,901, -968,902,969, -903,969,902, -969,903,970, -904,970,903, -970,904,971, -905,971,904, -971,905,972, -906,972,905, -972,906,973, -907,973,906, -973,907,974, -908,974,907, -974,908,975, -909,975,908, -975,909,976, -910,976,909, -976,910,977, -911,977,910, -977,911,978, -912,978,911, -978,912,979, -913,979,912, -979,913,980, -914,980,913, -980,914,981, -915,981,914, -981,915,982, -916,982,915, -982,916,983, -917,983,916, -983,917,984, -918,984,917, -984,918,985, -919,985,918, -985,919,986, -920,986,919, -986,920,987, -921,987,920, -987,921,988, -922,988,921, -988,922,989, -923,989,922, -990,924,991, -925,991,924, -991,925,992, -926,992,925, -992,926,993, -927,993,926, -993,927,994, -928,994,927, -994,928,995, -929,995,928, -995,929,996, -930,996,929, -996,930,997, -931,997,930, -997,931,998, -932,998,931, -998,932,999, -933,999,932, -999,933,1000, -934,1000,933, -1000,934,1001, -935,1001,934, -1001,935,1002, -936,1002,935, -1002,936,1003, -937,1003,936, -1003,937,1004, -938,1004,937, -1004,938,1005, -939,1005,938, -1005,939,1006, -940,1006,939, -1006,940,1007, -941,1007,940, -1007,941,1008, -942,1008,941, -1008,942,1009, -943,1009,942, -1009,943,1010, -944,1010,943, -1010,944,1011, -945,1011,944, -1011,945,1012, -946,1012,945, -1012,946,1013, -947,1013,946, -1013,947,1014, -948,1014,947, -1014,948,1015, -949,1015,948, -1015,949,1016, -950,1016,949, -1016,950,1017, -951,1017,950, -1017,951,1018, -952,1018,951, -1018,952,1019, -953,1019,952, -1019,953,1020, -954,1020,953, -1020,954,1021, -955,1021,954, -1021,955,1022, -956,1022,955, -1022,956,1023, -957,1023,956, -1023,957,1024, -958,1024,957, -1024,958,1025, -959,1025,958, -1025,959,1026, -960,1026,959, -1026,960,1027, -961,1027,960, -1027,961,1028, -962,1028,961, -1028,962,1029, -963,1029,962, -1029,963,1030, -964,1030,963, -1030,964,1031, -965,1031,964, -1031,965,1032, -966,1032,965, -1032,966,1033, -967,1033,966, -1033,967,1034, -968,1034,967, -1034,968,1035, -969,1035,968, -1035,969,1036, -970,1036,969, -1036,970,1037, -971,1037,970, -1037,971,1038, -972,1038,971, -1038,972,1039, -973,1039,972, -1039,973,1040, -974,1040,973, -1040,974,1041, -975,1041,974, -1041,975,1042, -976,1042,975, -1042,976,1043, -977,1043,976, -1043,977,1044, -978,1044,977, -1044,978,1045, -979,1045,978, -1045,979,1046, -980,1046,979, -1046,980,1047, -981,1047,980, -1047,981,1048, -982,1048,981, -1048,982,1049, -983,1049,982, -1049,983,1050, -984,1050,983, -1050,984,1051, -985,1051,984, -1051,985,1052, -986,1052,985, -1052,986,1053, -987,1053,986, -1053,987,1054, -988,1054,987, -1054,988,1055, -989,1055,988, -1056,990,1057, -991,1057,990, -1057,991,1058, -992,1058,991, -1058,992,1059, -993,1059,992, -1059,993,1060, -994,1060,993, -1060,994,1061, -995,1061,994, -1061,995,1062, -996,1062,995, -1062,996,1063, -997,1063,996, -1063,997,1064, -998,1064,997, -1064,998,1065, -999,1065,998, -1065,999,1066, -1000,1066,999, -1066,1000,1067, -1001,1067,1000, -1067,1001,1068, -1002,1068,1001, -1068,1002,1069, -1003,1069,1002, -1069,1003,1070, -1004,1070,1003, -1070,1004,1071, -1005,1071,1004, -1071,1005,1072, -1006,1072,1005, -1072,1006,1073, -1007,1073,1006, -1073,1007,1074, -1008,1074,1007, -1074,1008,1075, -1009,1075,1008, -1075,1009,1076, -1010,1076,1009, -1076,1010,1077, -1011,1077,1010, -1077,1011,1078, -1012,1078,1011, -1078,1012,1079, -1013,1079,1012, -1079,1013,1080, -1014,1080,1013, -1080,1014,1081, -1015,1081,1014, -1081,1015,1082, -1016,1082,1015, -1082,1016,1083, -1017,1083,1016, -1083,1017,1084, -1018,1084,1017, -1084,1018,1085, -1019,1085,1018, -1085,1019,1086, -1020,1086,1019, -1086,1020,1087, -1021,1087,1020, -1087,1021,1088, -1022,1088,1021, -1088,1022,1089, -1023,1089,1022, -1089,1023,1090, -1024,1090,1023, -1090,1024,1091, -1025,1091,1024, -1091,1025,1092, -1026,1092,1025, -1092,1026,1093, -1027,1093,1026, -1093,1027,1094, -1028,1094,1027, -1094,1028,1095, -1029,1095,1028, -1095,1029,1096, -1030,1096,1029, -1096,1030,1097, -1031,1097,1030, -1097,1031,1098, -1032,1098,1031, -1098,1032,1099, -1033,1099,1032, -1099,1033,1100, -1034,1100,1033, -1100,1034,1101, -1035,1101,1034, -1101,1035,1102, -1036,1102,1035, -1102,1036,1103, -1037,1103,1036, -1103,1037,1104, -1038,1104,1037, -1104,1038,1105, -1039,1105,1038, -1105,1039,1106, -1040,1106,1039, -1106,1040,1107, -1041,1107,1040, -1107,1041,1108, -1042,1108,1041, -1108,1042,1109, -1043,1109,1042, -1109,1043,1110, -1044,1110,1043, -1110,1044,1111, -1045,1111,1044, -1111,1045,1112, -1046,1112,1045, -1112,1046,1113, -1047,1113,1046, -1113,1047,1114, -1048,1114,1047, -1114,1048,1115, -1049,1115,1048, -1115,1049,1116, -1050,1116,1049, -1116,1050,1117, -1051,1117,1050, -1117,1051,1118, -1052,1118,1051, -1118,1052,1119, -1053,1119,1052, -1119,1053,1120, -1054,1120,1053, -1120,1054,1121, -1055,1121,1054, -1122,1056,1123, -1057,1123,1056, -1123,1057,1124, -1058,1124,1057, -1124,1058,1125, -1059,1125,1058, -1125,1059,1126, -1060,1126,1059, -1126,1060,1127, -1061,1127,1060, -1127,1061,1128, -1062,1128,1061, -1128,1062,1129, -1063,1129,1062, -1129,1063,1130, -1064,1130,1063, -1130,1064,1131, -1065,1131,1064, -1131,1065,1132, -1066,1132,1065, -1132,1066,1133, -1067,1133,1066, -1133,1067,1134, -1068,1134,1067, -1134,1068,1135, -1069,1135,1068, -1135,1069,1136, -1070,1136,1069, -1136,1070,1137, -1071,1137,1070, -1137,1071,1138, -1072,1138,1071, -1138,1072,1139, -1073,1139,1072, -1139,1073,1140, -1074,1140,1073, -1140,1074,1141, -1075,1141,1074, -1141,1075,1142, -1076,1142,1075, -1142,1076,1143, -1077,1143,1076, -1143,1077,1144, -1078,1144,1077, -1144,1078,1145, -1079,1145,1078, -1145,1079,1146, -1080,1146,1079, -1146,1080,1147, -1081,1147,1080, -1147,1081,1148, -1082,1148,1081, -1148,1082,1149, -1083,1149,1082, -1149,1083,1150, -1084,1150,1083, -1150,1084,1151, -1085,1151,1084, -1151,1085,1152, -1086,1152,1085, -1152,1086,1153, -1087,1153,1086, -1153,1087,1154, -1088,1154,1087, -1154,1088,1155, -1089,1155,1088, -1155,1089,1156, -1090,1156,1089, -1156,1090,1157, -1091,1157,1090, -1157,1091,1158, -1092,1158,1091, -1158,1092,1159, -1093,1159,1092, -1159,1093,1160, -1094,1160,1093, -1160,1094,1161, -1095,1161,1094, -1161,1095,1162, -1096,1162,1095, -1162,1096,1163, -1097,1163,1096, -1163,1097,1164, -1098,1164,1097, -1164,1098,1165, -1099,1165,1098, -1165,1099,1166, -1100,1166,1099, -1166,1100,1167, -1101,1167,1100, -1167,1101,1168, -1102,1168,1101, -1168,1102,1169, -1103,1169,1102, -1169,1103,1170, -1104,1170,1103, -1170,1104,1171, -1105,1171,1104, -1171,1105,1172, -1106,1172,1105, -1172,1106,1173, -1107,1173,1106, -1173,1107,1174, -1108,1174,1107, -1174,1108,1175, -1109,1175,1108, -1175,1109,1176, -1110,1176,1109, -1176,1110,1177, -1111,1177,1110, -1177,1111,1178, -1112,1178,1111, -1178,1112,1179, -1113,1179,1112, -1179,1113,1180, -1114,1180,1113, -1180,1114,1181, -1115,1181,1114, -1181,1115,1182, -1116,1182,1115, -1182,1116,1183, -1117,1183,1116, -1183,1117,1184, -1118,1184,1117, -1184,1118,1185, -1119,1185,1118, -1185,1119,1186, -1120,1186,1119, -1186,1120,1187, -1121,1187,1120, -1188,1122,1189, -1123,1189,1122, -1189,1123,1190, -1124,1190,1123, -1190,1124,1191, -1125,1191,1124, -1191,1125,1192, -1126,1192,1125, -1192,1126,1193, -1127,1193,1126, -1193,1127,1194, -1128,1194,1127, -1194,1128,1195, -1129,1195,1128, -1195,1129,1196, -1130,1196,1129, -1196,1130,1197, -1131,1197,1130, -1197,1131,1198, -1132,1198,1131, -1198,1132,1199, -1133,1199,1132, -1199,1133,1200, -1134,1200,1133, -1200,1134,1201, -1135,1201,1134, -1201,1135,1202, -1136,1202,1135, -1202,1136,1203, -1137,1203,1136, -1203,1137,1204, -1138,1204,1137, -1204,1138,1205, -1139,1205,1138, -1205,1139,1206, -1140,1206,1139, -1206,1140,1207, -1141,1207,1140, -1207,1141,1208, -1142,1208,1141, -1208,1142,1209, -1143,1209,1142, -1209,1143,1210, -1144,1210,1143, -1210,1144,1211, -1145,1211,1144, -1211,1145,1212, -1146,1212,1145, -1212,1146,1213, -1147,1213,1146, -1213,1147,1214, -1148,1214,1147, -1214,1148,1215, -1149,1215,1148, -1215,1149,1216, -1150,1216,1149, -1216,1150,1217, -1151,1217,1150, -1217,1151,1218, -1152,1218,1151, -1218,1152,1219, -1153,1219,1152, -1219,1153,1220, -1154,1220,1153, -1220,1154,1221, -1155,1221,1154, -1221,1155,1222, -1156,1222,1155, -1222,1156,1223, -1157,1223,1156, -1223,1157,1224, -1158,1224,1157, -1224,1158,1225, -1159,1225,1158, -1225,1159,1226, -1160,1226,1159, -1226,1160,1227, -1161,1227,1160, -1227,1161,1228, -1162,1228,1161, -1228,1162,1229, -1163,1229,1162, -1229,1163,1230, -1164,1230,1163, -1230,1164,1231, -1165,1231,1164, -1231,1165,1232, -1166,1232,1165, -1232,1166,1233, -1167,1233,1166, -1233,1167,1234, -1168,1234,1167, -1234,1168,1235, -1169,1235,1168, -1235,1169,1236, -1170,1236,1169, -1236,1170,1237, -1171,1237,1170, -1237,1171,1238, -1172,1238,1171, -1238,1172,1239, -1173,1239,1172, -1239,1173,1240, -1174,1240,1173, -1240,1174,1241, -1175,1241,1174, -1241,1175,1242, -1176,1242,1175, -1242,1176,1243, -1177,1243,1176, -1243,1177,1244, -1178,1244,1177, -1244,1178,1245, -1179,1245,1178, -1245,1179,1246, -1180,1246,1179, -1246,1180,1247, -1181,1247,1180, -1247,1181,1248, -1182,1248,1181, -1248,1182,1249, -1183,1249,1182, -1249,1183,1250, -1184,1250,1183, -1250,1184,1251, -1185,1251,1184, -1251,1185,1252, -1186,1252,1185, -1252,1186,1253, -1187,1253,1186, -1254,1188,1255, -1189,1255,1188, -1255,1189,1256, -1190,1256,1189, -1256,1190,1257, -1191,1257,1190, -1257,1191,1258, -1192,1258,1191, -1258,1192,1259, -1193,1259,1192, -1259,1193,1260, -1194,1260,1193, -1260,1194,1261, -1195,1261,1194, -1261,1195,1262, -1196,1262,1195, -1262,1196,1263, -1197,1263,1196, -1263,1197,1264, -1198,1264,1197, -1264,1198,1265, -1199,1265,1198, -1265,1199,1266, -1200,1266,1199, -1266,1200,1267, -1201,1267,1200, -1267,1201,1268, -1202,1268,1201, -1268,1202,1269, -1203,1269,1202, -1269,1203,1270, -1204,1270,1203, -1270,1204,1271, -1205,1271,1204, -1271,1205,1272, -1206,1272,1205, -1272,1206,1273, -1207,1273,1206, -1273,1207,1274, -1208,1274,1207, -1274,1208,1275, -1209,1275,1208, -1275,1209,1276, -1210,1276,1209, -1276,1210,1277, -1211,1277,1210, -1277,1211,1278, -1212,1278,1211, -1278,1212,1279, -1213,1279,1212, -1279,1213,1280, -1214,1280,1213, -1280,1214,1281, -1215,1281,1214, -1281,1215,1282, -1216,1282,1215, -1282,1216,1283, -1217,1283,1216, -1283,1217,1284, -1218,1284,1217, -1284,1218,1285, -1219,1285,1218, -1285,1219,1286, -1220,1286,1219, -1286,1220,1287, -1221,1287,1220, -1287,1221,1288, -1222,1288,1221, -1288,1222,1289, -1223,1289,1222, -1289,1223,1290, -1224,1290,1223, -1290,1224,1291, -1225,1291,1224, -1291,1225,1292, -1226,1292,1225, -1292,1226,1293, -1227,1293,1226, -1293,1227,1294, -1228,1294,1227, -1294,1228,1295, -1229,1295,1228, -1295,1229,1296, -1230,1296,1229, -1296,1230,1297, -1231,1297,1230, -1297,1231,1298, -1232,1298,1231, -1298,1232,1299, -1233,1299,1232, -1299,1233,1300, -1234,1300,1233, -1300,1234,1301, -1235,1301,1234, -1301,1235,1302, -1236,1302,1235, -1302,1236,1303, -1237,1303,1236, -1303,1237,1304, -1238,1304,1237, -1304,1238,1305, -1239,1305,1238, -1305,1239,1306, -1240,1306,1239, -1306,1240,1307, -1241,1307,1240, -1307,1241,1308, -1242,1308,1241, -1308,1242,1309, -1243,1309,1242, -1309,1243,1310, -1244,1310,1243, -1310,1244,1311, -1245,1311,1244, -1311,1245,1312, -1246,1312,1245, -1312,1246,1313, -1247,1313,1246, -1313,1247,1314, -1248,1314,1247, -1314,1248,1315, -1249,1315,1248, -1315,1249,1316, -1250,1316,1249, -1316,1250,1317, -1251,1317,1250, -1317,1251,1318, -1252,1318,1251, -1318,1252,1319, -1253,1319,1252, -1320,1254,1321, -1255,1321,1254, -1321,1255,1322, -1256,1322,1255, -1322,1256,1323, -1257,1323,1256, -1323,1257,1324, -1258,1324,1257, -1324,1258,1325, -1259,1325,1258, -1325,1259,1326, -1260,1326,1259, -1326,1260,1327, -1261,1327,1260, -1327,1261,1328, -1262,1328,1261, -1328,1262,1329, -1263,1329,1262, -1329,1263,1330, -1264,1330,1263, -1330,1264,1331, -1265,1331,1264, -1331,1265,1332, -1266,1332,1265, -1332,1266,1333, -1267,1333,1266, -1333,1267,1334, -1268,1334,1267, -1334,1268,1335, -1269,1335,1268, -1335,1269,1336, -1270,1336,1269, -1336,1270,1337, -1271,1337,1270, -1337,1271,1338, -1272,1338,1271, -1338,1272,1339, -1273,1339,1272, -1339,1273,1340, -1274,1340,1273, -1340,1274,1341, -1275,1341,1274, -1341,1275,1342, -1276,1342,1275, -1342,1276,1343, -1277,1343,1276, -1343,1277,1344, -1278,1344,1277, -1344,1278,1345, -1279,1345,1278, -1345,1279,1346, -1280,1346,1279, -1346,1280,1347, -1281,1347,1280, -1347,1281,1348, -1282,1348,1281, -1348,1282,1349, -1283,1349,1282, -1349,1283,1350, -1284,1350,1283, -1350,1284,1351, -1285,1351,1284, -1351,1285,1352, -1286,1352,1285, -1352,1286,1353, -1287,1353,1286, -1353,1287,1354, -1288,1354,1287, -1354,1288,1355, -1289,1355,1288, -1355,1289,1356, -1290,1356,1289, -1356,1290,1357, -1291,1357,1290, -1357,1291,1358, -1292,1358,1291, -1358,1292,1359, -1293,1359,1292, -1359,1293,1360, -1294,1360,1293, -1360,1294,1361, -1295,1361,1294, -1361,1295,1362, -1296,1362,1295, -1362,1296,1363, -1297,1363,1296, -1363,1297,1364, -1298,1364,1297, -1364,1298,1365, -1299,1365,1298, -1365,1299,1366, -1300,1366,1299, -1366,1300,1367, -1301,1367,1300, -1367,1301,1368, -1302,1368,1301, -1368,1302,1369, -1303,1369,1302, -1369,1303,1370, -1304,1370,1303, -1370,1304,1371, -1305,1371,1304, -1371,1305,1372, -1306,1372,1305, -1372,1306,1373, -1307,1373,1306, -1373,1307,1374, -1308,1374,1307, -1374,1308,1375, -1309,1375,1308, -1375,1309,1376, -1310,1376,1309, -1376,1310,1377, -1311,1377,1310, -1377,1311,1378, -1312,1378,1311, -1378,1312,1379, -1313,1379,1312, -1379,1313,1380, -1314,1380,1313, -1380,1314,1381, -1315,1381,1314, -1381,1315,1382, -1316,1382,1315, -1382,1316,1383, -1317,1383,1316, -1383,1317,1384, -1318,1384,1317, -1384,1318,1385, -1319,1385,1318, -1386,1320,1387, -1321,1387,1320, -1387,1321,1388, -1322,1388,1321, -1388,1322,1389, -1323,1389,1322, -1389,1323,1390, -1324,1390,1323, -1390,1324,1391, -1325,1391,1324, -1391,1325,1392, -1326,1392,1325, -1392,1326,1393, -1327,1393,1326, -1393,1327,1394, -1328,1394,1327, -1394,1328,1395, -1329,1395,1328, -1395,1329,1396, -1330,1396,1329, -1396,1330,1397, -1331,1397,1330, -1397,1331,1398, -1332,1398,1331, -1398,1332,1399, -1333,1399,1332, -1399,1333,1400, -1334,1400,1333, -1400,1334,1401, -1335,1401,1334, -1401,1335,1402, -1336,1402,1335, -1402,1336,1403, -1337,1403,1336, -1403,1337,1404, -1338,1404,1337, -1404,1338,1405, -1339,1405,1338, -1405,1339,1406, -1340,1406,1339, -1406,1340,1407, -1341,1407,1340, -1407,1341,1408, -1342,1408,1341, -1408,1342,1409, -1343,1409,1342, -1409,1343,1410, -1344,1410,1343, -1410,1344,1411, -1345,1411,1344, -1411,1345,1412, -1346,1412,1345, -1412,1346,1413, -1347,1413,1346, -1413,1347,1414, -1348,1414,1347, -1414,1348,1415, -1349,1415,1348, -1415,1349,1416, -1350,1416,1349, -1416,1350,1417, -1351,1417,1350, -1417,1351,1418, -1352,1418,1351, -1418,1352,1419, -1353,1419,1352, -1419,1353,1420, -1354,1420,1353, -1420,1354,1421, -1355,1421,1354, -1421,1355,1422, -1356,1422,1355, -1422,1356,1423, -1357,1423,1356, -1423,1357,1424, -1358,1424,1357, -1424,1358,1425, -1359,1425,1358, -1425,1359,1426, -1360,1426,1359, -1426,1360,1427, -1361,1427,1360, -1427,1361,1428, -1362,1428,1361, -1428,1362,1429, -1363,1429,1362, -1429,1363,1430, -1364,1430,1363, -1430,1364,1431, -1365,1431,1364, -1431,1365,1432, -1366,1432,1365, -1432,1366,1433, -1367,1433,1366, -1433,1367,1434, -1368,1434,1367, -1434,1368,1435, -1369,1435,1368, -1435,1369,1436, -1370,1436,1369, -1436,1370,1437, -1371,1437,1370, -1437,1371,1438, -1372,1438,1371, -1438,1372,1439, -1373,1439,1372, -1439,1373,1440, -1374,1440,1373, -1440,1374,1441, -1375,1441,1374, -1441,1375,1442, -1376,1442,1375, -1442,1376,1443, -1377,1443,1376, -1443,1377,1444, -1378,1444,1377, -1444,1378,1445, -1379,1445,1378, -1445,1379,1446, -1380,1446,1379, -1446,1380,1447, -1381,1447,1380, -1447,1381,1448, -1382,1448,1381, -1448,1382,1449, -1383,1449,1382, -1449,1383,1450, -1384,1450,1383, -1450,1384,1451, -1385,1451,1384, -1452,1386,1453, -1387,1453,1386, -1453,1387,1454, -1388,1454,1387, -1454,1388,1455, -1389,1455,1388, -1455,1389,1456, -1390,1456,1389, -1456,1390,1457, -1391,1457,1390, -1457,1391,1458, -1392,1458,1391, -1458,1392,1459, -1393,1459,1392, -1459,1393,1460, -1394,1460,1393, -1460,1394,1461, -1395,1461,1394, -1461,1395,1462, -1396,1462,1395, -1462,1396,1463, -1397,1463,1396, -1463,1397,1464, -1398,1464,1397, -1464,1398,1465, -1399,1465,1398, -1465,1399,1466, -1400,1466,1399, -1466,1400,1467, -1401,1467,1400, -1467,1401,1468, -1402,1468,1401, -1468,1402,1469, -1403,1469,1402, -1469,1403,1470, -1404,1470,1403, -1470,1404,1471, -1405,1471,1404, -1471,1405,1472, -1406,1472,1405, -1472,1406,1473, -1407,1473,1406, -1473,1407,1474, -1408,1474,1407, -1474,1408,1475, -1409,1475,1408, -1475,1409,1476, -1410,1476,1409, -1476,1410,1477, -1411,1477,1410, -1477,1411,1478, -1412,1478,1411, -1478,1412,1479, -1413,1479,1412, -1479,1413,1480, -1414,1480,1413, -1480,1414,1481, -1415,1481,1414, -1481,1415,1482, -1416,1482,1415, -1482,1416,1483, -1417,1483,1416, -1483,1417,1484, -1418,1484,1417, -1484,1418,1485, -1419,1485,1418, -1485,1419,1486, -1420,1486,1419, -1486,1420,1487, -1421,1487,1420, -1487,1421,1488, -1422,1488,1421, -1488,1422,1489, -1423,1489,1422, -1489,1423,1490, -1424,1490,1423, -1490,1424,1491, -1425,1491,1424, -1491,1425,1492, -1426,1492,1425, -1492,1426,1493, -1427,1493,1426, -1493,1427,1494, -1428,1494,1427, -1494,1428,1495, -1429,1495,1428, -1495,1429,1496, -1430,1496,1429, -1496,1430,1497, -1431,1497,1430, -1497,1431,1498, -1432,1498,1431, -1498,1432,1499, -1433,1499,1432, -1499,1433,1500, -1434,1500,1433, -1500,1434,1501, -1435,1501,1434, -1501,1435,1502, -1436,1502,1435, -1502,1436,1503, -1437,1503,1436, -1503,1437,1504, -1438,1504,1437, -1504,1438,1505, -1439,1505,1438, -1505,1439,1506, -1440,1506,1439, -1506,1440,1507, -1441,1507,1440, -1507,1441,1508, -1442,1508,1441, -1508,1442,1509, -1443,1509,1442, -1509,1443,1510, -1444,1510,1443, -1510,1444,1511, -1445,1511,1444, -1511,1445,1512, -1446,1512,1445, -1512,1446,1513, -1447,1513,1446, -1513,1447,1514, -1448,1514,1447, -1514,1448,1515, -1449,1515,1448, -1515,1449,1516, -1450,1516,1449, -1516,1450,1517, -1451,1517,1450, -1518,1452,1519, -1453,1519,1452, -1519,1453,1520, -1454,1520,1453, -1520,1454,1521, -1455,1521,1454, -1521,1455,1522, -1456,1522,1455, -1522,1456,1523, -1457,1523,1456, -1523,1457,1524, -1458,1524,1457, -1524,1458,1525, -1459,1525,1458, -1525,1459,1526, -1460,1526,1459, -1526,1460,1527, -1461,1527,1460, -1527,1461,1528, -1462,1528,1461, -1528,1462,1529, -1463,1529,1462, -1529,1463,1530, -1464,1530,1463, -1530,1464,1531, -1465,1531,1464, -1531,1465,1532, -1466,1532,1465, -1532,1466,1533, -1467,1533,1466, -1533,1467,1534, -1468,1534,1467, -1534,1468,1535, -1469,1535,1468, -1535,1469,1536, -1470,1536,1469, -1536,1470,1537, -1471,1537,1470, -1537,1471,1538, -1472,1538,1471, -1538,1472,1539, -1473,1539,1472, -1539,1473,1540, -1474,1540,1473, -1540,1474,1541, -1475,1541,1474, -1541,1475,1542, -1476,1542,1475, -1542,1476,1543, -1477,1543,1476, -1543,1477,1544, -1478,1544,1477, -1544,1478,1545, -1479,1545,1478, -1545,1479,1546, -1480,1546,1479, -1546,1480,1547, -1481,1547,1480, -1547,1481,1548, -1482,1548,1481, -1548,1482,1549, -1483,1549,1482, -1549,1483,1550, -1484,1550,1483, -1550,1484,1551, -1485,1551,1484, -1551,1485,1552, -1486,1552,1485, -1552,1486,1553, -1487,1553,1486, -1553,1487,1554, -1488,1554,1487, -1554,1488,1555, -1489,1555,1488, -1555,1489,1556, -1490,1556,1489, -1556,1490,1557, -1491,1557,1490, -1557,1491,1558, -1492,1558,1491, -1558,1492,1559, -1493,1559,1492, -1559,1493,1560, -1494,1560,1493, -1560,1494,1561, -1495,1561,1494, -1561,1495,1562, -1496,1562,1495, -1562,1496,1563, -1497,1563,1496, -1563,1497,1564, -1498,1564,1497, -1564,1498,1565, -1499,1565,1498, -1565,1499,1566, -1500,1566,1499, -1566,1500,1567, -1501,1567,1500, -1567,1501,1568, -1502,1568,1501, -1568,1502,1569, -1503,1569,1502, -1569,1503,1570, -1504,1570,1503, -1570,1504,1571, -1505,1571,1504, -1571,1505,1572, -1506,1572,1505, -1572,1506,1573, -1507,1573,1506, -1573,1507,1574, -1508,1574,1507, -1574,1508,1575, -1509,1575,1508, -1575,1509,1576, -1510,1576,1509, -1576,1510,1577, -1511,1577,1510, -1577,1511,1578, -1512,1578,1511, -1578,1512,1579, -1513,1579,1512, -1579,1513,1580, -1514,1580,1513, -1580,1514,1581, -1515,1581,1514, -1581,1515,1582, -1516,1582,1515, -1582,1516,1583, -1517,1583,1516, -1584,1518,1585, -1519,1585,1518, -1585,1519,1586, -1520,1586,1519, -1586,1520,1587, -1521,1587,1520, -1587,1521,1588, -1522,1588,1521, -1588,1522,1589, -1523,1589,1522, -1589,1523,1590, -1524,1590,1523, -1590,1524,1591, -1525,1591,1524, -1591,1525,1592, -1526,1592,1525, -1592,1526,1593, -1527,1593,1526, -1593,1527,1594, -1528,1594,1527, -1594,1528,1595, -1529,1595,1528, -1595,1529,1596, -1530,1596,1529, -1596,1530,1597, -1531,1597,1530, -1597,1531,1598, -1532,1598,1531, -1598,1532,1599, -1533,1599,1532, -1599,1533,1600, -1534,1600,1533, -1600,1534,1601, -1535,1601,1534, -1601,1535,1602, -1536,1602,1535, -1602,1536,1603, -1537,1603,1536, -1603,1537,1604, -1538,1604,1537, -1604,1538,1605, -1539,1605,1538, -1605,1539,1606, -1540,1606,1539, -1606,1540,1607, -1541,1607,1540, -1607,1541,1608, -1542,1608,1541, -1608,1542,1609, -1543,1609,1542, -1609,1543,1610, -1544,1610,1543, -1610,1544,1611, -1545,1611,1544, -1611,1545,1612, -1546,1612,1545, -1612,1546,1613, -1547,1613,1546, -1613,1547,1614, -1548,1614,1547, -1614,1548,1615, -1549,1615,1548, -1615,1549,1616, -1550,1616,1549, -1616,1550,1617, -1551,1617,1550, -1617,1551,1618, -1552,1618,1551, -1618,1552,1619, -1553,1619,1552, -1619,1553,1620, -1554,1620,1553, -1620,1554,1621, -1555,1621,1554, -1621,1555,1622, -1556,1622,1555, -1622,1556,1623, -1557,1623,1556, -1623,1557,1624, -1558,1624,1557, -1624,1558,1625, -1559,1625,1558, -1625,1559,1626, -1560,1626,1559, -1626,1560,1627, -1561,1627,1560, -1627,1561,1628, -1562,1628,1561, -1628,1562,1629, -1563,1629,1562, -1629,1563,1630, -1564,1630,1563, -1630,1564,1631, -1565,1631,1564, -1631,1565,1632, -1566,1632,1565, -1632,1566,1633, -1567,1633,1566, -1633,1567,1634, -1568,1634,1567, -1634,1568,1635, -1569,1635,1568, -1635,1569,1636, -1570,1636,1569, -1636,1570,1637, -1571,1637,1570, -1637,1571,1638, -1572,1638,1571, -1638,1572,1639, -1573,1639,1572, -1639,1573,1640, -1574,1640,1573, -1640,1574,1641, -1575,1641,1574, -1641,1575,1642, -1576,1642,1575, -1642,1576,1643, -1577,1643,1576, -1643,1577,1644, -1578,1644,1577, -1644,1578,1645, -1579,1645,1578, -1645,1579,1646, -1580,1646,1579, -1646,1580,1647, -1581,1647,1580, -1647,1581,1648, -1582,1648,1581, -1648,1582,1649, -1583,1649,1582, -1650,1584,1651, -1585,1651,1584, -1651,1585,1652, -1586,1652,1585, -1652,1586,1653, -1587,1653,1586, -1653,1587,1654, -1588,1654,1587, -1654,1588,1655, -1589,1655,1588, -1655,1589,1656, -1590,1656,1589, -1656,1590,1657, -1591,1657,1590, -1657,1591,1658, -1592,1658,1591, -1658,1592,1659, -1593,1659,1592, -1659,1593,1660, -1594,1660,1593, -1660,1594,1661, -1595,1661,1594, -1661,1595,1662, -1596,1662,1595, -1662,1596,1663, -1597,1663,1596, -1663,1597,1664, -1598,1664,1597, -1664,1598,1665, -1599,1665,1598, -1665,1599,1666, -1600,1666,1599, -1666,1600,1667, -1601,1667,1600, -1667,1601,1668, -1602,1668,1601, -1668,1602,1669, -1603,1669,1602, -1669,1603,1670, -1604,1670,1603, -1670,1604,1671, -1605,1671,1604, -1671,1605,1672, -1606,1672,1605, -1672,1606,1673, -1607,1673,1606, -1673,1607,1674, -1608,1674,1607, -1674,1608,1675, -1609,1675,1608, -1675,1609,1676, -1610,1676,1609, -1676,1610,1677, -1611,1677,1610, -1677,1611,1678, -1612,1678,1611, -1678,1612,1679, -1613,1679,1612, -1679,1613,1680, -1614,1680,1613, -1680,1614,1681, -1615,1681,1614, -1681,1615,1682, -1616,1682,1615, -1682,1616,1683, -1617,1683,1616, -1683,1617,1684, -1618,1684,1617, -1684,1618,1685, -1619,1685,1618, -1685,1619,1686, -1620,1686,1619, -1686,1620,1687, -1621,1687,1620, -1687,1621,1688, -1622,1688,1621, -1688,1622,1689, -1623,1689,1622, -1689,1623,1690, -1624,1690,1623, -1690,1624,1691, -1625,1691,1624, -1691,1625,1692, -1626,1692,1625, -1692,1626,1693, -1627,1693,1626, -1693,1627,1694, -1628,1694,1627, -1694,1628,1695, -1629,1695,1628, -1695,1629,1696, -1630,1696,1629, -1696,1630,1697, -1631,1697,1630, -1697,1631,1698, -1632,1698,1631, -1698,1632,1699, -1633,1699,1632, -1699,1633,1700, -1634,1700,1633, -1700,1634,1701, -1635,1701,1634, -1701,1635,1702, -1636,1702,1635, -1702,1636,1703, -1637,1703,1636, -1703,1637,1704, -1638,1704,1637, -1704,1638,1705, -1639,1705,1638, -1705,1639,1706, -1640,1706,1639, -1706,1640,1707, -1641,1707,1640, -1707,1641,1708, -1642,1708,1641, -1708,1642,1709, -1643,1709,1642, -1709,1643,1710, -1644,1710,1643, -1710,1644,1711, -1645,1711,1644, -1711,1645,1712, -1646,1712,1645, -1712,1646,1713, -1647,1713,1646, -1713,1647,1714, -1648,1714,1647, -1714,1648,1715, -1649,1715,1648, -1716,1650,1717, -1651,1717,1650, -1717,1651,1718, -1652,1718,1651, -1718,1652,1719, -1653,1719,1652, -1719,1653,1720, -1654,1720,1653, -1720,1654,1721, -1655,1721,1654, -1721,1655,1722, -1656,1722,1655, -1722,1656,1723, -1657,1723,1656, -1723,1657,1724, -1658,1724,1657, -1724,1658,1725, -1659,1725,1658, -1725,1659,1726, -1660,1726,1659, -1726,1660,1727, -1661,1727,1660, -1727,1661,1728, -1662,1728,1661, -1728,1662,1729, -1663,1729,1662, -1729,1663,1730, -1664,1730,1663, -1730,1664,1731, -1665,1731,1664, -1731,1665,1732, -1666,1732,1665, -1732,1666,1733, -1667,1733,1666, -1733,1667,1734, -1668,1734,1667, -1734,1668,1735, -1669,1735,1668, -1735,1669,1736, -1670,1736,1669, -1736,1670,1737, -1671,1737,1670, -1737,1671,1738, -1672,1738,1671, -1738,1672,1739, -1673,1739,1672, -1739,1673,1740, -1674,1740,1673, -1740,1674,1741, -1675,1741,1674, -1741,1675,1742, -1676,1742,1675, -1742,1676,1743, -1677,1743,1676, -1743,1677,1744, -1678,1744,1677, -1744,1678,1745, -1679,1745,1678, -1745,1679,1746, -1680,1746,1679, -1746,1680,1747, -1681,1747,1680, -1747,1681,1748, -1682,1748,1681, -1748,1682,1749, -1683,1749,1682, -1749,1683,1750, -1684,1750,1683, -1750,1684,1751, -1685,1751,1684, -1751,1685,1752, -1686,1752,1685, -1752,1686,1753, -1687,1753,1686, -1753,1687,1754, -1688,1754,1687, -1754,1688,1755, -1689,1755,1688, -1755,1689,1756, -1690,1756,1689, -1756,1690,1757, -1691,1757,1690, -1757,1691,1758, -1692,1758,1691, -1758,1692,1759, -1693,1759,1692, -1759,1693,1760, -1694,1760,1693, -1760,1694,1761, -1695,1761,1694, -1761,1695,1762, -1696,1762,1695, -1762,1696,1763, -1697,1763,1696, -1763,1697,1764, -1698,1764,1697, -1764,1698,1765, -1699,1765,1698, -1765,1699,1766, -1700,1766,1699, -1766,1700,1767, -1701,1767,1700, -1767,1701,1768, -1702,1768,1701, -1768,1702,1769, -1703,1769,1702, -1769,1703,1770, -1704,1770,1703, -1770,1704,1771, -1705,1771,1704, -1771,1705,1772, -1706,1772,1705, -1772,1706,1773, -1707,1773,1706, -1773,1707,1774, -1708,1774,1707, -1774,1708,1775, -1709,1775,1708, -1775,1709,1776, -1710,1776,1709, -1776,1710,1777, -1711,1777,1710, -1777,1711,1778, -1712,1778,1711, -1778,1712,1779, -1713,1779,1712, -1779,1713,1780, -1714,1780,1713, -1780,1714,1781, -1715,1781,1714, -1782,1716,1783, -1717,1783,1716, -1783,1717,1784, -1718,1784,1717, -1784,1718,1785, -1719,1785,1718, -1785,1719,1786, -1720,1786,1719, -1786,1720,1787, -1721,1787,1720, -1787,1721,1788, -1722,1788,1721, -1788,1722,1789, -1723,1789,1722, -1789,1723,1790, -1724,1790,1723, -1790,1724,1791, -1725,1791,1724, -1791,1725,1792, -1726,1792,1725, -1792,1726,1793, -1727,1793,1726, -1793,1727,1794, -1728,1794,1727, -1794,1728,1795, -1729,1795,1728, -1795,1729,1796, -1730,1796,1729, -1796,1730,1797, -1731,1797,1730, -1797,1731,1798, -1732,1798,1731, -1798,1732,1799, -1733,1799,1732, -1799,1733,1800, -1734,1800,1733, -1800,1734,1801, -1735,1801,1734, -1801,1735,1802, -1736,1802,1735, -1802,1736,1803, -1737,1803,1736, -1803,1737,1804, -1738,1804,1737, -1804,1738,1805, -1739,1805,1738, -1805,1739,1806, -1740,1806,1739, -1806,1740,1807, -1741,1807,1740, -1807,1741,1808, -1742,1808,1741, -1808,1742,1809, -1743,1809,1742, -1809,1743,1810, -1744,1810,1743, -1810,1744,1811, -1745,1811,1744, -1811,1745,1812, -1746,1812,1745, -1812,1746,1813, -1747,1813,1746, -1813,1747,1814, -1748,1814,1747, -1814,1748,1815, -1749,1815,1748, -1815,1749,1816, -1750,1816,1749, -1816,1750,1817, -1751,1817,1750, -1817,1751,1818, -1752,1818,1751, -1818,1752,1819, -1753,1819,1752, -1819,1753,1820, -1754,1820,1753, -1820,1754,1821, -1755,1821,1754, -1821,1755,1822, -1756,1822,1755, -1822,1756,1823, -1757,1823,1756, -1823,1757,1824, -1758,1824,1757, -1824,1758,1825, -1759,1825,1758, -1825,1759,1826, -1760,1826,1759, -1826,1760,1827, -1761,1827,1760, -1827,1761,1828, -1762,1828,1761, -1828,1762,1829, -1763,1829,1762, -1829,1763,1830, -1764,1830,1763, -1830,1764,1831, -1765,1831,1764, -1831,1765,1832, -1766,1832,1765, -1832,1766,1833, -1767,1833,1766, -1833,1767,1834, -1768,1834,1767, -1834,1768,1835, -1769,1835,1768, -1835,1769,1836, -1770,1836,1769, -1836,1770,1837, -1771,1837,1770, -1837,1771,1838, -1772,1838,1771, -1838,1772,1839, -1773,1839,1772, -1839,1773,1840, -1774,1840,1773, -1840,1774,1841, -1775,1841,1774, -1841,1775,1842, -1776,1842,1775, -1842,1776,1843, -1777,1843,1776, -1843,1777,1844, -1778,1844,1777, -1844,1778,1845, -1779,1845,1778, -1845,1779,1846, -1780,1846,1779, -1846,1780,1847, -1781,1847,1780, -1848,1782,1849, -1783,1849,1782, -1849,1783,1850, -1784,1850,1783, -1850,1784,1851, -1785,1851,1784, -1851,1785,1852, -1786,1852,1785, -1852,1786,1853, -1787,1853,1786, -1853,1787,1854, -1788,1854,1787, -1854,1788,1855, -1789,1855,1788, -1855,1789,1856, -1790,1856,1789, -1856,1790,1857, -1791,1857,1790, -1857,1791,1858, -1792,1858,1791, -1858,1792,1859, -1793,1859,1792, -1859,1793,1860, -1794,1860,1793, -1860,1794,1861, -1795,1861,1794, -1861,1795,1862, -1796,1862,1795, -1862,1796,1863, -1797,1863,1796, -1863,1797,1864, -1798,1864,1797, -1864,1798,1865, -1799,1865,1798, -1865,1799,1866, -1800,1866,1799, -1866,1800,1867, -1801,1867,1800, -1867,1801,1868, -1802,1868,1801, -1868,1802,1869, -1803,1869,1802, -1869,1803,1870, -1804,1870,1803, -1870,1804,1871, -1805,1871,1804, -1871,1805,1872, -1806,1872,1805, -1872,1806,1873, -1807,1873,1806, -1873,1807,1874, -1808,1874,1807, -1874,1808,1875, -1809,1875,1808, -1875,1809,1876, -1810,1876,1809, -1876,1810,1877, -1811,1877,1810, -1877,1811,1878, -1812,1878,1811, -1878,1812,1879, -1813,1879,1812, -1879,1813,1880, -1814,1880,1813, -1880,1814,1881, -1815,1881,1814, -1881,1815,1882, -1816,1882,1815, -1882,1816,1883, -1817,1883,1816, -1883,1817,1884, -1818,1884,1817, -1884,1818,1885, -1819,1885,1818, -1885,1819,1886, -1820,1886,1819, -1886,1820,1887, -1821,1887,1820, -1887,1821,1888, -1822,1888,1821, -1888,1822,1889, -1823,1889,1822, -1889,1823,1890, -1824,1890,1823, -1890,1824,1891, -1825,1891,1824, -1891,1825,1892, -1826,1892,1825, -1892,1826,1893, -1827,1893,1826, -1893,1827,1894, -1828,1894,1827, -1894,1828,1895, -1829,1895,1828, -1895,1829,1896, -1830,1896,1829, -1896,1830,1897, -1831,1897,1830, -1897,1831,1898, -1832,1898,1831, -1898,1832,1899, -1833,1899,1832, -1899,1833,1900, -1834,1900,1833, -1900,1834,1901, -1835,1901,1834, -1901,1835,1902, -1836,1902,1835, -1902,1836,1903, -1837,1903,1836, -1903,1837,1904, -1838,1904,1837, -1904,1838,1905, -1839,1905,1838, -1905,1839,1906, -1840,1906,1839, -1906,1840,1907, -1841,1907,1840, -1907,1841,1908, -1842,1908,1841, -1908,1842,1909, -1843,1909,1842, -1909,1843,1910, -1844,1910,1843, -1910,1844,1911, -1845,1911,1844, -1911,1845,1912, -1846,1912,1845, -1912,1846,1913, -1847,1913,1846, -1914,1848,1915, -1849,1915,1848, -1915,1849,1916, -1850,1916,1849, -1916,1850,1917, -1851,1917,1850, -1917,1851,1918, -1852,1918,1851, -1918,1852,1919, -1853,1919,1852, -1919,1853,1920, -1854,1920,1853, -1920,1854,1921, -1855,1921,1854, -1921,1855,1922, -1856,1922,1855, -1922,1856,1923, -1857,1923,1856, -1923,1857,1924, -1858,1924,1857, -1924,1858,1925, -1859,1925,1858, -1925,1859,1926, -1860,1926,1859, -1926,1860,1927, -1861,1927,1860, -1927,1861,1928, -1862,1928,1861, -1928,1862,1929, -1863,1929,1862, -1929,1863,1930, -1864,1930,1863, -1930,1864,1931, -1865,1931,1864, -1931,1865,1932, -1866,1932,1865, -1932,1866,1933, -1867,1933,1866, -1933,1867,1934, -1868,1934,1867, -1934,1868,1935, -1869,1935,1868, -1935,1869,1936, -1870,1936,1869, -1936,1870,1937, -1871,1937,1870, -1937,1871,1938, -1872,1938,1871, -1938,1872,1939, -1873,1939,1872, -1939,1873,1940, -1874,1940,1873, -1940,1874,1941, -1875,1941,1874, -1941,1875,1942, -1876,1942,1875, -1942,1876,1943, -1877,1943,1876, -1943,1877,1944, -1878,1944,1877, -1944,1878,1945, -1879,1945,1878, -1945,1879,1946, -1880,1946,1879, -1946,1880,1947, -1881,1947,1880, -1947,1881,1948, -1882,1948,1881, -1948,1882,1949, -1883,1949,1882, -1949,1883,1950, -1884,1950,1883, -1950,1884,1951, -1885,1951,1884, -1951,1885,1952, -1886,1952,1885, -1952,1886,1953, -1887,1953,1886, -1953,1887,1954, -1888,1954,1887, -1954,1888,1955, -1889,1955,1888, -1955,1889,1956, -1890,1956,1889, -1956,1890,1957, -1891,1957,1890, -1957,1891,1958, -1892,1958,1891, -1958,1892,1959, -1893,1959,1892, -1959,1893,1960, -1894,1960,1893, -1960,1894,1961, -1895,1961,1894, -1961,1895,1962, -1896,1962,1895, -1962,1896,1963, -1897,1963,1896, -1963,1897,1964, -1898,1964,1897, -1964,1898,1965, -1899,1965,1898, -1965,1899,1966, -1900,1966,1899, -1966,1900,1967, -1901,1967,1900, -1967,1901,1968, -1902,1968,1901, -1968,1902,1969, -1903,1969,1902, -1969,1903,1970, -1904,1970,1903, -1970,1904,1971, -1905,1971,1904, -1971,1905,1972, -1906,1972,1905, -1972,1906,1973, -1907,1973,1906, -1973,1907,1974, -1908,1974,1907, -1974,1908,1975, -1909,1975,1908, -1975,1909,1976, -1910,1976,1909, -1976,1910,1977, -1911,1977,1910, -1977,1911,1978, -1912,1978,1911, -1978,1912,1979, -1913,1979,1912, -1980,1914,1981, -1915,1981,1914, -1981,1915,1982, -1916,1982,1915, -1982,1916,1983, -1917,1983,1916, -1983,1917,1984, -1918,1984,1917, -1984,1918,1985, -1919,1985,1918, -1985,1919,1986, -1920,1986,1919, -1986,1920,1987, -1921,1987,1920, -1987,1921,1988, -1922,1988,1921, -1988,1922,1989, -1923,1989,1922, -1989,1923,1990, -1924,1990,1923, -1990,1924,1991, -1925,1991,1924, -1991,1925,1992, -1926,1992,1925, -1992,1926,1993, -1927,1993,1926, -1993,1927,1994, -1928,1994,1927, -1994,1928,1995, -1929,1995,1928, -1995,1929,1996, -1930,1996,1929, -1996,1930,1997, -1931,1997,1930, -1997,1931,1998, -1932,1998,1931, -1998,1932,1999, -1933,1999,1932, -1999,1933,2000, -1934,2000,1933, -2000,1934,2001, -1935,2001,1934, -2001,1935,2002, -1936,2002,1935, -2002,1936,2003, -1937,2003,1936, -2003,1937,2004, -1938,2004,1937, -2004,1938,2005, -1939,2005,1938, -2005,1939,2006, -1940,2006,1939, -2006,1940,2007, -1941,2007,1940, -2007,1941,2008, -1942,2008,1941, -2008,1942,2009, -1943,2009,1942, -2009,1943,2010, -1944,2010,1943, -2010,1944,2011, -1945,2011,1944, -2011,1945,2012, -1946,2012,1945, -2012,1946,2013, -1947,2013,1946, -2013,1947,2014, -1948,2014,1947, -2014,1948,2015, -1949,2015,1948, -2015,1949,2016, -1950,2016,1949, -2016,1950,2017, -1951,2017,1950, -2017,1951,2018, -1952,2018,1951, -2018,1952,2019, -1953,2019,1952, -2019,1953,2020, -1954,2020,1953, -2020,1954,2021, -1955,2021,1954, -2021,1955,2022, -1956,2022,1955, -2022,1956,2023, -1957,2023,1956, -2023,1957,2024, -1958,2024,1957, -2024,1958,2025, -1959,2025,1958, -2025,1959,2026, -1960,2026,1959, -2026,1960,2027, -1961,2027,1960, -2027,1961,2028, -1962,2028,1961, -2028,1962,2029, -1963,2029,1962, -2029,1963,2030, -1964,2030,1963, -2030,1964,2031, -1965,2031,1964, -2031,1965,2032, -1966,2032,1965, -2032,1966,2033, -1967,2033,1966, -2033,1967,2034, -1968,2034,1967, -2034,1968,2035, -1969,2035,1968, -2035,1969,2036, -1970,2036,1969, -2036,1970,2037, -1971,2037,1970, -2037,1971,2038, -1972,2038,1971, -2038,1972,2039, -1973,2039,1972, -2039,1973,2040, -1974,2040,1973, -2040,1974,2041, -1975,2041,1974, -2041,1975,2042, -1976,2042,1975, -2042,1976,2043, -1977,2043,1976, -2043,1977,2044, -1978,2044,1977, -2044,1978,2045, -1979,2045,1978, -2046,1980,2047, -1981,2047,1980, -2047,1981,2048, -1982,2048,1981, -2048,1982,2049, -1983,2049,1982, -2049,1983,2050, -1984,2050,1983, -2050,1984,2051, -1985,2051,1984, -2051,1985,2052, -1986,2052,1985, -2052,1986,2053, -1987,2053,1986, -2053,1987,2054, -1988,2054,1987, -2054,1988,2055, -1989,2055,1988, -2055,1989,2056, -1990,2056,1989, -2056,1990,2057, -1991,2057,1990, -2057,1991,2058, -1992,2058,1991, -2058,1992,2059, -1993,2059,1992, -2059,1993,2060, -1994,2060,1993, -2060,1994,2061, -1995,2061,1994, -2061,1995,2062, -1996,2062,1995, -2062,1996,2063, -1997,2063,1996, -2063,1997,2064, -1998,2064,1997, -2064,1998,2065, -1999,2065,1998, -2065,1999,2066, -2000,2066,1999, -2066,2000,2067, -2001,2067,2000, -2067,2001,2068, -2002,2068,2001, -2068,2002,2069, -2003,2069,2002, -2069,2003,2070, -2004,2070,2003, -2070,2004,2071, -2005,2071,2004, -2071,2005,2072, -2006,2072,2005, -2072,2006,2073, -2007,2073,2006, -2073,2007,2074, -2008,2074,2007, -2074,2008,2075, -2009,2075,2008, -2075,2009,2076, -2010,2076,2009, -2076,2010,2077, -2011,2077,2010, -2077,2011,2078, -2012,2078,2011, -2078,2012,2079, -2013,2079,2012, -2079,2013,2080, -2014,2080,2013, -2080,2014,2081, -2015,2081,2014, -2081,2015,2082, -2016,2082,2015, -2082,2016,2083, -2017,2083,2016, -2083,2017,2084, -2018,2084,2017, -2084,2018,2085, -2019,2085,2018, -2085,2019,2086, -2020,2086,2019, -2086,2020,2087, -2021,2087,2020, -2087,2021,2088, -2022,2088,2021, -2088,2022,2089, -2023,2089,2022, -2089,2023,2090, -2024,2090,2023, -2090,2024,2091, -2025,2091,2024, -2091,2025,2092, -2026,2092,2025, -2092,2026,2093, -2027,2093,2026, -2093,2027,2094, -2028,2094,2027, -2094,2028,2095, -2029,2095,2028, -2095,2029,2096, -2030,2096,2029, -2096,2030,2097, -2031,2097,2030, -2097,2031,2098, -2032,2098,2031, -2098,2032,2099, -2033,2099,2032, -2099,2033,2100, -2034,2100,2033, -2100,2034,2101, -2035,2101,2034, -2101,2035,2102, -2036,2102,2035, -2102,2036,2103, -2037,2103,2036, -2103,2037,2104, -2038,2104,2037, -2104,2038,2105, -2039,2105,2038, -2105,2039,2106, -2040,2106,2039, -2106,2040,2107, -2041,2107,2040, -2107,2041,2108, -2042,2108,2041, -2108,2042,2109, -2043,2109,2042, -2109,2043,2110, -2044,2110,2043, -2110,2044,2111, -2045,2111,2044, -2112,2046,2113, -2047,2113,2046, -2113,2047,2114, -2048,2114,2047, -2114,2048,2115, -2049,2115,2048, -2115,2049,2116, -2050,2116,2049, -2116,2050,2117, -2051,2117,2050, -2117,2051,2118, -2052,2118,2051, -2118,2052,2119, -2053,2119,2052, -2119,2053,2120, -2054,2120,2053, -2120,2054,2121, -2055,2121,2054, -2121,2055,2122, -2056,2122,2055, -2122,2056,2123, -2057,2123,2056, -2123,2057,2124, -2058,2124,2057, -2124,2058,2125, -2059,2125,2058, -2125,2059,2126, -2060,2126,2059, -2126,2060,2127, -2061,2127,2060, -2127,2061,2128, -2062,2128,2061, -2128,2062,2129, -2063,2129,2062, -2129,2063,2130, -2064,2130,2063, -2130,2064,2131, -2065,2131,2064, -2131,2065,2132, -2066,2132,2065, -2132,2066,2133, -2067,2133,2066, -2133,2067,2134, -2068,2134,2067, -2134,2068,2135, -2069,2135,2068, -2135,2069,2136, -2070,2136,2069, -2136,2070,2137, -2071,2137,2070, -2137,2071,2138, -2072,2138,2071, -2138,2072,2139, -2073,2139,2072, -2139,2073,2140, -2074,2140,2073, -2140,2074,2141, -2075,2141,2074, -2141,2075,2142, -2076,2142,2075, -2142,2076,2143, -2077,2143,2076, -2143,2077,2144, -2078,2144,2077, -2144,2078,2145, -2079,2145,2078, -2145,2079,2146, -2080,2146,2079, -2146,2080,2147, -2081,2147,2080, -2147,2081,2148, -2082,2148,2081, -2148,2082,2149, -2083,2149,2082, -2149,2083,2150, -2084,2150,2083, -2150,2084,2151, -2085,2151,2084, -2151,2085,2152, -2086,2152,2085, -2152,2086,2153, -2087,2153,2086, -2153,2087,2154, -2088,2154,2087, -2154,2088,2155, -2089,2155,2088, -2155,2089,2156, -2090,2156,2089, -2156,2090,2157, -2091,2157,2090, -2157,2091,2158, -2092,2158,2091, -2158,2092,2159, -2093,2159,2092, -2159,2093,2160, -2094,2160,2093, -2160,2094,2161, -2095,2161,2094, -2161,2095,2162, -2096,2162,2095, -2162,2096,2163, -2097,2163,2096, -2163,2097,2164, -2098,2164,2097, -2164,2098,2165, -2099,2165,2098, -2165,2099,2166, -2100,2166,2099, -2166,2100,2167, -2101,2167,2100, -2167,2101,2168, -2102,2168,2101, -2168,2102,2169, -2103,2169,2102, -2169,2103,2170, -2104,2170,2103, -2170,2104,2171, -2105,2171,2104, -2171,2105,2172, -2106,2172,2105, -2172,2106,2173, -2107,2173,2106, -2173,2107,2174, -2108,2174,2107, -2174,2108,2175, -2109,2175,2108, -2175,2109,2176, -2110,2176,2109, -2176,2110,2177, -2111,2177,2110, -2178,2112,2179, -2113,2179,2112, -2179,2113,2180, -2114,2180,2113, -2180,2114,2181, -2115,2181,2114, -2181,2115,2182, -2116,2182,2115, -2182,2116,2183, -2117,2183,2116, -2183,2117,2184, -2118,2184,2117, -2184,2118,2185, -2119,2185,2118, -2185,2119,2186, -2120,2186,2119, -2186,2120,2187, -2121,2187,2120, -2187,2121,2188, -2122,2188,2121, -2188,2122,2189, -2123,2189,2122, -2189,2123,2190, -2124,2190,2123, -2190,2124,2191, -2125,2191,2124, -2191,2125,2192, -2126,2192,2125, -2192,2126,2193, -2127,2193,2126, -2193,2127,2194, -2128,2194,2127, -2194,2128,2195, -2129,2195,2128, -2195,2129,2196, -2130,2196,2129, -2196,2130,2197, -2131,2197,2130, -2197,2131,2198, -2132,2198,2131, -2198,2132,2199, -2133,2199,2132, -2199,2133,2200, -2134,2200,2133, -2200,2134,2201, -2135,2201,2134, -2201,2135,2202, -2136,2202,2135, -2202,2136,2203, -2137,2203,2136, -2203,2137,2204, -2138,2204,2137, -2204,2138,2205, -2139,2205,2138, -2205,2139,2206, -2140,2206,2139, -2206,2140,2207, -2141,2207,2140, -2207,2141,2208, -2142,2208,2141, -2208,2142,2209, -2143,2209,2142, -2209,2143,2210, -2144,2210,2143, -2210,2144,2211, -2145,2211,2144, -2211,2145,2212, -2146,2212,2145, -2212,2146,2213, -2147,2213,2146, -2213,2147,2214, -2148,2214,2147, -2214,2148,2215, -2149,2215,2148, -2215,2149,2216, -2150,2216,2149, -2216,2150,2217, -2151,2217,2150, -2217,2151,2218, -2152,2218,2151, -2218,2152,2219, -2153,2219,2152, -2219,2153,2220, -2154,2220,2153, -2220,2154,2221, -2155,2221,2154, -2221,2155,2222, -2156,2222,2155, -2222,2156,2223, -2157,2223,2156, -2223,2157,2224, -2158,2224,2157, -2224,2158,2225, -2159,2225,2158, -2225,2159,2226, -2160,2226,2159, -2226,2160,2227, -2161,2227,2160, -2227,2161,2228, -2162,2228,2161, -2228,2162,2229, -2163,2229,2162, -2229,2163,2230, -2164,2230,2163, -2230,2164,2231, -2165,2231,2164, -2231,2165,2232, -2166,2232,2165, -2232,2166,2233, -2167,2233,2166, -2233,2167,2234, -2168,2234,2167, -2234,2168,2235, -2169,2235,2168, -2235,2169,2236, -2170,2236,2169, -2236,2170,2237, -2171,2237,2170, -2237,2171,2238, -2172,2238,2171, -2238,2172,2239, -2173,2239,2172, -2239,2173,2240, -2174,2240,2173, -2240,2174,2241, -2175,2241,2174, -2241,2175,2242, -2176,2242,2175, -2242,2176,2243, -2177,2243,2176, -2244,2178,2245, -2179,2245,2178, -2245,2179,2246, -2180,2246,2179, -2246,2180,2247, -2181,2247,2180, -2247,2181,2248, -2182,2248,2181, -2248,2182,2249, -2183,2249,2182, -2249,2183,2250, -2184,2250,2183, -2250,2184,2251, -2185,2251,2184, -2251,2185,2252, -2186,2252,2185, -2252,2186,2253, -2187,2253,2186, -2253,2187,2254, -2188,2254,2187, -2254,2188,2255, -2189,2255,2188, -2255,2189,2256, -2190,2256,2189, -2256,2190,2257, -2191,2257,2190, -2257,2191,2258, -2192,2258,2191, -2258,2192,2259, -2193,2259,2192, -2259,2193,2260, -2194,2260,2193, -2260,2194,2261, -2195,2261,2194, -2261,2195,2262, -2196,2262,2195, -2262,2196,2263, -2197,2263,2196, -2263,2197,2264, -2198,2264,2197, -2264,2198,2265, -2199,2265,2198, -2265,2199,2266, -2200,2266,2199, -2266,2200,2267, -2201,2267,2200, -2267,2201,2268, -2202,2268,2201, -2268,2202,2269, -2203,2269,2202, -2269,2203,2270, -2204,2270,2203, -2270,2204,2271, -2205,2271,2204, -2271,2205,2272, -2206,2272,2205, -2272,2206,2273, -2207,2273,2206, -2273,2207,2274, -2208,2274,2207, -2274,2208,2275, -2209,2275,2208, -2275,2209,2276, -2210,2276,2209, -2276,2210,2277, -2211,2277,2210, -2277,2211,2278, -2212,2278,2211, -2278,2212,2279, -2213,2279,2212, -2279,2213,2280, -2214,2280,2213, -2280,2214,2281, -2215,2281,2214, -2281,2215,2282, -2216,2282,2215, -2282,2216,2283, -2217,2283,2216, -2283,2217,2284, -2218,2284,2217, -2284,2218,2285, -2219,2285,2218, -2285,2219,2286, -2220,2286,2219, -2286,2220,2287, -2221,2287,2220, -2287,2221,2288, -2222,2288,2221, -2288,2222,2289, -2223,2289,2222, -2289,2223,2290, -2224,2290,2223, -2290,2224,2291, -2225,2291,2224, -2291,2225,2292, -2226,2292,2225, -2292,2226,2293, -2227,2293,2226, -2293,2227,2294, -2228,2294,2227, -2294,2228,2295, -2229,2295,2228, -2295,2229,2296, -2230,2296,2229, -2296,2230,2297, -2231,2297,2230, -2297,2231,2298, -2232,2298,2231, -2298,2232,2299, -2233,2299,2232, -2299,2233,2300, -2234,2300,2233, -2300,2234,2301, -2235,2301,2234, -2301,2235,2302, -2236,2302,2235, -2302,2236,2303, -2237,2303,2236, -2303,2237,2304, -2238,2304,2237, -2304,2238,2305, -2239,2305,2238, -2305,2239,2306, -2240,2306,2239, -2306,2240,2307, -2241,2307,2240, -2307,2241,2308, -2242,2308,2241, -2308,2242,2309, -2243,2309,2242, -}; - -#define Landscape07VtxCount 2240 -#define Landscape07IdxCount 12852 - -btScalar Landscape07Vtx[] = { -3.90625f,49.6769f,-121.094f, -3.90625f,48.3887f,-117.188f, -7.8125f,48.8687f,-121.094f, -7.8125f,48.004f,-117.188f, -11.7188f,47.3453f,-121.094f, -11.7188f,46.8723f,-117.188f, -15.625f,44.9132f,-121.094f, -15.625f,45.5005f,-117.188f, -19.5313f,43.1526f,-121.094f, -19.5313f,43.3644f,-117.188f, -23.4375f,41.3946f,-121.094f, -23.4375f,42.3352f,-117.188f, -27.3438f,40.1349f,-121.094f, -27.3438f,41.1562f,-117.188f, -31.25f,39.2733f,-121.094f, -31.25f,39.1736f,-117.188f, -35.1563f,38.3718f,-121.094f, -35.1563f,38.0627f,-117.188f, -39.0625f,37.16f,-121.094f, -39.0625f,36.4728f,-117.188f, -42.9688f,35.2678f,-121.094f, -42.9688f,34.8001f,-117.188f, -46.875f,32.8529f,-121.094f, -46.875f,32.5103f,-117.188f, -50.7813f,32.0924f,-121.094f, -50.7813f,31.6328f,-117.188f, -54.6875f,33.2013f,-121.094f, -54.6875f,31.6106f,-117.188f, -58.5938f,34.1499f,-121.094f, -58.5938f,32.3004f,-117.188f, -62.5f,33.7675f,-121.094f, -62.5f,32.696f,-117.188f, -66.4063f,34.4892f,-121.094f, -66.4063f,33.3795f,-117.188f, -70.3125f,34.7441f,-121.094f, -70.3125f,33.9696f,-117.188f, -74.2188f,35.4435f,-121.094f, -74.2188f,34.9211f,-117.188f, -78.125f,36.6876f,-121.094f, -78.125f,36.7686f,-117.188f, -82.0313f,37.8831f,-121.094f, -82.0313f,37.7676f,-117.188f, -85.9375f,37.8533f,-121.094f, -85.9375f,37.8174f,-117.188f, -89.8438f,38.2467f,-121.094f, -89.8438f,38.2878f,-117.188f, -93.75f,39.5884f,-121.094f, -93.75f,39.6151f,-117.188f, -97.6563f,39.7164f,-121.094f, -97.6563f,39.7422f,-117.188f, -101.563f,40.296f,-121.094f, -101.563f,40.9611f,-117.188f, -105.469f,40.7222f,-121.094f, -105.469f,40.8932f,-117.188f, -109.375f,40.1304f,-121.094f, -109.375f,40.6603f,-117.188f, -113.281f,39.4566f,-121.094f, -113.281f,40.2935f,-117.188f, -117.188f,39.003f,-121.094f, -117.188f,39.8681f,-117.188f, -121.094f,38.091f,-121.094f, -121.094f,39.0965f,-117.188f, -125.0f,37.216f,-121.094f, -125.0f,37.1333f,-117.188f, -128.906f,35.4631f,-121.094f, -128.906f,35.5222f,-117.188f, -132.813f,33.4698f,-121.094f, -132.813f,33.9068f,-117.188f, -136.719f,31.5516f,-121.094f, -136.719f,32.2618f,-117.188f, -140.625f,28.6676f,-121.094f, -140.625f,29.8657f,-117.188f, -144.531f,26.5656f,-121.094f, -144.531f,28.1704f,-117.188f, -148.438f,24.1962f,-121.094f, -148.438f,27.1495f,-117.188f, -152.344f,22.2193f,-121.094f, -152.344f,24.5217f,-117.188f, -156.25f,20.1818f,-121.094f, -156.25f,22.0419f,-117.188f, -160.156f,17.6116f,-121.094f, -160.156f,19.9238f,-117.188f, -164.063f,15.5398f,-121.094f, -164.063f,17.6875f,-117.188f, -167.969f,13.7972f,-121.094f, -167.969f,15.5636f,-117.188f, -171.875f,11.7291f,-121.094f, -171.875f,13.5497f,-117.188f, -175.781f,9.31738f,-121.094f, -175.781f,11.2761f,-117.188f, -179.688f,6.60425f,-121.094f, -179.688f,8.95864f,-117.188f, -183.594f,4.50127f,-121.094f, -183.594f,7.04623f,-117.188f, -187.5f,2.77579f,-121.094f, -187.5f,4.83635f,-117.188f, -191.406f,1.39292f,-121.094f, -191.406f,2.76046f,-117.188f, -195.313f,-1.41093f,-121.094f, -195.313f,0.190119f,-117.188f, -199.219f,-2.1383f,-121.094f, -199.219f,-0.558379f,-117.188f, -203.125f,-2.43203f,-121.094f, -203.125f,-1.03303f,-117.188f, -207.031f,-3.74398f,-121.094f, -207.031f,-2.17563f,-117.188f, -210.938f,-4.31531f,-121.094f, -210.938f,-1.91155f,-117.188f, -214.844f,-5.42965f,-121.094f, -214.844f,-3.00018f,-117.188f, -218.75f,-6.70056f,-121.094f, -218.75f,-4.26691f,-117.188f, -222.656f,-6.19564f,-121.094f, -222.656f,-5.15855f,-117.188f, -226.563f,-4.68254f,-121.094f, -226.563f,-3.46348f,-117.188f, -230.469f,-3.31858f,-121.094f, -230.469f,-2.16077f,-117.188f, -234.375f,-3.88428f,-121.094f, -234.375f,-1.47785f,-117.188f, -238.281f,-3.80321f,-121.094f, -238.281f,-1.78424f,-117.188f, -242.188f,-3.43571f,-121.094f, -242.188f,-1.00317f,-117.188f, -246.094f,-3.77556f,-121.094f, -246.094f,-1.97981f,-117.188f, -250.0f,-3.83169f,-121.094f, -250.0f,-2.29372f,-117.188f, -3.90625f,50.3021f,-125.0f, -7.8125f,50.0186f,-125.0f, -11.7188f,47.8026f,-125.0f, -15.625f,45.4122f,-125.0f, -19.5313f,42.7204f,-125.0f, -23.4375f,42.1093f,-125.0f, -27.3438f,41.0672f,-125.0f, -31.25f,40.3016f,-125.0f, -35.1563f,38.401f,-125.0f, -39.0625f,36.5811f,-125.0f, -42.9688f,35.0771f,-125.0f, -46.875f,32.9255f,-125.0f, -50.7813f,31.2736f,-125.0f, -54.6875f,33.4622f,-125.0f, -58.5938f,34.314f,-125.0f, -62.5f,34.4185f,-125.0f, -66.4063f,34.621f,-125.0f, -70.3125f,34.9532f,-125.0f, -74.2188f,35.7305f,-125.0f, -78.125f,37.4446f,-125.0f, -82.0313f,37.6824f,-125.0f, -85.9375f,37.9835f,-125.0f, -89.8438f,38.5713f,-125.0f, -93.75f,39.56f,-125.0f, -97.6563f,40.0645f,-125.0f, -101.563f,39.9237f,-125.0f, -105.469f,39.8912f,-125.0f, -109.375f,39.9678f,-125.0f, -113.281f,39.7665f,-125.0f, -117.188f,38.758f,-125.0f, -121.094f,37.6738f,-125.0f, -125.0f,36.834f,-125.0f, -128.906f,34.7637f,-125.0f, -132.813f,31.9691f,-125.0f, -136.719f,30.7311f,-125.0f, -140.625f,27.9768f,-125.0f, -144.531f,25.22f,-125.0f, -148.438f,22.2616f,-125.0f, -152.344f,20.6399f,-125.0f, -156.25f,18.9363f,-125.0f, -160.156f,16.8778f,-125.0f, -164.063f,14.7425f,-125.0f, -167.969f,12.4299f,-125.0f, -171.875f,10.1017f,-125.0f, -175.781f,7.82169f,-125.0f, -179.688f,5.46502f,-125.0f, -183.594f,2.71076f,-125.0f, -187.5f,1.07736f,-125.0f, -191.406f,-0.592638f,-125.0f, -195.313f,-2.99173f,-125.0f, -199.219f,-4.30517f,-125.0f, -203.125f,-4.79591f,-125.0f, -207.031f,-6.32671f,-125.0f, -210.938f,-6.6914f,-125.0f, -214.844f,-8.34188f,-125.0f, -218.75f,-8.94371f,-125.0f, -222.656f,-7.16417f,-125.0f, -226.563f,-5.53904f,-125.0f, -230.469f,-5.10207f,-125.0f, -234.375f,-5.77507f,-125.0f, -238.281f,-5.5948f,-125.0f, -242.188f,-5.81224f,-125.0f, -246.094f,-5.48291f,-125.0f, -250.0f,-5.3221f,-125.0f, -3.90625f,50.4716f,-128.906f, -7.8125f,50.3922f,-128.906f, -11.7188f,48.0997f,-128.906f, -15.625f,44.9895f,-128.906f, -19.5313f,43.3038f,-128.906f, -23.4375f,42.8795f,-128.906f, -27.3438f,42.0905f,-128.906f, -31.25f,40.0566f,-128.906f, -35.1563f,37.7024f,-128.906f, -39.0625f,35.7533f,-128.906f, -42.9688f,32.9949f,-128.906f, -46.875f,31.7476f,-128.906f, -50.7813f,30.9413f,-128.906f, -54.6875f,31.9364f,-128.906f, -58.5938f,33.2028f,-128.906f, -62.5f,34.0103f,-128.906f, -66.4063f,34.3126f,-128.906f, -70.3125f,34.6096f,-128.906f, -74.2188f,35.8861f,-128.906f, -78.125f,36.5754f,-128.906f, -82.0313f,36.9009f,-128.906f, -85.9375f,37.369f,-128.906f, -89.8438f,38.2734f,-128.906f, -93.75f,38.7518f,-128.906f, -97.6563f,39.7576f,-128.906f, -101.563f,39.3413f,-128.906f, -105.469f,40.4224f,-128.906f, -109.375f,40.506f,-128.906f, -113.281f,39.7509f,-128.906f, -117.188f,38.6208f,-128.906f, -121.094f,37.1513f,-128.906f, -125.0f,36.003f,-128.906f, -128.906f,34.1307f,-128.906f, -132.813f,31.5523f,-128.906f, -136.719f,29.2003f,-128.906f, -140.625f,26.3718f,-128.906f, -144.531f,24.0851f,-128.906f, -148.438f,21.0492f,-128.906f, -152.344f,18.9709f,-128.906f, -156.25f,16.5536f,-128.906f, -160.156f,14.5588f,-128.906f, -164.063f,12.8386f,-128.906f, -167.969f,11.3092f,-128.906f, -171.875f,9.19396f,-128.906f, -175.781f,6.84617f,-128.906f, -179.688f,3.80062f,-128.906f, -183.594f,0.734751f,-128.906f, -187.5f,0.121523f,-128.906f, -191.406f,-1.9203f,-128.906f, -195.313f,-5.35291f,-128.906f, -199.219f,-7.06575f,-128.906f, -203.125f,-8.27325f,-128.906f, -207.031f,-8.82541f,-128.906f, -210.938f,-9.36185f,-128.906f, -214.844f,-10.8597f,-128.906f, -218.75f,-10.695f,-128.906f, -222.656f,-8.91012f,-128.906f, -226.563f,-8.24825f,-128.906f, -230.469f,-7.79624f,-128.906f, -234.375f,-6.74578f,-128.906f, -238.281f,-7.41285f,-128.906f, -242.188f,-7.01421f,-128.906f, -246.094f,-6.91669f,-128.906f, -250.0f,-6.09876f,-128.906f, -3.90625f,49.1054f,-132.813f, -7.8125f,48.771f,-132.813f, -11.7188f,46.9765f,-132.813f, -15.625f,44.4736f,-132.813f, -19.5313f,43.2026f,-132.813f, -23.4375f,42.2898f,-132.813f, -27.3438f,41.7492f,-132.813f, -31.25f,39.5792f,-132.813f, -35.1563f,36.5653f,-132.813f, -39.0625f,33.5612f,-132.813f, -42.9688f,31.9604f,-132.813f, -46.875f,30.953f,-132.813f, -50.7813f,30.5912f,-132.813f, -54.6875f,31.76f,-132.813f, -58.5938f,33.0843f,-132.813f, -62.5f,33.4323f,-132.813f, -66.4063f,33.9264f,-132.813f, -70.3125f,33.9268f,-132.813f, -74.2188f,33.8122f,-132.813f, -78.125f,34.9456f,-132.813f, -82.0313f,35.6308f,-132.813f, -85.9375f,35.8317f,-132.813f, -89.8438f,36.8255f,-132.813f, -93.75f,37.5781f,-132.813f, -97.6563f,39.0469f,-132.813f, -101.563f,38.905f,-132.813f, -105.469f,39.3656f,-132.813f, -109.375f,39.9706f,-132.813f, -113.281f,38.8077f,-132.813f, -117.188f,37.8378f,-132.813f, -121.094f,36.8368f,-132.813f, -125.0f,35.8474f,-132.813f, -128.906f,33.8502f,-132.813f, -132.813f,31.6251f,-132.813f, -136.719f,28.2781f,-132.813f, -140.625f,24.9841f,-132.813f, -144.531f,22.2281f,-132.813f, -148.438f,19.2974f,-132.813f, -152.344f,17.1516f,-132.813f, -156.25f,14.7654f,-132.813f, -160.156f,13.1833f,-132.813f, -164.063f,11.0184f,-132.813f, -167.969f,9.1589f,-132.813f, -171.875f,6.82631f,-132.813f, -175.781f,4.30633f,-132.813f, -179.688f,2.04751f,-132.813f, -183.594f,-0.74554f,-132.813f, -187.5f,-1.24688f,-132.813f, -191.406f,-3.70884f,-132.813f, -195.313f,-7.20423f,-132.813f, -199.219f,-9.63057f,-132.813f, -203.125f,-10.6411f,-132.813f, -207.031f,-11.1561f,-132.813f, -210.938f,-11.9998f,-132.813f, -214.844f,-13.1369f,-132.813f, -218.75f,-12.4543f,-132.813f, -222.656f,-11.5031f,-132.813f, -226.563f,-11.4632f,-132.813f, -230.469f,-10.5609f,-132.813f, -234.375f,-9.96017f,-132.813f, -238.281f,-9.64047f,-132.813f, -242.188f,-8.79112f,-132.813f, -246.094f,-8.33514f,-132.813f, -250.0f,-6.32649f,-132.813f, -3.90625f,47.9f,-136.719f, -7.8125f,47.0423f,-136.719f, -11.7188f,46.1087f,-136.719f, -15.625f,42.8209f,-136.719f, -19.5313f,41.8846f,-136.719f, -23.4375f,41.4071f,-136.719f, -27.3438f,39.6798f,-136.719f, -31.25f,38.1881f,-136.719f, -35.1563f,35.3952f,-136.719f, -39.0625f,31.8297f,-136.719f, -42.9688f,31.014f,-136.719f, -46.875f,29.29f,-136.719f, -50.7813f,29.4455f,-136.719f, -54.6875f,30.368f,-136.719f, -58.5938f,31.6261f,-136.719f, -62.5f,31.8803f,-136.719f, -66.4063f,32.8102f,-136.719f, -70.3125f,33.4331f,-136.719f, -74.2188f,33.19f,-136.719f, -78.125f,33.74f,-136.719f, -82.0313f,35.1047f,-136.719f, -85.9375f,36.2436f,-136.719f, -89.8438f,36.4928f,-136.719f, -93.75f,36.192f,-136.719f, -97.6563f,37.547f,-136.719f, -101.563f,38.0632f,-136.719f, -105.469f,38.6551f,-136.719f, -109.375f,38.4484f,-136.719f, -113.281f,37.8421f,-136.719f, -117.188f,37.5588f,-136.719f, -121.094f,37.278f,-136.719f, -125.0f,35.3541f,-136.719f, -128.906f,33.0939f,-136.719f, -132.813f,30.522f,-136.719f, -136.719f,27.5957f,-136.719f, -140.625f,24.4595f,-136.719f, -144.531f,21.0335f,-136.719f, -148.438f,18.0163f,-136.719f, -152.344f,15.3659f,-136.719f, -156.25f,13.4036f,-136.719f, -160.156f,11.6819f,-136.719f, -164.063f,9.68686f,-136.719f, -167.969f,7.56782f,-136.719f, -171.875f,4.49435f,-136.719f, -175.781f,1.55284f,-136.719f, -179.688f,0.275057f,-136.719f, -183.594f,-2.20168f,-136.719f, -187.5f,-3.16842f,-136.719f, -191.406f,-5.74212f,-136.719f, -195.313f,-8.33918f,-136.719f, -199.219f,-11.9926f,-136.719f, -203.125f,-13.7382f,-136.719f, -207.031f,-14.2163f,-136.719f, -210.938f,-14.76f,-136.719f, -214.844f,-14.7917f,-136.719f, -218.75f,-15.4594f,-136.719f, -222.656f,-14.7722f,-136.719f, -226.563f,-14.7687f,-136.719f, -230.469f,-13.0502f,-136.719f, -234.375f,-12.7522f,-136.719f, -238.281f,-12.1277f,-136.719f, -242.188f,-11.9805f,-136.719f, -246.094f,-9.26664f,-136.719f, -250.0f,-6.42671f,-136.719f, -3.90625f,47.2681f,-140.625f, -7.8125f,46.3513f,-140.625f, -11.7188f,45.1181f,-140.625f, -15.625f,42.9593f,-140.625f, -19.5313f,40.04f,-140.625f, -23.4375f,38.1657f,-140.625f, -27.3438f,37.2537f,-140.625f, -31.25f,35.6767f,-140.625f, -35.1563f,33.3413f,-140.625f, -39.0625f,30.7556f,-140.625f, -42.9688f,29.0258f,-140.625f, -46.875f,27.8122f,-140.625f, -50.7813f,27.4512f,-140.625f, -54.6875f,28.1912f,-140.625f, -58.5938f,29.8142f,-140.625f, -62.5f,30.1394f,-140.625f, -66.4063f,30.7105f,-140.625f, -70.3125f,31.9295f,-140.625f, -74.2188f,32.6689f,-140.625f, -78.125f,32.9232f,-140.625f, -82.0313f,35.5221f,-140.625f, -85.9375f,36.1785f,-140.625f, -89.8438f,35.864f,-140.625f, -93.75f,35.2473f,-140.625f, -97.6563f,35.6334f,-140.625f, -101.563f,36.5759f,-140.625f, -105.469f,37.2506f,-140.625f, -109.375f,36.7249f,-140.625f, -113.281f,36.4287f,-140.625f, -117.188f,36.6819f,-140.625f, -121.094f,36.4294f,-140.625f, -125.0f,35.2358f,-140.625f, -128.906f,32.9869f,-140.625f, -132.813f,30.156f,-140.625f, -136.719f,27.0471f,-140.625f, -140.625f,23.8554f,-140.625f, -144.531f,20.3993f,-140.625f, -148.438f,16.6224f,-140.625f, -152.344f,13.058f,-140.625f, -156.25f,11.1345f,-140.625f, -160.156f,9.35133f,-140.625f, -164.063f,7.36194f,-140.625f, -167.969f,5.31819f,-140.625f, -171.875f,2.78652f,-140.625f, -175.781f,0.868982f,-140.625f, -179.688f,-1.31465f,-140.625f, -183.594f,-3.64199f,-140.625f, -187.5f,-5.38333f,-140.625f, -191.406f,-8.08251f,-140.625f, -195.313f,-10.9184f,-140.625f, -199.219f,-14.2737f,-140.625f, -203.125f,-16.1495f,-140.625f, -207.031f,-16.9134f,-140.625f, -210.938f,-16.9575f,-140.625f, -214.844f,-17.6023f,-140.625f, -218.75f,-17.6633f,-140.625f, -222.656f,-17.159f,-140.625f, -226.563f,-16.2062f,-140.625f, -230.469f,-15.7685f,-140.625f, -234.375f,-15.0547f,-140.625f, -238.281f,-14.7858f,-140.625f, -242.188f,-12.8534f,-140.625f, -246.094f,-9.20599f,-140.625f, -250.0f,-5.60644f,-140.625f, -3.90625f,45.2398f,-144.531f, -7.8125f,45.0428f,-144.531f, -11.7188f,44.1179f,-144.531f, -15.625f,42.444f,-144.531f, -19.5313f,39.732f,-144.531f, -23.4375f,37.0479f,-144.531f, -27.3438f,34.3624f,-144.531f, -31.25f,33.2513f,-144.531f, -35.1563f,31.1146f,-144.531f, -39.0625f,29.2726f,-144.531f, -42.9688f,27.3159f,-144.531f, -46.875f,27.1241f,-144.531f, -50.7813f,26.6524f,-144.531f, -54.6875f,26.3337f,-144.531f, -58.5938f,27.8201f,-144.531f, -62.5f,27.8456f,-144.531f, -66.4063f,27.8306f,-144.531f, -70.3125f,29.8911f,-144.531f, -74.2188f,31.0667f,-144.531f, -78.125f,32.5778f,-144.531f, -82.0313f,34.5337f,-144.531f, -85.9375f,35.1457f,-144.531f, -89.8438f,34.7649f,-144.531f, -93.75f,34.0929f,-144.531f, -97.6563f,34.2934f,-144.531f, -101.563f,34.8046f,-144.531f, -105.469f,36.2496f,-144.531f, -109.375f,35.8351f,-144.531f, -113.281f,35.8228f,-144.531f, -117.188f,35.7495f,-144.531f, -121.094f,34.832f,-144.531f, -125.0f,34.3351f,-144.531f, -128.906f,32.4744f,-144.531f, -132.813f,29.6967f,-144.531f, -136.719f,26.263f,-144.531f, -140.625f,23.3556f,-144.531f, -144.531f,19.3517f,-144.531f, -148.438f,14.458f,-144.531f, -152.344f,11.2423f,-144.531f, -156.25f,9.75514f,-144.531f, -160.156f,7.96146f,-144.531f, -164.063f,5.67024f,-144.531f, -167.969f,4.08006f,-144.531f, -171.875f,1.71102f,-144.531f, -175.781f,-0.915369f,-144.531f, -179.688f,-2.66343f,-144.531f, -183.594f,-5.5816f,-144.531f, -187.5f,-7.79353f,-144.531f, -191.406f,-10.1772f,-144.531f, -195.313f,-13.5463f,-144.531f, -199.219f,-16.0692f,-144.531f, -203.125f,-17.2505f,-144.531f, -207.031f,-18.7241f,-144.531f, -210.938f,-18.7295f,-144.531f, -214.844f,-19.3f,-144.531f, -218.75f,-20.3181f,-144.531f, -222.656f,-19.4871f,-144.531f, -226.563f,-18.5465f,-144.531f, -230.469f,-17.525f,-144.531f, -234.375f,-16.5076f,-144.531f, -238.281f,-15.0993f,-144.531f, -242.188f,-13.0716f,-144.531f, -246.094f,-9.99063f,-144.531f, -250.0f,-5.64288f,-144.531f, -3.90625f,43.4167f,-148.438f, -7.8125f,43.0193f,-148.438f, -11.7188f,42.6242f,-148.438f, -15.625f,40.8831f,-148.438f, -19.5313f,38.6824f,-148.438f, -23.4375f,36.0177f,-148.438f, -27.3438f,32.9654f,-148.438f, -31.25f,31.3995f,-148.438f, -35.1563f,29.5101f,-148.438f, -39.0625f,27.4588f,-148.438f, -42.9688f,25.129f,-148.438f, -46.875f,25.4533f,-148.438f, -50.7813f,25.7106f,-148.438f, -54.6875f,25.737f,-148.438f, -58.5938f,26.1608f,-148.438f, -62.5f,27.2373f,-148.438f, -66.4063f,27.3635f,-148.438f, -70.3125f,27.7787f,-148.438f, -74.2188f,29.0906f,-148.438f, -78.125f,31.3992f,-148.438f, -82.0313f,32.9373f,-148.438f, -85.9375f,33.743f,-148.438f, -89.8438f,34.4265f,-148.438f, -93.75f,33.525f,-148.438f, -97.6563f,33.8231f,-148.438f, -101.563f,34.6826f,-148.438f, -105.469f,35.0275f,-148.438f, -109.375f,34.4667f,-148.438f, -113.281f,34.7266f,-148.438f, -117.188f,34.0788f,-148.438f, -121.094f,33.2521f,-148.438f, -125.0f,32.1914f,-148.438f, -128.906f,30.7782f,-148.438f, -132.813f,28.8615f,-148.438f, -136.719f,25.3691f,-148.438f, -140.625f,21.5786f,-148.438f, -144.531f,17.2969f,-148.438f, -148.438f,13.1925f,-148.438f, -152.344f,10.0632f,-148.438f, -156.25f,8.32421f,-148.438f, -160.156f,6.57856f,-148.438f, -164.063f,4.18522f,-148.438f, -167.969f,2.25091f,-148.438f, -171.875f,0.445952f,-148.438f, -175.781f,-1.73703f,-148.438f, -179.688f,-3.44886f,-148.438f, -183.594f,-6.77108f,-148.438f, -187.5f,-9.26031f,-148.438f, -191.406f,-12.38f,-148.438f, -195.313f,-14.6453f,-148.438f, -199.219f,-15.8435f,-148.438f, -203.125f,-17.3242f,-148.438f, -207.031f,-19.3932f,-148.438f, -210.938f,-19.7735f,-148.438f, -214.844f,-20.1293f,-148.438f, -218.75f,-20.5777f,-148.438f, -222.656f,-20.7145f,-148.438f, -226.563f,-20.64f,-148.438f, -230.469f,-19.6971f,-148.438f, -234.375f,-17.5016f,-148.438f, -238.281f,-14.644f,-148.438f, -242.188f,-12.3094f,-148.438f, -246.094f,-10.1634f,-148.438f, -250.0f,-6.79503f,-148.438f, -3.90625f,42.7212f,-152.344f, -7.8125f,41.7463f,-152.344f, -11.7188f,40.5249f,-152.344f, -15.625f,39.5225f,-152.344f, -19.5313f,36.6967f,-152.344f, -23.4375f,34.0075f,-152.344f, -27.3438f,31.2054f,-152.344f, -31.25f,28.8502f,-152.344f, -35.1563f,27.2625f,-152.344f, -39.0625f,24.9496f,-152.344f, -42.9688f,23.5897f,-152.344f, -46.875f,23.4709f,-152.344f, -50.7813f,24.179f,-152.344f, -54.6875f,25.021f,-152.344f, -58.5938f,25.6664f,-152.344f, -62.5f,25.7063f,-152.344f, -66.4063f,26.6928f,-152.344f, -70.3125f,26.8261f,-152.344f, -74.2188f,28.2549f,-152.344f, -78.125f,30.3373f,-152.344f, -82.0313f,31.6194f,-152.344f, -85.9375f,32.9189f,-152.344f, -89.8438f,32.7162f,-152.344f, -93.75f,33.0001f,-152.344f, -97.6563f,34.4407f,-152.344f, -101.563f,35.0813f,-152.344f, -105.469f,34.4143f,-152.344f, -109.375f,33.5195f,-152.344f, -113.281f,32.927f,-152.344f, -117.188f,32.6509f,-152.344f, -121.094f,32.6775f,-152.344f, -125.0f,30.887f,-152.344f, -128.906f,28.4296f,-152.344f, -132.813f,26.5539f,-152.344f, -136.719f,24.0803f,-152.344f, -140.625f,20.196f,-152.344f, -144.531f,16.4293f,-152.344f, -148.438f,12.8243f,-152.344f, -152.344f,9.76479f,-152.344f, -156.25f,7.14206f,-152.344f, -160.156f,4.74684f,-152.344f, -164.063f,2.30008f,-152.344f, -167.969f,1.49801f,-152.344f, -171.875f,-0.62719f,-152.344f, -175.781f,-1.99004f,-152.344f, -179.688f,-4.80775f,-152.344f, -183.594f,-8.00986f,-152.344f, -187.5f,-11.4771f,-152.344f, -191.406f,-12.8743f,-152.344f, -195.313f,-13.8733f,-152.344f, -199.219f,-15.0749f,-152.344f, -203.125f,-16.9234f,-152.344f, -207.031f,-18.3258f,-152.344f, -210.938f,-19.6583f,-152.344f, -214.844f,-20.9396f,-152.344f, -218.75f,-21.8071f,-152.344f, -222.656f,-21.4908f,-152.344f, -226.563f,-21.4698f,-152.344f, -230.469f,-19.3773f,-152.344f, -234.375f,-17.0448f,-152.344f, -238.281f,-14.0123f,-152.344f, -242.188f,-11.2372f,-152.344f, -246.094f,-9.11286f,-152.344f, -250.0f,-6.76792f,-152.344f, -3.90625f,41.7368f,-156.25f, -7.8125f,40.8494f,-156.25f, -11.7188f,39.2286f,-156.25f, -15.625f,37.4784f,-156.25f, -19.5313f,36.0345f,-156.25f, -23.4375f,33.9716f,-156.25f, -27.3438f,31.3041f,-156.25f, -31.25f,28.9777f,-156.25f, -35.1563f,26.0934f,-156.25f, -39.0625f,23.7421f,-156.25f, -42.9688f,22.4401f,-156.25f, -46.875f,22.1238f,-156.25f, -50.7813f,22.6669f,-156.25f, -54.6875f,23.7702f,-156.25f, -58.5938f,24.63f,-156.25f, -62.5f,25.2145f,-156.25f, -66.4063f,26.6101f,-156.25f, -70.3125f,27.3664f,-156.25f, -74.2188f,28.121f,-156.25f, -78.125f,29.5305f,-156.25f, -82.0313f,30.4367f,-156.25f, -85.9375f,30.627f,-156.25f, -89.8438f,30.4079f,-156.25f, -93.75f,32.2186f,-156.25f, -97.6563f,33.2916f,-156.25f, -101.563f,33.8066f,-156.25f, -105.469f,32.5269f,-156.25f, -109.375f,32.0751f,-156.25f, -113.281f,31.0298f,-156.25f, -117.188f,30.9869f,-156.25f, -121.094f,30.9826f,-156.25f, -125.0f,29.0676f,-156.25f, -128.906f,26.8988f,-156.25f, -132.813f,24.0771f,-156.25f, -136.719f,21.8087f,-156.25f, -140.625f,18.8179f,-156.25f, -144.531f,14.2483f,-156.25f, -148.438f,10.9236f,-156.25f, -152.344f,9.05948f,-156.25f, -156.25f,6.86087f,-156.25f, -160.156f,3.50699f,-156.25f, -164.063f,1.14903f,-156.25f, -167.969f,-0.639847f,-156.25f, -171.875f,-2.73828f,-156.25f, -175.781f,-4.02372f,-156.25f, -179.688f,-6.15141f,-156.25f, -183.594f,-8.81231f,-156.25f, -187.5f,-10.3417f,-156.25f, -191.406f,-11.1895f,-156.25f, -195.313f,-13.1464f,-156.25f, -199.219f,-14.5401f,-156.25f, -203.125f,-15.9427f,-156.25f, -207.031f,-17.492f,-156.25f, -210.938f,-19.0599f,-156.25f, -214.844f,-21.1101f,-156.25f, -218.75f,-21.3872f,-156.25f, -222.656f,-21.1481f,-156.25f, -226.563f,-20.2836f,-156.25f, -230.469f,-18.1679f,-156.25f, -234.375f,-15.72f,-156.25f, -238.281f,-13.4579f,-156.25f, -242.188f,-10.1453f,-156.25f, -246.094f,-8.09411f,-156.25f, -250.0f,-5.46467f,-156.25f, -3.90625f,40.4755f,-160.156f, -7.8125f,39.299f,-160.156f, -11.7188f,37.3972f,-160.156f, -15.625f,36.1894f,-160.156f, -19.5313f,34.3138f,-160.156f, -23.4375f,32.893f,-160.156f, -27.3438f,30.4515f,-160.156f, -31.25f,28.5808f,-160.156f, -35.1563f,25.8839f,-160.156f, -39.0625f,23.8505f,-160.156f, -42.9688f,22.3057f,-160.156f, -46.875f,21.4418f,-160.156f, -50.7813f,21.9709f,-160.156f, -54.6875f,23.0083f,-160.156f, -58.5938f,24.899f,-160.156f, -62.5f,25.213f,-160.156f, -66.4063f,26.1428f,-160.156f, -70.3125f,27.2675f,-160.156f, -74.2188f,28.0843f,-160.156f, -78.125f,28.9474f,-160.156f, -82.0313f,29.5078f,-160.156f, -85.9375f,29.7468f,-160.156f, -89.8438f,30.8621f,-160.156f, -93.75f,31.5001f,-160.156f, -97.6563f,32.1184f,-160.156f, -101.563f,31.2692f,-160.156f, -105.469f,30.4985f,-160.156f, -109.375f,29.4368f,-160.156f, -113.281f,30.6889f,-160.156f, -117.188f,29.6238f,-160.156f, -121.094f,28.6487f,-160.156f, -125.0f,26.3174f,-160.156f, -128.906f,24.6125f,-160.156f, -132.813f,22.1993f,-160.156f, -136.719f,19.3934f,-160.156f, -140.625f,16.5457f,-160.156f, -144.531f,13.4024f,-160.156f, -148.438f,9.69887f,-160.156f, -152.344f,8.13305f,-160.156f, -156.25f,6.48921f,-160.156f, -160.156f,2.56153f,-160.156f, -164.063f,0.0733139f,-160.156f, -167.969f,-1.11414f,-160.156f, -171.875f,-3.04708f,-160.156f, -175.781f,-6.18654f,-160.156f, -179.688f,-7.4188f,-160.156f, -183.594f,-9.1718f,-160.156f, -187.5f,-9.78027f,-160.156f, -191.406f,-10.5496f,-160.156f, -195.313f,-12.7259f,-160.156f, -199.219f,-13.9068f,-160.156f, -203.125f,-15.4772f,-160.156f, -207.031f,-17.6287f,-160.156f, -210.938f,-19.2502f,-160.156f, -214.844f,-19.5824f,-160.156f, -218.75f,-19.3114f,-160.156f, -222.656f,-19.5266f,-160.156f, -226.563f,-17.8446f,-160.156f, -230.469f,-16.3027f,-160.156f, -234.375f,-14.5015f,-160.156f, -238.281f,-11.9891f,-160.156f, -242.188f,-9.40017f,-160.156f, -246.094f,-6.63794f,-160.156f, -250.0f,-3.71573f,-160.156f, -3.90625f,38.8633f,-164.063f, -7.8125f,37.4382f,-164.063f, -11.7188f,35.7214f,-164.063f, -15.625f,34.0614f,-164.063f, -19.5313f,33.0957f,-164.063f, -23.4375f,32.0369f,-164.063f, -27.3438f,29.7096f,-164.063f, -31.25f,27.3216f,-164.063f, -35.1563f,25.2446f,-164.063f, -39.0625f,23.6071f,-164.063f, -42.9688f,22.2443f,-164.063f, -46.875f,21.2807f,-164.063f, -50.7813f,21.0358f,-164.063f, -54.6875f,22.8177f,-164.063f, -58.5938f,24.4434f,-164.063f, -62.5f,25.1375f,-164.063f, -66.4063f,25.3266f,-164.063f, -70.3125f,26.6102f,-164.063f, -74.2188f,27.6569f,-164.063f, -78.125f,27.8248f,-164.063f, -82.0313f,28.0421f,-164.063f, -85.9375f,29.1719f,-164.063f, -89.8438f,29.9529f,-164.063f, -93.75f,30.947f,-164.063f, -97.6563f,30.6189f,-164.063f, -101.563f,29.7913f,-164.063f, -105.469f,27.6858f,-164.063f, -109.375f,27.3234f,-164.063f, -113.281f,27.8148f,-164.063f, -117.188f,27.3571f,-164.063f, -121.094f,26.1572f,-164.063f, -125.0f,23.8557f,-164.063f, -128.906f,21.6383f,-164.063f, -132.813f,19.0681f,-164.063f, -136.719f,16.7352f,-164.063f, -140.625f,14.4004f,-164.063f, -144.531f,11.082f,-164.063f, -148.438f,8.38754f,-164.063f, -152.344f,7.0054f,-164.063f, -156.25f,4.95122f,-164.063f, -160.156f,2.47298f,-164.063f, -164.063f,0.777691f,-164.063f, -167.969f,-1.44055f,-164.063f, -171.875f,-3.57218f,-164.063f, -175.781f,-6.3396f,-164.063f, -179.688f,-7.49937f,-164.063f, -183.594f,-9.17485f,-164.063f, -187.5f,-9.92705f,-164.063f, -191.406f,-11.0737f,-164.063f, -195.313f,-12.8264f,-164.063f, -199.219f,-14.9306f,-164.063f, -203.125f,-15.9553f,-164.063f, -207.031f,-17.0898f,-164.063f, -210.938f,-18.5283f,-164.063f, -214.844f,-18.545f,-164.063f, -218.75f,-18.553f,-164.063f, -222.656f,-17.5725f,-164.063f, -226.563f,-15.6444f,-164.063f, -230.469f,-14.565f,-164.063f, -234.375f,-12.5578f,-164.063f, -238.281f,-10.6498f,-164.063f, -242.188f,-8.28284f,-164.063f, -246.094f,-5.87682f,-164.063f, -250.0f,-2.5339f,-164.063f, -3.90625f,37.2199f,-167.969f, -7.8125f,36.6782f,-167.969f, -11.7188f,36.2393f,-167.969f, -15.625f,33.4745f,-167.969f, -19.5313f,32.0928f,-167.969f, -23.4375f,30.5662f,-167.969f, -27.3438f,28.5968f,-167.969f, -31.25f,26.4298f,-167.969f, -35.1563f,23.9469f,-167.969f, -39.0625f,22.5415f,-167.969f, -42.9688f,21.8267f,-167.969f, -46.875f,21.2097f,-167.969f, -50.7813f,21.0841f,-167.969f, -54.6875f,21.7877f,-167.969f, -58.5938f,22.9351f,-167.969f, -62.5f,24.0641f,-167.969f, -66.4063f,24.42f,-167.969f, -70.3125f,24.8355f,-167.969f, -74.2188f,25.2701f,-167.969f, -78.125f,26.0252f,-167.969f, -82.0313f,26.8612f,-167.969f, -85.9375f,27.4256f,-167.969f, -89.8438f,28.994f,-167.969f, -93.75f,29.1766f,-167.969f, -97.6563f,27.8964f,-167.969f, -101.563f,26.6384f,-167.969f, -105.469f,24.9844f,-167.969f, -109.375f,25.0669f,-167.969f, -113.281f,24.572f,-167.969f, -117.188f,23.7817f,-167.969f, -121.094f,22.2089f,-167.969f, -125.0f,19.7633f,-167.969f, -128.906f,17.7618f,-167.969f, -132.813f,15.7339f,-167.969f, -136.719f,13.4975f,-167.969f, -140.625f,11.7364f,-167.969f, -144.531f,9.85351f,-167.969f, -148.438f,8.05282f,-167.969f, -152.344f,6.97463f,-167.969f, -156.25f,5.11511f,-167.969f, -160.156f,3.12954f,-167.969f, -164.063f,1.56555f,-167.969f, -167.969f,-1.77415f,-167.969f, -171.875f,-4.16322f,-167.969f, -175.781f,-5.85214f,-167.969f, -179.688f,-7.97892f,-167.969f, -183.594f,-9.87953f,-167.969f, -187.5f,-10.2762f,-167.969f, -191.406f,-11.5319f,-167.969f, -195.313f,-13.3612f,-167.969f, -199.219f,-15.3709f,-167.969f, -203.125f,-16.5674f,-167.969f, -207.031f,-17.6903f,-167.969f, -210.938f,-17.6736f,-167.969f, -214.844f,-16.8207f,-167.969f, -218.75f,-17.0254f,-167.969f, -222.656f,-16.3676f,-167.969f, -226.563f,-14.2816f,-167.969f, -230.469f,-13.3488f,-167.969f, -234.375f,-12.0136f,-167.969f, -238.281f,-9.90116f,-167.969f, -242.188f,-7.92295f,-167.969f, -246.094f,-5.41594f,-167.969f, -250.0f,-1.87299f,-167.969f, -3.90625f,35.3898f,-171.875f, -7.8125f,35.2527f,-171.875f, -11.7188f,34.3178f,-171.875f, -15.625f,33.0736f,-171.875f, -19.5313f,31.4013f,-171.875f, -23.4375f,28.9174f,-171.875f, -27.3438f,26.607f,-171.875f, -31.25f,24.7766f,-171.875f, -35.1563f,23.21f,-171.875f, -39.0625f,21.903f,-171.875f, -42.9688f,20.775f,-171.875f, -46.875f,20.114f,-171.875f, -50.7813f,19.6974f,-171.875f, -54.6875f,20.6726f,-171.875f, -58.5938f,22.241f,-171.875f, -62.5f,22.075f,-171.875f, -66.4063f,22.6771f,-171.875f, -70.3125f,22.4456f,-171.875f, -74.2188f,22.8643f,-171.875f, -78.125f,24.7268f,-171.875f, -82.0313f,25.7019f,-171.875f, -85.9375f,26.1196f,-171.875f, -89.8438f,25.6156f,-171.875f, -93.75f,24.7881f,-171.875f, -97.6563f,24.0074f,-171.875f, -101.563f,23.4739f,-171.875f, -105.469f,23.362f,-171.875f, -109.375f,22.2604f,-171.875f, -113.281f,21.2772f,-171.875f, -117.188f,19.7815f,-171.875f, -121.094f,17.9686f,-171.875f, -125.0f,16.3211f,-171.875f, -128.906f,14.2631f,-171.875f, -132.813f,12.4914f,-171.875f, -136.719f,10.3941f,-171.875f, -140.625f,8.91613f,-171.875f, -144.531f,9.17409f,-171.875f, -148.438f,7.34154f,-171.875f, -152.344f,6.13056f,-171.875f, -156.25f,4.58272f,-171.875f, -160.156f,2.77083f,-171.875f, -164.063f,1.11181f,-171.875f, -167.969f,-2.00034f,-171.875f, -171.875f,-3.64525f,-171.875f, -175.781f,-5.12602f,-171.875f, -179.688f,-8.3325f,-171.875f, -183.594f,-10.0807f,-171.875f, -187.5f,-10.8974f,-171.875f, -191.406f,-11.9623f,-171.875f, -195.313f,-14.5041f,-171.875f, -199.219f,-15.8629f,-171.875f, -203.125f,-17.2342f,-171.875f, -207.031f,-18.2786f,-171.875f, -210.938f,-16.9405f,-171.875f, -214.844f,-16.1592f,-171.875f, -218.75f,-15.9928f,-171.875f, -222.656f,-14.9179f,-171.875f, -226.563f,-13.6308f,-171.875f, -230.469f,-12.822f,-171.875f, -234.375f,-11.0168f,-171.875f, -238.281f,-8.54191f,-171.875f, -242.188f,-6.16464f,-171.875f, -246.094f,-4.35579f,-171.875f, -250.0f,-1.83408f,-171.875f, -3.90625f,34.823f,-175.781f, -7.8125f,33.9621f,-175.781f, -11.7188f,33.7226f,-175.781f, -15.625f,31.9821f,-175.781f, -19.5313f,29.6933f,-175.781f, -23.4375f,27.247f,-175.781f, -27.3438f,25.1394f,-175.781f, -31.25f,23.3125f,-175.781f, -35.1563f,21.288f,-175.781f, -39.0625f,21.2432f,-175.781f, -42.9688f,19.7041f,-175.781f, -46.875f,19.3043f,-175.781f, -50.7813f,18.5669f,-175.781f, -54.6875f,19.5408f,-175.781f, -58.5938f,20.3028f,-175.781f, -62.5f,20.573f,-175.781f, -66.4063f,20.7874f,-175.781f, -70.3125f,21.4507f,-175.781f, -74.2188f,22.9166f,-175.781f, -78.125f,23.6886f,-175.781f, -82.0313f,24.4139f,-175.781f, -85.9375f,25.1097f,-175.781f, -89.8438f,24.1395f,-175.781f, -93.75f,23.5282f,-175.781f, -97.6563f,22.7881f,-175.781f, -101.563f,21.2087f,-175.781f, -105.469f,20.6461f,-175.781f, -109.375f,19.7212f,-175.781f, -113.281f,17.9239f,-175.781f, -117.188f,16.9142f,-175.781f, -121.094f,16.1581f,-175.781f, -125.0f,15.1171f,-175.781f, -128.906f,13.1305f,-175.781f, -132.813f,10.3035f,-175.781f, -136.719f,7.95438f,-175.781f, -140.625f,7.49768f,-175.781f, -144.531f,7.76486f,-175.781f, -148.438f,6.84318f,-175.781f, -152.344f,6.0204f,-175.781f, -156.25f,4.83875f,-175.781f, -160.156f,2.59906f,-175.781f, -164.063f,1.35973f,-175.781f, -167.969f,-1.40345f,-175.781f, -171.875f,-3.6985f,-175.781f, -175.781f,-5.60686f,-175.781f, -179.688f,-8.15914f,-175.781f, -183.594f,-9.0389f,-175.781f, -187.5f,-11.2771f,-175.781f, -191.406f,-13.1363f,-175.781f, -195.313f,-14.845f,-175.781f, -199.219f,-15.885f,-175.781f, -203.125f,-17.6421f,-175.781f, -207.031f,-18.1972f,-175.781f, -210.938f,-16.4052f,-175.781f, -214.844f,-16.4522f,-175.781f, -218.75f,-15.8261f,-175.781f, -222.656f,-13.6816f,-175.781f, -226.563f,-12.8394f,-175.781f, -230.469f,-11.638f,-175.781f, -234.375f,-8.87545f,-175.781f, -238.281f,-6.82071f,-175.781f, -242.188f,-3.82988f,-175.781f, -246.094f,-2.34543f,-175.781f, -250.0f,-0.72787f,-175.781f, -3.90625f,32.9461f,-179.688f, -7.8125f,32.0951f,-179.688f, -11.7188f,31.1161f,-179.688f, -15.625f,29.4f,-179.688f, -19.5313f,27.5196f,-179.688f, -23.4375f,26.3351f,-179.688f, -27.3438f,24.0706f,-179.688f, -31.25f,21.9677f,-179.688f, -35.1563f,20.1582f,-179.688f, -39.0625f,19.3604f,-179.688f, -42.9688f,18.5912f,-179.688f, -46.875f,18.0845f,-179.688f, -50.7813f,18.0311f,-179.688f, -54.6875f,17.5412f,-179.688f, -58.5938f,17.724f,-179.688f, -62.5f,18.1752f,-179.688f, -66.4063f,18.8435f,-179.688f, -70.3125f,20.8887f,-179.688f, -74.2188f,21.9179f,-179.688f, -78.125f,22.3044f,-179.688f, -82.0313f,22.1491f,-179.688f, -85.9375f,23.261f,-179.688f, -89.8438f,22.4285f,-179.688f, -93.75f,21.5354f,-179.688f, -97.6563f,19.6399f,-179.688f, -101.563f,18.1312f,-179.688f, -105.469f,17.0655f,-179.688f, -109.375f,16.1471f,-179.688f, -113.281f,15.8256f,-179.688f, -117.188f,14.9609f,-179.688f, -121.094f,15.4508f,-179.688f, -125.0f,14.9122f,-179.688f, -128.906f,12.3324f,-179.688f, -132.813f,9.95184f,-179.688f, -136.719f,7.31755f,-179.688f, -140.625f,6.91109f,-179.688f, -144.531f,7.29489f,-179.688f, -148.438f,6.73968f,-179.688f, -152.344f,6.0555f,-179.688f, -156.25f,5.42266f,-179.688f, -160.156f,3.84651f,-179.688f, -164.063f,2.44552f,-179.688f, -167.969f,-0.187962f,-179.688f, -171.875f,-3.00626f,-179.688f, -175.781f,-5.38527f,-179.688f, -179.688f,-6.48806f,-179.688f, -183.594f,-9.24275f,-179.688f, -187.5f,-11.5122f,-179.688f, -191.406f,-12.6735f,-179.688f, -195.313f,-14.1843f,-179.688f, -199.219f,-15.4787f,-179.688f, -203.125f,-16.6061f,-179.688f, -207.031f,-17.1175f,-179.688f, -210.938f,-16.022f,-179.688f, -214.844f,-15.9349f,-179.688f, -218.75f,-14.6169f,-179.688f, -222.656f,-13.0146f,-179.688f, -226.563f,-12.2f,-179.688f, -230.469f,-9.81169f,-179.688f, -234.375f,-6.72224f,-179.688f, -238.281f,-4.11664f,-179.688f, -242.188f,-2.18066f,-179.688f, -246.094f,-0.510192f,-179.688f, -250.0f,1.48603f,-179.688f, -3.90625f,30.0027f,-183.594f, -7.8125f,29.6114f,-183.594f, -11.7188f,28.342f,-183.594f, -15.625f,26.9383f,-183.594f, -19.5313f,26.0219f,-183.594f, -23.4375f,25.017f,-183.594f, -27.3438f,22.7851f,-183.594f, -31.25f,20.6488f,-183.594f, -35.1563f,18.7107f,-183.594f, -39.0625f,17.0893f,-183.594f, -42.9688f,17.4316f,-183.594f, -46.875f,17.3211f,-183.594f, -50.7813f,16.5318f,-183.594f, -54.6875f,16.2012f,-183.594f, -58.5938f,17.0855f,-183.594f, -62.5f,17.2472f,-183.594f, -66.4063f,18.0123f,-183.594f, -70.3125f,18.684f,-183.594f, -74.2188f,19.625f,-183.594f, -78.125f,19.9442f,-183.594f, -82.0313f,19.9236f,-183.594f, -85.9375f,19.2286f,-183.594f, -89.8438f,19.5358f,-183.594f, -93.75f,18.429f,-183.594f, -97.6563f,16.1318f,-183.594f, -101.563f,14.371f,-183.594f, -105.469f,13.894f,-183.594f, -109.375f,13.5457f,-183.594f, -113.281f,13.7348f,-183.594f, -117.188f,14.0078f,-183.594f, -121.094f,14.2652f,-183.594f, -125.0f,13.5964f,-183.594f, -128.906f,11.3529f,-183.594f, -132.813f,8.43645f,-183.594f, -136.719f,6.95213f,-183.594f, -140.625f,7.16061f,-183.594f, -144.531f,6.71961f,-183.594f, -148.438f,5.35597f,-183.594f, -152.344f,5.22708f,-183.594f, -156.25f,5.07045f,-183.594f, -160.156f,3.44698f,-183.594f, -164.063f,2.33212f,-183.594f, -167.969f,0.462143f,-183.594f, -171.875f,-2.31458f,-183.594f, -175.781f,-4.89712f,-183.594f, -179.688f,-6.66797f,-183.594f, -183.594f,-9.25909f,-183.594f, -187.5f,-9.93472f,-183.594f, -191.406f,-12.0357f,-183.594f, -195.313f,-13.4286f,-183.594f, -199.219f,-14.4671f,-183.594f, -203.125f,-15.0102f,-183.594f, -207.031f,-14.8104f,-183.594f, -210.938f,-13.4733f,-183.594f, -214.844f,-14.0715f,-183.594f, -218.75f,-14.2416f,-183.594f, -222.656f,-12.2774f,-183.594f, -226.563f,-11.1048f,-183.594f, -230.469f,-8.72548f,-183.594f, -234.375f,-5.50563f,-183.594f, -238.281f,-2.81853f,-183.594f, -242.188f,-0.555239f,-183.594f, -246.094f,1.07177f,-183.594f, -250.0f,3.1022f,-183.594f, -3.90625f,27.6405f,-187.5f, -7.8125f,27.1266f,-187.5f, -11.7188f,26.0941f,-187.5f, -15.625f,25.1443f,-187.5f, -19.5313f,24.6236f,-187.5f, -23.4375f,23.7274f,-187.5f, -27.3438f,22.5792f,-187.5f, -31.25f,19.7482f,-187.5f, -35.1563f,17.6829f,-187.5f, -39.0625f,16.5577f,-187.5f, -42.9688f,15.8636f,-187.5f, -46.875f,16.0968f,-187.5f, -50.7813f,15.5614f,-187.5f, -54.6875f,15.4655f,-187.5f, -58.5938f,16.304f,-187.5f, -62.5f,16.7706f,-187.5f, -66.4063f,16.3947f,-187.5f, -70.3125f,16.6761f,-187.5f, -74.2188f,16.7627f,-187.5f, -78.125f,17.2579f,-187.5f, -82.0313f,16.7208f,-187.5f, -85.9375f,16.5278f,-187.5f, -89.8438f,16.2251f,-187.5f, -93.75f,15.0741f,-187.5f, -97.6563f,14.2628f,-187.5f, -101.563f,12.432f,-187.5f, -105.469f,10.8877f,-187.5f, -109.375f,11.903f,-187.5f, -113.281f,12.5606f,-187.5f, -117.188f,13.2652f,-187.5f, -121.094f,13.6914f,-187.5f, -125.0f,12.7849f,-187.5f, -128.906f,10.4802f,-187.5f, -132.813f,8.75276f,-187.5f, -136.719f,6.90392f,-187.5f, -140.625f,6.91636f,-187.5f, -144.531f,6.78271f,-187.5f, -148.438f,5.25436f,-187.5f, -152.344f,4.14458f,-187.5f, -156.25f,3.58445f,-187.5f, -160.156f,3.67538f,-187.5f, -164.063f,1.88171f,-187.5f, -167.969f,1.16358f,-187.5f, -171.875f,-0.909335f,-187.5f, -175.781f,-4.00056f,-187.5f, -179.688f,-6.532f,-187.5f, -183.594f,-8.29174f,-187.5f, -187.5f,-9.0196f,-187.5f, -191.406f,-10.1189f,-187.5f, -195.313f,-11.1349f,-187.5f, -199.219f,-12.4853f,-187.5f, -203.125f,-12.7324f,-187.5f, -207.031f,-12.949f,-187.5f, -210.938f,-11.8708f,-187.5f, -214.844f,-12.2515f,-187.5f, -218.75f,-12.8455f,-187.5f, -222.656f,-10.7923f,-187.5f, -226.563f,-8.82819f,-187.5f, -230.469f,-7.36721f,-187.5f, -234.375f,-5.23714f,-187.5f, -238.281f,-2.63334f,-187.5f, -242.188f,0.485313f,-187.5f, -246.094f,2.78278f,-187.5f, -250.0f,3.96313f,-187.5f, -3.90625f,25.3652f,-191.406f, -7.8125f,24.7195f,-191.406f, -11.7188f,25.004f,-191.406f, -15.625f,24.1773f,-191.406f, -19.5313f,22.7395f,-191.406f, -23.4375f,21.4739f,-191.406f, -27.3438f,21.0405f,-191.406f, -31.25f,18.3321f,-191.406f, -35.1563f,16.9491f,-191.406f, -39.0625f,15.1898f,-191.406f, -42.9688f,14.5842f,-191.406f, -46.875f,14.234f,-191.406f, -50.7813f,14.0689f,-191.406f, -54.6875f,15.4103f,-191.406f, -58.5938f,15.0749f,-191.406f, -62.5f,14.6893f,-191.406f, -66.4063f,14.8987f,-191.406f, -70.3125f,14.4416f,-191.406f, -74.2188f,14.3436f,-191.406f, -78.125f,13.5844f,-191.406f, -82.0313f,13.3989f,-191.406f, -85.9375f,14.3892f,-191.406f, -89.8438f,13.3595f,-191.406f, -93.75f,13.3004f,-191.406f, -97.6563f,11.8557f,-191.406f, -101.563f,9.50387f,-191.406f, -105.469f,9.09049f,-191.406f, -109.375f,10.2607f,-191.406f, -113.281f,11.3275f,-191.406f, -117.188f,11.8898f,-191.406f, -121.094f,11.9585f,-191.406f, -125.0f,11.0034f,-191.406f, -128.906f,10.0704f,-191.406f, -132.813f,8.84472f,-191.406f, -136.719f,7.56972f,-191.406f, -140.625f,6.66467f,-191.406f, -144.531f,5.57509f,-191.406f, -148.438f,4.43943f,-191.406f, -152.344f,3.51469f,-191.406f, -156.25f,2.91572f,-191.406f, -160.156f,3.43161f,-191.406f, -164.063f,1.97664f,-191.406f, -167.969f,1.37279f,-191.406f, -171.875f,-0.545961f,-191.406f, -175.781f,-3.78517f,-191.406f, -179.688f,-6.09483f,-191.406f, -183.594f,-6.45627f,-191.406f, -187.5f,-7.27376f,-191.406f, -191.406f,-8.99215f,-191.406f, -195.313f,-9.89915f,-191.406f, -199.219f,-10.9608f,-191.406f, -203.125f,-10.8387f,-191.406f, -207.031f,-10.5261f,-191.406f, -210.938f,-10.1365f,-191.406f, -214.844f,-10.631f,-191.406f, -218.75f,-10.8413f,-191.406f, -222.656f,-9.03823f,-191.406f, -226.563f,-7.39571f,-191.406f, -230.469f,-4.8409f,-191.406f, -234.375f,-3.47756f,-191.406f, -238.281f,-1.63291f,-191.406f, -242.188f,1.44814f,-191.406f, -246.094f,2.93141f,-191.406f, -250.0f,4.03991f,-191.406f, -3.90625f,23.0993f,-195.313f, -7.8125f,23.2309f,-195.313f, -11.7188f,23.4293f,-195.313f, -15.625f,22.4425f,-195.313f, -19.5313f,21.4905f,-195.313f, -23.4375f,19.6567f,-195.313f, -27.3438f,18.1324f,-195.313f, -31.25f,17.3872f,-195.313f, -35.1563f,16.265f,-195.313f, -39.0625f,13.8338f,-195.313f, -42.9688f,12.7629f,-195.313f, -46.875f,13.1006f,-195.313f, -50.7813f,13.3481f,-195.313f, -54.6875f,13.8039f,-195.313f, -58.5938f,13.0621f,-195.313f, -62.5f,12.4363f,-195.313f, -66.4063f,12.748f,-195.313f, -70.3125f,12.2979f,-195.313f, -74.2188f,11.3997f,-195.313f, -78.125f,12.1637f,-195.313f, -82.0313f,12.2143f,-195.313f, -85.9375f,12.0963f,-195.313f, -89.8438f,11.3468f,-195.313f, -93.75f,11.1939f,-195.313f, -97.6563f,9.31577f,-195.313f, -101.563f,9.0203f,-195.313f, -105.469f,8.39154f,-195.313f, -109.375f,8.72501f,-195.313f, -113.281f,9.3763f,-195.313f, -117.188f,9.56963f,-195.313f, -121.094f,9.54203f,-195.313f, -125.0f,9.30859f,-195.313f, -128.906f,9.02325f,-195.313f, -132.813f,8.54457f,-195.313f, -136.719f,7.91487f,-195.313f, -140.625f,5.8935f,-195.313f, -144.531f,4.77605f,-195.313f, -148.438f,3.03324f,-195.313f, -152.344f,2.63999f,-195.313f, -156.25f,1.85254f,-195.313f, -160.156f,2.58504f,-195.313f, -164.063f,1.86646f,-195.313f, -167.969f,0.472293f,-195.313f, -171.875f,-0.819486f,-195.313f, -175.781f,-3.28005f,-195.313f, -179.688f,-4.07223f,-195.313f, -183.594f,-5.23099f,-195.313f, -187.5f,-5.93446f,-195.313f, -191.406f,-7.40083f,-195.313f, -195.313f,-9.52595f,-195.313f, -199.219f,-9.06593f,-195.313f, -203.125f,-8.64632f,-195.313f, -207.031f,-8.71126f,-195.313f, -210.938f,-7.66946f,-195.313f, -214.844f,-8.22025f,-195.313f, -218.75f,-8.77434f,-195.313f, -222.656f,-7.8003f,-195.313f, -226.563f,-5.29317f,-195.313f, -230.469f,-3.13421f,-195.313f, -234.375f,-1.47978f,-195.313f, -238.281f,0.0436352f,-195.313f, -242.188f,1.56763f,-195.313f, -246.094f,3.2707f,-195.313f, -250.0f,5.38332f,-195.313f, -3.90625f,21.5827f,-199.219f, -7.8125f,21.5884f,-199.219f, -11.7188f,22.0551f,-199.219f, -15.625f,21.1895f,-199.219f, -19.5313f,19.9629f,-199.219f, -23.4375f,18.1891f,-199.219f, -27.3438f,17.3914f,-199.219f, -31.25f,15.7832f,-199.219f, -35.1563f,13.9537f,-199.219f, -39.0625f,11.7784f,-199.219f, -42.9688f,12.6473f,-199.219f, -46.875f,12.1685f,-199.219f, -50.7813f,12.2586f,-199.219f, -54.6875f,12.032f,-199.219f, -58.5938f,12.5025f,-199.219f, -62.5f,12.2207f,-199.219f, -66.4063f,10.4332f,-199.219f, -70.3125f,10.2093f,-199.219f, -74.2188f,9.56536f,-199.219f, -78.125f,10.5041f,-199.219f, -82.0313f,10.9136f,-199.219f, -85.9375f,10.6303f,-199.219f, -89.8438f,11.148f,-199.219f, -93.75f,10.2169f,-199.219f, -97.6563f,8.56966f,-199.219f, -101.563f,8.81808f,-199.219f, -105.469f,7.92638f,-199.219f, -109.375f,7.988f,-199.219f, -113.281f,8.07342f,-199.219f, -117.188f,8.41463f,-199.219f, -121.094f,8.44317f,-199.219f, -125.0f,8.93315f,-199.219f, -128.906f,8.02242f,-199.219f, -132.813f,7.78977f,-199.219f, -136.719f,7.24422f,-199.219f, -140.625f,6.65469f,-199.219f, -144.531f,5.63698f,-199.219f, -148.438f,3.71906f,-199.219f, -152.344f,1.94989f,-199.219f, -156.25f,1.5781f,-199.219f, -160.156f,2.54367f,-199.219f, -164.063f,2.24455f,-199.219f, -167.969f,0.172967f,-199.219f, -171.875f,-1.24076f,-199.219f, -175.781f,-2.09517f,-199.219f, -179.688f,-2.60068f,-199.219f, -183.594f,-3.35838f,-199.219f, -187.5f,-5.02796f,-199.219f, -191.406f,-6.75939f,-199.219f, -195.313f,-7.86176f,-199.219f, -199.219f,-7.60703f,-199.219f, -203.125f,-7.1176f,-199.219f, -207.031f,-7.21926f,-199.219f, -210.938f,-6.354f,-199.219f, -214.844f,-6.26146f,-199.219f, -218.75f,-7.39202f,-199.219f, -222.656f,-6.10132f,-199.219f, -226.563f,-4.15677f,-199.219f, -230.469f,-1.72339f,-199.219f, -234.375f,0.220408f,-199.219f, -238.281f,1.71501f,-199.219f, -242.188f,2.32136f,-199.219f, -246.094f,3.9302f,-199.219f, -250.0f,6.99831f,-199.219f, -3.90625f,20.3179f,-203.125f, -7.8125f,19.0038f,-203.125f, -11.7188f,19.8795f,-203.125f, -15.625f,18.863f,-203.125f, -19.5313f,17.2513f,-203.125f, -23.4375f,16.7786f,-203.125f, -27.3438f,16.4605f,-203.125f, -31.25f,14.0944f,-203.125f, -35.1563f,12.6715f,-203.125f, -39.0625f,12.2869f,-203.125f, -42.9688f,12.0256f,-203.125f, -46.875f,11.4308f,-203.125f, -50.7813f,11.5543f,-203.125f, -54.6875f,10.8247f,-203.125f, -58.5938f,12.5385f,-203.125f, -62.5f,12.1754f,-203.125f, -66.4063f,10.0857f,-203.125f, -70.3125f,8.73654f,-203.125f, -74.2188f,8.35323f,-203.125f, -78.125f,8.75049f,-203.125f, -82.0313f,9.69714f,-203.125f, -85.9375f,9.93848f,-203.125f, -89.8438f,9.99533f,-203.125f, -93.75f,9.28937f,-203.125f, -97.6563f,8.19048f,-203.125f, -101.563f,7.82659f,-203.125f, -105.469f,6.70152f,-203.125f, -109.375f,6.35245f,-203.125f, -113.281f,6.80811f,-203.125f, -117.188f,7.88474f,-203.125f, -121.094f,8.76964f,-203.125f, -125.0f,9.33913f,-203.125f, -128.906f,9.12843f,-203.125f, -132.813f,7.62144f,-203.125f, -136.719f,6.32841f,-203.125f, -140.625f,6.30299f,-203.125f, -144.531f,5.78467f,-203.125f, -148.438f,4.2404f,-203.125f, -152.344f,2.7611f,-203.125f, -156.25f,1.95904f,-203.125f, -160.156f,2.27166f,-203.125f, -164.063f,2.22405f,-203.125f, -167.969f,1.12279f,-203.125f, -171.875f,-0.169061f,-203.125f, -175.781f,-0.887647f,-203.125f, -179.688f,-0.896535f,-203.125f, -183.594f,-2.41604f,-203.125f, -187.5f,-3.63423f,-203.125f, -191.406f,-6.00826f,-203.125f, -195.313f,-5.87316f,-203.125f, -199.219f,-5.18767f,-203.125f, -203.125f,-4.23762f,-203.125f, -207.031f,-4.7338f,-203.125f, -210.938f,-4.88225f,-203.125f, -214.844f,-4.82274f,-203.125f, -218.75f,-5.06338f,-203.125f, -222.656f,-5.13737f,-203.125f, -226.563f,-2.74217f,-203.125f, -230.469f,0.0831564f,-203.125f, -234.375f,2.00986f,-203.125f, -238.281f,2.89937f,-203.125f, -242.188f,3.79442f,-203.125f, -246.094f,5.43821f,-203.125f, -250.0f,8.47222f,-203.125f, -3.90625f,18.3149f,-207.031f, -7.8125f,16.9318f,-207.031f, -11.7188f,16.7123f,-207.031f, -15.625f,16.066f,-207.031f, -19.5313f,15.8401f,-207.031f, -23.4375f,14.9793f,-207.031f, -27.3438f,13.5136f,-207.031f, -31.25f,12.316f,-207.031f, -35.1563f,12.4286f,-207.031f, -39.0625f,12.5926f,-207.031f, -42.9688f,12.419f,-207.031f, -46.875f,11.7087f,-207.031f, -50.7813f,10.9033f,-207.031f, -54.6875f,10.2175f,-207.031f, -58.5938f,10.7307f,-207.031f, -62.5f,9.9283f,-207.031f, -66.4063f,9.11458f,-207.031f, -70.3125f,6.81804f,-207.031f, -74.2188f,6.85559f,-207.031f, -78.125f,6.98146f,-207.031f, -82.0313f,8.41059f,-207.031f, -85.9375f,8.81018f,-207.031f, -89.8438f,9.25882f,-207.031f, -93.75f,8.4973f,-207.031f, -97.6563f,7.11312f,-207.031f, -101.563f,6.11367f,-207.031f, -105.469f,4.54171f,-207.031f, -109.375f,3.984f,-207.031f, -113.281f,6.23536f,-207.031f, -117.188f,7.41972f,-207.031f, -121.094f,8.40005f,-207.031f, -125.0f,9.21009f,-207.031f, -128.906f,9.10113f,-207.031f, -132.813f,8.69785f,-207.031f, -136.719f,7.08314f,-207.031f, -140.625f,6.14113f,-207.031f, -144.531f,4.85123f,-207.031f, -148.438f,4.53013f,-207.031f, -152.344f,4.73052f,-207.031f, -156.25f,3.50435f,-207.031f, -160.156f,3.02093f,-207.031f, -164.063f,2.65317f,-207.031f, -167.969f,1.91936f,-207.031f, -171.875f,1.31638f,-207.031f, -175.781f,0.631767f,-207.031f, -179.688f,-0.185018f,-207.031f, -183.594f,-1.04617f,-207.031f, -187.5f,-2.59594f,-207.031f, -191.406f,-3.62219f,-207.031f, -195.313f,-3.17366f,-207.031f, -199.219f,-3.0812f,-207.031f, -203.125f,-2.21365f,-207.031f, -207.031f,-3.02851f,-207.031f, -210.938f,-4.12823f,-207.031f, -214.844f,-3.42208f,-207.031f, -218.75f,-3.83284f,-207.031f, -222.656f,-3.83483f,-207.031f, -226.563f,-1.81388f,-207.031f, -230.469f,1.06182f,-207.031f, -234.375f,3.0063f,-207.031f, -238.281f,3.97581f,-207.031f, -242.188f,5.25584f,-207.031f, -246.094f,6.1092f,-207.031f, -250.0f,9.89458f,-207.031f, -3.90625f,16.2147f,-210.938f, -7.8125f,15.8155f,-210.938f, -11.7188f,14.9704f,-210.938f, -15.625f,14.6853f,-210.938f, -19.5313f,14.3326f,-210.938f, -23.4375f,14.0488f,-210.938f, -27.3438f,12.2057f,-210.938f, -31.25f,12.7526f,-210.938f, -35.1563f,13.1468f,-210.938f, -39.0625f,12.959f,-210.938f, -42.9688f,12.3931f,-210.938f, -46.875f,11.9578f,-210.938f, -50.7813f,10.5381f,-210.938f, -54.6875f,9.28222f,-210.938f, -58.5938f,9.20117f,-210.938f, -62.5f,8.74359f,-210.938f, -66.4063f,7.58308f,-210.938f, -70.3125f,5.98903f,-210.938f, -74.2188f,5.92315f,-210.938f, -78.125f,6.30208f,-210.938f, -82.0313f,7.35787f,-210.938f, -85.9375f,7.64729f,-210.938f, -89.8438f,7.89394f,-210.938f, -93.75f,7.64523f,-210.938f, -97.6563f,5.66526f,-210.938f, -101.563f,4.1348f,-210.938f, -105.469f,2.65548f,-210.938f, -109.375f,4.20615f,-210.938f, -113.281f,5.82801f,-210.938f, -117.188f,6.92681f,-210.938f, -121.094f,8.52107f,-210.938f, -125.0f,9.29929f,-210.938f, -128.906f,10.1454f,-210.938f, -132.813f,9.39782f,-210.938f, -136.719f,8.72704f,-210.938f, -140.625f,7.91058f,-210.938f, -144.531f,5.32835f,-210.938f, -148.438f,5.30143f,-210.938f, -152.344f,4.98294f,-210.938f, -156.25f,5.27331f,-210.938f, -160.156f,4.054f,-210.938f, -164.063f,4.25352f,-210.938f, -167.969f,3.60791f,-210.938f, -171.875f,2.94898f,-210.938f, -175.781f,1.97064f,-210.938f, -179.688f,1.21275f,-210.938f, -183.594f,-0.419751f,-210.938f, -187.5f,-1.77221f,-210.938f, -191.406f,-1.94763f,-210.938f, -195.313f,-1.32172f,-210.938f, -199.219f,-1.74453f,-210.938f, -203.125f,-0.694964f,-210.938f, -207.031f,-1.77277f,-210.938f, -210.938f,-2.39571f,-210.938f, -214.844f,-2.61021f,-210.938f, -218.75f,-3.16f,-210.938f, -222.656f,-2.46606f,-210.938f, -226.563f,-0.862086f,-210.938f, -230.469f,1.4487f,-210.938f, -234.375f,3.44239f,-210.938f, -238.281f,5.41949f,-210.938f, -242.188f,6.28416f,-210.938f, -246.094f,7.24993f,-210.938f, -250.0f,10.7227f,-210.938f, -3.90625f,14.284f,-214.844f, -7.8125f,14.031f,-214.844f, -11.7188f,12.8153f,-214.844f, -15.625f,12.2914f,-214.844f, -19.5313f,12.0657f,-214.844f, -23.4375f,12.4452f,-214.844f, -27.3438f,12.703f,-214.844f, -31.25f,12.3401f,-214.844f, -35.1563f,13.2219f,-214.844f, -39.0625f,12.9074f,-214.844f, -42.9688f,12.5934f,-214.844f, -46.875f,11.4717f,-214.844f, -50.7813f,10.548f,-214.844f, -54.6875f,9.43614f,-214.844f, -58.5938f,10.0982f,-214.844f, -62.5f,9.36536f,-214.844f, -66.4063f,8.07196f,-214.844f, -70.3125f,6.4483f,-214.844f, -74.2188f,5.80499f,-214.844f, -78.125f,5.60605f,-214.844f, -82.0313f,6.64906f,-214.844f, -85.9375f,7.64402f,-214.844f, -89.8438f,8.31151f,-214.844f, -93.75f,7.97344f,-214.844f, -97.6563f,5.39549f,-214.844f, -101.563f,3.66809f,-214.844f, -105.469f,3.2001f,-214.844f, -109.375f,5.91373f,-214.844f, -113.281f,7.40339f,-214.844f, -117.188f,8.30807f,-214.844f, -121.094f,9.75774f,-214.844f, -125.0f,10.2383f,-214.844f, -128.906f,10.3408f,-214.844f, -132.813f,10.6262f,-214.844f, -136.719f,10.8818f,-214.844f, -140.625f,9.09087f,-214.844f, -144.531f,6.48291f,-214.844f, -148.438f,5.02116f,-214.844f, -152.344f,5.97543f,-214.844f, -156.25f,6.33053f,-214.844f, -160.156f,5.91049f,-214.844f, -164.063f,5.03025f,-214.844f, -167.969f,5.01201f,-214.844f, -171.875f,4.36222f,-214.844f, -175.781f,3.69208f,-214.844f, -179.688f,2.96539f,-214.844f, -183.594f,1.43789f,-214.844f, -187.5f,-0.374301f,-214.844f, -191.406f,-0.955695f,-214.844f, -195.313f,-0.123769f,-214.844f, -199.219f,-0.113436f,-214.844f, -203.125f,-0.0171993f,-214.844f, -207.031f,-1.0984f,-214.844f, -210.938f,-1.10949f,-214.844f, -214.844f,-1.92471f,-214.844f, -218.75f,-2.26183f,-214.844f, -222.656f,-1.32064f,-214.844f, -226.563f,0.209158f,-214.844f, -230.469f,2.41199f,-214.844f, -234.375f,4.66871f,-214.844f, -238.281f,6.29773f,-214.844f, -242.188f,7.20184f,-214.844f, -246.094f,8.08018f,-214.844f, -250.0f,10.3057f,-214.844f, -3.90625f,13.272f,-218.75f, -7.8125f,12.8218f,-218.75f, -11.7188f,11.8102f,-218.75f, -15.625f,11.7105f,-218.75f, -19.5313f,11.5191f,-218.75f, -23.4375f,12.1253f,-218.75f, -27.3438f,12.0266f,-218.75f, -31.25f,12.3549f,-218.75f, -35.1563f,12.3822f,-218.75f, -39.0625f,12.268f,-218.75f, -42.9688f,12.5022f,-218.75f, -46.875f,11.2878f,-218.75f, -50.7813f,10.1823f,-218.75f, -54.6875f,10.4244f,-218.75f, -58.5938f,10.0047f,-218.75f, -62.5f,9.96061f,-218.75f, -66.4063f,8.64873f,-218.75f, -70.3125f,6.45636f,-218.75f, -74.2188f,5.30254f,-218.75f, -78.125f,5.2915f,-218.75f, -82.0313f,7.2575f,-218.75f, -85.9375f,8.1568f,-218.75f, -89.8438f,8.97514f,-218.75f, -93.75f,7.72908f,-218.75f, -97.6563f,5.41501f,-218.75f, -101.563f,4.24025f,-218.75f, -105.469f,5.39134f,-218.75f, -109.375f,7.69518f,-218.75f, -113.281f,8.87616f,-218.75f, -117.188f,9.44758f,-218.75f, -121.094f,9.21473f,-218.75f, -125.0f,10.1366f,-218.75f, -128.906f,11.6088f,-218.75f, -132.813f,12.0083f,-218.75f, -136.719f,12.3184f,-218.75f, -140.625f,10.8438f,-218.75f, -144.531f,7.65837f,-218.75f, -148.438f,6.07316f,-218.75f, -152.344f,6.4613f,-218.75f, -156.25f,7.01972f,-218.75f, -160.156f,7.25454f,-218.75f, -164.063f,6.31416f,-218.75f, -167.969f,6.48096f,-218.75f, -171.875f,5.89274f,-218.75f, -175.781f,5.71289f,-218.75f, -179.688f,4.3046f,-218.75f, -183.594f,2.49719f,-218.75f, -187.5f,1.16956f,-218.75f, -191.406f,1.21673f,-218.75f, -195.313f,1.19652f,-218.75f, -199.219f,1.27819f,-218.75f, -203.125f,1.06325f,-218.75f, -207.031f,0.133118f,-218.75f, -210.938f,-0.283675f,-218.75f, -214.844f,-0.471323f,-218.75f, -218.75f,-0.941533f,-218.75f, -222.656f,-0.953851f,-218.75f, -226.563f,0.751216f,-218.75f, -230.469f,2.54245f,-218.75f, -234.375f,5.17863f,-218.75f, -238.281f,7.22669f,-218.75f, -242.188f,8.44723f,-218.75f, -246.094f,8.59229f,-218.75f, -250.0f,10.4333f,-218.75f, -3.90625f,13.0199f,-222.656f, -7.8125f,13.1789f,-222.656f, -11.7188f,12.4614f,-222.656f, -15.625f,10.8521f,-222.656f, -19.5313f,11.2552f,-222.656f, -23.4375f,12.1618f,-222.656f, -27.3438f,12.6207f,-222.656f, -31.25f,12.7195f,-222.656f, -35.1563f,12.6379f,-222.656f, -39.0625f,12.5247f,-222.656f, -42.9688f,11.5493f,-222.656f, -46.875f,11.1218f,-222.656f, -50.7813f,11.1036f,-222.656f, -54.6875f,11.2909f,-222.656f, -58.5938f,9.99718f,-222.656f, -62.5f,9.07075f,-222.656f, -66.4063f,7.85904f,-222.656f, -70.3125f,6.00034f,-222.656f, -74.2188f,6.20222f,-222.656f, -78.125f,6.90091f,-222.656f, -82.0313f,8.15724f,-222.656f, -85.9375f,8.92624f,-222.656f, -89.8438f,9.54135f,-222.656f, -93.75f,8.05473f,-222.656f, -97.6563f,5.80654f,-222.656f, -101.563f,5.02178f,-222.656f, -105.469f,7.15584f,-222.656f, -109.375f,8.94755f,-222.656f, -113.281f,9.86631f,-222.656f, -117.188f,10.6421f,-222.656f, -121.094f,10.7891f,-222.656f, -125.0f,11.0716f,-222.656f, -128.906f,12.6376f,-222.656f, -132.813f,12.4373f,-222.656f, -136.719f,12.1143f,-222.656f, -140.625f,11.4028f,-222.656f, -144.531f,8.95242f,-222.656f, -148.438f,6.83012f,-222.656f, -152.344f,7.65217f,-222.656f, -156.25f,8.26579f,-222.656f, -160.156f,7.9665f,-222.656f, -164.063f,7.5217f,-222.656f, -167.969f,7.17758f,-222.656f, -171.875f,5.9966f,-222.656f, -175.781f,5.77514f,-222.656f, -179.688f,4.77675f,-222.656f, -183.594f,3.39545f,-222.656f, -187.5f,2.95911f,-222.656f, -191.406f,1.85368f,-222.656f, -195.313f,1.31365f,-222.656f, -199.219f,1.12622f,-222.656f, -203.125f,1.47676f,-222.656f, -207.031f,1.89446f,-222.656f, -210.938f,0.63056f,-222.656f, -214.844f,0.297565f,-222.656f, -218.75f,-0.0109998f,-222.656f, -222.656f,-0.225082f,-222.656f, -226.563f,0.63258f,-222.656f, -230.469f,2.89831f,-222.656f, -234.375f,5.64839f,-222.656f, -238.281f,7.22414f,-222.656f, -242.188f,7.89951f,-222.656f, -246.094f,8.80151f,-222.656f, -250.0f,10.9602f,-222.656f, -3.90625f,11.9733f,-226.563f, -7.8125f,12.8862f,-226.563f, -11.7188f,12.1283f,-226.563f, -15.625f,10.7234f,-226.563f, -19.5313f,11.6866f,-226.563f, -23.4375f,12.6552f,-226.563f, -27.3438f,12.7353f,-226.563f, -31.25f,11.7992f,-226.563f, -35.1563f,11.2006f,-226.563f, -39.0625f,10.9699f,-226.563f, -42.9688f,10.7653f,-226.563f, -46.875f,10.9947f,-226.563f, -50.7813f,11.2791f,-226.563f, -54.6875f,11.0716f,-226.563f, -58.5938f,10.7092f,-226.563f, -62.5f,9.16355f,-226.563f, -66.4063f,7.59431f,-226.563f, -70.3125f,6.68502f,-226.563f, -74.2188f,6.98133f,-226.563f, -78.125f,7.72239f,-226.563f, -82.0313f,9.00293f,-226.563f, -85.9375f,9.47866f,-226.563f, -89.8438f,8.94458f,-226.563f, -93.75f,7.79648f,-226.563f, -97.6563f,6.07787f,-226.563f, -101.563f,6.60546f,-226.563f, -105.469f,8.5652f,-226.563f, -109.375f,10.2869f,-226.563f, -113.281f,11.4751f,-226.563f, -117.188f,11.6224f,-226.563f, -121.094f,12.0803f,-226.563f, -125.0f,12.5335f,-226.563f, -128.906f,13.5918f,-226.563f, -132.813f,12.9198f,-226.563f, -136.719f,11.521f,-226.563f, -140.625f,10.6418f,-226.563f, -144.531f,8.8393f,-226.563f, -148.438f,8.79941f,-226.563f, -152.344f,9.4929f,-226.563f, -156.25f,9.96206f,-226.563f, -160.156f,8.75524f,-226.563f, -164.063f,7.64157f,-226.563f, -167.969f,7.1963f,-226.563f, -171.875f,6.83929f,-226.563f, -175.781f,6.10665f,-226.563f, -179.688f,4.70473f,-226.563f, -183.594f,4.54758f,-226.563f, -187.5f,3.58616f,-226.563f, -191.406f,2.97998f,-226.563f, -195.313f,1.49179f,-226.563f, -199.219f,1.85834f,-226.563f, -203.125f,1.49089f,-226.563f, -207.031f,1.39949f,-226.563f, -210.938f,0.863002f,-226.563f, -214.844f,1.15546f,-226.563f, -218.75f,0.609373f,-226.563f, -222.656f,1.04332f,-226.563f, -226.563f,1.58038f,-226.563f, -230.469f,4.11549f,-226.563f, -234.375f,5.64696f,-226.563f, -238.281f,6.61687f,-226.563f, -242.188f,7.3113f,-226.563f, -246.094f,8.56955f,-226.563f, -250.0f,10.7891f,-226.563f, -3.90625f,10.4619f,-230.469f, -7.8125f,11.4179f,-230.469f, -11.7188f,10.7841f,-230.469f, -15.625f,10.597f,-230.469f, -19.5313f,10.9999f,-230.469f, -23.4375f,11.5972f,-230.469f, -27.3438f,11.4553f,-230.469f, -31.25f,10.1015f,-230.469f, -35.1563f,10.412f,-230.469f, -39.0625f,9.72694f,-230.469f, -42.9688f,9.71973f,-230.469f, -46.875f,10.7767f,-230.469f, -50.7813f,10.8775f,-230.469f, -54.6875f,10.3186f,-230.469f, -58.5938f,10.4188f,-230.469f, -62.5f,8.94879f,-230.469f, -66.4063f,7.92103f,-230.469f, -70.3125f,8.48295f,-230.469f, -74.2188f,8.74782f,-230.469f, -78.125f,8.87976f,-230.469f, -82.0313f,9.68632f,-230.469f, -85.9375f,9.54993f,-230.469f, -89.8438f,9.04624f,-230.469f, -93.75f,8.49407f,-230.469f, -97.6563f,7.90008f,-230.469f, -101.563f,9.20657f,-230.469f, -105.469f,10.5114f,-230.469f, -109.375f,11.5284f,-230.469f, -113.281f,12.0378f,-230.469f, -117.188f,12.9398f,-230.469f, -121.094f,13.1489f,-230.469f, -125.0f,13.8974f,-230.469f, -128.906f,14.5048f,-230.469f, -132.813f,13.1823f,-230.469f, -136.719f,11.6226f,-230.469f, -140.625f,11.1108f,-230.469f, -144.531f,10.0418f,-230.469f, -148.438f,10.2026f,-230.469f, -152.344f,10.9585f,-230.469f, -156.25f,11.0258f,-230.469f, -160.156f,9.88552f,-230.469f, -164.063f,8.92538f,-230.469f, -167.969f,7.90306f,-230.469f, -171.875f,7.23733f,-230.469f, -175.781f,6.09503f,-230.469f, -179.688f,5.15065f,-230.469f, -183.594f,4.73006f,-230.469f, -187.5f,4.05091f,-230.469f, -191.406f,3.01834f,-230.469f, -195.313f,1.83317f,-230.469f, -199.219f,2.77945f,-230.469f, -203.125f,3.05633f,-230.469f, -207.031f,2.07007f,-230.469f, -210.938f,2.01993f,-230.469f, -214.844f,2.13491f,-230.469f, -218.75f,1.65812f,-230.469f, -222.656f,1.8404f,-230.469f, -226.563f,2.78297f,-230.469f, -230.469f,3.94561f,-230.469f, -234.375f,5.83019f,-230.469f, -238.281f,6.9093f,-230.469f, -242.188f,7.96229f,-230.469f, -246.094f,7.63052f,-230.469f, -250.0f,10.2449f,-230.469f, -3.90625f,8.85224f,-234.375f, -7.8125f,9.40139f,-234.375f, -11.7188f,9.62814f,-234.375f, -15.625f,9.97075f,-234.375f, -19.5313f,9.96073f,-234.375f, -23.4375f,9.70541f,-234.375f, -27.3438f,10.0435f,-234.375f, -31.25f,9.85879f,-234.375f, -35.1563f,9.52681f,-234.375f, -39.0625f,8.75341f,-234.375f, -42.9688f,8.99686f,-234.375f, -46.875f,9.56309f,-234.375f, -50.7813f,9.54486f,-234.375f, -54.6875f,10.0225f,-234.375f, -58.5938f,9.56394f,-234.375f, -62.5f,9.18474f,-234.375f, -66.4063f,9.29208f,-234.375f, -70.3125f,10.4881f,-234.375f, -74.2188f,10.8865f,-234.375f, -78.125f,11.0201f,-234.375f, -82.0313f,11.7722f,-234.375f, -85.9375f,11.1624f,-234.375f, -89.8438f,10.602f,-234.375f, -93.75f,9.93284f,-234.375f, -97.6563f,10.2532f,-234.375f, -101.563f,11.0848f,-234.375f, -105.469f,12.6576f,-234.375f, -109.375f,13.4783f,-234.375f, -113.281f,14.7992f,-234.375f, -117.188f,15.3803f,-234.375f, -121.094f,15.9985f,-234.375f, -125.0f,14.9035f,-234.375f, -128.906f,14.2715f,-234.375f, -132.813f,14.0098f,-234.375f, -136.719f,13.1141f,-234.375f, -140.625f,12.5809f,-234.375f, -144.531f,11.8546f,-234.375f, -148.438f,11.5219f,-234.375f, -152.344f,11.8842f,-234.375f, -156.25f,11.6581f,-234.375f, -160.156f,10.8307f,-234.375f, -164.063f,10.2712f,-234.375f, -167.969f,8.58443f,-234.375f, -171.875f,7.00592f,-234.375f, -175.781f,5.65553f,-234.375f, -179.688f,5.07429f,-234.375f, -183.594f,4.41004f,-234.375f, -187.5f,3.95516f,-234.375f, -191.406f,3.42243f,-234.375f, -195.313f,2.54334f,-234.375f, -199.219f,3.95931f,-234.375f, -203.125f,3.9139f,-234.375f, -207.031f,2.90644f,-234.375f, -210.938f,3.11525f,-234.375f, -214.844f,3.33135f,-234.375f, -218.75f,2.64229f,-234.375f, -222.656f,2.64397f,-234.375f, -226.563f,3.186f,-234.375f, -230.469f,4.46201f,-234.375f, -234.375f,5.92783f,-234.375f, -238.281f,6.79968f,-234.375f, -242.188f,8.7067f,-234.375f, -246.094f,8.47322f,-234.375f, -250.0f,10.3839f,-234.375f, -3.90625f,7.99527f,-238.281f, -7.8125f,8.62199f,-238.281f, -11.7188f,9.06695f,-238.281f, -15.625f,9.12589f,-238.281f, -19.5313f,8.97926f,-238.281f, -23.4375f,9.75152f,-238.281f, -27.3438f,9.58038f,-238.281f, -31.25f,9.30169f,-238.281f, -35.1563f,8.63599f,-238.281f, -39.0625f,8.72973f,-238.281f, -42.9688f,8.49513f,-238.281f, -46.875f,8.78362f,-238.281f, -50.7813f,8.75045f,-238.281f, -54.6875f,8.96186f,-238.281f, -58.5938f,10.0611f,-238.281f, -62.5f,11.1275f,-238.281f, -66.4063f,10.8209f,-238.281f, -70.3125f,12.0108f,-238.281f, -74.2188f,13.2126f,-238.281f, -78.125f,14.1323f,-238.281f, -82.0313f,14.3575f,-238.281f, -85.9375f,13.2781f,-238.281f, -89.8438f,12.8024f,-238.281f, -93.75f,12.0484f,-238.281f, -97.6563f,12.7657f,-238.281f, -101.563f,14.0307f,-238.281f, -105.469f,15.9567f,-238.281f, -109.375f,17.7803f,-238.281f, -113.281f,19.0777f,-238.281f, -117.188f,18.7555f,-238.281f, -121.094f,18.8129f,-238.281f, -125.0f,17.4807f,-238.281f, -128.906f,16.4022f,-238.281f, -132.813f,16.01f,-238.281f, -136.719f,15.1852f,-238.281f, -140.625f,13.9301f,-238.281f, -144.531f,12.8841f,-238.281f, -148.438f,11.7108f,-238.281f, -152.344f,11.414f,-238.281f, -156.25f,11.056f,-238.281f, -160.156f,10.8688f,-238.281f, -164.063f,10.5672f,-238.281f, -167.969f,10.0938f,-238.281f, -171.875f,7.73603f,-238.281f, -175.781f,5.94931f,-238.281f, -179.688f,5.51512f,-238.281f, -183.594f,5.27449f,-238.281f, -187.5f,4.94763f,-238.281f, -191.406f,4.13161f,-238.281f, -195.313f,3.59426f,-238.281f, -199.219f,4.03163f,-238.281f, -203.125f,4.38188f,-238.281f, -207.031f,3.09959f,-238.281f, -210.938f,3.1766f,-238.281f, -214.844f,3.05715f,-238.281f, -218.75f,3.20329f,-238.281f, -222.656f,2.53565f,-238.281f, -226.563f,3.1275f,-238.281f, -230.469f,4.54736f,-238.281f, -234.375f,5.9361f,-238.281f, -238.281f,6.99977f,-238.281f, -242.188f,8.20813f,-238.281f, -246.094f,9.56614f,-238.281f, -250.0f,11.4751f,-238.281f, -3.90625f,6.40337f,-242.188f, -7.8125f,7.88741f,-242.188f, -11.7188f,8.60661f,-242.188f, -15.625f,8.56923f,-242.188f, -19.5313f,8.60588f,-242.188f, -23.4375f,8.63232f,-242.188f, -27.3438f,8.3446f,-242.188f, -31.25f,7.50857f,-242.188f, -35.1563f,7.64026f,-242.188f, -39.0625f,7.75851f,-242.188f, -42.9688f,7.56672f,-242.188f, -46.875f,7.98994f,-242.188f, -50.7813f,9.62391f,-242.188f, -54.6875f,9.28711f,-242.188f, -58.5938f,10.3792f,-242.188f, -62.5f,11.2793f,-242.188f, -66.4063f,12.3048f,-242.188f, -70.3125f,13.5272f,-242.188f, -74.2188f,14.5101f,-242.188f, -78.125f,15.2091f,-242.188f, -82.0313f,15.9007f,-242.188f, -85.9375f,15.4601f,-242.188f, -89.8438f,14.5171f,-242.188f, -93.75f,14.2266f,-242.188f, -97.6563f,13.9558f,-242.188f, -101.563f,15.8234f,-242.188f, -105.469f,18.6741f,-242.188f, -109.375f,20.7296f,-242.188f, -113.281f,21.5353f,-242.188f, -117.188f,20.9821f,-242.188f, -121.094f,20.2232f,-242.188f, -125.0f,18.5423f,-242.188f, -128.906f,17.8591f,-242.188f, -132.813f,17.6716f,-242.188f, -136.719f,16.8982f,-242.188f, -140.625f,14.8574f,-242.188f, -144.531f,13.0736f,-242.188f, -148.438f,12.4847f,-242.188f, -152.344f,11.8101f,-242.188f, -156.25f,11.7863f,-242.188f, -160.156f,11.4288f,-242.188f, -164.063f,10.8653f,-242.188f, -167.969f,9.75951f,-242.188f, -171.875f,8.13212f,-242.188f, -175.781f,6.91851f,-242.188f, -179.688f,5.93418f,-242.188f, -183.594f,5.79732f,-242.188f, -187.5f,5.8082f,-242.188f, -191.406f,4.85116f,-242.188f, -195.313f,4.2744f,-242.188f, -199.219f,4.23009f,-242.188f, -203.125f,3.99841f,-242.188f, -207.031f,3.48205f,-242.188f, -210.938f,3.71102f,-242.188f, -214.844f,3.52803f,-242.188f, -218.75f,3.41263f,-242.188f, -222.656f,2.40768f,-242.188f, -226.563f,3.40111f,-242.188f, -230.469f,4.51594f,-242.188f, -234.375f,5.96131f,-242.188f, -238.281f,7.68646f,-242.188f, -242.188f,8.54536f,-242.188f, -246.094f,9.49379f,-242.188f, -250.0f,12.0532f,-242.188f, -3.90625f,6.09425f,-246.094f, -7.8125f,7.62532f,-246.094f, -11.7188f,8.33141f,-246.094f, -15.625f,8.6172f,-246.094f, -19.5313f,8.7607f,-246.094f, -23.4375f,7.89699f,-246.094f, -27.3438f,7.77868f,-246.094f, -31.25f,7.41037f,-246.094f, -35.1563f,6.57203f,-246.094f, -39.0625f,6.31554f,-246.094f, -42.9688f,7.72481f,-246.094f, -46.875f,8.88325f,-246.094f, -50.7813f,10.0433f,-246.094f, -54.6875f,10.7945f,-246.094f, -58.5938f,11.7506f,-246.094f, -62.5f,13.1397f,-246.094f, -66.4063f,13.1294f,-246.094f, -70.3125f,14.8885f,-246.094f, -74.2188f,15.5444f,-246.094f, -78.125f,16.4867f,-246.094f, -82.0313f,17.0601f,-246.094f, -85.9375f,17.2351f,-246.094f, -89.8438f,16.4292f,-246.094f, -93.75f,16.32f,-246.094f, -97.6563f,17.0323f,-246.094f, -101.563f,17.5524f,-246.094f, -105.469f,20.0544f,-246.094f, -109.375f,21.7596f,-246.094f, -113.281f,22.3401f,-246.094f, -117.188f,22.7891f,-246.094f, -121.094f,21.705f,-246.094f, -125.0f,20.4875f,-246.094f, -128.906f,19.3013f,-246.094f, -132.813f,18.5254f,-246.094f, -136.719f,17.4179f,-246.094f, -140.625f,14.7663f,-246.094f, -144.531f,13.8915f,-246.094f, -148.438f,12.0594f,-246.094f, -152.344f,11.8343f,-246.094f, -156.25f,12.3176f,-246.094f, -160.156f,12.7287f,-246.094f, -164.063f,10.9779f,-246.094f, -167.969f,10.1928f,-246.094f, -171.875f,8.20833f,-246.094f, -175.781f,7.71383f,-246.094f, -179.688f,7.59678f,-246.094f, -183.594f,6.98083f,-246.094f, -187.5f,6.81055f,-246.094f, -191.406f,6.13881f,-246.094f, -195.313f,4.42472f,-246.094f, -199.219f,3.97044f,-246.094f, -203.125f,4.06157f,-246.094f, -207.031f,3.73524f,-246.094f, -210.938f,4.45121f,-246.094f, -214.844f,3.42347f,-246.094f, -218.75f,2.70444f,-246.094f, -222.656f,3.88027f,-246.094f, -226.563f,4.53456f,-246.094f, -230.469f,5.69259f,-246.094f, -234.375f,6.23366f,-246.094f, -238.281f,7.38965f,-246.094f, -242.188f,8.96481f,-246.094f, -246.094f,10.9805f,-246.094f, -250.0f,13.0168f,-246.094f, -3.90625f,6.31953f,-250.0f, -7.8125f,6.89279f,-250.0f, -11.7188f,8.63362f,-250.0f, -15.625f,9.28278f,-250.0f, -19.5313f,9.05374f,-250.0f, -23.4375f,8.51295f,-250.0f, -27.3438f,8.2676f,-250.0f, -31.25f,7.86717f,-250.0f, -35.1563f,6.56073f,-250.0f, -39.0625f,6.77605f,-250.0f, -42.9688f,8.67577f,-250.0f, -46.875f,10.2384f,-250.0f, -50.7813f,11.5086f,-250.0f, -54.6875f,12.7259f,-250.0f, -58.5938f,14.4625f,-250.0f, -62.5f,15.7352f,-250.0f, -66.4063f,15.1953f,-250.0f, -70.3125f,16.1585f,-250.0f, -74.2188f,17.1058f,-250.0f, -78.125f,17.3014f,-250.0f, -82.0313f,18.6932f,-250.0f, -85.9375f,18.6138f,-250.0f, -89.8438f,18.0431f,-250.0f, -93.75f,18.293f,-250.0f, -97.6563f,18.5338f,-250.0f, -101.563f,18.8033f,-250.0f, -105.469f,22.2037f,-250.0f, -109.375f,24.04f,-250.0f, -113.281f,24.711f,-250.0f, -117.188f,24.2801f,-250.0f, -121.094f,23.1052f,-250.0f, -125.0f,21.9886f,-250.0f, -128.906f,21.2657f,-250.0f, -132.813f,19.5364f,-250.0f, -136.719f,18.5278f,-250.0f, -140.625f,15.9806f,-250.0f, -144.531f,14.8577f,-250.0f, -148.438f,13.3645f,-250.0f, -152.344f,12.8082f,-250.0f, -156.25f,13.3689f,-250.0f, -160.156f,12.7449f,-250.0f, -164.063f,11.1108f,-250.0f, -167.969f,9.59991f,-250.0f, -171.875f,8.88472f,-250.0f, -175.781f,8.39035f,-250.0f, -179.688f,7.9163f,-250.0f, -183.594f,7.4118f,-250.0f, -187.5f,6.98082f,-250.0f, -191.406f,7.20793f,-250.0f, -195.313f,6.19875f,-250.0f, -199.219f,4.05745f,-250.0f, -203.125f,4.65884f,-250.0f, -207.031f,3.75824f,-250.0f, -210.938f,4.17504f,-250.0f, -214.844f,4.37516f,-250.0f, -218.75f,4.69345f,-250.0f, -222.656f,5.87678f,-250.0f, -226.563f,6.28295f,-250.0f, -230.469f,7.2125f,-250.0f, -234.375f,7.55925f,-250.0f, -238.281f,7.93922f,-250.0f, -242.188f,9.87332f,-250.0f, -246.094f,11.5957f,-250.0f, -250.0f,13.3418f,-250.0f, -}; - -btScalar Landscape07Nml[] = { -0.163295f,0.951018f,0.262487f, -0.144468f,0.954269f,0.261724f, -0.284339f,0.929979f,0.233003f, -0.211332f,0.959058f,0.188537f, -0.433374f,0.893306f,0.11913f, -0.363648f,0.930033f,0.052906f, -0.467682f,0.883824f,-0.0113249f, -0.383618f,0.915858f,-0.118494f, -0.389479f,0.919494f,-0.0532637f, -0.409514f,0.907723f,-0.0913076f, -0.332107f,0.943241f,-0.00112667f, -0.268223f,0.935541f,-0.229827f, -0.254548f,0.967046f,-0.0051751f, -0.306606f,0.933957f,-0.183623f, -0.282468f,0.956486f,0.073117f, -0.352033f,0.935268f,0.0366899f, -0.28404f,0.958651f,0.0175868f, -0.303901f,0.947745f,0.0970751f, -0.36555f,0.930735f,0.0102418f, -0.393208f,0.907605f,0.147107f, -0.468517f,0.882377f,0.0436299f, -0.45621f,0.884295f,0.0994741f, -0.387946f,0.921329f,0.0254982f, -0.35572f,0.93034f,0.0890492f, --0.0727074f,0.997226f,-0.0159048f, -0.0416391f,0.981376f,0.187527f, --0.216733f,0.958137f,0.187084f, --0.0894435f,0.917028f,0.388664f, --0.0768893f,0.966885f,0.243356f, --0.0850782f,0.918088f,0.387139f, --0.0500426f,0.973558f,0.222893f, --0.133165f,0.955198f,0.264319f, --0.123001f,0.980349f,0.154228f, --0.136539f,0.958129f,0.251685f, --0.132627f,0.981796f,0.135965f, --0.174651f,0.968606f,0.176918f, --0.259357f,0.958248f,0.120395f, --0.298496f,0.949786f,0.0938444f, --0.287382f,0.955091f,0.0721996f, --0.350088f,0.936687f,-0.00747904f, --0.148232f,0.988935f,-0.00587251f, --0.126386f,0.991686f,0.0242043f, --0.0549856f,0.99804f,0.0298927f, --0.061356f,0.998107f,0.00430538f, --0.205447f,0.97828f,0.0275574f, --0.222811f,0.974816f,-0.00939735f, --0.192208f,0.981343f,0.00477232f, --0.179009f,0.983825f,-0.00666687f, --0.0670729f,0.997581f,0.0182672f, --0.127994f,0.990724f,-0.0456448f, --0.132352f,0.983294f,-0.124961f, --0.16906f,0.976471f,-0.133875f, -0.0163433f,0.992538f,-0.120836f, -0.061026f,0.995929f,-0.0663405f, -0.133906f,0.98909f,-0.0613958f, -0.0943148f,0.983776f,-0.152607f, -0.150352f,0.985874f,-0.0738065f, -0.100217f,0.972528f,-0.210109f, -0.174622f,0.974275f,-0.142462f, -0.154561f,0.962801f,-0.221644f, -0.214773f,0.96191f,-0.169122f, -0.258606f,0.948184f,-0.184582f, -0.352689f,0.932616f,-0.0764078f, -0.422646f,0.906225f,0.0112396f, -0.443105f,0.890896f,-0.0998108f, -0.401063f,0.915401f,-0.0344995f, -0.415945f,0.889086f,-0.19109f, -0.396075f,0.910803f,-0.116459f, -0.504361f,0.849207f,-0.15642f, -0.465554f,0.866637f,-0.179442f, -0.527872f,0.824305f,-0.204628f, -0.465951f,0.840148f,-0.277561f, -0.474007f,0.822715f,-0.31378f, -0.361245f,0.837173f,-0.410663f, -0.405138f,0.793126f,-0.454769f, -0.304965f,0.772294f,-0.557277f, -0.421648f,0.811214f,-0.405148f, -0.482203f,0.762506f,-0.431353f, -0.478963f,0.817038f,-0.321005f, -0.485062f,0.781955f,-0.391486f, -0.478205f,0.82345f,-0.305368f, -0.426707f,0.781297f,-0.455518f, -0.428677f,0.841565f,-0.32864f, -0.430024f,0.798188f,-0.421871f, -0.423016f,0.835924f,-0.349699f, -0.437416f,0.818455f,-0.372557f, -0.461522f,0.813116f,-0.354739f, -0.446182f,0.808887f,-0.382915f, -0.507869f,0.791896f,-0.339072f, -0.474665f,0.780232f,-0.407346f, -0.494125f,0.792543f,-0.357373f, -0.430265f,0.769469f,-0.472006f, -0.389469f,0.809375f,-0.439574f, -0.38782f,0.781711f,-0.488389f, -0.349938f,0.837293f,-0.4201f, -0.417236f,0.816738f,-0.398564f, -0.440298f,0.822173f,-0.360789f, -0.490994f,0.819158f,-0.296487f, -0.379279f,0.852728f,-0.359169f, -0.3675f,0.860963f,-0.351692f, -0.122152f,0.892865f,-0.433442f, -0.135293f,0.922235f,-0.362185f, -0.188083f,0.883941f,-0.428104f, -0.194653f,0.9204f,-0.339078f, -0.200053f,0.870677f,-0.449332f, -0.149584f,0.899445f,-0.410639f, -0.170948f,0.845446f,-0.505962f, -0.0834541f,0.848059f,-0.523289f, -0.233208f,0.811352f,-0.536024f, -0.246347f,0.822898f,-0.512008f, -0.0429626f,0.875995f,-0.480403f, -0.171623f,0.870482f,-0.461311f, --0.202408f,0.938053f,-0.281226f, --0.0831604f,0.960463f,-0.265698f, --0.312635f,0.912112f,-0.265162f, --0.344362f,0.89728f,-0.276231f, --0.0852182f,0.932714f,-0.350403f, --0.156991f,0.922287f,-0.353185f, -0.0213728f,0.893503f,-0.448548f, --0.0577934f,0.860578f,-0.506029f, --0.0250381f,0.886654f,-0.461755f, --0.0319956f,0.87749f,-0.478526f, --0.0302913f,0.865602f,-0.499816f, --0.00892741f,0.865625f,-0.500613f, -0.0556557f,0.906734f,-0.418015f, -0.137632f,0.905698f,-0.400959f, -0.0276894f,0.926625f,-0.374965f, -0.074566f,0.927887f,-0.365329f, -0.0588963f,0.991806f,0.113367f, -0.300045f,0.940314f,0.160571f, -0.505162f,0.858812f,0.0851652f, -0.523651f,0.851407f,0.0299276f, -0.336751f,0.940492f,0.0455315f, -0.231254f,0.960478f,0.15493f, -0.265257f,0.945144f,0.190637f, -0.327138f,0.941822f,0.0771526f, -0.406507f,0.912216f,-0.0511354f, -0.398687f,0.900126f,-0.17556f, -0.399875f,0.884983f,-0.238547f, -0.421808f,0.899838f,-0.11122f, --0.041369f,0.987502f,-0.152078f, --0.327111f,0.932019f,-0.156008f, --0.143307f,0.985559f,-0.0902006f, --0.0270205f,0.999466f,0.0183744f, --0.0836031f,0.996473f,-0.00727851f, --0.153499f,0.988141f,-0.00380883f, --0.269657f,0.962702f,0.0221269f, --0.220011f,0.975241f,-0.0223422f, --0.104184f,0.990611f,-0.0885198f, --0.112376f,0.99176f,-0.0615135f, --0.176142f,0.984186f,-0.0187604f, --0.211815f,0.974306f,-0.076572f, --0.0254097f,0.999559f,-0.0153608f, --0.0364109f,0.99734f,-0.0631393f, --0.0203648f,0.999538f,-0.0225481f, -0.0549873f,0.998448f,0.00884961f, -0.169599f,0.985346f,0.0181241f, -0.253148f,0.96653f,-0.0416731f, -0.241207f,0.963047f,-0.119834f, -0.334221f,0.932038f,-0.140004f, -0.510774f,0.849501f,-0.132124f, -0.446103f,0.866333f,-0.224633f, -0.443332f,0.853241f,-0.274658f, -0.556199f,0.799442f,-0.227011f, -0.56349f,0.790862f,-0.238781f, -0.469847f,0.819465f,-0.32821f, -0.384148f,0.843359f,-0.375735f, -0.405196f,0.828658f,-0.386189f, -0.451519f,0.832227f,-0.321758f, -0.460293f,0.845627f,-0.27027f, -0.479361f,0.841341f,-0.249716f, -0.486527f,0.832565f,-0.264815f, -0.505678f,0.817374f,-0.276024f, -0.532701f,0.792427f,-0.297134f, -0.419998f,0.832504f,-0.361301f, -0.381252f,0.872209f,-0.306428f, -0.441269f,0.820876f,-0.362552f, -0.40003f,0.811169f,-0.426593f, -0.192925f,0.829083f,-0.524786f, -0.183969f,0.805942f,-0.562684f, -0.196671f,0.822252f,-0.534063f, -0.210296f,0.820946f,-0.530871f, -0.203797f,0.82129f,-0.532869f, --0.110131f,0.879911f,-0.462199f, --0.313522f,0.874849f,-0.369247f, --0.225349f,0.894153f,-0.386922f, --0.0425073f,0.90311f,-0.4273f, -0.0811921f,0.929959f,-0.358587f, --0.0097083f,0.913772f,-0.406111f, --0.0203212f,0.916094f,-0.400448f, --0.0594319f,0.92652f,-0.371521f, --0.0269889f,0.956838f,-0.289365f, -0.0349749f,0.98646f,-0.160231f, -0.256968f,0.956769f,-0.13624f, -0.548943f,0.832681f,-0.0728256f, -0.489119f,0.868806f,-0.0770563f, -0.299363f,0.954014f,0.0154449f, -0.150669f,0.988307f,0.0233966f, -0.338483f,0.938561f,0.0673226f, -0.470525f,0.880363f,-0.0597344f, -0.482272f,0.850276f,-0.210818f, -0.467725f,0.834993f,-0.289861f, -0.394888f,0.866151f,-0.306343f, -0.253937f,0.935832f,-0.244407f, --0.00400266f,0.994244f,-0.107062f, --0.309146f,0.937501f,-0.15975f, --0.226806f,0.957844f,-0.176334f, --0.122632f,0.982531f,-0.139981f, --0.0635605f,0.992861f,-0.10093f, --0.151586f,0.973622f,-0.170534f, --0.231525f,0.948656f,-0.215516f, --0.166237f,0.951792f,-0.257795f, --0.0869197f,0.960928f,-0.262798f, --0.164573f,0.950876f,-0.262203f, --0.167249f,0.963013f,-0.211268f, --0.211402f,0.954271f,-0.211366f, --0.0642089f,0.988782f,-0.134861f, --0.0696806f,0.987799f,-0.139279f, --0.124243f,0.98904f,-0.0797755f, -0.0962393f,0.995288f,-0.0118021f, -0.210783f,0.972894f,-0.0951158f, -0.297355f,0.950074f,-0.0945467f, -0.301001f,0.949737f,-0.0860135f, -0.352321f,0.929179f,-0.111785f, -0.488103f,0.867307f,-0.0976422f, -0.556803f,0.828121f,-0.0646904f, -0.522997f,0.817722f,-0.240427f, -0.526158f,0.791225f,-0.311642f, -0.539548f,0.783883f,-0.30727f, -0.519736f,0.798926f,-0.302643f, -0.456854f,0.816569f,-0.352845f, -0.429557f,0.807438f,-0.404381f, -0.403588f,0.823842f,-0.397997f, -0.363835f,0.833866f,-0.415079f, -0.411515f,0.83345f,-0.368804f, -0.472303f,0.812756f,-0.341113f, -0.520866f,0.78709f,-0.330436f, -0.571303f,0.758641f,-0.313172f, -0.364947f,0.85616f,-0.365791f, -0.334117f,0.892356f,-0.303424f, -0.531373f,0.790182f,-0.305376f, -0.490437f,0.768139f,-0.411624f, -0.28549f,0.798709f,-0.529679f, -0.166173f,0.802828f,-0.572585f, -0.142862f,0.826392f,-0.544671f, -0.199443f,0.816751f,-0.541424f, -0.128075f,0.851947f,-0.507724f, --0.168704f,0.879688f,-0.444621f, --0.244755f,0.842741f,-0.479461f, --0.150804f,0.809643f,-0.567218f, --0.142654f,0.804501f,-0.576565f, --0.00468689f,0.885234f,-0.465123f, --0.00403137f,0.903548f,-0.428468f, --0.0506207f,0.931001f,-0.361489f, --0.153442f,0.941817f,-0.299058f, --0.162811f,0.972443f,-0.166875f, -0.109587f,0.934225f,-0.339431f, -0.212963f,0.908729f,-0.358967f, -0.490721f,0.837065f,-0.2419f, -0.423339f,0.87185f,-0.246298f, -0.265687f,0.948953f,-0.169996f, -0.19754f,0.959782f,-0.199488f, -0.295591f,0.918793f,-0.261622f, -0.531499f,0.826018f,-0.187622f, -0.59212f,0.773761f,-0.225139f, -0.430882f,0.823206f,-0.369692f, -0.346812f,0.896722f,-0.274977f, -0.157001f,0.944818f,-0.287523f, --0.0770972f,0.974843f,-0.209133f, --0.291803f,0.93708f,-0.191656f, --0.196019f,0.961744f,-0.191378f, --0.131765f,0.96396f,-0.231124f, --0.0745388f,0.982069f,-0.173159f, -0.00914064f,0.98959f,-0.143621f, --0.138284f,0.94748f,-0.288373f, --0.221669f,0.91917f,-0.325561f, --0.129149f,0.970549f,-0.203358f, --0.130482f,0.980721f,-0.145466f, --0.176902f,0.951987f,-0.249854f, --0.247465f,0.916992f,-0.31287f, --0.158128f,0.953184f,-0.25775f, --0.0356987f,0.985511f,-0.165812f, --0.125849f,0.96636f,-0.224301f, -0.0681695f,0.96619f,-0.248655f, -0.227225f,0.953018f,-0.200315f, -0.225952f,0.967572f,-0.112919f, -0.287704f,0.957355f,-0.0264129f, -0.36102f,0.928385f,-0.0881278f, -0.475672f,0.87145f,-0.119627f, -0.569214f,0.81507f,-0.107964f, -0.623663f,0.769908f,-0.13523f, -0.603105f,0.773542f,-0.19467f, -0.556766f,0.776509f,-0.295034f, -0.523993f,0.789717f,-0.319025f, -0.458736f,0.810878f,-0.36337f, -0.42608f,0.838013f,-0.340867f, -0.413816f,0.852215f,-0.320134f, -0.428047f,0.839676f,-0.334247f, -0.440545f,0.806668f,-0.393963f, -0.471664f,0.754066f,-0.457075f, -0.438131f,0.75533f,-0.487358f, -0.513035f,0.778713f,-0.361111f, -0.362236f,0.865985f,-0.344753f, -0.319311f,0.872794f,-0.36915f, -0.546544f,0.761872f,-0.347621f, -0.587841f,0.74763f,-0.309017f, -0.346001f,0.792234f,-0.502642f, -0.160837f,0.807416f,-0.567637f, -0.137348f,0.82025f,-0.555271f, -0.177955f,0.827144f,-0.533071f, -0.0951091f,0.870125f,-0.483567f, --0.154432f,0.835911f,-0.526691f, --0.124368f,0.808763f,-0.574834f, --0.126819f,0.782715f,-0.609323f, --0.137751f,0.811099f,-0.568456f, --0.111652f,0.799108f,-0.590729f, --0.083265f,0.829705f,-0.551957f, --0.187386f,0.858237f,-0.477825f, --0.293723f,0.918982f,-0.263055f, --0.393626f,0.913021f,-0.107009f, -0.212209f,0.950224f,-0.228125f, -0.209499f,0.936607f,-0.280851f, -0.442676f,0.872148f,-0.208317f, -0.471617f,0.857429f,-0.205893f, -0.203873f,0.890799f,-0.406094f, -0.238352f,0.874506f,-0.422408f, -0.316589f,0.834877f,-0.45028f, -0.439788f,0.802413f,-0.403384f, -0.591147f,0.75018f,-0.29627f, -0.446858f,0.837414f,-0.314732f, -0.297014f,0.892204f,-0.340228f, -0.174626f,0.914769f,-0.364286f, --0.105816f,0.915255f,-0.388731f, --0.264967f,0.884964f,-0.382925f, --0.17731f,0.909999f,-0.374785f, --0.129483f,0.910653f,-0.39236f, --0.183919f,0.912509f,-0.365379f, --0.0547605f,0.971103f,-0.232295f, --0.0329197f,0.988161f,-0.149845f, --0.283679f,0.94023f,-0.188398f, --0.271484f,0.961222f,-0.0484715f, --0.126156f,0.992006f,-0.00297784f, --0.0077445f,0.99412f,-0.10801f, --0.122479f,0.952558f,-0.278626f, --0.22816f,0.898995f,-0.373834f, --0.116624f,0.94701f,-0.299285f, --0.0338322f,0.962019f,-0.270876f, -0.0643125f,0.93366f,-0.352339f, -0.108033f,0.951056f,-0.28952f, -0.0914872f,0.981979f,-0.165373f, -0.260441f,0.963994f,-0.0537291f, -0.448443f,0.892711f,-0.0443492f, -0.523825f,0.846692f,-0.0933822f, -0.566469f,0.810587f,-0.148532f, -0.615421f,0.777098f,-0.131818f, -0.641634f,0.7586f,-0.11328f, -0.626845f,0.758026f,-0.180172f, -0.575952f,0.768546f,-0.278596f, -0.455289f,0.793648f,-0.403527f, -0.401888f,0.827012f,-0.393113f, -0.390072f,0.829628f,-0.399451f, -0.432707f,0.817098f,-0.380939f, -0.498394f,0.785084f,-0.367759f, -0.54453f,0.759415f,-0.356056f, -0.443321f,0.820621f,-0.360621f, -0.413861f,0.828476f,-0.377289f, -0.394054f,0.852433f,-0.343626f, -0.354186f,0.831754f,-0.427477f, -0.501406f,0.754246f,-0.423916f, -0.58911f,0.726277f,-0.354219f, -0.489087f,0.757568f,-0.432301f, -0.219144f,0.803913f,-0.552901f, -0.0950257f,0.808184f,-0.581213f, -0.0824554f,0.830823f,-0.550395f, -0.0933748f,0.860985f,-0.499987f, --0.0248456f,0.850125f,-0.525994f, --0.102917f,0.824622f,-0.556243f, --0.137975f,0.843048f,-0.519839f, --0.191841f,0.811585f,-0.551839f, --0.0960986f,0.833755f,-0.543707f, --0.122745f,0.850064f,-0.512177f, --0.326981f,0.870361f,-0.368177f, --0.538824f,0.830097f,-0.143558f, --0.554748f,0.831168f,0.0375988f, -0.183636f,0.945911f,-0.267453f, -0.248003f,0.941284f,-0.229083f, -0.367193f,0.90606f,-0.210295f, -0.559963f,0.826078f,-0.0635307f, -0.486301f,0.848236f,-0.209779f, -0.313552f,0.830527f,-0.460336f, -0.26103f,0.794184f,-0.548758f, -0.384376f,0.78311f,-0.488869f, -0.479781f,0.77201f,-0.416905f, -0.481011f,0.825397f,-0.295547f, -0.281884f,0.886831f,-0.366158f, -0.202383f,0.940438f,-0.273162f, --0.0238314f,0.938511f,-0.344426f, --0.257973f,0.859678f,-0.440913f, --0.194719f,0.873936f,-0.445332f, --0.0838372f,0.877697f,-0.471825f, --0.223876f,0.839024f,-0.495901f, --0.216019f,0.888182f,-0.405548f, --0.127765f,0.960438f,-0.247457f, --0.306436f,0.940762f,-0.145138f, --0.327317f,0.939981f,-0.096429f, --0.0557083f,0.990847f,-0.122959f, -0.0995056f,0.975129f,-0.198043f, -0.0247654f,0.966343f,-0.256062f, --0.1694f,0.916546f,-0.362281f, --0.197841f,0.908709f,-0.367568f, --0.0185126f,0.95561f,-0.294052f, -0.0824185f,0.951583f,-0.296138f, -0.0241627f,0.96387f,-0.265277f, -0.0355962f,0.964767f,-0.260688f, -0.155357f,0.948871f,-0.274788f, -0.403654f,0.905713f,-0.129414f, -0.540931f,0.838513f,-0.0654957f, -0.603296f,0.79305f,-0.0842943f, -0.615316f,0.778563f,-0.123395f, -0.650635f,0.750663f,-0.114799f, -0.681129f,0.712532f,-0.16841f, -0.640077f,0.706799f,-0.301225f, -0.501905f,0.776085f,-0.381816f, -0.395956f,0.833034f,-0.386359f, -0.40448f,0.824611f,-0.39549f, -0.410354f,0.816219f,-0.406689f, -0.470853f,0.807605f,-0.355065f, -0.489936f,0.812779f,-0.315203f, -0.459069f,0.843316f,-0.279417f, -0.469145f,0.829489f,-0.303069f, -0.440235f,0.819159f,-0.367657f, -0.420347f,0.792019f,-0.442734f, -0.528602f,0.735131f,-0.424456f, -0.540602f,0.708419f,-0.453752f, -0.493287f,0.777492f,-0.390095f, -0.304413f,0.86604f,-0.396619f, -0.0820709f,0.870144f,-0.485916f, -0.0884612f,0.883073f,-0.460823f, -0.0898563f,0.860973f,-0.500651f, --0.0421635f,0.844727f,-0.533535f, --0.161922f,0.847271f,-0.505878f, --0.14449f,0.888235f,-0.436074f, --0.171293f,0.877903f,-0.447153f, --0.137238f,0.90321f,-0.406666f, --0.254069f,0.918554f,-0.302831f, --0.505168f,0.843216f,-0.183829f, --0.675277f,0.734237f,-0.069976f, --0.653992f,0.755215f,0.0440947f, -0.0555085f,0.890635f,-0.451319f, -0.137334f,0.909799f,-0.39167f, -0.308301f,0.903589f,-0.297451f, -0.471952f,0.852104f,-0.226231f, -0.566013f,0.811602f,-0.144679f, -0.544915f,0.811135f,-0.212433f, -0.36963f,0.829124f,-0.419437f, -0.344038f,0.821377f,-0.454948f, -0.421617f,0.811326f,-0.404955f, -0.42674f,0.823996f,-0.372724f, -0.214619f,0.881696f,-0.42018f, -0.0910032f,0.951585f,-0.293606f, -0.0846967f,0.975495f,-0.203065f, --0.12731f,0.949549f,-0.286616f, --0.203708f,0.900619f,-0.383912f, --0.0136138f,0.94578f,-0.324521f, --0.1774f,0.907831f,-0.379963f, --0.319591f,0.828051f,-0.460644f, --0.309551f,0.868477f,-0.387202f, --0.350068f,0.908991f,-0.226245f, --0.314996f,0.908797f,-0.273615f, --0.0601423f,0.962735f,-0.263674f, -0.136393f,0.973573f,-0.183175f, -0.0532739f,0.976623f,-0.208255f, --0.105007f,0.973025f,-0.205419f, --0.20872f,0.948662f,-0.237649f, --0.0905915f,0.950284f,-0.297915f, -0.0475864f,0.961005f,-0.272405f, -0.0362517f,0.97079f,-0.237174f, -0.105725f,0.948531f,-0.298516f, -0.162566f,0.915122f,-0.368949f, -0.273546f,0.895769f,-0.350385f, -0.484941f,0.844255f,-0.228179f, -0.616479f,0.776457f,-0.130645f, -0.628311f,0.758456f,-0.173119f, -0.646758f,0.730427f,-0.2195f, -0.713832f,0.657703f,-0.240564f, -0.670883f,0.685042f,-0.283959f, -0.484582f,0.813502f,-0.32155f, -0.374759f,0.869215f,-0.322522f, -0.442437f,0.844514f,-0.301738f, -0.417442f,0.841211f,-0.343666f, -0.423405f,0.844004f,-0.329219f, -0.51768f,0.821209f,-0.240049f, -0.452859f,0.851327f,-0.264878f, -0.509187f,0.825405f,-0.243796f, -0.514747f,0.798114f,-0.313129f, -0.470791f,0.788824f,-0.395111f, -0.531455f,0.747848f,-0.397843f, -0.533283f,0.783064f,-0.32003f, -0.426956f,0.884256f,-0.18921f, -0.350467f,0.920762f,-0.171379f, -0.166727f,0.944055f,-0.284537f, -0.0641204f,0.940994f,-0.332292f, -0.176576f,0.941646f,-0.286573f, -0.033479f,0.945913f,-0.322688f, --0.166217f,0.885456f,-0.433982f, --0.211415f,0.849321f,-0.483692f, --0.245686f,0.873508f,-0.420264f, --0.318583f,0.913339f,-0.253606f, --0.37482f,0.927017f,-0.0122188f, --0.519112f,0.853899f,0.0371293f, --0.674751f,0.732141f,-0.0931649f, --0.717847f,0.685588f,-0.121095f, -0.129526f,0.933398f,-0.33465f, -0.109756f,0.909727f,-0.400439f, -0.235187f,0.88528f,-0.401206f, -0.43527f,0.839228f,-0.32594f, -0.509145f,0.799028f,-0.319883f, -0.559944f,0.774395f,-0.294577f, -0.481154f,0.808934f,-0.337812f, -0.346903f,0.826321f,-0.443681f, -0.419785f,0.810323f,-0.408849f, -0.424579f,0.803602f,-0.417081f, -0.213763f,0.882039f,-0.419896f, --0.065439f,0.903315f,-0.423958f, --0.0365788f,0.953894f,-0.297908f, --0.052968f,0.984136f,-0.169324f, --0.178873f,0.950393f,-0.254476f, --0.13588f,0.955299f,-0.262566f, --0.0549577f,0.986053f,-0.157096f, --0.250853f,0.921347f,-0.296972f, --0.383387f,0.86801f,-0.31555f, --0.39517f,0.874494f,-0.281248f, --0.297344f,0.903399f,-0.308961f, --0.146671f,0.942034f,-0.301762f, -0.0292749f,0.969498f,-0.243343f, -0.0315554f,0.994938f,-0.0954108f, --0.135353f,0.99076f,0.00864549f, --0.109362f,0.993969f,-0.00807889f, -0.00178341f,0.978683f,-0.205368f, -0.0583577f,0.951175f,-0.303086f, -0.0448944f,0.938747f,-0.341671f, -0.135893f,0.935013f,-0.327543f, -0.248098f,0.92828f,-0.277025f, -0.287291f,0.872499f,-0.395234f, -0.360517f,0.825037f,-0.435134f, -0.531263f,0.786524f,-0.314864f, -0.667801f,0.716872f,-0.200342f, -0.67932f,0.687853f,-0.2557f, -0.702261f,0.671608f,-0.236161f, -0.672702f,0.722764f,-0.15838f, -0.529805f,0.828764f,-0.180158f, -0.396956f,0.86756f,-0.29961f, -0.439447f,0.830334f,-0.342683f, -0.431898f,0.838796f,-0.33149f, -0.414335f,0.865026f,-0.282941f, -0.433505f,0.865399f,-0.251314f, -0.473777f,0.866492f,-0.157252f, -0.513796f,0.828002f,-0.224559f, -0.584841f,0.771201f,-0.251417f, -0.518412f,0.788719f,-0.330412f, -0.507007f,0.831445f,-0.227253f, -0.414775f,0.908203f,-0.0559478f, -0.370241f,0.92627f,0.07033f, -0.386742f,0.919823f,0.0659988f, -0.294152f,0.955333f,0.0285335f, -0.1108f,0.9849f,-0.133022f, -0.118551f,0.967697f,-0.222506f, -0.0772752f,0.978981f,-0.188747f, --0.0200413f,0.97522f,-0.220327f, --0.18076f,0.942791f,-0.280125f, --0.356914f,0.914544f,-0.190318f, --0.511643f,0.854464f,-0.0900754f, --0.529301f,0.843485f,0.0915077f, --0.481356f,0.855106f,0.192586f, --0.566596f,0.818312f,0.0966086f, --0.682392f,0.727753f,-0.0686784f, -0.232504f,0.952167f,-0.198291f, -0.256414f,0.932781f,-0.253323f, -0.252094f,0.888895f,-0.38251f, -0.391259f,0.847753f,-0.358095f, -0.537533f,0.80784f,-0.241771f, -0.561137f,0.803605f,-0.198354f, -0.542606f,0.822395f,-0.171013f, -0.447025f,0.853524f,-0.267703f, -0.421457f,0.829331f,-0.366857f, -0.381949f,0.841011f,-0.383165f, -0.196905f,0.918187f,-0.343745f, --0.0750719f,0.92165f,-0.380691f, --0.176435f,0.915143f,-0.362469f, --0.162121f,0.952528f,-0.257698f, --0.094717f,0.979068f,-0.180149f, --0.167752f,0.965606f,-0.198655f, --0.133367f,0.985758f,-0.102438f, --0.176519f,0.982527f,-0.0590077f, --0.382392f,0.914243f,-0.133925f, --0.379354f,0.898635f,-0.220329f, --0.2745f,0.907747f,-0.317246f, --0.107475f,0.924008f,-0.366959f, --0.0783766f,0.915897f,-0.393688f, --0.161723f,0.964079f,-0.210708f, --0.213776f,0.971922f,-0.0983248f, -0.0126393f,0.993361f,-0.114343f, -0.146279f,0.956353f,-0.252963f, -0.181548f,0.939791f,-0.289541f, -0.0719106f,0.91394f,-0.399427f, -0.0405362f,0.92481f,-0.378262f, -0.227996f,0.9289f,-0.291825f, -0.430007f,0.847434f,-0.311368f, -0.444003f,0.803436f,-0.396676f, -0.425815f,0.77314f,-0.470039f, -0.591393f,0.731624f,-0.339089f, -0.68448f,0.684033f,-0.252165f, -0.663878f,0.696032f,-0.273504f, -0.62681f,0.752096f,-0.203619f, -0.578478f,0.810023f,-0.0960529f, -0.535256f,0.829774f,-0.158038f, -0.488949f,0.817442f,-0.304496f, -0.370902f,0.857519f,-0.356501f, -0.349699f,0.870975f,-0.345126f, -0.374514f,0.863134f,-0.338731f, -0.45144f,0.856074f,-0.251673f, -0.565254f,0.789722f,-0.238384f, -0.610208f,0.775791f,-0.160605f, -0.460354f,0.88479f,-0.0722568f, -0.360414f,0.930663f,0.0629891f, -0.310809f,0.940565f,0.136874f, -0.344153f,0.923997f,0.166701f, -0.371378f,0.913473f,0.166271f, -0.349168f,0.916329f,0.196019f, -0.310264f,0.946182f,0.0920588f, -0.219218f,0.972739f,-0.075642f, -0.0579784f,0.994476f,-0.087501f, --0.0556996f,0.997544f,-0.0424565f, --0.239345f,0.970003f,0.0425244f, --0.461388f,0.876311f,0.138566f, --0.538726f,0.825514f,0.168229f, --0.597717f,0.791468f,0.127721f, --0.507215f,0.833365f,0.219627f, --0.488959f,0.84151f,0.229738f, --0.545304f,0.815937f,0.192066f, -0.227692f,0.931856f,-0.282489f, -0.297935f,0.90904f,-0.291343f, -0.353719f,0.876832f,-0.325652f, -0.346915f,0.865884f,-0.36041f, -0.409305f,0.867351f,-0.283145f, -0.519851f,0.844165f,-0.130922f, -0.531147f,0.844051f,-0.0738934f, -0.549452f,0.835136f,-0.0255055f, -0.519598f,0.847001f,-0.112281f, -0.416821f,0.899711f,-0.12954f, -0.213877f,0.961324f,-0.173531f, --0.0327967f,0.969436f,-0.243141f, --0.200151f,0.944585f,-0.26019f, --0.261086f,0.940261f,-0.218503f, --0.16617f,0.980036f,-0.109163f, --0.211362f,0.973049f,-0.0922088f, --0.262019f,0.96267f,-0.0679153f, --0.172722f,0.984229f,0.0382049f, --0.269464f,0.962867f,-0.0166155f, --0.289017f,0.944015f,-0.159073f, --0.146887f,0.958128f,-0.245795f, --0.0700562f,0.951312f,-0.300164f, --0.140619f,0.963564f,-0.227533f, --0.278995f,0.930049f,-0.239105f, --0.16269f,0.936868f,-0.309531f, -0.070144f,0.909561f,-0.409607f, -0.193776f,0.876857f,-0.43997f, -0.127038f,0.902686f,-0.411121f, -0.150617f,0.947884f,-0.280767f, -0.0386496f,0.919015f,-0.392324f, -0.208973f,0.868713f,-0.449075f, -0.403894f,0.796876f,-0.449287f, -0.495348f,0.781817f,-0.378673f, -0.489779f,0.764879f,-0.418421f, -0.499102f,0.742417f,-0.446893f, -0.648968f,0.690613f,-0.319208f, -0.677239f,0.687846f,-0.26118f, -0.512369f,0.799495f,-0.313506f, -0.465181f,0.863456f,-0.195064f, -0.589095f,0.803266f,-0.0879238f, -0.56026f,0.801619f,-0.208601f, -0.442292f,0.866151f,-0.232723f, -0.407485f,0.876049f,-0.257867f, -0.41887f,0.854839f,-0.306264f, -0.344336f,0.834896f,-0.429397f, -0.497957f,0.824163f,-0.269804f, -0.448098f,0.886678f,-0.114058f, -0.337837f,0.929162f,0.150081f, -0.341034f,0.908641f,0.240972f, -0.356163f,0.918925f,0.169481f, -0.332963f,0.932465f,0.140159f, -0.378366f,0.915215f,0.13864f, -0.366597f,0.926522f,0.0846395f, -0.364364f,0.925578f,0.102688f, -0.226565f,0.954799f,0.192424f, -0.0359845f,0.964557f,0.261408f, --0.155471f,0.954274f,0.255321f, --0.290268f,0.886689f,0.359898f, --0.467017f,0.828082f,0.31012f, --0.499403f,0.82291f,0.270953f, --0.565258f,0.797609f,0.210482f, --0.553063f,0.809532f,0.196925f, --0.499446f,0.823964f,0.267652f, --0.522286f,0.796771f,0.30393f, -0.282895f,0.896955f,-0.339766f, -0.328074f,0.870604f,-0.366628f, -0.343521f,0.854938f,-0.388683f, -0.333693f,0.867418f,-0.369101f, -0.350459f,0.883644f,-0.310405f, -0.440013f,0.868347f,-0.228826f, -0.488334f,0.85139f,-0.191483f, -0.49066f,0.852892f,-0.178404f, -0.509846f,0.855822f,-0.0873222f, -0.418823f,0.907869f,-0.0190138f, -0.288806f,0.957176f,-0.0201137f, -0.0497186f,0.992214f,-0.114191f, --0.215841f,0.960205f,-0.177253f, --0.338759f,0.933444f,-0.118004f, --0.242696f,0.969321f,-0.0389388f, --0.141909f,0.989578f,-0.0244358f, --0.270493f,0.952883f,-0.137288f, --0.235245f,0.967095f,-0.0968818f, --0.186427f,0.979041f,-0.0819931f, --0.181825f,0.962183f,-0.20284f, --0.135402f,0.958028f,-0.252681f, --0.153581f,0.96935f,-0.191767f, --0.186528f,0.978878f,-0.0837011f, --0.164286f,0.974581f,-0.152324f, -0.0119477f,0.951315f,-0.307988f, -0.181241f,0.876938f,-0.44512f, -0.193514f,0.837326f,-0.51131f, --0.00806995f,0.853668f,-0.520756f, -0.0461085f,0.918292f,-0.393209f, -0.210027f,0.898011f,-0.386606f, -0.313179f,0.820953f,-0.477447f, -0.395672f,0.762863f,-0.511355f, -0.407119f,0.752829f,-0.517206f, -0.491283f,0.735772f,-0.466133f, -0.508563f,0.731088f,-0.454835f, -0.557969f,0.720001f,-0.412637f, -0.635268f,0.712821f,-0.297187f, -0.514275f,0.818992f,-0.254505f, -0.384017f,0.888427f,-0.251454f, -0.535431f,0.823023f,-0.189597f, -0.597396f,0.79853f,-0.0739445f, -0.435766f,0.897283f,-0.0706489f, -0.387025f,0.91478f,-0.115713f, -0.532369f,0.842082f,-0.0864959f, -0.42055f,0.882636f,-0.209979f, -0.370951f,0.912219f,-0.173928f, -0.309089f,0.948381f,-0.0709704f, -0.21321f,0.976943f,0.0111471f, -0.331446f,0.943237f,0.0211533f, -0.410945f,0.911483f,0.0179772f, -0.321726f,0.946051f,-0.0384626f, -0.397145f,0.917286f,0.0293659f, -0.411757f,0.908804f,0.0673213f, -0.22276f,0.971882f,0.0763077f, -0.069501f,0.964908f,0.253224f, --0.028986f,0.93542f,0.352349f, --0.1774f,0.888082f,0.424074f, --0.313309f,0.830284f,0.460941f, --0.375142f,0.83463f,0.403313f, --0.455516f,0.824707f,0.335207f, --0.516585f,0.80896f,0.280577f, --0.560057f,0.80406f,0.199559f, --0.56953f,0.792393f,0.218515f, --0.567769f,0.776958f,0.271984f, -0.281384f,0.90217f,-0.326974f, -0.32181f,0.911348f,-0.256676f, -0.424167f,0.891125f,-0.16118f, -0.302129f,0.903121f,-0.305108f, -0.274213f,0.914554f,-0.297318f, -0.377666f,0.887315f,-0.264651f, -0.50458f,0.840574f,-0.197063f, -0.48044f,0.846134f,-0.230726f, -0.426379f,0.87586f,-0.225987f, -0.348305f,0.925694f,-0.147563f, -0.27972f,0.958581f,-0.053649f, -0.144728f,0.989215f,-0.0225097f, --0.168728f,0.979072f,-0.113791f, --0.360157f,0.915919f,-0.177143f, --0.292774f,0.933287f,-0.207987f, --0.10309f,0.983541f,-0.148387f, --0.174215f,0.960869f,-0.215359f, --0.250891f,0.918965f,-0.304233f, --0.150246f,0.940005f,-0.306294f, --0.0860686f,0.946791f,-0.310127f, --0.15131f,0.934427f,-0.322415f, --0.22276f,0.935306f,-0.27492f, --0.201088f,0.949203f,-0.242028f, --0.0437143f,0.949864f,-0.309592f, -0.109977f,0.887847f,-0.446802f, -0.297781f,0.833674f,-0.465096f, -0.214775f,0.818536f,-0.532795f, -0.0269455f,0.850361f,-0.52551f, --0.017632f,0.796129f,-0.60487f, -0.185146f,0.781388f,-0.595948f, -0.323386f,0.740218f,-0.589491f, -0.406653f,0.707179f,-0.578387f, -0.409551f,0.698057f,-0.587354f, -0.432954f,0.696782f,-0.57188f, -0.429959f,0.722053f,-0.54201f, -0.513634f,0.737641f,-0.438254f, -0.557438f,0.766448f,-0.319093f, -0.451237f,0.872287f,-0.188415f, -0.398866f,0.907449f,-0.132071f, -0.479702f,0.868398f,-0.125579f, -0.492136f,0.869715f,0.0373829f, -0.490052f,0.864036f,0.115287f, -0.467195f,0.882543f,-0.0533554f, -0.500676f,0.860686f,-0.092427f, -0.467521f,0.883982f,0.000254135f, -0.346172f,0.935182f,-0.0748316f, -0.285844f,0.955101f,-0.0779434f, -0.233788f,0.970423f,-0.0601792f, -0.33578f,0.93567f,-0.108509f, -0.44843f,0.890103f,-0.0814045f, -0.344049f,0.926181f,-0.154332f, -0.278254f,0.949058f,-0.147866f, -0.299653f,0.954043f,0.00333978f, -0.154533f,0.964067f,0.21609f, -0.0182142f,0.948347f,0.316711f, --0.116946f,0.954294f,0.275039f, --0.30019f,0.894483f,0.33134f, --0.320232f,0.867471f,0.380717f, --0.340655f,0.881399f,0.327246f, --0.432069f,0.860755f,0.269105f, --0.470649f,0.851696f,0.23044f, --0.520568f,0.837827f,0.164485f, --0.594362f,0.792684f,0.135598f, --0.629645f,0.760492f,0.15874f, -0.105475f,0.917668f,-0.383094f, -0.157333f,0.940076f,-0.302494f, -0.34936f,0.922619f,-0.163471f, -0.441147f,0.892415f,-0.0947875f, -0.353266f,0.911437f,-0.210916f, -0.379048f,0.861228f,-0.33854f, -0.442622f,0.833751f,-0.330068f, -0.481137f,0.838111f,-0.257053f, -0.418048f,0.882249f,-0.216499f, -0.270753f,0.936711f,-0.221958f, -0.184979f,0.961951f,-0.201082f, -0.112903f,0.979904f,-0.164442f, --0.0774318f,0.983977f,-0.160602f, --0.269214f,0.939575f,-0.211477f, --0.244405f,0.926884f,-0.284872f, --0.16522f,0.91825f,-0.359887f, --0.0697709f,0.937892f,-0.339838f, --0.121807f,0.888033f,-0.443351f, --0.178259f,0.862094f,-0.474361f, --0.173573f,0.911189f,-0.373641f, --0.145335f,0.940854f,-0.30606f, --0.196672f,0.897435f,-0.394881f, --0.142648f,0.86312f,-0.484434f, -0.079713f,0.828378f,-0.554469f, -0.216417f,0.76965f,-0.600668f, -0.249468f,0.776353f,-0.578828f, -0.204058f,0.841867f,-0.499621f, -0.0644049f,0.826788f,-0.558814f, -0.116412f,0.767322f,-0.630607f, -0.208898f,0.705315f,-0.677416f, -0.323537f,0.664792f,-0.673332f, -0.378749f,0.668133f,-0.640428f, -0.350681f,0.681998f,-0.641795f, -0.388988f,0.701053f,-0.597673f, -0.366172f,0.724838f,-0.583548f, -0.331191f,0.791609f,-0.513486f, -0.441902f,0.864123f,-0.240861f, -0.365381f,0.918735f,-0.149742f, -0.346761f,0.932102f,-0.104611f, -0.441617f,0.896164f,-0.0431763f, -0.429069f,0.903098f,0.0177174f, -0.509493f,0.859732f,0.035759f, -0.550737f,0.834518f,-0.0163997f, -0.446836f,0.894607f,0.00385291f, -0.489488f,0.868437f,0.0788584f, -0.430014f,0.900385f,-0.0662903f, -0.277285f,0.953602f,-0.117285f, -0.208284f,0.969937f,-0.12586f, -0.377184f,0.918436f,-0.119197f, -0.417651f,0.892053f,-0.172653f, -0.381197f,0.917074f,-0.116891f, -0.274507f,0.95009f,-0.148238f, -0.0946799f,0.989623f,-0.108088f, --0.059654f,0.986641f,0.151597f, --0.0667871f,0.959734f,0.272857f, --0.0714815f,0.942101f,0.327622f, --0.300084f,0.906469f,0.297092f, --0.336918f,0.914203f,0.225209f, --0.288002f,0.930996f,0.224278f, --0.416386f,0.886687f,0.201018f, --0.454428f,0.859405f,0.234346f, --0.478891f,0.849426f,0.221671f, --0.583336f,0.801078f,0.13414f, --0.664795f,0.744846f,0.0570272f, -0.0774054f,0.9409f,-0.329722f, -0.120466f,0.940242f,-0.318486f, -0.258377f,0.92069f,-0.292526f, -0.391172f,0.892344f,-0.225179f, -0.441921f,0.861239f,-0.250944f, -0.474164f,0.819484f,-0.321892f, -0.430001f,0.828794f,-0.358051f, -0.388327f,0.849227f,-0.357794f, -0.321794f,0.900086f,-0.293759f, -0.306798f,0.936469f,-0.170002f, -0.197413f,0.950888f,-0.238412f, -0.140677f,0.959941f,-0.242328f, --0.0738732f,0.952166f,-0.296516f, --0.264161f,0.917561f,-0.297155f, --0.156821f,0.939785f,-0.303665f, --0.074827f,0.921443f,-0.381239f, --0.0597443f,0.912887f,-0.403816f, --0.0722702f,0.937805f,-0.339556f, --0.223343f,0.933173f,-0.281613f, --0.284993f,0.906137f,-0.31256f, --0.17102f,0.941557f,-0.290212f, -0.0188228f,0.955829f,-0.29332f, -0.0949729f,0.880183f,-0.465036f, -0.154174f,0.836833f,-0.525301f, -0.175395f,0.823625f,-0.539331f, -0.0906162f,0.806123f,-0.584769f, -0.167569f,0.848038f,-0.502744f, -0.206981f,0.812951f,-0.544306f, -0.220466f,0.75453f,-0.618126f, -0.281661f,0.74367f,-0.606318f, -0.323085f,0.773947f,-0.544631f, -0.389827f,0.796004f,-0.463047f, -0.409468f,0.784217f,-0.466197f, -0.383754f,0.755374f,-0.531172f, -0.333252f,0.782449f,-0.526039f, -0.13472f,0.877229f,-0.460782f, -0.220453f,0.931705f,-0.288664f, -0.346271f,0.928921f,-0.131156f, -0.317872f,0.942854f,-0.0999207f, -0.41364f,0.908959f,-0.0519229f, -0.398453f,0.915561f,-0.0546188f, -0.505703f,0.862625f,-0.0119489f, -0.526627f,0.849939f,0.0163649f, -0.402553f,0.915142f,0.0215902f, -0.486926f,0.872826f,0.0328415f, -0.480317f,0.876602f,0.0293992f, -0.350224f,0.935385f,0.0489656f, -0.241613f,0.961192f,-0.13317f, -0.388714f,0.905381f,-0.170843f, -0.410083f,0.900693f,-0.14347f, -0.356005f,0.930194f,-0.0894385f, -0.273996f,0.955273f,-0.111267f, --0.044831f,0.997624f,-0.0523075f, --0.196423f,0.976135f,0.0926162f, --0.135564f,0.988784f,0.0626771f, --0.172489f,0.970476f,0.168594f, --0.254529f,0.9218f,0.292405f, --0.284378f,0.936305f,0.206065f, --0.327372f,0.917976f,0.223935f, --0.435353f,0.844597f,0.311647f, --0.503149f,0.802852f,0.319796f, --0.41775f,0.811758f,0.408086f, --0.454925f,0.830308f,0.321918f, --0.572823f,0.802298f,0.167904f, -0.20617f,0.937765f,-0.279448f, -0.12824f,0.920264f,-0.369687f, -0.239724f,0.89965f,-0.364914f, -0.406692f,0.839091f,-0.361286f, -0.450018f,0.81612f,-0.362535f, -0.486709f,0.828644f,-0.276522f, -0.440087f,0.85086f,-0.286985f, -0.416932f,0.85696f,-0.302962f, -0.239451f,0.901982f,-0.359293f, -0.202502f,0.927776f,-0.313409f, -0.221835f,0.941111f,-0.255147f, -0.127859f,0.963075f,-0.236935f, -0.0102396f,0.970361f,-0.241441f, --0.185811f,0.907396f,-0.376969f, --0.143f,0.87175f,-0.468618f, --0.054802f,0.895065f,-0.442557f, --0.153942f,0.908075f,-0.389489f, --0.214862f,0.949277f,-0.22958f, --0.226443f,0.961303f,-0.156909f, --0.189142f,0.939849f,-0.284446f, --0.183498f,0.904381f,-0.385258f, -0.0372666f,0.939229f,-0.341264f, -0.17942f,0.912891f,-0.366659f, -0.186987f,0.89504f,-0.404894f, -0.249987f,0.855827f,-0.452843f, -0.209164f,0.815071f,-0.540287f, -0.137636f,0.780743f,-0.609506f, -0.248264f,0.780183f,-0.574177f, -0.268876f,0.805155f,-0.528613f, -0.166884f,0.854291f,-0.492277f, -0.223895f,0.925944f,-0.304136f, -0.382591f,0.903499f,-0.193167f, -0.505015f,0.839819f,-0.199159f, -0.522375f,0.816711f,-0.245169f, -0.295143f,0.898426f,-0.32515f, -0.045309f,0.962545f,-0.26731f, -0.0698554f,0.972543f,-0.221991f, -0.23803f,0.966556f,-0.0954522f, -0.24345f,0.969904f,-0.00421011f, -0.387893f,0.915554f,0.106303f, -0.388608f,0.912695f,0.126382f, -0.452964f,0.880246f,0.141388f, -0.553021f,0.816379f,0.166411f, -0.46714f,0.881043f,0.0744546f, -0.450683f,0.892414f,0.0219511f, -0.444978f,0.886482f,0.127064f, -0.382178f,0.921652f,0.0670691f, -0.411319f,0.911388f,-0.0137033f, -0.389838f,0.919191f,-0.0558004f, -0.35617f,0.934375f,0.0092699f, -0.326889f,0.943423f,0.0556465f, -0.261297f,0.961477f,0.0853544f, --0.107365f,0.988428f,0.107158f, --0.198313f,0.974378f,0.106114f, --0.119767f,0.989964f,0.0750203f, --0.291683f,0.947022f,0.134427f, --0.31644f,0.92799f,0.196723f, --0.289311f,0.932636f,0.215615f, --0.411791f,0.85345f,0.319455f, --0.469106f,0.777331f,0.419161f, --0.481552f,0.76826f,0.421765f, --0.441444f,0.803246f,0.399904f, --0.347505f,0.834501f,0.427607f, --0.388172f,0.828163f,0.404313f, -0.166663f,0.855647f,-0.489991f, -0.206118f,0.852788f,-0.479863f, -0.253643f,0.809648f,-0.529278f, -0.34663f,0.798296f,-0.492515f, -0.334799f,0.852879f,-0.400633f, -0.411503f,0.867459f,-0.279608f, -0.469719f,0.846111f,-0.251912f, -0.425418f,0.857617f,-0.288986f, -0.321984f,0.890401f,-0.321733f, -0.13105f,0.897315f,-0.421487f, -0.163065f,0.944711f,-0.284482f, -0.0880681f,0.960841f,-0.262734f, -0.0835185f,0.96106f,-0.263417f, --0.0250069f,0.943064f,-0.33167f, --0.080502f,0.931121f,-0.355714f, --0.129429f,0.916002f,-0.379721f, --0.246145f,0.898013f,-0.36467f, --0.295885f,0.891242f,-0.343715f, --0.176282f,0.915144f,-0.362541f, --0.0418985f,0.91018f,-0.412089f, --0.0774111f,0.852502f,-0.51696f, --0.0321668f,0.826692f,-0.561735f, -0.194406f,0.844754f,-0.498595f, -0.282885f,0.80862f,-0.515859f, -0.302949f,0.736294f,-0.605056f, -0.233445f,0.738314f,-0.632768f, -0.172128f,0.759349f,-0.627504f, -0.112225f,0.79134f,-0.600988f, -0.137255f,0.870359f,-0.472902f, -0.0541041f,0.935131f,-0.350147f, -0.048453f,0.960354f,-0.274541f, -0.350102f,0.918679f,-0.182913f, -0.524752f,0.830609f,-0.186344f, -0.518158f,0.835225f,-0.184147f, -0.313736f,0.944893f,-0.0935296f, -0.0308812f,0.997052f,-0.070238f, -0.048477f,0.985949f,-0.159858f, -0.14972f,0.972865f,-0.1764f, -0.155626f,0.983809f,-0.0888849f, -0.284416f,0.958659f,0.0089454f, -0.3659f,0.926807f,0.0845335f, -0.421454f,0.897257f,0.131556f, -0.563402f,0.804293f,0.188919f, -0.539736f,0.827553f,0.154408f, -0.404327f,0.91158f,0.0744378f, -0.452914f,0.883943f,0.116249f, -0.458215f,0.8862f,0.0684684f, -0.412404f,0.90336f,0.117745f, -0.337667f,0.93426f,0.114626f, -0.331072f,0.928113f,0.170285f, -0.265924f,0.943818f,0.196193f, -0.193837f,0.929607f,0.313462f, --0.0688814f,0.919176f,0.387776f, --0.142537f,0.930406f,0.33768f, --0.12463f,0.963373f,0.237444f, --0.336333f,0.924835f,0.17765f, --0.311125f,0.930755f,0.192081f, --0.359893f,0.911001f,0.201382f, --0.532454f,0.800855f,0.274086f, --0.552598f,0.767696f,0.324466f, --0.457025f,0.795874f,0.39713f, --0.406778f,0.834647f,0.371344f, --0.39211f,0.844207f,0.365466f, --0.407171f,0.83024f,0.380675f, -0.088004f,0.820624f,-0.564651f, -0.180508f,0.82686f,-0.532654f, -0.264125f,0.820464f,-0.507027f, -0.247967f,0.854234f,-0.456943f, -0.24322f,0.902001f,-0.356704f, -0.342999f,0.897422f,-0.277462f, -0.495739f,0.849894f,-0.178668f, -0.449958f,0.858561f,-0.245787f, -0.384562f,0.884942f,-0.262659f, -0.158931f,0.931299f,-0.327755f, --0.00482349f,0.936712f,-0.350067f, -0.115045f,0.961792f,-0.248435f, -0.108639f,0.956333f,-0.271339f, --0.0605962f,0.963938f,-0.259135f, --0.116693f,0.974935f,-0.189434f, --0.0876965f,0.975552f,-0.201512f, --0.158272f,0.938607f,-0.30654f, --0.195709f,0.870225f,-0.452113f, --0.139804f,0.831767f,-0.537233f, --0.0224753f,0.834621f,-0.550366f, -0.0691358f,0.82738f,-0.557371f, -0.021368f,0.778901f,-0.626782f, -0.103745f,0.763834f,-0.637021f, -0.295282f,0.754578f,-0.586021f, -0.391718f,0.767187f,-0.507919f, -0.243831f,0.78308f,-0.57213f, -0.0624167f,0.795727f,-0.60243f, -0.0157622f,0.882125f,-0.470752f, --0.0549233f,0.922741f,-0.381487f, --0.0376875f,0.97f,-0.240167f, -0.0506221f,0.974297f,-0.219507f, -0.328414f,0.911788f,-0.246548f, -0.524714f,0.832523f,-0.177709f, -0.470173f,0.873047f,-0.12933f, -0.188699f,0.978079f,-0.0880599f, -0.0393835f,0.999181f,-0.00932192f, -0.202516f,0.978334f,-0.0430044f, -0.188361f,0.964087f,-0.187232f, -0.0636833f,0.962187f,-0.264841f, -0.180234f,0.965248f,-0.18924f, -0.346543f,0.937198f,-0.0395955f, -0.331037f,0.942573f,-0.0443968f, -0.504726f,0.851052f,0.144785f, -0.565376f,0.80039f,0.199312f, -0.492317f,0.859822f,0.135391f, -0.448961f,0.892857f,0.0352157f, -0.367625f,0.92412f,0.104186f, -0.329385f,0.906428f,0.264373f, -0.348699f,0.881448f,0.318526f, -0.290794f,0.899496f,0.326107f, -0.185082f,0.919339f,0.347219f, -0.0676347f,0.907778f,0.413962f, --0.145808f,0.884054f,0.444059f, --0.0815232f,0.884669f,0.459037f, -0.0810938f,0.898461f,0.431499f, --0.248842f,0.934053f,0.256168f, --0.367995f,0.892045f,0.262364f, --0.356163f,0.871443f,0.337246f, --0.546503f,0.805165f,0.230312f, --0.590616f,0.793807f,0.145063f, --0.541291f,0.82267f,0.173836f, --0.431572f,0.851071f,0.299038f, --0.381298f,0.858781f,0.342208f, --0.443875f,0.85724f,0.260987f, -0.118157f,0.850415f,-0.512673f, -0.134653f,0.857894f,-0.49587f, -0.229214f,0.896945f,-0.378087f, -0.208074f,0.910502f,-0.35734f, -0.182505f,0.899208f,-0.397639f, -0.219865f,0.895989f,-0.385828f, -0.451196f,0.865461f,-0.217713f, -0.490084f,0.844039f,-0.217752f, -0.378309f,0.899823f,-0.217259f, -0.231483f,0.942802f,-0.239876f, -0.0439163f,0.94313f,-0.329511f, -0.0365981f,0.93055f,-0.364332f, -0.0406622f,0.963235f,-0.265566f, --0.0474005f,0.988537f,-0.143342f, --0.135564f,0.953464f,-0.269312f, --0.0159099f,0.95648f,-0.291363f, -6.71815e-006f,0.933398f,-0.358843f, --0.0477574f,0.880875f,-0.470933f, --0.0515582f,0.822668f,-0.56618f, -0.00280332f,0.78244f,-0.62272f, -0.0365076f,0.790824f,-0.610954f, -0.0809221f,0.832084f,-0.548715f, -0.112086f,0.801748f,-0.587057f, -0.219407f,0.814817f,-0.536594f, -0.31647f,0.811557f,-0.491143f, -0.326532f,0.816359f,-0.476376f, -0.0311646f,0.874097f,-0.484751f, --0.166146f,0.898216f,-0.406943f, --0.145486f,0.939877f,-0.308975f, --0.113562f,0.952885f,-0.281273f, -0.0633693f,0.957888f,-0.280063f, -0.322061f,0.911056f,-0.257398f, -0.438519f,0.889327f,-0.12961f, -0.430695f,0.901938f,0.0317863f, -0.232727f,0.970972f,0.0552405f, -0.0388751f,0.995464f,-0.0868351f, -0.197289f,0.970749f,-0.136837f, -0.308804f,0.945817f,-0.100347f, -0.177873f,0.966831f,-0.183299f, -0.0327621f,0.970738f,-0.237896f, -0.244781f,0.968393f,-0.0479323f, -0.27827f,0.960269f,-0.0211936f, -0.355239f,0.931705f,0.0757045f, -0.555707f,0.816071f,0.158801f, -0.563884f,0.814994f,0.133487f, -0.420142f,0.89843f,0.127685f, -0.31027f,0.90429f,0.293243f, -0.233723f,0.926208f,0.295826f, -0.272016f,0.906457f,0.323021f, -0.267428f,0.881549f,0.389042f, -0.161017f,0.891985f,0.422417f, -0.0459966f,0.878435f,0.475642f, --0.0917474f,0.877231f,0.47122f, --0.0819927f,0.91503f,0.394964f, -0.108269f,0.907964f,0.40482f, --0.16221f,0.904236f,0.395026f, --0.422279f,0.840786f,0.338761f, --0.374364f,0.835182f,0.402893f, --0.384829f,0.826017f,0.411828f, --0.512379f,0.829197f,0.223383f, --0.585197f,0.801652f,0.122056f, --0.526709f,0.831787f,0.175237f, --0.374079f,0.907515f,0.191003f, --0.329797f,0.931547f,0.153144f, -0.105779f,0.878895f,-0.465138f, -0.0405535f,0.897741f,-0.438654f, -0.106545f,0.927041f,-0.359504f, -0.255352f,0.917446f,-0.305103f, -0.298997f,0.88918f,-0.346352f, -0.205215f,0.859845f,-0.467497f, -0.304244f,0.842016f,-0.445471f, -0.435228f,0.863678f,-0.254238f, -0.39753f,0.896082f,-0.197502f, -0.268558f,0.910516f,-0.314385f, -0.0970216f,0.931439f,-0.350727f, -0.0336528f,0.944013f,-0.328188f, --0.0988412f,0.948055f,-0.302362f, --0.0597673f,0.966409f,-0.249964f, -0.0558923f,0.934228f,-0.352269f, --0.00489276f,0.88655f,-0.462606f, -0.0451038f,0.899627f,-0.434323f, -0.0627933f,0.870215f,-0.488654f, -0.0536848f,0.846805f,-0.529187f, -0.0729181f,0.867797f,-0.491539f, --0.0450251f,0.86132f,-0.506063f, -0.0321391f,0.857039f,-0.514249f, -0.105366f,0.853869f,-0.509711f, -0.20021f,0.860626f,-0.468229f, -0.336826f,0.823703f,-0.456137f, -0.291163f,0.890761f,-0.348954f, --0.0337704f,0.937324f,-0.34682f, --0.238938f,0.893089f,-0.381184f, --0.1654f,0.905926f,-0.389797f, --0.0746684f,0.904792f,-0.419256f, -0.0731105f,0.895556f,-0.438901f, -0.199233f,0.902713f,-0.381334f, -0.277877f,0.941082f,-0.192742f, -0.300522f,0.95354f,-0.0211427f, -0.316945f,0.945681f,0.0723468f, -0.218722f,0.970853f,-0.0980014f, -0.256356f,0.93882f,-0.229999f, -0.242436f,0.93442f,-0.26093f, -0.1983f,0.960329f,-0.196077f, -0.00223103f,0.977894f,-0.209089f, -0.104164f,0.98625f,-0.128296f, -0.285507f,0.957716f,-0.0355725f, -0.283907f,0.956269f,-0.0703361f, -0.529334f,0.848145f,0.0213636f, -0.533064f,0.836918f,0.124145f, -0.319483f,0.916151f,0.242069f, -0.17728f,0.930248f,0.321263f, -0.27524f,0.891192f,0.360581f, -0.317681f,0.901882f,0.292724f, -0.194688f,0.951543f,0.23804f, -0.108971f,0.911619f,0.396329f, --0.0300123f,0.895185f,0.444683f, --0.0818392f,0.875146f,0.476887f, --0.0034355f,0.872809f,0.48805f, -0.0854438f,0.889906f,0.448069f, --0.143928f,0.891079f,0.430422f, --0.400827f,0.846578f,0.350204f, --0.436121f,0.820693f,0.369135f, --0.389169f,0.817738f,0.42409f, --0.354493f,0.838309f,0.414212f, --0.495629f,0.825913f,0.268736f, --0.491187f,0.862049f,0.124928f, --0.360891f,0.926358f,0.107794f, --0.272797f,0.945677f,0.17685f, --0.0230447f,0.8982f,-0.438983f, --0.0253824f,0.922509f,-0.38514f, -0.0868314f,0.93389f,-0.346856f, -0.228815f,0.908408f,-0.349913f, -0.325232f,0.887343f,-0.326875f, -0.342601f,0.877959f,-0.334385f, -0.256841f,0.884237f,-0.390073f, -0.281416f,0.889548f,-0.359874f, -0.383834f,0.865745f,-0.321181f, -0.3194f,0.893039f,-0.316962f, -0.102059f,0.965529f,-0.239452f, --0.0466698f,0.958891f,-0.279912f, --0.0536344f,0.964707f,-0.257804f, --0.0261637f,0.940106f,-0.339875f, -0.144391f,0.948897f,-0.280616f, -0.0981473f,0.936323f,-0.337144f, -0.012852f,0.869861f,-0.493129f, -0.144402f,0.872896f,-0.466049f, --0.00636809f,0.871363f,-0.490597f, --0.0613187f,0.915967f,-0.396541f, -0.0199429f,0.949099f,-0.314346f, -0.0355652f,0.92816f,-0.370479f, -0.140076f,0.947915f,-0.286071f, -0.222188f,0.910114f,-0.349749f, -0.215543f,0.917499f,-0.33427f, -0.183013f,0.971215f,-0.152469f, -0.0390344f,0.988083f,-0.14889f, --0.127226f,0.955382f,-0.266569f, --0.116102f,0.92344f,-0.365757f, --0.0309649f,0.920225f,-0.390164f, -0.00625843f,0.924708f,-0.380627f, -0.101949f,0.952725f,-0.286221f, -0.10526f,0.958946f,-0.263332f, -0.1589f,0.975537f,-0.151918f, -0.291601f,0.956292f,-0.0217678f, -0.33385f,0.942155f,0.0297851f, -0.349208f,0.937042f,0.00260008f, -0.278057f,0.953965f,-0.112407f, -0.149531f,0.968881f,-0.197256f, --0.00612536f,0.988275f,-0.152563f, --0.00797921f,0.994274f,-0.106558f, -0.301027f,0.953574f,-0.00894642f, -0.304582f,0.944145f,-0.125778f, -0.403446f,0.913254f,-0.0565483f, -0.37426f,0.908704f,0.184893f, -0.255667f,0.895707f,0.363791f, -0.219787f,0.909558f,0.352701f, -0.267099f,0.929513f,0.254289f, -0.378434f,0.885367f,0.270025f, -0.147409f,0.95291f,0.265015f, --0.0634097f,0.932842f,0.354663f, --0.0326192f,0.907501f,0.418782f, --0.118713f,0.911859f,0.392963f, --0.0609125f,0.902157f,0.427087f, -0.138333f,0.871993f,0.469567f, --0.0649916f,0.904886f,0.420664f, --0.383734f,0.861279f,0.333085f, --0.474942f,0.817835f,0.324924f, --0.422908f,0.836367f,0.348768f, --0.339416f,0.853379f,0.395651f, --0.324702f,0.875389f,0.358137f, --0.41353f,0.899847f,0.138815f, --0.448451f,0.884614f,0.12787f, --0.414049f,0.866279f,0.279505f, -0.070634f,0.912028f,-0.404001f, --0.0676482f,0.885638f,-0.459422f, -0.0565435f,0.906984f,-0.417353f, -0.246119f,0.879096f,-0.408185f, -0.292529f,0.859337f,-0.419485f, -0.280896f,0.904751f,-0.320192f, -0.320721f,0.917291f,-0.23604f, -0.350916f,0.874365f,-0.335178f, -0.376904f,0.866371f,-0.327636f, -0.17512f,0.962866f,-0.205478f, -0.0176642f,0.987314f,-0.157793f, -0.0227212f,0.982851f,-0.182998f, -0.0272561f,0.971904f,-0.233795f, --0.0877209f,0.950392f,-0.298429f, -0.0166276f,0.994097f,-0.107211f, -0.266845f,0.962366f,-0.0514236f, -0.216132f,0.934464f,-0.282956f, -0.0993362f,0.906446f,-0.410472f, --0.0104212f,0.924877f,-0.380123f, --0.166185f,0.907878f,-0.384889f, --0.0197905f,0.953108f,-0.301983f, --0.0183125f,0.962192f,-0.271757f, -0.0845408f,0.976284f,-0.199307f, -0.269635f,0.943751f,-0.191394f, -0.189274f,0.968047f,-0.164501f, -0.102539f,0.979864f,-0.171327f, -0.106979f,0.970988f,-0.213865f, --0.0373949f,0.962501f,-0.268688f, --0.0919497f,0.957563f,-0.273163f, --0.0692205f,0.979823f,-0.187497f, --0.0661107f,0.993399f,-0.093741f, -0.0537161f,0.998551f,0.00311785f, -0.163558f,0.98647f,-0.0111964f, -0.128373f,0.980868f,-0.146347f, -0.126964f,0.974881f,-0.182993f, -0.228868f,0.973261f,0.0195364f, -0.336464f,0.933228f,0.126005f, -0.409696f,0.899435f,0.152205f, -0.227221f,0.973118f,0.0375761f, --0.0400449f,0.999001f,-0.0198394f, --0.0832424f,0.995769f,-0.0389306f, -0.262425f,0.963268f,0.0569854f, -0.380638f,0.919787f,0.0954299f, -0.267185f,0.959941f,0.0844166f, -0.200067f,0.945675f,0.256267f, -0.180437f,0.922348f,0.341639f, -0.274022f,0.906356f,0.321607f, -0.375587f,0.88639f,0.270641f, -0.289567f,0.933145f,0.213051f, -0.118001f,0.9078f,0.402461f, --0.100351f,0.886215f,0.452275f, --0.0321373f,0.879207f,0.475355f, --0.064732f,0.903306f,0.424085f, --0.117284f,0.933968f,0.337563f, -0.107835f,0.909874f,0.400625f, --0.00684675f,0.915037f,0.403311f, --0.3665f,0.879987f,0.302161f, --0.484488f,0.825175f,0.290444f, --0.455029f,0.825809f,0.33315f, --0.355514f,0.861697f,0.362061f, --0.249905f,0.90704f,0.338859f, --0.283441f,0.915216f,0.286426f, --0.489082f,0.840765f,0.232193f, --0.566036f,0.779585f,0.26805f, -0.300059f,0.882066f,-0.363212f, -0.0511478f,0.860745f,-0.506461f, -0.0202137f,0.82997f,-0.557442f, -0.244641f,0.828925f,-0.503024f, -0.229733f,0.86489f,-0.446306f, -0.151553f,0.888421f,-0.433289f, -0.276054f,0.875076f,-0.397538f, -0.35746f,0.874812f,-0.326997f, -0.20869f,0.962246f,-0.174729f, -0.135202f,0.98952f,0.050694f, -0.0768682f,0.997036f,0.00329808f, -0.0854955f,0.992826f,-0.08359f, -0.0751533f,0.982531f,-0.170249f, --0.0858423f,0.966447f,-0.242097f, --0.101218f,0.962967f,-0.2499f, -0.245897f,0.943422f,-0.222463f, -0.411229f,0.896277f,-0.166064f, -0.160383f,0.921177f,-0.354556f, -0.0135902f,0.93936f,-0.342662f, --0.185366f,0.907574f,-0.37676f, --0.130182f,0.940725f,-0.313191f, --0.0326676f,0.972591f,-0.230215f, -0.0675199f,0.972602f,-0.222457f, -0.233107f,0.94649f,-0.2232f, -0.212831f,0.95378f,-0.212148f, -0.167019f,0.9356f,-0.311059f, -0.16946f,0.90555f,-0.388925f, --0.0763448f,0.914067f,-0.398312f, --0.178349f,0.9565f,-0.230865f, --0.221816f,0.964561f,-0.142896f, --0.163528f,0.986246f,-0.0240246f, --0.0459992f,0.998297f,0.0358721f, -0.192503f,0.971257f,0.140008f, -0.306262f,0.942491f,0.133843f, -0.166989f,0.985549f,-0.0284312f, -0.110164f,0.988175f,-0.106645f, -0.230491f,0.969982f,-0.0775155f, -0.320779f,0.937031f,0.138109f, -0.2844f,0.912116f,0.295231f, -0.0676957f,0.97278f,0.221621f, --0.0445371f,0.996486f,0.0709375f, -0.140086f,0.988598f,0.0552233f, -0.294951f,0.934183f,0.200765f, -0.239076f,0.923996f,0.298453f, -0.115077f,0.947116f,0.299546f, -0.169084f,0.942486f,0.288323f, -0.304609f,0.90997f,0.281369f, -0.369662f,0.880322f,0.297294f, -0.206677f,0.906857f,0.36728f, --0.0427609f,0.882729f,0.467933f, --0.167345f,0.859324f,0.483279f, --0.0302574f,0.860894f,0.507884f, -0.0910322f,0.886636f,0.453421f, --0.0366606f,0.947171f,0.318627f, -0.025939f,0.94095f,0.337552f, -0.0591946f,0.91956f,0.388466f, --0.284221f,0.911546f,0.297158f, --0.532586f,0.813173f,0.234739f, --0.487487f,0.825499f,0.284445f, --0.31853f,0.893358f,0.316938f, --0.238637f,0.92505f,0.295524f, --0.265409f,0.911937f,0.312937f, --0.505062f,0.827653f,0.244749f, --0.589625f,0.757122f,0.281262f, -0.260545f,0.875981f,-0.405923f, -0.198469f,0.90372f,-0.379342f, -0.0608985f,0.867502f,-0.493691f, -0.108599f,0.877043f,-0.467977f, -0.149016f,0.918586f,-0.366053f, -0.269933f,0.909568f,-0.315946f, -0.225091f,0.894351f,-0.386613f, -0.14483f,0.975181f,-0.16747f, -0.0237141f,0.999718f,0.00125985f, -0.0312597f,0.997955f,0.0557504f, -0.105656f,0.993029f,0.0522575f, -0.205288f,0.977382f,0.0508146f, -0.175007f,0.977751f,-0.115656f, -0.0411408f,0.976103f,-0.213378f, --0.0123853f,0.935985f,-0.351821f, -0.185506f,0.902134f,-0.38954f, -0.361594f,0.882471f,-0.300824f, -0.229178f,0.926898f,-0.297216f, --0.016076f,0.953923f,-0.299621f, --0.176229f,0.940869f,-0.289326f, --0.197595f,0.933757f,-0.298419f, --0.0925101f,0.952321f,-0.290735f, -0.0363018f,0.966473f,-0.254189f, -0.27059f,0.939141f,-0.211649f, -0.283887f,0.910685f,-0.300101f, -0.267987f,0.87929f,-0.39374f, -0.167837f,0.906306f,-0.387866f, --0.162045f,0.958045f,-0.236411f, --0.34242f,0.923851f,-0.171018f, --0.280408f,0.954479f,-0.101693f, --0.219474f,0.974995f,-0.0348799f, --0.111179f,0.993643f,0.0176973f, -0.0791225f,0.990452f,0.112896f, -0.243665f,0.947394f,0.207537f, -0.282223f,0.914505f,0.289882f, -0.280685f,0.943977f,0.173563f, -0.165641f,0.985889f,-0.0242044f, -0.0702016f,0.994363f,0.0794649f, -0.118053f,0.960325f,0.252664f, -0.204772f,0.904931f,0.373051f, -0.0632983f,0.962848f,0.262521f, -0.122554f,0.958346f,0.257978f, -0.174517f,0.943136f,0.28291f, -0.181765f,0.923678f,0.337315f, -0.176745f,0.924152f,0.338681f, -0.201711f,0.945597f,0.255262f, -0.29766f,0.929054f,0.219676f, -0.268359f,0.928086f,0.258147f, -0.100906f,0.896734f,0.430912f, --0.0388415f,0.876619f,0.479615f, --0.130193f,0.899332f,0.417434f, -0.000668505f,0.914851f,0.403791f, -0.198601f,0.908384f,0.367961f, -0.0382447f,0.953766f,0.298106f, --0.0134843f,0.968824f,0.247384f, -0.0247843f,0.964757f,0.261972f, --0.214942f,0.928034f,0.304224f, --0.51491f,0.834181f,0.197508f, --0.514132f,0.845f,0.147116f, --0.364403f,0.910649f,0.194754f, --0.252308f,0.925047f,0.283953f, --0.245043f,0.926077f,0.286941f, --0.475784f,0.852889f,0.214964f, --0.66621f,0.724577f,0.176499f, -0.0831836f,0.888999f,-0.45029f, -0.181271f,0.909397f,-0.374349f, -0.118635f,0.893305f,-0.433511f, -0.0803087f,0.896743f,-0.435204f, -0.0532614f,0.909245f,-0.41284f, -0.209897f,0.941844f,-0.262435f, -0.164344f,0.979747f,-0.114402f, --0.0796744f,0.996148f,-0.0366233f, --0.0133458f,0.996096f,0.0872637f, -0.0764545f,0.99532f,0.0590999f, -0.136206f,0.990597f,0.0128964f, -0.22076f,0.975032f,-0.0240476f, -0.302428f,0.952936f,-0.021205f, -0.123508f,0.990766f,-0.0559322f, -0.0598433f,0.996046f,-0.06566f, -0.217088f,0.972764f,-0.0812636f, -0.324106f,0.93941f,-0.111642f, -0.231973f,0.969426f,-0.0800149f, --0.0239272f,0.988929f,-0.146448f, --0.168479f,0.969286f,-0.179165f, --0.198758f,0.9628f,-0.183064f, --0.0847832f,0.988177f,-0.12774f, --0.00304443f,0.993662f,-0.112364f, -0.297886f,0.949812f,-0.0955022f, -0.392699f,0.900627f,-0.186169f, -0.309254f,0.921444f,-0.235165f, --0.0368216f,0.992281f,-0.118418f, --0.30784f,0.939111f,0.152661f, --0.339391f,0.929078f,0.147065f, --0.31987f,0.942094f,0.100706f, --0.261939f,0.955297f,0.137099f, --0.18149f,0.977639f,0.106224f, --0.0176854f,0.987381f,0.157371f, -0.134774f,0.952305f,0.273773f, -0.227558f,0.898637f,0.375058f, -0.367312f,0.872839f,0.3213f, -0.289472f,0.940027f,0.180432f, -0.0121921f,0.995617f,0.0927227f, --0.0151053f,0.984704f,0.173582f, -0.12465f,0.941586f,0.312855f, -0.123765f,0.936041f,0.329407f, -0.0496474f,0.956015f,0.289087f, -0.155803f,0.919433f,0.361065f, -0.180039f,0.912678f,0.366885f, -0.192318f,0.910529f,0.365993f, -0.269572f,0.892548f,0.361509f, -0.331198f,0.898525f,0.288029f, -0.198758f,0.948186f,0.247866f, --0.0345441f,0.951973f,0.304226f, --0.0327497f,0.929484f,0.367404f, --0.0643392f,0.937143f,0.342962f, -0.00774044f,0.965859f,0.258952f, -0.179174f,0.948429f,0.261495f, -0.132443f,0.935778f,0.32677f, -0.0607758f,0.973146f,0.222018f, --0.0289622f,0.977742f,0.2078f, --0.247283f,0.928769f,0.276114f, --0.440694f,0.866976f,0.232681f, --0.493254f,0.853754f,0.166745f, --0.437376f,0.881741f,0.176734f, --0.303558f,0.920161f,0.247297f, --0.230002f,0.942128f,0.243914f, --0.435382f,0.879414f,0.192544f, --0.672886f,0.738322f,0.045878f, -0.0719528f,0.93004f,-0.360345f, -0.170321f,0.920666f,-0.351232f, -0.181011f,0.922477f,-0.340985f, -0.0828362f,0.939404f,-0.332654f, --0.0227994f,0.947238f,-0.31972f, --0.0485785f,0.963562f,-0.263036f, -0.0586424f,0.995988f,-0.0676002f, --0.0660447f,0.996659f,-0.0480482f, --0.0602898f,0.992772f,-0.103773f, -0.058767f,0.996066f,-0.0663303f, -0.189158f,0.981943f,0.00282556f, -0.237805f,0.968932f,-0.0679702f, -0.226076f,0.973949f,-0.0176966f, -0.0903031f,0.990597f,0.102775f, -0.00876316f,0.995102f,0.0984623f, -0.239141f,0.958139f,0.157419f, -0.358816f,0.926379f,0.11434f, -0.290281f,0.955997f,0.0425008f, -0.0827916f,0.995067f,-0.054651f, --0.14974f,0.985436f,-0.0805802f, --0.250148f,0.9681f,-0.0144092f, --0.190918f,0.980525f,0.0460446f, -0.000678111f,0.99542f,0.0955933f, -0.316233f,0.948486f,0.019255f, -0.451155f,0.892443f,0.00187563f, -0.20864f,0.975493f,0.0698802f, --0.187263f,0.946264f,0.263661f, --0.412354f,0.843904f,0.343207f, --0.267988f,0.899756f,0.344414f, --0.237384f,0.936767f,0.25713f, --0.24929f,0.96341f,0.0984657f, --0.12508f,0.979898f,0.155419f, --0.075281f,0.975532f,0.206567f, --0.0362475f,0.956877f,0.288223f, -0.179598f,0.903623f,0.388856f, -0.452503f,0.830262f,0.325433f, -0.44384f,0.859576f,0.253251f, -0.0283124f,0.992393f,0.119807f, --0.131018f,0.979645f,0.152082f, --0.0108162f,0.971878f,0.235238f, -0.177243f,0.920605f,0.347953f, -0.0690998f,0.954542f,0.289956f, -0.0964158f,0.939858f,0.327675f, -0.141817f,0.921257f,0.362178f, -0.189018f,0.897606f,0.398216f, -0.266469f,0.899974f,0.345024f, -0.359545f,0.871551f,0.333357f, -0.237931f,0.897592f,0.371104f, --0.0217966f,0.934365f,0.355651f, --0.0978092f,0.948287f,0.30197f, -0.00875447f,0.940305f,0.340221f, -0.0870369f,0.963741f,0.252246f, -0.143744f,0.964801f,0.220218f, -0.0987042f,0.960888f,0.25875f, -0.124661f,0.953903f,0.273f, --0.0397023f,0.970451f,0.238011f, --0.294392f,0.938787f,0.17892f, --0.415783f,0.892445f,0.175119f, --0.502145f,0.854833f,0.130809f, --0.438287f,0.876552f,0.198899f, --0.315043f,0.920499f,0.231147f, --0.194294f,0.951114f,0.240065f, --0.351808f,0.923717f,0.151587f, --0.54821f,0.835857f,0.0284484f, -0.0750917f,0.989867f,-0.120519f, -0.16891f,0.981624f,-0.0887941f, -0.190217f,0.976992f,-0.0964579f, -0.031324f,0.983953f,-0.175657f, --0.0605958f,0.993695f,-0.0943344f, --0.0750681f,0.99685f,-0.025582f, --0.0331924f,0.999431f,-0.00606515f, --0.0198899f,0.99954f,0.0228873f, --0.0160511f,0.998799f,-0.0462827f, -0.0298246f,0.995221f,-0.092978f, -0.113995f,0.985706f,-0.124048f, -0.249662f,0.968309f,-0.00683024f, -0.100872f,0.992347f,0.0712218f, -0.0920036f,0.982533f,0.161755f, -0.0527146f,0.998589f,-0.00636128f, -0.182827f,0.9816f,-0.0550969f, -0.393766f,0.919069f,-0.0161334f, -0.337394f,0.941358f,0.00313128f, -0.105574f,0.990777f,0.0849468f, --0.199161f,0.971911f,0.125398f, --0.309481f,0.93868f,0.151989f, --0.20903f,0.965522f,0.15516f, -0.0624223f,0.987754f,0.142987f, -0.384312f,0.922399f,0.0385395f, -0.395292f,0.916973f,0.0539f, --0.00445825f,0.983693f,0.179798f, --0.32103f,0.866957f,0.381215f, --0.378167f,0.863609f,0.33342f, --0.220175f,0.926633f,0.304752f, --0.0614943f,0.950074f,0.305906f, --0.12116f,0.98024f,0.156364f, --0.278268f,0.956461f,0.0880323f, --0.168756f,0.960122f,0.222908f, --0.0650574f,0.977781f,0.199281f, -0.11325f,0.979757f,0.165078f, -0.469769f,0.846474f,0.250598f, -0.492575f,0.830428f,0.260305f, -0.123756f,0.962501f,0.241404f, --0.13585f,0.964887f,0.224807f, --0.0763658f,0.97309f,0.217403f, -0.0878568f,0.965257f,0.246088f, -0.105594f,0.951417f,0.289233f, -0.0757959f,0.967864f,0.239781f, -0.0993833f,0.975608f,0.195732f, -0.186309f,0.954458f,0.23302f, -0.338273f,0.909543f,0.241458f, -0.326788f,0.907649f,0.263405f, -0.193788f,0.920444f,0.339454f, -0.0304147f,0.954662f,0.296135f, --0.0232537f,0.980981f,0.192706f, -0.000389577f,0.986091f,0.166207f, -0.0882095f,0.967853f,0.235542f, -0.188357f,0.927906f,0.321731f, -0.0670292f,0.972109f,0.224745f, -0.0943312f,0.961869f,0.256728f, -0.0613113f,0.959756f,0.274061f, --0.207348f,0.967924f,0.141881f, --0.415608f,0.907723f,0.0575284f, --0.500123f,0.863342f,0.0672098f, --0.492039f,0.866172f,0.0874256f, --0.354073f,0.931677f,0.0813054f, --0.181316f,0.978479f,0.0985071f, --0.266622f,0.956284f,0.120138f, --0.442863f,0.891447f,0.0958846f, --0.0871303f,0.98944f,-0.115829f, -0.0906659f,0.9958f,-0.0127409f, -0.283182f,0.958456f,0.0342056f, -0.0813038f,0.994836f,-0.0607581f, --0.14732f,0.989082f,0.00362058f, --0.15085f,0.987502f,0.0456442f, --0.0204288f,0.99901f,0.039516f, -0.00607957f,0.996993f,-0.0772516f, -0.0245166f,0.989435f,-0.142892f, -0.112542f,0.984768f,-0.132539f, -0.117701f,0.980135f,-0.159633f, -0.0712861f,0.996099f,-0.0520052f, -0.0255235f,0.995475f,0.0915291f, -0.102558f,0.988742f,0.10895f, -0.263691f,0.960156f,0.0925667f, -0.248163f,0.965214f,-0.0823197f, -0.340591f,0.934756f,-0.101139f, -0.19652f,0.980248f,0.0222232f, --0.0707824f,0.98306f,0.169067f, --0.214629f,0.938414f,0.270766f, --0.253216f,0.94197f,0.220395f, --0.140751f,0.981088f,0.132876f, -0.0855474f,0.99626f,0.0121329f, -0.407822f,0.912623f,0.0283097f, -0.314806f,0.941456f,0.120654f, --0.127318f,0.956166f,0.263699f, --0.403379f,0.856412f,0.322248f, --0.326125f,0.89105f,0.315709f, --0.192548f,0.934549f,0.29924f, --0.115959f,0.956033f,0.26936f, --0.0455884f,0.940005f,0.3381f, --0.221624f,0.931041f,0.289905f, --0.142796f,0.963558f,0.226198f, -0.0818112f,0.991531f,0.100865f, -0.115133f,0.989689f,-0.0852087f, -0.362891f,0.931224f,-0.0336289f, -0.464909f,0.869676f,0.1659f, -0.12135f,0.938462f,0.323362f, --0.154102f,0.92745f,0.340718f, --0.00840056f,0.94535f,0.325948f, -0.0978542f,0.97811f,0.183647f, -0.11792f,0.982347f,0.145222f, -0.146369f,0.980631f,0.130149f, -0.169334f,0.978423f,0.118383f, -0.164013f,0.985699f,0.0386944f, -0.265906f,0.961228f,0.0730397f, -0.245913f,0.944548f,0.217615f, -0.193695f,0.94265f,0.271832f, -0.193351f,0.95598f,0.22072f, -0.0582845f,0.995708f,0.0718875f, --0.00685416f,0.998237f,0.0589609f, --0.0637908f,0.997757f,0.0202719f, -0.11477f,0.985697f,0.123411f, -0.150647f,0.970382f,0.188848f, -0.0830539f,0.976206f,0.200309f, -0.0503424f,0.976583f,0.20917f, --0.0756986f,0.967299f,0.242081f, --0.38538f,0.913963f,0.127097f, --0.499709f,0.856093f,0.131896f, --0.457912f,0.888414f,0.0322019f, --0.285439f,0.956482f,-0.0605596f, --0.224005f,0.968049f,-0.112706f, --0.33892f,0.940492f,-0.0246551f, --0.468811f,0.882994f,0.0231736f, --0.219323f,0.927554f,-0.302556f, -0.0032435f,0.972826f,-0.231515f, -0.227016f,0.959392f,-0.167423f, -0.0751831f,0.995555f,-0.0567285f, --0.21163f,0.975526f,-0.0596754f, --0.120787f,0.989714f,-0.0766664f, -0.103292f,0.984862f,-0.139202f, -0.130327f,0.957045f,-0.258998f, -0.100597f,0.957666f,-0.269734f, -0.0434385f,0.943793f,-0.327671f, --0.00659457f,0.974177f,-0.225689f, --0.0387678f,0.996731f,-0.0708824f, -0.0108947f,0.998722f,-0.049343f, -0.045379f,0.994354f,-0.0959194f, -0.256328f,0.966322f,0.0227405f, -0.338426f,0.940797f,0.0191927f, -0.245639f,0.967185f,0.0649251f, -0.104201f,0.958601f,0.265004f, --0.106481f,0.952706f,0.284628f, --0.229215f,0.947098f,0.224647f, --0.194403f,0.966329f,0.168569f, --0.00252669f,0.996043f,0.0888332f, -0.156392f,0.987666f,-0.00755935f, -0.321695f,0.943636f,0.0778705f, -0.130492f,0.960095f,0.247363f, --0.218806f,0.887212f,0.406175f, --0.387978f,0.851763f,0.352097f, --0.317465f,0.905687f,0.280974f, --0.175202f,0.945708f,0.273753f, --0.0852507f,0.952748f,0.291554f, --0.110501f,0.951599f,0.28679f, --0.162568f,0.933525f,0.319534f, --0.0379096f,0.973407f,0.225923f, -0.243134f,0.964593f,0.102203f, -0.236277f,0.971524f,-0.017745f, -0.298887f,0.954255f,-0.00800205f, -0.225509f,0.966982f,0.118704f, --0.0160588f,0.939828f,0.341271f, --0.127862f,0.916925f,0.378021f, -0.078893f,0.93958f,0.333116f, -0.244086f,0.933689f,0.262004f, -0.186692f,0.967385f,0.17121f, -0.108188f,0.990525f,0.0845894f, -0.174941f,0.977766f,0.115627f, -0.231991f,0.970242f,0.0693606f, -0.186114f,0.981267f,0.0497696f, -0.166608f,0.977012f,0.133002f, -0.191728f,0.971565f,0.138929f, -0.25765f,0.957218f,0.131718f, -0.087274f,0.989729f,0.113225f, --0.00280678f,0.977756f,0.209725f, -0.0607703f,0.980671f,0.185986f, -0.0485237f,0.997381f,0.053629f, -0.0587736f,0.987863f,0.14378f, -0.0482407f,0.976088f,0.211956f, -0.0134663f,0.978159f,0.20742f, --0.112292f,0.962623f,0.246469f, --0.319272f,0.919627f,0.228803f, --0.453582f,0.883075f,0.120176f, --0.338159f,0.939324f,0.0576029f, --0.23768f,0.971299f,-0.0092623f, --0.191895f,0.980604f,-0.0399f, --0.401044f,0.906011f,-0.135303f, --0.489506f,0.868205f,-0.081269f, --0.196977f,0.901169f,-0.386128f, --0.0562291f,0.922285f,-0.382399f, -0.0867548f,0.952728f,-0.291176f, -0.0232316f,0.988917f,-0.146644f, --0.11605f,0.968007f,-0.222475f, --0.0789033f,0.942785f,-0.323929f, -0.139529f,0.948189f,-0.285427f, -0.132434f,0.962288f,-0.23762f, -0.0765905f,0.96807f,-0.238692f, -0.0641003f,0.96574f,-0.251472f, --0.105766f,0.965216f,-0.239106f, --0.110895f,0.972771f,-0.203515f, -0.0206339f,0.984024f,-0.176838f, -0.0647147f,0.988173f,-0.139018f, -0.148599f,0.980872f,-0.125734f, -0.271512f,0.961735f,0.0367049f, -0.0561912f,0.976773f,0.206777f, --0.0583132f,0.913697f,0.402191f, --0.0462589f,0.893353f,0.446968f, --0.125152f,0.910112f,0.39501f, --0.0803843f,0.940756f,0.329418f, -0.0619859f,0.973174f,0.221562f, -0.135828f,0.971328f,0.195124f, -0.132962f,0.954202f,0.267992f, --0.0325488f,0.903596f,0.427147f, --0.270164f,0.841605f,0.467668f, --0.262238f,0.850223f,0.456456f, --0.212116f,0.889937f,0.403757f, --0.177521f,0.909486f,0.375929f, --0.116828f,0.901627f,0.416436f, --0.0747169f,0.915103f,0.396238f, --0.119776f,0.962629f,0.242896f, -0.0380452f,0.99097f,0.128572f, -0.304108f,0.937317f,0.17016f, -0.240764f,0.951762f,0.190215f, -0.194326f,0.952804f,0.233243f, -0.142453f,0.936947f,0.31912f, --0.0935081f,0.945618f,0.31155f, --0.0887705f,0.956167f,0.27904f, -0.107828f,0.967058f,0.230592f, -0.241042f,0.935322f,0.258984f, -0.259409f,0.922717f,0.285133f, -0.218487f,0.962504f,0.160778f, -0.220571f,0.975062f,0.0245473f, -0.235132f,0.971421f,-0.0324531f, -0.193322f,0.980828f,0.0245576f, -0.123827f,0.992302f,-0.00201728f, -0.206505f,0.97706f,0.0520531f, -0.250594f,0.965023f,0.0770254f, -0.0246334f,0.99033f,0.136524f, --0.123437f,0.964871f,0.231923f, -0.10276f,0.956911f,0.271591f, -0.090829f,0.970486f,0.223397f, -0.00393218f,0.964068f,0.265627f, -0.045739f,0.962581f,0.267105f, -0.0438394f,0.968724f,0.244235f, --0.1348f,0.971521f,0.194876f, --0.247965f,0.950768f,0.185883f, --0.385563f,0.920067f,0.0694089f, --0.33646f,0.941527f,0.0179056f, --0.284408f,0.957673f,0.0444463f, --0.0809611f,0.98246f,0.167982f, --0.272195f,0.961849f,0.0275091f, --0.538305f,0.840251f,-0.0648443f, --0.138085f,0.947265f,-0.289173f, --0.112292f,0.943405f,-0.312055f, --0.0366032f,0.968339f,-0.246942f, --0.0207584f,0.978499f,-0.205204f, --0.0114432f,0.978269f,-0.207024f, --0.017206f,0.978017f,-0.207814f, --0.00196221f,0.968739f,-0.248075f, -0.111459f,0.982805f,-0.147209f, -0.0917515f,0.980196f,-0.175495f, -0.0783409f,0.987595f,-0.136083f, --0.0849004f,0.981698f,-0.170473f, --0.0826208f,0.969176f,-0.232103f, --0.0513296f,0.962825f,-0.265205f, --0.0169212f,0.988046f,-0.153227f, -0.0442536f,0.99886f,0.017891f, -0.0803284f,0.974024f,0.211719f, --0.118041f,0.942704f,0.312052f, --0.187621f,0.893485f,0.408023f, --0.0735772f,0.857937f,0.508459f, --0.0838693f,0.837024f,0.5407f, --0.00356882f,0.863268f,0.504733f, -0.117551f,0.889838f,0.440874f, -0.141271f,0.893306f,0.426669f, -0.0270129f,0.906148f,0.422097f, --0.109486f,0.851548f,0.512717f, --0.266831f,0.814637f,0.514944f, --0.253628f,0.788787f,0.559899f, --0.216685f,0.776961f,0.591083f, --0.15137f,0.760068f,0.631968f, --0.119157f,0.801398f,0.586143f, -0.0626697f,0.817134f,0.573031f, -0.150716f,0.886392f,0.437714f, -0.0719955f,0.965525f,0.250157f, -0.170594f,0.93758f,0.303054f, -0.205981f,0.906978f,0.367374f, -0.159242f,0.93166f,0.326575f, -0.163686f,0.939188f,0.301881f, -0.00255834f,0.983457f,0.181126f, --0.0246414f,0.997684f,0.063397f, -0.103068f,0.994148f,0.0323463f, -0.175261f,0.977189f,0.119941f, -0.238397f,0.946614f,0.216998f, -0.376211f,0.893689f,0.244508f, -0.336321f,0.93903f,0.0714918f, -0.22632f,0.974025f,-0.00733613f, -0.155366f,0.98668f,0.0481989f, -0.129371f,0.988467f,0.0787169f, -0.140766f,0.985457f,0.095182f, -0.181141f,0.974304f,0.133867f, --0.0259321f,0.983166f,0.180868f, --0.16382f,0.974748f,0.151756f, -0.12842f,0.977623f,0.166619f, -0.102805f,0.986615f,0.12658f, --0.0352231f,0.991461f,0.125559f, -0.0344472f,0.990276f,0.134782f, -0.100258f,0.97877f,0.178768f, --0.0763414f,0.992566f,0.0947915f, --0.24142f,0.968616f,0.059149f, --0.325267f,0.943242f,0.06705f, --0.302069f,0.9528f,0.0304413f, --0.317187f,0.948361f,-0.0017587f, --0.219267f,0.973832f,0.059775f, --0.187608f,0.954493f,0.231832f, --0.46452f,0.867868f,0.176143f, --0.203418f,0.948131f,-0.244273f, --0.139664f,0.973265f,-0.182342f, --0.0536959f,0.988785f,-0.139361f, --0.00355604f,0.986781f,-0.162022f, --0.0572809f,0.980561f,-0.187669f, --0.0374007f,0.985205f,-0.167247f, -0.0555765f,0.976159f,-0.209822f, -0.0908927f,0.962348f,-0.256173f, -0.0600715f,0.972748f,-0.223946f, -0.0442581f,0.987652f,-0.150282f, --0.0260568f,0.986636f,-0.160841f, --0.0937884f,0.986183f,-0.136552f, --0.00585357f,0.999959f,-0.00691373f, --0.168872f,0.982349f,-0.0804476f, --0.215485f,0.975309f,0.0483622f, --0.0961691f,0.964354f,0.246521f, --0.114487f,0.922048f,0.369757f, --0.269656f,0.899414f,0.344007f, --0.21772f,0.897789f,0.382849f, --0.126818f,0.886934f,0.444145f, -0.0624514f,0.872607f,0.484415f, -0.170504f,0.863439f,0.474764f, -0.127681f,0.882519f,0.452612f, -0.0249418f,0.887332f,0.460457f, --0.228952f,0.87943f,0.417354f, --0.336679f,0.801754f,0.493799f, --0.354676f,0.742594f,0.568119f, --0.265358f,0.728648f,0.631393f, --0.0874663f,0.774696f,0.626255f, -0.0313715f,0.816845f,0.576004f, -0.138491f,0.877406f,0.459325f, -0.251487f,0.873743f,0.416325f, -0.149012f,0.891076f,0.428695f, -0.134082f,0.895567f,0.424244f, -0.259356f,0.879751f,0.398462f, -0.273738f,0.923515f,0.268677f, -0.242075f,0.954352f,0.174962f, -0.166067f,0.977105f,0.132992f, -0.0519593f,0.998404f,0.022142f, -0.0706628f,0.997395f,0.0145074f, -0.0910476f,0.994722f,0.0473141f, -0.126598f,0.990827f,0.0472679f, -0.33108f,0.937289f,0.108974f, -0.427456f,0.888646f,0.166103f, -0.265492f,0.95292f,0.14648f, -0.0868945f,0.990384f,0.10765f, -0.0739344f,0.98242f,0.171417f, -0.14882f,0.964095f,0.219937f, -0.160065f,0.969614f,0.185009f, -0.0379065f,0.980794f,0.191328f, --0.111879f,0.992654f,0.0460448f, -0.101571f,0.994616f,0.0205655f, -0.134276f,0.987226f,0.0857599f, -0.00322228f,0.996946f,0.0780295f, --0.00585508f,0.99961f,0.0273218f, -0.102527f,0.992913f,0.0601057f, --0.0243337f,0.999696f,0.00385478f, --0.236106f,0.971591f,0.0163038f, --0.335881f,0.941896f,0.00400261f, --0.319925f,0.947097f,0.0255887f, --0.262465f,0.960477f,0.0927118f, --0.320184f,0.947305f,-0.00973767f, --0.358146f,0.929034f,0.0928862f, --0.431591f,0.882961f,0.184686f, --0.350194f,0.913588f,-0.20669f, --0.241714f,0.958821f,-0.149118f, --0.0874799f,0.991928f,-0.0917931f, --0.00637736f,0.998289f,-0.0581162f, -0.0261719f,0.997729f,-0.0620574f, -0.00430678f,0.979141f,-0.203135f, -0.121705f,0.971178f,-0.20494f, -0.10219f,0.965909f,-0.237861f, -0.00407698f,0.957171f,-0.289495f, --0.0386862f,0.968014f,-0.247897f, --0.0509849f,0.995926f,-0.0743816f, --0.228245f,0.973592f,-0.00474817f, --0.140696f,0.979081f,0.146984f, --0.104046f,0.966867f,0.233113f, --0.254332f,0.94315f,0.213969f, --0.211685f,0.953746f,0.213442f, --0.245201f,0.93619f,0.251844f, --0.247199f,0.912647f,0.325527f, --0.213426f,0.932543f,0.291228f, --0.170741f,0.942588f,0.28701f, --0.0363946f,0.943193f,0.330245f, -0.169433f,0.88607f,0.431478f, -0.12169f,0.89261f,0.434096f, -0.0508642f,0.869951f,0.490509f, --0.175065f,0.875657f,0.450086f, --0.464211f,0.815419f,0.345833f, --0.467728f,0.796275f,0.383635f, --0.295863f,0.865688f,0.403795f, --0.0706376f,0.91172f,0.404693f, -0.151265f,0.880258f,0.449738f, -0.239887f,0.896678f,0.372052f, -0.270966f,0.902061f,0.335952f, -0.133682f,0.938928f,0.317085f, -0.132181f,0.949509f,0.284538f, -0.337234f,0.911457f,0.235624f, -0.391568f,0.908725f,0.144547f, -0.297707f,0.949115f,0.10272f, -0.163642f,0.985787f,0.038011f, -0.0603665f,0.994817f,0.0818182f, -0.0342529f,0.984393f,0.172617f, -0.146f,0.969394f,0.197379f, -0.189586f,0.979398f,0.0695505f, -0.32179f,0.946595f,0.0202369f, -0.339913f,0.938655f,0.0581868f, -0.255631f,0.940824f,0.222493f, -0.130905f,0.959362f,0.249975f, -0.0245005f,0.97884f,0.203155f, -0.116898f,0.96642f,0.228839f, -0.217161f,0.952887f,0.211771f, -0.0905814f,0.991503f,0.0933592f, -0.00963547f,0.999795f,0.0178162f, -0.0707892f,0.997359f,-0.0162393f, -0.0454623f,0.996335f,0.0724521f, -0.025845f,0.99119f,0.129903f, -0.0553395f,0.998031f,0.0295398f, -0.0632528f,0.997901f,0.0138837f, --0.000723073f,0.987186f,0.159572f, --0.246121f,0.956173f,0.158611f, --0.292993f,0.948379f,0.121377f, --0.358856f,0.933219f,0.0180357f, --0.312153f,0.948631f,0.0515794f, --0.263061f,0.955548f,0.133141f, --0.387996f,0.907685f,0.159898f, --0.516559f,0.845117f,0.137638f, --0.310178f,0.948377f,-0.0661154f, --0.300026f,0.949757f,-0.0891454f, --0.137668f,0.990363f,0.0151269f, --0.0326899f,0.997118f,0.0684562f, -0.0835016f,0.994462f,0.0638203f, -0.0992766f,0.995028f,0.00796582f, -0.068628f,0.997514f,-0.0159775f, -0.181484f,0.983266f,0.0158879f, -0.0929905f,0.991619f,-0.0896955f, --0.159863f,0.9831f,-0.0892104f, --0.274969f,0.956779f,0.094689f, --0.2578f,0.933703f,0.248472f, --0.255563f,0.934109f,0.249254f, --0.183445f,0.905456f,0.382751f, --0.258353f,0.860148f,0.439771f, --0.12588f,0.873686f,0.469923f, --0.210169f,0.916013f,0.341684f, --0.272883f,0.91339f,0.302083f, --0.180317f,0.937251f,0.298406f, --0.199625f,0.942232f,0.268977f, --0.0859427f,0.9396f,0.33131f, -0.0831524f,0.928739f,0.361288f, -0.0997333f,0.904186f,0.415333f, --0.0517762f,0.893569f,0.445931f, --0.109718f,0.87826f,0.465426f, --0.369685f,0.848108f,0.379534f, --0.446603f,0.811841f,0.376112f, --0.267849f,0.883969f,0.383218f, --0.10672f,0.930725f,0.349801f, -0.10205f,0.92892f,0.355941f, -0.253281f,0.903219f,0.346475f, -0.270898f,0.880967f,0.387957f, -0.236849f,0.896348f,0.374784f, -0.206634f,0.946539f,0.247723f, -0.405577f,0.89206f,0.199342f, -0.379351f,0.915673f,0.1328f, -0.334598f,0.922412f,0.192872f, -0.211991f,0.969195f,0.125385f, --0.0201216f,0.993487f,0.112152f, --0.0648495f,0.986484f,0.150479f, -0.170924f,0.975936f,0.135405f, -0.29249f,0.9553f,0.0430209f, -0.300918f,0.953641f,0.00421578f, -0.280252f,0.954656f,0.100457f, -0.110799f,0.982326f,0.150862f, -0.111953f,0.970209f,0.214852f, -0.0917898f,0.974074f,0.206772f, -0.0706157f,0.981239f,0.179398f, -0.263217f,0.920389f,0.289137f, -0.266708f,0.942871f,0.199653f, -0.0169344f,0.99983f,0.00724636f, -0.0586405f,0.99674f,0.0554216f, --0.0335948f,0.99924f,0.0197934f, -0.0130139f,0.996641f,0.0808552f, -0.158081f,0.974057f,0.161934f, --0.0718701f,0.984912f,0.157428f, --0.146615f,0.930223f,0.336437f, --0.215441f,0.915614f,0.339465f, --0.194576f,0.929319f,0.313857f, --0.21244f,0.956751f,0.198736f, --0.353032f,0.933914f,0.0563254f, --0.387138f,0.913346f,0.126188f, --0.421226f,0.884098f,0.202334f, --0.478159f,0.863227f,0.161871f, --0.144962f,0.987796f,0.0569687f, --0.329752f,0.937067f,-0.114758f, --0.228627f,0.973393f,0.0153452f, --0.0297707f,0.988896f,0.1456f, -0.0737235f,0.992418f,0.0983429f, -0.119683f,0.983634f,0.134687f, -0.0735029f,0.988539f,0.131863f, -0.205816f,0.971725f,0.115713f, -0.105316f,0.994111f,0.0255379f, --0.224655f,0.970814f,0.0839657f, --0.371877f,0.9075f,0.195325f, --0.304303f,0.906448f,0.292833f, --0.280483f,0.900657f,0.331883f, --0.306628f,0.862929f,0.401664f, --0.272078f,0.807801f,0.522907f, --0.0728986f,0.827771f,0.55631f, --0.0766844f,0.868115f,0.490404f, --0.262952f,0.903979f,0.337163f, --0.116268f,0.92805f,0.353844f, --0.236581f,0.941122f,0.241494f, --0.103825f,0.933685f,0.342713f, -0.0620174f,0.936003f,0.346485f, -0.0525461f,0.928042f,0.368751f, --0.037371f,0.900626f,0.432986f, --0.0859425f,0.920181f,0.381944f, --0.402084f,0.867474f,0.292945f, --0.458834f,0.792013f,0.402725f, --0.247545f,0.839465f,0.483756f, --0.0206347f,0.857039f,0.514838f, -0.131938f,0.906082f,0.402004f, -0.260907f,0.906936f,0.330749f, -0.222736f,0.912076f,0.344246f, -0.286017f,0.867948f,0.406029f, -0.265664f,0.918021f,0.29438f, -0.386646f,0.888781f,0.246116f, -0.416594f,0.869611f,0.265003f, -0.291338f,0.924889f,0.244341f, -0.264598f,0.920497f,0.287528f, --0.0209737f,0.965015f,0.261353f, -0.011928f,0.966786f,0.255307f, -0.209759f,0.975171f,0.0710066f, -0.379568f,0.924828f,0.0249204f, -0.227757f,0.968062f,-0.104795f, -0.230276f,0.968937f,0.0901831f, -0.121279f,0.97806f,0.169381f, -0.101139f,0.989453f,0.103701f, -0.125341f,0.986876f,0.101809f, -0.00931107f,0.998148f,0.0601183f, -0.147262f,0.96746f,0.205755f, -0.372526f,0.861294f,0.34554f, -0.0770606f,0.989688f,0.120749f, -0.0673416f,0.990666f,0.11852f, -0.0242126f,0.998823f,0.0420167f, --0.0975945f,0.993903f,-0.0513095f, -0.0117629f,0.986762f,0.16175f, --0.119035f,0.908985f,0.399472f, --0.171696f,0.877378f,0.448027f, --0.168225f,0.894295f,0.414653f, --0.158105f,0.915758f,0.369311f, --0.0984338f,0.938718f,0.330333f, --0.319812f,0.930617f,0.177966f, --0.398204f,0.897351f,0.190248f, --0.414882f,0.896338f,0.156369f, --0.434877f,0.894265f,0.105701f, -}; - -btScalar Landscape07Tex[] = { -0.507813f,0.742188f, -0.507813f,0.734375f, -0.515625f,0.742188f, -0.515625f,0.734375f, -0.523438f,0.742188f, -0.523438f,0.734375f, -0.53125f,0.742188f, -0.53125f,0.734375f, -0.539063f,0.742188f, -0.539063f,0.734375f, -0.546875f,0.742188f, -0.546875f,0.734375f, -0.554688f,0.742188f, -0.554688f,0.734375f, -0.5625f,0.742188f, -0.5625f,0.734375f, -0.570313f,0.742188f, -0.570313f,0.734375f, -0.578125f,0.742188f, -0.578125f,0.734375f, -0.585938f,0.742188f, -0.585938f,0.734375f, -0.59375f,0.742188f, -0.59375f,0.734375f, -0.601563f,0.742188f, -0.601563f,0.734375f, -0.609375f,0.742188f, -0.609375f,0.734375f, -0.617188f,0.742188f, -0.617188f,0.734375f, -0.625f,0.742188f, -0.625f,0.734375f, -0.632813f,0.742188f, -0.632813f,0.734375f, -0.640625f,0.742188f, -0.640625f,0.734375f, -0.648438f,0.742188f, -0.648438f,0.734375f, -0.65625f,0.742188f, -0.65625f,0.734375f, -0.664063f,0.742188f, -0.664063f,0.734375f, -0.671875f,0.742188f, -0.671875f,0.734375f, -0.679688f,0.742188f, -0.679688f,0.734375f, -0.6875f,0.742188f, -0.6875f,0.734375f, -0.695313f,0.742188f, -0.695313f,0.734375f, -0.703125f,0.742188f, -0.703125f,0.734375f, -0.710938f,0.742188f, -0.710938f,0.734375f, -0.71875f,0.742188f, -0.71875f,0.734375f, -0.726563f,0.742188f, -0.726563f,0.734375f, -0.734375f,0.742188f, -0.734375f,0.734375f, -0.742188f,0.742188f, -0.742188f,0.734375f, -0.75f,0.742188f, -0.75f,0.734375f, -0.757813f,0.742188f, -0.757813f,0.734375f, -0.765625f,0.742188f, -0.765625f,0.734375f, -0.773438f,0.742188f, -0.773438f,0.734375f, -0.78125f,0.742188f, -0.78125f,0.734375f, -0.789063f,0.742188f, -0.789063f,0.734375f, -0.796875f,0.742188f, -0.796875f,0.734375f, -0.804688f,0.742188f, -0.804688f,0.734375f, -0.8125f,0.742188f, -0.8125f,0.734375f, -0.820313f,0.742188f, -0.820313f,0.734375f, -0.828125f,0.742188f, -0.828125f,0.734375f, -0.835938f,0.742188f, -0.835938f,0.734375f, -0.84375f,0.742188f, -0.84375f,0.734375f, -0.851563f,0.742188f, -0.851563f,0.734375f, -0.859375f,0.742188f, -0.859375f,0.734375f, -0.867188f,0.742188f, -0.867188f,0.734375f, -0.875f,0.742188f, -0.875f,0.734375f, -0.882813f,0.742188f, -0.882813f,0.734375f, -0.890625f,0.742188f, -0.890625f,0.734375f, -0.898438f,0.742188f, -0.898438f,0.734375f, -0.90625f,0.742188f, -0.90625f,0.734375f, -0.914063f,0.742188f, -0.914063f,0.734375f, -0.921875f,0.742188f, -0.921875f,0.734375f, -0.929688f,0.742188f, -0.929688f,0.734375f, -0.9375f,0.742188f, -0.9375f,0.734375f, -0.945313f,0.742188f, -0.945313f,0.734375f, -0.953125f,0.742188f, -0.953125f,0.734375f, -0.960938f,0.742188f, -0.960938f,0.734375f, -0.96875f,0.742188f, -0.96875f,0.734375f, -0.976563f,0.742188f, -0.976563f,0.734375f, -0.984375f,0.742188f, -0.984375f,0.734375f, -0.992188f,0.742188f, -0.992188f,0.734375f, -1.0f,0.742188f, -1.0f,0.734375f, -0.507813f,0.75f, -0.515625f,0.75f, -0.523438f,0.75f, -0.53125f,0.75f, -0.539063f,0.75f, -0.546875f,0.75f, -0.554688f,0.75f, -0.5625f,0.75f, -0.570313f,0.75f, -0.578125f,0.75f, -0.585938f,0.75f, -0.59375f,0.75f, -0.601563f,0.75f, -0.609375f,0.75f, -0.617188f,0.75f, -0.625f,0.75f, -0.632813f,0.75f, -0.640625f,0.75f, -0.648438f,0.75f, -0.65625f,0.75f, -0.664063f,0.75f, -0.671875f,0.75f, -0.679688f,0.75f, -0.6875f,0.75f, -0.695313f,0.75f, -0.703125f,0.75f, -0.710938f,0.75f, -0.71875f,0.75f, -0.726563f,0.75f, -0.734375f,0.75f, -0.742188f,0.75f, -0.75f,0.75f, -0.757813f,0.75f, -0.765625f,0.75f, -0.773438f,0.75f, -0.78125f,0.75f, -0.789063f,0.75f, -0.796875f,0.75f, -0.804688f,0.75f, -0.8125f,0.75f, -0.820313f,0.75f, -0.828125f,0.75f, -0.835938f,0.75f, -0.84375f,0.75f, -0.851563f,0.75f, -0.859375f,0.75f, -0.867188f,0.75f, -0.875f,0.75f, -0.882813f,0.75f, -0.890625f,0.75f, -0.898438f,0.75f, -0.90625f,0.75f, -0.914063f,0.75f, -0.921875f,0.75f, -0.929688f,0.75f, -0.9375f,0.75f, -0.945313f,0.75f, -0.953125f,0.75f, -0.960938f,0.75f, -0.96875f,0.75f, -0.976563f,0.75f, -0.984375f,0.75f, -0.992188f,0.75f, -1.0f,0.75f, -0.507813f,0.757813f, -0.515625f,0.757813f, -0.523438f,0.757813f, -0.53125f,0.757813f, -0.539063f,0.757813f, -0.546875f,0.757813f, -0.554688f,0.757813f, -0.5625f,0.757813f, -0.570313f,0.757813f, -0.578125f,0.757813f, -0.585938f,0.757813f, -0.59375f,0.757813f, -0.601563f,0.757813f, -0.609375f,0.757813f, -0.617188f,0.757813f, -0.625f,0.757813f, -0.632813f,0.757813f, -0.640625f,0.757813f, -0.648438f,0.757813f, -0.65625f,0.757813f, -0.664063f,0.757813f, -0.671875f,0.757813f, -0.679688f,0.757813f, -0.6875f,0.757813f, -0.695313f,0.757813f, -0.703125f,0.757813f, -0.710938f,0.757813f, -0.71875f,0.757813f, -0.726563f,0.757813f, -0.734375f,0.757813f, -0.742188f,0.757813f, -0.75f,0.757813f, -0.757813f,0.757813f, -0.765625f,0.757813f, -0.773438f,0.757813f, -0.78125f,0.757813f, -0.789063f,0.757813f, -0.796875f,0.757813f, -0.804688f,0.757813f, -0.8125f,0.757813f, -0.820313f,0.757813f, -0.828125f,0.757813f, -0.835938f,0.757813f, -0.84375f,0.757813f, -0.851563f,0.757813f, -0.859375f,0.757813f, -0.867188f,0.757813f, -0.875f,0.757813f, -0.882813f,0.757813f, -0.890625f,0.757813f, -0.898438f,0.757813f, -0.90625f,0.757813f, -0.914063f,0.757813f, -0.921875f,0.757813f, -0.929688f,0.757813f, -0.9375f,0.757813f, -0.945313f,0.757813f, -0.953125f,0.757813f, -0.960938f,0.757813f, -0.96875f,0.757813f, -0.976563f,0.757813f, -0.984375f,0.757813f, -0.992188f,0.757813f, -1.0f,0.757813f, -0.507813f,0.765625f, -0.515625f,0.765625f, -0.523438f,0.765625f, -0.53125f,0.765625f, -0.539063f,0.765625f, -0.546875f,0.765625f, -0.554688f,0.765625f, -0.5625f,0.765625f, -0.570313f,0.765625f, -0.578125f,0.765625f, -0.585938f,0.765625f, -0.59375f,0.765625f, -0.601563f,0.765625f, -0.609375f,0.765625f, -0.617188f,0.765625f, -0.625f,0.765625f, -0.632813f,0.765625f, -0.640625f,0.765625f, -0.648438f,0.765625f, -0.65625f,0.765625f, -0.664063f,0.765625f, -0.671875f,0.765625f, -0.679688f,0.765625f, -0.6875f,0.765625f, -0.695313f,0.765625f, -0.703125f,0.765625f, -0.710938f,0.765625f, -0.71875f,0.765625f, -0.726563f,0.765625f, -0.734375f,0.765625f, -0.742188f,0.765625f, -0.75f,0.765625f, -0.757813f,0.765625f, -0.765625f,0.765625f, -0.773438f,0.765625f, -0.78125f,0.765625f, -0.789063f,0.765625f, -0.796875f,0.765625f, -0.804688f,0.765625f, -0.8125f,0.765625f, -0.820313f,0.765625f, -0.828125f,0.765625f, -0.835938f,0.765625f, -0.84375f,0.765625f, -0.851563f,0.765625f, -0.859375f,0.765625f, -0.867188f,0.765625f, -0.875f,0.765625f, -0.882813f,0.765625f, -0.890625f,0.765625f, -0.898438f,0.765625f, -0.90625f,0.765625f, -0.914063f,0.765625f, -0.921875f,0.765625f, -0.929688f,0.765625f, -0.9375f,0.765625f, -0.945313f,0.765625f, -0.953125f,0.765625f, -0.960938f,0.765625f, -0.96875f,0.765625f, -0.976563f,0.765625f, -0.984375f,0.765625f, -0.992188f,0.765625f, -1.0f,0.765625f, -0.507813f,0.773438f, -0.515625f,0.773438f, -0.523438f,0.773438f, -0.53125f,0.773438f, -0.539063f,0.773438f, -0.546875f,0.773438f, -0.554688f,0.773438f, -0.5625f,0.773438f, -0.570313f,0.773438f, -0.578125f,0.773438f, -0.585938f,0.773438f, -0.59375f,0.773438f, -0.601563f,0.773438f, -0.609375f,0.773438f, -0.617188f,0.773438f, -0.625f,0.773438f, -0.632813f,0.773438f, -0.640625f,0.773438f, -0.648438f,0.773438f, -0.65625f,0.773438f, -0.664063f,0.773438f, -0.671875f,0.773438f, -0.679688f,0.773438f, -0.6875f,0.773438f, -0.695313f,0.773438f, -0.703125f,0.773438f, -0.710938f,0.773438f, -0.71875f,0.773438f, -0.726563f,0.773438f, -0.734375f,0.773438f, -0.742188f,0.773438f, -0.75f,0.773438f, -0.757813f,0.773438f, -0.765625f,0.773438f, -0.773438f,0.773438f, -0.78125f,0.773438f, -0.789063f,0.773438f, -0.796875f,0.773438f, -0.804688f,0.773438f, -0.8125f,0.773438f, -0.820313f,0.773438f, -0.828125f,0.773438f, -0.835938f,0.773438f, -0.84375f,0.773438f, -0.851563f,0.773438f, -0.859375f,0.773438f, -0.867188f,0.773438f, -0.875f,0.773438f, -0.882813f,0.773438f, -0.890625f,0.773438f, -0.898438f,0.773438f, -0.90625f,0.773438f, -0.914063f,0.773438f, -0.921875f,0.773438f, -0.929688f,0.773438f, -0.9375f,0.773438f, -0.945313f,0.773438f, -0.953125f,0.773438f, -0.960938f,0.773438f, -0.96875f,0.773438f, -0.976563f,0.773438f, -0.984375f,0.773438f, -0.992188f,0.773438f, -1.0f,0.773438f, -0.507813f,0.78125f, -0.515625f,0.78125f, -0.523438f,0.78125f, -0.53125f,0.78125f, -0.539063f,0.78125f, -0.546875f,0.78125f, -0.554688f,0.78125f, -0.5625f,0.78125f, -0.570313f,0.78125f, -0.578125f,0.78125f, -0.585938f,0.78125f, -0.59375f,0.78125f, -0.601563f,0.78125f, -0.609375f,0.78125f, -0.617188f,0.78125f, -0.625f,0.78125f, -0.632813f,0.78125f, -0.640625f,0.78125f, -0.648438f,0.78125f, -0.65625f,0.78125f, -0.664063f,0.78125f, -0.671875f,0.78125f, -0.679688f,0.78125f, -0.6875f,0.78125f, -0.695313f,0.78125f, -0.703125f,0.78125f, -0.710938f,0.78125f, -0.71875f,0.78125f, -0.726563f,0.78125f, -0.734375f,0.78125f, -0.742188f,0.78125f, -0.75f,0.78125f, -0.757813f,0.78125f, -0.765625f,0.78125f, -0.773438f,0.78125f, -0.78125f,0.78125f, -0.789063f,0.78125f, -0.796875f,0.78125f, -0.804688f,0.78125f, -0.8125f,0.78125f, -0.820313f,0.78125f, -0.828125f,0.78125f, -0.835938f,0.78125f, -0.84375f,0.78125f, -0.851563f,0.78125f, -0.859375f,0.78125f, -0.867188f,0.78125f, -0.875f,0.78125f, -0.882813f,0.78125f, -0.890625f,0.78125f, -0.898438f,0.78125f, -0.90625f,0.78125f, -0.914063f,0.78125f, -0.921875f,0.78125f, -0.929688f,0.78125f, -0.9375f,0.78125f, -0.945313f,0.78125f, -0.953125f,0.78125f, -0.960938f,0.78125f, -0.96875f,0.78125f, -0.976563f,0.78125f, -0.984375f,0.78125f, -0.992188f,0.78125f, -1.0f,0.78125f, -0.507813f,0.789063f, -0.515625f,0.789063f, -0.523438f,0.789063f, -0.53125f,0.789063f, -0.539063f,0.789063f, -0.546875f,0.789063f, -0.554688f,0.789063f, -0.5625f,0.789063f, -0.570313f,0.789063f, -0.578125f,0.789063f, -0.585938f,0.789063f, -0.59375f,0.789063f, -0.601563f,0.789063f, -0.609375f,0.789063f, -0.617188f,0.789063f, -0.625f,0.789063f, -0.632813f,0.789063f, -0.640625f,0.789063f, -0.648438f,0.789063f, -0.65625f,0.789063f, -0.664063f,0.789063f, -0.671875f,0.789063f, -0.679688f,0.789063f, -0.6875f,0.789063f, -0.695313f,0.789063f, -0.703125f,0.789063f, -0.710938f,0.789063f, -0.71875f,0.789063f, -0.726563f,0.789063f, -0.734375f,0.789063f, -0.742188f,0.789063f, -0.75f,0.789063f, -0.757813f,0.789063f, -0.765625f,0.789063f, -0.773438f,0.789063f, -0.78125f,0.789063f, -0.789063f,0.789063f, -0.796875f,0.789063f, -0.804688f,0.789063f, -0.8125f,0.789063f, -0.820313f,0.789063f, -0.828125f,0.789063f, -0.835938f,0.789063f, -0.84375f,0.789063f, -0.851563f,0.789063f, -0.859375f,0.789063f, -0.867188f,0.789063f, -0.875f,0.789063f, -0.882813f,0.789063f, -0.890625f,0.789063f, -0.898438f,0.789063f, -0.90625f,0.789063f, -0.914063f,0.789063f, -0.921875f,0.789063f, -0.929688f,0.789063f, -0.9375f,0.789063f, -0.945313f,0.789063f, -0.953125f,0.789063f, -0.960938f,0.789063f, -0.96875f,0.789063f, -0.976563f,0.789063f, -0.984375f,0.789063f, -0.992188f,0.789063f, -1.0f,0.789063f, -0.507813f,0.796875f, -0.515625f,0.796875f, -0.523438f,0.796875f, -0.53125f,0.796875f, -0.539063f,0.796875f, -0.546875f,0.796875f, -0.554688f,0.796875f, -0.5625f,0.796875f, -0.570313f,0.796875f, -0.578125f,0.796875f, -0.585938f,0.796875f, -0.59375f,0.796875f, -0.601563f,0.796875f, -0.609375f,0.796875f, -0.617188f,0.796875f, -0.625f,0.796875f, -0.632813f,0.796875f, -0.640625f,0.796875f, -0.648438f,0.796875f, -0.65625f,0.796875f, -0.664063f,0.796875f, -0.671875f,0.796875f, -0.679688f,0.796875f, -0.6875f,0.796875f, -0.695313f,0.796875f, -0.703125f,0.796875f, -0.710938f,0.796875f, -0.71875f,0.796875f, -0.726563f,0.796875f, -0.734375f,0.796875f, -0.742188f,0.796875f, -0.75f,0.796875f, -0.757813f,0.796875f, -0.765625f,0.796875f, -0.773438f,0.796875f, -0.78125f,0.796875f, -0.789063f,0.796875f, -0.796875f,0.796875f, -0.804688f,0.796875f, -0.8125f,0.796875f, -0.820313f,0.796875f, -0.828125f,0.796875f, -0.835938f,0.796875f, -0.84375f,0.796875f, -0.851563f,0.796875f, -0.859375f,0.796875f, -0.867188f,0.796875f, -0.875f,0.796875f, -0.882813f,0.796875f, -0.890625f,0.796875f, -0.898438f,0.796875f, -0.90625f,0.796875f, -0.914063f,0.796875f, -0.921875f,0.796875f, -0.929688f,0.796875f, -0.9375f,0.796875f, -0.945313f,0.796875f, -0.953125f,0.796875f, -0.960938f,0.796875f, -0.96875f,0.796875f, -0.976563f,0.796875f, -0.984375f,0.796875f, -0.992188f,0.796875f, -1.0f,0.796875f, -0.507813f,0.804688f, -0.515625f,0.804688f, -0.523438f,0.804688f, -0.53125f,0.804688f, -0.539063f,0.804688f, -0.546875f,0.804688f, -0.554688f,0.804688f, -0.5625f,0.804688f, -0.570313f,0.804688f, -0.578125f,0.804688f, -0.585938f,0.804688f, -0.59375f,0.804688f, -0.601563f,0.804688f, -0.609375f,0.804688f, -0.617188f,0.804688f, -0.625f,0.804688f, -0.632813f,0.804688f, -0.640625f,0.804688f, -0.648438f,0.804688f, -0.65625f,0.804688f, -0.664063f,0.804688f, -0.671875f,0.804688f, -0.679688f,0.804688f, -0.6875f,0.804688f, -0.695313f,0.804688f, -0.703125f,0.804688f, -0.710938f,0.804688f, -0.71875f,0.804688f, -0.726563f,0.804688f, -0.734375f,0.804688f, -0.742188f,0.804688f, -0.75f,0.804688f, -0.757813f,0.804688f, -0.765625f,0.804688f, -0.773438f,0.804688f, -0.78125f,0.804688f, -0.789063f,0.804688f, -0.796875f,0.804688f, -0.804688f,0.804688f, -0.8125f,0.804688f, -0.820313f,0.804688f, -0.828125f,0.804688f, -0.835938f,0.804688f, -0.84375f,0.804688f, -0.851563f,0.804688f, -0.859375f,0.804688f, -0.867188f,0.804688f, -0.875f,0.804688f, -0.882813f,0.804688f, -0.890625f,0.804688f, -0.898438f,0.804688f, -0.90625f,0.804688f, -0.914063f,0.804688f, -0.921875f,0.804688f, -0.929688f,0.804688f, -0.9375f,0.804688f, -0.945313f,0.804688f, -0.953125f,0.804688f, -0.960938f,0.804688f, -0.96875f,0.804688f, -0.976563f,0.804688f, -0.984375f,0.804688f, -0.992188f,0.804688f, -1.0f,0.804688f, -0.507813f,0.8125f, -0.515625f,0.8125f, -0.523438f,0.8125f, -0.53125f,0.8125f, -0.539063f,0.8125f, -0.546875f,0.8125f, -0.554688f,0.8125f, -0.5625f,0.8125f, -0.570313f,0.8125f, -0.578125f,0.8125f, -0.585938f,0.8125f, -0.59375f,0.8125f, -0.601563f,0.8125f, -0.609375f,0.8125f, -0.617188f,0.8125f, -0.625f,0.8125f, -0.632813f,0.8125f, -0.640625f,0.8125f, -0.648438f,0.8125f, -0.65625f,0.8125f, -0.664063f,0.8125f, -0.671875f,0.8125f, -0.679688f,0.8125f, -0.6875f,0.8125f, -0.695313f,0.8125f, -0.703125f,0.8125f, -0.710938f,0.8125f, -0.71875f,0.8125f, -0.726563f,0.8125f, -0.734375f,0.8125f, -0.742188f,0.8125f, -0.75f,0.8125f, -0.757813f,0.8125f, -0.765625f,0.8125f, -0.773438f,0.8125f, -0.78125f,0.8125f, -0.789063f,0.8125f, -0.796875f,0.8125f, -0.804688f,0.8125f, -0.8125f,0.8125f, -0.820313f,0.8125f, -0.828125f,0.8125f, -0.835938f,0.8125f, -0.84375f,0.8125f, -0.851563f,0.8125f, -0.859375f,0.8125f, -0.867188f,0.8125f, -0.875f,0.8125f, -0.882813f,0.8125f, -0.890625f,0.8125f, -0.898438f,0.8125f, -0.90625f,0.8125f, -0.914063f,0.8125f, -0.921875f,0.8125f, -0.929688f,0.8125f, -0.9375f,0.8125f, -0.945313f,0.8125f, -0.953125f,0.8125f, -0.960938f,0.8125f, -0.96875f,0.8125f, -0.976563f,0.8125f, -0.984375f,0.8125f, -0.992188f,0.8125f, -1.0f,0.8125f, -0.507813f,0.820313f, -0.515625f,0.820313f, -0.523438f,0.820313f, -0.53125f,0.820313f, -0.539063f,0.820313f, -0.546875f,0.820313f, -0.554688f,0.820313f, -0.5625f,0.820313f, -0.570313f,0.820313f, -0.578125f,0.820313f, -0.585938f,0.820313f, -0.59375f,0.820313f, -0.601563f,0.820313f, -0.609375f,0.820313f, -0.617188f,0.820313f, -0.625f,0.820313f, -0.632813f,0.820313f, -0.640625f,0.820313f, -0.648438f,0.820313f, -0.65625f,0.820313f, -0.664063f,0.820313f, -0.671875f,0.820313f, -0.679688f,0.820313f, -0.6875f,0.820313f, -0.695313f,0.820313f, -0.703125f,0.820313f, -0.710938f,0.820313f, -0.71875f,0.820313f, -0.726563f,0.820313f, -0.734375f,0.820313f, -0.742188f,0.820313f, -0.75f,0.820313f, -0.757813f,0.820313f, -0.765625f,0.820313f, -0.773438f,0.820313f, -0.78125f,0.820313f, -0.789063f,0.820313f, -0.796875f,0.820313f, -0.804688f,0.820313f, -0.8125f,0.820313f, -0.820313f,0.820313f, -0.828125f,0.820313f, -0.835938f,0.820313f, -0.84375f,0.820313f, -0.851563f,0.820313f, -0.859375f,0.820313f, -0.867188f,0.820313f, -0.875f,0.820313f, -0.882813f,0.820313f, -0.890625f,0.820313f, -0.898438f,0.820313f, -0.90625f,0.820313f, -0.914063f,0.820313f, -0.921875f,0.820313f, -0.929688f,0.820313f, -0.9375f,0.820313f, -0.945313f,0.820313f, -0.953125f,0.820313f, -0.960938f,0.820313f, -0.96875f,0.820313f, -0.976563f,0.820313f, -0.984375f,0.820313f, -0.992188f,0.820313f, -1.0f,0.820313f, -0.507813f,0.828125f, -0.515625f,0.828125f, -0.523438f,0.828125f, -0.53125f,0.828125f, -0.539063f,0.828125f, -0.546875f,0.828125f, -0.554688f,0.828125f, -0.5625f,0.828125f, -0.570313f,0.828125f, -0.578125f,0.828125f, -0.585938f,0.828125f, -0.59375f,0.828125f, -0.601563f,0.828125f, -0.609375f,0.828125f, -0.617188f,0.828125f, -0.625f,0.828125f, -0.632813f,0.828125f, -0.640625f,0.828125f, -0.648438f,0.828125f, -0.65625f,0.828125f, -0.664063f,0.828125f, -0.671875f,0.828125f, -0.679688f,0.828125f, -0.6875f,0.828125f, -0.695313f,0.828125f, -0.703125f,0.828125f, -0.710938f,0.828125f, -0.71875f,0.828125f, -0.726563f,0.828125f, -0.734375f,0.828125f, -0.742188f,0.828125f, -0.75f,0.828125f, -0.757813f,0.828125f, -0.765625f,0.828125f, -0.773438f,0.828125f, -0.78125f,0.828125f, -0.789063f,0.828125f, -0.796875f,0.828125f, -0.804688f,0.828125f, -0.8125f,0.828125f, -0.820313f,0.828125f, -0.828125f,0.828125f, -0.835938f,0.828125f, -0.84375f,0.828125f, -0.851563f,0.828125f, -0.859375f,0.828125f, -0.867188f,0.828125f, -0.875f,0.828125f, -0.882813f,0.828125f, -0.890625f,0.828125f, -0.898438f,0.828125f, -0.90625f,0.828125f, -0.914063f,0.828125f, -0.921875f,0.828125f, -0.929688f,0.828125f, -0.9375f,0.828125f, -0.945313f,0.828125f, -0.953125f,0.828125f, -0.960938f,0.828125f, -0.96875f,0.828125f, -0.976563f,0.828125f, -0.984375f,0.828125f, -0.992188f,0.828125f, -1.0f,0.828125f, -0.507813f,0.835938f, -0.515625f,0.835938f, -0.523438f,0.835938f, -0.53125f,0.835938f, -0.539063f,0.835938f, -0.546875f,0.835938f, -0.554688f,0.835938f, -0.5625f,0.835938f, -0.570313f,0.835938f, -0.578125f,0.835938f, -0.585938f,0.835938f, -0.59375f,0.835938f, -0.601563f,0.835938f, -0.609375f,0.835938f, -0.617188f,0.835938f, -0.625f,0.835938f, -0.632813f,0.835938f, -0.640625f,0.835938f, -0.648438f,0.835938f, -0.65625f,0.835938f, -0.664063f,0.835938f, -0.671875f,0.835938f, -0.679688f,0.835938f, -0.6875f,0.835938f, -0.695313f,0.835938f, -0.703125f,0.835938f, -0.710938f,0.835938f, -0.71875f,0.835938f, -0.726563f,0.835938f, -0.734375f,0.835938f, -0.742188f,0.835938f, -0.75f,0.835938f, -0.757813f,0.835938f, -0.765625f,0.835938f, -0.773438f,0.835938f, -0.78125f,0.835938f, -0.789063f,0.835938f, -0.796875f,0.835938f, -0.804688f,0.835938f, -0.8125f,0.835938f, -0.820313f,0.835938f, -0.828125f,0.835938f, -0.835938f,0.835938f, -0.84375f,0.835938f, -0.851563f,0.835938f, -0.859375f,0.835938f, -0.867188f,0.835938f, -0.875f,0.835938f, -0.882813f,0.835938f, -0.890625f,0.835938f, -0.898438f,0.835938f, -0.90625f,0.835938f, -0.914063f,0.835938f, -0.921875f,0.835938f, -0.929688f,0.835938f, -0.9375f,0.835938f, -0.945313f,0.835938f, -0.953125f,0.835938f, -0.960938f,0.835938f, -0.96875f,0.835938f, -0.976563f,0.835938f, -0.984375f,0.835938f, -0.992188f,0.835938f, -1.0f,0.835938f, -0.507813f,0.84375f, -0.515625f,0.84375f, -0.523438f,0.84375f, -0.53125f,0.84375f, -0.539063f,0.84375f, -0.546875f,0.84375f, -0.554688f,0.84375f, -0.5625f,0.84375f, -0.570313f,0.84375f, -0.578125f,0.84375f, -0.585938f,0.84375f, -0.59375f,0.84375f, -0.601563f,0.84375f, -0.609375f,0.84375f, -0.617188f,0.84375f, -0.625f,0.84375f, -0.632813f,0.84375f, -0.640625f,0.84375f, -0.648438f,0.84375f, -0.65625f,0.84375f, -0.664063f,0.84375f, -0.671875f,0.84375f, -0.679688f,0.84375f, -0.6875f,0.84375f, -0.695313f,0.84375f, -0.703125f,0.84375f, -0.710938f,0.84375f, -0.71875f,0.84375f, -0.726563f,0.84375f, -0.734375f,0.84375f, -0.742188f,0.84375f, -0.75f,0.84375f, -0.757813f,0.84375f, -0.765625f,0.84375f, -0.773438f,0.84375f, -0.78125f,0.84375f, -0.789063f,0.84375f, -0.796875f,0.84375f, -0.804688f,0.84375f, -0.8125f,0.84375f, -0.820313f,0.84375f, -0.828125f,0.84375f, -0.835938f,0.84375f, -0.84375f,0.84375f, -0.851563f,0.84375f, -0.859375f,0.84375f, -0.867188f,0.84375f, -0.875f,0.84375f, -0.882813f,0.84375f, -0.890625f,0.84375f, -0.898438f,0.84375f, -0.90625f,0.84375f, -0.914063f,0.84375f, -0.921875f,0.84375f, -0.929688f,0.84375f, -0.9375f,0.84375f, -0.945313f,0.84375f, -0.953125f,0.84375f, -0.960938f,0.84375f, -0.96875f,0.84375f, -0.976563f,0.84375f, -0.984375f,0.84375f, -0.992188f,0.84375f, -1.0f,0.84375f, -0.507813f,0.851563f, -0.515625f,0.851563f, -0.523438f,0.851563f, -0.53125f,0.851563f, -0.539063f,0.851563f, -0.546875f,0.851563f, -0.554688f,0.851563f, -0.5625f,0.851563f, -0.570313f,0.851563f, -0.578125f,0.851563f, -0.585938f,0.851563f, -0.59375f,0.851563f, -0.601563f,0.851563f, -0.609375f,0.851563f, -0.617188f,0.851563f, -0.625f,0.851563f, -0.632813f,0.851563f, -0.640625f,0.851563f, -0.648438f,0.851563f, -0.65625f,0.851563f, -0.664063f,0.851563f, -0.671875f,0.851563f, -0.679688f,0.851563f, -0.6875f,0.851563f, -0.695313f,0.851563f, -0.703125f,0.851563f, -0.710938f,0.851563f, -0.71875f,0.851563f, -0.726563f,0.851563f, -0.734375f,0.851563f, -0.742188f,0.851563f, -0.75f,0.851563f, -0.757813f,0.851563f, -0.765625f,0.851563f, -0.773438f,0.851563f, -0.78125f,0.851563f, -0.789063f,0.851563f, -0.796875f,0.851563f, -0.804688f,0.851563f, -0.8125f,0.851563f, -0.820313f,0.851563f, -0.828125f,0.851563f, -0.835938f,0.851563f, -0.84375f,0.851563f, -0.851563f,0.851563f, -0.859375f,0.851563f, -0.867188f,0.851563f, -0.875f,0.851563f, -0.882813f,0.851563f, -0.890625f,0.851563f, -0.898438f,0.851563f, -0.90625f,0.851563f, -0.914063f,0.851563f, -0.921875f,0.851563f, -0.929688f,0.851563f, -0.9375f,0.851563f, -0.945313f,0.851563f, -0.953125f,0.851563f, -0.960938f,0.851563f, -0.96875f,0.851563f, -0.976563f,0.851563f, -0.984375f,0.851563f, -0.992188f,0.851563f, -1.0f,0.851563f, -0.507813f,0.859375f, -0.515625f,0.859375f, -0.523438f,0.859375f, -0.53125f,0.859375f, -0.539063f,0.859375f, -0.546875f,0.859375f, -0.554688f,0.859375f, -0.5625f,0.859375f, -0.570313f,0.859375f, -0.578125f,0.859375f, -0.585938f,0.859375f, -0.59375f,0.859375f, -0.601563f,0.859375f, -0.609375f,0.859375f, -0.617188f,0.859375f, -0.625f,0.859375f, -0.632813f,0.859375f, -0.640625f,0.859375f, -0.648438f,0.859375f, -0.65625f,0.859375f, -0.664063f,0.859375f, -0.671875f,0.859375f, -0.679688f,0.859375f, -0.6875f,0.859375f, -0.695313f,0.859375f, -0.703125f,0.859375f, -0.710938f,0.859375f, -0.71875f,0.859375f, -0.726563f,0.859375f, -0.734375f,0.859375f, -0.742188f,0.859375f, -0.75f,0.859375f, -0.757813f,0.859375f, -0.765625f,0.859375f, -0.773438f,0.859375f, -0.78125f,0.859375f, -0.789063f,0.859375f, -0.796875f,0.859375f, -0.804688f,0.859375f, -0.8125f,0.859375f, -0.820313f,0.859375f, -0.828125f,0.859375f, -0.835938f,0.859375f, -0.84375f,0.859375f, -0.851563f,0.859375f, -0.859375f,0.859375f, -0.867188f,0.859375f, -0.875f,0.859375f, -0.882813f,0.859375f, -0.890625f,0.859375f, -0.898438f,0.859375f, -0.90625f,0.859375f, -0.914063f,0.859375f, -0.921875f,0.859375f, -0.929688f,0.859375f, -0.9375f,0.859375f, -0.945313f,0.859375f, -0.953125f,0.859375f, -0.960938f,0.859375f, -0.96875f,0.859375f, -0.976563f,0.859375f, -0.984375f,0.859375f, -0.992188f,0.859375f, -1.0f,0.859375f, -0.507813f,0.867188f, -0.515625f,0.867188f, -0.523438f,0.867188f, -0.53125f,0.867188f, -0.539063f,0.867188f, -0.546875f,0.867188f, -0.554688f,0.867188f, -0.5625f,0.867188f, -0.570313f,0.867188f, -0.578125f,0.867188f, -0.585938f,0.867188f, -0.59375f,0.867188f, -0.601563f,0.867188f, -0.609375f,0.867188f, -0.617188f,0.867188f, -0.625f,0.867188f, -0.632813f,0.867188f, -0.640625f,0.867188f, -0.648438f,0.867188f, -0.65625f,0.867188f, -0.664063f,0.867188f, -0.671875f,0.867188f, -0.679688f,0.867188f, -0.6875f,0.867188f, -0.695313f,0.867188f, -0.703125f,0.867188f, -0.710938f,0.867188f, -0.71875f,0.867188f, -0.726563f,0.867188f, -0.734375f,0.867188f, -0.742188f,0.867188f, -0.75f,0.867188f, -0.757813f,0.867188f, -0.765625f,0.867188f, -0.773438f,0.867188f, -0.78125f,0.867188f, -0.789063f,0.867188f, -0.796875f,0.867188f, -0.804688f,0.867188f, -0.8125f,0.867188f, -0.820313f,0.867188f, -0.828125f,0.867188f, -0.835938f,0.867188f, -0.84375f,0.867188f, -0.851563f,0.867188f, -0.859375f,0.867188f, -0.867188f,0.867188f, -0.875f,0.867188f, -0.882813f,0.867188f, -0.890625f,0.867188f, -0.898438f,0.867188f, -0.90625f,0.867188f, -0.914063f,0.867188f, -0.921875f,0.867188f, -0.929688f,0.867188f, -0.9375f,0.867188f, -0.945313f,0.867188f, -0.953125f,0.867188f, -0.960938f,0.867188f, -0.96875f,0.867188f, -0.976563f,0.867188f, -0.984375f,0.867188f, -0.992188f,0.867188f, -1.0f,0.867188f, -0.507813f,0.875f, -0.515625f,0.875f, -0.523438f,0.875f, -0.53125f,0.875f, -0.539063f,0.875f, -0.546875f,0.875f, -0.554688f,0.875f, -0.5625f,0.875f, -0.570313f,0.875f, -0.578125f,0.875f, -0.585938f,0.875f, -0.59375f,0.875f, -0.601563f,0.875f, -0.609375f,0.875f, -0.617188f,0.875f, -0.625f,0.875f, -0.632813f,0.875f, -0.640625f,0.875f, -0.648438f,0.875f, -0.65625f,0.875f, -0.664063f,0.875f, -0.671875f,0.875f, -0.679688f,0.875f, -0.6875f,0.875f, -0.695313f,0.875f, -0.703125f,0.875f, -0.710938f,0.875f, -0.71875f,0.875f, -0.726563f,0.875f, -0.734375f,0.875f, -0.742188f,0.875f, -0.75f,0.875f, -0.757813f,0.875f, -0.765625f,0.875f, -0.773438f,0.875f, -0.78125f,0.875f, -0.789063f,0.875f, -0.796875f,0.875f, -0.804688f,0.875f, -0.8125f,0.875f, -0.820313f,0.875f, -0.828125f,0.875f, -0.835938f,0.875f, -0.84375f,0.875f, -0.851563f,0.875f, -0.859375f,0.875f, -0.867188f,0.875f, -0.875f,0.875f, -0.882813f,0.875f, -0.890625f,0.875f, -0.898438f,0.875f, -0.90625f,0.875f, -0.914063f,0.875f, -0.921875f,0.875f, -0.929688f,0.875f, -0.9375f,0.875f, -0.945313f,0.875f, -0.953125f,0.875f, -0.960938f,0.875f, -0.96875f,0.875f, -0.976563f,0.875f, -0.984375f,0.875f, -0.992188f,0.875f, -1.0f,0.875f, -0.507813f,0.882813f, -0.515625f,0.882813f, -0.523438f,0.882813f, -0.53125f,0.882813f, -0.539063f,0.882813f, -0.546875f,0.882813f, -0.554688f,0.882813f, -0.5625f,0.882813f, -0.570313f,0.882813f, -0.578125f,0.882813f, -0.585938f,0.882813f, -0.59375f,0.882813f, -0.601563f,0.882813f, -0.609375f,0.882813f, -0.617188f,0.882813f, -0.625f,0.882813f, -0.632813f,0.882813f, -0.640625f,0.882813f, -0.648438f,0.882813f, -0.65625f,0.882813f, -0.664063f,0.882813f, -0.671875f,0.882813f, -0.679688f,0.882813f, -0.6875f,0.882813f, -0.695313f,0.882813f, -0.703125f,0.882813f, -0.710938f,0.882813f, -0.71875f,0.882813f, -0.726563f,0.882813f, -0.734375f,0.882813f, -0.742188f,0.882813f, -0.75f,0.882813f, -0.757813f,0.882813f, -0.765625f,0.882813f, -0.773438f,0.882813f, -0.78125f,0.882813f, -0.789063f,0.882813f, -0.796875f,0.882813f, -0.804688f,0.882813f, -0.8125f,0.882813f, -0.820313f,0.882813f, -0.828125f,0.882813f, -0.835938f,0.882813f, -0.84375f,0.882813f, -0.851563f,0.882813f, -0.859375f,0.882813f, -0.867188f,0.882813f, -0.875f,0.882813f, -0.882813f,0.882813f, -0.890625f,0.882813f, -0.898438f,0.882813f, -0.90625f,0.882813f, -0.914063f,0.882813f, -0.921875f,0.882813f, -0.929688f,0.882813f, -0.9375f,0.882813f, -0.945313f,0.882813f, -0.953125f,0.882813f, -0.960938f,0.882813f, -0.96875f,0.882813f, -0.976563f,0.882813f, -0.984375f,0.882813f, -0.992188f,0.882813f, -1.0f,0.882813f, -0.507813f,0.890625f, -0.515625f,0.890625f, -0.523438f,0.890625f, -0.53125f,0.890625f, -0.539063f,0.890625f, -0.546875f,0.890625f, -0.554688f,0.890625f, -0.5625f,0.890625f, -0.570313f,0.890625f, -0.578125f,0.890625f, -0.585938f,0.890625f, -0.59375f,0.890625f, -0.601563f,0.890625f, -0.609375f,0.890625f, -0.617188f,0.890625f, -0.625f,0.890625f, -0.632813f,0.890625f, -0.640625f,0.890625f, -0.648438f,0.890625f, -0.65625f,0.890625f, -0.664063f,0.890625f, -0.671875f,0.890625f, -0.679688f,0.890625f, -0.6875f,0.890625f, -0.695313f,0.890625f, -0.703125f,0.890625f, -0.710938f,0.890625f, -0.71875f,0.890625f, -0.726563f,0.890625f, -0.734375f,0.890625f, -0.742188f,0.890625f, -0.75f,0.890625f, -0.757813f,0.890625f, -0.765625f,0.890625f, -0.773438f,0.890625f, -0.78125f,0.890625f, -0.789063f,0.890625f, -0.796875f,0.890625f, -0.804688f,0.890625f, -0.8125f,0.890625f, -0.820313f,0.890625f, -0.828125f,0.890625f, -0.835938f,0.890625f, -0.84375f,0.890625f, -0.851563f,0.890625f, -0.859375f,0.890625f, -0.867188f,0.890625f, -0.875f,0.890625f, -0.882813f,0.890625f, -0.890625f,0.890625f, -0.898438f,0.890625f, -0.90625f,0.890625f, -0.914063f,0.890625f, -0.921875f,0.890625f, -0.929688f,0.890625f, -0.9375f,0.890625f, -0.945313f,0.890625f, -0.953125f,0.890625f, -0.960938f,0.890625f, -0.96875f,0.890625f, -0.976563f,0.890625f, -0.984375f,0.890625f, -0.992188f,0.890625f, -1.0f,0.890625f, -0.507813f,0.898438f, -0.515625f,0.898438f, -0.523438f,0.898438f, -0.53125f,0.898438f, -0.539063f,0.898438f, -0.546875f,0.898438f, -0.554688f,0.898438f, -0.5625f,0.898438f, -0.570313f,0.898438f, -0.578125f,0.898438f, -0.585938f,0.898438f, -0.59375f,0.898438f, -0.601563f,0.898438f, -0.609375f,0.898438f, -0.617188f,0.898438f, -0.625f,0.898438f, -0.632813f,0.898438f, -0.640625f,0.898438f, -0.648438f,0.898438f, -0.65625f,0.898438f, -0.664063f,0.898438f, -0.671875f,0.898438f, -0.679688f,0.898438f, -0.6875f,0.898438f, -0.695313f,0.898438f, -0.703125f,0.898438f, -0.710938f,0.898438f, -0.71875f,0.898438f, -0.726563f,0.898438f, -0.734375f,0.898438f, -0.742188f,0.898438f, -0.75f,0.898438f, -0.757813f,0.898438f, -0.765625f,0.898438f, -0.773438f,0.898438f, -0.78125f,0.898438f, -0.789063f,0.898438f, -0.796875f,0.898438f, -0.804688f,0.898438f, -0.8125f,0.898438f, -0.820313f,0.898438f, -0.828125f,0.898438f, -0.835938f,0.898438f, -0.84375f,0.898438f, -0.851563f,0.898438f, -0.859375f,0.898438f, -0.867188f,0.898438f, -0.875f,0.898438f, -0.882813f,0.898438f, -0.890625f,0.898438f, -0.898438f,0.898438f, -0.90625f,0.898438f, -0.914063f,0.898438f, -0.921875f,0.898438f, -0.929688f,0.898438f, -0.9375f,0.898438f, -0.945313f,0.898438f, -0.953125f,0.898438f, -0.960938f,0.898438f, -0.96875f,0.898438f, -0.976563f,0.898438f, -0.984375f,0.898438f, -0.992188f,0.898438f, -1.0f,0.898438f, -0.507813f,0.90625f, -0.515625f,0.90625f, -0.523438f,0.90625f, -0.53125f,0.90625f, -0.539063f,0.90625f, -0.546875f,0.90625f, -0.554688f,0.90625f, -0.5625f,0.90625f, -0.570313f,0.90625f, -0.578125f,0.90625f, -0.585938f,0.90625f, -0.59375f,0.90625f, -0.601563f,0.90625f, -0.609375f,0.90625f, -0.617188f,0.90625f, -0.625f,0.90625f, -0.632813f,0.90625f, -0.640625f,0.90625f, -0.648438f,0.90625f, -0.65625f,0.90625f, -0.664063f,0.90625f, -0.671875f,0.90625f, -0.679688f,0.90625f, -0.6875f,0.90625f, -0.695313f,0.90625f, -0.703125f,0.90625f, -0.710938f,0.90625f, -0.71875f,0.90625f, -0.726563f,0.90625f, -0.734375f,0.90625f, -0.742188f,0.90625f, -0.75f,0.90625f, -0.757813f,0.90625f, -0.765625f,0.90625f, -0.773438f,0.90625f, -0.78125f,0.90625f, -0.789063f,0.90625f, -0.796875f,0.90625f, -0.804688f,0.90625f, -0.8125f,0.90625f, -0.820313f,0.90625f, -0.828125f,0.90625f, -0.835938f,0.90625f, -0.84375f,0.90625f, -0.851563f,0.90625f, -0.859375f,0.90625f, -0.867188f,0.90625f, -0.875f,0.90625f, -0.882813f,0.90625f, -0.890625f,0.90625f, -0.898438f,0.90625f, -0.90625f,0.90625f, -0.914063f,0.90625f, -0.921875f,0.90625f, -0.929688f,0.90625f, -0.9375f,0.90625f, -0.945313f,0.90625f, -0.953125f,0.90625f, -0.960938f,0.90625f, -0.96875f,0.90625f, -0.976563f,0.90625f, -0.984375f,0.90625f, -0.992188f,0.90625f, -1.0f,0.90625f, -0.507813f,0.914063f, -0.515625f,0.914063f, -0.523438f,0.914063f, -0.53125f,0.914063f, -0.539063f,0.914063f, -0.546875f,0.914063f, -0.554688f,0.914063f, -0.5625f,0.914063f, -0.570313f,0.914063f, -0.578125f,0.914063f, -0.585938f,0.914063f, -0.59375f,0.914063f, -0.601563f,0.914063f, -0.609375f,0.914063f, -0.617188f,0.914063f, -0.625f,0.914063f, -0.632813f,0.914063f, -0.640625f,0.914063f, -0.648438f,0.914063f, -0.65625f,0.914063f, -0.664063f,0.914063f, -0.671875f,0.914063f, -0.679688f,0.914063f, -0.6875f,0.914063f, -0.695313f,0.914063f, -0.703125f,0.914063f, -0.710938f,0.914063f, -0.71875f,0.914063f, -0.726563f,0.914063f, -0.734375f,0.914063f, -0.742188f,0.914063f, -0.75f,0.914063f, -0.757813f,0.914063f, -0.765625f,0.914063f, -0.773438f,0.914063f, -0.78125f,0.914063f, -0.789063f,0.914063f, -0.796875f,0.914063f, -0.804688f,0.914063f, -0.8125f,0.914063f, -0.820313f,0.914063f, -0.828125f,0.914063f, -0.835938f,0.914063f, -0.84375f,0.914063f, -0.851563f,0.914063f, -0.859375f,0.914063f, -0.867188f,0.914063f, -0.875f,0.914063f, -0.882813f,0.914063f, -0.890625f,0.914063f, -0.898438f,0.914063f, -0.90625f,0.914063f, -0.914063f,0.914063f, -0.921875f,0.914063f, -0.929688f,0.914063f, -0.9375f,0.914063f, -0.945313f,0.914063f, -0.953125f,0.914063f, -0.960938f,0.914063f, -0.96875f,0.914063f, -0.976563f,0.914063f, -0.984375f,0.914063f, -0.992188f,0.914063f, -1.0f,0.914063f, -0.507813f,0.921875f, -0.515625f,0.921875f, -0.523438f,0.921875f, -0.53125f,0.921875f, -0.539063f,0.921875f, -0.546875f,0.921875f, -0.554688f,0.921875f, -0.5625f,0.921875f, -0.570313f,0.921875f, -0.578125f,0.921875f, -0.585938f,0.921875f, -0.59375f,0.921875f, -0.601563f,0.921875f, -0.609375f,0.921875f, -0.617188f,0.921875f, -0.625f,0.921875f, -0.632813f,0.921875f, -0.640625f,0.921875f, -0.648438f,0.921875f, -0.65625f,0.921875f, -0.664063f,0.921875f, -0.671875f,0.921875f, -0.679688f,0.921875f, -0.6875f,0.921875f, -0.695313f,0.921875f, -0.703125f,0.921875f, -0.710938f,0.921875f, -0.71875f,0.921875f, -0.726563f,0.921875f, -0.734375f,0.921875f, -0.742188f,0.921875f, -0.75f,0.921875f, -0.757813f,0.921875f, -0.765625f,0.921875f, -0.773438f,0.921875f, -0.78125f,0.921875f, -0.789063f,0.921875f, -0.796875f,0.921875f, -0.804688f,0.921875f, -0.8125f,0.921875f, -0.820313f,0.921875f, -0.828125f,0.921875f, -0.835938f,0.921875f, -0.84375f,0.921875f, -0.851563f,0.921875f, -0.859375f,0.921875f, -0.867188f,0.921875f, -0.875f,0.921875f, -0.882813f,0.921875f, -0.890625f,0.921875f, -0.898438f,0.921875f, -0.90625f,0.921875f, -0.914063f,0.921875f, -0.921875f,0.921875f, -0.929688f,0.921875f, -0.9375f,0.921875f, -0.945313f,0.921875f, -0.953125f,0.921875f, -0.960938f,0.921875f, -0.96875f,0.921875f, -0.976563f,0.921875f, -0.984375f,0.921875f, -0.992188f,0.921875f, -1.0f,0.921875f, -0.507813f,0.929688f, -0.515625f,0.929688f, -0.523438f,0.929688f, -0.53125f,0.929688f, -0.539063f,0.929688f, -0.546875f,0.929688f, -0.554688f,0.929688f, -0.5625f,0.929688f, -0.570313f,0.929688f, -0.578125f,0.929688f, -0.585938f,0.929688f, -0.59375f,0.929688f, -0.601563f,0.929688f, -0.609375f,0.929688f, -0.617188f,0.929688f, -0.625f,0.929688f, -0.632813f,0.929688f, -0.640625f,0.929688f, -0.648438f,0.929688f, -0.65625f,0.929688f, -0.664063f,0.929688f, -0.671875f,0.929688f, -0.679688f,0.929688f, -0.6875f,0.929688f, -0.695313f,0.929688f, -0.703125f,0.929688f, -0.710938f,0.929688f, -0.71875f,0.929688f, -0.726563f,0.929688f, -0.734375f,0.929688f, -0.742188f,0.929688f, -0.75f,0.929688f, -0.757813f,0.929688f, -0.765625f,0.929688f, -0.773438f,0.929688f, -0.78125f,0.929688f, -0.789063f,0.929688f, -0.796875f,0.929688f, -0.804688f,0.929688f, -0.8125f,0.929688f, -0.820313f,0.929688f, -0.828125f,0.929688f, -0.835938f,0.929688f, -0.84375f,0.929688f, -0.851563f,0.929688f, -0.859375f,0.929688f, -0.867188f,0.929688f, -0.875f,0.929688f, -0.882813f,0.929688f, -0.890625f,0.929688f, -0.898438f,0.929688f, -0.90625f,0.929688f, -0.914063f,0.929688f, -0.921875f,0.929688f, -0.929688f,0.929688f, -0.9375f,0.929688f, -0.945313f,0.929688f, -0.953125f,0.929688f, -0.960938f,0.929688f, -0.96875f,0.929688f, -0.976563f,0.929688f, -0.984375f,0.929688f, -0.992188f,0.929688f, -1.0f,0.929688f, -0.507813f,0.9375f, -0.515625f,0.9375f, -0.523438f,0.9375f, -0.53125f,0.9375f, -0.539063f,0.9375f, -0.546875f,0.9375f, -0.554688f,0.9375f, -0.5625f,0.9375f, -0.570313f,0.9375f, -0.578125f,0.9375f, -0.585938f,0.9375f, -0.59375f,0.9375f, -0.601563f,0.9375f, -0.609375f,0.9375f, -0.617188f,0.9375f, -0.625f,0.9375f, -0.632813f,0.9375f, -0.640625f,0.9375f, -0.648438f,0.9375f, -0.65625f,0.9375f, -0.664063f,0.9375f, -0.671875f,0.9375f, -0.679688f,0.9375f, -0.6875f,0.9375f, -0.695313f,0.9375f, -0.703125f,0.9375f, -0.710938f,0.9375f, -0.71875f,0.9375f, -0.726563f,0.9375f, -0.734375f,0.9375f, -0.742188f,0.9375f, -0.75f,0.9375f, -0.757813f,0.9375f, -0.765625f,0.9375f, -0.773438f,0.9375f, -0.78125f,0.9375f, -0.789063f,0.9375f, -0.796875f,0.9375f, -0.804688f,0.9375f, -0.8125f,0.9375f, -0.820313f,0.9375f, -0.828125f,0.9375f, -0.835938f,0.9375f, -0.84375f,0.9375f, -0.851563f,0.9375f, -0.859375f,0.9375f, -0.867188f,0.9375f, -0.875f,0.9375f, -0.882813f,0.9375f, -0.890625f,0.9375f, -0.898438f,0.9375f, -0.90625f,0.9375f, -0.914063f,0.9375f, -0.921875f,0.9375f, -0.929688f,0.9375f, -0.9375f,0.9375f, -0.945313f,0.9375f, -0.953125f,0.9375f, -0.960938f,0.9375f, -0.96875f,0.9375f, -0.976563f,0.9375f, -0.984375f,0.9375f, -0.992188f,0.9375f, -1.0f,0.9375f, -0.507813f,0.945313f, -0.515625f,0.945313f, -0.523438f,0.945313f, -0.53125f,0.945313f, -0.539063f,0.945313f, -0.546875f,0.945313f, -0.554688f,0.945313f, -0.5625f,0.945313f, -0.570313f,0.945313f, -0.578125f,0.945313f, -0.585938f,0.945313f, -0.59375f,0.945313f, -0.601563f,0.945313f, -0.609375f,0.945313f, -0.617188f,0.945313f, -0.625f,0.945313f, -0.632813f,0.945313f, -0.640625f,0.945313f, -0.648438f,0.945313f, -0.65625f,0.945313f, -0.664063f,0.945313f, -0.671875f,0.945313f, -0.679688f,0.945313f, -0.6875f,0.945313f, -0.695313f,0.945313f, -0.703125f,0.945313f, -0.710938f,0.945313f, -0.71875f,0.945313f, -0.726563f,0.945313f, -0.734375f,0.945313f, -0.742188f,0.945313f, -0.75f,0.945313f, -0.757813f,0.945313f, -0.765625f,0.945313f, -0.773438f,0.945313f, -0.78125f,0.945313f, -0.789063f,0.945313f, -0.796875f,0.945313f, -0.804688f,0.945313f, -0.8125f,0.945313f, -0.820313f,0.945313f, -0.828125f,0.945313f, -0.835938f,0.945313f, -0.84375f,0.945313f, -0.851563f,0.945313f, -0.859375f,0.945313f, -0.867188f,0.945313f, -0.875f,0.945313f, -0.882813f,0.945313f, -0.890625f,0.945313f, -0.898438f,0.945313f, -0.90625f,0.945313f, -0.914063f,0.945313f, -0.921875f,0.945313f, -0.929688f,0.945313f, -0.9375f,0.945313f, -0.945313f,0.945313f, -0.953125f,0.945313f, -0.960938f,0.945313f, -0.96875f,0.945313f, -0.976563f,0.945313f, -0.984375f,0.945313f, -0.992188f,0.945313f, -1.0f,0.945313f, -0.507813f,0.953125f, -0.515625f,0.953125f, -0.523438f,0.953125f, -0.53125f,0.953125f, -0.539063f,0.953125f, -0.546875f,0.953125f, -0.554688f,0.953125f, -0.5625f,0.953125f, -0.570313f,0.953125f, -0.578125f,0.953125f, -0.585938f,0.953125f, -0.59375f,0.953125f, -0.601563f,0.953125f, -0.609375f,0.953125f, -0.617188f,0.953125f, -0.625f,0.953125f, -0.632813f,0.953125f, -0.640625f,0.953125f, -0.648438f,0.953125f, -0.65625f,0.953125f, -0.664063f,0.953125f, -0.671875f,0.953125f, -0.679688f,0.953125f, -0.6875f,0.953125f, -0.695313f,0.953125f, -0.703125f,0.953125f, -0.710938f,0.953125f, -0.71875f,0.953125f, -0.726563f,0.953125f, -0.734375f,0.953125f, -0.742188f,0.953125f, -0.75f,0.953125f, -0.757813f,0.953125f, -0.765625f,0.953125f, -0.773438f,0.953125f, -0.78125f,0.953125f, -0.789063f,0.953125f, -0.796875f,0.953125f, -0.804688f,0.953125f, -0.8125f,0.953125f, -0.820313f,0.953125f, -0.828125f,0.953125f, -0.835938f,0.953125f, -0.84375f,0.953125f, -0.851563f,0.953125f, -0.859375f,0.953125f, -0.867188f,0.953125f, -0.875f,0.953125f, -0.882813f,0.953125f, -0.890625f,0.953125f, -0.898438f,0.953125f, -0.90625f,0.953125f, -0.914063f,0.953125f, -0.921875f,0.953125f, -0.929688f,0.953125f, -0.9375f,0.953125f, -0.945313f,0.953125f, -0.953125f,0.953125f, -0.960938f,0.953125f, -0.96875f,0.953125f, -0.976563f,0.953125f, -0.984375f,0.953125f, -0.992188f,0.953125f, -1.0f,0.953125f, -0.507813f,0.960938f, -0.515625f,0.960938f, -0.523438f,0.960938f, -0.53125f,0.960938f, -0.539063f,0.960938f, -0.546875f,0.960938f, -0.554688f,0.960938f, -0.5625f,0.960938f, -0.570313f,0.960938f, -0.578125f,0.960938f, -0.585938f,0.960938f, -0.59375f,0.960938f, -0.601563f,0.960938f, -0.609375f,0.960938f, -0.617188f,0.960938f, -0.625f,0.960938f, -0.632813f,0.960938f, -0.640625f,0.960938f, -0.648438f,0.960938f, -0.65625f,0.960938f, -0.664063f,0.960938f, -0.671875f,0.960938f, -0.679688f,0.960938f, -0.6875f,0.960938f, -0.695313f,0.960938f, -0.703125f,0.960938f, -0.710938f,0.960938f, -0.71875f,0.960938f, -0.726563f,0.960938f, -0.734375f,0.960938f, -0.742188f,0.960938f, -0.75f,0.960938f, -0.757813f,0.960938f, -0.765625f,0.960938f, -0.773438f,0.960938f, -0.78125f,0.960938f, -0.789063f,0.960938f, -0.796875f,0.960938f, -0.804688f,0.960938f, -0.8125f,0.960938f, -0.820313f,0.960938f, -0.828125f,0.960938f, -0.835938f,0.960938f, -0.84375f,0.960938f, -0.851563f,0.960938f, -0.859375f,0.960938f, -0.867188f,0.960938f, -0.875f,0.960938f, -0.882813f,0.960938f, -0.890625f,0.960938f, -0.898438f,0.960938f, -0.90625f,0.960938f, -0.914063f,0.960938f, -0.921875f,0.960938f, -0.929688f,0.960938f, -0.9375f,0.960938f, -0.945313f,0.960938f, -0.953125f,0.960938f, -0.960938f,0.960938f, -0.96875f,0.960938f, -0.976563f,0.960938f, -0.984375f,0.960938f, -0.992188f,0.960938f, -1.0f,0.960938f, -0.507813f,0.96875f, -0.515625f,0.96875f, -0.523438f,0.96875f, -0.53125f,0.96875f, -0.539063f,0.96875f, -0.546875f,0.96875f, -0.554688f,0.96875f, -0.5625f,0.96875f, -0.570313f,0.96875f, -0.578125f,0.96875f, -0.585938f,0.96875f, -0.59375f,0.96875f, -0.601563f,0.96875f, -0.609375f,0.96875f, -0.617188f,0.96875f, -0.625f,0.96875f, -0.632813f,0.96875f, -0.640625f,0.96875f, -0.648438f,0.96875f, -0.65625f,0.96875f, -0.664063f,0.96875f, -0.671875f,0.96875f, -0.679688f,0.96875f, -0.6875f,0.96875f, -0.695313f,0.96875f, -0.703125f,0.96875f, -0.710938f,0.96875f, -0.71875f,0.96875f, -0.726563f,0.96875f, -0.734375f,0.96875f, -0.742188f,0.96875f, -0.75f,0.96875f, -0.757813f,0.96875f, -0.765625f,0.96875f, -0.773438f,0.96875f, -0.78125f,0.96875f, -0.789063f,0.96875f, -0.796875f,0.96875f, -0.804688f,0.96875f, -0.8125f,0.96875f, -0.820313f,0.96875f, -0.828125f,0.96875f, -0.835938f,0.96875f, -0.84375f,0.96875f, -0.851563f,0.96875f, -0.859375f,0.96875f, -0.867188f,0.96875f, -0.875f,0.96875f, -0.882813f,0.96875f, -0.890625f,0.96875f, -0.898438f,0.96875f, -0.90625f,0.96875f, -0.914063f,0.96875f, -0.921875f,0.96875f, -0.929688f,0.96875f, -0.9375f,0.96875f, -0.945313f,0.96875f, -0.953125f,0.96875f, -0.960938f,0.96875f, -0.96875f,0.96875f, -0.976563f,0.96875f, -0.984375f,0.96875f, -0.992188f,0.96875f, -1.0f,0.96875f, -0.507813f,0.976563f, -0.515625f,0.976563f, -0.523438f,0.976563f, -0.53125f,0.976563f, -0.539063f,0.976563f, -0.546875f,0.976563f, -0.554688f,0.976563f, -0.5625f,0.976563f, -0.570313f,0.976563f, -0.578125f,0.976563f, -0.585938f,0.976563f, -0.59375f,0.976563f, -0.601563f,0.976563f, -0.609375f,0.976563f, -0.617188f,0.976563f, -0.625f,0.976563f, -0.632813f,0.976563f, -0.640625f,0.976563f, -0.648438f,0.976563f, -0.65625f,0.976563f, -0.664063f,0.976563f, -0.671875f,0.976563f, -0.679688f,0.976563f, -0.6875f,0.976563f, -0.695313f,0.976563f, -0.703125f,0.976563f, -0.710938f,0.976563f, -0.71875f,0.976563f, -0.726563f,0.976563f, -0.734375f,0.976563f, -0.742188f,0.976563f, -0.75f,0.976563f, -0.757813f,0.976563f, -0.765625f,0.976563f, -0.773438f,0.976563f, -0.78125f,0.976563f, -0.789063f,0.976563f, -0.796875f,0.976563f, -0.804688f,0.976563f, -0.8125f,0.976563f, -0.820313f,0.976563f, -0.828125f,0.976563f, -0.835938f,0.976563f, -0.84375f,0.976563f, -0.851563f,0.976563f, -0.859375f,0.976563f, -0.867188f,0.976563f, -0.875f,0.976563f, -0.882813f,0.976563f, -0.890625f,0.976563f, -0.898438f,0.976563f, -0.90625f,0.976563f, -0.914063f,0.976563f, -0.921875f,0.976563f, -0.929688f,0.976563f, -0.9375f,0.976563f, -0.945313f,0.976563f, -0.953125f,0.976563f, -0.960938f,0.976563f, -0.96875f,0.976563f, -0.976563f,0.976563f, -0.984375f,0.976563f, -0.992188f,0.976563f, -1.0f,0.976563f, -0.507813f,0.984375f, -0.515625f,0.984375f, -0.523438f,0.984375f, -0.53125f,0.984375f, -0.539063f,0.984375f, -0.546875f,0.984375f, -0.554688f,0.984375f, -0.5625f,0.984375f, -0.570313f,0.984375f, -0.578125f,0.984375f, -0.585938f,0.984375f, -0.59375f,0.984375f, -0.601563f,0.984375f, -0.609375f,0.984375f, -0.617188f,0.984375f, -0.625f,0.984375f, -0.632813f,0.984375f, -0.640625f,0.984375f, -0.648438f,0.984375f, -0.65625f,0.984375f, -0.664063f,0.984375f, -0.671875f,0.984375f, -0.679688f,0.984375f, -0.6875f,0.984375f, -0.695313f,0.984375f, -0.703125f,0.984375f, -0.710938f,0.984375f, -0.71875f,0.984375f, -0.726563f,0.984375f, -0.734375f,0.984375f, -0.742188f,0.984375f, -0.75f,0.984375f, -0.757813f,0.984375f, -0.765625f,0.984375f, -0.773438f,0.984375f, -0.78125f,0.984375f, -0.789063f,0.984375f, -0.796875f,0.984375f, -0.804688f,0.984375f, -0.8125f,0.984375f, -0.820313f,0.984375f, -0.828125f,0.984375f, -0.835938f,0.984375f, -0.84375f,0.984375f, -0.851563f,0.984375f, -0.859375f,0.984375f, -0.867188f,0.984375f, -0.875f,0.984375f, -0.882813f,0.984375f, -0.890625f,0.984375f, -0.898438f,0.984375f, -0.90625f,0.984375f, -0.914063f,0.984375f, -0.921875f,0.984375f, -0.929688f,0.984375f, -0.9375f,0.984375f, -0.945313f,0.984375f, -0.953125f,0.984375f, -0.960938f,0.984375f, -0.96875f,0.984375f, -0.976563f,0.984375f, -0.984375f,0.984375f, -0.992188f,0.984375f, -1.0f,0.984375f, -0.507813f,0.992188f, -0.515625f,0.992188f, -0.523438f,0.992188f, -0.53125f,0.992188f, -0.539063f,0.992188f, -0.546875f,0.992188f, -0.554688f,0.992188f, -0.5625f,0.992188f, -0.570313f,0.992188f, -0.578125f,0.992188f, -0.585938f,0.992188f, -0.59375f,0.992188f, -0.601563f,0.992188f, -0.609375f,0.992188f, -0.617188f,0.992188f, -0.625f,0.992188f, -0.632813f,0.992188f, -0.640625f,0.992188f, -0.648438f,0.992188f, -0.65625f,0.992188f, -0.664063f,0.992188f, -0.671875f,0.992188f, -0.679688f,0.992188f, -0.6875f,0.992188f, -0.695313f,0.992188f, -0.703125f,0.992188f, -0.710938f,0.992188f, -0.71875f,0.992188f, -0.726563f,0.992188f, -0.734375f,0.992188f, -0.742188f,0.992188f, -0.75f,0.992188f, -0.757813f,0.992188f, -0.765625f,0.992188f, -0.773438f,0.992188f, -0.78125f,0.992188f, -0.789063f,0.992188f, -0.796875f,0.992188f, -0.804688f,0.992188f, -0.8125f,0.992188f, -0.820313f,0.992188f, -0.828125f,0.992188f, -0.835938f,0.992188f, -0.84375f,0.992188f, -0.851563f,0.992188f, -0.859375f,0.992188f, -0.867188f,0.992188f, -0.875f,0.992188f, -0.882813f,0.992188f, -0.890625f,0.992188f, -0.898438f,0.992188f, -0.90625f,0.992188f, -0.914063f,0.992188f, -0.921875f,0.992188f, -0.929688f,0.992188f, -0.9375f,0.992188f, -0.945313f,0.992188f, -0.953125f,0.992188f, -0.960938f,0.992188f, -0.96875f,0.992188f, -0.976563f,0.992188f, -0.984375f,0.992188f, -0.992188f,0.992188f, -1.0f,0.992188f, -0.507813f,1.0f, -0.515625f,1.0f, -0.523438f,1.0f, -0.53125f,1.0f, -0.539063f,1.0f, -0.546875f,1.0f, -0.554688f,1.0f, -0.5625f,1.0f, -0.570313f,1.0f, -0.578125f,1.0f, -0.585938f,1.0f, -0.59375f,1.0f, -0.601563f,1.0f, -0.609375f,1.0f, -0.617188f,1.0f, -0.625f,1.0f, -0.632813f,1.0f, -0.640625f,1.0f, -0.648438f,1.0f, -0.65625f,1.0f, -0.664063f,1.0f, -0.671875f,1.0f, -0.679688f,1.0f, -0.6875f,1.0f, -0.695313f,1.0f, -0.703125f,1.0f, -0.710938f,1.0f, -0.71875f,1.0f, -0.726563f,1.0f, -0.734375f,1.0f, -0.742188f,1.0f, -0.75f,1.0f, -0.757813f,1.0f, -0.765625f,1.0f, -0.773438f,1.0f, -0.78125f,1.0f, -0.789063f,1.0f, -0.796875f,1.0f, -0.804688f,1.0f, -0.8125f,1.0f, -0.820313f,1.0f, -0.828125f,1.0f, -0.835938f,1.0f, -0.84375f,1.0f, -0.851563f,1.0f, -0.859375f,1.0f, -0.867188f,1.0f, -0.875f,1.0f, -0.882813f,1.0f, -0.890625f,1.0f, -0.898438f,1.0f, -0.90625f,1.0f, -0.914063f,1.0f, -0.921875f,1.0f, -0.929688f,1.0f, -0.9375f,1.0f, -0.945313f,1.0f, -0.953125f,1.0f, -0.960938f,1.0f, -0.96875f,1.0f, -0.976563f,1.0f, -0.984375f,1.0f, -0.992188f,1.0f, -1.0f,1.0f, -}; - -unsigned short Landscape07Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -128,0,129, -2,129,0, -129,2,130, -4,130,2, -130,4,131, -6,131,4, -131,6,132, -8,132,6, -132,8,133, -10,133,8, -133,10,134, -12,134,10, -134,12,135, -14,135,12, -135,14,136, -16,136,14, -136,16,137, -18,137,16, -137,18,138, -20,138,18, -138,20,139, -22,139,20, -139,22,140, -24,140,22, -140,24,141, -26,141,24, -141,26,142, -28,142,26, -142,28,143, -30,143,28, -143,30,144, -32,144,30, -144,32,145, -34,145,32, -145,34,146, -36,146,34, -146,36,147, -38,147,36, -147,38,148, -40,148,38, -148,40,149, -42,149,40, -149,42,150, -44,150,42, -150,44,151, -46,151,44, -151,46,152, -48,152,46, -152,48,153, -50,153,48, -153,50,154, -52,154,50, -154,52,155, -54,155,52, -155,54,156, -56,156,54, -156,56,157, -58,157,56, -157,58,158, -60,158,58, -158,60,159, -62,159,60, -159,62,160, -64,160,62, -160,64,161, -66,161,64, -161,66,162, -68,162,66, -162,68,163, -70,163,68, -163,70,164, -72,164,70, -164,72,165, -74,165,72, -165,74,166, -76,166,74, -166,76,167, -78,167,76, -167,78,168, -80,168,78, -168,80,169, -82,169,80, -169,82,170, -84,170,82, -170,84,171, -86,171,84, -171,86,172, -88,172,86, -172,88,173, -90,173,88, -173,90,174, -92,174,90, -174,92,175, -94,175,92, -175,94,176, -96,176,94, -176,96,177, -98,177,96, -177,98,178, -100,178,98, -178,100,179, -102,179,100, -179,102,180, -104,180,102, -180,104,181, -106,181,104, -181,106,182, -108,182,106, -182,108,183, -110,183,108, -183,110,184, -112,184,110, -184,112,185, -114,185,112, -185,114,186, -116,186,114, -186,116,187, -118,187,116, -187,118,188, -120,188,118, -188,120,189, -122,189,120, -189,122,190, -124,190,122, -190,124,191, -126,191,124, -192,128,193, -129,193,128, -193,129,194, -130,194,129, -194,130,195, -131,195,130, -195,131,196, -132,196,131, -196,132,197, -133,197,132, -197,133,198, -134,198,133, -198,134,199, -135,199,134, -199,135,200, -136,200,135, -200,136,201, -137,201,136, -201,137,202, -138,202,137, -202,138,203, -139,203,138, -203,139,204, -140,204,139, -204,140,205, -141,205,140, -205,141,206, -142,206,141, -206,142,207, -143,207,142, -207,143,208, -144,208,143, -208,144,209, -145,209,144, -209,145,210, -146,210,145, -210,146,211, -147,211,146, -211,147,212, -148,212,147, -212,148,213, -149,213,148, -213,149,214, -150,214,149, -214,150,215, -151,215,150, -215,151,216, -152,216,151, -216,152,217, -153,217,152, -217,153,218, -154,218,153, -218,154,219, -155,219,154, -219,155,220, -156,220,155, -220,156,221, -157,221,156, -221,157,222, -158,222,157, -222,158,223, -159,223,158, -223,159,224, -160,224,159, -224,160,225, -161,225,160, -225,161,226, -162,226,161, -226,162,227, -163,227,162, -227,163,228, -164,228,163, -228,164,229, -165,229,164, -229,165,230, -166,230,165, -230,166,231, -167,231,166, -231,167,232, -168,232,167, -232,168,233, -169,233,168, -233,169,234, -170,234,169, -234,170,235, -171,235,170, -235,171,236, -172,236,171, -236,172,237, -173,237,172, -237,173,238, -174,238,173, -238,174,239, -175,239,174, -239,175,240, -176,240,175, -240,176,241, -177,241,176, -241,177,242, -178,242,177, -242,178,243, -179,243,178, -243,179,244, -180,244,179, -244,180,245, -181,245,180, -245,181,246, -182,246,181, -246,182,247, -183,247,182, -247,183,248, -184,248,183, -248,184,249, -185,249,184, -249,185,250, -186,250,185, -250,186,251, -187,251,186, -251,187,252, -188,252,187, -252,188,253, -189,253,188, -253,189,254, -190,254,189, -254,190,255, -191,255,190, -256,192,257, -193,257,192, -257,193,258, -194,258,193, -258,194,259, -195,259,194, -259,195,260, -196,260,195, -260,196,261, -197,261,196, -261,197,262, -198,262,197, -262,198,263, -199,263,198, -263,199,264, -200,264,199, -264,200,265, -201,265,200, -265,201,266, -202,266,201, -266,202,267, -203,267,202, -267,203,268, -204,268,203, -268,204,269, -205,269,204, -269,205,270, -206,270,205, -270,206,271, -207,271,206, -271,207,272, -208,272,207, -272,208,273, -209,273,208, -273,209,274, -210,274,209, -274,210,275, -211,275,210, -275,211,276, -212,276,211, -276,212,277, -213,277,212, -277,213,278, -214,278,213, -278,214,279, -215,279,214, -279,215,280, -216,280,215, -280,216,281, -217,281,216, -281,217,282, -218,282,217, -282,218,283, -219,283,218, -283,219,284, -220,284,219, -284,220,285, -221,285,220, -285,221,286, -222,286,221, -286,222,287, -223,287,222, -287,223,288, -224,288,223, -288,224,289, -225,289,224, -289,225,290, -226,290,225, -290,226,291, -227,291,226, -291,227,292, -228,292,227, -292,228,293, -229,293,228, -293,229,294, -230,294,229, -294,230,295, -231,295,230, -295,231,296, -232,296,231, -296,232,297, -233,297,232, -297,233,298, -234,298,233, -298,234,299, -235,299,234, -299,235,300, -236,300,235, -300,236,301, -237,301,236, -301,237,302, -238,302,237, -302,238,303, -239,303,238, -303,239,304, -240,304,239, -304,240,305, -241,305,240, -305,241,306, -242,306,241, -306,242,307, -243,307,242, -307,243,308, -244,308,243, -308,244,309, -245,309,244, -309,245,310, -246,310,245, -310,246,311, -247,311,246, -311,247,312, -248,312,247, -312,248,313, -249,313,248, -313,249,314, -250,314,249, -314,250,315, -251,315,250, -315,251,316, -252,316,251, -316,252,317, -253,317,252, -317,253,318, -254,318,253, -318,254,319, -255,319,254, -320,256,321, -257,321,256, -321,257,322, -258,322,257, -322,258,323, -259,323,258, -323,259,324, -260,324,259, -324,260,325, -261,325,260, -325,261,326, -262,326,261, -326,262,327, -263,327,262, -327,263,328, -264,328,263, -328,264,329, -265,329,264, -329,265,330, -266,330,265, -330,266,331, -267,331,266, -331,267,332, -268,332,267, -332,268,333, -269,333,268, -333,269,334, -270,334,269, -334,270,335, -271,335,270, -335,271,336, -272,336,271, -336,272,337, -273,337,272, -337,273,338, -274,338,273, -338,274,339, -275,339,274, -339,275,340, -276,340,275, -340,276,341, -277,341,276, -341,277,342, -278,342,277, -342,278,343, -279,343,278, -343,279,344, -280,344,279, -344,280,345, -281,345,280, -345,281,346, -282,346,281, -346,282,347, -283,347,282, -347,283,348, -284,348,283, -348,284,349, -285,349,284, -349,285,350, -286,350,285, -350,286,351, -287,351,286, -351,287,352, -288,352,287, -352,288,353, -289,353,288, -353,289,354, -290,354,289, -354,290,355, -291,355,290, -355,291,356, -292,356,291, -356,292,357, -293,357,292, -357,293,358, -294,358,293, -358,294,359, -295,359,294, -359,295,360, -296,360,295, -360,296,361, -297,361,296, -361,297,362, -298,362,297, -362,298,363, -299,363,298, -363,299,364, -300,364,299, -364,300,365, -301,365,300, -365,301,366, -302,366,301, -366,302,367, -303,367,302, -367,303,368, -304,368,303, -368,304,369, -305,369,304, -369,305,370, -306,370,305, -370,306,371, -307,371,306, -371,307,372, -308,372,307, -372,308,373, -309,373,308, -373,309,374, -310,374,309, -374,310,375, -311,375,310, -375,311,376, -312,376,311, -376,312,377, -313,377,312, -377,313,378, -314,378,313, -378,314,379, -315,379,314, -379,315,380, -316,380,315, -380,316,381, -317,381,316, -381,317,382, -318,382,317, -382,318,383, -319,383,318, -384,320,385, -321,385,320, -385,321,386, -322,386,321, -386,322,387, -323,387,322, -387,323,388, -324,388,323, -388,324,389, -325,389,324, -389,325,390, -326,390,325, -390,326,391, -327,391,326, -391,327,392, -328,392,327, -392,328,393, -329,393,328, -393,329,394, -330,394,329, -394,330,395, -331,395,330, -395,331,396, -332,396,331, -396,332,397, -333,397,332, -397,333,398, -334,398,333, -398,334,399, -335,399,334, -399,335,400, -336,400,335, -400,336,401, -337,401,336, -401,337,402, -338,402,337, -402,338,403, -339,403,338, -403,339,404, -340,404,339, -404,340,405, -341,405,340, -405,341,406, -342,406,341, -406,342,407, -343,407,342, -407,343,408, -344,408,343, -408,344,409, -345,409,344, -409,345,410, -346,410,345, -410,346,411, -347,411,346, -411,347,412, -348,412,347, -412,348,413, -349,413,348, -413,349,414, -350,414,349, -414,350,415, -351,415,350, -415,351,416, -352,416,351, -416,352,417, -353,417,352, -417,353,418, -354,418,353, -418,354,419, -355,419,354, -419,355,420, -356,420,355, -420,356,421, -357,421,356, -421,357,422, -358,422,357, -422,358,423, -359,423,358, -423,359,424, -360,424,359, -424,360,425, -361,425,360, -425,361,426, -362,426,361, -426,362,427, -363,427,362, -427,363,428, -364,428,363, -428,364,429, -365,429,364, -429,365,430, -366,430,365, -430,366,431, -367,431,366, -431,367,432, -368,432,367, -432,368,433, -369,433,368, -433,369,434, -370,434,369, -434,370,435, -371,435,370, -435,371,436, -372,436,371, -436,372,437, -373,437,372, -437,373,438, -374,438,373, -438,374,439, -375,439,374, -439,375,440, -376,440,375, -440,376,441, -377,441,376, -441,377,442, -378,442,377, -442,378,443, -379,443,378, -443,379,444, -380,444,379, -444,380,445, -381,445,380, -445,381,446, -382,446,381, -446,382,447, -383,447,382, -448,384,449, -385,449,384, -449,385,450, -386,450,385, -450,386,451, -387,451,386, -451,387,452, -388,452,387, -452,388,453, -389,453,388, -453,389,454, -390,454,389, -454,390,455, -391,455,390, -455,391,456, -392,456,391, -456,392,457, -393,457,392, -457,393,458, -394,458,393, -458,394,459, -395,459,394, -459,395,460, -396,460,395, -460,396,461, -397,461,396, -461,397,462, -398,462,397, -462,398,463, -399,463,398, -463,399,464, -400,464,399, -464,400,465, -401,465,400, -465,401,466, -402,466,401, -466,402,467, -403,467,402, -467,403,468, -404,468,403, -468,404,469, -405,469,404, -469,405,470, -406,470,405, -470,406,471, -407,471,406, -471,407,472, -408,472,407, -472,408,473, -409,473,408, -473,409,474, -410,474,409, -474,410,475, -411,475,410, -475,411,476, -412,476,411, -476,412,477, -413,477,412, -477,413,478, -414,478,413, -478,414,479, -415,479,414, -479,415,480, -416,480,415, -480,416,481, -417,481,416, -481,417,482, -418,482,417, -482,418,483, -419,483,418, -483,419,484, -420,484,419, -484,420,485, -421,485,420, -485,421,486, -422,486,421, -486,422,487, -423,487,422, -487,423,488, -424,488,423, -488,424,489, -425,489,424, -489,425,490, -426,490,425, -490,426,491, -427,491,426, -491,427,492, -428,492,427, -492,428,493, -429,493,428, -493,429,494, -430,494,429, -494,430,495, -431,495,430, -495,431,496, -432,496,431, -496,432,497, -433,497,432, -497,433,498, -434,498,433, -498,434,499, -435,499,434, -499,435,500, -436,500,435, -500,436,501, -437,501,436, -501,437,502, -438,502,437, -502,438,503, -439,503,438, -503,439,504, -440,504,439, -504,440,505, -441,505,440, -505,441,506, -442,506,441, -506,442,507, -443,507,442, -507,443,508, -444,508,443, -508,444,509, -445,509,444, -509,445,510, -446,510,445, -510,446,511, -447,511,446, -512,448,513, -449,513,448, -513,449,514, -450,514,449, -514,450,515, -451,515,450, -515,451,516, -452,516,451, -516,452,517, -453,517,452, -517,453,518, -454,518,453, -518,454,519, -455,519,454, -519,455,520, -456,520,455, -520,456,521, -457,521,456, -521,457,522, -458,522,457, -522,458,523, -459,523,458, -523,459,524, -460,524,459, -524,460,525, -461,525,460, -525,461,526, -462,526,461, -526,462,527, -463,527,462, -527,463,528, -464,528,463, -528,464,529, -465,529,464, -529,465,530, -466,530,465, -530,466,531, -467,531,466, -531,467,532, -468,532,467, -532,468,533, -469,533,468, -533,469,534, -470,534,469, -534,470,535, -471,535,470, -535,471,536, -472,536,471, -536,472,537, -473,537,472, -537,473,538, -474,538,473, -538,474,539, -475,539,474, -539,475,540, -476,540,475, -540,476,541, -477,541,476, -541,477,542, -478,542,477, -542,478,543, -479,543,478, -543,479,544, -480,544,479, -544,480,545, -481,545,480, -545,481,546, -482,546,481, -546,482,547, -483,547,482, -547,483,548, -484,548,483, -548,484,549, -485,549,484, -549,485,550, -486,550,485, -550,486,551, -487,551,486, -551,487,552, -488,552,487, -552,488,553, -489,553,488, -553,489,554, -490,554,489, -554,490,555, -491,555,490, -555,491,556, -492,556,491, -556,492,557, -493,557,492, -557,493,558, -494,558,493, -558,494,559, -495,559,494, -559,495,560, -496,560,495, -560,496,561, -497,561,496, -561,497,562, -498,562,497, -562,498,563, -499,563,498, -563,499,564, -500,564,499, -564,500,565, -501,565,500, -565,501,566, -502,566,501, -566,502,567, -503,567,502, -567,503,568, -504,568,503, -568,504,569, -505,569,504, -569,505,570, -506,570,505, -570,506,571, -507,571,506, -571,507,572, -508,572,507, -572,508,573, -509,573,508, -573,509,574, -510,574,509, -574,510,575, -511,575,510, -576,512,577, -513,577,512, -577,513,578, -514,578,513, -578,514,579, -515,579,514, -579,515,580, -516,580,515, -580,516,581, -517,581,516, -581,517,582, -518,582,517, -582,518,583, -519,583,518, -583,519,584, -520,584,519, -584,520,585, -521,585,520, -585,521,586, -522,586,521, -586,522,587, -523,587,522, -587,523,588, -524,588,523, -588,524,589, -525,589,524, -589,525,590, -526,590,525, -590,526,591, -527,591,526, -591,527,592, -528,592,527, -592,528,593, -529,593,528, -593,529,594, -530,594,529, -594,530,595, -531,595,530, -595,531,596, -532,596,531, -596,532,597, -533,597,532, -597,533,598, -534,598,533, -598,534,599, -535,599,534, -599,535,600, -536,600,535, -600,536,601, -537,601,536, -601,537,602, -538,602,537, -602,538,603, -539,603,538, -603,539,604, -540,604,539, -604,540,605, -541,605,540, -605,541,606, -542,606,541, -606,542,607, -543,607,542, -607,543,608, -544,608,543, -608,544,609, -545,609,544, -609,545,610, -546,610,545, -610,546,611, -547,611,546, -611,547,612, -548,612,547, -612,548,613, -549,613,548, -613,549,614, -550,614,549, -614,550,615, -551,615,550, -615,551,616, -552,616,551, -616,552,617, -553,617,552, -617,553,618, -554,618,553, -618,554,619, -555,619,554, -619,555,620, -556,620,555, -620,556,621, -557,621,556, -621,557,622, -558,622,557, -622,558,623, -559,623,558, -623,559,624, -560,624,559, -624,560,625, -561,625,560, -625,561,626, -562,626,561, -626,562,627, -563,627,562, -627,563,628, -564,628,563, -628,564,629, -565,629,564, -629,565,630, -566,630,565, -630,566,631, -567,631,566, -631,567,632, -568,632,567, -632,568,633, -569,633,568, -633,569,634, -570,634,569, -634,570,635, -571,635,570, -635,571,636, -572,636,571, -636,572,637, -573,637,572, -637,573,638, -574,638,573, -638,574,639, -575,639,574, -640,576,641, -577,641,576, -641,577,642, -578,642,577, -642,578,643, -579,643,578, -643,579,644, -580,644,579, -644,580,645, -581,645,580, -645,581,646, -582,646,581, -646,582,647, -583,647,582, -647,583,648, -584,648,583, -648,584,649, -585,649,584, -649,585,650, -586,650,585, -650,586,651, -587,651,586, -651,587,652, -588,652,587, -652,588,653, -589,653,588, -653,589,654, -590,654,589, -654,590,655, -591,655,590, -655,591,656, -592,656,591, -656,592,657, -593,657,592, -657,593,658, -594,658,593, -658,594,659, -595,659,594, -659,595,660, -596,660,595, -660,596,661, -597,661,596, -661,597,662, -598,662,597, -662,598,663, -599,663,598, -663,599,664, -600,664,599, -664,600,665, -601,665,600, -665,601,666, -602,666,601, -666,602,667, -603,667,602, -667,603,668, -604,668,603, -668,604,669, -605,669,604, -669,605,670, -606,670,605, -670,606,671, -607,671,606, -671,607,672, -608,672,607, -672,608,673, -609,673,608, -673,609,674, -610,674,609, -674,610,675, -611,675,610, -675,611,676, -612,676,611, -676,612,677, -613,677,612, -677,613,678, -614,678,613, -678,614,679, -615,679,614, -679,615,680, -616,680,615, -680,616,681, -617,681,616, -681,617,682, -618,682,617, -682,618,683, -619,683,618, -683,619,684, -620,684,619, -684,620,685, -621,685,620, -685,621,686, -622,686,621, -686,622,687, -623,687,622, -687,623,688, -624,688,623, -688,624,689, -625,689,624, -689,625,690, -626,690,625, -690,626,691, -627,691,626, -691,627,692, -628,692,627, -692,628,693, -629,693,628, -693,629,694, -630,694,629, -694,630,695, -631,695,630, -695,631,696, -632,696,631, -696,632,697, -633,697,632, -697,633,698, -634,698,633, -698,634,699, -635,699,634, -699,635,700, -636,700,635, -700,636,701, -637,701,636, -701,637,702, -638,702,637, -702,638,703, -639,703,638, -704,640,705, -641,705,640, -705,641,706, -642,706,641, -706,642,707, -643,707,642, -707,643,708, -644,708,643, -708,644,709, -645,709,644, -709,645,710, -646,710,645, -710,646,711, -647,711,646, -711,647,712, -648,712,647, -712,648,713, -649,713,648, -713,649,714, -650,714,649, -714,650,715, -651,715,650, -715,651,716, -652,716,651, -716,652,717, -653,717,652, -717,653,718, -654,718,653, -718,654,719, -655,719,654, -719,655,720, -656,720,655, -720,656,721, -657,721,656, -721,657,722, -658,722,657, -722,658,723, -659,723,658, -723,659,724, -660,724,659, -724,660,725, -661,725,660, -725,661,726, -662,726,661, -726,662,727, -663,727,662, -727,663,728, -664,728,663, -728,664,729, -665,729,664, -729,665,730, -666,730,665, -730,666,731, -667,731,666, -731,667,732, -668,732,667, -732,668,733, -669,733,668, -733,669,734, -670,734,669, -734,670,735, -671,735,670, -735,671,736, -672,736,671, -736,672,737, -673,737,672, -737,673,738, -674,738,673, -738,674,739, -675,739,674, -739,675,740, -676,740,675, -740,676,741, -677,741,676, -741,677,742, -678,742,677, -742,678,743, -679,743,678, -743,679,744, -680,744,679, -744,680,745, -681,745,680, -745,681,746, -682,746,681, -746,682,747, -683,747,682, -747,683,748, -684,748,683, -748,684,749, -685,749,684, -749,685,750, -686,750,685, -750,686,751, -687,751,686, -751,687,752, -688,752,687, -752,688,753, -689,753,688, -753,689,754, -690,754,689, -754,690,755, -691,755,690, -755,691,756, -692,756,691, -756,692,757, -693,757,692, -757,693,758, -694,758,693, -758,694,759, -695,759,694, -759,695,760, -696,760,695, -760,696,761, -697,761,696, -761,697,762, -698,762,697, -762,698,763, -699,763,698, -763,699,764, -700,764,699, -764,700,765, -701,765,700, -765,701,766, -702,766,701, -766,702,767, -703,767,702, -768,704,769, -705,769,704, -769,705,770, -706,770,705, -770,706,771, -707,771,706, -771,707,772, -708,772,707, -772,708,773, -709,773,708, -773,709,774, -710,774,709, -774,710,775, -711,775,710, -775,711,776, -712,776,711, -776,712,777, -713,777,712, -777,713,778, -714,778,713, -778,714,779, -715,779,714, -779,715,780, -716,780,715, -780,716,781, -717,781,716, -781,717,782, -718,782,717, -782,718,783, -719,783,718, -783,719,784, -720,784,719, -784,720,785, -721,785,720, -785,721,786, -722,786,721, -786,722,787, -723,787,722, -787,723,788, -724,788,723, -788,724,789, -725,789,724, -789,725,790, -726,790,725, -790,726,791, -727,791,726, -791,727,792, -728,792,727, -792,728,793, -729,793,728, -793,729,794, -730,794,729, -794,730,795, -731,795,730, -795,731,796, -732,796,731, -796,732,797, -733,797,732, -797,733,798, -734,798,733, -798,734,799, -735,799,734, -799,735,800, -736,800,735, -800,736,801, -737,801,736, -801,737,802, -738,802,737, -802,738,803, -739,803,738, -803,739,804, -740,804,739, -804,740,805, -741,805,740, -805,741,806, -742,806,741, -806,742,807, -743,807,742, -807,743,808, -744,808,743, -808,744,809, -745,809,744, -809,745,810, -746,810,745, -810,746,811, -747,811,746, -811,747,812, -748,812,747, -812,748,813, -749,813,748, -813,749,814, -750,814,749, -814,750,815, -751,815,750, -815,751,816, -752,816,751, -816,752,817, -753,817,752, -817,753,818, -754,818,753, -818,754,819, -755,819,754, -819,755,820, -756,820,755, -820,756,821, -757,821,756, -821,757,822, -758,822,757, -822,758,823, -759,823,758, -823,759,824, -760,824,759, -824,760,825, -761,825,760, -825,761,826, -762,826,761, -826,762,827, -763,827,762, -827,763,828, -764,828,763, -828,764,829, -765,829,764, -829,765,830, -766,830,765, -830,766,831, -767,831,766, -832,768,833, -769,833,768, -833,769,834, -770,834,769, -834,770,835, -771,835,770, -835,771,836, -772,836,771, -836,772,837, -773,837,772, -837,773,838, -774,838,773, -838,774,839, -775,839,774, -839,775,840, -776,840,775, -840,776,841, -777,841,776, -841,777,842, -778,842,777, -842,778,843, -779,843,778, -843,779,844, -780,844,779, -844,780,845, -781,845,780, -845,781,846, -782,846,781, -846,782,847, -783,847,782, -847,783,848, -784,848,783, -848,784,849, -785,849,784, -849,785,850, -786,850,785, -850,786,851, -787,851,786, -851,787,852, -788,852,787, -852,788,853, -789,853,788, -853,789,854, -790,854,789, -854,790,855, -791,855,790, -855,791,856, -792,856,791, -856,792,857, -793,857,792, -857,793,858, -794,858,793, -858,794,859, -795,859,794, -859,795,860, -796,860,795, -860,796,861, -797,861,796, -861,797,862, -798,862,797, -862,798,863, -799,863,798, -863,799,864, -800,864,799, -864,800,865, -801,865,800, -865,801,866, -802,866,801, -866,802,867, -803,867,802, -867,803,868, -804,868,803, -868,804,869, -805,869,804, -869,805,870, -806,870,805, -870,806,871, -807,871,806, -871,807,872, -808,872,807, -872,808,873, -809,873,808, -873,809,874, -810,874,809, -874,810,875, -811,875,810, -875,811,876, -812,876,811, -876,812,877, -813,877,812, -877,813,878, -814,878,813, -878,814,879, -815,879,814, -879,815,880, -816,880,815, -880,816,881, -817,881,816, -881,817,882, -818,882,817, -882,818,883, -819,883,818, -883,819,884, -820,884,819, -884,820,885, -821,885,820, -885,821,886, -822,886,821, -886,822,887, -823,887,822, -887,823,888, -824,888,823, -888,824,889, -825,889,824, -889,825,890, -826,890,825, -890,826,891, -827,891,826, -891,827,892, -828,892,827, -892,828,893, -829,893,828, -893,829,894, -830,894,829, -894,830,895, -831,895,830, -896,832,897, -833,897,832, -897,833,898, -834,898,833, -898,834,899, -835,899,834, -899,835,900, -836,900,835, -900,836,901, -837,901,836, -901,837,902, -838,902,837, -902,838,903, -839,903,838, -903,839,904, -840,904,839, -904,840,905, -841,905,840, -905,841,906, -842,906,841, -906,842,907, -843,907,842, -907,843,908, -844,908,843, -908,844,909, -845,909,844, -909,845,910, -846,910,845, -910,846,911, -847,911,846, -911,847,912, -848,912,847, -912,848,913, -849,913,848, -913,849,914, -850,914,849, -914,850,915, -851,915,850, -915,851,916, -852,916,851, -916,852,917, -853,917,852, -917,853,918, -854,918,853, -918,854,919, -855,919,854, -919,855,920, -856,920,855, -920,856,921, -857,921,856, -921,857,922, -858,922,857, -922,858,923, -859,923,858, -923,859,924, -860,924,859, -924,860,925, -861,925,860, -925,861,926, -862,926,861, -926,862,927, -863,927,862, -927,863,928, -864,928,863, -928,864,929, -865,929,864, -929,865,930, -866,930,865, -930,866,931, -867,931,866, -931,867,932, -868,932,867, -932,868,933, -869,933,868, -933,869,934, -870,934,869, -934,870,935, -871,935,870, -935,871,936, -872,936,871, -936,872,937, -873,937,872, -937,873,938, -874,938,873, -938,874,939, -875,939,874, -939,875,940, -876,940,875, -940,876,941, -877,941,876, -941,877,942, -878,942,877, -942,878,943, -879,943,878, -943,879,944, -880,944,879, -944,880,945, -881,945,880, -945,881,946, -882,946,881, -946,882,947, -883,947,882, -947,883,948, -884,948,883, -948,884,949, -885,949,884, -949,885,950, -886,950,885, -950,886,951, -887,951,886, -951,887,952, -888,952,887, -952,888,953, -889,953,888, -953,889,954, -890,954,889, -954,890,955, -891,955,890, -955,891,956, -892,956,891, -956,892,957, -893,957,892, -957,893,958, -894,958,893, -958,894,959, -895,959,894, -960,896,961, -897,961,896, -961,897,962, -898,962,897, -962,898,963, -899,963,898, -963,899,964, -900,964,899, -964,900,965, -901,965,900, -965,901,966, -902,966,901, -966,902,967, -903,967,902, -967,903,968, -904,968,903, -968,904,969, -905,969,904, -969,905,970, -906,970,905, -970,906,971, -907,971,906, -971,907,972, -908,972,907, -972,908,973, -909,973,908, -973,909,974, -910,974,909, -974,910,975, -911,975,910, -975,911,976, -912,976,911, -976,912,977, -913,977,912, -977,913,978, -914,978,913, -978,914,979, -915,979,914, -979,915,980, -916,980,915, -980,916,981, -917,981,916, -981,917,982, -918,982,917, -982,918,983, -919,983,918, -983,919,984, -920,984,919, -984,920,985, -921,985,920, -985,921,986, -922,986,921, -986,922,987, -923,987,922, -987,923,988, -924,988,923, -988,924,989, -925,989,924, -989,925,990, -926,990,925, -990,926,991, -927,991,926, -991,927,992, -928,992,927, -992,928,993, -929,993,928, -993,929,994, -930,994,929, -994,930,995, -931,995,930, -995,931,996, -932,996,931, -996,932,997, -933,997,932, -997,933,998, -934,998,933, -998,934,999, -935,999,934, -999,935,1000, -936,1000,935, -1000,936,1001, -937,1001,936, -1001,937,1002, -938,1002,937, -1002,938,1003, -939,1003,938, -1003,939,1004, -940,1004,939, -1004,940,1005, -941,1005,940, -1005,941,1006, -942,1006,941, -1006,942,1007, -943,1007,942, -1007,943,1008, -944,1008,943, -1008,944,1009, -945,1009,944, -1009,945,1010, -946,1010,945, -1010,946,1011, -947,1011,946, -1011,947,1012, -948,1012,947, -1012,948,1013, -949,1013,948, -1013,949,1014, -950,1014,949, -1014,950,1015, -951,1015,950, -1015,951,1016, -952,1016,951, -1016,952,1017, -953,1017,952, -1017,953,1018, -954,1018,953, -1018,954,1019, -955,1019,954, -1019,955,1020, -956,1020,955, -1020,956,1021, -957,1021,956, -1021,957,1022, -958,1022,957, -1022,958,1023, -959,1023,958, -1024,960,1025, -961,1025,960, -1025,961,1026, -962,1026,961, -1026,962,1027, -963,1027,962, -1027,963,1028, -964,1028,963, -1028,964,1029, -965,1029,964, -1029,965,1030, -966,1030,965, -1030,966,1031, -967,1031,966, -1031,967,1032, -968,1032,967, -1032,968,1033, -969,1033,968, -1033,969,1034, -970,1034,969, -1034,970,1035, -971,1035,970, -1035,971,1036, -972,1036,971, -1036,972,1037, -973,1037,972, -1037,973,1038, -974,1038,973, -1038,974,1039, -975,1039,974, -1039,975,1040, -976,1040,975, -1040,976,1041, -977,1041,976, -1041,977,1042, -978,1042,977, -1042,978,1043, -979,1043,978, -1043,979,1044, -980,1044,979, -1044,980,1045, -981,1045,980, -1045,981,1046, -982,1046,981, -1046,982,1047, -983,1047,982, -1047,983,1048, -984,1048,983, -1048,984,1049, -985,1049,984, -1049,985,1050, -986,1050,985, -1050,986,1051, -987,1051,986, -1051,987,1052, -988,1052,987, -1052,988,1053, -989,1053,988, -1053,989,1054, -990,1054,989, -1054,990,1055, -991,1055,990, -1055,991,1056, -992,1056,991, -1056,992,1057, -993,1057,992, -1057,993,1058, -994,1058,993, -1058,994,1059, -995,1059,994, -1059,995,1060, -996,1060,995, -1060,996,1061, -997,1061,996, -1061,997,1062, -998,1062,997, -1062,998,1063, -999,1063,998, -1063,999,1064, -1000,1064,999, -1064,1000,1065, -1001,1065,1000, -1065,1001,1066, -1002,1066,1001, -1066,1002,1067, -1003,1067,1002, -1067,1003,1068, -1004,1068,1003, -1068,1004,1069, -1005,1069,1004, -1069,1005,1070, -1006,1070,1005, -1070,1006,1071, -1007,1071,1006, -1071,1007,1072, -1008,1072,1007, -1072,1008,1073, -1009,1073,1008, -1073,1009,1074, -1010,1074,1009, -1074,1010,1075, -1011,1075,1010, -1075,1011,1076, -1012,1076,1011, -1076,1012,1077, -1013,1077,1012, -1077,1013,1078, -1014,1078,1013, -1078,1014,1079, -1015,1079,1014, -1079,1015,1080, -1016,1080,1015, -1080,1016,1081, -1017,1081,1016, -1081,1017,1082, -1018,1082,1017, -1082,1018,1083, -1019,1083,1018, -1083,1019,1084, -1020,1084,1019, -1084,1020,1085, -1021,1085,1020, -1085,1021,1086, -1022,1086,1021, -1086,1022,1087, -1023,1087,1022, -1088,1024,1089, -1025,1089,1024, -1089,1025,1090, -1026,1090,1025, -1090,1026,1091, -1027,1091,1026, -1091,1027,1092, -1028,1092,1027, -1092,1028,1093, -1029,1093,1028, -1093,1029,1094, -1030,1094,1029, -1094,1030,1095, -1031,1095,1030, -1095,1031,1096, -1032,1096,1031, -1096,1032,1097, -1033,1097,1032, -1097,1033,1098, -1034,1098,1033, -1098,1034,1099, -1035,1099,1034, -1099,1035,1100, -1036,1100,1035, -1100,1036,1101, -1037,1101,1036, -1101,1037,1102, -1038,1102,1037, -1102,1038,1103, -1039,1103,1038, -1103,1039,1104, -1040,1104,1039, -1104,1040,1105, -1041,1105,1040, -1105,1041,1106, -1042,1106,1041, -1106,1042,1107, -1043,1107,1042, -1107,1043,1108, -1044,1108,1043, -1108,1044,1109, -1045,1109,1044, -1109,1045,1110, -1046,1110,1045, -1110,1046,1111, -1047,1111,1046, -1111,1047,1112, -1048,1112,1047, -1112,1048,1113, -1049,1113,1048, -1113,1049,1114, -1050,1114,1049, -1114,1050,1115, -1051,1115,1050, -1115,1051,1116, -1052,1116,1051, -1116,1052,1117, -1053,1117,1052, -1117,1053,1118, -1054,1118,1053, -1118,1054,1119, -1055,1119,1054, -1119,1055,1120, -1056,1120,1055, -1120,1056,1121, -1057,1121,1056, -1121,1057,1122, -1058,1122,1057, -1122,1058,1123, -1059,1123,1058, -1123,1059,1124, -1060,1124,1059, -1124,1060,1125, -1061,1125,1060, -1125,1061,1126, -1062,1126,1061, -1126,1062,1127, -1063,1127,1062, -1127,1063,1128, -1064,1128,1063, -1128,1064,1129, -1065,1129,1064, -1129,1065,1130, -1066,1130,1065, -1130,1066,1131, -1067,1131,1066, -1131,1067,1132, -1068,1132,1067, -1132,1068,1133, -1069,1133,1068, -1133,1069,1134, -1070,1134,1069, -1134,1070,1135, -1071,1135,1070, -1135,1071,1136, -1072,1136,1071, -1136,1072,1137, -1073,1137,1072, -1137,1073,1138, -1074,1138,1073, -1138,1074,1139, -1075,1139,1074, -1139,1075,1140, -1076,1140,1075, -1140,1076,1141, -1077,1141,1076, -1141,1077,1142, -1078,1142,1077, -1142,1078,1143, -1079,1143,1078, -1143,1079,1144, -1080,1144,1079, -1144,1080,1145, -1081,1145,1080, -1145,1081,1146, -1082,1146,1081, -1146,1082,1147, -1083,1147,1082, -1147,1083,1148, -1084,1148,1083, -1148,1084,1149, -1085,1149,1084, -1149,1085,1150, -1086,1150,1085, -1150,1086,1151, -1087,1151,1086, -1152,1088,1153, -1089,1153,1088, -1153,1089,1154, -1090,1154,1089, -1154,1090,1155, -1091,1155,1090, -1155,1091,1156, -1092,1156,1091, -1156,1092,1157, -1093,1157,1092, -1157,1093,1158, -1094,1158,1093, -1158,1094,1159, -1095,1159,1094, -1159,1095,1160, -1096,1160,1095, -1160,1096,1161, -1097,1161,1096, -1161,1097,1162, -1098,1162,1097, -1162,1098,1163, -1099,1163,1098, -1163,1099,1164, -1100,1164,1099, -1164,1100,1165, -1101,1165,1100, -1165,1101,1166, -1102,1166,1101, -1166,1102,1167, -1103,1167,1102, -1167,1103,1168, -1104,1168,1103, -1168,1104,1169, -1105,1169,1104, -1169,1105,1170, -1106,1170,1105, -1170,1106,1171, -1107,1171,1106, -1171,1107,1172, -1108,1172,1107, -1172,1108,1173, -1109,1173,1108, -1173,1109,1174, -1110,1174,1109, -1174,1110,1175, -1111,1175,1110, -1175,1111,1176, -1112,1176,1111, -1176,1112,1177, -1113,1177,1112, -1177,1113,1178, -1114,1178,1113, -1178,1114,1179, -1115,1179,1114, -1179,1115,1180, -1116,1180,1115, -1180,1116,1181, -1117,1181,1116, -1181,1117,1182, -1118,1182,1117, -1182,1118,1183, -1119,1183,1118, -1183,1119,1184, -1120,1184,1119, -1184,1120,1185, -1121,1185,1120, -1185,1121,1186, -1122,1186,1121, -1186,1122,1187, -1123,1187,1122, -1187,1123,1188, -1124,1188,1123, -1188,1124,1189, -1125,1189,1124, -1189,1125,1190, -1126,1190,1125, -1190,1126,1191, -1127,1191,1126, -1191,1127,1192, -1128,1192,1127, -1192,1128,1193, -1129,1193,1128, -1193,1129,1194, -1130,1194,1129, -1194,1130,1195, -1131,1195,1130, -1195,1131,1196, -1132,1196,1131, -1196,1132,1197, -1133,1197,1132, -1197,1133,1198, -1134,1198,1133, -1198,1134,1199, -1135,1199,1134, -1199,1135,1200, -1136,1200,1135, -1200,1136,1201, -1137,1201,1136, -1201,1137,1202, -1138,1202,1137, -1202,1138,1203, -1139,1203,1138, -1203,1139,1204, -1140,1204,1139, -1204,1140,1205, -1141,1205,1140, -1205,1141,1206, -1142,1206,1141, -1206,1142,1207, -1143,1207,1142, -1207,1143,1208, -1144,1208,1143, -1208,1144,1209, -1145,1209,1144, -1209,1145,1210, -1146,1210,1145, -1210,1146,1211, -1147,1211,1146, -1211,1147,1212, -1148,1212,1147, -1212,1148,1213, -1149,1213,1148, -1213,1149,1214, -1150,1214,1149, -1214,1150,1215, -1151,1215,1150, -1216,1152,1217, -1153,1217,1152, -1217,1153,1218, -1154,1218,1153, -1218,1154,1219, -1155,1219,1154, -1219,1155,1220, -1156,1220,1155, -1220,1156,1221, -1157,1221,1156, -1221,1157,1222, -1158,1222,1157, -1222,1158,1223, -1159,1223,1158, -1223,1159,1224, -1160,1224,1159, -1224,1160,1225, -1161,1225,1160, -1225,1161,1226, -1162,1226,1161, -1226,1162,1227, -1163,1227,1162, -1227,1163,1228, -1164,1228,1163, -1228,1164,1229, -1165,1229,1164, -1229,1165,1230, -1166,1230,1165, -1230,1166,1231, -1167,1231,1166, -1231,1167,1232, -1168,1232,1167, -1232,1168,1233, -1169,1233,1168, -1233,1169,1234, -1170,1234,1169, -1234,1170,1235, -1171,1235,1170, -1235,1171,1236, -1172,1236,1171, -1236,1172,1237, -1173,1237,1172, -1237,1173,1238, -1174,1238,1173, -1238,1174,1239, -1175,1239,1174, -1239,1175,1240, -1176,1240,1175, -1240,1176,1241, -1177,1241,1176, -1241,1177,1242, -1178,1242,1177, -1242,1178,1243, -1179,1243,1178, -1243,1179,1244, -1180,1244,1179, -1244,1180,1245, -1181,1245,1180, -1245,1181,1246, -1182,1246,1181, -1246,1182,1247, -1183,1247,1182, -1247,1183,1248, -1184,1248,1183, -1248,1184,1249, -1185,1249,1184, -1249,1185,1250, -1186,1250,1185, -1250,1186,1251, -1187,1251,1186, -1251,1187,1252, -1188,1252,1187, -1252,1188,1253, -1189,1253,1188, -1253,1189,1254, -1190,1254,1189, -1254,1190,1255, -1191,1255,1190, -1255,1191,1256, -1192,1256,1191, -1256,1192,1257, -1193,1257,1192, -1257,1193,1258, -1194,1258,1193, -1258,1194,1259, -1195,1259,1194, -1259,1195,1260, -1196,1260,1195, -1260,1196,1261, -1197,1261,1196, -1261,1197,1262, -1198,1262,1197, -1262,1198,1263, -1199,1263,1198, -1263,1199,1264, -1200,1264,1199, -1264,1200,1265, -1201,1265,1200, -1265,1201,1266, -1202,1266,1201, -1266,1202,1267, -1203,1267,1202, -1267,1203,1268, -1204,1268,1203, -1268,1204,1269, -1205,1269,1204, -1269,1205,1270, -1206,1270,1205, -1270,1206,1271, -1207,1271,1206, -1271,1207,1272, -1208,1272,1207, -1272,1208,1273, -1209,1273,1208, -1273,1209,1274, -1210,1274,1209, -1274,1210,1275, -1211,1275,1210, -1275,1211,1276, -1212,1276,1211, -1276,1212,1277, -1213,1277,1212, -1277,1213,1278, -1214,1278,1213, -1278,1214,1279, -1215,1279,1214, -1280,1216,1281, -1217,1281,1216, -1281,1217,1282, -1218,1282,1217, -1282,1218,1283, -1219,1283,1218, -1283,1219,1284, -1220,1284,1219, -1284,1220,1285, -1221,1285,1220, -1285,1221,1286, -1222,1286,1221, -1286,1222,1287, -1223,1287,1222, -1287,1223,1288, -1224,1288,1223, -1288,1224,1289, -1225,1289,1224, -1289,1225,1290, -1226,1290,1225, -1290,1226,1291, -1227,1291,1226, -1291,1227,1292, -1228,1292,1227, -1292,1228,1293, -1229,1293,1228, -1293,1229,1294, -1230,1294,1229, -1294,1230,1295, -1231,1295,1230, -1295,1231,1296, -1232,1296,1231, -1296,1232,1297, -1233,1297,1232, -1297,1233,1298, -1234,1298,1233, -1298,1234,1299, -1235,1299,1234, -1299,1235,1300, -1236,1300,1235, -1300,1236,1301, -1237,1301,1236, -1301,1237,1302, -1238,1302,1237, -1302,1238,1303, -1239,1303,1238, -1303,1239,1304, -1240,1304,1239, -1304,1240,1305, -1241,1305,1240, -1305,1241,1306, -1242,1306,1241, -1306,1242,1307, -1243,1307,1242, -1307,1243,1308, -1244,1308,1243, -1308,1244,1309, -1245,1309,1244, -1309,1245,1310, -1246,1310,1245, -1310,1246,1311, -1247,1311,1246, -1311,1247,1312, -1248,1312,1247, -1312,1248,1313, -1249,1313,1248, -1313,1249,1314, -1250,1314,1249, -1314,1250,1315, -1251,1315,1250, -1315,1251,1316, -1252,1316,1251, -1316,1252,1317, -1253,1317,1252, -1317,1253,1318, -1254,1318,1253, -1318,1254,1319, -1255,1319,1254, -1319,1255,1320, -1256,1320,1255, -1320,1256,1321, -1257,1321,1256, -1321,1257,1322, -1258,1322,1257, -1322,1258,1323, -1259,1323,1258, -1323,1259,1324, -1260,1324,1259, -1324,1260,1325, -1261,1325,1260, -1325,1261,1326, -1262,1326,1261, -1326,1262,1327, -1263,1327,1262, -1327,1263,1328, -1264,1328,1263, -1328,1264,1329, -1265,1329,1264, -1329,1265,1330, -1266,1330,1265, -1330,1266,1331, -1267,1331,1266, -1331,1267,1332, -1268,1332,1267, -1332,1268,1333, -1269,1333,1268, -1333,1269,1334, -1270,1334,1269, -1334,1270,1335, -1271,1335,1270, -1335,1271,1336, -1272,1336,1271, -1336,1272,1337, -1273,1337,1272, -1337,1273,1338, -1274,1338,1273, -1338,1274,1339, -1275,1339,1274, -1339,1275,1340, -1276,1340,1275, -1340,1276,1341, -1277,1341,1276, -1341,1277,1342, -1278,1342,1277, -1342,1278,1343, -1279,1343,1278, -1344,1280,1345, -1281,1345,1280, -1345,1281,1346, -1282,1346,1281, -1346,1282,1347, -1283,1347,1282, -1347,1283,1348, -1284,1348,1283, -1348,1284,1349, -1285,1349,1284, -1349,1285,1350, -1286,1350,1285, -1350,1286,1351, -1287,1351,1286, -1351,1287,1352, -1288,1352,1287, -1352,1288,1353, -1289,1353,1288, -1353,1289,1354, -1290,1354,1289, -1354,1290,1355, -1291,1355,1290, -1355,1291,1356, -1292,1356,1291, -1356,1292,1357, -1293,1357,1292, -1357,1293,1358, -1294,1358,1293, -1358,1294,1359, -1295,1359,1294, -1359,1295,1360, -1296,1360,1295, -1360,1296,1361, -1297,1361,1296, -1361,1297,1362, -1298,1362,1297, -1362,1298,1363, -1299,1363,1298, -1363,1299,1364, -1300,1364,1299, -1364,1300,1365, -1301,1365,1300, -1365,1301,1366, -1302,1366,1301, -1366,1302,1367, -1303,1367,1302, -1367,1303,1368, -1304,1368,1303, -1368,1304,1369, -1305,1369,1304, -1369,1305,1370, -1306,1370,1305, -1370,1306,1371, -1307,1371,1306, -1371,1307,1372, -1308,1372,1307, -1372,1308,1373, -1309,1373,1308, -1373,1309,1374, -1310,1374,1309, -1374,1310,1375, -1311,1375,1310, -1375,1311,1376, -1312,1376,1311, -1376,1312,1377, -1313,1377,1312, -1377,1313,1378, -1314,1378,1313, -1378,1314,1379, -1315,1379,1314, -1379,1315,1380, -1316,1380,1315, -1380,1316,1381, -1317,1381,1316, -1381,1317,1382, -1318,1382,1317, -1382,1318,1383, -1319,1383,1318, -1383,1319,1384, -1320,1384,1319, -1384,1320,1385, -1321,1385,1320, -1385,1321,1386, -1322,1386,1321, -1386,1322,1387, -1323,1387,1322, -1387,1323,1388, -1324,1388,1323, -1388,1324,1389, -1325,1389,1324, -1389,1325,1390, -1326,1390,1325, -1390,1326,1391, -1327,1391,1326, -1391,1327,1392, -1328,1392,1327, -1392,1328,1393, -1329,1393,1328, -1393,1329,1394, -1330,1394,1329, -1394,1330,1395, -1331,1395,1330, -1395,1331,1396, -1332,1396,1331, -1396,1332,1397, -1333,1397,1332, -1397,1333,1398, -1334,1398,1333, -1398,1334,1399, -1335,1399,1334, -1399,1335,1400, -1336,1400,1335, -1400,1336,1401, -1337,1401,1336, -1401,1337,1402, -1338,1402,1337, -1402,1338,1403, -1339,1403,1338, -1403,1339,1404, -1340,1404,1339, -1404,1340,1405, -1341,1405,1340, -1405,1341,1406, -1342,1406,1341, -1406,1342,1407, -1343,1407,1342, -1408,1344,1409, -1345,1409,1344, -1409,1345,1410, -1346,1410,1345, -1410,1346,1411, -1347,1411,1346, -1411,1347,1412, -1348,1412,1347, -1412,1348,1413, -1349,1413,1348, -1413,1349,1414, -1350,1414,1349, -1414,1350,1415, -1351,1415,1350, -1415,1351,1416, -1352,1416,1351, -1416,1352,1417, -1353,1417,1352, -1417,1353,1418, -1354,1418,1353, -1418,1354,1419, -1355,1419,1354, -1419,1355,1420, -1356,1420,1355, -1420,1356,1421, -1357,1421,1356, -1421,1357,1422, -1358,1422,1357, -1422,1358,1423, -1359,1423,1358, -1423,1359,1424, -1360,1424,1359, -1424,1360,1425, -1361,1425,1360, -1425,1361,1426, -1362,1426,1361, -1426,1362,1427, -1363,1427,1362, -1427,1363,1428, -1364,1428,1363, -1428,1364,1429, -1365,1429,1364, -1429,1365,1430, -1366,1430,1365, -1430,1366,1431, -1367,1431,1366, -1431,1367,1432, -1368,1432,1367, -1432,1368,1433, -1369,1433,1368, -1433,1369,1434, -1370,1434,1369, -1434,1370,1435, -1371,1435,1370, -1435,1371,1436, -1372,1436,1371, -1436,1372,1437, -1373,1437,1372, -1437,1373,1438, -1374,1438,1373, -1438,1374,1439, -1375,1439,1374, -1439,1375,1440, -1376,1440,1375, -1440,1376,1441, -1377,1441,1376, -1441,1377,1442, -1378,1442,1377, -1442,1378,1443, -1379,1443,1378, -1443,1379,1444, -1380,1444,1379, -1444,1380,1445, -1381,1445,1380, -1445,1381,1446, -1382,1446,1381, -1446,1382,1447, -1383,1447,1382, -1447,1383,1448, -1384,1448,1383, -1448,1384,1449, -1385,1449,1384, -1449,1385,1450, -1386,1450,1385, -1450,1386,1451, -1387,1451,1386, -1451,1387,1452, -1388,1452,1387, -1452,1388,1453, -1389,1453,1388, -1453,1389,1454, -1390,1454,1389, -1454,1390,1455, -1391,1455,1390, -1455,1391,1456, -1392,1456,1391, -1456,1392,1457, -1393,1457,1392, -1457,1393,1458, -1394,1458,1393, -1458,1394,1459, -1395,1459,1394, -1459,1395,1460, -1396,1460,1395, -1460,1396,1461, -1397,1461,1396, -1461,1397,1462, -1398,1462,1397, -1462,1398,1463, -1399,1463,1398, -1463,1399,1464, -1400,1464,1399, -1464,1400,1465, -1401,1465,1400, -1465,1401,1466, -1402,1466,1401, -1466,1402,1467, -1403,1467,1402, -1467,1403,1468, -1404,1468,1403, -1468,1404,1469, -1405,1469,1404, -1469,1405,1470, -1406,1470,1405, -1470,1406,1471, -1407,1471,1406, -1472,1408,1473, -1409,1473,1408, -1473,1409,1474, -1410,1474,1409, -1474,1410,1475, -1411,1475,1410, -1475,1411,1476, -1412,1476,1411, -1476,1412,1477, -1413,1477,1412, -1477,1413,1478, -1414,1478,1413, -1478,1414,1479, -1415,1479,1414, -1479,1415,1480, -1416,1480,1415, -1480,1416,1481, -1417,1481,1416, -1481,1417,1482, -1418,1482,1417, -1482,1418,1483, -1419,1483,1418, -1483,1419,1484, -1420,1484,1419, -1484,1420,1485, -1421,1485,1420, -1485,1421,1486, -1422,1486,1421, -1486,1422,1487, -1423,1487,1422, -1487,1423,1488, -1424,1488,1423, -1488,1424,1489, -1425,1489,1424, -1489,1425,1490, -1426,1490,1425, -1490,1426,1491, -1427,1491,1426, -1491,1427,1492, -1428,1492,1427, -1492,1428,1493, -1429,1493,1428, -1493,1429,1494, -1430,1494,1429, -1494,1430,1495, -1431,1495,1430, -1495,1431,1496, -1432,1496,1431, -1496,1432,1497, -1433,1497,1432, -1497,1433,1498, -1434,1498,1433, -1498,1434,1499, -1435,1499,1434, -1499,1435,1500, -1436,1500,1435, -1500,1436,1501, -1437,1501,1436, -1501,1437,1502, -1438,1502,1437, -1502,1438,1503, -1439,1503,1438, -1503,1439,1504, -1440,1504,1439, -1504,1440,1505, -1441,1505,1440, -1505,1441,1506, -1442,1506,1441, -1506,1442,1507, -1443,1507,1442, -1507,1443,1508, -1444,1508,1443, -1508,1444,1509, -1445,1509,1444, -1509,1445,1510, -1446,1510,1445, -1510,1446,1511, -1447,1511,1446, -1511,1447,1512, -1448,1512,1447, -1512,1448,1513, -1449,1513,1448, -1513,1449,1514, -1450,1514,1449, -1514,1450,1515, -1451,1515,1450, -1515,1451,1516, -1452,1516,1451, -1516,1452,1517, -1453,1517,1452, -1517,1453,1518, -1454,1518,1453, -1518,1454,1519, -1455,1519,1454, -1519,1455,1520, -1456,1520,1455, -1520,1456,1521, -1457,1521,1456, -1521,1457,1522, -1458,1522,1457, -1522,1458,1523, -1459,1523,1458, -1523,1459,1524, -1460,1524,1459, -1524,1460,1525, -1461,1525,1460, -1525,1461,1526, -1462,1526,1461, -1526,1462,1527, -1463,1527,1462, -1527,1463,1528, -1464,1528,1463, -1528,1464,1529, -1465,1529,1464, -1529,1465,1530, -1466,1530,1465, -1530,1466,1531, -1467,1531,1466, -1531,1467,1532, -1468,1532,1467, -1532,1468,1533, -1469,1533,1468, -1533,1469,1534, -1470,1534,1469, -1534,1470,1535, -1471,1535,1470, -1536,1472,1537, -1473,1537,1472, -1537,1473,1538, -1474,1538,1473, -1538,1474,1539, -1475,1539,1474, -1539,1475,1540, -1476,1540,1475, -1540,1476,1541, -1477,1541,1476, -1541,1477,1542, -1478,1542,1477, -1542,1478,1543, -1479,1543,1478, -1543,1479,1544, -1480,1544,1479, -1544,1480,1545, -1481,1545,1480, -1545,1481,1546, -1482,1546,1481, -1546,1482,1547, -1483,1547,1482, -1547,1483,1548, -1484,1548,1483, -1548,1484,1549, -1485,1549,1484, -1549,1485,1550, -1486,1550,1485, -1550,1486,1551, -1487,1551,1486, -1551,1487,1552, -1488,1552,1487, -1552,1488,1553, -1489,1553,1488, -1553,1489,1554, -1490,1554,1489, -1554,1490,1555, -1491,1555,1490, -1555,1491,1556, -1492,1556,1491, -1556,1492,1557, -1493,1557,1492, -1557,1493,1558, -1494,1558,1493, -1558,1494,1559, -1495,1559,1494, -1559,1495,1560, -1496,1560,1495, -1560,1496,1561, -1497,1561,1496, -1561,1497,1562, -1498,1562,1497, -1562,1498,1563, -1499,1563,1498, -1563,1499,1564, -1500,1564,1499, -1564,1500,1565, -1501,1565,1500, -1565,1501,1566, -1502,1566,1501, -1566,1502,1567, -1503,1567,1502, -1567,1503,1568, -1504,1568,1503, -1568,1504,1569, -1505,1569,1504, -1569,1505,1570, -1506,1570,1505, -1570,1506,1571, -1507,1571,1506, -1571,1507,1572, -1508,1572,1507, -1572,1508,1573, -1509,1573,1508, -1573,1509,1574, -1510,1574,1509, -1574,1510,1575, -1511,1575,1510, -1575,1511,1576, -1512,1576,1511, -1576,1512,1577, -1513,1577,1512, -1577,1513,1578, -1514,1578,1513, -1578,1514,1579, -1515,1579,1514, -1579,1515,1580, -1516,1580,1515, -1580,1516,1581, -1517,1581,1516, -1581,1517,1582, -1518,1582,1517, -1582,1518,1583, -1519,1583,1518, -1583,1519,1584, -1520,1584,1519, -1584,1520,1585, -1521,1585,1520, -1585,1521,1586, -1522,1586,1521, -1586,1522,1587, -1523,1587,1522, -1587,1523,1588, -1524,1588,1523, -1588,1524,1589, -1525,1589,1524, -1589,1525,1590, -1526,1590,1525, -1590,1526,1591, -1527,1591,1526, -1591,1527,1592, -1528,1592,1527, -1592,1528,1593, -1529,1593,1528, -1593,1529,1594, -1530,1594,1529, -1594,1530,1595, -1531,1595,1530, -1595,1531,1596, -1532,1596,1531, -1596,1532,1597, -1533,1597,1532, -1597,1533,1598, -1534,1598,1533, -1598,1534,1599, -1535,1599,1534, -1600,1536,1601, -1537,1601,1536, -1601,1537,1602, -1538,1602,1537, -1602,1538,1603, -1539,1603,1538, -1603,1539,1604, -1540,1604,1539, -1604,1540,1605, -1541,1605,1540, -1605,1541,1606, -1542,1606,1541, -1606,1542,1607, -1543,1607,1542, -1607,1543,1608, -1544,1608,1543, -1608,1544,1609, -1545,1609,1544, -1609,1545,1610, -1546,1610,1545, -1610,1546,1611, -1547,1611,1546, -1611,1547,1612, -1548,1612,1547, -1612,1548,1613, -1549,1613,1548, -1613,1549,1614, -1550,1614,1549, -1614,1550,1615, -1551,1615,1550, -1615,1551,1616, -1552,1616,1551, -1616,1552,1617, -1553,1617,1552, -1617,1553,1618, -1554,1618,1553, -1618,1554,1619, -1555,1619,1554, -1619,1555,1620, -1556,1620,1555, -1620,1556,1621, -1557,1621,1556, -1621,1557,1622, -1558,1622,1557, -1622,1558,1623, -1559,1623,1558, -1623,1559,1624, -1560,1624,1559, -1624,1560,1625, -1561,1625,1560, -1625,1561,1626, -1562,1626,1561, -1626,1562,1627, -1563,1627,1562, -1627,1563,1628, -1564,1628,1563, -1628,1564,1629, -1565,1629,1564, -1629,1565,1630, -1566,1630,1565, -1630,1566,1631, -1567,1631,1566, -1631,1567,1632, -1568,1632,1567, -1632,1568,1633, -1569,1633,1568, -1633,1569,1634, -1570,1634,1569, -1634,1570,1635, -1571,1635,1570, -1635,1571,1636, -1572,1636,1571, -1636,1572,1637, -1573,1637,1572, -1637,1573,1638, -1574,1638,1573, -1638,1574,1639, -1575,1639,1574, -1639,1575,1640, -1576,1640,1575, -1640,1576,1641, -1577,1641,1576, -1641,1577,1642, -1578,1642,1577, -1642,1578,1643, -1579,1643,1578, -1643,1579,1644, -1580,1644,1579, -1644,1580,1645, -1581,1645,1580, -1645,1581,1646, -1582,1646,1581, -1646,1582,1647, -1583,1647,1582, -1647,1583,1648, -1584,1648,1583, -1648,1584,1649, -1585,1649,1584, -1649,1585,1650, -1586,1650,1585, -1650,1586,1651, -1587,1651,1586, -1651,1587,1652, -1588,1652,1587, -1652,1588,1653, -1589,1653,1588, -1653,1589,1654, -1590,1654,1589, -1654,1590,1655, -1591,1655,1590, -1655,1591,1656, -1592,1656,1591, -1656,1592,1657, -1593,1657,1592, -1657,1593,1658, -1594,1658,1593, -1658,1594,1659, -1595,1659,1594, -1659,1595,1660, -1596,1660,1595, -1660,1596,1661, -1597,1661,1596, -1661,1597,1662, -1598,1662,1597, -1662,1598,1663, -1599,1663,1598, -1664,1600,1665, -1601,1665,1600, -1665,1601,1666, -1602,1666,1601, -1666,1602,1667, -1603,1667,1602, -1667,1603,1668, -1604,1668,1603, -1668,1604,1669, -1605,1669,1604, -1669,1605,1670, -1606,1670,1605, -1670,1606,1671, -1607,1671,1606, -1671,1607,1672, -1608,1672,1607, -1672,1608,1673, -1609,1673,1608, -1673,1609,1674, -1610,1674,1609, -1674,1610,1675, -1611,1675,1610, -1675,1611,1676, -1612,1676,1611, -1676,1612,1677, -1613,1677,1612, -1677,1613,1678, -1614,1678,1613, -1678,1614,1679, -1615,1679,1614, -1679,1615,1680, -1616,1680,1615, -1680,1616,1681, -1617,1681,1616, -1681,1617,1682, -1618,1682,1617, -1682,1618,1683, -1619,1683,1618, -1683,1619,1684, -1620,1684,1619, -1684,1620,1685, -1621,1685,1620, -1685,1621,1686, -1622,1686,1621, -1686,1622,1687, -1623,1687,1622, -1687,1623,1688, -1624,1688,1623, -1688,1624,1689, -1625,1689,1624, -1689,1625,1690, -1626,1690,1625, -1690,1626,1691, -1627,1691,1626, -1691,1627,1692, -1628,1692,1627, -1692,1628,1693, -1629,1693,1628, -1693,1629,1694, -1630,1694,1629, -1694,1630,1695, -1631,1695,1630, -1695,1631,1696, -1632,1696,1631, -1696,1632,1697, -1633,1697,1632, -1697,1633,1698, -1634,1698,1633, -1698,1634,1699, -1635,1699,1634, -1699,1635,1700, -1636,1700,1635, -1700,1636,1701, -1637,1701,1636, -1701,1637,1702, -1638,1702,1637, -1702,1638,1703, -1639,1703,1638, -1703,1639,1704, -1640,1704,1639, -1704,1640,1705, -1641,1705,1640, -1705,1641,1706, -1642,1706,1641, -1706,1642,1707, -1643,1707,1642, -1707,1643,1708, -1644,1708,1643, -1708,1644,1709, -1645,1709,1644, -1709,1645,1710, -1646,1710,1645, -1710,1646,1711, -1647,1711,1646, -1711,1647,1712, -1648,1712,1647, -1712,1648,1713, -1649,1713,1648, -1713,1649,1714, -1650,1714,1649, -1714,1650,1715, -1651,1715,1650, -1715,1651,1716, -1652,1716,1651, -1716,1652,1717, -1653,1717,1652, -1717,1653,1718, -1654,1718,1653, -1718,1654,1719, -1655,1719,1654, -1719,1655,1720, -1656,1720,1655, -1720,1656,1721, -1657,1721,1656, -1721,1657,1722, -1658,1722,1657, -1722,1658,1723, -1659,1723,1658, -1723,1659,1724, -1660,1724,1659, -1724,1660,1725, -1661,1725,1660, -1725,1661,1726, -1662,1726,1661, -1726,1662,1727, -1663,1727,1662, -1728,1664,1729, -1665,1729,1664, -1729,1665,1730, -1666,1730,1665, -1730,1666,1731, -1667,1731,1666, -1731,1667,1732, -1668,1732,1667, -1732,1668,1733, -1669,1733,1668, -1733,1669,1734, -1670,1734,1669, -1734,1670,1735, -1671,1735,1670, -1735,1671,1736, -1672,1736,1671, -1736,1672,1737, -1673,1737,1672, -1737,1673,1738, -1674,1738,1673, -1738,1674,1739, -1675,1739,1674, -1739,1675,1740, -1676,1740,1675, -1740,1676,1741, -1677,1741,1676, -1741,1677,1742, -1678,1742,1677, -1742,1678,1743, -1679,1743,1678, -1743,1679,1744, -1680,1744,1679, -1744,1680,1745, -1681,1745,1680, -1745,1681,1746, -1682,1746,1681, -1746,1682,1747, -1683,1747,1682, -1747,1683,1748, -1684,1748,1683, -1748,1684,1749, -1685,1749,1684, -1749,1685,1750, -1686,1750,1685, -1750,1686,1751, -1687,1751,1686, -1751,1687,1752, -1688,1752,1687, -1752,1688,1753, -1689,1753,1688, -1753,1689,1754, -1690,1754,1689, -1754,1690,1755, -1691,1755,1690, -1755,1691,1756, -1692,1756,1691, -1756,1692,1757, -1693,1757,1692, -1757,1693,1758, -1694,1758,1693, -1758,1694,1759, -1695,1759,1694, -1759,1695,1760, -1696,1760,1695, -1760,1696,1761, -1697,1761,1696, -1761,1697,1762, -1698,1762,1697, -1762,1698,1763, -1699,1763,1698, -1763,1699,1764, -1700,1764,1699, -1764,1700,1765, -1701,1765,1700, -1765,1701,1766, -1702,1766,1701, -1766,1702,1767, -1703,1767,1702, -1767,1703,1768, -1704,1768,1703, -1768,1704,1769, -1705,1769,1704, -1769,1705,1770, -1706,1770,1705, -1770,1706,1771, -1707,1771,1706, -1771,1707,1772, -1708,1772,1707, -1772,1708,1773, -1709,1773,1708, -1773,1709,1774, -1710,1774,1709, -1774,1710,1775, -1711,1775,1710, -1775,1711,1776, -1712,1776,1711, -1776,1712,1777, -1713,1777,1712, -1777,1713,1778, -1714,1778,1713, -1778,1714,1779, -1715,1779,1714, -1779,1715,1780, -1716,1780,1715, -1780,1716,1781, -1717,1781,1716, -1781,1717,1782, -1718,1782,1717, -1782,1718,1783, -1719,1783,1718, -1783,1719,1784, -1720,1784,1719, -1784,1720,1785, -1721,1785,1720, -1785,1721,1786, -1722,1786,1721, -1786,1722,1787, -1723,1787,1722, -1787,1723,1788, -1724,1788,1723, -1788,1724,1789, -1725,1789,1724, -1789,1725,1790, -1726,1790,1725, -1790,1726,1791, -1727,1791,1726, -1792,1728,1793, -1729,1793,1728, -1793,1729,1794, -1730,1794,1729, -1794,1730,1795, -1731,1795,1730, -1795,1731,1796, -1732,1796,1731, -1796,1732,1797, -1733,1797,1732, -1797,1733,1798, -1734,1798,1733, -1798,1734,1799, -1735,1799,1734, -1799,1735,1800, -1736,1800,1735, -1800,1736,1801, -1737,1801,1736, -1801,1737,1802, -1738,1802,1737, -1802,1738,1803, -1739,1803,1738, -1803,1739,1804, -1740,1804,1739, -1804,1740,1805, -1741,1805,1740, -1805,1741,1806, -1742,1806,1741, -1806,1742,1807, -1743,1807,1742, -1807,1743,1808, -1744,1808,1743, -1808,1744,1809, -1745,1809,1744, -1809,1745,1810, -1746,1810,1745, -1810,1746,1811, -1747,1811,1746, -1811,1747,1812, -1748,1812,1747, -1812,1748,1813, -1749,1813,1748, -1813,1749,1814, -1750,1814,1749, -1814,1750,1815, -1751,1815,1750, -1815,1751,1816, -1752,1816,1751, -1816,1752,1817, -1753,1817,1752, -1817,1753,1818, -1754,1818,1753, -1818,1754,1819, -1755,1819,1754, -1819,1755,1820, -1756,1820,1755, -1820,1756,1821, -1757,1821,1756, -1821,1757,1822, -1758,1822,1757, -1822,1758,1823, -1759,1823,1758, -1823,1759,1824, -1760,1824,1759, -1824,1760,1825, -1761,1825,1760, -1825,1761,1826, -1762,1826,1761, -1826,1762,1827, -1763,1827,1762, -1827,1763,1828, -1764,1828,1763, -1828,1764,1829, -1765,1829,1764, -1829,1765,1830, -1766,1830,1765, -1830,1766,1831, -1767,1831,1766, -1831,1767,1832, -1768,1832,1767, -1832,1768,1833, -1769,1833,1768, -1833,1769,1834, -1770,1834,1769, -1834,1770,1835, -1771,1835,1770, -1835,1771,1836, -1772,1836,1771, -1836,1772,1837, -1773,1837,1772, -1837,1773,1838, -1774,1838,1773, -1838,1774,1839, -1775,1839,1774, -1839,1775,1840, -1776,1840,1775, -1840,1776,1841, -1777,1841,1776, -1841,1777,1842, -1778,1842,1777, -1842,1778,1843, -1779,1843,1778, -1843,1779,1844, -1780,1844,1779, -1844,1780,1845, -1781,1845,1780, -1845,1781,1846, -1782,1846,1781, -1846,1782,1847, -1783,1847,1782, -1847,1783,1848, -1784,1848,1783, -1848,1784,1849, -1785,1849,1784, -1849,1785,1850, -1786,1850,1785, -1850,1786,1851, -1787,1851,1786, -1851,1787,1852, -1788,1852,1787, -1852,1788,1853, -1789,1853,1788, -1853,1789,1854, -1790,1854,1789, -1854,1790,1855, -1791,1855,1790, -1856,1792,1857, -1793,1857,1792, -1857,1793,1858, -1794,1858,1793, -1858,1794,1859, -1795,1859,1794, -1859,1795,1860, -1796,1860,1795, -1860,1796,1861, -1797,1861,1796, -1861,1797,1862, -1798,1862,1797, -1862,1798,1863, -1799,1863,1798, -1863,1799,1864, -1800,1864,1799, -1864,1800,1865, -1801,1865,1800, -1865,1801,1866, -1802,1866,1801, -1866,1802,1867, -1803,1867,1802, -1867,1803,1868, -1804,1868,1803, -1868,1804,1869, -1805,1869,1804, -1869,1805,1870, -1806,1870,1805, -1870,1806,1871, -1807,1871,1806, -1871,1807,1872, -1808,1872,1807, -1872,1808,1873, -1809,1873,1808, -1873,1809,1874, -1810,1874,1809, -1874,1810,1875, -1811,1875,1810, -1875,1811,1876, -1812,1876,1811, -1876,1812,1877, -1813,1877,1812, -1877,1813,1878, -1814,1878,1813, -1878,1814,1879, -1815,1879,1814, -1879,1815,1880, -1816,1880,1815, -1880,1816,1881, -1817,1881,1816, -1881,1817,1882, -1818,1882,1817, -1882,1818,1883, -1819,1883,1818, -1883,1819,1884, -1820,1884,1819, -1884,1820,1885, -1821,1885,1820, -1885,1821,1886, -1822,1886,1821, -1886,1822,1887, -1823,1887,1822, -1887,1823,1888, -1824,1888,1823, -1888,1824,1889, -1825,1889,1824, -1889,1825,1890, -1826,1890,1825, -1890,1826,1891, -1827,1891,1826, -1891,1827,1892, -1828,1892,1827, -1892,1828,1893, -1829,1893,1828, -1893,1829,1894, -1830,1894,1829, -1894,1830,1895, -1831,1895,1830, -1895,1831,1896, -1832,1896,1831, -1896,1832,1897, -1833,1897,1832, -1897,1833,1898, -1834,1898,1833, -1898,1834,1899, -1835,1899,1834, -1899,1835,1900, -1836,1900,1835, -1900,1836,1901, -1837,1901,1836, -1901,1837,1902, -1838,1902,1837, -1902,1838,1903, -1839,1903,1838, -1903,1839,1904, -1840,1904,1839, -1904,1840,1905, -1841,1905,1840, -1905,1841,1906, -1842,1906,1841, -1906,1842,1907, -1843,1907,1842, -1907,1843,1908, -1844,1908,1843, -1908,1844,1909, -1845,1909,1844, -1909,1845,1910, -1846,1910,1845, -1910,1846,1911, -1847,1911,1846, -1911,1847,1912, -1848,1912,1847, -1912,1848,1913, -1849,1913,1848, -1913,1849,1914, -1850,1914,1849, -1914,1850,1915, -1851,1915,1850, -1915,1851,1916, -1852,1916,1851, -1916,1852,1917, -1853,1917,1852, -1917,1853,1918, -1854,1918,1853, -1918,1854,1919, -1855,1919,1854, -1920,1856,1921, -1857,1921,1856, -1921,1857,1922, -1858,1922,1857, -1922,1858,1923, -1859,1923,1858, -1923,1859,1924, -1860,1924,1859, -1924,1860,1925, -1861,1925,1860, -1925,1861,1926, -1862,1926,1861, -1926,1862,1927, -1863,1927,1862, -1927,1863,1928, -1864,1928,1863, -1928,1864,1929, -1865,1929,1864, -1929,1865,1930, -1866,1930,1865, -1930,1866,1931, -1867,1931,1866, -1931,1867,1932, -1868,1932,1867, -1932,1868,1933, -1869,1933,1868, -1933,1869,1934, -1870,1934,1869, -1934,1870,1935, -1871,1935,1870, -1935,1871,1936, -1872,1936,1871, -1936,1872,1937, -1873,1937,1872, -1937,1873,1938, -1874,1938,1873, -1938,1874,1939, -1875,1939,1874, -1939,1875,1940, -1876,1940,1875, -1940,1876,1941, -1877,1941,1876, -1941,1877,1942, -1878,1942,1877, -1942,1878,1943, -1879,1943,1878, -1943,1879,1944, -1880,1944,1879, -1944,1880,1945, -1881,1945,1880, -1945,1881,1946, -1882,1946,1881, -1946,1882,1947, -1883,1947,1882, -1947,1883,1948, -1884,1948,1883, -1948,1884,1949, -1885,1949,1884, -1949,1885,1950, -1886,1950,1885, -1950,1886,1951, -1887,1951,1886, -1951,1887,1952, -1888,1952,1887, -1952,1888,1953, -1889,1953,1888, -1953,1889,1954, -1890,1954,1889, -1954,1890,1955, -1891,1955,1890, -1955,1891,1956, -1892,1956,1891, -1956,1892,1957, -1893,1957,1892, -1957,1893,1958, -1894,1958,1893, -1958,1894,1959, -1895,1959,1894, -1959,1895,1960, -1896,1960,1895, -1960,1896,1961, -1897,1961,1896, -1961,1897,1962, -1898,1962,1897, -1962,1898,1963, -1899,1963,1898, -1963,1899,1964, -1900,1964,1899, -1964,1900,1965, -1901,1965,1900, -1965,1901,1966, -1902,1966,1901, -1966,1902,1967, -1903,1967,1902, -1967,1903,1968, -1904,1968,1903, -1968,1904,1969, -1905,1969,1904, -1969,1905,1970, -1906,1970,1905, -1970,1906,1971, -1907,1971,1906, -1971,1907,1972, -1908,1972,1907, -1972,1908,1973, -1909,1973,1908, -1973,1909,1974, -1910,1974,1909, -1974,1910,1975, -1911,1975,1910, -1975,1911,1976, -1912,1976,1911, -1976,1912,1977, -1913,1977,1912, -1977,1913,1978, -1914,1978,1913, -1978,1914,1979, -1915,1979,1914, -1979,1915,1980, -1916,1980,1915, -1980,1916,1981, -1917,1981,1916, -1981,1917,1982, -1918,1982,1917, -1982,1918,1983, -1919,1983,1918, -1984,1920,1985, -1921,1985,1920, -1985,1921,1986, -1922,1986,1921, -1986,1922,1987, -1923,1987,1922, -1987,1923,1988, -1924,1988,1923, -1988,1924,1989, -1925,1989,1924, -1989,1925,1990, -1926,1990,1925, -1990,1926,1991, -1927,1991,1926, -1991,1927,1992, -1928,1992,1927, -1992,1928,1993, -1929,1993,1928, -1993,1929,1994, -1930,1994,1929, -1994,1930,1995, -1931,1995,1930, -1995,1931,1996, -1932,1996,1931, -1996,1932,1997, -1933,1997,1932, -1997,1933,1998, -1934,1998,1933, -1998,1934,1999, -1935,1999,1934, -1999,1935,2000, -1936,2000,1935, -2000,1936,2001, -1937,2001,1936, -2001,1937,2002, -1938,2002,1937, -2002,1938,2003, -1939,2003,1938, -2003,1939,2004, -1940,2004,1939, -2004,1940,2005, -1941,2005,1940, -2005,1941,2006, -1942,2006,1941, -2006,1942,2007, -1943,2007,1942, -2007,1943,2008, -1944,2008,1943, -2008,1944,2009, -1945,2009,1944, -2009,1945,2010, -1946,2010,1945, -2010,1946,2011, -1947,2011,1946, -2011,1947,2012, -1948,2012,1947, -2012,1948,2013, -1949,2013,1948, -2013,1949,2014, -1950,2014,1949, -2014,1950,2015, -1951,2015,1950, -2015,1951,2016, -1952,2016,1951, -2016,1952,2017, -1953,2017,1952, -2017,1953,2018, -1954,2018,1953, -2018,1954,2019, -1955,2019,1954, -2019,1955,2020, -1956,2020,1955, -2020,1956,2021, -1957,2021,1956, -2021,1957,2022, -1958,2022,1957, -2022,1958,2023, -1959,2023,1958, -2023,1959,2024, -1960,2024,1959, -2024,1960,2025, -1961,2025,1960, -2025,1961,2026, -1962,2026,1961, -2026,1962,2027, -1963,2027,1962, -2027,1963,2028, -1964,2028,1963, -2028,1964,2029, -1965,2029,1964, -2029,1965,2030, -1966,2030,1965, -2030,1966,2031, -1967,2031,1966, -2031,1967,2032, -1968,2032,1967, -2032,1968,2033, -1969,2033,1968, -2033,1969,2034, -1970,2034,1969, -2034,1970,2035, -1971,2035,1970, -2035,1971,2036, -1972,2036,1971, -2036,1972,2037, -1973,2037,1972, -2037,1973,2038, -1974,2038,1973, -2038,1974,2039, -1975,2039,1974, -2039,1975,2040, -1976,2040,1975, -2040,1976,2041, -1977,2041,1976, -2041,1977,2042, -1978,2042,1977, -2042,1978,2043, -1979,2043,1978, -2043,1979,2044, -1980,2044,1979, -2044,1980,2045, -1981,2045,1980, -2045,1981,2046, -1982,2046,1981, -2046,1982,2047, -1983,2047,1982, -2048,1984,2049, -1985,2049,1984, -2049,1985,2050, -1986,2050,1985, -2050,1986,2051, -1987,2051,1986, -2051,1987,2052, -1988,2052,1987, -2052,1988,2053, -1989,2053,1988, -2053,1989,2054, -1990,2054,1989, -2054,1990,2055, -1991,2055,1990, -2055,1991,2056, -1992,2056,1991, -2056,1992,2057, -1993,2057,1992, -2057,1993,2058, -1994,2058,1993, -2058,1994,2059, -1995,2059,1994, -2059,1995,2060, -1996,2060,1995, -2060,1996,2061, -1997,2061,1996, -2061,1997,2062, -1998,2062,1997, -2062,1998,2063, -1999,2063,1998, -2063,1999,2064, -2000,2064,1999, -2064,2000,2065, -2001,2065,2000, -2065,2001,2066, -2002,2066,2001, -2066,2002,2067, -2003,2067,2002, -2067,2003,2068, -2004,2068,2003, -2068,2004,2069, -2005,2069,2004, -2069,2005,2070, -2006,2070,2005, -2070,2006,2071, -2007,2071,2006, -2071,2007,2072, -2008,2072,2007, -2072,2008,2073, -2009,2073,2008, -2073,2009,2074, -2010,2074,2009, -2074,2010,2075, -2011,2075,2010, -2075,2011,2076, -2012,2076,2011, -2076,2012,2077, -2013,2077,2012, -2077,2013,2078, -2014,2078,2013, -2078,2014,2079, -2015,2079,2014, -2079,2015,2080, -2016,2080,2015, -2080,2016,2081, -2017,2081,2016, -2081,2017,2082, -2018,2082,2017, -2082,2018,2083, -2019,2083,2018, -2083,2019,2084, -2020,2084,2019, -2084,2020,2085, -2021,2085,2020, -2085,2021,2086, -2022,2086,2021, -2086,2022,2087, -2023,2087,2022, -2087,2023,2088, -2024,2088,2023, -2088,2024,2089, -2025,2089,2024, -2089,2025,2090, -2026,2090,2025, -2090,2026,2091, -2027,2091,2026, -2091,2027,2092, -2028,2092,2027, -2092,2028,2093, -2029,2093,2028, -2093,2029,2094, -2030,2094,2029, -2094,2030,2095, -2031,2095,2030, -2095,2031,2096, -2032,2096,2031, -2096,2032,2097, -2033,2097,2032, -2097,2033,2098, -2034,2098,2033, -2098,2034,2099, -2035,2099,2034, -2099,2035,2100, -2036,2100,2035, -2100,2036,2101, -2037,2101,2036, -2101,2037,2102, -2038,2102,2037, -2102,2038,2103, -2039,2103,2038, -2103,2039,2104, -2040,2104,2039, -2104,2040,2105, -2041,2105,2040, -2105,2041,2106, -2042,2106,2041, -2106,2042,2107, -2043,2107,2042, -2107,2043,2108, -2044,2108,2043, -2108,2044,2109, -2045,2109,2044, -2109,2045,2110, -2046,2110,2045, -2110,2046,2111, -2047,2111,2046, -2112,2048,2113, -2049,2113,2048, -2113,2049,2114, -2050,2114,2049, -2114,2050,2115, -2051,2115,2050, -2115,2051,2116, -2052,2116,2051, -2116,2052,2117, -2053,2117,2052, -2117,2053,2118, -2054,2118,2053, -2118,2054,2119, -2055,2119,2054, -2119,2055,2120, -2056,2120,2055, -2120,2056,2121, -2057,2121,2056, -2121,2057,2122, -2058,2122,2057, -2122,2058,2123, -2059,2123,2058, -2123,2059,2124, -2060,2124,2059, -2124,2060,2125, -2061,2125,2060, -2125,2061,2126, -2062,2126,2061, -2126,2062,2127, -2063,2127,2062, -2127,2063,2128, -2064,2128,2063, -2128,2064,2129, -2065,2129,2064, -2129,2065,2130, -2066,2130,2065, -2130,2066,2131, -2067,2131,2066, -2131,2067,2132, -2068,2132,2067, -2132,2068,2133, -2069,2133,2068, -2133,2069,2134, -2070,2134,2069, -2134,2070,2135, -2071,2135,2070, -2135,2071,2136, -2072,2136,2071, -2136,2072,2137, -2073,2137,2072, -2137,2073,2138, -2074,2138,2073, -2138,2074,2139, -2075,2139,2074, -2139,2075,2140, -2076,2140,2075, -2140,2076,2141, -2077,2141,2076, -2141,2077,2142, -2078,2142,2077, -2142,2078,2143, -2079,2143,2078, -2143,2079,2144, -2080,2144,2079, -2144,2080,2145, -2081,2145,2080, -2145,2081,2146, -2082,2146,2081, -2146,2082,2147, -2083,2147,2082, -2147,2083,2148, -2084,2148,2083, -2148,2084,2149, -2085,2149,2084, -2149,2085,2150, -2086,2150,2085, -2150,2086,2151, -2087,2151,2086, -2151,2087,2152, -2088,2152,2087, -2152,2088,2153, -2089,2153,2088, -2153,2089,2154, -2090,2154,2089, -2154,2090,2155, -2091,2155,2090, -2155,2091,2156, -2092,2156,2091, -2156,2092,2157, -2093,2157,2092, -2157,2093,2158, -2094,2158,2093, -2158,2094,2159, -2095,2159,2094, -2159,2095,2160, -2096,2160,2095, -2160,2096,2161, -2097,2161,2096, -2161,2097,2162, -2098,2162,2097, -2162,2098,2163, -2099,2163,2098, -2163,2099,2164, -2100,2164,2099, -2164,2100,2165, -2101,2165,2100, -2165,2101,2166, -2102,2166,2101, -2166,2102,2167, -2103,2167,2102, -2167,2103,2168, -2104,2168,2103, -2168,2104,2169, -2105,2169,2104, -2169,2105,2170, -2106,2170,2105, -2170,2106,2171, -2107,2171,2106, -2171,2107,2172, -2108,2172,2107, -2172,2108,2173, -2109,2173,2108, -2173,2109,2174, -2110,2174,2109, -2174,2110,2175, -2111,2175,2110, -2176,2112,2177, -2113,2177,2112, -2177,2113,2178, -2114,2178,2113, -2178,2114,2179, -2115,2179,2114, -2179,2115,2180, -2116,2180,2115, -2180,2116,2181, -2117,2181,2116, -2181,2117,2182, -2118,2182,2117, -2182,2118,2183, -2119,2183,2118, -2183,2119,2184, -2120,2184,2119, -2184,2120,2185, -2121,2185,2120, -2185,2121,2186, -2122,2186,2121, -2186,2122,2187, -2123,2187,2122, -2187,2123,2188, -2124,2188,2123, -2188,2124,2189, -2125,2189,2124, -2189,2125,2190, -2126,2190,2125, -2190,2126,2191, -2127,2191,2126, -2191,2127,2192, -2128,2192,2127, -2192,2128,2193, -2129,2193,2128, -2193,2129,2194, -2130,2194,2129, -2194,2130,2195, -2131,2195,2130, -2195,2131,2196, -2132,2196,2131, -2196,2132,2197, -2133,2197,2132, -2197,2133,2198, -2134,2198,2133, -2198,2134,2199, -2135,2199,2134, -2199,2135,2200, -2136,2200,2135, -2200,2136,2201, -2137,2201,2136, -2201,2137,2202, -2138,2202,2137, -2202,2138,2203, -2139,2203,2138, -2203,2139,2204, -2140,2204,2139, -2204,2140,2205, -2141,2205,2140, -2205,2141,2206, -2142,2206,2141, -2206,2142,2207, -2143,2207,2142, -2207,2143,2208, -2144,2208,2143, -2208,2144,2209, -2145,2209,2144, -2209,2145,2210, -2146,2210,2145, -2210,2146,2211, -2147,2211,2146, -2211,2147,2212, -2148,2212,2147, -2212,2148,2213, -2149,2213,2148, -2213,2149,2214, -2150,2214,2149, -2214,2150,2215, -2151,2215,2150, -2215,2151,2216, -2152,2216,2151, -2216,2152,2217, -2153,2217,2152, -2217,2153,2218, -2154,2218,2153, -2218,2154,2219, -2155,2219,2154, -2219,2155,2220, -2156,2220,2155, -2220,2156,2221, -2157,2221,2156, -2221,2157,2222, -2158,2222,2157, -2222,2158,2223, -2159,2223,2158, -2223,2159,2224, -2160,2224,2159, -2224,2160,2225, -2161,2225,2160, -2225,2161,2226, -2162,2226,2161, -2226,2162,2227, -2163,2227,2162, -2227,2163,2228, -2164,2228,2163, -2228,2164,2229, -2165,2229,2164, -2229,2165,2230, -2166,2230,2165, -2230,2166,2231, -2167,2231,2166, -2231,2167,2232, -2168,2232,2167, -2232,2168,2233, -2169,2233,2168, -2233,2169,2234, -2170,2234,2169, -2234,2170,2235, -2171,2235,2170, -2235,2171,2236, -2172,2236,2171, -2236,2172,2237, -2173,2237,2172, -2237,2173,2238, -2174,2238,2173, -2238,2174,2239, -2175,2239,2174, -}; - -#define Landscape08VtxCount 2178 -#define Landscape08IdxCount 12480 - -btScalar Landscape08Vtx[] = { --250.0f,30.98f,-128.906f, --250.0f,31.4025f,-125.0f, --246.094f,31.7629f,-128.906f, --246.094f,31.4165f,-125.0f, --242.188f,32.5689f,-128.906f, --242.188f,32.314f,-125.0f, --238.281f,32.9125f,-128.906f, --238.281f,32.9822f,-125.0f, --234.375f,32.5915f,-128.906f, --234.375f,32.6962f,-125.0f, --230.469f,31.2708f,-128.906f, --230.469f,31.3632f,-125.0f, --226.563f,30.5212f,-128.906f, --226.563f,29.4391f,-125.0f, --222.656f,30.2031f,-128.906f, --222.656f,29.519f,-125.0f, --218.75f,30.4582f,-128.906f, --218.75f,29.4481f,-125.0f, --214.844f,30.6941f,-128.906f, --214.844f,29.8481f,-125.0f, --210.938f,30.5035f,-128.906f, --210.938f,30.408f,-125.0f, --207.031f,30.2726f,-128.906f, --207.031f,30.291f,-125.0f, --203.125f,29.38f,-128.906f, --203.125f,28.7473f,-125.0f, --199.219f,28.6973f,-128.906f, --199.219f,28.1816f,-125.0f, --195.313f,27.9768f,-128.906f, --195.313f,27.2839f,-125.0f, --191.406f,26.1169f,-128.906f, --191.406f,25.7018f,-125.0f, --187.5f,23.8648f,-128.906f, --187.5f,23.2882f,-125.0f, --183.594f,21.95f,-128.906f, --183.594f,22.1614f,-125.0f, --179.688f,19.6798f,-128.906f, --179.688f,20.658f,-125.0f, --175.781f,17.3507f,-128.906f, --175.781f,18.8433f,-125.0f, --171.875f,15.7914f,-128.906f, --171.875f,16.364f,-125.0f, --167.969f,14.3745f,-128.906f, --167.969f,14.7298f,-125.0f, --164.063f,12.4911f,-128.906f, --164.063f,12.9859f,-125.0f, --160.156f,11.0533f,-128.906f, --160.156f,11.3306f,-125.0f, --156.25f,9.15062f,-128.906f, --156.25f,10.1916f,-125.0f, --152.344f,6.68059f,-128.906f, --152.344f,8.3967f,-125.0f, --148.438f,5.57112f,-128.906f, --148.438f,6.23292f,-125.0f, --144.531f,5.2271f,-128.906f, --144.531f,5.48985f,-125.0f, --140.625f,5.87576f,-128.906f, --140.625f,5.18276f,-125.0f, --136.719f,6.85614f,-128.906f, --136.719f,5.56059f,-125.0f, --132.813f,6.86087f,-128.906f, --132.813f,5.75157f,-125.0f, --128.906f,7.10341f,-128.906f, --128.906f,5.32154f,-125.0f, --125.0f,7.54727f,-128.906f, --125.0f,6.15672f,-125.0f, --121.094f,8.02225f,-128.906f, --121.094f,7.53373f,-125.0f, --117.188f,8.70065f,-128.906f, --117.188f,8.38676f,-125.0f, --113.281f,9.39689f,-128.906f, --113.281f,8.64274f,-125.0f, --109.375f,8.80449f,-128.906f, --109.375f,8.49941f,-125.0f, --105.469f,9.43366f,-128.906f, --105.469f,9.24481f,-125.0f, --101.563f,10.868f,-128.906f, --101.563f,11.5178f,-125.0f, --97.6563f,12.8404f,-128.906f, --97.6563f,13.4113f,-125.0f, --93.75f,14.8214f,-128.906f, --93.75f,15.4997f,-125.0f, --89.8438f,16.618f,-128.906f, --89.8438f,17.3502f,-125.0f, --85.9375f,20.2496f,-128.906f, --85.9375f,20.8168f,-125.0f, --82.0313f,23.697f,-128.906f, --82.0313f,24.9405f,-125.0f, --78.125f,26.4451f,-128.906f, --78.125f,27.8681f,-125.0f, --74.2188f,28.7901f,-128.906f, --74.2188f,30.1495f,-125.0f, --70.3125f,31.4052f,-128.906f, --70.3125f,32.4402f,-125.0f, --66.4063f,33.3106f,-128.906f, --66.4063f,34.2537f,-125.0f, --62.5f,35.8538f,-128.906f, --62.5f,36.5623f,-125.0f, --58.5938f,37.9798f,-128.906f, --58.5938f,38.9027f,-125.0f, --54.6875f,39.4006f,-128.906f, --54.6875f,40.1192f,-125.0f, --50.7813f,40.6584f,-128.906f, --50.7813f,41.9393f,-125.0f, --46.875f,40.8896f,-128.906f, --46.875f,41.8765f,-125.0f, --42.9688f,39.9544f,-128.906f, --42.9688f,41.6371f,-125.0f, --39.0625f,40.0893f,-128.906f, --39.0625f,41.6432f,-125.0f, --35.1563f,39.3183f,-128.906f, --35.1563f,41.2852f,-125.0f, --31.25f,39.8575f,-128.906f, --31.25f,41.5629f,-125.0f, --27.3438f,41.5378f,-128.906f, --27.3438f,42.2956f,-125.0f, --23.4375f,44.0561f,-128.906f, --23.4375f,43.9719f,-125.0f, --19.5313f,45.4298f,-128.906f, --19.5313f,46.2232f,-125.0f, --15.625f,47.4474f,-128.906f, --15.625f,47.3104f,-125.0f, --11.7188f,48.0018f,-128.906f, --11.7188f,47.5943f,-125.0f, --7.8125f,48.0717f,-128.906f, --7.8125f,49.1192f,-125.0f, --3.90625f,48.7253f,-128.906f, --3.90625f,49.6341f,-125.0f, -0.0f,49.8f,-128.906f, -0.0f,50.3481f,-125.0f, -3.90625f,50.4716f,-128.906f, -3.90625f,50.3021f,-125.0f, --250.0f,31.1145f,-132.813f, --246.094f,31.857f,-132.813f, --242.188f,32.7446f,-132.813f, --238.281f,33.1734f,-132.813f, --234.375f,32.1952f,-132.813f, --230.469f,31.8959f,-132.813f, --226.563f,32.1326f,-132.813f, --222.656f,32.1631f,-132.813f, --218.75f,31.3795f,-132.813f, --214.844f,30.9888f,-132.813f, --210.938f,30.5577f,-132.813f, --207.031f,30.1392f,-132.813f, --203.125f,29.8482f,-132.813f, --199.219f,28.5903f,-132.813f, --195.313f,27.4671f,-132.813f, --191.406f,25.5032f,-132.813f, --187.5f,23.2799f,-132.813f, --183.594f,21.2846f,-132.813f, --179.688f,19.3954f,-132.813f, --175.781f,18.1112f,-132.813f, --171.875f,16.3831f,-132.813f, --167.969f,14.5038f,-132.813f, --164.063f,12.8109f,-132.813f, --160.156f,10.386f,-132.813f, --156.25f,7.93486f,-132.813f, --152.344f,7.25449f,-132.813f, --148.438f,6.19974f,-132.813f, --144.531f,5.89578f,-132.813f, --140.625f,6.61884f,-132.813f, --136.719f,7.53382f,-132.813f, --132.813f,8.21024f,-132.813f, --128.906f,8.74115f,-132.813f, --125.0f,8.97047f,-132.813f, --121.094f,9.41307f,-132.813f, --117.188f,10.0468f,-132.813f, --113.281f,9.47404f,-132.813f, --109.375f,9.418f,-132.813f, --105.469f,10.3176f,-132.813f, --101.563f,11.3001f,-132.813f, --97.6563f,12.5318f,-132.813f, --93.75f,14.6986f,-132.813f, --89.8438f,16.6495f,-132.813f, --85.9375f,19.1906f,-132.813f, --82.0313f,23.4349f,-132.813f, --78.125f,26.1629f,-132.813f, --74.2188f,28.739f,-132.813f, --70.3125f,31.1271f,-132.813f, --66.4063f,32.2452f,-132.813f, --62.5f,34.0303f,-132.813f, --58.5938f,36.1234f,-132.813f, --54.6875f,38.3054f,-132.813f, --50.7813f,38.7936f,-132.813f, --46.875f,39.1319f,-132.813f, --42.9688f,39.1462f,-132.813f, --39.0625f,38.4732f,-132.813f, --35.1563f,38.3061f,-132.813f, --31.25f,39.4999f,-132.813f, --27.3438f,41.8953f,-132.813f, --23.4375f,43.2645f,-132.813f, --19.5313f,44.7736f,-132.813f, --15.625f,46.2491f,-132.813f, --11.7188f,47.4527f,-132.813f, --7.8125f,47.1407f,-132.813f, --3.90625f,48.0628f,-132.813f, -0.0f,48.5651f,-132.813f, -3.90625f,49.1054f,-132.813f, --250.0f,30.7461f,-136.719f, --246.094f,30.8483f,-136.719f, --242.188f,32.188f,-136.719f, --238.281f,33.149f,-136.719f, --234.375f,32.3165f,-136.719f, --230.469f,32.613f,-136.719f, --226.563f,33.3246f,-136.719f, --222.656f,32.6429f,-136.719f, --218.75f,31.8882f,-136.719f, --214.844f,31.5125f,-136.719f, --210.938f,30.2065f,-136.719f, --207.031f,30.0024f,-136.719f, --203.125f,29.5699f,-136.719f, --199.219f,28.1245f,-136.719f, --195.313f,26.764f,-136.719f, --191.406f,24.8025f,-136.719f, --187.5f,22.7863f,-136.719f, --183.594f,21.0979f,-136.719f, --179.688f,19.5742f,-136.719f, --175.781f,17.9263f,-136.719f, --171.875f,16.0908f,-136.719f, --167.969f,14.6542f,-136.719f, --164.063f,12.4534f,-136.719f, --160.156f,9.93763f,-136.719f, --156.25f,7.87486f,-136.719f, --152.344f,7.06627f,-136.719f, --148.438f,6.22453f,-136.719f, --144.531f,6.39864f,-136.719f, --140.625f,7.02103f,-136.719f, --136.719f,7.85488f,-136.719f, --132.813f,9.33235f,-136.719f, --128.906f,10.546f,-136.719f, --125.0f,10.1958f,-136.719f, --121.094f,9.85385f,-136.719f, --117.188f,10.2437f,-136.719f, --113.281f,9.95341f,-136.719f, --109.375f,9.05387f,-136.719f, --105.469f,10.3384f,-136.719f, --101.563f,11.2859f,-136.719f, --97.6563f,12.3544f,-136.719f, --93.75f,14.0582f,-136.719f, --89.8438f,15.9772f,-136.719f, --85.9375f,18.8673f,-136.719f, --82.0313f,22.2278f,-136.719f, --78.125f,25.0468f,-136.719f, --74.2188f,27.6452f,-136.719f, --70.3125f,29.155f,-136.719f, --66.4063f,30.7457f,-136.719f, --62.5f,32.6722f,-136.719f, --58.5938f,34.5222f,-136.719f, --54.6875f,36.3904f,-136.719f, --50.7813f,36.1946f,-136.719f, --46.875f,36.5194f,-136.719f, --42.9688f,36.2715f,-136.719f, --39.0625f,36.4185f,-136.719f, --35.1563f,37.1668f,-136.719f, --31.25f,38.3933f,-136.719f, --27.3438f,40.8416f,-136.719f, --23.4375f,42.7243f,-136.719f, --19.5313f,43.7567f,-136.719f, --15.625f,44.7705f,-136.719f, --11.7188f,45.3267f,-136.719f, --7.8125f,46.433f,-136.719f, --3.90625f,47.3134f,-136.719f, -0.0f,48.4146f,-136.719f, -3.90625f,47.9f,-136.719f, --250.0f,29.1575f,-140.625f, --246.094f,30.5173f,-140.625f, --242.188f,31.576f,-140.625f, --238.281f,31.6992f,-140.625f, --234.375f,32.9063f,-140.625f, --230.469f,33.2752f,-140.625f, --226.563f,32.8003f,-140.625f, --222.656f,33.133f,-140.625f, --218.75f,32.0543f,-140.625f, --214.844f,31.2672f,-140.625f, --210.938f,30.2378f,-140.625f, --207.031f,29.601f,-140.625f, --203.125f,28.4643f,-140.625f, --199.219f,26.8711f,-140.625f, --195.313f,24.936f,-140.625f, --191.406f,22.9115f,-140.625f, --187.5f,21.8507f,-140.625f, --183.594f,20.4435f,-140.625f, --179.688f,18.4455f,-140.625f, --175.781f,17.1667f,-140.625f, --171.875f,15.2077f,-140.625f, --167.969f,13.4799f,-140.625f, --164.063f,11.7723f,-140.625f, --160.156f,9.26955f,-140.625f, --156.25f,7.56528f,-140.625f, --152.344f,6.4244f,-140.625f, --148.438f,6.60539f,-140.625f, --144.531f,6.44163f,-140.625f, --140.625f,6.55017f,-140.625f, --136.719f,7.62805f,-140.625f, --132.813f,9.20726f,-140.625f, --128.906f,10.5063f,-140.625f, --125.0f,10.6867f,-140.625f, --121.094f,9.3702f,-140.625f, --117.188f,9.53484f,-140.625f, --113.281f,8.855f,-140.625f, --109.375f,9.3082f,-140.625f, --105.469f,9.67718f,-140.625f, --101.563f,10.5233f,-140.625f, --97.6563f,11.8026f,-140.625f, --93.75f,13.1675f,-140.625f, --89.8438f,15.253f,-140.625f, --85.9375f,18.1074f,-140.625f, --82.0313f,20.8004f,-140.625f, --78.125f,23.7651f,-140.625f, --74.2188f,25.7067f,-140.625f, --70.3125f,27.5126f,-140.625f, --66.4063f,29.8191f,-140.625f, --62.5f,31.7367f,-140.625f, --58.5938f,32.8891f,-140.625f, --54.6875f,34.0989f,-140.625f, --50.7813f,34.6645f,-140.625f, --46.875f,34.0325f,-140.625f, --42.9688f,33.7773f,-140.625f, --39.0625f,34.1723f,-140.625f, --35.1563f,36.0861f,-140.625f, --31.25f,38.8562f,-140.625f, --27.3438f,40.5684f,-140.625f, --23.4375f,42.6832f,-140.625f, --19.5313f,43.505f,-140.625f, --15.625f,43.7197f,-140.625f, --11.7188f,43.8656f,-140.625f, --7.8125f,45.6272f,-140.625f, --3.90625f,46.7713f,-140.625f, -0.0f,47.1255f,-140.625f, -3.90625f,47.2681f,-140.625f, --250.0f,28.3388f,-144.531f, --246.094f,29.5689f,-144.531f, --242.188f,30.0422f,-144.531f, --238.281f,30.6319f,-144.531f, --234.375f,32.5914f,-144.531f, --230.469f,33.306f,-144.531f, --226.563f,32.9265f,-144.531f, --222.656f,32.5363f,-144.531f, --218.75f,31.8845f,-144.531f, --214.844f,31.7429f,-144.531f, --210.938f,29.6521f,-144.531f, --207.031f,28.3301f,-144.531f, --203.125f,26.8166f,-144.531f, --199.219f,25.0756f,-144.531f, --195.313f,23.0988f,-144.531f, --191.406f,21.2037f,-144.531f, --187.5f,20.271f,-144.531f, --183.594f,18.4189f,-144.531f, --179.688f,16.2352f,-144.531f, --175.781f,14.734f,-144.531f, --171.875f,13.9522f,-144.531f, --167.969f,12.543f,-144.531f, --164.063f,10.6335f,-144.531f, --160.156f,8.53885f,-144.531f, --156.25f,7.32299f,-144.531f, --152.344f,6.69849f,-144.531f, --148.438f,5.37792f,-144.531f, --144.531f,5.52557f,-144.531f, --140.625f,5.94721f,-144.531f, --136.719f,7.15949f,-144.531f, --132.813f,8.5533f,-144.531f, --128.906f,9.68048f,-144.531f, --125.0f,9.80421f,-144.531f, --121.094f,9.67052f,-144.531f, --117.188f,9.82889f,-144.531f, --113.281f,9.40895f,-144.531f, --109.375f,9.53728f,-144.531f, --105.469f,9.89567f,-144.531f, --101.563f,10.4472f,-144.531f, --97.6563f,11.3813f,-144.531f, --93.75f,13.6687f,-144.531f, --89.8438f,15.6897f,-144.531f, --85.9375f,17.6694f,-144.531f, --82.0313f,20.0542f,-144.531f, --78.125f,22.2881f,-144.531f, --74.2188f,24.021f,-144.531f, --70.3125f,26.6221f,-144.531f, --66.4063f,28.7647f,-144.531f, --62.5f,31.0025f,-144.531f, --58.5938f,31.9212f,-144.531f, --54.6875f,32.1124f,-144.531f, --50.7813f,33.4656f,-144.531f, --46.875f,33.5412f,-144.531f, --42.9688f,33.5562f,-144.531f, --39.0625f,34.3563f,-144.531f, --35.1563f,36.2482f,-144.531f, --31.25f,37.99f,-144.531f, --27.3438f,40.3527f,-144.531f, --23.4375f,42.4204f,-144.531f, --19.5313f,44.0f,-144.531f, --15.625f,44.183f,-144.531f, --11.7188f,44.0185f,-144.531f, --7.8125f,45.08f,-144.531f, --3.90625f,45.5784f,-144.531f, -0.0f,44.8122f,-144.531f, -3.90625f,45.2398f,-144.531f, --250.0f,27.5165f,-148.438f, --246.094f,28.4707f,-148.438f, --242.188f,28.8693f,-148.438f, --238.281f,29.8936f,-148.438f, --234.375f,30.9982f,-148.438f, --230.469f,31.9158f,-148.438f, --226.563f,33.0887f,-148.438f, --222.656f,32.141f,-148.438f, --218.75f,31.0388f,-148.438f, --214.844f,30.5599f,-148.438f, --210.938f,29.1269f,-148.438f, --207.031f,26.6179f,-148.438f, --203.125f,25.2859f,-148.438f, --199.219f,23.1182f,-148.438f, --195.313f,21.139f,-148.438f, --191.406f,19.7044f,-148.438f, --187.5f,18.4387f,-148.438f, --183.594f,17.6363f,-148.438f, --179.688f,15.8724f,-148.438f, --175.781f,14.454f,-148.438f, --171.875f,13.2052f,-148.438f, --167.969f,11.7702f,-148.438f, --164.063f,10.4965f,-148.438f, --160.156f,8.29165f,-148.438f, --156.25f,7.24803f,-148.438f, --152.344f,6.79621f,-148.438f, --148.438f,5.48372f,-148.438f, --144.531f,4.11362f,-148.438f, --140.625f,4.6586f,-148.438f, --136.719f,6.20081f,-148.438f, --132.813f,7.67687f,-148.438f, --128.906f,9.0742f,-148.438f, --125.0f,8.8028f,-148.438f, --121.094f,9.309f,-148.438f, --117.188f,9.26616f,-148.438f, --113.281f,9.88711f,-148.438f, --109.375f,9.19023f,-148.438f, --105.469f,9.46828f,-148.438f, --101.563f,10.1584f,-148.438f, --97.6563f,11.2649f,-148.438f, --93.75f,13.476f,-148.438f, --89.8438f,15.8318f,-148.438f, --85.9375f,17.6136f,-148.438f, --82.0313f,18.7495f,-148.438f, --78.125f,20.5385f,-148.438f, --74.2188f,23.5666f,-148.438f, --70.3125f,26.2836f,-148.438f, --66.4063f,28.729f,-148.438f, --62.5f,30.3854f,-148.438f, --58.5938f,30.9909f,-148.438f, --54.6875f,31.4288f,-148.438f, --50.7813f,31.916f,-148.438f, --46.875f,32.4745f,-148.438f, --42.9688f,32.0881f,-148.438f, --39.0625f,34.0231f,-148.438f, --35.1563f,35.6432f,-148.438f, --31.25f,37.6278f,-148.438f, --27.3438f,39.652f,-148.438f, --23.4375f,42.3336f,-148.438f, --19.5313f,43.3336f,-148.438f, --15.625f,43.9329f,-148.438f, --11.7188f,43.8742f,-148.438f, --7.8125f,44.336f,-148.438f, --3.90625f,44.2738f,-148.438f, -0.0f,42.6429f,-148.438f, -3.90625f,43.4167f,-148.438f, --250.0f,27.7654f,-152.344f, --246.094f,28.2588f,-152.344f, --242.188f,28.0365f,-152.344f, --238.281f,29.4531f,-152.344f, --234.375f,31.8507f,-152.344f, --230.469f,31.9987f,-152.344f, --226.563f,32.2635f,-152.344f, --222.656f,32.4573f,-152.344f, --218.75f,30.3791f,-152.344f, --214.844f,29.1133f,-152.344f, --210.938f,27.6466f,-152.344f, --207.031f,25.5524f,-152.344f, --203.125f,23.857f,-152.344f, --199.219f,21.724f,-152.344f, --195.313f,19.9592f,-152.344f, --191.406f,18.6648f,-152.344f, --187.5f,17.3913f,-152.344f, --183.594f,17.3113f,-152.344f, --179.688f,15.8776f,-152.344f, --175.781f,13.7968f,-152.344f, --171.875f,11.9961f,-152.344f, --167.969f,10.9315f,-152.344f, --164.063f,9.24337f,-152.344f, --160.156f,7.95749f,-152.344f, --156.25f,6.95525f,-152.344f, --152.344f,6.523f,-152.344f, --148.438f,5.62313f,-152.344f, --144.531f,4.31939f,-152.344f, --140.625f,3.1203f,-152.344f, --136.719f,4.98713f,-152.344f, --132.813f,6.64544f,-152.344f, --128.906f,7.48658f,-152.344f, --125.0f,8.08424f,-152.344f, --121.094f,8.96562f,-152.344f, --117.188f,9.10159f,-152.344f, --113.281f,9.38004f,-152.344f, --109.375f,8.97581f,-152.344f, --105.469f,8.78511f,-152.344f, --101.563f,9.76846f,-152.344f, --97.6563f,10.4299f,-152.344f, --93.75f,13.6059f,-152.344f, --89.8438f,16.3193f,-152.344f, --85.9375f,17.6959f,-152.344f, --82.0313f,18.5545f,-152.344f, --78.125f,20.1179f,-152.344f, --74.2188f,22.929f,-152.344f, --70.3125f,25.8413f,-152.344f, --66.4063f,28.4214f,-152.344f, --62.5f,30.0187f,-152.344f, --58.5938f,30.4285f,-152.344f, --54.6875f,30.9236f,-152.344f, --50.7813f,31.3519f,-152.344f, --46.875f,31.0939f,-152.344f, --42.9688f,30.2517f,-152.344f, --39.0625f,32.8953f,-152.344f, --35.1563f,34.6998f,-152.344f, --31.25f,36.8107f,-152.344f, --27.3438f,38.8491f,-152.344f, --23.4375f,41.3749f,-152.344f, --19.5313f,42.0838f,-152.344f, --15.625f,42.3106f,-152.344f, --11.7188f,43.9654f,-152.344f, --7.8125f,44.3642f,-152.344f, --3.90625f,43.1787f,-152.344f, -0.0f,41.875f,-152.344f, -3.90625f,42.7212f,-152.344f, --250.0f,27.3076f,-156.25f, --246.094f,27.8739f,-156.25f, --242.188f,27.7337f,-156.25f, --238.281f,28.4499f,-156.25f, --234.375f,30.5068f,-156.25f, --230.469f,31.1326f,-156.25f, --226.563f,32.3149f,-156.25f, --222.656f,31.2724f,-156.25f, --218.75f,29.5487f,-156.25f, --214.844f,26.8408f,-156.25f, --210.938f,25.2503f,-156.25f, --207.031f,24.2811f,-156.25f, --203.125f,23.8635f,-156.25f, --199.219f,22.2573f,-156.25f, --195.313f,20.6368f,-156.25f, --191.406f,19.4922f,-156.25f, --187.5f,18.0281f,-156.25f, --183.594f,15.4098f,-156.25f, --179.688f,13.9176f,-156.25f, --175.781f,11.8192f,-156.25f, --171.875f,9.31112f,-156.25f, --167.969f,8.81167f,-156.25f, --164.063f,8.04908f,-156.25f, --160.156f,6.4764f,-156.25f, --156.25f,5.83656f,-156.25f, --152.344f,5.70173f,-156.25f, --148.438f,6.05686f,-156.25f, --144.531f,3.98364f,-156.25f, --140.625f,2.80636f,-156.25f, --136.719f,3.53326f,-156.25f, --132.813f,4.97177f,-156.25f, --128.906f,6.71319f,-156.25f, --125.0f,8.26478f,-156.25f, --121.094f,9.00909f,-156.25f, --117.188f,8.8849f,-156.25f, --113.281f,9.50654f,-156.25f, --109.375f,9.16878f,-156.25f, --105.469f,8.84796f,-156.25f, --101.563f,9.78015f,-156.25f, --97.6563f,11.1536f,-156.25f, --93.75f,13.416f,-156.25f, --89.8438f,15.8674f,-156.25f, --85.9375f,17.2814f,-156.25f, --82.0313f,18.1958f,-156.25f, --78.125f,19.5037f,-156.25f, --74.2188f,22.0147f,-156.25f, --70.3125f,24.3288f,-156.25f, --66.4063f,26.5193f,-156.25f, --62.5f,27.9571f,-156.25f, --58.5938f,28.8524f,-156.25f, --54.6875f,30.6249f,-156.25f, --50.7813f,30.9824f,-156.25f, --46.875f,31.0372f,-156.25f, --42.9688f,30.2189f,-156.25f, --39.0625f,32.0632f,-156.25f, --35.1563f,34.0061f,-156.25f, --31.25f,35.3975f,-156.25f, --27.3438f,37.8006f,-156.25f, --23.4375f,40.1384f,-156.25f, --19.5313f,40.5455f,-156.25f, --15.625f,41.6044f,-156.25f, --11.7188f,43.1078f,-156.25f, --7.8125f,43.5927f,-156.25f, --3.90625f,43.0245f,-156.25f, -0.0f,41.3824f,-156.25f, -3.90625f,41.7368f,-156.25f, --250.0f,27.1128f,-160.156f, --246.094f,26.9845f,-160.156f, --242.188f,26.7433f,-160.156f, --238.281f,27.3777f,-160.156f, --234.375f,29.1743f,-160.156f, --230.469f,31.0712f,-160.156f, --226.563f,31.3707f,-160.156f, --222.656f,30.2327f,-160.156f, --218.75f,27.897f,-160.156f, --214.844f,26.4218f,-160.156f, --210.938f,24.0007f,-160.156f, --207.031f,23.6445f,-160.156f, --203.125f,23.6467f,-160.156f, --199.219f,22.8576f,-160.156f, --195.313f,20.6778f,-160.156f, --191.406f,19.3331f,-160.156f, --187.5f,17.8893f,-160.156f, --183.594f,14.3376f,-160.156f, --179.688f,11.9084f,-160.156f, --175.781f,9.60285f,-160.156f, --171.875f,7.78231f,-160.156f, --167.969f,8.15369f,-160.156f, --164.063f,7.46984f,-160.156f, --160.156f,6.48522f,-160.156f, --156.25f,5.27847f,-160.156f, --152.344f,4.69473f,-160.156f, --148.438f,5.14018f,-160.156f, --144.531f,3.26777f,-160.156f, --140.625f,3.33507f,-160.156f, --136.719f,2.47156f,-160.156f, --132.813f,4.15824f,-160.156f, --128.906f,6.45432f,-160.156f, --125.0f,7.99373f,-160.156f, --121.094f,8.38925f,-160.156f, --117.188f,8.59802f,-160.156f, --113.281f,9.4891f,-160.156f, --109.375f,9.20323f,-160.156f, --105.469f,8.27038f,-160.156f, --101.563f,9.71848f,-160.156f, --97.6563f,11.8577f,-160.156f, --93.75f,14.596f,-160.156f, --89.8438f,16.1058f,-160.156f, --85.9375f,17.6531f,-160.156f, --82.0313f,18.2123f,-160.156f, --78.125f,18.7175f,-160.156f, --74.2188f,20.7283f,-160.156f, --70.3125f,23.5217f,-160.156f, --66.4063f,26.4239f,-160.156f, --62.5f,27.757f,-160.156f, --58.5938f,28.1862f,-160.156f, --54.6875f,28.9075f,-160.156f, --50.7813f,29.5287f,-160.156f, --46.875f,29.3972f,-160.156f, --42.9688f,29.568f,-160.156f, --39.0625f,30.605f,-160.156f, --35.1563f,33.0369f,-160.156f, --31.25f,34.749f,-160.156f, --27.3438f,37.4864f,-160.156f, --23.4375f,39.2291f,-160.156f, --19.5313f,39.6275f,-160.156f, --15.625f,39.865f,-160.156f, --11.7188f,41.1833f,-160.156f, --7.8125f,41.7789f,-160.156f, --3.90625f,41.6972f,-160.156f, -0.0f,40.379f,-160.156f, -3.90625f,40.4755f,-160.156f, --250.0f,26.3982f,-164.063f, --246.094f,26.3606f,-164.063f, --242.188f,26.6508f,-164.063f, --238.281f,27.2228f,-164.063f, --234.375f,29.1682f,-164.063f, --230.469f,30.116f,-164.063f, --226.563f,30.3591f,-164.063f, --222.656f,28.8713f,-164.063f, --218.75f,26.8459f,-164.063f, --214.844f,24.9771f,-164.063f, --210.938f,24.4581f,-164.063f, --207.031f,23.6584f,-164.063f, --203.125f,22.7316f,-164.063f, --199.219f,21.1836f,-164.063f, --195.313f,19.6131f,-164.063f, --191.406f,18.5182f,-164.063f, --187.5f,16.824f,-164.063f, --183.594f,13.8772f,-164.063f, --179.688f,10.3923f,-164.063f, --175.781f,7.50643f,-164.063f, --171.875f,6.58466f,-164.063f, --167.969f,6.81413f,-164.063f, --164.063f,6.88249f,-164.063f, --160.156f,6.78655f,-164.063f, --156.25f,5.18348f,-164.063f, --152.344f,4.44173f,-164.063f, --148.438f,4.56392f,-164.063f, --144.531f,3.00722f,-164.063f, --140.625f,2.88808f,-164.063f, --136.719f,2.58477f,-164.063f, --132.813f,3.20911f,-164.063f, --128.906f,5.33043f,-164.063f, --125.0f,6.73698f,-164.063f, --121.094f,7.71971f,-164.063f, --117.188f,8.44689f,-164.063f, --113.281f,9.05366f,-164.063f, --109.375f,8.81111f,-164.063f, --105.469f,7.75706f,-164.063f, --101.563f,11.1131f,-164.063f, --97.6563f,12.8283f,-164.063f, --93.75f,14.7771f,-164.063f, --89.8438f,16.181f,-164.063f, --85.9375f,17.4228f,-164.063f, --82.0313f,18.5185f,-164.063f, --78.125f,19.3122f,-164.063f, --74.2188f,20.1572f,-164.063f, --70.3125f,22.741f,-164.063f, --66.4063f,24.5911f,-164.063f, --62.5f,26.3846f,-164.063f, --58.5938f,26.7315f,-164.063f, --54.6875f,27.0842f,-164.063f, --50.7813f,28.7654f,-164.063f, --46.875f,28.7233f,-164.063f, --42.9688f,29.2872f,-164.063f, --39.0625f,29.4838f,-164.063f, --35.1563f,32.7848f,-164.063f, --31.25f,34.771f,-164.063f, --27.3438f,36.568f,-164.063f, --23.4375f,37.5518f,-164.063f, --19.5313f,38.4106f,-164.063f, --15.625f,39.2979f,-164.063f, --11.7188f,39.3573f,-164.063f, --7.8125f,40.0034f,-164.063f, --3.90625f,39.5971f,-164.063f, -0.0f,38.8676f,-164.063f, -3.90625f,38.8633f,-164.063f, --250.0f,25.2893f,-167.969f, --246.094f,25.108f,-167.969f, --242.188f,25.5028f,-167.969f, --238.281f,26.6095f,-167.969f, --234.375f,28.3221f,-167.969f, --230.469f,28.5453f,-167.969f, --226.563f,28.2595f,-167.969f, --222.656f,26.8423f,-167.969f, --218.75f,25.0092f,-167.969f, --214.844f,24.2925f,-167.969f, --210.938f,23.8404f,-167.969f, --207.031f,22.7515f,-167.969f, --203.125f,22.5332f,-167.969f, --199.219f,20.3284f,-167.969f, --195.313f,18.8238f,-167.969f, --191.406f,17.0096f,-167.969f, --187.5f,14.7741f,-167.969f, --183.594f,12.4233f,-167.969f, --179.688f,9.35872f,-167.969f, --175.781f,6.39156f,-167.969f, --171.875f,4.97533f,-167.969f, --167.969f,4.85484f,-167.969f, --164.063f,5.54727f,-167.969f, --160.156f,5.08595f,-167.969f, --156.25f,3.82379f,-167.969f, --152.344f,3.95751f,-167.969f, --148.438f,4.60866f,-167.969f, --144.531f,3.48771f,-167.969f, --140.625f,3.26748f,-167.969f, --136.719f,1.87672f,-167.969f, --132.813f,2.70232f,-167.969f, --128.906f,4.51339f,-167.969f, --125.0f,6.0309f,-167.969f, --121.094f,7.41076f,-167.969f, --117.188f,7.44121f,-167.969f, --113.281f,7.50774f,-167.969f, --109.375f,6.89121f,-167.969f, --105.469f,8.13035f,-167.969f, --101.563f,11.7503f,-167.969f, --97.6563f,14.1358f,-167.969f, --93.75f,15.4553f,-167.969f, --89.8438f,16.6233f,-167.969f, --85.9375f,16.9002f,-167.969f, --82.0313f,18.4951f,-167.969f, --78.125f,19.0947f,-167.969f, --74.2188f,20.0506f,-167.969f, --70.3125f,20.9426f,-167.969f, --66.4063f,22.9738f,-167.969f, --62.5f,24.6229f,-167.969f, --58.5938f,26.446f,-167.969f, --54.6875f,26.6448f,-167.969f, --50.7813f,26.7349f,-167.969f, --46.875f,28.1266f,-167.969f, --42.9688f,29.6034f,-167.969f, --39.0625f,30.3572f,-167.969f, --35.1563f,31.5467f,-167.969f, --31.25f,33.6878f,-167.969f, --27.3438f,35.587f,-167.969f, --23.4375f,36.0939f,-167.969f, --19.5313f,37.5008f,-167.969f, --15.625f,38.2137f,-167.969f, --11.7188f,38.0843f,-167.969f, --7.8125f,38.5726f,-167.969f, --3.90625f,38.3565f,-167.969f, -0.0f,37.8848f,-167.969f, -3.90625f,37.2199f,-167.969f, --250.0f,24.1398f,-171.875f, --246.094f,23.8227f,-171.875f, --242.188f,24.7818f,-171.875f, --238.281f,26.1053f,-171.875f, --234.375f,26.9542f,-171.875f, --230.469f,26.4956f,-171.875f, --226.563f,25.4866f,-171.875f, --222.656f,24.7397f,-171.875f, --218.75f,23.4337f,-171.875f, --214.844f,23.2342f,-171.875f, --210.938f,22.1055f,-171.875f, --207.031f,20.7279f,-171.875f, --203.125f,20.7273f,-171.875f, --199.219f,19.1302f,-171.875f, --195.313f,16.3679f,-171.875f, --191.406f,14.4548f,-171.875f, --187.5f,12.5085f,-171.875f, --183.594f,10.0081f,-171.875f, --179.688f,7.8572f,-171.875f, --175.781f,4.38151f,-171.875f, --171.875f,3.2342f,-171.875f, --167.969f,3.37553f,-171.875f, --164.063f,3.90509f,-171.875f, --160.156f,3.26335f,-171.875f, --156.25f,2.88438f,-171.875f, --152.344f,4.22045f,-171.875f, --148.438f,3.83297f,-171.875f, --144.531f,2.98648f,-171.875f, --140.625f,2.83916f,-171.875f, --136.719f,1.97368f,-171.875f, --132.813f,1.85909f,-171.875f, --128.906f,3.2051f,-171.875f, --125.0f,5.12684f,-171.875f, --121.094f,5.86909f,-171.875f, --117.188f,6.45429f,-171.875f, --113.281f,6.28889f,-171.875f, --109.375f,7.53536f,-171.875f, --105.469f,9.44844f,-171.875f, --101.563f,11.4162f,-171.875f, --97.6563f,13.7412f,-171.875f, --93.75f,14.8315f,-171.875f, --89.8438f,15.4968f,-171.875f, --85.9375f,16.3468f,-171.875f, --82.0313f,18.2605f,-171.875f, --78.125f,18.0829f,-171.875f, --74.2188f,18.1489f,-171.875f, --70.3125f,20.6678f,-171.875f, --66.4063f,23.1234f,-171.875f, --62.5f,24.4247f,-171.875f, --58.5938f,26.5223f,-171.875f, --54.6875f,26.4286f,-171.875f, --50.7813f,26.7163f,-171.875f, --46.875f,28.0436f,-171.875f, --42.9688f,29.6821f,-171.875f, --39.0625f,30.721f,-171.875f, --35.1563f,31.1869f,-171.875f, --31.25f,32.2507f,-171.875f, --27.3438f,33.3898f,-171.875f, --23.4375f,33.9008f,-171.875f, --19.5313f,34.8028f,-171.875f, --15.625f,35.7178f,-171.875f, --11.7188f,35.7796f,-171.875f, --7.8125f,35.6384f,-171.875f, --3.90625f,35.5122f,-171.875f, -0.0f,35.5973f,-171.875f, -3.90625f,35.3898f,-171.875f, --250.0f,23.4472f,-175.781f, --246.094f,24.0295f,-175.781f, --242.188f,25.0451f,-175.781f, --238.281f,25.8985f,-175.781f, --234.375f,26.561f,-175.781f, --230.469f,25.8342f,-175.781f, --226.563f,24.8466f,-175.781f, --222.656f,24.9204f,-175.781f, --218.75f,23.1933f,-175.781f, --214.844f,22.3916f,-175.781f, --210.938f,20.9595f,-175.781f, --207.031f,19.4013f,-175.781f, --203.125f,18.3359f,-175.781f, --199.219f,16.2135f,-175.781f, --195.313f,14.3022f,-175.781f, --191.406f,12.4792f,-175.781f, --187.5f,10.1621f,-175.781f, --183.594f,7.8368f,-175.781f, --179.688f,5.59407f,-175.781f, --175.781f,3.47332f,-175.781f, --171.875f,2.4167f,-175.781f, --167.969f,2.13794f,-175.781f, --164.063f,2.36632f,-175.781f, --160.156f,2.44955f,-175.781f, --156.25f,2.40042f,-175.781f, --152.344f,3.0142f,-175.781f, --148.438f,2.58304f,-175.781f, --144.531f,3.06221f,-175.781f, --140.625f,2.8937f,-175.781f, --136.719f,2.59115f,-175.781f, --132.813f,2.27806f,-175.781f, --128.906f,3.67695f,-175.781f, --125.0f,5.23254f,-175.781f, --121.094f,6.12339f,-175.781f, --117.188f,6.24689f,-175.781f, --113.281f,6.79282f,-175.781f, --109.375f,7.83542f,-175.781f, --105.469f,9.33972f,-175.781f, --101.563f,11.2701f,-175.781f, --97.6563f,13.0689f,-175.781f, --93.75f,13.927f,-175.781f, --89.8438f,14.9788f,-175.781f, --85.9375f,15.6647f,-175.781f, --82.0313f,16.3833f,-175.781f, --78.125f,16.1061f,-175.781f, --74.2188f,17.7393f,-175.781f, --70.3125f,19.8808f,-175.781f, --66.4063f,22.2751f,-175.781f, --62.5f,23.8491f,-175.781f, --58.5938f,25.3344f,-175.781f, --54.6875f,26.6818f,-175.781f, --50.7813f,27.9151f,-175.781f, --46.875f,28.5054f,-175.781f, --42.9688f,29.7057f,-175.781f, --39.0625f,30.623f,-175.781f, --35.1563f,31.5341f,-175.781f, --31.25f,31.663f,-175.781f, --27.3438f,31.1886f,-175.781f, --23.4375f,31.5377f,-175.781f, --19.5313f,31.9508f,-175.781f, --15.625f,32.9549f,-175.781f, --11.7188f,33.7731f,-175.781f, --7.8125f,33.8023f,-175.781f, --3.90625f,34.5283f,-175.781f, -0.0f,34.7929f,-175.781f, -3.90625f,34.823f,-175.781f, --250.0f,22.2698f,-179.688f, --246.094f,23.7669f,-179.688f, --242.188f,24.59f,-179.688f, --238.281f,26.1637f,-179.688f, --234.375f,25.5266f,-179.688f, --230.469f,24.4911f,-179.688f, --226.563f,24.894f,-179.688f, --222.656f,23.7469f,-179.688f, --218.75f,22.9663f,-179.688f, --214.844f,20.6574f,-179.688f, --210.938f,19.2502f,-179.688f, --207.031f,17.3967f,-179.688f, --203.125f,15.9684f,-179.688f, --199.219f,13.2948f,-179.688f, --195.313f,11.9318f,-179.688f, --191.406f,9.64213f,-179.688f, --187.5f,7.9435f,-179.688f, --183.594f,6.1917f,-179.688f, --179.688f,4.0394f,-179.688f, --175.781f,1.9267f,-179.688f, --171.875f,1.73477f,-179.688f, --167.969f,0.994442f,-179.688f, --164.063f,0.99617f,-179.688f, --160.156f,1.00048f,-179.688f, --156.25f,1.54446f,-179.688f, --152.344f,0.849521f,-179.688f, --148.438f,1.3046f,-179.688f, --144.531f,1.38519f,-179.688f, --140.625f,0.916628f,-179.688f, --136.719f,1.39685f,-179.688f, --132.813f,2.17945f,-179.688f, --128.906f,4.01973f,-179.688f, --125.0f,5.72989f,-179.688f, --121.094f,7.24268f,-179.688f, --117.188f,7.06199f,-179.688f, --113.281f,7.91292f,-179.688f, --109.375f,7.8138f,-179.688f, --105.469f,10.102f,-179.688f, --101.563f,11.8106f,-179.688f, --97.6563f,12.9642f,-179.688f, --93.75f,13.5879f,-179.688f, --89.8438f,13.4552f,-179.688f, --85.9375f,14.1844f,-179.688f, --82.0313f,14.3802f,-179.688f, --78.125f,15.3847f,-179.688f, --74.2188f,17.2288f,-179.688f, --70.3125f,18.9285f,-179.688f, --66.4063f,20.0035f,-179.688f, --62.5f,22.2672f,-179.688f, --58.5938f,25.1262f,-179.688f, --54.6875f,27.2745f,-179.688f, --50.7813f,28.2648f,-179.688f, --46.875f,29.3825f,-179.688f, --42.9688f,30.2137f,-179.688f, --39.0625f,31.3826f,-179.688f, --35.1563f,31.25f,-179.688f, --31.25f,31.0392f,-179.688f, --27.3438f,30.3369f,-179.688f, --23.4375f,30.5503f,-179.688f, --19.5313f,30.9715f,-179.688f, --15.625f,31.8287f,-179.688f, --11.7188f,32.1393f,-179.688f, --7.8125f,32.0725f,-179.688f, --3.90625f,32.6574f,-179.688f, -0.0f,32.8889f,-179.688f, -3.90625f,32.9461f,-179.688f, --250.0f,22.3874f,-183.594f, --246.094f,22.8072f,-183.594f, --242.188f,23.1353f,-183.594f, --238.281f,24.0949f,-183.594f, --234.375f,24.0026f,-183.594f, --230.469f,23.458f,-183.594f, --226.563f,23.872f,-183.594f, --222.656f,22.969f,-183.594f, --218.75f,21.8375f,-183.594f, --214.844f,19.9316f,-183.594f, --210.938f,16.812f,-183.594f, --207.031f,15.1789f,-183.594f, --203.125f,13.7876f,-183.594f, --199.219f,11.6818f,-183.594f, --195.313f,9.75291f,-183.594f, --191.406f,7.08878f,-183.594f, --187.5f,6.43001f,-183.594f, --183.594f,5.15238f,-183.594f, --179.688f,3.77653f,-183.594f, --175.781f,3.01737f,-183.594f, --171.875f,1.46355f,-183.594f, --167.969f,0.767798f,-183.594f, --164.063f,1.98474f,-183.594f, --160.156f,1.09473f,-183.594f, --156.25f,1.29857f,-183.594f, --152.344f,-0.203491f,-183.594f, --148.438f,-0.506199f,-183.594f, --144.531f,-0.678603f,-183.594f, --140.625f,0.165814f,-183.594f, --136.719f,1.44759f,-183.594f, --132.813f,1.43337f,-183.594f, --128.906f,3.23614f,-183.594f, --125.0f,4.8541f,-183.594f, --121.094f,6.64038f,-183.594f, --117.188f,7.96432f,-183.594f, --113.281f,8.52594f,-183.594f, --109.375f,7.78399f,-183.594f, --105.469f,9.45422f,-183.594f, --101.563f,11.3198f,-183.594f, --97.6563f,12.2369f,-183.594f, --93.75f,12.7733f,-183.594f, --89.8438f,12.9184f,-183.594f, --85.9375f,12.958f,-183.594f, --82.0313f,13.3326f,-183.594f, --78.125f,14.3984f,-183.594f, --74.2188f,16.2737f,-183.594f, --70.3125f,17.9981f,-183.594f, --66.4063f,19.5314f,-183.594f, --62.5f,21.4039f,-183.594f, --58.5938f,24.8945f,-183.594f, --54.6875f,26.9904f,-183.594f, --50.7813f,28.6222f,-183.594f, --46.875f,30.2128f,-183.594f, --42.9688f,30.5142f,-183.594f, --39.0625f,30.7026f,-183.594f, --35.1563f,30.6413f,-183.594f, --31.25f,29.7659f,-183.594f, --27.3438f,30.2613f,-183.594f, --23.4375f,31.0694f,-183.594f, --19.5313f,31.0437f,-183.594f, --15.625f,30.9824f,-183.594f, --11.7188f,30.4648f,-183.594f, --7.8125f,30.0916f,-183.594f, --3.90625f,30.0801f,-183.594f, -0.0f,29.9992f,-183.594f, -3.90625f,30.0027f,-183.594f, --250.0f,22.2829f,-187.5f, --246.094f,23.1567f,-187.5f, --242.188f,23.2229f,-187.5f, --238.281f,23.6644f,-187.5f, --234.375f,23.5148f,-187.5f, --230.469f,22.8756f,-187.5f, --226.563f,22.2471f,-187.5f, --222.656f,21.4292f,-187.5f, --218.75f,20.4108f,-187.5f, --214.844f,18.2601f,-187.5f, --210.938f,16.3575f,-187.5f, --207.031f,13.0762f,-187.5f, --203.125f,11.5916f,-187.5f, --199.219f,9.81885f,-187.5f, --195.313f,8.57193f,-187.5f, --191.406f,5.93865f,-187.5f, --187.5f,5.15801f,-187.5f, --183.594f,3.89597f,-187.5f, --179.688f,4.52236f,-187.5f, --175.781f,4.21162f,-187.5f, --171.875f,2.62521f,-187.5f, --167.969f,1.85733f,-187.5f, --164.063f,2.14119f,-187.5f, --160.156f,2.60992f,-187.5f, --156.25f,1.99742f,-187.5f, --152.344f,0.836315f,-187.5f, --148.438f,-0.122141f,-187.5f, --144.531f,-1.21041f,-187.5f, --140.625f,0.620409f,-187.5f, --136.719f,2.20372f,-187.5f, --132.813f,2.55457f,-187.5f, --128.906f,3.09944f,-187.5f, --125.0f,4.76219f,-187.5f, --121.094f,6.5939f,-187.5f, --117.188f,7.40657f,-187.5f, --113.281f,8.17096f,-187.5f, --109.375f,8.8965f,-187.5f, --105.469f,9.54116f,-187.5f, --101.563f,10.8183f,-187.5f, --97.6563f,12.2345f,-187.5f, --93.75f,11.945f,-187.5f, --89.8438f,12.3063f,-187.5f, --85.9375f,12.7736f,-187.5f, --82.0313f,13.2581f,-187.5f, --78.125f,14.2241f,-187.5f, --74.2188f,15.1957f,-187.5f, --70.3125f,17.7241f,-187.5f, --66.4063f,21.0931f,-187.5f, --62.5f,23.7741f,-187.5f, --58.5938f,24.8775f,-187.5f, --54.6875f,26.5924f,-187.5f, --50.7813f,28.0699f,-187.5f, --46.875f,30.1552f,-187.5f, --42.9688f,30.8508f,-187.5f, --39.0625f,30.7935f,-187.5f, --35.1563f,30.3224f,-187.5f, --31.25f,28.8455f,-187.5f, --27.3438f,30.2059f,-187.5f, --23.4375f,31.5456f,-187.5f, --19.5313f,31.0657f,-187.5f, --15.625f,30.5686f,-187.5f, --11.7188f,29.9754f,-187.5f, --7.8125f,28.7754f,-187.5f, --3.90625f,28.2457f,-187.5f, -0.0f,27.4045f,-187.5f, -3.90625f,27.6405f,-187.5f, --250.0f,21.5096f,-191.406f, --246.094f,22.1931f,-191.406f, --242.188f,22.416f,-191.406f, --238.281f,22.619f,-191.406f, --234.375f,22.9242f,-191.406f, --230.469f,22.6042f,-191.406f, --226.563f,21.5344f,-191.406f, --222.656f,20.226f,-191.406f, --218.75f,19.6198f,-191.406f, --214.844f,18.0849f,-191.406f, --210.938f,15.9896f,-191.406f, --207.031f,12.7402f,-191.406f, --203.125f,9.98899f,-191.406f, --199.219f,7.38602f,-191.406f, --195.313f,6.23078f,-191.406f, --191.406f,4.8714f,-191.406f, --187.5f,4.87792f,-191.406f, --183.594f,4.53381f,-191.406f, --179.688f,5.23517f,-191.406f, --175.781f,4.22349f,-191.406f, --171.875f,3.46214f,-191.406f, --167.969f,3.62202f,-191.406f, --164.063f,3.07142f,-191.406f, --160.156f,3.69893f,-191.406f, --156.25f,4.20827f,-191.406f, --152.344f,2.23654f,-191.406f, --148.438f,0.582121f,-191.406f, --144.531f,0.44941f,-191.406f, --140.625f,2.42446f,-191.406f, --136.719f,3.54807f,-191.406f, --132.813f,3.58143f,-191.406f, --128.906f,4.42162f,-191.406f, --125.0f,5.24153f,-191.406f, --121.094f,6.55792f,-191.406f, --117.188f,6.93471f,-191.406f, --113.281f,7.73309f,-191.406f, --109.375f,8.04468f,-191.406f, --105.469f,9.15528f,-191.406f, --101.563f,10.9583f,-191.406f, --97.6563f,12.1897f,-191.406f, --93.75f,11.6481f,-191.406f, --89.8438f,11.6514f,-191.406f, --85.9375f,12.4326f,-191.406f, --82.0313f,13.3808f,-191.406f, --78.125f,14.386f,-191.406f, --74.2188f,16.182f,-191.406f, --70.3125f,18.9931f,-191.406f, --66.4063f,22.8308f,-191.406f, --62.5f,25.3868f,-191.406f, --58.5938f,26.1484f,-191.406f, --54.6875f,25.6258f,-191.406f, --50.7813f,26.9464f,-191.406f, --46.875f,29.0075f,-191.406f, --42.9688f,29.8523f,-191.406f, --39.0625f,30.1236f,-191.406f, --35.1563f,29.7557f,-191.406f, --31.25f,28.4913f,-191.406f, --27.3438f,29.5389f,-191.406f, --23.4375f,30.4685f,-191.406f, --19.5313f,30.3743f,-191.406f, --15.625f,30.3762f,-191.406f, --11.7188f,29.0099f,-191.406f, --7.8125f,28.1952f,-191.406f, --3.90625f,26.135f,-191.406f, -0.0f,25.2418f,-191.406f, -3.90625f,25.3652f,-191.406f, --250.0f,20.78f,-195.313f, --246.094f,20.8279f,-195.313f, --242.188f,21.2199f,-195.313f, --238.281f,22.0652f,-195.313f, --234.375f,22.2095f,-195.313f, --230.469f,22.1372f,-195.313f, --226.563f,21.0165f,-195.313f, --222.656f,19.4174f,-195.313f, --218.75f,17.7927f,-195.313f, --214.844f,16.6172f,-195.313f, --210.938f,14.7065f,-195.313f, --207.031f,11.8095f,-195.313f, --203.125f,9.63824f,-195.313f, --199.219f,6.4991f,-195.313f, --195.313f,6.23707f,-195.313f, --191.406f,6.60374f,-195.313f, --187.5f,6.22557f,-195.313f, --183.594f,5.47951f,-195.313f, --179.688f,5.16851f,-195.313f, --175.781f,4.83538f,-195.313f, --171.875f,4.16992f,-195.313f, --167.969f,5.40533f,-195.313f, --164.063f,5.01562f,-195.313f, --160.156f,4.58978f,-195.313f, --156.25f,4.73252f,-195.313f, --152.344f,3.14586f,-195.313f, --148.438f,1.16894f,-195.313f, --144.531f,2.4916f,-195.313f, --140.625f,3.98933f,-195.313f, --136.719f,5.16861f,-195.313f, --132.813f,5.68931f,-195.313f, --128.906f,5.45815f,-195.313f, --125.0f,5.15506f,-195.313f, --121.094f,6.46153f,-195.313f, --117.188f,7.36577f,-195.313f, --113.281f,8.13491f,-195.313f, --109.375f,7.50896f,-195.313f, --105.469f,8.93662f,-195.313f, --101.563f,10.6513f,-195.313f, --97.6563f,10.6255f,-195.313f, --93.75f,10.5332f,-195.313f, --89.8438f,11.5758f,-195.313f, --85.9375f,11.568f,-195.313f, --82.0313f,14.2419f,-195.313f, --78.125f,16.1272f,-195.313f, --74.2188f,17.0994f,-195.313f, --70.3125f,20.4651f,-195.313f, --66.4063f,23.534f,-195.313f, --62.5f,25.1181f,-195.313f, --58.5938f,25.9427f,-195.313f, --54.6875f,25.5166f,-195.313f, --50.7813f,25.1027f,-195.313f, --46.875f,27.2281f,-195.313f, --42.9688f,28.7319f,-195.313f, --39.0625f,28.8984f,-195.313f, --35.1563f,28.3307f,-195.313f, --31.25f,27.4754f,-195.313f, --27.3438f,27.8763f,-195.313f, --23.4375f,28.1023f,-195.313f, --19.5313f,28.9815f,-195.313f, --15.625f,28.5849f,-195.313f, --11.7188f,27.2687f,-195.313f, --7.8125f,26.8112f,-195.313f, --3.90625f,25.3636f,-195.313f, -0.0f,23.2134f,-195.313f, -3.90625f,23.0993f,-195.313f, --250.0f,20.2026f,-199.219f, --246.094f,19.5895f,-199.219f, --242.188f,20.3489f,-199.219f, --238.281f,21.0293f,-199.219f, --234.375f,21.5343f,-199.219f, --230.469f,20.6859f,-199.219f, --226.563f,19.9279f,-199.219f, --222.656f,18.7217f,-199.219f, --218.75f,17.4818f,-199.219f, --214.844f,15.0438f,-199.219f, --210.938f,13.4082f,-199.219f, --207.031f,10.7188f,-199.219f, --203.125f,8.32176f,-199.219f, --199.219f,7.30407f,-199.219f, --195.313f,7.02569f,-199.219f, --191.406f,7.38826f,-199.219f, --187.5f,6.94954f,-199.219f, --183.594f,6.62067f,-199.219f, --179.688f,6.55308f,-199.219f, --175.781f,6.3403f,-199.219f, --171.875f,5.0001f,-199.219f, --167.969f,6.51564f,-199.219f, --164.063f,6.69774f,-199.219f, --160.156f,5.67189f,-199.219f, --156.25f,4.8973f,-199.219f, --152.344f,3.43798f,-199.219f, --148.438f,2.08531f,-199.219f, --144.531f,3.86643f,-199.219f, --140.625f,6.0862f,-199.219f, --136.719f,6.99995f,-199.219f, --132.813f,8.32808f,-199.219f, --128.906f,8.55809f,-199.219f, --125.0f,8.26904f,-199.219f, --121.094f,8.63733f,-199.219f, --117.188f,9.11106f,-199.219f, --113.281f,9.73154f,-199.219f, --109.375f,9.14108f,-199.219f, --105.469f,9.3525f,-199.219f, --101.563f,9.56281f,-199.219f, --97.6563f,9.74866f,-199.219f, --93.75f,10.9852f,-199.219f, --89.8438f,12.3926f,-199.219f, --85.9375f,13.6407f,-199.219f, --82.0313f,15.9886f,-199.219f, --78.125f,17.7913f,-199.219f, --74.2188f,18.8352f,-199.219f, --70.3125f,20.2718f,-199.219f, --66.4063f,23.501f,-199.219f, --62.5f,24.6073f,-199.219f, --58.5938f,25.3028f,-199.219f, --54.6875f,25.2244f,-199.219f, --50.7813f,23.9922f,-199.219f, --46.875f,24.6425f,-199.219f, --42.9688f,26.6199f,-199.219f, --39.0625f,27.5474f,-199.219f, --35.1563f,27.4672f,-199.219f, --31.25f,27.2906f,-199.219f, --27.3438f,26.489f,-199.219f, --23.4375f,26.3554f,-199.219f, --19.5313f,26.1787f,-199.219f, --15.625f,26.2538f,-199.219f, --11.7188f,25.7694f,-199.219f, --7.8125f,25.2691f,-199.219f, --3.90625f,23.3867f,-199.219f, -0.0f,22.5717f,-199.219f, -3.90625f,21.5827f,-199.219f, --250.0f,19.3526f,-203.125f, --246.094f,19.2964f,-203.125f, --242.188f,19.226f,-203.125f, --238.281f,19.4274f,-203.125f, --234.375f,19.4317f,-203.125f, --230.469f,19.3079f,-203.125f, --226.563f,18.212f,-203.125f, --222.656f,17.8371f,-203.125f, --218.75f,16.8642f,-203.125f, --214.844f,14.8539f,-203.125f, --210.938f,12.425f,-203.125f, --207.031f,10.0369f,-203.125f, --203.125f,9.00151f,-203.125f, --199.219f,8.61334f,-203.125f, --195.313f,8.09586f,-203.125f, --191.406f,8.18143f,-203.125f, --187.5f,7.75345f,-203.125f, --183.594f,7.72772f,-203.125f, --179.688f,7.71649f,-203.125f, --175.781f,7.72935f,-203.125f, --171.875f,6.70116f,-203.125f, --167.969f,6.58828f,-203.125f, --164.063f,6.47975f,-203.125f, --160.156f,5.96451f,-203.125f, --156.25f,5.85253f,-203.125f, --152.344f,5.14982f,-203.125f, --148.438f,4.60646f,-203.125f, --144.531f,6.3659f,-203.125f, --140.625f,7.66587f,-203.125f, --136.719f,8.68095f,-203.125f, --132.813f,9.86922f,-203.125f, --128.906f,9.93481f,-203.125f, --125.0f,10.9585f,-203.125f, --121.094f,10.9271f,-203.125f, --117.188f,11.4348f,-203.125f, --113.281f,11.0548f,-203.125f, --109.375f,11.2501f,-203.125f, --105.469f,11.7673f,-203.125f, --101.563f,10.8899f,-203.125f, --97.6563f,11.3791f,-203.125f, --93.75f,12.168f,-203.125f, --89.8438f,12.7667f,-203.125f, --85.9375f,15.2415f,-203.125f, --82.0313f,17.9783f,-203.125f, --78.125f,19.6193f,-203.125f, --74.2188f,19.6343f,-203.125f, --70.3125f,19.7814f,-203.125f, --66.4063f,21.45f,-203.125f, --62.5f,24.1224f,-203.125f, --58.5938f,24.9145f,-203.125f, --54.6875f,24.2614f,-203.125f, --50.7813f,24.025f,-203.125f, --46.875f,23.1092f,-203.125f, --42.9688f,24.0294f,-203.125f, --39.0625f,25.4744f,-203.125f, --35.1563f,25.9477f,-203.125f, --31.25f,25.5895f,-203.125f, --27.3438f,25.0752f,-203.125f, --23.4375f,24.6537f,-203.125f, --19.5313f,25.0025f,-203.125f, --15.625f,25.211f,-203.125f, --11.7188f,24.2103f,-203.125f, --7.8125f,23.1363f,-203.125f, --3.90625f,21.4314f,-203.125f, -0.0f,20.8784f,-203.125f, -3.90625f,20.3179f,-203.125f, --250.0f,18.4857f,-207.031f, --246.094f,18.9103f,-207.031f, --242.188f,17.7666f,-207.031f, --238.281f,18.3803f,-207.031f, --234.375f,17.7746f,-207.031f, --230.469f,18.1956f,-207.031f, --226.563f,17.4596f,-207.031f, --222.656f,16.5346f,-207.031f, --218.75f,15.3933f,-207.031f, --214.844f,14.0342f,-207.031f, --210.938f,11.5492f,-207.031f, --207.031f,10.8526f,-207.031f, --203.125f,10.5164f,-207.031f, --199.219f,10.4957f,-207.031f, --195.313f,9.57889f,-207.031f, --191.406f,9.42031f,-207.031f, --187.5f,9.08544f,-207.031f, --183.594f,8.10082f,-207.031f, --179.688f,8.5632f,-207.031f, --175.781f,8.74392f,-207.031f, --171.875f,8.56175f,-207.031f, --167.969f,7.13665f,-207.031f, --164.063f,6.99003f,-207.031f, --160.156f,7.1192f,-207.031f, --156.25f,6.173f,-207.031f, --152.344f,6.44193f,-207.031f, --148.438f,7.15583f,-207.031f, --144.531f,7.74526f,-207.031f, --140.625f,9.38846f,-207.031f, --136.719f,10.1943f,-207.031f, --132.813f,10.5195f,-207.031f, --128.906f,11.4457f,-207.031f, --125.0f,12.4233f,-207.031f, --121.094f,12.8633f,-207.031f, --117.188f,13.4045f,-207.031f, --113.281f,12.9134f,-207.031f, --109.375f,12.9203f,-207.031f, --105.469f,13.2173f,-207.031f, --101.563f,12.9065f,-207.031f, --97.6563f,12.9327f,-207.031f, --93.75f,13.5926f,-207.031f, --89.8438f,14.5472f,-207.031f, --85.9375f,16.41f,-207.031f, --82.0313f,19.1484f,-207.031f, --78.125f,20.5688f,-207.031f, --74.2188f,20.1464f,-207.031f, --70.3125f,19.9352f,-207.031f, --66.4063f,20.4543f,-207.031f, --62.5f,22.0083f,-207.031f, --58.5938f,23.2866f,-207.031f, --54.6875f,23.3242f,-207.031f, --50.7813f,23.0127f,-207.031f, --46.875f,23.4455f,-207.031f, --42.9688f,23.4808f,-207.031f, --39.0625f,24.4622f,-207.031f, --35.1563f,25.1122f,-207.031f, --31.25f,25.3818f,-207.031f, --27.3438f,24.0051f,-207.031f, --23.4375f,22.3971f,-207.031f, --19.5313f,23.4811f,-207.031f, --15.625f,23.8447f,-207.031f, --11.7188f,22.3912f,-207.031f, --7.8125f,21.7286f,-207.031f, --3.90625f,20.1632f,-207.031f, -0.0f,18.6587f,-207.031f, -3.90625f,18.3149f,-207.031f, --250.0f,17.6517f,-210.938f, --246.094f,17.8132f,-210.938f, --242.188f,17.4894f,-210.938f, --238.281f,16.7087f,-210.938f, --234.375f,15.9111f,-210.938f, --230.469f,16.6733f,-210.938f, --226.563f,16.6911f,-210.938f, --222.656f,14.6177f,-210.938f, --218.75f,13.6959f,-210.938f, --214.844f,12.227f,-210.938f, --210.938f,11.5376f,-210.938f, --207.031f,11.7259f,-210.938f, --203.125f,11.4804f,-210.938f, --199.219f,11.8728f,-210.938f, --195.313f,11.7357f,-210.938f, --191.406f,10.6319f,-210.938f, --187.5f,10.7016f,-210.938f, --183.594f,9.53811f,-210.938f, --179.688f,9.65149f,-210.938f, --175.781f,9.45993f,-210.938f, --171.875f,9.4427f,-210.938f, --167.969f,8.02525f,-210.938f, --164.063f,6.71089f,-210.938f, --160.156f,7.22567f,-210.938f, --156.25f,7.52391f,-210.938f, --152.344f,8.46765f,-210.938f, --148.438f,8.60801f,-210.938f, --144.531f,9.89046f,-210.938f, --140.625f,10.9163f,-210.938f, --136.719f,11.445f,-210.938f, --132.813f,12.6949f,-210.938f, --128.906f,13.3645f,-210.938f, --125.0f,14.5389f,-210.938f, --121.094f,14.7689f,-210.938f, --117.188f,15.8285f,-210.938f, --113.281f,15.5058f,-210.938f, --109.375f,14.3542f,-210.938f, --105.469f,14.9928f,-210.938f, --101.563f,14.9601f,-210.938f, --97.6563f,15.1602f,-210.938f, --93.75f,15.1589f,-210.938f, --89.8438f,16.5401f,-210.938f, --85.9375f,18.2407f,-210.938f, --82.0313f,19.8006f,-210.938f, --78.125f,20.9223f,-210.938f, --74.2188f,20.5615f,-210.938f, --70.3125f,21.0505f,-210.938f, --66.4063f,21.024f,-210.938f, --62.5f,21.7216f,-210.938f, --58.5938f,22.8737f,-210.938f, --54.6875f,23.631f,-210.938f, --50.7813f,23.6265f,-210.938f, --46.875f,23.5636f,-210.938f, --42.9688f,24.1299f,-210.938f, --39.0625f,24.6395f,-210.938f, --35.1563f,25.3237f,-210.938f, --31.25f,24.7459f,-210.938f, --27.3438f,22.2327f,-210.938f, --23.4375f,21.6309f,-210.938f, --19.5313f,22.3059f,-210.938f, --15.625f,22.1894f,-210.938f, --11.7188f,21.2088f,-210.938f, --7.8125f,20.3383f,-210.938f, --3.90625f,18.4799f,-210.938f, -0.0f,17.18f,-210.938f, -3.90625f,16.2147f,-210.938f, --250.0f,17.6547f,-214.844f, --246.094f,17.1845f,-214.844f, --242.188f,17.6913f,-214.844f, --238.281f,16.8842f,-214.844f, --234.375f,14.7169f,-214.844f, --230.469f,15.4287f,-214.844f, --226.563f,14.5659f,-214.844f, --222.656f,13.1756f,-214.844f, --218.75f,12.021f,-214.844f, --214.844f,11.9663f,-214.844f, --210.938f,12.535f,-214.844f, --207.031f,12.5802f,-214.844f, --203.125f,12.7437f,-214.844f, --199.219f,12.9859f,-214.844f, --195.313f,12.7714f,-214.844f, --191.406f,11.9783f,-214.844f, --187.5f,11.9282f,-214.844f, --183.594f,10.7633f,-214.844f, --179.688f,10.3463f,-214.844f, --175.781f,10.1867f,-214.844f, --171.875f,10.378f,-214.844f, --167.969f,8.81572f,-214.844f, --164.063f,7.29133f,-214.844f, --160.156f,8.45242f,-214.844f, --156.25f,9.77224f,-214.844f, --152.344f,10.4567f,-214.844f, --148.438f,11.0484f,-214.844f, --144.531f,12.1985f,-214.844f, --140.625f,13.766f,-214.844f, --136.719f,14.9123f,-214.844f, --132.813f,15.4577f,-214.844f, --128.906f,16.3401f,-214.844f, --125.0f,16.5963f,-214.844f, --121.094f,16.9605f,-214.844f, --117.188f,16.548f,-214.844f, --113.281f,16.701f,-214.844f, --109.375f,16.6987f,-214.844f, --105.469f,16.1393f,-214.844f, --101.563f,15.4379f,-214.844f, --97.6563f,15.9931f,-214.844f, --93.75f,16.7962f,-214.844f, --89.8438f,18.5464f,-214.844f, --85.9375f,20.2834f,-214.844f, --82.0313f,20.8463f,-214.844f, --78.125f,21.263f,-214.844f, --74.2188f,22.137f,-214.844f, --70.3125f,22.1614f,-214.844f, --66.4063f,21.7706f,-214.844f, --62.5f,23.0496f,-214.844f, --58.5938f,23.0762f,-214.844f, --54.6875f,24.2163f,-214.844f, --50.7813f,23.9415f,-214.844f, --46.875f,23.115f,-214.844f, --42.9688f,24.4371f,-214.844f, --39.0625f,25.7433f,-214.844f, --35.1563f,24.6385f,-214.844f, --31.25f,23.2822f,-214.844f, --27.3438f,21.8583f,-214.844f, --23.4375f,21.2352f,-214.844f, --19.5313f,21.3084f,-214.844f, --15.625f,20.7264f,-214.844f, --11.7188f,19.67f,-214.844f, --7.8125f,18.8192f,-214.844f, --3.90625f,16.6504f,-214.844f, -0.0f,14.8779f,-214.844f, -3.90625f,14.284f,-214.844f, --250.0f,17.1549f,-218.75f, --246.094f,16.6295f,-218.75f, --242.188f,17.7459f,-218.75f, --238.281f,17.3894f,-218.75f, --234.375f,15.2738f,-218.75f, --230.469f,13.3984f,-218.75f, --226.563f,12.8639f,-218.75f, --222.656f,12.3225f,-218.75f, --218.75f,12.1914f,-218.75f, --214.844f,12.4104f,-218.75f, --210.938f,12.9278f,-218.75f, --207.031f,13.387f,-218.75f, --203.125f,13.4342f,-218.75f, --199.219f,12.7445f,-218.75f, --195.313f,12.543f,-218.75f, --191.406f,12.1437f,-218.75f, --187.5f,12.3491f,-218.75f, --183.594f,11.2334f,-218.75f, --179.688f,11.4016f,-218.75f, --175.781f,11.2455f,-218.75f, --171.875f,10.3681f,-218.75f, --167.969f,9.23056f,-218.75f, --164.063f,8.35869f,-218.75f, --160.156f,10.3612f,-218.75f, --156.25f,11.8429f,-218.75f, --152.344f,13.2154f,-218.75f, --148.438f,13.6238f,-218.75f, --144.531f,14.8343f,-218.75f, --140.625f,15.5549f,-218.75f, --136.719f,16.9496f,-218.75f, --132.813f,17.9187f,-218.75f, --128.906f,17.7467f,-218.75f, --125.0f,17.8229f,-218.75f, --121.094f,17.4408f,-218.75f, --117.188f,17.3929f,-218.75f, --113.281f,17.9861f,-218.75f, --109.375f,18.0206f,-218.75f, --105.469f,17.6787f,-218.75f, --101.563f,17.3769f,-218.75f, --97.6563f,17.5683f,-218.75f, --93.75f,18.0067f,-218.75f, --89.8438f,18.9639f,-218.75f, --85.9375f,20.8377f,-218.75f, --82.0313f,22.207f,-218.75f, --78.125f,23.1239f,-218.75f, --74.2188f,22.384f,-218.75f, --70.3125f,22.2939f,-218.75f, --66.4063f,21.8208f,-218.75f, --62.5f,22.9458f,-218.75f, --58.5938f,24.2547f,-218.75f, --54.6875f,24.5855f,-218.75f, --50.7813f,23.9529f,-218.75f, --46.875f,22.9226f,-218.75f, --42.9688f,25.1015f,-218.75f, --39.0625f,25.1591f,-218.75f, --35.1563f,23.6146f,-218.75f, --31.25f,21.7924f,-218.75f, --27.3438f,20.3147f,-218.75f, --23.4375f,19.9227f,-218.75f, --19.5313f,20.3267f,-218.75f, --15.625f,19.1903f,-218.75f, --11.7188f,17.3132f,-218.75f, --7.8125f,16.5145f,-218.75f, --3.90625f,15.5991f,-218.75f, -0.0f,13.7865f,-218.75f, -3.90625f,13.272f,-218.75f, --250.0f,16.7536f,-222.656f, --246.094f,16.7692f,-222.656f, --242.188f,17.6216f,-222.656f, --238.281f,17.7524f,-222.656f, --234.375f,15.7102f,-222.656f, --230.469f,13.9934f,-222.656f, --226.563f,13.1311f,-222.656f, --222.656f,13.6218f,-222.656f, --218.75f,13.8812f,-222.656f, --214.844f,13.6928f,-222.656f, --210.938f,13.2498f,-222.656f, --207.031f,13.9199f,-222.656f, --203.125f,14.8224f,-222.656f, --199.219f,14.7821f,-222.656f, --195.313f,14.4118f,-222.656f, --191.406f,13.2421f,-222.656f, --187.5f,13.1953f,-222.656f, --183.594f,11.9441f,-222.656f, --179.688f,11.8006f,-222.656f, --175.781f,11.2509f,-222.656f, --171.875f,9.7863f,-222.656f, --167.969f,8.85086f,-222.656f, --164.063f,10.6896f,-222.656f, --160.156f,12.9132f,-222.656f, --156.25f,13.602f,-222.656f, --152.344f,15.3711f,-222.656f, --148.438f,16.1768f,-222.656f, --144.531f,16.9203f,-222.656f, --140.625f,17.0404f,-222.656f, --136.719f,18.4968f,-222.656f, --132.813f,18.8222f,-222.656f, --128.906f,19.2736f,-222.656f, --125.0f,19.1956f,-222.656f, --121.094f,18.5998f,-222.656f, --117.188f,18.5054f,-222.656f, --113.281f,19.68f,-222.656f, --109.375f,19.5038f,-222.656f, --105.469f,19.4749f,-222.656f, --101.563f,18.7504f,-222.656f, --97.6563f,18.6121f,-222.656f, --93.75f,19.1119f,-222.656f, --89.8438f,20.5347f,-222.656f, --85.9375f,21.4412f,-222.656f, --82.0313f,22.187f,-222.656f, --78.125f,22.9384f,-222.656f, --74.2188f,22.5226f,-222.656f, --70.3125f,22.7323f,-222.656f, --66.4063f,23.4931f,-222.656f, --62.5f,24.6895f,-222.656f, --58.5938f,24.9745f,-222.656f, --54.6875f,24.801f,-222.656f, --50.7813f,23.2235f,-222.656f, --46.875f,22.4973f,-222.656f, --42.9688f,23.9826f,-222.656f, --39.0625f,23.4458f,-222.656f, --35.1563f,22.66f,-222.656f, --31.25f,20.8011f,-222.656f, --27.3438f,18.877f,-222.656f, --23.4375f,17.9999f,-222.656f, --19.5313f,18.2206f,-222.656f, --15.625f,17.8501f,-222.656f, --11.7188f,16.2125f,-222.656f, --7.8125f,15.4897f,-222.656f, --3.90625f,14.2048f,-222.656f, -0.0f,13.1443f,-222.656f, -3.90625f,13.0199f,-222.656f, --250.0f,15.9959f,-226.563f, --246.094f,16.3902f,-226.563f, --242.188f,17.2433f,-226.563f, --238.281f,16.8903f,-226.563f, --234.375f,16.2616f,-226.563f, --230.469f,16.3335f,-226.563f, --226.563f,15.3662f,-226.563f, --222.656f,14.6429f,-226.563f, --218.75f,15.2987f,-226.563f, --214.844f,15.1249f,-226.563f, --210.938f,14.6321f,-226.563f, --207.031f,15.402f,-226.563f, --203.125f,15.5803f,-226.563f, --199.219f,15.8024f,-226.563f, --195.313f,14.9564f,-226.563f, --191.406f,14.7272f,-226.563f, --187.5f,14.0749f,-226.563f, --183.594f,12.2838f,-226.563f, --179.688f,12.0268f,-226.563f, --175.781f,10.904f,-226.563f, --171.875f,10.0049f,-226.563f, --167.969f,9.85558f,-226.563f, --164.063f,11.873f,-226.563f, --160.156f,14.0684f,-226.563f, --156.25f,15.4765f,-226.563f, --152.344f,16.7458f,-226.563f, --148.438f,17.9359f,-226.563f, --144.531f,18.4507f,-226.563f, --140.625f,18.3457f,-226.563f, --136.719f,20.0059f,-226.563f, --132.813f,20.3125f,-226.563f, --128.906f,19.751f,-226.563f, --125.0f,19.8084f,-226.563f, --121.094f,19.9091f,-226.563f, --117.188f,20.3401f,-226.563f, --113.281f,20.8121f,-226.563f, --109.375f,20.5705f,-226.563f, --105.469f,20.9909f,-226.563f, --101.563f,20.4171f,-226.563f, --97.6563f,19.834f,-226.563f, --93.75f,19.9289f,-226.563f, --89.8438f,20.4305f,-226.563f, --85.9375f,21.4097f,-226.563f, --82.0313f,21.9666f,-226.563f, --78.125f,22.5232f,-226.563f, --74.2188f,22.2049f,-226.563f, --70.3125f,22.7045f,-226.563f, --66.4063f,23.7933f,-226.563f, --62.5f,24.5938f,-226.563f, --58.5938f,24.6161f,-226.563f, --54.6875f,23.6008f,-226.563f, --50.7813f,21.9411f,-226.563f, --46.875f,21.6164f,-226.563f, --42.9688f,22.5551f,-226.563f, --39.0625f,22.5032f,-226.563f, --35.1563f,21.5165f,-226.563f, --31.25f,19.8362f,-226.563f, --27.3438f,17.5967f,-226.563f, --23.4375f,15.6932f,-226.563f, --19.5313f,15.7774f,-226.563f, --15.625f,15.6405f,-226.563f, --11.7188f,14.7549f,-226.563f, --7.8125f,14.3205f,-226.563f, --3.90625f,13.2947f,-226.563f, -0.0f,11.9266f,-226.563f, -3.90625f,11.9733f,-226.563f, --250.0f,15.2423f,-230.469f, --246.094f,16.2143f,-230.469f, --242.188f,17.2462f,-230.469f, --238.281f,17.7941f,-230.469f, --234.375f,18.4029f,-230.469f, --230.469f,18.5726f,-230.469f, --226.563f,17.4729f,-230.469f, --222.656f,15.9467f,-230.469f, --218.75f,15.5021f,-230.469f, --214.844f,15.7096f,-230.469f, --210.938f,15.6276f,-230.469f, --207.031f,15.7025f,-230.469f, --203.125f,14.8851f,-230.469f, --199.219f,14.87f,-230.469f, --195.313f,14.3971f,-230.469f, --191.406f,14.5771f,-230.469f, --187.5f,13.8163f,-230.469f, --183.594f,12.7605f,-230.469f, --179.688f,12.587f,-230.469f, --175.781f,11.0727f,-230.469f, --171.875f,10.0166f,-230.469f, --167.969f,12.5787f,-230.469f, --164.063f,13.3613f,-230.469f, --160.156f,14.7537f,-230.469f, --156.25f,15.9879f,-230.469f, --152.344f,17.6792f,-230.469f, --148.438f,18.5224f,-230.469f, --144.531f,18.5026f,-230.469f, --140.625f,19.4852f,-230.469f, --136.719f,20.3222f,-230.469f, --132.813f,20.2809f,-230.469f, --128.906f,21.0408f,-230.469f, --125.0f,20.4729f,-230.469f, --121.094f,20.8829f,-230.469f, --117.188f,21.532f,-230.469f, --113.281f,21.3373f,-230.469f, --109.375f,22.0014f,-230.469f, --105.469f,22.1484f,-230.469f, --101.563f,21.7053f,-230.469f, --97.6563f,20.5255f,-230.469f, --93.75f,19.6269f,-230.469f, --89.8438f,20.0012f,-230.469f, --85.9375f,21.0697f,-230.469f, --82.0313f,21.8192f,-230.469f, --78.125f,22.7525f,-230.469f, --74.2188f,22.3932f,-230.469f, --70.3125f,22.0383f,-230.469f, --66.4063f,22.5989f,-230.469f, --62.5f,23.0428f,-230.469f, --58.5938f,22.4512f,-230.469f, --54.6875f,21.5848f,-230.469f, --50.7813f,20.085f,-230.469f, --46.875f,19.9106f,-230.469f, --42.9688f,20.5256f,-230.469f, --39.0625f,20.2072f,-230.469f, --35.1563f,18.9414f,-230.469f, --31.25f,17.9342f,-230.469f, --27.3438f,15.3472f,-230.469f, --23.4375f,13.2173f,-230.469f, --19.5313f,13.1448f,-230.469f, --15.625f,13.7506f,-230.469f, --11.7188f,12.7439f,-230.469f, --7.8125f,12.5338f,-230.469f, --3.90625f,12.0435f,-230.469f, -0.0f,11.0483f,-230.469f, -3.90625f,10.4619f,-230.469f, --250.0f,15.6879f,-234.375f, --246.094f,17.6667f,-234.375f, --242.188f,18.8427f,-234.375f, --238.281f,19.6527f,-234.375f, --234.375f,19.7979f,-234.375f, --230.469f,19.8698f,-234.375f, --226.563f,19.1736f,-234.375f, --222.656f,16.9995f,-234.375f, --218.75f,15.4573f,-234.375f, --214.844f,15.6294f,-234.375f, --210.938f,15.4315f,-234.375f, --207.031f,15.1239f,-234.375f, --203.125f,14.669f,-234.375f, --199.219f,14.4586f,-234.375f, --195.313f,14.1329f,-234.375f, --191.406f,14.0558f,-234.375f, --187.5f,13.3746f,-234.375f, --183.594f,13.2348f,-234.375f, --179.688f,13.3354f,-234.375f, --175.781f,12.1532f,-234.375f, --171.875f,11.4785f,-234.375f, --167.969f,12.7174f,-234.375f, --164.063f,14.0617f,-234.375f, --160.156f,15.3367f,-234.375f, --156.25f,16.6196f,-234.375f, --152.344f,17.6677f,-234.375f, --148.438f,18.475f,-234.375f, --144.531f,19.8205f,-234.375f, --140.625f,19.6973f,-234.375f, --136.719f,20.5952f,-234.375f, --132.813f,20.3507f,-234.375f, --128.906f,20.8729f,-234.375f, --125.0f,21.9377f,-234.375f, --121.094f,21.8916f,-234.375f, --117.188f,21.9614f,-234.375f, --113.281f,22.1752f,-234.375f, --109.375f,22.2881f,-234.375f, --105.469f,23.1063f,-234.375f, --101.563f,23.4826f,-234.375f, --97.6563f,22.5968f,-234.375f, --93.75f,21.3142f,-234.375f, --89.8438f,19.9609f,-234.375f, --85.9375f,21.4353f,-234.375f, --82.0313f,21.9716f,-234.375f, --78.125f,22.6918f,-234.375f, --74.2188f,21.9561f,-234.375f, --70.3125f,21.3085f,-234.375f, --66.4063f,21.4104f,-234.375f, --62.5f,21.4904f,-234.375f, --58.5938f,20.2467f,-234.375f, --54.6875f,19.1535f,-234.375f, --50.7813f,17.9598f,-234.375f, --46.875f,18.0449f,-234.375f, --42.9688f,18.3612f,-234.375f, --39.0625f,17.5008f,-234.375f, --35.1563f,16.7819f,-234.375f, --31.25f,15.4328f,-234.375f, --27.3438f,13.9747f,-234.375f, --23.4375f,12.1868f,-234.375f, --19.5313f,12.0847f,-234.375f, --15.625f,11.926f,-234.375f, --11.7188f,11.3058f,-234.375f, --7.8125f,11.0187f,-234.375f, --3.90625f,10.1275f,-234.375f, -0.0f,9.73133f,-234.375f, -3.90625f,8.85224f,-234.375f, --250.0f,16.6463f,-238.281f, --246.094f,18.8582f,-238.281f, --242.188f,19.6269f,-238.281f, --238.281f,20.3222f,-238.281f, --234.375f,20.8316f,-238.281f, --230.469f,20.6072f,-238.281f, --226.563f,19.2331f,-238.281f, --222.656f,18.0021f,-238.281f, --218.75f,16.4891f,-238.281f, --214.844f,15.7845f,-238.281f, --210.938f,15.4622f,-238.281f, --207.031f,14.3459f,-238.281f, --203.125f,14.6544f,-238.281f, --199.219f,13.7779f,-238.281f, --195.313f,13.4199f,-238.281f, --191.406f,13.2089f,-238.281f, --187.5f,12.5036f,-238.281f, --183.594f,12.6398f,-238.281f, --179.688f,13.015f,-238.281f, --175.781f,12.659f,-238.281f, --171.875f,13.2801f,-238.281f, --167.969f,13.9547f,-238.281f, --164.063f,14.8792f,-238.281f, --160.156f,16.4144f,-238.281f, --156.25f,17.1062f,-238.281f, --152.344f,17.9028f,-238.281f, --148.438f,19.1823f,-238.281f, --144.531f,20.6903f,-238.281f, --140.625f,19.9053f,-238.281f, --136.719f,20.8795f,-238.281f, --132.813f,21.7034f,-238.281f, --128.906f,21.8373f,-238.281f, --125.0f,22.5134f,-238.281f, --121.094f,22.7918f,-238.281f, --117.188f,23.1126f,-238.281f, --113.281f,23.0308f,-238.281f, --109.375f,23.7212f,-238.281f, --105.469f,24.6127f,-238.281f, --101.563f,24.5942f,-238.281f, --97.6563f,24.0315f,-238.281f, --93.75f,23.2191f,-238.281f, --89.8438f,21.3372f,-238.281f, --85.9375f,20.6395f,-238.281f, --82.0313f,22.2808f,-238.281f, --78.125f,22.2977f,-238.281f, --74.2188f,21.5802f,-238.281f, --70.3125f,20.5131f,-238.281f, --66.4063f,20.0882f,-238.281f, --62.5f,19.9865f,-238.281f, --58.5938f,19.1423f,-238.281f, --54.6875f,16.917f,-238.281f, --50.7813f,16.0256f,-238.281f, --46.875f,15.4122f,-238.281f, --42.9688f,15.0531f,-238.281f, --39.0625f,15.8819f,-238.281f, --35.1563f,14.3724f,-238.281f, --31.25f,12.993f,-238.281f, --27.3438f,11.8948f,-238.281f, --23.4375f,10.1339f,-238.281f, --19.5313f,10.4205f,-238.281f, --15.625f,10.7339f,-238.281f, --11.7188f,9.86852f,-238.281f, --7.8125f,8.89818f,-238.281f, --3.90625f,8.20848f,-238.281f, -0.0f,7.89095f,-238.281f, -3.90625f,7.99527f,-238.281f, --250.0f,16.461f,-242.188f, --246.094f,18.8623f,-242.188f, --242.188f,19.6097f,-242.188f, --238.281f,20.8167f,-242.188f, --234.375f,21.0667f,-242.188f, --230.469f,20.3337f,-242.188f, --226.563f,18.9993f,-242.188f, --222.656f,17.8141f,-242.188f, --218.75f,17.3651f,-242.188f, --214.844f,16.1703f,-242.188f, --210.938f,15.3612f,-242.188f, --207.031f,14.5062f,-242.188f, --203.125f,14.0333f,-242.188f, --199.219f,13.0731f,-242.188f, --195.313f,13.0716f,-242.188f, --191.406f,12.2773f,-242.188f, --187.5f,12.1599f,-242.188f, --183.594f,12.0841f,-242.188f, --179.688f,11.1979f,-242.188f, --175.781f,11.7767f,-242.188f, --171.875f,13.5192f,-242.188f, --167.969f,13.6117f,-242.188f, --164.063f,14.5377f,-242.188f, --160.156f,16.1128f,-242.188f, --156.25f,17.0591f,-242.188f, --152.344f,18.0547f,-242.188f, --148.438f,19.9927f,-242.188f, --144.531f,20.5592f,-242.188f, --140.625f,20.5602f,-242.188f, --136.719f,20.6585f,-242.188f, --132.813f,22.6924f,-242.188f, --128.906f,23.4786f,-242.188f, --125.0f,23.9921f,-242.188f, --121.094f,24.3221f,-242.188f, --117.188f,24.7845f,-242.188f, --113.281f,24.0995f,-242.188f, --109.375f,25.5836f,-242.188f, --105.469f,25.1932f,-242.188f, --101.563f,25.0022f,-242.188f, --97.6563f,24.569f,-242.188f, --93.75f,24.5749f,-242.188f, --89.8438f,22.6678f,-242.188f, --85.9375f,20.6652f,-242.188f, --82.0313f,21.1719f,-242.188f, --78.125f,21.9102f,-242.188f, --74.2188f,20.9512f,-242.188f, --70.3125f,19.1099f,-242.188f, --66.4063f,18.2366f,-242.188f, --62.5f,16.9751f,-242.188f, --58.5938f,16.938f,-242.188f, --54.6875f,16.3692f,-242.188f, --50.7813f,14.5702f,-242.188f, --46.875f,13.5527f,-242.188f, --42.9688f,13.0169f,-242.188f, --39.0625f,11.9599f,-242.188f, --35.1563f,11.4675f,-242.188f, --31.25f,10.1264f,-242.188f, --27.3438f,9.05124f,-242.188f, --23.4375f,8.17722f,-242.188f, --19.5313f,8.42066f,-242.188f, --15.625f,8.13199f,-242.188f, --11.7188f,7.70744f,-242.188f, --7.8125f,7.06448f,-242.188f, --3.90625f,6.2428f,-242.188f, -0.0f,6.35893f,-242.188f, -3.90625f,6.40337f,-242.188f, --250.0f,16.6546f,-246.094f, --246.094f,17.6689f,-246.094f, --242.188f,18.7575f,-246.094f, --238.281f,20.3967f,-246.094f, --234.375f,20.3065f,-246.094f, --230.469f,20.2082f,-246.094f, --226.563f,19.5383f,-246.094f, --222.656f,17.7409f,-246.094f, --218.75f,16.6708f,-246.094f, --214.844f,15.9584f,-246.094f, --210.938f,14.8412f,-246.094f, --207.031f,14.5591f,-246.094f, --203.125f,13.9049f,-246.094f, --199.219f,12.4723f,-246.094f, --195.313f,11.7361f,-246.094f, --191.406f,11.5463f,-246.094f, --187.5f,10.9687f,-246.094f, --183.594f,10.6795f,-246.094f, --179.688f,10.6856f,-246.094f, --175.781f,10.6342f,-246.094f, --171.875f,12.061f,-246.094f, --167.969f,12.3131f,-246.094f, --164.063f,13.8453f,-246.094f, --160.156f,15.3522f,-246.094f, --156.25f,16.575f,-246.094f, --152.344f,17.953f,-246.094f, --148.438f,18.9271f,-246.094f, --144.531f,19.6463f,-246.094f, --140.625f,20.0348f,-246.094f, --136.719f,20.8966f,-246.094f, --132.813f,22.7081f,-246.094f, --128.906f,24.2289f,-246.094f, --125.0f,24.3296f,-246.094f, --121.094f,25.513f,-246.094f, --117.188f,26.0616f,-246.094f, --113.281f,25.9026f,-246.094f, --109.375f,25.3793f,-246.094f, --105.469f,26.0086f,-246.094f, --101.563f,25.9668f,-246.094f, --97.6563f,25.4377f,-246.094f, --93.75f,24.6398f,-246.094f, --89.8438f,22.6277f,-246.094f, --85.9375f,20.9377f,-246.094f, --82.0313f,20.5815f,-246.094f, --78.125f,20.2521f,-246.094f, --74.2188f,19.1439f,-246.094f, --70.3125f,17.8492f,-246.094f, --66.4063f,16.6347f,-246.094f, --62.5f,15.9154f,-246.094f, --58.5938f,14.2098f,-246.094f, --54.6875f,13.5957f,-246.094f, --50.7813f,12.5676f,-246.094f, --46.875f,11.2422f,-246.094f, --42.9688f,10.426f,-246.094f, --39.0625f,10.1665f,-246.094f, --35.1563f,9.19605f,-246.094f, --31.25f,7.36042f,-246.094f, --27.3438f,5.74959f,-246.094f, --23.4375f,5.41512f,-246.094f, --19.5313f,6.03312f,-246.094f, --15.625f,5.93285f,-246.094f, --11.7188f,5.3331f,-246.094f, --7.8125f,5.48059f,-246.094f, --3.90625f,4.92566f,-246.094f, -0.0f,5.05645f,-246.094f, -3.90625f,6.09425f,-246.094f, --250.0f,17.2418f,-250.0f, --246.094f,17.9679f,-250.0f, --242.188f,19.359f,-250.0f, --238.281f,19.3277f,-250.0f, --234.375f,20.1575f,-250.0f, --230.469f,19.8999f,-250.0f, --226.563f,18.9681f,-250.0f, --222.656f,17.7696f,-250.0f, --218.75f,15.6199f,-250.0f, --214.844f,14.6555f,-250.0f, --210.938f,13.0514f,-250.0f, --207.031f,13.6029f,-250.0f, --203.125f,13.1455f,-250.0f, --199.219f,12.0056f,-250.0f, --195.313f,11.1773f,-250.0f, --191.406f,10.7263f,-250.0f, --187.5f,10.2543f,-250.0f, --183.594f,9.76389f,-250.0f, --179.688f,9.00623f,-250.0f, --175.781f,9.47424f,-250.0f, --171.875f,10.8011f,-250.0f, --167.969f,12.4395f,-250.0f, --164.063f,13.7736f,-250.0f, --160.156f,14.0938f,-250.0f, --156.25f,15.8447f,-250.0f, --152.344f,17.1975f,-250.0f, --148.438f,17.963f,-250.0f, --144.531f,19.3662f,-250.0f, --140.625f,20.309f,-250.0f, --136.719f,21.9063f,-250.0f, --132.813f,22.8363f,-250.0f, --128.906f,24.0073f,-250.0f, --125.0f,25.2989f,-250.0f, --121.094f,26.2944f,-250.0f, --117.188f,27.4482f,-250.0f, --113.281f,27.4823f,-250.0f, --109.375f,27.2835f,-250.0f, --105.469f,27.4754f,-250.0f, --101.563f,27.7731f,-250.0f, --97.6563f,26.6981f,-250.0f, --93.75f,24.4699f,-250.0f, --89.8438f,22.81f,-250.0f, --85.9375f,21.6739f,-250.0f, --82.0313f,19.8713f,-250.0f, --78.125f,18.5848f,-250.0f, --74.2188f,17.7134f,-250.0f, --70.3125f,15.5276f,-250.0f, --66.4063f,14.6805f,-250.0f, --62.5f,14.0332f,-250.0f, --58.5938f,12.1429f,-250.0f, --54.6875f,10.3027f,-250.0f, --50.7813f,9.68001f,-250.0f, --46.875f,8.12561f,-250.0f, --42.9688f,8.26581f,-250.0f, --39.0625f,7.98056f,-250.0f, --35.1563f,7.43215f,-250.0f, --31.25f,6.33038f,-250.0f, --27.3438f,4.62549f,-250.0f, --23.4375f,3.83616f,-250.0f, --19.5313f,4.24597f,-250.0f, --15.625f,3.79997f,-250.0f, --11.7188f,3.74461f,-250.0f, --7.8125f,3.79853f,-250.0f, --3.90625f,3.95418f,-250.0f, -0.0f,5.70623f,-250.0f, -3.90625f,6.31953f,-250.0f, -}; - -btScalar Landscape08Nml[] = { --0.193879f,0.980285f,-0.0381128f, --0.101407f,0.994799f,-0.00961843f, --0.17812f,0.983422f,0.0339701f, --0.107869f,0.990758f,0.0822321f, --0.150224f,0.986838f,0.0598614f, --0.176421f,0.983338f,0.0438458f, -0.00771709f,0.999873f,0.0139132f, --0.0458501f,0.998747f,-0.0200731f, -0.170866f,0.984802f,-0.0311488f, -0.198428f,0.979783f,-0.0255296f, -0.223966f,0.969797f,0.0966125f, -0.319719f,0.946459f,0.0446654f, -0.155788f,0.942148f,0.296794f, -0.226142f,0.945324f,0.234996f, -0.0234229f,0.954977f,0.295752f, --0.0213542f,0.981077f,0.192434f, --0.0320299f,0.976907f,0.211248f, --0.0305686f,0.97015f,0.240572f, --0.00290395f,0.990031f,0.14082f, --0.0740282f,0.98339f,0.165723f, -0.0359831f,0.998663f,0.0371117f, --0.048977f,0.998654f,0.0171003f, -0.119085f,0.992879f,0.00312204f, -0.163687f,0.985928f,0.0339365f, -0.233927f,0.967265f,0.0983717f, -0.258555f,0.954734f,0.147076f, -0.185228f,0.98177f,0.0426319f, -0.171781f,0.975163f,0.139813f, -0.312497f,0.949826f,0.0132586f, -0.315278f,0.937034f,0.150223f, -0.455936f,0.889912f,-0.0133666f, -0.444363f,0.88993f,0.102789f, -0.477095f,0.878821f,-0.00729384f, -0.442265f,0.892911f,0.0843273f, -0.441901f,0.89445f,-0.0684218f, -0.356563f,0.929766f,-0.091634f, -0.46452f,0.88048f,-0.0947459f, -0.399286f,0.883106f,-0.246362f, -0.430625f,0.899506f,-0.073831f, -0.418125f,0.862027f,-0.286498f, -0.390492f,0.919986f,-0.0337736f, -0.451928f,0.884249f,-0.117748f, -0.389473f,0.920638f,-0.0271218f, -0.401911f,0.911214f,-0.0903147f, -0.411594f,0.910246f,-0.0451926f, -0.385985f,0.916603f,-0.104187f, -0.406515f,0.904587f,-0.128329f, -0.375686f,0.920382f,-0.108425f, -0.421893f,0.886378f,-0.190632f, -0.362475f,0.891842f,-0.270609f, -0.382406f,0.917607f,-0.108459f, -0.380095f,0.864773f,-0.32817f, -0.206545f,0.977978f,-0.0299668f, -0.319336f,0.938074f,-0.134321f, --0.0276167f,0.998803f,0.0403598f, -0.0724517f,0.997355f,-0.00577643f, --0.170399f,0.974366f,0.146884f, --0.0444923f,0.976538f,0.210699f, --0.123713f,0.961736f,0.244457f, --0.0585476f,0.950932f,0.303809f, --0.0436638f,0.948824f,0.312774f, --0.0108452f,0.950133f,0.311655f, --0.0562151f,0.924389f,0.377285f, --0.024656f,0.918307f,0.3951f, --0.11936f,0.930674f,0.345831f, --0.21058f,0.936144f,0.281584f, --0.166672f,0.952976f,0.253095f, --0.262868f,0.958623f,0.109278f, --0.138859f,0.97532f,0.171667f, --0.166823f,0.980233f,0.106364f, --0.016911f,0.994026f,0.107828f, -0.014088f,0.986713f,0.161858f, --0.0269312f,0.989998f,0.138489f, --0.0681193f,0.995186f,0.0704648f, --0.241507f,0.962694f,0.122045f, --0.306148f,0.951983f,0.00131283f, --0.400562f,0.916076f,-0.0188573f, --0.46755f,0.872686f,-0.140772f, --0.451983f,0.886731f,-0.0970551f, --0.445163f,0.885181f,-0.135217f, --0.440559f,0.893764f,-0.0842181f, --0.44058f,0.883958f,-0.156548f, --0.530573f,0.842324f,-0.094771f, --0.559377f,0.815929f,-0.14614f, --0.675146f,0.724837f,-0.137074f, --0.671227f,0.729467f,-0.131655f, --0.627673f,0.767191f,-0.132076f, --0.630683f,0.736819f,-0.243592f, --0.548071f,0.819689f,-0.166518f, --0.526895f,0.799727f,-0.287781f, --0.521779f,0.83885f,-0.155167f, --0.501504f,0.822365f,-0.268719f, --0.465479f,0.867433f,-0.175756f, --0.453816f,0.862676f,-0.223251f, --0.458424f,0.854844f,-0.243083f, --0.470698f,0.860374f,-0.195446f, --0.485669f,0.830839f,-0.27172f, --0.494445f,0.85319f,-0.166102f, --0.418394f,0.865747f,-0.274642f, --0.405345f,0.892443f,-0.198093f, --0.287108f,0.926134f,-0.244631f, --0.325256f,0.923685f,-0.202519f, --0.192384f,0.91848f,-0.345518f, --0.208186f,0.935081f,-0.28685f, -0.0681073f,0.948251f,-0.310131f, -0.077158f,0.955715f,-0.283998f, -0.102278f,0.947499f,-0.302962f, -0.02043f,0.921087f,-0.388821f, -0.0627177f,0.929646f,-0.363077f, -0.0629047f,0.918578f,-0.390202f, --0.00415691f,0.947597f,-0.31944f, --0.00512929f,0.899538f,-0.436812f, --0.271944f,0.935195f,-0.226842f, --0.177509f,0.92231f,-0.343271f, --0.413186f,0.904845f,-0.102632f, --0.338265f,0.931446f,-0.13411f, --0.418276f,0.90315f,-0.0967731f, --0.404177f,0.914278f,-0.0271442f, --0.400569f,0.902696f,-0.157112f, --0.429625f,0.894308f,-0.125039f, --0.29004f,0.948484f,-0.127491f, --0.188203f,0.980777f,0.0515283f, --0.0585039f,0.997556f,-0.0381961f, --0.133431f,0.99094f,0.0152943f, --0.143343f,0.971126f,-0.1907f, --0.24516f,0.938627f,-0.242644f, --0.188833f,0.958258f,-0.214673f, --0.174705f,0.963776f,-0.201528f, --0.196517f,0.95296f,-0.230756f, --0.128653f,0.987396f,-0.0921772f, --0.120365f,0.975049f,-0.186527f, -0.0117596f,0.998991f,0.0433545f, --0.146882f,0.98666f,-0.0701983f, --0.218442f,0.971087f,-0.0962923f, --0.179096f,0.983284f,-0.0328244f, -0.0658277f,0.997324f,0.0318063f, -0.120963f,0.992647f,0.00454206f, -0.0263542f,0.988052f,0.151849f, -0.0179305f,0.957276f,0.288619f, -0.0987151f,0.955923f,0.276526f, -0.113577f,0.970939f,0.210662f, -0.111989f,0.989066f,0.0959572f, -0.0937332f,0.995324f,-0.0233266f, -0.0889156f,0.995493f,-0.0329669f, -0.214527f,0.976717f,-0.0013568f, -0.281036f,0.957864f,-0.0592866f, -0.349427f,0.927689f,-0.131507f, -0.460507f,0.876585f,-0.139754f, -0.465208f,0.877856f,-0.1138f, -0.432422f,0.897621f,-0.0853653f, -0.392928f,0.918987f,-0.032723f, -0.389134f,0.920603f,0.0326418f, -0.40247f,0.914003f,0.0511488f, -0.41651f,0.90858f,0.031652f, -0.468908f,0.883168f,-0.0118055f, -0.497957f,0.862594f,-0.0892785f, -0.342146f,0.929254f,-0.139366f, -0.262957f,0.964807f,-0.00115352f, -0.156573f,0.98302f,0.095691f, --0.0479214f,0.988417f,0.143995f, --0.198695f,0.970386f,0.13737f, --0.222539f,0.963461f,0.14906f, --0.145574f,0.943362f,0.298121f, --0.065459f,0.922659f,0.380021f, --0.0644219f,0.950539f,0.303852f, --0.126762f,0.967843f,0.217283f, --0.017815f,0.980142f,0.197496f, -0.0660407f,0.994277f,0.0839804f, --0.101583f,0.994471f,0.0266049f, --0.224345f,0.969139f,0.102176f, --0.280297f,0.958092f,0.0591033f, --0.402555f,0.91416f,-0.047541f, --0.458467f,0.883974f,-0.0916445f, --0.50134f,0.862765f,-0.0655406f, --0.644808f,0.754744f,-0.12077f, --0.636358f,0.756299f,-0.151855f, --0.556238f,0.818404f,-0.144268f, --0.504016f,0.849904f,-0.153725f, --0.404172f,0.887071f,-0.223046f, --0.360363f,0.894242f,-0.265463f, --0.432057f,0.840836f,-0.326069f, --0.4393f,0.818603f,-0.370006f, --0.249988f,0.890718f,-0.379642f, --0.114697f,0.874572f,-0.471135f, --0.0301956f,0.870113f,-0.491927f, -0.0871874f,0.907337f,-0.411263f, -0.0509325f,0.923392f,-0.380464f, --0.106299f,0.953821f,-0.280938f, --0.389809f,0.901657f,-0.187255f, --0.420279f,0.904001f,-0.0784108f, --0.360569f,0.922439f,-0.138186f, --0.332116f,0.91853f,-0.214478f, --0.305854f,0.899541f,-0.311896f, --0.11957f,0.95083f,-0.285701f, --0.0843961f,0.977455f,-0.193542f, --0.186555f,0.968589f,-0.164414f, --0.1142f,0.975963f,-0.185618f, --0.138309f,0.943055f,-0.30252f, --0.101226f,0.981339f,-0.163482f, --0.184633f,0.97099f,-0.151951f, --0.239394f,0.95355f,-0.182845f, --0.0575173f,0.989733f,-0.130847f, -0.0688205f,0.993792f,0.0874178f, --0.0714424f,0.990397f,0.118361f, --0.0225247f,0.994972f,0.0975878f, -0.167362f,0.976776f,0.133786f, -0.156506f,0.98511f,0.0711603f, -0.198564f,0.979194f,0.0418473f, -0.173408f,0.984455f,-0.0278778f, -0.108869f,0.989375f,-0.0963545f, -0.224679f,0.96015f,-0.166226f, -0.339104f,0.91731f,-0.208688f, -0.367935f,0.88797f,-0.275922f, -0.418707f,0.869398f,-0.262357f, -0.420889f,0.892687f,-0.161129f, -0.397172f,0.910077f,-0.118378f, -0.374326f,0.920598f,-0.11126f, -0.397932f,0.911721f,-0.102056f, -0.386888f,0.911258f,-0.141166f, -0.41482f,0.902273f,-0.117593f, -0.501715f,0.859192f,-0.100356f, -0.491949f,0.863362f,-0.112214f, -0.357466f,0.931719f,-0.0641779f, -0.171333f,0.982821f,-0.068616f, -0.100623f,0.994346f,0.0339287f, --0.0698557f,0.996834f,0.0379692f, --0.194026f,0.980994f,0.00220452f, --0.288205f,0.957419f,0.0169548f, --0.304635f,0.947239f,0.0996808f, --0.10216f,0.973655f,0.20386f, -0.100532f,0.974742f,0.199427f, --0.0238908f,0.99964f,0.0121747f, --0.00850096f,0.997624f,-0.0683673f, -0.116859f,0.992157f,-0.044359f, --0.0433286f,0.998946f,-0.0151181f, --0.258294f,0.961617f,-0.0926162f, --0.256378f,0.96262f,-0.0873673f, --0.327211f,0.940376f,-0.0928767f, --0.431734f,0.888327f,-0.15646f, --0.514253f,0.844258f,-0.150905f, --0.599748f,0.789083f,-0.132858f, --0.620824f,0.749219f,-0.230756f, --0.533018f,0.803035f,-0.266508f, --0.441513f,0.840682f,-0.313561f, --0.38701f,0.854241f,-0.347124f, --0.380219f,0.879441f,-0.286385f, --0.39628f,0.874175f,-0.280679f, --0.390488f,0.846052f,-0.362926f, --0.205032f,0.876667f,-0.435221f, --0.00372872f,0.883142f,-0.46909f, --0.0083869f,0.837348f,-0.546606f, --0.00127167f,0.831923f,-0.55489f, --0.11424f,0.875282f,-0.469926f, --0.256213f,0.933918f,-0.249305f, --0.393049f,0.915109f,-0.0899313f, --0.484342f,0.863396f,-0.141282f, --0.32612f,0.940905f,-0.0913441f, --0.240051f,0.956808f,-0.163992f, --0.189326f,0.934609f,-0.301099f, --0.228613f,0.900757f,-0.369288f, --0.206601f,0.953154f,-0.220936f, --0.220523f,0.958575f,-0.180285f, --0.0691943f,0.98249f,-0.172992f, -0.0652464f,0.984331f,-0.163816f, --0.308082f,0.909128f,-0.280306f, --0.234588f,0.948864f,-0.211249f, --0.164432f,0.95809f,-0.234578f, --0.206026f,0.945244f,-0.253116f, --0.143287f,0.989535f,-0.0170174f, -0.0124441f,0.996035f,0.0880878f, -0.00356068f,0.999352f,-0.0358152f, -0.110457f,0.993318f,-0.0334531f, -0.202646f,0.978802f,0.0296789f, -0.245502f,0.969355f,0.00893075f, -0.235742f,0.966989f,-0.096741f, -0.211469f,0.957228f,-0.197474f, -0.297424f,0.906479f,-0.299724f, -0.384843f,0.8614f,-0.331489f, -0.405425f,0.833969f,-0.374335f, -0.330388f,0.8594f,-0.390224f, -0.318232f,0.891429f,-0.32262f, -0.388106f,0.870631f,-0.302284f, -0.354731f,0.863719f,-0.357989f, -0.344798f,0.878386f,-0.330988f, -0.405293f,0.884611f,-0.230654f, -0.388923f,0.889959f,-0.23814f, -0.464087f,0.861962f,-0.20407f, -0.454884f,0.878774f,-0.144348f, -0.334448f,0.940492f,-0.0601651f, -0.155367f,0.984248f,-0.0843604f, -0.0216917f,0.991768f,-0.126198f, --0.0136477f,0.995915f,-0.089255f, --0.167328f,0.979282f,-0.114052f, --0.307453f,0.946588f,-0.0971837f, --0.335506f,0.9366f,-0.101072f, --0.175739f,0.978185f,-0.110768f, -0.119064f,0.992411f,-0.0307238f, -0.11077f,0.993829f,0.00590121f, -0.0501349f,0.998052f,-0.0371321f, -0.0267572f,0.997581f,-0.0641572f, --0.0614311f,0.997945f,0.0181992f, --0.171984f,0.984492f,-0.0345973f, --0.25243f,0.961435f,-0.109187f, --0.338599f,0.935923f,-0.0969507f, --0.406007f,0.913202f,-0.0349361f, --0.506218f,0.860674f,-0.0546185f, --0.568342f,0.8123f,-0.130983f, --0.570141f,0.791669f,-0.219544f, --0.495272f,0.816181f,-0.297581f, --0.441753f,0.829099f,-0.342707f, --0.433015f,0.854206f,-0.287802f, --0.452692f,0.8617f,-0.229223f, --0.349843f,0.914647f,-0.202562f, --0.26556f,0.912134f,-0.312233f, --0.238012f,0.870367f,-0.431058f, -0.0104117f,0.943359f,-0.331612f, -0.0744935f,0.949145f,-0.305899f, --0.0305186f,0.956187f,-0.291161f, --0.253914f,0.939488f,-0.229978f, --0.449831f,0.878563f,-0.160557f, --0.46937f,0.880955f,-0.0600792f, --0.456075f,0.88917f,-0.0370459f, --0.35963f,0.932902f,-0.0189682f, --0.136797f,0.989932f,0.0363352f, --0.0613131f,0.996495f,-0.0569106f, --0.21207f,0.964351f,-0.158282f, --0.303853f,0.931291f,-0.200924f, --0.14101f,0.957182f,-0.252823f, --0.0888984f,0.919027f,-0.384041f, -0.0067746f,0.936029f,-0.351857f, --0.277531f,0.936633f,-0.213766f, --0.206375f,0.947006f,-0.246148f, --0.159145f,0.94264f,-0.293433f, --0.254895f,0.932893f,-0.254437f, --0.289527f,0.928279f,-0.233391f, --0.0765713f,0.988951f,-0.126934f, -0.118605f,0.992812f,0.0160497f, -0.122094f,0.985714f,-0.116021f, -0.123131f,0.980876f,-0.150734f, -0.257926f,0.962137f,-0.0881221f, -0.397575f,0.90803f,-0.131971f, -0.301628f,0.898949f,-0.317666f, -0.360055f,0.863992f,-0.351962f, -0.391486f,0.830925f,-0.39535f, -0.399022f,0.829333f,-0.391136f, -0.323505f,0.871183f,-0.369302f, -0.290418f,0.885393f,-0.362955f, -0.422788f,0.860776f,-0.283398f, -0.400499f,0.876008f,-0.26872f, -0.272367f,0.912425f,-0.305444f, -0.289824f,0.919053f,-0.267101f, -0.375469f,0.907173f,-0.189898f, -0.450189f,0.881784f,-0.140667f, -0.386895f,0.914552f,-0.117932f, -0.236065f,0.970562f,-0.0477698f, -0.25497f,0.966484f,0.0299776f, -0.147152f,0.978905f,-0.141747f, --0.0638684f,0.954892f,-0.290005f, --0.198781f,0.952653f,-0.230082f, --0.310279f,0.934977f,-0.171888f, --0.315284f,0.933842f,-0.168923f, --0.14676f,0.971582f,-0.185715f, --0.0201641f,0.976785f,-0.213271f, -0.0408109f,0.997823f,-0.0518006f, --0.000100141f,1.0f,-0.000656924f, -0.0713875f,0.992775f,0.096444f, --0.0699693f,0.997522f,-0.0073179f, --0.120441f,0.992484f,-0.0216487f, --0.200799f,0.979135f,-0.0312183f, --0.379156f,0.923729f,-0.0544518f, --0.468756f,0.883079f,0.0209709f, --0.451556f,0.890079f,0.0621062f, --0.476504f,0.87674f,-0.0653536f, --0.492274f,0.840855f,-0.22501f, --0.481358f,0.828756f,-0.285409f, --0.474733f,0.852404f,-0.219173f, --0.502016f,0.852123f,-0.147874f, --0.474734f,0.870513f,-0.12975f, --0.344408f,0.92173f,-0.178317f, --0.150823f,0.963991f,-0.21903f, --0.180013f,0.935609f,-0.303696f, --0.154788f,0.929555f,-0.334617f, -0.0226749f,0.973389f,-0.228036f, --0.128469f,0.975007f,-0.181264f, --0.302747f,0.952293f,-0.0385077f, --0.427741f,0.902872f,-0.0431169f, --0.47673f,0.871329f,-0.116249f, --0.489254f,0.866227f,-0.101399f, --0.407231f,0.911582f,-0.0564075f, --0.202058f,0.978968f,-0.0281862f, --0.00674228f,0.999486f,0.0313481f, --0.103136f,0.994637f,-0.00773474f, --0.196734f,0.967877f,-0.156554f, -0.0323675f,0.951182f,-0.306928f, -0.00132526f,0.886111f,-0.463472f, --0.0819618f,0.88666f,-0.4551f, --0.207835f,0.973361f,-0.0968142f, --0.157163f,0.972283f,-0.173105f, --0.187284f,0.955049f,-0.229797f, --0.285445f,0.950862f,-0.119931f, --0.25293f,0.964263f,-0.078892f, --0.219599f,0.957265f,-0.188204f, --0.0108412f,0.995374f,-0.0954668f, -0.265678f,0.963807f,-0.0221529f, -0.203794f,0.959343f,-0.195266f, -0.214345f,0.928921f,-0.301932f, -0.439386f,0.868442f,-0.22967f, -0.401404f,0.868685f,-0.290278f, -0.386804f,0.861005f,-0.330232f, -0.428054f,0.836263f,-0.342686f, -0.371108f,0.864198f,-0.339765f, -0.321515f,0.897421f,-0.302098f, -0.213518f,0.927633f,-0.306443f, -0.325579f,0.933219f,-0.151988f, -0.403183f,0.912352f,-0.0711129f, -0.337076f,0.932606f,-0.128942f, -0.295377f,0.932293f,-0.208765f, -0.330751f,0.922115f,-0.200767f, -0.392168f,0.906602f,-0.155808f, -0.373592f,0.925323f,-0.0648487f, -0.191498f,0.98018f,-0.0507507f, -0.210624f,0.977447f,-0.015309f, -0.322948f,0.945895f,0.0314047f, -0.111956f,0.981203f,-0.157186f, --0.247376f,0.91284f,-0.32485f, --0.344293f,0.903462f,-0.255381f, --0.317143f,0.916625f,-0.243348f, --0.146502f,0.958945f,-0.242819f, --0.0529375f,0.980235f,-0.19062f, --0.0439655f,0.993569f,-0.104344f, --0.0681441f,0.993007f,-0.0964036f, -0.0333119f,0.999062f,-0.0276811f, -0.0418264f,0.997289f,-0.0605344f, --0.133447f,0.982771f,-0.127878f, --0.204776f,0.9734f,-0.102754f, --0.405337f,0.909688f,-0.0903804f, --0.513852f,0.857872f,0.00340788f, --0.448907f,0.892038f,0.0524446f, --0.345596f,0.938383f,0.000245611f, --0.371875f,0.917654f,-0.14007f, --0.507047f,0.834221f,-0.216744f, --0.563482f,0.814021f,-0.140919f, --0.549501f,0.831415f,-0.0824446f, --0.452205f,0.89061f,-0.0482179f, --0.283377f,0.952701f,-0.109812f, --0.141817f,0.97445f,-0.174169f, --0.1066f,0.981505f,-0.159008f, --0.128743f,0.958435f,-0.254611f, -0.00656601f,0.946015f,-0.324056f, --0.2018f,0.913066f,-0.354384f, --0.37997f,0.904414f,-0.19406f, --0.423353f,0.890783f,-0.165163f, --0.446411f,0.883929f,-0.139235f, --0.512365f,0.844229f,-0.157352f, --0.38243f,0.91272f,-0.143839f, --0.20154f,0.953013f,-0.226157f, --0.104673f,0.977037f,-0.185586f, --0.0458745f,0.998873f,-0.0121567f, --0.0345945f,0.993617f,-0.107371f, -0.172752f,0.948616f,-0.265111f, -0.0733608f,0.946968f,-0.312842f, --0.16546f,0.93251f,-0.321012f, --0.129843f,0.991294f,-0.0218587f, --0.0514732f,0.996939f,-0.0588533f, --0.139666f,0.979954f,-0.142066f, --0.409538f,0.893138f,-0.185964f, --0.25948f,0.963277f,-0.0690542f, --0.106228f,0.993322f,-0.0450175f, --0.047863f,0.993002f,-0.107966f, -0.238746f,0.962198f,-0.131057f, -0.395076f,0.900486f,-0.181771f, -0.285693f,0.874669f,-0.391577f, -0.358513f,0.848133f,-0.39005f, -0.400938f,0.884343f,-0.239137f, -0.415724f,0.899223f,-0.136277f, -0.438653f,0.894164f,-0.0897495f, -0.361082f,0.930821f,-0.0565009f, -0.321158f,0.946416f,-0.0339725f, -0.242073f,0.961641f,-0.129024f, -0.199607f,0.93926f,-0.279192f, -0.404284f,0.887623f,-0.220636f, -0.424881f,0.860893f,-0.279892f, -0.291182f,0.870529f,-0.396727f, -0.302468f,0.897545f,-0.320822f, -0.33835f,0.898885f,-0.278433f, -0.289098f,0.929341f,-0.229667f, -0.170367f,0.971163f,-0.166783f, -0.129237f,0.986609f,-0.0995005f, -0.305057f,0.951694f,0.0349234f, -0.306439f,0.951736f,-0.0171507f, --0.0808802f,0.976235f,-0.201056f, --0.37625f,0.871862f,-0.313516f, --0.307717f,0.906797f,-0.28815f, --0.221648f,0.946026f,-0.236446f, --0.153972f,0.983161f,-0.0984244f, --0.108206f,0.992418f,-0.0582996f, --0.0581427f,0.997361f,-0.0434687f, -0.00296039f,0.999365f,-0.0355116f, -0.0891034f,0.995894f,-0.0160169f, --0.110645f,0.991801f,-0.0639364f, --0.218461f,0.975223f,-0.0348525f, --0.395365f,0.918398f,-0.0152307f, --0.576836f,0.816159f,-0.0338453f, --0.444941f,0.895556f,-0.00249309f, --0.286239f,0.957764f,-0.0274641f, --0.294715f,0.953259f,-0.0666355f, --0.477956f,0.87064f,-0.116377f, --0.574643f,0.800737f,-0.169131f, --0.54804f,0.808388f,-0.214852f, --0.442187f,0.863382f,-0.242986f, --0.246722f,0.934143f,-0.257887f, --0.157124f,0.964153f,-0.213827f, --0.112706f,0.987993f,-0.10568f, --0.0332674f,0.993709f,-0.106936f, -0.112688f,0.981964f,-0.151814f, --0.167f,0.962022f,-0.215928f, --0.466198f,0.854366f,-0.229606f, --0.414399f,0.885329f,-0.210869f, --0.461383f,0.855213f,-0.236084f, --0.488245f,0.847976f,-0.206287f, --0.351309f,0.900136f,-0.257559f, --0.14601f,0.942734f,-0.29989f, --0.222931f,0.937875f,-0.265879f, --0.195469f,0.970505f,-0.141106f, -0.07525f,0.994532f,-0.0724173f, -0.279727f,0.951429f,-0.128592f, -0.077712f,0.980159f,-0.182341f, --0.20264f,0.956685f,-0.209022f, --0.0986596f,0.987061f,-0.126403f, --0.0477559f,0.985147f,-0.164941f, --0.0669351f,0.983547f,-0.167793f, --0.331517f,0.915331f,-0.228616f, --0.350669f,0.900109f,-0.258526f, --0.179805f,0.971282f,-0.155824f, -0.0156578f,0.989915f,-0.140797f, -0.301547f,0.9226f,-0.240579f, -0.457383f,0.852861f,-0.25185f, -0.449776f,0.84917f,-0.276789f, -0.26609f,0.885033f,-0.381984f, -0.182331f,0.952085f,-0.245538f, -0.260541f,0.964562f,-0.0416928f, -0.408684f,0.907067f,0.101033f, -0.342263f,0.936545f,0.0757594f, -0.318298f,0.944991f,0.0753604f, -0.467785f,0.882822f,0.0424513f, -0.409568f,0.864687f,-0.290809f, -0.379738f,0.82358f,-0.421325f, -0.451329f,0.792384f,-0.410402f, -0.275091f,0.868881f,-0.411547f, -0.161796f,0.92881f,-0.333367f, -0.286521f,0.932696f,-0.219053f, -0.272475f,0.944744f,-0.182252f, -0.119383f,0.965719f,-0.230508f, --0.0212448f,0.971989f,-0.234063f, -0.226311f,0.969491f,-0.094178f, -0.326176f,0.942844f,-0.068215f, -0.104404f,0.994209f,-0.0254499f, --0.295807f,0.921372f,-0.252133f, --0.383855f,0.886842f,-0.257228f, --0.359597f,0.921141f,-0.148961f, --0.240318f,0.969399f,-0.0501282f, --0.0922578f,0.994071f,-0.0575481f, --0.0797027f,0.995693f,-0.047355f, --0.026569f,0.999636f,0.00472767f, -0.105393f,0.994402f,0.00758912f, --0.0968377f,0.99427f,-0.0452707f, --0.304918f,0.952227f,0.0169656f, --0.404524f,0.901318f,0.154875f, --0.513873f,0.850873f,0.109318f, --0.450348f,0.892744f,-0.0139455f, --0.274075f,0.961559f,-0.0169546f, --0.246789f,0.966677f,-0.068048f, --0.421796f,0.89143f,-0.165651f, --0.530762f,0.820949f,-0.210556f, --0.518596f,0.828643f,-0.210734f, --0.419929f,0.882924f,-0.210013f, --0.267086f,0.925885f,-0.26721f, --0.260528f,0.916111f,-0.304739f, --0.212437f,0.941505f,-0.261606f, --0.048105f,0.973033f,-0.225594f, -0.0765563f,0.979806f,-0.184712f, --0.093108f,0.98921f,-0.113109f, --0.45825f,0.862094f,-0.216335f, --0.388948f,0.902314f,-0.185873f, --0.448149f,0.871913f,-0.197307f, --0.488741f,0.854988f,-0.173574f, --0.313337f,0.916762f,-0.247724f, --0.157546f,0.938004f,-0.308753f, --0.267357f,0.911027f,-0.313926f, --0.236818f,0.920159f,-0.311809f, -0.000164176f,0.954985f,-0.296656f, -0.271822f,0.944232f,-0.185848f, -0.151331f,0.970946f,-0.185371f, --0.118147f,0.962507f,-0.244174f, -0.026977f,0.993643f,-0.109301f, -0.00824696f,0.988318f,-0.152184f, --0.049843f,0.98983f,-0.133236f, --0.292853f,0.946012f,-0.138915f, --0.402779f,0.899681f,-0.168355f, --0.216565f,0.962959f,-0.160656f, -0.0811851f,0.971223f,-0.223909f, -0.376654f,0.888442f,-0.262304f, -0.412611f,0.862287f,-0.293621f, -0.420494f,0.885689f,-0.196825f, -0.303261f,0.948914f,-0.0871512f, -0.0927021f,0.987654f,-0.12628f, -0.131263f,0.975894f,-0.174359f, -0.34789f,0.928255f,-0.131586f, -0.388684f,0.916314f,-0.0964015f, -0.334363f,0.935247f,-0.116251f, -0.500896f,0.857152f,-0.119971f, -0.598542f,0.784881f,-0.160341f, -0.47847f,0.803478f,-0.354245f, -0.40143f,0.813052f,-0.421663f, -0.177917f,0.923323f,-0.340324f, -0.0444056f,0.967329f,-0.249605f, -0.182957f,0.975679f,-0.12074f, -0.298547f,0.954355f,0.00877178f, -0.20958f,0.975318f,-0.0695111f, -0.014388f,0.988042f,-0.153512f, -0.159715f,0.970499f,-0.180618f, -0.22067f,0.966546f,-0.130745f, -0.121564f,0.992499f,-0.0129668f, --0.106928f,0.989668f,-0.0955226f, --0.432009f,0.877086f,-0.209972f, --0.412195f,0.894243f,-0.174429f, --0.247992f,0.954923f,-0.163162f, --0.103668f,0.985418f,-0.134925f, --0.118626f,0.990103f,-0.0749928f, --0.0679366f,0.995617f,-0.0642786f, -0.157737f,0.986207f,-0.0501565f, --0.132086f,0.989105f,-0.064997f, --0.385668f,0.914108f,0.125169f, --0.489653f,0.859555f,0.146305f, --0.451033f,0.881762f,0.138074f, --0.379544f,0.923663f,0.0528468f, --0.267976f,0.962936f,0.0307148f, --0.154653f,0.986101f,0.0607174f, --0.285519f,0.958009f,-0.0264139f, --0.517333f,0.83498f,-0.187551f, --0.544673f,0.81339f,-0.204273f, --0.443255f,0.872475f,-0.205697f, --0.212541f,0.959106f,-0.18693f, --0.144834f,0.956217f,-0.254307f, --0.219765f,0.912031f,-0.346271f, --0.054698f,0.959311f,-0.277002f, --0.0226538f,0.964658f,-0.262528f, --0.09277f,0.980401f,-0.173803f, --0.427129f,0.87184f,-0.2397f, --0.458168f,0.877303f,-0.142906f, --0.456008f,0.884075f,-0.102317f, --0.457836f,0.873049f,-0.167843f, --0.276231f,0.922652f,-0.269091f, --0.0986428f,0.965162f,-0.242345f, --0.166497f,0.944239f,-0.284061f, --0.221568f,0.881867f,-0.416194f, --0.047486f,0.902488f,-0.428089f, -0.159799f,0.906084f,-0.391761f, -0.154437f,0.936571f,-0.314616f, --0.0388024f,0.943344f,-0.329539f, -0.0179311f,0.971802f,-0.235116f, --0.0317957f,0.972144f,-0.232219f, --0.108238f,0.982139f,-0.153906f, --0.294778f,0.950488f,-0.098378f, --0.31352f,0.940894f,-0.128155f, --0.158161f,0.944104f,-0.289226f, -0.136392f,0.925587f,-0.353108f, -0.369725f,0.858345f,-0.355736f, -0.408427f,0.863142f,-0.296941f, -0.264495f,0.934318f,-0.238939f, -0.231394f,0.968992f,-0.0866717f, -0.180537f,0.980662f,-0.0755592f, -0.289728f,0.94884f,-0.125539f, -0.338081f,0.901985f,-0.268559f, -0.344111f,0.905129f,-0.249658f, -0.337921f,0.897299f,-0.284014f, -0.46242f,0.831252f,-0.308526f, -0.625979f,0.756355f,-0.18994f, -0.59942f,0.766009f,-0.232218f, -0.396651f,0.850096f,-0.346416f, -0.113051f,0.922761f,-0.368417f, --0.0568672f,0.928859f,-0.366041f, -0.0370994f,0.962262f,-0.269583f, -0.21844f,0.959083f,-0.180121f, -0.248457f,0.958661f,-0.138705f, -0.0562715f,0.995806f,-0.072134f, -0.151796f,0.987439f,-0.0438309f, -0.213126f,0.976907f,0.0151789f, -0.0825188f,0.995896f,-0.0371849f, --0.0293603f,0.995761f,-0.0871655f, --0.339382f,0.929166f,-0.146528f, --0.407976f,0.887929f,-0.212458f, --0.300706f,0.928797f,-0.216592f, --0.171876f,0.971688f,-0.162117f, --0.133134f,0.975354f,-0.175954f, --0.0436112f,0.969589f,-0.240823f, -0.0955252f,0.97277f,-0.211171f, --0.222971f,0.974797f,-0.00733171f, --0.502187f,0.842082f,0.19674f, --0.406382f,0.878535f,0.251057f, --0.403841f,0.907763f,0.113486f, --0.295941f,0.954472f,0.0374491f, --0.309098f,0.948653f,-0.0672074f, --0.212726f,0.977025f,0.0130525f, --0.199979f,0.978912f,0.0417118f, --0.374584f,0.922961f,-0.0884893f, --0.481248f,0.836641f,-0.261597f, --0.419239f,0.839768f,-0.345005f, --0.269419f,0.905569f,-0.327654f, --0.084614f,0.973021f,-0.214643f, --0.193736f,0.935164f,-0.296537f, --0.190273f,0.932167f,-0.307995f, --0.0917672f,0.986648f,-0.134552f, --0.101923f,0.994749f,0.009248f, --0.329353f,0.943234f,-0.0428565f, --0.527408f,0.832391f,-0.170191f, --0.427451f,0.895563f,-0.123505f, --0.337252f,0.917187f,-0.212202f, --0.254472f,0.911026f,-0.324462f, --0.191138f,0.941948f,-0.276043f, --0.0895186f,0.969134f,-0.229708f, --0.115141f,0.935532f,-0.33395f, --0.0316994f,0.925937f,-0.376346f, -0.117945f,0.920189f,-0.373285f, -0.121803f,0.934924f,-0.333287f, --0.0046923f,0.925271f,-0.379279f, -0.0524128f,0.95708f,-0.285046f, --0.0476851f,0.956392f,-0.288167f, --0.185718f,0.956668f,-0.224263f, --0.292875f,0.939689f,-0.176661f, --0.212138f,0.937073f,-0.277295f, -0.00215598f,0.9095f,-0.415698f, -0.155074f,0.855231f,-0.494501f, -0.3372f,0.836708f,-0.431528f, -0.272726f,0.886233f,-0.374449f, -0.193484f,0.944931f,-0.263949f, -0.192169f,0.938969f,-0.285322f, -0.141281f,0.932743f,-0.331708f, -0.278032f,0.931044f,-0.236339f, -0.426985f,0.871432f,-0.241434f, -0.368362f,0.861689f,-0.349f, -0.400587f,0.825418f,-0.397762f, -0.451323f,0.785144f,-0.424095f, -0.523643f,0.765884f,-0.373121f, -0.603289f,0.753586f,-0.261056f, -0.44978f,0.832328f,-0.323928f, -0.156509f,0.915232f,-0.371289f, --0.0704135f,0.915939f,-0.395092f, --0.00319557f,0.926331f,-0.376696f, -0.166676f,0.911893f,-0.37506f, -0.102989f,0.962696f,-0.250219f, --0.0387958f,0.995347f,-0.0881961f, -0.0653507f,0.992864f,-0.0997527f, -0.179449f,0.98367f,-0.0138117f, -0.177828f,0.983985f,0.012264f, -0.0645076f,0.995168f,-0.0740203f, --0.292502f,0.938695f,-0.182468f, --0.400433f,0.889464f,-0.220243f, --0.318802f,0.923541f,-0.213161f, --0.169897f,0.961934f,-0.214052f, --0.0267051f,0.972116f,-0.232975f, --0.00536052f,0.964395f,-0.264412f, --0.100769f,0.988596f,-0.111905f, --0.404303f,0.910751f,0.0840968f, --0.594207f,0.803932f,0.0247338f, --0.396136f,0.914658f,0.0804795f, --0.304433f,0.952514f,0.00620435f, --0.201276f,0.977901f,-0.0565476f, --0.264949f,0.959844f,-0.0922019f, --0.227773f,0.971084f,-0.0715179f, --0.172114f,0.969698f,-0.173387f, --0.26936f,0.945102f,-0.185006f, --0.392685f,0.904465f,-0.166556f, --0.407044f,0.896103f,-0.176958f, --0.40747f,0.889993f,-0.204647f, --0.189782f,0.978511f,-0.0806113f, --0.0480587f,0.996223f,-0.0723184f, --0.217275f,0.958525f,-0.184451f, --0.306094f,0.944116f,-0.122276f, --0.254593f,0.966558f,0.0308049f, --0.20196f,0.972664f,0.114613f, --0.409794f,0.899925f,-0.14901f, --0.415034f,0.857771f,-0.303274f, --0.263165f,0.89665f,-0.356039f, --0.215387f,0.884962f,-0.412857f, --0.225079f,0.887943f,-0.401119f, --0.0773061f,0.916142f,-0.393328f, --0.0308036f,0.905486f,-0.423257f, --0.0371917f,0.883129f,-0.467653f, -0.0716369f,0.893813f,-0.442681f, -0.12997f,0.919319f,-0.371429f, -0.119867f,0.921216f,-0.370126f, -0.0228827f,0.984493f,-0.173923f, --0.0834452f,0.988816f,-0.123614f, --0.247718f,0.964917f,-0.0870125f, --0.254118f,0.961997f,-0.0999321f, --0.0671834f,0.977202f,-0.201403f, -0.157483f,0.940773f,-0.300243f, -0.164503f,0.92764f,-0.335294f, -0.27582f,0.929794f,-0.243733f, -0.209142f,0.946949f,-0.244024f, -0.183638f,0.949161f,-0.255677f, -0.277174f,0.906106f,-0.319605f, -0.178788f,0.896597f,-0.405153f, -0.185529f,0.860132f,-0.475134f, -0.438868f,0.800307f,-0.408538f, -0.441024f,0.788796f,-0.428135f, -0.397261f,0.791714f,-0.464083f, -0.440809f,0.77176f,-0.458338f, -0.455755f,0.768172f,-0.449666f, -0.535299f,0.762932f,-0.362477f, -0.450448f,0.842352f,-0.295872f, -0.136515f,0.937333f,-0.320579f, --0.0637901f,0.937145f,-0.343061f, --0.0112309f,0.935306f,-0.353662f, -0.108413f,0.948157f,-0.298738f, --0.0660356f,0.972239f,-0.224477f, --0.07256f,0.985988f,-0.150208f, -0.0814078f,0.980504f,-0.178842f, -0.133209f,0.989139f,-0.0621265f, -0.112681f,0.993117f,-0.0319677f, -0.144875f,0.987157f,0.0673239f, --0.178705f,0.983714f,-0.0192655f, --0.383305f,0.919432f,-0.0878717f, --0.311703f,0.944518f,-0.103569f, --0.170547f,0.974222f,-0.147663f, --0.0584686f,0.987712f,-0.144938f, --0.130239f,0.988008f,-0.0829397f, --0.30957f,0.949755f,0.0461837f, --0.426068f,0.896859f,0.118784f, --0.505712f,0.862298f,-0.0263905f, --0.384432f,0.913927f,-0.130189f, --0.233817f,0.957708f,-0.167708f, --0.196686f,0.961804f,-0.190386f, --0.272431f,0.94059f,-0.202662f, --0.180772f,0.950727f,-0.251872f, --0.0565853f,0.956064f,-0.287647f, --0.288561f,0.926858f,-0.240141f, --0.491099f,0.856076f,-0.161104f, --0.419638f,0.904096f,-0.0807095f, --0.388583f,0.916169f,-0.0981701f, --0.261262f,0.961028f,-0.0903754f, --0.0632456f,0.997064f,0.0431658f, --0.169715f,0.97859f,0.116442f, --0.344027f,0.938297f,0.0352825f, --0.314669f,0.949192f,0.00417096f, --0.192981f,0.980434f,0.0388389f, --0.184602f,0.98279f,-0.00683269f, --0.246496f,0.934378f,-0.25725f, --0.19921f,0.861846f,-0.466409f, --0.140436f,0.848535f,-0.510163f, --0.20288f,0.807079f,-0.554493f, --0.11519f,0.832336f,-0.542169f, -0.00924053f,0.875455f,-0.483211f, --0.00888073f,0.876341f,-0.48161f, -0.00107193f,0.907613f,-0.419807f, -0.021101f,0.930448f,-0.365817f, -0.0745313f,0.948396f,-0.308205f, --0.200438f,0.964136f,-0.17397f, --0.166231f,0.985214f,-0.0414839f, --0.252324f,0.967639f,-0.00281073f, --0.16447f,0.986195f,-0.0192238f, -0.0101706f,0.983613f,-0.180006f, -0.16229f,0.966979f,-0.196502f, -0.152128f,0.981833f,-0.113406f, -0.194455f,0.973444f,-0.120809f, -0.334057f,0.938492f,-0.0874058f, -0.243016f,0.928299f,-0.281434f, -0.337071f,0.885295f,-0.320369f, -0.298461f,0.876938f,-0.376698f, -0.311828f,0.819683f,-0.480502f, -0.369257f,0.755567f,-0.54108f, -0.401798f,0.784012f,-0.473163f, -0.404891f,0.784738f,-0.469309f, -0.444437f,0.782155f,-0.436702f, -0.466084f,0.794919f,-0.388419f, -0.447341f,0.805216f,-0.389247f, -0.362297f,0.887389f,-0.285098f, -0.179937f,0.962799f,-0.201595f, -0.000795301f,0.958246f,-0.285946f, --0.0439986f,0.938528f,-0.342389f, -0.000314903f,0.959745f,-0.280871f, --0.0200826f,0.975564f,-0.218794f, --0.0669112f,0.936012f,-0.345551f, -0.0051897f,0.948012f,-0.318192f, -0.0134178f,0.970832f,-0.239387f, -0.036317f,0.978504f,-0.203005f, -0.0625457f,0.996542f,-0.0547064f, --0.151505f,0.986626f,0.0601296f, --0.354535f,0.929709f,0.0997293f, --0.323458f,0.940866f,0.100727f, --0.112965f,0.981029f,0.157548f, --0.108156f,0.989168f,0.0992381f, --0.141093f,0.979303f,0.145114f, --0.335564f,0.940028f,0.061184f, --0.404784f,0.910739f,0.081883f, --0.415621f,0.909054f,0.0296628f, --0.326024f,0.941449f,-0.0859172f, --0.204455f,0.961807f,-0.182004f, --0.198427f,0.946732f,-0.253624f, --0.160629f,0.949f,-0.27129f, --0.122223f,0.918206f,-0.376775f, --0.161284f,0.939678f,-0.301651f, --0.374966f,0.911783f,-0.167489f, --0.467696f,0.856498f,-0.218336f, --0.443475f,0.843003f,-0.304427f, --0.385194f,0.898165f,-0.211955f, --0.377418f,0.917998f,-0.121804f, --0.264639f,0.962925f,0.0523651f, --0.211739f,0.961017f,0.177801f, --0.229995f,0.957255f,0.175401f, --0.280377f,0.956102f,0.0851875f, --0.20016f,0.97825f,0.0544282f, --0.10573f,0.994257f,-0.0165441f, -0.0203896f,0.991211f,-0.130708f, --0.0236073f,0.94884f,-0.314873f, --0.0941765f,0.92043f,-0.379394f, --0.167941f,0.897458f,-0.407879f, --0.187085f,0.877031f,-0.442511f, --0.0729267f,0.89358f,-0.44294f, --0.0781669f,0.903365f,-0.421688f, --0.0898224f,0.927661f,-0.362461f, --0.0306254f,0.944826f,-0.326139f, -0.00767666f,0.952077f,-0.305762f, --0.288656f,0.939633f,-0.183761f, --0.235623f,0.952993f,-0.190489f, --0.273085f,0.931861f,-0.238874f, --0.0949222f,0.974332f,-0.204123f, -0.149266f,0.955245f,-0.255397f, -0.0666117f,0.957576f,-0.280376f, -0.127398f,0.979355f,-0.156952f, -0.209457f,0.954497f,-0.21228f, -0.367092f,0.913409f,-0.175864f, -0.415953f,0.865553f,-0.278928f, -0.34245f,0.832959f,-0.434635f, -0.340781f,0.830404f,-0.440793f, -0.395293f,0.802521f,-0.446882f, -0.405952f,0.792834f,-0.454552f, -0.385024f,0.788348f,-0.479858f, -0.365166f,0.783008f,-0.503539f, -0.371074f,0.838688f,-0.39863f, -0.42233f,0.859897f,-0.286732f, -0.440629f,0.882917f,-0.162183f, -0.299827f,0.949298f,-0.0945333f, -0.141695f,0.979344f,-0.144247f, -0.039666f,0.992248f,-0.117771f, -0.021245f,0.997585f,-0.0661304f, --0.0594041f,0.983411f,-0.17139f, -0.0611812f,0.981318f,-0.182404f, -0.0186916f,0.932529f,-0.360611f, --0.0300853f,0.91754f,-0.396504f, --0.00135599f,0.922081f,-0.386995f, --0.0351954f,0.956784f,-0.28866f, --0.108108f,0.976189f,-0.188065f, --0.279221f,0.950183f,-0.13852f, --0.398641f,0.914814f,-0.0648175f, --0.383626f,0.922668f,-0.0389249f, --0.188191f,0.977628f,0.0939533f, --0.083441f,0.973103f,0.21473f, --0.0631642f,0.980575f,0.185698f, --0.269017f,0.963031f,0.0141438f, --0.4376f,0.89917f,-0.000301879f, --0.339736f,0.940513f,0.00384959f, --0.235638f,0.967987f,-0.0864624f, --0.0773761f,0.988655f,-0.128744f, --0.0852549f,0.968269f,-0.234917f, --0.114948f,0.939941f,-0.3214f, --0.156571f,0.928217f,-0.337488f, --0.29563f,0.924155f,-0.241951f, --0.401682f,0.899225f,-0.173337f, --0.351799f,0.915761f,-0.193956f, --0.391021f,0.882077f,-0.262761f, --0.525453f,0.810665f,-0.258305f, --0.504092f,0.859496f,-0.0846014f, --0.362403f,0.931317f,0.0362275f, --0.27912f,0.954258f,0.107159f, --0.207619f,0.961802f,0.178414f, --0.228638f,0.970139f,0.0809669f, --0.12077f,0.992669f,0.00484841f, -0.0304882f,0.99448f,-0.100401f, -0.0674392f,0.979801f,-0.18826f, -0.0351304f,0.9953f,-0.090241f, --0.0704736f,0.995263f,-0.0669708f, --0.129706f,0.981562f,-0.1404f, --0.122442f,0.956888f,-0.263387f, --0.0356665f,0.922731f,-0.38379f, --0.0454106f,0.896226f,-0.441267f, --0.0870705f,0.865568f,-0.493164f, --0.0312927f,0.854755f,-0.518087f, --0.0110302f,0.85359f,-0.520829f, --0.135251f,0.990349f,0.0302781f, --0.120846f,0.991438f,-0.049458f, --0.156404f,0.974115f,-0.163209f, --0.121903f,0.951948f,-0.280952f, -0.0966131f,0.959924f,-0.263082f, -0.0624341f,0.96714f,-0.24646f, -0.0557469f,0.94749f,-0.31489f, -0.245712f,0.928812f,-0.27737f, -0.339947f,0.895451f,-0.28741f, -0.505833f,0.828917f,-0.238808f, -0.492153f,0.815708f,-0.303985f, -0.325713f,0.824266f,-0.463138f, -0.357884f,0.8174f,-0.451416f, -0.423911f,0.828952f,-0.364879f, -0.465983f,0.818349f,-0.3364f, -0.340136f,0.856815f,-0.387524f, -0.250037f,0.902839f,-0.349804f, -0.270063f,0.93551f,-0.227788f, -0.268197f,0.961943f,0.0523086f, -0.314452f,0.921737f,0.226982f, -0.230483f,0.962611f,0.142328f, --0.0337231f,0.996519f,0.0762456f, --0.0478467f,0.987694f,0.1489f, -0.0777224f,0.977564f,0.195776f, -0.137813f,0.987309f,0.0789204f, -0.213773f,0.976881f,-0.00209812f, -0.0678985f,0.982243f,-0.174896f, --0.118448f,0.956882f,-0.26523f, --0.229961f,0.9707f,-0.0697049f, --0.144208f,0.98561f,0.0881926f, --0.198479f,0.979386f,0.0375393f, --0.401292f,0.909987f,-0.104347f, --0.400254f,0.91005f,-0.107726f, --0.346067f,0.932825f,-0.100374f, --0.193125f,0.981161f,0.00517742f, --0.0334943f,0.995589f,0.0876359f, --0.09901f,0.987334f,0.12397f, --0.411919f,0.909058f,-0.0627387f, --0.33988f,0.934279f,-0.107727f, --0.163445f,0.980417f,-0.109859f, --0.094399f,0.976137f,-0.195566f, --0.0281723f,0.98965f,-0.140708f, --0.0765865f,0.985816f,-0.149338f, --0.168645f,0.974838f,-0.145776f, --0.316363f,0.934327f,-0.164156f, --0.429172f,0.879196f,-0.206943f, --0.428946f,0.898522f,-0.0930795f, --0.397223f,0.909843f,0.12f, --0.511164f,0.850782f,0.12199f, --0.553545f,0.831305f,-0.0501975f, --0.425265f,0.901367f,-0.0817687f, --0.377377f,0.925701f,-0.0257517f, --0.226427f,0.969468f,0.0941363f, --0.0709665f,0.993431f,0.0897693f, --0.0343935f,0.997803f,-0.0566276f, -0.136725f,0.981098f,-0.136942f, --0.000388307f,0.974615f,-0.223888f, --0.143125f,0.988947f,-0.0387096f, --0.0654844f,0.993475f,0.0933713f, -0.0107967f,0.999865f,0.0124207f, -0.0463655f,0.990074f,-0.132676f, -0.111072f,0.958636f,-0.262069f, -0.052211f,0.918497f,-0.391967f, -0.014765f,0.869476f,-0.493754f, --0.00446669f,0.826302f,-0.56321f, --0.00312167f,0.829643f,-0.558286f, --0.205328f,0.971118f,-0.121531f, --0.107279f,0.990692f,-0.0837913f, --0.0655817f,0.993795f,-0.089834f, --0.0669083f,0.985851f,-0.15369f, -0.0877486f,0.98832f,-0.124596f, -0.169572f,0.978484f,-0.117533f, -0.160152f,0.950603f,-0.265903f, -0.208233f,0.926f,-0.314903f, -0.349792f,0.904675f,-0.243329f, -0.449891f,0.870303f,-0.200426f, -0.566229f,0.816333f,-0.113956f, -0.48817f,0.833849f,-0.257655f, -0.363235f,0.831342f,-0.420631f, -0.324206f,0.826771f,-0.459718f, -0.3997f,0.840833f,-0.365021f, -0.353025f,0.906211f,-0.232714f, -0.219616f,0.962891f,-0.156874f, -0.0720827f,0.994934f,-0.0700696f, -0.045678f,0.994046f,0.0989266f, -0.213575f,0.964796f,0.153475f, -0.24905f,0.930442f,0.268798f, -0.0777133f,0.945053f,0.317546f, --0.128028f,0.977296f,0.168824f, -0.0217263f,0.951068f,0.308215f, -0.207313f,0.918764f,0.335998f, -0.282654f,0.924456f,0.255906f, -0.201157f,0.96204f,0.184429f, --0.110233f,0.981395f,0.157205f, --0.355659f,0.909169f,0.216606f, --0.21295f,0.947904f,0.236917f, --0.107393f,0.959263f,0.261306f, --0.278087f,0.947596f,0.157257f, --0.393558f,0.918794f,0.0304824f, --0.302068f,0.952957f,-0.0250724f, --0.213276f,0.970666f,-0.110997f, --0.166999f,0.978773f,-0.118807f, --0.142246f,0.989828f,0.00258048f, --0.283745f,0.958854f,0.0093455f, --0.336957f,0.941016f,-0.0308147f, --0.113565f,0.9931f,-0.02925f, --0.0231129f,0.991621f,-0.127093f, --0.107284f,0.981887f,-0.156166f, --0.121783f,0.990389f,-0.0655664f, --0.179469f,0.983757f,0.00373427f, --0.267261f,0.963295f,0.0251965f, --0.419417f,0.907445f,0.0251735f, --0.582729f,0.80835f,0.0836507f, --0.554692f,0.78035f,0.288741f, --0.368624f,0.840437f,0.397218f, --0.336016f,0.929619f,0.151335f, --0.379048f,0.912637f,-0.153022f, --0.410461f,0.89244f,-0.187275f, --0.310698f,0.938768f,-0.148932f, --0.0772428f,0.993562f,-0.0828798f, -0.0559112f,0.996518f,-0.0618564f, -0.218481f,0.971621f,-0.090653f, -0.0070055f,0.988587f,-0.150488f, --0.287385f,0.949521f,-0.125778f, --0.0963797f,0.992515f,-0.0749989f, -0.0940601f,0.994076f,-0.0544632f, -0.147534f,0.985277f,-0.0863886f, -0.20617f,0.964455f,-0.165287f, -0.228919f,0.941159f,-0.248628f, -0.142687f,0.889558f,-0.433967f, -0.0525074f,0.86193f,-0.5043f, --0.0400559f,0.852931f,-0.520485f, --0.12929f,0.965503f,-0.226025f, --0.12119f,0.954637f,-0.271994f, --0.0677494f,0.970158f,-0.232815f, --0.0658176f,0.978188f,-0.197017f, -0.00868199f,0.985201f,-0.171183f, -0.183883f,0.977449f,-0.103828f, -0.283397f,0.948052f,-0.144513f, -0.244002f,0.935244f,-0.256481f, -0.251457f,0.918413f,-0.305429f, -0.421894f,0.885288f,-0.195626f, -0.539016f,0.82675f,-0.161076f, -0.595125f,0.795068f,-0.117014f, -0.542945f,0.81823f,-0.188971f, -0.36087f,0.878337f,-0.313523f, -0.249934f,0.94591f,-0.206849f, -0.203095f,0.978645f,0.0317209f, -0.0808087f,0.992314f,0.0937131f, -0.015528f,0.990219f,0.138653f, -0.01799f,0.994881f,0.09944f, -0.195411f,0.975412f,0.101915f, -0.0694818f,0.977162f,0.200816f, -0.0667035f,0.917371f,0.392404f, --0.00815505f,0.942331f,0.334582f, --0.124548f,0.965608f,0.228228f, -0.172601f,0.943034f,0.284421f, -0.392995f,0.877789f,0.273937f, -0.148864f,0.962548f,0.226586f, --0.160978f,0.90924f,0.383887f, --0.338041f,0.865118f,0.370538f, --0.158685f,0.913484f,0.374654f, --0.085827f,0.934088f,0.346573f, --0.160284f,0.956319f,0.244467f, --0.286424f,0.955431f,0.0715057f, --0.239888f,0.970684f,0.0150701f, --0.160609f,0.986985f,0.00807186f, --0.109896f,0.993313f,-0.0353894f, --0.197211f,0.969041f,-0.148551f, --0.329877f,0.939761f,-0.0896172f, --0.308832f,0.948199f,-0.0744408f, --0.098416f,0.980296f,-0.171271f, -0.0274733f,0.990192f,-0.136989f, --0.0841565f,0.99088f,-0.105235f, --0.256459f,0.960709f,-0.106143f, --0.249667f,0.95978f,0.128406f, --0.305999f,0.931391f,0.197168f, --0.484241f,0.852569f,0.196565f, --0.610379f,0.753144f,0.245383f, --0.585787f,0.783089f,0.208867f, --0.367515f,0.91758f,0.151588f, --0.0411995f,0.989239f,0.140389f, --0.109078f,0.987353f,-0.115051f, --0.380949f,0.866858f,-0.321615f, --0.342318f,0.88779f,-0.307647f, --0.12792f,0.955198f,-0.266896f, -0.0278952f,0.967981f,-0.249469f, -0.188442f,0.9544f,-0.231539f, -0.052008f,0.978364f,-0.200246f, --0.225418f,0.931417f,-0.285742f, --0.134566f,0.926089f,-0.352493f, -0.0345745f,0.959769f,-0.278653f, -0.174695f,0.953806f,-0.24441f, -0.227273f,0.930386f,-0.287627f, -0.325716f,0.918321f,-0.224934f, -0.329407f,0.888239f,-0.32019f, -0.0905336f,0.875389f,-0.474867f, --0.0331275f,0.86706f,-0.497102f, -0.0288126f,0.978255f,-0.205394f, --0.0838329f,0.954569f,-0.285956f, --0.140323f,0.954698f,-0.262415f, --0.112432f,0.972197f,-0.205408f, -0.0092799f,0.981035f,-0.193608f, -0.142017f,0.962963f,-0.229203f, -0.310781f,0.933484f,-0.17895f, -0.359578f,0.919553f,-0.158514f, -0.334745f,0.907674f,-0.253129f, -0.345814f,0.873436f,-0.342815f, -0.500723f,0.821828f,-0.271799f, -0.538977f,0.812424f,-0.22242f, -0.523422f,0.839245f,-0.147303f, -0.340441f,0.940266f,0.000412888f, -0.0152874f,0.997305f,0.0717554f, -0.0533145f,0.966764f,0.250049f, -0.112464f,0.954457f,0.276338f, -0.109039f,0.955163f,0.275271f, -0.0445431f,0.979533f,0.196291f, -0.165433f,0.962373f,0.21557f, --0.0715535f,0.977821f,0.196841f, --0.0891149f,0.939351f,0.331178f, -0.117094f,0.910023f,0.397676f, -0.030807f,0.968216f,0.248212f, -0.157233f,0.982334f,0.101481f, -0.403254f,0.903723f,0.143774f, -0.0482774f,0.97679f,0.208689f, --0.297552f,0.88274f,0.363639f, --0.30014f,0.861944f,0.408619f, --0.211374f,0.886111f,0.412466f, --0.03076f,0.854928f,0.517834f, -0.0282722f,0.878122f,0.477601f, --0.13332f,0.93673f,0.32367f, --0.256519f,0.940042f,0.224764f, --0.183801f,0.953616f,0.238397f, --0.0194462f,0.968434f,0.24851f, --0.0907191f,0.988269f,0.122863f, --0.322189f,0.946234f,-0.028899f, --0.20601f,0.965456f,-0.159543f, --0.0654489f,0.973414f,-0.219504f, --0.113732f,0.990052f,-0.0828341f, --0.135223f,0.986029f,0.0972711f, --0.295266f,0.944373f,0.144834f, --0.450404f,0.860579f,0.237781f, --0.30004f,0.881766f,0.363958f, --0.429075f,0.860577f,0.274411f, --0.624789f,0.771784f,0.118272f, --0.497638f,0.864372f,0.0722275f, --0.313601f,0.946808f,-0.0721819f, --0.057809f,0.993544f,-0.0976184f, -0.13458f,0.987765f,-0.078798f, --0.184662f,0.92514f,-0.331688f, --0.385787f,0.812528f,-0.436996f, --0.187957f,0.911737f,-0.36525f, -0.0316981f,0.954599f,-0.296202f, -0.147926f,0.956328f,-0.252101f, -0.104858f,0.974711f,-0.197342f, --0.0836115f,0.931387f,-0.354298f, --0.111379f,0.87594f,-0.469386f, --0.0328315f,0.880204f,-0.473458f, -0.162025f,0.887756f,-0.430856f, -0.205253f,0.903446f,-0.376373f, -0.237481f,0.902569f,-0.359125f, -0.385116f,0.876359f,-0.289276f, -0.249914f,0.920198f,-0.301294f, -0.0143883f,0.906805f,-0.421304f, -0.1198f,0.98226f,-0.14427f, --0.009516f,0.980934f,-0.194106f, --0.149357f,0.951394f,-0.269335f, --0.133007f,0.936454f,-0.324597f, -0.034566f,0.948692f,-0.314306f, -0.178184f,0.929444f,-0.323086f, -0.219637f,0.922638f,-0.317015f, -0.296463f,0.935411f,-0.192652f, -0.416664f,0.902617f,-0.108048f, -0.442812f,0.876638f,-0.188209f, -0.465688f,0.849444f,-0.248152f, -0.511879f,0.84424f,-0.158868f, -0.360617f,0.931627f,-0.0450278f, -0.228988f,0.955033f,0.188354f, --0.00280316f,0.974776f,0.223168f, -0.00899431f,0.980078f,0.198407f, -0.0845579f,0.975657f,0.202347f, -0.0600237f,0.962271f,0.265389f, -0.0344627f,0.950379f,0.309181f, -0.173636f,0.921696f,0.346881f, --0.00190385f,0.960894f,0.276909f, --0.186383f,0.97431f,0.126416f, -0.101162f,0.98048f,0.168596f, -0.181976f,0.961147f,0.207559f, -0.220019f,0.957024f,0.188939f, -0.310192f,0.917199f,0.250053f, --0.02225f,0.932984f,0.359229f, --0.395015f,0.837639f,0.377259f, --0.325443f,0.861588f,0.389554f, --0.255559f,0.880464f,0.39934f, --0.151471f,0.886274f,0.437693f, --0.0211154f,0.863177f,0.50446f, -0.00094362f,0.808505f,0.588488f, --0.114242f,0.850647f,0.513176f, --0.11027f,0.888828f,0.444776f, --0.0310984f,0.926772f,0.374335f, -0.036991f,0.899416f,0.435525f, --0.0593828f,0.941327f,0.33223f, --0.108182f,0.990534f,0.0844942f, --0.153469f,0.985899f,0.066708f, --0.257292f,0.956946f,0.134368f, --0.339432f,0.926138f,0.164482f, --0.361227f,0.853531f,0.3755f, --0.433268f,0.811828f,0.391425f, --0.292152f,0.883075f,0.367186f, --0.254971f,0.931997f,0.257627f, --0.51111f,0.857028f,-0.0653379f, --0.482419f,0.859823f,-0.167263f, --0.240122f,0.964988f,-0.105544f, --0.0637549f,0.987476f,-0.144314f, -0.14266f,0.980144f,-0.137714f, -0.096896f,0.982614f,-0.158371f, --0.287298f,0.856944f,-0.42791f, --0.299829f,0.819408f,-0.488542f, --0.0881013f,0.911449f,-0.40187f, -0.0509938f,0.949808f,-0.308649f, -0.13334f,0.962273f,-0.237174f, -0.0865622f,0.946427f,-0.311099f, -0.0118172f,0.924665f,-0.380599f, --0.0178448f,0.910652f,-0.412789f, -0.073892f,0.906856f,-0.414913f, -0.15114f,0.90612f,-0.395099f, -0.255577f,0.878518f,-0.403593f, -0.278013f,0.865146f,-0.417411f, -0.239832f,0.923443f,-0.299555f, -0.188412f,0.940744f,-0.281961f, --0.0158305f,0.982567f,-0.185231f, -0.0666038f,0.988337f,-0.136945f, --0.0538402f,0.959334f,-0.277092f, --0.0212127f,0.945816f,-0.324009f, --0.0150833f,0.913689f,-0.406133f, -0.15601f,0.93774f,-0.310331f, -0.182702f,0.936618f,-0.298942f, -0.189924f,0.93758f,-0.29133f, -0.333869f,0.91329f,-0.233307f, -0.499532f,0.857573f,-0.122619f, -0.46551f,0.873216f,-0.144201f, -0.373694f,0.926999f,0.0320189f, -0.203779f,0.950539f,0.234414f, -0.13831f,0.928366f,0.344974f, -0.0515931f,0.949665f,0.30899f, -0.0310079f,0.96445f,0.262439f, -0.0853119f,0.968829f,0.232577f, --0.00103764f,0.981733f,0.190261f, --0.00365072f,0.967667f,0.252206f, -0.10066f,0.945677f,0.309134f, -0.178572f,0.914026f,0.364237f, --0.0213985f,0.991455f,0.128684f, -0.0498313f,0.996519f,0.0668339f, -0.120586f,0.983203f,0.137006f, -0.0910496f,0.981472f,0.16859f, -0.13401f,0.919805f,0.368783f, --0.0801133f,0.861028f,0.502208f, --0.337717f,0.841946f,0.420801f, --0.27627f,0.878916f,0.388821f, --0.2301f,0.91025f,0.344237f, --0.177792f,0.940411f,0.289857f, --0.131507f,0.928729f,0.346652f, --0.0961971f,0.892019f,0.441642f, --0.0639687f,0.872394f,0.4846f, --0.0102449f,0.879124f,0.476482f, --0.00257342f,0.917704f,0.397258f, --0.0554909f,0.910659f,0.409416f, -0.0291401f,0.896118f,0.442858f, -0.0220451f,0.91331f,0.406668f, --0.138595f,0.921526f,0.362741f, --0.186305f,0.924786f,0.331755f, --0.347011f,0.903153f,0.25278f, --0.513046f,0.817508f,0.261656f, --0.445268f,0.835978f,0.320745f, --0.177443f,0.933005f,0.313074f, --0.0397144f,0.982015f,0.184579f, --0.223543f,0.974128f,-0.0332155f, --0.4666f,0.831165f,-0.302406f, --0.335541f,0.890675f,-0.306773f, --0.0318096f,0.973987f,-0.224358f, -0.0953506f,0.970682f,-0.220646f, -0.134482f,0.984534f,-0.112281f, --0.0162953f,0.992479f,-0.121323f, --0.284204f,0.902721f,-0.322992f, --0.211997f,0.906314f,-0.365585f, --0.016875f,0.958349f,-0.285101f, -0.129044f,0.959618f,-0.24996f, -0.151996f,0.928771f,-0.338057f, --0.0199776f,0.904327f,-0.426372f, --0.0559071f,0.940256f,-0.335846f, -0.108952f,0.945546f,-0.306712f, -0.215589f,0.905767f,-0.364838f, -0.293281f,0.878158f,-0.377921f, -0.279356f,0.877367f,-0.390112f, -0.127912f,0.886694f,-0.444312f, -0.153161f,0.902051f,-0.403541f, --0.0890667f,0.969622f,-0.227816f, -0.0791521f,0.98141f,-0.174841f, -0.0791423f,0.971591f,-0.22304f, -0.0168825f,0.939671f,-0.341662f, --0.00465273f,0.922224f,-0.386629f, -0.0341103f,0.949158f,-0.312946f, -0.243022f,0.94331f,-0.226069f, -0.218985f,0.910646f,-0.350386f, -0.282576f,0.88974f,-0.358487f, -0.398347f,0.877162f,-0.268155f, -0.330147f,0.941044f,-0.073754f, -0.178397f,0.970659f,0.16123f, -0.0525065f,0.954596f,0.293241f, -0.0945297f,0.914894f,0.392472f, -0.13661f,0.905749f,0.401193f, -0.0406243f,0.947359f,0.317587f, -0.163762f,0.925717f,0.340926f, -0.040504f,0.970394f,0.238108f, --0.0543453f,0.975142f,0.214812f, -2.68223e-005f,0.976435f,0.215812f, -0.209407f,0.932778f,0.293383f, -0.184464f,0.966229f,0.179928f, --0.0113387f,0.999016f,0.0428878f, -0.079177f,0.981677f,0.173323f, -0.0362262f,0.968187f,0.24759f, --0.0723427f,0.93572f,0.345245f, --0.135834f,0.890086f,0.435082f, --0.264248f,0.873681f,0.408479f, --0.262216f,0.89706f,0.355706f, --0.164052f,0.919196f,0.358002f, --0.167176f,0.924403f,0.342829f, --0.200682f,0.904947f,0.375229f, --0.158624f,0.899685f,0.406701f, --0.112022f,0.891533f,0.438886f, --0.00921475f,0.869473f,0.493894f, -0.0802624f,0.881225f,0.465833f, --0.0504548f,0.922517f,0.382645f, --0.0121989f,0.918687f,0.394797f, -0.0440736f,0.891185f,0.451494f, --0.0756766f,0.900734f,0.427728f, --0.202037f,0.909488f,0.363335f, --0.295423f,0.866009f,0.403428f, --0.471319f,0.827048f,0.30635f, --0.443758f,0.874939f,0.193806f, --0.125026f,0.977756f,0.168412f, -0.0442668f,0.987172f,0.153403f, --0.0338798f,0.987768f,0.152205f, --0.259589f,0.965039f,-0.0362462f, --0.35784f,0.903258f,-0.236805f, --0.167942f,0.956248f,-0.239554f, -0.0460995f,0.994911f,-0.0895878f, --0.00166787f,0.99811f,-0.0614342f, --0.0336402f,0.998923f,0.0319432f, --0.139942f,0.989786f,0.0271849f, --0.21913f,0.971861f,-0.0864193f, --0.083914f,0.990307f,-0.110685f, -0.180721f,0.971397f,-0.154041f, -0.29639f,0.913592f,-0.278393f, -0.0452233f,0.94418f,-0.326312f, --0.13463f,0.924181f,-0.357441f, -0.11753f,0.929423f,-0.349798f, -0.238754f,0.909243f,-0.340989f, -0.272577f,0.899491f,-0.341494f, -0.343945f,0.879082f,-0.330025f, -0.202726f,0.889055f,-0.410468f, -0.0880936f,0.876474f,-0.473321f, --0.000386659f,0.989518f,-0.144407f, --0.0138532f,0.983228f,-0.181856f, -0.165824f,0.98552f,-0.0353913f, -0.196669f,0.963831f,-0.179867f, -0.00115533f,0.93443f,-0.356144f, --0.0579019f,0.928374f,-0.36711f, -0.234096f,0.913194f,-0.333581f, -0.311749f,0.881031f,-0.355805f, -0.243154f,0.902483f,-0.355529f, -0.214274f,0.956658f,-0.197209f, -0.120355f,0.990537f,0.0659672f, -0.0219689f,0.979298f,0.201227f, --0.0108785f,0.963809f,0.266373f, --0.016985f,0.957116f,0.289205f, -0.15437f,0.922679f,0.353316f, -0.0959731f,0.93811f,0.332776f, -0.138832f,0.935317f,0.325434f, -0.133758f,0.941295f,0.309956f, --0.00148525f,0.972503f,0.232885f, -0.00817406f,0.979885f,0.199396f, -0.180862f,0.960033f,0.213602f, -0.330054f,0.924212f,0.192085f, -0.039978f,0.994865f,0.0929833f, --0.118088f,0.976595f,0.179768f, --0.100092f,0.923425f,0.370498f, --0.117559f,0.88568f,0.449166f, --0.170937f,0.879572f,0.443997f, --0.244838f,0.844603f,0.47613f, --0.196312f,0.844324f,0.498577f, --0.188529f,0.85759f,0.478535f, --0.188501f,0.839785f,0.509145f, --0.185899f,0.842964f,0.50483f, --0.154293f,0.872091f,0.464382f, --0.115474f,0.894542f,0.431811f, --0.0887035f,0.930393f,0.35567f, -0.133188f,0.884773f,0.446583f, -0.0484666f,0.90226f,0.42846f, --0.0427135f,0.946807f,0.318954f, --0.0239721f,0.952831f,0.302554f, --0.0435714f,0.926502f,0.373759f, --0.182333f,0.899048f,0.398079f, --0.323546f,0.846433f,0.422929f, --0.334412f,0.852971f,0.40076f, --0.325744f,0.921829f,0.210052f, --0.140593f,0.980752f,0.135497f, --0.000911154f,0.974293f,0.225285f, --0.0250989f,0.969759f,0.242771f, --0.116671f,0.973198f,0.198177f, --0.222025f,0.967605f,0.12019f, --0.252573f,0.967519f,-0.0106675f, --0.0639595f,0.99456f,0.0822198f, -0.0427289f,0.995551f,0.0839736f, --0.103724f,0.994603f,-0.00239601f, --0.143088f,0.981404f,0.127957f, --0.10974f,0.986771f,0.119333f, -0.0104156f,0.996494f,-0.083017f, -0.293943f,0.936018f,-0.193565f, -0.319276f,0.921897f,-0.219472f, -0.0381885f,0.98033f,-0.193638f, --0.0675527f,0.960756f,-0.269042f, -0.11652f,0.926645f,-0.357425f, -0.2292f,0.915276f,-0.331265f, -0.30797f,0.891339f,-0.33267f, -0.348546f,0.853103f,-0.38824f, -0.249601f,0.874176f,-0.416553f, -0.18778f,0.887174f,-0.421499f, -0.122671f,0.990262f,-0.0658213f, --0.0435566f,0.992887f,-0.11081f, -0.0494387f,0.998572f,0.0202637f, -0.34574f,0.93458f,0.0838063f, -0.205482f,0.970541f,-0.125808f, -0.00807532f,0.928646f,-0.370879f, -0.212354f,0.896105f,-0.389746f, -0.285287f,0.924061f,-0.254407f, -0.130923f,0.978283f,-0.160691f, --0.0198715f,0.999555f,-0.0222427f, --0.0516664f,0.987583f,0.148362f, --0.0269196f,0.97761f,0.208697f, --0.00903021f,0.979554f,0.200976f, --0.00834551f,0.993685f,0.111894f, -0.110842f,0.987362f,0.113269f, -0.106874f,0.976878f,0.185167f, -0.141547f,0.968321f,0.205716f, -0.174972f,0.958256f,0.22612f, -0.054828f,0.97071f,0.233913f, -0.0299952f,0.981566f,0.188753f, -0.154988f,0.980787f,0.118472f, -0.340268f,0.925521f,0.166219f, -0.0136729f,0.972695f,0.231683f, --0.270301f,0.899629f,0.342937f, --0.212226f,0.859098f,0.465736f, --0.140535f,0.846284f,0.513861f, --0.175101f,0.833937f,0.523345f, --0.270288f,0.821688f,0.501769f, --0.282918f,0.830124f,0.48047f, --0.174774f,0.812594f,0.556008f, --0.140913f,0.828898f,0.541361f, --0.117146f,0.878471f,0.463211f, --0.0728003f,0.920501f,0.383899f, --0.00293246f,0.948861f,0.315679f, --0.025836f,0.967046f,0.253289f, --0.00528251f,0.957042f,0.289901f, -0.088837f,0.914901f,0.393781f, -0.103014f,0.924276f,0.367561f, -0.00437406f,0.95596f,0.293464f, --0.1442f,0.952275f,0.269032f, --0.25396f,0.922416f,0.290951f, --0.3894f,0.883133f,0.261618f, --0.283615f,0.906122f,0.313857f, --0.158058f,0.930594f,0.330171f, --0.134893f,0.961854f,0.237993f, --0.0720522f,0.980808f,0.181173f, -0.0349752f,0.985618f,0.16533f, --0.115886f,0.987377f,0.107965f, --0.182211f,0.968171f,0.171592f, --0.154769f,0.971197f,0.181169f, --0.0833304f,0.991727f,0.0976435f, -0.136344f,0.989699f,0.0436644f, --0.106946f,0.993768f,-0.0314277f, --0.261215f,0.963441f,0.0595659f, -0.0120329f,0.999596f,0.0257635f, -0.254582f,0.953185f,-0.163178f, -0.299581f,0.899014f,-0.319413f, -0.266729f,0.9307f,-0.250307f, -0.0579078f,0.977779f,-0.201483f, -0.0590491f,0.968354f,-0.242494f, -0.196887f,0.912909f,-0.357536f, -0.211047f,0.877381f,-0.430885f, -0.301745f,0.869054f,-0.39204f, -0.422629f,0.852977f,-0.306291f, -0.252055f,0.896241f,-0.364994f, -0.158615f,0.91987f,-0.35872f, -0.099088f,0.991841f,-0.0802016f, --0.0649468f,0.996188f,-0.0582405f, --0.09006f,0.995865f,-0.0119566f, -0.299186f,0.949686f,0.0926523f, -0.448961f,0.886032f,0.115674f, -0.225408f,0.968479f,-0.106019f, -0.110364f,0.983262f,-0.144965f, -0.0982296f,0.994337f,0.0405443f, -0.03386f,0.98307f,0.180072f, --0.0548904f,0.982813f,0.176255f, --0.131535f,0.986412f,0.0984329f, --0.0772354f,0.9803f,0.181787f, -0.0556449f,0.958844f,0.278429f, -0.08308f,0.969903f,0.228882f, -0.0990101f,0.980512f,0.169685f, -0.044494f,0.989611f,0.136713f, -0.124145f,0.981303f,0.14708f, -0.126925f,0.98249f,0.136391f, -0.0289993f,0.988064f,0.151292f, -0.146433f,0.982737f,0.113073f, -0.210582f,0.977005f,-0.0334257f, -0.179552f,0.980748f,0.0767724f, --0.0986728f,0.925956f,0.364513f, --0.333893f,0.835984f,0.435484f, --0.316161f,0.849609f,0.422146f, --0.184942f,0.836066f,0.516517f, --0.165011f,0.827696f,0.536368f, --0.1919f,0.849729f,0.491054f, --0.260791f,0.881445f,0.393754f, --0.244518f,0.891442f,0.3815f, --0.101674f,0.91665f,0.386543f, --0.0135975f,0.926806f,0.375295f, -0.0383624f,0.948469f,0.31454f, -0.0311937f,0.973858f,0.225008f, --0.0712105f,0.966505f,0.24657f, --0.0567001f,0.939446f,0.337973f, -0.028793f,0.937988f,0.345471f, -0.0944493f,0.922855f,0.373388f, -0.0339618f,0.928396f,0.370037f, --0.0877384f,0.940895f,0.327137f, --0.18953f,0.934542f,0.301182f, --0.32638f,0.91712f,0.22884f, --0.359606f,0.925931f,0.115484f, --0.250341f,0.958991f,0.132911f, --0.0188851f,0.981881f,0.188556f, -0.0444017f,0.992958f,0.109832f, -0.0292244f,0.992914f,0.115188f, --0.0809364f,0.975181f,0.206087f, --0.271318f,0.947628f,0.168488f, --0.147667f,0.972329f,0.181027f, -0.0428511f,0.996597f,0.0704105f, -0.186761f,0.979997f,-0.0687482f, --0.111624f,0.989428f,-0.0925828f, --0.210799f,0.973161f,-0.0923101f, -0.115063f,0.969975f,-0.214262f, -0.376036f,0.900817f,-0.217086f, -0.373114f,0.884398f,-0.280403f, -0.226074f,0.905778f,-0.358407f, -0.0100432f,0.919347f,-0.393319f, -0.0770135f,0.93428f,-0.348124f, -0.321395f,0.895396f,-0.308175f, -0.278274f,0.88968f,-0.361984f, -0.208857f,0.897848f,-0.387619f, -0.325776f,0.898072f,-0.295527f, -0.259741f,0.94586f,-0.194637f, -0.133572f,0.977992f,-0.160282f, --0.0277257f,0.992037f,-0.122857f, --0.0924217f,0.994571f,-0.0478129f, --0.116438f,0.990661f,-0.0709396f, -0.19557f,0.979919f,-0.0388625f, -0.381806f,0.908869f,0.167871f, -0.299282f,0.900933f,0.314247f, -0.0638964f,0.963274f,0.260808f, --0.0731879f,0.961388f,0.265284f, -0.00180295f,0.933351f,0.35896f, -0.0655899f,0.939022f,0.337544f, --0.0612046f,0.96894f,0.239602f, --0.166052f,0.961913f,0.217141f, --0.0893118f,0.965245f,0.245614f, -0.0820047f,0.941494f,0.326902f, -0.146932f,0.937808f,0.314527f, -0.136588f,0.939539f,0.314023f, -0.166222f,0.964584f,0.204811f, -0.17109f,0.976368f,0.132039f, -0.0961069f,0.992806f,0.0714098f, -0.21778f,0.975905f,-0.013487f, -0.251597f,0.967828f,-0.00281592f, --0.0966896f,0.992674f,0.0724564f, --0.377842f,0.87018f,0.316262f, --0.323773f,0.853386f,0.408537f, --0.278729f,0.867238f,0.412564f, --0.286188f,0.874143f,0.392391f, --0.157911f,0.873337f,0.46081f, --0.102832f,0.901917f,0.419488f, --0.202979f,0.914239f,0.350665f, --0.202531f,0.912766f,0.354739f, --0.0843061f,0.956165f,0.28043f, --0.032801f,0.972626f,0.23005f, -0.0558474f,0.961664f,0.268485f, -0.0617913f,0.944956f,0.321309f, --0.110343f,0.937288f,0.330629f, --0.100375f,0.942449f,0.318927f, -0.00551388f,0.94452f,0.328408f, -0.0918462f,0.918926f,0.383587f, -0.101653f,0.927592f,0.3595f, --0.0426308f,0.960188f,0.276083f, --0.204594f,0.956809f,0.206539f, --0.269971f,0.94929f,0.161132f, --0.226691f,0.969699f,0.0910768f, --0.201053f,0.979426f,-0.0173973f, --0.0500104f,0.996428f,-0.0680439f, -0.0272717f,0.999341f,-0.0239459f, --0.123434f,0.99095f,0.0527561f, --0.192945f,0.962627f,0.190054f, --0.168165f,0.969015f,0.180916f, --0.018086f,0.998622f,0.0492547f, -0.193647f,0.975713f,-0.102395f, -0.238523f,0.949336f,-0.204618f, --0.0631885f,0.979427f,-0.191649f, --0.143153f,0.951631f,-0.271858f, -0.148284f,0.940281f,-0.306403f, -0.321113f,0.91022f,-0.261508f, -0.430557f,0.873923f,-0.225566f, -0.33081f,0.885978f,-0.324974f, -0.0651303f,0.881392f,-0.467874f, -0.0061581f,0.870221f,-0.492623f, -0.228459f,0.886891f,-0.401535f, -0.271547f,0.915184f,-0.297827f, -0.234822f,0.937165f,-0.258033f, -0.27549f,0.92259f,-0.270061f, -0.15924f,0.956523f,-0.244348f, -0.0559303f,0.980799f,-0.186831f, --0.135424f,0.978967f,-0.152593f, --0.15029f,0.985676f,-0.0765294f, --0.0914165f,0.995631f,-0.0190383f, -0.0718608f,0.995714f,0.0582141f, -0.110439f,0.955564f,0.273313f, -0.150494f,0.878589f,0.453246f, -0.206788f,0.864483f,0.458157f, -0.00161058f,0.957582f,0.288156f, --0.0606597f,0.978401f,0.197616f, -0.0692656f,0.9636f,0.25822f, --0.0150286f,0.961837f,0.273212f, --0.0821089f,0.979895f,0.181835f, --0.0658015f,0.997594f,0.0218166f, -0.0735253f,0.997209f,0.0129617f, -0.108564f,0.993746f,0.0261473f, -0.141903f,0.981669f,0.127241f, -0.25029f,0.961471f,0.113707f, -0.225135f,0.967003f,0.119246f, -0.180078f,0.979492f,0.0903737f, -0.237995f,0.971216f,-0.00990333f, -0.0690008f,0.993039f,0.0954582f, --0.15301f,0.921345f,0.357369f, --0.436898f,0.858127f,0.2697f, --0.402318f,0.892319f,0.204714f, --0.306797f,0.913547f,0.267033f, --0.291188f,0.917032f,0.272509f, --0.177835f,0.951614f,0.250608f, --0.0915363f,0.968867f,0.230039f, --0.166531f,0.945303f,0.280483f, --0.214524f,0.956179f,0.199251f, --0.012479f,0.976094f,0.216991f, -0.0485598f,0.972045f,0.22972f, --0.0252191f,0.985709f,0.166561f, --0.0505751f,0.962642f,0.266012f, --0.0744793f,0.942362f,0.3262f, --0.0759606f,0.964725f,0.252062f, --0.0161104f,0.954528f,0.297687f, -0.0264811f,0.949176f,0.313631f, -0.160628f,0.931063f,0.327597f, -0.0783265f,0.972396f,0.219798f, --0.0844827f,0.993769f,0.0727062f, --0.216702f,0.975588f,-0.035603f, --0.195742f,0.979732f,-0.0425419f, --0.158684f,0.986912f,-0.0287187f, --0.0351752f,0.999203f,-0.0188605f, -0.0075235f,0.998877f,-0.0467686f, --0.172586f,0.978556f,-0.112436f, --0.211691f,0.968971f,-0.127601f, --0.0966389f,0.974492f,-0.202552f, -0.105494f,0.955113f,-0.276822f, -0.276059f,0.900517f,-0.335947f, -0.219894f,0.907239f,-0.358557f, --0.0517693f,0.940977f,-0.334489f, --0.112634f,0.913693f,-0.390485f, -0.139923f,0.91136f,-0.387097f, -0.277005f,0.880398f,-0.384926f, -0.432717f,0.843875f,-0.317222f, -0.433921f,0.823502f,-0.365455f, -0.17364f,0.848637f,-0.499665f, --0.015678f,0.850557f,-0.525649f, -0.122709f,0.874405f,-0.469423f, -0.164019f,0.896294f,-0.412014f, -0.166557f,0.925047f,-0.34139f, -0.280426f,0.925939f,-0.25298f, -0.167623f,0.949542f,-0.265088f, --0.00102675f,0.947405f,-0.320035f, --0.299103f,0.954018f,0.0196808f, --0.231787f,0.963234f,0.135851f, --0.196753f,0.961454f,0.192081f, --0.100151f,0.951932f,0.289472f, --0.0563981f,0.925245f,0.375154f, -0.0944709f,0.906549f,0.411394f, -0.305132f,0.862547f,0.403618f, -0.241596f,0.931691f,0.271261f, --0.00370494f,0.998524f,0.0541932f, --0.000261525f,0.998839f,0.0481646f, -0.0260826f,0.996855f,0.0748309f, -0.0599122f,0.998202f,-0.00179631f, -0.0800977f,0.992669f,-0.0905174f, -0.0495455f,0.986325f,-0.157186f, -0.0563113f,0.99071f,-0.123787f, -0.0832843f,0.991933f,-0.095561f, -0.195142f,0.979158f,-0.0563024f, -0.166634f,0.980307f,0.105976f, -0.195862f,0.965878f,0.169461f, -0.284001f,0.943304f,0.171815f, --0.127388f,0.981047f,0.146008f, --0.325222f,0.907949f,0.264311f, --0.283635f,0.916157f,0.28321f, --0.335047f,0.926228f,0.17276f, --0.335005f,0.934046f,0.123816f, --0.290471f,0.951826f,0.098256f, --0.155538f,0.980437f,0.120632f, --0.103955f,0.982905f,0.151957f, --0.195165f,0.971298f,0.135979f, --0.117017f,0.988828f,0.0923353f, --0.0942839f,0.995508f,0.00860997f, --0.0378307f,0.988218f,0.148301f, -0.011735f,0.964206f,0.264893f, --0.104568f,0.970188f,0.218634f, --0.0628876f,0.976435f,0.206445f, --0.0629747f,0.98253f,0.175127f, --0.0956593f,0.974263f,0.204109f, -0.00313264f,0.95614f,0.292895f, -0.184054f,0.913334f,0.363241f, -0.234886f,0.917194f,0.321843f, -0.0818984f,0.986888f,0.139086f, --0.195667f,0.979747f,-0.0425424f, --0.217661f,0.976006f,-0.00606019f, --0.197993f,0.980131f,-0.011927f, --0.0476541f,0.998861f,-0.00224411f, -0.0987461f,0.994341f,-0.039179f, --0.0376594f,0.985822f,-0.163515f, --0.127665f,0.950129f,-0.284528f, -0.022229f,0.926621f,-0.37534f, -0.1509f,0.867911f,-0.473243f, -0.251356f,0.84329f,-0.475061f, -0.180391f,0.877498f,-0.44436f, --0.0381311f,0.903323f,-0.427263f, --0.0302687f,0.878817f,-0.476199f, -0.151045f,0.843437f,-0.515557f, -0.243043f,0.829132f,-0.503459f, -0.361214f,0.815934f,-0.451416f, -0.469501f,0.80804f,-0.355866f, -0.232058f,0.89573f,-0.379233f, --0.0406313f,0.902008f,-0.429803f, -0.0570971f,0.896722f,-0.438895f, -0.139199f,0.907425f,-0.396488f, -0.0981956f,0.909915f,-0.403003f, -0.173099f,0.913856f,-0.367293f, -0.208242f,0.936494f,-0.28216f, -0.104323f,0.936228f,-0.335549f, --0.455877f,0.874672f,0.164697f, --0.324643f,0.906811f,0.268889f, --0.22917f,0.934048f,0.273927f, --0.11917f,0.945648f,0.302569f, --0.0303449f,0.953424f,0.300104f, -0.0953211f,0.968161f,0.231468f, -0.307551f,0.928088f,0.209914f, -0.396906f,0.882705f,0.251588f, -0.154339f,0.98019f,0.124127f, -0.00614755f,0.999958f,0.00674104f, -0.0862143f,0.995356f,-0.0428297f, -0.0605751f,0.988948f,-0.135323f, -0.116851f,0.991236f,-0.0616197f, -0.0626175f,0.989161f,-0.132815f, -0.0598334f,0.989391f,-0.132381f, -0.0870904f,0.982628f,-0.163882f, -0.0967617f,0.982554f,-0.15882f, -0.0255981f,0.999032f,-0.0357718f, -0.114826f,0.99101f,0.0686587f, -0.196799f,0.954402f,0.22447f, --0.0385546f,0.932725f,0.358521f, --0.332784f,0.924223f,0.18726f, --0.304588f,0.936692f,0.172726f, --0.293315f,0.937819f,0.185638f, --0.274742f,0.953043f,0.127381f, --0.263119f,0.962853f,0.0606766f, --0.268024f,0.959606f,0.0855591f, --0.0879001f,0.973995f,0.208824f, --0.133948f,0.986848f,0.0904876f, --0.113332f,0.988235f,0.102703f, --0.0299834f,0.985262f,0.168402f, --0.19277f,0.976736f,0.0939502f, --0.0881002f,0.973369f,0.211639f, --0.024161f,0.965814f,0.258109f, --0.0447814f,0.977625f,0.205534f, --0.0454862f,0.975256f,0.216349f, --0.133105f,0.964838f,0.22665f, --0.114579f,0.956534f,0.268169f, -0.0712671f,0.941693f,0.328841f, -0.238728f,0.884921f,0.399904f, -0.297664f,0.869038f,0.395183f, --0.00961778f,0.988677f,0.149748f, --0.265709f,0.963666f,-0.0273077f, --0.143358f,0.988736f,0.0430136f, --0.00534208f,0.998711f,-0.0504723f, -0.174549f,0.979244f,-0.103024f, -0.0753759f,0.97722f,-0.198391f, --0.0309169f,0.954209f,-0.297538f, -0.114484f,0.932628f,-0.342197f, -0.277629f,0.881086f,-0.382896f, -0.233881f,0.840787f,-0.488238f, -0.145974f,0.866169f,-0.477957f, --0.0214889f,0.855591f,-0.517207f, -0.015747f,0.850281f,-0.526094f, -0.181736f,0.859322f,-0.478056f, -0.233268f,0.832868f,-0.501913f, -0.278912f,0.819449f,-0.500711f, -0.37496f,0.838284f,-0.395834f, -0.211098f,0.909912f,-0.357069f, -0.0173895f,0.949305f,-0.313875f, -0.0778513f,0.935569f,-0.344455f, -0.13573f,0.919161f,-0.369756f, -0.128317f,0.903382f,-0.40919f, -0.134873f,0.894846f,-0.425512f, -0.140765f,0.922098f,-0.360446f, -0.195779f,0.941368f,-0.274766f, --0.498792f,0.861228f,0.0974355f, --0.334273f,0.933116f,0.132498f, --0.209899f,0.97009f,0.121936f, --0.146122f,0.979163f,0.141027f, --0.00844043f,0.991347f,0.130997f, -0.183871f,0.98064f,0.0673491f, -0.295623f,0.955305f,0.000649681f, -0.325261f,0.940591f,0.0974362f, -0.279972f,0.936209f,0.212435f, -0.117319f,0.989809f,0.0807136f, -0.167452f,0.985876f,0.00303625f, -0.0997326f,0.991951f,-0.0780129f, -0.0970545f,0.989541f,-0.106723f, -0.122983f,0.982138f,-0.14241f, -0.0889416f,0.984545f,-0.150867f, -0.0922265f,0.975522f,-0.199627f, -0.0767647f,0.98447f,-0.15788f, --0.0166949f,0.981051f,-0.193027f, --0.0192651f,0.97159f,-0.235885f, --0.0430007f,0.99834f,-0.038322f, --0.1057f,0.976121f,0.189775f, --0.21501f,0.968939f,0.122177f, --0.312622f,0.947332f,0.0695023f, --0.268759f,0.958656f,0.0935212f, --0.210053f,0.974561f,0.0781578f, --0.280996f,0.956877f,0.0736733f, --0.29425f,0.945004f,0.142776f, --0.103752f,0.988352f,0.111339f, --0.0179991f,0.994529f,0.102897f, --0.257355f,0.965403f,0.0420096f, --0.105403f,0.956057f,0.273578f, --0.10459f,0.942017f,0.318851f, --0.129983f,0.956026f,0.262903f, --0.0671262f,0.95499f,0.288944f, --0.00387184f,0.948915f,0.315508f, --0.104327f,0.957897f,0.267486f, --0.136557f,0.931775f,0.336375f, --0.0981417f,0.964639f,0.24462f, -0.0564237f,0.977306f,0.204178f, -0.151449f,0.955346f,0.253725f, -0.313069f,0.882901f,0.349962f, -0.317375f,0.903515f,0.287983f, --0.14146f,0.988238f,-0.0580959f, --0.183704f,0.977531f,-0.10337f, -0.0729777f,0.993775f,-0.0841813f, -0.241185f,0.959561f,-0.145165f, -0.180872f,0.946861f,-0.26597f, -0.0759246f,0.918564f,-0.387911f, -0.0834031f,0.881426f,-0.4649f, -0.312989f,0.886301f,-0.341334f, -0.345782f,0.8869f,-0.306339f, -0.190174f,0.893803f,-0.40614f, -0.0967003f,0.870562f,-0.482463f, --0.011292f,0.813313f,-0.581716f, -0.104307f,0.818569f,-0.564858f, -0.278742f,0.804599f,-0.524332f, -0.252871f,0.80123f,-0.542298f, -0.288393f,0.816691f,-0.499846f, -0.158986f,0.877853f,-0.451771f, --0.0422089f,0.892803f,-0.448466f, -0.0676213f,0.902423f,-0.425511f, -0.196008f,0.897779f,-0.394428f, -0.174291f,0.88488f,-0.431984f, -0.107973f,0.893114f,-0.43668f, -0.0286973f,0.916566f,-0.398853f, -0.0334026f,0.935074f,-0.352875f, --0.456752f,0.886621f,-0.0726759f, --0.35821f,0.92461f,-0.129546f, --0.255187f,0.962466f,-0.0924034f, --0.153659f,0.987984f,-0.0166497f, -0.0326193f,0.998752f,-0.0378261f, -0.219848f,0.975435f,-0.0138776f, -0.325192f,0.945498f,0.0168406f, -0.223054f,0.973348f,-0.0532875f, -0.221049f,0.975263f,0.000679153f, -0.242907f,0.969656f,0.0276409f, -0.175892f,0.983375f,-0.0451076f, -0.180873f,0.98342f,0.0130764f, -0.169259f,0.981997f,-0.0838673f, -0.138819f,0.973225f,-0.183198f, -0.0923263f,0.975478f,-0.199795f, -0.109785f,0.97291f,-0.203452f, -0.048887f,0.975403f,-0.214938f, -0.0862303f,0.974446f,-0.207409f, -0.0239822f,0.965181f,-0.260482f, --0.234299f,0.93066f,-0.281028f, --0.183154f,0.968628f,-0.167974f, --0.163946f,0.9725f,-0.165423f, --0.29935f,0.945623f,-0.127226f, --0.309491f,0.943295f,-0.120043f, --0.244588f,0.967669f,-0.0615978f, --0.316375f,0.948228f,-0.0277512f, --0.278706f,0.959538f,-0.0401272f, --0.112855f,0.98959f,-0.0893067f, --0.0120823f,0.999804f,0.015665f, --0.269265f,0.962743f,0.0249422f, --0.319779f,0.940968f,0.110998f, --0.127925f,0.957822f,0.257316f, --0.134411f,0.958853f,0.250069f, --0.0963489f,0.939739f,0.328035f, -0.013379f,0.931979f,0.362265f, --0.059723f,0.950577f,0.304692f, --0.140375f,0.96932f,0.201776f, -0.0285405f,0.975242f,0.219289f, -0.0759984f,0.981739f,0.174395f, -0.082912f,0.985645f,0.14707f, -0.244118f,0.959921f,0.137686f, -0.433469f,0.888297f,0.151764f, -0.159753f,0.986026f,0.0472448f, --0.155828f,0.965805f,-0.207217f, -0.0529598f,0.961817f,-0.268522f, -0.302231f,0.91749f,-0.258588f, -0.300969f,0.905771f,-0.298324f, -0.219954f,0.902269f,-0.370851f, -0.168125f,0.874674f,-0.45462f, -0.0852064f,0.832228f,-0.547846f, -0.293285f,0.876411f,-0.381953f, -0.299707f,0.878674f,-0.371628f, -0.169625f,0.87124f,-0.460618f, -0.152784f,0.862886f,-0.481751f, -0.140952f,0.826781f,-0.544578f, -0.216806f,0.796193f,-0.564865f, -0.252088f,0.778347f,-0.575003f, -0.184028f,0.779276f,-0.599052f, -0.07662f,0.847353f,-0.525474f, --0.000576164f,0.875581f,-0.483072f, -0.0676453f,0.855821f,-0.51283f, -0.10935f,0.864233f,-0.491064f, -0.170357f,0.902391f,-0.395814f, -0.0783522f,0.922085f,-0.378973f, --0.0376769f,0.945309f,-0.323992f, --0.0145087f,0.973617f,-0.227725f, --0.23379f,0.969091f,0.0787691f, --0.308611f,0.949667f,-0.0537712f, --0.26795f,0.959457f,-0.087437f, --0.196118f,0.96672f,-0.16429f, -0.0184009f,0.993828f,-0.109391f, -0.124962f,0.988681f,-0.0830367f, -0.297057f,0.954812f,-0.00955538f, -0.355506f,0.934478f,-0.0191401f, -0.206845f,0.957298f,-0.201981f, -0.24827f,0.946264f,-0.207234f, -0.137685f,0.959548f,-0.245584f, -0.129837f,0.983718f,-0.124261f, -0.240211f,0.966075f,-0.0948542f, -0.253383f,0.959847f,-0.120381f, -0.101386f,0.970431f,-0.219056f, -0.110568f,0.971775f,-0.208395f, -0.09998f,0.968593f,-0.227667f, -0.051279f,0.9528f,-0.299236f, -0.0182953f,0.960636f,-0.277207f, --0.177379f,0.948528f,-0.262356f, --0.248744f,0.930203f,-0.269905f, --0.201336f,0.9681f,-0.14915f, --0.308378f,0.940105f,-0.145279f, --0.337871f,0.915739f,-0.217407f, --0.303349f,0.940151f,-0.155226f, --0.267648f,0.955794f,-0.121746f, --0.256838f,0.946595f,-0.194914f, --0.151848f,0.978969f,-0.136244f, --0.166527f,0.98578f,-0.0225025f, --0.271416f,0.956933f,0.103014f, --0.388293f,0.921445f,0.0129329f, --0.211649f,0.973838f,0.0827345f, --0.164151f,0.971899f,0.168719f, --0.20343f,0.950968f,0.232971f, --0.0501604f,0.944198f,0.325535f, -0.0851988f,0.916779f,0.390203f, --0.0675238f,0.966737f,0.246698f, --0.050967f,0.964665f,0.258503f, -0.0897532f,0.945965f,0.311599f, -0.203817f,0.954291f,0.218604f, -0.298323f,0.9542f,0.0224806f, -0.409994f,0.911395f,0.0355409f, -0.297451f,0.952362f,0.0673044f, -0.087158f,0.982486f,-0.164695f, -0.130693f,0.926163f,-0.353753f, -0.287973f,0.877932f,-0.3825f, -0.285473f,0.870692f,-0.400501f, -0.210236f,0.894171f,-0.395297f, -0.291478f,0.889926f,-0.350816f, -0.238796f,0.833f,-0.499086f, -0.156519f,0.786723f,-0.597134f, -0.265294f,0.807831f,-0.526334f, -0.196683f,0.821511f,-0.535197f, -0.111545f,0.852981f,-0.509883f, -0.148451f,0.876975f,-0.457031f, -0.27925f,0.865803f,-0.415216f, -0.364812f,0.845771f,-0.389337f, -0.213362f,0.862896f,-0.458135f, --0.014091f,0.870788f,-0.491456f, --0.0389733f,0.872117f,-0.487742f, -0.0697073f,0.876793f,-0.475789f, -0.0500075f,0.893805f,-0.445659f, -0.0507492f,0.920605f,-0.387184f, -0.00717016f,0.971083f,-0.238636f, --0.12982f,0.987525f,-0.0891113f, --0.196671f,0.977747f,-0.0730188f, --0.180786f,0.972597f,0.146192f, --0.276836f,0.956623f,0.0907445f, --0.145247f,0.980389f,0.133193f, --0.201228f,0.967008f,-0.156214f, --0.0137179f,0.995281f,-0.0960578f, -0.139707f,0.987867f,-0.0678349f, -0.246306f,0.96116f,-0.124516f, -0.421865f,0.906227f,-0.0279788f, -0.299255f,0.934152f,-0.194439f, -0.288356f,0.912569f,-0.289945f, -0.0853497f,0.915952f,-0.392106f, -0.039019f,0.957394f,-0.286136f, -0.208597f,0.95771f,-0.198188f, -0.25753f,0.95731f,-0.131287f, -0.153643f,0.978938f,-0.134439f, -0.0994252f,0.976974f,-0.188775f, -0.12654f,0.974603f,-0.184759f, -0.142684f,0.966335f,-0.214099f, --0.00843645f,0.93512f,-0.354231f, --0.17704f,0.933769f,-0.311017f, --0.343277f,0.895674f,-0.282717f, --0.276715f,0.959562f,-0.0516624f, --0.215753f,0.976427f,-0.00633257f, --0.305134f,0.926522f,-0.220112f, --0.33388f,0.920497f,-0.203001f, --0.259644f,0.948413f,-0.181927f, --0.268974f,0.938104f,-0.218205f, --0.245938f,0.962991f,-0.110289f, --0.275564f,0.96071f,0.0331654f, --0.258271f,0.944524f,0.202903f, --0.309053f,0.947461f,0.0824847f, --0.320335f,0.94673f,-0.0329778f, --0.208609f,0.963472f,0.167941f, --0.270763f,0.941796f,0.199269f, --0.104692f,0.947993f,0.30058f, -0.0304241f,0.930802f,0.364255f, -0.0189457f,0.906511f,0.421757f, --0.0823065f,0.924037f,0.373337f, -0.102263f,0.911082f,0.39934f, -0.325851f,0.888801f,0.322263f, -0.371159f,0.927767f,0.0385981f, -0.355076f,0.934525f,0.0241533f, -0.375158f,0.916478f,0.139015f, -0.286108f,0.953917f,-0.0904664f, -0.199009f,0.919897f,-0.337913f, -0.358636f,0.872243f,-0.332523f, -0.268543f,0.846175f,-0.460296f, -0.182977f,0.871041f,-0.455858f, -0.289295f,0.860781f,-0.418765f, -0.382576f,0.820168f,-0.425393f, -0.183794f,0.780369f,-0.597699f, -0.239111f,0.770893f,-0.590381f, -0.11759f,0.781853f,-0.612273f, -0.0625615f,0.849006f,-0.524666f, -0.09237f,0.869569f,-0.485096f, -0.210947f,0.881757f,-0.421908f, -0.36331f,0.890409f,-0.274185f, -0.280816f,0.923638f,-0.260836f, -0.0186632f,0.936387f,-0.350473f, --0.00764646f,0.914133f,-0.405343f, -0.0383964f,0.885647f,-0.462769f, -0.0296537f,0.913944f,-0.404755f, --0.02984f,0.920171f,-0.390377f, --0.172982f,0.943792f,-0.281663f, --0.19032f,0.979403f,0.0674393f, --0.205961f,0.972526f,0.108505f, -}; - -btScalar Landscape08Tex[] = { -0.0f,0.757813f, -0.0f,0.75f, -0.0078125f,0.757813f, -0.0078125f,0.75f, -0.015625f,0.757813f, -0.015625f,0.75f, -0.0234375f,0.757813f, -0.0234375f,0.75f, -0.03125f,0.757813f, -0.03125f,0.75f, -0.0390625f,0.757813f, -0.0390625f,0.75f, -0.046875f,0.757813f, -0.046875f,0.75f, -0.0546875f,0.757813f, -0.0546875f,0.75f, -0.0625f,0.757813f, -0.0625f,0.75f, -0.0703125f,0.757813f, -0.0703125f,0.75f, -0.078125f,0.757813f, -0.078125f,0.75f, -0.0859375f,0.757813f, -0.0859375f,0.75f, -0.09375f,0.757813f, -0.09375f,0.75f, -0.101563f,0.757813f, -0.101563f,0.75f, -0.109375f,0.757813f, -0.109375f,0.75f, -0.117188f,0.757813f, -0.117188f,0.75f, -0.125f,0.757813f, -0.125f,0.75f, -0.132813f,0.757813f, -0.132813f,0.75f, -0.140625f,0.757813f, -0.140625f,0.75f, -0.148438f,0.757813f, -0.148438f,0.75f, -0.15625f,0.757813f, -0.15625f,0.75f, -0.164063f,0.757813f, -0.164063f,0.75f, -0.171875f,0.757813f, -0.171875f,0.75f, -0.179688f,0.757813f, -0.179688f,0.75f, -0.1875f,0.757813f, -0.1875f,0.75f, -0.195313f,0.757813f, -0.195313f,0.75f, -0.203125f,0.757813f, -0.203125f,0.75f, -0.210938f,0.757813f, -0.210938f,0.75f, -0.21875f,0.757813f, -0.21875f,0.75f, -0.226563f,0.757813f, -0.226563f,0.75f, -0.234375f,0.757813f, -0.234375f,0.75f, -0.242188f,0.757813f, -0.242188f,0.75f, -0.25f,0.757813f, -0.25f,0.75f, -0.257813f,0.757813f, -0.257813f,0.75f, -0.265625f,0.757813f, -0.265625f,0.75f, -0.273438f,0.757813f, -0.273438f,0.75f, -0.28125f,0.757813f, -0.28125f,0.75f, -0.289063f,0.757813f, -0.289063f,0.75f, -0.296875f,0.757813f, -0.296875f,0.75f, -0.304688f,0.757813f, -0.304688f,0.75f, -0.3125f,0.757813f, -0.3125f,0.75f, -0.320313f,0.757813f, -0.320313f,0.75f, -0.328125f,0.757813f, -0.328125f,0.75f, -0.335938f,0.757813f, -0.335938f,0.75f, -0.34375f,0.757813f, -0.34375f,0.75f, -0.351563f,0.757813f, -0.351563f,0.75f, -0.359375f,0.757813f, -0.359375f,0.75f, -0.367188f,0.757813f, -0.367188f,0.75f, -0.375f,0.757813f, -0.375f,0.75f, -0.382813f,0.757813f, -0.382813f,0.75f, -0.390625f,0.757813f, -0.390625f,0.75f, -0.398438f,0.757813f, -0.398438f,0.75f, -0.40625f,0.757813f, -0.40625f,0.75f, -0.414063f,0.757813f, -0.414063f,0.75f, -0.421875f,0.757813f, -0.421875f,0.75f, -0.429688f,0.757813f, -0.429688f,0.75f, -0.4375f,0.757813f, -0.4375f,0.75f, -0.445313f,0.757813f, -0.445313f,0.75f, -0.453125f,0.757813f, -0.453125f,0.75f, -0.460938f,0.757813f, -0.460938f,0.75f, -0.46875f,0.757813f, -0.46875f,0.75f, -0.476563f,0.757813f, -0.476563f,0.75f, -0.484375f,0.757813f, -0.484375f,0.75f, -0.492188f,0.757813f, -0.492188f,0.75f, -0.5f,0.757813f, -0.5f,0.75f, -0.507813f,0.757813f, -0.507813f,0.75f, -0.0f,0.765625f, -0.0078125f,0.765625f, -0.015625f,0.765625f, -0.0234375f,0.765625f, -0.03125f,0.765625f, -0.0390625f,0.765625f, -0.046875f,0.765625f, -0.0546875f,0.765625f, -0.0625f,0.765625f, -0.0703125f,0.765625f, -0.078125f,0.765625f, -0.0859375f,0.765625f, -0.09375f,0.765625f, -0.101563f,0.765625f, -0.109375f,0.765625f, -0.117188f,0.765625f, -0.125f,0.765625f, -0.132813f,0.765625f, -0.140625f,0.765625f, -0.148438f,0.765625f, -0.15625f,0.765625f, -0.164063f,0.765625f, -0.171875f,0.765625f, -0.179688f,0.765625f, -0.1875f,0.765625f, -0.195313f,0.765625f, -0.203125f,0.765625f, -0.210938f,0.765625f, -0.21875f,0.765625f, -0.226563f,0.765625f, -0.234375f,0.765625f, -0.242188f,0.765625f, -0.25f,0.765625f, -0.257813f,0.765625f, -0.265625f,0.765625f, -0.273438f,0.765625f, -0.28125f,0.765625f, -0.289063f,0.765625f, -0.296875f,0.765625f, -0.304688f,0.765625f, -0.3125f,0.765625f, -0.320313f,0.765625f, -0.328125f,0.765625f, -0.335938f,0.765625f, -0.34375f,0.765625f, -0.351563f,0.765625f, -0.359375f,0.765625f, -0.367188f,0.765625f, -0.375f,0.765625f, -0.382813f,0.765625f, -0.390625f,0.765625f, -0.398438f,0.765625f, -0.40625f,0.765625f, -0.414063f,0.765625f, -0.421875f,0.765625f, -0.429688f,0.765625f, -0.4375f,0.765625f, -0.445313f,0.765625f, -0.453125f,0.765625f, -0.460938f,0.765625f, -0.46875f,0.765625f, -0.476563f,0.765625f, -0.484375f,0.765625f, -0.492188f,0.765625f, -0.5f,0.765625f, -0.507813f,0.765625f, -0.0f,0.773438f, -0.0078125f,0.773438f, -0.015625f,0.773438f, -0.0234375f,0.773438f, -0.03125f,0.773438f, -0.0390625f,0.773438f, -0.046875f,0.773438f, -0.0546875f,0.773438f, -0.0625f,0.773438f, -0.0703125f,0.773438f, -0.078125f,0.773438f, -0.0859375f,0.773438f, -0.09375f,0.773438f, -0.101563f,0.773438f, -0.109375f,0.773438f, -0.117188f,0.773438f, -0.125f,0.773438f, -0.132813f,0.773438f, -0.140625f,0.773438f, -0.148438f,0.773438f, -0.15625f,0.773438f, -0.164063f,0.773438f, -0.171875f,0.773438f, -0.179688f,0.773438f, -0.1875f,0.773438f, -0.195313f,0.773438f, -0.203125f,0.773438f, -0.210938f,0.773438f, -0.21875f,0.773438f, -0.226563f,0.773438f, -0.234375f,0.773438f, -0.242188f,0.773438f, -0.25f,0.773438f, -0.257813f,0.773438f, -0.265625f,0.773438f, -0.273438f,0.773438f, -0.28125f,0.773438f, -0.289063f,0.773438f, -0.296875f,0.773438f, -0.304688f,0.773438f, -0.3125f,0.773438f, -0.320313f,0.773438f, -0.328125f,0.773438f, -0.335938f,0.773438f, -0.34375f,0.773438f, -0.351563f,0.773438f, -0.359375f,0.773438f, -0.367188f,0.773438f, -0.375f,0.773438f, -0.382813f,0.773438f, -0.390625f,0.773438f, -0.398438f,0.773438f, -0.40625f,0.773438f, -0.414063f,0.773438f, -0.421875f,0.773438f, -0.429688f,0.773438f, -0.4375f,0.773438f, -0.445313f,0.773438f, -0.453125f,0.773438f, -0.460938f,0.773438f, -0.46875f,0.773438f, -0.476563f,0.773438f, -0.484375f,0.773438f, -0.492188f,0.773438f, -0.5f,0.773438f, -0.507813f,0.773438f, -0.0f,0.78125f, -0.0078125f,0.78125f, -0.015625f,0.78125f, -0.0234375f,0.78125f, -0.03125f,0.78125f, -0.0390625f,0.78125f, -0.046875f,0.78125f, -0.0546875f,0.78125f, -0.0625f,0.78125f, -0.0703125f,0.78125f, -0.078125f,0.78125f, -0.0859375f,0.78125f, -0.09375f,0.78125f, -0.101563f,0.78125f, -0.109375f,0.78125f, -0.117188f,0.78125f, -0.125f,0.78125f, -0.132813f,0.78125f, -0.140625f,0.78125f, -0.148438f,0.78125f, -0.15625f,0.78125f, -0.164063f,0.78125f, -0.171875f,0.78125f, -0.179688f,0.78125f, -0.1875f,0.78125f, -0.195313f,0.78125f, -0.203125f,0.78125f, -0.210938f,0.78125f, -0.21875f,0.78125f, -0.226563f,0.78125f, -0.234375f,0.78125f, -0.242188f,0.78125f, -0.25f,0.78125f, -0.257813f,0.78125f, -0.265625f,0.78125f, -0.273438f,0.78125f, -0.28125f,0.78125f, -0.289063f,0.78125f, -0.296875f,0.78125f, -0.304688f,0.78125f, -0.3125f,0.78125f, -0.320313f,0.78125f, -0.328125f,0.78125f, -0.335938f,0.78125f, -0.34375f,0.78125f, -0.351563f,0.78125f, -0.359375f,0.78125f, -0.367188f,0.78125f, -0.375f,0.78125f, -0.382813f,0.78125f, -0.390625f,0.78125f, -0.398438f,0.78125f, -0.40625f,0.78125f, -0.414063f,0.78125f, -0.421875f,0.78125f, -0.429688f,0.78125f, -0.4375f,0.78125f, -0.445313f,0.78125f, -0.453125f,0.78125f, -0.460938f,0.78125f, -0.46875f,0.78125f, -0.476563f,0.78125f, -0.484375f,0.78125f, -0.492188f,0.78125f, -0.5f,0.78125f, -0.507813f,0.78125f, -0.0f,0.789063f, -0.0078125f,0.789063f, -0.015625f,0.789063f, -0.0234375f,0.789063f, -0.03125f,0.789063f, -0.0390625f,0.789063f, -0.046875f,0.789063f, -0.0546875f,0.789063f, -0.0625f,0.789063f, -0.0703125f,0.789063f, -0.078125f,0.789063f, -0.0859375f,0.789063f, -0.09375f,0.789063f, -0.101563f,0.789063f, -0.109375f,0.789063f, -0.117188f,0.789063f, -0.125f,0.789063f, -0.132813f,0.789063f, -0.140625f,0.789063f, -0.148438f,0.789063f, -0.15625f,0.789063f, -0.164063f,0.789063f, -0.171875f,0.789063f, -0.179688f,0.789063f, -0.1875f,0.789063f, -0.195313f,0.789063f, -0.203125f,0.789063f, -0.210938f,0.789063f, -0.21875f,0.789063f, -0.226563f,0.789063f, -0.234375f,0.789063f, -0.242188f,0.789063f, -0.25f,0.789063f, -0.257813f,0.789063f, -0.265625f,0.789063f, -0.273438f,0.789063f, -0.28125f,0.789063f, -0.289063f,0.789063f, -0.296875f,0.789063f, -0.304688f,0.789063f, -0.3125f,0.789063f, -0.320313f,0.789063f, -0.328125f,0.789063f, -0.335938f,0.789063f, -0.34375f,0.789063f, -0.351563f,0.789063f, -0.359375f,0.789063f, -0.367188f,0.789063f, -0.375f,0.789063f, -0.382813f,0.789063f, -0.390625f,0.789063f, -0.398438f,0.789063f, -0.40625f,0.789063f, -0.414063f,0.789063f, -0.421875f,0.789063f, -0.429688f,0.789063f, -0.4375f,0.789063f, -0.445313f,0.789063f, -0.453125f,0.789063f, -0.460938f,0.789063f, -0.46875f,0.789063f, -0.476563f,0.789063f, -0.484375f,0.789063f, -0.492188f,0.789063f, -0.5f,0.789063f, -0.507813f,0.789063f, -0.0f,0.796875f, -0.0078125f,0.796875f, -0.015625f,0.796875f, -0.0234375f,0.796875f, -0.03125f,0.796875f, -0.0390625f,0.796875f, -0.046875f,0.796875f, -0.0546875f,0.796875f, -0.0625f,0.796875f, -0.0703125f,0.796875f, -0.078125f,0.796875f, -0.0859375f,0.796875f, -0.09375f,0.796875f, -0.101563f,0.796875f, -0.109375f,0.796875f, -0.117188f,0.796875f, -0.125f,0.796875f, -0.132813f,0.796875f, -0.140625f,0.796875f, -0.148438f,0.796875f, -0.15625f,0.796875f, -0.164063f,0.796875f, -0.171875f,0.796875f, -0.179688f,0.796875f, -0.1875f,0.796875f, -0.195313f,0.796875f, -0.203125f,0.796875f, -0.210938f,0.796875f, -0.21875f,0.796875f, -0.226563f,0.796875f, -0.234375f,0.796875f, -0.242188f,0.796875f, -0.25f,0.796875f, -0.257813f,0.796875f, -0.265625f,0.796875f, -0.273438f,0.796875f, -0.28125f,0.796875f, -0.289063f,0.796875f, -0.296875f,0.796875f, -0.304688f,0.796875f, -0.3125f,0.796875f, -0.320313f,0.796875f, -0.328125f,0.796875f, -0.335938f,0.796875f, -0.34375f,0.796875f, -0.351563f,0.796875f, -0.359375f,0.796875f, -0.367188f,0.796875f, -0.375f,0.796875f, -0.382813f,0.796875f, -0.390625f,0.796875f, -0.398438f,0.796875f, -0.40625f,0.796875f, -0.414063f,0.796875f, -0.421875f,0.796875f, -0.429688f,0.796875f, -0.4375f,0.796875f, -0.445313f,0.796875f, -0.453125f,0.796875f, -0.460938f,0.796875f, -0.46875f,0.796875f, -0.476563f,0.796875f, -0.484375f,0.796875f, -0.492188f,0.796875f, -0.5f,0.796875f, -0.507813f,0.796875f, -0.0f,0.804688f, -0.0078125f,0.804688f, -0.015625f,0.804688f, -0.0234375f,0.804688f, -0.03125f,0.804688f, -0.0390625f,0.804688f, -0.046875f,0.804688f, -0.0546875f,0.804688f, -0.0625f,0.804688f, -0.0703125f,0.804688f, -0.078125f,0.804688f, -0.0859375f,0.804688f, -0.09375f,0.804688f, -0.101563f,0.804688f, -0.109375f,0.804688f, -0.117188f,0.804688f, -0.125f,0.804688f, -0.132813f,0.804688f, -0.140625f,0.804688f, -0.148438f,0.804688f, -0.15625f,0.804688f, -0.164063f,0.804688f, -0.171875f,0.804688f, -0.179688f,0.804688f, -0.1875f,0.804688f, -0.195313f,0.804688f, -0.203125f,0.804688f, -0.210938f,0.804688f, -0.21875f,0.804688f, -0.226563f,0.804688f, -0.234375f,0.804688f, -0.242188f,0.804688f, -0.25f,0.804688f, -0.257813f,0.804688f, -0.265625f,0.804688f, -0.273438f,0.804688f, -0.28125f,0.804688f, -0.289063f,0.804688f, -0.296875f,0.804688f, -0.304688f,0.804688f, -0.3125f,0.804688f, -0.320313f,0.804688f, -0.328125f,0.804688f, -0.335938f,0.804688f, -0.34375f,0.804688f, -0.351563f,0.804688f, -0.359375f,0.804688f, -0.367188f,0.804688f, -0.375f,0.804688f, -0.382813f,0.804688f, -0.390625f,0.804688f, -0.398438f,0.804688f, -0.40625f,0.804688f, -0.414063f,0.804688f, -0.421875f,0.804688f, -0.429688f,0.804688f, -0.4375f,0.804688f, -0.445313f,0.804688f, -0.453125f,0.804688f, -0.460938f,0.804688f, -0.46875f,0.804688f, -0.476563f,0.804688f, -0.484375f,0.804688f, -0.492188f,0.804688f, -0.5f,0.804688f, -0.507813f,0.804688f, -0.0f,0.8125f, -0.0078125f,0.8125f, -0.015625f,0.8125f, -0.0234375f,0.8125f, -0.03125f,0.8125f, -0.0390625f,0.8125f, -0.046875f,0.8125f, -0.0546875f,0.8125f, -0.0625f,0.8125f, -0.0703125f,0.8125f, -0.078125f,0.8125f, -0.0859375f,0.8125f, -0.09375f,0.8125f, -0.101563f,0.8125f, -0.109375f,0.8125f, -0.117188f,0.8125f, -0.125f,0.8125f, -0.132813f,0.8125f, -0.140625f,0.8125f, -0.148438f,0.8125f, -0.15625f,0.8125f, -0.164063f,0.8125f, -0.171875f,0.8125f, -0.179688f,0.8125f, -0.1875f,0.8125f, -0.195313f,0.8125f, -0.203125f,0.8125f, -0.210938f,0.8125f, -0.21875f,0.8125f, -0.226563f,0.8125f, -0.234375f,0.8125f, -0.242188f,0.8125f, -0.25f,0.8125f, -0.257813f,0.8125f, -0.265625f,0.8125f, -0.273438f,0.8125f, -0.28125f,0.8125f, -0.289063f,0.8125f, -0.296875f,0.8125f, -0.304688f,0.8125f, -0.3125f,0.8125f, -0.320313f,0.8125f, -0.328125f,0.8125f, -0.335938f,0.8125f, -0.34375f,0.8125f, -0.351563f,0.8125f, -0.359375f,0.8125f, -0.367188f,0.8125f, -0.375f,0.8125f, -0.382813f,0.8125f, -0.390625f,0.8125f, -0.398438f,0.8125f, -0.40625f,0.8125f, -0.414063f,0.8125f, -0.421875f,0.8125f, -0.429688f,0.8125f, -0.4375f,0.8125f, -0.445313f,0.8125f, -0.453125f,0.8125f, -0.460938f,0.8125f, -0.46875f,0.8125f, -0.476563f,0.8125f, -0.484375f,0.8125f, -0.492188f,0.8125f, -0.5f,0.8125f, -0.507813f,0.8125f, -0.0f,0.820313f, -0.0078125f,0.820313f, -0.015625f,0.820313f, -0.0234375f,0.820313f, -0.03125f,0.820313f, -0.0390625f,0.820313f, -0.046875f,0.820313f, -0.0546875f,0.820313f, -0.0625f,0.820313f, -0.0703125f,0.820313f, -0.078125f,0.820313f, -0.0859375f,0.820313f, -0.09375f,0.820313f, -0.101563f,0.820313f, -0.109375f,0.820313f, -0.117188f,0.820313f, -0.125f,0.820313f, -0.132813f,0.820313f, -0.140625f,0.820313f, -0.148438f,0.820313f, -0.15625f,0.820313f, -0.164063f,0.820313f, -0.171875f,0.820313f, -0.179688f,0.820313f, -0.1875f,0.820313f, -0.195313f,0.820313f, -0.203125f,0.820313f, -0.210938f,0.820313f, -0.21875f,0.820313f, -0.226563f,0.820313f, -0.234375f,0.820313f, -0.242188f,0.820313f, -0.25f,0.820313f, -0.257813f,0.820313f, -0.265625f,0.820313f, -0.273438f,0.820313f, -0.28125f,0.820313f, -0.289063f,0.820313f, -0.296875f,0.820313f, -0.304688f,0.820313f, -0.3125f,0.820313f, -0.320313f,0.820313f, -0.328125f,0.820313f, -0.335938f,0.820313f, -0.34375f,0.820313f, -0.351563f,0.820313f, -0.359375f,0.820313f, -0.367188f,0.820313f, -0.375f,0.820313f, -0.382813f,0.820313f, -0.390625f,0.820313f, -0.398438f,0.820313f, -0.40625f,0.820313f, -0.414063f,0.820313f, -0.421875f,0.820313f, -0.429688f,0.820313f, -0.4375f,0.820313f, -0.445313f,0.820313f, -0.453125f,0.820313f, -0.460938f,0.820313f, -0.46875f,0.820313f, -0.476563f,0.820313f, -0.484375f,0.820313f, -0.492188f,0.820313f, -0.5f,0.820313f, -0.507813f,0.820313f, -0.0f,0.828125f, -0.0078125f,0.828125f, -0.015625f,0.828125f, -0.0234375f,0.828125f, -0.03125f,0.828125f, -0.0390625f,0.828125f, -0.046875f,0.828125f, -0.0546875f,0.828125f, -0.0625f,0.828125f, -0.0703125f,0.828125f, -0.078125f,0.828125f, -0.0859375f,0.828125f, -0.09375f,0.828125f, -0.101563f,0.828125f, -0.109375f,0.828125f, -0.117188f,0.828125f, -0.125f,0.828125f, -0.132813f,0.828125f, -0.140625f,0.828125f, -0.148438f,0.828125f, -0.15625f,0.828125f, -0.164063f,0.828125f, -0.171875f,0.828125f, -0.179688f,0.828125f, -0.1875f,0.828125f, -0.195313f,0.828125f, -0.203125f,0.828125f, -0.210938f,0.828125f, -0.21875f,0.828125f, -0.226563f,0.828125f, -0.234375f,0.828125f, -0.242188f,0.828125f, -0.25f,0.828125f, -0.257813f,0.828125f, -0.265625f,0.828125f, -0.273438f,0.828125f, -0.28125f,0.828125f, -0.289063f,0.828125f, -0.296875f,0.828125f, -0.304688f,0.828125f, -0.3125f,0.828125f, -0.320313f,0.828125f, -0.328125f,0.828125f, -0.335938f,0.828125f, -0.34375f,0.828125f, -0.351563f,0.828125f, -0.359375f,0.828125f, -0.367188f,0.828125f, -0.375f,0.828125f, -0.382813f,0.828125f, -0.390625f,0.828125f, -0.398438f,0.828125f, -0.40625f,0.828125f, -0.414063f,0.828125f, -0.421875f,0.828125f, -0.429688f,0.828125f, -0.4375f,0.828125f, -0.445313f,0.828125f, -0.453125f,0.828125f, -0.460938f,0.828125f, -0.46875f,0.828125f, -0.476563f,0.828125f, -0.484375f,0.828125f, -0.492188f,0.828125f, -0.5f,0.828125f, -0.507813f,0.828125f, -0.0f,0.835938f, -0.0078125f,0.835938f, -0.015625f,0.835938f, -0.0234375f,0.835938f, -0.03125f,0.835938f, -0.0390625f,0.835938f, -0.046875f,0.835938f, -0.0546875f,0.835938f, -0.0625f,0.835938f, -0.0703125f,0.835938f, -0.078125f,0.835938f, -0.0859375f,0.835938f, -0.09375f,0.835938f, -0.101563f,0.835938f, -0.109375f,0.835938f, -0.117188f,0.835938f, -0.125f,0.835938f, -0.132813f,0.835938f, -0.140625f,0.835938f, -0.148438f,0.835938f, -0.15625f,0.835938f, -0.164063f,0.835938f, -0.171875f,0.835938f, -0.179688f,0.835938f, -0.1875f,0.835938f, -0.195313f,0.835938f, -0.203125f,0.835938f, -0.210938f,0.835938f, -0.21875f,0.835938f, -0.226563f,0.835938f, -0.234375f,0.835938f, -0.242188f,0.835938f, -0.25f,0.835938f, -0.257813f,0.835938f, -0.265625f,0.835938f, -0.273438f,0.835938f, -0.28125f,0.835938f, -0.289063f,0.835938f, -0.296875f,0.835938f, -0.304688f,0.835938f, -0.3125f,0.835938f, -0.320313f,0.835938f, -0.328125f,0.835938f, -0.335938f,0.835938f, -0.34375f,0.835938f, -0.351563f,0.835938f, -0.359375f,0.835938f, -0.367188f,0.835938f, -0.375f,0.835938f, -0.382813f,0.835938f, -0.390625f,0.835938f, -0.398438f,0.835938f, -0.40625f,0.835938f, -0.414063f,0.835938f, -0.421875f,0.835938f, -0.429688f,0.835938f, -0.4375f,0.835938f, -0.445313f,0.835938f, -0.453125f,0.835938f, -0.460938f,0.835938f, -0.46875f,0.835938f, -0.476563f,0.835938f, -0.484375f,0.835938f, -0.492188f,0.835938f, -0.5f,0.835938f, -0.507813f,0.835938f, -0.0f,0.84375f, -0.0078125f,0.84375f, -0.015625f,0.84375f, -0.0234375f,0.84375f, -0.03125f,0.84375f, -0.0390625f,0.84375f, -0.046875f,0.84375f, -0.0546875f,0.84375f, -0.0625f,0.84375f, -0.0703125f,0.84375f, -0.078125f,0.84375f, -0.0859375f,0.84375f, -0.09375f,0.84375f, -0.101563f,0.84375f, -0.109375f,0.84375f, -0.117188f,0.84375f, -0.125f,0.84375f, -0.132813f,0.84375f, -0.140625f,0.84375f, -0.148438f,0.84375f, -0.15625f,0.84375f, -0.164063f,0.84375f, -0.171875f,0.84375f, -0.179688f,0.84375f, -0.1875f,0.84375f, -0.195313f,0.84375f, -0.203125f,0.84375f, -0.210938f,0.84375f, -0.21875f,0.84375f, -0.226563f,0.84375f, -0.234375f,0.84375f, -0.242188f,0.84375f, -0.25f,0.84375f, -0.257813f,0.84375f, -0.265625f,0.84375f, -0.273438f,0.84375f, -0.28125f,0.84375f, -0.289063f,0.84375f, -0.296875f,0.84375f, -0.304688f,0.84375f, -0.3125f,0.84375f, -0.320313f,0.84375f, -0.328125f,0.84375f, -0.335938f,0.84375f, -0.34375f,0.84375f, -0.351563f,0.84375f, -0.359375f,0.84375f, -0.367188f,0.84375f, -0.375f,0.84375f, -0.382813f,0.84375f, -0.390625f,0.84375f, -0.398438f,0.84375f, -0.40625f,0.84375f, -0.414063f,0.84375f, -0.421875f,0.84375f, -0.429688f,0.84375f, -0.4375f,0.84375f, -0.445313f,0.84375f, -0.453125f,0.84375f, -0.460938f,0.84375f, -0.46875f,0.84375f, -0.476563f,0.84375f, -0.484375f,0.84375f, -0.492188f,0.84375f, -0.5f,0.84375f, -0.507813f,0.84375f, -0.0f,0.851563f, -0.0078125f,0.851563f, -0.015625f,0.851563f, -0.0234375f,0.851563f, -0.03125f,0.851563f, -0.0390625f,0.851563f, -0.046875f,0.851563f, -0.0546875f,0.851563f, -0.0625f,0.851563f, -0.0703125f,0.851563f, -0.078125f,0.851563f, -0.0859375f,0.851563f, -0.09375f,0.851563f, -0.101563f,0.851563f, -0.109375f,0.851563f, -0.117188f,0.851563f, -0.125f,0.851563f, -0.132813f,0.851563f, -0.140625f,0.851563f, -0.148438f,0.851563f, -0.15625f,0.851563f, -0.164063f,0.851563f, -0.171875f,0.851563f, -0.179688f,0.851563f, -0.1875f,0.851563f, -0.195313f,0.851563f, -0.203125f,0.851563f, -0.210938f,0.851563f, -0.21875f,0.851563f, -0.226563f,0.851563f, -0.234375f,0.851563f, -0.242188f,0.851563f, -0.25f,0.851563f, -0.257813f,0.851563f, -0.265625f,0.851563f, -0.273438f,0.851563f, -0.28125f,0.851563f, -0.289063f,0.851563f, -0.296875f,0.851563f, -0.304688f,0.851563f, -0.3125f,0.851563f, -0.320313f,0.851563f, -0.328125f,0.851563f, -0.335938f,0.851563f, -0.34375f,0.851563f, -0.351563f,0.851563f, -0.359375f,0.851563f, -0.367188f,0.851563f, -0.375f,0.851563f, -0.382813f,0.851563f, -0.390625f,0.851563f, -0.398438f,0.851563f, -0.40625f,0.851563f, -0.414063f,0.851563f, -0.421875f,0.851563f, -0.429688f,0.851563f, -0.4375f,0.851563f, -0.445313f,0.851563f, -0.453125f,0.851563f, -0.460938f,0.851563f, -0.46875f,0.851563f, -0.476563f,0.851563f, -0.484375f,0.851563f, -0.492188f,0.851563f, -0.5f,0.851563f, -0.507813f,0.851563f, -0.0f,0.859375f, -0.0078125f,0.859375f, -0.015625f,0.859375f, -0.0234375f,0.859375f, -0.03125f,0.859375f, -0.0390625f,0.859375f, -0.046875f,0.859375f, -0.0546875f,0.859375f, -0.0625f,0.859375f, -0.0703125f,0.859375f, -0.078125f,0.859375f, -0.0859375f,0.859375f, -0.09375f,0.859375f, -0.101563f,0.859375f, -0.109375f,0.859375f, -0.117188f,0.859375f, -0.125f,0.859375f, -0.132813f,0.859375f, -0.140625f,0.859375f, -0.148438f,0.859375f, -0.15625f,0.859375f, -0.164063f,0.859375f, -0.171875f,0.859375f, -0.179688f,0.859375f, -0.1875f,0.859375f, -0.195313f,0.859375f, -0.203125f,0.859375f, -0.210938f,0.859375f, -0.21875f,0.859375f, -0.226563f,0.859375f, -0.234375f,0.859375f, -0.242188f,0.859375f, -0.25f,0.859375f, -0.257813f,0.859375f, -0.265625f,0.859375f, -0.273438f,0.859375f, -0.28125f,0.859375f, -0.289063f,0.859375f, -0.296875f,0.859375f, -0.304688f,0.859375f, -0.3125f,0.859375f, -0.320313f,0.859375f, -0.328125f,0.859375f, -0.335938f,0.859375f, -0.34375f,0.859375f, -0.351563f,0.859375f, -0.359375f,0.859375f, -0.367188f,0.859375f, -0.375f,0.859375f, -0.382813f,0.859375f, -0.390625f,0.859375f, -0.398438f,0.859375f, -0.40625f,0.859375f, -0.414063f,0.859375f, -0.421875f,0.859375f, -0.429688f,0.859375f, -0.4375f,0.859375f, -0.445313f,0.859375f, -0.453125f,0.859375f, -0.460938f,0.859375f, -0.46875f,0.859375f, -0.476563f,0.859375f, -0.484375f,0.859375f, -0.492188f,0.859375f, -0.5f,0.859375f, -0.507813f,0.859375f, -0.0f,0.867188f, -0.0078125f,0.867188f, -0.015625f,0.867188f, -0.0234375f,0.867188f, -0.03125f,0.867188f, -0.0390625f,0.867188f, -0.046875f,0.867188f, -0.0546875f,0.867188f, -0.0625f,0.867188f, -0.0703125f,0.867188f, -0.078125f,0.867188f, -0.0859375f,0.867188f, -0.09375f,0.867188f, -0.101563f,0.867188f, -0.109375f,0.867188f, -0.117188f,0.867188f, -0.125f,0.867188f, -0.132813f,0.867188f, -0.140625f,0.867188f, -0.148438f,0.867188f, -0.15625f,0.867188f, -0.164063f,0.867188f, -0.171875f,0.867188f, -0.179688f,0.867188f, -0.1875f,0.867188f, -0.195313f,0.867188f, -0.203125f,0.867188f, -0.210938f,0.867188f, -0.21875f,0.867188f, -0.226563f,0.867188f, -0.234375f,0.867188f, -0.242188f,0.867188f, -0.25f,0.867188f, -0.257813f,0.867188f, -0.265625f,0.867188f, -0.273438f,0.867188f, -0.28125f,0.867188f, -0.289063f,0.867188f, -0.296875f,0.867188f, -0.304688f,0.867188f, -0.3125f,0.867188f, -0.320313f,0.867188f, -0.328125f,0.867188f, -0.335938f,0.867188f, -0.34375f,0.867188f, -0.351563f,0.867188f, -0.359375f,0.867188f, -0.367188f,0.867188f, -0.375f,0.867188f, -0.382813f,0.867188f, -0.390625f,0.867188f, -0.398438f,0.867188f, -0.40625f,0.867188f, -0.414063f,0.867188f, -0.421875f,0.867188f, -0.429688f,0.867188f, -0.4375f,0.867188f, -0.445313f,0.867188f, -0.453125f,0.867188f, -0.460938f,0.867188f, -0.46875f,0.867188f, -0.476563f,0.867188f, -0.484375f,0.867188f, -0.492188f,0.867188f, -0.5f,0.867188f, -0.507813f,0.867188f, -0.0f,0.875f, -0.0078125f,0.875f, -0.015625f,0.875f, -0.0234375f,0.875f, -0.03125f,0.875f, -0.0390625f,0.875f, -0.046875f,0.875f, -0.0546875f,0.875f, -0.0625f,0.875f, -0.0703125f,0.875f, -0.078125f,0.875f, -0.0859375f,0.875f, -0.09375f,0.875f, -0.101563f,0.875f, -0.109375f,0.875f, -0.117188f,0.875f, -0.125f,0.875f, -0.132813f,0.875f, -0.140625f,0.875f, -0.148438f,0.875f, -0.15625f,0.875f, -0.164063f,0.875f, -0.171875f,0.875f, -0.179688f,0.875f, -0.1875f,0.875f, -0.195313f,0.875f, -0.203125f,0.875f, -0.210938f,0.875f, -0.21875f,0.875f, -0.226563f,0.875f, -0.234375f,0.875f, -0.242188f,0.875f, -0.25f,0.875f, -0.257813f,0.875f, -0.265625f,0.875f, -0.273438f,0.875f, -0.28125f,0.875f, -0.289063f,0.875f, -0.296875f,0.875f, -0.304688f,0.875f, -0.3125f,0.875f, -0.320313f,0.875f, -0.328125f,0.875f, -0.335938f,0.875f, -0.34375f,0.875f, -0.351563f,0.875f, -0.359375f,0.875f, -0.367188f,0.875f, -0.375f,0.875f, -0.382813f,0.875f, -0.390625f,0.875f, -0.398438f,0.875f, -0.40625f,0.875f, -0.414063f,0.875f, -0.421875f,0.875f, -0.429688f,0.875f, -0.4375f,0.875f, -0.445313f,0.875f, -0.453125f,0.875f, -0.460938f,0.875f, -0.46875f,0.875f, -0.476563f,0.875f, -0.484375f,0.875f, -0.492188f,0.875f, -0.5f,0.875f, -0.507813f,0.875f, -0.0f,0.882813f, -0.0078125f,0.882813f, -0.015625f,0.882813f, -0.0234375f,0.882813f, -0.03125f,0.882813f, -0.0390625f,0.882813f, -0.046875f,0.882813f, -0.0546875f,0.882813f, -0.0625f,0.882813f, -0.0703125f,0.882813f, -0.078125f,0.882813f, -0.0859375f,0.882813f, -0.09375f,0.882813f, -0.101563f,0.882813f, -0.109375f,0.882813f, -0.117188f,0.882813f, -0.125f,0.882813f, -0.132813f,0.882813f, -0.140625f,0.882813f, -0.148438f,0.882813f, -0.15625f,0.882813f, -0.164063f,0.882813f, -0.171875f,0.882813f, -0.179688f,0.882813f, -0.1875f,0.882813f, -0.195313f,0.882813f, -0.203125f,0.882813f, -0.210938f,0.882813f, -0.21875f,0.882813f, -0.226563f,0.882813f, -0.234375f,0.882813f, -0.242188f,0.882813f, -0.25f,0.882813f, -0.257813f,0.882813f, -0.265625f,0.882813f, -0.273438f,0.882813f, -0.28125f,0.882813f, -0.289063f,0.882813f, -0.296875f,0.882813f, -0.304688f,0.882813f, -0.3125f,0.882813f, -0.320313f,0.882813f, -0.328125f,0.882813f, -0.335938f,0.882813f, -0.34375f,0.882813f, -0.351563f,0.882813f, -0.359375f,0.882813f, -0.367188f,0.882813f, -0.375f,0.882813f, -0.382813f,0.882813f, -0.390625f,0.882813f, -0.398438f,0.882813f, -0.40625f,0.882813f, -0.414063f,0.882813f, -0.421875f,0.882813f, -0.429688f,0.882813f, -0.4375f,0.882813f, -0.445313f,0.882813f, -0.453125f,0.882813f, -0.460938f,0.882813f, -0.46875f,0.882813f, -0.476563f,0.882813f, -0.484375f,0.882813f, -0.492188f,0.882813f, -0.5f,0.882813f, -0.507813f,0.882813f, -0.0f,0.890625f, -0.0078125f,0.890625f, -0.015625f,0.890625f, -0.0234375f,0.890625f, -0.03125f,0.890625f, -0.0390625f,0.890625f, -0.046875f,0.890625f, -0.0546875f,0.890625f, -0.0625f,0.890625f, -0.0703125f,0.890625f, -0.078125f,0.890625f, -0.0859375f,0.890625f, -0.09375f,0.890625f, -0.101563f,0.890625f, -0.109375f,0.890625f, -0.117188f,0.890625f, -0.125f,0.890625f, -0.132813f,0.890625f, -0.140625f,0.890625f, -0.148438f,0.890625f, -0.15625f,0.890625f, -0.164063f,0.890625f, -0.171875f,0.890625f, -0.179688f,0.890625f, -0.1875f,0.890625f, -0.195313f,0.890625f, -0.203125f,0.890625f, -0.210938f,0.890625f, -0.21875f,0.890625f, -0.226563f,0.890625f, -0.234375f,0.890625f, -0.242188f,0.890625f, -0.25f,0.890625f, -0.257813f,0.890625f, -0.265625f,0.890625f, -0.273438f,0.890625f, -0.28125f,0.890625f, -0.289063f,0.890625f, -0.296875f,0.890625f, -0.304688f,0.890625f, -0.3125f,0.890625f, -0.320313f,0.890625f, -0.328125f,0.890625f, -0.335938f,0.890625f, -0.34375f,0.890625f, -0.351563f,0.890625f, -0.359375f,0.890625f, -0.367188f,0.890625f, -0.375f,0.890625f, -0.382813f,0.890625f, -0.390625f,0.890625f, -0.398438f,0.890625f, -0.40625f,0.890625f, -0.414063f,0.890625f, -0.421875f,0.890625f, -0.429688f,0.890625f, -0.4375f,0.890625f, -0.445313f,0.890625f, -0.453125f,0.890625f, -0.460938f,0.890625f, -0.46875f,0.890625f, -0.476563f,0.890625f, -0.484375f,0.890625f, -0.492188f,0.890625f, -0.5f,0.890625f, -0.507813f,0.890625f, -0.0f,0.898438f, -0.0078125f,0.898438f, -0.015625f,0.898438f, -0.0234375f,0.898438f, -0.03125f,0.898438f, -0.0390625f,0.898438f, -0.046875f,0.898438f, -0.0546875f,0.898438f, -0.0625f,0.898438f, -0.0703125f,0.898438f, -0.078125f,0.898438f, -0.0859375f,0.898438f, -0.09375f,0.898438f, -0.101563f,0.898438f, -0.109375f,0.898438f, -0.117188f,0.898438f, -0.125f,0.898438f, -0.132813f,0.898438f, -0.140625f,0.898438f, -0.148438f,0.898438f, -0.15625f,0.898438f, -0.164063f,0.898438f, -0.171875f,0.898438f, -0.179688f,0.898438f, -0.1875f,0.898438f, -0.195313f,0.898438f, -0.203125f,0.898438f, -0.210938f,0.898438f, -0.21875f,0.898438f, -0.226563f,0.898438f, -0.234375f,0.898438f, -0.242188f,0.898438f, -0.25f,0.898438f, -0.257813f,0.898438f, -0.265625f,0.898438f, -0.273438f,0.898438f, -0.28125f,0.898438f, -0.289063f,0.898438f, -0.296875f,0.898438f, -0.304688f,0.898438f, -0.3125f,0.898438f, -0.320313f,0.898438f, -0.328125f,0.898438f, -0.335938f,0.898438f, -0.34375f,0.898438f, -0.351563f,0.898438f, -0.359375f,0.898438f, -0.367188f,0.898438f, -0.375f,0.898438f, -0.382813f,0.898438f, -0.390625f,0.898438f, -0.398438f,0.898438f, -0.40625f,0.898438f, -0.414063f,0.898438f, -0.421875f,0.898438f, -0.429688f,0.898438f, -0.4375f,0.898438f, -0.445313f,0.898438f, -0.453125f,0.898438f, -0.460938f,0.898438f, -0.46875f,0.898438f, -0.476563f,0.898438f, -0.484375f,0.898438f, -0.492188f,0.898438f, -0.5f,0.898438f, -0.507813f,0.898438f, -0.0f,0.90625f, -0.0078125f,0.90625f, -0.015625f,0.90625f, -0.0234375f,0.90625f, -0.03125f,0.90625f, -0.0390625f,0.90625f, -0.046875f,0.90625f, -0.0546875f,0.90625f, -0.0625f,0.90625f, -0.0703125f,0.90625f, -0.078125f,0.90625f, -0.0859375f,0.90625f, -0.09375f,0.90625f, -0.101563f,0.90625f, -0.109375f,0.90625f, -0.117188f,0.90625f, -0.125f,0.90625f, -0.132813f,0.90625f, -0.140625f,0.90625f, -0.148438f,0.90625f, -0.15625f,0.90625f, -0.164063f,0.90625f, -0.171875f,0.90625f, -0.179688f,0.90625f, -0.1875f,0.90625f, -0.195313f,0.90625f, -0.203125f,0.90625f, -0.210938f,0.90625f, -0.21875f,0.90625f, -0.226563f,0.90625f, -0.234375f,0.90625f, -0.242188f,0.90625f, -0.25f,0.90625f, -0.257813f,0.90625f, -0.265625f,0.90625f, -0.273438f,0.90625f, -0.28125f,0.90625f, -0.289063f,0.90625f, -0.296875f,0.90625f, -0.304688f,0.90625f, -0.3125f,0.90625f, -0.320313f,0.90625f, -0.328125f,0.90625f, -0.335938f,0.90625f, -0.34375f,0.90625f, -0.351563f,0.90625f, -0.359375f,0.90625f, -0.367188f,0.90625f, -0.375f,0.90625f, -0.382813f,0.90625f, -0.390625f,0.90625f, -0.398438f,0.90625f, -0.40625f,0.90625f, -0.414063f,0.90625f, -0.421875f,0.90625f, -0.429688f,0.90625f, -0.4375f,0.90625f, -0.445313f,0.90625f, -0.453125f,0.90625f, -0.460938f,0.90625f, -0.46875f,0.90625f, -0.476563f,0.90625f, -0.484375f,0.90625f, -0.492188f,0.90625f, -0.5f,0.90625f, -0.507813f,0.90625f, -0.0f,0.914063f, -0.0078125f,0.914063f, -0.015625f,0.914063f, -0.0234375f,0.914063f, -0.03125f,0.914063f, -0.0390625f,0.914063f, -0.046875f,0.914063f, -0.0546875f,0.914063f, -0.0625f,0.914063f, -0.0703125f,0.914063f, -0.078125f,0.914063f, -0.0859375f,0.914063f, -0.09375f,0.914063f, -0.101563f,0.914063f, -0.109375f,0.914063f, -0.117188f,0.914063f, -0.125f,0.914063f, -0.132813f,0.914063f, -0.140625f,0.914063f, -0.148438f,0.914063f, -0.15625f,0.914063f, -0.164063f,0.914063f, -0.171875f,0.914063f, -0.179688f,0.914063f, -0.1875f,0.914063f, -0.195313f,0.914063f, -0.203125f,0.914063f, -0.210938f,0.914063f, -0.21875f,0.914063f, -0.226563f,0.914063f, -0.234375f,0.914063f, -0.242188f,0.914063f, -0.25f,0.914063f, -0.257813f,0.914063f, -0.265625f,0.914063f, -0.273438f,0.914063f, -0.28125f,0.914063f, -0.289063f,0.914063f, -0.296875f,0.914063f, -0.304688f,0.914063f, -0.3125f,0.914063f, -0.320313f,0.914063f, -0.328125f,0.914063f, -0.335938f,0.914063f, -0.34375f,0.914063f, -0.351563f,0.914063f, -0.359375f,0.914063f, -0.367188f,0.914063f, -0.375f,0.914063f, -0.382813f,0.914063f, -0.390625f,0.914063f, -0.398438f,0.914063f, -0.40625f,0.914063f, -0.414063f,0.914063f, -0.421875f,0.914063f, -0.429688f,0.914063f, -0.4375f,0.914063f, -0.445313f,0.914063f, -0.453125f,0.914063f, -0.460938f,0.914063f, -0.46875f,0.914063f, -0.476563f,0.914063f, -0.484375f,0.914063f, -0.492188f,0.914063f, -0.5f,0.914063f, -0.507813f,0.914063f, -0.0f,0.921875f, -0.0078125f,0.921875f, -0.015625f,0.921875f, -0.0234375f,0.921875f, -0.03125f,0.921875f, -0.0390625f,0.921875f, -0.046875f,0.921875f, -0.0546875f,0.921875f, -0.0625f,0.921875f, -0.0703125f,0.921875f, -0.078125f,0.921875f, -0.0859375f,0.921875f, -0.09375f,0.921875f, -0.101563f,0.921875f, -0.109375f,0.921875f, -0.117188f,0.921875f, -0.125f,0.921875f, -0.132813f,0.921875f, -0.140625f,0.921875f, -0.148438f,0.921875f, -0.15625f,0.921875f, -0.164063f,0.921875f, -0.171875f,0.921875f, -0.179688f,0.921875f, -0.1875f,0.921875f, -0.195313f,0.921875f, -0.203125f,0.921875f, -0.210938f,0.921875f, -0.21875f,0.921875f, -0.226563f,0.921875f, -0.234375f,0.921875f, -0.242188f,0.921875f, -0.25f,0.921875f, -0.257813f,0.921875f, -0.265625f,0.921875f, -0.273438f,0.921875f, -0.28125f,0.921875f, -0.289063f,0.921875f, -0.296875f,0.921875f, -0.304688f,0.921875f, -0.3125f,0.921875f, -0.320313f,0.921875f, -0.328125f,0.921875f, -0.335938f,0.921875f, -0.34375f,0.921875f, -0.351563f,0.921875f, -0.359375f,0.921875f, -0.367188f,0.921875f, -0.375f,0.921875f, -0.382813f,0.921875f, -0.390625f,0.921875f, -0.398438f,0.921875f, -0.40625f,0.921875f, -0.414063f,0.921875f, -0.421875f,0.921875f, -0.429688f,0.921875f, -0.4375f,0.921875f, -0.445313f,0.921875f, -0.453125f,0.921875f, -0.460938f,0.921875f, -0.46875f,0.921875f, -0.476563f,0.921875f, -0.484375f,0.921875f, -0.492188f,0.921875f, -0.5f,0.921875f, -0.507813f,0.921875f, -0.0f,0.929688f, -0.0078125f,0.929688f, -0.015625f,0.929688f, -0.0234375f,0.929688f, -0.03125f,0.929688f, -0.0390625f,0.929688f, -0.046875f,0.929688f, -0.0546875f,0.929688f, -0.0625f,0.929688f, -0.0703125f,0.929688f, -0.078125f,0.929688f, -0.0859375f,0.929688f, -0.09375f,0.929688f, -0.101563f,0.929688f, -0.109375f,0.929688f, -0.117188f,0.929688f, -0.125f,0.929688f, -0.132813f,0.929688f, -0.140625f,0.929688f, -0.148438f,0.929688f, -0.15625f,0.929688f, -0.164063f,0.929688f, -0.171875f,0.929688f, -0.179688f,0.929688f, -0.1875f,0.929688f, -0.195313f,0.929688f, -0.203125f,0.929688f, -0.210938f,0.929688f, -0.21875f,0.929688f, -0.226563f,0.929688f, -0.234375f,0.929688f, -0.242188f,0.929688f, -0.25f,0.929688f, -0.257813f,0.929688f, -0.265625f,0.929688f, -0.273438f,0.929688f, -0.28125f,0.929688f, -0.289063f,0.929688f, -0.296875f,0.929688f, -0.304688f,0.929688f, -0.3125f,0.929688f, -0.320313f,0.929688f, -0.328125f,0.929688f, -0.335938f,0.929688f, -0.34375f,0.929688f, -0.351563f,0.929688f, -0.359375f,0.929688f, -0.367188f,0.929688f, -0.375f,0.929688f, -0.382813f,0.929688f, -0.390625f,0.929688f, -0.398438f,0.929688f, -0.40625f,0.929688f, -0.414063f,0.929688f, -0.421875f,0.929688f, -0.429688f,0.929688f, -0.4375f,0.929688f, -0.445313f,0.929688f, -0.453125f,0.929688f, -0.460938f,0.929688f, -0.46875f,0.929688f, -0.476563f,0.929688f, -0.484375f,0.929688f, -0.492188f,0.929688f, -0.5f,0.929688f, -0.507813f,0.929688f, -0.0f,0.9375f, -0.0078125f,0.9375f, -0.015625f,0.9375f, -0.0234375f,0.9375f, -0.03125f,0.9375f, -0.0390625f,0.9375f, -0.046875f,0.9375f, -0.0546875f,0.9375f, -0.0625f,0.9375f, -0.0703125f,0.9375f, -0.078125f,0.9375f, -0.0859375f,0.9375f, -0.09375f,0.9375f, -0.101563f,0.9375f, -0.109375f,0.9375f, -0.117188f,0.9375f, -0.125f,0.9375f, -0.132813f,0.9375f, -0.140625f,0.9375f, -0.148438f,0.9375f, -0.15625f,0.9375f, -0.164063f,0.9375f, -0.171875f,0.9375f, -0.179688f,0.9375f, -0.1875f,0.9375f, -0.195313f,0.9375f, -0.203125f,0.9375f, -0.210938f,0.9375f, -0.21875f,0.9375f, -0.226563f,0.9375f, -0.234375f,0.9375f, -0.242188f,0.9375f, -0.25f,0.9375f, -0.257813f,0.9375f, -0.265625f,0.9375f, -0.273438f,0.9375f, -0.28125f,0.9375f, -0.289063f,0.9375f, -0.296875f,0.9375f, -0.304688f,0.9375f, -0.3125f,0.9375f, -0.320313f,0.9375f, -0.328125f,0.9375f, -0.335938f,0.9375f, -0.34375f,0.9375f, -0.351563f,0.9375f, -0.359375f,0.9375f, -0.367188f,0.9375f, -0.375f,0.9375f, -0.382813f,0.9375f, -0.390625f,0.9375f, -0.398438f,0.9375f, -0.40625f,0.9375f, -0.414063f,0.9375f, -0.421875f,0.9375f, -0.429688f,0.9375f, -0.4375f,0.9375f, -0.445313f,0.9375f, -0.453125f,0.9375f, -0.460938f,0.9375f, -0.46875f,0.9375f, -0.476563f,0.9375f, -0.484375f,0.9375f, -0.492188f,0.9375f, -0.5f,0.9375f, -0.507813f,0.9375f, -0.0f,0.945313f, -0.0078125f,0.945313f, -0.015625f,0.945313f, -0.0234375f,0.945313f, -0.03125f,0.945313f, -0.0390625f,0.945313f, -0.046875f,0.945313f, -0.0546875f,0.945313f, -0.0625f,0.945313f, -0.0703125f,0.945313f, -0.078125f,0.945313f, -0.0859375f,0.945313f, -0.09375f,0.945313f, -0.101563f,0.945313f, -0.109375f,0.945313f, -0.117188f,0.945313f, -0.125f,0.945313f, -0.132813f,0.945313f, -0.140625f,0.945313f, -0.148438f,0.945313f, -0.15625f,0.945313f, -0.164063f,0.945313f, -0.171875f,0.945313f, -0.179688f,0.945313f, -0.1875f,0.945313f, -0.195313f,0.945313f, -0.203125f,0.945313f, -0.210938f,0.945313f, -0.21875f,0.945313f, -0.226563f,0.945313f, -0.234375f,0.945313f, -0.242188f,0.945313f, -0.25f,0.945313f, -0.257813f,0.945313f, -0.265625f,0.945313f, -0.273438f,0.945313f, -0.28125f,0.945313f, -0.289063f,0.945313f, -0.296875f,0.945313f, -0.304688f,0.945313f, -0.3125f,0.945313f, -0.320313f,0.945313f, -0.328125f,0.945313f, -0.335938f,0.945313f, -0.34375f,0.945313f, -0.351563f,0.945313f, -0.359375f,0.945313f, -0.367188f,0.945313f, -0.375f,0.945313f, -0.382813f,0.945313f, -0.390625f,0.945313f, -0.398438f,0.945313f, -0.40625f,0.945313f, -0.414063f,0.945313f, -0.421875f,0.945313f, -0.429688f,0.945313f, -0.4375f,0.945313f, -0.445313f,0.945313f, -0.453125f,0.945313f, -0.460938f,0.945313f, -0.46875f,0.945313f, -0.476563f,0.945313f, -0.484375f,0.945313f, -0.492188f,0.945313f, -0.5f,0.945313f, -0.507813f,0.945313f, -0.0f,0.953125f, -0.0078125f,0.953125f, -0.015625f,0.953125f, -0.0234375f,0.953125f, -0.03125f,0.953125f, -0.0390625f,0.953125f, -0.046875f,0.953125f, -0.0546875f,0.953125f, -0.0625f,0.953125f, -0.0703125f,0.953125f, -0.078125f,0.953125f, -0.0859375f,0.953125f, -0.09375f,0.953125f, -0.101563f,0.953125f, -0.109375f,0.953125f, -0.117188f,0.953125f, -0.125f,0.953125f, -0.132813f,0.953125f, -0.140625f,0.953125f, -0.148438f,0.953125f, -0.15625f,0.953125f, -0.164063f,0.953125f, -0.171875f,0.953125f, -0.179688f,0.953125f, -0.1875f,0.953125f, -0.195313f,0.953125f, -0.203125f,0.953125f, -0.210938f,0.953125f, -0.21875f,0.953125f, -0.226563f,0.953125f, -0.234375f,0.953125f, -0.242188f,0.953125f, -0.25f,0.953125f, -0.257813f,0.953125f, -0.265625f,0.953125f, -0.273438f,0.953125f, -0.28125f,0.953125f, -0.289063f,0.953125f, -0.296875f,0.953125f, -0.304688f,0.953125f, -0.3125f,0.953125f, -0.320313f,0.953125f, -0.328125f,0.953125f, -0.335938f,0.953125f, -0.34375f,0.953125f, -0.351563f,0.953125f, -0.359375f,0.953125f, -0.367188f,0.953125f, -0.375f,0.953125f, -0.382813f,0.953125f, -0.390625f,0.953125f, -0.398438f,0.953125f, -0.40625f,0.953125f, -0.414063f,0.953125f, -0.421875f,0.953125f, -0.429688f,0.953125f, -0.4375f,0.953125f, -0.445313f,0.953125f, -0.453125f,0.953125f, -0.460938f,0.953125f, -0.46875f,0.953125f, -0.476563f,0.953125f, -0.484375f,0.953125f, -0.492188f,0.953125f, -0.5f,0.953125f, -0.507813f,0.953125f, -0.0f,0.960938f, -0.0078125f,0.960938f, -0.015625f,0.960938f, -0.0234375f,0.960938f, -0.03125f,0.960938f, -0.0390625f,0.960938f, -0.046875f,0.960938f, -0.0546875f,0.960938f, -0.0625f,0.960938f, -0.0703125f,0.960938f, -0.078125f,0.960938f, -0.0859375f,0.960938f, -0.09375f,0.960938f, -0.101563f,0.960938f, -0.109375f,0.960938f, -0.117188f,0.960938f, -0.125f,0.960938f, -0.132813f,0.960938f, -0.140625f,0.960938f, -0.148438f,0.960938f, -0.15625f,0.960938f, -0.164063f,0.960938f, -0.171875f,0.960938f, -0.179688f,0.960938f, -0.1875f,0.960938f, -0.195313f,0.960938f, -0.203125f,0.960938f, -0.210938f,0.960938f, -0.21875f,0.960938f, -0.226563f,0.960938f, -0.234375f,0.960938f, -0.242188f,0.960938f, -0.25f,0.960938f, -0.257813f,0.960938f, -0.265625f,0.960938f, -0.273438f,0.960938f, -0.28125f,0.960938f, -0.289063f,0.960938f, -0.296875f,0.960938f, -0.304688f,0.960938f, -0.3125f,0.960938f, -0.320313f,0.960938f, -0.328125f,0.960938f, -0.335938f,0.960938f, -0.34375f,0.960938f, -0.351563f,0.960938f, -0.359375f,0.960938f, -0.367188f,0.960938f, -0.375f,0.960938f, -0.382813f,0.960938f, -0.390625f,0.960938f, -0.398438f,0.960938f, -0.40625f,0.960938f, -0.414063f,0.960938f, -0.421875f,0.960938f, -0.429688f,0.960938f, -0.4375f,0.960938f, -0.445313f,0.960938f, -0.453125f,0.960938f, -0.460938f,0.960938f, -0.46875f,0.960938f, -0.476563f,0.960938f, -0.484375f,0.960938f, -0.492188f,0.960938f, -0.5f,0.960938f, -0.507813f,0.960938f, -0.0f,0.96875f, -0.0078125f,0.96875f, -0.015625f,0.96875f, -0.0234375f,0.96875f, -0.03125f,0.96875f, -0.0390625f,0.96875f, -0.046875f,0.96875f, -0.0546875f,0.96875f, -0.0625f,0.96875f, -0.0703125f,0.96875f, -0.078125f,0.96875f, -0.0859375f,0.96875f, -0.09375f,0.96875f, -0.101563f,0.96875f, -0.109375f,0.96875f, -0.117188f,0.96875f, -0.125f,0.96875f, -0.132813f,0.96875f, -0.140625f,0.96875f, -0.148438f,0.96875f, -0.15625f,0.96875f, -0.164063f,0.96875f, -0.171875f,0.96875f, -0.179688f,0.96875f, -0.1875f,0.96875f, -0.195313f,0.96875f, -0.203125f,0.96875f, -0.210938f,0.96875f, -0.21875f,0.96875f, -0.226563f,0.96875f, -0.234375f,0.96875f, -0.242188f,0.96875f, -0.25f,0.96875f, -0.257813f,0.96875f, -0.265625f,0.96875f, -0.273438f,0.96875f, -0.28125f,0.96875f, -0.289063f,0.96875f, -0.296875f,0.96875f, -0.304688f,0.96875f, -0.3125f,0.96875f, -0.320313f,0.96875f, -0.328125f,0.96875f, -0.335938f,0.96875f, -0.34375f,0.96875f, -0.351563f,0.96875f, -0.359375f,0.96875f, -0.367188f,0.96875f, -0.375f,0.96875f, -0.382813f,0.96875f, -0.390625f,0.96875f, -0.398438f,0.96875f, -0.40625f,0.96875f, -0.414063f,0.96875f, -0.421875f,0.96875f, -0.429688f,0.96875f, -0.4375f,0.96875f, -0.445313f,0.96875f, -0.453125f,0.96875f, -0.460938f,0.96875f, -0.46875f,0.96875f, -0.476563f,0.96875f, -0.484375f,0.96875f, -0.492188f,0.96875f, -0.5f,0.96875f, -0.507813f,0.96875f, -0.0f,0.976563f, -0.0078125f,0.976563f, -0.015625f,0.976563f, -0.0234375f,0.976563f, -0.03125f,0.976563f, -0.0390625f,0.976563f, -0.046875f,0.976563f, -0.0546875f,0.976563f, -0.0625f,0.976563f, -0.0703125f,0.976563f, -0.078125f,0.976563f, -0.0859375f,0.976563f, -0.09375f,0.976563f, -0.101563f,0.976563f, -0.109375f,0.976563f, -0.117188f,0.976563f, -0.125f,0.976563f, -0.132813f,0.976563f, -0.140625f,0.976563f, -0.148438f,0.976563f, -0.15625f,0.976563f, -0.164063f,0.976563f, -0.171875f,0.976563f, -0.179688f,0.976563f, -0.1875f,0.976563f, -0.195313f,0.976563f, -0.203125f,0.976563f, -0.210938f,0.976563f, -0.21875f,0.976563f, -0.226563f,0.976563f, -0.234375f,0.976563f, -0.242188f,0.976563f, -0.25f,0.976563f, -0.257813f,0.976563f, -0.265625f,0.976563f, -0.273438f,0.976563f, -0.28125f,0.976563f, -0.289063f,0.976563f, -0.296875f,0.976563f, -0.304688f,0.976563f, -0.3125f,0.976563f, -0.320313f,0.976563f, -0.328125f,0.976563f, -0.335938f,0.976563f, -0.34375f,0.976563f, -0.351563f,0.976563f, -0.359375f,0.976563f, -0.367188f,0.976563f, -0.375f,0.976563f, -0.382813f,0.976563f, -0.390625f,0.976563f, -0.398438f,0.976563f, -0.40625f,0.976563f, -0.414063f,0.976563f, -0.421875f,0.976563f, -0.429688f,0.976563f, -0.4375f,0.976563f, -0.445313f,0.976563f, -0.453125f,0.976563f, -0.460938f,0.976563f, -0.46875f,0.976563f, -0.476563f,0.976563f, -0.484375f,0.976563f, -0.492188f,0.976563f, -0.5f,0.976563f, -0.507813f,0.976563f, -0.0f,0.984375f, -0.0078125f,0.984375f, -0.015625f,0.984375f, -0.0234375f,0.984375f, -0.03125f,0.984375f, -0.0390625f,0.984375f, -0.046875f,0.984375f, -0.0546875f,0.984375f, -0.0625f,0.984375f, -0.0703125f,0.984375f, -0.078125f,0.984375f, -0.0859375f,0.984375f, -0.09375f,0.984375f, -0.101563f,0.984375f, -0.109375f,0.984375f, -0.117188f,0.984375f, -0.125f,0.984375f, -0.132813f,0.984375f, -0.140625f,0.984375f, -0.148438f,0.984375f, -0.15625f,0.984375f, -0.164063f,0.984375f, -0.171875f,0.984375f, -0.179688f,0.984375f, -0.1875f,0.984375f, -0.195313f,0.984375f, -0.203125f,0.984375f, -0.210938f,0.984375f, -0.21875f,0.984375f, -0.226563f,0.984375f, -0.234375f,0.984375f, -0.242188f,0.984375f, -0.25f,0.984375f, -0.257813f,0.984375f, -0.265625f,0.984375f, -0.273438f,0.984375f, -0.28125f,0.984375f, -0.289063f,0.984375f, -0.296875f,0.984375f, -0.304688f,0.984375f, -0.3125f,0.984375f, -0.320313f,0.984375f, -0.328125f,0.984375f, -0.335938f,0.984375f, -0.34375f,0.984375f, -0.351563f,0.984375f, -0.359375f,0.984375f, -0.367188f,0.984375f, -0.375f,0.984375f, -0.382813f,0.984375f, -0.390625f,0.984375f, -0.398438f,0.984375f, -0.40625f,0.984375f, -0.414063f,0.984375f, -0.421875f,0.984375f, -0.429688f,0.984375f, -0.4375f,0.984375f, -0.445313f,0.984375f, -0.453125f,0.984375f, -0.460938f,0.984375f, -0.46875f,0.984375f, -0.476563f,0.984375f, -0.484375f,0.984375f, -0.492188f,0.984375f, -0.5f,0.984375f, -0.507813f,0.984375f, -0.0f,0.992188f, -0.0078125f,0.992188f, -0.015625f,0.992188f, -0.0234375f,0.992188f, -0.03125f,0.992188f, -0.0390625f,0.992188f, -0.046875f,0.992188f, -0.0546875f,0.992188f, -0.0625f,0.992188f, -0.0703125f,0.992188f, -0.078125f,0.992188f, -0.0859375f,0.992188f, -0.09375f,0.992188f, -0.101563f,0.992188f, -0.109375f,0.992188f, -0.117188f,0.992188f, -0.125f,0.992188f, -0.132813f,0.992188f, -0.140625f,0.992188f, -0.148438f,0.992188f, -0.15625f,0.992188f, -0.164063f,0.992188f, -0.171875f,0.992188f, -0.179688f,0.992188f, -0.1875f,0.992188f, -0.195313f,0.992188f, -0.203125f,0.992188f, -0.210938f,0.992188f, -0.21875f,0.992188f, -0.226563f,0.992188f, -0.234375f,0.992188f, -0.242188f,0.992188f, -0.25f,0.992188f, -0.257813f,0.992188f, -0.265625f,0.992188f, -0.273438f,0.992188f, -0.28125f,0.992188f, -0.289063f,0.992188f, -0.296875f,0.992188f, -0.304688f,0.992188f, -0.3125f,0.992188f, -0.320313f,0.992188f, -0.328125f,0.992188f, -0.335938f,0.992188f, -0.34375f,0.992188f, -0.351563f,0.992188f, -0.359375f,0.992188f, -0.367188f,0.992188f, -0.375f,0.992188f, -0.382813f,0.992188f, -0.390625f,0.992188f, -0.398438f,0.992188f, -0.40625f,0.992188f, -0.414063f,0.992188f, -0.421875f,0.992188f, -0.429688f,0.992188f, -0.4375f,0.992188f, -0.445313f,0.992188f, -0.453125f,0.992188f, -0.460938f,0.992188f, -0.46875f,0.992188f, -0.476563f,0.992188f, -0.484375f,0.992188f, -0.492188f,0.992188f, -0.5f,0.992188f, -0.507813f,0.992188f, -0.0f,1.0f, -0.0078125f,1.0f, -0.015625f,1.0f, -0.0234375f,1.0f, -0.03125f,1.0f, -0.0390625f,1.0f, -0.046875f,1.0f, -0.0546875f,1.0f, -0.0625f,1.0f, -0.0703125f,1.0f, -0.078125f,1.0f, -0.0859375f,1.0f, -0.09375f,1.0f, -0.101563f,1.0f, -0.109375f,1.0f, -0.117188f,1.0f, -0.125f,1.0f, -0.132813f,1.0f, -0.140625f,1.0f, -0.148438f,1.0f, -0.15625f,1.0f, -0.164063f,1.0f, -0.171875f,1.0f, -0.179688f,1.0f, -0.1875f,1.0f, -0.195313f,1.0f, -0.203125f,1.0f, -0.210938f,1.0f, -0.21875f,1.0f, -0.226563f,1.0f, -0.234375f,1.0f, -0.242188f,1.0f, -0.25f,1.0f, -0.257813f,1.0f, -0.265625f,1.0f, -0.273438f,1.0f, -0.28125f,1.0f, -0.289063f,1.0f, -0.296875f,1.0f, -0.304688f,1.0f, -0.3125f,1.0f, -0.320313f,1.0f, -0.328125f,1.0f, -0.335938f,1.0f, -0.34375f,1.0f, -0.351563f,1.0f, -0.359375f,1.0f, -0.367188f,1.0f, -0.375f,1.0f, -0.382813f,1.0f, -0.390625f,1.0f, -0.398438f,1.0f, -0.40625f,1.0f, -0.414063f,1.0f, -0.421875f,1.0f, -0.429688f,1.0f, -0.4375f,1.0f, -0.445313f,1.0f, -0.453125f,1.0f, -0.460938f,1.0f, -0.46875f,1.0f, -0.476563f,1.0f, -0.484375f,1.0f, -0.492188f,1.0f, -0.5f,1.0f, -0.507813f,1.0f, -}; - -unsigned short Landscape08Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -126,127,128, -129,128,127, -128,129,130, -131,130,129, -132,0,133, -2,133,0, -133,2,134, -4,134,2, -134,4,135, -6,135,4, -135,6,136, -8,136,6, -136,8,137, -10,137,8, -137,10,138, -12,138,10, -138,12,139, -14,139,12, -139,14,140, -16,140,14, -140,16,141, -18,141,16, -141,18,142, -20,142,18, -142,20,143, -22,143,20, -143,22,144, -24,144,22, -144,24,145, -26,145,24, -145,26,146, -28,146,26, -146,28,147, -30,147,28, -147,30,148, -32,148,30, -148,32,149, -34,149,32, -149,34,150, -36,150,34, -150,36,151, -38,151,36, -151,38,152, -40,152,38, -152,40,153, -42,153,40, -153,42,154, -44,154,42, -154,44,155, -46,155,44, -155,46,156, -48,156,46, -156,48,157, -50,157,48, -157,50,158, -52,158,50, -158,52,159, -54,159,52, -159,54,160, -56,160,54, -160,56,161, -58,161,56, -161,58,162, -60,162,58, -162,60,163, -62,163,60, -163,62,164, -64,164,62, -164,64,165, -66,165,64, -165,66,166, -68,166,66, -166,68,167, -70,167,68, -167,70,168, -72,168,70, -168,72,169, -74,169,72, -169,74,170, -76,170,74, -170,76,171, -78,171,76, -171,78,172, -80,172,78, -172,80,173, -82,173,80, -173,82,174, -84,174,82, -174,84,175, -86,175,84, -175,86,176, -88,176,86, -176,88,177, -90,177,88, -177,90,178, -92,178,90, -178,92,179, -94,179,92, -179,94,180, -96,180,94, -180,96,181, -98,181,96, -181,98,182, -100,182,98, -182,100,183, -102,183,100, -183,102,184, -104,184,102, -184,104,185, -106,185,104, -185,106,186, -108,186,106, -186,108,187, -110,187,108, -187,110,188, -112,188,110, -188,112,189, -114,189,112, -189,114,190, -116,190,114, -190,116,191, -118,191,116, -191,118,192, -120,192,118, -192,120,193, -122,193,120, -193,122,194, -124,194,122, -194,124,195, -126,195,124, -195,126,196, -128,196,126, -196,128,197, -130,197,128, -198,132,199, -133,199,132, -199,133,200, -134,200,133, -200,134,201, -135,201,134, -201,135,202, -136,202,135, -202,136,203, -137,203,136, -203,137,204, -138,204,137, -204,138,205, -139,205,138, -205,139,206, -140,206,139, -206,140,207, -141,207,140, -207,141,208, -142,208,141, -208,142,209, -143,209,142, -209,143,210, -144,210,143, -210,144,211, -145,211,144, -211,145,212, -146,212,145, -212,146,213, -147,213,146, -213,147,214, -148,214,147, -214,148,215, -149,215,148, -215,149,216, -150,216,149, -216,150,217, -151,217,150, -217,151,218, -152,218,151, -218,152,219, -153,219,152, -219,153,220, -154,220,153, -220,154,221, -155,221,154, -221,155,222, -156,222,155, -222,156,223, -157,223,156, -223,157,224, -158,224,157, -224,158,225, -159,225,158, -225,159,226, -160,226,159, -226,160,227, -161,227,160, -227,161,228, -162,228,161, -228,162,229, -163,229,162, -229,163,230, -164,230,163, -230,164,231, -165,231,164, -231,165,232, -166,232,165, -232,166,233, -167,233,166, -233,167,234, -168,234,167, -234,168,235, -169,235,168, -235,169,236, -170,236,169, -236,170,237, -171,237,170, -237,171,238, -172,238,171, -238,172,239, -173,239,172, -239,173,240, -174,240,173, -240,174,241, -175,241,174, -241,175,242, -176,242,175, -242,176,243, -177,243,176, -243,177,244, -178,244,177, -244,178,245, -179,245,178, -245,179,246, -180,246,179, -246,180,247, -181,247,180, -247,181,248, -182,248,181, -248,182,249, -183,249,182, -249,183,250, -184,250,183, -250,184,251, -185,251,184, -251,185,252, -186,252,185, -252,186,253, -187,253,186, -253,187,254, -188,254,187, -254,188,255, -189,255,188, -255,189,256, -190,256,189, -256,190,257, -191,257,190, -257,191,258, -192,258,191, -258,192,259, -193,259,192, -259,193,260, -194,260,193, -260,194,261, -195,261,194, -261,195,262, -196,262,195, -262,196,263, -197,263,196, -264,198,265, -199,265,198, -265,199,266, -200,266,199, -266,200,267, -201,267,200, -267,201,268, -202,268,201, -268,202,269, -203,269,202, -269,203,270, -204,270,203, -270,204,271, -205,271,204, -271,205,272, -206,272,205, -272,206,273, -207,273,206, -273,207,274, -208,274,207, -274,208,275, -209,275,208, -275,209,276, -210,276,209, -276,210,277, -211,277,210, -277,211,278, -212,278,211, -278,212,279, -213,279,212, -279,213,280, -214,280,213, -280,214,281, -215,281,214, -281,215,282, -216,282,215, -282,216,283, -217,283,216, -283,217,284, -218,284,217, -284,218,285, -219,285,218, -285,219,286, -220,286,219, -286,220,287, -221,287,220, -287,221,288, -222,288,221, -288,222,289, -223,289,222, -289,223,290, -224,290,223, -290,224,291, -225,291,224, -291,225,292, -226,292,225, -292,226,293, -227,293,226, -293,227,294, -228,294,227, -294,228,295, -229,295,228, -295,229,296, -230,296,229, -296,230,297, -231,297,230, -297,231,298, -232,298,231, -298,232,299, -233,299,232, -299,233,300, -234,300,233, -300,234,301, -235,301,234, -301,235,302, -236,302,235, -302,236,303, -237,303,236, -303,237,304, -238,304,237, -304,238,305, -239,305,238, -305,239,306, -240,306,239, -306,240,307, -241,307,240, -307,241,308, -242,308,241, -308,242,309, -243,309,242, -309,243,310, -244,310,243, -310,244,311, -245,311,244, -311,245,312, -246,312,245, -312,246,313, -247,313,246, -313,247,314, -248,314,247, -314,248,315, -249,315,248, -315,249,316, -250,316,249, -316,250,317, -251,317,250, -317,251,318, -252,318,251, -318,252,319, -253,319,252, -319,253,320, -254,320,253, -320,254,321, -255,321,254, -321,255,322, -256,322,255, -322,256,323, -257,323,256, -323,257,324, -258,324,257, -324,258,325, -259,325,258, -325,259,326, -260,326,259, -326,260,327, -261,327,260, -327,261,328, -262,328,261, -328,262,329, -263,329,262, -330,264,331, -265,331,264, -331,265,332, -266,332,265, -332,266,333, -267,333,266, -333,267,334, -268,334,267, -334,268,335, -269,335,268, -335,269,336, -270,336,269, -336,270,337, -271,337,270, -337,271,338, -272,338,271, -338,272,339, -273,339,272, -339,273,340, -274,340,273, -340,274,341, -275,341,274, -341,275,342, -276,342,275, -342,276,343, -277,343,276, -343,277,344, -278,344,277, -344,278,345, -279,345,278, -345,279,346, -280,346,279, -346,280,347, -281,347,280, -347,281,348, -282,348,281, -348,282,349, -283,349,282, -349,283,350, -284,350,283, -350,284,351, -285,351,284, -351,285,352, -286,352,285, -352,286,353, -287,353,286, -353,287,354, -288,354,287, -354,288,355, -289,355,288, -355,289,356, -290,356,289, -356,290,357, -291,357,290, -357,291,358, -292,358,291, -358,292,359, -293,359,292, -359,293,360, -294,360,293, -360,294,361, -295,361,294, -361,295,362, -296,362,295, -362,296,363, -297,363,296, -363,297,364, -298,364,297, -364,298,365, -299,365,298, -365,299,366, -300,366,299, -366,300,367, -301,367,300, -367,301,368, -302,368,301, -368,302,369, -303,369,302, -369,303,370, -304,370,303, -370,304,371, -305,371,304, -371,305,372, -306,372,305, -372,306,373, -307,373,306, -373,307,374, -308,374,307, -374,308,375, -309,375,308, -375,309,376, -310,376,309, -376,310,377, -311,377,310, -377,311,378, -312,378,311, -378,312,379, -313,379,312, -379,313,380, -314,380,313, -380,314,381, -315,381,314, -381,315,382, -316,382,315, -382,316,383, -317,383,316, -383,317,384, -318,384,317, -384,318,385, -319,385,318, -385,319,386, -320,386,319, -386,320,387, -321,387,320, -387,321,388, -322,388,321, -388,322,389, -323,389,322, -389,323,390, -324,390,323, -390,324,391, -325,391,324, -391,325,392, -326,392,325, -392,326,393, -327,393,326, -393,327,394, -328,394,327, -394,328,395, -329,395,328, -396,330,397, -331,397,330, -397,331,398, -332,398,331, -398,332,399, -333,399,332, -399,333,400, -334,400,333, -400,334,401, -335,401,334, -401,335,402, -336,402,335, -402,336,403, -337,403,336, -403,337,404, -338,404,337, -404,338,405, -339,405,338, -405,339,406, -340,406,339, -406,340,407, -341,407,340, -407,341,408, -342,408,341, -408,342,409, -343,409,342, -409,343,410, -344,410,343, -410,344,411, -345,411,344, -411,345,412, -346,412,345, -412,346,413, -347,413,346, -413,347,414, -348,414,347, -414,348,415, -349,415,348, -415,349,416, -350,416,349, -416,350,417, -351,417,350, -417,351,418, -352,418,351, -418,352,419, -353,419,352, -419,353,420, -354,420,353, -420,354,421, -355,421,354, -421,355,422, -356,422,355, -422,356,423, -357,423,356, -423,357,424, -358,424,357, -424,358,425, -359,425,358, -425,359,426, -360,426,359, -426,360,427, -361,427,360, -427,361,428, -362,428,361, -428,362,429, -363,429,362, -429,363,430, -364,430,363, -430,364,431, -365,431,364, -431,365,432, -366,432,365, -432,366,433, -367,433,366, -433,367,434, -368,434,367, -434,368,435, -369,435,368, -435,369,436, -370,436,369, -436,370,437, -371,437,370, -437,371,438, -372,438,371, -438,372,439, -373,439,372, -439,373,440, -374,440,373, -440,374,441, -375,441,374, -441,375,442, -376,442,375, -442,376,443, -377,443,376, -443,377,444, -378,444,377, -444,378,445, -379,445,378, -445,379,446, -380,446,379, -446,380,447, -381,447,380, -447,381,448, -382,448,381, -448,382,449, -383,449,382, -449,383,450, -384,450,383, -450,384,451, -385,451,384, -451,385,452, -386,452,385, -452,386,453, -387,453,386, -453,387,454, -388,454,387, -454,388,455, -389,455,388, -455,389,456, -390,456,389, -456,390,457, -391,457,390, -457,391,458, -392,458,391, -458,392,459, -393,459,392, -459,393,460, -394,460,393, -460,394,461, -395,461,394, -462,396,463, -397,463,396, -463,397,464, -398,464,397, -464,398,465, -399,465,398, -465,399,466, -400,466,399, -466,400,467, -401,467,400, -467,401,468, -402,468,401, -468,402,469, -403,469,402, -469,403,470, -404,470,403, -470,404,471, -405,471,404, -471,405,472, -406,472,405, -472,406,473, -407,473,406, -473,407,474, -408,474,407, -474,408,475, -409,475,408, -475,409,476, -410,476,409, -476,410,477, -411,477,410, -477,411,478, -412,478,411, -478,412,479, -413,479,412, -479,413,480, -414,480,413, -480,414,481, -415,481,414, -481,415,482, -416,482,415, -482,416,483, -417,483,416, -483,417,484, -418,484,417, -484,418,485, -419,485,418, -485,419,486, -420,486,419, -486,420,487, -421,487,420, -487,421,488, -422,488,421, -488,422,489, -423,489,422, -489,423,490, -424,490,423, -490,424,491, -425,491,424, -491,425,492, -426,492,425, -492,426,493, -427,493,426, -493,427,494, -428,494,427, -494,428,495, -429,495,428, -495,429,496, -430,496,429, -496,430,497, -431,497,430, -497,431,498, -432,498,431, -498,432,499, -433,499,432, -499,433,500, -434,500,433, -500,434,501, -435,501,434, -501,435,502, -436,502,435, -502,436,503, -437,503,436, -503,437,504, -438,504,437, -504,438,505, -439,505,438, -505,439,506, -440,506,439, -506,440,507, -441,507,440, -507,441,508, -442,508,441, -508,442,509, -443,509,442, -509,443,510, -444,510,443, -510,444,511, -445,511,444, -511,445,512, -446,512,445, -512,446,513, -447,513,446, -513,447,514, -448,514,447, -514,448,515, -449,515,448, -515,449,516, -450,516,449, -516,450,517, -451,517,450, -517,451,518, -452,518,451, -518,452,519, -453,519,452, -519,453,520, -454,520,453, -520,454,521, -455,521,454, -521,455,522, -456,522,455, -522,456,523, -457,523,456, -523,457,524, -458,524,457, -524,458,525, -459,525,458, -525,459,526, -460,526,459, -526,460,527, -461,527,460, -528,462,529, -463,529,462, -529,463,530, -464,530,463, -530,464,531, -465,531,464, -531,465,532, -466,532,465, -532,466,533, -467,533,466, -533,467,534, -468,534,467, -534,468,535, -469,535,468, -535,469,536, -470,536,469, -536,470,537, -471,537,470, -537,471,538, -472,538,471, -538,472,539, -473,539,472, -539,473,540, -474,540,473, -540,474,541, -475,541,474, -541,475,542, -476,542,475, -542,476,543, -477,543,476, -543,477,544, -478,544,477, -544,478,545, -479,545,478, -545,479,546, -480,546,479, -546,480,547, -481,547,480, -547,481,548, -482,548,481, -548,482,549, -483,549,482, -549,483,550, -484,550,483, -550,484,551, -485,551,484, -551,485,552, -486,552,485, -552,486,553, -487,553,486, -553,487,554, -488,554,487, -554,488,555, -489,555,488, -555,489,556, -490,556,489, -556,490,557, -491,557,490, -557,491,558, -492,558,491, -558,492,559, -493,559,492, -559,493,560, -494,560,493, -560,494,561, -495,561,494, -561,495,562, -496,562,495, -562,496,563, -497,563,496, -563,497,564, -498,564,497, -564,498,565, -499,565,498, -565,499,566, -500,566,499, -566,500,567, -501,567,500, -567,501,568, -502,568,501, -568,502,569, -503,569,502, -569,503,570, -504,570,503, -570,504,571, -505,571,504, -571,505,572, -506,572,505, -572,506,573, -507,573,506, -573,507,574, -508,574,507, -574,508,575, -509,575,508, -575,509,576, -510,576,509, -576,510,577, -511,577,510, -577,511,578, -512,578,511, -578,512,579, -513,579,512, -579,513,580, -514,580,513, -580,514,581, -515,581,514, -581,515,582, -516,582,515, -582,516,583, -517,583,516, -583,517,584, -518,584,517, -584,518,585, -519,585,518, -585,519,586, -520,586,519, -586,520,587, -521,587,520, -587,521,588, -522,588,521, -588,522,589, -523,589,522, -589,523,590, -524,590,523, -590,524,591, -525,591,524, -591,525,592, -526,592,525, -592,526,593, -527,593,526, -594,528,595, -529,595,528, -595,529,596, -530,596,529, -596,530,597, -531,597,530, -597,531,598, -532,598,531, -598,532,599, -533,599,532, -599,533,600, -534,600,533, -600,534,601, -535,601,534, -601,535,602, -536,602,535, -602,536,603, -537,603,536, -603,537,604, -538,604,537, -604,538,605, -539,605,538, -605,539,606, -540,606,539, -606,540,607, -541,607,540, -607,541,608, -542,608,541, -608,542,609, -543,609,542, -609,543,610, -544,610,543, -610,544,611, -545,611,544, -611,545,612, -546,612,545, -612,546,613, -547,613,546, -613,547,614, -548,614,547, -614,548,615, -549,615,548, -615,549,616, -550,616,549, -616,550,617, -551,617,550, -617,551,618, -552,618,551, -618,552,619, -553,619,552, -619,553,620, -554,620,553, -620,554,621, -555,621,554, -621,555,622, -556,622,555, -622,556,623, -557,623,556, -623,557,624, -558,624,557, -624,558,625, -559,625,558, -625,559,626, -560,626,559, -626,560,627, -561,627,560, -627,561,628, -562,628,561, -628,562,629, -563,629,562, -629,563,630, -564,630,563, -630,564,631, -565,631,564, -631,565,632, -566,632,565, -632,566,633, -567,633,566, -633,567,634, -568,634,567, -634,568,635, -569,635,568, -635,569,636, -570,636,569, -636,570,637, -571,637,570, -637,571,638, -572,638,571, -638,572,639, -573,639,572, -639,573,640, -574,640,573, -640,574,641, -575,641,574, -641,575,642, -576,642,575, -642,576,643, -577,643,576, -643,577,644, -578,644,577, -644,578,645, -579,645,578, -645,579,646, -580,646,579, -646,580,647, -581,647,580, -647,581,648, -582,648,581, -648,582,649, -583,649,582, -649,583,650, -584,650,583, -650,584,651, -585,651,584, -651,585,652, -586,652,585, -652,586,653, -587,653,586, -653,587,654, -588,654,587, -654,588,655, -589,655,588, -655,589,656, -590,656,589, -656,590,657, -591,657,590, -657,591,658, -592,658,591, -658,592,659, -593,659,592, -660,594,661, -595,661,594, -661,595,662, -596,662,595, -662,596,663, -597,663,596, -663,597,664, -598,664,597, -664,598,665, -599,665,598, -665,599,666, -600,666,599, -666,600,667, -601,667,600, -667,601,668, -602,668,601, -668,602,669, -603,669,602, -669,603,670, -604,670,603, -670,604,671, -605,671,604, -671,605,672, -606,672,605, -672,606,673, -607,673,606, -673,607,674, -608,674,607, -674,608,675, -609,675,608, -675,609,676, -610,676,609, -676,610,677, -611,677,610, -677,611,678, -612,678,611, -678,612,679, -613,679,612, -679,613,680, -614,680,613, -680,614,681, -615,681,614, -681,615,682, -616,682,615, -682,616,683, -617,683,616, -683,617,684, -618,684,617, -684,618,685, -619,685,618, -685,619,686, -620,686,619, -686,620,687, -621,687,620, -687,621,688, -622,688,621, -688,622,689, -623,689,622, -689,623,690, -624,690,623, -690,624,691, -625,691,624, -691,625,692, -626,692,625, -692,626,693, -627,693,626, -693,627,694, -628,694,627, -694,628,695, -629,695,628, -695,629,696, -630,696,629, -696,630,697, -631,697,630, -697,631,698, -632,698,631, -698,632,699, -633,699,632, -699,633,700, -634,700,633, -700,634,701, -635,701,634, -701,635,702, -636,702,635, -702,636,703, -637,703,636, -703,637,704, -638,704,637, -704,638,705, -639,705,638, -705,639,706, -640,706,639, -706,640,707, -641,707,640, -707,641,708, -642,708,641, -708,642,709, -643,709,642, -709,643,710, -644,710,643, -710,644,711, -645,711,644, -711,645,712, -646,712,645, -712,646,713, -647,713,646, -713,647,714, -648,714,647, -714,648,715, -649,715,648, -715,649,716, -650,716,649, -716,650,717, -651,717,650, -717,651,718, -652,718,651, -718,652,719, -653,719,652, -719,653,720, -654,720,653, -720,654,721, -655,721,654, -721,655,722, -656,722,655, -722,656,723, -657,723,656, -723,657,724, -658,724,657, -724,658,725, -659,725,658, -726,660,727, -661,727,660, -727,661,728, -662,728,661, -728,662,729, -663,729,662, -729,663,730, -664,730,663, -730,664,731, -665,731,664, -731,665,732, -666,732,665, -732,666,733, -667,733,666, -733,667,734, -668,734,667, -734,668,735, -669,735,668, -735,669,736, -670,736,669, -736,670,737, -671,737,670, -737,671,738, -672,738,671, -738,672,739, -673,739,672, -739,673,740, -674,740,673, -740,674,741, -675,741,674, -741,675,742, -676,742,675, -742,676,743, -677,743,676, -743,677,744, -678,744,677, -744,678,745, -679,745,678, -745,679,746, -680,746,679, -746,680,747, -681,747,680, -747,681,748, -682,748,681, -748,682,749, -683,749,682, -749,683,750, -684,750,683, -750,684,751, -685,751,684, -751,685,752, -686,752,685, -752,686,753, -687,753,686, -753,687,754, -688,754,687, -754,688,755, -689,755,688, -755,689,756, -690,756,689, -756,690,757, -691,757,690, -757,691,758, -692,758,691, -758,692,759, -693,759,692, -759,693,760, -694,760,693, -760,694,761, -695,761,694, -761,695,762, -696,762,695, -762,696,763, -697,763,696, -763,697,764, -698,764,697, -764,698,765, -699,765,698, -765,699,766, -700,766,699, -766,700,767, -701,767,700, -767,701,768, -702,768,701, -768,702,769, -703,769,702, -769,703,770, -704,770,703, -770,704,771, -705,771,704, -771,705,772, -706,772,705, -772,706,773, -707,773,706, -773,707,774, -708,774,707, -774,708,775, -709,775,708, -775,709,776, -710,776,709, -776,710,777, -711,777,710, -777,711,778, -712,778,711, -778,712,779, -713,779,712, -779,713,780, -714,780,713, -780,714,781, -715,781,714, -781,715,782, -716,782,715, -782,716,783, -717,783,716, -783,717,784, -718,784,717, -784,718,785, -719,785,718, -785,719,786, -720,786,719, -786,720,787, -721,787,720, -787,721,788, -722,788,721, -788,722,789, -723,789,722, -789,723,790, -724,790,723, -790,724,791, -725,791,724, -792,726,793, -727,793,726, -793,727,794, -728,794,727, -794,728,795, -729,795,728, -795,729,796, -730,796,729, -796,730,797, -731,797,730, -797,731,798, -732,798,731, -798,732,799, -733,799,732, -799,733,800, -734,800,733, -800,734,801, -735,801,734, -801,735,802, -736,802,735, -802,736,803, -737,803,736, -803,737,804, -738,804,737, -804,738,805, -739,805,738, -805,739,806, -740,806,739, -806,740,807, -741,807,740, -807,741,808, -742,808,741, -808,742,809, -743,809,742, -809,743,810, -744,810,743, -810,744,811, -745,811,744, -811,745,812, -746,812,745, -812,746,813, -747,813,746, -813,747,814, -748,814,747, -814,748,815, -749,815,748, -815,749,816, -750,816,749, -816,750,817, -751,817,750, -817,751,818, -752,818,751, -818,752,819, -753,819,752, -819,753,820, -754,820,753, -820,754,821, -755,821,754, -821,755,822, -756,822,755, -822,756,823, -757,823,756, -823,757,824, -758,824,757, -824,758,825, -759,825,758, -825,759,826, -760,826,759, -826,760,827, -761,827,760, -827,761,828, -762,828,761, -828,762,829, -763,829,762, -829,763,830, -764,830,763, -830,764,831, -765,831,764, -831,765,832, -766,832,765, -832,766,833, -767,833,766, -833,767,834, -768,834,767, -834,768,835, -769,835,768, -835,769,836, -770,836,769, -836,770,837, -771,837,770, -837,771,838, -772,838,771, -838,772,839, -773,839,772, -839,773,840, -774,840,773, -840,774,841, -775,841,774, -841,775,842, -776,842,775, -842,776,843, -777,843,776, -843,777,844, -778,844,777, -844,778,845, -779,845,778, -845,779,846, -780,846,779, -846,780,847, -781,847,780, -847,781,848, -782,848,781, -848,782,849, -783,849,782, -849,783,850, -784,850,783, -850,784,851, -785,851,784, -851,785,852, -786,852,785, -852,786,853, -787,853,786, -853,787,854, -788,854,787, -854,788,855, -789,855,788, -855,789,856, -790,856,789, -856,790,857, -791,857,790, -858,792,859, -793,859,792, -859,793,860, -794,860,793, -860,794,861, -795,861,794, -861,795,862, -796,862,795, -862,796,863, -797,863,796, -863,797,864, -798,864,797, -864,798,865, -799,865,798, -865,799,866, -800,866,799, -866,800,867, -801,867,800, -867,801,868, -802,868,801, -868,802,869, -803,869,802, -869,803,870, -804,870,803, -870,804,871, -805,871,804, -871,805,872, -806,872,805, -872,806,873, -807,873,806, -873,807,874, -808,874,807, -874,808,875, -809,875,808, -875,809,876, -810,876,809, -876,810,877, -811,877,810, -877,811,878, -812,878,811, -878,812,879, -813,879,812, -879,813,880, -814,880,813, -880,814,881, -815,881,814, -881,815,882, -816,882,815, -882,816,883, -817,883,816, -883,817,884, -818,884,817, -884,818,885, -819,885,818, -885,819,886, -820,886,819, -886,820,887, -821,887,820, -887,821,888, -822,888,821, -888,822,889, -823,889,822, -889,823,890, -824,890,823, -890,824,891, -825,891,824, -891,825,892, -826,892,825, -892,826,893, -827,893,826, -893,827,894, -828,894,827, -894,828,895, -829,895,828, -895,829,896, -830,896,829, -896,830,897, -831,897,830, -897,831,898, -832,898,831, -898,832,899, -833,899,832, -899,833,900, -834,900,833, -900,834,901, -835,901,834, -901,835,902, -836,902,835, -902,836,903, -837,903,836, -903,837,904, -838,904,837, -904,838,905, -839,905,838, -905,839,906, -840,906,839, -906,840,907, -841,907,840, -907,841,908, -842,908,841, -908,842,909, -843,909,842, -909,843,910, -844,910,843, -910,844,911, -845,911,844, -911,845,912, -846,912,845, -912,846,913, -847,913,846, -913,847,914, -848,914,847, -914,848,915, -849,915,848, -915,849,916, -850,916,849, -916,850,917, -851,917,850, -917,851,918, -852,918,851, -918,852,919, -853,919,852, -919,853,920, -854,920,853, -920,854,921, -855,921,854, -921,855,922, -856,922,855, -922,856,923, -857,923,856, -924,858,925, -859,925,858, -925,859,926, -860,926,859, -926,860,927, -861,927,860, -927,861,928, -862,928,861, -928,862,929, -863,929,862, -929,863,930, -864,930,863, -930,864,931, -865,931,864, -931,865,932, -866,932,865, -932,866,933, -867,933,866, -933,867,934, -868,934,867, -934,868,935, -869,935,868, -935,869,936, -870,936,869, -936,870,937, -871,937,870, -937,871,938, -872,938,871, -938,872,939, -873,939,872, -939,873,940, -874,940,873, -940,874,941, -875,941,874, -941,875,942, -876,942,875, -942,876,943, -877,943,876, -943,877,944, -878,944,877, -944,878,945, -879,945,878, -945,879,946, -880,946,879, -946,880,947, -881,947,880, -947,881,948, -882,948,881, -948,882,949, -883,949,882, -949,883,950, -884,950,883, -950,884,951, -885,951,884, -951,885,952, -886,952,885, -952,886,953, -887,953,886, -953,887,954, -888,954,887, -954,888,955, -889,955,888, -955,889,956, -890,956,889, -956,890,957, -891,957,890, -957,891,958, -892,958,891, -958,892,959, -893,959,892, -959,893,960, -894,960,893, -960,894,961, -895,961,894, -961,895,962, -896,962,895, -962,896,963, -897,963,896, -963,897,964, -898,964,897, -964,898,965, -899,965,898, -965,899,966, -900,966,899, -966,900,967, -901,967,900, -967,901,968, -902,968,901, -968,902,969, -903,969,902, -969,903,970, -904,970,903, -970,904,971, -905,971,904, -971,905,972, -906,972,905, -972,906,973, -907,973,906, -973,907,974, -908,974,907, -974,908,975, -909,975,908, -975,909,976, -910,976,909, -976,910,977, -911,977,910, -977,911,978, -912,978,911, -978,912,979, -913,979,912, -979,913,980, -914,980,913, -980,914,981, -915,981,914, -981,915,982, -916,982,915, -982,916,983, -917,983,916, -983,917,984, -918,984,917, -984,918,985, -919,985,918, -985,919,986, -920,986,919, -986,920,987, -921,987,920, -987,921,988, -922,988,921, -988,922,989, -923,989,922, -990,924,991, -925,991,924, -991,925,992, -926,992,925, -992,926,993, -927,993,926, -993,927,994, -928,994,927, -994,928,995, -929,995,928, -995,929,996, -930,996,929, -996,930,997, -931,997,930, -997,931,998, -932,998,931, -998,932,999, -933,999,932, -999,933,1000, -934,1000,933, -1000,934,1001, -935,1001,934, -1001,935,1002, -936,1002,935, -1002,936,1003, -937,1003,936, -1003,937,1004, -938,1004,937, -1004,938,1005, -939,1005,938, -1005,939,1006, -940,1006,939, -1006,940,1007, -941,1007,940, -1007,941,1008, -942,1008,941, -1008,942,1009, -943,1009,942, -1009,943,1010, -944,1010,943, -1010,944,1011, -945,1011,944, -1011,945,1012, -946,1012,945, -1012,946,1013, -947,1013,946, -1013,947,1014, -948,1014,947, -1014,948,1015, -949,1015,948, -1015,949,1016, -950,1016,949, -1016,950,1017, -951,1017,950, -1017,951,1018, -952,1018,951, -1018,952,1019, -953,1019,952, -1019,953,1020, -954,1020,953, -1020,954,1021, -955,1021,954, -1021,955,1022, -956,1022,955, -1022,956,1023, -957,1023,956, -1023,957,1024, -958,1024,957, -1024,958,1025, -959,1025,958, -1025,959,1026, -960,1026,959, -1026,960,1027, -961,1027,960, -1027,961,1028, -962,1028,961, -1028,962,1029, -963,1029,962, -1029,963,1030, -964,1030,963, -1030,964,1031, -965,1031,964, -1031,965,1032, -966,1032,965, -1032,966,1033, -967,1033,966, -1033,967,1034, -968,1034,967, -1034,968,1035, -969,1035,968, -1035,969,1036, -970,1036,969, -1036,970,1037, -971,1037,970, -1037,971,1038, -972,1038,971, -1038,972,1039, -973,1039,972, -1039,973,1040, -974,1040,973, -1040,974,1041, -975,1041,974, -1041,975,1042, -976,1042,975, -1042,976,1043, -977,1043,976, -1043,977,1044, -978,1044,977, -1044,978,1045, -979,1045,978, -1045,979,1046, -980,1046,979, -1046,980,1047, -981,1047,980, -1047,981,1048, -982,1048,981, -1048,982,1049, -983,1049,982, -1049,983,1050, -984,1050,983, -1050,984,1051, -985,1051,984, -1051,985,1052, -986,1052,985, -1052,986,1053, -987,1053,986, -1053,987,1054, -988,1054,987, -1054,988,1055, -989,1055,988, -1056,990,1057, -991,1057,990, -1057,991,1058, -992,1058,991, -1058,992,1059, -993,1059,992, -1059,993,1060, -994,1060,993, -1060,994,1061, -995,1061,994, -1061,995,1062, -996,1062,995, -1062,996,1063, -997,1063,996, -1063,997,1064, -998,1064,997, -1064,998,1065, -999,1065,998, -1065,999,1066, -1000,1066,999, -1066,1000,1067, -1001,1067,1000, -1067,1001,1068, -1002,1068,1001, -1068,1002,1069, -1003,1069,1002, -1069,1003,1070, -1004,1070,1003, -1070,1004,1071, -1005,1071,1004, -1071,1005,1072, -1006,1072,1005, -1072,1006,1073, -1007,1073,1006, -1073,1007,1074, -1008,1074,1007, -1074,1008,1075, -1009,1075,1008, -1075,1009,1076, -1010,1076,1009, -1076,1010,1077, -1011,1077,1010, -1077,1011,1078, -1012,1078,1011, -1078,1012,1079, -1013,1079,1012, -1079,1013,1080, -1014,1080,1013, -1080,1014,1081, -1015,1081,1014, -1081,1015,1082, -1016,1082,1015, -1082,1016,1083, -1017,1083,1016, -1083,1017,1084, -1018,1084,1017, -1084,1018,1085, -1019,1085,1018, -1085,1019,1086, -1020,1086,1019, -1086,1020,1087, -1021,1087,1020, -1087,1021,1088, -1022,1088,1021, -1088,1022,1089, -1023,1089,1022, -1089,1023,1090, -1024,1090,1023, -1090,1024,1091, -1025,1091,1024, -1091,1025,1092, -1026,1092,1025, -1092,1026,1093, -1027,1093,1026, -1093,1027,1094, -1028,1094,1027, -1094,1028,1095, -1029,1095,1028, -1095,1029,1096, -1030,1096,1029, -1096,1030,1097, -1031,1097,1030, -1097,1031,1098, -1032,1098,1031, -1098,1032,1099, -1033,1099,1032, -1099,1033,1100, -1034,1100,1033, -1100,1034,1101, -1035,1101,1034, -1101,1035,1102, -1036,1102,1035, -1102,1036,1103, -1037,1103,1036, -1103,1037,1104, -1038,1104,1037, -1104,1038,1105, -1039,1105,1038, -1105,1039,1106, -1040,1106,1039, -1106,1040,1107, -1041,1107,1040, -1107,1041,1108, -1042,1108,1041, -1108,1042,1109, -1043,1109,1042, -1109,1043,1110, -1044,1110,1043, -1110,1044,1111, -1045,1111,1044, -1111,1045,1112, -1046,1112,1045, -1112,1046,1113, -1047,1113,1046, -1113,1047,1114, -1048,1114,1047, -1114,1048,1115, -1049,1115,1048, -1115,1049,1116, -1050,1116,1049, -1116,1050,1117, -1051,1117,1050, -1117,1051,1118, -1052,1118,1051, -1118,1052,1119, -1053,1119,1052, -1119,1053,1120, -1054,1120,1053, -1120,1054,1121, -1055,1121,1054, -1122,1056,1123, -1057,1123,1056, -1123,1057,1124, -1058,1124,1057, -1124,1058,1125, -1059,1125,1058, -1125,1059,1126, -1060,1126,1059, -1126,1060,1127, -1061,1127,1060, -1127,1061,1128, -1062,1128,1061, -1128,1062,1129, -1063,1129,1062, -1129,1063,1130, -1064,1130,1063, -1130,1064,1131, -1065,1131,1064, -1131,1065,1132, -1066,1132,1065, -1132,1066,1133, -1067,1133,1066, -1133,1067,1134, -1068,1134,1067, -1134,1068,1135, -1069,1135,1068, -1135,1069,1136, -1070,1136,1069, -1136,1070,1137, -1071,1137,1070, -1137,1071,1138, -1072,1138,1071, -1138,1072,1139, -1073,1139,1072, -1139,1073,1140, -1074,1140,1073, -1140,1074,1141, -1075,1141,1074, -1141,1075,1142, -1076,1142,1075, -1142,1076,1143, -1077,1143,1076, -1143,1077,1144, -1078,1144,1077, -1144,1078,1145, -1079,1145,1078, -1145,1079,1146, -1080,1146,1079, -1146,1080,1147, -1081,1147,1080, -1147,1081,1148, -1082,1148,1081, -1148,1082,1149, -1083,1149,1082, -1149,1083,1150, -1084,1150,1083, -1150,1084,1151, -1085,1151,1084, -1151,1085,1152, -1086,1152,1085, -1152,1086,1153, -1087,1153,1086, -1153,1087,1154, -1088,1154,1087, -1154,1088,1155, -1089,1155,1088, -1155,1089,1156, -1090,1156,1089, -1156,1090,1157, -1091,1157,1090, -1157,1091,1158, -1092,1158,1091, -1158,1092,1159, -1093,1159,1092, -1159,1093,1160, -1094,1160,1093, -1160,1094,1161, -1095,1161,1094, -1161,1095,1162, -1096,1162,1095, -1162,1096,1163, -1097,1163,1096, -1163,1097,1164, -1098,1164,1097, -1164,1098,1165, -1099,1165,1098, -1165,1099,1166, -1100,1166,1099, -1166,1100,1167, -1101,1167,1100, -1167,1101,1168, -1102,1168,1101, -1168,1102,1169, -1103,1169,1102, -1169,1103,1170, -1104,1170,1103, -1170,1104,1171, -1105,1171,1104, -1171,1105,1172, -1106,1172,1105, -1172,1106,1173, -1107,1173,1106, -1173,1107,1174, -1108,1174,1107, -1174,1108,1175, -1109,1175,1108, -1175,1109,1176, -1110,1176,1109, -1176,1110,1177, -1111,1177,1110, -1177,1111,1178, -1112,1178,1111, -1178,1112,1179, -1113,1179,1112, -1179,1113,1180, -1114,1180,1113, -1180,1114,1181, -1115,1181,1114, -1181,1115,1182, -1116,1182,1115, -1182,1116,1183, -1117,1183,1116, -1183,1117,1184, -1118,1184,1117, -1184,1118,1185, -1119,1185,1118, -1185,1119,1186, -1120,1186,1119, -1186,1120,1187, -1121,1187,1120, -1188,1122,1189, -1123,1189,1122, -1189,1123,1190, -1124,1190,1123, -1190,1124,1191, -1125,1191,1124, -1191,1125,1192, -1126,1192,1125, -1192,1126,1193, -1127,1193,1126, -1193,1127,1194, -1128,1194,1127, -1194,1128,1195, -1129,1195,1128, -1195,1129,1196, -1130,1196,1129, -1196,1130,1197, -1131,1197,1130, -1197,1131,1198, -1132,1198,1131, -1198,1132,1199, -1133,1199,1132, -1199,1133,1200, -1134,1200,1133, -1200,1134,1201, -1135,1201,1134, -1201,1135,1202, -1136,1202,1135, -1202,1136,1203, -1137,1203,1136, -1203,1137,1204, -1138,1204,1137, -1204,1138,1205, -1139,1205,1138, -1205,1139,1206, -1140,1206,1139, -1206,1140,1207, -1141,1207,1140, -1207,1141,1208, -1142,1208,1141, -1208,1142,1209, -1143,1209,1142, -1209,1143,1210, -1144,1210,1143, -1210,1144,1211, -1145,1211,1144, -1211,1145,1212, -1146,1212,1145, -1212,1146,1213, -1147,1213,1146, -1213,1147,1214, -1148,1214,1147, -1214,1148,1215, -1149,1215,1148, -1215,1149,1216, -1150,1216,1149, -1216,1150,1217, -1151,1217,1150, -1217,1151,1218, -1152,1218,1151, -1218,1152,1219, -1153,1219,1152, -1219,1153,1220, -1154,1220,1153, -1220,1154,1221, -1155,1221,1154, -1221,1155,1222, -1156,1222,1155, -1222,1156,1223, -1157,1223,1156, -1223,1157,1224, -1158,1224,1157, -1224,1158,1225, -1159,1225,1158, -1225,1159,1226, -1160,1226,1159, -1226,1160,1227, -1161,1227,1160, -1227,1161,1228, -1162,1228,1161, -1228,1162,1229, -1163,1229,1162, -1229,1163,1230, -1164,1230,1163, -1230,1164,1231, -1165,1231,1164, -1231,1165,1232, -1166,1232,1165, -1232,1166,1233, -1167,1233,1166, -1233,1167,1234, -1168,1234,1167, -1234,1168,1235, -1169,1235,1168, -1235,1169,1236, -1170,1236,1169, -1236,1170,1237, -1171,1237,1170, -1237,1171,1238, -1172,1238,1171, -1238,1172,1239, -1173,1239,1172, -1239,1173,1240, -1174,1240,1173, -1240,1174,1241, -1175,1241,1174, -1241,1175,1242, -1176,1242,1175, -1242,1176,1243, -1177,1243,1176, -1243,1177,1244, -1178,1244,1177, -1244,1178,1245, -1179,1245,1178, -1245,1179,1246, -1180,1246,1179, -1246,1180,1247, -1181,1247,1180, -1247,1181,1248, -1182,1248,1181, -1248,1182,1249, -1183,1249,1182, -1249,1183,1250, -1184,1250,1183, -1250,1184,1251, -1185,1251,1184, -1251,1185,1252, -1186,1252,1185, -1252,1186,1253, -1187,1253,1186, -1254,1188,1255, -1189,1255,1188, -1255,1189,1256, -1190,1256,1189, -1256,1190,1257, -1191,1257,1190, -1257,1191,1258, -1192,1258,1191, -1258,1192,1259, -1193,1259,1192, -1259,1193,1260, -1194,1260,1193, -1260,1194,1261, -1195,1261,1194, -1261,1195,1262, -1196,1262,1195, -1262,1196,1263, -1197,1263,1196, -1263,1197,1264, -1198,1264,1197, -1264,1198,1265, -1199,1265,1198, -1265,1199,1266, -1200,1266,1199, -1266,1200,1267, -1201,1267,1200, -1267,1201,1268, -1202,1268,1201, -1268,1202,1269, -1203,1269,1202, -1269,1203,1270, -1204,1270,1203, -1270,1204,1271, -1205,1271,1204, -1271,1205,1272, -1206,1272,1205, -1272,1206,1273, -1207,1273,1206, -1273,1207,1274, -1208,1274,1207, -1274,1208,1275, -1209,1275,1208, -1275,1209,1276, -1210,1276,1209, -1276,1210,1277, -1211,1277,1210, -1277,1211,1278, -1212,1278,1211, -1278,1212,1279, -1213,1279,1212, -1279,1213,1280, -1214,1280,1213, -1280,1214,1281, -1215,1281,1214, -1281,1215,1282, -1216,1282,1215, -1282,1216,1283, -1217,1283,1216, -1283,1217,1284, -1218,1284,1217, -1284,1218,1285, -1219,1285,1218, -1285,1219,1286, -1220,1286,1219, -1286,1220,1287, -1221,1287,1220, -1287,1221,1288, -1222,1288,1221, -1288,1222,1289, -1223,1289,1222, -1289,1223,1290, -1224,1290,1223, -1290,1224,1291, -1225,1291,1224, -1291,1225,1292, -1226,1292,1225, -1292,1226,1293, -1227,1293,1226, -1293,1227,1294, -1228,1294,1227, -1294,1228,1295, -1229,1295,1228, -1295,1229,1296, -1230,1296,1229, -1296,1230,1297, -1231,1297,1230, -1297,1231,1298, -1232,1298,1231, -1298,1232,1299, -1233,1299,1232, -1299,1233,1300, -1234,1300,1233, -1300,1234,1301, -1235,1301,1234, -1301,1235,1302, -1236,1302,1235, -1302,1236,1303, -1237,1303,1236, -1303,1237,1304, -1238,1304,1237, -1304,1238,1305, -1239,1305,1238, -1305,1239,1306, -1240,1306,1239, -1306,1240,1307, -1241,1307,1240, -1307,1241,1308, -1242,1308,1241, -1308,1242,1309, -1243,1309,1242, -1309,1243,1310, -1244,1310,1243, -1310,1244,1311, -1245,1311,1244, -1311,1245,1312, -1246,1312,1245, -1312,1246,1313, -1247,1313,1246, -1313,1247,1314, -1248,1314,1247, -1314,1248,1315, -1249,1315,1248, -1315,1249,1316, -1250,1316,1249, -1316,1250,1317, -1251,1317,1250, -1317,1251,1318, -1252,1318,1251, -1318,1252,1319, -1253,1319,1252, -1320,1254,1321, -1255,1321,1254, -1321,1255,1322, -1256,1322,1255, -1322,1256,1323, -1257,1323,1256, -1323,1257,1324, -1258,1324,1257, -1324,1258,1325, -1259,1325,1258, -1325,1259,1326, -1260,1326,1259, -1326,1260,1327, -1261,1327,1260, -1327,1261,1328, -1262,1328,1261, -1328,1262,1329, -1263,1329,1262, -1329,1263,1330, -1264,1330,1263, -1330,1264,1331, -1265,1331,1264, -1331,1265,1332, -1266,1332,1265, -1332,1266,1333, -1267,1333,1266, -1333,1267,1334, -1268,1334,1267, -1334,1268,1335, -1269,1335,1268, -1335,1269,1336, -1270,1336,1269, -1336,1270,1337, -1271,1337,1270, -1337,1271,1338, -1272,1338,1271, -1338,1272,1339, -1273,1339,1272, -1339,1273,1340, -1274,1340,1273, -1340,1274,1341, -1275,1341,1274, -1341,1275,1342, -1276,1342,1275, -1342,1276,1343, -1277,1343,1276, -1343,1277,1344, -1278,1344,1277, -1344,1278,1345, -1279,1345,1278, -1345,1279,1346, -1280,1346,1279, -1346,1280,1347, -1281,1347,1280, -1347,1281,1348, -1282,1348,1281, -1348,1282,1349, -1283,1349,1282, -1349,1283,1350, -1284,1350,1283, -1350,1284,1351, -1285,1351,1284, -1351,1285,1352, -1286,1352,1285, -1352,1286,1353, -1287,1353,1286, -1353,1287,1354, -1288,1354,1287, -1354,1288,1355, -1289,1355,1288, -1355,1289,1356, -1290,1356,1289, -1356,1290,1357, -1291,1357,1290, -1357,1291,1358, -1292,1358,1291, -1358,1292,1359, -1293,1359,1292, -1359,1293,1360, -1294,1360,1293, -1360,1294,1361, -1295,1361,1294, -1361,1295,1362, -1296,1362,1295, -1362,1296,1363, -1297,1363,1296, -1363,1297,1364, -1298,1364,1297, -1364,1298,1365, -1299,1365,1298, -1365,1299,1366, -1300,1366,1299, -1366,1300,1367, -1301,1367,1300, -1367,1301,1368, -1302,1368,1301, -1368,1302,1369, -1303,1369,1302, -1369,1303,1370, -1304,1370,1303, -1370,1304,1371, -1305,1371,1304, -1371,1305,1372, -1306,1372,1305, -1372,1306,1373, -1307,1373,1306, -1373,1307,1374, -1308,1374,1307, -1374,1308,1375, -1309,1375,1308, -1375,1309,1376, -1310,1376,1309, -1376,1310,1377, -1311,1377,1310, -1377,1311,1378, -1312,1378,1311, -1378,1312,1379, -1313,1379,1312, -1379,1313,1380, -1314,1380,1313, -1380,1314,1381, -1315,1381,1314, -1381,1315,1382, -1316,1382,1315, -1382,1316,1383, -1317,1383,1316, -1383,1317,1384, -1318,1384,1317, -1384,1318,1385, -1319,1385,1318, -1386,1320,1387, -1321,1387,1320, -1387,1321,1388, -1322,1388,1321, -1388,1322,1389, -1323,1389,1322, -1389,1323,1390, -1324,1390,1323, -1390,1324,1391, -1325,1391,1324, -1391,1325,1392, -1326,1392,1325, -1392,1326,1393, -1327,1393,1326, -1393,1327,1394, -1328,1394,1327, -1394,1328,1395, -1329,1395,1328, -1395,1329,1396, -1330,1396,1329, -1396,1330,1397, -1331,1397,1330, -1397,1331,1398, -1332,1398,1331, -1398,1332,1399, -1333,1399,1332, -1399,1333,1400, -1334,1400,1333, -1400,1334,1401, -1335,1401,1334, -1401,1335,1402, -1336,1402,1335, -1402,1336,1403, -1337,1403,1336, -1403,1337,1404, -1338,1404,1337, -1404,1338,1405, -1339,1405,1338, -1405,1339,1406, -1340,1406,1339, -1406,1340,1407, -1341,1407,1340, -1407,1341,1408, -1342,1408,1341, -1408,1342,1409, -1343,1409,1342, -1409,1343,1410, -1344,1410,1343, -1410,1344,1411, -1345,1411,1344, -1411,1345,1412, -1346,1412,1345, -1412,1346,1413, -1347,1413,1346, -1413,1347,1414, -1348,1414,1347, -1414,1348,1415, -1349,1415,1348, -1415,1349,1416, -1350,1416,1349, -1416,1350,1417, -1351,1417,1350, -1417,1351,1418, -1352,1418,1351, -1418,1352,1419, -1353,1419,1352, -1419,1353,1420, -1354,1420,1353, -1420,1354,1421, -1355,1421,1354, -1421,1355,1422, -1356,1422,1355, -1422,1356,1423, -1357,1423,1356, -1423,1357,1424, -1358,1424,1357, -1424,1358,1425, -1359,1425,1358, -1425,1359,1426, -1360,1426,1359, -1426,1360,1427, -1361,1427,1360, -1427,1361,1428, -1362,1428,1361, -1428,1362,1429, -1363,1429,1362, -1429,1363,1430, -1364,1430,1363, -1430,1364,1431, -1365,1431,1364, -1431,1365,1432, -1366,1432,1365, -1432,1366,1433, -1367,1433,1366, -1433,1367,1434, -1368,1434,1367, -1434,1368,1435, -1369,1435,1368, -1435,1369,1436, -1370,1436,1369, -1436,1370,1437, -1371,1437,1370, -1437,1371,1438, -1372,1438,1371, -1438,1372,1439, -1373,1439,1372, -1439,1373,1440, -1374,1440,1373, -1440,1374,1441, -1375,1441,1374, -1441,1375,1442, -1376,1442,1375, -1442,1376,1443, -1377,1443,1376, -1443,1377,1444, -1378,1444,1377, -1444,1378,1445, -1379,1445,1378, -1445,1379,1446, -1380,1446,1379, -1446,1380,1447, -1381,1447,1380, -1447,1381,1448, -1382,1448,1381, -1448,1382,1449, -1383,1449,1382, -1449,1383,1450, -1384,1450,1383, -1450,1384,1451, -1385,1451,1384, -1452,1386,1453, -1387,1453,1386, -1453,1387,1454, -1388,1454,1387, -1454,1388,1455, -1389,1455,1388, -1455,1389,1456, -1390,1456,1389, -1456,1390,1457, -1391,1457,1390, -1457,1391,1458, -1392,1458,1391, -1458,1392,1459, -1393,1459,1392, -1459,1393,1460, -1394,1460,1393, -1460,1394,1461, -1395,1461,1394, -1461,1395,1462, -1396,1462,1395, -1462,1396,1463, -1397,1463,1396, -1463,1397,1464, -1398,1464,1397, -1464,1398,1465, -1399,1465,1398, -1465,1399,1466, -1400,1466,1399, -1466,1400,1467, -1401,1467,1400, -1467,1401,1468, -1402,1468,1401, -1468,1402,1469, -1403,1469,1402, -1469,1403,1470, -1404,1470,1403, -1470,1404,1471, -1405,1471,1404, -1471,1405,1472, -1406,1472,1405, -1472,1406,1473, -1407,1473,1406, -1473,1407,1474, -1408,1474,1407, -1474,1408,1475, -1409,1475,1408, -1475,1409,1476, -1410,1476,1409, -1476,1410,1477, -1411,1477,1410, -1477,1411,1478, -1412,1478,1411, -1478,1412,1479, -1413,1479,1412, -1479,1413,1480, -1414,1480,1413, -1480,1414,1481, -1415,1481,1414, -1481,1415,1482, -1416,1482,1415, -1482,1416,1483, -1417,1483,1416, -1483,1417,1484, -1418,1484,1417, -1484,1418,1485, -1419,1485,1418, -1485,1419,1486, -1420,1486,1419, -1486,1420,1487, -1421,1487,1420, -1487,1421,1488, -1422,1488,1421, -1488,1422,1489, -1423,1489,1422, -1489,1423,1490, -1424,1490,1423, -1490,1424,1491, -1425,1491,1424, -1491,1425,1492, -1426,1492,1425, -1492,1426,1493, -1427,1493,1426, -1493,1427,1494, -1428,1494,1427, -1494,1428,1495, -1429,1495,1428, -1495,1429,1496, -1430,1496,1429, -1496,1430,1497, -1431,1497,1430, -1497,1431,1498, -1432,1498,1431, -1498,1432,1499, -1433,1499,1432, -1499,1433,1500, -1434,1500,1433, -1500,1434,1501, -1435,1501,1434, -1501,1435,1502, -1436,1502,1435, -1502,1436,1503, -1437,1503,1436, -1503,1437,1504, -1438,1504,1437, -1504,1438,1505, -1439,1505,1438, -1505,1439,1506, -1440,1506,1439, -1506,1440,1507, -1441,1507,1440, -1507,1441,1508, -1442,1508,1441, -1508,1442,1509, -1443,1509,1442, -1509,1443,1510, -1444,1510,1443, -1510,1444,1511, -1445,1511,1444, -1511,1445,1512, -1446,1512,1445, -1512,1446,1513, -1447,1513,1446, -1513,1447,1514, -1448,1514,1447, -1514,1448,1515, -1449,1515,1448, -1515,1449,1516, -1450,1516,1449, -1516,1450,1517, -1451,1517,1450, -1518,1452,1519, -1453,1519,1452, -1519,1453,1520, -1454,1520,1453, -1520,1454,1521, -1455,1521,1454, -1521,1455,1522, -1456,1522,1455, -1522,1456,1523, -1457,1523,1456, -1523,1457,1524, -1458,1524,1457, -1524,1458,1525, -1459,1525,1458, -1525,1459,1526, -1460,1526,1459, -1526,1460,1527, -1461,1527,1460, -1527,1461,1528, -1462,1528,1461, -1528,1462,1529, -1463,1529,1462, -1529,1463,1530, -1464,1530,1463, -1530,1464,1531, -1465,1531,1464, -1531,1465,1532, -1466,1532,1465, -1532,1466,1533, -1467,1533,1466, -1533,1467,1534, -1468,1534,1467, -1534,1468,1535, -1469,1535,1468, -1535,1469,1536, -1470,1536,1469, -1536,1470,1537, -1471,1537,1470, -1537,1471,1538, -1472,1538,1471, -1538,1472,1539, -1473,1539,1472, -1539,1473,1540, -1474,1540,1473, -1540,1474,1541, -1475,1541,1474, -1541,1475,1542, -1476,1542,1475, -1542,1476,1543, -1477,1543,1476, -1543,1477,1544, -1478,1544,1477, -1544,1478,1545, -1479,1545,1478, -1545,1479,1546, -1480,1546,1479, -1546,1480,1547, -1481,1547,1480, -1547,1481,1548, -1482,1548,1481, -1548,1482,1549, -1483,1549,1482, -1549,1483,1550, -1484,1550,1483, -1550,1484,1551, -1485,1551,1484, -1551,1485,1552, -1486,1552,1485, -1552,1486,1553, -1487,1553,1486, -1553,1487,1554, -1488,1554,1487, -1554,1488,1555, -1489,1555,1488, -1555,1489,1556, -1490,1556,1489, -1556,1490,1557, -1491,1557,1490, -1557,1491,1558, -1492,1558,1491, -1558,1492,1559, -1493,1559,1492, -1559,1493,1560, -1494,1560,1493, -1560,1494,1561, -1495,1561,1494, -1561,1495,1562, -1496,1562,1495, -1562,1496,1563, -1497,1563,1496, -1563,1497,1564, -1498,1564,1497, -1564,1498,1565, -1499,1565,1498, -1565,1499,1566, -1500,1566,1499, -1566,1500,1567, -1501,1567,1500, -1567,1501,1568, -1502,1568,1501, -1568,1502,1569, -1503,1569,1502, -1569,1503,1570, -1504,1570,1503, -1570,1504,1571, -1505,1571,1504, -1571,1505,1572, -1506,1572,1505, -1572,1506,1573, -1507,1573,1506, -1573,1507,1574, -1508,1574,1507, -1574,1508,1575, -1509,1575,1508, -1575,1509,1576, -1510,1576,1509, -1576,1510,1577, -1511,1577,1510, -1577,1511,1578, -1512,1578,1511, -1578,1512,1579, -1513,1579,1512, -1579,1513,1580, -1514,1580,1513, -1580,1514,1581, -1515,1581,1514, -1581,1515,1582, -1516,1582,1515, -1582,1516,1583, -1517,1583,1516, -1584,1518,1585, -1519,1585,1518, -1585,1519,1586, -1520,1586,1519, -1586,1520,1587, -1521,1587,1520, -1587,1521,1588, -1522,1588,1521, -1588,1522,1589, -1523,1589,1522, -1589,1523,1590, -1524,1590,1523, -1590,1524,1591, -1525,1591,1524, -1591,1525,1592, -1526,1592,1525, -1592,1526,1593, -1527,1593,1526, -1593,1527,1594, -1528,1594,1527, -1594,1528,1595, -1529,1595,1528, -1595,1529,1596, -1530,1596,1529, -1596,1530,1597, -1531,1597,1530, -1597,1531,1598, -1532,1598,1531, -1598,1532,1599, -1533,1599,1532, -1599,1533,1600, -1534,1600,1533, -1600,1534,1601, -1535,1601,1534, -1601,1535,1602, -1536,1602,1535, -1602,1536,1603, -1537,1603,1536, -1603,1537,1604, -1538,1604,1537, -1604,1538,1605, -1539,1605,1538, -1605,1539,1606, -1540,1606,1539, -1606,1540,1607, -1541,1607,1540, -1607,1541,1608, -1542,1608,1541, -1608,1542,1609, -1543,1609,1542, -1609,1543,1610, -1544,1610,1543, -1610,1544,1611, -1545,1611,1544, -1611,1545,1612, -1546,1612,1545, -1612,1546,1613, -1547,1613,1546, -1613,1547,1614, -1548,1614,1547, -1614,1548,1615, -1549,1615,1548, -1615,1549,1616, -1550,1616,1549, -1616,1550,1617, -1551,1617,1550, -1617,1551,1618, -1552,1618,1551, -1618,1552,1619, -1553,1619,1552, -1619,1553,1620, -1554,1620,1553, -1620,1554,1621, -1555,1621,1554, -1621,1555,1622, -1556,1622,1555, -1622,1556,1623, -1557,1623,1556, -1623,1557,1624, -1558,1624,1557, -1624,1558,1625, -1559,1625,1558, -1625,1559,1626, -1560,1626,1559, -1626,1560,1627, -1561,1627,1560, -1627,1561,1628, -1562,1628,1561, -1628,1562,1629, -1563,1629,1562, -1629,1563,1630, -1564,1630,1563, -1630,1564,1631, -1565,1631,1564, -1631,1565,1632, -1566,1632,1565, -1632,1566,1633, -1567,1633,1566, -1633,1567,1634, -1568,1634,1567, -1634,1568,1635, -1569,1635,1568, -1635,1569,1636, -1570,1636,1569, -1636,1570,1637, -1571,1637,1570, -1637,1571,1638, -1572,1638,1571, -1638,1572,1639, -1573,1639,1572, -1639,1573,1640, -1574,1640,1573, -1640,1574,1641, -1575,1641,1574, -1641,1575,1642, -1576,1642,1575, -1642,1576,1643, -1577,1643,1576, -1643,1577,1644, -1578,1644,1577, -1644,1578,1645, -1579,1645,1578, -1645,1579,1646, -1580,1646,1579, -1646,1580,1647, -1581,1647,1580, -1647,1581,1648, -1582,1648,1581, -1648,1582,1649, -1583,1649,1582, -1650,1584,1651, -1585,1651,1584, -1651,1585,1652, -1586,1652,1585, -1652,1586,1653, -1587,1653,1586, -1653,1587,1654, -1588,1654,1587, -1654,1588,1655, -1589,1655,1588, -1655,1589,1656, -1590,1656,1589, -1656,1590,1657, -1591,1657,1590, -1657,1591,1658, -1592,1658,1591, -1658,1592,1659, -1593,1659,1592, -1659,1593,1660, -1594,1660,1593, -1660,1594,1661, -1595,1661,1594, -1661,1595,1662, -1596,1662,1595, -1662,1596,1663, -1597,1663,1596, -1663,1597,1664, -1598,1664,1597, -1664,1598,1665, -1599,1665,1598, -1665,1599,1666, -1600,1666,1599, -1666,1600,1667, -1601,1667,1600, -1667,1601,1668, -1602,1668,1601, -1668,1602,1669, -1603,1669,1602, -1669,1603,1670, -1604,1670,1603, -1670,1604,1671, -1605,1671,1604, -1671,1605,1672, -1606,1672,1605, -1672,1606,1673, -1607,1673,1606, -1673,1607,1674, -1608,1674,1607, -1674,1608,1675, -1609,1675,1608, -1675,1609,1676, -1610,1676,1609, -1676,1610,1677, -1611,1677,1610, -1677,1611,1678, -1612,1678,1611, -1678,1612,1679, -1613,1679,1612, -1679,1613,1680, -1614,1680,1613, -1680,1614,1681, -1615,1681,1614, -1681,1615,1682, -1616,1682,1615, -1682,1616,1683, -1617,1683,1616, -1683,1617,1684, -1618,1684,1617, -1684,1618,1685, -1619,1685,1618, -1685,1619,1686, -1620,1686,1619, -1686,1620,1687, -1621,1687,1620, -1687,1621,1688, -1622,1688,1621, -1688,1622,1689, -1623,1689,1622, -1689,1623,1690, -1624,1690,1623, -1690,1624,1691, -1625,1691,1624, -1691,1625,1692, -1626,1692,1625, -1692,1626,1693, -1627,1693,1626, -1693,1627,1694, -1628,1694,1627, -1694,1628,1695, -1629,1695,1628, -1695,1629,1696, -1630,1696,1629, -1696,1630,1697, -1631,1697,1630, -1697,1631,1698, -1632,1698,1631, -1698,1632,1699, -1633,1699,1632, -1699,1633,1700, -1634,1700,1633, -1700,1634,1701, -1635,1701,1634, -1701,1635,1702, -1636,1702,1635, -1702,1636,1703, -1637,1703,1636, -1703,1637,1704, -1638,1704,1637, -1704,1638,1705, -1639,1705,1638, -1705,1639,1706, -1640,1706,1639, -1706,1640,1707, -1641,1707,1640, -1707,1641,1708, -1642,1708,1641, -1708,1642,1709, -1643,1709,1642, -1709,1643,1710, -1644,1710,1643, -1710,1644,1711, -1645,1711,1644, -1711,1645,1712, -1646,1712,1645, -1712,1646,1713, -1647,1713,1646, -1713,1647,1714, -1648,1714,1647, -1714,1648,1715, -1649,1715,1648, -1716,1650,1717, -1651,1717,1650, -1717,1651,1718, -1652,1718,1651, -1718,1652,1719, -1653,1719,1652, -1719,1653,1720, -1654,1720,1653, -1720,1654,1721, -1655,1721,1654, -1721,1655,1722, -1656,1722,1655, -1722,1656,1723, -1657,1723,1656, -1723,1657,1724, -1658,1724,1657, -1724,1658,1725, -1659,1725,1658, -1725,1659,1726, -1660,1726,1659, -1726,1660,1727, -1661,1727,1660, -1727,1661,1728, -1662,1728,1661, -1728,1662,1729, -1663,1729,1662, -1729,1663,1730, -1664,1730,1663, -1730,1664,1731, -1665,1731,1664, -1731,1665,1732, -1666,1732,1665, -1732,1666,1733, -1667,1733,1666, -1733,1667,1734, -1668,1734,1667, -1734,1668,1735, -1669,1735,1668, -1735,1669,1736, -1670,1736,1669, -1736,1670,1737, -1671,1737,1670, -1737,1671,1738, -1672,1738,1671, -1738,1672,1739, -1673,1739,1672, -1739,1673,1740, -1674,1740,1673, -1740,1674,1741, -1675,1741,1674, -1741,1675,1742, -1676,1742,1675, -1742,1676,1743, -1677,1743,1676, -1743,1677,1744, -1678,1744,1677, -1744,1678,1745, -1679,1745,1678, -1745,1679,1746, -1680,1746,1679, -1746,1680,1747, -1681,1747,1680, -1747,1681,1748, -1682,1748,1681, -1748,1682,1749, -1683,1749,1682, -1749,1683,1750, -1684,1750,1683, -1750,1684,1751, -1685,1751,1684, -1751,1685,1752, -1686,1752,1685, -1752,1686,1753, -1687,1753,1686, -1753,1687,1754, -1688,1754,1687, -1754,1688,1755, -1689,1755,1688, -1755,1689,1756, -1690,1756,1689, -1756,1690,1757, -1691,1757,1690, -1757,1691,1758, -1692,1758,1691, -1758,1692,1759, -1693,1759,1692, -1759,1693,1760, -1694,1760,1693, -1760,1694,1761, -1695,1761,1694, -1761,1695,1762, -1696,1762,1695, -1762,1696,1763, -1697,1763,1696, -1763,1697,1764, -1698,1764,1697, -1764,1698,1765, -1699,1765,1698, -1765,1699,1766, -1700,1766,1699, -1766,1700,1767, -1701,1767,1700, -1767,1701,1768, -1702,1768,1701, -1768,1702,1769, -1703,1769,1702, -1769,1703,1770, -1704,1770,1703, -1770,1704,1771, -1705,1771,1704, -1771,1705,1772, -1706,1772,1705, -1772,1706,1773, -1707,1773,1706, -1773,1707,1774, -1708,1774,1707, -1774,1708,1775, -1709,1775,1708, -1775,1709,1776, -1710,1776,1709, -1776,1710,1777, -1711,1777,1710, -1777,1711,1778, -1712,1778,1711, -1778,1712,1779, -1713,1779,1712, -1779,1713,1780, -1714,1780,1713, -1780,1714,1781, -1715,1781,1714, -1782,1716,1783, -1717,1783,1716, -1783,1717,1784, -1718,1784,1717, -1784,1718,1785, -1719,1785,1718, -1785,1719,1786, -1720,1786,1719, -1786,1720,1787, -1721,1787,1720, -1787,1721,1788, -1722,1788,1721, -1788,1722,1789, -1723,1789,1722, -1789,1723,1790, -1724,1790,1723, -1790,1724,1791, -1725,1791,1724, -1791,1725,1792, -1726,1792,1725, -1792,1726,1793, -1727,1793,1726, -1793,1727,1794, -1728,1794,1727, -1794,1728,1795, -1729,1795,1728, -1795,1729,1796, -1730,1796,1729, -1796,1730,1797, -1731,1797,1730, -1797,1731,1798, -1732,1798,1731, -1798,1732,1799, -1733,1799,1732, -1799,1733,1800, -1734,1800,1733, -1800,1734,1801, -1735,1801,1734, -1801,1735,1802, -1736,1802,1735, -1802,1736,1803, -1737,1803,1736, -1803,1737,1804, -1738,1804,1737, -1804,1738,1805, -1739,1805,1738, -1805,1739,1806, -1740,1806,1739, -1806,1740,1807, -1741,1807,1740, -1807,1741,1808, -1742,1808,1741, -1808,1742,1809, -1743,1809,1742, -1809,1743,1810, -1744,1810,1743, -1810,1744,1811, -1745,1811,1744, -1811,1745,1812, -1746,1812,1745, -1812,1746,1813, -1747,1813,1746, -1813,1747,1814, -1748,1814,1747, -1814,1748,1815, -1749,1815,1748, -1815,1749,1816, -1750,1816,1749, -1816,1750,1817, -1751,1817,1750, -1817,1751,1818, -1752,1818,1751, -1818,1752,1819, -1753,1819,1752, -1819,1753,1820, -1754,1820,1753, -1820,1754,1821, -1755,1821,1754, -1821,1755,1822, -1756,1822,1755, -1822,1756,1823, -1757,1823,1756, -1823,1757,1824, -1758,1824,1757, -1824,1758,1825, -1759,1825,1758, -1825,1759,1826, -1760,1826,1759, -1826,1760,1827, -1761,1827,1760, -1827,1761,1828, -1762,1828,1761, -1828,1762,1829, -1763,1829,1762, -1829,1763,1830, -1764,1830,1763, -1830,1764,1831, -1765,1831,1764, -1831,1765,1832, -1766,1832,1765, -1832,1766,1833, -1767,1833,1766, -1833,1767,1834, -1768,1834,1767, -1834,1768,1835, -1769,1835,1768, -1835,1769,1836, -1770,1836,1769, -1836,1770,1837, -1771,1837,1770, -1837,1771,1838, -1772,1838,1771, -1838,1772,1839, -1773,1839,1772, -1839,1773,1840, -1774,1840,1773, -1840,1774,1841, -1775,1841,1774, -1841,1775,1842, -1776,1842,1775, -1842,1776,1843, -1777,1843,1776, -1843,1777,1844, -1778,1844,1777, -1844,1778,1845, -1779,1845,1778, -1845,1779,1846, -1780,1846,1779, -1846,1780,1847, -1781,1847,1780, -1848,1782,1849, -1783,1849,1782, -1849,1783,1850, -1784,1850,1783, -1850,1784,1851, -1785,1851,1784, -1851,1785,1852, -1786,1852,1785, -1852,1786,1853, -1787,1853,1786, -1853,1787,1854, -1788,1854,1787, -1854,1788,1855, -1789,1855,1788, -1855,1789,1856, -1790,1856,1789, -1856,1790,1857, -1791,1857,1790, -1857,1791,1858, -1792,1858,1791, -1858,1792,1859, -1793,1859,1792, -1859,1793,1860, -1794,1860,1793, -1860,1794,1861, -1795,1861,1794, -1861,1795,1862, -1796,1862,1795, -1862,1796,1863, -1797,1863,1796, -1863,1797,1864, -1798,1864,1797, -1864,1798,1865, -1799,1865,1798, -1865,1799,1866, -1800,1866,1799, -1866,1800,1867, -1801,1867,1800, -1867,1801,1868, -1802,1868,1801, -1868,1802,1869, -1803,1869,1802, -1869,1803,1870, -1804,1870,1803, -1870,1804,1871, -1805,1871,1804, -1871,1805,1872, -1806,1872,1805, -1872,1806,1873, -1807,1873,1806, -1873,1807,1874, -1808,1874,1807, -1874,1808,1875, -1809,1875,1808, -1875,1809,1876, -1810,1876,1809, -1876,1810,1877, -1811,1877,1810, -1877,1811,1878, -1812,1878,1811, -1878,1812,1879, -1813,1879,1812, -1879,1813,1880, -1814,1880,1813, -1880,1814,1881, -1815,1881,1814, -1881,1815,1882, -1816,1882,1815, -1882,1816,1883, -1817,1883,1816, -1883,1817,1884, -1818,1884,1817, -1884,1818,1885, -1819,1885,1818, -1885,1819,1886, -1820,1886,1819, -1886,1820,1887, -1821,1887,1820, -1887,1821,1888, -1822,1888,1821, -1888,1822,1889, -1823,1889,1822, -1889,1823,1890, -1824,1890,1823, -1890,1824,1891, -1825,1891,1824, -1891,1825,1892, -1826,1892,1825, -1892,1826,1893, -1827,1893,1826, -1893,1827,1894, -1828,1894,1827, -1894,1828,1895, -1829,1895,1828, -1895,1829,1896, -1830,1896,1829, -1896,1830,1897, -1831,1897,1830, -1897,1831,1898, -1832,1898,1831, -1898,1832,1899, -1833,1899,1832, -1899,1833,1900, -1834,1900,1833, -1900,1834,1901, -1835,1901,1834, -1901,1835,1902, -1836,1902,1835, -1902,1836,1903, -1837,1903,1836, -1903,1837,1904, -1838,1904,1837, -1904,1838,1905, -1839,1905,1838, -1905,1839,1906, -1840,1906,1839, -1906,1840,1907, -1841,1907,1840, -1907,1841,1908, -1842,1908,1841, -1908,1842,1909, -1843,1909,1842, -1909,1843,1910, -1844,1910,1843, -1910,1844,1911, -1845,1911,1844, -1911,1845,1912, -1846,1912,1845, -1912,1846,1913, -1847,1913,1846, -1914,1848,1915, -1849,1915,1848, -1915,1849,1916, -1850,1916,1849, -1916,1850,1917, -1851,1917,1850, -1917,1851,1918, -1852,1918,1851, -1918,1852,1919, -1853,1919,1852, -1919,1853,1920, -1854,1920,1853, -1920,1854,1921, -1855,1921,1854, -1921,1855,1922, -1856,1922,1855, -1922,1856,1923, -1857,1923,1856, -1923,1857,1924, -1858,1924,1857, -1924,1858,1925, -1859,1925,1858, -1925,1859,1926, -1860,1926,1859, -1926,1860,1927, -1861,1927,1860, -1927,1861,1928, -1862,1928,1861, -1928,1862,1929, -1863,1929,1862, -1929,1863,1930, -1864,1930,1863, -1930,1864,1931, -1865,1931,1864, -1931,1865,1932, -1866,1932,1865, -1932,1866,1933, -1867,1933,1866, -1933,1867,1934, -1868,1934,1867, -1934,1868,1935, -1869,1935,1868, -1935,1869,1936, -1870,1936,1869, -1936,1870,1937, -1871,1937,1870, -1937,1871,1938, -1872,1938,1871, -1938,1872,1939, -1873,1939,1872, -1939,1873,1940, -1874,1940,1873, -1940,1874,1941, -1875,1941,1874, -1941,1875,1942, -1876,1942,1875, -1942,1876,1943, -1877,1943,1876, -1943,1877,1944, -1878,1944,1877, -1944,1878,1945, -1879,1945,1878, -1945,1879,1946, -1880,1946,1879, -1946,1880,1947, -1881,1947,1880, -1947,1881,1948, -1882,1948,1881, -1948,1882,1949, -1883,1949,1882, -1949,1883,1950, -1884,1950,1883, -1950,1884,1951, -1885,1951,1884, -1951,1885,1952, -1886,1952,1885, -1952,1886,1953, -1887,1953,1886, -1953,1887,1954, -1888,1954,1887, -1954,1888,1955, -1889,1955,1888, -1955,1889,1956, -1890,1956,1889, -1956,1890,1957, -1891,1957,1890, -1957,1891,1958, -1892,1958,1891, -1958,1892,1959, -1893,1959,1892, -1959,1893,1960, -1894,1960,1893, -1960,1894,1961, -1895,1961,1894, -1961,1895,1962, -1896,1962,1895, -1962,1896,1963, -1897,1963,1896, -1963,1897,1964, -1898,1964,1897, -1964,1898,1965, -1899,1965,1898, -1965,1899,1966, -1900,1966,1899, -1966,1900,1967, -1901,1967,1900, -1967,1901,1968, -1902,1968,1901, -1968,1902,1969, -1903,1969,1902, -1969,1903,1970, -1904,1970,1903, -1970,1904,1971, -1905,1971,1904, -1971,1905,1972, -1906,1972,1905, -1972,1906,1973, -1907,1973,1906, -1973,1907,1974, -1908,1974,1907, -1974,1908,1975, -1909,1975,1908, -1975,1909,1976, -1910,1976,1909, -1976,1910,1977, -1911,1977,1910, -1977,1911,1978, -1912,1978,1911, -1978,1912,1979, -1913,1979,1912, -1980,1914,1981, -1915,1981,1914, -1981,1915,1982, -1916,1982,1915, -1982,1916,1983, -1917,1983,1916, -1983,1917,1984, -1918,1984,1917, -1984,1918,1985, -1919,1985,1918, -1985,1919,1986, -1920,1986,1919, -1986,1920,1987, -1921,1987,1920, -1987,1921,1988, -1922,1988,1921, -1988,1922,1989, -1923,1989,1922, -1989,1923,1990, -1924,1990,1923, -1990,1924,1991, -1925,1991,1924, -1991,1925,1992, -1926,1992,1925, -1992,1926,1993, -1927,1993,1926, -1993,1927,1994, -1928,1994,1927, -1994,1928,1995, -1929,1995,1928, -1995,1929,1996, -1930,1996,1929, -1996,1930,1997, -1931,1997,1930, -1997,1931,1998, -1932,1998,1931, -1998,1932,1999, -1933,1999,1932, -1999,1933,2000, -1934,2000,1933, -2000,1934,2001, -1935,2001,1934, -2001,1935,2002, -1936,2002,1935, -2002,1936,2003, -1937,2003,1936, -2003,1937,2004, -1938,2004,1937, -2004,1938,2005, -1939,2005,1938, -2005,1939,2006, -1940,2006,1939, -2006,1940,2007, -1941,2007,1940, -2007,1941,2008, -1942,2008,1941, -2008,1942,2009, -1943,2009,1942, -2009,1943,2010, -1944,2010,1943, -2010,1944,2011, -1945,2011,1944, -2011,1945,2012, -1946,2012,1945, -2012,1946,2013, -1947,2013,1946, -2013,1947,2014, -1948,2014,1947, -2014,1948,2015, -1949,2015,1948, -2015,1949,2016, -1950,2016,1949, -2016,1950,2017, -1951,2017,1950, -2017,1951,2018, -1952,2018,1951, -2018,1952,2019, -1953,2019,1952, -2019,1953,2020, -1954,2020,1953, -2020,1954,2021, -1955,2021,1954, -2021,1955,2022, -1956,2022,1955, -2022,1956,2023, -1957,2023,1956, -2023,1957,2024, -1958,2024,1957, -2024,1958,2025, -1959,2025,1958, -2025,1959,2026, -1960,2026,1959, -2026,1960,2027, -1961,2027,1960, -2027,1961,2028, -1962,2028,1961, -2028,1962,2029, -1963,2029,1962, -2029,1963,2030, -1964,2030,1963, -2030,1964,2031, -1965,2031,1964, -2031,1965,2032, -1966,2032,1965, -2032,1966,2033, -1967,2033,1966, -2033,1967,2034, -1968,2034,1967, -2034,1968,2035, -1969,2035,1968, -2035,1969,2036, -1970,2036,1969, -2036,1970,2037, -1971,2037,1970, -2037,1971,2038, -1972,2038,1971, -2038,1972,2039, -1973,2039,1972, -2039,1973,2040, -1974,2040,1973, -2040,1974,2041, -1975,2041,1974, -2041,1975,2042, -1976,2042,1975, -2042,1976,2043, -1977,2043,1976, -2043,1977,2044, -1978,2044,1977, -2044,1978,2045, -1979,2045,1978, -2046,1980,2047, -1981,2047,1980, -2047,1981,2048, -1982,2048,1981, -2048,1982,2049, -1983,2049,1982, -2049,1983,2050, -1984,2050,1983, -2050,1984,2051, -1985,2051,1984, -2051,1985,2052, -1986,2052,1985, -2052,1986,2053, -1987,2053,1986, -2053,1987,2054, -1988,2054,1987, -2054,1988,2055, -1989,2055,1988, -2055,1989,2056, -1990,2056,1989, -2056,1990,2057, -1991,2057,1990, -2057,1991,2058, -1992,2058,1991, -2058,1992,2059, -1993,2059,1992, -2059,1993,2060, -1994,2060,1993, -2060,1994,2061, -1995,2061,1994, -2061,1995,2062, -1996,2062,1995, -2062,1996,2063, -1997,2063,1996, -2063,1997,2064, -1998,2064,1997, -2064,1998,2065, -1999,2065,1998, -2065,1999,2066, -2000,2066,1999, -2066,2000,2067, -2001,2067,2000, -2067,2001,2068, -2002,2068,2001, -2068,2002,2069, -2003,2069,2002, -2069,2003,2070, -2004,2070,2003, -2070,2004,2071, -2005,2071,2004, -2071,2005,2072, -2006,2072,2005, -2072,2006,2073, -2007,2073,2006, -2073,2007,2074, -2008,2074,2007, -2074,2008,2075, -2009,2075,2008, -2075,2009,2076, -2010,2076,2009, -2076,2010,2077, -2011,2077,2010, -2077,2011,2078, -2012,2078,2011, -2078,2012,2079, -2013,2079,2012, -2079,2013,2080, -2014,2080,2013, -2080,2014,2081, -2015,2081,2014, -2081,2015,2082, -2016,2082,2015, -2082,2016,2083, -2017,2083,2016, -2083,2017,2084, -2018,2084,2017, -2084,2018,2085, -2019,2085,2018, -2085,2019,2086, -2020,2086,2019, -2086,2020,2087, -2021,2087,2020, -2087,2021,2088, -2022,2088,2021, -2088,2022,2089, -2023,2089,2022, -2089,2023,2090, -2024,2090,2023, -2090,2024,2091, -2025,2091,2024, -2091,2025,2092, -2026,2092,2025, -2092,2026,2093, -2027,2093,2026, -2093,2027,2094, -2028,2094,2027, -2094,2028,2095, -2029,2095,2028, -2095,2029,2096, -2030,2096,2029, -2096,2030,2097, -2031,2097,2030, -2097,2031,2098, -2032,2098,2031, -2098,2032,2099, -2033,2099,2032, -2099,2033,2100, -2034,2100,2033, -2100,2034,2101, -2035,2101,2034, -2101,2035,2102, -2036,2102,2035, -2102,2036,2103, -2037,2103,2036, -2103,2037,2104, -2038,2104,2037, -2104,2038,2105, -2039,2105,2038, -2105,2039,2106, -2040,2106,2039, -2106,2040,2107, -2041,2107,2040, -2107,2041,2108, -2042,2108,2041, -2108,2042,2109, -2043,2109,2042, -2109,2043,2110, -2044,2110,2043, -2110,2044,2111, -2045,2111,2044, -2112,2046,2113, -2047,2113,2046, -2113,2047,2114, -2048,2114,2047, -2114,2048,2115, -2049,2115,2048, -2115,2049,2116, -2050,2116,2049, -2116,2050,2117, -2051,2117,2050, -2117,2051,2118, -2052,2118,2051, -2118,2052,2119, -2053,2119,2052, -2119,2053,2120, -2054,2120,2053, -2120,2054,2121, -2055,2121,2054, -2121,2055,2122, -2056,2122,2055, -2122,2056,2123, -2057,2123,2056, -2123,2057,2124, -2058,2124,2057, -2124,2058,2125, -2059,2125,2058, -2125,2059,2126, -2060,2126,2059, -2126,2060,2127, -2061,2127,2060, -2127,2061,2128, -2062,2128,2061, -2128,2062,2129, -2063,2129,2062, -2129,2063,2130, -2064,2130,2063, -2130,2064,2131, -2065,2131,2064, -2131,2065,2132, -2066,2132,2065, -2132,2066,2133, -2067,2133,2066, -2133,2067,2134, -2068,2134,2067, -2134,2068,2135, -2069,2135,2068, -2135,2069,2136, -2070,2136,2069, -2136,2070,2137, -2071,2137,2070, -2137,2071,2138, -2072,2138,2071, -2138,2072,2139, -2073,2139,2072, -2139,2073,2140, -2074,2140,2073, -2140,2074,2141, -2075,2141,2074, -2141,2075,2142, -2076,2142,2075, -2142,2076,2143, -2077,2143,2076, -2143,2077,2144, -2078,2144,2077, -2144,2078,2145, -2079,2145,2078, -2145,2079,2146, -2080,2146,2079, -2146,2080,2147, -2081,2147,2080, -2147,2081,2148, -2082,2148,2081, -2148,2082,2149, -2083,2149,2082, -2149,2083,2150, -2084,2150,2083, -2150,2084,2151, -2085,2151,2084, -2151,2085,2152, -2086,2152,2085, -2152,2086,2153, -2087,2153,2086, -2153,2087,2154, -2088,2154,2087, -2154,2088,2155, -2089,2155,2088, -2155,2089,2156, -2090,2156,2089, -2156,2090,2157, -2091,2157,2090, -2157,2091,2158, -2092,2158,2091, -2158,2092,2159, -2093,2159,2092, -2159,2093,2160, -2094,2160,2093, -2160,2094,2161, -2095,2161,2094, -2161,2095,2162, -2096,2162,2095, -2162,2096,2163, -2097,2163,2096, -2163,2097,2164, -2098,2164,2097, -2164,2098,2165, -2099,2165,2098, -2165,2099,2166, -2100,2166,2099, -2166,2100,2167, -2101,2167,2100, -2167,2101,2168, -2102,2168,2101, -2168,2102,2169, -2103,2169,2102, -2169,2103,2170, -2104,2170,2103, -2170,2104,2171, -2105,2171,2104, -2171,2105,2172, -2106,2172,2105, -2172,2106,2173, -2107,2173,2106, -2173,2107,2174, -2108,2174,2107, -2174,2108,2175, -2109,2175,2108, -2175,2109,2176, -2110,2176,2109, -2176,2110,2177, -2111,2177,2110, -}; - -#define Landscape01VtxCount 2048 -#define Landscape01IdxCount 11718 - -btScalar Landscape01Vtx[] = { -3.90626f,0.452911f,246.094f, -3.90626f,1.52302f,250.0f, -7.8125f,1.18238f,246.094f, -7.81251f,1.7549f,250.0f, -11.7188f,2.12911f,246.094f, -11.7188f,2.62454f,250.0f, -15.625f,3.01456f,246.094f, -15.625f,3.22814f,250.0f, -19.5313f,3.97431f,246.094f, -19.5313f,3.63231f,250.0f, -23.4375f,4.08741f,246.094f, -23.4375f,4.24097f,250.0f, -27.3438f,5.8163f,246.094f, -27.3438f,5.93409f,250.0f, -31.25f,6.86809f,246.094f, -31.25f,7.34105f,250.0f, -35.1563f,8.25405f,246.094f, -35.1563f,8.62507f,250.0f, -39.0625f,8.38601f,246.094f, -39.0625f,8.68483f,250.0f, -42.9688f,6.94797f,246.094f, -42.9688f,7.71847f,250.0f, -46.875f,4.60698f,246.094f, -46.875f,6.12159f,250.0f, -50.7813f,3.6429f,246.094f, -50.7813f,5.13002f,250.0f, -54.6875f,4.01945f,246.094f, -54.6875f,5.50476f,250.0f, -58.5938f,4.05996f,246.094f, -58.5938f,5.31917f,250.0f, -62.5f,3.98995f,246.094f, -62.5f,5.51823f,250.0f, -66.4063f,5.44402f,246.094f, -66.4063f,6.80029f,250.0f, -70.3125f,6.03873f,246.094f, -70.3125f,7.41783f,250.0f, -74.2188f,6.37187f,246.094f, -74.2188f,8.16051f,250.0f, -78.125f,6.74414f,246.094f, -78.125f,8.72099f,250.0f, -82.0313f,7.37958f,246.094f, -82.0313f,10.1125f,250.0f, -85.9375f,8.97782f,246.094f, -85.9375f,10.4624f,250.0f, -89.8438f,11.0829f,246.094f, -89.8438f,11.6403f,250.0f, -93.75f,12.3286f,246.094f, -93.75f,13.1378f,250.0f, -97.6563f,13.5966f,246.094f, -97.6563f,14.2949f,250.0f, -101.563f,15.5602f,246.094f, -101.563f,16.9487f,250.0f, -105.469f,16.9944f,246.094f, -105.469f,18.1946f,250.0f, -109.375f,17.886f,246.094f, -109.375f,19.5101f,250.0f, -113.281f,18.9289f,246.094f, -113.281f,20.9286f,250.0f, -117.188f,18.9873f,246.094f, -117.188f,20.0636f,250.0f, -121.094f,18.4954f,246.094f, -121.094f,20.5657f,250.0f, -125.0f,20.1484f,246.094f, -125.0f,21.1466f,250.0f, -128.906f,20.5032f,246.094f, -128.906f,22.3026f,250.0f, -132.813f,21.212f,246.094f, -132.813f,22.9139f,250.0f, -136.719f,22.289f,246.094f, -136.719f,24.4671f,250.0f, -140.625f,23.2441f,246.094f, -140.625f,24.3276f,250.0f, -144.531f,22.4971f,246.094f, -144.531f,24.3128f,250.0f, -148.438f,22.6347f,246.094f, -148.438f,23.8291f,250.0f, -152.344f,23.5767f,246.094f, -152.344f,24.1369f,250.0f, -156.25f,25.193f,246.094f, -156.25f,24.9132f,250.0f, -160.156f,25.2521f,246.094f, -160.156f,24.7251f,250.0f, -164.063f,25.7424f,246.094f, -164.063f,24.1169f,250.0f, -167.969f,24.3269f,246.094f, -167.969f,24.6092f,250.0f, -171.875f,25.0479f,246.094f, -171.875f,24.967f,250.0f, -175.781f,25.0107f,246.094f, -175.781f,24.7879f,250.0f, -179.688f,23.583f,246.094f, -179.688f,22.6841f,250.0f, -183.594f,20.958f,246.094f, -183.594f,20.6584f,250.0f, -187.5f,19.7535f,246.094f, -187.5f,20.0313f,250.0f, -191.406f,20.4707f,246.094f, -191.406f,20.3896f,250.0f, -195.313f,19.7551f,246.094f, -195.313f,21.5643f,250.0f, -199.219f,19.698f,246.094f, -199.219f,21.5733f,250.0f, -203.125f,20.0732f,246.094f, -203.125f,20.38f,250.0f, -207.031f,19.8667f,246.094f, -207.031f,19.3779f,250.0f, -210.938f,19.4501f,246.094f, -210.938f,19.5994f,250.0f, -214.844f,19.2918f,246.094f, -214.844f,19.0966f,250.0f, -218.75f,18.7652f,246.094f, -218.75f,19.9256f,250.0f, -222.656f,18.8129f,246.094f, -222.656f,19.8704f,250.0f, -226.563f,18.3547f,246.094f, -226.563f,18.8671f,250.0f, -230.469f,16.9801f,246.094f, -230.469f,17.4931f,250.0f, -234.375f,15.6173f,246.094f, -234.375f,16.1699f,250.0f, -238.281f,15.549f,246.094f, -238.281f,15.3704f,250.0f, -242.188f,15.2468f,246.094f, -242.188f,15.0306f,250.0f, -246.094f,14.1325f,246.094f, -246.094f,14.2622f,250.0f, -250.0f,14.4063f,246.094f, -250.0f,14.3657f,250.0f, -3.90626f,2.21488f,242.188f, -7.81252f,2.28606f,242.188f, -11.7188f,3.88428f,242.188f, -15.625f,3.39117f,242.188f, -19.5313f,3.64824f,242.188f, -23.4375f,4.14072f,242.188f, -27.3438f,5.74104f,242.188f, -31.25f,6.66142f,242.188f, -35.1563f,7.31371f,242.188f, -39.0625f,7.68371f,242.188f, -42.9688f,6.99041f,242.188f, -46.875f,4.89778f,242.188f, -50.7813f,2.64913f,242.188f, -54.6875f,2.76175f,242.188f, -58.5938f,3.10499f,242.188f, -62.5f,4.61915f,242.188f, -66.4063f,5.36769f,242.188f, -70.3125f,5.41759f,242.188f, -74.2188f,5.42279f,242.188f, -78.125f,5.53934f,242.188f, -82.0313f,5.38421f,242.188f, -85.9375f,7.77227f,242.188f, -89.8438f,9.40622f,242.188f, -93.75f,11.2904f,242.188f, -97.6563f,12.0748f,242.188f, -101.563f,14.1058f,242.188f, -105.469f,15.1513f,242.188f, -109.375f,15.9477f,242.188f, -113.281f,16.843f,242.188f, -117.188f,17.2117f,242.188f, -121.094f,18.2641f,242.188f, -125.0f,18.8672f,242.188f, -128.906f,19.3239f,242.188f, -132.813f,20.1067f,242.188f, -136.719f,20.8307f,242.188f, -140.625f,21.3646f,242.188f, -144.531f,21.6047f,242.188f, -148.438f,22.2456f,242.188f, -152.344f,23.5103f,242.188f, -156.25f,24.8533f,242.188f, -160.156f,25.4504f,242.188f, -164.063f,25.9357f,242.188f, -167.969f,24.8535f,242.188f, -171.875f,25.3099f,242.188f, -175.781f,25.3494f,242.188f, -179.688f,24.2229f,242.188f, -183.594f,21.0829f,242.188f, -187.5f,19.574f,242.188f, -191.406f,19.9835f,242.188f, -195.313f,19.6061f,242.188f, -199.219f,18.9509f,242.188f, -203.125f,20.1818f,242.188f, -207.031f,19.2962f,242.188f, -210.938f,18.8908f,242.188f, -214.844f,18.7996f,242.188f, -218.75f,18.7982f,242.188f, -222.656f,18.3283f,242.188f, -226.563f,17.7287f,242.188f, -230.469f,15.6882f,242.188f, -234.375f,15.2468f,242.188f, -238.281f,15.2703f,242.188f, -242.188f,14.4812f,242.188f, -246.094f,14.5597f,242.188f, -250.0f,14.178f,242.188f, -3.90626f,3.04396f,238.281f, -7.81252f,3.88428f,238.281f, -11.7188f,4.51367f,238.281f, -15.625f,4.1993f,238.281f, -19.5313f,4.48585f,238.281f, -23.4375f,5.11452f,238.281f, -27.3438f,4.98441f,238.281f, -31.25f,5.77536f,238.281f, -35.1563f,5.42743f,238.281f, -39.0625f,6.4581f,238.281f, -42.9688f,5.55272f,238.281f, -46.875f,3.69555f,238.281f, -50.7813f,3.08321f,238.281f, -54.6875f,2.96664f,238.281f, -58.5938f,3.94595f,238.281f, -62.5f,4.71605f,238.281f, -66.4063f,5.07906f,238.281f, -70.3125f,5.39291f,238.281f, -74.2188f,4.29289f,238.281f, -78.125f,4.20855f,238.281f, -82.0313f,5.10829f,238.281f, -85.9375f,5.48654f,238.281f, -89.8438f,7.06082f,238.281f, -93.75f,8.6827f,238.281f, -97.6563f,9.99779f,238.281f, -101.563f,11.9757f,238.281f, -105.469f,12.9031f,238.281f, -109.375f,13.7947f,238.281f, -113.281f,13.6154f,238.281f, -117.188f,15.9897f,238.281f, -121.094f,18.0884f,238.281f, -125.0f,18.714f,238.281f, -128.906f,19.1457f,238.281f, -132.813f,20.0791f,238.281f, -136.719f,20.3929f,238.281f, -140.625f,20.8277f,238.281f, -144.531f,21.2111f,238.281f, -148.438f,22.5091f,238.281f, -152.344f,23.9188f,238.281f, -156.25f,25.0278f,238.281f, -160.156f,25.8335f,238.281f, -164.063f,25.6558f,238.281f, -167.969f,24.3663f,238.281f, -171.875f,30.6775f,238.281f, -175.781f,30.89f,238.281f, -179.688f,29.2543f,238.281f, -183.594f,26.6241f,238.281f, -187.5f,24.7124f,238.281f, -191.406f,23.7048f,238.281f, -195.313f,23.3839f,238.281f, -199.219f,23.312f,238.281f, -203.125f,17.5221f,238.281f, -207.031f,17.418f,238.281f, -210.938f,17.5259f,238.281f, -214.844f,18.2392f,238.281f, -218.75f,18.6793f,238.281f, -222.656f,18.3701f,238.281f, -226.563f,17.2487f,238.281f, -230.469f,16.4f,238.281f, -234.375f,15.4998f,238.281f, -238.281f,14.6207f,238.281f, -242.188f,14.3055f,238.281f, -246.094f,14.2255f,238.281f, -250.0f,14.1326f,238.281f, -3.90626f,5.19166f,234.375f, -7.81252f,4.93292f,234.375f, -11.7188f,4.03413f,234.375f, -15.625f,3.70957f,234.375f, -19.5313f,4.44484f,234.375f, -23.4375f,5.12277f,234.375f, -27.3438f,4.60029f,234.375f, -31.25f,4.55048f,234.375f, -35.1563f,4.78512f,234.375f, -39.0625f,4.94627f,234.375f, -42.9688f,5.03351f,234.375f, -46.875f,3.08166f,234.375f, -50.7813f,2.57752f,234.375f, -54.6875f,3.08533f,234.375f, -58.5938f,4.0254f,234.375f, -62.5f,4.57575f,234.375f, -66.4063f,4.67125f,234.375f, -70.3125f,4.5612f,234.375f, -74.2188f,4.232f,234.375f, -78.125f,4.1571f,234.375f, -82.0313f,4.20157f,234.375f, -85.9375f,4.29102f,234.375f, -89.8438f,5.54826f,234.375f, -93.75f,7.06094f,234.375f, -97.6563f,8.27366f,234.375f, -101.563f,9.83852f,234.375f, -105.469f,10.9262f,234.375f, -109.375f,11.7812f,234.375f, -113.281f,13.8453f,234.375f, -117.188f,15.5538f,234.375f, -121.094f,16.8977f,234.375f, -125.0f,18.2996f,234.375f, -128.906f,19.6512f,234.375f, -132.813f,19.411f,234.375f, -136.719f,19.3317f,234.375f, -140.625f,20.656f,234.375f, -144.531f,21.6048f,234.375f, -148.438f,22.2246f,234.375f, -152.344f,23.6649f,234.375f, -156.25f,24.8772f,234.375f, -160.156f,27.6423f,234.375f, -164.063f,29.4442f,234.375f, -167.969f,29.6691f,234.375f, -171.875f,30.0772f,234.375f, -175.781f,30.3189f,234.375f, -179.688f,28.7319f,234.375f, -183.594f,26.6952f,234.375f, -187.5f,25.3375f,234.375f, -191.406f,24.1666f,234.375f, -195.313f,22.5458f,234.375f, -199.219f,22.2182f,234.375f, -203.125f,22.2413f,234.375f, -207.031f,21.8533f,234.375f, -210.938f,17.4596f,234.375f, -214.844f,17.2677f,234.375f, -218.75f,16.9584f,234.375f, -222.656f,16.6188f,234.375f, -226.563f,17.4388f,234.375f, -230.469f,16.936f,234.375f, -234.375f,15.6181f,234.375f, -238.281f,15.8373f,234.375f, -242.188f,15.0881f,234.375f, -246.094f,14.2247f,234.375f, -250.0f,14.111f,234.375f, -3.90626f,5.885f,230.469f, -7.81251f,5.4786f,230.469f, -11.7188f,5.0584f,230.469f, -15.625f,4.10283f,230.469f, -19.5313f,4.10569f,230.469f, -23.4375f,4.42202f,230.469f, -27.3438f,4.27849f,230.469f, -31.25f,4.25612f,230.469f, -35.1563f,3.83542f,230.469f, -39.0625f,3.37515f,230.469f, -42.9688f,4.16288f,230.469f, -46.875f,2.84197f,230.469f, -50.7813f,2.83467f,230.469f, -54.6875f,3.07874f,230.469f, -58.5938f,3.37745f,230.469f, -62.5f,4.09612f,230.469f, -66.4063f,4.65777f,230.469f, -70.3125f,4.45712f,230.469f, -74.2188f,3.89296f,230.469f, -78.125f,3.87471f,230.469f, -82.0313f,4.64568f,230.469f, -85.9375f,5.82987f,230.469f, -89.8438f,6.40084f,230.469f, -93.75f,7.65914f,230.469f, -97.6563f,8.07052f,230.469f, -101.563f,9.86632f,230.469f, -105.469f,11.8636f,230.469f, -109.375f,12.9547f,230.469f, -113.281f,14.2745f,230.469f, -117.188f,15.6876f,230.469f, -121.094f,17.2089f,230.469f, -125.0f,18.1267f,230.469f, -128.906f,19.379f,230.469f, -132.813f,19.2097f,230.469f, -136.719f,18.9335f,230.469f, -140.625f,19.9763f,230.469f, -144.531f,21.5401f,230.469f, -148.438f,21.7302f,230.469f, -152.344f,23.0108f,230.469f, -156.25f,28.7387f,230.469f, -160.156f,28.4179f,230.469f, -164.063f,28.6483f,230.469f, -167.969f,29.5567f,230.469f, -171.875f,29.589f,230.469f, -175.781f,29.7943f,230.469f, -179.688f,28.0587f,230.469f, -183.594f,27.6387f,230.469f, -187.5f,26.92f,230.469f, -191.406f,25.7995f,230.469f, -195.313f,23.8573f,230.469f, -199.219f,22.1543f,230.469f, -203.125f,21.8606f,230.469f, -207.031f,21.7644f,230.469f, -210.938f,22.284f,230.469f, -214.844f,22.465f,230.469f, -218.75f,16.4018f,230.469f, -222.656f,16.1053f,230.469f, -226.563f,16.9553f,230.469f, -230.469f,16.9851f,230.469f, -234.375f,16.0967f,230.469f, -238.281f,15.9758f,230.469f, -242.188f,15.3258f,230.469f, -246.094f,15.2909f,230.469f, -250.0f,14.7208f,230.469f, -3.90626f,6.89682f,226.563f, -7.81251f,6.58742f,226.563f, -11.7188f,6.03516f,226.563f, -15.625f,4.72243f,226.563f, -19.5313f,3.6445f,226.563f, -23.4375f,4.35761f,226.563f, -27.3438f,4.11714f,226.563f, -31.25f,4.31125f,226.563f, -35.1563f,3.42415f,226.563f, -39.0625f,2.29216f,226.563f, -42.9688f,2.47915f,226.563f, -46.875f,2.26767f,226.563f, -50.7813f,1.11914f,226.563f, -54.6875f,2.43266f,226.563f, -58.5938f,3.88718f,226.563f, -62.5f,3.9963f,226.563f, -66.4063f,4.30547f,226.563f, -70.3125f,4.43739f,226.563f, -74.2188f,3.89069f,226.563f, -78.125f,4.12082f,226.563f, -82.0313f,5.53252f,226.563f, -85.9375f,6.38493f,226.563f, -89.8438f,6.79959f,226.563f, -93.75f,8.29598f,226.563f, -97.6563f,8.48723f,226.563f, -101.563f,9.93554f,226.563f, -105.469f,11.5657f,226.563f, -109.375f,13.0486f,226.563f, -113.281f,13.8621f,226.563f, -117.188f,14.9688f,226.563f, -121.094f,16.3799f,226.563f, -125.0f,17.1973f,226.563f, -128.906f,17.376f,226.563f, -132.813f,18.1073f,226.563f, -136.719f,18.6844f,226.563f, -140.625f,18.5161f,226.563f, -144.531f,20.7617f,226.563f, -148.438f,21.0578f,226.563f, -152.344f,26.44f,226.563f, -156.25f,27.1807f,226.563f, -160.156f,27.2962f,226.563f, -164.063f,28.0507f,226.563f, -167.969f,28.6572f,226.563f, -171.875f,28.3487f,226.563f, -175.781f,23.7294f,226.563f, -179.688f,23.1113f,226.563f, -183.594f,22.5708f,226.563f, -187.5f,22.6165f,226.563f, -191.406f,21.8697f,226.563f, -195.313f,19.9841f,226.563f, -199.219f,22.9835f,226.563f, -203.125f,22.0743f,226.563f, -207.031f,22.4886f,226.563f, -210.938f,22.2516f,226.563f, -214.844f,22.3739f,226.563f, -218.75f,22.7815f,226.563f, -222.656f,17.0366f,226.563f, -226.563f,16.1334f,226.563f, -230.469f,16.9265f,226.563f, -234.375f,17.1793f,226.563f, -238.281f,17.3365f,226.563f, -242.188f,16.1971f,226.563f, -246.094f,15.2775f,226.563f, -250.0f,15.1313f,226.563f, -3.90626f,6.81349f,222.656f, -7.81251f,7.23848f,222.656f, -11.7188f,6.09864f,222.656f, -15.625f,4.9545f,222.656f, -19.5313f,3.88133f,222.656f, -23.4375f,4.06964f,222.656f, -27.3438f,3.90589f,222.656f, -31.25f,4.08304f,222.656f, -35.1563f,3.26204f,222.656f, -39.0625f,1.53457f,222.656f, -42.9688f,1.90835f,222.656f, -46.875f,1.98509f,222.656f, -50.7813f,2.14652f,222.656f, -54.6875f,2.7418f,222.656f, -58.5938f,3.74695f,222.656f, -62.5f,4.00354f,222.656f, -66.4063f,4.38792f,222.656f, -70.3125f,3.93121f,222.656f, -74.2188f,3.42647f,222.656f, -78.125f,5.0562f,222.656f, -82.0313f,5.98572f,222.656f, -85.9375f,6.52919f,222.656f, -89.8438f,6.83394f,222.656f, -93.75f,7.48974f,222.656f, -97.6563f,8.19267f,222.656f, -101.563f,9.33438f,222.656f, -105.469f,11.8423f,222.656f, -109.375f,13.1158f,222.656f, -113.281f,13.8944f,222.656f, -117.188f,14.8014f,222.656f, -121.094f,15.4129f,222.656f, -125.0f,15.6942f,222.656f, -128.906f,16.2049f,222.656f, -132.813f,17.0318f,222.656f, -136.719f,18.5423f,222.656f, -140.625f,18.8685f,222.656f, -144.531f,19.4529f,222.656f, -148.438f,25.9153f,222.656f, -152.344f,25.6773f,222.656f, -156.25f,26.0432f,222.656f, -160.156f,26.3016f,222.656f, -164.063f,27.084f,222.656f, -167.969f,27.1073f,222.656f, -171.875f,22.7536f,222.656f, -175.781f,23.3785f,222.656f, -179.688f,23.0862f,222.656f, -183.594f,22.5993f,222.656f, -187.5f,22.0197f,222.656f, -191.406f,21.8352f,222.656f, -195.313f,20.0501f,222.656f, -199.219f,18.5797f,222.656f, -203.125f,18.2905f,222.656f, -207.031f,22.7876f,222.656f, -210.938f,21.9787f,222.656f, -214.844f,21.4782f,222.656f, -218.75f,21.5786f,222.656f, -222.656f,21.6231f,222.656f, -226.563f,17.8058f,222.656f, -230.469f,17.6169f,222.656f, -234.375f,18.3242f,222.656f, -238.281f,18.4847f,222.656f, -242.188f,17.3189f,222.656f, -246.094f,16.7726f,222.656f, -250.0f,16.587f,222.656f, -3.90627f,8.02546f,218.75f, -7.81251f,8.24803f,218.75f, -11.7188f,6.92174f,218.75f, -15.625f,5.86085f,218.75f, -19.5313f,4.56603f,218.75f, -23.4375f,3.6909f,218.75f, -27.3438f,4.26522f,218.75f, -31.25f,3.37783f,218.75f, -35.1563f,1.72339f,218.75f, -39.0625f,2.22205f,218.75f, -42.9688f,2.71848f,218.75f, -46.875f,3.1467f,218.75f, -50.7813f,3.05327f,218.75f, -54.6875f,3.19537f,218.75f, -58.5938f,3.68243f,218.75f, -62.5f,3.35279f,218.75f, -66.4063f,4.00402f,218.75f, -70.3125f,2.9244f,218.75f, -74.2188f,4.39027f,218.75f, -78.125f,5.55878f,218.75f, -82.0313f,6.38772f,218.75f, -85.9375f,6.34964f,218.75f, -89.8438f,6.80441f,218.75f, -93.75f,6.5829f,218.75f, -97.6563f,7.27657f,218.75f, -101.563f,9.67388f,218.75f, -105.469f,10.833f,218.75f, -109.375f,12.1666f,218.75f, -113.281f,13.2095f,218.75f, -117.188f,14.2491f,218.75f, -121.094f,14.6953f,218.75f, -125.0f,14.2707f,218.75f, -128.906f,15.9556f,218.75f, -132.813f,16.7068f,218.75f, -136.719f,17.6679f,218.75f, -140.625f,18.8257f,218.75f, -144.531f,24.2255f,218.75f, -148.438f,25.0749f,218.75f, -152.344f,25.9271f,218.75f, -156.25f,26.2032f,218.75f, -160.156f,24.5168f,218.75f, -164.063f,26.2403f,218.75f, -167.969f,26.6223f,218.75f, -171.875f,22.4271f,218.75f, -175.781f,23.7925f,218.75f, -179.688f,23.3478f,218.75f, -183.594f,22.2279f,218.75f, -187.5f,22.2148f,218.75f, -191.406f,20.7538f,218.75f, -195.313f,19.5131f,218.75f, -199.219f,19.4834f,218.75f, -203.125f,18.3756f,218.75f, -207.031f,18.1034f,218.75f, -210.938f,20.0003f,218.75f, -214.844f,22.2111f,218.75f, -218.75f,21.6123f,218.75f, -222.656f,22.5943f,218.75f, -226.563f,24.3115f,218.75f, -230.469f,19.0536f,218.75f, -234.375f,18.6613f,218.75f, -238.281f,18.7675f,218.75f, -242.188f,18.3163f,218.75f, -246.094f,16.7013f,218.75f, -250.0f,17.0786f,218.75f, -3.90627f,9.25513f,214.844f, -7.81251f,9.67426f,214.844f, -11.7188f,8.92139f,214.844f, -15.625f,6.90738f,214.844f, -19.5313f,6.12616f,214.844f, -23.4375f,4.98302f,214.844f, -27.3438f,3.63786f,214.844f, -31.25f,2.52097f,214.844f, -35.1563f,3.30816f,214.844f, -39.0625f,4.04406f,214.844f, -42.9688f,4.48446f,214.844f, -46.875f,4.40695f,214.844f, -50.7813f,3.7693f,214.844f, -54.6875f,2.85523f,214.844f, -58.5938f,2.56849f,214.844f, -62.5f,2.56561f,214.844f, -66.4063f,2.82937f,214.844f, -70.3125f,2.75221f,214.844f, -74.2188f,5.02974f,214.844f, -78.125f,5.7988f,214.844f, -82.0313f,6.03219f,214.844f, -85.9375f,6.27423f,214.844f, -89.8438f,6.1671f,214.844f, -93.75f,6.86893f,214.844f, -97.6563f,7.94747f,214.844f, -101.563f,9.13548f,214.844f, -105.469f,9.63636f,214.844f, -109.375f,10.3351f,214.844f, -113.281f,12.4028f,214.844f, -117.188f,13.0321f,214.844f, -121.094f,13.6284f,214.844f, -125.0f,14.3167f,214.844f, -128.906f,15.0573f,214.844f, -132.813f,16.2022f,214.844f, -136.719f,17.7526f,214.844f, -140.625f,23.7093f,214.844f, -144.531f,24.3603f,214.844f, -148.438f,24.9195f,214.844f, -152.344f,25.198f,214.844f, -156.25f,20.8225f,214.844f, -160.156f,24.5918f,214.844f, -164.063f,25.1404f,214.844f, -167.969f,26.0659f,214.844f, -171.875f,22.1485f,214.844f, -175.781f,27.7236f,214.844f, -179.688f,27.4914f,214.844f, -183.594f,26.6606f,214.844f, -187.5f,26.623f,214.844f, -191.406f,26.3244f,214.844f, -195.313f,24.8535f,214.844f, -199.219f,23.6373f,214.844f, -203.125f,21.1881f,214.844f, -207.031f,19.7509f,214.844f, -210.938f,22.3046f,214.844f, -214.844f,22.5297f,214.844f, -218.75f,22.9498f,214.844f, -222.656f,23.2271f,214.844f, -226.563f,24.89f,214.844f, -230.469f,23.5226f,214.844f, -234.375f,19.0463f,214.844f, -238.281f,17.96f,214.844f, -242.188f,18.8106f,214.844f, -246.094f,17.3168f,214.844f, -250.0f,16.7955f,214.844f, -3.90627f,10.5728f,210.938f, -7.81251f,9.81018f,210.938f, -11.7188f,9.69715f,210.938f, -15.625f,8.42137f,210.938f, -19.5313f,7.09174f,210.938f, -23.4375f,6.45357f,210.938f, -27.3438f,4.58257f,210.938f, -31.25f,4.31044f,210.938f, -35.1563f,4.23584f,210.938f, -39.0625f,4.77527f,210.938f, -42.9688f,5.51217f,210.938f, -46.875f,5.48962f,210.938f, -50.7813f,4.50211f,210.938f, -54.6875f,4.06287f,210.938f, -58.5938f,3.43161f,210.938f, -62.5f,3.43195f,210.938f, -66.4063f,3.64204f,210.938f, -70.3125f,5.16151f,210.938f, -74.2188f,6.72853f,210.938f, -78.125f,7.43878f,210.938f, -82.0313f,7.30716f,210.938f, -85.9375f,6.54327f,210.938f, -89.8438f,5.96003f,210.938f, -93.75f,6.45099f,210.938f, -97.6563f,8.32748f,210.938f, -101.563f,8.85186f,210.938f, -105.469f,9.64058f,210.938f, -109.375f,10.4181f,210.938f, -113.281f,11.6911f,210.938f, -117.188f,12.0508f,210.938f, -121.094f,13.1004f,210.938f, -125.0f,14.4899f,210.938f, -128.906f,15.1295f,210.938f, -132.813f,15.6195f,210.938f, -136.719f,16.9219f,210.938f, -140.625f,23.4614f,210.938f, -144.531f,24.6763f,210.938f, -148.438f,26.12f,210.938f, -152.344f,21.7533f,210.938f, -156.25f,20.7448f,210.938f, -160.156f,24.1481f,210.938f, -164.063f,26.0464f,210.938f, -167.969f,25.1633f,210.938f, -171.875f,20.8056f,210.938f, -175.781f,26.3651f,210.938f, -179.688f,25.5322f,210.938f, -183.594f,26.3828f,210.938f, -187.5f,26.3586f,210.938f, -191.406f,26.1714f,210.938f, -195.313f,25.9695f,210.938f, -199.219f,24.3505f,210.938f, -203.125f,23.872f,210.938f, -207.031f,23.0401f,210.938f, -210.938f,22.3904f,210.938f, -214.844f,22.7647f,210.938f, -218.75f,23.266f,210.938f, -222.656f,23.8563f,210.938f, -226.563f,24.6635f,210.938f, -230.469f,24.3846f,210.938f, -234.375f,18.3213f,210.938f, -238.281f,17.6531f,210.938f, -242.188f,17.8854f,210.938f, -246.094f,17.1692f,210.938f, -250.0f,16.127f,210.938f, -3.90626f,10.4539f,207.031f, -7.81251f,10.0241f,207.031f, -11.7188f,10.3861f,207.031f, -15.625f,8.84417f,207.031f, -19.5313f,8.35477f,207.031f, -23.4375f,6.48112f,207.031f, -27.3438f,6.10753f,207.031f, -31.25f,6.13796f,207.031f, -35.1563f,6.51045f,207.031f, -39.0625f,6.65278f,207.031f, -42.9688f,6.27698f,207.031f, -46.875f,5.80577f,207.031f, -50.7813f,5.90354f,207.031f, -54.6875f,5.66137f,207.031f, -58.5938f,4.67472f,207.031f, -62.5f,4.81103f,207.031f, -66.4063f,6.06764f,207.031f, -70.3125f,7.61387f,207.031f, -74.2188f,8.72682f,207.031f, -78.125f,9.33231f,207.031f, -82.0313f,8.49751f,207.031f, -85.9375f,7.85293f,207.031f, -89.8438f,7.37573f,207.031f, -93.75f,7.4561f,207.031f, -97.6563f,7.76623f,207.031f, -101.563f,8.68264f,207.031f, -105.469f,10.4373f,207.031f, -109.375f,10.4722f,207.031f, -113.281f,11.4418f,207.031f, -117.188f,12.3081f,207.031f, -121.094f,12.9224f,207.031f, -125.0f,14.3204f,207.031f, -128.906f,15.1746f,207.031f, -132.813f,14.4847f,207.031f, -136.719f,20.974f,207.031f, -140.625f,23.4669f,207.031f, -144.531f,24.9918f,207.031f, -148.438f,25.7345f,207.031f, -152.344f,21.4943f,207.031f, -156.25f,22.169f,207.031f, -160.156f,24.9739f,207.031f, -164.063f,26.4423f,207.031f, -167.969f,25.8928f,207.031f, -171.875f,20.5408f,207.031f, -175.781f,24.2294f,207.031f, -179.688f,24.4008f,207.031f, -183.594f,25.2809f,207.031f, -187.5f,25.8589f,207.031f, -191.406f,26.3716f,207.031f, -195.313f,26.0525f,207.031f, -199.219f,24.6109f,207.031f, -203.125f,24.1128f,207.031f, -207.031f,23.4731f,207.031f, -210.938f,22.6487f,207.031f, -214.844f,22.7977f,207.031f, -218.75f,18.4754f,207.031f, -222.656f,23.1848f,207.031f, -226.563f,23.1818f,207.031f, -230.469f,22.9194f,207.031f, -234.375f,19.8052f,207.031f, -238.281f,16.8602f,207.031f, -242.188f,17.1047f,207.031f, -246.094f,16.1145f,207.031f, -250.0f,15.0049f,207.031f, -3.90626f,11.4706f,203.125f, -7.81251f,11.0922f,203.125f, -11.7188f,11.454f,203.125f, -15.625f,10.399f,203.125f, -19.5313f,8.89365f,203.125f, -23.4375f,7.52605f,203.125f, -27.3438f,7.07779f,203.125f, -31.25f,7.98082f,203.125f, -35.1563f,8.78342f,203.125f, -39.0625f,8.87165f,203.125f, -42.9688f,8.39122f,203.125f, -46.875f,7.48032f,203.125f, -50.7813f,6.77944f,203.125f, -54.6875f,7.14862f,203.125f, -58.5938f,6.46173f,203.125f, -62.5f,6.73824f,203.125f, -66.4063f,7.64505f,203.125f, -70.3125f,9.22763f,203.125f, -74.2188f,9.87781f,203.125f, -78.125f,10.1574f,203.125f, -82.0313f,9.81606f,203.125f, -85.9375f,9.8669f,203.125f, -89.8438f,10.0032f,203.125f, -93.75f,9.76597f,203.125f, -97.6563f,9.2129f,203.125f, -101.563f,8.89917f,203.125f, -105.469f,9.85112f,203.125f, -109.375f,11.4827f,203.125f, -113.281f,11.8911f,203.125f, -117.188f,12.3305f,203.125f, -121.094f,13.6098f,203.125f, -125.0f,14.1477f,203.125f, -128.906f,14.7928f,203.125f, -132.813f,16.3422f,203.125f, -136.719f,22.7583f,203.125f, -140.625f,24.5881f,203.125f, -144.531f,25.3565f,203.125f, -148.438f,21.7799f,203.125f, -152.344f,24.1222f,203.125f, -156.25f,26.6774f,203.125f, -160.156f,25.7031f,203.125f, -164.063f,26.9766f,203.125f, -167.969f,25.936f,203.125f, -171.875f,19.7727f,203.125f, -175.781f,19.3015f,203.125f, -179.688f,19.2421f,203.125f, -183.594f,24.8014f,203.125f, -187.5f,25.3041f,203.125f, -191.406f,25.3226f,203.125f, -195.313f,20.0369f,203.125f, -199.219f,19.4927f,203.125f, -203.125f,23.4349f,203.125f, -207.031f,22.748f,203.125f, -210.938f,22.4583f,203.125f, -214.844f,18.8936f,203.125f, -218.75f,17.4565f,203.125f, -222.656f,18.8235f,203.125f, -226.563f,21.4749f,203.125f, -230.469f,21.7691f,203.125f, -234.375f,21.1398f,203.125f, -238.281f,15.9012f,203.125f, -242.188f,15.9735f,203.125f, -246.094f,15.2287f,203.125f, -250.0f,13.5655f,203.125f, -3.90626f,12.1184f,199.219f, -7.81251f,12.3652f,199.219f, -11.7188f,12.1177f,199.219f, -15.625f,11.107f,199.219f, -19.5313f,9.91183f,199.219f, -23.4375f,8.6581f,199.219f, -27.3438f,7.98212f,199.219f, -31.25f,9.14995f,199.219f, -35.1563f,10.2879f,199.219f, -39.0625f,10.2569f,199.219f, -42.9688f,9.58908f,199.219f, -46.875f,8.1296f,199.219f, -50.7813f,7.81944f,199.219f, -54.6875f,8.54521f,199.219f, -58.5938f,8.14627f,199.219f, -62.5f,8.60974f,199.219f, -66.4063f,9.63518f,199.219f, -70.3125f,10.5321f,199.219f, -74.2188f,10.3348f,199.219f, -78.125f,11.2806f,199.219f, -82.0313f,11.3874f,199.219f, -85.9375f,11.6949f,199.219f, -89.8438f,12.3833f,199.219f, -93.75f,12.4654f,199.219f, -97.6563f,11.369f,199.219f, -101.563f,10.2737f,199.219f, -105.469f,10.4291f,199.219f, -109.375f,11.0962f,199.219f, -113.281f,12.1388f,199.219f, -117.188f,12.5535f,199.219f, -121.094f,13.2826f,199.219f, -125.0f,15.1899f,199.219f, -128.906f,16.3486f,199.219f, -132.813f,17.6147f,199.219f, -136.719f,23.878f,199.219f, -140.625f,24.5901f,199.219f, -144.531f,26.2181f,199.219f, -148.438f,21.847f,199.219f, -152.344f,26.5018f,199.219f, -156.25f,26.2772f,199.219f, -160.156f,26.4621f,199.219f, -164.063f,26.1902f,199.219f, -167.969f,26.1086f,199.219f, -171.875f,20.7414f,199.219f, -175.781f,20.393f,199.219f, -179.688f,19.7885f,199.219f, -183.594f,20.9687f,199.219f, -187.5f,23.8625f,199.219f, -191.406f,24.0825f,199.219f, -195.313f,19.4921f,199.219f, -199.219f,20.8763f,199.219f, -203.125f,21.987f,199.219f, -207.031f,21.9212f,199.219f, -210.938f,20.0341f,199.219f, -214.844f,15.7998f,199.219f, -218.75f,15.7759f,199.219f, -222.656f,15.8963f,199.219f, -226.563f,19.8168f,199.219f, -230.469f,19.9894f,199.219f, -234.375f,19.4382f,199.219f, -238.281f,14.2335f,199.219f, -242.188f,14.9225f,199.219f, -246.094f,13.5857f,199.219f, -250.0f,11.7225f,199.219f, -3.90626f,13.8013f,195.313f, -7.81251f,13.8046f,195.313f, -11.7188f,13.1462f,195.313f, -15.625f,12.2626f,195.313f, -19.5313f,10.67f,195.313f, -23.4375f,10.0372f,195.313f, -27.3438f,9.3255f,195.313f, -31.25f,10.5057f,195.313f, -35.1563f,11.0615f,195.313f, -39.0625f,11.2421f,195.313f, -42.9688f,10.4767f,195.313f, -46.875f,9.03042f,195.313f, -50.7813f,9.47397f,195.313f, -54.6875f,9.65703f,195.313f, -58.5938f,9.6345f,195.313f, -62.5f,9.9552f,195.313f, -66.4063f,10.8427f,195.313f, -70.3125f,11.7912f,195.313f, -74.2188f,11.5822f,195.313f, -78.125f,13.07f,195.313f, -82.0313f,13.803f,195.313f, -85.9375f,12.9764f,195.313f, -89.8438f,14.639f,195.313f, -93.75f,14.6139f,195.313f, -97.6563f,13.3162f,195.313f, -101.563f,12.7402f,195.313f, -105.469f,12.8061f,195.313f, -109.375f,12.1167f,195.313f, -113.281f,12.705f,195.313f, -117.188f,12.4568f,195.313f, -121.094f,13.5698f,195.313f, -125.0f,15.1843f,195.313f, -128.906f,16.7529f,195.313f, -132.813f,19.1744f,195.313f, -136.719f,23.9261f,195.313f, -140.625f,25.9824f,195.313f, -144.531f,26.1631f,195.313f, -148.438f,21.4735f,195.313f, -152.344f,25.5313f,195.313f, -156.25f,27.0098f,195.313f, -160.156f,27.5776f,195.313f, -164.063f,27.0858f,195.313f, -167.969f,26.3007f,195.313f, -171.875f,23.4599f,195.313f, -175.781f,26.4252f,195.313f, -179.688f,21.1453f,195.313f, -183.594f,21.1021f,195.313f, -187.5f,25.1644f,195.313f, -191.406f,24.8681f,195.313f, -195.313f,24.1757f,195.313f, -199.219f,20.0013f,195.313f, -203.125f,23.6085f,195.313f, -207.031f,22.7043f,195.313f, -210.938f,17.4097f,195.313f, -214.844f,16.8216f,195.313f, -218.75f,16.2595f,195.313f, -222.656f,15.547f,195.313f, -226.563f,20.5074f,195.313f, -230.469f,20.0296f,195.313f, -234.375f,19.4594f,195.313f, -238.281f,14.3376f,195.313f, -242.188f,13.8667f,195.313f, -246.094f,12.7786f,195.313f, -250.0f,12.669f,195.313f, -3.90626f,14.3936f,191.406f, -7.81251f,14.3324f,191.406f, -11.7188f,13.5165f,191.406f, -15.625f,12.3486f,191.406f, -19.5313f,10.8996f,191.406f, -23.4375f,10.767f,191.406f, -27.3438f,12.0663f,191.406f, -31.25f,12.0032f,191.406f, -35.1563f,12.6763f,191.406f, -39.0625f,12.4746f,191.406f, -42.9688f,10.9305f,191.406f, -46.875f,11.0794f,191.406f, -50.7813f,11.2588f,191.406f, -54.6875f,11.0855f,191.406f, -58.5938f,10.1448f,191.406f, -62.5f,11.1184f,191.406f, -66.4063f,12.2266f,191.406f, -70.3125f,12.3132f,191.406f, -74.2188f,13.6918f,191.406f, -78.125f,14.4314f,191.406f, -82.0313f,14.6924f,191.406f, -85.9375f,15.6669f,191.406f, -89.8438f,16.085f,191.406f, -93.75f,16.2697f,191.406f, -97.6563f,16.3584f,191.406f, -101.563f,15.6226f,191.406f, -105.469f,14.7096f,191.406f, -109.375f,14.172f,191.406f, -113.281f,13.6538f,191.406f, -117.188f,14.6791f,191.406f, -121.094f,15.1835f,191.406f, -125.0f,16.4947f,191.406f, -128.906f,17.5173f,191.406f, -132.813f,22.4657f,191.406f, -136.719f,25.2206f,191.406f, -140.625f,26.6814f,191.406f, -144.531f,27.4657f,191.406f, -148.438f,22.8092f,191.406f, -152.344f,22.336f,191.406f, -156.25f,29.0833f,191.406f, -160.156f,29.5204f,191.406f, -164.063f,29.4008f,191.406f, -167.969f,28.5038f,191.406f, -171.875f,27.7213f,191.406f, -175.781f,27.6884f,191.406f, -179.688f,25.8434f,191.406f, -183.594f,23.3048f,191.406f, -187.5f,27.635f,191.406f, -191.406f,26.1341f,191.406f, -195.313f,26.6792f,191.406f, -199.219f,22.747f,191.406f, -203.125f,22.8472f,191.406f, -207.031f,21.8628f,191.406f, -210.938f,20.5896f,191.406f, -214.844f,20.683f,191.406f, -218.75f,15.9904f,191.406f, -222.656f,16.3766f,191.406f, -226.563f,21.611f,191.406f, -230.469f,20.8727f,191.406f, -234.375f,20.2044f,191.406f, -238.281f,15.3358f,191.406f, -242.188f,14.7065f,191.406f, -246.094f,14.4372f,191.406f, -250.0f,14.1124f,191.406f, -3.90626f,14.1738f,187.5f, -7.81252f,14.5502f,187.5f, -11.7188f,13.6083f,187.5f, -15.625f,12.2654f,187.5f, -19.5313f,11.7405f,187.5f, -23.4375f,12.3756f,187.5f, -27.3438f,14.0775f,187.5f, -31.25f,13.9675f,187.5f, -35.1563f,14.3286f,187.5f, -39.0625f,13.1055f,187.5f, -42.9688f,13.0413f,187.5f, -46.875f,13.318f,187.5f, -50.7813f,12.9383f,187.5f, -54.6875f,12.9366f,187.5f, -58.5938f,12.1308f,187.5f, -62.5f,12.8501f,187.5f, -66.4063f,13.0312f,187.5f, -70.3125f,13.1657f,187.5f, -74.2188f,14.6177f,187.5f, -78.125f,16.1865f,187.5f, -82.0313f,16.3194f,187.5f, -85.9375f,16.9023f,187.5f, -89.8438f,17.5469f,187.5f, -93.75f,18.1166f,187.5f, -97.6563f,18.7398f,187.5f, -101.563f,18.2643f,187.5f, -105.469f,17.5115f,187.5f, -109.375f,16.8559f,187.5f, -113.281f,15.8332f,187.5f, -117.188f,16.4429f,187.5f, -121.094f,17.0698f,187.5f, -125.0f,18.0389f,187.5f, -128.906f,19.8697f,187.5f, -132.813f,24.8511f,187.5f, -136.719f,26.6838f,187.5f, -140.625f,28.5323f,187.5f, -144.531f,28.756f,187.5f, -148.438f,25.5762f,187.5f, -152.344f,25.8993f,187.5f, -156.25f,29.0469f,187.5f, -160.156f,32.1254f,187.5f, -164.063f,32.1318f,187.5f, -167.969f,31.7887f,187.5f, -171.875f,30.3727f,187.5f, -175.781f,30.1222f,187.5f, -179.688f,30.3556f,187.5f, -183.594f,30.49f,187.5f, -187.5f,29.3956f,187.5f, -191.406f,30.6569f,187.5f, -195.313f,30.8632f,187.5f, -199.219f,26.1118f,187.5f, -203.125f,25.5008f,187.5f, -207.031f,24.7878f,187.5f, -210.938f,27.5453f,187.5f, -214.844f,25.5271f,187.5f, -218.75f,20.2295f,187.5f, -222.656f,17.2785f,187.5f, -226.563f,22.0337f,187.5f, -230.469f,22.1938f,187.5f, -234.375f,21.6646f,187.5f, -238.281f,16.8654f,187.5f, -242.188f,15.704f,187.5f, -246.094f,15.9973f,187.5f, -250.0f,15.209f,187.5f, -3.90626f,13.9878f,183.594f, -7.81252f,14.3413f,183.594f, -11.7188f,13.1779f,183.594f, -15.625f,12.8538f,183.594f, -19.5313f,13.9436f,183.594f, -23.4375f,14.716f,183.594f, -27.3438f,14.991f,183.594f, -31.25f,15.4235f,183.594f, -35.1563f,15.3865f,183.594f, -39.0625f,14.2459f,183.594f, -42.9688f,15.2992f,183.594f, -46.875f,16.0599f,183.594f, -50.7813f,14.8603f,183.594f, -54.6875f,14.9726f,183.594f, -58.5938f,13.6053f,183.594f, -62.5f,13.057f,183.594f, -66.4063f,13.4201f,183.594f, -70.3125f,14.0782f,183.594f, -74.2188f,15.3178f,183.594f, -78.125f,16.3995f,183.594f, -82.0313f,17.4379f,183.594f, -85.9375f,17.9502f,183.594f, -89.8438f,18.4811f,183.594f, -93.75f,19.4227f,183.594f, -97.6563f,20.1694f,183.594f, -101.563f,20.1609f,183.594f, -105.469f,19.5537f,183.594f, -109.375f,19.039f,183.594f, -113.281f,18.2247f,183.594f, -117.188f,18.6643f,183.594f, -121.094f,19.2334f,183.594f, -125.0f,20.4158f,183.594f, -128.906f,21.1136f,183.594f, -132.813f,25.6638f,183.594f, -136.719f,27.4642f,183.594f, -140.625f,29.0749f,183.594f, -144.531f,30.6966f,183.594f, -148.438f,26.933f,183.594f, -152.344f,27.9984f,183.594f, -156.25f,28.4094f,183.594f, -160.156f,33.857f,183.594f, -164.063f,34.6528f,183.594f, -167.969f,33.405f,183.594f, -171.875f,31.8412f,183.594f, -175.781f,31.8788f,183.594f, -179.688f,32.395f,183.594f, -183.594f,32.8498f,183.594f, -187.5f,28.7385f,183.594f, -191.406f,33.6253f,183.594f, -195.313f,32.9673f,183.594f, -199.219f,31.8413f,183.594f, -203.125f,26.491f,183.594f, -207.031f,29.4589f,183.594f, -210.938f,28.7843f,183.594f, -214.844f,26.577f,183.594f, -218.75f,25.0304f,183.594f, -222.656f,18.7948f,183.594f, -226.563f,23.1467f,183.594f, -230.469f,22.3329f,183.594f, -234.375f,21.6877f,183.594f, -238.281f,16.4114f,183.594f, -242.188f,16.4672f,183.594f, -246.094f,16.3324f,183.594f, -250.0f,16.0497f,183.594f, -3.90626f,14.6785f,179.688f, -7.81252f,14.4582f,179.688f, -11.7188f,13.7379f,179.688f, -15.625f,13.9816f,179.688f, -19.5313f,14.9647f,179.688f, -23.4375f,15.3633f,179.688f, -27.3438f,16.1346f,179.688f, -31.25f,16.4088f,179.688f, -35.1563f,16.195f,179.688f, -39.0625f,16.1785f,179.688f, -42.9688f,17.2534f,179.688f, -46.875f,17.329f,179.688f, -50.7813f,16.0096f,179.688f, -54.6875f,15.4766f,179.688f, -58.5938f,14.0828f,179.688f, -62.5f,12.8927f,179.688f, -66.4063f,14.1195f,179.688f, -70.3125f,14.9421f,179.688f, -74.2188f,15.9015f,179.688f, -78.125f,17.3756f,179.688f, -82.0313f,18.6339f,179.688f, -85.9375f,19.7602f,179.688f, -89.8438f,19.8522f,179.688f, -93.75f,20.5838f,179.688f, -97.6563f,21.2938f,179.688f, -101.563f,21.1808f,179.688f, -105.469f,21.4575f,179.688f, -109.375f,21.1629f,179.688f, -113.281f,20.4789f,179.688f, -117.188f,20.5729f,179.688f, -121.094f,20.3917f,179.688f, -125.0f,21.8501f,179.688f, -128.906f,22.6846f,179.688f, -132.813f,23.4145f,179.688f, -136.719f,28.3033f,179.688f, -140.625f,30.5638f,179.688f, -144.531f,32.761f,179.688f, -148.438f,29.4434f,179.688f, -152.344f,30.346f,179.688f, -156.25f,31.7037f,179.688f, -160.156f,36.287f,179.688f, -164.063f,36.7423f,179.688f, -167.969f,35.7482f,179.688f, -171.875f,30.0008f,179.688f, -175.781f,29.6748f,179.688f, -179.688f,34.5316f,179.688f, -183.594f,34.4476f,179.688f, -187.5f,34.3489f,179.688f, -191.406f,33.4208f,179.688f, -195.313f,29.5511f,179.688f, -199.219f,28.9653f,179.688f, -203.125f,28.1749f,179.688f, -207.031f,30.5574f,179.688f, -210.938f,28.6513f,179.688f, -214.844f,27.1867f,179.688f, -218.75f,20.8455f,179.688f, -222.656f,20.3256f,179.688f, -226.563f,24.3717f,179.688f, -230.469f,23.2197f,179.688f, -234.375f,21.6566f,179.688f, -238.281f,16.2487f,179.688f, -242.188f,16.7759f,179.688f, -246.094f,16.5259f,179.688f, -250.0f,15.8782f,179.688f, -3.90626f,15.2963f,175.781f, -7.81252f,15.075f,175.781f, -11.7188f,14.8069f,175.781f, -15.625f,14.4469f,175.781f, -19.5313f,15.8073f,175.781f, -23.4375f,16.5419f,175.781f, -27.3438f,16.7791f,175.781f, -31.25f,17.1945f,175.781f, -35.1563f,16.9974f,175.781f, -39.0625f,16.9655f,175.781f, -42.9688f,17.7583f,175.781f, -46.875f,18.115f,175.781f, -50.7813f,16.6524f,175.781f, -54.6875f,15.897f,175.781f, -58.5938f,15.4613f,175.781f, -62.5f,14.3684f,175.781f, -66.4063f,15.0403f,175.781f, -70.3125f,15.9604f,175.781f, -74.2188f,16.9477f,175.781f, -78.125f,18.0563f,175.781f, -82.0313f,18.8971f,175.781f, -85.9375f,20.1037f,175.781f, -89.8438f,20.3627f,175.781f, -93.75f,20.0215f,175.781f, -97.6563f,20.8917f,175.781f, -101.563f,21.8702f,175.781f, -105.469f,22.7304f,175.781f, -109.375f,22.6873f,175.781f, -113.281f,21.4896f,175.781f, -117.188f,21.3864f,175.781f, -121.094f,22.4194f,175.781f, -125.0f,23.5751f,175.781f, -128.906f,23.9616f,175.781f, -132.813f,24.6066f,175.781f, -136.719f,30.8792f,175.781f, -140.625f,31.6572f,175.781f, -144.531f,34.2264f,175.781f, -148.438f,30.9611f,175.781f, -152.344f,35.8851f,175.781f, -156.25f,38.6379f,175.781f, -160.156f,39.1098f,175.781f, -164.063f,39.046f,175.781f, -167.969f,38.0327f,175.781f, -171.875f,36.6611f,175.781f, -175.781f,36.0664f,175.781f, -179.688f,36.1227f,175.781f, -183.594f,36.0705f,175.781f, -187.5f,35.9099f,175.781f, -191.406f,30.4106f,175.781f, -195.313f,30.0475f,175.781f, -199.219f,28.9213f,175.781f, -203.125f,32.8995f,175.781f, -207.031f,31.2376f,175.781f, -210.938f,30.0194f,175.781f, -214.844f,23.402f,175.781f, -218.75f,21.7271f,175.781f, -222.656f,20.0594f,175.781f, -226.563f,25.2266f,175.781f, -230.469f,24.1549f,175.781f, -234.375f,22.0418f,175.781f, -238.281f,15.6301f,175.781f, -242.188f,15.4767f,175.781f, -246.094f,15.8876f,175.781f, -250.0f,15.1339f,175.781f, -3.90626f,16.0791f,171.875f, -7.81251f,16.012f,171.875f, -11.7188f,15.027f,171.875f, -15.625f,15.1362f,171.875f, -19.5313f,16.3622f,171.875f, -23.4375f,16.7304f,171.875f, -27.3438f,17.228f,171.875f, -31.25f,16.4882f,171.875f, -35.1563f,16.5399f,171.875f, -39.0625f,17.5505f,171.875f, -42.9688f,17.6944f,171.875f, -46.875f,17.7481f,171.875f, -50.7813f,17.4568f,171.875f, -54.6875f,16.5655f,171.875f, -58.5938f,15.4313f,171.875f, -62.5f,14.962f,171.875f, -66.4063f,15.2516f,171.875f, -70.3125f,16.3088f,171.875f, -74.2188f,17.5354f,171.875f, -78.125f,18.5759f,171.875f, -82.0313f,19.1666f,171.875f, -85.9375f,19.8244f,171.875f, -89.8438f,20.6303f,171.875f, -93.75f,20.5635f,171.875f, -97.6563f,20.5768f,171.875f, -101.563f,21.542f,171.875f, -105.469f,22.5605f,171.875f, -109.375f,23.0118f,171.875f, -113.281f,22.6086f,171.875f, -117.188f,22.8502f,171.875f, -121.094f,23.2278f,171.875f, -125.0f,24.368f,171.875f, -128.906f,25.5759f,171.875f, -132.813f,27.7217f,171.875f, -136.719f,33.4581f,171.875f, -140.625f,33.4128f,171.875f, -144.531f,34.9465f,171.875f, -148.438f,31.4923f,171.875f, -152.344f,38.6707f,171.875f, -156.25f,40.2713f,171.875f, -160.156f,40.4155f,171.875f, -164.063f,41.0232f,171.875f, -167.969f,39.781f,171.875f, -171.875f,37.8376f,171.875f, -175.781f,38.0559f,171.875f, -179.688f,32.0147f,171.875f, -183.594f,35.2298f,171.875f, -187.5f,34.7221f,171.875f, -191.406f,31.5516f,171.875f, -195.313f,28.9984f,171.875f, -199.219f,29.8767f,171.875f, -203.125f,32.6404f,171.875f, -207.031f,31.3413f,171.875f, -210.938f,28.4132f,171.875f, -214.844f,22.9909f,171.875f, -218.75f,21.3955f,171.875f, -222.656f,25.3135f,171.875f, -226.563f,25.1463f,171.875f, -230.469f,23.4716f,171.875f, -234.375f,22.494f,171.875f, -238.281f,15.9351f,171.875f, -242.188f,15.2882f,171.875f, -246.094f,14.8463f,171.875f, -250.0f,14.5269f,171.875f, -3.90626f,17.1455f,167.969f, -7.81251f,16.6981f,167.969f, -11.7188f,16.5681f,167.969f, -15.625f,16.1667f,167.969f, -19.5313f,16.3523f,167.969f, -23.4375f,16.5389f,167.969f, -27.3438f,16.8075f,167.969f, -31.25f,17.1987f,167.969f, -35.1563f,17.86f,167.969f, -39.0625f,18.5438f,167.969f, -42.9688f,18.6718f,167.969f, -46.875f,17.9387f,167.969f, -50.7813f,17.5403f,167.969f, -54.6875f,17.4895f,167.969f, -58.5938f,16.9679f,167.969f, -62.5f,16.2192f,167.969f, -66.4063f,15.5699f,167.969f, -70.3125f,17.0017f,167.969f, -74.2188f,18.0147f,167.969f, -78.125f,18.9836f,167.969f, -82.0313f,19.8197f,167.969f, -85.9375f,19.8969f,167.969f, -89.8438f,20.6411f,167.969f, -93.75f,20.9768f,167.969f, -97.6563f,21.1498f,167.969f, -101.563f,21.3269f,167.969f, -105.469f,22.1153f,167.969f, -109.375f,22.208f,167.969f, -113.281f,23.2278f,167.969f, -117.188f,24.5722f,167.969f, -121.094f,25.3921f,167.969f, -125.0f,26.2683f,167.969f, -128.906f,28.138f,167.969f, -132.813f,29.9483f,167.969f, -136.719f,34.7607f,167.969f, -140.625f,35.3745f,167.969f, -144.531f,36.1401f,167.969f, -148.438f,38.0587f,167.969f, -152.344f,40.0092f,167.969f, -156.25f,40.9205f,167.969f, -160.156f,41.4664f,167.969f, -164.063f,41.8834f,167.969f, -167.969f,40.2863f,167.969f, -171.875f,38.4111f,167.969f, -175.781f,37.4971f,167.969f, -179.688f,32.0995f,167.969f, -183.594f,36.4852f,167.969f, -187.5f,34.5523f,167.969f, -191.406f,34.4101f,167.969f, -195.313f,29.577f,167.969f, -199.219f,33.7462f,167.969f, -203.125f,33.0191f,167.969f, -207.031f,31.6651f,167.969f, -210.938f,24.6623f,167.969f, -214.844f,22.6532f,167.969f, -218.75f,21.898f,167.969f, -222.656f,26.1764f,167.969f, -226.563f,24.7619f,167.969f, -230.469f,22.6772f,167.969f, -234.375f,17.6202f,167.969f, -238.281f,16.1581f,167.969f, -242.188f,14.7308f,167.969f, -246.094f,14.294f,167.969f, -250.0f,13.1169f,167.969f, -3.90627f,16.4621f,164.063f, -7.81251f,17.581f,164.063f, -11.7188f,17.7296f,164.063f, -15.625f,17.126f,164.063f, -19.5313f,17.3484f,164.063f, -23.4375f,17.9863f,164.063f, -27.3438f,18.6623f,164.063f, -31.25f,18.7934f,164.063f, -35.1563f,18.8245f,164.063f, -39.0625f,18.9554f,164.063f, -42.9688f,19.3152f,164.063f, -46.875f,18.5996f,164.063f, -50.7813f,18.0094f,164.063f, -54.6875f,17.5702f,164.063f, -58.5938f,17.5846f,164.063f, -62.5f,17.3718f,164.063f, -66.4063f,17.7189f,164.063f, -70.3125f,17.9805f,164.063f, -74.2188f,18.2986f,164.063f, -78.125f,18.9566f,164.063f, -82.0313f,20.4142f,164.063f, -85.9375f,20.5066f,164.063f, -89.8438f,20.7654f,164.063f, -93.75f,20.9457f,164.063f, -97.6563f,21.1078f,164.063f, -101.563f,20.7505f,164.063f, -105.469f,21.4615f,164.063f, -109.375f,22.8061f,164.063f, -113.281f,24.2655f,164.063f, -117.188f,24.815f,164.063f, -121.094f,26.3141f,164.063f, -125.0f,28.393f,164.063f, -128.906f,30.0565f,164.063f, -132.813f,31.4858f,164.063f, -136.719f,31.6549f,164.063f, -140.625f,37.0597f,164.063f, -144.531f,37.7613f,164.063f, -148.438f,38.9888f,164.063f, -152.344f,39.1482f,164.063f, -156.25f,36.6367f,164.063f, -160.156f,41.2606f,164.063f, -164.063f,42.2366f,164.063f, -167.969f,40.9757f,164.063f, -171.875f,33.9016f,164.063f, -175.781f,34.1798f,164.063f, -179.688f,33.0682f,164.063f, -183.594f,35.2269f,164.063f, -187.5f,35.1129f,164.063f, -191.406f,34.7006f,164.063f, -195.313f,30.1221f,164.063f, -199.219f,34.6592f,164.063f, -203.125f,33.6195f,164.063f, -207.031f,30.0546f,164.063f, -210.938f,24.8295f,164.063f, -214.844f,23.0298f,164.063f, -218.75f,26.5636f,164.063f, -222.656f,25.7973f,164.063f, -226.563f,23.7612f,164.063f, -230.469f,22.3646f,164.063f, -234.375f,16.1956f,164.063f, -238.281f,14.863f,164.063f, -242.188f,13.95f,164.063f, -246.094f,14.1968f,164.063f, -250.0f,13.2951f,164.063f, -3.90627f,16.628f,160.156f, -7.81251f,17.4268f,160.156f, -11.7188f,18.0363f,160.156f, -15.625f,18.1287f,160.156f, -19.5313f,18.6222f,160.156f, -23.4375f,18.2801f,160.156f, -27.3438f,18.5912f,160.156f, -31.25f,18.8635f,160.156f, -35.1563f,19.2193f,160.156f, -39.0625f,18.8821f,160.156f, -42.9688f,19.0078f,160.156f, -46.875f,19.3506f,160.156f, -50.7813f,17.8504f,160.156f, -54.6875f,18.5322f,160.156f, -58.5938f,18.2223f,160.156f, -62.5f,18.032f,160.156f, -66.4063f,18.574f,160.156f, -70.3125f,18.3835f,160.156f, -74.2188f,18.0842f,160.156f, -78.125f,19.8632f,160.156f, -82.0313f,20.9487f,160.156f, -85.9375f,20.6197f,160.156f, -89.8438f,20.5117f,160.156f, -93.75f,20.4182f,160.156f, -97.6563f,19.8654f,160.156f, -101.563f,20.1971f,160.156f, -105.469f,22.0419f,160.156f, -109.375f,23.4698f,160.156f, -113.281f,24.6461f,160.156f, -117.188f,26.2207f,160.156f, -121.094f,28.1249f,160.156f, -125.0f,29.8102f,160.156f, -128.906f,31.7349f,160.156f, -132.813f,32.4376f,160.156f, -136.719f,33.2795f,160.156f, -140.625f,37.4588f,160.156f, -144.531f,38.8195f,160.156f, -148.438f,39.9622f,160.156f, -152.344f,41.6752f,160.156f, -156.25f,37.6576f,160.156f, -160.156f,41.4722f,160.156f, -164.063f,41.8372f,160.156f, -167.969f,40.7289f,160.156f, -171.875f,35.5243f,160.156f, -175.781f,34.1726f,160.156f, -179.688f,33.9628f,160.156f, -183.594f,33.3012f,160.156f, -187.5f,37.6064f,160.156f, -191.406f,36.2987f,160.156f, -195.313f,32.9836f,160.156f, -199.219f,34.2771f,160.156f, -203.125f,33.5607f,160.156f, -207.031f,26.9351f,160.156f, -210.938f,24.3584f,160.156f, -214.844f,25.5428f,160.156f, -218.75f,26.0054f,160.156f, -222.656f,24.092f,160.156f, -226.563f,22.8948f,160.156f, -230.469f,17.1899f,160.156f, -234.375f,15.0552f,160.156f, -238.281f,14.2468f,160.156f, -242.188f,13.7862f,160.156f, -246.094f,14.5132f,160.156f, -250.0f,14.3684f,160.156f, -3.90627f,16.9346f,156.25f, -7.81251f,18.2437f,156.25f, -11.7188f,18.3869f,156.25f, -15.625f,18.1055f,156.25f, -19.5313f,18.7445f,156.25f, -23.4375f,18.9235f,156.25f, -27.3438f,18.455f,156.25f, -31.25f,18.6644f,156.25f, -35.1563f,18.9448f,156.25f, -39.0625f,18.9971f,156.25f, -42.9688f,18.8628f,156.25f, -46.875f,18.6886f,156.25f, -50.7813f,18.8494f,156.25f, -54.6875f,19.4408f,156.25f, -58.5938f,18.7384f,156.25f, -62.5f,17.473f,156.25f, -66.4063f,18.5906f,156.25f, -70.3125f,18.7252f,156.25f, -74.2188f,19.5013f,156.25f, -78.125f,19.8221f,156.25f, -82.0313f,19.8648f,156.25f, -85.9375f,19.8955f,156.25f, -89.8438f,19.4401f,156.25f, -93.75f,18.7973f,156.25f, -97.6563f,18.8923f,156.25f, -101.563f,20.6151f,156.25f, -105.469f,22.9824f,156.25f, -109.375f,25.2251f,156.25f, -113.281f,26.7829f,156.25f, -117.188f,27.8131f,156.25f, -121.094f,29.6707f,156.25f, -125.0f,31.4614f,156.25f, -128.906f,32.8387f,156.25f, -132.813f,33.7834f,156.25f, -136.719f,34.3986f,156.25f, -140.625f,35.1609f,156.25f, -144.531f,40.0963f,156.25f, -148.438f,41.0412f,156.25f, -152.344f,42.0325f,156.25f, -156.25f,42.1696f,156.25f, -160.156f,41.9265f,156.25f, -164.063f,43.279f,156.25f, -167.969f,42.5995f,156.25f, -171.875f,36.6937f,156.25f, -175.781f,34.8393f,156.25f, -179.688f,34.7157f,156.25f, -183.594f,34.0579f,156.25f, -187.5f,33.7647f,156.25f, -191.406f,33.2242f,156.25f, -195.313f,32.1053f,156.25f, -199.219f,30.6563f,156.25f, -203.125f,33.623f,156.25f, -207.031f,28.0199f,156.25f, -210.938f,30.5092f,156.25f, -214.844f,29.3828f,156.25f, -218.75f,27.3486f,156.25f, -222.656f,25.8671f,156.25f, -226.563f,24.1209f,156.25f, -230.469f,17.9979f,156.25f, -234.375f,16.1304f,156.25f, -238.281f,14.8281f,156.25f, -242.188f,13.097f,156.25f, -246.094f,13.3642f,156.25f, -250.0f,13.6085f,156.25f, -3.90627f,17.6952f,152.344f, -7.81251f,19.1063f,152.344f, -11.7188f,19.6398f,152.344f, -15.625f,19.8626f,152.344f, -19.5313f,19.1453f,152.344f, -23.4375f,19.4932f,152.344f, -27.3438f,19.3908f,152.344f, -31.25f,18.6492f,152.344f, -35.1563f,18.3861f,152.344f, -39.0625f,18.198f,152.344f, -42.9688f,18.4497f,152.344f, -46.875f,17.8083f,152.344f, -50.7813f,18.5296f,152.344f, -54.6875f,19.8096f,152.344f, -58.5938f,19.3324f,152.344f, -62.5f,18.1507f,152.344f, -66.4063f,17.7998f,152.344f, -70.3125f,17.9266f,152.344f, -74.2188f,18.569f,152.344f, -78.125f,19.5043f,152.344f, -82.0313f,20.0768f,152.344f, -85.9375f,19.5187f,152.344f, -89.8438f,20.2592f,152.344f, -93.75f,19.2159f,152.344f, -97.6563f,20.1174f,152.344f, -101.563f,21.9257f,152.344f, -105.469f,23.9219f,152.344f, -109.375f,25.8476f,152.344f, -113.281f,27.9183f,152.344f, -117.188f,29.2798f,152.344f, -121.094f,30.2289f,152.344f, -125.0f,31.7495f,152.344f, -128.906f,33.1684f,152.344f, -132.813f,34.4626f,152.344f, -136.719f,35.9981f,152.344f, -140.625f,36.5168f,152.344f, -144.531f,35.9325f,152.344f, -148.438f,41.231f,152.344f, -152.344f,42.7257f,152.344f, -156.25f,43.5162f,152.344f, -160.156f,44.357f,152.344f, -164.063f,44.2347f,152.344f, -167.969f,40.2679f,152.344f, -171.875f,36.2109f,152.344f, -175.781f,36.3906f,152.344f, -179.688f,35.227f,152.344f, -183.594f,34.7006f,152.344f, -187.5f,34.7763f,152.344f, -191.406f,34.0912f,152.344f, -195.313f,32.201f,152.344f, -199.219f,30.6601f,152.344f, -203.125f,28.7526f,152.344f, -207.031f,33.0587f,152.344f, -210.938f,31.7955f,152.344f, -214.844f,29.893f,152.344f, -218.75f,27.5989f,152.344f, -222.656f,26.1347f,152.344f, -226.563f,19.6378f,152.344f, -230.469f,18.6596f,152.344f, -234.375f,17.3965f,152.344f, -238.281f,15.5807f,152.344f, -242.188f,13.4071f,152.344f, -246.094f,12.7989f,152.344f, -250.0f,12.5897f,152.344f, -3.90626f,18.4109f,148.438f, -7.81251f,18.8163f,148.438f, -11.7188f,20.7396f,148.438f, -15.625f,21.7833f,148.438f, -19.5313f,20.6586f,148.438f, -23.4375f,19.8597f,148.438f, -27.3438f,20.0951f,148.438f, -31.25f,18.7811f,148.438f, -35.1563f,18.123f,148.438f, -39.0625f,17.773f,148.438f, -42.9688f,18.0095f,148.438f, -46.875f,17.694f,148.438f, -50.7813f,17.1666f,148.438f, -54.6875f,18.3484f,148.438f, -58.5938f,18.5612f,148.438f, -62.5f,18.1324f,148.438f, -66.4063f,17.4119f,148.438f, -70.3125f,17.2873f,148.438f, -74.2188f,17.6855f,148.438f, -78.125f,18.6618f,148.438f, -82.0313f,19.6447f,148.438f, -85.9375f,19.4743f,148.438f, -89.8438f,20.2887f,148.438f, -93.75f,20.2469f,148.438f, -97.6563f,21.1802f,148.438f, -101.563f,23.2002f,148.438f, -105.469f,24.8874f,148.438f, -109.375f,26.5433f,148.438f, -113.281f,28.653f,148.438f, -117.188f,30.2347f,148.438f, -121.094f,31.6949f,148.438f, -125.0f,33.2452f,148.438f, -128.906f,34.3964f,148.438f, -132.813f,35.2835f,148.438f, -136.719f,36.7099f,148.438f, -140.625f,37.1893f,148.438f, -144.531f,36.5212f,148.438f, -148.438f,36.7413f,148.438f, -152.344f,43.9965f,148.438f, -156.25f,44.9543f,148.438f, -160.156f,44.8078f,148.438f, -164.063f,45.09f,148.438f, -167.969f,43.0871f,148.438f, -171.875f,42.2067f,148.438f, -175.781f,40.5399f,148.438f, -179.688f,35.9902f,148.438f, -183.594f,34.4093f,148.438f, -187.5f,35.1087f,148.438f, -191.406f,34.3372f,148.438f, -195.313f,35.6724f,148.438f, -199.219f,34.961f,148.438f, -203.125f,34.4106f,148.438f, -207.031f,32.0028f,148.438f, -210.938f,31.3925f,148.438f, -214.844f,29.3539f,148.438f, -218.75f,27.6213f,148.438f, -222.656f,21.6694f,148.438f, -226.563f,20.356f,148.438f, -230.469f,19.6202f,148.438f, -234.375f,17.6247f,148.438f, -238.281f,16.5152f,148.438f, -242.188f,14.901f,148.438f, -246.094f,12.7994f,148.438f, -250.0f,12.2743f,148.438f, -3.90626f,17.8758f,144.531f, -7.81251f,19.3177f,144.531f, -11.7188f,20.9214f,144.531f, -15.625f,21.8589f,144.531f, -19.5313f,21.2904f,144.531f, -23.4375f,19.9784f,144.531f, -27.3438f,19.6359f,144.531f, -31.25f,19.4398f,144.531f, -35.1563f,18.6596f,144.531f, -39.0625f,17.1967f,144.531f, -42.9688f,16.797f,144.531f, -46.875f,16.4099f,144.531f, -50.7813f,16.54f,144.531f, -54.6875f,16.811f,144.531f, -58.5938f,17.31f,144.531f, -62.5f,17.5358f,144.531f, -66.4063f,16.8495f,144.531f, -70.3125f,17.2148f,144.531f, -74.2188f,16.6285f,144.531f, -78.125f,17.7911f,144.531f, -82.0313f,18.6054f,144.531f, -85.9375f,18.787f,144.531f, -89.8438f,20.4804f,144.531f, -93.75f,21.0544f,144.531f, -97.6563f,20.9487f,144.531f, -101.563f,23.1098f,144.531f, -105.469f,25.2196f,144.531f, -109.375f,27.0389f,144.531f, -113.281f,29.4971f,144.531f, -117.188f,31.0049f,144.531f, -121.094f,33.086f,144.531f, -125.0f,34.6611f,144.531f, -128.906f,35.8626f,144.531f, -132.813f,36.8672f,144.531f, -136.719f,37.5515f,144.531f, -140.625f,37.6433f,144.531f, -144.531f,37.8923f,144.531f, -148.438f,37.1277f,144.531f, -152.344f,40.0287f,144.531f, -156.25f,44.9863f,144.531f, -160.156f,45.0845f,144.531f, -164.063f,44.7823f,144.531f, -167.969f,42.5338f,144.531f, -171.875f,41.7912f,144.531f, -175.781f,41.5762f,144.531f, -179.688f,41.3242f,144.531f, -183.594f,39.6796f,144.531f, -187.5f,39.4704f,144.531f, -191.406f,38.5401f,144.531f, -195.313f,37.3853f,144.531f, -199.219f,35.4345f,144.531f, -203.125f,34.2437f,144.531f, -207.031f,31.8218f,144.531f, -210.938f,30.6041f,144.531f, -214.844f,26.9001f,144.531f, -218.75f,22.3094f,144.531f, -222.656f,21.4446f,144.531f, -226.563f,20.6643f,144.531f, -230.469f,20.3246f,144.531f, -234.375f,18.0382f,144.531f, -238.281f,15.7854f,144.531f, -242.188f,14.3314f,144.531f, -246.094f,12.4723f,144.531f, -250.0f,12.5491f,144.531f, -3.90626f,18.5798f,140.625f, -7.81251f,19.7271f,140.625f, -11.7188f,20.8566f,140.625f, -15.625f,21.6914f,140.625f, -19.5313f,20.9288f,140.625f, -23.4375f,20.0531f,140.625f, -27.3438f,19.1655f,140.625f, -31.25f,18.7947f,140.625f, -35.1563f,18.2984f,140.625f, -39.0625f,17.3295f,140.625f, -42.9688f,16.5557f,140.625f, -46.875f,16.1679f,140.625f, -50.7813f,16.0262f,140.625f, -54.6875f,16.1659f,140.625f, -58.5938f,16.459f,140.625f, -62.5f,17.0307f,140.625f, -66.4063f,17.6303f,140.625f, -70.3125f,16.7576f,140.625f, -74.2188f,16.9614f,140.625f, -78.125f,17.3439f,140.625f, -82.0313f,17.7742f,140.625f, -85.9375f,19.0774f,140.625f, -89.8438f,20.0724f,140.625f, -93.75f,21.5734f,140.625f, -97.6563f,21.4923f,140.625f, -101.563f,24.2474f,140.625f, -105.469f,25.9666f,140.625f, -109.375f,27.8803f,140.625f, -113.281f,29.6397f,140.625f, -117.188f,32.0374f,140.625f, -121.094f,34.014f,140.625f, -125.0f,35.1589f,140.625f, -128.906f,36.2526f,140.625f, -132.813f,37.5386f,140.625f, -136.719f,38.1647f,140.625f, -140.625f,37.9014f,140.625f, -144.531f,39.0558f,140.625f, -148.438f,38.1493f,140.625f, -152.344f,39.5967f,140.625f, -156.25f,40.3409f,140.625f, -160.156f,39.4778f,140.625f, -164.063f,43.7911f,140.625f, -167.969f,42.7467f,140.625f, -171.875f,41.4394f,140.625f, -175.781f,41.222f,140.625f, -179.688f,40.9501f,140.625f, -183.594f,40.2741f,140.625f, -187.5f,40.5011f,140.625f, -191.406f,39.8634f,140.625f, -195.313f,37.8944f,140.625f, -199.219f,35.6917f,140.625f, -203.125f,33.0921f,140.625f, -207.031f,30.7497f,140.625f, -210.938f,24.355f,140.625f, -214.844f,23.6102f,140.625f, -218.75f,23.2298f,140.625f, -222.656f,21.8035f,140.625f, -226.563f,21.0813f,140.625f, -230.469f,20.4423f,140.625f, -234.375f,19.372f,140.625f, -238.281f,16.9074f,140.625f, -242.188f,15.6931f,140.625f, -246.094f,14.0046f,140.625f, -250.0f,12.7719f,140.625f, -3.90626f,19.7224f,136.719f, -7.81251f,20.3645f,136.719f, -11.7188f,20.1938f,136.719f, -15.625f,20.0122f,136.719f, -19.5313f,20.9204f,136.719f, -23.4375f,20.2208f,136.719f, -27.3438f,19.3419f,136.719f, -31.25f,18.2059f,136.719f, -35.1563f,17.6089f,136.719f, -39.0625f,17.131f,136.719f, -42.9688f,16.8349f,136.719f, -46.875f,16.3462f,136.719f, -50.7813f,15.4488f,136.719f, -54.6875f,15.7887f,136.719f, -58.5938f,16.431f,136.719f, -62.5f,16.3378f,136.719f, -66.4063f,17.4585f,136.719f, -70.3125f,17.5113f,136.719f, -74.2188f,17.6407f,136.719f, -78.125f,17.0887f,136.719f, -82.0313f,17.2555f,136.719f, -85.9375f,18.6283f,136.719f, -89.8438f,19.6874f,136.719f, -93.75f,21.0963f,136.719f, -97.6563f,21.5582f,136.719f, -101.563f,24.9129f,136.719f, -105.469f,27.5761f,136.719f, -109.375f,28.7426f,136.719f, -113.281f,31.0958f,136.719f, -117.188f,33.7564f,136.719f, -121.094f,34.6927f,136.719f, -125.0f,35.0503f,136.719f, -128.906f,36.0657f,136.719f, -132.813f,37.2001f,136.719f, -136.719f,38.5625f,136.719f, -140.625f,38.8809f,136.719f, -144.531f,39.3646f,136.719f, -148.438f,38.919f,136.719f, -152.344f,39.5251f,136.719f, -156.25f,39.5392f,136.719f, -160.156f,39.7011f,136.719f, -164.063f,38.4043f,136.719f, -167.969f,37.7232f,136.719f, -171.875f,37.8418f,136.719f, -175.781f,41.0576f,136.719f, -179.688f,40.6804f,136.719f, -183.594f,40.6431f,136.719f, -187.5f,41.2286f,136.719f, -191.406f,40.221f,136.719f, -195.313f,37.9197f,136.719f, -199.219f,30.9591f,136.719f, -203.125f,28.2027f,136.719f, -207.031f,25.2338f,136.719f, -210.938f,24.1525f,136.719f, -214.844f,23.6344f,136.719f, -218.75f,22.6246f,136.719f, -222.656f,21.3675f,136.719f, -226.563f,21.0207f,136.719f, -230.469f,20.2558f,136.719f, -234.375f,18.3661f,136.719f, -238.281f,16.7584f,136.719f, -242.188f,16.2723f,136.719f, -246.094f,14.7268f,136.719f, -250.0f,13.5973f,136.719f, -3.90626f,19.9574f,132.813f, -7.8125f,21.126f,132.813f, -11.7188f,20.9977f,132.813f, -15.625f,21.2478f,132.813f, -19.5313f,21.5981f,132.813f, -23.4375f,20.0536f,132.813f, -27.3438f,18.6025f,132.813f, -31.25f,18.166f,132.813f, -35.1563f,17.207f,132.813f, -39.0625f,17.3703f,132.813f, -42.9688f,16.3317f,132.813f, -46.875f,15.4769f,132.813f, -50.7813f,14.7771f,132.813f, -54.6875f,14.8038f,132.813f, -58.5938f,15.7291f,132.813f, -62.5f,16.2292f,132.813f, -66.4063f,17.1488f,132.813f, -70.3125f,17.5027f,132.813f, -74.2188f,16.9736f,132.813f, -78.125f,16.4014f,132.813f, -82.0313f,16.7581f,132.813f, -85.9375f,18.1894f,132.813f, -89.8438f,20.0178f,132.813f, -93.75f,20.5813f,132.813f, -97.6563f,22.5893f,132.813f, -101.563f,25.6741f,132.813f, -105.469f,28.0908f,132.813f, -109.375f,29.1124f,132.813f, -113.281f,31.4752f,132.813f, -117.188f,33.2328f,132.813f, -121.094f,34.3747f,132.813f, -125.0f,34.8849f,132.813f, -128.906f,36.3771f,132.813f, -132.813f,37.3154f,132.813f, -136.719f,38.6196f,132.813f, -140.625f,39.1474f,132.813f, -144.531f,39.5395f,132.813f, -148.438f,38.9241f,132.813f, -152.344f,39.6801f,132.813f, -156.25f,39.7675f,132.813f, -160.156f,39.4464f,132.813f, -164.063f,38.2967f,132.813f, -167.969f,37.3679f,132.813f, -171.875f,36.5147f,132.813f, -175.781f,35.9217f,132.813f, -179.688f,35.6874f,132.813f, -183.594f,36.0348f,132.813f, -187.5f,36.167f,132.813f, -191.406f,34.7462f,132.813f, -195.313f,32.5911f,132.813f, -199.219f,30.8509f,132.813f, -203.125f,27.889f,132.813f, -207.031f,25.0869f,132.813f, -210.938f,23.713f,132.813f, -214.844f,23.4714f,132.813f, -218.75f,22.2633f,132.813f, -222.656f,21.1409f,132.813f, -226.563f,20.2725f,132.813f, -230.469f,19.4678f,132.813f, -234.375f,18.4511f,132.813f, -238.281f,18.0306f,132.813f, -242.188f,17.5677f,132.813f, -246.094f,16.403f,132.813f, -250.0f,14.7316f,132.813f, -3.90626f,20.0876f,128.906f, -7.81252f,21.0764f,128.906f, -11.7188f,21.4076f,128.906f, -15.625f,22.6299f,128.906f, -19.5313f,22.1174f,128.906f, -23.4375f,20.3977f,128.906f, -27.3438f,18.7343f,128.906f, -31.25f,17.9144f,128.906f, -35.1563f,17.2941f,128.906f, -39.0625f,16.5386f,128.906f, -42.9688f,15.6892f,128.906f, -46.875f,14.6414f,128.906f, -50.7813f,14.3505f,128.906f, -54.6875f,14.1604f,128.906f, -58.5938f,14.517f,128.906f, -62.5f,15.1057f,128.906f, -66.4063f,16.0684f,128.906f, -70.3125f,16.6251f,128.906f, -74.2188f,15.9689f,128.906f, -78.125f,16.0234f,128.906f, -82.0313f,16.205f,128.906f, -85.9375f,18.8167f,128.906f, -89.8438f,19.6433f,128.906f, -93.75f,20.2916f,128.906f, -97.6563f,23.2308f,128.906f, -101.563f,25.882f,128.906f, -105.469f,27.5736f,128.906f, -109.375f,28.9662f,128.906f, -113.281f,30.5702f,128.906f, -117.188f,31.8627f,128.906f, -121.094f,32.5216f,128.906f, -125.0f,34.1918f,128.906f, -128.906f,37.0161f,128.906f, -132.813f,38.5084f,128.906f, -136.719f,39.1631f,128.906f, -140.625f,39.0529f,128.906f, -144.531f,38.9229f,128.906f, -148.438f,38.4312f,128.906f, -152.344f,39.1086f,128.906f, -156.25f,39.7022f,128.906f, -160.156f,39.3007f,128.906f, -164.063f,38.2318f,128.906f, -167.969f,36.7493f,128.906f, -171.875f,35.9781f,128.906f, -175.781f,35.7712f,128.906f, -179.688f,35.6247f,128.906f, -183.594f,35.4808f,128.906f, -187.5f,35.6102f,128.906f, -191.406f,34.0305f,128.906f, -195.313f,32.0227f,128.906f, -199.219f,29.7666f,128.906f, -203.125f,27.3968f,128.906f, -207.031f,25.1642f,128.906f, -210.938f,24.279f,128.906f, -214.844f,22.4357f,128.906f, -218.75f,21.7754f,128.906f, -222.656f,19.6381f,128.906f, -226.563f,19.78f,128.906f, -230.469f,20.0349f,128.906f, -234.375f,19.1534f,128.906f, -238.281f,17.863f,128.906f, -242.188f,17.658f,128.906f, -246.094f,16.951f,128.906f, -250.0f,16.2961f,128.906f, -}; - -btScalar Landscape01Nml[] = { --0.145347f,0.988603f,0.0392193f, --0.118578f,0.971903f,-0.203332f, --0.210348f,0.975548f,0.0637181f, --0.143154f,0.979915f,-0.138828f, --0.186466f,0.976661f,0.106602f, --0.200996f,0.973874f,-0.105691f, --0.200019f,0.979742f,-0.00987837f, --0.162567f,0.986516f,-0.0189093f, --0.128872f,0.991658f,-0.00262187f, --0.0972065f,0.993702f,0.0557464f, --0.232168f,0.972676f,8.39761e-005f, --0.280715f,0.959127f,-0.0356947f, --0.328537f,0.944066f,-0.0283446f, --0.348021f,0.936189f,-0.0493126f, --0.28502f,0.953899f,-0.0940249f, --0.329197f,0.938125f,-0.107479f, --0.186873f,0.969867f,-0.15632f, --0.168074f,0.98179f,-0.088542f, -0.138723f,0.984643f,-0.105994f, -0.139713f,0.984758f,-0.103594f, -0.415149f,0.907443f,-0.0647914f, -0.335594f,0.916204f,-0.218967f, -0.391251f,0.906316f,-0.159731f, -0.297117f,0.890775f,-0.343864f, -0.0782406f,0.948307f,-0.307558f, -0.0742546f,0.932023f,-0.354711f, --0.0593029f,0.94484f,-0.322118f, --0.035102f,0.9388f,-0.342668f, --0.0398386f,0.972105f,-0.231139f, -0.0142535f,0.946652f,-0.321942f, --0.149407f,0.982239f,-0.113505f, --0.186817f,0.918353f,-0.348895f, --0.227035f,0.95418f,-0.194923f, --0.217455f,0.921613f,-0.32147f, --0.104683f,0.961425f,-0.254368f, --0.137473f,0.92562f,-0.352602f, --0.0889131f,0.942391f,-0.322479f, --0.137942f,0.895959f,-0.422173f, --0.0994313f,0.915873f,-0.38896f, --0.177412f,0.858967f,-0.480312f, --0.28046f,0.843765f,-0.457605f, --0.23875f,0.832625f,-0.499733f, --0.35769f,0.865922f,-0.349624f, --0.239679f,0.924761f,-0.295585f, --0.367472f,0.894137f,-0.255898f, --0.306721f,0.940051f,-0.149083f, --0.29191f,0.929123f,-0.226977f, --0.3205f,0.928892f,-0.185579f, --0.367832f,0.894452f,-0.254274f, --0.393375f,0.898238f,-0.196023f, --0.386104f,0.869165f,-0.308993f, --0.416765f,0.860247f,-0.293737f, --0.257238f,0.898443f,-0.355849f, --0.273377f,0.911812f,-0.306372f, --0.228654f,0.889208f,-0.396265f, --0.28545f,0.876522f,-0.387592f, --0.142316f,0.885962f,-0.441381f, --0.101084f,0.908701f,-0.405025f, -0.035618f,0.945519f,-0.323614f, -0.103277f,0.941647f,-0.320368f, --0.120589f,0.957422f,-0.262302f, --0.186114f,0.894712f,-0.40602f, --0.202962f,0.931974f,-0.300385f, --0.162074f,0.943023f,-0.290584f, --0.152017f,0.933176f,-0.325688f, --0.202811f,0.891764f,-0.404505f, --0.195614f,0.919053f,-0.342165f, --0.221332f,0.883262f,-0.413352f, --0.230949f,0.883479f,-0.407587f, --0.202664f,0.884798f,-0.419595f, --0.013827f,0.935183f,-0.353894f, -0.0613953f,0.949306f,-0.308299f, -0.0379666f,0.956996f,-0.287605f, -0.0239474f,0.920688f,-0.389564f, --0.124568f,0.971246f,-0.20289f, --0.0173673f,0.966674f,-0.255421f, --0.280608f,0.954174f,-0.103981f, --0.188825f,0.978003f,-0.0886339f, --0.193278f,0.981044f,-0.0139968f, --0.089832f,0.992161f,0.0868734f, --0.0617809f,0.994525f,0.0842802f, -0.0316335f,0.979002f,0.20138f, -0.126601f,0.973442f,0.190743f, -0.126356f,0.954056f,0.271683f, -0.0296197f,0.996225f,0.0816031f, --0.130879f,0.990212f,-0.0484936f, --0.0775613f,0.996382f,0.0347567f, --0.0318445f,0.999049f,0.0297665f, -0.174213f,0.981835f,0.0751658f, -0.230898f,0.968544f,0.0927823f, -0.477724f,0.867555f,0.138304f, -0.489512f,0.856269f,0.164868f, -0.425011f,0.903484f,0.0555235f, -0.345126f,0.937885f,0.0355011f, -0.051136f,0.997417f,-0.0504465f, -0.0111243f,0.99878f,-0.0481145f, -0.00085351f,0.998643f,-0.0520782f, --0.0736129f,0.992491f,-0.0976874f, -0.0605446f,0.978416f,-0.197578f, --0.1248f,0.898669f,-0.420499f, --0.068151f,0.956411f,-0.28396f, -0.0502596f,0.934397f,-0.35267f, -0.0492358f,0.99416f,-0.096025f, -0.22311f,0.97441f,-0.0273246f, -0.104257f,0.993921f,-0.0353788f, -0.135731f,0.987345f,0.0820234f, -0.0508084f,0.996415f,-0.0676404f, -0.013783f,0.999772f,-0.0162859f, -0.0814861f,0.996154f,-0.0322044f, -0.0451487f,0.998313f,-0.0365194f, -0.035547f,0.992801f,-0.114375f, --0.0977551f,0.955799f,-0.277294f, -0.0588118f,0.977967f,-0.200303f, -0.0956551f,0.968682f,-0.229142f, -0.255494f,0.951171f,-0.173197f, -0.287347f,0.949686f,-0.124613f, -0.300983f,0.934694f,-0.189092f, -0.326044f,0.937015f,-0.125296f, -0.170234f,0.979103f,-0.111255f, -0.217643f,0.971688f,-0.0919459f, -0.0857423f,0.995f,-0.0512173f, -0.141055f,0.988855f,0.0476293f, -0.141065f,0.98942f,-0.0338874f, -0.161562f,0.986303f,0.0332183f, -0.113059f,0.993231f,0.0266602f, -0.073071f,0.997081f,-0.0221543f, --0.0590251f,0.997651f,-0.034775f, --0.0264959f,0.999595f,0.0103962f, --0.0628475f,0.932757f,0.354985f, --0.188464f,0.930547f,0.31395f, --0.11595f,0.95582f,0.270118f, --0.0150745f,0.981122f,0.192801f, --0.121292f,0.98854f,0.0898753f, --0.191875f,0.979293f,0.0645635f, --0.302211f,0.947932f,-0.100469f, --0.168835f,0.972187f,-0.162321f, --0.165107f,0.942083f,-0.291925f, -0.0524842f,0.966783f,-0.250151f, -0.334898f,0.925425f,-0.177288f, -0.453352f,0.888614f,-0.0695481f, -0.212879f,0.976177f,-0.0419751f, --0.0859137f,0.991174f,-0.100958f, --0.19247f,0.980365f,-0.0428897f, --0.217979f,0.975456f,0.0311624f, --0.130678f,0.991292f,-0.0162531f, -0.0105625f,0.994964f,-0.0996785f, --0.0191557f,0.967247f,-0.253114f, --0.034833f,0.962122f,-0.270385f, --0.195874f,0.937997f,-0.285996f, --0.397161f,0.831379f,-0.388681f, --0.379064f,0.825916f,-0.417342f, --0.284483f,0.874083f,-0.393762f, --0.320157f,0.86551f,-0.385217f, --0.327447f,0.85814f,-0.395442f, --0.219114f,0.871062f,-0.439592f, --0.161876f,0.861769f,-0.480781f, --0.18946f,0.845726f,-0.498852f, --0.191307f,0.924603f,-0.32941f, --0.159365f,0.982225f,-0.0991764f, --0.164558f,0.975832f,-0.143777f, --0.155521f,0.974006f,-0.164699f, --0.172244f,0.972979f,-0.153766f, --0.162541f,0.961346f,-0.222247f, --0.11171f,0.955927f,-0.271523f, --0.101714f,0.980079f,-0.170586f, --0.223397f,0.974336f,-0.0276274f, --0.300622f,0.953413f,0.0251167f, --0.254202f,0.967133f,-0.00586307f, --0.0994566f,0.994394f,0.0359007f, -0.078652f,0.996758f,-0.0169243f, --0.0552979f,0.987555f,0.147234f, --0.0666628f,0.864508f,0.498179f, -0.131082f,0.854494f,0.502651f, -0.414695f,0.764646f,0.4933f, -0.432926f,0.790826f,0.432632f, -0.126593f,0.91514f,0.382744f, --0.0157552f,0.943082f,0.332186f, -0.122694f,0.924647f,0.36052f, -0.0975822f,0.984244f,0.147447f, --0.026294f,0.960938f,-0.275512f, -0.1231f,0.958251f,-0.258072f, -0.037902f,0.976085f,-0.214059f, --0.000148888f,0.992562f,-0.121742f, -0.0716429f,0.997173f,-0.0226693f, -0.135484f,0.989193f,-0.0560393f, -0.275603f,0.956281f,-0.0978236f, -0.283097f,0.956822f,-0.0659346f, -0.109624f,0.991403f,-0.0714361f, -0.084436f,0.990816f,-0.105609f, -0.0791881f,0.990931f,-0.108558f, -0.0674956f,0.997569f,-0.0173508f, -0.0556006f,0.998429f,0.00688119f, --0.144974f,0.947519f,0.28494f, --0.110826f,0.961365f,0.251981f, --0.0669451f,0.996693f,0.0460586f, --0.00516145f,0.998802f,0.0486696f, --0.116537f,0.988089f,0.100498f, --0.0456605f,0.993379f,0.105422f, --0.110131f,0.987256f,-0.114879f, --0.0746162f,0.968429f,-0.237861f, --0.0785155f,0.952358f,-0.294703f, --0.0192369f,0.946876f,-0.321024f, -0.320056f,0.920022f,-0.226108f, -0.288692f,0.932613f,-0.216541f, -0.123147f,0.991593f,-0.0397145f, --0.113817f,0.992375f,0.0473138f, --0.192042f,0.9774f,0.0883642f, --0.156949f,0.987573f,0.00819321f, --0.0848586f,0.992344f,-0.0897344f, -0.0818673f,0.992357f,-0.0923282f, -0.113464f,0.986976f,-0.114035f, --0.0777263f,0.979155f,-0.187653f, --0.11587f,0.975173f,-0.188711f, --0.26618f,0.902421f,-0.338799f, --0.343104f,0.842974f,-0.414336f, --0.318919f,0.837107f,-0.444457f, --0.324821f,0.839352f,-0.435867f, --0.312979f,0.836318f,-0.45013f, --0.203015f,0.862499f,-0.463553f, --0.14187f,0.900483f,-0.411101f, --0.22968f,0.933243f,-0.276233f, --0.413973f,0.871187f,-0.263932f, --0.305656f,0.93798f,-0.163607f, --0.161875f,0.985861f,-0.0433003f, --0.135788f,0.990721f,0.00582442f, --0.138617f,0.984876f,-0.103942f, --0.135024f,0.980056f,-0.145806f, --0.124871f,0.989793f,-0.068687f, --0.182018f,0.982992f,-0.024403f, --0.309743f,0.950592f,-0.0208625f, --0.30492f,0.95221f,0.0178823f, --0.299424f,0.951826f,0.066125f, --0.120448f,0.944431f,0.305848f, -0.118213f,0.907792f,0.402418f, --0.261318f,0.917154f,0.300902f, --0.411401f,0.860866f,0.299431f, -0.15139f,0.91772f,0.367249f, -0.409879f,0.832051f,0.373752f, -0.446772f,0.77668f,0.44403f, -0.301572f,0.80653f,0.508491f, -0.168293f,0.89172f,0.420135f, -0.0587854f,0.961406f,0.26878f, -0.30067f,0.896979f,0.324077f, -0.282217f,0.935284f,0.213535f, -0.148185f,0.986837f,0.0647602f, --0.0572401f,0.974528f,-0.216838f, --0.0945497f,0.96665f,-0.238009f, --0.000668496f,0.9725f,-0.232902f, -0.125989f,0.980136f,-0.15317f, -0.218059f,0.975888f,-0.00959987f, -0.265461f,0.958501f,0.103951f, -0.173443f,0.98019f,0.0956349f, -0.133691f,0.987754f,0.0804258f, -0.0900836f,0.995272f,0.0363034f, -0.0177237f,0.999106f,-0.0383914f, -0.042211f,0.998744f,-0.0269875f, -0.0720539f,0.94434f,0.320982f, -0.0948772f,0.964987f,0.244537f, -0.123635f,0.987961f,0.0929884f, --0.0283728f,0.998997f,-0.0346279f, --0.152337f,0.985597f,-0.0734363f, --0.0291778f,0.996634f,-0.0766092f, -0.0594392f,0.995285f,-0.0766423f, --0.027888f,0.982723f,-0.182971f, --0.0125244f,0.971758f,-0.235647f, --0.0767296f,0.943557f,-0.322201f, -0.2299f,0.955601f,-0.184318f, -0.271645f,0.9586f,-0.0854157f, -0.0112173f,0.999015f,-0.0429278f, --0.142475f,0.989464f,-0.02574f, --0.192441f,0.979224f,-0.0639254f, --0.103523f,0.99301f,-0.0567016f, --0.00378459f,0.998834f,-0.0481324f, -0.0499927f,0.992415f,-0.112309f, -0.0737699f,0.994576f,-0.0733206f, --0.0190206f,0.999623f,-0.0197948f, --0.0783652f,0.99692f,0.00307073f, --0.152226f,0.987897f,0.0297819f, --0.333638f,0.940154f,-0.069252f, --0.307736f,0.941909f,-0.134557f, --0.334924f,0.918699f,-0.209327f, --0.35357f,0.914459f,-0.19686f, --0.243406f,0.963329f,-0.112917f, --0.31479f,0.943784f,-0.100892f, --0.368184f,0.929745f,0.00391099f, --0.386308f,0.922293f,-0.0119138f, --0.337617f,0.936762f,-0.0921568f, --0.305867f,0.947033f,-0.0978487f, --0.109063f,0.994026f,0.00418869f, -0.00976093f,0.996792f,-0.0794369f, --0.152053f,0.972765f,-0.17495f, --0.268682f,0.956747f,-0.111559f, --0.16583f,0.986099f,0.0104333f, --0.26795f,0.960138f,-0.0796053f, --0.428361f,0.903607f,0.000904858f, --0.364896f,0.884093f,0.291943f, --0.411739f,0.889329f,0.19891f, --0.213918f,0.942658f,0.256194f, --0.0353818f,0.912316f,0.407955f, --0.234679f,0.972031f,0.0090071f, -0.164799f,0.976041f,-0.142074f, -0.378329f,0.920537f,-0.0973577f, -0.389048f,0.913009f,0.122701f, -0.312785f,0.918579f,0.241617f, -0.331426f,0.913352f,0.236529f, -0.235473f,0.970893f,0.043811f, -0.0409183f,0.988429f,-0.14606f, -0.183882f,0.951979f,0.244794f, -0.256685f,0.844334f,0.470333f, -0.243297f,0.84406f,0.47788f, -0.178194f,0.957255f,0.227835f, -0.0574376f,0.965885f,-0.252523f, --0.0590426f,0.961892f,-0.266977f, -0.0063288f,0.996614f,-0.081983f, -0.221194f,0.97242f,0.0739783f, -0.131016f,0.988415f,0.0766141f, -0.0953963f,0.986256f,0.134901f, -0.160579f,0.972927f,0.166216f, -0.109946f,0.983906f,0.14086f, -0.027673f,0.996741f,0.0757784f, -0.095102f,0.971229f,0.218334f, -0.102357f,0.973251f,0.205684f, -0.193741f,0.956416f,0.218477f, -0.132416f,0.984788f,0.112512f, --0.0766537f,0.99488f,-0.0658589f, --0.0304197f,0.995587f,-0.0887742f, -0.0261631f,0.997431f,-0.0666789f, -0.0720508f,0.996334f,-0.0461268f, -0.110802f,0.979106f,-0.170512f, --0.036534f,0.946972f,-0.319234f, -0.0562543f,0.953438f,-0.296297f, -0.21433f,0.964539f,-0.154036f, --0.0463138f,0.986383f,-0.157808f, --0.114222f,0.99275f,-0.0374399f, --0.129535f,0.99146f,-0.0150624f, --0.148036f,0.985214f,-0.0862475f, --0.0412316f,0.997863f,-0.050697f, -0.0938182f,0.995513f,-0.0123356f, -0.0585542f,0.997889f,-0.0281043f, --0.11195f,0.993633f,0.0126653f, --0.208443f,0.969116f,0.131782f, --0.178284f,0.959747f,0.217024f, --0.249524f,0.951637f,0.179236f, --0.204568f,0.966799f,0.153139f, --0.277831f,0.959694f,0.042405f, --0.421523f,0.906804f,-0.00501147f, --0.349246f,0.93481f,0.0644755f, --0.271825f,0.953501f,0.130185f, --0.341243f,0.939899f,0.0119564f, --0.356048f,0.93224f,-0.0644791f, --0.286188f,0.955628f,-0.0697892f, --0.248084f,0.956522f,-0.153364f, --0.154022f,0.960443f,-0.232007f, -0.032406f,0.989794f,-0.138774f, --0.0622078f,0.991529f,-0.114016f, --0.335467f,0.915845f,-0.220659f, --0.194821f,0.973732f,-0.117857f, --0.29903f,0.953799f,-0.0291431f, --0.514277f,0.834668f,0.197101f, --0.344769f,0.927072f,0.147212f, --0.0936834f,0.993837f,0.0592615f, --0.181141f,0.974379f,-0.133321f, --0.0841805f,0.983933f,-0.157447f, -0.0661375f,0.94785f,-0.31178f, -0.143104f,0.856028f,-0.496726f, -0.226417f,0.827547f,-0.513714f, -0.178899f,0.912784f,-0.367179f, -0.234616f,0.943911f,-0.232351f, -0.346693f,0.91935f,-0.186008f, -0.307074f,0.943627f,-0.123586f, -0.214863f,0.970065f,0.113171f, -0.0234555f,0.999712f,0.00506759f, --0.0206358f,0.99868f,0.047041f, -0.0320247f,0.946177f,0.322062f, -0.23638f,0.837444f,0.492759f, -0.410368f,0.848265f,0.33473f, --0.0124285f,0.999913f,-0.00451951f, --0.13197f,0.981357f,-0.139724f, -0.0888915f,0.995883f,0.0177605f, -0.12955f,0.973581f,0.188033f, -0.100974f,0.97841f,0.18033f, -0.116628f,0.987352f,0.107396f, -0.0879041f,0.989191f,0.117361f, -0.114472f,0.980893f,0.157306f, -0.0306685f,0.986407f,0.161431f, -0.128704f,0.972047f,0.196366f, -0.21783f,0.966546f,0.135421f, -0.280184f,0.953049f,0.114866f, -0.0272615f,0.999564f,-0.0113551f, --0.0491486f,0.997279f,-0.0549472f, -0.00337261f,0.998977f,-0.0450999f, -0.0913253f,0.995457f,-0.0269266f, -0.252481f,0.964775f,-0.0739122f, -0.0897947f,0.975122f,-0.202665f, --0.0238258f,0.968534f,-0.247739f, -0.162662f,0.981573f,-0.10028f, --0.0276113f,0.997652f,-0.0626774f, --0.289082f,0.95335f,-0.0869268f, --0.160594f,0.986876f,0.0169191f, --0.0752137f,0.997117f,0.00999502f, --0.0455931f,0.997939f,-0.0451647f, -0.0616976f,0.995202f,-0.0759372f, --0.00353073f,0.999867f,-0.0159004f, --0.177748f,0.976224f,0.124065f, --0.247702f,0.959217f,0.136188f, --0.164797f,0.981869f,0.0936766f, --0.214718f,0.976098f,0.0335935f, --0.211552f,0.977318f,-0.00980662f, --0.200169f,0.979677f,0.0128577f, --0.39928f,0.916411f,-0.027687f, --0.374531f,0.927212f,0.0022105f, --0.268102f,0.963363f,0.00736207f, --0.247283f,0.968232f,-0.0371081f, --0.289483f,0.949449f,-0.121432f, --0.253482f,0.93971f,-0.229547f, --0.132892f,0.950758f,-0.279997f, --0.140676f,0.931036f,-0.336723f, --0.161496f,0.9509f,-0.264023f, --0.0403886f,0.9973f,-0.0613364f, --0.215095f,0.96767f,-0.131717f, --0.434628f,0.895597f,-0.0948964f, --0.381939f,0.886142f,0.262442f, --0.43994f,0.880276f,0.177672f, --0.252792f,0.948954f,-0.188633f, --0.0941535f,0.957693f,-0.271953f, --0.13352f,0.964535f,-0.227692f, -0.0341173f,0.927935f,-0.371176f, -0.348577f,0.799586f,-0.489036f, -0.387188f,0.819484f,-0.42253f, -0.14352f,0.883544f,-0.445815f, -0.0762879f,0.891752f,-0.446047f, -0.0742711f,0.875908f,-0.476728f, -0.300515f,0.871535f,-0.38745f, -0.0625809f,0.886656f,-0.458175f, --0.0365474f,0.9191f,-0.392325f, --0.0762363f,0.966891f,-0.243538f, -0.0117284f,0.995382f,0.0952715f, -0.0102532f,0.999347f,-0.0346391f, --0.059511f,0.989492f,-0.131776f, -0.349383f,0.904972f,0.24281f, -0.425179f,0.763732f,0.485732f, --0.0166138f,0.992406f,0.121875f, --0.122272f,0.990094f,0.0690156f, --0.015652f,0.970579f,0.240273f, -0.124649f,0.94771f,0.293785f, -0.220282f,0.938434f,0.266116f, -0.102745f,0.973801f,0.202865f, -0.0640356f,0.977435f,0.201297f, --0.0952943f,0.987515f,0.125435f, -0.114947f,0.977151f,0.178783f, -0.258472f,0.957495f,0.128042f, -0.282157f,0.951094f,0.125728f, -0.142066f,0.986542f,0.0809464f, --0.0434313f,0.998053f,-0.0447576f, -0.0347776f,0.999239f,-0.0176595f, -0.102204f,0.984881f,-0.139871f, -0.245582f,0.958619f,-0.144014f, -0.135608f,0.990697f,0.0113886f, --0.0626335f,0.997441f,0.0344788f, --0.0132478f,0.995736f,0.0912912f, --0.039638f,0.981575f,0.186922f, --0.205229f,0.973473f,0.10115f, --0.153245f,0.987696f,-0.0311751f, --0.0852914f,0.993336f,-0.0775215f, -0.0304281f,0.997751f,-0.0597208f, -0.0412582f,0.993049f,-0.110237f, --0.115798f,0.992196f,0.0462328f, --0.265664f,0.954942f,0.132323f, --0.179634f,0.978355f,0.102729f, --0.122093f,0.992469f,0.00988423f, --0.0976525f,0.994936f,-0.0237989f, --0.19391f,0.963376f,-0.185219f, --0.249328f,0.960076f,-0.126845f, --0.386054f,0.920896f,-0.0539736f, --0.40236f,0.909842f,-0.101455f, --0.264839f,0.959901f,-0.091928f, --0.215529f,0.973573f,-0.0755211f, --0.190591f,0.977631f,-0.0889496f, --0.114636f,0.971653f,-0.20676f, --0.147698f,0.942871f,-0.29863f, --0.153003f,0.970479f,-0.186443f, --0.259911f,0.94737f,-0.186912f, --0.218176f,0.967871f,-0.124997f, --0.218418f,0.965394f,0.142507f, --0.497944f,0.825767f,0.264878f, --0.394522f,0.874216f,0.283017f, --0.174161f,0.980284f,0.0933364f, --0.0291225f,0.984908f,-0.170609f, --0.149188f,0.939649f,-0.307902f, --0.109448f,0.970586f,-0.214438f, -0.391051f,0.895182f,-0.213842f, -0.237246f,0.888641f,-0.392468f, -0.104812f,0.984981f,-0.137213f, -0.1294f,0.991592f,-0.000205693f, -0.119158f,0.992497f,-0.0274125f, -0.117487f,0.990494f,-0.071548f, -0.234708f,0.962187f,-0.138234f, -0.347721f,0.937443f,-0.017023f, -0.135989f,0.962379f,-0.235229f, --0.193384f,0.875532f,-0.442772f, --0.209357f,0.905544f,-0.368998f, -0.0641865f,0.982942f,-0.172352f, -0.0534516f,0.998302f,-0.023133f, --0.0579793f,0.992675f,-0.105989f, -0.299444f,0.827258f,0.475371f, -0.320901f,0.752799f,0.574731f, --0.0625162f,0.964286f,0.257381f, --0.0931157f,0.981324f,0.168322f, -0.0981691f,0.975509f,0.19684f, -0.238911f,0.944952f,0.223577f, -0.0852945f,0.980047f,0.179533f, -0.0437708f,0.96942f,0.241474f, --0.0654565f,0.948925f,0.308637f, -0.105877f,0.941798f,0.319071f, -0.298409f,0.90697f,0.29725f, -0.267454f,0.931587f,0.246198f, -0.257873f,0.930012f,0.261877f, -0.0608152f,0.99476f,0.0821851f, -0.0682325f,0.995644f,-0.0635329f, -0.204976f,0.974836f,-0.0876375f, -0.100643f,0.994422f,0.031559f, --0.0498971f,0.971595f,0.231328f, --0.0948982f,0.951903f,0.291332f, --0.0140779f,0.962693f,0.270229f, -0.0194699f,0.983768f,0.178386f, --0.0700516f,0.997536f,0.00373294f, --0.0458738f,0.991776f,-0.119485f, --0.0457685f,0.983541f,-0.17479f, -0.031836f,0.984739f,-0.171101f, --0.0846163f,0.991107f,-0.102703f, --0.250146f,0.959975f,0.125993f, --0.240823f,0.966766f,0.0858408f, --0.110771f,0.993685f,0.0178603f, --0.0536647f,0.99805f,-0.0318645f, --0.0537905f,0.996775f,-0.0595505f, --0.0979926f,0.994498f,-0.0370296f, --0.317761f,0.946482f,-0.0565711f, --0.353331f,0.932392f,-0.0761719f, --0.315921f,0.918114f,-0.23929f, --0.304095f,0.907663f,-0.289264f, --0.232301f,0.951296f,-0.202665f, --0.181242f,0.959764f,-0.214488f, --0.0415921f,0.982269f,-0.182804f, --0.134113f,0.976644f,-0.16787f, --0.266673f,0.950383f,-0.160182f, --0.233335f,0.968889f,-0.0825141f, --0.383896f,0.923094f,0.0228394f, --0.46523f,0.826401f,0.317211f, --0.448022f,0.824389f,0.345917f, --0.335673f,0.941977f,-0.00160348f, -0.00939714f,0.9768f,-0.213948f, -0.0525806f,0.945774f,-0.320541f, --0.0139338f,0.984205f,-0.176483f, --0.233879f,0.941098f,-0.244203f, -0.35813f,0.924476f,-0.13072f, -0.148621f,0.988076f,0.040214f, --0.0873945f,0.896884f,0.433546f, -0.16715f,0.882598f,0.43941f, -0.105867f,0.92276f,0.370549f, -0.162793f,0.877156f,0.451769f, -0.26606f,0.895485f,0.356818f, -0.178343f,0.923603f,0.339339f, -0.205659f,0.876785f,0.434686f, -0.164046f,0.939287f,0.301379f, --0.304778f,0.94913f,-0.0791393f, --0.351721f,0.931897f,-0.088655f, --0.137155f,0.986834f,0.0857151f, --0.0493791f,0.984585f,0.167793f, --0.29261f,0.942092f,0.163834f, -0.175576f,0.863797f,0.472257f, -0.388427f,0.769345f,0.507181f, -0.0396361f,0.995255f,0.0888612f, -0.000897162f,0.999738f,-0.022857f, -0.263974f,0.951061f,0.160623f, -0.140984f,0.987533f,0.0700142f, --0.0604349f,0.998129f,-0.00925637f, --0.0323604f,0.969904f,0.241328f, -0.0249905f,0.978924f,0.202689f, -0.301944f,0.900385f,0.313268f, -0.302439f,0.903212f,0.304531f, -0.227241f,0.927301f,0.297445f, -0.295557f,0.903047f,0.311692f, -0.215996f,0.968849f,0.121149f, -0.0543993f,0.994951f,0.0843384f, --0.108272f,0.967731f,0.227539f, --0.144218f,0.941468f,0.304694f, --0.0465574f,0.94074f,0.335917f, -0.0834793f,0.95338f,0.289996f, -0.159412f,0.96437f,0.211135f, -0.125672f,0.984055f,0.125864f, -0.0125305f,0.999902f,-0.00630946f, --0.0213081f,0.999771f,-0.00209364f, --0.0845682f,0.99631f,0.014661f, --0.191644f,0.962461f,0.192203f, --0.326186f,0.912172f,0.248084f, --0.125723f,0.965189f,0.229357f, --0.0487346f,0.993706f,0.100859f, -0.0069351f,0.999976f,0.00057427f, --0.0853775f,0.991791f,-0.0951918f, --0.217561f,0.97582f,-0.0210368f, --0.247132f,0.964013f,0.0979986f, --0.253847f,0.965546f,-0.0573009f, --0.17269f,0.977352f,-0.122318f, --0.308873f,0.930936f,-0.19482f, --0.274273f,0.935966f,-0.220775f, --0.176582f,0.954344f,-0.240926f, --0.17678f,0.967725f,-0.179601f, --0.142126f,0.989789f,-0.0108556f, --0.241082f,0.966299f,-0.0902532f, --0.303483f,0.94088f,-0.150476f, --0.634535f,0.768468f,-0.082594f, --0.47113f,0.814002f,0.339761f, --0.289984f,0.937003f,0.194769f, -0.025067f,0.999685f,-0.000862102f, -0.289006f,0.893747f,-0.343064f, -0.00615404f,0.935866f,-0.352301f, --0.338901f,0.929111f,-0.147984f, --0.164518f,0.985591f,-0.0393034f, -0.290961f,0.935697f,-0.199533f, --0.0876053f,0.971539f,-0.220083f, --0.32548f,0.935239f,0.139248f, -0.0766933f,0.974848f,0.20926f, -0.108828f,0.917507f,0.382541f, -0.0350786f,0.924503f,0.379557f, -0.162845f,0.883516f,0.439183f, -0.280718f,0.786151f,0.550603f, -0.282161f,0.80649f,0.519575f, -0.319525f,0.746566f,0.583561f, --0.0912168f,0.872752f,0.479567f, --0.288082f,0.924626f,0.249148f, --0.142667f,0.981082f,0.130856f, --0.066753f,0.9808f,0.183236f, --0.230244f,0.961075f,0.152718f, --0.067082f,0.99457f,0.0795691f, -0.611911f,0.730537f,0.303119f, -0.451199f,0.889041f,0.077617f, -0.0130284f,0.992329f,-0.12294f, -0.0930856f,0.993052f,-0.0719959f, -0.26722f,0.962884f,0.0380388f, -0.075301f,0.995117f,-0.0638176f, -0.167918f,0.972374f,0.162147f, -0.0578882f,0.993576f,0.0972437f, -0.196869f,0.968468f,0.152684f, -0.304163f,0.924874f,0.228237f, -0.255006f,0.935584f,0.244244f, -0.260728f,0.944471f,0.199987f, -0.218361f,0.924111f,0.313587f, -0.0535174f,0.911234f,0.408398f, --0.0710624f,0.921034f,0.382946f, --0.130246f,0.949543f,0.285314f, --0.0655027f,0.977569f,0.200169f, -0.0903252f,0.974724f,0.204338f, -0.155207f,0.949154f,0.273892f, -0.153701f,0.938218f,0.310037f, -0.0621551f,0.960028f,0.272917f, --0.0534301f,0.951765f,0.30214f, --0.196733f,0.911558f,0.361052f, --0.281614f,0.838193f,0.46704f, --0.263195f,0.866235f,0.424694f, --0.0481024f,0.917426f,0.394989f, -0.0935627f,0.945047f,0.31326f, -0.130693f,0.965135f,0.226792f, -0.00742185f,0.989033f,0.14751f, --0.243053f,0.969364f,0.0354789f, --0.273599f,0.961363f,-0.0304179f, --0.215123f,0.976563f,-0.00682047f, --0.164989f,0.983922f,0.068385f, --0.241802f,0.97031f,0.00552545f, --0.241315f,0.967202f,-0.0792945f, --0.169018f,0.981272f,-0.0923975f, --0.282714f,0.953981f,-0.0999632f, --0.234963f,0.971912f,-0.0134244f, --0.109087f,0.993838f,-0.0196489f, --0.369236f,0.9273f,-0.0614783f, --0.551241f,0.800465f,0.235349f, --0.62344f,0.781571f,-0.0216512f, --0.285923f,0.957424f,0.0398505f, -0.246101f,0.967083f,0.064696f, -0.379822f,0.894837f,-0.234526f, --0.124179f,0.991035f,0.0492959f, --0.55499f,0.830986f,0.0380685f, --0.0883601f,0.986961f,0.13454f, -0.492332f,0.870217f,0.0182045f, --0.0249785f,0.975709f,-0.217643f, --0.368665f,0.864796f,-0.340902f, --0.0172444f,0.938433f,-0.345031f, --0.0663306f,0.97669f,-0.204147f, -0.00514992f,0.997132f,-0.0755029f, -0.0570337f,0.998371f,-0.00125828f, -0.249285f,0.962439f,0.107557f, -0.242481f,0.961206f,0.131476f, -0.205153f,0.940815f,0.269776f, -0.193253f,0.908579f,0.370322f, --0.0564604f,0.989265f,0.134783f, -0.0286103f,0.993761f,-0.107795f, --0.22802f,0.927614f,-0.29587f, --0.141654f,0.989087f,-0.0405023f, --0.0918591f,0.979413f,-0.179757f, -0.474817f,0.877478f,-0.067685f, -0.562064f,0.827022f,0.0108876f, -0.0667731f,0.98619f,-0.151561f, -0.0478258f,0.978171f,-0.202223f, -0.240461f,0.955483f,-0.170967f, -0.22331f,0.956303f,-0.188725f, -0.105513f,0.987685f,0.115519f, -0.0191904f,0.988704f,0.148645f, -0.138326f,0.966121f,0.217888f, -0.261136f,0.942738f,0.207491f, -0.283954f,0.937656f,0.20043f, -0.227821f,0.960294f,0.161036f, -0.0632997f,0.956465f,0.284901f, --0.0487147f,0.902832f,0.427225f, --0.0448066f,0.869805f,0.491357f, -0.0191513f,0.881775f,0.471282f, -0.0794772f,0.93047f,0.357644f, -0.0542875f,0.971817f,0.2294f, -0.0315472f,0.963796f,0.264769f, -0.140004f,0.919916f,0.36627f, -0.0838185f,0.924915f,0.370818f, --0.147814f,0.916849f,0.370861f, --0.285354f,0.864307f,0.414182f, --0.277978f,0.859855f,0.428226f, --0.199243f,0.910371f,0.362666f, -0.00801534f,0.941586f,0.336678f, -0.134574f,0.9298f,0.342582f, -0.118153f,0.909557f,0.398429f, -0.0557977f,0.896269f,0.439987f, --0.0363608f,0.927402f,0.372294f, --0.166377f,0.978738f,0.119962f, --0.285966f,0.957794f,-0.0292047f, --0.233552f,0.97096f,0.0518564f, --0.131443f,0.981568f,0.138735f, --0.225195f,0.974079f,0.0213645f, --0.190643f,0.980844f,0.0400016f, --0.234677f,0.970688f,0.051878f, --0.269033f,0.961888f,-0.0489107f, --0.0845976f,0.996159f,0.0225919f, --0.404645f,0.907558f,0.112255f, --0.609864f,0.674076f,0.416758f, --0.498816f,0.848126f,0.178504f, --0.144072f,0.987953f,-0.0565038f, -0.166758f,0.948601f,-0.268974f, -0.264567f,0.924612f,0.274038f, --0.242512f,0.859891f,0.449195f, --0.469649f,0.864648f,0.178364f, --0.10506f,0.987899f,0.114094f, -0.522959f,0.850167f,0.0610757f, -0.207342f,0.943984f,-0.256717f, --0.370985f,0.736513f,-0.565613f, --0.196204f,0.840957f,-0.504277f, --0.176697f,0.964208f,-0.197689f, --0.102305f,0.980589f,-0.167266f, -0.103476f,0.966902f,-0.233225f, -0.176136f,0.882185f,-0.436721f, -0.1356f,0.926363f,-0.351374f, -0.144454f,0.987968f,-0.0552396f, -0.173673f,0.98445f,-0.0263929f, -0.186245f,0.978364f,-0.0900963f, -0.313839f,0.899877f,-0.302865f, -0.0432774f,0.865555f,-0.498941f, --0.311487f,0.833772f,-0.45585f, --0.00804547f,0.940342f,-0.340136f, -0.304128f,0.919914f,-0.247515f, -0.693924f,0.703662f,0.152743f, -0.239861f,0.957303f,-0.161363f, -0.0838446f,0.969769f,-0.229169f, -0.258925f,0.935636f,-0.239881f, -0.257223f,0.918931f,-0.299002f, -0.0548176f,0.967903f,0.245271f, -0.0212885f,0.963347f,0.267412f, -0.0818858f,0.973102f,0.215332f, -0.303912f,0.917546f,0.25641f, -0.304793f,0.927062f,0.218307f, -0.238677f,0.941098f,0.239517f, --0.064428f,0.967965f,0.242677f, --0.187169f,0.922119f,0.338622f, --0.088608f,0.904799f,0.416518f, -0.0498324f,0.910793f,0.409846f, -0.176362f,0.913248f,0.367253f, -0.168717f,0.938419f,0.301504f, -0.00502329f,0.962305f,0.271928f, -0.0457173f,0.940418f,0.336934f, -0.0516487f,0.913931f,0.402569f, --0.133343f,0.891616f,0.432713f, --0.271457f,0.878825f,0.392399f, --0.232052f,0.920355f,0.3148f, --0.147635f,0.961854f,0.230305f, --0.0156622f,0.96416f,0.264858f, -0.0430262f,0.93984f,0.338894f, --0.0165403f,0.899263f,0.437095f, -0.0174547f,0.845985f,0.53292f, -0.0913065f,0.841589f,0.532345f, -0.0967863f,0.903784f,0.416901f, --0.0948439f,0.973273f,0.209153f, --0.30724f,0.95163f,-0.00197291f, --0.219507f,0.974242f,0.051671f, --0.123616f,0.986822f,0.104414f, --0.209302f,0.977457f,0.0277521f, --0.245642f,0.966973f,0.0679884f, --0.189013f,0.970874f,0.147233f, --0.260969f,0.955926f,0.134541f, --0.586593f,0.772947f,0.241789f, --0.622505f,0.744412f,0.241534f, --0.343069f,0.923585f,0.171158f, -0.270136f,0.949637f,0.158794f, --0.0270125f,0.976583f,-0.213437f, --0.293688f,0.905533f,0.306199f, --0.165876f,0.923469f,0.345963f, --0.101353f,0.963266f,0.248689f, --0.0607966f,0.998139f,0.00473307f, -0.571806f,0.81892f,0.04908f, -0.496821f,0.86721f,0.0334054f, --0.0103979f,0.971297f,-0.237642f, --0.296903f,0.868994f,-0.395851f, --0.405401f,0.821757f,-0.400457f, --0.0724266f,0.96927f,-0.235097f, -0.416989f,0.879556f,-0.229132f, -0.361436f,0.845922f,-0.392148f, --0.194841f,0.930819f,-0.309213f, --0.180426f,0.920987f,-0.345297f, -0.16396f,0.957989f,-0.235318f, -0.390246f,0.873397f,-0.291351f, -0.368832f,0.745912f,-0.554597f, -0.0989123f,0.900328f,-0.423823f, --0.474178f,0.712544f,-0.517143f, --0.225662f,0.862106f,-0.453707f, -0.0544551f,0.930953f,-0.361055f, -0.547706f,0.827837f,-0.121263f, -0.394416f,0.886974f,-0.240235f, -0.0920684f,0.955894f,-0.278909f, -0.287609f,0.908713f,-0.302524f, -0.34308f,0.875033f,-0.341487f, --0.0471282f,0.962572f,0.266897f, -0.0309198f,0.953932f,0.298424f, -0.131633f,0.963671f,0.232402f, -0.278528f,0.937297f,0.209515f, -0.282669f,0.933258f,0.221646f, -0.232384f,0.927485f,0.292863f, --0.0647083f,0.957687f,0.280443f, --0.249973f,0.928177f,0.275683f, --0.129841f,0.953629f,0.271538f, -0.0843284f,0.953748f,0.288536f, -0.245794f,0.935145f,0.255127f, -0.172562f,0.957759f,0.230042f, --0.0230052f,0.954645f,0.296857f, --0.041189f,0.951248f,0.305663f, -0.00483043f,0.930995f,0.364999f, --0.165245f,0.915404f,0.367054f, --0.220878f,0.904299f,0.365316f, --0.0993279f,0.939818f,0.326919f, --0.130653f,0.959943f,0.247869f, --0.122986f,0.930904f,0.343936f, --0.00592517f,0.911134f,0.412068f, --0.1345f,0.9137f,0.383488f, --0.0693903f,0.866333f,0.494623f, -0.121472f,0.852483f,0.508447f, -0.210048f,0.85163f,0.480215f, -0.0819942f,0.889969f,0.448588f, --0.0885916f,0.940837f,0.327072f, --0.228328f,0.96901f,0.0942702f, --0.142437f,0.987843f,0.0622738f, --0.157298f,0.987135f,0.0286638f, --0.320718f,0.947161f,0.00499032f, --0.336449f,0.936473f,0.0990975f, --0.304779f,0.919932f,0.246646f, --0.589969f,0.761912f,0.267259f, --0.577652f,0.799842f,0.163009f, --0.2738f,0.948238f,0.160868f, -0.240449f,0.968762f,0.0607085f, --0.0196269f,0.999224f,-0.0341484f, --0.384279f,0.908117f,0.166292f, --0.0937293f,0.985711f,0.139963f, -0.0542133f,0.980144f,0.190731f, -0.0177665f,0.999043f,0.039964f, -0.448192f,0.892243f,0.0550135f, -0.417622f,0.800327f,0.430197f, -0.199972f,0.838529f,0.506833f, --0.0526069f,0.975321f,0.214434f, --0.547935f,0.818163f,-0.174291f, --0.280437f,0.954205f,-0.10415f, -0.341739f,0.938698f,0.0453871f, -0.346269f,0.925369f,0.15424f, --0.319444f,0.944119f,0.0812127f, --0.192857f,0.977783f,0.0821343f, -0.335818f,0.935599f,-0.108997f, -0.474712f,0.785031f,-0.397964f, -0.373974f,0.907089f,-0.193218f, -0.0523306f,0.977738f,-0.203201f, --0.41385f,0.870502f,-0.266372f, --0.377073f,0.911356f,-0.165066f, -0.0445989f,0.977381f,-0.206731f, -0.525837f,0.831576f,-0.178819f, -0.378975f,0.901633f,-0.208411f, -0.088353f,0.958416f,-0.271353f, -0.309469f,0.925076f,-0.220144f, -0.420279f,0.904173f,-0.0763995f, -0.00329705f,0.962532f,0.271149f, -0.0784063f,0.967252f,0.241403f, -0.186812f,0.966508f,0.175965f, -0.294591f,0.944303f,0.146656f, -0.242144f,0.958708f,0.149151f, -0.122249f,0.946777f,0.297772f, --0.0273117f,0.906407f,0.421521f, --0.206066f,0.9181f,0.338568f, --0.0954796f,0.950658f,0.295183f, -0.102184f,0.964671f,0.242834f, -0.213961f,0.952875f,0.215059f, -0.119187f,0.935673f,0.33213f, --0.0431159f,0.926594f,0.373584f, --0.0072858f,0.954565f,0.297913f, --0.0455381f,0.966183f,0.253806f, --0.154593f,0.937454f,0.311898f, --0.199077f,0.936411f,0.288969f, --0.136466f,0.95497f,0.263457f, --0.127877f,0.920831f,0.3684f, --0.229636f,0.912787f,0.337767f, --0.0324452f,0.91205f,0.408794f, --0.100812f,0.892675f,0.439282f, --0.166782f,0.900555f,0.401477f, -0.102011f,0.876619f,0.470247f, -0.195025f,0.830402f,0.521918f, -0.0914158f,0.843587f,0.529154f, -0.0626366f,0.873316f,0.48311f, --0.00226622f,0.929744f,0.3682f, --0.0934177f,0.966149f,0.240479f, --0.109555f,0.963702f,0.243468f, --0.302241f,0.931855f,0.200739f, --0.368178f,0.918352f,0.145171f, --0.476623f,0.864028f,0.162128f, --0.569304f,0.726984f,0.383911f, --0.64096f,0.755201f,0.137264f, --0.241026f,0.942011f,0.233501f, -0.376487f,0.905115f,0.197547f, -0.13011f,0.991259f,-0.0218225f, --0.643013f,0.733979f,-0.218653f, --0.19089f,0.942227f,0.275264f, --0.00867818f,0.931663f,0.363219f, -0.146287f,0.916711f,0.371809f, -0.32054f,0.88208f,0.345239f, -0.0976689f,0.827123f,0.55347f, -0.0475977f,0.818583f,0.572413f, -0.312042f,0.775215f,0.549246f, --0.398647f,0.872033f,0.283969f, --0.297551f,0.880657f,0.368657f, -0.0684096f,0.950263f,0.303844f, -0.473417f,0.718991f,0.50885f, --0.0712795f,0.964076f,0.255885f, --0.187608f,0.981414f,0.0403824f, -0.441688f,0.892595f,0.090477f, -0.402228f,0.910874f,0.0923076f, -0.356001f,0.889285f,0.287114f, -0.109119f,0.990916f,0.0786044f, --0.366364f,0.926283f,0.0881909f, --0.361407f,0.913864f,0.185034f, -0.114451f,0.98516f,0.127909f, -0.511212f,0.854805f,0.0892759f, -0.488262f,0.865451f,0.112231f, -0.135362f,0.990178f,0.0350016f, -0.158924f,0.983832f,0.0825671f, -0.139428f,0.973099f,0.183407f, --0.0124598f,0.997106f,0.0750005f, -0.111778f,0.989445f,0.0922193f, -0.245419f,0.967744f,0.0569325f, -0.2823f,0.95863f,0.0365395f, -0.172017f,0.973333f,0.151766f, --0.129296f,0.953534f,0.27213f, --0.0899396f,0.877846f,0.470422f, --0.0963581f,0.899855f,0.425413f, --0.0212856f,0.934761f,0.354638f, -0.147549f,0.94824f,0.281195f, -0.129526f,0.93959f,0.316849f, -0.0223606f,0.903767f,0.427441f, --0.0124316f,0.909175f,0.41623f, -0.115235f,0.910193f,0.397831f, --0.0283739f,0.950232f,0.310248f, --0.203804f,0.932573f,0.297946f, --0.13899f,0.955458f,0.260347f, --0.204301f,0.958838f,0.197208f, --0.229868f,0.915186f,0.331053f, --0.132513f,0.91447f,0.38234f, --0.151493f,0.940711f,0.3035f, --0.124022f,0.907796f,0.400656f, --0.112999f,0.914934f,0.387462f, --0.039891f,0.908327f,0.416355f, -0.0930682f,0.835427f,0.541664f, -0.161351f,0.801381f,0.575981f, -0.131487f,0.83942f,0.527339f, -0.132693f,0.857332f,0.497367f, --0.0832448f,0.920852f,0.380923f, --0.145993f,0.894645f,0.422252f, --0.213236f,0.888697f,0.405893f, --0.293641f,0.888131f,0.353551f, --0.525155f,0.788991f,0.318912f, --0.588027f,0.679363f,0.438964f, --0.478637f,0.812929f,0.331743f, --0.264049f,0.917426f,0.297671f, -0.302963f,0.900818f,0.31103f, -0.420369f,0.80167f,0.424988f, --0.470879f,0.867699f,0.159284f, --0.530406f,0.817263f,0.225279f, --0.0411983f,0.860627f,0.507566f, -0.103255f,0.833118f,0.543372f, -0.186539f,0.814428f,0.549463f, -0.132619f,0.779192f,0.612594f, -0.0761138f,0.83531f,0.544485f, -0.378863f,0.611781f,0.694397f, --0.172003f,0.719417f,0.672944f, --0.295852f,0.804769f,0.514605f, -0.0593285f,0.827842f,0.557814f, -0.323809f,0.743921f,0.584575f, -0.339913f,0.758357f,0.556197f, --0.00694706f,0.946602f,0.322331f, -0.188872f,0.934445f,0.301895f, -0.251044f,0.713229f,0.654432f, -0.351195f,0.638214f,0.685087f, -0.295602f,0.899369f,0.322109f, --0.450583f,0.880167f,0.14927f, --0.375985f,0.904392f,0.201769f, -0.158376f,0.94847f,0.274448f, -0.500024f,0.831884f,0.240719f, -0.503159f,0.8293f,0.243089f, -0.0889199f,0.964326f,0.249335f, -0.108789f,0.932871f,0.34339f, -0.066105f,0.944864f,0.320722f, --0.09433f,0.994124f,-0.0530892f, -0.0903529f,0.995715f,-0.0196726f, -0.246451f,0.969124f,-0.00783612f, -0.17532f,0.977334f,0.118663f, -0.0145033f,0.945036f,0.326645f, --0.208385f,0.89773f,0.388145f, --0.186403f,0.920929f,0.342264f, --0.0196042f,0.920127f,0.391129f, -0.088861f,0.938743f,0.332966f, -0.0904885f,0.955513f,0.280725f, -0.00776342f,0.887041f,0.461625f, -0.0357997f,0.855618f,0.516368f, -0.0251977f,0.899984f,0.435195f, -0.113155f,0.898436f,0.424273f, -0.0488401f,0.928538f,0.36801f, --0.122117f,0.962671f,0.241562f, --0.0832756f,0.977563f,0.193483f, --0.182752f,0.960599f,0.209407f, --0.340533f,0.923546f,0.176353f, --0.207225f,0.949201f,0.236801f, --0.0875863f,0.939463f,0.331268f, --0.156293f,0.945917f,0.284277f, --0.15128f,0.944026f,0.293135f, --0.133917f,0.921967f,0.363377f, --0.0187779f,0.901995f,0.431337f, -0.137151f,0.859664f,0.492105f, -0.151864f,0.841546f,0.518398f, -0.169983f,0.832825f,0.526791f, -0.0329472f,0.8585f,0.511754f, --0.148058f,0.877168f,0.456787f, --0.179554f,0.872912f,0.453636f, --0.29061f,0.863835f,0.411502f, --0.582219f,0.748049f,0.318501f, --0.586418f,0.753548f,0.297117f, --0.423744f,0.867437f,0.260755f, --0.266814f,0.914007f,0.305617f, -0.297036f,0.879751f,0.371224f, -0.301464f,0.846429f,0.438951f, --0.267915f,0.8201f,0.505626f, --0.708126f,0.705156f,0.0362171f, --0.280503f,0.856013f,0.434234f, -0.0634361f,0.843315f,0.533662f, -0.203328f,0.848496f,0.488581f, -0.157757f,0.86266f,0.480552f, --0.0108627f,0.875364f,0.483343f, --0.00732908f,0.804113f,0.594431f, -0.217513f,0.756413f,0.616869f, --0.242879f,0.903897f,0.352108f, --0.0770731f,0.775477f,0.626654f, -0.238061f,0.731126f,0.639361f, -0.459013f,0.658034f,0.596908f, -0.0332364f,0.855326f,0.517022f, --0.132848f,0.766918f,0.627844f, --0.0252308f,0.840734f,0.54086f, -0.442735f,0.688282f,0.574677f, -0.624206f,0.545029f,0.559742f, --0.216833f,0.89857f,0.381516f, --0.428783f,0.890698f,0.151005f, -0.076598f,0.986116f,0.147334f, -0.479671f,0.865386f,0.144994f, -0.542246f,0.827427f,0.146065f, -0.100899f,0.969794f,0.222079f, -0.0591096f,0.972132f,0.226859f, -0.163564f,0.950136f,0.265495f, --0.0539816f,0.998166f,0.0273959f, -0.085626f,0.996323f,0.00278248f, -0.159482f,0.986364f,0.0406345f, --0.0565903f,0.982572f,0.177057f, --0.167853f,0.932231f,0.320579f, --0.135579f,0.92648f,0.351075f, --0.12175f,0.950039f,0.287407f, --0.0275f,0.960651f,0.276393f, -0.0945575f,0.956567f,0.27575f, -0.0118837f,0.934274f,0.356358f, --0.160104f,0.889888f,0.42716f, -0.0609856f,0.903744f,0.423707f, -0.121664f,0.922268f,0.366906f, -0.148425f,0.946235f,0.287418f, -0.23463f,0.944122f,0.231479f, --0.0440541f,0.996345f,0.0731815f, --0.127251f,0.98255f,0.135658f, --0.207412f,0.958865f,0.1938f, --0.296871f,0.939382f,0.171549f, --0.278192f,0.946498f,0.163558f, --0.178451f,0.945897f,0.270988f, --0.115294f,0.937073f,0.329548f, --0.175206f,0.945254f,0.275312f, --0.191323f,0.939359f,0.284604f, --0.0822793f,0.949627f,0.302389f, -0.0583847f,0.93226f,0.357046f, -0.125066f,0.884667f,0.449136f, -0.147347f,0.866347f,0.477213f, -0.0545541f,0.865292f,0.49829f, --0.098516f,0.887377f,0.450395f, --0.209769f,0.897417f,0.388122f, --0.210182f,0.881546f,0.422729f, --0.451263f,0.852365f,0.264264f, --0.650724f,0.758775f,-0.0286192f, --0.407582f,0.890583f,0.201838f, --0.388367f,0.887583f,0.247725f, -0.193188f,0.884808f,0.424019f, -0.215311f,0.880386f,0.422566f, --0.165147f,0.855262f,0.491176f, --0.520864f,0.795129f,0.310596f, --0.488998f,0.786967f,0.37625f, -0.0562235f,0.868104f,0.493187f, -0.400928f,0.84731f,0.348313f, -0.199813f,0.978725f,-0.0465961f, --0.198621f,0.97682f,0.0798329f, --0.0891351f,0.888352f,0.450429f, -0.204835f,0.834736f,0.511135f, --0.0720813f,0.941881f,0.328121f, --0.196291f,0.972713f,0.123691f, -0.179787f,0.980826f,-0.0752149f, -0.511674f,0.853811f,0.0958982f, -0.0191479f,0.909767f,0.414677f, --0.125562f,0.89333f,0.431505f, -0.22305f,0.943278f,0.245918f, -0.527748f,0.84488f,0.0875187f, -0.598212f,0.799615f,-0.0525252f, -0.0107332f,0.903361f,0.428747f, --0.300811f,0.914951f,0.269032f, -0.179787f,0.975264f,0.128593f, -0.519301f,0.854591f,0.00126655f, -0.419398f,0.906587f,-0.0469514f, -0.0522982f,0.994257f,0.0933686f, -0.0513278f,0.996267f,0.0694112f, -0.103651f,0.993237f,0.0523089f, -0.0555975f,0.984758f,0.164805f, -0.0862163f,0.988349f,0.12543f, -0.0909734f,0.981273f,0.169784f, --0.14512f,0.970727f,0.191388f, --0.180918f,0.953611f,0.240612f, --0.140102f,0.96533f,0.22025f, --0.119189f,0.970295f,0.210526f, --0.0126783f,0.974075f,0.225869f, -0.0237961f,0.97809f,0.20682f, --0.0862872f,0.95413f,0.286688f, --0.14433f,0.944949f,0.293667f, -0.132869f,0.954959f,0.265329f, -0.22733f,0.94991f,0.214458f, -0.185536f,0.968744f,0.164655f, -0.30218f,0.927213f,0.221277f, --0.010566f,0.987352f,0.158194f, --0.227641f,0.957817f,0.175404f, --0.212635f,0.950922f,0.224799f, --0.288872f,0.93765f,0.193302f, --0.303211f,0.936666f,0.175273f, --0.283958f,0.943546f,0.170553f, --0.13575f,0.960553f,0.242714f, --0.0816944f,0.973992f,0.211345f, --0.191701f,0.977982f,0.0824724f, --0.110352f,0.986199f,0.123427f, --0.0409453f,0.971384f,0.233958f, -0.0185038f,0.933683f,0.357621f, -0.13477f,0.907601f,0.397615f, -0.0792432f,0.925049f,0.371489f, --0.0350852f,0.929789f,0.366418f, --0.159548f,0.910971f,0.380363f, --0.245138f,0.905643f,0.346003f, --0.179352f,0.926492f,0.330825f, --0.589052f,0.80668f,0.0478056f, --0.578625f,0.779472f,0.240033f, --0.471687f,0.839166f,0.270762f, -0.0987404f,0.916105f,0.388589f, -0.173592f,0.831445f,0.527792f, --0.220086f,0.704489f,0.674728f, --0.395802f,0.62503f,0.672813f, --0.417304f,0.755058f,0.505712f, -0.0513487f,0.865997f,0.497406f, -0.431689f,0.734124f,0.524124f, -0.359032f,0.884637f,0.297512f, --0.308259f,0.930686f,0.196975f, --0.34698f,0.877125f,0.332049f, -0.00851592f,0.919266f,0.393545f, -0.326193f,0.840272f,0.433061f, -0.261231f,0.960149f,-0.0993615f, -0.388612f,0.889039f,-0.242053f, -0.0354931f,0.979528f,-0.198152f, -0.0485316f,0.907873f,0.416427f, --0.0781845f,0.964592f,0.251892f, -0.47974f,0.876345f,0.0432286f, -0.568817f,0.783907f,-0.248873f, -0.483889f,0.834837f,-0.262485f, --0.220496f,0.975376f,0.00471288f, --0.25449f,0.933474f,0.252706f, -0.326168f,0.921789f,0.209569f, -0.609761f,0.790958f,0.0507595f, -0.419183f,0.900774f,-0.11354f, --0.0389936f,0.992704f,-0.114095f, -0.112818f,0.992086f,-0.0551048f, -0.140261f,0.98577f,-0.0926471f, -0.0460285f,0.981507f,0.185811f, -0.0839854f,0.981486f,0.172137f, -0.0780195f,0.983837f,0.161178f, --0.135272f,0.977846f,0.159743f, --0.233239f,0.960885f,0.149328f, --0.119476f,0.978748f,0.166665f, --0.0623017f,0.991047f,0.118089f, --0.0310067f,0.999432f,0.0132292f, --0.0037253f,0.997112f,0.0758502f, --0.0758016f,0.98526f,0.153355f, --0.143296f,0.988211f,0.0539015f, -0.103486f,0.991653f,0.076914f, -0.266632f,0.947722f,0.175298f, -0.164045f,0.978994f,0.121078f, -0.196418f,0.969063f,0.149458f, -0.0648458f,0.968138f,0.241876f, --0.21695f,0.963194f,0.158716f, --0.238014f,0.956133f,0.17076f, --0.251543f,0.948014f,0.194926f, --0.241597f,0.958745f,0.149794f, --0.248822f,0.966568f,0.0619263f, --0.195635f,0.9804f,0.0233089f, -0.00681016f,0.994726f,0.102342f, --0.0728308f,0.997328f,0.00570638f, --0.223928f,0.970021f,-0.0944255f, --0.201047f,0.979434f,0.0169867f, --0.100278f,0.986057f,0.132801f, -0.129703f,0.962794f,0.237074f, -0.129196f,0.949613f,0.28556f, --0.100355f,0.959332f,0.263838f, --0.226831f,0.927446f,0.297306f, --0.211803f,0.921673f,0.325051f, --0.16781f,0.90652f,0.387378f, --0.507141f,0.76624f,0.394569f, --0.499456f,0.740703f,0.449336f, --0.375574f,0.865361f,0.331805f, -0.0665425f,0.96722f,0.245068f, --0.127974f,0.946728f,0.295513f, --0.531445f,0.627941f,0.568557f, --0.268657f,0.746051f,0.609287f, --0.123398f,0.84105f,0.526695f, -0.113268f,0.868801f,0.482033f, -0.278975f,0.860996f,0.425274f, -0.256512f,0.783766f,0.565608f, -0.24637f,0.788587f,0.563411f, --0.207735f,0.977522f,-0.036006f, -0.0390118f,0.996098f,0.0791601f, -0.408253f,0.910351f,0.0677493f, -0.466297f,0.863647f,-0.191525f, -0.226125f,0.967725f,-0.111247f, --0.24034f,0.965221f,0.102887f, --0.130757f,0.944853f,0.300258f, -0.283435f,0.943407f,0.172188f, -0.590839f,0.8059f,-0.0378747f, -0.573782f,0.756596f,-0.313587f, -0.355206f,0.926281f,0.12583f, --0.219704f,0.910923f,0.349212f, --0.277723f,0.959254f,0.051969f, -0.340807f,0.938572f,0.0541606f, -0.677372f,0.729826f,0.0923128f, -0.49544f,0.867668f,-0.0411347f, --0.024834f,0.981688f,-0.188872f, -0.050519f,0.974996f,-0.216403f, -0.180767f,0.970256f,-0.161015f, -0.0401148f,0.977494f,0.207113f, -0.106256f,0.969045f,0.222848f, -0.0969035f,0.97128f,0.217314f, --0.118574f,0.978564f,0.16838f, --0.194437f,0.978726f,0.0655019f, --0.11441f,0.993427f,0.0037257f, -0.00229181f,0.999514f,0.0311045f, -0.0309142f,0.998007f,0.0550047f, --0.113357f,0.989867f,0.085516f, --0.111292f,0.980012f,0.164894f, --0.0212066f,0.993646f,0.110539f, -0.0241257f,0.999577f,-0.0162417f, -0.157698f,0.982481f,0.0993122f, -0.222931f,0.950361f,0.21706f, -0.18078f,0.964986f,0.190052f, -0.0702985f,0.98108f,0.180387f, --0.190259f,0.977665f,0.089291f, --0.268574f,0.956136f,0.116926f, --0.267756f,0.955804f,0.121429f, --0.211446f,0.969418f,0.124579f, --0.14687f,0.983484f,0.105776f, --0.198985f,0.979945f,-0.0106117f, --0.0887412f,0.995564f,0.0312775f, -0.0104704f,0.992989f,0.117739f, --0.125001f,0.9915f,0.0360868f, --0.238906f,0.968221f,-0.0739686f, --0.167029f,0.981518f,-0.0933989f, --0.0351406f,0.998931f,-0.030045f, -0.0130186f,0.974123f,0.225643f, --0.0745329f,0.922898f,0.377762f, --0.18971f,0.916591f,0.351953f, --0.286917f,0.902381f,0.321538f, --0.328487f,0.84853f,0.414841f, --0.591704f,0.685127f,0.424839f, --0.448564f,0.796089f,0.406241f, --0.170353f,0.888356f,0.426384f, --0.00830475f,0.908708f,0.417349f, --0.140027f,0.883683f,0.446651f, --0.599598f,0.727182f,0.334197f, --0.234879f,0.924162f,0.301258f, --0.0954672f,0.951872f,0.291248f, -0.100155f,0.948228f,0.301383f, -0.352663f,0.898478f,0.261471f, -0.217902f,0.956165f,0.19562f, -0.428441f,0.89557f,0.119967f, -0.0504867f,0.972497f,-0.227379f, --0.160086f,0.98254f,-0.0948013f, -0.319131f,0.945228f,-0.0685555f, -0.64992f,0.715088f,0.257397f, -0.0361031f,0.995429f,0.0884124f, --0.2599f,0.897768f,0.355618f, --0.17567f,0.983498f,0.0432638f, -0.53944f,0.841427f,-0.0317039f, -0.60742f,0.697232f,-0.380669f, -0.609044f,0.790595f,-0.063438f, --0.195234f,0.980448f,0.0245981f, --0.224173f,0.885759f,0.406419f, -0.0964403f,0.992198f,0.0790071f, -0.380926f,0.892571f,-0.241272f, -0.532566f,0.777301f,-0.334927f, -0.58332f,0.811668f,0.0305478f, -0.122052f,0.989417f,-0.0784701f, -0.094933f,0.975516f,-0.198385f, -0.104703f,0.956209f,-0.273317f, -0.0116109f,0.989434f,0.144515f, -0.0514824f,0.974923f,0.216505f, -0.096067f,0.950842f,0.294399f, -0.00976988f,0.964716f,0.263111f, --0.0931121f,0.98126f,0.168699f, --0.0745948f,0.982842f,0.168693f, --0.083139f,0.982475f,0.166825f, --0.0763046f,0.97088f,0.22709f, --0.130809f,0.960701f,0.244832f, --0.117161f,0.974629f,0.190711f, -0.0735371f,0.976475f,0.202706f, -0.123062f,0.984428f,0.125529f, -0.0660058f,0.995943f,0.0611663f, -0.0811078f,0.98996f,0.115763f, -0.156048f,0.953727f,0.257008f, -0.12971f,0.935453f,0.32879f, --0.0928149f,0.955298f,0.280698f, --0.264252f,0.949049f,0.171686f, --0.241724f,0.966072f,0.0909662f, --0.244999f,0.96713f,0.0680795f, --0.106995f,0.982895f,0.149898f, --0.106861f,0.990227f,0.089616f, --0.133621f,0.990932f,0.0141138f, --0.0517957f,0.998024f,0.0355675f, --0.0225779f,0.998718f,0.0453005f, --0.144281f,0.986502f,-0.0774439f, --0.157036f,0.983398f,-0.0909287f, --0.161108f,0.986936f,-0.00118469f, --0.22235f,0.965394f,0.136287f, --0.250578f,0.942366f,0.221715f, --0.217658f,0.901831f,0.373264f, --0.29708f,0.848133f,0.438651f, --0.36269f,0.819581f,0.443558f, --0.534096f,0.793842f,0.290785f, --0.584404f,0.811192f,0.0209707f, --0.1404f,0.905222f,0.401075f, --0.307079f,0.89418f,0.325797f, --0.27164f,0.834087f,0.480115f, --0.322843f,0.946322f,0.0157466f, --0.301281f,0.933652f,-0.193713f, --0.127165f,0.985755f,0.11007f, -0.121812f,0.97858f,0.165962f, -0.500139f,0.864928f,0.0419482f, -0.30357f,0.892132f,-0.334582f, -0.443241f,0.85073f,-0.282481f, -0.0967978f,0.993781f,0.0550442f, --0.201565f,0.978713f,0.0386423f, -0.209591f,0.974539f,0.0796601f, -0.481917f,0.851558f,0.20641f, --0.0224044f,0.977009f,0.212016f, --0.238315f,0.88567f,0.398491f, -0.220358f,0.960844f,0.167992f, -0.601263f,0.791797f,-0.107428f, -0.618362f,0.741713f,-0.25979f, -0.284452f,0.956119f,0.0701626f, --0.201478f,0.913131f,0.3544f, --0.20526f,0.978252f,0.0298624f, -0.352634f,0.929538f,-0.107737f, -0.649062f,0.752634f,-0.110725f, -0.490387f,0.729272f,-0.477162f, -0.431974f,0.874843f,-0.219197f, -0.184608f,0.975155f,-0.122446f, -0.192786f,0.978517f,-0.0730681f, -0.240097f,0.966116f,-0.094733f, --0.255309f,0.963455f,-0.0810722f, --0.124334f,0.990531f,0.0582188f, -0.042075f,0.979967f,0.194667f, -0.0324324f,0.965776f,0.25734f, --0.0760147f,0.965606f,0.248649f, --0.138926f,0.972343f,0.187746f, --0.0932442f,0.974882f,0.202264f, --0.0380092f,0.975147f,0.218276f, --0.0242537f,0.984345f,0.174576f, --0.0724602f,0.995976f,0.0527463f, -0.0175716f,0.997526f,0.068069f, -0.191598f,0.97051f,0.146287f, -0.0888492f,0.992747f,0.0809944f, -0.0509079f,0.989914f,0.132209f, -0.0413152f,0.988953f,0.142354f, --0.00590782f,0.97647f,0.215574f, --0.0327876f,0.94937f,0.312443f, --0.0862721f,0.978712f,0.186225f, --0.179337f,0.981669f,0.0645377f, --0.255621f,0.960924f,0.106226f, --0.157413f,0.981394f,0.109943f, --0.0325878f,0.996293f,0.0796149f, --0.0627116f,0.997982f,-0.00999288f, --0.0263234f,0.995733f,-0.0884504f, -0.00359159f,0.990572f,-0.136946f, --0.0963f,0.991181f,-0.0910356f, --0.255814f,0.966717f,-0.00409974f, --0.292954f,0.950051f,0.107618f, --0.259513f,0.946888f,0.189886f, --0.274998f,0.934354f,0.226623f, --0.37248f,0.885745f,0.276974f, --0.384203f,0.849481f,0.361622f, --0.326853f,0.86434f,0.382208f, --0.213332f,0.922586f,0.321442f, --0.528611f,0.848285f,0.0313709f, --0.466119f,0.869006f,0.166018f, --0.226659f,0.921685f,0.314837f, --0.225942f,0.929604f,0.291181f, -0.262979f,0.943638f,0.200972f, --0.158823f,0.970135f,-0.183342f, --0.433654f,0.893597f,-0.115884f, -0.0458639f,0.99877f,-0.0188405f, -0.612149f,0.789064f,0.0514904f, -0.423383f,0.878106f,-0.222881f, -0.0967751f,0.930754f,-0.352606f, -0.0811144f,0.996202f,0.0316668f, --0.413686f,0.895072f,-0.166465f, -0.148131f,0.951189f,0.270735f, -0.436798f,0.864787f,0.247692f, -0.0437864f,0.959427f,0.278536f, --0.28501f,0.956226f,0.0663364f, -0.510274f,0.859616f,0.0260981f, -0.648806f,0.686419f,-0.328451f, -0.586912f,0.808674f,0.0397475f, --0.0852935f,0.966768f,0.241009f, --0.148057f,0.961052f,0.233361f, -0.164136f,0.983527f,-0.0757203f, -0.450314f,0.849987f,-0.273386f, -0.550526f,0.728504f,-0.407679f, -0.58281f,0.780161f,-0.227338f, -0.258267f,0.941325f,-0.21727f, -0.0807909f,0.98982f,-0.117172f, -0.0801488f,0.996327f,0.0301511f, -0.239863f,0.961671f,0.132871f, --0.229647f,0.969202f,0.0889415f, --0.172859f,0.981826f,0.0783421f, --0.0626565f,0.996388f,0.0573105f, --0.0572909f,0.992727f,0.105883f, --0.0279351f,0.983375f,0.179427f, --0.00285096f,0.99214f,0.125102f, --0.084025f,0.99632f,-0.0168937f, --0.0732377f,0.997041f,-0.0233556f, --0.0045065f,0.999839f,0.0173404f, -0.0203121f,0.999722f,0.0119547f, --0.0506539f,0.996487f,-0.0666886f, -0.119651f,0.992498f,0.0251293f, -0.0686084f,0.989615f,0.126312f, -0.000108814f,0.982339f,0.187109f, -0.0874025f,0.98865f,0.122196f, --0.0625717f,0.997577f,0.0304034f, --0.0486926f,0.992353f,0.113426f, -0.0140738f,0.989644f,0.142855f, --0.151919f,0.980609f,0.123804f, --0.280176f,0.959074f,0.0409668f, --0.112828f,0.992642f,-0.0439511f, -0.0530002f,0.995827f,-0.0742939f, -0.0297885f,0.985001f,-0.169959f, -0.0528437f,0.970999f,-0.233169f, --0.0380639f,0.977109f,-0.209305f, --0.249056f,0.968138f,-0.0260696f, --0.370842f,0.913812f,0.165599f, --0.310025f,0.907402f,0.283736f, --0.313659f,0.908343f,0.276641f, --0.360766f,0.88042f,0.307747f, --0.383668f,0.851108f,0.358349f, --0.392242f,0.857478f,0.332984f, --0.296931f,0.900087f,0.318865f, --0.199402f,0.936164f,0.289543f, --0.412291f,0.885214f,0.215434f, --0.62242f,0.781068f,-0.0502514f, --0.272781f,0.928261f,0.252828f, --0.317665f,0.921151f,0.224876f, -0.0813846f,0.925309f,0.370378f, -0.00278871f,0.889899f,0.45615f, --0.460626f,0.879338f,0.120782f, -0.0601251f,0.985077f,0.161272f, -0.599887f,0.787248f,0.142742f, -0.617017f,0.753279f,0.227729f, -0.13665f,0.981422f,0.134675f, -0.136502f,0.974756f,0.176687f, --0.27066f,0.954113f,-0.128105f, --0.13295f,0.980241f,-0.146465f, -0.409773f,0.909514f,-0.0697851f, -0.339811f,0.93455f,0.10557f, --0.243979f,0.943604f,-0.223798f, -0.572252f,0.820076f,0.00181093f, -0.58136f,0.813444f,0.0181706f, -0.213313f,0.927464f,0.307095f, --0.0427767f,0.853854f,0.518751f, -0.0717407f,0.97577f,0.206702f, -0.349298f,0.936925f,0.0127626f, -0.643074f,0.765767f,0.00757208f, -0.584117f,0.763349f,-0.275872f, -0.414478f,0.906497f,-0.0804466f, -0.213842f,0.975055f,-0.0594842f, --0.00469446f,0.990505f,-0.137399f, --0.0685672f,0.992236f,-0.103764f, -0.0844774f,0.996384f,-0.00904741f, --0.320391f,0.938064f,0.131853f, --0.173519f,0.96335f,0.204565f, --0.0123366f,0.973468f,0.228492f, --0.018009f,0.983892f,0.177855f, --0.10447f,0.992257f,0.0671745f, -0.0409931f,0.988078f,0.148399f, -0.0370075f,0.994865f,0.0941976f, --0.0471895f,0.997972f,-0.0427132f, --0.0371271f,0.993135f,-0.110921f, -0.0109117f,0.996203f,-0.0863686f, -0.0455917f,0.995961f,-0.0773449f, --0.0321894f,0.986545f,-0.160288f, --0.0649603f,0.996397f,0.0545189f, -0.00369488f,0.985567f,0.169244f, -0.226168f,0.962189f,0.151787f, -0.029392f,0.999567f,0.00117257f, --0.13579f,0.984206f,-0.113581f, --0.10103f,0.992288f,-0.0718192f, --0.125171f,0.991084f,0.0456533f, --0.108309f,0.993989f,0.015999f, --0.0231464f,0.995269f,-0.0943563f, -0.0270486f,0.99325f,-0.112795f, -0.141677f,0.989359f,-0.0331051f, -0.0268575f,0.994547f,-0.100767f, --0.194101f,0.980932f,0.009818f, --0.41139f,0.899763f,0.145547f, --0.482013f,0.8562f,0.185973f, --0.415606f,0.872343f,0.257468f, --0.291757f,0.884021f,0.365218f, --0.316561f,0.886381f,0.337814f, --0.406f,0.884827f,0.22857f, --0.363525f,0.905831f,0.217534f, --0.301242f,0.93366f,0.193734f, --0.208193f,0.941974f,0.263325f, --0.164184f,0.932027f,0.323063f, --0.4694f,0.88027f,-0.0691917f, --0.525104f,0.840943f,-0.130688f, --0.256903f,0.950739f,0.17348f, --0.180022f,0.968548f,0.171775f, -0.0734506f,0.860739f,0.50372f, --0.205317f,0.895889f,0.393991f, -0.0472127f,0.984089f,0.171289f, -0.492639f,0.869295f,-0.040419f, -0.615313f,0.776504f,0.135761f, -0.240143f,0.940103f,0.241946f, -0.0961855f,0.982412f,0.160044f, -0.107308f,0.976554f,0.186622f, --0.0192621f,0.988216f,-0.151846f, -0.243819f,0.934285f,-0.260122f, -0.363158f,0.92047f,-0.144401f, --0.0181857f,0.911833f,-0.410158f, -0.13216f,0.935755f,-0.326948f, -0.234069f,0.876493f,0.42068f, --0.0429998f,0.864233f,0.501251f, -0.30178f,0.838678f,0.453374f, -0.334916f,0.905993f,0.258858f, -0.486799f,0.865003f,0.121641f, -0.551114f,0.813232f,-0.186886f, -0.639118f,0.75121f,0.164956f, -0.383938f,0.890692f,0.243432f, -0.354878f,0.921145f,0.159855f, -0.162961f,0.98584f,-0.0395363f, --0.0637937f,0.974986f,-0.212914f, --0.0365262f,0.968846f,-0.244954f, --0.281965f,0.951785f,0.120834f, --0.274882f,0.955225f,0.109473f, --0.104135f,0.948711f,0.298502f, -0.0826411f,0.912269f,0.401168f, -0.0342531f,0.97031f,0.239425f, --0.0365634f,0.991589f,0.124154f, -0.134024f,0.975461f,0.174679f, -0.109589f,0.99345f,0.032348f, -0.0453955f,0.994687f,-0.0923934f, --0.0149079f,0.988982f,-0.147281f, -0.0512217f,0.992549f,-0.110554f, -0.0167819f,0.988638f,-0.149377f, --0.222271f,0.949144f,-0.222982f, --0.0921327f,0.987637f,-0.126823f, -0.189567f,0.98184f,-0.00744372f, -0.205171f,0.976356f,0.0680753f, --0.00982996f,0.993812f,-0.110639f, --0.0883427f,0.978311f,-0.18736f, --0.198236f,0.955921f,-0.216604f, --0.180283f,0.972159f,-0.149685f, -0.0029493f,0.99947f,-0.0324137f, --0.0433514f,0.998534f,-0.0324142f, -0.0405175f,0.99421f,0.0995223f, -0.00286263f,0.981263f,0.19265f, --0.296663f,0.921382f,0.251091f, --0.412123f,0.867858f,0.277446f, --0.439996f,0.871969f,0.214648f, --0.457669f,0.875232f,0.156552f, --0.384822f,0.899193f,0.208242f, --0.276213f,0.916653f,0.288882f, --0.314226f,0.91283f,0.260774f, --0.345662f,0.91535f,0.206522f, --0.311859f,0.934366f,0.17235f, --0.323293f,0.931681f,0.165688f, --0.218081f,0.943645f,0.248946f, -0.00414662f,0.967721f,0.251991f, --0.350612f,0.910773f,-0.218092f, --0.590427f,0.768592f,-0.246296f, --0.263693f,0.937904f,0.225393f, --0.149885f,0.945975f,0.287518f, --0.0723712f,0.947676f,0.310922f, -0.303995f,0.902765f,0.304306f, -0.615729f,0.768916f,0.172179f, -0.376573f,0.870472f,0.316971f, -0.258103f,0.862435f,0.435417f, -0.208037f,0.965523f,0.156476f, -0.041711f,0.997309f,0.0602974f, -0.0896451f,0.984172f,0.152868f, -0.200861f,0.950569f,0.236798f, -0.331115f,0.861074f,0.385894f, -0.343908f,0.839357f,0.420961f, --0.162885f,0.985003f,0.0568977f, --0.0608521f,0.991774f,0.112611f, -0.279417f,0.937386f,0.207929f, -0.438178f,0.898268f,0.033396f, -0.516016f,0.854846f,-0.0544561f, -0.550254f,0.781096f,-0.295143f, -0.499018f,0.830127f,-0.248738f, -0.421585f,0.905472f,0.0488414f, -0.355515f,0.918443f,0.173411f, -0.416018f,0.882036f,0.221226f, -0.346021f,0.922667f,0.170161f, -0.0862406f,0.994799f,-0.0542001f, -0.0251294f,0.989963f,-0.139071f, --0.167311f,0.982002f,0.0876306f, --0.296088f,0.953872f,0.0496014f, --0.309819f,0.944071f,0.112878f, -0.0107419f,0.974593f,0.223724f, -0.235566f,0.938548f,0.252263f, -0.0528759f,0.995406f,0.0798236f, -0.106055f,0.992977f,0.0524375f, -0.227694f,0.967451f,0.110427f, -0.15013f,0.988604f,0.0110517f, -0.0292872f,0.989448f,-0.141897f, -0.0113647f,0.978518f,-0.205848f, -0.0966514f,0.981912f,-0.162811f, --0.0834695f,0.969158f,-0.231875f, --0.173766f,0.92349f,-0.34201f, -0.0289323f,0.967596f,-0.250839f, -0.166759f,0.980973f,-0.0994165f, -0.0796755f,0.992423f,-0.0935347f, --0.0109031f,0.993494f,-0.113363f, --0.181202f,0.957527f,-0.224295f, --0.231371f,0.948894f,-0.214636f, --0.0963906f,0.978232f,-0.183771f, --0.0964169f,0.992283f,-0.0779687f, --0.114591f,0.992373f,0.045429f, --0.0476997f,0.984744f,0.167343f, --0.353531f,0.929974f,0.100818f, --0.42903f,0.892447f,0.139543f, --0.399459f,0.902474f,0.161164f, --0.44275f,0.883954f,0.150326f, --0.416721f,0.891582f,0.177271f, --0.364313f,0.907101f,0.210818f, --0.329954f,0.890729f,0.312622f, --0.308128f,0.891277f,0.33269f, --0.248313f,0.912421f,0.325314f, --0.264673f,0.92449f,0.274348f, --0.221501f,0.958108f,0.181568f, --0.00722143f,0.985032f,0.17222f, -0.0811419f,0.973825f,0.212324f, --0.519461f,0.82914f,-0.206608f, --0.561212f,0.816969f,-0.132674f, --0.10198f,0.978452f,0.179533f, --0.0294922f,0.994047f,0.104885f, -0.212965f,0.975972f,0.0461033f, -0.39072f,0.902699f,0.180202f, -0.284816f,0.877828f,0.385096f, -0.371584f,0.726424f,0.578129f, -0.415725f,0.734903f,0.535809f, -0.0647658f,0.913533f,0.401575f, -0.0316961f,0.895539f,0.443852f, --0.0215836f,0.930013f,0.366891f, -0.0389377f,0.900411f,0.433293f, -0.182398f,0.888094f,0.421923f, -0.319795f,0.864372f,0.388061f, -0.179682f,0.983355f,0.0269752f, -0.358016f,0.913314f,-0.19412f, -0.445422f,0.82688f,-0.343321f, -0.564533f,0.736553f,-0.372547f, -0.511683f,0.792162f,-0.332656f, -0.362215f,0.931906f,0.0187495f, -0.332114f,0.925718f,0.180958f, -0.376936f,0.924108f,0.0628019f, -0.34207f,0.939661f,0.00505146f, -0.432513f,0.89733f,0.0879243f, -0.250624f,0.96783f,0.022189f, -0.113333f,0.993448f,0.0146943f, --0.330108f,0.943938f,0.00323688f, --0.32108f,0.944743f,0.0660874f, --0.312445f,0.949733f,0.0196284f, --0.0425447f,0.998988f,-0.0145795f, -0.234895f,0.971633f,0.0274452f, -0.205978f,0.978297f,0.0225396f, -0.0556133f,0.99289f,-0.10525f, -0.149272f,0.988455f,-0.0259672f, -0.25486f,0.966188f,0.0390683f, -0.206371f,0.977859f,-0.0346908f, -0.0798975f,0.983688f,-0.161166f, -0.0387149f,0.980238f,-0.193996f, --0.0261652f,0.985317f,-0.168719f, --0.115457f,0.963019f,-0.243441f, --0.0914394f,0.962229f,-0.256427f, -0.0382488f,0.992063f,-0.119784f, -0.0800161f,0.996698f,-0.0137989f, -0.0187475f,0.998138f,-0.0580508f, --0.073595f,0.994051f,-0.0802936f, --0.224165f,0.957926f,-0.179241f, --0.16346f,0.967941f,-0.190711f, --0.19173f,0.978244f,-0.0792358f, --0.275576f,0.961029f,-0.0219235f, --0.0407932f,0.98802f,0.148838f, --0.278629f,0.956556f,0.085827f, --0.465684f,0.878931f,0.103047f, --0.438529f,0.89146f,0.11398f, --0.455089f,0.880964f,0.129601f, --0.457802f,0.879895f,0.127287f, --0.406331f,0.89051f,0.204664f, --0.386395f,0.891456f,0.236654f, --0.321818f,0.921226f,0.218577f, --0.271011f,0.935727f,0.22576f, --0.198383f,0.944022f,0.263564f, --0.105727f,0.975806f,0.191373f, --0.0832756f,0.987941f,0.130528f, -0.0931562f,0.956641f,0.27597f, --0.216408f,0.96162f,0.168686f, --0.648586f,0.688743f,-0.323988f, --0.276841f,0.843915f,-0.459527f, --0.060911f,0.935148f,-0.348981f, -0.243821f,0.963831f,-0.107611f, -0.35478f,0.93349f,-0.0522288f, -0.124674f,0.987025f,-0.101179f, -0.106145f,0.993646f,0.0374371f, -0.264307f,0.911176f,0.316069f, -0.180037f,0.821936f,0.540378f, -0.0976487f,0.839888f,0.533903f, -0.242869f,0.82432f,0.511381f, -0.296956f,0.900742f,0.316987f, -0.37446f,0.92343f,0.0840066f, -0.38614f,0.913414f,-0.128727f, -0.497691f,0.838063f,-0.223505f, -0.399217f,0.778523f,-0.484281f, -0.607215f,0.684189f,-0.403949f, -0.455879f,0.835157f,-0.307715f, -0.317815f,0.943806f,-0.0906903f, -0.166917f,0.983806f,0.0653043f, -0.277188f,0.953387f,0.119249f, -0.491287f,0.85011f,0.189606f, -0.3858f,0.919271f,0.0780984f, -0.390109f,0.91635f,0.0900968f, -0.247947f,0.964668f,0.0890966f, -0.0188396f,0.999506f,0.0251451f, --0.249227f,0.949063f,0.192782f, --0.24873f,0.963608f,0.0979465f, --0.225537f,0.968208f,-0.108193f, --0.0586638f,0.984304f,-0.166448f, -0.193919f,0.980395f,-0.0349386f, -0.232927f,0.972341f,0.0172453f, -0.165218f,0.985248f,-0.0445953f, -0.10666f,0.982482f,-0.152814f, -0.176402f,0.976328f,-0.125164f, -0.217875f,0.975941f,-0.00837002f, -0.138055f,0.990338f,0.0130638f, -0.0914598f,0.995289f,-0.0321788f, --0.014672f,0.992233f,-0.123523f, --0.0701479f,0.990985f,-0.114142f, --0.0940689f,0.987781f,-0.124254f, --0.152176f,0.977744f,-0.144426f, -0.043676f,0.996991f,0.0640382f, -0.0457416f,0.996307f,0.07266f, --0.0198973f,0.997072f,0.0738311f, --0.119455f,0.990174f,-0.0727032f, --0.224875f,0.962572f,-0.151282f, --0.250045f,0.966903f,-0.0507448f, --0.319974f,0.944248f,-0.0775328f, --0.16005f,0.987102f,-0.00365841f, --0.307005f,0.947659f,0.0876954f, --0.490256f,0.846833f,0.206209f, --0.400386f,0.879926f,0.255778f, --0.427515f,0.880624f,0.204282f, --0.477897f,0.856347f,0.195663f, --0.43217f,0.864768f,0.255745f, --0.342474f,0.92438f,0.16803f, --0.284468f,0.956998f,0.0568588f, --0.290121f,0.956708f,0.023234f, --0.249156f,0.966838f,0.0560771f, --0.0655515f,0.986836f,0.147842f, --0.100568f,0.984251f,0.145384f, --0.0191778f,0.985445f,0.168911f, --0.0443403f,0.97787f,0.204462f, --0.28653f,0.957033f,-0.044587f, --0.127864f,0.901634f,-0.413166f, --0.0930849f,0.861283f,-0.499526f, --0.10032f,0.791759f,-0.60254f, -0.277857f,0.863349f,-0.421218f, -0.0733471f,0.944573f,-0.320003f, -0.0656198f,0.995434f,-0.0693225f, -0.0994234f,0.993172f,-0.0610351f, -0.0758799f,0.991718f,0.103618f, -0.0755546f,0.978148f,0.193698f, -0.318521f,0.931105f,0.177731f, -0.532035f,0.846717f,0.00302226f, -0.479952f,0.801468f,-0.356785f, -0.444207f,0.753204f,-0.485143f, -0.599635f,0.661874f,-0.449845f, -0.467802f,0.782561f,-0.410805f, -0.194572f,0.899472f,-0.391269f, -0.334078f,0.938895f,-0.0828733f, -0.236858f,0.971355f,0.0191963f, -0.177255f,0.983392f,0.0389945f, -0.22691f,0.973661f,-0.0222777f, -0.408661f,0.912593f,0.013075f, -0.394434f,0.908333f,0.139114f, -0.34039f,0.913901f,0.221176f, -0.340162f,0.904445f,0.257428f, -0.21637f,0.954077f,0.207173f, --0.190356f,0.960699f,0.202044f, --0.0745122f,0.978557f,0.192026f, --0.0103556f,0.997337f,0.0721953f, --0.102208f,0.994222f,-0.0328074f, -0.0538732f,0.998534f,0.00527007f, -0.220064f,0.97523f,-0.0223306f, -0.22889f,0.972208f,-0.0492086f, -0.203387f,0.976813f,-0.0668524f, -0.112155f,0.987122f,-0.114071f, -0.137033f,0.989998f,-0.0335468f, -0.125928f,0.990544f,-0.0544465f, -0.164164f,0.983484f,-0.0762248f, -0.056178f,0.987899f,-0.14457f, --0.125491f,0.977887f,-0.167299f, --0.0763702f,0.993552f,-0.0837951f, --0.140516f,0.986451f,-0.0846751f, --0.138825f,0.988035f,-0.0671838f, -0.0272382f,0.998662f,0.0439583f, -0.051406f,0.998673f,0.00322772f, -0.0131796f,0.996364f,-0.0841692f, --0.197723f,0.973335f,-0.116299f, --0.315939f,0.94482f,-0.0865842f, --0.273936f,0.961179f,-0.0330844f, --0.278588f,0.957771f,-0.0711653f, --0.371629f,0.922753f,0.102078f, --0.589295f,0.797687f,0.128167f, --0.394808f,0.893641f,0.213383f, --0.419749f,0.89327f,0.160869f, --0.503386f,0.848953f,0.160878f, --0.392151f,0.910681f,0.129912f, --0.194389f,0.97789f,0.0771005f, --0.210697f,0.97754f,0.00473511f, --0.261758f,0.965059f,0.0120029f, --0.306606f,0.951531f,-0.0240962f, --0.191391f,0.98062f,0.0418887f, --0.0805366f,0.9875f,0.135492f, --0.0197042f,0.996843f,0.0769187f, --0.0102082f,0.996001f,0.0887568f, --0.106967f,0.993499f,0.0389638f, --0.0299932f,0.997488f,-0.0641764f, -0.166392f,0.98551f,-0.0329295f, -0.122834f,0.919366f,-0.373736f, -0.0989442f,0.860803f,-0.499228f, --0.16483f,0.786842f,-0.594736f, --0.139994f,0.854441f,-0.500331f, -0.037386f,0.884593f,-0.464864f, --0.0340706f,0.910599f,-0.411885f, -0.0643546f,0.934103f,-0.351155f, -0.330549f,0.864687f,-0.378225f, -0.61879f,0.706641f,-0.343158f, -0.664468f,0.668218f,-0.334614f, -0.535603f,0.737564f,-0.411252f, -0.392926f,0.807647f,-0.439677f, -0.299634f,0.936543f,-0.181953f, -0.20385f,0.978529f,-0.030423f, -0.255219f,0.962099f,-0.0960637f, -0.218057f,0.97044f,-0.103423f, -0.152183f,0.981776f,-0.113823f, -0.287579f,0.953452f,-0.0907011f, -0.354102f,0.933846f,-0.0504376f, -0.271766f,0.955964f,0.110796f, -0.254566f,0.942907f,0.214762f, -0.330431f,0.909031f,0.253925f, -0.276649f,0.934017f,0.226003f, --0.276078f,0.960525f,0.0342386f, --0.126608f,0.988039f,0.088024f, --0.0433883f,0.982429f,0.181523f, --0.0351658f,0.95918f,0.280603f, -0.130316f,0.978179f,0.161815f, -0.34012f,0.939563f,0.0392436f, -0.225269f,0.971719f,-0.0708295f, -0.186144f,0.981343f,-0.0481244f, -0.117145f,0.991402f,-0.0582961f, -0.122374f,0.988553f,-0.0882497f, -0.217284f,0.968092f,-0.124844f, -0.168939f,0.967628f,-0.1875f, -0.0966952f,0.983818f,-0.150838f, --0.108071f,0.971789f,-0.209635f, --0.167419f,0.956466f,-0.239047f, --0.15925f,0.972646f,-0.169115f, --0.169755f,0.972705f,-0.158205f, -0.0352685f,0.991682f,-0.123784f, -0.0984439f,0.980655f,-0.169186f, -0.0318934f,0.989724f,-0.139387f, --0.246309f,0.963763f,-0.102435f, --0.355567f,0.934631f,-0.00599911f, --0.265814f,0.963735f,-0.0236194f, --0.351588f,0.935043f,-0.0456126f, --0.494494f,0.858936f,0.133056f, --0.559402f,0.824266f,0.0874941f, --0.405326f,0.914016f,0.0169127f, --0.376559f,0.926338f,0.010028f, --0.448864f,0.890609f,-0.0730511f, --0.3487f,0.913403f,-0.210007f, --0.225518f,0.948441f,-0.222713f, --0.278172f,0.957801f,-0.0723737f, --0.296428f,0.947861f,0.117f, --0.260326f,0.954501f,0.14546f, --0.208806f,0.976306f,0.0568064f, --0.0937503f,0.995595f,-0.00141652f, -0.0211825f,0.998587f,-0.0487327f, --0.0203898f,0.998016f,-0.0595622f, --0.117256f,0.992273f,-0.0405676f, -0.0346735f,0.999272f,0.0158994f, -0.165596f,0.985653f,-0.0326431f, -0.277068f,0.959929f,-0.0420538f, -0.211278f,0.971116f,-0.110882f, -0.138826f,0.972226f,-0.188423f, -0.0186164f,0.920791f,-0.389612f, -0.00693313f,0.891348f,-0.453267f, --0.0471378f,0.869656f,-0.491403f, -0.135484f,0.84445f,-0.518217f, -0.351566f,0.784405f,-0.510988f, -0.399468f,0.772299f,-0.493943f, -0.574953f,0.790421f,-0.211338f, -0.577809f,0.813449f,-0.0666111f, -0.451377f,0.892327f,0.00336233f, -0.237932f,0.970883f,-0.0278435f, -0.170635f,0.975266f,-0.140498f, -0.305065f,0.94416f,-0.124487f, -0.219111f,0.958291f,-0.183492f, -0.160317f,0.981326f,-0.106286f, -0.222178f,0.974771f,-0.021419f, -0.23168f,0.971792f,0.0441002f, -0.140177f,0.984507f,0.105338f, -0.184383f,0.966339f,0.179422f, -0.307531f,0.911743f,0.272303f, -0.342083f,0.879118f,0.331859f, --0.245266f,0.968917f,0.0323163f, --0.176433f,0.984311f,-0.00156667f, --0.164847f,0.983548f,0.0738887f, --0.0271087f,0.959686f,0.279762f, -0.210185f,0.960158f,0.18417f, -0.386525f,0.917795f,0.0908302f, -0.288585f,0.956426f,0.04436f, -0.157424f,0.986731f,-0.0397454f, -0.194229f,0.980956f,0.000793421f, -0.143953f,0.978f,-0.150974f, -0.243865f,0.955091f,-0.168319f, -0.151307f,0.968911f,-0.195749f, -0.0861511f,0.987302f,-0.133462f, --0.0343302f,0.988258f,-0.148887f, --0.149683f,0.954065f,-0.259529f, --0.180054f,0.943807f,-0.277143f, --0.182632f,0.946912f,-0.26458f, -0.0250152f,0.97257f,-0.23126f, -0.0655433f,0.96826f,-0.241197f, -0.00940225f,0.990707f,-0.135685f, --0.313822f,0.94168f,-0.121471f, --0.325919f,0.940955f,0.0915474f, --0.245857f,0.968763f,-0.0324418f, --0.38384f,0.920444f,-0.0738245f, --0.542624f,0.834584f,0.0950211f, --0.496894f,0.865347f,0.0653522f, --0.40471f,0.910862f,-0.0808731f, --0.336326f,0.940002f,-0.0572751f, --0.384947f,0.90765f,-0.167296f, --0.26052f,0.919475f,-0.294439f, --0.278076f,0.879766f,-0.385599f, --0.415096f,0.880667f,-0.2283f, --0.411169f,0.907675f,0.0840562f, --0.22106f,0.940981f,0.256296f, --0.105371f,0.978797f,0.175653f, --0.0100537f,0.999811f,0.0166273f, -0.0459065f,0.991326f,-0.123151f, --0.0151969f,0.991011f,-0.132912f, --0.164041f,0.976761f,-0.137947f, -0.00793599f,0.998771f,-0.0489272f, -0.178958f,0.98335f,-0.031577f, -0.314466f,0.949045f,-0.0206086f, -0.240757f,0.963062f,-0.120617f, -0.126531f,0.982046f,-0.139911f, -0.0695074f,0.9956f,-0.062839f, -0.0427419f,0.998852f,-0.02164f, --0.0292495f,0.993565f,-0.109419f, -0.176081f,0.974549f,-0.138744f, -0.405406f,0.900659f,-0.156393f, -0.48202f,0.865956f,-0.133334f, -0.477566f,0.852664f,-0.211881f, -0.526274f,0.839922f,-0.132537f, -0.390331f,0.920621f,-0.0098857f, -0.349443f,0.931118f,0.104442f, -0.205374f,0.96487f,-0.163851f, -0.359411f,0.921384f,-0.147904f, -0.161592f,0.938137f,-0.306246f, -0.0124614f,0.982178f,-0.187542f, -0.143914f,0.986786f,0.0744463f, -0.270333f,0.949018f,0.162126f, -0.132f,0.991194f,0.0105184f, -0.131712f,0.991267f,0.00644011f, -0.199003f,0.974024f,0.108048f, -0.274163f,0.928953f,0.248757f, -}; - -btScalar Landscape01Tex[] = { -0.507813f,0.0078125f, -0.507813f,0.0f, -0.515625f,0.0078125f, -0.515625f,0.0f, -0.523438f,0.0078125f, -0.523438f,0.0f, -0.53125f,0.0078125f, -0.53125f,0.0f, -0.539063f,0.0078125f, -0.539063f,0.0f, -0.546875f,0.0078125f, -0.546875f,0.0f, -0.554688f,0.0078125f, -0.554688f,0.0f, -0.5625f,0.0078125f, -0.5625f,0.0f, -0.570313f,0.0078125f, -0.570313f,0.0f, -0.578125f,0.0078125f, -0.578125f,0.0f, -0.585938f,0.0078125f, -0.585938f,0.0f, -0.59375f,0.0078125f, -0.59375f,0.0f, -0.601563f,0.0078125f, -0.601563f,0.0f, -0.609375f,0.0078125f, -0.609375f,0.0f, -0.617188f,0.0078125f, -0.617188f,0.0f, -0.625f,0.0078125f, -0.625f,0.0f, -0.632813f,0.0078125f, -0.632813f,0.0f, -0.640625f,0.0078125f, -0.640625f,0.0f, -0.648438f,0.0078125f, -0.648438f,0.0f, -0.65625f,0.0078125f, -0.65625f,0.0f, -0.664063f,0.0078125f, -0.664063f,0.0f, -0.671875f,0.0078125f, -0.671875f,0.0f, -0.679688f,0.0078125f, -0.679688f,0.0f, -0.6875f,0.0078125f, -0.6875f,0.0f, -0.695313f,0.0078125f, -0.695313f,0.0f, -0.703125f,0.0078125f, -0.703125f,0.0f, -0.710938f,0.0078125f, -0.710938f,0.0f, -0.71875f,0.0078125f, -0.71875f,0.0f, -0.726563f,0.0078125f, -0.726563f,0.0f, -0.734375f,0.0078125f, -0.734375f,0.0f, -0.742188f,0.0078125f, -0.742188f,0.0f, -0.75f,0.0078125f, -0.75f,0.0f, -0.757813f,0.0078125f, -0.757813f,0.0f, -0.765625f,0.0078125f, -0.765625f,0.0f, -0.773438f,0.0078125f, -0.773438f,0.0f, -0.78125f,0.0078125f, -0.78125f,0.0f, -0.789063f,0.0078125f, -0.789063f,0.0f, -0.796875f,0.0078125f, -0.796875f,0.0f, -0.804688f,0.0078125f, -0.804688f,0.0f, -0.8125f,0.0078125f, -0.8125f,0.0f, -0.820313f,0.0078125f, -0.820313f,0.0f, -0.828125f,0.0078125f, -0.828125f,0.0f, -0.835938f,0.0078125f, -0.835938f,0.0f, -0.84375f,0.0078125f, -0.84375f,0.0f, -0.851563f,0.0078125f, -0.851563f,0.0f, -0.859375f,0.0078125f, -0.859375f,0.0f, -0.867188f,0.0078125f, -0.867188f,0.0f, -0.875f,0.0078125f, -0.875f,0.0f, -0.882813f,0.0078125f, -0.882813f,0.0f, -0.890625f,0.0078125f, -0.890625f,0.0f, -0.898438f,0.0078125f, -0.898438f,0.0f, -0.90625f,0.0078125f, -0.90625f,0.0f, -0.914063f,0.0078125f, -0.914063f,0.0f, -0.921875f,0.0078125f, -0.921875f,0.0f, -0.929688f,0.0078125f, -0.929688f,0.0f, -0.9375f,0.0078125f, -0.9375f,0.0f, -0.945313f,0.0078125f, -0.945313f,0.0f, -0.953125f,0.0078125f, -0.953125f,0.0f, -0.960938f,0.0078125f, -0.960938f,0.0f, -0.96875f,0.0078125f, -0.96875f,0.0f, -0.976563f,0.0078125f, -0.976563f,0.0f, -0.984375f,0.0078125f, -0.984375f,0.0f, -0.992188f,0.0078125f, -0.992188f,0.0f, -1.0f,0.0078125f, -1.0f,0.0f, -0.507813f,0.015625f, -0.515625f,0.015625f, -0.523438f,0.015625f, -0.53125f,0.015625f, -0.539063f,0.015625f, -0.546875f,0.015625f, -0.554688f,0.015625f, -0.5625f,0.015625f, -0.570313f,0.015625f, -0.578125f,0.015625f, -0.585938f,0.015625f, -0.59375f,0.015625f, -0.601563f,0.015625f, -0.609375f,0.015625f, -0.617188f,0.015625f, -0.625f,0.015625f, -0.632813f,0.015625f, -0.640625f,0.015625f, -0.648438f,0.015625f, -0.65625f,0.015625f, -0.664063f,0.015625f, -0.671875f,0.015625f, -0.679688f,0.015625f, -0.6875f,0.015625f, -0.695313f,0.015625f, -0.703125f,0.015625f, -0.710938f,0.015625f, -0.71875f,0.015625f, -0.726563f,0.015625f, -0.734375f,0.015625f, -0.742188f,0.015625f, -0.75f,0.015625f, -0.757813f,0.015625f, -0.765625f,0.015625f, -0.773438f,0.015625f, -0.78125f,0.015625f, -0.789063f,0.015625f, -0.796875f,0.015625f, -0.804688f,0.015625f, -0.8125f,0.015625f, -0.820313f,0.015625f, -0.828125f,0.015625f, -0.835938f,0.015625f, -0.84375f,0.015625f, -0.851563f,0.015625f, -0.859375f,0.015625f, -0.867188f,0.015625f, -0.875f,0.015625f, -0.882813f,0.015625f, -0.890625f,0.015625f, -0.898438f,0.015625f, -0.90625f,0.015625f, -0.914063f,0.015625f, -0.921875f,0.015625f, -0.929688f,0.015625f, -0.9375f,0.015625f, -0.945313f,0.015625f, -0.953125f,0.015625f, -0.960938f,0.015625f, -0.96875f,0.015625f, -0.976563f,0.015625f, -0.984375f,0.015625f, -0.992188f,0.015625f, -1.0f,0.015625f, -0.507813f,0.0234375f, -0.515625f,0.0234375f, -0.523438f,0.0234375f, -0.53125f,0.0234375f, -0.539063f,0.0234375f, -0.546875f,0.0234375f, -0.554688f,0.0234375f, -0.5625f,0.0234375f, -0.570313f,0.0234375f, -0.578125f,0.0234375f, -0.585938f,0.0234375f, -0.59375f,0.0234375f, -0.601563f,0.0234375f, -0.609375f,0.0234375f, -0.617188f,0.0234375f, -0.625f,0.0234375f, -0.632813f,0.0234375f, -0.640625f,0.0234375f, -0.648438f,0.0234375f, -0.65625f,0.0234375f, -0.664063f,0.0234375f, -0.671875f,0.0234375f, -0.679688f,0.0234375f, -0.6875f,0.0234375f, -0.695313f,0.0234375f, -0.703125f,0.0234375f, -0.710938f,0.0234375f, -0.71875f,0.0234375f, -0.726563f,0.0234375f, -0.734375f,0.0234375f, -0.742188f,0.0234375f, -0.75f,0.0234375f, -0.757813f,0.0234375f, -0.765625f,0.0234375f, -0.773438f,0.0234375f, -0.78125f,0.0234375f, -0.789063f,0.0234375f, -0.796875f,0.0234375f, -0.804688f,0.0234375f, -0.8125f,0.0234375f, -0.820313f,0.0234375f, -0.828125f,0.0234375f, -0.835938f,0.0234375f, -0.84375f,0.0234375f, -0.851563f,0.0234375f, -0.859375f,0.0234375f, -0.867188f,0.0234375f, -0.875f,0.0234375f, -0.882813f,0.0234375f, -0.890625f,0.0234375f, -0.898438f,0.0234375f, -0.90625f,0.0234375f, -0.914063f,0.0234375f, -0.921875f,0.0234375f, -0.929688f,0.0234375f, -0.9375f,0.0234375f, -0.945313f,0.0234375f, -0.953125f,0.0234375f, -0.960938f,0.0234375f, -0.96875f,0.0234375f, -0.976563f,0.0234375f, -0.984375f,0.0234375f, -0.992188f,0.0234375f, -1.0f,0.0234375f, -0.507813f,0.03125f, -0.515625f,0.03125f, -0.523438f,0.03125f, -0.53125f,0.03125f, -0.539063f,0.03125f, -0.546875f,0.03125f, -0.554688f,0.03125f, -0.5625f,0.03125f, -0.570313f,0.03125f, -0.578125f,0.03125f, -0.585938f,0.03125f, -0.59375f,0.03125f, -0.601563f,0.03125f, -0.609375f,0.03125f, -0.617188f,0.03125f, -0.625f,0.03125f, -0.632813f,0.03125f, -0.640625f,0.03125f, -0.648438f,0.03125f, -0.65625f,0.03125f, -0.664063f,0.03125f, -0.671875f,0.03125f, -0.679688f,0.03125f, -0.6875f,0.03125f, -0.695313f,0.03125f, -0.703125f,0.03125f, -0.710938f,0.03125f, -0.71875f,0.03125f, -0.726563f,0.03125f, -0.734375f,0.03125f, -0.742188f,0.03125f, -0.75f,0.03125f, -0.757813f,0.03125f, -0.765625f,0.03125f, -0.773438f,0.03125f, -0.78125f,0.03125f, -0.789063f,0.03125f, -0.796875f,0.03125f, -0.804688f,0.03125f, -0.8125f,0.03125f, -0.820313f,0.03125f, -0.828125f,0.03125f, -0.835938f,0.03125f, -0.84375f,0.03125f, -0.851563f,0.03125f, -0.859375f,0.03125f, -0.867188f,0.03125f, -0.875f,0.03125f, -0.882813f,0.03125f, -0.890625f,0.03125f, -0.898438f,0.03125f, -0.90625f,0.03125f, -0.914063f,0.03125f, -0.921875f,0.03125f, -0.929688f,0.03125f, -0.9375f,0.03125f, -0.945313f,0.03125f, -0.953125f,0.03125f, -0.960938f,0.03125f, -0.96875f,0.03125f, -0.976563f,0.03125f, -0.984375f,0.03125f, -0.992188f,0.03125f, -1.0f,0.03125f, -0.507813f,0.0390625f, -0.515625f,0.0390625f, -0.523438f,0.0390625f, -0.53125f,0.0390625f, -0.539063f,0.0390625f, -0.546875f,0.0390625f, -0.554688f,0.0390625f, -0.5625f,0.0390625f, -0.570313f,0.0390625f, -0.578125f,0.0390625f, -0.585938f,0.0390625f, -0.59375f,0.0390625f, -0.601563f,0.0390625f, -0.609375f,0.0390625f, -0.617188f,0.0390625f, -0.625f,0.0390625f, -0.632813f,0.0390625f, -0.640625f,0.0390625f, -0.648438f,0.0390625f, -0.65625f,0.0390625f, -0.664063f,0.0390625f, -0.671875f,0.0390625f, -0.679688f,0.0390625f, -0.6875f,0.0390625f, -0.695313f,0.0390625f, -0.703125f,0.0390625f, -0.710938f,0.0390625f, -0.71875f,0.0390625f, -0.726563f,0.0390625f, -0.734375f,0.0390625f, -0.742188f,0.0390625f, -0.75f,0.0390625f, -0.757813f,0.0390625f, -0.765625f,0.0390625f, -0.773438f,0.0390625f, -0.78125f,0.0390625f, -0.789063f,0.0390625f, -0.796875f,0.0390625f, -0.804688f,0.0390625f, -0.8125f,0.0390625f, -0.820313f,0.0390625f, -0.828125f,0.0390625f, -0.835938f,0.0390625f, -0.84375f,0.0390625f, -0.851563f,0.0390625f, -0.859375f,0.0390625f, -0.867188f,0.0390625f, -0.875f,0.0390625f, -0.882813f,0.0390625f, -0.890625f,0.0390625f, -0.898438f,0.0390625f, -0.90625f,0.0390625f, -0.914063f,0.0390625f, -0.921875f,0.0390625f, -0.929688f,0.0390625f, -0.9375f,0.0390625f, -0.945313f,0.0390625f, -0.953125f,0.0390625f, -0.960938f,0.0390625f, -0.96875f,0.0390625f, -0.976563f,0.0390625f, -0.984375f,0.0390625f, -0.992188f,0.0390625f, -1.0f,0.0390625f, -0.507813f,0.046875f, -0.515625f,0.046875f, -0.523438f,0.046875f, -0.53125f,0.046875f, -0.539063f,0.046875f, -0.546875f,0.046875f, -0.554688f,0.046875f, -0.5625f,0.046875f, -0.570313f,0.046875f, -0.578125f,0.046875f, -0.585938f,0.046875f, -0.59375f,0.046875f, -0.601563f,0.046875f, -0.609375f,0.046875f, -0.617188f,0.046875f, -0.625f,0.046875f, -0.632813f,0.046875f, -0.640625f,0.046875f, -0.648438f,0.046875f, -0.65625f,0.046875f, -0.664063f,0.046875f, -0.671875f,0.046875f, -0.679688f,0.046875f, -0.6875f,0.046875f, -0.695313f,0.046875f, -0.703125f,0.046875f, -0.710938f,0.046875f, -0.71875f,0.046875f, -0.726563f,0.046875f, -0.734375f,0.046875f, -0.742188f,0.046875f, -0.75f,0.046875f, -0.757813f,0.046875f, -0.765625f,0.046875f, -0.773438f,0.046875f, -0.78125f,0.046875f, -0.789063f,0.046875f, -0.796875f,0.046875f, -0.804688f,0.046875f, -0.8125f,0.046875f, -0.820313f,0.046875f, -0.828125f,0.046875f, -0.835938f,0.046875f, -0.84375f,0.046875f, -0.851563f,0.046875f, -0.859375f,0.046875f, -0.867188f,0.046875f, -0.875f,0.046875f, -0.882813f,0.046875f, -0.890625f,0.046875f, -0.898438f,0.046875f, -0.90625f,0.046875f, -0.914063f,0.046875f, -0.921875f,0.046875f, -0.929688f,0.046875f, -0.9375f,0.046875f, -0.945313f,0.046875f, -0.953125f,0.046875f, -0.960938f,0.046875f, -0.96875f,0.046875f, -0.976563f,0.046875f, -0.984375f,0.046875f, -0.992188f,0.046875f, -1.0f,0.046875f, -0.507813f,0.0546875f, -0.515625f,0.0546875f, -0.523438f,0.0546875f, -0.53125f,0.0546875f, -0.539063f,0.0546875f, -0.546875f,0.0546875f, -0.554688f,0.0546875f, -0.5625f,0.0546875f, -0.570313f,0.0546875f, -0.578125f,0.0546875f, -0.585938f,0.0546875f, -0.59375f,0.0546875f, -0.601563f,0.0546875f, -0.609375f,0.0546875f, -0.617188f,0.0546875f, -0.625f,0.0546875f, -0.632813f,0.0546875f, -0.640625f,0.0546875f, -0.648438f,0.0546875f, -0.65625f,0.0546875f, -0.664063f,0.0546875f, -0.671875f,0.0546875f, -0.679688f,0.0546875f, -0.6875f,0.0546875f, -0.695313f,0.0546875f, -0.703125f,0.0546875f, -0.710938f,0.0546875f, -0.71875f,0.0546875f, -0.726563f,0.0546875f, -0.734375f,0.0546875f, -0.742188f,0.0546875f, -0.75f,0.0546875f, -0.757813f,0.0546875f, -0.765625f,0.0546875f, -0.773438f,0.0546875f, -0.78125f,0.0546875f, -0.789063f,0.0546875f, -0.796875f,0.0546875f, -0.804688f,0.0546875f, -0.8125f,0.0546875f, -0.820313f,0.0546875f, -0.828125f,0.0546875f, -0.835938f,0.0546875f, -0.84375f,0.0546875f, -0.851563f,0.0546875f, -0.859375f,0.0546875f, -0.867188f,0.0546875f, -0.875f,0.0546875f, -0.882813f,0.0546875f, -0.890625f,0.0546875f, -0.898438f,0.0546875f, -0.90625f,0.0546875f, -0.914063f,0.0546875f, -0.921875f,0.0546875f, -0.929688f,0.0546875f, -0.9375f,0.0546875f, -0.945313f,0.0546875f, -0.953125f,0.0546875f, -0.960938f,0.0546875f, -0.96875f,0.0546875f, -0.976563f,0.0546875f, -0.984375f,0.0546875f, -0.992188f,0.0546875f, -1.0f,0.0546875f, -0.507813f,0.0625f, -0.515625f,0.0625f, -0.523438f,0.0625f, -0.53125f,0.0625f, -0.539063f,0.0625f, -0.546875f,0.0625f, -0.554688f,0.0625f, -0.5625f,0.0625f, -0.570313f,0.0625f, -0.578125f,0.0625f, -0.585938f,0.0625f, -0.59375f,0.0625f, -0.601563f,0.0625f, -0.609375f,0.0625f, -0.617188f,0.0625f, -0.625f,0.0625f, -0.632813f,0.0625f, -0.640625f,0.0625f, -0.648438f,0.0625f, -0.65625f,0.0625f, -0.664063f,0.0625f, -0.671875f,0.0625f, -0.679688f,0.0625f, -0.6875f,0.0625f, -0.695313f,0.0625f, -0.703125f,0.0625f, -0.710938f,0.0625f, -0.71875f,0.0625f, -0.726563f,0.0625f, -0.734375f,0.0625f, -0.742188f,0.0625f, -0.75f,0.0625f, -0.757813f,0.0625f, -0.765625f,0.0625f, -0.773438f,0.0625f, -0.78125f,0.0625f, -0.789063f,0.0625f, -0.796875f,0.0625f, -0.804688f,0.0625f, -0.8125f,0.0625f, -0.820313f,0.0625f, -0.828125f,0.0625f, -0.835938f,0.0625f, -0.84375f,0.0625f, -0.851563f,0.0625f, -0.859375f,0.0625f, -0.867188f,0.0625f, -0.875f,0.0625f, -0.882813f,0.0625f, -0.890625f,0.0625f, -0.898438f,0.0625f, -0.90625f,0.0625f, -0.914063f,0.0625f, -0.921875f,0.0625f, -0.929688f,0.0625f, -0.9375f,0.0625f, -0.945313f,0.0625f, -0.953125f,0.0625f, -0.960938f,0.0625f, -0.96875f,0.0625f, -0.976563f,0.0625f, -0.984375f,0.0625f, -0.992188f,0.0625f, -1.0f,0.0625f, -0.507813f,0.0703125f, -0.515625f,0.0703125f, -0.523438f,0.0703125f, -0.53125f,0.0703125f, -0.539063f,0.0703125f, -0.546875f,0.0703125f, -0.554688f,0.0703125f, -0.5625f,0.0703125f, -0.570313f,0.0703125f, -0.578125f,0.0703125f, -0.585938f,0.0703125f, -0.59375f,0.0703125f, -0.601563f,0.0703125f, -0.609375f,0.0703125f, -0.617188f,0.0703125f, -0.625f,0.0703125f, -0.632813f,0.0703125f, -0.640625f,0.0703125f, -0.648438f,0.0703125f, -0.65625f,0.0703125f, -0.664063f,0.0703125f, -0.671875f,0.0703125f, -0.679688f,0.0703125f, -0.6875f,0.0703125f, -0.695313f,0.0703125f, -0.703125f,0.0703125f, -0.710938f,0.0703125f, -0.71875f,0.0703125f, -0.726563f,0.0703125f, -0.734375f,0.0703125f, -0.742188f,0.0703125f, -0.75f,0.0703125f, -0.757813f,0.0703125f, -0.765625f,0.0703125f, -0.773438f,0.0703125f, -0.78125f,0.0703125f, -0.789063f,0.0703125f, -0.796875f,0.0703125f, -0.804688f,0.0703125f, -0.8125f,0.0703125f, -0.820313f,0.0703125f, -0.828125f,0.0703125f, -0.835938f,0.0703125f, -0.84375f,0.0703125f, -0.851563f,0.0703125f, -0.859375f,0.0703125f, -0.867188f,0.0703125f, -0.875f,0.0703125f, -0.882813f,0.0703125f, -0.890625f,0.0703125f, -0.898438f,0.0703125f, -0.90625f,0.0703125f, -0.914063f,0.0703125f, -0.921875f,0.0703125f, -0.929688f,0.0703125f, -0.9375f,0.0703125f, -0.945313f,0.0703125f, -0.953125f,0.0703125f, -0.960938f,0.0703125f, -0.96875f,0.0703125f, -0.976563f,0.0703125f, -0.984375f,0.0703125f, -0.992188f,0.0703125f, -1.0f,0.0703125f, -0.507813f,0.078125f, -0.515625f,0.078125f, -0.523438f,0.078125f, -0.53125f,0.078125f, -0.539063f,0.078125f, -0.546875f,0.078125f, -0.554688f,0.078125f, -0.5625f,0.078125f, -0.570313f,0.078125f, -0.578125f,0.078125f, -0.585938f,0.078125f, -0.59375f,0.078125f, -0.601563f,0.078125f, -0.609375f,0.078125f, -0.617188f,0.078125f, -0.625f,0.078125f, -0.632813f,0.078125f, -0.640625f,0.078125f, -0.648438f,0.078125f, -0.65625f,0.078125f, -0.664063f,0.078125f, -0.671875f,0.078125f, -0.679688f,0.078125f, -0.6875f,0.078125f, -0.695313f,0.078125f, -0.703125f,0.078125f, -0.710938f,0.078125f, -0.71875f,0.078125f, -0.726563f,0.078125f, -0.734375f,0.078125f, -0.742188f,0.078125f, -0.75f,0.078125f, -0.757813f,0.078125f, -0.765625f,0.078125f, -0.773438f,0.078125f, -0.78125f,0.078125f, -0.789063f,0.078125f, -0.796875f,0.078125f, -0.804688f,0.078125f, -0.8125f,0.078125f, -0.820313f,0.078125f, -0.828125f,0.078125f, -0.835938f,0.078125f, -0.84375f,0.078125f, -0.851563f,0.078125f, -0.859375f,0.078125f, -0.867188f,0.078125f, -0.875f,0.078125f, -0.882813f,0.078125f, -0.890625f,0.078125f, -0.898438f,0.078125f, -0.90625f,0.078125f, -0.914063f,0.078125f, -0.921875f,0.078125f, -0.929688f,0.078125f, -0.9375f,0.078125f, -0.945313f,0.078125f, -0.953125f,0.078125f, -0.960938f,0.078125f, -0.96875f,0.078125f, -0.976563f,0.078125f, -0.984375f,0.078125f, -0.992188f,0.078125f, -1.0f,0.078125f, -0.507813f,0.0859375f, -0.515625f,0.0859375f, -0.523438f,0.0859375f, -0.53125f,0.0859375f, -0.539063f,0.0859375f, -0.546875f,0.0859375f, -0.554688f,0.0859375f, -0.5625f,0.0859375f, -0.570313f,0.0859375f, -0.578125f,0.0859375f, -0.585938f,0.0859375f, -0.59375f,0.0859375f, -0.601563f,0.0859375f, -0.609375f,0.0859375f, -0.617188f,0.0859375f, -0.625f,0.0859375f, -0.632813f,0.0859375f, -0.640625f,0.0859375f, -0.648438f,0.0859375f, -0.65625f,0.0859375f, -0.664063f,0.0859375f, -0.671875f,0.0859375f, -0.679688f,0.0859375f, -0.6875f,0.0859375f, -0.695313f,0.0859375f, -0.703125f,0.0859375f, -0.710938f,0.0859375f, -0.71875f,0.0859375f, -0.726563f,0.0859375f, -0.734375f,0.0859375f, -0.742188f,0.0859375f, -0.75f,0.0859375f, -0.757813f,0.0859375f, -0.765625f,0.0859375f, -0.773438f,0.0859375f, -0.78125f,0.0859375f, -0.789063f,0.0859375f, -0.796875f,0.0859375f, -0.804688f,0.0859375f, -0.8125f,0.0859375f, -0.820313f,0.0859375f, -0.828125f,0.0859375f, -0.835938f,0.0859375f, -0.84375f,0.0859375f, -0.851563f,0.0859375f, -0.859375f,0.0859375f, -0.867188f,0.0859375f, -0.875f,0.0859375f, -0.882813f,0.0859375f, -0.890625f,0.0859375f, -0.898438f,0.0859375f, -0.90625f,0.0859375f, -0.914063f,0.0859375f, -0.921875f,0.0859375f, -0.929688f,0.0859375f, -0.9375f,0.0859375f, -0.945313f,0.0859375f, -0.953125f,0.0859375f, -0.960938f,0.0859375f, -0.96875f,0.0859375f, -0.976563f,0.0859375f, -0.984375f,0.0859375f, -0.992188f,0.0859375f, -1.0f,0.0859375f, -0.507813f,0.09375f, -0.515625f,0.09375f, -0.523438f,0.09375f, -0.53125f,0.09375f, -0.539063f,0.09375f, -0.546875f,0.09375f, -0.554688f,0.09375f, -0.5625f,0.09375f, -0.570313f,0.09375f, -0.578125f,0.09375f, -0.585938f,0.09375f, -0.59375f,0.09375f, -0.601563f,0.09375f, -0.609375f,0.09375f, -0.617188f,0.09375f, -0.625f,0.09375f, -0.632813f,0.09375f, -0.640625f,0.09375f, -0.648438f,0.09375f, -0.65625f,0.09375f, -0.664063f,0.09375f, -0.671875f,0.09375f, -0.679688f,0.09375f, -0.6875f,0.09375f, -0.695313f,0.09375f, -0.703125f,0.09375f, -0.710938f,0.09375f, -0.71875f,0.09375f, -0.726563f,0.09375f, -0.734375f,0.09375f, -0.742188f,0.09375f, -0.75f,0.09375f, -0.757813f,0.09375f, -0.765625f,0.09375f, -0.773438f,0.09375f, -0.78125f,0.09375f, -0.789063f,0.09375f, -0.796875f,0.09375f, -0.804688f,0.09375f, -0.8125f,0.09375f, -0.820313f,0.09375f, -0.828125f,0.09375f, -0.835938f,0.09375f, -0.84375f,0.09375f, -0.851563f,0.09375f, -0.859375f,0.09375f, -0.867188f,0.09375f, -0.875f,0.09375f, -0.882813f,0.09375f, -0.890625f,0.09375f, -0.898438f,0.09375f, -0.90625f,0.09375f, -0.914063f,0.09375f, -0.921875f,0.09375f, -0.929688f,0.09375f, -0.9375f,0.09375f, -0.945313f,0.09375f, -0.953125f,0.09375f, -0.960938f,0.09375f, -0.96875f,0.09375f, -0.976563f,0.09375f, -0.984375f,0.09375f, -0.992188f,0.09375f, -1.0f,0.09375f, -0.507813f,0.101563f, -0.515625f,0.101563f, -0.523438f,0.101563f, -0.53125f,0.101563f, -0.539063f,0.101563f, -0.546875f,0.101563f, -0.554688f,0.101563f, -0.5625f,0.101563f, -0.570313f,0.101563f, -0.578125f,0.101563f, -0.585938f,0.101563f, -0.59375f,0.101563f, -0.601563f,0.101563f, -0.609375f,0.101563f, -0.617188f,0.101563f, -0.625f,0.101563f, -0.632813f,0.101563f, -0.640625f,0.101563f, -0.648438f,0.101563f, -0.65625f,0.101563f, -0.664063f,0.101563f, -0.671875f,0.101563f, -0.679688f,0.101563f, -0.6875f,0.101563f, -0.695313f,0.101563f, -0.703125f,0.101563f, -0.710938f,0.101563f, -0.71875f,0.101563f, -0.726563f,0.101563f, -0.734375f,0.101563f, -0.742188f,0.101563f, -0.75f,0.101563f, -0.757813f,0.101563f, -0.765625f,0.101563f, -0.773438f,0.101563f, -0.78125f,0.101563f, -0.789063f,0.101563f, -0.796875f,0.101563f, -0.804688f,0.101563f, -0.8125f,0.101563f, -0.820313f,0.101563f, -0.828125f,0.101563f, -0.835938f,0.101563f, -0.84375f,0.101563f, -0.851563f,0.101563f, -0.859375f,0.101563f, -0.867188f,0.101563f, -0.875f,0.101563f, -0.882813f,0.101563f, -0.890625f,0.101563f, -0.898438f,0.101563f, -0.90625f,0.101563f, -0.914063f,0.101563f, -0.921875f,0.101563f, -0.929688f,0.101563f, -0.9375f,0.101563f, -0.945313f,0.101563f, -0.953125f,0.101563f, -0.960938f,0.101563f, -0.96875f,0.101563f, -0.976563f,0.101563f, -0.984375f,0.101563f, -0.992188f,0.101563f, -1.0f,0.101563f, -0.507813f,0.109375f, -0.515625f,0.109375f, -0.523438f,0.109375f, -0.53125f,0.109375f, -0.539063f,0.109375f, -0.546875f,0.109375f, -0.554688f,0.109375f, -0.5625f,0.109375f, -0.570313f,0.109375f, -0.578125f,0.109375f, -0.585938f,0.109375f, -0.59375f,0.109375f, -0.601563f,0.109375f, -0.609375f,0.109375f, -0.617188f,0.109375f, -0.625f,0.109375f, -0.632813f,0.109375f, -0.640625f,0.109375f, -0.648438f,0.109375f, -0.65625f,0.109375f, -0.664063f,0.109375f, -0.671875f,0.109375f, -0.679688f,0.109375f, -0.6875f,0.109375f, -0.695313f,0.109375f, -0.703125f,0.109375f, -0.710938f,0.109375f, -0.71875f,0.109375f, -0.726563f,0.109375f, -0.734375f,0.109375f, -0.742188f,0.109375f, -0.75f,0.109375f, -0.757813f,0.109375f, -0.765625f,0.109375f, -0.773438f,0.109375f, -0.78125f,0.109375f, -0.789063f,0.109375f, -0.796875f,0.109375f, -0.804688f,0.109375f, -0.8125f,0.109375f, -0.820313f,0.109375f, -0.828125f,0.109375f, -0.835938f,0.109375f, -0.84375f,0.109375f, -0.851563f,0.109375f, -0.859375f,0.109375f, -0.867188f,0.109375f, -0.875f,0.109375f, -0.882813f,0.109375f, -0.890625f,0.109375f, -0.898438f,0.109375f, -0.90625f,0.109375f, -0.914063f,0.109375f, -0.921875f,0.109375f, -0.929688f,0.109375f, -0.9375f,0.109375f, -0.945313f,0.109375f, -0.953125f,0.109375f, -0.960938f,0.109375f, -0.96875f,0.109375f, -0.976563f,0.109375f, -0.984375f,0.109375f, -0.992188f,0.109375f, -1.0f,0.109375f, -0.507813f,0.117188f, -0.515625f,0.117188f, -0.523438f,0.117188f, -0.53125f,0.117188f, -0.539063f,0.117188f, -0.546875f,0.117188f, -0.554688f,0.117188f, -0.5625f,0.117188f, -0.570313f,0.117188f, -0.578125f,0.117188f, -0.585938f,0.117188f, -0.59375f,0.117188f, -0.601563f,0.117188f, -0.609375f,0.117188f, -0.617188f,0.117188f, -0.625f,0.117188f, -0.632813f,0.117188f, -0.640625f,0.117188f, -0.648438f,0.117188f, -0.65625f,0.117188f, -0.664063f,0.117188f, -0.671875f,0.117188f, -0.679688f,0.117188f, -0.6875f,0.117188f, -0.695313f,0.117188f, -0.703125f,0.117188f, -0.710938f,0.117188f, -0.71875f,0.117188f, -0.726563f,0.117188f, -0.734375f,0.117188f, -0.742188f,0.117188f, -0.75f,0.117188f, -0.757813f,0.117188f, -0.765625f,0.117188f, -0.773438f,0.117188f, -0.78125f,0.117188f, -0.789063f,0.117188f, -0.796875f,0.117188f, -0.804688f,0.117188f, -0.8125f,0.117188f, -0.820313f,0.117188f, -0.828125f,0.117188f, -0.835938f,0.117188f, -0.84375f,0.117188f, -0.851563f,0.117188f, -0.859375f,0.117188f, -0.867188f,0.117188f, -0.875f,0.117188f, -0.882813f,0.117188f, -0.890625f,0.117188f, -0.898438f,0.117188f, -0.90625f,0.117188f, -0.914063f,0.117188f, -0.921875f,0.117188f, -0.929688f,0.117188f, -0.9375f,0.117188f, -0.945313f,0.117188f, -0.953125f,0.117188f, -0.960938f,0.117188f, -0.96875f,0.117188f, -0.976563f,0.117188f, -0.984375f,0.117188f, -0.992188f,0.117188f, -1.0f,0.117188f, -0.507813f,0.125f, -0.515625f,0.125f, -0.523438f,0.125f, -0.53125f,0.125f, -0.539063f,0.125f, -0.546875f,0.125f, -0.554688f,0.125f, -0.5625f,0.125f, -0.570313f,0.125f, -0.578125f,0.125f, -0.585938f,0.125f, -0.59375f,0.125f, -0.601563f,0.125f, -0.609375f,0.125f, -0.617188f,0.125f, -0.625f,0.125f, -0.632813f,0.125f, -0.640625f,0.125f, -0.648438f,0.125f, -0.65625f,0.125f, -0.664063f,0.125f, -0.671875f,0.125f, -0.679688f,0.125f, -0.6875f,0.125f, -0.695313f,0.125f, -0.703125f,0.125f, -0.710938f,0.125f, -0.71875f,0.125f, -0.726563f,0.125f, -0.734375f,0.125f, -0.742188f,0.125f, -0.75f,0.125f, -0.757813f,0.125f, -0.765625f,0.125f, -0.773438f,0.125f, -0.78125f,0.125f, -0.789063f,0.125f, -0.796875f,0.125f, -0.804688f,0.125f, -0.8125f,0.125f, -0.820313f,0.125f, -0.828125f,0.125f, -0.835938f,0.125f, -0.84375f,0.125f, -0.851563f,0.125f, -0.859375f,0.125f, -0.867188f,0.125f, -0.875f,0.125f, -0.882813f,0.125f, -0.890625f,0.125f, -0.898438f,0.125f, -0.90625f,0.125f, -0.914063f,0.125f, -0.921875f,0.125f, -0.929688f,0.125f, -0.9375f,0.125f, -0.945313f,0.125f, -0.953125f,0.125f, -0.960938f,0.125f, -0.96875f,0.125f, -0.976563f,0.125f, -0.984375f,0.125f, -0.992188f,0.125f, -1.0f,0.125f, -0.507813f,0.132813f, -0.515625f,0.132813f, -0.523438f,0.132813f, -0.53125f,0.132813f, -0.539063f,0.132813f, -0.546875f,0.132813f, -0.554688f,0.132813f, -0.5625f,0.132813f, -0.570313f,0.132813f, -0.578125f,0.132813f, -0.585938f,0.132813f, -0.59375f,0.132813f, -0.601563f,0.132813f, -0.609375f,0.132813f, -0.617188f,0.132813f, -0.625f,0.132813f, -0.632813f,0.132813f, -0.640625f,0.132813f, -0.648438f,0.132813f, -0.65625f,0.132813f, -0.664063f,0.132813f, -0.671875f,0.132813f, -0.679688f,0.132813f, -0.6875f,0.132813f, -0.695313f,0.132813f, -0.703125f,0.132813f, -0.710938f,0.132813f, -0.71875f,0.132813f, -0.726563f,0.132813f, -0.734375f,0.132813f, -0.742188f,0.132813f, -0.75f,0.132813f, -0.757813f,0.132813f, -0.765625f,0.132813f, -0.773438f,0.132813f, -0.78125f,0.132813f, -0.789063f,0.132813f, -0.796875f,0.132813f, -0.804688f,0.132813f, -0.8125f,0.132813f, -0.820313f,0.132813f, -0.828125f,0.132813f, -0.835938f,0.132813f, -0.84375f,0.132813f, -0.851563f,0.132813f, -0.859375f,0.132813f, -0.867188f,0.132813f, -0.875f,0.132813f, -0.882813f,0.132813f, -0.890625f,0.132813f, -0.898438f,0.132813f, -0.90625f,0.132813f, -0.914063f,0.132813f, -0.921875f,0.132813f, -0.929688f,0.132813f, -0.9375f,0.132813f, -0.945313f,0.132813f, -0.953125f,0.132813f, -0.960938f,0.132813f, -0.96875f,0.132813f, -0.976563f,0.132813f, -0.984375f,0.132813f, -0.992188f,0.132813f, -1.0f,0.132813f, -0.507813f,0.140625f, -0.515625f,0.140625f, -0.523438f,0.140625f, -0.53125f,0.140625f, -0.539063f,0.140625f, -0.546875f,0.140625f, -0.554688f,0.140625f, -0.5625f,0.140625f, -0.570313f,0.140625f, -0.578125f,0.140625f, -0.585938f,0.140625f, -0.59375f,0.140625f, -0.601563f,0.140625f, -0.609375f,0.140625f, -0.617188f,0.140625f, -0.625f,0.140625f, -0.632813f,0.140625f, -0.640625f,0.140625f, -0.648438f,0.140625f, -0.65625f,0.140625f, -0.664063f,0.140625f, -0.671875f,0.140625f, -0.679688f,0.140625f, -0.6875f,0.140625f, -0.695313f,0.140625f, -0.703125f,0.140625f, -0.710938f,0.140625f, -0.71875f,0.140625f, -0.726563f,0.140625f, -0.734375f,0.140625f, -0.742188f,0.140625f, -0.75f,0.140625f, -0.757813f,0.140625f, -0.765625f,0.140625f, -0.773438f,0.140625f, -0.78125f,0.140625f, -0.789063f,0.140625f, -0.796875f,0.140625f, -0.804688f,0.140625f, -0.8125f,0.140625f, -0.820313f,0.140625f, -0.828125f,0.140625f, -0.835938f,0.140625f, -0.84375f,0.140625f, -0.851563f,0.140625f, -0.859375f,0.140625f, -0.867188f,0.140625f, -0.875f,0.140625f, -0.882813f,0.140625f, -0.890625f,0.140625f, -0.898438f,0.140625f, -0.90625f,0.140625f, -0.914063f,0.140625f, -0.921875f,0.140625f, -0.929688f,0.140625f, -0.9375f,0.140625f, -0.945313f,0.140625f, -0.953125f,0.140625f, -0.960938f,0.140625f, -0.96875f,0.140625f, -0.976563f,0.140625f, -0.984375f,0.140625f, -0.992188f,0.140625f, -1.0f,0.140625f, -0.507813f,0.148438f, -0.515625f,0.148438f, -0.523438f,0.148438f, -0.53125f,0.148438f, -0.539063f,0.148438f, -0.546875f,0.148438f, -0.554688f,0.148438f, -0.5625f,0.148438f, -0.570313f,0.148438f, -0.578125f,0.148438f, -0.585938f,0.148438f, -0.59375f,0.148438f, -0.601563f,0.148438f, -0.609375f,0.148438f, -0.617188f,0.148438f, -0.625f,0.148438f, -0.632813f,0.148438f, -0.640625f,0.148438f, -0.648438f,0.148438f, -0.65625f,0.148438f, -0.664063f,0.148438f, -0.671875f,0.148438f, -0.679688f,0.148438f, -0.6875f,0.148438f, -0.695313f,0.148438f, -0.703125f,0.148438f, -0.710938f,0.148438f, -0.71875f,0.148438f, -0.726563f,0.148438f, -0.734375f,0.148438f, -0.742188f,0.148438f, -0.75f,0.148438f, -0.757813f,0.148438f, -0.765625f,0.148438f, -0.773438f,0.148438f, -0.78125f,0.148438f, -0.789063f,0.148438f, -0.796875f,0.148438f, -0.804688f,0.148438f, -0.8125f,0.148438f, -0.820313f,0.148438f, -0.828125f,0.148438f, -0.835938f,0.148438f, -0.84375f,0.148438f, -0.851563f,0.148438f, -0.859375f,0.148438f, -0.867188f,0.148438f, -0.875f,0.148438f, -0.882813f,0.148438f, -0.890625f,0.148438f, -0.898438f,0.148438f, -0.90625f,0.148438f, -0.914063f,0.148438f, -0.921875f,0.148438f, -0.929688f,0.148438f, -0.9375f,0.148438f, -0.945313f,0.148438f, -0.953125f,0.148438f, -0.960938f,0.148438f, -0.96875f,0.148438f, -0.976563f,0.148438f, -0.984375f,0.148438f, -0.992188f,0.148438f, -1.0f,0.148438f, -0.507813f,0.15625f, -0.515625f,0.15625f, -0.523438f,0.15625f, -0.53125f,0.15625f, -0.539063f,0.15625f, -0.546875f,0.15625f, -0.554688f,0.15625f, -0.5625f,0.15625f, -0.570313f,0.15625f, -0.578125f,0.15625f, -0.585938f,0.15625f, -0.59375f,0.15625f, -0.601563f,0.15625f, -0.609375f,0.15625f, -0.617188f,0.15625f, -0.625f,0.15625f, -0.632813f,0.15625f, -0.640625f,0.15625f, -0.648438f,0.15625f, -0.65625f,0.15625f, -0.664063f,0.15625f, -0.671875f,0.15625f, -0.679688f,0.15625f, -0.6875f,0.15625f, -0.695313f,0.15625f, -0.703125f,0.15625f, -0.710938f,0.15625f, -0.71875f,0.15625f, -0.726563f,0.15625f, -0.734375f,0.15625f, -0.742188f,0.15625f, -0.75f,0.15625f, -0.757813f,0.15625f, -0.765625f,0.15625f, -0.773438f,0.15625f, -0.78125f,0.15625f, -0.789063f,0.15625f, -0.796875f,0.15625f, -0.804688f,0.15625f, -0.8125f,0.15625f, -0.820313f,0.15625f, -0.828125f,0.15625f, -0.835938f,0.15625f, -0.84375f,0.15625f, -0.851563f,0.15625f, -0.859375f,0.15625f, -0.867188f,0.15625f, -0.875f,0.15625f, -0.882813f,0.15625f, -0.890625f,0.15625f, -0.898438f,0.15625f, -0.90625f,0.15625f, -0.914063f,0.15625f, -0.921875f,0.15625f, -0.929688f,0.15625f, -0.9375f,0.15625f, -0.945313f,0.15625f, -0.953125f,0.15625f, -0.960938f,0.15625f, -0.96875f,0.15625f, -0.976563f,0.15625f, -0.984375f,0.15625f, -0.992188f,0.15625f, -1.0f,0.15625f, -0.507813f,0.164063f, -0.515625f,0.164063f, -0.523438f,0.164063f, -0.53125f,0.164063f, -0.539063f,0.164063f, -0.546875f,0.164063f, -0.554688f,0.164063f, -0.5625f,0.164063f, -0.570313f,0.164063f, -0.578125f,0.164063f, -0.585938f,0.164063f, -0.59375f,0.164063f, -0.601563f,0.164063f, -0.609375f,0.164063f, -0.617188f,0.164063f, -0.625f,0.164063f, -0.632813f,0.164063f, -0.640625f,0.164063f, -0.648438f,0.164063f, -0.65625f,0.164063f, -0.664063f,0.164063f, -0.671875f,0.164063f, -0.679688f,0.164063f, -0.6875f,0.164063f, -0.695313f,0.164063f, -0.703125f,0.164063f, -0.710938f,0.164063f, -0.71875f,0.164063f, -0.726563f,0.164063f, -0.734375f,0.164063f, -0.742188f,0.164063f, -0.75f,0.164063f, -0.757813f,0.164063f, -0.765625f,0.164063f, -0.773438f,0.164063f, -0.78125f,0.164063f, -0.789063f,0.164063f, -0.796875f,0.164063f, -0.804688f,0.164063f, -0.8125f,0.164063f, -0.820313f,0.164063f, -0.828125f,0.164063f, -0.835938f,0.164063f, -0.84375f,0.164063f, -0.851563f,0.164063f, -0.859375f,0.164063f, -0.867188f,0.164063f, -0.875f,0.164063f, -0.882813f,0.164063f, -0.890625f,0.164063f, -0.898438f,0.164063f, -0.90625f,0.164063f, -0.914063f,0.164063f, -0.921875f,0.164063f, -0.929688f,0.164063f, -0.9375f,0.164063f, -0.945313f,0.164063f, -0.953125f,0.164063f, -0.960938f,0.164063f, -0.96875f,0.164063f, -0.976563f,0.164063f, -0.984375f,0.164063f, -0.992188f,0.164063f, -1.0f,0.164063f, -0.507813f,0.171875f, -0.515625f,0.171875f, -0.523438f,0.171875f, -0.53125f,0.171875f, -0.539063f,0.171875f, -0.546875f,0.171875f, -0.554688f,0.171875f, -0.5625f,0.171875f, -0.570313f,0.171875f, -0.578125f,0.171875f, -0.585938f,0.171875f, -0.59375f,0.171875f, -0.601563f,0.171875f, -0.609375f,0.171875f, -0.617188f,0.171875f, -0.625f,0.171875f, -0.632813f,0.171875f, -0.640625f,0.171875f, -0.648438f,0.171875f, -0.65625f,0.171875f, -0.664063f,0.171875f, -0.671875f,0.171875f, -0.679688f,0.171875f, -0.6875f,0.171875f, -0.695313f,0.171875f, -0.703125f,0.171875f, -0.710938f,0.171875f, -0.71875f,0.171875f, -0.726563f,0.171875f, -0.734375f,0.171875f, -0.742188f,0.171875f, -0.75f,0.171875f, -0.757813f,0.171875f, -0.765625f,0.171875f, -0.773438f,0.171875f, -0.78125f,0.171875f, -0.789063f,0.171875f, -0.796875f,0.171875f, -0.804688f,0.171875f, -0.8125f,0.171875f, -0.820313f,0.171875f, -0.828125f,0.171875f, -0.835938f,0.171875f, -0.84375f,0.171875f, -0.851563f,0.171875f, -0.859375f,0.171875f, -0.867188f,0.171875f, -0.875f,0.171875f, -0.882813f,0.171875f, -0.890625f,0.171875f, -0.898438f,0.171875f, -0.90625f,0.171875f, -0.914063f,0.171875f, -0.921875f,0.171875f, -0.929688f,0.171875f, -0.9375f,0.171875f, -0.945313f,0.171875f, -0.953125f,0.171875f, -0.960938f,0.171875f, -0.96875f,0.171875f, -0.976563f,0.171875f, -0.984375f,0.171875f, -0.992188f,0.171875f, -1.0f,0.171875f, -0.507813f,0.179688f, -0.515625f,0.179688f, -0.523438f,0.179688f, -0.53125f,0.179688f, -0.539063f,0.179688f, -0.546875f,0.179688f, -0.554688f,0.179688f, -0.5625f,0.179688f, -0.570313f,0.179688f, -0.578125f,0.179688f, -0.585938f,0.179688f, -0.59375f,0.179688f, -0.601563f,0.179688f, -0.609375f,0.179688f, -0.617188f,0.179688f, -0.625f,0.179688f, -0.632813f,0.179688f, -0.640625f,0.179688f, -0.648438f,0.179688f, -0.65625f,0.179688f, -0.664063f,0.179688f, -0.671875f,0.179688f, -0.679688f,0.179688f, -0.6875f,0.179688f, -0.695313f,0.179688f, -0.703125f,0.179688f, -0.710938f,0.179688f, -0.71875f,0.179688f, -0.726563f,0.179688f, -0.734375f,0.179688f, -0.742188f,0.179688f, -0.75f,0.179688f, -0.757813f,0.179688f, -0.765625f,0.179688f, -0.773438f,0.179688f, -0.78125f,0.179688f, -0.789063f,0.179688f, -0.796875f,0.179688f, -0.804688f,0.179688f, -0.8125f,0.179688f, -0.820313f,0.179688f, -0.828125f,0.179688f, -0.835938f,0.179688f, -0.84375f,0.179688f, -0.851563f,0.179688f, -0.859375f,0.179688f, -0.867188f,0.179688f, -0.875f,0.179688f, -0.882813f,0.179688f, -0.890625f,0.179688f, -0.898438f,0.179688f, -0.90625f,0.179688f, -0.914063f,0.179688f, -0.921875f,0.179688f, -0.929688f,0.179688f, -0.9375f,0.179688f, -0.945313f,0.179688f, -0.953125f,0.179688f, -0.960938f,0.179688f, -0.96875f,0.179688f, -0.976563f,0.179688f, -0.984375f,0.179688f, -0.992188f,0.179688f, -1.0f,0.179688f, -0.507813f,0.1875f, -0.515625f,0.1875f, -0.523438f,0.1875f, -0.53125f,0.1875f, -0.539063f,0.1875f, -0.546875f,0.1875f, -0.554688f,0.1875f, -0.5625f,0.1875f, -0.570313f,0.1875f, -0.578125f,0.1875f, -0.585938f,0.1875f, -0.59375f,0.1875f, -0.601563f,0.1875f, -0.609375f,0.1875f, -0.617188f,0.1875f, -0.625f,0.1875f, -0.632813f,0.1875f, -0.640625f,0.1875f, -0.648438f,0.1875f, -0.65625f,0.1875f, -0.664063f,0.1875f, -0.671875f,0.1875f, -0.679688f,0.1875f, -0.6875f,0.1875f, -0.695313f,0.1875f, -0.703125f,0.1875f, -0.710938f,0.1875f, -0.71875f,0.1875f, -0.726563f,0.1875f, -0.734375f,0.1875f, -0.742188f,0.1875f, -0.75f,0.1875f, -0.757813f,0.1875f, -0.765625f,0.1875f, -0.773438f,0.1875f, -0.78125f,0.1875f, -0.789063f,0.1875f, -0.796875f,0.1875f, -0.804688f,0.1875f, -0.8125f,0.1875f, -0.820313f,0.1875f, -0.828125f,0.1875f, -0.835938f,0.1875f, -0.84375f,0.1875f, -0.851563f,0.1875f, -0.859375f,0.1875f, -0.867188f,0.1875f, -0.875f,0.1875f, -0.882813f,0.1875f, -0.890625f,0.1875f, -0.898438f,0.1875f, -0.90625f,0.1875f, -0.914063f,0.1875f, -0.921875f,0.1875f, -0.929688f,0.1875f, -0.9375f,0.1875f, -0.945313f,0.1875f, -0.953125f,0.1875f, -0.960938f,0.1875f, -0.96875f,0.1875f, -0.976563f,0.1875f, -0.984375f,0.1875f, -0.992188f,0.1875f, -1.0f,0.1875f, -0.507813f,0.195313f, -0.515625f,0.195313f, -0.523438f,0.195313f, -0.53125f,0.195313f, -0.539063f,0.195313f, -0.546875f,0.195313f, -0.554688f,0.195313f, -0.5625f,0.195313f, -0.570313f,0.195313f, -0.578125f,0.195313f, -0.585938f,0.195313f, -0.59375f,0.195313f, -0.601563f,0.195313f, -0.609375f,0.195313f, -0.617188f,0.195313f, -0.625f,0.195313f, -0.632813f,0.195313f, -0.640625f,0.195313f, -0.648438f,0.195313f, -0.65625f,0.195313f, -0.664063f,0.195313f, -0.671875f,0.195313f, -0.679688f,0.195313f, -0.6875f,0.195313f, -0.695313f,0.195313f, -0.703125f,0.195313f, -0.710938f,0.195313f, -0.71875f,0.195313f, -0.726563f,0.195313f, -0.734375f,0.195313f, -0.742188f,0.195313f, -0.75f,0.195313f, -0.757813f,0.195313f, -0.765625f,0.195313f, -0.773438f,0.195313f, -0.78125f,0.195313f, -0.789063f,0.195313f, -0.796875f,0.195313f, -0.804688f,0.195313f, -0.8125f,0.195313f, -0.820313f,0.195313f, -0.828125f,0.195313f, -0.835938f,0.195313f, -0.84375f,0.195313f, -0.851563f,0.195313f, -0.859375f,0.195313f, -0.867188f,0.195313f, -0.875f,0.195313f, -0.882813f,0.195313f, -0.890625f,0.195313f, -0.898438f,0.195313f, -0.90625f,0.195313f, -0.914063f,0.195313f, -0.921875f,0.195313f, -0.929688f,0.195313f, -0.9375f,0.195313f, -0.945313f,0.195313f, -0.953125f,0.195313f, -0.960938f,0.195313f, -0.96875f,0.195313f, -0.976563f,0.195313f, -0.984375f,0.195313f, -0.992188f,0.195313f, -1.0f,0.195313f, -0.507813f,0.203125f, -0.515625f,0.203125f, -0.523438f,0.203125f, -0.53125f,0.203125f, -0.539063f,0.203125f, -0.546875f,0.203125f, -0.554688f,0.203125f, -0.5625f,0.203125f, -0.570313f,0.203125f, -0.578125f,0.203125f, -0.585938f,0.203125f, -0.59375f,0.203125f, -0.601563f,0.203125f, -0.609375f,0.203125f, -0.617188f,0.203125f, -0.625f,0.203125f, -0.632813f,0.203125f, -0.640625f,0.203125f, -0.648438f,0.203125f, -0.65625f,0.203125f, -0.664063f,0.203125f, -0.671875f,0.203125f, -0.679688f,0.203125f, -0.6875f,0.203125f, -0.695313f,0.203125f, -0.703125f,0.203125f, -0.710938f,0.203125f, -0.71875f,0.203125f, -0.726563f,0.203125f, -0.734375f,0.203125f, -0.742188f,0.203125f, -0.75f,0.203125f, -0.757813f,0.203125f, -0.765625f,0.203125f, -0.773438f,0.203125f, -0.78125f,0.203125f, -0.789063f,0.203125f, -0.796875f,0.203125f, -0.804688f,0.203125f, -0.8125f,0.203125f, -0.820313f,0.203125f, -0.828125f,0.203125f, -0.835938f,0.203125f, -0.84375f,0.203125f, -0.851563f,0.203125f, -0.859375f,0.203125f, -0.867188f,0.203125f, -0.875f,0.203125f, -0.882813f,0.203125f, -0.890625f,0.203125f, -0.898438f,0.203125f, -0.90625f,0.203125f, -0.914063f,0.203125f, -0.921875f,0.203125f, -0.929688f,0.203125f, -0.9375f,0.203125f, -0.945313f,0.203125f, -0.953125f,0.203125f, -0.960938f,0.203125f, -0.96875f,0.203125f, -0.976563f,0.203125f, -0.984375f,0.203125f, -0.992188f,0.203125f, -1.0f,0.203125f, -0.507813f,0.210938f, -0.515625f,0.210938f, -0.523438f,0.210938f, -0.53125f,0.210938f, -0.539063f,0.210938f, -0.546875f,0.210938f, -0.554688f,0.210938f, -0.5625f,0.210938f, -0.570313f,0.210938f, -0.578125f,0.210938f, -0.585938f,0.210938f, -0.59375f,0.210938f, -0.601563f,0.210938f, -0.609375f,0.210938f, -0.617188f,0.210938f, -0.625f,0.210938f, -0.632813f,0.210938f, -0.640625f,0.210938f, -0.648438f,0.210938f, -0.65625f,0.210938f, -0.664063f,0.210938f, -0.671875f,0.210938f, -0.679688f,0.210938f, -0.6875f,0.210938f, -0.695313f,0.210938f, -0.703125f,0.210938f, -0.710938f,0.210938f, -0.71875f,0.210938f, -0.726563f,0.210938f, -0.734375f,0.210938f, -0.742188f,0.210938f, -0.75f,0.210938f, -0.757813f,0.210938f, -0.765625f,0.210938f, -0.773438f,0.210938f, -0.78125f,0.210938f, -0.789063f,0.210938f, -0.796875f,0.210938f, -0.804688f,0.210938f, -0.8125f,0.210938f, -0.820313f,0.210938f, -0.828125f,0.210938f, -0.835938f,0.210938f, -0.84375f,0.210938f, -0.851563f,0.210938f, -0.859375f,0.210938f, -0.867188f,0.210938f, -0.875f,0.210938f, -0.882813f,0.210938f, -0.890625f,0.210938f, -0.898438f,0.210938f, -0.90625f,0.210938f, -0.914063f,0.210938f, -0.921875f,0.210938f, -0.929688f,0.210938f, -0.9375f,0.210938f, -0.945313f,0.210938f, -0.953125f,0.210938f, -0.960938f,0.210938f, -0.96875f,0.210938f, -0.976563f,0.210938f, -0.984375f,0.210938f, -0.992188f,0.210938f, -1.0f,0.210938f, -0.507813f,0.21875f, -0.515625f,0.21875f, -0.523438f,0.21875f, -0.53125f,0.21875f, -0.539063f,0.21875f, -0.546875f,0.21875f, -0.554688f,0.21875f, -0.5625f,0.21875f, -0.570313f,0.21875f, -0.578125f,0.21875f, -0.585938f,0.21875f, -0.59375f,0.21875f, -0.601563f,0.21875f, -0.609375f,0.21875f, -0.617188f,0.21875f, -0.625f,0.21875f, -0.632813f,0.21875f, -0.640625f,0.21875f, -0.648438f,0.21875f, -0.65625f,0.21875f, -0.664063f,0.21875f, -0.671875f,0.21875f, -0.679688f,0.21875f, -0.6875f,0.21875f, -0.695313f,0.21875f, -0.703125f,0.21875f, -0.710938f,0.21875f, -0.71875f,0.21875f, -0.726563f,0.21875f, -0.734375f,0.21875f, -0.742188f,0.21875f, -0.75f,0.21875f, -0.757813f,0.21875f, -0.765625f,0.21875f, -0.773438f,0.21875f, -0.78125f,0.21875f, -0.789063f,0.21875f, -0.796875f,0.21875f, -0.804688f,0.21875f, -0.8125f,0.21875f, -0.820313f,0.21875f, -0.828125f,0.21875f, -0.835938f,0.21875f, -0.84375f,0.21875f, -0.851563f,0.21875f, -0.859375f,0.21875f, -0.867188f,0.21875f, -0.875f,0.21875f, -0.882813f,0.21875f, -0.890625f,0.21875f, -0.898438f,0.21875f, -0.90625f,0.21875f, -0.914063f,0.21875f, -0.921875f,0.21875f, -0.929688f,0.21875f, -0.9375f,0.21875f, -0.945313f,0.21875f, -0.953125f,0.21875f, -0.960938f,0.21875f, -0.96875f,0.21875f, -0.976563f,0.21875f, -0.984375f,0.21875f, -0.992188f,0.21875f, -1.0f,0.21875f, -0.507813f,0.226563f, -0.515625f,0.226563f, -0.523438f,0.226563f, -0.53125f,0.226563f, -0.539063f,0.226563f, -0.546875f,0.226563f, -0.554688f,0.226563f, -0.5625f,0.226563f, -0.570313f,0.226563f, -0.578125f,0.226563f, -0.585938f,0.226563f, -0.59375f,0.226563f, -0.601563f,0.226563f, -0.609375f,0.226563f, -0.617188f,0.226563f, -0.625f,0.226563f, -0.632813f,0.226563f, -0.640625f,0.226563f, -0.648438f,0.226563f, -0.65625f,0.226563f, -0.664063f,0.226563f, -0.671875f,0.226563f, -0.679688f,0.226563f, -0.6875f,0.226563f, -0.695313f,0.226563f, -0.703125f,0.226563f, -0.710938f,0.226563f, -0.71875f,0.226563f, -0.726563f,0.226563f, -0.734375f,0.226563f, -0.742188f,0.226563f, -0.75f,0.226563f, -0.757813f,0.226563f, -0.765625f,0.226563f, -0.773438f,0.226563f, -0.78125f,0.226563f, -0.789063f,0.226563f, -0.796875f,0.226563f, -0.804688f,0.226563f, -0.8125f,0.226563f, -0.820313f,0.226563f, -0.828125f,0.226563f, -0.835938f,0.226563f, -0.84375f,0.226563f, -0.851563f,0.226563f, -0.859375f,0.226563f, -0.867188f,0.226563f, -0.875f,0.226563f, -0.882813f,0.226563f, -0.890625f,0.226563f, -0.898438f,0.226563f, -0.90625f,0.226563f, -0.914063f,0.226563f, -0.921875f,0.226563f, -0.929688f,0.226563f, -0.9375f,0.226563f, -0.945313f,0.226563f, -0.953125f,0.226563f, -0.960938f,0.226563f, -0.96875f,0.226563f, -0.976563f,0.226563f, -0.984375f,0.226563f, -0.992188f,0.226563f, -1.0f,0.226563f, -0.507813f,0.234375f, -0.515625f,0.234375f, -0.523438f,0.234375f, -0.53125f,0.234375f, -0.539063f,0.234375f, -0.546875f,0.234375f, -0.554688f,0.234375f, -0.5625f,0.234375f, -0.570313f,0.234375f, -0.578125f,0.234375f, -0.585938f,0.234375f, -0.59375f,0.234375f, -0.601563f,0.234375f, -0.609375f,0.234375f, -0.617188f,0.234375f, -0.625f,0.234375f, -0.632813f,0.234375f, -0.640625f,0.234375f, -0.648438f,0.234375f, -0.65625f,0.234375f, -0.664063f,0.234375f, -0.671875f,0.234375f, -0.679688f,0.234375f, -0.6875f,0.234375f, -0.695313f,0.234375f, -0.703125f,0.234375f, -0.710938f,0.234375f, -0.71875f,0.234375f, -0.726563f,0.234375f, -0.734375f,0.234375f, -0.742188f,0.234375f, -0.75f,0.234375f, -0.757813f,0.234375f, -0.765625f,0.234375f, -0.773438f,0.234375f, -0.78125f,0.234375f, -0.789063f,0.234375f, -0.796875f,0.234375f, -0.804688f,0.234375f, -0.8125f,0.234375f, -0.820313f,0.234375f, -0.828125f,0.234375f, -0.835938f,0.234375f, -0.84375f,0.234375f, -0.851563f,0.234375f, -0.859375f,0.234375f, -0.867188f,0.234375f, -0.875f,0.234375f, -0.882813f,0.234375f, -0.890625f,0.234375f, -0.898438f,0.234375f, -0.90625f,0.234375f, -0.914063f,0.234375f, -0.921875f,0.234375f, -0.929688f,0.234375f, -0.9375f,0.234375f, -0.945313f,0.234375f, -0.953125f,0.234375f, -0.960938f,0.234375f, -0.96875f,0.234375f, -0.976563f,0.234375f, -0.984375f,0.234375f, -0.992188f,0.234375f, -1.0f,0.234375f, -0.507813f,0.242188f, -0.515625f,0.242188f, -0.523438f,0.242188f, -0.53125f,0.242188f, -0.539063f,0.242188f, -0.546875f,0.242188f, -0.554688f,0.242188f, -0.5625f,0.242188f, -0.570313f,0.242188f, -0.578125f,0.242188f, -0.585938f,0.242188f, -0.59375f,0.242188f, -0.601563f,0.242188f, -0.609375f,0.242188f, -0.617188f,0.242188f, -0.625f,0.242188f, -0.632813f,0.242188f, -0.640625f,0.242188f, -0.648438f,0.242188f, -0.65625f,0.242188f, -0.664063f,0.242188f, -0.671875f,0.242188f, -0.679688f,0.242188f, -0.6875f,0.242188f, -0.695313f,0.242188f, -0.703125f,0.242188f, -0.710938f,0.242188f, -0.71875f,0.242188f, -0.726563f,0.242188f, -0.734375f,0.242188f, -0.742188f,0.242188f, -0.75f,0.242188f, -0.757813f,0.242188f, -0.765625f,0.242188f, -0.773438f,0.242188f, -0.78125f,0.242188f, -0.789063f,0.242188f, -0.796875f,0.242188f, -0.804688f,0.242188f, -0.8125f,0.242188f, -0.820313f,0.242188f, -0.828125f,0.242188f, -0.835938f,0.242188f, -0.84375f,0.242188f, -0.851563f,0.242188f, -0.859375f,0.242188f, -0.867188f,0.242188f, -0.875f,0.242188f, -0.882813f,0.242188f, -0.890625f,0.242188f, -0.898438f,0.242188f, -0.90625f,0.242188f, -0.914063f,0.242188f, -0.921875f,0.242188f, -0.929688f,0.242188f, -0.9375f,0.242188f, -0.945313f,0.242188f, -0.953125f,0.242188f, -0.960938f,0.242188f, -0.96875f,0.242188f, -0.976563f,0.242188f, -0.984375f,0.242188f, -0.992188f,0.242188f, -1.0f,0.242188f, -}; - -unsigned short Landscape01Idx[] = { -0,1,2, -3,2,1, -2,3,4, -5,4,3, -4,5,6, -7,6,5, -6,7,8, -9,8,7, -8,9,10, -11,10,9, -10,11,12, -13,12,11, -12,13,14, -15,14,13, -14,15,16, -17,16,15, -16,17,18, -19,18,17, -18,19,20, -21,20,19, -20,21,22, -23,22,21, -22,23,24, -25,24,23, -24,25,26, -27,26,25, -26,27,28, -29,28,27, -28,29,30, -31,30,29, -30,31,32, -33,32,31, -32,33,34, -35,34,33, -34,35,36, -37,36,35, -36,37,38, -39,38,37, -38,39,40, -41,40,39, -40,41,42, -43,42,41, -42,43,44, -45,44,43, -44,45,46, -47,46,45, -46,47,48, -49,48,47, -48,49,50, -51,50,49, -50,51,52, -53,52,51, -52,53,54, -55,54,53, -54,55,56, -57,56,55, -56,57,58, -59,58,57, -58,59,60, -61,60,59, -60,61,62, -63,62,61, -62,63,64, -65,64,63, -64,65,66, -67,66,65, -66,67,68, -69,68,67, -68,69,70, -71,70,69, -70,71,72, -73,72,71, -72,73,74, -75,74,73, -74,75,76, -77,76,75, -76,77,78, -79,78,77, -78,79,80, -81,80,79, -80,81,82, -83,82,81, -82,83,84, -85,84,83, -84,85,86, -87,86,85, -86,87,88, -89,88,87, -88,89,90, -91,90,89, -90,91,92, -93,92,91, -92,93,94, -95,94,93, -94,95,96, -97,96,95, -96,97,98, -99,98,97, -98,99,100, -101,100,99, -100,101,102, -103,102,101, -102,103,104, -105,104,103, -104,105,106, -107,106,105, -106,107,108, -109,108,107, -108,109,110, -111,110,109, -110,111,112, -113,112,111, -112,113,114, -115,114,113, -114,115,116, -117,116,115, -116,117,118, -119,118,117, -118,119,120, -121,120,119, -120,121,122, -123,122,121, -122,123,124, -125,124,123, -124,125,126, -127,126,125, -128,0,129, -2,129,0, -129,2,130, -4,130,2, -130,4,131, -6,131,4, -131,6,132, -8,132,6, -132,8,133, -10,133,8, -133,10,134, -12,134,10, -134,12,135, -14,135,12, -135,14,136, -16,136,14, -136,16,137, -18,137,16, -137,18,138, -20,138,18, -138,20,139, -22,139,20, -139,22,140, -24,140,22, -140,24,141, -26,141,24, -141,26,142, -28,142,26, -142,28,143, -30,143,28, -143,30,144, -32,144,30, -144,32,145, -34,145,32, -145,34,146, -36,146,34, -146,36,147, -38,147,36, -147,38,148, -40,148,38, -148,40,149, -42,149,40, -149,42,150, -44,150,42, -150,44,151, -46,151,44, -151,46,152, -48,152,46, -152,48,153, -50,153,48, -153,50,154, -52,154,50, -154,52,155, -54,155,52, -155,54,156, -56,156,54, -156,56,157, -58,157,56, -157,58,158, -60,158,58, -158,60,159, -62,159,60, -159,62,160, -64,160,62, -160,64,161, -66,161,64, -161,66,162, -68,162,66, -162,68,163, -70,163,68, -163,70,164, -72,164,70, -164,72,165, -74,165,72, -165,74,166, -76,166,74, -166,76,167, -78,167,76, -167,78,168, -80,168,78, -168,80,169, -82,169,80, -169,82,170, -84,170,82, -170,84,171, -86,171,84, -171,86,172, -88,172,86, -172,88,173, -90,173,88, -173,90,174, -92,174,90, -174,92,175, -94,175,92, -175,94,176, -96,176,94, -176,96,177, -98,177,96, -177,98,178, -100,178,98, -178,100,179, -102,179,100, -179,102,180, -104,180,102, -180,104,181, -106,181,104, -181,106,182, -108,182,106, -182,108,183, -110,183,108, -183,110,184, -112,184,110, -184,112,185, -114,185,112, -185,114,186, -116,186,114, -186,116,187, -118,187,116, -187,118,188, -120,188,118, -188,120,189, -122,189,120, -189,122,190, -124,190,122, -190,124,191, -126,191,124, -192,128,193, -129,193,128, -193,129,194, -130,194,129, -194,130,195, -131,195,130, -195,131,196, -132,196,131, -196,132,197, -133,197,132, -197,133,198, -134,198,133, -198,134,199, -135,199,134, -199,135,200, -136,200,135, -200,136,201, -137,201,136, -201,137,202, -138,202,137, -202,138,203, -139,203,138, -203,139,204, -140,204,139, -204,140,205, -141,205,140, -205,141,206, -142,206,141, -206,142,207, -143,207,142, -207,143,208, -144,208,143, -208,144,209, -145,209,144, -209,145,210, -146,210,145, -210,146,211, -147,211,146, -211,147,212, -148,212,147, -212,148,213, -149,213,148, -213,149,214, -150,214,149, -214,150,215, -151,215,150, -215,151,216, -152,216,151, -216,152,217, -153,217,152, -217,153,218, -154,218,153, -218,154,219, -155,219,154, -219,155,220, -156,220,155, -220,156,221, -157,221,156, -221,157,222, -158,222,157, -222,158,223, -159,223,158, -223,159,224, -160,224,159, -224,160,225, -161,225,160, -225,161,226, -162,226,161, -226,162,227, -163,227,162, -227,163,228, -164,228,163, -228,164,229, -165,229,164, -229,165,230, -166,230,165, -230,166,231, -167,231,166, -231,167,232, -168,232,167, -232,168,233, -169,233,168, -233,169,234, -170,234,169, -234,170,235, -171,235,170, -235,171,236, -172,236,171, -236,172,237, -173,237,172, -237,173,238, -174,238,173, -238,174,239, -175,239,174, -239,175,240, -176,240,175, -240,176,241, -177,241,176, -241,177,242, -178,242,177, -242,178,243, -179,243,178, -243,179,244, -180,244,179, -244,180,245, -181,245,180, -245,181,246, -182,246,181, -246,182,247, -183,247,182, -247,183,248, -184,248,183, -248,184,249, -185,249,184, -249,185,250, -186,250,185, -250,186,251, -187,251,186, -251,187,252, -188,252,187, -252,188,253, -189,253,188, -253,189,254, -190,254,189, -254,190,255, -191,255,190, -256,192,257, -193,257,192, -257,193,258, -194,258,193, -258,194,259, -195,259,194, -259,195,260, -196,260,195, -260,196,261, -197,261,196, -261,197,262, -198,262,197, -262,198,263, -199,263,198, -263,199,264, -200,264,199, -264,200,265, -201,265,200, -265,201,266, -202,266,201, -266,202,267, -203,267,202, -267,203,268, -204,268,203, -268,204,269, -205,269,204, -269,205,270, -206,270,205, -270,206,271, -207,271,206, -271,207,272, -208,272,207, -272,208,273, -209,273,208, -273,209,274, -210,274,209, -274,210,275, -211,275,210, -275,211,276, -212,276,211, -276,212,277, -213,277,212, -277,213,278, -214,278,213, -278,214,279, -215,279,214, -279,215,280, -216,280,215, -280,216,281, -217,281,216, -281,217,282, -218,282,217, -282,218,283, -219,283,218, -283,219,284, -220,284,219, -284,220,285, -221,285,220, -285,221,286, -222,286,221, -286,222,287, -223,287,222, -287,223,288, -224,288,223, -288,224,289, -225,289,224, -289,225,290, -226,290,225, -290,226,291, -227,291,226, -291,227,292, -228,292,227, -292,228,293, -229,293,228, -293,229,294, -230,294,229, -294,230,295, -231,295,230, -295,231,296, -232,296,231, -296,232,297, -233,297,232, -297,233,298, -234,298,233, -298,234,299, -235,299,234, -299,235,300, -236,300,235, -300,236,301, -237,301,236, -301,237,302, -238,302,237, -302,238,303, -239,303,238, -303,239,304, -240,304,239, -304,240,305, -241,305,240, -305,241,306, -242,306,241, -306,242,307, -243,307,242, -307,243,308, -244,308,243, -308,244,309, -245,309,244, -309,245,310, -246,310,245, -310,246,311, -247,311,246, -311,247,312, -248,312,247, -312,248,313, -249,313,248, -313,249,314, -250,314,249, -314,250,315, -251,315,250, -315,251,316, -252,316,251, -316,252,317, -253,317,252, -317,253,318, -254,318,253, -318,254,319, -255,319,254, -320,256,321, -257,321,256, -321,257,322, -258,322,257, -322,258,323, -259,323,258, -323,259,324, -260,324,259, -324,260,325, -261,325,260, -325,261,326, -262,326,261, -326,262,327, -263,327,262, -327,263,328, -264,328,263, -328,264,329, -265,329,264, -329,265,330, -266,330,265, -330,266,331, -267,331,266, -331,267,332, -268,332,267, -332,268,333, -269,333,268, -333,269,334, -270,334,269, -334,270,335, -271,335,270, -335,271,336, -272,336,271, -336,272,337, -273,337,272, -337,273,338, -274,338,273, -338,274,339, -275,339,274, -339,275,340, -276,340,275, -340,276,341, -277,341,276, -341,277,342, -278,342,277, -342,278,343, -279,343,278, -343,279,344, -280,344,279, -344,280,345, -281,345,280, -345,281,346, -282,346,281, -346,282,347, -283,347,282, -347,283,348, -284,348,283, -348,284,349, -285,349,284, -349,285,350, -286,350,285, -350,286,351, -287,351,286, -351,287,352, -288,352,287, -352,288,353, -289,353,288, -353,289,354, -290,354,289, -354,290,355, -291,355,290, -355,291,356, -292,356,291, -356,292,357, -293,357,292, -357,293,358, -294,358,293, -358,294,359, -295,359,294, -359,295,360, -296,360,295, -360,296,361, -297,361,296, -361,297,362, -298,362,297, -362,298,363, -299,363,298, -363,299,364, -300,364,299, -364,300,365, -301,365,300, -365,301,366, -302,366,301, -366,302,367, -303,367,302, -367,303,368, -304,368,303, -368,304,369, -305,369,304, -369,305,370, -306,370,305, -370,306,371, -307,371,306, -371,307,372, -308,372,307, -372,308,373, -309,373,308, -373,309,374, -310,374,309, -374,310,375, -311,375,310, -375,311,376, -312,376,311, -376,312,377, -313,377,312, -377,313,378, -314,378,313, -378,314,379, -315,379,314, -379,315,380, -316,380,315, -380,316,381, -317,381,316, -381,317,382, -318,382,317, -382,318,383, -319,383,318, -384,320,385, -321,385,320, -385,321,386, -322,386,321, -386,322,387, -323,387,322, -387,323,388, -324,388,323, -388,324,389, -325,389,324, -389,325,390, -326,390,325, -390,326,391, -327,391,326, -391,327,392, -328,392,327, -392,328,393, -329,393,328, -393,329,394, -330,394,329, -394,330,395, -331,395,330, -395,331,396, -332,396,331, -396,332,397, -333,397,332, -397,333,398, -334,398,333, -398,334,399, -335,399,334, -399,335,400, -336,400,335, -400,336,401, -337,401,336, -401,337,402, -338,402,337, -402,338,403, -339,403,338, -403,339,404, -340,404,339, -404,340,405, -341,405,340, -405,341,406, -342,406,341, -406,342,407, -343,407,342, -407,343,408, -344,408,343, -408,344,409, -345,409,344, -409,345,410, -346,410,345, -410,346,411, -347,411,346, -411,347,412, -348,412,347, -412,348,413, -349,413,348, -413,349,414, -350,414,349, -414,350,415, -351,415,350, -415,351,416, -352,416,351, -416,352,417, -353,417,352, -417,353,418, -354,418,353, -418,354,419, -355,419,354, -419,355,420, -356,420,355, -420,356,421, -357,421,356, -421,357,422, -358,422,357, -422,358,423, -359,423,358, -423,359,424, -360,424,359, -424,360,425, -361,425,360, -425,361,426, -362,426,361, -426,362,427, -363,427,362, -427,363,428, -364,428,363, -428,364,429, -365,429,364, -429,365,430, -366,430,365, -430,366,431, -367,431,366, -431,367,432, -368,432,367, -432,368,433, -369,433,368, -433,369,434, -370,434,369, -434,370,435, -371,435,370, -435,371,436, -372,436,371, -436,372,437, -373,437,372, -437,373,438, -374,438,373, -438,374,439, -375,439,374, -439,375,440, -376,440,375, -440,376,441, -377,441,376, -441,377,442, -378,442,377, -442,378,443, -379,443,378, -443,379,444, -380,444,379, -444,380,445, -381,445,380, -445,381,446, -382,446,381, -446,382,447, -383,447,382, -448,384,449, -385,449,384, -449,385,450, -386,450,385, -450,386,451, -387,451,386, -451,387,452, -388,452,387, -452,388,453, -389,453,388, -453,389,454, -390,454,389, -454,390,455, -391,455,390, -455,391,456, -392,456,391, -456,392,457, -393,457,392, -457,393,458, -394,458,393, -458,394,459, -395,459,394, -459,395,460, -396,460,395, -460,396,461, -397,461,396, -461,397,462, -398,462,397, -462,398,463, -399,463,398, -463,399,464, -400,464,399, -464,400,465, -401,465,400, -465,401,466, -402,466,401, -466,402,467, -403,467,402, -467,403,468, -404,468,403, -468,404,469, -405,469,404, -469,405,470, -406,470,405, -470,406,471, -407,471,406, -471,407,472, -408,472,407, -472,408,473, -409,473,408, -473,409,474, -410,474,409, -474,410,475, -411,475,410, -475,411,476, -412,476,411, -476,412,477, -413,477,412, -477,413,478, -414,478,413, -478,414,479, -415,479,414, -479,415,480, -416,480,415, -480,416,481, -417,481,416, -481,417,482, -418,482,417, -482,418,483, -419,483,418, -483,419,484, -420,484,419, -484,420,485, -421,485,420, -485,421,486, -422,486,421, -486,422,487, -423,487,422, -487,423,488, -424,488,423, -488,424,489, -425,489,424, -489,425,490, -426,490,425, -490,426,491, -427,491,426, -491,427,492, -428,492,427, -492,428,493, -429,493,428, -493,429,494, -430,494,429, -494,430,495, -431,495,430, -495,431,496, -432,496,431, -496,432,497, -433,497,432, -497,433,498, -434,498,433, -498,434,499, -435,499,434, -499,435,500, -436,500,435, -500,436,501, -437,501,436, -501,437,502, -438,502,437, -502,438,503, -439,503,438, -503,439,504, -440,504,439, -504,440,505, -441,505,440, -505,441,506, -442,506,441, -506,442,507, -443,507,442, -507,443,508, -444,508,443, -508,444,509, -445,509,444, -509,445,510, -446,510,445, -510,446,511, -447,511,446, -512,448,513, -449,513,448, -513,449,514, -450,514,449, -514,450,515, -451,515,450, -515,451,516, -452,516,451, -516,452,517, -453,517,452, -517,453,518, -454,518,453, -518,454,519, -455,519,454, -519,455,520, -456,520,455, -520,456,521, -457,521,456, -521,457,522, -458,522,457, -522,458,523, -459,523,458, -523,459,524, -460,524,459, -524,460,525, -461,525,460, -525,461,526, -462,526,461, -526,462,527, -463,527,462, -527,463,528, -464,528,463, -528,464,529, -465,529,464, -529,465,530, -466,530,465, -530,466,531, -467,531,466, -531,467,532, -468,532,467, -532,468,533, -469,533,468, -533,469,534, -470,534,469, -534,470,535, -471,535,470, -535,471,536, -472,536,471, -536,472,537, -473,537,472, -537,473,538, -474,538,473, -538,474,539, -475,539,474, -539,475,540, -476,540,475, -540,476,541, -477,541,476, -541,477,542, -478,542,477, -542,478,543, -479,543,478, -543,479,544, -480,544,479, -544,480,545, -481,545,480, -545,481,546, -482,546,481, -546,482,547, -483,547,482, -547,483,548, -484,548,483, -548,484,549, -485,549,484, -549,485,550, -486,550,485, -550,486,551, -487,551,486, -551,487,552, -488,552,487, -552,488,553, -489,553,488, -553,489,554, -490,554,489, -554,490,555, -491,555,490, -555,491,556, -492,556,491, -556,492,557, -493,557,492, -557,493,558, -494,558,493, -558,494,559, -495,559,494, -559,495,560, -496,560,495, -560,496,561, -497,561,496, -561,497,562, -498,562,497, -562,498,563, -499,563,498, -563,499,564, -500,564,499, -564,500,565, -501,565,500, -565,501,566, -502,566,501, -566,502,567, -503,567,502, -567,503,568, -504,568,503, -568,504,569, -505,569,504, -569,505,570, -506,570,505, -570,506,571, -507,571,506, -571,507,572, -508,572,507, -572,508,573, -509,573,508, -573,509,574, -510,574,509, -574,510,575, -511,575,510, -576,512,577, -513,577,512, -577,513,578, -514,578,513, -578,514,579, -515,579,514, -579,515,580, -516,580,515, -580,516,581, -517,581,516, -581,517,582, -518,582,517, -582,518,583, -519,583,518, -583,519,584, -520,584,519, -584,520,585, -521,585,520, -585,521,586, -522,586,521, -586,522,587, -523,587,522, -587,523,588, -524,588,523, -588,524,589, -525,589,524, -589,525,590, -526,590,525, -590,526,591, -527,591,526, -591,527,592, -528,592,527, -592,528,593, -529,593,528, -593,529,594, -530,594,529, -594,530,595, -531,595,530, -595,531,596, -532,596,531, -596,532,597, -533,597,532, -597,533,598, -534,598,533, -598,534,599, -535,599,534, -599,535,600, -536,600,535, -600,536,601, -537,601,536, -601,537,602, -538,602,537, -602,538,603, -539,603,538, -603,539,604, -540,604,539, -604,540,605, -541,605,540, -605,541,606, -542,606,541, -606,542,607, -543,607,542, -607,543,608, -544,608,543, -608,544,609, -545,609,544, -609,545,610, -546,610,545, -610,546,611, -547,611,546, -611,547,612, -548,612,547, -612,548,613, -549,613,548, -613,549,614, -550,614,549, -614,550,615, -551,615,550, -615,551,616, -552,616,551, -616,552,617, -553,617,552, -617,553,618, -554,618,553, -618,554,619, -555,619,554, -619,555,620, -556,620,555, -620,556,621, -557,621,556, -621,557,622, -558,622,557, -622,558,623, -559,623,558, -623,559,624, -560,624,559, -624,560,625, -561,625,560, -625,561,626, -562,626,561, -626,562,627, -563,627,562, -627,563,628, -564,628,563, -628,564,629, -565,629,564, -629,565,630, -566,630,565, -630,566,631, -567,631,566, -631,567,632, -568,632,567, -632,568,633, -569,633,568, -633,569,634, -570,634,569, -634,570,635, -571,635,570, -635,571,636, -572,636,571, -636,572,637, -573,637,572, -637,573,638, -574,638,573, -638,574,639, -575,639,574, -640,576,641, -577,641,576, -641,577,642, -578,642,577, -642,578,643, -579,643,578, -643,579,644, -580,644,579, -644,580,645, -581,645,580, -645,581,646, -582,646,581, -646,582,647, -583,647,582, -647,583,648, -584,648,583, -648,584,649, -585,649,584, -649,585,650, -586,650,585, -650,586,651, -587,651,586, -651,587,652, -588,652,587, -652,588,653, -589,653,588, -653,589,654, -590,654,589, -654,590,655, -591,655,590, -655,591,656, -592,656,591, -656,592,657, -593,657,592, -657,593,658, -594,658,593, -658,594,659, -595,659,594, -659,595,660, -596,660,595, -660,596,661, -597,661,596, -661,597,662, -598,662,597, -662,598,663, -599,663,598, -663,599,664, -600,664,599, -664,600,665, -601,665,600, -665,601,666, -602,666,601, -666,602,667, -603,667,602, -667,603,668, -604,668,603, -668,604,669, -605,669,604, -669,605,670, -606,670,605, -670,606,671, -607,671,606, -671,607,672, -608,672,607, -672,608,673, -609,673,608, -673,609,674, -610,674,609, -674,610,675, -611,675,610, -675,611,676, -612,676,611, -676,612,677, -613,677,612, -677,613,678, -614,678,613, -678,614,679, -615,679,614, -679,615,680, -616,680,615, -680,616,681, -617,681,616, -681,617,682, -618,682,617, -682,618,683, -619,683,618, -683,619,684, -620,684,619, -684,620,685, -621,685,620, -685,621,686, -622,686,621, -686,622,687, -623,687,622, -687,623,688, -624,688,623, -688,624,689, -625,689,624, -689,625,690, -626,690,625, -690,626,691, -627,691,626, -691,627,692, -628,692,627, -692,628,693, -629,693,628, -693,629,694, -630,694,629, -694,630,695, -631,695,630, -695,631,696, -632,696,631, -696,632,697, -633,697,632, -697,633,698, -634,698,633, -698,634,699, -635,699,634, -699,635,700, -636,700,635, -700,636,701, -637,701,636, -701,637,702, -638,702,637, -702,638,703, -639,703,638, -704,640,705, -641,705,640, -705,641,706, -642,706,641, -706,642,707, -643,707,642, -707,643,708, -644,708,643, -708,644,709, -645,709,644, -709,645,710, -646,710,645, -710,646,711, -647,711,646, -711,647,712, -648,712,647, -712,648,713, -649,713,648, -713,649,714, -650,714,649, -714,650,715, -651,715,650, -715,651,716, -652,716,651, -716,652,717, -653,717,652, -717,653,718, -654,718,653, -718,654,719, -655,719,654, -719,655,720, -656,720,655, -720,656,721, -657,721,656, -721,657,722, -658,722,657, -722,658,723, -659,723,658, -723,659,724, -660,724,659, -724,660,725, -661,725,660, -725,661,726, -662,726,661, -726,662,727, -663,727,662, -727,663,728, -664,728,663, -728,664,729, -665,729,664, -729,665,730, -666,730,665, -730,666,731, -667,731,666, -731,667,732, -668,732,667, -732,668,733, -669,733,668, -733,669,734, -670,734,669, -734,670,735, -671,735,670, -735,671,736, -672,736,671, -736,672,737, -673,737,672, -737,673,738, -674,738,673, -738,674,739, -675,739,674, -739,675,740, -676,740,675, -740,676,741, -677,741,676, -741,677,742, -678,742,677, -742,678,743, -679,743,678, -743,679,744, -680,744,679, -744,680,745, -681,745,680, -745,681,746, -682,746,681, -746,682,747, -683,747,682, -747,683,748, -684,748,683, -748,684,749, -685,749,684, -749,685,750, -686,750,685, -750,686,751, -687,751,686, -751,687,752, -688,752,687, -752,688,753, -689,753,688, -753,689,754, -690,754,689, -754,690,755, -691,755,690, -755,691,756, -692,756,691, -756,692,757, -693,757,692, -757,693,758, -694,758,693, -758,694,759, -695,759,694, -759,695,760, -696,760,695, -760,696,761, -697,761,696, -761,697,762, -698,762,697, -762,698,763, -699,763,698, -763,699,764, -700,764,699, -764,700,765, -701,765,700, -765,701,766, -702,766,701, -766,702,767, -703,767,702, -768,704,769, -705,769,704, -769,705,770, -706,770,705, -770,706,771, -707,771,706, -771,707,772, -708,772,707, -772,708,773, -709,773,708, -773,709,774, -710,774,709, -774,710,775, -711,775,710, -775,711,776, -712,776,711, -776,712,777, -713,777,712, -777,713,778, -714,778,713, -778,714,779, -715,779,714, -779,715,780, -716,780,715, -780,716,781, -717,781,716, -781,717,782, -718,782,717, -782,718,783, -719,783,718, -783,719,784, -720,784,719, -784,720,785, -721,785,720, -785,721,786, -722,786,721, -786,722,787, -723,787,722, -787,723,788, -724,788,723, -788,724,789, -725,789,724, -789,725,790, -726,790,725, -790,726,791, -727,791,726, -791,727,792, -728,792,727, -792,728,793, -729,793,728, -793,729,794, -730,794,729, -794,730,795, -731,795,730, -795,731,796, -732,796,731, -796,732,797, -733,797,732, -797,733,798, -734,798,733, -798,734,799, -735,799,734, -799,735,800, -736,800,735, -800,736,801, -737,801,736, -801,737,802, -738,802,737, -802,738,803, -739,803,738, -803,739,804, -740,804,739, -804,740,805, -741,805,740, -805,741,806, -742,806,741, -806,742,807, -743,807,742, -807,743,808, -744,808,743, -808,744,809, -745,809,744, -809,745,810, -746,810,745, -810,746,811, -747,811,746, -811,747,812, -748,812,747, -812,748,813, -749,813,748, -813,749,814, -750,814,749, -814,750,815, -751,815,750, -815,751,816, -752,816,751, -816,752,817, -753,817,752, -817,753,818, -754,818,753, -818,754,819, -755,819,754, -819,755,820, -756,820,755, -820,756,821, -757,821,756, -821,757,822, -758,822,757, -822,758,823, -759,823,758, -823,759,824, -760,824,759, -824,760,825, -761,825,760, -825,761,826, -762,826,761, -826,762,827, -763,827,762, -827,763,828, -764,828,763, -828,764,829, -765,829,764, -829,765,830, -766,830,765, -830,766,831, -767,831,766, -832,768,833, -769,833,768, -833,769,834, -770,834,769, -834,770,835, -771,835,770, -835,771,836, -772,836,771, -836,772,837, -773,837,772, -837,773,838, -774,838,773, -838,774,839, -775,839,774, -839,775,840, -776,840,775, -840,776,841, -777,841,776, -841,777,842, -778,842,777, -842,778,843, -779,843,778, -843,779,844, -780,844,779, -844,780,845, -781,845,780, -845,781,846, -782,846,781, -846,782,847, -783,847,782, -847,783,848, -784,848,783, -848,784,849, -785,849,784, -849,785,850, -786,850,785, -850,786,851, -787,851,786, -851,787,852, -788,852,787, -852,788,853, -789,853,788, -853,789,854, -790,854,789, -854,790,855, -791,855,790, -855,791,856, -792,856,791, -856,792,857, -793,857,792, -857,793,858, -794,858,793, -858,794,859, -795,859,794, -859,795,860, -796,860,795, -860,796,861, -797,861,796, -861,797,862, -798,862,797, -862,798,863, -799,863,798, -863,799,864, -800,864,799, -864,800,865, -801,865,800, -865,801,866, -802,866,801, -866,802,867, -803,867,802, -867,803,868, -804,868,803, -868,804,869, -805,869,804, -869,805,870, -806,870,805, -870,806,871, -807,871,806, -871,807,872, -808,872,807, -872,808,873, -809,873,808, -873,809,874, -810,874,809, -874,810,875, -811,875,810, -875,811,876, -812,876,811, -876,812,877, -813,877,812, -877,813,878, -814,878,813, -878,814,879, -815,879,814, -879,815,880, -816,880,815, -880,816,881, -817,881,816, -881,817,882, -818,882,817, -882,818,883, -819,883,818, -883,819,884, -820,884,819, -884,820,885, -821,885,820, -885,821,886, -822,886,821, -886,822,887, -823,887,822, -887,823,888, -824,888,823, -888,824,889, -825,889,824, -889,825,890, -826,890,825, -890,826,891, -827,891,826, -891,827,892, -828,892,827, -892,828,893, -829,893,828, -893,829,894, -830,894,829, -894,830,895, -831,895,830, -896,832,897, -833,897,832, -897,833,898, -834,898,833, -898,834,899, -835,899,834, -899,835,900, -836,900,835, -900,836,901, -837,901,836, -901,837,902, -838,902,837, -902,838,903, -839,903,838, -903,839,904, -840,904,839, -904,840,905, -841,905,840, -905,841,906, -842,906,841, -906,842,907, -843,907,842, -907,843,908, -844,908,843, -908,844,909, -845,909,844, -909,845,910, -846,910,845, -910,846,911, -847,911,846, -911,847,912, -848,912,847, -912,848,913, -849,913,848, -913,849,914, -850,914,849, -914,850,915, -851,915,850, -915,851,916, -852,916,851, -916,852,917, -853,917,852, -917,853,918, -854,918,853, -918,854,919, -855,919,854, -919,855,920, -856,920,855, -920,856,921, -857,921,856, -921,857,922, -858,922,857, -922,858,923, -859,923,858, -923,859,924, -860,924,859, -924,860,925, -861,925,860, -925,861,926, -862,926,861, -926,862,927, -863,927,862, -927,863,928, -864,928,863, -928,864,929, -865,929,864, -929,865,930, -866,930,865, -930,866,931, -867,931,866, -931,867,932, -868,932,867, -932,868,933, -869,933,868, -933,869,934, -870,934,869, -934,870,935, -871,935,870, -935,871,936, -872,936,871, -936,872,937, -873,937,872, -937,873,938, -874,938,873, -938,874,939, -875,939,874, -939,875,940, -876,940,875, -940,876,941, -877,941,876, -941,877,942, -878,942,877, -942,878,943, -879,943,878, -943,879,944, -880,944,879, -944,880,945, -881,945,880, -945,881,946, -882,946,881, -946,882,947, -883,947,882, -947,883,948, -884,948,883, -948,884,949, -885,949,884, -949,885,950, -886,950,885, -950,886,951, -887,951,886, -951,887,952, -888,952,887, -952,888,953, -889,953,888, -953,889,954, -890,954,889, -954,890,955, -891,955,890, -955,891,956, -892,956,891, -956,892,957, -893,957,892, -957,893,958, -894,958,893, -958,894,959, -895,959,894, -960,896,961, -897,961,896, -961,897,962, -898,962,897, -962,898,963, -899,963,898, -963,899,964, -900,964,899, -964,900,965, -901,965,900, -965,901,966, -902,966,901, -966,902,967, -903,967,902, -967,903,968, -904,968,903, -968,904,969, -905,969,904, -969,905,970, -906,970,905, -970,906,971, -907,971,906, -971,907,972, -908,972,907, -972,908,973, -909,973,908, -973,909,974, -910,974,909, -974,910,975, -911,975,910, -975,911,976, -912,976,911, -976,912,977, -913,977,912, -977,913,978, -914,978,913, -978,914,979, -915,979,914, -979,915,980, -916,980,915, -980,916,981, -917,981,916, -981,917,982, -918,982,917, -982,918,983, -919,983,918, -983,919,984, -920,984,919, -984,920,985, -921,985,920, -985,921,986, -922,986,921, -986,922,987, -923,987,922, -987,923,988, -924,988,923, -988,924,989, -925,989,924, -989,925,990, -926,990,925, -990,926,991, -927,991,926, -991,927,992, -928,992,927, -992,928,993, -929,993,928, -993,929,994, -930,994,929, -994,930,995, -931,995,930, -995,931,996, -932,996,931, -996,932,997, -933,997,932, -997,933,998, -934,998,933, -998,934,999, -935,999,934, -999,935,1000, -936,1000,935, -1000,936,1001, -937,1001,936, -1001,937,1002, -938,1002,937, -1002,938,1003, -939,1003,938, -1003,939,1004, -940,1004,939, -1004,940,1005, -941,1005,940, -1005,941,1006, -942,1006,941, -1006,942,1007, -943,1007,942, -1007,943,1008, -944,1008,943, -1008,944,1009, -945,1009,944, -1009,945,1010, -946,1010,945, -1010,946,1011, -947,1011,946, -1011,947,1012, -948,1012,947, -1012,948,1013, -949,1013,948, -1013,949,1014, -950,1014,949, -1014,950,1015, -951,1015,950, -1015,951,1016, -952,1016,951, -1016,952,1017, -953,1017,952, -1017,953,1018, -954,1018,953, -1018,954,1019, -955,1019,954, -1019,955,1020, -956,1020,955, -1020,956,1021, -957,1021,956, -1021,957,1022, -958,1022,957, -1022,958,1023, -959,1023,958, -1024,960,1025, -961,1025,960, -1025,961,1026, -962,1026,961, -1026,962,1027, -963,1027,962, -1027,963,1028, -964,1028,963, -1028,964,1029, -965,1029,964, -1029,965,1030, -966,1030,965, -1030,966,1031, -967,1031,966, -1031,967,1032, -968,1032,967, -1032,968,1033, -969,1033,968, -1033,969,1034, -970,1034,969, -1034,970,1035, -971,1035,970, -1035,971,1036, -972,1036,971, -1036,972,1037, -973,1037,972, -1037,973,1038, -974,1038,973, -1038,974,1039, -975,1039,974, -1039,975,1040, -976,1040,975, -1040,976,1041, -977,1041,976, -1041,977,1042, -978,1042,977, -1042,978,1043, -979,1043,978, -1043,979,1044, -980,1044,979, -1044,980,1045, -981,1045,980, -1045,981,1046, -982,1046,981, -1046,982,1047, -983,1047,982, -1047,983,1048, -984,1048,983, -1048,984,1049, -985,1049,984, -1049,985,1050, -986,1050,985, -1050,986,1051, -987,1051,986, -1051,987,1052, -988,1052,987, -1052,988,1053, -989,1053,988, -1053,989,1054, -990,1054,989, -1054,990,1055, -991,1055,990, -1055,991,1056, -992,1056,991, -1056,992,1057, -993,1057,992, -1057,993,1058, -994,1058,993, -1058,994,1059, -995,1059,994, -1059,995,1060, -996,1060,995, -1060,996,1061, -997,1061,996, -1061,997,1062, -998,1062,997, -1062,998,1063, -999,1063,998, -1063,999,1064, -1000,1064,999, -1064,1000,1065, -1001,1065,1000, -1065,1001,1066, -1002,1066,1001, -1066,1002,1067, -1003,1067,1002, -1067,1003,1068, -1004,1068,1003, -1068,1004,1069, -1005,1069,1004, -1069,1005,1070, -1006,1070,1005, -1070,1006,1071, -1007,1071,1006, -1071,1007,1072, -1008,1072,1007, -1072,1008,1073, -1009,1073,1008, -1073,1009,1074, -1010,1074,1009, -1074,1010,1075, -1011,1075,1010, -1075,1011,1076, -1012,1076,1011, -1076,1012,1077, -1013,1077,1012, -1077,1013,1078, -1014,1078,1013, -1078,1014,1079, -1015,1079,1014, -1079,1015,1080, -1016,1080,1015, -1080,1016,1081, -1017,1081,1016, -1081,1017,1082, -1018,1082,1017, -1082,1018,1083, -1019,1083,1018, -1083,1019,1084, -1020,1084,1019, -1084,1020,1085, -1021,1085,1020, -1085,1021,1086, -1022,1086,1021, -1086,1022,1087, -1023,1087,1022, -1088,1024,1089, -1025,1089,1024, -1089,1025,1090, -1026,1090,1025, -1090,1026,1091, -1027,1091,1026, -1091,1027,1092, -1028,1092,1027, -1092,1028,1093, -1029,1093,1028, -1093,1029,1094, -1030,1094,1029, -1094,1030,1095, -1031,1095,1030, -1095,1031,1096, -1032,1096,1031, -1096,1032,1097, -1033,1097,1032, -1097,1033,1098, -1034,1098,1033, -1098,1034,1099, -1035,1099,1034, -1099,1035,1100, -1036,1100,1035, -1100,1036,1101, -1037,1101,1036, -1101,1037,1102, -1038,1102,1037, -1102,1038,1103, -1039,1103,1038, -1103,1039,1104, -1040,1104,1039, -1104,1040,1105, -1041,1105,1040, -1105,1041,1106, -1042,1106,1041, -1106,1042,1107, -1043,1107,1042, -1107,1043,1108, -1044,1108,1043, -1108,1044,1109, -1045,1109,1044, -1109,1045,1110, -1046,1110,1045, -1110,1046,1111, -1047,1111,1046, -1111,1047,1112, -1048,1112,1047, -1112,1048,1113, -1049,1113,1048, -1113,1049,1114, -1050,1114,1049, -1114,1050,1115, -1051,1115,1050, -1115,1051,1116, -1052,1116,1051, -1116,1052,1117, -1053,1117,1052, -1117,1053,1118, -1054,1118,1053, -1118,1054,1119, -1055,1119,1054, -1119,1055,1120, -1056,1120,1055, -1120,1056,1121, -1057,1121,1056, -1121,1057,1122, -1058,1122,1057, -1122,1058,1123, -1059,1123,1058, -1123,1059,1124, -1060,1124,1059, -1124,1060,1125, -1061,1125,1060, -1125,1061,1126, -1062,1126,1061, -1126,1062,1127, -1063,1127,1062, -1127,1063,1128, -1064,1128,1063, -1128,1064,1129, -1065,1129,1064, -1129,1065,1130, -1066,1130,1065, -1130,1066,1131, -1067,1131,1066, -1131,1067,1132, -1068,1132,1067, -1132,1068,1133, -1069,1133,1068, -1133,1069,1134, -1070,1134,1069, -1134,1070,1135, -1071,1135,1070, -1135,1071,1136, -1072,1136,1071, -1136,1072,1137, -1073,1137,1072, -1137,1073,1138, -1074,1138,1073, -1138,1074,1139, -1075,1139,1074, -1139,1075,1140, -1076,1140,1075, -1140,1076,1141, -1077,1141,1076, -1141,1077,1142, -1078,1142,1077, -1142,1078,1143, -1079,1143,1078, -1143,1079,1144, -1080,1144,1079, -1144,1080,1145, -1081,1145,1080, -1145,1081,1146, -1082,1146,1081, -1146,1082,1147, -1083,1147,1082, -1147,1083,1148, -1084,1148,1083, -1148,1084,1149, -1085,1149,1084, -1149,1085,1150, -1086,1150,1085, -1150,1086,1151, -1087,1151,1086, -1152,1088,1153, -1089,1153,1088, -1153,1089,1154, -1090,1154,1089, -1154,1090,1155, -1091,1155,1090, -1155,1091,1156, -1092,1156,1091, -1156,1092,1157, -1093,1157,1092, -1157,1093,1158, -1094,1158,1093, -1158,1094,1159, -1095,1159,1094, -1159,1095,1160, -1096,1160,1095, -1160,1096,1161, -1097,1161,1096, -1161,1097,1162, -1098,1162,1097, -1162,1098,1163, -1099,1163,1098, -1163,1099,1164, -1100,1164,1099, -1164,1100,1165, -1101,1165,1100, -1165,1101,1166, -1102,1166,1101, -1166,1102,1167, -1103,1167,1102, -1167,1103,1168, -1104,1168,1103, -1168,1104,1169, -1105,1169,1104, -1169,1105,1170, -1106,1170,1105, -1170,1106,1171, -1107,1171,1106, -1171,1107,1172, -1108,1172,1107, -1172,1108,1173, -1109,1173,1108, -1173,1109,1174, -1110,1174,1109, -1174,1110,1175, -1111,1175,1110, -1175,1111,1176, -1112,1176,1111, -1176,1112,1177, -1113,1177,1112, -1177,1113,1178, -1114,1178,1113, -1178,1114,1179, -1115,1179,1114, -1179,1115,1180, -1116,1180,1115, -1180,1116,1181, -1117,1181,1116, -1181,1117,1182, -1118,1182,1117, -1182,1118,1183, -1119,1183,1118, -1183,1119,1184, -1120,1184,1119, -1184,1120,1185, -1121,1185,1120, -1185,1121,1186, -1122,1186,1121, -1186,1122,1187, -1123,1187,1122, -1187,1123,1188, -1124,1188,1123, -1188,1124,1189, -1125,1189,1124, -1189,1125,1190, -1126,1190,1125, -1190,1126,1191, -1127,1191,1126, -1191,1127,1192, -1128,1192,1127, -1192,1128,1193, -1129,1193,1128, -1193,1129,1194, -1130,1194,1129, -1194,1130,1195, -1131,1195,1130, -1195,1131,1196, -1132,1196,1131, -1196,1132,1197, -1133,1197,1132, -1197,1133,1198, -1134,1198,1133, -1198,1134,1199, -1135,1199,1134, -1199,1135,1200, -1136,1200,1135, -1200,1136,1201, -1137,1201,1136, -1201,1137,1202, -1138,1202,1137, -1202,1138,1203, -1139,1203,1138, -1203,1139,1204, -1140,1204,1139, -1204,1140,1205, -1141,1205,1140, -1205,1141,1206, -1142,1206,1141, -1206,1142,1207, -1143,1207,1142, -1207,1143,1208, -1144,1208,1143, -1208,1144,1209, -1145,1209,1144, -1209,1145,1210, -1146,1210,1145, -1210,1146,1211, -1147,1211,1146, -1211,1147,1212, -1148,1212,1147, -1212,1148,1213, -1149,1213,1148, -1213,1149,1214, -1150,1214,1149, -1214,1150,1215, -1151,1215,1150, -1216,1152,1217, -1153,1217,1152, -1217,1153,1218, -1154,1218,1153, -1218,1154,1219, -1155,1219,1154, -1219,1155,1220, -1156,1220,1155, -1220,1156,1221, -1157,1221,1156, -1221,1157,1222, -1158,1222,1157, -1222,1158,1223, -1159,1223,1158, -1223,1159,1224, -1160,1224,1159, -1224,1160,1225, -1161,1225,1160, -1225,1161,1226, -1162,1226,1161, -1226,1162,1227, -1163,1227,1162, -1227,1163,1228, -1164,1228,1163, -1228,1164,1229, -1165,1229,1164, -1229,1165,1230, -1166,1230,1165, -1230,1166,1231, -1167,1231,1166, -1231,1167,1232, -1168,1232,1167, -1232,1168,1233, -1169,1233,1168, -1233,1169,1234, -1170,1234,1169, -1234,1170,1235, -1171,1235,1170, -1235,1171,1236, -1172,1236,1171, -1236,1172,1237, -1173,1237,1172, -1237,1173,1238, -1174,1238,1173, -1238,1174,1239, -1175,1239,1174, -1239,1175,1240, -1176,1240,1175, -1240,1176,1241, -1177,1241,1176, -1241,1177,1242, -1178,1242,1177, -1242,1178,1243, -1179,1243,1178, -1243,1179,1244, -1180,1244,1179, -1244,1180,1245, -1181,1245,1180, -1245,1181,1246, -1182,1246,1181, -1246,1182,1247, -1183,1247,1182, -1247,1183,1248, -1184,1248,1183, -1248,1184,1249, -1185,1249,1184, -1249,1185,1250, -1186,1250,1185, -1250,1186,1251, -1187,1251,1186, -1251,1187,1252, -1188,1252,1187, -1252,1188,1253, -1189,1253,1188, -1253,1189,1254, -1190,1254,1189, -1254,1190,1255, -1191,1255,1190, -1255,1191,1256, -1192,1256,1191, -1256,1192,1257, -1193,1257,1192, -1257,1193,1258, -1194,1258,1193, -1258,1194,1259, -1195,1259,1194, -1259,1195,1260, -1196,1260,1195, -1260,1196,1261, -1197,1261,1196, -1261,1197,1262, -1198,1262,1197, -1262,1198,1263, -1199,1263,1198, -1263,1199,1264, -1200,1264,1199, -1264,1200,1265, -1201,1265,1200, -1265,1201,1266, -1202,1266,1201, -1266,1202,1267, -1203,1267,1202, -1267,1203,1268, -1204,1268,1203, -1268,1204,1269, -1205,1269,1204, -1269,1205,1270, -1206,1270,1205, -1270,1206,1271, -1207,1271,1206, -1271,1207,1272, -1208,1272,1207, -1272,1208,1273, -1209,1273,1208, -1273,1209,1274, -1210,1274,1209, -1274,1210,1275, -1211,1275,1210, -1275,1211,1276, -1212,1276,1211, -1276,1212,1277, -1213,1277,1212, -1277,1213,1278, -1214,1278,1213, -1278,1214,1279, -1215,1279,1214, -1280,1216,1281, -1217,1281,1216, -1281,1217,1282, -1218,1282,1217, -1282,1218,1283, -1219,1283,1218, -1283,1219,1284, -1220,1284,1219, -1284,1220,1285, -1221,1285,1220, -1285,1221,1286, -1222,1286,1221, -1286,1222,1287, -1223,1287,1222, -1287,1223,1288, -1224,1288,1223, -1288,1224,1289, -1225,1289,1224, -1289,1225,1290, -1226,1290,1225, -1290,1226,1291, -1227,1291,1226, -1291,1227,1292, -1228,1292,1227, -1292,1228,1293, -1229,1293,1228, -1293,1229,1294, -1230,1294,1229, -1294,1230,1295, -1231,1295,1230, -1295,1231,1296, -1232,1296,1231, -1296,1232,1297, -1233,1297,1232, -1297,1233,1298, -1234,1298,1233, -1298,1234,1299, -1235,1299,1234, -1299,1235,1300, -1236,1300,1235, -1300,1236,1301, -1237,1301,1236, -1301,1237,1302, -1238,1302,1237, -1302,1238,1303, -1239,1303,1238, -1303,1239,1304, -1240,1304,1239, -1304,1240,1305, -1241,1305,1240, -1305,1241,1306, -1242,1306,1241, -1306,1242,1307, -1243,1307,1242, -1307,1243,1308, -1244,1308,1243, -1308,1244,1309, -1245,1309,1244, -1309,1245,1310, -1246,1310,1245, -1310,1246,1311, -1247,1311,1246, -1311,1247,1312, -1248,1312,1247, -1312,1248,1313, -1249,1313,1248, -1313,1249,1314, -1250,1314,1249, -1314,1250,1315, -1251,1315,1250, -1315,1251,1316, -1252,1316,1251, -1316,1252,1317, -1253,1317,1252, -1317,1253,1318, -1254,1318,1253, -1318,1254,1319, -1255,1319,1254, -1319,1255,1320, -1256,1320,1255, -1320,1256,1321, -1257,1321,1256, -1321,1257,1322, -1258,1322,1257, -1322,1258,1323, -1259,1323,1258, -1323,1259,1324, -1260,1324,1259, -1324,1260,1325, -1261,1325,1260, -1325,1261,1326, -1262,1326,1261, -1326,1262,1327, -1263,1327,1262, -1327,1263,1328, -1264,1328,1263, -1328,1264,1329, -1265,1329,1264, -1329,1265,1330, -1266,1330,1265, -1330,1266,1331, -1267,1331,1266, -1331,1267,1332, -1268,1332,1267, -1332,1268,1333, -1269,1333,1268, -1333,1269,1334, -1270,1334,1269, -1334,1270,1335, -1271,1335,1270, -1335,1271,1336, -1272,1336,1271, -1336,1272,1337, -1273,1337,1272, -1337,1273,1338, -1274,1338,1273, -1338,1274,1339, -1275,1339,1274, -1339,1275,1340, -1276,1340,1275, -1340,1276,1341, -1277,1341,1276, -1341,1277,1342, -1278,1342,1277, -1342,1278,1343, -1279,1343,1278, -1344,1280,1345, -1281,1345,1280, -1345,1281,1346, -1282,1346,1281, -1346,1282,1347, -1283,1347,1282, -1347,1283,1348, -1284,1348,1283, -1348,1284,1349, -1285,1349,1284, -1349,1285,1350, -1286,1350,1285, -1350,1286,1351, -1287,1351,1286, -1351,1287,1352, -1288,1352,1287, -1352,1288,1353, -1289,1353,1288, -1353,1289,1354, -1290,1354,1289, -1354,1290,1355, -1291,1355,1290, -1355,1291,1356, -1292,1356,1291, -1356,1292,1357, -1293,1357,1292, -1357,1293,1358, -1294,1358,1293, -1358,1294,1359, -1295,1359,1294, -1359,1295,1360, -1296,1360,1295, -1360,1296,1361, -1297,1361,1296, -1361,1297,1362, -1298,1362,1297, -1362,1298,1363, -1299,1363,1298, -1363,1299,1364, -1300,1364,1299, -1364,1300,1365, -1301,1365,1300, -1365,1301,1366, -1302,1366,1301, -1366,1302,1367, -1303,1367,1302, -1367,1303,1368, -1304,1368,1303, -1368,1304,1369, -1305,1369,1304, -1369,1305,1370, -1306,1370,1305, -1370,1306,1371, -1307,1371,1306, -1371,1307,1372, -1308,1372,1307, -1372,1308,1373, -1309,1373,1308, -1373,1309,1374, -1310,1374,1309, -1374,1310,1375, -1311,1375,1310, -1375,1311,1376, -1312,1376,1311, -1376,1312,1377, -1313,1377,1312, -1377,1313,1378, -1314,1378,1313, -1378,1314,1379, -1315,1379,1314, -1379,1315,1380, -1316,1380,1315, -1380,1316,1381, -1317,1381,1316, -1381,1317,1382, -1318,1382,1317, -1382,1318,1383, -1319,1383,1318, -1383,1319,1384, -1320,1384,1319, -1384,1320,1385, -1321,1385,1320, -1385,1321,1386, -1322,1386,1321, -1386,1322,1387, -1323,1387,1322, -1387,1323,1388, -1324,1388,1323, -1388,1324,1389, -1325,1389,1324, -1389,1325,1390, -1326,1390,1325, -1390,1326,1391, -1327,1391,1326, -1391,1327,1392, -1328,1392,1327, -1392,1328,1393, -1329,1393,1328, -1393,1329,1394, -1330,1394,1329, -1394,1330,1395, -1331,1395,1330, -1395,1331,1396, -1332,1396,1331, -1396,1332,1397, -1333,1397,1332, -1397,1333,1398, -1334,1398,1333, -1398,1334,1399, -1335,1399,1334, -1399,1335,1400, -1336,1400,1335, -1400,1336,1401, -1337,1401,1336, -1401,1337,1402, -1338,1402,1337, -1402,1338,1403, -1339,1403,1338, -1403,1339,1404, -1340,1404,1339, -1404,1340,1405, -1341,1405,1340, -1405,1341,1406, -1342,1406,1341, -1406,1342,1407, -1343,1407,1342, -1408,1344,1409, -1345,1409,1344, -1409,1345,1410, -1346,1410,1345, -1410,1346,1411, -1347,1411,1346, -1411,1347,1412, -1348,1412,1347, -1412,1348,1413, -1349,1413,1348, -1413,1349,1414, -1350,1414,1349, -1414,1350,1415, -1351,1415,1350, -1415,1351,1416, -1352,1416,1351, -1416,1352,1417, -1353,1417,1352, -1417,1353,1418, -1354,1418,1353, -1418,1354,1419, -1355,1419,1354, -1419,1355,1420, -1356,1420,1355, -1420,1356,1421, -1357,1421,1356, -1421,1357,1422, -1358,1422,1357, -1422,1358,1423, -1359,1423,1358, -1423,1359,1424, -1360,1424,1359, -1424,1360,1425, -1361,1425,1360, -1425,1361,1426, -1362,1426,1361, -1426,1362,1427, -1363,1427,1362, -1427,1363,1428, -1364,1428,1363, -1428,1364,1429, -1365,1429,1364, -1429,1365,1430, -1366,1430,1365, -1430,1366,1431, -1367,1431,1366, -1431,1367,1432, -1368,1432,1367, -1432,1368,1433, -1369,1433,1368, -1433,1369,1434, -1370,1434,1369, -1434,1370,1435, -1371,1435,1370, -1435,1371,1436, -1372,1436,1371, -1436,1372,1437, -1373,1437,1372, -1437,1373,1438, -1374,1438,1373, -1438,1374,1439, -1375,1439,1374, -1439,1375,1440, -1376,1440,1375, -1440,1376,1441, -1377,1441,1376, -1441,1377,1442, -1378,1442,1377, -1442,1378,1443, -1379,1443,1378, -1443,1379,1444, -1380,1444,1379, -1444,1380,1445, -1381,1445,1380, -1445,1381,1446, -1382,1446,1381, -1446,1382,1447, -1383,1447,1382, -1447,1383,1448, -1384,1448,1383, -1448,1384,1449, -1385,1449,1384, -1449,1385,1450, -1386,1450,1385, -1450,1386,1451, -1387,1451,1386, -1451,1387,1452, -1388,1452,1387, -1452,1388,1453, -1389,1453,1388, -1453,1389,1454, -1390,1454,1389, -1454,1390,1455, -1391,1455,1390, -1455,1391,1456, -1392,1456,1391, -1456,1392,1457, -1393,1457,1392, -1457,1393,1458, -1394,1458,1393, -1458,1394,1459, -1395,1459,1394, -1459,1395,1460, -1396,1460,1395, -1460,1396,1461, -1397,1461,1396, -1461,1397,1462, -1398,1462,1397, -1462,1398,1463, -1399,1463,1398, -1463,1399,1464, -1400,1464,1399, -1464,1400,1465, -1401,1465,1400, -1465,1401,1466, -1402,1466,1401, -1466,1402,1467, -1403,1467,1402, -1467,1403,1468, -1404,1468,1403, -1468,1404,1469, -1405,1469,1404, -1469,1405,1470, -1406,1470,1405, -1470,1406,1471, -1407,1471,1406, -1472,1408,1473, -1409,1473,1408, -1473,1409,1474, -1410,1474,1409, -1474,1410,1475, -1411,1475,1410, -1475,1411,1476, -1412,1476,1411, -1476,1412,1477, -1413,1477,1412, -1477,1413,1478, -1414,1478,1413, -1478,1414,1479, -1415,1479,1414, -1479,1415,1480, -1416,1480,1415, -1480,1416,1481, -1417,1481,1416, -1481,1417,1482, -1418,1482,1417, -1482,1418,1483, -1419,1483,1418, -1483,1419,1484, -1420,1484,1419, -1484,1420,1485, -1421,1485,1420, -1485,1421,1486, -1422,1486,1421, -1486,1422,1487, -1423,1487,1422, -1487,1423,1488, -1424,1488,1423, -1488,1424,1489, -1425,1489,1424, -1489,1425,1490, -1426,1490,1425, -1490,1426,1491, -1427,1491,1426, -1491,1427,1492, -1428,1492,1427, -1492,1428,1493, -1429,1493,1428, -1493,1429,1494, -1430,1494,1429, -1494,1430,1495, -1431,1495,1430, -1495,1431,1496, -1432,1496,1431, -1496,1432,1497, -1433,1497,1432, -1497,1433,1498, -1434,1498,1433, -1498,1434,1499, -1435,1499,1434, -1499,1435,1500, -1436,1500,1435, -1500,1436,1501, -1437,1501,1436, -1501,1437,1502, -1438,1502,1437, -1502,1438,1503, -1439,1503,1438, -1503,1439,1504, -1440,1504,1439, -1504,1440,1505, -1441,1505,1440, -1505,1441,1506, -1442,1506,1441, -1506,1442,1507, -1443,1507,1442, -1507,1443,1508, -1444,1508,1443, -1508,1444,1509, -1445,1509,1444, -1509,1445,1510, -1446,1510,1445, -1510,1446,1511, -1447,1511,1446, -1511,1447,1512, -1448,1512,1447, -1512,1448,1513, -1449,1513,1448, -1513,1449,1514, -1450,1514,1449, -1514,1450,1515, -1451,1515,1450, -1515,1451,1516, -1452,1516,1451, -1516,1452,1517, -1453,1517,1452, -1517,1453,1518, -1454,1518,1453, -1518,1454,1519, -1455,1519,1454, -1519,1455,1520, -1456,1520,1455, -1520,1456,1521, -1457,1521,1456, -1521,1457,1522, -1458,1522,1457, -1522,1458,1523, -1459,1523,1458, -1523,1459,1524, -1460,1524,1459, -1524,1460,1525, -1461,1525,1460, -1525,1461,1526, -1462,1526,1461, -1526,1462,1527, -1463,1527,1462, -1527,1463,1528, -1464,1528,1463, -1528,1464,1529, -1465,1529,1464, -1529,1465,1530, -1466,1530,1465, -1530,1466,1531, -1467,1531,1466, -1531,1467,1532, -1468,1532,1467, -1532,1468,1533, -1469,1533,1468, -1533,1469,1534, -1470,1534,1469, -1534,1470,1535, -1471,1535,1470, -1536,1472,1537, -1473,1537,1472, -1537,1473,1538, -1474,1538,1473, -1538,1474,1539, -1475,1539,1474, -1539,1475,1540, -1476,1540,1475, -1540,1476,1541, -1477,1541,1476, -1541,1477,1542, -1478,1542,1477, -1542,1478,1543, -1479,1543,1478, -1543,1479,1544, -1480,1544,1479, -1544,1480,1545, -1481,1545,1480, -1545,1481,1546, -1482,1546,1481, -1546,1482,1547, -1483,1547,1482, -1547,1483,1548, -1484,1548,1483, -1548,1484,1549, -1485,1549,1484, -1549,1485,1550, -1486,1550,1485, -1550,1486,1551, -1487,1551,1486, -1551,1487,1552, -1488,1552,1487, -1552,1488,1553, -1489,1553,1488, -1553,1489,1554, -1490,1554,1489, -1554,1490,1555, -1491,1555,1490, -1555,1491,1556, -1492,1556,1491, -1556,1492,1557, -1493,1557,1492, -1557,1493,1558, -1494,1558,1493, -1558,1494,1559, -1495,1559,1494, -1559,1495,1560, -1496,1560,1495, -1560,1496,1561, -1497,1561,1496, -1561,1497,1562, -1498,1562,1497, -1562,1498,1563, -1499,1563,1498, -1563,1499,1564, -1500,1564,1499, -1564,1500,1565, -1501,1565,1500, -1565,1501,1566, -1502,1566,1501, -1566,1502,1567, -1503,1567,1502, -1567,1503,1568, -1504,1568,1503, -1568,1504,1569, -1505,1569,1504, -1569,1505,1570, -1506,1570,1505, -1570,1506,1571, -1507,1571,1506, -1571,1507,1572, -1508,1572,1507, -1572,1508,1573, -1509,1573,1508, -1573,1509,1574, -1510,1574,1509, -1574,1510,1575, -1511,1575,1510, -1575,1511,1576, -1512,1576,1511, -1576,1512,1577, -1513,1577,1512, -1577,1513,1578, -1514,1578,1513, -1578,1514,1579, -1515,1579,1514, -1579,1515,1580, -1516,1580,1515, -1580,1516,1581, -1517,1581,1516, -1581,1517,1582, -1518,1582,1517, -1582,1518,1583, -1519,1583,1518, -1583,1519,1584, -1520,1584,1519, -1584,1520,1585, -1521,1585,1520, -1585,1521,1586, -1522,1586,1521, -1586,1522,1587, -1523,1587,1522, -1587,1523,1588, -1524,1588,1523, -1588,1524,1589, -1525,1589,1524, -1589,1525,1590, -1526,1590,1525, -1590,1526,1591, -1527,1591,1526, -1591,1527,1592, -1528,1592,1527, -1592,1528,1593, -1529,1593,1528, -1593,1529,1594, -1530,1594,1529, -1594,1530,1595, -1531,1595,1530, -1595,1531,1596, -1532,1596,1531, -1596,1532,1597, -1533,1597,1532, -1597,1533,1598, -1534,1598,1533, -1598,1534,1599, -1535,1599,1534, -1600,1536,1601, -1537,1601,1536, -1601,1537,1602, -1538,1602,1537, -1602,1538,1603, -1539,1603,1538, -1603,1539,1604, -1540,1604,1539, -1604,1540,1605, -1541,1605,1540, -1605,1541,1606, -1542,1606,1541, -1606,1542,1607, -1543,1607,1542, -1607,1543,1608, -1544,1608,1543, -1608,1544,1609, -1545,1609,1544, -1609,1545,1610, -1546,1610,1545, -1610,1546,1611, -1547,1611,1546, -1611,1547,1612, -1548,1612,1547, -1612,1548,1613, -1549,1613,1548, -1613,1549,1614, -1550,1614,1549, -1614,1550,1615, -1551,1615,1550, -1615,1551,1616, -1552,1616,1551, -1616,1552,1617, -1553,1617,1552, -1617,1553,1618, -1554,1618,1553, -1618,1554,1619, -1555,1619,1554, -1619,1555,1620, -1556,1620,1555, -1620,1556,1621, -1557,1621,1556, -1621,1557,1622, -1558,1622,1557, -1622,1558,1623, -1559,1623,1558, -1623,1559,1624, -1560,1624,1559, -1624,1560,1625, -1561,1625,1560, -1625,1561,1626, -1562,1626,1561, -1626,1562,1627, -1563,1627,1562, -1627,1563,1628, -1564,1628,1563, -1628,1564,1629, -1565,1629,1564, -1629,1565,1630, -1566,1630,1565, -1630,1566,1631, -1567,1631,1566, -1631,1567,1632, -1568,1632,1567, -1632,1568,1633, -1569,1633,1568, -1633,1569,1634, -1570,1634,1569, -1634,1570,1635, -1571,1635,1570, -1635,1571,1636, -1572,1636,1571, -1636,1572,1637, -1573,1637,1572, -1637,1573,1638, -1574,1638,1573, -1638,1574,1639, -1575,1639,1574, -1639,1575,1640, -1576,1640,1575, -1640,1576,1641, -1577,1641,1576, -1641,1577,1642, -1578,1642,1577, -1642,1578,1643, -1579,1643,1578, -1643,1579,1644, -1580,1644,1579, -1644,1580,1645, -1581,1645,1580, -1645,1581,1646, -1582,1646,1581, -1646,1582,1647, -1583,1647,1582, -1647,1583,1648, -1584,1648,1583, -1648,1584,1649, -1585,1649,1584, -1649,1585,1650, -1586,1650,1585, -1650,1586,1651, -1587,1651,1586, -1651,1587,1652, -1588,1652,1587, -1652,1588,1653, -1589,1653,1588, -1653,1589,1654, -1590,1654,1589, -1654,1590,1655, -1591,1655,1590, -1655,1591,1656, -1592,1656,1591, -1656,1592,1657, -1593,1657,1592, -1657,1593,1658, -1594,1658,1593, -1658,1594,1659, -1595,1659,1594, -1659,1595,1660, -1596,1660,1595, -1660,1596,1661, -1597,1661,1596, -1661,1597,1662, -1598,1662,1597, -1662,1598,1663, -1599,1663,1598, -1664,1600,1665, -1601,1665,1600, -1665,1601,1666, -1602,1666,1601, -1666,1602,1667, -1603,1667,1602, -1667,1603,1668, -1604,1668,1603, -1668,1604,1669, -1605,1669,1604, -1669,1605,1670, -1606,1670,1605, -1670,1606,1671, -1607,1671,1606, -1671,1607,1672, -1608,1672,1607, -1672,1608,1673, -1609,1673,1608, -1673,1609,1674, -1610,1674,1609, -1674,1610,1675, -1611,1675,1610, -1675,1611,1676, -1612,1676,1611, -1676,1612,1677, -1613,1677,1612, -1677,1613,1678, -1614,1678,1613, -1678,1614,1679, -1615,1679,1614, -1679,1615,1680, -1616,1680,1615, -1680,1616,1681, -1617,1681,1616, -1681,1617,1682, -1618,1682,1617, -1682,1618,1683, -1619,1683,1618, -1683,1619,1684, -1620,1684,1619, -1684,1620,1685, -1621,1685,1620, -1685,1621,1686, -1622,1686,1621, -1686,1622,1687, -1623,1687,1622, -1687,1623,1688, -1624,1688,1623, -1688,1624,1689, -1625,1689,1624, -1689,1625,1690, -1626,1690,1625, -1690,1626,1691, -1627,1691,1626, -1691,1627,1692, -1628,1692,1627, -1692,1628,1693, -1629,1693,1628, -1693,1629,1694, -1630,1694,1629, -1694,1630,1695, -1631,1695,1630, -1695,1631,1696, -1632,1696,1631, -1696,1632,1697, -1633,1697,1632, -1697,1633,1698, -1634,1698,1633, -1698,1634,1699, -1635,1699,1634, -1699,1635,1700, -1636,1700,1635, -1700,1636,1701, -1637,1701,1636, -1701,1637,1702, -1638,1702,1637, -1702,1638,1703, -1639,1703,1638, -1703,1639,1704, -1640,1704,1639, -1704,1640,1705, -1641,1705,1640, -1705,1641,1706, -1642,1706,1641, -1706,1642,1707, -1643,1707,1642, -1707,1643,1708, -1644,1708,1643, -1708,1644,1709, -1645,1709,1644, -1709,1645,1710, -1646,1710,1645, -1710,1646,1711, -1647,1711,1646, -1711,1647,1712, -1648,1712,1647, -1712,1648,1713, -1649,1713,1648, -1713,1649,1714, -1650,1714,1649, -1714,1650,1715, -1651,1715,1650, -1715,1651,1716, -1652,1716,1651, -1716,1652,1717, -1653,1717,1652, -1717,1653,1718, -1654,1718,1653, -1718,1654,1719, -1655,1719,1654, -1719,1655,1720, -1656,1720,1655, -1720,1656,1721, -1657,1721,1656, -1721,1657,1722, -1658,1722,1657, -1722,1658,1723, -1659,1723,1658, -1723,1659,1724, -1660,1724,1659, -1724,1660,1725, -1661,1725,1660, -1725,1661,1726, -1662,1726,1661, -1726,1662,1727, -1663,1727,1662, -1728,1664,1729, -1665,1729,1664, -1729,1665,1730, -1666,1730,1665, -1730,1666,1731, -1667,1731,1666, -1731,1667,1732, -1668,1732,1667, -1732,1668,1733, -1669,1733,1668, -1733,1669,1734, -1670,1734,1669, -1734,1670,1735, -1671,1735,1670, -1735,1671,1736, -1672,1736,1671, -1736,1672,1737, -1673,1737,1672, -1737,1673,1738, -1674,1738,1673, -1738,1674,1739, -1675,1739,1674, -1739,1675,1740, -1676,1740,1675, -1740,1676,1741, -1677,1741,1676, -1741,1677,1742, -1678,1742,1677, -1742,1678,1743, -1679,1743,1678, -1743,1679,1744, -1680,1744,1679, -1744,1680,1745, -1681,1745,1680, -1745,1681,1746, -1682,1746,1681, -1746,1682,1747, -1683,1747,1682, -1747,1683,1748, -1684,1748,1683, -1748,1684,1749, -1685,1749,1684, -1749,1685,1750, -1686,1750,1685, -1750,1686,1751, -1687,1751,1686, -1751,1687,1752, -1688,1752,1687, -1752,1688,1753, -1689,1753,1688, -1753,1689,1754, -1690,1754,1689, -1754,1690,1755, -1691,1755,1690, -1755,1691,1756, -1692,1756,1691, -1756,1692,1757, -1693,1757,1692, -1757,1693,1758, -1694,1758,1693, -1758,1694,1759, -1695,1759,1694, -1759,1695,1760, -1696,1760,1695, -1760,1696,1761, -1697,1761,1696, -1761,1697,1762, -1698,1762,1697, -1762,1698,1763, -1699,1763,1698, -1763,1699,1764, -1700,1764,1699, -1764,1700,1765, -1701,1765,1700, -1765,1701,1766, -1702,1766,1701, -1766,1702,1767, -1703,1767,1702, -1767,1703,1768, -1704,1768,1703, -1768,1704,1769, -1705,1769,1704, -1769,1705,1770, -1706,1770,1705, -1770,1706,1771, -1707,1771,1706, -1771,1707,1772, -1708,1772,1707, -1772,1708,1773, -1709,1773,1708, -1773,1709,1774, -1710,1774,1709, -1774,1710,1775, -1711,1775,1710, -1775,1711,1776, -1712,1776,1711, -1776,1712,1777, -1713,1777,1712, -1777,1713,1778, -1714,1778,1713, -1778,1714,1779, -1715,1779,1714, -1779,1715,1780, -1716,1780,1715, -1780,1716,1781, -1717,1781,1716, -1781,1717,1782, -1718,1782,1717, -1782,1718,1783, -1719,1783,1718, -1783,1719,1784, -1720,1784,1719, -1784,1720,1785, -1721,1785,1720, -1785,1721,1786, -1722,1786,1721, -1786,1722,1787, -1723,1787,1722, -1787,1723,1788, -1724,1788,1723, -1788,1724,1789, -1725,1789,1724, -1789,1725,1790, -1726,1790,1725, -1790,1726,1791, -1727,1791,1726, -1792,1728,1793, -1729,1793,1728, -1793,1729,1794, -1730,1794,1729, -1794,1730,1795, -1731,1795,1730, -1795,1731,1796, -1732,1796,1731, -1796,1732,1797, -1733,1797,1732, -1797,1733,1798, -1734,1798,1733, -1798,1734,1799, -1735,1799,1734, -1799,1735,1800, -1736,1800,1735, -1800,1736,1801, -1737,1801,1736, -1801,1737,1802, -1738,1802,1737, -1802,1738,1803, -1739,1803,1738, -1803,1739,1804, -1740,1804,1739, -1804,1740,1805, -1741,1805,1740, -1805,1741,1806, -1742,1806,1741, -1806,1742,1807, -1743,1807,1742, -1807,1743,1808, -1744,1808,1743, -1808,1744,1809, -1745,1809,1744, -1809,1745,1810, -1746,1810,1745, -1810,1746,1811, -1747,1811,1746, -1811,1747,1812, -1748,1812,1747, -1812,1748,1813, -1749,1813,1748, -1813,1749,1814, -1750,1814,1749, -1814,1750,1815, -1751,1815,1750, -1815,1751,1816, -1752,1816,1751, -1816,1752,1817, -1753,1817,1752, -1817,1753,1818, -1754,1818,1753, -1818,1754,1819, -1755,1819,1754, -1819,1755,1820, -1756,1820,1755, -1820,1756,1821, -1757,1821,1756, -1821,1757,1822, -1758,1822,1757, -1822,1758,1823, -1759,1823,1758, -1823,1759,1824, -1760,1824,1759, -1824,1760,1825, -1761,1825,1760, -1825,1761,1826, -1762,1826,1761, -1826,1762,1827, -1763,1827,1762, -1827,1763,1828, -1764,1828,1763, -1828,1764,1829, -1765,1829,1764, -1829,1765,1830, -1766,1830,1765, -1830,1766,1831, -1767,1831,1766, -1831,1767,1832, -1768,1832,1767, -1832,1768,1833, -1769,1833,1768, -1833,1769,1834, -1770,1834,1769, -1834,1770,1835, -1771,1835,1770, -1835,1771,1836, -1772,1836,1771, -1836,1772,1837, -1773,1837,1772, -1837,1773,1838, -1774,1838,1773, -1838,1774,1839, -1775,1839,1774, -1839,1775,1840, -1776,1840,1775, -1840,1776,1841, -1777,1841,1776, -1841,1777,1842, -1778,1842,1777, -1842,1778,1843, -1779,1843,1778, -1843,1779,1844, -1780,1844,1779, -1844,1780,1845, -1781,1845,1780, -1845,1781,1846, -1782,1846,1781, -1846,1782,1847, -1783,1847,1782, -1847,1783,1848, -1784,1848,1783, -1848,1784,1849, -1785,1849,1784, -1849,1785,1850, -1786,1850,1785, -1850,1786,1851, -1787,1851,1786, -1851,1787,1852, -1788,1852,1787, -1852,1788,1853, -1789,1853,1788, -1853,1789,1854, -1790,1854,1789, -1854,1790,1855, -1791,1855,1790, -1856,1792,1857, -1793,1857,1792, -1857,1793,1858, -1794,1858,1793, -1858,1794,1859, -1795,1859,1794, -1859,1795,1860, -1796,1860,1795, -1860,1796,1861, -1797,1861,1796, -1861,1797,1862, -1798,1862,1797, -1862,1798,1863, -1799,1863,1798, -1863,1799,1864, -1800,1864,1799, -1864,1800,1865, -1801,1865,1800, -1865,1801,1866, -1802,1866,1801, -1866,1802,1867, -1803,1867,1802, -1867,1803,1868, -1804,1868,1803, -1868,1804,1869, -1805,1869,1804, -1869,1805,1870, -1806,1870,1805, -1870,1806,1871, -1807,1871,1806, -1871,1807,1872, -1808,1872,1807, -1872,1808,1873, -1809,1873,1808, -1873,1809,1874, -1810,1874,1809, -1874,1810,1875, -1811,1875,1810, -1875,1811,1876, -1812,1876,1811, -1876,1812,1877, -1813,1877,1812, -1877,1813,1878, -1814,1878,1813, -1878,1814,1879, -1815,1879,1814, -1879,1815,1880, -1816,1880,1815, -1880,1816,1881, -1817,1881,1816, -1881,1817,1882, -1818,1882,1817, -1882,1818,1883, -1819,1883,1818, -1883,1819,1884, -1820,1884,1819, -1884,1820,1885, -1821,1885,1820, -1885,1821,1886, -1822,1886,1821, -1886,1822,1887, -1823,1887,1822, -1887,1823,1888, -1824,1888,1823, -1888,1824,1889, -1825,1889,1824, -1889,1825,1890, -1826,1890,1825, -1890,1826,1891, -1827,1891,1826, -1891,1827,1892, -1828,1892,1827, -1892,1828,1893, -1829,1893,1828, -1893,1829,1894, -1830,1894,1829, -1894,1830,1895, -1831,1895,1830, -1895,1831,1896, -1832,1896,1831, -1896,1832,1897, -1833,1897,1832, -1897,1833,1898, -1834,1898,1833, -1898,1834,1899, -1835,1899,1834, -1899,1835,1900, -1836,1900,1835, -1900,1836,1901, -1837,1901,1836, -1901,1837,1902, -1838,1902,1837, -1902,1838,1903, -1839,1903,1838, -1903,1839,1904, -1840,1904,1839, -1904,1840,1905, -1841,1905,1840, -1905,1841,1906, -1842,1906,1841, -1906,1842,1907, -1843,1907,1842, -1907,1843,1908, -1844,1908,1843, -1908,1844,1909, -1845,1909,1844, -1909,1845,1910, -1846,1910,1845, -1910,1846,1911, -1847,1911,1846, -1911,1847,1912, -1848,1912,1847, -1912,1848,1913, -1849,1913,1848, -1913,1849,1914, -1850,1914,1849, -1914,1850,1915, -1851,1915,1850, -1915,1851,1916, -1852,1916,1851, -1916,1852,1917, -1853,1917,1852, -1917,1853,1918, -1854,1918,1853, -1918,1854,1919, -1855,1919,1854, -1920,1856,1921, -1857,1921,1856, -1921,1857,1922, -1858,1922,1857, -1922,1858,1923, -1859,1923,1858, -1923,1859,1924, -1860,1924,1859, -1924,1860,1925, -1861,1925,1860, -1925,1861,1926, -1862,1926,1861, -1926,1862,1927, -1863,1927,1862, -1927,1863,1928, -1864,1928,1863, -1928,1864,1929, -1865,1929,1864, -1929,1865,1930, -1866,1930,1865, -1930,1866,1931, -1867,1931,1866, -1931,1867,1932, -1868,1932,1867, -1932,1868,1933, -1869,1933,1868, -1933,1869,1934, -1870,1934,1869, -1934,1870,1935, -1871,1935,1870, -1935,1871,1936, -1872,1936,1871, -1936,1872,1937, -1873,1937,1872, -1937,1873,1938, -1874,1938,1873, -1938,1874,1939, -1875,1939,1874, -1939,1875,1940, -1876,1940,1875, -1940,1876,1941, -1877,1941,1876, -1941,1877,1942, -1878,1942,1877, -1942,1878,1943, -1879,1943,1878, -1943,1879,1944, -1880,1944,1879, -1944,1880,1945, -1881,1945,1880, -1945,1881,1946, -1882,1946,1881, -1946,1882,1947, -1883,1947,1882, -1947,1883,1948, -1884,1948,1883, -1948,1884,1949, -1885,1949,1884, -1949,1885,1950, -1886,1950,1885, -1950,1886,1951, -1887,1951,1886, -1951,1887,1952, -1888,1952,1887, -1952,1888,1953, -1889,1953,1888, -1953,1889,1954, -1890,1954,1889, -1954,1890,1955, -1891,1955,1890, -1955,1891,1956, -1892,1956,1891, -1956,1892,1957, -1893,1957,1892, -1957,1893,1958, -1894,1958,1893, -1958,1894,1959, -1895,1959,1894, -1959,1895,1960, -1896,1960,1895, -1960,1896,1961, -1897,1961,1896, -1961,1897,1962, -1898,1962,1897, -1962,1898,1963, -1899,1963,1898, -1963,1899,1964, -1900,1964,1899, -1964,1900,1965, -1901,1965,1900, -1965,1901,1966, -1902,1966,1901, -1966,1902,1967, -1903,1967,1902, -1967,1903,1968, -1904,1968,1903, -1968,1904,1969, -1905,1969,1904, -1969,1905,1970, -1906,1970,1905, -1970,1906,1971, -1907,1971,1906, -1971,1907,1972, -1908,1972,1907, -1972,1908,1973, -1909,1973,1908, -1973,1909,1974, -1910,1974,1909, -1974,1910,1975, -1911,1975,1910, -1975,1911,1976, -1912,1976,1911, -1976,1912,1977, -1913,1977,1912, -1977,1913,1978, -1914,1978,1913, -1978,1914,1979, -1915,1979,1914, -1979,1915,1980, -1916,1980,1915, -1980,1916,1981, -1917,1981,1916, -1981,1917,1982, -1918,1982,1917, -1982,1918,1983, -1919,1983,1918, -1984,1920,1985, -1921,1985,1920, -1985,1921,1986, -1922,1986,1921, -1986,1922,1987, -1923,1987,1922, -1987,1923,1988, -1924,1988,1923, -1988,1924,1989, -1925,1989,1924, -1989,1925,1990, -1926,1990,1925, -1990,1926,1991, -1927,1991,1926, -1991,1927,1992, -1928,1992,1927, -1992,1928,1993, -1929,1993,1928, -1993,1929,1994, -1930,1994,1929, -1994,1930,1995, -1931,1995,1930, -1995,1931,1996, -1932,1996,1931, -1996,1932,1997, -1933,1997,1932, -1997,1933,1998, -1934,1998,1933, -1998,1934,1999, -1935,1999,1934, -1999,1935,2000, -1936,2000,1935, -2000,1936,2001, -1937,2001,1936, -2001,1937,2002, -1938,2002,1937, -2002,1938,2003, -1939,2003,1938, -2003,1939,2004, -1940,2004,1939, -2004,1940,2005, -1941,2005,1940, -2005,1941,2006, -1942,2006,1941, -2006,1942,2007, -1943,2007,1942, -2007,1943,2008, -1944,2008,1943, -2008,1944,2009, -1945,2009,1944, -2009,1945,2010, -1946,2010,1945, -2010,1946,2011, -1947,2011,1946, -2011,1947,2012, -1948,2012,1947, -2012,1948,2013, -1949,2013,1948, -2013,1949,2014, -1950,2014,1949, -2014,1950,2015, -1951,2015,1950, -2015,1951,2016, -1952,2016,1951, -2016,1952,2017, -1953,2017,1952, -2017,1953,2018, -1954,2018,1953, -2018,1954,2019, -1955,2019,1954, -2019,1955,2020, -1956,2020,1955, -2020,1956,2021, -1957,2021,1956, -2021,1957,2022, -1958,2022,1957, -2022,1958,2023, -1959,2023,1958, -2023,1959,2024, -1960,2024,1959, -2024,1960,2025, -1961,2025,1960, -2025,1961,2026, -1962,2026,1961, -2026,1962,2027, -1963,2027,1962, -2027,1963,2028, -1964,2028,1963, -2028,1964,2029, -1965,2029,1964, -2029,1965,2030, -1966,2030,1965, -2030,1966,2031, -1967,2031,1966, -2031,1967,2032, -1968,2032,1967, -2032,1968,2033, -1969,2033,1968, -2033,1969,2034, -1970,2034,1969, -2034,1970,2035, -1971,2035,1970, -2035,1971,2036, -1972,2036,1971, -2036,1972,2037, -1973,2037,1972, -2037,1973,2038, -1974,2038,1973, -2038,1974,2039, -1975,2039,1974, -2039,1975,2040, -1976,2040,1975, -2040,1976,2041, -1977,2041,1976, -2041,1977,2042, -1978,2042,1977, -2042,1978,2043, -1979,2043,1978, -2043,1979,2044, -1980,2044,1979, -2044,1980,2045, -1981,2045,1980, -2045,1981,2046, -1982,2046,1981, -2046,1982,2047, -1983,2047,1982, -}; - +#define Landscape02VtxCount 1980 +#define Landscape02IdxCount 11310 +#include "LinearMath/btScalar.h" + +btScalar Landscape02Vtx[] = { +-250.0f,2.99192f,113.281f, +-250.0f,2.18397f,117.188f, +-246.094f,1.62262f,113.281f, +-246.094f,1.51628f,117.188f, +-242.188f,0.847411f,113.281f, +-242.188f,0.628327f,117.188f, +-238.281f,-0.697436f,113.281f, +-238.281f,-0.567933f,117.188f, +-234.375f,-2.65115f,113.281f, +-234.375f,-2.01568f,117.188f, +-230.469f,-3.82201f,113.281f, +-230.469f,-3.41089f,117.188f, +-226.563f,-3.99138f,113.281f, +-226.563f,-3.82758f,117.188f, +-222.656f,-5.51066f,113.281f, +-222.656f,-5.01586f,117.188f, +-218.75f,-5.62904f,113.281f, +-218.75f,-4.74822f,117.188f, +-214.844f,-4.90514f,113.281f, +-214.844f,-3.30853f,117.188f, +-210.938f,-2.9572f,113.281f, +-210.938f,-2.32499f,117.188f, +-207.031f,-2.44242f,113.281f, +-207.031f,-1.71509f,117.188f, +-203.125f,-1.5086f,113.281f, +-203.125f,-1.19203f,117.188f, +-199.219f,-0.130838f,113.281f, +-199.219f,0.219498f,117.188f, +-195.313f,0.985417f,113.281f, +-195.313f,1.66304f,117.188f, +-191.406f,3.20064f,113.281f, +-191.406f,4.35105f,117.188f, +-187.5f,4.6779f,113.281f, +-187.5f,6.33228f,117.188f, +-183.594f,6.16902f,113.281f, +-183.594f,8.00972f,117.188f, +-179.688f,8.18835f,113.281f, +-179.688f,9.71486f,117.188f, +-175.781f,9.35082f,113.281f, +-175.781f,10.7727f,117.188f, +-171.875f,9.50665f,113.281f, +-171.875f,11.358f,117.188f, +-167.969f,12.1301f,113.281f, +-167.969f,12.5239f,117.188f, +-164.063f,14.8728f,113.281f, +-164.063f,14.6278f,117.188f, +-160.156f,16.3761f,113.281f, +-160.156f,17.2069f,117.188f, +-156.25f,18.5367f,113.281f, +-156.25f,19.9779f,117.188f, +-152.344f,22.4636f,113.281f, +-152.344f,23.4607f,117.188f, +-148.438f,26.1459f,113.281f, +-148.438f,26.6108f,117.188f, +-144.531f,28.6071f,113.281f, +-144.531f,28.4635f,117.188f, +-140.625f,30.2795f,113.281f, +-140.625f,29.7705f,117.188f, +-136.719f,32.2229f,113.281f, +-136.719f,31.0684f,117.188f, +-132.813f,32.8919f,113.281f, +-132.813f,31.8395f,117.188f, +-128.906f,33.5143f,113.281f, +-128.906f,32.1658f,117.188f, +-125.0f,34.6963f,113.281f, +-125.0f,34.7478f,117.188f, +-121.094f,37.3995f,113.281f, +-121.094f,36.0624f,117.188f, +-117.188f,38.0464f,113.281f, +-117.188f,37.2702f,117.188f, +-113.281f,37.8506f,113.281f, +-113.281f,37.3474f,117.188f, +-109.375f,37.8984f,113.281f, +-109.375f,37.242f,117.188f, +-105.469f,36.0464f,113.281f, +-105.469f,36.1544f,117.188f, +-101.563f,34.1136f,113.281f, +-101.563f,33.403f,117.188f, +-97.6563f,32.0925f,113.281f, +-97.6563f,31.294f,117.188f, +-93.75f,29.8306f,113.281f, +-93.75f,29.4961f,117.188f, +-89.8438f,30.1499f,113.281f, +-89.8438f,29.0556f,117.188f, +-85.9375f,28.8377f,113.281f, +-85.9375f,28.2757f,117.188f, +-82.0313f,26.9726f,113.281f, +-82.0313f,26.6322f,117.188f, +-78.125f,25.4597f,113.281f, +-78.125f,24.8286f,117.188f, +-74.2188f,23.3572f,113.281f, +-74.2188f,22.7019f,117.188f, +-70.3125f,21.1615f,113.281f, +-70.3125f,20.4725f,117.188f, +-66.4063f,18.1212f,113.281f, +-66.4063f,17.984f,117.188f, +-62.5f,16.3411f,113.281f, +-62.5f,16.3033f,117.188f, +-58.5938f,15.075f,113.281f, +-58.5938f,14.2087f,117.188f, +-54.6875f,14.2482f,113.281f, +-54.6875f,12.8086f,117.188f, +-50.7813f,13.7945f,113.281f, +-50.7813f,12.5463f,117.188f, +-46.875f,12.7086f,113.281f, +-46.875f,12.1781f,117.188f, +-42.9688f,10.5756f,113.281f, +-42.9688f,11.1391f,117.188f, +-39.0625f,9.99343f,113.281f, +-39.0625f,10.4623f,117.188f, +-35.1563f,11.0936f,113.281f, +-35.1563f,11.0528f,117.188f, +-31.25f,11.9553f,113.281f, +-31.25f,11.454f,117.188f, +-27.3438f,11.5734f,113.281f, +-27.3438f,10.5577f,117.188f, +-23.4375f,11.0397f,113.281f, +-23.4375f,10.6328f,117.188f, +-19.5313f,12.5166f,113.281f, +-19.5313f,12.5569f,117.188f, +-15.625f,13.856f,113.281f, +-15.625f,13.5389f,117.188f, +-11.7188f,14.525f,113.281f, +-11.7188f,14.3792f,117.188f, +-7.8125f,14.7554f,113.281f, +-7.8125f,15.4809f,117.188f, +-3.90625f,15.9168f,113.281f, +-3.90625f,16.1008f,117.188f, +0.0f,17.0728f,113.281f, +0.0f,17.3675f,117.188f, +3.90625f,18.3498f,113.281f, +3.90625f,18.919f,117.188f, +-250.0f,4.66213f,109.375f, +-246.094f,2.25542f,109.375f, +-242.188f,0.972654f,109.375f, +-238.281f,-1.95429f,109.375f, +-234.375f,-2.74128f,109.375f, +-230.469f,-3.62525f,109.375f, +-226.563f,-4.55305f,109.375f, +-222.656f,-6.4124f,109.375f, +-218.75f,-6.73329f,109.375f, +-214.844f,-5.91703f,109.375f, +-210.938f,-4.73996f,109.375f, +-207.031f,-3.31105f,109.375f, +-203.125f,-2.06764f,109.375f, +-199.219f,-0.969242f,109.375f, +-195.313f,0.268778f,109.375f, +-191.406f,1.94799f,109.375f, +-187.5f,2.80754f,109.375f, +-183.594f,4.22131f,109.375f, +-179.688f,5.20723f,109.375f, +-175.781f,7.47197f,109.375f, +-171.875f,9.45267f,109.375f, +-167.969f,12.6425f,109.375f, +-164.063f,14.9382f,109.375f, +-160.156f,16.7967f,109.375f, +-156.25f,19.5153f,109.375f, +-152.344f,21.4005f,109.375f, +-148.438f,25.1259f,109.375f, +-144.531f,28.4102f,109.375f, +-140.625f,30.7572f,109.375f, +-136.719f,33.0194f,109.375f, +-132.813f,33.072f,109.375f, +-128.906f,33.1358f,109.375f, +-125.0f,35.0549f,109.375f, +-121.094f,36.4427f,109.375f, +-117.188f,38.3265f,109.375f, +-113.281f,38.5339f,109.375f, +-109.375f,37.0126f,109.375f, +-105.469f,34.9063f,109.375f, +-101.563f,32.9886f,109.375f, +-97.6563f,30.8964f,109.375f, +-93.75f,30.5048f,109.375f, +-89.8438f,30.4943f,109.375f, +-85.9375f,28.8782f,109.375f, +-82.0313f,28.1966f,109.375f, +-78.125f,25.9164f,109.375f, +-74.2188f,23.3428f,109.375f, +-70.3125f,20.9839f,109.375f, +-66.4063f,18.3885f,109.375f, +-62.5f,16.9034f,109.375f, +-58.5938f,15.2602f,109.375f, +-54.6875f,14.3223f,109.375f, +-50.7813f,13.3767f,109.375f, +-46.875f,12.5798f,109.375f, +-42.9688f,11.3276f,109.375f, +-39.0625f,11.0169f,109.375f, +-35.1563f,11.7482f,109.375f, +-31.25f,12.5037f,109.375f, +-27.3438f,12.3832f,109.375f, +-23.4375f,12.3097f,109.375f, +-19.5313f,12.6165f,109.375f, +-15.625f,13.7744f,109.375f, +-11.7188f,14.363f,109.375f, +-7.8125f,14.828f,109.375f, +-3.90625f,15.599f,109.375f, +0.0f,16.3885f,109.375f, +3.90625f,18.0017f,109.375f, +-250.0f,5.23892f,105.469f, +-246.094f,2.90481f,105.469f, +-242.188f,0.264647f,105.469f, +-238.281f,-0.288927f,105.469f, +-234.375f,-0.910295f,105.469f, +-230.469f,-2.20742f,105.469f, +-226.563f,-3.6968f,105.469f, +-222.656f,-5.2145f,105.469f, +-218.75f,-6.07198f,105.469f, +-214.844f,-5.42535f,105.469f, +-210.938f,-4.82182f,105.469f, +-207.031f,-3.22017f,105.469f, +-203.125f,-2.28037f,105.469f, +-199.219f,-1.51966f,105.469f, +-195.313f,-0.0464115f,105.469f, +-191.406f,1.73523f,105.469f, +-187.5f,2.72489f,105.469f, +-183.594f,4.39996f,105.469f, +-179.688f,5.48007f,105.469f, +-175.781f,7.27769f,105.469f, +-171.875f,10.1115f,105.469f, +-167.969f,13.0557f,105.469f, +-164.063f,15.7105f,105.469f, +-160.156f,17.8448f,105.469f, +-156.25f,19.8398f,105.469f, +-152.344f,21.6672f,105.469f, +-148.438f,24.1475f,105.469f, +-144.531f,28.4217f,105.469f, +-140.625f,31.6921f,105.469f, +-136.719f,34.3814f,105.469f, +-132.813f,34.9011f,105.469f, +-128.906f,33.8056f,105.469f, +-125.0f,34.3226f,105.469f, +-121.094f,35.6061f,105.469f, +-117.188f,37.9636f,105.469f, +-113.281f,38.6673f,105.469f, +-109.375f,36.8831f,105.469f, +-105.469f,34.5846f,105.469f, +-101.563f,32.2221f,105.469f, +-97.6563f,30.3826f,105.469f, +-93.75f,30.4243f,105.469f, +-89.8438f,30.7761f,105.469f, +-85.9375f,29.8335f,105.469f, +-82.0313f,28.0208f,105.469f, +-78.125f,25.7215f,105.469f, +-74.2188f,22.9019f,105.469f, +-70.3125f,20.9096f,105.469f, +-66.4063f,18.2558f,105.469f, +-62.5f,16.689f,105.469f, +-58.5938f,15.8032f,105.469f, +-54.6875f,14.8311f,105.469f, +-50.7813f,13.7628f,105.469f, +-46.875f,13.0048f,105.469f, +-42.9688f,11.9222f,105.469f, +-39.0625f,12.021f,105.469f, +-35.1563f,12.2727f,105.469f, +-31.25f,12.6336f,105.469f, +-27.3438f,12.6865f,105.469f, +-23.4375f,12.3758f,105.469f, +-19.5313f,13.0149f,105.469f, +-15.625f,14.0448f,105.469f, +-11.7188f,14.6064f,105.469f, +-7.8125f,15.1105f,105.469f, +-3.90625f,15.8367f,105.469f, +0.0f,16.822f,105.469f, +3.90625f,17.9608f,105.469f, +-250.0f,4.27755f,101.563f, +-246.094f,2.84639f,101.563f, +-242.188f,2.00001f,101.563f, +-238.281f,1.59426f,101.563f, +-234.375f,0.494548f,101.563f, +-230.469f,-1.78619f,101.563f, +-226.563f,-2.8668f,101.563f, +-222.656f,-5.00406f,101.563f, +-218.75f,-6.01721f,101.563f, +-214.844f,-5.29731f,101.563f, +-210.938f,-4.08939f,101.563f, +-207.031f,-3.76734f,101.563f, +-203.125f,-2.53974f,101.563f, +-199.219f,-1.06933f,101.563f, +-195.313f,-0.447271f,101.563f, +-191.406f,1.52362f,101.563f, +-187.5f,3.40783f,101.563f, +-183.594f,4.48418f,101.563f, +-179.688f,6.791f,101.563f, +-175.781f,8.68642f,101.563f, +-171.875f,11.1511f,101.563f, +-167.969f,14.4536f,101.563f, +-164.063f,17.5923f,101.563f, +-160.156f,19.4108f,101.563f, +-156.25f,20.7669f,101.563f, +-152.344f,22.2683f,101.563f, +-148.438f,24.0251f,101.563f, +-144.531f,27.7431f,101.563f, +-140.625f,31.4827f,101.563f, +-136.719f,34.3945f,101.563f, +-132.813f,35.3451f,101.563f, +-128.906f,34.9912f,101.563f, +-125.0f,34.2253f,101.563f, +-121.094f,35.1765f,101.563f, +-117.188f,37.3095f,101.563f, +-113.281f,37.7256f,101.563f, +-109.375f,36.2331f,101.563f, +-105.469f,34.435f,101.563f, +-101.563f,32.1021f,101.563f, +-97.6563f,31.0728f,101.563f, +-93.75f,30.7462f,101.563f, +-89.8438f,30.8125f,101.563f, +-85.9375f,29.6802f,101.563f, +-82.0313f,27.3023f,101.563f, +-78.125f,25.1113f,101.563f, +-74.2188f,22.6475f,101.563f, +-70.3125f,20.1315f,101.563f, +-66.4063f,18.0132f,101.563f, +-62.5f,17.1414f,101.563f, +-58.5938f,16.7884f,101.563f, +-54.6875f,15.7107f,101.563f, +-50.7813f,14.6855f,101.563f, +-46.875f,13.3626f,101.563f, +-42.9688f,11.6073f,101.563f, +-39.0625f,11.3359f,101.563f, +-35.1563f,12.4227f,101.563f, +-31.25f,13.068f,101.563f, +-27.3438f,12.4485f,101.563f, +-23.4375f,11.8491f,101.563f, +-19.5313f,13.6925f,101.563f, +-15.625f,14.7114f,101.563f, +-11.7188f,14.963f,101.563f, +-7.8125f,15.0631f,101.563f, +-3.90625f,16.1214f,101.563f, +0.0f,17.0818f,101.563f, +3.90625f,17.7074f,101.563f, +-250.0f,4.24758f,97.6563f, +-246.094f,3.92716f,97.6563f, +-242.188f,3.12473f,97.6563f, +-238.281f,2.07357f,97.6563f, +-234.375f,0.407895f,97.6563f, +-230.469f,-0.904646f,97.6563f, +-226.563f,-2.62182f,97.6563f, +-222.656f,-3.89204f,97.6563f, +-218.75f,-5.61944f,97.6563f, +-214.844f,-4.00077f,97.6563f, +-210.938f,-2.40041f,97.6563f, +-207.031f,-2.40061f,97.6563f, +-203.125f,-1.96286f,97.6563f, +-199.219f,-1.48062f,97.6563f, +-195.313f,-0.101653f,97.6563f, +-191.406f,1.73583f,97.6563f, +-187.5f,3.67572f,97.6563f, +-183.594f,5.12213f,97.6563f, +-179.688f,7.63637f,97.6563f, +-175.781f,10.1724f,97.6563f, +-171.875f,12.2812f,97.6563f, +-167.969f,15.2851f,97.6563f, +-164.063f,18.2233f,97.6563f, +-160.156f,20.4971f,97.6563f, +-156.25f,21.878f,97.6563f, +-152.344f,23.2306f,97.6563f, +-148.438f,24.2686f,97.6563f, +-144.531f,28.1874f,97.6563f, +-140.625f,31.2597f,97.6563f, +-136.719f,33.3133f,97.6563f, +-132.813f,35.319f,97.6563f, +-128.906f,35.1009f,97.6563f, +-125.0f,34.8265f,97.6563f, +-121.094f,34.2935f,97.6563f, +-117.188f,36.4908f,97.6563f, +-113.281f,37.1964f,97.6563f, +-109.375f,36.1354f,97.6563f, +-105.469f,34.3852f,97.6563f, +-101.563f,30.8829f,97.6563f, +-97.6563f,30.1091f,97.6563f, +-93.75f,30.9329f,97.6563f, +-89.8438f,30.8751f,97.6563f, +-85.9375f,29.018f,97.6563f, +-82.0313f,27.3105f,97.6563f, +-78.125f,25.0087f,97.6563f, +-74.2188f,21.6466f,97.6563f, +-70.3125f,18.5043f,97.6563f, +-66.4063f,18.66f,97.6563f, +-62.5f,18.1592f,97.6563f, +-58.5938f,17.521f,97.6563f, +-54.6875f,16.3389f,97.6563f, +-50.7813f,14.8664f,97.6563f, +-46.875f,13.5991f,97.6563f, +-42.9688f,11.873f,97.6563f, +-39.0625f,11.498f,97.6563f, +-35.1563f,11.5171f,97.6563f, +-31.25f,12.5588f,97.6563f, +-27.3438f,12.2172f,97.6563f, +-23.4375f,11.2491f,97.6563f, +-19.5313f,13.2373f,97.6563f, +-15.625f,13.5683f,97.6563f, +-11.7188f,14.0875f,97.6563f, +-7.8125f,14.6591f,97.6563f, +-3.90625f,15.1275f,97.6563f, +0.0f,15.8243f,97.6563f, +3.90625f,18.0176f,97.6563f, +-250.0f,4.93619f,93.75f, +-246.094f,3.50077f,93.75f, +-242.188f,2.88532f,93.75f, +-238.281f,2.19691f,93.75f, +-234.375f,1.45343f,93.75f, +-230.469f,-0.151238f,93.75f, +-226.563f,-1.0856f,93.75f, +-222.656f,-2.29205f,93.75f, +-218.75f,-3.83678f,93.75f, +-214.844f,-2.73856f,93.75f, +-210.938f,-2.19574f,93.75f, +-207.031f,-0.222008f,93.75f, +-203.125f,-0.117961f,93.75f, +-199.219f,-0.17607f,93.75f, +-195.313f,1.32212f,93.75f, +-191.406f,2.64292f,93.75f, +-187.5f,3.72678f,93.75f, +-183.594f,5.78729f,93.75f, +-179.688f,9.09616f,93.75f, +-175.781f,11.4833f,93.75f, +-171.875f,13.1923f,93.75f, +-167.969f,15.68f,93.75f, +-164.063f,17.9844f,93.75f, +-160.156f,20.7688f,93.75f, +-156.25f,23.4925f,93.75f, +-152.344f,25.2252f,93.75f, +-148.438f,25.9373f,93.75f, +-144.531f,28.1941f,93.75f, +-140.625f,31.9896f,93.75f, +-136.719f,33.5688f,93.75f, +-132.813f,34.7177f,93.75f, +-128.906f,35.1459f,93.75f, +-125.0f,34.9785f,93.75f, +-121.094f,34.3971f,93.75f, +-117.188f,35.2455f,93.75f, +-113.281f,36.0209f,93.75f, +-109.375f,35.244f,93.75f, +-105.469f,33.4542f,93.75f, +-101.563f,30.3707f,93.75f, +-97.6563f,30.709f,93.75f, +-93.75f,31.2489f,93.75f, +-89.8438f,30.5476f,93.75f, +-85.9375f,28.5982f,93.75f, +-82.0313f,26.6838f,93.75f, +-78.125f,24.1646f,93.75f, +-74.2188f,21.261f,93.75f, +-70.3125f,19.8206f,93.75f, +-66.4063f,19.4952f,93.75f, +-62.5f,18.3276f,93.75f, +-58.5938f,18.1028f,93.75f, +-54.6875f,17.0878f,93.75f, +-50.7813f,15.0144f,93.75f, +-46.875f,13.5565f,93.75f, +-42.9688f,11.0211f,93.75f, +-39.0625f,11.1986f,93.75f, +-35.1563f,10.4097f,93.75f, +-31.25f,11.2207f,93.75f, +-27.3438f,11.4539f,93.75f, +-23.4375f,11.4014f,93.75f, +-19.5313f,12.2344f,93.75f, +-15.625f,13.5348f,93.75f, +-11.7188f,14.2772f,93.75f, +-7.8125f,14.0447f,93.75f, +-3.90625f,14.1587f,93.75f, +0.0f,15.3266f,93.75f, +3.90625f,17.1671f,93.75f, +-250.0f,5.40499f,89.8438f, +-246.094f,3.9236f,89.8438f, +-242.188f,2.78029f,89.8438f, +-238.281f,2.337f,89.8438f, +-234.375f,1.45614f,89.8438f, +-230.469f,0.487402f,89.8438f, +-226.563f,0.814658f,89.8438f, +-222.656f,-0.244101f,89.8438f, +-218.75f,-2.09422f,89.8438f, +-214.844f,-1.48441f,89.8438f, +-210.938f,-0.695794f,89.8438f, +-207.031f,0.742314f,89.8438f, +-203.125f,1.30594f,89.8438f, +-199.219f,1.49011f,89.8438f, +-195.313f,2.5687f,89.8438f, +-191.406f,3.72318f,89.8438f, +-187.5f,4.658f,89.8438f, +-183.594f,7.20615f,89.8438f, +-179.688f,9.85211f,89.8438f, +-175.781f,12.8482f,89.8438f, +-171.875f,14.6361f,89.8438f, +-167.969f,16.6036f,89.8438f, +-164.063f,19.7308f,89.8438f, +-160.156f,22.7068f,89.8438f, +-156.25f,24.421f,89.8438f, +-152.344f,25.8961f,89.8438f, +-148.438f,27.1249f,89.8438f, +-144.531f,29.0138f,89.8438f, +-140.625f,31.6384f,89.8438f, +-136.719f,33.9142f,89.8438f, +-132.813f,34.3317f,89.8438f, +-128.906f,36.0856f,89.8438f, +-125.0f,35.5134f,89.8438f, +-121.094f,34.7035f,89.8438f, +-117.188f,33.6847f,89.8438f, +-113.281f,34.2624f,89.8438f, +-109.375f,34.2147f,89.8438f, +-105.469f,32.2925f,89.8438f, +-101.563f,30.4889f,89.8438f, +-97.6563f,30.8562f,89.8438f, +-93.75f,31.4717f,89.8438f, +-89.8438f,30.2623f,89.8438f, +-85.9375f,28.4623f,89.8438f, +-82.0313f,26.6117f,89.8438f, +-78.125f,24.1755f,89.8438f, +-74.2188f,22.4752f,89.8438f, +-70.3125f,20.3246f,89.8438f, +-66.4063f,19.488f,89.8438f, +-62.5f,18.6447f,89.8438f, +-58.5938f,17.8933f,89.8438f, +-54.6875f,16.177f,89.8438f, +-50.7813f,15.2537f,89.8438f, +-46.875f,13.5232f,89.8438f, +-42.9688f,11.842f,89.8438f, +-39.0625f,10.223f,89.8438f, +-35.1563f,9.54441f,89.8438f, +-31.25f,9.73488f,89.8438f, +-27.3438f,10.7057f,89.8438f, +-23.4375f,11.9185f,89.8438f, +-19.5313f,13.2106f,89.8438f, +-15.625f,13.0807f,89.8438f, +-11.7188f,12.8112f,89.8438f, +-7.8125f,12.7972f,89.8438f, +-3.90625f,14.1049f,89.8438f, +0.0f,14.9674f,89.8438f, +3.90625f,15.6427f,89.8438f, +-250.0f,6.21462f,85.9375f, +-246.094f,4.66025f,85.9375f, +-242.188f,3.36279f,85.9375f, +-238.281f,1.97426f,85.9375f, +-234.375f,0.590897f,85.9375f, +-230.469f,2.01222f,85.9375f, +-226.563f,2.15192f,85.9375f, +-222.656f,0.78006f,85.9375f, +-218.75f,-0.424968f,85.9375f, +-214.844f,-0.512869f,85.9375f, +-210.938f,0.00319427f,85.9375f, +-207.031f,1.05715f,85.9375f, +-203.125f,2.11926f,85.9375f, +-199.219f,2.48862f,85.9375f, +-195.313f,3.89944f,85.9375f, +-191.406f,5.71899f,85.9375f, +-187.5f,6.41674f,85.9375f, +-183.594f,7.94295f,85.9375f, +-179.688f,10.9562f,85.9375f, +-175.781f,13.1951f,85.9375f, +-171.875f,15.7827f,85.9375f, +-167.969f,17.6951f,85.9375f, +-164.063f,20.2261f,85.9375f, +-160.156f,22.5211f,85.9375f, +-156.25f,24.8103f,85.9375f, +-152.344f,26.6666f,85.9375f, +-148.438f,27.7052f,85.9375f, +-144.531f,29.2234f,85.9375f, +-140.625f,31.4629f,85.9375f, +-136.719f,34.0955f,85.9375f, +-132.813f,34.7124f,85.9375f, +-128.906f,36.1712f,85.9375f, +-125.0f,36.4743f,85.9375f, +-121.094f,35.3967f,85.9375f, +-117.188f,34.3505f,85.9375f, +-113.281f,33.5175f,85.9375f, +-109.375f,32.9976f,85.9375f, +-105.469f,31.7882f,85.9375f, +-101.563f,31.1746f,85.9375f, +-97.6563f,31.0271f,85.9375f, +-93.75f,31.5303f,85.9375f, +-89.8438f,30.8744f,85.9375f, +-85.9375f,28.1434f,85.9375f, +-82.0313f,25.9196f,85.9375f, +-78.125f,24.4044f,85.9375f, +-74.2188f,21.9984f,85.9375f, +-70.3125f,20.0411f,85.9375f, +-66.4063f,19.9449f,85.9375f, +-62.5f,18.3893f,85.9375f, +-58.5938f,16.9846f,85.9375f, +-54.6875f,15.6155f,85.9375f, +-50.7813f,14.6152f,85.9375f, +-46.875f,12.7358f,85.9375f, +-42.9688f,12.1599f,85.9375f, +-39.0625f,10.1045f,85.9375f, +-35.1563f,9.61416f,85.9375f, +-31.25f,10.0784f,85.9375f, +-27.3438f,10.2188f,85.9375f, +-23.4375f,11.574f,85.9375f, +-19.5313f,11.8712f,85.9375f, +-15.625f,11.9109f,85.9375f, +-11.7188f,11.509f,85.9375f, +-7.8125f,13.9979f,85.9375f, +-3.90625f,14.8453f,85.9375f, +0.0f,14.7941f,85.9375f, +3.90625f,15.5916f,85.9375f, +-250.0f,6.94324f,82.0313f, +-246.094f,4.77131f,82.0313f, +-242.188f,3.62143f,82.0313f, +-238.281f,2.50324f,82.0313f, +-234.375f,1.40345f,82.0313f, +-230.469f,2.05881f,82.0313f, +-226.563f,2.41769f,82.0313f, +-222.656f,1.23736f,82.0313f, +-218.75f,1.59545f,82.0313f, +-214.844f,1.25313f,82.0313f, +-210.938f,1.53594f,82.0313f, +-207.031f,2.33073f,82.0313f, +-203.125f,2.59696f,82.0313f, +-199.219f,4.25487f,82.0313f, +-195.313f,5.86136f,82.0313f, +-191.406f,7.54631f,82.0313f, +-187.5f,8.7315f,82.0313f, +-183.594f,9.65737f,82.0313f, +-179.688f,11.5328f,82.0313f, +-175.781f,14.3069f,82.0313f, +-171.875f,16.2889f,82.0313f, +-167.969f,17.6379f,82.0313f, +-164.063f,20.4422f,82.0313f, +-160.156f,22.9557f,82.0313f, +-156.25f,25.0731f,82.0313f, +-152.344f,27.3881f,82.0313f, +-148.438f,28.7955f,82.0313f, +-144.531f,30.2575f,82.0313f, +-140.625f,32.5888f,82.0313f, +-136.719f,33.9884f,82.0313f, +-132.813f,34.4838f,82.0313f, +-128.906f,35.7672f,82.0313f, +-125.0f,36.1002f,82.0313f, +-121.094f,35.9318f,82.0313f, +-117.188f,34.9715f,82.0313f, +-113.281f,33.3187f,82.0313f, +-109.375f,31.9477f,82.0313f, +-105.469f,31.4437f,82.0313f, +-101.563f,31.2817f,82.0313f, +-97.6563f,32.08f,82.0313f, +-93.75f,31.4037f,82.0313f, +-89.8438f,30.2769f,82.0313f, +-85.9375f,28.1374f,82.0313f, +-82.0313f,25.4814f,82.0313f, +-78.125f,24.1831f,82.0313f, +-74.2188f,22.6148f,82.0313f, +-70.3125f,19.2585f,82.0313f, +-66.4063f,18.6785f,82.0313f, +-62.5f,17.7889f,82.0313f, +-58.5938f,16.5855f,82.0313f, +-54.6875f,14.6918f,82.0313f, +-50.7813f,12.9532f,82.0313f, +-46.875f,12.1502f,82.0313f, +-42.9688f,11.3533f,82.0313f, +-39.0625f,9.8302f,82.0313f, +-35.1563f,9.95311f,82.0313f, +-31.25f,10.7631f,82.0313f, +-27.3438f,10.2187f,82.0313f, +-23.4375f,10.1072f,82.0313f, +-19.5313f,11.299f,82.0313f, +-15.625f,11.5563f,82.0313f, +-11.7188f,13.9188f,82.0313f, +-7.8125f,15.247f,82.0313f, +-3.90625f,15.6866f,82.0313f, +0.0f,15.9694f,82.0313f, +3.90625f,16.9644f,82.0313f, +-250.0f,6.39735f,78.125f, +-246.094f,5.09353f,78.125f, +-242.188f,4.53503f,78.125f, +-238.281f,3.72522f,78.125f, +-234.375f,3.02648f,78.125f, +-230.469f,3.02057f,78.125f, +-226.563f,3.8807f,78.125f, +-222.656f,4.47382f,78.125f, +-218.75f,3.84005f,78.125f, +-214.844f,2.7347f,78.125f, +-210.938f,4.55018f,78.125f, +-207.031f,5.04579f,78.125f, +-203.125f,4.45937f,78.125f, +-199.219f,5.32656f,78.125f, +-195.313f,7.13791f,78.125f, +-191.406f,8.89822f,78.125f, +-187.5f,10.3911f,78.125f, +-183.594f,11.3679f,78.125f, +-179.688f,13.4068f,78.125f, +-175.781f,16.3393f,78.125f, +-171.875f,17.801f,78.125f, +-167.969f,19.0455f,78.125f, +-164.063f,21.4178f,78.125f, +-160.156f,23.555f,78.125f, +-156.25f,25.3953f,78.125f, +-152.344f,26.9657f,78.125f, +-148.438f,28.8194f,78.125f, +-144.531f,31.456f,78.125f, +-140.625f,33.3499f,78.125f, +-136.719f,34.2296f,78.125f, +-132.813f,34.5964f,78.125f, +-128.906f,35.7399f,78.125f, +-125.0f,35.4576f,78.125f, +-121.094f,35.7986f,78.125f, +-117.188f,34.4641f,78.125f, +-113.281f,33.925f,78.125f, +-109.375f,32.0574f,78.125f, +-105.469f,31.6743f,78.125f, +-101.563f,31.65f,78.125f, +-97.6563f,31.9461f,78.125f, +-93.75f,31.2261f,78.125f, +-89.8438f,30.4701f,78.125f, +-85.9375f,27.7569f,78.125f, +-82.0313f,25.4553f,78.125f, +-78.125f,23.3917f,78.125f, +-74.2188f,21.6944f,78.125f, +-70.3125f,18.6818f,78.125f, +-66.4063f,17.4066f,78.125f, +-62.5f,17.1317f,78.125f, +-58.5938f,16.5093f,78.125f, +-54.6875f,14.9512f,78.125f, +-50.7813f,13.228f,78.125f, +-46.875f,11.4638f,78.125f, +-42.9688f,10.3877f,78.125f, +-39.0625f,9.7131f,78.125f, +-35.1563f,10.0477f,78.125f, +-31.25f,10.325f,78.125f, +-27.3438f,10.317f,78.125f, +-23.4375f,10.9076f,78.125f, +-19.5313f,11.7808f,78.125f, +-15.625f,14.1905f,78.125f, +-11.7188f,15.6035f,78.125f, +-7.8125f,16.0979f,78.125f, +-3.90625f,16.6425f,78.125f, +0.0f,17.2837f,78.125f, +3.90625f,18.8244f,78.125f, +-250.0f,6.03592f,74.2188f, +-246.094f,5.17606f,74.2188f, +-242.188f,3.7036f,74.2188f, +-238.281f,3.69f,74.2188f, +-234.375f,4.60611f,74.2188f, +-230.469f,4.52682f,74.2188f, +-226.563f,5.59937f,74.2188f, +-222.656f,6.25837f,74.2188f, +-218.75f,5.11517f,74.2188f, +-214.844f,4.67242f,74.2188f, +-210.938f,5.76173f,74.2188f, +-207.031f,6.80461f,74.2188f, +-203.125f,6.95083f,74.2188f, +-199.219f,7.35893f,74.2188f, +-195.313f,8.63949f,74.2188f, +-191.406f,10.4144f,74.2188f, +-187.5f,11.8105f,74.2188f, +-183.594f,13.4583f,74.2188f, +-179.688f,15.5665f,74.2188f, +-175.781f,18.2568f,74.2188f, +-171.875f,19.1732f,74.2188f, +-167.969f,21.3098f,74.2188f, +-164.063f,23.6359f,74.2188f, +-160.156f,25.3154f,74.2188f, +-156.25f,27.6289f,74.2188f, +-152.344f,28.8953f,74.2188f, +-148.438f,30.5098f,74.2188f, +-144.531f,32.3942f,74.2188f, +-140.625f,33.3325f,74.2188f, +-136.719f,33.8009f,74.2188f, +-132.813f,35.0803f,74.2188f, +-128.906f,34.737f,74.2188f, +-125.0f,34.3656f,74.2188f, +-121.094f,34.2107f,74.2188f, +-117.188f,33.1645f,74.2188f, +-113.281f,32.0615f,74.2188f, +-109.375f,32.0827f,74.2188f, +-105.469f,32.4658f,74.2188f, +-101.563f,31.6315f,74.2188f, +-97.6563f,30.9698f,74.2188f, +-93.75f,30.6464f,74.2188f, +-89.8438f,29.9645f,74.2188f, +-85.9375f,27.4393f,74.2188f, +-82.0313f,25.2807f,74.2188f, +-78.125f,23.57f,74.2188f, +-74.2188f,20.653f,74.2188f, +-70.3125f,18.1395f,74.2188f, +-66.4063f,17.6585f,74.2188f, +-62.5f,17.2798f,74.2188f, +-58.5938f,16.6041f,74.2188f, +-54.6875f,14.6913f,74.2188f, +-50.7813f,13.1416f,74.2188f, +-46.875f,10.9374f,74.2188f, +-42.9688f,9.39485f,74.2188f, +-39.0625f,9.21956f,74.2188f, +-35.1563f,9.74875f,74.2188f, +-31.25f,10.3932f,74.2188f, +-27.3438f,10.7996f,74.2188f, +-23.4375f,11.5538f,74.2188f, +-19.5313f,13.5418f,74.2188f, +-15.625f,15.6336f,74.2188f, +-11.7188f,16.3846f,74.2188f, +-7.8125f,17.738f,74.2188f, +-3.90625f,17.98f,74.2188f, +0.0f,19.1669f,74.2188f, +3.90625f,20.6829f,74.2188f, +-250.0f,5.45149f,70.3125f, +-246.094f,4.83779f,70.3125f, +-242.188f,3.60093f,70.3125f, +-238.281f,3.26469f,70.3125f, +-234.375f,4.06145f,70.3125f, +-230.469f,5.31565f,70.3125f, +-226.563f,6.65809f,70.3125f, +-222.656f,6.70538f,70.3125f, +-218.75f,6.93258f,70.3125f, +-214.844f,6.84841f,70.3125f, +-210.938f,6.9662f,70.3125f, +-207.031f,7.74003f,70.3125f, +-203.125f,8.68749f,70.3125f, +-199.219f,9.06225f,70.3125f, +-195.313f,10.0803f,70.3125f, +-191.406f,12.202f,70.3125f, +-187.5f,14.063f,70.3125f, +-183.594f,15.732f,70.3125f, +-179.688f,18.3972f,70.3125f, +-175.781f,19.5054f,70.3125f, +-171.875f,20.8927f,70.3125f, +-167.969f,23.3843f,70.3125f, +-164.063f,25.5894f,70.3125f, +-160.156f,27.0506f,70.3125f, +-156.25f,28.6483f,70.3125f, +-152.344f,31.3986f,70.3125f, +-148.438f,32.5255f,70.3125f, +-144.531f,33.0315f,70.3125f, +-140.625f,33.0927f,70.3125f, +-136.719f,33.7595f,70.3125f, +-132.813f,34.1872f,70.3125f, +-128.906f,33.4924f,70.3125f, +-125.0f,34.1817f,70.3125f, +-121.094f,33.4642f,70.3125f, +-117.188f,32.3231f,70.3125f, +-113.281f,32.1235f,70.3125f, +-109.375f,32.674f,70.3125f, +-105.469f,32.7558f,70.3125f, +-101.563f,32.4896f,70.3125f, +-97.6563f,30.7945f,70.3125f, +-93.75f,30.1182f,70.3125f, +-89.8438f,28.6969f,70.3125f, +-85.9375f,26.606f,70.3125f, +-82.0313f,24.8053f,70.3125f, +-78.125f,23.3599f,70.3125f, +-74.2188f,20.5363f,70.3125f, +-70.3125f,18.2858f,70.3125f, +-66.4063f,17.647f,70.3125f, +-62.5f,17.3761f,70.3125f, +-58.5938f,16.3124f,70.3125f, +-54.6875f,14.016f,70.3125f, +-50.7813f,11.6317f,70.3125f, +-46.875f,9.68832f,70.3125f, +-42.9688f,8.63692f,70.3125f, +-39.0625f,8.52412f,70.3125f, +-35.1563f,10.3549f,70.3125f, +-31.25f,11.1185f,70.3125f, +-27.3438f,12.8223f,70.3125f, +-23.4375f,14.2548f,70.3125f, +-19.5313f,15.4066f,70.3125f, +-15.625f,16.875f,70.3125f, +-11.7188f,17.7202f,70.3125f, +-7.8125f,18.6716f,70.3125f, +-3.90625f,19.72f,70.3125f, +0.0f,21.3086f,70.3125f, +3.90625f,22.948f,70.3125f, +-250.0f,4.53118f,66.4063f, +-246.094f,3.73568f,66.4063f, +-242.188f,3.80679f,66.4063f, +-238.281f,4.42509f,66.4063f, +-234.375f,5.0317f,66.4063f, +-230.469f,6.63484f,66.4063f, +-226.563f,7.65599f,66.4063f, +-222.656f,8.55305f,66.4063f, +-218.75f,8.71866f,66.4063f, +-214.844f,7.68897f,66.4063f, +-210.938f,8.59141f,66.4063f, +-207.031f,9.73811f,66.4063f, +-203.125f,10.1348f,66.4063f, +-199.219f,10.1075f,66.4063f, +-195.313f,11.1394f,66.4063f, +-191.406f,13.5829f,66.4063f, +-187.5f,15.4951f,66.4063f, +-183.594f,17.5574f,66.4063f, +-179.688f,19.9291f,66.4063f, +-175.781f,21.0567f,66.4063f, +-171.875f,22.5003f,66.4063f, +-167.969f,25.5993f,66.4063f, +-164.063f,27.0097f,66.4063f, +-160.156f,27.9166f,66.4063f, +-156.25f,29.8989f,66.4063f, +-152.344f,32.1785f,66.4063f, +-148.438f,34.0669f,66.4063f, +-144.531f,34.5129f,66.4063f, +-140.625f,34.1795f,66.4063f, +-136.719f,33.3311f,66.4063f, +-132.813f,32.969f,66.4063f, +-128.906f,32.9477f,66.4063f, +-125.0f,33.5186f,66.4063f, +-121.094f,32.9715f,66.4063f, +-117.188f,32.4898f,66.4063f, +-113.281f,33.0858f,66.4063f, +-109.375f,32.6501f,66.4063f, +-105.469f,32.847f,66.4063f, +-101.563f,32.8074f,66.4063f, +-97.6563f,31.5661f,66.4063f, +-93.75f,29.4807f,66.4063f, +-89.8438f,28.6706f,66.4063f, +-85.9375f,26.408f,66.4063f, +-82.0313f,24.3989f,66.4063f, +-78.125f,22.4069f,66.4063f, +-74.2188f,20.2026f,66.4063f, +-70.3125f,18.5513f,66.4063f, +-66.4063f,17.0548f,66.4063f, +-62.5f,17.0623f,66.4063f, +-58.5938f,15.9909f,66.4063f, +-54.6875f,13.3885f,66.4063f, +-50.7813f,11.8657f,66.4063f, +-46.875f,9.02652f,66.4063f, +-42.9688f,8.99046f,66.4063f, +-39.0625f,10.0543f,66.4063f, +-35.1563f,11.7078f,66.4063f, +-31.25f,12.4956f,66.4063f, +-27.3438f,14.0575f,66.4063f, +-23.4375f,15.2147f,66.4063f, +-19.5313f,16.7089f,66.4063f, +-15.625f,17.8009f,66.4063f, +-11.7188f,19.0086f,66.4063f, +-7.8125f,20.9864f,66.4063f, +-3.90625f,22.6943f,66.4063f, +0.0f,23.9641f,66.4063f, +3.90625f,25.5564f,66.4063f, +-250.0f,4.6779f,62.5f, +-246.094f,4.41735f,62.5f, +-242.188f,3.93647f,62.5f, +-238.281f,4.50648f,62.5f, +-234.375f,5.52163f,62.5f, +-230.469f,7.10395f,62.5f, +-226.563f,8.10257f,62.5f, +-222.656f,8.36726f,62.5f, +-218.75f,8.58321f,62.5f, +-214.844f,8.56809f,62.5f, +-210.938f,9.95321f,62.5f, +-207.031f,10.4904f,62.5f, +-203.125f,10.812f,62.5f, +-199.219f,11.5942f,62.5f, +-195.313f,13.0371f,62.5f, +-191.406f,14.6432f,62.5f, +-187.5f,16.7375f,62.5f, +-183.594f,18.4129f,62.5f, +-179.688f,20.9534f,62.5f, +-175.781f,23.1161f,62.5f, +-171.875f,25.0267f,62.5f, +-167.969f,26.7355f,62.5f, +-164.063f,27.6983f,62.5f, +-160.156f,29.1111f,62.5f, +-156.25f,31.1905f,62.5f, +-152.344f,32.9766f,62.5f, +-148.438f,33.4703f,62.5f, +-144.531f,33.714f,62.5f, +-140.625f,33.649f,62.5f, +-136.719f,33.0246f,62.5f, +-132.813f,32.7386f,62.5f, +-128.906f,32.6069f,62.5f, +-125.0f,32.6579f,62.5f, +-121.094f,31.5955f,62.5f, +-117.188f,31.8589f,62.5f, +-113.281f,32.7188f,62.5f, +-109.375f,32.889f,62.5f, +-105.469f,32.7317f,62.5f, +-101.563f,32.4229f,62.5f, +-97.6563f,31.2118f,62.5f, +-93.75f,30.6824f,62.5f, +-89.8438f,28.584f,62.5f, +-85.9375f,26.1183f,62.5f, +-82.0313f,23.8148f,62.5f, +-78.125f,22.0333f,62.5f, +-74.2188f,20.178f,62.5f, +-70.3125f,18.704f,62.5f, +-66.4063f,16.8036f,62.5f, +-62.5f,15.7173f,62.5f, +-58.5938f,13.9284f,62.5f, +-54.6875f,13.0731f,62.5f, +-50.7813f,11.8974f,62.5f, +-46.875f,9.91347f,62.5f, +-42.9688f,10.1439f,62.5f, +-39.0625f,11.304f,62.5f, +-35.1563f,12.5111f,62.5f, +-31.25f,14.112f,62.5f, +-27.3438f,15.3325f,62.5f, +-23.4375f,16.6214f,62.5f, +-19.5313f,17.8469f,62.5f, +-15.625f,19.2987f,62.5f, +-11.7188f,20.9518f,62.5f, +-7.8125f,23.4289f,62.5f, +-3.90625f,24.9379f,62.5f, +0.0f,26.156f,62.5f, +3.90625f,27.1929f,62.5f, +-250.0f,4.23938f,58.5938f, +-246.094f,4.819f,58.5938f, +-242.188f,4.63067f,58.5938f, +-238.281f,5.29023f,58.5938f, +-234.375f,6.48193f,58.5938f, +-230.469f,6.85856f,58.5938f, +-226.563f,8.4748f,58.5938f, +-222.656f,8.76416f,58.5938f, +-218.75f,9.24425f,58.5938f, +-214.844f,9.67654f,58.5938f, +-210.938f,10.8063f,58.5938f, +-207.031f,12.3237f,58.5938f, +-203.125f,12.7409f,58.5938f, +-199.219f,12.7587f,58.5938f, +-195.313f,14.3653f,58.5938f, +-191.406f,16.1467f,58.5938f, +-187.5f,17.0489f,58.5938f, +-183.594f,19.2091f,58.5938f, +-179.688f,21.7856f,58.5938f, +-175.781f,24.7829f,58.5938f, +-171.875f,26.2396f,58.5938f, +-167.969f,27.2756f,58.5938f, +-164.063f,28.2919f,58.5938f, +-160.156f,30.5945f,58.5938f, +-156.25f,32.2617f,58.5938f, +-152.344f,32.9049f,58.5938f, +-148.438f,32.8002f,58.5938f, +-144.531f,32.4751f,58.5938f, +-140.625f,32.4049f,58.5938f, +-136.719f,33.5631f,58.5938f, +-132.813f,33.3828f,58.5938f, +-128.906f,33.1064f,58.5938f, +-125.0f,32.3054f,58.5938f, +-121.094f,32.5047f,58.5938f, +-117.188f,32.3246f,58.5938f, +-113.281f,32.4393f,58.5938f, +-109.375f,32.553f,58.5938f, +-105.469f,32.9281f,58.5938f, +-101.563f,31.8539f,58.5938f, +-97.6563f,30.9253f,58.5938f, +-93.75f,30.4328f,58.5938f, +-89.8438f,28.3295f,58.5938f, +-85.9375f,25.5393f,58.5938f, +-82.0313f,23.0691f,58.5938f, +-78.125f,21.505f,58.5938f, +-74.2188f,21.0748f,58.5938f, +-70.3125f,19.1186f,58.5938f, +-66.4063f,16.7814f,58.5938f, +-62.5f,15.2179f,58.5938f, +-58.5938f,14.1291f,58.5938f, +-54.6875f,13.2351f,58.5938f, +-50.7813f,11.896f,58.5938f, +-46.875f,11.0911f,58.5938f, +-42.9688f,12.7485f,58.5938f, +-39.0625f,13.7045f,58.5938f, +-35.1563f,14.6128f,58.5938f, +-31.25f,15.546f,58.5938f, +-27.3438f,16.7828f,58.5938f, +-23.4375f,18.7578f,58.5938f, +-19.5313f,19.7951f,58.5938f, +-15.625f,21.8594f,58.5938f, +-11.7188f,22.7269f,58.5938f, +-7.8125f,24.983f,58.5938f, +-3.90625f,26.43f,58.5938f, +0.0f,27.4466f,58.5938f, +3.90625f,28.3495f,58.5938f, +-250.0f,3.62748f,54.6875f, +-246.094f,3.83329f,54.6875f, +-242.188f,4.44022f,54.6875f, +-238.281f,5.27514f,54.6875f, +-234.375f,7.43995f,54.6875f, +-230.469f,7.59176f,54.6875f, +-226.563f,8.28985f,54.6875f, +-222.656f,9.62184f,54.6875f, +-218.75f,10.6613f,54.6875f, +-214.844f,11.0914f,54.6875f, +-210.938f,12.2186f,54.6875f, +-207.031f,13.1985f,54.6875f, +-203.125f,13.9982f,54.6875f, +-199.219f,14.3187f,54.6875f, +-195.313f,14.8791f,54.6875f, +-191.406f,16.5829f,54.6875f, +-187.5f,18.231f,54.6875f, +-183.594f,20.0621f,54.6875f, +-179.688f,22.8941f,54.6875f, +-175.781f,25.0841f,54.6875f, +-171.875f,26.5655f,54.6875f, +-167.969f,27.3542f,54.6875f, +-164.063f,29.2247f,54.6875f, +-160.156f,30.91f,54.6875f, +-156.25f,33.3376f,54.6875f, +-152.344f,32.8808f,54.6875f, +-148.438f,32.5783f,54.6875f, +-144.531f,32.6138f,54.6875f, +-140.625f,32.9002f,54.6875f, +-136.719f,34.2312f,54.6875f, +-132.813f,33.8335f,54.6875f, +-128.906f,32.8545f,54.6875f, +-125.0f,33.6683f,54.6875f, +-121.094f,32.9953f,54.6875f, +-117.188f,32.5096f,54.6875f, +-113.281f,32.4307f,54.6875f, +-109.375f,31.8214f,54.6875f, +-105.469f,31.851f,54.6875f, +-101.563f,31.6383f,54.6875f, +-97.6563f,30.4359f,54.6875f, +-93.75f,28.9306f,54.6875f, +-89.8438f,26.5955f,54.6875f, +-85.9375f,24.7234f,54.6875f, +-82.0313f,23.0595f,54.6875f, +-78.125f,21.3558f,54.6875f, +-74.2188f,20.3788f,54.6875f, +-70.3125f,19.3201f,54.6875f, +-66.4063f,16.9597f,54.6875f, +-62.5f,14.6652f,54.6875f, +-58.5938f,14.4899f,54.6875f, +-54.6875f,13.3432f,54.6875f, +-50.7813f,12.3286f,54.6875f, +-46.875f,12.6498f,54.6875f, +-42.9688f,14.2651f,54.6875f, +-39.0625f,15.6887f,54.6875f, +-35.1563f,16.2038f,54.6875f, +-31.25f,17.2337f,54.6875f, +-27.3438f,18.7628f,54.6875f, +-23.4375f,20.2472f,54.6875f, +-19.5313f,21.6809f,54.6875f, +-15.625f,24.084f,54.6875f, +-11.7188f,25.1582f,54.6875f, +-7.8125f,26.7f,54.6875f, +-3.90625f,27.5421f,54.6875f, +0.0f,28.3244f,54.6875f, +3.90625f,29.2057f,54.6875f, +-250.0f,3.74657f,50.7813f, +-246.094f,3.89172f,50.7813f, +-242.188f,4.12295f,50.7813f, +-238.281f,5.16915f,50.7813f, +-234.375f,6.30394f,50.7813f, +-230.469f,7.21975f,50.7813f, +-226.563f,8.61249f,50.7813f, +-222.656f,10.1295f,50.7813f, +-218.75f,12.2813f,50.7813f, +-214.844f,12.3309f,50.7813f, +-210.938f,13.3907f,50.7813f, +-207.031f,14.1528f,50.7813f, +-203.125f,14.0334f,50.7813f, +-199.219f,14.814f,50.7813f, +-195.313f,16.69f,50.7813f, +-191.406f,17.639f,50.7813f, +-187.5f,19.261f,50.7813f, +-183.594f,20.748f,50.7813f, +-179.688f,23.3343f,50.7813f, +-175.781f,25.4837f,50.7813f, +-171.875f,26.8456f,50.7813f, +-167.969f,27.7788f,50.7813f, +-164.063f,30.0174f,50.7813f, +-160.156f,31.0689f,50.7813f, +-156.25f,32.5898f,50.7813f, +-152.344f,32.5672f,50.7813f, +-148.438f,32.4654f,50.7813f, +-144.531f,33.702f,50.7813f, +-140.625f,34.7593f,50.7813f, +-136.719f,33.9086f,50.7813f, +-132.813f,33.681f,50.7813f, +-128.906f,33.6369f,50.7813f, +-125.0f,34.0371f,50.7813f, +-121.094f,34.0479f,50.7813f, +-117.188f,34.513f,50.7813f, +-113.281f,33.7072f,50.7813f, +-109.375f,32.2763f,50.7813f, +-105.469f,32.0608f,50.7813f, +-101.563f,31.0833f,50.7813f, +-97.6563f,29.9168f,50.7813f, +-93.75f,28.7604f,50.7813f, +-89.8438f,26.9563f,50.7813f, +-85.9375f,24.7908f,50.7813f, +-82.0313f,23.7925f,50.7813f, +-78.125f,21.7037f,50.7813f, +-74.2188f,19.5308f,50.7813f, +-70.3125f,19.3367f,50.7813f, +-66.4063f,17.8482f,50.7813f, +-62.5f,14.2491f,50.7813f, +-58.5938f,14.7414f,50.7813f, +-54.6875f,14.0395f,50.7813f, +-50.7813f,12.9738f,50.7813f, +-46.875f,13.9471f,50.7813f, +-42.9688f,15.8319f,50.7813f, +-39.0625f,16.6566f,50.7813f, +-35.1563f,17.1252f,50.7813f, +-31.25f,18.6998f,50.7813f, +-27.3438f,20.877f,50.7813f, +-23.4375f,22.0249f,50.7813f, +-19.5313f,22.9369f,50.7813f, +-15.625f,25.686f,50.7813f, +-11.7188f,26.1758f,50.7813f, +-7.8125f,28.3828f,50.7813f, +-3.90625f,28.7973f,50.7813f, +0.0f,29.7276f,50.7813f, +3.90625f,30.4306f,50.7813f, +-250.0f,3.69244f,46.875f, +-246.094f,3.88583f,46.875f, +-242.188f,3.98468f,46.875f, +-238.281f,5.01772f,46.875f, +-234.375f,7.23791f,46.875f, +-230.469f,7.78117f,46.875f, +-226.563f,8.55298f,46.875f, +-222.656f,10.2684f,46.875f, +-218.75f,11.1917f,46.875f, +-214.844f,12.411f,46.875f, +-210.938f,13.7214f,46.875f, +-207.031f,14.4662f,46.875f, +-203.125f,15.536f,46.875f, +-199.219f,15.6035f,46.875f, +-195.313f,16.8456f,46.875f, +-191.406f,18.4656f,46.875f, +-187.5f,19.415f,46.875f, +-183.594f,20.8504f,46.875f, +-179.688f,23.9388f,46.875f, +-175.781f,26.2956f,46.875f, +-171.875f,27.6728f,46.875f, +-167.969f,28.2497f,46.875f, +-164.063f,29.6503f,46.875f, +-160.156f,31.9344f,46.875f, +-156.25f,33.4163f,46.875f, +-152.344f,33.428f,46.875f, +-148.438f,33.3157f,46.875f, +-144.531f,33.6261f,46.875f, +-140.625f,35.1888f,46.875f, +-136.719f,34.8434f,46.875f, +-132.813f,34.1219f,46.875f, +-128.906f,34.4564f,46.875f, +-125.0f,34.9729f,46.875f, +-121.094f,34.8811f,46.875f, +-117.188f,35.185f,46.875f, +-113.281f,34.138f,46.875f, +-109.375f,32.7077f,46.875f, +-105.469f,32.2219f,46.875f, +-101.563f,31.2475f,46.875f, +-97.6563f,29.9637f,46.875f, +-93.75f,28.1214f,46.875f, +-89.8438f,27.0889f,46.875f, +-85.9375f,25.092f,46.875f, +-82.0313f,23.3983f,46.875f, +-78.125f,22.275f,46.875f, +-74.2188f,19.8598f,46.875f, +-70.3125f,18.8797f,46.875f, +-66.4063f,17.2468f,46.875f, +-62.5f,15.4985f,46.875f, +-58.5938f,14.5357f,46.875f, +-54.6875f,14.6964f,46.875f, +-50.7813f,13.3496f,46.875f, +-46.875f,15.6354f,46.875f, +-42.9688f,16.7177f,46.875f, +-39.0625f,17.4527f,46.875f, +-35.1563f,18.2826f,46.875f, +-31.25f,20.3293f,46.875f, +-27.3438f,22.684f,46.875f, +-23.4375f,23.538f,46.875f, +-19.5313f,24.3046f,46.875f, +-15.625f,26.1113f,46.875f, +-11.7188f,27.4881f,46.875f, +-7.8125f,29.3572f,46.875f, +-3.90625f,29.786f,46.875f, +0.0f,30.3637f,46.875f, +3.90625f,30.8772f,46.875f, +-250.0f,4.08083f,42.9688f, +-246.094f,4.09778f,42.9688f, +-242.188f,3.87631f,42.9688f, +-238.281f,5.12214f,42.9688f, +-234.375f,6.70993f,42.9688f, +-230.469f,7.75806f,42.9688f, +-226.563f,8.13676f,42.9688f, +-222.656f,8.85151f,42.9688f, +-218.75f,10.9378f,42.9688f, +-214.844f,12.4043f,42.9688f, +-210.938f,13.4636f,42.9688f, +-207.031f,14.7352f,42.9688f, +-203.125f,15.605f,42.9688f, +-199.219f,15.7497f,42.9688f, +-195.313f,17.184f,42.9688f, +-191.406f,19.3679f,42.9688f, +-187.5f,21.1701f,42.9688f, +-183.594f,22.7204f,42.9688f, +-179.688f,24.8128f,42.9688f, +-175.781f,26.7707f,42.9688f, +-171.875f,27.7521f,42.9688f, +-167.969f,28.8689f,42.9688f, +-164.063f,31.1205f,42.9688f, +-160.156f,33.289f,42.9688f, +-156.25f,34.2815f,42.9688f, +-152.344f,33.9797f,42.9688f, +-148.438f,34.2527f,42.9688f, +-144.531f,34.1886f,42.9688f, +-140.625f,34.868f,42.9688f, +-136.719f,35.6569f,42.9688f, +-132.813f,35.4999f,42.9688f, +-128.906f,35.4373f,42.9688f, +-125.0f,36.373f,42.9688f, +-121.094f,35.4304f,42.9688f, +-117.188f,34.3543f,42.9688f, +-113.281f,35.0651f,42.9688f, +-109.375f,33.5051f,42.9688f, +-105.469f,32.471f,42.9688f, +-101.563f,31.2764f,42.9688f, +-97.6563f,29.7633f,42.9688f, +-93.75f,27.9107f,42.9688f, +-89.8438f,26.5273f,42.9688f, +-85.9375f,25.2444f,42.9688f, +-82.0313f,23.6093f,42.9688f, +-78.125f,21.9684f,42.9688f, +-74.2188f,19.4992f,42.9688f, +-70.3125f,17.8231f,42.9688f, +-66.4063f,17.4082f,42.9688f, +-62.5f,17.0938f,42.9688f, +-58.5938f,15.3348f,42.9688f, +-54.6875f,14.7964f,42.9688f, +-50.7813f,14.9948f,42.9688f, +-46.875f,17.1807f,42.9688f, +-42.9688f,18.118f,42.9688f, +-39.0625f,19.0809f,42.9688f, +-35.1563f,19.6971f,42.9688f, +-31.25f,21.652f,42.9688f, +-27.3438f,23.4343f,42.9688f, +-23.4375f,24.5708f,42.9688f, +-19.5313f,25.2003f,42.9688f, +-15.625f,26.8391f,42.9688f, +-11.7188f,28.9343f,42.9688f, +-7.8125f,29.9079f,42.9688f, +-3.90625f,31.268f,42.9688f, +0.0f,31.3916f,42.9688f, +3.90625f,31.8945f,42.9688f, +-250.0f,4.27976f,39.0625f, +-246.094f,4.20341f,39.0625f, +-242.188f,3.80298f,39.0625f, +-238.281f,4.79243f,39.0625f, +-234.375f,5.51846f,39.0625f, +-230.469f,6.91597f,39.0625f, +-226.563f,8.25726f,39.0625f, +-222.656f,8.85037f,39.0625f, +-218.75f,9.57429f,39.0625f, +-214.844f,11.3899f,39.0625f, +-210.938f,12.5806f,39.0625f, +-207.031f,14.2509f,39.0625f, +-203.125f,14.7828f,39.0625f, +-199.219f,15.9801f,39.0625f, +-195.313f,17.4225f,39.0625f, +-191.406f,19.6018f,39.0625f, +-187.5f,22.1095f,39.0625f, +-183.594f,23.8333f,39.0625f, +-179.688f,25.0671f,39.0625f, +-175.781f,27.1067f,39.0625f, +-171.875f,28.5f,39.0625f, +-167.969f,29.9625f,39.0625f, +-164.063f,32.3895f,39.0625f, +-160.156f,33.8224f,39.0625f, +-156.25f,34.3349f,39.0625f, +-152.344f,34.4661f,39.0625f, +-148.438f,34.7236f,39.0625f, +-144.531f,34.1129f,39.0625f, +-140.625f,34.9033f,39.0625f, +-136.719f,35.6229f,39.0625f, +-132.813f,35.7143f,39.0625f, +-128.906f,36.7151f,39.0625f, +-125.0f,36.9574f,39.0625f, +-121.094f,36.0729f,39.0625f, +-117.188f,35.2171f,39.0625f, +-113.281f,34.9343f,39.0625f, +-109.375f,34.5707f,39.0625f, +-105.469f,33.5046f,39.0625f, +-101.563f,31.353f,39.0625f, +-97.6563f,30.0283f,39.0625f, +-93.75f,28.6272f,39.0625f, +-89.8438f,26.4389f,39.0625f, +-85.9375f,24.8159f,39.0625f, +-82.0313f,23.0295f,39.0625f, +-78.125f,21.1082f,39.0625f, +-74.2188f,19.1239f,39.0625f, +-70.3125f,18.0914f,39.0625f, +-66.4063f,17.3227f,39.0625f, +-62.5f,17.1022f,39.0625f, +-58.5938f,16.4298f,39.0625f, +-54.6875f,15.6704f,39.0625f, +-50.7813f,16.5664f,39.0625f, +-46.875f,18.478f,39.0625f, +-42.9688f,19.4144f,39.0625f, +-39.0625f,19.9351f,39.0625f, +-35.1563f,20.3447f,39.0625f, +-31.25f,22.4348f,39.0625f, +-27.3438f,24.5713f,39.0625f, +-23.4375f,25.5465f,39.0625f, +-19.5313f,26.485f,39.0625f, +-15.625f,28.292f,39.0625f, +-11.7188f,30.0016f,39.0625f, +-7.8125f,32.2532f,39.0625f, +-3.90625f,33.6327f,39.0625f, +0.0f,33.835f,39.0625f, +3.90625f,34.9171f,39.0625f, +-250.0f,3.91889f,35.1563f, +-246.094f,3.38127f,35.1563f, +-242.188f,3.26935f,35.1563f, +-238.281f,4.06778f,35.1563f, +-234.375f,4.87411f,35.1563f, +-230.469f,6.48873f,35.1563f, +-226.563f,7.17326f,35.1563f, +-222.656f,8.21235f,35.1563f, +-218.75f,8.21965f,35.1563f, +-214.844f,10.417f,35.1563f, +-210.938f,11.9497f,35.1563f, +-207.031f,13.4145f,35.1563f, +-203.125f,14.0876f,35.1563f, +-199.219f,15.5077f,35.1563f, +-195.313f,16.9011f,35.1563f, +-191.406f,20.4395f,35.1563f, +-187.5f,23.001f,35.1563f, +-183.594f,24.0199f,35.1563f, +-179.688f,25.7082f,35.1563f, +-175.781f,27.3018f,35.1563f, +-171.875f,28.9584f,35.1563f, +-167.969f,31.1478f,35.1563f, +-164.063f,32.8635f,35.1563f, +-160.156f,33.5517f,35.1563f, +-156.25f,34.5761f,35.1563f, +-152.344f,34.5761f,35.1563f, +-148.438f,34.2002f,35.1563f, +-144.531f,34.7177f,35.1563f, +-140.625f,35.5653f,35.1563f, +-136.719f,35.7993f,35.1563f, +-132.813f,37.1127f,35.1563f, +-128.906f,37.2477f,35.1563f, +-125.0f,36.8734f,35.1563f, +-121.094f,35.4154f,35.1563f, +-117.188f,34.8545f,35.1563f, +-113.281f,35.4317f,35.1563f, +-109.375f,34.9205f,35.1563f, +-105.469f,33.5115f,35.1563f, +-101.563f,32.2368f,35.1563f, +-97.6563f,30.3601f,35.1563f, +-93.75f,29.2913f,35.1563f, +-89.8438f,27.4791f,35.1563f, +-85.9375f,24.811f,35.1563f, +-82.0313f,23.4984f,35.1563f, +-78.125f,21.456f,35.1563f, +-74.2188f,19.8992f,35.1563f, +-70.3125f,17.7354f,35.1563f, +-66.4063f,17.3066f,35.1563f, +-62.5f,17.1745f,35.1563f, +-58.5938f,16.5285f,35.1563f, +-54.6875f,17.2826f,35.1563f, +-50.7813f,18.6936f,35.1563f, +-46.875f,19.4228f,35.1563f, +-42.9688f,20.2022f,35.1563f, +-39.0625f,21.4261f,35.1563f, +-35.1563f,21.5779f,35.1563f, +-31.25f,24.0097f,35.1563f, +-27.3438f,25.4481f,35.1563f, +-23.4375f,26.0036f,35.1563f, +-19.5313f,27.4346f,35.1563f, +-15.625f,30.2459f,35.1563f, +-11.7188f,32.81f,35.1563f, +-7.8125f,34.7924f,35.1563f, +-3.90625f,35.8907f,35.1563f, +0.0f,36.9755f,35.1563f, +3.90625f,38.5427f,35.1563f, +-250.0f,2.28536f,31.25f, +-246.094f,1.63842f,31.25f, +-242.188f,2.40273f,31.25f, +-238.281f,3.19518f,31.25f, +-234.375f,3.99394f,31.25f, +-230.469f,4.99674f,31.25f, +-226.563f,5.63235f,31.25f, +-222.656f,6.86331f,31.25f, +-218.75f,7.37515f,31.25f, +-214.844f,9.34737f,31.25f, +-210.938f,11.7034f,31.25f, +-207.031f,13.4309f,31.25f, +-203.125f,14.4474f,31.25f, +-199.219f,15.8817f,31.25f, +-195.313f,17.87f,31.25f, +-191.406f,20.9938f,31.25f, +-187.5f,23.5333f,31.25f, +-183.594f,24.4107f,31.25f, +-179.688f,26.0811f,31.25f, +-175.781f,27.9797f,31.25f, +-171.875f,29.4813f,31.25f, +-167.969f,31.7071f,31.25f, +-164.063f,33.0836f,31.25f, +-160.156f,33.5998f,31.25f, +-156.25f,33.5304f,31.25f, +-152.344f,33.9929f,31.25f, +-148.438f,35.4297f,31.25f, +-144.531f,36.4531f,31.25f, +-140.625f,35.9197f,31.25f, +-136.719f,36.6849f,31.25f, +-132.813f,37.8161f,31.25f, +-128.906f,37.6166f,31.25f, +-125.0f,36.9426f,31.25f, +-121.094f,35.6388f,31.25f, +-117.188f,35.0026f,31.25f, +-113.281f,35.386f,31.25f, +-109.375f,34.6287f,31.25f, +-105.469f,33.8962f,31.25f, +-101.563f,32.1844f,31.25f, +-97.6563f,30.7868f,31.25f, +-93.75f,29.267f,31.25f, +-89.8438f,27.2585f,31.25f, +-85.9375f,25.4236f,31.25f, +-82.0313f,23.0281f,31.25f, +-78.125f,21.4593f,31.25f, +-74.2188f,19.4556f,31.25f, +-70.3125f,18.0982f,31.25f, +-66.4063f,17.1214f,31.25f, +-62.5f,17.1751f,31.25f, +-58.5938f,17.1429f,31.25f, +-54.6875f,18.4434f,31.25f, +-50.7813f,19.9422f,31.25f, +-46.875f,21.2124f,31.25f, +-42.9688f,21.2106f,31.25f, +-39.0625f,22.1346f,31.25f, +-35.1563f,23.3082f,31.25f, +-31.25f,24.7044f,31.25f, +-27.3438f,26.2688f,31.25f, +-23.4375f,27.5692f,31.25f, +-19.5313f,30.4099f,31.25f, +-15.625f,33.0453f,31.25f, +-11.7188f,34.9857f,31.25f, +-7.8125f,37.0727f,31.25f, +-3.90625f,39.2219f,31.25f, +0.0f,40.3658f,31.25f, +3.90625f,41.4381f,31.25f, +-250.0f,0.4773f,27.3438f, +-246.094f,0.631847f,27.3438f, +-242.188f,1.21449f,27.3438f, +-238.281f,1.52728f,27.3438f, +-234.375f,2.73146f,27.3438f, +-230.469f,3.65375f,27.3438f, +-226.563f,5.03467f,27.3438f, +-222.656f,6.27065f,27.3438f, +-218.75f,7.56964f,27.3438f, +-214.844f,9.63719f,27.3438f, +-210.938f,11.4022f,27.3438f, +-207.031f,12.7085f,27.3438f, +-203.125f,14.3808f,27.3438f, +-199.219f,15.9121f,27.3438f, +-195.313f,17.8953f,27.3438f, +-191.406f,20.8456f,27.3438f, +-187.5f,22.7705f,27.3438f, +-183.594f,24.5794f,27.3437f, +-179.688f,27.055f,27.3438f, +-175.781f,29.3548f,27.3437f, +-171.875f,30.4534f,27.3438f, +-167.969f,32.4366f,27.3437f, +-164.063f,34.4967f,27.3438f, +-160.156f,34.9614f,27.3437f, +-156.25f,34.9405f,27.3438f, +-152.344f,35.7165f,27.3437f, +-148.438f,37.0387f,27.3438f, +-144.531f,38.0934f,27.3437f, +-140.625f,37.3872f,27.3438f, +-136.719f,36.4336f,27.3437f, +-132.813f,37.0365f,27.3438f, +-128.906f,37.2591f,27.3437f, +-125.0f,36.5502f,27.3438f, +-121.094f,35.4814f,27.3437f, +-117.188f,35.3267f,27.3438f, +-113.281f,34.3757f,27.3437f, +-109.375f,34.2455f,27.3438f, +-105.469f,33.6851f,27.3437f, +-101.563f,32.3527f,27.3438f, +-97.6563f,30.111f,27.3437f, +-93.75f,28.4912f,27.3438f, +-89.8438f,27.0398f,27.3437f, +-85.9375f,24.9699f,27.3438f, +-82.0313f,22.9703f,27.3437f, +-78.125f,21.7502f,27.3438f, +-74.2188f,18.8537f,27.3438f, +-70.3125f,18.2353f,27.3438f, +-66.4063f,18.3708f,27.3438f, +-62.5f,18.6738f,27.3438f, +-58.5938f,18.5559f,27.3438f, +-54.6875f,19.1603f,27.3438f, +-50.7813f,20.8349f,27.3438f, +-46.875f,21.6092f,27.3438f, +-42.9688f,21.9317f,27.3437f, +-39.0625f,23.0486f,27.3438f, +-35.1563f,24.8675f,27.3437f, +-31.25f,25.6906f,27.3438f, +-27.3438f,27.9695f,27.3437f, +-23.4375f,30.3105f,27.3438f, +-19.5313f,33.9897f,27.3437f, +-15.625f,35.6988f,27.3438f, +-11.7188f,37.9213f,27.3437f, +-7.8125f,40.1355f,27.3438f, +-3.90625f,41.6062f,27.3437f, +0.0f,42.273f,27.3438f, +3.90625f,42.7334f,27.3437f, +-250.0f,0.178144f,23.4375f, +-246.094f,1.07943f,23.4375f, +-242.188f,1.52473f,23.4375f, +-238.281f,2.58652f,23.4375f, +-234.375f,3.51451f,23.4375f, +-230.469f,4.23103f,23.4375f, +-226.563f,5.80506f,23.4375f, +-222.656f,7.26086f,23.4375f, +-218.75f,8.85201f,23.4375f, +-214.844f,10.9029f,23.4375f, +-210.938f,12.7138f,23.4375f, +-207.031f,14.9249f,23.4375f, +-203.125f,15.6506f,23.4375f, +-199.219f,16.529f,23.4375f, +-195.313f,17.1535f,23.4375f, +-191.406f,20.5632f,23.4375f, +-187.5f,23.1009f,23.4375f, +-183.594f,24.7859f,23.4375f, +-179.688f,26.8635f,23.4375f, +-175.781f,28.5723f,23.4375f, +-171.875f,30.2918f,23.4375f, +-167.969f,32.7768f,23.4375f, +-164.063f,34.6199f,23.4375f, +-160.156f,35.6902f,23.4375f, +-156.25f,37.1166f,23.4375f, +-152.344f,37.0816f,23.4375f, +-148.438f,37.9995f,23.4375f, +-144.531f,38.687f,23.4375f, +-140.625f,37.9261f,23.4375f, +-136.719f,36.7476f,23.4375f, +-132.813f,37.1839f,23.4375f, +-128.906f,36.8682f,23.4375f, +-125.0f,36.2555f,23.4375f, +-121.094f,34.8461f,23.4375f, +-117.188f,34.5757f,23.4375f, +-113.281f,33.8965f,23.4375f, +-109.375f,33.4987f,23.4375f, +-105.469f,33.02f,23.4375f, +-101.563f,31.4543f,23.4375f, +-97.6563f,29.5899f,23.4375f, +-93.75f,27.8808f,23.4375f, +-89.8438f,26.4886f,23.4375f, +-85.9375f,24.5413f,23.4375f, +-82.0313f,22.6097f,23.4375f, +-78.125f,21.38f,23.4375f, +-74.2188f,19.2574f,23.4375f, +-70.3125f,19.6862f,23.4375f, +-66.4063f,19.3283f,23.4375f, +-62.5f,20.3608f,23.4375f, +-58.5938f,20.9969f,23.4375f, +-54.6875f,20.5645f,23.4375f, +-50.7813f,21.6338f,23.4375f, +-46.875f,22.0705f,23.4375f, +-42.9688f,23.2924f,23.4375f, +-39.0625f,24.8627f,23.4375f, +-35.1563f,25.9292f,23.4375f, +-31.25f,27.2133f,23.4375f, +-27.3438f,29.7296f,23.4375f, +-23.4375f,32.8149f,23.4375f, +-19.5313f,35.5321f,23.4375f, +-15.625f,38.2144f,23.4375f, +-11.7188f,40.2421f,23.4375f, +-7.8125f,41.7479f,23.4375f, +-3.90625f,43.372f,23.4375f, +0.0f,43.7526f,23.4375f, +3.90625f,44.6783f,23.4375f, +-250.0f,0.138221f,19.5313f, +-246.094f,1.4004f,19.5313f, +-242.188f,3.26515f,19.5313f, +-238.281f,3.65276f,19.5313f, +-234.375f,4.90602f,19.5313f, +-230.469f,6.03349f,19.5313f, +-226.563f,7.99773f,19.5313f, +-222.656f,9.41728f,19.5313f, +-218.75f,10.0435f,19.5313f, +-214.844f,12.1613f,19.5313f, +-210.938f,13.6999f,19.5313f, +-207.031f,15.7603f,19.5313f, +-203.125f,16.1549f,19.5313f, +-199.219f,17.1021f,19.5313f, +-195.313f,18.1867f,19.5313f, +-191.406f,20.6836f,19.5313f, +-187.5f,23.0865f,19.5312f, +-183.594f,24.3015f,19.5313f, +-179.688f,26.6623f,19.5312f, +-175.781f,28.232f,19.5313f, +-171.875f,30.6454f,19.5312f, +-167.969f,32.8674f,19.5313f, +-164.063f,35.0881f,19.5312f, +-160.156f,37.2715f,19.5313f, +-156.25f,38.6025f,19.5312f, +-152.344f,38.2781f,19.5313f, +-148.438f,38.4813f,19.5312f, +-144.531f,38.3281f,19.5313f, +-140.625f,38.1441f,19.5312f, +-136.719f,37.6066f,19.5312f, +-132.813f,37.2097f,19.5312f, +-128.906f,36.5694f,19.5312f, +-125.0f,36.2416f,19.5312f, +-121.094f,34.5305f,19.5312f, +-117.188f,33.3684f,19.5312f, +-113.281f,32.7805f,19.5312f, +-109.375f,31.8563f,19.5312f, +-105.469f,31.3398f,19.5312f, +-101.563f,29.7387f,19.5312f, +-97.6563f,28.7121f,19.5312f, +-93.75f,27.8904f,19.5312f, +-89.8438f,26.0256f,19.5312f, +-85.9375f,24.5469f,19.5312f, +-82.0313f,23.3531f,19.5312f, +-78.125f,21.4621f,19.5313f, +-74.2188f,20.3507f,19.5313f, +-70.3125f,20.1879f,19.5313f, +-66.4063f,20.9838f,19.5313f, +-62.5f,22.229f,19.5312f, +-58.5938f,22.355f,19.5312f, +-54.6875f,22.7659f,19.5312f, +-50.7813f,22.9258f,19.5312f, +-46.875f,23.554f,19.5312f, +-42.9688f,24.3861f,19.5312f, +-39.0625f,25.5112f,19.5312f, +-35.1563f,26.8691f,19.5312f, +-31.25f,28.968f,19.5312f, +-27.3438f,31.0124f,19.5312f, +-23.4375f,34.8357f,19.5312f, +-19.5313f,37.2362f,19.5312f, +-15.625f,39.5924f,19.5312f, +-11.7188f,41.5691f,19.5312f, +-7.8125f,43.2441f,19.5312f, +-3.90625f,45.1168f,19.5312f, +0.0f,45.7555f,19.5312f, +3.90625f,46.9055f,19.5312f, +-250.0f,0.462936f,15.625f, +-246.094f,2.15489f,15.625f, +-242.188f,3.69232f,15.625f, +-238.281f,4.89361f,15.625f, +-234.375f,6.95706f,15.625f, +-230.469f,8.37916f,15.625f, +-226.563f,9.21515f,15.625f, +-222.656f,10.0624f,15.625f, +-218.75f,11.6477f,15.625f, +-214.844f,13.257f,15.625f, +-210.938f,14.8699f,15.625f, +-207.031f,15.9852f,15.625f, +-203.125f,17.025f,15.625f, +-199.219f,17.8511f,15.625f, +-195.313f,20.3581f,15.625f, +-191.406f,22.0829f,15.625f, +-187.5f,24.4216f,15.625f, +-183.594f,25.5625f,15.625f, +-179.688f,27.0961f,15.625f, +-175.781f,30.0958f,15.625f, +-171.875f,31.7977f,15.625f, +-167.969f,34.7043f,15.625f, +-164.063f,37.1655f,15.625f, +-160.156f,37.6823f,15.625f, +-156.25f,37.6204f,15.625f, +-152.344f,37.8037f,15.625f, +-148.438f,37.8555f,15.625f, +-144.531f,37.9638f,15.625f, +-140.625f,37.4821f,15.625f, +-136.719f,37.0202f,15.625f, +-132.813f,36.4604f,15.625f, +-128.906f,36.1575f,15.625f, +-125.0f,35.4218f,15.625f, +-121.094f,33.5202f,15.625f, +-117.188f,32.116f,15.625f, +-113.281f,30.9352f,15.625f, +-109.375f,29.8297f,15.625f, +-105.469f,29.9146f,15.625f, +-101.563f,28.7245f,15.625f, +-97.6563f,27.7205f,15.625f, +-93.75f,27.4217f,15.625f, +-89.8438f,25.8557f,15.625f, +-85.9375f,24.0609f,15.625f, +-82.0313f,22.7869f,15.625f, +-78.125f,20.4923f,15.625f, +-74.2188f,21.0025f,15.625f, +-70.3125f,21.2985f,15.625f, +-66.4063f,22.5717f,15.625f, +-62.5f,23.0569f,15.625f, +-58.5938f,23.2123f,15.625f, +-54.6875f,24.1861f,15.625f, +-50.7813f,24.5626f,15.625f, +-46.875f,25.1259f,15.625f, +-42.9688f,25.9995f,15.625f, +-39.0625f,26.8682f,15.625f, +-35.1563f,27.8593f,15.625f, +-31.25f,29.8924f,15.625f, +-27.3438f,32.8894f,15.625f, +-23.4375f,36.2901f,15.625f, +-19.5313f,38.2475f,15.625f, +-15.625f,40.593f,15.625f, +-11.7188f,42.2973f,15.625f, +-7.8125f,45.3308f,15.625f, +-3.90625f,47.345f,15.625f, +0.0f,48.9808f,15.625f, +3.90625f,49.2295f,15.625f, +-250.0f,1.16646f,11.7188f, +-246.094f,2.99331f,11.7188f, +-242.188f,4.37829f,11.7188f, +-238.281f,5.21593f,11.7188f, +-234.375f,6.84374f,11.7188f, +-230.469f,8.34616f,11.7188f, +-226.563f,9.2826f,11.7188f, +-222.656f,9.90104f,11.7188f, +-218.75f,10.9211f,11.7187f, +-214.844f,13.6881f,11.7187f, +-210.938f,15.7745f,11.7187f, +-207.031f,16.2325f,11.7187f, +-203.125f,17.2525f,11.7187f, +-199.219f,19.1108f,11.7187f, +-195.313f,21.4743f,11.7187f, +-191.406f,24.021f,11.7187f, +-187.5f,25.8676f,11.7187f, +-183.594f,27.021f,11.7187f, +-179.688f,28.254f,11.7187f, +-175.781f,31.6036f,11.7187f, +-171.875f,32.629f,11.7187f, +-167.969f,34.9526f,11.7187f, +-164.063f,36.8236f,11.7187f, +-160.156f,37.152f,11.7187f, +-156.25f,37.6659f,11.7187f, +-152.344f,37.4102f,11.7187f, +-148.438f,37.0806f,11.7187f, +-144.531f,37.6299f,11.7187f, +-140.625f,36.7269f,11.7187f, +-136.719f,36.4841f,11.7187f, +-132.813f,35.2557f,11.7187f, +-128.906f,34.7066f,11.7187f, +-125.0f,34.0947f,11.7187f, +-121.094f,32.7343f,11.7187f, +-117.188f,31.5605f,11.7187f, +-113.281f,30.7492f,11.7187f, +-109.375f,30.1608f,11.7187f, +-105.469f,29.9144f,11.7187f, +-101.563f,28.5532f,11.7187f, +-97.6563f,26.2051f,11.7187f, +-93.75f,26.0432f,11.7187f, +-89.8438f,25.1831f,11.7187f, +-85.9375f,23.7935f,11.7187f, +-82.0313f,22.6952f,11.7187f, +-78.125f,21.9812f,11.7187f, +-74.2188f,22.3423f,11.7187f, +-70.3125f,22.4959f,11.7187f, +-66.4063f,22.9438f,11.7187f, +-62.5f,23.6591f,11.7187f, +-58.5938f,24.1634f,11.7187f, +-54.6875f,24.8781f,11.7187f, +-50.7813f,25.3471f,11.7187f, +-46.875f,25.7599f,11.7187f, +-42.9688f,26.61f,11.7187f, +-39.0625f,27.5033f,11.7187f, +-35.1563f,29.2751f,11.7187f, +-31.25f,31.9147f,11.7187f, +-27.3438f,34.1964f,11.7187f, +-23.4375f,36.7734f,11.7187f, +-19.5313f,39.2441f,11.7187f, +-15.625f,41.3269f,11.7187f, +-11.7188f,44.2682f,11.7187f, +-7.8125f,47.2458f,11.7187f, +-3.90625f,49.2199f,11.7187f, +0.0f,50.2546f,11.7187f, +3.90625f,51.1233f,11.7187f, +-250.0f,1.52698f,7.8125f, +-246.094f,2.97227f,7.8125f, +-242.188f,3.77319f,7.8125f, +-238.281f,4.81095f,7.8125f, +-234.375f,5.94458f,7.8125f, +-230.469f,7.45352f,7.8125f, +-226.563f,8.9683f,7.8125f, +-222.656f,9.37348f,7.8125f, +-218.75f,10.3818f,7.8125f, +-214.844f,13.0632f,7.8125f, +-210.938f,15.5836f,7.8125f, +-207.031f,17.1532f,7.8125f, +-203.125f,19.3065f,7.8125f, +-199.219f,21.746f,7.8125f, +-195.313f,23.0026f,7.8125f, +-191.406f,25.1876f,7.8125f, +-187.5f,27.4911f,7.8125f, +-183.594f,28.651f,7.8125f, +-179.688f,28.9685f,7.8125f, +-175.781f,31.1275f,7.8125f, +-171.875f,32.457f,7.8125f, +-167.969f,34.4336f,7.8125f, +-164.063f,35.9124f,7.8125f, +-160.156f,36.5078f,7.8125f, +-156.25f,36.9999f,7.8125f, +-152.344f,36.9517f,7.8125f, +-148.438f,37.9713f,7.8125f, +-144.531f,37.929f,7.8125f, +-140.625f,37.5334f,7.8125f, +-136.719f,36.2798f,7.8125f, +-132.813f,35.1904f,7.8125f, +-128.906f,33.7356f,7.8125f, +-125.0f,34.0968f,7.8125f, +-121.094f,33.5838f,7.8125f, +-117.188f,32.9371f,7.8125f, +-113.281f,32.0353f,7.8125f, +-109.375f,31.4623f,7.8125f, +-105.469f,30.5184f,7.8125f, +-101.563f,28.7396f,7.8125f, +-97.6563f,27.2715f,7.8125f, +-93.75f,26.1242f,7.8125f, +-89.8438f,24.5691f,7.8125f, +-85.9375f,23.931f,7.8125f, +-82.0313f,23.7643f,7.8125f, +-78.125f,22.4588f,7.8125f, +-74.2188f,22.5395f,7.8125f, +-70.3125f,22.9322f,7.8125f, +-66.4063f,23.4361f,7.8125f, +-62.5f,24.2733f,7.8125f, +-58.5938f,24.1873f,7.8125f, +-54.6875f,24.2666f,7.8125f, +-50.7813f,25.2522f,7.8125f, +-46.875f,26.3494f,7.8125f, +-42.9688f,26.8365f,7.8125f, +-39.0625f,27.5515f,7.8125f, +-35.1563f,30.4441f,7.8125f, +-31.25f,33.5547f,7.8125f, +-27.3438f,36.1409f,7.8125f, +-23.4375f,38.1103f,7.8125f, +-19.5313f,39.8171f,7.8125f, +-15.625f,42.1146f,7.8125f, +-11.7188f,45.3603f,7.8125f, +-7.8125f,47.6602f,7.8125f, +-3.90625f,49.963f,7.8125f, +0.0f,51.8119f,7.8125f, +3.90625f,52.2527f,7.8125f, +-250.0f,0.139875f,3.90625f, +-246.094f,1.72995f,3.90625f, +-242.188f,2.60122f,3.90625f, +-238.281f,4.01346f,3.90625f, +-234.375f,5.13654f,3.90625f, +-230.469f,6.69665f,3.90625f, +-226.563f,8.43203f,3.90625f, +-222.656f,9.83442f,3.90625f, +-218.75f,11.3645f,3.90625f, +-214.844f,14.222f,3.90625f, +-210.938f,16.1758f,3.90625f, +-207.031f,18.9127f,3.90625f, +-203.125f,21.2478f,3.90625f, +-199.219f,23.0589f,3.90625f, +-195.313f,24.6025f,3.90625f, +-191.406f,25.8143f,3.90625f, +-187.5f,27.5696f,3.90625f, +-183.594f,29.2176f,3.90625f, +-179.688f,29.6835f,3.90625f, +-175.781f,30.7416f,3.90625f, +-171.875f,31.4405f,3.90625f, +-167.969f,33.0831f,3.90625f, +-164.063f,34.6225f,3.90625f, +-160.156f,35.4992f,3.90625f, +-156.25f,37.4126f,3.90625f, +-152.344f,38.453f,3.90625f, +-148.438f,38.9974f,3.90625f, +-144.531f,38.7871f,3.90625f, +-140.625f,37.6021f,3.90625f, +-136.719f,36.1797f,3.90625f, +-132.813f,34.9906f,3.90625f, +-128.906f,34.1304f,3.90625f, +-125.0f,34.3517f,3.90625f, +-121.094f,33.6612f,3.90625f, +-117.188f,32.7047f,3.90625f, +-113.281f,32.3958f,3.90625f, +-109.375f,31.0818f,3.90625f, +-105.469f,30.9536f,3.90625f, +-101.563f,29.8205f,3.90625f, +-97.6563f,28.4796f,3.90625f, +-93.75f,27.6494f,3.90625f, +-89.8438f,25.5721f,3.90625f, +-85.9375f,24.227f,3.90625f, +-82.0313f,23.2611f,3.90625f, +-78.125f,22.4589f,3.90625f, +-74.2188f,23.2261f,3.90625f, +-70.3125f,23.5025f,3.90625f, +-66.4063f,23.6913f,3.90625f, +-62.5f,24.6785f,3.90625f, +-58.5938f,25.4946f,3.90625f, +-54.6875f,25.9722f,3.90625f, +-50.7813f,26.1977f,3.90625f, +-46.875f,26.8539f,3.90625f, +-42.9688f,27.7268f,3.90625f, +-39.0625f,29.2046f,3.90625f, +-35.1563f,31.79f,3.90625f, +-31.25f,34.2658f,3.90625f, +-27.3438f,35.9914f,3.90625f, +-23.4375f,38.3776f,3.90625f, +-19.5313f,39.8852f,3.90625f, +-15.625f,43.1455f,3.90625f, +-11.7188f,45.5059f,3.90625f, +-7.8125f,47.4257f,3.90625f, +-3.90625f,49.9032f,3.90625f, +0.0f,52.0322f,3.90625f, +3.90625f,52.6186f,3.90625f, +}; + +btScalar Landscape02Nml[] = { +0.376889f,0.897995f,0.227068f, +0.251083f,0.961355f,0.112931f, +0.256071f,0.961946f,0.0953332f, +0.188246f,0.981544f,0.0336933f, +0.321782f,0.946812f,0.00191405f, +0.277829f,0.960055f,0.0332431f, +0.366908f,0.922321f,-0.121252f, +0.346681f,0.936118f,-0.0591191f, +0.34598f,0.936023f,-0.0644918f, +0.326882f,0.934733f,-0.139364f, +0.195537f,0.979014f,-0.0574119f, +0.208421f,0.974173f,-0.0868766f, +0.220158f,0.96963f,-0.106528f, +0.21764f,0.974169f,-0.0602246f, +0.194781f,0.966032f,-0.169831f, +0.137923f,0.97923f,-0.148611f, +-0.0890295f,0.968844f,-0.231118f, +-0.164208f,0.952108f,-0.257926f, +-0.299547f,0.905883f,-0.299413f, +-0.331781f,0.892916f,-0.304338f, +-0.275234f,0.921181f,-0.275086f, +-0.190055f,0.968186f,-0.162776f, +-0.191147f,0.964101f,-0.184313f, +-0.167051f,0.973656f,-0.155201f, +-0.260549f,0.956867f,-0.128527f, +-0.236175f,0.968373f,-0.080466f, +-0.305083f,0.942279f,-0.137969f, +-0.32302f,0.940678f,-0.103844f, +-0.376654f,0.91108f,-0.167524f, +-0.43665f,0.882087f,-0.176802f, +-0.404697f,0.87224f,-0.274621f, +-0.461396f,0.842558f,-0.277868f, +-0.340534f,0.861872f,-0.375783f, +-0.381498f,0.847049f,-0.370091f, +-0.349262f,0.83292f,-0.429255f, +-0.383821f,0.842401f,-0.378209f, +-0.350717f,0.827302f,-0.438826f, +-0.312636f,0.886963f,-0.339934f, +-0.202637f,0.921293f,-0.331899f, +-0.164853f,0.917655f,-0.361571f, +-0.320762f,0.929092f,-0.184116f, +-0.291289f,0.89543f,-0.336684f, +-0.523923f,0.850919f,-0.0379686f, +-0.415222f,0.907809f,-0.0589323f, +-0.464751f,0.884928f,0.030152f, +-0.464228f,0.885715f,0.00114487f, +-0.460666f,0.887573f,-0.00119475f, +-0.527574f,0.824073f,-0.206324f, +-0.569463f,0.819886f,-0.0591577f, +-0.624043f,0.739025f,-0.253797f, +-0.677912f,0.708815f,-0.19498f, +-0.654991f,0.737431f,-0.164874f, +-0.612102f,0.778841f,-0.136883f, +-0.555251f,0.829082f,-0.0657209f, +-0.466796f,0.884362f,-0.00238444f, +-0.393172f,0.917844f,0.0545768f, +-0.415266f,0.902781f,0.111985f, +-0.346174f,0.92512f,0.155936f, +-0.270143f,0.942251f,0.197955f, +-0.242693f,0.931939f,0.269424f, +-0.146828f,0.979561f,0.137484f, +-0.151815f,0.949716f,0.273847f, +-0.23746f,0.962635f,0.130183f, +-0.242269f,0.936807f,0.252385f, +-0.439066f,0.897439f,0.0427119f, +-0.506925f,0.859633f,0.0637107f, +-0.369534f,0.927612f,0.0545955f, +-0.266432f,0.921234f,0.283447f, +-0.0849634f,0.983229f,0.161377f, +-0.142422f,0.97399f,0.176238f, +0.059987f,0.992193f,0.109333f, +-0.00609097f,0.990503f,0.137353f, +0.218751f,0.975042f,-0.0379662f, +0.195675f,0.973574f,0.117747f, +0.412438f,0.903178f,-0.119012f, +0.389829f,0.920771f,0.01463f, +0.471887f,0.878868f,-0.0700914f, +0.512637f,0.843878f,0.158344f, +0.438398f,0.898776f,-0.0028899f, +0.463505f,0.872879f,0.152466f, +0.213581f,0.96879f,0.125817f, +0.217949f,0.966902f,0.132661f, +0.150053f,0.978231f,0.143348f, +0.183142f,0.954792f,0.234161f, +0.324547f,0.937949f,0.122152f, +0.305949f,0.944044f,0.123194f, +0.404781f,0.90011f,0.161105f, +0.386685f,0.917163f,0.0963685f, +0.43511f,0.894378f,0.103764f, +0.444378f,0.884165f,0.144156f, +0.485066f,0.871945f,0.0665013f, +0.480511f,0.864609f,0.146835f, +0.542329f,0.83784f,0.0624783f, +0.538258f,0.834152f,0.120286f, +0.497652f,0.86488f,0.0657686f, +0.471897f,0.881288f,0.0253797f, +0.368509f,0.927548f,0.0620863f, +0.391828f,0.918428f,0.0544149f, +0.284879f,0.953389f,0.0994662f, +0.359932f,0.902669f,0.235877f, +0.19297f,0.969614f,0.150374f, +0.198191f,0.923716f,0.327825f, +0.174784f,0.978101f,0.113003f, +0.121688f,0.95783f,0.260297f, +0.3291f,0.939598f,0.094074f, +0.241925f,0.967997f,0.066744f, +0.275982f,0.959352f,0.0589789f, +0.207349f,0.969048f,-0.133986f, +-0.048418f,0.997403f,0.0533214f, +-0.0214229f,0.995947f,-0.0873486f, +-0.224808f,0.97209f,0.0671032f, +-0.154526f,0.98721f,0.0392114f, +-0.0539424f,0.990401f,0.127262f, +0.0294265f,0.986864f,0.158851f, +0.115045f,0.967726f,0.224212f, +0.135755f,0.967813f,0.211917f, +-0.0987201f,0.976534f,0.191406f, +-0.208734f,0.974954f,0.0767793f, +-0.346094f,0.938088f,0.0144628f, +-0.364883f,0.930977f,0.0119327f, +-0.234075f,0.972082f,0.0162811f, +-0.216489f,0.973875f,0.0685516f, +-0.126585f,0.991898f,0.0107448f, +-0.188432f,0.981937f,-0.0171439f, +-0.186728f,0.980312f,-0.0641921f, +-0.243763f,0.959118f,-0.14378f, +-0.256453f,0.962392f,-0.0896326f, +-0.227009f,0.972481f,-0.0524148f, +-0.308642f,0.945388f,-0.104794f, +-0.322884f,0.94242f,-0.0871231f, +-0.32494f,0.940988f,-0.0946312f, +-0.365791f,0.920972f,-0.134189f, +0.507209f,0.830952f,0.228598f, +0.427157f,0.893788f,0.136676f, +0.390358f,0.920644f,0.00595094f, +0.357f,0.931227f,0.0732586f, +0.253669f,0.95455f,0.156478f, +0.247974f,0.954291f,0.166849f, +0.303694f,0.950352f,0.0678299f, +0.260247f,0.965246f,0.0238949f, +-0.0615746f,0.996768f,-0.0515863f, +-0.225111f,0.970921f,-0.0814727f, +-0.33579f,0.924057f,-0.18266f, +-0.286567f,0.949099f,-0.13073f, +-0.266283f,0.957101f,-0.114241f, +-0.297972f,0.942451f,-0.151651f, +-0.345158f,0.930403f,-0.123358f, +-0.323606f,0.933615f,-0.153759f, +-0.295216f,0.935234f,-0.195409f, +-0.294262f,0.935546f,-0.195355f, +-0.367877f,0.896699f,-0.246165f, +-0.460611f,0.856308f,-0.233612f, +-0.493615f,0.869663f,0.00556421f, +-0.56572f,0.819247f,0.0937815f, +-0.482796f,0.868728f,0.110547f, +-0.473443f,0.870107f,0.136985f, +-0.486628f,0.863931f,0.12968f, +-0.584612f,0.809918f,-0.0475519f, +-0.673803f,0.720247f,-0.165027f, +-0.584438f,0.811258f,-0.0171189f, +-0.49626f,0.855798f,0.146063f, +-0.266763f,0.927018f,0.26358f, +-0.000318467f,0.974136f,0.225963f, +-0.2098f,0.977621f,0.015525f, +-0.363964f,0.929076f,-0.0659462f, +-0.427799f,0.890708f,-0.153708f, +-0.226888f,0.973494f,-0.0288381f, +0.176474f,0.981f,0.080593f, +0.382766f,0.920418f,-0.0794987f, +0.4558f,0.874041f,-0.16822f, +0.44168f,0.87342f,-0.205075f, +0.269141f,0.944688f,-0.187422f, +0.0983269f,0.994746f,0.0285051f, +0.164874f,0.980231f,0.10938f, +0.300398f,0.949423f,0.0914149f, +0.370498f,0.925363f,0.0802133f, +0.51325f,0.857062f,0.0449297f, +0.515688f,0.85628f,-0.0291725f, +0.532902f,0.845818f,-0.0246416f, +0.470584f,0.882352f,0.00224652f, +0.358364f,0.932053f,0.0534101f, +0.299916f,0.948938f,0.0978121f, +0.234125f,0.96956f,0.0716857f, +0.201429f,0.97943f,0.0119968f, +0.257021f,0.965839f,0.0330825f, +0.205585f,0.966488f,0.153741f, +-0.0291083f,0.972977f,0.22906f, +-0.183781f,0.97216f,0.145362f, +-0.0880966f,0.991634f,0.0943445f, +0.0404056f,0.991359f,0.124796f, +-0.0259416f,0.986408f,0.162256f, +-0.213262f,0.97241f,0.0945471f, +-0.221976f,0.974645f,0.0281856f, +-0.137418f,0.990413f,0.014064f, +-0.147111f,0.988464f,0.0360112f, +-0.213681f,0.97687f,0.00813376f, +-0.286716f,0.957516f,-0.0309366f, +-0.362687f,0.929548f,-0.0663186f, +0.471826f,0.881687f,0.00273101f, +0.493844f,0.862721f,0.108764f, +0.305852f,0.940961f,0.145073f, +0.225186f,0.91763f,0.327484f, +0.255894f,0.905552f,0.33837f, +0.302798f,0.922674f,0.238719f, +0.353759f,0.914443f,0.196594f, +0.301669f,0.941039f,0.153105f, +0.00675732f,0.993813f,0.110864f, +-0.180673f,0.978312f,0.101302f, +-0.247784f,0.966857f,0.0615767f, +-0.309703f,0.949482f,-0.0506691f, +-0.243038f,0.969623f,-0.0276337f, +-0.257234f,0.966017f,-0.0253295f, +-0.381367f,0.920413f,-0.0860151f, +-0.354157f,0.93479f,-0.027217f, +-0.299485f,0.952671f,0.0522246f, +-0.356888f,0.9323f,0.0587106f, +-0.335176f,0.924244f,0.182839f, +-0.500593f,0.855036f,0.135351f, +-0.576428f,0.801243f,0.160441f, +-0.583679f,0.788168f,0.195218f, +-0.491918f,0.829821f,0.263465f, +-0.431671f,0.862042f,0.2656f, +-0.443518f,0.883408f,0.151265f, +-0.464317f,0.881859f,0.0820666f, +-0.652068f,0.753609f,-0.0829502f, +-0.681939f,0.728217f,-0.068254f, +-0.591161f,0.804152f,0.0621953f, +-0.352647f,0.921747f,0.161318f, +0.0545396f,0.95959f,0.276065f, +0.0694942f,0.971972f,0.224591f, +-0.253858f,0.964902f,-0.0672354f, +-0.408551f,0.900688f,-0.147807f, +-0.327666f,0.933936f,-0.142825f, +0.129878f,0.985787f,-0.106564f, +0.442239f,0.89421f,-0.0693695f, +0.506959f,0.860716f,-0.0464834f, +0.440087f,0.895465f,-0.0668225f, +0.226441f,0.974021f,0.00265329f, +-0.0272959f,0.999596f,0.00787303f, +0.0903893f,0.995643f,0.0228958f, +0.359925f,0.931179f,0.0579615f, +0.431266f,0.899788f,-0.0662666f, +0.53735f,0.839722f,-0.0782406f, +0.525898f,0.846474f,-0.0831443f, +0.503404f,0.859213f,-0.0913118f, +0.450901f,0.892319f,-0.0213084f, +0.278054f,0.959353f,0.048252f, +0.254295f,0.953824f,0.159853f, +0.246692f,0.953779f,0.171608f, +0.237766f,0.960301f,0.145908f, +0.249319f,0.965473f,0.0755121f, +0.140552f,0.989905f,0.0182753f, +-0.0589195f,0.996842f,0.0532477f, +-0.101426f,0.988847f,0.109061f, +-0.043669f,0.99706f,0.0629708f, +0.0474685f,0.998853f,-0.0063145f, +-0.0867729f,0.996136f,-0.0135299f, +-0.196161f,0.972844f,0.12286f, +-0.192413f,0.974994f,0.111196f, +-0.123107f,0.990318f,0.0641543f, +-0.164426f,0.985628f,0.0387435f, +-0.213922f,0.974633f,0.0657922f, +-0.241049f,0.968373f,0.0644173f, +-0.307154f,0.951627f,-0.00792363f, +0.280771f,0.958227f,-0.0544817f, +0.299035f,0.949091f,0.0990176f, +0.225174f,0.937279f,0.266091f, +0.201765f,0.945847f,0.254291f, +0.341377f,0.920786f,0.18872f, +0.3743f,0.913661f,0.158502f, +0.359138f,0.923211f,0.136755f, +0.36518f,0.919296f,0.146759f, +0.0046348f,0.996002f,0.0892048f, +-0.241229f,0.954179f,0.177061f, +-0.158349f,0.951157f,0.265002f, +-0.207545f,0.971279f,0.116375f, +-0.289845f,0.957072f,0.00156201f, +-0.257416f,0.96626f,0.00885102f, +-0.326801f,0.944936f,0.0172234f, +-0.439204f,0.898379f,-0.00377194f, +-0.336537f,0.936282f,0.100589f, +-0.407285f,0.907139f,0.105914f, +-0.44858f,0.865076f,0.224543f, +-0.454994f,0.838311f,0.300358f, +-0.578424f,0.785375f,0.220483f, +-0.613986f,0.761879f,0.206302f, +-0.509143f,0.819763f,0.262226f, +-0.364105f,0.879908f,0.30527f, +-0.344494f,0.905138f,0.249097f, +-0.369295f,0.913195f,0.172323f, +-0.574832f,0.817482f,0.0359178f, +-0.689125f,0.724332f,-0.0212343f, +-0.619919f,0.781232f,-0.0733212f, +-0.441345f,0.892835f,-0.0897783f, +-0.0649595f,0.996915f,0.0440505f, +0.146397f,0.977716f,0.150467f, +-0.0177868f,0.998167f,0.0578468f, +-0.37006f,0.91802f,-0.14246f, +-0.30849f,0.937533f,-0.160828f, +0.107382f,0.980696f,-0.163415f, +0.392635f,0.914926f,-0.093533f, +0.501877f,0.862749f,-0.0615151f, +0.381618f,0.912204f,-0.14917f, +0.160415f,0.986769f,-0.0235493f, +0.0253729f,0.99703f,0.0727145f, +0.144484f,0.989507f,0.000443305f, +0.379228f,0.922372f,-0.073601f, +0.493599f,0.867009f,-0.0682314f, +0.529895f,0.842151f,-0.099967f, +0.549367f,0.821638f,-0.152008f, +0.439412f,0.876451f,-0.196851f, +0.349224f,0.935858f,0.0470259f, +0.182079f,0.971589f,0.151205f, +0.194383f,0.962201f,0.190749f, +0.266182f,0.94835f,0.172569f, +0.284034f,0.949535f,0.133071f, +0.347472f,0.93345f,0.089069f, +0.226103f,0.974059f,0.00925465f, +-0.0773561f,0.993257f,-0.0863519f, +-0.200366f,0.974099f,-0.104811f, +-0.00292133f,0.99995f,-0.00953497f, +0.144264f,0.988303f,-0.0494442f, +-0.155865f,0.979469f,-0.127857f, +-0.286146f,0.957784f,-0.0277406f, +-0.165259f,0.985103f,-0.0475661f, +-0.069504f,0.996782f,-0.0399387f, +-0.139315f,0.988254f,-0.0628056f, +-0.230813f,0.967463f,-0.103639f, +-0.24543f,0.966984f,-0.0686046f, +-0.189537f,0.981091f,0.0391957f, +0.151487f,0.988375f,0.0128779f, +0.16936f,0.984329f,0.0491336f, +0.218781f,0.968894f,0.115672f, +0.279098f,0.952669f,0.120523f, +0.344688f,0.931221f,0.118397f, +0.359727f,0.914297f,0.186165f, +0.326371f,0.918389f,0.223703f, +0.361839f,0.886899f,0.287197f, +-0.000924981f,0.965442f,0.260617f, +-0.321168f,0.914653f,0.24548f, +-0.23578f,0.933549f,0.269988f, +-0.0519805f,0.910912f,0.409313f, +-0.120702f,0.947306f,0.296721f, +-0.257649f,0.956241f,0.138637f, +-0.340179f,0.924947f,0.169564f, +-0.415425f,0.90289f,0.110507f, +-0.41038f,0.91038f,0.0528755f, +-0.447459f,0.881081f,0.153222f, +-0.521314f,0.820871f,0.233245f, +-0.470597f,0.83806f,0.27603f, +-0.530303f,0.820989f,0.211554f, +-0.59428f,0.795918f,0.11552f, +-0.564828f,0.823165f,0.0580397f, +-0.435129f,0.882511f,0.17843f, +-0.320859f,0.891866f,0.318787f, +-0.272192f,0.902535f,0.33368f, +-0.476067f,0.856837f,0.197967f, +-0.671403f,0.739101f,0.0543033f, +-0.548598f,0.834125f,0.0572312f, +-0.459373f,0.883769f,-0.0890421f, +-0.194341f,0.977153f,-0.0860449f, +0.0638196f,0.997784f,0.0188364f, +0.119241f,0.989813f,0.0777976f, +-0.189205f,0.978439f,-0.0828203f, +-0.328042f,0.913868f,-0.239234f, +0.0439005f,0.976566f,-0.210694f, +0.345392f,0.929362f,-0.130351f, +0.531991f,0.841029f,-0.0982628f, +0.385958f,0.912021f,-0.13876f, +0.00996624f,0.998173f,-0.059598f, +-0.0397997f,0.999182f,0.00710574f, +0.22423f,0.974041f,-0.0310806f, +0.399529f,0.909843f,-0.112084f, +0.472825f,0.876316f,-0.0922302f, +0.567959f,0.818431f,-0.0871407f, +0.591097f,0.802347f,-0.0827227f, +0.294969f,0.954774f,-0.0374031f, +0.136562f,0.986139f,0.0942395f, +0.140836f,0.978895f,0.148089f, +0.208743f,0.962024f,0.175889f, +0.331657f,0.931412f,0.149918f, +0.32318f,0.945148f,0.0474422f, +0.378499f,0.925602f,0.000447487f, +0.240237f,0.969087f,-0.0561752f, +0.0676245f,0.996927f,-0.0395359f, +-0.154966f,0.962822f,-0.221268f, +-0.087338f,0.971663f,-0.219642f, +0.144581f,0.983839f,-0.105631f, +-0.0884322f,0.993076f,-0.0773351f, +-0.293638f,0.94457f,-0.146848f, +-0.135408f,0.983934f,-0.116358f, +-0.103543f,0.987494f,-0.11889f, +-0.104597f,0.98248f,-0.15425f, +-0.176622f,0.962045f,-0.208023f, +-0.325467f,0.923065f,-0.204992f, +-0.403927f,0.903415f,-0.143824f, +0.344389f,0.929213f,0.134014f, +0.233815f,0.972165f,0.0150206f, +0.162621f,0.985815f,-0.0415186f, +0.195602f,0.980526f,0.0175561f, +0.28987f,0.950331f,0.113346f, +0.255987f,0.942074f,0.216718f, +0.263495f,0.890351f,0.371275f, +0.315069f,0.864416f,0.391812f, +0.0646003f,0.916859f,0.39395f, +-0.213657f,0.9234f,0.318877f, +-0.307635f,0.926495f,0.216719f, +-0.201977f,0.923807f,0.325246f, +-0.0210673f,0.916391f,0.399731f, +-0.17042f,0.919713f,0.353674f, +-0.316748f,0.899919f,0.299695f, +-0.294061f,0.92391f,0.244781f, +-0.396636f,0.905857f,0.14867f, +-0.523471f,0.83043f,0.190696f, +-0.568887f,0.791598f,0.223024f, +-0.446362f,0.844948f,0.294659f, +-0.453253f,0.853996f,0.255447f, +-0.541011f,0.824142f,0.167623f, +-0.550736f,0.81694f,0.171169f, +-0.53915f,0.819657f,0.193597f, +-0.444412f,0.862352f,0.242584f, +-0.285315f,0.907749f,0.30755f, +-0.329395f,0.886574f,0.324786f, +-0.610599f,0.78547f,0.101022f, +-0.543486f,0.838015f,0.0485148f, +-0.319704f,0.945394f,0.0634074f, +-0.262212f,0.963421f,-0.055354f, +0.000253525f,0.995852f,0.0909893f, +0.105619f,0.991464f,0.0764441f, +0.0245363f,0.999682f,-0.00586488f, +-0.22917f,0.926966f,-0.29701f, +-0.0159754f,0.943632f,-0.33061f, +0.309925f,0.920539f,-0.237812f, +0.48714f,0.850311f,-0.199165f, +0.288684f,0.955866f,-0.0546085f, +-0.0787222f,0.994967f,0.0619939f, +0.0273777f,0.99772f,0.0616831f, +0.291481f,0.955243f,-0.0505022f, +0.438727f,0.89664f,-0.0596253f, +0.485213f,0.871546f,-0.0705428f, +0.5406f,0.839608f,-0.0530067f, +0.49511f,0.866937f,0.0573254f, +0.280189f,0.947413f,0.154605f, +0.158816f,0.979113f,0.126949f, +0.168625f,0.983554f,0.0647105f, +0.187616f,0.98216f,0.0127302f, +0.334023f,0.942557f,0.00379923f, +0.401318f,0.914355f,0.0538517f, +0.424638f,0.905172f,0.0185914f, +0.289448f,0.956081f,-0.0461475f, +0.0899479f,0.980871f,-0.172633f, +-0.00560791f,0.970967f,-0.23915f, +-0.153691f,0.938842f,-0.308149f, +-0.0450622f,0.984719f,-0.168219f, +-0.0818032f,0.994271f,0.0687937f, +-0.254478f,0.967062f,-0.0056871f, +-0.190127f,0.974114f,-0.122284f, +-0.0615121f,0.986397f,-0.152435f, +-0.0478084f,0.984317f,-0.169808f, +-0.157882f,0.979732f,-0.123284f, +-0.307356f,0.93941f,-0.151791f, +-0.432596f,0.869844f,-0.237133f, +0.35469f,0.923204f,0.147951f, +0.317903f,0.938384f,0.135547f, +0.209784f,0.976723f,0.0447562f, +0.188401f,0.980806f,-0.0502544f, +0.153267f,0.987748f,-0.0293859f, +0.102074f,0.966336f,0.236167f, +0.128463f,0.933972f,0.333456f, +0.308207f,0.882627f,0.354934f, +0.141883f,0.91146f,0.386148f, +-0.174863f,0.945456f,0.274837f, +-0.248524f,0.937312f,0.244299f, +-0.268339f,0.945888f,0.182456f, +-0.0843285f,0.960488f,0.265238f, +-0.151825f,0.934815f,0.321045f, +-0.286064f,0.900967f,0.326231f, +-0.240679f,0.904695f,0.351568f, +-0.362345f,0.88785f,0.2836f, +-0.538142f,0.813225f,0.221511f, +-0.57294f,0.797677f,0.188284f, +-0.51091f,0.838129f,0.191079f, +-0.412611f,0.865658f,0.283528f, +-0.528395f,0.821979f,0.212483f, +-0.579097f,0.792111f,0.192891f, +-0.502268f,0.843036f,0.192398f, +-0.402738f,0.896524f,0.184518f, +-0.323371f,0.930281f,0.173231f, +-0.341027f,0.92193f,0.183699f, +-0.49586f,0.861123f,0.112209f, +-0.562176f,0.82675f,-0.0210484f, +-0.29935f,0.952705f,0.0523715f, +-0.273263f,0.96182f,0.0151701f, +-0.127856f,0.984802f,0.117552f, +0.16681f,0.967622f,0.189425f, +0.219885f,0.966852f,0.1298f, +0.0444925f,0.994595f,-0.093817f, +-0.0559771f,0.948894f,-0.31059f, +0.229668f,0.93439f,-0.272337f, +0.391338f,0.907289f,-0.153889f, +0.215699f,0.975228f,0.0490428f, +-0.1202f,0.992098f,0.0359644f, +0.0568932f,0.997098f,0.0505773f, +0.369571f,0.928802f,0.0272646f, +0.435039f,0.898005f,-0.0657877f, +0.45866f,0.886154f,-0.0660444f, +0.484136f,0.874975f,0.00559808f, +0.464546f,0.884206f,0.0487577f, +0.311084f,0.947795f,0.0700806f, +0.215922f,0.975139f,0.0498078f, +0.229266f,0.973122f,-0.0216826f, +0.269391f,0.956816f,-0.109228f, +0.297276f,0.941247f,-0.160256f, +0.352506f,0.931874f,-0.0857318f, +0.363875f,0.92958f,-0.0589632f, +0.421372f,0.901903f,0.094954f, +0.220959f,0.972251f,-0.0768509f, +0.0552433f,0.994093f,-0.0934223f, +-0.134577f,0.980922f,-0.140288f, +-0.247593f,0.953903f,-0.169607f, +-0.238891f,0.96987f,-0.0477791f, +-0.130123f,0.990325f,-0.0482061f, +0.00814361f,0.986901f,-0.161119f, +-0.0740374f,0.970051f,-0.231345f, +-0.135238f,0.990526f,-0.0238593f, +-0.204897f,0.978574f,0.0202582f, +-0.205889f,0.977122f,-0.0533174f, +-0.236999f,0.963982f,-0.120711f, +0.399314f,0.905653f,0.142621f, +0.334882f,0.936094f,0.107618f, +0.310789f,0.943606f,0.114093f, +0.298988f,0.952609f,0.0560503f, +0.00373107f,0.999894f,-0.0140921f, +-0.127729f,0.983543f,0.12778f, +0.134365f,0.969696f,0.204046f, +0.250753f,0.938877f,0.235867f, +0.172971f,0.901933f,0.395725f, +-0.0661635f,0.938085f,0.340027f, +-0.190026f,0.944561f,0.267758f, +-0.246469f,0.952194f,0.180498f, +-0.199636f,0.962622f,0.183041f, +-0.204824f,0.924659f,0.321019f, +-0.345906f,0.869848f,0.351729f, +-0.272906f,0.86539f,0.420265f, +-0.23738f,0.86577f,0.44056f, +-0.476597f,0.838274f,0.264863f, +-0.549692f,0.815624f,0.180542f, +-0.521659f,0.837826f,0.160993f, +-0.461012f,0.874551f,0.150426f, +-0.498406f,0.858536f,0.120447f, +-0.538861f,0.837113f,0.0941878f, +-0.51696f,0.855065f,0.0401927f, +-0.464195f,0.882878f,0.0710582f, +-0.339798f,0.923706f,0.176929f, +-0.307071f,0.929998f,0.202016f, +-0.435636f,0.887155f,0.152245f, +-0.50925f,0.856289f,0.0862179f, +-0.352613f,0.935762f,-0.00363908f, +-0.24432f,0.969666f,0.0074465f, +-0.223693f,0.974193f,-0.0301471f, +0.0924619f,0.993171f,0.071143f, +0.248444f,0.955155f,0.161104f, +0.25541f,0.957577f,0.133462f, +0.152224f,0.983188f,-0.100846f, +0.175485f,0.954332f,-0.241774f, +0.229817f,0.96697f,-0.110245f, +0.104087f,0.990176f,0.0933667f, +-0.0251916f,0.99085f,0.132593f, +0.0299952f,0.999356f,-0.0197015f, +0.374506f,0.927216f,-0.00387803f, +0.523769f,0.851516f,-0.0242066f, +0.412003f,0.903869f,-0.115217f, +0.44751f,0.89427f,-0.00401492f, +0.502351f,0.864643f,-0.0060566f, +0.261187f,0.953407f,-0.150988f, +0.201827f,0.974066f,-0.102283f, +0.328474f,0.941424f,-0.0763319f, +0.327281f,0.932573f,-0.152297f, +0.312159f,0.927432f,-0.205977f, +0.304739f,0.922289f,-0.237734f, +0.291399f,0.941708f,-0.168142f, +0.325323f,0.94222f,-0.0799213f, +0.270502f,0.962573f,-0.0167793f, +-0.00135827f,0.998382f,0.0568385f, +-0.0464612f,0.993882f,0.100202f, +-0.163616f,0.983349f,-0.0790802f, +-0.219372f,0.956704f,-0.191292f, +-0.0798083f,0.976764f,-0.198904f, +-0.0362508f,0.993161f,-0.11098f, +-0.194493f,0.976824f,0.0893684f, +-0.303508f,0.929002f,0.211751f, +-0.120982f,0.967912f,0.220249f, +-0.126864f,0.979558f,0.156117f, +-0.190168f,0.969475f,0.154773f, +0.442277f,0.894635f,0.0633978f, +0.351901f,0.932017f,0.0866602f, +0.271089f,0.951246f,0.147111f, +0.263373f,0.940704f,0.2138f, +0.0780789f,0.961317f,0.264145f, +-0.165165f,0.972713f,0.162944f, +0.054241f,0.96435f,0.259011f, +0.119009f,0.928226f,0.352467f, +0.062551f,0.905107f,0.420558f, +-0.0376962f,0.903166f,0.427633f, +-0.119235f,0.864868f,0.487634f, +-0.107099f,0.89512f,0.43277f, +-0.228241f,0.933808f,0.275515f, +-0.34367f,0.891778f,0.294319f, +-0.360994f,0.863066f,0.353271f, +-0.329935f,0.870805f,0.364474f, +-0.225803f,0.873787f,0.430708f, +-0.324138f,0.85889f,0.396537f, +-0.511071f,0.812187f,0.281352f, +-0.475013f,0.824987f,0.306202f, +-0.392033f,0.887928f,0.240612f, +-0.45534f,0.876633f,0.155499f, +-0.547025f,0.829694f,0.111226f, +-0.496064f,0.862275f,0.101992f, +-0.479515f,0.87606f,0.0508306f, +-0.424535f,0.90465f,0.0371277f, +-0.362147f,0.919497f,0.152886f, +-0.412742f,0.878092f,0.24207f, +-0.402299f,0.893898f,0.197745f, +-0.26297f,0.963672f,0.0467231f, +-0.219075f,0.975598f,-0.0146319f, +-0.186267f,0.980099f,-0.0686323f, +-0.0357984f,0.992879f,-0.113625f, +0.180598f,0.983509f,0.00973344f, +0.28459f,0.957748f,0.0415635f, +0.350884f,0.934731f,0.0561944f, +0.201029f,0.975728f,-0.0868401f, +0.10163f,0.994331f,-0.0312587f, +-0.0498772f,0.998294f,0.0303674f, +0.0144565f,0.996475f,0.082632f, +0.17671f,0.984206f,0.0105968f, +0.384098f,0.921983f,-0.049144f, +0.526508f,0.848767f,-0.048829f, +0.451141f,0.890087f,-0.0649363f, +0.349978f,0.927792f,-0.129298f, +0.525028f,0.849511f,-0.051734f, +0.403316f,0.902994f,-0.148114f, +0.146493f,0.950082f,-0.275472f, +0.257494f,0.953663f,-0.155639f, +0.363336f,0.930153f,-0.0529431f, +0.407301f,0.911128f,-0.0628641f, +0.309341f,0.935596f,-0.170201f, +0.234661f,0.952473f,-0.194238f, +0.248922f,0.950735f,-0.18477f, +0.176271f,0.982701f,-0.0568089f, +-0.0817466f,0.996475f,0.0188703f, +-0.0390696f,0.99855f,0.0370285f, +0.0392849f,0.997614f,0.0567754f, +-0.165147f,0.985538f,-0.0379532f, +-0.216905f,0.97598f,0.020392f, +-0.25871f,0.942954f,0.209538f, +-0.318314f,0.87576f,0.362933f, +-0.238112f,0.92993f,0.280235f, +-0.11178f,0.963059f,0.244995f, +-0.156033f,0.939968f,0.303502f, +-0.219558f,0.904757f,0.364977f, +0.29059f,0.953077f,-0.0848643f, +0.282679f,0.959209f,-0.00326087f, +0.165956f,0.986031f,0.0141778f, +0.145774f,0.971701f,0.185869f, +0.0971539f,0.92606f,0.364656f, +-0.126893f,0.938591f,0.320851f, +-0.158756f,0.918948f,0.361014f, +0.0576791f,0.877286f,0.47649f, +0.151465f,0.884095f,0.442079f, +-0.0842052f,0.912347f,0.400665f, +-0.236928f,0.870703f,0.430978f, +-0.0173538f,0.858153f,0.513101f, +-0.0453547f,0.868839f,0.493013f, +-0.308698f,0.88215f,0.355692f, +-0.391959f,0.868398f,0.303732f, +-0.360504f,0.877037f,0.317558f, +-0.289644f,0.88703f,0.359561f, +-0.323579f,0.85156f,0.412484f, +-0.483914f,0.781191f,0.39442f, +-0.428744f,0.813324f,0.393297f, +-0.337017f,0.871068f,0.357294f, +-0.382215f,0.837599f,0.390306f, +-0.472752f,0.816976f,0.330237f, +-0.454132f,0.848356f,0.272131f, +-0.386129f,0.879637f,0.277745f, +-0.408175f,0.895196f,0.178931f, +-0.461039f,0.873474f,0.15648f, +-0.444429f,0.876284f,0.186035f, +-0.324725f,0.941951f,0.085336f, +-0.200261f,0.979518f,0.0209972f, +-0.146655f,0.98862f,0.0335086f, +-0.105669f,0.986512f,-0.125016f, +-0.0113758f,0.977088f,-0.21253f, +0.125756f,0.969156f,-0.211948f, +0.231535f,0.947003f,-0.222657f, +0.267937f,0.954488f,-0.131005f, +0.231299f,0.971277f,0.055871f, +0.0809071f,0.991774f,0.0991925f, +0.000207679f,0.999953f,0.00973996f, +0.0247831f,0.993578f,-0.110402f, +0.181304f,0.979201f,-0.0910725f, +0.390907f,0.919373f,-0.0441033f, +0.523664f,0.849877f,-0.0590321f, +0.487061f,0.873094f,-0.0218679f, +0.442794f,0.892691f,-0.0838822f, +0.486459f,0.850567f,-0.199735f, +0.449595f,0.886474f,-0.10967f, +0.172841f,0.979158f,-0.106661f, +0.134151f,0.987388f,-0.084069f, +0.292984f,0.955775f,-0.0255695f, +0.391346f,0.920229f,-0.00512785f, +0.418943f,0.907957f,0.00999318f, +0.324262f,0.936698f,-0.1321f, +0.190686f,0.957473f,-0.216527f, +0.0619887f,0.993289f,-0.097645f, +-0.0829846f,0.99633f,-0.0209901f, +-0.0646754f,0.997763f,-0.0169202f, +-0.0614217f,0.996217f,0.0614677f, +-0.189778f,0.963623f,0.188191f, +-0.363861f,0.896503f,0.25276f, +-0.348308f,0.859996f,0.372945f, +-0.264506f,0.906439f,0.329249f, +-0.140762f,0.939057f,0.31362f, +-0.154941f,0.944783f,0.288752f, +-0.237481f,0.904164f,0.355093f, +-0.314839f,0.867723f,0.38462f, +0.199283f,0.97456f,-0.102566f, +0.290362f,0.956152f,-0.0382605f, +0.163603f,0.98144f,-0.10005f, +-0.0845537f,0.992536f,-0.0878854f, +-0.0995819f,0.988025f,0.117859f, +-0.128698f,0.94862f,0.289062f, +-0.181988f,0.934999f,0.304396f, +0.0121717f,0.953274f,0.301863f, +0.15771f,0.909532f,0.384551f, +-0.030083f,0.904525f,0.425359f, +-0.262213f,0.918561f,0.295788f, +-0.150427f,0.932893f,0.327234f, +-0.0433771f,0.888915f,0.456013f, +-0.194904f,0.882492f,0.428042f, +-0.359771f,0.865678f,0.348089f, +-0.358104f,0.856009f,0.37284f, +-0.334766f,0.853069f,0.400257f, +-0.382047f,0.809514f,0.445788f, +-0.440041f,0.772384f,0.458024f, +-0.392897f,0.847233f,0.357532f, +-0.352962f,0.862399f,0.362885f, +-0.432462f,0.797784f,0.42014f, +-0.40741f,0.807767f,0.426063f, +-0.417686f,0.831448f,0.366378f, +-0.406533f,0.835025f,0.370761f, +-0.302917f,0.831265f,0.466089f, +-0.354465f,0.85583f,0.376708f, +-0.320875f,0.930472f,0.17681f, +-0.210666f,0.977556f,0.00208309f, +-0.202152f,0.976764f,-0.0711849f, +-0.0734606f,0.993473f,-0.0872598f, +0.0104554f,0.979699f,-0.2002f, +0.0812548f,0.981491f,-0.173417f, +0.133484f,0.953074f,-0.271721f, +0.239226f,0.941558f,-0.23715f, +0.0986638f,0.979162f,-0.177504f, +0.0167662f,0.999807f,0.0102821f, +0.0608252f,0.989728f,0.129377f, +0.193478f,0.976369f,0.0962839f, +0.105893f,0.986391f,-0.125774f, +0.159018f,0.972139f,-0.17222f, +0.348199f,0.916375f,-0.197521f, +0.506641f,0.853561f,-0.121441f, +0.438954f,0.895697f,-0.0710352f, +0.508211f,0.861156f,-0.0114456f, +0.538629f,0.837641f,-0.0907543f, +0.350973f,0.934296f,-0.0625226f, +0.130826f,0.991364f,0.00901604f, +0.142249f,0.989581f,0.0222434f, +0.314713f,0.948656f,-0.0317428f, +0.413134f,0.902882f,-0.118849f, +0.421178f,0.889709f,-0.176143f, +0.40304f,0.897538f,-0.178843f, +0.190553f,0.961133f,-0.199782f, +-0.0704956f,0.989551f,-0.125772f, +-0.145721f,0.988685f,0.035603f, +-0.158165f,0.979549f,0.124366f, +-0.141884f,0.945197f,0.294061f, +-0.282634f,0.89813f,0.336869f, +-0.398539f,0.847577f,0.350398f, +-0.326007f,0.891199f,0.31541f, +-0.257935f,0.930645f,0.259558f, +-0.189362f,0.933131f,0.305628f, +-0.181998f,0.908713f,0.375656f, +-0.284451f,0.857477f,0.428743f, +-0.324962f,0.834267f,0.445419f, +0.162722f,0.967013f,-0.19598f, +0.196801f,0.96943f,-0.146541f, +0.171798f,0.98444f,0.0369126f, +-0.0614366f,0.993745f,0.0932502f, +-0.263807f,0.962515f,0.063023f, +-0.262644f,0.943232f,0.203304f, +-0.183229f,0.945939f,0.267632f, +-0.0512022f,0.955564f,0.290302f, +0.0500709f,0.932925f,0.356571f, +-0.017607f,0.930336f,0.366286f, +-0.141345f,0.917863f,0.370876f, +-0.196664f,0.921785f,0.334121f, +-0.123639f,0.931227f,0.342826f, +-0.166673f,0.929929f,0.327799f, +-0.365314f,0.882118f,0.297345f, +-0.422119f,0.842584f,0.334465f, +-0.378137f,0.838603f,0.392119f, +-0.433991f,0.800503f,0.413336f, +-0.373446f,0.819157f,0.435339f, +-0.321191f,0.877582f,0.35593f, +-0.410179f,0.839146f,0.357194f, +-0.450466f,0.792998f,0.410164f, +-0.383405f,0.853385f,0.353178f, +-0.361072f,0.88078f,0.306355f, +-0.471517f,0.844691f,0.253315f, +-0.399349f,0.852332f,0.337713f, +-0.193735f,0.889811f,0.413163f, +-0.0964184f,0.953204f,0.28654f, +-0.0731968f,0.993583f,0.0862245f, +-0.107213f,0.990087f,-0.0907379f, +-0.0139207f,0.976637f,-0.214443f, +-0.00517032f,0.976967f,-0.213328f, +0.032564f,0.990278f,-0.135238f, +0.193406f,0.974103f,-0.117123f, +0.137302f,0.989014f,-0.0547632f, +0.0149454f,0.997504f,0.06901f, +-0.0673257f,0.995987f,0.0589639f, +0.00671915f,0.997834f,0.0654375f, +0.236496f,0.961793f,0.137925f, +0.296243f,0.953456f,0.0562338f, +0.227931f,0.966806f,-0.11547f, +0.392626f,0.909868f,-0.134105f, +0.455312f,0.880641f,-0.131003f, +0.402519f,0.906647f,-0.126375f, +0.459051f,0.879656f,-0.124406f, +0.531911f,0.846049f,-0.0356662f, +0.366681f,0.930218f,0.0155094f, +0.101768f,0.992829f,-0.0627213f, +0.169781f,0.984995f,-0.0309622f, +0.383193f,0.921183f,-0.0677109f, +0.483652f,0.86784f,-0.113728f, +0.481548f,0.864447f,-0.144373f, +0.322376f,0.925659f,-0.198063f, +0.121084f,0.992307f,-0.0257868f, +-0.189201f,0.97803f,0.0875253f, +-0.272481f,0.941614f,0.197779f, +-0.28107f,0.929157f,0.240138f, +-0.316277f,0.890261f,0.327726f, +-0.284096f,0.875896f,0.389994f, +-0.304764f,0.879665f,0.365114f, +-0.295018f,0.913863f,0.278959f, +-0.233864f,0.913909f,0.331779f, +-0.25276f,0.886942f,0.386584f, +-0.254968f,0.846261f,0.467797f, +-0.324913f,0.811645f,0.485452f, +-0.330966f,0.801562f,0.497956f, +0.166281f,0.984047f,-0.0632562f, +0.102172f,0.992786f,-0.0627485f, +-0.0446214f,0.999004f,-0.000325965f, +-0.137659f,0.980871f,0.13763f, +-0.270041f,0.94552f,0.18185f, +-0.300503f,0.932348f,0.201063f, +-0.224552f,0.960314f,0.165452f, +-0.109331f,0.978965f,0.17226f, +0.0684226f,0.972288f,0.223551f, +-0.0281009f,0.965962f,0.257154f, +-0.203983f,0.927334f,0.313757f, +-0.170837f,0.935943f,0.307937f, +-0.0844776f,0.951083f,0.29716f, +-0.140439f,0.935294f,0.32481f, +-0.360713f,0.879742f,0.309743f, +-0.466354f,0.845167f,0.261162f, +-0.425659f,0.859392f,0.283303f, +-0.470194f,0.836884f,0.280256f, +-0.410878f,0.856359f,0.312777f, +-0.293557f,0.864483f,0.408036f, +-0.429097f,0.81157f,0.396523f, +-0.438172f,0.837036f,0.327683f, +-0.303084f,0.911643f,0.277574f, +-0.346895f,0.902405f,0.255594f, +-0.444307f,0.857916f,0.258015f, +-0.440123f,0.885255f,0.150386f, +-0.246442f,0.965625f,0.0826743f, +-0.0242341f,0.995753f,0.0888192f, +0.128537f,0.987977f,0.085905f, +0.10291f,0.993755f,-0.0431449f, +0.0280177f,0.986869f,-0.159076f, +-0.0318503f,0.988236f,-0.149584f, +0.00777626f,0.97932f,-0.202168f, +0.111085f,0.970769f,-0.212762f, +-0.00220326f,0.997417f,-0.0718009f, +-0.0152092f,0.997571f,0.0679693f, +0.0100591f,0.998816f,0.0476033f, +-0.00783919f,0.999851f,-0.0153546f, +0.1632f,0.986482f,-0.0148045f, +0.356551f,0.93118f,0.0760001f, +0.33409f,0.940767f,0.0578066f, +0.378555f,0.924836f,-0.0370621f, +0.481573f,0.874509f,-0.0576253f, +0.443664f,0.890369f,-0.102011f, +0.449245f,0.88434f,-0.126968f, +0.449063f,0.892098f,-0.05003f, +0.400085f,0.916232f,0.0212355f, +0.189459f,0.975149f,-0.114846f, +0.154225f,0.96178f,-0.226258f, +0.36559f,0.902984f,-0.225751f, +0.443305f,0.891814f,-0.0902669f, +0.481296f,0.876165f,0.0262584f, +0.274557f,0.96003f,0.0544047f, +-0.0951468f,0.983236f,0.155547f, +-0.272231f,0.920302f,0.280953f, +-0.309095f,0.909629f,0.277553f, +-0.260629f,0.904898f,0.336501f, +-0.319906f,0.899874f,0.296456f, +-0.309019f,0.910231f,0.275658f, +-0.301457f,0.909911f,0.284931f, +-0.289244f,0.908198f,0.302514f, +-0.349317f,0.867088f,0.355157f, +-0.355035f,0.811266f,0.46454f, +-0.291879f,0.804435f,0.517388f, +-0.292737f,0.815956f,0.498519f, +-0.341117f,0.83204f,0.437434f, +0.012939f,0.999781f,0.0164623f, +0.101117f,0.986501f,0.12881f, +-0.0315137f,0.991787f,0.123953f, +-0.202813f,0.972667f,0.113078f, +-0.267039f,0.954882f,0.129964f, +-0.329248f,0.943109f,0.0462825f, +-0.158801f,0.981787f,0.104294f, +-0.0896983f,0.994441f,0.0551561f, +-0.03797f,0.996172f,0.0787436f, +-0.124773f,0.970658f,0.205561f, +-0.242396f,0.92942f,0.278248f, +-0.1236f,0.936757f,0.327428f, +-0.115597f,0.950099f,0.289742f, +-0.242269f,0.924532f,0.294187f, +-0.335063f,0.873272f,0.353736f, +-0.402827f,0.872268f,0.27727f, +-0.433494f,0.882428f,0.182769f, +-0.472347f,0.860126f,0.192541f, +-0.516304f,0.829671f,0.212311f, +-0.401557f,0.840095f,0.364681f, +-0.365647f,0.853697f,0.370816f, +-0.342203f,0.911984f,0.226234f, +-0.319568f,0.928553f,0.188855f, +-0.368607f,0.886665f,0.279203f, +-0.401013f,0.885839f,0.233406f, +-0.263462f,0.961384f,0.0795548f, +-0.119336f,0.983737f,-0.134243f, +-0.028348f,0.969034f,-0.245295f, +0.0404463f,0.983879f,-0.174201f, +0.11875f,0.992593f,0.0256534f, +0.0602272f,0.997166f,0.0450923f, +0.0340291f,0.999414f,-0.00366965f, +0.0708792f,0.992684f,-0.097743f, +0.0958935f,0.99395f,-0.0535485f, +-0.0943801f,0.993296f,-0.0667466f, +-0.119267f,0.988594f,-0.0919588f, +0.000759128f,0.999891f,-0.0147216f, +0.0724665f,0.997368f,-0.00256206f, +0.170906f,0.979948f,-0.10244f, +0.214916f,0.97339f,-0.079521f, +0.347938f,0.935698f,0.0583811f, +0.479062f,0.877734f,-0.00909944f, +0.517939f,0.850313f,-0.0933121f, +0.446396f,0.884197f,-0.137574f, +0.389313f,0.918353f,-0.0711587f, +0.410982f,0.908412f,0.0766878f, +0.41147f,0.910096f,0.0491837f, +0.356411f,0.933637f,-0.0359751f, +0.291892f,0.941315f,-0.169483f, +0.292525f,0.936947f,-0.191205f, +0.303478f,0.950202f,-0.0708325f, +0.350076f,0.936333f,0.0269695f, +0.186651f,0.94527f,0.26763f, +-0.145022f,0.9031f,0.404201f, +-0.257588f,0.88179f,0.395088f, +-0.316433f,0.892435f,0.321607f, +-0.301856f,0.895088f,0.328177f, +-0.311714f,0.888624f,0.336427f, +-0.275146f,0.879635f,0.387991f, +-0.320358f,0.874704f,0.363681f, +-0.312957f,0.856468f,0.410514f, +-0.417707f,0.826376f,0.377656f, +-0.402058f,0.821773f,0.403779f, +-0.299174f,0.86271f,0.407708f, +-0.252864f,0.886408f,0.387737f, +-0.266831f,0.899401f,0.346235f, +-0.121912f,0.980245f,-0.155747f, +-0.0467045f,0.996241f,-0.0729522f, +-0.0560423f,0.996609f,0.0602479f, +-0.253613f,0.959854f,0.119832f, +-0.17852f,0.958289f,0.223189f, +-0.25091f,0.965294f,0.0724672f, +-0.244405f,0.968888f,0.0390022f, +-0.111828f,0.978686f,0.172245f, +-0.104286f,0.963728f,0.245667f, +-0.172657f,0.941673f,0.288863f, +-0.302965f,0.917419f,0.257981f, +-0.21274f,0.929075f,0.302592f, +-0.0577232f,0.923128f,0.380136f, +-0.183983f,0.930078f,0.31797f, +-0.384056f,0.900387f,0.204463f, +-0.327378f,0.913703f,0.240771f, +-0.374063f,0.905896f,0.198566f, +-0.504219f,0.846296f,0.17189f, +-0.555467f,0.810974f,0.183786f, +-0.456478f,0.86757f,0.197356f, +-0.300554f,0.935674f,0.184881f, +-0.295051f,0.948068f,0.118792f, +-0.362387f,0.917821f,0.162113f, +-0.440667f,0.875232f,0.199453f, +-0.248631f,0.939944f,0.233854f, +-0.0966352f,0.995188f,0.0161918f, +0.0243217f,0.996259f,-0.0829196f, +0.0213875f,0.994057f,-0.106741f, +-0.13683f,0.98707f,-0.0834831f, +-0.0593385f,0.994125f,0.0905282f, +0.0836318f,0.990077f,0.112932f, +0.079675f,0.993049f,0.0866394f, +0.0726138f,0.990126f,0.119908f, +0.0468689f,0.990824f,0.126776f, +0.00048966f,0.99587f,0.0907856f, +-0.0299455f,0.998898f,-0.0361395f, +-0.0528047f,0.988171f,-0.143981f, +0.0771474f,0.992034f,-0.0995875f, +0.233f,0.968973f,-0.0824758f, +0.215078f,0.967265f,-0.134683f, +0.299646f,0.93128f,-0.207193f, +0.500666f,0.844143f,-0.191721f, +0.5316f,0.838001f,-0.123112f, +0.45137f,0.888237f,-0.0854371f, +0.26295f,0.958984f,-0.105862f, +0.297072f,0.954855f,-0.000735176f, +0.467586f,0.880091f,0.0824758f, +0.451683f,0.892137f,0.00862833f, +0.280097f,0.955995f,-0.0872873f, +0.27353f,0.961001f,0.0407195f, +0.263182f,0.963734f,0.044184f, +0.22357f,0.970136f,0.0940863f, +-0.055048f,0.955137f,0.291002f, +-0.267739f,0.863744f,0.426921f, +-0.199104f,0.857693f,0.474046f, +-0.21681f,0.879018f,0.424642f, +-0.270209f,0.885026f,0.379098f, +-0.341336f,0.865644f,0.366267f, +-0.32372f,0.861174f,0.391898f, +-0.34092f,0.838889f,0.42431f, +-0.295898f,0.818794f,0.491956f, +-0.331f,0.829823f,0.449258f, +-0.389842f,0.853312f,0.34624f, +-0.281201f,0.9123f,0.297716f, +-0.234572f,0.935622f,0.263795f, +-0.225355f,0.942001f,0.248696f, +-0.0486057f,0.996635f,-0.0660014f, +-0.101682f,0.988174f,-0.114771f, +-0.162649f,0.983215f,-0.0826606f, +-0.318288f,0.946728f,-0.048975f, +-0.258454f,0.965864f,-0.0175802f, +-0.136613f,0.987862f,0.0739351f, +-0.281595f,0.958211f,0.0503573f, +-0.28706f,0.943479f,0.165663f, +-0.148179f,0.930819f,0.334095f, +-0.182832f,0.931383f,0.314798f, +-0.242578f,0.923022f,0.298642f, +-0.204404f,0.955935f,0.21073f, +-0.142784f,0.976536f,0.161212f, +-0.136962f,0.950722f,0.278153f, +-0.274249f,0.920019f,0.279915f, +-0.389723f,0.904453f,0.173436f, +-0.370261f,0.901011f,0.226022f, +-0.50377f,0.847021f,0.169619f, +-0.52553f,0.835875f,0.158529f, +-0.435894f,0.894864f,0.0959897f, +-0.279872f,0.956869f,0.07793f, +-0.331658f,0.940229f,0.0772765f, +-0.372127f,0.91403f,0.161461f, +-0.456876f,0.888328f,0.0462339f, +-0.204408f,0.978272f,0.0346564f, +0.0554954f,0.998458f,-0.00157713f, +-0.0102256f,0.999947f,0.00149442f, +-0.0507499f,0.985345f,0.162848f, +-0.124313f,0.970082f,0.208536f, +-0.111836f,0.992788f,0.0431796f, +0.135986f,0.987999f,0.0732526f, +0.00980425f,0.997155f,0.0747439f, +0.00734776f,0.982792f,0.184568f, +0.0872171f,0.965097f,0.246944f, +0.0795152f,0.966423f,0.244345f, +0.106439f,0.984803f,0.137237f, +0.0584187f,0.998092f,-0.0199996f, +0.0370568f,0.991888f,-0.121591f, +0.199554f,0.972297f,-0.121727f, +0.308311f,0.945569f,-0.104131f, +0.399439f,0.904394f,-0.150064f, +0.468199f,0.870932f,-0.149223f, +0.412212f,0.907025f,-0.0859413f, +0.425915f,0.903304f,0.0513667f, +0.351639f,0.936099f,-0.00832492f, +0.20857f,0.966693f,-0.148333f, +0.395551f,0.918183f,0.0219088f, +0.538432f,0.838724f,0.0814483f, +0.24402f,0.966591f,-0.0784634f, +0.178953f,0.981938f,0.0614245f, +0.258979f,0.960241f,0.104243f, +0.0759782f,0.986383f,0.145865f, +-0.19655f,0.929601f,0.311786f, +-0.328358f,0.883678f,0.333607f, +-0.21216f,0.920721f,0.327507f, +-0.208125f,0.923292f,0.322823f, +-0.300181f,0.87973f,0.368737f, +-0.312111f,0.847974f,0.428401f, +-0.324858f,0.873038f,0.363693f, +-0.410275f,0.846963f,0.338124f, +-0.346514f,0.853308f,0.389607f, +-0.303825f,0.86928f,0.389926f, +-0.270707f,0.881074f,0.387848f, +-0.213937f,0.928705f,0.302885f, +-0.20202f,0.939889f,0.275312f, +-0.214102f,0.943299f,0.253667f, +-0.0402111f,0.999126f,0.011392f, +-0.0458289f,0.99894f,0.00442323f, +-0.170695f,0.984267f,-0.0456311f, +-0.29333f,0.955986f,-0.00691228f, +-0.274679f,0.961535f,-0.00118788f, +-0.240876f,0.970372f,-0.0188751f, +-0.335158f,0.942005f,0.0172014f, +-0.387782f,0.921031f,0.0364391f, +-0.254694f,0.964339f,0.0719752f, +-0.156383f,0.970864f,0.181569f, +-0.223749f,0.957301f,0.183063f, +-0.122594f,0.972034f,0.200303f, +-0.0910709f,0.976799f,0.193828f, +-0.28429f,0.950625f,0.124466f, +-0.315477f,0.924742f,0.212902f, +-0.305454f,0.925312f,0.224713f, +-0.365063f,0.920836f,0.137077f, +-0.474911f,0.873286f,0.108772f, +-0.523018f,0.843362f,0.123259f, +-0.405348f,0.903149f,0.141474f, +-0.272593f,0.953587f,0.127925f, +-0.342778f,0.935924f,0.0809316f, +-0.402631f,0.912044f,0.0778773f, +-0.324862f,0.935409f,0.139553f, +-0.213356f,0.97623f,0.0381383f, +0.0301299f,0.998064f,0.0544045f, +-0.104927f,0.992798f,0.0578138f, +-0.261101f,0.959724f,0.103713f, +-0.0217785f,0.964552f,0.262994f, +0.0803134f,0.988499f,0.128142f, +0.028164f,0.998669f,0.043203f, +-0.0183001f,0.984341f,0.175323f, +-0.0612635f,0.982917f,0.173556f, +-0.0331225f,0.977326f,0.209135f, +0.0728156f,0.957515f,0.279039f, +0.245559f,0.942697f,0.225881f, +0.183786f,0.974714f,0.127102f, +0.141547f,0.988409f,0.0548866f, +0.245636f,0.968932f,-0.0288843f, +0.304552f,0.94926f,-0.0784495f, +0.340339f,0.936344f,-0.0861948f, +0.460805f,0.886321f,0.0457651f, +0.380493f,0.924294f,0.030084f, +0.352595f,0.93478f,0.0431689f, +0.472573f,0.87479f,0.106851f, +0.264087f,0.962772f,-0.057695f, +0.234368f,0.968348f,-0.0858683f, +0.503248f,0.863251f,0.0392276f, +0.302957f,0.950423f,0.0700943f, +0.0199528f,0.999731f,0.0118377f, +0.239816f,0.960125f,0.143695f, +-0.0259597f,0.9852f,0.16943f, +-0.288371f,0.907451f,0.305574f, +-0.301113f,0.913287f,0.274296f, +-0.184882f,0.952263f,0.242927f, +-0.251998f,0.931999f,0.260528f, +-0.398011f,0.856633f,0.32828f, +-0.335641f,0.851294f,0.403292f, +-0.239383f,0.893387f,0.380205f, +-0.388171f,0.875539f,0.287671f, +-0.364652f,0.897686f,0.247364f, +-0.31107f,0.908317f,0.279636f, +-0.277708f,0.915298f,0.291733f, +-0.164862f,0.947448f,0.274159f, +-0.18884f,0.953184f,0.236178f, +-0.183001f,0.960107f,0.211435f, +-0.0382166f,0.998778f,0.0313295f, +-0.025601f,0.999566f,0.0145695f, +-0.151993f,0.98817f,-0.0204673f, +-0.361566f,0.932093f,-0.021731f, +-0.304279f,0.951825f,0.0379804f, +-0.164708f,0.984119f,0.0661845f, +-0.289794f,0.954555f,-0.0695987f, +-0.339732f,0.933497f,-0.114741f, +-0.304944f,0.945342f,-0.115492f, +-0.266385f,0.963249f,-0.0345067f, +-0.261205f,0.96511f,0.0183122f, +-0.220073f,0.973176f,0.06706f, +-0.108437f,0.981443f,0.158152f, +-0.188668f,0.971426f,0.143996f, +-0.373149f,0.923277f,0.0912126f, +-0.308957f,0.927563f,0.210174f, +-0.302984f,0.922237f,0.240167f, +-0.457665f,0.867903f,0.193102f, +-0.548023f,0.825328f,0.136032f, +-0.407198f,0.903776f,0.131829f, +-0.253292f,0.959077f,0.126545f, +-0.271541f,0.948088f,0.165511f, +-0.43428f,0.889355f,0.142997f, +-0.382973f,0.89965f,0.20967f, +-0.169509f,0.965022f,0.199998f, +0.00160887f,0.982078f,0.188467f, +-0.0137168f,0.977172f,0.212005f, +-0.230009f,0.971053f,0.0644371f, +-0.165502f,0.985539f,0.036359f, +0.129892f,0.967237f,0.218131f, +0.0422409f,0.973374f,0.225299f, +-0.105762f,0.968925f,0.223604f, +-0.0226547f,0.965849f,0.258115f, +0.0138374f,0.990856f,0.134211f, +0.0309349f,0.998739f,0.0395399f, +0.294589f,0.940971f,0.166706f, +0.248856f,0.959421f,0.132596f, +0.181153f,0.982002f,0.053445f, +0.283788f,0.958737f,0.0169453f, +0.366617f,0.930251f,-0.0149969f, +0.332578f,0.93839f,-0.0938972f, +0.358957f,0.931691f,-0.0557027f, +0.429022f,0.901938f,0.0494683f, +0.332897f,0.942781f,-0.0185381f, +0.429131f,0.903242f,-0.000810457f, +0.405301f,0.91403f,-0.0167607f, +0.256936f,0.958211f,-0.12576f, +0.354456f,0.935063f,-0.00433271f, +0.385431f,0.888673f,0.248403f, +0.0742527f,0.992531f,0.0967874f, +0.121836f,0.985927f,0.11447f, +-0.100545f,0.965192f,0.241444f, +-0.337975f,0.881899f,0.328674f, +-0.242866f,0.922974f,0.298555f, +-0.185171f,0.940279f,0.285633f, +-0.313033f,0.906226f,0.28419f, +-0.448562f,0.843983f,0.294082f, +-0.356046f,0.888609f,0.289144f, +-0.196811f,0.931399f,0.306206f, +-0.298585f,0.916744f,0.265384f, +-0.410663f,0.894937f,0.17448f, +-0.325435f,0.90586f,0.271126f, +-0.301755f,0.928362f,0.216998f, +-0.109278f,0.952007f,0.285903f, +-0.14523f,0.965578f,0.215795f, +-0.139372f,0.971047f,0.194018f, +0.00163448f,0.997617f,0.0689798f, +0.026224f,0.998835f,0.04051f, +-0.128032f,0.991559f,-0.0204567f, +-0.309968f,0.948873f,-0.0596736f, +-0.340105f,0.924291f,-0.173245f, +-0.190965f,0.977348f,-0.0912302f, +-0.146645f,0.988782f,-0.028384f, +-0.31072f,0.935549f,-0.167929f, +-0.380234f,0.90209f,-0.204096f, +-0.300275f,0.945729f,-0.124224f, +-0.302914f,0.945705f,-0.117837f, +-0.237161f,0.970049f,-0.0525309f, +-0.165718f,0.984724f,-0.0534418f, +-0.190643f,0.98063f,0.0449474f, +-0.411915f,0.909141f,0.0615588f, +-0.453396f,0.88136f,0.1328f, +-0.362905f,0.886473f,0.287169f, +-0.380477f,0.872742f,0.305874f, +-0.476636f,0.866585f,0.147809f, +-0.366115f,0.923073f,0.117878f, +-0.278065f,0.952821f,0.121709f, +-0.370509f,0.910147f,0.18535f, +-0.442894f,0.857435f,0.26201f, +-0.347292f,0.915122f,0.204794f, +-0.111317f,0.983727f,0.141034f, +-0.00583658f,0.989977f,0.14111f, +0.00293304f,0.989031f,0.147679f, +-0.0932614f,0.992658f,0.0770272f, +-0.209442f,0.977765f,-0.0104574f, +-0.0521744f,0.996134f,0.0706788f, +0.0111918f,0.977173f,0.21215f, +-0.0985288f,0.958328f,0.268141f, +0.0097532f,0.972945f,0.23083f, +0.214151f,0.960047f,0.180136f, +0.0316331f,0.999392f,0.014672f, +0.114623f,0.990459f,0.0765015f, +0.302992f,0.926463f,0.223298f, +0.283203f,0.948444f,0.142303f, +0.315435f,0.948621f,0.0248881f, +0.37741f,0.92565f,0.0270755f, +0.401819f,0.915069f,0.0345122f, +0.321768f,0.943567f,-0.0784028f, +0.371664f,0.926589f,-0.0574381f, +0.394659f,0.917373f,-0.0516908f, +0.434962f,0.894125f,-0.106531f, +0.447382f,0.892016f,-0.0644733f, +0.241542f,0.966428f,-0.0876093f, +0.127706f,0.991493f,-0.0251536f, +0.250404f,0.953051f,0.170269f, +0.250954f,0.937023f,0.242919f, +-0.000559693f,0.986358f,0.164614f, +-0.211006f,0.922632f,0.32284f, +-0.34675f,0.881023f,0.321811f, +-0.216454f,0.925604f,0.310492f, +-0.177379f,0.942447f,0.283426f, +-0.307121f,0.917748f,0.251824f, +-0.427987f,0.86998f,0.244872f, +-0.348579f,0.908707f,0.229659f, +-0.214211f,0.945769f,0.244201f, +-0.272299f,0.924949f,0.265184f, +-0.413173f,0.878684f,0.239168f, +-0.359354f,0.883418f,0.300728f, +-0.292273f,0.892332f,0.343978f, +-0.146355f,0.897543f,0.415929f, +-0.0984727f,0.903088f,0.418013f, +-0.114958f,0.888054f,0.445134f, +0.0486539f,0.997583f,-0.0496084f, +0.0486095f,0.995772f,-0.0779487f, +-0.0727955f,0.994312f,-0.0777426f, +-0.222675f,0.967501f,-0.119823f, +-0.286744f,0.93984f,-0.185682f, +-0.296641f,0.937378f,-0.182555f, +-0.219022f,0.967026f,-0.12996f, +-0.147314f,0.984117f,-0.0990538f, +-0.3428f,0.902622f,-0.26031f, +-0.347893f,0.908635f,-0.230983f, +-0.327008f,0.925901f,-0.189136f, +-0.254527f,0.952486f,-0.167289f, +-0.228332f,0.958887f,-0.168522f, +-0.287734f,0.955666f,-0.0625468f, +-0.451431f,0.892304f,0.00185963f, +-0.510909f,0.851571f,0.11747f, +-0.434919f,0.884052f,0.171166f, +-0.355658f,0.920763f,0.16032f, +-0.392075f,0.91242f,0.117331f, +-0.40418f,0.912194f,0.0673793f, +-0.347001f,0.925636f,0.15096f, +-0.406528f,0.883834f,0.231457f, +-0.406378f,0.897555f,0.171031f, +-0.271349f,0.960134f,0.0671726f, +-0.0926357f,0.994526f,0.0483373f, +-0.0156467f,0.998994f,0.0420269f, +0.00801384f,0.999533f,0.0295044f, +-0.0412004f,0.995482f,0.0855485f, +-0.171347f,0.982792f,0.068987f, +-0.142796f,0.988044f,0.0581328f, +-0.101871f,0.981247f,0.163632f, +-0.103189f,0.979569f,0.172615f, +0.0761964f,0.994828f,0.0671726f, +0.210538f,0.977574f,0.00485915f, +0.123577f,0.988892f,0.0825912f, +0.0553491f,0.995759f,0.0734865f, +0.223203f,0.966768f,0.124662f, +0.344575f,0.927512f,0.144881f, +0.388873f,0.91351f,0.119485f, +0.324349f,0.942843f,0.0764535f, +0.411999f,0.8978f,0.155603f, +0.440079f,0.892774f,0.0963553f, +0.378616f,0.925121f,-0.0283174f, +0.428515f,0.90345f,-0.0123871f, +0.429626f,0.902172f,-0.0388249f, +0.396609f,0.917987f,-0.000717735f, +0.233551f,0.972137f,-0.020091f, +0.111169f,0.993801f,0.000982701f, +0.115357f,0.993291f,0.00809163f, +0.164275f,0.973308f,0.160266f, +-0.0349159f,0.947849f,0.316803f, +-0.267423f,0.890391f,0.368361f, +-0.327503f,0.90805f,0.261125f, +-0.196107f,0.942247f,0.271499f, +-0.118776f,0.949723f,0.289686f, +-0.296931f,0.925681f,0.234405f, +-0.445051f,0.862967f,0.239201f, +-0.335704f,0.917243f,0.2144f, +-0.25181f,0.948438f,0.1925f, +-0.329983f,0.903347f,0.274f, +-0.391867f,0.838521f,0.378579f, +-0.417038f,0.817641f,0.396917f, +-0.341558f,0.812981f,0.471594f, +-0.188106f,0.834488f,0.517925f, +-0.137025f,0.804598f,0.577794f, +-0.18711f,0.76127f,0.620852f, +0.138194f,0.960364f,-0.242082f, +0.0401358f,0.96162f,-0.271434f, +-0.076195f,0.979732f,-0.185256f, +-0.203103f,0.960439f,-0.190543f, +-0.267864f,0.941416f,-0.2049f, +-0.261748f,0.936741f,-0.232388f, +-0.231434f,0.930091f,-0.285254f, +-0.126583f,0.962607f,-0.239509f, +-0.258776f,0.934905f,-0.242872f, +-0.430322f,0.876496f,-0.215819f, +-0.353956f,0.929119f,-0.107016f, +-0.27861f,0.956787f,-0.0832819f, +-0.250796f,0.967007f,-0.0447179f, +-0.348257f,0.937394f,-0.0030026f, +-0.497787f,0.866258f,0.0424905f, +-0.584411f,0.803193f,0.115522f, +-0.394257f,0.905213f,0.158588f, +-0.343138f,0.935038f,0.0892179f, +-0.380878f,0.917442f,0.115034f, +-0.389256f,0.914513f,0.11021f, +-0.431967f,0.895633f,0.10605f, +-0.414636f,0.893675f,0.171528f, +-0.300214f,0.948969f,0.0965901f, +-0.20281f,0.978452f,-0.0387339f, +-0.123855f,0.987388f,-0.098611f, +-0.0140563f,0.999899f,0.0019046f, +-0.052066f,0.991601f,0.118388f, +-0.0936165f,0.973604f,0.208163f, +-0.149626f,0.978491f,0.142013f, +-0.198198f,0.970011f,0.140699f, +-0.130637f,0.968649f,0.211313f, +0.013631f,0.991214f,0.131563f, +0.20118f,0.979295f,0.0225449f, +0.231889f,0.971935f,-0.0396138f, +0.0131145f,0.999014f,-0.0424166f, +0.0264969f,0.999403f,0.0221517f, +0.210411f,0.977103f,0.0315571f, +0.327081f,0.943965f,0.0441437f, +0.381166f,0.920813f,0.0825546f, +0.346088f,0.933621f,0.0925967f, +0.356105f,0.932513f,0.0600724f, +0.479238f,0.87232f,0.0968908f, +0.446186f,0.89276f,0.062428f, +0.391504f,0.920172f,-0.00287489f, +0.426134f,0.9041f,0.0318405f, +0.417296f,0.907685f,0.0444148f, +0.286592f,0.957965f,0.012947f, +0.07628f,0.996621f,-0.030475f, +0.0820652f,0.99629f,0.0259114f, +-0.0280556f,0.994071f,0.105053f, +-0.213977f,0.933546f,0.287585f, +-0.245374f,0.890565f,0.382995f, +-0.189692f,0.923736f,0.332759f, +-0.238316f,0.94737f,0.213765f, +-0.176209f,0.945132f,0.275092f, +-0.265622f,0.907592f,0.32515f, +-0.420635f,0.873046f,0.246691f, +-0.275407f,0.930254f,0.242441f, +-0.273955f,0.921146f,0.276474f, +-0.415501f,0.828882f,0.374585f, +-0.488833f,0.76092f,0.426664f, +-0.43149f,0.76785f,0.473522f, +-0.33634f,0.787599f,0.516297f, +-0.228347f,0.790629f,0.568123f, +-0.231089f,0.763668f,0.602835f, +-0.28515f,0.752352f,0.593849f, +0.109283f,0.926796f,-0.359314f, +-0.0105223f,0.944186f,-0.329244f, +-0.147017f,0.945286f,-0.29124f, +-0.202823f,0.935685f,-0.288714f, +-0.214861f,0.941374f,-0.260095f, +-0.2356f,0.926477f,-0.293483f, +-0.224333f,0.941495f,-0.251519f, +-0.230404f,0.948768f,-0.216226f, +-0.277442f,0.956386f,-0.0913908f, +-0.472179f,0.876647f,-0.0923929f, +-0.428177f,0.898465f,-0.0970806f, +-0.3387f,0.938243f,-0.0705803f, +-0.291725f,0.956079f,0.0284457f, +-0.399526f,0.915525f,0.0468393f, +-0.527082f,0.845186f,0.0885769f, +-0.577694f,0.815576f,0.0332458f, +-0.408723f,0.912647f,0.00457497f, +-0.331162f,0.938989f,0.0929031f, +-0.4185f,0.893481f,0.162938f, +-0.372755f,0.902119f,0.217335f, +-0.419905f,0.891761f,0.168648f, +-0.426162f,0.889671f,0.163929f, +-0.238048f,0.949403f,0.20486f, +-0.0631417f,0.981494f,0.180781f, +-0.0934621f,0.991987f,0.0850084f, +-0.209815f,0.971464f,0.110612f, +-0.239382f,0.928806f,0.282871f, +-0.0385152f,0.924665f,0.378829f, +-0.0229585f,0.976683f,0.213458f, +-0.204415f,0.977814f,0.0457583f, +-0.131276f,0.991302f,0.00937849f, +0.100844f,0.99484f,0.0110965f, +0.227419f,0.973508f,-0.0237273f, +0.22975f,0.97307f,0.0187244f, +0.0718328f,0.997222f,0.0197173f, +0.0214849f,0.994143f,-0.105917f, +0.174121f,0.982096f,-0.0718949f, +0.303053f,0.952921f,0.010044f, +0.38012f,0.924935f,0.00218727f, +0.364895f,0.929903f,-0.0461611f, +0.383009f,0.921386f,-0.0659776f, +0.441676f,0.895702f,-0.0513817f, +0.484548f,0.87476f,0.00284626f, +0.413676f,0.910113f,-0.0237944f, +0.449057f,0.893501f,-0.00212143f, +0.360983f,0.928147f,-0.090746f, +0.274993f,0.958661f,0.0731286f, +0.0881261f,0.984394f,0.15232f, +0.00584658f,0.984704f,0.174138f, +-0.113749f,0.971528f,0.207834f, +-0.320112f,0.923512f,0.211313f, +-0.308899f,0.921582f,0.23509f, +-0.147069f,0.956187f,0.253135f, +-0.14137f,0.959806f,0.242461f, +-0.277438f,0.935166f,0.220209f, +-0.254545f,0.906523f,0.336782f, +-0.385464f,0.89189f,0.236535f, +-0.346902f,0.887297f,0.303913f, +-0.404152f,0.809818f,0.425271f, +-0.45263f,0.705418f,0.545446f, +-0.436346f,0.733679f,0.520882f, +-0.40606f,0.758487f,0.509719f, +-0.399991f,0.76519f,0.504471f, +-0.29927f,0.789873f,0.535292f, +-0.216265f,0.823324f,0.524754f, +-0.25441f,0.854784f,0.452349f, +-0.0876585f,0.974972f,-0.204317f, +-0.064531f,0.993199f,-0.096908f, +-0.142906f,0.98657f,-0.0790982f, +-0.190225f,0.979959f,-0.0591132f, +-0.245075f,0.966633f,-0.0745641f, +-0.286525f,0.954682f,-0.0805399f, +-0.302328f,0.953201f,0.00253574f, +-0.315251f,0.947498f,0.0535207f, +-0.363913f,0.92013f,0.144666f, +-0.433014f,0.884677f,0.172759f, +-0.39903f,0.904384f,0.151207f, +-0.340877f,0.927749f,0.15194f, +-0.34367f,0.933336f,0.103799f, +-0.371228f,0.927804f,0.0370044f, +-0.540653f,0.838686f,-0.0655789f, +-0.541683f,0.840171f,-0.0263209f, +-0.443789f,0.895468f,-0.0344719f, +-0.446175f,0.894923f,0.00646964f, +-0.489716f,0.870366f,0.0513954f, +-0.393228f,0.91623f,0.0767741f, +-0.386844f,0.914535f,0.118231f, +-0.456614f,0.881467f,0.1205f, +-0.291641f,0.939064f,0.181947f, +-0.0983466f,0.949337f,0.298474f, +-0.0663966f,0.917799f,0.391455f, +-0.225097f,0.912905f,0.340494f, +-0.270333f,0.917625f,0.291349f, +-0.0378823f,0.963845f,0.263756f, +0.203246f,0.94956f,0.238803f, +-0.00658121f,0.998329f,0.057403f, +-0.104339f,0.991332f,-0.0798442f, +0.0714998f,0.99184f,-0.105548f, +0.229254f,0.968801f,-0.0941692f, +0.162963f,0.980447f,-0.110304f, +0.144794f,0.987619f,-0.0603599f, +0.1028f,0.982727f,-0.153883f, +0.103742f,0.981824f,-0.158931f, +0.242509f,0.962807f,-0.119129f, +0.409757f,0.908112f,-0.0862081f, +0.420763f,0.899369f,-0.118717f, +0.356993f,0.920491f,-0.158908f, +0.417923f,0.902816f,-0.101306f, +0.45294f,0.886743f,-0.0923743f, +0.388277f,0.919595f,-0.0598771f, +0.442705f,0.896663f,-0.00260706f, +0.330753f,0.943188f,0.0316099f, +0.0976556f,0.983098f,0.154858f, +-0.0408134f,0.964902f,0.259421f, +-0.0353778f,0.920067f,0.39016f, +-0.0336634f,0.909873f,0.413518f, +-0.27131f,0.928078f,0.255075f, +-0.276299f,0.942343f,0.188808f, +-0.178846f,0.97249f,0.149254f, +-0.173925f,0.95192f,0.252185f, +-0.312455f,0.905292f,0.287781f, +-0.299358f,0.905887f,0.299588f, +-0.361522f,0.88183f,0.302783f, +-0.474485f,0.805519f,0.35497f, +-0.514467f,0.728892f,0.451708f, +-0.495653f,0.729457f,0.471404f, +-0.395267f,0.75904f,0.517322f, +-0.414244f,0.765988f,0.491594f, +-0.375453f,0.800102f,0.467837f, +-0.23686f,0.857078f,0.457509f, +-0.153599f,0.897001f,0.414483f, +-0.139778f,0.900978f,0.410733f, +-0.246424f,0.968956f,-0.0200009f, +-0.187575f,0.975459f,0.115309f, +-0.169324f,0.958565f,0.229092f, +-0.227196f,0.942917f,0.243495f, +-0.216356f,0.935609f,0.278972f, +-0.279085f,0.916546f,0.286453f, +-0.337088f,0.885038f,0.32106f, +-0.317388f,0.891504f,0.323242f, +-0.400555f,0.875243f,0.271117f, +-0.420396f,0.865286f,0.273034f, +-0.438864f,0.863369f,0.248983f, +-0.296161f,0.903481f,0.309855f, +-0.22181f,0.945018f,0.240296f, +-0.217483f,0.959525f,0.178924f, +-0.432196f,0.899705f,0.0611361f, +-0.592514f,0.805005f,-0.029893f, +-0.445437f,0.89528f,0.00770123f, +-0.444106f,0.895735f,-0.0207082f, +-0.441178f,0.89658f,-0.0387967f, +-0.433316f,0.896401f,-0.0932815f, +-0.448061f,0.893999f,-0.00273746f, +-0.479681f,0.876222f,0.046264f, +-0.38049f,0.918735f,0.105607f, +-0.274091f,0.928692f,0.249812f, +-0.115693f,0.919238f,0.37632f, +-0.109076f,0.943601f,0.312601f, +-0.183297f,0.969532f,0.162513f, +-0.0200265f,0.998099f,0.0582807f, +0.217564f,0.969248f,0.114995f, +0.107422f,0.986137f,0.126469f, +-0.0101958f,0.999802f,0.0170616f, +0.0917708f,0.993871f,-0.0616322f, +0.259886f,0.964354f,-0.049807f, +0.22181f,0.965636f,-0.135454f, +0.11068f,0.965795f,-0.234499f, +0.156396f,0.962982f,-0.219561f, +0.0996902f,0.954613f,-0.28067f, +0.240821f,0.930419f,-0.276271f, +0.362585f,0.892287f,-0.268992f, +0.39828f,0.905306f,-0.147629f, +0.377219f,0.92249f,-0.0819651f, +0.379471f,0.918832f,-0.108391f, +0.428571f,0.902988f,-0.0306522f, +0.390587f,0.920304f,0.0219829f, +0.365451f,0.930816f,-0.00527733f, +0.226127f,0.963781f,0.141399f, +-0.014879f,0.969939f,0.242893f, +-0.0990439f,0.938525f,0.330697f, +-0.160986f,0.911469f,0.37856f, +-0.0311141f,0.900531f,0.433676f, +-0.0818559f,0.904519f,0.418503f, +-0.202897f,0.939947f,0.274469f, +-0.199596f,0.951915f,0.232421f, +-0.290928f,0.922977f,0.251942f, +-0.30301f,0.91121f,0.279072f, +-0.315746f,0.908229f,0.274635f, +-0.386173f,0.858884f,0.336435f, +-0.56045f,0.768828f,0.307894f, +-0.529456f,0.742805f,0.409776f, +-0.545227f,0.770059f,0.331265f, +-0.460487f,0.804404f,0.375346f, +-0.384041f,0.835484f,0.393038f, +-0.366328f,0.856374f,0.363907f, +-0.227066f,0.886912f,0.40228f, +-0.162423f,0.896635f,0.411903f, +-0.18398f,0.877261f,0.443356f, +-0.33059f,0.941987f,0.0580528f, +-0.349053f,0.930827f,0.108275f, +-0.250298f,0.937413f,0.242089f, +-0.231173f,0.921233f,0.312871f, +-0.267366f,0.883285f,0.385127f, +-0.300638f,0.858727f,0.414975f, +-0.348846f,0.869854f,0.348799f, +-0.262698f,0.902187f,0.342122f, +-0.319043f,0.887638f,0.33213f, +-0.407631f,0.874264f,0.263628f, +-0.391131f,0.891388f,0.229006f, +-0.306387f,0.939971f,0.150271f, +-0.172289f,0.969062f,0.176734f, +-0.280735f,0.939942f,0.194158f, +-0.35822f,0.876748f,0.320922f, +-0.540223f,0.822439f,0.178196f, +-0.415201f,0.897062f,0.151285f, +-0.398489f,0.913332f,0.0838552f, +-0.47388f,0.879024f,0.052479f, +-0.430994f,0.889287f,0.153011f, +-0.501585f,0.850518f,0.158213f, +-0.493115f,0.843586f,0.212601f, +-0.437044f,0.869936f,0.228482f, +-0.335665f,0.928238f,0.160321f, +-0.135997f,0.987913f,0.0743886f, +0.0115105f,0.995614f,0.0928467f, +-0.0367985f,0.999249f,0.0121783f, +0.0254956f,0.996874f,-0.0747791f, +0.107382f,0.991622f,-0.0717932f, +0.144184f,0.989518f,0.00810907f, +0.0943487f,0.994079f,-0.0539027f, +0.124876f,0.987862f,-0.0923827f, +0.25534f,0.960035f,-0.114602f, +0.339105f,0.927956f,-0.154613f, +0.200588f,0.937015f,-0.285951f, +0.184172f,0.917658f,-0.352115f, +0.137125f,0.909076f,-0.393417f, +0.231522f,0.90798f,-0.349242f, +0.299652f,0.902049f,-0.310671f, +0.23061f,0.944613f,-0.233507f, +0.336481f,0.938772f,-0.0740748f, +0.38792f,0.918977f,-0.070704f, +0.337723f,0.938393f,-0.073227f, +0.392706f,0.919584f,-0.012147f, +0.294051f,0.954956f,-0.0399037f, +0.173344f,0.964432f,0.199555f, +-0.108669f,0.967119f,0.22994f, +-0.18728f,0.925976f,0.327863f, +-0.156223f,0.937505f,0.310931f, +-0.0961609f,0.948752f,0.301037f, +-0.051031f,0.914222f,0.401987f, +-0.116652f,0.921592f,0.370216f, +-0.16747f,0.919727f,0.355044f, +-0.233888f,0.917713f,0.321092f, +-0.296558f,0.924646f,0.23892f, +-0.384099f,0.898594f,0.212122f, +-0.451252f,0.843433f,0.291535f, +-0.561019f,0.766309f,0.313095f, +-0.56702f,0.761029f,0.315156f, +-0.502958f,0.815049f,0.287624f, +-0.46769f,0.845823f,0.256612f, +-0.438846f,0.860082f,0.260142f, +-0.380472f,0.841841f,0.382812f, +-0.286801f,0.84573f,0.449984f, +-0.166497f,0.837941f,0.519744f, +-0.237954f,0.844014f,0.480644f, +-0.400938f,0.907575f,0.124721f, +-0.36178f,0.91645f,0.170983f, +-0.326178f,0.936068f,0.131852f, +-0.348093f,0.925471f,0.149445f, +-0.380521f,0.903785f,0.195901f, +-0.261965f,0.932138f,0.249988f, +-0.229009f,0.957451f,0.175621f, +-0.296226f,0.953377f,0.0576446f, +-0.385007f,0.916429f,0.109216f, +-0.396898f,0.895963f,0.199304f, +-0.30002f,0.927264f,0.223985f, +-0.290512f,0.953204f,0.083697f, +-0.240862f,0.959505f,0.146069f, +-0.368638f,0.900621f,0.230189f, +-0.437205f,0.833732f,0.337256f, +-0.435531f,0.825298f,0.359438f, +-0.382764f,0.869714f,0.311593f, +-0.302351f,0.902083f,0.307944f, +-0.504704f,0.84016f,0.198507f, +-0.44412f,0.839306f,0.313565f, +-0.494888f,0.841296f,0.217503f, +-0.530329f,0.827106f,0.186138f, +-0.314084f,0.933199f,0.174614f, +-0.124034f,0.990967f,0.050983f, +-0.0452003f,0.995178f,-0.0870557f, +-0.00182424f,0.990385f,-0.138326f, +-0.0388611f,0.986686f,-0.157927f, +0.0684221f,0.991564f,-0.11009f, +0.102533f,0.981475f,-0.161848f, +0.149983f,0.975213f,-0.162681f, +0.108711f,0.963953f,-0.24285f, +0.134579f,0.963238f,-0.232511f, +0.280754f,0.932346f,-0.227832f, +0.370391f,0.907723f,-0.197103f, +0.290987f,0.936165f,-0.197286f, +0.244643f,0.947659f,-0.205165f, +0.12819f,0.972148f,-0.196204f, +0.159014f,0.967422f,-0.197002f, +0.312607f,0.930748f,-0.189697f, +0.153027f,0.941997f,-0.298704f, +0.218578f,0.950985f,-0.218748f, +0.390534f,0.915543f,-0.0962525f, +0.350134f,0.933592f,-0.0762398f, +0.369694f,0.928637f,-0.030973f, +0.182224f,0.981373f,0.0608345f, +-0.0452136f,0.980467f,0.191416f, +-0.152401f,0.95767f,0.244216f, +-0.205784f,0.951891f,0.22706f, +-0.112228f,0.971017f,0.211022f, +-0.130106f,0.967854f,0.215247f, +-0.151633f,0.958079f,0.243087f, +-0.104162f,0.953804f,0.281796f, +-0.17561f,0.947845f,0.265989f, +-0.209606f,0.941523f,0.263816f, +-0.251275f,0.930745f,0.265659f, +-0.361f,0.884718f,0.294879f, +-0.50281f,0.813876f,0.291185f, +-0.583247f,0.763934f,0.276094f, +-0.556622f,0.802134f,0.216224f, +-0.473532f,0.851987f,0.223352f, +-0.473757f,0.85285f,0.219548f, +-0.491496f,0.823107f,0.284477f, +-0.477559f,0.793154f,0.377946f, +-0.368868f,0.830921f,0.416542f, +-0.202419f,0.861608f,0.465466f, +-0.095407f,0.855544f,0.508864f, +-0.40239f,0.909528f,0.104118f, +-0.357524f,0.930915f,0.0746555f, +-0.280797f,0.959558f,0.0200349f, +-0.296463f,0.954936f,-0.0143765f, +-0.381172f,0.918388f,-0.106166f, +-0.308734f,0.946435f,-0.094572f, +-0.184864f,0.981918f,-0.0407667f, +-0.211096f,0.97426f,-0.0790985f, +-0.431269f,0.892976f,-0.128847f, +-0.508723f,0.860224f,-0.0348507f, +-0.315588f,0.942693f,0.108326f, +-0.229963f,0.954167f,0.191527f, +-0.338476f,0.90391f,0.261495f, +-0.399866f,0.843393f,0.358882f, +-0.508212f,0.817205f,0.271838f, +-0.45663f,0.829465f,0.321678f, +-0.343829f,0.869846f,0.353765f, +-0.25214f,0.908629f,0.332893f, +-0.465924f,0.864347f,0.189262f, +-0.451321f,0.885092f,0.11367f, +-0.398038f,0.913426f,0.0849568f, +-0.473433f,0.880353f,-0.0289816f, +-0.282123f,0.951018f,-0.126376f, +-0.111297f,0.983512f,-0.142537f, +-0.0203568f,0.995748f,-0.089847f, +0.0177076f,0.998505f,-0.0517153f, +-0.0210973f,0.999746f,0.00787929f, +0.0422415f,0.999104f,-0.00245387f, +0.162083f,0.986673f,-0.0143034f, +0.184873f,0.978111f,-0.0954998f, +0.225836f,0.960454f,-0.162869f, +0.105652f,0.960265f,-0.25832f, +0.22096f,0.965567f,-0.137321f, +0.306187f,0.951906f,0.0111556f, +0.252563f,0.963728f,0.0862585f, +0.185211f,0.975091f,0.122044f, +0.141716f,0.976503f,0.162355f, +0.200688f,0.976886f,0.0736112f, +0.398894f,0.916482f,0.0307355f, +0.27456f,0.96012f,-0.0527967f, +0.152825f,0.971043f,-0.183632f, +0.271211f,0.950001f,-0.154736f, +0.286301f,0.958137f,0.00244849f, +0.246502f,0.96458f,0.0939299f, +0.102065f,0.977178f,0.186298f, +-0.0761105f,0.976837f,0.19999f, +-0.0810786f,0.974651f,0.208524f, +-0.174214f,0.975155f,0.136831f, +-0.127689f,0.983595f,0.127422f, +-0.123239f,0.988203f,0.0909257f, +-0.173027f,0.984333f,0.033919f, +-0.13019f,0.985916f,0.104975f, +-0.151236f,0.977557f,0.146665f, +-0.212082f,0.972216f,0.0990861f, +-0.346196f,0.93167f,0.110181f, +-0.461867f,0.845088f,0.269268f, +-0.491314f,0.790968f,0.364663f, +-0.499721f,0.798886f,0.334753f, +-0.533877f,0.823302f,0.192741f, +-0.489959f,0.855912f,0.165393f, +-0.540105f,0.823669f,0.172786f, +-0.55174f,0.789596f,0.268553f, +-0.518837f,0.818462f,0.246838f, +-0.35793f,0.879679f,0.31313f, +-0.226645f,0.914368f,0.335505f, +-0.174062f,0.93173f,0.31872f, +-0.352372f,0.928926f,-0.113715f, +-0.283164f,0.949292f,-0.13661f, +-0.253833f,0.949289f,-0.185523f, +-0.258433f,0.953837f,-0.152994f, +-0.329686f,0.925665f,-0.185613f, +-0.360482f,0.913899f,-0.186657f, +-0.246398f,0.964945f,-0.0903879f, +-0.197613f,0.98019f,0.013309f, +-0.409684f,0.910684f,0.0530475f, +-0.545574f,0.83677f,0.0465257f, +-0.477964f,0.876264f,0.060934f, +-0.386247f,0.882258f,0.269135f, +-0.437443f,0.816448f,0.376904f, +-0.381546f,0.830459f,0.405906f, +-0.378931f,0.857772f,0.347329f, +-0.484349f,0.854204f,0.189053f, +-0.391934f,0.899277f,0.194136f, +-0.180618f,0.947297f,0.264585f, +-0.285059f,0.943094f,0.171219f, +-0.41449f,0.905591f,-0.0900102f, +-0.367364f,0.916679f,-0.157298f, +-0.4046f,0.892318f,-0.200168f, +-0.265207f,0.933534f,-0.241204f, +-0.171437f,0.970625f,-0.168809f, +-0.091648f,0.995789f,0.00231266f, +-0.0988725f,0.989781f,0.102747f, +-0.0749525f,0.978356f,0.192877f, +0.0618361f,0.988236f,0.139875f, +0.222758f,0.971067f,0.0860673f, +0.260459f,0.965435f,-0.00983276f, +0.296216f,0.954928f,-0.0191894f, +0.108089f,0.992937f,-0.0489145f, +0.0559635f,0.998425f,-0.00391097f, +0.182072f,0.980129f,0.0787236f, +0.189029f,0.972269f,0.137697f, +0.20292f,0.962368f,0.180751f, +0.162611f,0.977583f,0.133749f, +0.283117f,0.944546f,0.166365f, +0.362781f,0.917623f,0.162352f, +0.322808f,0.912852f,0.249991f, +0.306817f,0.930382f,0.200629f, +0.265368f,0.963264f,0.0412725f, +0.150516f,0.988588f,0.00624705f, +0.192187f,0.980013f,0.0513622f, +0.111093f,0.98864f,0.101236f, +-0.0652663f,0.990994f,0.116922f, +-0.0960853f,0.989279f,0.109972f, +-0.171018f,0.980514f,0.0966674f, +-0.118023f,0.981194f,0.152737f, +-0.0297124f,0.980668f,0.19341f, +-0.130364f,0.983461f,0.125733f, +-0.228583f,0.970632f,0.0749913f, +-0.187681f,0.973906f,0.127608f, +-0.18184f,0.968481f,0.170233f, +-0.382626f,0.904754f,0.187128f, +-0.565004f,0.795638f,0.218473f, +-0.54964f,0.808473f,0.210397f, +-0.494188f,0.848001f,0.191501f, +-0.42417f,0.88632f,0.185785f, +-0.490729f,0.864039f,0.112346f, +-0.547278f,0.819965f,0.167765f, +-0.555649f,0.823683f,0.113141f, +-0.525063f,0.850181f,0.0387426f, +-0.465555f,0.881687f,0.0767294f, +-0.25104f,0.948586f,0.19278f, +-0.134177f,0.968986f,0.207515f, +-0.358148f,0.879839f,-0.31243f, +-0.281248f,0.911984f,-0.298639f, +-0.261128f,0.923339f,-0.281526f, +-0.281121f,0.935581f,-0.213678f, +-0.316696f,0.928992f,-0.191515f, +-0.378661f,0.908066f,-0.178974f, +-0.357733f,0.923356f,-0.139433f, +-0.295419f,0.953886f,0.0531873f, +-0.456379f,0.869265f,0.18999f, +-0.492836f,0.836159f,0.240731f, +-0.533039f,0.832034f,0.153586f, +-0.471339f,0.822176f,0.319166f, +-0.417097f,0.817012f,0.398149f, +-0.397475f,0.860419f,0.318894f, +-0.295585f,0.889222f,0.349162f, +-0.397825f,0.896297f,0.195927f, +-0.426121f,0.903442f,0.0470364f, +-0.225108f,0.967792f,0.11272f, +-0.180332f,0.969123f,0.168172f, +-0.283694f,0.958436f,-0.0303046f, +-0.31011f,0.929142f,-0.201316f, +-0.379988f,0.880118f,-0.284609f, +-0.280631f,0.91033f,-0.304213f, +-0.299273f,0.919298f,-0.255591f, +-0.271669f,0.962178f,0.0202533f, +-0.127278f,0.946024f,0.298058f, +-0.0668081f,0.957542f,0.280447f, +0.156177f,0.962373f,0.222366f, +0.269377f,0.960799f,0.0655824f, +0.307217f,0.951527f,-0.0146071f, +0.247019f,0.968029f,-0.0436127f, +0.117286f,0.99106f,0.0635867f, +0.0498813f,0.996011f,0.0739844f, +0.194956f,0.980335f,0.0305971f, +0.139483f,0.989424f,-0.0398183f, +0.235447f,0.970519f,0.0515568f, +0.132445f,0.989845f,-0.05162f, +0.206421f,0.976844f,0.0562743f, +0.330371f,0.919083f,0.214804f, +0.266375f,0.922982f,0.277756f, +0.331232f,0.885792f,0.325049f, +0.36267f,0.895106f,0.259337f, +0.240431f,0.963714f,0.115964f, +0.171746f,0.982113f,-0.0771883f, +0.0351621f,0.99889f,-0.0313443f, +-0.0882653f,0.987488f,0.130674f, +-0.0658856f,0.986287f,0.151318f, +-0.167193f,0.982329f,0.0841182f, +-0.21476f,0.97234f,0.0918338f, +-0.104496f,0.958461f,0.265392f, +-0.0605561f,0.923444f,0.378926f, +-0.152497f,0.949101f,0.275594f, +-0.216118f,0.964594f,0.151167f, +-0.26219f,0.945639f,0.192413f, +-0.408309f,0.854572f,0.320922f, +-0.530012f,0.797788f,0.28744f, +-0.48417f,0.855541f,0.183383f, +-0.504616f,0.863257f,0.012294f, +-0.421367f,0.905956f,0.0411587f, +-0.517653f,0.855189f,0.0262018f, +-0.533316f,0.826853f,0.178574f, +-0.514944f,0.854185f,0.0721125f, +-0.506113f,0.861889f,-0.0315744f, +-0.499639f,0.865958f,-0.0218358f, +-0.302149f,0.952465f,0.038937f, +-0.129933f,0.988738f,0.0742583f, +}; + +btScalar Landscape02Tex[] = { +0.0f,0.273438f, +0.0f,0.265625f, +0.0078125f,0.273438f, +0.0078125f,0.265625f, +0.015625f,0.273438f, +0.015625f,0.265625f, +0.0234375f,0.273438f, +0.0234375f,0.265625f, +0.03125f,0.273438f, +0.03125f,0.265625f, +0.0390625f,0.273438f, +0.0390625f,0.265625f, +0.046875f,0.273438f, +0.046875f,0.265625f, +0.0546875f,0.273438f, +0.0546875f,0.265625f, +0.0625f,0.273438f, +0.0625f,0.265625f, +0.0703125f,0.273438f, +0.0703125f,0.265625f, +0.078125f,0.273438f, +0.078125f,0.265625f, +0.0859375f,0.273438f, +0.0859375f,0.265625f, +0.09375f,0.273438f, +0.09375f,0.265625f, +0.101563f,0.273438f, +0.101563f,0.265625f, +0.109375f,0.273438f, +0.109375f,0.265625f, +0.117188f,0.273438f, +0.117188f,0.265625f, +0.125f,0.273438f, +0.125f,0.265625f, +0.132813f,0.273438f, +0.132813f,0.265625f, +0.140625f,0.273438f, +0.140625f,0.265625f, +0.148438f,0.273438f, +0.148438f,0.265625f, +0.15625f,0.273438f, +0.15625f,0.265625f, +0.164063f,0.273438f, +0.164063f,0.265625f, +0.171875f,0.273438f, +0.171875f,0.265625f, +0.179688f,0.273438f, +0.179688f,0.265625f, +0.1875f,0.273438f, +0.1875f,0.265625f, +0.195313f,0.273438f, +0.195313f,0.265625f, +0.203125f,0.273438f, +0.203125f,0.265625f, +0.210938f,0.273438f, +0.210938f,0.265625f, +0.21875f,0.273438f, +0.21875f,0.265625f, +0.226563f,0.273438f, +0.226563f,0.265625f, +0.234375f,0.273438f, +0.234375f,0.265625f, +0.242188f,0.273438f, +0.242188f,0.265625f, +0.25f,0.273438f, +0.25f,0.265625f, +0.257813f,0.273438f, +0.257813f,0.265625f, +0.265625f,0.273438f, +0.265625f,0.265625f, +0.273438f,0.273438f, +0.273438f,0.265625f, +0.28125f,0.273438f, +0.28125f,0.265625f, +0.289063f,0.273438f, +0.289063f,0.265625f, +0.296875f,0.273438f, +0.296875f,0.265625f, +0.304688f,0.273438f, +0.304688f,0.265625f, +0.3125f,0.273438f, +0.3125f,0.265625f, +0.320313f,0.273438f, +0.320313f,0.265625f, +0.328125f,0.273438f, +0.328125f,0.265625f, +0.335938f,0.273438f, +0.335938f,0.265625f, +0.34375f,0.273438f, +0.34375f,0.265625f, +0.351563f,0.273438f, +0.351563f,0.265625f, +0.359375f,0.273438f, +0.359375f,0.265625f, +0.367188f,0.273438f, +0.367188f,0.265625f, +0.375f,0.273438f, +0.375f,0.265625f, +0.382813f,0.273438f, +0.382813f,0.265625f, +0.390625f,0.273438f, +0.390625f,0.265625f, +0.398438f,0.273438f, +0.398438f,0.265625f, +0.40625f,0.273438f, +0.40625f,0.265625f, +0.414063f,0.273438f, +0.414063f,0.265625f, +0.421875f,0.273438f, +0.421875f,0.265625f, +0.429688f,0.273438f, +0.429688f,0.265625f, +0.4375f,0.273438f, +0.4375f,0.265625f, +0.445313f,0.273438f, +0.445313f,0.265625f, +0.453125f,0.273438f, +0.453125f,0.265625f, +0.460938f,0.273438f, +0.460938f,0.265625f, +0.46875f,0.273438f, +0.46875f,0.265625f, +0.476563f,0.273438f, +0.476563f,0.265625f, +0.484375f,0.273438f, +0.484375f,0.265625f, +0.492188f,0.273438f, +0.492188f,0.265625f, +0.5f,0.273438f, +0.5f,0.265625f, +0.507813f,0.273438f, +0.507813f,0.265625f, +0.0f,0.28125f, +0.0078125f,0.28125f, +0.015625f,0.28125f, +0.0234375f,0.28125f, +0.03125f,0.28125f, +0.0390625f,0.28125f, +0.046875f,0.28125f, +0.0546875f,0.28125f, +0.0625f,0.28125f, +0.0703125f,0.28125f, +0.078125f,0.28125f, +0.0859375f,0.28125f, +0.09375f,0.28125f, +0.101563f,0.28125f, +0.109375f,0.28125f, +0.117188f,0.28125f, +0.125f,0.28125f, +0.132813f,0.28125f, +0.140625f,0.28125f, +0.148438f,0.28125f, +0.15625f,0.28125f, +0.164063f,0.28125f, +0.171875f,0.28125f, +0.179688f,0.28125f, +0.1875f,0.28125f, +0.195313f,0.28125f, +0.203125f,0.28125f, +0.210938f,0.28125f, +0.21875f,0.28125f, +0.226563f,0.28125f, +0.234375f,0.28125f, +0.242188f,0.28125f, +0.25f,0.28125f, +0.257813f,0.28125f, +0.265625f,0.28125f, +0.273438f,0.28125f, +0.28125f,0.28125f, +0.289063f,0.28125f, +0.296875f,0.28125f, +0.304688f,0.28125f, +0.3125f,0.28125f, +0.320313f,0.28125f, +0.328125f,0.28125f, +0.335938f,0.28125f, +0.34375f,0.28125f, +0.351563f,0.28125f, +0.359375f,0.28125f, +0.367188f,0.28125f, +0.375f,0.28125f, +0.382813f,0.28125f, +0.390625f,0.28125f, +0.398438f,0.28125f, +0.40625f,0.28125f, +0.414063f,0.28125f, +0.421875f,0.28125f, +0.429688f,0.28125f, +0.4375f,0.28125f, +0.445313f,0.28125f, +0.453125f,0.28125f, +0.460938f,0.28125f, +0.46875f,0.28125f, +0.476563f,0.28125f, +0.484375f,0.28125f, +0.492188f,0.28125f, +0.5f,0.28125f, +0.507813f,0.28125f, +0.0f,0.289063f, +0.0078125f,0.289063f, +0.015625f,0.289063f, +0.0234375f,0.289063f, +0.03125f,0.289063f, +0.0390625f,0.289063f, +0.046875f,0.289063f, +0.0546875f,0.289063f, +0.0625f,0.289063f, +0.0703125f,0.289063f, +0.078125f,0.289063f, +0.0859375f,0.289063f, +0.09375f,0.289063f, +0.101563f,0.289063f, +0.109375f,0.289063f, +0.117188f,0.289063f, +0.125f,0.289063f, +0.132813f,0.289063f, +0.140625f,0.289063f, +0.148438f,0.289063f, +0.15625f,0.289063f, +0.164063f,0.289063f, +0.171875f,0.289063f, +0.179688f,0.289063f, +0.1875f,0.289063f, +0.195313f,0.289063f, +0.203125f,0.289063f, +0.210938f,0.289063f, +0.21875f,0.289063f, +0.226563f,0.289063f, +0.234375f,0.289063f, +0.242188f,0.289063f, +0.25f,0.289063f, +0.257813f,0.289063f, +0.265625f,0.289063f, +0.273438f,0.289063f, +0.28125f,0.289063f, +0.289063f,0.289063f, +0.296875f,0.289063f, +0.304688f,0.289063f, +0.3125f,0.289063f, +0.320313f,0.289063f, +0.328125f,0.289063f, +0.335938f,0.289063f, +0.34375f,0.289063f, +0.351563f,0.289063f, +0.359375f,0.289063f, +0.367188f,0.289063f, +0.375f,0.289063f, +0.382813f,0.289063f, +0.390625f,0.289063f, +0.398438f,0.289063f, +0.40625f,0.289063f, +0.414063f,0.289063f, +0.421875f,0.289063f, +0.429688f,0.289063f, +0.4375f,0.289063f, +0.445313f,0.289063f, +0.453125f,0.289063f, +0.460938f,0.289063f, +0.46875f,0.289063f, +0.476563f,0.289063f, +0.484375f,0.289063f, +0.492188f,0.289063f, +0.5f,0.289063f, +0.507813f,0.289063f, +0.0f,0.296875f, +0.0078125f,0.296875f, +0.015625f,0.296875f, +0.0234375f,0.296875f, +0.03125f,0.296875f, +0.0390625f,0.296875f, +0.046875f,0.296875f, +0.0546875f,0.296875f, +0.0625f,0.296875f, +0.0703125f,0.296875f, +0.078125f,0.296875f, +0.0859375f,0.296875f, +0.09375f,0.296875f, +0.101563f,0.296875f, +0.109375f,0.296875f, +0.117188f,0.296875f, +0.125f,0.296875f, +0.132813f,0.296875f, +0.140625f,0.296875f, +0.148438f,0.296875f, +0.15625f,0.296875f, +0.164063f,0.296875f, +0.171875f,0.296875f, +0.179688f,0.296875f, +0.1875f,0.296875f, +0.195313f,0.296875f, +0.203125f,0.296875f, +0.210938f,0.296875f, +0.21875f,0.296875f, +0.226563f,0.296875f, +0.234375f,0.296875f, +0.242188f,0.296875f, +0.25f,0.296875f, +0.257813f,0.296875f, +0.265625f,0.296875f, +0.273438f,0.296875f, +0.28125f,0.296875f, +0.289063f,0.296875f, +0.296875f,0.296875f, +0.304688f,0.296875f, +0.3125f,0.296875f, +0.320313f,0.296875f, +0.328125f,0.296875f, +0.335938f,0.296875f, +0.34375f,0.296875f, +0.351563f,0.296875f, +0.359375f,0.296875f, +0.367188f,0.296875f, +0.375f,0.296875f, +0.382813f,0.296875f, +0.390625f,0.296875f, +0.398438f,0.296875f, +0.40625f,0.296875f, +0.414063f,0.296875f, +0.421875f,0.296875f, +0.429688f,0.296875f, +0.4375f,0.296875f, +0.445313f,0.296875f, +0.453125f,0.296875f, +0.460938f,0.296875f, +0.46875f,0.296875f, +0.476563f,0.296875f, +0.484375f,0.296875f, +0.492188f,0.296875f, +0.5f,0.296875f, +0.507813f,0.296875f, +0.0f,0.304688f, +0.0078125f,0.304688f, +0.015625f,0.304688f, +0.0234375f,0.304688f, +0.03125f,0.304688f, +0.0390625f,0.304688f, +0.046875f,0.304688f, +0.0546875f,0.304688f, +0.0625f,0.304688f, +0.0703125f,0.304688f, +0.078125f,0.304688f, +0.0859375f,0.304688f, +0.09375f,0.304688f, +0.101563f,0.304688f, +0.109375f,0.304688f, +0.117188f,0.304688f, +0.125f,0.304688f, +0.132813f,0.304688f, +0.140625f,0.304688f, +0.148438f,0.304688f, +0.15625f,0.304688f, +0.164063f,0.304688f, +0.171875f,0.304688f, +0.179688f,0.304688f, +0.1875f,0.304688f, +0.195313f,0.304688f, +0.203125f,0.304688f, +0.210938f,0.304688f, +0.21875f,0.304688f, +0.226563f,0.304688f, +0.234375f,0.304688f, +0.242188f,0.304688f, +0.25f,0.304688f, +0.257813f,0.304688f, +0.265625f,0.304688f, +0.273438f,0.304688f, +0.28125f,0.304688f, +0.289063f,0.304688f, +0.296875f,0.304688f, +0.304688f,0.304688f, +0.3125f,0.304688f, +0.320313f,0.304688f, +0.328125f,0.304688f, +0.335938f,0.304688f, +0.34375f,0.304688f, +0.351563f,0.304688f, +0.359375f,0.304688f, +0.367188f,0.304688f, +0.375f,0.304688f, +0.382813f,0.304688f, +0.390625f,0.304688f, +0.398438f,0.304688f, +0.40625f,0.304688f, +0.414063f,0.304688f, +0.421875f,0.304688f, +0.429688f,0.304688f, +0.4375f,0.304688f, +0.445313f,0.304688f, +0.453125f,0.304688f, +0.460938f,0.304688f, +0.46875f,0.304688f, +0.476563f,0.304688f, +0.484375f,0.304688f, +0.492188f,0.304688f, +0.5f,0.304688f, +0.507813f,0.304688f, +0.0f,0.3125f, +0.0078125f,0.3125f, +0.015625f,0.3125f, +0.0234375f,0.3125f, +0.03125f,0.3125f, +0.0390625f,0.3125f, +0.046875f,0.3125f, +0.0546875f,0.3125f, +0.0625f,0.3125f, +0.0703125f,0.3125f, +0.078125f,0.3125f, +0.0859375f,0.3125f, +0.09375f,0.3125f, +0.101563f,0.3125f, +0.109375f,0.3125f, +0.117188f,0.3125f, +0.125f,0.3125f, +0.132813f,0.3125f, +0.140625f,0.3125f, +0.148438f,0.3125f, +0.15625f,0.3125f, +0.164063f,0.3125f, +0.171875f,0.3125f, +0.179688f,0.3125f, +0.1875f,0.3125f, +0.195313f,0.3125f, +0.203125f,0.3125f, +0.210938f,0.3125f, +0.21875f,0.3125f, +0.226563f,0.3125f, +0.234375f,0.3125f, +0.242188f,0.3125f, +0.25f,0.3125f, +0.257813f,0.3125f, +0.265625f,0.3125f, +0.273438f,0.3125f, +0.28125f,0.3125f, +0.289063f,0.3125f, +0.296875f,0.3125f, +0.304688f,0.3125f, +0.3125f,0.3125f, +0.320313f,0.3125f, +0.328125f,0.3125f, +0.335938f,0.3125f, +0.34375f,0.3125f, +0.351563f,0.3125f, +0.359375f,0.3125f, +0.367188f,0.3125f, +0.375f,0.3125f, +0.382813f,0.3125f, +0.390625f,0.3125f, +0.398438f,0.3125f, +0.40625f,0.3125f, +0.414063f,0.3125f, +0.421875f,0.3125f, +0.429688f,0.3125f, +0.4375f,0.3125f, +0.445313f,0.3125f, +0.453125f,0.3125f, +0.460938f,0.3125f, +0.46875f,0.3125f, +0.476563f,0.3125f, +0.484375f,0.3125f, +0.492188f,0.3125f, +0.5f,0.3125f, +0.507813f,0.3125f, +0.0f,0.320313f, +0.0078125f,0.320313f, +0.015625f,0.320313f, +0.0234375f,0.320313f, +0.03125f,0.320313f, +0.0390625f,0.320313f, +0.046875f,0.320313f, +0.0546875f,0.320313f, +0.0625f,0.320313f, +0.0703125f,0.320313f, +0.078125f,0.320313f, +0.0859375f,0.320313f, +0.09375f,0.320313f, +0.101563f,0.320313f, +0.109375f,0.320313f, +0.117188f,0.320313f, +0.125f,0.320313f, +0.132813f,0.320313f, +0.140625f,0.320313f, +0.148438f,0.320313f, +0.15625f,0.320313f, +0.164063f,0.320313f, +0.171875f,0.320313f, +0.179688f,0.320313f, +0.1875f,0.320313f, +0.195313f,0.320313f, +0.203125f,0.320313f, +0.210938f,0.320313f, +0.21875f,0.320313f, +0.226563f,0.320313f, +0.234375f,0.320313f, +0.242188f,0.320313f, +0.25f,0.320313f, +0.257813f,0.320313f, +0.265625f,0.320313f, +0.273438f,0.320313f, +0.28125f,0.320313f, +0.289063f,0.320313f, +0.296875f,0.320313f, +0.304688f,0.320313f, +0.3125f,0.320313f, +0.320313f,0.320313f, +0.328125f,0.320313f, +0.335938f,0.320313f, +0.34375f,0.320313f, +0.351563f,0.320313f, +0.359375f,0.320313f, +0.367188f,0.320313f, +0.375f,0.320313f, +0.382813f,0.320313f, +0.390625f,0.320313f, +0.398438f,0.320313f, +0.40625f,0.320313f, +0.414063f,0.320313f, +0.421875f,0.320313f, +0.429688f,0.320313f, +0.4375f,0.320313f, +0.445313f,0.320313f, +0.453125f,0.320313f, +0.460938f,0.320313f, +0.46875f,0.320313f, +0.476563f,0.320313f, +0.484375f,0.320313f, +0.492188f,0.320313f, +0.5f,0.320313f, +0.507813f,0.320313f, +0.0f,0.328125f, +0.0078125f,0.328125f, +0.015625f,0.328125f, +0.0234375f,0.328125f, +0.03125f,0.328125f, +0.0390625f,0.328125f, +0.046875f,0.328125f, +0.0546875f,0.328125f, +0.0625f,0.328125f, +0.0703125f,0.328125f, +0.078125f,0.328125f, +0.0859375f,0.328125f, +0.09375f,0.328125f, +0.101563f,0.328125f, +0.109375f,0.328125f, +0.117188f,0.328125f, +0.125f,0.328125f, +0.132813f,0.328125f, +0.140625f,0.328125f, +0.148438f,0.328125f, +0.15625f,0.328125f, +0.164063f,0.328125f, +0.171875f,0.328125f, +0.179688f,0.328125f, +0.1875f,0.328125f, +0.195313f,0.328125f, +0.203125f,0.328125f, +0.210938f,0.328125f, +0.21875f,0.328125f, +0.226563f,0.328125f, +0.234375f,0.328125f, +0.242188f,0.328125f, +0.25f,0.328125f, +0.257813f,0.328125f, +0.265625f,0.328125f, +0.273438f,0.328125f, +0.28125f,0.328125f, +0.289063f,0.328125f, +0.296875f,0.328125f, +0.304688f,0.328125f, +0.3125f,0.328125f, +0.320313f,0.328125f, +0.328125f,0.328125f, +0.335938f,0.328125f, +0.34375f,0.328125f, +0.351563f,0.328125f, +0.359375f,0.328125f, +0.367188f,0.328125f, +0.375f,0.328125f, +0.382813f,0.328125f, +0.390625f,0.328125f, +0.398438f,0.328125f, +0.40625f,0.328125f, +0.414063f,0.328125f, +0.421875f,0.328125f, +0.429688f,0.328125f, +0.4375f,0.328125f, +0.445313f,0.328125f, +0.453125f,0.328125f, +0.460938f,0.328125f, +0.46875f,0.328125f, +0.476563f,0.328125f, +0.484375f,0.328125f, +0.492188f,0.328125f, +0.5f,0.328125f, +0.507813f,0.328125f, +0.0f,0.335938f, +0.0078125f,0.335938f, +0.015625f,0.335938f, +0.0234375f,0.335938f, +0.03125f,0.335938f, +0.0390625f,0.335938f, +0.046875f,0.335938f, +0.0546875f,0.335938f, +0.0625f,0.335938f, +0.0703125f,0.335938f, +0.078125f,0.335938f, +0.0859375f,0.335938f, +0.09375f,0.335938f, +0.101563f,0.335938f, +0.109375f,0.335938f, +0.117188f,0.335938f, +0.125f,0.335938f, +0.132813f,0.335938f, +0.140625f,0.335938f, +0.148438f,0.335938f, +0.15625f,0.335938f, +0.164063f,0.335938f, +0.171875f,0.335938f, +0.179688f,0.335938f, +0.1875f,0.335938f, +0.195313f,0.335938f, +0.203125f,0.335938f, +0.210938f,0.335938f, +0.21875f,0.335938f, +0.226563f,0.335938f, +0.234375f,0.335938f, +0.242188f,0.335938f, +0.25f,0.335938f, +0.257813f,0.335938f, +0.265625f,0.335938f, +0.273438f,0.335938f, +0.28125f,0.335938f, +0.289063f,0.335938f, +0.296875f,0.335938f, +0.304688f,0.335938f, +0.3125f,0.335938f, +0.320313f,0.335938f, +0.328125f,0.335938f, +0.335938f,0.335938f, +0.34375f,0.335938f, +0.351563f,0.335938f, +0.359375f,0.335938f, +0.367188f,0.335938f, +0.375f,0.335938f, +0.382813f,0.335938f, +0.390625f,0.335938f, +0.398438f,0.335938f, +0.40625f,0.335938f, +0.414063f,0.335938f, +0.421875f,0.335938f, +0.429688f,0.335938f, +0.4375f,0.335938f, +0.445313f,0.335938f, +0.453125f,0.335938f, +0.460938f,0.335938f, +0.46875f,0.335938f, +0.476563f,0.335938f, +0.484375f,0.335938f, +0.492188f,0.335938f, +0.5f,0.335938f, +0.507813f,0.335938f, +0.0f,0.34375f, +0.0078125f,0.34375f, +0.015625f,0.34375f, +0.0234375f,0.34375f, +0.03125f,0.34375f, +0.0390625f,0.34375f, +0.046875f,0.34375f, +0.0546875f,0.34375f, +0.0625f,0.34375f, +0.0703125f,0.34375f, +0.078125f,0.34375f, +0.0859375f,0.34375f, +0.09375f,0.34375f, +0.101563f,0.34375f, +0.109375f,0.34375f, +0.117188f,0.34375f, +0.125f,0.34375f, +0.132813f,0.34375f, +0.140625f,0.34375f, +0.148438f,0.34375f, +0.15625f,0.34375f, +0.164063f,0.34375f, +0.171875f,0.34375f, +0.179688f,0.34375f, +0.1875f,0.34375f, +0.195313f,0.34375f, +0.203125f,0.34375f, +0.210938f,0.34375f, +0.21875f,0.34375f, +0.226563f,0.34375f, +0.234375f,0.34375f, +0.242188f,0.34375f, +0.25f,0.34375f, +0.257813f,0.34375f, +0.265625f,0.34375f, +0.273438f,0.34375f, +0.28125f,0.34375f, +0.289063f,0.34375f, +0.296875f,0.34375f, +0.304688f,0.34375f, +0.3125f,0.34375f, +0.320313f,0.34375f, +0.328125f,0.34375f, +0.335938f,0.34375f, +0.34375f,0.34375f, +0.351563f,0.34375f, +0.359375f,0.34375f, +0.367188f,0.34375f, +0.375f,0.34375f, +0.382813f,0.34375f, +0.390625f,0.34375f, +0.398438f,0.34375f, +0.40625f,0.34375f, +0.414063f,0.34375f, +0.421875f,0.34375f, +0.429688f,0.34375f, +0.4375f,0.34375f, +0.445313f,0.34375f, +0.453125f,0.34375f, +0.460938f,0.34375f, +0.46875f,0.34375f, +0.476563f,0.34375f, +0.484375f,0.34375f, +0.492188f,0.34375f, +0.5f,0.34375f, +0.507813f,0.34375f, +0.0f,0.351563f, +0.0078125f,0.351563f, +0.015625f,0.351563f, +0.0234375f,0.351563f, +0.03125f,0.351563f, +0.0390625f,0.351563f, +0.046875f,0.351563f, +0.0546875f,0.351563f, +0.0625f,0.351563f, +0.0703125f,0.351563f, +0.078125f,0.351563f, +0.0859375f,0.351563f, +0.09375f,0.351563f, +0.101563f,0.351563f, +0.109375f,0.351563f, +0.117188f,0.351563f, +0.125f,0.351563f, +0.132813f,0.351563f, +0.140625f,0.351563f, +0.148438f,0.351563f, +0.15625f,0.351563f, +0.164063f,0.351563f, +0.171875f,0.351563f, +0.179688f,0.351563f, +0.1875f,0.351563f, +0.195313f,0.351563f, +0.203125f,0.351563f, +0.210938f,0.351563f, +0.21875f,0.351563f, +0.226563f,0.351563f, +0.234375f,0.351563f, +0.242188f,0.351563f, +0.25f,0.351563f, +0.257813f,0.351563f, +0.265625f,0.351563f, +0.273438f,0.351563f, +0.28125f,0.351563f, +0.289063f,0.351563f, +0.296875f,0.351563f, +0.304688f,0.351563f, +0.3125f,0.351563f, +0.320313f,0.351563f, +0.328125f,0.351563f, +0.335938f,0.351563f, +0.34375f,0.351563f, +0.351563f,0.351563f, +0.359375f,0.351563f, +0.367188f,0.351563f, +0.375f,0.351563f, +0.382813f,0.351563f, +0.390625f,0.351563f, +0.398438f,0.351563f, +0.40625f,0.351563f, +0.414063f,0.351563f, +0.421875f,0.351563f, +0.429688f,0.351563f, +0.4375f,0.351563f, +0.445313f,0.351563f, +0.453125f,0.351563f, +0.460938f,0.351563f, +0.46875f,0.351563f, +0.476563f,0.351563f, +0.484375f,0.351563f, +0.492188f,0.351563f, +0.5f,0.351563f, +0.507813f,0.351563f, +0.0f,0.359375f, +0.0078125f,0.359375f, +0.015625f,0.359375f, +0.0234375f,0.359375f, +0.03125f,0.359375f, +0.0390625f,0.359375f, +0.046875f,0.359375f, +0.0546875f,0.359375f, +0.0625f,0.359375f, +0.0703125f,0.359375f, +0.078125f,0.359375f, +0.0859375f,0.359375f, +0.09375f,0.359375f, +0.101563f,0.359375f, +0.109375f,0.359375f, +0.117188f,0.359375f, +0.125f,0.359375f, +0.132813f,0.359375f, +0.140625f,0.359375f, +0.148438f,0.359375f, +0.15625f,0.359375f, +0.164063f,0.359375f, +0.171875f,0.359375f, +0.179688f,0.359375f, +0.1875f,0.359375f, +0.195313f,0.359375f, +0.203125f,0.359375f, +0.210938f,0.359375f, +0.21875f,0.359375f, +0.226563f,0.359375f, +0.234375f,0.359375f, +0.242188f,0.359375f, +0.25f,0.359375f, +0.257813f,0.359375f, +0.265625f,0.359375f, +0.273438f,0.359375f, +0.28125f,0.359375f, +0.289063f,0.359375f, +0.296875f,0.359375f, +0.304688f,0.359375f, +0.3125f,0.359375f, +0.320313f,0.359375f, +0.328125f,0.359375f, +0.335938f,0.359375f, +0.34375f,0.359375f, +0.351563f,0.359375f, +0.359375f,0.359375f, +0.367188f,0.359375f, +0.375f,0.359375f, +0.382813f,0.359375f, +0.390625f,0.359375f, +0.398438f,0.359375f, +0.40625f,0.359375f, +0.414063f,0.359375f, +0.421875f,0.359375f, +0.429688f,0.359375f, +0.4375f,0.359375f, +0.445313f,0.359375f, +0.453125f,0.359375f, +0.460938f,0.359375f, +0.46875f,0.359375f, +0.476563f,0.359375f, +0.484375f,0.359375f, +0.492188f,0.359375f, +0.5f,0.359375f, +0.507813f,0.359375f, +0.0f,0.367188f, +0.0078125f,0.367188f, +0.015625f,0.367188f, +0.0234375f,0.367188f, +0.03125f,0.367188f, +0.0390625f,0.367188f, +0.046875f,0.367188f, +0.0546875f,0.367188f, +0.0625f,0.367188f, +0.0703125f,0.367188f, +0.078125f,0.367188f, +0.0859375f,0.367188f, +0.09375f,0.367188f, +0.101563f,0.367188f, +0.109375f,0.367188f, +0.117188f,0.367188f, +0.125f,0.367188f, +0.132813f,0.367188f, +0.140625f,0.367188f, +0.148438f,0.367188f, +0.15625f,0.367188f, +0.164063f,0.367188f, +0.171875f,0.367188f, +0.179688f,0.367188f, +0.1875f,0.367188f, +0.195313f,0.367188f, +0.203125f,0.367188f, +0.210938f,0.367188f, +0.21875f,0.367188f, +0.226563f,0.367188f, +0.234375f,0.367188f, +0.242188f,0.367188f, +0.25f,0.367188f, +0.257813f,0.367188f, +0.265625f,0.367188f, +0.273438f,0.367188f, +0.28125f,0.367188f, +0.289063f,0.367188f, +0.296875f,0.367188f, +0.304688f,0.367188f, +0.3125f,0.367188f, +0.320313f,0.367188f, +0.328125f,0.367188f, +0.335938f,0.367188f, +0.34375f,0.367188f, +0.351563f,0.367188f, +0.359375f,0.367188f, +0.367188f,0.367188f, +0.375f,0.367188f, +0.382813f,0.367188f, +0.390625f,0.367188f, +0.398438f,0.367188f, +0.40625f,0.367188f, +0.414063f,0.367188f, +0.421875f,0.367188f, +0.429688f,0.367188f, +0.4375f,0.367188f, +0.445313f,0.367188f, +0.453125f,0.367188f, +0.460938f,0.367188f, +0.46875f,0.367188f, +0.476563f,0.367188f, +0.484375f,0.367188f, +0.492188f,0.367188f, +0.5f,0.367188f, +0.507813f,0.367188f, +0.0f,0.375f, +0.0078125f,0.375f, +0.015625f,0.375f, +0.0234375f,0.375f, +0.03125f,0.375f, +0.0390625f,0.375f, +0.046875f,0.375f, +0.0546875f,0.375f, +0.0625f,0.375f, +0.0703125f,0.375f, +0.078125f,0.375f, +0.0859375f,0.375f, +0.09375f,0.375f, +0.101563f,0.375f, +0.109375f,0.375f, +0.117188f,0.375f, +0.125f,0.375f, +0.132813f,0.375f, +0.140625f,0.375f, +0.148438f,0.375f, +0.15625f,0.375f, +0.164063f,0.375f, +0.171875f,0.375f, +0.179688f,0.375f, +0.1875f,0.375f, +0.195313f,0.375f, +0.203125f,0.375f, +0.210938f,0.375f, +0.21875f,0.375f, +0.226563f,0.375f, +0.234375f,0.375f, +0.242188f,0.375f, +0.25f,0.375f, +0.257813f,0.375f, +0.265625f,0.375f, +0.273438f,0.375f, +0.28125f,0.375f, +0.289063f,0.375f, +0.296875f,0.375f, +0.304688f,0.375f, +0.3125f,0.375f, +0.320313f,0.375f, +0.328125f,0.375f, +0.335938f,0.375f, +0.34375f,0.375f, +0.351563f,0.375f, +0.359375f,0.375f, +0.367188f,0.375f, +0.375f,0.375f, +0.382813f,0.375f, +0.390625f,0.375f, +0.398438f,0.375f, +0.40625f,0.375f, +0.414063f,0.375f, +0.421875f,0.375f, +0.429688f,0.375f, +0.4375f,0.375f, +0.445313f,0.375f, +0.453125f,0.375f, +0.460938f,0.375f, +0.46875f,0.375f, +0.476563f,0.375f, +0.484375f,0.375f, +0.492188f,0.375f, +0.5f,0.375f, +0.507813f,0.375f, +0.0f,0.382813f, +0.0078125f,0.382813f, +0.015625f,0.382813f, +0.0234375f,0.382813f, +0.03125f,0.382813f, +0.0390625f,0.382813f, +0.046875f,0.382813f, +0.0546875f,0.382813f, +0.0625f,0.382813f, +0.0703125f,0.382813f, +0.078125f,0.382813f, +0.0859375f,0.382813f, +0.09375f,0.382813f, +0.101563f,0.382813f, +0.109375f,0.382813f, +0.117188f,0.382813f, +0.125f,0.382813f, +0.132813f,0.382813f, +0.140625f,0.382813f, +0.148438f,0.382813f, +0.15625f,0.382813f, +0.164063f,0.382813f, +0.171875f,0.382813f, +0.179688f,0.382813f, +0.1875f,0.382813f, +0.195313f,0.382813f, +0.203125f,0.382813f, +0.210938f,0.382813f, +0.21875f,0.382813f, +0.226563f,0.382813f, +0.234375f,0.382813f, +0.242188f,0.382813f, +0.25f,0.382813f, +0.257813f,0.382813f, +0.265625f,0.382813f, +0.273438f,0.382813f, +0.28125f,0.382813f, +0.289063f,0.382813f, +0.296875f,0.382813f, +0.304688f,0.382813f, +0.3125f,0.382813f, +0.320313f,0.382813f, +0.328125f,0.382813f, +0.335938f,0.382813f, +0.34375f,0.382813f, +0.351563f,0.382813f, +0.359375f,0.382813f, +0.367188f,0.382813f, +0.375f,0.382813f, +0.382813f,0.382813f, +0.390625f,0.382813f, +0.398438f,0.382813f, +0.40625f,0.382813f, +0.414063f,0.382813f, +0.421875f,0.382813f, +0.429688f,0.382813f, +0.4375f,0.382813f, +0.445313f,0.382813f, +0.453125f,0.382813f, +0.460938f,0.382813f, +0.46875f,0.382813f, +0.476563f,0.382813f, +0.484375f,0.382813f, +0.492188f,0.382813f, +0.5f,0.382813f, +0.507813f,0.382813f, +0.0f,0.390625f, +0.0078125f,0.390625f, +0.015625f,0.390625f, +0.0234375f,0.390625f, +0.03125f,0.390625f, +0.0390625f,0.390625f, +0.046875f,0.390625f, +0.0546875f,0.390625f, +0.0625f,0.390625f, +0.0703125f,0.390625f, +0.078125f,0.390625f, +0.0859375f,0.390625f, +0.09375f,0.390625f, +0.101563f,0.390625f, +0.109375f,0.390625f, +0.117188f,0.390625f, +0.125f,0.390625f, +0.132813f,0.390625f, +0.140625f,0.390625f, +0.148438f,0.390625f, +0.15625f,0.390625f, +0.164063f,0.390625f, +0.171875f,0.390625f, +0.179688f,0.390625f, +0.1875f,0.390625f, +0.195313f,0.390625f, +0.203125f,0.390625f, +0.210938f,0.390625f, +0.21875f,0.390625f, +0.226563f,0.390625f, +0.234375f,0.390625f, +0.242188f,0.390625f, +0.25f,0.390625f, +0.257813f,0.390625f, +0.265625f,0.390625f, +0.273438f,0.390625f, +0.28125f,0.390625f, +0.289063f,0.390625f, +0.296875f,0.390625f, +0.304688f,0.390625f, +0.3125f,0.390625f, +0.320313f,0.390625f, +0.328125f,0.390625f, +0.335938f,0.390625f, +0.34375f,0.390625f, +0.351563f,0.390625f, +0.359375f,0.390625f, +0.367188f,0.390625f, +0.375f,0.390625f, +0.382813f,0.390625f, +0.390625f,0.390625f, +0.398438f,0.390625f, +0.40625f,0.390625f, +0.414063f,0.390625f, +0.421875f,0.390625f, +0.429688f,0.390625f, +0.4375f,0.390625f, +0.445313f,0.390625f, +0.453125f,0.390625f, +0.460938f,0.390625f, +0.46875f,0.390625f, +0.476563f,0.390625f, +0.484375f,0.390625f, +0.492188f,0.390625f, +0.5f,0.390625f, +0.507813f,0.390625f, +0.0f,0.398438f, +0.0078125f,0.398438f, +0.015625f,0.398438f, +0.0234375f,0.398438f, +0.03125f,0.398438f, +0.0390625f,0.398438f, +0.046875f,0.398438f, +0.0546875f,0.398438f, +0.0625f,0.398438f, +0.0703125f,0.398438f, +0.078125f,0.398438f, +0.0859375f,0.398438f, +0.09375f,0.398438f, +0.101563f,0.398438f, +0.109375f,0.398438f, +0.117188f,0.398438f, +0.125f,0.398438f, +0.132813f,0.398438f, +0.140625f,0.398438f, +0.148438f,0.398438f, +0.15625f,0.398438f, +0.164063f,0.398438f, +0.171875f,0.398438f, +0.179688f,0.398438f, +0.1875f,0.398438f, +0.195313f,0.398438f, +0.203125f,0.398438f, +0.210938f,0.398438f, +0.21875f,0.398438f, +0.226563f,0.398438f, +0.234375f,0.398438f, +0.242188f,0.398438f, +0.25f,0.398438f, +0.257813f,0.398438f, +0.265625f,0.398438f, +0.273438f,0.398438f, +0.28125f,0.398438f, +0.289063f,0.398438f, +0.296875f,0.398438f, +0.304688f,0.398438f, +0.3125f,0.398438f, +0.320313f,0.398438f, +0.328125f,0.398438f, +0.335938f,0.398438f, +0.34375f,0.398438f, +0.351563f,0.398438f, +0.359375f,0.398438f, +0.367188f,0.398438f, +0.375f,0.398438f, +0.382813f,0.398438f, +0.390625f,0.398438f, +0.398438f,0.398438f, +0.40625f,0.398438f, +0.414063f,0.398438f, +0.421875f,0.398438f, +0.429688f,0.398438f, +0.4375f,0.398438f, +0.445313f,0.398438f, +0.453125f,0.398438f, +0.460938f,0.398438f, +0.46875f,0.398438f, +0.476563f,0.398438f, +0.484375f,0.398438f, +0.492188f,0.398438f, +0.5f,0.398438f, +0.507813f,0.398438f, +0.0f,0.40625f, +0.0078125f,0.40625f, +0.015625f,0.40625f, +0.0234375f,0.40625f, +0.03125f,0.40625f, +0.0390625f,0.40625f, +0.046875f,0.40625f, +0.0546875f,0.40625f, +0.0625f,0.40625f, +0.0703125f,0.40625f, +0.078125f,0.40625f, +0.0859375f,0.40625f, +0.09375f,0.40625f, +0.101563f,0.40625f, +0.109375f,0.40625f, +0.117188f,0.40625f, +0.125f,0.40625f, +0.132813f,0.40625f, +0.140625f,0.40625f, +0.148438f,0.40625f, +0.15625f,0.40625f, +0.164063f,0.40625f, +0.171875f,0.40625f, +0.179688f,0.40625f, +0.1875f,0.40625f, +0.195313f,0.40625f, +0.203125f,0.40625f, +0.210938f,0.40625f, +0.21875f,0.40625f, +0.226563f,0.40625f, +0.234375f,0.40625f, +0.242188f,0.40625f, +0.25f,0.40625f, +0.257813f,0.40625f, +0.265625f,0.40625f, +0.273438f,0.40625f, +0.28125f,0.40625f, +0.289063f,0.40625f, +0.296875f,0.40625f, +0.304688f,0.40625f, +0.3125f,0.40625f, +0.320313f,0.40625f, +0.328125f,0.40625f, +0.335938f,0.40625f, +0.34375f,0.40625f, +0.351563f,0.40625f, +0.359375f,0.40625f, +0.367188f,0.40625f, +0.375f,0.40625f, +0.382813f,0.40625f, +0.390625f,0.40625f, +0.398438f,0.40625f, +0.40625f,0.40625f, +0.414063f,0.40625f, +0.421875f,0.40625f, +0.429688f,0.40625f, +0.4375f,0.40625f, +0.445313f,0.40625f, +0.453125f,0.40625f, +0.460938f,0.40625f, +0.46875f,0.40625f, +0.476563f,0.40625f, +0.484375f,0.40625f, +0.492188f,0.40625f, +0.5f,0.40625f, +0.507813f,0.40625f, +0.0f,0.414063f, +0.0078125f,0.414063f, +0.015625f,0.414063f, +0.0234375f,0.414063f, +0.03125f,0.414063f, +0.0390625f,0.414063f, +0.046875f,0.414063f, +0.0546875f,0.414063f, +0.0625f,0.414063f, +0.0703125f,0.414063f, +0.078125f,0.414063f, +0.0859375f,0.414063f, +0.09375f,0.414063f, +0.101563f,0.414063f, +0.109375f,0.414063f, +0.117188f,0.414063f, +0.125f,0.414063f, +0.132813f,0.414063f, +0.140625f,0.414063f, +0.148438f,0.414063f, +0.15625f,0.414063f, +0.164063f,0.414063f, +0.171875f,0.414063f, +0.179688f,0.414063f, +0.1875f,0.414063f, +0.195313f,0.414063f, +0.203125f,0.414063f, +0.210938f,0.414063f, +0.21875f,0.414063f, +0.226563f,0.414063f, +0.234375f,0.414063f, +0.242188f,0.414063f, +0.25f,0.414063f, +0.257813f,0.414063f, +0.265625f,0.414063f, +0.273438f,0.414063f, +0.28125f,0.414063f, +0.289063f,0.414063f, +0.296875f,0.414063f, +0.304688f,0.414063f, +0.3125f,0.414063f, +0.320313f,0.414063f, +0.328125f,0.414063f, +0.335938f,0.414063f, +0.34375f,0.414063f, +0.351563f,0.414063f, +0.359375f,0.414063f, +0.367188f,0.414063f, +0.375f,0.414063f, +0.382813f,0.414063f, +0.390625f,0.414063f, +0.398438f,0.414063f, +0.40625f,0.414063f, +0.414063f,0.414063f, +0.421875f,0.414063f, +0.429688f,0.414063f, +0.4375f,0.414063f, +0.445313f,0.414063f, +0.453125f,0.414063f, +0.460938f,0.414063f, +0.46875f,0.414063f, +0.476563f,0.414063f, +0.484375f,0.414063f, +0.492188f,0.414063f, +0.5f,0.414063f, +0.507813f,0.414063f, +0.0f,0.421875f, +0.0078125f,0.421875f, +0.015625f,0.421875f, +0.0234375f,0.421875f, +0.03125f,0.421875f, +0.0390625f,0.421875f, +0.046875f,0.421875f, +0.0546875f,0.421875f, +0.0625f,0.421875f, +0.0703125f,0.421875f, +0.078125f,0.421875f, +0.0859375f,0.421875f, +0.09375f,0.421875f, +0.101563f,0.421875f, +0.109375f,0.421875f, +0.117188f,0.421875f, +0.125f,0.421875f, +0.132813f,0.421875f, +0.140625f,0.421875f, +0.148438f,0.421875f, +0.15625f,0.421875f, +0.164063f,0.421875f, +0.171875f,0.421875f, +0.179688f,0.421875f, +0.1875f,0.421875f, +0.195313f,0.421875f, +0.203125f,0.421875f, +0.210938f,0.421875f, +0.21875f,0.421875f, +0.226563f,0.421875f, +0.234375f,0.421875f, +0.242188f,0.421875f, +0.25f,0.421875f, +0.257813f,0.421875f, +0.265625f,0.421875f, +0.273438f,0.421875f, +0.28125f,0.421875f, +0.289063f,0.421875f, +0.296875f,0.421875f, +0.304688f,0.421875f, +0.3125f,0.421875f, +0.320313f,0.421875f, +0.328125f,0.421875f, +0.335938f,0.421875f, +0.34375f,0.421875f, +0.351563f,0.421875f, +0.359375f,0.421875f, +0.367188f,0.421875f, +0.375f,0.421875f, +0.382813f,0.421875f, +0.390625f,0.421875f, +0.398438f,0.421875f, +0.40625f,0.421875f, +0.414063f,0.421875f, +0.421875f,0.421875f, +0.429688f,0.421875f, +0.4375f,0.421875f, +0.445313f,0.421875f, +0.453125f,0.421875f, +0.460938f,0.421875f, +0.46875f,0.421875f, +0.476563f,0.421875f, +0.484375f,0.421875f, +0.492188f,0.421875f, +0.5f,0.421875f, +0.507813f,0.421875f, +0.0f,0.429688f, +0.0078125f,0.429688f, +0.015625f,0.429688f, +0.0234375f,0.429688f, +0.03125f,0.429688f, +0.0390625f,0.429688f, +0.046875f,0.429688f, +0.0546875f,0.429688f, +0.0625f,0.429688f, +0.0703125f,0.429688f, +0.078125f,0.429688f, +0.0859375f,0.429688f, +0.09375f,0.429688f, +0.101563f,0.429688f, +0.109375f,0.429688f, +0.117188f,0.429688f, +0.125f,0.429688f, +0.132813f,0.429688f, +0.140625f,0.429688f, +0.148438f,0.429688f, +0.15625f,0.429688f, +0.164063f,0.429688f, +0.171875f,0.429688f, +0.179688f,0.429688f, +0.1875f,0.429688f, +0.195313f,0.429688f, +0.203125f,0.429688f, +0.210938f,0.429688f, +0.21875f,0.429688f, +0.226563f,0.429688f, +0.234375f,0.429688f, +0.242188f,0.429688f, +0.25f,0.429688f, +0.257813f,0.429688f, +0.265625f,0.429688f, +0.273438f,0.429688f, +0.28125f,0.429688f, +0.289063f,0.429688f, +0.296875f,0.429688f, +0.304688f,0.429688f, +0.3125f,0.429688f, +0.320313f,0.429688f, +0.328125f,0.429688f, +0.335938f,0.429688f, +0.34375f,0.429688f, +0.351563f,0.429688f, +0.359375f,0.429688f, +0.367188f,0.429688f, +0.375f,0.429688f, +0.382813f,0.429688f, +0.390625f,0.429688f, +0.398438f,0.429688f, +0.40625f,0.429688f, +0.414063f,0.429688f, +0.421875f,0.429688f, +0.429688f,0.429688f, +0.4375f,0.429688f, +0.445313f,0.429688f, +0.453125f,0.429688f, +0.460938f,0.429688f, +0.46875f,0.429688f, +0.476563f,0.429688f, +0.484375f,0.429688f, +0.492188f,0.429688f, +0.5f,0.429688f, +0.507813f,0.429688f, +0.0f,0.4375f, +0.0078125f,0.4375f, +0.015625f,0.4375f, +0.0234375f,0.4375f, +0.03125f,0.4375f, +0.0390625f,0.4375f, +0.046875f,0.4375f, +0.0546875f,0.4375f, +0.0625f,0.4375f, +0.0703125f,0.4375f, +0.078125f,0.4375f, +0.0859375f,0.4375f, +0.09375f,0.4375f, +0.101563f,0.4375f, +0.109375f,0.4375f, +0.117188f,0.4375f, +0.125f,0.4375f, +0.132813f,0.4375f, +0.140625f,0.4375f, +0.148438f,0.4375f, +0.15625f,0.4375f, +0.164063f,0.4375f, +0.171875f,0.4375f, +0.179688f,0.4375f, +0.1875f,0.4375f, +0.195313f,0.4375f, +0.203125f,0.4375f, +0.210938f,0.4375f, +0.21875f,0.4375f, +0.226563f,0.4375f, +0.234375f,0.4375f, +0.242188f,0.4375f, +0.25f,0.4375f, +0.257813f,0.4375f, +0.265625f,0.4375f, +0.273438f,0.4375f, +0.28125f,0.4375f, +0.289063f,0.4375f, +0.296875f,0.4375f, +0.304688f,0.4375f, +0.3125f,0.4375f, +0.320313f,0.4375f, +0.328125f,0.4375f, +0.335938f,0.4375f, +0.34375f,0.4375f, +0.351563f,0.4375f, +0.359375f,0.4375f, +0.367188f,0.4375f, +0.375f,0.4375f, +0.382813f,0.4375f, +0.390625f,0.4375f, +0.398438f,0.4375f, +0.40625f,0.4375f, +0.414063f,0.4375f, +0.421875f,0.4375f, +0.429688f,0.4375f, +0.4375f,0.4375f, +0.445313f,0.4375f, +0.453125f,0.4375f, +0.460938f,0.4375f, +0.46875f,0.4375f, +0.476563f,0.4375f, +0.484375f,0.4375f, +0.492188f,0.4375f, +0.5f,0.4375f, +0.507813f,0.4375f, +0.0f,0.445313f, +0.0078125f,0.445313f, +0.015625f,0.445313f, +0.0234375f,0.445313f, +0.03125f,0.445313f, +0.0390625f,0.445313f, +0.046875f,0.445313f, +0.0546875f,0.445313f, +0.0625f,0.445313f, +0.0703125f,0.445313f, +0.078125f,0.445313f, +0.0859375f,0.445313f, +0.09375f,0.445313f, +0.101563f,0.445313f, +0.109375f,0.445313f, +0.117188f,0.445313f, +0.125f,0.445313f, +0.132813f,0.445313f, +0.140625f,0.445313f, +0.148438f,0.445313f, +0.15625f,0.445313f, +0.164063f,0.445313f, +0.171875f,0.445313f, +0.179688f,0.445313f, +0.1875f,0.445313f, +0.195313f,0.445313f, +0.203125f,0.445313f, +0.210938f,0.445313f, +0.21875f,0.445313f, +0.226563f,0.445313f, +0.234375f,0.445313f, +0.242188f,0.445313f, +0.25f,0.445313f, +0.257813f,0.445313f, +0.265625f,0.445313f, +0.273438f,0.445313f, +0.28125f,0.445313f, +0.289063f,0.445313f, +0.296875f,0.445313f, +0.304688f,0.445313f, +0.3125f,0.445313f, +0.320313f,0.445313f, +0.328125f,0.445313f, +0.335938f,0.445313f, +0.34375f,0.445313f, +0.351563f,0.445313f, +0.359375f,0.445313f, +0.367188f,0.445313f, +0.375f,0.445313f, +0.382813f,0.445313f, +0.390625f,0.445313f, +0.398438f,0.445313f, +0.40625f,0.445313f, +0.414063f,0.445313f, +0.421875f,0.445313f, +0.429688f,0.445313f, +0.4375f,0.445313f, +0.445313f,0.445313f, +0.453125f,0.445313f, +0.460938f,0.445313f, +0.46875f,0.445313f, +0.476563f,0.445313f, +0.484375f,0.445313f, +0.492188f,0.445313f, +0.5f,0.445313f, +0.507813f,0.445313f, +0.0f,0.453125f, +0.0078125f,0.453125f, +0.015625f,0.453125f, +0.0234375f,0.453125f, +0.03125f,0.453125f, +0.0390625f,0.453125f, +0.046875f,0.453125f, +0.0546875f,0.453125f, +0.0625f,0.453125f, +0.0703125f,0.453125f, +0.078125f,0.453125f, +0.0859375f,0.453125f, +0.09375f,0.453125f, +0.101563f,0.453125f, +0.109375f,0.453125f, +0.117188f,0.453125f, +0.125f,0.453125f, +0.132813f,0.453125f, +0.140625f,0.453125f, +0.148438f,0.453125f, +0.15625f,0.453125f, +0.164063f,0.453125f, +0.171875f,0.453125f, +0.179688f,0.453125f, +0.1875f,0.453125f, +0.195313f,0.453125f, +0.203125f,0.453125f, +0.210938f,0.453125f, +0.21875f,0.453125f, +0.226563f,0.453125f, +0.234375f,0.453125f, +0.242188f,0.453125f, +0.25f,0.453125f, +0.257813f,0.453125f, +0.265625f,0.453125f, +0.273438f,0.453125f, +0.28125f,0.453125f, +0.289063f,0.453125f, +0.296875f,0.453125f, +0.304688f,0.453125f, +0.3125f,0.453125f, +0.320313f,0.453125f, +0.328125f,0.453125f, +0.335938f,0.453125f, +0.34375f,0.453125f, +0.351563f,0.453125f, +0.359375f,0.453125f, +0.367188f,0.453125f, +0.375f,0.453125f, +0.382813f,0.453125f, +0.390625f,0.453125f, +0.398438f,0.453125f, +0.40625f,0.453125f, +0.414063f,0.453125f, +0.421875f,0.453125f, +0.429688f,0.453125f, +0.4375f,0.453125f, +0.445313f,0.453125f, +0.453125f,0.453125f, +0.460938f,0.453125f, +0.46875f,0.453125f, +0.476563f,0.453125f, +0.484375f,0.453125f, +0.492188f,0.453125f, +0.5f,0.453125f, +0.507813f,0.453125f, +0.0f,0.460938f, +0.0078125f,0.460938f, +0.015625f,0.460938f, +0.0234375f,0.460938f, +0.03125f,0.460938f, +0.0390625f,0.460938f, +0.046875f,0.460938f, +0.0546875f,0.460938f, +0.0625f,0.460938f, +0.0703125f,0.460938f, +0.078125f,0.460938f, +0.0859375f,0.460938f, +0.09375f,0.460938f, +0.101563f,0.460938f, +0.109375f,0.460938f, +0.117188f,0.460938f, +0.125f,0.460938f, +0.132813f,0.460938f, +0.140625f,0.460938f, +0.148438f,0.460938f, +0.15625f,0.460938f, +0.164063f,0.460938f, +0.171875f,0.460938f, +0.179688f,0.460938f, +0.1875f,0.460938f, +0.195313f,0.460938f, +0.203125f,0.460938f, +0.210938f,0.460938f, +0.21875f,0.460938f, +0.226563f,0.460938f, +0.234375f,0.460938f, +0.242188f,0.460938f, +0.25f,0.460938f, +0.257813f,0.460938f, +0.265625f,0.460938f, +0.273438f,0.460938f, +0.28125f,0.460938f, +0.289063f,0.460938f, +0.296875f,0.460938f, +0.304688f,0.460938f, +0.3125f,0.460938f, +0.320313f,0.460938f, +0.328125f,0.460938f, +0.335938f,0.460938f, +0.34375f,0.460938f, +0.351563f,0.460938f, +0.359375f,0.460938f, +0.367188f,0.460938f, +0.375f,0.460938f, +0.382813f,0.460938f, +0.390625f,0.460938f, +0.398438f,0.460938f, +0.40625f,0.460938f, +0.414063f,0.460938f, +0.421875f,0.460938f, +0.429688f,0.460938f, +0.4375f,0.460938f, +0.445313f,0.460938f, +0.453125f,0.460938f, +0.460938f,0.460938f, +0.46875f,0.460938f, +0.476563f,0.460938f, +0.484375f,0.460938f, +0.492188f,0.460938f, +0.5f,0.460938f, +0.507813f,0.460938f, +0.0f,0.46875f, +0.0078125f,0.46875f, +0.015625f,0.46875f, +0.0234375f,0.46875f, +0.03125f,0.46875f, +0.0390625f,0.46875f, +0.046875f,0.46875f, +0.0546875f,0.46875f, +0.0625f,0.46875f, +0.0703125f,0.46875f, +0.078125f,0.46875f, +0.0859375f,0.46875f, +0.09375f,0.46875f, +0.101563f,0.46875f, +0.109375f,0.46875f, +0.117188f,0.46875f, +0.125f,0.46875f, +0.132813f,0.46875f, +0.140625f,0.46875f, +0.148438f,0.46875f, +0.15625f,0.46875f, +0.164063f,0.46875f, +0.171875f,0.46875f, +0.179688f,0.46875f, +0.1875f,0.46875f, +0.195313f,0.46875f, +0.203125f,0.46875f, +0.210938f,0.46875f, +0.21875f,0.46875f, +0.226563f,0.46875f, +0.234375f,0.46875f, +0.242188f,0.46875f, +0.25f,0.46875f, +0.257813f,0.46875f, +0.265625f,0.46875f, +0.273438f,0.46875f, +0.28125f,0.46875f, +0.289063f,0.46875f, +0.296875f,0.46875f, +0.304688f,0.46875f, +0.3125f,0.46875f, +0.320313f,0.46875f, +0.328125f,0.46875f, +0.335938f,0.46875f, +0.34375f,0.46875f, +0.351563f,0.46875f, +0.359375f,0.46875f, +0.367188f,0.46875f, +0.375f,0.46875f, +0.382813f,0.46875f, +0.390625f,0.46875f, +0.398438f,0.46875f, +0.40625f,0.46875f, +0.414063f,0.46875f, +0.421875f,0.46875f, +0.429688f,0.46875f, +0.4375f,0.46875f, +0.445313f,0.46875f, +0.453125f,0.46875f, +0.460938f,0.46875f, +0.46875f,0.46875f, +0.476563f,0.46875f, +0.484375f,0.46875f, +0.492188f,0.46875f, +0.5f,0.46875f, +0.507813f,0.46875f, +0.0f,0.476563f, +0.0078125f,0.476563f, +0.015625f,0.476563f, +0.0234375f,0.476563f, +0.03125f,0.476563f, +0.0390625f,0.476563f, +0.046875f,0.476563f, +0.0546875f,0.476563f, +0.0625f,0.476563f, +0.0703125f,0.476563f, +0.078125f,0.476563f, +0.0859375f,0.476563f, +0.09375f,0.476563f, +0.101563f,0.476563f, +0.109375f,0.476563f, +0.117188f,0.476563f, +0.125f,0.476563f, +0.132813f,0.476563f, +0.140625f,0.476563f, +0.148438f,0.476563f, +0.15625f,0.476563f, +0.164063f,0.476563f, +0.171875f,0.476563f, +0.179688f,0.476563f, +0.1875f,0.476563f, +0.195313f,0.476563f, +0.203125f,0.476563f, +0.210938f,0.476563f, +0.21875f,0.476563f, +0.226563f,0.476563f, +0.234375f,0.476563f, +0.242188f,0.476563f, +0.25f,0.476563f, +0.257813f,0.476563f, +0.265625f,0.476563f, +0.273438f,0.476563f, +0.28125f,0.476563f, +0.289063f,0.476563f, +0.296875f,0.476563f, +0.304688f,0.476563f, +0.3125f,0.476563f, +0.320313f,0.476563f, +0.328125f,0.476563f, +0.335938f,0.476563f, +0.34375f,0.476563f, +0.351563f,0.476563f, +0.359375f,0.476563f, +0.367188f,0.476563f, +0.375f,0.476563f, +0.382813f,0.476563f, +0.390625f,0.476563f, +0.398438f,0.476563f, +0.40625f,0.476563f, +0.414063f,0.476563f, +0.421875f,0.476563f, +0.429688f,0.476563f, +0.4375f,0.476563f, +0.445313f,0.476563f, +0.453125f,0.476563f, +0.460938f,0.476563f, +0.46875f,0.476563f, +0.476563f,0.476563f, +0.484375f,0.476563f, +0.492188f,0.476563f, +0.5f,0.476563f, +0.507813f,0.476563f, +0.0f,0.484375f, +0.0078125f,0.484375f, +0.015625f,0.484375f, +0.0234375f,0.484375f, +0.03125f,0.484375f, +0.0390625f,0.484375f, +0.046875f,0.484375f, +0.0546875f,0.484375f, +0.0625f,0.484375f, +0.0703125f,0.484375f, +0.078125f,0.484375f, +0.0859375f,0.484375f, +0.09375f,0.484375f, +0.101563f,0.484375f, +0.109375f,0.484375f, +0.117188f,0.484375f, +0.125f,0.484375f, +0.132813f,0.484375f, +0.140625f,0.484375f, +0.148438f,0.484375f, +0.15625f,0.484375f, +0.164063f,0.484375f, +0.171875f,0.484375f, +0.179688f,0.484375f, +0.1875f,0.484375f, +0.195313f,0.484375f, +0.203125f,0.484375f, +0.210938f,0.484375f, +0.21875f,0.484375f, +0.226563f,0.484375f, +0.234375f,0.484375f, +0.242188f,0.484375f, +0.25f,0.484375f, +0.257813f,0.484375f, +0.265625f,0.484375f, +0.273438f,0.484375f, +0.28125f,0.484375f, +0.289063f,0.484375f, +0.296875f,0.484375f, +0.304688f,0.484375f, +0.3125f,0.484375f, +0.320313f,0.484375f, +0.328125f,0.484375f, +0.335938f,0.484375f, +0.34375f,0.484375f, +0.351563f,0.484375f, +0.359375f,0.484375f, +0.367188f,0.484375f, +0.375f,0.484375f, +0.382813f,0.484375f, +0.390625f,0.484375f, +0.398438f,0.484375f, +0.40625f,0.484375f, +0.414063f,0.484375f, +0.421875f,0.484375f, +0.429688f,0.484375f, +0.4375f,0.484375f, +0.445313f,0.484375f, +0.453125f,0.484375f, +0.460938f,0.484375f, +0.46875f,0.484375f, +0.476563f,0.484375f, +0.484375f,0.484375f, +0.492188f,0.484375f, +0.5f,0.484375f, +0.507813f,0.484375f, +0.0f,0.492188f, +0.0078125f,0.492188f, +0.015625f,0.492188f, +0.0234375f,0.492188f, +0.03125f,0.492188f, +0.0390625f,0.492188f, +0.046875f,0.492188f, +0.0546875f,0.492188f, +0.0625f,0.492188f, +0.0703125f,0.492188f, +0.078125f,0.492188f, +0.0859375f,0.492188f, +0.09375f,0.492188f, +0.101563f,0.492188f, +0.109375f,0.492188f, +0.117188f,0.492188f, +0.125f,0.492188f, +0.132813f,0.492188f, +0.140625f,0.492188f, +0.148438f,0.492188f, +0.15625f,0.492188f, +0.164063f,0.492188f, +0.171875f,0.492188f, +0.179688f,0.492188f, +0.1875f,0.492188f, +0.195313f,0.492188f, +0.203125f,0.492188f, +0.210938f,0.492188f, +0.21875f,0.492188f, +0.226563f,0.492188f, +0.234375f,0.492188f, +0.242188f,0.492188f, +0.25f,0.492188f, +0.257813f,0.492188f, +0.265625f,0.492188f, +0.273438f,0.492188f, +0.28125f,0.492188f, +0.289063f,0.492188f, +0.296875f,0.492188f, +0.304688f,0.492188f, +0.3125f,0.492188f, +0.320313f,0.492188f, +0.328125f,0.492188f, +0.335938f,0.492188f, +0.34375f,0.492188f, +0.351563f,0.492188f, +0.359375f,0.492188f, +0.367188f,0.492188f, +0.375f,0.492188f, +0.382813f,0.492188f, +0.390625f,0.492188f, +0.398438f,0.492188f, +0.40625f,0.492188f, +0.414063f,0.492188f, +0.421875f,0.492188f, +0.429688f,0.492188f, +0.4375f,0.492188f, +0.445313f,0.492188f, +0.453125f,0.492188f, +0.460938f,0.492188f, +0.46875f,0.492188f, +0.476563f,0.492188f, +0.484375f,0.492188f, +0.492188f,0.492188f, +0.5f,0.492188f, +0.507813f,0.492188f, +}; + +unsigned short Landscape02Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +}; + +#define Landscape03VtxCount 2048 +#define Landscape03IdxCount 11718 + +btScalar Landscape03Vtx[] = { +3.90625f,50.3865f,-2.20246e-006f, +3.90625f,52.6186f,3.90625f, +7.8125f,50.3905f,-2.20264e-006f, +7.8125f,51.8648f,3.90625f, +11.7188f,49.8171f,-2.17758e-006f, +11.7188f,51.1949f,3.90625f, +15.625f,50.595f,-2.21158e-006f, +15.625f,50.2102f,3.90625f, +19.5313f,50.405f,-2.20327e-006f, +19.5313f,50.6058f,3.90625f, +23.4375f,50.9679f,-2.22788e-006f, +23.4375f,50.7008f,3.90625f, +27.3438f,52.4635f,-2.29325e-006f, +27.3438f,51.2163f,3.90625f, +31.25f,53.1505f,-2.32328e-006f, +31.25f,51.4263f,3.90625f, +35.1563f,53.061f,-2.31937e-006f, +35.1563f,52.1968f,3.90625f, +39.0625f,53.6772f,-2.34631e-006f, +39.0625f,53.9783f,3.90625f, +42.9688f,54.3062f,-2.3738e-006f, +42.9688f,53.8927f,3.90625f, +46.875f,54.6795f,-2.39012e-006f, +46.875f,53.3266f,3.90625f, +50.7813f,55.3188f,-2.41806e-006f, +50.7813f,53.5901f,3.90625f, +54.6875f,56.913f,-2.48775e-006f, +54.6875f,55.5679f,3.90625f, +58.5938f,57.4575f,-2.51155e-006f, +58.5938f,55.1819f,3.90625f, +62.5f,56.5398f,-2.47143e-006f, +62.5f,53.6891f,3.90625f, +66.4063f,55.8786f,-2.44253e-006f, +66.4063f,53.0541f,3.90625f, +70.3125f,53.6497f,-2.3451e-006f, +70.3125f,51.6665f,3.90625f, +74.2188f,51.6447f,-2.25746e-006f, +74.2188f,51.4469f,3.90625f, +78.125f,51.8145f,-2.26488e-006f, +78.125f,51.9591f,3.90625f, +82.0313f,51.335f,-2.24392e-006f, +82.0313f,51.0418f,3.90625f, +85.9375f,50.1836f,-2.1936e-006f, +85.9375f,49.7513f,3.90625f, +89.8438f,49.0536f,-2.1442e-006f, +89.8438f,48.7329f,3.90625f, +93.75f,47.3968f,-2.07178e-006f, +93.75f,46.8713f,3.90625f, +97.6563f,45.8014f,-2.00204e-006f, +97.6563f,46.3905f,3.90625f, +101.563f,45.2347f,-1.97727e-006f, +101.563f,45.4241f,3.90625f, +105.469f,44.6501f,-1.95172e-006f, +105.469f,45.6811f,3.90625f, +109.375f,44.3569f,-1.9389e-006f, +109.375f,45.3238f,3.90625f, +113.281f,44.1147f,-1.92831e-006f, +113.281f,43.6112f,3.90625f, +117.188f,43.4037f,-1.89723e-006f, +117.188f,42.1291f,3.90625f, +121.094f,41.1606f,-1.79919e-006f, +121.094f,40.4747f,3.90625f, +125.0f,40.195f,-1.75698e-006f, +125.0f,39.3351f,3.90625f, +128.906f,39.5659f,-1.72948e-006f, +128.906f,38.0742f,3.90625f, +132.813f,38.2592f,-1.67236e-006f, +132.813f,36.7758f,3.90625f, +136.719f,36.4337f,-1.59257e-006f, +136.719f,34.9213f,3.90625f, +140.625f,34.1507f,-1.49277e-006f, +140.625f,32.3643f,3.90625f, +144.531f,31.5531f,-1.37923e-006f, +144.531f,31.7157f,3.90625f, +148.438f,29.9056f,-1.30722e-006f, +148.438f,30.6005f,3.90625f, +152.344f,30.5219f,-1.33416e-006f, +152.344f,31.6034f,3.90625f, +156.25f,31.1254f,-1.36053e-006f, +156.25f,32.6503f,3.90625f, +160.156f,31.8976f,-1.39429e-006f, +160.156f,33.3131f,3.90625f, +164.063f,31.5364f,-1.3785e-006f, +164.063f,32.5745f,3.90625f, +167.969f,30.5585f,-1.33575e-006f, +167.969f,31.5017f,3.90625f, +171.875f,30.0528f,-1.31365e-006f, +171.875f,30.6842f,3.90625f, +175.781f,29.2833f,-1.28002e-006f, +175.781f,29.8734f,3.90625f, +179.688f,28.3316f,-1.23841e-006f, +179.688f,28.6537f,3.90625f, +183.594f,27.0177f,-1.18098e-006f, +183.594f,27.2073f,3.90625f, +187.5f,24.7626f,-1.08241e-006f, +187.5f,25.4367f,3.90625f, +191.406f,22.7371f,-9.9387e-007f, +191.406f,24.1609f,3.90625f, +195.313f,21.6497f,-9.46338e-007f, +195.313f,23.9724f,3.90625f, +199.219f,21.3313f,-9.32422e-007f, +199.219f,23.7702f,3.90625f, +203.125f,20.9148f,-9.14215e-007f, +203.125f,22.4031f,3.90625f, +207.031f,19.4875f,-8.51826e-007f, +207.031f,22.1587f,3.90625f, +210.938f,19.0037f,-8.30679e-007f, +210.938f,21.6154f,3.90625f, +214.844f,18.408f,-8.0464e-007f, +214.844f,21.8202f,3.90625f, +218.75f,18.7855f,-8.2114e-007f, +218.75f,21.017f,3.90625f, +222.656f,18.1497f,-7.9335e-007f, +222.656f,19.3736f,3.90625f, +226.563f,17.6889f,-7.73205e-007f, +226.563f,18.2127f,3.90625f, +230.469f,16.8429f,-7.36228e-007f, +230.469f,17.2263f,3.90625f, +234.375f,16.3712f,-7.15609e-007f, +234.375f,16.2938f,3.90625f, +238.281f,14.3259f,-6.26204e-007f, +238.281f,14.4518f,3.90625f, +242.188f,12.4394f,-5.43742e-007f, +242.188f,13.6398f,3.90625f, +246.094f,12.3876f,-5.41479e-007f, +246.094f,13.2404f,3.90625f, +250.0f,11.9236f,-5.21196e-007f, +250.0f,12.7102f,3.90625f, +3.90625f,48.8559f,-3.90625f, +7.8125f,49.3575f,-3.90625f, +11.7188f,49.963f,-3.90625f, +15.625f,50.1126f,-3.90625f, +19.5313f,51.6247f,-3.90625f, +23.4375f,52.1716f,-3.90625f, +27.3438f,52.8679f,-3.90625f, +31.25f,53.978f,-3.90625f, +35.1563f,53.8948f,-3.90625f, +39.0625f,54.8492f,-3.90625f, +42.9688f,56.1714f,-3.90625f, +46.875f,56.4915f,-3.90625f, +50.7813f,56.5729f,-3.90625f, +54.6875f,57.9767f,-3.90625f, +58.5938f,58.6125f,-3.90625f, +62.5f,58.0023f,-3.90625f, +66.4063f,57.5742f,-3.90625f, +70.3125f,55.4949f,-3.90625f, +74.2188f,53.7219f,-3.90625f, +78.125f,53.233f,-3.90625f, +82.0313f,52.5499f,-3.90625f, +85.9375f,51.1842f,-3.90625f, +89.8438f,49.6534f,-3.90625f, +93.75f,47.6829f,-3.90625f, +97.6563f,45.813f,-3.90625f, +101.563f,44.7099f,-3.90625f, +105.469f,45.0932f,-3.90625f, +109.375f,44.8326f,-3.90625f, +113.281f,44.5197f,-3.90625f, +117.188f,43.7399f,-3.90625f, +121.094f,42.3088f,-3.90625f, +125.0f,40.4224f,-3.90625f, +128.906f,39.437f,-3.90625f, +132.813f,39.825f,-3.90625f, +136.719f,38.2979f,-3.90625f, +140.625f,35.2095f,-3.90625f, +144.531f,32.0692f,-3.90625f, +148.438f,31.1765f,-3.90625f, +152.344f,32.2065f,-3.90625f, +156.25f,31.4774f,-3.90625f, +160.156f,31.7166f,-3.90625f, +164.063f,31.7667f,-3.90625f, +167.969f,31.1742f,-3.90625f, +171.875f,29.6515f,-3.90625f, +175.781f,28.7845f,-3.90625f, +179.688f,28.3154f,-3.90625f, +183.594f,26.6187f,-3.90625f, +187.5f,24.7363f,-3.90625f, +191.406f,22.9162f,-3.90625f, +195.313f,21.5211f,-3.90625f, +199.219f,19.7693f,-3.90625f, +203.125f,18.9792f,-3.90625f, +207.031f,18.8399f,-3.90625f, +210.938f,18.8797f,-3.90625f, +214.844f,18.8123f,-3.90625f, +218.75f,18.5136f,-3.90625f, +222.656f,18.5607f,-3.90625f, +226.563f,17.5053f,-3.90625f, +230.469f,17.4838f,-3.90625f, +234.375f,16.6728f,-3.90625f, +238.281f,14.8594f,-3.90625f, +242.188f,12.9613f,-3.90625f, +246.094f,12.8624f,-3.90625f, +250.0f,11.5894f,-3.90625f, +3.90625f,48.7225f,-7.8125f, +7.8125f,49.1281f,-7.8125f, +11.7188f,50.0005f,-7.8125f, +15.625f,50.5896f,-7.8125f, +19.5313f,51.5499f,-7.8125f, +23.4375f,52.9511f,-7.8125f, +27.3438f,53.117f,-7.8125f, +31.25f,54.0682f,-7.8125f, +35.1563f,55.2353f,-7.8125f, +39.0625f,57.2741f,-7.8125f, +42.9688f,57.4338f,-7.8125f, +46.875f,57.766f,-7.8125f, +50.7813f,57.2724f,-7.8125f, +54.6875f,58.0147f,-7.8125f, +58.5938f,58.764f,-7.8125f, +62.5f,58.6375f,-7.8125f, +66.4063f,57.2699f,-7.8125f, +70.3125f,55.9883f,-7.8125f, +74.2188f,54.8767f,-7.8125f, +78.125f,54.5266f,-7.8125f, +82.0313f,53.7148f,-7.8125f, +85.9375f,52.3735f,-7.8125f, +89.8438f,50.9637f,-7.8125f, +93.75f,48.4983f,-7.8125f, +97.6563f,45.9034f,-7.8125f, +101.563f,45.0863f,-7.8125f, +105.469f,44.2432f,-7.8125f, +109.375f,43.9561f,-7.8125f, +113.281f,43.3015f,-7.8125f, +117.188f,43.254f,-7.8125f, +121.094f,42.7388f,-7.8125f, +125.0f,41.1851f,-7.8125f, +128.906f,39.7522f,-7.8125f, +132.813f,39.8116f,-7.8125f, +136.719f,38.7148f,-7.8125f, +140.625f,36.0845f,-7.8125f, +144.531f,34.0308f,-7.8125f, +148.438f,33.0368f,-7.8125f, +152.344f,32.5867f,-7.8125f, +156.25f,32.8758f,-7.8125f, +160.156f,32.65f,-7.8125f, +164.063f,32.6826f,-7.8125f, +167.969f,31.5243f,-7.8125f, +171.875f,30.4061f,-7.8125f, +175.781f,29.2721f,-7.8125f, +179.688f,28.0417f,-7.8125f, +183.594f,26.2041f,-7.8125f, +187.5f,24.2168f,-7.8125f, +191.406f,22.7847f,-7.8125f, +195.313f,20.5069f,-7.8125f, +199.219f,18.6189f,-7.8125f, +203.125f,17.5296f,-7.8125f, +207.031f,18.0846f,-7.8125f, +210.938f,18.4802f,-7.8125f, +214.844f,18.5436f,-7.8125f, +218.75f,18.3296f,-7.8125f, +222.656f,17.9158f,-7.8125f, +226.563f,17.0318f,-7.8125f, +230.469f,16.2818f,-7.8125f, +234.375f,15.4949f,-7.8125f, +238.281f,13.4891f,-7.8125f, +242.188f,13.3349f,-7.8125f, +246.094f,12.2716f,-7.8125f, +250.0f,10.9901f,-7.8125f, +3.90625f,49.6298f,-11.7188f, +7.8125f,50.0683f,-11.7188f, +11.7188f,50.6295f,-11.7188f, +15.625f,51.0495f,-11.7188f, +19.5313f,52.4884f,-11.7188f, +23.4375f,53.3147f,-11.7188f, +27.3438f,54.4311f,-11.7188f, +31.25f,55.2874f,-11.7188f, +35.1563f,56.5549f,-11.7188f, +39.0625f,57.9376f,-11.7188f, +42.9688f,58.2302f,-11.7188f, +46.875f,59.1419f,-11.7188f, +50.7813f,58.8724f,-11.7188f, +54.6875f,58.5393f,-11.7188f, +58.5938f,58.6416f,-11.7188f, +62.5f,58.1973f,-11.7188f, +66.4063f,57.9168f,-11.7188f, +70.3125f,56.4347f,-11.7188f, +74.2188f,55.7911f,-11.7188f, +78.125f,55.946f,-11.7188f, +82.0313f,54.9033f,-11.7188f, +85.9375f,53.0954f,-11.7188f, +89.8438f,51.7428f,-11.7188f, +93.75f,49.2198f,-11.7188f, +97.6563f,46.1127f,-11.7188f, +101.563f,43.9953f,-11.7188f, +105.469f,43.5777f,-11.7188f, +109.375f,43.3284f,-11.7188f, +113.281f,43.5152f,-11.7188f, +117.188f,43.6687f,-11.7188f, +121.094f,42.5477f,-11.7188f, +125.0f,41.4079f,-11.7188f, +128.906f,39.4512f,-11.7188f, +132.813f,39.5183f,-11.7188f, +136.719f,37.8068f,-11.7188f, +140.625f,36.5652f,-11.7188f, +144.531f,34.8202f,-11.7188f, +148.438f,34.0166f,-11.7188f, +152.344f,33.5311f,-11.7188f, +156.25f,34.1672f,-11.7188f, +160.156f,33.8602f,-11.7188f, +164.063f,33.8717f,-11.7188f, +167.969f,33.1703f,-11.7188f, +171.875f,31.0241f,-11.7188f, +175.781f,30.2798f,-11.7188f, +179.688f,28.3241f,-11.7188f, +183.594f,26.4432f,-11.7188f, +187.5f,24.9758f,-11.7188f, +191.406f,22.2834f,-11.7188f, +195.313f,19.3875f,-11.7188f, +199.219f,18.4079f,-11.7188f, +203.125f,16.6498f,-11.7188f, +207.031f,16.1235f,-11.7188f, +210.938f,16.9462f,-11.7188f, +214.844f,17.2638f,-11.7188f, +218.75f,17.0386f,-11.7188f, +222.656f,16.7666f,-11.7188f, +226.563f,15.3591f,-11.7188f, +230.469f,14.4048f,-11.7188f, +234.375f,13.3079f,-11.7188f, +238.281f,13.0895f,-11.7188f, +242.188f,12.8462f,-11.7188f, +246.094f,12.6287f,-11.7188f, +250.0f,11.4682f,-11.7188f, +3.90625f,50.6915f,-15.625f, +7.8125f,51.2382f,-15.625f, +11.7188f,52.3659f,-15.625f, +15.625f,52.3873f,-15.625f, +19.5313f,53.1083f,-15.625f, +23.4375f,54.652f,-15.625f, +27.3438f,56.0359f,-15.625f, +31.25f,56.4398f,-15.625f, +35.1563f,57.3156f,-15.625f, +39.0625f,58.2355f,-15.625f, +42.9688f,59.4547f,-15.625f, +46.875f,59.9176f,-15.625f, +50.7813f,60.0789f,-15.625f, +54.6875f,59.004f,-15.625f, +58.5938f,59.3361f,-15.625f, +62.5f,59.2681f,-15.625f, +66.4063f,58.5571f,-15.625f, +70.3125f,57.1801f,-15.625f, +74.2188f,56.2048f,-15.625f, +78.125f,56.9427f,-15.625f, +82.0313f,55.401f,-15.625f, +85.9375f,53.0457f,-15.625f, +89.8438f,51.6378f,-15.625f, +93.75f,49.1297f,-15.625f, +97.6563f,46.6267f,-15.625f, +101.563f,44.7255f,-15.625f, +105.469f,43.3819f,-15.625f, +109.375f,42.8703f,-15.625f, +113.281f,42.7636f,-15.625f, +117.188f,42.1897f,-15.625f, +121.094f,41.9269f,-15.625f, +125.0f,41.5365f,-15.625f, +128.906f,39.5408f,-15.625f, +132.813f,38.9178f,-15.625f, +136.719f,38.1447f,-15.625f, +140.625f,36.5145f,-15.625f, +144.531f,34.8696f,-15.625f, +148.438f,34.8203f,-15.625f, +152.344f,34.409f,-15.625f, +156.25f,35.1394f,-15.625f, +160.156f,35.619f,-15.625f, +164.063f,34.7784f,-15.625f, +167.969f,33.6548f,-15.625f, +171.875f,32.1822f,-15.625f, +175.781f,31.1666f,-15.625f, +179.688f,28.9574f,-15.625f, +183.594f,27.3989f,-15.625f, +187.5f,24.7201f,-15.625f, +191.406f,21.7859f,-15.625f, +195.313f,19.2508f,-15.625f, +199.219f,18.0209f,-15.625f, +203.125f,16.8441f,-15.625f, +207.031f,15.8846f,-15.625f, +210.938f,15.6902f,-15.625f, +214.844f,15.3143f,-15.625f, +218.75f,15.3862f,-15.625f, +222.656f,14.2743f,-15.625f, +226.563f,13.5791f,-15.625f, +230.469f,13.4953f,-15.625f, +234.375f,13.3484f,-15.625f, +238.281f,13.2722f,-15.625f, +242.188f,13.4455f,-15.625f, +246.094f,13.0725f,-15.625f, +250.0f,11.5558f,-15.625f, +3.90625f,52.1028f,-19.5313f, +7.8125f,52.877f,-19.5313f, +11.7188f,54.5397f,-19.5313f, +15.625f,54.8941f,-19.5313f, +19.5313f,54.9009f,-19.5313f, +23.4375f,56.1681f,-19.5313f, +27.3438f,56.5579f,-19.5313f, +31.25f,57.7962f,-19.5313f, +35.1563f,58.728f,-19.5313f, +39.0625f,59.4794f,-19.5313f, +42.9688f,60.2636f,-19.5313f, +46.875f,61.2139f,-19.5313f, +50.7813f,60.4636f,-19.5313f, +54.6875f,59.681f,-19.5313f, +58.5938f,60.2068f,-19.5313f, +62.5f,59.1055f,-19.5313f, +66.4063f,57.6126f,-19.5313f, +70.3125f,56.6416f,-19.5313f, +74.2188f,56.4864f,-19.5313f, +78.125f,56.1784f,-19.5313f, +82.0313f,54.8451f,-19.5313f, +85.9375f,53.4094f,-19.5313f, +89.8438f,51.7161f,-19.5313f, +93.75f,48.9933f,-19.5313f, +97.6563f,47.5116f,-19.5313f, +101.563f,45.7701f,-19.5313f, +105.469f,44.0377f,-19.5313f, +109.375f,43.0918f,-19.5313f, +113.281f,42.3992f,-19.5313f, +117.188f,42.0928f,-19.5313f, +121.094f,42.0543f,-19.5313f, +125.0f,41.793f,-19.5313f, +128.906f,39.3232f,-19.5313f, +132.813f,39.1149f,-19.5313f, +136.719f,38.2381f,-19.5313f, +140.625f,36.1019f,-19.5313f, +144.531f,36.4503f,-19.5313f, +148.438f,35.6809f,-19.5313f, +152.344f,35.8022f,-19.5313f, +156.25f,36.4955f,-19.5313f, +160.156f,36.3187f,-19.5313f, +164.063f,35.0268f,-19.5313f, +167.969f,34.0134f,-19.5313f, +171.875f,33.6455f,-19.5313f, +175.781f,31.5932f,-19.5313f, +179.688f,30.0326f,-19.5313f, +183.594f,28.3453f,-19.5313f, +187.5f,25.3719f,-19.5313f, +191.406f,22.0833f,-19.5313f, +195.313f,18.7475f,-19.5313f, +199.219f,17.5517f,-19.5313f, +203.125f,16.1528f,-19.5313f, +207.031f,15.6144f,-19.5313f, +210.938f,14.9281f,-19.5313f, +214.844f,14.5711f,-19.5313f, +218.75f,13.8446f,-19.5313f, +222.656f,13.6892f,-19.5313f, +226.563f,13.1595f,-19.5313f, +230.469f,13.2872f,-19.5313f, +234.375f,13.6153f,-19.5313f, +238.281f,12.8725f,-19.5313f, +242.188f,12.7128f,-19.5313f, +246.094f,13.0658f,-19.5313f, +250.0f,11.5414f,-19.5313f, +3.90625f,54.332f,-23.4375f, +7.8125f,55.636f,-23.4375f, +11.7188f,56.3899f,-23.4375f, +15.625f,56.3763f,-23.4375f, +19.5313f,56.9523f,-23.4375f, +23.4375f,57.5593f,-23.4375f, +27.3438f,57.8056f,-23.4375f, +31.25f,58.5489f,-23.4375f, +35.1563f,59.2321f,-23.4375f, +39.0625f,60.5971f,-23.4375f, +42.9688f,60.1728f,-23.4375f, +46.875f,60.9341f,-23.4375f, +50.7813f,59.5118f,-23.4375f, +54.6875f,59.7552f,-23.4375f, +58.5938f,59.9126f,-23.4375f, +62.5f,58.501f,-23.4375f, +66.4063f,57.8539f,-23.4375f, +70.3125f,56.8693f,-23.4375f, +74.2188f,56.0687f,-23.4375f, +78.125f,55.4392f,-23.4375f, +82.0313f,53.7167f,-23.4375f, +85.9375f,52.1078f,-23.4375f, +89.8438f,50.8869f,-23.4375f, +93.75f,49.9812f,-23.4375f, +97.6563f,47.9233f,-23.4375f, +101.563f,46.1166f,-23.4375f, +105.469f,44.4826f,-23.4375f, +109.375f,42.8924f,-23.4375f, +113.281f,41.9991f,-23.4375f, +117.188f,41.1759f,-23.4375f, +121.094f,41.1189f,-23.4375f, +125.0f,39.9128f,-23.4375f, +128.906f,39.8641f,-23.4375f, +132.813f,39.8777f,-23.4375f, +136.719f,38.3567f,-23.4375f, +140.625f,37.4926f,-23.4375f, +144.531f,37.0275f,-23.4375f, +148.438f,36.7211f,-23.4375f, +152.344f,36.9355f,-23.4375f, +156.25f,37.7455f,-23.4375f, +160.156f,37.3585f,-23.4375f, +164.063f,36.1837f,-23.4375f, +167.969f,34.768f,-23.4375f, +171.875f,33.2179f,-23.4375f, +175.781f,31.6883f,-23.4375f, +179.688f,30.1136f,-23.4375f, +183.594f,28.1155f,-23.4375f, +187.5f,25.4881f,-23.4375f, +191.406f,22.8498f,-23.4375f, +195.313f,19.4425f,-23.4375f, +199.219f,17.1253f,-23.4375f, +203.125f,14.8354f,-23.4375f, +207.031f,14.1771f,-23.4375f, +210.938f,13.9227f,-23.4375f, +214.844f,13.3404f,-23.4375f, +218.75f,13.0525f,-23.4375f, +222.656f,13.0744f,-23.4375f, +226.563f,13.0432f,-23.4375f, +230.469f,13.3341f,-23.4375f, +234.375f,13.6022f,-23.4375f, +238.281f,13.3878f,-23.4375f, +242.188f,12.5812f,-23.4375f, +246.094f,11.8699f,-23.4375f, +250.0f,11.3395f,-23.4375f, +3.90625f,57.5273f,-27.3438f, +7.8125f,57.8217f,-27.3438f, +11.7188f,57.5626f,-27.3438f, +15.625f,57.7794f,-27.3438f, +19.5313f,58.7949f,-27.3438f, +23.4375f,59.3547f,-27.3438f, +27.3438f,59.2359f,-27.3438f, +31.25f,58.8772f,-27.3438f, +35.1563f,58.7149f,-27.3438f, +39.0625f,59.7221f,-27.3438f, +42.9688f,60.0457f,-27.3438f, +46.875f,59.6559f,-27.3438f, +50.7813f,59.9346f,-27.3438f, +54.6875f,60.4095f,-27.3438f, +58.5938f,59.3107f,-27.3438f, +62.5f,57.9086f,-27.3438f, +66.4063f,57.3034f,-27.3438f, +70.3125f,55.5758f,-27.3438f, +74.2188f,54.7167f,-27.3438f, +78.125f,54.405f,-27.3438f, +82.0313f,53.0644f,-27.3438f, +85.9375f,50.9689f,-27.3438f, +89.8438f,49.5959f,-27.3438f, +93.75f,49.2817f,-27.3438f, +97.6563f,48.9188f,-27.3438f, +101.563f,47.0066f,-27.3438f, +105.469f,44.4266f,-27.3438f, +109.375f,42.4539f,-27.3438f, +113.281f,41.5486f,-27.3438f, +117.188f,41.4419f,-27.3438f, +121.094f,41.2039f,-27.3438f, +125.0f,40.188f,-27.3438f, +128.906f,40.4744f,-27.3438f, +132.813f,40.1187f,-27.3438f, +136.719f,38.8055f,-27.3438f, +140.625f,38.024f,-27.3438f, +144.531f,37.5255f,-27.3438f, +148.438f,36.8676f,-27.3438f, +152.344f,37.8967f,-27.3438f, +156.25f,38.4708f,-27.3438f, +160.156f,37.8284f,-27.3438f, +164.063f,36.6094f,-27.3438f, +167.969f,34.4523f,-27.3438f, +171.875f,32.2936f,-27.3438f, +175.781f,31.7467f,-27.3438f, +179.688f,29.9455f,-27.3438f, +183.594f,27.7546f,-27.3438f, +187.5f,25.1902f,-27.3438f, +191.406f,22.537f,-27.3438f, +195.313f,19.5657f,-27.3438f, +199.219f,17.4406f,-27.3438f, +203.125f,15.5459f,-27.3438f, +207.031f,14.92f,-27.3438f, +210.938f,13.472f,-27.3438f, +214.844f,12.9933f,-27.3438f, +218.75f,13.2849f,-27.3438f, +222.656f,12.3375f,-27.3438f, +226.563f,12.0553f,-27.3438f, +230.469f,12.4756f,-27.3438f, +234.375f,12.0857f,-27.3438f, +238.281f,12.1988f,-27.3438f, +242.188f,11.9091f,-27.3438f, +246.094f,10.7301f,-27.3438f, +250.0f,10.1068f,-27.3438f, +3.90625f,59.4204f,-31.25f, +7.8125f,59.5424f,-31.25f, +11.7188f,58.7785f,-31.25f, +15.625f,59.7851f,-31.25f, +19.5313f,60.4897f,-31.25f, +23.4375f,60.6095f,-31.25f, +27.3438f,60.3384f,-31.25f, +31.25f,59.5445f,-31.25f, +35.1563f,58.6838f,-31.25f, +39.0625f,58.847f,-31.25f, +42.9688f,59.3885f,-31.25f, +46.875f,59.447f,-31.25f, +50.7813f,59.5998f,-31.25f, +54.6875f,58.9947f,-31.25f, +58.5938f,58.7482f,-31.25f, +62.5f,56.5947f,-31.25f, +66.4063f,56.2941f,-31.25f, +70.3125f,54.6423f,-31.25f, +74.2188f,53.7392f,-31.25f, +78.125f,53.2955f,-31.25f, +82.0313f,52.8233f,-31.25f, +85.9375f,52.1194f,-31.25f, +89.8438f,51.3335f,-31.25f, +93.75f,49.9201f,-31.25f, +97.6563f,49.1642f,-31.25f, +101.563f,47.4466f,-31.25f, +105.469f,44.6086f,-31.25f, +109.375f,42.885f,-31.25f, +113.281f,42.947f,-31.25f, +117.188f,42.2436f,-31.25f, +121.094f,41.6479f,-31.25f, +125.0f,41.6151f,-31.25f, +128.906f,41.2079f,-31.25f, +132.813f,40.7975f,-31.25f, +136.719f,39.8341f,-31.25f, +140.625f,38.7649f,-31.25f, +144.531f,37.7387f,-31.25f, +148.438f,37.2112f,-31.25f, +152.344f,38.3278f,-31.25f, +156.25f,38.7659f,-31.25f, +160.156f,37.5608f,-31.25f, +164.063f,35.9966f,-31.25f, +167.969f,33.737f,-31.25f, +171.875f,32.0109f,-31.25f, +175.781f,31.1169f,-31.25f, +179.688f,30.0211f,-31.25f, +183.594f,27.5633f,-31.25f, +187.5f,25.0292f,-31.25f, +191.406f,22.8265f,-31.25f, +195.313f,19.8972f,-31.25f, +199.219f,17.6714f,-31.25f, +203.125f,16.2679f,-31.25f, +207.031f,15.0546f,-31.25f, +210.938f,14.037f,-31.25f, +214.844f,12.5501f,-31.25f, +218.75f,12.1528f,-31.25f, +222.656f,12.0576f,-31.25f, +226.563f,11.2847f,-31.25f, +230.469f,11.5946f,-31.25f, +234.375f,10.9216f,-31.25f, +238.281f,10.9182f,-31.25f, +242.188f,11.2826f,-31.25f, +246.094f,11.5781f,-31.25f, +250.0f,11.536f,-31.25f, +3.90625f,60.2212f,-35.1563f, +7.8125f,59.3731f,-35.1563f, +11.7188f,58.5327f,-35.1563f, +15.625f,59.5785f,-35.1563f, +19.5313f,60.1491f,-35.1563f, +23.4375f,60.5297f,-35.1563f, +27.3438f,60.5336f,-35.1563f, +31.25f,60.162f,-35.1563f, +35.1563f,58.5927f,-35.1563f, +39.0625f,57.9369f,-35.1563f, +42.9688f,58.4405f,-35.1563f, +46.875f,58.7374f,-35.1563f, +50.7813f,57.6198f,-35.1563f, +54.6875f,57.3277f,-35.1563f, +58.5938f,56.6423f,-35.1563f, +62.5f,56.2444f,-35.1563f, +66.4063f,56.132f,-35.1563f, +70.3125f,54.6673f,-35.1563f, +74.2188f,53.2924f,-35.1563f, +78.125f,53.2569f,-35.1563f, +82.0313f,52.0828f,-35.1563f, +85.9375f,51.9661f,-35.1563f, +89.8438f,50.9045f,-35.1563f, +93.75f,49.4997f,-35.1563f, +97.6563f,48.0748f,-35.1563f, +101.563f,46.3182f,-35.1563f, +105.469f,44.0878f,-35.1563f, +109.375f,42.863f,-35.1563f, +113.281f,42.8044f,-35.1563f, +117.188f,42.9648f,-35.1563f, +121.094f,42.3221f,-35.1563f, +125.0f,41.6576f,-35.1563f, +128.906f,41.1606f,-35.1563f, +132.813f,39.59f,-35.1563f, +136.719f,38.5602f,-35.1563f, +140.625f,37.9389f,-35.1563f, +144.531f,37.2602f,-35.1563f, +148.438f,37.3784f,-35.1563f, +152.344f,37.8906f,-35.1563f, +156.25f,37.8221f,-35.1563f, +160.156f,36.3088f,-35.1563f, +164.063f,35.1881f,-35.1563f, +167.969f,33.2601f,-35.1563f, +171.875f,31.8157f,-35.1563f, +175.781f,31.3416f,-35.1563f, +179.688f,30.0265f,-35.1563f, +183.594f,27.3943f,-35.1563f, +187.5f,24.641f,-35.1563f, +191.406f,22.2525f,-35.1563f, +195.313f,20.2011f,-35.1563f, +199.219f,18.7104f,-35.1563f, +203.125f,17.3459f,-35.1563f, +207.031f,15.2838f,-35.1563f, +210.938f,13.6157f,-35.1563f, +214.844f,13.3893f,-35.1563f, +218.75f,12.9319f,-35.1563f, +222.656f,11.5191f,-35.1563f, +226.563f,10.4878f,-35.1563f, +230.469f,9.83031f,-35.1563f, +234.375f,9.91945f,-35.1563f, +238.281f,10.9647f,-35.1563f, +242.188f,11.5866f,-35.1563f, +246.094f,11.8313f,-35.1563f, +250.0f,11.9419f,-35.1563f, +3.90625f,59.9094f,-39.0625f, +7.8125f,58.6207f,-39.0625f, +11.7188f,57.735f,-39.0625f, +15.625f,58.9909f,-39.0625f, +19.5313f,60.0678f,-39.0625f, +23.4375f,60.5419f,-39.0625f, +27.3438f,60.4672f,-39.0625f, +31.25f,59.5824f,-39.0625f, +35.1563f,58.4068f,-39.0625f, +39.0625f,57.5098f,-39.0625f, +42.9688f,57.6631f,-39.0625f, +46.875f,57.8211f,-39.0625f, +50.7813f,57.1897f,-39.0625f, +54.6875f,55.6789f,-39.0625f, +58.5938f,55.3212f,-39.0625f, +62.5f,55.2941f,-39.0625f, +66.4063f,55.8101f,-39.0625f, +70.3125f,54.309f,-39.0625f, +74.2188f,53.6313f,-39.0625f, +78.125f,52.7246f,-39.0625f, +82.0313f,51.5473f,-39.0625f, +85.9375f,51.5315f,-39.0625f, +89.8438f,50.6121f,-39.0625f, +93.75f,50.3734f,-39.0625f, +97.6563f,48.8877f,-39.0625f, +101.563f,47.0081f,-39.0625f, +105.469f,44.4827f,-39.0625f, +109.375f,43.5851f,-39.0625f, +113.281f,43.2668f,-39.0625f, +117.188f,43.4016f,-39.0625f, +121.094f,41.962f,-39.0625f, +125.0f,41.4641f,-39.0625f, +128.906f,40.2221f,-39.0625f, +132.813f,38.9234f,-39.0625f, +136.719f,37.7062f,-39.0625f, +140.625f,37.6455f,-39.0625f, +144.531f,37.8691f,-39.0625f, +148.438f,37.4139f,-39.0625f, +152.344f,37.204f,-39.0625f, +156.25f,36.7774f,-39.0625f, +160.156f,35.8962f,-39.0625f, +164.063f,34.5247f,-39.0625f, +167.969f,32.7322f,-39.0625f, +171.875f,32.1044f,-39.0625f, +175.781f,31.321f,-39.0625f, +179.688f,29.7775f,-39.0625f, +183.594f,26.7381f,-39.0625f, +187.5f,24.0216f,-39.0625f, +191.406f,22.277f,-39.0625f, +195.313f,21.2497f,-39.0625f, +199.219f,19.9529f,-39.0625f, +203.125f,18.3349f,-39.0625f, +207.031f,16.7961f,-39.0625f, +210.938f,15.071f,-39.0625f, +214.844f,13.5616f,-39.0625f, +218.75f,13.1679f,-39.0625f, +222.656f,11.2729f,-39.0625f, +226.563f,10.5025f,-39.0625f, +230.469f,9.72086f,-39.0625f, +234.375f,9.90489f,-39.0625f, +238.281f,10.7231f,-39.0625f, +242.188f,11.2573f,-39.0625f, +246.094f,12.0761f,-39.0625f, +250.0f,11.902f,-39.0625f, +3.90625f,59.5207f,-42.9688f, +7.8125f,58.2483f,-42.9688f, +11.7188f,58.069f,-42.9688f, +15.625f,59.4248f,-42.9688f, +19.5313f,60.5261f,-42.9688f, +23.4375f,60.668f,-42.9688f, +27.3438f,60.0252f,-42.9688f, +31.25f,58.0523f,-42.9688f, +35.1563f,56.7426f,-42.9688f, +39.0625f,57.2045f,-42.9688f, +42.9688f,57.166f,-42.9688f, +46.875f,56.9465f,-42.9688f, +50.7813f,55.7381f,-42.9688f, +54.6875f,55.2924f,-42.9688f, +58.5938f,54.6074f,-42.9688f, +62.5f,54.1882f,-42.9688f, +66.4063f,53.672f,-42.9688f, +70.3125f,53.3122f,-42.9688f, +74.2188f,53.0852f,-42.9688f, +78.125f,52.6173f,-42.9688f, +82.0313f,51.616f,-42.9688f, +85.9375f,50.148f,-42.9688f, +89.8438f,49.4823f,-42.9688f, +93.75f,50.0221f,-42.9688f, +97.6563f,48.9931f,-42.9688f, +101.563f,47.1045f,-42.9688f, +105.469f,44.442f,-42.9688f, +109.375f,44.5071f,-42.9688f, +113.281f,44.1005f,-42.9688f, +117.188f,42.8414f,-42.9688f, +121.094f,42.5419f,-42.9688f, +125.0f,41.5451f,-42.9688f, +128.906f,39.4272f,-42.9688f, +132.813f,39.8815f,-42.9688f, +136.719f,39.1366f,-42.9688f, +140.625f,38.7457f,-42.9688f, +144.531f,38.4257f,-42.9688f, +148.438f,37.9899f,-42.9688f, +152.344f,37.1716f,-42.9688f, +156.25f,36.0431f,-42.9688f, +160.156f,35.0784f,-42.9688f, +164.063f,33.3564f,-42.9688f, +167.969f,32.1522f,-42.9688f, +171.875f,30.9698f,-42.9688f, +175.781f,29.7186f,-42.9688f, +179.688f,28.0509f,-42.9688f, +183.594f,25.8254f,-42.9688f, +187.5f,24.8502f,-42.9688f, +191.406f,22.9031f,-42.9688f, +195.313f,20.8135f,-42.9688f, +199.219f,19.6651f,-42.9688f, +203.125f,18.4753f,-42.9688f, +207.031f,17.2259f,-42.9688f, +210.938f,15.6171f,-42.9688f, +214.844f,13.2953f,-42.9688f, +218.75f,13.1679f,-42.9688f, +222.656f,10.7772f,-42.9688f, +226.563f,9.62294f,-42.9688f, +230.469f,9.27609f,-42.9688f, +234.375f,9.47241f,-42.9688f, +238.281f,10.2411f,-42.9688f, +242.188f,11.3745f,-42.9688f, +246.094f,10.981f,-42.9688f, +250.0f,9.93179f,-42.9688f, +3.90625f,58.9086f,-46.875f, +7.8125f,58.895f,-46.875f, +11.7188f,59.1807f,-46.875f, +15.625f,60.2442f,-46.875f, +19.5313f,60.6114f,-46.875f, +23.4375f,59.9439f,-46.875f, +27.3438f,58.704f,-46.875f, +31.25f,58.3729f,-46.875f, +35.1563f,57.0256f,-46.875f, +39.0625f,57.069f,-46.875f, +42.9688f,57.0536f,-46.875f, +46.875f,55.7912f,-46.875f, +50.7813f,54.8674f,-46.875f, +54.6875f,53.8265f,-46.875f, +58.5938f,53.563f,-46.875f, +62.5f,52.5979f,-46.875f, +66.4063f,52.3986f,-46.875f, +70.3125f,52.1891f,-46.875f, +74.2188f,52.2468f,-46.875f, +78.125f,52.3398f,-46.875f, +82.0313f,50.9875f,-46.875f, +85.9375f,49.4072f,-46.875f, +89.8438f,48.3295f,-46.875f, +93.75f,48.9009f,-46.875f, +97.6563f,47.6633f,-46.875f, +101.563f,44.4101f,-46.875f, +105.469f,44.0249f,-46.875f, +109.375f,43.7395f,-46.875f, +113.281f,44.0967f,-46.875f, +117.188f,43.3593f,-46.875f, +121.094f,42.11f,-46.875f, +125.0f,40.8903f,-46.875f, +128.906f,40.3861f,-46.875f, +132.813f,40.075f,-46.875f, +136.719f,39.6347f,-46.875f, +140.625f,38.7369f,-46.875f, +144.531f,37.9042f,-46.875f, +148.438f,36.8546f,-46.875f, +152.344f,36.4012f,-46.875f, +156.25f,35.3977f,-46.875f, +160.156f,34.0947f,-46.875f, +164.063f,32.2545f,-46.875f, +167.969f,30.0086f,-46.875f, +171.875f,29.202f,-46.875f, +175.781f,28.0362f,-46.875f, +179.688f,26.7114f,-46.875f, +183.594f,25.9577f,-46.875f, +187.5f,25.3242f,-46.875f, +191.406f,23.8586f,-46.875f, +195.313f,20.6056f,-46.875f, +199.219f,19.3835f,-46.875f, +203.125f,17.4503f,-46.875f, +207.031f,16.5736f,-46.875f, +210.938f,14.945f,-46.875f, +214.844f,12.5914f,-46.875f, +218.75f,11.835f,-46.875f, +222.656f,10.1636f,-46.875f, +226.563f,9.71281f,-46.875f, +230.469f,9.27988f,-46.875f, +234.375f,8.50394f,-46.875f, +238.281f,9.20978f,-46.875f, +242.188f,9.21707f,-46.875f, +246.094f,9.40089f,-46.875f, +250.0f,8.55411f,-46.875f, +3.90625f,59.8509f,-50.7813f, +7.8125f,59.6141f,-50.7813f, +11.7188f,59.7453f,-50.7813f, +15.625f,60.4259f,-50.7813f, +19.5313f,59.4314f,-50.7813f, +23.4375f,59.033f,-50.7813f, +27.3438f,57.561f,-50.7813f, +31.25f,57.9511f,-50.7813f, +35.1563f,57.0088f,-50.7813f, +39.0625f,56.2469f,-50.7813f, +42.9688f,55.8604f,-50.7813f, +46.875f,55.2326f,-50.7813f, +50.7813f,54.8965f,-50.7813f, +54.6875f,53.1713f,-50.7813f, +58.5938f,52.6122f,-50.7813f, +62.5f,50.9097f,-50.7813f, +66.4063f,50.8144f,-50.7813f, +70.3125f,50.2702f,-50.7813f, +74.2188f,51.4962f,-50.7813f, +78.125f,50.7879f,-50.7813f, +82.0313f,49.5502f,-50.7813f, +85.9375f,48.3386f,-50.7813f, +89.8438f,48.0143f,-50.7813f, +93.75f,46.7527f,-50.7813f, +97.6563f,45.5374f,-50.7813f, +101.563f,44.3542f,-50.7813f, +105.469f,44.8366f,-50.7813f, +109.375f,45.0192f,-50.7813f, +113.281f,44.4763f,-50.7813f, +117.188f,43.4751f,-50.7813f, +121.094f,42.029f,-50.7813f, +125.0f,40.9708f,-50.7813f, +128.906f,40.3658f,-50.7813f, +132.813f,40.0768f,-50.7813f, +136.719f,40.0333f,-50.7813f, +140.625f,38.2667f,-50.7813f, +144.531f,36.5326f,-50.7813f, +148.438f,35.8183f,-50.7813f, +152.344f,35.3934f,-50.7813f, +156.25f,34.9787f,-50.7813f, +160.156f,33.4969f,-50.7813f, +164.063f,31.7517f,-50.7813f, +167.969f,29.499f,-50.7813f, +171.875f,27.1729f,-50.7813f, +175.781f,25.4931f,-50.7813f, +179.688f,25.2745f,-50.7813f, +183.594f,25.2315f,-50.7813f, +187.5f,24.531f,-50.7813f, +191.406f,23.4387f,-50.7813f, +195.313f,21.3665f,-50.7813f, +199.219f,19.2834f,-50.7813f, +203.125f,17.7694f,-50.7813f, +207.031f,16.0247f,-50.7813f, +210.938f,13.9451f,-50.7813f, +214.844f,12.3369f,-50.7813f, +218.75f,10.9033f,-50.7813f, +222.656f,10.0734f,-50.7813f, +226.563f,9.08212f,-50.7813f, +230.469f,9.04527f,-50.7813f, +234.375f,8.83458f,-50.7813f, +238.281f,9.03578f,-50.7813f, +242.188f,9.06782f,-50.7813f, +246.094f,9.03068f,-50.7813f, +250.0f,9.66685f,-50.7813f, +3.90625f,60.3928f,-54.6875f, +7.8125f,60.9235f,-54.6875f, +11.7188f,60.8946f,-54.6875f, +15.625f,60.5131f,-54.6875f, +19.5313f,58.455f,-54.6875f, +23.4375f,57.9712f,-54.6875f, +27.3438f,57.0716f,-54.6875f, +31.25f,56.9372f,-54.6875f, +35.1563f,57.5607f,-54.6875f, +39.0625f,56.6778f,-54.6875f, +42.9688f,56.24f,-54.6875f, +46.875f,55.0661f,-54.6875f, +50.7813f,54.3546f,-54.6875f, +54.6875f,52.1641f,-54.6875f, +58.5938f,51.2643f,-54.6875f, +62.5f,49.4484f,-54.6875f, +66.4063f,48.4401f,-54.6875f, +70.3125f,48.0181f,-54.6875f, +74.2188f,48.8036f,-54.6875f, +78.125f,48.2106f,-54.6875f, +82.0313f,47.8181f,-54.6875f, +85.9375f,47.3982f,-54.6875f, +89.8438f,46.4776f,-54.6875f, +93.75f,45.3848f,-54.6875f, +97.6563f,44.5336f,-54.6875f, +101.563f,45.1445f,-54.6875f, +105.469f,45.5775f,-54.6875f, +109.375f,45.4274f,-54.6875f, +113.281f,44.4184f,-54.6875f, +117.188f,43.6208f,-54.6875f, +121.094f,43.0133f,-54.6875f, +125.0f,41.2193f,-54.6875f, +128.906f,40.0465f,-54.6875f, +132.813f,40.3451f,-54.6875f, +136.719f,39.4272f,-54.6875f, +140.625f,37.2935f,-54.6875f, +144.531f,35.9597f,-54.6875f, +148.438f,34.766f,-54.6875f, +152.344f,33.3503f,-54.6875f, +156.25f,33.6732f,-54.6875f, +160.156f,32.5764f,-54.6875f, +164.063f,30.6942f,-54.6875f, +167.969f,28.8727f,-54.6875f, +171.875f,26.8203f,-54.6875f, +175.781f,24.7162f,-54.6875f, +179.688f,23.5533f,-54.6875f, +183.594f,23.5154f,-54.6875f, +187.5f,23.3554f,-54.6875f, +191.406f,22.7735f,-54.6875f, +195.313f,22.2741f,-54.6875f, +199.219f,20.9717f,-54.6875f, +203.125f,18.5469f,-54.6875f, +207.031f,16.0531f,-54.6875f, +210.938f,13.6058f,-54.6875f, +214.844f,11.0674f,-54.6875f, +218.75f,9.89862f,-54.6875f, +222.656f,9.6172f,-54.6875f, +226.563f,8.63026f,-54.6875f, +230.469f,8.95799f,-54.6875f, +234.375f,8.84522f,-54.6875f, +238.281f,8.9176f,-54.6875f, +242.188f,9.19248f,-54.6875f, +246.094f,9.16691f,-54.6875f, +250.0f,9.42022f,-54.6875f, +3.90625f,61.5747f,-58.5938f, +7.8125f,61.244f,-58.5938f, +11.7188f,60.3982f,-58.5938f, +15.625f,59.4267f,-58.5938f, +19.5313f,58.5294f,-58.5938f, +23.4375f,56.6412f,-58.5938f, +27.3438f,56.0648f,-58.5938f, +31.25f,56.4883f,-58.5938f, +35.1563f,56.5562f,-58.5938f, +39.0625f,56.745f,-58.5938f, +42.9688f,55.6505f,-58.5938f, +46.875f,54.6622f,-58.5938f, +50.7813f,53.7206f,-58.5938f, +54.6875f,51.9309f,-58.5938f, +58.5938f,50.4214f,-58.5938f, +62.5f,48.4353f,-58.5938f, +66.4063f,47.1373f,-58.5938f, +70.3125f,46.0037f,-58.5938f, +74.2188f,45.9795f,-58.5938f, +78.125f,45.2396f,-58.5938f, +82.0313f,45.264f,-58.5938f, +85.9375f,45.2603f,-58.5938f, +89.8438f,45.3076f,-58.5938f, +93.75f,44.8744f,-58.5938f, +97.6563f,44.3646f,-58.5938f, +101.563f,45.1043f,-58.5938f, +105.469f,45.6336f,-58.5938f, +109.375f,44.6129f,-58.5938f, +113.281f,44.3333f,-58.5938f, +117.188f,44.3267f,-58.5938f, +121.094f,42.9064f,-58.5938f, +125.0f,40.63f,-58.5938f, +128.906f,41.2828f,-58.5938f, +132.813f,40.2801f,-58.5938f, +136.719f,39.4089f,-58.5938f, +140.625f,37.0919f,-58.5938f, +144.531f,34.889f,-58.5938f, +148.438f,32.5161f,-58.5938f, +152.344f,31.9597f,-58.5938f, +156.25f,31.5986f,-58.5938f, +160.156f,31.1966f,-58.5938f, +164.063f,30.4149f,-58.5938f, +167.969f,29.0304f,-58.5938f, +171.875f,27.2929f,-58.5938f, +175.781f,26.0835f,-58.5938f, +179.688f,24.7373f,-58.5938f, +183.594f,23.6409f,-58.5938f, +187.5f,23.3059f,-58.5938f, +191.406f,22.8781f,-58.5938f, +195.313f,22.319f,-58.5938f, +199.219f,21.2986f,-58.5938f, +203.125f,19.8613f,-58.5938f, +207.031f,16.8941f,-58.5938f, +210.938f,13.7519f,-58.5938f, +214.844f,11.895f,-58.5938f, +218.75f,9.64673f,-58.5938f, +222.656f,9.27102f,-58.5938f, +226.563f,9.40316f,-58.5938f, +230.469f,8.90628f,-58.5938f, +234.375f,8.63691f,-58.5938f, +238.281f,9.10736f,-58.5938f, +242.188f,9.6506f,-58.5938f, +246.094f,9.20945f,-58.5938f, +250.0f,10.1973f,-58.5938f, +3.90625f,62.1111f,-62.5f, +7.8125f,60.6401f,-62.5f, +11.7188f,59.5734f,-62.5f, +15.625f,59.219f,-62.5f, +19.5313f,57.489f,-62.5f, +23.4375f,55.7813f,-62.5f, +27.3438f,55.9775f,-62.5f, +31.25f,55.9857f,-62.5f, +35.1563f,55.7053f,-62.5f, +39.0625f,55.9712f,-62.5f, +42.9688f,54.6904f,-62.5f, +46.875f,53.8065f,-62.5f, +50.7813f,52.4182f,-62.5f, +54.6875f,50.8531f,-62.5f, +58.5938f,49.1994f,-62.5f, +62.5f,47.7017f,-62.5f, +66.4063f,45.469f,-62.5f, +70.3125f,44.3384f,-62.5f, +74.2188f,43.2272f,-62.5f, +78.125f,43.8591f,-62.5f, +82.0313f,44.3452f,-62.5f, +85.9375f,44.3048f,-62.5f, +89.8438f,44.2242f,-62.5f, +93.75f,44.0587f,-62.5f, +97.6563f,43.7317f,-62.5f, +101.563f,44.5392f,-62.5f, +105.469f,44.5257f,-62.5f, +109.375f,43.5595f,-62.5f, +113.281f,44.5114f,-62.5f, +117.188f,43.2895f,-62.5f, +121.094f,41.6188f,-62.5f, +125.0f,39.9989f,-62.5f, +128.906f,40.9613f,-62.5f, +132.813f,39.8454f,-62.5f, +136.719f,38.9499f,-62.5f, +140.625f,36.7405f,-62.5f, +144.531f,34.8983f,-62.5f, +148.438f,33.5172f,-62.5f, +152.344f,31.5497f,-62.5f, +156.25f,31.3001f,-62.5f, +160.156f,30.8035f,-62.5f, +164.063f,30.3361f,-62.5f, +167.969f,29.7129f,-62.5f, +171.875f,28.9356f,-62.5f, +175.781f,27.3605f,-62.5f, +179.688f,26.5354f,-62.5f, +183.594f,25.1923f,-62.5f, +187.5f,23.8745f,-62.5f, +191.406f,22.6444f,-62.5f, +195.313f,22.0412f,-62.5f, +199.219f,20.9675f,-62.5f, +203.125f,18.5243f,-62.5f, +207.031f,15.5154f,-62.5f, +210.938f,13.2419f,-62.5f, +214.844f,11.0082f,-62.5f, +218.75f,9.92645f,-62.5f, +222.656f,9.66787f,-62.5f, +226.563f,10.141f,-62.5f, +230.469f,9.5559f,-62.5f, +234.375f,8.93799f,-62.5f, +238.281f,9.36179f,-62.5f, +242.188f,9.32325f,-62.5f, +246.094f,9.89448f,-62.5f, +250.0f,11.3062f,-62.5f, +3.90625f,60.8569f,-66.4063f, +7.8125f,59.3087f,-66.4063f, +11.7188f,58.6192f,-66.4063f, +15.625f,57.567f,-66.4063f, +19.5313f,54.6351f,-66.4063f, +23.4375f,53.6183f,-66.4063f, +27.3438f,54.0844f,-66.4063f, +31.25f,54.4962f,-66.4063f, +35.1563f,53.9539f,-66.4063f, +39.0625f,53.4324f,-66.4063f, +42.9688f,52.6655f,-66.4063f, +46.875f,51.9681f,-66.4063f, +50.7813f,51.1623f,-66.4063f, +54.6875f,50.0114f,-66.4063f, +58.5938f,47.9598f,-66.4063f, +62.5f,46.2999f,-66.4063f, +66.4063f,44.4466f,-66.4063f, +70.3125f,42.2001f,-66.4063f, +74.2188f,41.2192f,-66.4063f, +78.125f,41.7209f,-66.4063f, +82.0313f,42.7363f,-66.4063f, +85.9375f,42.9552f,-66.4063f, +89.8438f,43.0346f,-66.4063f, +93.75f,43.4604f,-66.4063f, +97.6563f,42.6437f,-66.4063f, +101.563f,42.6894f,-66.4063f, +105.469f,43.1054f,-66.4063f, +109.375f,42.7138f,-66.4063f, +113.281f,42.4744f,-66.4063f, +117.188f,42.2299f,-66.4063f, +121.094f,41.2421f,-66.4063f, +125.0f,40.3737f,-66.4063f, +128.906f,40.1758f,-66.4063f, +132.813f,39.5421f,-66.4063f, +136.719f,39.0437f,-66.4063f, +140.625f,37.1531f,-66.4063f, +144.531f,34.9841f,-66.4063f, +148.438f,33.2713f,-66.4063f, +152.344f,32.4185f,-66.4063f, +156.25f,31.779f,-66.4063f, +160.156f,30.7377f,-66.4063f, +164.063f,30.5524f,-66.4063f, +167.969f,29.5693f,-66.4063f, +171.875f,28.9756f,-66.4063f, +175.781f,27.4499f,-66.4063f, +179.688f,26.7907f,-66.4063f, +183.594f,25.5886f,-66.4063f, +187.5f,24.2807f,-66.4063f, +191.406f,22.1754f,-66.4063f, +195.313f,20.7766f,-66.4063f, +199.219f,19.914f,-66.4063f, +203.125f,17.149f,-66.4063f, +207.031f,14.0043f,-66.4063f, +210.938f,11.404f,-66.4063f, +214.844f,10.0012f,-66.4063f, +218.75f,8.65109f,-66.4063f, +222.656f,9.38897f,-66.4063f, +226.563f,9.4612f,-66.4063f, +230.469f,8.86613f,-66.4063f, +234.375f,8.68429f,-66.4063f, +238.281f,9.75985f,-66.4063f, +242.188f,10.3807f,-66.4063f, +246.094f,10.966f,-66.4063f, +250.0f,11.4354f,-66.4063f, +3.90625f,59.1482f,-70.3125f, +7.8125f,57.7892f,-70.3125f, +11.7188f,55.5839f,-70.3125f, +15.625f,54.3451f,-70.3125f, +19.5313f,52.0576f,-70.3125f, +23.4375f,50.5935f,-70.3125f, +27.3438f,50.8648f,-70.3125f, +31.25f,51.3182f,-70.3125f, +35.1563f,51.6726f,-70.3125f, +39.0625f,51.1264f,-70.3125f, +42.9688f,51.6239f,-70.3125f, +46.875f,49.728f,-70.3125f, +50.7813f,48.7924f,-70.3125f, +54.6875f,47.3884f,-70.3125f, +58.5938f,46.4477f,-70.3125f, +62.5f,45.2447f,-70.3125f, +66.4063f,42.8677f,-70.3125f, +70.3125f,40.9023f,-70.3125f, +74.2188f,39.5284f,-70.3125f, +78.125f,39.6524f,-70.3125f, +82.0313f,40.5173f,-70.3125f, +85.9375f,41.0204f,-70.3125f, +89.8438f,41.9366f,-70.3125f, +93.75f,42.1341f,-70.3125f, +97.6563f,41.4699f,-70.3125f, +101.563f,40.6754f,-70.3125f, +105.469f,41.2206f,-70.3125f, +109.375f,40.9668f,-70.3125f, +113.281f,41.1079f,-70.3125f, +117.188f,40.7056f,-70.3125f, +121.094f,39.8305f,-70.3125f, +125.0f,40.959f,-70.3125f, +128.906f,41.7481f,-70.3125f, +132.813f,41.1255f,-70.3125f, +136.719f,39.8634f,-70.3125f, +140.625f,37.8454f,-70.3125f, +144.531f,35.3914f,-70.3125f, +148.438f,33.8462f,-70.3125f, +152.344f,33.0994f,-70.3125f, +156.25f,32.4757f,-70.3125f, +160.156f,31.4779f,-70.3125f, +164.063f,29.4211f,-70.3125f, +167.969f,28.0779f,-70.3125f, +171.875f,27.802f,-70.3125f, +175.781f,26.7406f,-70.3125f, +179.688f,25.4777f,-70.3125f, +183.594f,24.7569f,-70.3125f, +187.5f,22.9331f,-70.3125f, +191.406f,21.2419f,-70.3125f, +195.313f,19.5082f,-70.3125f, +199.219f,17.6022f,-70.3125f, +203.125f,15.316f,-70.3125f, +207.031f,12.7546f,-70.3125f, +210.938f,10.3646f,-70.3125f, +214.844f,8.2502f,-70.3125f, +218.75f,8.14317f,-70.3125f, +222.656f,8.65089f,-70.3125f, +226.563f,8.60005f,-70.3125f, +230.469f,8.58165f,-70.3125f, +234.375f,9.40162f,-70.3125f, +238.281f,9.96281f,-70.3125f, +242.188f,9.81934f,-70.3125f, +246.094f,10.3078f,-70.3125f, +250.0f,10.4404f,-70.3125f, +3.90625f,56.5167f,-74.2188f, +7.8125f,55.7237f,-74.2188f, +11.7188f,53.4039f,-74.2188f, +15.625f,51.0313f,-74.2188f, +19.5313f,49.1141f,-74.2188f, +23.4375f,47.8398f,-74.2188f, +27.3438f,47.778f,-74.2188f, +31.25f,48.3917f,-74.2188f, +35.1563f,48.2503f,-74.2188f, +39.0625f,49.1497f,-74.2188f, +42.9688f,48.8224f,-74.2188f, +46.875f,47.4358f,-74.2188f, +50.7813f,47.051f,-74.2188f, +54.6875f,45.4218f,-74.2188f, +58.5938f,44.3385f,-74.2188f, +62.5f,42.9758f,-74.2188f, +66.4063f,41.4743f,-74.2188f, +70.3125f,39.4251f,-74.2188f, +74.2188f,37.5972f,-74.2188f, +78.125f,37.8246f,-74.2188f, +82.0313f,38.9578f,-74.2188f, +85.9375f,40.148f,-74.2188f, +89.8438f,41.1035f,-74.2188f, +93.75f,40.631f,-74.2188f, +97.6563f,40.0863f,-74.2188f, +101.563f,40.3273f,-74.2188f, +105.469f,40.0413f,-74.2188f, +109.375f,40.0514f,-74.2188f, +113.281f,39.4849f,-74.2188f, +117.188f,39.5903f,-74.2188f, +121.094f,40.1543f,-74.2188f, +125.0f,40.3424f,-74.2188f, +128.906f,41.779f,-74.2188f, +132.813f,41.4976f,-74.2188f, +136.719f,41.1475f,-74.2188f, +140.625f,38.8105f,-74.2188f, +144.531f,35.834f,-74.2188f, +148.438f,34.6385f,-74.2188f, +152.344f,33.7088f,-74.2188f, +156.25f,32.7137f,-74.2188f, +160.156f,30.7745f,-74.2188f, +164.063f,28.172f,-74.2188f, +167.969f,27.1433f,-74.2188f, +171.875f,26.7248f,-74.2188f, +175.781f,25.7807f,-74.2188f, +179.688f,24.8758f,-74.2188f, +183.594f,23.4994f,-74.2188f, +187.5f,23.3209f,-74.2188f, +191.406f,22.3523f,-74.2188f, +195.313f,20.3275f,-74.2188f, +199.219f,17.2927f,-74.2188f, +203.125f,15.0486f,-74.2188f, +207.031f,12.2721f,-74.2188f, +210.938f,9.60109f,-74.2188f, +214.844f,7.36411f,-74.2188f, +218.75f,7.27514f,-74.2188f, +222.656f,8.35951f,-74.2188f, +226.563f,8.18334f,-74.2188f, +230.469f,8.98708f,-74.2188f, +234.375f,8.98011f,-74.2188f, +238.281f,9.03329f,-74.2188f, +242.188f,8.88664f,-74.2188f, +246.094f,8.62938f,-74.2188f, +250.0f,9.6823f,-74.2188f, +3.90625f,54.4402f,-78.125f, +7.8125f,53.0525f,-78.125f, +11.7188f,51.2204f,-78.125f, +15.625f,48.7251f,-78.125f, +19.5313f,45.9841f,-78.125f, +23.4375f,45.0227f,-78.125f, +27.3438f,45.3099f,-78.125f, +31.25f,45.9225f,-78.125f, +35.1563f,46.8025f,-78.125f, +39.0625f,46.8434f,-78.125f, +42.9688f,46.0024f,-78.125f, +46.875f,45.6669f,-78.125f, +50.7813f,45.4624f,-78.125f, +54.6875f,43.4573f,-78.125f, +58.5938f,42.1273f,-78.125f, +62.5f,41.0088f,-78.125f, +66.4063f,38.8967f,-78.125f, +70.3125f,38.002f,-78.125f, +74.2188f,36.5282f,-78.125f, +78.125f,37.0499f,-78.125f, +82.0313f,37.3419f,-78.125f, +85.9375f,38.6056f,-78.125f, +89.8438f,39.7527f,-78.125f, +93.75f,40.3513f,-78.125f, +97.6563f,40.6919f,-78.125f, +101.563f,40.7736f,-78.125f, +105.469f,40.3007f,-78.125f, +109.375f,39.3023f,-78.125f, +113.281f,39.1369f,-78.125f, +117.188f,39.884f,-78.125f, +121.094f,40.5674f,-78.125f, +125.0f,40.8192f,-78.125f, +128.906f,41.893f,-78.125f, +132.813f,42.3647f,-78.125f, +136.719f,41.2455f,-78.125f, +140.625f,38.7064f,-78.125f, +144.531f,36.9679f,-78.125f, +148.438f,36.03f,-78.125f, +152.344f,33.9946f,-78.125f, +156.25f,32.2274f,-78.125f, +160.156f,30.474f,-78.125f, +164.063f,28.4739f,-78.125f, +167.969f,27.222f,-78.125f, +171.875f,26.6935f,-78.125f, +175.781f,25.0624f,-78.125f, +179.688f,24.162f,-78.125f, +183.594f,24.0176f,-78.125f, +187.5f,24.0379f,-78.125f, +191.406f,22.4301f,-78.125f, +195.313f,19.7078f,-78.125f, +199.219f,17.0911f,-78.125f, +203.125f,14.784f,-78.125f, +207.031f,11.8835f,-78.125f, +210.938f,9.34715f,-78.125f, +214.844f,7.23075f,-78.125f, +218.75f,7.91637f,-78.125f, +222.656f,8.69702f,-78.125f, +226.563f,8.56112f,-78.125f, +230.469f,9.86446f,-78.125f, +234.375f,9.26431f,-78.125f, +238.281f,8.47473f,-78.125f, +242.188f,7.8386f,-78.125f, +246.094f,7.82236f,-78.125f, +250.0f,8.68625f,-78.125f, +3.90625f,51.949f,-82.0313f, +7.8125f,50.1159f,-82.0313f, +11.7188f,48.9067f,-82.0313f, +15.625f,46.6417f,-82.0313f, +19.5313f,44.5725f,-82.0313f, +23.4375f,43.435f,-82.0313f, +27.3438f,43.6749f,-82.0313f, +31.25f,44.8399f,-82.0313f, +35.1563f,45.0253f,-82.0313f, +39.0625f,44.7335f,-82.0313f, +42.9688f,44.4485f,-82.0313f, +46.875f,44.8284f,-82.0313f, +50.7813f,43.5547f,-82.0313f, +54.6875f,41.2266f,-82.0313f, +58.5938f,40.4716f,-82.0313f, +62.5f,38.4361f,-82.0313f, +66.4063f,36.3554f,-82.0313f, +70.3125f,35.5722f,-82.0313f, +74.2188f,35.0069f,-82.0313f, +78.125f,35.8289f,-82.0313f, +82.0313f,37.0933f,-82.0313f, +85.9375f,38.1008f,-82.0313f, +89.8438f,38.9582f,-82.0313f, +93.75f,40.0751f,-82.0313f, +97.6563f,40.3989f,-82.0313f, +101.563f,40.2487f,-82.0313f, +105.469f,39.9234f,-82.0313f, +109.375f,40.0277f,-82.0313f, +113.281f,40.6647f,-82.0313f, +117.188f,40.69f,-82.0313f, +121.094f,40.7857f,-82.0313f, +125.0f,41.5688f,-82.0313f, +128.906f,41.836f,-82.0313f, +132.813f,41.6054f,-82.0313f, +136.719f,39.6237f,-82.0313f, +140.625f,38.6765f,-82.0313f, +144.531f,36.9959f,-82.0313f, +148.438f,35.8215f,-82.0313f, +152.344f,34.799f,-82.0313f, +156.25f,33.2398f,-82.0313f, +160.156f,30.7864f,-82.0313f, +164.063f,28.6776f,-82.0313f, +167.969f,26.6558f,-82.0313f, +171.875f,25.8282f,-82.0313f, +175.781f,24.7932f,-82.0313f, +179.688f,22.3283f,-82.0313f, +183.594f,23.1666f,-82.0313f, +187.5f,23.1721f,-82.0313f, +191.406f,21.3358f,-82.0313f, +195.313f,18.8226f,-82.0313f, +199.219f,16.5471f,-82.0313f, +203.125f,14.4667f,-82.0313f, +207.031f,11.1533f,-82.0313f, +210.938f,8.28389f,-82.0313f, +214.844f,8.02411f,-82.0313f, +218.75f,8.03784f,-82.0313f, +222.656f,8.27638f,-82.0313f, +226.563f,8.14824f,-82.0313f, +230.469f,8.45286f,-82.0313f, +234.375f,8.21959f,-82.0313f, +238.281f,8.25224f,-82.0313f, +242.188f,7.67129f,-82.0313f, +246.094f,8.04143f,-82.0313f, +250.0f,8.6199f,-82.0313f, +3.90625f,50.007f,-85.9375f, +7.8125f,48.4593f,-85.9375f, +11.7188f,46.0233f,-85.9375f, +15.625f,44.0556f,-85.9375f, +19.5313f,42.3324f,-85.9375f, +23.4375f,41.8982f,-85.9375f, +27.3438f,42.3931f,-85.9375f, +31.25f,43.1153f,-85.9375f, +35.1563f,43.1285f,-85.9375f, +39.0625f,43.422f,-85.9375f, +42.9688f,43.5417f,-85.9375f, +46.875f,42.2294f,-85.9375f, +50.7813f,40.9068f,-85.9375f, +54.6875f,39.4177f,-85.9375f, +58.5938f,37.2575f,-85.9375f, +62.5f,35.2254f,-85.9375f, +66.4063f,33.8821f,-85.9375f, +70.3125f,33.1531f,-85.9375f, +74.2188f,34.2747f,-85.9375f, +78.125f,35.599f,-85.9375f, +82.0313f,37.007f,-85.9375f, +85.9375f,37.5018f,-85.9375f, +89.8438f,38.1376f,-85.9375f, +93.75f,38.9449f,-85.9375f, +97.6563f,38.9221f,-85.9375f, +101.563f,38.8555f,-85.9375f, +105.469f,39.5572f,-85.9375f, +109.375f,40.1231f,-85.9375f, +113.281f,40.7416f,-85.9375f, +117.188f,40.3888f,-85.9375f, +121.094f,40.6715f,-85.9375f, +125.0f,40.7246f,-85.9375f, +128.906f,40.6124f,-85.9375f, +132.813f,39.685f,-85.9375f, +136.719f,39.2043f,-85.9375f, +140.625f,38.1816f,-85.9375f, +144.531f,36.598f,-85.9375f, +148.438f,36.2907f,-85.9375f, +152.344f,34.8832f,-85.9375f, +156.25f,33.4024f,-85.9375f, +160.156f,31.2463f,-85.9375f, +164.063f,29.1669f,-85.9375f, +167.969f,26.7298f,-85.9375f, +171.875f,24.3407f,-85.9375f, +175.781f,23.4854f,-85.9375f, +179.688f,21.3474f,-85.9375f, +183.594f,21.2953f,-85.9375f, +187.5f,21.7398f,-85.9375f, +191.406f,20.4218f,-85.9375f, +195.313f,17.9433f,-85.9375f, +199.219f,15.3133f,-85.9375f, +203.125f,13.0586f,-85.9375f, +207.031f,9.24996f,-85.9375f, +210.938f,7.18408f,-85.9375f, +214.844f,7.59758f,-85.9375f, +218.75f,8.04641f,-85.9375f, +222.656f,8.01634f,-85.9375f, +226.563f,7.95015f,-85.9375f, +230.469f,7.86343f,-85.9375f, +234.375f,6.21751f,-85.9375f, +238.281f,7.40112f,-85.9375f, +242.188f,7.60481f,-85.9375f, +246.094f,6.77129f,-85.9375f, +250.0f,7.87753f,-85.9375f, +3.90625f,47.6596f,-89.8438f, +7.8125f,45.9136f,-89.8438f, +11.7188f,44.0495f,-89.8438f, +15.625f,42.5127f,-89.8438f, +19.5313f,41.5996f,-89.8438f, +23.4375f,41.2638f,-89.8438f, +27.3438f,41.2672f,-89.8438f, +31.25f,41.5402f,-89.8438f, +35.1563f,42.558f,-89.8438f, +39.0625f,42.49f,-89.8438f, +42.9688f,42.2839f,-89.8438f, +46.875f,40.9401f,-89.8438f, +50.7813f,38.7346f,-89.8438f, +54.6875f,36.624f,-89.8438f, +58.5938f,35.1978f,-89.8438f, +62.5f,34.9272f,-89.8438f, +66.4063f,32.893f,-89.8438f, +70.3125f,32.4101f,-89.8438f, +74.2188f,33.9814f,-89.8438f, +78.125f,35.8825f,-89.8438f, +82.0313f,37.1245f,-89.8438f, +85.9375f,37.3954f,-89.8438f, +89.8438f,38.0118f,-89.8438f, +93.75f,37.5426f,-89.8438f, +97.6563f,38.0776f,-89.8438f, +101.563f,37.9785f,-89.8438f, +105.469f,38.6389f,-89.8438f, +109.375f,39.284f,-89.8438f, +113.281f,40.0027f,-89.8438f, +117.188f,41.2412f,-89.8438f, +121.094f,41.2301f,-89.8438f, +125.0f,40.7611f,-89.8438f, +128.906f,39.7426f,-89.8438f, +132.813f,39.1387f,-89.8438f, +136.719f,38.499f,-89.8438f, +140.625f,37.714f,-89.8438f, +144.531f,36.6379f,-89.8438f, +148.438f,36.1196f,-89.8438f, +152.344f,35.7001f,-89.8438f, +156.25f,33.9038f,-89.8438f, +160.156f,32.0706f,-89.8438f, +164.063f,29.746f,-89.8438f, +167.969f,26.4482f,-89.8438f, +171.875f,23.8046f,-89.8438f, +175.781f,21.9675f,-89.8438f, +179.688f,20.7011f,-89.8438f, +183.594f,20.6699f,-89.8438f, +187.5f,20.1508f,-89.8438f, +191.406f,17.8245f,-89.8438f, +195.313f,16.2785f,-89.8438f, +199.219f,13.4596f,-89.8438f, +203.125f,9.54647f,-89.8438f, +207.031f,6.02727f,-89.8438f, +210.938f,5.88903f,-89.8438f, +214.844f,6.47568f,-89.8438f, +218.75f,6.20004f,-89.8438f, +222.656f,6.0849f,-89.8438f, +226.563f,6.84648f,-89.8438f, +230.469f,6.3424f,-89.8438f, +234.375f,5.81853f,-89.8438f, +238.281f,5.89205f,-89.8438f, +242.188f,6.84078f,-89.8438f, +246.094f,6.32426f,-89.8438f, +250.0f,6.29368f,-89.8438f, +3.90625f,45.4182f,-93.75f, +7.8125f,44.5664f,-93.75f, +11.7188f,44.0207f,-93.75f, +15.625f,42.2553f,-93.75f, +19.5313f,40.8951f,-93.75f, +23.4375f,40.7665f,-93.75f, +27.3438f,40.5756f,-93.75f, +31.25f,41.2988f,-93.75f, +35.1563f,40.6862f,-93.75f, +39.0625f,40.6007f,-93.75f, +42.9688f,39.5329f,-93.75f, +46.875f,38.2364f,-93.75f, +50.7813f,36.1442f,-93.75f, +54.6875f,34.7353f,-93.75f, +58.5938f,34.4214f,-93.75f, +62.5f,33.9528f,-93.75f, +66.4063f,32.4931f,-93.75f, +70.3125f,32.5145f,-93.75f, +74.2188f,33.393f,-93.75f, +78.125f,34.9658f,-93.75f, +82.0313f,36.3611f,-93.75f, +85.9375f,37.568f,-93.75f, +89.8438f,37.012f,-93.75f, +93.75f,37.6392f,-93.75f, +97.6563f,38.4371f,-93.75f, +101.563f,38.3719f,-93.75f, +105.469f,39.1179f,-93.75f, +109.375f,38.5168f,-93.75f, +113.281f,40.0403f,-93.75f, +117.188f,40.2277f,-93.75f, +121.094f,40.8985f,-93.75f, +125.0f,40.189f,-93.75f, +128.906f,39.9435f,-93.75f, +132.813f,39.6824f,-93.75f, +136.719f,38.844f,-93.75f, +140.625f,37.4579f,-93.75f, +144.531f,36.8375f,-93.75f, +148.438f,36.2601f,-93.75f, +152.344f,35.6484f,-93.75f, +156.25f,34.179f,-93.75f, +160.156f,32.0651f,-93.75f, +164.063f,28.6431f,-93.75f, +167.969f,25.1239f,-93.75f, +171.875f,22.4459f,-93.75f, +175.781f,19.5301f,-93.75f, +179.688f,18.4371f,-93.75f, +183.594f,18.6076f,-93.75f, +187.5f,17.488f,-93.75f, +191.406f,15.1604f,-93.75f, +195.313f,13.0197f,-93.75f, +199.219f,9.4702f,-93.75f, +203.125f,5.597f,-93.75f, +207.031f,3.59409f,-93.75f, +210.938f,4.28966f,-93.75f, +214.844f,4.21811f,-93.75f, +218.75f,4.11546f,-93.75f, +222.656f,5.40815f,-93.75f, +226.563f,5.56249f,-93.75f, +230.469f,5.35075f,-93.75f, +234.375f,5.24306f,-93.75f, +238.281f,4.85548f,-93.75f, +242.188f,5.02825f,-93.75f, +246.094f,5.32318f,-93.75f, +250.0f,5.59512f,-93.75f, +3.90625f,44.9637f,-97.6563f, +7.8125f,44.7813f,-97.6563f, +11.7188f,43.457f,-97.6563f, +15.625f,42.5329f,-97.6563f, +19.5313f,40.506f,-97.6563f, +23.4375f,39.8146f,-97.6563f, +27.3438f,40.2245f,-97.6563f, +31.25f,39.497f,-97.6563f, +35.1563f,38.8152f,-97.6563f, +39.0625f,38.3406f,-97.6563f, +42.9688f,37.57f,-97.6563f, +46.875f,36.3128f,-97.6563f, +50.7813f,34.2277f,-97.6563f, +54.6875f,33.3395f,-97.6563f, +58.5938f,32.972f,-97.6563f, +62.5f,32.6315f,-97.6563f, +66.4063f,32.4796f,-97.6563f, +70.3125f,31.6472f,-97.6563f, +74.2188f,32.2256f,-97.6563f, +78.125f,33.8073f,-97.6563f, +82.0313f,35.7591f,-97.6563f, +85.9375f,36.5001f,-97.6563f, +89.8438f,36.9113f,-97.6563f, +93.75f,37.6902f,-97.6563f, +97.6563f,37.9643f,-97.6563f, +101.563f,38.9556f,-97.6563f, +105.469f,39.6823f,-97.6563f, +109.375f,38.9917f,-97.6563f, +113.281f,40.0872f,-97.6563f, +117.188f,40.44f,-97.6563f, +121.094f,39.6877f,-97.6563f, +125.0f,39.0011f,-97.6563f, +128.906f,39.8735f,-97.6563f, +132.813f,39.5503f,-97.6563f, +136.719f,37.743f,-97.6563f, +140.625f,36.4691f,-97.6563f, +144.531f,36.1765f,-97.6563f, +148.438f,35.9476f,-97.6563f, +152.344f,35.1141f,-97.6563f, +156.25f,33.2516f,-97.6563f, +160.156f,30.654f,-97.6563f, +164.063f,27.2318f,-97.6563f, +167.969f,23.3975f,-97.6563f, +171.875f,20.6722f,-97.6563f, +175.781f,18.394f,-97.6563f, +179.688f,17.6475f,-97.6563f, +183.594f,16.1037f,-97.6563f, +187.5f,14.761f,-97.6563f, +191.406f,12.2456f,-97.6563f, +195.313f,9.43327f,-97.6563f, +199.219f,6.9118f,-97.6563f, +203.125f,4.26334f,-97.6563f, +207.031f,3.47413f,-97.6563f, +210.938f,3.74872f,-97.6563f, +214.844f,3.7631f,-97.6563f, +218.75f,3.80513f,-97.6563f, +222.656f,4.23443f,-97.6563f, +226.563f,3.71016f,-97.6563f, +230.469f,3.772f,-97.6563f, +234.375f,3.80374f,-97.6563f, +238.281f,3.70762f,-97.6563f, +242.188f,4.23931f,-97.6563f, +246.094f,4.40519f,-97.6563f, +250.0f,4.5119f,-97.6563f, +3.90625f,44.5311f,-101.563f, +7.8125f,44.4181f,-101.563f, +11.7188f,43.4864f,-101.563f, +15.625f,42.259f,-101.563f, +19.5313f,41.0558f,-101.563f, +23.4375f,39.9996f,-101.563f, +27.3438f,39.3917f,-101.563f, +31.25f,39.5691f,-101.563f, +35.1563f,37.0889f,-101.563f, +39.0625f,36.4296f,-101.563f, +42.9688f,36.543f,-101.563f, +46.875f,35.4365f,-101.563f, +50.7813f,33.3641f,-101.563f, +54.6875f,32.0629f,-101.563f, +58.5938f,32.175f,-101.563f, +62.5f,32.775f,-101.563f, +66.4063f,31.6335f,-101.563f, +70.3125f,32.1001f,-101.563f, +74.2188f,32.5906f,-101.563f, +78.125f,33.1502f,-101.563f, +82.0313f,35.1972f,-101.563f, +85.9375f,36.0132f,-101.563f, +89.8438f,37.3442f,-101.563f, +93.75f,37.6109f,-101.563f, +97.6563f,38.1601f,-101.563f, +101.563f,39.77f,-101.563f, +105.469f,39.6862f,-101.563f, +109.375f,39.4829f,-101.563f, +113.281f,40.1383f,-101.563f, +117.188f,40.8908f,-101.563f, +121.094f,39.3517f,-101.563f, +125.0f,38.9321f,-101.563f, +128.906f,39.2537f,-101.563f, +132.813f,38.4876f,-101.563f, +136.719f,36.6755f,-101.563f, +140.625f,35.2803f,-101.563f, +144.531f,35.8754f,-101.563f, +148.438f,36.2761f,-101.563f, +152.344f,34.7815f,-101.563f, +156.25f,32.2662f,-101.563f, +160.156f,29.8191f,-101.563f, +164.063f,25.8929f,-101.563f, +167.969f,22.552f,-101.563f, +171.875f,20.3186f,-101.563f, +175.781f,17.2917f,-101.563f, +179.688f,16.8305f,-101.563f, +183.594f,14.7168f,-101.563f, +187.5f,12.0609f,-101.563f, +191.406f,9.91022f,-101.563f, +195.313f,7.22029f,-101.563f, +199.219f,5.48379f,-101.563f, +203.125f,3.03759f,-101.563f, +207.031f,3.02148f,-101.563f, +210.938f,2.88667f,-101.563f, +214.844f,3.08795f,-101.563f, +218.75f,3.43814f,-101.563f, +222.656f,3.58591f,-101.563f, +226.563f,3.17855f,-101.563f, +230.469f,2.48711f,-101.563f, +234.375f,2.66471f,-101.563f, +238.281f,2.06432f,-101.563f, +242.188f,2.49704f,-101.563f, +246.094f,3.05219f,-101.563f, +250.0f,3.69155f,-101.563f, +3.90625f,44.8466f,-105.469f, +7.8125f,44.3102f,-105.469f, +11.7188f,43.8936f,-105.469f, +15.625f,43.2285f,-105.469f, +19.5313f,42.7384f,-105.469f, +23.4375f,41.2954f,-105.469f, +27.3438f,39.4813f,-105.469f, +31.25f,38.4483f,-105.469f, +35.1563f,35.8264f,-105.469f, +39.0625f,35.0991f,-105.469f, +42.9688f,35.1929f,-105.469f, +46.875f,34.3044f,-105.469f, +50.7813f,31.4169f,-105.469f, +54.6875f,30.8206f,-105.469f, +58.5938f,31.2902f,-105.469f, +62.5f,32.2869f,-105.469f, +66.4063f,32.5121f,-105.469f, +70.3125f,32.772f,-105.469f, +74.2188f,32.5422f,-105.469f, +78.125f,34.0506f,-105.469f, +82.0313f,35.4894f,-105.469f, +85.9375f,36.753f,-105.469f, +89.8438f,37.6901f,-105.469f, +93.75f,37.848f,-105.469f, +97.6563f,38.9724f,-105.469f, +101.563f,40.0724f,-105.469f, +105.469f,39.7381f,-105.469f, +109.375f,39.3905f,-105.469f, +113.281f,39.8577f,-105.469f, +117.188f,40.4957f,-105.469f, +121.094f,39.554f,-105.469f, +125.0f,39.0384f,-105.469f, +128.906f,38.2112f,-105.469f, +132.813f,36.7141f,-105.469f, +136.719f,34.736f,-105.469f, +140.625f,34.2236f,-105.469f, +144.531f,35.4181f,-105.469f, +148.438f,35.4456f,-105.469f, +152.344f,33.4389f,-105.469f, +156.25f,29.9708f,-105.469f, +160.156f,27.2392f,-105.469f, +164.063f,24.3409f,-105.469f, +167.969f,22.4438f,-105.469f, +171.875f,19.5326f,-105.469f, +175.781f,16.9951f,-105.469f, +179.688f,14.77f,-105.469f, +183.594f,13.1816f,-105.469f, +187.5f,10.3711f,-105.469f, +191.406f,7.10511f,-105.469f, +195.313f,5.43711f,-105.469f, +199.219f,3.35463f,-105.469f, +203.125f,2.41276f,-105.469f, +207.031f,2.35357f,-105.469f, +210.938f,2.28627f,-105.469f, +214.844f,1.61561f,-105.469f, +218.75f,2.61087f,-105.469f, +222.656f,2.34638f,-105.469f, +226.563f,1.47074f,-105.469f, +230.469f,0.63025f,-105.469f, +234.375f,0.847991f,-105.469f, +238.281f,1.35199f,-105.469f, +242.188f,2.21032f,-105.469f, +246.094f,3.01323f,-105.469f, +250.0f,3.12713f,-105.469f, +3.90625f,45.3987f,-109.375f, +7.8125f,44.6273f,-109.375f, +11.7188f,44.5674f,-109.375f, +15.625f,44.2998f,-109.375f, +19.5313f,43.5383f,-109.375f, +23.4375f,42.0306f,-109.375f, +27.3438f,40.7068f,-109.375f, +31.25f,39.6497f,-109.375f, +35.1563f,36.2161f,-109.375f, +39.0625f,34.8769f,-109.375f, +42.9688f,35.1989f,-109.375f, +46.875f,33.9714f,-109.375f, +50.7813f,30.9979f,-109.375f, +54.6875f,31.9366f,-109.375f, +58.5938f,31.5755f,-109.375f, +62.5f,31.572f,-109.375f, +66.4063f,33.0668f,-109.375f, +70.3125f,33.6444f,-109.375f, +74.2188f,32.5467f,-109.375f, +78.125f,34.2686f,-109.375f, +82.0313f,36.0633f,-109.375f, +85.9375f,37.5569f,-109.375f, +89.8438f,38.5599f,-109.375f, +93.75f,38.6708f,-109.375f, +97.6563f,39.2558f,-109.375f, +101.563f,39.9111f,-109.375f, +105.469f,39.9236f,-109.375f, +109.375f,39.5666f,-109.375f, +113.281f,40.1532f,-109.375f, +117.188f,40.8773f,-109.375f, +121.094f,40.133f,-109.375f, +125.0f,38.348f,-109.375f, +128.906f,36.9174f,-109.375f, +132.813f,34.8975f,-109.375f, +136.719f,32.9097f,-109.375f, +140.625f,32.6666f,-109.375f, +144.531f,33.1207f,-109.375f, +148.438f,32.6024f,-109.375f, +152.344f,31.1149f,-109.375f, +156.25f,27.7885f,-109.375f, +160.156f,24.9665f,-109.375f, +164.063f,22.789f,-109.375f, +167.969f,20.4907f,-109.375f, +171.875f,18.2402f,-109.375f, +175.781f,15.9409f,-109.375f, +179.688f,12.7122f,-109.375f, +183.594f,10.9582f,-109.375f, +187.5f,7.47226f,-109.375f, +191.406f,4.87747f,-109.375f, +195.313f,2.78589f,-109.375f, +199.219f,1.53429f,-109.375f, +203.125f,1.61775f,-109.375f, +207.031f,1.772f,-109.375f, +210.938f,1.15444f,-109.375f, +214.844f,0.342505f,-109.375f, +218.75f,0.510183f,-109.375f, +222.656f,0.254977f,-109.375f, +226.563f,-0.22727f,-109.375f, +230.469f,-0.840625f,-109.375f, +234.375f,-0.282154f,-109.375f, +238.281f,0.424945f,-109.375f, +242.188f,1.73577f,-109.375f, +246.094f,1.80217f,-109.375f, +250.0f,1.60105f,-109.375f, +3.90625f,47.4869f,-113.281f, +7.8125f,46.3185f,-113.281f, +11.7188f,46.4911f,-113.281f, +15.625f,45.2506f,-113.281f, +19.5313f,43.7939f,-113.281f, +23.4375f,42.6062f,-113.281f, +27.3438f,41.6674f,-113.281f, +31.25f,39.5196f,-113.281f, +35.1563f,36.6784f,-113.281f, +39.0625f,35.8546f,-113.281f, +42.9688f,35.2647f,-113.281f, +46.875f,33.0882f,-113.281f, +50.7813f,31.1331f,-113.281f, +54.6875f,31.9095f,-113.281f, +58.5938f,31.5715f,-113.281f, +62.5f,32.3642f,-113.281f, +66.4063f,33.2578f,-113.281f, +70.3125f,33.1847f,-113.281f, +74.2188f,33.6624f,-113.281f, +78.125f,35.6582f,-113.281f, +82.0313f,36.7989f,-113.281f, +85.9375f,37.9951f,-113.281f, +89.8438f,38.7063f,-113.281f, +93.75f,39.9727f,-113.281f, +97.6563f,39.641f,-113.281f, +101.563f,40.1318f,-113.281f, +105.469f,40.117f,-113.281f, +109.375f,40.0678f,-113.281f, +113.281f,40.1534f,-113.281f, +117.188f,40.7841f,-113.281f, +121.094f,39.3312f,-113.281f, +125.0f,38.1823f,-113.281f, +128.906f,37.0921f,-113.281f, +132.813f,34.9687f,-113.281f, +136.719f,32.6631f,-113.281f, +140.625f,30.9601f,-113.281f, +144.531f,31.0644f,-113.281f, +148.438f,29.6495f,-113.281f, +152.344f,27.5095f,-113.281f, +156.25f,24.9361f,-113.281f, +160.156f,22.6206f,-113.281f, +164.063f,20.1136f,-113.281f, +167.969f,17.9862f,-113.281f, +171.875f,16.1252f,-113.281f, +175.781f,14.2991f,-113.281f, +179.688f,11.4262f,-113.281f, +183.594f,8.55749f,-113.281f, +187.5f,6.02067f,-113.281f, +191.406f,3.1883f,-113.281f, +195.313f,1.54808f,-113.281f, +199.219f,0.0223479f,-113.281f, +203.125f,-0.0807506f,-113.281f, +207.031f,-0.420855f,-113.281f, +210.938f,-0.531322f,-113.281f, +214.844f,-1.34393f,-113.281f, +218.75f,-2.28346f,-113.281f, +222.656f,-2.245f,-113.281f, +226.563f,-2.22932f,-113.281f, +230.469f,-1.47268f,-113.281f, +234.375f,-0.543695f,-113.281f, +238.281f,-0.391948f,-113.281f, +242.188f,-0.270077f,-113.281f, +246.094f,-0.650629f,-113.281f, +250.0f,0.111517f,-113.281f, +3.90625f,48.3887f,-117.188f, +7.8125f,48.004f,-117.188f, +11.7188f,46.8723f,-117.188f, +15.625f,45.5005f,-117.188f, +19.5313f,43.3644f,-117.188f, +23.4375f,42.3352f,-117.188f, +27.3438f,41.1562f,-117.188f, +31.25f,39.1736f,-117.188f, +35.1563f,38.0627f,-117.188f, +39.0625f,36.4728f,-117.188f, +42.9688f,34.8001f,-117.188f, +46.875f,32.5103f,-117.188f, +50.7813f,31.6328f,-117.188f, +54.6875f,31.6106f,-117.188f, +58.5938f,32.3004f,-117.188f, +62.5f,32.696f,-117.188f, +66.4063f,33.3795f,-117.188f, +70.3125f,33.9696f,-117.188f, +74.2188f,34.9211f,-117.188f, +78.125f,36.7686f,-117.188f, +82.0313f,37.7676f,-117.188f, +85.9375f,37.8174f,-117.188f, +89.8438f,38.2878f,-117.188f, +93.75f,39.6151f,-117.188f, +97.6563f,39.7422f,-117.188f, +101.563f,40.9611f,-117.188f, +105.469f,40.8932f,-117.188f, +109.375f,40.6603f,-117.188f, +113.281f,40.2935f,-117.188f, +117.188f,39.8681f,-117.188f, +121.094f,39.0965f,-117.188f, +125.0f,37.1333f,-117.188f, +128.906f,35.5222f,-117.188f, +132.813f,33.9068f,-117.188f, +136.719f,32.2618f,-117.188f, +140.625f,29.8657f,-117.188f, +144.531f,28.1704f,-117.188f, +148.438f,27.1495f,-117.188f, +152.344f,24.5217f,-117.188f, +156.25f,22.0419f,-117.188f, +160.156f,19.9238f,-117.188f, +164.063f,17.6875f,-117.188f, +167.969f,15.5636f,-117.188f, +171.875f,13.5497f,-117.188f, +175.781f,11.2761f,-117.188f, +179.688f,8.95864f,-117.188f, +183.594f,7.04623f,-117.188f, +187.5f,4.83635f,-117.188f, +191.406f,2.76046f,-117.188f, +195.313f,0.190119f,-117.188f, +199.219f,-0.558379f,-117.188f, +203.125f,-1.03303f,-117.188f, +207.031f,-2.17563f,-117.188f, +210.938f,-1.91155f,-117.188f, +214.844f,-3.00018f,-117.188f, +218.75f,-4.26691f,-117.188f, +222.656f,-5.15855f,-117.188f, +226.563f,-3.46348f,-117.188f, +230.469f,-2.16077f,-117.188f, +234.375f,-1.47785f,-117.188f, +238.281f,-1.78424f,-117.188f, +242.188f,-1.00317f,-117.188f, +246.094f,-1.97981f,-117.188f, +250.0f,-2.29372f,-117.188f, +}; + +btScalar Landscape03Nml[] = { +-0.0301669f,0.913898f,-0.404822f, +0.0925944f,0.901922f,-0.421856f, +0.0550338f,0.955133f,-0.291019f, +0.163554f,0.924847f,-0.343379f, +-0.00160556f,0.985516f,-0.169577f, +0.0975687f,0.967908f,-0.23159f, +-0.0718641f,0.997324f,-0.0134097f, +0.108884f,0.992259f,0.0597208f, +-0.0649193f,0.987727f,0.142057f, +-0.0923076f,0.995503f,-0.0212622f, +-0.212176f,0.966905f,0.141687f, +-0.135924f,0.982555f,0.126925f, +-0.248136f,0.950917f,0.184892f, +-0.114969f,0.937595f,0.328173f, +-0.0596382f,0.954355f,0.292661f, +-0.0673134f,0.931098f,0.358506f, +-0.100514f,0.963905f,0.246544f, +-0.237357f,0.960335f,0.146353f, +-0.210275f,0.964506f,0.159726f, +-0.243879f,0.969407f,-0.027797f, +-0.0995316f,0.963559f,0.248291f, +0.0232774f,0.986211f,0.163848f, +-0.0780955f,0.939808f,0.33266f, +0.0143543f,0.937354f,0.348083f, +-0.242603f,0.911487f,0.332166f, +-0.217791f,0.899583f,0.378572f, +-0.259297f,0.919695f,0.294833f, +-0.235372f,0.900382f,0.365939f, +0.0548314f,0.924698f,0.376733f, +0.17577f,0.83537f,0.520828f, +0.183628f,0.8685f,0.460423f, +0.206319f,0.791195f,0.57571f, +0.291585f,0.831097f,0.473557f, +0.258977f,0.806104f,0.532097f, +0.406441f,0.807616f,0.427274f, +0.279416f,0.89888f,0.337552f, +0.161449f,0.944511f,0.286064f, +-0.0153595f,0.999467f,0.0288015f, +0.0344442f,0.986316f,0.16123f, +0.0228147f,0.999694f,-0.00950936f, +0.221267f,0.961345f,0.163882f, +0.262982f,0.961437f,0.0804904f, +0.292545f,0.943495f,0.155677f, +0.287728f,0.952627f,0.0985627f, +0.338791f,0.935036f,0.104535f, +0.332042f,0.939101f,0.0885263f, +0.395865f,0.914692f,0.0814219f, +0.342439f,0.937891f,0.0556409f, +0.24643f,0.967531f,-0.0561722f, +0.155524f,0.980084f,-0.12348f, +0.12756f,0.989194f,-0.0722747f, +0.141529f,0.984734f,-0.10133f, +0.0842668f,0.99539f,-0.0458028f, +0.00840046f,0.967846f,-0.251403f, +0.0723924f,0.995277f,-0.0646756f, +0.161395f,0.974624f,-0.155111f, +0.168526f,0.983485f,0.0660013f, +0.32936f,0.929371f,0.166709f, +0.334018f,0.924548f,0.18342f, +0.39263f,0.883836f,0.254313f, +0.373683f,0.906029f,0.198675f, +0.318503f,0.931732f,0.174444f, +0.214891f,0.969497f,0.117891f, +0.248914f,0.936934f,0.245348f, +0.199074f,0.96113f,0.19131f, +0.293417f,0.893252f,0.340597f, +0.339667f,0.873015f,0.349959f, +0.354613f,0.873548f,0.333412f, +0.457963f,0.824157f,0.333219f, +0.455319f,0.825254f,0.334127f, +0.52695f,0.805593f,0.270821f, +0.439193f,0.858556f,0.264557f, +0.401282f,0.908751f,0.114652f, +0.249111f,0.965853f,-0.0712114f, +0.0897089f,0.991664f,0.0924929f, +0.0376765f,0.979393f,-0.19842f, +-0.126991f,0.990951f,0.0434627f, +-0.217753f,0.933113f,-0.286154f, +-0.167574f,0.97576f,-0.140749f, +-0.203937f,0.914317f,-0.349907f, +-0.0608955f,0.980207f,-0.188379f, +-0.0120075f,0.947447f,-0.319686f, +0.167601f,0.980952f,-0.0982003f, +0.212052f,0.945824f,-0.245868f, +0.218606f,0.972968f,-0.0744646f, +0.212851f,0.953898f,-0.211596f, +0.171647f,0.974969f,-0.141323f, +0.199197f,0.967793f,-0.153938f, +0.200412f,0.972091f,-0.121957f, +0.23265f,0.963849f,-0.129883f, +0.296235f,0.953212f,-0.060261f, +0.314311f,0.946698f,-0.0705058f, +0.404868f,0.912189f,-0.0631982f, +0.403087f,0.912504f,-0.0696997f, +0.463227f,0.884095f,-0.0616207f, +0.39479f,0.897802f,-0.195171f, +0.35121f,0.926619f,-0.13427f, +0.220773f,0.898508f,-0.379398f, +0.189824f,0.93595f,-0.296589f, +0.0483901f,0.855509f,-0.515522f, +0.0904515f,0.884685f,-0.457329f, +0.120283f,0.865017f,-0.487112f, +0.203986f,0.900002f,-0.385209f, +0.248454f,0.881227f,-0.402131f, +0.178575f,0.929214f,-0.323532f, +0.0792679f,0.824417f,-0.560404f, +0.115378f,0.950213f,-0.289454f, +0.0725597f,0.807744f,-0.585051f, +0.0327706f,0.953791f,-0.298679f, +0.0099385f,0.78612f,-0.617994f, +0.0403637f,0.952173f,-0.302881f, +0.215114f,0.87002f,-0.443611f, +0.182967f,0.972742f,-0.142465f, +0.292542f,0.923312f,-0.248827f, +0.159782f,0.983577f,-0.0839386f, +0.255356f,0.959339f,-0.120256f, +0.180088f,0.983508f,0.0167535f, +0.210595f,0.975243f,-0.0674566f, +0.305089f,0.951559f,0.0381592f, +0.342154f,0.939613f,0.00764387f, +0.44387f,0.894627f,0.0512048f, +0.377004f,0.921573f,-0.0925792f, +0.197535f,0.978807f,-0.0540106f, +0.128094f,0.953819f,-0.271702f, +0.10228f,0.991256f,-0.0833686f, +0.111348f,0.971755f,-0.208074f, +0.120727f,0.982203f,-0.143886f, +0.131919f,0.971754f,-0.195681f, +-0.118481f,0.971727f,-0.204228f, +-0.131824f,0.977685f,-0.163569f, +-0.0725384f,0.997366f,-0.000133281f, +-0.204047f,0.978951f,0.00446862f, +-0.227431f,0.966677f,0.117515f, +-0.137601f,0.963906f,0.227929f, +-0.242399f,0.965055f,0.0995586f, +-0.153062f,0.97808f,0.141178f, +-0.129415f,0.948353f,0.289617f, +-0.22442f,0.902886f,0.366649f, +-0.173979f,0.92147f,0.34731f, +-0.0318649f,0.93595f,0.350687f, +-0.176397f,0.955508f,0.236408f, +-0.254551f,0.956811f,0.140418f, +-0.0162894f,0.984782f,0.173032f, +0.167302f,0.961803f,0.216667f, +0.267797f,0.948626f,0.168505f, +0.412955f,0.869957f,0.269525f, +0.258065f,0.893814f,0.366742f, +0.124905f,0.932115f,0.339941f, +0.234805f,0.927845f,0.289777f, +0.325979f,0.90761f,0.264542f, +0.401458f,0.890435f,0.214374f, +0.44845f,0.886659f,0.112823f, +0.337292f,0.940965f,0.0286028f, +0.110729f,0.992952f,-0.0422648f, +0.0165495f,0.996512f,-0.0817925f, +0.0843804f,0.994583f,-0.0606957f, +0.1131f,0.990749f,-0.0749933f, +0.241223f,0.970417f,0.0100747f, +0.396578f,0.902933f,0.165644f, +0.324808f,0.936808f,0.129963f, +0.0728626f,0.997053f,0.0240034f, +0.167633f,0.975741f,0.140815f, +0.474631f,0.846984f,0.239465f, +0.567824f,0.786908f,0.24156f, +0.402496f,0.873451f,0.274008f, +0.0459982f,0.950641f,0.306865f, +-0.0582337f,0.962437f,0.265188f, +0.030037f,0.970181f,0.240514f, +-0.0533502f,0.992438f,0.110548f, +0.0995416f,0.988544f,0.11346f, +0.255626f,0.959556f,0.11793f, +0.26735f,0.961569f,0.0625254f, +0.18836f,0.981833f,-0.0228855f, +0.278864f,0.958778f,-0.0545789f, +0.407529f,0.909061f,-0.086769f, +0.427129f,0.902011f,-0.0627458f, +0.408272f,0.912551f,-0.0237565f, +0.36375f,0.922794f,-0.127037f, +0.266363f,0.919721f,-0.28838f, +0.0788795f,0.927162f,-0.366263f, +0.0391177f,0.978258f,-0.20367f, +0.0160429f,0.996725f,-0.0792609f, +0.0608773f,0.998141f,0.00292939f, +0.025245f,0.998361f,-0.0513526f, +0.140845f,0.988959f,-0.046063f, +0.138979f,0.986427f,-0.0874468f, +0.128983f,0.987322f,-0.0925141f, +0.303074f,0.948227f,-0.0949297f, +0.392011f,0.918105f,-0.0584085f, +0.26566f,0.960779f,0.0795528f, +0.166068f,0.98603f,-0.0129125f, +0.262845f,0.962536f,-0.0666132f, +-0.104783f,0.989703f,0.0975085f, +-0.153604f,0.984769f,0.0814646f, +-0.17021f,0.98292f,0.0699758f, +-0.192965f,0.974203f,0.117018f, +-0.286836f,0.952199f,0.105086f, +-0.195248f,0.969752f,0.146488f, +-0.150662f,0.967412f,0.203504f, +-0.264752f,0.950334f,0.163619f, +-0.315905f,0.913283f,0.257134f, +-0.224744f,0.91965f,0.322078f, +-0.108929f,0.947464f,0.300743f, +0.0128823f,0.944776f,0.327463f, +-0.0190359f,0.964202f,0.264485f, +-0.187346f,0.97974f,0.0707926f, +-0.0647113f,0.997854f,-0.0100069f, +0.163923f,0.98566f,0.0400324f, +0.299244f,0.952147f,0.0622031f, +0.300231f,0.948028f,0.105378f, +0.182306f,0.951449f,0.248009f, +0.15023f,0.937487f,0.313924f, +0.264855f,0.926023f,0.268948f, +0.322593f,0.919374f,0.225135f, +0.43093f,0.873406f,0.22685f, +0.536094f,0.828094f,0.163899f, +0.40435f,0.914491f,0.0144028f, +0.203744f,0.975451f,-0.0835749f, +0.102706f,0.983162f,-0.151145f, +0.0912494f,0.98262f,-0.161654f, +0.0714052f,0.991795f,-0.106042f, +0.113839f,0.992199f,-0.0508211f, +0.266818f,0.963676f,0.0116937f, +0.379059f,0.920849f,0.091386f, +0.155245f,0.98775f,0.0158058f, +0.135484f,0.989724f,-0.0457313f, +0.394833f,0.917954f,-0.0383045f, +0.510875f,0.847518f,0.143943f, +0.369724f,0.884704f,0.283906f, +0.16927f,0.926331f,0.336538f, +-0.0368298f,0.974452f,0.221557f, +0.0247064f,0.955492f,0.293981f, +0.0101397f,0.960739f,0.27727f, +0.120365f,0.954563f,0.272621f, +0.285189f,0.933274f,0.218327f, +0.27356f,0.947401f,0.16612f, +0.298803f,0.939862f,0.165455f, +0.344494f,0.938521f,0.0223999f, +0.423232f,0.90602f,-0.00171397f, +0.428479f,0.903517f,-0.00795118f, +0.445837f,0.889867f,-0.0967762f, +0.420806f,0.885752f,-0.195872f, +0.361482f,0.916002f,-0.173987f, +0.0888846f,0.94798f,-0.305668f, +-0.104291f,0.938663f,-0.328687f, +-0.0525896f,0.969771f,-0.238281f, +0.0233793f,0.980465f,-0.1953f, +0.0772242f,0.980658f,-0.179852f, +0.158397f,0.962723f,-0.219259f, +0.207852f,0.94171f,-0.264536f, +0.167471f,0.922973f,-0.346518f, +0.273321f,0.900673f,-0.337764f, +0.244245f,0.947327f,-0.207161f, +0.179974f,0.982676f,-0.0442354f, +0.256056f,0.966655f,0.00369743f, +0.311224f,0.950239f,-0.0136096f, +-0.114346f,0.96184f,0.248574f, +-0.136601f,0.952445f,0.272377f, +-0.118024f,0.9521f,0.282091f, +-0.208962f,0.956737f,0.20246f, +-0.278994f,0.940284f,0.195009f, +-0.257672f,0.939434f,0.225986f, +-0.195307f,0.931658f,0.306381f, +-0.244185f,0.930201f,0.274044f, +-0.297894f,0.926606f,0.229479f, +-0.247712f,0.954952f,0.163421f, +-0.130651f,0.964187f,0.230812f, +-0.0752954f,0.962878f,0.259223f, +0.102408f,0.945859f,0.308f, +-0.0116154f,0.986031f,0.166158f, +0.0110135f,0.994405f,0.105056f, +0.0951503f,0.992756f,0.0733669f, +0.243797f,0.961487f,0.12691f, +0.260872f,0.955085f,0.140567f, +0.0581113f,0.983556f,0.170998f, +0.136043f,0.955475f,0.261839f, +0.341254f,0.920705f,0.189336f, +0.362462f,0.927476f,0.0917096f, +0.434756f,0.897441f,0.0747436f, +0.56712f,0.819757f,0.0798336f, +0.532941f,0.840799f,0.0950342f, +0.285812f,0.957415f,-0.0408404f, +0.105292f,0.985973f,-0.129498f, +0.0183827f,0.988838f,-0.147857f, +0.00614806f,0.993133f,-0.116825f, +0.099955f,0.989102f,-0.108098f, +0.238003f,0.969438f,-0.0595305f, +0.37769f,0.925502f,0.0282058f, +0.22782f,0.973089f,-0.0345812f, +0.169707f,0.981804f,-0.085208f, +0.345833f,0.936168f,-0.0631539f, +0.390375f,0.920563f,0.0130624f, +0.292594f,0.949139f,0.116291f, +0.162356f,0.962761f,0.216174f, +-0.0222207f,0.972687f,0.231055f, +-0.0543181f,0.955402f,0.290271f, +0.0573363f,0.941579f,0.331875f, +0.0971816f,0.964596f,0.245172f, +0.31345f,0.917083f,0.246388f, +0.307384f,0.923753f,0.228463f, +0.331585f,0.921188f,0.203628f, +0.40966f,0.902178f,0.135106f, +0.421265f,0.901117f,0.102585f, +0.477285f,0.878068f,0.0345826f, +0.547818f,0.833857f,-0.0676607f, +0.41388f,0.899953f,-0.13707f, +0.336726f,0.938017f,-0.0820957f, +0.267129f,0.960427f,-0.0788775f, +-0.0301028f,0.966021f,-0.256704f, +-0.102361f,0.925067f,-0.36575f, +-0.0109209f,0.925593f,-0.378364f, +0.0802595f,0.925005f,-0.371381f, +0.178475f,0.901809f,-0.393558f, +0.234643f,0.9031f,-0.359657f, +0.21073f,0.932522f,-0.29325f, +0.145492f,0.962309f,-0.22977f, +0.0986234f,0.992893f,-0.0666048f, +0.0609779f,0.998071f,0.0116837f, +0.208222f,0.976086f,0.0624398f, +0.291247f,0.954621f,0.0622453f, +-0.144182f,0.940028f,0.309126f, +-0.205006f,0.91833f,0.33859f, +-0.12423f,0.88968f,0.43936f, +-0.080186f,0.900963f,0.426423f, +-0.276852f,0.915664f,0.291398f, +-0.294009f,0.912157f,0.285532f, +-0.229314f,0.935643f,0.268306f, +-0.167187f,0.934278f,0.314918f, +-0.22242f,0.937858f,0.266367f, +-0.260643f,0.947201f,0.186748f, +-0.191964f,0.952786f,0.235261f, +-0.0626162f,0.968356f,0.24159f, +0.113658f,0.975135f,0.190246f, +0.0609991f,0.983083f,0.172707f, +0.00661942f,0.987494f,0.157516f, +0.132957f,0.988179f,0.0763221f, +0.229975f,0.973129f,-0.011475f, +0.267568f,0.962445f,0.0458956f, +0.0512446f,0.996521f,0.0657221f, +0.10251f,0.994623f,0.0147167f, +0.405413f,0.913613f,0.0308412f, +0.422693f,0.905322f,0.0415123f, +0.446493f,0.894763f,-0.00665318f, +0.517619f,0.855611f,0.00103599f, +0.493254f,0.857934f,0.143698f, +0.391227f,0.901201f,0.186488f, +0.212519f,0.97466f,0.0698119f, +0.0889638f,0.99521f,-0.0405254f, +0.0684633f,0.989971f,-0.123576f, +0.0764325f,0.983592f,-0.163418f, +0.104882f,0.990961f,-0.0836475f, +0.31755f,0.948184f,0.0104726f, +0.297752f,0.954642f,-0.00148102f, +0.157954f,0.986909f,-0.0325777f, +0.331713f,0.943333f,0.00940707f, +0.320973f,0.946975f,0.014661f, +0.220471f,0.961455f,0.164306f, +0.0647366f,0.977455f,0.200976f, +-0.0349474f,0.961311f,0.273238f, +-0.125874f,0.956852f,0.261896f, +0.0785055f,0.963364f,0.256449f, +0.211427f,0.962249f,0.171395f, +0.267083f,0.952021f,0.149409f, +0.340455f,0.905998f,0.251512f, +0.343062f,0.921876f,0.180149f, +0.420249f,0.886024f,0.195835f, +0.477229f,0.85754f,0.192034f, +0.564804f,0.822942f,0.0613434f, +0.583206f,0.811559f,-0.0352364f, +0.433319f,0.897576f,-0.0811897f, +0.291913f,0.950865f,-0.103166f, +0.268144f,0.961121f,-0.065914f, +0.14681f,0.986926f,-0.0665068f, +0.0393351f,0.975019f,-0.218612f, +0.042722f,0.945279f,-0.323454f, +0.104892f,0.926937f,-0.360257f, +0.188153f,0.928382f,-0.320477f, +0.104479f,0.956869f,-0.271082f, +0.039684f,0.98773f,-0.151046f, +0.0798596f,0.996734f,-0.0120106f, +0.0027229f,0.999081f,-0.0427778f, +0.0156228f,0.999853f,-0.00700924f, +0.224664f,0.97266f,0.058815f, +0.342188f,0.939164f,0.029646f, +-0.199093f,0.881081f,0.429019f, +-0.240385f,0.861587f,0.447083f, +-0.200309f,0.881599f,0.427386f, +-0.0492643f,0.888913f,0.455419f, +-0.146605f,0.886582f,0.438724f, +-0.194932f,0.91844f,0.344193f, +-0.212452f,0.949737f,0.229922f, +-0.231229f,0.946978f,0.223083f, +-0.22018f,0.943947f,0.245937f, +-0.155384f,0.954263f,0.255419f, +-0.222552f,0.970336f,0.0944332f, +0.0103498f,0.996133f,0.0872447f, +0.133012f,0.991064f,-0.00997971f, +0.0530236f,0.995787f,0.0748093f, +0.0840279f,0.994917f,0.0554967f, +0.25995f,0.964887f,-0.0376792f, +0.277109f,0.958722f,-0.0637373f, +0.172083f,0.982525f,-0.0709421f, +0.0951551f,0.994032f,-0.0533466f, +0.177084f,0.970483f,-0.163718f, +0.336303f,0.91861f,-0.207499f, +0.381503f,0.916211f,-0.122527f, +0.437128f,0.898759f,-0.0339342f, +0.471093f,0.8784f,0.0805223f, +0.407138f,0.905658f,0.118413f, +0.402844f,0.901612f,0.157519f, +0.327464f,0.936685f,0.124046f, +0.19809f,0.980129f,0.0103207f, +0.123868f,0.987803f,-0.0943524f, +0.0527864f,0.989238f,-0.136459f, +0.072462f,0.988213f,-0.134849f, +0.248671f,0.959688f,-0.131005f, +0.280617f,0.958078f,0.0577984f, +0.169552f,0.981657f,0.0871871f, +0.315169f,0.946806f,0.0650122f, +0.205308f,0.973708f,0.0986977f, +0.0950386f,0.972165f,0.214158f, +0.053629f,0.964124f,0.259978f, +-0.0859535f,0.951705f,0.294738f, +-0.0564482f,0.948883f,0.31054f, +0.154105f,0.958817f,0.238582f, +0.276457f,0.946116f,0.168629f, +0.211552f,0.972531f,0.0971047f, +0.294402f,0.951062f,0.0938527f, +0.390766f,0.916003f,0.0907783f, +0.406836f,0.907458f,0.104904f, +0.487803f,0.868421f,0.0888414f, +0.60401f,0.790886f,0.0983406f, +0.637938f,0.762279f,0.109387f, +0.4874f,0.873178f,0.00117935f, +0.336067f,0.93258f,-0.131735f, +0.229766f,0.943375f,-0.239272f, +0.152224f,0.966237f,-0.207882f, +0.121199f,0.969969f,-0.210883f, +0.121425f,0.965511f,-0.230314f, +0.0800447f,0.963578f,-0.255166f, +0.0996944f,0.981315f,-0.164563f, +0.0506382f,0.996401f,-0.0679735f, +-0.049503f,0.998346f,-0.0292297f, +0.050214f,0.998168f,0.0337586f, +0.113307f,0.993459f,0.014176f, +-0.000723347f,0.991208f,-0.132313f, +0.134265f,0.980729f,-0.141929f, +0.363008f,0.931437f,-0.0254801f, +-0.23486f,0.827656f,0.509732f, +-0.18483f,0.851106f,0.491383f, +-0.113579f,0.917253f,0.381767f, +-0.0885467f,0.926234f,0.366401f, +-0.119506f,0.895756f,0.428181f, +-0.107176f,0.917761f,0.382398f, +-0.0925542f,0.950614f,0.296253f, +-0.166069f,0.978511f,0.12222f, +-0.250375f,0.968134f,-0.00545859f, +-0.116612f,0.99254f,0.0355817f, +-0.0441586f,0.99869f,-0.0258397f, +0.0237183f,0.990591f,-0.134786f, +0.114156f,0.992737f,-0.0379611f, +0.0216237f,0.999568f,0.0199155f, +0.13918f,0.98521f,-0.0999564f, +0.240654f,0.960885f,-0.137059f, +0.249305f,0.964708f,-0.0847689f, +0.222546f,0.966381f,-0.128771f, +0.148234f,0.971026f,-0.187443f, +0.258813f,0.946284f,-0.193812f, +0.386195f,0.898799f,-0.207397f, +0.325896f,0.902531f,-0.281478f, +0.250321f,0.93543f,-0.249621f, +0.351402f,0.936022f,0.01949f, +0.42413f,0.889134f,0.171914f, +0.422963f,0.898638f,0.116411f, +0.393976f,0.918547f,0.0324739f, +0.283361f,0.957155f,-0.0596804f, +0.186222f,0.979389f,-0.0782236f, +0.100294f,0.99243f,-0.0708823f, +0.151138f,0.983442f,-0.0999959f, +0.115742f,0.982035f,-0.149033f, +0.0920961f,0.993962f,0.0596489f, +0.180728f,0.97583f,0.122852f, +0.267575f,0.959234f,0.0909572f, +0.204025f,0.959594f,0.193785f, +0.0830398f,0.98516f,0.150214f, +0.000808908f,0.987078f,0.160239f, +-0.115905f,0.961815f,0.247948f, +-0.0397732f,0.972025f,0.231484f, +0.185186f,0.964166f,0.189976f, +0.333936f,0.928543f,0.162155f, +0.358439f,0.932281f,0.0487095f, +0.30639f,0.946624f,-0.100142f, +0.389119f,0.921183f,-0.00273847f, +0.418957f,0.907889f,-0.0145855f, +0.498018f,0.86538f,-0.05563f, +0.565975f,0.823958f,-0.0276542f, +0.61235f,0.789736f,0.0366549f, +0.580326f,0.809292f,0.0909313f, +0.472624f,0.880866f,0.0264734f, +0.31167f,0.948991f,-0.0477351f, +0.149242f,0.981946f,-0.116226f, +0.114121f,0.974963f,-0.190851f, +0.0836789f,0.981905f,-0.169884f, +0.0779767f,0.990421f,-0.113957f, +0.0144442f,0.982901f,-0.183565f, +-0.021091f,0.988398f,-0.150415f, +-0.0454971f,0.990828f,-0.127242f, +-0.0180398f,0.984723f,-0.173189f, +0.129331f,0.988095f,-0.0833159f, +0.183553f,0.978578f,-0.0932403f, +0.123107f,0.958699f,-0.256402f, +0.189949f,0.953063f,-0.235775f, +-0.0544616f,0.84489f,0.53216f, +-0.0113297f,0.890886f,0.454085f, +-0.0462225f,0.938549f,0.342038f, +-0.128436f,0.915911f,0.380277f, +-0.159132f,0.90887f,0.385529f, +-0.0486608f,0.932565f,0.357708f, +0.0612592f,0.9505f,0.304627f, +0.0533898f,0.988914f,0.138559f, +-0.104607f,0.992177f,-0.0681298f, +-0.180998f,0.963403f,-0.197725f, +0.0184775f,0.993878f,-0.108929f, +-0.0166014f,0.988229f,-0.152078f, +-0.0077365f,0.996975f,-0.0773314f, +0.0579939f,0.995726f,-0.071872f, +0.284878f,0.950639f,-0.123003f, +0.233331f,0.946766f,-0.221789f, +0.274724f,0.943287f,-0.186374f, +0.284827f,0.926731f,-0.245036f, +0.143673f,0.947988f,-0.284037f, +0.183874f,0.951741f,-0.245725f, +0.373811f,0.924384f,-0.0760214f, +0.370847f,0.928183f,0.0307872f, +0.230777f,0.972874f,0.0160428f, +0.116854f,0.992434f,-0.0376857f, +0.311514f,0.945104f,0.0986779f, +0.493623f,0.85792f,0.14251f, +0.47336f,0.879733f,0.0447334f, +0.299829f,0.953139f,0.0403417f, +0.142324f,0.985386f,0.0935816f, +0.0780161f,0.991843f,0.100799f, +0.120483f,0.987279f,0.10375f, +0.113666f,0.977351f,0.178507f, +0.020827f,0.987302f,0.157484f, +0.18308f,0.973453f,0.137371f, +0.268344f,0.949436f,0.162981f, +0.178652f,0.97403f,0.139099f, +0.140521f,0.985536f,0.0947243f, +-0.0588959f,0.995353f,0.0761881f, +-0.17043f,0.974748f,0.144293f, +0.0194468f,0.992819f,0.118038f, +0.23167f,0.972512f,0.0234243f, +0.390625f,0.920274f,-0.0225152f, +0.45457f,0.886543f,-0.086066f, +0.307368f,0.941264f,-0.13981f, +0.289942f,0.953608f,-0.0810322f, +0.455218f,0.890309f,-0.0112281f, +0.513837f,0.856124f,-0.0549855f, +0.546925f,0.836241f,-0.0396788f, +0.583367f,0.812208f,-0.00110721f, +0.552934f,0.832422f,0.0365798f, +0.448406f,0.891004f,0.0710176f, +0.325547f,0.934833f,0.141795f, +0.239603f,0.963586f,0.118709f, +0.230453f,0.97295f,0.0160981f, +0.0486317f,0.9909f,-0.125509f, +0.0743177f,0.991871f,-0.103291f, +0.139517f,0.9837f,-0.11344f, +-0.0210587f,0.976395f,-0.214963f, +0.00854959f,0.97326f,-0.229548f, +0.0184659f,0.95097f,-0.308733f, +0.0120962f,0.95636f,-0.291939f, +0.153044f,0.979201f,-0.1332f, +0.190748f,0.981634f,-0.00308124f, +0.151842f,0.988041f,0.0268087f, +0.0319983f,0.964154f,0.263409f, +0.0761375f,0.979983f,0.183946f, +-0.0471561f,0.98918f,0.13892f, +-0.184804f,0.965808f,0.181831f, +-0.118202f,0.977652f,0.173852f, +-0.00263192f,0.986244f,0.165277f, +0.113935f,0.977488f,0.177586f, +0.213178f,0.965311f,0.150764f, +0.0917926f,0.995582f,-0.0197448f, +-0.112968f,0.973922f,-0.196759f, +-0.0750323f,0.977001f,-0.199598f, +0.0257774f,0.985322f,-0.168747f, +0.042721f,0.964979f,-0.258825f, +0.0821835f,0.934135f,-0.34733f, +0.254423f,0.923351f,-0.287563f, +0.255965f,0.951062f,-0.173101f, +0.240055f,0.959513f,-0.147338f, +0.319995f,0.939284f,-0.123892f, +0.15271f,0.974885f,-0.162111f, +0.132954f,0.978157f,-0.159787f, +0.156062f,0.978958f,-0.131476f, +0.237325f,0.969005f,0.0685979f, +0.280555f,0.951122f,0.129056f, +0.254605f,0.966124f,0.0421956f, +0.282663f,0.955227f,-0.087427f, +0.484968f,0.871846f,-0.0684877f, +0.483506f,0.87515f,-0.0182894f, +0.210764f,0.97671f,0.0402119f, +0.0804806f,0.985666f,0.148275f, +0.143859f,0.967897f,0.206108f, +0.0874346f,0.987357f,0.132215f, +0.0878227f,0.985433f,0.145635f, +0.118466f,0.990277f,0.0729134f, +0.170426f,0.983396f,-0.0623508f, +0.249461f,0.967984f,-0.0278496f, +0.240586f,0.970589f,0.00866192f, +0.158755f,0.987312f,0.00339798f, +-0.0496588f,0.997869f,0.0423253f, +-0.174436f,0.984473f,-0.0196346f, +0.0953847f,0.991998f,-0.0827112f, +0.301757f,0.941321f,-0.151184f, +0.416386f,0.897492f,-0.145363f, +0.439988f,0.889223f,-0.125274f, +0.313047f,0.948071f,-0.0562344f, +0.243151f,0.96888f,-0.0463665f, +0.428373f,0.903467f,-0.0156432f, +0.536849f,0.842847f,-0.0374461f, +0.521753f,0.850621f,-0.0649361f, +0.537565f,0.842885f,-0.02384f, +0.530522f,0.843125f,0.087673f, +0.408082f,0.90082f,0.148295f, +0.350282f,0.920762f,0.171756f, +0.275878f,0.960222f,0.0431791f, +0.279727f,0.959242f,0.0400889f, +0.199403f,0.977085f,0.0744484f, +0.0837631f,0.994427f,-0.0640234f, +0.142714f,0.98022f,-0.137117f, +0.0724844f,0.974795f,-0.211f, +0.0199047f,0.956284f,-0.29176f, +0.0419923f,0.973015f,-0.226887f, +-0.0571486f,0.988577f,-0.139464f, +-0.0620153f,0.996095f,-0.0628396f, +0.00941635f,0.995205f,0.097359f, +0.0452536f,0.980521f,0.191132f, +0.238692f,0.970551f,0.032497f, +0.18188f,0.979621f,-0.0852148f, +-0.0338772f,0.991689f,-0.124115f, +-0.215207f,0.972977f,-0.0836781f, +-0.127875f,0.990711f,-0.0462653f, +-0.0382254f,0.999079f,-0.0194842f, +0.0717625f,0.997386f,-0.00848587f, +0.235337f,0.971913f,0.00129577f, +0.258073f,0.965901f,-0.0208375f, +0.00563659f,0.988134f,-0.153488f, +-0.0963466f,0.971245f,-0.217715f, +0.0933449f,0.976181f,-0.19585f, +0.172697f,0.943118f,-0.284084f, +0.114064f,0.91464f,-0.387844f, +0.105309f,0.920749f,-0.375675f, +0.0952503f,0.976152f,-0.195075f, +0.198665f,0.977736f,-0.0675672f, +0.327274f,0.944589f,-0.0253815f, +0.185125f,0.982311f,-0.0281882f, +0.161734f,0.983206f,-0.0845435f, +0.135269f,0.981463f,-0.135765f, +0.160555f,0.98307f,-0.0882893f, +0.258909f,0.96483f,-0.0454967f, +0.342126f,0.938267f,0.0510447f, +0.36458f,0.930989f,-0.0184394f, +0.461971f,0.885156f,-0.0555142f, +0.401049f,0.915892f,-0.0173601f, +0.179695f,0.981649f,0.0638365f, +-0.0160491f,0.998918f,0.0436388f, +0.112643f,0.989219f,0.093583f, +0.158223f,0.986353f,0.0455405f, +0.150051f,0.988439f,-0.0217303f, +0.238384f,0.964999f,-0.10932f, +0.283357f,0.938433f,-0.197616f, +0.1814f,0.953903f,-0.239086f, +0.147672f,0.981223f,-0.124073f, +0.0988803f,0.99502f,-0.0125399f, +-0.0367309f,0.999167f,-0.0177995f, +-0.0641669f,0.988893f,-0.134067f, +0.155868f,0.964972f,-0.211032f, +0.311449f,0.929937f,-0.195488f, +0.363438f,0.913854f,-0.181064f, +0.379108f,0.919625f,-0.102794f, +0.251516f,0.967833f,-0.00624272f, +0.239964f,0.970767f,0.0053561f, +0.444229f,0.895407f,-0.0301255f, +0.561208f,0.823627f,-0.0817525f, +0.529532f,0.843694f,-0.0881851f, +0.463417f,0.885698f,-0.0280076f, +0.42264f,0.895689f,0.138263f, +0.360725f,0.902736f,0.234403f, +0.374064f,0.893088f,0.249939f, +0.398158f,0.891769f,0.214982f, +0.241834f,0.965676f,0.0947983f, +0.124224f,0.988267f,0.0888664f, +0.239364f,0.964398f,0.112437f, +0.252174f,0.966402f,-0.0497516f, +0.205848f,0.974166f,-0.0928869f, +0.0402048f,0.980488f,-0.192421f, +-0.109787f,0.981783f,-0.155076f, +-0.172809f,0.983136f,-0.0598348f, +-0.119927f,0.992756f,0.00723519f, +-0.0378691f,0.997707f,0.0560999f, +-0.018583f,0.999146f,0.0369096f, +0.311296f,0.946614f,-0.0837655f, +0.23235f,0.967065f,-0.103921f, +-0.0472012f,0.997512f,-0.0523709f, +-0.280913f,0.95942f,-0.0245033f, +-0.168558f,0.985462f,0.0212842f, +-0.0297654f,0.999551f,-0.00345095f, +0.14783f,0.984722f,-0.0920209f, +0.234818f,0.942556f,-0.23759f, +0.226f,0.954601f,-0.194065f, +0.0915505f,0.991576f,-0.0916283f, +-0.0384295f,0.986109f,-0.161594f, +0.0699749f,0.969463f,-0.235043f, +0.242042f,0.947128f,-0.210628f, +0.200696f,0.954776f,-0.21937f, +0.0684629f,0.960296f,-0.270452f, +-0.0178037f,0.955193f,-0.295449f, +0.106419f,0.956511f,-0.271592f, +0.250177f,0.956337f,-0.151101f, +0.206468f,0.977841f,-0.0346042f, +0.226301f,0.972897f,-0.047521f, +0.19172f,0.975927f,-0.103973f, +0.110286f,0.969903f,-0.217085f, +0.124805f,0.979571f,-0.157684f, +0.230362f,0.972377f,0.0376307f, +0.390327f,0.9143f,0.108165f, +0.486088f,0.869528f,0.0874049f, +0.355552f,0.931184f,0.0804947f, +0.162837f,0.968115f,0.190362f, +0.0587916f,0.990094f,0.127507f, +0.122084f,0.99234f,0.0189101f, +0.227899f,0.973107f,0.0335246f, +0.245712f,0.968327f,-0.0443735f, +0.235392f,0.962107f,-0.137626f, +0.299512f,0.953154f,0.0423112f, +0.158421f,0.985528f,0.0603087f, +0.0139537f,0.99778f,0.0651181f, +0.05695f,0.991196f,0.119526f, +0.0853993f,0.993434f,0.0761332f, +0.0800124f,0.992698f,-0.0902652f, +0.152744f,0.965412f,-0.211303f, +0.298303f,0.938225f,-0.175354f, +0.346617f,0.918158f,-0.191946f, +0.306791f,0.939305f,-0.153575f, +0.213668f,0.966817f,-0.140039f, +0.269123f,0.94608f,-0.180294f, +0.462084f,0.866259f,-0.189928f, +0.547323f,0.828917f,-0.11547f, +0.492713f,0.870051f,0.0156307f, +0.377637f,0.925543f,0.0275792f, +0.309374f,0.94993f,0.0438272f, +0.339128f,0.933648f,0.115296f, +0.355844f,0.92275f,0.148012f, +0.387104f,0.898496f,0.207015f, +0.394935f,0.895155f,0.206698f, +0.187014f,0.981688f,0.0362499f, +0.286474f,0.957988f,0.0138101f, +0.315633f,0.944806f,-0.0878444f, +0.189054f,0.976628f,-0.102261f, +0.071001f,0.995263f,-0.066411f, +-0.121993f,0.990638f,-0.0612738f, +-0.195423f,0.978588f,-0.0646113f, +-0.134933f,0.988908f,-0.0620808f, +-0.0362027f,0.9885f,-0.146822f, +0.0247852f,0.975168f,-0.220074f, +0.236634f,0.970435f,-0.0475491f, +0.163622f,0.985347f,0.0481553f, +-0.110204f,0.98299f,0.146921f, +-0.274076f,0.953125f,0.128197f, +-0.127913f,0.990913f,0.0415925f, +0.0693505f,0.994264f,-0.081428f, +0.246728f,0.957329f,-0.15049f, +0.356012f,0.927656f,-0.112735f, +0.108926f,0.979602f,-0.168863f, +-0.0117435f,0.995074f,-0.0984399f, +0.0591802f,0.992813f,-0.104017f, +0.152983f,0.961405f,-0.228683f, +0.199436f,0.939216f,-0.279462f, +0.158919f,0.956661f,-0.244017f, +0.142246f,0.964436f,-0.222776f, +0.0928224f,0.948092f,-0.304146f, +0.072096f,0.927878f,-0.365849f, +0.0949024f,0.954182f,-0.28378f, +0.0839904f,0.981792f,-0.17038f, +0.207123f,0.975655f,-0.0720922f, +0.306863f,0.948734f,-0.075756f, +0.227677f,0.946857f,-0.22721f, +0.0209281f,0.957849f,-0.28651f, +0.0889558f,0.973432f,-0.210993f, +0.377519f,0.908654f,-0.178401f, +0.444767f,0.867771f,-0.22171f, +0.296477f,0.952876f,-0.0642486f, +0.049587f,0.998699f,0.0118749f, +0.185088f,0.975344f,0.120192f, +0.179316f,0.983776f,0.00553586f, +0.203508f,0.978758f,-0.0248474f, +0.30632f,0.951877f,-0.00993344f, +0.182507f,0.983075f,0.0159703f, +0.0804506f,0.991985f,0.0974322f, +0.170994f,0.963788f,0.204629f, +0.0962731f,0.986887f,0.12956f, +0.097797f,0.995201f,0.00337759f, +0.147003f,0.987459f,-0.0575677f, +0.218112f,0.972969f,-0.0758899f, +0.244949f,0.956598f,-0.157862f, +0.315584f,0.924587f,-0.213415f, +0.352441f,0.893692f,-0.277668f, +0.28482f,0.905458f,-0.31468f, +0.265138f,0.910445f,-0.317477f, +0.308383f,0.884493f,-0.350102f, +0.390084f,0.870652f,-0.299665f, +0.373263f,0.922794f,-0.0955261f, +0.378781f,0.918384f,0.114439f, +0.476669f,0.866105f,0.150494f, +0.353048f,0.93424f,-0.0505168f, +0.309942f,0.946077f,-0.0942048f, +0.298518f,0.948219f,-0.108479f, +0.350416f,0.935917f,-0.0356219f, +0.447907f,0.893892f,-0.0183155f, +0.280155f,0.95286f,-0.116492f, +0.270748f,0.951225f,-0.147871f, +0.374052f,0.922269f,-0.0974917f, +0.176754f,0.980223f,-0.0889943f, +0.0634799f,0.992926f,-0.100339f, +-0.11806f,0.977045f,-0.177329f, +-0.199746f,0.955239f,-0.218219f, +-0.0812223f,0.969857f,-0.229739f, +0.130179f,0.951543f,-0.278602f, +0.200559f,0.919086f,-0.339202f, +0.0174361f,0.999489f,0.0268061f, +0.0105554f,0.991703f,0.128113f, +-0.141198f,0.973013f,0.182506f, +-0.142313f,0.985833f,0.0887713f, +0.00597934f,0.99465f,-0.103131f, +0.213448f,0.959986f,-0.181295f, +0.150446f,0.953754f,-0.260228f, +0.244008f,0.968351f,-0.0525036f, +0.184758f,0.982743f,0.00893989f, +-0.00567918f,0.992902f,-0.118797f, +0.138037f,0.98016f,-0.142241f, +0.21929f,0.962205f,-0.16147f, +0.269703f,0.95408f,-0.13035f, +0.150911f,0.956731f,-0.24878f, +0.180021f,0.944452f,-0.27496f, +0.119147f,0.92214f,-0.368051f, +0.0669033f,0.930661f,-0.359714f, +-0.0113587f,0.942765f,-0.333265f, +0.0142182f,0.972628f,-0.231934f, +0.163413f,0.959027f,-0.231437f, +0.324001f,0.919871f,-0.221046f, +0.291919f,0.93701f,-0.19182f, +0.107512f,0.968299f,-0.225473f, +0.0749887f,0.923898f,-0.375218f, +0.415609f,0.849812f,-0.324172f, +0.314994f,0.92041f,-0.231569f, +0.136459f,0.990645f,0.000905767f, +0.00734966f,0.998995f,0.0442195f, +0.0805668f,0.996634f,0.0151596f, +0.266119f,0.962333f,0.0556322f, +0.269187f,0.962624f,-0.0298845f, +0.209195f,0.975524f,-0.0677535f, +0.153299f,0.985902f,0.0670637f, +0.0587395f,0.996349f,0.0619523f, +0.20348f,0.97612f,0.0760684f, +0.225978f,0.971688f,-0.0689656f, +0.204562f,0.957442f,-0.203617f, +0.164418f,0.955123f,-0.246386f, +0.1725f,0.961839f,-0.212392f, +0.288653f,0.947463f,-0.137816f, +0.355829f,0.918236f,-0.173863f, +0.453757f,0.873536f,-0.176182f, +0.355645f,0.881401f,-0.310884f, +0.238917f,0.864251f,-0.442706f, +0.251593f,0.863453f,-0.437206f, +0.231383f,0.92049f,-0.314896f, +0.219172f,0.968344f,-0.119471f, +0.254773f,0.966196f,-0.0394394f, +0.482542f,0.873342f,0.0665443f, +0.470019f,0.880685f,0.0589576f, +0.359563f,0.932576f,-0.0318683f, +0.336062f,0.937393f,-0.0914179f, +0.320744f,0.932455f,-0.166285f, +0.428106f,0.887361f,-0.171217f, +0.372336f,0.918652f,-0.132074f, +0.247289f,0.941171f,-0.230314f, +0.287477f,0.950239f,-0.120008f, +0.121799f,0.989487f,-0.0779795f, +0.132326f,0.991166f,-0.00888466f, +-0.00459516f,0.997934f,-0.0640824f, +-0.0924696f,0.984613f,-0.148277f, +-0.0479758f,0.968834f,-0.243019f, +0.052427f,0.976364f,-0.209677f, +0.223214f,0.97397f,-0.0394671f, +0.0112214f,0.972418f,0.232975f, +0.0106355f,0.967748f,0.251694f, +-0.0743183f,0.979789f,0.185717f, +0.0581795f,0.9982f,0.01459f, +0.133434f,0.964693f,-0.227076f, +0.215981f,0.948544f,-0.231554f, +0.137408f,0.968029f,-0.209856f, +0.0442022f,0.987042f,-0.154256f, +0.228305f,0.972284f,0.0504f, +0.121617f,0.992241f,-0.0258404f, +0.134527f,0.985242f,-0.105833f, +0.151618f,0.980953f,-0.121423f, +0.275183f,0.956894f,-0.092891f, +0.263324f,0.945384f,-0.192117f, +0.25647f,0.929449f,-0.26523f, +0.21073f,0.904026f,-0.371926f, +0.0728135f,0.89169f,-0.446751f, +-0.0691284f,0.877831f,-0.473955f, +-0.019884f,0.913569f,-0.406197f, +0.178205f,0.891525f,-0.416444f, +0.263993f,0.900279f,-0.34613f, +0.210305f,0.939702f,-0.269689f, +0.208408f,0.948624f,-0.238074f, +0.229275f,0.910156f,-0.345036f, +0.227512f,0.924458f,-0.305966f, +0.142229f,0.989234f,0.0344507f, +-0.0464441f,0.986357f,0.157934f, +0.073391f,0.981122f,0.178921f, +0.158555f,0.984472f,0.0753311f, +0.265489f,0.961878f,0.0656237f, +0.318063f,0.94383f,0.0895592f, +0.229589f,0.973115f,0.0183382f, +0.0918017f,0.995548f,-0.0213497f, +0.0710209f,0.997458f,0.00582691f, +0.234172f,0.971044f,-0.0473045f, +0.373198f,0.918081f,-0.133603f, +0.27855f,0.93462f,-0.221124f, +0.174681f,0.94082f,-0.290421f, +0.0816739f,0.936818f,-0.34015f, +0.233666f,0.948403f,-0.214319f, +0.373882f,0.91082f,-0.174984f, +0.44036f,0.88198f,-0.16791f, +0.496092f,0.86017f,-0.118324f, +0.420226f,0.875748f,-0.237645f, +0.228936f,0.896528f,-0.379243f, +0.0594423f,0.913794f,-0.401806f, +0.0971839f,0.949435f,-0.298544f, +0.201575f,0.953775f,-0.222894f, +0.339139f,0.935667f,-0.0975326f, +0.471026f,0.864094f,0.177416f, +0.409402f,0.896788f,0.167814f, +0.414181f,0.90532f,0.0940739f, +0.426161f,0.903473f,-0.0460849f, +0.431652f,0.886771f,-0.165266f, +0.36903f,0.909898f,-0.189479f, +0.237762f,0.950577f,-0.199683f, +0.250405f,0.963718f,-0.0924377f, +0.100123f,0.989034f,-0.108572f, +0.0410755f,0.997876f,-0.0505615f, +0.0233843f,0.999496f,0.0214792f, +-0.0536722f,0.998467f,-0.0135057f, +0.00107433f,0.999993f,-0.00356525f, +-0.0705196f,0.996911f,-0.0345704f, +-0.0688919f,0.997514f,0.0148223f, +-0.0812179f,0.983535f,0.161436f, +-0.0138011f,0.988231f,0.152344f, +0.0655184f,0.995642f,0.0663652f, +0.220598f,0.973784f,-0.0554998f, +0.309629f,0.942731f,-0.124049f, +0.155774f,0.947975f,-0.27763f, +0.127196f,0.974249f,-0.186174f, +-0.058769f,0.981296f,-0.183314f, +0.0497615f,0.99612f,-0.0725919f, +0.182926f,0.98205f,0.0460018f, +0.19209f,0.981195f,-0.0189005f, +0.224403f,0.972569f,-0.0612647f, +0.315645f,0.941316f,-0.119552f, +0.360736f,0.920207f,-0.151949f, +0.310465f,0.916626f,-0.251809f, +0.327403f,0.899549f,-0.28917f, +0.161725f,0.896729f,-0.411973f, +-0.0141039f,0.865769f,-0.500245f, +-0.0292484f,0.82172f,-0.56914f, +0.0961328f,0.815723f,-0.570398f, +0.101793f,0.868026f,-0.485972f, +0.156302f,0.922247f,-0.353597f, +0.205267f,0.935719f,-0.286871f, +0.229076f,0.948515f,-0.218729f, +0.0347356f,0.987904f,-0.151126f, +-0.079026f,0.996018f,0.0412683f, +-0.00943989f,0.997185f,0.0743796f, +0.111542f,0.993598f,-0.0179121f, +0.186771f,0.982172f,0.0213291f, +0.207496f,0.975443f,0.0738717f, +0.321818f,0.944637f,0.0639911f, +0.281397f,0.958917f,0.0359716f, +0.126766f,0.988281f,0.0850327f, +0.0940702f,0.995531f,0.0082479f, +0.338235f,0.93955f,-0.0533163f, +0.410978f,0.899199f,-0.150126f, +0.338008f,0.912085f,-0.232059f, +0.265939f,0.902685f,-0.338284f, +0.120839f,0.912428f,-0.39099f, +0.0943411f,0.91428f,-0.393944f, +0.326367f,0.911608f,-0.24991f, +0.410002f,0.90171f,-0.137175f, +0.446036f,0.89335f,-0.054576f, +0.453415f,0.890674f,0.0333893f, +0.369882f,0.926554f,0.0684487f, +0.15305f,0.985829f,-0.0686756f, +0.0307343f,0.980172f,-0.195752f, +0.104404f,0.981192f,-0.162361f, +0.153412f,0.984343f,-0.086793f, +0.259868f,0.962798f,0.0740869f, +0.405239f,0.886729f,0.222469f, +0.507863f,0.829218f,0.233395f, +0.530784f,0.842353f,0.0933228f, +0.515092f,0.857118f,0.0053912f, +0.421652f,0.904509f,-0.0638277f, +0.186762f,0.968676f,-0.16367f, +0.141357f,0.986443f,-0.0833539f, +0.10637f,0.994244f,0.0127965f, +-0.010764f,0.999348f,-0.0344492f, +-0.00443345f,0.999867f,-0.0156939f, +-0.0569297f,0.998142f,0.0217125f, +-0.0108274f,0.998516f,0.0533776f, +-0.0518054f,0.997615f,0.0456197f, +-0.08879f,0.991878f,0.0910736f, +0.15627f,0.9777f,0.14029f, +0.127078f,0.991794f,-0.0140045f, +0.182153f,0.975854f,-0.12054f, +0.236919f,0.957374f,-0.165238f, +0.354425f,0.924081f,-0.143031f, +0.22947f,0.95204f,-0.202395f, +0.0414456f,0.986576f,-0.157956f, +-0.0334694f,0.988237f,-0.149222f, +-0.0516418f,0.976013f,-0.2115f, +0.149794f,0.980531f,-0.126967f, +0.232135f,0.958309f,-0.166606f, +0.253821f,0.951991f,-0.171138f, +0.306434f,0.927336f,-0.214818f, +0.397399f,0.902704f,-0.164923f, +0.371523f,0.904625f,-0.208864f, +0.394746f,0.892045f,-0.220071f, +0.272791f,0.90211f,-0.334339f, +0.143123f,0.890975f,-0.430905f, +0.0302622f,0.843122f,-0.53687f, +0.0628652f,0.888185f,-0.455165f, +0.00848379f,0.914478f,-0.404546f, +0.009201f,0.926788f,-0.375473f, +0.0671766f,0.952807f,-0.296052f, +0.132209f,0.974746f,-0.179973f, +-0.0203291f,0.99362f,-0.110936f, +-0.138553f,0.985569f,-0.0972441f, +0.0605753f,0.989699f,-0.129717f, +0.0968295f,0.980926f,-0.168548f, +0.0979519f,0.993956f,-0.0495753f, +0.201443f,0.976928f,-0.0709446f, +0.381986f,0.916436f,-0.119294f, +0.157625f,0.97891f,-0.12996f, +0.10065f,0.993729f,0.0486956f, +0.194299f,0.980695f,-0.0220253f, +0.364962f,0.929379f,-0.0552881f, +0.487949f,0.871552f,-0.0479875f, +0.462417f,0.883871f,-0.0702998f, +0.341292f,0.927621f,-0.151788f, +0.13195f,0.962323f,-0.237746f, +0.0784249f,0.961522f,-0.263298f, +0.155522f,0.961843f,-0.225101f, +0.275269f,0.959916f,-0.0528088f, +0.354301f,0.927858f,0.116403f, +0.359914f,0.906647f,0.22012f, +0.307706f,0.904557f,0.295117f, +0.281691f,0.897787f,0.338569f, +0.169122f,0.964903f,0.200898f, +0.116857f,0.992098f,0.045666f, +0.131422f,0.991068f,-0.0226175f, +0.19688f,0.980005f,-0.0287978f, +0.332698f,0.942383f,-0.0350149f, +0.49437f,0.868541f,-0.0351363f, +0.591151f,0.806162f,-0.0253575f, +0.528595f,0.848271f,-0.0319893f, +0.452945f,0.891538f,3.96151e-005f, +0.269718f,0.962267f,0.0359679f, +0.0172075f,0.99965f,0.0201157f, +0.0836306f,0.98488f,0.151715f, +0.0817519f,0.992549f,0.0903531f, +-0.0289252f,0.999464f,0.015311f, +-0.0977995f,0.99488f,0.0254794f, +-0.0368101f,0.998502f,0.0404932f, +-0.0917396f,0.988968f,0.116306f, +-0.19824f,0.961924f,0.188156f, +0.355147f,0.931267f,-0.0813196f, +0.261709f,0.946669f,-0.187953f, +0.187089f,0.954576f,-0.23191f, +0.281523f,0.925027f,-0.255086f, +0.340665f,0.862289f,-0.374707f, +0.168991f,0.920317f,-0.352786f, +-0.0114217f,0.969014f,-0.246743f, +0.0275027f,0.971061f,-0.237244f, +0.0127748f,0.945787f,-0.324537f, +0.106685f,0.927276f,-0.358857f, +0.242554f,0.910981f,-0.333589f, +0.254201f,0.919334f,-0.300346f, +0.319051f,0.907348f,-0.273727f, +0.384836f,0.892504f,-0.235241f, +0.359386f,0.889916f,-0.280877f, +0.418755f,0.87516f,-0.242361f, +0.378513f,0.873068f,-0.307377f, +0.247447f,0.872868f,-0.420561f, +0.0334574f,0.868028f,-0.495387f, +-0.104393f,0.897693f,-0.428077f, +-0.0466408f,0.949283f,-0.310944f, +0.00907853f,0.960916f,-0.276691f, +0.00868667f,0.966036f,-0.258261f, +0.0845957f,0.976098f,-0.200192f, +-0.0296926f,0.969375f,-0.243785f, +-0.104852f,0.955765f,-0.274807f, +0.0855702f,0.957819f,-0.274336f, +0.0411396f,0.961225f,-0.272681f, +0.0481708f,0.973933f,-0.221661f, +0.28909f,0.93695f,-0.196346f, +0.356766f,0.919532f,-0.164859f, +0.126757f,0.9882f,-0.0859897f, +0.0144124f,0.990867f,-0.134068f, +0.233251f,0.969449f,-0.075909f, +0.354937f,0.93426f,-0.034317f, +0.469402f,0.882971f,-0.00493066f, +0.398385f,0.917184f,-0.00790304f, +0.386606f,0.918227f,0.0859925f, +0.228789f,0.970147f,0.0804364f, +0.115903f,0.993259f,0.0019484f, +0.110471f,0.992802f,-0.0462595f, +0.159257f,0.98723f,-0.00373461f, +0.193831f,0.979844f,0.0483161f, +0.304703f,0.938233f,0.163935f, +0.27363f,0.944953f,0.179417f, +0.268196f,0.936861f,0.224416f, +0.306571f,0.922686f,0.233806f, +0.304362f,0.944561f,0.123164f, +0.226364f,0.97021f,-0.0863264f, +0.198019f,0.963611f,-0.179562f, +0.39862f,0.902547f,-0.162819f, +0.534677f,0.804719f,-0.257967f, +0.537872f,0.788638f,-0.297899f, +0.486148f,0.837034f,-0.251066f, +0.374822f,0.901369f,-0.216893f, +0.171725f,0.976903f,-0.127168f, +-0.0108013f,0.999941f,-0.00151679f, +0.0247265f,0.999687f,-0.00377037f, +0.135958f,0.990654f,0.0109791f, +-0.00717425f,0.999252f,0.0379956f, +-0.0710711f,0.991911f,0.105175f, +-0.0859239f,0.990395f,0.108328f, +-0.18335f,0.97033f,0.157612f, +-0.315275f,0.941315f,0.120535f, +0.340669f,0.883831f,-0.320605f, +0.289176f,0.886429f,-0.361416f, +0.20883f,0.874721f,-0.437325f, +0.364068f,0.812937f,-0.454519f, +0.367133f,0.769647f,-0.522357f, +0.0748495f,0.818621f,-0.569436f, +-0.0872921f,0.835085f,-0.543151f, +0.00846427f,0.872897f,-0.48783f, +0.114223f,0.886407f,-0.448593f, +0.0920189f,0.872463f,-0.479939f, +0.2125f,0.893929f,-0.394633f, +0.175058f,0.869572f,-0.461735f, +0.23988f,0.874417f,-0.421725f, +0.3397f,0.869601f,-0.358326f, +0.392151f,0.874231f,-0.286248f, +0.401032f,0.871377f,-0.282622f, +0.447169f,0.847971f,-0.28458f, +0.337548f,0.868339f,-0.363386f, +0.0674983f,0.896564f,-0.437742f, +-0.167145f,0.867884f,-0.467804f, +-0.130341f,0.888597f,-0.43978f, +-0.0513088f,0.927515f,-0.370248f, +-0.0499693f,0.955154f,-0.291861f, +0.0619562f,0.966501f,-0.249073f, +0.104114f,0.952328f,-0.28676f, +-0.0782617f,0.904542f,-0.419141f, +0.00654125f,0.918336f,-0.395747f, +0.0825819f,0.944757f,-0.317199f, +0.028702f,0.9283f,-0.370722f, +0.170752f,0.927761f,-0.331819f, +0.188742f,0.965638f,-0.178664f, +0.126613f,0.983535f,0.12895f, +0.0677004f,0.989289f,0.129321f, +0.179931f,0.977134f,0.113286f, +0.301628f,0.94869f,0.0949132f, +0.473083f,0.874439f,0.107469f, +0.430087f,0.900068f,0.0700241f, +0.294529f,0.954232f,0.0519033f, +0.218538f,0.963065f,0.157309f, +0.194139f,0.967934f,0.159416f, +0.193754f,0.980213f,0.0405318f, +0.162395f,0.97825f,-0.129057f, +0.175319f,0.968352f,-0.177646f, +0.248014f,0.960103f,-0.129196f, +0.28568f,0.95369f,-0.0941428f, +0.21993f,0.968315f,-0.118312f, +0.322085f,0.944206f,-0.068818f, +0.382868f,0.918715f,-0.0968289f, +0.390317f,0.908769f,-0.147618f, +0.269935f,0.914207f,-0.30226f, +0.374262f,0.856519f,-0.355391f, +0.561588f,0.771614f,-0.298716f, +0.563679f,0.781086f,-0.268646f, +0.435393f,0.841674f,-0.319402f, +0.305805f,0.901875f,-0.305133f, +0.0714141f,0.973517f,-0.217175f, +-0.0655193f,0.984454f,-0.162963f, +0.0352485f,0.985949f,-0.163286f, +0.0657594f,0.9937f,-0.0907542f, +-0.080707f,0.996331f,0.0284757f, +-0.168129f,0.985261f,0.0315202f, +-0.129479f,0.990858f,0.0378905f, +-0.12231f,0.991737f,0.0387141f, +-0.178343f,0.98279f,-0.0481504f, +0.273318f,0.858026f,-0.434843f, +0.385091f,0.836836f,-0.389114f, +0.340339f,0.786413f,-0.515483f, +0.318221f,0.733035f,-0.601161f, +0.367621f,0.755443f,-0.542366f, +0.119455f,0.799665f,-0.588444f, +-0.0802011f,0.78091f,-0.619473f, +-0.0688818f,0.778398f,-0.623981f, +0.0140135f,0.818686f,-0.574071f, +0.0274992f,0.866697f,-0.498077f, +0.177071f,0.88196f,-0.436797f, +0.265217f,0.852958f,-0.449581f, +0.257768f,0.854407f,-0.45116f, +0.248846f,0.837431f,-0.486605f, +0.267639f,0.861569f,-0.431356f, +0.378672f,0.856274f,-0.351288f, +0.453357f,0.836299f,-0.308337f, +0.386424f,0.863215f,-0.324865f, +0.128686f,0.904609f,-0.406352f, +-0.130252f,0.895612f,-0.425338f, +-0.18148f,0.896143f,-0.40496f, +-0.161324f,0.928509f,-0.334435f, +-0.0897102f,0.95467f,-0.283825f, +0.0454642f,0.942898f,-0.329963f, +0.150896f,0.947175f,-0.283f, +0.0358472f,0.960013f,-0.277651f, +-0.0385071f,0.932002f,-0.360402f, +0.0386813f,0.938718f,-0.342507f, +0.0283698f,0.934985f,-0.353551f, +0.108122f,0.956069f,-0.272473f, +0.00374271f,0.987226f,-0.159284f, +-0.196358f,0.979545f,-0.0439957f, +-0.00408304f,0.984849f,0.173364f, +0.19648f,0.945984f,0.257896f, +0.360526f,0.896905f,0.256092f, +0.497904f,0.850304f,0.170515f, +0.432778f,0.894142f,0.114953f, +0.285493f,0.945844f,0.154508f, +0.185631f,0.971794f,0.145459f, +0.230083f,0.969236f,0.0874248f, +0.368311f,0.929659f,-0.00905859f, +0.334163f,0.916764f,-0.218814f, +0.186339f,0.940464f,-0.284262f, +0.166871f,0.945707f,-0.278912f, +0.282007f,0.937612f,-0.20336f, +0.24104f,0.942322f,-0.232226f, +0.269154f,0.937876f,-0.218962f, +0.376707f,0.923358f,-0.0741695f, +0.419282f,0.907855f,0.00132882f, +0.443207f,0.893334f,-0.0743096f, +0.437794f,0.862232f,-0.254741f, +0.526311f,0.818963f,-0.228685f, +0.539618f,0.818293f,-0.198015f, +0.495179f,0.844909f,-0.202303f, +0.231134f,0.928947f,-0.289195f, +-0.0315579f,0.980647f,-0.193222f, +-0.0610949f,0.990009f,-0.12708f, +-0.0213691f,0.991115f,-0.131279f, +-0.0564833f,0.997988f,-0.0288065f, +-0.126885f,0.991868f,-0.0099403f, +-0.0683923f,0.994887f,-0.0743097f, +-0.0443491f,0.981445f,-0.186542f, +-0.106156f,0.962217f,-0.250737f, +-0.0540242f,0.978674f,-0.198191f, +0.194886f,0.824241f,-0.531645f, +0.320074f,0.809438f,-0.492303f, +0.464438f,0.773143f,-0.431911f, +0.405677f,0.746051f,-0.528047f, +0.305674f,0.751501f,-0.584645f, +0.130892f,0.809782f,-0.571944f, +-0.0644176f,0.819769f,-0.56906f, +-0.0714323f,0.833301f,-0.548185f, +-0.0643631f,0.853923f,-0.516404f, +-0.0107306f,0.851684f,-0.523946f, +0.13746f,0.827954f,-0.543688f, +0.198685f,0.868523f,-0.454084f, +0.246871f,0.881894f,-0.401644f, +0.296117f,0.852853f,-0.430066f, +0.256816f,0.850031f,-0.459883f, +0.314177f,0.830121f,-0.460643f, +0.37334f,0.830673f,-0.413038f, +0.413553f,0.857071f,-0.30725f, +0.158679f,0.931259f,-0.327989f, +-0.130088f,0.933779f,-0.333368f, +-0.259668f,0.892475f,-0.368866f, +-0.237565f,0.924215f,-0.298981f, +-0.0871208f,0.968004f,-0.235327f, +0.0797031f,0.982117f,-0.17057f, +0.0461708f,0.99392f,-0.0999594f, +0.0445161f,0.998669f,-0.0260401f, +0.0420509f,0.9919f,-0.119856f, +0.0652827f,0.976809f,-0.203917f, +0.0163117f,0.980129f,-0.197692f, +-0.0727832f,0.991022f,-0.112154f, +-0.0519999f,0.997388f,0.0501216f, +-0.215497f,0.976498f,0.00360735f, +-0.144793f,0.989191f,0.023161f, +0.11495f,0.986032f,0.120527f, +0.332155f,0.934954f,0.124633f, +0.520936f,0.843883f,0.128405f, +0.426058f,0.883139f,0.196317f, +0.297882f,0.930389f,0.213643f, +0.255462f,0.962333f,0.0930293f, +0.330201f,0.94382f,-0.0130553f, +0.464814f,0.88236f,-0.0734001f, +0.396624f,0.912293f,-0.10203f, +0.190826f,0.974675f,-0.116592f, +0.186045f,0.970537f,-0.153119f, +0.228366f,0.951236f,-0.207361f, +0.252282f,0.958154f,-0.135261f, +0.163352f,0.984522f,-0.0635096f, +0.214627f,0.974395f,0.066997f, +0.385854f,0.917468f,0.096793f, +0.519216f,0.853803f,0.0378886f, +0.535665f,0.843867f,-0.0308472f, +0.541689f,0.838373f,-0.060851f, +0.563197f,0.822059f,-0.0838289f, +0.51966f,0.848391f,-0.100928f, +0.236369f,0.967062f,-0.0944536f, +-0.111969f,0.993037f,-0.0366171f, +-0.0968965f,0.995233f,-0.011032f, +-0.0970566f,0.995182f,0.013894f, +-0.0559363f,0.991458f,0.117821f, +-0.00538008f,0.999824f,-0.0179674f, +0.0108998f,0.982438f,-0.186268f, +0.0427996f,0.970253f,-0.238279f, +-0.10823f,0.95386f,-0.280066f, +-0.196538f,0.942983f,-0.26862f, +0.307908f,0.814842f,-0.491147f, +0.299308f,0.78907f,-0.536455f, +0.435133f,0.777699f,-0.453699f, +0.495126f,0.764316f,-0.413124f, +0.362871f,0.81835f,-0.445676f, +0.0803271f,0.871076f,-0.484534f, +-0.110099f,0.885293f,-0.451812f, +-0.149245f,0.895891f,-0.418456f, +-0.0670569f,0.907151f,-0.415428f, +0.0527044f,0.88691f,-0.458926f, +0.100471f,0.888224f,-0.448291f, +0.121208f,0.922825f,-0.365653f, +0.249787f,0.879883f,-0.404243f, +0.334334f,0.839973f,-0.427396f, +0.283757f,0.852792f,-0.438437f, +0.337422f,0.812854f,-0.474778f, +0.291967f,0.807546f,-0.512469f, +0.269633f,0.862064f,-0.429119f, +0.108203f,0.943068f,-0.314506f, +-0.121343f,0.966872f,-0.224575f, +-0.202731f,0.95836f,-0.201115f, +-0.275106f,0.928104f,-0.25088f, +-0.220959f,0.943196f,-0.248108f, +-0.0845259f,0.990859f,-0.105139f, +-0.0183112f,0.999824f,0.00404228f, +0.0398541f,0.999205f,-0.000234289f, +0.144105f,0.989245f,0.0250549f, +0.0887732f,0.994681f,0.052239f, +-0.0385311f,0.993554f,0.106613f, +-0.141743f,0.984863f,0.099766f, +-0.130913f,0.987043f,0.0927824f, +-0.138468f,0.982136f,0.12742f, +-0.181593f,0.983362f,-0.00473479f, +0.124018f,0.991703f,-0.0338209f, +0.350394f,0.929846f,-0.112294f, +0.471172f,0.881999f,-0.00866642f, +0.362692f,0.927143f,0.0941279f, +0.321547f,0.934446f,0.153031f, +0.39706f,0.903274f,0.162601f, +0.408629f,0.910814f,0.0586596f, +0.440544f,0.897708f,-0.00641084f, +0.417743f,0.90832f,0.0210971f, +0.223429f,0.972702f,-0.0626924f, +0.239878f,0.966667f,-0.0895152f, +0.326998f,0.934073f,-0.143454f, +0.0984577f,0.955256f,-0.278913f, +0.055814f,0.995135f,-0.081185f, +0.198837f,0.979583f,-0.0296926f, +0.452343f,0.887429f,-0.0886289f, +0.538988f,0.831253f,-0.136052f, +0.534759f,0.840783f,-0.084361f, +0.557911f,0.827063f,-0.0685738f, +0.570718f,0.812258f,-0.120488f, +0.469437f,0.877038f,-0.102147f, +0.179725f,0.982175f,0.0550563f, +-0.143773f,0.988083f,0.054972f, +-0.0900032f,0.995941f,-0.00107895f, +-0.112639f,0.992937f,-0.0372634f, +-0.0770822f,0.995012f,-0.0633234f, +0.131283f,0.990073f,-0.0501953f, +0.151552f,0.985928f,-0.0705498f, +0.0547644f,0.990744f,-0.124209f, +-0.0889999f,0.992043f,-0.0890439f, +-0.225525f,0.966809f,-0.120075f, +0.367815f,0.812209f,-0.4528f, +0.333749f,0.806687f,-0.487716f, +0.350467f,0.776679f,-0.523395f, +0.428661f,0.776887f,-0.461189f, +0.344028f,0.851962f,-0.394722f, +0.0917588f,0.929121f,-0.35821f, +-0.151193f,0.922445f,-0.355297f, +-0.135334f,0.926245f,-0.351788f, +-0.0236046f,0.919658f,-0.39201f, +0.0475929f,0.924342f,-0.378586f, +0.0534474f,0.931533f,-0.359707f, +0.122967f,0.908442f,-0.399514f, +0.333531f,0.836829f,-0.434137f, +0.345062f,0.821786f,-0.45343f, +0.298405f,0.81077f,-0.503594f, +0.369796f,0.765054f,-0.527202f, +0.289381f,0.806079f,-0.516232f, +0.106326f,0.866117f,-0.488402f, +-0.0247184f,0.959589f,-0.280318f, +-0.247885f,0.952117f,-0.178958f, +-0.233969f,0.968302f,-0.0874651f, +-0.230973f,0.963517f,-0.135224f, +-0.23946f,0.950685f,-0.197121f, +-0.148981f,0.968772f,-0.198205f, +-0.0244446f,0.976892f,-0.212332f, +0.0214143f,0.979888f,-0.198397f, +0.0179015f,0.996249f,-0.084666f, +-0.0584671f,0.995927f,0.0686411f, +-0.0472317f,0.986168f,0.158874f, +-0.0434315f,0.994906f,0.0909663f, +-0.106857f,0.994237f,0.00858694f, +-0.103595f,0.993848f,-0.0391609f, +-0.0110181f,0.988269f,-0.152323f, +0.194953f,0.947451f,-0.253632f, +0.318956f,0.92262f,-0.216885f, +0.355303f,0.928796f,-0.105349f, +0.319482f,0.947371f,-0.0204796f, +0.274811f,0.961125f,0.0267891f, +0.33758f,0.938163f,0.0767414f, +0.445225f,0.885597f,0.132261f, +0.483843f,0.868855f,0.104815f, +0.473616f,0.877987f,0.069475f, +0.358094f,0.929841f,-0.0846442f, +0.209896f,0.940516f,-0.267156f, +0.398687f,0.89746f,-0.188715f, +0.164362f,0.933368f,-0.319075f, +-0.0806345f,0.937721f,-0.337901f, +0.19678f,0.945117f,-0.26083f, +0.467829f,0.857531f,-0.213953f, +0.522616f,0.828828f,-0.199792f, +0.48751f,0.848849f,-0.204424f, +0.559553f,0.806974f,-0.18893f, +0.585339f,0.775984f,-0.235006f, +0.309037f,0.923705f,-0.22642f, +0.0763335f,0.997082f,0.00115348f, +-0.0450053f,0.998556f,0.0293498f, +-0.0333568f,0.997154f,-0.0676115f, +-0.00964185f,0.995848f,-0.0905243f, +0.000956175f,0.96601f,-0.258503f, +0.00169255f,0.940578f,-0.339574f, +0.0710047f,0.988076f,-0.136617f, +0.0666563f,0.995318f,-0.0699874f, +-0.123764f,0.98454f,-0.123946f, +-0.163961f,0.983022f,-0.0823738f, +0.335205f,0.824436f,-0.456008f, +0.40434f,0.809075f,-0.426506f, +0.410475f,0.791681f,-0.452494f, +0.374361f,0.829194f,-0.41508f, +0.245781f,0.909811f,-0.33442f, +0.0263815f,0.954919f,-0.295693f, +-0.125325f,0.941665f,-0.312348f, +-0.129375f,0.929134f,-0.346369f, +-0.0304152f,0.953686f,-0.299263f, +-0.0235504f,0.953092f,-0.301762f, +0.153775f,0.94901f,-0.275197f, +0.274986f,0.871191f,-0.406705f, +0.301999f,0.805469f,-0.509919f, +0.376419f,0.798039f,-0.470576f, +0.361388f,0.809968f,-0.461899f, +0.38255f,0.848875f,-0.364783f, +0.240129f,0.889938f,-0.387747f, +-0.0576931f,0.937865f,-0.342172f, +-0.263371f,0.95113f,-0.161204f, +-0.310954f,0.950327f,-0.0136276f, +-0.223147f,0.974756f,-0.00746382f, +-0.15809f,0.984734f,-0.0728478f, +-0.146587f,0.977645f,-0.150739f, +-0.120405f,0.952352f,-0.280228f, +0.00186508f,0.961595f,-0.274467f, +-0.0732237f,0.95724f,-0.279876f, +-0.12777f,0.973556f,-0.189377f, +-0.137722f,0.985013f,-0.103834f, +-0.0840689f,0.995964f,-0.0314252f, +0.00572333f,0.997438f,0.0713008f, +-0.0203309f,0.999218f,0.033924f, +0.0131655f,0.994107f,-0.107599f, +0.106442f,0.965608f,-0.237214f, +0.156613f,0.948157f,-0.276534f, +0.221784f,0.959186f,-0.175425f, +0.297839f,0.94933f,-0.100322f, +0.237415f,0.96993f,-0.0535752f, +0.206724f,0.977649f,0.0383141f, +0.342833f,0.933108f,0.108513f, +0.413098f,0.906827f,0.0837554f, +0.485601f,0.86482f,0.127586f, +0.517433f,0.850444f,0.0949105f, +0.521609f,0.853001f,-0.0177076f, +0.35462f,0.907818f,-0.223854f, +0.320255f,0.896065f,-0.307417f, +0.254422f,0.945666f,-0.202447f, +-0.0420832f,0.95285f,-0.300511f, +0.132146f,0.911038f,-0.390572f, +0.397135f,0.84337f,-0.361954f, +0.530962f,0.805014f,-0.264634f, +0.518015f,0.788476f,-0.331612f, +0.536794f,0.726368f,-0.429234f, +0.499189f,0.748129f,-0.437165f, +0.193048f,0.933972f,-0.300713f, +-0.0642143f,0.969885f,-0.234947f, +-0.0349143f,0.97216f,-0.231701f, +-0.020308f,0.973327f,-0.22852f, +0.0335645f,0.983758f,-0.176336f, +0.162495f,0.963807f,-0.211356f, +0.0549435f,0.960153f,-0.274021f, +-0.150243f,0.943756f,-0.294538f, +0.093877f,0.988384f,-0.119518f, +-0.0288967f,0.977445f,-0.209205f, +-0.228292f,0.925763f,-0.301406f, +0.329933f,0.832357f,-0.445339f, +0.354113f,0.855807f,-0.377092f, +0.402588f,0.885182f,-0.233185f, +0.310305f,0.922327f,-0.23027f, +0.169674f,0.966179f,-0.194188f, +0.0510686f,0.987038f,-0.152145f, +-0.0638218f,0.978386f,-0.196689f, +-0.116946f,0.960297f,-0.253286f, +-0.0788814f,0.945056f,-0.317249f, +0.0429532f,0.937478f,-0.345383f, +0.160798f,0.890341f,-0.425953f, +0.370061f,0.833359f,-0.410569f, +0.405144f,0.796477f,-0.448867f, +0.330775f,0.831238f,-0.446802f, +0.214187f,0.914592f,-0.342995f, +0.302956f,0.933789f,-0.190409f, +0.260411f,0.956162f,-0.13394f, +-0.0987797f,0.989363f,-0.106786f, +-0.381946f,0.915584f,-0.125788f, +-0.356892f,0.930397f,-0.0835967f, +-0.219462f,0.974624f,-0.0441002f, +-0.0826206f,0.996346f,-0.0216629f, +-0.0522166f,0.993096f,-0.10504f, +-0.0544454f,0.992373f,-0.110596f, +-0.0392289f,0.996233f,-0.0773398f, +-0.0738534f,0.995703f,-0.0558676f, +-0.126249f,0.987782f,-0.0913672f, +-0.191576f,0.965578f,-0.17595f, +-0.204819f,0.971278f,-0.121116f, +-0.121301f,0.991656f,-0.0436452f, +0.0591737f,0.997785f,0.0303762f, +0.146031f,0.988908f,-0.0271181f, +0.164489f,0.985353f,-0.0449734f, +0.1732f,0.984753f,-0.0162076f, +0.192999f,0.97944f,-0.0587201f, +0.224284f,0.970976f,-0.0830781f, +0.215597f,0.976395f,0.0130766f, +0.11857f,0.99294f,-0.00337615f, +0.283009f,0.956652f,0.0687283f, +0.418445f,0.903636f,0.0913547f, +0.498249f,0.865176f,0.0567366f, +0.572218f,0.818628f,-0.0491444f, +0.584595f,0.798602f,-0.143119f, +0.499999f,0.838004f,-0.218521f, +0.312173f,0.860973f,-0.401589f, +0.169015f,0.918853f,-0.356571f, +0.0805256f,0.94115f,-0.328258f, +0.268694f,0.864193f,-0.42541f, +0.373719f,0.773399f,-0.512044f, +0.442856f,0.749728f,-0.491717f, +0.564815f,0.671761f,-0.479293f, +0.549235f,0.627986f,-0.551338f, +0.305274f,0.788247f,-0.534298f, +0.0146963f,0.910216f,-0.413874f, +-0.0347141f,0.920746f,-0.388614f, +-0.0142092f,0.918584f,-0.394971f, +-0.0593092f,0.944757f,-0.32236f, +-0.0129026f,0.951456f,-0.307515f, +0.101136f,0.954598f,-0.280203f, +0.103786f,0.979836f,-0.170731f, +-0.130724f,0.946294f,-0.2957f, +-0.0475497f,0.951312f,-0.30454f, +0.068843f,0.980898f,-0.181933f, +-0.0601749f,0.975587f,-0.21121f, +0.164088f,0.946673f,-0.277283f, +0.219167f,0.958752f,-0.180996f, +0.292116f,0.952214f,-0.0892046f, +0.382294f,0.923975f,-0.0110254f, +0.185963f,0.972429f,-0.140709f, +0.0282036f,0.98507f,-0.16983f, +-0.0260978f,0.984942f,-0.170904f, +0.00347731f,0.966818f,-0.255444f, +0.046523f,0.915606f,-0.399376f, +0.121249f,0.881024f,-0.457269f, +0.234655f,0.843553f,-0.483069f, +0.349259f,0.806387f,-0.47724f, +0.352024f,0.817545f,-0.455741f, +0.21f,0.895765f,-0.391796f, +0.123731f,0.946466f,-0.298149f, +0.189246f,0.953263f,-0.235533f, +0.21574f,0.971887f,-0.0943018f, +-0.0878709f,0.988681f,-0.12161f, +-0.31365f,0.930831f,-0.187554f, +-0.370884f,0.90378f,-0.213602f, +-0.292833f,0.938489f,-0.182993f, +-0.076513f,0.991298f,-0.107116f, +-0.0492348f,0.994225f,-0.0953508f, +-0.128831f,0.991129f,-0.0326479f, +-0.117178f,0.99304f,0.0118732f, +-0.0834857f,0.989043f,0.12175f, +-0.0124631f,0.991817f,0.127061f, +-0.133134f,0.991073f,-0.00703918f, +-0.190067f,0.981738f,-0.00811131f, +-0.0950662f,0.989352f,-0.110206f, +0.0262188f,0.977376f,-0.209877f, +0.0774906f,0.981033f,-0.177679f, +0.0911686f,0.995787f,-0.00982619f, +0.177517f,0.984043f,0.0121696f, +0.260966f,0.962001f,-0.0803208f, +0.219093f,0.96759f,-0.12557f, +0.15488f,0.986019f,-0.06147f, +0.155325f,0.987507f,-0.0265508f, +0.257438f,0.9633f,-0.0760109f, +0.429699f,0.898131f,-0.0933795f, +0.553938f,0.821258f,-0.136702f, +0.635333f,0.740056f,-0.220611f, +0.590775f,0.752696f,-0.290577f, +0.544721f,0.782975f,-0.300381f, +0.386007f,0.854199f,-0.348343f, +0.159868f,0.903698f,-0.397205f, +0.111475f,0.854344f,-0.507613f, +0.32886f,0.783243f,-0.527619f, +0.428722f,0.729381f,-0.533105f, +0.463071f,0.680849f,-0.567459f, +0.578683f,0.643078f,-0.501575f, +0.498776f,0.750313f,-0.433881f, +0.172367f,0.935224f,-0.309265f, +-0.0549105f,0.957697f,-0.282492f, +-0.000989137f,0.955961f,-0.293491f, +-0.105185f,0.947134f,-0.303107f, +-0.108598f,0.951252f,-0.288662f, +-0.0192021f,0.937992f,-0.346125f, +0.0434621f,0.947915f,-0.315545f, +0.0658084f,0.965866f,-0.250542f, +0.00168367f,0.969468f,-0.245211f, +-0.0752902f,0.953259f,-0.292624f, +-0.0406571f,0.962797f,-0.267151f, +-0.0486067f,0.969651f,-0.239615f, +0.0419974f,0.993223f,-0.108371f, +0.194169f,0.980548f,-0.0286949f, +0.261981f,0.963651f,-0.0523696f, +0.349136f,0.937066f,-0.00343362f, +0.31121f,0.950026f,0.0244779f, +0.0510089f,0.992585f,-0.110335f, +0.0314098f,0.989653f,-0.140003f, +0.185979f,0.958236f,-0.217244f, +0.136104f,0.898638f,-0.417044f, +0.108771f,0.892335f,-0.438072f, +0.238757f,0.906785f,-0.34747f, +0.373646f,0.87379f,-0.311256f, +0.340425f,0.883999f,-0.320402f, +0.14853f,0.93597f,-0.319217f, +0.0564088f,0.968057f,-0.244304f, +0.0971116f,0.979187f,-0.17822f, +0.12449f,0.986246f,-0.108724f, +0.00791995f,0.999591f,-0.0274806f, +-0.236925f,0.964883f,-0.113439f, +-0.404549f,0.891486f,-0.203944f, +-0.302952f,0.940514f,-0.153798f, +-0.187243f,0.970939f,-0.149055f, +-0.103813f,0.994585f,-0.00480558f, +-0.136945f,0.990579f,0.00047278f, +-0.192386f,0.981319f,0.000301484f, +-0.157118f,0.980577f,0.117404f, +-0.0205849f,0.995936f,0.0876826f, +-0.0389376f,0.992928f,0.112147f, +-0.205589f,0.977918f,0.0375515f, +0.0799477f,0.995293f,0.0547661f, +0.128711f,0.981689f,-0.140426f, +-0.00377139f,0.985264f,-0.170999f, +-0.0186288f,0.990563f,-0.135788f, +0.247861f,0.95847f,-0.141069f, +0.335397f,0.913398f,-0.230679f, +0.164127f,0.956335f,-0.241837f, +0.0560549f,0.992155f,-0.111746f, +0.165621f,0.985752f,-0.0293729f, +0.329655f,0.93718f,-0.114108f, +0.47188f,0.859421f,-0.196784f, +0.593068f,0.774119f,-0.22138f, +0.65363f,0.716422f,-0.24394f, +0.606788f,0.760352f,-0.231675f, +0.536399f,0.810894f,-0.23394f, +0.343135f,0.901586f,-0.263439f, +0.295862f,0.930397f,-0.216396f, +0.307346f,0.85762f,-0.412342f, +0.36437f,0.770675f,-0.522776f, +0.48977f,0.726784f,-0.481571f, +0.467664f,0.727396f,-0.50218f, +0.516451f,0.759976f,-0.394608f, +0.369408f,0.883578f,-0.287798f, +0.11272f,0.986131f,-0.121821f, +-0.0556185f,0.985996f,-0.157218f, +-0.0141506f,0.99059f,-0.13613f, +-0.0462718f,0.993931f,-0.099801f, +-0.0190733f,0.9801f,-0.197584f, +0.0617351f,0.955747f,-0.287639f, +-0.00791345f,0.937814f,-0.347049f, +0.0263533f,0.943249f,-0.331038f, +-0.0408223f,0.937006f,-0.34692f, +-0.0840519f,0.9495f,-0.302299f, +-0.0536227f,0.964498f,-0.25859f, +-0.0366453f,0.973297f,-0.226607f, +0.0559372f,0.997556f,-0.0418806f, +0.117658f,0.99199f,-0.0459629f, +0.260816f,0.963552f,0.059517f, +0.265721f,0.95723f,0.114473f, +0.305022f,0.92568f,0.223781f, +0.229311f,0.961539f,0.151192f, +0.0614828f,0.993074f,-0.10012f, +0.279787f,0.947394f,-0.15545f, +0.307005f,0.902601f,-0.301762f, +0.0599313f,0.924785f,-0.375741f, +0.138459f,0.941623f,-0.306881f, +0.380474f,0.890209f,-0.250536f, +0.362157f,0.883362f,-0.297512f, +0.118666f,0.951617f,-0.283449f, +-0.0864913f,0.973386f,-0.212226f, +0.0535968f,0.99807f,-0.0313783f, +0.0571748f,0.998014f,0.026449f, +-0.0576417f,0.995225f,0.0787756f, +-0.164671f,0.983729f,0.0718444f, +-0.317398f,0.947117f,0.0472105f, +-0.350813f,0.936189f,-0.0219157f, +-0.249283f,0.968275f,0.0173648f, +-0.166219f,0.983818f,0.0668861f, +-0.137263f,0.989074f,0.0537794f, +-0.237615f,0.966132f,0.100634f, +-0.156805f,0.98112f,0.113207f, +0.0155394f,0.999476f,0.0283817f, +-0.0358194f,0.998926f,0.0293752f, +-0.187269f,0.982125f,-0.01898f, +0.0856923f,0.996255f,0.0114998f, +0.21812f,0.975918f,0.00295422f, +0.0575266f,0.997525f,-0.0404377f, +0.0557844f,0.976324f,-0.208997f, +0.282723f,0.906166f,-0.314533f, +0.34017f,0.885713f,-0.315906f, +0.0703654f,0.964786f,-0.253451f, +-0.0857039f,0.987005f,-0.135924f, +0.161068f,0.982423f,-0.0943491f, +0.439921f,0.879468f,-0.181673f, +0.499341f,0.805071f,-0.320185f, +0.581376f,0.752639f,-0.309089f, +0.634744f,0.735927f,-0.235609f, +0.590228f,0.797974f,-0.121932f, +0.552123f,0.824777f,-0.122079f, +0.403254f,0.893687f,-0.196749f, +0.282279f,0.904426f,-0.319896f, +0.487441f,0.821419f,-0.296095f, +0.471414f,0.771013f,-0.428146f, +0.452383f,0.750947f,-0.48107f, +0.453351f,0.789814f,-0.413117f, +0.426317f,0.829282f,-0.361311f, +0.274227f,0.935292f,-0.223671f, +0.0409647f,0.985686f,-0.16354f, +0.00611451f,0.980211f,-0.19786f, +-0.0818346f,0.965065f,-0.248905f, +-0.0402149f,0.984168f,-0.172615f, +0.0358772f,0.970818f,-0.237119f, +0.140843f,0.951316f,-0.274156f, +0.0386407f,0.935491f,-0.351232f, +0.02521f,0.945244f,-0.325388f, +-0.00704123f,0.966541f,-0.256414f, +-0.132543f,0.963814f,-0.231288f, +-0.120001f,0.972985f,-0.197233f, +-0.125856f,0.970406f,-0.20609f, +0.150068f,0.984139f,0.0946078f, +0.0962514f,0.994035f,0.0512922f, +0.139768f,0.98134f,0.132051f, +0.167943f,0.959948f,0.224265f, +0.248876f,0.931236f,0.266197f, +0.347088f,0.901338f,0.259075f, +0.298327f,0.935934f,0.187161f, +0.410224f,0.911771f,0.0197232f, +0.382392f,0.916875f,-0.11453f, +0.0687189f,0.981224f,-0.180215f, +0.109108f,0.978331f,-0.175964f, +0.423091f,0.889035f,-0.17496f, +0.308023f,0.9305f,-0.198221f, +0.0610242f,0.996399f,-0.0588678f, +-0.139679f,0.983461f,-0.1153f, +-0.178862f,0.976278f,-0.122024f, +-0.0279755f,0.98865f,0.147609f, +0.0175582f,0.984678f,0.173494f, +-0.182965f,0.982824f,0.0240987f, +-0.334982f,0.934918f,0.117109f, +-0.346361f,0.929574f,0.126201f, +-0.256073f,0.950373f,0.176686f, +-0.14622f,0.975847f,0.162306f, +-0.145894f,0.982033f,0.119692f, +-0.243091f,0.96438f,0.104295f, +-0.119399f,0.991881f,0.0437603f, +0.0792305f,0.996134f,0.0379462f, +-0.0234512f,0.999544f,0.0190445f, +-0.148416f,0.988869f,0.0105176f, +0.0279419f,0.999576f,0.00824062f, +0.239276f,0.970159f,0.0392311f, +0.182184f,0.979477f,-0.086222f, +0.251919f,0.933495f,-0.255194f, +0.359782f,0.855042f,-0.373444f, +0.260041f,0.87469f,-0.409017f, +-0.0332083f,0.931159f,-0.363099f, +-0.108678f,0.933514f,-0.341673f, +0.191287f,0.909011f,-0.370282f, +0.516055f,0.783319f,-0.346553f, +0.557568f,0.726461f,-0.401711f, +0.511814f,0.738467f,-0.438991f, +0.509794f,0.789775f,-0.341125f, +0.522098f,0.819729f,-0.235496f, +0.54438f,0.815602f,-0.196071f, +0.540927f,0.823066f,-0.173089f, +0.36892f,0.838043f,-0.401972f, +0.461826f,0.790802f,-0.401684f, +0.549439f,0.728653f,-0.408878f, +0.455853f,0.753497f,-0.473751f, +0.389397f,0.799772f,-0.456875f, +0.293181f,0.868874f,-0.398878f, +0.155589f,0.965139f,-0.210473f, +0.031565f,0.984349f,-0.173382f, +0.0970165f,0.970686f,-0.219901f, +-0.0352366f,0.943342f,-0.329946f, +-0.0636858f,0.931929f,-0.357006f, +0.111555f,0.924517f,-0.364451f, +0.180963f,0.908751f,-0.376064f, +0.0582409f,0.924666f,-0.376299f, +-0.091325f,0.934476f,-0.344113f, +-0.148498f,0.963415f,-0.223113f, +-0.170646f,0.976481f,-0.131776f, +-0.0961794f,0.980781f,-0.169761f, +-0.06221f,0.973089f,-0.221874f, +0.206636f,0.934831f,0.288777f, +0.0869406f,0.963592f,0.252847f, +0.0799701f,0.959241f,0.271038f, +0.160525f,0.963414f,0.21463f, +0.255681f,0.955661f,0.146082f, +0.323027f,0.93103f,0.169812f, +0.330118f,0.920313f,0.209873f, +0.447578f,0.884885f,0.12904f, +0.467368f,0.874534f,0.129448f, +0.130174f,0.988207f,0.0806387f, +0.145402f,0.989036f,-0.0258009f, +0.425216f,0.898822f,-0.106345f, +0.205136f,0.977985f,-0.0382811f, +-0.0258123f,0.995757f,0.0883314f, +-0.00518813f,0.996132f,0.0877124f, +-0.192412f,0.980974f,0.0258233f, +-0.196114f,0.979963f,0.0348015f, +0.0217983f,0.995754f,0.0894399f, +-0.10216f,0.980256f,0.169296f, +-0.384424f,0.908881f,0.161723f, +-0.367551f,0.91996f,0.136309f, +-0.285788f,0.948719f,0.135118f, +-0.171256f,0.972185f,0.159771f, +-0.0605854f,0.969905f,0.235826f, +-0.167372f,0.981266f,0.0954134f, +-0.0977838f,0.994994f,0.0206294f, +0.0451608f,0.997867f,0.0471292f, +-0.0136124f,0.997411f,0.0706177f, +-0.158818f,0.986831f,0.0306748f, +0.0267005f,0.99957f,0.0121357f, +0.289361f,0.957076f,-0.0166175f, +0.336393f,0.939976f,-0.0573177f, +0.390118f,0.913466f,-0.115702f, +0.445853f,0.875576f,-0.185959f, +0.293335f,0.914816f,-0.277609f, +-0.00739937f,0.915657f,-0.401893f, +0.00533725f,0.872492f,-0.488599f, +0.197734f,0.788261f,-0.582705f, +0.43334f,0.722538f,-0.53866f, +0.548408f,0.706281f,-0.447678f, +0.484095f,0.751007f,-0.449045f, +0.458828f,0.77804f,-0.429103f, +0.441245f,0.787203f,-0.430829f, +0.474553f,0.805707f,-0.354451f, +0.550933f,0.789486f,-0.270526f, +0.502032f,0.792798f,-0.345594f, +0.478273f,0.764634f,-0.43196f, +0.556872f,0.730832f,-0.394687f, +0.471855f,0.788619f,-0.394251f, +0.354943f,0.841801f,-0.406677f, +0.154029f,0.899791f,-0.40823f, +0.0155123f,0.938951f,-0.343701f, +0.0497714f,0.948037f,-0.314243f, +0.154285f,0.935402f,-0.31815f, +0.101927f,0.920411f,-0.377432f, +-0.0203862f,0.864666f,-0.501933f, +0.070179f,0.866621f,-0.494007f, +0.100294f,0.910674f,-0.400766f, +0.000402101f,0.968295f,-0.249809f, +-0.128961f,0.971456f,-0.199105f, +-0.199723f,0.946207f,-0.254564f, +-0.134113f,0.940975f,-0.310772f, +-0.0316747f,0.927512f,-0.372449f, +0.0302907f,0.938917f,-0.342807f, +0.218976f,0.899032f,0.379198f, +0.139079f,0.919337f,0.368072f, +0.135024f,0.957047f,0.256573f, +0.313512f,0.936875f,0.154838f, +0.29644f,0.95504f,0.00476296f, +0.279277f,0.959996f,0.0202722f, +0.3625f,0.931007f,0.0426625f, +0.472022f,0.881367f,0.0196857f, +0.429567f,0.887347f,0.167594f, +0.224991f,0.963227f,0.146879f, +0.296133f,0.954919f,-0.0208476f, +0.415966f,0.902166f,-0.114319f, +0.183129f,0.982743f,0.0260829f, +-0.0925135f,0.995706f,-0.00325499f, +-0.0437431f,0.995986f,0.0780946f, +-0.179713f,0.977607f,0.109486f, +-0.141385f,0.986823f,0.0786845f, +-0.085949f,0.993479f,0.0749198f, +-0.233157f,0.944593f,0.231044f, +-0.345216f,0.897121f,0.275681f, +-0.266518f,0.944857f,0.190296f, +-0.236509f,0.971079f,0.032684f, +-0.255527f,0.96653f,-0.0229239f, +-0.0941044f,0.991025f,0.0949427f, +-0.0715158f,0.990946f,0.113625f, +-0.0636481f,0.988651f,0.136079f, +0.0130078f,0.992968f,0.11767f, +0.0194535f,0.99321f,0.114698f, +-0.0733749f,0.997304f,0.000320173f, +0.0745089f,0.991949f,-0.102398f, +0.316045f,0.940065f,-0.128038f, +0.302503f,0.936628f,-0.176692f, +0.365578f,0.917629f,-0.155918f, +0.474055f,0.875706f,-0.091714f, +0.462666f,0.882661f,-0.0827679f, +0.197672f,0.918824f,-0.341598f, +0.1211f,0.851979f,-0.509379f, +0.340562f,0.776445f,-0.530237f, +0.411588f,0.704014f,-0.578756f, +0.454493f,0.713166f,-0.533695f, +0.463114f,0.742631f,-0.483761f, +0.44079f,0.754688f,-0.485953f, +0.400302f,0.772025f,-0.493696f, +0.38659f,0.783016f,-0.487272f, +0.457033f,0.766931f,-0.450487f, +0.547084f,0.759757f,-0.351382f, +0.508566f,0.782012f,-0.360303f, +0.54699f,0.792915f,-0.268492f, +0.489855f,0.837224f,-0.243102f, +0.350988f,0.891534f,-0.286312f, +0.195385f,0.947495f,-0.253137f, +0.0709694f,0.939176f,-0.336023f, +0.0288377f,0.903143f,-0.42837f, +0.128806f,0.91498f,-0.382389f, +0.209123f,0.895775f,-0.392243f, +0.0981301f,0.852621f,-0.513233f, +-0.0414306f,0.841347f,-0.538906f, +-0.0951984f,0.922571f,-0.373899f, +-0.157973f,0.963972f,-0.214014f, +-0.107909f,0.978829f,-0.173926f, +-0.0713291f,0.969594f,-0.234092f, +0.0141898f,0.950434f,-0.310602f, +-0.0202439f,0.895649f,-0.4443f, +-0.114151f,0.867225f,-0.484655f, +0.0955354f,0.969912f,0.223927f, +0.218114f,0.913651f,0.343028f, +0.223104f,0.958808f,0.175816f, +0.39761f,0.915149f,0.0663907f, +0.332649f,0.940641f,-0.0673772f, +0.280455f,0.956871f,-0.0757854f, +0.359446f,0.926985f,-0.107225f, +0.369482f,0.924827f,-0.0904272f, +0.410746f,0.887001f,0.210991f, +0.335823f,0.922126f,0.192112f, +0.395669f,0.917218f,-0.0464346f, +0.353697f,0.926083f,-0.131407f, +0.179534f,0.981887f,0.0605388f, +-0.13479f,0.99057f,-0.0245515f, +-0.0725996f,0.990136f,0.119831f, +-0.160567f,0.981095f,0.108036f, +-0.173547f,0.983858f,0.0436428f, +-0.151709f,0.976244f,0.154697f, +-0.302597f,0.914896f,0.267208f, +-0.328732f,0.906446f,0.265123f, +-0.132663f,0.960039f,0.246424f, +-0.138673f,0.989957f,0.0274833f, +-0.234284f,0.968151f,-0.0882923f, +-0.176173f,0.979923f,-0.0933525f, +-0.138089f,0.990412f,-0.00402308f, +-0.0957719f,0.981754f,0.164279f, +0.0343111f,0.979592f,0.198047f, +0.0638942f,0.984862f,0.161133f, +0.0719687f,0.995312f,0.0646062f, +0.0847007f,0.982914f,-0.163422f, +0.363247f,0.926697f,-0.0963506f, +0.36667f,0.908341f,-0.201173f, +0.337169f,0.882657f,-0.327465f, +0.394509f,0.879929f,-0.264742f, +0.48646f,0.864989f,-0.123088f, +0.417344f,0.883151f,-0.21417f, +0.20086f,0.830272f,-0.519907f, +0.38892f,0.767179f,-0.510077f, +0.449414f,0.718324f,-0.531072f, +0.423477f,0.726204f,-0.541567f, +0.422958f,0.74196f,-0.520194f, +0.433204f,0.760712f,-0.483374f, +0.409051f,0.775415f,-0.481049f, +0.416047f,0.762178f,-0.495973f, +0.412818f,0.728929f,-0.546117f, +0.422596f,0.756339f,-0.499363f, +0.473538f,0.806572f,-0.353841f, +0.474731f,0.838081f,-0.268794f, +0.539079f,0.832631f,-0.126962f, +0.311124f,0.910644f,-0.271898f, +0.195648f,0.962321f,-0.18884f, +0.177086f,0.961235f,-0.211349f, +0.0559264f,0.927874f,-0.368677f, +0.121016f,0.928529f,-0.350982f, +0.256538f,0.895264f,-0.364269f, +0.222607f,0.876269f,-0.427317f, +-0.106542f,0.82471f,-0.55543f, +-0.245122f,0.890501f,-0.383305f, +-0.209725f,0.956698f,-0.201855f, +-0.0624605f,0.97406f,-0.2175f, +-0.0812465f,0.947824f,-0.308266f, +0.0649824f,0.972455f,-0.223851f, +0.119957f,0.950206f,-0.287609f, +-0.0414767f,0.905483f,-0.422351f, +}; + +btScalar Landscape03Tex[] = { +0.507813f,0.5f, +0.507813f,0.492188f, +0.515625f,0.5f, +0.515625f,0.492188f, +0.523438f,0.5f, +0.523438f,0.492188f, +0.53125f,0.5f, +0.53125f,0.492188f, +0.539063f,0.5f, +0.539063f,0.492188f, +0.546875f,0.5f, +0.546875f,0.492188f, +0.554688f,0.5f, +0.554688f,0.492188f, +0.5625f,0.5f, +0.5625f,0.492188f, +0.570313f,0.5f, +0.570313f,0.492188f, +0.578125f,0.5f, +0.578125f,0.492188f, +0.585938f,0.5f, +0.585938f,0.492188f, +0.59375f,0.5f, +0.59375f,0.492188f, +0.601563f,0.5f, +0.601563f,0.492188f, +0.609375f,0.5f, +0.609375f,0.492188f, +0.617188f,0.5f, +0.617188f,0.492188f, +0.625f,0.5f, +0.625f,0.492188f, +0.632813f,0.5f, +0.632813f,0.492188f, +0.640625f,0.5f, +0.640625f,0.492188f, +0.648438f,0.5f, +0.648438f,0.492188f, +0.65625f,0.5f, +0.65625f,0.492188f, +0.664063f,0.5f, +0.664063f,0.492188f, +0.671875f,0.5f, +0.671875f,0.492188f, +0.679688f,0.5f, +0.679688f,0.492188f, +0.6875f,0.5f, +0.6875f,0.492188f, +0.695313f,0.5f, +0.695313f,0.492188f, +0.703125f,0.5f, +0.703125f,0.492188f, +0.710938f,0.5f, +0.710938f,0.492188f, +0.71875f,0.5f, +0.71875f,0.492188f, +0.726563f,0.5f, +0.726563f,0.492188f, +0.734375f,0.5f, +0.734375f,0.492188f, +0.742188f,0.5f, +0.742188f,0.492188f, +0.75f,0.5f, +0.75f,0.492188f, +0.757813f,0.5f, +0.757813f,0.492188f, +0.765625f,0.5f, +0.765625f,0.492188f, +0.773438f,0.5f, +0.773438f,0.492188f, +0.78125f,0.5f, +0.78125f,0.492188f, +0.789063f,0.5f, +0.789063f,0.492188f, +0.796875f,0.5f, +0.796875f,0.492188f, +0.804688f,0.5f, +0.804688f,0.492188f, +0.8125f,0.5f, +0.8125f,0.492188f, +0.820313f,0.5f, +0.820313f,0.492188f, +0.828125f,0.5f, +0.828125f,0.492188f, +0.835938f,0.5f, +0.835938f,0.492188f, +0.84375f,0.5f, +0.84375f,0.492188f, +0.851563f,0.5f, +0.851563f,0.492188f, +0.859375f,0.5f, +0.859375f,0.492188f, +0.867188f,0.5f, +0.867188f,0.492188f, +0.875f,0.5f, +0.875f,0.492188f, +0.882813f,0.5f, +0.882813f,0.492188f, +0.890625f,0.5f, +0.890625f,0.492188f, +0.898438f,0.5f, +0.898438f,0.492188f, +0.90625f,0.5f, +0.90625f,0.492188f, +0.914063f,0.5f, +0.914063f,0.492188f, +0.921875f,0.5f, +0.921875f,0.492188f, +0.929688f,0.5f, +0.929688f,0.492188f, +0.9375f,0.5f, +0.9375f,0.492188f, +0.945313f,0.5f, +0.945313f,0.492188f, +0.953125f,0.5f, +0.953125f,0.492188f, +0.960938f,0.5f, +0.960938f,0.492188f, +0.96875f,0.5f, +0.96875f,0.492188f, +0.976563f,0.5f, +0.976563f,0.492188f, +0.984375f,0.5f, +0.984375f,0.492188f, +0.992188f,0.5f, +0.992188f,0.492188f, +1.0f,0.5f, +1.0f,0.492188f, +0.507813f,0.507813f, +0.515625f,0.507813f, +0.523438f,0.507813f, +0.53125f,0.507813f, +0.539063f,0.507813f, +0.546875f,0.507813f, +0.554688f,0.507813f, +0.5625f,0.507813f, +0.570313f,0.507813f, +0.578125f,0.507813f, +0.585938f,0.507813f, +0.59375f,0.507813f, +0.601563f,0.507813f, +0.609375f,0.507813f, +0.617188f,0.507813f, +0.625f,0.507813f, +0.632813f,0.507813f, +0.640625f,0.507813f, +0.648438f,0.507813f, +0.65625f,0.507813f, +0.664063f,0.507813f, +0.671875f,0.507813f, +0.679688f,0.507813f, +0.6875f,0.507813f, +0.695313f,0.507813f, +0.703125f,0.507813f, +0.710938f,0.507813f, +0.71875f,0.507813f, +0.726563f,0.507813f, +0.734375f,0.507813f, +0.742188f,0.507813f, +0.75f,0.507813f, +0.757813f,0.507813f, +0.765625f,0.507813f, +0.773438f,0.507813f, +0.78125f,0.507813f, +0.789063f,0.507813f, +0.796875f,0.507813f, +0.804688f,0.507813f, +0.8125f,0.507813f, +0.820313f,0.507813f, +0.828125f,0.507813f, +0.835938f,0.507813f, +0.84375f,0.507813f, +0.851563f,0.507813f, +0.859375f,0.507813f, +0.867188f,0.507813f, +0.875f,0.507813f, +0.882813f,0.507813f, +0.890625f,0.507813f, +0.898438f,0.507813f, +0.90625f,0.507813f, +0.914063f,0.507813f, +0.921875f,0.507813f, +0.929688f,0.507813f, +0.9375f,0.507813f, +0.945313f,0.507813f, +0.953125f,0.507813f, +0.960938f,0.507813f, +0.96875f,0.507813f, +0.976563f,0.507813f, +0.984375f,0.507813f, +0.992188f,0.507813f, +1.0f,0.507813f, +0.507813f,0.515625f, +0.515625f,0.515625f, +0.523438f,0.515625f, +0.53125f,0.515625f, +0.539063f,0.515625f, +0.546875f,0.515625f, +0.554688f,0.515625f, +0.5625f,0.515625f, +0.570313f,0.515625f, +0.578125f,0.515625f, +0.585938f,0.515625f, +0.59375f,0.515625f, +0.601563f,0.515625f, +0.609375f,0.515625f, +0.617188f,0.515625f, +0.625f,0.515625f, +0.632813f,0.515625f, +0.640625f,0.515625f, +0.648438f,0.515625f, +0.65625f,0.515625f, +0.664063f,0.515625f, +0.671875f,0.515625f, +0.679688f,0.515625f, +0.6875f,0.515625f, +0.695313f,0.515625f, +0.703125f,0.515625f, +0.710938f,0.515625f, +0.71875f,0.515625f, +0.726563f,0.515625f, +0.734375f,0.515625f, +0.742188f,0.515625f, +0.75f,0.515625f, +0.757813f,0.515625f, +0.765625f,0.515625f, +0.773438f,0.515625f, +0.78125f,0.515625f, +0.789063f,0.515625f, +0.796875f,0.515625f, +0.804688f,0.515625f, +0.8125f,0.515625f, +0.820313f,0.515625f, +0.828125f,0.515625f, +0.835938f,0.515625f, +0.84375f,0.515625f, +0.851563f,0.515625f, +0.859375f,0.515625f, +0.867188f,0.515625f, +0.875f,0.515625f, +0.882813f,0.515625f, +0.890625f,0.515625f, +0.898438f,0.515625f, +0.90625f,0.515625f, +0.914063f,0.515625f, +0.921875f,0.515625f, +0.929688f,0.515625f, +0.9375f,0.515625f, +0.945313f,0.515625f, +0.953125f,0.515625f, +0.960938f,0.515625f, +0.96875f,0.515625f, +0.976563f,0.515625f, +0.984375f,0.515625f, +0.992188f,0.515625f, +1.0f,0.515625f, +0.507813f,0.523438f, +0.515625f,0.523438f, +0.523438f,0.523438f, +0.53125f,0.523438f, +0.539063f,0.523438f, +0.546875f,0.523438f, +0.554688f,0.523438f, +0.5625f,0.523438f, +0.570313f,0.523438f, +0.578125f,0.523438f, +0.585938f,0.523438f, +0.59375f,0.523438f, +0.601563f,0.523438f, +0.609375f,0.523438f, +0.617188f,0.523438f, +0.625f,0.523438f, +0.632813f,0.523438f, +0.640625f,0.523438f, +0.648438f,0.523438f, +0.65625f,0.523438f, +0.664063f,0.523438f, +0.671875f,0.523438f, +0.679688f,0.523438f, +0.6875f,0.523438f, +0.695313f,0.523438f, +0.703125f,0.523438f, +0.710938f,0.523438f, +0.71875f,0.523438f, +0.726563f,0.523438f, +0.734375f,0.523438f, +0.742188f,0.523438f, +0.75f,0.523438f, +0.757813f,0.523438f, +0.765625f,0.523438f, +0.773438f,0.523438f, +0.78125f,0.523438f, +0.789063f,0.523438f, +0.796875f,0.523438f, +0.804688f,0.523438f, +0.8125f,0.523438f, +0.820313f,0.523438f, +0.828125f,0.523438f, +0.835938f,0.523438f, +0.84375f,0.523438f, +0.851563f,0.523438f, +0.859375f,0.523438f, +0.867188f,0.523438f, +0.875f,0.523438f, +0.882813f,0.523438f, +0.890625f,0.523438f, +0.898438f,0.523438f, +0.90625f,0.523438f, +0.914063f,0.523438f, +0.921875f,0.523438f, +0.929688f,0.523438f, +0.9375f,0.523438f, +0.945313f,0.523438f, +0.953125f,0.523438f, +0.960938f,0.523438f, +0.96875f,0.523438f, +0.976563f,0.523438f, +0.984375f,0.523438f, +0.992188f,0.523438f, +1.0f,0.523438f, +0.507813f,0.53125f, +0.515625f,0.53125f, +0.523438f,0.53125f, +0.53125f,0.53125f, +0.539063f,0.53125f, +0.546875f,0.53125f, +0.554688f,0.53125f, +0.5625f,0.53125f, +0.570313f,0.53125f, +0.578125f,0.53125f, +0.585938f,0.53125f, +0.59375f,0.53125f, +0.601563f,0.53125f, +0.609375f,0.53125f, +0.617188f,0.53125f, +0.625f,0.53125f, +0.632813f,0.53125f, +0.640625f,0.53125f, +0.648438f,0.53125f, +0.65625f,0.53125f, +0.664063f,0.53125f, +0.671875f,0.53125f, +0.679688f,0.53125f, +0.6875f,0.53125f, +0.695313f,0.53125f, +0.703125f,0.53125f, +0.710938f,0.53125f, +0.71875f,0.53125f, +0.726563f,0.53125f, +0.734375f,0.53125f, +0.742188f,0.53125f, +0.75f,0.53125f, +0.757813f,0.53125f, +0.765625f,0.53125f, +0.773438f,0.53125f, +0.78125f,0.53125f, +0.789063f,0.53125f, +0.796875f,0.53125f, +0.804688f,0.53125f, +0.8125f,0.53125f, +0.820313f,0.53125f, +0.828125f,0.53125f, +0.835938f,0.53125f, +0.84375f,0.53125f, +0.851563f,0.53125f, +0.859375f,0.53125f, +0.867188f,0.53125f, +0.875f,0.53125f, +0.882813f,0.53125f, +0.890625f,0.53125f, +0.898438f,0.53125f, +0.90625f,0.53125f, +0.914063f,0.53125f, +0.921875f,0.53125f, +0.929688f,0.53125f, +0.9375f,0.53125f, +0.945313f,0.53125f, +0.953125f,0.53125f, +0.960938f,0.53125f, +0.96875f,0.53125f, +0.976563f,0.53125f, +0.984375f,0.53125f, +0.992188f,0.53125f, +1.0f,0.53125f, +0.507813f,0.539063f, +0.515625f,0.539063f, +0.523438f,0.539063f, +0.53125f,0.539063f, +0.539063f,0.539063f, +0.546875f,0.539063f, +0.554688f,0.539063f, +0.5625f,0.539063f, +0.570313f,0.539063f, +0.578125f,0.539063f, +0.585938f,0.539063f, +0.59375f,0.539063f, +0.601563f,0.539063f, +0.609375f,0.539063f, +0.617188f,0.539063f, +0.625f,0.539063f, +0.632813f,0.539063f, +0.640625f,0.539063f, +0.648438f,0.539063f, +0.65625f,0.539063f, +0.664063f,0.539063f, +0.671875f,0.539063f, +0.679688f,0.539063f, +0.6875f,0.539063f, +0.695313f,0.539063f, +0.703125f,0.539063f, +0.710938f,0.539063f, +0.71875f,0.539063f, +0.726563f,0.539063f, +0.734375f,0.539063f, +0.742188f,0.539063f, +0.75f,0.539063f, +0.757813f,0.539063f, +0.765625f,0.539063f, +0.773438f,0.539063f, +0.78125f,0.539063f, +0.789063f,0.539063f, +0.796875f,0.539063f, +0.804688f,0.539063f, +0.8125f,0.539063f, +0.820313f,0.539063f, +0.828125f,0.539063f, +0.835938f,0.539063f, +0.84375f,0.539063f, +0.851563f,0.539063f, +0.859375f,0.539063f, +0.867188f,0.539063f, +0.875f,0.539063f, +0.882813f,0.539063f, +0.890625f,0.539063f, +0.898438f,0.539063f, +0.90625f,0.539063f, +0.914063f,0.539063f, +0.921875f,0.539063f, +0.929688f,0.539063f, +0.9375f,0.539063f, +0.945313f,0.539063f, +0.953125f,0.539063f, +0.960938f,0.539063f, +0.96875f,0.539063f, +0.976563f,0.539063f, +0.984375f,0.539063f, +0.992188f,0.539063f, +1.0f,0.539063f, +0.507813f,0.546875f, +0.515625f,0.546875f, +0.523438f,0.546875f, +0.53125f,0.546875f, +0.539063f,0.546875f, +0.546875f,0.546875f, +0.554688f,0.546875f, +0.5625f,0.546875f, +0.570313f,0.546875f, +0.578125f,0.546875f, +0.585938f,0.546875f, +0.59375f,0.546875f, +0.601563f,0.546875f, +0.609375f,0.546875f, +0.617188f,0.546875f, +0.625f,0.546875f, +0.632813f,0.546875f, +0.640625f,0.546875f, +0.648438f,0.546875f, +0.65625f,0.546875f, +0.664063f,0.546875f, +0.671875f,0.546875f, +0.679688f,0.546875f, +0.6875f,0.546875f, +0.695313f,0.546875f, +0.703125f,0.546875f, +0.710938f,0.546875f, +0.71875f,0.546875f, +0.726563f,0.546875f, +0.734375f,0.546875f, +0.742188f,0.546875f, +0.75f,0.546875f, +0.757813f,0.546875f, +0.765625f,0.546875f, +0.773438f,0.546875f, +0.78125f,0.546875f, +0.789063f,0.546875f, +0.796875f,0.546875f, +0.804688f,0.546875f, +0.8125f,0.546875f, +0.820313f,0.546875f, +0.828125f,0.546875f, +0.835938f,0.546875f, +0.84375f,0.546875f, +0.851563f,0.546875f, +0.859375f,0.546875f, +0.867188f,0.546875f, +0.875f,0.546875f, +0.882813f,0.546875f, +0.890625f,0.546875f, +0.898438f,0.546875f, +0.90625f,0.546875f, +0.914063f,0.546875f, +0.921875f,0.546875f, +0.929688f,0.546875f, +0.9375f,0.546875f, +0.945313f,0.546875f, +0.953125f,0.546875f, +0.960938f,0.546875f, +0.96875f,0.546875f, +0.976563f,0.546875f, +0.984375f,0.546875f, +0.992188f,0.546875f, +1.0f,0.546875f, +0.507813f,0.554688f, +0.515625f,0.554688f, +0.523438f,0.554688f, +0.53125f,0.554688f, +0.539063f,0.554688f, +0.546875f,0.554688f, +0.554688f,0.554688f, +0.5625f,0.554688f, +0.570313f,0.554688f, +0.578125f,0.554688f, +0.585938f,0.554688f, +0.59375f,0.554688f, +0.601563f,0.554688f, +0.609375f,0.554688f, +0.617188f,0.554688f, +0.625f,0.554688f, +0.632813f,0.554688f, +0.640625f,0.554688f, +0.648438f,0.554688f, +0.65625f,0.554688f, +0.664063f,0.554688f, +0.671875f,0.554688f, +0.679688f,0.554688f, +0.6875f,0.554688f, +0.695313f,0.554688f, +0.703125f,0.554688f, +0.710938f,0.554688f, +0.71875f,0.554688f, +0.726563f,0.554688f, +0.734375f,0.554688f, +0.742188f,0.554688f, +0.75f,0.554688f, +0.757813f,0.554688f, +0.765625f,0.554688f, +0.773438f,0.554688f, +0.78125f,0.554688f, +0.789063f,0.554688f, +0.796875f,0.554688f, +0.804688f,0.554688f, +0.8125f,0.554688f, +0.820313f,0.554688f, +0.828125f,0.554688f, +0.835938f,0.554688f, +0.84375f,0.554688f, +0.851563f,0.554688f, +0.859375f,0.554688f, +0.867188f,0.554688f, +0.875f,0.554688f, +0.882813f,0.554688f, +0.890625f,0.554688f, +0.898438f,0.554688f, +0.90625f,0.554688f, +0.914063f,0.554688f, +0.921875f,0.554688f, +0.929688f,0.554688f, +0.9375f,0.554688f, +0.945313f,0.554688f, +0.953125f,0.554688f, +0.960938f,0.554688f, +0.96875f,0.554688f, +0.976563f,0.554688f, +0.984375f,0.554688f, +0.992188f,0.554688f, +1.0f,0.554688f, +0.507813f,0.5625f, +0.515625f,0.5625f, +0.523438f,0.5625f, +0.53125f,0.5625f, +0.539063f,0.5625f, +0.546875f,0.5625f, +0.554688f,0.5625f, +0.5625f,0.5625f, +0.570313f,0.5625f, +0.578125f,0.5625f, +0.585938f,0.5625f, +0.59375f,0.5625f, +0.601563f,0.5625f, +0.609375f,0.5625f, +0.617188f,0.5625f, +0.625f,0.5625f, +0.632813f,0.5625f, +0.640625f,0.5625f, +0.648438f,0.5625f, +0.65625f,0.5625f, +0.664063f,0.5625f, +0.671875f,0.5625f, +0.679688f,0.5625f, +0.6875f,0.5625f, +0.695313f,0.5625f, +0.703125f,0.5625f, +0.710938f,0.5625f, +0.71875f,0.5625f, +0.726563f,0.5625f, +0.734375f,0.5625f, +0.742188f,0.5625f, +0.75f,0.5625f, +0.757813f,0.5625f, +0.765625f,0.5625f, +0.773438f,0.5625f, +0.78125f,0.5625f, +0.789063f,0.5625f, +0.796875f,0.5625f, +0.804688f,0.5625f, +0.8125f,0.5625f, +0.820313f,0.5625f, +0.828125f,0.5625f, +0.835938f,0.5625f, +0.84375f,0.5625f, +0.851563f,0.5625f, +0.859375f,0.5625f, +0.867188f,0.5625f, +0.875f,0.5625f, +0.882813f,0.5625f, +0.890625f,0.5625f, +0.898438f,0.5625f, +0.90625f,0.5625f, +0.914063f,0.5625f, +0.921875f,0.5625f, +0.929688f,0.5625f, +0.9375f,0.5625f, +0.945313f,0.5625f, +0.953125f,0.5625f, +0.960938f,0.5625f, +0.96875f,0.5625f, +0.976563f,0.5625f, +0.984375f,0.5625f, +0.992188f,0.5625f, +1.0f,0.5625f, +0.507813f,0.570313f, +0.515625f,0.570313f, +0.523438f,0.570313f, +0.53125f,0.570313f, +0.539063f,0.570313f, +0.546875f,0.570313f, +0.554688f,0.570313f, +0.5625f,0.570313f, +0.570313f,0.570313f, +0.578125f,0.570313f, +0.585938f,0.570313f, +0.59375f,0.570313f, +0.601563f,0.570313f, +0.609375f,0.570313f, +0.617188f,0.570313f, +0.625f,0.570313f, +0.632813f,0.570313f, +0.640625f,0.570313f, +0.648438f,0.570313f, +0.65625f,0.570313f, +0.664063f,0.570313f, +0.671875f,0.570313f, +0.679688f,0.570313f, +0.6875f,0.570313f, +0.695313f,0.570313f, +0.703125f,0.570313f, +0.710938f,0.570313f, +0.71875f,0.570313f, +0.726563f,0.570313f, +0.734375f,0.570313f, +0.742188f,0.570313f, +0.75f,0.570313f, +0.757813f,0.570313f, +0.765625f,0.570313f, +0.773438f,0.570313f, +0.78125f,0.570313f, +0.789063f,0.570313f, +0.796875f,0.570313f, +0.804688f,0.570313f, +0.8125f,0.570313f, +0.820313f,0.570313f, +0.828125f,0.570313f, +0.835938f,0.570313f, +0.84375f,0.570313f, +0.851563f,0.570313f, +0.859375f,0.570313f, +0.867188f,0.570313f, +0.875f,0.570313f, +0.882813f,0.570313f, +0.890625f,0.570313f, +0.898438f,0.570313f, +0.90625f,0.570313f, +0.914063f,0.570313f, +0.921875f,0.570313f, +0.929688f,0.570313f, +0.9375f,0.570313f, +0.945313f,0.570313f, +0.953125f,0.570313f, +0.960938f,0.570313f, +0.96875f,0.570313f, +0.976563f,0.570313f, +0.984375f,0.570313f, +0.992188f,0.570313f, +1.0f,0.570313f, +0.507813f,0.578125f, +0.515625f,0.578125f, +0.523438f,0.578125f, +0.53125f,0.578125f, +0.539063f,0.578125f, +0.546875f,0.578125f, +0.554688f,0.578125f, +0.5625f,0.578125f, +0.570313f,0.578125f, +0.578125f,0.578125f, +0.585938f,0.578125f, +0.59375f,0.578125f, +0.601563f,0.578125f, +0.609375f,0.578125f, +0.617188f,0.578125f, +0.625f,0.578125f, +0.632813f,0.578125f, +0.640625f,0.578125f, +0.648438f,0.578125f, +0.65625f,0.578125f, +0.664063f,0.578125f, +0.671875f,0.578125f, +0.679688f,0.578125f, +0.6875f,0.578125f, +0.695313f,0.578125f, +0.703125f,0.578125f, +0.710938f,0.578125f, +0.71875f,0.578125f, +0.726563f,0.578125f, +0.734375f,0.578125f, +0.742188f,0.578125f, +0.75f,0.578125f, +0.757813f,0.578125f, +0.765625f,0.578125f, +0.773438f,0.578125f, +0.78125f,0.578125f, +0.789063f,0.578125f, +0.796875f,0.578125f, +0.804688f,0.578125f, +0.8125f,0.578125f, +0.820313f,0.578125f, +0.828125f,0.578125f, +0.835938f,0.578125f, +0.84375f,0.578125f, +0.851563f,0.578125f, +0.859375f,0.578125f, +0.867188f,0.578125f, +0.875f,0.578125f, +0.882813f,0.578125f, +0.890625f,0.578125f, +0.898438f,0.578125f, +0.90625f,0.578125f, +0.914063f,0.578125f, +0.921875f,0.578125f, +0.929688f,0.578125f, +0.9375f,0.578125f, +0.945313f,0.578125f, +0.953125f,0.578125f, +0.960938f,0.578125f, +0.96875f,0.578125f, +0.976563f,0.578125f, +0.984375f,0.578125f, +0.992188f,0.578125f, +1.0f,0.578125f, +0.507813f,0.585938f, +0.515625f,0.585938f, +0.523438f,0.585938f, +0.53125f,0.585938f, +0.539063f,0.585938f, +0.546875f,0.585938f, +0.554688f,0.585938f, +0.5625f,0.585938f, +0.570313f,0.585938f, +0.578125f,0.585938f, +0.585938f,0.585938f, +0.59375f,0.585938f, +0.601563f,0.585938f, +0.609375f,0.585938f, +0.617188f,0.585938f, +0.625f,0.585938f, +0.632813f,0.585938f, +0.640625f,0.585938f, +0.648438f,0.585938f, +0.65625f,0.585938f, +0.664063f,0.585938f, +0.671875f,0.585938f, +0.679688f,0.585938f, +0.6875f,0.585938f, +0.695313f,0.585938f, +0.703125f,0.585938f, +0.710938f,0.585938f, +0.71875f,0.585938f, +0.726563f,0.585938f, +0.734375f,0.585938f, +0.742188f,0.585938f, +0.75f,0.585938f, +0.757813f,0.585938f, +0.765625f,0.585938f, +0.773438f,0.585938f, +0.78125f,0.585938f, +0.789063f,0.585938f, +0.796875f,0.585938f, +0.804688f,0.585938f, +0.8125f,0.585938f, +0.820313f,0.585938f, +0.828125f,0.585938f, +0.835938f,0.585938f, +0.84375f,0.585938f, +0.851563f,0.585938f, +0.859375f,0.585938f, +0.867188f,0.585938f, +0.875f,0.585938f, +0.882813f,0.585938f, +0.890625f,0.585938f, +0.898438f,0.585938f, +0.90625f,0.585938f, +0.914063f,0.585938f, +0.921875f,0.585938f, +0.929688f,0.585938f, +0.9375f,0.585938f, +0.945313f,0.585938f, +0.953125f,0.585938f, +0.960938f,0.585938f, +0.96875f,0.585938f, +0.976563f,0.585938f, +0.984375f,0.585938f, +0.992188f,0.585938f, +1.0f,0.585938f, +0.507813f,0.59375f, +0.515625f,0.59375f, +0.523438f,0.59375f, +0.53125f,0.59375f, +0.539063f,0.59375f, +0.546875f,0.59375f, +0.554688f,0.59375f, +0.5625f,0.59375f, +0.570313f,0.59375f, +0.578125f,0.59375f, +0.585938f,0.59375f, +0.59375f,0.59375f, +0.601563f,0.59375f, +0.609375f,0.59375f, +0.617188f,0.59375f, +0.625f,0.59375f, +0.632813f,0.59375f, +0.640625f,0.59375f, +0.648438f,0.59375f, +0.65625f,0.59375f, +0.664063f,0.59375f, +0.671875f,0.59375f, +0.679688f,0.59375f, +0.6875f,0.59375f, +0.695313f,0.59375f, +0.703125f,0.59375f, +0.710938f,0.59375f, +0.71875f,0.59375f, +0.726563f,0.59375f, +0.734375f,0.59375f, +0.742188f,0.59375f, +0.75f,0.59375f, +0.757813f,0.59375f, +0.765625f,0.59375f, +0.773438f,0.59375f, +0.78125f,0.59375f, +0.789063f,0.59375f, +0.796875f,0.59375f, +0.804688f,0.59375f, +0.8125f,0.59375f, +0.820313f,0.59375f, +0.828125f,0.59375f, +0.835938f,0.59375f, +0.84375f,0.59375f, +0.851563f,0.59375f, +0.859375f,0.59375f, +0.867188f,0.59375f, +0.875f,0.59375f, +0.882813f,0.59375f, +0.890625f,0.59375f, +0.898438f,0.59375f, +0.90625f,0.59375f, +0.914063f,0.59375f, +0.921875f,0.59375f, +0.929688f,0.59375f, +0.9375f,0.59375f, +0.945313f,0.59375f, +0.953125f,0.59375f, +0.960938f,0.59375f, +0.96875f,0.59375f, +0.976563f,0.59375f, +0.984375f,0.59375f, +0.992188f,0.59375f, +1.0f,0.59375f, +0.507813f,0.601563f, +0.515625f,0.601563f, +0.523438f,0.601563f, +0.53125f,0.601563f, +0.539063f,0.601563f, +0.546875f,0.601563f, +0.554688f,0.601563f, +0.5625f,0.601563f, +0.570313f,0.601563f, +0.578125f,0.601563f, +0.585938f,0.601563f, +0.59375f,0.601563f, +0.601563f,0.601563f, +0.609375f,0.601563f, +0.617188f,0.601563f, +0.625f,0.601563f, +0.632813f,0.601563f, +0.640625f,0.601563f, +0.648438f,0.601563f, +0.65625f,0.601563f, +0.664063f,0.601563f, +0.671875f,0.601563f, +0.679688f,0.601563f, +0.6875f,0.601563f, +0.695313f,0.601563f, +0.703125f,0.601563f, +0.710938f,0.601563f, +0.71875f,0.601563f, +0.726563f,0.601563f, +0.734375f,0.601563f, +0.742188f,0.601563f, +0.75f,0.601563f, +0.757813f,0.601563f, +0.765625f,0.601563f, +0.773438f,0.601563f, +0.78125f,0.601563f, +0.789063f,0.601563f, +0.796875f,0.601563f, +0.804688f,0.601563f, +0.8125f,0.601563f, +0.820313f,0.601563f, +0.828125f,0.601563f, +0.835938f,0.601563f, +0.84375f,0.601563f, +0.851563f,0.601563f, +0.859375f,0.601563f, +0.867188f,0.601563f, +0.875f,0.601563f, +0.882813f,0.601563f, +0.890625f,0.601563f, +0.898438f,0.601563f, +0.90625f,0.601563f, +0.914063f,0.601563f, +0.921875f,0.601563f, +0.929688f,0.601563f, +0.9375f,0.601563f, +0.945313f,0.601563f, +0.953125f,0.601563f, +0.960938f,0.601563f, +0.96875f,0.601563f, +0.976563f,0.601563f, +0.984375f,0.601563f, +0.992188f,0.601563f, +1.0f,0.601563f, +0.507813f,0.609375f, +0.515625f,0.609375f, +0.523438f,0.609375f, +0.53125f,0.609375f, +0.539063f,0.609375f, +0.546875f,0.609375f, +0.554688f,0.609375f, +0.5625f,0.609375f, +0.570313f,0.609375f, +0.578125f,0.609375f, +0.585938f,0.609375f, +0.59375f,0.609375f, +0.601563f,0.609375f, +0.609375f,0.609375f, +0.617188f,0.609375f, +0.625f,0.609375f, +0.632813f,0.609375f, +0.640625f,0.609375f, +0.648438f,0.609375f, +0.65625f,0.609375f, +0.664063f,0.609375f, +0.671875f,0.609375f, +0.679688f,0.609375f, +0.6875f,0.609375f, +0.695313f,0.609375f, +0.703125f,0.609375f, +0.710938f,0.609375f, +0.71875f,0.609375f, +0.726563f,0.609375f, +0.734375f,0.609375f, +0.742188f,0.609375f, +0.75f,0.609375f, +0.757813f,0.609375f, +0.765625f,0.609375f, +0.773438f,0.609375f, +0.78125f,0.609375f, +0.789063f,0.609375f, +0.796875f,0.609375f, +0.804688f,0.609375f, +0.8125f,0.609375f, +0.820313f,0.609375f, +0.828125f,0.609375f, +0.835938f,0.609375f, +0.84375f,0.609375f, +0.851563f,0.609375f, +0.859375f,0.609375f, +0.867188f,0.609375f, +0.875f,0.609375f, +0.882813f,0.609375f, +0.890625f,0.609375f, +0.898438f,0.609375f, +0.90625f,0.609375f, +0.914063f,0.609375f, +0.921875f,0.609375f, +0.929688f,0.609375f, +0.9375f,0.609375f, +0.945313f,0.609375f, +0.953125f,0.609375f, +0.960938f,0.609375f, +0.96875f,0.609375f, +0.976563f,0.609375f, +0.984375f,0.609375f, +0.992188f,0.609375f, +1.0f,0.609375f, +0.507813f,0.617188f, +0.515625f,0.617188f, +0.523438f,0.617188f, +0.53125f,0.617188f, +0.539063f,0.617188f, +0.546875f,0.617188f, +0.554688f,0.617188f, +0.5625f,0.617188f, +0.570313f,0.617188f, +0.578125f,0.617188f, +0.585938f,0.617188f, +0.59375f,0.617188f, +0.601563f,0.617188f, +0.609375f,0.617188f, +0.617188f,0.617188f, +0.625f,0.617188f, +0.632813f,0.617188f, +0.640625f,0.617188f, +0.648438f,0.617188f, +0.65625f,0.617188f, +0.664063f,0.617188f, +0.671875f,0.617188f, +0.679688f,0.617188f, +0.6875f,0.617188f, +0.695313f,0.617188f, +0.703125f,0.617188f, +0.710938f,0.617188f, +0.71875f,0.617188f, +0.726563f,0.617188f, +0.734375f,0.617188f, +0.742188f,0.617188f, +0.75f,0.617188f, +0.757813f,0.617188f, +0.765625f,0.617188f, +0.773438f,0.617188f, +0.78125f,0.617188f, +0.789063f,0.617188f, +0.796875f,0.617188f, +0.804688f,0.617188f, +0.8125f,0.617188f, +0.820313f,0.617188f, +0.828125f,0.617188f, +0.835938f,0.617188f, +0.84375f,0.617188f, +0.851563f,0.617188f, +0.859375f,0.617188f, +0.867188f,0.617188f, +0.875f,0.617188f, +0.882813f,0.617188f, +0.890625f,0.617188f, +0.898438f,0.617188f, +0.90625f,0.617188f, +0.914063f,0.617188f, +0.921875f,0.617188f, +0.929688f,0.617188f, +0.9375f,0.617188f, +0.945313f,0.617188f, +0.953125f,0.617188f, +0.960938f,0.617188f, +0.96875f,0.617188f, +0.976563f,0.617188f, +0.984375f,0.617188f, +0.992188f,0.617188f, +1.0f,0.617188f, +0.507813f,0.625f, +0.515625f,0.625f, +0.523438f,0.625f, +0.53125f,0.625f, +0.539063f,0.625f, +0.546875f,0.625f, +0.554688f,0.625f, +0.5625f,0.625f, +0.570313f,0.625f, +0.578125f,0.625f, +0.585938f,0.625f, +0.59375f,0.625f, +0.601563f,0.625f, +0.609375f,0.625f, +0.617188f,0.625f, +0.625f,0.625f, +0.632813f,0.625f, +0.640625f,0.625f, +0.648438f,0.625f, +0.65625f,0.625f, +0.664063f,0.625f, +0.671875f,0.625f, +0.679688f,0.625f, +0.6875f,0.625f, +0.695313f,0.625f, +0.703125f,0.625f, +0.710938f,0.625f, +0.71875f,0.625f, +0.726563f,0.625f, +0.734375f,0.625f, +0.742188f,0.625f, +0.75f,0.625f, +0.757813f,0.625f, +0.765625f,0.625f, +0.773438f,0.625f, +0.78125f,0.625f, +0.789063f,0.625f, +0.796875f,0.625f, +0.804688f,0.625f, +0.8125f,0.625f, +0.820313f,0.625f, +0.828125f,0.625f, +0.835938f,0.625f, +0.84375f,0.625f, +0.851563f,0.625f, +0.859375f,0.625f, +0.867188f,0.625f, +0.875f,0.625f, +0.882813f,0.625f, +0.890625f,0.625f, +0.898438f,0.625f, +0.90625f,0.625f, +0.914063f,0.625f, +0.921875f,0.625f, +0.929688f,0.625f, +0.9375f,0.625f, +0.945313f,0.625f, +0.953125f,0.625f, +0.960938f,0.625f, +0.96875f,0.625f, +0.976563f,0.625f, +0.984375f,0.625f, +0.992188f,0.625f, +1.0f,0.625f, +0.507813f,0.632813f, +0.515625f,0.632813f, +0.523438f,0.632813f, +0.53125f,0.632813f, +0.539063f,0.632813f, +0.546875f,0.632813f, +0.554688f,0.632813f, +0.5625f,0.632813f, +0.570313f,0.632813f, +0.578125f,0.632813f, +0.585938f,0.632813f, +0.59375f,0.632813f, +0.601563f,0.632813f, +0.609375f,0.632813f, +0.617188f,0.632813f, +0.625f,0.632813f, +0.632813f,0.632813f, +0.640625f,0.632813f, +0.648438f,0.632813f, +0.65625f,0.632813f, +0.664063f,0.632813f, +0.671875f,0.632813f, +0.679688f,0.632813f, +0.6875f,0.632813f, +0.695313f,0.632813f, +0.703125f,0.632813f, +0.710938f,0.632813f, +0.71875f,0.632813f, +0.726563f,0.632813f, +0.734375f,0.632813f, +0.742188f,0.632813f, +0.75f,0.632813f, +0.757813f,0.632813f, +0.765625f,0.632813f, +0.773438f,0.632813f, +0.78125f,0.632813f, +0.789063f,0.632813f, +0.796875f,0.632813f, +0.804688f,0.632813f, +0.8125f,0.632813f, +0.820313f,0.632813f, +0.828125f,0.632813f, +0.835938f,0.632813f, +0.84375f,0.632813f, +0.851563f,0.632813f, +0.859375f,0.632813f, +0.867188f,0.632813f, +0.875f,0.632813f, +0.882813f,0.632813f, +0.890625f,0.632813f, +0.898438f,0.632813f, +0.90625f,0.632813f, +0.914063f,0.632813f, +0.921875f,0.632813f, +0.929688f,0.632813f, +0.9375f,0.632813f, +0.945313f,0.632813f, +0.953125f,0.632813f, +0.960938f,0.632813f, +0.96875f,0.632813f, +0.976563f,0.632813f, +0.984375f,0.632813f, +0.992188f,0.632813f, +1.0f,0.632813f, +0.507813f,0.640625f, +0.515625f,0.640625f, +0.523438f,0.640625f, +0.53125f,0.640625f, +0.539063f,0.640625f, +0.546875f,0.640625f, +0.554688f,0.640625f, +0.5625f,0.640625f, +0.570313f,0.640625f, +0.578125f,0.640625f, +0.585938f,0.640625f, +0.59375f,0.640625f, +0.601563f,0.640625f, +0.609375f,0.640625f, +0.617188f,0.640625f, +0.625f,0.640625f, +0.632813f,0.640625f, +0.640625f,0.640625f, +0.648438f,0.640625f, +0.65625f,0.640625f, +0.664063f,0.640625f, +0.671875f,0.640625f, +0.679688f,0.640625f, +0.6875f,0.640625f, +0.695313f,0.640625f, +0.703125f,0.640625f, +0.710938f,0.640625f, +0.71875f,0.640625f, +0.726563f,0.640625f, +0.734375f,0.640625f, +0.742188f,0.640625f, +0.75f,0.640625f, +0.757813f,0.640625f, +0.765625f,0.640625f, +0.773438f,0.640625f, +0.78125f,0.640625f, +0.789063f,0.640625f, +0.796875f,0.640625f, +0.804688f,0.640625f, +0.8125f,0.640625f, +0.820313f,0.640625f, +0.828125f,0.640625f, +0.835938f,0.640625f, +0.84375f,0.640625f, +0.851563f,0.640625f, +0.859375f,0.640625f, +0.867188f,0.640625f, +0.875f,0.640625f, +0.882813f,0.640625f, +0.890625f,0.640625f, +0.898438f,0.640625f, +0.90625f,0.640625f, +0.914063f,0.640625f, +0.921875f,0.640625f, +0.929688f,0.640625f, +0.9375f,0.640625f, +0.945313f,0.640625f, +0.953125f,0.640625f, +0.960938f,0.640625f, +0.96875f,0.640625f, +0.976563f,0.640625f, +0.984375f,0.640625f, +0.992188f,0.640625f, +1.0f,0.640625f, +0.507813f,0.648438f, +0.515625f,0.648438f, +0.523438f,0.648438f, +0.53125f,0.648438f, +0.539063f,0.648438f, +0.546875f,0.648438f, +0.554688f,0.648438f, +0.5625f,0.648438f, +0.570313f,0.648438f, +0.578125f,0.648438f, +0.585938f,0.648438f, +0.59375f,0.648438f, +0.601563f,0.648438f, +0.609375f,0.648438f, +0.617188f,0.648438f, +0.625f,0.648438f, +0.632813f,0.648438f, +0.640625f,0.648438f, +0.648438f,0.648438f, +0.65625f,0.648438f, +0.664063f,0.648438f, +0.671875f,0.648438f, +0.679688f,0.648438f, +0.6875f,0.648438f, +0.695313f,0.648438f, +0.703125f,0.648438f, +0.710938f,0.648438f, +0.71875f,0.648438f, +0.726563f,0.648438f, +0.734375f,0.648438f, +0.742188f,0.648438f, +0.75f,0.648438f, +0.757813f,0.648438f, +0.765625f,0.648438f, +0.773438f,0.648438f, +0.78125f,0.648438f, +0.789063f,0.648438f, +0.796875f,0.648438f, +0.804688f,0.648438f, +0.8125f,0.648438f, +0.820313f,0.648438f, +0.828125f,0.648438f, +0.835938f,0.648438f, +0.84375f,0.648438f, +0.851563f,0.648438f, +0.859375f,0.648438f, +0.867188f,0.648438f, +0.875f,0.648438f, +0.882813f,0.648438f, +0.890625f,0.648438f, +0.898438f,0.648438f, +0.90625f,0.648438f, +0.914063f,0.648438f, +0.921875f,0.648438f, +0.929688f,0.648438f, +0.9375f,0.648438f, +0.945313f,0.648438f, +0.953125f,0.648438f, +0.960938f,0.648438f, +0.96875f,0.648438f, +0.976563f,0.648438f, +0.984375f,0.648438f, +0.992188f,0.648438f, +1.0f,0.648438f, +0.507813f,0.65625f, +0.515625f,0.65625f, +0.523438f,0.65625f, +0.53125f,0.65625f, +0.539063f,0.65625f, +0.546875f,0.65625f, +0.554688f,0.65625f, +0.5625f,0.65625f, +0.570313f,0.65625f, +0.578125f,0.65625f, +0.585938f,0.65625f, +0.59375f,0.65625f, +0.601563f,0.65625f, +0.609375f,0.65625f, +0.617188f,0.65625f, +0.625f,0.65625f, +0.632813f,0.65625f, +0.640625f,0.65625f, +0.648438f,0.65625f, +0.65625f,0.65625f, +0.664063f,0.65625f, +0.671875f,0.65625f, +0.679688f,0.65625f, +0.6875f,0.65625f, +0.695313f,0.65625f, +0.703125f,0.65625f, +0.710938f,0.65625f, +0.71875f,0.65625f, +0.726563f,0.65625f, +0.734375f,0.65625f, +0.742188f,0.65625f, +0.75f,0.65625f, +0.757813f,0.65625f, +0.765625f,0.65625f, +0.773438f,0.65625f, +0.78125f,0.65625f, +0.789063f,0.65625f, +0.796875f,0.65625f, +0.804688f,0.65625f, +0.8125f,0.65625f, +0.820313f,0.65625f, +0.828125f,0.65625f, +0.835938f,0.65625f, +0.84375f,0.65625f, +0.851563f,0.65625f, +0.859375f,0.65625f, +0.867188f,0.65625f, +0.875f,0.65625f, +0.882813f,0.65625f, +0.890625f,0.65625f, +0.898438f,0.65625f, +0.90625f,0.65625f, +0.914063f,0.65625f, +0.921875f,0.65625f, +0.929688f,0.65625f, +0.9375f,0.65625f, +0.945313f,0.65625f, +0.953125f,0.65625f, +0.960938f,0.65625f, +0.96875f,0.65625f, +0.976563f,0.65625f, +0.984375f,0.65625f, +0.992188f,0.65625f, +1.0f,0.65625f, +0.507813f,0.664063f, +0.515625f,0.664063f, +0.523438f,0.664063f, +0.53125f,0.664063f, +0.539063f,0.664063f, +0.546875f,0.664063f, +0.554688f,0.664063f, +0.5625f,0.664063f, +0.570313f,0.664063f, +0.578125f,0.664063f, +0.585938f,0.664063f, +0.59375f,0.664063f, +0.601563f,0.664063f, +0.609375f,0.664063f, +0.617188f,0.664063f, +0.625f,0.664063f, +0.632813f,0.664063f, +0.640625f,0.664063f, +0.648438f,0.664063f, +0.65625f,0.664063f, +0.664063f,0.664063f, +0.671875f,0.664063f, +0.679688f,0.664063f, +0.6875f,0.664063f, +0.695313f,0.664063f, +0.703125f,0.664063f, +0.710938f,0.664063f, +0.71875f,0.664063f, +0.726563f,0.664063f, +0.734375f,0.664063f, +0.742188f,0.664063f, +0.75f,0.664063f, +0.757813f,0.664063f, +0.765625f,0.664063f, +0.773438f,0.664063f, +0.78125f,0.664063f, +0.789063f,0.664063f, +0.796875f,0.664063f, +0.804688f,0.664063f, +0.8125f,0.664063f, +0.820313f,0.664063f, +0.828125f,0.664063f, +0.835938f,0.664063f, +0.84375f,0.664063f, +0.851563f,0.664063f, +0.859375f,0.664063f, +0.867188f,0.664063f, +0.875f,0.664063f, +0.882813f,0.664063f, +0.890625f,0.664063f, +0.898438f,0.664063f, +0.90625f,0.664063f, +0.914063f,0.664063f, +0.921875f,0.664063f, +0.929688f,0.664063f, +0.9375f,0.664063f, +0.945313f,0.664063f, +0.953125f,0.664063f, +0.960938f,0.664063f, +0.96875f,0.664063f, +0.976563f,0.664063f, +0.984375f,0.664063f, +0.992188f,0.664063f, +1.0f,0.664063f, +0.507813f,0.671875f, +0.515625f,0.671875f, +0.523438f,0.671875f, +0.53125f,0.671875f, +0.539063f,0.671875f, +0.546875f,0.671875f, +0.554688f,0.671875f, +0.5625f,0.671875f, +0.570313f,0.671875f, +0.578125f,0.671875f, +0.585938f,0.671875f, +0.59375f,0.671875f, +0.601563f,0.671875f, +0.609375f,0.671875f, +0.617188f,0.671875f, +0.625f,0.671875f, +0.632813f,0.671875f, +0.640625f,0.671875f, +0.648438f,0.671875f, +0.65625f,0.671875f, +0.664063f,0.671875f, +0.671875f,0.671875f, +0.679688f,0.671875f, +0.6875f,0.671875f, +0.695313f,0.671875f, +0.703125f,0.671875f, +0.710938f,0.671875f, +0.71875f,0.671875f, +0.726563f,0.671875f, +0.734375f,0.671875f, +0.742188f,0.671875f, +0.75f,0.671875f, +0.757813f,0.671875f, +0.765625f,0.671875f, +0.773438f,0.671875f, +0.78125f,0.671875f, +0.789063f,0.671875f, +0.796875f,0.671875f, +0.804688f,0.671875f, +0.8125f,0.671875f, +0.820313f,0.671875f, +0.828125f,0.671875f, +0.835938f,0.671875f, +0.84375f,0.671875f, +0.851563f,0.671875f, +0.859375f,0.671875f, +0.867188f,0.671875f, +0.875f,0.671875f, +0.882813f,0.671875f, +0.890625f,0.671875f, +0.898438f,0.671875f, +0.90625f,0.671875f, +0.914063f,0.671875f, +0.921875f,0.671875f, +0.929688f,0.671875f, +0.9375f,0.671875f, +0.945313f,0.671875f, +0.953125f,0.671875f, +0.960938f,0.671875f, +0.96875f,0.671875f, +0.976563f,0.671875f, +0.984375f,0.671875f, +0.992188f,0.671875f, +1.0f,0.671875f, +0.507813f,0.679688f, +0.515625f,0.679688f, +0.523438f,0.679688f, +0.53125f,0.679688f, +0.539063f,0.679688f, +0.546875f,0.679688f, +0.554688f,0.679688f, +0.5625f,0.679688f, +0.570313f,0.679688f, +0.578125f,0.679688f, +0.585938f,0.679688f, +0.59375f,0.679688f, +0.601563f,0.679688f, +0.609375f,0.679688f, +0.617188f,0.679688f, +0.625f,0.679688f, +0.632813f,0.679688f, +0.640625f,0.679688f, +0.648438f,0.679688f, +0.65625f,0.679688f, +0.664063f,0.679688f, +0.671875f,0.679688f, +0.679688f,0.679688f, +0.6875f,0.679688f, +0.695313f,0.679688f, +0.703125f,0.679688f, +0.710938f,0.679688f, +0.71875f,0.679688f, +0.726563f,0.679688f, +0.734375f,0.679688f, +0.742188f,0.679688f, +0.75f,0.679688f, +0.757813f,0.679688f, +0.765625f,0.679688f, +0.773438f,0.679688f, +0.78125f,0.679688f, +0.789063f,0.679688f, +0.796875f,0.679688f, +0.804688f,0.679688f, +0.8125f,0.679688f, +0.820313f,0.679688f, +0.828125f,0.679688f, +0.835938f,0.679688f, +0.84375f,0.679688f, +0.851563f,0.679688f, +0.859375f,0.679688f, +0.867188f,0.679688f, +0.875f,0.679688f, +0.882813f,0.679688f, +0.890625f,0.679688f, +0.898438f,0.679688f, +0.90625f,0.679688f, +0.914063f,0.679688f, +0.921875f,0.679688f, +0.929688f,0.679688f, +0.9375f,0.679688f, +0.945313f,0.679688f, +0.953125f,0.679688f, +0.960938f,0.679688f, +0.96875f,0.679688f, +0.976563f,0.679688f, +0.984375f,0.679688f, +0.992188f,0.679688f, +1.0f,0.679688f, +0.507813f,0.6875f, +0.515625f,0.6875f, +0.523438f,0.6875f, +0.53125f,0.6875f, +0.539063f,0.6875f, +0.546875f,0.6875f, +0.554688f,0.6875f, +0.5625f,0.6875f, +0.570313f,0.6875f, +0.578125f,0.6875f, +0.585938f,0.6875f, +0.59375f,0.6875f, +0.601563f,0.6875f, +0.609375f,0.6875f, +0.617188f,0.6875f, +0.625f,0.6875f, +0.632813f,0.6875f, +0.640625f,0.6875f, +0.648438f,0.6875f, +0.65625f,0.6875f, +0.664063f,0.6875f, +0.671875f,0.6875f, +0.679688f,0.6875f, +0.6875f,0.6875f, +0.695313f,0.6875f, +0.703125f,0.6875f, +0.710938f,0.6875f, +0.71875f,0.6875f, +0.726563f,0.6875f, +0.734375f,0.6875f, +0.742188f,0.6875f, +0.75f,0.6875f, +0.757813f,0.6875f, +0.765625f,0.6875f, +0.773438f,0.6875f, +0.78125f,0.6875f, +0.789063f,0.6875f, +0.796875f,0.6875f, +0.804688f,0.6875f, +0.8125f,0.6875f, +0.820313f,0.6875f, +0.828125f,0.6875f, +0.835938f,0.6875f, +0.84375f,0.6875f, +0.851563f,0.6875f, +0.859375f,0.6875f, +0.867188f,0.6875f, +0.875f,0.6875f, +0.882813f,0.6875f, +0.890625f,0.6875f, +0.898438f,0.6875f, +0.90625f,0.6875f, +0.914063f,0.6875f, +0.921875f,0.6875f, +0.929688f,0.6875f, +0.9375f,0.6875f, +0.945313f,0.6875f, +0.953125f,0.6875f, +0.960938f,0.6875f, +0.96875f,0.6875f, +0.976563f,0.6875f, +0.984375f,0.6875f, +0.992188f,0.6875f, +1.0f,0.6875f, +0.507813f,0.695313f, +0.515625f,0.695313f, +0.523438f,0.695313f, +0.53125f,0.695313f, +0.539063f,0.695313f, +0.546875f,0.695313f, +0.554688f,0.695313f, +0.5625f,0.695313f, +0.570313f,0.695313f, +0.578125f,0.695313f, +0.585938f,0.695313f, +0.59375f,0.695313f, +0.601563f,0.695313f, +0.609375f,0.695313f, +0.617188f,0.695313f, +0.625f,0.695313f, +0.632813f,0.695313f, +0.640625f,0.695313f, +0.648438f,0.695313f, +0.65625f,0.695313f, +0.664063f,0.695313f, +0.671875f,0.695313f, +0.679688f,0.695313f, +0.6875f,0.695313f, +0.695313f,0.695313f, +0.703125f,0.695313f, +0.710938f,0.695313f, +0.71875f,0.695313f, +0.726563f,0.695313f, +0.734375f,0.695313f, +0.742188f,0.695313f, +0.75f,0.695313f, +0.757813f,0.695313f, +0.765625f,0.695313f, +0.773438f,0.695313f, +0.78125f,0.695313f, +0.789063f,0.695313f, +0.796875f,0.695313f, +0.804688f,0.695313f, +0.8125f,0.695313f, +0.820313f,0.695313f, +0.828125f,0.695313f, +0.835938f,0.695313f, +0.84375f,0.695313f, +0.851563f,0.695313f, +0.859375f,0.695313f, +0.867188f,0.695313f, +0.875f,0.695313f, +0.882813f,0.695313f, +0.890625f,0.695313f, +0.898438f,0.695313f, +0.90625f,0.695313f, +0.914063f,0.695313f, +0.921875f,0.695313f, +0.929688f,0.695313f, +0.9375f,0.695313f, +0.945313f,0.695313f, +0.953125f,0.695313f, +0.960938f,0.695313f, +0.96875f,0.695313f, +0.976563f,0.695313f, +0.984375f,0.695313f, +0.992188f,0.695313f, +1.0f,0.695313f, +0.507813f,0.703125f, +0.515625f,0.703125f, +0.523438f,0.703125f, +0.53125f,0.703125f, +0.539063f,0.703125f, +0.546875f,0.703125f, +0.554688f,0.703125f, +0.5625f,0.703125f, +0.570313f,0.703125f, +0.578125f,0.703125f, +0.585938f,0.703125f, +0.59375f,0.703125f, +0.601563f,0.703125f, +0.609375f,0.703125f, +0.617188f,0.703125f, +0.625f,0.703125f, +0.632813f,0.703125f, +0.640625f,0.703125f, +0.648438f,0.703125f, +0.65625f,0.703125f, +0.664063f,0.703125f, +0.671875f,0.703125f, +0.679688f,0.703125f, +0.6875f,0.703125f, +0.695313f,0.703125f, +0.703125f,0.703125f, +0.710938f,0.703125f, +0.71875f,0.703125f, +0.726563f,0.703125f, +0.734375f,0.703125f, +0.742188f,0.703125f, +0.75f,0.703125f, +0.757813f,0.703125f, +0.765625f,0.703125f, +0.773438f,0.703125f, +0.78125f,0.703125f, +0.789063f,0.703125f, +0.796875f,0.703125f, +0.804688f,0.703125f, +0.8125f,0.703125f, +0.820313f,0.703125f, +0.828125f,0.703125f, +0.835938f,0.703125f, +0.84375f,0.703125f, +0.851563f,0.703125f, +0.859375f,0.703125f, +0.867188f,0.703125f, +0.875f,0.703125f, +0.882813f,0.703125f, +0.890625f,0.703125f, +0.898438f,0.703125f, +0.90625f,0.703125f, +0.914063f,0.703125f, +0.921875f,0.703125f, +0.929688f,0.703125f, +0.9375f,0.703125f, +0.945313f,0.703125f, +0.953125f,0.703125f, +0.960938f,0.703125f, +0.96875f,0.703125f, +0.976563f,0.703125f, +0.984375f,0.703125f, +0.992188f,0.703125f, +1.0f,0.703125f, +0.507813f,0.710938f, +0.515625f,0.710938f, +0.523438f,0.710938f, +0.53125f,0.710938f, +0.539063f,0.710938f, +0.546875f,0.710938f, +0.554688f,0.710938f, +0.5625f,0.710938f, +0.570313f,0.710938f, +0.578125f,0.710938f, +0.585938f,0.710938f, +0.59375f,0.710938f, +0.601563f,0.710938f, +0.609375f,0.710938f, +0.617188f,0.710938f, +0.625f,0.710938f, +0.632813f,0.710938f, +0.640625f,0.710938f, +0.648438f,0.710938f, +0.65625f,0.710938f, +0.664063f,0.710938f, +0.671875f,0.710938f, +0.679688f,0.710938f, +0.6875f,0.710938f, +0.695313f,0.710938f, +0.703125f,0.710938f, +0.710938f,0.710938f, +0.71875f,0.710938f, +0.726563f,0.710938f, +0.734375f,0.710938f, +0.742188f,0.710938f, +0.75f,0.710938f, +0.757813f,0.710938f, +0.765625f,0.710938f, +0.773438f,0.710938f, +0.78125f,0.710938f, +0.789063f,0.710938f, +0.796875f,0.710938f, +0.804688f,0.710938f, +0.8125f,0.710938f, +0.820313f,0.710938f, +0.828125f,0.710938f, +0.835938f,0.710938f, +0.84375f,0.710938f, +0.851563f,0.710938f, +0.859375f,0.710938f, +0.867188f,0.710938f, +0.875f,0.710938f, +0.882813f,0.710938f, +0.890625f,0.710938f, +0.898438f,0.710938f, +0.90625f,0.710938f, +0.914063f,0.710938f, +0.921875f,0.710938f, +0.929688f,0.710938f, +0.9375f,0.710938f, +0.945313f,0.710938f, +0.953125f,0.710938f, +0.960938f,0.710938f, +0.96875f,0.710938f, +0.976563f,0.710938f, +0.984375f,0.710938f, +0.992188f,0.710938f, +1.0f,0.710938f, +0.507813f,0.71875f, +0.515625f,0.71875f, +0.523438f,0.71875f, +0.53125f,0.71875f, +0.539063f,0.71875f, +0.546875f,0.71875f, +0.554688f,0.71875f, +0.5625f,0.71875f, +0.570313f,0.71875f, +0.578125f,0.71875f, +0.585938f,0.71875f, +0.59375f,0.71875f, +0.601563f,0.71875f, +0.609375f,0.71875f, +0.617188f,0.71875f, +0.625f,0.71875f, +0.632813f,0.71875f, +0.640625f,0.71875f, +0.648438f,0.71875f, +0.65625f,0.71875f, +0.664063f,0.71875f, +0.671875f,0.71875f, +0.679688f,0.71875f, +0.6875f,0.71875f, +0.695313f,0.71875f, +0.703125f,0.71875f, +0.710938f,0.71875f, +0.71875f,0.71875f, +0.726563f,0.71875f, +0.734375f,0.71875f, +0.742188f,0.71875f, +0.75f,0.71875f, +0.757813f,0.71875f, +0.765625f,0.71875f, +0.773438f,0.71875f, +0.78125f,0.71875f, +0.789063f,0.71875f, +0.796875f,0.71875f, +0.804688f,0.71875f, +0.8125f,0.71875f, +0.820313f,0.71875f, +0.828125f,0.71875f, +0.835938f,0.71875f, +0.84375f,0.71875f, +0.851563f,0.71875f, +0.859375f,0.71875f, +0.867188f,0.71875f, +0.875f,0.71875f, +0.882813f,0.71875f, +0.890625f,0.71875f, +0.898438f,0.71875f, +0.90625f,0.71875f, +0.914063f,0.71875f, +0.921875f,0.71875f, +0.929688f,0.71875f, +0.9375f,0.71875f, +0.945313f,0.71875f, +0.953125f,0.71875f, +0.960938f,0.71875f, +0.96875f,0.71875f, +0.976563f,0.71875f, +0.984375f,0.71875f, +0.992188f,0.71875f, +1.0f,0.71875f, +0.507813f,0.726563f, +0.515625f,0.726563f, +0.523438f,0.726563f, +0.53125f,0.726563f, +0.539063f,0.726563f, +0.546875f,0.726563f, +0.554688f,0.726563f, +0.5625f,0.726563f, +0.570313f,0.726563f, +0.578125f,0.726563f, +0.585938f,0.726563f, +0.59375f,0.726563f, +0.601563f,0.726563f, +0.609375f,0.726563f, +0.617188f,0.726563f, +0.625f,0.726563f, +0.632813f,0.726563f, +0.640625f,0.726563f, +0.648438f,0.726563f, +0.65625f,0.726563f, +0.664063f,0.726563f, +0.671875f,0.726563f, +0.679688f,0.726563f, +0.6875f,0.726563f, +0.695313f,0.726563f, +0.703125f,0.726563f, +0.710938f,0.726563f, +0.71875f,0.726563f, +0.726563f,0.726563f, +0.734375f,0.726563f, +0.742188f,0.726563f, +0.75f,0.726563f, +0.757813f,0.726563f, +0.765625f,0.726563f, +0.773438f,0.726563f, +0.78125f,0.726563f, +0.789063f,0.726563f, +0.796875f,0.726563f, +0.804688f,0.726563f, +0.8125f,0.726563f, +0.820313f,0.726563f, +0.828125f,0.726563f, +0.835938f,0.726563f, +0.84375f,0.726563f, +0.851563f,0.726563f, +0.859375f,0.726563f, +0.867188f,0.726563f, +0.875f,0.726563f, +0.882813f,0.726563f, +0.890625f,0.726563f, +0.898438f,0.726563f, +0.90625f,0.726563f, +0.914063f,0.726563f, +0.921875f,0.726563f, +0.929688f,0.726563f, +0.9375f,0.726563f, +0.945313f,0.726563f, +0.953125f,0.726563f, +0.960938f,0.726563f, +0.96875f,0.726563f, +0.976563f,0.726563f, +0.984375f,0.726563f, +0.992188f,0.726563f, +1.0f,0.726563f, +0.507813f,0.734375f, +0.515625f,0.734375f, +0.523438f,0.734375f, +0.53125f,0.734375f, +0.539063f,0.734375f, +0.546875f,0.734375f, +0.554688f,0.734375f, +0.5625f,0.734375f, +0.570313f,0.734375f, +0.578125f,0.734375f, +0.585938f,0.734375f, +0.59375f,0.734375f, +0.601563f,0.734375f, +0.609375f,0.734375f, +0.617188f,0.734375f, +0.625f,0.734375f, +0.632813f,0.734375f, +0.640625f,0.734375f, +0.648438f,0.734375f, +0.65625f,0.734375f, +0.664063f,0.734375f, +0.671875f,0.734375f, +0.679688f,0.734375f, +0.6875f,0.734375f, +0.695313f,0.734375f, +0.703125f,0.734375f, +0.710938f,0.734375f, +0.71875f,0.734375f, +0.726563f,0.734375f, +0.734375f,0.734375f, +0.742188f,0.734375f, +0.75f,0.734375f, +0.757813f,0.734375f, +0.765625f,0.734375f, +0.773438f,0.734375f, +0.78125f,0.734375f, +0.789063f,0.734375f, +0.796875f,0.734375f, +0.804688f,0.734375f, +0.8125f,0.734375f, +0.820313f,0.734375f, +0.828125f,0.734375f, +0.835938f,0.734375f, +0.84375f,0.734375f, +0.851563f,0.734375f, +0.859375f,0.734375f, +0.867188f,0.734375f, +0.875f,0.734375f, +0.882813f,0.734375f, +0.890625f,0.734375f, +0.898438f,0.734375f, +0.90625f,0.734375f, +0.914063f,0.734375f, +0.921875f,0.734375f, +0.929688f,0.734375f, +0.9375f,0.734375f, +0.945313f,0.734375f, +0.953125f,0.734375f, +0.960938f,0.734375f, +0.96875f,0.734375f, +0.976563f,0.734375f, +0.984375f,0.734375f, +0.992188f,0.734375f, +1.0f,0.734375f, +}; + +unsigned short Landscape03Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +}; + +#define Landscape04VtxCount 2112 +#define Landscape04IdxCount 12096 + +btScalar Landscape04Vtx[] = { +3.90625f,18.9654f,125.0f, +3.90625f,20.0876f,128.906f, +7.8125f,20.5764f,125.0f, +7.8125f,21.0764f,128.906f, +11.7188f,21.5489f,125.0f, +11.7188f,21.4076f,128.906f, +15.625f,22.4963f,125.0f, +15.625f,22.6299f,128.906f, +19.5313f,22.3264f,125.0f, +19.5313f,22.1174f,128.906f, +23.4375f,20.3987f,125.0f, +23.4375f,20.3977f,128.906f, +27.3438f,18.6622f,125.0f, +27.3438f,18.7343f,128.906f, +31.25f,17.4724f,125.0f, +31.25f,17.9144f,128.906f, +35.1563f,16.4832f,125.0f, +35.1563f,17.2941f,128.906f, +39.0625f,15.2653f,125.0f, +39.0625f,16.5386f,128.906f, +42.9688f,14.379f,125.0f, +42.9688f,15.6892f,128.906f, +46.875f,13.9872f,125.0f, +46.875f,14.6414f,128.906f, +50.7813f,14.7002f,125.0f, +50.7813f,14.3505f,128.906f, +54.6875f,15.1119f,125.0f, +54.6875f,14.1604f,128.906f, +58.5938f,14.6638f,125.0f, +58.5938f,14.517f,128.906f, +62.5f,14.668f,125.0f, +62.5f,15.1057f,128.906f, +66.4063f,14.9792f,125.0f, +66.4063f,16.0684f,128.906f, +70.3125f,15.4776f,125.0f, +70.3125f,16.6251f,128.906f, +74.2188f,15.0939f,125.0f, +74.2188f,15.9689f,128.906f, +78.125f,15.5318f,125.0f, +78.125f,16.0234f,128.906f, +82.0313f,16.0777f,125.0f, +82.0313f,16.205f,128.906f, +85.9375f,17.8753f,125.0f, +85.9375f,18.8167f,128.906f, +89.8438f,18.8786f,125.0f, +89.8438f,19.6433f,128.906f, +93.75f,19.8208f,125.0f, +93.75f,20.2916f,128.906f, +97.6563f,23.2578f,125.0f, +97.6563f,23.2308f,128.906f, +101.563f,25.3117f,125.0f, +101.563f,25.882f,128.906f, +105.469f,26.8718f,125.0f, +105.469f,27.5736f,128.906f, +109.375f,28.7414f,125.0f, +109.375f,28.9662f,128.906f, +113.281f,29.9339f,125.0f, +113.281f,30.5702f,128.906f, +117.188f,30.6849f,125.0f, +117.188f,31.8627f,128.906f, +121.094f,32.4202f,125.0f, +121.094f,32.5216f,128.906f, +125.0f,34.7495f,125.0f, +125.0f,34.1918f,128.906f, +128.906f,37.137f,125.0f, +128.906f,37.0161f,128.906f, +132.813f,38.4113f,125.0f, +132.813f,38.5084f,128.906f, +136.719f,38.1788f,125.0f, +136.719f,39.1631f,128.906f, +140.625f,38.7652f,125.0f, +140.625f,39.0529f,128.906f, +144.531f,37.9353f,125.0f, +144.531f,38.9229f,128.906f, +148.438f,38.5681f,125.0f, +148.438f,38.4312f,128.906f, +152.344f,38.6243f,125.0f, +152.344f,39.1086f,128.906f, +156.25f,39.6341f,125.0f, +156.25f,39.7022f,128.906f, +160.156f,39.762f,125.0f, +160.156f,39.3007f,128.906f, +164.063f,38.5385f,125.0f, +164.063f,38.2318f,128.906f, +167.969f,36.3551f,125.0f, +167.969f,36.7493f,128.906f, +171.875f,36.1936f,125.0f, +171.875f,35.9781f,128.906f, +175.781f,35.5636f,125.0f, +175.781f,35.7712f,128.906f, +179.688f,34.6544f,125.0f, +179.688f,35.6247f,128.906f, +183.594f,34.1597f,125.0f, +183.594f,35.4808f,128.906f, +187.5f,33.5567f,125.0f, +187.5f,35.6102f,128.906f, +191.406f,33.0138f,125.0f, +191.406f,34.0305f,128.906f, +195.313f,31.2722f,125.0f, +195.313f,32.0227f,128.906f, +199.219f,29.2529f,125.0f, +199.219f,29.7666f,128.906f, +203.125f,26.9435f,125.0f, +203.125f,27.3968f,128.906f, +207.031f,25.0844f,125.0f, +207.031f,25.1642f,128.906f, +210.938f,23.6605f,125.0f, +210.938f,24.279f,128.906f, +214.844f,22.0745f,125.0f, +214.844f,22.4357f,128.906f, +218.75f,20.3206f,125.0f, +218.75f,21.7754f,128.906f, +222.656f,20.0402f,125.0f, +222.656f,19.6381f,128.906f, +226.563f,20.1162f,125.0f, +226.563f,19.78f,128.906f, +230.469f,20.2399f,125.0f, +230.469f,20.0349f,128.906f, +234.375f,19.6142f,125.0f, +234.375f,19.1534f,128.906f, +238.281f,18.6118f,125.0f, +238.281f,17.863f,128.906f, +242.188f,17.3711f,125.0f, +242.188f,17.658f,128.906f, +246.094f,17.675f,125.0f, +246.094f,16.951f,128.906f, +250.0f,17.3999f,125.0f, +250.0f,16.2961f,128.906f, +3.90625f,18.5327f,121.094f, +7.8125f,19.7267f,121.094f, +11.7188f,20.9891f,121.094f, +15.625f,22.237f,121.094f, +19.5313f,22.3238f,121.094f, +23.4375f,20.1525f,121.094f, +27.3438f,17.9536f,121.094f, +31.25f,17.647f,121.094f, +35.1563f,16.241f,121.094f, +39.0625f,14.6821f,121.094f, +42.9688f,14.4948f,121.094f, +46.875f,15.0351f,121.094f, +50.7813f,15.3893f,121.094f, +54.6875f,15.1531f,121.094f, +58.5938f,14.9284f,121.094f, +62.5f,15.1197f,121.094f, +66.4063f,15.1561f,121.094f, +70.3125f,15.1593f,121.094f, +74.2188f,15.0707f,121.094f, +78.125f,16.0455f,121.094f, +82.0313f,16.6186f,121.094f, +85.9375f,17.4149f,121.094f, +89.8438f,18.746f,121.094f, +93.75f,18.8475f,121.094f, +97.6563f,21.6899f,121.094f, +101.563f,24.567f,121.094f, +105.469f,25.7581f,121.094f, +109.375f,27.437f,121.094f, +113.281f,29.1226f,121.094f, +117.188f,30.137f,121.094f, +121.094f,32.1062f,121.094f, +125.0f,34.674f,121.094f, +128.906f,37.1044f,121.094f, +132.813f,37.8111f,121.094f, +136.719f,37.7901f,121.094f, +140.625f,37.5727f,121.094f, +144.531f,37.1561f,121.094f, +148.438f,38.1976f,121.094f, +152.344f,38.9227f,121.094f, +156.25f,40.3124f,121.094f, +160.156f,40.6867f,121.094f, +164.063f,39.5374f,121.094f, +167.969f,38.019f,121.094f, +171.875f,36.4573f,121.094f, +175.781f,35.2509f,121.094f, +179.688f,34.6709f,121.094f, +183.594f,33.5584f,121.094f, +187.5f,33.2411f,121.094f, +191.406f,31.7588f,121.094f, +195.313f,30.3558f,121.094f, +199.219f,28.879f,121.094f, +203.125f,26.7589f,121.094f, +207.031f,25.0535f,121.094f, +210.938f,23.0477f,121.094f, +214.844f,20.6897f,121.094f, +218.75f,19.3676f,121.094f, +222.656f,19.2985f,121.094f, +226.563f,20.2312f,121.094f, +230.469f,20.317f,121.094f, +234.375f,20.2468f,121.094f, +238.281f,20.3734f,121.094f, +242.188f,18.3676f,121.094f, +246.094f,16.642f,121.094f, +250.0f,17.5995f,121.094f, +3.90625f,18.919f,117.188f, +7.8125f,19.2124f,117.188f, +11.7188f,20.7659f,117.188f, +15.625f,20.5809f,117.188f, +19.5313f,20.3134f,117.188f, +23.4375f,18.6669f,117.188f, +27.3438f,17.5145f,117.188f, +31.25f,17.0813f,117.188f, +35.1563f,15.6789f,117.188f, +39.0625f,14.7581f,117.188f, +42.9688f,14.4424f,117.188f, +46.875f,14.7991f,117.188f, +50.7813f,15.0726f,117.188f, +54.6875f,14.8056f,117.188f, +58.5938f,15.756f,117.188f, +62.5f,16.3024f,117.188f, +66.4063f,16.0449f,117.188f, +70.3125f,15.9115f,117.188f, +74.2188f,16.1633f,117.188f, +78.125f,17.3323f,117.188f, +82.0313f,17.2659f,117.188f, +85.9375f,17.987f,117.188f, +89.8438f,18.3044f,117.188f, +93.75f,18.2665f,117.188f, +97.6563f,19.5364f,117.188f, +101.563f,21.7536f,117.188f, +105.469f,23.6545f,117.188f, +109.375f,25.5212f,117.188f, +113.281f,28.1179f,117.188f, +117.188f,29.5931f,117.188f, +121.094f,31.8126f,117.188f, +125.0f,34.0227f,117.188f, +128.906f,36.3895f,117.188f, +132.813f,37.0423f,117.188f, +136.719f,36.8278f,117.188f, +140.625f,36.2349f,117.188f, +144.531f,36.8825f,117.188f, +148.438f,39.6492f,117.188f, +152.344f,41.6626f,117.188f, +156.25f,42.5091f,117.188f, +160.156f,43.0711f,117.188f, +164.063f,41.7733f,117.188f, +167.969f,40.5985f,117.188f, +171.875f,38.1852f,117.188f, +175.781f,37.023f,117.188f, +179.688f,35.8533f,117.188f, +183.594f,34.5754f,117.188f, +187.5f,33.6585f,117.188f, +191.406f,32.534f,117.188f, +195.313f,31.0632f,117.188f, +199.219f,29.0243f,117.188f, +203.125f,27.0248f,117.188f, +207.031f,25.1597f,117.188f, +210.938f,22.6282f,117.188f, +214.844f,20.6205f,117.188f, +218.75f,19.2556f,117.188f, +222.656f,18.8259f,117.188f, +226.563f,19.2235f,117.188f, +230.469f,20.4441f,117.188f, +234.375f,20.5373f,117.188f, +238.281f,20.3082f,117.188f, +242.188f,19.4397f,117.188f, +246.094f,17.9806f,117.188f, +250.0f,17.3395f,117.188f, +3.90625f,18.3498f,113.281f, +7.8125f,18.7009f,113.281f, +11.7188f,19.3704f,113.281f, +15.625f,19.5203f,113.281f, +19.5313f,18.5704f,113.281f, +23.4375f,17.6697f,113.281f, +27.3438f,16.8001f,113.281f, +31.25f,16.54f,113.281f, +35.1563f,15.8558f,113.281f, +39.0625f,15.1296f,113.281f, +42.9688f,15.8599f,113.281f, +46.875f,16.437f,113.281f, +50.7813f,16.2977f,113.281f, +54.6875f,16.7076f,113.281f, +58.5938f,16.8187f,113.281f, +62.5f,17.1513f,113.281f, +66.4063f,16.5296f,113.281f, +70.3125f,15.8782f,113.281f, +74.2188f,16.614f,113.281f, +78.125f,17.0474f,113.281f, +82.0313f,17.3371f,113.281f, +85.9375f,17.9565f,113.281f, +89.8438f,18.3918f,113.281f, +93.75f,19.0258f,113.281f, +97.6563f,19.2791f,113.281f, +101.563f,20.1533f,113.281f, +105.469f,22.2922f,113.281f, +109.375f,24.6835f,113.281f, +113.281f,25.7755f,113.281f, +117.188f,28.8805f,113.281f, +121.094f,31.2119f,113.281f, +125.0f,33.4657f,113.281f, +128.906f,35.1055f,113.281f, +132.813f,36.4197f,113.281f, +136.719f,37.3017f,113.281f, +140.625f,37.1796f,113.281f, +144.531f,38.2037f,113.281f, +148.438f,41.4383f,113.281f, +152.344f,43.9714f,113.281f, +156.25f,45.0067f,113.281f, +160.156f,45.1491f,113.281f, +164.063f,43.8042f,113.281f, +167.969f,42.5165f,113.281f, +171.875f,40.361f,113.281f, +175.781f,38.3494f,113.281f, +179.688f,37.4529f,113.281f, +183.594f,35.5766f,113.281f, +187.5f,34.2438f,113.281f, +191.406f,32.0218f,113.281f, +195.313f,30.2021f,113.281f, +199.219f,28.8256f,113.281f, +203.125f,27.2081f,113.281f, +207.031f,24.992f,113.281f, +210.938f,22.5332f,113.281f, +214.844f,19.7765f,113.281f, +218.75f,18.5573f,113.281f, +222.656f,18.1469f,113.281f, +226.563f,17.9659f,113.281f, +230.469f,19.2f,113.281f, +234.375f,20.0741f,113.281f, +238.281f,20.1159f,113.281f, +242.188f,19.0382f,113.281f, +246.094f,18.3417f,113.281f, +250.0f,18.7603f,113.281f, +3.90625f,18.0017f,109.375f, +7.8125f,18.1552f,109.375f, +11.7188f,18.2026f,109.375f, +15.625f,18.2042f,109.375f, +19.5313f,17.7806f,109.375f, +23.4375f,17.5378f,109.375f, +27.3438f,16.8627f,109.375f, +31.25f,15.9329f,109.375f, +35.1563f,15.192f,109.375f, +39.0625f,16.0796f,109.375f, +42.9688f,16.1895f,109.375f, +46.875f,15.9774f,109.375f, +50.7813f,16.9529f,109.375f, +54.6875f,17.0901f,109.375f, +58.5938f,17.3722f,109.375f, +62.5f,16.5809f,109.375f, +66.4063f,16.8111f,109.375f, +70.3125f,16.9238f,109.375f, +74.2188f,16.8422f,109.375f, +78.125f,17.0401f,109.375f, +82.0313f,16.8637f,109.375f, +85.9375f,17.4071f,109.375f, +89.8438f,17.944f,109.375f, +93.75f,18.5255f,109.375f, +97.6563f,18.2829f,109.375f, +101.563f,19.0975f,109.375f, +105.469f,20.4292f,109.375f, +109.375f,22.163f,109.375f, +113.281f,25.6773f,109.375f, +117.188f,27.8617f,109.375f, +121.094f,30.6543f,109.375f, +125.0f,33.4226f,109.375f, +128.906f,34.4263f,109.375f, +132.813f,36.8747f,109.375f, +136.719f,37.4551f,109.375f, +140.625f,37.4975f,109.375f, +144.531f,40.0751f,109.375f, +148.438f,42.7524f,109.375f, +152.344f,44.7756f,109.375f, +156.25f,46.1787f,109.375f, +160.156f,46.3753f,109.375f, +164.063f,45.2089f,109.375f, +167.969f,43.7487f,109.375f, +171.875f,41.6365f,109.375f, +175.781f,39.7459f,109.375f, +179.688f,36.9804f,109.375f, +183.594f,35.6688f,109.375f, +187.5f,35.0212f,109.375f, +191.406f,32.4383f,109.375f, +195.313f,29.6046f,109.375f, +199.219f,28.1822f,109.375f, +203.125f,26.2444f,109.375f, +207.031f,24.1442f,109.375f, +210.938f,22.1072f,109.375f, +214.844f,20.0401f,109.375f, +218.75f,18.0663f,109.375f, +222.656f,16.866f,109.375f, +226.563f,16.9372f,109.375f, +230.469f,16.9853f,109.375f, +234.375f,17.6761f,109.375f, +238.281f,18.3669f,109.375f, +242.188f,18.4156f,109.375f, +246.094f,18.2171f,109.375f, +250.0f,18.5941f,109.375f, +3.90625f,17.9608f,105.469f, +7.8125f,18.4369f,105.469f, +11.7188f,18.4406f,105.469f, +15.625f,17.8685f,105.469f, +19.5313f,17.7519f,105.469f, +23.4375f,17.5734f,105.469f, +27.3438f,16.3397f,105.469f, +31.25f,15.8618f,105.469f, +35.1563f,16.1194f,105.469f, +39.0625f,16.889f,105.469f, +42.9688f,16.2804f,105.469f, +46.875f,15.8474f,105.469f, +50.7813f,16.2892f,105.469f, +54.6875f,16.2854f,105.469f, +58.5938f,16.7368f,105.469f, +62.5f,17.4055f,105.469f, +66.4063f,16.8808f,105.469f, +70.3125f,17.3183f,105.469f, +74.2188f,17.7166f,105.469f, +78.125f,17.0657f,105.469f, +82.0313f,16.7305f,105.469f, +85.9375f,16.3929f,105.469f, +89.8438f,16.6475f,105.469f, +93.75f,17.7645f,105.469f, +97.6563f,18.4212f,105.469f, +101.563f,18.4107f,105.469f, +105.469f,19.3751f,105.469f, +109.375f,21.843f,105.469f, +113.281f,25.0143f,105.469f, +117.188f,26.9168f,105.469f, +121.094f,29.8403f,105.469f, +125.0f,32.4937f,105.469f, +128.906f,34.4076f,105.469f, +132.813f,35.2497f,105.469f, +136.719f,36.4785f,105.469f, +140.625f,37.7983f,105.469f, +144.531f,40.5712f,105.469f, +148.438f,43.3698f,105.469f, +152.344f,45.784f,105.469f, +156.25f,46.9835f,105.469f, +160.156f,47.2774f,105.469f, +164.063f,46.7695f,105.469f, +167.969f,45.0199f,105.469f, +171.875f,42.588f,105.469f, +175.781f,39.988f,105.469f, +179.688f,38.0653f,105.469f, +183.594f,37.5754f,105.469f, +187.5f,35.6316f,105.469f, +191.406f,32.4143f,105.469f, +195.313f,29.5342f,105.469f, +199.219f,27.2795f,105.469f, +203.125f,26.065f,105.469f, +207.031f,24.8633f,105.469f, +210.938f,23.0216f,105.469f, +214.844f,21.1684f,105.469f, +218.75f,18.9315f,105.469f, +222.656f,17.7013f,105.469f, +226.563f,16.9466f,105.469f, +230.469f,17.1437f,105.469f, +234.375f,17.6691f,105.469f, +238.281f,17.9243f,105.469f, +242.188f,18.0005f,105.469f, +246.094f,18.6179f,105.469f, +250.0f,19.2165f,105.469f, +3.90625f,17.7074f,101.563f, +7.8125f,18.411f,101.563f, +11.7188f,17.9916f,101.563f, +15.625f,18.5349f,101.563f, +19.5313f,18.6607f,101.563f, +23.4375f,17.406f,101.563f, +27.3438f,17.2356f,101.563f, +31.25f,17.0395f,101.563f, +35.1563f,17.9903f,101.563f, +39.0625f,18.2603f,101.563f, +42.9688f,17.9037f,101.563f, +46.875f,17.2358f,101.563f, +50.7813f,16.1089f,101.563f, +54.6875f,16.6043f,101.563f, +58.5938f,16.5656f,101.563f, +62.5f,16.8655f,101.563f, +66.4063f,17.0123f,101.563f, +70.3125f,17.4985f,101.563f, +74.2188f,18.0195f,101.563f, +78.125f,17.3417f,101.563f, +82.0313f,16.8477f,101.563f, +85.9375f,15.4602f,101.563f, +89.8438f,15.6001f,101.563f, +93.75f,16.8889f,101.563f, +97.6563f,17.2944f,101.563f, +101.563f,17.3431f,101.563f, +105.469f,18.2306f,101.563f, +109.375f,20.5556f,101.563f, +113.281f,22.5598f,101.563f, +117.188f,25.0997f,101.563f, +121.094f,28.2048f,101.563f, +125.0f,30.46f,101.563f, +128.906f,32.5729f,101.563f, +132.813f,34.5568f,101.563f, +136.719f,36.463f,101.563f, +140.625f,37.8259f,101.563f, +144.531f,40.4357f,101.563f, +148.438f,43.6544f,101.563f, +152.344f,46.204f,101.563f, +156.25f,47.3874f,101.563f, +160.156f,47.5222f,101.563f, +164.063f,46.8312f,101.563f, +167.969f,44.5065f,101.563f, +171.875f,43.7648f,101.563f, +175.781f,41.9789f,101.563f, +179.688f,40.785f,101.563f, +183.594f,38.7639f,101.563f, +187.5f,36.1589f,101.563f, +191.406f,33.4197f,101.563f, +195.313f,29.7568f,101.563f, +199.219f,27.2343f,101.563f, +203.125f,26.3845f,101.563f, +207.031f,25.3149f,101.563f, +210.938f,23.4896f,101.563f, +214.844f,22.229f,101.563f, +218.75f,20.0014f,101.563f, +222.656f,19.0955f,101.563f, +226.563f,17.971f,101.563f, +230.469f,16.9303f,101.563f, +234.375f,17.3619f,101.563f, +238.281f,17.0337f,101.563f, +242.188f,17.1424f,101.563f, +246.094f,18.334f,101.563f, +250.0f,19.2744f,101.563f, +3.90625f,18.0176f,97.6563f, +7.8125f,18.1916f,97.6563f, +11.7188f,17.72f,97.6563f, +15.625f,18.3444f,97.6563f, +19.5313f,18.7102f,97.6563f, +23.4375f,17.4143f,97.6563f, +27.3438f,18.0085f,97.6563f, +31.25f,18.4924f,97.6563f, +35.1563f,19.4324f,97.6563f, +39.0625f,19.7998f,97.6563f, +42.9688f,19.5444f,97.6563f, +46.875f,19.5513f,97.6563f, +50.7813f,17.9397f,97.6563f, +54.6875f,16.6383f,97.6563f, +58.5938f,16.0619f,97.6563f, +62.5f,16.7402f,97.6563f, +66.4063f,16.955f,97.6563f, +70.3125f,17.5912f,97.6563f, +74.2188f,17.1181f,97.6563f, +78.125f,16.9063f,97.6563f, +82.0313f,16.3988f,97.6563f, +85.9375f,15.935f,97.6563f, +89.8438f,16.0664f,97.6563f, +93.75f,16.1926f,97.6563f, +97.6563f,16.5004f,97.6563f, +101.563f,17.1185f,97.6563f, +105.469f,17.2859f,97.6563f, +109.375f,19.0026f,97.6563f, +113.281f,21.0018f,97.6563f, +117.188f,23.6336f,97.6563f, +121.094f,26.4831f,97.6563f, +125.0f,29.3075f,97.6563f, +128.906f,32.5702f,97.6563f, +132.813f,34.5711f,97.6563f, +136.719f,36.1666f,97.6563f, +140.625f,37.5909f,97.6563f, +144.531f,40.3232f,97.6563f, +148.438f,42.661f,97.6563f, +152.344f,45.5604f,97.6563f, +156.25f,47.6984f,97.6563f, +160.156f,47.4129f,97.6563f, +164.063f,47.1564f,97.6563f, +167.969f,45.3058f,97.6563f, +171.875f,44.8069f,97.6563f, +175.781f,43.6847f,97.6563f, +179.688f,41.6831f,97.6563f, +183.594f,39.4072f,97.6563f, +187.5f,36.6118f,97.6563f, +191.406f,33.396f,97.6563f, +195.313f,29.9372f,97.6563f, +199.219f,28.0616f,97.6563f, +203.125f,27.3957f,97.6563f, +207.031f,25.6934f,97.6563f, +210.938f,24.4412f,97.6563f, +214.844f,23.2356f,97.6563f, +218.75f,21.445f,97.6563f, +222.656f,19.5412f,97.6563f, +226.563f,18.4898f,97.6563f, +230.469f,17.727f,97.6563f, +234.375f,16.5139f,97.6563f, +238.281f,16.2579f,97.6563f, +242.188f,16.1539f,97.6563f, +246.094f,17.0856f,97.6563f, +250.0f,18.5151f,97.6563f, +3.90625f,17.1671f,93.75f, +7.8125f,16.817f,93.75f, +11.7188f,17.5293f,93.75f, +15.625f,18.7701f,93.75f, +19.5313f,18.3362f,93.75f, +23.4375f,19.0869f,93.75f, +27.3438f,19.7557f,93.75f, +31.25f,20.0113f,93.75f, +35.1563f,20.3441f,93.75f, +39.0625f,21.4434f,93.75f, +42.9688f,21.6008f,93.75f, +46.875f,21.5423f,93.75f, +50.7813f,20.7592f,93.75f, +54.6875f,18.9207f,93.75f, +58.5938f,17.6772f,93.75f, +62.5f,17.5409f,93.75f, +66.4063f,17.599f,93.75f, +70.3125f,18.2626f,93.75f, +74.2188f,18.4046f,93.75f, +78.125f,18.215f,93.75f, +82.0313f,18.4743f,93.75f, +85.9375f,17.6579f,93.75f, +89.8438f,17.732f,93.75f, +93.75f,18.4172f,93.75f, +97.6563f,19.0439f,93.75f, +101.563f,19.7437f,93.75f, +105.469f,19.8588f,93.75f, +109.375f,19.7414f,93.75f, +113.281f,21.4756f,93.75f, +117.188f,24.1862f,93.75f, +121.094f,26.8351f,93.75f, +125.0f,29.9621f,93.75f, +128.906f,32.8267f,93.75f, +132.813f,34.6779f,93.75f, +136.719f,36.0083f,93.75f, +140.625f,36.9812f,93.75f, +144.531f,39.6087f,93.75f, +148.438f,42.2269f,93.75f, +152.344f,44.492f,93.75f, +156.25f,47.1767f,93.75f, +160.156f,47.5667f,93.75f, +164.063f,46.9625f,93.75f, +167.969f,45.6865f,93.75f, +171.875f,45.7668f,93.75f, +175.781f,44.8303f,93.75f, +179.688f,42.5904f,93.75f, +183.594f,40.3536f,93.75f, +187.5f,37.9498f,93.75f, +191.406f,35.1415f,93.75f, +195.313f,31.5011f,93.75f, +199.219f,29.695f,93.75f, +203.125f,27.7988f,93.75f, +207.031f,26.3522f,93.75f, +210.938f,25.8544f,93.75f, +214.844f,24.7269f,93.75f, +218.75f,23.7697f,93.75f, +222.656f,20.9249f,93.75f, +226.563f,19.1368f,93.75f, +230.469f,18.5704f,93.75f, +234.375f,17.554f,93.75f, +238.281f,14.9004f,93.75f, +242.188f,16.3253f,93.75f, +246.094f,16.0037f,93.75f, +250.0f,15.9921f,93.75f, +3.90625f,15.6427f,89.8438f, +7.8125f,16.2722f,89.8438f, +11.7188f,17.6471f,89.8438f, +15.625f,18.8565f,89.8438f, +19.5313f,19.651f,89.8438f, +23.4375f,20.9243f,89.8438f, +27.3438f,20.8045f,89.8438f, +31.25f,20.2274f,89.8438f, +35.1563f,21.5768f,89.8438f, +39.0625f,22.566f,89.8438f, +42.9688f,23.4111f,89.8438f, +46.875f,23.5063f,89.8438f, +50.7813f,22.9631f,89.8438f, +54.6875f,21.5642f,89.8438f, +58.5938f,20.3649f,89.8438f, +62.5f,19.6177f,89.8438f, +66.4063f,18.6758f,89.8438f, +70.3125f,18.6837f,89.8438f, +74.2188f,19.7593f,89.8438f, +78.125f,20.4356f,89.8438f, +82.0313f,20.1806f,89.8438f, +85.9375f,19.4513f,89.8438f, +89.8438f,19.2942f,89.8438f, +93.75f,19.9864f,89.8438f, +97.6563f,20.6569f,89.8438f, +101.563f,20.8985f,89.8438f, +105.469f,20.8027f,89.8438f, +109.375f,21.5099f,89.8438f, +113.281f,22.7491f,89.8438f, +117.188f,24.1938f,89.8438f, +121.094f,27.3472f,89.8438f, +125.0f,29.9546f,89.8438f, +128.906f,32.3821f,89.8438f, +132.813f,34.2078f,89.8438f, +136.719f,35.7419f,89.8438f, +140.625f,36.6408f,89.8438f, +144.531f,39.1756f,89.8438f, +148.438f,42.1721f,89.8438f, +152.344f,43.7891f,89.8438f, +156.25f,45.9566f,89.8438f, +160.156f,47.5521f,89.8438f, +164.063f,47.0165f,89.8438f, +167.969f,46.0084f,89.8438f, +171.875f,46.0374f,89.8438f, +175.781f,45.9301f,89.8438f, +179.688f,43.5326f,89.8438f, +183.594f,40.5203f,89.8438f, +187.5f,38.133f,89.8438f, +191.406f,35.8688f,89.8438f, +195.313f,33.0648f,89.8438f, +199.219f,31.0451f,89.8438f, +203.125f,27.691f,89.8438f, +207.031f,26.7927f,89.8438f, +210.938f,26.334f,89.8438f, +214.844f,25.0669f,89.8438f, +218.75f,23.4149f,89.8438f, +222.656f,20.9786f,89.8438f, +226.563f,18.963f,89.8438f, +230.469f,18.7894f,89.8438f, +234.375f,17.2683f,89.8438f, +238.281f,14.98f,89.8438f, +242.188f,15.4163f,89.8438f, +246.094f,15.4238f,89.8438f, +250.0f,15.9208f,89.8438f, +3.90625f,15.5916f,85.9375f, +7.8125f,16.3916f,85.9375f, +11.7188f,18.2047f,85.9375f, +15.625f,19.1861f,85.9375f, +19.5313f,20.7525f,85.9375f, +23.4375f,21.6364f,85.9375f, +27.3438f,21.9262f,85.9375f, +31.25f,21.6225f,85.9375f, +35.1563f,22.4806f,85.9375f, +39.0625f,23.7973f,85.9375f, +42.9688f,24.6135f,85.9375f, +46.875f,24.8421f,85.9375f, +50.7813f,24.5451f,85.9375f, +54.6875f,23.688f,85.9375f, +58.5938f,22.221f,85.9375f, +62.5f,21.5009f,85.9375f, +66.4063f,21.2241f,85.9375f, +70.3125f,20.2058f,85.9375f, +74.2188f,20.3437f,85.9375f, +78.125f,21.8786f,85.9375f, +82.0313f,21.9425f,85.9375f, +85.9375f,20.6496f,85.9375f, +89.8438f,20.6855f,85.9375f, +93.75f,20.6495f,85.9375f, +97.6563f,21.0738f,85.9375f, +101.563f,21.7991f,85.9375f, +105.469f,22.3795f,85.9375f, +109.375f,22.4292f,85.9375f, +113.281f,23.6451f,85.9375f, +117.188f,24.8457f,85.9375f, +121.094f,26.7121f,85.9375f, +125.0f,29.2236f,85.9375f, +128.906f,31.5942f,85.9375f, +132.813f,33.8517f,85.9375f, +136.719f,35.7145f,85.9375f, +140.625f,36.6808f,85.9375f, +144.531f,38.8926f,85.9375f, +148.438f,41.6484f,85.9375f, +152.344f,44.2035f,85.9375f, +156.25f,45.1997f,85.9375f, +160.156f,46.1921f,85.9375f, +164.063f,47.2097f,85.9375f, +167.969f,47.0691f,85.9375f, +171.875f,45.5257f,85.9375f, +175.781f,44.6746f,85.9375f, +179.688f,43.6223f,85.9375f, +183.594f,40.2395f,85.9375f, +187.5f,38.445f,85.9375f, +191.406f,36.5002f,85.9375f, +195.313f,33.7977f,85.9375f, +199.219f,31.5943f,85.9375f, +203.125f,28.8305f,85.9375f, +207.031f,27.4922f,85.9375f, +210.938f,26.0386f,85.9375f, +214.844f,24.1792f,85.9375f, +218.75f,22.1567f,85.9375f, +222.656f,20.1169f,85.9375f, +226.563f,19.3603f,85.9375f, +230.469f,17.7703f,85.9375f, +234.375f,16.3147f,85.9375f, +238.281f,15.0886f,85.9375f, +242.188f,15.1332f,85.9375f, +246.094f,14.7802f,85.9375f, +250.0f,15.2259f,85.9375f, +3.90625f,16.9644f,82.0313f, +7.8125f,17.8f,82.0313f, +11.7188f,19.2943f,82.0313f, +15.625f,21.0269f,82.0313f, +19.5313f,22.3312f,82.0313f, +23.4375f,23.0871f,82.0313f, +27.3438f,23.1115f,82.0313f, +31.25f,23.5304f,82.0313f, +35.1563f,24.1493f,82.0313f, +39.0625f,25.0848f,82.0313f, +42.9688f,26.0789f,82.0313f, +46.875f,26.3399f,82.0313f, +50.7813f,25.4397f,82.0313f, +54.6875f,24.894f,82.0313f, +58.5938f,24.1026f,82.0313f, +62.5f,24.0749f,82.0313f, +66.4063f,23.5256f,82.0313f, +70.3125f,21.9612f,82.0313f, +74.2188f,21.932f,82.0313f, +78.125f,22.6241f,82.0313f, +82.0313f,22.672f,82.0313f, +85.9375f,21.4303f,82.0313f, +89.8438f,21.6964f,82.0313f, +93.75f,21.7198f,82.0313f, +97.6563f,22.4953f,82.0313f, +101.563f,23.0451f,82.0313f, +105.469f,23.0285f,82.0313f, +109.375f,23.24f,82.0313f, +113.281f,23.6861f,82.0313f, +117.188f,24.7685f,82.0313f, +121.094f,26.4466f,82.0313f, +125.0f,28.8315f,82.0313f, +128.906f,30.9624f,82.0313f, +132.813f,33.7991f,82.0313f, +136.719f,35.8079f,82.0313f, +140.625f,37.0254f,82.0313f, +144.531f,38.7479f,82.0313f, +148.438f,42.0473f,82.0313f, +152.344f,43.7879f,82.0313f, +156.25f,45.1826f,82.0313f, +160.156f,46.2454f,82.0313f, +164.063f,47.0196f,82.0313f, +167.969f,47.2872f,82.0313f, +171.875f,46.2496f,82.0313f, +175.781f,44.3338f,82.0313f, +179.688f,43.1095f,82.0313f, +183.594f,40.7857f,82.0313f, +187.5f,39.646f,82.0313f, +191.406f,37.5425f,82.0313f, +195.313f,35.2951f,82.0313f, +199.219f,33.6324f,82.0313f, +203.125f,30.8911f,82.0313f, +207.031f,27.2798f,82.0313f, +210.938f,25.4308f,82.0313f, +214.844f,23.8814f,82.0313f, +218.75f,22.4441f,82.0313f, +222.656f,20.3771f,82.0313f, +226.563f,19.2073f,82.0313f, +230.469f,19.0082f,82.0313f, +234.375f,17.769f,82.0313f, +238.281f,15.8302f,82.0313f, +242.188f,14.2967f,82.0313f, +246.094f,15.1365f,82.0313f, +250.0f,14.9159f,82.0313f, +3.90625f,18.8244f,78.125f, +7.8125f,19.5283f,78.125f, +11.7188f,20.9466f,78.125f, +15.625f,22.0951f,78.125f, +19.5313f,23.2483f,78.125f, +23.4375f,23.8238f,78.125f, +27.3438f,24.6236f,78.125f, +31.25f,24.0856f,78.125f, +35.1563f,25.6129f,78.125f, +39.0625f,26.8525f,78.125f, +42.9688f,26.9859f,78.125f, +46.875f,26.6403f,78.125f, +50.7813f,26.6419f,78.125f, +54.6875f,27.4236f,78.125f, +58.5938f,26.5989f,78.125f, +62.5f,26.137f,78.125f, +66.4063f,24.8717f,78.125f, +70.3125f,23.8694f,78.125f, +74.2188f,23.2668f,78.125f, +78.125f,23.1081f,78.125f, +82.0313f,23.3134f,78.125f, +85.9375f,23.0903f,78.125f, +89.8438f,23.2822f,78.125f, +93.75f,24.291f,78.125f, +97.6563f,24.5546f,78.125f, +101.563f,24.4216f,78.125f, +105.469f,24.6379f,78.125f, +109.375f,24.5235f,78.125f, +113.281f,24.88f,78.125f, +117.188f,25.6988f,78.125f, +121.094f,26.9155f,78.125f, +125.0f,29.7499f,78.125f, +128.906f,31.361f,78.125f, +132.813f,33.9367f,78.125f, +136.719f,35.4066f,78.125f, +140.625f,36.6153f,78.125f, +144.531f,38.6091f,78.125f, +148.438f,41.2276f,78.125f, +152.344f,43.2187f,78.125f, +156.25f,45.2494f,78.125f, +160.156f,46.5334f,78.125f, +164.063f,47.1659f,78.125f, +167.969f,47.5409f,78.125f, +171.875f,46.3778f,78.125f, +175.781f,44.8935f,78.125f, +179.688f,43.7429f,78.125f, +183.594f,42.4748f,78.125f, +187.5f,40.5234f,78.125f, +191.406f,38.2806f,78.125f, +195.313f,36.297f,78.125f, +199.219f,35.0641f,78.125f, +203.125f,32.4145f,78.125f, +207.031f,29.4539f,78.125f, +210.938f,25.7399f,78.125f, +214.844f,23.157f,78.125f, +218.75f,20.9425f,78.125f, +222.656f,19.2349f,78.125f, +226.563f,18.5576f,78.125f, +230.469f,18.8407f,78.125f, +234.375f,17.6562f,78.125f, +238.281f,15.7207f,78.125f, +242.188f,14.3385f,78.125f, +246.094f,13.9958f,78.125f, +250.0f,14.6888f,78.125f, +3.90625f,20.6829f,74.2188f, +7.8125f,22.7393f,74.2188f, +11.7188f,22.9007f,74.2188f, +15.625f,23.3717f,74.2188f, +19.5313f,23.7991f,74.2188f, +23.4375f,24.5576f,74.2188f, +27.3438f,25.3464f,74.2188f, +31.25f,25.8349f,74.2188f, +35.1563f,26.2326f,74.2188f, +39.0625f,27.8003f,74.2188f, +42.9688f,28.502f,74.2188f, +46.875f,28.7947f,74.2188f, +50.7813f,29.109f,74.2188f, +54.6875f,29.4315f,74.2188f, +58.5938f,29.1948f,74.2188f, +62.5f,28.241f,74.2188f, +66.4063f,26.6727f,74.2188f, +70.3125f,25.5496f,74.2188f, +74.2188f,24.2265f,74.2188f, +78.125f,24.8641f,74.2188f, +82.0313f,24.8692f,74.2188f, +85.9375f,23.8066f,74.2188f, +89.8438f,24.5827f,74.2188f, +93.75f,25.5885f,74.2188f, +97.6563f,25.005f,74.2188f, +101.563f,25.4768f,74.2188f, +105.469f,25.8326f,74.2188f, +109.375f,25.8587f,74.2188f, +113.281f,26.8029f,74.2188f, +117.188f,27.8764f,74.2188f, +121.094f,28.8835f,74.2188f, +125.0f,30.0077f,74.2188f, +128.906f,31.9776f,74.2188f, +132.813f,34.2008f,74.2188f, +136.719f,35.4023f,74.2188f, +140.625f,36.3754f,74.2188f, +144.531f,38.9991f,74.2188f, +148.438f,41.295f,74.2188f, +152.344f,44.1131f,74.2188f, +156.25f,46.2221f,74.2188f, +160.156f,46.7797f,74.2188f, +164.063f,47.446f,74.2188f, +167.969f,47.1396f,74.2188f, +171.875f,45.9937f,74.2188f, +175.781f,45.4284f,74.2188f, +179.688f,45.018f,74.2188f, +183.594f,43.1233f,74.2188f, +187.5f,41.2272f,74.2188f, +191.406f,37.8072f,74.2188f, +195.313f,36.5304f,74.2188f, +199.219f,35.1638f,74.2188f, +203.125f,33.1538f,74.2188f, +207.031f,30.2207f,74.2188f, +210.938f,26.1665f,74.2188f, +214.844f,22.1619f,74.2188f, +218.75f,18.452f,74.2188f, +222.656f,17.0925f,74.2188f, +226.563f,17.3468f,74.2188f, +230.469f,16.447f,74.2188f, +234.375f,15.7197f,74.2188f, +238.281f,14.7889f,74.2188f, +242.188f,13.641f,74.2188f, +246.094f,12.7728f,74.2188f, +250.0f,13.3875f,74.2188f, +3.90625f,22.948f,70.3125f, +7.8125f,24.3431f,70.3125f, +11.7188f,24.6307f,70.3125f, +15.625f,24.9963f,70.3125f, +19.5313f,25.2034f,70.3125f, +23.4375f,25.2791f,70.3125f, +27.3438f,25.8257f,70.3125f, +31.25f,27.1123f,70.3125f, +35.1563f,27.8795f,70.3125f, +39.0625f,28.8437f,70.3125f, +42.9688f,29.8883f,70.3125f, +46.875f,30.6548f,70.3125f, +50.7813f,31.0396f,70.3125f, +54.6875f,31.6324f,70.3125f, +58.5938f,31.5222f,70.3125f, +62.5f,30.4696f,70.3125f, +66.4063f,28.7208f,70.3125f, +70.3125f,26.8611f,70.3125f, +74.2188f,25.6776f,70.3125f, +78.125f,26.1193f,70.3125f, +82.0313f,25.1971f,70.3125f, +85.9375f,24.4814f,70.3125f, +89.8438f,25.1213f,70.3125f, +93.75f,26.1411f,70.3125f, +97.6563f,26.4276f,70.3125f, +101.563f,26.0728f,70.3125f, +105.469f,26.113f,70.3125f, +109.375f,27.5702f,70.3125f, +113.281f,28.6199f,70.3125f, +117.188f,30.054f,70.3125f, +121.094f,30.255f,70.3125f, +125.0f,30.9839f,70.3125f, +128.906f,32.4045f,70.3125f, +132.813f,33.9858f,70.3125f, +136.719f,35.8568f,70.3125f, +140.625f,37.5803f,70.3125f, +144.531f,40.2984f,70.3125f, +148.438f,41.9326f,70.3125f, +152.344f,44.1607f,70.3125f, +156.25f,45.6454f,70.3125f, +160.156f,47.3567f,70.3125f, +164.063f,48.1147f,70.3125f, +167.969f,47.7671f,70.3125f, +171.875f,46.1009f,70.3125f, +175.781f,45.3829f,70.3125f, +179.688f,44.3458f,70.3125f, +183.594f,42.818f,70.3125f, +187.5f,40.5253f,70.3125f, +191.406f,37.6731f,70.3125f, +195.313f,36.7234f,70.3125f, +199.219f,35.0848f,70.3125f, +203.125f,33.0857f,70.3125f, +207.031f,30.0508f,70.3125f, +210.938f,26.741f,70.3125f, +214.844f,22.7613f,70.3125f, +218.75f,18.5375f,70.3125f, +222.656f,15.6052f,70.3125f, +226.563f,14.6945f,70.3125f, +230.469f,15.0013f,70.3125f, +234.375f,13.9965f,70.3125f, +238.281f,12.4404f,70.3125f, +242.188f,12.4448f,70.3125f, +246.094f,11.7446f,70.3125f, +250.0f,11.7886f,70.3125f, +3.90625f,25.5564f,66.4063f, +7.8125f,26.1216f,66.4063f, +11.7188f,26.234f,66.4063f, +15.625f,26.4553f,66.4063f, +19.5313f,26.9827f,66.4063f, +23.4375f,27.0173f,66.4063f, +27.3438f,27.3577f,66.4063f, +31.25f,28.895f,66.4063f, +35.1563f,30.1057f,66.4063f, +39.0625f,30.249f,66.4063f, +42.9688f,31.1394f,66.4063f, +46.875f,31.7197f,66.4063f, +50.7813f,33.2905f,66.4063f, +54.6875f,33.6208f,66.4063f, +58.5938f,33.5152f,66.4063f, +62.5f,31.5128f,66.4063f, +66.4063f,30.1049f,66.4063f, +70.3125f,28.9139f,66.4063f, +74.2188f,27.093f,66.4063f, +78.125f,26.8272f,66.4063f, +82.0313f,25.8777f,66.4063f, +85.9375f,25.2597f,66.4063f, +89.8438f,25.8742f,66.4063f, +93.75f,27.4783f,66.4063f, +97.6563f,27.1897f,66.4063f, +101.563f,26.8406f,66.4063f, +105.469f,27.2889f,66.4063f, +109.375f,28.6616f,66.4063f, +113.281f,29.2852f,66.4063f, +117.188f,30.3362f,66.4063f, +121.094f,32.0648f,66.4063f, +125.0f,32.6693f,66.4063f, +128.906f,33.7239f,66.4063f, +132.813f,34.8193f,66.4063f, +136.719f,36.6878f,66.4063f, +140.625f,38.5422f,66.4063f, +144.531f,40.5193f,66.4063f, +148.438f,42.0434f,66.4063f, +152.344f,43.692f,66.4063f, +156.25f,46.2f,66.4063f, +160.156f,47.7247f,66.4063f, +164.063f,48.3486f,66.4063f, +167.969f,48.4057f,66.4063f, +171.875f,47.4141f,66.4063f, +175.781f,45.925f,66.4063f, +179.688f,44.0772f,66.4063f, +183.594f,42.0866f,66.4063f, +187.5f,40.2687f,66.4063f, +191.406f,38.0236f,66.4063f, +195.313f,36.9223f,66.4063f, +199.219f,35.6323f,66.4063f, +203.125f,33.0001f,66.4063f, +207.031f,30.1425f,66.4063f, +210.938f,26.4551f,66.4063f, +214.844f,22.4224f,66.4063f, +218.75f,18.5557f,66.4063f, +222.656f,16.1428f,66.4063f, +226.563f,14.9942f,66.4063f, +230.469f,14.9221f,66.4063f, +234.375f,13.3816f,66.4063f, +238.281f,10.9914f,66.4063f, +242.188f,10.6094f,66.4063f, +246.094f,9.77905f,66.4063f, +250.0f,9.99853f,66.4063f, +3.90625f,27.1929f,62.5f, +7.8125f,28.1411f,62.5f, +11.7188f,27.9312f,62.5f, +15.625f,27.692f,62.5f, +19.5313f,27.8511f,62.5f, +23.4375f,28.2162f,62.5f, +27.3438f,29.5518f,62.5f, +31.25f,30.2367f,62.5f, +35.1563f,31.1075f,62.5f, +39.0625f,31.6239f,62.5f, +42.9688f,32.8498f,62.5f, +46.875f,33.1521f,62.5f, +50.7813f,34.6411f,62.5f, +54.6875f,35.0063f,62.5f, +58.5938f,33.8006f,62.5f, +62.5f,33.1029f,62.5f, +66.4063f,32.1466f,62.5f, +70.3125f,30.2614f,62.5f, +74.2188f,28.2978f,62.5f, +78.125f,28.0764f,62.5f, +82.0313f,27.2473f,62.5f, +85.9375f,26.2769f,62.5f, +89.8438f,26.2922f,62.5f, +93.75f,27.1235f,62.5f, +97.6563f,27.498f,62.5f, +101.563f,27.2257f,62.5f, +105.469f,28.2897f,62.5f, +109.375f,28.8921f,62.5f, +113.281f,30.563f,62.5f, +117.188f,32.1298f,62.5f, +121.094f,32.8639f,62.5f, +125.0f,34.6537f,62.5f, +128.906f,35.4867f,62.5f, +132.813f,36.6181f,62.5f, +136.719f,37.6418f,62.5f, +140.625f,39.2228f,62.5f, +144.531f,40.5105f,62.5f, +148.438f,42.215f,62.5f, +152.344f,43.5394f,62.5f, +156.25f,45.1171f,62.5f, +160.156f,46.6711f,62.5f, +164.063f,47.4274f,62.5f, +167.969f,47.6821f,62.5f, +171.875f,48.0762f,62.5f, +175.781f,46.4607f,62.5f, +179.688f,44.7623f,62.5f, +183.594f,42.6372f,62.5f, +187.5f,40.3231f,62.5f, +191.406f,38.4371f,62.5f, +195.313f,36.1978f,62.5f, +199.219f,35.38f,62.5f, +203.125f,32.0325f,62.5f, +207.031f,29.2047f,62.5f, +210.938f,27.481f,62.5f, +214.844f,24.0627f,62.5f, +218.75f,20.6235f,62.5f, +222.656f,18.5468f,62.5f, +226.563f,17.2736f,62.5f, +230.469f,15.4125f,62.5f, +234.375f,13.6775f,62.5f, +238.281f,11.4407f,62.5f, +242.188f,9.73154f,62.5f, +246.094f,8.55197f,62.5f, +250.0f,8.43693f,62.5f, +3.90625f,28.3495f,58.5938f, +7.8125f,28.8832f,58.5938f, +11.7188f,28.5512f,58.5938f, +15.625f,28.8533f,58.5938f, +19.5313f,29.0576f,58.5938f, +23.4375f,30.3079f,58.5938f, +27.3438f,31.3861f,58.5938f, +31.25f,33.0252f,58.5938f, +35.1563f,33.4087f,58.5938f, +39.0625f,34.3736f,58.5938f, +42.9688f,34.6944f,58.5938f, +46.875f,34.1156f,58.5938f, +50.7813f,34.7246f,58.5938f, +54.6875f,35.3934f,58.5938f, +58.5938f,34.9508f,58.5938f, +62.5f,34.469f,58.5938f, +66.4063f,33.1584f,58.5938f, +70.3125f,30.5913f,58.5938f, +74.2188f,30.4147f,58.5938f, +78.125f,30.821f,58.5938f, +82.0313f,29.9244f,58.5938f, +85.9375f,28.365f,58.5938f, +89.8438f,27.8694f,58.5938f, +93.75f,27.7517f,58.5938f, +97.6563f,27.9188f,58.5938f, +101.563f,27.7605f,58.5938f, +105.469f,28.252f,58.5938f, +109.375f,29.4592f,58.5938f, +113.281f,31.2608f,58.5938f, +117.188f,33.5373f,58.5938f, +121.094f,34.4995f,58.5938f, +125.0f,35.1593f,58.5938f, +128.906f,36.6148f,58.5938f, +132.813f,37.1425f,58.5938f, +136.719f,38.2148f,58.5938f, +140.625f,38.9964f,58.5938f, +144.531f,40.3196f,58.5938f, +148.438f,42.4959f,58.5938f, +152.344f,43.37f,58.5938f, +156.25f,44.3488f,58.5938f, +160.156f,45.6441f,58.5937f, +164.063f,45.6597f,58.5937f, +167.969f,46.9631f,58.5938f, +171.875f,47.0933f,58.5938f, +175.781f,45.839f,58.5937f, +179.688f,44.0491f,58.5937f, +183.594f,41.6462f,58.5938f, +187.5f,39.9012f,58.5938f, +191.406f,37.8373f,58.5938f, +195.313f,35.0871f,58.5938f, +199.219f,34.6045f,58.5938f, +203.125f,32.4469f,58.5938f, +207.031f,30.5103f,58.5938f, +210.938f,28.7194f,58.5938f, +214.844f,26.3358f,58.5938f, +218.75f,24.3668f,58.5938f, +222.656f,22.1719f,58.5938f, +226.563f,20.1708f,58.5938f, +230.469f,18.1384f,58.5938f, +234.375f,15.6994f,58.5938f, +238.281f,12.6124f,58.5938f, +242.188f,11.2279f,58.5938f, +246.094f,10.4938f,58.5938f, +250.0f,9.45058f,58.5938f, +3.90625f,29.2057f,54.6875f, +7.8125f,29.4161f,54.6875f, +11.7188f,29.6274f,54.6875f, +15.625f,29.8747f,54.6875f, +19.5313f,31.3353f,54.6875f, +23.4375f,32.5261f,54.6875f, +27.3438f,34.3893f,54.6875f, +31.25f,34.9525f,54.6875f, +35.1563f,35.8992f,54.6875f, +39.0625f,36.2066f,54.6875f, +42.9688f,36.4212f,54.6875f, +46.875f,36.1377f,54.6875f, +50.7813f,35.4213f,54.6875f, +54.6875f,35.5045f,54.6875f, +58.5938f,36.0891f,54.6875f, +62.5f,36.0244f,54.6875f, +66.4063f,34.9086f,54.6875f, +70.3125f,32.8671f,54.6875f, +74.2188f,33.5578f,54.6875f, +78.125f,33.8468f,54.6875f, +82.0313f,32.868f,54.6875f, +85.9375f,31.2245f,54.6875f, +89.8438f,29.442f,54.6875f, +93.75f,28.9144f,54.6875f, +97.6563f,27.6797f,54.6875f, +101.563f,27.9585f,54.6875f, +105.469f,28.5492f,54.6875f, +109.375f,29.119f,54.6875f, +113.281f,30.7234f,54.6875f, +117.188f,32.402f,54.6875f, +121.094f,34.3605f,54.6875f, +125.0f,35.6614f,54.6875f, +128.906f,37.1814f,54.6875f, +132.813f,37.8509f,54.6875f, +136.719f,38.3282f,54.6875f, +140.625f,39.021f,54.6875f, +144.531f,39.8455f,54.6875f, +148.438f,41.3547f,54.6875f, +152.344f,42.0848f,54.6875f, +156.25f,42.4546f,54.6875f, +160.156f,43.3035f,54.6875f, +164.063f,44.2757f,54.6875f, +167.969f,45.0917f,54.6875f, +171.875f,44.9479f,54.6875f, +175.781f,44.386f,54.6875f, +179.688f,43.1031f,54.6875f, +183.594f,41.5243f,54.6875f, +187.5f,39.9976f,54.6875f, +191.406f,37.1931f,54.6875f, +195.313f,35.2297f,54.6875f, +199.219f,34.439f,54.6875f, +203.125f,32.7399f,54.6875f, +207.031f,31.4766f,54.6875f, +210.938f,29.9402f,54.6875f, +214.844f,28.6752f,54.6875f, +218.75f,27.0387f,54.6875f, +222.656f,24.4777f,54.6875f, +226.563f,21.7169f,54.6875f, +230.469f,20.0299f,54.6875f, +234.375f,17.3103f,54.6875f, +238.281f,14.1891f,54.6875f, +242.188f,12.1605f,54.6875f, +246.094f,10.9065f,54.6875f, +250.0f,10.6619f,54.6875f, +3.90625f,30.4306f,50.7813f, +7.8125f,30.9679f,50.7813f, +11.7188f,31.3065f,50.7813f, +15.625f,32.0527f,50.7813f, +19.5313f,33.9185f,50.7813f, +23.4375f,34.6834f,50.7813f, +27.3438f,35.8025f,50.7813f, +31.25f,36.824f,50.7813f, +35.1563f,37.9949f,50.7813f, +39.0625f,38.2428f,50.7813f, +42.9688f,37.3912f,50.7813f, +46.875f,37.2849f,50.7813f, +50.7813f,36.4441f,50.7813f, +54.6875f,36.5986f,50.7813f, +58.5938f,36.7371f,50.7813f, +62.5f,36.6154f,50.7813f, +66.4063f,35.9475f,50.7813f, +70.3125f,35.1832f,50.7813f, +74.2188f,35.7876f,50.7813f, +78.125f,35.9086f,50.7813f, +82.0313f,35.0048f,50.7813f, +85.9375f,33.7202f,50.7813f, +89.8438f,32.6473f,50.7813f, +93.75f,30.9552f,50.7813f, +97.6563f,28.7453f,50.7813f, +101.563f,29.1526f,50.7813f, +105.469f,29.9957f,50.7813f, +109.375f,30.5544f,50.7813f, +113.281f,31.6947f,50.7813f, +117.188f,32.7584f,50.7813f, +121.094f,34.2518f,50.7813f, +125.0f,36.3694f,50.7813f, +128.906f,36.9477f,50.7813f, +132.813f,37.2918f,50.7813f, +136.719f,37.8325f,50.7813f, +140.625f,38.0845f,50.7813f, +144.531f,40.0088f,50.7813f, +148.438f,40.8219f,50.7813f, +152.344f,42.4039f,50.7813f, +156.25f,42.6086f,50.7813f, +160.156f,43.5487f,50.7813f, +164.063f,43.5328f,50.7813f, +167.969f,44.212f,50.7812f, +171.875f,43.6744f,50.7813f, +175.781f,43.198f,50.7813f, +179.688f,42.957f,50.7813f, +183.594f,41.4993f,50.7813f, +187.5f,39.5101f,50.7813f, +191.406f,38.1729f,50.7813f, +195.313f,35.4881f,50.7813f, +199.219f,34.6384f,50.7813f, +203.125f,34.1873f,50.7813f, +207.031f,32.1155f,50.7813f, +210.938f,30.912f,50.7813f, +214.844f,30.3391f,50.7813f, +218.75f,28.1256f,50.7813f, +222.656f,24.902f,50.7813f, +226.563f,22.2443f,50.7813f, +230.469f,20.9172f,50.7813f, +234.375f,18.8508f,50.7813f, +238.281f,15.9912f,50.7813f, +242.188f,12.7716f,50.7813f, +246.094f,11.6189f,50.7813f, +250.0f,12.2688f,50.7813f, +3.90625f,30.8772f,46.875f, +7.8125f,32.4754f,46.875f, +11.7188f,33.6983f,46.875f, +15.625f,35.14f,46.875f, +19.5313f,37.0369f,46.875f, +23.4375f,38.369f,46.875f, +27.3438f,38.6134f,46.875f, +31.25f,38.9784f,46.875f, +35.1563f,39.9891f,46.875f, +39.0625f,40.3197f,46.875f, +42.9688f,39.9692f,46.875f, +46.875f,39.6994f,46.875f, +50.7813f,39.4183f,46.875f, +54.6875f,38.2948f,46.875f, +58.5938f,38.32f,46.875f, +62.5f,38.621f,46.875f, +66.4063f,38.2134f,46.875f, +70.3125f,36.9577f,46.875f, +74.2188f,37.2936f,46.875f, +78.125f,37.8653f,46.875f, +82.0313f,36.9058f,46.875f, +85.9375f,36.1841f,46.875f, +89.8438f,34.8143f,46.875f, +93.75f,33.0783f,46.875f, +97.6563f,30.9854f,46.875f, +101.563f,30.934f,46.875f, +105.469f,32.108f,46.875f, +109.375f,33.0462f,46.875f, +113.281f,32.9253f,46.875f, +117.188f,33.3377f,46.875f, +121.094f,34.2153f,46.875f, +125.0f,35.0739f,46.875f, +128.906f,36.8239f,46.875f, +132.813f,37.1463f,46.875f, +136.719f,37.5409f,46.875f, +140.625f,38.8265f,46.875f, +144.531f,40.7241f,46.875f, +148.438f,40.9349f,46.875f, +152.344f,42.4491f,46.875f, +156.25f,43.9695f,46.875f, +160.156f,44.2191f,46.875f, +164.063f,44.9265f,46.875f, +167.969f,43.9423f,46.875f, +171.875f,43.273f,46.875f, +175.781f,43.2543f,46.875f, +179.688f,42.5328f,46.875f, +183.594f,41.1777f,46.875f, +187.5f,39.3553f,46.875f, +191.406f,37.8242f,46.875f, +195.313f,36.4649f,46.875f, +199.219f,35.6955f,46.875f, +203.125f,35.1878f,46.875f, +207.031f,32.9438f,46.875f, +210.938f,31.3677f,46.875f, +214.844f,30.7282f,46.875f, +218.75f,28.3328f,46.875f, +222.656f,25.0599f,46.875f, +226.563f,24.1932f,46.875f, +230.469f,22.3853f,46.875f, +234.375f,19.4896f,46.875f, +238.281f,16.8753f,46.875f, +242.188f,13.9469f,46.875f, +246.094f,13.2975f,46.875f, +250.0f,13.2524f,46.875f, +3.90625f,31.8945f,42.9688f, +7.8125f,34.0117f,42.9688f, +11.7188f,36.2441f,42.9688f, +15.625f,37.3622f,42.9688f, +19.5313f,39.5877f,42.9688f, +23.4375f,41.0994f,42.9688f, +27.3438f,42.0864f,42.9688f, +31.25f,42.0849f,42.9688f, +35.1563f,42.2038f,42.9688f, +39.0625f,43.473f,42.9688f, +42.9688f,42.7754f,42.9688f, +46.875f,42.3177f,42.9688f, +50.7813f,42.209f,42.9688f, +54.6875f,41.3095f,42.9688f, +58.5938f,40.8629f,42.9688f, +62.5f,40.4776f,42.9688f, +66.4063f,40.1396f,42.9688f, +70.3125f,39.1169f,42.9688f, +74.2188f,39.1382f,42.9688f, +78.125f,39.1421f,42.9688f, +82.0313f,38.9022f,42.9688f, +85.9375f,37.5711f,42.9688f, +89.8438f,36.7924f,42.9688f, +93.75f,34.7734f,42.9688f, +97.6563f,33.167f,42.9688f, +101.563f,32.4173f,42.9688f, +105.469f,33.0466f,42.9688f, +109.375f,33.3882f,42.9688f, +113.281f,33.7538f,42.9688f, +117.188f,33.5661f,42.9688f, +121.094f,33.9051f,42.9688f, +125.0f,34.9181f,42.9688f, +128.906f,35.2925f,42.9688f, +132.813f,37.1741f,42.9688f, +136.719f,38.0993f,42.9688f, +140.625f,38.7621f,42.9688f, +144.531f,39.712f,42.9688f, +148.438f,40.7257f,42.9688f, +152.344f,42.2465f,42.9688f, +156.25f,43.5331f,42.9688f, +160.156f,44.6745f,42.9687f, +164.063f,44.564f,42.9688f, +167.969f,44.6075f,42.9688f, +171.875f,43.2227f,42.9688f, +175.781f,42.5688f,42.9688f, +179.688f,41.9742f,42.9688f, +183.594f,40.3484f,42.9688f, +187.5f,38.9109f,42.9688f, +191.406f,37.7273f,42.9688f, +195.313f,36.5287f,42.9688f, +199.219f,35.9361f,42.9688f, +203.125f,35.1638f,42.9688f, +207.031f,33.6615f,42.9688f, +210.938f,31.2785f,42.9688f, +214.844f,30.1259f,42.9688f, +218.75f,28.6143f,42.9688f, +222.656f,26.1162f,42.9688f, +226.563f,24.2882f,42.9688f, +230.469f,22.5195f,42.9688f, +234.375f,20.1462f,42.9688f, +238.281f,17.4811f,42.9688f, +242.188f,15.2736f,42.9688f, +246.094f,13.788f,42.9688f, +250.0f,13.1723f,42.9688f, +3.90625f,34.9171f,39.0625f, +7.8125f,36.7711f,39.0625f, +11.7188f,38.5677f,39.0625f, +15.625f,40.0524f,39.0625f, +19.5313f,42.2392f,39.0625f, +23.4375f,43.2332f,39.0625f, +27.3438f,44.8254f,39.0625f, +31.25f,45.1808f,39.0625f, +35.1563f,44.9684f,39.0625f, +39.0625f,45.0647f,39.0625f, +42.9688f,45.0888f,39.0625f, +46.875f,45.5266f,39.0625f, +50.7813f,45.2542f,39.0625f, +54.6875f,44.1797f,39.0625f, +58.5938f,43.2658f,39.0625f, +62.5f,42.7568f,39.0625f, +66.4063f,42.4159f,39.0625f, +70.3125f,41.3883f,39.0625f, +74.2188f,41.1975f,39.0625f, +78.125f,41.3073f,39.0625f, +82.0313f,41.0587f,39.0625f, +85.9375f,40.0611f,39.0625f, +89.8438f,38.7299f,39.0625f, +93.75f,37.2923f,39.0625f, +97.6563f,35.7971f,39.0625f, +101.563f,35.1982f,39.0625f, +105.469f,33.6408f,39.0625f, +109.375f,33.2619f,39.0625f, +113.281f,33.8387f,39.0625f, +117.188f,34.7554f,39.0625f, +121.094f,33.8569f,39.0625f, +125.0f,34.7741f,39.0625f, +128.906f,35.7319f,39.0625f, +132.813f,36.6023f,39.0625f, +136.719f,37.7084f,39.0625f, +140.625f,38.2513f,39.0625f, +144.531f,39.1992f,39.0625f, +148.438f,40.2336f,39.0625f, +152.344f,41.0883f,39.0625f, +156.25f,42.4004f,39.0625f, +160.156f,42.8753f,39.0625f, +164.063f,43.1631f,39.0625f, +167.969f,43.6378f,39.0625f, +171.875f,43.2113f,39.0625f, +175.781f,42.5474f,39.0625f, +179.688f,41.3413f,39.0625f, +183.594f,39.4383f,39.0625f, +187.5f,38.9723f,39.0625f, +191.406f,37.3549f,39.0625f, +195.313f,35.8615f,39.0625f, +199.219f,34.9243f,39.0625f, +203.125f,34.598f,39.0625f, +207.031f,33.6592f,39.0625f, +210.938f,32.2347f,39.0625f, +214.844f,30.4117f,39.0625f, +218.75f,28.4787f,39.0625f, +222.656f,26.6538f,39.0625f, +226.563f,24.4892f,39.0625f, +230.469f,22.9637f,39.0625f, +234.375f,20.6363f,39.0625f, +238.281f,18.4584f,39.0625f, +242.188f,16.293f,39.0625f, +246.094f,13.7473f,39.0625f, +250.0f,13.2449f,39.0625f, +3.90625f,38.5427f,35.1563f, +7.8125f,39.2771f,35.1563f, +11.7188f,40.4801f,35.1563f, +15.625f,42.2714f,35.1563f, +19.5313f,44.0743f,35.1562f, +23.4375f,45.9071f,35.1562f, +27.3438f,47.4425f,35.1563f, +31.25f,47.765f,35.1563f, +35.1563f,46.8453f,35.1562f, +39.0625f,47.1161f,35.1562f, +42.9688f,46.591f,35.1563f, +46.875f,47.4064f,35.1563f, +50.7813f,47.2001f,35.1562f, +54.6875f,47.2372f,35.1562f, +58.5938f,46.9666f,35.1563f, +62.5f,45.3322f,35.1563f, +66.4063f,44.4351f,35.1562f, +70.3125f,43.869f,35.1562f, +74.2188f,43.7604f,35.1563f, +78.125f,43.6414f,35.1563f, +82.0313f,43.6044f,35.1563f, +85.9375f,41.9765f,35.1563f, +89.8438f,40.597f,35.1563f, +93.75f,38.8088f,35.1563f, +97.6563f,37.4254f,35.1563f, +101.563f,36.4869f,35.1563f, +105.469f,34.7975f,35.1563f, +109.375f,32.6051f,35.1563f, +113.281f,32.3929f,35.1563f, +117.188f,33.3906f,35.1563f, +121.094f,33.728f,35.1563f, +125.0f,33.8089f,35.1563f, +128.906f,35.2443f,35.1563f, +132.813f,35.9877f,35.1563f, +136.719f,36.3747f,35.1563f, +140.625f,37.6045f,35.1563f, +144.531f,38.3698f,35.1563f, +148.438f,39.393f,35.1563f, +152.344f,40.0115f,35.1563f, +156.25f,40.8722f,35.1563f, +160.156f,40.7302f,35.1563f, +164.063f,41.6767f,35.1563f, +167.969f,42.1719f,35.1563f, +171.875f,41.924f,35.1563f, +175.781f,40.9628f,35.1563f, +179.688f,39.3209f,35.1563f, +183.594f,37.9615f,35.1563f, +187.5f,37.2902f,35.1563f, +191.406f,36.1521f,35.1563f, +195.313f,35.5697f,35.1563f, +199.219f,35.0547f,35.1563f, +203.125f,33.8422f,35.1563f, +207.031f,33.1699f,35.1563f, +210.938f,32.4197f,35.1563f, +214.844f,31.0723f,35.1563f, +218.75f,29.1069f,35.1563f, +222.656f,26.4015f,35.1563f, +226.563f,23.6862f,35.1563f, +230.469f,22.3142f,35.1563f, +234.375f,20.9225f,35.1563f, +238.281f,18.6533f,35.1563f, +242.188f,16.5438f,35.1563f, +246.094f,14.5457f,35.1563f, +250.0f,13.5112f,35.1563f, +3.90625f,41.4381f,31.25f, +7.8125f,41.4661f,31.25f, +11.7188f,42.5211f,31.25f, +15.625f,44.1517f,31.25f, +19.5313f,45.8301f,31.25f, +23.4375f,47.3213f,31.25f, +27.3438f,49.1504f,31.25f, +31.25f,49.1313f,31.25f, +35.1563f,48.4621f,31.25f, +39.0625f,48.0866f,31.25f, +42.9688f,47.5259f,31.25f, +46.875f,48.2042f,31.25f, +50.7813f,48.2678f,31.25f, +54.6875f,48.6796f,31.25f, +58.5938f,49.1508f,31.25f, +62.5f,48.5261f,31.25f, +66.4063f,47.2699f,31.25f, +70.3125f,46.3239f,31.25f, +74.2188f,45.9053f,31.25f, +78.125f,45.2948f,31.25f, +82.0313f,45.1222f,31.25f, +85.9375f,44.1773f,31.25f, +89.8438f,42.0751f,31.25f, +93.75f,39.8181f,31.25f, +97.6563f,38.1904f,31.25f, +101.563f,36.9029f,31.25f, +105.469f,35.9897f,31.25f, +109.375f,34.1082f,31.25f, +113.281f,33.9882f,31.25f, +117.188f,33.4544f,31.25f, +121.094f,32.7435f,31.25f, +125.0f,32.2982f,31.25f, +128.906f,33.2893f,31.25f, +132.813f,34.4302f,31.25f, +136.719f,35.501f,31.25f, +140.625f,36.4162f,31.25f, +144.531f,38.0795f,31.25f, +148.438f,38.4184f,31.25f, +152.344f,38.1695f,31.25f, +156.25f,39.1334f,31.25f, +160.156f,39.8018f,31.25f, +164.063f,40.4009f,31.25f, +167.969f,40.6662f,31.25f, +171.875f,40.6389f,31.25f, +175.781f,40.0005f,31.25f, +179.688f,38.1437f,31.25f, +183.594f,36.1677f,31.25f, +187.5f,35.7553f,31.25f, +191.406f,35.2539f,31.25f, +195.313f,34.5258f,31.25f, +199.219f,33.9511f,31.25f, +203.125f,33.8209f,31.25f, +207.031f,32.5194f,31.25f, +210.938f,31.6797f,31.25f, +214.844f,30.494f,31.25f, +218.75f,28.9089f,31.25f, +222.656f,27.096f,31.25f, +226.563f,23.5752f,31.25f, +230.469f,22.5423f,31.25f, +234.375f,20.8438f,31.25f, +238.281f,18.7938f,31.25f, +242.188f,16.7022f,31.25f, +246.094f,14.6115f,31.25f, +250.0f,12.7758f,31.25f, +3.90625f,42.7334f,27.3437f, +7.8125f,43.3658f,27.3438f, +11.7188f,44.93f,27.3437f, +15.625f,46.7113f,27.3438f, +19.5313f,48.1031f,27.3437f, +23.4375f,48.7173f,27.3438f, +27.3438f,49.0875f,27.3437f, +31.25f,50.1272f,27.3438f, +35.1563f,49.1784f,27.3437f, +39.0625f,50.4569f,27.3438f, +42.9688f,49.7216f,27.3437f, +46.875f,49.0563f,27.3438f, +50.7813f,48.7494f,27.3437f, +54.6875f,49.0519f,27.3438f, +58.5938f,49.8264f,27.3437f, +62.5f,49.8194f,27.3438f, +66.4063f,48.9033f,27.3437f, +70.3125f,47.5002f,27.3438f, +74.2188f,46.7308f,27.3437f, +78.125f,45.8132f,27.3438f, +82.0313f,45.4303f,27.3437f, +85.9375f,44.4837f,27.3438f, +89.8438f,42.6706f,27.3437f, +93.75f,40.5108f,27.3438f, +97.6563f,38.4748f,27.3437f, +101.563f,38.2458f,27.3438f, +105.469f,37.8191f,27.3437f, +109.375f,37.5503f,27.3438f, +113.281f,36.4883f,27.3437f, +117.188f,35.7025f,27.3438f, +121.094f,34.3569f,27.3437f, +125.0f,34.052f,27.3438f, +128.906f,34.3166f,27.3437f, +132.813f,33.9873f,27.3438f, +136.719f,33.8326f,27.3437f, +140.625f,35.5138f,27.3438f, +144.531f,35.9847f,27.3437f, +148.438f,36.3159f,27.3438f, +152.344f,38.1026f,27.3437f, +156.25f,39.0191f,27.3438f, +160.156f,39.0705f,27.3437f, +164.063f,38.9644f,27.3438f, +167.969f,38.0972f,27.3437f, +171.875f,38.277f,27.3438f, +175.781f,37.5686f,27.3437f, +179.688f,35.9897f,27.3438f, +183.594f,34.1554f,27.3437f, +187.5f,33.9646f,27.3438f, +191.406f,33.9556f,27.3437f, +195.313f,33.7374f,27.3438f, +199.219f,33.3736f,27.3437f, +203.125f,32.1967f,27.3438f, +207.031f,32.2131f,27.3437f, +210.938f,30.4757f,27.3438f, +214.844f,29.0495f,27.3437f, +218.75f,27.539f,27.3438f, +222.656f,25.7435f,27.3437f, +226.563f,23.5358f,27.3438f, +230.469f,22.5305f,27.3437f, +234.375f,20.3466f,27.3438f, +238.281f,18.5956f,27.3438f, +242.188f,16.6554f,27.3438f, +246.094f,14.7633f,27.3438f, +250.0f,12.979f,27.3438f, +3.90625f,44.6783f,23.4375f, +7.8125f,46.1279f,23.4375f, +11.7188f,47.9921f,23.4375f, +15.625f,48.593f,23.4375f, +19.5313f,49.826f,23.4375f, +23.4375f,50.0111f,23.4375f, +27.3438f,49.773f,23.4375f, +31.25f,50.6443f,23.4375f, +35.1563f,50.242f,23.4375f, +39.0625f,51.5289f,23.4375f, +42.9688f,51.3905f,23.4375f, +46.875f,50.5543f,23.4375f, +50.7813f,49.96f,23.4375f, +54.6875f,51.029f,23.4375f, +58.5938f,50.4996f,23.4375f, +62.5f,50.0508f,23.4375f, +66.4063f,49.4463f,23.4375f, +70.3125f,48.7613f,23.4375f, +74.2188f,48.0188f,23.4375f, +78.125f,48.0992f,23.4375f, +82.0313f,47.1947f,23.4375f, +85.9375f,45.1889f,23.4375f, +89.8438f,43.9247f,23.4375f, +93.75f,41.7965f,23.4375f, +97.6563f,40.363f,23.4375f, +101.563f,40.3201f,23.4375f, +105.469f,39.2422f,23.4375f, +109.375f,38.6318f,23.4375f, +113.281f,37.9263f,23.4375f, +117.188f,37.113f,23.4375f, +121.094f,35.4884f,23.4375f, +125.0f,35.8385f,23.4375f, +128.906f,35.4941f,23.4375f, +132.813f,34.1911f,23.4375f, +136.719f,33.6791f,23.4375f, +140.625f,33.4506f,23.4375f, +144.531f,35.4822f,23.4375f, +148.438f,36.0187f,23.4375f, +152.344f,38.231f,23.4375f, +156.25f,39.1197f,23.4375f, +160.156f,38.9095f,23.4375f, +164.063f,38.1737f,23.4375f, +167.969f,36.7498f,23.4375f, +171.875f,36.6113f,23.4375f, +175.781f,35.5895f,23.4375f, +179.688f,34.7415f,23.4375f, +183.594f,32.6574f,23.4375f, +187.5f,32.5837f,23.4375f, +191.406f,32.5272f,23.4375f, +195.313f,32.3611f,23.4375f, +199.219f,31.4784f,23.4375f, +203.125f,30.8078f,23.4375f, +207.031f,29.9524f,23.4375f, +210.938f,29.9998f,23.4375f, +214.844f,28.4828f,23.4375f, +218.75f,26.6709f,23.4375f, +222.656f,24.9874f,23.4375f, +226.563f,23.0213f,23.4375f, +230.469f,21.3587f,23.4375f, +234.375f,19.0527f,23.4375f, +238.281f,18.1056f,23.4375f, +242.188f,16.7916f,23.4375f, +246.094f,14.9561f,23.4375f, +250.0f,13.0063f,23.4375f, +3.90625f,46.9055f,19.5312f, +7.8125f,48.3769f,19.5312f, +11.7188f,50.0613f,19.5312f, +15.625f,50.9962f,19.5312f, +19.5313f,51.161f,19.5312f, +23.4375f,51.7721f,19.5312f, +27.3438f,51.5823f,19.5312f, +31.25f,51.5274f,19.5312f, +35.1563f,51.5913f,19.5312f, +39.0625f,52.4399f,19.5312f, +42.9688f,52.5999f,19.5312f, +46.875f,51.9309f,19.5312f, +50.7813f,51.6062f,19.5312f, +54.6875f,50.86f,19.5312f, +58.5938f,51.1496f,19.5312f, +62.5f,50.1957f,19.5312f, +66.4063f,49.8047f,19.5312f, +70.3125f,49.1838f,19.5312f, +74.2188f,48.7276f,19.5312f, +78.125f,48.4967f,19.5312f, +82.0313f,47.4515f,19.5312f, +85.9375f,46.2594f,19.5312f, +89.8438f,44.6756f,19.5312f, +93.75f,43.0377f,19.5312f, +97.6563f,41.3508f,19.5312f, +101.563f,40.8261f,19.5312f, +105.469f,40.5524f,19.5312f, +109.375f,39.7289f,19.5312f, +113.281f,38.9437f,19.5312f, +117.188f,38.3781f,19.5312f, +121.094f,36.9618f,19.5312f, +125.0f,35.9735f,19.5312f, +128.906f,35.3887f,19.5312f, +132.813f,34.5133f,19.5312f, +136.719f,34.7253f,19.5312f, +140.625f,33.9228f,19.5312f, +144.531f,34.2826f,19.5312f, +148.438f,35.5643f,19.5312f, +152.344f,37.7492f,19.5312f, +156.25f,38.7871f,19.5312f, +160.156f,38.6036f,19.5312f, +164.063f,38.2702f,19.5312f, +167.969f,35.931f,19.5312f, +171.875f,34.8252f,19.5312f, +175.781f,33.99f,19.5312f, +179.688f,33.664f,19.5312f, +183.594f,31.6973f,19.5312f, +187.5f,31.3559f,19.5312f, +191.406f,31.3589f,19.5312f, +195.313f,30.7614f,19.5312f, +199.219f,29.2596f,19.5312f, +203.125f,28.7711f,19.5312f, +207.031f,27.9455f,19.5312f, +210.938f,28.3339f,19.5312f, +214.844f,28.3863f,19.5312f, +218.75f,27.4513f,19.5312f, +222.656f,25.0652f,19.5312f, +226.563f,23.2291f,19.5312f, +230.469f,20.8477f,19.5313f, +234.375f,19.424f,19.5313f, +238.281f,17.7051f,19.5313f, +242.188f,16.5977f,19.5313f, +246.094f,14.7851f,19.5313f, +250.0f,12.8344f,19.5313f, +3.90625f,49.2295f,15.625f, +7.8125f,50.0754f,15.625f, +11.7188f,51.5873f,15.625f, +15.625f,52.0525f,15.625f, +19.5313f,51.4269f,15.625f, +23.4375f,51.8405f,15.625f, +27.3438f,52.3327f,15.625f, +31.25f,53.011f,15.625f, +35.1563f,52.7359f,15.625f, +39.0625f,53.2852f,15.625f, +42.9688f,53.6617f,15.625f, +46.875f,52.4883f,15.625f, +50.7813f,51.9362f,15.625f, +54.6875f,50.8372f,15.625f, +58.5938f,50.1782f,15.625f, +62.5f,49.0401f,15.625f, +66.4063f,49.1011f,15.625f, +70.3125f,48.7903f,15.625f, +74.2188f,48.6124f,15.625f, +78.125f,48.1259f,15.625f, +82.0313f,47.7267f,15.625f, +85.9375f,46.9214f,15.625f, +89.8438f,45.0939f,15.625f, +93.75f,43.6563f,15.625f, +97.6563f,42.5709f,15.625f, +101.563f,41.9572f,15.625f, +105.469f,40.973f,15.625f, +109.375f,40.7682f,15.625f, +113.281f,39.3641f,15.625f, +117.188f,39.2768f,15.625f, +121.094f,37.5977f,15.625f, +125.0f,36.0608f,15.625f, +128.906f,36.045f,15.625f, +132.813f,35.1379f,15.625f, +136.719f,34.9875f,15.625f, +140.625f,34.0482f,15.625f, +144.531f,33.8104f,15.625f, +148.438f,34.9994f,15.625f, +152.344f,36.2664f,15.625f, +156.25f,37.7694f,15.625f, +160.156f,37.6584f,15.625f, +164.063f,36.9226f,15.625f, +167.969f,34.7519f,15.625f, +171.875f,33.2827f,15.625f, +175.781f,32.8949f,15.625f, +179.688f,32.1339f,15.625f, +183.594f,30.407f,15.625f, +187.5f,28.996f,15.625f, +191.406f,29.3357f,15.625f, +195.313f,29.1098f,15.625f, +199.219f,27.8354f,15.625f, +203.125f,26.4739f,15.625f, +207.031f,26.1829f,15.625f, +210.938f,27.387f,15.625f, +214.844f,27.4944f,15.625f, +218.75f,26.4893f,15.625f, +222.656f,24.7764f,15.625f, +226.563f,22.9689f,15.625f, +230.469f,20.4237f,15.625f, +234.375f,18.8049f,15.625f, +238.281f,17.4547f,15.625f, +242.188f,16.2758f,15.625f, +246.094f,14.2192f,15.625f, +250.0f,11.8103f,15.625f, +3.90625f,51.1233f,11.7187f, +7.8125f,51.8127f,11.7187f, +11.7188f,52.0971f,11.7187f, +15.625f,51.8317f,11.7187f, +19.5313f,52.1213f,11.7187f, +23.4375f,51.7889f,11.7187f, +27.3438f,52.2065f,11.7187f, +31.25f,52.438f,11.7187f, +35.1563f,52.6021f,11.7187f, +39.0625f,53.2864f,11.7187f, +42.9688f,52.8882f,11.7187f, +46.875f,52.6009f,11.7187f, +50.7813f,52.8442f,11.7187f, +54.6875f,52.6512f,11.7187f, +58.5938f,51.6436f,11.7187f, +62.5f,50.4271f,11.7187f, +66.4063f,49.3264f,11.7187f, +70.3125f,48.6522f,11.7187f, +74.2188f,49.5854f,11.7187f, +78.125f,50.3492f,11.7187f, +82.0313f,49.035f,11.7187f, +85.9375f,47.6474f,11.7187f, +89.8438f,46.0472f,11.7187f, +93.75f,44.7337f,11.7187f, +97.6563f,44.3349f,11.7187f, +101.563f,43.475f,11.7187f, +105.469f,42.9461f,11.7187f, +109.375f,41.7731f,11.7187f, +113.281f,40.717f,11.7187f, +117.188f,39.399f,11.7187f, +121.094f,38.1327f,11.7187f, +125.0f,36.3286f,11.7187f, +128.906f,36.2512f,11.7187f, +132.813f,35.1997f,11.7187f, +136.719f,33.9406f,11.7187f, +140.625f,33.3109f,11.7187f, +144.531f,33.8153f,11.7187f, +148.438f,33.6823f,11.7187f, +152.344f,34.7077f,11.7187f, +156.25f,35.4472f,11.7187f, +160.156f,35.6332f,11.7187f, +164.063f,34.3651f,11.7187f, +167.969f,32.9876f,11.7187f, +171.875f,32.2858f,11.7187f, +175.781f,32.1374f,11.7187f, +179.688f,30.9575f,11.7187f, +183.594f,29.1111f,11.7187f, +187.5f,28.149f,11.7187f, +191.406f,27.4443f,11.7187f, +195.313f,27.3781f,11.7187f, +199.219f,26.4413f,11.7187f, +203.125f,24.9734f,11.7187f, +207.031f,25.0959f,11.7187f, +210.938f,26.2472f,11.7187f, +214.844f,26.1569f,11.7187f, +218.75f,24.8556f,11.7187f, +222.656f,22.8797f,11.7187f, +226.563f,21.8102f,11.7187f, +230.469f,19.294f,11.7187f, +234.375f,17.5291f,11.7187f, +238.281f,16.242f,11.7187f, +242.188f,15.2738f,11.7187f, +246.094f,13.8715f,11.7187f, +250.0f,12.3043f,11.7187f, +3.90625f,52.2527f,7.8125f, +7.8125f,52.7759f,7.8125f, +11.7188f,52.1635f,7.8125f, +15.625f,52.2016f,7.8125f, +19.5313f,51.9832f,7.8125f, +23.4375f,51.4669f,7.8125f, +27.3438f,51.0033f,7.8125f, +31.25f,50.7124f,7.8125f, +35.1563f,51.6427f,7.8125f, +39.0625f,52.5008f,7.8125f, +42.9688f,53.2834f,7.8125f, +46.875f,52.5339f,7.8125f, +50.7813f,52.627f,7.8125f, +54.6875f,52.9017f,7.8125f, +58.5938f,52.8616f,7.8125f, +62.5f,51.7566f,7.8125f, +66.4063f,51.3268f,7.8125f, +70.3125f,50.6108f,7.8125f, +74.2188f,50.9277f,7.8125f, +78.125f,51.701f,7.8125f, +82.0313f,50.5549f,7.8125f, +85.9375f,48.4345f,7.8125f, +89.8438f,47.3592f,7.8125f, +93.75f,45.7216f,7.8125f, +97.6563f,45.75f,7.8125f, +101.563f,44.4249f,7.8125f, +105.469f,44.7192f,7.8125f, +109.375f,44.4938f,7.8125f, +113.281f,43.252f,7.8125f, +117.188f,41.3735f,7.8125f, +121.094f,39.8664f,7.8125f, +125.0f,37.025f,7.8125f, +128.906f,36.5094f,7.8125f, +132.813f,35.3554f,7.8125f, +136.719f,33.9389f,7.8125f, +140.625f,32.7715f,7.8125f, +144.531f,32.8295f,7.8125f, +148.438f,32.4513f,7.8125f, +152.344f,33.4598f,7.8125f, +156.25f,34.3434f,7.8125f, +160.156f,34.8633f,7.8125f, +164.063f,33.7043f,7.8125f, +167.969f,32.5629f,7.8125f, +171.875f,31.5117f,7.8125f, +175.781f,30.9816f,7.8125f, +179.688f,30.2039f,7.8125f, +183.594f,28.5054f,7.8125f, +187.5f,26.8519f,7.8125f, +191.406f,25.6078f,7.8125f, +195.313f,26.0906f,7.8125f, +199.219f,25.313f,7.8125f, +203.125f,24.0014f,7.8125f, +207.031f,24.066f,7.8125f, +210.938f,24.4935f,7.8125f, +214.844f,24.3803f,7.8125f, +218.75f,23.0075f,7.8125f, +222.656f,21.1023f,7.8125f, +226.563f,19.0418f,7.8125f, +230.469f,17.9588f,7.8125f, +234.375f,16.5211f,7.8125f, +238.281f,15.4949f,7.8125f, +242.188f,14.0938f,7.8125f, +246.094f,13.3141f,7.8125f, +250.0f,12.9595f,7.8125f, +3.90625f,52.6186f,3.90625f, +7.8125f,51.8648f,3.90625f, +11.7188f,51.1949f,3.90625f, +15.625f,50.2102f,3.90625f, +19.5313f,50.6058f,3.90625f, +23.4375f,50.7008f,3.90625f, +27.3438f,51.2163f,3.90625f, +31.25f,51.4263f,3.90625f, +35.1563f,52.1968f,3.90625f, +39.0625f,53.9783f,3.90625f, +42.9688f,53.8927f,3.90625f, +46.875f,53.3266f,3.90625f, +50.7813f,53.5901f,3.90625f, +54.6875f,55.5679f,3.90625f, +58.5938f,55.1819f,3.90625f, +62.5f,53.6891f,3.90625f, +66.4063f,53.0541f,3.90625f, +70.3125f,51.6665f,3.90625f, +74.2188f,51.4469f,3.90625f, +78.125f,51.9591f,3.90625f, +82.0313f,51.0418f,3.90625f, +85.9375f,49.7513f,3.90625f, +89.8438f,48.7329f,3.90625f, +93.75f,46.8713f,3.90625f, +97.6563f,46.3905f,3.90625f, +101.563f,45.4241f,3.90625f, +105.469f,45.6811f,3.90625f, +109.375f,45.3238f,3.90625f, +113.281f,43.6112f,3.90625f, +117.188f,42.1291f,3.90625f, +121.094f,40.4747f,3.90625f, +125.0f,39.3351f,3.90625f, +128.906f,38.0742f,3.90625f, +132.813f,36.7758f,3.90625f, +136.719f,34.9213f,3.90625f, +140.625f,32.3643f,3.90625f, +144.531f,31.7157f,3.90625f, +148.438f,30.6005f,3.90625f, +152.344f,31.6034f,3.90625f, +156.25f,32.6503f,3.90625f, +160.156f,33.3131f,3.90625f, +164.063f,32.5745f,3.90625f, +167.969f,31.5017f,3.90625f, +171.875f,30.6842f,3.90625f, +175.781f,29.8734f,3.90625f, +179.688f,28.6537f,3.90625f, +183.594f,27.2073f,3.90625f, +187.5f,25.4367f,3.90625f, +191.406f,24.1609f,3.90625f, +195.313f,23.9724f,3.90625f, +199.219f,23.7702f,3.90625f, +203.125f,22.4031f,3.90625f, +207.031f,22.1587f,3.90625f, +210.938f,21.6154f,3.90625f, +214.844f,21.8202f,3.90625f, +218.75f,21.017f,3.90625f, +222.656f,19.3736f,3.90625f, +226.563f,18.2127f,3.90625f, +230.469f,17.2263f,3.90625f, +234.375f,16.2938f,3.90625f, +238.281f,14.4518f,3.90625f, +242.188f,13.6398f,3.90625f, +246.094f,13.2404f,3.90625f, +250.0f,12.7102f,3.90625f, +}; + +btScalar Landscape04Nml[] = { +-0.350125f,0.914758f,-0.201568f, +-0.310159f,0.930741f,-0.193707f, +-0.297809f,0.93918f,-0.171025f, +-0.203808f,0.975413f,-0.083855f, +-0.227869f,0.971729f,-0.0617958f, +-0.175976f,0.984209f,0.0190985f, +-0.113434f,0.992992f,-0.0331636f, +-0.10748f,0.994138f,-0.0117748f, +0.264437f,0.964372f,0.00769155f, +0.281666f,0.958691f,0.0397075f, +0.430486f,0.901936f,-0.0345351f, +0.401178f,0.915992f,-0.00383073f, +0.323069f,0.944057f,-0.0662002f, +0.321744f,0.945983f,-0.039967f, +0.269775f,0.962292f,-0.0348534f, +0.20193f,0.970428f,-0.132266f, +0.268889f,0.954681f,-0.127604f, +0.194635f,0.954618f,-0.225435f, +0.221506f,0.956393f,-0.190387f, +0.193103f,0.932235f,-0.306022f, +0.127904f,0.985279f,-0.113427f, +0.190082f,0.941797f,-0.277285f, +-0.00897869f,0.999816f,0.0169309f, +0.104995f,0.98929f,-0.101393f, +-0.0904331f,0.992726f,0.0794834f, +0.0230108f,0.991613f,0.127174f, +0.0155488f,0.993572f,0.11213f, +0.0288983f,0.981821f,0.187597f, +0.0247864f,0.996149f,0.0840949f, +-0.0831472f,0.996537f,0.000391199f, +-0.0501709f,0.99867f,0.0118531f, +-0.153f,0.976743f,-0.15021f, +-0.106591f,0.988499f,-0.107277f, +-0.178503f,0.946807f,-0.267757f, +-0.0254657f,0.984638f,-0.172739f, +-0.00387521f,0.963955f,-0.266035f, +-0.0158619f,0.994497f,-0.103554f, +0.0516719f,0.979433f,-0.195043f, +-0.113536f,0.993496f,-0.00869834f, +-0.0532458f,0.993386f,-0.101726f, +-0.240923f,0.970479f,0.0112676f, +-0.272825f,0.959264f,-0.0733371f, +-0.364171f,0.921854f,-0.132533f, +-0.38043f,0.901643f,-0.205699f, +-0.208475f,0.967633f,-0.142215f, +-0.200209f,0.964847f,-0.170257f, +-0.436593f,0.880066f,-0.186734f, +-0.420663f,0.90307f,-0.0866427f, +-0.564169f,0.813693f,-0.140058f, +-0.556718f,0.83037f,-0.0234562f, +-0.419122f,0.896066f,-0.146295f, +-0.466908f,0.873897f,-0.135282f, +-0.39151f,0.89596f,-0.209704f, +-0.388383f,0.911455f,-0.135677f, +-0.356022f,0.918213f,-0.173589f, +-0.334437f,0.939184f,-0.0780065f, +-0.257665f,0.953587f,-0.155824f, +-0.309301f,0.93272f,-0.185382f, +-0.315034f,0.931862f,-0.179961f, +-0.295926f,0.931298f,-0.212393f, +-0.436779f,0.896592f,-0.0731173f, +-0.317368f,0.948237f,0.0111289f, +-0.503169f,0.863334f,0.0383931f, +-0.468116f,0.877337f,0.105583f, +-0.41232f,0.911034f,0.00307775f, +-0.465256f,0.885053f,0.0147642f, +-0.139311f,0.987488f,-0.0738976f, +-0.20689f,0.974976f,-0.0813499f, +-0.0453849f,0.98457f,-0.169006f, +-0.109269f,0.973649f,-0.20017f, +0.0405907f,0.980595f,-0.191794f, +0.0742781f,0.990348f,-0.117022f, +-0.00934593f,0.982385f,-0.186633f, +0.00811898f,0.984163f,-0.177079f, +-0.0726933f,0.996391f,-0.043832f, +0.0160265f,0.999861f,-0.00453309f, +-0.163053f,0.986585f,0.00801872f, +-0.185529f,0.978031f,-0.0950467f, +-0.137829f,0.987875f,0.0714611f, +-0.0578854f,0.998186f,0.0165557f, +0.148249f,0.976119f,0.158788f, +0.193139f,0.975453f,0.10578f, +0.369772f,0.912299f,0.176006f, +0.348645f,0.936628f,0.0342667f, +0.282769f,0.952501f,0.113063f, +0.239504f,0.96906f,-0.059674f, +0.137712f,0.990197f,0.0233582f, +0.149987f,0.988306f,0.0274647f, +0.169834f,0.984573f,-0.0420991f, +0.0927723f,0.990592f,-0.100603f, +0.171676f,0.97845f,-0.114732f, +0.0567364f,0.963622f,-0.261179f, +0.117062f,0.969073f,-0.217242f, +0.0434058f,0.931949f,-0.359981f, +0.148347f,0.946865f,-0.285375f, +0.103327f,0.903437f,-0.416082f, +0.28421f,0.914779f,-0.287061f, +0.391793f,0.893555f,-0.21922f, +0.419866f,0.888994f,-0.182764f, +0.461528f,0.873246f,-0.156313f, +0.483081f,0.869853f,-0.099941f, +0.503438f,0.857022f,-0.109831f, +0.46584f,0.882166f,-0.0691099f, +0.489623f,0.868073f,-0.0819641f, +0.410796f,0.910896f,-0.0389227f, +0.393119f,0.918063f,-0.0511611f, +0.359627f,0.921042f,-0.1495f, +0.306646f,0.942147f,-0.135377f, +0.381773f,0.903228f,-0.196033f, +0.360002f,0.920948f,-0.149176f, +0.203221f,0.945872f,-0.253037f, +0.218471f,0.943498f,-0.249162f, +0.0567054f,0.995659f,-0.0738017f, +0.229305f,0.968679f,0.0952866f, +-0.0263963f,0.99794f,0.0584726f, +-0.0422212f,0.996107f,0.0773806f, +0.0415928f,0.997459f,0.0578396f, +0.0625406f,0.995706f,0.0682456f, +0.174866f,0.970931f,0.163448f, +0.248971f,0.959664f,0.13061f, +0.296526f,0.91909f,0.259511f, +0.244457f,0.962524f,0.117427f, +0.144028f,0.988219f,0.0517682f, +0.0516566f,0.998622f,-0.00921711f, +-0.0100473f,0.999479f,-0.0306849f, +0.144821f,0.968281f,0.203614f, +0.0927686f,0.985877f,0.139429f, +0.159268f,0.950036f,0.268448f, +-0.238265f,0.969366f,-0.0596594f, +-0.317162f,0.937667f,-0.14209f, +-0.252226f,0.956124f,-0.149026f, +-0.139275f,0.959516f,-0.244809f, +0.225678f,0.948782f,-0.221092f, +0.454598f,0.876109f,-0.160545f, +0.280777f,0.950726f,-0.131467f, +0.235562f,0.968875f,-0.076101f, +0.32523f,0.943278f,-0.0667146f, +0.204883f,0.977104f,-0.0573623f, +-0.016814f,0.999658f,-0.0200258f, +-0.0821474f,0.994185f,0.0696248f, +-0.0248008f,0.998098f,0.0564331f, +0.000698274f,0.999817f,0.0191283f, +0.0007523f,0.989994f,0.141106f, +-0.0137951f,0.98192f,0.188792f, +-0.00956379f,0.990301f,0.138609f, +-0.0156365f,0.996604f,0.0808513f, +-0.104293f,0.986463f,0.126542f, +-0.156424f,0.969975f,0.186228f, +-0.167617f,0.975111f,0.145129f, +-0.261339f,0.965118f,0.0157997f, +-0.160877f,0.9832f,-0.0862302f, +-0.296054f,0.934306f,-0.198555f, +-0.550185f,0.752769f,-0.361436f, +-0.408582f,0.840233f,-0.356467f, +-0.339245f,0.876729f,-0.340968f, +-0.402741f,0.85772f,-0.319556f, +-0.316164f,0.924069f,-0.214795f, +-0.348907f,0.927941f,-0.131109f, +-0.48502f,0.870548f,-0.0830789f, +-0.53006f,0.843646f,-0.085433f, +-0.352226f,0.931519f,-0.0906107f, +-0.0975811f,0.982258f,-0.160146f, +0.0477418f,0.981235f,-0.186812f, +0.0219054f,0.966987f,-0.253882f, +-0.115057f,0.988784f,-0.0952266f, +-0.238673f,0.960258f,0.144707f, +-0.213447f,0.931011f,0.296071f, +-0.201955f,0.923284f,0.326742f, +0.101325f,0.921693f,0.374453f, +0.294403f,0.882174f,0.367555f, +0.373397f,0.835094f,0.403971f, +0.278351f,0.921647f,0.270347f, +0.215461f,0.962466f,0.16503f, +0.225302f,0.965479f,0.13073f, +0.175997f,0.983214f,0.0481225f, +0.220124f,0.97536f,0.0147531f, +0.32343f,0.94566f,-0.0334783f, +0.369971f,0.927728f,-0.0494253f, +0.427777f,0.903113f,-0.037328f, +0.446874f,0.894597f,9.72625e-005f, +0.445338f,0.895316f,-0.00910111f, +0.463955f,0.88101f,-0.0925573f, +0.398143f,0.905258f,-0.148289f, +0.190091f,0.969836f,-0.152589f, +-0.0830374f,0.980972f,-0.175495f, +-0.1343f,0.985908f,-0.0997463f, +-0.00843053f,0.999434f,0.0325608f, +0.021819f,0.995847f,0.0883913f, +0.206682f,0.96009f,0.188439f, +0.388829f,0.882727f,0.263827f, +0.0707915f,0.996578f,0.0426701f, +-0.161491f,0.983232f,-0.0847068f, +-0.0785342f,0.996721f,-0.0194704f, +-0.224473f,0.966422f,-0.125062f, +-0.159666f,0.968511f,-0.191032f, +0.0318558f,0.951557f,-0.305817f, +0.187349f,0.896729f,-0.400972f, +0.324927f,0.900628f,-0.288602f, +0.217775f,0.961772f,-0.16604f, +0.20019f,0.973241f,-0.112807f, +0.277242f,0.959937f,-0.0407145f, +0.14204f,0.987332f,0.0707153f, +-0.0153938f,0.984428f,0.175114f, +-0.0735255f,0.984081f,0.161796f, +-0.0237909f,0.990594f,0.134749f, +-0.0614906f,0.985818f,0.156146f, +-0.143236f,0.970943f,0.191711f, +-0.0137498f,0.973243f,0.229369f, +0.0567477f,0.984597f,0.165372f, +-0.0347212f,0.993259f,0.110594f, +-0.143386f,0.976741f,0.159429f, +-0.139502f,0.982211f,0.125705f, +-0.0993842f,0.989216f,0.107588f, +-0.136731f,0.987843f,0.0739654f, +-0.0893069f,0.995969f,0.00840628f, +-0.123862f,0.992294f,-0.00315825f, +-0.391175f,0.886683f,-0.246529f, +-0.44403f,0.793263f,-0.41662f, +-0.399761f,0.83626f,-0.375315f, +-0.422675f,0.841058f,-0.33759f, +-0.445112f,0.835127f,-0.323168f, +-0.410733f,0.898417f,-0.155389f, +-0.485628f,0.867891f,-0.104549f, +-0.491383f,0.859111f,-0.143077f, +-0.358033f,0.910383f,-0.207399f, +-0.0910122f,0.986127f,-0.138818f, +0.0820594f,0.995842f,-0.039567f, +-0.0287013f,0.999312f,-0.0234726f, +-0.346268f,0.933835f,0.0897299f, +-0.471073f,0.825151f,0.311795f, +-0.27505f,0.819541f,0.502693f, +-0.154238f,0.84574f,0.510818f, +0.0836929f,0.869512f,0.48677f, +0.266688f,0.84547f,0.462663f, +0.365749f,0.809921f,0.458537f, +0.371864f,0.832105f,0.411483f, +0.260242f,0.895369f,0.361371f, +0.283389f,0.903576f,0.321311f, +0.269874f,0.934168f,0.233448f, +0.265321f,0.957928f,0.10945f, +0.333071f,0.942841f,0.0106961f, +0.387903f,0.9217f,0.000193271f, +0.435792f,0.899834f,0.0195967f, +0.454676f,0.88982f,0.0386129f, +0.482276f,0.876019f,-0.000723308f, +0.505259f,0.860654f,-0.0631586f, +0.398328f,0.910448f,-0.111444f, +0.21929f,0.970647f,-0.0987756f, +0.0111053f,0.988208f,-0.152714f, +-0.210805f,0.943357f,-0.256201f, +-0.146846f,0.978658f,-0.143755f, +0.0139602f,0.999731f,-0.0184963f, +0.133096f,0.990721f,-0.0275154f, +0.2933f,0.953875f,0.0640122f, +0.228393f,0.945969f,0.230173f, +0.0546169f,0.969859f,0.237467f, +-0.0762534f,0.988779f,-0.128459f, +-0.106647f,0.982213f,-0.154543f, +-0.122396f,0.949634f,-0.28847f, +0.0920652f,0.954226f,-0.284566f, +0.185259f,0.946785f,-0.263206f, +0.232314f,0.960849f,-0.150996f, +0.169992f,0.979263f,-0.110207f, +0.125326f,0.980516f,-0.151267f, +0.149673f,0.98818f,-0.0331477f, +0.0238199f,0.989878f,0.139909f, +-0.107594f,0.981438f,0.158754f, +-0.0846643f,0.982313f,0.167013f, +-0.0375415f,0.970751f,0.237134f, +-0.0510768f,0.964816f,0.257917f, +-0.0443365f,0.980593f,0.190977f, +0.00242513f,0.997744f,0.0670872f, +0.124335f,0.983389f,0.132238f, +-0.00301992f,0.993206f,0.116332f, +-0.125192f,0.990103f,0.0634287f, +-0.100487f,0.994519f,-0.0288746f, +-0.101663f,0.992712f,-0.0647098f, +-0.139647f,0.987963f,-0.0665471f, +-0.130136f,0.990189f,-0.0508981f, +-0.0756901f,0.997123f,-0.00415316f, +-0.171558f,0.977059f,-0.126185f, +-0.351855f,0.892529f,-0.282117f, +-0.447333f,0.817645f,-0.362422f, +-0.423851f,0.857249f,-0.29236f, +-0.448058f,0.866215f,-0.221171f, +-0.531086f,0.820738f,-0.210565f, +-0.511898f,0.851158f,-0.116153f, +-0.425868f,0.900461f,-0.0883553f, +-0.399025f,0.900598f,-0.172345f, +-0.24223f,0.968919f,-0.0502012f, +-0.0663613f,0.996507f,0.0506899f, +-0.138021f,0.972657f,0.186782f, +-0.4139f,0.851097f,0.322987f, +-0.550512f,0.782849f,0.289973f, +-0.380287f,0.863038f,0.332486f, +-0.131533f,0.903571f,0.407748f, +0.119586f,0.9109f,0.394918f, +0.299052f,0.87558f,0.379379f, +0.370047f,0.8611f,0.348671f, +0.442832f,0.822723f,0.356408f, +0.35885f,0.890772f,0.278839f, +0.314791f,0.940053f,0.131179f, +0.339464f,0.925728f,0.166711f, +0.403599f,0.900778f,0.160334f, +0.45653f,0.889636f,-0.0113152f, +0.365242f,0.916509f,-0.163124f, +0.379822f,0.91652f,-0.125407f, +0.442125f,0.891797f,-0.096041f, +0.493888f,0.864551f,-0.0928755f, +0.541781f,0.83947f,-0.041994f, +0.441424f,0.894377f,-0.0723577f, +0.226514f,0.958331f,-0.174048f, +0.0664964f,0.969681f,-0.235153f, +-0.103823f,0.949537f,-0.295973f, +-0.233692f,0.889012f,-0.39376f, +-0.0987171f,0.939339f,-0.328477f, +0.103986f,0.972613f,-0.207871f, +0.198802f,0.974287f,-0.106033f, +0.0601774f,0.998175f,0.00500958f, +-0.0421158f,0.995212f,0.0882012f, +-0.0598721f,0.997785f,-0.0289851f, +-0.030607f,0.999125f,-0.0285146f, +-0.00697633f,0.993471f,-0.113875f, +0.0388611f,0.980882f,-0.190686f, +0.0977483f,0.98843f,-0.115983f, +0.15403f,0.986798f,-0.0500538f, +0.193054f,0.979913f,-0.0500083f, +0.157678f,0.98694f,-0.0329733f, +-0.0158549f,0.999428f,0.0298765f, +-0.0525571f,0.987534f,0.14837f, +0.000720533f,0.997813f,0.0660913f, +-0.102677f,0.99254f,-0.0657426f, +-0.099341f,0.994285f,-0.0391091f, +-0.0676495f,0.996952f,-0.0388727f, +0.0225146f,0.999293f,0.0301014f, +0.0577235f,0.997453f,0.0418936f, +-0.0269869f,0.999243f,0.0280361f, +0.00446401f,0.985157f,0.171599f, +-0.0141502f,0.990326f,0.138035f, +-0.00518586f,0.999975f,0.00477817f, +-0.0328139f,0.995381f,-0.09022f, +-0.128063f,0.971338f,-0.200254f, +-0.151852f,0.967914f,-0.200209f, +-0.0720493f,0.989055f,-0.128759f, +-0.0591129f,0.991504f,-0.115868f, +-0.248059f,0.943661f,-0.219024f, +-0.389946f,0.877483f,-0.279225f, +-0.523332f,0.810744f,-0.262332f, +-0.51839f,0.842544f,-0.146256f, +-0.550368f,0.815716f,-0.178051f, +-0.560732f,0.813038f,-0.156683f, +-0.427123f,0.899415f,-0.0928351f, +-0.366593f,0.924495f,-0.104494f, +-0.322547f,0.93696f,-0.134426f, +-0.128035f,0.99042f,-0.0517317f, +-0.291376f,0.953688f,0.0746902f, +-0.520094f,0.826135f,0.216802f, +-0.516864f,0.826474f,0.22314f, +-0.396988f,0.892552f,0.213897f, +-0.184148f,0.954818f,0.233263f, +0.0957205f,0.95579f,0.278034f, +0.314018f,0.892294f,0.32435f, +0.401668f,0.873128f,0.276243f, +0.463054f,0.857596f,0.223851f, +0.480022f,0.855973f,0.192066f, +0.375927f,0.916106f,0.13939f, +0.288789f,0.941864f,0.171735f, +0.396643f,0.909563f,0.123974f, +0.561623f,0.825897f,0.0497286f, +0.465605f,0.881752f,-0.0756653f, +0.370044f,0.915005f,-0.160728f, +0.427822f,0.898624f,-0.0971747f, +0.465206f,0.885137f,-0.0107503f, +0.468824f,0.88183f,0.0507874f, +0.478143f,0.868746f,0.12907f, +0.351411f,0.934208f,0.0613665f, +0.140442f,0.98844f,-0.0571117f, +-0.0122878f,0.991421f,-0.130131f, +-0.117862f,0.972142f,-0.202603f, +-0.15815f,0.947613f,-0.27752f, +-0.0729629f,0.95654f,-0.282325f, +0.0272484f,0.989771f,-0.14004f, +-0.0137333f,0.999563f,0.0261849f, +-0.0985129f,0.993299f,0.0604412f, +-0.135233f,0.990548f,-0.0229695f, +-0.0373153f,0.999264f,0.00888433f, +0.0352261f,0.99933f,0.00994916f, +0.061219f,0.99588f,0.0668911f, +0.0815695f,0.99444f,0.0665983f, +0.144386f,0.989424f,0.0139045f, +0.184662f,0.980318f,0.0698361f, +0.0224217f,0.989677f,0.14155f, +-0.0794321f,0.954058f,0.288901f, +-0.0304562f,0.959461f,0.280192f, +0.112423f,0.968918f,0.220359f, +0.0390938f,0.993037f,0.111126f, +-0.0885962f,0.9933f,-0.0741985f, +-0.0453085f,0.996418f,-0.0714089f, +-0.123875f,0.985221f,-0.118298f, +0.00670832f,0.999925f,0.010273f, +-0.0146906f,0.998569f,0.0514303f, +-0.0998092f,0.992773f,0.0666264f, +0.0466126f,0.990197f,0.131669f, +0.103009f,0.992862f,0.0601126f, +0.113553f,0.993084f,-0.0298385f, +-0.0128779f,0.975704f,-0.218713f, +-0.177855f,0.94662f,-0.268846f, +-0.191482f,0.955424f,-0.224722f, +-0.0532043f,0.987628f,-0.147512f, +-0.140744f,0.970833f,-0.194099f, +-0.387395f,0.889373f,-0.242778f, +-0.531553f,0.818908f,-0.216427f, +-0.531571f,0.799354f,-0.280115f, +-0.51407f,0.81292f,-0.273666f, +-0.549112f,0.793924f,-0.261078f, +-0.484709f,0.822384f,-0.297895f, +-0.322663f,0.926066f,-0.195678f, +-0.315438f,0.927311f,-0.201479f, +-0.289702f,0.947148f,-0.13778f, +-0.417457f,0.908684f,-0.00477603f, +-0.584599f,0.810188f,0.0428868f, +-0.55194f,0.828316f,0.0962071f, +-0.397599f,0.904432f,0.154656f, +-0.183216f,0.971572f,0.149931f, +0.0355131f,0.990243f,0.134751f, +0.298837f,0.942288f,0.150964f, +0.413659f,0.900634f,0.133206f, +0.498073f,0.828388f,0.256313f, +0.444018f,0.853405f,0.273035f, +0.327561f,0.881897f,0.339061f, +0.313826f,0.898686f,0.306392f, +0.495157f,0.851292f,0.173556f, +0.614747f,0.78345f,0.0910662f, +0.55187f,0.833866f,0.0103585f, +0.367713f,0.926545f,-0.0793776f, +0.311567f,0.950223f,0.00108255f, +0.382947f,0.917094f,0.110859f, +0.410945f,0.895808f,0.169272f, +0.455231f,0.858878f,0.234721f, +0.373673f,0.896264f,0.238911f, +0.246571f,0.935158f,0.254328f, +0.0808975f,0.990111f,0.114608f, +-0.0843211f,0.99633f,-0.0147289f, +-0.0859474f,0.994869f,-0.0533687f, +-0.0567528f,0.986639f,-0.152718f, +-0.104487f,0.984189f,-0.143019f, +-0.139027f,0.990289f,8.5057e-005f, +-0.137547f,0.987918f,0.0714029f, +-0.144256f,0.989201f,-0.0259182f, +-0.026694f,0.998838f,-0.0401331f, +-0.0313342f,0.99664f,-0.0756769f, +-0.0574884f,0.99781f,0.0327011f, +0.145005f,0.983413f,0.108961f, +0.119257f,0.992151f,0.0376122f, +0.0587452f,0.978725f,0.196585f, +-0.0803833f,0.947865f,0.308369f, +-0.127827f,0.919581f,0.371526f, +-0.00616421f,0.930831f,0.365399f, +0.107639f,0.912609f,0.394409f, +0.210572f,0.88729f,0.410336f, +0.0740329f,0.980065f,0.184368f, +-0.0250926f,0.999613f,0.0120275f, +-0.0610433f,0.996433f,-0.05826f, +-0.0708404f,0.994984f,-0.0706271f, +-0.0640037f,0.997923f,-0.00726403f, +-0.0949547f,0.99548f,0.00148231f, +0.00929451f,0.997943f,-0.0634315f, +0.147986f,0.988795f,-0.0195964f, +0.19874f,0.98001f,-0.00909425f, +0.119683f,0.99247f,-0.0260466f, +-0.140841f,0.984951f,-0.10018f, +-0.197496f,0.959342f,-0.201637f, +-0.0821482f,0.973605f,-0.212945f, +-0.090387f,0.978841f,-0.18358f, +-0.34459f,0.903344f,-0.255395f, +-0.465169f,0.833236f,-0.29889f, +-0.493353f,0.789348f,-0.365421f, +-0.529455f,0.773394f,-0.348624f, +-0.541108f,0.776645f,-0.322528f, +-0.503238f,0.814279f,-0.289312f, +-0.451111f,0.869282f,-0.202106f, +-0.405307f,0.906179f,-0.120689f, +-0.367499f,0.92846f,-0.0539062f, +-0.448648f,0.893437f,-0.0220131f, +-0.582415f,0.811815f,-0.0418214f, +-0.587857f,0.805915f,-0.0701802f, +-0.440963f,0.897524f,0.00144435f, +-0.150082f,0.985674f,0.0769547f, +0.0512849f,0.998035f,0.0359923f, +0.331471f,0.9412f,0.0653422f, +0.327057f,0.943418f,0.0547333f, +0.325027f,0.917755f,0.228216f, +0.374201f,0.856118f,0.35642f, +0.374565f,0.858588f,0.350039f, +0.460817f,0.854058f,0.241312f, +0.556465f,0.823608f,0.109619f, +0.63153f,0.770458f,0.0869767f, +0.587056f,0.806123f,0.074369f, +0.365958f,0.924908f,0.10305f, +0.26636f,0.954918f,0.131089f, +0.330741f,0.937061f,0.111923f, +0.358992f,0.918233f,0.167249f, +0.397317f,0.888574f,0.229294f, +0.378918f,0.890078f,0.253343f, +0.252398f,0.944302f,0.211161f, +0.242388f,0.947895f,0.206744f, +0.0865865f,0.99456f,0.0579091f, +-0.0181168f,0.990006f,-0.139854f, +0.0162661f,0.98021f,-0.197289f, +-0.148111f,0.960303f,-0.236394f, +-0.255052f,0.949006f,-0.185302f, +-0.211751f,0.971559f,-0.105997f, +-0.0120621f,0.994912f,-0.100021f, +-0.015173f,0.98959f,-0.143115f, +-0.0401151f,0.99847f,-0.0380528f, +-0.0979763f,0.995187f,0.00194195f, +0.0571375f,0.998251f,0.0151643f, +0.0776787f,0.976915f,0.199006f, +-0.101892f,0.95655f,0.273185f, +-0.133768f,0.938598f,0.318024f, +-0.177801f,0.93623f,0.303084f, +-0.022321f,0.922329f,0.385761f, +0.0333931f,0.905943f,0.422081f, +0.163361f,0.862964f,0.478127f, +0.305267f,0.821497f,0.481617f, +0.18106f,0.939243f,0.291615f, +-0.00700511f,0.992472f,0.122275f, +-0.0966012f,0.992994f,0.068052f, +-0.106034f,0.991731f,0.0722919f, +-0.0353039f,0.993084f,0.11197f, +0.0541772f,0.995603f,0.0764134f, +0.08347f,0.989853f,0.114994f, +0.130868f,0.975887f,0.174696f, +0.0723356f,0.969665f,0.23349f, +-0.0470347f,0.960948f,0.272703f, +-0.10077f,0.971805f,0.213169f, +-0.119566f,0.974584f,0.189448f, +-0.0774738f,0.965859f,0.247214f, +-0.198029f,0.968836f,0.1488f, +-0.435505f,0.897132f,-0.0740912f, +-0.502708f,0.857298f,-0.111019f, +-0.564282f,0.819749f,-0.0979722f, +-0.594236f,0.795147f,-0.120937f, +-0.591492f,0.803058f,-0.0723546f, +-0.526826f,0.849968f,-0.0029614f, +-0.410127f,0.912007f,0.00617969f, +-0.355675f,0.932755f,-0.0588432f, +-0.457125f,0.883759f,-0.100032f, +-0.544765f,0.834451f,-0.0832032f, +-0.554858f,0.819866f,-0.141253f, +-0.535218f,0.826621f,-0.173894f, +-0.203549f,0.978635f,-0.0289948f, +0.0668755f,0.997729f,0.00799418f, +0.247034f,0.968844f,0.017759f, +0.275407f,0.949712f,0.148988f, +0.19759f,0.950103f,0.241375f, +0.374575f,0.880138f,0.291635f, +0.446827f,0.865948f,0.224675f, +0.519968f,0.833624f,0.186291f, +0.587008f,0.786117f,0.193499f, +0.636373f,0.75334f,0.165857f, +0.540728f,0.822377f,0.176944f, +0.345338f,0.910903f,0.225828f, +0.278322f,0.945193f,0.170723f, +0.30876f,0.936535f,0.166043f, +0.303863f,0.916063f,0.261719f, +0.319419f,0.895614f,0.309591f, +0.43277f,0.828092f,0.356332f, +0.333077f,0.917687f,0.216587f, +0.219655f,0.964319f,0.147787f, +0.242228f,0.95005f,0.196802f, +0.204875f,0.978767f,-0.00640881f, +-0.000192716f,0.97566f,-0.219288f, +-0.0681124f,0.988809f,-0.132732f, +-0.241144f,0.919453f,-0.310573f, +-0.290276f,0.882193f,-0.370776f, +0.0292627f,0.97223f,-0.232189f, +-0.0803803f,0.976804f,-0.198478f, +-0.203999f,0.977793f,-0.0480039f, +-0.118856f,0.989202f,0.0857425f, +-0.0783112f,0.985397f,0.151198f, +-0.0878718f,0.938803f,0.333059f, +-0.083435f,0.948159f,0.30665f, +-0.110585f,0.962509f,0.247682f, +-0.186686f,0.943514f,0.273733f, +-0.149516f,0.932553f,0.32862f, +-0.00475332f,0.899494f,0.436906f, +0.0862131f,0.885009f,0.457522f, +0.277459f,0.815555f,0.507825f, +0.298118f,0.799955f,0.520766f, +0.14455f,0.869997f,0.471392f, +0.0121492f,0.942115f,0.335071f, +-0.0752209f,0.977077f,0.199154f, +-0.128636f,0.97789f,0.164878f, +-0.000660482f,0.945164f,0.326595f, +0.00550592f,0.919316f,0.393482f, +0.0803772f,0.905979f,0.415621f, +0.0810259f,0.907487f,0.412192f, +-0.090779f,0.919652f,0.382099f, +-0.137864f,0.897436f,0.419048f, +-0.130404f,0.886486f,0.444001f, +-0.0852724f,0.906321f,0.413897f, +-0.0259127f,0.906615f,0.421163f, +-0.225351f,0.915922f,0.332119f, +-0.462548f,0.869686f,0.172323f, +-0.572668f,0.816922f,0.0684804f, +-0.585929f,0.806118f,0.0828267f, +-0.593406f,0.803366f,0.0497268f, +-0.516762f,0.856027f,-0.0132014f, +-0.38427f,0.922646f,-0.0325731f, +-0.287245f,0.956724f,-0.0465863f, +-0.413146f,0.905396f,-0.097823f, +-0.564236f,0.818421f,-0.108744f, +-0.507227f,0.858315f,-0.0775611f, +-0.527754f,0.82927f,-0.183811f, +-0.354765f,0.918321f,-0.175582f, +0.0463007f,0.998926f,-0.00175561f, +0.214268f,0.976774f,0.00151756f, +0.165544f,0.983729f,0.0698077f, +0.096445f,0.982342f,0.16032f, +0.366991f,0.896711f,0.24744f, +0.500788f,0.845195f,0.186699f, +0.507012f,0.85355f,0.119965f, +0.542994f,0.824496f,0.159261f, +0.605757f,0.757486f,0.243463f, +0.532123f,0.786802f,0.312711f, +0.44869f,0.847812f,0.282652f, +0.34333f,0.935092f,0.0879082f, +0.24319f,0.961353f,0.129073f, +0.223708f,0.954136f,0.198946f, +0.276144f,0.94134f,0.193965f, +0.41277f,0.892522f,0.181731f, +0.485836f,0.856185f,0.175815f, +0.251109f,0.963495f,0.0928509f, +0.217377f,0.969921f,0.109544f, +0.402023f,0.911537f,0.0864706f, +0.0930878f,0.988366f,-0.120284f, +-0.0926141f,0.987658f,-0.126311f, +-0.0129498f,0.988134f,-0.153049f, +-0.0752509f,0.973537f,-0.215783f, +-0.167591f,0.970187f,-0.175075f, +-0.227938f,0.971032f,-0.0717025f, +-0.288377f,0.95589f,0.0557925f, +-0.2706f,0.959797f,0.0746015f, +-0.201821f,0.948409f,0.244517f, +-0.135104f,0.944724f,0.298737f, +0.0536332f,0.953012f,0.298147f, +-0.104499f,0.972769f,0.206883f, +-0.26012f,0.936243f,0.236192f, +-0.221301f,0.933098f,0.283468f, +-0.0976008f,0.934678f,0.341835f, +0.0488135f,0.920165f,0.388475f, +0.20566f,0.878417f,0.431379f, +0.294052f,0.82595f,0.480979f, +0.211093f,0.846234f,0.489211f, +0.1526f,0.86506f,0.477897f, +0.100541f,0.907805f,0.407163f, +-0.126416f,0.965258f,0.228683f, +-0.211306f,0.949302f,0.232755f, +-0.037039f,0.912463f,0.40748f, +0.117233f,0.908378f,0.401379f, +0.101997f,0.928038f,0.35825f, +-0.0502775f,0.939056f,0.340069f, +-0.158243f,0.952358f,0.260718f, +-0.125329f,0.958222f,0.257106f, +-0.051336f,0.956723f,0.286436f, +-0.0625203f,0.954305f,0.29222f, +-0.207996f,0.932703f,0.294623f, +-0.319481f,0.91161f,0.258649f, +-0.495077f,0.865137f,0.0802322f, +-0.579132f,0.814857f,-0.0247929f, +-0.549115f,0.83292f,-0.0686783f, +-0.493373f,0.86244f,-0.113053f, +-0.402759f,0.911225f,-0.0863345f, +-0.292096f,0.955556f,-0.0399004f, +-0.382523f,0.923047f,-0.0407488f, +-0.572187f,0.816414f,-0.0779103f, +-0.512485f,0.857517f,-0.0449819f, +-0.420369f,0.906318f,-0.0433336f, +-0.419207f,0.879291f,-0.22608f, +-0.129012f,0.980121f,-0.150729f, +0.168538f,0.98409f,0.056222f, +0.177285f,0.97778f,0.111881f, +0.0313595f,0.998166f,-0.0517722f, +0.266622f,0.963684f,-0.0150476f, +0.566513f,0.817464f,0.103999f, +0.539244f,0.841888f,0.0209898f, +0.503392f,0.861782f,0.0626771f, +0.548011f,0.825978f,0.132075f, +0.53464f,0.817691f,0.213407f, +0.52656f,0.822061f,0.21668f, +0.418461f,0.898681f,0.131391f, +0.217077f,0.97168f,0.0933593f, +0.230073f,0.97316f,0.00512693f, +0.352039f,0.933499f,-0.0681773f, +0.427612f,0.891089f,-0.152014f, +0.47402f,0.877861f,-0.0682997f, +0.292505f,0.956178f,-0.0128375f, +0.212998f,0.971167f,-0.107084f, +0.394409f,0.913171f,-0.102761f, +0.229015f,0.973422f,0.000912976f, +-0.0760893f,0.988509f,-0.130618f, +-0.0515625f,0.984716f,-0.166362f, +-0.0928406f,0.987408f,-0.128086f, +-0.200115f,0.967117f,0.156969f, +-0.29324f,0.941681f,0.165066f, +-0.336305f,0.919935f,0.201539f, +-0.298108f,0.921775f,0.247915f, +-0.262609f,0.920325f,0.289892f, +-0.146209f,0.952657f,0.266586f, +-0.00778438f,0.956339f,0.292158f, +-0.050022f,0.92665f,0.372583f, +-0.258705f,0.916977f,0.303687f, +-0.247478f,0.923305f,0.293706f, +-0.126717f,0.938107f,0.322331f, +0.0303988f,0.946862f,0.320201f, +0.135735f,0.944675f,0.298606f, +0.25669f,0.889672f,0.377616f, +0.215508f,0.868916f,0.44558f, +0.117717f,0.868155f,0.482129f, +0.172493f,0.853951f,0.490931f, +0.0744588f,0.909987f,0.407897f, +-0.203499f,0.942765f,0.264163f, +-0.165852f,0.956441f,0.240237f, +0.150303f,0.946565f,0.285349f, +0.126121f,0.955231f,0.267632f, +0.00383767f,0.957166f,0.289515f, +-0.0803601f,0.965694f,0.246937f, +-0.14415f,0.963474f,0.225698f, +-0.128772f,0.964294f,0.231421f, +-0.0634991f,0.964707f,0.255554f, +-0.15178f,0.96554f,0.211412f, +-0.290877f,0.950446f,0.109737f, +-0.365587f,0.928197f,0.069257f, +-0.512709f,0.855901f,-0.0675528f, +-0.522587f,0.843414f,-0.12472f, +-0.519355f,0.843468f,-0.13723f, +-0.458617f,0.886978f,-0.054221f, +-0.335795f,0.941914f,0.00633015f, +-0.354719f,0.934449f,0.0312872f, +-0.552854f,0.83289f,-0.025441f, +-0.550469f,0.834453f,-0.0259307f, +-0.388185f,0.921529f,-0.00983026f, +-0.282899f,0.957493f,-0.056358f, +-0.256814f,0.955751f,-0.143483f, +-0.0731312f,0.996697f,-0.0353254f, +0.211397f,0.967055f,0.141832f, +0.27554f,0.960583f,0.0368595f, +0.217196f,0.959783f,-0.177882f, +0.479261f,0.875236f,-0.0653524f, +0.513664f,0.856169f,0.0558883f, +0.446145f,0.882397f,0.149434f, +0.498219f,0.84712f,0.184837f, +0.503236f,0.827823f,0.247916f, +0.51285f,0.815024f,0.269666f, +0.506381f,0.824734f,0.251778f, +0.333663f,0.940706f,0.0611746f, +0.353215f,0.932965f,-0.069389f, +0.414309f,0.904024f,-0.105298f, +0.451897f,0.886486f,-0.0996557f, +0.345824f,0.933767f,-0.0921138f, +0.280994f,0.95917f,0.0321915f, +0.317081f,0.945948f,0.0681282f, +0.344866f,0.938141f,0.0309596f, +0.224406f,0.974203f,0.0238892f, +-0.0108486f,0.995761f,-0.0913323f, +-0.00158176f,0.998953f,-0.0457292f, +-0.115676f,0.985559f,-0.123663f, +-0.188171f,0.911466f,0.365816f, +-0.262724f,0.896783f,0.356029f, +-0.358149f,0.883197f,0.302807f, +-0.323424f,0.894918f,0.307438f, +-0.242922f,0.924564f,0.293548f, +-0.121147f,0.94907f,0.290844f, +-0.0341414f,0.951299f,0.306374f, +-0.132493f,0.945016f,0.298983f, +-0.194216f,0.905093f,0.378268f, +-0.212944f,0.914784f,0.343257f, +-0.127802f,0.956235f,0.263215f, +0.0483659f,0.968777f,0.243172f, +0.117573f,0.942608f,0.312517f, +0.164225f,0.89741f,0.409494f, +0.122313f,0.88201f,0.455081f, +0.101965f,0.875392f,0.472537f, +0.209339f,0.879095f,0.428217f, +0.174899f,0.892224f,0.416349f, +-0.060088f,0.941634f,0.331231f, +-0.120508f,0.975773f,0.182606f, +0.112168f,0.972734f,0.202994f, +0.117253f,0.950933f,0.286318f, +-0.0544328f,0.941394f,0.332887f, +-0.0790068f,0.915303f,0.394942f, +-0.127609f,0.917525f,0.376648f, +-0.0756868f,0.941409f,0.328666f, +-0.0332439f,0.958716f,0.282415f, +-0.0735168f,0.965505f,0.249792f, +-0.203882f,0.964791f,0.166163f, +-0.320453f,0.94269f,0.0929826f, +-0.471247f,0.881185f,0.0379224f, +-0.492278f,0.869051f,0.0491152f, +-0.532259f,0.846256f,-0.0234739f, +-0.499446f,0.866138f,-0.0189645f, +-0.373407f,0.92679f,-0.0403466f, +-0.352534f,0.935772f,-0.00715155f, +-0.527726f,0.848793f,-0.0324855f, +-0.520812f,0.852354f,-0.0474108f, +-0.409147f,0.909436f,-0.0743255f, +-0.294722f,0.955583f,0.000817458f, +-0.222255f,0.974321f,0.0360744f, +-0.14278f,0.989739f,0.00545783f, +0.112175f,0.992761f,0.0429195f, +0.349968f,0.931754f,0.0967357f, +0.338116f,0.939385f,0.056869f, +0.379594f,0.923814f,0.0497667f, +0.434257f,0.879279f,0.195674f, +0.391146f,0.89525f,0.213383f, +0.465582f,0.860371f,0.207352f, +0.429826f,0.860017f,0.274991f, +0.465148f,0.815034f,0.34548f, +0.575943f,0.73808f,0.351465f, +0.535537f,0.824709f,0.181813f, +0.414278f,0.908562f,-0.0537569f, +0.380258f,0.913027f,-0.147599f, +0.408447f,0.90132f,-0.144197f, +0.367806f,0.925659f,-0.0887431f, +0.142987f,0.986995f,-0.073455f, +0.215691f,0.972786f,0.0846483f, +0.373384f,0.916381f,0.144331f, +0.381582f,0.918997f,0.0991966f, +0.0727073f,0.993287f,-0.0899678f, +-0.0658262f,0.992454f,-0.103446f, +0.0138596f,0.999564f,-0.0260736f, +-0.215981f,0.852322f,0.47634f, +-0.206677f,0.845053f,0.493123f, +-0.272991f,0.879681f,0.389406f, +-0.267376f,0.924267f,0.272471f, +-0.22026f,0.956955f,0.189003f, +-0.175208f,0.966589f,0.187106f, +-0.043064f,0.959071f,0.279872f, +-0.116589f,0.955061f,0.272519f, +-0.310776f,0.922421f,0.229257f, +-0.169995f,0.929299f,0.32788f, +-0.0175005f,0.941141f,0.337561f, +0.0138751f,0.95035f,0.310874f, +-0.0519487f,0.924056f,0.37871f, +0.0171204f,0.875115f,0.483613f, +0.148666f,0.835016f,0.529761f, +0.187668f,0.864969f,0.465412f, +0.241037f,0.89408f,0.377521f, +0.22255f,0.900707f,0.373093f, +0.0517034f,0.945752f,0.320749f, +-0.0271248f,0.957046f,0.288665f, +0.0325916f,0.970401f,0.239289f, +0.0171507f,0.960836f,0.276588f, +-0.143534f,0.9275f,0.345169f, +-0.0983366f,0.916766f,0.38713f, +-0.0476997f,0.944806f,0.32414f, +-0.0337303f,0.946895f,0.319767f, +-0.0100366f,0.942379f,0.334396f, +-0.0544901f,0.938102f,0.342046f, +-0.14598f,0.916868f,0.371541f, +-0.23743f,0.904478f,0.354324f, +-0.411826f,0.87795f,0.244136f, +-0.481531f,0.866693f,0.130273f, +-0.469337f,0.874903f,0.119446f, +-0.452816f,0.890509f,0.0441746f, +-0.332275f,0.942324f,-0.0402274f, +-0.391441f,0.91825f,-0.0599172f, +-0.492183f,0.870395f,0.0129854f, +-0.540952f,0.839903f,-0.0439814f, +-0.452633f,0.891182f,0.0302916f, +-0.353037f,0.931758f,0.0848037f, +-0.230998f,0.971043f,0.0609518f, +-0.110559f,0.993184f,0.0368984f, +0.0985994f,0.994896f,-0.0214387f, +0.290703f,0.956813f,-0.000841556f, +0.306742f,0.941069f,0.142471f, +0.309512f,0.928678f,0.20435f, +0.393276f,0.890035f,0.23059f, +0.472781f,0.864565f,0.170309f, +0.455511f,0.888755f,0.0512287f, +0.387199f,0.912459f,0.13227f, +0.420125f,0.891345f,0.170293f, +0.568557f,0.791084f,0.225676f, +0.642678f,0.725845f,0.245181f, +0.61301f,0.785525f,0.0846683f, +0.519083f,0.833826f,-0.187849f, +0.390386f,0.832025f,-0.394123f, +0.254733f,0.897839f,-0.359161f, +0.0968538f,0.955535f,-0.278518f, +0.110338f,0.951183f,-0.288231f, +0.337547f,0.917961f,-0.20835f, +0.382401f,0.916771f,-0.115327f, +0.232755f,0.967238f,-0.101374f, +-0.075544f,0.963631f,-0.256338f, +-0.111861f,0.963998f,-0.241238f, +-0.403631f,0.823611f,0.398431f, +-0.211285f,0.853176f,0.476917f, +-0.0996818f,0.887327f,0.450237f, +-0.119017f,0.926423f,0.357178f, +-0.147962f,0.959424f,0.240027f, +-0.17904f,0.969453f,0.167646f, +-0.182698f,0.967757f,0.173402f, +-0.0875162f,0.935774f,0.341566f, +-0.247354f,0.926662f,0.283043f, +-0.269706f,0.932828f,0.238937f, +-0.116046f,0.932011f,0.34335f, +-0.054572f,0.895119f,0.442474f, +-0.0702883f,0.870311f,0.487462f, +-0.0238769f,0.872685f,0.4877f, +0.145141f,0.847062f,0.511292f, +0.26226f,0.839585f,0.475728f, +0.307436f,0.859155f,0.409067f, +0.272452f,0.896089f,0.35042f, +0.0602872f,0.949936f,0.306572f, +-0.0269541f,0.950357f,0.309992f, +0.110161f,0.964193f,0.241239f, +0.0112822f,0.980274f,0.19732f, +-0.201697f,0.957263f,0.207282f, +-0.0780713f,0.964435f,0.252529f, +0.00973745f,0.973101f,0.230172f, +-0.0755968f,0.981149f,0.177855f, +-0.0876613f,0.97114f,0.221817f, +-0.111729f,0.927016f,0.357991f, +-0.221124f,0.882386f,0.41533f, +-0.204491f,0.867297f,0.45385f, +-0.238609f,0.89578f,0.375026f, +-0.38933f,0.904206f,0.175592f, +-0.447525f,0.889442f,0.0928077f, +-0.421271f,0.9063f,0.0339399f, +-0.295839f,0.951557f,0.0837779f, +-0.40469f,0.90695f,0.116906f, +-0.500893f,0.852054f,0.152018f, +-0.539765f,0.838827f,0.0708671f, +-0.497421f,0.864837f,0.068037f, +-0.338953f,0.937284f,0.0813017f, +-0.178116f,0.975677f,0.127782f, +-0.0428295f,0.992057f,0.118272f, +0.176596f,0.983706f,0.0336999f, +0.217356f,0.975284f,-0.0397137f, +0.172156f,0.984981f,0.0131952f, +0.279801f,0.958586f,0.0531518f, +0.429228f,0.901897f,0.0484305f, +0.537427f,0.843269f,0.00840869f, +0.461159f,0.886671f,-0.0338697f, +0.347666f,0.937337f,0.022966f, +0.390524f,0.920568f,0.00669632f, +0.544615f,0.837115f,0.0513162f, +0.64737f,0.75903f,0.0691749f, +0.709483f,0.698136f,0.0961199f, +0.69002f,0.723355f,-0.0250988f, +0.510759f,0.819636f,-0.259464f, +0.161066f,0.87948f,-0.447854f, +0.0742832f,0.901252f,-0.426881f, +0.164688f,0.896506f,-0.411284f, +0.211827f,0.873436f,-0.43845f, +0.238498f,0.898773f,-0.367868f, +0.244991f,0.941894f,-0.229815f, +0.0339169f,0.959887f,-0.278328f, +-0.150927f,0.928909f,-0.338156f, +-0.262269f,0.839002f,0.47675f, +-0.199453f,0.89484f,0.39935f, +-0.0695117f,0.920513f,0.384478f, +-0.0794509f,0.922822f,0.376943f, +-0.0384813f,0.923599f,0.381424f, +-0.0906334f,0.946866f,0.308593f, +-0.231342f,0.940055f,0.250554f, +-0.228342f,0.910605f,0.344468f, +-0.168052f,0.897027f,0.408779f, +-0.249241f,0.920512f,0.300892f, +-0.201125f,0.932701f,0.29936f, +-0.156169f,0.918655f,0.362882f, +-0.101964f,0.881359f,0.461314f, +-0.0479674f,0.88379f,0.465418f, +0.160937f,0.878499f,0.449821f, +0.298148f,0.878819f,0.372539f, +0.363972f,0.843945f,0.394059f, +0.330687f,0.867316f,0.372033f, +0.109951f,0.941418f,0.318814f, +0.0530775f,0.967978f,0.245361f, +0.171035f,0.972595f,0.157499f, +0.0211384f,0.985036f,0.171048f, +-0.223743f,0.958122f,0.178723f, +-0.143003f,0.966115f,0.214875f, +0.0335442f,0.969798f,0.24159f, +0.00108957f,0.977785f,0.209606f, +-0.185748f,0.96522f,0.183978f, +-0.245345f,0.928456f,0.278881f, +-0.278935f,0.920412f,0.273928f, +-0.227379f,0.922009f,0.313367f, +-0.127558f,0.911679f,0.390603f, +-0.252363f,0.916101f,0.311563f, +-0.353299f,0.912723f,0.205222f, +-0.418007f,0.90407f,0.089031f, +-0.400603f,0.906481f,0.133452f, +-0.448512f,0.870078f,0.204452f, +-0.467166f,0.869433f,0.160757f, +-0.442544f,0.892618f,0.0859534f, +-0.465336f,0.885122f,-0.00451183f, +-0.389888f,0.920791f,0.0114409f, +-0.26105f,0.96208f,0.079086f, +-0.0611649f,0.990413f,0.123862f, +0.218817f,0.959555f,0.177126f, +0.289447f,0.944291f,0.156638f, +0.238555f,0.970242f,0.0415028f, +0.303951f,0.946528f,-0.108164f, +0.431424f,0.894504f,-0.117199f, +0.527248f,0.845956f,-0.0797999f, +0.433918f,0.900916f,0.0081213f, +0.311993f,0.948885f,0.0477355f, +0.430547f,0.901487f,0.0441572f, +0.533619f,0.845624f,-0.013065f, +0.634808f,0.772557f,-0.013228f, +0.691864f,0.721963f,0.00965866f, +0.719067f,0.694383f,0.0278453f, +0.653183f,0.756562f,0.0310991f, +0.386363f,0.918778f,-0.0810638f, +0.0570874f,0.970389f,-0.234704f, +0.136394f,0.961794f,-0.237379f, +0.31236f,0.906525f,-0.283977f, +0.169471f,0.890916f,-0.421365f, +0.117142f,0.913195f,-0.390323f, +0.0777866f,0.931625f,-0.354998f, +-0.0437682f,0.92941f,-0.366443f, +-0.144429f,0.859889f,0.489623f, +-0.0880742f,0.890372f,0.446633f, +-0.0314378f,0.923882f,0.381384f, +-0.0838814f,0.944139f,0.318693f, +-0.0693885f,0.945887f,0.316991f, +-0.0723769f,0.923178f,0.377496f, +-0.19706f,0.892458f,0.405815f, +-0.297386f,0.892332f,0.339566f, +-0.156962f,0.91638f,0.368254f, +-0.15276f,0.919794f,0.361447f, +-0.17017f,0.922781f,0.345714f, +-0.253151f,0.920843f,0.296586f, +-0.189094f,0.905109f,0.380816f, +0.00126887f,0.929197f,0.369582f, +0.193396f,0.936415f,0.292787f, +0.338227f,0.878943f,0.336247f, +0.32269f,0.878938f,0.351198f, +0.355444f,0.867037f,0.34915f, +0.217316f,0.918786f,0.329554f, +0.123007f,0.956146f,0.265807f, +0.19987f,0.950731f,0.236986f, +0.0209731f,0.979076f,0.202411f, +-0.247784f,0.961065f,0.122302f, +-0.158935f,0.979718f,0.122036f, +0.0602949f,0.986043f,0.155188f, +-0.0308065f,0.985867f,0.164674f, +-0.185866f,0.954971f,0.231267f, +-0.272851f,0.942767f,0.191682f, +-0.226832f,0.938998f,0.258516f, +-0.311155f,0.923351f,0.224958f, +-0.264965f,0.917378f,0.297004f, +-0.186536f,0.890461f,0.41507f, +-0.257136f,0.895376f,0.363569f, +-0.330368f,0.897563f,0.291955f, +-0.415623f,0.888172f,0.19598f, +-0.414839f,0.89462f,0.166025f, +-0.429244f,0.901932f,0.0476213f, +-0.370358f,0.92848f,0.0275516f, +-0.456696f,0.886215f,-0.0777874f, +-0.424934f,0.901633f,-0.0805556f, +-0.26755f,0.960865f,-0.0718042f, +-0.0958709f,0.992595f,-0.0745981f, +0.0853594f,0.996177f,0.0185983f, +0.317006f,0.925486f,0.207323f, +0.362438f,0.919121f,0.154455f, +0.423147f,0.903697f,0.0654098f, +0.439077f,0.898135f,-0.0237805f, +0.463592f,0.885685f,-0.0253961f, +0.432904f,0.900567f,0.0396714f, +0.274262f,0.960561f,-0.0458644f, +0.460874f,0.887433f,0.00757752f, +0.557878f,0.824691f,-0.0930446f, +0.608392f,0.791916f,-0.0522232f, +0.68605f,0.722282f,0.0874302f, +0.697187f,0.705867f,0.125228f, +0.597474f,0.77589f,0.202532f, +0.400677f,0.868028f,0.293233f, +0.18602f,0.951589f,0.244694f, +0.190924f,0.979879f,0.0581851f, +0.431268f,0.902043f,-0.01807f, +0.329374f,0.934061f,-0.137997f, +0.144406f,0.935772f,-0.321679f, +0.0779514f,0.92222f,-0.378727f, +-0.0417532f,0.914206f,-0.403093f, +-0.201619f,0.929423f,0.309066f, +-0.0738258f,0.948242f,0.308847f, +0.0288118f,0.952024f,0.304665f, +-0.00526808f,0.951397f,0.307922f, +-0.0992485f,0.952014f,0.289515f, +-0.179425f,0.914994f,0.361376f, +-0.223397f,0.866943f,0.445538f, +-0.185005f,0.868122f,0.460584f, +-0.180405f,0.90051f,0.395646f, +-0.165976f,0.891215f,0.422122f, +-0.142635f,0.91411f,0.37955f, +-0.196593f,0.942079f,0.271733f, +-0.231892f,0.955708f,0.181242f, +0.0754625f,0.968764f,0.236224f, +0.189929f,0.95814f,0.214232f, +0.245783f,0.922809f,0.29667f, +0.350212f,0.885135f,0.30641f, +0.361791f,0.894635f,0.262174f, +0.218601f,0.892888f,0.393656f, +0.122578f,0.888731f,0.441737f, +0.221602f,0.877963f,0.42435f, +0.113111f,0.927784f,0.355561f, +-0.0962286f,0.967788f,0.232652f, +-0.169743f,0.984124f,0.0518298f, +0.00440837f,0.997134f,0.0755295f, +-0.0780505f,0.992255f,0.096638f, +-0.206915f,0.971074f,0.119173f, +-0.298261f,0.946469f,0.123437f, +-0.365054f,0.904843f,0.219077f, +-0.255666f,0.897337f,0.35975f, +-0.290965f,0.914197f,0.282104f, +-0.292271f,0.916518f,0.27308f, +-0.219619f,0.919339f,0.326472f, +-0.256286f,0.928086f,0.270137f, +-0.310598f,0.93305f,0.18151f, +-0.350728f,0.934452f,0.0615507f, +-0.388138f,0.92156f,0.00876308f, +-0.343471f,0.93847f,0.0360903f, +-0.339947f,0.939272f,-0.0469463f, +-0.382902f,0.903055f,-0.19462f, +-0.249239f,0.929446f,-0.272047f, +-0.147764f,0.944907f,-0.29209f, +-0.0668186f,0.978447f,-0.19539f, +0.17553f,0.981686f,-0.0740426f, +0.388973f,0.921211f,-0.00833323f, +0.44678f,0.894539f,-0.0136777f, +0.47739f,0.878112f,-0.0318964f, +0.465567f,0.884409f,-0.0326842f, +0.484387f,0.873859f,-0.0417148f, +0.315003f,0.932104f,-0.178762f, +0.426472f,0.898104f,-0.107381f, +0.587094f,0.80929f,-0.0192587f, +0.491946f,0.869904f,0.0354452f, +0.550379f,0.808299f,0.209131f, +0.597166f,0.706874f,0.379107f, +0.503286f,0.706664f,0.497322f, +0.349603f,0.761935f,0.545191f, +0.317931f,0.791281f,0.522298f, +0.357034f,0.859818f,0.365021f, +0.457671f,0.859336f,0.22821f, +0.436038f,0.880267f,0.187085f, +0.291237f,0.949467f,0.117016f, +0.172846f,0.983353f,0.0560389f, +0.00924155f,0.999014f,-0.043417f, +-0.112379f,0.966854f,0.22927f, +-0.0543436f,0.980353f,0.189616f, +0.0014105f,0.977032f,0.213089f, +-0.0810261f,0.954455f,0.287143f, +-0.162384f,0.905883f,0.391161f, +-0.248623f,0.850337f,0.463803f, +-0.272281f,0.829594f,0.48748f, +-0.210534f,0.842738f,0.495447f, +-0.142516f,0.845822f,0.514076f, +-0.128959f,0.864859f,0.485168f, +-0.000520612f,0.895905f,0.444245f, +0.00320439f,0.940529f,0.339698f, +-0.169376f,0.979765f,0.106637f, +-0.0517963f,0.994886f,0.0867084f, +0.124214f,0.955178f,0.268711f, +0.208945f,0.916166f,0.342027f, +0.39407f,0.858275f,0.328745f, +0.248342f,0.913565f,0.322063f, +0.031165f,0.861455f,0.506877f, +0.0654094f,0.812115f,0.57982f, +0.246891f,0.786687f,0.565834f, +0.230643f,0.834381f,0.500612f, +0.069509f,0.924157f,0.375637f, +0.0080049f,0.977951f,0.208681f, +-0.0216545f,0.998818f,0.043521f, +-0.0416834f,0.994806f,0.0928633f, +-0.209164f,0.977378f,0.0313447f, +-0.33727f,0.941399f,0.00405643f, +-0.445763f,0.895148f,-0.00236945f, +-0.379089f,0.924127f,0.0477591f, +-0.212534f,0.958583f,0.189598f, +-0.289703f,0.944216f,0.156615f, +-0.225857f,0.954875f,0.19288f, +-0.19812f,0.968114f,0.153308f, +-0.225491f,0.970896f,0.0807165f, +-0.268028f,0.963292f,-0.0151842f, +-0.386115f,0.917249f,-0.0978197f, +-0.332792f,0.935954f,-0.115065f, +-0.223332f,0.957817f,-0.180856f, +-0.272615f,0.913397f,-0.302304f, +-0.182015f,0.92061f,-0.345468f, +-0.156497f,0.91949f,-0.36062f, +-0.125465f,0.931751f,-0.340733f, +0.1054f,0.935905f,-0.336114f, +0.348771f,0.906917f,-0.236346f, +0.444797f,0.880373f,-0.164617f, +0.451025f,0.885434f,-0.112171f, +0.467976f,0.880983f,-0.0697667f, +0.499335f,0.858868f,-0.114062f, +0.349601f,0.930335f,-0.110707f, +0.307802f,0.944888f,-0.11156f, +0.473394f,0.878106f,0.0694821f, +0.43441f,0.869457f,0.23523f, +0.41901f,0.855868f,0.303184f, +0.452664f,0.775597f,0.439937f, +0.432369f,0.72522f,0.535829f, +0.415514f,0.737038f,0.533032f, +0.381011f,0.793693f,0.474217f, +0.445314f,0.773558f,0.450892f, +0.520117f,0.767192f,0.375359f, +0.457464f,0.838846f,0.295064f, +0.276432f,0.924946f,0.260884f, +0.199394f,0.937964f,0.283664f, +0.190897f,0.927436f,0.32159f, +-0.0705492f,0.959049f,0.274315f, +-0.0655623f,0.961527f,0.266772f, +-0.0518964f,0.943387f,0.32761f, +-0.202287f,0.906319f,0.371032f, +-0.245861f,0.842829f,0.478739f, +-0.310342f,0.836362f,0.451869f, +-0.256381f,0.850522f,0.459219f, +-0.198762f,0.867072f,0.456815f, +-0.12379f,0.863897f,0.48822f, +-0.0469651f,0.900623f,0.432056f, +-8.11553e-005f,0.943721f,0.330744f, +0.129628f,0.925055f,0.357028f, +0.0340614f,0.966037f,0.256151f, +-0.0890995f,0.983963f,0.154524f, +-0.0322587f,0.981394f,0.189278f, +0.138447f,0.956229f,0.257794f, +0.317932f,0.883665f,0.343592f, +0.154174f,0.859961f,0.486516f, +-0.0823702f,0.837125f,0.540774f, +0.067942f,0.838652f,0.540413f, +0.256779f,0.806501f,0.532561f, +0.317316f,0.771073f,0.552047f, +0.228943f,0.837474f,0.496208f, +0.221417f,0.908583f,0.354192f, +0.0661321f,0.986936f,0.146917f, +-0.101631f,0.981129f,0.164493f, +-0.140334f,0.967949f,0.20828f, +-0.26644f,0.954208f,0.136f, +-0.376833f,0.92539f,0.0406146f, +-0.423125f,0.902479f,-0.0805992f, +-0.378547f,0.924929f,-0.0347556f, +-0.294214f,0.950388f,0.101004f, +-0.253707f,0.966868f,0.0282789f, +-0.1425f,0.989661f,0.0162607f, +-0.152778f,0.987285f,-0.0438961f, +-0.226417f,0.971142f,-0.0749508f, +-0.278106f,0.959626f,-0.0421373f, +-0.315252f,0.936348f,-0.154492f, +-0.13807f,0.983353f,-0.118124f, +-0.169891f,0.968928f,-0.179762f, +-0.200272f,0.947942f,-0.247583f, +-0.182846f,0.93983f,-0.288594f, +-0.0836086f,0.941177f,-0.327408f, +0.0732417f,0.918516f,-0.388542f, +0.208177f,0.929929f,-0.303139f, +0.350352f,0.926406f,-0.137933f, +0.401951f,0.914196f,-0.0517823f, +0.448456f,0.893661f,-0.0160636f, +0.515556f,0.856358f,0.0291996f, +0.347689f,0.937245f,0.0261378f, +0.255909f,0.965329f,0.0514824f, +0.382053f,0.909938f,0.161395f, +0.340926f,0.922929f,0.178808f, +0.312845f,0.910786f,0.269439f, +0.364196f,0.849776f,0.381106f, +0.45928f,0.814969f,0.353394f, +0.52951f,0.800019f,0.282116f, +0.449914f,0.855375f,0.256731f, +0.454599f,0.838858f,0.299428f, +0.555327f,0.766362f,0.322957f, +0.54417f,0.781393f,0.305455f, +0.357615f,0.911759f,0.202005f, +0.139813f,0.972952f,0.183891f, +0.109083f,0.950848f,0.289808f, +-0.192892f,0.944314f,0.266579f, +-0.117537f,0.919218f,0.375796f, +-0.132138f,0.875254f,0.465263f, +-0.253971f,0.812679f,0.524453f, +-0.263136f,0.777105f,0.571723f, +-0.18663f,0.797568f,0.573633f, +-0.239071f,0.855961f,0.458449f, +-0.228946f,0.872463f,0.431732f, +-0.154745f,0.876861f,0.455159f, +0.0511929f,0.876307f,0.479025f, +0.079622f,0.902874f,0.422468f, +0.0999946f,0.903351f,0.417083f, +0.103272f,0.908778f,0.404299f, +-0.0300958f,0.943633f,0.329622f, +-0.0276233f,0.954592f,0.296632f, +0.0865379f,0.944508f,0.316884f, +0.19572f,0.915809f,0.350694f, +0.0629871f,0.902785f,0.425456f, +-0.0973105f,0.893058f,0.439293f, +0.0850344f,0.884912f,0.45793f, +0.226219f,0.859273f,0.458775f, +0.265876f,0.822998f,0.50198f, +0.299522f,0.800365f,0.519329f, +0.365936f,0.804413f,0.467986f, +0.167843f,0.908094f,0.383659f, +-0.151292f,0.923022f,0.353753f, +-0.16349f,0.897488f,0.409618f, +-0.164454f,0.89713f,0.410016f, +-0.256833f,0.931773f,0.256583f, +-0.308509f,0.944441f,0.11337f, +-0.397192f,0.916896f,-0.0392391f, +-0.321804f,0.945652f,-0.046751f, +-0.145617f,0.989197f,-0.0168656f, +-0.117605f,0.989571f,-0.083174f, +-0.131213f,0.988938f,-0.0691672f, +-0.264465f,0.964357f,-0.00857016f, +-0.279285f,0.95849f,0.0574115f, +-0.308064f,0.950873f,-0.0306128f, +-0.232189f,0.97071f,0.0617333f, +-0.126956f,0.977263f,0.169823f, +-0.134913f,0.981643f,0.134817f, +-0.0643092f,0.996192f,0.0588766f, +-0.0179518f,0.989177f,-0.145623f, +0.100718f,0.978365f,-0.180716f, +0.107842f,0.981772f,-0.156502f, +0.235537f,0.96668f,-0.100264f, +0.400696f,0.915349f,-0.0397433f, +0.382123f,0.921514f,-0.0692327f, +0.451191f,0.890657f,0.0561954f, +0.368356f,0.915308f,0.162865f, +0.16123f,0.974745f,0.154523f, +0.326647f,0.914341f,0.239337f, +0.365189f,0.91282f,0.182749f, +0.230086f,0.959458f,0.162792f, +0.336546f,0.918886f,0.205876f, +0.545838f,0.824177f,0.150977f, +0.544526f,0.829407f,0.124801f, +0.442013f,0.862414f,0.24671f, +0.417167f,0.87901f,0.230894f, +0.525918f,0.823184f,0.213956f, +0.591278f,0.763502f,0.259719f, +0.412761f,0.877728f,0.243355f, +0.079495f,0.961838f,0.261818f, +-0.108191f,0.959339f,0.260698f, +-0.395968f,0.898347f,0.190215f, +-0.315805f,0.885393f,0.341095f, +-0.255081f,0.831656f,0.493236f, +-0.32798f,0.786298f,0.523607f, +-0.31899f,0.766541f,0.557369f, +-0.160414f,0.763167f,0.625974f, +-0.0711111f,0.771377f,0.632393f, +-0.143173f,0.825852f,0.545409f, +-0.172278f,0.854223f,0.490534f, +0.0123154f,0.838365f,0.544971f, +0.0830743f,0.830631f,0.550592f, +0.0507686f,0.835031f,0.547855f, +0.149519f,0.800804f,0.579962f, +0.0893025f,0.847618f,0.523038f, +-0.0238205f,0.893087f,0.449253f, +0.0209713f,0.900623f,0.434095f, +0.182588f,0.867377f,0.462945f, +0.0933756f,0.88802f,0.450223f, +-0.0988317f,0.917919f,0.384262f, +0.0323919f,0.922001f,0.38583f, +0.205498f,0.882674f,0.422678f, +0.228981f,0.875897f,0.424702f, +0.330967f,0.833446f,0.442526f, +0.386545f,0.82285f,0.416534f, +0.244254f,0.85459f,0.458275f, +-0.128515f,0.915454f,0.381351f, +-0.221592f,0.919582f,0.324447f, +-0.103305f,0.941351f,0.321226f, +-0.0534104f,0.960954f,0.271504f, +-0.164863f,0.980806f,0.104112f, +-0.239884f,0.970598f,-0.0198681f, +-0.303213f,0.937604f,-0.170178f, +-0.252015f,0.951441f,-0.176773f, +-0.108694f,0.994072f,0.00232095f, +-0.192935f,0.981013f,0.0197642f, +-0.322908f,0.946132f,0.0237552f, +-0.269028f,0.963107f,-0.00704542f, +-0.230013f,0.973161f,0.00722315f, +-0.357365f,0.933662f,-0.0237822f, +-0.204315f,0.973479f,0.102922f, +-0.115797f,0.983778f,0.137007f, +0.0200406f,0.991033f,0.132107f, +0.176509f,0.981212f,0.0778953f, +0.102914f,0.991977f,-0.0734239f, +0.103634f,0.990563f,-0.0896973f, +0.246302f,0.962545f,-0.113327f, +0.365449f,0.921945f,-0.12831f, +0.388572f,0.919102f,-0.0652967f, +0.33675f,0.940592f,-0.0434361f, +0.294334f,0.951251f,0.0921318f, +0.170376f,0.973956f,0.149605f, +0.291052f,0.946977f,0.136102f, +0.448607f,0.879963f,0.156258f, +0.275208f,0.960522f,0.0407201f, +0.320727f,0.94717f,-0.00171267f, +0.563867f,0.822582f,0.0735748f, +0.458264f,0.882692f,0.104155f, +0.35932f,0.917336f,0.171414f, +0.473577f,0.85831f,0.197555f, +0.552768f,0.818756f,0.155195f, +0.56022f,0.811568f,0.165865f, +0.410483f,0.877955f,0.246373f, +0.119318f,0.965792f,0.230239f, +-0.0302464f,0.98755f,0.15437f, +-0.434902f,0.821345f,0.369123f, +-0.425801f,0.804682f,0.41374f, +-0.330648f,0.807018f,0.489278f, +-0.341863f,0.793213f,0.503928f, +-0.356504f,0.786512f,0.504286f, +-0.269874f,0.813284f,0.515498f, +-0.0937663f,0.786137f,0.610898f, +-0.0122488f,0.782782f,0.622176f, +-0.145176f,0.838097f,0.525849f, +-0.0659853f,0.863648f,0.499758f, +0.0911511f,0.81559f,0.571406f, +0.0567409f,0.801208f,0.59569f, +0.110855f,0.801019f,0.588286f, +0.153854f,0.799367f,0.580811f, +0.0810561f,0.837494f,0.540401f, +0.0627084f,0.873537f,0.482702f, +0.153028f,0.87118f,0.466506f, +0.121758f,0.869515f,0.478663f, +-0.0139367f,0.889364f,0.456987f, +0.0116753f,0.909652f,0.415206f, +0.182976f,0.873078f,0.451946f, +0.230254f,0.874104f,0.427698f, +0.299542f,0.853577f,0.42624f, +0.365816f,0.815944f,0.447677f, +0.258135f,0.828321f,0.497243f, +0.0438733f,0.899999f,0.433678f, +-0.113551f,0.976415f,0.183628f, +-0.115165f,0.991964f,0.0523877f, +-0.0427249f,0.989973f,0.134639f, +-0.000526251f,0.987641f,0.156735f, +-0.182878f,0.982656f,-0.0306907f, +-0.187196f,0.982029f,-0.0240342f, +-0.272847f,0.956238f,-0.105656f, +-0.292658f,0.95046f,-0.104775f, +-0.178909f,0.983865f,0.00116467f, +-0.22078f,0.973898f,-0.0527095f, +-0.269354f,0.950491f,-0.154966f, +-0.262457f,0.956005f,-0.131038f, +-0.333574f,0.929233f,-0.158915f, +-0.27846f,0.93913f,-0.201231f, +-0.105722f,0.98028f,-0.166954f, +-0.03086f,0.983393f,-0.178845f, +0.166296f,0.985117f,-0.0434662f, +0.22991f,0.973119f,0.0134671f, +0.156605f,0.983722f,-0.0881293f, +0.276714f,0.94824f,-0.155787f, +0.32696f,0.929339f,-0.171541f, +0.339039f,0.938238f,-0.0690071f, +0.308789f,0.948131f,-0.0754727f, +0.23717f,0.967343f,-0.0894326f, +0.163558f,0.982662f,-0.0873214f, +0.252735f,0.966333f,-0.0482272f, +0.434287f,0.896865f,0.0838305f, +0.398093f,0.912104f,0.0979158f, +0.320154f,0.94669f,-0.0357668f, +0.45783f,0.889003f,0.00810452f, +0.504235f,0.85135f,0.144742f, +0.385352f,0.920157f,0.0693918f, +0.466232f,0.882239f,0.0654287f, +0.538345f,0.833943f,0.121343f, +0.517827f,0.838051f,0.171829f, +0.46128f,0.862173f,0.209471f, +0.229103f,0.969676f,0.085091f, +0.119821f,0.992172f,0.0351865f, +-0.316654f,0.75101f,0.579409f, +-0.356062f,0.779142f,0.515904f, +-0.357471f,0.814286f,0.457331f, +-0.357809f,0.798452f,0.484198f, +-0.344344f,0.806376f,0.480818f, +-0.279175f,0.813317f,0.510467f, +-0.188283f,0.817533f,0.544233f, +0.0108927f,0.825394f,0.564451f, +0.000505664f,0.854739f,0.519058f, +-0.0291193f,0.899152f,0.436667f, +-0.043893f,0.902469f,0.428513f, +-0.00142614f,0.854428f,0.519568f, +0.10644f,0.82426f,0.556117f, +0.17821f,0.772022f,0.610101f, +0.155558f,0.792656f,0.58949f, +0.103298f,0.851042f,0.514837f, +0.136998f,0.86222f,0.487656f, +0.128814f,0.846529f,0.516522f, +0.0086465f,0.861582f,0.507544f, +0.0126115f,0.865086f,0.501464f, +0.152876f,0.854998f,0.495588f, +0.261992f,0.846686f,0.463122f, +0.298132f,0.855648f,0.423065f, +0.330245f,0.846388f,0.417811f, +0.241868f,0.85891f,0.451412f, +0.243399f,0.870337f,0.428102f, +0.218863f,0.950296f,0.221442f, +-0.0230145f,0.994562f,-0.101567f, +-0.18143f,0.968994f,-0.167732f, +-0.00536077f,0.999859f,-0.0158957f, +-0.0149312f,0.999841f,-0.00972481f, +-0.248945f,0.961384f,-0.11733f, +-0.206226f,0.978121f,-0.0273758f, +-0.251569f,0.958037f,-0.137399f, +-0.215501f,0.957565f,-0.191386f, +-0.183194f,0.972176f,-0.145991f, +-0.242363f,0.956164f,-0.164351f, +-0.223675f,0.959477f,-0.171387f, +-0.263678f,0.929229f,-0.25886f, +-0.190809f,0.923444f,-0.332932f, +-0.125476f,0.902264f,-0.412524f, +-0.0800599f,0.931052f,-0.355994f, +0.00289679f,0.952892f,-0.303297f, +0.173027f,0.965415f,-0.195025f, +0.23552f,0.951626f,-0.197328f, +0.324166f,0.90746f,-0.26727f, +0.272213f,0.920502f,-0.280314f, +0.263103f,0.942676f,-0.205278f, +0.331376f,0.931643f,-0.1491f, +0.273621f,0.957062f,-0.0957296f, +0.174678f,0.976512f,-0.126141f, +0.162465f,0.97193f,-0.170168f, +0.285207f,0.956722f,-0.0577913f, +0.392887f,0.912166f,0.116586f, +0.413213f,0.901715f,0.127138f, +0.444428f,0.894805f,0.0425078f, +0.482399f,0.875952f,0.000225918f, +0.414394f,0.908379f,-0.0559034f, +0.421361f,0.906852f,-0.00856344f, +0.501069f,0.86151f,0.0820434f, +0.492896f,0.86226f,0.116453f, +0.497628f,0.854344f,0.149874f, +0.327901f,0.939568f,0.0984569f, +0.134608f,0.990256f,0.0356963f, +-0.115732f,0.781457f,0.613132f, +-0.224646f,0.82464f,0.519137f, +-0.330602f,0.837584f,0.434919f, +-0.37055f,0.826801f,0.423193f, +-0.389755f,0.836631f,0.38489f, +-0.35019f,0.83732f,0.419835f, +-0.192063f,0.866433f,0.460875f, +0.0577661f,0.893053f,0.446228f, +0.0715028f,0.909685f,0.409097f, +0.0355467f,0.937027f,0.347443f, +-0.0473295f,0.949618f,0.309815f, +-0.0714543f,0.946618f,0.31434f, +0.0109848f,0.930588f,0.365903f, +0.0306039f,0.876434f,0.480548f, +0.171338f,0.790427f,0.588106f, +0.228263f,0.773415f,0.591376f, +0.15062f,0.839076f,0.522748f, +0.0933237f,0.852392f,0.514508f, +0.0403687f,0.864191f,0.501542f, +0.0159293f,0.89067f,0.454371f, +0.162582f,0.873944f,0.458028f, +0.324998f,0.838057f,0.438219f, +0.361417f,0.861814f,0.355886f, +0.357364f,0.88789f,0.289727f, +0.288052f,0.920034f,0.265637f, +0.274707f,0.932706f,0.233657f, +0.415911f,0.867317f,0.273456f, +0.214502f,0.965967f,0.144559f, +-0.0739208f,0.997262f,-0.00212715f, +-0.130316f,0.972201f,-0.194533f, +0.00262571f,0.981048f,-0.193747f, +-0.190851f,0.93935f,-0.284951f, +-0.250649f,0.92646f,-0.280798f, +-0.16238f,0.957944f,-0.236595f, +-0.204897f,0.9457f,-0.252327f, +-0.246487f,0.945291f,-0.213705f, +-0.204741f,0.966747f,-0.153234f, +-0.173965f,0.952924f,-0.248341f, +-0.185492f,0.924696f,-0.332461f, +-0.120486f,0.929748f,-0.347926f, +-0.0981061f,0.932335f,-0.348033f, +-0.143961f,0.923839f,-0.354678f, +-0.0348514f,0.936175f,-0.349804f, +0.141193f,0.941481f,-0.306069f, +0.298926f,0.908144f,-0.293117f, +0.339558f,0.869399f,-0.35895f, +0.236934f,0.893673f,-0.381064f, +0.188986f,0.916304f,-0.353088f, +0.222126f,0.937284f,-0.268624f, +0.165461f,0.966952f,-0.193976f, +0.194618f,0.975642f,-0.101229f, +0.225585f,0.970105f,-0.0894815f, +0.18757f,0.970367f,-0.152331f, +0.271776f,0.9587f,-0.0838549f, +0.390134f,0.920749f,0.00399703f, +0.487191f,0.870564f,0.0690114f, +0.567845f,0.821826f,0.0464111f, +0.430596f,0.898843f,-0.0816633f, +0.345462f,0.936301f,-0.063213f, +0.439054f,0.898457f,0.0025505f, +0.485886f,0.873093f,0.040301f, +0.468523f,0.882438f,0.0422951f, +0.395695f,0.916215f,0.0630502f, +0.224264f,0.974198f,-0.0253916f, +-0.04074f,0.869731f,0.491842f, +-0.147521f,0.861626f,0.485632f, +-0.290306f,0.828918f,0.47814f, +-0.344291f,0.81826f,0.460342f, +-0.325822f,0.848235f,0.417537f, +-0.347006f,0.892025f,0.289618f, +-0.23289f,0.9484f,0.215175f, +0.0826503f,0.953848f,0.288692f, +0.0849803f,0.942357f,0.323639f, +0.0946367f,0.912864f,0.397143f, +0.0188563f,0.944615f,0.327637f, +-0.0844647f,0.976435f,0.198596f, +-0.0480441f,0.982086f,0.182207f, +-0.108246f,0.969423f,0.220233f, +0.0163534f,0.944153f,0.329102f, +0.218936f,0.864112f,0.453186f, +0.243602f,0.846524f,0.473344f, +0.157715f,0.898021f,0.410713f, +0.124101f,0.930824f,0.343753f, +0.0887369f,0.958556f,0.270731f, +0.13199f,0.965856f,0.222935f, +0.34996f,0.900513f,0.258077f, +0.45204f,0.856515f,0.249081f, +0.434574f,0.879659f,0.19325f, +0.307812f,0.936972f,0.165332f, +0.238408f,0.942387f,0.234669f, +0.292411f,0.883524f,0.365897f, +0.235944f,0.851222f,0.468777f, +0.0834983f,0.888208f,0.45179f, +0.120252f,0.948234f,0.293925f, +0.107426f,0.988487f,0.106553f, +-0.0604958f,0.997925f,0.0220282f, +-0.22861f,0.965114f,-0.127644f, +-0.213845f,0.934088f,-0.285919f, +-0.236679f,0.925441f,-0.295876f, +-0.274282f,0.922231f,-0.272506f, +-0.200442f,0.934584f,-0.293896f, +-0.0905439f,0.955043f,-0.282301f, +-0.107977f,0.974204f,-0.198159f, +-0.176859f,0.954188f,-0.241343f, +-0.109412f,0.961464f,-0.252221f, +-0.0832631f,0.934053f,-0.347292f, +-0.0389646f,0.894623f,-0.44512f, +0.0844722f,0.90285f,-0.421576f, +0.278944f,0.884527f,-0.373902f, +0.405411f,0.845478f,-0.347577f, +0.241979f,0.880406f,-0.407837f, +0.10107f,0.917999f,-0.383487f, +0.153454f,0.950374f,-0.270631f, +0.150056f,0.964994f,-0.215103f, +0.116981f,0.964373f,-0.237277f, +0.171185f,0.966068f,-0.19341f, +0.269303f,0.954896f,-0.1251f, +0.246577f,0.939836f,-0.236448f, +0.325998f,0.915178f,-0.237011f, +0.400262f,0.89707f,-0.18723f, +0.540095f,0.838463f,-0.0726465f, +0.4591f,0.888384f,0.000734802f, +0.350121f,0.936701f,0.00262749f, +0.415959f,0.907987f,-0.0503785f, +0.469999f,0.882626f,-0.00849165f, +0.46759f,0.883776f,0.0172864f, +0.444948f,0.895095f,0.0287648f, +0.38429f,0.923043f,-0.0176926f, +-0.184131f,0.893945f,0.408605f, +-0.22256f,0.84592f,0.484651f, +-0.306803f,0.799127f,0.516979f, +-0.327467f,0.825975f,0.458836f, +-0.215523f,0.873324f,0.43687f, +-0.122358f,0.93676f,0.327886f, +-0.214245f,0.969738f,0.117081f, +0.00165628f,0.984816f,0.173596f, +-0.0471807f,0.97232f,0.228838f, +-0.042786f,0.929182f,0.367137f, +0.159108f,0.885534f,0.43648f, +0.0848362f,0.945025f,0.315803f, +-0.0323525f,0.969808f,0.241716f, +-0.0998895f,0.964402f,0.244849f, +-0.0727123f,0.986494f,0.146772f, +0.121392f,0.97688f,0.175982f, +0.260802f,0.928486f,0.264378f, +0.24004f,0.922405f,0.302572f, +0.162896f,0.94112f,0.296239f, +0.158069f,0.936377f,0.313389f, +0.18876f,0.956613f,0.221947f, +0.312407f,0.939867f,0.138025f, +0.450948f,0.870255f,0.198248f, +0.44762f,0.863366f,0.232885f, +0.235953f,0.935784f,0.261983f, +0.128819f,0.928252f,0.348933f, +0.106701f,0.927182f,0.359094f, +0.172918f,0.882203f,0.437968f, +0.183128f,0.868984f,0.459707f, +0.240959f,0.881259f,0.406597f, +0.154256f,0.918617f,0.363797f, +0.0253035f,0.919137f,0.393124f, +0.0182377f,0.964511f,0.263413f, +0.0263571f,0.99964f,0.00499089f, +-0.149002f,0.961331f,-0.231604f, +-0.264821f,0.912849f,-0.310769f, +-0.139498f,0.954507f,-0.263548f, +-0.253683f,0.93262f,-0.25664f, +-0.265231f,0.9626f,-0.0552561f, +-0.114883f,0.993341f,-0.00868247f, +0.0072742f,0.99351f,-0.113513f, +0.112563f,0.957036f,-0.26723f, +0.0621414f,0.905176f,-0.420469f, +0.0722297f,0.880288f,-0.468909f, +0.230329f,0.856327f,-0.462225f, +0.381575f,0.843927f,-0.377079f, +0.221134f,0.891315f,-0.395799f, +0.0308171f,0.923698f,-0.381879f, +0.0400222f,0.939112f,-0.341272f, +0.100477f,0.950816f,-0.293006f, +0.177047f,0.942783f,-0.282515f, +0.133298f,0.926135f,-0.352852f, +0.196525f,0.937661f,-0.286653f, +0.349249f,0.920399f,-0.17576f, +0.344233f,0.909171f,-0.234334f, +0.376056f,0.891226f,-0.25357f, +0.439076f,0.869021f,-0.228069f, +0.419906f,0.900431f,-0.113589f, +0.367672f,0.919513f,-0.13897f, +0.413581f,0.894358f,-0.170514f, +0.417856f,0.905717f,-0.0712231f, +0.442627f,0.896671f,0.00788109f, +0.434719f,0.900071f,0.0298519f, +0.417993f,0.908131f,0.0240916f, +-0.312333f,0.839022f,0.445522f, +-0.320499f,0.80841f,0.493714f, +-0.254519f,0.811123f,0.526593f, +-0.204612f,0.85744f,0.472156f, +-0.178862f,0.910868f,0.371925f, +-0.00702334f,0.926328f,0.376653f, +-0.0708828f,0.954444f,0.289847f, +-0.0771525f,0.977635f,0.195648f, +-0.0751036f,0.961343f,0.264914f, +-0.145577f,0.95681f,0.25164f, +0.127391f,0.9356f,0.329278f, +0.155803f,0.922417f,0.353372f, +-0.0158909f,0.953782f,0.300078f, +-0.071615f,0.974742f,0.211541f, +0.0985463f,0.976728f,0.190504f, +0.112633f,0.991267f,0.0685771f, +0.169574f,0.979892f,0.105153f, +0.189025f,0.96308f,0.191696f, +0.0919285f,0.967342f,0.236218f, +0.12853f,0.953507f,0.272588f, +0.291986f,0.918653f,0.266123f, +0.353363f,0.907675f,0.226407f, +0.385555f,0.89484f,0.224962f, +0.404454f,0.872627f,0.273752f, +0.205311f,0.929054f,0.307743f, +0.110161f,0.942272f,0.316208f, +0.185964f,0.923078f,0.336668f, +0.152054f,0.949861f,0.273212f, +0.185461f,0.938647f,0.290768f, +0.273329f,0.907935f,0.317718f, +0.1744f,0.944567f,0.278169f, +0.0252708f,0.979111f,0.20175f, +0.168508f,0.972599f,0.160178f, +0.171022f,0.978059f,0.118964f, +0.0998107f,0.989636f,0.103241f, +-0.201522f,0.966723f,-0.157591f, +-0.270475f,0.936595f,-0.222784f, +-0.312657f,0.944755f,-0.0984088f, +-0.352005f,0.934773f,-0.0478632f, +-0.0861214f,0.995901f,-0.0276381f, +0.0987576f,0.994369f,-0.0384345f, +0.271502f,0.95802f,-0.0921061f, +0.198786f,0.941001f,-0.273863f, +0.12025f,0.91375f,-0.388073f, +0.19318f,0.901312f,-0.38771f, +0.347672f,0.893681f,-0.283653f, +0.243349f,0.925421f,-0.290477f, +0.0173943f,0.947888f,-0.318129f, +0.037959f,0.944705f,-0.325718f, +0.138906f,0.919468f,-0.36781f, +0.157447f,0.882137f,-0.443897f, +0.187757f,0.895179f,-0.404229f, +0.0607904f,0.891083f,-0.44975f, +0.186006f,0.945946f,-0.265685f, +0.365887f,0.929282f,-0.0506235f, +0.41897f,0.907686f,-0.0238758f, +0.421784f,0.903427f,-0.0769231f, +0.443234f,0.894342f,-0.0608035f, +0.410975f,0.898831f,-0.152323f, +0.386797f,0.913648f,-0.125039f, +0.291947f,0.94823f,-0.125004f, +0.388472f,0.921139f,-0.0243475f, +0.43729f,0.89932f,0.000909095f, +0.438439f,0.898727f,-0.00777216f, +-0.28789f,0.841477f,0.457204f, +-0.335895f,0.843138f,0.419871f, +-0.2812f,0.876582f,0.390553f, +-0.0955224f,0.927302f,0.361922f, +-0.12003f,0.968207f,0.219473f, +-0.0624603f,0.972133f,0.225956f, +0.00876105f,0.944888f,0.327276f, +-0.0188296f,0.951986f,0.305562f, +-0.0880524f,0.955492f,0.28157f, +-0.14211f,0.96142f,0.235533f, +0.0867118f,0.963277f,0.254122f, +0.135173f,0.965034f,0.224584f, +0.150393f,0.96446f,0.217252f, +0.0301773f,0.99954f,0.00289386f, +0.112215f,0.991225f,-0.0698593f, +0.139936f,0.985559f,-0.0953439f, +0.125274f,0.991296f,-0.0404889f, +0.130003f,0.991461f,0.0102436f, +0.104702f,0.992835f,0.0575904f, +0.129192f,0.991077f,0.0328109f, +0.258743f,0.962487f,0.0816753f, +0.358319f,0.917773f,0.171175f, +0.362543f,0.919373f,0.152698f, +0.379026f,0.899795f,0.216122f, +0.252574f,0.930076f,0.266767f, +0.106065f,0.974915f,0.195683f, +0.13953f,0.968709f,0.205267f, +0.207814f,0.946678f,0.246198f, +0.149976f,0.969192f,0.195383f, +0.250422f,0.937237f,0.242644f, +0.308573f,0.924236f,0.224878f, +0.137327f,0.986571f,0.0884273f, +0.176869f,0.981357f,0.0752039f, +0.106914f,0.989761f,0.0945676f, +0.0990876f,0.985862f,0.135123f, +0.0562231f,0.995571f,0.0753513f, +-0.246892f,0.957072f,-0.15185f, +-0.351837f,0.92065f,-0.169157f, +-0.377614f,0.902561f,-0.206862f, +-0.10132f,0.980362f,-0.169188f, +0.0776454f,0.98254f,-0.169077f, +0.306304f,0.93954f,-0.153108f, +0.377181f,0.900422f,-0.216738f, +0.189257f,0.917577f,-0.349621f, +0.154953f,0.928643f,-0.337063f, +0.267717f,0.911458f,-0.312367f, +0.294676f,0.908518f,-0.296244f, +0.0231864f,0.917435f,-0.39721f, +0.0626224f,0.928776f,-0.365314f, +0.222796f,0.906686f,-0.358165f, +0.23143f,0.87959f,-0.415646f, +0.13808f,0.870415f,-0.472559f, +0.025291f,0.910796f,-0.412081f, +-0.0453254f,0.945277f,-0.323104f, +0.159501f,0.971914f,-0.17304f, +0.38445f,0.922508f,-0.0343154f, +0.457445f,0.889226f,-0.00452937f, +0.479545f,0.877417f,-0.0132742f, +0.420093f,0.902443f,-0.0954967f, +0.386091f,0.921349f,-0.0452663f, +0.319162f,0.945851f,-0.059174f, +0.358596f,0.930564f,-0.0738904f, +0.442653f,0.891593f,-0.0955061f, +0.442432f,0.88607f,-0.138327f, +-0.180108f,0.868506f,0.461799f, +-0.252344f,0.891893f,0.375298f, +-0.214515f,0.951228f,0.221693f, +-0.0232238f,0.989215f,0.144618f, +0.0240637f,0.992144f,0.122761f, +-0.119024f,0.992873f,0.00598183f, +-0.113037f,0.992656f,0.0430988f, +-0.0429691f,0.994091f,0.0996822f, +-0.0494378f,0.98881f,0.140751f, +-0.101045f,0.990831f,0.0896877f, +0.0748729f,0.995782f,0.0530223f, +0.173588f,0.976877f,0.124814f, +0.168744f,0.967443f,0.188628f, +0.211654f,0.955224f,0.206761f, +0.198232f,0.976689f,0.0823528f, +0.160641f,0.986993f,-0.00630407f, +0.0575905f,0.994633f,-0.0859521f, +0.0365841f,0.998447f,-0.0420043f, +0.0556411f,0.989086f,0.136432f, +0.127974f,0.973486f,0.1896f, +0.188609f,0.96964f,0.155643f, +0.316079f,0.935031f,0.16066f, +0.368833f,0.913789f,0.170151f, +0.28567f,0.933317f,0.217512f, +0.224877f,0.919424f,0.322631f, +0.173372f,0.927466f,0.331284f, +0.14641f,0.951279f,0.271352f, +0.199618f,0.950197f,0.239328f, +0.194716f,0.961761f,0.192616f, +0.211001f,0.970026f,0.12053f, +0.377145f,0.915922f,0.137289f, +0.173279f,0.983115f,0.0588147f, +0.137169f,0.986854f,0.085457f, +0.167124f,0.984519f,0.0528309f, +0.114693f,0.990538f,-0.0753596f, +0.120988f,0.991416f,-0.0495523f, +-0.0934722f,0.99234f,-0.0807704f, +-0.28812f,0.930265f,-0.227141f, +-0.319246f,0.884516f,-0.340167f, +-0.147049f,0.912977f,-0.380591f, +0.113837f,0.925954f,-0.360071f, +0.286328f,0.873071f,-0.394668f, +0.386305f,0.86841f,-0.310857f, +0.201568f,0.937185f,-0.284702f, +0.165365f,0.953527f,-0.251875f, +0.277218f,0.910704f,-0.306215f, +0.350715f,0.890932f,-0.288511f, +0.130261f,0.920935f,-0.367302f, +-0.00793534f,0.891743f,-0.452472f, +0.173424f,0.90309f,-0.392878f, +0.309572f,0.891597f,-0.330484f, +0.155483f,0.904383f,-0.397387f, +-0.0901615f,0.931774f,-0.351664f, +-0.12522f,0.950283f,-0.285102f, +0.116309f,0.952999f,-0.279758f, +0.314059f,0.900664f,-0.300285f, +0.399484f,0.884115f,-0.242388f, +0.476487f,0.865346f,-0.155359f, +0.461331f,0.87037f,-0.172132f, +0.340659f,0.915541f,-0.213858f, +0.307988f,0.934535f,-0.178292f, +0.356904f,0.924065f,-0.136833f, +0.470016f,0.879468f,-0.0749671f, +0.505067f,0.862447f,-0.0330571f, +-0.15355f,0.924768f,0.348175f, +-0.09321f,0.949622f,0.299215f, +-0.0484808f,0.991662f,0.1194f, +-0.0103305f,0.999605f,0.0261285f, +0.0401188f,0.998578f,0.0351042f, +-0.00661539f,0.998628f,-0.0519471f, +-0.0683745f,0.981776f,-0.177318f, +-0.0856989f,0.966825f,-0.240633f, +-0.0983519f,0.984458f,-0.145499f, +-0.0680709f,0.995572f,-0.0648268f, +0.0777629f,0.996246f,-0.0380386f, +0.0383267f,0.998901f,-0.0269619f, +0.00333347f,0.997094f,0.0761077f, +0.139217f,0.959624f,0.244419f, +0.245721f,0.912381f,0.327386f, +0.246821f,0.907772f,0.339159f, +0.175417f,0.940931f,0.289617f, +-0.027159f,0.9789f,0.202525f, +-0.173424f,0.953226f,0.247557f, +0.0844967f,0.921276f,0.37962f, +0.304261f,0.89366f,0.329845f, +0.31812f,0.923926f,0.21251f, +0.353311f,0.902952f,0.244642f, +0.195957f,0.945525f,0.25997f, +0.182247f,0.923305f,0.338075f, +0.134205f,0.934918f,0.328507f, +0.176553f,0.881734f,0.437463f, +0.22427f,0.87574f,0.42753f, +0.29074f,0.869795f,0.398657f, +0.272684f,0.924539f,0.266215f, +0.39631f,0.892935f,0.213556f, +0.227086f,0.96746f,0.111597f, +0.14196f,0.988195f,0.0576051f, +0.283679f,0.958555f,0.0264133f, +0.216474f,0.969698f,-0.113251f, +0.0386649f,0.982201f,-0.183812f, +-0.0151491f,0.988164f,-0.152652f, +-0.145516f,0.952277f,-0.268316f, +-0.219857f,0.921944f,-0.318875f, +-0.140821f,0.920717f,-0.363936f, +0.13255f,0.932146f,-0.33695f, +0.285156f,0.898104f,-0.334807f, +0.270867f,0.921389f,-0.278701f, +0.136545f,0.958362f,-0.250793f, +0.156889f,0.960437f,-0.230103f, +0.337521f,0.917391f,-0.210889f, +0.340375f,0.909959f,-0.236896f, +0.226521f,0.931852f,-0.283443f, +0.0467156f,0.919678f,-0.389885f, +0.11829f,0.926104f,-0.358244f, +0.284734f,0.910765f,-0.299055f, +0.155007f,0.943096f,-0.294183f, +-0.117772f,0.948884f,-0.29283f, +-0.124268f,0.932168f,-0.340029f, +0.155477f,0.92011f,-0.359477f, +0.348711f,0.859859f,-0.372885f, +0.344156f,0.842199f,-0.415039f, +0.367487f,0.839547f,-0.400142f, +0.45537f,0.851179f,-0.261021f, +0.340771f,0.905445f,-0.25307f, +0.281592f,0.927438f,-0.246101f, +0.270207f,0.930215f,-0.248371f, +0.337751f,0.936799f,-0.0912801f, +0.415821f,0.905383f,0.085868f, +-0.0508816f,0.992949f,0.107064f, +0.00772943f,0.999926f,0.0093874f, +0.0748585f,0.990585f,-0.114623f, +0.0155266f,0.983672f,-0.179298f, +0.0579395f,0.986738f,-0.15163f, +0.0876255f,0.991018f,-0.10102f, +0.0527296f,0.995461f,-0.0792264f, +-0.086898f,0.99085f,-0.103274f, +-0.226618f,0.972789f,-0.0482267f, +-0.175193f,0.983195f,0.0513344f, +0.0267808f,0.994997f,0.0962477f, +0.0618698f,0.991981f,0.110211f, +-0.098328f,0.984739f,0.143601f, +-0.00458312f,0.952299f,0.305132f, +0.173153f,0.913691f,0.367678f, +0.186464f,0.911194f,0.367365f, +0.171431f,0.905309f,0.388622f, +0.0620384f,0.93682f,0.344266f, +-0.143644f,0.960893f,0.23675f, +0.0362541f,0.97893f,0.200951f, +0.349667f,0.904284f,0.244957f, +0.338175f,0.903327f,0.26389f, +0.333852f,0.898218f,0.285914f, +0.192181f,0.948404f,0.252183f, +0.15408f,0.957234f,0.244873f, +0.108314f,0.961372f,0.253046f, +0.0186373f,0.953687f,0.300223f, +0.205839f,0.914416f,0.34853f, +0.331275f,0.886521f,0.323015f, +0.368345f,0.875165f,0.313702f, +0.405591f,0.862022f,0.303997f, +0.335644f,0.884308f,0.324566f, +0.194457f,0.953987f,0.228245f, +0.317589f,0.932139f,0.173936f, +0.34707f,0.93458f,0.0781131f, +0.1429f,0.981779f,-0.125256f, +0.0457434f,0.962864f,-0.266085f, +-0.0800896f,0.929514f,-0.359987f, +-0.224976f,0.908098f,-0.353191f, +-0.16594f,0.929111f,-0.330481f, +0.0749763f,0.957672f,-0.277928f, +0.277052f,0.936424f,-0.215295f, +0.266206f,0.947023f,-0.17967f, +0.192217f,0.96172f,-0.195315f, +0.159333f,0.947925f,-0.275775f, +0.291985f,0.916673f,-0.272864f, +0.390644f,0.893072f,-0.223205f, +0.316013f,0.901654f,-0.295223f, +0.0938304f,0.916417f,-0.38907f, +0.0371906f,0.918056f,-0.394702f, +0.249356f,0.914822f,-0.317682f, +0.159281f,0.933374f,-0.321625f, +-0.034507f,0.927426f,-0.372412f, +-0.0639276f,0.876921f,-0.476365f, +0.150154f,0.87361f,-0.462881f, +0.34577f,0.845394f,-0.407127f, +0.406017f,0.841234f,-0.357037f, +0.322181f,0.876026f,-0.358855f, +0.315882f,0.91236f,-0.260417f, +0.325378f,0.928704f,-0.177873f, +0.281437f,0.937288f,-0.205633f, +0.23991f,0.955112f,-0.173792f, +0.165717f,0.980838f,-0.102443f, +0.16591f,0.98582f,-0.0251575f, +0.188672f,0.97776f,0.0915829f, +0.0994257f,0.983812f,-0.14909f, +0.199087f,0.95198f,-0.232593f, +0.0121878f,0.914874f,-0.403556f, +-0.0234414f,0.930265f,-0.36614f, +-0.038124f,0.972539f,-0.229595f, +-0.0300917f,0.999515f,-0.00796094f, +-0.092201f,0.984658f,0.148144f, +-0.315366f,0.938181f,0.142688f, +-0.138968f,0.942311f,0.304528f, +0.0277459f,0.977812f,0.207641f, +0.0496201f,0.98101f,0.187502f, +-0.256039f,0.940975f,0.22138f, +-0.0796386f,0.864833f,0.495703f, +0.172206f,0.836979f,0.519434f, +0.218401f,0.8652f,0.451365f, +0.211231f,0.888948f,0.406391f, +0.153922f,0.942863f,0.295494f, +-0.0705923f,0.983817f,0.164685f, +0.0334153f,0.99603f,0.0825054f, +0.282635f,0.9535f,0.104667f, +0.322121f,0.91103f,0.257413f, +0.32296f,0.89395f,0.310726f, +0.263681f,0.921808f,0.284152f, +0.145976f,0.970498f,0.191897f, +0.110214f,0.967993f,0.225482f, +0.0100073f,0.970397f,0.241307f, +0.231259f,0.94984f,0.210532f, +0.350804f,0.929639f,0.112731f, +0.388908f,0.908557f,0.152559f, +0.325259f,0.933029f,0.153831f, +0.358244f,0.845843f,0.395235f, +0.245479f,0.88292f,0.400241f, +0.340078f,0.880829f,0.329372f, +0.448713f,0.860203f,0.242295f, +0.291253f,0.956268f,-0.0268833f, +0.174446f,0.957532f,-0.229565f, +-0.0246181f,0.920367f,-0.390281f, +-0.230596f,0.878986f,-0.417383f, +-0.188847f,0.897269f,-0.399054f, +0.0175328f,0.926292f,-0.376398f, +0.23985f,0.925856f,-0.291997f, +0.22945f,0.938275f,-0.258829f, +0.212396f,0.953082f,-0.21569f, +0.229329f,0.940641f,-0.250204f, +0.284501f,0.899212f,-0.33238f, +0.376241f,0.875275f,-0.30387f, +0.33476f,0.887829f,-0.315744f, +0.163808f,0.925647f,-0.341094f, +0.00890663f,0.895805f,-0.444357f, +0.214972f,0.896442f,-0.38753f, +0.17587f,0.912162f,-0.370177f, +0.075136f,0.903308f,-0.422362f, +-0.00910936f,0.832148f,-0.55448f, +0.080579f,0.825188f,-0.559082f, +0.296201f,0.838595f,-0.457191f, +0.316267f,0.8627f,-0.39462f, +0.301959f,0.9215f,-0.24425f, +0.239667f,0.953185f,-0.184387f, +0.359606f,0.929321f,-0.0839473f, +0.264487f,0.941897f,-0.207066f, +0.184815f,0.971569f,-0.147976f, +0.141833f,0.988976f,-0.0425335f, +0.112364f,0.992816f,-0.0411276f, +}; + +btScalar Landscape04Tex[] = { +0.507813f,0.25f, +0.507813f,0.242188f, +0.515625f,0.25f, +0.515625f,0.242188f, +0.523438f,0.25f, +0.523438f,0.242188f, +0.53125f,0.25f, +0.53125f,0.242188f, +0.539063f,0.25f, +0.539063f,0.242188f, +0.546875f,0.25f, +0.546875f,0.242188f, +0.554688f,0.25f, +0.554688f,0.242188f, +0.5625f,0.25f, +0.5625f,0.242188f, +0.570313f,0.25f, +0.570313f,0.242188f, +0.578125f,0.25f, +0.578125f,0.242188f, +0.585938f,0.25f, +0.585938f,0.242188f, +0.59375f,0.25f, +0.59375f,0.242188f, +0.601563f,0.25f, +0.601563f,0.242188f, +0.609375f,0.25f, +0.609375f,0.242188f, +0.617188f,0.25f, +0.617188f,0.242188f, +0.625f,0.25f, +0.625f,0.242188f, +0.632813f,0.25f, +0.632813f,0.242188f, +0.640625f,0.25f, +0.640625f,0.242188f, +0.648438f,0.25f, +0.648438f,0.242188f, +0.65625f,0.25f, +0.65625f,0.242188f, +0.664063f,0.25f, +0.664063f,0.242188f, +0.671875f,0.25f, +0.671875f,0.242188f, +0.679688f,0.25f, +0.679688f,0.242188f, +0.6875f,0.25f, +0.6875f,0.242188f, +0.695313f,0.25f, +0.695313f,0.242188f, +0.703125f,0.25f, +0.703125f,0.242188f, +0.710938f,0.25f, +0.710938f,0.242188f, +0.71875f,0.25f, +0.71875f,0.242188f, +0.726563f,0.25f, +0.726563f,0.242188f, +0.734375f,0.25f, +0.734375f,0.242188f, +0.742188f,0.25f, +0.742188f,0.242188f, +0.75f,0.25f, +0.75f,0.242188f, +0.757813f,0.25f, +0.757813f,0.242188f, +0.765625f,0.25f, +0.765625f,0.242188f, +0.773438f,0.25f, +0.773438f,0.242188f, +0.78125f,0.25f, +0.78125f,0.242188f, +0.789063f,0.25f, +0.789063f,0.242188f, +0.796875f,0.25f, +0.796875f,0.242188f, +0.804688f,0.25f, +0.804688f,0.242188f, +0.8125f,0.25f, +0.8125f,0.242188f, +0.820313f,0.25f, +0.820313f,0.242188f, +0.828125f,0.25f, +0.828125f,0.242188f, +0.835938f,0.25f, +0.835938f,0.242188f, +0.84375f,0.25f, +0.84375f,0.242188f, +0.851563f,0.25f, +0.851563f,0.242188f, +0.859375f,0.25f, +0.859375f,0.242188f, +0.867188f,0.25f, +0.867188f,0.242188f, +0.875f,0.25f, +0.875f,0.242188f, +0.882813f,0.25f, +0.882813f,0.242188f, +0.890625f,0.25f, +0.890625f,0.242188f, +0.898438f,0.25f, +0.898438f,0.242188f, +0.90625f,0.25f, +0.90625f,0.242188f, +0.914063f,0.25f, +0.914063f,0.242188f, +0.921875f,0.25f, +0.921875f,0.242188f, +0.929688f,0.25f, +0.929688f,0.242188f, +0.9375f,0.25f, +0.9375f,0.242188f, +0.945313f,0.25f, +0.945313f,0.242188f, +0.953125f,0.25f, +0.953125f,0.242188f, +0.960938f,0.25f, +0.960938f,0.242188f, +0.96875f,0.25f, +0.96875f,0.242188f, +0.976563f,0.25f, +0.976563f,0.242188f, +0.984375f,0.25f, +0.984375f,0.242188f, +0.992188f,0.25f, +0.992188f,0.242188f, +1.0f,0.25f, +1.0f,0.242188f, +0.507813f,0.257813f, +0.515625f,0.257813f, +0.523438f,0.257813f, +0.53125f,0.257813f, +0.539063f,0.257813f, +0.546875f,0.257813f, +0.554688f,0.257813f, +0.5625f,0.257813f, +0.570313f,0.257813f, +0.578125f,0.257813f, +0.585938f,0.257813f, +0.59375f,0.257813f, +0.601563f,0.257813f, +0.609375f,0.257813f, +0.617188f,0.257813f, +0.625f,0.257813f, +0.632813f,0.257813f, +0.640625f,0.257813f, +0.648438f,0.257813f, +0.65625f,0.257813f, +0.664063f,0.257813f, +0.671875f,0.257813f, +0.679688f,0.257813f, +0.6875f,0.257813f, +0.695313f,0.257813f, +0.703125f,0.257813f, +0.710938f,0.257813f, +0.71875f,0.257813f, +0.726563f,0.257813f, +0.734375f,0.257813f, +0.742188f,0.257813f, +0.75f,0.257813f, +0.757813f,0.257813f, +0.765625f,0.257813f, +0.773438f,0.257813f, +0.78125f,0.257813f, +0.789063f,0.257813f, +0.796875f,0.257813f, +0.804688f,0.257813f, +0.8125f,0.257813f, +0.820313f,0.257813f, +0.828125f,0.257813f, +0.835938f,0.257813f, +0.84375f,0.257813f, +0.851563f,0.257813f, +0.859375f,0.257813f, +0.867188f,0.257813f, +0.875f,0.257813f, +0.882813f,0.257813f, +0.890625f,0.257813f, +0.898438f,0.257813f, +0.90625f,0.257813f, +0.914063f,0.257813f, +0.921875f,0.257813f, +0.929688f,0.257813f, +0.9375f,0.257813f, +0.945313f,0.257813f, +0.953125f,0.257813f, +0.960938f,0.257813f, +0.96875f,0.257813f, +0.976563f,0.257813f, +0.984375f,0.257813f, +0.992188f,0.257813f, +1.0f,0.257813f, +0.507813f,0.265625f, +0.515625f,0.265625f, +0.523438f,0.265625f, +0.53125f,0.265625f, +0.539063f,0.265625f, +0.546875f,0.265625f, +0.554688f,0.265625f, +0.5625f,0.265625f, +0.570313f,0.265625f, +0.578125f,0.265625f, +0.585938f,0.265625f, +0.59375f,0.265625f, +0.601563f,0.265625f, +0.609375f,0.265625f, +0.617188f,0.265625f, +0.625f,0.265625f, +0.632813f,0.265625f, +0.640625f,0.265625f, +0.648438f,0.265625f, +0.65625f,0.265625f, +0.664063f,0.265625f, +0.671875f,0.265625f, +0.679688f,0.265625f, +0.6875f,0.265625f, +0.695313f,0.265625f, +0.703125f,0.265625f, +0.710938f,0.265625f, +0.71875f,0.265625f, +0.726563f,0.265625f, +0.734375f,0.265625f, +0.742188f,0.265625f, +0.75f,0.265625f, +0.757813f,0.265625f, +0.765625f,0.265625f, +0.773438f,0.265625f, +0.78125f,0.265625f, +0.789063f,0.265625f, +0.796875f,0.265625f, +0.804688f,0.265625f, +0.8125f,0.265625f, +0.820313f,0.265625f, +0.828125f,0.265625f, +0.835938f,0.265625f, +0.84375f,0.265625f, +0.851563f,0.265625f, +0.859375f,0.265625f, +0.867188f,0.265625f, +0.875f,0.265625f, +0.882813f,0.265625f, +0.890625f,0.265625f, +0.898438f,0.265625f, +0.90625f,0.265625f, +0.914063f,0.265625f, +0.921875f,0.265625f, +0.929688f,0.265625f, +0.9375f,0.265625f, +0.945313f,0.265625f, +0.953125f,0.265625f, +0.960938f,0.265625f, +0.96875f,0.265625f, +0.976563f,0.265625f, +0.984375f,0.265625f, +0.992188f,0.265625f, +1.0f,0.265625f, +0.507813f,0.273438f, +0.515625f,0.273438f, +0.523438f,0.273438f, +0.53125f,0.273438f, +0.539063f,0.273438f, +0.546875f,0.273438f, +0.554688f,0.273438f, +0.5625f,0.273438f, +0.570313f,0.273438f, +0.578125f,0.273438f, +0.585938f,0.273438f, +0.59375f,0.273438f, +0.601563f,0.273438f, +0.609375f,0.273438f, +0.617188f,0.273438f, +0.625f,0.273438f, +0.632813f,0.273438f, +0.640625f,0.273438f, +0.648438f,0.273438f, +0.65625f,0.273438f, +0.664063f,0.273438f, +0.671875f,0.273438f, +0.679688f,0.273438f, +0.6875f,0.273438f, +0.695313f,0.273438f, +0.703125f,0.273438f, +0.710938f,0.273438f, +0.71875f,0.273438f, +0.726563f,0.273438f, +0.734375f,0.273438f, +0.742188f,0.273438f, +0.75f,0.273438f, +0.757813f,0.273438f, +0.765625f,0.273438f, +0.773438f,0.273438f, +0.78125f,0.273438f, +0.789063f,0.273438f, +0.796875f,0.273438f, +0.804688f,0.273438f, +0.8125f,0.273438f, +0.820313f,0.273438f, +0.828125f,0.273438f, +0.835938f,0.273438f, +0.84375f,0.273438f, +0.851563f,0.273438f, +0.859375f,0.273438f, +0.867188f,0.273438f, +0.875f,0.273438f, +0.882813f,0.273438f, +0.890625f,0.273438f, +0.898438f,0.273438f, +0.90625f,0.273438f, +0.914063f,0.273438f, +0.921875f,0.273438f, +0.929688f,0.273438f, +0.9375f,0.273438f, +0.945313f,0.273438f, +0.953125f,0.273438f, +0.960938f,0.273438f, +0.96875f,0.273438f, +0.976563f,0.273438f, +0.984375f,0.273438f, +0.992188f,0.273438f, +1.0f,0.273438f, +0.507813f,0.28125f, +0.515625f,0.28125f, +0.523438f,0.28125f, +0.53125f,0.28125f, +0.539063f,0.28125f, +0.546875f,0.28125f, +0.554688f,0.28125f, +0.5625f,0.28125f, +0.570313f,0.28125f, +0.578125f,0.28125f, +0.585938f,0.28125f, +0.59375f,0.28125f, +0.601563f,0.28125f, +0.609375f,0.28125f, +0.617188f,0.28125f, +0.625f,0.28125f, +0.632813f,0.28125f, +0.640625f,0.28125f, +0.648438f,0.28125f, +0.65625f,0.28125f, +0.664063f,0.28125f, +0.671875f,0.28125f, +0.679688f,0.28125f, +0.6875f,0.28125f, +0.695313f,0.28125f, +0.703125f,0.28125f, +0.710938f,0.28125f, +0.71875f,0.28125f, +0.726563f,0.28125f, +0.734375f,0.28125f, +0.742188f,0.28125f, +0.75f,0.28125f, +0.757813f,0.28125f, +0.765625f,0.28125f, +0.773438f,0.28125f, +0.78125f,0.28125f, +0.789063f,0.28125f, +0.796875f,0.28125f, +0.804688f,0.28125f, +0.8125f,0.28125f, +0.820313f,0.28125f, +0.828125f,0.28125f, +0.835938f,0.28125f, +0.84375f,0.28125f, +0.851563f,0.28125f, +0.859375f,0.28125f, +0.867188f,0.28125f, +0.875f,0.28125f, +0.882813f,0.28125f, +0.890625f,0.28125f, +0.898438f,0.28125f, +0.90625f,0.28125f, +0.914063f,0.28125f, +0.921875f,0.28125f, +0.929688f,0.28125f, +0.9375f,0.28125f, +0.945313f,0.28125f, +0.953125f,0.28125f, +0.960938f,0.28125f, +0.96875f,0.28125f, +0.976563f,0.28125f, +0.984375f,0.28125f, +0.992188f,0.28125f, +1.0f,0.28125f, +0.507813f,0.289063f, +0.515625f,0.289063f, +0.523438f,0.289063f, +0.53125f,0.289063f, +0.539063f,0.289063f, +0.546875f,0.289063f, +0.554688f,0.289063f, +0.5625f,0.289063f, +0.570313f,0.289063f, +0.578125f,0.289063f, +0.585938f,0.289063f, +0.59375f,0.289063f, +0.601563f,0.289063f, +0.609375f,0.289063f, +0.617188f,0.289063f, +0.625f,0.289063f, +0.632813f,0.289063f, +0.640625f,0.289063f, +0.648438f,0.289063f, +0.65625f,0.289063f, +0.664063f,0.289063f, +0.671875f,0.289063f, +0.679688f,0.289063f, +0.6875f,0.289063f, +0.695313f,0.289063f, +0.703125f,0.289063f, +0.710938f,0.289063f, +0.71875f,0.289063f, +0.726563f,0.289063f, +0.734375f,0.289063f, +0.742188f,0.289063f, +0.75f,0.289063f, +0.757813f,0.289063f, +0.765625f,0.289063f, +0.773438f,0.289063f, +0.78125f,0.289063f, +0.789063f,0.289063f, +0.796875f,0.289063f, +0.804688f,0.289063f, +0.8125f,0.289063f, +0.820313f,0.289063f, +0.828125f,0.289063f, +0.835938f,0.289063f, +0.84375f,0.289063f, +0.851563f,0.289063f, +0.859375f,0.289063f, +0.867188f,0.289063f, +0.875f,0.289063f, +0.882813f,0.289063f, +0.890625f,0.289063f, +0.898438f,0.289063f, +0.90625f,0.289063f, +0.914063f,0.289063f, +0.921875f,0.289063f, +0.929688f,0.289063f, +0.9375f,0.289063f, +0.945313f,0.289063f, +0.953125f,0.289063f, +0.960938f,0.289063f, +0.96875f,0.289063f, +0.976563f,0.289063f, +0.984375f,0.289063f, +0.992188f,0.289063f, +1.0f,0.289063f, +0.507813f,0.296875f, +0.515625f,0.296875f, +0.523438f,0.296875f, +0.53125f,0.296875f, +0.539063f,0.296875f, +0.546875f,0.296875f, +0.554688f,0.296875f, +0.5625f,0.296875f, +0.570313f,0.296875f, +0.578125f,0.296875f, +0.585938f,0.296875f, +0.59375f,0.296875f, +0.601563f,0.296875f, +0.609375f,0.296875f, +0.617188f,0.296875f, +0.625f,0.296875f, +0.632813f,0.296875f, +0.640625f,0.296875f, +0.648438f,0.296875f, +0.65625f,0.296875f, +0.664063f,0.296875f, +0.671875f,0.296875f, +0.679688f,0.296875f, +0.6875f,0.296875f, +0.695313f,0.296875f, +0.703125f,0.296875f, +0.710938f,0.296875f, +0.71875f,0.296875f, +0.726563f,0.296875f, +0.734375f,0.296875f, +0.742188f,0.296875f, +0.75f,0.296875f, +0.757813f,0.296875f, +0.765625f,0.296875f, +0.773438f,0.296875f, +0.78125f,0.296875f, +0.789063f,0.296875f, +0.796875f,0.296875f, +0.804688f,0.296875f, +0.8125f,0.296875f, +0.820313f,0.296875f, +0.828125f,0.296875f, +0.835938f,0.296875f, +0.84375f,0.296875f, +0.851563f,0.296875f, +0.859375f,0.296875f, +0.867188f,0.296875f, +0.875f,0.296875f, +0.882813f,0.296875f, +0.890625f,0.296875f, +0.898438f,0.296875f, +0.90625f,0.296875f, +0.914063f,0.296875f, +0.921875f,0.296875f, +0.929688f,0.296875f, +0.9375f,0.296875f, +0.945313f,0.296875f, +0.953125f,0.296875f, +0.960938f,0.296875f, +0.96875f,0.296875f, +0.976563f,0.296875f, +0.984375f,0.296875f, +0.992188f,0.296875f, +1.0f,0.296875f, +0.507813f,0.304688f, +0.515625f,0.304688f, +0.523438f,0.304688f, +0.53125f,0.304688f, +0.539063f,0.304688f, +0.546875f,0.304688f, +0.554688f,0.304688f, +0.5625f,0.304688f, +0.570313f,0.304688f, +0.578125f,0.304688f, +0.585938f,0.304688f, +0.59375f,0.304688f, +0.601563f,0.304688f, +0.609375f,0.304688f, +0.617188f,0.304688f, +0.625f,0.304688f, +0.632813f,0.304688f, +0.640625f,0.304688f, +0.648438f,0.304688f, +0.65625f,0.304688f, +0.664063f,0.304688f, +0.671875f,0.304688f, +0.679688f,0.304688f, +0.6875f,0.304688f, +0.695313f,0.304688f, +0.703125f,0.304688f, +0.710938f,0.304688f, +0.71875f,0.304688f, +0.726563f,0.304688f, +0.734375f,0.304688f, +0.742188f,0.304688f, +0.75f,0.304688f, +0.757813f,0.304688f, +0.765625f,0.304688f, +0.773438f,0.304688f, +0.78125f,0.304688f, +0.789063f,0.304688f, +0.796875f,0.304688f, +0.804688f,0.304688f, +0.8125f,0.304688f, +0.820313f,0.304688f, +0.828125f,0.304688f, +0.835938f,0.304688f, +0.84375f,0.304688f, +0.851563f,0.304688f, +0.859375f,0.304688f, +0.867188f,0.304688f, +0.875f,0.304688f, +0.882813f,0.304688f, +0.890625f,0.304688f, +0.898438f,0.304688f, +0.90625f,0.304688f, +0.914063f,0.304688f, +0.921875f,0.304688f, +0.929688f,0.304688f, +0.9375f,0.304688f, +0.945313f,0.304688f, +0.953125f,0.304688f, +0.960938f,0.304688f, +0.96875f,0.304688f, +0.976563f,0.304688f, +0.984375f,0.304688f, +0.992188f,0.304688f, +1.0f,0.304688f, +0.507813f,0.3125f, +0.515625f,0.3125f, +0.523438f,0.3125f, +0.53125f,0.3125f, +0.539063f,0.3125f, +0.546875f,0.3125f, +0.554688f,0.3125f, +0.5625f,0.3125f, +0.570313f,0.3125f, +0.578125f,0.3125f, +0.585938f,0.3125f, +0.59375f,0.3125f, +0.601563f,0.3125f, +0.609375f,0.3125f, +0.617188f,0.3125f, +0.625f,0.3125f, +0.632813f,0.3125f, +0.640625f,0.3125f, +0.648438f,0.3125f, +0.65625f,0.3125f, +0.664063f,0.3125f, +0.671875f,0.3125f, +0.679688f,0.3125f, +0.6875f,0.3125f, +0.695313f,0.3125f, +0.703125f,0.3125f, +0.710938f,0.3125f, +0.71875f,0.3125f, +0.726563f,0.3125f, +0.734375f,0.3125f, +0.742188f,0.3125f, +0.75f,0.3125f, +0.757813f,0.3125f, +0.765625f,0.3125f, +0.773438f,0.3125f, +0.78125f,0.3125f, +0.789063f,0.3125f, +0.796875f,0.3125f, +0.804688f,0.3125f, +0.8125f,0.3125f, +0.820313f,0.3125f, +0.828125f,0.3125f, +0.835938f,0.3125f, +0.84375f,0.3125f, +0.851563f,0.3125f, +0.859375f,0.3125f, +0.867188f,0.3125f, +0.875f,0.3125f, +0.882813f,0.3125f, +0.890625f,0.3125f, +0.898438f,0.3125f, +0.90625f,0.3125f, +0.914063f,0.3125f, +0.921875f,0.3125f, +0.929688f,0.3125f, +0.9375f,0.3125f, +0.945313f,0.3125f, +0.953125f,0.3125f, +0.960938f,0.3125f, +0.96875f,0.3125f, +0.976563f,0.3125f, +0.984375f,0.3125f, +0.992188f,0.3125f, +1.0f,0.3125f, +0.507813f,0.320313f, +0.515625f,0.320313f, +0.523438f,0.320313f, +0.53125f,0.320313f, +0.539063f,0.320313f, +0.546875f,0.320313f, +0.554688f,0.320313f, +0.5625f,0.320313f, +0.570313f,0.320313f, +0.578125f,0.320313f, +0.585938f,0.320313f, +0.59375f,0.320313f, +0.601563f,0.320313f, +0.609375f,0.320313f, +0.617188f,0.320313f, +0.625f,0.320313f, +0.632813f,0.320313f, +0.640625f,0.320313f, +0.648438f,0.320313f, +0.65625f,0.320313f, +0.664063f,0.320313f, +0.671875f,0.320313f, +0.679688f,0.320313f, +0.6875f,0.320313f, +0.695313f,0.320313f, +0.703125f,0.320313f, +0.710938f,0.320313f, +0.71875f,0.320313f, +0.726563f,0.320313f, +0.734375f,0.320313f, +0.742188f,0.320313f, +0.75f,0.320313f, +0.757813f,0.320313f, +0.765625f,0.320313f, +0.773438f,0.320313f, +0.78125f,0.320313f, +0.789063f,0.320313f, +0.796875f,0.320313f, +0.804688f,0.320313f, +0.8125f,0.320313f, +0.820313f,0.320313f, +0.828125f,0.320313f, +0.835938f,0.320313f, +0.84375f,0.320313f, +0.851563f,0.320313f, +0.859375f,0.320313f, +0.867188f,0.320313f, +0.875f,0.320313f, +0.882813f,0.320313f, +0.890625f,0.320313f, +0.898438f,0.320313f, +0.90625f,0.320313f, +0.914063f,0.320313f, +0.921875f,0.320313f, +0.929688f,0.320313f, +0.9375f,0.320313f, +0.945313f,0.320313f, +0.953125f,0.320313f, +0.960938f,0.320313f, +0.96875f,0.320313f, +0.976563f,0.320313f, +0.984375f,0.320313f, +0.992188f,0.320313f, +1.0f,0.320313f, +0.507813f,0.328125f, +0.515625f,0.328125f, +0.523438f,0.328125f, +0.53125f,0.328125f, +0.539063f,0.328125f, +0.546875f,0.328125f, +0.554688f,0.328125f, +0.5625f,0.328125f, +0.570313f,0.328125f, +0.578125f,0.328125f, +0.585938f,0.328125f, +0.59375f,0.328125f, +0.601563f,0.328125f, +0.609375f,0.328125f, +0.617188f,0.328125f, +0.625f,0.328125f, +0.632813f,0.328125f, +0.640625f,0.328125f, +0.648438f,0.328125f, +0.65625f,0.328125f, +0.664063f,0.328125f, +0.671875f,0.328125f, +0.679688f,0.328125f, +0.6875f,0.328125f, +0.695313f,0.328125f, +0.703125f,0.328125f, +0.710938f,0.328125f, +0.71875f,0.328125f, +0.726563f,0.328125f, +0.734375f,0.328125f, +0.742188f,0.328125f, +0.75f,0.328125f, +0.757813f,0.328125f, +0.765625f,0.328125f, +0.773438f,0.328125f, +0.78125f,0.328125f, +0.789063f,0.328125f, +0.796875f,0.328125f, +0.804688f,0.328125f, +0.8125f,0.328125f, +0.820313f,0.328125f, +0.828125f,0.328125f, +0.835938f,0.328125f, +0.84375f,0.328125f, +0.851563f,0.328125f, +0.859375f,0.328125f, +0.867188f,0.328125f, +0.875f,0.328125f, +0.882813f,0.328125f, +0.890625f,0.328125f, +0.898438f,0.328125f, +0.90625f,0.328125f, +0.914063f,0.328125f, +0.921875f,0.328125f, +0.929688f,0.328125f, +0.9375f,0.328125f, +0.945313f,0.328125f, +0.953125f,0.328125f, +0.960938f,0.328125f, +0.96875f,0.328125f, +0.976563f,0.328125f, +0.984375f,0.328125f, +0.992188f,0.328125f, +1.0f,0.328125f, +0.507813f,0.335938f, +0.515625f,0.335938f, +0.523438f,0.335938f, +0.53125f,0.335938f, +0.539063f,0.335938f, +0.546875f,0.335938f, +0.554688f,0.335938f, +0.5625f,0.335938f, +0.570313f,0.335938f, +0.578125f,0.335938f, +0.585938f,0.335938f, +0.59375f,0.335938f, +0.601563f,0.335938f, +0.609375f,0.335938f, +0.617188f,0.335938f, +0.625f,0.335938f, +0.632813f,0.335938f, +0.640625f,0.335938f, +0.648438f,0.335938f, +0.65625f,0.335938f, +0.664063f,0.335938f, +0.671875f,0.335938f, +0.679688f,0.335938f, +0.6875f,0.335938f, +0.695313f,0.335938f, +0.703125f,0.335938f, +0.710938f,0.335938f, +0.71875f,0.335938f, +0.726563f,0.335938f, +0.734375f,0.335938f, +0.742188f,0.335938f, +0.75f,0.335938f, +0.757813f,0.335938f, +0.765625f,0.335938f, +0.773438f,0.335938f, +0.78125f,0.335938f, +0.789063f,0.335938f, +0.796875f,0.335938f, +0.804688f,0.335938f, +0.8125f,0.335938f, +0.820313f,0.335938f, +0.828125f,0.335938f, +0.835938f,0.335938f, +0.84375f,0.335938f, +0.851563f,0.335938f, +0.859375f,0.335938f, +0.867188f,0.335938f, +0.875f,0.335938f, +0.882813f,0.335938f, +0.890625f,0.335938f, +0.898438f,0.335938f, +0.90625f,0.335938f, +0.914063f,0.335938f, +0.921875f,0.335938f, +0.929688f,0.335938f, +0.9375f,0.335938f, +0.945313f,0.335938f, +0.953125f,0.335938f, +0.960938f,0.335938f, +0.96875f,0.335938f, +0.976563f,0.335938f, +0.984375f,0.335938f, +0.992188f,0.335938f, +1.0f,0.335938f, +0.507813f,0.34375f, +0.515625f,0.34375f, +0.523438f,0.34375f, +0.53125f,0.34375f, +0.539063f,0.34375f, +0.546875f,0.34375f, +0.554688f,0.34375f, +0.5625f,0.34375f, +0.570313f,0.34375f, +0.578125f,0.34375f, +0.585938f,0.34375f, +0.59375f,0.34375f, +0.601563f,0.34375f, +0.609375f,0.34375f, +0.617188f,0.34375f, +0.625f,0.34375f, +0.632813f,0.34375f, +0.640625f,0.34375f, +0.648438f,0.34375f, +0.65625f,0.34375f, +0.664063f,0.34375f, +0.671875f,0.34375f, +0.679688f,0.34375f, +0.6875f,0.34375f, +0.695313f,0.34375f, +0.703125f,0.34375f, +0.710938f,0.34375f, +0.71875f,0.34375f, +0.726563f,0.34375f, +0.734375f,0.34375f, +0.742188f,0.34375f, +0.75f,0.34375f, +0.757813f,0.34375f, +0.765625f,0.34375f, +0.773438f,0.34375f, +0.78125f,0.34375f, +0.789063f,0.34375f, +0.796875f,0.34375f, +0.804688f,0.34375f, +0.8125f,0.34375f, +0.820313f,0.34375f, +0.828125f,0.34375f, +0.835938f,0.34375f, +0.84375f,0.34375f, +0.851563f,0.34375f, +0.859375f,0.34375f, +0.867188f,0.34375f, +0.875f,0.34375f, +0.882813f,0.34375f, +0.890625f,0.34375f, +0.898438f,0.34375f, +0.90625f,0.34375f, +0.914063f,0.34375f, +0.921875f,0.34375f, +0.929688f,0.34375f, +0.9375f,0.34375f, +0.945313f,0.34375f, +0.953125f,0.34375f, +0.960938f,0.34375f, +0.96875f,0.34375f, +0.976563f,0.34375f, +0.984375f,0.34375f, +0.992188f,0.34375f, +1.0f,0.34375f, +0.507813f,0.351563f, +0.515625f,0.351563f, +0.523438f,0.351563f, +0.53125f,0.351563f, +0.539063f,0.351563f, +0.546875f,0.351563f, +0.554688f,0.351563f, +0.5625f,0.351563f, +0.570313f,0.351563f, +0.578125f,0.351563f, +0.585938f,0.351563f, +0.59375f,0.351563f, +0.601563f,0.351563f, +0.609375f,0.351563f, +0.617188f,0.351563f, +0.625f,0.351563f, +0.632813f,0.351563f, +0.640625f,0.351563f, +0.648438f,0.351563f, +0.65625f,0.351563f, +0.664063f,0.351563f, +0.671875f,0.351563f, +0.679688f,0.351563f, +0.6875f,0.351563f, +0.695313f,0.351563f, +0.703125f,0.351563f, +0.710938f,0.351563f, +0.71875f,0.351563f, +0.726563f,0.351563f, +0.734375f,0.351563f, +0.742188f,0.351563f, +0.75f,0.351563f, +0.757813f,0.351563f, +0.765625f,0.351563f, +0.773438f,0.351563f, +0.78125f,0.351563f, +0.789063f,0.351563f, +0.796875f,0.351563f, +0.804688f,0.351563f, +0.8125f,0.351563f, +0.820313f,0.351563f, +0.828125f,0.351563f, +0.835938f,0.351563f, +0.84375f,0.351563f, +0.851563f,0.351563f, +0.859375f,0.351563f, +0.867188f,0.351563f, +0.875f,0.351563f, +0.882813f,0.351563f, +0.890625f,0.351563f, +0.898438f,0.351563f, +0.90625f,0.351563f, +0.914063f,0.351563f, +0.921875f,0.351563f, +0.929688f,0.351563f, +0.9375f,0.351563f, +0.945313f,0.351563f, +0.953125f,0.351563f, +0.960938f,0.351563f, +0.96875f,0.351563f, +0.976563f,0.351563f, +0.984375f,0.351563f, +0.992188f,0.351563f, +1.0f,0.351563f, +0.507813f,0.359375f, +0.515625f,0.359375f, +0.523438f,0.359375f, +0.53125f,0.359375f, +0.539063f,0.359375f, +0.546875f,0.359375f, +0.554688f,0.359375f, +0.5625f,0.359375f, +0.570313f,0.359375f, +0.578125f,0.359375f, +0.585938f,0.359375f, +0.59375f,0.359375f, +0.601563f,0.359375f, +0.609375f,0.359375f, +0.617188f,0.359375f, +0.625f,0.359375f, +0.632813f,0.359375f, +0.640625f,0.359375f, +0.648438f,0.359375f, +0.65625f,0.359375f, +0.664063f,0.359375f, +0.671875f,0.359375f, +0.679688f,0.359375f, +0.6875f,0.359375f, +0.695313f,0.359375f, +0.703125f,0.359375f, +0.710938f,0.359375f, +0.71875f,0.359375f, +0.726563f,0.359375f, +0.734375f,0.359375f, +0.742188f,0.359375f, +0.75f,0.359375f, +0.757813f,0.359375f, +0.765625f,0.359375f, +0.773438f,0.359375f, +0.78125f,0.359375f, +0.789063f,0.359375f, +0.796875f,0.359375f, +0.804688f,0.359375f, +0.8125f,0.359375f, +0.820313f,0.359375f, +0.828125f,0.359375f, +0.835938f,0.359375f, +0.84375f,0.359375f, +0.851563f,0.359375f, +0.859375f,0.359375f, +0.867188f,0.359375f, +0.875f,0.359375f, +0.882813f,0.359375f, +0.890625f,0.359375f, +0.898438f,0.359375f, +0.90625f,0.359375f, +0.914063f,0.359375f, +0.921875f,0.359375f, +0.929688f,0.359375f, +0.9375f,0.359375f, +0.945313f,0.359375f, +0.953125f,0.359375f, +0.960938f,0.359375f, +0.96875f,0.359375f, +0.976563f,0.359375f, +0.984375f,0.359375f, +0.992188f,0.359375f, +1.0f,0.359375f, +0.507813f,0.367188f, +0.515625f,0.367188f, +0.523438f,0.367188f, +0.53125f,0.367188f, +0.539063f,0.367188f, +0.546875f,0.367188f, +0.554688f,0.367188f, +0.5625f,0.367188f, +0.570313f,0.367188f, +0.578125f,0.367188f, +0.585938f,0.367188f, +0.59375f,0.367188f, +0.601563f,0.367188f, +0.609375f,0.367188f, +0.617188f,0.367188f, +0.625f,0.367188f, +0.632813f,0.367188f, +0.640625f,0.367188f, +0.648438f,0.367188f, +0.65625f,0.367188f, +0.664063f,0.367188f, +0.671875f,0.367188f, +0.679688f,0.367188f, +0.6875f,0.367188f, +0.695313f,0.367188f, +0.703125f,0.367188f, +0.710938f,0.367188f, +0.71875f,0.367188f, +0.726563f,0.367188f, +0.734375f,0.367188f, +0.742188f,0.367188f, +0.75f,0.367188f, +0.757813f,0.367188f, +0.765625f,0.367188f, +0.773438f,0.367188f, +0.78125f,0.367188f, +0.789063f,0.367188f, +0.796875f,0.367188f, +0.804688f,0.367188f, +0.8125f,0.367188f, +0.820313f,0.367188f, +0.828125f,0.367188f, +0.835938f,0.367188f, +0.84375f,0.367188f, +0.851563f,0.367188f, +0.859375f,0.367188f, +0.867188f,0.367188f, +0.875f,0.367188f, +0.882813f,0.367188f, +0.890625f,0.367188f, +0.898438f,0.367188f, +0.90625f,0.367188f, +0.914063f,0.367188f, +0.921875f,0.367188f, +0.929688f,0.367188f, +0.9375f,0.367188f, +0.945313f,0.367188f, +0.953125f,0.367188f, +0.960938f,0.367188f, +0.96875f,0.367188f, +0.976563f,0.367188f, +0.984375f,0.367188f, +0.992188f,0.367188f, +1.0f,0.367188f, +0.507813f,0.375f, +0.515625f,0.375f, +0.523438f,0.375f, +0.53125f,0.375f, +0.539063f,0.375f, +0.546875f,0.375f, +0.554688f,0.375f, +0.5625f,0.375f, +0.570313f,0.375f, +0.578125f,0.375f, +0.585938f,0.375f, +0.59375f,0.375f, +0.601563f,0.375f, +0.609375f,0.375f, +0.617188f,0.375f, +0.625f,0.375f, +0.632813f,0.375f, +0.640625f,0.375f, +0.648438f,0.375f, +0.65625f,0.375f, +0.664063f,0.375f, +0.671875f,0.375f, +0.679688f,0.375f, +0.6875f,0.375f, +0.695313f,0.375f, +0.703125f,0.375f, +0.710938f,0.375f, +0.71875f,0.375f, +0.726563f,0.375f, +0.734375f,0.375f, +0.742188f,0.375f, +0.75f,0.375f, +0.757813f,0.375f, +0.765625f,0.375f, +0.773438f,0.375f, +0.78125f,0.375f, +0.789063f,0.375f, +0.796875f,0.375f, +0.804688f,0.375f, +0.8125f,0.375f, +0.820313f,0.375f, +0.828125f,0.375f, +0.835938f,0.375f, +0.84375f,0.375f, +0.851563f,0.375f, +0.859375f,0.375f, +0.867188f,0.375f, +0.875f,0.375f, +0.882813f,0.375f, +0.890625f,0.375f, +0.898438f,0.375f, +0.90625f,0.375f, +0.914063f,0.375f, +0.921875f,0.375f, +0.929688f,0.375f, +0.9375f,0.375f, +0.945313f,0.375f, +0.953125f,0.375f, +0.960938f,0.375f, +0.96875f,0.375f, +0.976563f,0.375f, +0.984375f,0.375f, +0.992188f,0.375f, +1.0f,0.375f, +0.507813f,0.382813f, +0.515625f,0.382813f, +0.523438f,0.382813f, +0.53125f,0.382813f, +0.539063f,0.382813f, +0.546875f,0.382813f, +0.554688f,0.382813f, +0.5625f,0.382813f, +0.570313f,0.382813f, +0.578125f,0.382813f, +0.585938f,0.382813f, +0.59375f,0.382813f, +0.601563f,0.382813f, +0.609375f,0.382813f, +0.617188f,0.382813f, +0.625f,0.382813f, +0.632813f,0.382813f, +0.640625f,0.382813f, +0.648438f,0.382813f, +0.65625f,0.382813f, +0.664063f,0.382813f, +0.671875f,0.382813f, +0.679688f,0.382813f, +0.6875f,0.382813f, +0.695313f,0.382813f, +0.703125f,0.382813f, +0.710938f,0.382813f, +0.71875f,0.382813f, +0.726563f,0.382813f, +0.734375f,0.382813f, +0.742188f,0.382813f, +0.75f,0.382813f, +0.757813f,0.382813f, +0.765625f,0.382813f, +0.773438f,0.382813f, +0.78125f,0.382813f, +0.789063f,0.382813f, +0.796875f,0.382813f, +0.804688f,0.382813f, +0.8125f,0.382813f, +0.820313f,0.382813f, +0.828125f,0.382813f, +0.835938f,0.382813f, +0.84375f,0.382813f, +0.851563f,0.382813f, +0.859375f,0.382813f, +0.867188f,0.382813f, +0.875f,0.382813f, +0.882813f,0.382813f, +0.890625f,0.382813f, +0.898438f,0.382813f, +0.90625f,0.382813f, +0.914063f,0.382813f, +0.921875f,0.382813f, +0.929688f,0.382813f, +0.9375f,0.382813f, +0.945313f,0.382813f, +0.953125f,0.382813f, +0.960938f,0.382813f, +0.96875f,0.382813f, +0.976563f,0.382813f, +0.984375f,0.382813f, +0.992188f,0.382813f, +1.0f,0.382813f, +0.507813f,0.390625f, +0.515625f,0.390625f, +0.523438f,0.390625f, +0.53125f,0.390625f, +0.539063f,0.390625f, +0.546875f,0.390625f, +0.554688f,0.390625f, +0.5625f,0.390625f, +0.570313f,0.390625f, +0.578125f,0.390625f, +0.585938f,0.390625f, +0.59375f,0.390625f, +0.601563f,0.390625f, +0.609375f,0.390625f, +0.617188f,0.390625f, +0.625f,0.390625f, +0.632813f,0.390625f, +0.640625f,0.390625f, +0.648438f,0.390625f, +0.65625f,0.390625f, +0.664063f,0.390625f, +0.671875f,0.390625f, +0.679688f,0.390625f, +0.6875f,0.390625f, +0.695313f,0.390625f, +0.703125f,0.390625f, +0.710938f,0.390625f, +0.71875f,0.390625f, +0.726563f,0.390625f, +0.734375f,0.390625f, +0.742188f,0.390625f, +0.75f,0.390625f, +0.757813f,0.390625f, +0.765625f,0.390625f, +0.773438f,0.390625f, +0.78125f,0.390625f, +0.789063f,0.390625f, +0.796875f,0.390625f, +0.804688f,0.390625f, +0.8125f,0.390625f, +0.820313f,0.390625f, +0.828125f,0.390625f, +0.835938f,0.390625f, +0.84375f,0.390625f, +0.851563f,0.390625f, +0.859375f,0.390625f, +0.867188f,0.390625f, +0.875f,0.390625f, +0.882813f,0.390625f, +0.890625f,0.390625f, +0.898438f,0.390625f, +0.90625f,0.390625f, +0.914063f,0.390625f, +0.921875f,0.390625f, +0.929688f,0.390625f, +0.9375f,0.390625f, +0.945313f,0.390625f, +0.953125f,0.390625f, +0.960938f,0.390625f, +0.96875f,0.390625f, +0.976563f,0.390625f, +0.984375f,0.390625f, +0.992188f,0.390625f, +1.0f,0.390625f, +0.507813f,0.398438f, +0.515625f,0.398438f, +0.523438f,0.398438f, +0.53125f,0.398438f, +0.539063f,0.398438f, +0.546875f,0.398438f, +0.554688f,0.398438f, +0.5625f,0.398438f, +0.570313f,0.398438f, +0.578125f,0.398438f, +0.585938f,0.398438f, +0.59375f,0.398438f, +0.601563f,0.398438f, +0.609375f,0.398438f, +0.617188f,0.398438f, +0.625f,0.398438f, +0.632813f,0.398438f, +0.640625f,0.398438f, +0.648438f,0.398438f, +0.65625f,0.398438f, +0.664063f,0.398438f, +0.671875f,0.398438f, +0.679688f,0.398438f, +0.6875f,0.398438f, +0.695313f,0.398438f, +0.703125f,0.398438f, +0.710938f,0.398438f, +0.71875f,0.398438f, +0.726563f,0.398438f, +0.734375f,0.398438f, +0.742188f,0.398438f, +0.75f,0.398438f, +0.757813f,0.398438f, +0.765625f,0.398438f, +0.773438f,0.398438f, +0.78125f,0.398438f, +0.789063f,0.398438f, +0.796875f,0.398438f, +0.804688f,0.398438f, +0.8125f,0.398438f, +0.820313f,0.398438f, +0.828125f,0.398438f, +0.835938f,0.398438f, +0.84375f,0.398438f, +0.851563f,0.398438f, +0.859375f,0.398438f, +0.867188f,0.398438f, +0.875f,0.398438f, +0.882813f,0.398438f, +0.890625f,0.398438f, +0.898438f,0.398438f, +0.90625f,0.398438f, +0.914063f,0.398438f, +0.921875f,0.398438f, +0.929688f,0.398438f, +0.9375f,0.398438f, +0.945313f,0.398438f, +0.953125f,0.398438f, +0.960938f,0.398438f, +0.96875f,0.398438f, +0.976563f,0.398438f, +0.984375f,0.398438f, +0.992188f,0.398438f, +1.0f,0.398438f, +0.507813f,0.40625f, +0.515625f,0.40625f, +0.523438f,0.40625f, +0.53125f,0.40625f, +0.539063f,0.40625f, +0.546875f,0.40625f, +0.554688f,0.40625f, +0.5625f,0.40625f, +0.570313f,0.40625f, +0.578125f,0.40625f, +0.585938f,0.40625f, +0.59375f,0.40625f, +0.601563f,0.40625f, +0.609375f,0.40625f, +0.617188f,0.40625f, +0.625f,0.40625f, +0.632813f,0.40625f, +0.640625f,0.40625f, +0.648438f,0.40625f, +0.65625f,0.40625f, +0.664063f,0.40625f, +0.671875f,0.40625f, +0.679688f,0.40625f, +0.6875f,0.40625f, +0.695313f,0.40625f, +0.703125f,0.40625f, +0.710938f,0.40625f, +0.71875f,0.40625f, +0.726563f,0.40625f, +0.734375f,0.40625f, +0.742188f,0.40625f, +0.75f,0.40625f, +0.757813f,0.40625f, +0.765625f,0.40625f, +0.773438f,0.40625f, +0.78125f,0.40625f, +0.789063f,0.40625f, +0.796875f,0.40625f, +0.804688f,0.40625f, +0.8125f,0.40625f, +0.820313f,0.40625f, +0.828125f,0.40625f, +0.835938f,0.40625f, +0.84375f,0.40625f, +0.851563f,0.40625f, +0.859375f,0.40625f, +0.867188f,0.40625f, +0.875f,0.40625f, +0.882813f,0.40625f, +0.890625f,0.40625f, +0.898438f,0.40625f, +0.90625f,0.40625f, +0.914063f,0.40625f, +0.921875f,0.40625f, +0.929688f,0.40625f, +0.9375f,0.40625f, +0.945313f,0.40625f, +0.953125f,0.40625f, +0.960938f,0.40625f, +0.96875f,0.40625f, +0.976563f,0.40625f, +0.984375f,0.40625f, +0.992188f,0.40625f, +1.0f,0.40625f, +0.507813f,0.414063f, +0.515625f,0.414063f, +0.523438f,0.414063f, +0.53125f,0.414063f, +0.539063f,0.414063f, +0.546875f,0.414063f, +0.554688f,0.414063f, +0.5625f,0.414063f, +0.570313f,0.414063f, +0.578125f,0.414063f, +0.585938f,0.414063f, +0.59375f,0.414063f, +0.601563f,0.414063f, +0.609375f,0.414063f, +0.617188f,0.414063f, +0.625f,0.414063f, +0.632813f,0.414063f, +0.640625f,0.414063f, +0.648438f,0.414063f, +0.65625f,0.414063f, +0.664063f,0.414063f, +0.671875f,0.414063f, +0.679688f,0.414063f, +0.6875f,0.414063f, +0.695313f,0.414063f, +0.703125f,0.414063f, +0.710938f,0.414063f, +0.71875f,0.414063f, +0.726563f,0.414063f, +0.734375f,0.414063f, +0.742188f,0.414063f, +0.75f,0.414063f, +0.757813f,0.414063f, +0.765625f,0.414063f, +0.773438f,0.414063f, +0.78125f,0.414063f, +0.789063f,0.414063f, +0.796875f,0.414063f, +0.804688f,0.414063f, +0.8125f,0.414063f, +0.820313f,0.414063f, +0.828125f,0.414063f, +0.835938f,0.414063f, +0.84375f,0.414063f, +0.851563f,0.414063f, +0.859375f,0.414063f, +0.867188f,0.414063f, +0.875f,0.414063f, +0.882813f,0.414063f, +0.890625f,0.414063f, +0.898438f,0.414063f, +0.90625f,0.414063f, +0.914063f,0.414063f, +0.921875f,0.414063f, +0.929688f,0.414063f, +0.9375f,0.414063f, +0.945313f,0.414063f, +0.953125f,0.414063f, +0.960938f,0.414063f, +0.96875f,0.414063f, +0.976563f,0.414063f, +0.984375f,0.414063f, +0.992188f,0.414063f, +1.0f,0.414063f, +0.507813f,0.421875f, +0.515625f,0.421875f, +0.523438f,0.421875f, +0.53125f,0.421875f, +0.539063f,0.421875f, +0.546875f,0.421875f, +0.554688f,0.421875f, +0.5625f,0.421875f, +0.570313f,0.421875f, +0.578125f,0.421875f, +0.585938f,0.421875f, +0.59375f,0.421875f, +0.601563f,0.421875f, +0.609375f,0.421875f, +0.617188f,0.421875f, +0.625f,0.421875f, +0.632813f,0.421875f, +0.640625f,0.421875f, +0.648438f,0.421875f, +0.65625f,0.421875f, +0.664063f,0.421875f, +0.671875f,0.421875f, +0.679688f,0.421875f, +0.6875f,0.421875f, +0.695313f,0.421875f, +0.703125f,0.421875f, +0.710938f,0.421875f, +0.71875f,0.421875f, +0.726563f,0.421875f, +0.734375f,0.421875f, +0.742188f,0.421875f, +0.75f,0.421875f, +0.757813f,0.421875f, +0.765625f,0.421875f, +0.773438f,0.421875f, +0.78125f,0.421875f, +0.789063f,0.421875f, +0.796875f,0.421875f, +0.804688f,0.421875f, +0.8125f,0.421875f, +0.820313f,0.421875f, +0.828125f,0.421875f, +0.835938f,0.421875f, +0.84375f,0.421875f, +0.851563f,0.421875f, +0.859375f,0.421875f, +0.867188f,0.421875f, +0.875f,0.421875f, +0.882813f,0.421875f, +0.890625f,0.421875f, +0.898438f,0.421875f, +0.90625f,0.421875f, +0.914063f,0.421875f, +0.921875f,0.421875f, +0.929688f,0.421875f, +0.9375f,0.421875f, +0.945313f,0.421875f, +0.953125f,0.421875f, +0.960938f,0.421875f, +0.96875f,0.421875f, +0.976563f,0.421875f, +0.984375f,0.421875f, +0.992188f,0.421875f, +1.0f,0.421875f, +0.507813f,0.429688f, +0.515625f,0.429688f, +0.523438f,0.429688f, +0.53125f,0.429688f, +0.539063f,0.429688f, +0.546875f,0.429688f, +0.554688f,0.429688f, +0.5625f,0.429688f, +0.570313f,0.429688f, +0.578125f,0.429688f, +0.585938f,0.429688f, +0.59375f,0.429688f, +0.601563f,0.429688f, +0.609375f,0.429688f, +0.617188f,0.429688f, +0.625f,0.429688f, +0.632813f,0.429688f, +0.640625f,0.429688f, +0.648438f,0.429688f, +0.65625f,0.429688f, +0.664063f,0.429688f, +0.671875f,0.429688f, +0.679688f,0.429688f, +0.6875f,0.429688f, +0.695313f,0.429688f, +0.703125f,0.429688f, +0.710938f,0.429688f, +0.71875f,0.429688f, +0.726563f,0.429688f, +0.734375f,0.429688f, +0.742188f,0.429688f, +0.75f,0.429688f, +0.757813f,0.429688f, +0.765625f,0.429688f, +0.773438f,0.429688f, +0.78125f,0.429688f, +0.789063f,0.429688f, +0.796875f,0.429688f, +0.804688f,0.429688f, +0.8125f,0.429688f, +0.820313f,0.429688f, +0.828125f,0.429688f, +0.835938f,0.429688f, +0.84375f,0.429688f, +0.851563f,0.429688f, +0.859375f,0.429688f, +0.867188f,0.429688f, +0.875f,0.429688f, +0.882813f,0.429688f, +0.890625f,0.429688f, +0.898438f,0.429688f, +0.90625f,0.429688f, +0.914063f,0.429688f, +0.921875f,0.429688f, +0.929688f,0.429688f, +0.9375f,0.429688f, +0.945313f,0.429688f, +0.953125f,0.429688f, +0.960938f,0.429688f, +0.96875f,0.429688f, +0.976563f,0.429688f, +0.984375f,0.429688f, +0.992188f,0.429688f, +1.0f,0.429688f, +0.507813f,0.4375f, +0.515625f,0.4375f, +0.523438f,0.4375f, +0.53125f,0.4375f, +0.539063f,0.4375f, +0.546875f,0.4375f, +0.554688f,0.4375f, +0.5625f,0.4375f, +0.570313f,0.4375f, +0.578125f,0.4375f, +0.585938f,0.4375f, +0.59375f,0.4375f, +0.601563f,0.4375f, +0.609375f,0.4375f, +0.617188f,0.4375f, +0.625f,0.4375f, +0.632813f,0.4375f, +0.640625f,0.4375f, +0.648438f,0.4375f, +0.65625f,0.4375f, +0.664063f,0.4375f, +0.671875f,0.4375f, +0.679688f,0.4375f, +0.6875f,0.4375f, +0.695313f,0.4375f, +0.703125f,0.4375f, +0.710938f,0.4375f, +0.71875f,0.4375f, +0.726563f,0.4375f, +0.734375f,0.4375f, +0.742188f,0.4375f, +0.75f,0.4375f, +0.757813f,0.4375f, +0.765625f,0.4375f, +0.773438f,0.4375f, +0.78125f,0.4375f, +0.789063f,0.4375f, +0.796875f,0.4375f, +0.804688f,0.4375f, +0.8125f,0.4375f, +0.820313f,0.4375f, +0.828125f,0.4375f, +0.835938f,0.4375f, +0.84375f,0.4375f, +0.851563f,0.4375f, +0.859375f,0.4375f, +0.867188f,0.4375f, +0.875f,0.4375f, +0.882813f,0.4375f, +0.890625f,0.4375f, +0.898438f,0.4375f, +0.90625f,0.4375f, +0.914063f,0.4375f, +0.921875f,0.4375f, +0.929688f,0.4375f, +0.9375f,0.4375f, +0.945313f,0.4375f, +0.953125f,0.4375f, +0.960938f,0.4375f, +0.96875f,0.4375f, +0.976563f,0.4375f, +0.984375f,0.4375f, +0.992188f,0.4375f, +1.0f,0.4375f, +0.507813f,0.445313f, +0.515625f,0.445313f, +0.523438f,0.445313f, +0.53125f,0.445313f, +0.539063f,0.445313f, +0.546875f,0.445313f, +0.554688f,0.445313f, +0.5625f,0.445313f, +0.570313f,0.445313f, +0.578125f,0.445313f, +0.585938f,0.445313f, +0.59375f,0.445313f, +0.601563f,0.445313f, +0.609375f,0.445313f, +0.617188f,0.445313f, +0.625f,0.445313f, +0.632813f,0.445313f, +0.640625f,0.445313f, +0.648438f,0.445313f, +0.65625f,0.445313f, +0.664063f,0.445313f, +0.671875f,0.445313f, +0.679688f,0.445313f, +0.6875f,0.445313f, +0.695313f,0.445313f, +0.703125f,0.445313f, +0.710938f,0.445313f, +0.71875f,0.445313f, +0.726563f,0.445313f, +0.734375f,0.445313f, +0.742188f,0.445313f, +0.75f,0.445313f, +0.757813f,0.445313f, +0.765625f,0.445313f, +0.773438f,0.445313f, +0.78125f,0.445313f, +0.789063f,0.445313f, +0.796875f,0.445313f, +0.804688f,0.445313f, +0.8125f,0.445313f, +0.820313f,0.445313f, +0.828125f,0.445313f, +0.835938f,0.445313f, +0.84375f,0.445313f, +0.851563f,0.445313f, +0.859375f,0.445313f, +0.867188f,0.445313f, +0.875f,0.445313f, +0.882813f,0.445313f, +0.890625f,0.445313f, +0.898438f,0.445313f, +0.90625f,0.445313f, +0.914063f,0.445313f, +0.921875f,0.445313f, +0.929688f,0.445313f, +0.9375f,0.445313f, +0.945313f,0.445313f, +0.953125f,0.445313f, +0.960938f,0.445313f, +0.96875f,0.445313f, +0.976563f,0.445313f, +0.984375f,0.445313f, +0.992188f,0.445313f, +1.0f,0.445313f, +0.507813f,0.453125f, +0.515625f,0.453125f, +0.523438f,0.453125f, +0.53125f,0.453125f, +0.539063f,0.453125f, +0.546875f,0.453125f, +0.554688f,0.453125f, +0.5625f,0.453125f, +0.570313f,0.453125f, +0.578125f,0.453125f, +0.585938f,0.453125f, +0.59375f,0.453125f, +0.601563f,0.453125f, +0.609375f,0.453125f, +0.617188f,0.453125f, +0.625f,0.453125f, +0.632813f,0.453125f, +0.640625f,0.453125f, +0.648438f,0.453125f, +0.65625f,0.453125f, +0.664063f,0.453125f, +0.671875f,0.453125f, +0.679688f,0.453125f, +0.6875f,0.453125f, +0.695313f,0.453125f, +0.703125f,0.453125f, +0.710938f,0.453125f, +0.71875f,0.453125f, +0.726563f,0.453125f, +0.734375f,0.453125f, +0.742188f,0.453125f, +0.75f,0.453125f, +0.757813f,0.453125f, +0.765625f,0.453125f, +0.773438f,0.453125f, +0.78125f,0.453125f, +0.789063f,0.453125f, +0.796875f,0.453125f, +0.804688f,0.453125f, +0.8125f,0.453125f, +0.820313f,0.453125f, +0.828125f,0.453125f, +0.835938f,0.453125f, +0.84375f,0.453125f, +0.851563f,0.453125f, +0.859375f,0.453125f, +0.867188f,0.453125f, +0.875f,0.453125f, +0.882813f,0.453125f, +0.890625f,0.453125f, +0.898438f,0.453125f, +0.90625f,0.453125f, +0.914063f,0.453125f, +0.921875f,0.453125f, +0.929688f,0.453125f, +0.9375f,0.453125f, +0.945313f,0.453125f, +0.953125f,0.453125f, +0.960938f,0.453125f, +0.96875f,0.453125f, +0.976563f,0.453125f, +0.984375f,0.453125f, +0.992188f,0.453125f, +1.0f,0.453125f, +0.507813f,0.460938f, +0.515625f,0.460938f, +0.523438f,0.460938f, +0.53125f,0.460938f, +0.539063f,0.460938f, +0.546875f,0.460938f, +0.554688f,0.460938f, +0.5625f,0.460938f, +0.570313f,0.460938f, +0.578125f,0.460938f, +0.585938f,0.460938f, +0.59375f,0.460938f, +0.601563f,0.460938f, +0.609375f,0.460938f, +0.617188f,0.460938f, +0.625f,0.460938f, +0.632813f,0.460938f, +0.640625f,0.460938f, +0.648438f,0.460938f, +0.65625f,0.460938f, +0.664063f,0.460938f, +0.671875f,0.460938f, +0.679688f,0.460938f, +0.6875f,0.460938f, +0.695313f,0.460938f, +0.703125f,0.460938f, +0.710938f,0.460938f, +0.71875f,0.460938f, +0.726563f,0.460938f, +0.734375f,0.460938f, +0.742188f,0.460938f, +0.75f,0.460938f, +0.757813f,0.460938f, +0.765625f,0.460938f, +0.773438f,0.460938f, +0.78125f,0.460938f, +0.789063f,0.460938f, +0.796875f,0.460938f, +0.804688f,0.460938f, +0.8125f,0.460938f, +0.820313f,0.460938f, +0.828125f,0.460938f, +0.835938f,0.460938f, +0.84375f,0.460938f, +0.851563f,0.460938f, +0.859375f,0.460938f, +0.867188f,0.460938f, +0.875f,0.460938f, +0.882813f,0.460938f, +0.890625f,0.460938f, +0.898438f,0.460938f, +0.90625f,0.460938f, +0.914063f,0.460938f, +0.921875f,0.460938f, +0.929688f,0.460938f, +0.9375f,0.460938f, +0.945313f,0.460938f, +0.953125f,0.460938f, +0.960938f,0.460938f, +0.96875f,0.460938f, +0.976563f,0.460938f, +0.984375f,0.460938f, +0.992188f,0.460938f, +1.0f,0.460938f, +0.507813f,0.46875f, +0.515625f,0.46875f, +0.523438f,0.46875f, +0.53125f,0.46875f, +0.539063f,0.46875f, +0.546875f,0.46875f, +0.554688f,0.46875f, +0.5625f,0.46875f, +0.570313f,0.46875f, +0.578125f,0.46875f, +0.585938f,0.46875f, +0.59375f,0.46875f, +0.601563f,0.46875f, +0.609375f,0.46875f, +0.617188f,0.46875f, +0.625f,0.46875f, +0.632813f,0.46875f, +0.640625f,0.46875f, +0.648438f,0.46875f, +0.65625f,0.46875f, +0.664063f,0.46875f, +0.671875f,0.46875f, +0.679688f,0.46875f, +0.6875f,0.46875f, +0.695313f,0.46875f, +0.703125f,0.46875f, +0.710938f,0.46875f, +0.71875f,0.46875f, +0.726563f,0.46875f, +0.734375f,0.46875f, +0.742188f,0.46875f, +0.75f,0.46875f, +0.757813f,0.46875f, +0.765625f,0.46875f, +0.773438f,0.46875f, +0.78125f,0.46875f, +0.789063f,0.46875f, +0.796875f,0.46875f, +0.804688f,0.46875f, +0.8125f,0.46875f, +0.820313f,0.46875f, +0.828125f,0.46875f, +0.835938f,0.46875f, +0.84375f,0.46875f, +0.851563f,0.46875f, +0.859375f,0.46875f, +0.867188f,0.46875f, +0.875f,0.46875f, +0.882813f,0.46875f, +0.890625f,0.46875f, +0.898438f,0.46875f, +0.90625f,0.46875f, +0.914063f,0.46875f, +0.921875f,0.46875f, +0.929688f,0.46875f, +0.9375f,0.46875f, +0.945313f,0.46875f, +0.953125f,0.46875f, +0.960938f,0.46875f, +0.96875f,0.46875f, +0.976563f,0.46875f, +0.984375f,0.46875f, +0.992188f,0.46875f, +1.0f,0.46875f, +0.507813f,0.476563f, +0.515625f,0.476563f, +0.523438f,0.476563f, +0.53125f,0.476563f, +0.539063f,0.476563f, +0.546875f,0.476563f, +0.554688f,0.476563f, +0.5625f,0.476563f, +0.570313f,0.476563f, +0.578125f,0.476563f, +0.585938f,0.476563f, +0.59375f,0.476563f, +0.601563f,0.476563f, +0.609375f,0.476563f, +0.617188f,0.476563f, +0.625f,0.476563f, +0.632813f,0.476563f, +0.640625f,0.476563f, +0.648438f,0.476563f, +0.65625f,0.476563f, +0.664063f,0.476563f, +0.671875f,0.476563f, +0.679688f,0.476563f, +0.6875f,0.476563f, +0.695313f,0.476563f, +0.703125f,0.476563f, +0.710938f,0.476563f, +0.71875f,0.476563f, +0.726563f,0.476563f, +0.734375f,0.476563f, +0.742188f,0.476563f, +0.75f,0.476563f, +0.757813f,0.476563f, +0.765625f,0.476563f, +0.773438f,0.476563f, +0.78125f,0.476563f, +0.789063f,0.476563f, +0.796875f,0.476563f, +0.804688f,0.476563f, +0.8125f,0.476563f, +0.820313f,0.476563f, +0.828125f,0.476563f, +0.835938f,0.476563f, +0.84375f,0.476563f, +0.851563f,0.476563f, +0.859375f,0.476563f, +0.867188f,0.476563f, +0.875f,0.476563f, +0.882813f,0.476563f, +0.890625f,0.476563f, +0.898438f,0.476563f, +0.90625f,0.476563f, +0.914063f,0.476563f, +0.921875f,0.476563f, +0.929688f,0.476563f, +0.9375f,0.476563f, +0.945313f,0.476563f, +0.953125f,0.476563f, +0.960938f,0.476563f, +0.96875f,0.476563f, +0.976563f,0.476563f, +0.984375f,0.476563f, +0.992188f,0.476563f, +1.0f,0.476563f, +0.507813f,0.484375f, +0.515625f,0.484375f, +0.523438f,0.484375f, +0.53125f,0.484375f, +0.539063f,0.484375f, +0.546875f,0.484375f, +0.554688f,0.484375f, +0.5625f,0.484375f, +0.570313f,0.484375f, +0.578125f,0.484375f, +0.585938f,0.484375f, +0.59375f,0.484375f, +0.601563f,0.484375f, +0.609375f,0.484375f, +0.617188f,0.484375f, +0.625f,0.484375f, +0.632813f,0.484375f, +0.640625f,0.484375f, +0.648438f,0.484375f, +0.65625f,0.484375f, +0.664063f,0.484375f, +0.671875f,0.484375f, +0.679688f,0.484375f, +0.6875f,0.484375f, +0.695313f,0.484375f, +0.703125f,0.484375f, +0.710938f,0.484375f, +0.71875f,0.484375f, +0.726563f,0.484375f, +0.734375f,0.484375f, +0.742188f,0.484375f, +0.75f,0.484375f, +0.757813f,0.484375f, +0.765625f,0.484375f, +0.773438f,0.484375f, +0.78125f,0.484375f, +0.789063f,0.484375f, +0.796875f,0.484375f, +0.804688f,0.484375f, +0.8125f,0.484375f, +0.820313f,0.484375f, +0.828125f,0.484375f, +0.835938f,0.484375f, +0.84375f,0.484375f, +0.851563f,0.484375f, +0.859375f,0.484375f, +0.867188f,0.484375f, +0.875f,0.484375f, +0.882813f,0.484375f, +0.890625f,0.484375f, +0.898438f,0.484375f, +0.90625f,0.484375f, +0.914063f,0.484375f, +0.921875f,0.484375f, +0.929688f,0.484375f, +0.9375f,0.484375f, +0.945313f,0.484375f, +0.953125f,0.484375f, +0.960938f,0.484375f, +0.96875f,0.484375f, +0.976563f,0.484375f, +0.984375f,0.484375f, +0.992188f,0.484375f, +1.0f,0.484375f, +0.507813f,0.492188f, +0.515625f,0.492188f, +0.523438f,0.492188f, +0.53125f,0.492188f, +0.539063f,0.492188f, +0.546875f,0.492188f, +0.554688f,0.492188f, +0.5625f,0.492188f, +0.570313f,0.492188f, +0.578125f,0.492188f, +0.585938f,0.492188f, +0.59375f,0.492188f, +0.601563f,0.492188f, +0.609375f,0.492188f, +0.617188f,0.492188f, +0.625f,0.492188f, +0.632813f,0.492188f, +0.640625f,0.492188f, +0.648438f,0.492188f, +0.65625f,0.492188f, +0.664063f,0.492188f, +0.671875f,0.492188f, +0.679688f,0.492188f, +0.6875f,0.492188f, +0.695313f,0.492188f, +0.703125f,0.492188f, +0.710938f,0.492188f, +0.71875f,0.492188f, +0.726563f,0.492188f, +0.734375f,0.492188f, +0.742188f,0.492188f, +0.75f,0.492188f, +0.757813f,0.492188f, +0.765625f,0.492188f, +0.773438f,0.492188f, +0.78125f,0.492188f, +0.789063f,0.492188f, +0.796875f,0.492188f, +0.804688f,0.492188f, +0.8125f,0.492188f, +0.820313f,0.492188f, +0.828125f,0.492188f, +0.835938f,0.492188f, +0.84375f,0.492188f, +0.851563f,0.492188f, +0.859375f,0.492188f, +0.867188f,0.492188f, +0.875f,0.492188f, +0.882813f,0.492188f, +0.890625f,0.492188f, +0.898438f,0.492188f, +0.90625f,0.492188f, +0.914063f,0.492188f, +0.921875f,0.492188f, +0.929688f,0.492188f, +0.9375f,0.492188f, +0.945313f,0.492188f, +0.953125f,0.492188f, +0.960938f,0.492188f, +0.96875f,0.492188f, +0.976563f,0.492188f, +0.984375f,0.492188f, +0.992188f,0.492188f, +1.0f,0.492188f, +}; + +unsigned short Landscape04Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +2048,1984,2049, +1985,2049,1984, +2049,1985,2050, +1986,2050,1985, +2050,1986,2051, +1987,2051,1986, +2051,1987,2052, +1988,2052,1987, +2052,1988,2053, +1989,2053,1988, +2053,1989,2054, +1990,2054,1989, +2054,1990,2055, +1991,2055,1990, +2055,1991,2056, +1992,2056,1991, +2056,1992,2057, +1993,2057,1992, +2057,1993,2058, +1994,2058,1993, +2058,1994,2059, +1995,2059,1994, +2059,1995,2060, +1996,2060,1995, +2060,1996,2061, +1997,2061,1996, +2061,1997,2062, +1998,2062,1997, +2062,1998,2063, +1999,2063,1998, +2063,1999,2064, +2000,2064,1999, +2064,2000,2065, +2001,2065,2000, +2065,2001,2066, +2002,2066,2001, +2066,2002,2067, +2003,2067,2002, +2067,2003,2068, +2004,2068,2003, +2068,2004,2069, +2005,2069,2004, +2069,2005,2070, +2006,2070,2005, +2070,2006,2071, +2007,2071,2006, +2071,2007,2072, +2008,2072,2007, +2072,2008,2073, +2009,2073,2008, +2073,2009,2074, +2010,2074,2009, +2074,2010,2075, +2011,2075,2010, +2075,2011,2076, +2012,2076,2011, +2076,2012,2077, +2013,2077,2012, +2077,2013,2078, +2014,2078,2013, +2078,2014,2079, +2015,2079,2014, +2079,2015,2080, +2016,2080,2015, +2080,2016,2081, +2017,2081,2016, +2081,2017,2082, +2018,2082,2017, +2082,2018,2083, +2019,2083,2018, +2083,2019,2084, +2020,2084,2019, +2084,2020,2085, +2021,2085,2020, +2085,2021,2086, +2022,2086,2021, +2086,2022,2087, +2023,2087,2022, +2087,2023,2088, +2024,2088,2023, +2088,2024,2089, +2025,2089,2024, +2089,2025,2090, +2026,2090,2025, +2090,2026,2091, +2027,2091,2026, +2091,2027,2092, +2028,2092,2027, +2092,2028,2093, +2029,2093,2028, +2093,2029,2094, +2030,2094,2029, +2094,2030,2095, +2031,2095,2030, +2095,2031,2096, +2032,2096,2031, +2096,2032,2097, +2033,2097,2032, +2097,2033,2098, +2034,2098,2033, +2098,2034,2099, +2035,2099,2034, +2099,2035,2100, +2036,2100,2035, +2100,2036,2101, +2037,2101,2036, +2101,2037,2102, +2038,2102,2037, +2102,2038,2103, +2039,2103,2038, +2103,2039,2104, +2040,2104,2039, +2104,2040,2105, +2041,2105,2040, +2105,2041,2106, +2042,2106,2041, +2106,2042,2107, +2043,2107,2042, +2107,2043,2108, +2044,2108,2043, +2108,2044,2109, +2045,2109,2044, +2109,2045,2110, +2046,2110,2045, +2110,2046,2111, +2047,2111,2046, +}; + +#define Landscape05VtxCount 2244 +#define Landscape05IdxCount 12870 + +btScalar Landscape05Vtx[] = { +-250.0f,-0.990273f,0.0f, +-250.0f,0.139875f,3.90625f, +-246.094f,0.671004f,0.0f, +-246.094f,1.72995f,3.90625f, +-242.188f,1.84097f,0.0f, +-242.188f,2.60122f,3.90625f, +-238.281f,3.67319f,-1.6056e-007f, +-238.281f,4.01346f,3.90625f, +-234.375f,4.96849f,-2.1718e-007f, +-234.375f,5.13654f,3.90625f, +-230.469f,6.56215f,-2.86841e-007f, +-230.469f,6.69665f,3.90625f, +-226.563f,8.30102f,-3.62849e-007f, +-226.563f,8.43203f,3.90625f, +-222.656f,9.94385f,-4.3466e-007f, +-222.656f,9.83442f,3.90625f, +-218.75f,11.5986f,-5.06992e-007f, +-218.75f,11.3645f,3.90625f, +-214.844f,14.3141f,-6.2569e-007f, +-214.844f,14.222f,3.90625f, +-210.938f,16.5538f,-7.2359e-007f, +-210.938f,16.1758f,3.90625f, +-207.031f,18.852f,-8.24046e-007f, +-207.031f,18.9127f,3.90625f, +-203.125f,21.5344f,-9.41301e-007f, +-203.125f,21.2478f,3.90625f, +-199.219f,22.7337f,-9.93723e-007f, +-199.219f,23.0589f,3.90625f, +-195.313f,24.4712f,-1.06967e-006f, +-195.313f,24.6025f,3.90625f, +-191.406f,26.1169f,-1.14161e-006f, +-191.406f,25.8143f,3.90625f, +-187.5f,26.9988f,-1.18015e-006f, +-187.5f,27.5696f,3.90625f, +-183.594f,28.3854f,-1.24077e-006f, +-183.594f,29.2176f,3.90625f, +-179.688f,29.0457f,-1.26963e-006f, +-179.688f,29.6835f,3.90625f, +-175.781f,29.802f,-1.30269e-006f, +-175.781f,30.7416f,3.90625f, +-171.875f,30.1559f,-1.31816e-006f, +-171.875f,31.4405f,3.90625f, +-167.969f,32.3708f,-1.41497e-006f, +-167.969f,33.0831f,3.90625f, +-164.063f,34.9705f,-1.52861e-006f, +-164.063f,34.6225f,3.90625f, +-160.156f,36.396f,-1.59092e-006f, +-160.156f,35.4992f,3.90625f, +-156.25f,37.2947f,-1.6302e-006f, +-156.25f,37.4126f,3.90625f, +-152.344f,38.248f,-1.67187e-006f, +-152.344f,38.453f,3.90625f, +-148.438f,38.3176f,-1.67491e-006f, +-148.438f,38.9974f,3.90625f, +-144.531f,38.1589f,-1.66798e-006f, +-144.531f,38.7871f,3.90625f, +-140.625f,36.5895f,-1.59938e-006f, +-140.625f,37.6021f,3.90625f, +-136.719f,35.718f,-1.56128e-006f, +-136.719f,36.1797f,3.90625f, +-132.813f,33.7519f,-1.47534e-006f, +-132.813f,34.9906f,3.90625f, +-128.906f,33.2853f,-1.45495e-006f, +-128.906f,34.1304f,3.90625f, +-125.0f,33.4003f,-1.45997e-006f, +-125.0f,34.3517f,3.90625f, +-121.094f,33.1132f,-1.44742e-006f, +-121.094f,33.6612f,3.90625f, +-117.188f,32.7861f,-1.43313e-006f, +-117.188f,32.7047f,3.90625f, +-113.281f,33.0037f,-1.44264e-006f, +-113.281f,32.3958f,3.90625f, +-109.375f,32.508f,-1.42097e-006f, +-109.375f,31.0818f,3.90625f, +-105.469f,31.8384f,-1.3917e-006f, +-105.469f,30.9536f,3.90625f, +-101.563f,31.1858f,-1.36317e-006f, +-101.563f,29.8205f,3.90625f, +-97.6563f,29.6739f,-1.29709e-006f, +-97.6563f,28.4796f,3.90625f, +-93.75f,27.8258f,-1.2163e-006f, +-93.75f,27.6494f,3.90625f, +-89.8438f,25.9046f,-1.13232e-006f, +-89.8438f,25.5721f,3.90625f, +-85.9375f,23.4229f,-1.02385e-006f, +-85.9375f,24.227f,3.90625f, +-82.0313f,23.3671f,-1.02141e-006f, +-82.0313f,23.2611f,3.90625f, +-78.125f,23.0585f,-1.00792e-006f, +-78.125f,22.4589f,3.90625f, +-74.2188f,23.9226f,-1.04569e-006f, +-74.2188f,23.2261f,3.90625f, +-70.3125f,23.6449f,-1.03355e-006f, +-70.3125f,23.5025f,3.90625f, +-66.4063f,23.2789f,-1.01755e-006f, +-66.4063f,23.6913f,3.90625f, +-62.5f,24.5841f,-1.07461e-006f, +-62.5f,24.6785f,3.90625f, +-58.5938f,25.71f,-1.12382e-006f, +-58.5938f,25.4946f,3.90625f, +-54.6875f,26.9872f,-1.17965e-006f, +-54.6875f,25.9722f,3.90625f, +-50.7813f,27.8632f,-1.21794e-006f, +-50.7813f,26.1977f,3.90625f, +-46.875f,28.0326f,-1.22534e-006f, +-46.875f,26.8539f,3.90625f, +-42.9688f,28.0866f,-1.2277e-006f, +-42.9688f,27.7268f,3.90625f, +-39.0625f,30.1482f,-1.31782e-006f, +-39.0625f,29.2046f,3.90625f, +-35.1563f,32.4049f,-1.41646e-006f, +-35.1563f,31.79f,3.90625f, +-31.25f,34.4714f,-1.50679e-006f, +-31.25f,34.2658f,3.90625f, +-27.3438f,37.2668f,-1.62898e-006f, +-27.3438f,35.9914f,3.90625f, +-23.4375f,38.7934f,-1.69571e-006f, +-23.4375f,38.3776f,3.90625f, +-19.5313f,40.4024f,-1.76605e-006f, +-19.5313f,39.8852f,3.90625f, +-15.625f,42.8177f,-1.87162e-006f, +-15.625f,43.1455f,3.90625f, +-11.7188f,45.0198f,-1.96788e-006f, +-11.7188f,45.5059f,3.90625f, +-7.8125f,46.7349f,-2.04285e-006f, +-7.8125f,47.4257f,3.90625f, +-3.90625f,48.376f,-2.11458e-006f, +-3.90625f,49.9032f,3.90625f, +0.0f,49.9016f,-2.18127e-006f, +0.0f,52.0322f,3.90625f, +3.90625f,50.3865f,-2.20246e-006f, +3.90625f,52.6186f,3.90625f, +-250.0f,-0.818988f,-3.90625f, +-246.094f,0.671433f,-3.90625f, +-242.188f,2.83415f,-3.90625f, +-238.281f,4.19978f,-3.90625f, +-234.375f,5.59158f,-3.90625f, +-230.469f,6.94041f,-3.90625f, +-226.563f,8.34599f,-3.90625f, +-222.656f,9.85416f,-3.90625f, +-218.75f,10.8989f,-3.90625f, +-214.844f,13.6339f,-3.90625f, +-210.938f,16.5116f,-3.90625f, +-207.031f,17.7111f,-3.90625f, +-203.125f,20.7442f,-3.90625f, +-199.219f,22.5356f,-3.90625f, +-195.313f,24.3988f,-3.90625f, +-191.406f,25.8062f,-3.90625f, +-187.5f,26.9714f,-3.90625f, +-183.594f,27.7397f,-3.90625f, +-179.688f,28.8632f,-3.90625f, +-175.781f,29.9688f,-3.90625f, +-171.875f,32.154f,-3.90625f, +-167.969f,33.3799f,-3.90625f, +-164.063f,35.3882f,-3.90625f, +-160.156f,35.9765f,-3.90625f, +-156.25f,36.5306f,-3.90625f, +-152.344f,37.3214f,-3.90625f, +-148.438f,36.8126f,-3.90625f, +-144.531f,36.5407f,-3.90625f, +-140.625f,35.696f,-3.90625f, +-136.719f,35.1152f,-3.90625f, +-132.813f,34.1963f,-3.90625f, +-128.906f,34.0796f,-3.90625f, +-125.0f,34.2398f,-3.90625f, +-121.094f,34.1503f,-3.90625f, +-117.188f,33.7958f,-3.90625f, +-113.281f,33.856f,-3.90625f, +-109.375f,33.2705f,-3.90625f, +-105.469f,32.5804f,-3.90625f, +-101.563f,31.911f,-3.90625f, +-97.6563f,30.3705f,-3.90625f, +-93.75f,29.0627f,-3.90625f, +-89.8438f,26.6822f,-3.90625f, +-85.9375f,24.8309f,-3.90625f, +-82.0313f,23.8581f,-3.90625f, +-78.125f,23.3764f,-3.90625f, +-74.2188f,23.9582f,-3.90625f, +-70.3125f,24.13f,-3.90625f, +-66.4063f,24.4426f,-3.90625f, +-62.5f,25.5839f,-3.90625f, +-58.5938f,26.6899f,-3.90625f, +-54.6875f,27.9086f,-3.90625f, +-50.7813f,28.5131f,-3.90625f, +-46.875f,29.2612f,-3.90625f, +-42.9688f,29.4581f,-3.90625f, +-39.0625f,30.8972f,-3.90625f, +-35.1563f,32.9085f,-3.90625f, +-31.25f,34.9204f,-3.90625f, +-27.3438f,37.7223f,-3.90625f, +-23.4375f,38.921f,-3.90625f, +-19.5313f,40.2983f,-3.90625f, +-15.625f,41.7689f,-3.90625f, +-11.7188f,43.8388f,-3.90625f, +-7.8125f,44.7599f,-3.90625f, +-3.90625f,46.53f,-3.90625f, +0.0f,48.2498f,-3.90625f, +3.90625f,48.8559f,-3.90625f, +-250.0f,0.432867f,-7.8125f, +-246.094f,1.93096f,-7.8125f, +-242.188f,3.28774f,-7.8125f, +-238.281f,4.53112f,-7.8125f, +-234.375f,5.67699f,-7.8125f, +-230.469f,7.34068f,-7.8125f, +-226.563f,8.48553f,-7.8125f, +-222.656f,10.127f,-7.8125f, +-218.75f,11.3267f,-7.8125f, +-214.844f,13.3914f,-7.8125f, +-210.938f,15.5197f,-7.8125f, +-207.031f,17.9403f,-7.8125f, +-203.125f,20.5644f,-7.8125f, +-199.219f,22.8796f,-7.8125f, +-195.313f,23.715f,-7.8125f, +-191.406f,26.1312f,-7.8125f, +-187.5f,28.0754f,-7.8125f, +-183.594f,29.1199f,-7.8125f, +-179.688f,29.5774f,-7.8125f, +-175.781f,30.2676f,-7.8125f, +-171.875f,31.8275f,-7.8125f, +-167.969f,33.4969f,-7.8125f, +-164.063f,34.4445f,-7.8125f, +-160.156f,35.3881f,-7.8125f, +-156.25f,36.0267f,-7.8125f, +-152.344f,36.1221f,-7.8125f, +-148.438f,36.7707f,-7.8125f, +-144.531f,36.3067f,-7.8125f, +-140.625f,36.2295f,-7.8125f, +-136.719f,35.6858f,-7.8125f, +-132.813f,34.6232f,-7.8125f, +-128.906f,34.1675f,-7.8125f, +-125.0f,34.1756f,-7.8125f, +-121.094f,33.6453f,-7.8125f, +-117.188f,34.2516f,-7.8125f, +-113.281f,34.228f,-7.8125f, +-109.375f,34.253f,-7.8125f, +-105.469f,33.1798f,-7.8125f, +-101.563f,32.238f,-7.8125f, +-97.6563f,31.0377f,-7.8125f, +-93.75f,29.6795f,-7.8125f, +-89.8438f,27.5934f,-7.8125f, +-85.9375f,25.7426f,-7.8125f, +-82.0313f,24.4001f,-7.8125f, +-78.125f,24.4095f,-7.8125f, +-74.2188f,25.1494f,-7.8125f, +-70.3125f,25.0193f,-7.8125f, +-66.4063f,25.3902f,-7.8125f, +-62.5f,25.8612f,-7.8125f, +-58.5938f,26.8169f,-7.8125f, +-54.6875f,28.0698f,-7.8125f, +-50.7813f,28.978f,-7.8125f, +-46.875f,29.1063f,-7.8125f, +-42.9688f,30.6071f,-7.8125f, +-39.0625f,31.7015f,-7.8125f, +-35.1563f,32.6112f,-7.8125f, +-31.25f,34.6006f,-7.8125f, +-27.3438f,36.3005f,-7.8125f, +-23.4375f,38.4757f,-7.8125f, +-19.5313f,39.7014f,-7.8125f, +-15.625f,40.7762f,-7.8125f, +-11.7188f,42.6458f,-7.8125f, +-7.8125f,45.0307f,-7.8125f, +-3.90625f,47.2861f,-7.8125f, +0.0f,48.5591f,-7.8125f, +3.90625f,48.7225f,-7.8125f, +-250.0f,0.568294f,-11.7188f, +-246.094f,1.83097f,-11.7188f, +-242.188f,3.32037f,-11.7188f, +-238.281f,4.29184f,-11.7188f, +-234.375f,6.04113f,-11.7188f, +-230.469f,7.01872f,-11.7188f, +-226.563f,8.96731f,-11.7188f, +-222.656f,10.3749f,-11.7188f, +-218.75f,11.568f,-11.7188f, +-214.844f,13.9092f,-11.7188f, +-210.938f,15.6547f,-11.7188f, +-207.031f,18.2156f,-11.7188f, +-203.125f,20.0116f,-11.7188f, +-199.219f,21.5443f,-11.7188f, +-195.313f,23.4553f,-11.7188f, +-191.406f,26.2778f,-11.7188f, +-187.5f,28.0543f,-11.7188f, +-183.594f,29.2657f,-11.7188f, +-179.688f,29.6454f,-11.7188f, +-175.781f,30.699f,-11.7188f, +-171.875f,30.8229f,-11.7188f, +-167.969f,32.9874f,-11.7188f, +-164.063f,33.581f,-11.7188f, +-160.156f,34.6365f,-11.7188f, +-156.25f,35.6153f,-11.7188f, +-152.344f,36.2491f,-11.7188f, +-148.438f,36.2996f,-11.7188f, +-144.531f,36.5456f,-11.7188f, +-140.625f,36.3803f,-11.7188f, +-136.719f,35.2403f,-11.7188f, +-132.813f,34.0595f,-11.7188f, +-128.906f,34.1384f,-11.7188f, +-125.0f,33.59f,-11.7188f, +-121.094f,33.7745f,-11.7188f, +-117.188f,33.7284f,-11.7188f, +-113.281f,33.7013f,-11.7188f, +-109.375f,33.6335f,-11.7188f, +-105.469f,33.2451f,-11.7188f, +-101.563f,32.8691f,-11.7188f, +-97.6563f,31.1343f,-11.7188f, +-93.75f,29.5843f,-11.7188f, +-89.8438f,27.5891f,-11.7188f, +-85.9375f,25.75f,-11.7188f, +-82.0313f,25.4336f,-11.7188f, +-78.125f,25.6207f,-11.7188f, +-74.2188f,25.1627f,-11.7188f, +-70.3125f,25.542f,-11.7188f, +-66.4063f,25.5384f,-11.7188f, +-62.5f,25.9238f,-11.7188f, +-58.5938f,26.0718f,-11.7188f, +-54.6875f,27.4395f,-11.7188f, +-50.7813f,28.8032f,-11.7188f, +-46.875f,29.9667f,-11.7188f, +-42.9688f,31.7598f,-11.7188f, +-39.0625f,32.2636f,-11.7188f, +-35.1563f,32.5734f,-11.7188f, +-31.25f,33.543f,-11.7188f, +-27.3438f,35.1143f,-11.7188f, +-23.4375f,37.3147f,-11.7188f, +-19.5313f,39.2413f,-11.7188f, +-15.625f,41.8344f,-11.7188f, +-11.7188f,43.9992f,-11.7188f, +-7.8125f,46.8581f,-11.7188f, +-3.90625f,48.5977f,-11.7188f, +0.0f,48.7029f,-11.7188f, +3.90625f,49.6298f,-11.7188f, +-250.0f,1.50235f,-15.625f, +-246.094f,1.79115f,-15.625f, +-242.188f,2.52523f,-15.625f, +-238.281f,4.09278f,-15.625f, +-234.375f,6.21068f,-15.625f, +-230.469f,7.49819f,-15.625f, +-226.563f,8.56548f,-15.625f, +-222.656f,9.98954f,-15.625f, +-218.75f,12.3263f,-15.625f, +-214.844f,14.495f,-15.625f, +-210.938f,15.3551f,-15.625f, +-207.031f,17.6989f,-15.625f, +-203.125f,19.2847f,-15.625f, +-199.219f,21.1027f,-15.625f, +-195.313f,23.3408f,-15.625f, +-191.406f,25.3739f,-15.625f, +-187.5f,27.368f,-15.625f, +-183.594f,28.3731f,-15.625f, +-179.688f,29.5532f,-15.625f, +-175.781f,30.0011f,-15.625f, +-171.875f,31.0216f,-15.625f, +-167.969f,32.5546f,-15.625f, +-164.063f,32.6717f,-15.625f, +-160.156f,33.8465f,-15.625f, +-156.25f,35.1272f,-15.625f, +-152.344f,35.5572f,-15.625f, +-148.438f,36.643f,-15.625f, +-144.531f,36.4283f,-15.625f, +-140.625f,35.6122f,-15.625f, +-136.719f,35.358f,-15.625f, +-132.813f,34.1938f,-15.625f, +-128.906f,34.3913f,-15.625f, +-125.0f,33.2147f,-15.625f, +-121.094f,32.799f,-15.625f, +-117.188f,33.1385f,-15.625f, +-113.281f,33.1487f,-15.625f, +-109.375f,33.6564f,-15.625f, +-105.469f,33.2315f,-15.625f, +-101.563f,32.6066f,-15.625f, +-97.6563f,30.6926f,-15.625f, +-93.75f,28.534f,-15.625f, +-89.8438f,27.6738f,-15.625f, +-85.9375f,27.4216f,-15.625f, +-82.0313f,26.0324f,-15.625f, +-78.125f,25.775f,-15.625f, +-74.2188f,25.909f,-15.625f, +-70.3125f,25.0198f,-15.625f, +-66.4063f,25.9376f,-15.625f, +-62.5f,26.0382f,-15.625f, +-58.5938f,25.856f,-15.625f, +-54.6875f,27.3648f,-15.625f, +-50.7813f,28.9059f,-15.625f, +-46.875f,30.6601f,-15.625f, +-42.9688f,32.6996f,-15.625f, +-39.0625f,32.6909f,-15.625f, +-35.1563f,33.1697f,-15.625f, +-31.25f,34.6947f,-15.625f, +-27.3438f,35.6982f,-15.625f, +-23.4375f,38.2946f,-15.625f, +-19.5313f,40.6765f,-15.625f, +-15.625f,43.5894f,-15.625f, +-11.7188f,46.3071f,-15.625f, +-7.8125f,48.6578f,-15.625f, +-3.90625f,49.0003f,-15.625f, +0.0f,50.5123f,-15.625f, +3.90625f,50.6915f,-15.625f, +-250.0f,1.44302f,-19.5313f, +-246.094f,1.65093f,-19.5313f, +-242.188f,2.94233f,-19.5313f, +-238.281f,4.72065f,-19.5313f, +-234.375f,6.57861f,-19.5313f, +-230.469f,7.31849f,-19.5313f, +-226.563f,7.90567f,-19.5313f, +-222.656f,9.84414f,-19.5313f, +-218.75f,12.1574f,-19.5313f, +-214.844f,13.2825f,-19.5313f, +-210.938f,15.2284f,-19.5313f, +-207.031f,17.2765f,-19.5313f, +-203.125f,19.1565f,-19.5313f, +-199.219f,20.3098f,-19.5313f, +-195.313f,21.9346f,-19.5313f, +-191.406f,23.8549f,-19.5313f, +-187.5f,26.133f,-19.5313f, +-183.594f,27.5858f,-19.5313f, +-179.688f,28.557f,-19.5313f, +-175.781f,28.9754f,-19.5313f, +-171.875f,29.9709f,-19.5313f, +-167.969f,31.2632f,-19.5313f, +-164.063f,31.4957f,-19.5313f, +-160.156f,33.6753f,-19.5313f, +-156.25f,35.1342f,-19.5313f, +-152.344f,35.0617f,-19.5313f, +-148.438f,34.9467f,-19.5313f, +-144.531f,35.1042f,-19.5313f, +-140.625f,35.0842f,-19.5313f, +-136.719f,34.7766f,-19.5313f, +-132.813f,33.8305f,-19.5313f, +-128.906f,33.3013f,-19.5313f, +-125.0f,32.5726f,-19.5313f, +-121.094f,31.5139f,-19.5313f, +-117.188f,31.4576f,-19.5313f, +-113.281f,31.6546f,-19.5313f, +-109.375f,32.4663f,-19.5313f, +-105.469f,32.6148f,-19.5313f, +-101.563f,31.253f,-19.5313f, +-97.6563f,29.5875f,-19.5313f, +-93.75f,28.4866f,-19.5313f, +-89.8438f,29.106f,-19.5313f, +-85.9375f,28.7092f,-19.5313f, +-82.0313f,27.4567f,-19.5313f, +-78.125f,26.5225f,-19.5313f, +-74.2188f,26.7534f,-19.5313f, +-70.3125f,26.278f,-19.5313f, +-66.4063f,25.6949f,-19.5313f, +-62.5f,25.7385f,-19.5313f, +-58.5938f,25.8791f,-19.5313f, +-54.6875f,27.42f,-19.5313f, +-50.7813f,29.0777f,-19.5313f, +-46.875f,31.016f,-19.5313f, +-42.9688f,32.5331f,-19.5313f, +-39.0625f,33.213f,-19.5313f, +-35.1563f,33.9437f,-19.5313f, +-31.25f,35.6737f,-19.5313f, +-27.3438f,37.8841f,-19.5313f, +-23.4375f,40.5289f,-19.5313f, +-19.5313f,43.6786f,-19.5313f, +-15.625f,47.2945f,-19.5313f, +-11.7188f,49.7082f,-19.5313f, +-7.8125f,51.1285f,-19.5313f, +-3.90625f,51.5532f,-19.5313f, +0.0f,52.3342f,-19.5313f, +3.90625f,52.1028f,-19.5313f, +-250.0f,1.05337f,-23.4375f, +-246.094f,1.28315f,-23.4375f, +-242.188f,3.38102f,-23.4375f, +-238.281f,4.51357f,-23.4375f, +-234.375f,5.63288f,-23.4375f, +-230.469f,6.49498f,-23.4375f, +-226.563f,7.71248f,-23.4375f, +-222.656f,8.83716f,-23.4375f, +-218.75f,10.4002f,-23.4375f, +-214.844f,11.8049f,-23.4375f, +-210.938f,13.7948f,-23.4375f, +-207.031f,16.5066f,-23.4375f, +-203.125f,18.598f,-23.4375f, +-199.219f,20.3069f,-23.4375f, +-195.313f,21.6868f,-23.4375f, +-191.406f,22.5781f,-23.4375f, +-187.5f,25.0292f,-23.4375f, +-183.594f,26.5386f,-23.4375f, +-179.688f,27.1952f,-23.4375f, +-175.781f,28.4023f,-23.4375f, +-171.875f,29.0264f,-23.4375f, +-167.969f,29.9302f,-23.4375f, +-164.063f,31.7992f,-23.4375f, +-160.156f,33.4902f,-23.4375f, +-156.25f,34.4307f,-23.4375f, +-152.344f,34.1463f,-23.4375f, +-148.438f,33.5881f,-23.4375f, +-144.531f,34.0515f,-23.4375f, +-140.625f,33.7128f,-23.4375f, +-136.719f,33.2076f,-23.4375f, +-132.813f,32.0419f,-23.4375f, +-128.906f,31.3464f,-23.4375f, +-125.0f,31.3552f,-23.4375f, +-121.094f,30.6713f,-23.4375f, +-117.188f,30.1403f,-23.4375f, +-113.281f,30.1753f,-23.4375f, +-109.375f,30.6182f,-23.4375f, +-105.469f,31.2785f,-23.4375f, +-101.563f,30.4839f,-23.4375f, +-97.6563f,28.9907f,-23.4375f, +-93.75f,29.3427f,-23.4375f, +-89.8438f,29.5539f,-23.4375f, +-85.9375f,29.4313f,-23.4375f, +-82.0313f,28.0148f,-23.4375f, +-78.125f,27.3569f,-23.4375f, +-74.2188f,26.8569f,-23.4375f, +-70.3125f,25.6193f,-23.4375f, +-66.4063f,25.8188f,-23.4375f, +-62.5f,25.458f,-23.4375f, +-58.5938f,26.5128f,-23.4375f, +-54.6875f,27.2598f,-23.4375f, +-50.7813f,28.4912f,-23.4375f, +-46.875f,31.0376f,-23.4375f, +-42.9688f,33.0941f,-23.4375f, +-39.0625f,34.4933f,-23.4375f, +-35.1563f,37.1957f,-23.4375f, +-31.25f,39.4612f,-23.4375f, +-27.3438f,41.4598f,-23.4375f, +-23.4375f,43.5893f,-23.4375f, +-19.5313f,46.8054f,-23.4375f, +-15.625f,49.4177f,-23.4375f, +-11.7188f,51.7957f,-23.4375f, +-7.8125f,53.1306f,-23.4375f, +-3.90625f,53.4872f,-23.4375f, +0.0f,53.6348f,-23.4375f, +3.90625f,54.332f,-23.4375f, +-250.0f,1.05459f,-27.3438f, +-246.094f,2.15725f,-27.3438f, +-242.188f,3.16747f,-27.3438f, +-238.281f,4.17562f,-27.3438f, +-234.375f,5.17097f,-27.3438f, +-230.469f,6.61997f,-27.3438f, +-226.563f,7.25727f,-27.3438f, +-222.656f,9.26302f,-27.3438f, +-218.75f,10.7606f,-27.3438f, +-214.844f,11.6966f,-27.3438f, +-210.938f,13.0425f,-27.3438f, +-207.031f,15.0672f,-27.3438f, +-203.125f,17.5971f,-27.3438f, +-199.219f,19.3182f,-27.3438f, +-195.313f,20.4505f,-27.3438f, +-191.406f,20.7017f,-27.3438f, +-187.5f,22.8054f,-27.3438f, +-183.594f,24.7406f,-27.3438f, +-179.688f,25.7957f,-27.3438f, +-175.781f,28.4608f,-27.3438f, +-171.875f,29.5031f,-27.3438f, +-167.969f,29.8812f,-27.3438f, +-164.063f,31.4954f,-27.3438f, +-160.156f,32.6053f,-27.3438f, +-156.25f,32.9274f,-27.3438f, +-152.344f,32.6481f,-27.3438f, +-148.438f,32.4456f,-27.3438f, +-144.531f,32.0065f,-27.3438f, +-140.625f,31.7655f,-27.3438f, +-136.719f,31.6836f,-27.3438f, +-132.813f,30.9994f,-27.3438f, +-128.906f,30.4065f,-27.3438f, +-125.0f,29.7478f,-27.3438f, +-121.094f,29.3871f,-27.3438f, +-117.188f,28.6628f,-27.3438f, +-113.281f,28.88f,-27.3438f, +-109.375f,29.3757f,-27.3438f, +-105.469f,29.7372f,-27.3438f, +-101.563f,28.9035f,-27.3438f, +-97.6563f,29.0842f,-27.3438f, +-93.75f,28.969f,-27.3438f, +-89.8438f,29.282f,-27.3438f, +-85.9375f,29.4429f,-27.3438f, +-82.0313f,29.2385f,-27.3438f, +-78.125f,28.2845f,-27.3438f, +-74.2188f,26.9413f,-27.3438f, +-70.3125f,26.3888f,-27.3438f, +-66.4063f,26.4127f,-27.3438f, +-62.5f,27.4297f,-27.3438f, +-58.5938f,28.0301f,-27.3438f, +-54.6875f,28.3682f,-27.3438f, +-50.7813f,30.4624f,-27.3438f, +-46.875f,32.6469f,-27.3438f, +-42.9688f,34.7681f,-27.3438f, +-39.0625f,37.3677f,-27.3438f, +-35.1563f,40.0943f,-27.3438f, +-31.25f,42.4424f,-27.3438f, +-27.3438f,44.5954f,-27.3438f, +-23.4375f,48.1538f,-27.3438f, +-19.5313f,50.5809f,-27.3438f, +-15.625f,52.7959f,-27.3438f, +-11.7188f,53.9779f,-27.3438f, +-7.8125f,55.2657f,-27.3438f, +-3.90625f,55.7427f,-27.3438f, +0.0f,56.6047f,-27.3438f, +3.90625f,57.5273f,-27.3438f, +-250.0f,1.91243f,-31.25f, +-246.094f,1.77508f,-31.25f, +-242.188f,2.89721f,-31.25f, +-238.281f,4.82177f,-31.25f, +-234.375f,5.57483f,-31.25f, +-230.469f,6.15697f,-31.25f, +-226.563f,7.43219f,-31.25f, +-222.656f,9.10752f,-31.25f, +-218.75f,10.7345f,-31.25f, +-214.844f,11.7298f,-31.25f, +-210.938f,13.0008f,-31.25f, +-207.031f,14.4465f,-31.25f, +-203.125f,16.7635f,-31.25f, +-199.219f,18.7095f,-31.25f, +-195.313f,19.057f,-31.25f, +-191.406f,19.522f,-31.25f, +-187.5f,21.0252f,-31.25f, +-183.594f,22.477f,-31.25f, +-179.688f,24.9456f,-31.25f, +-175.781f,27.5579f,-31.25f, +-171.875f,28.9367f,-31.25f, +-167.969f,29.5938f,-31.25f, +-164.063f,29.9491f,-31.25f, +-160.156f,31.1043f,-31.25f, +-156.25f,31.898f,-31.25f, +-152.344f,32.025f,-31.25f, +-148.438f,32.2848f,-31.25f, +-144.531f,31.4433f,-31.25f, +-140.625f,29.9423f,-31.25f, +-136.719f,30.2535f,-31.25f, +-132.813f,30.4668f,-31.25f, +-128.906f,30.1261f,-31.25f, +-125.0f,29.2612f,-31.25f, +-121.094f,27.5496f,-31.25f, +-117.188f,27.0659f,-31.25f, +-113.281f,27.3359f,-31.25f, +-109.375f,27.8418f,-31.25f, +-105.469f,28.9814f,-31.25f, +-101.563f,28.4429f,-31.25f, +-97.6563f,28.5833f,-31.25f, +-93.75f,28.9986f,-31.25f, +-89.8438f,30.3273f,-31.25f, +-85.9375f,30.5898f,-31.25f, +-82.0313f,29.8768f,-31.25f, +-78.125f,28.7278f,-31.25f, +-74.2188f,28.2599f,-31.25f, +-70.3125f,27.5942f,-31.25f, +-66.4063f,28.2721f,-31.25f, +-62.5f,28.9526f,-31.25f, +-58.5938f,29.4527f,-31.25f, +-54.6875f,30.1605f,-31.25f, +-50.7813f,32.6242f,-31.25f, +-46.875f,35.2708f,-31.25f, +-42.9688f,37.6696f,-31.25f, +-39.0625f,40.1477f,-31.25f, +-35.1563f,42.5127f,-31.25f, +-31.25f,45.655f,-31.25f, +-27.3438f,48.5747f,-31.25f, +-23.4375f,51.2069f,-31.25f, +-19.5313f,53.5599f,-31.25f, +-15.625f,55.3726f,-31.25f, +-11.7188f,56.4687f,-31.25f, +-7.8125f,56.313f,-31.25f, +-3.90625f,58.0363f,-31.25f, +0.0f,59.422f,-31.25f, +3.90625f,59.4204f,-31.25f, +-250.0f,1.80637f,-35.1563f, +-246.094f,1.14243f,-35.1563f, +-242.188f,2.08309f,-35.1563f, +-238.281f,3.66548f,-35.1563f, +-234.375f,4.49251f,-35.1563f, +-230.469f,5.63985f,-35.1563f, +-226.563f,7.33778f,-35.1563f, +-222.656f,9.15183f,-35.1563f, +-218.75f,10.0463f,-35.1563f, +-214.844f,11.7521f,-35.1563f, +-210.938f,12.6919f,-35.1563f, +-207.031f,14.0216f,-35.1563f, +-203.125f,14.9825f,-35.1563f, +-199.219f,16.2286f,-35.1563f, +-195.313f,17.2153f,-35.1563f, +-191.406f,18.0692f,-35.1563f, +-187.5f,19.858f,-35.1563f, +-183.594f,22.2715f,-35.1563f, +-179.688f,25.6457f,-35.1563f, +-175.781f,27.6627f,-35.1563f, +-171.875f,28.6491f,-35.1563f, +-167.969f,29.5869f,-35.1563f, +-164.063f,29.5582f,-35.1563f, +-160.156f,30.7619f,-35.1563f, +-156.25f,31.372f,-35.1563f, +-152.344f,31.4423f,-35.1563f, +-148.438f,31.7578f,-35.1563f, +-144.531f,31.1339f,-35.1563f, +-140.625f,29.3454f,-35.1563f, +-136.719f,28.0675f,-35.1563f, +-132.813f,28.1828f,-35.1563f, +-128.906f,28.2649f,-35.1563f, +-125.0f,27.2326f,-35.1563f, +-121.094f,26.2567f,-35.1563f, +-117.188f,25.4914f,-35.1563f, +-113.281f,25.5444f,-35.1563f, +-109.375f,25.8703f,-35.1563f, +-105.469f,27.9373f,-35.1563f, +-101.563f,27.9306f,-35.1563f, +-97.6563f,27.9282f,-35.1563f, +-93.75f,28.9199f,-35.1563f, +-89.8438f,30.142f,-35.1563f, +-85.9375f,30.3479f,-35.1563f, +-82.0313f,29.749f,-35.1563f, +-78.125f,29.2656f,-35.1563f, +-74.2188f,28.8561f,-35.1563f, +-70.3125f,28.7144f,-35.1563f, +-66.4063f,29.3204f,-35.1563f, +-62.5f,29.6751f,-35.1563f, +-58.5938f,31.0647f,-35.1563f, +-54.6875f,32.3243f,-35.1563f, +-50.7813f,34.476f,-35.1563f, +-46.875f,37.0984f,-35.1563f, +-42.9688f,40.1281f,-35.1563f, +-39.0625f,42.4472f,-35.1563f, +-35.1563f,45.6772f,-35.1563f, +-31.25f,49.5655f,-35.1563f, +-27.3438f,51.5783f,-35.1563f, +-23.4375f,53.3f,-35.1563f, +-19.5313f,55.4127f,-35.1563f, +-15.625f,56.8152f,-35.1563f, +-11.7188f,56.8985f,-35.1563f, +-7.8125f,57.5886f,-35.1563f, +-3.90625f,58.9321f,-35.1563f, +0.0f,60.2297f,-35.1563f, +3.90625f,60.2212f,-35.1563f, +-250.0f,2.59935f,-39.0625f, +-246.094f,1.55278f,-39.0625f, +-242.188f,1.42243f,-39.0625f, +-238.281f,2.78238f,-39.0625f, +-234.375f,3.85918f,-39.0625f, +-230.469f,5.01321f,-39.0625f, +-226.563f,6.56707f,-39.0625f, +-222.656f,7.99762f,-39.0625f, +-218.75f,9.72642f,-39.0625f, +-214.844f,11.975f,-39.0625f, +-210.938f,12.8008f,-39.0625f, +-207.031f,13.6902f,-39.0625f, +-203.125f,14.2017f,-39.0625f, +-199.219f,14.8784f,-39.0625f, +-195.313f,16.6265f,-39.0625f, +-191.406f,17.066f,-39.0625f, +-187.5f,19.3153f,-39.0625f, +-183.594f,23.4017f,-39.0625f, +-179.688f,26.2073f,-39.0625f, +-175.781f,27.92f,-39.0625f, +-171.875f,29.0435f,-39.0625f, +-167.969f,28.8537f,-39.0625f, +-164.063f,29.6445f,-39.0625f, +-160.156f,30.2119f,-39.0625f, +-156.25f,30.4693f,-39.0625f, +-152.344f,30.6063f,-39.0625f, +-148.438f,30.8716f,-39.0625f, +-144.531f,30.3253f,-39.0625f, +-140.625f,29.3941f,-39.0625f, +-136.719f,27.7606f,-39.0625f, +-132.813f,26.806f,-39.0625f, +-128.906f,26.6501f,-39.0625f, +-125.0f,25.6992f,-39.0625f, +-121.094f,24.4674f,-39.0625f, +-117.188f,24.1124f,-39.0625f, +-113.281f,24.9142f,-39.0625f, +-109.375f,25.5696f,-39.0625f, +-105.469f,25.4691f,-39.0625f, +-101.563f,26.7147f,-39.0625f, +-97.6563f,26.7558f,-39.0625f, +-93.75f,27.9278f,-39.0625f, +-89.8438f,29.0149f,-39.0625f, +-85.9375f,29.3557f,-39.0625f, +-82.0313f,29.6134f,-39.0625f, +-78.125f,29.4742f,-39.0625f, +-74.2188f,29.3377f,-39.0625f, +-70.3125f,29.6082f,-39.0625f, +-66.4063f,29.4634f,-39.0625f, +-62.5f,31.1775f,-39.0625f, +-58.5938f,32.7227f,-39.0625f, +-54.6875f,34.2233f,-39.0625f, +-50.7813f,36.1862f,-39.0625f, +-46.875f,38.7123f,-39.0625f, +-42.9688f,41.2396f,-39.0625f, +-39.0625f,44.5857f,-39.0625f, +-35.1563f,47.0183f,-39.0625f, +-31.25f,50.9933f,-39.0625f, +-27.3438f,53.2967f,-39.0625f, +-23.4375f,55.2026f,-39.0625f, +-19.5313f,56.3858f,-39.0625f, +-15.625f,57.8615f,-39.0625f, +-11.7188f,57.7515f,-39.0625f, +-7.8125f,58.8071f,-39.0625f, +-3.90625f,59.73f,-39.0625f, +0.0f,59.8999f,-39.0625f, +3.90625f,59.9094f,-39.0625f, +-250.0f,2.73015f,-42.9688f, +-246.094f,1.9296f,-42.9688f, +-242.188f,2.00835f,-42.9688f, +-238.281f,3.16245f,-42.9688f, +-234.375f,3.35198f,-42.9688f, +-230.469f,4.50732f,-42.9688f, +-226.563f,6.28971f,-42.9688f, +-222.656f,7.89723f,-42.9688f, +-218.75f,9.28447f,-42.9688f, +-214.844f,11.4302f,-42.9688f, +-210.938f,12.7156f,-42.9688f, +-207.031f,13.6281f,-42.9688f, +-203.125f,14.5932f,-42.9688f, +-199.219f,14.8129f,-42.9688f, +-195.313f,15.7965f,-42.9688f, +-191.406f,16.3571f,-42.9688f, +-187.5f,20.257f,-42.9688f, +-183.594f,23.2993f,-42.9688f, +-179.688f,25.4583f,-42.9688f, +-175.781f,27.2887f,-42.9688f, +-171.875f,27.9862f,-42.9688f, +-167.969f,28.274f,-42.9688f, +-164.063f,28.9264f,-42.9688f, +-160.156f,29.1855f,-42.9688f, +-156.25f,29.8898f,-42.9688f, +-152.344f,29.4922f,-42.9688f, +-148.438f,29.257f,-42.9688f, +-144.531f,28.9137f,-42.9688f, +-140.625f,27.618f,-42.9688f, +-136.719f,26.8539f,-42.9688f, +-132.813f,26.2806f,-42.9688f, +-128.906f,25.1378f,-42.9688f, +-125.0f,24.508f,-42.9688f, +-121.094f,23.8458f,-42.9688f, +-117.188f,23.501f,-42.9688f, +-113.281f,24.0593f,-42.9688f, +-109.375f,24.1366f,-42.9688f, +-105.469f,24.075f,-42.9688f, +-101.563f,24.5025f,-42.9688f, +-97.6563f,24.8457f,-42.9688f, +-93.75f,26.5028f,-42.9688f, +-89.8438f,26.9842f,-42.9688f, +-85.9375f,28.5672f,-42.9688f, +-82.0313f,28.9848f,-42.9688f, +-78.125f,29.1484f,-42.9688f, +-74.2188f,28.8735f,-42.9688f, +-70.3125f,29.9085f,-42.9688f, +-66.4063f,31.647f,-42.9688f, +-62.5f,32.8553f,-42.9688f, +-58.5938f,34.4488f,-42.9688f, +-54.6875f,35.7724f,-42.9688f, +-50.7813f,38.5181f,-42.9688f, +-46.875f,40.619f,-42.9688f, +-42.9688f,42.6158f,-42.9688f, +-39.0625f,45.9557f,-42.9688f, +-35.1563f,48.8071f,-42.9688f, +-31.25f,51.5425f,-42.9688f, +-27.3438f,54.1461f,-42.9688f, +-23.4375f,56.6935f,-42.9688f, +-19.5313f,57.353f,-42.9688f, +-15.625f,58.289f,-42.9688f, +-11.7188f,58.4633f,-42.9688f, +-7.8125f,59.0033f,-42.9688f, +-3.90625f,59.61f,-42.9688f, +0.0f,59.6115f,-42.9688f, +3.90625f,59.5207f,-42.9688f, +-250.0f,2.05499f,-46.875f, +-246.094f,1.44228f,-46.875f, +-242.188f,1.95946f,-46.875f, +-238.281f,2.50642f,-46.875f, +-234.375f,3.23732f,-46.875f, +-230.469f,4.46051f,-46.875f, +-226.563f,6.17815f,-46.875f, +-222.656f,7.58101f,-46.875f, +-218.75f,9.4063f,-46.875f, +-214.844f,11.394f,-46.875f, +-210.938f,12.4493f,-46.875f, +-207.031f,13.1281f,-46.875f, +-203.125f,13.8316f,-46.875f, +-199.219f,14.1574f,-46.875f, +-195.313f,15.0289f,-46.875f, +-191.406f,17.2095f,-46.875f, +-187.5f,20.3326f,-46.875f, +-183.594f,22.5046f,-46.875f, +-179.688f,24.7998f,-46.875f, +-175.781f,26.3728f,-46.875f, +-171.875f,27.3394f,-46.875f, +-167.969f,27.2989f,-46.875f, +-164.063f,27.5191f,-46.875f, +-160.156f,28.1581f,-46.875f, +-156.25f,28.357f,-46.875f, +-152.344f,27.2465f,-46.875f, +-148.438f,27.6591f,-46.875f, +-144.531f,26.7196f,-46.875f, +-140.625f,25.3776f,-46.875f, +-136.719f,25.1174f,-46.875f, +-132.813f,24.6913f,-46.875f, +-128.906f,23.828f,-46.875f, +-125.0f,22.7885f,-46.875f, +-121.094f,23.6316f,-46.875f, +-117.188f,23.288f,-46.875f, +-113.281f,22.8849f,-46.875f, +-109.375f,22.6367f,-46.875f, +-105.469f,22.2282f,-46.875f, +-101.563f,22.7539f,-46.875f, +-97.6563f,23.4319f,-46.875f, +-93.75f,25.0494f,-46.875f, +-89.8438f,25.7759f,-46.875f, +-85.9375f,27.2287f,-46.875f, +-82.0313f,28.1554f,-46.875f, +-78.125f,28.6794f,-46.875f, +-74.2188f,30.4763f,-46.875f, +-70.3125f,32.23f,-46.875f, +-66.4063f,33.6868f,-46.875f, +-62.5f,34.7841f,-46.875f, +-58.5938f,36.2585f,-46.875f, +-54.6875f,38.2534f,-46.875f, +-50.7813f,39.5261f,-46.875f, +-46.875f,41.7676f,-46.875f, +-42.9688f,44.8849f,-46.875f, +-39.0625f,47.6394f,-46.875f, +-35.1563f,49.5783f,-46.875f, +-31.25f,52.3871f,-46.875f, +-27.3438f,54.9333f,-46.875f, +-23.4375f,56.6705f,-46.875f, +-19.5313f,56.898f,-46.875f, +-15.625f,58.678f,-46.875f, +-11.7188f,59.6595f,-46.875f, +-7.8125f,59.0163f,-46.875f, +-3.90625f,59.3587f,-46.875f, +0.0f,58.5405f,-46.875f, +3.90625f,58.9086f,-46.875f, +-250.0f,2.57742f,-50.7813f, +-246.094f,2.06275f,-50.7813f, +-242.188f,2.26453f,-50.7813f, +-238.281f,2.43527f,-50.7813f, +-234.375f,2.63858f,-50.7813f, +-230.469f,4.44964f,-50.7813f, +-226.563f,6.50192f,-50.7813f, +-222.656f,8.11006f,-50.7813f, +-218.75f,10.1023f,-50.7813f, +-214.844f,11.3708f,-50.7813f, +-210.938f,12.7395f,-50.7813f, +-207.031f,13.6541f,-50.7813f, +-203.125f,13.6317f,-50.7813f, +-199.219f,13.4823f,-50.7813f, +-195.313f,15.3032f,-50.7813f, +-191.406f,17.5085f,-50.7813f, +-187.5f,19.5731f,-50.7813f, +-183.594f,22.0894f,-50.7813f, +-179.688f,23.8927f,-50.7813f, +-175.781f,24.9335f,-50.7813f, +-171.875f,26.1125f,-50.7813f, +-167.969f,25.9034f,-50.7813f, +-164.063f,26.9549f,-50.7813f, +-160.156f,26.7939f,-50.7813f, +-156.25f,26.3447f,-50.7813f, +-152.344f,25.6085f,-50.7813f, +-148.438f,25.2823f,-50.7813f, +-144.531f,25.4854f,-50.7813f, +-140.625f,23.906f,-50.7813f, +-136.719f,23.7094f,-50.7813f, +-132.813f,22.9599f,-50.7813f, +-128.906f,22.3089f,-50.7813f, +-125.0f,22.302f,-50.7813f, +-121.094f,23.3289f,-50.7813f, +-117.188f,23.1804f,-50.7813f, +-113.281f,22.6693f,-50.7813f, +-109.375f,21.2587f,-50.7813f, +-105.469f,20.4638f,-50.7813f, +-101.563f,21.4819f,-50.7813f, +-97.6563f,22.0137f,-50.7813f, +-93.75f,23.4763f,-50.7813f, +-89.8438f,25.2125f,-50.7813f, +-85.9375f,26.446f,-50.7813f, +-82.0313f,27.5614f,-50.7813f, +-78.125f,29.5641f,-50.7813f, +-74.2188f,31.1552f,-50.7813f, +-70.3125f,33.5337f,-50.7813f, +-66.4063f,35.653f,-50.7813f, +-62.5f,36.2419f,-50.7813f, +-58.5938f,37.4297f,-50.7813f, +-54.6875f,39.7492f,-50.7813f, +-50.7813f,41.494f,-50.7813f, +-46.875f,44.5449f,-50.7813f, +-42.9688f,47.2689f,-50.7813f, +-39.0625f,49.6705f,-50.7813f, +-35.1563f,51.8942f,-50.7813f, +-31.25f,53.9483f,-50.7813f, +-27.3438f,55.2444f,-50.7813f, +-23.4375f,56.5482f,-50.7813f, +-19.5313f,58.5545f,-50.7813f, +-15.625f,59.5559f,-50.7813f, +-11.7188f,58.8699f,-50.7813f, +-7.8125f,59.0373f,-50.7813f, +-3.90625f,59.5884f,-50.7813f, +0.0f,59.6491f,-50.7813f, +3.90625f,59.8509f,-50.7813f, +-250.0f,2.04136f,-54.6875f, +-246.094f,2.5492f,-54.6875f, +-242.188f,2.70952f,-54.6875f, +-238.281f,3.00758f,-54.6875f, +-234.375f,3.54707f,-54.6875f, +-230.469f,5.09851f,-54.6875f, +-226.563f,7.09409f,-54.6875f, +-222.656f,8.40975f,-54.6875f, +-218.75f,10.0555f,-54.6875f, +-214.844f,11.4962f,-54.6875f, +-210.938f,12.1806f,-54.6875f, +-207.031f,12.7217f,-54.6875f, +-203.125f,12.6935f,-54.6875f, +-199.219f,14.0259f,-54.6875f, +-195.313f,16.1147f,-54.6875f, +-191.406f,18.3888f,-54.6875f, +-187.5f,19.3549f,-54.6875f, +-183.594f,21.6563f,-54.6875f, +-179.688f,22.9906f,-54.6875f, +-175.781f,23.7728f,-54.6875f, +-171.875f,25.2286f,-54.6875f, +-167.969f,26.0764f,-54.6875f, +-164.063f,26.746f,-54.6875f, +-160.156f,26.3029f,-54.6875f, +-156.25f,25.6172f,-54.6875f, +-152.344f,24.537f,-54.6875f, +-148.438f,23.8458f,-54.6875f, +-144.531f,23.3726f,-54.6875f, +-140.625f,22.8694f,-54.6875f, +-136.719f,22.5247f,-54.6875f, +-132.813f,21.436f,-54.6875f, +-128.906f,21.4712f,-54.6875f, +-125.0f,22.1621f,-54.6875f, +-121.094f,22.4599f,-54.6875f, +-117.188f,21.4148f,-54.6875f, +-113.281f,20.8237f,-54.6875f, +-109.375f,19.6257f,-54.6875f, +-105.469f,20.1462f,-54.6875f, +-101.563f,21.5895f,-54.6875f, +-97.6563f,22.2376f,-54.6875f, +-93.75f,23.679f,-54.6875f, +-89.8438f,24.9403f,-54.6875f, +-85.9375f,26.4205f,-54.6875f, +-82.0313f,27.9125f,-54.6875f, +-78.125f,30.0689f,-54.6875f, +-74.2188f,32.7388f,-54.6875f, +-70.3125f,34.3502f,-54.6875f, +-66.4063f,35.6763f,-54.6875f, +-62.5f,37.4625f,-54.6875f, +-58.5938f,38.3448f,-54.6875f, +-54.6875f,40.6027f,-54.6875f, +-50.7813f,44.4532f,-54.6875f, +-46.875f,47.6182f,-54.6875f, +-42.9688f,49.7683f,-54.6875f, +-39.0625f,52.1875f,-54.6875f, +-35.1563f,54.4951f,-54.6875f, +-31.25f,55.9437f,-54.6875f, +-27.3438f,57.1353f,-54.6875f, +-23.4375f,58.016f,-54.6875f, +-19.5313f,59.6013f,-54.6875f, +-15.625f,59.9872f,-54.6875f, +-11.7188f,59.8299f,-54.6875f, +-7.8125f,60.1035f,-54.6875f, +-3.90625f,60.8558f,-54.6875f, +0.0f,60.5619f,-54.6875f, +3.90625f,60.3928f,-54.6875f, +-250.0f,4.01167f,-58.5938f, +-246.094f,3.0694f,-58.5938f, +-242.188f,3.37661f,-58.5938f, +-238.281f,3.71931f,-58.5938f, +-234.375f,4.08816f,-58.5938f, +-230.469f,5.56386f,-58.5938f, +-226.563f,7.3314f,-58.5938f, +-222.656f,8.61323f,-58.5938f, +-218.75f,9.77849f,-58.5938f, +-214.844f,11.9744f,-58.5938f, +-210.938f,12.9366f,-58.5938f, +-207.031f,13.5175f,-58.5938f, +-203.125f,13.948f,-58.5938f, +-199.219f,14.4053f,-58.5938f, +-195.313f,16.1496f,-58.5938f, +-191.406f,17.8653f,-58.5938f, +-187.5f,18.9853f,-58.5938f, +-183.594f,21.2985f,-58.5938f, +-179.688f,23.4932f,-58.5938f, +-175.781f,25.3544f,-58.5938f, +-171.875f,26.1087f,-58.5938f, +-167.969f,26.5864f,-58.5938f, +-164.063f,25.8729f,-58.5938f, +-160.156f,25.0068f,-58.5938f, +-156.25f,25.2867f,-58.5938f, +-152.344f,23.9482f,-58.5938f, +-148.438f,23.23f,-58.5938f, +-144.531f,22.6171f,-58.5938f, +-140.625f,21.4991f,-58.5938f, +-136.719f,21.0822f,-58.5938f, +-132.813f,21.0037f,-58.5938f, +-128.906f,21.8362f,-58.5938f, +-125.0f,21.5985f,-58.5938f, +-121.094f,20.951f,-58.5938f, +-117.188f,21.2066f,-58.5938f, +-113.281f,19.7479f,-58.5938f, +-109.375f,18.5787f,-58.5938f, +-105.469f,20.3984f,-58.5938f, +-101.563f,22.257f,-58.5938f, +-97.6563f,23.3411f,-58.5938f, +-93.75f,24.362f,-58.5938f, +-89.8438f,25.7544f,-58.5938f, +-85.9375f,27.7522f,-58.5938f, +-82.0313f,28.9204f,-58.5938f, +-78.125f,30.8124f,-58.5938f, +-74.2188f,32.9097f,-58.5938f, +-70.3125f,34.8737f,-58.5938f, +-66.4063f,36.0518f,-58.5938f, +-62.5f,38.506f,-58.5938f, +-58.5938f,41.2951f,-58.5938f, +-54.6875f,43.3387f,-58.5938f, +-50.7813f,46.5457f,-58.5938f, +-46.875f,49.2409f,-58.5938f, +-42.9688f,51.3946f,-58.5938f, +-39.0625f,54.0957f,-58.5938f, +-35.1563f,55.8205f,-58.5938f, +-31.25f,57.094f,-58.5938f, +-27.3438f,58.0636f,-58.5938f, +-23.4375f,58.8159f,-58.5938f, +-19.5313f,59.9761f,-58.5938f, +-15.625f,60.2094f,-58.5938f, +-11.7188f,60.0275f,-58.5938f, +-7.8125f,61.0991f,-58.5938f, +-3.90625f,61.4786f,-58.5938f, +0.0f,61.4895f,-58.5938f, +3.90625f,61.5747f,-58.5938f, +-250.0f,5.54938f,-62.5f, +-246.094f,4.18374f,-62.5f, +-242.188f,3.90057f,-62.5f, +-238.281f,4.25951f,-62.5f, +-234.375f,4.82365f,-62.5f, +-230.469f,6.03197f,-62.5f, +-226.563f,7.69909f,-62.5f, +-222.656f,8.80826f,-62.5f, +-218.75f,10.8241f,-62.5f, +-214.844f,13.5771f,-62.5f, +-210.938f,14.456f,-62.5f, +-207.031f,15.0395f,-62.5f, +-203.125f,14.5505f,-62.5f, +-199.219f,16.1706f,-62.5f, +-195.313f,16.9508f,-62.5f, +-191.406f,18.2016f,-62.5f, +-187.5f,19.8694f,-62.5f, +-183.594f,22.6167f,-62.5f, +-179.688f,24.5727f,-62.5f, +-175.781f,26.0063f,-62.5f, +-171.875f,26.0399f,-62.5f, +-167.969f,26.6416f,-62.5f, +-164.063f,25.6476f,-62.5f, +-160.156f,24.4615f,-62.5f, +-156.25f,23.5295f,-62.5f, +-152.344f,23.7879f,-62.5f, +-148.438f,22.8826f,-62.5f, +-144.531f,21.6558f,-62.5f, +-140.625f,20.6405f,-62.5f, +-136.719f,20.1695f,-62.5f, +-132.813f,20.7715f,-62.5f, +-128.906f,20.5918f,-62.5f, +-125.0f,20.4476f,-62.5f, +-121.094f,19.9068f,-62.5f, +-117.188f,19.4838f,-62.5f, +-113.281f,17.843f,-62.5f, +-109.375f,18.5661f,-62.5f, +-105.469f,20.1106f,-62.5f, +-101.563f,21.3182f,-62.5f, +-97.6563f,23.2851f,-62.5f, +-93.75f,24.3601f,-62.5f, +-89.8438f,26.3742f,-62.5f, +-85.9375f,27.7409f,-62.5f, +-82.0313f,29.533f,-62.5f, +-78.125f,31.5622f,-62.5f, +-74.2188f,33.2773f,-62.5f, +-70.3125f,35.6025f,-62.5f, +-66.4063f,38.4255f,-62.5f, +-62.5f,40.916f,-62.5f, +-58.5938f,43.9378f,-62.5f, +-54.6875f,45.9116f,-62.5f, +-50.7813f,48.3177f,-62.5f, +-46.875f,50.1977f,-62.5f, +-42.9688f,52.4552f,-62.5f, +-39.0625f,54.6779f,-62.5f, +-35.1563f,56.1564f,-62.5f, +-31.25f,57.5665f,-62.5f, +-27.3438f,58.7762f,-62.5f, +-23.4375f,59.115f,-62.5f, +-19.5313f,58.5535f,-62.5f, +-15.625f,58.2117f,-62.5f, +-11.7188f,59.0863f,-62.5f, +-7.8125f,60.3775f,-62.5f, +-3.90625f,61.0192f,-62.5f, +0.0f,61.864f,-62.5f, +3.90625f,62.1111f,-62.5f, +-250.0f,6.08003f,-66.4063f, +-246.094f,5.13458f,-66.4063f, +-242.188f,5.0967f,-66.4063f, +-238.281f,5.36926f,-66.4063f, +-234.375f,5.21926f,-66.4063f, +-230.469f,6.37997f,-66.4063f, +-226.563f,7.85032f,-66.4063f, +-222.656f,9.36117f,-66.4063f, +-218.75f,11.896f,-66.4063f, +-214.844f,13.9549f,-66.4063f, +-210.938f,15.4673f,-66.4063f, +-207.031f,15.9885f,-66.4063f, +-203.125f,16.4425f,-66.4063f, +-199.219f,17.4253f,-66.4063f, +-195.313f,18.1385f,-66.4063f, +-191.406f,18.8676f,-66.4063f, +-187.5f,20.1316f,-66.4063f, +-183.594f,22.8534f,-66.4063f, +-179.688f,24.5364f,-66.4063f, +-175.781f,25.6234f,-66.4063f, +-171.875f,25.9362f,-66.4063f, +-167.969f,25.7735f,-66.4063f, +-164.063f,25.1524f,-66.4063f, +-160.156f,24.4245f,-66.4063f, +-156.25f,22.8769f,-66.4063f, +-152.344f,22.8762f,-66.4063f, +-148.438f,21.9008f,-66.4063f, +-144.531f,20.9242f,-66.4063f, +-140.625f,20.1022f,-66.4063f, +-136.719f,19.5823f,-66.4063f, +-132.813f,19.4415f,-66.4063f, +-128.906f,18.9513f,-66.4063f, +-125.0f,18.9264f,-66.4063f, +-121.094f,18.6878f,-66.4063f, +-117.188f,17.8998f,-66.4063f, +-113.281f,17.9815f,-66.4063f, +-109.375f,18.2652f,-66.4063f, +-105.469f,19.533f,-66.4063f, +-101.563f,21.0045f,-66.4063f, +-97.6563f,22.2461f,-66.4063f, +-93.75f,23.7189f,-66.4063f, +-89.8438f,25.574f,-66.4063f, +-85.9375f,27.55f,-66.4063f, +-82.0313f,29.733f,-66.4063f, +-78.125f,31.0763f,-66.4063f, +-74.2188f,33.9607f,-66.4063f, +-70.3125f,37.3595f,-66.4063f, +-66.4063f,41.019f,-66.4063f, +-62.5f,43.7286f,-66.4063f, +-58.5938f,46.5077f,-66.4063f, +-54.6875f,47.985f,-66.4063f, +-50.7813f,49.2623f,-66.4063f, +-46.875f,50.9465f,-66.4063f, +-42.9688f,52.912f,-66.4063f, +-39.0625f,55.0349f,-66.4063f, +-35.1563f,56.428f,-66.4063f, +-31.25f,57.3951f,-66.4063f, +-27.3438f,58.5332f,-66.4063f, +-23.4375f,58.3328f,-66.4063f, +-19.5313f,56.9549f,-66.4063f, +-15.625f,56.9387f,-66.4063f, +-11.7188f,58.3656f,-66.4063f, +-7.8125f,59.6577f,-66.4063f, +-3.90625f,59.8566f,-66.4063f, +0.0f,60.693f,-66.4063f, +3.90625f,60.8569f,-66.4063f, +-250.0f,6.38861f,-70.3125f, +-246.094f,6.37976f,-70.3125f, +-242.188f,6.52455f,-70.3125f, +-238.281f,6.93657f,-70.3125f, +-234.375f,6.77321f,-70.3125f, +-230.469f,7.26034f,-70.3125f, +-226.563f,8.99316f,-70.3125f, +-222.656f,10.5015f,-70.3125f, +-218.75f,11.631f,-70.3125f, +-214.844f,14.0548f,-70.3125f, +-210.938f,15.9163f,-70.3125f, +-207.031f,16.6824f,-70.3125f, +-203.125f,17.1063f,-70.3125f, +-199.219f,18.066f,-70.3125f, +-195.313f,18.5539f,-70.3125f, +-191.406f,18.8425f,-70.3125f, +-187.5f,20.7731f,-70.3125f, +-183.594f,22.8929f,-70.3125f, +-179.688f,24.2011f,-70.3125f, +-175.781f,24.5512f,-70.3125f, +-171.875f,24.651f,-70.3125f, +-167.969f,23.9906f,-70.3125f, +-164.063f,23.6279f,-70.3125f, +-160.156f,23.6162f,-70.3125f, +-156.25f,22.3196f,-70.3125f, +-152.344f,22.173f,-70.3125f, +-148.438f,20.6833f,-70.3125f, +-144.531f,19.6848f,-70.3125f, +-140.625f,18.4633f,-70.3125f, +-136.719f,18.2692f,-70.3125f, +-132.813f,18.0595f,-70.3125f, +-128.906f,17.2062f,-70.3125f, +-125.0f,17.0103f,-70.3125f, +-121.094f,17.1584f,-70.3125f, +-117.188f,17.5441f,-70.3125f, +-113.281f,17.5669f,-70.3125f, +-109.375f,17.7536f,-70.3125f, +-105.469f,18.3913f,-70.3125f, +-101.563f,19.7264f,-70.3125f, +-97.6563f,20.8943f,-70.3125f, +-93.75f,22.7517f,-70.3125f, +-89.8438f,25.1479f,-70.3125f, +-85.9375f,27.3953f,-70.3125f, +-82.0313f,29.5127f,-70.3125f, +-78.125f,31.2816f,-70.3125f, +-74.2188f,34.6589f,-70.3125f, +-70.3125f,38.2161f,-70.3125f, +-66.4063f,42.3872f,-70.3125f, +-62.5f,45.4363f,-70.3125f, +-58.5938f,47.0181f,-70.3125f, +-54.6875f,48.7348f,-70.3125f, +-50.7813f,49.8739f,-70.3125f, +-46.875f,51.2434f,-70.3125f, +-42.9688f,52.9444f,-70.3125f, +-39.0625f,54.8413f,-70.3125f, +-35.1563f,55.8776f,-70.3125f, +-31.25f,56.9088f,-70.3125f, +-27.3438f,56.8827f,-70.3125f, +-23.4375f,56.1649f,-70.3125f, +-19.5313f,54.9828f,-70.3125f, +-15.625f,56.5543f,-70.3125f, +-11.7188f,58.0071f,-70.3125f, +-7.8125f,58.1204f,-70.3125f, +-3.90625f,58.8019f,-70.3125f, +0.0f,59.3765f,-70.3125f, +3.90625f,59.1482f,-70.3125f, +-250.0f,7.29753f,-74.2188f, +-246.094f,6.9318f,-74.2188f, +-242.188f,7.9493f,-74.2188f, +-238.281f,7.61482f,-74.2188f, +-234.375f,8.38948f,-74.2188f, +-230.469f,8.85034f,-74.2188f, +-226.563f,10.783f,-74.2188f, +-222.656f,12.203f,-74.2188f, +-218.75f,12.7122f,-74.2188f, +-214.844f,14.2813f,-74.2188f, +-210.938f,16.1159f,-74.2188f, +-207.031f,16.8501f,-74.2188f, +-203.125f,17.728f,-74.2188f, +-199.219f,18.6948f,-74.2188f, +-195.313f,19.0254f,-74.2188f, +-191.406f,18.9874f,-74.2188f, +-187.5f,20.7575f,-74.2188f, +-183.594f,22.4682f,-74.2188f, +-179.688f,23.785f,-74.2188f, +-175.781f,23.136f,-74.2188f, +-171.875f,22.2872f,-74.2188f, +-167.969f,21.9381f,-74.2188f, +-164.063f,22.818f,-74.2188f, +-160.156f,21.8019f,-74.2188f, +-156.25f,21.3496f,-74.2188f, +-152.344f,19.9092f,-74.2188f, +-148.438f,19.5338f,-74.2188f, +-144.531f,19.2227f,-74.2188f, +-140.625f,17.2583f,-74.2188f, +-136.719f,15.7727f,-74.2188f, +-132.813f,15.2069f,-74.2188f, +-128.906f,15.0929f,-74.2188f, +-125.0f,15.3066f,-74.2188f, +-121.094f,15.1161f,-74.2188f, +-117.188f,16.1171f,-74.2188f, +-113.281f,17.2851f,-74.2188f, +-109.375f,16.8359f,-74.2188f, +-105.469f,17.6612f,-74.2188f, +-101.563f,18.1651f,-74.2188f, +-97.6563f,18.9354f,-74.2188f, +-93.75f,21.1152f,-74.2188f, +-89.8438f,23.9267f,-74.2188f, +-85.9375f,26.5361f,-74.2188f, +-82.0313f,29.6007f,-74.2188f, +-78.125f,31.8355f,-74.2188f, +-74.2188f,34.5711f,-74.2188f, +-70.3125f,37.6211f,-74.2188f, +-66.4063f,41.978f,-74.2188f, +-62.5f,44.757f,-74.2188f, +-58.5938f,47.2561f,-74.2188f, +-54.6875f,48.796f,-74.2188f, +-50.7813f,50.085f,-74.2188f, +-46.875f,51.427f,-74.2188f, +-42.9688f,52.9103f,-74.2188f, +-39.0625f,53.6345f,-74.2188f, +-35.1563f,55.5589f,-74.2188f, +-31.25f,56.4557f,-74.2188f, +-27.3438f,55.8259f,-74.2188f, +-23.4375f,55.2472f,-74.2188f, +-19.5313f,54.9161f,-74.2188f, +-15.625f,56.2403f,-74.2188f, +-11.7188f,57.7266f,-74.2188f, +-7.8125f,57.6855f,-74.2188f, +-3.90625f,57.4796f,-74.2188f, +0.0f,56.3955f,-74.2188f, +3.90625f,56.5167f,-74.2188f, +-250.0f,8.88618f,-78.125f, +-246.094f,8.31776f,-78.125f, +-242.188f,8.67289f,-78.125f, +-238.281f,9.52219f,-78.125f, +-234.375f,9.78196f,-78.125f, +-230.469f,11.3032f,-78.125f, +-226.563f,13.1558f,-78.125f, +-222.656f,14.4361f,-78.125f, +-218.75f,15.5721f,-78.125f, +-214.844f,14.3491f,-78.125f, +-210.938f,15.6393f,-78.125f, +-207.031f,16.9133f,-78.125f, +-203.125f,18.1402f,-78.125f, +-199.219f,19.179f,-78.125f, +-195.313f,18.9448f,-78.125f, +-191.406f,19.5289f,-78.125f, +-187.5f,20.8547f,-78.125f, +-183.594f,22.7611f,-78.125f, +-179.688f,22.8314f,-78.125f, +-175.781f,21.815f,-78.125f, +-171.875f,22.2112f,-78.125f, +-167.969f,21.9322f,-78.125f, +-164.063f,21.3024f,-78.125f, +-160.156f,20.354f,-78.125f, +-156.25f,19.8588f,-78.125f, +-152.344f,17.8458f,-78.125f, +-148.438f,18.0613f,-78.125f, +-144.531f,17.0664f,-78.125f, +-140.625f,16.2256f,-78.125f, +-136.719f,14.3082f,-78.125f, +-132.813f,13.3463f,-78.125f, +-128.906f,14.3881f,-78.125f, +-125.0f,14.6865f,-78.125f, +-121.094f,14.2011f,-78.125f, +-117.188f,15.4562f,-78.125f, +-113.281f,16.6171f,-78.125f, +-109.375f,16.2869f,-78.125f, +-105.469f,15.9406f,-78.125f, +-101.563f,17.5579f,-78.125f, +-97.6563f,19.157f,-78.125f, +-93.75f,21.0678f,-78.125f, +-89.8438f,23.1633f,-78.125f, +-85.9375f,25.2991f,-78.125f, +-82.0313f,28.9462f,-78.125f, +-78.125f,31.8594f,-78.125f, +-74.2188f,35.2294f,-78.125f, +-70.3125f,36.9557f,-78.125f, +-66.4063f,40.692f,-78.125f, +-62.5f,44.5904f,-78.125f, +-58.5938f,46.9805f,-78.125f, +-54.6875f,48.3073f,-78.125f, +-50.7813f,49.8001f,-78.125f, +-46.875f,51.4881f,-78.125f, +-42.9688f,52.7488f,-78.125f, +-39.0625f,53.0994f,-78.125f, +-35.1563f,54.6505f,-78.125f, +-31.25f,55.3393f,-78.125f, +-27.3438f,55.3608f,-78.125f, +-23.4375f,54.3833f,-78.125f, +-19.5313f,53.9595f,-78.125f, +-15.625f,55.0695f,-78.125f, +-11.7188f,56.423f,-78.125f, +-7.8125f,56.1568f,-78.125f, +-3.90625f,56.2841f,-78.125f, +0.0f,54.7508f,-78.125f, +3.90625f,54.4402f,-78.125f, +-250.0f,10.7839f,-82.0313f, +-246.094f,10.1255f,-82.0313f, +-242.188f,10.6621f,-82.0313f, +-238.281f,11.4172f,-82.0313f, +-234.375f,12.3063f,-82.0313f, +-230.469f,13.4915f,-82.0313f, +-226.563f,14.9113f,-82.0313f, +-222.656f,16.5463f,-82.0313f, +-218.75f,17.3752f,-82.0313f, +-214.844f,16.6701f,-82.0313f, +-210.938f,15.5847f,-82.0313f, +-207.031f,16.6988f,-82.0313f, +-203.125f,17.6449f,-82.0313f, +-199.219f,18.4976f,-82.0313f, +-195.313f,18.033f,-82.0313f, +-191.406f,19.1758f,-82.0313f, +-187.5f,20.7116f,-82.0313f, +-183.594f,21.5492f,-82.0313f, +-179.688f,20.7908f,-82.0313f, +-175.781f,20.6891f,-82.0313f, +-171.875f,21.6368f,-82.0313f, +-167.969f,21.6862f,-82.0313f, +-164.063f,20.4236f,-82.0313f, +-160.156f,19.4449f,-82.0313f, +-156.25f,17.8718f,-82.0313f, +-152.344f,16.0984f,-82.0313f, +-148.438f,16.1225f,-82.0313f, +-144.531f,15.3001f,-82.0313f, +-140.625f,14.0113f,-82.0313f, +-136.719f,12.7128f,-82.0313f, +-132.813f,13.1695f,-82.0313f, +-128.906f,14.1608f,-82.0313f, +-125.0f,14.006f,-82.0313f, +-121.094f,13.5671f,-82.0313f, +-117.188f,14.799f,-82.0313f, +-113.281f,15.6819f,-82.0313f, +-109.375f,15.1047f,-82.0313f, +-105.469f,15.4826f,-82.0313f, +-101.563f,17.2178f,-82.0313f, +-97.6563f,19.1794f,-82.0313f, +-93.75f,21.3021f,-82.0313f, +-89.8438f,21.9981f,-82.0313f, +-85.9375f,24.4031f,-82.0313f, +-82.0313f,28.8062f,-82.0313f, +-78.125f,31.7576f,-82.0313f, +-74.2188f,34.6198f,-82.0313f, +-70.3125f,37.0145f,-82.0313f, +-66.4063f,39.5952f,-82.0313f, +-62.5f,43.4294f,-82.0313f, +-58.5938f,45.9611f,-82.0313f, +-54.6875f,47.398f,-82.0313f, +-50.7813f,49.5672f,-82.0313f, +-46.875f,51.4863f,-82.0313f, +-42.9688f,52.3277f,-82.0313f, +-39.0625f,52.6736f,-82.0313f, +-35.1563f,53.5554f,-82.0313f, +-31.25f,54.4611f,-82.0313f, +-27.3438f,53.3151f,-82.0313f, +-23.4375f,52.9631f,-82.0313f, +-19.5313f,52.3147f,-82.0313f, +-15.625f,53.7891f,-82.0313f, +-11.7188f,54.3962f,-82.0313f, +-7.8125f,54.2326f,-82.0313f, +-3.90625f,53.6717f,-82.0313f, +0.0f,52.8681f,-82.0313f, +3.90625f,51.949f,-82.0313f, +-250.0f,12.2756f,-85.9375f, +-246.094f,11.9011f,-85.9375f, +-242.188f,13.4495f,-85.9375f, +-238.281f,14.3858f,-85.9375f, +-234.375f,14.855f,-85.9375f, +-230.469f,15.3384f,-85.9375f, +-226.563f,17.3357f,-85.9375f, +-222.656f,18.7108f,-85.9375f, +-218.75f,18.0095f,-85.9375f, +-214.844f,17.4308f,-85.9375f, +-210.938f,17.0565f,-85.9375f, +-207.031f,16.4039f,-85.9375f, +-203.125f,17.3449f,-85.9375f, +-199.219f,17.5816f,-85.9375f, +-195.313f,17.7511f,-85.9375f, +-191.406f,18.792f,-85.9375f, +-187.5f,19.7983f,-85.9375f, +-183.594f,19.6069f,-85.9375f, +-179.688f,19.1396f,-85.9375f, +-175.781f,19.0184f,-85.9375f, +-171.875f,19.7492f,-85.9375f, +-167.969f,19.6428f,-85.9375f, +-164.063f,18.6091f,-85.9375f, +-160.156f,18.1998f,-85.9375f, +-156.25f,16.6809f,-85.9375f, +-152.344f,15.0269f,-85.9375f, +-148.438f,13.3773f,-85.9375f, +-144.531f,12.7371f,-85.9375f, +-140.625f,12.2537f,-85.9375f, +-136.719f,12.6536f,-85.9375f, +-132.813f,12.7798f,-85.9375f, +-128.906f,13.2089f,-85.9375f, +-125.0f,12.8356f,-85.9375f, +-121.094f,12.5484f,-85.9375f, +-117.188f,13.5275f,-85.9375f, +-113.281f,13.5387f,-85.9375f, +-109.375f,13.6111f,-85.9375f, +-105.469f,14.7023f,-85.9375f, +-101.563f,16.6526f,-85.9375f, +-97.6563f,17.9729f,-85.9375f, +-93.75f,19.8258f,-85.9375f, +-89.8438f,21.7903f,-85.9375f, +-85.9375f,23.4003f,-85.9375f, +-82.0313f,27.4381f,-85.9375f, +-78.125f,30.1644f,-85.9375f, +-74.2188f,33.7682f,-85.9375f, +-70.3125f,36.1779f,-85.9375f, +-66.4063f,38.1368f,-85.9375f, +-62.5f,41.5768f,-85.9375f, +-58.5938f,43.7832f,-85.9375f, +-54.6875f,45.866f,-85.9375f, +-50.7813f,48.5751f,-85.9375f, +-46.875f,50.4188f,-85.9375f, +-42.9688f,51.0239f,-85.9375f, +-39.0625f,51.2389f,-85.9375f, +-35.1563f,51.8865f,-85.9375f, +-31.25f,52.9036f,-85.9375f, +-27.3438f,52.5405f,-85.9375f, +-23.4375f,52.3296f,-85.9375f, +-19.5313f,52.5889f,-85.9375f, +-15.625f,52.3033f,-85.9375f, +-11.7188f,52.1239f,-85.9375f, +-7.8125f,52.0608f,-85.9375f, +-3.90625f,51.0213f,-85.9375f, +0.0f,50.5601f,-85.9375f, +3.90625f,50.007f,-85.9375f, +-250.0f,13.6424f,-89.8438f, +-246.094f,14.2919f,-89.8438f, +-242.188f,15.9647f,-89.8438f, +-238.281f,17.1274f,-89.8438f, +-234.375f,17.9206f,-89.8438f, +-230.469f,17.9917f,-89.8438f, +-226.563f,19.3423f,-89.8438f, +-222.656f,20.1401f,-89.8438f, +-218.75f,19.295f,-89.8438f, +-214.844f,18.1101f,-89.8438f, +-210.938f,17.3485f,-89.8438f, +-207.031f,17.1077f,-89.8438f, +-203.125f,17.7413f,-89.8438f, +-199.219f,17.2325f,-89.8438f, +-195.313f,17.6696f,-89.8438f, +-191.406f,18.8437f,-89.8438f, +-187.5f,19.1808f,-89.8438f, +-183.594f,18.6366f,-89.8438f, +-179.688f,17.3251f,-89.8438f, +-175.781f,17.5752f,-89.8438f, +-171.875f,18.1005f,-89.8438f, +-167.969f,18.0907f,-89.8438f, +-164.063f,16.519f,-89.8438f, +-160.156f,15.5225f,-89.8438f, +-156.25f,14.3937f,-89.8438f, +-152.344f,13.4199f,-89.8438f, +-148.438f,12.8584f,-89.8438f, +-144.531f,12.8604f,-89.8438f, +-140.625f,12.2817f,-89.8438f, +-136.719f,12.4113f,-89.8438f, +-132.813f,12.9949f,-89.8438f, +-128.906f,11.9716f,-89.8438f, +-125.0f,11.8348f,-89.8438f, +-121.094f,12.2532f,-89.8438f, +-117.188f,12.5983f,-89.8438f, +-113.281f,13.2095f,-89.8438f, +-109.375f,13.7209f,-89.8438f, +-105.469f,13.8655f,-89.8438f, +-101.563f,14.8679f,-89.8438f, +-97.6563f,16.1039f,-89.8438f, +-93.75f,17.9997f,-89.8438f, +-89.8438f,20.0247f,-89.8438f, +-85.9375f,22.8012f,-89.8438f, +-82.0313f,25.8255f,-89.8438f, +-78.125f,29.0288f,-89.8438f, +-74.2188f,31.8325f,-89.8438f, +-70.3125f,34.2688f,-89.8438f, +-66.4063f,37.2576f,-89.8438f, +-62.5f,40.8036f,-89.8438f, +-58.5938f,43.0354f,-89.8438f, +-54.6875f,44.5176f,-89.8438f, +-50.7813f,47.4827f,-89.8438f, +-46.875f,48.9307f,-89.8438f, +-42.9688f,48.82f,-89.8438f, +-39.0625f,48.8887f,-89.8438f, +-35.1563f,50.05f,-89.8438f, +-31.25f,50.9253f,-89.8438f, +-27.3438f,52.3859f,-89.8438f, +-23.4375f,52.2702f,-89.8438f, +-19.5313f,52.0708f,-89.8438f, +-15.625f,51.2832f,-89.8438f, +-11.7188f,50.0989f,-89.8438f, +-7.8125f,49.6111f,-89.8438f, +-3.90625f,48.7785f,-89.8438f, +0.0f,48.7183f,-89.8438f, +3.90625f,47.6596f,-89.8438f, +-250.0f,15.247f,-93.75f, +-246.094f,17.6018f,-93.75f, +-242.188f,19.2494f,-93.75f, +-238.281f,20.8362f,-93.75f, +-234.375f,20.4345f,-93.75f, +-230.469f,21.1572f,-93.75f, +-226.563f,21.3131f,-93.75f, +-222.656f,20.8797f,-93.75f, +-218.75f,20.5347f,-93.75f, +-214.844f,19.3559f,-93.75f, +-210.938f,18.2443f,-93.75f, +-207.031f,17.5994f,-93.75f, +-203.125f,18.0336f,-93.75f, +-199.219f,18.0561f,-93.75f, +-195.313f,17.673f,-93.75f, +-191.406f,18.7132f,-93.75f, +-187.5f,18.4272f,-93.75f, +-183.594f,18.078f,-93.75f, +-179.688f,16.7984f,-93.75f, +-175.781f,16.1827f,-93.75f, +-171.875f,16.5937f,-93.75f, +-167.969f,16.0698f,-93.75f, +-164.063f,14.9813f,-93.75f, +-160.156f,13.1718f,-93.75f, +-156.25f,12.1738f,-93.75f, +-152.344f,12.229f,-93.75f, +-148.438f,12.2803f,-93.75f, +-144.531f,12.526f,-93.75f, +-140.625f,11.9028f,-93.75f, +-136.719f,12.3491f,-93.75f, +-132.813f,11.7412f,-93.75f, +-128.906f,11.5455f,-93.75f, +-125.0f,11.6285f,-93.75f, +-121.094f,11.478f,-93.75f, +-117.188f,11.536f,-93.75f, +-113.281f,11.8722f,-93.75f, +-109.375f,12.61f,-93.75f, +-105.469f,12.6899f,-93.75f, +-101.563f,13.1659f,-93.75f, +-97.6563f,14.5994f,-93.75f, +-93.75f,16.6015f,-93.75f, +-89.8438f,19.9429f,-93.75f, +-85.9375f,22.8876f,-93.75f, +-82.0313f,26.3209f,-93.75f, +-78.125f,28.8526f,-93.75f, +-74.2188f,30.2969f,-93.75f, +-70.3125f,33.1597f,-93.75f, +-66.4063f,36.2648f,-93.75f, +-62.5f,39.1918f,-93.75f, +-58.5938f,41.4171f,-93.75f, +-54.6875f,43.4299f,-93.75f, +-50.7813f,45.5438f,-93.75f, +-46.875f,46.6281f,-93.75f, +-42.9688f,46.784f,-93.75f, +-39.0625f,47.3415f,-93.75f, +-35.1563f,48.5539f,-93.75f, +-31.25f,50.5714f,-93.75f, +-27.3438f,51.0532f,-93.75f, +-23.4375f,51.7685f,-93.75f, +-19.5313f,51.3638f,-93.75f, +-15.625f,49.6289f,-93.75f, +-11.7188f,50.0322f,-93.75f, +-7.8125f,48.6289f,-93.75f, +-3.90625f,46.7733f,-93.75f, +0.0f,45.5993f,-93.75f, +3.90625f,45.4182f,-93.75f, +-250.0f,18.5038f,-97.6563f, +-246.094f,20.1199f,-97.6563f, +-242.188f,22.7365f,-97.6563f, +-238.281f,24.311f,-97.6563f, +-234.375f,24.2572f,-97.6563f, +-230.469f,24.3322f,-97.6563f, +-226.563f,24.3501f,-97.6563f, +-222.656f,23.3494f,-97.6563f, +-218.75f,21.7677f,-97.6563f, +-214.844f,20.6573f,-97.6563f, +-210.938f,18.8509f,-97.6563f, +-207.031f,18.1355f,-97.6563f, +-203.125f,18.5785f,-97.6563f, +-199.219f,18.2049f,-97.6563f, +-195.313f,17.4136f,-97.6563f, +-191.406f,18.6105f,-97.6563f, +-187.5f,18.0859f,-97.6563f, +-183.594f,17.3286f,-97.6563f, +-179.688f,16.66f,-97.6563f, +-175.781f,15.1619f,-97.6563f, +-171.875f,14.271f,-97.6563f, +-167.969f,13.4801f,-97.6563f, +-164.063f,12.6373f,-97.6563f, +-160.156f,11.4464f,-97.6563f, +-156.25f,11.5423f,-97.6563f, +-152.344f,11.795f,-97.6563f, +-148.438f,10.9108f,-97.6563f, +-144.531f,11.2217f,-97.6563f, +-140.625f,11.0533f,-97.6563f, +-136.719f,11.5512f,-97.6563f, +-132.813f,11.6628f,-97.6563f, +-128.906f,10.9589f,-97.6563f, +-125.0f,10.3779f,-97.6563f, +-121.094f,9.96294f,-97.6563f, +-117.188f,10.6728f,-97.6563f, +-113.281f,11.2587f,-97.6563f, +-109.375f,11.2512f,-97.6563f, +-105.469f,12.1215f,-97.6563f, +-101.563f,12.0908f,-97.6563f, +-97.6563f,13.5835f,-97.6563f, +-93.75f,16.6536f,-97.6563f, +-89.8438f,19.7104f,-97.6563f, +-85.9375f,22.8325f,-97.6563f, +-82.0313f,26.7422f,-97.6563f, +-78.125f,29.4762f,-97.6563f, +-74.2188f,30.148f,-97.6563f, +-70.3125f,33.5961f,-97.6563f, +-66.4063f,36.1685f,-97.6563f, +-62.5f,37.3648f,-97.6563f, +-58.5938f,39.4445f,-97.6563f, +-54.6875f,40.3698f,-97.6563f, +-50.7813f,43.2595f,-97.6563f, +-46.875f,43.8006f,-97.6563f, +-42.9688f,44.8371f,-97.6563f, +-39.0625f,46.8993f,-97.6563f, +-35.1563f,48.8152f,-97.6563f, +-31.25f,50.2801f,-97.6563f, +-27.3438f,49.7242f,-97.6563f, +-23.4375f,49.8502f,-97.6563f, +-19.5313f,49.8568f,-97.6563f, +-15.625f,48.3267f,-97.6563f, +-11.7188f,47.8521f,-97.6563f, +-7.8125f,47.3364f,-97.6563f, +-3.90625f,46.156f,-97.6563f, +0.0f,44.8966f,-97.6563f, +3.90625f,44.9637f,-97.6563f, +-250.0f,21.0334f,-101.563f, +-246.094f,23.093f,-101.563f, +-242.188f,25.4189f,-101.563f, +-238.281f,27.31f,-101.563f, +-234.375f,26.8223f,-101.563f, +-230.469f,26.375f,-101.563f, +-226.563f,26.7718f,-101.563f, +-222.656f,25.3642f,-101.563f, +-218.75f,23.7619f,-101.563f, +-214.844f,21.4458f,-101.563f, +-210.938f,19.7809f,-101.563f, +-207.031f,19.054f,-101.563f, +-203.125f,19.6087f,-101.563f, +-199.219f,19.2503f,-101.563f, +-195.313f,18.0809f,-101.563f, +-191.406f,17.75f,-101.563f, +-187.5f,17.1292f,-101.563f, +-183.594f,16.2151f,-101.563f, +-179.688f,15.8928f,-101.563f, +-175.781f,14.4866f,-101.563f, +-171.875f,13.9039f,-101.563f, +-167.969f,12.278f,-101.563f, +-164.063f,11.5804f,-101.563f, +-160.156f,12.0152f,-101.563f, +-156.25f,11.7113f,-101.563f, +-152.344f,10.7496f,-101.563f, +-148.438f,9.67121f,-101.563f, +-144.531f,9.72628f,-101.563f, +-140.625f,9.99849f,-101.563f, +-136.719f,10.504f,-101.563f, +-132.813f,11.0917f,-101.563f, +-128.906f,10.4997f,-101.563f, +-125.0f,9.12306f,-101.563f, +-121.094f,8.34841f,-101.563f, +-117.188f,8.92074f,-101.563f, +-113.281f,9.44857f,-101.563f, +-109.375f,10.5456f,-101.563f, +-105.469f,10.7435f,-101.563f, +-101.563f,11.6413f,-101.563f, +-97.6563f,14.2233f,-101.563f, +-93.75f,17.0641f,-101.563f, +-89.8438f,20.5963f,-101.563f, +-85.9375f,22.9601f,-101.563f, +-82.0313f,26.0881f,-101.563f, +-78.125f,28.3451f,-101.563f, +-74.2188f,30.4473f,-101.563f, +-70.3125f,33.7644f,-101.563f, +-66.4063f,36.3074f,-101.563f, +-62.5f,38.0683f,-101.563f, +-58.5938f,39.1597f,-101.563f, +-54.6875f,40.3396f,-101.563f, +-50.7813f,41.4946f,-101.563f, +-46.875f,43.0029f,-101.563f, +-42.9688f,44.8434f,-101.563f, +-39.0625f,47.2094f,-101.563f, +-35.1563f,47.3449f,-101.563f, +-31.25f,49.1989f,-101.563f, +-27.3438f,48.845f,-101.563f, +-23.4375f,47.635f,-101.563f, +-19.5313f,47.9355f,-101.563f, +-15.625f,47.1439f,-101.563f, +-11.7188f,45.929f,-101.563f, +-7.8125f,46.9058f,-101.563f, +-3.90625f,46.1235f,-101.563f, +0.0f,45.2655f,-101.563f, +3.90625f,44.5311f,-101.563f, +-250.0f,24.0006f,-105.469f, +-246.094f,26.733f,-105.469f, +-242.188f,28.4305f,-105.469f, +-238.281f,29.0431f,-105.469f, +-234.375f,28.1582f,-105.469f, +-230.469f,28.0178f,-105.469f, +-226.563f,27.4417f,-105.469f, +-222.656f,27.0081f,-105.469f, +-218.75f,24.9646f,-105.469f, +-214.844f,22.8713f,-105.469f, +-210.938f,21.4507f,-105.469f, +-207.031f,21.2058f,-105.469f, +-203.125f,20.8114f,-105.469f, +-199.219f,20.7281f,-105.469f, +-195.313f,19.7358f,-105.469f, +-191.406f,18.4733f,-105.469f, +-187.5f,17.1875f,-105.469f, +-183.594f,15.4383f,-105.469f, +-179.688f,14.151f,-105.469f, +-175.781f,13.882f,-105.469f, +-171.875f,12.9008f,-105.469f, +-167.969f,11.246f,-105.469f, +-164.063f,11.1287f,-105.469f, +-160.156f,10.748f,-105.469f, +-156.25f,11.5003f,-105.469f, +-152.344f,10.3683f,-105.469f, +-148.438f,9.87346f,-105.469f, +-144.531f,9.6524f,-105.469f, +-140.625f,8.36957f,-105.469f, +-136.719f,9.12242f,-105.469f, +-132.813f,9.41585f,-105.469f, +-128.906f,8.97735f,-105.469f, +-125.0f,7.89593f,-105.469f, +-121.094f,7.20155f,-105.469f, +-117.188f,6.63681f,-105.469f, +-113.281f,8.27572f,-105.469f, +-109.375f,8.39126f,-105.469f, +-105.469f,9.69363f,-105.469f, +-101.563f,12.2269f,-105.469f, +-97.6563f,15.3785f,-105.469f, +-93.75f,18.1643f,-105.469f, +-89.8438f,20.8715f,-105.469f, +-85.9375f,23.5096f,-105.469f, +-82.0313f,25.2072f,-105.469f, +-78.125f,27.8536f,-105.469f, +-74.2188f,30.8436f,-105.469f, +-70.3125f,33.8966f,-105.469f, +-66.4063f,36.3107f,-105.469f, +-62.5f,37.9291f,-105.469f, +-58.5938f,39.7963f,-105.469f, +-54.6875f,40.5554f,-105.469f, +-50.7813f,42.1374f,-105.469f, +-46.875f,42.7622f,-105.469f, +-42.9688f,44.5703f,-105.469f, +-39.0625f,46.4665f,-105.469f, +-35.1563f,46.6101f,-105.469f, +-31.25f,47.1188f,-105.469f, +-27.3438f,48.052f,-105.469f, +-23.4375f,47.7845f,-105.469f, +-19.5313f,47.8159f,-105.469f, +-15.625f,46.7772f,-105.469f, +-11.7188f,46.0033f,-105.469f, +-7.8125f,47.2861f,-105.469f, +-3.90625f,46.9832f,-105.469f, +0.0f,45.6472f,-105.469f, +3.90625f,44.8466f,-105.469f, +-250.0f,27.0053f,-109.375f, +-246.094f,28.4873f,-109.375f, +-242.188f,29.8219f,-109.375f, +-238.281f,30.0561f,-109.375f, +-234.375f,29.2892f,-109.375f, +-230.469f,29.5933f,-109.375f, +-226.563f,28.8697f,-109.375f, +-222.656f,27.4881f,-109.375f, +-218.75f,25.7165f,-109.375f, +-214.844f,23.9985f,-109.375f, +-210.938f,23.3958f,-109.375f, +-207.031f,23.3567f,-109.375f, +-203.125f,23.3311f,-109.375f, +-199.219f,22.2114f,-109.375f, +-195.313f,21.0452f,-109.375f, +-191.406f,20.2153f,-109.375f, +-187.5f,18.8202f,-109.375f, +-183.594f,16.7998f,-109.375f, +-179.688f,15.8942f,-109.375f, +-175.781f,14.8638f,-109.375f, +-171.875f,13.1475f,-109.375f, +-167.969f,12.7375f,-109.375f, +-164.063f,10.7456f,-109.375f, +-160.156f,10.2908f,-109.375f, +-156.25f,9.65347f,-109.375f, +-152.344f,10.1273f,-109.375f, +-148.438f,9.91826f,-109.375f, +-144.531f,8.92229f,-109.375f, +-140.625f,8.34112f,-109.375f, +-136.719f,7.82043f,-109.375f, +-132.813f,7.17703f,-109.375f, +-128.906f,7.28288f,-109.375f, +-125.0f,6.94364f,-109.375f, +-121.094f,6.57742f,-109.375f, +-117.188f,5.68794f,-109.375f, +-113.281f,5.66654f,-109.375f, +-109.375f,6.9457f,-109.375f, +-105.469f,9.81036f,-109.375f, +-101.563f,12.6651f,-109.375f, +-97.6563f,15.2246f,-109.375f, +-93.75f,18.3914f,-109.375f, +-89.8438f,21.0454f,-109.375f, +-85.9375f,23.3579f,-109.375f, +-82.0313f,25.0292f,-109.375f, +-78.125f,28.9637f,-109.375f, +-74.2188f,31.9858f,-109.375f, +-70.3125f,34.5815f,-109.375f, +-66.4063f,37.1495f,-109.375f, +-62.5f,38.5371f,-109.375f, +-58.5938f,39.6993f,-109.375f, +-54.6875f,41.3314f,-109.375f, +-50.7813f,42.3279f,-109.375f, +-46.875f,43.399f,-109.375f, +-42.9688f,44.8971f,-109.375f, +-39.0625f,46.4515f,-109.375f, +-35.1563f,46.6684f,-109.375f, +-31.25f,47.2696f,-109.375f, +-27.3438f,48.2082f,-109.375f, +-23.4375f,47.2707f,-109.375f, +-19.5313f,47.952f,-109.375f, +-15.625f,47.4088f,-109.375f, +-11.7188f,47.3981f,-109.375f, +-7.8125f,48.0766f,-109.375f, +-3.90625f,47.4974f,-109.375f, +0.0f,46.1817f,-109.375f, +3.90625f,45.3987f,-109.375f, +-250.0f,28.5243f,-113.281f, +-246.094f,30.3032f,-113.281f, +-242.188f,31.2443f,-113.281f, +-238.281f,30.733f,-113.281f, +-234.375f,31.2433f,-113.281f, +-230.469f,31.5829f,-113.281f, +-226.563f,30.3008f,-113.281f, +-222.656f,28.2348f,-113.281f, +-218.75f,25.8116f,-113.281f, +-214.844f,25.3702f,-113.281f, +-210.938f,24.8435f,-113.281f, +-207.031f,25.7524f,-113.281f, +-203.125f,26.0021f,-113.281f, +-199.219f,24.9024f,-113.281f, +-195.313f,23.7348f,-113.281f, +-191.406f,21.9608f,-113.281f, +-187.5f,20.2108f,-113.281f, +-183.594f,18.963f,-113.281f, +-179.688f,17.7929f,-113.281f, +-175.781f,16.3625f,-113.281f, +-171.875f,14.6525f,-113.281f, +-167.969f,13.4453f,-113.281f, +-164.063f,11.5352f,-113.281f, +-160.156f,10.457f,-113.281f, +-156.25f,9.86849f,-113.281f, +-152.344f,9.76379f,-113.281f, +-148.438f,9.40799f,-113.281f, +-144.531f,8.38098f,-113.281f, +-140.625f,8.03078f,-113.281f, +-136.719f,7.4536f,-113.281f, +-132.813f,6.32375f,-113.281f, +-128.906f,5.90846f,-113.281f, +-125.0f,5.44126f,-113.281f, +-121.094f,5.53385f,-113.281f, +-117.188f,5.35081f,-113.281f, +-113.281f,6.14244f,-113.281f, +-109.375f,7.72509f,-113.281f, +-105.469f,9.98969f,-113.281f, +-101.563f,12.8924f,-113.281f, +-97.6563f,15.6605f,-113.281f, +-93.75f,18.4427f,-113.281f, +-89.8438f,20.4633f,-113.281f, +-85.9375f,22.3484f,-113.281f, +-82.0313f,25.7434f,-113.281f, +-78.125f,29.5649f,-113.281f, +-74.2188f,32.7377f,-113.281f, +-70.3125f,34.4529f,-113.281f, +-66.4063f,37.0096f,-113.281f, +-62.5f,38.2565f,-113.281f, +-58.5938f,39.8951f,-113.281f, +-54.6875f,41.291f,-113.281f, +-50.7813f,42.6018f,-113.281f, +-46.875f,43.3624f,-113.281f, +-42.9688f,44.3449f,-113.281f, +-39.0625f,45.4446f,-113.281f, +-35.1563f,46.0157f,-113.281f, +-31.25f,47.6632f,-113.281f, +-27.3438f,47.6934f,-113.281f, +-23.4375f,46.4824f,-113.281f, +-19.5313f,48.2708f,-113.281f, +-15.625f,48.5036f,-113.281f, +-11.7188f,47.6795f,-113.281f, +-7.8125f,48.4742f,-113.281f, +-3.90625f,48.509f,-113.281f, +0.0f,47.4037f,-113.281f, +3.90625f,47.4869f,-113.281f, +-250.0f,30.7007f,-117.188f, +-246.094f,31.6625f,-117.188f, +-242.188f,31.8246f,-117.188f, +-238.281f,32.4951f,-117.188f, +-234.375f,33.3552f,-117.188f, +-230.469f,32.7471f,-117.188f, +-226.563f,30.8092f,-117.188f, +-222.656f,28.3135f,-117.188f, +-218.75f,27.0912f,-117.188f, +-214.844f,27.0184f,-117.188f, +-210.938f,27.5702f,-117.188f, +-207.031f,27.9311f,-117.188f, +-203.125f,28.0909f,-117.188f, +-199.219f,26.6916f,-117.188f, +-195.313f,25.6983f,-117.188f, +-191.406f,24.0617f,-117.188f, +-187.5f,22.1476f,-117.188f, +-183.594f,20.964f,-117.188f, +-179.688f,19.1417f,-117.188f, +-175.781f,18.0941f,-117.188f, +-171.875f,16.3483f,-117.188f, +-167.969f,13.8969f,-117.188f, +-164.063f,12.2065f,-117.188f, +-160.156f,10.4346f,-117.188f, +-156.25f,9.28283f,-117.188f, +-152.344f,8.20933f,-117.188f, +-148.438f,7.69157f,-117.188f, +-144.531f,7.05251f,-117.188f, +-140.625f,6.38685f,-117.188f, +-136.719f,5.88862f,-117.188f, +-132.813f,4.48007f,-117.188f, +-128.906f,4.03049f,-117.188f, +-125.0f,4.96603f,-117.188f, +-121.094f,6.08105f,-117.188f, +-117.188f,6.76315f,-117.188f, +-113.281f,7.41087f,-117.188f, +-109.375f,7.5353f,-117.188f, +-105.469f,9.88018f,-117.188f, +-101.563f,11.8887f,-117.188f, +-97.6563f,14.4702f,-117.188f, +-93.75f,17.2187f,-117.188f, +-89.8438f,20.2241f,-117.188f, +-85.9375f,22.2766f,-117.188f, +-82.0313f,25.968f,-117.188f, +-78.125f,29.2923f,-117.188f, +-74.2188f,31.9825f,-117.188f, +-70.3125f,34.0756f,-117.188f, +-66.4063f,35.9202f,-117.188f, +-62.5f,37.9131f,-117.188f, +-58.5938f,39.2288f,-117.188f, +-54.6875f,40.591f,-117.188f, +-50.7813f,42.5191f,-117.188f, +-46.875f,42.7237f,-117.188f, +-42.9688f,43.8388f,-117.188f, +-39.0625f,45.2151f,-117.188f, +-35.1563f,45.096f,-117.188f, +-31.25f,45.9904f,-117.188f, +-27.3438f,45.2594f,-117.188f, +-23.4375f,45.7333f,-117.188f, +-19.5313f,47.4248f,-117.188f, +-15.625f,48.122f,-117.188f, +-11.7188f,48.0312f,-117.188f, +-7.8125f,49.0431f,-117.188f, +-3.90625f,49.2804f,-117.188f, +0.0f,48.803f,-117.188f, +3.90625f,48.3887f,-117.188f, +-250.0f,31.7497f,-121.094f, +-246.094f,31.3973f,-121.094f, +-242.188f,32.0742f,-121.094f, +-238.281f,33.1521f,-121.094f, +-234.375f,33.6068f,-121.094f, +-230.469f,31.9815f,-121.094f, +-226.563f,30.2957f,-121.094f, +-222.656f,28.5699f,-121.094f, +-218.75f,28.3353f,-121.094f, +-214.844f,28.8422f,-121.094f, +-210.938f,29.4292f,-121.094f, +-207.031f,29.2833f,-121.094f, +-203.125f,28.4123f,-121.094f, +-199.219f,27.4455f,-121.094f, +-195.313f,26.9053f,-121.094f, +-191.406f,24.8164f,-121.094f, +-187.5f,22.4409f,-121.094f, +-183.594f,21.5447f,-121.094f, +-179.688f,20.6668f,-121.094f, +-175.781f,18.9757f,-121.094f, +-171.875f,16.8092f,-121.094f, +-167.969f,14.4997f,-121.094f, +-164.063f,13.0122f,-121.094f, +-160.156f,11.2904f,-121.094f, +-156.25f,9.63825f,-121.094f, +-152.344f,8.62771f,-121.094f, +-148.438f,7.36842f,-121.094f, +-144.531f,6.44275f,-121.094f, +-140.625f,5.50805f,-121.094f, +-136.719f,6.00349f,-121.094f, +-132.813f,4.67796f,-121.094f, +-128.906f,3.93081f,-121.094f, +-125.0f,5.39329f,-121.094f, +-121.094f,6.95361f,-121.094f, +-117.188f,8.00676f,-121.094f, +-113.281f,7.76936f,-121.094f, +-109.375f,8.598f,-121.094f, +-105.469f,9.71941f,-121.094f, +-101.563f,11.4789f,-121.094f, +-97.6563f,13.572f,-121.094f, +-93.75f,16.0296f,-121.094f, +-89.8438f,18.5079f,-121.094f, +-85.9375f,22.5232f,-121.094f, +-82.0313f,25.7298f,-121.094f, +-78.125f,29.0421f,-121.094f, +-74.2188f,31.8936f,-121.094f, +-70.3125f,33.6857f,-121.094f, +-66.4063f,35.8951f,-121.094f, +-62.5f,37.4244f,-121.094f, +-58.5938f,39.1337f,-121.094f, +-54.6875f,40.6842f,-121.094f, +-50.7813f,41.8829f,-121.094f, +-46.875f,42.9851f,-121.094f, +-42.9688f,42.3613f,-121.094f, +-39.0625f,44.0627f,-121.094f, +-35.1563f,43.3741f,-121.094f, +-31.25f,43.2393f,-121.094f, +-27.3438f,44.1982f,-121.094f, +-23.4375f,45.2747f,-121.094f, +-19.5313f,46.6461f,-121.094f, +-15.625f,47.338f,-121.094f, +-11.7188f,48.1318f,-121.094f, +-7.8125f,49.3601f,-121.094f, +-3.90625f,49.6752f,-121.094f, +0.0f,49.3611f,-121.094f, +3.90625f,49.6769f,-121.094f, +-250.0f,31.4025f,-125.0f, +-246.094f,31.4165f,-125.0f, +-242.188f,32.314f,-125.0f, +-238.281f,32.9822f,-125.0f, +-234.375f,32.6962f,-125.0f, +-230.469f,31.3632f,-125.0f, +-226.563f,29.4391f,-125.0f, +-222.656f,29.519f,-125.0f, +-218.75f,29.4481f,-125.0f, +-214.844f,29.8481f,-125.0f, +-210.938f,30.408f,-125.0f, +-207.031f,30.291f,-125.0f, +-203.125f,28.7473f,-125.0f, +-199.219f,28.1816f,-125.0f, +-195.313f,27.2839f,-125.0f, +-191.406f,25.7018f,-125.0f, +-187.5f,23.2882f,-125.0f, +-183.594f,22.1614f,-125.0f, +-179.688f,20.658f,-125.0f, +-175.781f,18.8433f,-125.0f, +-171.875f,16.364f,-125.0f, +-167.969f,14.7298f,-125.0f, +-164.063f,12.9859f,-125.0f, +-160.156f,11.3306f,-125.0f, +-156.25f,10.1916f,-125.0f, +-152.344f,8.3967f,-125.0f, +-148.438f,6.23292f,-125.0f, +-144.531f,5.48985f,-125.0f, +-140.625f,5.18276f,-125.0f, +-136.719f,5.56059f,-125.0f, +-132.813f,5.75157f,-125.0f, +-128.906f,5.32154f,-125.0f, +-125.0f,6.15672f,-125.0f, +-121.094f,7.53373f,-125.0f, +-117.188f,8.38676f,-125.0f, +-113.281f,8.64274f,-125.0f, +-109.375f,8.49941f,-125.0f, +-105.469f,9.24481f,-125.0f, +-101.563f,11.5178f,-125.0f, +-97.6563f,13.4113f,-125.0f, +-93.75f,15.4997f,-125.0f, +-89.8438f,17.3502f,-125.0f, +-85.9375f,20.8168f,-125.0f, +-82.0313f,24.9405f,-125.0f, +-78.125f,27.8681f,-125.0f, +-74.2188f,30.1495f,-125.0f, +-70.3125f,32.4402f,-125.0f, +-66.4063f,34.2537f,-125.0f, +-62.5f,36.5623f,-125.0f, +-58.5938f,38.9027f,-125.0f, +-54.6875f,40.1192f,-125.0f, +-50.7813f,41.9393f,-125.0f, +-46.875f,41.8765f,-125.0f, +-42.9688f,41.6371f,-125.0f, +-39.0625f,41.6432f,-125.0f, +-35.1563f,41.2852f,-125.0f, +-31.25f,41.5629f,-125.0f, +-27.3438f,42.2956f,-125.0f, +-23.4375f,43.9719f,-125.0f, +-19.5313f,46.2232f,-125.0f, +-15.625f,47.3104f,-125.0f, +-11.7188f,47.5943f,-125.0f, +-7.8125f,49.1192f,-125.0f, +-3.90625f,49.6341f,-125.0f, +0.0f,50.3481f,-125.0f, +3.90625f,50.3021f,-125.0f, +}; + +btScalar Landscape05Nml[] = { +-0.379368f,0.918093f,-0.114827f, +-0.372144f,0.893697f,-0.250627f, +-0.36483f,0.925769f,-0.0992527f, +-0.303739f,0.924201f,-0.231506f, +-0.333317f,0.942796f,0.0059764f, +-0.301915f,0.940094f,-0.158338f, +-0.363026f,0.931698f,0.0122604f, +-0.316966f,0.945703f,-0.0719588f, +-0.334188f,0.941548f,0.0424963f, +-0.326039f,0.944563f,-0.0387196f, +-0.382515f,0.923758f,0.0188291f, +-0.388659f,0.920843f,-0.0315106f, +-0.393577f,0.919186f,-0.013971f, +-0.384968f,0.922772f,-0.0170923f, +-0.36589f,0.930393f,-0.0222354f, +-0.357745f,0.933231f,0.0331438f, +-0.482959f,0.873942f,-0.0545559f, +-0.473203f,0.879732f,0.0463645f, +-0.550088f,0.834035f,-0.0423024f, +-0.534007f,0.844766f,0.0347315f, +-0.469703f,0.882824f,0.000376011f, +-0.490919f,0.868868f,0.0637728f, +-0.552202f,0.826862f,-0.106641f, +-0.558464f,0.829519f,0.00395409f, +-0.437742f,0.897949f,-0.0454837f, +-0.437659f,0.898576f,0.0318733f, +-0.370538f,0.927929f,-0.0406078f, +-0.403245f,0.912789f,-0.064878f, +-0.385648f,0.921933f,-0.0362754f, +-0.356223f,0.934382f,-0.00604283f, +-0.30076f,0.953691f,-0.00400305f, +-0.305622f,0.951852f,0.0239231f, +-0.284526f,0.956527f,-0.0640436f, +-0.380428f,0.91278f,-0.148684f, +-0.270228f,0.949845f,-0.157392f, +-0.258662f,0.947281f,-0.189085f, +-0.182234f,0.978377f,-0.0978241f, +-0.170558f,0.969333f,-0.176927f, +-0.205282f,0.978149f,-0.0329196f, +-0.190223f,0.949267f,-0.250415f, +-0.274135f,0.959498f,0.0649128f, +-0.310884f,0.912161f,-0.267046f, +-0.496348f,0.868119f,0.00275513f, +-0.43081f,0.896388f,-0.104358f, +-0.405094f,0.913485f,0.0380057f, +-0.324068f,0.9389f,0.115955f, +-0.25697f,0.965908f,0.0314342f, +-0.271227f,0.948776f,0.162051f, +-0.254963f,0.963309f,-0.0838379f, +-0.344475f,0.938191f,-0.03368f, +-0.111765f,0.981495f,-0.15549f, +-0.167507f,0.982459f,-0.0819529f, +-0.0010222f,0.966945f,-0.254984f, +-0.0444844f,0.98477f,-0.168075f, +0.186055f,0.950323f,-0.249537f, +0.1896f,0.965697f,-0.177427f, +0.271688f,0.939248f,-0.209761f, +0.279232f,0.936599f,-0.211687f, +0.322549f,0.939459f,-0.115666f, +0.354799f,0.922502f,-0.152013f, +0.252542f,0.965579f,-0.0622893f, +0.223889f,0.935481f,-0.273404f, +0.054661f,0.998373f,-0.0162575f, +0.0861707f,0.972348f,-0.217056f, +0.0124775f,0.999913f,-0.00421609f, +0.0330599f,0.976575f,-0.212621f, +0.0918366f,0.994675f,0.046771f, +0.166973f,0.980978f,-0.0990035f, +0.0387017f,0.993028f,0.111346f, +0.125297f,0.990619f,0.054541f, +0.0541059f,0.984899f,0.164456f, +0.149711f,0.968151f,0.200673f, +0.168008f,0.956272f,0.239411f, +0.195367f,0.93223f,0.304595f, +0.147118f,0.96491f,0.217497f, +0.125818f,0.960755f,0.247225f, +0.270517f,0.934497f,0.23138f, +0.29818f,0.904256f,0.305629f, +0.363841f,0.900609f,0.237745f, +0.316827f,0.923009f,0.218347f, +0.413166f,0.893779f,0.17451f, +0.334815f,0.940911f,0.0508378f, +0.474676f,0.869519f,0.136452f, +0.456974f,0.889396f,0.0122055f, +0.272216f,0.960219f,0.0622813f, +0.228855f,0.962963f,-0.142573f, +0.0810211f,0.995842f,0.0416494f, +0.189938f,0.980101f,0.0576713f, +-0.0449078f,0.994712f,0.0923629f, +-0.00155869f,0.98749f,0.157671f, +-0.0840704f,0.991095f,0.103263f, +-0.0968834f,0.985327f,0.140515f, +0.0427121f,0.991995f,0.118832f, +-0.0240058f,0.999711f,0.000939081f, +-0.124569f,0.986858f,0.10293f, +-0.167243f,0.982306f,-0.0842863f, +-0.286295f,0.953093f,0.0982316f, +-0.243406f,0.969914f,-0.00444377f, +-0.280466f,0.950626f,0.132851f, +-0.21091f,0.972115f,0.102516f, +-0.230061f,0.951476f,0.204368f, +-0.123921f,0.950092f,0.286301f, +-0.126792f,0.952499f,0.276893f, +-0.0764868f,0.927481f,0.365962f, +-0.0452811f,0.949055f,0.31184f, +-0.138647f,0.960819f,0.240008f, +-0.25036f,0.943892f,0.215377f, +-0.314158f,0.941939f,0.118561f, +-0.458647f,0.872527f,0.168342f, +-0.427047f,0.882261f,0.198106f, +-0.485467f,0.864542f,0.129958f, +-0.523912f,0.844181f,0.113461f, +-0.532843f,0.842328f,0.081008f, +-0.518838f,0.84918f,0.0984888f, +-0.439028f,0.883929f,0.16101f, +-0.409166f,0.878784f,0.245606f, +-0.386543f,0.918859f,0.0792661f, +-0.447749f,0.88853f,0.100178f, +-0.431191f,0.90206f,0.0190184f, +-0.467639f,0.880276f,0.0801789f, +-0.518882f,0.844495f,-0.132623f, +-0.570181f,0.817923f,-0.076789f, +-0.420368f,0.883342f,-0.207357f, +-0.464447f,0.877342f,-0.120667f, +-0.386958f,0.877414f,-0.283564f, +-0.442101f,0.874511f,-0.199442f, +-0.380012f,0.859996f,-0.340584f, +-0.442865f,0.822467f,-0.356959f, +-0.24551f,0.880879f,-0.404695f, +-0.263304f,0.844058f,-0.467159f, +-0.116714f,0.897206f,-0.425909f, +-0.129252f,0.860962f,-0.491974f, +-0.352237f,0.922053f,0.160457f, +-0.402553f,0.906198f,0.129446f, +-0.377478f,0.915341f,0.140219f, +-0.336315f,0.935519f,0.10815f, +-0.335675f,0.937548f,0.0912505f, +-0.330532f,0.939201f,0.0930086f, +-0.361761f,0.931606f,0.035208f, +-0.318172f,0.947538f,0.0306247f, +-0.418525f,0.907834f,-0.0259689f, +-0.56364f,0.818048f,-0.114485f, +-0.461029f,0.882661f,-0.0914388f, +-0.472492f,0.87835f,-0.0724725f, +-0.523319f,0.846244f,-0.100037f, +-0.381187f,0.924062f,-0.0283799f, +-0.407557f,0.911105f,-0.0615298f, +-0.340677f,0.939702f,0.0299913f, +-0.237849f,0.962659f,0.129291f, +-0.233755f,0.968303f,0.0880164f, +-0.248597f,0.967837f,0.0386268f, +-0.357032f,0.933656f,0.0285478f, +-0.359392f,0.919937f,0.156695f, +-0.375075f,0.918577f,0.12464f, +-0.326685f,0.944457f,-0.0357437f, +-0.172605f,0.980131f,-0.0977257f, +-0.156177f,0.9732f,-0.168789f, +-0.0732432f,0.97238f,-0.221612f, +0.0871915f,0.980367f,-0.176858f, +0.1118f,0.973873f,-0.197667f, +0.197176f,0.978426f,-0.0616824f, +0.202039f,0.979229f,-0.0170475f, +0.172249f,0.982761f,0.0671591f, +0.0103709f,0.995351f,0.095751f, +0.00657151f,0.996617f,0.0819183f, +0.0314022f,0.995508f,0.0893156f, +0.0387801f,0.982532f,0.182011f, +0.0412148f,0.983254f,0.177521f, +0.166642f,0.964252f,0.20603f, +0.177047f,0.971307f,0.1588f, +0.255603f,0.956785f,0.138671f, +0.338465f,0.927074f,0.161166f, +0.418264f,0.886168f,0.199401f, +0.454161f,0.868211f,0.199869f, +0.355471f,0.903694f,0.2387f, +0.136408f,0.975339f,0.173515f, +-0.0223692f,0.983821f,0.177753f, +-0.0947578f,0.983833f,0.151964f, +-0.0484831f,0.985895f,0.16019f, +-0.137652f,0.965784f,0.219802f, +-0.273035f,0.949633f,0.153782f, +-0.284296f,0.949219f,0.134753f, +-0.233616f,0.961781f,0.142834f, +-0.158293f,0.979011f,0.128376f, +-0.142079f,0.977628f,0.155106f, +-0.179667f,0.940095f,0.289726f, +-0.385363f,0.907468f,0.167324f, +-0.462662f,0.886082f,0.0283396f, +-0.500483f,0.865637f,-0.0137244f, +-0.459387f,0.885328f,-0.0718224f, +-0.318003f,0.947491f,-0.0336944f, +-0.336522f,0.937427f,-0.0893505f, +-0.421711f,0.882359f,-0.208814f, +-0.386976f,0.894588f,-0.223522f, +-0.348564f,0.925302f,-0.149395f, +-0.389936f,0.911457f,-0.131135f, +-0.262418f,0.94867f,-0.17653f, +-0.142966f,0.967048f,-0.210661f, +-0.341303f,0.927435f,0.152892f, +-0.342877f,0.929169f,0.138133f, +-0.327958f,0.941991f,0.0713955f, +-0.312837f,0.949244f,0.0326933f, +-0.32505f,0.944749f,0.0423311f, +-0.35038f,0.936272f,0.0250833f, +-0.334661f,0.939274f,0.0759313f, +-0.336592f,0.939816f,0.0587454f, +-0.383743f,0.919849f,0.0813597f, +-0.479391f,0.876726f,0.0391772f, +-0.521184f,0.850742f,-0.0678625f, +-0.496942f,0.867777f,0.00353465f, +-0.521763f,0.848113f,-0.0920201f, +-0.373289f,0.923494f,-0.0883984f, +-0.40896f,0.910065f,-0.067337f, +-0.458758f,0.888254f,0.0233657f, +-0.335137f,0.935384f,0.112868f, +-0.174079f,0.969266f,0.173839f, +-0.174994f,0.976179f,0.128265f, +-0.244694f,0.967717f,0.0603988f, +-0.409093f,0.90433f,-0.121779f, +-0.290803f,0.954139f,-0.0710763f, +-0.266076f,0.946406f,-0.183082f, +-0.19492f,0.966664f,-0.166031f, +-0.107014f,0.989078f,-0.101359f, +-0.0950037f,0.987234f,-0.127838f, +-0.0081899f,0.996807f,-0.0794301f, +0.0655685f,0.997841f,0.0038314f, +0.121704f,0.991617f,0.0433953f, +0.204125f,0.978885f,0.010797f, +0.169834f,0.985465f,0.00398161f, +0.0639966f,0.99795f,0.000581677f, +0.0389498f,0.997722f,-0.0550831f, +-0.00230315f,0.998522f,-0.0543072f, +-0.0428959f,0.99833f,-0.0386874f, +8.35518e-005f,0.999804f,-0.0198162f, +0.12638f,0.991004f,0.0440296f, +0.219728f,0.969155f,0.111616f, +0.270292f,0.956521f,0.109589f, +0.325159f,0.942616f,0.0758083f, +0.394886f,0.91647f,0.0644013f, +0.455483f,0.885289f,0.0937962f, +0.346134f,0.927862f,0.13879f, +0.142703f,0.967217f,0.210065f, +-0.0417806f,0.973195f,0.226154f, +-0.0873343f,0.983405f,0.159022f, +-0.027932f,0.984118f,0.175304f, +-0.101812f,0.985941f,0.132496f, +-0.174734f,0.983884f,0.037939f, +-0.279511f,0.957793f,-0.0671252f, +-0.277834f,0.959638f,-0.04362f, +-0.153076f,0.986374f,0.0602763f, +-0.221825f,0.968529f,0.112897f, +-0.256381f,0.940693f,0.222182f, +-0.236646f,0.958592f,0.158432f, +-0.345917f,0.937587f,-0.0356594f, +-0.417749f,0.894423f,-0.159665f, +-0.456832f,0.853011f,-0.252341f, +-0.379407f,0.905637f,-0.189399f, +-0.328991f,0.940983f,-0.0794707f, +-0.363362f,0.931271f,0.0264943f, +-0.48653f,0.873119f,0.0308429f, +-0.459174f,0.871133f,0.174033f, +-0.359639f,0.91236f,0.1956f, +-0.2127f,0.972657f,0.0932592f, +-0.0697188f,0.989689f,0.12512f, +-0.251887f,0.965064f,0.0721469f, +-0.317161f,0.947815f,-0.0324826f, +-0.311043f,0.947329f,-0.076288f, +-0.343705f,0.938452f,-0.0342691f, +-0.318958f,0.946045f,0.0571365f, +-0.341405f,0.939767f,0.0167816f, +-0.371963f,0.928183f,-0.0109617f, +-0.353511f,0.935132f,0.0236193f, +-0.398287f,0.910412f,0.111881f, +-0.43162f,0.897024f,0.0951448f, +-0.485116f,0.874338f,-0.0140269f, +-0.473699f,0.879939f,-0.03627f, +-0.417805f,0.900966f,-0.117046f, +-0.424936f,0.889519f,-0.167884f, +-0.467852f,0.878936f,-0.0926624f, +-0.493825f,0.865439f,-0.0845782f, +-0.351989f,0.932075f,-0.0856709f, +-0.214961f,0.974111f,-0.0700008f, +-0.163285f,0.986387f,-0.0194449f, +-0.162841f,0.986548f,-0.0143588f, +-0.285987f,0.956112f,-0.0637334f, +-0.292441f,0.94548f,-0.143341f, +-0.215932f,0.955314f,-0.201864f, +-0.253415f,0.950159f,-0.181603f, +-0.183417f,0.974504f,-0.129231f, +-0.101906f,0.993299f,-0.0545242f, +-0.042238f,0.99904f,-0.0116303f, +0.0329811f,0.99907f,-0.0277622f, +0.132201f,0.990073f,-0.0477429f, +0.267032f,0.963432f,-0.0221792f, +0.1278f,0.990718f,-0.0463084f, +0.0964891f,0.995299f,-0.00830296f, +0.0476853f,0.991211f,-0.123396f, +-0.00640997f,0.993203f,-0.116222f, +-0.0126443f,0.992773f,-0.119338f, +-0.00631822f,0.992917f,-0.118638f, +0.0563885f,0.995667f,-0.073943f, +0.12664f,0.991687f,-0.022778f, +0.273262f,0.961705f,0.021246f, +0.388375f,0.920615f,-0.0403992f, +0.37695f,0.920931f,-0.0989673f, +0.400211f,0.914808f,0.0543818f, +0.279689f,0.947142f,0.15715f, +0.0626591f,0.985325f,0.158772f, +0.0197159f,0.983213f,0.181391f, +0.0112307f,0.995546f,0.0936022f, +-0.0611233f,0.998037f,0.013638f, +-0.0515369f,0.996025f,0.0726543f, +-0.060221f,0.998076f,0.0147593f, +-0.21333f,0.972986f,-0.0882534f, +-0.330599f,0.94012f,-0.0829391f, +-0.311254f,0.950309f,-0.00575056f, +-0.324983f,0.931955f,0.160768f, +-0.245964f,0.942146f,0.227736f, +-0.125195f,0.981121f,0.147403f, +-0.193437f,0.975595f,0.103908f, +-0.319958f,0.946961f,0.029845f, +-0.440983f,0.895915f,-0.0535662f, +-0.477838f,0.878381f,-0.0108058f, +-0.480471f,0.872693f,0.0869201f, +-0.478968f,0.83494f,0.271043f, +-0.490257f,0.796981f,0.352803f, +-0.434277f,0.834185f,0.339909f, +-0.265882f,0.929328f,0.256236f, +-0.142385f,0.958793f,0.245852f, +-0.182126f,0.963412f,0.196642f, +-0.0681643f,0.992157f,0.104781f, +-0.176883f,0.983918f,0.024857f, +-0.305513f,0.952069f,-0.0150524f, +-0.401485f,0.91552f,0.0251517f, +-0.372509f,0.927256f,0.0378572f, +-0.265017f,0.964159f,0.0127972f, +-0.342134f,0.935688f,-0.0862078f, +-0.427338f,0.901948f,-0.062226f, +-0.447549f,0.894216f,0.00877894f, +-0.382185f,0.923573f,-0.0307708f, +-0.386509f,0.921774f,-0.0307138f, +-0.457766f,0.884255f,-0.0924303f, +-0.384262f,0.916404f,-0.11201f, +-0.431623f,0.886784f,-0.165273f, +-0.460575f,0.869789f,-0.177024f, +-0.471547f,0.850265f,-0.233865f, +-0.351048f,0.911491f,-0.214361f, +-0.263539f,0.9431f,-0.202755f, +-0.173283f,0.972074f,-0.158258f, +-0.19847f,0.960809f,-0.193536f, +-0.275034f,0.951707f,-0.136422f, +-0.217032f,0.958372f,-0.185526f, +-0.201987f,0.95666f,-0.209771f, +-0.299318f,0.94727f,-0.114406f, +-0.187056f,0.978613f,-0.0855959f, +-0.155621f,0.97153f,-0.178637f, +-0.0810385f,0.981009f,-0.176221f, +0.0905036f,0.986207f,-0.138581f, +0.115825f,0.982705f,-0.14448f, +0.19636f,0.97731f,-0.0794224f, +0.143519f,0.988245f,-0.0526749f, +0.109744f,0.989619f,-0.0927937f, +0.197571f,0.972036f,-0.12693f, +0.00332495f,0.962309f,-0.271939f, +-0.0356976f,0.959351f,-0.279948f, +-0.0721767f,0.96735f,-0.242948f, +-0.00843005f,0.989549f,-0.143952f, +0.152572f,0.983317f,-0.0990425f, +0.281378f,0.943362f,-0.175768f, +0.428891f,0.891683f,-0.144753f, +0.290445f,0.954517f,-0.0673633f, +0.176401f,0.973557f,0.145155f, +0.232983f,0.924473f,0.301776f, +0.181127f,0.950255f,0.253393f, +-0.00165339f,0.991402f,0.130837f, +0.0981935f,0.976268f,0.193027f, +0.000170743f,0.996657f,0.0816968f, +-0.0970384f,0.995225f,-0.0105345f, +-0.00895717f,0.999951f,-0.00426387f, +-0.170944f,0.985202f,-0.0124686f, +-0.362907f,0.93182f,-0.00317037f, +-0.388121f,0.921046f,0.0322033f, +-0.407598f,0.90852f,0.0919578f, +-0.247403f,0.962759f,0.109032f, +-0.0829823f,0.986114f,0.143848f, +-0.240859f,0.956011f,0.167424f, +-0.312142f,0.912012f,0.266086f, +-0.398269f,0.862926f,0.311032f, +-0.511957f,0.795091f,0.325161f, +-0.506846f,0.755093f,0.415864f, +-0.506747f,0.718735f,0.476054f, +-0.45002f,0.736589f,0.504895f, +-0.287855f,0.833759f,0.471153f, +-0.237765f,0.90713f,0.34725f, +-0.146865f,0.915961f,0.373425f, +-0.0859218f,0.935714f,0.342136f, +-0.054455f,0.996952f,-0.0558782f, +-0.211499f,0.976662f,-0.0374149f, +-0.331452f,0.940975f,0.0686022f, +-0.397421f,0.917381f,0.0216451f, +-0.316207f,0.946964f,-0.0572054f, +-0.202804f,0.975284f,-0.0877067f, +-0.28846f,0.951091f,-0.110532f, +-0.440756f,0.882415f,-0.164552f, +-0.391159f,0.897816f,-0.202288f, +-0.37945f,0.884355f,-0.27191f, +-0.436492f,0.880924f,-0.182888f, +-0.458204f,0.880643f,-0.12049f, +-0.365575f,0.927969f,-0.0723085f, +-0.344164f,0.93545f,-0.0805227f, +-0.392565f,0.898448f,-0.196683f, +-0.458844f,0.839155f,-0.292028f, +-0.406986f,0.873305f,-0.267769f, +-0.264536f,0.933458f,-0.242234f, +-0.197907f,0.946975f,-0.253123f, +-0.162416f,0.964761f,-0.207018f, +-0.261287f,0.932524f,-0.249254f, +-0.237723f,0.937266f,-0.25499f, +-0.255938f,0.959549f,-0.117312f, +-0.378394f,0.921703f,-0.0853291f, +-0.154569f,0.983106f,-0.098032f, +0.020864f,0.98441f,-0.174648f, +-0.0493076f,0.945704f,-0.321268f, +0.00354211f,0.950539f,-0.310586f, +0.0705741f,0.962405f,-0.262289f, +0.155003f,0.952815f,-0.260992f, +0.190084f,0.945182f,-0.265518f, +0.109466f,0.94166f,-0.318268f, +0.219465f,0.948713f,-0.227551f, +0.131592f,0.95776f,-0.255694f, +-0.023132f,0.936016f,-0.351196f, +-0.102398f,0.923738f,-0.369083f, +-0.11778f,0.928743f,-0.351518f, +0.14699f,0.959781f,-0.239196f, +0.329451f,0.917295f,-0.223678f, +0.290403f,0.942778f,-0.163815f, +0.10086f,0.993272f,0.056896f, +0.00690717f,0.980954f,0.194116f, +0.198478f,0.949829f,0.241726f, +0.257584f,0.935998f,0.239913f, +0.0870031f,0.976807f,0.195647f, +0.0578083f,0.994066f,0.0921449f, +0.121554f,0.989161f,0.0823711f, +0.0335983f,0.999242f,0.0196737f, +-0.0544848f,0.997579f,-0.0432265f, +-0.170331f,0.98419f,0.0485619f, +-0.366378f,0.930108f,-0.0258115f, +-0.430564f,0.901925f,-0.0338598f, +-0.412156f,0.909498f,0.0542308f, +-0.303685f,0.949097f,0.0836093f, +-0.198153f,0.949404f,0.243656f, +-0.267445f,0.871756f,0.410506f, +-0.393769f,0.805932f,0.442062f, +-0.427473f,0.750775f,0.50359f, +-0.522691f,0.707231f,0.476044f, +-0.550081f,0.670741f,0.497511f, +-0.518356f,0.695815f,0.49714f, +-0.372017f,0.764162f,0.526934f, +-0.210863f,0.841692f,0.497082f, +-0.116051f,0.87101f,0.477362f, +-0.106872f,0.906726f,0.407954f, +0.0295506f,0.897687f,0.439643f, +-0.11391f,0.993475f,0.00559176f, +-0.238885f,0.970513f,0.0322297f, +-0.352278f,0.935893f,0.00201985f, +-0.29155f,0.955165f,-0.0515582f, +-0.283012f,0.950207f,-0.130422f, +-0.233718f,0.966509f,-0.105997f, +-0.293314f,0.953293f,-0.0721f, +-0.344057f,0.937935f,-0.0436188f, +-0.359338f,0.921856f,-0.145114f, +-0.361988f,0.90939f,-0.204876f, +-0.478777f,0.840974f,-0.252063f, +-0.501126f,0.832032f,-0.237897f, +-0.42396f,0.887247f,-0.1818f, +-0.340692f,0.929815f,-0.13919f, +-0.261328f,0.946412f,-0.189766f, +-0.383135f,0.863856f,-0.327048f, +-0.4248f,0.838392f,-0.341533f, +-0.258907f,0.912327f,-0.317216f, +-0.273875f,0.922352f,-0.272505f, +-0.216284f,0.973372f,-0.0759435f, +-0.186061f,0.980681f,-0.0603919f, +-0.327344f,0.93227f,-0.15401f, +-0.354135f,0.933013f,-0.0638423f, +-0.30838f,0.94174f,-0.13427f, +-0.0952482f,0.963393f,-0.250602f, +0.0864929f,0.957116f,-0.276491f, +0.0265645f,0.947809f,-0.31773f, +-0.00743162f,0.929747f,-0.368124f, +0.0794584f,0.926075f,-0.368877f, +0.177698f,0.921503f,-0.345334f, +0.210118f,0.923104f,-0.322071f, +0.0972314f,0.929984f,-0.354507f, +0.0931107f,0.932401f,-0.349226f, +0.163846f,0.947557f,-0.274392f, +0.04099f,0.947023f,-0.318539f, +-0.0637185f,0.942657f,-0.327625f, +-0.131539f,0.923216f,-0.361068f, +0.0323928f,0.932437f,-0.359877f, +0.242794f,0.937436f,-0.249528f, +0.154647f,0.984538f,-0.0822692f, +-0.0290139f,0.999421f,0.0177744f, +-0.0330797f,0.998482f,0.0440283f, +0.157195f,0.980432f,0.118503f, +0.251646f,0.94505f,0.208697f, +0.178529f,0.966849f,0.182568f, +0.171641f,0.982807f,0.0680498f, +0.107902f,0.993714f,0.0298233f, +0.00302695f,0.994036f,0.109006f, +-0.0844358f,0.977656f,0.19251f, +-0.18119f,0.958323f,0.220878f, +-0.285317f,0.945377f,0.157659f, +-0.419121f,0.895183f,0.151606f, +-0.490039f,0.857134f,0.158693f, +-0.402244f,0.878123f,0.259038f, +-0.398659f,0.825161f,0.400226f, +-0.427626f,0.728675f,0.534948f, +-0.378859f,0.704334f,0.600316f, +-0.386613f,0.684959f,0.617545f, +-0.440363f,0.648556f,0.62085f, +-0.484249f,0.659981f,0.574394f, +-0.462576f,0.728741f,0.504936f, +-0.380875f,0.811463f,0.443241f, +-0.190303f,0.865049f,0.464193f, +-0.0749094f,0.86956f,0.488113f, +-0.11614f,0.868815f,0.481323f, +-0.102623f,0.843113f,0.527854f, +-0.198362f,0.979655f,0.0304707f, +-0.238942f,0.970277f,0.0383318f, +-0.308109f,0.951351f,-0.000213496f, +-0.245044f,0.968893f,0.0346459f, +-0.275786f,0.960816f,-0.0278198f, +-0.256726f,0.965729f,-0.0381932f, +-0.318964f,0.947473f,-0.0236049f, +-0.388409f,0.921405f,0.0123096f, +-0.298771f,0.953298f,0.0442638f, +-0.291187f,0.956662f,0.00282226f, +-0.39367f,0.915026f,-0.0880448f, +-0.501897f,0.840236f,-0.20519f, +-0.460271f,0.863055f,-0.208055f, +-0.311786f,0.925724f,-0.214066f, +-0.177876f,0.937081f,-0.300397f, +-0.256831f,0.902901f,-0.344683f, +-0.413909f,0.808626f,-0.418096f, +-0.347694f,0.845102f,-0.406092f, +-0.390269f,0.881564f,-0.265585f, +-0.38258f,0.915768f,-0.122479f, +-0.172737f,0.984864f,-0.0142896f, +-0.221138f,0.97315f,-0.0638528f, +-0.32806f,0.922266f,-0.204454f, +-0.20334f,0.945769f,-0.253326f, +-0.0362109f,0.959773f,-0.278433f, +0.0451082f,0.968522f,-0.244806f, +0.103574f,0.977375f,-0.184421f, +0.095607f,0.942862f,-0.319172f, +0.028855f,0.903939f,-0.426688f, +0.0781753f,0.937277f,-0.339707f, +0.163597f,0.966118f,-0.199631f, +0.165445f,0.973063f,-0.160553f, +0.145787f,0.95097f,-0.272767f, +0.130591f,0.92029f,-0.368799f, +0.0531207f,0.931628f,-0.35951f, +-0.0802666f,0.935074f,-0.345244f, +-0.124987f,0.942063f,-0.311281f, +0.0397165f,0.963525f,-0.264653f, +0.0790619f,0.96623f,-0.245254f, +0.0277086f,0.995754f,-0.0877838f, +-0.0718135f,0.997414f,0.00271225f, +-0.0601764f,0.993596f,0.0956336f, +0.0305316f,0.992338f,0.119724f, +0.184993f,0.96549f,0.183324f, +0.240982f,0.949316f,0.20181f, +0.205406f,0.960305f,0.188739f, +0.0685231f,0.967991f,0.241448f, +-0.121139f,0.95072f,0.285408f, +-0.150135f,0.918283f,0.366355f, +-0.132611f,0.919499f,0.370048f, +-0.285199f,0.893271f,0.34746f, +-0.428415f,0.803512f,0.413316f, +-0.445474f,0.783214f,0.433738f, +-0.459983f,0.771026f,0.44038f, +-0.467611f,0.730475f,0.497741f, +-0.48066f,0.718458f,0.502777f, +-0.417628f,0.706128f,0.571814f, +-0.464585f,0.665035f,0.584713f, +-0.472738f,0.646587f,0.598702f, +-0.412146f,0.689264f,0.595861f, +-0.326825f,0.752406f,0.5719f, +-0.254151f,0.834713f,0.48853f, +-0.235109f,0.888903f,0.39316f, +-0.153581f,0.849492f,0.504753f, +-0.150095f,0.815518f,0.558929f, +-0.18873f,0.837012f,0.513607f, +0.0689174f,0.995773f,0.0607139f, +-0.155258f,0.983404f,-0.0938683f, +-0.345692f,0.927547f,-0.141961f, +-0.289881f,0.953783f,-0.079168f, +-0.192407f,0.979661f,-0.0569578f, +-0.267677f,0.960104f,-0.0809323f, +-0.338627f,0.940905f,-0.0054102f, +-0.378143f,0.925406f,-0.0251327f, +-0.331689f,0.941021f,-0.0667991f, +-0.266964f,0.963694f,-0.00485284f, +-0.326986f,0.944023f,-0.0435962f, +-0.406544f,0.902607f,-0.141498f, +-0.445264f,0.84532f,-0.295253f, +-0.261882f,0.90946f,-0.322956f, +-0.131634f,0.928868f,-0.346231f, +-0.231876f,0.922232f,-0.30939f, +-0.381112f,0.87967f,-0.284489f, +-0.459513f,0.85999f,-0.22196f, +-0.498013f,0.864257f,-0.0710131f, +-0.440544f,0.89211f,-0.100303f, +-0.247938f,0.96287f,-0.106806f, +-0.10732f,0.992504f,-0.0584663f, +-0.221465f,0.956592f,-0.189431f, +-0.229248f,0.946541f,-0.22695f, +-0.0978243f,0.972744f,-0.210239f, +-0.0379465f,0.985853f,-0.163259f, +0.0806013f,0.992194f,-0.0951546f, +0.280296f,0.95443f,-0.102456f, +0.155799f,0.941292f,-0.299494f, +-0.0466248f,0.90184f,-0.429548f, +0.0333539f,0.93989f,-0.339845f, +0.15766f,0.95203f,-0.262264f, +0.275219f,0.92494f,-0.262186f, +0.226492f,0.914035f,-0.336513f, +0.0375497f,0.921004f,-0.387739f, +-0.0841489f,0.913809f,-0.39733f, +-0.216548f,0.901013f,-0.375874f, +-0.0617755f,0.971104f,-0.230524f, +0.0635289f,0.988552f,-0.136856f, +-0.0898172f,0.987883f,-0.126568f, +-0.195744f,0.9803f,-0.0263689f, +-0.163398f,0.98375f,0.0744142f, +0.0549941f,0.99236f,0.110438f, +0.19398f,0.975972f,0.0992507f, +0.191759f,0.972804f,0.129928f, +0.149866f,0.963222f,0.223034f, +-0.00306242f,0.957956f,0.286898f, +-0.13576f,0.938575f,0.317249f, +-0.176601f,0.936485f,0.303f, +-0.158083f,0.914215f,0.373122f, +-0.316693f,0.854194f,0.412381f, +-0.498069f,0.774619f,0.389733f, +-0.492142f,0.755365f,0.432688f, +-0.453311f,0.739293f,0.49795f, +-0.471661f,0.730931f,0.49323f, +-0.504596f,0.695479f,0.511558f, +-0.486075f,0.660592f,0.572145f, +-0.455536f,0.681017f,0.573326f, +-0.475459f,0.732851f,0.486691f, +-0.40679f,0.784517f,0.468032f, +-0.294511f,0.862991f,0.410499f, +-0.137096f,0.926626f,0.350098f, +-0.212171f,0.92693f,0.30949f, +-0.320702f,0.890591f,0.322488f, +-0.144781f,0.913051f,0.381284f, +-0.0467088f,0.929255f,0.366475f, +0.190524f,0.979715f,0.0621193f, +-0.0159571f,0.99888f,-0.0445494f, +-0.299493f,0.937414f,-0.177647f, +-0.30245f,0.926474f,-0.223986f, +-0.236991f,0.948637f,-0.209579f, +-0.316653f,0.935173f,-0.15869f, +-0.385652f,0.9143f,-0.123807f, +-0.33937f,0.934637f,-0.106213f, +-0.347064f,0.934195f,-0.0826249f, +-0.295744f,0.955249f,0.00583919f, +-0.275005f,0.961059f,-0.0271544f, +-0.269439f,0.957464f,-0.103275f, +-0.282112f,0.919833f,-0.272616f, +-0.294141f,0.877255f,-0.379347f, +-0.188084f,0.929949f,-0.315942f, +-0.305781f,0.908958f,-0.283361f, +-0.494244f,0.854771f,-0.158396f, +-0.556326f,0.828917f,0.0582992f, +-0.534005f,0.83843f,0.108964f, +-0.372194f,0.92607f,0.0621723f, +-0.216902f,0.97615f,-0.00922891f, +-0.129625f,0.988755f,-0.0745716f, +-0.137022f,0.98954f,-0.0451077f, +-0.210914f,0.969697f,-0.123297f, +-0.0927848f,0.980946f,-0.170691f, +-0.0487293f,0.98279f,-0.178186f, +0.0377154f,0.983594f,-0.176409f, +0.270827f,0.95519f,-0.119436f, +0.365037f,0.928517f,-0.0678507f, +0.131842f,0.951604f,-0.277612f, +-0.0185121f,0.905238f,-0.424502f, +0.118166f,0.903064f,-0.412931f, +0.230045f,0.8849f,-0.405008f, +0.2101f,0.906634f,-0.365886f, +0.0544702f,0.94453f,-0.323878f, +-0.0630069f,0.9598f,-0.273522f, +-0.203027f,0.928033f,-0.312304f, +-0.22235f,0.90002f,-0.374866f, +0.0164141f,0.973192f,-0.229407f, +-0.131299f,0.967472f,-0.216237f, +-0.248586f,0.95668f,-0.151553f, +-0.180678f,0.971697f,-0.152182f, +0.021506f,0.991774f,-0.126182f, +0.129882f,0.991187f,-0.0260519f, +0.125479f,0.988703f,0.0819803f, +0.0585413f,0.987325f,0.14752f, +-0.0186301f,0.977162f,0.211676f, +-0.162972f,0.968132f,0.19016f, +-0.218545f,0.935778f,0.276691f, +-0.284144f,0.890895f,0.354356f, +-0.345593f,0.839997f,0.418295f, +-0.488331f,0.792258f,0.36587f, +-0.545891f,0.770241f,0.329746f, +-0.533891f,0.766492f,0.357002f, +-0.51665f,0.749346f,0.414189f, +-0.616561f,0.690345f,0.37852f, +-0.519109f,0.719346f,0.461593f, +-0.392236f,0.782177f,0.484097f, +-0.398436f,0.817816f,0.415241f, +-0.392025f,0.864189f,0.315428f, +-0.176475f,0.937288f,0.300577f, +-0.137444f,0.969881f,0.201097f, +-0.206545f,0.942409f,0.263066f, +-0.293185f,0.938992f,0.179823f, +-0.159029f,0.985376f,0.0611911f, +0.00174953f,0.998094f,0.0616789f, +0.241821f,0.962041f,0.126492f, +0.127737f,0.984773f,0.117921f, +-0.17559f,0.984255f,0.0202494f, +-0.277772f,0.957333f,-0.0797282f, +-0.264237f,0.953214f,-0.146839f, +-0.330132f,0.935063f,-0.129113f, +-0.363469f,0.924563f,-0.114338f, +-0.371034f,0.917638f,-0.142388f, +-0.425424f,0.897691f,-0.114736f, +-0.353654f,0.934652f,-0.0368062f, +-0.218582f,0.975792f,0.007136f, +-0.203676f,0.978799f,-0.0216238f, +-0.149661f,0.987587f,-0.0476727f, +-0.278943f,0.945373f,-0.1687f, +-0.239375f,0.951961f,-0.190969f, +-0.360119f,0.921099f,-0.147955f, +-0.584157f,0.811569f,0.0107674f, +-0.61484f,0.786528f,0.0578414f, +-0.504089f,0.86363f,-0.00605437f, +-0.333455f,0.94143f,-0.0501755f, +-0.123418f,0.989972f,-0.0687344f, +-0.105519f,0.985418f,-0.133478f, +-0.134701f,0.9843f,-0.114061f, +-0.137014f,0.977235f,-0.161985f, +-0.0439551f,0.980481f,-0.191638f, +-0.0327274f,0.96544f,-0.258561f, +0.0268923f,0.955378f,-0.294159f, +0.189265f,0.941783f,-0.277892f, +0.306008f,0.930356f,-0.201982f, +0.2909f,0.948465f,-0.12566f, +0.135694f,0.963424f,-0.231086f, +0.114996f,0.92781f,-0.354886f, +0.243157f,0.920361f,-0.306286f, +0.181493f,0.943785f,-0.27628f, +-0.0348676f,0.964621f,-0.261325f, +-0.138397f,0.964431f,-0.225208f, +-0.0584572f,0.973863f,-0.219483f, +-0.160488f,0.904663f,-0.394751f, +-0.113572f,0.901558f,-0.417487f, +-0.155065f,0.923521f,-0.350803f, +-0.242307f,0.919914f,-0.308295f, +-0.206106f,0.923371f,-0.323891f, +-0.0753677f,0.972428f,-0.220691f, +0.00286078f,0.993423f,-0.114469f, +0.0506503f,0.998257f,-0.0302924f, +-0.0328546f,0.999299f,0.017926f, +-0.060813f,0.979003f,0.194565f, +-0.19049f,0.94338f,0.271567f, +-0.332962f,0.885593f,0.323821f, +-0.330466f,0.869145f,0.367938f, +-0.383415f,0.840587f,0.382632f, +-0.450848f,0.795155f,0.405542f, +-0.50223f,0.7918f,0.347589f, +-0.586371f,0.768822f,0.255112f, +-0.550176f,0.765625f,0.333355f, +-0.594581f,0.747662f,0.295761f, +-0.604774f,0.771025f,0.199423f, +-0.461798f,0.840354f,0.283809f, +-0.323989f,0.875237f,0.359155f, +-0.321766f,0.916629f,0.23719f, +-0.168943f,0.967667f,0.187293f, +-0.107108f,0.976625f,0.186366f, +-0.222921f,0.963011f,0.151379f, +-0.142187f,0.985732f,0.0900906f, +-0.0555822f,0.997373f,-0.0464466f, +-0.00128055f,0.995901f,-0.0904418f, +0.189226f,0.980362f,-0.0555288f, +0.085267f,0.996327f,-0.00782177f, +-0.128918f,0.990746f,0.042464f, +-0.188312f,0.982054f,-0.0104463f, +-0.196136f,0.979449f,-0.0470074f, +-0.346836f,0.935484f,-0.0676365f, +-0.385817f,0.920741f,-0.0581445f, +-0.364523f,0.930255f,-0.0418259f, +-0.413227f,0.910109f,-0.0307546f, +-0.395357f,0.915702f,-0.071985f, +-0.249105f,0.966325f,-0.0645241f, +-0.224404f,0.97132f,-0.0786097f, +-0.136636f,0.989057f,-0.0556425f, +-0.161967f,0.98357f,-0.0797312f, +-0.264069f,0.956689f,-0.122532f, +-0.415862f,0.909427f,-0.00117779f, +-0.618635f,0.784039f,0.0507281f, +-0.569525f,0.818988f,-0.0700017f, +-0.458442f,0.876243f,-0.148424f, +-0.301532f,0.936403f,-0.179521f, +-0.125352f,0.969963f,-0.208469f, +-0.0885456f,0.971015f,-0.222014f, +-0.127345f,0.96169f,-0.242765f, +-0.111865f,0.95953f,-0.258434f, +-0.00408963f,0.957803f,-0.287396f, +0.0423217f,0.932535f,-0.358592f, +0.0695614f,0.921939f,-0.381037f, +0.190852f,0.890613f,-0.412775f, +0.209386f,0.879353f,-0.427663f, +0.178912f,0.925963f,-0.332541f, +0.21012f,0.943847f,-0.254954f, +0.194248f,0.92787f,-0.318316f, +0.12116f,0.941808f,-0.313556f, +0.143074f,0.982238f,-0.121399f, +0.00445755f,0.990826f,-0.135068f, +-0.0763662f,0.964673f,-0.252139f, +-0.00960064f,0.938734f,-0.34451f, +-0.0448775f,0.923487f,-0.380997f, +-0.121038f,0.899958f,-0.418839f, +-0.214432f,0.896136f,-0.388536f, +-0.236628f,0.909444f,-0.341933f, +-0.245801f,0.902665f,-0.353239f, +-0.210816f,0.938091f,-0.274848f, +-0.0790665f,0.981118f,-0.17651f, +-0.0418777f,0.998086f,-0.0455073f, +-0.112513f,0.981903f,0.152339f, +-0.289647f,0.921573f,0.258473f, +-0.276284f,0.866929f,0.414851f, +-0.316808f,0.857367f,0.405653f, +-0.333206f,0.853137f,0.401412f, +-0.396081f,0.828088f,0.396725f, +-0.485909f,0.809843f,0.328705f, +-0.463328f,0.813789f,0.350819f, +-0.520203f,0.774122f,0.360725f, +-0.581754f,0.763678f,0.279925f, +-0.55781f,0.791203f,0.250691f, +-0.576356f,0.800103f,0.166282f, +-0.522214f,0.839566f,0.149738f, +-0.327667f,0.934488f,0.139166f, +-0.239893f,0.965369f,0.102537f, +-0.178401f,0.973537f,0.142826f, +-0.0446164f,0.980327f,0.192274f, +-0.152707f,0.98769f,0.0338934f, +-0.061376f,0.996098f,-0.0634113f, +-0.00816896f,0.988579f,-0.150483f, +0.0167009f,0.992551f,-0.120678f, +0.148875f,0.988771f,-0.0129578f, +0.0273451f,0.999626f,0.000950796f, +-0.109359f,0.99398f,0.00672756f, +-0.162948f,0.982686f,-0.0881845f, +-0.242271f,0.966262f,-0.0874275f, +-0.357996f,0.933723f,0.000140943f, +-0.377863f,0.925289f,0.0325572f, +-0.389424f,0.920391f,0.0350616f, +-0.408888f,0.910343f,0.0639282f, +-0.371945f,0.928232f,0.00649489f, +-0.230632f,0.97289f,0.0171594f, +-0.159091f,0.987197f,-0.0114848f, +-0.122759f,0.984183f,-0.127724f, +-0.175251f,0.974473f,-0.14032f, +-0.35571f,0.933079f,-0.0532364f, +-0.501387f,0.863164f,0.0596562f, +-0.575441f,0.816492f,-0.0470046f, +-0.501056f,0.856673f,-0.122698f, +-0.414992f,0.888139f,-0.19746f, +-0.309585f,0.914677f,-0.259854f, +-0.0986663f,0.965073f,-0.242693f, +-0.0576728f,0.965088f,-0.255499f, +-0.0928316f,0.963296f,-0.251879f, +-0.0710107f,0.944633f,-0.320352f, +0.0799711f,0.918771f,-0.386606f, +0.0834923f,0.89273f,-0.442789f, +0.0521243f,0.897343f,-0.438246f, +0.251171f,0.890827f,-0.378604f, +0.176541f,0.892631f,-0.414781f, +0.102505f,0.91423f,-0.392015f, +0.148543f,0.910792f,-0.385219f, +0.204336f,0.92739f,-0.313361f, +0.00672261f,0.969577f,-0.244696f, +-0.0203828f,0.994006f,-0.10741f, +0.0984818f,0.994155f,-0.0442492f, +0.0884297f,0.979853f,-0.179077f, +0.079756f,0.934869f,-0.345919f, +-0.0373135f,0.916973f,-0.3972f, +-0.13475f,0.922044f,-0.362873f, +-0.248554f,0.90561f,-0.343645f, +-0.298871f,0.900649f,-0.315447f, +-0.245556f,0.942684f,-0.225941f, +-0.29156f,0.92569f,-0.241018f, +-0.210251f,0.966564f,-0.146796f, +-0.258034f,0.965595f,0.0323199f, +-0.368176f,0.902709f,0.22263f, +-0.350064f,0.851117f,0.391223f, +-0.273287f,0.858969f,0.432996f, +-0.285306f,0.881397f,0.376483f, +-0.391023f,0.856564f,0.336748f, +-0.346592f,0.838969f,0.419529f, +-0.422742f,0.829366f,0.365295f, +-0.513303f,0.775065f,0.368504f, +-0.526999f,0.742246f,0.413935f, +-0.485934f,0.782442f,0.389426f, +-0.494091f,0.808005f,0.32094f, +-0.527377f,0.820007f,0.222402f, +-0.463863f,0.878834f,0.111725f, +-0.310302f,0.94881f,0.0589178f, +-0.228025f,0.964645f,0.132153f, +-0.25901f,0.96255f,0.080067f, +-0.0424596f,0.997867f,0.0495831f, +-0.00646979f,0.998786f,0.048831f, +0.0235108f,0.999153f,0.033786f, +0.0350773f,0.999112f,0.0233587f, +-0.06489f,0.99782f,0.0120079f, +0.0653571f,0.99589f,0.0626978f, +0.0437681f,0.989758f,0.13588f, +-0.0612591f,0.992124f,0.109253f, +-0.0700659f,0.993846f,0.085792f, +-0.245254f,0.968292f,0.0475526f, +-0.425333f,0.903383f,0.0546907f, +-0.406557f,0.90921f,0.0897132f, +-0.40303f,0.911526f,0.0817765f, +-0.380881f,0.92142f,0.0769048f, +-0.320213f,0.947262f,0.0126033f, +-0.2583f,0.964583f,-0.0534921f, +-0.102892f,0.993091f,-0.0564197f, +-0.0482689f,0.996133f,-0.0734163f, +-0.214829f,0.976629f,0.00662477f, +-0.431775f,0.896672f,0.0977224f, +-0.451215f,0.886255f,0.104672f, +-0.522087f,0.848838f,-0.0830587f, +-0.458286f,0.880944f,-0.117949f, +-0.338524f,0.917937f,-0.206865f, +-0.285281f,0.916752f,-0.279607f, +-0.142352f,0.962006f,-0.232982f, +-0.0943041f,0.983891f,-0.151875f, +-0.0753867f,0.988192f,-0.133394f, +0.0592214f,0.975378f,-0.212437f, +0.135178f,0.93923f,-0.315553f, +0.146098f,0.928461f,-0.34149f, +0.0154593f,0.901088f,-0.433361f, +0.163565f,0.906515f,-0.389201f, +0.204593f,0.933049f,-0.295907f, +0.124274f,0.938076f,-0.323371f, +0.137407f,0.92485f,-0.354642f, +0.063168f,0.960879f,-0.269671f, +-0.0720239f,0.98835f,-0.134077f, +-0.0757271f,0.981006f,-0.178587f, +0.0897227f,0.968994f,-0.23022f, +0.219073f,0.948381f,-0.229303f, +0.192275f,0.938149f,-0.287936f, +-0.0492263f,0.973953f,-0.221343f, +-0.181885f,0.971294f,-0.153316f, +-0.242476f,0.960686f,-0.135229f, +-0.363624f,0.917475f,-0.161301f, +-0.330978f,0.935565f,-0.12317f, +-0.30439f,0.949195f,-0.0798413f, +-0.362853f,0.931339f,-0.0307322f, +-0.401675f,0.903644f,0.148607f, +-0.425736f,0.872787f,0.238731f, +-0.458216f,0.866256f,0.199096f, +-0.325646f,0.913769f,0.242862f, +-0.214745f,0.922085f,0.321938f, +-0.398463f,0.884492f,0.242694f, +-0.475038f,0.830832f,0.289927f, +-0.448294f,0.764081f,0.463909f, +-0.497042f,0.7065f,0.503792f, +-0.489906f,0.735868f,0.467431f, +-0.460921f,0.76339f,0.452535f, +-0.40897f,0.781052f,0.471913f, +-0.371818f,0.839399f,0.396435f, +-0.326758f,0.904742f,0.27326f, +-0.383198f,0.91056f,0.155045f, +-0.284609f,0.924825f,0.252383f, +-0.0749114f,0.976737f,0.200932f, +0.00799324f,0.997093f,0.0757729f, +-0.0700844f,0.990942f,0.114551f, +-0.0596966f,0.983848f,0.168758f, +0.00586433f,0.977052f,0.212922f, +-0.0605914f,0.978841f,0.195443f, +-0.0438257f,0.995801f,0.0803703f, +-0.0570689f,0.993344f,0.100052f, +-0.0606116f,0.987839f,0.143177f, +-0.0960986f,0.983658f,0.152253f, +-0.240218f,0.956553f,0.16523f, +-0.410215f,0.902731f,0.129617f, +-0.38596f,0.917352f,0.0974681f, +-0.348531f,0.935694f,0.0547901f, +-0.396424f,0.918039f,-0.00721866f, +-0.26358f,0.961512f,0.0775866f, +-0.177577f,0.982975f,0.0471779f, +-0.0921077f,0.995708f,0.00907831f, +-0.131805f,0.991186f,0.0133294f, +-0.348565f,0.935587f,0.0563885f, +-0.467549f,0.880933f,0.0731775f, +-0.372581f,0.926945f,0.0442312f, +-0.408929f,0.911847f,-0.0362219f, +-0.445009f,0.893478f,-0.0605312f, +-0.306432f,0.951885f,-0.00384437f, +-0.259351f,0.965029f,0.0381644f, +-0.265204f,0.963994f,-0.0195798f, +-0.114808f,0.993343f,0.00942441f, +-0.0279481f,0.990324f,-0.135929f, +0.103339f,0.977655f,-0.18306f, +0.218767f,0.966894f,-0.131368f, +0.207579f,0.958824f,-0.193824f, +0.136905f,0.960239f,-0.243308f, +0.117272f,0.934734f,-0.335438f, +0.133403f,0.937193f,-0.322294f, +0.140113f,0.948531f,-0.284001f, +0.0924439f,0.975124f,-0.201463f, +-0.0405443f,0.993271f,-0.108481f, +-0.0729426f,0.987394f,-0.140474f, +0.0307633f,0.972795f,-0.229615f, +0.200951f,0.951021f,-0.2349f, +0.206873f,0.91785f,-0.338755f, +0.0409109f,0.957201f,-0.286518f, +-0.211311f,0.976629f,-0.0392802f, +-0.256735f,0.961768f,0.0953371f, +-0.237528f,0.960421f,0.145504f, +-0.329105f,0.937835f,0.110248f, +-0.355083f,0.930437f,0.0905737f, +-0.33751f,0.931415f,0.13621f, +-0.400013f,0.905919f,0.138928f, +-0.505595f,0.854442f,0.119596f, +-0.452675f,0.873473f,0.179247f, +-0.360085f,0.917004f,0.17159f, +-0.404496f,0.910531f,0.0855373f, +-0.324231f,0.903855f,0.279141f, +-0.336075f,0.852068f,0.40129f, +-0.562491f,0.75864f,0.328737f, +-0.580482f,0.703244f,0.410473f, +-0.499356f,0.747889f,0.437385f, +-0.47057f,0.77436f,0.423001f, +-0.457721f,0.780273f,0.426221f, +-0.387043f,0.830428f,0.400733f, +-0.304454f,0.882516f,0.358431f, +-0.240482f,0.915056f,0.323791f, +-0.289179f,0.919765f,0.265345f, +-0.239541f,0.954664f,0.176742f, +-0.0468358f,0.993768f,0.10115f, +-0.0227943f,0.987776f,0.154204f, +-0.112093f,0.964309f,0.239881f, +-0.0599845f,0.969963f,0.235741f, +0.0387578f,0.968143f,0.24738f, +0.0187191f,0.971458f,0.236471f, +0.242021f,0.896343f,0.371478f, +0.0480335f,0.972296f,0.228765f, +-0.0779729f,0.986176f,0.146206f, +-0.0941394f,0.982277f,0.16208f, +-0.22083f,0.962927f,0.154936f, +-0.380194f,0.918443f,0.109152f, +-0.362825f,0.928988f,0.0730715f, +-0.322334f,0.943799f,0.0731113f, +-0.408658f,0.905696f,0.112752f, +-0.342623f,0.91378f,0.218209f, +-0.178962f,0.947287f,0.265744f, +-0.0963031f,0.962264f,0.254507f, +-0.129686f,0.959928f,0.248434f, +-0.25861f,0.932715f,0.251325f, +-0.400538f,0.911394f,0.0944958f, +-0.371118f,0.928542f,0.00899351f, +-0.395096f,0.916517f,0.0624194f, +-0.492959f,0.864551f,0.097688f, +-0.425957f,0.892844f,0.146255f, +-0.256791f,0.9425f,0.213898f, +-0.177422f,0.976398f,0.123157f, +0.0269208f,0.996881f,0.0741829f, +0.164645f,0.980831f,-0.104223f, +0.0973784f,0.963273f,-0.250244f, +0.114359f,0.965463f,-0.234102f, +0.250084f,0.96398f,-0.0905583f, +0.183861f,0.973241f,-0.137829f, +0.203921f,0.957737f,-0.202868f, +0.170155f,0.95208f,-0.254149f, +0.0373443f,0.963666f,-0.264487f, +-0.0311132f,0.98854f,-0.147717f, +-0.0500681f,0.990616f,-0.127173f, +0.0774781f,0.980584f,-0.180143f, +0.0416659f,0.952342f,-0.302174f, +0.183971f,0.945491f,-0.268702f, +0.234504f,0.932825f,-0.27358f, +-0.0611848f,0.988685f,-0.13696f, +-0.37387f,0.925543f,-0.059925f, +-0.361069f,0.932447f,-0.0130774f, +-0.247932f,0.961796f,0.1161f, +-0.321909f,0.940217f,0.111206f, +-0.373794f,0.915694f,0.147587f, +-0.370927f,0.915202f,0.157537f, +-0.367344f,0.908177f,0.20068f, +-0.445687f,0.879826f,0.165134f, +-0.480845f,0.872838f,0.0833169f, +-0.396228f,0.900984f,0.176722f, +-0.39533f,0.870559f,0.292987f, +-0.514705f,0.791717f,0.329034f, +-0.426478f,0.754312f,0.49913f, +-0.476928f,0.731476f,0.487321f, +-0.555203f,0.748777f,0.362053f, +-0.513793f,0.811828f,0.277402f, +-0.498737f,0.823176f,0.271372f, +-0.459197f,0.851815f,0.252089f, +-0.364638f,0.907849f,0.207f, +-0.280535f,0.937686f,0.205051f, +-0.204645f,0.959273f,0.194721f, +-0.188424f,0.978285f,0.0863425f, +-0.16576f,0.97773f,-0.128717f, +-0.0413953f,0.984504f,-0.170405f, +-0.119175f,0.989154f,-0.0858603f, +-0.164393f,0.986215f,0.018821f, +-0.0876541f,0.994439f,0.0583851f, +-0.00781607f,0.987179f,0.159428f, +-0.00608226f,0.980142f,0.198203f, +0.294056f,0.919888f,0.259494f, +0.176099f,0.946212f,0.271426f, +-0.0256669f,0.973237f,0.228366f, +-0.0934761f,0.978631f,0.183149f, +-0.211202f,0.968374f,0.132837f, +-0.345036f,0.933287f,0.0996237f, +-0.346043f,0.935088f,0.0765773f, +-0.381385f,0.918419f,0.105127f, +-0.476923f,0.857096f,0.19476f, +-0.397907f,0.88874f,0.227622f, +-0.175271f,0.936954f,0.30232f, +-0.040477f,0.944541f,0.325889f, +-0.142418f,0.942444f,0.302518f, +-0.246569f,0.91514f,0.318938f, +-0.255277f,0.933873f,0.25043f, +-0.348488f,0.92941f,0.121466f, +-0.472178f,0.874219f,0.113089f, +-0.490306f,0.858256f,0.151645f, +-0.38804f,0.914553f,0.114097f, +-0.196584f,0.979051f,0.0530513f, +-0.0793551f,0.996572f,-0.0234008f, +0.0406197f,0.994776f,-0.0936505f, +0.24653f,0.966821f,-0.0669378f, +0.269235f,0.959692f,-0.0806517f, +0.0569112f,0.963296f,-0.26234f, +0.131503f,0.973945f,-0.184764f, +0.24729f,0.957434f,-0.148892f, +0.248779f,0.951221f,-0.18245f, +0.18718f,0.966303f,-0.176696f, +0.00607471f,0.977895f,-0.20901f, +-0.0210706f,0.975074f,-0.220878f, +0.00501251f,0.949574f,-0.313502f, +0.0771251f,0.945518f,-0.316304f, +0.130553f,0.948445f,-0.288805f, +0.175519f,0.929764f,-0.323623f, +0.111769f,0.971665f,-0.208266f, +-0.210844f,0.971563f,-0.107753f, +-0.345299f,0.9344f,-0.087551f, +-0.367127f,0.918607f,-0.146212f, +-0.340753f,0.929779f,-0.139279f, +-0.358585f,0.929839f,-0.0825605f, +-0.393886f,0.919008f,-0.0166963f, +-0.401193f,0.915983f,0.00451588f, +-0.406108f,0.91192f,0.0589777f, +-0.45609f,0.887954f,0.0593294f, +-0.481921f,0.86351f,0.148669f, +-0.533578f,0.80576f,0.256994f, +-0.480795f,0.753832f,0.447854f, +-0.502576f,0.721353f,0.476516f, +-0.457582f,0.746697f,0.482766f, +-0.419108f,0.791496f,0.44484f, +-0.465376f,0.834036f,0.296325f, +-0.468919f,0.860429f,0.199442f, +-0.486627f,0.858618f,0.161151f, +-0.430227f,0.89524f,0.115972f, +-0.34028f,0.937953f,0.066739f, +-0.311486f,0.949765f,0.0303886f, +-0.166884f,0.985403f,0.0336267f, +0.0381647f,0.996782f,-0.0704869f, +0.0486826f,0.951753f,-0.302979f, +-0.0940893f,0.932244f,-0.349383f, +-0.229015f,0.944857f,-0.234089f, +-0.214421f,0.956596f,-0.19735f, +-0.17466f,0.962579f,-0.207209f, +-0.106663f,0.986513f,-0.124157f, +-0.0523564f,0.993983f,-0.0962102f, +0.1751f,0.970986f,0.162867f, +0.126838f,0.957099f,0.260524f, +-0.0248407f,0.948904f,0.314587f, +-0.0169284f,0.94527f,0.325849f, +-0.126002f,0.963121f,0.237743f, +-0.322368f,0.933961f,0.154262f, +-0.357267f,0.920847f,0.156206f, +-0.40825f,0.900639f,0.148934f, +-0.500408f,0.86145f,0.0865774f, +-0.437173f,0.895731f,0.0809122f, +-0.234862f,0.957423f,0.167871f, +-0.122112f,0.971133f,0.204913f, +-0.146988f,0.949325f,0.277805f, +-0.214866f,0.947227f,0.237893f, +-0.166781f,0.968529f,0.184757f, +-0.279132f,0.953637f,0.112522f, +-0.438908f,0.892826f,0.101101f, +-0.476448f,0.878957f,0.0207741f, +-0.317496f,0.946313f,-0.0607282f, +-0.175675f,0.968847f,-0.174568f, +0.00443594f,0.981128f,-0.193308f, +0.0639918f,0.955901f,-0.286634f, +0.156615f,0.959233f,-0.235253f, +0.281138f,0.953388f,-0.109604f, +0.173642f,0.975105f,-0.137905f, +0.125725f,0.970112f,-0.207546f, +0.23259f,0.936622f,-0.261996f, +0.234534f,0.938208f,-0.25448f, +0.160485f,0.952598f,-0.258459f, +0.0824642f,0.968528f,-0.234849f, +0.0634583f,0.946763f,-0.315614f, +0.0567562f,0.917557f,-0.393532f, +0.0240187f,0.918352f,-0.395035f, +0.0995244f,0.946786f,-0.30609f, +0.0782245f,0.971194f,-0.225085f, +0.0104903f,0.995647f,-0.0926114f, +-0.185802f,0.976721f,-0.107212f, +-0.328502f,0.923412f,-0.198486f, +-0.311331f,0.92975f,-0.196566f, +-0.349149f,0.904891f,-0.24345f, +-0.388436f,0.90322f,-0.182515f, +-0.447323f,0.88531f,-0.126995f, +-0.452109f,0.890067f,-0.0581177f, +-0.409043f,0.912515f,0.000312055f, +-0.489105f,0.872225f,-0.000401423f, +-0.602394f,0.789815f,0.115381f, +-0.644891f,0.727938f,0.232857f, +-0.581256f,0.729671f,0.360168f, +-0.503025f,0.763549f,0.404917f, +-0.449741f,0.833702f,0.320428f, +-0.320295f,0.891402f,0.320645f, +-0.365897f,0.908793f,0.200535f, +-0.418513f,0.900509f,0.118029f, +-0.464312f,0.883882f,0.0562756f, +-0.399182f,0.916811f,0.0105308f, +-0.291715f,0.956056f,-0.0293054f, +-0.237447f,0.965751f,-0.104617f, +-0.100041f,0.966568f,-0.236091f, +0.160871f,0.934989f,-0.316096f, +0.093049f,0.931221f,-0.352375f, +-0.15859f,0.964926f,-0.209204f, +-0.273524f,0.944194f,-0.183526f, +-0.190425f,0.948278f,-0.253984f, +-0.130985f,0.95529f,-0.265074f, +-0.109109f,0.943759f,-0.312112f, +-0.0442587f,0.936376f,-0.348197f, +0.0244075f,0.991066f,0.131121f, +-0.0145509f,0.975134f,0.221137f, +-0.0404534f,0.947565f,0.316994f, +-0.0554847f,0.953641f,0.295787f, +-0.0378486f,0.926136f,0.375287f, +-0.276884f,0.909741f,0.309364f, +-0.35531f,0.878584f,0.319132f, +-0.28855f,0.905318f,0.311668f, +-0.418654f,0.900829f,0.115051f, +-0.470621f,0.881923f,0.0269622f, +-0.302456f,0.950707f,0.0683814f, +-0.155931f,0.981097f,0.114601f, +-0.172528f,0.971746f,0.161072f, +-0.175279f,0.972437f,0.153763f, +-0.0948884f,0.989506f,0.108971f, +-0.271832f,0.96203f,0.0246161f, +-0.434113f,0.899816f,0.0433328f, +-0.41192f,0.910729f,-0.0299284f, +-0.184465f,0.976107f,-0.114836f, +-0.0519711f,0.950434f,-0.306552f, +0.0510061f,0.914254f,-0.401918f, +0.0714878f,0.915457f,-0.396015f, +0.0823148f,0.944294f,-0.318643f, +0.154376f,0.938672f,-0.308322f, +0.218285f,0.948145f,-0.231024f, +0.158935f,0.938404f,-0.306818f, +0.261223f,0.9329f,-0.247912f, +0.285998f,0.932056f,-0.222434f, +0.190198f,0.913869f,-0.358703f, +0.0636773f,0.892218f,-0.447094f, +0.10205f,0.889697f,-0.445f, +0.100031f,0.900986f,-0.422159f, +0.0104969f,0.905423f,-0.424381f, +-0.0688464f,0.910262f,-0.408268f, +-0.0482237f,0.974352f,-0.219802f, +-0.0083558f,0.994225f,-0.106992f, +-0.112134f,0.979056f,-0.169927f, +-0.229912f,0.945374f,-0.231102f, +-0.280533f,0.899591f,-0.334719f, +-0.346884f,0.867971f,-0.355384f, +-0.459064f,0.843199f,-0.279779f, +-0.497889f,0.848119f,-0.181111f, +-0.501207f,0.860371f,-0.0924901f, +-0.458162f,0.888868f,-0.00122281f, +-0.514613f,0.855463f,0.0579275f, +-0.647763f,0.760835f,0.0391491f, +-0.704753f,0.709026f,0.0246046f, +-0.656653f,0.750377f,0.0757771f, +-0.504188f,0.854115f,0.127601f, +-0.41033f,0.905141f,0.111126f, +-0.337511f,0.936543f,0.0947305f, +-0.307169f,0.946112f,0.10256f, +-0.367429f,0.928128f,0.0597776f, +-0.393986f,0.91872f,-0.0269814f, +-0.373766f,0.918684f,-0.127743f, +-0.26114f,0.960116f,-0.0999132f, +-0.103927f,0.984722f,-0.139723f, +0.0511518f,0.955672f,-0.289956f, +0.187205f,0.928701f,-0.320109f, +-0.0295799f,0.970029f,-0.241182f, +-0.314429f,0.940081f,-0.13184f, +-0.185337f,0.978913f,-0.0859053f, +-0.104364f,0.967564f,-0.230061f, +-0.0895833f,0.932754f,-0.349206f, +-0.054587f,0.891296f,-0.450124f, +0.0297567f,0.885691f,-0.463321f, +0.100841f,0.951386f,0.291024f, +-0.0719364f,0.970866f,0.22857f, +-0.0950354f,0.957535f,0.272204f, +-0.063148f,0.9475f,0.313457f, +-0.147905f,0.922206f,0.357295f, +-0.255052f,0.862392f,0.437296f, +-0.348295f,0.831026f,0.433689f, +-0.228735f,0.861593f,0.453141f, +-0.189137f,0.904176f,0.383004f, +-0.40614f,0.912877f,0.041313f, +-0.322035f,0.946605f,-0.0152552f, +-0.213289f,0.976152f,0.0404333f, +-0.216957f,0.96919f,0.116619f, +-0.143471f,0.982181f,0.121395f, +-0.0619809f,0.995307f,0.0743149f, +-0.20303f,0.975599f,0.0835793f, +-0.415979f,0.909172f,0.0191678f, +-0.336954f,0.94062f,-0.0411873f, +-0.0679584f,0.981162f,-0.180839f, +0.116786f,0.956914f,-0.265849f, +0.119526f,0.96094f,-0.249616f, +-0.00488697f,0.95735f,-0.288889f, +0.0539017f,0.947486f,-0.315223f, +0.147321f,0.922615f,-0.35648f, +0.255572f,0.910786f,-0.324272f, +0.156463f,0.885962f,-0.436566f, +0.1301f,0.92297f,-0.362215f, +0.25276f,0.923086f,-0.289871f, +0.383737f,0.889757f,-0.247141f, +0.211205f,0.883014f,-0.419141f, +0.0342331f,0.879599f,-0.474482f, +0.00319575f,0.938694f,-0.344735f, +0.0177214f,0.953292f,-0.301529f, +-0.111253f,0.93857f,-0.326663f, +-0.240335f,0.933381f,-0.26653f, +-0.0538188f,0.987001f,-0.151433f, +-0.0274864f,0.979377f,-0.200162f, +-0.187631f,0.946384f,-0.262966f, +-0.206926f,0.955659f,-0.209519f, +-0.334901f,0.924406f,-0.182523f, +-0.500035f,0.842333f,-0.201099f, +-0.536058f,0.812568f,-0.228857f, +-0.57838f,0.789021f,-0.207176f, +-0.551453f,0.831854f,-0.0625953f, +-0.537806f,0.840551f,0.0651045f, +-0.581123f,0.812541f,0.0455343f, +-0.677773f,0.725811f,-0.117567f, +-0.674512f,0.726391f,-0.131871f, +-0.561194f,0.823313f,-0.0849523f, +-0.426155f,0.904036f,-0.0333265f, +-0.350057f,0.935877f,-0.0399208f, +-0.324764f,0.94579f,-0.0029281f, +-0.334572f,0.942069f,0.0238272f, +-0.264187f,0.96401f,-0.0298196f, +-0.331302f,0.926674f,-0.177522f, +-0.297768f,0.937944f,-0.177749f, +-0.0551409f,0.983889f,-0.170067f, +0.144484f,0.972505f,-0.182644f, +0.119335f,0.96645f,-0.227451f, +-0.0885992f,0.982619f,-0.163126f, +-0.33707f,0.92576f,-0.171324f, +-0.162854f,0.966557f,-0.198108f, +0.0162126f,0.974218f,-0.225026f, +0.138436f,0.947057f,-0.289688f, +0.0835536f,0.876982f,-0.473204f, +-0.010237f,0.848096f,-0.529743f, +0.136921f,0.906371f,0.399681f, +0.0140824f,0.922185f,0.386492f, +-0.160268f,0.929321f,0.33268f, +-0.112451f,0.900092f,0.420938f, +-0.203296f,0.876433f,0.436504f, +-0.322996f,0.829667f,0.455332f, +-0.340765f,0.827757f,0.445755f, +-0.257344f,0.84669f,0.465715f, +0.00366351f,0.865541f,0.500825f, +-0.0425812f,0.956742f,0.287804f, +-0.322344f,0.945159f,-0.052618f, +-0.280797f,0.958795f,-0.0431994f, +-0.262333f,0.964629f,-0.0259446f, +-0.0891831f,0.995449f,-0.0335709f, +-0.0801038f,0.992742f,-0.0896982f, +-0.224206f,0.974484f,0.0105758f, +-0.364477f,0.9309f,-0.0241328f, +-0.198506f,0.970273f,-0.138443f, +0.0492304f,0.955815f,-0.289816f, +0.0465241f,0.961334f,-0.271428f, +0.0147498f,0.993644f,-0.111598f, +0.136409f,0.989222f,-0.0532271f, +0.148553f,0.957532f,-0.247113f, +0.203722f,0.927854f,-0.312384f, +0.268253f,0.883803f,-0.383317f, +0.18614f,0.887058f,-0.422469f, +0.10218f,0.907566f,-0.407286f, +0.200645f,0.878358f,-0.433854f, +0.320433f,0.870875f,-0.372692f, +0.278243f,0.911383f,-0.303252f, +-0.0169368f,0.97379f,-0.226818f, +-0.116502f,0.978925f,-0.16773f, +0.0246686f,0.985931f,-0.165321f, +-0.099417f,0.977857f,-0.184152f, +-0.275352f,0.945128f,-0.175824f, +-0.0928967f,0.974055f,-0.206368f, +0.0664566f,0.97817f,-0.196893f, +-0.180659f,0.959555f,-0.21591f, +-0.356529f,0.924348f,-0.135896f, +-0.392702f,0.919607f,0.0104344f, +-0.427591f,0.903919f,-0.00980201f, +-0.491673f,0.851131f,-0.183941f, +-0.597871f,0.779934f,-0.185076f, +-0.630214f,0.771159f,-0.0902474f, +-0.603795f,0.796392f,-0.0345128f, +-0.532942f,0.846043f,0.013577f, +-0.560658f,0.826581f,-0.049261f, +-0.693149f,0.692482f,-0.200033f, +-0.591049f,0.792583f,-0.14991f, +-0.423413f,0.894971f,-0.14053f, +-0.360923f,0.922234f,-0.138633f, +-0.376728f,0.924323f,-0.0608465f, +-0.330964f,0.94352f,-0.0152562f, +-0.205049f,0.976512f,-0.0661789f, +-0.221147f,0.966952f,-0.126878f, +-0.282753f,0.933366f,-0.221083f, +-0.0599842f,0.959615f,-0.274846f, +0.119046f,0.947951f,-0.295324f, +0.164559f,0.948383f,-0.27109f, +-0.0951076f,0.948417f,-0.302424f, +-0.271887f,0.913351f,-0.303098f, +-0.128933f,0.917201f,-0.376985f, +0.0280066f,0.909443f,-0.414885f, +0.150608f,0.898143f,-0.413106f, +0.212115f,0.88838f,-0.407172f, +0.0467869f,0.87371f,-0.484191f, +0.135605f,0.903203f,0.407228f, +-0.01172f,0.896648f,0.44259f, +-0.138887f,0.847422f,0.512432f, +-0.170991f,0.843044f,0.50994f, +-0.191878f,0.839246f,0.508772f, +-0.300268f,0.838171f,0.455311f, +-0.32966f,0.831286f,0.447535f, +-0.223175f,0.877254f,0.424992f, +-0.0256774f,0.953915f,0.298977f, +0.199545f,0.913698f,0.354031f, +-0.0319727f,0.980881f,0.191963f, +-0.258985f,0.964126f,-0.0582107f, +-0.212788f,0.970943f,-0.109502f, +-0.0721792f,0.982085f,-0.174064f, +-0.0849627f,0.985898f,-0.144175f, +-0.290021f,0.949136f,-0.122591f, +-0.248272f,0.954348f,-0.166075f, +-0.0507313f,0.942327f,-0.330828f, +0.0792104f,0.910775f,-0.405234f, +-0.0679775f,0.927432f,-0.367762f, +-0.0963141f,0.945938f,-0.309718f, +0.147422f,0.952479f,-0.266555f, +0.232988f,0.930423f,-0.282895f, +0.296671f,0.921407f,-0.250989f, +0.346023f,0.880014f,-0.325337f, +0.246011f,0.893818f,-0.374924f, +0.0779935f,0.862828f,-0.499444f, +0.218748f,0.861753f,-0.457746f, +0.236169f,0.890523f,-0.388836f, +0.122215f,0.968128f,-0.218613f, +-0.119249f,0.983741f,-0.134288f, +-0.0975043f,0.983669f,-0.151287f, +0.0551556f,0.975975f,-0.210786f, +-0.0858442f,0.972611f,-0.216008f, +-0.228301f,0.939116f,-0.256789f, +-0.0600278f,0.94195f,-0.330342f, +-0.00498162f,0.954835f,-0.297095f, +-0.236752f,0.956732f,-0.169151f, +-0.404481f,0.905728f,-0.126698f, +-0.442956f,0.884106f,-0.148815f, +-0.353117f,0.929811f,-0.103732f, +-0.367684f,0.920274f,-0.133808f, +-0.620195f,0.758926f,-0.19847f, +-0.650875f,0.742352f,-0.158981f, +-0.60395f,0.783223f,-0.147668f, +-0.562027f,0.815077f,-0.140626f, +-0.504739f,0.855197f,-0.117796f, +-0.629314f,0.743816f,-0.22517f, +-0.590837f,0.750634f,-0.295736f, +-0.432954f,0.842346f,-0.320942f, +-0.414184f,0.8722f,-0.260227f, +-0.438355f,0.884876f,-0.157606f, +-0.309198f,0.940747f,-0.13925f, +-0.155389f,0.967122f,-0.20132f, +-0.14424f,0.961525f,-0.233805f, +-0.235758f,0.924f,-0.301067f, +0.0151186f,0.960375f,-0.278299f, +0.144315f,0.944571f,-0.294888f, +0.112415f,0.964242f,-0.239999f, +-0.0426025f,0.977992f,-0.204249f, +-0.206795f,0.910666f,-0.357663f, +-0.0742651f,0.885367f,-0.458922f, +0.0946583f,0.875247f,-0.474324f, +0.121834f,0.836586f,-0.534117f, +0.198513f,0.859849f,-0.470374f, +0.17646f,0.872184f,-0.456242f, +0.0304109f,0.916616f,0.39861f, +-0.119037f,0.881644f,0.456655f, +-0.241587f,0.81204f,0.53125f, +-0.146676f,0.796898f,0.586037f, +-0.0991089f,0.808485f,0.580111f, +-0.265015f,0.835696f,0.481019f, +-0.330941f,0.833473f,0.442495f, +-0.0736129f,0.908742f,0.410816f, +0.128357f,0.956244f,0.26291f, +0.135386f,0.977167f,0.163754f, +0.135126f,0.969499f,0.204482f, +-0.0826833f,0.991706f,0.0984031f, +-0.125203f,0.992066f,-0.0113628f, +-0.0793175f,0.988189f,-0.131112f, +-0.135148f,0.988869f,-0.0622353f, +-0.236045f,0.96998f,-0.0584937f, +-0.106098f,0.976702f,-0.186536f, +0.0734477f,0.937214f,-0.340932f, +0.0657813f,0.913127f,-0.402333f, +-0.0656411f,0.925185f,-0.373797f, +-0.0812155f,0.911514f,-0.403169f, +0.138018f,0.895606f,-0.422895f, +0.180346f,0.87052f,-0.457898f, +0.220345f,0.874256f,-0.43258f, +0.337626f,0.867122f,-0.366208f, +0.351448f,0.893332f,-0.280076f, +0.206919f,0.931373f,-0.299548f, +0.143612f,0.950749f,-0.274684f, +0.0388897f,0.972032f,-0.231606f, +-0.0281782f,0.996586f,-0.077599f, +-0.0348963f,0.997716f,-0.0578427f, +-0.0315338f,0.968969f,-0.245163f, +0.0536322f,0.969299f,-0.239965f, +-0.0592746f,0.980608f,-0.186802f, +-0.146447f,0.958871f,-0.243144f, +-0.0489008f,0.966653f,-0.251379f, +-0.0921771f,0.973026f,-0.211482f, +-0.303489f,0.921788f,-0.24125f, +-0.360359f,0.892722f,-0.270533f, +-0.374413f,0.86994f,-0.320965f, +-0.420297f,0.839321f,-0.344805f, +-0.400389f,0.890168f,-0.217463f, +-0.5519f,0.817694f,-0.163655f, +-0.641175f,0.723209f,-0.25664f, +-0.591295f,0.757829f,-0.275801f, +-0.562781f,0.775127f,-0.287152f, +-0.492934f,0.830818f,-0.258375f, +-0.559738f,0.799568f,-0.21768f, +-0.572862f,0.78051f,-0.250266f, +-0.449965f,0.836305f,-0.31325f, +-0.485973f,0.815927f,-0.313197f, +-0.461831f,0.850292f,-0.252418f, +-0.261301f,0.911823f,-0.316702f, +-0.0988633f,0.911184f,-0.399961f, +-0.117544f,0.902602f,-0.414118f, +-0.193385f,0.896249f,-0.399173f, +-0.121448f,0.924471f,-0.361392f, +0.0924319f,0.986306f,-0.136592f, +0.0129691f,0.994218f,-0.106593f, +0.0478938f,0.996018f,-0.0752017f, +0.0322924f,0.95892f,-0.281832f, +0.0176709f,0.880909f,-0.472956f, +0.117774f,0.85642f,-0.502666f, +0.141956f,0.850649f,-0.506206f, +0.133057f,0.865588f,-0.482757f, +0.139695f,0.858438f,-0.493528f, +-0.227309f,0.878161f,0.420907f, +-0.208802f,0.809453f,0.548805f, +-0.283627f,0.767885f,0.574377f, +-0.166581f,0.77975f,0.603523f, +-0.0979994f,0.806409f,0.583181f, +-0.132228f,0.805326f,0.577898f, +-0.219374f,0.878043f,0.425342f, +-0.024745f,0.955845f,0.292828f, +0.235018f,0.923494f,0.303193f, +0.225806f,0.944421f,0.238915f, +0.125193f,0.981151f,0.147203f, +-0.0300197f,0.990754f,0.132305f, +-0.0418198f,0.992604f,0.113964f, +0.010498f,0.998335f,0.0567192f, +-0.187859f,0.981941f,-0.0223995f, +-0.164152f,0.985849f,-0.0340039f, +-0.00148231f,0.989313f,-0.145799f, +0.214865f,0.96059f,-0.176353f, +0.130927f,0.950976f,-0.280185f, +-0.0784848f,0.932131f,-0.353513f, +-0.05291f,0.922588f,-0.382142f, +0.16861f,0.90111f,-0.399463f, +0.291627f,0.864919f,-0.408495f, +0.209787f,0.830907f,-0.515347f, +0.211969f,0.855025f,-0.473287f, +0.179371f,0.927145f,-0.328982f, +0.0938016f,0.98223f,-0.162562f, +0.0948278f,0.994302f,-0.0487031f, +0.0439203f,0.998532f,-0.0316906f, +-0.0612398f,0.9958f,-0.0680553f, +0.0442323f,0.992295f,-0.115732f, +0.0938163f,0.983362f,-0.155559f, +-0.00984882f,0.984434f,-0.175479f, +-0.064778f,0.984002f,-0.165961f, +-0.129271f,0.96358f,-0.234101f, +-0.126642f,0.968315f,-0.215238f, +-0.066296f,0.988071f,-0.138997f, +-0.153283f,0.960153f,-0.233691f, +-0.288259f,0.887225f,-0.360193f, +-0.349196f,0.862768f,-0.365641f, +-0.457337f,0.833523f,-0.309971f, +-0.510223f,0.838902f,-0.189514f, +-0.576482f,0.813491f,-0.0768136f, +-0.627022f,0.773599f,-0.0915885f, +-0.562811f,0.806938f,-0.179152f, +-0.554556f,0.77173f,-0.31129f, +-0.544029f,0.784112f,-0.298665f, +-0.593089f,0.773019f,-0.225135f, +-0.565758f,0.788678f,-0.240633f, +-0.424914f,0.871459f,-0.244963f, +-0.461935f,0.845882f,-0.266647f, +-0.437432f,0.833935f,-0.336461f, +-0.166572f,0.89804f,-0.407159f, +-0.027465f,0.893903f,-0.447419f, +-0.142495f,0.890824f,-0.431426f, +-0.254187f,0.896659f,-0.36248f, +-0.245781f,0.925153f,-0.289282f, +-0.124728f,0.970098f,-0.208211f, +0.0496061f,0.995502f,-0.0807218f, +0.134453f,0.977049f,-0.165221f, +0.178593f,0.948688f,-0.260952f, +0.203783f,0.948389f,-0.242962f, +0.169172f,0.89845f,-0.405178f, +0.129822f,0.855112f,-0.501925f, +0.114157f,0.849198f,-0.515587f, +0.207913f,0.855521f,-0.47419f, +-0.447508f,0.787815f,0.423184f, +-0.372189f,0.752087f,0.543911f, +-0.298757f,0.721076f,0.625135f, +-0.109779f,0.732409f,0.671956f, +-0.05023f,0.773443f,0.631872f, +-0.0721375f,0.784971f,0.615319f, +0.0161123f,0.834678f,0.550503f, +0.0881584f,0.925537f,0.368252f, +0.194291f,0.939133f,0.283338f, +0.290284f,0.915951f,0.277072f, +0.206501f,0.959193f,0.193147f, +0.0129994f,0.989588f,0.143339f, +-0.0515539f,0.993638f,0.100126f, +0.0752528f,0.992857f,0.0925807f, +-0.11243f,0.993659f,-0.00132253f, +-0.0900456f,0.995381f,-0.0332891f, +0.0735618f,0.988585f,-0.131483f, +0.187914f,0.97058f,-0.150539f, +0.259537f,0.959521f,-0.109363f, +0.039582f,0.950958f,-0.306778f, +0.0151247f,0.899216f,-0.437243f, +0.157602f,0.861329f,-0.482984f, +0.313265f,0.852495f,-0.41847f, +0.26241f,0.877515f,-0.401384f, +0.106606f,0.940488f,-0.322671f, +0.0451106f,0.964729f,-0.259351f, +-0.0198008f,0.966294f,-0.256677f, +0.0415355f,0.979836f,-0.195439f, +0.019077f,0.98811f,-0.15256f, +0.00843283f,0.995377f,-0.095676f, +0.0813095f,0.98616f,-0.14449f, +0.0601215f,0.98288f,-0.174159f, +0.0231889f,0.98066f,-0.194342f, +-0.0257967f,0.969536f,-0.243588f, +-0.0655874f,0.972755f,-0.222364f, +-0.116074f,0.960607f,-0.252509f, +-0.11539f,0.952331f,-0.282402f, +-0.0547002f,0.971779f,-0.229464f, +-0.238443f,0.921749f,-0.305817f, +-0.409013f,0.87493f,-0.259242f, +-0.537403f,0.830349f,-0.147369f, +-0.604026f,0.794872f,-0.0577237f, +-0.636334f,0.771366f,0.00856593f, +-0.598176f,0.796287f,0.0900769f, +-0.445184f,0.894265f,0.0458439f, +-0.510078f,0.851049f,-0.124644f, +-0.584904f,0.80616f,-0.0894032f, +-0.566358f,0.809139f,-0.156631f, +-0.526778f,0.78194f,-0.333278f, +-0.411595f,0.815587f,-0.406703f, +-0.430581f,0.806825f,-0.404517f, +-0.346574f,0.828739f,-0.439406f, +-0.163187f,0.84355f,-0.511658f, +-0.120565f,0.900123f,-0.41862f, +-0.22033f,0.94784f,-0.230335f, +-0.354954f,0.922144f,-0.15381f, +-0.229701f,0.962171f,-0.146509f, +-0.156358f,0.938689f,-0.30727f, +-0.0202846f,0.954287f,-0.298202f, +0.237025f,0.938874f,-0.24967f, +0.153523f,0.923965f,-0.350312f, +0.146234f,0.948682f,-0.280389f, +0.334575f,0.915861f,-0.221942f, +0.32488f,0.905199f,-0.273985f, +0.124349f,0.918374f,-0.375668f, +0.0853809f,0.932635f,-0.350575f, +-0.326098f,0.745953f,0.580702f, +-0.408924f,0.742079f,0.53113f, +-0.380928f,0.732802f,0.563822f, +-0.135265f,0.771831f,0.621274f, +0.0172939f,0.791015f,0.611552f, +-0.0321407f,0.821651f,0.569084f, +0.110827f,0.821493f,0.559345f, +0.260047f,0.831043f,0.491674f, +0.30077f,0.882298f,0.362061f, +0.33436f,0.910333f,0.243922f, +0.27591f,0.939307f,0.203903f, +0.0278945f,0.981912f,0.18727f, +-0.00885636f,0.980185f,0.197887f, +0.145141f,0.978135f,0.148949f, +-0.0144219f,0.999761f,0.0164012f, +-0.0725846f,0.989236f,-0.127057f, +0.156537f,0.975005f,-0.157677f, +0.153594f,0.966224f,-0.206929f, +0.277291f,0.95249f,-0.125986f, +0.254121f,0.951784f,-0.171844f, +0.192884f,0.934802f,-0.298229f, +0.176671f,0.893747f,-0.412315f, +0.195208f,0.917965f,-0.345303f, +0.157451f,0.974963f,-0.157023f, +0.0279983f,0.991052f,-0.13051f, +0.088609f,0.976865f,-0.194637f, +0.0507072f,0.953301f,-0.297735f, +-0.0277167f,0.944799f,-0.326477f, +-0.027462f,0.967827f,-0.250115f, +-0.0885824f,0.972427f,-0.215728f, +0.0938124f,0.990405f,-0.101477f, +0.168783f,0.975825f,-0.138845f, +0.111665f,0.949064f,-0.294633f, +-0.0373777f,0.928827f,-0.368623f, +-0.132876f,0.934016f,-0.3316f, +-0.0938993f,0.959978f,-0.263865f, +-0.105226f,0.962669f,-0.249392f, +-0.104341f,0.966883f,-0.232916f, +-0.220802f,0.965347f,-0.13911f, +-0.478375f,0.876928f,-0.0464122f, +-0.604444f,0.796064f,0.0305022f, +-0.611643f,0.789038f,0.0575453f, +-0.651561f,0.758511f,-0.0113831f, +-0.622019f,0.781788f,-0.0435906f, +-0.406862f,0.913403f,-0.012587f, +-0.447294f,0.893518f,0.0394196f, +-0.595605f,0.801728f,0.049859f, +-0.453119f,0.890822f,0.0334497f, +-0.397535f,0.913376f,-0.0878049f, +-0.358743f,0.901381f,-0.242521f, +-0.368468f,0.876571f,-0.309604f, +-0.3524f,0.834147f,-0.42428f, +-0.221095f,0.907887f,-0.356171f, +-0.336012f,0.912731f,-0.232418f, +-0.365521f,0.924164f,-0.110978f, +-0.381997f,0.913352f,-0.140951f, +-0.128103f,0.980976f,-0.145863f, +0.0620369f,0.958271f,-0.279048f, +-0.0393717f,0.894694f,-0.44494f, +0.166576f,0.906235f,-0.388576f, +0.257306f,0.912784f,-0.317204f, +0.0500832f,0.912737f,-0.405466f, +0.219062f,0.950498f,-0.220374f, +0.303476f,0.949102f,-0.0843104f, +0.167756f,0.983709f,-0.0646101f, +-0.00137806f,0.991718f,-0.128423f, +-0.411803f,0.737245f,0.535619f, +-0.383529f,0.716567f,0.582612f, +-0.385829f,0.756694f,0.527779f, +-0.125894f,0.866623f,0.482821f, +0.0864817f,0.885592f,0.456341f, +0.0185611f,0.909875f,0.414467f, +0.0890012f,0.92755f,0.362947f, +0.3312f,0.85507f,0.39895f, +0.411118f,0.842585f,0.347898f, +0.395768f,0.87253f,0.286458f, +0.265631f,0.912624f,0.310738f, +0.0432866f,0.942781f,0.330591f, +-0.0291247f,0.959608f,0.279829f, +0.17674f,0.935093f,0.307187f, +0.194038f,0.946511f,0.25781f, +0.0938941f,0.995535f,0.00965941f, +0.2133f,0.967919f,-0.132802f, +0.174202f,0.951285f,-0.254382f, +0.185706f,0.942688f,-0.277223f, +0.254853f,0.951817f,-0.170569f, +0.272452f,0.946195f,-0.174599f, +0.236374f,0.944357f,-0.228728f, +0.0622104f,0.974295f,-0.216517f, +0.00421412f,0.994674f,-0.102989f, +0.150974f,0.988535f,0.00252771f, +0.198367f,0.972494f,-0.122094f, +0.128147f,0.983415f,-0.128347f, +0.00128047f,0.972843f,-0.231463f, +-0.0877992f,0.94046f,-0.328368f, +-0.123322f,0.945018f,-0.302876f, +0.0120775f,0.960206f,-0.279033f, +0.230563f,0.945381f,-0.230424f, +0.231597f,0.934072f,-0.271795f, +0.0492688f,0.934225f,-0.353265f, +-0.160672f,0.892999f,-0.4204f, +-0.160391f,0.913064f,-0.374951f, +-0.146451f,0.932705f,-0.329565f, +-0.203905f,0.952995f,-0.224107f, +-0.374034f,0.927408f,-0.00361175f, +-0.538909f,0.826945f,0.160435f, +-0.614792f,0.776175f,0.139939f, +-0.589081f,0.79961f,0.116649f, +-0.558852f,0.827241f,0.0579274f, +-0.582196f,0.802416f,-0.131063f, +-0.51435f,0.846005f,-0.140428f, +-0.52517f,0.850476f,0.0297862f, +-0.596917f,0.80173f,0.0303285f, +-0.476386f,0.879145f,0.0126877f, +-0.346071f,0.935165f,0.0755073f, +-0.29506f,0.953573f,0.0603189f, +-0.290873f,0.956376f,0.0271545f, +-0.342792f,0.934849f,-0.0924672f, +-0.36131f,0.919889f,-0.152511f, +-0.440677f,0.895263f,-0.0656364f, +-0.27224f,0.960453f,-0.0584458f, +-0.239345f,0.939791f,-0.243941f, +-0.184322f,0.924268f,-0.334296f, +0.170265f,0.967851f,-0.185131f, +0.0831722f,0.975078f,-0.205681f, +0.0764752f,0.962386f,-0.2607f, +0.25092f,0.948574f,-0.192995f, +-0.000511184f,0.983325f,-0.181855f, +0.00805518f,0.99922f,-0.0386666f, +0.231558f,0.969957f,0.0745867f, +0.213284f,0.97378f,0.0791335f, +0.134707f,0.990255f,0.0353415f, +-0.461887f,0.727903f,0.506772f, +-0.409704f,0.769768f,0.48949f, +-0.245031f,0.85373f,0.459461f, +-0.000652498f,0.933053f,0.359739f, +0.0977619f,0.940993f,0.323999f, +0.0976539f,0.925223f,0.366641f, +0.122528f,0.958779f,0.256377f, +0.300256f,0.92807f,0.220301f, +0.434057f,0.868364f,0.239872f, +0.373936f,0.875783f,0.305249f, +0.188752f,0.892291f,0.41011f, +0.0749298f,0.875078f,0.478146f, +0.0539526f,0.905587f,0.420716f, +0.139771f,0.930537f,0.338475f, +0.252071f,0.902374f,0.349544f, +0.271241f,0.91149f,0.309214f, +0.343876f,0.91657f,0.204082f, +0.324141f,0.940857f,0.098591f, +0.18373f,0.982977f,-0.000581414f, +0.215424f,0.976468f,-0.0101277f, +0.272942f,0.961141f,-0.0413737f, +0.263192f,0.964688f,-0.010384f, +0.0834313f,0.988492f,-0.126183f, +-0.0244777f,0.972824f,-0.230248f, +0.037395f,0.972598f,-0.229465f, +0.188221f,0.98005f,-0.0638298f, +0.133895f,0.99093f,-0.0113778f, +0.15553f,0.985289f,-0.0708293f, +0.062154f,0.97927f,-0.19279f, +-0.0906565f,0.929896f,-0.356476f, +-0.00537849f,0.905315f,-0.424706f, +0.162604f,0.918237f,-0.361109f, +0.211297f,0.942163f,-0.260159f, +0.166674f,0.959094f,-0.22882f, +-0.0900843f,0.919646f,-0.382278f, +-0.185542f,0.891522f,-0.413234f, +-0.236454f,0.911319f,-0.337026f, +-0.404129f,0.904849f,-0.133894f, +-0.540771f,0.839361f,0.0551279f, +-0.598434f,0.794978f,0.0994372f, +-0.56944f,0.810652f,0.136315f, +-0.572323f,0.818089f,0.0563579f, +-0.472334f,0.880613f,0.0376913f, +-0.539685f,0.840552f,-0.0470301f, +-0.574258f,0.816988f,0.0525225f, +-0.582793f,0.802613f,0.127141f, +-0.577964f,0.810669f,0.0936681f, +-0.453297f,0.886551f,0.0924669f, +-0.392456f,0.918879f,0.0405067f, +-0.316387f,0.94595f,0.0712573f, +-0.278453f,0.953269f,0.117224f, +-0.268053f,0.957793f,0.103824f, +-0.307148f,0.94927f,0.0674248f, +-0.42059f,0.907249f,-0.00173726f, +-0.259446f,0.962613f,-0.0778756f, +-0.0851837f,0.992966f,-0.082236f, +-0.215247f,0.960313f,-0.177393f, +-0.0219544f,0.989556f,-0.14247f, +0.0391647f,0.99769f,-0.0555004f, +0.102045f,0.994433f,0.0262785f, +0.194292f,0.978837f,0.0642512f, +-0.0292693f,0.988875f,0.145839f, +-0.101853f,0.986247f,0.130166f, +0.212882f,0.964861f,0.15403f, +0.245798f,0.960888f,0.127587f, +0.195444f,0.974318f,0.111832f, +-0.321858f,0.809731f,0.490656f, +-0.324834f,0.8531f,0.408293f, +-0.169338f,0.931652f,0.321478f, +0.0137661f,0.965459f,0.260189f, +0.0568655f,0.931751f,0.358619f, +0.0773718f,0.91837f,0.388084f, +0.261047f,0.911575f,0.317625f, +0.360487f,0.919759f,0.155217f, +0.377368f,0.917164f,0.128078f, +0.276887f,0.917903f,0.284232f, +0.0739314f,0.913495f,0.400076f, +0.00592871f,0.863726f,0.503926f, +0.12818f,0.830694f,0.541773f, +0.218813f,0.849726f,0.479673f, +0.242686f,0.877276f,0.414115f, +0.274843f,0.886896f,0.371318f, +0.349234f,0.864992f,0.360313f, +0.316807f,0.866747f,0.385206f, +0.243026f,0.8884f,0.389467f, +0.293176f,0.904042f,0.311057f, +0.24905f,0.947495f,0.200568f, +0.307601f,0.926121f,0.21836f, +0.250581f,0.964737f,0.0805682f, +0.134636f,0.99035f,-0.0328548f, +0.000251354f,0.985828f,-0.167762f, +0.0218107f,0.990992f,-0.132131f, +0.159951f,0.984761f,-0.068279f, +0.165852f,0.977778f,-0.128229f, +0.162621f,0.98447f,-0.06613f, +0.121502f,0.975682f,-0.182435f, +0.0565286f,0.935574f,-0.348576f, +0.0461029f,0.9227f,-0.382752f, +0.0939341f,0.947555f,-0.305477f, +0.144515f,0.970016f,-0.195409f, +0.0775217f,0.989125f,-0.124991f, +-0.200827f,0.965332f,-0.16674f, +-0.401609f,0.907839f,-0.120577f, +-0.559375f,0.828885f,-0.00699655f, +-0.565805f,0.821746f,0.0678162f, +-0.593147f,0.804311f,0.0354918f, +-0.576294f,0.817225f,0.00543077f, +-0.525544f,0.848999f,-0.0548173f, +-0.499547f,0.863338f,-0.0714126f, +-0.553806f,0.830814f,0.0551944f, +-0.639015f,0.755184f,0.146141f, +-0.555848f,0.812796f,0.174341f, +-0.558245f,0.826947f,0.0672363f, +-0.433561f,0.898303f,0.0712505f, +-0.328723f,0.942541f,0.0596481f, +-0.348698f,0.936876f,0.0259581f, +-0.301092f,0.95068f,0.0745005f, +-0.263015f,0.962594f,0.0650869f, +-0.284818f,0.957539f,0.0446894f, +-0.359379f,0.932627f,-0.032449f, +-0.231945f,0.967322f,-0.102417f, +-0.134462f,0.989922f,-0.0444264f, +-0.162306f,0.986023f,0.0376183f, +0.00794699f,0.998548f,-0.0532871f, +-0.0239448f,0.993657f,-0.109874f, +-0.0216422f,0.99782f,0.0623378f, +0.109723f,0.978713f,0.173443f, +-0.0637399f,0.980084f,0.188075f, +-0.0488189f,0.981371f,0.185814f, +0.215314f,0.95546f,0.201833f, +0.226954f,0.944659f,0.236876f, +0.18874f,0.93582f,0.297688f, +-0.35388f,0.863488f,0.359384f, +-0.279389f,0.900607f,0.332938f, +-0.0980507f,0.952584f,0.288043f, +-0.0324622f,0.946395f,0.321377f, +-0.0380375f,0.913004f,0.406173f, +0.128955f,0.929408f,0.345792f, +0.375928f,0.898621f,0.226181f, +0.446257f,0.883274f,0.143813f, +0.289683f,0.938589f,0.187442f, +0.125289f,0.928145f,0.350499f, +-0.0288389f,0.895239f,0.444652f, +-0.103894f,0.871209f,0.479793f, +0.105997f,0.859294f,0.500378f, +0.239743f,0.842088f,0.483127f, +0.302444f,0.818919f,0.48775f, +0.351983f,0.830309f,0.432082f, +0.318807f,0.868172f,0.380315f, +0.306771f,0.857612f,0.412787f, +0.273726f,0.881543f,0.384651f, +0.337032f,0.866043f,0.369295f, +0.363605f,0.874829f,0.320103f, +0.334634f,0.927168f,0.168463f, +0.372292f,0.916204f,0.148217f, +0.206342f,0.978274f,0.0200943f, +0.119354f,0.989819f,-0.077546f, +0.042858f,0.974765f,-0.21908f, +0.15227f,0.956258f,-0.24977f, +0.17642f,0.955622f,-0.235928f, +0.119264f,0.963567f,-0.239406f, +0.210452f,0.949288f,-0.233584f, +0.171674f,0.93622f,-0.306626f, +0.0511268f,0.942128f,-0.331333f, +0.00960037f,0.978635f,-0.205381f, +-0.00181509f,0.99884f,-0.048118f, +-0.0483779f,0.993619f,0.101885f, +-0.221067f,0.964285f,0.145887f, +-0.435375f,0.898142f,0.0615596f, +-0.544434f,0.838804f,-0.00062539f, +-0.579913f,0.810216f,-0.0851529f, +-0.5726f,0.815766f,-0.0815813f, +-0.546649f,0.832873f,-0.0865884f, +-0.465735f,0.88205f,-0.071268f, +-0.55864f,0.824018f,-0.0944285f, +-0.642115f,0.765228f,0.0459774f, +-0.656804f,0.753752f,0.0216163f, +-0.520592f,0.853762f,0.00863503f, +-0.481258f,0.875004f,-0.0525228f, +-0.443379f,0.889071f,-0.113874f, +-0.339817f,0.937077f,-0.0800719f, +-0.346478f,0.935462f,-0.0697409f, +-0.350474f,0.934462f,-0.0628307f, +-0.228751f,0.97348f,-0.00313391f, +-0.230759f,0.970493f,-0.0699589f, +-0.279469f,0.954379f,-0.105155f, +-0.198889f,0.96686f,-0.16008f, +-0.230529f,0.946681f,-0.225058f, +-0.14204f,0.970201f,-0.196301f, +0.0687794f,0.962113f,-0.263834f, +-0.0677159f,0.979986f,-0.187196f, +-0.220027f,0.972288f,-0.0790245f, +0.07326f,0.993712f,0.0846721f, +-0.0289367f,0.993146f,0.113239f, +-0.106822f,0.986395f,0.124957f, +0.128381f,0.967004f,0.22005f, +0.141757f,0.945235f,0.293998f, +0.0274083f,0.95189f,0.30521f, +-0.150915f,0.940582f,0.304189f, +-0.174369f,0.970549f,0.166222f, +-0.140821f,0.979995f,0.140639f, +-0.141606f,0.959082f,0.245171f, +0.011894f,0.972798f,0.23135f, +0.262326f,0.961504f,0.0818187f, +0.456393f,0.889018f,0.036791f, +0.382632f,0.920315f,0.0813253f, +0.174752f,0.942069f,0.286301f, +-0.045852f,0.917014f,0.396211f, +-0.0633233f,0.882412f,0.466197f, +-0.0422981f,0.919143f,0.391647f, +0.126089f,0.949054f,0.288786f, +0.256733f,0.912921f,0.317275f, +0.315104f,0.887032f,0.337468f, +0.409846f,0.864148f,0.292018f, +0.343944f,0.901166f,0.263823f, +0.312798f,0.897029f,0.312244f, +0.323227f,0.888441f,0.325879f, +0.342446f,0.89904f,0.272869f, +0.451059f,0.860524f,0.236736f, +0.423682f,0.891569f,0.159992f, +0.404089f,0.899665f,0.165275f, +0.34072f,0.934631f,0.101855f, +0.255675f,0.966712f,-0.00994645f, +0.192495f,0.972523f,-0.130939f, +0.146493f,0.95759f,-0.248115f, +0.177747f,0.950895f,-0.253387f, +0.10258f,0.958737f,-0.265144f, +0.233714f,0.956929f,-0.172236f, +0.223818f,0.95591f,-0.190111f, +-0.0753718f,0.974181f,-0.212814f, +-0.223858f,0.97386f,-0.0385406f, +-0.201603f,0.967155f,0.154817f, +-0.110966f,0.95618f,0.270934f, +-0.121146f,0.966863f,0.224722f, +-0.291476f,0.94891f,0.120877f, +-0.477923f,0.877529f,-0.0391374f, +-0.509066f,0.849204f,-0.140369f, +-0.547573f,0.807834f,-0.218101f, +-0.563212f,0.785973f,-0.255028f, +-0.550783f,0.817799f,-0.166865f, +-0.567941f,0.823056f,0.00472398f, +-0.662541f,0.748994f,-0.00687841f, +-0.61971f,0.78387f,-0.03883f, +-0.523314f,0.847679f,-0.0870804f, +-0.447797f,0.889814f,-0.0877948f, +-0.443749f,0.888577f,-0.116264f, +-0.376466f,0.920201f,-0.107257f, +-0.337652f,0.938208f,-0.0758775f, +-0.365552f,0.926461f,-0.0896778f, +-0.259904f,0.962681f,-0.0754604f, +-0.126151f,0.988548f,-0.0828222f, +-0.30144f,0.926166f,-0.226606f, +-0.124801f,0.973148f,-0.193411f, +-0.0842547f,0.941418f,-0.326548f, +-0.0799027f,0.902475f,-0.423267f, +-0.00736616f,0.932864f,-0.360152f, +-0.199402f,0.957181f,-0.209865f, +-0.285967f,0.938676f,-0.192641f, +-0.0884894f,0.987166f,-0.132941f, +-0.0982017f,0.994337f,0.0406204f, +-0.151395f,0.982648f,0.107153f, +0.0310104f,0.988838f,0.14573f, +0.106405f,0.964191f,0.242925f, +0.070474f,0.952157f,0.297374f, +0.0656706f,0.9919f,0.108725f, +-0.0894851f,0.995828f,0.0178395f, +-0.190523f,0.981135f,0.0327999f, +-0.155304f,0.987556f,0.0247798f, +0.115224f,0.991572f,-0.0592235f, +0.36579f,0.920032f,-0.140496f, +0.356271f,0.926984f,-0.117348f, +0.248335f,0.959842f,0.130508f, +0.000801886f,0.966476f,0.256755f, +-0.114974f,0.940419f,0.319989f, +-0.0524682f,0.940494f,0.335734f, +0.129742f,0.951002f,0.280646f, +0.183656f,0.974747f,0.127042f, +0.210533f,0.964529f,0.159247f, +0.299776f,0.935816f,0.185429f, +0.476652f,0.857927f,0.191739f, +0.365421f,0.920615f,0.137608f, +0.247354f,0.961561f,0.119232f, +0.333488f,0.932256f,0.140299f, +0.428629f,0.898219f,0.0973634f, +0.470887f,0.881687f,0.0298847f, +0.443595f,0.892268f,0.0841461f, +0.38152f,0.920309f,0.0864469f, +0.381462f,0.916941f,0.117074f, +0.327497f,0.93955f,0.099957f, +0.304803f,0.952409f,-0.00357992f, +0.239937f,0.959204f,-0.149528f, +0.202117f,0.965308f,-0.165315f, +0.0495866f,0.988011f,-0.146203f, +0.0854477f,0.995976f,-0.027023f, +0.244078f,0.956317f,0.160886f, +-0.0753613f,0.986424f,0.145905f, +-0.339089f,0.932874f,0.12151f, +-0.294837f,0.942606f,0.15673f, +-0.104304f,0.973462f,0.203698f, +-0.0723227f,0.985619f,0.152724f, +-0.210009f,0.973927f,0.0858055f, +-0.391811f,0.919671f,-0.0262484f, +-0.442429f,0.895892f,-0.0404195f, +-0.501975f,0.857758f,-0.11078f, +-0.516547f,0.834688f,-0.190982f, +-0.606461f,0.747704f,-0.270451f, +-0.650373f,0.745527f,-0.145618f, +-0.638901f,0.762805f,-0.0996673f, +-0.598555f,0.785548f,-0.156994f, +-0.501024f,0.846694f,-0.179123f, +-0.446137f,0.875545f,-0.185426f, +-0.431282f,0.886668f,-0.16678f, +-0.409115f,0.903871f,-0.125073f, +-0.364534f,0.929271f,-0.0597475f, +-0.342967f,0.93838f,-0.0426101f, +-0.26831f,0.95962f,-0.0844963f, +-0.0393852f,0.992201f,-0.118264f, +-0.116204f,0.958118f,-0.261737f, +-0.10396f,0.911216f,-0.398596f, +0.0690263f,0.90803f,-0.41318f, +-0.107766f,0.879323f,-0.463872f, +-0.204112f,0.904181f,-0.375227f, +-0.300499f,0.93243f,-0.200683f, +-0.27347f,0.953749f,-0.124807f, +-0.169754f,0.978593f,-0.116359f, +-0.231778f,0.970053f,-0.072634f, +-0.190395f,0.98166f,0.00964305f, +-0.0305984f,0.996687f,0.0753532f, +0.015862f,0.984083f,0.177002f, +-0.0353434f,0.980638f,0.192612f, +-0.00358253f,0.996067f,-0.0885361f, +-0.091201f,0.995656f,-0.0187243f, +-0.182622f,0.982071f,0.0467509f, +-0.0739202f,0.997106f,-0.017751f, +0.154438f,0.971547f,-0.179571f, +0.395535f,0.904532f,-0.159291f, +0.194508f,0.960754f,-0.197781f, +0.113269f,0.98581f,0.123894f, +-0.030891f,0.963944f,0.264306f, +-0.124571f,0.959262f,0.253572f, +-0.0553429f,0.968125f,0.244277f, +0.192328f,0.950681f,0.243343f, +0.217769f,0.968216f,0.123025f, +0.205296f,0.966103f,0.156522f, +0.276023f,0.954237f,0.11508f, +0.467224f,0.868183f,0.167212f, +0.402263f,0.894308f,0.195955f, +0.299601f,0.940084f,0.162733f, +0.355906f,0.933872f,0.0348486f, +0.474044f,0.880198f,-0.0230946f, +0.444725f,0.891474f,-0.0865651f, +0.431452f,0.901988f,0.0163334f, +0.385491f,0.922676f,0.00810292f, +0.339313f,0.940655f,0.00595024f, +0.37483f,0.92173f,0.099581f, +0.41171f,0.911266f,-0.00949356f, +0.281208f,0.933096f,-0.224175f, +0.138066f,0.959634f,-0.245031f, +0.0299217f,0.992057f,-0.122182f, +-0.0797424f,0.99128f,-0.104905f, +0.124146f,0.977522f,0.170405f, +-0.0302976f,0.947743f,0.317594f, +-0.301142f,0.928457f,0.21744f, +-0.278579f,0.94845f,0.151119f, +-0.150217f,0.982764f,0.107745f, +0.0163995f,0.982022f,0.188052f, +-0.137431f,0.989816f,0.0370977f, +-0.36652f,0.926186f,-0.0885568f, +-0.445397f,0.895157f,-0.0177851f, +-0.463397f,0.885777f,-0.0257252f, +-0.466469f,0.878885f,-0.099842f, +-0.557948f,0.804805f,-0.202443f, +-0.681509f,0.679149f,-0.272587f, +-0.629296f,0.753928f,-0.188625f, +-0.5596f,0.798482f,-0.221976f, +-0.503025f,0.800303f,-0.326313f, +-0.422254f,0.855253f,-0.300408f, +-0.454716f,0.829192f,-0.325075f, +-0.46025f,0.856807f,-0.232488f, +-0.37729f,0.921922f,-0.0878209f, +-0.375084f,0.920087f,-0.112928f, +-0.173161f,0.984659f,-0.0214944f, +-0.0348229f,0.978528f,-0.20315f, +0.0523603f,0.977312f,-0.205229f, +-0.0533357f,0.893335f,-0.446215f, +0.0246713f,0.873256f,-0.486637f, +-0.0923807f,0.905308f,-0.414587f, +-0.269958f,0.871402f,-0.409612f, +-0.388686f,0.862358f,-0.324442f, +-0.340148f,0.928537f,-0.148722f, +-0.147166f,0.988619f,-0.0312327f, +-0.248059f,0.963625f,-0.099463f, +-0.232297f,0.969578f,-0.0771772f, +-0.142695f,0.989498f,-0.02308f, +-0.0198137f,0.98287f,0.18323f, +-0.0333475f,0.978727f,0.202438f, +}; + +btScalar Landscape05Tex[] = { +0.0f,0.5f, +0.0f,0.492188f, +0.0078125f,0.5f, +0.0078125f,0.492188f, +0.015625f,0.5f, +0.015625f,0.492188f, +0.0234375f,0.5f, +0.0234375f,0.492188f, +0.03125f,0.5f, +0.03125f,0.492188f, +0.0390625f,0.5f, +0.0390625f,0.492188f, +0.046875f,0.5f, +0.046875f,0.492188f, +0.0546875f,0.5f, +0.0546875f,0.492188f, +0.0625f,0.5f, +0.0625f,0.492188f, +0.0703125f,0.5f, +0.0703125f,0.492188f, +0.078125f,0.5f, +0.078125f,0.492188f, +0.0859375f,0.5f, +0.0859375f,0.492188f, +0.09375f,0.5f, +0.09375f,0.492188f, +0.101563f,0.5f, +0.101563f,0.492188f, +0.109375f,0.5f, +0.109375f,0.492188f, +0.117188f,0.5f, +0.117188f,0.492188f, +0.125f,0.5f, +0.125f,0.492188f, +0.132813f,0.5f, +0.132813f,0.492188f, +0.140625f,0.5f, +0.140625f,0.492188f, +0.148438f,0.5f, +0.148438f,0.492188f, +0.15625f,0.5f, +0.15625f,0.492188f, +0.164063f,0.5f, +0.164063f,0.492188f, +0.171875f,0.5f, +0.171875f,0.492188f, +0.179688f,0.5f, +0.179688f,0.492188f, +0.1875f,0.5f, +0.1875f,0.492188f, +0.195313f,0.5f, +0.195313f,0.492188f, +0.203125f,0.5f, +0.203125f,0.492188f, +0.210938f,0.5f, +0.210938f,0.492188f, +0.21875f,0.5f, +0.21875f,0.492188f, +0.226563f,0.5f, +0.226563f,0.492188f, +0.234375f,0.5f, +0.234375f,0.492188f, +0.242188f,0.5f, +0.242188f,0.492188f, +0.25f,0.5f, +0.25f,0.492188f, +0.257813f,0.5f, +0.257813f,0.492188f, +0.265625f,0.5f, +0.265625f,0.492188f, +0.273438f,0.5f, +0.273438f,0.492188f, +0.28125f,0.5f, +0.28125f,0.492188f, +0.289063f,0.5f, +0.289063f,0.492188f, +0.296875f,0.5f, +0.296875f,0.492188f, +0.304688f,0.5f, +0.304688f,0.492188f, +0.3125f,0.5f, +0.3125f,0.492188f, +0.320313f,0.5f, +0.320313f,0.492188f, +0.328125f,0.5f, +0.328125f,0.492188f, +0.335938f,0.5f, +0.335938f,0.492188f, +0.34375f,0.5f, +0.34375f,0.492188f, +0.351563f,0.5f, +0.351563f,0.492188f, +0.359375f,0.5f, +0.359375f,0.492188f, +0.367188f,0.5f, +0.367188f,0.492188f, +0.375f,0.5f, +0.375f,0.492188f, +0.382813f,0.5f, +0.382813f,0.492188f, +0.390625f,0.5f, +0.390625f,0.492188f, +0.398438f,0.5f, +0.398438f,0.492188f, +0.40625f,0.5f, +0.40625f,0.492188f, +0.414063f,0.5f, +0.414063f,0.492188f, +0.421875f,0.5f, +0.421875f,0.492188f, +0.429688f,0.5f, +0.429688f,0.492188f, +0.4375f,0.5f, +0.4375f,0.492188f, +0.445313f,0.5f, +0.445313f,0.492188f, +0.453125f,0.5f, +0.453125f,0.492188f, +0.460938f,0.5f, +0.460938f,0.492188f, +0.46875f,0.5f, +0.46875f,0.492188f, +0.476563f,0.5f, +0.476563f,0.492188f, +0.484375f,0.5f, +0.484375f,0.492188f, +0.492188f,0.5f, +0.492188f,0.492188f, +0.5f,0.5f, +0.5f,0.492188f, +0.507813f,0.5f, +0.507813f,0.492188f, +0.0f,0.507813f, +0.0078125f,0.507813f, +0.015625f,0.507813f, +0.0234375f,0.507813f, +0.03125f,0.507813f, +0.0390625f,0.507813f, +0.046875f,0.507813f, +0.0546875f,0.507813f, +0.0625f,0.507813f, +0.0703125f,0.507813f, +0.078125f,0.507813f, +0.0859375f,0.507813f, +0.09375f,0.507813f, +0.101563f,0.507813f, +0.109375f,0.507813f, +0.117188f,0.507813f, +0.125f,0.507813f, +0.132813f,0.507813f, +0.140625f,0.507813f, +0.148438f,0.507813f, +0.15625f,0.507813f, +0.164063f,0.507813f, +0.171875f,0.507813f, +0.179688f,0.507813f, +0.1875f,0.507813f, +0.195313f,0.507813f, +0.203125f,0.507813f, +0.210938f,0.507813f, +0.21875f,0.507813f, +0.226563f,0.507813f, +0.234375f,0.507813f, +0.242188f,0.507813f, +0.25f,0.507813f, +0.257813f,0.507813f, +0.265625f,0.507813f, +0.273438f,0.507813f, +0.28125f,0.507813f, +0.289063f,0.507813f, +0.296875f,0.507813f, +0.304688f,0.507813f, +0.3125f,0.507813f, +0.320313f,0.507813f, +0.328125f,0.507813f, +0.335938f,0.507813f, +0.34375f,0.507813f, +0.351563f,0.507813f, +0.359375f,0.507813f, +0.367188f,0.507813f, +0.375f,0.507813f, +0.382813f,0.507813f, +0.390625f,0.507813f, +0.398438f,0.507813f, +0.40625f,0.507813f, +0.414063f,0.507813f, +0.421875f,0.507813f, +0.429688f,0.507813f, +0.4375f,0.507813f, +0.445313f,0.507813f, +0.453125f,0.507813f, +0.460938f,0.507813f, +0.46875f,0.507813f, +0.476563f,0.507813f, +0.484375f,0.507813f, +0.492188f,0.507813f, +0.5f,0.507813f, +0.507813f,0.507813f, +0.0f,0.515625f, +0.0078125f,0.515625f, +0.015625f,0.515625f, +0.0234375f,0.515625f, +0.03125f,0.515625f, +0.0390625f,0.515625f, +0.046875f,0.515625f, +0.0546875f,0.515625f, +0.0625f,0.515625f, +0.0703125f,0.515625f, +0.078125f,0.515625f, +0.0859375f,0.515625f, +0.09375f,0.515625f, +0.101563f,0.515625f, +0.109375f,0.515625f, +0.117188f,0.515625f, +0.125f,0.515625f, +0.132813f,0.515625f, +0.140625f,0.515625f, +0.148438f,0.515625f, +0.15625f,0.515625f, +0.164063f,0.515625f, +0.171875f,0.515625f, +0.179688f,0.515625f, +0.1875f,0.515625f, +0.195313f,0.515625f, +0.203125f,0.515625f, +0.210938f,0.515625f, +0.21875f,0.515625f, +0.226563f,0.515625f, +0.234375f,0.515625f, +0.242188f,0.515625f, +0.25f,0.515625f, +0.257813f,0.515625f, +0.265625f,0.515625f, +0.273438f,0.515625f, +0.28125f,0.515625f, +0.289063f,0.515625f, +0.296875f,0.515625f, +0.304688f,0.515625f, +0.3125f,0.515625f, +0.320313f,0.515625f, +0.328125f,0.515625f, +0.335938f,0.515625f, +0.34375f,0.515625f, +0.351563f,0.515625f, +0.359375f,0.515625f, +0.367188f,0.515625f, +0.375f,0.515625f, +0.382813f,0.515625f, +0.390625f,0.515625f, +0.398438f,0.515625f, +0.40625f,0.515625f, +0.414063f,0.515625f, +0.421875f,0.515625f, +0.429688f,0.515625f, +0.4375f,0.515625f, +0.445313f,0.515625f, +0.453125f,0.515625f, +0.460938f,0.515625f, +0.46875f,0.515625f, +0.476563f,0.515625f, +0.484375f,0.515625f, +0.492188f,0.515625f, +0.5f,0.515625f, +0.507813f,0.515625f, +0.0f,0.523438f, +0.0078125f,0.523438f, +0.015625f,0.523438f, +0.0234375f,0.523438f, +0.03125f,0.523438f, +0.0390625f,0.523438f, +0.046875f,0.523438f, +0.0546875f,0.523438f, +0.0625f,0.523438f, +0.0703125f,0.523438f, +0.078125f,0.523438f, +0.0859375f,0.523438f, +0.09375f,0.523438f, +0.101563f,0.523438f, +0.109375f,0.523438f, +0.117188f,0.523438f, +0.125f,0.523438f, +0.132813f,0.523438f, +0.140625f,0.523438f, +0.148438f,0.523438f, +0.15625f,0.523438f, +0.164063f,0.523438f, +0.171875f,0.523438f, +0.179688f,0.523438f, +0.1875f,0.523438f, +0.195313f,0.523438f, +0.203125f,0.523438f, +0.210938f,0.523438f, +0.21875f,0.523438f, +0.226563f,0.523438f, +0.234375f,0.523438f, +0.242188f,0.523438f, +0.25f,0.523438f, +0.257813f,0.523438f, +0.265625f,0.523438f, +0.273438f,0.523438f, +0.28125f,0.523438f, +0.289063f,0.523438f, +0.296875f,0.523438f, +0.304688f,0.523438f, +0.3125f,0.523438f, +0.320313f,0.523438f, +0.328125f,0.523438f, +0.335938f,0.523438f, +0.34375f,0.523438f, +0.351563f,0.523438f, +0.359375f,0.523438f, +0.367188f,0.523438f, +0.375f,0.523438f, +0.382813f,0.523438f, +0.390625f,0.523438f, +0.398438f,0.523438f, +0.40625f,0.523438f, +0.414063f,0.523438f, +0.421875f,0.523438f, +0.429688f,0.523438f, +0.4375f,0.523438f, +0.445313f,0.523438f, +0.453125f,0.523438f, +0.460938f,0.523438f, +0.46875f,0.523438f, +0.476563f,0.523438f, +0.484375f,0.523438f, +0.492188f,0.523438f, +0.5f,0.523438f, +0.507813f,0.523438f, +0.0f,0.53125f, +0.0078125f,0.53125f, +0.015625f,0.53125f, +0.0234375f,0.53125f, +0.03125f,0.53125f, +0.0390625f,0.53125f, +0.046875f,0.53125f, +0.0546875f,0.53125f, +0.0625f,0.53125f, +0.0703125f,0.53125f, +0.078125f,0.53125f, +0.0859375f,0.53125f, +0.09375f,0.53125f, +0.101563f,0.53125f, +0.109375f,0.53125f, +0.117188f,0.53125f, +0.125f,0.53125f, +0.132813f,0.53125f, +0.140625f,0.53125f, +0.148438f,0.53125f, +0.15625f,0.53125f, +0.164063f,0.53125f, +0.171875f,0.53125f, +0.179688f,0.53125f, +0.1875f,0.53125f, +0.195313f,0.53125f, +0.203125f,0.53125f, +0.210938f,0.53125f, +0.21875f,0.53125f, +0.226563f,0.53125f, +0.234375f,0.53125f, +0.242188f,0.53125f, +0.25f,0.53125f, +0.257813f,0.53125f, +0.265625f,0.53125f, +0.273438f,0.53125f, +0.28125f,0.53125f, +0.289063f,0.53125f, +0.296875f,0.53125f, +0.304688f,0.53125f, +0.3125f,0.53125f, +0.320313f,0.53125f, +0.328125f,0.53125f, +0.335938f,0.53125f, +0.34375f,0.53125f, +0.351563f,0.53125f, +0.359375f,0.53125f, +0.367188f,0.53125f, +0.375f,0.53125f, +0.382813f,0.53125f, +0.390625f,0.53125f, +0.398438f,0.53125f, +0.40625f,0.53125f, +0.414063f,0.53125f, +0.421875f,0.53125f, +0.429688f,0.53125f, +0.4375f,0.53125f, +0.445313f,0.53125f, +0.453125f,0.53125f, +0.460938f,0.53125f, +0.46875f,0.53125f, +0.476563f,0.53125f, +0.484375f,0.53125f, +0.492188f,0.53125f, +0.5f,0.53125f, +0.507813f,0.53125f, +0.0f,0.539063f, +0.0078125f,0.539063f, +0.015625f,0.539063f, +0.0234375f,0.539063f, +0.03125f,0.539063f, +0.0390625f,0.539063f, +0.046875f,0.539063f, +0.0546875f,0.539063f, +0.0625f,0.539063f, +0.0703125f,0.539063f, +0.078125f,0.539063f, +0.0859375f,0.539063f, +0.09375f,0.539063f, +0.101563f,0.539063f, +0.109375f,0.539063f, +0.117188f,0.539063f, +0.125f,0.539063f, +0.132813f,0.539063f, +0.140625f,0.539063f, +0.148438f,0.539063f, +0.15625f,0.539063f, +0.164063f,0.539063f, +0.171875f,0.539063f, +0.179688f,0.539063f, +0.1875f,0.539063f, +0.195313f,0.539063f, +0.203125f,0.539063f, +0.210938f,0.539063f, +0.21875f,0.539063f, +0.226563f,0.539063f, +0.234375f,0.539063f, +0.242188f,0.539063f, +0.25f,0.539063f, +0.257813f,0.539063f, +0.265625f,0.539063f, +0.273438f,0.539063f, +0.28125f,0.539063f, +0.289063f,0.539063f, +0.296875f,0.539063f, +0.304688f,0.539063f, +0.3125f,0.539063f, +0.320313f,0.539063f, +0.328125f,0.539063f, +0.335938f,0.539063f, +0.34375f,0.539063f, +0.351563f,0.539063f, +0.359375f,0.539063f, +0.367188f,0.539063f, +0.375f,0.539063f, +0.382813f,0.539063f, +0.390625f,0.539063f, +0.398438f,0.539063f, +0.40625f,0.539063f, +0.414063f,0.539063f, +0.421875f,0.539063f, +0.429688f,0.539063f, +0.4375f,0.539063f, +0.445313f,0.539063f, +0.453125f,0.539063f, +0.460938f,0.539063f, +0.46875f,0.539063f, +0.476563f,0.539063f, +0.484375f,0.539063f, +0.492188f,0.539063f, +0.5f,0.539063f, +0.507813f,0.539063f, +0.0f,0.546875f, +0.0078125f,0.546875f, +0.015625f,0.546875f, +0.0234375f,0.546875f, +0.03125f,0.546875f, +0.0390625f,0.546875f, +0.046875f,0.546875f, +0.0546875f,0.546875f, +0.0625f,0.546875f, +0.0703125f,0.546875f, +0.078125f,0.546875f, +0.0859375f,0.546875f, +0.09375f,0.546875f, +0.101563f,0.546875f, +0.109375f,0.546875f, +0.117188f,0.546875f, +0.125f,0.546875f, +0.132813f,0.546875f, +0.140625f,0.546875f, +0.148438f,0.546875f, +0.15625f,0.546875f, +0.164063f,0.546875f, +0.171875f,0.546875f, +0.179688f,0.546875f, +0.1875f,0.546875f, +0.195313f,0.546875f, +0.203125f,0.546875f, +0.210938f,0.546875f, +0.21875f,0.546875f, +0.226563f,0.546875f, +0.234375f,0.546875f, +0.242188f,0.546875f, +0.25f,0.546875f, +0.257813f,0.546875f, +0.265625f,0.546875f, +0.273438f,0.546875f, +0.28125f,0.546875f, +0.289063f,0.546875f, +0.296875f,0.546875f, +0.304688f,0.546875f, +0.3125f,0.546875f, +0.320313f,0.546875f, +0.328125f,0.546875f, +0.335938f,0.546875f, +0.34375f,0.546875f, +0.351563f,0.546875f, +0.359375f,0.546875f, +0.367188f,0.546875f, +0.375f,0.546875f, +0.382813f,0.546875f, +0.390625f,0.546875f, +0.398438f,0.546875f, +0.40625f,0.546875f, +0.414063f,0.546875f, +0.421875f,0.546875f, +0.429688f,0.546875f, +0.4375f,0.546875f, +0.445313f,0.546875f, +0.453125f,0.546875f, +0.460938f,0.546875f, +0.46875f,0.546875f, +0.476563f,0.546875f, +0.484375f,0.546875f, +0.492188f,0.546875f, +0.5f,0.546875f, +0.507813f,0.546875f, +0.0f,0.554688f, +0.0078125f,0.554688f, +0.015625f,0.554688f, +0.0234375f,0.554688f, +0.03125f,0.554688f, +0.0390625f,0.554688f, +0.046875f,0.554688f, +0.0546875f,0.554688f, +0.0625f,0.554688f, +0.0703125f,0.554688f, +0.078125f,0.554688f, +0.0859375f,0.554688f, +0.09375f,0.554688f, +0.101563f,0.554688f, +0.109375f,0.554688f, +0.117188f,0.554688f, +0.125f,0.554688f, +0.132813f,0.554688f, +0.140625f,0.554688f, +0.148438f,0.554688f, +0.15625f,0.554688f, +0.164063f,0.554688f, +0.171875f,0.554688f, +0.179688f,0.554688f, +0.1875f,0.554688f, +0.195313f,0.554688f, +0.203125f,0.554688f, +0.210938f,0.554688f, +0.21875f,0.554688f, +0.226563f,0.554688f, +0.234375f,0.554688f, +0.242188f,0.554688f, +0.25f,0.554688f, +0.257813f,0.554688f, +0.265625f,0.554688f, +0.273438f,0.554688f, +0.28125f,0.554688f, +0.289063f,0.554688f, +0.296875f,0.554688f, +0.304688f,0.554688f, +0.3125f,0.554688f, +0.320313f,0.554688f, +0.328125f,0.554688f, +0.335938f,0.554688f, +0.34375f,0.554688f, +0.351563f,0.554688f, +0.359375f,0.554688f, +0.367188f,0.554688f, +0.375f,0.554688f, +0.382813f,0.554688f, +0.390625f,0.554688f, +0.398438f,0.554688f, +0.40625f,0.554688f, +0.414063f,0.554688f, +0.421875f,0.554688f, +0.429688f,0.554688f, +0.4375f,0.554688f, +0.445313f,0.554688f, +0.453125f,0.554688f, +0.460938f,0.554688f, +0.46875f,0.554688f, +0.476563f,0.554688f, +0.484375f,0.554688f, +0.492188f,0.554688f, +0.5f,0.554688f, +0.507813f,0.554688f, +0.0f,0.5625f, +0.0078125f,0.5625f, +0.015625f,0.5625f, +0.0234375f,0.5625f, +0.03125f,0.5625f, +0.0390625f,0.5625f, +0.046875f,0.5625f, +0.0546875f,0.5625f, +0.0625f,0.5625f, +0.0703125f,0.5625f, +0.078125f,0.5625f, +0.0859375f,0.5625f, +0.09375f,0.5625f, +0.101563f,0.5625f, +0.109375f,0.5625f, +0.117188f,0.5625f, +0.125f,0.5625f, +0.132813f,0.5625f, +0.140625f,0.5625f, +0.148438f,0.5625f, +0.15625f,0.5625f, +0.164063f,0.5625f, +0.171875f,0.5625f, +0.179688f,0.5625f, +0.1875f,0.5625f, +0.195313f,0.5625f, +0.203125f,0.5625f, +0.210938f,0.5625f, +0.21875f,0.5625f, +0.226563f,0.5625f, +0.234375f,0.5625f, +0.242188f,0.5625f, +0.25f,0.5625f, +0.257813f,0.5625f, +0.265625f,0.5625f, +0.273438f,0.5625f, +0.28125f,0.5625f, +0.289063f,0.5625f, +0.296875f,0.5625f, +0.304688f,0.5625f, +0.3125f,0.5625f, +0.320313f,0.5625f, +0.328125f,0.5625f, +0.335938f,0.5625f, +0.34375f,0.5625f, +0.351563f,0.5625f, +0.359375f,0.5625f, +0.367188f,0.5625f, +0.375f,0.5625f, +0.382813f,0.5625f, +0.390625f,0.5625f, +0.398438f,0.5625f, +0.40625f,0.5625f, +0.414063f,0.5625f, +0.421875f,0.5625f, +0.429688f,0.5625f, +0.4375f,0.5625f, +0.445313f,0.5625f, +0.453125f,0.5625f, +0.460938f,0.5625f, +0.46875f,0.5625f, +0.476563f,0.5625f, +0.484375f,0.5625f, +0.492188f,0.5625f, +0.5f,0.5625f, +0.507813f,0.5625f, +0.0f,0.570313f, +0.0078125f,0.570313f, +0.015625f,0.570313f, +0.0234375f,0.570313f, +0.03125f,0.570313f, +0.0390625f,0.570313f, +0.046875f,0.570313f, +0.0546875f,0.570313f, +0.0625f,0.570313f, +0.0703125f,0.570313f, +0.078125f,0.570313f, +0.0859375f,0.570313f, +0.09375f,0.570313f, +0.101563f,0.570313f, +0.109375f,0.570313f, +0.117188f,0.570313f, +0.125f,0.570313f, +0.132813f,0.570313f, +0.140625f,0.570313f, +0.148438f,0.570313f, +0.15625f,0.570313f, +0.164063f,0.570313f, +0.171875f,0.570313f, +0.179688f,0.570313f, +0.1875f,0.570313f, +0.195313f,0.570313f, +0.203125f,0.570313f, +0.210938f,0.570313f, +0.21875f,0.570313f, +0.226563f,0.570313f, +0.234375f,0.570313f, +0.242188f,0.570313f, +0.25f,0.570313f, +0.257813f,0.570313f, +0.265625f,0.570313f, +0.273438f,0.570313f, +0.28125f,0.570313f, +0.289063f,0.570313f, +0.296875f,0.570313f, +0.304688f,0.570313f, +0.3125f,0.570313f, +0.320313f,0.570313f, +0.328125f,0.570313f, +0.335938f,0.570313f, +0.34375f,0.570313f, +0.351563f,0.570313f, +0.359375f,0.570313f, +0.367188f,0.570313f, +0.375f,0.570313f, +0.382813f,0.570313f, +0.390625f,0.570313f, +0.398438f,0.570313f, +0.40625f,0.570313f, +0.414063f,0.570313f, +0.421875f,0.570313f, +0.429688f,0.570313f, +0.4375f,0.570313f, +0.445313f,0.570313f, +0.453125f,0.570313f, +0.460938f,0.570313f, +0.46875f,0.570313f, +0.476563f,0.570313f, +0.484375f,0.570313f, +0.492188f,0.570313f, +0.5f,0.570313f, +0.507813f,0.570313f, +0.0f,0.578125f, +0.0078125f,0.578125f, +0.015625f,0.578125f, +0.0234375f,0.578125f, +0.03125f,0.578125f, +0.0390625f,0.578125f, +0.046875f,0.578125f, +0.0546875f,0.578125f, +0.0625f,0.578125f, +0.0703125f,0.578125f, +0.078125f,0.578125f, +0.0859375f,0.578125f, +0.09375f,0.578125f, +0.101563f,0.578125f, +0.109375f,0.578125f, +0.117188f,0.578125f, +0.125f,0.578125f, +0.132813f,0.578125f, +0.140625f,0.578125f, +0.148438f,0.578125f, +0.15625f,0.578125f, +0.164063f,0.578125f, +0.171875f,0.578125f, +0.179688f,0.578125f, +0.1875f,0.578125f, +0.195313f,0.578125f, +0.203125f,0.578125f, +0.210938f,0.578125f, +0.21875f,0.578125f, +0.226563f,0.578125f, +0.234375f,0.578125f, +0.242188f,0.578125f, +0.25f,0.578125f, +0.257813f,0.578125f, +0.265625f,0.578125f, +0.273438f,0.578125f, +0.28125f,0.578125f, +0.289063f,0.578125f, +0.296875f,0.578125f, +0.304688f,0.578125f, +0.3125f,0.578125f, +0.320313f,0.578125f, +0.328125f,0.578125f, +0.335938f,0.578125f, +0.34375f,0.578125f, +0.351563f,0.578125f, +0.359375f,0.578125f, +0.367188f,0.578125f, +0.375f,0.578125f, +0.382813f,0.578125f, +0.390625f,0.578125f, +0.398438f,0.578125f, +0.40625f,0.578125f, +0.414063f,0.578125f, +0.421875f,0.578125f, +0.429688f,0.578125f, +0.4375f,0.578125f, +0.445313f,0.578125f, +0.453125f,0.578125f, +0.460938f,0.578125f, +0.46875f,0.578125f, +0.476563f,0.578125f, +0.484375f,0.578125f, +0.492188f,0.578125f, +0.5f,0.578125f, +0.507813f,0.578125f, +0.0f,0.585938f, +0.0078125f,0.585938f, +0.015625f,0.585938f, +0.0234375f,0.585938f, +0.03125f,0.585938f, +0.0390625f,0.585938f, +0.046875f,0.585938f, +0.0546875f,0.585938f, +0.0625f,0.585938f, +0.0703125f,0.585938f, +0.078125f,0.585938f, +0.0859375f,0.585938f, +0.09375f,0.585938f, +0.101563f,0.585938f, +0.109375f,0.585938f, +0.117188f,0.585938f, +0.125f,0.585938f, +0.132813f,0.585938f, +0.140625f,0.585938f, +0.148438f,0.585938f, +0.15625f,0.585938f, +0.164063f,0.585938f, +0.171875f,0.585938f, +0.179688f,0.585938f, +0.1875f,0.585938f, +0.195313f,0.585938f, +0.203125f,0.585938f, +0.210938f,0.585938f, +0.21875f,0.585938f, +0.226563f,0.585938f, +0.234375f,0.585938f, +0.242188f,0.585938f, +0.25f,0.585938f, +0.257813f,0.585938f, +0.265625f,0.585938f, +0.273438f,0.585938f, +0.28125f,0.585938f, +0.289063f,0.585938f, +0.296875f,0.585938f, +0.304688f,0.585938f, +0.3125f,0.585938f, +0.320313f,0.585938f, +0.328125f,0.585938f, +0.335938f,0.585938f, +0.34375f,0.585938f, +0.351563f,0.585938f, +0.359375f,0.585938f, +0.367188f,0.585938f, +0.375f,0.585938f, +0.382813f,0.585938f, +0.390625f,0.585938f, +0.398438f,0.585938f, +0.40625f,0.585938f, +0.414063f,0.585938f, +0.421875f,0.585938f, +0.429688f,0.585938f, +0.4375f,0.585938f, +0.445313f,0.585938f, +0.453125f,0.585938f, +0.460938f,0.585938f, +0.46875f,0.585938f, +0.476563f,0.585938f, +0.484375f,0.585938f, +0.492188f,0.585938f, +0.5f,0.585938f, +0.507813f,0.585938f, +0.0f,0.59375f, +0.0078125f,0.59375f, +0.015625f,0.59375f, +0.0234375f,0.59375f, +0.03125f,0.59375f, +0.0390625f,0.59375f, +0.046875f,0.59375f, +0.0546875f,0.59375f, +0.0625f,0.59375f, +0.0703125f,0.59375f, +0.078125f,0.59375f, +0.0859375f,0.59375f, +0.09375f,0.59375f, +0.101563f,0.59375f, +0.109375f,0.59375f, +0.117188f,0.59375f, +0.125f,0.59375f, +0.132813f,0.59375f, +0.140625f,0.59375f, +0.148438f,0.59375f, +0.15625f,0.59375f, +0.164063f,0.59375f, +0.171875f,0.59375f, +0.179688f,0.59375f, +0.1875f,0.59375f, +0.195313f,0.59375f, +0.203125f,0.59375f, +0.210938f,0.59375f, +0.21875f,0.59375f, +0.226563f,0.59375f, +0.234375f,0.59375f, +0.242188f,0.59375f, +0.25f,0.59375f, +0.257813f,0.59375f, +0.265625f,0.59375f, +0.273438f,0.59375f, +0.28125f,0.59375f, +0.289063f,0.59375f, +0.296875f,0.59375f, +0.304688f,0.59375f, +0.3125f,0.59375f, +0.320313f,0.59375f, +0.328125f,0.59375f, +0.335938f,0.59375f, +0.34375f,0.59375f, +0.351563f,0.59375f, +0.359375f,0.59375f, +0.367188f,0.59375f, +0.375f,0.59375f, +0.382813f,0.59375f, +0.390625f,0.59375f, +0.398438f,0.59375f, +0.40625f,0.59375f, +0.414063f,0.59375f, +0.421875f,0.59375f, +0.429688f,0.59375f, +0.4375f,0.59375f, +0.445313f,0.59375f, +0.453125f,0.59375f, +0.460938f,0.59375f, +0.46875f,0.59375f, +0.476563f,0.59375f, +0.484375f,0.59375f, +0.492188f,0.59375f, +0.5f,0.59375f, +0.507813f,0.59375f, +0.0f,0.601563f, +0.0078125f,0.601563f, +0.015625f,0.601563f, +0.0234375f,0.601563f, +0.03125f,0.601563f, +0.0390625f,0.601563f, +0.046875f,0.601563f, +0.0546875f,0.601563f, +0.0625f,0.601563f, +0.0703125f,0.601563f, +0.078125f,0.601563f, +0.0859375f,0.601563f, +0.09375f,0.601563f, +0.101563f,0.601563f, +0.109375f,0.601563f, +0.117188f,0.601563f, +0.125f,0.601563f, +0.132813f,0.601563f, +0.140625f,0.601563f, +0.148438f,0.601563f, +0.15625f,0.601563f, +0.164063f,0.601563f, +0.171875f,0.601563f, +0.179688f,0.601563f, +0.1875f,0.601563f, +0.195313f,0.601563f, +0.203125f,0.601563f, +0.210938f,0.601563f, +0.21875f,0.601563f, +0.226563f,0.601563f, +0.234375f,0.601563f, +0.242188f,0.601563f, +0.25f,0.601563f, +0.257813f,0.601563f, +0.265625f,0.601563f, +0.273438f,0.601563f, +0.28125f,0.601563f, +0.289063f,0.601563f, +0.296875f,0.601563f, +0.304688f,0.601563f, +0.3125f,0.601563f, +0.320313f,0.601563f, +0.328125f,0.601563f, +0.335938f,0.601563f, +0.34375f,0.601563f, +0.351563f,0.601563f, +0.359375f,0.601563f, +0.367188f,0.601563f, +0.375f,0.601563f, +0.382813f,0.601563f, +0.390625f,0.601563f, +0.398438f,0.601563f, +0.40625f,0.601563f, +0.414063f,0.601563f, +0.421875f,0.601563f, +0.429688f,0.601563f, +0.4375f,0.601563f, +0.445313f,0.601563f, +0.453125f,0.601563f, +0.460938f,0.601563f, +0.46875f,0.601563f, +0.476563f,0.601563f, +0.484375f,0.601563f, +0.492188f,0.601563f, +0.5f,0.601563f, +0.507813f,0.601563f, +0.0f,0.609375f, +0.0078125f,0.609375f, +0.015625f,0.609375f, +0.0234375f,0.609375f, +0.03125f,0.609375f, +0.0390625f,0.609375f, +0.046875f,0.609375f, +0.0546875f,0.609375f, +0.0625f,0.609375f, +0.0703125f,0.609375f, +0.078125f,0.609375f, +0.0859375f,0.609375f, +0.09375f,0.609375f, +0.101563f,0.609375f, +0.109375f,0.609375f, +0.117188f,0.609375f, +0.125f,0.609375f, +0.132813f,0.609375f, +0.140625f,0.609375f, +0.148438f,0.609375f, +0.15625f,0.609375f, +0.164063f,0.609375f, +0.171875f,0.609375f, +0.179688f,0.609375f, +0.1875f,0.609375f, +0.195313f,0.609375f, +0.203125f,0.609375f, +0.210938f,0.609375f, +0.21875f,0.609375f, +0.226563f,0.609375f, +0.234375f,0.609375f, +0.242188f,0.609375f, +0.25f,0.609375f, +0.257813f,0.609375f, +0.265625f,0.609375f, +0.273438f,0.609375f, +0.28125f,0.609375f, +0.289063f,0.609375f, +0.296875f,0.609375f, +0.304688f,0.609375f, +0.3125f,0.609375f, +0.320313f,0.609375f, +0.328125f,0.609375f, +0.335938f,0.609375f, +0.34375f,0.609375f, +0.351563f,0.609375f, +0.359375f,0.609375f, +0.367188f,0.609375f, +0.375f,0.609375f, +0.382813f,0.609375f, +0.390625f,0.609375f, +0.398438f,0.609375f, +0.40625f,0.609375f, +0.414063f,0.609375f, +0.421875f,0.609375f, +0.429688f,0.609375f, +0.4375f,0.609375f, +0.445313f,0.609375f, +0.453125f,0.609375f, +0.460938f,0.609375f, +0.46875f,0.609375f, +0.476563f,0.609375f, +0.484375f,0.609375f, +0.492188f,0.609375f, +0.5f,0.609375f, +0.507813f,0.609375f, +0.0f,0.617188f, +0.0078125f,0.617188f, +0.015625f,0.617188f, +0.0234375f,0.617188f, +0.03125f,0.617188f, +0.0390625f,0.617188f, +0.046875f,0.617188f, +0.0546875f,0.617188f, +0.0625f,0.617188f, +0.0703125f,0.617188f, +0.078125f,0.617188f, +0.0859375f,0.617188f, +0.09375f,0.617188f, +0.101563f,0.617188f, +0.109375f,0.617188f, +0.117188f,0.617188f, +0.125f,0.617188f, +0.132813f,0.617188f, +0.140625f,0.617188f, +0.148438f,0.617188f, +0.15625f,0.617188f, +0.164063f,0.617188f, +0.171875f,0.617188f, +0.179688f,0.617188f, +0.1875f,0.617188f, +0.195313f,0.617188f, +0.203125f,0.617188f, +0.210938f,0.617188f, +0.21875f,0.617188f, +0.226563f,0.617188f, +0.234375f,0.617188f, +0.242188f,0.617188f, +0.25f,0.617188f, +0.257813f,0.617188f, +0.265625f,0.617188f, +0.273438f,0.617188f, +0.28125f,0.617188f, +0.289063f,0.617188f, +0.296875f,0.617188f, +0.304688f,0.617188f, +0.3125f,0.617188f, +0.320313f,0.617188f, +0.328125f,0.617188f, +0.335938f,0.617188f, +0.34375f,0.617188f, +0.351563f,0.617188f, +0.359375f,0.617188f, +0.367188f,0.617188f, +0.375f,0.617188f, +0.382813f,0.617188f, +0.390625f,0.617188f, +0.398438f,0.617188f, +0.40625f,0.617188f, +0.414063f,0.617188f, +0.421875f,0.617188f, +0.429688f,0.617188f, +0.4375f,0.617188f, +0.445313f,0.617188f, +0.453125f,0.617188f, +0.460938f,0.617188f, +0.46875f,0.617188f, +0.476563f,0.617188f, +0.484375f,0.617188f, +0.492188f,0.617188f, +0.5f,0.617188f, +0.507813f,0.617188f, +0.0f,0.625f, +0.0078125f,0.625f, +0.015625f,0.625f, +0.0234375f,0.625f, +0.03125f,0.625f, +0.0390625f,0.625f, +0.046875f,0.625f, +0.0546875f,0.625f, +0.0625f,0.625f, +0.0703125f,0.625f, +0.078125f,0.625f, +0.0859375f,0.625f, +0.09375f,0.625f, +0.101563f,0.625f, +0.109375f,0.625f, +0.117188f,0.625f, +0.125f,0.625f, +0.132813f,0.625f, +0.140625f,0.625f, +0.148438f,0.625f, +0.15625f,0.625f, +0.164063f,0.625f, +0.171875f,0.625f, +0.179688f,0.625f, +0.1875f,0.625f, +0.195313f,0.625f, +0.203125f,0.625f, +0.210938f,0.625f, +0.21875f,0.625f, +0.226563f,0.625f, +0.234375f,0.625f, +0.242188f,0.625f, +0.25f,0.625f, +0.257813f,0.625f, +0.265625f,0.625f, +0.273438f,0.625f, +0.28125f,0.625f, +0.289063f,0.625f, +0.296875f,0.625f, +0.304688f,0.625f, +0.3125f,0.625f, +0.320313f,0.625f, +0.328125f,0.625f, +0.335938f,0.625f, +0.34375f,0.625f, +0.351563f,0.625f, +0.359375f,0.625f, +0.367188f,0.625f, +0.375f,0.625f, +0.382813f,0.625f, +0.390625f,0.625f, +0.398438f,0.625f, +0.40625f,0.625f, +0.414063f,0.625f, +0.421875f,0.625f, +0.429688f,0.625f, +0.4375f,0.625f, +0.445313f,0.625f, +0.453125f,0.625f, +0.460938f,0.625f, +0.46875f,0.625f, +0.476563f,0.625f, +0.484375f,0.625f, +0.492188f,0.625f, +0.5f,0.625f, +0.507813f,0.625f, +0.0f,0.632813f, +0.0078125f,0.632813f, +0.015625f,0.632813f, +0.0234375f,0.632813f, +0.03125f,0.632813f, +0.0390625f,0.632813f, +0.046875f,0.632813f, +0.0546875f,0.632813f, +0.0625f,0.632813f, +0.0703125f,0.632813f, +0.078125f,0.632813f, +0.0859375f,0.632813f, +0.09375f,0.632813f, +0.101563f,0.632813f, +0.109375f,0.632813f, +0.117188f,0.632813f, +0.125f,0.632813f, +0.132813f,0.632813f, +0.140625f,0.632813f, +0.148438f,0.632813f, +0.15625f,0.632813f, +0.164063f,0.632813f, +0.171875f,0.632813f, +0.179688f,0.632813f, +0.1875f,0.632813f, +0.195313f,0.632813f, +0.203125f,0.632813f, +0.210938f,0.632813f, +0.21875f,0.632813f, +0.226563f,0.632813f, +0.234375f,0.632813f, +0.242188f,0.632813f, +0.25f,0.632813f, +0.257813f,0.632813f, +0.265625f,0.632813f, +0.273438f,0.632813f, +0.28125f,0.632813f, +0.289063f,0.632813f, +0.296875f,0.632813f, +0.304688f,0.632813f, +0.3125f,0.632813f, +0.320313f,0.632813f, +0.328125f,0.632813f, +0.335938f,0.632813f, +0.34375f,0.632813f, +0.351563f,0.632813f, +0.359375f,0.632813f, +0.367188f,0.632813f, +0.375f,0.632813f, +0.382813f,0.632813f, +0.390625f,0.632813f, +0.398438f,0.632813f, +0.40625f,0.632813f, +0.414063f,0.632813f, +0.421875f,0.632813f, +0.429688f,0.632813f, +0.4375f,0.632813f, +0.445313f,0.632813f, +0.453125f,0.632813f, +0.460938f,0.632813f, +0.46875f,0.632813f, +0.476563f,0.632813f, +0.484375f,0.632813f, +0.492188f,0.632813f, +0.5f,0.632813f, +0.507813f,0.632813f, +0.0f,0.640625f, +0.0078125f,0.640625f, +0.015625f,0.640625f, +0.0234375f,0.640625f, +0.03125f,0.640625f, +0.0390625f,0.640625f, +0.046875f,0.640625f, +0.0546875f,0.640625f, +0.0625f,0.640625f, +0.0703125f,0.640625f, +0.078125f,0.640625f, +0.0859375f,0.640625f, +0.09375f,0.640625f, +0.101563f,0.640625f, +0.109375f,0.640625f, +0.117188f,0.640625f, +0.125f,0.640625f, +0.132813f,0.640625f, +0.140625f,0.640625f, +0.148438f,0.640625f, +0.15625f,0.640625f, +0.164063f,0.640625f, +0.171875f,0.640625f, +0.179688f,0.640625f, +0.1875f,0.640625f, +0.195313f,0.640625f, +0.203125f,0.640625f, +0.210938f,0.640625f, +0.21875f,0.640625f, +0.226563f,0.640625f, +0.234375f,0.640625f, +0.242188f,0.640625f, +0.25f,0.640625f, +0.257813f,0.640625f, +0.265625f,0.640625f, +0.273438f,0.640625f, +0.28125f,0.640625f, +0.289063f,0.640625f, +0.296875f,0.640625f, +0.304688f,0.640625f, +0.3125f,0.640625f, +0.320313f,0.640625f, +0.328125f,0.640625f, +0.335938f,0.640625f, +0.34375f,0.640625f, +0.351563f,0.640625f, +0.359375f,0.640625f, +0.367188f,0.640625f, +0.375f,0.640625f, +0.382813f,0.640625f, +0.390625f,0.640625f, +0.398438f,0.640625f, +0.40625f,0.640625f, +0.414063f,0.640625f, +0.421875f,0.640625f, +0.429688f,0.640625f, +0.4375f,0.640625f, +0.445313f,0.640625f, +0.453125f,0.640625f, +0.460938f,0.640625f, +0.46875f,0.640625f, +0.476563f,0.640625f, +0.484375f,0.640625f, +0.492188f,0.640625f, +0.5f,0.640625f, +0.507813f,0.640625f, +0.0f,0.648438f, +0.0078125f,0.648438f, +0.015625f,0.648438f, +0.0234375f,0.648438f, +0.03125f,0.648438f, +0.0390625f,0.648438f, +0.046875f,0.648438f, +0.0546875f,0.648438f, +0.0625f,0.648438f, +0.0703125f,0.648438f, +0.078125f,0.648438f, +0.0859375f,0.648438f, +0.09375f,0.648438f, +0.101563f,0.648438f, +0.109375f,0.648438f, +0.117188f,0.648438f, +0.125f,0.648438f, +0.132813f,0.648438f, +0.140625f,0.648438f, +0.148438f,0.648438f, +0.15625f,0.648438f, +0.164063f,0.648438f, +0.171875f,0.648438f, +0.179688f,0.648438f, +0.1875f,0.648438f, +0.195313f,0.648438f, +0.203125f,0.648438f, +0.210938f,0.648438f, +0.21875f,0.648438f, +0.226563f,0.648438f, +0.234375f,0.648438f, +0.242188f,0.648438f, +0.25f,0.648438f, +0.257813f,0.648438f, +0.265625f,0.648438f, +0.273438f,0.648438f, +0.28125f,0.648438f, +0.289063f,0.648438f, +0.296875f,0.648438f, +0.304688f,0.648438f, +0.3125f,0.648438f, +0.320313f,0.648438f, +0.328125f,0.648438f, +0.335938f,0.648438f, +0.34375f,0.648438f, +0.351563f,0.648438f, +0.359375f,0.648438f, +0.367188f,0.648438f, +0.375f,0.648438f, +0.382813f,0.648438f, +0.390625f,0.648438f, +0.398438f,0.648438f, +0.40625f,0.648438f, +0.414063f,0.648438f, +0.421875f,0.648438f, +0.429688f,0.648438f, +0.4375f,0.648438f, +0.445313f,0.648438f, +0.453125f,0.648438f, +0.460938f,0.648438f, +0.46875f,0.648438f, +0.476563f,0.648438f, +0.484375f,0.648438f, +0.492188f,0.648438f, +0.5f,0.648438f, +0.507813f,0.648438f, +0.0f,0.65625f, +0.0078125f,0.65625f, +0.015625f,0.65625f, +0.0234375f,0.65625f, +0.03125f,0.65625f, +0.0390625f,0.65625f, +0.046875f,0.65625f, +0.0546875f,0.65625f, +0.0625f,0.65625f, +0.0703125f,0.65625f, +0.078125f,0.65625f, +0.0859375f,0.65625f, +0.09375f,0.65625f, +0.101563f,0.65625f, +0.109375f,0.65625f, +0.117188f,0.65625f, +0.125f,0.65625f, +0.132813f,0.65625f, +0.140625f,0.65625f, +0.148438f,0.65625f, +0.15625f,0.65625f, +0.164063f,0.65625f, +0.171875f,0.65625f, +0.179688f,0.65625f, +0.1875f,0.65625f, +0.195313f,0.65625f, +0.203125f,0.65625f, +0.210938f,0.65625f, +0.21875f,0.65625f, +0.226563f,0.65625f, +0.234375f,0.65625f, +0.242188f,0.65625f, +0.25f,0.65625f, +0.257813f,0.65625f, +0.265625f,0.65625f, +0.273438f,0.65625f, +0.28125f,0.65625f, +0.289063f,0.65625f, +0.296875f,0.65625f, +0.304688f,0.65625f, +0.3125f,0.65625f, +0.320313f,0.65625f, +0.328125f,0.65625f, +0.335938f,0.65625f, +0.34375f,0.65625f, +0.351563f,0.65625f, +0.359375f,0.65625f, +0.367188f,0.65625f, +0.375f,0.65625f, +0.382813f,0.65625f, +0.390625f,0.65625f, +0.398438f,0.65625f, +0.40625f,0.65625f, +0.414063f,0.65625f, +0.421875f,0.65625f, +0.429688f,0.65625f, +0.4375f,0.65625f, +0.445313f,0.65625f, +0.453125f,0.65625f, +0.460938f,0.65625f, +0.46875f,0.65625f, +0.476563f,0.65625f, +0.484375f,0.65625f, +0.492188f,0.65625f, +0.5f,0.65625f, +0.507813f,0.65625f, +0.0f,0.664063f, +0.0078125f,0.664063f, +0.015625f,0.664063f, +0.0234375f,0.664063f, +0.03125f,0.664063f, +0.0390625f,0.664063f, +0.046875f,0.664063f, +0.0546875f,0.664063f, +0.0625f,0.664063f, +0.0703125f,0.664063f, +0.078125f,0.664063f, +0.0859375f,0.664063f, +0.09375f,0.664063f, +0.101563f,0.664063f, +0.109375f,0.664063f, +0.117188f,0.664063f, +0.125f,0.664063f, +0.132813f,0.664063f, +0.140625f,0.664063f, +0.148438f,0.664063f, +0.15625f,0.664063f, +0.164063f,0.664063f, +0.171875f,0.664063f, +0.179688f,0.664063f, +0.1875f,0.664063f, +0.195313f,0.664063f, +0.203125f,0.664063f, +0.210938f,0.664063f, +0.21875f,0.664063f, +0.226563f,0.664063f, +0.234375f,0.664063f, +0.242188f,0.664063f, +0.25f,0.664063f, +0.257813f,0.664063f, +0.265625f,0.664063f, +0.273438f,0.664063f, +0.28125f,0.664063f, +0.289063f,0.664063f, +0.296875f,0.664063f, +0.304688f,0.664063f, +0.3125f,0.664063f, +0.320313f,0.664063f, +0.328125f,0.664063f, +0.335938f,0.664063f, +0.34375f,0.664063f, +0.351563f,0.664063f, +0.359375f,0.664063f, +0.367188f,0.664063f, +0.375f,0.664063f, +0.382813f,0.664063f, +0.390625f,0.664063f, +0.398438f,0.664063f, +0.40625f,0.664063f, +0.414063f,0.664063f, +0.421875f,0.664063f, +0.429688f,0.664063f, +0.4375f,0.664063f, +0.445313f,0.664063f, +0.453125f,0.664063f, +0.460938f,0.664063f, +0.46875f,0.664063f, +0.476563f,0.664063f, +0.484375f,0.664063f, +0.492188f,0.664063f, +0.5f,0.664063f, +0.507813f,0.664063f, +0.0f,0.671875f, +0.0078125f,0.671875f, +0.015625f,0.671875f, +0.0234375f,0.671875f, +0.03125f,0.671875f, +0.0390625f,0.671875f, +0.046875f,0.671875f, +0.0546875f,0.671875f, +0.0625f,0.671875f, +0.0703125f,0.671875f, +0.078125f,0.671875f, +0.0859375f,0.671875f, +0.09375f,0.671875f, +0.101563f,0.671875f, +0.109375f,0.671875f, +0.117188f,0.671875f, +0.125f,0.671875f, +0.132813f,0.671875f, +0.140625f,0.671875f, +0.148438f,0.671875f, +0.15625f,0.671875f, +0.164063f,0.671875f, +0.171875f,0.671875f, +0.179688f,0.671875f, +0.1875f,0.671875f, +0.195313f,0.671875f, +0.203125f,0.671875f, +0.210938f,0.671875f, +0.21875f,0.671875f, +0.226563f,0.671875f, +0.234375f,0.671875f, +0.242188f,0.671875f, +0.25f,0.671875f, +0.257813f,0.671875f, +0.265625f,0.671875f, +0.273438f,0.671875f, +0.28125f,0.671875f, +0.289063f,0.671875f, +0.296875f,0.671875f, +0.304688f,0.671875f, +0.3125f,0.671875f, +0.320313f,0.671875f, +0.328125f,0.671875f, +0.335938f,0.671875f, +0.34375f,0.671875f, +0.351563f,0.671875f, +0.359375f,0.671875f, +0.367188f,0.671875f, +0.375f,0.671875f, +0.382813f,0.671875f, +0.390625f,0.671875f, +0.398438f,0.671875f, +0.40625f,0.671875f, +0.414063f,0.671875f, +0.421875f,0.671875f, +0.429688f,0.671875f, +0.4375f,0.671875f, +0.445313f,0.671875f, +0.453125f,0.671875f, +0.460938f,0.671875f, +0.46875f,0.671875f, +0.476563f,0.671875f, +0.484375f,0.671875f, +0.492188f,0.671875f, +0.5f,0.671875f, +0.507813f,0.671875f, +0.0f,0.679688f, +0.0078125f,0.679688f, +0.015625f,0.679688f, +0.0234375f,0.679688f, +0.03125f,0.679688f, +0.0390625f,0.679688f, +0.046875f,0.679688f, +0.0546875f,0.679688f, +0.0625f,0.679688f, +0.0703125f,0.679688f, +0.078125f,0.679688f, +0.0859375f,0.679688f, +0.09375f,0.679688f, +0.101563f,0.679688f, +0.109375f,0.679688f, +0.117188f,0.679688f, +0.125f,0.679688f, +0.132813f,0.679688f, +0.140625f,0.679688f, +0.148438f,0.679688f, +0.15625f,0.679688f, +0.164063f,0.679688f, +0.171875f,0.679688f, +0.179688f,0.679688f, +0.1875f,0.679688f, +0.195313f,0.679688f, +0.203125f,0.679688f, +0.210938f,0.679688f, +0.21875f,0.679688f, +0.226563f,0.679688f, +0.234375f,0.679688f, +0.242188f,0.679688f, +0.25f,0.679688f, +0.257813f,0.679688f, +0.265625f,0.679688f, +0.273438f,0.679688f, +0.28125f,0.679688f, +0.289063f,0.679688f, +0.296875f,0.679688f, +0.304688f,0.679688f, +0.3125f,0.679688f, +0.320313f,0.679688f, +0.328125f,0.679688f, +0.335938f,0.679688f, +0.34375f,0.679688f, +0.351563f,0.679688f, +0.359375f,0.679688f, +0.367188f,0.679688f, +0.375f,0.679688f, +0.382813f,0.679688f, +0.390625f,0.679688f, +0.398438f,0.679688f, +0.40625f,0.679688f, +0.414063f,0.679688f, +0.421875f,0.679688f, +0.429688f,0.679688f, +0.4375f,0.679688f, +0.445313f,0.679688f, +0.453125f,0.679688f, +0.460938f,0.679688f, +0.46875f,0.679688f, +0.476563f,0.679688f, +0.484375f,0.679688f, +0.492188f,0.679688f, +0.5f,0.679688f, +0.507813f,0.679688f, +0.0f,0.6875f, +0.0078125f,0.6875f, +0.015625f,0.6875f, +0.0234375f,0.6875f, +0.03125f,0.6875f, +0.0390625f,0.6875f, +0.046875f,0.6875f, +0.0546875f,0.6875f, +0.0625f,0.6875f, +0.0703125f,0.6875f, +0.078125f,0.6875f, +0.0859375f,0.6875f, +0.09375f,0.6875f, +0.101563f,0.6875f, +0.109375f,0.6875f, +0.117188f,0.6875f, +0.125f,0.6875f, +0.132813f,0.6875f, +0.140625f,0.6875f, +0.148438f,0.6875f, +0.15625f,0.6875f, +0.164063f,0.6875f, +0.171875f,0.6875f, +0.179688f,0.6875f, +0.1875f,0.6875f, +0.195313f,0.6875f, +0.203125f,0.6875f, +0.210938f,0.6875f, +0.21875f,0.6875f, +0.226563f,0.6875f, +0.234375f,0.6875f, +0.242188f,0.6875f, +0.25f,0.6875f, +0.257813f,0.6875f, +0.265625f,0.6875f, +0.273438f,0.6875f, +0.28125f,0.6875f, +0.289063f,0.6875f, +0.296875f,0.6875f, +0.304688f,0.6875f, +0.3125f,0.6875f, +0.320313f,0.6875f, +0.328125f,0.6875f, +0.335938f,0.6875f, +0.34375f,0.6875f, +0.351563f,0.6875f, +0.359375f,0.6875f, +0.367188f,0.6875f, +0.375f,0.6875f, +0.382813f,0.6875f, +0.390625f,0.6875f, +0.398438f,0.6875f, +0.40625f,0.6875f, +0.414063f,0.6875f, +0.421875f,0.6875f, +0.429688f,0.6875f, +0.4375f,0.6875f, +0.445313f,0.6875f, +0.453125f,0.6875f, +0.460938f,0.6875f, +0.46875f,0.6875f, +0.476563f,0.6875f, +0.484375f,0.6875f, +0.492188f,0.6875f, +0.5f,0.6875f, +0.507813f,0.6875f, +0.0f,0.695313f, +0.0078125f,0.695313f, +0.015625f,0.695313f, +0.0234375f,0.695313f, +0.03125f,0.695313f, +0.0390625f,0.695313f, +0.046875f,0.695313f, +0.0546875f,0.695313f, +0.0625f,0.695313f, +0.0703125f,0.695313f, +0.078125f,0.695313f, +0.0859375f,0.695313f, +0.09375f,0.695313f, +0.101563f,0.695313f, +0.109375f,0.695313f, +0.117188f,0.695313f, +0.125f,0.695313f, +0.132813f,0.695313f, +0.140625f,0.695313f, +0.148438f,0.695313f, +0.15625f,0.695313f, +0.164063f,0.695313f, +0.171875f,0.695313f, +0.179688f,0.695313f, +0.1875f,0.695313f, +0.195313f,0.695313f, +0.203125f,0.695313f, +0.210938f,0.695313f, +0.21875f,0.695313f, +0.226563f,0.695313f, +0.234375f,0.695313f, +0.242188f,0.695313f, +0.25f,0.695313f, +0.257813f,0.695313f, +0.265625f,0.695313f, +0.273438f,0.695313f, +0.28125f,0.695313f, +0.289063f,0.695313f, +0.296875f,0.695313f, +0.304688f,0.695313f, +0.3125f,0.695313f, +0.320313f,0.695313f, +0.328125f,0.695313f, +0.335938f,0.695313f, +0.34375f,0.695313f, +0.351563f,0.695313f, +0.359375f,0.695313f, +0.367188f,0.695313f, +0.375f,0.695313f, +0.382813f,0.695313f, +0.390625f,0.695313f, +0.398438f,0.695313f, +0.40625f,0.695313f, +0.414063f,0.695313f, +0.421875f,0.695313f, +0.429688f,0.695313f, +0.4375f,0.695313f, +0.445313f,0.695313f, +0.453125f,0.695313f, +0.460938f,0.695313f, +0.46875f,0.695313f, +0.476563f,0.695313f, +0.484375f,0.695313f, +0.492188f,0.695313f, +0.5f,0.695313f, +0.507813f,0.695313f, +0.0f,0.703125f, +0.0078125f,0.703125f, +0.015625f,0.703125f, +0.0234375f,0.703125f, +0.03125f,0.703125f, +0.0390625f,0.703125f, +0.046875f,0.703125f, +0.0546875f,0.703125f, +0.0625f,0.703125f, +0.0703125f,0.703125f, +0.078125f,0.703125f, +0.0859375f,0.703125f, +0.09375f,0.703125f, +0.101563f,0.703125f, +0.109375f,0.703125f, +0.117188f,0.703125f, +0.125f,0.703125f, +0.132813f,0.703125f, +0.140625f,0.703125f, +0.148438f,0.703125f, +0.15625f,0.703125f, +0.164063f,0.703125f, +0.171875f,0.703125f, +0.179688f,0.703125f, +0.1875f,0.703125f, +0.195313f,0.703125f, +0.203125f,0.703125f, +0.210938f,0.703125f, +0.21875f,0.703125f, +0.226563f,0.703125f, +0.234375f,0.703125f, +0.242188f,0.703125f, +0.25f,0.703125f, +0.257813f,0.703125f, +0.265625f,0.703125f, +0.273438f,0.703125f, +0.28125f,0.703125f, +0.289063f,0.703125f, +0.296875f,0.703125f, +0.304688f,0.703125f, +0.3125f,0.703125f, +0.320313f,0.703125f, +0.328125f,0.703125f, +0.335938f,0.703125f, +0.34375f,0.703125f, +0.351563f,0.703125f, +0.359375f,0.703125f, +0.367188f,0.703125f, +0.375f,0.703125f, +0.382813f,0.703125f, +0.390625f,0.703125f, +0.398438f,0.703125f, +0.40625f,0.703125f, +0.414063f,0.703125f, +0.421875f,0.703125f, +0.429688f,0.703125f, +0.4375f,0.703125f, +0.445313f,0.703125f, +0.453125f,0.703125f, +0.460938f,0.703125f, +0.46875f,0.703125f, +0.476563f,0.703125f, +0.484375f,0.703125f, +0.492188f,0.703125f, +0.5f,0.703125f, +0.507813f,0.703125f, +0.0f,0.710938f, +0.0078125f,0.710938f, +0.015625f,0.710938f, +0.0234375f,0.710938f, +0.03125f,0.710938f, +0.0390625f,0.710938f, +0.046875f,0.710938f, +0.0546875f,0.710938f, +0.0625f,0.710938f, +0.0703125f,0.710938f, +0.078125f,0.710938f, +0.0859375f,0.710938f, +0.09375f,0.710938f, +0.101563f,0.710938f, +0.109375f,0.710938f, +0.117188f,0.710938f, +0.125f,0.710938f, +0.132813f,0.710938f, +0.140625f,0.710938f, +0.148438f,0.710938f, +0.15625f,0.710938f, +0.164063f,0.710938f, +0.171875f,0.710938f, +0.179688f,0.710938f, +0.1875f,0.710938f, +0.195313f,0.710938f, +0.203125f,0.710938f, +0.210938f,0.710938f, +0.21875f,0.710938f, +0.226563f,0.710938f, +0.234375f,0.710938f, +0.242188f,0.710938f, +0.25f,0.710938f, +0.257813f,0.710938f, +0.265625f,0.710938f, +0.273438f,0.710938f, +0.28125f,0.710938f, +0.289063f,0.710938f, +0.296875f,0.710938f, +0.304688f,0.710938f, +0.3125f,0.710938f, +0.320313f,0.710938f, +0.328125f,0.710938f, +0.335938f,0.710938f, +0.34375f,0.710938f, +0.351563f,0.710938f, +0.359375f,0.710938f, +0.367188f,0.710938f, +0.375f,0.710938f, +0.382813f,0.710938f, +0.390625f,0.710938f, +0.398438f,0.710938f, +0.40625f,0.710938f, +0.414063f,0.710938f, +0.421875f,0.710938f, +0.429688f,0.710938f, +0.4375f,0.710938f, +0.445313f,0.710938f, +0.453125f,0.710938f, +0.460938f,0.710938f, +0.46875f,0.710938f, +0.476563f,0.710938f, +0.484375f,0.710938f, +0.492188f,0.710938f, +0.5f,0.710938f, +0.507813f,0.710938f, +0.0f,0.71875f, +0.0078125f,0.71875f, +0.015625f,0.71875f, +0.0234375f,0.71875f, +0.03125f,0.71875f, +0.0390625f,0.71875f, +0.046875f,0.71875f, +0.0546875f,0.71875f, +0.0625f,0.71875f, +0.0703125f,0.71875f, +0.078125f,0.71875f, +0.0859375f,0.71875f, +0.09375f,0.71875f, +0.101563f,0.71875f, +0.109375f,0.71875f, +0.117188f,0.71875f, +0.125f,0.71875f, +0.132813f,0.71875f, +0.140625f,0.71875f, +0.148438f,0.71875f, +0.15625f,0.71875f, +0.164063f,0.71875f, +0.171875f,0.71875f, +0.179688f,0.71875f, +0.1875f,0.71875f, +0.195313f,0.71875f, +0.203125f,0.71875f, +0.210938f,0.71875f, +0.21875f,0.71875f, +0.226563f,0.71875f, +0.234375f,0.71875f, +0.242188f,0.71875f, +0.25f,0.71875f, +0.257813f,0.71875f, +0.265625f,0.71875f, +0.273438f,0.71875f, +0.28125f,0.71875f, +0.289063f,0.71875f, +0.296875f,0.71875f, +0.304688f,0.71875f, +0.3125f,0.71875f, +0.320313f,0.71875f, +0.328125f,0.71875f, +0.335938f,0.71875f, +0.34375f,0.71875f, +0.351563f,0.71875f, +0.359375f,0.71875f, +0.367188f,0.71875f, +0.375f,0.71875f, +0.382813f,0.71875f, +0.390625f,0.71875f, +0.398438f,0.71875f, +0.40625f,0.71875f, +0.414063f,0.71875f, +0.421875f,0.71875f, +0.429688f,0.71875f, +0.4375f,0.71875f, +0.445313f,0.71875f, +0.453125f,0.71875f, +0.460938f,0.71875f, +0.46875f,0.71875f, +0.476563f,0.71875f, +0.484375f,0.71875f, +0.492188f,0.71875f, +0.5f,0.71875f, +0.507813f,0.71875f, +0.0f,0.726563f, +0.0078125f,0.726563f, +0.015625f,0.726563f, +0.0234375f,0.726563f, +0.03125f,0.726563f, +0.0390625f,0.726563f, +0.046875f,0.726563f, +0.0546875f,0.726563f, +0.0625f,0.726563f, +0.0703125f,0.726563f, +0.078125f,0.726563f, +0.0859375f,0.726563f, +0.09375f,0.726563f, +0.101563f,0.726563f, +0.109375f,0.726563f, +0.117188f,0.726563f, +0.125f,0.726563f, +0.132813f,0.726563f, +0.140625f,0.726563f, +0.148438f,0.726563f, +0.15625f,0.726563f, +0.164063f,0.726563f, +0.171875f,0.726563f, +0.179688f,0.726563f, +0.1875f,0.726563f, +0.195313f,0.726563f, +0.203125f,0.726563f, +0.210938f,0.726563f, +0.21875f,0.726563f, +0.226563f,0.726563f, +0.234375f,0.726563f, +0.242188f,0.726563f, +0.25f,0.726563f, +0.257813f,0.726563f, +0.265625f,0.726563f, +0.273438f,0.726563f, +0.28125f,0.726563f, +0.289063f,0.726563f, +0.296875f,0.726563f, +0.304688f,0.726563f, +0.3125f,0.726563f, +0.320313f,0.726563f, +0.328125f,0.726563f, +0.335938f,0.726563f, +0.34375f,0.726563f, +0.351563f,0.726563f, +0.359375f,0.726563f, +0.367188f,0.726563f, +0.375f,0.726563f, +0.382813f,0.726563f, +0.390625f,0.726563f, +0.398438f,0.726563f, +0.40625f,0.726563f, +0.414063f,0.726563f, +0.421875f,0.726563f, +0.429688f,0.726563f, +0.4375f,0.726563f, +0.445313f,0.726563f, +0.453125f,0.726563f, +0.460938f,0.726563f, +0.46875f,0.726563f, +0.476563f,0.726563f, +0.484375f,0.726563f, +0.492188f,0.726563f, +0.5f,0.726563f, +0.507813f,0.726563f, +0.0f,0.734375f, +0.0078125f,0.734375f, +0.015625f,0.734375f, +0.0234375f,0.734375f, +0.03125f,0.734375f, +0.0390625f,0.734375f, +0.046875f,0.734375f, +0.0546875f,0.734375f, +0.0625f,0.734375f, +0.0703125f,0.734375f, +0.078125f,0.734375f, +0.0859375f,0.734375f, +0.09375f,0.734375f, +0.101563f,0.734375f, +0.109375f,0.734375f, +0.117188f,0.734375f, +0.125f,0.734375f, +0.132813f,0.734375f, +0.140625f,0.734375f, +0.148438f,0.734375f, +0.15625f,0.734375f, +0.164063f,0.734375f, +0.171875f,0.734375f, +0.179688f,0.734375f, +0.1875f,0.734375f, +0.195313f,0.734375f, +0.203125f,0.734375f, +0.210938f,0.734375f, +0.21875f,0.734375f, +0.226563f,0.734375f, +0.234375f,0.734375f, +0.242188f,0.734375f, +0.25f,0.734375f, +0.257813f,0.734375f, +0.265625f,0.734375f, +0.273438f,0.734375f, +0.28125f,0.734375f, +0.289063f,0.734375f, +0.296875f,0.734375f, +0.304688f,0.734375f, +0.3125f,0.734375f, +0.320313f,0.734375f, +0.328125f,0.734375f, +0.335938f,0.734375f, +0.34375f,0.734375f, +0.351563f,0.734375f, +0.359375f,0.734375f, +0.367188f,0.734375f, +0.375f,0.734375f, +0.382813f,0.734375f, +0.390625f,0.734375f, +0.398438f,0.734375f, +0.40625f,0.734375f, +0.414063f,0.734375f, +0.421875f,0.734375f, +0.429688f,0.734375f, +0.4375f,0.734375f, +0.445313f,0.734375f, +0.453125f,0.734375f, +0.460938f,0.734375f, +0.46875f,0.734375f, +0.476563f,0.734375f, +0.484375f,0.734375f, +0.492188f,0.734375f, +0.5f,0.734375f, +0.507813f,0.734375f, +0.0f,0.742188f, +0.0078125f,0.742188f, +0.015625f,0.742188f, +0.0234375f,0.742188f, +0.03125f,0.742188f, +0.0390625f,0.742188f, +0.046875f,0.742188f, +0.0546875f,0.742188f, +0.0625f,0.742188f, +0.0703125f,0.742188f, +0.078125f,0.742188f, +0.0859375f,0.742188f, +0.09375f,0.742188f, +0.101563f,0.742188f, +0.109375f,0.742188f, +0.117188f,0.742188f, +0.125f,0.742188f, +0.132813f,0.742188f, +0.140625f,0.742188f, +0.148438f,0.742188f, +0.15625f,0.742188f, +0.164063f,0.742188f, +0.171875f,0.742188f, +0.179688f,0.742188f, +0.1875f,0.742188f, +0.195313f,0.742188f, +0.203125f,0.742188f, +0.210938f,0.742188f, +0.21875f,0.742188f, +0.226563f,0.742188f, +0.234375f,0.742188f, +0.242188f,0.742188f, +0.25f,0.742188f, +0.257813f,0.742188f, +0.265625f,0.742188f, +0.273438f,0.742188f, +0.28125f,0.742188f, +0.289063f,0.742188f, +0.296875f,0.742188f, +0.304688f,0.742188f, +0.3125f,0.742188f, +0.320313f,0.742188f, +0.328125f,0.742188f, +0.335938f,0.742188f, +0.34375f,0.742188f, +0.351563f,0.742188f, +0.359375f,0.742188f, +0.367188f,0.742188f, +0.375f,0.742188f, +0.382813f,0.742188f, +0.390625f,0.742188f, +0.398438f,0.742188f, +0.40625f,0.742188f, +0.414063f,0.742188f, +0.421875f,0.742188f, +0.429688f,0.742188f, +0.4375f,0.742188f, +0.445313f,0.742188f, +0.453125f,0.742188f, +0.460938f,0.742188f, +0.46875f,0.742188f, +0.476563f,0.742188f, +0.484375f,0.742188f, +0.492188f,0.742188f, +0.5f,0.742188f, +0.507813f,0.742188f, +0.0f,0.75f, +0.0078125f,0.75f, +0.015625f,0.75f, +0.0234375f,0.75f, +0.03125f,0.75f, +0.0390625f,0.75f, +0.046875f,0.75f, +0.0546875f,0.75f, +0.0625f,0.75f, +0.0703125f,0.75f, +0.078125f,0.75f, +0.0859375f,0.75f, +0.09375f,0.75f, +0.101563f,0.75f, +0.109375f,0.75f, +0.117188f,0.75f, +0.125f,0.75f, +0.132813f,0.75f, +0.140625f,0.75f, +0.148438f,0.75f, +0.15625f,0.75f, +0.164063f,0.75f, +0.171875f,0.75f, +0.179688f,0.75f, +0.1875f,0.75f, +0.195313f,0.75f, +0.203125f,0.75f, +0.210938f,0.75f, +0.21875f,0.75f, +0.226563f,0.75f, +0.234375f,0.75f, +0.242188f,0.75f, +0.25f,0.75f, +0.257813f,0.75f, +0.265625f,0.75f, +0.273438f,0.75f, +0.28125f,0.75f, +0.289063f,0.75f, +0.296875f,0.75f, +0.304688f,0.75f, +0.3125f,0.75f, +0.320313f,0.75f, +0.328125f,0.75f, +0.335938f,0.75f, +0.34375f,0.75f, +0.351563f,0.75f, +0.359375f,0.75f, +0.367188f,0.75f, +0.375f,0.75f, +0.382813f,0.75f, +0.390625f,0.75f, +0.398438f,0.75f, +0.40625f,0.75f, +0.414063f,0.75f, +0.421875f,0.75f, +0.429688f,0.75f, +0.4375f,0.75f, +0.445313f,0.75f, +0.453125f,0.75f, +0.460938f,0.75f, +0.46875f,0.75f, +0.476563f,0.75f, +0.484375f,0.75f, +0.492188f,0.75f, +0.5f,0.75f, +0.507813f,0.75f, +}; + +unsigned short Landscape05Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +2178,2112,2179, +2113,2179,2112, +2179,2113,2180, +2114,2180,2113, +2180,2114,2181, +2115,2181,2114, +2181,2115,2182, +2116,2182,2115, +2182,2116,2183, +2117,2183,2116, +2183,2117,2184, +2118,2184,2117, +2184,2118,2185, +2119,2185,2118, +2185,2119,2186, +2120,2186,2119, +2186,2120,2187, +2121,2187,2120, +2187,2121,2188, +2122,2188,2121, +2188,2122,2189, +2123,2189,2122, +2189,2123,2190, +2124,2190,2123, +2190,2124,2191, +2125,2191,2124, +2191,2125,2192, +2126,2192,2125, +2192,2126,2193, +2127,2193,2126, +2193,2127,2194, +2128,2194,2127, +2194,2128,2195, +2129,2195,2128, +2195,2129,2196, +2130,2196,2129, +2196,2130,2197, +2131,2197,2130, +2197,2131,2198, +2132,2198,2131, +2198,2132,2199, +2133,2199,2132, +2199,2133,2200, +2134,2200,2133, +2200,2134,2201, +2135,2201,2134, +2201,2135,2202, +2136,2202,2135, +2202,2136,2203, +2137,2203,2136, +2203,2137,2204, +2138,2204,2137, +2204,2138,2205, +2139,2205,2138, +2205,2139,2206, +2140,2206,2139, +2206,2140,2207, +2141,2207,2140, +2207,2141,2208, +2142,2208,2141, +2208,2142,2209, +2143,2209,2142, +2209,2143,2210, +2144,2210,2143, +2210,2144,2211, +2145,2211,2144, +2211,2145,2212, +2146,2212,2145, +2212,2146,2213, +2147,2213,2146, +2213,2147,2214, +2148,2214,2147, +2214,2148,2215, +2149,2215,2148, +2215,2149,2216, +2150,2216,2149, +2216,2150,2217, +2151,2217,2150, +2217,2151,2218, +2152,2218,2151, +2218,2152,2219, +2153,2219,2152, +2219,2153,2220, +2154,2220,2153, +2220,2154,2221, +2155,2221,2154, +2221,2155,2222, +2156,2222,2155, +2222,2156,2223, +2157,2223,2156, +2223,2157,2224, +2158,2224,2157, +2224,2158,2225, +2159,2225,2158, +2225,2159,2226, +2160,2226,2159, +2226,2160,2227, +2161,2227,2160, +2227,2161,2228, +2162,2228,2161, +2228,2162,2229, +2163,2229,2162, +2229,2163,2230, +2164,2230,2163, +2230,2164,2231, +2165,2231,2164, +2231,2165,2232, +2166,2232,2165, +2232,2166,2233, +2167,2233,2166, +2233,2167,2234, +2168,2234,2167, +2234,2168,2235, +2169,2235,2168, +2235,2169,2236, +2170,2236,2169, +2236,2170,2237, +2171,2237,2170, +2237,2171,2238, +2172,2238,2171, +2238,2172,2239, +2173,2239,2172, +2239,2173,2240, +2174,2240,2173, +2240,2174,2241, +2175,2241,2174, +2241,2175,2242, +2176,2242,2175, +2242,2176,2243, +2177,2243,2176, +}; + +#define Landscape06VtxCount 2310 +#define Landscape06IdxCount 13260 + +btScalar Landscape06Vtx[] = { +-250.0f,5.63631f,246.094f, +-250.0f,8.1152f,250.0f, +-246.094f,7.06461f,246.094f, +-246.094f,9.72778f,250.0f, +-242.188f,9.8471f,246.094f, +-242.188f,11.659f,250.0f, +-238.281f,12.8404f,246.094f, +-238.281f,12.5619f,250.0f, +-234.375f,13.9879f,246.094f, +-234.375f,12.9518f,250.0f, +-230.469f,15.7239f,246.094f, +-230.469f,15.1373f,250.0f, +-226.563f,17.5095f,246.094f, +-226.563f,17.0421f,250.0f, +-222.656f,18.4322f,246.094f, +-222.656f,17.9919f,250.0f, +-218.75f,19.0755f,246.094f, +-218.75f,18.7918f,250.0f, +-214.844f,19.9271f,246.094f, +-214.844f,19.5719f,250.0f, +-210.938f,19.7244f,246.094f, +-210.938f,20.0866f,250.0f, +-207.031f,18.9716f,246.094f, +-207.031f,19.7869f,250.0f, +-203.125f,19.1922f,246.094f, +-203.125f,20.0264f,250.0f, +-199.219f,17.8506f,246.094f, +-199.219f,19.3207f,250.0f, +-195.313f,15.238f,246.094f, +-195.313f,18.0244f,250.0f, +-191.406f,14.6904f,246.094f, +-191.406f,16.2939f,250.0f, +-187.5f,12.9803f,246.094f, +-187.5f,14.9619f,250.0f, +-183.594f,11.6545f,246.094f, +-183.594f,12.6676f,250.0f, +-179.688f,12.4631f,246.094f, +-179.688f,13.6712f,250.0f, +-175.781f,13.1206f,246.094f, +-175.781f,14.5417f,250.0f, +-171.875f,13.3105f,246.094f, +-171.875f,15.8974f,250.0f, +-167.969f,13.4543f,246.094f, +-167.969f,15.9641f,250.0f, +-164.063f,13.4505f,246.094f, +-164.063f,15.4826f,250.0f, +-160.156f,14.6873f,246.094f, +-160.156f,15.1093f,250.0f, +-156.25f,14.1623f,246.094f, +-156.25f,14.8119f,250.0f, +-152.344f,14.0111f,246.094f, +-152.344f,14.4017f,250.0f, +-148.438f,13.2014f,246.094f, +-148.438f,14.2916f,250.0f, +-144.531f,12.8662f,246.094f, +-144.531f,13.5685f,250.0f, +-140.625f,13.1721f,246.094f, +-140.625f,14.2972f,250.0f, +-136.719f,12.9479f,246.094f, +-136.719f,15.0727f,250.0f, +-132.813f,13.4221f,246.094f, +-132.813f,14.5344f,250.0f, +-128.906f,14.0862f,246.094f, +-128.906f,15.7145f,250.0f, +-125.0f,13.481f,246.094f, +-125.0f,15.4608f,250.0f, +-121.094f,12.6228f,246.094f, +-121.094f,15.1857f,250.0f, +-117.188f,12.0584f,246.094f, +-117.188f,15.444f,250.0f, +-113.281f,12.7173f,246.094f, +-113.281f,15.8882f,250.0f, +-109.375f,12.3498f,246.094f, +-109.375f,15.2023f,250.0f, +-105.469f,13.0125f,246.094f, +-105.469f,15.1747f,250.0f, +-101.563f,13.7023f,246.094f, +-101.563f,14.7499f,250.0f, +-97.6563f,14.0674f,246.094f, +-97.6563f,15.0991f,250.0f, +-93.75f,13.8437f,246.094f, +-93.75f,14.6676f,250.0f, +-89.8438f,14.6327f,246.094f, +-89.8438f,14.1527f,250.0f, +-85.9375f,13.2966f,246.094f, +-85.9375f,14.0388f,250.0f, +-82.0313f,12.8094f,246.094f, +-82.0313f,13.7786f,250.0f, +-78.125f,11.8006f,246.094f, +-78.125f,13.0685f,250.0f, +-74.2188f,11.6837f,246.094f, +-74.2188f,12.8361f,250.0f, +-70.3125f,11.0326f,246.094f, +-70.3125f,12.3629f,250.0f, +-66.4063f,11.893f,246.094f, +-66.4063f,11.1909f,250.0f, +-62.5f,10.6469f,246.094f, +-62.5f,9.92966f,250.0f, +-58.5938f,8.55287f,246.094f, +-58.5938f,8.8871f,250.0f, +-54.6875f,7.1029f,246.094f, +-54.6875f,7.4963f,250.0f, +-50.7813f,6.9758f,246.094f, +-50.7813f,6.23897f,250.0f, +-46.875f,7.98262f,246.094f, +-46.875f,6.88918f,250.0f, +-42.9688f,9.11554f,246.094f, +-42.9688f,7.29319f,250.0f, +-39.0625f,8.74373f,246.094f, +-39.0625f,6.89167f,250.0f, +-35.1563f,7.46275f,246.094f, +-35.1563f,6.659f,250.0f, +-31.25f,7.67626f,246.094f, +-31.25f,6.75404f,250.0f, +-27.3438f,7.00511f,246.094f, +-27.3438f,6.15573f,250.0f, +-23.4375f,5.63813f,246.094f, +-23.4375f,5.72737f,250.0f, +-19.5313f,5.11885f,246.094f, +-19.5313f,4.00822f,250.0f, +-15.625f,3.60038f,246.094f, +-15.625f,3.50471f,250.0f, +-11.7188f,3.05357f,246.094f, +-11.7188f,3.0992f,250.0f, +-7.8125f,2.48195f,246.094f, +-7.8125f,2.46052f,250.0f, +-3.90625f,1.69136f,246.094f, +-3.90625f,2.5505f,250.0f, +0.0f,1.14548f,246.094f, +0.0f,2.18079f,250.0f, +3.90625f,0.45291f,246.094f, +3.90625f,1.52302f,250.0f, +-250.0f,5.2159f,242.188f, +-246.094f,7.35218f,242.188f, +-242.188f,10.2284f,242.188f, +-238.281f,12.7552f,242.188f, +-234.375f,14.3317f,242.188f, +-230.469f,16.3594f,242.188f, +-226.563f,17.8216f,242.188f, +-222.656f,18.5321f,242.188f, +-218.75f,18.7578f,242.188f, +-214.844f,19.504f,242.188f, +-210.938f,18.9422f,242.188f, +-207.031f,17.9771f,242.188f, +-203.125f,17.2798f,242.188f, +-199.219f,15.2252f,242.188f, +-195.313f,13.8769f,242.188f, +-191.406f,12.8727f,242.188f, +-187.5f,11.7858f,242.188f, +-183.594f,12.4886f,242.188f, +-179.688f,12.9814f,242.188f, +-175.781f,13.5265f,242.188f, +-171.875f,13.8082f,242.188f, +-167.969f,13.8407f,242.188f, +-164.063f,13.5872f,242.188f, +-160.156f,13.8287f,242.188f, +-156.25f,13.5778f,242.188f, +-152.344f,13.0026f,242.188f, +-148.438f,12.6259f,242.188f, +-144.531f,12.4666f,242.188f, +-140.625f,12.634f,242.188f, +-136.719f,12.1746f,242.188f, +-132.813f,11.7885f,242.188f, +-128.906f,11.4539f,242.188f, +-125.0f,11.0084f,242.188f, +-121.094f,10.1521f,242.188f, +-117.188f,10.6008f,242.188f, +-113.281f,10.2088f,242.188f, +-109.375f,11.0344f,242.188f, +-105.469f,11.1441f,242.188f, +-101.563f,12.3959f,242.188f, +-97.6563f,13.3587f,242.188f, +-93.75f,14.2415f,242.188f, +-89.8438f,13.9809f,242.188f, +-85.9375f,13.3276f,242.188f, +-82.0313f,11.9639f,242.188f, +-78.125f,11.5863f,242.188f, +-74.2188f,11.7327f,242.188f, +-70.3125f,11.5527f,242.188f, +-66.4063f,12.3699f,242.188f, +-62.5f,11.1959f,242.188f, +-58.5938f,9.59967f,242.188f, +-54.6875f,8.38887f,242.188f, +-50.7813f,7.42613f,242.188f, +-46.875f,8.34697f,242.188f, +-42.9688f,9.7013f,242.188f, +-39.0625f,9.10668f,242.188f, +-35.1563f,8.24657f,242.188f, +-31.25f,8.06656f,242.188f, +-27.3438f,6.98555f,242.188f, +-23.4375f,6.88836f,242.188f, +-19.5313f,5.88079f,242.188f, +-15.625f,4.43148f,242.188f, +-11.7188f,3.65843f,242.188f, +-7.8125f,2.85687f,242.188f, +-3.90625f,1.8332f,242.188f, +0.0f,2.03971f,242.188f, +3.90625f,2.21488f,242.188f, +-250.0f,5.44463f,238.281f, +-246.094f,7.90885f,238.281f, +-242.188f,10.3908f,238.281f, +-238.281f,12.875f,238.281f, +-234.375f,14.8255f,238.281f, +-230.469f,16.5404f,238.281f, +-226.563f,17.8109f,238.281f, +-222.656f,19.0205f,238.281f, +-218.75f,18.7565f,238.281f, +-214.844f,18.9852f,238.281f, +-210.938f,18.3753f,238.281f, +-207.031f,16.6829f,238.281f, +-203.125f,15.8099f,238.281f, +-199.219f,13.2915f,238.281f, +-195.313f,13.447f,238.281f, +-191.406f,13.5971f,238.281f, +-187.5f,12.1473f,238.281f, +-183.594f,13.3531f,238.281f, +-179.688f,14.4732f,238.281f, +-175.781f,15.0267f,238.281f, +-171.875f,14.7852f,238.281f, +-167.969f,15.5706f,238.281f, +-164.063f,14.267f,238.281f, +-160.156f,14.0772f,238.281f, +-156.25f,12.4965f,238.281f, +-152.344f,12.1473f,238.281f, +-148.438f,11.8693f,238.281f, +-144.531f,11.2795f,238.281f, +-140.625f,10.8173f,238.281f, +-136.719f,10.792f,238.281f, +-132.813f,10.8481f,238.281f, +-128.906f,9.95928f,238.281f, +-125.0f,10.0976f,238.281f, +-121.094f,8.74444f,238.281f, +-117.188f,9.1761f,238.281f, +-113.281f,10.2354f,238.281f, +-109.375f,10.7023f,238.281f, +-105.469f,11.6386f,238.281f, +-101.563f,12.7789f,238.281f, +-97.6563f,13.956f,238.281f, +-93.75f,14.1101f,238.281f, +-89.8438f,13.2653f,238.281f, +-85.9375f,12.1604f,238.281f, +-82.0313f,11.6914f,238.281f, +-78.125f,11.3706f,238.281f, +-74.2188f,12.1449f,238.281f, +-70.3125f,12.4512f,238.281f, +-66.4063f,12.6436f,238.281f, +-62.5f,11.6692f,238.281f, +-58.5938f,10.8304f,238.281f, +-54.6875f,8.88158f,238.281f, +-50.7813f,7.94904f,238.281f, +-46.875f,8.47525f,238.281f, +-42.9688f,9.08763f,238.281f, +-39.0625f,9.21095f,238.281f, +-35.1563f,9.12926f,238.281f, +-31.25f,8.5517f,238.281f, +-27.3438f,7.86146f,238.281f, +-23.4375f,7.33662f,238.281f, +-19.5313f,6.37551f,238.281f, +-15.625f,5.59324f,238.281f, +-11.7188f,4.81831f,238.281f, +-7.8125f,4.35695f,238.281f, +-3.90625f,3.64159f,238.281f, +0.0f,3.70314f,238.281f, +3.90625f,3.04396f,238.281f, +-250.0f,5.92848f,234.375f, +-246.094f,8.10446f,234.375f, +-242.188f,10.3516f,234.375f, +-238.281f,12.4984f,234.375f, +-234.375f,15.0991f,234.375f, +-230.469f,16.0002f,234.375f, +-226.563f,17.2585f,234.375f, +-222.656f,18.1852f,234.375f, +-218.75f,18.7811f,234.375f, +-214.844f,18.4638f,234.375f, +-210.938f,18.3171f,234.375f, +-207.031f,16.1085f,234.375f, +-203.125f,15.1926f,234.375f, +-199.219f,14.1792f,234.375f, +-195.313f,13.5589f,234.375f, +-191.406f,13.9362f,234.375f, +-187.5f,13.303f,234.375f, +-183.594f,13.6602f,234.375f, +-179.688f,15.1086f,234.375f, +-175.781f,15.5943f,234.375f, +-171.875f,15.3663f,234.375f, +-167.969f,14.9609f,234.375f, +-164.063f,14.4285f,234.375f, +-160.156f,14.1532f,234.375f, +-156.25f,13.0139f,234.375f, +-152.344f,11.6503f,234.375f, +-148.438f,11.6112f,234.375f, +-144.531f,11.1097f,234.375f, +-140.625f,10.8763f,234.375f, +-136.719f,10.2321f,234.375f, +-132.813f,9.71321f,234.375f, +-128.906f,9.04388f,234.375f, +-125.0f,9.53542f,234.375f, +-121.094f,8.10006f,234.375f, +-117.188f,9.16948f,234.375f, +-113.281f,9.67824f,234.375f, +-109.375f,10.2679f,234.375f, +-105.469f,10.9669f,234.375f, +-101.563f,12.2942f,234.375f, +-97.6563f,13.2952f,234.375f, +-93.75f,13.0932f,234.375f, +-89.8438f,12.4514f,234.375f, +-85.9375f,12.2395f,234.375f, +-82.0313f,11.7622f,234.375f, +-78.125f,11.9666f,234.375f, +-74.2188f,12.2346f,234.375f, +-70.3125f,13.1648f,234.375f, +-66.4063f,13.506f,234.375f, +-62.5f,13.1773f,234.375f, +-58.5938f,11.9168f,234.375f, +-54.6875f,10.0208f,234.375f, +-50.7813f,9.08267f,234.375f, +-46.875f,8.4406f,234.375f, +-42.9688f,9.27515f,234.375f, +-39.0625f,10.2228f,234.375f, +-35.1563f,9.77624f,234.375f, +-31.25f,9.17943f,234.375f, +-27.3438f,8.83272f,234.375f, +-23.4375f,8.00355f,234.375f, +-19.5313f,7.37167f,234.375f, +-15.625f,6.87424f,234.375f, +-11.7188f,6.23994f,234.375f, +-7.8125f,5.50641f,234.375f, +-3.90625f,5.06839f,234.375f, +0.0f,5.06846f,234.375f, +3.90625f,5.19166f,234.375f, +-250.0f,4.98265f,230.469f, +-246.094f,7.878f,230.469f, +-242.188f,10.9188f,230.469f, +-238.281f,12.8549f,230.469f, +-234.375f,14.5578f,230.469f, +-230.469f,16.067f,230.469f, +-226.563f,17.9938f,230.469f, +-222.656f,18.3449f,230.469f, +-218.75f,18.4423f,230.469f, +-214.844f,18.9411f,230.469f, +-210.938f,17.3131f,230.469f, +-207.031f,15.3292f,230.469f, +-203.125f,15.5278f,230.469f, +-199.219f,14.9451f,230.469f, +-195.313f,13.8026f,230.469f, +-191.406f,13.1586f,230.469f, +-187.5f,13.4388f,230.469f, +-183.594f,14.2213f,230.469f, +-179.688f,14.907f,230.469f, +-175.781f,15.2295f,230.469f, +-171.875f,14.8701f,230.469f, +-167.969f,14.1393f,230.469f, +-164.063f,13.7829f,230.469f, +-160.156f,13.0614f,230.469f, +-156.25f,12.3416f,230.469f, +-152.344f,11.5366f,230.469f, +-148.438f,11.5201f,230.469f, +-144.531f,11.0918f,230.469f, +-140.625f,11.139f,230.469f, +-136.719f,10.0387f,230.469f, +-132.813f,8.59099f,230.469f, +-128.906f,7.71771f,230.469f, +-125.0f,7.44273f,230.469f, +-121.094f,8.17087f,230.469f, +-117.188f,8.34002f,230.469f, +-113.281f,9.22169f,230.469f, +-109.375f,10.2195f,230.469f, +-105.469f,11.523f,230.469f, +-101.563f,12.7411f,230.469f, +-97.6563f,12.7429f,230.469f, +-93.75f,12.3959f,230.469f, +-89.8438f,11.7559f,230.469f, +-85.9375f,10.3669f,230.469f, +-82.0313f,10.0825f,230.469f, +-78.125f,11.4451f,230.469f, +-74.2188f,12.235f,230.469f, +-70.3125f,13.6016f,230.469f, +-66.4063f,14.377f,230.469f, +-62.5f,13.967f,230.469f, +-58.5938f,12.862f,230.469f, +-54.6875f,11.4719f,230.469f, +-50.7813f,9.99381f,230.469f, +-46.875f,8.68857f,230.469f, +-42.9688f,9.43448f,230.469f, +-39.0625f,10.4708f,230.469f, +-35.1563f,11.0521f,230.469f, +-31.25f,10.5864f,230.469f, +-27.3438f,10.8331f,230.469f, +-23.4375f,9.96112f,230.469f, +-19.5313f,8.61029f,230.469f, +-15.625f,7.42407f,230.469f, +-11.7188f,6.43202f,230.469f, +-7.8125f,6.36726f,230.469f, +-3.90625f,6.52581f,230.469f, +0.0f,6.18686f,230.469f, +3.90625f,5.885f,230.469f, +-250.0f,4.92227f,226.563f, +-246.094f,8.66811f,226.563f, +-242.188f,11.7599f,226.563f, +-238.281f,13.6581f,226.563f, +-234.375f,15.6409f,226.563f, +-230.469f,16.7907f,226.563f, +-226.563f,17.4606f,226.563f, +-222.656f,18.4841f,226.563f, +-218.75f,18.4506f,226.563f, +-214.844f,17.5936f,226.563f, +-210.938f,16.5941f,226.563f, +-207.031f,14.8805f,226.563f, +-203.125f,15.3743f,226.563f, +-199.219f,15.4493f,226.563f, +-195.313f,14.5184f,226.563f, +-191.406f,12.9285f,226.563f, +-187.5f,13.3898f,226.563f, +-183.594f,14.0358f,226.563f, +-179.688f,15.2884f,226.563f, +-175.781f,14.972f,226.563f, +-171.875f,14.2355f,226.563f, +-167.969f,13.6786f,226.563f, +-164.063f,13.0771f,226.563f, +-160.156f,12.7879f,226.563f, +-156.25f,12.4767f,226.563f, +-152.344f,11.5156f,226.563f, +-148.438f,11.1725f,226.563f, +-144.531f,10.8869f,226.563f, +-140.625f,9.77232f,226.563f, +-136.719f,8.75728f,226.563f, +-132.813f,6.77705f,226.563f, +-128.906f,6.35083f,226.563f, +-125.0f,6.59888f,226.563f, +-121.094f,7.81295f,226.563f, +-117.188f,8.10078f,226.563f, +-113.281f,9.07634f,226.563f, +-109.375f,10.2289f,226.563f, +-105.469f,11.5342f,226.563f, +-101.563f,12.9142f,226.563f, +-97.6563f,12.8729f,226.563f, +-93.75f,12.8149f,226.563f, +-89.8438f,10.9671f,226.563f, +-85.9375f,10.0649f,226.563f, +-82.0313f,9.28012f,226.563f, +-78.125f,10.1324f,226.563f, +-74.2188f,11.8638f,226.563f, +-70.3125f,12.6141f,226.563f, +-66.4063f,13.6851f,226.563f, +-62.5f,13.9389f,226.563f, +-58.5938f,13.5413f,226.563f, +-54.6875f,12.4869f,226.563f, +-50.7813f,11.2774f,226.563f, +-46.875f,10.6009f,226.563f, +-42.9688f,11.4839f,226.563f, +-39.0625f,12.5408f,226.563f, +-35.1563f,12.8694f,226.563f, +-31.25f,12.5253f,226.563f, +-27.3438f,12.1887f,226.563f, +-23.4375f,11.5356f,226.563f, +-19.5313f,9.53151f,226.563f, +-15.625f,8.29811f,226.563f, +-11.7188f,7.38375f,226.563f, +-7.8125f,7.57607f,226.563f, +-3.90625f,7.41156f,226.563f, +0.0f,6.9836f,226.563f, +3.90625f,6.89682f,226.563f, +-250.0f,4.66781f,222.656f, +-246.094f,7.89882f,222.656f, +-242.188f,10.8629f,222.656f, +-238.281f,14.1235f,222.656f, +-234.375f,15.6001f,222.656f, +-230.469f,17.0347f,222.656f, +-226.563f,17.4872f,222.656f, +-222.656f,17.6157f,222.656f, +-218.75f,16.8213f,222.656f, +-214.844f,16.4076f,222.656f, +-210.938f,15.0745f,222.656f, +-207.031f,14.2914f,222.656f, +-203.125f,14.6094f,222.656f, +-199.219f,14.4637f,222.656f, +-195.313f,14.0807f,222.656f, +-191.406f,12.4559f,222.656f, +-187.5f,13.0367f,222.656f, +-183.594f,13.975f,222.656f, +-179.688f,14.802f,222.656f, +-175.781f,14.6145f,222.656f, +-171.875f,13.4733f,222.656f, +-167.969f,13.3385f,222.656f, +-164.063f,13.721f,222.656f, +-160.156f,12.5775f,222.656f, +-156.25f,11.962f,222.656f, +-152.344f,11.2422f,222.656f, +-148.438f,10.827f,222.656f, +-144.531f,10.2848f,222.656f, +-140.625f,8.45922f,222.656f, +-136.719f,7.72182f,222.656f, +-132.813f,6.23545f,222.656f, +-128.906f,5.69752f,222.656f, +-125.0f,6.29925f,222.656f, +-121.094f,7.1991f,222.656f, +-117.188f,7.56788f,222.656f, +-113.281f,8.87895f,222.656f, +-109.375f,9.92302f,222.656f, +-105.469f,10.2628f,222.656f, +-101.563f,11.427f,222.656f, +-97.6563f,12.2929f,222.656f, +-93.75f,11.6083f,222.656f, +-89.8438f,11.594f,222.656f, +-85.9375f,10.1683f,222.656f, +-82.0313f,10.4152f,222.656f, +-78.125f,10.765f,222.656f, +-74.2188f,11.5311f,222.656f, +-70.3125f,12.8761f,222.656f, +-66.4063f,14.8794f,222.656f, +-62.5f,15.7341f,222.656f, +-58.5938f,15.0851f,222.656f, +-54.6875f,14.4719f,222.656f, +-50.7813f,13.6899f,222.656f, +-46.875f,13.0842f,222.656f, +-42.9688f,13.1059f,222.656f, +-39.0625f,13.9942f,222.656f, +-35.1563f,13.8877f,222.656f, +-31.25f,14.1293f,222.656f, +-27.3438f,13.6276f,222.656f, +-23.4375f,12.2206f,222.656f, +-19.5313f,10.8481f,222.656f, +-15.625f,9.71168f,222.656f, +-11.7188f,8.51834f,222.656f, +-7.8125f,9.04274f,222.656f, +-3.90625f,8.46981f,222.656f, +0.0f,8.26045f,222.656f, +3.90625f,6.81349f,222.656f, +-250.0f,5.16984f,218.75f, +-246.094f,6.64731f,218.75f, +-242.188f,9.50207f,218.75f, +-238.281f,12.5115f,218.75f, +-234.375f,15.8009f,218.75f, +-230.469f,17.6139f,218.75f, +-226.563f,18.128f,218.75f, +-222.656f,17.3111f,218.75f, +-218.75f,16.3962f,218.75f, +-214.844f,16.0245f,218.75f, +-210.938f,14.5344f,218.75f, +-207.031f,13.4459f,218.75f, +-203.125f,13.3987f,218.75f, +-199.219f,13.5444f,218.75f, +-195.313f,12.1973f,218.75f, +-191.406f,11.8337f,218.75f, +-187.5f,13.3027f,218.75f, +-183.594f,13.2862f,218.75f, +-179.688f,14.577f,218.75f, +-175.781f,14.4312f,218.75f, +-171.875f,13.3065f,218.75f, +-167.969f,14.2726f,218.75f, +-164.063f,14.5522f,218.75f, +-160.156f,13.8269f,218.75f, +-156.25f,12.4234f,218.75f, +-152.344f,10.5035f,218.75f, +-148.438f,9.65297f,218.75f, +-144.531f,8.3692f,218.75f, +-140.625f,7.39811f,218.75f, +-136.719f,6.29024f,218.75f, +-132.813f,5.37103f,218.75f, +-128.906f,5.29069f,218.75f, +-125.0f,5.59696f,218.75f, +-121.094f,6.15404f,218.75f, +-117.188f,7.15855f,218.75f, +-113.281f,8.08243f,218.75f, +-109.375f,8.97937f,218.75f, +-105.469f,9.67177f,218.75f, +-101.563f,10.7738f,218.75f, +-97.6563f,11.4256f,218.75f, +-93.75f,11.6906f,218.75f, +-89.8438f,11.4527f,218.75f, +-85.9375f,11.5445f,218.75f, +-82.0313f,11.9384f,218.75f, +-78.125f,12.452f,218.75f, +-74.2188f,13.3202f,218.75f, +-70.3125f,14.2351f,218.75f, +-66.4063f,15.021f,218.75f, +-62.5f,16.1053f,218.75f, +-58.5938f,16.0633f,218.75f, +-54.6875f,15.6154f,218.75f, +-50.7813f,15.3347f,218.75f, +-46.875f,14.8984f,218.75f, +-42.9688f,14.1541f,218.75f, +-39.0625f,14.8343f,218.75f, +-35.1563f,14.8393f,218.75f, +-31.25f,14.865f,218.75f, +-27.3438f,13.9913f,218.75f, +-23.4375f,13.7749f,218.75f, +-19.5313f,12.6247f,218.75f, +-15.625f,11.3466f,218.75f, +-11.7188f,10.5048f,218.75f, +-7.8125f,9.94742f,218.75f, +-3.90625f,8.79577f,218.75f, +0.0f,8.31646f,218.75f, +3.90625f,8.02546f,218.75f, +-250.0f,4.42455f,214.844f, +-246.094f,6.15686f,214.844f, +-242.188f,8.4919f,214.844f, +-238.281f,12.2627f,214.844f, +-234.375f,15.9215f,214.844f, +-230.469f,17.6896f,214.844f, +-226.563f,18.1835f,214.844f, +-222.656f,17.9341f,214.844f, +-218.75f,16.9803f,214.844f, +-214.844f,15.6617f,214.844f, +-210.938f,14.3989f,214.844f, +-207.031f,12.7777f,214.844f, +-203.125f,12.7635f,214.844f, +-199.219f,12.8533f,214.844f, +-195.313f,12.1672f,214.844f, +-191.406f,12.2357f,214.844f, +-187.5f,12.5806f,214.844f, +-183.594f,12.5597f,214.844f, +-179.688f,13.6296f,214.844f, +-175.781f,13.8382f,214.844f, +-171.875f,14.4001f,214.844f, +-167.969f,14.3002f,214.844f, +-164.063f,14.3353f,214.844f, +-160.156f,14.0346f,214.844f, +-156.25f,12.9823f,214.844f, +-152.344f,10.8141f,214.844f, +-148.438f,9.57028f,214.844f, +-144.531f,8.18427f,214.844f, +-140.625f,6.89938f,214.844f, +-136.719f,5.79227f,214.844f, +-132.813f,4.60172f,214.844f, +-128.906f,4.59969f,214.844f, +-125.0f,5.20294f,214.844f, +-121.094f,6.17542f,214.844f, +-117.188f,7.13347f,214.844f, +-113.281f,8.1045f,214.844f, +-109.375f,8.73005f,214.844f, +-105.469f,9.96489f,214.844f, +-101.563f,11.1039f,214.844f, +-97.6563f,11.6791f,214.844f, +-93.75f,11.9246f,214.844f, +-89.8438f,12.0071f,214.844f, +-85.9375f,12.8099f,214.844f, +-82.0313f,13.3672f,214.844f, +-78.125f,13.5811f,214.844f, +-74.2188f,14.7559f,214.844f, +-70.3125f,15.4274f,214.844f, +-66.4063f,15.487f,214.844f, +-62.5f,16.3346f,214.844f, +-58.5938f,16.424f,214.844f, +-54.6875f,17.1014f,214.844f, +-50.7813f,17.634f,214.844f, +-46.875f,16.5132f,214.844f, +-42.9688f,15.1728f,214.844f, +-39.0625f,15.4699f,214.844f, +-35.1563f,16.154f,214.844f, +-31.25f,15.8527f,214.844f, +-27.3438f,15.4057f,214.844f, +-23.4375f,14.6476f,214.844f, +-19.5313f,13.1705f,214.844f, +-15.625f,11.9754f,214.844f, +-11.7188f,11.7453f,214.844f, +-7.8125f,10.8384f,214.844f, +-3.90625f,10.1259f,214.844f, +0.0f,9.49925f,214.844f, +3.90625f,9.25513f,214.844f, +-250.0f,3.60269f,210.938f, +-246.094f,5.37638f,210.938f, +-242.188f,7.66914f,210.938f, +-238.281f,11.9863f,210.938f, +-234.375f,14.9525f,210.938f, +-230.469f,16.5034f,210.938f, +-226.563f,17.8663f,210.938f, +-222.656f,17.1002f,210.938f, +-218.75f,16.0413f,210.938f, +-214.844f,14.8516f,210.938f, +-210.938f,13.8904f,210.938f, +-207.031f,11.9929f,210.938f, +-203.125f,11.8171f,210.938f, +-199.219f,11.6849f,210.938f, +-195.313f,11.056f,210.938f, +-191.406f,11.6318f,210.938f, +-187.5f,11.9333f,210.938f, +-183.594f,12.599f,210.938f, +-179.688f,14.0437f,210.938f, +-175.781f,14.7937f,210.938f, +-171.875f,14.8844f,210.938f, +-167.969f,14.3312f,210.938f, +-164.063f,13.2879f,210.938f, +-160.156f,12.3423f,210.938f, +-156.25f,11.4768f,210.938f, +-152.344f,9.94481f,210.938f, +-148.438f,7.76655f,210.938f, +-144.531f,6.59218f,210.938f, +-140.625f,6.49848f,210.938f, +-136.719f,5.2458f,210.938f, +-132.813f,4.27164f,210.938f, +-128.906f,4.68484f,210.938f, +-125.0f,5.2746f,210.938f, +-121.094f,6.12822f,210.938f, +-117.188f,8.02215f,210.938f, +-113.281f,8.95036f,210.938f, +-109.375f,9.92538f,210.938f, +-105.469f,10.4058f,210.938f, +-101.563f,11.2862f,210.938f, +-97.6563f,11.7274f,210.938f, +-93.75f,12.3175f,210.938f, +-89.8438f,12.6423f,210.938f, +-85.9375f,13.2212f,210.938f, +-82.0313f,13.9379f,210.938f, +-78.125f,15.3332f,210.938f, +-74.2188f,16.2893f,210.938f, +-70.3125f,16.1032f,210.938f, +-66.4063f,16.7786f,210.938f, +-62.5f,16.8038f,210.938f, +-58.5938f,16.1537f,210.938f, +-54.6875f,17.4306f,210.938f, +-50.7813f,17.313f,210.938f, +-46.875f,16.2568f,210.938f, +-42.9688f,16.0266f,210.938f, +-39.0625f,16.9569f,210.938f, +-35.1563f,18.0733f,210.938f, +-31.25f,17.4779f,210.938f, +-27.3438f,17.2939f,210.938f, +-23.4375f,16.1477f,210.938f, +-19.5313f,15.409f,210.938f, +-15.625f,14.0019f,210.938f, +-11.7188f,13.3531f,210.938f, +-7.8125f,12.4823f,210.938f, +-3.90625f,11.7842f,210.938f, +0.0f,11.0776f,210.938f, +3.90625f,10.5728f,210.938f, +-250.0f,3.49901f,207.031f, +-246.094f,4.00092f,207.031f, +-242.188f,7.06194f,207.031f, +-238.281f,10.1502f,207.031f, +-234.375f,13.0262f,207.031f, +-230.469f,15.541f,207.031f, +-226.563f,16.4029f,207.031f, +-222.656f,16.0741f,207.031f, +-218.75f,15.3706f,207.031f, +-214.844f,14.3529f,207.031f, +-210.938f,13.1351f,207.031f, +-207.031f,11.2939f,207.031f, +-203.125f,11.4337f,207.031f, +-199.219f,11.43f,207.031f, +-195.313f,10.6048f,207.031f, +-191.406f,10.859f,207.031f, +-187.5f,11.8447f,207.031f, +-183.594f,12.8305f,207.031f, +-179.688f,14.9116f,207.031f, +-175.781f,15.0225f,207.031f, +-171.875f,14.847f,207.031f, +-167.969f,13.7464f,207.031f, +-164.063f,12.6716f,207.031f, +-160.156f,10.4028f,207.031f, +-156.25f,9.61156f,207.031f, +-152.344f,9.08545f,207.031f, +-148.438f,6.96088f,207.031f, +-144.531f,6.6794f,207.031f, +-140.625f,6.08012f,207.031f, +-136.719f,5.02964f,207.031f, +-132.813f,4.93996f,207.031f, +-128.906f,4.955f,207.031f, +-125.0f,5.23446f,207.031f, +-121.094f,7.14164f,207.031f, +-117.188f,9.21655f,207.031f, +-113.281f,10.8802f,207.031f, +-109.375f,11.0518f,207.031f, +-105.469f,11.5707f,207.031f, +-101.563f,12.2834f,207.031f, +-97.6563f,12.7498f,207.031f, +-93.75f,12.6608f,207.031f, +-89.8438f,12.3649f,207.031f, +-85.9375f,13.1678f,207.031f, +-82.0313f,13.541f,207.031f, +-78.125f,14.3448f,207.031f, +-74.2188f,15.6006f,207.031f, +-70.3125f,17.0141f,207.031f, +-66.4063f,17.4107f,207.031f, +-62.5f,18.0045f,207.031f, +-58.5938f,17.6582f,207.031f, +-54.6875f,17.0297f,207.031f, +-50.7813f,16.6619f,207.031f, +-46.875f,17.1267f,207.031f, +-42.9688f,18.0618f,207.031f, +-39.0625f,18.7698f,207.031f, +-35.1563f,19.3034f,207.031f, +-31.25f,19.1566f,207.031f, +-27.3438f,19.1107f,207.031f, +-23.4375f,17.3298f,207.031f, +-19.5313f,15.7204f,207.031f, +-15.625f,14.7827f,207.031f, +-11.7188f,14.2027f,207.031f, +-7.8125f,13.5758f,207.031f, +-3.90625f,13.1935f,207.031f, +0.0f,11.8526f,207.031f, +3.90625f,10.4539f,207.031f, +-250.0f,3.85941f,203.125f, +-246.094f,3.80391f,203.125f, +-242.188f,6.8342f,203.125f, +-238.281f,10.0313f,203.125f, +-234.375f,12.9894f,203.125f, +-230.469f,15.1588f,203.125f, +-226.563f,15.6234f,203.125f, +-222.656f,15.112f,203.125f, +-218.75f,14.5577f,203.125f, +-214.844f,14.0703f,203.125f, +-210.938f,13.3523f,203.125f, +-207.031f,12.1264f,203.125f, +-203.125f,11.037f,203.125f, +-199.219f,10.3379f,203.125f, +-195.313f,11.3f,203.125f, +-191.406f,10.6845f,203.125f, +-187.5f,11.7023f,203.125f, +-183.594f,13.2057f,203.125f, +-179.688f,13.976f,203.125f, +-175.781f,14.994f,203.125f, +-171.875f,14.6465f,203.125f, +-167.969f,13.4879f,203.125f, +-164.063f,12.0617f,203.125f, +-160.156f,10.6454f,203.125f, +-156.25f,10.2693f,203.125f, +-152.344f,8.33279f,203.125f, +-148.438f,7.60557f,203.125f, +-144.531f,6.19774f,203.125f, +-140.625f,5.7751f,203.125f, +-136.719f,5.28903f,203.125f, +-132.813f,5.10696f,203.125f, +-128.906f,5.61944f,203.125f, +-125.0f,7.32929f,203.125f, +-121.094f,9.09158f,203.125f, +-117.188f,10.6952f,203.125f, +-113.281f,11.555f,203.125f, +-109.375f,12.5837f,203.125f, +-105.469f,13.4444f,203.125f, +-101.563f,14.3191f,203.125f, +-97.6563f,14.5546f,203.125f, +-93.75f,13.9216f,203.125f, +-89.8438f,13.07f,203.125f, +-85.9375f,13.0497f,203.125f, +-82.0313f,13.8884f,203.125f, +-78.125f,14.2048f,203.125f, +-74.2188f,16.2809f,203.125f, +-70.3125f,17.1518f,203.125f, +-66.4063f,18.4883f,203.125f, +-62.5f,19.2231f,203.125f, +-58.5938f,19.0199f,203.125f, +-54.6875f,18.4606f,203.125f, +-50.7813f,17.3076f,203.125f, +-46.875f,17.0012f,203.125f, +-42.9688f,18.4311f,203.125f, +-39.0625f,19.9758f,203.125f, +-35.1563f,20.1252f,203.125f, +-31.25f,20.126f,203.125f, +-27.3438f,18.9276f,203.125f, +-23.4375f,18.3938f,203.125f, +-19.5313f,16.6811f,203.125f, +-15.625f,15.7398f,203.125f, +-11.7188f,14.6978f,203.125f, +-7.8125f,14.7567f,203.125f, +-3.90625f,14.377f,203.125f, +0.0f,13.0029f,203.125f, +3.90625f,11.4706f,203.125f, +-250.0f,4.68355f,199.219f, +-246.094f,4.65569f,199.219f, +-242.188f,6.34925f,199.219f, +-238.281f,9.03665f,199.219f, +-234.375f,11.4587f,199.219f, +-230.469f,13.9932f,199.219f, +-226.563f,14.8268f,199.219f, +-222.656f,14.0552f,199.219f, +-218.75f,14.4455f,199.219f, +-214.844f,14.3053f,199.219f, +-210.938f,12.5781f,199.219f, +-207.031f,11.5778f,199.219f, +-203.125f,9.91652f,199.219f, +-199.219f,9.20832f,199.219f, +-195.313f,10.1078f,199.219f, +-191.406f,10.5638f,199.219f, +-187.5f,11.6649f,199.219f, +-183.594f,13.3758f,199.219f, +-179.688f,15.2035f,199.219f, +-175.781f,14.6909f,199.219f, +-171.875f,14.0312f,199.219f, +-167.969f,12.6808f,199.219f, +-164.063f,12.649f,199.219f, +-160.156f,11.6333f,199.219f, +-156.25f,10.8896f,199.219f, +-152.344f,8.72848f,199.219f, +-148.438f,7.55753f,199.219f, +-144.531f,6.70035f,199.219f, +-140.625f,5.28209f,199.219f, +-136.719f,5.47347f,199.219f, +-132.813f,7.25678f,199.219f, +-128.906f,9.06223f,199.219f, +-125.0f,9.91604f,199.219f, +-121.094f,10.882f,199.219f, +-117.188f,11.8314f,199.219f, +-113.281f,12.9729f,199.219f, +-109.375f,14.1144f,199.219f, +-105.469f,15.0374f,199.219f, +-101.563f,15.4321f,199.219f, +-97.6563f,15.9823f,199.219f, +-93.75f,15.4663f,199.219f, +-89.8438f,14.4094f,199.219f, +-85.9375f,14.1599f,199.219f, +-82.0313f,14.4239f,199.219f, +-78.125f,14.7717f,199.219f, +-74.2188f,15.3979f,199.219f, +-70.3125f,16.4014f,199.219f, +-66.4063f,17.9486f,199.219f, +-62.5f,19.3767f,199.219f, +-58.5938f,19.7322f,199.219f, +-54.6875f,19.0648f,199.219f, +-50.7813f,18.2481f,199.219f, +-46.875f,17.1507f,199.219f, +-42.9688f,18.6306f,199.219f, +-39.0625f,19.2486f,199.219f, +-35.1563f,20.3158f,199.219f, +-31.25f,19.6441f,199.219f, +-27.3438f,18.7294f,199.219f, +-23.4375f,17.9051f,199.219f, +-19.5313f,17.278f,199.219f, +-15.625f,16.1912f,199.219f, +-11.7188f,15.3685f,199.219f, +-7.8125f,14.8376f,199.219f, +-3.90625f,13.8988f,199.219f, +0.0f,12.5645f,199.219f, +3.90625f,12.1184f,199.219f, +-250.0f,5.71048f,195.313f, +-246.094f,4.68298f,195.313f, +-242.188f,5.30012f,195.313f, +-238.281f,7.72299f,195.313f, +-234.375f,10.9797f,195.313f, +-230.469f,12.6343f,195.313f, +-226.563f,13.8962f,195.313f, +-222.656f,13.2189f,195.313f, +-218.75f,14.0254f,195.313f, +-214.844f,14.5903f,195.313f, +-210.938f,12.6794f,195.313f, +-207.031f,9.8479f,195.313f, +-203.125f,8.05763f,195.313f, +-199.219f,7.68254f,195.313f, +-195.313f,9.0324f,195.313f, +-191.406f,10.7973f,195.313f, +-187.5f,12.1516f,195.313f, +-183.594f,13.1888f,195.313f, +-179.688f,14.2559f,195.313f, +-175.781f,14.0455f,195.313f, +-171.875f,13.2785f,195.313f, +-167.969f,12.7724f,195.313f, +-164.063f,12.56f,195.313f, +-160.156f,11.4647f,195.313f, +-156.25f,10.6463f,195.313f, +-152.344f,9.36927f,195.313f, +-148.438f,7.87862f,195.313f, +-144.531f,6.78168f,195.313f, +-140.625f,5.32688f,195.313f, +-136.719f,6.62928f,195.313f, +-132.813f,8.97871f,195.313f, +-128.906f,10.3174f,195.313f, +-125.0f,11.2136f,195.313f, +-121.094f,12.2822f,195.313f, +-117.188f,13.7351f,195.313f, +-113.281f,14.0196f,195.313f, +-109.375f,15.5457f,195.313f, +-105.469f,16.1402f,195.313f, +-101.563f,16.6719f,195.313f, +-97.6563f,16.2658f,195.313f, +-93.75f,16.5379f,195.313f, +-89.8438f,15.1289f,195.313f, +-85.9375f,14.7687f,195.313f, +-82.0313f,15.4638f,195.313f, +-78.125f,15.3391f,195.313f, +-74.2188f,14.8602f,195.313f, +-70.3125f,16.2701f,195.313f, +-66.4063f,17.9511f,195.313f, +-62.5f,19.108f,195.313f, +-58.5938f,19.5253f,195.313f, +-54.6875f,19.1648f,195.313f, +-50.7813f,18.0624f,195.313f, +-46.875f,17.2201f,195.313f, +-42.9688f,19.4165f,195.313f, +-39.0625f,20.3781f,195.313f, +-35.1563f,19.796f,195.313f, +-31.25f,18.9841f,195.313f, +-27.3438f,18.3143f,195.313f, +-23.4375f,18.1973f,195.313f, +-19.5313f,17.5121f,195.313f, +-15.625f,16.5969f,195.313f, +-11.7188f,15.3539f,195.313f, +-7.8125f,14.4654f,195.313f, +-3.90625f,13.8161f,195.313f, +0.0f,12.4727f,195.313f, +3.90625f,13.8013f,195.313f, +-250.0f,6.07831f,191.406f, +-246.094f,5.46721f,191.406f, +-242.188f,4.48351f,191.406f, +-238.281f,6.74031f,191.406f, +-234.375f,9.75661f,191.406f, +-230.469f,11.5382f,191.406f, +-226.563f,12.9559f,191.406f, +-222.656f,12.6196f,191.406f, +-218.75f,12.4516f,191.406f, +-214.844f,13.5738f,191.406f, +-210.938f,12.2334f,191.406f, +-207.031f,9.36284f,191.406f, +-203.125f,7.56119f,191.406f, +-199.219f,8.2975f,191.406f, +-195.313f,10.0432f,191.406f, +-191.406f,11.528f,191.406f, +-187.5f,12.9338f,191.406f, +-183.594f,13.9397f,191.406f, +-179.688f,14.1423f,191.406f, +-175.781f,13.7637f,191.406f, +-171.875f,12.7983f,191.406f, +-167.969f,12.6132f,191.406f, +-164.063f,12.07f,191.406f, +-160.156f,11.7037f,191.406f, +-156.25f,10.3692f,191.406f, +-152.344f,9.29784f,191.406f, +-148.438f,7.91508f,191.406f, +-144.531f,6.85636f,191.406f, +-140.625f,8.06021f,191.406f, +-136.719f,8.86078f,191.406f, +-132.813f,11.0565f,191.406f, +-128.906f,12.4031f,191.406f, +-125.0f,13.4308f,191.406f, +-121.094f,13.8732f,191.406f, +-117.188f,15.0555f,191.406f, +-113.281f,16.0219f,191.406f, +-109.375f,16.8646f,191.406f, +-105.469f,16.9156f,191.406f, +-101.563f,16.9811f,191.406f, +-97.6563f,17.1773f,191.406f, +-93.75f,16.9233f,191.406f, +-89.8438f,15.3563f,191.406f, +-85.9375f,14.4936f,191.406f, +-82.0313f,15.6108f,191.406f, +-78.125f,15.9615f,191.406f, +-74.2188f,14.6365f,191.406f, +-70.3125f,15.5344f,191.406f, +-66.4063f,17.4295f,191.406f, +-62.5f,18.2646f,191.406f, +-58.5938f,19.0205f,191.406f, +-54.6875f,19.0503f,191.406f, +-50.7813f,17.6912f,191.406f, +-46.875f,17.6816f,191.406f, +-42.9688f,18.8066f,191.406f, +-39.0625f,19.8444f,191.406f, +-35.1563f,18.7929f,191.406f, +-31.25f,18.6865f,191.406f, +-27.3438f,19.0671f,191.406f, +-23.4375f,18.6708f,191.406f, +-19.5313f,17.7215f,191.406f, +-15.625f,16.4711f,191.406f, +-11.7188f,15.4735f,191.406f, +-7.8125f,14.6316f,191.406f, +-3.90625f,13.8779f,191.406f, +0.0f,13.7777f,191.406f, +3.90625f,14.3936f,191.406f, +-250.0f,6.25219f,187.5f, +-246.094f,5.98752f,187.5f, +-242.188f,5.50108f,187.5f, +-238.281f,5.52049f,187.5f, +-234.375f,7.87236f,187.5f, +-230.469f,10.0244f,187.5f, +-226.563f,10.9579f,187.5f, +-222.656f,11.4176f,187.5f, +-218.75f,11.1583f,187.5f, +-214.844f,12.0797f,187.5f, +-210.938f,10.8226f,187.5f, +-207.031f,8.91363f,187.5f, +-203.125f,7.71952f,187.5f, +-199.219f,8.97116f,187.5f, +-195.313f,10.8813f,187.5f, +-191.406f,12.5874f,187.5f, +-187.5f,13.3418f,187.5f, +-183.594f,13.6407f,187.5f, +-179.688f,13.8787f,187.5f, +-175.781f,13.7918f,187.5f, +-171.875f,12.965f,187.5f, +-167.969f,12.2732f,187.5f, +-164.063f,11.6063f,187.5f, +-160.156f,10.9159f,187.5f, +-156.25f,10.2447f,187.5f, +-152.344f,9.32757f,187.5f, +-148.438f,9.17721f,187.5f, +-144.531f,9.53961f,187.5f, +-140.625f,10.4339f,187.5f, +-136.719f,11.8144f,187.5f, +-132.813f,13.3081f,187.5f, +-128.906f,13.571f,187.5f, +-125.0f,13.9242f,187.5f, +-121.094f,15.4069f,187.5f, +-117.188f,16.9689f,187.5f, +-113.281f,17.987f,187.5f, +-109.375f,18.7838f,187.5f, +-105.469f,18.7737f,187.5f, +-101.563f,18.6666f,187.5f, +-97.6563f,18.4809f,187.5f, +-93.75f,18.3562f,187.5f, +-89.8438f,16.3715f,187.5f, +-85.9375f,14.5483f,187.5f, +-82.0313f,14.9648f,187.5f, +-78.125f,16.1061f,187.5f, +-74.2188f,14.4715f,187.5f, +-70.3125f,14.8322f,187.5f, +-66.4063f,16.3093f,187.5f, +-62.5f,17.3305f,187.5f, +-58.5938f,18.3312f,187.5f, +-54.6875f,18.2865f,187.5f, +-50.7813f,17.4373f,187.5f, +-46.875f,17.9803f,187.5f, +-42.9688f,18.679f,187.5f, +-39.0625f,19.2363f,187.5f, +-35.1563f,19.9926f,187.5f, +-31.25f,19.8827f,187.5f, +-27.3438f,19.283f,187.5f, +-23.4375f,19.0081f,187.5f, +-19.5313f,17.5129f,187.5f, +-15.625f,16.6754f,187.5f, +-11.7188f,15.6685f,187.5f, +-7.8125f,14.6133f,187.5f, +-3.90625f,13.9468f,187.5f, +0.0f,14.2206f,187.5f, +3.90625f,14.1738f,187.5f, +-250.0f,7.10023f,183.594f, +-246.094f,6.39376f,183.594f, +-242.188f,5.78017f,183.594f, +-238.281f,5.07235f,183.594f, +-234.375f,5.98564f,183.594f, +-230.469f,7.6542f,183.594f, +-226.563f,8.75539f,183.594f, +-222.656f,9.90845f,183.594f, +-218.75f,10.2067f,183.594f, +-214.844f,10.2019f,183.594f, +-210.938f,9.2327f,183.594f, +-207.031f,7.67088f,183.594f, +-203.125f,8.15546f,183.594f, +-199.219f,9.42269f,183.594f, +-195.313f,10.8046f,183.594f, +-191.406f,13.3042f,183.594f, +-187.5f,13.9971f,183.594f, +-183.594f,13.621f,183.594f, +-179.688f,13.5612f,183.594f, +-175.781f,13.5357f,183.594f, +-171.875f,12.8778f,183.594f, +-167.969f,12.0385f,183.594f, +-164.063f,11.4391f,183.594f, +-160.156f,10.4255f,183.594f, +-156.25f,10.5692f,183.594f, +-152.344f,10.5452f,183.594f, +-148.438f,11.506f,183.594f, +-144.531f,12.1591f,183.594f, +-140.625f,12.6212f,183.594f, +-136.719f,13.5025f,183.594f, +-132.813f,14.3363f,183.594f, +-128.906f,14.5206f,183.594f, +-125.0f,15.4902f,183.594f, +-121.094f,17.4029f,183.594f, +-117.188f,17.9537f,183.594f, +-113.281f,18.5532f,183.594f, +-109.375f,19.2939f,183.594f, +-105.469f,19.2503f,183.594f, +-101.563f,19.8772f,183.594f, +-97.6563f,19.6753f,183.594f, +-93.75f,18.6744f,183.594f, +-89.8438f,17.7905f,183.594f, +-85.9375f,16.1613f,183.594f, +-82.0313f,15.7839f,183.594f, +-78.125f,15.657f,183.594f, +-74.2188f,14.4171f,183.594f, +-70.3125f,14.6083f,183.594f, +-66.4063f,15.5594f,183.594f, +-62.5f,16.1338f,183.594f, +-58.5938f,17.1134f,183.594f, +-54.6875f,16.8192f,183.594f, +-50.7813f,17.6885f,183.594f, +-46.875f,18.5331f,183.594f, +-42.9688f,19.7359f,183.594f, +-39.0625f,20.7966f,183.594f, +-35.1563f,20.414f,183.594f, +-31.25f,20.1587f,183.594f, +-27.3438f,19.9385f,183.594f, +-23.4375f,18.4694f,183.594f, +-19.5313f,16.9742f,183.594f, +-15.625f,16.0698f,183.594f, +-11.7188f,15.4466f,183.594f, +-7.8125f,15.0614f,183.594f, +-3.90625f,15.2165f,183.594f, +0.0f,14.2632f,183.594f, +3.90625f,13.9878f,183.594f, +-250.0f,8.16978f,179.688f, +-246.094f,7.02044f,179.688f, +-242.188f,6.49336f,179.688f, +-238.281f,6.17674f,179.688f, +-234.375f,4.65977f,179.688f, +-230.469f,5.28977f,179.688f, +-226.563f,7.10711f,179.688f, +-222.656f,8.03062f,179.688f, +-218.75f,9.32719f,179.688f, +-214.844f,9.22926f,179.688f, +-210.938f,8.64588f,179.688f, +-207.031f,7.76534f,179.688f, +-203.125f,8.37552f,179.688f, +-199.219f,8.61402f,179.688f, +-195.313f,10.7567f,179.688f, +-191.406f,12.1961f,179.688f, +-187.5f,13.5076f,179.688f, +-183.594f,13.5739f,179.688f, +-179.688f,13.6032f,179.688f, +-175.781f,13.5388f,179.688f, +-171.875f,13.0425f,179.688f, +-167.969f,13.5885f,179.688f, +-164.063f,13.2666f,179.688f, +-160.156f,11.7827f,179.688f, +-156.25f,12.3517f,179.688f, +-152.344f,13.1307f,179.688f, +-148.438f,13.6688f,179.688f, +-144.531f,13.758f,179.688f, +-140.625f,14.023f,179.688f, +-136.719f,15.1514f,179.688f, +-132.813f,16.004f,179.688f, +-128.906f,16.8991f,179.688f, +-125.0f,17.3616f,179.688f, +-121.094f,18.6059f,179.688f, +-117.188f,19.3263f,179.688f, +-113.281f,19.1956f,179.688f, +-109.375f,19.7991f,179.688f, +-105.469f,20.6907f,179.688f, +-101.563f,21.7059f,179.688f, +-97.6563f,21.5595f,179.688f, +-93.75f,20.4072f,179.688f, +-89.8438f,19.1786f,179.688f, +-85.9375f,18.2895f,179.688f, +-82.0313f,17.1568f,179.688f, +-78.125f,15.2991f,179.688f, +-74.2188f,14.0951f,179.688f, +-70.3125f,14.2935f,179.688f, +-66.4063f,15.0579f,179.688f, +-62.5f,15.3497f,179.688f, +-58.5938f,15.4148f,179.688f, +-54.6875f,17.2528f,179.688f, +-50.7813f,18.38f,179.688f, +-46.875f,19.343f,179.688f, +-42.9688f,20.2151f,179.688f, +-39.0625f,21.1482f,179.688f, +-35.1563f,20.8113f,179.688f, +-31.25f,19.3685f,179.688f, +-27.3438f,18.4966f,179.688f, +-23.4375f,17.1162f,179.688f, +-19.5313f,16.1739f,179.688f, +-15.625f,15.1081f,179.688f, +-11.7188f,15.5766f,179.688f, +-7.8125f,16.3649f,179.688f, +-3.90625f,16.3198f,179.688f, +0.0f,15.6844f,179.688f, +3.90625f,14.6785f,179.688f, +-250.0f,9.32456f,175.781f, +-246.094f,8.37571f,175.781f, +-242.188f,7.57502f,175.781f, +-238.281f,7.01497f,175.781f, +-234.375f,5.67261f,175.781f, +-230.469f,4.32895f,175.781f, +-226.563f,5.20027f,175.781f, +-222.656f,6.31061f,175.781f, +-218.75f,7.56464f,175.781f, +-214.844f,8.35874f,175.781f, +-210.938f,8.24556f,175.781f, +-207.031f,7.58905f,175.781f, +-203.125f,8.23662f,175.781f, +-199.219f,8.64236f,175.781f, +-195.313f,10.4842f,175.781f, +-191.406f,11.8296f,175.781f, +-187.5f,13.5307f,175.781f, +-183.594f,14.3422f,175.781f, +-179.688f,14.0725f,175.781f, +-175.781f,14.6f,175.781f, +-171.875f,13.9877f,175.781f, +-167.969f,13.7556f,175.781f, +-164.063f,13.4564f,175.781f, +-160.156f,13.6823f,175.781f, +-156.25f,14.2643f,175.781f, +-152.344f,14.5034f,175.781f, +-148.438f,14.905f,175.781f, +-144.531f,15.0207f,175.781f, +-140.625f,15.2745f,175.781f, +-136.719f,16.7553f,175.781f, +-132.813f,17.9777f,175.781f, +-128.906f,18.5468f,175.781f, +-125.0f,19.2067f,175.781f, +-121.094f,19.2384f,175.781f, +-117.188f,19.4993f,175.781f, +-113.281f,20.2276f,175.781f, +-109.375f,21.3946f,175.781f, +-105.469f,22.0598f,175.781f, +-101.563f,23.2713f,175.781f, +-97.6563f,22.6691f,175.781f, +-93.75f,21.3119f,175.781f, +-89.8438f,20.6083f,175.781f, +-85.9375f,19.4937f,175.781f, +-82.0313f,18.1998f,175.781f, +-78.125f,15.7716f,175.781f, +-74.2188f,14.2438f,175.781f, +-70.3125f,14.4105f,175.781f, +-66.4063f,15.1879f,175.781f, +-62.5f,15.7946f,175.781f, +-58.5938f,16.2302f,175.781f, +-54.6875f,17.1058f,175.781f, +-50.7813f,18.9688f,175.781f, +-46.875f,19.3102f,175.781f, +-42.9688f,19.3902f,175.781f, +-39.0625f,19.6545f,175.781f, +-35.1563f,19.2909f,175.781f, +-31.25f,18.5385f,175.781f, +-27.3438f,16.4388f,175.781f, +-23.4375f,15.5576f,175.781f, +-19.5313f,15.7726f,175.781f, +-15.625f,16.3756f,175.781f, +-11.7188f,16.9626f,175.781f, +-7.8125f,17.219f,175.781f, +-3.90625f,17.063f,175.781f, +0.0f,16.3609f,175.781f, +3.90625f,15.2963f,175.781f, +-250.0f,10.0329f,171.875f, +-246.094f,8.57258f,171.875f, +-242.188f,7.81755f,171.875f, +-238.281f,6.9951f,171.875f, +-234.375f,5.59199f,171.875f, +-230.469f,4.81205f,171.875f, +-226.563f,4.7432f,171.875f, +-222.656f,5.42683f,171.875f, +-218.75f,6.16332f,171.875f, +-214.844f,6.63573f,171.875f, +-210.938f,6.97578f,171.875f, +-207.031f,7.49804f,171.875f, +-203.125f,8.51155f,171.875f, +-199.219f,7.94356f,171.875f, +-195.313f,9.50881f,171.875f, +-191.406f,10.9726f,171.875f, +-187.5f,13.1622f,171.875f, +-183.594f,13.8249f,171.875f, +-179.688f,15.1925f,171.875f, +-175.781f,14.9284f,171.875f, +-171.875f,13.915f,171.875f, +-167.969f,14.2258f,171.875f, +-164.063f,13.435f,171.875f, +-160.156f,13.9359f,171.875f, +-156.25f,14.8963f,171.875f, +-152.344f,15.2933f,171.875f, +-148.438f,15.0124f,171.875f, +-144.531f,15.0787f,171.875f, +-140.625f,15.1958f,171.875f, +-136.719f,17.151f,171.875f, +-132.813f,18.8799f,171.875f, +-128.906f,19.5273f,171.875f, +-125.0f,19.6894f,171.875f, +-121.094f,19.6466f,171.875f, +-117.188f,20.5941f,171.875f, +-113.281f,21.5237f,171.875f, +-109.375f,22.5435f,171.875f, +-105.469f,23.0706f,171.875f, +-101.563f,23.614f,171.875f, +-97.6563f,22.4198f,171.875f, +-93.75f,21.9598f,171.875f, +-89.8438f,22.3051f,171.875f, +-85.9375f,21.7459f,171.875f, +-82.0313f,20.1308f,171.875f, +-78.125f,17.6018f,171.875f, +-74.2188f,15.106f,171.875f, +-70.3125f,16.0838f,171.875f, +-66.4063f,16.4153f,171.875f, +-62.5f,16.9093f,171.875f, +-58.5938f,16.7439f,171.875f, +-54.6875f,16.4659f,171.875f, +-50.7813f,18.0893f,171.875f, +-46.875f,18.8298f,171.875f, +-42.9688f,18.459f,171.875f, +-39.0625f,18.0953f,171.875f, +-35.1563f,18.2461f,171.875f, +-31.25f,17.0625f,171.875f, +-27.3438f,15.3181f,171.875f, +-23.4375f,15.1837f,171.875f, +-19.5313f,17.2025f,171.875f, +-15.625f,18.3144f,171.875f, +-11.7188f,18.4161f,171.875f, +-7.8125f,18.3279f,171.875f, +-3.90625f,17.5657f,171.875f, +0.0f,16.2057f,171.875f, +3.90625f,16.0791f,171.875f, +-250.0f,9.46368f,167.969f, +-246.094f,8.91851f,167.969f, +-242.188f,7.83383f,167.969f, +-238.281f,7.4147f,167.969f, +-234.375f,6.33692f,167.969f, +-230.469f,5.44334f,167.969f, +-226.563f,4.39369f,167.969f, +-222.656f,3.44146f,167.969f, +-218.75f,4.44651f,167.969f, +-214.844f,5.36701f,167.969f, +-210.938f,6.2915f,167.969f, +-207.031f,6.3588f,167.969f, +-203.125f,7.36203f,167.969f, +-199.219f,7.7957f,167.969f, +-195.313f,9.3926f,167.969f, +-191.406f,11.2699f,167.969f, +-187.5f,12.3727f,167.969f, +-183.594f,14.7022f,167.969f, +-179.688f,15.4324f,167.969f, +-175.781f,15.226f,167.969f, +-171.875f,13.6658f,167.969f, +-167.969f,14.0361f,167.969f, +-164.063f,13.5871f,167.969f, +-160.156f,14.725f,167.969f, +-156.25f,15.5452f,167.969f, +-152.344f,16.3685f,167.969f, +-148.438f,17.0213f,167.969f, +-144.531f,16.2228f,167.969f, +-140.625f,15.1123f,167.969f, +-136.719f,16.9339f,167.969f, +-132.813f,18.4025f,167.969f, +-128.906f,19.9945f,167.969f, +-125.0f,20.4069f,167.969f, +-121.094f,21.447f,167.969f, +-117.188f,22.384f,167.969f, +-113.281f,22.4822f,167.969f, +-109.375f,22.9018f,167.969f, +-105.469f,23.4936f,167.969f, +-101.563f,23.0085f,167.969f, +-97.6563f,22.8398f,167.969f, +-93.75f,23.2939f,167.969f, +-89.8438f,23.3336f,167.969f, +-85.9375f,22.6883f,167.969f, +-82.0313f,21.8752f,167.969f, +-78.125f,18.7456f,167.969f, +-74.2188f,16.5685f,167.969f, +-70.3125f,17.179f,167.969f, +-66.4063f,18.1074f,167.969f, +-62.5f,18.9865f,167.969f, +-58.5938f,17.4851f,167.969f, +-54.6875f,17.2795f,167.969f, +-50.7813f,16.9142f,167.969f, +-46.875f,17.1532f,167.969f, +-42.9688f,17.796f,167.969f, +-39.0625f,17.6868f,167.969f, +-35.1563f,16.7998f,167.969f, +-31.25f,16.0556f,167.969f, +-27.3438f,14.7864f,167.969f, +-23.4375f,16.8386f,167.969f, +-19.5313f,17.9676f,167.969f, +-15.625f,18.4144f,167.969f, +-11.7188f,18.9248f,167.969f, +-7.8125f,18.4614f,167.969f, +-3.90625f,17.2197f,167.969f, +0.0f,16.7097f,167.969f, +3.90625f,17.1455f,167.969f, +-250.0f,9.27861f,164.063f, +-246.094f,8.67875f,164.063f, +-242.188f,8.39269f,164.063f, +-238.281f,7.54041f,164.063f, +-234.375f,6.37361f,164.063f, +-230.469f,5.0066f,164.063f, +-226.563f,3.63142f,164.063f, +-222.656f,2.77898f,164.063f, +-218.75f,2.89032f,164.063f, +-214.844f,4.01591f,164.063f, +-210.938f,4.52151f,164.063f, +-207.031f,4.85596f,164.063f, +-203.125f,6.21759f,164.063f, +-199.219f,8.25574f,164.063f, +-195.313f,10.3856f,164.063f, +-191.406f,11.6593f,164.063f, +-187.5f,12.5334f,164.063f, +-183.594f,14.1044f,164.063f, +-179.688f,14.8149f,164.063f, +-175.781f,14.9916f,164.063f, +-171.875f,14.6218f,164.063f, +-167.969f,14.5374f,164.063f, +-164.063f,13.7748f,164.063f, +-160.156f,15.1069f,164.063f, +-156.25f,16.5225f,164.063f, +-152.344f,17.8264f,164.063f, +-148.438f,18.5076f,164.063f, +-144.531f,17.6099f,164.063f, +-140.625f,16.4656f,164.063f, +-136.719f,16.7761f,164.063f, +-132.813f,19.1652f,164.063f, +-128.906f,20.565f,164.063f, +-125.0f,21.7781f,164.063f, +-121.094f,22.7613f,164.063f, +-117.188f,23.5743f,164.063f, +-113.281f,23.3567f,164.063f, +-109.375f,24.4075f,164.063f, +-105.469f,24.4502f,164.063f, +-101.563f,24.044f,164.063f, +-97.6563f,24.669f,164.063f, +-93.75f,24.7946f,164.063f, +-89.8438f,23.9722f,164.063f, +-85.9375f,23.2481f,164.063f, +-82.0313f,22.4202f,164.063f, +-78.125f,19.4816f,164.063f, +-74.2188f,18.3571f,164.063f, +-70.3125f,19.3195f,164.063f, +-66.4063f,19.6276f,164.063f, +-62.5f,19.775f,164.063f, +-58.5938f,18.4049f,164.063f, +-54.6875f,17.6998f,164.063f, +-50.7813f,16.7989f,164.063f, +-46.875f,16.5351f,164.063f, +-42.9688f,16.0836f,164.063f, +-39.0625f,16.4446f,164.063f, +-35.1563f,15.0322f,164.063f, +-31.25f,14.1679f,164.063f, +-27.3438f,16.0461f,164.063f, +-23.4375f,16.985f,164.063f, +-19.5313f,17.3286f,164.063f, +-15.625f,18.477f,164.063f, +-11.7188f,17.8736f,164.063f, +-7.8125f,17.8059f,164.063f, +-3.90625f,17.2079f,164.063f, +0.0f,16.7726f,164.063f, +3.90625f,16.4621f,164.063f, +-250.0f,8.56359f,160.156f, +-246.094f,8.04536f,160.156f, +-242.188f,7.71795f,160.156f, +-238.281f,7.20369f,160.156f, +-234.375f,5.51432f,160.156f, +-230.469f,5.00541f,160.156f, +-226.563f,4.36899f,160.156f, +-222.656f,3.03865f,160.156f, +-218.75f,2.92915f,160.156f, +-214.844f,2.63693f,160.156f, +-210.938f,2.69254f,160.156f, +-207.031f,3.5578f,160.156f, +-203.125f,5.61634f,160.156f, +-199.219f,7.61065f,160.156f, +-195.313f,9.64763f,160.156f, +-191.406f,11.2848f,160.156f, +-187.5f,12.7624f,160.156f, +-183.594f,13.2875f,160.156f, +-179.688f,15.2776f,160.156f, +-175.781f,15.3268f,160.156f, +-171.875f,15.211f,160.156f, +-167.969f,14.343f,160.156f, +-164.063f,14.8683f,160.156f, +-160.156f,16.1659f,160.156f, +-156.25f,16.4538f,160.156f, +-152.344f,18.5601f,160.156f, +-148.438f,19.2615f,160.156f, +-144.531f,18.8155f,160.156f, +-140.625f,17.4377f,160.156f, +-136.719f,17.6478f,160.156f, +-132.813f,19.7168f,160.156f, +-128.906f,21.4745f,160.156f, +-125.0f,23.0596f,160.156f, +-121.094f,24.6069f,160.156f, +-117.188f,25.9676f,160.156f, +-113.281f,26.2865f,160.156f, +-109.375f,27.1441f,160.156f, +-105.469f,27.0334f,160.156f, +-101.563f,26.0567f,160.156f, +-97.6563f,26.2584f,160.156f, +-93.75f,26.2751f,160.156f, +-89.8438f,25.6929f,160.156f, +-85.9375f,24.0275f,160.156f, +-82.0313f,22.2346f,160.156f, +-78.125f,20.4728f,160.156f, +-74.2188f,19.6229f,160.156f, +-70.3125f,20.0997f,160.156f, +-66.4063f,21.118f,160.156f, +-62.5f,20.4515f,160.156f, +-58.5938f,19.4599f,160.156f, +-54.6875f,18.2081f,160.156f, +-50.7813f,16.8263f,160.156f, +-46.875f,16.3719f,160.156f, +-42.9688f,15.1416f,160.156f, +-39.0625f,14.5969f,160.156f, +-35.1563f,14.7039f,160.156f, +-31.25f,14.8314f,160.156f, +-27.3438f,16.4129f,160.156f, +-23.4375f,16.144f,160.156f, +-19.5313f,17.5764f,160.156f, +-15.625f,17.9247f,160.156f, +-11.7188f,17.0582f,160.156f, +-7.8125f,17.1554f,160.156f, +-3.90625f,16.8369f,160.156f, +0.0f,16.4316f,160.156f, +3.90625f,16.628f,160.156f, +-250.0f,7.51933f,156.25f, +-246.094f,7.63381f,156.25f, +-242.188f,7.57378f,156.25f, +-238.281f,6.94606f,156.25f, +-234.375f,4.79198f,156.25f, +-230.469f,4.43262f,156.25f, +-226.563f,4.13314f,156.25f, +-222.656f,2.75517f,156.25f, +-218.75f,2.67631f,156.25f, +-214.844f,3.321f,156.25f, +-210.938f,3.33063f,156.25f, +-207.031f,3.60719f,156.25f, +-203.125f,4.44636f,156.25f, +-199.219f,6.02108f,156.25f, +-195.313f,8.25702f,156.25f, +-191.406f,10.5762f,156.25f, +-187.5f,11.4514f,156.25f, +-183.594f,12.7361f,156.25f, +-179.688f,15.4206f,156.25f, +-175.781f,16.1997f,156.25f, +-171.875f,14.8996f,156.25f, +-167.969f,14.1118f,156.25f, +-164.063f,16.0576f,156.25f, +-160.156f,17.6078f,156.25f, +-156.25f,17.7518f,156.25f, +-152.344f,18.4278f,156.25f, +-148.438f,19.5827f,156.25f, +-144.531f,19.2756f,156.25f, +-140.625f,18.2888f,156.25f, +-136.719f,18.7157f,156.25f, +-132.813f,20.4669f,156.25f, +-128.906f,22.5748f,156.25f, +-125.0f,24.648f,156.25f, +-121.094f,27.1223f,156.25f, +-117.188f,28.0709f,156.25f, +-113.281f,28.4982f,156.25f, +-109.375f,29.0927f,156.25f, +-105.469f,29.2755f,156.25f, +-101.563f,28.9208f,156.25f, +-97.6563f,28.3829f,156.25f, +-93.75f,26.8508f,156.25f, +-89.8438f,25.9621f,156.25f, +-85.9375f,24.2707f,156.25f, +-82.0313f,22.6235f,156.25f, +-78.125f,21.9368f,156.25f, +-74.2188f,21.0831f,156.25f, +-70.3125f,21.368f,156.25f, +-66.4063f,21.3333f,156.25f, +-62.5f,20.5296f,156.25f, +-58.5938f,19.98f,156.25f, +-54.6875f,18.5818f,156.25f, +-50.7813f,17.2025f,156.25f, +-46.875f,16.1859f,156.25f, +-42.9688f,14.4559f,156.25f, +-39.0625f,13.7597f,156.25f, +-35.1563f,14.6354f,156.25f, +-31.25f,15.6213f,156.25f, +-27.3438f,15.683f,156.25f, +-23.4375f,16.5331f,156.25f, +-19.5313f,16.8272f,156.25f, +-15.625f,16.551f,156.25f, +-11.7188f,16.34f,156.25f, +-7.8125f,16.4067f,156.25f, +-3.90625f,15.8725f,156.25f, +0.0f,16.3451f,156.25f, +3.90625f,16.9346f,156.25f, +-250.0f,6.48899f,152.344f, +-246.094f,6.4047f,152.344f, +-242.188f,6.57203f,152.344f, +-238.281f,5.4628f,152.344f, +-234.375f,4.20753f,152.344f, +-230.469f,2.81156f,152.344f, +-226.563f,1.88132f,152.344f, +-222.656f,1.57153f,152.344f, +-218.75f,2.48106f,152.344f, +-214.844f,2.88884f,152.344f, +-210.938f,2.63578f,152.344f, +-207.031f,2.9717f,152.344f, +-203.125f,3.6084f,152.344f, +-199.219f,3.99032f,152.344f, +-195.313f,7.36858f,152.344f, +-191.406f,9.54951f,152.344f, +-187.5f,10.6254f,152.344f, +-183.594f,12.3317f,152.344f, +-179.688f,14.015f,152.344f, +-175.781f,14.8857f,152.344f, +-171.875f,14.9944f,152.344f, +-167.969f,14.7547f,152.344f, +-164.063f,16.7748f,152.344f, +-160.156f,18.5461f,152.344f, +-156.25f,19.5932f,152.344f, +-152.344f,19.1033f,152.344f, +-148.438f,19.012f,152.344f, +-144.531f,19.4428f,152.344f, +-140.625f,19.3453f,152.344f, +-136.719f,20.6611f,152.344f, +-132.813f,22.2914f,152.344f, +-128.906f,24.3802f,152.344f, +-125.0f,26.4048f,152.344f, +-121.094f,28.3525f,152.344f, +-117.188f,30.0561f,152.344f, +-113.281f,30.1155f,152.344f, +-109.375f,30.9005f,152.344f, +-105.469f,30.8767f,152.344f, +-101.563f,30.9056f,152.344f, +-97.6563f,30.3635f,152.344f, +-93.75f,28.3996f,152.344f, +-89.8438f,25.8081f,152.344f, +-85.9375f,24.3731f,152.344f, +-82.0313f,22.7783f,152.344f, +-78.125f,22.5973f,152.344f, +-74.2188f,21.8359f,152.344f, +-70.3125f,21.4903f,152.344f, +-66.4063f,21.0461f,152.344f, +-62.5f,19.9934f,152.344f, +-58.5938f,19.4729f,152.344f, +-54.6875f,18.1265f,152.344f, +-50.7813f,16.4684f,152.344f, +-46.875f,15.0104f,152.344f, +-42.9688f,13.8642f,152.344f, +-39.0625f,14.8875f,152.344f, +-35.1563f,15.117f,152.344f, +-31.25f,15.0707f,152.344f, +-27.3438f,15.3829f,152.344f, +-23.4375f,15.5218f,152.344f, +-19.5313f,15.215f,152.344f, +-15.625f,15.2099f,152.344f, +-11.7188f,15.5383f,152.344f, +-7.8125f,15.6462f,152.344f, +-3.90625f,15.3096f,152.344f, +0.0f,16.3854f,152.344f, +3.90625f,17.6952f,152.344f, +-250.0f,5.17712f,148.438f, +-246.094f,4.67214f,148.438f, +-242.188f,4.31659f,148.438f, +-238.281f,3.2191f,148.438f, +-234.375f,2.13365f,148.438f, +-230.469f,1.19555f,148.438f, +-226.563f,0.110638f,148.438f, +-222.656f,0.945025f,148.438f, +-218.75f,1.43378f,148.438f, +-214.844f,2.06915f,148.438f, +-210.938f,2.27715f,148.438f, +-207.031f,2.23051f,148.438f, +-203.125f,2.64045f,148.438f, +-199.219f,2.99575f,148.438f, +-195.313f,5.40402f,148.438f, +-191.406f,8.03643f,148.438f, +-187.5f,10.0212f,148.438f, +-183.594f,12.2205f,148.438f, +-179.688f,14.1884f,148.438f, +-175.781f,14.5505f,148.438f, +-171.875f,15.188f,148.438f, +-167.969f,15.2222f,148.438f, +-164.063f,17.4791f,148.438f, +-160.156f,19.6158f,148.438f, +-156.25f,20.2107f,148.438f, +-152.344f,20.552f,148.438f, +-148.438f,20.2463f,148.438f, +-144.531f,20.4526f,148.438f, +-140.625f,20.9426f,148.438f, +-136.719f,22.6331f,148.438f, +-132.813f,25.1345f,148.438f, +-128.906f,27.0299f,148.438f, +-125.0f,29.381f,148.438f, +-121.094f,31.0494f,148.438f, +-117.188f,31.7246f,148.438f, +-113.281f,31.9331f,148.438f, +-109.375f,31.9517f,148.438f, +-105.469f,32.217f,148.438f, +-101.563f,31.9001f,148.438f, +-97.6563f,30.471f,148.438f, +-93.75f,28.6143f,148.438f, +-89.8438f,26.5696f,148.438f, +-85.9375f,24.7785f,148.438f, +-82.0313f,23.3248f,148.438f, +-78.125f,22.2737f,148.438f, +-74.2188f,22.0395f,148.438f, +-70.3125f,21.4879f,148.438f, +-66.4063f,20.5539f,148.438f, +-62.5f,19.3981f,148.438f, +-58.5938f,18.0902f,148.438f, +-54.6875f,16.6154f,148.438f, +-50.7813f,15.8338f,148.438f, +-46.875f,14.0809f,148.438f, +-42.9688f,12.8188f,148.438f, +-39.0625f,14.0819f,148.438f, +-35.1563f,14.3673f,148.438f, +-31.25f,14.2973f,148.438f, +-27.3438f,15.1616f,148.438f, +-23.4375f,13.9458f,148.438f, +-19.5313f,14.9412f,148.438f, +-15.625f,15.4488f,148.438f, +-11.7188f,15.3397f,148.438f, +-7.8125f,15.0356f,148.438f, +-3.90625f,15.6431f,148.438f, +0.0f,16.6218f,148.438f, +3.90625f,18.4109f,148.438f, +-250.0f,5.38918f,144.531f, +-246.094f,4.29322f,144.531f, +-242.188f,2.99843f,144.531f, +-238.281f,2.80561f,144.531f, +-234.375f,1.65282f,144.531f, +-230.469f,-0.268879f,144.531f, +-226.563f,-0.474469f,144.531f, +-222.656f,-0.0607398f,144.531f, +-218.75f,0.859532f,144.531f, +-214.844f,1.28455f,144.531f, +-210.938f,1.69755f,144.531f, +-207.031f,2.1277f,144.531f, +-203.125f,2.92014f,144.531f, +-199.219f,3.85473f,144.531f, +-195.313f,4.38999f,144.531f, +-191.406f,6.72101f,144.531f, +-187.5f,9.24433f,144.531f, +-183.594f,11.6027f,144.531f, +-179.688f,13.2042f,144.531f, +-175.781f,14.6647f,144.531f, +-171.875f,14.7252f,144.531f, +-167.969f,16.1425f,144.531f, +-164.063f,18.1823f,144.531f, +-160.156f,19.9802f,144.531f, +-156.25f,22.2009f,144.531f, +-152.344f,21.9313f,144.531f, +-148.438f,22.3421f,144.531f, +-144.531f,21.6393f,144.531f, +-140.625f,23.0621f,144.531f, +-136.719f,24.695f,144.531f, +-132.813f,26.6159f,144.531f, +-128.906f,29.9912f,144.531f, +-125.0f,31.6471f,144.531f, +-121.094f,32.4919f,144.531f, +-117.188f,32.9775f,144.531f, +-113.281f,33.1587f,144.531f, +-109.375f,33.0247f,144.531f, +-105.469f,32.4654f,144.531f, +-101.563f,31.5009f,144.531f, +-97.6563f,30.2211f,144.531f, +-93.75f,28.3655f,144.531f, +-89.8438f,26.6696f,144.531f, +-85.9375f,25.6101f,144.531f, +-82.0313f,23.5563f,144.531f, +-78.125f,21.8779f,144.531f, +-74.2188f,21.4789f,144.531f, +-70.3125f,21.2134f,144.531f, +-66.4063f,20.0494f,144.531f, +-62.5f,19.4674f,144.531f, +-58.5938f,17.3288f,144.531f, +-54.6875f,16.7337f,144.531f, +-50.7813f,15.9259f,144.531f, +-46.875f,14.3007f,144.531f, +-42.9688f,13.3631f,144.531f, +-39.0625f,12.7904f,144.531f, +-35.1563f,13.6627f,144.531f, +-31.25f,13.6872f,144.531f, +-27.3438f,14.0818f,144.531f, +-23.4375f,13.953f,144.531f, +-19.5313f,14.0386f,144.531f, +-15.625f,14.1249f,144.531f, +-11.7188f,14.1069f,144.531f, +-7.8125f,14.4968f,144.531f, +-3.90625f,15.4283f,144.531f, +0.0f,16.5593f,144.531f, +3.90625f,17.8758f,144.531f, +-250.0f,5.32443f,140.625f, +-246.094f,4.53202f,140.625f, +-242.188f,2.85351f,140.625f, +-238.281f,1.48443f,140.625f, +-234.375f,0.193579f,140.625f, +-230.469f,-0.0240196f,140.625f, +-226.563f,-0.195521f,140.625f, +-222.656f,-0.525286f,140.625f, +-218.75f,0.255241f,140.625f, +-214.844f,0.505993f,140.625f, +-210.938f,1.2501f,140.625f, +-207.031f,2.77282f,140.625f, +-203.125f,3.23678f,140.625f, +-199.219f,3.81665f,140.625f, +-195.313f,4.45749f,140.625f, +-191.406f,6.57237f,140.625f, +-187.5f,8.78049f,140.625f, +-183.594f,10.653f,140.625f, +-179.688f,12.1762f,140.625f, +-175.781f,13.836f,140.625f, +-171.875f,14.4421f,140.625f, +-167.969f,16.2272f,140.625f, +-164.063f,17.8194f,140.625f, +-160.156f,20.3268f,140.625f, +-156.25f,21.6942f,140.625f, +-152.344f,21.8506f,140.625f, +-148.438f,22.857f,140.625f, +-144.531f,23.0189f,140.625f, +-140.625f,24.7041f,140.625f, +-136.719f,26.468f,140.625f, +-132.813f,28.6459f,140.625f, +-128.906f,30.9708f,140.625f, +-125.0f,33.2917f,140.625f, +-121.094f,34.9879f,140.625f, +-117.188f,34.5936f,140.625f, +-113.281f,34.2431f,140.625f, +-109.375f,33.7219f,140.625f, +-105.469f,32.9679f,140.625f, +-101.563f,31.3296f,140.625f, +-97.6563f,30.0001f,140.625f, +-93.75f,28.0182f,140.625f, +-89.8438f,26.2542f,140.625f, +-85.9375f,24.9632f,140.625f, +-82.0313f,23.5598f,140.625f, +-78.125f,21.3613f,140.625f, +-74.2188f,20.8425f,140.625f, +-70.3125f,20.6976f,140.625f, +-66.4063f,19.4459f,140.625f, +-62.5f,17.9969f,140.625f, +-58.5938f,17.2754f,140.625f, +-54.6875f,16.763f,140.625f, +-50.7813f,15.8668f,140.625f, +-46.875f,15.2278f,140.625f, +-42.9688f,14.0988f,140.625f, +-39.0625f,13.4132f,140.625f, +-35.1563f,12.9004f,140.625f, +-31.25f,12.6267f,140.625f, +-27.3438f,12.7032f,140.625f, +-23.4375f,12.0508f,140.625f, +-19.5313f,12.8332f,140.625f, +-15.625f,12.2269f,140.625f, +-11.7188f,12.2256f,140.625f, +-7.8125f,13.9086f,140.625f, +-3.90625f,15.559f,140.625f, +0.0f,16.8086f,140.625f, +3.90625f,18.5798f,140.625f, +-250.0f,4.69677f,136.719f, +-246.094f,3.45683f,136.719f, +-242.188f,1.81964f,136.719f, +-238.281f,1.13059f,136.719f, +-234.375f,0.535221f,136.719f, +-230.469f,0.868904f,136.719f, +-226.563f,0.574251f,136.719f, +-222.656f,0.279368f,136.719f, +-218.75f,-1.1876f,136.719f, +-214.844f,-0.688708f,136.719f, +-210.938f,0.470686f,136.719f, +-207.031f,2.00488f,136.719f, +-203.125f,3.42644f,136.719f, +-199.219f,4.20503f,136.719f, +-195.313f,5.23588f,136.719f, +-191.406f,6.02424f,136.719f, +-187.5f,7.96541f,136.719f, +-183.594f,10.5299f,136.719f, +-179.688f,12.0941f,136.719f, +-175.781f,13.5058f,136.719f, +-171.875f,14.8816f,136.719f, +-167.969f,16.551f,136.719f, +-164.063f,17.712f,136.719f, +-160.156f,19.6536f,136.719f, +-156.25f,21.4322f,136.719f, +-152.344f,22.672f,136.719f, +-148.438f,23.3463f,136.719f, +-144.531f,24.5334f,136.719f, +-140.625f,26.061f,136.719f, +-136.719f,27.7423f,136.719f, +-132.813f,30.1692f,136.719f, +-128.906f,33.3739f,136.719f, +-125.0f,34.9742f,136.719f, +-121.094f,35.9387f,136.719f, +-117.188f,36.0925f,136.719f, +-113.281f,35.6549f,136.719f, +-109.375f,34.5646f,136.719f, +-105.469f,34.6062f,136.719f, +-101.563f,32.8375f,136.719f, +-97.6563f,30.2678f,136.719f, +-93.75f,27.2213f,136.719f, +-89.8438f,26.1126f,136.719f, +-85.9375f,24.9965f,136.719f, +-82.0313f,22.5841f,136.719f, +-78.125f,21.7213f,136.719f, +-74.2188f,21.534f,136.719f, +-70.3125f,20.5652f,136.719f, +-66.4063f,19.032f,136.719f, +-62.5f,17.4252f,136.719f, +-58.5938f,16.7783f,136.719f, +-54.6875f,15.9619f,136.719f, +-50.7813f,14.8707f,136.719f, +-46.875f,14.3143f,136.719f, +-42.9688f,13.8793f,136.719f, +-39.0625f,12.6352f,136.719f, +-35.1563f,12.0433f,136.719f, +-31.25f,11.8551f,136.719f, +-27.3438f,12.0193f,136.719f, +-23.4375f,11.2795f,136.719f, +-19.5313f,11.6002f,136.719f, +-15.625f,10.9143f,136.719f, +-11.7188f,12.1473f,136.719f, +-7.8125f,14.3093f,136.719f, +-3.90625f,16.245f,136.719f, +0.0f,17.3141f,136.719f, +3.90625f,19.7224f,136.719f, +-250.0f,3.94613f,132.813f, +-246.094f,2.33247f,132.813f, +-242.188f,1.96569f,132.813f, +-238.281f,1.1741f,132.813f, +-234.375f,0.606142f,132.813f, +-230.469f,0.00901447f,132.813f, +-226.563f,0.143339f,132.813f, +-222.656f,-0.356031f,132.813f, +-218.75f,-1.55439f,132.813f, +-214.844f,-1.22801f,132.813f, +-210.938f,-0.390443f,132.813f, +-207.031f,1.15349f,132.813f, +-203.125f,2.6275f,132.813f, +-199.219f,3.55895f,132.813f, +-195.313f,4.99281f,132.813f, +-191.406f,4.99673f,132.813f, +-187.5f,6.96468f,132.813f, +-183.594f,10.0691f,132.813f, +-179.688f,12.3783f,132.813f, +-175.781f,13.2459f,132.813f, +-171.875f,14.3637f,132.813f, +-167.969f,16.3222f,132.813f, +-164.063f,17.6984f,132.813f, +-160.156f,19.3295f,132.813f, +-156.25f,20.9768f,132.813f, +-152.344f,23.1452f,132.813f, +-148.438f,23.885f,132.813f, +-144.531f,24.7169f,132.813f, +-140.625f,27.1655f,132.813f, +-136.719f,29.0232f,132.813f, +-132.813f,30.2573f,132.813f, +-128.906f,33.5563f,132.813f, +-125.0f,35.1858f,132.813f, +-121.094f,36.4332f,132.813f, +-117.188f,36.6359f,132.813f, +-113.281f,36.0253f,132.813f, +-109.375f,34.7127f,132.813f, +-105.469f,34.6833f,132.813f, +-101.563f,33.7208f,132.813f, +-97.6563f,30.9809f,132.813f, +-93.75f,27.9091f,132.813f, +-89.8438f,25.709f,132.813f, +-85.9375f,24.452f,132.813f, +-82.0313f,22.4897f,132.813f, +-78.125f,22.0485f,132.813f, +-74.2188f,22.1517f,132.813f, +-70.3125f,20.4874f,132.813f, +-66.4063f,19.0482f,132.813f, +-62.5f,17.1019f,132.813f, +-58.5938f,16.7815f,132.813f, +-54.6875f,15.1253f,132.813f, +-50.7813f,14.5074f,132.813f, +-46.875f,12.7631f,132.813f, +-42.9688f,12.6595f,132.813f, +-39.0625f,11.9406f,132.813f, +-35.1563f,11.7459f,132.813f, +-31.25f,10.8406f,132.813f, +-27.3438f,11.0393f,132.813f, +-23.4375f,10.4798f,132.813f, +-19.5313f,10.8165f,132.813f, +-15.625f,12.4368f,132.813f, +-11.7188f,13.2405f,132.813f, +-7.8125f,14.9282f,132.813f, +-3.90625f,16.4449f,132.813f, +0.0f,17.8238f,132.813f, +3.90625f,19.9574f,132.813f, +-250.0f,2.5744f,128.906f, +-246.094f,2.12474f,128.906f, +-242.188f,0.674823f,128.906f, +-238.281f,-0.305135f,128.906f, +-234.375f,-0.948647f,128.906f, +-230.469f,-0.982836f,128.906f, +-226.563f,-1.17369f,128.906f, +-222.656f,-1.48697f,128.906f, +-218.75f,-2.23137f,128.906f, +-214.844f,-2.13825f,128.906f, +-210.938f,-1.06826f,128.906f, +-207.031f,0.0666403f,128.906f, +-203.125f,1.15717f,128.906f, +-199.219f,3.14762f,128.906f, +-195.313f,4.08858f,128.906f, +-191.406f,5.07728f,128.906f, +-187.5f,8.06699f,128.906f, +-183.594f,10.7473f,128.906f, +-179.688f,12.0801f,128.906f, +-175.781f,13.1617f,128.906f, +-171.875f,14.5283f,128.906f, +-167.969f,15.8148f,128.906f, +-164.063f,16.9067f,128.906f, +-160.156f,18.6293f,128.906f, +-156.25f,20.8869f,128.906f, +-152.344f,22.6168f,128.906f, +-148.438f,23.9359f,128.906f, +-144.531f,26.521f,128.906f, +-140.625f,27.4381f,128.906f, +-136.719f,29.5698f,128.906f, +-132.813f,30.681f,128.906f, +-128.906f,33.28f,128.906f, +-125.0f,35.3433f,128.906f, +-121.094f,36.3509f,128.906f, +-117.188f,36.2098f,128.906f, +-113.281f,35.157f,128.906f, +-109.375f,35.3884f,128.906f, +-105.469f,35.7158f,128.906f, +-101.563f,34.3449f,128.906f, +-97.6563f,32.5198f,128.906f, +-93.75f,29.0611f,128.906f, +-89.8438f,25.9945f,128.906f, +-85.9375f,24.2624f,128.906f, +-82.0313f,23.0248f,128.906f, +-78.125f,21.6012f,128.906f, +-74.2188f,21.0399f,128.906f, +-70.3125f,20.1719f,128.906f, +-66.4063f,18.6862f,128.906f, +-62.5f,17.3287f,128.906f, +-58.5938f,16.0916f,128.906f, +-54.6875f,14.1153f,128.906f, +-50.7813f,12.6292f,128.906f, +-46.875f,12.0431f,128.906f, +-42.9688f,11.4785f,128.906f, +-39.0625f,11.911f,128.906f, +-35.1563f,11.6609f,128.906f, +-31.25f,10.4332f,128.906f, +-27.3438f,9.68026f,128.906f, +-23.4375f,9.84506f,128.906f, +-19.5313f,11.6097f,128.906f, +-15.625f,13.2944f,128.906f, +-11.7188f,14.0518f,128.906f, +-7.8125f,15.2998f,128.906f, +-3.90625f,16.8731f,128.906f, +0.0f,18.0594f,128.906f, +3.90625f,20.0876f,128.906f, +-250.0f,2.47782f,125.0f, +-246.094f,1.27263f,125.0f, +-242.188f,-0.535855f,125.0f, +-238.281f,-1.33089f,125.0f, +-234.375f,-1.63273f,125.0f, +-230.469f,-2.30607f,125.0f, +-226.563f,-2.13647f,125.0f, +-222.656f,-2.95807f,125.0f, +-218.75f,-2.92133f,125.0f, +-214.844f,-3.33811f,125.0f, +-210.938f,-2.29807f,125.0f, +-207.031f,-0.860766f,125.0f, +-203.125f,0.507027f,125.0f, +-199.219f,1.54044f,125.0f, +-195.313f,3.32139f,125.0f, +-191.406f,5.76593f,125.0f, +-187.5f,8.17548f,125.0f, +-183.594f,10.5223f,125.0f, +-179.688f,11.4741f,125.0f, +-175.781f,12.3545f,125.0f, +-171.875f,13.5542f,125.0f, +-167.969f,14.4358f,125.0f, +-164.063f,16.6197f,125.0f, +-160.156f,18.7561f,125.0f, +-156.25f,21.2618f,125.0f, +-152.344f,22.9541f,125.0f, +-148.438f,24.7574f,125.0f, +-144.531f,26.8375f,125.0f, +-140.625f,28.3307f,125.0f, +-136.719f,29.2598f,125.0f, +-132.813f,31.2334f,125.0f, +-128.906f,32.9236f,125.0f, +-125.0f,34.4853f,125.0f, +-121.094f,35.1589f,125.0f, +-117.188f,34.4655f,125.0f, +-113.281f,35.7692f,125.0f, +-109.375f,35.9985f,125.0f, +-105.469f,35.7974f,125.0f, +-101.563f,34.6099f,125.0f, +-97.6563f,32.4066f,125.0f, +-93.75f,28.8398f,125.0f, +-89.8438f,26.014f,125.0f, +-85.9375f,25.0319f,125.0f, +-82.0313f,23.7685f,125.0f, +-78.125f,22.4099f,125.0f, +-74.2188f,20.9166f,125.0f, +-70.3125f,19.1502f,125.0f, +-66.4063f,17.8355f,125.0f, +-62.5f,16.5146f,125.0f, +-58.5938f,14.9189f,125.0f, +-54.6875f,13.2423f,125.0f, +-50.7813f,12.2568f,125.0f, +-46.875f,11.4853f,125.0f, +-42.9688f,10.7795f,125.0f, +-39.0625f,10.3251f,125.0f, +-35.1563f,10.4077f,125.0f, +-31.25f,9.96202f,125.0f, +-27.3438f,9.77658f,125.0f, +-23.4375f,10.6703f,125.0f, +-19.5313f,12.2058f,125.0f, +-15.625f,13.8385f,125.0f, +-11.7188f,15.1556f,125.0f, +-7.8125f,15.7626f,125.0f, +-3.90625f,16.911f,125.0f, +0.0f,18.0803f,125.0f, +3.90625f,18.9654f,125.0f, +-250.0f,1.97449f,121.094f, +-246.094f,1.28169f,121.094f, +-242.188f,0.0699786f,121.094f, +-238.281f,-1.31551f,121.094f, +-234.375f,-2.33115f,121.094f, +-230.469f,-3.19445f,121.094f, +-226.563f,-3.91693f,121.094f, +-222.656f,-4.0298f,121.094f, +-218.75f,-4.334f,121.094f, +-214.844f,-3.5405f,121.094f, +-210.938f,-2.70043f,121.094f, +-207.031f,-2.86125f,121.094f, +-203.125f,-1.24727f,121.094f, +-199.219f,0.20797f,121.094f, +-195.313f,2.52573f,121.094f, +-191.406f,4.8544f,121.094f, +-187.5f,7.37504f,121.094f, +-183.594f,9.40828f,121.094f, +-179.688f,11.0747f,121.094f, +-175.781f,11.9892f,121.094f, +-171.875f,12.3358f,121.094f, +-167.969f,13.2084f,121.094f, +-164.063f,15.8626f,121.094f, +-160.156f,18.1098f,121.094f, +-156.25f,20.2905f,121.094f, +-152.344f,22.8183f,121.094f, +-148.438f,25.3439f,121.094f, +-144.531f,26.7908f,121.094f, +-140.625f,29.0959f,121.094f, +-136.719f,29.9478f,121.094f, +-132.813f,30.8054f,121.094f, +-128.906f,31.9545f,121.094f, +-125.0f,33.8025f,121.094f, +-121.094f,35.2826f,121.094f, +-117.188f,36.2373f,121.094f, +-113.281f,36.7861f,121.094f, +-109.375f,36.509f,121.094f, +-105.469f,35.7461f,121.094f, +-101.563f,33.7802f,121.094f, +-97.6563f,30.788f,121.094f, +-93.75f,28.1422f,121.094f, +-89.8438f,26.6316f,121.094f, +-85.9375f,26.0349f,121.094f, +-82.0313f,24.8022f,121.094f, +-78.125f,23.5217f,121.094f, +-74.2188f,21.74f,121.094f, +-70.3125f,20.0101f,121.094f, +-66.4063f,17.8705f,121.094f, +-62.5f,15.6785f,121.094f, +-58.5938f,13.74f,121.094f, +-54.6875f,12.3387f,121.094f, +-50.7813f,11.9457f,121.094f, +-46.875f,12.0102f,121.094f, +-42.9688f,11.0065f,121.094f, +-39.0625f,9.84571f,121.094f, +-35.1563f,10.0894f,121.094f, +-31.25f,10.5366f,121.094f, +-27.3438f,9.94957f,121.094f, +-23.4375f,11.0038f,121.094f, +-19.5313f,12.8084f,121.094f, +-15.625f,13.8969f,121.094f, +-11.7188f,14.9146f,121.094f, +-7.8125f,15.4187f,121.094f, +-3.90625f,16.094f,121.094f, +0.0f,17.0612f,121.094f, +3.90625f,18.5327f,121.094f, +-250.0f,2.18397f,117.188f, +-246.094f,1.51628f,117.188f, +-242.188f,0.628327f,117.188f, +-238.281f,-0.567933f,117.188f, +-234.375f,-2.01568f,117.188f, +-230.469f,-3.41089f,117.188f, +-226.563f,-3.82758f,117.188f, +-222.656f,-5.01586f,117.188f, +-218.75f,-4.74822f,117.188f, +-214.844f,-3.30853f,117.188f, +-210.938f,-2.32499f,117.188f, +-207.031f,-1.71509f,117.188f, +-203.125f,-1.19203f,117.188f, +-199.219f,0.219498f,117.188f, +-195.313f,1.66304f,117.188f, +-191.406f,4.35105f,117.188f, +-187.5f,6.33228f,117.188f, +-183.594f,8.00972f,117.188f, +-179.688f,9.71486f,117.188f, +-175.781f,10.7727f,117.188f, +-171.875f,11.358f,117.188f, +-167.969f,12.5239f,117.188f, +-164.063f,14.6278f,117.188f, +-160.156f,17.2069f,117.188f, +-156.25f,19.9779f,117.188f, +-152.344f,23.4607f,117.188f, +-148.438f,26.6108f,117.188f, +-144.531f,28.4635f,117.188f, +-140.625f,29.7705f,117.188f, +-136.719f,31.0684f,117.188f, +-132.813f,31.8395f,117.188f, +-128.906f,32.1658f,117.188f, +-125.0f,34.7478f,117.188f, +-121.094f,36.0624f,117.188f, +-117.188f,37.2702f,117.188f, +-113.281f,37.3474f,117.188f, +-109.375f,37.242f,117.188f, +-105.469f,36.1544f,117.188f, +-101.563f,33.403f,117.188f, +-97.6563f,31.294f,117.188f, +-93.75f,29.4961f,117.188f, +-89.8438f,29.0556f,117.188f, +-85.9375f,28.2757f,117.188f, +-82.0313f,26.6322f,117.188f, +-78.125f,24.8286f,117.188f, +-74.2188f,22.7019f,117.188f, +-70.3125f,20.4725f,117.188f, +-66.4063f,17.984f,117.188f, +-62.5f,16.3033f,117.188f, +-58.5938f,14.2087f,117.188f, +-54.6875f,12.8086f,117.188f, +-50.7813f,12.5463f,117.188f, +-46.875f,12.1781f,117.188f, +-42.9688f,11.1391f,117.188f, +-39.0625f,10.4623f,117.188f, +-35.1563f,11.0528f,117.188f, +-31.25f,11.454f,117.188f, +-27.3438f,10.5577f,117.188f, +-23.4375f,10.6328f,117.188f, +-19.5313f,12.5569f,117.188f, +-15.625f,13.5389f,117.188f, +-11.7188f,14.3792f,117.188f, +-7.8125f,15.4809f,117.188f, +-3.90625f,16.1008f,117.188f, +0.0f,17.3675f,117.188f, +3.90625f,18.919f,117.188f, +}; + +btScalar Landscape06Nml[] = { +-0.373915f,0.891474f,-0.255855f, +-0.31015f,0.793525f,-0.52357f, +-0.450332f,0.86393f,-0.225447f, +-0.404472f,0.777981f,-0.480778f, +-0.557629f,0.811458f,-0.174885f, +-0.428564f,0.86234f,-0.269633f, +-0.414608f,0.909847f,-0.0166634f, +-0.208047f,0.971233f,0.115854f, +-0.328757f,0.932331f,0.150588f, +-0.263029f,0.937991f,0.225808f, +-0.409412f,0.900937f,0.143853f, +-0.455309f,0.881347f,0.126178f, +-0.31951f,0.943247f,0.0905511f, +-0.33825f,0.934582f,0.1102f, +-0.183669f,0.981438f,0.0551769f, +-0.208308f,0.97293f,0.100072f, +-0.189578f,0.981862f,-0.00282566f, +-0.201983f,0.97649f,0.0752952f, +-0.0672914f,0.99749f,-0.0220572f, +-0.118523f,0.991949f,0.0446084f, +0.102757f,0.986595f,-0.126773f, +0.00122687f,0.992675f,-0.120808f, +0.0798054f,0.967751f,-0.238933f, +0.00875196f,0.978629f,-0.205448f, +0.141554f,0.932155f,-0.333242f, +0.0918343f,0.965319f,-0.244387f, +0.372959f,0.842559f,-0.388582f, +0.280191f,0.875069f,-0.394647f, +0.314921f,0.849656f,-0.422977f, +0.258676f,0.813335f,-0.521127f, +0.266443f,0.876708f,-0.400489f, +0.358307f,0.856764f,-0.370907f, +0.280512f,0.913716f,-0.293999f, +0.337561f,0.857178f,-0.388971f, +0.0927666f,0.994197f,-0.0544758f, +0.155544f,0.953116f,-0.259567f, +-0.18671f,0.979157f,-0.0799463f, +-0.20939f,0.930283f,-0.301212f, +-0.117108f,0.986639f,-0.113269f, +-0.190516f,0.897405f,-0.397956f, +-0.0703231f,0.977433f,-0.199199f, +-0.142735f,0.82748f,-0.54305f, +-0.00706444f,0.969596f,-0.244609f, +0.0216131f,0.85384f,-0.520087f, +-0.100606f,0.961424f,-0.256011f, +0.00977565f,0.925054f,-0.379709f, +-0.0412166f,0.978641f,-0.201403f, +0.099113f,0.987693f,-0.12099f, +0.0911178f,0.982669f,-0.16143f, +0.0730708f,0.986329f,-0.147703f, +0.114859f,0.978874f,-0.169152f, +0.109302f,0.983788f,-0.142175f, +0.116167f,0.976713f,-0.180378f, +0.0784892f,0.966143f,-0.24578f, +0.0196949f,0.987682f,-0.155232f, +0.0258077f,0.978923f,-0.202593f, +-0.0161862f,0.979217f,-0.202168f, +-0.120896f,0.935381f,-0.332336f, +-0.0291128f,0.941335f,-0.336215f, +-0.0776893f,0.901631f,-0.425472f, +-0.0768763f,0.919716f,-0.384983f, +-0.0462705f,0.951989f,-0.302615f, +-0.0260847f,0.891121f,-0.453016f, +-0.0818404f,0.911776f,-0.40245f, +0.152271f,0.86407f,-0.479789f, +0.0880729f,0.874485f,-0.476991f, +0.11644f,0.855496f,-0.504548f, +0.0395982f,0.813262f,-0.580548f, +0.00631598f,0.857568f,-0.514332f, +-0.0780909f,0.759651f,-0.645626f, +-0.0538158f,0.822232f,-0.566603f, +0.0102932f,0.785194f,-0.619165f, +-0.00905015f,0.879608f,-0.475613f, +0.0439442f,0.825793f,-0.562259f, +-0.15058f,0.877556f,-0.455216f, +-0.0080088f,0.902753f,-0.430085f, +-0.112334f,0.946952f,-0.301104f, +0.00843129f,0.966084f,-0.258092f, +-0.0520095f,0.981628f,-0.183579f, +-0.0023169f,0.970009f,-0.243057f, +-0.0302799f,0.995335f,-0.0916051f, +0.0376961f,0.991328f,-0.125888f, +0.0852061f,0.995425f,-0.0432221f, +0.156966f,0.986644f,0.0435404f, +0.21491f,0.973384f,-0.079613f, +0.060548f,0.977921f,-0.200013f, +0.158822f,0.967125f,-0.198606f, +0.134591f,0.957423f,-0.255396f, +0.121293f,0.978974f,-0.164008f, +0.108432f,0.947609f,-0.300465f, +0.0857608f,0.988377f,-0.125519f, +0.0956294f,0.951748f,-0.291599f, +-0.0286686f,0.995404f,-0.0913747f, +0.0793846f,0.975448f,-0.205424f, +0.106071f,0.990697f,0.085251f, +0.292453f,0.941038f,0.170056f, +0.371746f,0.914213f,0.161306f, +0.341006f,0.933768f,0.108596f, +0.372402f,0.920827f,0.115737f, +0.298439f,0.950662f,-0.0847083f, +0.211549f,0.974139f,0.0793788f, +0.255698f,0.96634f,-0.0283838f, +-0.0706076f,0.991212f,0.111867f, +0.0490836f,0.977096f,0.207063f, +-0.256838f,0.950876f,0.172827f, +-0.168627f,0.937168f,0.30542f, +-0.0642391f,0.963856f,0.258562f, +-0.00196823f,0.905532f,0.424274f, +0.182795f,0.945782f,0.268481f, +0.13515f,0.919671f,0.368699f, +0.107184f,0.970151f,0.217528f, +0.00985613f,0.977921f,0.208742f, +0.0734564f,0.98632f,0.147572f, +0.067487f,0.972043f,0.224896f, +0.20672f,0.968081f,0.141727f, +0.186648f,0.970679f,0.151478f, +0.213561f,0.965286f,0.150383f, +0.189498f,0.980689f,0.0483704f, +0.277013f,0.94213f,0.188824f, +0.316429f,0.927757f,0.197839f, +0.225121f,0.964838f,0.135677f, +0.124434f,0.992109f,0.0153398f, +0.14416f,0.987262f,0.0673169f, +0.128154f,0.991727f,-0.0073791f, +0.1809f,0.982671f,0.0404037f, +0.125271f,0.99083f,-0.0506329f, +0.117639f,0.992303f,-0.0386759f, +0.0449726f,0.973305f,-0.225068f, +0.124809f,0.992058f,0.0156083f, +0.127135f,0.958258f,-0.256082f, +0.171896f,0.982167f,0.0761593f, +0.160304f,0.951991f,-0.260798f, +-0.494953f,0.868907f,-0.00477061f, +-0.512017f,0.856533f,0.0647248f, +-0.564588f,0.823588f,0.0542513f, +-0.480746f,0.876502f,0.0250513f, +-0.397786f,0.91419f,0.0776024f, +-0.3922f,0.916181f,0.0824136f, +-0.288362f,0.955571f,0.0610852f, +-0.109541f,0.991807f,0.0657195f, +-0.119597f,0.99188f,-0.0432477f, +-0.0246849f,0.992746f,-0.117673f, +0.197846f,0.964215f,-0.176481f, +0.198977f,0.940868f,-0.274182f, +0.288209f,0.884317f,-0.367314f, +0.309487f,0.847917f,-0.430411f, +0.274335f,0.939851f,-0.20352f, +0.256503f,0.958634f,-0.123399f, +0.0454718f,0.993939f,-0.100084f, +-0.104233f,0.980418f,0.167081f, +-0.137204f,0.957647f,0.253153f, +-0.0909923f,0.97094f,0.221352f, +-0.0588081f,0.977218f,0.203928f, +0.0555628f,0.971956f,0.228506f, +0.00693538f,0.995197f,0.0976442f, +0.0112691f,0.996103f,-0.0874744f, +0.104487f,0.972486f,-0.208215f, +0.102504f,0.971128f,-0.215412f, +0.0933319f,0.976682f,-0.193342f, +0.023135f,0.974909f,-0.221399f, +0.0195254f,0.964185f,-0.264511f, +0.0843961f,0.966003f,-0.244368f, +0.0791804f,0.94997f,-0.30214f, +0.048562f,0.904645f,-0.423391f, +0.168302f,0.901104f,-0.399607f, +0.0460994f,0.899241f,-0.435018f, +-0.0201301f,0.942734f,-0.332937f, +-0.0651933f,0.964794f,-0.254799f, +-0.107417f,0.971064f,-0.213298f, +-0.17484f,0.97454f,-0.140369f, +-0.26177f,0.957564f,-0.120611f, +-0.18964f,0.980348f,-0.0543506f, +-0.0244255f,0.999511f,-0.0195208f, +0.0943164f,0.983888f,-0.151887f, +0.241216f,0.961222f,-0.133665f, +0.186016f,0.976207f,-0.111437f, +0.0288865f,0.998091f,-0.0545842f, +-0.00269516f,0.997826f,0.0658428f, +-0.0454406f,0.988515f,0.144131f, +0.0349744f,0.994103f,0.102646f, +0.310638f,0.939659f,0.143339f, +0.362637f,0.904005f,0.226428f, +0.268459f,0.940968f,0.206177f, +-0.0101438f,0.990408f,0.137803f, +-0.259956f,0.964753f,0.0409231f, +-0.105214f,0.99436f,0.0133734f, +0.151003f,0.984401f,0.0902917f, +0.153972f,0.971331f,0.181133f, +0.131893f,0.982033f,0.134962f, +0.145326f,0.983866f,0.104346f, +0.172165f,0.970545f,0.16853f, +0.260168f,0.947172f,0.18756f, +0.265906f,0.934787f,0.235514f, +0.175251f,0.956563f,0.232968f, +0.205308f,0.948623f,0.240753f, +0.093567f,0.968565f,0.230493f, +0.000708259f,0.964766f,0.263107f, +0.00657781f,0.964909f,0.262504f, +-0.520396f,0.851586f,0.063156f, +-0.521936f,0.850242f,0.0683468f, +-0.537166f,0.843365f,0.0137284f, +-0.507784f,0.86143f,-0.00972442f, +-0.393238f,0.917684f,0.0567504f, +-0.362634f,0.931285f,-0.0347048f, +-0.298916f,0.951591f,-0.0715749f, +-0.125797f,0.991634f,-0.0289454f, +0.00629701f,0.999979f,0.00117199f, +0.0170902f,0.994718f,-0.101214f, +0.290594f,0.952688f,-0.0891078f, +0.285259f,0.936469f,-0.20409f, +0.342737f,0.918097f,-0.199071f, +0.262981f,0.956466f,-0.126547f, +-0.000199178f,0.996828f,-0.0795833f, +0.16652f,0.978742f,0.119733f, +0.0382843f,0.984413f,0.171653f, +-0.277981f,0.950703f,0.137441f, +-0.18354f,0.954113f,0.236605f, +-0.0382213f,0.967232f,0.251001f, +-0.0471282f,0.983482f,0.174763f, +0.05509f,0.990469f,0.126237f, +0.154415f,0.97865f,0.135647f, +0.187824f,0.979878f,0.0675348f, +0.226039f,0.971999f,-0.0642243f, +0.0780765f,0.982532f,-0.168921f, +0.109774f,0.985685f,-0.127961f, +0.112009f,0.982676f,-0.147653f, +0.0632751f,0.975786f,-0.209375f, +0.0264674f,0.962968f,-0.268312f, +0.10845f,0.959018f,-0.261771f, +0.0643921f,0.961817f,-0.266009f, +0.166593f,0.964859f,-0.203209f, +0.0747121f,0.973608f,-0.215653f, +-0.165051f,0.968419f,-0.186874f, +-0.148108f,0.983106f,-0.10755f, +-0.179372f,0.979451f,-0.0922022f, +-0.237948f,0.970437f,-0.0404116f, +-0.2824f,0.959184f,-0.014723f, +-0.146028f,0.988959f,-0.0252228f, +0.05616f,0.991975f,-0.113275f, +0.196359f,0.969761f,-0.144935f, +0.181455f,0.976082f,-0.119739f, +0.110973f,0.993178f,-0.035804f, +-0.0390828f,0.998775f,0.0303582f, +-0.136356f,0.988616f,0.0636122f, +-0.0521843f,0.980102f,0.191512f, +0.0572854f,0.981374f,0.183367f, +0.238568f,0.946616f,0.216801f, +0.340107f,0.907515f,0.246464f, +0.312043f,0.926088f,0.212108f, +0.0846085f,0.98223f,0.167527f, +-0.163231f,0.986101f,0.0309937f, +-0.143013f,0.98971f,-0.00457425f, +0.0291614f,0.993948f,0.105909f, +0.107232f,0.980268f,0.16606f, +0.13514f,0.977368f,0.162754f, +0.171582f,0.963454f,0.205708f, +0.160805f,0.97344f,0.162963f, +0.206565f,0.959827f,0.189905f, +0.203733f,0.939018f,0.277016f, +0.156541f,0.940477f,0.30166f, +0.14264f,0.938158f,0.315457f, +0.0877292f,0.924317f,0.371405f, +0.0427952f,0.921735f,0.385453f, +0.102307f,0.915297f,0.389569f, +-0.518725f,0.854828f,-0.0138881f, +-0.516652f,0.85588f,0.023226f, +-0.490153f,0.869598f,0.0595683f, +-0.505693f,0.862598f,-0.0140982f, +-0.393758f,0.918824f,-0.0267811f, +-0.308114f,0.951253f,-0.0135724f, +-0.25353f,0.967309f,0.00592796f, +-0.183935f,0.978787f,-0.0902442f, +-0.0335384f,0.998587f,-0.0412272f, +0.0888831f,0.995408f,-0.0355216f, +0.275528f,0.951614f,-0.136073f, +0.317879f,0.941106f,-0.115209f, +0.22556f,0.974028f,-0.0197739f, +0.262726f,0.954534f,0.140851f, +0.0383338f,0.998565f,0.0373963f, +0.0108706f,0.999386f,-0.0333096f, +0.0472758f,0.987524f,0.150202f, +-0.22401f,0.968166f,0.111686f, +-0.221122f,0.974472f,0.0388438f, +-0.0303833f,0.999266f,0.0233175f, +0.0911048f,0.995841f,0.000284795f, +0.0750561f,0.987717f,-0.137044f, +0.140099f,0.985231f,-0.098447f, +0.159287f,0.981153f,-0.10939f, +0.301657f,0.953265f,-0.0169985f, +0.140836f,0.988971f,-0.0458453f, +0.074059f,0.996008f,-0.0498236f, +0.0873182f,0.996023f,-0.0176849f, +0.132872f,0.990946f,0.019257f, +0.15553f,0.982355f,-0.103875f, +0.133638f,0.955183f,-0.264135f, +0.0505536f,0.951293f,-0.304114f, +0.0663471f,0.962897f,-0.261588f, +0.0679148f,0.992885f,-0.0978063f, +-0.186921f,0.976146f,-0.110452f, +-0.16844f,0.980926f,-0.0970201f, +-0.17716f,0.9831f,-0.0461376f, +-0.252028f,0.967676f,-0.00920485f, +-0.25063f,0.967236f,-0.0404965f, +-0.0995772f,0.983353f,-0.151991f, +0.0940064f,0.974734f,-0.202626f, +0.146102f,0.962693f,-0.227766f, +0.10874f,0.966405f,-0.232891f, +-0.0013416f,0.987029f,-0.160533f, +-0.0603915f,0.998129f,0.00954783f, +-0.17946f,0.98293f,0.040526f, +-0.153066f,0.978461f,0.138509f, +0.00546813f,0.977756f,0.209673f, +0.202775f,0.944505f,0.258443f, +0.334531f,0.904949f,0.262976f, +0.339399f,0.898505f,0.278385f, +0.212792f,0.950144f,0.227917f, +-0.0583572f,0.996371f,0.0619671f, +-0.218128f,0.975136f,0.0391184f, +-0.0703437f,0.983861f,0.16453f, +0.113041f,0.961301f,0.25124f, +0.0979771f,0.959037f,0.265798f, +0.151767f,0.929082f,0.337302f, +0.185905f,0.937423f,0.294409f, +0.169611f,0.955662f,0.240713f, +0.159864f,0.96582f,0.204047f, +0.151538f,0.965571f,0.211446f, +0.11661f,0.954852f,0.273241f, +0.0708035f,0.941966f,0.328158f, +-0.00402057f,0.956357f,0.292174f, +0.0123647f,0.956622f,0.291069f, +-0.626234f,0.777268f,-0.0607036f, +-0.590408f,0.806122f,0.0398278f, +-0.512253f,0.84829f,0.134171f, +-0.429387f,0.891471f,0.144588f, +-0.394702f,0.915407f,0.0789917f, +-0.352114f,0.935018f,0.0419128f, +-0.269358f,0.962596f,0.0292454f, +-0.0709514f,0.996127f,0.0519312f, +-0.0485279f,0.996417f,-0.069268f, +0.139101f,0.983953f,-0.111751f, +0.369972f,0.916386f,-0.152833f, +0.200502f,0.96864f,-0.146752f, +0.063154f,0.997971f,0.00814434f, +0.218613f,0.964332f,0.149236f, +0.233367f,0.966768f,0.104401f, +0.00832713f,0.995958f,-0.0894382f, +-0.101235f,0.994608f,-0.0224841f, +-0.188929f,0.980627f,0.051742f, +-0.131276f,0.990999f,0.026226f, +0.0111642f,0.996226f,-0.0860703f, +0.127344f,0.982944f,-0.132683f, +0.133649f,0.978353f,-0.157998f, +0.127047f,0.978674f,-0.161419f, +0.154013f,0.97768f,-0.142902f, +0.207952f,0.974577f,-0.0833996f, +0.130584f,0.99044f,-0.0444555f, +0.0527996f,0.997244f,-0.0521173f, +0.0873033f,0.993919f,-0.0671111f, +0.134372f,0.9813f,-0.137819f, +0.302979f,0.937443f,-0.171475f, +0.235087f,0.922651f,-0.305694f, +0.116878f,0.945593f,-0.303632f, +-0.0892912f,0.947762f,-0.306226f, +-0.0487728f,0.993685f,-0.101049f, +-0.161853f,0.9816f,-0.101314f, +-0.226351f,0.97061f,-0.0817454f, +-0.270044f,0.962691f,-0.0173905f, +-0.294262f,0.954053f,0.0565031f, +-0.151555f,0.985239f,0.0795882f, +0.00297078f,0.999916f,-0.0126498f, +0.158118f,0.985077f,-0.067991f, +0.232676f,0.957923f,-0.168067f, +0.184787f,0.953241f,-0.239135f, +-0.102652f,0.943763f,-0.314284f, +-0.249925f,0.941897f,-0.224429f, +-0.230538f,0.969668f,-0.0812203f, +-0.256878f,0.964046f,-0.0680376f, +-0.0528332f,0.99816f,0.0297627f, +0.16253f,0.979605f,0.118148f, +0.292443f,0.935246f,0.199479f, +0.337448f,0.899957f,0.276054f, +0.288581f,0.911989f,0.291541f, +0.0381605f,0.961598f,0.271797f, +-0.217082f,0.942133f,0.25546f, +-0.187341f,0.947099f,0.26059f, +0.0122725f,0.939216f,0.343107f, +0.0450967f,0.927047f,0.372224f, +0.0805118f,0.921403f,0.380178f, +0.269621f,0.884781f,0.380089f, +0.278457f,0.920235f,0.275007f, +0.240432f,0.950543f,0.19662f, +0.110916f,0.980787f,0.160482f, +0.0190768f,0.974013f,0.225685f, +0.0421661f,0.96323f,0.26535f, +0.0623149f,0.965243f,0.253816f, +0.0484827f,0.970002f,0.238214f, +-0.675447f,0.735679f,-0.050474f, +-0.639324f,0.768795f,-0.0148056f, +-0.556082f,0.830482f,0.0327513f, +-0.42972f,0.893254f,0.132053f, +-0.365389f,0.922739f,0.122653f, +-0.226979f,0.966229f,0.121993f, +-0.221717f,0.973751f,-0.051483f, +-0.0779728f,0.987923f,-0.133899f, +0.0930073f,0.979917f,-0.176386f, +0.192144f,0.942491f,-0.27348f, +0.309496f,0.916222f,-0.254459f, +0.155051f,0.977443f,-0.143405f, +-0.0554135f,0.989739f,-0.131708f, +0.110672f,0.991805f,-0.0638304f, +0.310319f,0.950296f,0.0252996f, +0.103349f,0.993006f,-0.0570824f, +-0.143599f,0.988502f,-0.0473533f, +-0.226116f,0.973312f,-0.0391734f, +-0.100068f,0.994649f,-0.0257001f, +0.124656f,0.989757f,-0.0695779f, +0.137305f,0.97907f,-0.150231f, +0.12072f,0.989818f,-0.075415f, +0.132256f,0.990827f,-0.0277589f, +0.0994133f,0.991446f,-0.0845708f, +0.16457f,0.984921f,-0.0533595f, +0.161357f,0.986289f,-0.034624f, +0.0776395f,0.993281f,-0.0858198f, +0.196429f,0.972629f,-0.124127f, +0.213597f,0.93634f,-0.278645f, +0.333587f,0.906552f,-0.258619f, +0.264447f,0.928271f,-0.261499f, +0.0224352f,0.968338f,-0.248633f, +-0.153007f,0.973949f,-0.167368f, +-0.171971f,0.976037f,-0.133332f, +-0.164739f,0.982172f,-0.0905542f, +-0.256427f,0.965345f,-0.0485236f, +-0.266685f,0.961164f,-0.0710119f, +-0.315314f,0.936338f,-0.154429f, +-0.180509f,0.974939f,-0.130043f, +0.0306802f,0.996715f,-0.0749509f, +0.181216f,0.981966f,-0.0538862f, +0.308423f,0.951239f,-0.0044789f, +0.193412f,0.981099f,-0.00609358f, +-0.00883535f,0.999181f,0.039479f, +-0.293629f,0.95203f,-0.0861418f, +-0.288511f,0.952707f,-0.0954526f, +-0.270635f,0.961763f,-0.0420598f, +-0.176015f,0.982039f,0.0679556f, +0.0472003f,0.981703f,0.184478f, +0.185293f,0.947852f,0.259313f, +0.26012f,0.901797f,0.345109f, +0.219376f,0.887657f,0.404894f, +0.015248f,0.892187f,0.451408f, +-0.212632f,0.887876f,0.407999f, +-0.145904f,0.908525f,0.391529f, +-0.0226457f,0.932703f,0.359933f, +0.0874951f,0.910834f,0.403393f, +0.125007f,0.935932f,0.329249f, +0.288568f,0.918223f,0.271284f, +0.34457f,0.896771f,0.277619f, +0.261558f,0.928634f,0.263108f, +0.0802026f,0.961218f,0.26387f, +0.0163948f,0.952196f,0.305047f, +0.0566148f,0.964684f,0.257253f, +0.102872f,0.970943f,0.216073f, +0.0353576f,0.994079f,0.102749f, +-0.569322f,0.820332f,-0.0541097f, +-0.616679f,0.764093f,-0.18939f, +-0.605157f,0.764062f,-0.223597f, +-0.50856f,0.856476f,-0.0884048f, +-0.372491f,0.927008f,0.0436669f, +-0.225048f,0.969626f,0.0958063f, +-0.0508165f,0.996801f,0.0616925f, +0.0586358f,0.990558f,-0.123919f, +0.126111f,0.966195f,-0.224862f, +0.229194f,0.950926f,-0.207869f, +0.252375f,0.936474f,-0.243564f, +0.0944308f,0.971404f,-0.217846f, +-0.0355117f,0.972557f,-0.229939f, +0.0856503f,0.962722f,-0.256575f, +0.220711f,0.941477f,-0.254769f, +0.0934053f,0.989629f,-0.109133f, +-0.156897f,0.986627f,-0.0441527f, +-0.224564f,0.970579f,-0.0868729f, +-0.0948813f,0.992594f,-0.0758608f, +0.168753f,0.983045f,-0.0717275f, +0.110894f,0.991432f,-0.0690319f, +-0.0147158f,0.998265f,0.0570193f, +0.10964f,0.979883f,0.16676f, +0.213201f,0.96906f,0.124368f, +0.195873f,0.980015f,-0.0346975f, +0.162476f,0.975738f,-0.146751f, +0.136902f,0.9692f,-0.204718f, +0.244929f,0.933568f,-0.26165f, +0.288988f,0.918188f,-0.270954f, +0.254175f,0.924529f,-0.283974f, +0.243695f,0.954587f,-0.171397f, +-0.00175415f,0.99017f,-0.13986f, +-0.165264f,0.975245f,-0.146916f, +-0.185767f,0.967008f,-0.174319f, +-0.191354f,0.972667f,-0.131541f, +-0.271241f,0.952999f,-0.134987f, +-0.1847f,0.972855f,-0.139424f, +-0.209304f,0.957842f,-0.1968f, +-0.243194f,0.936f,-0.254482f, +-0.0210884f,0.983365f,-0.18041f, +0.0761402f,0.989042f,-0.126486f, +0.185372f,0.981538f,0.047127f, +0.117606f,0.973445f,0.196404f, +-0.0453061f,0.954332f,0.295292f, +-0.152267f,0.943756f,0.293495f, +-0.272105f,0.944288f,0.185149f, +-0.341417f,0.929337f,0.140592f, +-0.316477f,0.938022f,0.141266f, +-0.0291064f,0.965694f,0.258045f, +0.139271f,0.938861f,0.31487f, +0.16066f,0.916793f,0.36562f, +0.163005f,0.879828f,0.446466f, +0.088987f,0.884248f,0.458461f, +-0.126118f,0.932849f,0.337472f, +-0.101381f,0.953175f,0.284919f, +-0.0233764f,0.967738f,0.250872f, +0.0600962f,0.965273f,0.254236f, +0.184472f,0.94915f,0.255117f, +0.293565f,0.911429f,0.288301f, +0.309916f,0.89217f,0.328611f, +0.260108f,0.896879f,0.357704f, +0.0945809f,0.935133f,0.341439f, +0.0335311f,0.964748f,0.261032f, +0.0942492f,0.979731f,0.176762f, +0.167685f,0.967918f,0.187127f, +0.258869f,0.942682f,0.210564f, +-0.367443f,0.929937f,-0.0142236f, +-0.499723f,0.853143f,-0.149749f, +-0.60287f,0.768676f,-0.213739f, +-0.628893f,0.759885f,-0.164524f, +-0.498958f,0.866588f,-0.00814533f, +-0.266358f,0.961387f,0.0691948f, +0.0209306f,0.994406f,0.103533f, +0.18825f,0.979809f,0.0673512f, +0.186929f,0.982347f,-0.00722501f, +0.221871f,0.971137f,-0.0875532f, +0.321849f,0.94224f,-0.0927163f, +0.129468f,0.975377f,-0.178544f, +-0.0214597f,0.975387f,-0.219454f, +0.135606f,0.972282f,-0.19047f, +0.166947f,0.968719f,-0.18361f, +-0.0604962f,0.993281f,-0.0986602f, +-0.147333f,0.985679f,-0.0820398f, +-0.177745f,0.972235f,-0.152201f, +-0.13389f,0.979994f,-0.147259f, +0.107621f,0.993068f,-0.0472599f, +0.0496354f,0.9956f,0.0794756f, +-0.114638f,0.990271f,0.0788811f, +0.0386746f,0.994961f,0.0924988f, +0.257639f,0.951075f,0.170521f, +0.371556f,0.918219f,0.137186f, +0.306734f,0.951256f,-0.0320228f, +0.251981f,0.957147f,-0.142743f, +0.259956f,0.937158f,-0.232721f, +0.273432f,0.938847f,-0.209289f, +0.242378f,0.942977f,-0.228139f, +0.135357f,0.967026f,-0.21573f, +-0.0237633f,0.989278f,-0.144096f, +-0.131198f,0.984621f,-0.11536f, +-0.202181f,0.972555f,-0.115152f, +-0.221308f,0.9725f,-0.0725642f, +-0.229514f,0.969023f,-0.0912046f, +-0.218972f,0.967608f,-0.125639f, +-0.212632f,0.976006f,-0.0469096f, +-0.218674f,0.974967f,-0.0402565f, +-0.122558f,0.989962f,-0.0703905f, +0.0166378f,0.999654f,0.0203946f, +-0.0104674f,0.996634f,0.0813074f, +-0.0169459f,0.959611f,0.28082f, +-0.0960206f,0.935549f,0.339894f, +-0.167668f,0.926307f,0.337405f, +-0.198261f,0.909687f,0.364915f, +-0.193335f,0.935754f,0.294935f, +-0.259424f,0.960196f,0.103554f, +-0.126539f,0.989254f,0.073239f, +0.0445245f,0.981975f,0.183692f, +0.070195f,0.9396f,0.334999f, +0.116045f,0.901991f,0.415867f, +0.160437f,0.912696f,0.375828f, +-0.00552585f,0.963507f,0.267627f, +-0.111729f,0.971129f,0.210774f, +0.00935468f,0.964114f,0.265323f, +0.084172f,0.968508f,0.234323f, +0.13752f,0.967988f,0.209968f, +0.208575f,0.947382f,0.242826f, +0.289545f,0.920265f,0.263203f, +0.228797f,0.929214f,0.290195f, +0.185013f,0.916649f,0.354295f, +0.160823f,0.950358f,0.266374f, +0.183734f,0.959776f,0.212302f, +0.0865279f,0.982909f,0.162492f, +0.143782f,0.963199f,0.227098f, +-0.40108f,0.898526f,-0.178287f, +-0.447805f,0.881163f,-0.15173f, +-0.619629f,0.769135f,-0.156501f, +-0.663764f,0.743697f,-0.0795752f, +-0.534645f,0.83883f,-0.102567f, +-0.293541f,0.950588f,-0.101077f, +-0.0154638f,0.998684f,-0.048892f, +0.170364f,0.984269f,-0.0468065f, +0.272586f,0.961403f,-0.0374194f, +0.276742f,0.955139f,-0.105472f, +0.3572f,0.929651f,-0.0903144f, +0.185848f,0.967712f,-0.170277f, +-0.00167559f,0.978573f,-0.205892f, +0.0698456f,0.971595f,-0.226108f, +0.0821889f,0.985623f,-0.147624f, +-0.0376538f,0.998466f,-0.0405822f, +-0.0983702f,0.988409f,-0.115634f, +-0.140633f,0.987279f,-0.0741791f, +-0.185061f,0.981813f,-0.0423742f, +-0.0718387f,0.997236f,0.0189748f, +0.00846681f,0.991398f,0.130611f, +0.00870324f,0.999937f,0.00714861f, +0.043927f,0.984772f,-0.168207f, +0.173423f,0.967972f,-0.181535f, +0.363952f,0.925731f,-0.10277f, +0.415083f,0.906279f,-0.0797799f, +0.295656f,0.934439f,-0.198525f, +0.285411f,0.94244f,-0.174208f, +0.286359f,0.952372f,-0.104818f, +0.274f,0.954057f,-0.121243f, +0.125082f,0.985323f,-0.116157f, +-0.0728358f,0.994219f,-0.0788892f, +-0.183935f,0.981488f,-0.0533801f, +-0.254614f,0.966975f,0.0114848f, +-0.238556f,0.965368f,0.105624f, +-0.207746f,0.971319f,0.115674f, +-0.215469f,0.971204f,0.101667f, +-0.267107f,0.96138f,0.0663435f, +-0.207576f,0.97646f,0.0586408f, +-0.117358f,0.991748f,0.0516096f, +-0.0500459f,0.994852f,0.0881198f, +-0.093813f,0.986665f,0.133006f, +-0.152698f,0.969858f,0.18989f, +-0.1251f,0.953778f,0.273236f, +-0.165614f,0.925222f,0.341373f, +-0.185498f,0.929562f,0.3186f, +-0.115032f,0.960173f,0.254626f, +-0.110794f,0.97049f,0.214181f, +-0.10146f,0.992209f,0.072301f, +-0.111958f,0.99337f,0.026117f, +-0.0975457f,0.980844f,0.168611f, +0.086247f,0.976994f,0.195051f, +0.241113f,0.947591f,0.20961f, +0.0868755f,0.959222f,0.268972f, +-0.141994f,0.949853f,0.278599f, +-0.0178282f,0.934163f,0.356401f, +0.0726972f,0.940594f,0.331659f, +0.165529f,0.917627f,0.361333f, +0.223743f,0.920886f,0.319231f, +0.302189f,0.900958f,0.311378f, +0.181249f,0.939198f,0.291642f, +0.15269f,0.934294f,0.32215f, +0.181639f,0.932767f,0.311371f, +0.174351f,0.925291f,0.336805f, +0.107261f,0.938861f,0.327163f, +0.0621733f,0.949825f,0.306542f, +-0.336425f,0.924181f,-0.180852f, +-0.467727f,0.856958f,-0.216458f, +-0.602238f,0.781026f,-0.165251f, +-0.647361f,0.734151f,-0.204809f, +-0.50962f,0.821617f,-0.255407f, +-0.329682f,0.908003f,-0.258533f, +-0.0514578f,0.97257f,-0.226846f, +0.197411f,0.959315f,-0.201849f, +0.264136f,0.946231f,-0.186758f, +0.271989f,0.947232f,-0.169627f, +0.342182f,0.926412f,-0.157076f, +0.226068f,0.960114f,-0.164544f, +0.0298714f,0.986995f,-0.157954f, +0.0947848f,0.979734f,-0.176458f, +0.0184686f,0.978597f,-0.204958f, +-0.115417f,0.979217f,-0.166771f, +-0.133289f,0.987752f,-0.0811202f, +-0.254272f,0.966705f,0.0287551f, +-0.238007f,0.962858f,0.127508f, +-0.0805244f,0.989118f,0.123135f, +0.0609568f,0.996652f,0.0544921f, +0.185345f,0.981121f,-0.0552078f, +0.246025f,0.947034f,-0.206392f, +0.188933f,0.898455f,-0.396338f, +0.253355f,0.896162f,-0.364288f, +0.431339f,0.877591f,-0.209237f, +0.33179f,0.90994f,-0.248847f, +0.173449f,0.964884f,-0.197267f, +0.195848f,0.971573f,-0.133f, +0.242458f,0.968164f,-0.0622215f, +0.0872514f,0.995924f,0.0228468f, +-0.104392f,0.994289f,0.0221861f, +-0.212909f,0.976423f,0.0355982f, +-0.329497f,0.936369f,0.121017f, +-0.322708f,0.91595f,0.238528f, +-0.206447f,0.929806f,0.304697f, +-0.167225f,0.947523f,0.272462f, +-0.184928f,0.959175f,0.213976f, +-0.173343f,0.972643f,0.154651f, +-0.113658f,0.986612f,0.116951f, +-0.0855668f,0.994338f,0.0630098f, +-0.114452f,0.992427f,0.0446133f, +-0.159653f,0.986324f,0.0409453f, +-0.238644f,0.971105f,-0.00174015f, +-0.263001f,0.962569f,0.0655076f, +-0.150786f,0.97653f,0.153794f, +-0.0789227f,0.973225f,0.21588f, +-0.0862836f,0.967962f,0.235807f, +0.0429765f,0.969236f,0.242351f, +-0.0440941f,0.992467f,0.114305f, +-0.115348f,0.992717f,-0.0347649f, +0.0790257f,0.995351f,-0.0550642f, +0.126473f,0.98592f,0.109395f, +-0.0409487f,0.953557f,0.298417f, +-0.206016f,0.913735f,0.350208f, +-0.0633912f,0.92675f,0.370293f, +0.0785739f,0.913264f,0.399719f, +0.177609f,0.899902f,0.398285f, +0.238034f,0.923241f,0.301604f, +0.255943f,0.926508f,0.27582f, +0.232022f,0.914012f,0.332787f, +0.162081f,0.936068f,0.312259f, +0.177513f,0.926269f,0.332437f, +0.185532f,0.921601f,0.340924f, +0.173632f,0.950356f,0.258214f, +0.111166f,0.980225f,0.163712f, +-0.0923042f,0.995727f,-0.00270435f, +-0.408896f,0.902709f,-0.133863f, +-0.602302f,0.79183f,-0.10118f, +-0.624884f,0.765307f,-0.154352f, +-0.552184f,0.809036f,-0.201379f, +-0.343811f,0.917937f,-0.197956f, +-0.0748905f,0.960991f,-0.266248f, +0.134998f,0.958099f,-0.252631f, +0.206547f,0.962195f,-0.177534f, +0.264489f,0.960553f,-0.0859237f, +0.340814f,0.939333f,-0.0387315f, +0.235136f,0.971602f,-0.0264814f, +0.0144037f,0.991275f,-0.131023f, +0.053242f,0.991683f,-0.117173f, +0.0920982f,0.995717f,0.00816044f, +-0.164789f,0.980567f,-0.106454f, +-0.239234f,0.97035f,-0.0344802f, +-0.316227f,0.948287f,0.0274269f, +-0.260328f,0.965493f,0.00728909f, +-0.00635978f,0.999169f,0.0402508f, +0.152101f,0.988094f,-0.023159f, +0.261272f,0.960304f,-0.0977355f, +0.363311f,0.923635f,-0.122082f, +0.303719f,0.94151f,-0.145994f, +0.209258f,0.960639f,-0.182713f, +0.299827f,0.935978f,-0.184526f, +0.310225f,0.948937f,-0.0572597f, +0.134013f,0.988326f,-0.0724722f, +0.173294f,0.983169f,-0.0578515f, +0.150596f,0.988589f,-0.00352276f, +0.0218728f,0.99535f,0.093809f, +-0.090936f,0.980927f,0.171796f, +-0.253868f,0.938693f,0.233251f, +-0.400767f,0.870372f,0.286074f, +-0.392418f,0.877786f,0.274773f, +-0.219224f,0.925755f,0.308089f, +-0.114269f,0.92983f,0.349798f, +-0.147993f,0.921652f,0.358685f, +-0.138523f,0.925121f,0.353501f, +-0.0290531f,0.945854f,0.32329f, +0.0440242f,0.978167f,0.203106f, +-0.0576599f,0.997178f,0.0480716f, +-0.156038f,0.987653f,-0.0139414f, +-0.143901f,0.989541f,-0.0100722f, +-0.293059f,0.951458f,-0.0940478f, +-0.298958f,0.953936f,-0.0251005f, +-0.203233f,0.972711f,0.111937f, +-0.134891f,0.965356f,0.223367f, +-0.0182075f,0.958686f,0.283884f, +0.123188f,0.934113f,0.33505f, +0.0872404f,0.983488f,0.15856f, +0.00440122f,0.999845f,-0.0170726f, +-0.143813f,0.987727f,0.0609306f, +-0.192356f,0.942318f,0.273927f, +-0.141157f,0.926207f,0.349593f, +-0.0674076f,0.959831f,0.272363f, +0.0730938f,0.959591f,0.27174f, +0.173541f,0.961002f,0.215311f, +0.369237f,0.888798f,0.271483f, +0.277281f,0.944196f,0.177789f, +0.215184f,0.95909f,0.183961f, +0.13088f,0.973624f,0.186887f, +0.130607f,0.953976f,0.269946f, +0.212637f,0.930888f,0.297042f, +0.306976f,0.920481f,0.241829f, +0.280289f,0.947029f,0.156763f, +0.0123331f,0.988431f,0.151171f, +-0.297868f,0.952288f,0.0664969f, +-0.612229f,0.786332f,-0.0828155f, +-0.600387f,0.789438f,-0.127758f, +-0.542733f,0.826042f,-0.151972f, +-0.320126f,0.93364f,-0.160733f, +0.000589343f,0.981171f,-0.193142f, +0.0980808f,0.971507f,-0.215763f, +0.124748f,0.986178f,-0.109047f, +0.199191f,0.978521f,-0.0531043f, +0.247764f,0.965734f,-0.0772702f, +0.318214f,0.948019f,-0.000766246f, +0.183917f,0.97162f,-0.148756f, +-0.0488566f,0.965709f,-0.25499f, +-0.0165518f,0.99654f,-0.0814512f, +-0.0793375f,0.996823f,-0.00696945f, +-0.310737f,0.950344f,-0.0169863f, +-0.292329f,0.952706f,0.0830406f, +-0.217409f,0.975529f,0.0328f, +-0.044323f,0.995765f,-0.0805443f, +0.185778f,0.977354f,-0.101323f, +0.271832f,0.958328f,-0.0878372f, +0.32088f,0.946924f,0.019279f, +0.252443f,0.960909f,0.113697f, +0.290552f,0.947257f,0.135217f, +0.289238f,0.957058f,-0.0195476f, +0.286171f,0.957114f,0.0451517f, +0.220997f,0.975269f,0.00320969f, +0.0994052f,0.991378f,-0.0853655f, +0.0429034f,0.994069f,0.099932f, +-0.0709962f,0.952332f,0.296687f, +-0.214284f,0.897012f,0.38659f, +-0.318505f,0.838002f,0.443066f, +-0.352211f,0.849573f,0.392649f, +-0.30013f,0.898851f,0.319356f, +-0.250783f,0.928599f,0.273517f, +-0.200191f,0.919896f,0.337217f, +-0.179596f,0.907951f,0.378643f, +-0.135043f,0.919145f,0.370049f, +0.0368434f,0.920312f,0.389447f, +0.16581f,0.924682f,0.34274f, +0.0946402f,0.961136f,0.259346f, +-0.111217f,0.985094f,0.131228f, +-0.13188f,0.98641f,0.0979915f, +-0.254562f,0.966634f,0.028585f, +-0.324299f,0.94515f,-0.0390035f, +-0.293729f,0.954471f,-0.0520494f, +-0.247862f,0.966889f,0.0607495f, +-0.0794894f,0.980131f,0.181727f, +0.101373f,0.964007f,0.245794f, +0.197084f,0.947574f,0.251517f, +0.177833f,0.964662f,0.194431f, +-0.161149f,0.986485f,0.0296539f, +-0.316387f,0.94824f,0.02721f, +-0.207789f,0.976057f,0.0643106f, +-0.00905536f,0.99298f,0.117933f, +0.141544f,0.987983f,0.062088f, +0.189336f,0.98168f,-0.0213574f, +0.273454f,0.960225f,0.0564811f, +0.315806f,0.930776f,0.184181f, +0.235283f,0.955417f,0.17838f, +0.124851f,0.982004f,0.141708f, +0.0792257f,0.989953f,0.117114f, +0.210835f,0.9739f,0.0840678f, +0.31429f,0.942479f,0.113817f, +0.350241f,0.914076f,0.20444f, +0.0694749f,0.983151f,0.169077f, +-0.169784f,0.982476f,0.076909f, +-0.507716f,0.850133f,-0.139637f, +-0.564212f,0.800379f,-0.202629f, +-0.514428f,0.829332f,-0.218112f, +-0.369417f,0.885582f,-0.28156f, +0.00180169f,0.974596f,-0.223965f, +0.0258344f,0.976386f,-0.214484f, +-0.024f,0.996868f,-0.0753534f, +0.239975f,0.969587f,0.0481022f, +0.34797f,0.931588f,-0.105173f, +0.316295f,0.909782f,-0.268803f, +0.250422f,0.912989f,-0.322087f, +-0.0369252f,0.950156f,-0.30958f, +-0.207502f,0.950188f,-0.232562f, +-0.167975f,0.985706f,-0.0129903f, +-0.315712f,0.948273f,0.0332206f, +-0.386969f,0.921609f,-0.0298463f, +-0.12805f,0.991662f,0.0144567f, +0.102711f,0.991948f,-0.0740863f, +0.21217f,0.967879f,-0.134884f, +0.167738f,0.98185f,-0.0885116f, +0.176293f,0.984226f,0.0148055f, +0.233609f,0.968608f,0.0850021f, +0.30166f,0.950058f,0.0799509f, +0.387591f,0.914349f,0.117215f, +0.244561f,0.968825f,0.0395933f, +0.294792f,0.954101f,0.0528114f, +0.0843374f,0.996399f,0.00873819f, +-0.221704f,0.963341f,0.151067f, +-0.335663f,0.86809f,0.365719f, +-0.262618f,0.850841f,0.455085f, +-0.222709f,0.867235f,0.445313f, +-0.24917f,0.884312f,0.39485f, +-0.238336f,0.907466f,0.345978f, +-0.270997f,0.917236f,0.291956f, +-0.229194f,0.914337f,0.333853f, +-0.15897f,0.933059f,0.322692f, +-0.100911f,0.956766f,0.272794f, +-0.0211523f,0.974532f,0.223248f, +0.201297f,0.933635f,0.29632f, +0.155914f,0.954519f,0.254134f, +-0.0218294f,0.971898f,0.234389f, +-0.079809f,0.976613f,0.199646f, +-0.0874479f,0.990326f,0.10774f, +-0.258167f,0.959037f,-0.116608f, +-0.306401f,0.945943f,-0.106352f, +-0.341562f,0.936596f,-0.0782577f, +-0.199458f,0.979359f,-0.0327519f, +0.0464294f,0.997405f,0.0550308f, +0.191208f,0.978076f,0.0825056f, +0.238583f,0.96711f,0.0881811f, +-0.0888379f,0.993271f,0.0743033f, +-0.264236f,0.955782f,0.129075f, +-0.188913f,0.981529f,0.0302016f, +-0.0145673f,0.997134f,-0.0742444f, +0.169633f,0.978852f,-0.114338f, +0.20381f,0.976959f,-0.0633407f, +0.175314f,0.984354f,-0.0176521f, +0.240514f,0.967819f,0.0740208f, +0.244396f,0.964775f,0.0973589f, +0.18832f,0.980026f,0.0639107f, +0.156937f,0.987568f,-0.00896143f, +0.262584f,0.963481f,-0.0524761f, +0.165405f,0.986171f,-0.0103631f, +0.180443f,0.960877f,0.210132f, +0.22428f,0.955199f,0.193116f, +0.0674282f,0.994387f,0.0815297f, +-0.367623f,0.911009f,-0.186858f, +-0.569756f,0.78903f,-0.229805f, +-0.492917f,0.847419f,-0.197265f, +-0.366141f,0.895981f,-0.251313f, +-0.0646011f,0.969824f,-0.235091f, +0.018291f,0.976889f,-0.212961f, +-0.170757f,0.95698f,-0.234588f, +0.158661f,0.98264f,-0.0961541f, +0.509439f,0.859861f,-0.0333235f, +0.45757f,0.865797f,-0.202548f, +0.211042f,0.949174f,-0.233516f, +-0.116125f,0.987892f,-0.102876f, +-0.347298f,0.937329f,-0.028262f, +-0.3353f,0.938887f,0.0778782f, +-0.281604f,0.948411f,0.145656f, +-0.254278f,0.964997f,0.0642133f, +-0.124948f,0.985399f,-0.115656f, +0.137997f,0.981596f,-0.132006f, +0.145883f,0.979226f,-0.140833f, +0.128056f,0.990732f,-0.0452937f, +0.135002f,0.989818f,-0.0451192f, +0.250583f,0.968082f,-0.00493589f, +0.249752f,0.966686f,-0.056052f, +0.354812f,0.933896f,0.0441336f, +0.303438f,0.951308f,0.0542095f, +0.224177f,0.96836f,0.10965f, +0.0241424f,0.959753f,0.279804f, +-0.360787f,0.871516f,0.332105f, +-0.379082f,0.837086f,0.394442f, +-0.267154f,0.880877f,0.390749f, +-0.209592f,0.899886f,0.382462f, +-0.280017f,0.899934f,0.33423f, +-0.205094f,0.90311f,0.377265f, +-0.215487f,0.908768f,0.35736f, +-0.222303f,0.927919f,0.299247f, +-0.133955f,0.964793f,0.226343f, +-0.0310722f,0.978213f,0.205265f, +0.00222901f,0.986522f,0.163613f, +0.163026f,0.975343f,0.148754f, +0.222032f,0.968535f,0.112436f, +-0.0591592f,0.996482f,0.0593585f, +-0.0736093f,0.986012f,0.149538f, +0.0883465f,0.986402f,0.138585f, +-0.129755f,0.988677f,-0.0753772f, +-0.360418f,0.926521f,-0.10797f, +-0.325602f,0.942448f,-0.0759939f, +-0.212184f,0.970083f,-0.117968f, +-0.0173686f,0.99664f,-0.0800487f, +0.199307f,0.979749f,-0.0191744f, +0.207601f,0.977585f,-0.0350739f, +-0.111673f,0.993337f,0.0284751f, +-0.348081f,0.937445f,0.00599776f, +-0.0214784f,0.998661f,0.0470579f, +0.101424f,0.987937f,-0.11702f, +0.14864f,0.985437f,-0.0825872f, +0.115279f,0.993006f,0.0255073f, +0.132171f,0.98902f,0.0661133f, +0.208651f,0.976857f,0.0470664f, +0.263292f,0.96404f,0.0361305f, +0.248825f,0.968171f,0.0270552f, +0.185161f,0.982538f,-0.018271f, +0.217415f,0.97571f,0.0268649f, +0.0197241f,0.992022f,0.124516f, +-0.222642f,0.960275f,0.168234f, +0.132211f,0.987109f,0.0902005f, +0.194249f,0.96722f,0.163561f, +-0.121192f,0.992517f,0.0149198f, +-0.530811f,0.812343f,-0.241533f, +-0.504434f,0.808747f,-0.302447f, +-0.34313f,0.885425f,-0.313504f, +-0.137778f,0.93664f,-0.322061f, +0.0757018f,0.968813f,-0.235947f, +-0.132891f,0.938587f,-0.318425f, +0.0404124f,0.947798f,-0.316301f, +0.44786f,0.871235f,-0.200923f, +0.490699f,0.867082f,-0.0859319f, +0.104719f,0.99418f,-0.0252995f, +-0.266739f,0.955461f,0.126271f, +-0.36926f,0.905342f,0.209771f, +-0.330235f,0.922316f,0.200695f, +-0.269586f,0.955277f,0.121531f, +-0.151874f,0.986716f,0.0576671f, +-0.0142621f,0.999832f,-0.0115305f, +0.159425f,0.986955f,-0.0224599f, +0.153623f,0.986882f,-0.0496328f, +0.106278f,0.991325f,-0.0773283f, +0.114508f,0.986134f,-0.120113f, +0.21169f,0.974687f,-0.0719165f, +0.274634f,0.961096f,-0.0295159f, +0.269382f,0.962666f,0.0266079f, +0.255851f,0.94689f,0.19478f, +-0.00861224f,0.958716f,0.284234f, +-0.164949f,0.853283f,0.494671f, +-0.299895f,0.797641f,0.523289f, +-0.348319f,0.830543f,0.434595f, +-0.252787f,0.902204f,0.349467f, +-0.200686f,0.920719f,0.334665f, +-0.211731f,0.897332f,0.387253f, +-0.253565f,0.89104f,0.376502f, +-0.186105f,0.884245f,0.42834f, +-0.119153f,0.910802f,0.395274f, +-0.0259565f,0.945107f,0.325728f, +-0.0365208f,0.969055f,0.244127f, +0.0217438f,0.965814f,0.258322f, +0.21499f,0.950394f,0.224789f, +0.314831f,0.941255f,0.12215f, +-0.024099f,0.99913f,-0.0340298f, +-0.193558f,0.979871f,-0.0488714f, +0.141024f,0.987427f,0.0714227f, +0.042141f,0.998281f,-0.0407328f, +-0.330902f,0.928766f,-0.167024f, +-0.316891f,0.928564f,-0.193256f, +-0.212611f,0.956496f,-0.199781f, +-0.0848317f,0.98296f,-0.163073f, +0.159095f,0.98144f,-0.107074f, +0.142493f,0.988352f,-0.0534431f, +-0.0993206f,0.99343f,0.0568515f, +-0.282995f,0.956355f,-0.0727984f, +-0.0511781f,0.994657f,-0.0896605f, +0.128118f,0.991123f,0.0355009f, +0.0178584f,0.998165f,0.057865f, +0.0308308f,0.995199f,0.0928875f, +0.176093f,0.979878f,0.0939732f, +0.250441f,0.967914f,0.0205173f, +0.266597f,0.963616f,0.0192599f, +0.242746f,0.969766f,0.0250589f, +0.198829f,0.979834f,0.0197961f, +0.092758f,0.995177f,0.031931f, +-0.00514037f,0.987257f,0.15905f, +-0.197401f,0.976423f,0.0873538f, +0.0947848f,0.990346f,0.101148f, +0.11003f,0.98867f,0.102099f, +0.0979659f,0.987432f,0.124019f, +-0.288467f,0.943192f,-0.16485f, +-0.465875f,0.798355f,-0.381562f, +-0.320527f,0.848593f,-0.420894f, +-0.189264f,0.880141f,-0.435352f, +-0.0157309f,0.942454f,-0.333965f, +-0.0523924f,0.9528f,-0.299042f, +0.0243535f,0.924362f,-0.38074f, +0.347438f,0.877508f,-0.330555f, +0.339023f,0.92439f,-0.174834f, +0.0111821f,0.998297f,0.0572478f, +-0.344224f,0.932997f,0.105009f, +-0.433099f,0.895278f,0.104414f, +-0.282796f,0.937116f,0.204547f, +-0.130039f,0.982692f,0.131936f, +-0.0814764f,0.996291f,-0.027691f, +-0.0200688f,0.997106f,-0.0733289f, +0.118984f,0.992345f,-0.0330638f, +0.199561f,0.979885f,0.00110984f, +0.153394f,0.986654f,-0.0546216f, +0.176634f,0.980572f,-0.0853107f, +0.13548f,0.982889f,-0.124795f, +0.191838f,0.980855f,0.0334985f, +0.104996f,0.978045f,0.180009f, +0.00782433f,0.923816f,0.382758f, +-0.0895214f,0.848914f,0.520894f, +-0.239967f,0.84054f,0.485703f, +-0.280756f,0.842357f,0.460011f, +-0.207606f,0.901917f,0.378742f, +-0.122486f,0.94404f,0.306245f, +-0.244402f,0.93107f,0.270881f, +-0.292773f,0.891472f,0.345777f, +-0.276286f,0.909624f,0.310243f, +-0.213016f,0.932947f,0.290231f, +-0.0942691f,0.953854f,0.28509f, +-0.0105057f,0.953135f,0.302364f, +0.0307865f,0.936068f,0.35047f, +0.0538732f,0.955717f,0.289315f, +0.209391f,0.949668f,0.232994f, +0.403861f,0.868428f,0.287628f, +0.149382f,0.968969f,0.196936f, +-0.176548f,0.984269f,0.00674917f, +0.0687777f,0.996274f,-0.0520396f, +0.147821f,0.988716f,-0.0242998f, +-0.223164f,0.968308f,-0.112148f, +-0.295488f,0.928787f,-0.2237f, +-0.23574f,0.935973f,-0.261496f, +-0.100501f,0.963432f,-0.248392f, +0.0576299f,0.973773f,-0.220102f, +0.0436147f,0.999029f,-0.00621142f, +-0.153496f,0.982634f,0.104254f, +-0.184805f,0.972589f,0.141133f, +-0.14696f,0.984535f,0.0953571f, +-0.0211774f,0.989717f,0.141466f, +0.0758245f,0.9782f,0.193326f, +0.117048f,0.987762f,0.103083f, +0.217731f,0.97559f,-0.0285914f, +0.270726f,0.959521f,-0.0776314f, +0.230415f,0.971747f,-0.0511441f, +0.234903f,0.971865f,0.0172727f, +0.182122f,0.97948f,0.0863184f, +0.0884364f,0.988499f,0.122674f, +-0.00977715f,0.999042f,0.0426606f, +-0.0304096f,0.999492f,-0.00954367f, +0.200711f,0.957383f,0.207686f, +0.148405f,0.978101f,0.145929f, +0.14921f,0.978785f,0.140417f, +0.0273685f,0.999287f,0.0260052f, +-0.3017f,0.88706f,-0.349431f, +-0.32483f,0.824834f,-0.462746f, +-0.238736f,0.866733f,-0.437926f, +-0.174101f,0.907603f,-0.382029f, +-0.0165261f,0.968715f,-0.247625f, +0.078914f,0.949167f,-0.30472f, +0.287731f,0.926482f,-0.242571f, +0.12793f,0.981688f,-0.141147f, +-0.134026f,0.990975f,-0.00233563f, +-0.342476f,0.939327f,-0.0193419f, +-0.427311f,0.903697f,-0.027138f, +-0.353742f,0.934457f,-0.0407041f, +-0.055135f,0.997815f,0.0363915f, +0.0312575f,0.999385f,0.0158812f, +0.00264454f,0.999634f,-0.0269175f, +0.0835808f,0.996075f,-0.0291308f, +0.150499f,0.987413f,0.0486412f, +0.165157f,0.971811f,0.168246f, +0.215634f,0.960222f,0.177413f, +0.0835282f,0.988765f,0.123967f, +-0.00975779f,0.968408f,0.249181f, +-0.06977f,0.918125f,0.3901f, +-0.139283f,0.878718f,0.456569f, +-0.11373f,0.882765f,0.455842f, +-0.169944f,0.889011f,0.42518f, +-0.209287f,0.894084f,0.395996f, +-0.156853f,0.920873f,0.356917f, +-0.124966f,0.921391f,0.367997f, +-0.29021f,0.888579f,0.355255f, +-0.269725f,0.894676f,0.356094f, +-0.146199f,0.945073f,0.292342f, +-0.175209f,0.971632f,0.15885f, +-0.117718f,0.980316f,0.158504f, +-0.0825429f,0.966227f,0.244116f, +-0.0312586f,0.938703f,0.343308f, +0.145253f,0.922109f,0.358632f, +0.209296f,0.943478f,0.256992f, +0.299421f,0.901575f,0.312265f, +0.248395f,0.88619f,0.39111f, +0.0914055f,0.966416f,0.240179f, +0.127765f,0.989974f,-0.0602251f, +0.140331f,0.988333f,-0.0592086f, +-0.14269f,0.987394f,-0.0685058f, +-0.196659f,0.96924f,-0.147981f, +-0.173702f,0.951221f,-0.254961f, +-0.143754f,0.948468f,-0.282389f, +-0.0849965f,0.99069f,-0.106347f, +-0.164159f,0.984178f,0.0666661f, +-0.232036f,0.961292f,0.148586f, +-0.256871f,0.951713f,0.168109f, +-0.0692891f,0.973705f,0.217018f, +0.083167f,0.991239f,0.102607f, +0.0755656f,0.994003f,-0.07904f, +0.210733f,0.972404f,-0.100116f, +0.30249f,0.937213f,-0.173582f, +0.293071f,0.941554f,-0.166086f, +0.154342f,0.975072f,-0.159414f, +0.102764f,0.994605f,0.0141294f, +0.056079f,0.980415f,0.188792f, +0.109909f,0.955557f,0.273554f, +0.133139f,0.972499f,0.191102f, +0.0554464f,0.995429f,0.0777578f, +0.259868f,0.925249f,0.276374f, +0.196037f,0.949951f,0.243232f, +0.114869f,0.970528f,0.21185f, +0.223665f,0.947755f,0.227452f, +0.0930818f,0.995219f,-0.0295687f, +-0.269847f,0.892223f,-0.362106f, +-0.284642f,0.866853f,-0.409321f, +-0.255009f,0.880625f,-0.399336f, +-0.131932f,0.93993f,-0.314842f, +0.0677192f,0.974824f,-0.212442f, +0.187299f,0.973952f,-0.127815f, +0.0529524f,0.998138f,-0.0302806f, +-0.109006f,0.993972f,0.0117426f, +-0.296161f,0.95278f,-0.067077f, +-0.391399f,0.918205f,-0.0608803f, +-0.369652f,0.920023f,-0.130056f, +-0.175066f,0.983052f,-0.0544101f, +0.0114037f,0.997649f,0.0675687f, +-0.0112147f,0.996664f,0.0808418f, +0.0734363f,0.988721f,0.130533f, +0.0224625f,0.993745f,0.109391f, +0.0118323f,0.985875f,0.167063f, +0.164185f,0.947186f,0.275466f, +0.0854603f,0.916044f,0.391867f, +-0.130673f,0.906994f,0.400358f, +-0.128332f,0.898319f,0.420183f, +-0.0833752f,0.911617f,0.402496f, +-0.0573327f,0.932174f,0.357442f, +-0.17852f,0.926686f,0.330734f, +-0.230606f,0.897072f,0.376939f, +-0.191094f,0.893503f,0.406369f, +-0.142227f,0.886795f,0.439733f, +-0.17679f,0.896492f,0.40626f, +-0.238548f,0.945234f,0.222772f, +-0.0952672f,0.973092f,0.209801f, +-0.096256f,0.964628f,0.245412f, +-0.179685f,0.951666f,0.249087f, +-0.204503f,0.928081f,0.311197f, +-0.0772696f,0.924068f,0.374336f, +0.158946f,0.926358f,0.341463f, +0.256333f,0.910209f,0.325291f, +0.24298f,0.91134f,0.332296f, +0.258464f,0.899993f,0.351011f, +0.335956f,0.897826f,0.28468f, +0.32299f,0.94494f,0.0525965f, +0.125001f,0.99187f,-0.0238687f, +-0.121525f,0.992278f,-0.0248174f, +-0.149564f,0.988264f,-0.0310731f, +-0.0664528f,0.99755f,-0.021853f, +-0.216702f,0.971886f,-0.0920818f, +-0.313688f,0.949511f,-0.0053432f, +-0.230579f,0.964148f,0.131349f, +-0.200205f,0.977444f,0.06724f, +-0.214561f,0.975215f,-0.0540219f, +-0.0751922f,0.988525f,-0.131015f, +0.196994f,0.973692f,-0.114533f, +0.277294f,0.941009f,-0.193932f, +0.227557f,0.901482f,-0.368168f, +0.240964f,0.919471f,-0.31066f, +0.212207f,0.970864f,-0.111317f, +0.0629816f,0.997092f,0.0428958f, +-0.106678f,0.985091f,0.134967f, +-0.0538645f,0.972292f,0.227481f, +0.0800601f,0.969345f,0.232295f, +0.209708f,0.947853f,0.239995f, +0.200719f,0.957631f,0.206531f, +0.262538f,0.945755f,0.191366f, +0.219609f,0.958448f,0.182068f, +0.16942f,0.971857f,0.163679f, +0.226298f,0.968297f,0.105781f, +0.311569f,0.942438f,0.12139f, +0.0252626f,0.999298f,-0.0276703f, +-0.250271f,0.93337f,-0.257262f, +-0.253906f,0.911858f,-0.322563f, +-0.227242f,0.899531f,-0.373102f, +-0.0651757f,0.944171f,-0.322945f, +0.0757455f,0.97969f,-0.185662f, +-0.00346825f,0.999555f,-0.0296364f, +-0.101674f,0.994706f,-0.0148914f, +-0.257112f,0.961591f,-0.0961018f, +-0.383381f,0.91395f,-0.133094f, +-0.376104f,0.917884f,-0.12663f, +-0.286338f,0.956389f,-0.0577212f, +-0.0969792f,0.993405f,0.061176f, +-0.0181638f,0.982944f,0.183006f, +0.0407231f,0.989025f,0.142023f, +0.0858284f,0.987795f,0.129982f, +0.0586048f,0.994197f,0.0902062f, +0.00131743f,0.999561f,0.0296072f, +-0.0615813f,0.973472f,0.220363f, +-0.103673f,0.946783f,0.304719f, +-0.0728984f,0.963065f,0.259214f, +-0.0671535f,0.98356f,0.16763f, +-0.0415144f,0.986558f,0.158053f, +-0.226194f,0.961315f,0.157196f, +-0.322442f,0.916637f,0.236235f, +-0.20303f,0.923357f,0.32587f, +-0.141662f,0.940817f,0.307889f, +-0.0764267f,0.960304f,0.268283f, +-0.0942789f,0.977491f,0.188741f, +-0.142883f,0.973984f,0.175899f, +-0.198273f,0.947542f,0.250702f, +-0.198314f,0.931193f,0.305861f, +-0.212116f,0.938506f,0.272421f, +-0.0469422f,0.977819f,0.204126f, +0.196637f,0.969918f,0.1435f, +0.210661f,0.950426f,0.228718f, +0.210629f,0.90739f,0.363701f, +0.274296f,0.882172f,0.382799f, +0.402024f,0.855402f,0.326595f, +0.442462f,0.866019f,0.232889f, +0.128104f,0.97894f,0.158954f, +-0.10509f,0.973708f,0.202109f, +-0.168744f,0.972176f,0.162479f, +-0.102712f,0.980722f,0.166234f, +-0.117365f,0.985855f,0.119644f, +-0.348177f,0.934585f,-0.0729569f, +-0.249993f,0.967414f,-0.040164f, +-0.059218f,0.996444f,-0.0599467f, +-0.0488698f,0.975685f,-0.21366f, +-0.0228314f,0.943327f,-0.331077f, +0.144917f,0.936565f,-0.319132f, +0.332603f,0.901794f,-0.275938f, +0.285592f,0.906866f,-0.309889f, +0.0349917f,0.981145f,-0.190079f, +-0.0795345f,0.991829f,0.0997459f, +-0.0793233f,0.9451f,0.317009f, +-0.0879959f,0.940679f,0.327688f, +-0.00912821f,0.970457f,0.241099f, +0.124716f,0.982357f,0.13936f, +0.187981f,0.977561f,0.0950669f, +0.255482f,0.951122f,0.173483f, +0.297001f,0.952441f,0.0681659f, +0.265042f,0.961574f,0.0716068f, +0.186715f,0.981446f,0.0436002f, +0.255349f,0.964505f,0.0672885f, +0.267248f,0.96042f,0.078566f, +0.154901f,0.983709f,0.0912232f, +-0.0558054f,0.990723f,-0.123913f, +-0.190326f,0.930089f,-0.314182f, +-0.171804f,0.925365f,-0.337911f, +-0.124574f,0.93618f,-0.328706f, +-0.0782933f,0.960403f,-0.267387f, +-0.15298f,0.970001f,-0.188931f, +-0.0717491f,0.993745f,-0.0855706f, +-0.147047f,0.986451f,-0.0727437f, +-0.378361f,0.919377f,-0.107652f, +-0.386168f,0.917464f,-0.0955771f, +-0.364818f,0.925918f,-0.097894f, +-0.234461f,0.971639f,0.0307667f, +-0.0876095f,0.988677f,0.121826f, +0.151616f,0.984538f,0.0877402f, +0.0730881f,0.996968f,-0.0267174f, +0.0661066f,0.997404f,0.0285557f, +0.00089126f,0.998637f,0.052186f, +-0.169004f,0.978667f,0.116824f, +-0.169994f,0.972188f,0.161096f, +-0.0375438f,0.966292f,0.254695f, +0.0282607f,0.96926f,0.244409f, +0.0134123f,0.993493f,0.113096f, +-0.245106f,0.969303f,-0.0193377f, +-0.4073f,0.913294f,0.000911808f, +-0.297873f,0.952205f,0.0676567f, +-0.106293f,0.976869f,0.185552f, +-0.0629676f,0.97793f,0.199217f, +-0.110366f,0.958688f,0.262177f, +-0.181956f,0.936769f,0.298926f, +-0.212233f,0.945122f,0.248398f, +-0.195256f,0.962306f,0.189318f, +-0.105775f,0.982974f,0.150248f, +0.0268617f,0.999457f,0.0191026f, +0.158413f,0.985011f,0.068261f, +0.0517671f,0.977028f,0.206729f, +0.0576574f,0.95413f,0.293788f, +0.234396f,0.901434f,0.363971f, +0.437391f,0.816127f,0.377659f, +0.504071f,0.803908f,0.315666f, +0.133347f,0.946928f,0.292483f, +-0.151412f,0.933905f,0.323877f, +-0.120106f,0.92207f,0.367915f, +-0.00325057f,0.939171f,0.343435f, +0.0348166f,0.983178f,0.179299f, +-0.135523f,0.990774f,0.00106677f, +-0.269937f,0.929173f,-0.252528f, +-0.0598233f,0.968739f,-0.240761f, +0.0705133f,0.981516f,-0.177915f, +0.0411605f,0.966746f,-0.252403f, +0.126252f,0.944488f,-0.30332f, +0.315542f,0.911296f,-0.264523f, +0.160596f,0.976989f,-0.140362f, +-0.167382f,0.98071f,0.100946f, +-0.298691f,0.934743f,0.192454f, +-0.145935f,0.9608f,0.235724f, +-0.00307512f,0.970287f,0.241936f, +0.110563f,0.982642f,0.148964f, +0.216043f,0.97432f,0.0634533f, +0.143964f,0.986263f,0.0809867f, +0.0914437f,0.980957f,0.17135f, +0.140934f,0.985084f,-0.0987321f, +0.206841f,0.978337f,0.00859891f, +0.190086f,0.979435f,0.0676362f, +0.201515f,0.978077f,0.0525072f, +0.267937f,0.960786f,0.0714189f, +0.246755f,0.968907f,0.0182169f, +0.214715f,0.971106f,-0.104168f, +-0.0180649f,0.956568f,-0.290949f, +-0.219959f,0.899081f,-0.378512f, +-0.191729f,0.921961f,-0.336494f, +-0.106738f,0.947718f,-0.300729f, +-0.152636f,0.943663f,-0.293602f, +-0.224106f,0.947646f,-0.227472f, +-0.228203f,0.973419f,0.019469f, +-0.388401f,0.917519f,0.0854554f, +-0.336148f,0.939599f,0.0644837f, +-0.402605f,0.913568f,-0.0574625f, +-0.305232f,0.952235f,-0.00907982f, +-0.096739f,0.995183f,-0.0159156f, +0.180076f,0.982792f,0.0411394f, +0.136148f,0.986894f,0.0866302f, +0.0219341f,0.999371f,0.0278606f, +-0.0791566f,0.996134f,0.0381004f, +-0.239326f,0.960376f,0.142833f, +-0.218166f,0.951783f,0.215666f, +-0.166214f,0.94168f,0.292596f, +0.0428911f,0.92465f,0.378394f, +0.200943f,0.923885f,0.325667f, +-0.0783125f,0.985711f,0.149132f, +-0.415101f,0.909654f,-0.0148509f, +-0.366356f,0.929766f,0.0363078f, +-0.239727f,0.962799f,0.124698f, +-0.166496f,0.955565f,0.243259f, +-0.200219f,0.921854f,0.331809f, +-0.112297f,0.932828f,0.342375f, +-0.106223f,0.957221f,0.269154f, +-0.127872f,0.96503f,0.228835f, +-0.0138049f,0.984551f,0.174552f, +0.0256733f,0.993774f,0.108417f, +0.00728748f,0.973829f,0.227164f, +-0.00741294f,0.956693f,0.291004f, +0.0683597f,0.974464f,0.213887f, +0.177941f,0.966015f,0.187489f, +0.424978f,0.876377f,0.226619f, +0.505816f,0.827485f,0.243758f, +0.166361f,0.911198f,0.376885f, +-0.17476f,0.913668f,0.366973f, +-0.176728f,0.923512f,0.340431f, +0.0722139f,0.943797f,0.322541f, +0.177366f,0.957288f,0.228344f, +0.0913959f,0.986484f,0.136004f, +-0.0297265f,0.993047f,-0.113903f, +-0.0869422f,0.951911f,-0.293781f, +-0.0450316f,0.952406f,-0.301489f, +0.143119f,0.964298f,-0.222813f, +0.165675f,0.921893f,-0.350237f, +0.164354f,0.949667f,-0.266682f, +-0.039757f,0.998354f,0.0413462f, +-0.291683f,0.947651f,0.12992f, +-0.239728f,0.968947f,0.0605947f, +-0.107127f,0.994229f,0.00574708f, +-0.00468879f,0.997776f,-0.0664969f, +0.179786f,0.983119f,-0.033983f, +0.200209f,0.979349f,-0.0281487f, +0.0601426f,0.997956f,0.0216006f, +-0.0759803f,0.997037f,0.0120005f, +0.14599f,0.98347f,-0.107112f, +0.111543f,0.987674f,-0.109808f, +0.157618f,0.987042f,-0.0300797f, +0.250909f,0.967637f,-0.026879f, +0.281043f,0.956928f,-0.0728269f, +0.296885f,0.954758f,-0.0172396f, +0.276747f,0.960894f,-0.00969537f, +0.102049f,0.992961f,-0.0601211f, +-0.130111f,0.972079f,-0.195279f, +-0.17254f,0.923261f,-0.343248f, +-0.125309f,0.912244f,-0.390012f, +-0.211743f,0.924189f,-0.317868f, +-0.376287f,0.901788f,-0.212569f, +-0.427638f,0.901509f,-0.0663888f, +-0.389415f,0.920624f,0.0283935f, +-0.297925f,0.953877f,0.0368632f, +-0.273734f,0.961504f,0.0240644f, +-0.334113f,0.936286f,-0.108341f, +-0.109536f,0.993721f,-0.0228029f, +0.0288145f,0.999546f,0.00876748f, +0.119784f,0.984043f,0.131571f, +0.0511538f,0.994284f,0.0937163f, +-0.0752276f,0.983313f,0.165639f, +-0.293078f,0.946365f,0.136011f, +-0.332793f,0.935954f,0.115063f, +-0.225106f,0.941939f,0.249154f, +0.0114661f,0.958888f,0.283552f, +0.24485f,0.921506f,0.301455f, +0.100987f,0.953885f,0.282675f, +-0.340266f,0.932035f,0.124616f, +-0.415762f,0.898895f,0.138312f, +-0.325966f,0.925955f,0.190664f, +-0.250966f,0.918836f,0.304559f, +-0.221816f,0.898675f,0.378392f, +-0.0852583f,0.899614f,0.428282f, +-0.0998073f,0.904564f,0.41449f, +-0.102816f,0.885513f,0.453096f, +0.0414724f,0.91382f,0.403996f, +-0.0128006f,0.939036f,0.343581f, +-0.0641104f,0.924175f,0.376551f, +0.0655361f,0.926269f,0.37112f, +0.187467f,0.942186f,0.277743f, +0.21985f,0.965692f,0.138218f, +0.3812f,0.921864f,0.0696633f, +0.433954f,0.878909f,0.197998f, +0.0643484f,0.944154f,0.32316f, +-0.162002f,0.923385f,0.348016f, +-0.0466746f,0.93461f,0.352597f, +0.113297f,0.96975f,0.216212f, +0.268791f,0.938715f,0.215791f, +0.199257f,0.972974f,0.116695f, +0.13591f,0.990721f,-0.000598755f, +0.098836f,0.989317f,-0.107165f, +0.00840194f,0.94937f,-0.314049f, +0.0977197f,0.93606f,-0.337997f, +0.228369f,0.952655f,-0.20074f, +-0.102319f,0.98537f,-0.136295f, +-0.210478f,0.975126f,0.0694824f, +-0.226245f,0.97389f,-0.0187694f, +-0.184535f,0.981701f,-0.0470082f, +-0.0356904f,0.995184f,-0.0912977f, +0.0448449f,0.980059f,-0.193583f, +0.0871766f,0.981936f,-0.167935f, +0.149691f,0.986438f,-0.0673319f, +0.081336f,0.996451f,-0.021693f, +0.0320348f,0.999323f,-0.0181162f, +0.0913657f,0.979354f,-0.180329f, +0.100696f,0.986931f,-0.125808f, +0.108832f,0.988438f,-0.105573f, +0.287509f,0.953f,-0.0955498f, +0.243655f,0.954139f,-0.173927f, +0.160509f,0.983073f,-0.0883436f, +0.264497f,0.963724f,0.0357424f, +0.162998f,0.986545f,0.0127154f, +0.0143391f,0.999851f,0.00965394f, +-0.0125406f,0.999093f,-0.0406807f, +-0.106874f,0.984584f,-0.138462f, +-0.285824f,0.938351f,-0.194429f, +-0.419998f,0.877928f,-0.22988f, +-0.451562f,0.860313f,-0.236545f, +-0.434075f,0.875052f,-0.214154f, +-0.338822f,0.927615f,-0.157258f, +-0.245036f,0.962096f,-0.119701f, +-0.344114f,0.932339f,-0.111035f, +-0.226404f,0.972006f,0.0628119f, +0.0419787f,0.991974f,0.119273f, +0.128473f,0.991295f,0.0288037f, +-0.0257017f,0.999564f,0.0145347f, +-0.185301f,0.952066f,0.243378f, +-0.184541f,0.936895f,0.29694f, +-0.273419f,0.950852f,0.145334f, +-0.319783f,0.945196f,0.0659039f, +-0.035432f,0.98966f,0.138987f, +0.220222f,0.955124f,0.19809f, +0.125192f,0.96286f,0.239224f, +-0.256002f,0.939458f,0.227776f, +-0.448892f,0.878586f,0.163043f, +-0.385115f,0.893165f,0.232256f, +-0.361248f,0.871706f,0.331103f, +-0.291851f,0.846516f,0.445235f, +-0.17348f,0.85884f,0.481973f, +-0.107775f,0.841326f,0.529675f, +-0.0921307f,0.850827f,0.517306f, +0.0950699f,0.836893f,0.539048f, +0.0822562f,0.850572f,0.519385f, +0.00749303f,0.916802f,0.399272f, +0.0761143f,0.966912f,0.243491f, +0.269493f,0.937399f,0.220582f, +0.37073f,0.916186f,0.152194f, +0.358083f,0.929944f,0.083549f, +0.335187f,0.907961f,0.251509f, +0.0578141f,0.947361f,0.314904f, +-0.166707f,0.957873f,0.233855f, +-0.0184246f,0.983369f,0.180682f, +0.167068f,0.976917f,0.13312f, +0.286534f,0.942354f,0.172822f, +0.301062f,0.945554f,0.123648f, +0.228175f,0.972518f,0.0463188f, +0.216797f,0.97484f,-0.0518194f, +0.199106f,0.962895f,-0.18218f, +0.00394531f,0.962307f,-0.271937f, +-0.0105699f,0.99745f,-0.0705888f, +-0.131705f,0.985651f,0.105578f, +-0.19725f,0.980353f,0.00065076f, +-0.141436f,0.988723f,-0.0492296f, +-0.163841f,0.979948f,-0.113394f, +0.0189882f,0.981225f,-0.191928f, +0.0882705f,0.978772f,-0.18497f, +0.0393937f,0.981447f,-0.187645f, +0.0729287f,0.986122f,-0.149146f, +0.0148824f,0.998969f,-0.0428982f, +-0.0177962f,0.999449f,0.0279995f, +-0.0162323f,0.963189f,-0.268333f, +0.00641467f,0.976357f,-0.216067f, +0.107749f,0.98057f,-0.16393f, +0.293413f,0.939289f,-0.177892f, +0.308304f,0.934826f,-0.17621f, +0.101903f,0.952869f,-0.285755f, +0.182917f,0.946528f,-0.265755f, +0.146405f,0.977668f,-0.15077f, +-0.0629734f,0.995858f,-0.0655825f, +-0.0448201f,0.998977f,-0.00597126f, +-0.0400505f,0.999191f,-0.00375744f, +-0.153158f,0.98627f,-0.0617534f, +-0.285484f,0.92871f,-0.236637f, +-0.448842f,0.826713f,-0.339243f, +-0.479202f,0.840256f,-0.253646f, +-0.347296f,0.912974f,-0.214157f, +-0.288381f,0.931416f,-0.222037f, +-0.393139f,0.905395f,-0.160316f, +-0.362299f,0.919254f,-0.153982f, +0.042344f,0.998556f,-0.0330675f, +0.205011f,0.978411f,0.0261187f, +-0.127573f,0.99058f,0.0497635f, +-0.371574f,0.908811f,0.189723f, +-0.216831f,0.928294f,0.302084f, +-0.0703165f,0.93644f,0.343708f, +-0.232099f,0.969924f,0.0733245f, +-0.112472f,0.99344f,-0.0206566f, +0.137846f,0.985164f,0.102232f, +0.0558694f,0.966778f,0.249437f, +-0.236804f,0.911959f,0.335045f, +-0.429918f,0.856338f,0.286105f, +-0.441526f,0.844766f,0.302366f, +-0.455345f,0.82665f,0.330622f, +-0.361376f,0.843549f,0.397281f, +-0.152799f,0.875871f,0.457714f, +-0.118894f,0.891156f,0.437842f, +-0.0896442f,0.897342f,0.432135f, +0.0157836f,0.897193f,0.441356f, +0.112602f,0.854856f,0.5065f, +0.219938f,0.859901f,0.460648f, +0.288065f,0.92641f,0.242451f, +0.293811f,0.955367f,0.0308066f, +0.390529f,0.919592f,0.0428713f, +0.271277f,0.959279f,0.0786938f, +0.217133f,0.949907f,0.22479f, +0.0884504f,0.963513f,0.252624f, +-0.0236259f,0.986232f,0.163669f, +0.0800779f,0.996646f,0.0168362f, +0.165418f,0.984838f,-0.0522657f, +0.249596f,0.968284f,-0.0113122f, +0.338274f,0.940962f,-0.0126639f, +0.305431f,0.950632f,-0.0548703f, +0.294152f,0.946987f,-0.12919f, +0.225417f,0.970184f,-0.0890507f, +-0.00713906f,0.99978f,0.0197001f, +-0.176932f,0.984214f,-0.00420403f, +-0.111846f,0.993652f,0.0120569f, +-0.1391f,0.984895f,-0.103119f, +-0.088794f,0.987668f,-0.128949f, +-0.0465185f,0.96883f,-0.243321f, +0.0250763f,0.955082f,-0.295277f, +0.0363238f,0.977208f,-0.209152f, +0.0515148f,0.981849f,-0.182534f, +-0.0181f,0.986039f,-0.165529f, +-0.1292f,0.991547f,-0.0118974f, +-0.123925f,0.986172f,0.110035f, +0.0445182f,0.949745f,-0.309843f, +-0.00147152f,0.93224f,-0.361838f, +0.114309f,0.919114f,-0.377045f, +0.249456f,0.882365f,-0.399004f, +0.318339f,0.895336f,-0.311503f, +0.245085f,0.904168f,-0.349877f, +0.0939131f,0.907167f,-0.410156f, +-0.0302879f,0.963667f,-0.265383f, +-0.13844f,0.974516f,-0.176503f, +-0.0411687f,0.989896f,-0.135687f, +-0.00628724f,0.990542f,-0.137063f, +-0.112489f,0.976976f,-0.181283f, +-0.1315f,0.967086f,-0.217836f, +-0.376506f,0.872387f,-0.311743f, +-0.531305f,0.793042f,-0.297992f, +-0.39351f,0.883689f,-0.253462f, +-0.336847f,0.927504f,-0.162083f, +-0.393317f,0.917094f,-0.0651222f, +-0.321501f,0.93797f,-0.129808f, +-0.135804f,0.972419f,-0.189625f, +0.0526632f,0.998612f,0.00112608f, +-0.194024f,0.972777f,0.126724f, +-0.436845f,0.883669f,0.168215f, +-0.311688f,0.924669f,0.218719f, +-0.0696464f,0.953993f,0.291628f, +0.0409792f,0.956788f,0.287884f, +-0.0764775f,0.990645f,0.113025f, +-0.0364568f,0.989186f,0.142066f, +-0.121833f,0.946798f,0.297877f, +-0.315082f,0.850341f,0.421476f, +-0.377714f,0.797842f,0.469873f, +-0.420842f,0.786479f,0.452043f, +-0.397492f,0.78965f,0.467389f, +-0.380055f,0.83336f,0.401334f, +-0.183142f,0.896787f,0.402781f, +-0.0888282f,0.916137f,0.3909f, +-0.0940934f,0.935116f,0.34162f, +0.00386799f,0.937503f,0.347956f, +0.10018f,0.944394f,0.313183f, +0.280679f,0.93056f,0.235113f, +0.465087f,0.85876f,0.215002f, +0.41466f,0.904302f,0.101461f, +0.364139f,0.929581f,0.0572809f, +0.242065f,0.968602f,0.0566915f, +0.117842f,0.992149f,0.0418746f, +0.148716f,0.982681f,0.110551f, +0.0959266f,0.995185f,0.0201233f, +0.176327f,0.980433f,-0.0875236f, +0.210189f,0.965141f,-0.155959f, +0.226725f,0.946611f,-0.229181f, +0.330781f,0.920607f,-0.207526f, +0.365923f,0.916599f,-0.161081f, +0.298516f,0.923753f,-0.239936f, +0.0221976f,0.976238f,-0.215559f, +-0.104515f,0.994469f,-0.0104162f, +-0.0427336f,0.998984f,-0.0143091f, +-0.0839971f,0.989572f,-0.117013f, +-0.00725244f,0.993108f,-0.116977f, +-0.0399839f,0.966361f,-0.254064f, +0.00504893f,0.980798f,-0.194961f, +-0.018473f,0.987693f,-0.155309f, +-0.0253738f,0.987423f,-0.15605f, +0.000452807f,0.989468f,-0.144748f, +-0.0811148f,0.995994f,-0.0376225f, +-0.286969f,0.957515f,0.0285449f, +-0.27524f,0.951495f,0.137481f, +0.163018f,0.971572f,-0.171676f, +0.122581f,0.955248f,-0.269212f, +0.130974f,0.917919f,-0.374527f, +0.258812f,0.917892f,-0.300816f, +0.268244f,0.908354f,-0.320839f, +0.223034f,0.911459f,-0.345686f, +0.0389184f,0.957275f,-0.28655f, +-0.140597f,0.964524f,-0.223439f, +-0.145862f,0.970122f,-0.193875f, +-0.104111f,0.974098f,-0.200733f, +-0.0208986f,0.992723f,-0.118595f, +-0.0701237f,0.994147f,-0.08218f, +-0.122604f,0.99062f,-0.0603304f, +-0.259222f,0.963912f,-0.0606481f, +-0.533518f,0.797325f,-0.282189f, +-0.48726f,0.821939f,-0.294948f, +-0.445665f,0.877532f,-0.176975f, +-0.446224f,0.888631f,-0.105925f, +-0.296073f,0.952805f,-0.0671049f, +-0.124475f,0.991773f,-0.0298685f, +-0.112069f,0.99368f,-0.00632266f, +-0.24484f,0.957295f,0.15375f, +-0.472578f,0.869701f,0.142444f, +-0.348902f,0.914252f,0.205937f, +-0.110311f,0.945787f,0.30548f, +-0.00134709f,0.941519f,0.336957f, +0.0293716f,0.928574f,0.369983f, +-0.116225f,0.946895f,0.299803f, +-0.223618f,0.889099f,0.399372f, +-0.413824f,0.817577f,0.400396f, +-0.452277f,0.775981f,0.439658f, +-0.398113f,0.749968f,0.528257f, +-0.374899f,0.784234f,0.494397f, +-0.25264f,0.860337f,0.442712f, +-0.127446f,0.920564f,0.369215f, +-0.018556f,0.935495f,0.352851f, +-0.0323754f,0.965116f,0.259814f, +0.0357851f,0.98547f,0.166039f, +0.195904f,0.976812f,0.0863732f, +0.361612f,0.932271f,0.0103395f, +0.440593f,0.897705f,0.00204446f, +0.433278f,0.895277f,0.103679f, +0.385805f,0.912456f,0.136304f, +0.326244f,0.9426f,0.0712044f, +0.139247f,0.987833f,-0.0692571f, +0.107504f,0.992792f,-0.0529845f, +0.186477f,0.981836f,-0.0349818f, +0.2261f,0.969793f,-0.0915407f, +0.319918f,0.94368f,-0.0843796f, +0.284455f,0.935881f,-0.207877f, +0.26738f,0.950319f,-0.159379f, +0.326413f,0.941309f,-0.085975f, +0.340028f,0.93811f,-0.0657985f, +0.0548427f,0.991972f,-0.113944f, +-0.195067f,0.950504f,-0.241849f, +-0.0282147f,0.982936f,-0.181769f, +-0.0838232f,0.97875f,-0.187144f, +0.0287357f,0.988886f,-0.145871f, +0.0192345f,0.984318f,-0.175351f, +-0.131262f,0.971109f,-0.199292f, +-0.0357158f,0.988874f,-0.144408f, +0.0171216f,0.989641f,-0.142542f, +-0.0610371f,0.990627f,-0.122202f, +-0.174272f,0.984646f,-0.0100664f, +-0.321779f,0.946758f,0.0104107f, +-0.391721f,0.920071f,-0.0049163f, +0.251962f,0.967049f,0.0364793f, +0.286588f,0.95799f,-0.0110494f, +0.190653f,0.96361f,-0.187371f, +0.192921f,0.95146f,-0.239803f, +0.313234f,0.932132f,-0.181696f, +0.220402f,0.968379f,-0.116899f, +0.0241557f,0.995754f,-0.0888337f, +-0.173138f,0.969731f,-0.172177f, +-0.148056f,0.974915f,-0.166191f, +-0.121802f,0.976444f,-0.178104f, +-0.134617f,0.985638f,-0.10196f, +-0.12881f,0.990748f,0.0427476f, +-0.193234f,0.979772f,0.0520324f, +-0.169584f,0.981577f,0.0880205f, +-0.37404f,0.925821f,-0.0543154f, +-0.520547f,0.83989f,-0.153672f, +-0.499517f,0.851003f,-0.162103f, +-0.4353f,0.881523f,-0.182841f, +-0.371568f,0.902946f,-0.21593f, +-0.165948f,0.980792f,-0.10251f, +-0.208618f,0.975931f,-0.0635357f, +-0.355123f,0.932394f,0.0673039f, +-0.461506f,0.884901f,0.0629418f, +-0.443442f,0.893747f,0.0676439f, +-0.18907f,0.971969f,0.139742f, +-0.0546977f,0.978989f,0.19644f, +0.0244551f,0.950588f,0.309492f, +-0.115369f,0.932748f,0.341572f, +-0.31704f,0.862788f,0.393805f, +-0.382907f,0.826411f,0.412829f, +-0.514077f,0.784716f,0.346333f, +-0.482563f,0.790781f,0.37656f, +-0.301253f,0.838125f,0.454745f, +-0.149029f,0.885064f,0.440966f, +-0.0699981f,0.93986f,0.33431f, +0.00541731f,0.96209f,0.272677f, +0.0875381f,0.972016f,0.217994f, +0.185287f,0.977612f,0.0997159f, +0.257792f,0.964794f,-0.0521163f, +0.377486f,0.923846f,-0.0633437f, +0.414459f,0.907288f,-0.071082f, +0.347034f,0.936287f,-0.0541691f, +0.366281f,0.930406f,0.0134975f, +0.42839f,0.903092f,0.0301138f, +0.236883f,0.966501f,-0.0988031f, +0.0750179f,0.986987f,-0.142226f, +0.187793f,0.976018f,-0.110108f, +0.233114f,0.960011f,-0.155038f, +0.295131f,0.944107f,-0.146833f, +0.293935f,0.952937f,-0.0742579f, +0.206131f,0.978459f,-0.0112805f, +0.26541f,0.963541f,0.0338617f, +0.315062f,0.940538f,0.126983f, +0.200639f,0.96888f,0.144968f, +-0.0482349f,0.996749f,-0.0645292f, +-0.0829471f,0.973987f,-0.210875f, +-0.0395681f,0.974449f,-0.221097f, +-0.0327152f,0.953444f,-0.299791f, +0.0198675f,0.970814f,-0.23901f, +-0.0300308f,0.967142f,-0.252456f, +-0.0212823f,0.929856f,-0.367308f, +-0.0806959f,0.938686f,-0.335198f, +-0.165388f,0.976093f,-0.141032f, +-0.248602f,0.968455f,-0.0171025f, +-0.306518f,0.951371f,0.0306604f, +-0.345042f,0.93733f,0.04856f, +0.223548f,0.968386f,-0.110699f, +0.301936f,0.947319f,-0.106873f, +0.333496f,0.936283f,-0.110248f, +0.267715f,0.952143f,-0.147486f, +0.160925f,0.980864f,-0.109589f, +0.106924f,0.990465f,0.086874f, +0.0634847f,0.989163f,0.132389f, +-0.00868593f,0.99995f,-0.00503069f, +-0.137697f,0.961899f,-0.236198f, +-0.140914f,0.964191f,-0.224676f, +-0.263955f,0.951239f,-0.159597f, +-0.23775f,0.971227f,-0.0138849f, +-0.148246f,0.985689f,0.0802536f, +-0.176705f,0.981995f,0.0667941f, +-0.283636f,0.956796f,0.0639697f, +-0.481368f,0.872896f,-0.0796102f, +-0.48359f,0.86775f,-0.114673f, +-0.410361f,0.90546f,-0.10838f, +-0.368916f,0.919839f,-0.133408f, +-0.290849f,0.948818f,-0.123086f, +-0.265473f,0.964116f,-0.001833f, +-0.375668f,0.926391f,0.025952f, +-0.457607f,0.88747f,-0.0547004f, +-0.428989f,0.902388f,-0.0407983f, +-0.246051f,0.968578f,-0.0362744f, +-0.121016f,0.990282f,0.0685327f, +-0.158606f,0.977484f,0.139173f, +-0.181659f,0.932387f,0.312498f, +-0.374645f,0.868516f,0.324533f, +-0.427131f,0.84162f,0.330508f, +-0.473189f,0.797198f,0.374923f, +-0.486417f,0.800363f,0.350452f, +-0.401778f,0.85438f,0.329557f, +-0.142919f,0.913903f,0.379941f, +0.0660554f,0.918312f,0.390308f, +0.107243f,0.947465f,0.301346f, +0.120927f,0.966132f,0.227959f, +0.280478f,0.92581f,0.253394f, +0.365712f,0.921405f,0.131406f, +0.413772f,0.910147f,-0.0206163f, +0.410674f,0.90493f,-0.111572f, +0.355567f,0.932765f,-0.0593443f, +0.345425f,0.933621f,-0.0950402f, +0.397628f,0.912297f,-0.0980078f, +0.290063f,0.956994f,0.00506036f, +0.106586f,0.994174f,-0.016042f, +0.184529f,0.978373f,-0.093465f, +0.32595f,0.937225f,-0.12396f, +0.234333f,0.947332f,-0.218287f, +0.205568f,0.971289f,-0.119751f, +0.183661f,0.977533f,-0.103434f, +0.18646f,0.974485f,-0.124944f, +0.228632f,0.97345f,-0.0111031f, +0.2372f,0.970015f,0.0529807f, +0.150741f,0.988413f,-0.0177775f, +0.0529111f,0.986113f,-0.15742f, +0.0129012f,0.976239f,-0.216311f, +0.0638914f,0.966774f,-0.247521f, +-0.013106f,0.949224f,-0.314329f, +0.00301657f,0.947335f,-0.320229f, +0.0158116f,0.945699f,-0.32466f, +-0.206362f,0.955554f,-0.21055f, +-0.363868f,0.929813f,-0.0551994f, +-0.322459f,0.943841f,0.0720059f, +-0.369143f,0.923823f,0.101411f, +-0.383217f,0.903675f,0.191093f, +0.316947f,0.930379f,-0.184227f, +0.292606f,0.932053f,-0.213681f, +0.281637f,0.95325f,-0.109518f, +0.181192f,0.981727f,-0.0581435f, +0.0846872f,0.996407f,0.000962506f, +-0.00109762f,0.999999f,0.000234158f, +0.0777708f,0.996176f,0.0398008f, +0.205791f,0.978243f,0.0262708f, +0.0568816f,0.985436f,-0.160253f, +-0.183235f,0.956309f,-0.227811f, +-0.306851f,0.928821f,-0.207686f, +-0.348537f,0.918038f,-0.189017f, +-0.243342f,0.965099f,-0.0967916f, +-0.232072f,0.972378f,-0.0249578f, +-0.190489f,0.981246f,0.0294989f, +-0.361119f,0.921084f,-0.145596f, +-0.509056f,0.842731f,-0.175118f, +-0.463553f,0.883903f,-0.0619248f, +-0.339892f,0.940435f,0.00741701f, +-0.334839f,0.939566f,-0.0714062f, +-0.350156f,0.936419f,-0.0225887f, +-0.347741f,0.937357f,0.020947f, +-0.370099f,0.928938f,-0.0100614f, +-0.438593f,0.892875f,-0.102033f, +-0.372504f,0.925425f,-0.0694955f, +-0.205666f,0.969919f,0.130228f, +-0.228734f,0.96522f,0.126612f, +-0.319826f,0.92691f,0.196338f, +-0.371568f,0.883063f,0.286595f, +-0.42486f,0.867995f,0.257059f, +-0.575514f,0.802019f,0.159839f, +-0.477155f,0.843037f,0.248216f, +-0.322215f,0.91617f,0.238347f, +-0.15776f,0.967147f,0.199344f, +0.0563134f,0.972277f,0.226949f, +0.189774f,0.959109f,0.209989f, +0.114773f,0.983426f,0.140357f, +0.195319f,0.960799f,0.196765f, +0.466014f,0.846607f,0.257076f, +0.551779f,0.823036f,0.13473f, +0.451922f,0.891695f,-0.0254353f, +0.295217f,0.951228f,-0.0895088f, +0.39575f,0.916754f,-0.0542532f, +0.335629f,0.937827f,-0.0885088f, +0.163272f,0.984979f,0.0561951f, +0.175225f,0.975709f,0.131485f, +0.276736f,0.960943f,0.00255915f, +0.374077f,0.92611f,-0.0488528f, +0.257806f,0.961501f,-0.0951409f, +0.210674f,0.973483f,-0.0891523f, +0.210996f,0.9611f,-0.178234f, +0.230566f,0.953272f,-0.195223f, +0.113631f,0.949966f,-0.290949f, +0.210906f,0.960561f,-0.181223f, +0.197018f,0.968285f,-0.153646f, +0.117662f,0.979392f,-0.164157f, +0.00452083f,0.974487f,-0.224398f, +0.0685234f,0.976453f,-0.20456f, +0.0486196f,0.979817f,-0.193895f, +-0.041249f,0.985341f,-0.165533f, +-0.0536621f,0.998462f,0.0138937f, +-0.34438f,0.936413f,0.0673216f, +-0.441342f,0.892502f,0.0930463f, +-0.35428f,0.929013f,0.106864f, +-0.394607f,0.91136f,0.117083f, +-0.495153f,0.861045f,0.115868f, +0.317163f,0.930357f,-0.183965f, +0.258032f,0.948579f,-0.183348f, +0.18786f,0.965135f,-0.182274f, +0.168177f,0.970722f,-0.171508f, +0.130487f,0.977884f,-0.163448f, +0.0391868f,0.976408f,-0.212349f, +0.0535243f,0.973465f,-0.222489f, +0.187797f,0.962281f,-0.196843f, +0.12136f,0.981658f,-0.147035f, +-0.157459f,0.973185f,-0.167681f, +-0.281843f,0.941023f,-0.18719f, +-0.339259f,0.910185f,-0.237625f, +-0.312535f,0.920718f,-0.233666f, +-0.266508f,0.952365f,-0.148237f, +-0.190534f,0.974186f,-0.121073f, +-0.276015f,0.959165f,-0.0617859f, +-0.523368f,0.852103f,0.00254573f, +-0.538f,0.84284f,-0.0133122f, +-0.352764f,0.935613f,-0.0136594f, +-0.269435f,0.962844f,-0.0183539f, +-0.350798f,0.93502f,-0.0517468f, +-0.373067f,0.922044f,-0.103225f, +-0.354323f,0.929911f,-0.0985928f, +-0.409705f,0.907488f,-0.0927797f, +-0.42852f,0.900791f,-0.070324f, +-0.329659f,0.944032f,-0.0113329f, +-0.243515f,0.962301f,0.121152f, +-0.341781f,0.918017f,0.201073f, +-0.462572f,0.875527f,0.139571f, +-0.350168f,0.914262f,0.203733f, +-0.49611f,0.864935f,0.0759072f, +-0.527565f,0.849514f,0.000485091f, +-0.337106f,0.940759f,0.0364912f, +-0.159402f,0.986691f,0.0321325f, +0.0661572f,0.997809f,-0.000201698f, +0.185343f,0.982618f,-0.0104608f, +0.145499f,0.981994f,0.120491f, +0.134704f,0.982549f,0.128264f, +0.406275f,0.89759f,0.17109f, +0.586902f,0.779785f,0.217901f, +0.565709f,0.807524f,0.166967f, +0.384632f,0.92307f,-3.36604e-005f, +0.35623f,0.932256f,-0.0632309f, +0.323525f,0.94617f,0.00968274f, +0.0775419f,0.995759f,-0.0495083f, +0.170196f,0.984289f,-0.0470022f, +0.351353f,0.935822f,-0.0280704f, +0.38341f,0.923157f,-0.0278874f, +0.285688f,0.957776f,-0.0323514f, +0.254076f,0.961785f,-0.102057f, +0.271137f,0.936424f,-0.222698f, +0.261266f,0.933845f,-0.24428f, +0.199017f,0.946563f,-0.253793f, +0.0763778f,0.960008f,-0.269355f, +0.131471f,0.985485f,-0.107402f, +0.160318f,0.984539f,-0.0705758f, +0.0961684f,0.977977f,-0.185235f, +0.0245162f,0.963631f,-0.26611f, +-0.0125968f,0.989853f,-0.141538f, +-0.234149f,0.972198f,0.00219358f, +-0.224015f,0.949544f,0.219506f, +-0.294091f,0.928539f,0.226551f, +-0.388903f,0.912184f,0.129128f, +-0.352208f,0.9324f,0.0811158f, +-0.3962f,0.915032f,0.0757807f, +-0.491066f,0.869445f,0.0540404f, +0.157697f,0.961233f,-0.226193f, +0.272083f,0.946677f,-0.172551f, +0.25297f,0.931319f,-0.262015f, +0.179666f,0.941632f,-0.284691f, +0.0998509f,0.952676f,-0.287122f, +0.0337305f,0.95661f,-0.289412f, +0.0669213f,0.956372f,-0.284383f, +0.111493f,0.948222f,-0.297395f, +0.109434f,0.973643f,-0.200107f, +-0.146896f,0.95648f,-0.252126f, +-0.266533f,0.937028f,-0.225695f, +-0.287184f,0.932451f,-0.219226f, +-0.333493f,0.906758f,-0.258015f, +-0.32756f,0.915563f,-0.233343f, +-0.294553f,0.94475f,-0.143827f, +-0.391872f,0.91893f,0.0447686f, +-0.558682f,0.823628f,0.0975275f, +-0.441987f,0.895769f,0.0473795f, +-0.31507f,0.944961f,-0.0882052f, +-0.286026f,0.950757f,-0.119373f, +-0.300544f,0.946699f,-0.115905f, +-0.336723f,0.926445f,-0.168278f, +-0.353572f,0.929204f,-0.107543f, +-0.453641f,0.88906f,-0.0615028f, +-0.438343f,0.898681f,0.0151213f, +-0.388424f,0.921475f,0.00321393f, +-0.409039f,0.909757f,0.0709235f, +-0.363684f,0.905932f,0.216843f, +-0.363969f,0.919331f,0.149522f, +-0.393196f,0.918247f,0.0470974f, +-0.399628f,0.911703f,0.0953624f, +-0.51262f,0.855967f,-0.0673815f, +-0.335242f,0.936382f,-0.103929f, +-0.0973696f,0.981557f,-0.164516f, +0.067792f,0.980923f,-0.182192f, +0.0872383f,0.996018f,-0.0183907f, +-0.00523703f,0.995218f,0.0975357f, +0.128581f,0.983098f,0.130327f, +0.373617f,0.921384f,0.107058f, +0.560261f,0.820373f,0.114439f, +0.627317f,0.771722f,0.104494f, +0.477878f,0.875076f,0.0766505f, +0.339671f,0.937101f,0.080413f, +0.338185f,0.931593f,0.133286f, +0.241006f,0.969638f,0.0414564f, +0.184566f,0.96984f,-0.159206f, +0.299844f,0.937156f,-0.178416f, +0.33645f,0.93097f,-0.14176f, +0.33978f,0.935566f,-0.0962638f, +0.338458f,0.922961f,-0.183273f, +0.376116f,0.905613f,-0.195964f, +0.229101f,0.942068f,-0.244989f, +0.179681f,0.964126f,-0.195387f, +0.0309568f,0.968834f,-0.245768f, +0.00573259f,0.975463f,-0.220088f, +0.156849f,0.977783f,-0.139061f, +0.21782f,0.972525f,-0.0821593f, +0.0218621f,0.99451f,-0.102332f, +-0.198564f,0.980065f,-0.00663249f, +-0.36267f,0.923836f,0.122463f, +-0.30382f,0.935102f,0.182419f, +-0.225949f,0.949998f,0.215522f, +-0.338005f,0.935768f,0.100459f, +-0.329518f,0.942604f,0.0540005f, +-0.353044f,0.9356f,0.00366832f, +-0.46383f,0.880375f,-0.0990046f, +0.265153f,0.963251f,-0.0429098f, +0.322279f,0.944597f,-0.0622248f, +0.315505f,0.945542f,-0.0800488f, +0.163962f,0.974749f,-0.151597f, +0.137337f,0.972433f,-0.188448f, +0.0704319f,0.957822f,-0.278599f, +0.0704671f,0.945462f,-0.318019f, +0.0908986f,0.948607f,-0.303121f, +0.035224f,0.968727f,-0.245614f, +-0.0832465f,0.983302f,-0.161824f, +-0.246429f,0.938519f,-0.241773f, +-0.316726f,0.889326f,-0.329823f, +-0.284897f,0.918994f,-0.272549f, +-0.362325f,0.886545f,-0.287677f, +-0.440048f,0.874713f,-0.203063f, +-0.497142f,0.865956f,-0.0544999f, +-0.523445f,0.849121f,-0.0707108f, +-0.401725f,0.907593f,-0.122034f, +-0.239401f,0.964528f,-0.111235f, +-0.233733f,0.958501f,-0.163231f, +-0.252964f,0.932836f,-0.256566f, +-0.367645f,0.889692f,-0.270713f, +-0.454692f,0.878935f,-0.143978f, +-0.492544f,0.866924f,-0.0764391f, +-0.481959f,0.875013f,-0.0454739f, +-0.427088f,0.903155f,0.0436767f, +-0.414523f,0.900313f,0.132691f, +-0.445145f,0.893064f,0.0654368f, +-0.272596f,0.94477f,0.181937f, +-0.346295f,0.936658f,0.0524542f, +-0.387211f,0.921676f,-0.0241059f, +-0.412405f,0.90305f,-0.120098f, +-0.307707f,0.940243f,-0.145806f, +-0.0608418f,0.995582f,-0.0715164f, +-0.0645131f,0.997917f,-0.000435129f, +-0.102008f,0.988043f,0.115607f, +0.0143588f,0.992143f,0.12428f, +0.177967f,0.984035f,-0.00139713f, +0.41001f,0.908001f,-0.0861781f, +0.552955f,0.819416f,-0.150989f, +0.604866f,0.793986f,-0.061019f, +0.412532f,0.907382f,0.080473f, +0.292095f,0.937176f,0.190737f, +0.30791f,0.927063f,0.213882f, +0.344775f,0.913992f,0.21389f, +0.356481f,0.927786f,0.110156f, +0.364153f,0.931072f,-0.0223179f, +0.345291f,0.930006f,-0.125944f, +0.351321f,0.913987f,-0.20298f, +0.3587f,0.898336f,-0.253627f, +0.30452f,0.930923f,-0.201617f, +0.2074f,0.975489f,-0.0735288f, +0.18932f,0.981882f,-0.00809888f, +0.163933f,0.983471f,-0.0768774f, +0.0155138f,0.975385f,-0.219964f, +0.0271837f,0.983796f,-0.177221f, +0.116676f,0.992898f,-0.0232359f, +-0.0753728f,0.996934f,0.0209924f, +-0.279745f,0.951672f,0.12674f, +-0.364174f,0.921867f,0.132433f, +-0.344523f,0.936581f,0.0641857f, +-0.216332f,0.972578f,0.0853902f, +-0.223892f,0.974436f,0.0186366f, +-0.28965f,0.953049f,-0.0883156f, +-0.269918f,0.95756f,-0.101108f, +-0.286201f,0.950564f,-0.120491f, +0.172976f,0.984286f,-0.0355076f, +0.24194f,0.969981f,0.0245291f, +0.324379f,0.937283f,0.127591f, +0.286811f,0.953171f,0.0959428f, +0.228455f,0.972614f,-0.0427886f, +0.182359f,0.97568f,-0.121631f, +0.113036f,0.971479f,-0.208452f, +0.0547152f,0.964701f,-0.257601f, +-0.089806f,0.977237f,-0.192205f, +-0.171631f,0.984685f,-0.0306458f, +-0.116586f,0.992809f,0.0271681f, +-0.181607f,0.981068f,-0.0672723f, +-0.351307f,0.914748f,-0.199546f, +-0.388005f,0.90325f,-0.183278f, +-0.498044f,0.847159f,-0.185132f, +-0.510366f,0.84434f,-0.163145f, +-0.479522f,0.851128f,-0.213636f, +-0.42037f,0.86671f,-0.268518f, +-0.285469f,0.932257f,-0.22227f, +-0.161107f,0.969121f,-0.186679f, +-0.183754f,0.955302f,-0.231585f, +-0.370817f,0.89935f,-0.231654f, +-0.514998f,0.83014f,-0.213645f, +-0.498206f,0.85286f,-0.156273f, +-0.539513f,0.835182f,-0.106757f, +-0.535773f,0.843208f,0.0441435f, +-0.434698f,0.878206f,0.19948f, +-0.415775f,0.89222f,0.176277f, +-0.35414f,0.920981f,0.162413f, +-0.208366f,0.953013f,0.219884f, +-0.257177f,0.962661f,0.0845243f, +-0.386488f,0.920792f,-0.0526133f, +-0.381213f,0.924327f,0.0172227f, +-0.280093f,0.955497f,0.0925905f, +-0.1219f,0.953555f,0.275451f, +-0.0595691f,0.973079f,0.222641f, +0.124431f,0.978938f,0.161854f, +0.328706f,0.943592f,0.0398269f, +0.495224f,0.863825f,-0.0925162f, +0.549494f,0.832161f,-0.0745945f, +0.445758f,0.890738f,0.0887957f, +0.286029f,0.911685f,0.294987f, +0.236342f,0.90766f,0.346837f, +0.306156f,0.900003f,0.310262f, +0.362522f,0.893707f,0.264322f, +0.407318f,0.891604f,0.197826f, +0.447705f,0.883296f,0.139101f, +0.451832f,0.890524f,0.0530504f, +0.450032f,0.892977f,-0.00796524f, +0.380264f,0.922022f,-0.0726326f, +0.220431f,0.973877f,-0.0545382f, +0.073814f,0.997262f,0.00436123f, +0.143916f,0.987825f,0.059083f, +0.242994f,0.967605f,0.068523f, +0.0793826f,0.995647f,0.0488496f, +-0.0810126f,0.994023f,0.0731786f, +0.0550609f,0.987118f,0.150223f, +-0.0403249f,0.995863f,0.0814341f, +-0.341404f,0.939899f,-0.00574405f, +-0.333197f,0.942331f,0.0315063f, +-0.270492f,0.962353f,-0.0266656f, +-0.217149f,0.973729f,-0.0685481f, +-0.150518f,0.988024f,-0.0339529f, +-0.227799f,0.970772f,-0.0755549f, +-0.30247f,0.950166f,-0.0754703f, +-0.319718f,0.946617f,-0.0411916f, +0.16825f,0.98433f,0.0527868f, +0.196178f,0.978898f,0.0572086f, +0.274186f,0.954613f,0.116347f, +0.32563f,0.930709f,0.166568f, +0.315871f,0.943308f,0.101959f, +0.191037f,0.981318f,-0.0227958f, +0.218135f,0.975914f,0.0029357f, +0.0466483f,0.982299f,-0.18142f, +-0.170175f,0.975305f,-0.140788f, +-0.258133f,0.965917f,0.0192531f, +-0.189679f,0.978131f,0.0853348f, +-0.0936377f,0.967266f,0.235858f, +-0.301926f,0.950003f,0.0795937f, +-0.345647f,0.93835f,0.00528925f, +-0.494118f,0.858314f,-0.138363f, +-0.492927f,0.860507f,-0.128646f, +-0.443878f,0.87267f,-0.203517f, +-0.398442f,0.869961f,-0.290537f, +-0.31747f,0.894846f,-0.313789f, +-0.189431f,0.934926f,-0.300049f, +-0.194231f,0.947861f,-0.252654f, +-0.355627f,0.917296f,-0.179159f, +-0.521351f,0.821848f,-0.229692f, +-0.537173f,0.817848f,-0.206322f, +-0.595314f,0.798098f,-0.0929575f, +-0.612312f,0.785394f,0.0907203f, +-0.484809f,0.839064f,0.246843f, +-0.327417f,0.875762f,0.354737f, +-0.358949f,0.909479f,0.20977f, +-0.221142f,0.943893f,0.245282f, +-0.137619f,0.956208f,0.258316f, +-0.37682f,0.920718f,0.101416f, +-0.393482f,0.900899f,0.183174f, +-0.309483f,0.930699f,0.194988f, +-0.137506f,0.96116f,0.2393f, +-0.0256175f,0.984881f,0.171327f, +0.155024f,0.972933f,0.171372f, +0.40312f,0.907825f,0.115531f, +0.491485f,0.869632f,-0.0467184f, +0.488586f,0.869843f,0.0682392f, +0.313615f,0.910806f,0.268473f, +0.190736f,0.863506f,0.466881f, +0.238952f,0.837112f,0.492083f, +0.344695f,0.840122f,0.418784f, +0.396648f,0.860615f,0.319393f, +0.456384f,0.85928f,0.230981f, +0.487857f,0.863295f,0.129295f, +0.451906f,0.891012f,0.043332f, +0.456211f,0.882737f,0.112455f, +0.397431f,0.910062f,0.117622f, +0.204941f,0.971778f,0.116821f, +0.0877111f,0.985798f,0.143208f, +0.14813f,0.986469f,0.0702648f, +0.212033f,0.976625f,0.035296f, +0.0413914f,0.99116f,0.126047f, +-0.10186f,0.970634f,0.217932f, +0.0558102f,0.971334f,0.231076f, +0.0834757f,0.981533f,0.172117f, +-0.293392f,0.955612f,-0.0269471f, +-0.339064f,0.938377f,-0.0669636f, +-0.232942f,0.969004f,-0.0822698f, +-0.249298f,0.960887f,-0.120613f, +-0.178309f,0.98375f,-0.0210319f, +-0.23671f,0.971566f,0.00516088f, +-0.322203f,0.944986f,0.0564443f, +-0.359276f,0.929551f,0.0827968f, +}; + +btScalar Landscape06Tex[] = { +0.0f,0.0078125f, +0.0f,0.0f, +0.0078125f,0.0078125f, +0.0078125f,0.0f, +0.015625f,0.0078125f, +0.015625f,0.0f, +0.0234375f,0.0078125f, +0.0234375f,0.0f, +0.03125f,0.0078125f, +0.03125f,0.0f, +0.0390625f,0.0078125f, +0.0390625f,0.0f, +0.046875f,0.0078125f, +0.046875f,0.0f, +0.0546875f,0.0078125f, +0.0546875f,0.0f, +0.0625f,0.0078125f, +0.0625f,0.0f, +0.0703125f,0.0078125f, +0.0703125f,0.0f, +0.078125f,0.0078125f, +0.078125f,0.0f, +0.0859375f,0.0078125f, +0.0859375f,0.0f, +0.09375f,0.0078125f, +0.09375f,0.0f, +0.101563f,0.0078125f, +0.101563f,0.0f, +0.109375f,0.0078125f, +0.109375f,0.0f, +0.117188f,0.0078125f, +0.117188f,0.0f, +0.125f,0.0078125f, +0.125f,0.0f, +0.132813f,0.0078125f, +0.132813f,0.0f, +0.140625f,0.0078125f, +0.140625f,0.0f, +0.148438f,0.0078125f, +0.148438f,0.0f, +0.15625f,0.0078125f, +0.15625f,0.0f, +0.164063f,0.0078125f, +0.164063f,0.0f, +0.171875f,0.0078125f, +0.171875f,0.0f, +0.179688f,0.0078125f, +0.179688f,0.0f, +0.1875f,0.0078125f, +0.1875f,0.0f, +0.195313f,0.0078125f, +0.195313f,0.0f, +0.203125f,0.0078125f, +0.203125f,0.0f, +0.210938f,0.0078125f, +0.210938f,0.0f, +0.21875f,0.0078125f, +0.21875f,0.0f, +0.226563f,0.0078125f, +0.226563f,0.0f, +0.234375f,0.0078125f, +0.234375f,0.0f, +0.242188f,0.0078125f, +0.242188f,0.0f, +0.25f,0.0078125f, +0.25f,0.0f, +0.257813f,0.0078125f, +0.257813f,0.0f, +0.265625f,0.0078125f, +0.265625f,0.0f, +0.273438f,0.0078125f, +0.273438f,0.0f, +0.28125f,0.0078125f, +0.28125f,0.0f, +0.289063f,0.0078125f, +0.289063f,0.0f, +0.296875f,0.0078125f, +0.296875f,0.0f, +0.304688f,0.0078125f, +0.304688f,0.0f, +0.3125f,0.0078125f, +0.3125f,0.0f, +0.320313f,0.0078125f, +0.320313f,0.0f, +0.328125f,0.0078125f, +0.328125f,0.0f, +0.335938f,0.0078125f, +0.335938f,0.0f, +0.34375f,0.0078125f, +0.34375f,0.0f, +0.351563f,0.0078125f, +0.351563f,0.0f, +0.359375f,0.0078125f, +0.359375f,0.0f, +0.367188f,0.0078125f, +0.367188f,0.0f, +0.375f,0.0078125f, +0.375f,0.0f, +0.382813f,0.0078125f, +0.382813f,0.0f, +0.390625f,0.0078125f, +0.390625f,0.0f, +0.398438f,0.0078125f, +0.398438f,0.0f, +0.40625f,0.0078125f, +0.40625f,0.0f, +0.414063f,0.0078125f, +0.414063f,0.0f, +0.421875f,0.0078125f, +0.421875f,0.0f, +0.429688f,0.0078125f, +0.429688f,0.0f, +0.4375f,0.0078125f, +0.4375f,0.0f, +0.445313f,0.0078125f, +0.445313f,0.0f, +0.453125f,0.0078125f, +0.453125f,0.0f, +0.460938f,0.0078125f, +0.460938f,0.0f, +0.46875f,0.0078125f, +0.46875f,0.0f, +0.476563f,0.0078125f, +0.476563f,0.0f, +0.484375f,0.0078125f, +0.484375f,0.0f, +0.492188f,0.0078125f, +0.492188f,0.0f, +0.5f,0.0078125f, +0.5f,0.0f, +0.507813f,0.0078125f, +0.507813f,0.0f, +0.0f,0.015625f, +0.0078125f,0.015625f, +0.015625f,0.015625f, +0.0234375f,0.015625f, +0.03125f,0.015625f, +0.0390625f,0.015625f, +0.046875f,0.015625f, +0.0546875f,0.015625f, +0.0625f,0.015625f, +0.0703125f,0.015625f, +0.078125f,0.015625f, +0.0859375f,0.015625f, +0.09375f,0.015625f, +0.101563f,0.015625f, +0.109375f,0.015625f, +0.117188f,0.015625f, +0.125f,0.015625f, +0.132813f,0.015625f, +0.140625f,0.015625f, +0.148438f,0.015625f, +0.15625f,0.015625f, +0.164063f,0.015625f, +0.171875f,0.015625f, +0.179688f,0.015625f, +0.1875f,0.015625f, +0.195313f,0.015625f, +0.203125f,0.015625f, +0.210938f,0.015625f, +0.21875f,0.015625f, +0.226563f,0.015625f, +0.234375f,0.015625f, +0.242188f,0.015625f, +0.25f,0.015625f, +0.257813f,0.015625f, +0.265625f,0.015625f, +0.273438f,0.015625f, +0.28125f,0.015625f, +0.289063f,0.015625f, +0.296875f,0.015625f, +0.304688f,0.015625f, +0.3125f,0.015625f, +0.320313f,0.015625f, +0.328125f,0.015625f, +0.335938f,0.015625f, +0.34375f,0.015625f, +0.351563f,0.015625f, +0.359375f,0.015625f, +0.367188f,0.015625f, +0.375f,0.015625f, +0.382813f,0.015625f, +0.390625f,0.015625f, +0.398438f,0.015625f, +0.40625f,0.015625f, +0.414063f,0.015625f, +0.421875f,0.015625f, +0.429688f,0.015625f, +0.4375f,0.015625f, +0.445313f,0.015625f, +0.453125f,0.015625f, +0.460938f,0.015625f, +0.46875f,0.015625f, +0.476563f,0.015625f, +0.484375f,0.015625f, +0.492188f,0.015625f, +0.5f,0.015625f, +0.507813f,0.015625f, +0.0f,0.0234375f, +0.0078125f,0.0234375f, +0.015625f,0.0234375f, +0.0234375f,0.0234375f, +0.03125f,0.0234375f, +0.0390625f,0.0234375f, +0.046875f,0.0234375f, +0.0546875f,0.0234375f, +0.0625f,0.0234375f, +0.0703125f,0.0234375f, +0.078125f,0.0234375f, +0.0859375f,0.0234375f, +0.09375f,0.0234375f, +0.101563f,0.0234375f, +0.109375f,0.0234375f, +0.117188f,0.0234375f, +0.125f,0.0234375f, +0.132813f,0.0234375f, +0.140625f,0.0234375f, +0.148438f,0.0234375f, +0.15625f,0.0234375f, +0.164063f,0.0234375f, +0.171875f,0.0234375f, +0.179688f,0.0234375f, +0.1875f,0.0234375f, +0.195313f,0.0234375f, +0.203125f,0.0234375f, +0.210938f,0.0234375f, +0.21875f,0.0234375f, +0.226563f,0.0234375f, +0.234375f,0.0234375f, +0.242188f,0.0234375f, +0.25f,0.0234375f, +0.257813f,0.0234375f, +0.265625f,0.0234375f, +0.273438f,0.0234375f, +0.28125f,0.0234375f, +0.289063f,0.0234375f, +0.296875f,0.0234375f, +0.304688f,0.0234375f, +0.3125f,0.0234375f, +0.320313f,0.0234375f, +0.328125f,0.0234375f, +0.335938f,0.0234375f, +0.34375f,0.0234375f, +0.351563f,0.0234375f, +0.359375f,0.0234375f, +0.367188f,0.0234375f, +0.375f,0.0234375f, +0.382813f,0.0234375f, +0.390625f,0.0234375f, +0.398438f,0.0234375f, +0.40625f,0.0234375f, +0.414063f,0.0234375f, +0.421875f,0.0234375f, +0.429688f,0.0234375f, +0.4375f,0.0234375f, +0.445313f,0.0234375f, +0.453125f,0.0234375f, +0.460938f,0.0234375f, +0.46875f,0.0234375f, +0.476563f,0.0234375f, +0.484375f,0.0234375f, +0.492188f,0.0234375f, +0.5f,0.0234375f, +0.507813f,0.0234375f, +0.0f,0.03125f, +0.0078125f,0.03125f, +0.015625f,0.03125f, +0.0234375f,0.03125f, +0.03125f,0.03125f, +0.0390625f,0.03125f, +0.046875f,0.03125f, +0.0546875f,0.03125f, +0.0625f,0.03125f, +0.0703125f,0.03125f, +0.078125f,0.03125f, +0.0859375f,0.03125f, +0.09375f,0.03125f, +0.101563f,0.03125f, +0.109375f,0.03125f, +0.117188f,0.03125f, +0.125f,0.03125f, +0.132813f,0.03125f, +0.140625f,0.03125f, +0.148438f,0.03125f, +0.15625f,0.03125f, +0.164063f,0.03125f, +0.171875f,0.03125f, +0.179688f,0.03125f, +0.1875f,0.03125f, +0.195313f,0.03125f, +0.203125f,0.03125f, +0.210938f,0.03125f, +0.21875f,0.03125f, +0.226563f,0.03125f, +0.234375f,0.03125f, +0.242188f,0.03125f, +0.25f,0.03125f, +0.257813f,0.03125f, +0.265625f,0.03125f, +0.273438f,0.03125f, +0.28125f,0.03125f, +0.289063f,0.03125f, +0.296875f,0.03125f, +0.304688f,0.03125f, +0.3125f,0.03125f, +0.320313f,0.03125f, +0.328125f,0.03125f, +0.335938f,0.03125f, +0.34375f,0.03125f, +0.351563f,0.03125f, +0.359375f,0.03125f, +0.367188f,0.03125f, +0.375f,0.03125f, +0.382813f,0.03125f, +0.390625f,0.03125f, +0.398438f,0.03125f, +0.40625f,0.03125f, +0.414063f,0.03125f, +0.421875f,0.03125f, +0.429688f,0.03125f, +0.4375f,0.03125f, +0.445313f,0.03125f, +0.453125f,0.03125f, +0.460938f,0.03125f, +0.46875f,0.03125f, +0.476563f,0.03125f, +0.484375f,0.03125f, +0.492188f,0.03125f, +0.5f,0.03125f, +0.507813f,0.03125f, +0.0f,0.0390625f, +0.0078125f,0.0390625f, +0.015625f,0.0390625f, +0.0234375f,0.0390625f, +0.03125f,0.0390625f, +0.0390625f,0.0390625f, +0.046875f,0.0390625f, +0.0546875f,0.0390625f, +0.0625f,0.0390625f, +0.0703125f,0.0390625f, +0.078125f,0.0390625f, +0.0859375f,0.0390625f, +0.09375f,0.0390625f, +0.101563f,0.0390625f, +0.109375f,0.0390625f, +0.117188f,0.0390625f, +0.125f,0.0390625f, +0.132813f,0.0390625f, +0.140625f,0.0390625f, +0.148438f,0.0390625f, +0.15625f,0.0390625f, +0.164063f,0.0390625f, +0.171875f,0.0390625f, +0.179688f,0.0390625f, +0.1875f,0.0390625f, +0.195313f,0.0390625f, +0.203125f,0.0390625f, +0.210938f,0.0390625f, +0.21875f,0.0390625f, +0.226563f,0.0390625f, +0.234375f,0.0390625f, +0.242188f,0.0390625f, +0.25f,0.0390625f, +0.257813f,0.0390625f, +0.265625f,0.0390625f, +0.273438f,0.0390625f, +0.28125f,0.0390625f, +0.289063f,0.0390625f, +0.296875f,0.0390625f, +0.304688f,0.0390625f, +0.3125f,0.0390625f, +0.320313f,0.0390625f, +0.328125f,0.0390625f, +0.335938f,0.0390625f, +0.34375f,0.0390625f, +0.351563f,0.0390625f, +0.359375f,0.0390625f, +0.367188f,0.0390625f, +0.375f,0.0390625f, +0.382813f,0.0390625f, +0.390625f,0.0390625f, +0.398438f,0.0390625f, +0.40625f,0.0390625f, +0.414063f,0.0390625f, +0.421875f,0.0390625f, +0.429688f,0.0390625f, +0.4375f,0.0390625f, +0.445313f,0.0390625f, +0.453125f,0.0390625f, +0.460938f,0.0390625f, +0.46875f,0.0390625f, +0.476563f,0.0390625f, +0.484375f,0.0390625f, +0.492188f,0.0390625f, +0.5f,0.0390625f, +0.507813f,0.0390625f, +0.0f,0.046875f, +0.0078125f,0.046875f, +0.015625f,0.046875f, +0.0234375f,0.046875f, +0.03125f,0.046875f, +0.0390625f,0.046875f, +0.046875f,0.046875f, +0.0546875f,0.046875f, +0.0625f,0.046875f, +0.0703125f,0.046875f, +0.078125f,0.046875f, +0.0859375f,0.046875f, +0.09375f,0.046875f, +0.101563f,0.046875f, +0.109375f,0.046875f, +0.117188f,0.046875f, +0.125f,0.046875f, +0.132813f,0.046875f, +0.140625f,0.046875f, +0.148438f,0.046875f, +0.15625f,0.046875f, +0.164063f,0.046875f, +0.171875f,0.046875f, +0.179688f,0.046875f, +0.1875f,0.046875f, +0.195313f,0.046875f, +0.203125f,0.046875f, +0.210938f,0.046875f, +0.21875f,0.046875f, +0.226563f,0.046875f, +0.234375f,0.046875f, +0.242188f,0.046875f, +0.25f,0.046875f, +0.257813f,0.046875f, +0.265625f,0.046875f, +0.273438f,0.046875f, +0.28125f,0.046875f, +0.289063f,0.046875f, +0.296875f,0.046875f, +0.304688f,0.046875f, +0.3125f,0.046875f, +0.320313f,0.046875f, +0.328125f,0.046875f, +0.335938f,0.046875f, +0.34375f,0.046875f, +0.351563f,0.046875f, +0.359375f,0.046875f, +0.367188f,0.046875f, +0.375f,0.046875f, +0.382813f,0.046875f, +0.390625f,0.046875f, +0.398438f,0.046875f, +0.40625f,0.046875f, +0.414063f,0.046875f, +0.421875f,0.046875f, +0.429688f,0.046875f, +0.4375f,0.046875f, +0.445313f,0.046875f, +0.453125f,0.046875f, +0.460938f,0.046875f, +0.46875f,0.046875f, +0.476563f,0.046875f, +0.484375f,0.046875f, +0.492188f,0.046875f, +0.5f,0.046875f, +0.507813f,0.046875f, +0.0f,0.0546875f, +0.0078125f,0.0546875f, +0.015625f,0.0546875f, +0.0234375f,0.0546875f, +0.03125f,0.0546875f, +0.0390625f,0.0546875f, +0.046875f,0.0546875f, +0.0546875f,0.0546875f, +0.0625f,0.0546875f, +0.0703125f,0.0546875f, +0.078125f,0.0546875f, +0.0859375f,0.0546875f, +0.09375f,0.0546875f, +0.101563f,0.0546875f, +0.109375f,0.0546875f, +0.117188f,0.0546875f, +0.125f,0.0546875f, +0.132813f,0.0546875f, +0.140625f,0.0546875f, +0.148438f,0.0546875f, +0.15625f,0.0546875f, +0.164063f,0.0546875f, +0.171875f,0.0546875f, +0.179688f,0.0546875f, +0.1875f,0.0546875f, +0.195313f,0.0546875f, +0.203125f,0.0546875f, +0.210938f,0.0546875f, +0.21875f,0.0546875f, +0.226563f,0.0546875f, +0.234375f,0.0546875f, +0.242188f,0.0546875f, +0.25f,0.0546875f, +0.257813f,0.0546875f, +0.265625f,0.0546875f, +0.273438f,0.0546875f, +0.28125f,0.0546875f, +0.289063f,0.0546875f, +0.296875f,0.0546875f, +0.304688f,0.0546875f, +0.3125f,0.0546875f, +0.320313f,0.0546875f, +0.328125f,0.0546875f, +0.335938f,0.0546875f, +0.34375f,0.0546875f, +0.351563f,0.0546875f, +0.359375f,0.0546875f, +0.367188f,0.0546875f, +0.375f,0.0546875f, +0.382813f,0.0546875f, +0.390625f,0.0546875f, +0.398438f,0.0546875f, +0.40625f,0.0546875f, +0.414063f,0.0546875f, +0.421875f,0.0546875f, +0.429688f,0.0546875f, +0.4375f,0.0546875f, +0.445313f,0.0546875f, +0.453125f,0.0546875f, +0.460938f,0.0546875f, +0.46875f,0.0546875f, +0.476563f,0.0546875f, +0.484375f,0.0546875f, +0.492188f,0.0546875f, +0.5f,0.0546875f, +0.507813f,0.0546875f, +0.0f,0.0625f, +0.0078125f,0.0625f, +0.015625f,0.0625f, +0.0234375f,0.0625f, +0.03125f,0.0625f, +0.0390625f,0.0625f, +0.046875f,0.0625f, +0.0546875f,0.0625f, +0.0625f,0.0625f, +0.0703125f,0.0625f, +0.078125f,0.0625f, +0.0859375f,0.0625f, +0.09375f,0.0625f, +0.101563f,0.0625f, +0.109375f,0.0625f, +0.117188f,0.0625f, +0.125f,0.0625f, +0.132813f,0.0625f, +0.140625f,0.0625f, +0.148438f,0.0625f, +0.15625f,0.0625f, +0.164063f,0.0625f, +0.171875f,0.0625f, +0.179688f,0.0625f, +0.1875f,0.0625f, +0.195313f,0.0625f, +0.203125f,0.0625f, +0.210938f,0.0625f, +0.21875f,0.0625f, +0.226563f,0.0625f, +0.234375f,0.0625f, +0.242188f,0.0625f, +0.25f,0.0625f, +0.257813f,0.0625f, +0.265625f,0.0625f, +0.273438f,0.0625f, +0.28125f,0.0625f, +0.289063f,0.0625f, +0.296875f,0.0625f, +0.304688f,0.0625f, +0.3125f,0.0625f, +0.320313f,0.0625f, +0.328125f,0.0625f, +0.335938f,0.0625f, +0.34375f,0.0625f, +0.351563f,0.0625f, +0.359375f,0.0625f, +0.367188f,0.0625f, +0.375f,0.0625f, +0.382813f,0.0625f, +0.390625f,0.0625f, +0.398438f,0.0625f, +0.40625f,0.0625f, +0.414063f,0.0625f, +0.421875f,0.0625f, +0.429688f,0.0625f, +0.4375f,0.0625f, +0.445313f,0.0625f, +0.453125f,0.0625f, +0.460938f,0.0625f, +0.46875f,0.0625f, +0.476563f,0.0625f, +0.484375f,0.0625f, +0.492188f,0.0625f, +0.5f,0.0625f, +0.507813f,0.0625f, +0.0f,0.0703125f, +0.0078125f,0.0703125f, +0.015625f,0.0703125f, +0.0234375f,0.0703125f, +0.03125f,0.0703125f, +0.0390625f,0.0703125f, +0.046875f,0.0703125f, +0.0546875f,0.0703125f, +0.0625f,0.0703125f, +0.0703125f,0.0703125f, +0.078125f,0.0703125f, +0.0859375f,0.0703125f, +0.09375f,0.0703125f, +0.101563f,0.0703125f, +0.109375f,0.0703125f, +0.117188f,0.0703125f, +0.125f,0.0703125f, +0.132813f,0.0703125f, +0.140625f,0.0703125f, +0.148438f,0.0703125f, +0.15625f,0.0703125f, +0.164063f,0.0703125f, +0.171875f,0.0703125f, +0.179688f,0.0703125f, +0.1875f,0.0703125f, +0.195313f,0.0703125f, +0.203125f,0.0703125f, +0.210938f,0.0703125f, +0.21875f,0.0703125f, +0.226563f,0.0703125f, +0.234375f,0.0703125f, +0.242188f,0.0703125f, +0.25f,0.0703125f, +0.257813f,0.0703125f, +0.265625f,0.0703125f, +0.273438f,0.0703125f, +0.28125f,0.0703125f, +0.289063f,0.0703125f, +0.296875f,0.0703125f, +0.304688f,0.0703125f, +0.3125f,0.0703125f, +0.320313f,0.0703125f, +0.328125f,0.0703125f, +0.335938f,0.0703125f, +0.34375f,0.0703125f, +0.351563f,0.0703125f, +0.359375f,0.0703125f, +0.367188f,0.0703125f, +0.375f,0.0703125f, +0.382813f,0.0703125f, +0.390625f,0.0703125f, +0.398438f,0.0703125f, +0.40625f,0.0703125f, +0.414063f,0.0703125f, +0.421875f,0.0703125f, +0.429688f,0.0703125f, +0.4375f,0.0703125f, +0.445313f,0.0703125f, +0.453125f,0.0703125f, +0.460938f,0.0703125f, +0.46875f,0.0703125f, +0.476563f,0.0703125f, +0.484375f,0.0703125f, +0.492188f,0.0703125f, +0.5f,0.0703125f, +0.507813f,0.0703125f, +0.0f,0.078125f, +0.0078125f,0.078125f, +0.015625f,0.078125f, +0.0234375f,0.078125f, +0.03125f,0.078125f, +0.0390625f,0.078125f, +0.046875f,0.078125f, +0.0546875f,0.078125f, +0.0625f,0.078125f, +0.0703125f,0.078125f, +0.078125f,0.078125f, +0.0859375f,0.078125f, +0.09375f,0.078125f, +0.101563f,0.078125f, +0.109375f,0.078125f, +0.117188f,0.078125f, +0.125f,0.078125f, +0.132813f,0.078125f, +0.140625f,0.078125f, +0.148438f,0.078125f, +0.15625f,0.078125f, +0.164063f,0.078125f, +0.171875f,0.078125f, +0.179688f,0.078125f, +0.1875f,0.078125f, +0.195313f,0.078125f, +0.203125f,0.078125f, +0.210938f,0.078125f, +0.21875f,0.078125f, +0.226563f,0.078125f, +0.234375f,0.078125f, +0.242188f,0.078125f, +0.25f,0.078125f, +0.257813f,0.078125f, +0.265625f,0.078125f, +0.273438f,0.078125f, +0.28125f,0.078125f, +0.289063f,0.078125f, +0.296875f,0.078125f, +0.304688f,0.078125f, +0.3125f,0.078125f, +0.320313f,0.078125f, +0.328125f,0.078125f, +0.335938f,0.078125f, +0.34375f,0.078125f, +0.351563f,0.078125f, +0.359375f,0.078125f, +0.367188f,0.078125f, +0.375f,0.078125f, +0.382813f,0.078125f, +0.390625f,0.078125f, +0.398438f,0.078125f, +0.40625f,0.078125f, +0.414063f,0.078125f, +0.421875f,0.078125f, +0.429688f,0.078125f, +0.4375f,0.078125f, +0.445313f,0.078125f, +0.453125f,0.078125f, +0.460938f,0.078125f, +0.46875f,0.078125f, +0.476563f,0.078125f, +0.484375f,0.078125f, +0.492188f,0.078125f, +0.5f,0.078125f, +0.507813f,0.078125f, +0.0f,0.0859375f, +0.0078125f,0.0859375f, +0.015625f,0.0859375f, +0.0234375f,0.0859375f, +0.03125f,0.0859375f, +0.0390625f,0.0859375f, +0.046875f,0.0859375f, +0.0546875f,0.0859375f, +0.0625f,0.0859375f, +0.0703125f,0.0859375f, +0.078125f,0.0859375f, +0.0859375f,0.0859375f, +0.09375f,0.0859375f, +0.101563f,0.0859375f, +0.109375f,0.0859375f, +0.117188f,0.0859375f, +0.125f,0.0859375f, +0.132813f,0.0859375f, +0.140625f,0.0859375f, +0.148438f,0.0859375f, +0.15625f,0.0859375f, +0.164063f,0.0859375f, +0.171875f,0.0859375f, +0.179688f,0.0859375f, +0.1875f,0.0859375f, +0.195313f,0.0859375f, +0.203125f,0.0859375f, +0.210938f,0.0859375f, +0.21875f,0.0859375f, +0.226563f,0.0859375f, +0.234375f,0.0859375f, +0.242188f,0.0859375f, +0.25f,0.0859375f, +0.257813f,0.0859375f, +0.265625f,0.0859375f, +0.273438f,0.0859375f, +0.28125f,0.0859375f, +0.289063f,0.0859375f, +0.296875f,0.0859375f, +0.304688f,0.0859375f, +0.3125f,0.0859375f, +0.320313f,0.0859375f, +0.328125f,0.0859375f, +0.335938f,0.0859375f, +0.34375f,0.0859375f, +0.351563f,0.0859375f, +0.359375f,0.0859375f, +0.367188f,0.0859375f, +0.375f,0.0859375f, +0.382813f,0.0859375f, +0.390625f,0.0859375f, +0.398438f,0.0859375f, +0.40625f,0.0859375f, +0.414063f,0.0859375f, +0.421875f,0.0859375f, +0.429688f,0.0859375f, +0.4375f,0.0859375f, +0.445313f,0.0859375f, +0.453125f,0.0859375f, +0.460938f,0.0859375f, +0.46875f,0.0859375f, +0.476563f,0.0859375f, +0.484375f,0.0859375f, +0.492188f,0.0859375f, +0.5f,0.0859375f, +0.507813f,0.0859375f, +0.0f,0.09375f, +0.0078125f,0.09375f, +0.015625f,0.09375f, +0.0234375f,0.09375f, +0.03125f,0.09375f, +0.0390625f,0.09375f, +0.046875f,0.09375f, +0.0546875f,0.09375f, +0.0625f,0.09375f, +0.0703125f,0.09375f, +0.078125f,0.09375f, +0.0859375f,0.09375f, +0.09375f,0.09375f, +0.101563f,0.09375f, +0.109375f,0.09375f, +0.117188f,0.09375f, +0.125f,0.09375f, +0.132813f,0.09375f, +0.140625f,0.09375f, +0.148438f,0.09375f, +0.15625f,0.09375f, +0.164063f,0.09375f, +0.171875f,0.09375f, +0.179688f,0.09375f, +0.1875f,0.09375f, +0.195313f,0.09375f, +0.203125f,0.09375f, +0.210938f,0.09375f, +0.21875f,0.09375f, +0.226563f,0.09375f, +0.234375f,0.09375f, +0.242188f,0.09375f, +0.25f,0.09375f, +0.257813f,0.09375f, +0.265625f,0.09375f, +0.273438f,0.09375f, +0.28125f,0.09375f, +0.289063f,0.09375f, +0.296875f,0.09375f, +0.304688f,0.09375f, +0.3125f,0.09375f, +0.320313f,0.09375f, +0.328125f,0.09375f, +0.335938f,0.09375f, +0.34375f,0.09375f, +0.351563f,0.09375f, +0.359375f,0.09375f, +0.367188f,0.09375f, +0.375f,0.09375f, +0.382813f,0.09375f, +0.390625f,0.09375f, +0.398438f,0.09375f, +0.40625f,0.09375f, +0.414063f,0.09375f, +0.421875f,0.09375f, +0.429688f,0.09375f, +0.4375f,0.09375f, +0.445313f,0.09375f, +0.453125f,0.09375f, +0.460938f,0.09375f, +0.46875f,0.09375f, +0.476563f,0.09375f, +0.484375f,0.09375f, +0.492188f,0.09375f, +0.5f,0.09375f, +0.507813f,0.09375f, +0.0f,0.101563f, +0.0078125f,0.101563f, +0.015625f,0.101563f, +0.0234375f,0.101563f, +0.03125f,0.101563f, +0.0390625f,0.101563f, +0.046875f,0.101563f, +0.0546875f,0.101563f, +0.0625f,0.101563f, +0.0703125f,0.101563f, +0.078125f,0.101563f, +0.0859375f,0.101563f, +0.09375f,0.101563f, +0.101563f,0.101563f, +0.109375f,0.101563f, +0.117188f,0.101563f, +0.125f,0.101563f, +0.132813f,0.101563f, +0.140625f,0.101563f, +0.148438f,0.101563f, +0.15625f,0.101563f, +0.164063f,0.101563f, +0.171875f,0.101563f, +0.179688f,0.101563f, +0.1875f,0.101563f, +0.195313f,0.101563f, +0.203125f,0.101563f, +0.210938f,0.101563f, +0.21875f,0.101563f, +0.226563f,0.101563f, +0.234375f,0.101563f, +0.242188f,0.101563f, +0.25f,0.101563f, +0.257813f,0.101563f, +0.265625f,0.101563f, +0.273438f,0.101563f, +0.28125f,0.101563f, +0.289063f,0.101563f, +0.296875f,0.101563f, +0.304688f,0.101563f, +0.3125f,0.101563f, +0.320313f,0.101563f, +0.328125f,0.101563f, +0.335938f,0.101563f, +0.34375f,0.101563f, +0.351563f,0.101563f, +0.359375f,0.101563f, +0.367188f,0.101563f, +0.375f,0.101563f, +0.382813f,0.101563f, +0.390625f,0.101563f, +0.398438f,0.101563f, +0.40625f,0.101563f, +0.414063f,0.101563f, +0.421875f,0.101563f, +0.429688f,0.101563f, +0.4375f,0.101563f, +0.445313f,0.101563f, +0.453125f,0.101563f, +0.460938f,0.101563f, +0.46875f,0.101563f, +0.476563f,0.101563f, +0.484375f,0.101563f, +0.492188f,0.101563f, +0.5f,0.101563f, +0.507813f,0.101563f, +0.0f,0.109375f, +0.0078125f,0.109375f, +0.015625f,0.109375f, +0.0234375f,0.109375f, +0.03125f,0.109375f, +0.0390625f,0.109375f, +0.046875f,0.109375f, +0.0546875f,0.109375f, +0.0625f,0.109375f, +0.0703125f,0.109375f, +0.078125f,0.109375f, +0.0859375f,0.109375f, +0.09375f,0.109375f, +0.101563f,0.109375f, +0.109375f,0.109375f, +0.117188f,0.109375f, +0.125f,0.109375f, +0.132813f,0.109375f, +0.140625f,0.109375f, +0.148438f,0.109375f, +0.15625f,0.109375f, +0.164063f,0.109375f, +0.171875f,0.109375f, +0.179688f,0.109375f, +0.1875f,0.109375f, +0.195313f,0.109375f, +0.203125f,0.109375f, +0.210938f,0.109375f, +0.21875f,0.109375f, +0.226563f,0.109375f, +0.234375f,0.109375f, +0.242188f,0.109375f, +0.25f,0.109375f, +0.257813f,0.109375f, +0.265625f,0.109375f, +0.273438f,0.109375f, +0.28125f,0.109375f, +0.289063f,0.109375f, +0.296875f,0.109375f, +0.304688f,0.109375f, +0.3125f,0.109375f, +0.320313f,0.109375f, +0.328125f,0.109375f, +0.335938f,0.109375f, +0.34375f,0.109375f, +0.351563f,0.109375f, +0.359375f,0.109375f, +0.367188f,0.109375f, +0.375f,0.109375f, +0.382813f,0.109375f, +0.390625f,0.109375f, +0.398438f,0.109375f, +0.40625f,0.109375f, +0.414063f,0.109375f, +0.421875f,0.109375f, +0.429688f,0.109375f, +0.4375f,0.109375f, +0.445313f,0.109375f, +0.453125f,0.109375f, +0.460938f,0.109375f, +0.46875f,0.109375f, +0.476563f,0.109375f, +0.484375f,0.109375f, +0.492188f,0.109375f, +0.5f,0.109375f, +0.507813f,0.109375f, +0.0f,0.117188f, +0.0078125f,0.117188f, +0.015625f,0.117188f, +0.0234375f,0.117188f, +0.03125f,0.117188f, +0.0390625f,0.117188f, +0.046875f,0.117188f, +0.0546875f,0.117188f, +0.0625f,0.117188f, +0.0703125f,0.117188f, +0.078125f,0.117188f, +0.0859375f,0.117188f, +0.09375f,0.117188f, +0.101563f,0.117188f, +0.109375f,0.117188f, +0.117188f,0.117188f, +0.125f,0.117188f, +0.132813f,0.117188f, +0.140625f,0.117188f, +0.148438f,0.117188f, +0.15625f,0.117188f, +0.164063f,0.117188f, +0.171875f,0.117188f, +0.179688f,0.117188f, +0.1875f,0.117188f, +0.195313f,0.117188f, +0.203125f,0.117188f, +0.210938f,0.117188f, +0.21875f,0.117188f, +0.226563f,0.117188f, +0.234375f,0.117188f, +0.242188f,0.117188f, +0.25f,0.117188f, +0.257813f,0.117188f, +0.265625f,0.117188f, +0.273438f,0.117188f, +0.28125f,0.117188f, +0.289063f,0.117188f, +0.296875f,0.117188f, +0.304688f,0.117188f, +0.3125f,0.117188f, +0.320313f,0.117188f, +0.328125f,0.117188f, +0.335938f,0.117188f, +0.34375f,0.117188f, +0.351563f,0.117188f, +0.359375f,0.117188f, +0.367188f,0.117188f, +0.375f,0.117188f, +0.382813f,0.117188f, +0.390625f,0.117188f, +0.398438f,0.117188f, +0.40625f,0.117188f, +0.414063f,0.117188f, +0.421875f,0.117188f, +0.429688f,0.117188f, +0.4375f,0.117188f, +0.445313f,0.117188f, +0.453125f,0.117188f, +0.460938f,0.117188f, +0.46875f,0.117188f, +0.476563f,0.117188f, +0.484375f,0.117188f, +0.492188f,0.117188f, +0.5f,0.117188f, +0.507813f,0.117188f, +0.0f,0.125f, +0.0078125f,0.125f, +0.015625f,0.125f, +0.0234375f,0.125f, +0.03125f,0.125f, +0.0390625f,0.125f, +0.046875f,0.125f, +0.0546875f,0.125f, +0.0625f,0.125f, +0.0703125f,0.125f, +0.078125f,0.125f, +0.0859375f,0.125f, +0.09375f,0.125f, +0.101563f,0.125f, +0.109375f,0.125f, +0.117188f,0.125f, +0.125f,0.125f, +0.132813f,0.125f, +0.140625f,0.125f, +0.148438f,0.125f, +0.15625f,0.125f, +0.164063f,0.125f, +0.171875f,0.125f, +0.179688f,0.125f, +0.1875f,0.125f, +0.195313f,0.125f, +0.203125f,0.125f, +0.210938f,0.125f, +0.21875f,0.125f, +0.226563f,0.125f, +0.234375f,0.125f, +0.242188f,0.125f, +0.25f,0.125f, +0.257813f,0.125f, +0.265625f,0.125f, +0.273438f,0.125f, +0.28125f,0.125f, +0.289063f,0.125f, +0.296875f,0.125f, +0.304688f,0.125f, +0.3125f,0.125f, +0.320313f,0.125f, +0.328125f,0.125f, +0.335938f,0.125f, +0.34375f,0.125f, +0.351563f,0.125f, +0.359375f,0.125f, +0.367188f,0.125f, +0.375f,0.125f, +0.382813f,0.125f, +0.390625f,0.125f, +0.398438f,0.125f, +0.40625f,0.125f, +0.414063f,0.125f, +0.421875f,0.125f, +0.429688f,0.125f, +0.4375f,0.125f, +0.445313f,0.125f, +0.453125f,0.125f, +0.460938f,0.125f, +0.46875f,0.125f, +0.476563f,0.125f, +0.484375f,0.125f, +0.492188f,0.125f, +0.5f,0.125f, +0.507813f,0.125f, +0.0f,0.132813f, +0.0078125f,0.132813f, +0.015625f,0.132813f, +0.0234375f,0.132813f, +0.03125f,0.132813f, +0.0390625f,0.132813f, +0.046875f,0.132813f, +0.0546875f,0.132813f, +0.0625f,0.132813f, +0.0703125f,0.132813f, +0.078125f,0.132813f, +0.0859375f,0.132813f, +0.09375f,0.132813f, +0.101563f,0.132813f, +0.109375f,0.132813f, +0.117188f,0.132813f, +0.125f,0.132813f, +0.132813f,0.132813f, +0.140625f,0.132813f, +0.148438f,0.132813f, +0.15625f,0.132813f, +0.164063f,0.132813f, +0.171875f,0.132813f, +0.179688f,0.132813f, +0.1875f,0.132813f, +0.195313f,0.132813f, +0.203125f,0.132813f, +0.210938f,0.132813f, +0.21875f,0.132813f, +0.226563f,0.132813f, +0.234375f,0.132813f, +0.242188f,0.132813f, +0.25f,0.132813f, +0.257813f,0.132813f, +0.265625f,0.132813f, +0.273438f,0.132813f, +0.28125f,0.132813f, +0.289063f,0.132813f, +0.296875f,0.132813f, +0.304688f,0.132813f, +0.3125f,0.132813f, +0.320313f,0.132813f, +0.328125f,0.132813f, +0.335938f,0.132813f, +0.34375f,0.132813f, +0.351563f,0.132813f, +0.359375f,0.132813f, +0.367188f,0.132813f, +0.375f,0.132813f, +0.382813f,0.132813f, +0.390625f,0.132813f, +0.398438f,0.132813f, +0.40625f,0.132813f, +0.414063f,0.132813f, +0.421875f,0.132813f, +0.429688f,0.132813f, +0.4375f,0.132813f, +0.445313f,0.132813f, +0.453125f,0.132813f, +0.460938f,0.132813f, +0.46875f,0.132813f, +0.476563f,0.132813f, +0.484375f,0.132813f, +0.492188f,0.132813f, +0.5f,0.132813f, +0.507813f,0.132813f, +0.0f,0.140625f, +0.0078125f,0.140625f, +0.015625f,0.140625f, +0.0234375f,0.140625f, +0.03125f,0.140625f, +0.0390625f,0.140625f, +0.046875f,0.140625f, +0.0546875f,0.140625f, +0.0625f,0.140625f, +0.0703125f,0.140625f, +0.078125f,0.140625f, +0.0859375f,0.140625f, +0.09375f,0.140625f, +0.101563f,0.140625f, +0.109375f,0.140625f, +0.117188f,0.140625f, +0.125f,0.140625f, +0.132813f,0.140625f, +0.140625f,0.140625f, +0.148438f,0.140625f, +0.15625f,0.140625f, +0.164063f,0.140625f, +0.171875f,0.140625f, +0.179688f,0.140625f, +0.1875f,0.140625f, +0.195313f,0.140625f, +0.203125f,0.140625f, +0.210938f,0.140625f, +0.21875f,0.140625f, +0.226563f,0.140625f, +0.234375f,0.140625f, +0.242188f,0.140625f, +0.25f,0.140625f, +0.257813f,0.140625f, +0.265625f,0.140625f, +0.273438f,0.140625f, +0.28125f,0.140625f, +0.289063f,0.140625f, +0.296875f,0.140625f, +0.304688f,0.140625f, +0.3125f,0.140625f, +0.320313f,0.140625f, +0.328125f,0.140625f, +0.335938f,0.140625f, +0.34375f,0.140625f, +0.351563f,0.140625f, +0.359375f,0.140625f, +0.367188f,0.140625f, +0.375f,0.140625f, +0.382813f,0.140625f, +0.390625f,0.140625f, +0.398438f,0.140625f, +0.40625f,0.140625f, +0.414063f,0.140625f, +0.421875f,0.140625f, +0.429688f,0.140625f, +0.4375f,0.140625f, +0.445313f,0.140625f, +0.453125f,0.140625f, +0.460938f,0.140625f, +0.46875f,0.140625f, +0.476563f,0.140625f, +0.484375f,0.140625f, +0.492188f,0.140625f, +0.5f,0.140625f, +0.507813f,0.140625f, +0.0f,0.148438f, +0.0078125f,0.148438f, +0.015625f,0.148438f, +0.0234375f,0.148438f, +0.03125f,0.148438f, +0.0390625f,0.148438f, +0.046875f,0.148438f, +0.0546875f,0.148438f, +0.0625f,0.148438f, +0.0703125f,0.148438f, +0.078125f,0.148438f, +0.0859375f,0.148438f, +0.09375f,0.148438f, +0.101563f,0.148438f, +0.109375f,0.148438f, +0.117188f,0.148438f, +0.125f,0.148438f, +0.132813f,0.148438f, +0.140625f,0.148438f, +0.148438f,0.148438f, +0.15625f,0.148438f, +0.164063f,0.148438f, +0.171875f,0.148438f, +0.179688f,0.148438f, +0.1875f,0.148438f, +0.195313f,0.148438f, +0.203125f,0.148438f, +0.210938f,0.148438f, +0.21875f,0.148438f, +0.226563f,0.148438f, +0.234375f,0.148438f, +0.242188f,0.148438f, +0.25f,0.148438f, +0.257813f,0.148438f, +0.265625f,0.148438f, +0.273438f,0.148438f, +0.28125f,0.148438f, +0.289063f,0.148438f, +0.296875f,0.148438f, +0.304688f,0.148438f, +0.3125f,0.148438f, +0.320313f,0.148438f, +0.328125f,0.148438f, +0.335938f,0.148438f, +0.34375f,0.148438f, +0.351563f,0.148438f, +0.359375f,0.148438f, +0.367188f,0.148438f, +0.375f,0.148438f, +0.382813f,0.148438f, +0.390625f,0.148438f, +0.398438f,0.148438f, +0.40625f,0.148438f, +0.414063f,0.148438f, +0.421875f,0.148438f, +0.429688f,0.148438f, +0.4375f,0.148438f, +0.445313f,0.148438f, +0.453125f,0.148438f, +0.460938f,0.148438f, +0.46875f,0.148438f, +0.476563f,0.148438f, +0.484375f,0.148438f, +0.492188f,0.148438f, +0.5f,0.148438f, +0.507813f,0.148438f, +0.0f,0.15625f, +0.0078125f,0.15625f, +0.015625f,0.15625f, +0.0234375f,0.15625f, +0.03125f,0.15625f, +0.0390625f,0.15625f, +0.046875f,0.15625f, +0.0546875f,0.15625f, +0.0625f,0.15625f, +0.0703125f,0.15625f, +0.078125f,0.15625f, +0.0859375f,0.15625f, +0.09375f,0.15625f, +0.101563f,0.15625f, +0.109375f,0.15625f, +0.117188f,0.15625f, +0.125f,0.15625f, +0.132813f,0.15625f, +0.140625f,0.15625f, +0.148438f,0.15625f, +0.15625f,0.15625f, +0.164063f,0.15625f, +0.171875f,0.15625f, +0.179688f,0.15625f, +0.1875f,0.15625f, +0.195313f,0.15625f, +0.203125f,0.15625f, +0.210938f,0.15625f, +0.21875f,0.15625f, +0.226563f,0.15625f, +0.234375f,0.15625f, +0.242188f,0.15625f, +0.25f,0.15625f, +0.257813f,0.15625f, +0.265625f,0.15625f, +0.273438f,0.15625f, +0.28125f,0.15625f, +0.289063f,0.15625f, +0.296875f,0.15625f, +0.304688f,0.15625f, +0.3125f,0.15625f, +0.320313f,0.15625f, +0.328125f,0.15625f, +0.335938f,0.15625f, +0.34375f,0.15625f, +0.351563f,0.15625f, +0.359375f,0.15625f, +0.367188f,0.15625f, +0.375f,0.15625f, +0.382813f,0.15625f, +0.390625f,0.15625f, +0.398438f,0.15625f, +0.40625f,0.15625f, +0.414063f,0.15625f, +0.421875f,0.15625f, +0.429688f,0.15625f, +0.4375f,0.15625f, +0.445313f,0.15625f, +0.453125f,0.15625f, +0.460938f,0.15625f, +0.46875f,0.15625f, +0.476563f,0.15625f, +0.484375f,0.15625f, +0.492188f,0.15625f, +0.5f,0.15625f, +0.507813f,0.15625f, +0.0f,0.164063f, +0.0078125f,0.164063f, +0.015625f,0.164063f, +0.0234375f,0.164063f, +0.03125f,0.164063f, +0.0390625f,0.164063f, +0.046875f,0.164063f, +0.0546875f,0.164063f, +0.0625f,0.164063f, +0.0703125f,0.164063f, +0.078125f,0.164063f, +0.0859375f,0.164063f, +0.09375f,0.164063f, +0.101563f,0.164063f, +0.109375f,0.164063f, +0.117188f,0.164063f, +0.125f,0.164063f, +0.132813f,0.164063f, +0.140625f,0.164063f, +0.148438f,0.164063f, +0.15625f,0.164063f, +0.164063f,0.164063f, +0.171875f,0.164063f, +0.179688f,0.164063f, +0.1875f,0.164063f, +0.195313f,0.164063f, +0.203125f,0.164063f, +0.210938f,0.164063f, +0.21875f,0.164063f, +0.226563f,0.164063f, +0.234375f,0.164063f, +0.242188f,0.164063f, +0.25f,0.164063f, +0.257813f,0.164063f, +0.265625f,0.164063f, +0.273438f,0.164063f, +0.28125f,0.164063f, +0.289063f,0.164063f, +0.296875f,0.164063f, +0.304688f,0.164063f, +0.3125f,0.164063f, +0.320313f,0.164063f, +0.328125f,0.164063f, +0.335938f,0.164063f, +0.34375f,0.164063f, +0.351563f,0.164063f, +0.359375f,0.164063f, +0.367188f,0.164063f, +0.375f,0.164063f, +0.382813f,0.164063f, +0.390625f,0.164063f, +0.398438f,0.164063f, +0.40625f,0.164063f, +0.414063f,0.164063f, +0.421875f,0.164063f, +0.429688f,0.164063f, +0.4375f,0.164063f, +0.445313f,0.164063f, +0.453125f,0.164063f, +0.460938f,0.164063f, +0.46875f,0.164063f, +0.476563f,0.164063f, +0.484375f,0.164063f, +0.492188f,0.164063f, +0.5f,0.164063f, +0.507813f,0.164063f, +0.0f,0.171875f, +0.0078125f,0.171875f, +0.015625f,0.171875f, +0.0234375f,0.171875f, +0.03125f,0.171875f, +0.0390625f,0.171875f, +0.046875f,0.171875f, +0.0546875f,0.171875f, +0.0625f,0.171875f, +0.0703125f,0.171875f, +0.078125f,0.171875f, +0.0859375f,0.171875f, +0.09375f,0.171875f, +0.101563f,0.171875f, +0.109375f,0.171875f, +0.117188f,0.171875f, +0.125f,0.171875f, +0.132813f,0.171875f, +0.140625f,0.171875f, +0.148438f,0.171875f, +0.15625f,0.171875f, +0.164063f,0.171875f, +0.171875f,0.171875f, +0.179688f,0.171875f, +0.1875f,0.171875f, +0.195313f,0.171875f, +0.203125f,0.171875f, +0.210938f,0.171875f, +0.21875f,0.171875f, +0.226563f,0.171875f, +0.234375f,0.171875f, +0.242188f,0.171875f, +0.25f,0.171875f, +0.257813f,0.171875f, +0.265625f,0.171875f, +0.273438f,0.171875f, +0.28125f,0.171875f, +0.289063f,0.171875f, +0.296875f,0.171875f, +0.304688f,0.171875f, +0.3125f,0.171875f, +0.320313f,0.171875f, +0.328125f,0.171875f, +0.335938f,0.171875f, +0.34375f,0.171875f, +0.351563f,0.171875f, +0.359375f,0.171875f, +0.367188f,0.171875f, +0.375f,0.171875f, +0.382813f,0.171875f, +0.390625f,0.171875f, +0.398438f,0.171875f, +0.40625f,0.171875f, +0.414063f,0.171875f, +0.421875f,0.171875f, +0.429688f,0.171875f, +0.4375f,0.171875f, +0.445313f,0.171875f, +0.453125f,0.171875f, +0.460938f,0.171875f, +0.46875f,0.171875f, +0.476563f,0.171875f, +0.484375f,0.171875f, +0.492188f,0.171875f, +0.5f,0.171875f, +0.507813f,0.171875f, +0.0f,0.179688f, +0.0078125f,0.179688f, +0.015625f,0.179688f, +0.0234375f,0.179688f, +0.03125f,0.179688f, +0.0390625f,0.179688f, +0.046875f,0.179688f, +0.0546875f,0.179688f, +0.0625f,0.179688f, +0.0703125f,0.179688f, +0.078125f,0.179688f, +0.0859375f,0.179688f, +0.09375f,0.179688f, +0.101563f,0.179688f, +0.109375f,0.179688f, +0.117188f,0.179688f, +0.125f,0.179688f, +0.132813f,0.179688f, +0.140625f,0.179688f, +0.148438f,0.179688f, +0.15625f,0.179688f, +0.164063f,0.179688f, +0.171875f,0.179688f, +0.179688f,0.179688f, +0.1875f,0.179688f, +0.195313f,0.179688f, +0.203125f,0.179688f, +0.210938f,0.179688f, +0.21875f,0.179688f, +0.226563f,0.179688f, +0.234375f,0.179688f, +0.242188f,0.179688f, +0.25f,0.179688f, +0.257813f,0.179688f, +0.265625f,0.179688f, +0.273438f,0.179688f, +0.28125f,0.179688f, +0.289063f,0.179688f, +0.296875f,0.179688f, +0.304688f,0.179688f, +0.3125f,0.179688f, +0.320313f,0.179688f, +0.328125f,0.179688f, +0.335938f,0.179688f, +0.34375f,0.179688f, +0.351563f,0.179688f, +0.359375f,0.179688f, +0.367188f,0.179688f, +0.375f,0.179688f, +0.382813f,0.179688f, +0.390625f,0.179688f, +0.398438f,0.179688f, +0.40625f,0.179688f, +0.414063f,0.179688f, +0.421875f,0.179688f, +0.429688f,0.179688f, +0.4375f,0.179688f, +0.445313f,0.179688f, +0.453125f,0.179688f, +0.460938f,0.179688f, +0.46875f,0.179688f, +0.476563f,0.179688f, +0.484375f,0.179688f, +0.492188f,0.179688f, +0.5f,0.179688f, +0.507813f,0.179688f, +0.0f,0.1875f, +0.0078125f,0.1875f, +0.015625f,0.1875f, +0.0234375f,0.1875f, +0.03125f,0.1875f, +0.0390625f,0.1875f, +0.046875f,0.1875f, +0.0546875f,0.1875f, +0.0625f,0.1875f, +0.0703125f,0.1875f, +0.078125f,0.1875f, +0.0859375f,0.1875f, +0.09375f,0.1875f, +0.101563f,0.1875f, +0.109375f,0.1875f, +0.117188f,0.1875f, +0.125f,0.1875f, +0.132813f,0.1875f, +0.140625f,0.1875f, +0.148438f,0.1875f, +0.15625f,0.1875f, +0.164063f,0.1875f, +0.171875f,0.1875f, +0.179688f,0.1875f, +0.1875f,0.1875f, +0.195313f,0.1875f, +0.203125f,0.1875f, +0.210938f,0.1875f, +0.21875f,0.1875f, +0.226563f,0.1875f, +0.234375f,0.1875f, +0.242188f,0.1875f, +0.25f,0.1875f, +0.257813f,0.1875f, +0.265625f,0.1875f, +0.273438f,0.1875f, +0.28125f,0.1875f, +0.289063f,0.1875f, +0.296875f,0.1875f, +0.304688f,0.1875f, +0.3125f,0.1875f, +0.320313f,0.1875f, +0.328125f,0.1875f, +0.335938f,0.1875f, +0.34375f,0.1875f, +0.351563f,0.1875f, +0.359375f,0.1875f, +0.367188f,0.1875f, +0.375f,0.1875f, +0.382813f,0.1875f, +0.390625f,0.1875f, +0.398438f,0.1875f, +0.40625f,0.1875f, +0.414063f,0.1875f, +0.421875f,0.1875f, +0.429688f,0.1875f, +0.4375f,0.1875f, +0.445313f,0.1875f, +0.453125f,0.1875f, +0.460938f,0.1875f, +0.46875f,0.1875f, +0.476563f,0.1875f, +0.484375f,0.1875f, +0.492188f,0.1875f, +0.5f,0.1875f, +0.507813f,0.1875f, +0.0f,0.195313f, +0.0078125f,0.195313f, +0.015625f,0.195313f, +0.0234375f,0.195313f, +0.03125f,0.195313f, +0.0390625f,0.195313f, +0.046875f,0.195313f, +0.0546875f,0.195313f, +0.0625f,0.195313f, +0.0703125f,0.195313f, +0.078125f,0.195313f, +0.0859375f,0.195313f, +0.09375f,0.195313f, +0.101563f,0.195313f, +0.109375f,0.195313f, +0.117188f,0.195313f, +0.125f,0.195313f, +0.132813f,0.195313f, +0.140625f,0.195313f, +0.148438f,0.195313f, +0.15625f,0.195313f, +0.164063f,0.195313f, +0.171875f,0.195313f, +0.179688f,0.195313f, +0.1875f,0.195313f, +0.195313f,0.195313f, +0.203125f,0.195313f, +0.210938f,0.195313f, +0.21875f,0.195313f, +0.226563f,0.195313f, +0.234375f,0.195313f, +0.242188f,0.195313f, +0.25f,0.195313f, +0.257813f,0.195313f, +0.265625f,0.195313f, +0.273438f,0.195313f, +0.28125f,0.195313f, +0.289063f,0.195313f, +0.296875f,0.195313f, +0.304688f,0.195313f, +0.3125f,0.195313f, +0.320313f,0.195313f, +0.328125f,0.195313f, +0.335938f,0.195313f, +0.34375f,0.195313f, +0.351563f,0.195313f, +0.359375f,0.195313f, +0.367188f,0.195313f, +0.375f,0.195313f, +0.382813f,0.195313f, +0.390625f,0.195313f, +0.398438f,0.195313f, +0.40625f,0.195313f, +0.414063f,0.195313f, +0.421875f,0.195313f, +0.429688f,0.195313f, +0.4375f,0.195313f, +0.445313f,0.195313f, +0.453125f,0.195313f, +0.460938f,0.195313f, +0.46875f,0.195313f, +0.476563f,0.195313f, +0.484375f,0.195313f, +0.492188f,0.195313f, +0.5f,0.195313f, +0.507813f,0.195313f, +0.0f,0.203125f, +0.0078125f,0.203125f, +0.015625f,0.203125f, +0.0234375f,0.203125f, +0.03125f,0.203125f, +0.0390625f,0.203125f, +0.046875f,0.203125f, +0.0546875f,0.203125f, +0.0625f,0.203125f, +0.0703125f,0.203125f, +0.078125f,0.203125f, +0.0859375f,0.203125f, +0.09375f,0.203125f, +0.101563f,0.203125f, +0.109375f,0.203125f, +0.117188f,0.203125f, +0.125f,0.203125f, +0.132813f,0.203125f, +0.140625f,0.203125f, +0.148438f,0.203125f, +0.15625f,0.203125f, +0.164063f,0.203125f, +0.171875f,0.203125f, +0.179688f,0.203125f, +0.1875f,0.203125f, +0.195313f,0.203125f, +0.203125f,0.203125f, +0.210938f,0.203125f, +0.21875f,0.203125f, +0.226563f,0.203125f, +0.234375f,0.203125f, +0.242188f,0.203125f, +0.25f,0.203125f, +0.257813f,0.203125f, +0.265625f,0.203125f, +0.273438f,0.203125f, +0.28125f,0.203125f, +0.289063f,0.203125f, +0.296875f,0.203125f, +0.304688f,0.203125f, +0.3125f,0.203125f, +0.320313f,0.203125f, +0.328125f,0.203125f, +0.335938f,0.203125f, +0.34375f,0.203125f, +0.351563f,0.203125f, +0.359375f,0.203125f, +0.367188f,0.203125f, +0.375f,0.203125f, +0.382813f,0.203125f, +0.390625f,0.203125f, +0.398438f,0.203125f, +0.40625f,0.203125f, +0.414063f,0.203125f, +0.421875f,0.203125f, +0.429688f,0.203125f, +0.4375f,0.203125f, +0.445313f,0.203125f, +0.453125f,0.203125f, +0.460938f,0.203125f, +0.46875f,0.203125f, +0.476563f,0.203125f, +0.484375f,0.203125f, +0.492188f,0.203125f, +0.5f,0.203125f, +0.507813f,0.203125f, +0.0f,0.210938f, +0.0078125f,0.210938f, +0.015625f,0.210938f, +0.0234375f,0.210938f, +0.03125f,0.210938f, +0.0390625f,0.210938f, +0.046875f,0.210938f, +0.0546875f,0.210938f, +0.0625f,0.210938f, +0.0703125f,0.210938f, +0.078125f,0.210938f, +0.0859375f,0.210938f, +0.09375f,0.210938f, +0.101563f,0.210938f, +0.109375f,0.210938f, +0.117188f,0.210938f, +0.125f,0.210938f, +0.132813f,0.210938f, +0.140625f,0.210938f, +0.148438f,0.210938f, +0.15625f,0.210938f, +0.164063f,0.210938f, +0.171875f,0.210938f, +0.179688f,0.210938f, +0.1875f,0.210938f, +0.195313f,0.210938f, +0.203125f,0.210938f, +0.210938f,0.210938f, +0.21875f,0.210938f, +0.226563f,0.210938f, +0.234375f,0.210938f, +0.242188f,0.210938f, +0.25f,0.210938f, +0.257813f,0.210938f, +0.265625f,0.210938f, +0.273438f,0.210938f, +0.28125f,0.210938f, +0.289063f,0.210938f, +0.296875f,0.210938f, +0.304688f,0.210938f, +0.3125f,0.210938f, +0.320313f,0.210938f, +0.328125f,0.210938f, +0.335938f,0.210938f, +0.34375f,0.210938f, +0.351563f,0.210938f, +0.359375f,0.210938f, +0.367188f,0.210938f, +0.375f,0.210938f, +0.382813f,0.210938f, +0.390625f,0.210938f, +0.398438f,0.210938f, +0.40625f,0.210938f, +0.414063f,0.210938f, +0.421875f,0.210938f, +0.429688f,0.210938f, +0.4375f,0.210938f, +0.445313f,0.210938f, +0.453125f,0.210938f, +0.460938f,0.210938f, +0.46875f,0.210938f, +0.476563f,0.210938f, +0.484375f,0.210938f, +0.492188f,0.210938f, +0.5f,0.210938f, +0.507813f,0.210938f, +0.0f,0.21875f, +0.0078125f,0.21875f, +0.015625f,0.21875f, +0.0234375f,0.21875f, +0.03125f,0.21875f, +0.0390625f,0.21875f, +0.046875f,0.21875f, +0.0546875f,0.21875f, +0.0625f,0.21875f, +0.0703125f,0.21875f, +0.078125f,0.21875f, +0.0859375f,0.21875f, +0.09375f,0.21875f, +0.101563f,0.21875f, +0.109375f,0.21875f, +0.117188f,0.21875f, +0.125f,0.21875f, +0.132813f,0.21875f, +0.140625f,0.21875f, +0.148438f,0.21875f, +0.15625f,0.21875f, +0.164063f,0.21875f, +0.171875f,0.21875f, +0.179688f,0.21875f, +0.1875f,0.21875f, +0.195313f,0.21875f, +0.203125f,0.21875f, +0.210938f,0.21875f, +0.21875f,0.21875f, +0.226563f,0.21875f, +0.234375f,0.21875f, +0.242188f,0.21875f, +0.25f,0.21875f, +0.257813f,0.21875f, +0.265625f,0.21875f, +0.273438f,0.21875f, +0.28125f,0.21875f, +0.289063f,0.21875f, +0.296875f,0.21875f, +0.304688f,0.21875f, +0.3125f,0.21875f, +0.320313f,0.21875f, +0.328125f,0.21875f, +0.335938f,0.21875f, +0.34375f,0.21875f, +0.351563f,0.21875f, +0.359375f,0.21875f, +0.367188f,0.21875f, +0.375f,0.21875f, +0.382813f,0.21875f, +0.390625f,0.21875f, +0.398438f,0.21875f, +0.40625f,0.21875f, +0.414063f,0.21875f, +0.421875f,0.21875f, +0.429688f,0.21875f, +0.4375f,0.21875f, +0.445313f,0.21875f, +0.453125f,0.21875f, +0.460938f,0.21875f, +0.46875f,0.21875f, +0.476563f,0.21875f, +0.484375f,0.21875f, +0.492188f,0.21875f, +0.5f,0.21875f, +0.507813f,0.21875f, +0.0f,0.226563f, +0.0078125f,0.226563f, +0.015625f,0.226563f, +0.0234375f,0.226563f, +0.03125f,0.226563f, +0.0390625f,0.226563f, +0.046875f,0.226563f, +0.0546875f,0.226563f, +0.0625f,0.226563f, +0.0703125f,0.226563f, +0.078125f,0.226563f, +0.0859375f,0.226563f, +0.09375f,0.226563f, +0.101563f,0.226563f, +0.109375f,0.226563f, +0.117188f,0.226563f, +0.125f,0.226563f, +0.132813f,0.226563f, +0.140625f,0.226563f, +0.148438f,0.226563f, +0.15625f,0.226563f, +0.164063f,0.226563f, +0.171875f,0.226563f, +0.179688f,0.226563f, +0.1875f,0.226563f, +0.195313f,0.226563f, +0.203125f,0.226563f, +0.210938f,0.226563f, +0.21875f,0.226563f, +0.226563f,0.226563f, +0.234375f,0.226563f, +0.242188f,0.226563f, +0.25f,0.226563f, +0.257813f,0.226563f, +0.265625f,0.226563f, +0.273438f,0.226563f, +0.28125f,0.226563f, +0.289063f,0.226563f, +0.296875f,0.226563f, +0.304688f,0.226563f, +0.3125f,0.226563f, +0.320313f,0.226563f, +0.328125f,0.226563f, +0.335938f,0.226563f, +0.34375f,0.226563f, +0.351563f,0.226563f, +0.359375f,0.226563f, +0.367188f,0.226563f, +0.375f,0.226563f, +0.382813f,0.226563f, +0.390625f,0.226563f, +0.398438f,0.226563f, +0.40625f,0.226563f, +0.414063f,0.226563f, +0.421875f,0.226563f, +0.429688f,0.226563f, +0.4375f,0.226563f, +0.445313f,0.226563f, +0.453125f,0.226563f, +0.460938f,0.226563f, +0.46875f,0.226563f, +0.476563f,0.226563f, +0.484375f,0.226563f, +0.492188f,0.226563f, +0.5f,0.226563f, +0.507813f,0.226563f, +0.0f,0.234375f, +0.0078125f,0.234375f, +0.015625f,0.234375f, +0.0234375f,0.234375f, +0.03125f,0.234375f, +0.0390625f,0.234375f, +0.046875f,0.234375f, +0.0546875f,0.234375f, +0.0625f,0.234375f, +0.0703125f,0.234375f, +0.078125f,0.234375f, +0.0859375f,0.234375f, +0.09375f,0.234375f, +0.101563f,0.234375f, +0.109375f,0.234375f, +0.117188f,0.234375f, +0.125f,0.234375f, +0.132813f,0.234375f, +0.140625f,0.234375f, +0.148438f,0.234375f, +0.15625f,0.234375f, +0.164063f,0.234375f, +0.171875f,0.234375f, +0.179688f,0.234375f, +0.1875f,0.234375f, +0.195313f,0.234375f, +0.203125f,0.234375f, +0.210938f,0.234375f, +0.21875f,0.234375f, +0.226563f,0.234375f, +0.234375f,0.234375f, +0.242188f,0.234375f, +0.25f,0.234375f, +0.257813f,0.234375f, +0.265625f,0.234375f, +0.273438f,0.234375f, +0.28125f,0.234375f, +0.289063f,0.234375f, +0.296875f,0.234375f, +0.304688f,0.234375f, +0.3125f,0.234375f, +0.320313f,0.234375f, +0.328125f,0.234375f, +0.335938f,0.234375f, +0.34375f,0.234375f, +0.351563f,0.234375f, +0.359375f,0.234375f, +0.367188f,0.234375f, +0.375f,0.234375f, +0.382813f,0.234375f, +0.390625f,0.234375f, +0.398438f,0.234375f, +0.40625f,0.234375f, +0.414063f,0.234375f, +0.421875f,0.234375f, +0.429688f,0.234375f, +0.4375f,0.234375f, +0.445313f,0.234375f, +0.453125f,0.234375f, +0.460938f,0.234375f, +0.46875f,0.234375f, +0.476563f,0.234375f, +0.484375f,0.234375f, +0.492188f,0.234375f, +0.5f,0.234375f, +0.507813f,0.234375f, +0.0f,0.242188f, +0.0078125f,0.242188f, +0.015625f,0.242188f, +0.0234375f,0.242188f, +0.03125f,0.242188f, +0.0390625f,0.242188f, +0.046875f,0.242188f, +0.0546875f,0.242188f, +0.0625f,0.242188f, +0.0703125f,0.242188f, +0.078125f,0.242188f, +0.0859375f,0.242188f, +0.09375f,0.242188f, +0.101563f,0.242188f, +0.109375f,0.242188f, +0.117188f,0.242188f, +0.125f,0.242188f, +0.132813f,0.242188f, +0.140625f,0.242188f, +0.148438f,0.242188f, +0.15625f,0.242188f, +0.164063f,0.242188f, +0.171875f,0.242188f, +0.179688f,0.242188f, +0.1875f,0.242188f, +0.195313f,0.242188f, +0.203125f,0.242188f, +0.210938f,0.242188f, +0.21875f,0.242188f, +0.226563f,0.242188f, +0.234375f,0.242188f, +0.242188f,0.242188f, +0.25f,0.242188f, +0.257813f,0.242188f, +0.265625f,0.242188f, +0.273438f,0.242188f, +0.28125f,0.242188f, +0.289063f,0.242188f, +0.296875f,0.242188f, +0.304688f,0.242188f, +0.3125f,0.242188f, +0.320313f,0.242188f, +0.328125f,0.242188f, +0.335938f,0.242188f, +0.34375f,0.242188f, +0.351563f,0.242188f, +0.359375f,0.242188f, +0.367188f,0.242188f, +0.375f,0.242188f, +0.382813f,0.242188f, +0.390625f,0.242188f, +0.398438f,0.242188f, +0.40625f,0.242188f, +0.414063f,0.242188f, +0.421875f,0.242188f, +0.429688f,0.242188f, +0.4375f,0.242188f, +0.445313f,0.242188f, +0.453125f,0.242188f, +0.460938f,0.242188f, +0.46875f,0.242188f, +0.476563f,0.242188f, +0.484375f,0.242188f, +0.492188f,0.242188f, +0.5f,0.242188f, +0.507813f,0.242188f, +0.0f,0.25f, +0.0078125f,0.25f, +0.015625f,0.25f, +0.0234375f,0.25f, +0.03125f,0.25f, +0.0390625f,0.25f, +0.046875f,0.25f, +0.0546875f,0.25f, +0.0625f,0.25f, +0.0703125f,0.25f, +0.078125f,0.25f, +0.0859375f,0.25f, +0.09375f,0.25f, +0.101563f,0.25f, +0.109375f,0.25f, +0.117188f,0.25f, +0.125f,0.25f, +0.132813f,0.25f, +0.140625f,0.25f, +0.148438f,0.25f, +0.15625f,0.25f, +0.164063f,0.25f, +0.171875f,0.25f, +0.179688f,0.25f, +0.1875f,0.25f, +0.195313f,0.25f, +0.203125f,0.25f, +0.210938f,0.25f, +0.21875f,0.25f, +0.226563f,0.25f, +0.234375f,0.25f, +0.242188f,0.25f, +0.25f,0.25f, +0.257813f,0.25f, +0.265625f,0.25f, +0.273438f,0.25f, +0.28125f,0.25f, +0.289063f,0.25f, +0.296875f,0.25f, +0.304688f,0.25f, +0.3125f,0.25f, +0.320313f,0.25f, +0.328125f,0.25f, +0.335938f,0.25f, +0.34375f,0.25f, +0.351563f,0.25f, +0.359375f,0.25f, +0.367188f,0.25f, +0.375f,0.25f, +0.382813f,0.25f, +0.390625f,0.25f, +0.398438f,0.25f, +0.40625f,0.25f, +0.414063f,0.25f, +0.421875f,0.25f, +0.429688f,0.25f, +0.4375f,0.25f, +0.445313f,0.25f, +0.453125f,0.25f, +0.460938f,0.25f, +0.46875f,0.25f, +0.476563f,0.25f, +0.484375f,0.25f, +0.492188f,0.25f, +0.5f,0.25f, +0.507813f,0.25f, +0.0f,0.257813f, +0.0078125f,0.257813f, +0.015625f,0.257813f, +0.0234375f,0.257813f, +0.03125f,0.257813f, +0.0390625f,0.257813f, +0.046875f,0.257813f, +0.0546875f,0.257813f, +0.0625f,0.257813f, +0.0703125f,0.257813f, +0.078125f,0.257813f, +0.0859375f,0.257813f, +0.09375f,0.257813f, +0.101563f,0.257813f, +0.109375f,0.257813f, +0.117188f,0.257813f, +0.125f,0.257813f, +0.132813f,0.257813f, +0.140625f,0.257813f, +0.148438f,0.257813f, +0.15625f,0.257813f, +0.164063f,0.257813f, +0.171875f,0.257813f, +0.179688f,0.257813f, +0.1875f,0.257813f, +0.195313f,0.257813f, +0.203125f,0.257813f, +0.210938f,0.257813f, +0.21875f,0.257813f, +0.226563f,0.257813f, +0.234375f,0.257813f, +0.242188f,0.257813f, +0.25f,0.257813f, +0.257813f,0.257813f, +0.265625f,0.257813f, +0.273438f,0.257813f, +0.28125f,0.257813f, +0.289063f,0.257813f, +0.296875f,0.257813f, +0.304688f,0.257813f, +0.3125f,0.257813f, +0.320313f,0.257813f, +0.328125f,0.257813f, +0.335938f,0.257813f, +0.34375f,0.257813f, +0.351563f,0.257813f, +0.359375f,0.257813f, +0.367188f,0.257813f, +0.375f,0.257813f, +0.382813f,0.257813f, +0.390625f,0.257813f, +0.398438f,0.257813f, +0.40625f,0.257813f, +0.414063f,0.257813f, +0.421875f,0.257813f, +0.429688f,0.257813f, +0.4375f,0.257813f, +0.445313f,0.257813f, +0.453125f,0.257813f, +0.460938f,0.257813f, +0.46875f,0.257813f, +0.476563f,0.257813f, +0.484375f,0.257813f, +0.492188f,0.257813f, +0.5f,0.257813f, +0.507813f,0.257813f, +0.0f,0.265625f, +0.0078125f,0.265625f, +0.015625f,0.265625f, +0.0234375f,0.265625f, +0.03125f,0.265625f, +0.0390625f,0.265625f, +0.046875f,0.265625f, +0.0546875f,0.265625f, +0.0625f,0.265625f, +0.0703125f,0.265625f, +0.078125f,0.265625f, +0.0859375f,0.265625f, +0.09375f,0.265625f, +0.101563f,0.265625f, +0.109375f,0.265625f, +0.117188f,0.265625f, +0.125f,0.265625f, +0.132813f,0.265625f, +0.140625f,0.265625f, +0.148438f,0.265625f, +0.15625f,0.265625f, +0.164063f,0.265625f, +0.171875f,0.265625f, +0.179688f,0.265625f, +0.1875f,0.265625f, +0.195313f,0.265625f, +0.203125f,0.265625f, +0.210938f,0.265625f, +0.21875f,0.265625f, +0.226563f,0.265625f, +0.234375f,0.265625f, +0.242188f,0.265625f, +0.25f,0.265625f, +0.257813f,0.265625f, +0.265625f,0.265625f, +0.273438f,0.265625f, +0.28125f,0.265625f, +0.289063f,0.265625f, +0.296875f,0.265625f, +0.304688f,0.265625f, +0.3125f,0.265625f, +0.320313f,0.265625f, +0.328125f,0.265625f, +0.335938f,0.265625f, +0.34375f,0.265625f, +0.351563f,0.265625f, +0.359375f,0.265625f, +0.367188f,0.265625f, +0.375f,0.265625f, +0.382813f,0.265625f, +0.390625f,0.265625f, +0.398438f,0.265625f, +0.40625f,0.265625f, +0.414063f,0.265625f, +0.421875f,0.265625f, +0.429688f,0.265625f, +0.4375f,0.265625f, +0.445313f,0.265625f, +0.453125f,0.265625f, +0.460938f,0.265625f, +0.46875f,0.265625f, +0.476563f,0.265625f, +0.484375f,0.265625f, +0.492188f,0.265625f, +0.5f,0.265625f, +0.507813f,0.265625f, +}; + +unsigned short Landscape06Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +2178,2112,2179, +2113,2179,2112, +2179,2113,2180, +2114,2180,2113, +2180,2114,2181, +2115,2181,2114, +2181,2115,2182, +2116,2182,2115, +2182,2116,2183, +2117,2183,2116, +2183,2117,2184, +2118,2184,2117, +2184,2118,2185, +2119,2185,2118, +2185,2119,2186, +2120,2186,2119, +2186,2120,2187, +2121,2187,2120, +2187,2121,2188, +2122,2188,2121, +2188,2122,2189, +2123,2189,2122, +2189,2123,2190, +2124,2190,2123, +2190,2124,2191, +2125,2191,2124, +2191,2125,2192, +2126,2192,2125, +2192,2126,2193, +2127,2193,2126, +2193,2127,2194, +2128,2194,2127, +2194,2128,2195, +2129,2195,2128, +2195,2129,2196, +2130,2196,2129, +2196,2130,2197, +2131,2197,2130, +2197,2131,2198, +2132,2198,2131, +2198,2132,2199, +2133,2199,2132, +2199,2133,2200, +2134,2200,2133, +2200,2134,2201, +2135,2201,2134, +2201,2135,2202, +2136,2202,2135, +2202,2136,2203, +2137,2203,2136, +2203,2137,2204, +2138,2204,2137, +2204,2138,2205, +2139,2205,2138, +2205,2139,2206, +2140,2206,2139, +2206,2140,2207, +2141,2207,2140, +2207,2141,2208, +2142,2208,2141, +2208,2142,2209, +2143,2209,2142, +2209,2143,2210, +2144,2210,2143, +2210,2144,2211, +2145,2211,2144, +2211,2145,2212, +2146,2212,2145, +2212,2146,2213, +2147,2213,2146, +2213,2147,2214, +2148,2214,2147, +2214,2148,2215, +2149,2215,2148, +2215,2149,2216, +2150,2216,2149, +2216,2150,2217, +2151,2217,2150, +2217,2151,2218, +2152,2218,2151, +2218,2152,2219, +2153,2219,2152, +2219,2153,2220, +2154,2220,2153, +2220,2154,2221, +2155,2221,2154, +2221,2155,2222, +2156,2222,2155, +2222,2156,2223, +2157,2223,2156, +2223,2157,2224, +2158,2224,2157, +2224,2158,2225, +2159,2225,2158, +2225,2159,2226, +2160,2226,2159, +2226,2160,2227, +2161,2227,2160, +2227,2161,2228, +2162,2228,2161, +2228,2162,2229, +2163,2229,2162, +2229,2163,2230, +2164,2230,2163, +2230,2164,2231, +2165,2231,2164, +2231,2165,2232, +2166,2232,2165, +2232,2166,2233, +2167,2233,2166, +2233,2167,2234, +2168,2234,2167, +2234,2168,2235, +2169,2235,2168, +2235,2169,2236, +2170,2236,2169, +2236,2170,2237, +2171,2237,2170, +2237,2171,2238, +2172,2238,2171, +2238,2172,2239, +2173,2239,2172, +2239,2173,2240, +2174,2240,2173, +2240,2174,2241, +2175,2241,2174, +2241,2175,2242, +2176,2242,2175, +2242,2176,2243, +2177,2243,2176, +2244,2178,2245, +2179,2245,2178, +2245,2179,2246, +2180,2246,2179, +2246,2180,2247, +2181,2247,2180, +2247,2181,2248, +2182,2248,2181, +2248,2182,2249, +2183,2249,2182, +2249,2183,2250, +2184,2250,2183, +2250,2184,2251, +2185,2251,2184, +2251,2185,2252, +2186,2252,2185, +2252,2186,2253, +2187,2253,2186, +2253,2187,2254, +2188,2254,2187, +2254,2188,2255, +2189,2255,2188, +2255,2189,2256, +2190,2256,2189, +2256,2190,2257, +2191,2257,2190, +2257,2191,2258, +2192,2258,2191, +2258,2192,2259, +2193,2259,2192, +2259,2193,2260, +2194,2260,2193, +2260,2194,2261, +2195,2261,2194, +2261,2195,2262, +2196,2262,2195, +2262,2196,2263, +2197,2263,2196, +2263,2197,2264, +2198,2264,2197, +2264,2198,2265, +2199,2265,2198, +2265,2199,2266, +2200,2266,2199, +2266,2200,2267, +2201,2267,2200, +2267,2201,2268, +2202,2268,2201, +2268,2202,2269, +2203,2269,2202, +2269,2203,2270, +2204,2270,2203, +2270,2204,2271, +2205,2271,2204, +2271,2205,2272, +2206,2272,2205, +2272,2206,2273, +2207,2273,2206, +2273,2207,2274, +2208,2274,2207, +2274,2208,2275, +2209,2275,2208, +2275,2209,2276, +2210,2276,2209, +2276,2210,2277, +2211,2277,2210, +2277,2211,2278, +2212,2278,2211, +2278,2212,2279, +2213,2279,2212, +2279,2213,2280, +2214,2280,2213, +2280,2214,2281, +2215,2281,2214, +2281,2215,2282, +2216,2282,2215, +2282,2216,2283, +2217,2283,2216, +2283,2217,2284, +2218,2284,2217, +2284,2218,2285, +2219,2285,2218, +2285,2219,2286, +2220,2286,2219, +2286,2220,2287, +2221,2287,2220, +2287,2221,2288, +2222,2288,2221, +2288,2222,2289, +2223,2289,2222, +2289,2223,2290, +2224,2290,2223, +2290,2224,2291, +2225,2291,2224, +2291,2225,2292, +2226,2292,2225, +2292,2226,2293, +2227,2293,2226, +2293,2227,2294, +2228,2294,2227, +2294,2228,2295, +2229,2295,2228, +2295,2229,2296, +2230,2296,2229, +2296,2230,2297, +2231,2297,2230, +2297,2231,2298, +2232,2298,2231, +2298,2232,2299, +2233,2299,2232, +2299,2233,2300, +2234,2300,2233, +2300,2234,2301, +2235,2301,2234, +2301,2235,2302, +2236,2302,2235, +2302,2236,2303, +2237,2303,2236, +2303,2237,2304, +2238,2304,2237, +2304,2238,2305, +2239,2305,2238, +2305,2239,2306, +2240,2306,2239, +2306,2240,2307, +2241,2307,2240, +2307,2241,2308, +2242,2308,2241, +2308,2242,2309, +2243,2309,2242, +}; + +#define Landscape07VtxCount 2240 +#define Landscape07IdxCount 12852 + +btScalar Landscape07Vtx[] = { +3.90625f,49.6769f,-121.094f, +3.90625f,48.3887f,-117.188f, +7.8125f,48.8687f,-121.094f, +7.8125f,48.004f,-117.188f, +11.7188f,47.3453f,-121.094f, +11.7188f,46.8723f,-117.188f, +15.625f,44.9132f,-121.094f, +15.625f,45.5005f,-117.188f, +19.5313f,43.1526f,-121.094f, +19.5313f,43.3644f,-117.188f, +23.4375f,41.3946f,-121.094f, +23.4375f,42.3352f,-117.188f, +27.3438f,40.1349f,-121.094f, +27.3438f,41.1562f,-117.188f, +31.25f,39.2733f,-121.094f, +31.25f,39.1736f,-117.188f, +35.1563f,38.3718f,-121.094f, +35.1563f,38.0627f,-117.188f, +39.0625f,37.16f,-121.094f, +39.0625f,36.4728f,-117.188f, +42.9688f,35.2678f,-121.094f, +42.9688f,34.8001f,-117.188f, +46.875f,32.8529f,-121.094f, +46.875f,32.5103f,-117.188f, +50.7813f,32.0924f,-121.094f, +50.7813f,31.6328f,-117.188f, +54.6875f,33.2013f,-121.094f, +54.6875f,31.6106f,-117.188f, +58.5938f,34.1499f,-121.094f, +58.5938f,32.3004f,-117.188f, +62.5f,33.7675f,-121.094f, +62.5f,32.696f,-117.188f, +66.4063f,34.4892f,-121.094f, +66.4063f,33.3795f,-117.188f, +70.3125f,34.7441f,-121.094f, +70.3125f,33.9696f,-117.188f, +74.2188f,35.4435f,-121.094f, +74.2188f,34.9211f,-117.188f, +78.125f,36.6876f,-121.094f, +78.125f,36.7686f,-117.188f, +82.0313f,37.8831f,-121.094f, +82.0313f,37.7676f,-117.188f, +85.9375f,37.8533f,-121.094f, +85.9375f,37.8174f,-117.188f, +89.8438f,38.2467f,-121.094f, +89.8438f,38.2878f,-117.188f, +93.75f,39.5884f,-121.094f, +93.75f,39.6151f,-117.188f, +97.6563f,39.7164f,-121.094f, +97.6563f,39.7422f,-117.188f, +101.563f,40.296f,-121.094f, +101.563f,40.9611f,-117.188f, +105.469f,40.7222f,-121.094f, +105.469f,40.8932f,-117.188f, +109.375f,40.1304f,-121.094f, +109.375f,40.6603f,-117.188f, +113.281f,39.4566f,-121.094f, +113.281f,40.2935f,-117.188f, +117.188f,39.003f,-121.094f, +117.188f,39.8681f,-117.188f, +121.094f,38.091f,-121.094f, +121.094f,39.0965f,-117.188f, +125.0f,37.216f,-121.094f, +125.0f,37.1333f,-117.188f, +128.906f,35.4631f,-121.094f, +128.906f,35.5222f,-117.188f, +132.813f,33.4698f,-121.094f, +132.813f,33.9068f,-117.188f, +136.719f,31.5516f,-121.094f, +136.719f,32.2618f,-117.188f, +140.625f,28.6676f,-121.094f, +140.625f,29.8657f,-117.188f, +144.531f,26.5656f,-121.094f, +144.531f,28.1704f,-117.188f, +148.438f,24.1962f,-121.094f, +148.438f,27.1495f,-117.188f, +152.344f,22.2193f,-121.094f, +152.344f,24.5217f,-117.188f, +156.25f,20.1818f,-121.094f, +156.25f,22.0419f,-117.188f, +160.156f,17.6116f,-121.094f, +160.156f,19.9238f,-117.188f, +164.063f,15.5398f,-121.094f, +164.063f,17.6875f,-117.188f, +167.969f,13.7972f,-121.094f, +167.969f,15.5636f,-117.188f, +171.875f,11.7291f,-121.094f, +171.875f,13.5497f,-117.188f, +175.781f,9.31738f,-121.094f, +175.781f,11.2761f,-117.188f, +179.688f,6.60425f,-121.094f, +179.688f,8.95864f,-117.188f, +183.594f,4.50127f,-121.094f, +183.594f,7.04623f,-117.188f, +187.5f,2.77579f,-121.094f, +187.5f,4.83635f,-117.188f, +191.406f,1.39292f,-121.094f, +191.406f,2.76046f,-117.188f, +195.313f,-1.41093f,-121.094f, +195.313f,0.190119f,-117.188f, +199.219f,-2.1383f,-121.094f, +199.219f,-0.558379f,-117.188f, +203.125f,-2.43203f,-121.094f, +203.125f,-1.03303f,-117.188f, +207.031f,-3.74398f,-121.094f, +207.031f,-2.17563f,-117.188f, +210.938f,-4.31531f,-121.094f, +210.938f,-1.91155f,-117.188f, +214.844f,-5.42965f,-121.094f, +214.844f,-3.00018f,-117.188f, +218.75f,-6.70056f,-121.094f, +218.75f,-4.26691f,-117.188f, +222.656f,-6.19564f,-121.094f, +222.656f,-5.15855f,-117.188f, +226.563f,-4.68254f,-121.094f, +226.563f,-3.46348f,-117.188f, +230.469f,-3.31858f,-121.094f, +230.469f,-2.16077f,-117.188f, +234.375f,-3.88428f,-121.094f, +234.375f,-1.47785f,-117.188f, +238.281f,-3.80321f,-121.094f, +238.281f,-1.78424f,-117.188f, +242.188f,-3.43571f,-121.094f, +242.188f,-1.00317f,-117.188f, +246.094f,-3.77556f,-121.094f, +246.094f,-1.97981f,-117.188f, +250.0f,-3.83169f,-121.094f, +250.0f,-2.29372f,-117.188f, +3.90625f,50.3021f,-125.0f, +7.8125f,50.0186f,-125.0f, +11.7188f,47.8026f,-125.0f, +15.625f,45.4122f,-125.0f, +19.5313f,42.7204f,-125.0f, +23.4375f,42.1093f,-125.0f, +27.3438f,41.0672f,-125.0f, +31.25f,40.3016f,-125.0f, +35.1563f,38.401f,-125.0f, +39.0625f,36.5811f,-125.0f, +42.9688f,35.0771f,-125.0f, +46.875f,32.9255f,-125.0f, +50.7813f,31.2736f,-125.0f, +54.6875f,33.4622f,-125.0f, +58.5938f,34.314f,-125.0f, +62.5f,34.4185f,-125.0f, +66.4063f,34.621f,-125.0f, +70.3125f,34.9532f,-125.0f, +74.2188f,35.7305f,-125.0f, +78.125f,37.4446f,-125.0f, +82.0313f,37.6824f,-125.0f, +85.9375f,37.9835f,-125.0f, +89.8438f,38.5713f,-125.0f, +93.75f,39.56f,-125.0f, +97.6563f,40.0645f,-125.0f, +101.563f,39.9237f,-125.0f, +105.469f,39.8912f,-125.0f, +109.375f,39.9678f,-125.0f, +113.281f,39.7665f,-125.0f, +117.188f,38.758f,-125.0f, +121.094f,37.6738f,-125.0f, +125.0f,36.834f,-125.0f, +128.906f,34.7637f,-125.0f, +132.813f,31.9691f,-125.0f, +136.719f,30.7311f,-125.0f, +140.625f,27.9768f,-125.0f, +144.531f,25.22f,-125.0f, +148.438f,22.2616f,-125.0f, +152.344f,20.6399f,-125.0f, +156.25f,18.9363f,-125.0f, +160.156f,16.8778f,-125.0f, +164.063f,14.7425f,-125.0f, +167.969f,12.4299f,-125.0f, +171.875f,10.1017f,-125.0f, +175.781f,7.82169f,-125.0f, +179.688f,5.46502f,-125.0f, +183.594f,2.71076f,-125.0f, +187.5f,1.07736f,-125.0f, +191.406f,-0.592638f,-125.0f, +195.313f,-2.99173f,-125.0f, +199.219f,-4.30517f,-125.0f, +203.125f,-4.79591f,-125.0f, +207.031f,-6.32671f,-125.0f, +210.938f,-6.6914f,-125.0f, +214.844f,-8.34188f,-125.0f, +218.75f,-8.94371f,-125.0f, +222.656f,-7.16417f,-125.0f, +226.563f,-5.53904f,-125.0f, +230.469f,-5.10207f,-125.0f, +234.375f,-5.77507f,-125.0f, +238.281f,-5.5948f,-125.0f, +242.188f,-5.81224f,-125.0f, +246.094f,-5.48291f,-125.0f, +250.0f,-5.3221f,-125.0f, +3.90625f,50.4716f,-128.906f, +7.8125f,50.3922f,-128.906f, +11.7188f,48.0997f,-128.906f, +15.625f,44.9895f,-128.906f, +19.5313f,43.3038f,-128.906f, +23.4375f,42.8795f,-128.906f, +27.3438f,42.0905f,-128.906f, +31.25f,40.0566f,-128.906f, +35.1563f,37.7024f,-128.906f, +39.0625f,35.7533f,-128.906f, +42.9688f,32.9949f,-128.906f, +46.875f,31.7476f,-128.906f, +50.7813f,30.9413f,-128.906f, +54.6875f,31.9364f,-128.906f, +58.5938f,33.2028f,-128.906f, +62.5f,34.0103f,-128.906f, +66.4063f,34.3126f,-128.906f, +70.3125f,34.6096f,-128.906f, +74.2188f,35.8861f,-128.906f, +78.125f,36.5754f,-128.906f, +82.0313f,36.9009f,-128.906f, +85.9375f,37.369f,-128.906f, +89.8438f,38.2734f,-128.906f, +93.75f,38.7518f,-128.906f, +97.6563f,39.7576f,-128.906f, +101.563f,39.3413f,-128.906f, +105.469f,40.4224f,-128.906f, +109.375f,40.506f,-128.906f, +113.281f,39.7509f,-128.906f, +117.188f,38.6208f,-128.906f, +121.094f,37.1513f,-128.906f, +125.0f,36.003f,-128.906f, +128.906f,34.1307f,-128.906f, +132.813f,31.5523f,-128.906f, +136.719f,29.2003f,-128.906f, +140.625f,26.3718f,-128.906f, +144.531f,24.0851f,-128.906f, +148.438f,21.0492f,-128.906f, +152.344f,18.9709f,-128.906f, +156.25f,16.5536f,-128.906f, +160.156f,14.5588f,-128.906f, +164.063f,12.8386f,-128.906f, +167.969f,11.3092f,-128.906f, +171.875f,9.19396f,-128.906f, +175.781f,6.84617f,-128.906f, +179.688f,3.80062f,-128.906f, +183.594f,0.734751f,-128.906f, +187.5f,0.121523f,-128.906f, +191.406f,-1.9203f,-128.906f, +195.313f,-5.35291f,-128.906f, +199.219f,-7.06575f,-128.906f, +203.125f,-8.27325f,-128.906f, +207.031f,-8.82541f,-128.906f, +210.938f,-9.36185f,-128.906f, +214.844f,-10.8597f,-128.906f, +218.75f,-10.695f,-128.906f, +222.656f,-8.91012f,-128.906f, +226.563f,-8.24825f,-128.906f, +230.469f,-7.79624f,-128.906f, +234.375f,-6.74578f,-128.906f, +238.281f,-7.41285f,-128.906f, +242.188f,-7.01421f,-128.906f, +246.094f,-6.91669f,-128.906f, +250.0f,-6.09876f,-128.906f, +3.90625f,49.1054f,-132.813f, +7.8125f,48.771f,-132.813f, +11.7188f,46.9765f,-132.813f, +15.625f,44.4736f,-132.813f, +19.5313f,43.2026f,-132.813f, +23.4375f,42.2898f,-132.813f, +27.3438f,41.7492f,-132.813f, +31.25f,39.5792f,-132.813f, +35.1563f,36.5653f,-132.813f, +39.0625f,33.5612f,-132.813f, +42.9688f,31.9604f,-132.813f, +46.875f,30.953f,-132.813f, +50.7813f,30.5912f,-132.813f, +54.6875f,31.76f,-132.813f, +58.5938f,33.0843f,-132.813f, +62.5f,33.4323f,-132.813f, +66.4063f,33.9264f,-132.813f, +70.3125f,33.9268f,-132.813f, +74.2188f,33.8122f,-132.813f, +78.125f,34.9456f,-132.813f, +82.0313f,35.6308f,-132.813f, +85.9375f,35.8317f,-132.813f, +89.8438f,36.8255f,-132.813f, +93.75f,37.5781f,-132.813f, +97.6563f,39.0469f,-132.813f, +101.563f,38.905f,-132.813f, +105.469f,39.3656f,-132.813f, +109.375f,39.9706f,-132.813f, +113.281f,38.8077f,-132.813f, +117.188f,37.8378f,-132.813f, +121.094f,36.8368f,-132.813f, +125.0f,35.8474f,-132.813f, +128.906f,33.8502f,-132.813f, +132.813f,31.6251f,-132.813f, +136.719f,28.2781f,-132.813f, +140.625f,24.9841f,-132.813f, +144.531f,22.2281f,-132.813f, +148.438f,19.2974f,-132.813f, +152.344f,17.1516f,-132.813f, +156.25f,14.7654f,-132.813f, +160.156f,13.1833f,-132.813f, +164.063f,11.0184f,-132.813f, +167.969f,9.1589f,-132.813f, +171.875f,6.82631f,-132.813f, +175.781f,4.30633f,-132.813f, +179.688f,2.04751f,-132.813f, +183.594f,-0.74554f,-132.813f, +187.5f,-1.24688f,-132.813f, +191.406f,-3.70884f,-132.813f, +195.313f,-7.20423f,-132.813f, +199.219f,-9.63057f,-132.813f, +203.125f,-10.6411f,-132.813f, +207.031f,-11.1561f,-132.813f, +210.938f,-11.9998f,-132.813f, +214.844f,-13.1369f,-132.813f, +218.75f,-12.4543f,-132.813f, +222.656f,-11.5031f,-132.813f, +226.563f,-11.4632f,-132.813f, +230.469f,-10.5609f,-132.813f, +234.375f,-9.96017f,-132.813f, +238.281f,-9.64047f,-132.813f, +242.188f,-8.79112f,-132.813f, +246.094f,-8.33514f,-132.813f, +250.0f,-6.32649f,-132.813f, +3.90625f,47.9f,-136.719f, +7.8125f,47.0423f,-136.719f, +11.7188f,46.1087f,-136.719f, +15.625f,42.8209f,-136.719f, +19.5313f,41.8846f,-136.719f, +23.4375f,41.4071f,-136.719f, +27.3438f,39.6798f,-136.719f, +31.25f,38.1881f,-136.719f, +35.1563f,35.3952f,-136.719f, +39.0625f,31.8297f,-136.719f, +42.9688f,31.014f,-136.719f, +46.875f,29.29f,-136.719f, +50.7813f,29.4455f,-136.719f, +54.6875f,30.368f,-136.719f, +58.5938f,31.6261f,-136.719f, +62.5f,31.8803f,-136.719f, +66.4063f,32.8102f,-136.719f, +70.3125f,33.4331f,-136.719f, +74.2188f,33.19f,-136.719f, +78.125f,33.74f,-136.719f, +82.0313f,35.1047f,-136.719f, +85.9375f,36.2436f,-136.719f, +89.8438f,36.4928f,-136.719f, +93.75f,36.192f,-136.719f, +97.6563f,37.547f,-136.719f, +101.563f,38.0632f,-136.719f, +105.469f,38.6551f,-136.719f, +109.375f,38.4484f,-136.719f, +113.281f,37.8421f,-136.719f, +117.188f,37.5588f,-136.719f, +121.094f,37.278f,-136.719f, +125.0f,35.3541f,-136.719f, +128.906f,33.0939f,-136.719f, +132.813f,30.522f,-136.719f, +136.719f,27.5957f,-136.719f, +140.625f,24.4595f,-136.719f, +144.531f,21.0335f,-136.719f, +148.438f,18.0163f,-136.719f, +152.344f,15.3659f,-136.719f, +156.25f,13.4036f,-136.719f, +160.156f,11.6819f,-136.719f, +164.063f,9.68686f,-136.719f, +167.969f,7.56782f,-136.719f, +171.875f,4.49435f,-136.719f, +175.781f,1.55284f,-136.719f, +179.688f,0.275057f,-136.719f, +183.594f,-2.20168f,-136.719f, +187.5f,-3.16842f,-136.719f, +191.406f,-5.74212f,-136.719f, +195.313f,-8.33918f,-136.719f, +199.219f,-11.9926f,-136.719f, +203.125f,-13.7382f,-136.719f, +207.031f,-14.2163f,-136.719f, +210.938f,-14.76f,-136.719f, +214.844f,-14.7917f,-136.719f, +218.75f,-15.4594f,-136.719f, +222.656f,-14.7722f,-136.719f, +226.563f,-14.7687f,-136.719f, +230.469f,-13.0502f,-136.719f, +234.375f,-12.7522f,-136.719f, +238.281f,-12.1277f,-136.719f, +242.188f,-11.9805f,-136.719f, +246.094f,-9.26664f,-136.719f, +250.0f,-6.42671f,-136.719f, +3.90625f,47.2681f,-140.625f, +7.8125f,46.3513f,-140.625f, +11.7188f,45.1181f,-140.625f, +15.625f,42.9593f,-140.625f, +19.5313f,40.04f,-140.625f, +23.4375f,38.1657f,-140.625f, +27.3438f,37.2537f,-140.625f, +31.25f,35.6767f,-140.625f, +35.1563f,33.3413f,-140.625f, +39.0625f,30.7556f,-140.625f, +42.9688f,29.0258f,-140.625f, +46.875f,27.8122f,-140.625f, +50.7813f,27.4512f,-140.625f, +54.6875f,28.1912f,-140.625f, +58.5938f,29.8142f,-140.625f, +62.5f,30.1394f,-140.625f, +66.4063f,30.7105f,-140.625f, +70.3125f,31.9295f,-140.625f, +74.2188f,32.6689f,-140.625f, +78.125f,32.9232f,-140.625f, +82.0313f,35.5221f,-140.625f, +85.9375f,36.1785f,-140.625f, +89.8438f,35.864f,-140.625f, +93.75f,35.2473f,-140.625f, +97.6563f,35.6334f,-140.625f, +101.563f,36.5759f,-140.625f, +105.469f,37.2506f,-140.625f, +109.375f,36.7249f,-140.625f, +113.281f,36.4287f,-140.625f, +117.188f,36.6819f,-140.625f, +121.094f,36.4294f,-140.625f, +125.0f,35.2358f,-140.625f, +128.906f,32.9869f,-140.625f, +132.813f,30.156f,-140.625f, +136.719f,27.0471f,-140.625f, +140.625f,23.8554f,-140.625f, +144.531f,20.3993f,-140.625f, +148.438f,16.6224f,-140.625f, +152.344f,13.058f,-140.625f, +156.25f,11.1345f,-140.625f, +160.156f,9.35133f,-140.625f, +164.063f,7.36194f,-140.625f, +167.969f,5.31819f,-140.625f, +171.875f,2.78652f,-140.625f, +175.781f,0.868982f,-140.625f, +179.688f,-1.31465f,-140.625f, +183.594f,-3.64199f,-140.625f, +187.5f,-5.38333f,-140.625f, +191.406f,-8.08251f,-140.625f, +195.313f,-10.9184f,-140.625f, +199.219f,-14.2737f,-140.625f, +203.125f,-16.1495f,-140.625f, +207.031f,-16.9134f,-140.625f, +210.938f,-16.9575f,-140.625f, +214.844f,-17.6023f,-140.625f, +218.75f,-17.6633f,-140.625f, +222.656f,-17.159f,-140.625f, +226.563f,-16.2062f,-140.625f, +230.469f,-15.7685f,-140.625f, +234.375f,-15.0547f,-140.625f, +238.281f,-14.7858f,-140.625f, +242.188f,-12.8534f,-140.625f, +246.094f,-9.20599f,-140.625f, +250.0f,-5.60644f,-140.625f, +3.90625f,45.2398f,-144.531f, +7.8125f,45.0428f,-144.531f, +11.7188f,44.1179f,-144.531f, +15.625f,42.444f,-144.531f, +19.5313f,39.732f,-144.531f, +23.4375f,37.0479f,-144.531f, +27.3438f,34.3624f,-144.531f, +31.25f,33.2513f,-144.531f, +35.1563f,31.1146f,-144.531f, +39.0625f,29.2726f,-144.531f, +42.9688f,27.3159f,-144.531f, +46.875f,27.1241f,-144.531f, +50.7813f,26.6524f,-144.531f, +54.6875f,26.3337f,-144.531f, +58.5938f,27.8201f,-144.531f, +62.5f,27.8456f,-144.531f, +66.4063f,27.8306f,-144.531f, +70.3125f,29.8911f,-144.531f, +74.2188f,31.0667f,-144.531f, +78.125f,32.5778f,-144.531f, +82.0313f,34.5337f,-144.531f, +85.9375f,35.1457f,-144.531f, +89.8438f,34.7649f,-144.531f, +93.75f,34.0929f,-144.531f, +97.6563f,34.2934f,-144.531f, +101.563f,34.8046f,-144.531f, +105.469f,36.2496f,-144.531f, +109.375f,35.8351f,-144.531f, +113.281f,35.8228f,-144.531f, +117.188f,35.7495f,-144.531f, +121.094f,34.832f,-144.531f, +125.0f,34.3351f,-144.531f, +128.906f,32.4744f,-144.531f, +132.813f,29.6967f,-144.531f, +136.719f,26.263f,-144.531f, +140.625f,23.3556f,-144.531f, +144.531f,19.3517f,-144.531f, +148.438f,14.458f,-144.531f, +152.344f,11.2423f,-144.531f, +156.25f,9.75514f,-144.531f, +160.156f,7.96146f,-144.531f, +164.063f,5.67024f,-144.531f, +167.969f,4.08006f,-144.531f, +171.875f,1.71102f,-144.531f, +175.781f,-0.915369f,-144.531f, +179.688f,-2.66343f,-144.531f, +183.594f,-5.5816f,-144.531f, +187.5f,-7.79353f,-144.531f, +191.406f,-10.1772f,-144.531f, +195.313f,-13.5463f,-144.531f, +199.219f,-16.0692f,-144.531f, +203.125f,-17.2505f,-144.531f, +207.031f,-18.7241f,-144.531f, +210.938f,-18.7295f,-144.531f, +214.844f,-19.3f,-144.531f, +218.75f,-20.3181f,-144.531f, +222.656f,-19.4871f,-144.531f, +226.563f,-18.5465f,-144.531f, +230.469f,-17.525f,-144.531f, +234.375f,-16.5076f,-144.531f, +238.281f,-15.0993f,-144.531f, +242.188f,-13.0716f,-144.531f, +246.094f,-9.99063f,-144.531f, +250.0f,-5.64288f,-144.531f, +3.90625f,43.4167f,-148.438f, +7.8125f,43.0193f,-148.438f, +11.7188f,42.6242f,-148.438f, +15.625f,40.8831f,-148.438f, +19.5313f,38.6824f,-148.438f, +23.4375f,36.0177f,-148.438f, +27.3438f,32.9654f,-148.438f, +31.25f,31.3995f,-148.438f, +35.1563f,29.5101f,-148.438f, +39.0625f,27.4588f,-148.438f, +42.9688f,25.129f,-148.438f, +46.875f,25.4533f,-148.438f, +50.7813f,25.7106f,-148.438f, +54.6875f,25.737f,-148.438f, +58.5938f,26.1608f,-148.438f, +62.5f,27.2373f,-148.438f, +66.4063f,27.3635f,-148.438f, +70.3125f,27.7787f,-148.438f, +74.2188f,29.0906f,-148.438f, +78.125f,31.3992f,-148.438f, +82.0313f,32.9373f,-148.438f, +85.9375f,33.743f,-148.438f, +89.8438f,34.4265f,-148.438f, +93.75f,33.525f,-148.438f, +97.6563f,33.8231f,-148.438f, +101.563f,34.6826f,-148.438f, +105.469f,35.0275f,-148.438f, +109.375f,34.4667f,-148.438f, +113.281f,34.7266f,-148.438f, +117.188f,34.0788f,-148.438f, +121.094f,33.2521f,-148.438f, +125.0f,32.1914f,-148.438f, +128.906f,30.7782f,-148.438f, +132.813f,28.8615f,-148.438f, +136.719f,25.3691f,-148.438f, +140.625f,21.5786f,-148.438f, +144.531f,17.2969f,-148.438f, +148.438f,13.1925f,-148.438f, +152.344f,10.0632f,-148.438f, +156.25f,8.32421f,-148.438f, +160.156f,6.57856f,-148.438f, +164.063f,4.18522f,-148.438f, +167.969f,2.25091f,-148.438f, +171.875f,0.445952f,-148.438f, +175.781f,-1.73703f,-148.438f, +179.688f,-3.44886f,-148.438f, +183.594f,-6.77108f,-148.438f, +187.5f,-9.26031f,-148.438f, +191.406f,-12.38f,-148.438f, +195.313f,-14.6453f,-148.438f, +199.219f,-15.8435f,-148.438f, +203.125f,-17.3242f,-148.438f, +207.031f,-19.3932f,-148.438f, +210.938f,-19.7735f,-148.438f, +214.844f,-20.1293f,-148.438f, +218.75f,-20.5777f,-148.438f, +222.656f,-20.7145f,-148.438f, +226.563f,-20.64f,-148.438f, +230.469f,-19.6971f,-148.438f, +234.375f,-17.5016f,-148.438f, +238.281f,-14.644f,-148.438f, +242.188f,-12.3094f,-148.438f, +246.094f,-10.1634f,-148.438f, +250.0f,-6.79503f,-148.438f, +3.90625f,42.7212f,-152.344f, +7.8125f,41.7463f,-152.344f, +11.7188f,40.5249f,-152.344f, +15.625f,39.5225f,-152.344f, +19.5313f,36.6967f,-152.344f, +23.4375f,34.0075f,-152.344f, +27.3438f,31.2054f,-152.344f, +31.25f,28.8502f,-152.344f, +35.1563f,27.2625f,-152.344f, +39.0625f,24.9496f,-152.344f, +42.9688f,23.5897f,-152.344f, +46.875f,23.4709f,-152.344f, +50.7813f,24.179f,-152.344f, +54.6875f,25.021f,-152.344f, +58.5938f,25.6664f,-152.344f, +62.5f,25.7063f,-152.344f, +66.4063f,26.6928f,-152.344f, +70.3125f,26.8261f,-152.344f, +74.2188f,28.2549f,-152.344f, +78.125f,30.3373f,-152.344f, +82.0313f,31.6194f,-152.344f, +85.9375f,32.9189f,-152.344f, +89.8438f,32.7162f,-152.344f, +93.75f,33.0001f,-152.344f, +97.6563f,34.4407f,-152.344f, +101.563f,35.0813f,-152.344f, +105.469f,34.4143f,-152.344f, +109.375f,33.5195f,-152.344f, +113.281f,32.927f,-152.344f, +117.188f,32.6509f,-152.344f, +121.094f,32.6775f,-152.344f, +125.0f,30.887f,-152.344f, +128.906f,28.4296f,-152.344f, +132.813f,26.5539f,-152.344f, +136.719f,24.0803f,-152.344f, +140.625f,20.196f,-152.344f, +144.531f,16.4293f,-152.344f, +148.438f,12.8243f,-152.344f, +152.344f,9.76479f,-152.344f, +156.25f,7.14206f,-152.344f, +160.156f,4.74684f,-152.344f, +164.063f,2.30008f,-152.344f, +167.969f,1.49801f,-152.344f, +171.875f,-0.62719f,-152.344f, +175.781f,-1.99004f,-152.344f, +179.688f,-4.80775f,-152.344f, +183.594f,-8.00986f,-152.344f, +187.5f,-11.4771f,-152.344f, +191.406f,-12.8743f,-152.344f, +195.313f,-13.8733f,-152.344f, +199.219f,-15.0749f,-152.344f, +203.125f,-16.9234f,-152.344f, +207.031f,-18.3258f,-152.344f, +210.938f,-19.6583f,-152.344f, +214.844f,-20.9396f,-152.344f, +218.75f,-21.8071f,-152.344f, +222.656f,-21.4908f,-152.344f, +226.563f,-21.4698f,-152.344f, +230.469f,-19.3773f,-152.344f, +234.375f,-17.0448f,-152.344f, +238.281f,-14.0123f,-152.344f, +242.188f,-11.2372f,-152.344f, +246.094f,-9.11286f,-152.344f, +250.0f,-6.76792f,-152.344f, +3.90625f,41.7368f,-156.25f, +7.8125f,40.8494f,-156.25f, +11.7188f,39.2286f,-156.25f, +15.625f,37.4784f,-156.25f, +19.5313f,36.0345f,-156.25f, +23.4375f,33.9716f,-156.25f, +27.3438f,31.3041f,-156.25f, +31.25f,28.9777f,-156.25f, +35.1563f,26.0934f,-156.25f, +39.0625f,23.7421f,-156.25f, +42.9688f,22.4401f,-156.25f, +46.875f,22.1238f,-156.25f, +50.7813f,22.6669f,-156.25f, +54.6875f,23.7702f,-156.25f, +58.5938f,24.63f,-156.25f, +62.5f,25.2145f,-156.25f, +66.4063f,26.6101f,-156.25f, +70.3125f,27.3664f,-156.25f, +74.2188f,28.121f,-156.25f, +78.125f,29.5305f,-156.25f, +82.0313f,30.4367f,-156.25f, +85.9375f,30.627f,-156.25f, +89.8438f,30.4079f,-156.25f, +93.75f,32.2186f,-156.25f, +97.6563f,33.2916f,-156.25f, +101.563f,33.8066f,-156.25f, +105.469f,32.5269f,-156.25f, +109.375f,32.0751f,-156.25f, +113.281f,31.0298f,-156.25f, +117.188f,30.9869f,-156.25f, +121.094f,30.9826f,-156.25f, +125.0f,29.0676f,-156.25f, +128.906f,26.8988f,-156.25f, +132.813f,24.0771f,-156.25f, +136.719f,21.8087f,-156.25f, +140.625f,18.8179f,-156.25f, +144.531f,14.2483f,-156.25f, +148.438f,10.9236f,-156.25f, +152.344f,9.05948f,-156.25f, +156.25f,6.86087f,-156.25f, +160.156f,3.50699f,-156.25f, +164.063f,1.14903f,-156.25f, +167.969f,-0.639847f,-156.25f, +171.875f,-2.73828f,-156.25f, +175.781f,-4.02372f,-156.25f, +179.688f,-6.15141f,-156.25f, +183.594f,-8.81231f,-156.25f, +187.5f,-10.3417f,-156.25f, +191.406f,-11.1895f,-156.25f, +195.313f,-13.1464f,-156.25f, +199.219f,-14.5401f,-156.25f, +203.125f,-15.9427f,-156.25f, +207.031f,-17.492f,-156.25f, +210.938f,-19.0599f,-156.25f, +214.844f,-21.1101f,-156.25f, +218.75f,-21.3872f,-156.25f, +222.656f,-21.1481f,-156.25f, +226.563f,-20.2836f,-156.25f, +230.469f,-18.1679f,-156.25f, +234.375f,-15.72f,-156.25f, +238.281f,-13.4579f,-156.25f, +242.188f,-10.1453f,-156.25f, +246.094f,-8.09411f,-156.25f, +250.0f,-5.46467f,-156.25f, +3.90625f,40.4755f,-160.156f, +7.8125f,39.299f,-160.156f, +11.7188f,37.3972f,-160.156f, +15.625f,36.1894f,-160.156f, +19.5313f,34.3138f,-160.156f, +23.4375f,32.893f,-160.156f, +27.3438f,30.4515f,-160.156f, +31.25f,28.5808f,-160.156f, +35.1563f,25.8839f,-160.156f, +39.0625f,23.8505f,-160.156f, +42.9688f,22.3057f,-160.156f, +46.875f,21.4418f,-160.156f, +50.7813f,21.9709f,-160.156f, +54.6875f,23.0083f,-160.156f, +58.5938f,24.899f,-160.156f, +62.5f,25.213f,-160.156f, +66.4063f,26.1428f,-160.156f, +70.3125f,27.2675f,-160.156f, +74.2188f,28.0843f,-160.156f, +78.125f,28.9474f,-160.156f, +82.0313f,29.5078f,-160.156f, +85.9375f,29.7468f,-160.156f, +89.8438f,30.8621f,-160.156f, +93.75f,31.5001f,-160.156f, +97.6563f,32.1184f,-160.156f, +101.563f,31.2692f,-160.156f, +105.469f,30.4985f,-160.156f, +109.375f,29.4368f,-160.156f, +113.281f,30.6889f,-160.156f, +117.188f,29.6238f,-160.156f, +121.094f,28.6487f,-160.156f, +125.0f,26.3174f,-160.156f, +128.906f,24.6125f,-160.156f, +132.813f,22.1993f,-160.156f, +136.719f,19.3934f,-160.156f, +140.625f,16.5457f,-160.156f, +144.531f,13.4024f,-160.156f, +148.438f,9.69887f,-160.156f, +152.344f,8.13305f,-160.156f, +156.25f,6.48921f,-160.156f, +160.156f,2.56153f,-160.156f, +164.063f,0.0733139f,-160.156f, +167.969f,-1.11414f,-160.156f, +171.875f,-3.04708f,-160.156f, +175.781f,-6.18654f,-160.156f, +179.688f,-7.4188f,-160.156f, +183.594f,-9.1718f,-160.156f, +187.5f,-9.78027f,-160.156f, +191.406f,-10.5496f,-160.156f, +195.313f,-12.7259f,-160.156f, +199.219f,-13.9068f,-160.156f, +203.125f,-15.4772f,-160.156f, +207.031f,-17.6287f,-160.156f, +210.938f,-19.2502f,-160.156f, +214.844f,-19.5824f,-160.156f, +218.75f,-19.3114f,-160.156f, +222.656f,-19.5266f,-160.156f, +226.563f,-17.8446f,-160.156f, +230.469f,-16.3027f,-160.156f, +234.375f,-14.5015f,-160.156f, +238.281f,-11.9891f,-160.156f, +242.188f,-9.40017f,-160.156f, +246.094f,-6.63794f,-160.156f, +250.0f,-3.71573f,-160.156f, +3.90625f,38.8633f,-164.063f, +7.8125f,37.4382f,-164.063f, +11.7188f,35.7214f,-164.063f, +15.625f,34.0614f,-164.063f, +19.5313f,33.0957f,-164.063f, +23.4375f,32.0369f,-164.063f, +27.3438f,29.7096f,-164.063f, +31.25f,27.3216f,-164.063f, +35.1563f,25.2446f,-164.063f, +39.0625f,23.6071f,-164.063f, +42.9688f,22.2443f,-164.063f, +46.875f,21.2807f,-164.063f, +50.7813f,21.0358f,-164.063f, +54.6875f,22.8177f,-164.063f, +58.5938f,24.4434f,-164.063f, +62.5f,25.1375f,-164.063f, +66.4063f,25.3266f,-164.063f, +70.3125f,26.6102f,-164.063f, +74.2188f,27.6569f,-164.063f, +78.125f,27.8248f,-164.063f, +82.0313f,28.0421f,-164.063f, +85.9375f,29.1719f,-164.063f, +89.8438f,29.9529f,-164.063f, +93.75f,30.947f,-164.063f, +97.6563f,30.6189f,-164.063f, +101.563f,29.7913f,-164.063f, +105.469f,27.6858f,-164.063f, +109.375f,27.3234f,-164.063f, +113.281f,27.8148f,-164.063f, +117.188f,27.3571f,-164.063f, +121.094f,26.1572f,-164.063f, +125.0f,23.8557f,-164.063f, +128.906f,21.6383f,-164.063f, +132.813f,19.0681f,-164.063f, +136.719f,16.7352f,-164.063f, +140.625f,14.4004f,-164.063f, +144.531f,11.082f,-164.063f, +148.438f,8.38754f,-164.063f, +152.344f,7.0054f,-164.063f, +156.25f,4.95122f,-164.063f, +160.156f,2.47298f,-164.063f, +164.063f,0.777691f,-164.063f, +167.969f,-1.44055f,-164.063f, +171.875f,-3.57218f,-164.063f, +175.781f,-6.3396f,-164.063f, +179.688f,-7.49937f,-164.063f, +183.594f,-9.17485f,-164.063f, +187.5f,-9.92705f,-164.063f, +191.406f,-11.0737f,-164.063f, +195.313f,-12.8264f,-164.063f, +199.219f,-14.9306f,-164.063f, +203.125f,-15.9553f,-164.063f, +207.031f,-17.0898f,-164.063f, +210.938f,-18.5283f,-164.063f, +214.844f,-18.545f,-164.063f, +218.75f,-18.553f,-164.063f, +222.656f,-17.5725f,-164.063f, +226.563f,-15.6444f,-164.063f, +230.469f,-14.565f,-164.063f, +234.375f,-12.5578f,-164.063f, +238.281f,-10.6498f,-164.063f, +242.188f,-8.28284f,-164.063f, +246.094f,-5.87682f,-164.063f, +250.0f,-2.5339f,-164.063f, +3.90625f,37.2199f,-167.969f, +7.8125f,36.6782f,-167.969f, +11.7188f,36.2393f,-167.969f, +15.625f,33.4745f,-167.969f, +19.5313f,32.0928f,-167.969f, +23.4375f,30.5662f,-167.969f, +27.3438f,28.5968f,-167.969f, +31.25f,26.4298f,-167.969f, +35.1563f,23.9469f,-167.969f, +39.0625f,22.5415f,-167.969f, +42.9688f,21.8267f,-167.969f, +46.875f,21.2097f,-167.969f, +50.7813f,21.0841f,-167.969f, +54.6875f,21.7877f,-167.969f, +58.5938f,22.9351f,-167.969f, +62.5f,24.0641f,-167.969f, +66.4063f,24.42f,-167.969f, +70.3125f,24.8355f,-167.969f, +74.2188f,25.2701f,-167.969f, +78.125f,26.0252f,-167.969f, +82.0313f,26.8612f,-167.969f, +85.9375f,27.4256f,-167.969f, +89.8438f,28.994f,-167.969f, +93.75f,29.1766f,-167.969f, +97.6563f,27.8964f,-167.969f, +101.563f,26.6384f,-167.969f, +105.469f,24.9844f,-167.969f, +109.375f,25.0669f,-167.969f, +113.281f,24.572f,-167.969f, +117.188f,23.7817f,-167.969f, +121.094f,22.2089f,-167.969f, +125.0f,19.7633f,-167.969f, +128.906f,17.7618f,-167.969f, +132.813f,15.7339f,-167.969f, +136.719f,13.4975f,-167.969f, +140.625f,11.7364f,-167.969f, +144.531f,9.85351f,-167.969f, +148.438f,8.05282f,-167.969f, +152.344f,6.97463f,-167.969f, +156.25f,5.11511f,-167.969f, +160.156f,3.12954f,-167.969f, +164.063f,1.56555f,-167.969f, +167.969f,-1.77415f,-167.969f, +171.875f,-4.16322f,-167.969f, +175.781f,-5.85214f,-167.969f, +179.688f,-7.97892f,-167.969f, +183.594f,-9.87953f,-167.969f, +187.5f,-10.2762f,-167.969f, +191.406f,-11.5319f,-167.969f, +195.313f,-13.3612f,-167.969f, +199.219f,-15.3709f,-167.969f, +203.125f,-16.5674f,-167.969f, +207.031f,-17.6903f,-167.969f, +210.938f,-17.6736f,-167.969f, +214.844f,-16.8207f,-167.969f, +218.75f,-17.0254f,-167.969f, +222.656f,-16.3676f,-167.969f, +226.563f,-14.2816f,-167.969f, +230.469f,-13.3488f,-167.969f, +234.375f,-12.0136f,-167.969f, +238.281f,-9.90116f,-167.969f, +242.188f,-7.92295f,-167.969f, +246.094f,-5.41594f,-167.969f, +250.0f,-1.87299f,-167.969f, +3.90625f,35.3898f,-171.875f, +7.8125f,35.2527f,-171.875f, +11.7188f,34.3178f,-171.875f, +15.625f,33.0736f,-171.875f, +19.5313f,31.4013f,-171.875f, +23.4375f,28.9174f,-171.875f, +27.3438f,26.607f,-171.875f, +31.25f,24.7766f,-171.875f, +35.1563f,23.21f,-171.875f, +39.0625f,21.903f,-171.875f, +42.9688f,20.775f,-171.875f, +46.875f,20.114f,-171.875f, +50.7813f,19.6974f,-171.875f, +54.6875f,20.6726f,-171.875f, +58.5938f,22.241f,-171.875f, +62.5f,22.075f,-171.875f, +66.4063f,22.6771f,-171.875f, +70.3125f,22.4456f,-171.875f, +74.2188f,22.8643f,-171.875f, +78.125f,24.7268f,-171.875f, +82.0313f,25.7019f,-171.875f, +85.9375f,26.1196f,-171.875f, +89.8438f,25.6156f,-171.875f, +93.75f,24.7881f,-171.875f, +97.6563f,24.0074f,-171.875f, +101.563f,23.4739f,-171.875f, +105.469f,23.362f,-171.875f, +109.375f,22.2604f,-171.875f, +113.281f,21.2772f,-171.875f, +117.188f,19.7815f,-171.875f, +121.094f,17.9686f,-171.875f, +125.0f,16.3211f,-171.875f, +128.906f,14.2631f,-171.875f, +132.813f,12.4914f,-171.875f, +136.719f,10.3941f,-171.875f, +140.625f,8.91613f,-171.875f, +144.531f,9.17409f,-171.875f, +148.438f,7.34154f,-171.875f, +152.344f,6.13056f,-171.875f, +156.25f,4.58272f,-171.875f, +160.156f,2.77083f,-171.875f, +164.063f,1.11181f,-171.875f, +167.969f,-2.00034f,-171.875f, +171.875f,-3.64525f,-171.875f, +175.781f,-5.12602f,-171.875f, +179.688f,-8.3325f,-171.875f, +183.594f,-10.0807f,-171.875f, +187.5f,-10.8974f,-171.875f, +191.406f,-11.9623f,-171.875f, +195.313f,-14.5041f,-171.875f, +199.219f,-15.8629f,-171.875f, +203.125f,-17.2342f,-171.875f, +207.031f,-18.2786f,-171.875f, +210.938f,-16.9405f,-171.875f, +214.844f,-16.1592f,-171.875f, +218.75f,-15.9928f,-171.875f, +222.656f,-14.9179f,-171.875f, +226.563f,-13.6308f,-171.875f, +230.469f,-12.822f,-171.875f, +234.375f,-11.0168f,-171.875f, +238.281f,-8.54191f,-171.875f, +242.188f,-6.16464f,-171.875f, +246.094f,-4.35579f,-171.875f, +250.0f,-1.83408f,-171.875f, +3.90625f,34.823f,-175.781f, +7.8125f,33.9621f,-175.781f, +11.7188f,33.7226f,-175.781f, +15.625f,31.9821f,-175.781f, +19.5313f,29.6933f,-175.781f, +23.4375f,27.247f,-175.781f, +27.3438f,25.1394f,-175.781f, +31.25f,23.3125f,-175.781f, +35.1563f,21.288f,-175.781f, +39.0625f,21.2432f,-175.781f, +42.9688f,19.7041f,-175.781f, +46.875f,19.3043f,-175.781f, +50.7813f,18.5669f,-175.781f, +54.6875f,19.5408f,-175.781f, +58.5938f,20.3028f,-175.781f, +62.5f,20.573f,-175.781f, +66.4063f,20.7874f,-175.781f, +70.3125f,21.4507f,-175.781f, +74.2188f,22.9166f,-175.781f, +78.125f,23.6886f,-175.781f, +82.0313f,24.4139f,-175.781f, +85.9375f,25.1097f,-175.781f, +89.8438f,24.1395f,-175.781f, +93.75f,23.5282f,-175.781f, +97.6563f,22.7881f,-175.781f, +101.563f,21.2087f,-175.781f, +105.469f,20.6461f,-175.781f, +109.375f,19.7212f,-175.781f, +113.281f,17.9239f,-175.781f, +117.188f,16.9142f,-175.781f, +121.094f,16.1581f,-175.781f, +125.0f,15.1171f,-175.781f, +128.906f,13.1305f,-175.781f, +132.813f,10.3035f,-175.781f, +136.719f,7.95438f,-175.781f, +140.625f,7.49768f,-175.781f, +144.531f,7.76486f,-175.781f, +148.438f,6.84318f,-175.781f, +152.344f,6.0204f,-175.781f, +156.25f,4.83875f,-175.781f, +160.156f,2.59906f,-175.781f, +164.063f,1.35973f,-175.781f, +167.969f,-1.40345f,-175.781f, +171.875f,-3.6985f,-175.781f, +175.781f,-5.60686f,-175.781f, +179.688f,-8.15914f,-175.781f, +183.594f,-9.0389f,-175.781f, +187.5f,-11.2771f,-175.781f, +191.406f,-13.1363f,-175.781f, +195.313f,-14.845f,-175.781f, +199.219f,-15.885f,-175.781f, +203.125f,-17.6421f,-175.781f, +207.031f,-18.1972f,-175.781f, +210.938f,-16.4052f,-175.781f, +214.844f,-16.4522f,-175.781f, +218.75f,-15.8261f,-175.781f, +222.656f,-13.6816f,-175.781f, +226.563f,-12.8394f,-175.781f, +230.469f,-11.638f,-175.781f, +234.375f,-8.87545f,-175.781f, +238.281f,-6.82071f,-175.781f, +242.188f,-3.82988f,-175.781f, +246.094f,-2.34543f,-175.781f, +250.0f,-0.72787f,-175.781f, +3.90625f,32.9461f,-179.688f, +7.8125f,32.0951f,-179.688f, +11.7188f,31.1161f,-179.688f, +15.625f,29.4f,-179.688f, +19.5313f,27.5196f,-179.688f, +23.4375f,26.3351f,-179.688f, +27.3438f,24.0706f,-179.688f, +31.25f,21.9677f,-179.688f, +35.1563f,20.1582f,-179.688f, +39.0625f,19.3604f,-179.688f, +42.9688f,18.5912f,-179.688f, +46.875f,18.0845f,-179.688f, +50.7813f,18.0311f,-179.688f, +54.6875f,17.5412f,-179.688f, +58.5938f,17.724f,-179.688f, +62.5f,18.1752f,-179.688f, +66.4063f,18.8435f,-179.688f, +70.3125f,20.8887f,-179.688f, +74.2188f,21.9179f,-179.688f, +78.125f,22.3044f,-179.688f, +82.0313f,22.1491f,-179.688f, +85.9375f,23.261f,-179.688f, +89.8438f,22.4285f,-179.688f, +93.75f,21.5354f,-179.688f, +97.6563f,19.6399f,-179.688f, +101.563f,18.1312f,-179.688f, +105.469f,17.0655f,-179.688f, +109.375f,16.1471f,-179.688f, +113.281f,15.8256f,-179.688f, +117.188f,14.9609f,-179.688f, +121.094f,15.4508f,-179.688f, +125.0f,14.9122f,-179.688f, +128.906f,12.3324f,-179.688f, +132.813f,9.95184f,-179.688f, +136.719f,7.31755f,-179.688f, +140.625f,6.91109f,-179.688f, +144.531f,7.29489f,-179.688f, +148.438f,6.73968f,-179.688f, +152.344f,6.0555f,-179.688f, +156.25f,5.42266f,-179.688f, +160.156f,3.84651f,-179.688f, +164.063f,2.44552f,-179.688f, +167.969f,-0.187962f,-179.688f, +171.875f,-3.00626f,-179.688f, +175.781f,-5.38527f,-179.688f, +179.688f,-6.48806f,-179.688f, +183.594f,-9.24275f,-179.688f, +187.5f,-11.5122f,-179.688f, +191.406f,-12.6735f,-179.688f, +195.313f,-14.1843f,-179.688f, +199.219f,-15.4787f,-179.688f, +203.125f,-16.6061f,-179.688f, +207.031f,-17.1175f,-179.688f, +210.938f,-16.022f,-179.688f, +214.844f,-15.9349f,-179.688f, +218.75f,-14.6169f,-179.688f, +222.656f,-13.0146f,-179.688f, +226.563f,-12.2f,-179.688f, +230.469f,-9.81169f,-179.688f, +234.375f,-6.72224f,-179.688f, +238.281f,-4.11664f,-179.688f, +242.188f,-2.18066f,-179.688f, +246.094f,-0.510192f,-179.688f, +250.0f,1.48603f,-179.688f, +3.90625f,30.0027f,-183.594f, +7.8125f,29.6114f,-183.594f, +11.7188f,28.342f,-183.594f, +15.625f,26.9383f,-183.594f, +19.5313f,26.0219f,-183.594f, +23.4375f,25.017f,-183.594f, +27.3438f,22.7851f,-183.594f, +31.25f,20.6488f,-183.594f, +35.1563f,18.7107f,-183.594f, +39.0625f,17.0893f,-183.594f, +42.9688f,17.4316f,-183.594f, +46.875f,17.3211f,-183.594f, +50.7813f,16.5318f,-183.594f, +54.6875f,16.2012f,-183.594f, +58.5938f,17.0855f,-183.594f, +62.5f,17.2472f,-183.594f, +66.4063f,18.0123f,-183.594f, +70.3125f,18.684f,-183.594f, +74.2188f,19.625f,-183.594f, +78.125f,19.9442f,-183.594f, +82.0313f,19.9236f,-183.594f, +85.9375f,19.2286f,-183.594f, +89.8438f,19.5358f,-183.594f, +93.75f,18.429f,-183.594f, +97.6563f,16.1318f,-183.594f, +101.563f,14.371f,-183.594f, +105.469f,13.894f,-183.594f, +109.375f,13.5457f,-183.594f, +113.281f,13.7348f,-183.594f, +117.188f,14.0078f,-183.594f, +121.094f,14.2652f,-183.594f, +125.0f,13.5964f,-183.594f, +128.906f,11.3529f,-183.594f, +132.813f,8.43645f,-183.594f, +136.719f,6.95213f,-183.594f, +140.625f,7.16061f,-183.594f, +144.531f,6.71961f,-183.594f, +148.438f,5.35597f,-183.594f, +152.344f,5.22708f,-183.594f, +156.25f,5.07045f,-183.594f, +160.156f,3.44698f,-183.594f, +164.063f,2.33212f,-183.594f, +167.969f,0.462143f,-183.594f, +171.875f,-2.31458f,-183.594f, +175.781f,-4.89712f,-183.594f, +179.688f,-6.66797f,-183.594f, +183.594f,-9.25909f,-183.594f, +187.5f,-9.93472f,-183.594f, +191.406f,-12.0357f,-183.594f, +195.313f,-13.4286f,-183.594f, +199.219f,-14.4671f,-183.594f, +203.125f,-15.0102f,-183.594f, +207.031f,-14.8104f,-183.594f, +210.938f,-13.4733f,-183.594f, +214.844f,-14.0715f,-183.594f, +218.75f,-14.2416f,-183.594f, +222.656f,-12.2774f,-183.594f, +226.563f,-11.1048f,-183.594f, +230.469f,-8.72548f,-183.594f, +234.375f,-5.50563f,-183.594f, +238.281f,-2.81853f,-183.594f, +242.188f,-0.555239f,-183.594f, +246.094f,1.07177f,-183.594f, +250.0f,3.1022f,-183.594f, +3.90625f,27.6405f,-187.5f, +7.8125f,27.1266f,-187.5f, +11.7188f,26.0941f,-187.5f, +15.625f,25.1443f,-187.5f, +19.5313f,24.6236f,-187.5f, +23.4375f,23.7274f,-187.5f, +27.3438f,22.5792f,-187.5f, +31.25f,19.7482f,-187.5f, +35.1563f,17.6829f,-187.5f, +39.0625f,16.5577f,-187.5f, +42.9688f,15.8636f,-187.5f, +46.875f,16.0968f,-187.5f, +50.7813f,15.5614f,-187.5f, +54.6875f,15.4655f,-187.5f, +58.5938f,16.304f,-187.5f, +62.5f,16.7706f,-187.5f, +66.4063f,16.3947f,-187.5f, +70.3125f,16.6761f,-187.5f, +74.2188f,16.7627f,-187.5f, +78.125f,17.2579f,-187.5f, +82.0313f,16.7208f,-187.5f, +85.9375f,16.5278f,-187.5f, +89.8438f,16.2251f,-187.5f, +93.75f,15.0741f,-187.5f, +97.6563f,14.2628f,-187.5f, +101.563f,12.432f,-187.5f, +105.469f,10.8877f,-187.5f, +109.375f,11.903f,-187.5f, +113.281f,12.5606f,-187.5f, +117.188f,13.2652f,-187.5f, +121.094f,13.6914f,-187.5f, +125.0f,12.7849f,-187.5f, +128.906f,10.4802f,-187.5f, +132.813f,8.75276f,-187.5f, +136.719f,6.90392f,-187.5f, +140.625f,6.91636f,-187.5f, +144.531f,6.78271f,-187.5f, +148.438f,5.25436f,-187.5f, +152.344f,4.14458f,-187.5f, +156.25f,3.58445f,-187.5f, +160.156f,3.67538f,-187.5f, +164.063f,1.88171f,-187.5f, +167.969f,1.16358f,-187.5f, +171.875f,-0.909335f,-187.5f, +175.781f,-4.00056f,-187.5f, +179.688f,-6.532f,-187.5f, +183.594f,-8.29174f,-187.5f, +187.5f,-9.0196f,-187.5f, +191.406f,-10.1189f,-187.5f, +195.313f,-11.1349f,-187.5f, +199.219f,-12.4853f,-187.5f, +203.125f,-12.7324f,-187.5f, +207.031f,-12.949f,-187.5f, +210.938f,-11.8708f,-187.5f, +214.844f,-12.2515f,-187.5f, +218.75f,-12.8455f,-187.5f, +222.656f,-10.7923f,-187.5f, +226.563f,-8.82819f,-187.5f, +230.469f,-7.36721f,-187.5f, +234.375f,-5.23714f,-187.5f, +238.281f,-2.63334f,-187.5f, +242.188f,0.485313f,-187.5f, +246.094f,2.78278f,-187.5f, +250.0f,3.96313f,-187.5f, +3.90625f,25.3652f,-191.406f, +7.8125f,24.7195f,-191.406f, +11.7188f,25.004f,-191.406f, +15.625f,24.1773f,-191.406f, +19.5313f,22.7395f,-191.406f, +23.4375f,21.4739f,-191.406f, +27.3438f,21.0405f,-191.406f, +31.25f,18.3321f,-191.406f, +35.1563f,16.9491f,-191.406f, +39.0625f,15.1898f,-191.406f, +42.9688f,14.5842f,-191.406f, +46.875f,14.234f,-191.406f, +50.7813f,14.0689f,-191.406f, +54.6875f,15.4103f,-191.406f, +58.5938f,15.0749f,-191.406f, +62.5f,14.6893f,-191.406f, +66.4063f,14.8987f,-191.406f, +70.3125f,14.4416f,-191.406f, +74.2188f,14.3436f,-191.406f, +78.125f,13.5844f,-191.406f, +82.0313f,13.3989f,-191.406f, +85.9375f,14.3892f,-191.406f, +89.8438f,13.3595f,-191.406f, +93.75f,13.3004f,-191.406f, +97.6563f,11.8557f,-191.406f, +101.563f,9.50387f,-191.406f, +105.469f,9.09049f,-191.406f, +109.375f,10.2607f,-191.406f, +113.281f,11.3275f,-191.406f, +117.188f,11.8898f,-191.406f, +121.094f,11.9585f,-191.406f, +125.0f,11.0034f,-191.406f, +128.906f,10.0704f,-191.406f, +132.813f,8.84472f,-191.406f, +136.719f,7.56972f,-191.406f, +140.625f,6.66467f,-191.406f, +144.531f,5.57509f,-191.406f, +148.438f,4.43943f,-191.406f, +152.344f,3.51469f,-191.406f, +156.25f,2.91572f,-191.406f, +160.156f,3.43161f,-191.406f, +164.063f,1.97664f,-191.406f, +167.969f,1.37279f,-191.406f, +171.875f,-0.545961f,-191.406f, +175.781f,-3.78517f,-191.406f, +179.688f,-6.09483f,-191.406f, +183.594f,-6.45627f,-191.406f, +187.5f,-7.27376f,-191.406f, +191.406f,-8.99215f,-191.406f, +195.313f,-9.89915f,-191.406f, +199.219f,-10.9608f,-191.406f, +203.125f,-10.8387f,-191.406f, +207.031f,-10.5261f,-191.406f, +210.938f,-10.1365f,-191.406f, +214.844f,-10.631f,-191.406f, +218.75f,-10.8413f,-191.406f, +222.656f,-9.03823f,-191.406f, +226.563f,-7.39571f,-191.406f, +230.469f,-4.8409f,-191.406f, +234.375f,-3.47756f,-191.406f, +238.281f,-1.63291f,-191.406f, +242.188f,1.44814f,-191.406f, +246.094f,2.93141f,-191.406f, +250.0f,4.03991f,-191.406f, +3.90625f,23.0993f,-195.313f, +7.8125f,23.2309f,-195.313f, +11.7188f,23.4293f,-195.313f, +15.625f,22.4425f,-195.313f, +19.5313f,21.4905f,-195.313f, +23.4375f,19.6567f,-195.313f, +27.3438f,18.1324f,-195.313f, +31.25f,17.3872f,-195.313f, +35.1563f,16.265f,-195.313f, +39.0625f,13.8338f,-195.313f, +42.9688f,12.7629f,-195.313f, +46.875f,13.1006f,-195.313f, +50.7813f,13.3481f,-195.313f, +54.6875f,13.8039f,-195.313f, +58.5938f,13.0621f,-195.313f, +62.5f,12.4363f,-195.313f, +66.4063f,12.748f,-195.313f, +70.3125f,12.2979f,-195.313f, +74.2188f,11.3997f,-195.313f, +78.125f,12.1637f,-195.313f, +82.0313f,12.2143f,-195.313f, +85.9375f,12.0963f,-195.313f, +89.8438f,11.3468f,-195.313f, +93.75f,11.1939f,-195.313f, +97.6563f,9.31577f,-195.313f, +101.563f,9.0203f,-195.313f, +105.469f,8.39154f,-195.313f, +109.375f,8.72501f,-195.313f, +113.281f,9.3763f,-195.313f, +117.188f,9.56963f,-195.313f, +121.094f,9.54203f,-195.313f, +125.0f,9.30859f,-195.313f, +128.906f,9.02325f,-195.313f, +132.813f,8.54457f,-195.313f, +136.719f,7.91487f,-195.313f, +140.625f,5.8935f,-195.313f, +144.531f,4.77605f,-195.313f, +148.438f,3.03324f,-195.313f, +152.344f,2.63999f,-195.313f, +156.25f,1.85254f,-195.313f, +160.156f,2.58504f,-195.313f, +164.063f,1.86646f,-195.313f, +167.969f,0.472293f,-195.313f, +171.875f,-0.819486f,-195.313f, +175.781f,-3.28005f,-195.313f, +179.688f,-4.07223f,-195.313f, +183.594f,-5.23099f,-195.313f, +187.5f,-5.93446f,-195.313f, +191.406f,-7.40083f,-195.313f, +195.313f,-9.52595f,-195.313f, +199.219f,-9.06593f,-195.313f, +203.125f,-8.64632f,-195.313f, +207.031f,-8.71126f,-195.313f, +210.938f,-7.66946f,-195.313f, +214.844f,-8.22025f,-195.313f, +218.75f,-8.77434f,-195.313f, +222.656f,-7.8003f,-195.313f, +226.563f,-5.29317f,-195.313f, +230.469f,-3.13421f,-195.313f, +234.375f,-1.47978f,-195.313f, +238.281f,0.0436352f,-195.313f, +242.188f,1.56763f,-195.313f, +246.094f,3.2707f,-195.313f, +250.0f,5.38332f,-195.313f, +3.90625f,21.5827f,-199.219f, +7.8125f,21.5884f,-199.219f, +11.7188f,22.0551f,-199.219f, +15.625f,21.1895f,-199.219f, +19.5313f,19.9629f,-199.219f, +23.4375f,18.1891f,-199.219f, +27.3438f,17.3914f,-199.219f, +31.25f,15.7832f,-199.219f, +35.1563f,13.9537f,-199.219f, +39.0625f,11.7784f,-199.219f, +42.9688f,12.6473f,-199.219f, +46.875f,12.1685f,-199.219f, +50.7813f,12.2586f,-199.219f, +54.6875f,12.032f,-199.219f, +58.5938f,12.5025f,-199.219f, +62.5f,12.2207f,-199.219f, +66.4063f,10.4332f,-199.219f, +70.3125f,10.2093f,-199.219f, +74.2188f,9.56536f,-199.219f, +78.125f,10.5041f,-199.219f, +82.0313f,10.9136f,-199.219f, +85.9375f,10.6303f,-199.219f, +89.8438f,11.148f,-199.219f, +93.75f,10.2169f,-199.219f, +97.6563f,8.56966f,-199.219f, +101.563f,8.81808f,-199.219f, +105.469f,7.92638f,-199.219f, +109.375f,7.988f,-199.219f, +113.281f,8.07342f,-199.219f, +117.188f,8.41463f,-199.219f, +121.094f,8.44317f,-199.219f, +125.0f,8.93315f,-199.219f, +128.906f,8.02242f,-199.219f, +132.813f,7.78977f,-199.219f, +136.719f,7.24422f,-199.219f, +140.625f,6.65469f,-199.219f, +144.531f,5.63698f,-199.219f, +148.438f,3.71906f,-199.219f, +152.344f,1.94989f,-199.219f, +156.25f,1.5781f,-199.219f, +160.156f,2.54367f,-199.219f, +164.063f,2.24455f,-199.219f, +167.969f,0.172967f,-199.219f, +171.875f,-1.24076f,-199.219f, +175.781f,-2.09517f,-199.219f, +179.688f,-2.60068f,-199.219f, +183.594f,-3.35838f,-199.219f, +187.5f,-5.02796f,-199.219f, +191.406f,-6.75939f,-199.219f, +195.313f,-7.86176f,-199.219f, +199.219f,-7.60703f,-199.219f, +203.125f,-7.1176f,-199.219f, +207.031f,-7.21926f,-199.219f, +210.938f,-6.354f,-199.219f, +214.844f,-6.26146f,-199.219f, +218.75f,-7.39202f,-199.219f, +222.656f,-6.10132f,-199.219f, +226.563f,-4.15677f,-199.219f, +230.469f,-1.72339f,-199.219f, +234.375f,0.220408f,-199.219f, +238.281f,1.71501f,-199.219f, +242.188f,2.32136f,-199.219f, +246.094f,3.9302f,-199.219f, +250.0f,6.99831f,-199.219f, +3.90625f,20.3179f,-203.125f, +7.8125f,19.0038f,-203.125f, +11.7188f,19.8795f,-203.125f, +15.625f,18.863f,-203.125f, +19.5313f,17.2513f,-203.125f, +23.4375f,16.7786f,-203.125f, +27.3438f,16.4605f,-203.125f, +31.25f,14.0944f,-203.125f, +35.1563f,12.6715f,-203.125f, +39.0625f,12.2869f,-203.125f, +42.9688f,12.0256f,-203.125f, +46.875f,11.4308f,-203.125f, +50.7813f,11.5543f,-203.125f, +54.6875f,10.8247f,-203.125f, +58.5938f,12.5385f,-203.125f, +62.5f,12.1754f,-203.125f, +66.4063f,10.0857f,-203.125f, +70.3125f,8.73654f,-203.125f, +74.2188f,8.35323f,-203.125f, +78.125f,8.75049f,-203.125f, +82.0313f,9.69714f,-203.125f, +85.9375f,9.93848f,-203.125f, +89.8438f,9.99533f,-203.125f, +93.75f,9.28937f,-203.125f, +97.6563f,8.19048f,-203.125f, +101.563f,7.82659f,-203.125f, +105.469f,6.70152f,-203.125f, +109.375f,6.35245f,-203.125f, +113.281f,6.80811f,-203.125f, +117.188f,7.88474f,-203.125f, +121.094f,8.76964f,-203.125f, +125.0f,9.33913f,-203.125f, +128.906f,9.12843f,-203.125f, +132.813f,7.62144f,-203.125f, +136.719f,6.32841f,-203.125f, +140.625f,6.30299f,-203.125f, +144.531f,5.78467f,-203.125f, +148.438f,4.2404f,-203.125f, +152.344f,2.7611f,-203.125f, +156.25f,1.95904f,-203.125f, +160.156f,2.27166f,-203.125f, +164.063f,2.22405f,-203.125f, +167.969f,1.12279f,-203.125f, +171.875f,-0.169061f,-203.125f, +175.781f,-0.887647f,-203.125f, +179.688f,-0.896535f,-203.125f, +183.594f,-2.41604f,-203.125f, +187.5f,-3.63423f,-203.125f, +191.406f,-6.00826f,-203.125f, +195.313f,-5.87316f,-203.125f, +199.219f,-5.18767f,-203.125f, +203.125f,-4.23762f,-203.125f, +207.031f,-4.7338f,-203.125f, +210.938f,-4.88225f,-203.125f, +214.844f,-4.82274f,-203.125f, +218.75f,-5.06338f,-203.125f, +222.656f,-5.13737f,-203.125f, +226.563f,-2.74217f,-203.125f, +230.469f,0.0831564f,-203.125f, +234.375f,2.00986f,-203.125f, +238.281f,2.89937f,-203.125f, +242.188f,3.79442f,-203.125f, +246.094f,5.43821f,-203.125f, +250.0f,8.47222f,-203.125f, +3.90625f,18.3149f,-207.031f, +7.8125f,16.9318f,-207.031f, +11.7188f,16.7123f,-207.031f, +15.625f,16.066f,-207.031f, +19.5313f,15.8401f,-207.031f, +23.4375f,14.9793f,-207.031f, +27.3438f,13.5136f,-207.031f, +31.25f,12.316f,-207.031f, +35.1563f,12.4286f,-207.031f, +39.0625f,12.5926f,-207.031f, +42.9688f,12.419f,-207.031f, +46.875f,11.7087f,-207.031f, +50.7813f,10.9033f,-207.031f, +54.6875f,10.2175f,-207.031f, +58.5938f,10.7307f,-207.031f, +62.5f,9.9283f,-207.031f, +66.4063f,9.11458f,-207.031f, +70.3125f,6.81804f,-207.031f, +74.2188f,6.85559f,-207.031f, +78.125f,6.98146f,-207.031f, +82.0313f,8.41059f,-207.031f, +85.9375f,8.81018f,-207.031f, +89.8438f,9.25882f,-207.031f, +93.75f,8.4973f,-207.031f, +97.6563f,7.11312f,-207.031f, +101.563f,6.11367f,-207.031f, +105.469f,4.54171f,-207.031f, +109.375f,3.984f,-207.031f, +113.281f,6.23536f,-207.031f, +117.188f,7.41972f,-207.031f, +121.094f,8.40005f,-207.031f, +125.0f,9.21009f,-207.031f, +128.906f,9.10113f,-207.031f, +132.813f,8.69785f,-207.031f, +136.719f,7.08314f,-207.031f, +140.625f,6.14113f,-207.031f, +144.531f,4.85123f,-207.031f, +148.438f,4.53013f,-207.031f, +152.344f,4.73052f,-207.031f, +156.25f,3.50435f,-207.031f, +160.156f,3.02093f,-207.031f, +164.063f,2.65317f,-207.031f, +167.969f,1.91936f,-207.031f, +171.875f,1.31638f,-207.031f, +175.781f,0.631767f,-207.031f, +179.688f,-0.185018f,-207.031f, +183.594f,-1.04617f,-207.031f, +187.5f,-2.59594f,-207.031f, +191.406f,-3.62219f,-207.031f, +195.313f,-3.17366f,-207.031f, +199.219f,-3.0812f,-207.031f, +203.125f,-2.21365f,-207.031f, +207.031f,-3.02851f,-207.031f, +210.938f,-4.12823f,-207.031f, +214.844f,-3.42208f,-207.031f, +218.75f,-3.83284f,-207.031f, +222.656f,-3.83483f,-207.031f, +226.563f,-1.81388f,-207.031f, +230.469f,1.06182f,-207.031f, +234.375f,3.0063f,-207.031f, +238.281f,3.97581f,-207.031f, +242.188f,5.25584f,-207.031f, +246.094f,6.1092f,-207.031f, +250.0f,9.89458f,-207.031f, +3.90625f,16.2147f,-210.938f, +7.8125f,15.8155f,-210.938f, +11.7188f,14.9704f,-210.938f, +15.625f,14.6853f,-210.938f, +19.5313f,14.3326f,-210.938f, +23.4375f,14.0488f,-210.938f, +27.3438f,12.2057f,-210.938f, +31.25f,12.7526f,-210.938f, +35.1563f,13.1468f,-210.938f, +39.0625f,12.959f,-210.938f, +42.9688f,12.3931f,-210.938f, +46.875f,11.9578f,-210.938f, +50.7813f,10.5381f,-210.938f, +54.6875f,9.28222f,-210.938f, +58.5938f,9.20117f,-210.938f, +62.5f,8.74359f,-210.938f, +66.4063f,7.58308f,-210.938f, +70.3125f,5.98903f,-210.938f, +74.2188f,5.92315f,-210.938f, +78.125f,6.30208f,-210.938f, +82.0313f,7.35787f,-210.938f, +85.9375f,7.64729f,-210.938f, +89.8438f,7.89394f,-210.938f, +93.75f,7.64523f,-210.938f, +97.6563f,5.66526f,-210.938f, +101.563f,4.1348f,-210.938f, +105.469f,2.65548f,-210.938f, +109.375f,4.20615f,-210.938f, +113.281f,5.82801f,-210.938f, +117.188f,6.92681f,-210.938f, +121.094f,8.52107f,-210.938f, +125.0f,9.29929f,-210.938f, +128.906f,10.1454f,-210.938f, +132.813f,9.39782f,-210.938f, +136.719f,8.72704f,-210.938f, +140.625f,7.91058f,-210.938f, +144.531f,5.32835f,-210.938f, +148.438f,5.30143f,-210.938f, +152.344f,4.98294f,-210.938f, +156.25f,5.27331f,-210.938f, +160.156f,4.054f,-210.938f, +164.063f,4.25352f,-210.938f, +167.969f,3.60791f,-210.938f, +171.875f,2.94898f,-210.938f, +175.781f,1.97064f,-210.938f, +179.688f,1.21275f,-210.938f, +183.594f,-0.419751f,-210.938f, +187.5f,-1.77221f,-210.938f, +191.406f,-1.94763f,-210.938f, +195.313f,-1.32172f,-210.938f, +199.219f,-1.74453f,-210.938f, +203.125f,-0.694964f,-210.938f, +207.031f,-1.77277f,-210.938f, +210.938f,-2.39571f,-210.938f, +214.844f,-2.61021f,-210.938f, +218.75f,-3.16f,-210.938f, +222.656f,-2.46606f,-210.938f, +226.563f,-0.862086f,-210.938f, +230.469f,1.4487f,-210.938f, +234.375f,3.44239f,-210.938f, +238.281f,5.41949f,-210.938f, +242.188f,6.28416f,-210.938f, +246.094f,7.24993f,-210.938f, +250.0f,10.7227f,-210.938f, +3.90625f,14.284f,-214.844f, +7.8125f,14.031f,-214.844f, +11.7188f,12.8153f,-214.844f, +15.625f,12.2914f,-214.844f, +19.5313f,12.0657f,-214.844f, +23.4375f,12.4452f,-214.844f, +27.3438f,12.703f,-214.844f, +31.25f,12.3401f,-214.844f, +35.1563f,13.2219f,-214.844f, +39.0625f,12.9074f,-214.844f, +42.9688f,12.5934f,-214.844f, +46.875f,11.4717f,-214.844f, +50.7813f,10.548f,-214.844f, +54.6875f,9.43614f,-214.844f, +58.5938f,10.0982f,-214.844f, +62.5f,9.36536f,-214.844f, +66.4063f,8.07196f,-214.844f, +70.3125f,6.4483f,-214.844f, +74.2188f,5.80499f,-214.844f, +78.125f,5.60605f,-214.844f, +82.0313f,6.64906f,-214.844f, +85.9375f,7.64402f,-214.844f, +89.8438f,8.31151f,-214.844f, +93.75f,7.97344f,-214.844f, +97.6563f,5.39549f,-214.844f, +101.563f,3.66809f,-214.844f, +105.469f,3.2001f,-214.844f, +109.375f,5.91373f,-214.844f, +113.281f,7.40339f,-214.844f, +117.188f,8.30807f,-214.844f, +121.094f,9.75774f,-214.844f, +125.0f,10.2383f,-214.844f, +128.906f,10.3408f,-214.844f, +132.813f,10.6262f,-214.844f, +136.719f,10.8818f,-214.844f, +140.625f,9.09087f,-214.844f, +144.531f,6.48291f,-214.844f, +148.438f,5.02116f,-214.844f, +152.344f,5.97543f,-214.844f, +156.25f,6.33053f,-214.844f, +160.156f,5.91049f,-214.844f, +164.063f,5.03025f,-214.844f, +167.969f,5.01201f,-214.844f, +171.875f,4.36222f,-214.844f, +175.781f,3.69208f,-214.844f, +179.688f,2.96539f,-214.844f, +183.594f,1.43789f,-214.844f, +187.5f,-0.374301f,-214.844f, +191.406f,-0.955695f,-214.844f, +195.313f,-0.123769f,-214.844f, +199.219f,-0.113436f,-214.844f, +203.125f,-0.0171993f,-214.844f, +207.031f,-1.0984f,-214.844f, +210.938f,-1.10949f,-214.844f, +214.844f,-1.92471f,-214.844f, +218.75f,-2.26183f,-214.844f, +222.656f,-1.32064f,-214.844f, +226.563f,0.209158f,-214.844f, +230.469f,2.41199f,-214.844f, +234.375f,4.66871f,-214.844f, +238.281f,6.29773f,-214.844f, +242.188f,7.20184f,-214.844f, +246.094f,8.08018f,-214.844f, +250.0f,10.3057f,-214.844f, +3.90625f,13.272f,-218.75f, +7.8125f,12.8218f,-218.75f, +11.7188f,11.8102f,-218.75f, +15.625f,11.7105f,-218.75f, +19.5313f,11.5191f,-218.75f, +23.4375f,12.1253f,-218.75f, +27.3438f,12.0266f,-218.75f, +31.25f,12.3549f,-218.75f, +35.1563f,12.3822f,-218.75f, +39.0625f,12.268f,-218.75f, +42.9688f,12.5022f,-218.75f, +46.875f,11.2878f,-218.75f, +50.7813f,10.1823f,-218.75f, +54.6875f,10.4244f,-218.75f, +58.5938f,10.0047f,-218.75f, +62.5f,9.96061f,-218.75f, +66.4063f,8.64873f,-218.75f, +70.3125f,6.45636f,-218.75f, +74.2188f,5.30254f,-218.75f, +78.125f,5.2915f,-218.75f, +82.0313f,7.2575f,-218.75f, +85.9375f,8.1568f,-218.75f, +89.8438f,8.97514f,-218.75f, +93.75f,7.72908f,-218.75f, +97.6563f,5.41501f,-218.75f, +101.563f,4.24025f,-218.75f, +105.469f,5.39134f,-218.75f, +109.375f,7.69518f,-218.75f, +113.281f,8.87616f,-218.75f, +117.188f,9.44758f,-218.75f, +121.094f,9.21473f,-218.75f, +125.0f,10.1366f,-218.75f, +128.906f,11.6088f,-218.75f, +132.813f,12.0083f,-218.75f, +136.719f,12.3184f,-218.75f, +140.625f,10.8438f,-218.75f, +144.531f,7.65837f,-218.75f, +148.438f,6.07316f,-218.75f, +152.344f,6.4613f,-218.75f, +156.25f,7.01972f,-218.75f, +160.156f,7.25454f,-218.75f, +164.063f,6.31416f,-218.75f, +167.969f,6.48096f,-218.75f, +171.875f,5.89274f,-218.75f, +175.781f,5.71289f,-218.75f, +179.688f,4.3046f,-218.75f, +183.594f,2.49719f,-218.75f, +187.5f,1.16956f,-218.75f, +191.406f,1.21673f,-218.75f, +195.313f,1.19652f,-218.75f, +199.219f,1.27819f,-218.75f, +203.125f,1.06325f,-218.75f, +207.031f,0.133118f,-218.75f, +210.938f,-0.283675f,-218.75f, +214.844f,-0.471323f,-218.75f, +218.75f,-0.941533f,-218.75f, +222.656f,-0.953851f,-218.75f, +226.563f,0.751216f,-218.75f, +230.469f,2.54245f,-218.75f, +234.375f,5.17863f,-218.75f, +238.281f,7.22669f,-218.75f, +242.188f,8.44723f,-218.75f, +246.094f,8.59229f,-218.75f, +250.0f,10.4333f,-218.75f, +3.90625f,13.0199f,-222.656f, +7.8125f,13.1789f,-222.656f, +11.7188f,12.4614f,-222.656f, +15.625f,10.8521f,-222.656f, +19.5313f,11.2552f,-222.656f, +23.4375f,12.1618f,-222.656f, +27.3438f,12.6207f,-222.656f, +31.25f,12.7195f,-222.656f, +35.1563f,12.6379f,-222.656f, +39.0625f,12.5247f,-222.656f, +42.9688f,11.5493f,-222.656f, +46.875f,11.1218f,-222.656f, +50.7813f,11.1036f,-222.656f, +54.6875f,11.2909f,-222.656f, +58.5938f,9.99718f,-222.656f, +62.5f,9.07075f,-222.656f, +66.4063f,7.85904f,-222.656f, +70.3125f,6.00034f,-222.656f, +74.2188f,6.20222f,-222.656f, +78.125f,6.90091f,-222.656f, +82.0313f,8.15724f,-222.656f, +85.9375f,8.92624f,-222.656f, +89.8438f,9.54135f,-222.656f, +93.75f,8.05473f,-222.656f, +97.6563f,5.80654f,-222.656f, +101.563f,5.02178f,-222.656f, +105.469f,7.15584f,-222.656f, +109.375f,8.94755f,-222.656f, +113.281f,9.86631f,-222.656f, +117.188f,10.6421f,-222.656f, +121.094f,10.7891f,-222.656f, +125.0f,11.0716f,-222.656f, +128.906f,12.6376f,-222.656f, +132.813f,12.4373f,-222.656f, +136.719f,12.1143f,-222.656f, +140.625f,11.4028f,-222.656f, +144.531f,8.95242f,-222.656f, +148.438f,6.83012f,-222.656f, +152.344f,7.65217f,-222.656f, +156.25f,8.26579f,-222.656f, +160.156f,7.9665f,-222.656f, +164.063f,7.5217f,-222.656f, +167.969f,7.17758f,-222.656f, +171.875f,5.9966f,-222.656f, +175.781f,5.77514f,-222.656f, +179.688f,4.77675f,-222.656f, +183.594f,3.39545f,-222.656f, +187.5f,2.95911f,-222.656f, +191.406f,1.85368f,-222.656f, +195.313f,1.31365f,-222.656f, +199.219f,1.12622f,-222.656f, +203.125f,1.47676f,-222.656f, +207.031f,1.89446f,-222.656f, +210.938f,0.63056f,-222.656f, +214.844f,0.297565f,-222.656f, +218.75f,-0.0109998f,-222.656f, +222.656f,-0.225082f,-222.656f, +226.563f,0.63258f,-222.656f, +230.469f,2.89831f,-222.656f, +234.375f,5.64839f,-222.656f, +238.281f,7.22414f,-222.656f, +242.188f,7.89951f,-222.656f, +246.094f,8.80151f,-222.656f, +250.0f,10.9602f,-222.656f, +3.90625f,11.9733f,-226.563f, +7.8125f,12.8862f,-226.563f, +11.7188f,12.1283f,-226.563f, +15.625f,10.7234f,-226.563f, +19.5313f,11.6866f,-226.563f, +23.4375f,12.6552f,-226.563f, +27.3438f,12.7353f,-226.563f, +31.25f,11.7992f,-226.563f, +35.1563f,11.2006f,-226.563f, +39.0625f,10.9699f,-226.563f, +42.9688f,10.7653f,-226.563f, +46.875f,10.9947f,-226.563f, +50.7813f,11.2791f,-226.563f, +54.6875f,11.0716f,-226.563f, +58.5938f,10.7092f,-226.563f, +62.5f,9.16355f,-226.563f, +66.4063f,7.59431f,-226.563f, +70.3125f,6.68502f,-226.563f, +74.2188f,6.98133f,-226.563f, +78.125f,7.72239f,-226.563f, +82.0313f,9.00293f,-226.563f, +85.9375f,9.47866f,-226.563f, +89.8438f,8.94458f,-226.563f, +93.75f,7.79648f,-226.563f, +97.6563f,6.07787f,-226.563f, +101.563f,6.60546f,-226.563f, +105.469f,8.5652f,-226.563f, +109.375f,10.2869f,-226.563f, +113.281f,11.4751f,-226.563f, +117.188f,11.6224f,-226.563f, +121.094f,12.0803f,-226.563f, +125.0f,12.5335f,-226.563f, +128.906f,13.5918f,-226.563f, +132.813f,12.9198f,-226.563f, +136.719f,11.521f,-226.563f, +140.625f,10.6418f,-226.563f, +144.531f,8.8393f,-226.563f, +148.438f,8.79941f,-226.563f, +152.344f,9.4929f,-226.563f, +156.25f,9.96206f,-226.563f, +160.156f,8.75524f,-226.563f, +164.063f,7.64157f,-226.563f, +167.969f,7.1963f,-226.563f, +171.875f,6.83929f,-226.563f, +175.781f,6.10665f,-226.563f, +179.688f,4.70473f,-226.563f, +183.594f,4.54758f,-226.563f, +187.5f,3.58616f,-226.563f, +191.406f,2.97998f,-226.563f, +195.313f,1.49179f,-226.563f, +199.219f,1.85834f,-226.563f, +203.125f,1.49089f,-226.563f, +207.031f,1.39949f,-226.563f, +210.938f,0.863002f,-226.563f, +214.844f,1.15546f,-226.563f, +218.75f,0.609373f,-226.563f, +222.656f,1.04332f,-226.563f, +226.563f,1.58038f,-226.563f, +230.469f,4.11549f,-226.563f, +234.375f,5.64696f,-226.563f, +238.281f,6.61687f,-226.563f, +242.188f,7.3113f,-226.563f, +246.094f,8.56955f,-226.563f, +250.0f,10.7891f,-226.563f, +3.90625f,10.4619f,-230.469f, +7.8125f,11.4179f,-230.469f, +11.7188f,10.7841f,-230.469f, +15.625f,10.597f,-230.469f, +19.5313f,10.9999f,-230.469f, +23.4375f,11.5972f,-230.469f, +27.3438f,11.4553f,-230.469f, +31.25f,10.1015f,-230.469f, +35.1563f,10.412f,-230.469f, +39.0625f,9.72694f,-230.469f, +42.9688f,9.71973f,-230.469f, +46.875f,10.7767f,-230.469f, +50.7813f,10.8775f,-230.469f, +54.6875f,10.3186f,-230.469f, +58.5938f,10.4188f,-230.469f, +62.5f,8.94879f,-230.469f, +66.4063f,7.92103f,-230.469f, +70.3125f,8.48295f,-230.469f, +74.2188f,8.74782f,-230.469f, +78.125f,8.87976f,-230.469f, +82.0313f,9.68632f,-230.469f, +85.9375f,9.54993f,-230.469f, +89.8438f,9.04624f,-230.469f, +93.75f,8.49407f,-230.469f, +97.6563f,7.90008f,-230.469f, +101.563f,9.20657f,-230.469f, +105.469f,10.5114f,-230.469f, +109.375f,11.5284f,-230.469f, +113.281f,12.0378f,-230.469f, +117.188f,12.9398f,-230.469f, +121.094f,13.1489f,-230.469f, +125.0f,13.8974f,-230.469f, +128.906f,14.5048f,-230.469f, +132.813f,13.1823f,-230.469f, +136.719f,11.6226f,-230.469f, +140.625f,11.1108f,-230.469f, +144.531f,10.0418f,-230.469f, +148.438f,10.2026f,-230.469f, +152.344f,10.9585f,-230.469f, +156.25f,11.0258f,-230.469f, +160.156f,9.88552f,-230.469f, +164.063f,8.92538f,-230.469f, +167.969f,7.90306f,-230.469f, +171.875f,7.23733f,-230.469f, +175.781f,6.09503f,-230.469f, +179.688f,5.15065f,-230.469f, +183.594f,4.73006f,-230.469f, +187.5f,4.05091f,-230.469f, +191.406f,3.01834f,-230.469f, +195.313f,1.83317f,-230.469f, +199.219f,2.77945f,-230.469f, +203.125f,3.05633f,-230.469f, +207.031f,2.07007f,-230.469f, +210.938f,2.01993f,-230.469f, +214.844f,2.13491f,-230.469f, +218.75f,1.65812f,-230.469f, +222.656f,1.8404f,-230.469f, +226.563f,2.78297f,-230.469f, +230.469f,3.94561f,-230.469f, +234.375f,5.83019f,-230.469f, +238.281f,6.9093f,-230.469f, +242.188f,7.96229f,-230.469f, +246.094f,7.63052f,-230.469f, +250.0f,10.2449f,-230.469f, +3.90625f,8.85224f,-234.375f, +7.8125f,9.40139f,-234.375f, +11.7188f,9.62814f,-234.375f, +15.625f,9.97075f,-234.375f, +19.5313f,9.96073f,-234.375f, +23.4375f,9.70541f,-234.375f, +27.3438f,10.0435f,-234.375f, +31.25f,9.85879f,-234.375f, +35.1563f,9.52681f,-234.375f, +39.0625f,8.75341f,-234.375f, +42.9688f,8.99686f,-234.375f, +46.875f,9.56309f,-234.375f, +50.7813f,9.54486f,-234.375f, +54.6875f,10.0225f,-234.375f, +58.5938f,9.56394f,-234.375f, +62.5f,9.18474f,-234.375f, +66.4063f,9.29208f,-234.375f, +70.3125f,10.4881f,-234.375f, +74.2188f,10.8865f,-234.375f, +78.125f,11.0201f,-234.375f, +82.0313f,11.7722f,-234.375f, +85.9375f,11.1624f,-234.375f, +89.8438f,10.602f,-234.375f, +93.75f,9.93284f,-234.375f, +97.6563f,10.2532f,-234.375f, +101.563f,11.0848f,-234.375f, +105.469f,12.6576f,-234.375f, +109.375f,13.4783f,-234.375f, +113.281f,14.7992f,-234.375f, +117.188f,15.3803f,-234.375f, +121.094f,15.9985f,-234.375f, +125.0f,14.9035f,-234.375f, +128.906f,14.2715f,-234.375f, +132.813f,14.0098f,-234.375f, +136.719f,13.1141f,-234.375f, +140.625f,12.5809f,-234.375f, +144.531f,11.8546f,-234.375f, +148.438f,11.5219f,-234.375f, +152.344f,11.8842f,-234.375f, +156.25f,11.6581f,-234.375f, +160.156f,10.8307f,-234.375f, +164.063f,10.2712f,-234.375f, +167.969f,8.58443f,-234.375f, +171.875f,7.00592f,-234.375f, +175.781f,5.65553f,-234.375f, +179.688f,5.07429f,-234.375f, +183.594f,4.41004f,-234.375f, +187.5f,3.95516f,-234.375f, +191.406f,3.42243f,-234.375f, +195.313f,2.54334f,-234.375f, +199.219f,3.95931f,-234.375f, +203.125f,3.9139f,-234.375f, +207.031f,2.90644f,-234.375f, +210.938f,3.11525f,-234.375f, +214.844f,3.33135f,-234.375f, +218.75f,2.64229f,-234.375f, +222.656f,2.64397f,-234.375f, +226.563f,3.186f,-234.375f, +230.469f,4.46201f,-234.375f, +234.375f,5.92783f,-234.375f, +238.281f,6.79968f,-234.375f, +242.188f,8.7067f,-234.375f, +246.094f,8.47322f,-234.375f, +250.0f,10.3839f,-234.375f, +3.90625f,7.99527f,-238.281f, +7.8125f,8.62199f,-238.281f, +11.7188f,9.06695f,-238.281f, +15.625f,9.12589f,-238.281f, +19.5313f,8.97926f,-238.281f, +23.4375f,9.75152f,-238.281f, +27.3438f,9.58038f,-238.281f, +31.25f,9.30169f,-238.281f, +35.1563f,8.63599f,-238.281f, +39.0625f,8.72973f,-238.281f, +42.9688f,8.49513f,-238.281f, +46.875f,8.78362f,-238.281f, +50.7813f,8.75045f,-238.281f, +54.6875f,8.96186f,-238.281f, +58.5938f,10.0611f,-238.281f, +62.5f,11.1275f,-238.281f, +66.4063f,10.8209f,-238.281f, +70.3125f,12.0108f,-238.281f, +74.2188f,13.2126f,-238.281f, +78.125f,14.1323f,-238.281f, +82.0313f,14.3575f,-238.281f, +85.9375f,13.2781f,-238.281f, +89.8438f,12.8024f,-238.281f, +93.75f,12.0484f,-238.281f, +97.6563f,12.7657f,-238.281f, +101.563f,14.0307f,-238.281f, +105.469f,15.9567f,-238.281f, +109.375f,17.7803f,-238.281f, +113.281f,19.0777f,-238.281f, +117.188f,18.7555f,-238.281f, +121.094f,18.8129f,-238.281f, +125.0f,17.4807f,-238.281f, +128.906f,16.4022f,-238.281f, +132.813f,16.01f,-238.281f, +136.719f,15.1852f,-238.281f, +140.625f,13.9301f,-238.281f, +144.531f,12.8841f,-238.281f, +148.438f,11.7108f,-238.281f, +152.344f,11.414f,-238.281f, +156.25f,11.056f,-238.281f, +160.156f,10.8688f,-238.281f, +164.063f,10.5672f,-238.281f, +167.969f,10.0938f,-238.281f, +171.875f,7.73603f,-238.281f, +175.781f,5.94931f,-238.281f, +179.688f,5.51512f,-238.281f, +183.594f,5.27449f,-238.281f, +187.5f,4.94763f,-238.281f, +191.406f,4.13161f,-238.281f, +195.313f,3.59426f,-238.281f, +199.219f,4.03163f,-238.281f, +203.125f,4.38188f,-238.281f, +207.031f,3.09959f,-238.281f, +210.938f,3.1766f,-238.281f, +214.844f,3.05715f,-238.281f, +218.75f,3.20329f,-238.281f, +222.656f,2.53565f,-238.281f, +226.563f,3.1275f,-238.281f, +230.469f,4.54736f,-238.281f, +234.375f,5.9361f,-238.281f, +238.281f,6.99977f,-238.281f, +242.188f,8.20813f,-238.281f, +246.094f,9.56614f,-238.281f, +250.0f,11.4751f,-238.281f, +3.90625f,6.40337f,-242.188f, +7.8125f,7.88741f,-242.188f, +11.7188f,8.60661f,-242.188f, +15.625f,8.56923f,-242.188f, +19.5313f,8.60588f,-242.188f, +23.4375f,8.63232f,-242.188f, +27.3438f,8.3446f,-242.188f, +31.25f,7.50857f,-242.188f, +35.1563f,7.64026f,-242.188f, +39.0625f,7.75851f,-242.188f, +42.9688f,7.56672f,-242.188f, +46.875f,7.98994f,-242.188f, +50.7813f,9.62391f,-242.188f, +54.6875f,9.28711f,-242.188f, +58.5938f,10.3792f,-242.188f, +62.5f,11.2793f,-242.188f, +66.4063f,12.3048f,-242.188f, +70.3125f,13.5272f,-242.188f, +74.2188f,14.5101f,-242.188f, +78.125f,15.2091f,-242.188f, +82.0313f,15.9007f,-242.188f, +85.9375f,15.4601f,-242.188f, +89.8438f,14.5171f,-242.188f, +93.75f,14.2266f,-242.188f, +97.6563f,13.9558f,-242.188f, +101.563f,15.8234f,-242.188f, +105.469f,18.6741f,-242.188f, +109.375f,20.7296f,-242.188f, +113.281f,21.5353f,-242.188f, +117.188f,20.9821f,-242.188f, +121.094f,20.2232f,-242.188f, +125.0f,18.5423f,-242.188f, +128.906f,17.8591f,-242.188f, +132.813f,17.6716f,-242.188f, +136.719f,16.8982f,-242.188f, +140.625f,14.8574f,-242.188f, +144.531f,13.0736f,-242.188f, +148.438f,12.4847f,-242.188f, +152.344f,11.8101f,-242.188f, +156.25f,11.7863f,-242.188f, +160.156f,11.4288f,-242.188f, +164.063f,10.8653f,-242.188f, +167.969f,9.75951f,-242.188f, +171.875f,8.13212f,-242.188f, +175.781f,6.91851f,-242.188f, +179.688f,5.93418f,-242.188f, +183.594f,5.79732f,-242.188f, +187.5f,5.8082f,-242.188f, +191.406f,4.85116f,-242.188f, +195.313f,4.2744f,-242.188f, +199.219f,4.23009f,-242.188f, +203.125f,3.99841f,-242.188f, +207.031f,3.48205f,-242.188f, +210.938f,3.71102f,-242.188f, +214.844f,3.52803f,-242.188f, +218.75f,3.41263f,-242.188f, +222.656f,2.40768f,-242.188f, +226.563f,3.40111f,-242.188f, +230.469f,4.51594f,-242.188f, +234.375f,5.96131f,-242.188f, +238.281f,7.68646f,-242.188f, +242.188f,8.54536f,-242.188f, +246.094f,9.49379f,-242.188f, +250.0f,12.0532f,-242.188f, +3.90625f,6.09425f,-246.094f, +7.8125f,7.62532f,-246.094f, +11.7188f,8.33141f,-246.094f, +15.625f,8.6172f,-246.094f, +19.5313f,8.7607f,-246.094f, +23.4375f,7.89699f,-246.094f, +27.3438f,7.77868f,-246.094f, +31.25f,7.41037f,-246.094f, +35.1563f,6.57203f,-246.094f, +39.0625f,6.31554f,-246.094f, +42.9688f,7.72481f,-246.094f, +46.875f,8.88325f,-246.094f, +50.7813f,10.0433f,-246.094f, +54.6875f,10.7945f,-246.094f, +58.5938f,11.7506f,-246.094f, +62.5f,13.1397f,-246.094f, +66.4063f,13.1294f,-246.094f, +70.3125f,14.8885f,-246.094f, +74.2188f,15.5444f,-246.094f, +78.125f,16.4867f,-246.094f, +82.0313f,17.0601f,-246.094f, +85.9375f,17.2351f,-246.094f, +89.8438f,16.4292f,-246.094f, +93.75f,16.32f,-246.094f, +97.6563f,17.0323f,-246.094f, +101.563f,17.5524f,-246.094f, +105.469f,20.0544f,-246.094f, +109.375f,21.7596f,-246.094f, +113.281f,22.3401f,-246.094f, +117.188f,22.7891f,-246.094f, +121.094f,21.705f,-246.094f, +125.0f,20.4875f,-246.094f, +128.906f,19.3013f,-246.094f, +132.813f,18.5254f,-246.094f, +136.719f,17.4179f,-246.094f, +140.625f,14.7663f,-246.094f, +144.531f,13.8915f,-246.094f, +148.438f,12.0594f,-246.094f, +152.344f,11.8343f,-246.094f, +156.25f,12.3176f,-246.094f, +160.156f,12.7287f,-246.094f, +164.063f,10.9779f,-246.094f, +167.969f,10.1928f,-246.094f, +171.875f,8.20833f,-246.094f, +175.781f,7.71383f,-246.094f, +179.688f,7.59678f,-246.094f, +183.594f,6.98083f,-246.094f, +187.5f,6.81055f,-246.094f, +191.406f,6.13881f,-246.094f, +195.313f,4.42472f,-246.094f, +199.219f,3.97044f,-246.094f, +203.125f,4.06157f,-246.094f, +207.031f,3.73524f,-246.094f, +210.938f,4.45121f,-246.094f, +214.844f,3.42347f,-246.094f, +218.75f,2.70444f,-246.094f, +222.656f,3.88027f,-246.094f, +226.563f,4.53456f,-246.094f, +230.469f,5.69259f,-246.094f, +234.375f,6.23366f,-246.094f, +238.281f,7.38965f,-246.094f, +242.188f,8.96481f,-246.094f, +246.094f,10.9805f,-246.094f, +250.0f,13.0168f,-246.094f, +3.90625f,6.31953f,-250.0f, +7.8125f,6.89279f,-250.0f, +11.7188f,8.63362f,-250.0f, +15.625f,9.28278f,-250.0f, +19.5313f,9.05374f,-250.0f, +23.4375f,8.51295f,-250.0f, +27.3438f,8.2676f,-250.0f, +31.25f,7.86717f,-250.0f, +35.1563f,6.56073f,-250.0f, +39.0625f,6.77605f,-250.0f, +42.9688f,8.67577f,-250.0f, +46.875f,10.2384f,-250.0f, +50.7813f,11.5086f,-250.0f, +54.6875f,12.7259f,-250.0f, +58.5938f,14.4625f,-250.0f, +62.5f,15.7352f,-250.0f, +66.4063f,15.1953f,-250.0f, +70.3125f,16.1585f,-250.0f, +74.2188f,17.1058f,-250.0f, +78.125f,17.3014f,-250.0f, +82.0313f,18.6932f,-250.0f, +85.9375f,18.6138f,-250.0f, +89.8438f,18.0431f,-250.0f, +93.75f,18.293f,-250.0f, +97.6563f,18.5338f,-250.0f, +101.563f,18.8033f,-250.0f, +105.469f,22.2037f,-250.0f, +109.375f,24.04f,-250.0f, +113.281f,24.711f,-250.0f, +117.188f,24.2801f,-250.0f, +121.094f,23.1052f,-250.0f, +125.0f,21.9886f,-250.0f, +128.906f,21.2657f,-250.0f, +132.813f,19.5364f,-250.0f, +136.719f,18.5278f,-250.0f, +140.625f,15.9806f,-250.0f, +144.531f,14.8577f,-250.0f, +148.438f,13.3645f,-250.0f, +152.344f,12.8082f,-250.0f, +156.25f,13.3689f,-250.0f, +160.156f,12.7449f,-250.0f, +164.063f,11.1108f,-250.0f, +167.969f,9.59991f,-250.0f, +171.875f,8.88472f,-250.0f, +175.781f,8.39035f,-250.0f, +179.688f,7.9163f,-250.0f, +183.594f,7.4118f,-250.0f, +187.5f,6.98082f,-250.0f, +191.406f,7.20793f,-250.0f, +195.313f,6.19875f,-250.0f, +199.219f,4.05745f,-250.0f, +203.125f,4.65884f,-250.0f, +207.031f,3.75824f,-250.0f, +210.938f,4.17504f,-250.0f, +214.844f,4.37516f,-250.0f, +218.75f,4.69345f,-250.0f, +222.656f,5.87678f,-250.0f, +226.563f,6.28295f,-250.0f, +230.469f,7.2125f,-250.0f, +234.375f,7.55925f,-250.0f, +238.281f,7.93922f,-250.0f, +242.188f,9.87332f,-250.0f, +246.094f,11.5957f,-250.0f, +250.0f,13.3418f,-250.0f, +}; + +btScalar Landscape07Nml[] = { +0.163295f,0.951018f,0.262487f, +0.144468f,0.954269f,0.261724f, +0.284339f,0.929979f,0.233003f, +0.211332f,0.959058f,0.188537f, +0.433374f,0.893306f,0.11913f, +0.363648f,0.930033f,0.052906f, +0.467682f,0.883824f,-0.0113249f, +0.383618f,0.915858f,-0.118494f, +0.389479f,0.919494f,-0.0532637f, +0.409514f,0.907723f,-0.0913076f, +0.332107f,0.943241f,-0.00112667f, +0.268223f,0.935541f,-0.229827f, +0.254548f,0.967046f,-0.0051751f, +0.306606f,0.933957f,-0.183623f, +0.282468f,0.956486f,0.073117f, +0.352033f,0.935268f,0.0366899f, +0.28404f,0.958651f,0.0175868f, +0.303901f,0.947745f,0.0970751f, +0.36555f,0.930735f,0.0102418f, +0.393208f,0.907605f,0.147107f, +0.468517f,0.882377f,0.0436299f, +0.45621f,0.884295f,0.0994741f, +0.387946f,0.921329f,0.0254982f, +0.35572f,0.93034f,0.0890492f, +-0.0727074f,0.997226f,-0.0159048f, +0.0416391f,0.981376f,0.187527f, +-0.216733f,0.958137f,0.187084f, +-0.0894435f,0.917028f,0.388664f, +-0.0768893f,0.966885f,0.243356f, +-0.0850782f,0.918088f,0.387139f, +-0.0500426f,0.973558f,0.222893f, +-0.133165f,0.955198f,0.264319f, +-0.123001f,0.980349f,0.154228f, +-0.136539f,0.958129f,0.251685f, +-0.132627f,0.981796f,0.135965f, +-0.174651f,0.968606f,0.176918f, +-0.259357f,0.958248f,0.120395f, +-0.298496f,0.949786f,0.0938444f, +-0.287382f,0.955091f,0.0721996f, +-0.350088f,0.936687f,-0.00747904f, +-0.148232f,0.988935f,-0.00587251f, +-0.126386f,0.991686f,0.0242043f, +-0.0549856f,0.99804f,0.0298927f, +-0.061356f,0.998107f,0.00430538f, +-0.205447f,0.97828f,0.0275574f, +-0.222811f,0.974816f,-0.00939735f, +-0.192208f,0.981343f,0.00477232f, +-0.179009f,0.983825f,-0.00666687f, +-0.0670729f,0.997581f,0.0182672f, +-0.127994f,0.990724f,-0.0456448f, +-0.132352f,0.983294f,-0.124961f, +-0.16906f,0.976471f,-0.133875f, +0.0163433f,0.992538f,-0.120836f, +0.061026f,0.995929f,-0.0663405f, +0.133906f,0.98909f,-0.0613958f, +0.0943148f,0.983776f,-0.152607f, +0.150352f,0.985874f,-0.0738065f, +0.100217f,0.972528f,-0.210109f, +0.174622f,0.974275f,-0.142462f, +0.154561f,0.962801f,-0.221644f, +0.214773f,0.96191f,-0.169122f, +0.258606f,0.948184f,-0.184582f, +0.352689f,0.932616f,-0.0764078f, +0.422646f,0.906225f,0.0112396f, +0.443105f,0.890896f,-0.0998108f, +0.401063f,0.915401f,-0.0344995f, +0.415945f,0.889086f,-0.19109f, +0.396075f,0.910803f,-0.116459f, +0.504361f,0.849207f,-0.15642f, +0.465554f,0.866637f,-0.179442f, +0.527872f,0.824305f,-0.204628f, +0.465951f,0.840148f,-0.277561f, +0.474007f,0.822715f,-0.31378f, +0.361245f,0.837173f,-0.410663f, +0.405138f,0.793126f,-0.454769f, +0.304965f,0.772294f,-0.557277f, +0.421648f,0.811214f,-0.405148f, +0.482203f,0.762506f,-0.431353f, +0.478963f,0.817038f,-0.321005f, +0.485062f,0.781955f,-0.391486f, +0.478205f,0.82345f,-0.305368f, +0.426707f,0.781297f,-0.455518f, +0.428677f,0.841565f,-0.32864f, +0.430024f,0.798188f,-0.421871f, +0.423016f,0.835924f,-0.349699f, +0.437416f,0.818455f,-0.372557f, +0.461522f,0.813116f,-0.354739f, +0.446182f,0.808887f,-0.382915f, +0.507869f,0.791896f,-0.339072f, +0.474665f,0.780232f,-0.407346f, +0.494125f,0.792543f,-0.357373f, +0.430265f,0.769469f,-0.472006f, +0.389469f,0.809375f,-0.439574f, +0.38782f,0.781711f,-0.488389f, +0.349938f,0.837293f,-0.4201f, +0.417236f,0.816738f,-0.398564f, +0.440298f,0.822173f,-0.360789f, +0.490994f,0.819158f,-0.296487f, +0.379279f,0.852728f,-0.359169f, +0.3675f,0.860963f,-0.351692f, +0.122152f,0.892865f,-0.433442f, +0.135293f,0.922235f,-0.362185f, +0.188083f,0.883941f,-0.428104f, +0.194653f,0.9204f,-0.339078f, +0.200053f,0.870677f,-0.449332f, +0.149584f,0.899445f,-0.410639f, +0.170948f,0.845446f,-0.505962f, +0.0834541f,0.848059f,-0.523289f, +0.233208f,0.811352f,-0.536024f, +0.246347f,0.822898f,-0.512008f, +0.0429626f,0.875995f,-0.480403f, +0.171623f,0.870482f,-0.461311f, +-0.202408f,0.938053f,-0.281226f, +-0.0831604f,0.960463f,-0.265698f, +-0.312635f,0.912112f,-0.265162f, +-0.344362f,0.89728f,-0.276231f, +-0.0852182f,0.932714f,-0.350403f, +-0.156991f,0.922287f,-0.353185f, +0.0213728f,0.893503f,-0.448548f, +-0.0577934f,0.860578f,-0.506029f, +-0.0250381f,0.886654f,-0.461755f, +-0.0319956f,0.87749f,-0.478526f, +-0.0302913f,0.865602f,-0.499816f, +-0.00892741f,0.865625f,-0.500613f, +0.0556557f,0.906734f,-0.418015f, +0.137632f,0.905698f,-0.400959f, +0.0276894f,0.926625f,-0.374965f, +0.074566f,0.927887f,-0.365329f, +0.0588963f,0.991806f,0.113367f, +0.300045f,0.940314f,0.160571f, +0.505162f,0.858812f,0.0851652f, +0.523651f,0.851407f,0.0299276f, +0.336751f,0.940492f,0.0455315f, +0.231254f,0.960478f,0.15493f, +0.265257f,0.945144f,0.190637f, +0.327138f,0.941822f,0.0771526f, +0.406507f,0.912216f,-0.0511354f, +0.398687f,0.900126f,-0.17556f, +0.399875f,0.884983f,-0.238547f, +0.421808f,0.899838f,-0.11122f, +-0.041369f,0.987502f,-0.152078f, +-0.327111f,0.932019f,-0.156008f, +-0.143307f,0.985559f,-0.0902006f, +-0.0270205f,0.999466f,0.0183744f, +-0.0836031f,0.996473f,-0.00727851f, +-0.153499f,0.988141f,-0.00380883f, +-0.269657f,0.962702f,0.0221269f, +-0.220011f,0.975241f,-0.0223422f, +-0.104184f,0.990611f,-0.0885198f, +-0.112376f,0.99176f,-0.0615135f, +-0.176142f,0.984186f,-0.0187604f, +-0.211815f,0.974306f,-0.076572f, +-0.0254097f,0.999559f,-0.0153608f, +-0.0364109f,0.99734f,-0.0631393f, +-0.0203648f,0.999538f,-0.0225481f, +0.0549873f,0.998448f,0.00884961f, +0.169599f,0.985346f,0.0181241f, +0.253148f,0.96653f,-0.0416731f, +0.241207f,0.963047f,-0.119834f, +0.334221f,0.932038f,-0.140004f, +0.510774f,0.849501f,-0.132124f, +0.446103f,0.866333f,-0.224633f, +0.443332f,0.853241f,-0.274658f, +0.556199f,0.799442f,-0.227011f, +0.56349f,0.790862f,-0.238781f, +0.469847f,0.819465f,-0.32821f, +0.384148f,0.843359f,-0.375735f, +0.405196f,0.828658f,-0.386189f, +0.451519f,0.832227f,-0.321758f, +0.460293f,0.845627f,-0.27027f, +0.479361f,0.841341f,-0.249716f, +0.486527f,0.832565f,-0.264815f, +0.505678f,0.817374f,-0.276024f, +0.532701f,0.792427f,-0.297134f, +0.419998f,0.832504f,-0.361301f, +0.381252f,0.872209f,-0.306428f, +0.441269f,0.820876f,-0.362552f, +0.40003f,0.811169f,-0.426593f, +0.192925f,0.829083f,-0.524786f, +0.183969f,0.805942f,-0.562684f, +0.196671f,0.822252f,-0.534063f, +0.210296f,0.820946f,-0.530871f, +0.203797f,0.82129f,-0.532869f, +-0.110131f,0.879911f,-0.462199f, +-0.313522f,0.874849f,-0.369247f, +-0.225349f,0.894153f,-0.386922f, +-0.0425073f,0.90311f,-0.4273f, +0.0811921f,0.929959f,-0.358587f, +-0.0097083f,0.913772f,-0.406111f, +-0.0203212f,0.916094f,-0.400448f, +-0.0594319f,0.92652f,-0.371521f, +-0.0269889f,0.956838f,-0.289365f, +0.0349749f,0.98646f,-0.160231f, +0.256968f,0.956769f,-0.13624f, +0.548943f,0.832681f,-0.0728256f, +0.489119f,0.868806f,-0.0770563f, +0.299363f,0.954014f,0.0154449f, +0.150669f,0.988307f,0.0233966f, +0.338483f,0.938561f,0.0673226f, +0.470525f,0.880363f,-0.0597344f, +0.482272f,0.850276f,-0.210818f, +0.467725f,0.834993f,-0.289861f, +0.394888f,0.866151f,-0.306343f, +0.253937f,0.935832f,-0.244407f, +-0.00400266f,0.994244f,-0.107062f, +-0.309146f,0.937501f,-0.15975f, +-0.226806f,0.957844f,-0.176334f, +-0.122632f,0.982531f,-0.139981f, +-0.0635605f,0.992861f,-0.10093f, +-0.151586f,0.973622f,-0.170534f, +-0.231525f,0.948656f,-0.215516f, +-0.166237f,0.951792f,-0.257795f, +-0.0869197f,0.960928f,-0.262798f, +-0.164573f,0.950876f,-0.262203f, +-0.167249f,0.963013f,-0.211268f, +-0.211402f,0.954271f,-0.211366f, +-0.0642089f,0.988782f,-0.134861f, +-0.0696806f,0.987799f,-0.139279f, +-0.124243f,0.98904f,-0.0797755f, +0.0962393f,0.995288f,-0.0118021f, +0.210783f,0.972894f,-0.0951158f, +0.297355f,0.950074f,-0.0945467f, +0.301001f,0.949737f,-0.0860135f, +0.352321f,0.929179f,-0.111785f, +0.488103f,0.867307f,-0.0976422f, +0.556803f,0.828121f,-0.0646904f, +0.522997f,0.817722f,-0.240427f, +0.526158f,0.791225f,-0.311642f, +0.539548f,0.783883f,-0.30727f, +0.519736f,0.798926f,-0.302643f, +0.456854f,0.816569f,-0.352845f, +0.429557f,0.807438f,-0.404381f, +0.403588f,0.823842f,-0.397997f, +0.363835f,0.833866f,-0.415079f, +0.411515f,0.83345f,-0.368804f, +0.472303f,0.812756f,-0.341113f, +0.520866f,0.78709f,-0.330436f, +0.571303f,0.758641f,-0.313172f, +0.364947f,0.85616f,-0.365791f, +0.334117f,0.892356f,-0.303424f, +0.531373f,0.790182f,-0.305376f, +0.490437f,0.768139f,-0.411624f, +0.28549f,0.798709f,-0.529679f, +0.166173f,0.802828f,-0.572585f, +0.142862f,0.826392f,-0.544671f, +0.199443f,0.816751f,-0.541424f, +0.128075f,0.851947f,-0.507724f, +-0.168704f,0.879688f,-0.444621f, +-0.244755f,0.842741f,-0.479461f, +-0.150804f,0.809643f,-0.567218f, +-0.142654f,0.804501f,-0.576565f, +-0.00468689f,0.885234f,-0.465123f, +-0.00403137f,0.903548f,-0.428468f, +-0.0506207f,0.931001f,-0.361489f, +-0.153442f,0.941817f,-0.299058f, +-0.162811f,0.972443f,-0.166875f, +0.109587f,0.934225f,-0.339431f, +0.212963f,0.908729f,-0.358967f, +0.490721f,0.837065f,-0.2419f, +0.423339f,0.87185f,-0.246298f, +0.265687f,0.948953f,-0.169996f, +0.19754f,0.959782f,-0.199488f, +0.295591f,0.918793f,-0.261622f, +0.531499f,0.826018f,-0.187622f, +0.59212f,0.773761f,-0.225139f, +0.430882f,0.823206f,-0.369692f, +0.346812f,0.896722f,-0.274977f, +0.157001f,0.944818f,-0.287523f, +-0.0770972f,0.974843f,-0.209133f, +-0.291803f,0.93708f,-0.191656f, +-0.196019f,0.961744f,-0.191378f, +-0.131765f,0.96396f,-0.231124f, +-0.0745388f,0.982069f,-0.173159f, +0.00914064f,0.98959f,-0.143621f, +-0.138284f,0.94748f,-0.288373f, +-0.221669f,0.91917f,-0.325561f, +-0.129149f,0.970549f,-0.203358f, +-0.130482f,0.980721f,-0.145466f, +-0.176902f,0.951987f,-0.249854f, +-0.247465f,0.916992f,-0.31287f, +-0.158128f,0.953184f,-0.25775f, +-0.0356987f,0.985511f,-0.165812f, +-0.125849f,0.96636f,-0.224301f, +0.0681695f,0.96619f,-0.248655f, +0.227225f,0.953018f,-0.200315f, +0.225952f,0.967572f,-0.112919f, +0.287704f,0.957355f,-0.0264129f, +0.36102f,0.928385f,-0.0881278f, +0.475672f,0.87145f,-0.119627f, +0.569214f,0.81507f,-0.107964f, +0.623663f,0.769908f,-0.13523f, +0.603105f,0.773542f,-0.19467f, +0.556766f,0.776509f,-0.295034f, +0.523993f,0.789717f,-0.319025f, +0.458736f,0.810878f,-0.36337f, +0.42608f,0.838013f,-0.340867f, +0.413816f,0.852215f,-0.320134f, +0.428047f,0.839676f,-0.334247f, +0.440545f,0.806668f,-0.393963f, +0.471664f,0.754066f,-0.457075f, +0.438131f,0.75533f,-0.487358f, +0.513035f,0.778713f,-0.361111f, +0.362236f,0.865985f,-0.344753f, +0.319311f,0.872794f,-0.36915f, +0.546544f,0.761872f,-0.347621f, +0.587841f,0.74763f,-0.309017f, +0.346001f,0.792234f,-0.502642f, +0.160837f,0.807416f,-0.567637f, +0.137348f,0.82025f,-0.555271f, +0.177955f,0.827144f,-0.533071f, +0.0951091f,0.870125f,-0.483567f, +-0.154432f,0.835911f,-0.526691f, +-0.124368f,0.808763f,-0.574834f, +-0.126819f,0.782715f,-0.609323f, +-0.137751f,0.811099f,-0.568456f, +-0.111652f,0.799108f,-0.590729f, +-0.083265f,0.829705f,-0.551957f, +-0.187386f,0.858237f,-0.477825f, +-0.293723f,0.918982f,-0.263055f, +-0.393626f,0.913021f,-0.107009f, +0.212209f,0.950224f,-0.228125f, +0.209499f,0.936607f,-0.280851f, +0.442676f,0.872148f,-0.208317f, +0.471617f,0.857429f,-0.205893f, +0.203873f,0.890799f,-0.406094f, +0.238352f,0.874506f,-0.422408f, +0.316589f,0.834877f,-0.45028f, +0.439788f,0.802413f,-0.403384f, +0.591147f,0.75018f,-0.29627f, +0.446858f,0.837414f,-0.314732f, +0.297014f,0.892204f,-0.340228f, +0.174626f,0.914769f,-0.364286f, +-0.105816f,0.915255f,-0.388731f, +-0.264967f,0.884964f,-0.382925f, +-0.17731f,0.909999f,-0.374785f, +-0.129483f,0.910653f,-0.39236f, +-0.183919f,0.912509f,-0.365379f, +-0.0547605f,0.971103f,-0.232295f, +-0.0329197f,0.988161f,-0.149845f, +-0.283679f,0.94023f,-0.188398f, +-0.271484f,0.961222f,-0.0484715f, +-0.126156f,0.992006f,-0.00297784f, +-0.0077445f,0.99412f,-0.10801f, +-0.122479f,0.952558f,-0.278626f, +-0.22816f,0.898995f,-0.373834f, +-0.116624f,0.94701f,-0.299285f, +-0.0338322f,0.962019f,-0.270876f, +0.0643125f,0.93366f,-0.352339f, +0.108033f,0.951056f,-0.28952f, +0.0914872f,0.981979f,-0.165373f, +0.260441f,0.963994f,-0.0537291f, +0.448443f,0.892711f,-0.0443492f, +0.523825f,0.846692f,-0.0933822f, +0.566469f,0.810587f,-0.148532f, +0.615421f,0.777098f,-0.131818f, +0.641634f,0.7586f,-0.11328f, +0.626845f,0.758026f,-0.180172f, +0.575952f,0.768546f,-0.278596f, +0.455289f,0.793648f,-0.403527f, +0.401888f,0.827012f,-0.393113f, +0.390072f,0.829628f,-0.399451f, +0.432707f,0.817098f,-0.380939f, +0.498394f,0.785084f,-0.367759f, +0.54453f,0.759415f,-0.356056f, +0.443321f,0.820621f,-0.360621f, +0.413861f,0.828476f,-0.377289f, +0.394054f,0.852433f,-0.343626f, +0.354186f,0.831754f,-0.427477f, +0.501406f,0.754246f,-0.423916f, +0.58911f,0.726277f,-0.354219f, +0.489087f,0.757568f,-0.432301f, +0.219144f,0.803913f,-0.552901f, +0.0950257f,0.808184f,-0.581213f, +0.0824554f,0.830823f,-0.550395f, +0.0933748f,0.860985f,-0.499987f, +-0.0248456f,0.850125f,-0.525994f, +-0.102917f,0.824622f,-0.556243f, +-0.137975f,0.843048f,-0.519839f, +-0.191841f,0.811585f,-0.551839f, +-0.0960986f,0.833755f,-0.543707f, +-0.122745f,0.850064f,-0.512177f, +-0.326981f,0.870361f,-0.368177f, +-0.538824f,0.830097f,-0.143558f, +-0.554748f,0.831168f,0.0375988f, +0.183636f,0.945911f,-0.267453f, +0.248003f,0.941284f,-0.229083f, +0.367193f,0.90606f,-0.210295f, +0.559963f,0.826078f,-0.0635307f, +0.486301f,0.848236f,-0.209779f, +0.313552f,0.830527f,-0.460336f, +0.26103f,0.794184f,-0.548758f, +0.384376f,0.78311f,-0.488869f, +0.479781f,0.77201f,-0.416905f, +0.481011f,0.825397f,-0.295547f, +0.281884f,0.886831f,-0.366158f, +0.202383f,0.940438f,-0.273162f, +-0.0238314f,0.938511f,-0.344426f, +-0.257973f,0.859678f,-0.440913f, +-0.194719f,0.873936f,-0.445332f, +-0.0838372f,0.877697f,-0.471825f, +-0.223876f,0.839024f,-0.495901f, +-0.216019f,0.888182f,-0.405548f, +-0.127765f,0.960438f,-0.247457f, +-0.306436f,0.940762f,-0.145138f, +-0.327317f,0.939981f,-0.096429f, +-0.0557083f,0.990847f,-0.122959f, +0.0995056f,0.975129f,-0.198043f, +0.0247654f,0.966343f,-0.256062f, +-0.1694f,0.916546f,-0.362281f, +-0.197841f,0.908709f,-0.367568f, +-0.0185126f,0.95561f,-0.294052f, +0.0824185f,0.951583f,-0.296138f, +0.0241627f,0.96387f,-0.265277f, +0.0355962f,0.964767f,-0.260688f, +0.155357f,0.948871f,-0.274788f, +0.403654f,0.905713f,-0.129414f, +0.540931f,0.838513f,-0.0654957f, +0.603296f,0.79305f,-0.0842943f, +0.615316f,0.778563f,-0.123395f, +0.650635f,0.750663f,-0.114799f, +0.681129f,0.712532f,-0.16841f, +0.640077f,0.706799f,-0.301225f, +0.501905f,0.776085f,-0.381816f, +0.395956f,0.833034f,-0.386359f, +0.40448f,0.824611f,-0.39549f, +0.410354f,0.816219f,-0.406689f, +0.470853f,0.807605f,-0.355065f, +0.489936f,0.812779f,-0.315203f, +0.459069f,0.843316f,-0.279417f, +0.469145f,0.829489f,-0.303069f, +0.440235f,0.819159f,-0.367657f, +0.420347f,0.792019f,-0.442734f, +0.528602f,0.735131f,-0.424456f, +0.540602f,0.708419f,-0.453752f, +0.493287f,0.777492f,-0.390095f, +0.304413f,0.86604f,-0.396619f, +0.0820709f,0.870144f,-0.485916f, +0.0884612f,0.883073f,-0.460823f, +0.0898563f,0.860973f,-0.500651f, +-0.0421635f,0.844727f,-0.533535f, +-0.161922f,0.847271f,-0.505878f, +-0.14449f,0.888235f,-0.436074f, +-0.171293f,0.877903f,-0.447153f, +-0.137238f,0.90321f,-0.406666f, +-0.254069f,0.918554f,-0.302831f, +-0.505168f,0.843216f,-0.183829f, +-0.675277f,0.734237f,-0.069976f, +-0.653992f,0.755215f,0.0440947f, +0.0555085f,0.890635f,-0.451319f, +0.137334f,0.909799f,-0.39167f, +0.308301f,0.903589f,-0.297451f, +0.471952f,0.852104f,-0.226231f, +0.566013f,0.811602f,-0.144679f, +0.544915f,0.811135f,-0.212433f, +0.36963f,0.829124f,-0.419437f, +0.344038f,0.821377f,-0.454948f, +0.421617f,0.811326f,-0.404955f, +0.42674f,0.823996f,-0.372724f, +0.214619f,0.881696f,-0.42018f, +0.0910032f,0.951585f,-0.293606f, +0.0846967f,0.975495f,-0.203065f, +-0.12731f,0.949549f,-0.286616f, +-0.203708f,0.900619f,-0.383912f, +-0.0136138f,0.94578f,-0.324521f, +-0.1774f,0.907831f,-0.379963f, +-0.319591f,0.828051f,-0.460644f, +-0.309551f,0.868477f,-0.387202f, +-0.350068f,0.908991f,-0.226245f, +-0.314996f,0.908797f,-0.273615f, +-0.0601423f,0.962735f,-0.263674f, +0.136393f,0.973573f,-0.183175f, +0.0532739f,0.976623f,-0.208255f, +-0.105007f,0.973025f,-0.205419f, +-0.20872f,0.948662f,-0.237649f, +-0.0905915f,0.950284f,-0.297915f, +0.0475864f,0.961005f,-0.272405f, +0.0362517f,0.97079f,-0.237174f, +0.105725f,0.948531f,-0.298516f, +0.162566f,0.915122f,-0.368949f, +0.273546f,0.895769f,-0.350385f, +0.484941f,0.844255f,-0.228179f, +0.616479f,0.776457f,-0.130645f, +0.628311f,0.758456f,-0.173119f, +0.646758f,0.730427f,-0.2195f, +0.713832f,0.657703f,-0.240564f, +0.670883f,0.685042f,-0.283959f, +0.484582f,0.813502f,-0.32155f, +0.374759f,0.869215f,-0.322522f, +0.442437f,0.844514f,-0.301738f, +0.417442f,0.841211f,-0.343666f, +0.423405f,0.844004f,-0.329219f, +0.51768f,0.821209f,-0.240049f, +0.452859f,0.851327f,-0.264878f, +0.509187f,0.825405f,-0.243796f, +0.514747f,0.798114f,-0.313129f, +0.470791f,0.788824f,-0.395111f, +0.531455f,0.747848f,-0.397843f, +0.533283f,0.783064f,-0.32003f, +0.426956f,0.884256f,-0.18921f, +0.350467f,0.920762f,-0.171379f, +0.166727f,0.944055f,-0.284537f, +0.0641204f,0.940994f,-0.332292f, +0.176576f,0.941646f,-0.286573f, +0.033479f,0.945913f,-0.322688f, +-0.166217f,0.885456f,-0.433982f, +-0.211415f,0.849321f,-0.483692f, +-0.245686f,0.873508f,-0.420264f, +-0.318583f,0.913339f,-0.253606f, +-0.37482f,0.927017f,-0.0122188f, +-0.519112f,0.853899f,0.0371293f, +-0.674751f,0.732141f,-0.0931649f, +-0.717847f,0.685588f,-0.121095f, +0.129526f,0.933398f,-0.33465f, +0.109756f,0.909727f,-0.400439f, +0.235187f,0.88528f,-0.401206f, +0.43527f,0.839228f,-0.32594f, +0.509145f,0.799028f,-0.319883f, +0.559944f,0.774395f,-0.294577f, +0.481154f,0.808934f,-0.337812f, +0.346903f,0.826321f,-0.443681f, +0.419785f,0.810323f,-0.408849f, +0.424579f,0.803602f,-0.417081f, +0.213763f,0.882039f,-0.419896f, +-0.065439f,0.903315f,-0.423958f, +-0.0365788f,0.953894f,-0.297908f, +-0.052968f,0.984136f,-0.169324f, +-0.178873f,0.950393f,-0.254476f, +-0.13588f,0.955299f,-0.262566f, +-0.0549577f,0.986053f,-0.157096f, +-0.250853f,0.921347f,-0.296972f, +-0.383387f,0.86801f,-0.31555f, +-0.39517f,0.874494f,-0.281248f, +-0.297344f,0.903399f,-0.308961f, +-0.146671f,0.942034f,-0.301762f, +0.0292749f,0.969498f,-0.243343f, +0.0315554f,0.994938f,-0.0954108f, +-0.135353f,0.99076f,0.00864549f, +-0.109362f,0.993969f,-0.00807889f, +0.00178341f,0.978683f,-0.205368f, +0.0583577f,0.951175f,-0.303086f, +0.0448944f,0.938747f,-0.341671f, +0.135893f,0.935013f,-0.327543f, +0.248098f,0.92828f,-0.277025f, +0.287291f,0.872499f,-0.395234f, +0.360517f,0.825037f,-0.435134f, +0.531263f,0.786524f,-0.314864f, +0.667801f,0.716872f,-0.200342f, +0.67932f,0.687853f,-0.2557f, +0.702261f,0.671608f,-0.236161f, +0.672702f,0.722764f,-0.15838f, +0.529805f,0.828764f,-0.180158f, +0.396956f,0.86756f,-0.29961f, +0.439447f,0.830334f,-0.342683f, +0.431898f,0.838796f,-0.33149f, +0.414335f,0.865026f,-0.282941f, +0.433505f,0.865399f,-0.251314f, +0.473777f,0.866492f,-0.157252f, +0.513796f,0.828002f,-0.224559f, +0.584841f,0.771201f,-0.251417f, +0.518412f,0.788719f,-0.330412f, +0.507007f,0.831445f,-0.227253f, +0.414775f,0.908203f,-0.0559478f, +0.370241f,0.92627f,0.07033f, +0.386742f,0.919823f,0.0659988f, +0.294152f,0.955333f,0.0285335f, +0.1108f,0.9849f,-0.133022f, +0.118551f,0.967697f,-0.222506f, +0.0772752f,0.978981f,-0.188747f, +-0.0200413f,0.97522f,-0.220327f, +-0.18076f,0.942791f,-0.280125f, +-0.356914f,0.914544f,-0.190318f, +-0.511643f,0.854464f,-0.0900754f, +-0.529301f,0.843485f,0.0915077f, +-0.481356f,0.855106f,0.192586f, +-0.566596f,0.818312f,0.0966086f, +-0.682392f,0.727753f,-0.0686784f, +0.232504f,0.952167f,-0.198291f, +0.256414f,0.932781f,-0.253323f, +0.252094f,0.888895f,-0.38251f, +0.391259f,0.847753f,-0.358095f, +0.537533f,0.80784f,-0.241771f, +0.561137f,0.803605f,-0.198354f, +0.542606f,0.822395f,-0.171013f, +0.447025f,0.853524f,-0.267703f, +0.421457f,0.829331f,-0.366857f, +0.381949f,0.841011f,-0.383165f, +0.196905f,0.918187f,-0.343745f, +-0.0750719f,0.92165f,-0.380691f, +-0.176435f,0.915143f,-0.362469f, +-0.162121f,0.952528f,-0.257698f, +-0.094717f,0.979068f,-0.180149f, +-0.167752f,0.965606f,-0.198655f, +-0.133367f,0.985758f,-0.102438f, +-0.176519f,0.982527f,-0.0590077f, +-0.382392f,0.914243f,-0.133925f, +-0.379354f,0.898635f,-0.220329f, +-0.2745f,0.907747f,-0.317246f, +-0.107475f,0.924008f,-0.366959f, +-0.0783766f,0.915897f,-0.393688f, +-0.161723f,0.964079f,-0.210708f, +-0.213776f,0.971922f,-0.0983248f, +0.0126393f,0.993361f,-0.114343f, +0.146279f,0.956353f,-0.252963f, +0.181548f,0.939791f,-0.289541f, +0.0719106f,0.91394f,-0.399427f, +0.0405362f,0.92481f,-0.378262f, +0.227996f,0.9289f,-0.291825f, +0.430007f,0.847434f,-0.311368f, +0.444003f,0.803436f,-0.396676f, +0.425815f,0.77314f,-0.470039f, +0.591393f,0.731624f,-0.339089f, +0.68448f,0.684033f,-0.252165f, +0.663878f,0.696032f,-0.273504f, +0.62681f,0.752096f,-0.203619f, +0.578478f,0.810023f,-0.0960529f, +0.535256f,0.829774f,-0.158038f, +0.488949f,0.817442f,-0.304496f, +0.370902f,0.857519f,-0.356501f, +0.349699f,0.870975f,-0.345126f, +0.374514f,0.863134f,-0.338731f, +0.45144f,0.856074f,-0.251673f, +0.565254f,0.789722f,-0.238384f, +0.610208f,0.775791f,-0.160605f, +0.460354f,0.88479f,-0.0722568f, +0.360414f,0.930663f,0.0629891f, +0.310809f,0.940565f,0.136874f, +0.344153f,0.923997f,0.166701f, +0.371378f,0.913473f,0.166271f, +0.349168f,0.916329f,0.196019f, +0.310264f,0.946182f,0.0920588f, +0.219218f,0.972739f,-0.075642f, +0.0579784f,0.994476f,-0.087501f, +-0.0556996f,0.997544f,-0.0424565f, +-0.239345f,0.970003f,0.0425244f, +-0.461388f,0.876311f,0.138566f, +-0.538726f,0.825514f,0.168229f, +-0.597717f,0.791468f,0.127721f, +-0.507215f,0.833365f,0.219627f, +-0.488959f,0.84151f,0.229738f, +-0.545304f,0.815937f,0.192066f, +0.227692f,0.931856f,-0.282489f, +0.297935f,0.90904f,-0.291343f, +0.353719f,0.876832f,-0.325652f, +0.346915f,0.865884f,-0.36041f, +0.409305f,0.867351f,-0.283145f, +0.519851f,0.844165f,-0.130922f, +0.531147f,0.844051f,-0.0738934f, +0.549452f,0.835136f,-0.0255055f, +0.519598f,0.847001f,-0.112281f, +0.416821f,0.899711f,-0.12954f, +0.213877f,0.961324f,-0.173531f, +-0.0327967f,0.969436f,-0.243141f, +-0.200151f,0.944585f,-0.26019f, +-0.261086f,0.940261f,-0.218503f, +-0.16617f,0.980036f,-0.109163f, +-0.211362f,0.973049f,-0.0922088f, +-0.262019f,0.96267f,-0.0679153f, +-0.172722f,0.984229f,0.0382049f, +-0.269464f,0.962867f,-0.0166155f, +-0.289017f,0.944015f,-0.159073f, +-0.146887f,0.958128f,-0.245795f, +-0.0700562f,0.951312f,-0.300164f, +-0.140619f,0.963564f,-0.227533f, +-0.278995f,0.930049f,-0.239105f, +-0.16269f,0.936868f,-0.309531f, +0.070144f,0.909561f,-0.409607f, +0.193776f,0.876857f,-0.43997f, +0.127038f,0.902686f,-0.411121f, +0.150617f,0.947884f,-0.280767f, +0.0386496f,0.919015f,-0.392324f, +0.208973f,0.868713f,-0.449075f, +0.403894f,0.796876f,-0.449287f, +0.495348f,0.781817f,-0.378673f, +0.489779f,0.764879f,-0.418421f, +0.499102f,0.742417f,-0.446893f, +0.648968f,0.690613f,-0.319208f, +0.677239f,0.687846f,-0.26118f, +0.512369f,0.799495f,-0.313506f, +0.465181f,0.863456f,-0.195064f, +0.589095f,0.803266f,-0.0879238f, +0.56026f,0.801619f,-0.208601f, +0.442292f,0.866151f,-0.232723f, +0.407485f,0.876049f,-0.257867f, +0.41887f,0.854839f,-0.306264f, +0.344336f,0.834896f,-0.429397f, +0.497957f,0.824163f,-0.269804f, +0.448098f,0.886678f,-0.114058f, +0.337837f,0.929162f,0.150081f, +0.341034f,0.908641f,0.240972f, +0.356163f,0.918925f,0.169481f, +0.332963f,0.932465f,0.140159f, +0.378366f,0.915215f,0.13864f, +0.366597f,0.926522f,0.0846395f, +0.364364f,0.925578f,0.102688f, +0.226565f,0.954799f,0.192424f, +0.0359845f,0.964557f,0.261408f, +-0.155471f,0.954274f,0.255321f, +-0.290268f,0.886689f,0.359898f, +-0.467017f,0.828082f,0.31012f, +-0.499403f,0.82291f,0.270953f, +-0.565258f,0.797609f,0.210482f, +-0.553063f,0.809532f,0.196925f, +-0.499446f,0.823964f,0.267652f, +-0.522286f,0.796771f,0.30393f, +0.282895f,0.896955f,-0.339766f, +0.328074f,0.870604f,-0.366628f, +0.343521f,0.854938f,-0.388683f, +0.333693f,0.867418f,-0.369101f, +0.350459f,0.883644f,-0.310405f, +0.440013f,0.868347f,-0.228826f, +0.488334f,0.85139f,-0.191483f, +0.49066f,0.852892f,-0.178404f, +0.509846f,0.855822f,-0.0873222f, +0.418823f,0.907869f,-0.0190138f, +0.288806f,0.957176f,-0.0201137f, +0.0497186f,0.992214f,-0.114191f, +-0.215841f,0.960205f,-0.177253f, +-0.338759f,0.933444f,-0.118004f, +-0.242696f,0.969321f,-0.0389388f, +-0.141909f,0.989578f,-0.0244358f, +-0.270493f,0.952883f,-0.137288f, +-0.235245f,0.967095f,-0.0968818f, +-0.186427f,0.979041f,-0.0819931f, +-0.181825f,0.962183f,-0.20284f, +-0.135402f,0.958028f,-0.252681f, +-0.153581f,0.96935f,-0.191767f, +-0.186528f,0.978878f,-0.0837011f, +-0.164286f,0.974581f,-0.152324f, +0.0119477f,0.951315f,-0.307988f, +0.181241f,0.876938f,-0.44512f, +0.193514f,0.837326f,-0.51131f, +-0.00806995f,0.853668f,-0.520756f, +0.0461085f,0.918292f,-0.393209f, +0.210027f,0.898011f,-0.386606f, +0.313179f,0.820953f,-0.477447f, +0.395672f,0.762863f,-0.511355f, +0.407119f,0.752829f,-0.517206f, +0.491283f,0.735772f,-0.466133f, +0.508563f,0.731088f,-0.454835f, +0.557969f,0.720001f,-0.412637f, +0.635268f,0.712821f,-0.297187f, +0.514275f,0.818992f,-0.254505f, +0.384017f,0.888427f,-0.251454f, +0.535431f,0.823023f,-0.189597f, +0.597396f,0.79853f,-0.0739445f, +0.435766f,0.897283f,-0.0706489f, +0.387025f,0.91478f,-0.115713f, +0.532369f,0.842082f,-0.0864959f, +0.42055f,0.882636f,-0.209979f, +0.370951f,0.912219f,-0.173928f, +0.309089f,0.948381f,-0.0709704f, +0.21321f,0.976943f,0.0111471f, +0.331446f,0.943237f,0.0211533f, +0.410945f,0.911483f,0.0179772f, +0.321726f,0.946051f,-0.0384626f, +0.397145f,0.917286f,0.0293659f, +0.411757f,0.908804f,0.0673213f, +0.22276f,0.971882f,0.0763077f, +0.069501f,0.964908f,0.253224f, +-0.028986f,0.93542f,0.352349f, +-0.1774f,0.888082f,0.424074f, +-0.313309f,0.830284f,0.460941f, +-0.375142f,0.83463f,0.403313f, +-0.455516f,0.824707f,0.335207f, +-0.516585f,0.80896f,0.280577f, +-0.560057f,0.80406f,0.199559f, +-0.56953f,0.792393f,0.218515f, +-0.567769f,0.776958f,0.271984f, +0.281384f,0.90217f,-0.326974f, +0.32181f,0.911348f,-0.256676f, +0.424167f,0.891125f,-0.16118f, +0.302129f,0.903121f,-0.305108f, +0.274213f,0.914554f,-0.297318f, +0.377666f,0.887315f,-0.264651f, +0.50458f,0.840574f,-0.197063f, +0.48044f,0.846134f,-0.230726f, +0.426379f,0.87586f,-0.225987f, +0.348305f,0.925694f,-0.147563f, +0.27972f,0.958581f,-0.053649f, +0.144728f,0.989215f,-0.0225097f, +-0.168728f,0.979072f,-0.113791f, +-0.360157f,0.915919f,-0.177143f, +-0.292774f,0.933287f,-0.207987f, +-0.10309f,0.983541f,-0.148387f, +-0.174215f,0.960869f,-0.215359f, +-0.250891f,0.918965f,-0.304233f, +-0.150246f,0.940005f,-0.306294f, +-0.0860686f,0.946791f,-0.310127f, +-0.15131f,0.934427f,-0.322415f, +-0.22276f,0.935306f,-0.27492f, +-0.201088f,0.949203f,-0.242028f, +-0.0437143f,0.949864f,-0.309592f, +0.109977f,0.887847f,-0.446802f, +0.297781f,0.833674f,-0.465096f, +0.214775f,0.818536f,-0.532795f, +0.0269455f,0.850361f,-0.52551f, +-0.017632f,0.796129f,-0.60487f, +0.185146f,0.781388f,-0.595948f, +0.323386f,0.740218f,-0.589491f, +0.406653f,0.707179f,-0.578387f, +0.409551f,0.698057f,-0.587354f, +0.432954f,0.696782f,-0.57188f, +0.429959f,0.722053f,-0.54201f, +0.513634f,0.737641f,-0.438254f, +0.557438f,0.766448f,-0.319093f, +0.451237f,0.872287f,-0.188415f, +0.398866f,0.907449f,-0.132071f, +0.479702f,0.868398f,-0.125579f, +0.492136f,0.869715f,0.0373829f, +0.490052f,0.864036f,0.115287f, +0.467195f,0.882543f,-0.0533554f, +0.500676f,0.860686f,-0.092427f, +0.467521f,0.883982f,0.000254135f, +0.346172f,0.935182f,-0.0748316f, +0.285844f,0.955101f,-0.0779434f, +0.233788f,0.970423f,-0.0601792f, +0.33578f,0.93567f,-0.108509f, +0.44843f,0.890103f,-0.0814045f, +0.344049f,0.926181f,-0.154332f, +0.278254f,0.949058f,-0.147866f, +0.299653f,0.954043f,0.00333978f, +0.154533f,0.964067f,0.21609f, +0.0182142f,0.948347f,0.316711f, +-0.116946f,0.954294f,0.275039f, +-0.30019f,0.894483f,0.33134f, +-0.320232f,0.867471f,0.380717f, +-0.340655f,0.881399f,0.327246f, +-0.432069f,0.860755f,0.269105f, +-0.470649f,0.851696f,0.23044f, +-0.520568f,0.837827f,0.164485f, +-0.594362f,0.792684f,0.135598f, +-0.629645f,0.760492f,0.15874f, +0.105475f,0.917668f,-0.383094f, +0.157333f,0.940076f,-0.302494f, +0.34936f,0.922619f,-0.163471f, +0.441147f,0.892415f,-0.0947875f, +0.353266f,0.911437f,-0.210916f, +0.379048f,0.861228f,-0.33854f, +0.442622f,0.833751f,-0.330068f, +0.481137f,0.838111f,-0.257053f, +0.418048f,0.882249f,-0.216499f, +0.270753f,0.936711f,-0.221958f, +0.184979f,0.961951f,-0.201082f, +0.112903f,0.979904f,-0.164442f, +-0.0774318f,0.983977f,-0.160602f, +-0.269214f,0.939575f,-0.211477f, +-0.244405f,0.926884f,-0.284872f, +-0.16522f,0.91825f,-0.359887f, +-0.0697709f,0.937892f,-0.339838f, +-0.121807f,0.888033f,-0.443351f, +-0.178259f,0.862094f,-0.474361f, +-0.173573f,0.911189f,-0.373641f, +-0.145335f,0.940854f,-0.30606f, +-0.196672f,0.897435f,-0.394881f, +-0.142648f,0.86312f,-0.484434f, +0.079713f,0.828378f,-0.554469f, +0.216417f,0.76965f,-0.600668f, +0.249468f,0.776353f,-0.578828f, +0.204058f,0.841867f,-0.499621f, +0.0644049f,0.826788f,-0.558814f, +0.116412f,0.767322f,-0.630607f, +0.208898f,0.705315f,-0.677416f, +0.323537f,0.664792f,-0.673332f, +0.378749f,0.668133f,-0.640428f, +0.350681f,0.681998f,-0.641795f, +0.388988f,0.701053f,-0.597673f, +0.366172f,0.724838f,-0.583548f, +0.331191f,0.791609f,-0.513486f, +0.441902f,0.864123f,-0.240861f, +0.365381f,0.918735f,-0.149742f, +0.346761f,0.932102f,-0.104611f, +0.441617f,0.896164f,-0.0431763f, +0.429069f,0.903098f,0.0177174f, +0.509493f,0.859732f,0.035759f, +0.550737f,0.834518f,-0.0163997f, +0.446836f,0.894607f,0.00385291f, +0.489488f,0.868437f,0.0788584f, +0.430014f,0.900385f,-0.0662903f, +0.277285f,0.953602f,-0.117285f, +0.208284f,0.969937f,-0.12586f, +0.377184f,0.918436f,-0.119197f, +0.417651f,0.892053f,-0.172653f, +0.381197f,0.917074f,-0.116891f, +0.274507f,0.95009f,-0.148238f, +0.0946799f,0.989623f,-0.108088f, +-0.059654f,0.986641f,0.151597f, +-0.0667871f,0.959734f,0.272857f, +-0.0714815f,0.942101f,0.327622f, +-0.300084f,0.906469f,0.297092f, +-0.336918f,0.914203f,0.225209f, +-0.288002f,0.930996f,0.224278f, +-0.416386f,0.886687f,0.201018f, +-0.454428f,0.859405f,0.234346f, +-0.478891f,0.849426f,0.221671f, +-0.583336f,0.801078f,0.13414f, +-0.664795f,0.744846f,0.0570272f, +0.0774054f,0.9409f,-0.329722f, +0.120466f,0.940242f,-0.318486f, +0.258377f,0.92069f,-0.292526f, +0.391172f,0.892344f,-0.225179f, +0.441921f,0.861239f,-0.250944f, +0.474164f,0.819484f,-0.321892f, +0.430001f,0.828794f,-0.358051f, +0.388327f,0.849227f,-0.357794f, +0.321794f,0.900086f,-0.293759f, +0.306798f,0.936469f,-0.170002f, +0.197413f,0.950888f,-0.238412f, +0.140677f,0.959941f,-0.242328f, +-0.0738732f,0.952166f,-0.296516f, +-0.264161f,0.917561f,-0.297155f, +-0.156821f,0.939785f,-0.303665f, +-0.074827f,0.921443f,-0.381239f, +-0.0597443f,0.912887f,-0.403816f, +-0.0722702f,0.937805f,-0.339556f, +-0.223343f,0.933173f,-0.281613f, +-0.284993f,0.906137f,-0.31256f, +-0.17102f,0.941557f,-0.290212f, +0.0188228f,0.955829f,-0.29332f, +0.0949729f,0.880183f,-0.465036f, +0.154174f,0.836833f,-0.525301f, +0.175395f,0.823625f,-0.539331f, +0.0906162f,0.806123f,-0.584769f, +0.167569f,0.848038f,-0.502744f, +0.206981f,0.812951f,-0.544306f, +0.220466f,0.75453f,-0.618126f, +0.281661f,0.74367f,-0.606318f, +0.323085f,0.773947f,-0.544631f, +0.389827f,0.796004f,-0.463047f, +0.409468f,0.784217f,-0.466197f, +0.383754f,0.755374f,-0.531172f, +0.333252f,0.782449f,-0.526039f, +0.13472f,0.877229f,-0.460782f, +0.220453f,0.931705f,-0.288664f, +0.346271f,0.928921f,-0.131156f, +0.317872f,0.942854f,-0.0999207f, +0.41364f,0.908959f,-0.0519229f, +0.398453f,0.915561f,-0.0546188f, +0.505703f,0.862625f,-0.0119489f, +0.526627f,0.849939f,0.0163649f, +0.402553f,0.915142f,0.0215902f, +0.486926f,0.872826f,0.0328415f, +0.480317f,0.876602f,0.0293992f, +0.350224f,0.935385f,0.0489656f, +0.241613f,0.961192f,-0.13317f, +0.388714f,0.905381f,-0.170843f, +0.410083f,0.900693f,-0.14347f, +0.356005f,0.930194f,-0.0894385f, +0.273996f,0.955273f,-0.111267f, +-0.044831f,0.997624f,-0.0523075f, +-0.196423f,0.976135f,0.0926162f, +-0.135564f,0.988784f,0.0626771f, +-0.172489f,0.970476f,0.168594f, +-0.254529f,0.9218f,0.292405f, +-0.284378f,0.936305f,0.206065f, +-0.327372f,0.917976f,0.223935f, +-0.435353f,0.844597f,0.311647f, +-0.503149f,0.802852f,0.319796f, +-0.41775f,0.811758f,0.408086f, +-0.454925f,0.830308f,0.321918f, +-0.572823f,0.802298f,0.167904f, +0.20617f,0.937765f,-0.279448f, +0.12824f,0.920264f,-0.369687f, +0.239724f,0.89965f,-0.364914f, +0.406692f,0.839091f,-0.361286f, +0.450018f,0.81612f,-0.362535f, +0.486709f,0.828644f,-0.276522f, +0.440087f,0.85086f,-0.286985f, +0.416932f,0.85696f,-0.302962f, +0.239451f,0.901982f,-0.359293f, +0.202502f,0.927776f,-0.313409f, +0.221835f,0.941111f,-0.255147f, +0.127859f,0.963075f,-0.236935f, +0.0102396f,0.970361f,-0.241441f, +-0.185811f,0.907396f,-0.376969f, +-0.143f,0.87175f,-0.468618f, +-0.054802f,0.895065f,-0.442557f, +-0.153942f,0.908075f,-0.389489f, +-0.214862f,0.949277f,-0.22958f, +-0.226443f,0.961303f,-0.156909f, +-0.189142f,0.939849f,-0.284446f, +-0.183498f,0.904381f,-0.385258f, +0.0372666f,0.939229f,-0.341264f, +0.17942f,0.912891f,-0.366659f, +0.186987f,0.89504f,-0.404894f, +0.249987f,0.855827f,-0.452843f, +0.209164f,0.815071f,-0.540287f, +0.137636f,0.780743f,-0.609506f, +0.248264f,0.780183f,-0.574177f, +0.268876f,0.805155f,-0.528613f, +0.166884f,0.854291f,-0.492277f, +0.223895f,0.925944f,-0.304136f, +0.382591f,0.903499f,-0.193167f, +0.505015f,0.839819f,-0.199159f, +0.522375f,0.816711f,-0.245169f, +0.295143f,0.898426f,-0.32515f, +0.045309f,0.962545f,-0.26731f, +0.0698554f,0.972543f,-0.221991f, +0.23803f,0.966556f,-0.0954522f, +0.24345f,0.969904f,-0.00421011f, +0.387893f,0.915554f,0.106303f, +0.388608f,0.912695f,0.126382f, +0.452964f,0.880246f,0.141388f, +0.553021f,0.816379f,0.166411f, +0.46714f,0.881043f,0.0744546f, +0.450683f,0.892414f,0.0219511f, +0.444978f,0.886482f,0.127064f, +0.382178f,0.921652f,0.0670691f, +0.411319f,0.911388f,-0.0137033f, +0.389838f,0.919191f,-0.0558004f, +0.35617f,0.934375f,0.0092699f, +0.326889f,0.943423f,0.0556465f, +0.261297f,0.961477f,0.0853544f, +-0.107365f,0.988428f,0.107158f, +-0.198313f,0.974378f,0.106114f, +-0.119767f,0.989964f,0.0750203f, +-0.291683f,0.947022f,0.134427f, +-0.31644f,0.92799f,0.196723f, +-0.289311f,0.932636f,0.215615f, +-0.411791f,0.85345f,0.319455f, +-0.469106f,0.777331f,0.419161f, +-0.481552f,0.76826f,0.421765f, +-0.441444f,0.803246f,0.399904f, +-0.347505f,0.834501f,0.427607f, +-0.388172f,0.828163f,0.404313f, +0.166663f,0.855647f,-0.489991f, +0.206118f,0.852788f,-0.479863f, +0.253643f,0.809648f,-0.529278f, +0.34663f,0.798296f,-0.492515f, +0.334799f,0.852879f,-0.400633f, +0.411503f,0.867459f,-0.279608f, +0.469719f,0.846111f,-0.251912f, +0.425418f,0.857617f,-0.288986f, +0.321984f,0.890401f,-0.321733f, +0.13105f,0.897315f,-0.421487f, +0.163065f,0.944711f,-0.284482f, +0.0880681f,0.960841f,-0.262734f, +0.0835185f,0.96106f,-0.263417f, +-0.0250069f,0.943064f,-0.33167f, +-0.080502f,0.931121f,-0.355714f, +-0.129429f,0.916002f,-0.379721f, +-0.246145f,0.898013f,-0.36467f, +-0.295885f,0.891242f,-0.343715f, +-0.176282f,0.915144f,-0.362541f, +-0.0418985f,0.91018f,-0.412089f, +-0.0774111f,0.852502f,-0.51696f, +-0.0321668f,0.826692f,-0.561735f, +0.194406f,0.844754f,-0.498595f, +0.282885f,0.80862f,-0.515859f, +0.302949f,0.736294f,-0.605056f, +0.233445f,0.738314f,-0.632768f, +0.172128f,0.759349f,-0.627504f, +0.112225f,0.79134f,-0.600988f, +0.137255f,0.870359f,-0.472902f, +0.0541041f,0.935131f,-0.350147f, +0.048453f,0.960354f,-0.274541f, +0.350102f,0.918679f,-0.182913f, +0.524752f,0.830609f,-0.186344f, +0.518158f,0.835225f,-0.184147f, +0.313736f,0.944893f,-0.0935296f, +0.0308812f,0.997052f,-0.070238f, +0.048477f,0.985949f,-0.159858f, +0.14972f,0.972865f,-0.1764f, +0.155626f,0.983809f,-0.0888849f, +0.284416f,0.958659f,0.0089454f, +0.3659f,0.926807f,0.0845335f, +0.421454f,0.897257f,0.131556f, +0.563402f,0.804293f,0.188919f, +0.539736f,0.827553f,0.154408f, +0.404327f,0.91158f,0.0744378f, +0.452914f,0.883943f,0.116249f, +0.458215f,0.8862f,0.0684684f, +0.412404f,0.90336f,0.117745f, +0.337667f,0.93426f,0.114626f, +0.331072f,0.928113f,0.170285f, +0.265924f,0.943818f,0.196193f, +0.193837f,0.929607f,0.313462f, +-0.0688814f,0.919176f,0.387776f, +-0.142537f,0.930406f,0.33768f, +-0.12463f,0.963373f,0.237444f, +-0.336333f,0.924835f,0.17765f, +-0.311125f,0.930755f,0.192081f, +-0.359893f,0.911001f,0.201382f, +-0.532454f,0.800855f,0.274086f, +-0.552598f,0.767696f,0.324466f, +-0.457025f,0.795874f,0.39713f, +-0.406778f,0.834647f,0.371344f, +-0.39211f,0.844207f,0.365466f, +-0.407171f,0.83024f,0.380675f, +0.088004f,0.820624f,-0.564651f, +0.180508f,0.82686f,-0.532654f, +0.264125f,0.820464f,-0.507027f, +0.247967f,0.854234f,-0.456943f, +0.24322f,0.902001f,-0.356704f, +0.342999f,0.897422f,-0.277462f, +0.495739f,0.849894f,-0.178668f, +0.449958f,0.858561f,-0.245787f, +0.384562f,0.884942f,-0.262659f, +0.158931f,0.931299f,-0.327755f, +-0.00482349f,0.936712f,-0.350067f, +0.115045f,0.961792f,-0.248435f, +0.108639f,0.956333f,-0.271339f, +-0.0605962f,0.963938f,-0.259135f, +-0.116693f,0.974935f,-0.189434f, +-0.0876965f,0.975552f,-0.201512f, +-0.158272f,0.938607f,-0.30654f, +-0.195709f,0.870225f,-0.452113f, +-0.139804f,0.831767f,-0.537233f, +-0.0224753f,0.834621f,-0.550366f, +0.0691358f,0.82738f,-0.557371f, +0.021368f,0.778901f,-0.626782f, +0.103745f,0.763834f,-0.637021f, +0.295282f,0.754578f,-0.586021f, +0.391718f,0.767187f,-0.507919f, +0.243831f,0.78308f,-0.57213f, +0.0624167f,0.795727f,-0.60243f, +0.0157622f,0.882125f,-0.470752f, +-0.0549233f,0.922741f,-0.381487f, +-0.0376875f,0.97f,-0.240167f, +0.0506221f,0.974297f,-0.219507f, +0.328414f,0.911788f,-0.246548f, +0.524714f,0.832523f,-0.177709f, +0.470173f,0.873047f,-0.12933f, +0.188699f,0.978079f,-0.0880599f, +0.0393835f,0.999181f,-0.00932192f, +0.202516f,0.978334f,-0.0430044f, +0.188361f,0.964087f,-0.187232f, +0.0636833f,0.962187f,-0.264841f, +0.180234f,0.965248f,-0.18924f, +0.346543f,0.937198f,-0.0395955f, +0.331037f,0.942573f,-0.0443968f, +0.504726f,0.851052f,0.144785f, +0.565376f,0.80039f,0.199312f, +0.492317f,0.859822f,0.135391f, +0.448961f,0.892857f,0.0352157f, +0.367625f,0.92412f,0.104186f, +0.329385f,0.906428f,0.264373f, +0.348699f,0.881448f,0.318526f, +0.290794f,0.899496f,0.326107f, +0.185082f,0.919339f,0.347219f, +0.0676347f,0.907778f,0.413962f, +-0.145808f,0.884054f,0.444059f, +-0.0815232f,0.884669f,0.459037f, +0.0810938f,0.898461f,0.431499f, +-0.248842f,0.934053f,0.256168f, +-0.367995f,0.892045f,0.262364f, +-0.356163f,0.871443f,0.337246f, +-0.546503f,0.805165f,0.230312f, +-0.590616f,0.793807f,0.145063f, +-0.541291f,0.82267f,0.173836f, +-0.431572f,0.851071f,0.299038f, +-0.381298f,0.858781f,0.342208f, +-0.443875f,0.85724f,0.260987f, +0.118157f,0.850415f,-0.512673f, +0.134653f,0.857894f,-0.49587f, +0.229214f,0.896945f,-0.378087f, +0.208074f,0.910502f,-0.35734f, +0.182505f,0.899208f,-0.397639f, +0.219865f,0.895989f,-0.385828f, +0.451196f,0.865461f,-0.217713f, +0.490084f,0.844039f,-0.217752f, +0.378309f,0.899823f,-0.217259f, +0.231483f,0.942802f,-0.239876f, +0.0439163f,0.94313f,-0.329511f, +0.0365981f,0.93055f,-0.364332f, +0.0406622f,0.963235f,-0.265566f, +-0.0474005f,0.988537f,-0.143342f, +-0.135564f,0.953464f,-0.269312f, +-0.0159099f,0.95648f,-0.291363f, +6.71815e-006f,0.933398f,-0.358843f, +-0.0477574f,0.880875f,-0.470933f, +-0.0515582f,0.822668f,-0.56618f, +0.00280332f,0.78244f,-0.62272f, +0.0365076f,0.790824f,-0.610954f, +0.0809221f,0.832084f,-0.548715f, +0.112086f,0.801748f,-0.587057f, +0.219407f,0.814817f,-0.536594f, +0.31647f,0.811557f,-0.491143f, +0.326532f,0.816359f,-0.476376f, +0.0311646f,0.874097f,-0.484751f, +-0.166146f,0.898216f,-0.406943f, +-0.145486f,0.939877f,-0.308975f, +-0.113562f,0.952885f,-0.281273f, +0.0633693f,0.957888f,-0.280063f, +0.322061f,0.911056f,-0.257398f, +0.438519f,0.889327f,-0.12961f, +0.430695f,0.901938f,0.0317863f, +0.232727f,0.970972f,0.0552405f, +0.0388751f,0.995464f,-0.0868351f, +0.197289f,0.970749f,-0.136837f, +0.308804f,0.945817f,-0.100347f, +0.177873f,0.966831f,-0.183299f, +0.0327621f,0.970738f,-0.237896f, +0.244781f,0.968393f,-0.0479323f, +0.27827f,0.960269f,-0.0211936f, +0.355239f,0.931705f,0.0757045f, +0.555707f,0.816071f,0.158801f, +0.563884f,0.814994f,0.133487f, +0.420142f,0.89843f,0.127685f, +0.31027f,0.90429f,0.293243f, +0.233723f,0.926208f,0.295826f, +0.272016f,0.906457f,0.323021f, +0.267428f,0.881549f,0.389042f, +0.161017f,0.891985f,0.422417f, +0.0459966f,0.878435f,0.475642f, +-0.0917474f,0.877231f,0.47122f, +-0.0819927f,0.91503f,0.394964f, +0.108269f,0.907964f,0.40482f, +-0.16221f,0.904236f,0.395026f, +-0.422279f,0.840786f,0.338761f, +-0.374364f,0.835182f,0.402893f, +-0.384829f,0.826017f,0.411828f, +-0.512379f,0.829197f,0.223383f, +-0.585197f,0.801652f,0.122056f, +-0.526709f,0.831787f,0.175237f, +-0.374079f,0.907515f,0.191003f, +-0.329797f,0.931547f,0.153144f, +0.105779f,0.878895f,-0.465138f, +0.0405535f,0.897741f,-0.438654f, +0.106545f,0.927041f,-0.359504f, +0.255352f,0.917446f,-0.305103f, +0.298997f,0.88918f,-0.346352f, +0.205215f,0.859845f,-0.467497f, +0.304244f,0.842016f,-0.445471f, +0.435228f,0.863678f,-0.254238f, +0.39753f,0.896082f,-0.197502f, +0.268558f,0.910516f,-0.314385f, +0.0970216f,0.931439f,-0.350727f, +0.0336528f,0.944013f,-0.328188f, +-0.0988412f,0.948055f,-0.302362f, +-0.0597673f,0.966409f,-0.249964f, +0.0558923f,0.934228f,-0.352269f, +-0.00489276f,0.88655f,-0.462606f, +0.0451038f,0.899627f,-0.434323f, +0.0627933f,0.870215f,-0.488654f, +0.0536848f,0.846805f,-0.529187f, +0.0729181f,0.867797f,-0.491539f, +-0.0450251f,0.86132f,-0.506063f, +0.0321391f,0.857039f,-0.514249f, +0.105366f,0.853869f,-0.509711f, +0.20021f,0.860626f,-0.468229f, +0.336826f,0.823703f,-0.456137f, +0.291163f,0.890761f,-0.348954f, +-0.0337704f,0.937324f,-0.34682f, +-0.238938f,0.893089f,-0.381184f, +-0.1654f,0.905926f,-0.389797f, +-0.0746684f,0.904792f,-0.419256f, +0.0731105f,0.895556f,-0.438901f, +0.199233f,0.902713f,-0.381334f, +0.277877f,0.941082f,-0.192742f, +0.300522f,0.95354f,-0.0211427f, +0.316945f,0.945681f,0.0723468f, +0.218722f,0.970853f,-0.0980014f, +0.256356f,0.93882f,-0.229999f, +0.242436f,0.93442f,-0.26093f, +0.1983f,0.960329f,-0.196077f, +0.00223103f,0.977894f,-0.209089f, +0.104164f,0.98625f,-0.128296f, +0.285507f,0.957716f,-0.0355725f, +0.283907f,0.956269f,-0.0703361f, +0.529334f,0.848145f,0.0213636f, +0.533064f,0.836918f,0.124145f, +0.319483f,0.916151f,0.242069f, +0.17728f,0.930248f,0.321263f, +0.27524f,0.891192f,0.360581f, +0.317681f,0.901882f,0.292724f, +0.194688f,0.951543f,0.23804f, +0.108971f,0.911619f,0.396329f, +-0.0300123f,0.895185f,0.444683f, +-0.0818392f,0.875146f,0.476887f, +-0.0034355f,0.872809f,0.48805f, +0.0854438f,0.889906f,0.448069f, +-0.143928f,0.891079f,0.430422f, +-0.400827f,0.846578f,0.350204f, +-0.436121f,0.820693f,0.369135f, +-0.389169f,0.817738f,0.42409f, +-0.354493f,0.838309f,0.414212f, +-0.495629f,0.825913f,0.268736f, +-0.491187f,0.862049f,0.124928f, +-0.360891f,0.926358f,0.107794f, +-0.272797f,0.945677f,0.17685f, +-0.0230447f,0.8982f,-0.438983f, +-0.0253824f,0.922509f,-0.38514f, +0.0868314f,0.93389f,-0.346856f, +0.228815f,0.908408f,-0.349913f, +0.325232f,0.887343f,-0.326875f, +0.342601f,0.877959f,-0.334385f, +0.256841f,0.884237f,-0.390073f, +0.281416f,0.889548f,-0.359874f, +0.383834f,0.865745f,-0.321181f, +0.3194f,0.893039f,-0.316962f, +0.102059f,0.965529f,-0.239452f, +-0.0466698f,0.958891f,-0.279912f, +-0.0536344f,0.964707f,-0.257804f, +-0.0261637f,0.940106f,-0.339875f, +0.144391f,0.948897f,-0.280616f, +0.0981473f,0.936323f,-0.337144f, +0.012852f,0.869861f,-0.493129f, +0.144402f,0.872896f,-0.466049f, +-0.00636809f,0.871363f,-0.490597f, +-0.0613187f,0.915967f,-0.396541f, +0.0199429f,0.949099f,-0.314346f, +0.0355652f,0.92816f,-0.370479f, +0.140076f,0.947915f,-0.286071f, +0.222188f,0.910114f,-0.349749f, +0.215543f,0.917499f,-0.33427f, +0.183013f,0.971215f,-0.152469f, +0.0390344f,0.988083f,-0.14889f, +-0.127226f,0.955382f,-0.266569f, +-0.116102f,0.92344f,-0.365757f, +-0.0309649f,0.920225f,-0.390164f, +0.00625843f,0.924708f,-0.380627f, +0.101949f,0.952725f,-0.286221f, +0.10526f,0.958946f,-0.263332f, +0.1589f,0.975537f,-0.151918f, +0.291601f,0.956292f,-0.0217678f, +0.33385f,0.942155f,0.0297851f, +0.349208f,0.937042f,0.00260008f, +0.278057f,0.953965f,-0.112407f, +0.149531f,0.968881f,-0.197256f, +-0.00612536f,0.988275f,-0.152563f, +-0.00797921f,0.994274f,-0.106558f, +0.301027f,0.953574f,-0.00894642f, +0.304582f,0.944145f,-0.125778f, +0.403446f,0.913254f,-0.0565483f, +0.37426f,0.908704f,0.184893f, +0.255667f,0.895707f,0.363791f, +0.219787f,0.909558f,0.352701f, +0.267099f,0.929513f,0.254289f, +0.378434f,0.885367f,0.270025f, +0.147409f,0.95291f,0.265015f, +-0.0634097f,0.932842f,0.354663f, +-0.0326192f,0.907501f,0.418782f, +-0.118713f,0.911859f,0.392963f, +-0.0609125f,0.902157f,0.427087f, +0.138333f,0.871993f,0.469567f, +-0.0649916f,0.904886f,0.420664f, +-0.383734f,0.861279f,0.333085f, +-0.474942f,0.817835f,0.324924f, +-0.422908f,0.836367f,0.348768f, +-0.339416f,0.853379f,0.395651f, +-0.324702f,0.875389f,0.358137f, +-0.41353f,0.899847f,0.138815f, +-0.448451f,0.884614f,0.12787f, +-0.414049f,0.866279f,0.279505f, +0.070634f,0.912028f,-0.404001f, +-0.0676482f,0.885638f,-0.459422f, +0.0565435f,0.906984f,-0.417353f, +0.246119f,0.879096f,-0.408185f, +0.292529f,0.859337f,-0.419485f, +0.280896f,0.904751f,-0.320192f, +0.320721f,0.917291f,-0.23604f, +0.350916f,0.874365f,-0.335178f, +0.376904f,0.866371f,-0.327636f, +0.17512f,0.962866f,-0.205478f, +0.0176642f,0.987314f,-0.157793f, +0.0227212f,0.982851f,-0.182998f, +0.0272561f,0.971904f,-0.233795f, +-0.0877209f,0.950392f,-0.298429f, +0.0166276f,0.994097f,-0.107211f, +0.266845f,0.962366f,-0.0514236f, +0.216132f,0.934464f,-0.282956f, +0.0993362f,0.906446f,-0.410472f, +-0.0104212f,0.924877f,-0.380123f, +-0.166185f,0.907878f,-0.384889f, +-0.0197905f,0.953108f,-0.301983f, +-0.0183125f,0.962192f,-0.271757f, +0.0845408f,0.976284f,-0.199307f, +0.269635f,0.943751f,-0.191394f, +0.189274f,0.968047f,-0.164501f, +0.102539f,0.979864f,-0.171327f, +0.106979f,0.970988f,-0.213865f, +-0.0373949f,0.962501f,-0.268688f, +-0.0919497f,0.957563f,-0.273163f, +-0.0692205f,0.979823f,-0.187497f, +-0.0661107f,0.993399f,-0.093741f, +0.0537161f,0.998551f,0.00311785f, +0.163558f,0.98647f,-0.0111964f, +0.128373f,0.980868f,-0.146347f, +0.126964f,0.974881f,-0.182993f, +0.228868f,0.973261f,0.0195364f, +0.336464f,0.933228f,0.126005f, +0.409696f,0.899435f,0.152205f, +0.227221f,0.973118f,0.0375761f, +-0.0400449f,0.999001f,-0.0198394f, +-0.0832424f,0.995769f,-0.0389306f, +0.262425f,0.963268f,0.0569854f, +0.380638f,0.919787f,0.0954299f, +0.267185f,0.959941f,0.0844166f, +0.200067f,0.945675f,0.256267f, +0.180437f,0.922348f,0.341639f, +0.274022f,0.906356f,0.321607f, +0.375587f,0.88639f,0.270641f, +0.289567f,0.933145f,0.213051f, +0.118001f,0.9078f,0.402461f, +-0.100351f,0.886215f,0.452275f, +-0.0321373f,0.879207f,0.475355f, +-0.064732f,0.903306f,0.424085f, +-0.117284f,0.933968f,0.337563f, +0.107835f,0.909874f,0.400625f, +-0.00684675f,0.915037f,0.403311f, +-0.3665f,0.879987f,0.302161f, +-0.484488f,0.825175f,0.290444f, +-0.455029f,0.825809f,0.33315f, +-0.355514f,0.861697f,0.362061f, +-0.249905f,0.90704f,0.338859f, +-0.283441f,0.915216f,0.286426f, +-0.489082f,0.840765f,0.232193f, +-0.566036f,0.779585f,0.26805f, +0.300059f,0.882066f,-0.363212f, +0.0511478f,0.860745f,-0.506461f, +0.0202137f,0.82997f,-0.557442f, +0.244641f,0.828925f,-0.503024f, +0.229733f,0.86489f,-0.446306f, +0.151553f,0.888421f,-0.433289f, +0.276054f,0.875076f,-0.397538f, +0.35746f,0.874812f,-0.326997f, +0.20869f,0.962246f,-0.174729f, +0.135202f,0.98952f,0.050694f, +0.0768682f,0.997036f,0.00329808f, +0.0854955f,0.992826f,-0.08359f, +0.0751533f,0.982531f,-0.170249f, +-0.0858423f,0.966447f,-0.242097f, +-0.101218f,0.962967f,-0.2499f, +0.245897f,0.943422f,-0.222463f, +0.411229f,0.896277f,-0.166064f, +0.160383f,0.921177f,-0.354556f, +0.0135902f,0.93936f,-0.342662f, +-0.185366f,0.907574f,-0.37676f, +-0.130182f,0.940725f,-0.313191f, +-0.0326676f,0.972591f,-0.230215f, +0.0675199f,0.972602f,-0.222457f, +0.233107f,0.94649f,-0.2232f, +0.212831f,0.95378f,-0.212148f, +0.167019f,0.9356f,-0.311059f, +0.16946f,0.90555f,-0.388925f, +-0.0763448f,0.914067f,-0.398312f, +-0.178349f,0.9565f,-0.230865f, +-0.221816f,0.964561f,-0.142896f, +-0.163528f,0.986246f,-0.0240246f, +-0.0459992f,0.998297f,0.0358721f, +0.192503f,0.971257f,0.140008f, +0.306262f,0.942491f,0.133843f, +0.166989f,0.985549f,-0.0284312f, +0.110164f,0.988175f,-0.106645f, +0.230491f,0.969982f,-0.0775155f, +0.320779f,0.937031f,0.138109f, +0.2844f,0.912116f,0.295231f, +0.0676957f,0.97278f,0.221621f, +-0.0445371f,0.996486f,0.0709375f, +0.140086f,0.988598f,0.0552233f, +0.294951f,0.934183f,0.200765f, +0.239076f,0.923996f,0.298453f, +0.115077f,0.947116f,0.299546f, +0.169084f,0.942486f,0.288323f, +0.304609f,0.90997f,0.281369f, +0.369662f,0.880322f,0.297294f, +0.206677f,0.906857f,0.36728f, +-0.0427609f,0.882729f,0.467933f, +-0.167345f,0.859324f,0.483279f, +-0.0302574f,0.860894f,0.507884f, +0.0910322f,0.886636f,0.453421f, +-0.0366606f,0.947171f,0.318627f, +0.025939f,0.94095f,0.337552f, +0.0591946f,0.91956f,0.388466f, +-0.284221f,0.911546f,0.297158f, +-0.532586f,0.813173f,0.234739f, +-0.487487f,0.825499f,0.284445f, +-0.31853f,0.893358f,0.316938f, +-0.238637f,0.92505f,0.295524f, +-0.265409f,0.911937f,0.312937f, +-0.505062f,0.827653f,0.244749f, +-0.589625f,0.757122f,0.281262f, +0.260545f,0.875981f,-0.405923f, +0.198469f,0.90372f,-0.379342f, +0.0608985f,0.867502f,-0.493691f, +0.108599f,0.877043f,-0.467977f, +0.149016f,0.918586f,-0.366053f, +0.269933f,0.909568f,-0.315946f, +0.225091f,0.894351f,-0.386613f, +0.14483f,0.975181f,-0.16747f, +0.0237141f,0.999718f,0.00125985f, +0.0312597f,0.997955f,0.0557504f, +0.105656f,0.993029f,0.0522575f, +0.205288f,0.977382f,0.0508146f, +0.175007f,0.977751f,-0.115656f, +0.0411408f,0.976103f,-0.213378f, +-0.0123853f,0.935985f,-0.351821f, +0.185506f,0.902134f,-0.38954f, +0.361594f,0.882471f,-0.300824f, +0.229178f,0.926898f,-0.297216f, +-0.016076f,0.953923f,-0.299621f, +-0.176229f,0.940869f,-0.289326f, +-0.197595f,0.933757f,-0.298419f, +-0.0925101f,0.952321f,-0.290735f, +0.0363018f,0.966473f,-0.254189f, +0.27059f,0.939141f,-0.211649f, +0.283887f,0.910685f,-0.300101f, +0.267987f,0.87929f,-0.39374f, +0.167837f,0.906306f,-0.387866f, +-0.162045f,0.958045f,-0.236411f, +-0.34242f,0.923851f,-0.171018f, +-0.280408f,0.954479f,-0.101693f, +-0.219474f,0.974995f,-0.0348799f, +-0.111179f,0.993643f,0.0176973f, +0.0791225f,0.990452f,0.112896f, +0.243665f,0.947394f,0.207537f, +0.282223f,0.914505f,0.289882f, +0.280685f,0.943977f,0.173563f, +0.165641f,0.985889f,-0.0242044f, +0.0702016f,0.994363f,0.0794649f, +0.118053f,0.960325f,0.252664f, +0.204772f,0.904931f,0.373051f, +0.0632983f,0.962848f,0.262521f, +0.122554f,0.958346f,0.257978f, +0.174517f,0.943136f,0.28291f, +0.181765f,0.923678f,0.337315f, +0.176745f,0.924152f,0.338681f, +0.201711f,0.945597f,0.255262f, +0.29766f,0.929054f,0.219676f, +0.268359f,0.928086f,0.258147f, +0.100906f,0.896734f,0.430912f, +-0.0388415f,0.876619f,0.479615f, +-0.130193f,0.899332f,0.417434f, +0.000668505f,0.914851f,0.403791f, +0.198601f,0.908384f,0.367961f, +0.0382447f,0.953766f,0.298106f, +-0.0134843f,0.968824f,0.247384f, +0.0247843f,0.964757f,0.261972f, +-0.214942f,0.928034f,0.304224f, +-0.51491f,0.834181f,0.197508f, +-0.514132f,0.845f,0.147116f, +-0.364403f,0.910649f,0.194754f, +-0.252308f,0.925047f,0.283953f, +-0.245043f,0.926077f,0.286941f, +-0.475784f,0.852889f,0.214964f, +-0.66621f,0.724577f,0.176499f, +0.0831836f,0.888999f,-0.45029f, +0.181271f,0.909397f,-0.374349f, +0.118635f,0.893305f,-0.433511f, +0.0803087f,0.896743f,-0.435204f, +0.0532614f,0.909245f,-0.41284f, +0.209897f,0.941844f,-0.262435f, +0.164344f,0.979747f,-0.114402f, +-0.0796744f,0.996148f,-0.0366233f, +-0.0133458f,0.996096f,0.0872637f, +0.0764545f,0.99532f,0.0590999f, +0.136206f,0.990597f,0.0128964f, +0.22076f,0.975032f,-0.0240476f, +0.302428f,0.952936f,-0.021205f, +0.123508f,0.990766f,-0.0559322f, +0.0598433f,0.996046f,-0.06566f, +0.217088f,0.972764f,-0.0812636f, +0.324106f,0.93941f,-0.111642f, +0.231973f,0.969426f,-0.0800149f, +-0.0239272f,0.988929f,-0.146448f, +-0.168479f,0.969286f,-0.179165f, +-0.198758f,0.9628f,-0.183064f, +-0.0847832f,0.988177f,-0.12774f, +-0.00304443f,0.993662f,-0.112364f, +0.297886f,0.949812f,-0.0955022f, +0.392699f,0.900627f,-0.186169f, +0.309254f,0.921444f,-0.235165f, +-0.0368216f,0.992281f,-0.118418f, +-0.30784f,0.939111f,0.152661f, +-0.339391f,0.929078f,0.147065f, +-0.31987f,0.942094f,0.100706f, +-0.261939f,0.955297f,0.137099f, +-0.18149f,0.977639f,0.106224f, +-0.0176854f,0.987381f,0.157371f, +0.134774f,0.952305f,0.273773f, +0.227558f,0.898637f,0.375058f, +0.367312f,0.872839f,0.3213f, +0.289472f,0.940027f,0.180432f, +0.0121921f,0.995617f,0.0927227f, +-0.0151053f,0.984704f,0.173582f, +0.12465f,0.941586f,0.312855f, +0.123765f,0.936041f,0.329407f, +0.0496474f,0.956015f,0.289087f, +0.155803f,0.919433f,0.361065f, +0.180039f,0.912678f,0.366885f, +0.192318f,0.910529f,0.365993f, +0.269572f,0.892548f,0.361509f, +0.331198f,0.898525f,0.288029f, +0.198758f,0.948186f,0.247866f, +-0.0345441f,0.951973f,0.304226f, +-0.0327497f,0.929484f,0.367404f, +-0.0643392f,0.937143f,0.342962f, +0.00774044f,0.965859f,0.258952f, +0.179174f,0.948429f,0.261495f, +0.132443f,0.935778f,0.32677f, +0.0607758f,0.973146f,0.222018f, +-0.0289622f,0.977742f,0.2078f, +-0.247283f,0.928769f,0.276114f, +-0.440694f,0.866976f,0.232681f, +-0.493254f,0.853754f,0.166745f, +-0.437376f,0.881741f,0.176734f, +-0.303558f,0.920161f,0.247297f, +-0.230002f,0.942128f,0.243914f, +-0.435382f,0.879414f,0.192544f, +-0.672886f,0.738322f,0.045878f, +0.0719528f,0.93004f,-0.360345f, +0.170321f,0.920666f,-0.351232f, +0.181011f,0.922477f,-0.340985f, +0.0828362f,0.939404f,-0.332654f, +-0.0227994f,0.947238f,-0.31972f, +-0.0485785f,0.963562f,-0.263036f, +0.0586424f,0.995988f,-0.0676002f, +-0.0660447f,0.996659f,-0.0480482f, +-0.0602898f,0.992772f,-0.103773f, +0.058767f,0.996066f,-0.0663303f, +0.189158f,0.981943f,0.00282556f, +0.237805f,0.968932f,-0.0679702f, +0.226076f,0.973949f,-0.0176966f, +0.0903031f,0.990597f,0.102775f, +0.00876316f,0.995102f,0.0984623f, +0.239141f,0.958139f,0.157419f, +0.358816f,0.926379f,0.11434f, +0.290281f,0.955997f,0.0425008f, +0.0827916f,0.995067f,-0.054651f, +-0.14974f,0.985436f,-0.0805802f, +-0.250148f,0.9681f,-0.0144092f, +-0.190918f,0.980525f,0.0460446f, +0.000678111f,0.99542f,0.0955933f, +0.316233f,0.948486f,0.019255f, +0.451155f,0.892443f,0.00187563f, +0.20864f,0.975493f,0.0698802f, +-0.187263f,0.946264f,0.263661f, +-0.412354f,0.843904f,0.343207f, +-0.267988f,0.899756f,0.344414f, +-0.237384f,0.936767f,0.25713f, +-0.24929f,0.96341f,0.0984657f, +-0.12508f,0.979898f,0.155419f, +-0.075281f,0.975532f,0.206567f, +-0.0362475f,0.956877f,0.288223f, +0.179598f,0.903623f,0.388856f, +0.452503f,0.830262f,0.325433f, +0.44384f,0.859576f,0.253251f, +0.0283124f,0.992393f,0.119807f, +-0.131018f,0.979645f,0.152082f, +-0.0108162f,0.971878f,0.235238f, +0.177243f,0.920605f,0.347953f, +0.0690998f,0.954542f,0.289956f, +0.0964158f,0.939858f,0.327675f, +0.141817f,0.921257f,0.362178f, +0.189018f,0.897606f,0.398216f, +0.266469f,0.899974f,0.345024f, +0.359545f,0.871551f,0.333357f, +0.237931f,0.897592f,0.371104f, +-0.0217966f,0.934365f,0.355651f, +-0.0978092f,0.948287f,0.30197f, +0.00875447f,0.940305f,0.340221f, +0.0870369f,0.963741f,0.252246f, +0.143744f,0.964801f,0.220218f, +0.0987042f,0.960888f,0.25875f, +0.124661f,0.953903f,0.273f, +-0.0397023f,0.970451f,0.238011f, +-0.294392f,0.938787f,0.17892f, +-0.415783f,0.892445f,0.175119f, +-0.502145f,0.854833f,0.130809f, +-0.438287f,0.876552f,0.198899f, +-0.315043f,0.920499f,0.231147f, +-0.194294f,0.951114f,0.240065f, +-0.351808f,0.923717f,0.151587f, +-0.54821f,0.835857f,0.0284484f, +0.0750917f,0.989867f,-0.120519f, +0.16891f,0.981624f,-0.0887941f, +0.190217f,0.976992f,-0.0964579f, +0.031324f,0.983953f,-0.175657f, +-0.0605958f,0.993695f,-0.0943344f, +-0.0750681f,0.99685f,-0.025582f, +-0.0331924f,0.999431f,-0.00606515f, +-0.0198899f,0.99954f,0.0228873f, +-0.0160511f,0.998799f,-0.0462827f, +0.0298246f,0.995221f,-0.092978f, +0.113995f,0.985706f,-0.124048f, +0.249662f,0.968309f,-0.00683024f, +0.100872f,0.992347f,0.0712218f, +0.0920036f,0.982533f,0.161755f, +0.0527146f,0.998589f,-0.00636128f, +0.182827f,0.9816f,-0.0550969f, +0.393766f,0.919069f,-0.0161334f, +0.337394f,0.941358f,0.00313128f, +0.105574f,0.990777f,0.0849468f, +-0.199161f,0.971911f,0.125398f, +-0.309481f,0.93868f,0.151989f, +-0.20903f,0.965522f,0.15516f, +0.0624223f,0.987754f,0.142987f, +0.384312f,0.922399f,0.0385395f, +0.395292f,0.916973f,0.0539f, +-0.00445825f,0.983693f,0.179798f, +-0.32103f,0.866957f,0.381215f, +-0.378167f,0.863609f,0.33342f, +-0.220175f,0.926633f,0.304752f, +-0.0614943f,0.950074f,0.305906f, +-0.12116f,0.98024f,0.156364f, +-0.278268f,0.956461f,0.0880323f, +-0.168756f,0.960122f,0.222908f, +-0.0650574f,0.977781f,0.199281f, +0.11325f,0.979757f,0.165078f, +0.469769f,0.846474f,0.250598f, +0.492575f,0.830428f,0.260305f, +0.123756f,0.962501f,0.241404f, +-0.13585f,0.964887f,0.224807f, +-0.0763658f,0.97309f,0.217403f, +0.0878568f,0.965257f,0.246088f, +0.105594f,0.951417f,0.289233f, +0.0757959f,0.967864f,0.239781f, +0.0993833f,0.975608f,0.195732f, +0.186309f,0.954458f,0.23302f, +0.338273f,0.909543f,0.241458f, +0.326788f,0.907649f,0.263405f, +0.193788f,0.920444f,0.339454f, +0.0304147f,0.954662f,0.296135f, +-0.0232537f,0.980981f,0.192706f, +0.000389577f,0.986091f,0.166207f, +0.0882095f,0.967853f,0.235542f, +0.188357f,0.927906f,0.321731f, +0.0670292f,0.972109f,0.224745f, +0.0943312f,0.961869f,0.256728f, +0.0613113f,0.959756f,0.274061f, +-0.207348f,0.967924f,0.141881f, +-0.415608f,0.907723f,0.0575284f, +-0.500123f,0.863342f,0.0672098f, +-0.492039f,0.866172f,0.0874256f, +-0.354073f,0.931677f,0.0813054f, +-0.181316f,0.978479f,0.0985071f, +-0.266622f,0.956284f,0.120138f, +-0.442863f,0.891447f,0.0958846f, +-0.0871303f,0.98944f,-0.115829f, +0.0906659f,0.9958f,-0.0127409f, +0.283182f,0.958456f,0.0342056f, +0.0813038f,0.994836f,-0.0607581f, +-0.14732f,0.989082f,0.00362058f, +-0.15085f,0.987502f,0.0456442f, +-0.0204288f,0.99901f,0.039516f, +0.00607957f,0.996993f,-0.0772516f, +0.0245166f,0.989435f,-0.142892f, +0.112542f,0.984768f,-0.132539f, +0.117701f,0.980135f,-0.159633f, +0.0712861f,0.996099f,-0.0520052f, +0.0255235f,0.995475f,0.0915291f, +0.102558f,0.988742f,0.10895f, +0.263691f,0.960156f,0.0925667f, +0.248163f,0.965214f,-0.0823197f, +0.340591f,0.934756f,-0.101139f, +0.19652f,0.980248f,0.0222232f, +-0.0707824f,0.98306f,0.169067f, +-0.214629f,0.938414f,0.270766f, +-0.253216f,0.94197f,0.220395f, +-0.140751f,0.981088f,0.132876f, +0.0855474f,0.99626f,0.0121329f, +0.407822f,0.912623f,0.0283097f, +0.314806f,0.941456f,0.120654f, +-0.127318f,0.956166f,0.263699f, +-0.403379f,0.856412f,0.322248f, +-0.326125f,0.89105f,0.315709f, +-0.192548f,0.934549f,0.29924f, +-0.115959f,0.956033f,0.26936f, +-0.0455884f,0.940005f,0.3381f, +-0.221624f,0.931041f,0.289905f, +-0.142796f,0.963558f,0.226198f, +0.0818112f,0.991531f,0.100865f, +0.115133f,0.989689f,-0.0852087f, +0.362891f,0.931224f,-0.0336289f, +0.464909f,0.869676f,0.1659f, +0.12135f,0.938462f,0.323362f, +-0.154102f,0.92745f,0.340718f, +-0.00840056f,0.94535f,0.325948f, +0.0978542f,0.97811f,0.183647f, +0.11792f,0.982347f,0.145222f, +0.146369f,0.980631f,0.130149f, +0.169334f,0.978423f,0.118383f, +0.164013f,0.985699f,0.0386944f, +0.265906f,0.961228f,0.0730397f, +0.245913f,0.944548f,0.217615f, +0.193695f,0.94265f,0.271832f, +0.193351f,0.95598f,0.22072f, +0.0582845f,0.995708f,0.0718875f, +-0.00685416f,0.998237f,0.0589609f, +-0.0637908f,0.997757f,0.0202719f, +0.11477f,0.985697f,0.123411f, +0.150647f,0.970382f,0.188848f, +0.0830539f,0.976206f,0.200309f, +0.0503424f,0.976583f,0.20917f, +-0.0756986f,0.967299f,0.242081f, +-0.38538f,0.913963f,0.127097f, +-0.499709f,0.856093f,0.131896f, +-0.457912f,0.888414f,0.0322019f, +-0.285439f,0.956482f,-0.0605596f, +-0.224005f,0.968049f,-0.112706f, +-0.33892f,0.940492f,-0.0246551f, +-0.468811f,0.882994f,0.0231736f, +-0.219323f,0.927554f,-0.302556f, +0.0032435f,0.972826f,-0.231515f, +0.227016f,0.959392f,-0.167423f, +0.0751831f,0.995555f,-0.0567285f, +-0.21163f,0.975526f,-0.0596754f, +-0.120787f,0.989714f,-0.0766664f, +0.103292f,0.984862f,-0.139202f, +0.130327f,0.957045f,-0.258998f, +0.100597f,0.957666f,-0.269734f, +0.0434385f,0.943793f,-0.327671f, +-0.00659457f,0.974177f,-0.225689f, +-0.0387678f,0.996731f,-0.0708824f, +0.0108947f,0.998722f,-0.049343f, +0.045379f,0.994354f,-0.0959194f, +0.256328f,0.966322f,0.0227405f, +0.338426f,0.940797f,0.0191927f, +0.245639f,0.967185f,0.0649251f, +0.104201f,0.958601f,0.265004f, +-0.106481f,0.952706f,0.284628f, +-0.229215f,0.947098f,0.224647f, +-0.194403f,0.966329f,0.168569f, +-0.00252669f,0.996043f,0.0888332f, +0.156392f,0.987666f,-0.00755935f, +0.321695f,0.943636f,0.0778705f, +0.130492f,0.960095f,0.247363f, +-0.218806f,0.887212f,0.406175f, +-0.387978f,0.851763f,0.352097f, +-0.317465f,0.905687f,0.280974f, +-0.175202f,0.945708f,0.273753f, +-0.0852507f,0.952748f,0.291554f, +-0.110501f,0.951599f,0.28679f, +-0.162568f,0.933525f,0.319534f, +-0.0379096f,0.973407f,0.225923f, +0.243134f,0.964593f,0.102203f, +0.236277f,0.971524f,-0.017745f, +0.298887f,0.954255f,-0.00800205f, +0.225509f,0.966982f,0.118704f, +-0.0160588f,0.939828f,0.341271f, +-0.127862f,0.916925f,0.378021f, +0.078893f,0.93958f,0.333116f, +0.244086f,0.933689f,0.262004f, +0.186692f,0.967385f,0.17121f, +0.108188f,0.990525f,0.0845894f, +0.174941f,0.977766f,0.115627f, +0.231991f,0.970242f,0.0693606f, +0.186114f,0.981267f,0.0497696f, +0.166608f,0.977012f,0.133002f, +0.191728f,0.971565f,0.138929f, +0.25765f,0.957218f,0.131718f, +0.087274f,0.989729f,0.113225f, +-0.00280678f,0.977756f,0.209725f, +0.0607703f,0.980671f,0.185986f, +0.0485237f,0.997381f,0.053629f, +0.0587736f,0.987863f,0.14378f, +0.0482407f,0.976088f,0.211956f, +0.0134663f,0.978159f,0.20742f, +-0.112292f,0.962623f,0.246469f, +-0.319272f,0.919627f,0.228803f, +-0.453582f,0.883075f,0.120176f, +-0.338159f,0.939324f,0.0576029f, +-0.23768f,0.971299f,-0.0092623f, +-0.191895f,0.980604f,-0.0399f, +-0.401044f,0.906011f,-0.135303f, +-0.489506f,0.868205f,-0.081269f, +-0.196977f,0.901169f,-0.386128f, +-0.0562291f,0.922285f,-0.382399f, +0.0867548f,0.952728f,-0.291176f, +0.0232316f,0.988917f,-0.146644f, +-0.11605f,0.968007f,-0.222475f, +-0.0789033f,0.942785f,-0.323929f, +0.139529f,0.948189f,-0.285427f, +0.132434f,0.962288f,-0.23762f, +0.0765905f,0.96807f,-0.238692f, +0.0641003f,0.96574f,-0.251472f, +-0.105766f,0.965216f,-0.239106f, +-0.110895f,0.972771f,-0.203515f, +0.0206339f,0.984024f,-0.176838f, +0.0647147f,0.988173f,-0.139018f, +0.148599f,0.980872f,-0.125734f, +0.271512f,0.961735f,0.0367049f, +0.0561912f,0.976773f,0.206777f, +-0.0583132f,0.913697f,0.402191f, +-0.0462589f,0.893353f,0.446968f, +-0.125152f,0.910112f,0.39501f, +-0.0803843f,0.940756f,0.329418f, +0.0619859f,0.973174f,0.221562f, +0.135828f,0.971328f,0.195124f, +0.132962f,0.954202f,0.267992f, +-0.0325488f,0.903596f,0.427147f, +-0.270164f,0.841605f,0.467668f, +-0.262238f,0.850223f,0.456456f, +-0.212116f,0.889937f,0.403757f, +-0.177521f,0.909486f,0.375929f, +-0.116828f,0.901627f,0.416436f, +-0.0747169f,0.915103f,0.396238f, +-0.119776f,0.962629f,0.242896f, +0.0380452f,0.99097f,0.128572f, +0.304108f,0.937317f,0.17016f, +0.240764f,0.951762f,0.190215f, +0.194326f,0.952804f,0.233243f, +0.142453f,0.936947f,0.31912f, +-0.0935081f,0.945618f,0.31155f, +-0.0887705f,0.956167f,0.27904f, +0.107828f,0.967058f,0.230592f, +0.241042f,0.935322f,0.258984f, +0.259409f,0.922717f,0.285133f, +0.218487f,0.962504f,0.160778f, +0.220571f,0.975062f,0.0245473f, +0.235132f,0.971421f,-0.0324531f, +0.193322f,0.980828f,0.0245576f, +0.123827f,0.992302f,-0.00201728f, +0.206505f,0.97706f,0.0520531f, +0.250594f,0.965023f,0.0770254f, +0.0246334f,0.99033f,0.136524f, +-0.123437f,0.964871f,0.231923f, +0.10276f,0.956911f,0.271591f, +0.090829f,0.970486f,0.223397f, +0.00393218f,0.964068f,0.265627f, +0.045739f,0.962581f,0.267105f, +0.0438394f,0.968724f,0.244235f, +-0.1348f,0.971521f,0.194876f, +-0.247965f,0.950768f,0.185883f, +-0.385563f,0.920067f,0.0694089f, +-0.33646f,0.941527f,0.0179056f, +-0.284408f,0.957673f,0.0444463f, +-0.0809611f,0.98246f,0.167982f, +-0.272195f,0.961849f,0.0275091f, +-0.538305f,0.840251f,-0.0648443f, +-0.138085f,0.947265f,-0.289173f, +-0.112292f,0.943405f,-0.312055f, +-0.0366032f,0.968339f,-0.246942f, +-0.0207584f,0.978499f,-0.205204f, +-0.0114432f,0.978269f,-0.207024f, +-0.017206f,0.978017f,-0.207814f, +-0.00196221f,0.968739f,-0.248075f, +0.111459f,0.982805f,-0.147209f, +0.0917515f,0.980196f,-0.175495f, +0.0783409f,0.987595f,-0.136083f, +-0.0849004f,0.981698f,-0.170473f, +-0.0826208f,0.969176f,-0.232103f, +-0.0513296f,0.962825f,-0.265205f, +-0.0169212f,0.988046f,-0.153227f, +0.0442536f,0.99886f,0.017891f, +0.0803284f,0.974024f,0.211719f, +-0.118041f,0.942704f,0.312052f, +-0.187621f,0.893485f,0.408023f, +-0.0735772f,0.857937f,0.508459f, +-0.0838693f,0.837024f,0.5407f, +-0.00356882f,0.863268f,0.504733f, +0.117551f,0.889838f,0.440874f, +0.141271f,0.893306f,0.426669f, +0.0270129f,0.906148f,0.422097f, +-0.109486f,0.851548f,0.512717f, +-0.266831f,0.814637f,0.514944f, +-0.253628f,0.788787f,0.559899f, +-0.216685f,0.776961f,0.591083f, +-0.15137f,0.760068f,0.631968f, +-0.119157f,0.801398f,0.586143f, +0.0626697f,0.817134f,0.573031f, +0.150716f,0.886392f,0.437714f, +0.0719955f,0.965525f,0.250157f, +0.170594f,0.93758f,0.303054f, +0.205981f,0.906978f,0.367374f, +0.159242f,0.93166f,0.326575f, +0.163686f,0.939188f,0.301881f, +0.00255834f,0.983457f,0.181126f, +-0.0246414f,0.997684f,0.063397f, +0.103068f,0.994148f,0.0323463f, +0.175261f,0.977189f,0.119941f, +0.238397f,0.946614f,0.216998f, +0.376211f,0.893689f,0.244508f, +0.336321f,0.93903f,0.0714918f, +0.22632f,0.974025f,-0.00733613f, +0.155366f,0.98668f,0.0481989f, +0.129371f,0.988467f,0.0787169f, +0.140766f,0.985457f,0.095182f, +0.181141f,0.974304f,0.133867f, +-0.0259321f,0.983166f,0.180868f, +-0.16382f,0.974748f,0.151756f, +0.12842f,0.977623f,0.166619f, +0.102805f,0.986615f,0.12658f, +-0.0352231f,0.991461f,0.125559f, +0.0344472f,0.990276f,0.134782f, +0.100258f,0.97877f,0.178768f, +-0.0763414f,0.992566f,0.0947915f, +-0.24142f,0.968616f,0.059149f, +-0.325267f,0.943242f,0.06705f, +-0.302069f,0.9528f,0.0304413f, +-0.317187f,0.948361f,-0.0017587f, +-0.219267f,0.973832f,0.059775f, +-0.187608f,0.954493f,0.231832f, +-0.46452f,0.867868f,0.176143f, +-0.203418f,0.948131f,-0.244273f, +-0.139664f,0.973265f,-0.182342f, +-0.0536959f,0.988785f,-0.139361f, +-0.00355604f,0.986781f,-0.162022f, +-0.0572809f,0.980561f,-0.187669f, +-0.0374007f,0.985205f,-0.167247f, +0.0555765f,0.976159f,-0.209822f, +0.0908927f,0.962348f,-0.256173f, +0.0600715f,0.972748f,-0.223946f, +0.0442581f,0.987652f,-0.150282f, +-0.0260568f,0.986636f,-0.160841f, +-0.0937884f,0.986183f,-0.136552f, +-0.00585357f,0.999959f,-0.00691373f, +-0.168872f,0.982349f,-0.0804476f, +-0.215485f,0.975309f,0.0483622f, +-0.0961691f,0.964354f,0.246521f, +-0.114487f,0.922048f,0.369757f, +-0.269656f,0.899414f,0.344007f, +-0.21772f,0.897789f,0.382849f, +-0.126818f,0.886934f,0.444145f, +0.0624514f,0.872607f,0.484415f, +0.170504f,0.863439f,0.474764f, +0.127681f,0.882519f,0.452612f, +0.0249418f,0.887332f,0.460457f, +-0.228952f,0.87943f,0.417354f, +-0.336679f,0.801754f,0.493799f, +-0.354676f,0.742594f,0.568119f, +-0.265358f,0.728648f,0.631393f, +-0.0874663f,0.774696f,0.626255f, +0.0313715f,0.816845f,0.576004f, +0.138491f,0.877406f,0.459325f, +0.251487f,0.873743f,0.416325f, +0.149012f,0.891076f,0.428695f, +0.134082f,0.895567f,0.424244f, +0.259356f,0.879751f,0.398462f, +0.273738f,0.923515f,0.268677f, +0.242075f,0.954352f,0.174962f, +0.166067f,0.977105f,0.132992f, +0.0519593f,0.998404f,0.022142f, +0.0706628f,0.997395f,0.0145074f, +0.0910476f,0.994722f,0.0473141f, +0.126598f,0.990827f,0.0472679f, +0.33108f,0.937289f,0.108974f, +0.427456f,0.888646f,0.166103f, +0.265492f,0.95292f,0.14648f, +0.0868945f,0.990384f,0.10765f, +0.0739344f,0.98242f,0.171417f, +0.14882f,0.964095f,0.219937f, +0.160065f,0.969614f,0.185009f, +0.0379065f,0.980794f,0.191328f, +-0.111879f,0.992654f,0.0460448f, +0.101571f,0.994616f,0.0205655f, +0.134276f,0.987226f,0.0857599f, +0.00322228f,0.996946f,0.0780295f, +-0.00585508f,0.99961f,0.0273218f, +0.102527f,0.992913f,0.0601057f, +-0.0243337f,0.999696f,0.00385478f, +-0.236106f,0.971591f,0.0163038f, +-0.335881f,0.941896f,0.00400261f, +-0.319925f,0.947097f,0.0255887f, +-0.262465f,0.960477f,0.0927118f, +-0.320184f,0.947305f,-0.00973767f, +-0.358146f,0.929034f,0.0928862f, +-0.431591f,0.882961f,0.184686f, +-0.350194f,0.913588f,-0.20669f, +-0.241714f,0.958821f,-0.149118f, +-0.0874799f,0.991928f,-0.0917931f, +-0.00637736f,0.998289f,-0.0581162f, +0.0261719f,0.997729f,-0.0620574f, +0.00430678f,0.979141f,-0.203135f, +0.121705f,0.971178f,-0.20494f, +0.10219f,0.965909f,-0.237861f, +0.00407698f,0.957171f,-0.289495f, +-0.0386862f,0.968014f,-0.247897f, +-0.0509849f,0.995926f,-0.0743816f, +-0.228245f,0.973592f,-0.00474817f, +-0.140696f,0.979081f,0.146984f, +-0.104046f,0.966867f,0.233113f, +-0.254332f,0.94315f,0.213969f, +-0.211685f,0.953746f,0.213442f, +-0.245201f,0.93619f,0.251844f, +-0.247199f,0.912647f,0.325527f, +-0.213426f,0.932543f,0.291228f, +-0.170741f,0.942588f,0.28701f, +-0.0363946f,0.943193f,0.330245f, +0.169433f,0.88607f,0.431478f, +0.12169f,0.89261f,0.434096f, +0.0508642f,0.869951f,0.490509f, +-0.175065f,0.875657f,0.450086f, +-0.464211f,0.815419f,0.345833f, +-0.467728f,0.796275f,0.383635f, +-0.295863f,0.865688f,0.403795f, +-0.0706376f,0.91172f,0.404693f, +0.151265f,0.880258f,0.449738f, +0.239887f,0.896678f,0.372052f, +0.270966f,0.902061f,0.335952f, +0.133682f,0.938928f,0.317085f, +0.132181f,0.949509f,0.284538f, +0.337234f,0.911457f,0.235624f, +0.391568f,0.908725f,0.144547f, +0.297707f,0.949115f,0.10272f, +0.163642f,0.985787f,0.038011f, +0.0603665f,0.994817f,0.0818182f, +0.0342529f,0.984393f,0.172617f, +0.146f,0.969394f,0.197379f, +0.189586f,0.979398f,0.0695505f, +0.32179f,0.946595f,0.0202369f, +0.339913f,0.938655f,0.0581868f, +0.255631f,0.940824f,0.222493f, +0.130905f,0.959362f,0.249975f, +0.0245005f,0.97884f,0.203155f, +0.116898f,0.96642f,0.228839f, +0.217161f,0.952887f,0.211771f, +0.0905814f,0.991503f,0.0933592f, +0.00963547f,0.999795f,0.0178162f, +0.0707892f,0.997359f,-0.0162393f, +0.0454623f,0.996335f,0.0724521f, +0.025845f,0.99119f,0.129903f, +0.0553395f,0.998031f,0.0295398f, +0.0632528f,0.997901f,0.0138837f, +-0.000723073f,0.987186f,0.159572f, +-0.246121f,0.956173f,0.158611f, +-0.292993f,0.948379f,0.121377f, +-0.358856f,0.933219f,0.0180357f, +-0.312153f,0.948631f,0.0515794f, +-0.263061f,0.955548f,0.133141f, +-0.387996f,0.907685f,0.159898f, +-0.516559f,0.845117f,0.137638f, +-0.310178f,0.948377f,-0.0661154f, +-0.300026f,0.949757f,-0.0891454f, +-0.137668f,0.990363f,0.0151269f, +-0.0326899f,0.997118f,0.0684562f, +0.0835016f,0.994462f,0.0638203f, +0.0992766f,0.995028f,0.00796582f, +0.068628f,0.997514f,-0.0159775f, +0.181484f,0.983266f,0.0158879f, +0.0929905f,0.991619f,-0.0896955f, +-0.159863f,0.9831f,-0.0892104f, +-0.274969f,0.956779f,0.094689f, +-0.2578f,0.933703f,0.248472f, +-0.255563f,0.934109f,0.249254f, +-0.183445f,0.905456f,0.382751f, +-0.258353f,0.860148f,0.439771f, +-0.12588f,0.873686f,0.469923f, +-0.210169f,0.916013f,0.341684f, +-0.272883f,0.91339f,0.302083f, +-0.180317f,0.937251f,0.298406f, +-0.199625f,0.942232f,0.268977f, +-0.0859427f,0.9396f,0.33131f, +0.0831524f,0.928739f,0.361288f, +0.0997333f,0.904186f,0.415333f, +-0.0517762f,0.893569f,0.445931f, +-0.109718f,0.87826f,0.465426f, +-0.369685f,0.848108f,0.379534f, +-0.446603f,0.811841f,0.376112f, +-0.267849f,0.883969f,0.383218f, +-0.10672f,0.930725f,0.349801f, +0.10205f,0.92892f,0.355941f, +0.253281f,0.903219f,0.346475f, +0.270898f,0.880967f,0.387957f, +0.236849f,0.896348f,0.374784f, +0.206634f,0.946539f,0.247723f, +0.405577f,0.89206f,0.199342f, +0.379351f,0.915673f,0.1328f, +0.334598f,0.922412f,0.192872f, +0.211991f,0.969195f,0.125385f, +-0.0201216f,0.993487f,0.112152f, +-0.0648495f,0.986484f,0.150479f, +0.170924f,0.975936f,0.135405f, +0.29249f,0.9553f,0.0430209f, +0.300918f,0.953641f,0.00421578f, +0.280252f,0.954656f,0.100457f, +0.110799f,0.982326f,0.150862f, +0.111953f,0.970209f,0.214852f, +0.0917898f,0.974074f,0.206772f, +0.0706157f,0.981239f,0.179398f, +0.263217f,0.920389f,0.289137f, +0.266708f,0.942871f,0.199653f, +0.0169344f,0.99983f,0.00724636f, +0.0586405f,0.99674f,0.0554216f, +-0.0335948f,0.99924f,0.0197934f, +0.0130139f,0.996641f,0.0808552f, +0.158081f,0.974057f,0.161934f, +-0.0718701f,0.984912f,0.157428f, +-0.146615f,0.930223f,0.336437f, +-0.215441f,0.915614f,0.339465f, +-0.194576f,0.929319f,0.313857f, +-0.21244f,0.956751f,0.198736f, +-0.353032f,0.933914f,0.0563254f, +-0.387138f,0.913346f,0.126188f, +-0.421226f,0.884098f,0.202334f, +-0.478159f,0.863227f,0.161871f, +-0.144962f,0.987796f,0.0569687f, +-0.329752f,0.937067f,-0.114758f, +-0.228627f,0.973393f,0.0153452f, +-0.0297707f,0.988896f,0.1456f, +0.0737235f,0.992418f,0.0983429f, +0.119683f,0.983634f,0.134687f, +0.0735029f,0.988539f,0.131863f, +0.205816f,0.971725f,0.115713f, +0.105316f,0.994111f,0.0255379f, +-0.224655f,0.970814f,0.0839657f, +-0.371877f,0.9075f,0.195325f, +-0.304303f,0.906448f,0.292833f, +-0.280483f,0.900657f,0.331883f, +-0.306628f,0.862929f,0.401664f, +-0.272078f,0.807801f,0.522907f, +-0.0728986f,0.827771f,0.55631f, +-0.0766844f,0.868115f,0.490404f, +-0.262952f,0.903979f,0.337163f, +-0.116268f,0.92805f,0.353844f, +-0.236581f,0.941122f,0.241494f, +-0.103825f,0.933685f,0.342713f, +0.0620174f,0.936003f,0.346485f, +0.0525461f,0.928042f,0.368751f, +-0.037371f,0.900626f,0.432986f, +-0.0859425f,0.920181f,0.381944f, +-0.402084f,0.867474f,0.292945f, +-0.458834f,0.792013f,0.402725f, +-0.247545f,0.839465f,0.483756f, +-0.0206347f,0.857039f,0.514838f, +0.131938f,0.906082f,0.402004f, +0.260907f,0.906936f,0.330749f, +0.222736f,0.912076f,0.344246f, +0.286017f,0.867948f,0.406029f, +0.265664f,0.918021f,0.29438f, +0.386646f,0.888781f,0.246116f, +0.416594f,0.869611f,0.265003f, +0.291338f,0.924889f,0.244341f, +0.264598f,0.920497f,0.287528f, +-0.0209737f,0.965015f,0.261353f, +0.011928f,0.966786f,0.255307f, +0.209759f,0.975171f,0.0710066f, +0.379568f,0.924828f,0.0249204f, +0.227757f,0.968062f,-0.104795f, +0.230276f,0.968937f,0.0901831f, +0.121279f,0.97806f,0.169381f, +0.101139f,0.989453f,0.103701f, +0.125341f,0.986876f,0.101809f, +0.00931107f,0.998148f,0.0601183f, +0.147262f,0.96746f,0.205755f, +0.372526f,0.861294f,0.34554f, +0.0770606f,0.989688f,0.120749f, +0.0673416f,0.990666f,0.11852f, +0.0242126f,0.998823f,0.0420167f, +-0.0975945f,0.993903f,-0.0513095f, +0.0117629f,0.986762f,0.16175f, +-0.119035f,0.908985f,0.399472f, +-0.171696f,0.877378f,0.448027f, +-0.168225f,0.894295f,0.414653f, +-0.158105f,0.915758f,0.369311f, +-0.0984338f,0.938718f,0.330333f, +-0.319812f,0.930617f,0.177966f, +-0.398204f,0.897351f,0.190248f, +-0.414882f,0.896338f,0.156369f, +-0.434877f,0.894265f,0.105701f, +}; + +btScalar Landscape07Tex[] = { +0.507813f,0.742188f, +0.507813f,0.734375f, +0.515625f,0.742188f, +0.515625f,0.734375f, +0.523438f,0.742188f, +0.523438f,0.734375f, +0.53125f,0.742188f, +0.53125f,0.734375f, +0.539063f,0.742188f, +0.539063f,0.734375f, +0.546875f,0.742188f, +0.546875f,0.734375f, +0.554688f,0.742188f, +0.554688f,0.734375f, +0.5625f,0.742188f, +0.5625f,0.734375f, +0.570313f,0.742188f, +0.570313f,0.734375f, +0.578125f,0.742188f, +0.578125f,0.734375f, +0.585938f,0.742188f, +0.585938f,0.734375f, +0.59375f,0.742188f, +0.59375f,0.734375f, +0.601563f,0.742188f, +0.601563f,0.734375f, +0.609375f,0.742188f, +0.609375f,0.734375f, +0.617188f,0.742188f, +0.617188f,0.734375f, +0.625f,0.742188f, +0.625f,0.734375f, +0.632813f,0.742188f, +0.632813f,0.734375f, +0.640625f,0.742188f, +0.640625f,0.734375f, +0.648438f,0.742188f, +0.648438f,0.734375f, +0.65625f,0.742188f, +0.65625f,0.734375f, +0.664063f,0.742188f, +0.664063f,0.734375f, +0.671875f,0.742188f, +0.671875f,0.734375f, +0.679688f,0.742188f, +0.679688f,0.734375f, +0.6875f,0.742188f, +0.6875f,0.734375f, +0.695313f,0.742188f, +0.695313f,0.734375f, +0.703125f,0.742188f, +0.703125f,0.734375f, +0.710938f,0.742188f, +0.710938f,0.734375f, +0.71875f,0.742188f, +0.71875f,0.734375f, +0.726563f,0.742188f, +0.726563f,0.734375f, +0.734375f,0.742188f, +0.734375f,0.734375f, +0.742188f,0.742188f, +0.742188f,0.734375f, +0.75f,0.742188f, +0.75f,0.734375f, +0.757813f,0.742188f, +0.757813f,0.734375f, +0.765625f,0.742188f, +0.765625f,0.734375f, +0.773438f,0.742188f, +0.773438f,0.734375f, +0.78125f,0.742188f, +0.78125f,0.734375f, +0.789063f,0.742188f, +0.789063f,0.734375f, +0.796875f,0.742188f, +0.796875f,0.734375f, +0.804688f,0.742188f, +0.804688f,0.734375f, +0.8125f,0.742188f, +0.8125f,0.734375f, +0.820313f,0.742188f, +0.820313f,0.734375f, +0.828125f,0.742188f, +0.828125f,0.734375f, +0.835938f,0.742188f, +0.835938f,0.734375f, +0.84375f,0.742188f, +0.84375f,0.734375f, +0.851563f,0.742188f, +0.851563f,0.734375f, +0.859375f,0.742188f, +0.859375f,0.734375f, +0.867188f,0.742188f, +0.867188f,0.734375f, +0.875f,0.742188f, +0.875f,0.734375f, +0.882813f,0.742188f, +0.882813f,0.734375f, +0.890625f,0.742188f, +0.890625f,0.734375f, +0.898438f,0.742188f, +0.898438f,0.734375f, +0.90625f,0.742188f, +0.90625f,0.734375f, +0.914063f,0.742188f, +0.914063f,0.734375f, +0.921875f,0.742188f, +0.921875f,0.734375f, +0.929688f,0.742188f, +0.929688f,0.734375f, +0.9375f,0.742188f, +0.9375f,0.734375f, +0.945313f,0.742188f, +0.945313f,0.734375f, +0.953125f,0.742188f, +0.953125f,0.734375f, +0.960938f,0.742188f, +0.960938f,0.734375f, +0.96875f,0.742188f, +0.96875f,0.734375f, +0.976563f,0.742188f, +0.976563f,0.734375f, +0.984375f,0.742188f, +0.984375f,0.734375f, +0.992188f,0.742188f, +0.992188f,0.734375f, +1.0f,0.742188f, +1.0f,0.734375f, +0.507813f,0.75f, +0.515625f,0.75f, +0.523438f,0.75f, +0.53125f,0.75f, +0.539063f,0.75f, +0.546875f,0.75f, +0.554688f,0.75f, +0.5625f,0.75f, +0.570313f,0.75f, +0.578125f,0.75f, +0.585938f,0.75f, +0.59375f,0.75f, +0.601563f,0.75f, +0.609375f,0.75f, +0.617188f,0.75f, +0.625f,0.75f, +0.632813f,0.75f, +0.640625f,0.75f, +0.648438f,0.75f, +0.65625f,0.75f, +0.664063f,0.75f, +0.671875f,0.75f, +0.679688f,0.75f, +0.6875f,0.75f, +0.695313f,0.75f, +0.703125f,0.75f, +0.710938f,0.75f, +0.71875f,0.75f, +0.726563f,0.75f, +0.734375f,0.75f, +0.742188f,0.75f, +0.75f,0.75f, +0.757813f,0.75f, +0.765625f,0.75f, +0.773438f,0.75f, +0.78125f,0.75f, +0.789063f,0.75f, +0.796875f,0.75f, +0.804688f,0.75f, +0.8125f,0.75f, +0.820313f,0.75f, +0.828125f,0.75f, +0.835938f,0.75f, +0.84375f,0.75f, +0.851563f,0.75f, +0.859375f,0.75f, +0.867188f,0.75f, +0.875f,0.75f, +0.882813f,0.75f, +0.890625f,0.75f, +0.898438f,0.75f, +0.90625f,0.75f, +0.914063f,0.75f, +0.921875f,0.75f, +0.929688f,0.75f, +0.9375f,0.75f, +0.945313f,0.75f, +0.953125f,0.75f, +0.960938f,0.75f, +0.96875f,0.75f, +0.976563f,0.75f, +0.984375f,0.75f, +0.992188f,0.75f, +1.0f,0.75f, +0.507813f,0.757813f, +0.515625f,0.757813f, +0.523438f,0.757813f, +0.53125f,0.757813f, +0.539063f,0.757813f, +0.546875f,0.757813f, +0.554688f,0.757813f, +0.5625f,0.757813f, +0.570313f,0.757813f, +0.578125f,0.757813f, +0.585938f,0.757813f, +0.59375f,0.757813f, +0.601563f,0.757813f, +0.609375f,0.757813f, +0.617188f,0.757813f, +0.625f,0.757813f, +0.632813f,0.757813f, +0.640625f,0.757813f, +0.648438f,0.757813f, +0.65625f,0.757813f, +0.664063f,0.757813f, +0.671875f,0.757813f, +0.679688f,0.757813f, +0.6875f,0.757813f, +0.695313f,0.757813f, +0.703125f,0.757813f, +0.710938f,0.757813f, +0.71875f,0.757813f, +0.726563f,0.757813f, +0.734375f,0.757813f, +0.742188f,0.757813f, +0.75f,0.757813f, +0.757813f,0.757813f, +0.765625f,0.757813f, +0.773438f,0.757813f, +0.78125f,0.757813f, +0.789063f,0.757813f, +0.796875f,0.757813f, +0.804688f,0.757813f, +0.8125f,0.757813f, +0.820313f,0.757813f, +0.828125f,0.757813f, +0.835938f,0.757813f, +0.84375f,0.757813f, +0.851563f,0.757813f, +0.859375f,0.757813f, +0.867188f,0.757813f, +0.875f,0.757813f, +0.882813f,0.757813f, +0.890625f,0.757813f, +0.898438f,0.757813f, +0.90625f,0.757813f, +0.914063f,0.757813f, +0.921875f,0.757813f, +0.929688f,0.757813f, +0.9375f,0.757813f, +0.945313f,0.757813f, +0.953125f,0.757813f, +0.960938f,0.757813f, +0.96875f,0.757813f, +0.976563f,0.757813f, +0.984375f,0.757813f, +0.992188f,0.757813f, +1.0f,0.757813f, +0.507813f,0.765625f, +0.515625f,0.765625f, +0.523438f,0.765625f, +0.53125f,0.765625f, +0.539063f,0.765625f, +0.546875f,0.765625f, +0.554688f,0.765625f, +0.5625f,0.765625f, +0.570313f,0.765625f, +0.578125f,0.765625f, +0.585938f,0.765625f, +0.59375f,0.765625f, +0.601563f,0.765625f, +0.609375f,0.765625f, +0.617188f,0.765625f, +0.625f,0.765625f, +0.632813f,0.765625f, +0.640625f,0.765625f, +0.648438f,0.765625f, +0.65625f,0.765625f, +0.664063f,0.765625f, +0.671875f,0.765625f, +0.679688f,0.765625f, +0.6875f,0.765625f, +0.695313f,0.765625f, +0.703125f,0.765625f, +0.710938f,0.765625f, +0.71875f,0.765625f, +0.726563f,0.765625f, +0.734375f,0.765625f, +0.742188f,0.765625f, +0.75f,0.765625f, +0.757813f,0.765625f, +0.765625f,0.765625f, +0.773438f,0.765625f, +0.78125f,0.765625f, +0.789063f,0.765625f, +0.796875f,0.765625f, +0.804688f,0.765625f, +0.8125f,0.765625f, +0.820313f,0.765625f, +0.828125f,0.765625f, +0.835938f,0.765625f, +0.84375f,0.765625f, +0.851563f,0.765625f, +0.859375f,0.765625f, +0.867188f,0.765625f, +0.875f,0.765625f, +0.882813f,0.765625f, +0.890625f,0.765625f, +0.898438f,0.765625f, +0.90625f,0.765625f, +0.914063f,0.765625f, +0.921875f,0.765625f, +0.929688f,0.765625f, +0.9375f,0.765625f, +0.945313f,0.765625f, +0.953125f,0.765625f, +0.960938f,0.765625f, +0.96875f,0.765625f, +0.976563f,0.765625f, +0.984375f,0.765625f, +0.992188f,0.765625f, +1.0f,0.765625f, +0.507813f,0.773438f, +0.515625f,0.773438f, +0.523438f,0.773438f, +0.53125f,0.773438f, +0.539063f,0.773438f, +0.546875f,0.773438f, +0.554688f,0.773438f, +0.5625f,0.773438f, +0.570313f,0.773438f, +0.578125f,0.773438f, +0.585938f,0.773438f, +0.59375f,0.773438f, +0.601563f,0.773438f, +0.609375f,0.773438f, +0.617188f,0.773438f, +0.625f,0.773438f, +0.632813f,0.773438f, +0.640625f,0.773438f, +0.648438f,0.773438f, +0.65625f,0.773438f, +0.664063f,0.773438f, +0.671875f,0.773438f, +0.679688f,0.773438f, +0.6875f,0.773438f, +0.695313f,0.773438f, +0.703125f,0.773438f, +0.710938f,0.773438f, +0.71875f,0.773438f, +0.726563f,0.773438f, +0.734375f,0.773438f, +0.742188f,0.773438f, +0.75f,0.773438f, +0.757813f,0.773438f, +0.765625f,0.773438f, +0.773438f,0.773438f, +0.78125f,0.773438f, +0.789063f,0.773438f, +0.796875f,0.773438f, +0.804688f,0.773438f, +0.8125f,0.773438f, +0.820313f,0.773438f, +0.828125f,0.773438f, +0.835938f,0.773438f, +0.84375f,0.773438f, +0.851563f,0.773438f, +0.859375f,0.773438f, +0.867188f,0.773438f, +0.875f,0.773438f, +0.882813f,0.773438f, +0.890625f,0.773438f, +0.898438f,0.773438f, +0.90625f,0.773438f, +0.914063f,0.773438f, +0.921875f,0.773438f, +0.929688f,0.773438f, +0.9375f,0.773438f, +0.945313f,0.773438f, +0.953125f,0.773438f, +0.960938f,0.773438f, +0.96875f,0.773438f, +0.976563f,0.773438f, +0.984375f,0.773438f, +0.992188f,0.773438f, +1.0f,0.773438f, +0.507813f,0.78125f, +0.515625f,0.78125f, +0.523438f,0.78125f, +0.53125f,0.78125f, +0.539063f,0.78125f, +0.546875f,0.78125f, +0.554688f,0.78125f, +0.5625f,0.78125f, +0.570313f,0.78125f, +0.578125f,0.78125f, +0.585938f,0.78125f, +0.59375f,0.78125f, +0.601563f,0.78125f, +0.609375f,0.78125f, +0.617188f,0.78125f, +0.625f,0.78125f, +0.632813f,0.78125f, +0.640625f,0.78125f, +0.648438f,0.78125f, +0.65625f,0.78125f, +0.664063f,0.78125f, +0.671875f,0.78125f, +0.679688f,0.78125f, +0.6875f,0.78125f, +0.695313f,0.78125f, +0.703125f,0.78125f, +0.710938f,0.78125f, +0.71875f,0.78125f, +0.726563f,0.78125f, +0.734375f,0.78125f, +0.742188f,0.78125f, +0.75f,0.78125f, +0.757813f,0.78125f, +0.765625f,0.78125f, +0.773438f,0.78125f, +0.78125f,0.78125f, +0.789063f,0.78125f, +0.796875f,0.78125f, +0.804688f,0.78125f, +0.8125f,0.78125f, +0.820313f,0.78125f, +0.828125f,0.78125f, +0.835938f,0.78125f, +0.84375f,0.78125f, +0.851563f,0.78125f, +0.859375f,0.78125f, +0.867188f,0.78125f, +0.875f,0.78125f, +0.882813f,0.78125f, +0.890625f,0.78125f, +0.898438f,0.78125f, +0.90625f,0.78125f, +0.914063f,0.78125f, +0.921875f,0.78125f, +0.929688f,0.78125f, +0.9375f,0.78125f, +0.945313f,0.78125f, +0.953125f,0.78125f, +0.960938f,0.78125f, +0.96875f,0.78125f, +0.976563f,0.78125f, +0.984375f,0.78125f, +0.992188f,0.78125f, +1.0f,0.78125f, +0.507813f,0.789063f, +0.515625f,0.789063f, +0.523438f,0.789063f, +0.53125f,0.789063f, +0.539063f,0.789063f, +0.546875f,0.789063f, +0.554688f,0.789063f, +0.5625f,0.789063f, +0.570313f,0.789063f, +0.578125f,0.789063f, +0.585938f,0.789063f, +0.59375f,0.789063f, +0.601563f,0.789063f, +0.609375f,0.789063f, +0.617188f,0.789063f, +0.625f,0.789063f, +0.632813f,0.789063f, +0.640625f,0.789063f, +0.648438f,0.789063f, +0.65625f,0.789063f, +0.664063f,0.789063f, +0.671875f,0.789063f, +0.679688f,0.789063f, +0.6875f,0.789063f, +0.695313f,0.789063f, +0.703125f,0.789063f, +0.710938f,0.789063f, +0.71875f,0.789063f, +0.726563f,0.789063f, +0.734375f,0.789063f, +0.742188f,0.789063f, +0.75f,0.789063f, +0.757813f,0.789063f, +0.765625f,0.789063f, +0.773438f,0.789063f, +0.78125f,0.789063f, +0.789063f,0.789063f, +0.796875f,0.789063f, +0.804688f,0.789063f, +0.8125f,0.789063f, +0.820313f,0.789063f, +0.828125f,0.789063f, +0.835938f,0.789063f, +0.84375f,0.789063f, +0.851563f,0.789063f, +0.859375f,0.789063f, +0.867188f,0.789063f, +0.875f,0.789063f, +0.882813f,0.789063f, +0.890625f,0.789063f, +0.898438f,0.789063f, +0.90625f,0.789063f, +0.914063f,0.789063f, +0.921875f,0.789063f, +0.929688f,0.789063f, +0.9375f,0.789063f, +0.945313f,0.789063f, +0.953125f,0.789063f, +0.960938f,0.789063f, +0.96875f,0.789063f, +0.976563f,0.789063f, +0.984375f,0.789063f, +0.992188f,0.789063f, +1.0f,0.789063f, +0.507813f,0.796875f, +0.515625f,0.796875f, +0.523438f,0.796875f, +0.53125f,0.796875f, +0.539063f,0.796875f, +0.546875f,0.796875f, +0.554688f,0.796875f, +0.5625f,0.796875f, +0.570313f,0.796875f, +0.578125f,0.796875f, +0.585938f,0.796875f, +0.59375f,0.796875f, +0.601563f,0.796875f, +0.609375f,0.796875f, +0.617188f,0.796875f, +0.625f,0.796875f, +0.632813f,0.796875f, +0.640625f,0.796875f, +0.648438f,0.796875f, +0.65625f,0.796875f, +0.664063f,0.796875f, +0.671875f,0.796875f, +0.679688f,0.796875f, +0.6875f,0.796875f, +0.695313f,0.796875f, +0.703125f,0.796875f, +0.710938f,0.796875f, +0.71875f,0.796875f, +0.726563f,0.796875f, +0.734375f,0.796875f, +0.742188f,0.796875f, +0.75f,0.796875f, +0.757813f,0.796875f, +0.765625f,0.796875f, +0.773438f,0.796875f, +0.78125f,0.796875f, +0.789063f,0.796875f, +0.796875f,0.796875f, +0.804688f,0.796875f, +0.8125f,0.796875f, +0.820313f,0.796875f, +0.828125f,0.796875f, +0.835938f,0.796875f, +0.84375f,0.796875f, +0.851563f,0.796875f, +0.859375f,0.796875f, +0.867188f,0.796875f, +0.875f,0.796875f, +0.882813f,0.796875f, +0.890625f,0.796875f, +0.898438f,0.796875f, +0.90625f,0.796875f, +0.914063f,0.796875f, +0.921875f,0.796875f, +0.929688f,0.796875f, +0.9375f,0.796875f, +0.945313f,0.796875f, +0.953125f,0.796875f, +0.960938f,0.796875f, +0.96875f,0.796875f, +0.976563f,0.796875f, +0.984375f,0.796875f, +0.992188f,0.796875f, +1.0f,0.796875f, +0.507813f,0.804688f, +0.515625f,0.804688f, +0.523438f,0.804688f, +0.53125f,0.804688f, +0.539063f,0.804688f, +0.546875f,0.804688f, +0.554688f,0.804688f, +0.5625f,0.804688f, +0.570313f,0.804688f, +0.578125f,0.804688f, +0.585938f,0.804688f, +0.59375f,0.804688f, +0.601563f,0.804688f, +0.609375f,0.804688f, +0.617188f,0.804688f, +0.625f,0.804688f, +0.632813f,0.804688f, +0.640625f,0.804688f, +0.648438f,0.804688f, +0.65625f,0.804688f, +0.664063f,0.804688f, +0.671875f,0.804688f, +0.679688f,0.804688f, +0.6875f,0.804688f, +0.695313f,0.804688f, +0.703125f,0.804688f, +0.710938f,0.804688f, +0.71875f,0.804688f, +0.726563f,0.804688f, +0.734375f,0.804688f, +0.742188f,0.804688f, +0.75f,0.804688f, +0.757813f,0.804688f, +0.765625f,0.804688f, +0.773438f,0.804688f, +0.78125f,0.804688f, +0.789063f,0.804688f, +0.796875f,0.804688f, +0.804688f,0.804688f, +0.8125f,0.804688f, +0.820313f,0.804688f, +0.828125f,0.804688f, +0.835938f,0.804688f, +0.84375f,0.804688f, +0.851563f,0.804688f, +0.859375f,0.804688f, +0.867188f,0.804688f, +0.875f,0.804688f, +0.882813f,0.804688f, +0.890625f,0.804688f, +0.898438f,0.804688f, +0.90625f,0.804688f, +0.914063f,0.804688f, +0.921875f,0.804688f, +0.929688f,0.804688f, +0.9375f,0.804688f, +0.945313f,0.804688f, +0.953125f,0.804688f, +0.960938f,0.804688f, +0.96875f,0.804688f, +0.976563f,0.804688f, +0.984375f,0.804688f, +0.992188f,0.804688f, +1.0f,0.804688f, +0.507813f,0.8125f, +0.515625f,0.8125f, +0.523438f,0.8125f, +0.53125f,0.8125f, +0.539063f,0.8125f, +0.546875f,0.8125f, +0.554688f,0.8125f, +0.5625f,0.8125f, +0.570313f,0.8125f, +0.578125f,0.8125f, +0.585938f,0.8125f, +0.59375f,0.8125f, +0.601563f,0.8125f, +0.609375f,0.8125f, +0.617188f,0.8125f, +0.625f,0.8125f, +0.632813f,0.8125f, +0.640625f,0.8125f, +0.648438f,0.8125f, +0.65625f,0.8125f, +0.664063f,0.8125f, +0.671875f,0.8125f, +0.679688f,0.8125f, +0.6875f,0.8125f, +0.695313f,0.8125f, +0.703125f,0.8125f, +0.710938f,0.8125f, +0.71875f,0.8125f, +0.726563f,0.8125f, +0.734375f,0.8125f, +0.742188f,0.8125f, +0.75f,0.8125f, +0.757813f,0.8125f, +0.765625f,0.8125f, +0.773438f,0.8125f, +0.78125f,0.8125f, +0.789063f,0.8125f, +0.796875f,0.8125f, +0.804688f,0.8125f, +0.8125f,0.8125f, +0.820313f,0.8125f, +0.828125f,0.8125f, +0.835938f,0.8125f, +0.84375f,0.8125f, +0.851563f,0.8125f, +0.859375f,0.8125f, +0.867188f,0.8125f, +0.875f,0.8125f, +0.882813f,0.8125f, +0.890625f,0.8125f, +0.898438f,0.8125f, +0.90625f,0.8125f, +0.914063f,0.8125f, +0.921875f,0.8125f, +0.929688f,0.8125f, +0.9375f,0.8125f, +0.945313f,0.8125f, +0.953125f,0.8125f, +0.960938f,0.8125f, +0.96875f,0.8125f, +0.976563f,0.8125f, +0.984375f,0.8125f, +0.992188f,0.8125f, +1.0f,0.8125f, +0.507813f,0.820313f, +0.515625f,0.820313f, +0.523438f,0.820313f, +0.53125f,0.820313f, +0.539063f,0.820313f, +0.546875f,0.820313f, +0.554688f,0.820313f, +0.5625f,0.820313f, +0.570313f,0.820313f, +0.578125f,0.820313f, +0.585938f,0.820313f, +0.59375f,0.820313f, +0.601563f,0.820313f, +0.609375f,0.820313f, +0.617188f,0.820313f, +0.625f,0.820313f, +0.632813f,0.820313f, +0.640625f,0.820313f, +0.648438f,0.820313f, +0.65625f,0.820313f, +0.664063f,0.820313f, +0.671875f,0.820313f, +0.679688f,0.820313f, +0.6875f,0.820313f, +0.695313f,0.820313f, +0.703125f,0.820313f, +0.710938f,0.820313f, +0.71875f,0.820313f, +0.726563f,0.820313f, +0.734375f,0.820313f, +0.742188f,0.820313f, +0.75f,0.820313f, +0.757813f,0.820313f, +0.765625f,0.820313f, +0.773438f,0.820313f, +0.78125f,0.820313f, +0.789063f,0.820313f, +0.796875f,0.820313f, +0.804688f,0.820313f, +0.8125f,0.820313f, +0.820313f,0.820313f, +0.828125f,0.820313f, +0.835938f,0.820313f, +0.84375f,0.820313f, +0.851563f,0.820313f, +0.859375f,0.820313f, +0.867188f,0.820313f, +0.875f,0.820313f, +0.882813f,0.820313f, +0.890625f,0.820313f, +0.898438f,0.820313f, +0.90625f,0.820313f, +0.914063f,0.820313f, +0.921875f,0.820313f, +0.929688f,0.820313f, +0.9375f,0.820313f, +0.945313f,0.820313f, +0.953125f,0.820313f, +0.960938f,0.820313f, +0.96875f,0.820313f, +0.976563f,0.820313f, +0.984375f,0.820313f, +0.992188f,0.820313f, +1.0f,0.820313f, +0.507813f,0.828125f, +0.515625f,0.828125f, +0.523438f,0.828125f, +0.53125f,0.828125f, +0.539063f,0.828125f, +0.546875f,0.828125f, +0.554688f,0.828125f, +0.5625f,0.828125f, +0.570313f,0.828125f, +0.578125f,0.828125f, +0.585938f,0.828125f, +0.59375f,0.828125f, +0.601563f,0.828125f, +0.609375f,0.828125f, +0.617188f,0.828125f, +0.625f,0.828125f, +0.632813f,0.828125f, +0.640625f,0.828125f, +0.648438f,0.828125f, +0.65625f,0.828125f, +0.664063f,0.828125f, +0.671875f,0.828125f, +0.679688f,0.828125f, +0.6875f,0.828125f, +0.695313f,0.828125f, +0.703125f,0.828125f, +0.710938f,0.828125f, +0.71875f,0.828125f, +0.726563f,0.828125f, +0.734375f,0.828125f, +0.742188f,0.828125f, +0.75f,0.828125f, +0.757813f,0.828125f, +0.765625f,0.828125f, +0.773438f,0.828125f, +0.78125f,0.828125f, +0.789063f,0.828125f, +0.796875f,0.828125f, +0.804688f,0.828125f, +0.8125f,0.828125f, +0.820313f,0.828125f, +0.828125f,0.828125f, +0.835938f,0.828125f, +0.84375f,0.828125f, +0.851563f,0.828125f, +0.859375f,0.828125f, +0.867188f,0.828125f, +0.875f,0.828125f, +0.882813f,0.828125f, +0.890625f,0.828125f, +0.898438f,0.828125f, +0.90625f,0.828125f, +0.914063f,0.828125f, +0.921875f,0.828125f, +0.929688f,0.828125f, +0.9375f,0.828125f, +0.945313f,0.828125f, +0.953125f,0.828125f, +0.960938f,0.828125f, +0.96875f,0.828125f, +0.976563f,0.828125f, +0.984375f,0.828125f, +0.992188f,0.828125f, +1.0f,0.828125f, +0.507813f,0.835938f, +0.515625f,0.835938f, +0.523438f,0.835938f, +0.53125f,0.835938f, +0.539063f,0.835938f, +0.546875f,0.835938f, +0.554688f,0.835938f, +0.5625f,0.835938f, +0.570313f,0.835938f, +0.578125f,0.835938f, +0.585938f,0.835938f, +0.59375f,0.835938f, +0.601563f,0.835938f, +0.609375f,0.835938f, +0.617188f,0.835938f, +0.625f,0.835938f, +0.632813f,0.835938f, +0.640625f,0.835938f, +0.648438f,0.835938f, +0.65625f,0.835938f, +0.664063f,0.835938f, +0.671875f,0.835938f, +0.679688f,0.835938f, +0.6875f,0.835938f, +0.695313f,0.835938f, +0.703125f,0.835938f, +0.710938f,0.835938f, +0.71875f,0.835938f, +0.726563f,0.835938f, +0.734375f,0.835938f, +0.742188f,0.835938f, +0.75f,0.835938f, +0.757813f,0.835938f, +0.765625f,0.835938f, +0.773438f,0.835938f, +0.78125f,0.835938f, +0.789063f,0.835938f, +0.796875f,0.835938f, +0.804688f,0.835938f, +0.8125f,0.835938f, +0.820313f,0.835938f, +0.828125f,0.835938f, +0.835938f,0.835938f, +0.84375f,0.835938f, +0.851563f,0.835938f, +0.859375f,0.835938f, +0.867188f,0.835938f, +0.875f,0.835938f, +0.882813f,0.835938f, +0.890625f,0.835938f, +0.898438f,0.835938f, +0.90625f,0.835938f, +0.914063f,0.835938f, +0.921875f,0.835938f, +0.929688f,0.835938f, +0.9375f,0.835938f, +0.945313f,0.835938f, +0.953125f,0.835938f, +0.960938f,0.835938f, +0.96875f,0.835938f, +0.976563f,0.835938f, +0.984375f,0.835938f, +0.992188f,0.835938f, +1.0f,0.835938f, +0.507813f,0.84375f, +0.515625f,0.84375f, +0.523438f,0.84375f, +0.53125f,0.84375f, +0.539063f,0.84375f, +0.546875f,0.84375f, +0.554688f,0.84375f, +0.5625f,0.84375f, +0.570313f,0.84375f, +0.578125f,0.84375f, +0.585938f,0.84375f, +0.59375f,0.84375f, +0.601563f,0.84375f, +0.609375f,0.84375f, +0.617188f,0.84375f, +0.625f,0.84375f, +0.632813f,0.84375f, +0.640625f,0.84375f, +0.648438f,0.84375f, +0.65625f,0.84375f, +0.664063f,0.84375f, +0.671875f,0.84375f, +0.679688f,0.84375f, +0.6875f,0.84375f, +0.695313f,0.84375f, +0.703125f,0.84375f, +0.710938f,0.84375f, +0.71875f,0.84375f, +0.726563f,0.84375f, +0.734375f,0.84375f, +0.742188f,0.84375f, +0.75f,0.84375f, +0.757813f,0.84375f, +0.765625f,0.84375f, +0.773438f,0.84375f, +0.78125f,0.84375f, +0.789063f,0.84375f, +0.796875f,0.84375f, +0.804688f,0.84375f, +0.8125f,0.84375f, +0.820313f,0.84375f, +0.828125f,0.84375f, +0.835938f,0.84375f, +0.84375f,0.84375f, +0.851563f,0.84375f, +0.859375f,0.84375f, +0.867188f,0.84375f, +0.875f,0.84375f, +0.882813f,0.84375f, +0.890625f,0.84375f, +0.898438f,0.84375f, +0.90625f,0.84375f, +0.914063f,0.84375f, +0.921875f,0.84375f, +0.929688f,0.84375f, +0.9375f,0.84375f, +0.945313f,0.84375f, +0.953125f,0.84375f, +0.960938f,0.84375f, +0.96875f,0.84375f, +0.976563f,0.84375f, +0.984375f,0.84375f, +0.992188f,0.84375f, +1.0f,0.84375f, +0.507813f,0.851563f, +0.515625f,0.851563f, +0.523438f,0.851563f, +0.53125f,0.851563f, +0.539063f,0.851563f, +0.546875f,0.851563f, +0.554688f,0.851563f, +0.5625f,0.851563f, +0.570313f,0.851563f, +0.578125f,0.851563f, +0.585938f,0.851563f, +0.59375f,0.851563f, +0.601563f,0.851563f, +0.609375f,0.851563f, +0.617188f,0.851563f, +0.625f,0.851563f, +0.632813f,0.851563f, +0.640625f,0.851563f, +0.648438f,0.851563f, +0.65625f,0.851563f, +0.664063f,0.851563f, +0.671875f,0.851563f, +0.679688f,0.851563f, +0.6875f,0.851563f, +0.695313f,0.851563f, +0.703125f,0.851563f, +0.710938f,0.851563f, +0.71875f,0.851563f, +0.726563f,0.851563f, +0.734375f,0.851563f, +0.742188f,0.851563f, +0.75f,0.851563f, +0.757813f,0.851563f, +0.765625f,0.851563f, +0.773438f,0.851563f, +0.78125f,0.851563f, +0.789063f,0.851563f, +0.796875f,0.851563f, +0.804688f,0.851563f, +0.8125f,0.851563f, +0.820313f,0.851563f, +0.828125f,0.851563f, +0.835938f,0.851563f, +0.84375f,0.851563f, +0.851563f,0.851563f, +0.859375f,0.851563f, +0.867188f,0.851563f, +0.875f,0.851563f, +0.882813f,0.851563f, +0.890625f,0.851563f, +0.898438f,0.851563f, +0.90625f,0.851563f, +0.914063f,0.851563f, +0.921875f,0.851563f, +0.929688f,0.851563f, +0.9375f,0.851563f, +0.945313f,0.851563f, +0.953125f,0.851563f, +0.960938f,0.851563f, +0.96875f,0.851563f, +0.976563f,0.851563f, +0.984375f,0.851563f, +0.992188f,0.851563f, +1.0f,0.851563f, +0.507813f,0.859375f, +0.515625f,0.859375f, +0.523438f,0.859375f, +0.53125f,0.859375f, +0.539063f,0.859375f, +0.546875f,0.859375f, +0.554688f,0.859375f, +0.5625f,0.859375f, +0.570313f,0.859375f, +0.578125f,0.859375f, +0.585938f,0.859375f, +0.59375f,0.859375f, +0.601563f,0.859375f, +0.609375f,0.859375f, +0.617188f,0.859375f, +0.625f,0.859375f, +0.632813f,0.859375f, +0.640625f,0.859375f, +0.648438f,0.859375f, +0.65625f,0.859375f, +0.664063f,0.859375f, +0.671875f,0.859375f, +0.679688f,0.859375f, +0.6875f,0.859375f, +0.695313f,0.859375f, +0.703125f,0.859375f, +0.710938f,0.859375f, +0.71875f,0.859375f, +0.726563f,0.859375f, +0.734375f,0.859375f, +0.742188f,0.859375f, +0.75f,0.859375f, +0.757813f,0.859375f, +0.765625f,0.859375f, +0.773438f,0.859375f, +0.78125f,0.859375f, +0.789063f,0.859375f, +0.796875f,0.859375f, +0.804688f,0.859375f, +0.8125f,0.859375f, +0.820313f,0.859375f, +0.828125f,0.859375f, +0.835938f,0.859375f, +0.84375f,0.859375f, +0.851563f,0.859375f, +0.859375f,0.859375f, +0.867188f,0.859375f, +0.875f,0.859375f, +0.882813f,0.859375f, +0.890625f,0.859375f, +0.898438f,0.859375f, +0.90625f,0.859375f, +0.914063f,0.859375f, +0.921875f,0.859375f, +0.929688f,0.859375f, +0.9375f,0.859375f, +0.945313f,0.859375f, +0.953125f,0.859375f, +0.960938f,0.859375f, +0.96875f,0.859375f, +0.976563f,0.859375f, +0.984375f,0.859375f, +0.992188f,0.859375f, +1.0f,0.859375f, +0.507813f,0.867188f, +0.515625f,0.867188f, +0.523438f,0.867188f, +0.53125f,0.867188f, +0.539063f,0.867188f, +0.546875f,0.867188f, +0.554688f,0.867188f, +0.5625f,0.867188f, +0.570313f,0.867188f, +0.578125f,0.867188f, +0.585938f,0.867188f, +0.59375f,0.867188f, +0.601563f,0.867188f, +0.609375f,0.867188f, +0.617188f,0.867188f, +0.625f,0.867188f, +0.632813f,0.867188f, +0.640625f,0.867188f, +0.648438f,0.867188f, +0.65625f,0.867188f, +0.664063f,0.867188f, +0.671875f,0.867188f, +0.679688f,0.867188f, +0.6875f,0.867188f, +0.695313f,0.867188f, +0.703125f,0.867188f, +0.710938f,0.867188f, +0.71875f,0.867188f, +0.726563f,0.867188f, +0.734375f,0.867188f, +0.742188f,0.867188f, +0.75f,0.867188f, +0.757813f,0.867188f, +0.765625f,0.867188f, +0.773438f,0.867188f, +0.78125f,0.867188f, +0.789063f,0.867188f, +0.796875f,0.867188f, +0.804688f,0.867188f, +0.8125f,0.867188f, +0.820313f,0.867188f, +0.828125f,0.867188f, +0.835938f,0.867188f, +0.84375f,0.867188f, +0.851563f,0.867188f, +0.859375f,0.867188f, +0.867188f,0.867188f, +0.875f,0.867188f, +0.882813f,0.867188f, +0.890625f,0.867188f, +0.898438f,0.867188f, +0.90625f,0.867188f, +0.914063f,0.867188f, +0.921875f,0.867188f, +0.929688f,0.867188f, +0.9375f,0.867188f, +0.945313f,0.867188f, +0.953125f,0.867188f, +0.960938f,0.867188f, +0.96875f,0.867188f, +0.976563f,0.867188f, +0.984375f,0.867188f, +0.992188f,0.867188f, +1.0f,0.867188f, +0.507813f,0.875f, +0.515625f,0.875f, +0.523438f,0.875f, +0.53125f,0.875f, +0.539063f,0.875f, +0.546875f,0.875f, +0.554688f,0.875f, +0.5625f,0.875f, +0.570313f,0.875f, +0.578125f,0.875f, +0.585938f,0.875f, +0.59375f,0.875f, +0.601563f,0.875f, +0.609375f,0.875f, +0.617188f,0.875f, +0.625f,0.875f, +0.632813f,0.875f, +0.640625f,0.875f, +0.648438f,0.875f, +0.65625f,0.875f, +0.664063f,0.875f, +0.671875f,0.875f, +0.679688f,0.875f, +0.6875f,0.875f, +0.695313f,0.875f, +0.703125f,0.875f, +0.710938f,0.875f, +0.71875f,0.875f, +0.726563f,0.875f, +0.734375f,0.875f, +0.742188f,0.875f, +0.75f,0.875f, +0.757813f,0.875f, +0.765625f,0.875f, +0.773438f,0.875f, +0.78125f,0.875f, +0.789063f,0.875f, +0.796875f,0.875f, +0.804688f,0.875f, +0.8125f,0.875f, +0.820313f,0.875f, +0.828125f,0.875f, +0.835938f,0.875f, +0.84375f,0.875f, +0.851563f,0.875f, +0.859375f,0.875f, +0.867188f,0.875f, +0.875f,0.875f, +0.882813f,0.875f, +0.890625f,0.875f, +0.898438f,0.875f, +0.90625f,0.875f, +0.914063f,0.875f, +0.921875f,0.875f, +0.929688f,0.875f, +0.9375f,0.875f, +0.945313f,0.875f, +0.953125f,0.875f, +0.960938f,0.875f, +0.96875f,0.875f, +0.976563f,0.875f, +0.984375f,0.875f, +0.992188f,0.875f, +1.0f,0.875f, +0.507813f,0.882813f, +0.515625f,0.882813f, +0.523438f,0.882813f, +0.53125f,0.882813f, +0.539063f,0.882813f, +0.546875f,0.882813f, +0.554688f,0.882813f, +0.5625f,0.882813f, +0.570313f,0.882813f, +0.578125f,0.882813f, +0.585938f,0.882813f, +0.59375f,0.882813f, +0.601563f,0.882813f, +0.609375f,0.882813f, +0.617188f,0.882813f, +0.625f,0.882813f, +0.632813f,0.882813f, +0.640625f,0.882813f, +0.648438f,0.882813f, +0.65625f,0.882813f, +0.664063f,0.882813f, +0.671875f,0.882813f, +0.679688f,0.882813f, +0.6875f,0.882813f, +0.695313f,0.882813f, +0.703125f,0.882813f, +0.710938f,0.882813f, +0.71875f,0.882813f, +0.726563f,0.882813f, +0.734375f,0.882813f, +0.742188f,0.882813f, +0.75f,0.882813f, +0.757813f,0.882813f, +0.765625f,0.882813f, +0.773438f,0.882813f, +0.78125f,0.882813f, +0.789063f,0.882813f, +0.796875f,0.882813f, +0.804688f,0.882813f, +0.8125f,0.882813f, +0.820313f,0.882813f, +0.828125f,0.882813f, +0.835938f,0.882813f, +0.84375f,0.882813f, +0.851563f,0.882813f, +0.859375f,0.882813f, +0.867188f,0.882813f, +0.875f,0.882813f, +0.882813f,0.882813f, +0.890625f,0.882813f, +0.898438f,0.882813f, +0.90625f,0.882813f, +0.914063f,0.882813f, +0.921875f,0.882813f, +0.929688f,0.882813f, +0.9375f,0.882813f, +0.945313f,0.882813f, +0.953125f,0.882813f, +0.960938f,0.882813f, +0.96875f,0.882813f, +0.976563f,0.882813f, +0.984375f,0.882813f, +0.992188f,0.882813f, +1.0f,0.882813f, +0.507813f,0.890625f, +0.515625f,0.890625f, +0.523438f,0.890625f, +0.53125f,0.890625f, +0.539063f,0.890625f, +0.546875f,0.890625f, +0.554688f,0.890625f, +0.5625f,0.890625f, +0.570313f,0.890625f, +0.578125f,0.890625f, +0.585938f,0.890625f, +0.59375f,0.890625f, +0.601563f,0.890625f, +0.609375f,0.890625f, +0.617188f,0.890625f, +0.625f,0.890625f, +0.632813f,0.890625f, +0.640625f,0.890625f, +0.648438f,0.890625f, +0.65625f,0.890625f, +0.664063f,0.890625f, +0.671875f,0.890625f, +0.679688f,0.890625f, +0.6875f,0.890625f, +0.695313f,0.890625f, +0.703125f,0.890625f, +0.710938f,0.890625f, +0.71875f,0.890625f, +0.726563f,0.890625f, +0.734375f,0.890625f, +0.742188f,0.890625f, +0.75f,0.890625f, +0.757813f,0.890625f, +0.765625f,0.890625f, +0.773438f,0.890625f, +0.78125f,0.890625f, +0.789063f,0.890625f, +0.796875f,0.890625f, +0.804688f,0.890625f, +0.8125f,0.890625f, +0.820313f,0.890625f, +0.828125f,0.890625f, +0.835938f,0.890625f, +0.84375f,0.890625f, +0.851563f,0.890625f, +0.859375f,0.890625f, +0.867188f,0.890625f, +0.875f,0.890625f, +0.882813f,0.890625f, +0.890625f,0.890625f, +0.898438f,0.890625f, +0.90625f,0.890625f, +0.914063f,0.890625f, +0.921875f,0.890625f, +0.929688f,0.890625f, +0.9375f,0.890625f, +0.945313f,0.890625f, +0.953125f,0.890625f, +0.960938f,0.890625f, +0.96875f,0.890625f, +0.976563f,0.890625f, +0.984375f,0.890625f, +0.992188f,0.890625f, +1.0f,0.890625f, +0.507813f,0.898438f, +0.515625f,0.898438f, +0.523438f,0.898438f, +0.53125f,0.898438f, +0.539063f,0.898438f, +0.546875f,0.898438f, +0.554688f,0.898438f, +0.5625f,0.898438f, +0.570313f,0.898438f, +0.578125f,0.898438f, +0.585938f,0.898438f, +0.59375f,0.898438f, +0.601563f,0.898438f, +0.609375f,0.898438f, +0.617188f,0.898438f, +0.625f,0.898438f, +0.632813f,0.898438f, +0.640625f,0.898438f, +0.648438f,0.898438f, +0.65625f,0.898438f, +0.664063f,0.898438f, +0.671875f,0.898438f, +0.679688f,0.898438f, +0.6875f,0.898438f, +0.695313f,0.898438f, +0.703125f,0.898438f, +0.710938f,0.898438f, +0.71875f,0.898438f, +0.726563f,0.898438f, +0.734375f,0.898438f, +0.742188f,0.898438f, +0.75f,0.898438f, +0.757813f,0.898438f, +0.765625f,0.898438f, +0.773438f,0.898438f, +0.78125f,0.898438f, +0.789063f,0.898438f, +0.796875f,0.898438f, +0.804688f,0.898438f, +0.8125f,0.898438f, +0.820313f,0.898438f, +0.828125f,0.898438f, +0.835938f,0.898438f, +0.84375f,0.898438f, +0.851563f,0.898438f, +0.859375f,0.898438f, +0.867188f,0.898438f, +0.875f,0.898438f, +0.882813f,0.898438f, +0.890625f,0.898438f, +0.898438f,0.898438f, +0.90625f,0.898438f, +0.914063f,0.898438f, +0.921875f,0.898438f, +0.929688f,0.898438f, +0.9375f,0.898438f, +0.945313f,0.898438f, +0.953125f,0.898438f, +0.960938f,0.898438f, +0.96875f,0.898438f, +0.976563f,0.898438f, +0.984375f,0.898438f, +0.992188f,0.898438f, +1.0f,0.898438f, +0.507813f,0.90625f, +0.515625f,0.90625f, +0.523438f,0.90625f, +0.53125f,0.90625f, +0.539063f,0.90625f, +0.546875f,0.90625f, +0.554688f,0.90625f, +0.5625f,0.90625f, +0.570313f,0.90625f, +0.578125f,0.90625f, +0.585938f,0.90625f, +0.59375f,0.90625f, +0.601563f,0.90625f, +0.609375f,0.90625f, +0.617188f,0.90625f, +0.625f,0.90625f, +0.632813f,0.90625f, +0.640625f,0.90625f, +0.648438f,0.90625f, +0.65625f,0.90625f, +0.664063f,0.90625f, +0.671875f,0.90625f, +0.679688f,0.90625f, +0.6875f,0.90625f, +0.695313f,0.90625f, +0.703125f,0.90625f, +0.710938f,0.90625f, +0.71875f,0.90625f, +0.726563f,0.90625f, +0.734375f,0.90625f, +0.742188f,0.90625f, +0.75f,0.90625f, +0.757813f,0.90625f, +0.765625f,0.90625f, +0.773438f,0.90625f, +0.78125f,0.90625f, +0.789063f,0.90625f, +0.796875f,0.90625f, +0.804688f,0.90625f, +0.8125f,0.90625f, +0.820313f,0.90625f, +0.828125f,0.90625f, +0.835938f,0.90625f, +0.84375f,0.90625f, +0.851563f,0.90625f, +0.859375f,0.90625f, +0.867188f,0.90625f, +0.875f,0.90625f, +0.882813f,0.90625f, +0.890625f,0.90625f, +0.898438f,0.90625f, +0.90625f,0.90625f, +0.914063f,0.90625f, +0.921875f,0.90625f, +0.929688f,0.90625f, +0.9375f,0.90625f, +0.945313f,0.90625f, +0.953125f,0.90625f, +0.960938f,0.90625f, +0.96875f,0.90625f, +0.976563f,0.90625f, +0.984375f,0.90625f, +0.992188f,0.90625f, +1.0f,0.90625f, +0.507813f,0.914063f, +0.515625f,0.914063f, +0.523438f,0.914063f, +0.53125f,0.914063f, +0.539063f,0.914063f, +0.546875f,0.914063f, +0.554688f,0.914063f, +0.5625f,0.914063f, +0.570313f,0.914063f, +0.578125f,0.914063f, +0.585938f,0.914063f, +0.59375f,0.914063f, +0.601563f,0.914063f, +0.609375f,0.914063f, +0.617188f,0.914063f, +0.625f,0.914063f, +0.632813f,0.914063f, +0.640625f,0.914063f, +0.648438f,0.914063f, +0.65625f,0.914063f, +0.664063f,0.914063f, +0.671875f,0.914063f, +0.679688f,0.914063f, +0.6875f,0.914063f, +0.695313f,0.914063f, +0.703125f,0.914063f, +0.710938f,0.914063f, +0.71875f,0.914063f, +0.726563f,0.914063f, +0.734375f,0.914063f, +0.742188f,0.914063f, +0.75f,0.914063f, +0.757813f,0.914063f, +0.765625f,0.914063f, +0.773438f,0.914063f, +0.78125f,0.914063f, +0.789063f,0.914063f, +0.796875f,0.914063f, +0.804688f,0.914063f, +0.8125f,0.914063f, +0.820313f,0.914063f, +0.828125f,0.914063f, +0.835938f,0.914063f, +0.84375f,0.914063f, +0.851563f,0.914063f, +0.859375f,0.914063f, +0.867188f,0.914063f, +0.875f,0.914063f, +0.882813f,0.914063f, +0.890625f,0.914063f, +0.898438f,0.914063f, +0.90625f,0.914063f, +0.914063f,0.914063f, +0.921875f,0.914063f, +0.929688f,0.914063f, +0.9375f,0.914063f, +0.945313f,0.914063f, +0.953125f,0.914063f, +0.960938f,0.914063f, +0.96875f,0.914063f, +0.976563f,0.914063f, +0.984375f,0.914063f, +0.992188f,0.914063f, +1.0f,0.914063f, +0.507813f,0.921875f, +0.515625f,0.921875f, +0.523438f,0.921875f, +0.53125f,0.921875f, +0.539063f,0.921875f, +0.546875f,0.921875f, +0.554688f,0.921875f, +0.5625f,0.921875f, +0.570313f,0.921875f, +0.578125f,0.921875f, +0.585938f,0.921875f, +0.59375f,0.921875f, +0.601563f,0.921875f, +0.609375f,0.921875f, +0.617188f,0.921875f, +0.625f,0.921875f, +0.632813f,0.921875f, +0.640625f,0.921875f, +0.648438f,0.921875f, +0.65625f,0.921875f, +0.664063f,0.921875f, +0.671875f,0.921875f, +0.679688f,0.921875f, +0.6875f,0.921875f, +0.695313f,0.921875f, +0.703125f,0.921875f, +0.710938f,0.921875f, +0.71875f,0.921875f, +0.726563f,0.921875f, +0.734375f,0.921875f, +0.742188f,0.921875f, +0.75f,0.921875f, +0.757813f,0.921875f, +0.765625f,0.921875f, +0.773438f,0.921875f, +0.78125f,0.921875f, +0.789063f,0.921875f, +0.796875f,0.921875f, +0.804688f,0.921875f, +0.8125f,0.921875f, +0.820313f,0.921875f, +0.828125f,0.921875f, +0.835938f,0.921875f, +0.84375f,0.921875f, +0.851563f,0.921875f, +0.859375f,0.921875f, +0.867188f,0.921875f, +0.875f,0.921875f, +0.882813f,0.921875f, +0.890625f,0.921875f, +0.898438f,0.921875f, +0.90625f,0.921875f, +0.914063f,0.921875f, +0.921875f,0.921875f, +0.929688f,0.921875f, +0.9375f,0.921875f, +0.945313f,0.921875f, +0.953125f,0.921875f, +0.960938f,0.921875f, +0.96875f,0.921875f, +0.976563f,0.921875f, +0.984375f,0.921875f, +0.992188f,0.921875f, +1.0f,0.921875f, +0.507813f,0.929688f, +0.515625f,0.929688f, +0.523438f,0.929688f, +0.53125f,0.929688f, +0.539063f,0.929688f, +0.546875f,0.929688f, +0.554688f,0.929688f, +0.5625f,0.929688f, +0.570313f,0.929688f, +0.578125f,0.929688f, +0.585938f,0.929688f, +0.59375f,0.929688f, +0.601563f,0.929688f, +0.609375f,0.929688f, +0.617188f,0.929688f, +0.625f,0.929688f, +0.632813f,0.929688f, +0.640625f,0.929688f, +0.648438f,0.929688f, +0.65625f,0.929688f, +0.664063f,0.929688f, +0.671875f,0.929688f, +0.679688f,0.929688f, +0.6875f,0.929688f, +0.695313f,0.929688f, +0.703125f,0.929688f, +0.710938f,0.929688f, +0.71875f,0.929688f, +0.726563f,0.929688f, +0.734375f,0.929688f, +0.742188f,0.929688f, +0.75f,0.929688f, +0.757813f,0.929688f, +0.765625f,0.929688f, +0.773438f,0.929688f, +0.78125f,0.929688f, +0.789063f,0.929688f, +0.796875f,0.929688f, +0.804688f,0.929688f, +0.8125f,0.929688f, +0.820313f,0.929688f, +0.828125f,0.929688f, +0.835938f,0.929688f, +0.84375f,0.929688f, +0.851563f,0.929688f, +0.859375f,0.929688f, +0.867188f,0.929688f, +0.875f,0.929688f, +0.882813f,0.929688f, +0.890625f,0.929688f, +0.898438f,0.929688f, +0.90625f,0.929688f, +0.914063f,0.929688f, +0.921875f,0.929688f, +0.929688f,0.929688f, +0.9375f,0.929688f, +0.945313f,0.929688f, +0.953125f,0.929688f, +0.960938f,0.929688f, +0.96875f,0.929688f, +0.976563f,0.929688f, +0.984375f,0.929688f, +0.992188f,0.929688f, +1.0f,0.929688f, +0.507813f,0.9375f, +0.515625f,0.9375f, +0.523438f,0.9375f, +0.53125f,0.9375f, +0.539063f,0.9375f, +0.546875f,0.9375f, +0.554688f,0.9375f, +0.5625f,0.9375f, +0.570313f,0.9375f, +0.578125f,0.9375f, +0.585938f,0.9375f, +0.59375f,0.9375f, +0.601563f,0.9375f, +0.609375f,0.9375f, +0.617188f,0.9375f, +0.625f,0.9375f, +0.632813f,0.9375f, +0.640625f,0.9375f, +0.648438f,0.9375f, +0.65625f,0.9375f, +0.664063f,0.9375f, +0.671875f,0.9375f, +0.679688f,0.9375f, +0.6875f,0.9375f, +0.695313f,0.9375f, +0.703125f,0.9375f, +0.710938f,0.9375f, +0.71875f,0.9375f, +0.726563f,0.9375f, +0.734375f,0.9375f, +0.742188f,0.9375f, +0.75f,0.9375f, +0.757813f,0.9375f, +0.765625f,0.9375f, +0.773438f,0.9375f, +0.78125f,0.9375f, +0.789063f,0.9375f, +0.796875f,0.9375f, +0.804688f,0.9375f, +0.8125f,0.9375f, +0.820313f,0.9375f, +0.828125f,0.9375f, +0.835938f,0.9375f, +0.84375f,0.9375f, +0.851563f,0.9375f, +0.859375f,0.9375f, +0.867188f,0.9375f, +0.875f,0.9375f, +0.882813f,0.9375f, +0.890625f,0.9375f, +0.898438f,0.9375f, +0.90625f,0.9375f, +0.914063f,0.9375f, +0.921875f,0.9375f, +0.929688f,0.9375f, +0.9375f,0.9375f, +0.945313f,0.9375f, +0.953125f,0.9375f, +0.960938f,0.9375f, +0.96875f,0.9375f, +0.976563f,0.9375f, +0.984375f,0.9375f, +0.992188f,0.9375f, +1.0f,0.9375f, +0.507813f,0.945313f, +0.515625f,0.945313f, +0.523438f,0.945313f, +0.53125f,0.945313f, +0.539063f,0.945313f, +0.546875f,0.945313f, +0.554688f,0.945313f, +0.5625f,0.945313f, +0.570313f,0.945313f, +0.578125f,0.945313f, +0.585938f,0.945313f, +0.59375f,0.945313f, +0.601563f,0.945313f, +0.609375f,0.945313f, +0.617188f,0.945313f, +0.625f,0.945313f, +0.632813f,0.945313f, +0.640625f,0.945313f, +0.648438f,0.945313f, +0.65625f,0.945313f, +0.664063f,0.945313f, +0.671875f,0.945313f, +0.679688f,0.945313f, +0.6875f,0.945313f, +0.695313f,0.945313f, +0.703125f,0.945313f, +0.710938f,0.945313f, +0.71875f,0.945313f, +0.726563f,0.945313f, +0.734375f,0.945313f, +0.742188f,0.945313f, +0.75f,0.945313f, +0.757813f,0.945313f, +0.765625f,0.945313f, +0.773438f,0.945313f, +0.78125f,0.945313f, +0.789063f,0.945313f, +0.796875f,0.945313f, +0.804688f,0.945313f, +0.8125f,0.945313f, +0.820313f,0.945313f, +0.828125f,0.945313f, +0.835938f,0.945313f, +0.84375f,0.945313f, +0.851563f,0.945313f, +0.859375f,0.945313f, +0.867188f,0.945313f, +0.875f,0.945313f, +0.882813f,0.945313f, +0.890625f,0.945313f, +0.898438f,0.945313f, +0.90625f,0.945313f, +0.914063f,0.945313f, +0.921875f,0.945313f, +0.929688f,0.945313f, +0.9375f,0.945313f, +0.945313f,0.945313f, +0.953125f,0.945313f, +0.960938f,0.945313f, +0.96875f,0.945313f, +0.976563f,0.945313f, +0.984375f,0.945313f, +0.992188f,0.945313f, +1.0f,0.945313f, +0.507813f,0.953125f, +0.515625f,0.953125f, +0.523438f,0.953125f, +0.53125f,0.953125f, +0.539063f,0.953125f, +0.546875f,0.953125f, +0.554688f,0.953125f, +0.5625f,0.953125f, +0.570313f,0.953125f, +0.578125f,0.953125f, +0.585938f,0.953125f, +0.59375f,0.953125f, +0.601563f,0.953125f, +0.609375f,0.953125f, +0.617188f,0.953125f, +0.625f,0.953125f, +0.632813f,0.953125f, +0.640625f,0.953125f, +0.648438f,0.953125f, +0.65625f,0.953125f, +0.664063f,0.953125f, +0.671875f,0.953125f, +0.679688f,0.953125f, +0.6875f,0.953125f, +0.695313f,0.953125f, +0.703125f,0.953125f, +0.710938f,0.953125f, +0.71875f,0.953125f, +0.726563f,0.953125f, +0.734375f,0.953125f, +0.742188f,0.953125f, +0.75f,0.953125f, +0.757813f,0.953125f, +0.765625f,0.953125f, +0.773438f,0.953125f, +0.78125f,0.953125f, +0.789063f,0.953125f, +0.796875f,0.953125f, +0.804688f,0.953125f, +0.8125f,0.953125f, +0.820313f,0.953125f, +0.828125f,0.953125f, +0.835938f,0.953125f, +0.84375f,0.953125f, +0.851563f,0.953125f, +0.859375f,0.953125f, +0.867188f,0.953125f, +0.875f,0.953125f, +0.882813f,0.953125f, +0.890625f,0.953125f, +0.898438f,0.953125f, +0.90625f,0.953125f, +0.914063f,0.953125f, +0.921875f,0.953125f, +0.929688f,0.953125f, +0.9375f,0.953125f, +0.945313f,0.953125f, +0.953125f,0.953125f, +0.960938f,0.953125f, +0.96875f,0.953125f, +0.976563f,0.953125f, +0.984375f,0.953125f, +0.992188f,0.953125f, +1.0f,0.953125f, +0.507813f,0.960938f, +0.515625f,0.960938f, +0.523438f,0.960938f, +0.53125f,0.960938f, +0.539063f,0.960938f, +0.546875f,0.960938f, +0.554688f,0.960938f, +0.5625f,0.960938f, +0.570313f,0.960938f, +0.578125f,0.960938f, +0.585938f,0.960938f, +0.59375f,0.960938f, +0.601563f,0.960938f, +0.609375f,0.960938f, +0.617188f,0.960938f, +0.625f,0.960938f, +0.632813f,0.960938f, +0.640625f,0.960938f, +0.648438f,0.960938f, +0.65625f,0.960938f, +0.664063f,0.960938f, +0.671875f,0.960938f, +0.679688f,0.960938f, +0.6875f,0.960938f, +0.695313f,0.960938f, +0.703125f,0.960938f, +0.710938f,0.960938f, +0.71875f,0.960938f, +0.726563f,0.960938f, +0.734375f,0.960938f, +0.742188f,0.960938f, +0.75f,0.960938f, +0.757813f,0.960938f, +0.765625f,0.960938f, +0.773438f,0.960938f, +0.78125f,0.960938f, +0.789063f,0.960938f, +0.796875f,0.960938f, +0.804688f,0.960938f, +0.8125f,0.960938f, +0.820313f,0.960938f, +0.828125f,0.960938f, +0.835938f,0.960938f, +0.84375f,0.960938f, +0.851563f,0.960938f, +0.859375f,0.960938f, +0.867188f,0.960938f, +0.875f,0.960938f, +0.882813f,0.960938f, +0.890625f,0.960938f, +0.898438f,0.960938f, +0.90625f,0.960938f, +0.914063f,0.960938f, +0.921875f,0.960938f, +0.929688f,0.960938f, +0.9375f,0.960938f, +0.945313f,0.960938f, +0.953125f,0.960938f, +0.960938f,0.960938f, +0.96875f,0.960938f, +0.976563f,0.960938f, +0.984375f,0.960938f, +0.992188f,0.960938f, +1.0f,0.960938f, +0.507813f,0.96875f, +0.515625f,0.96875f, +0.523438f,0.96875f, +0.53125f,0.96875f, +0.539063f,0.96875f, +0.546875f,0.96875f, +0.554688f,0.96875f, +0.5625f,0.96875f, +0.570313f,0.96875f, +0.578125f,0.96875f, +0.585938f,0.96875f, +0.59375f,0.96875f, +0.601563f,0.96875f, +0.609375f,0.96875f, +0.617188f,0.96875f, +0.625f,0.96875f, +0.632813f,0.96875f, +0.640625f,0.96875f, +0.648438f,0.96875f, +0.65625f,0.96875f, +0.664063f,0.96875f, +0.671875f,0.96875f, +0.679688f,0.96875f, +0.6875f,0.96875f, +0.695313f,0.96875f, +0.703125f,0.96875f, +0.710938f,0.96875f, +0.71875f,0.96875f, +0.726563f,0.96875f, +0.734375f,0.96875f, +0.742188f,0.96875f, +0.75f,0.96875f, +0.757813f,0.96875f, +0.765625f,0.96875f, +0.773438f,0.96875f, +0.78125f,0.96875f, +0.789063f,0.96875f, +0.796875f,0.96875f, +0.804688f,0.96875f, +0.8125f,0.96875f, +0.820313f,0.96875f, +0.828125f,0.96875f, +0.835938f,0.96875f, +0.84375f,0.96875f, +0.851563f,0.96875f, +0.859375f,0.96875f, +0.867188f,0.96875f, +0.875f,0.96875f, +0.882813f,0.96875f, +0.890625f,0.96875f, +0.898438f,0.96875f, +0.90625f,0.96875f, +0.914063f,0.96875f, +0.921875f,0.96875f, +0.929688f,0.96875f, +0.9375f,0.96875f, +0.945313f,0.96875f, +0.953125f,0.96875f, +0.960938f,0.96875f, +0.96875f,0.96875f, +0.976563f,0.96875f, +0.984375f,0.96875f, +0.992188f,0.96875f, +1.0f,0.96875f, +0.507813f,0.976563f, +0.515625f,0.976563f, +0.523438f,0.976563f, +0.53125f,0.976563f, +0.539063f,0.976563f, +0.546875f,0.976563f, +0.554688f,0.976563f, +0.5625f,0.976563f, +0.570313f,0.976563f, +0.578125f,0.976563f, +0.585938f,0.976563f, +0.59375f,0.976563f, +0.601563f,0.976563f, +0.609375f,0.976563f, +0.617188f,0.976563f, +0.625f,0.976563f, +0.632813f,0.976563f, +0.640625f,0.976563f, +0.648438f,0.976563f, +0.65625f,0.976563f, +0.664063f,0.976563f, +0.671875f,0.976563f, +0.679688f,0.976563f, +0.6875f,0.976563f, +0.695313f,0.976563f, +0.703125f,0.976563f, +0.710938f,0.976563f, +0.71875f,0.976563f, +0.726563f,0.976563f, +0.734375f,0.976563f, +0.742188f,0.976563f, +0.75f,0.976563f, +0.757813f,0.976563f, +0.765625f,0.976563f, +0.773438f,0.976563f, +0.78125f,0.976563f, +0.789063f,0.976563f, +0.796875f,0.976563f, +0.804688f,0.976563f, +0.8125f,0.976563f, +0.820313f,0.976563f, +0.828125f,0.976563f, +0.835938f,0.976563f, +0.84375f,0.976563f, +0.851563f,0.976563f, +0.859375f,0.976563f, +0.867188f,0.976563f, +0.875f,0.976563f, +0.882813f,0.976563f, +0.890625f,0.976563f, +0.898438f,0.976563f, +0.90625f,0.976563f, +0.914063f,0.976563f, +0.921875f,0.976563f, +0.929688f,0.976563f, +0.9375f,0.976563f, +0.945313f,0.976563f, +0.953125f,0.976563f, +0.960938f,0.976563f, +0.96875f,0.976563f, +0.976563f,0.976563f, +0.984375f,0.976563f, +0.992188f,0.976563f, +1.0f,0.976563f, +0.507813f,0.984375f, +0.515625f,0.984375f, +0.523438f,0.984375f, +0.53125f,0.984375f, +0.539063f,0.984375f, +0.546875f,0.984375f, +0.554688f,0.984375f, +0.5625f,0.984375f, +0.570313f,0.984375f, +0.578125f,0.984375f, +0.585938f,0.984375f, +0.59375f,0.984375f, +0.601563f,0.984375f, +0.609375f,0.984375f, +0.617188f,0.984375f, +0.625f,0.984375f, +0.632813f,0.984375f, +0.640625f,0.984375f, +0.648438f,0.984375f, +0.65625f,0.984375f, +0.664063f,0.984375f, +0.671875f,0.984375f, +0.679688f,0.984375f, +0.6875f,0.984375f, +0.695313f,0.984375f, +0.703125f,0.984375f, +0.710938f,0.984375f, +0.71875f,0.984375f, +0.726563f,0.984375f, +0.734375f,0.984375f, +0.742188f,0.984375f, +0.75f,0.984375f, +0.757813f,0.984375f, +0.765625f,0.984375f, +0.773438f,0.984375f, +0.78125f,0.984375f, +0.789063f,0.984375f, +0.796875f,0.984375f, +0.804688f,0.984375f, +0.8125f,0.984375f, +0.820313f,0.984375f, +0.828125f,0.984375f, +0.835938f,0.984375f, +0.84375f,0.984375f, +0.851563f,0.984375f, +0.859375f,0.984375f, +0.867188f,0.984375f, +0.875f,0.984375f, +0.882813f,0.984375f, +0.890625f,0.984375f, +0.898438f,0.984375f, +0.90625f,0.984375f, +0.914063f,0.984375f, +0.921875f,0.984375f, +0.929688f,0.984375f, +0.9375f,0.984375f, +0.945313f,0.984375f, +0.953125f,0.984375f, +0.960938f,0.984375f, +0.96875f,0.984375f, +0.976563f,0.984375f, +0.984375f,0.984375f, +0.992188f,0.984375f, +1.0f,0.984375f, +0.507813f,0.992188f, +0.515625f,0.992188f, +0.523438f,0.992188f, +0.53125f,0.992188f, +0.539063f,0.992188f, +0.546875f,0.992188f, +0.554688f,0.992188f, +0.5625f,0.992188f, +0.570313f,0.992188f, +0.578125f,0.992188f, +0.585938f,0.992188f, +0.59375f,0.992188f, +0.601563f,0.992188f, +0.609375f,0.992188f, +0.617188f,0.992188f, +0.625f,0.992188f, +0.632813f,0.992188f, +0.640625f,0.992188f, +0.648438f,0.992188f, +0.65625f,0.992188f, +0.664063f,0.992188f, +0.671875f,0.992188f, +0.679688f,0.992188f, +0.6875f,0.992188f, +0.695313f,0.992188f, +0.703125f,0.992188f, +0.710938f,0.992188f, +0.71875f,0.992188f, +0.726563f,0.992188f, +0.734375f,0.992188f, +0.742188f,0.992188f, +0.75f,0.992188f, +0.757813f,0.992188f, +0.765625f,0.992188f, +0.773438f,0.992188f, +0.78125f,0.992188f, +0.789063f,0.992188f, +0.796875f,0.992188f, +0.804688f,0.992188f, +0.8125f,0.992188f, +0.820313f,0.992188f, +0.828125f,0.992188f, +0.835938f,0.992188f, +0.84375f,0.992188f, +0.851563f,0.992188f, +0.859375f,0.992188f, +0.867188f,0.992188f, +0.875f,0.992188f, +0.882813f,0.992188f, +0.890625f,0.992188f, +0.898438f,0.992188f, +0.90625f,0.992188f, +0.914063f,0.992188f, +0.921875f,0.992188f, +0.929688f,0.992188f, +0.9375f,0.992188f, +0.945313f,0.992188f, +0.953125f,0.992188f, +0.960938f,0.992188f, +0.96875f,0.992188f, +0.976563f,0.992188f, +0.984375f,0.992188f, +0.992188f,0.992188f, +1.0f,0.992188f, +0.507813f,1.0f, +0.515625f,1.0f, +0.523438f,1.0f, +0.53125f,1.0f, +0.539063f,1.0f, +0.546875f,1.0f, +0.554688f,1.0f, +0.5625f,1.0f, +0.570313f,1.0f, +0.578125f,1.0f, +0.585938f,1.0f, +0.59375f,1.0f, +0.601563f,1.0f, +0.609375f,1.0f, +0.617188f,1.0f, +0.625f,1.0f, +0.632813f,1.0f, +0.640625f,1.0f, +0.648438f,1.0f, +0.65625f,1.0f, +0.664063f,1.0f, +0.671875f,1.0f, +0.679688f,1.0f, +0.6875f,1.0f, +0.695313f,1.0f, +0.703125f,1.0f, +0.710938f,1.0f, +0.71875f,1.0f, +0.726563f,1.0f, +0.734375f,1.0f, +0.742188f,1.0f, +0.75f,1.0f, +0.757813f,1.0f, +0.765625f,1.0f, +0.773438f,1.0f, +0.78125f,1.0f, +0.789063f,1.0f, +0.796875f,1.0f, +0.804688f,1.0f, +0.8125f,1.0f, +0.820313f,1.0f, +0.828125f,1.0f, +0.835938f,1.0f, +0.84375f,1.0f, +0.851563f,1.0f, +0.859375f,1.0f, +0.867188f,1.0f, +0.875f,1.0f, +0.882813f,1.0f, +0.890625f,1.0f, +0.898438f,1.0f, +0.90625f,1.0f, +0.914063f,1.0f, +0.921875f,1.0f, +0.929688f,1.0f, +0.9375f,1.0f, +0.945313f,1.0f, +0.953125f,1.0f, +0.960938f,1.0f, +0.96875f,1.0f, +0.976563f,1.0f, +0.984375f,1.0f, +0.992188f,1.0f, +1.0f,1.0f, +}; + +unsigned short Landscape07Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +2048,1984,2049, +1985,2049,1984, +2049,1985,2050, +1986,2050,1985, +2050,1986,2051, +1987,2051,1986, +2051,1987,2052, +1988,2052,1987, +2052,1988,2053, +1989,2053,1988, +2053,1989,2054, +1990,2054,1989, +2054,1990,2055, +1991,2055,1990, +2055,1991,2056, +1992,2056,1991, +2056,1992,2057, +1993,2057,1992, +2057,1993,2058, +1994,2058,1993, +2058,1994,2059, +1995,2059,1994, +2059,1995,2060, +1996,2060,1995, +2060,1996,2061, +1997,2061,1996, +2061,1997,2062, +1998,2062,1997, +2062,1998,2063, +1999,2063,1998, +2063,1999,2064, +2000,2064,1999, +2064,2000,2065, +2001,2065,2000, +2065,2001,2066, +2002,2066,2001, +2066,2002,2067, +2003,2067,2002, +2067,2003,2068, +2004,2068,2003, +2068,2004,2069, +2005,2069,2004, +2069,2005,2070, +2006,2070,2005, +2070,2006,2071, +2007,2071,2006, +2071,2007,2072, +2008,2072,2007, +2072,2008,2073, +2009,2073,2008, +2073,2009,2074, +2010,2074,2009, +2074,2010,2075, +2011,2075,2010, +2075,2011,2076, +2012,2076,2011, +2076,2012,2077, +2013,2077,2012, +2077,2013,2078, +2014,2078,2013, +2078,2014,2079, +2015,2079,2014, +2079,2015,2080, +2016,2080,2015, +2080,2016,2081, +2017,2081,2016, +2081,2017,2082, +2018,2082,2017, +2082,2018,2083, +2019,2083,2018, +2083,2019,2084, +2020,2084,2019, +2084,2020,2085, +2021,2085,2020, +2085,2021,2086, +2022,2086,2021, +2086,2022,2087, +2023,2087,2022, +2087,2023,2088, +2024,2088,2023, +2088,2024,2089, +2025,2089,2024, +2089,2025,2090, +2026,2090,2025, +2090,2026,2091, +2027,2091,2026, +2091,2027,2092, +2028,2092,2027, +2092,2028,2093, +2029,2093,2028, +2093,2029,2094, +2030,2094,2029, +2094,2030,2095, +2031,2095,2030, +2095,2031,2096, +2032,2096,2031, +2096,2032,2097, +2033,2097,2032, +2097,2033,2098, +2034,2098,2033, +2098,2034,2099, +2035,2099,2034, +2099,2035,2100, +2036,2100,2035, +2100,2036,2101, +2037,2101,2036, +2101,2037,2102, +2038,2102,2037, +2102,2038,2103, +2039,2103,2038, +2103,2039,2104, +2040,2104,2039, +2104,2040,2105, +2041,2105,2040, +2105,2041,2106, +2042,2106,2041, +2106,2042,2107, +2043,2107,2042, +2107,2043,2108, +2044,2108,2043, +2108,2044,2109, +2045,2109,2044, +2109,2045,2110, +2046,2110,2045, +2110,2046,2111, +2047,2111,2046, +2112,2048,2113, +2049,2113,2048, +2113,2049,2114, +2050,2114,2049, +2114,2050,2115, +2051,2115,2050, +2115,2051,2116, +2052,2116,2051, +2116,2052,2117, +2053,2117,2052, +2117,2053,2118, +2054,2118,2053, +2118,2054,2119, +2055,2119,2054, +2119,2055,2120, +2056,2120,2055, +2120,2056,2121, +2057,2121,2056, +2121,2057,2122, +2058,2122,2057, +2122,2058,2123, +2059,2123,2058, +2123,2059,2124, +2060,2124,2059, +2124,2060,2125, +2061,2125,2060, +2125,2061,2126, +2062,2126,2061, +2126,2062,2127, +2063,2127,2062, +2127,2063,2128, +2064,2128,2063, +2128,2064,2129, +2065,2129,2064, +2129,2065,2130, +2066,2130,2065, +2130,2066,2131, +2067,2131,2066, +2131,2067,2132, +2068,2132,2067, +2132,2068,2133, +2069,2133,2068, +2133,2069,2134, +2070,2134,2069, +2134,2070,2135, +2071,2135,2070, +2135,2071,2136, +2072,2136,2071, +2136,2072,2137, +2073,2137,2072, +2137,2073,2138, +2074,2138,2073, +2138,2074,2139, +2075,2139,2074, +2139,2075,2140, +2076,2140,2075, +2140,2076,2141, +2077,2141,2076, +2141,2077,2142, +2078,2142,2077, +2142,2078,2143, +2079,2143,2078, +2143,2079,2144, +2080,2144,2079, +2144,2080,2145, +2081,2145,2080, +2145,2081,2146, +2082,2146,2081, +2146,2082,2147, +2083,2147,2082, +2147,2083,2148, +2084,2148,2083, +2148,2084,2149, +2085,2149,2084, +2149,2085,2150, +2086,2150,2085, +2150,2086,2151, +2087,2151,2086, +2151,2087,2152, +2088,2152,2087, +2152,2088,2153, +2089,2153,2088, +2153,2089,2154, +2090,2154,2089, +2154,2090,2155, +2091,2155,2090, +2155,2091,2156, +2092,2156,2091, +2156,2092,2157, +2093,2157,2092, +2157,2093,2158, +2094,2158,2093, +2158,2094,2159, +2095,2159,2094, +2159,2095,2160, +2096,2160,2095, +2160,2096,2161, +2097,2161,2096, +2161,2097,2162, +2098,2162,2097, +2162,2098,2163, +2099,2163,2098, +2163,2099,2164, +2100,2164,2099, +2164,2100,2165, +2101,2165,2100, +2165,2101,2166, +2102,2166,2101, +2166,2102,2167, +2103,2167,2102, +2167,2103,2168, +2104,2168,2103, +2168,2104,2169, +2105,2169,2104, +2169,2105,2170, +2106,2170,2105, +2170,2106,2171, +2107,2171,2106, +2171,2107,2172, +2108,2172,2107, +2172,2108,2173, +2109,2173,2108, +2173,2109,2174, +2110,2174,2109, +2174,2110,2175, +2111,2175,2110, +2176,2112,2177, +2113,2177,2112, +2177,2113,2178, +2114,2178,2113, +2178,2114,2179, +2115,2179,2114, +2179,2115,2180, +2116,2180,2115, +2180,2116,2181, +2117,2181,2116, +2181,2117,2182, +2118,2182,2117, +2182,2118,2183, +2119,2183,2118, +2183,2119,2184, +2120,2184,2119, +2184,2120,2185, +2121,2185,2120, +2185,2121,2186, +2122,2186,2121, +2186,2122,2187, +2123,2187,2122, +2187,2123,2188, +2124,2188,2123, +2188,2124,2189, +2125,2189,2124, +2189,2125,2190, +2126,2190,2125, +2190,2126,2191, +2127,2191,2126, +2191,2127,2192, +2128,2192,2127, +2192,2128,2193, +2129,2193,2128, +2193,2129,2194, +2130,2194,2129, +2194,2130,2195, +2131,2195,2130, +2195,2131,2196, +2132,2196,2131, +2196,2132,2197, +2133,2197,2132, +2197,2133,2198, +2134,2198,2133, +2198,2134,2199, +2135,2199,2134, +2199,2135,2200, +2136,2200,2135, +2200,2136,2201, +2137,2201,2136, +2201,2137,2202, +2138,2202,2137, +2202,2138,2203, +2139,2203,2138, +2203,2139,2204, +2140,2204,2139, +2204,2140,2205, +2141,2205,2140, +2205,2141,2206, +2142,2206,2141, +2206,2142,2207, +2143,2207,2142, +2207,2143,2208, +2144,2208,2143, +2208,2144,2209, +2145,2209,2144, +2209,2145,2210, +2146,2210,2145, +2210,2146,2211, +2147,2211,2146, +2211,2147,2212, +2148,2212,2147, +2212,2148,2213, +2149,2213,2148, +2213,2149,2214, +2150,2214,2149, +2214,2150,2215, +2151,2215,2150, +2215,2151,2216, +2152,2216,2151, +2216,2152,2217, +2153,2217,2152, +2217,2153,2218, +2154,2218,2153, +2218,2154,2219, +2155,2219,2154, +2219,2155,2220, +2156,2220,2155, +2220,2156,2221, +2157,2221,2156, +2221,2157,2222, +2158,2222,2157, +2222,2158,2223, +2159,2223,2158, +2223,2159,2224, +2160,2224,2159, +2224,2160,2225, +2161,2225,2160, +2225,2161,2226, +2162,2226,2161, +2226,2162,2227, +2163,2227,2162, +2227,2163,2228, +2164,2228,2163, +2228,2164,2229, +2165,2229,2164, +2229,2165,2230, +2166,2230,2165, +2230,2166,2231, +2167,2231,2166, +2231,2167,2232, +2168,2232,2167, +2232,2168,2233, +2169,2233,2168, +2233,2169,2234, +2170,2234,2169, +2234,2170,2235, +2171,2235,2170, +2235,2171,2236, +2172,2236,2171, +2236,2172,2237, +2173,2237,2172, +2237,2173,2238, +2174,2238,2173, +2238,2174,2239, +2175,2239,2174, +}; + +#define Landscape08VtxCount 2178 +#define Landscape08IdxCount 12480 + +btScalar Landscape08Vtx[] = { +-250.0f,30.98f,-128.906f, +-250.0f,31.4025f,-125.0f, +-246.094f,31.7629f,-128.906f, +-246.094f,31.4165f,-125.0f, +-242.188f,32.5689f,-128.906f, +-242.188f,32.314f,-125.0f, +-238.281f,32.9125f,-128.906f, +-238.281f,32.9822f,-125.0f, +-234.375f,32.5915f,-128.906f, +-234.375f,32.6962f,-125.0f, +-230.469f,31.2708f,-128.906f, +-230.469f,31.3632f,-125.0f, +-226.563f,30.5212f,-128.906f, +-226.563f,29.4391f,-125.0f, +-222.656f,30.2031f,-128.906f, +-222.656f,29.519f,-125.0f, +-218.75f,30.4582f,-128.906f, +-218.75f,29.4481f,-125.0f, +-214.844f,30.6941f,-128.906f, +-214.844f,29.8481f,-125.0f, +-210.938f,30.5035f,-128.906f, +-210.938f,30.408f,-125.0f, +-207.031f,30.2726f,-128.906f, +-207.031f,30.291f,-125.0f, +-203.125f,29.38f,-128.906f, +-203.125f,28.7473f,-125.0f, +-199.219f,28.6973f,-128.906f, +-199.219f,28.1816f,-125.0f, +-195.313f,27.9768f,-128.906f, +-195.313f,27.2839f,-125.0f, +-191.406f,26.1169f,-128.906f, +-191.406f,25.7018f,-125.0f, +-187.5f,23.8648f,-128.906f, +-187.5f,23.2882f,-125.0f, +-183.594f,21.95f,-128.906f, +-183.594f,22.1614f,-125.0f, +-179.688f,19.6798f,-128.906f, +-179.688f,20.658f,-125.0f, +-175.781f,17.3507f,-128.906f, +-175.781f,18.8433f,-125.0f, +-171.875f,15.7914f,-128.906f, +-171.875f,16.364f,-125.0f, +-167.969f,14.3745f,-128.906f, +-167.969f,14.7298f,-125.0f, +-164.063f,12.4911f,-128.906f, +-164.063f,12.9859f,-125.0f, +-160.156f,11.0533f,-128.906f, +-160.156f,11.3306f,-125.0f, +-156.25f,9.15062f,-128.906f, +-156.25f,10.1916f,-125.0f, +-152.344f,6.68059f,-128.906f, +-152.344f,8.3967f,-125.0f, +-148.438f,5.57112f,-128.906f, +-148.438f,6.23292f,-125.0f, +-144.531f,5.2271f,-128.906f, +-144.531f,5.48985f,-125.0f, +-140.625f,5.87576f,-128.906f, +-140.625f,5.18276f,-125.0f, +-136.719f,6.85614f,-128.906f, +-136.719f,5.56059f,-125.0f, +-132.813f,6.86087f,-128.906f, +-132.813f,5.75157f,-125.0f, +-128.906f,7.10341f,-128.906f, +-128.906f,5.32154f,-125.0f, +-125.0f,7.54727f,-128.906f, +-125.0f,6.15672f,-125.0f, +-121.094f,8.02225f,-128.906f, +-121.094f,7.53373f,-125.0f, +-117.188f,8.70065f,-128.906f, +-117.188f,8.38676f,-125.0f, +-113.281f,9.39689f,-128.906f, +-113.281f,8.64274f,-125.0f, +-109.375f,8.80449f,-128.906f, +-109.375f,8.49941f,-125.0f, +-105.469f,9.43366f,-128.906f, +-105.469f,9.24481f,-125.0f, +-101.563f,10.868f,-128.906f, +-101.563f,11.5178f,-125.0f, +-97.6563f,12.8404f,-128.906f, +-97.6563f,13.4113f,-125.0f, +-93.75f,14.8214f,-128.906f, +-93.75f,15.4997f,-125.0f, +-89.8438f,16.618f,-128.906f, +-89.8438f,17.3502f,-125.0f, +-85.9375f,20.2496f,-128.906f, +-85.9375f,20.8168f,-125.0f, +-82.0313f,23.697f,-128.906f, +-82.0313f,24.9405f,-125.0f, +-78.125f,26.4451f,-128.906f, +-78.125f,27.8681f,-125.0f, +-74.2188f,28.7901f,-128.906f, +-74.2188f,30.1495f,-125.0f, +-70.3125f,31.4052f,-128.906f, +-70.3125f,32.4402f,-125.0f, +-66.4063f,33.3106f,-128.906f, +-66.4063f,34.2537f,-125.0f, +-62.5f,35.8538f,-128.906f, +-62.5f,36.5623f,-125.0f, +-58.5938f,37.9798f,-128.906f, +-58.5938f,38.9027f,-125.0f, +-54.6875f,39.4006f,-128.906f, +-54.6875f,40.1192f,-125.0f, +-50.7813f,40.6584f,-128.906f, +-50.7813f,41.9393f,-125.0f, +-46.875f,40.8896f,-128.906f, +-46.875f,41.8765f,-125.0f, +-42.9688f,39.9544f,-128.906f, +-42.9688f,41.6371f,-125.0f, +-39.0625f,40.0893f,-128.906f, +-39.0625f,41.6432f,-125.0f, +-35.1563f,39.3183f,-128.906f, +-35.1563f,41.2852f,-125.0f, +-31.25f,39.8575f,-128.906f, +-31.25f,41.5629f,-125.0f, +-27.3438f,41.5378f,-128.906f, +-27.3438f,42.2956f,-125.0f, +-23.4375f,44.0561f,-128.906f, +-23.4375f,43.9719f,-125.0f, +-19.5313f,45.4298f,-128.906f, +-19.5313f,46.2232f,-125.0f, +-15.625f,47.4474f,-128.906f, +-15.625f,47.3104f,-125.0f, +-11.7188f,48.0018f,-128.906f, +-11.7188f,47.5943f,-125.0f, +-7.8125f,48.0717f,-128.906f, +-7.8125f,49.1192f,-125.0f, +-3.90625f,48.7253f,-128.906f, +-3.90625f,49.6341f,-125.0f, +0.0f,49.8f,-128.906f, +0.0f,50.3481f,-125.0f, +3.90625f,50.4716f,-128.906f, +3.90625f,50.3021f,-125.0f, +-250.0f,31.1145f,-132.813f, +-246.094f,31.857f,-132.813f, +-242.188f,32.7446f,-132.813f, +-238.281f,33.1734f,-132.813f, +-234.375f,32.1952f,-132.813f, +-230.469f,31.8959f,-132.813f, +-226.563f,32.1326f,-132.813f, +-222.656f,32.1631f,-132.813f, +-218.75f,31.3795f,-132.813f, +-214.844f,30.9888f,-132.813f, +-210.938f,30.5577f,-132.813f, +-207.031f,30.1392f,-132.813f, +-203.125f,29.8482f,-132.813f, +-199.219f,28.5903f,-132.813f, +-195.313f,27.4671f,-132.813f, +-191.406f,25.5032f,-132.813f, +-187.5f,23.2799f,-132.813f, +-183.594f,21.2846f,-132.813f, +-179.688f,19.3954f,-132.813f, +-175.781f,18.1112f,-132.813f, +-171.875f,16.3831f,-132.813f, +-167.969f,14.5038f,-132.813f, +-164.063f,12.8109f,-132.813f, +-160.156f,10.386f,-132.813f, +-156.25f,7.93486f,-132.813f, +-152.344f,7.25449f,-132.813f, +-148.438f,6.19974f,-132.813f, +-144.531f,5.89578f,-132.813f, +-140.625f,6.61884f,-132.813f, +-136.719f,7.53382f,-132.813f, +-132.813f,8.21024f,-132.813f, +-128.906f,8.74115f,-132.813f, +-125.0f,8.97047f,-132.813f, +-121.094f,9.41307f,-132.813f, +-117.188f,10.0468f,-132.813f, +-113.281f,9.47404f,-132.813f, +-109.375f,9.418f,-132.813f, +-105.469f,10.3176f,-132.813f, +-101.563f,11.3001f,-132.813f, +-97.6563f,12.5318f,-132.813f, +-93.75f,14.6986f,-132.813f, +-89.8438f,16.6495f,-132.813f, +-85.9375f,19.1906f,-132.813f, +-82.0313f,23.4349f,-132.813f, +-78.125f,26.1629f,-132.813f, +-74.2188f,28.739f,-132.813f, +-70.3125f,31.1271f,-132.813f, +-66.4063f,32.2452f,-132.813f, +-62.5f,34.0303f,-132.813f, +-58.5938f,36.1234f,-132.813f, +-54.6875f,38.3054f,-132.813f, +-50.7813f,38.7936f,-132.813f, +-46.875f,39.1319f,-132.813f, +-42.9688f,39.1462f,-132.813f, +-39.0625f,38.4732f,-132.813f, +-35.1563f,38.3061f,-132.813f, +-31.25f,39.4999f,-132.813f, +-27.3438f,41.8953f,-132.813f, +-23.4375f,43.2645f,-132.813f, +-19.5313f,44.7736f,-132.813f, +-15.625f,46.2491f,-132.813f, +-11.7188f,47.4527f,-132.813f, +-7.8125f,47.1407f,-132.813f, +-3.90625f,48.0628f,-132.813f, +0.0f,48.5651f,-132.813f, +3.90625f,49.1054f,-132.813f, +-250.0f,30.7461f,-136.719f, +-246.094f,30.8483f,-136.719f, +-242.188f,32.188f,-136.719f, +-238.281f,33.149f,-136.719f, +-234.375f,32.3165f,-136.719f, +-230.469f,32.613f,-136.719f, +-226.563f,33.3246f,-136.719f, +-222.656f,32.6429f,-136.719f, +-218.75f,31.8882f,-136.719f, +-214.844f,31.5125f,-136.719f, +-210.938f,30.2065f,-136.719f, +-207.031f,30.0024f,-136.719f, +-203.125f,29.5699f,-136.719f, +-199.219f,28.1245f,-136.719f, +-195.313f,26.764f,-136.719f, +-191.406f,24.8025f,-136.719f, +-187.5f,22.7863f,-136.719f, +-183.594f,21.0979f,-136.719f, +-179.688f,19.5742f,-136.719f, +-175.781f,17.9263f,-136.719f, +-171.875f,16.0908f,-136.719f, +-167.969f,14.6542f,-136.719f, +-164.063f,12.4534f,-136.719f, +-160.156f,9.93763f,-136.719f, +-156.25f,7.87486f,-136.719f, +-152.344f,7.06627f,-136.719f, +-148.438f,6.22453f,-136.719f, +-144.531f,6.39864f,-136.719f, +-140.625f,7.02103f,-136.719f, +-136.719f,7.85488f,-136.719f, +-132.813f,9.33235f,-136.719f, +-128.906f,10.546f,-136.719f, +-125.0f,10.1958f,-136.719f, +-121.094f,9.85385f,-136.719f, +-117.188f,10.2437f,-136.719f, +-113.281f,9.95341f,-136.719f, +-109.375f,9.05387f,-136.719f, +-105.469f,10.3384f,-136.719f, +-101.563f,11.2859f,-136.719f, +-97.6563f,12.3544f,-136.719f, +-93.75f,14.0582f,-136.719f, +-89.8438f,15.9772f,-136.719f, +-85.9375f,18.8673f,-136.719f, +-82.0313f,22.2278f,-136.719f, +-78.125f,25.0468f,-136.719f, +-74.2188f,27.6452f,-136.719f, +-70.3125f,29.155f,-136.719f, +-66.4063f,30.7457f,-136.719f, +-62.5f,32.6722f,-136.719f, +-58.5938f,34.5222f,-136.719f, +-54.6875f,36.3904f,-136.719f, +-50.7813f,36.1946f,-136.719f, +-46.875f,36.5194f,-136.719f, +-42.9688f,36.2715f,-136.719f, +-39.0625f,36.4185f,-136.719f, +-35.1563f,37.1668f,-136.719f, +-31.25f,38.3933f,-136.719f, +-27.3438f,40.8416f,-136.719f, +-23.4375f,42.7243f,-136.719f, +-19.5313f,43.7567f,-136.719f, +-15.625f,44.7705f,-136.719f, +-11.7188f,45.3267f,-136.719f, +-7.8125f,46.433f,-136.719f, +-3.90625f,47.3134f,-136.719f, +0.0f,48.4146f,-136.719f, +3.90625f,47.9f,-136.719f, +-250.0f,29.1575f,-140.625f, +-246.094f,30.5173f,-140.625f, +-242.188f,31.576f,-140.625f, +-238.281f,31.6992f,-140.625f, +-234.375f,32.9063f,-140.625f, +-230.469f,33.2752f,-140.625f, +-226.563f,32.8003f,-140.625f, +-222.656f,33.133f,-140.625f, +-218.75f,32.0543f,-140.625f, +-214.844f,31.2672f,-140.625f, +-210.938f,30.2378f,-140.625f, +-207.031f,29.601f,-140.625f, +-203.125f,28.4643f,-140.625f, +-199.219f,26.8711f,-140.625f, +-195.313f,24.936f,-140.625f, +-191.406f,22.9115f,-140.625f, +-187.5f,21.8507f,-140.625f, +-183.594f,20.4435f,-140.625f, +-179.688f,18.4455f,-140.625f, +-175.781f,17.1667f,-140.625f, +-171.875f,15.2077f,-140.625f, +-167.969f,13.4799f,-140.625f, +-164.063f,11.7723f,-140.625f, +-160.156f,9.26955f,-140.625f, +-156.25f,7.56528f,-140.625f, +-152.344f,6.4244f,-140.625f, +-148.438f,6.60539f,-140.625f, +-144.531f,6.44163f,-140.625f, +-140.625f,6.55017f,-140.625f, +-136.719f,7.62805f,-140.625f, +-132.813f,9.20726f,-140.625f, +-128.906f,10.5063f,-140.625f, +-125.0f,10.6867f,-140.625f, +-121.094f,9.3702f,-140.625f, +-117.188f,9.53484f,-140.625f, +-113.281f,8.855f,-140.625f, +-109.375f,9.3082f,-140.625f, +-105.469f,9.67718f,-140.625f, +-101.563f,10.5233f,-140.625f, +-97.6563f,11.8026f,-140.625f, +-93.75f,13.1675f,-140.625f, +-89.8438f,15.253f,-140.625f, +-85.9375f,18.1074f,-140.625f, +-82.0313f,20.8004f,-140.625f, +-78.125f,23.7651f,-140.625f, +-74.2188f,25.7067f,-140.625f, +-70.3125f,27.5126f,-140.625f, +-66.4063f,29.8191f,-140.625f, +-62.5f,31.7367f,-140.625f, +-58.5938f,32.8891f,-140.625f, +-54.6875f,34.0989f,-140.625f, +-50.7813f,34.6645f,-140.625f, +-46.875f,34.0325f,-140.625f, +-42.9688f,33.7773f,-140.625f, +-39.0625f,34.1723f,-140.625f, +-35.1563f,36.0861f,-140.625f, +-31.25f,38.8562f,-140.625f, +-27.3438f,40.5684f,-140.625f, +-23.4375f,42.6832f,-140.625f, +-19.5313f,43.505f,-140.625f, +-15.625f,43.7197f,-140.625f, +-11.7188f,43.8656f,-140.625f, +-7.8125f,45.6272f,-140.625f, +-3.90625f,46.7713f,-140.625f, +0.0f,47.1255f,-140.625f, +3.90625f,47.2681f,-140.625f, +-250.0f,28.3388f,-144.531f, +-246.094f,29.5689f,-144.531f, +-242.188f,30.0422f,-144.531f, +-238.281f,30.6319f,-144.531f, +-234.375f,32.5914f,-144.531f, +-230.469f,33.306f,-144.531f, +-226.563f,32.9265f,-144.531f, +-222.656f,32.5363f,-144.531f, +-218.75f,31.8845f,-144.531f, +-214.844f,31.7429f,-144.531f, +-210.938f,29.6521f,-144.531f, +-207.031f,28.3301f,-144.531f, +-203.125f,26.8166f,-144.531f, +-199.219f,25.0756f,-144.531f, +-195.313f,23.0988f,-144.531f, +-191.406f,21.2037f,-144.531f, +-187.5f,20.271f,-144.531f, +-183.594f,18.4189f,-144.531f, +-179.688f,16.2352f,-144.531f, +-175.781f,14.734f,-144.531f, +-171.875f,13.9522f,-144.531f, +-167.969f,12.543f,-144.531f, +-164.063f,10.6335f,-144.531f, +-160.156f,8.53885f,-144.531f, +-156.25f,7.32299f,-144.531f, +-152.344f,6.69849f,-144.531f, +-148.438f,5.37792f,-144.531f, +-144.531f,5.52557f,-144.531f, +-140.625f,5.94721f,-144.531f, +-136.719f,7.15949f,-144.531f, +-132.813f,8.5533f,-144.531f, +-128.906f,9.68048f,-144.531f, +-125.0f,9.80421f,-144.531f, +-121.094f,9.67052f,-144.531f, +-117.188f,9.82889f,-144.531f, +-113.281f,9.40895f,-144.531f, +-109.375f,9.53728f,-144.531f, +-105.469f,9.89567f,-144.531f, +-101.563f,10.4472f,-144.531f, +-97.6563f,11.3813f,-144.531f, +-93.75f,13.6687f,-144.531f, +-89.8438f,15.6897f,-144.531f, +-85.9375f,17.6694f,-144.531f, +-82.0313f,20.0542f,-144.531f, +-78.125f,22.2881f,-144.531f, +-74.2188f,24.021f,-144.531f, +-70.3125f,26.6221f,-144.531f, +-66.4063f,28.7647f,-144.531f, +-62.5f,31.0025f,-144.531f, +-58.5938f,31.9212f,-144.531f, +-54.6875f,32.1124f,-144.531f, +-50.7813f,33.4656f,-144.531f, +-46.875f,33.5412f,-144.531f, +-42.9688f,33.5562f,-144.531f, +-39.0625f,34.3563f,-144.531f, +-35.1563f,36.2482f,-144.531f, +-31.25f,37.99f,-144.531f, +-27.3438f,40.3527f,-144.531f, +-23.4375f,42.4204f,-144.531f, +-19.5313f,44.0f,-144.531f, +-15.625f,44.183f,-144.531f, +-11.7188f,44.0185f,-144.531f, +-7.8125f,45.08f,-144.531f, +-3.90625f,45.5784f,-144.531f, +0.0f,44.8122f,-144.531f, +3.90625f,45.2398f,-144.531f, +-250.0f,27.5165f,-148.438f, +-246.094f,28.4707f,-148.438f, +-242.188f,28.8693f,-148.438f, +-238.281f,29.8936f,-148.438f, +-234.375f,30.9982f,-148.438f, +-230.469f,31.9158f,-148.438f, +-226.563f,33.0887f,-148.438f, +-222.656f,32.141f,-148.438f, +-218.75f,31.0388f,-148.438f, +-214.844f,30.5599f,-148.438f, +-210.938f,29.1269f,-148.438f, +-207.031f,26.6179f,-148.438f, +-203.125f,25.2859f,-148.438f, +-199.219f,23.1182f,-148.438f, +-195.313f,21.139f,-148.438f, +-191.406f,19.7044f,-148.438f, +-187.5f,18.4387f,-148.438f, +-183.594f,17.6363f,-148.438f, +-179.688f,15.8724f,-148.438f, +-175.781f,14.454f,-148.438f, +-171.875f,13.2052f,-148.438f, +-167.969f,11.7702f,-148.438f, +-164.063f,10.4965f,-148.438f, +-160.156f,8.29165f,-148.438f, +-156.25f,7.24803f,-148.438f, +-152.344f,6.79621f,-148.438f, +-148.438f,5.48372f,-148.438f, +-144.531f,4.11362f,-148.438f, +-140.625f,4.6586f,-148.438f, +-136.719f,6.20081f,-148.438f, +-132.813f,7.67687f,-148.438f, +-128.906f,9.0742f,-148.438f, +-125.0f,8.8028f,-148.438f, +-121.094f,9.309f,-148.438f, +-117.188f,9.26616f,-148.438f, +-113.281f,9.88711f,-148.438f, +-109.375f,9.19023f,-148.438f, +-105.469f,9.46828f,-148.438f, +-101.563f,10.1584f,-148.438f, +-97.6563f,11.2649f,-148.438f, +-93.75f,13.476f,-148.438f, +-89.8438f,15.8318f,-148.438f, +-85.9375f,17.6136f,-148.438f, +-82.0313f,18.7495f,-148.438f, +-78.125f,20.5385f,-148.438f, +-74.2188f,23.5666f,-148.438f, +-70.3125f,26.2836f,-148.438f, +-66.4063f,28.729f,-148.438f, +-62.5f,30.3854f,-148.438f, +-58.5938f,30.9909f,-148.438f, +-54.6875f,31.4288f,-148.438f, +-50.7813f,31.916f,-148.438f, +-46.875f,32.4745f,-148.438f, +-42.9688f,32.0881f,-148.438f, +-39.0625f,34.0231f,-148.438f, +-35.1563f,35.6432f,-148.438f, +-31.25f,37.6278f,-148.438f, +-27.3438f,39.652f,-148.438f, +-23.4375f,42.3336f,-148.438f, +-19.5313f,43.3336f,-148.438f, +-15.625f,43.9329f,-148.438f, +-11.7188f,43.8742f,-148.438f, +-7.8125f,44.336f,-148.438f, +-3.90625f,44.2738f,-148.438f, +0.0f,42.6429f,-148.438f, +3.90625f,43.4167f,-148.438f, +-250.0f,27.7654f,-152.344f, +-246.094f,28.2588f,-152.344f, +-242.188f,28.0365f,-152.344f, +-238.281f,29.4531f,-152.344f, +-234.375f,31.8507f,-152.344f, +-230.469f,31.9987f,-152.344f, +-226.563f,32.2635f,-152.344f, +-222.656f,32.4573f,-152.344f, +-218.75f,30.3791f,-152.344f, +-214.844f,29.1133f,-152.344f, +-210.938f,27.6466f,-152.344f, +-207.031f,25.5524f,-152.344f, +-203.125f,23.857f,-152.344f, +-199.219f,21.724f,-152.344f, +-195.313f,19.9592f,-152.344f, +-191.406f,18.6648f,-152.344f, +-187.5f,17.3913f,-152.344f, +-183.594f,17.3113f,-152.344f, +-179.688f,15.8776f,-152.344f, +-175.781f,13.7968f,-152.344f, +-171.875f,11.9961f,-152.344f, +-167.969f,10.9315f,-152.344f, +-164.063f,9.24337f,-152.344f, +-160.156f,7.95749f,-152.344f, +-156.25f,6.95525f,-152.344f, +-152.344f,6.523f,-152.344f, +-148.438f,5.62313f,-152.344f, +-144.531f,4.31939f,-152.344f, +-140.625f,3.1203f,-152.344f, +-136.719f,4.98713f,-152.344f, +-132.813f,6.64544f,-152.344f, +-128.906f,7.48658f,-152.344f, +-125.0f,8.08424f,-152.344f, +-121.094f,8.96562f,-152.344f, +-117.188f,9.10159f,-152.344f, +-113.281f,9.38004f,-152.344f, +-109.375f,8.97581f,-152.344f, +-105.469f,8.78511f,-152.344f, +-101.563f,9.76846f,-152.344f, +-97.6563f,10.4299f,-152.344f, +-93.75f,13.6059f,-152.344f, +-89.8438f,16.3193f,-152.344f, +-85.9375f,17.6959f,-152.344f, +-82.0313f,18.5545f,-152.344f, +-78.125f,20.1179f,-152.344f, +-74.2188f,22.929f,-152.344f, +-70.3125f,25.8413f,-152.344f, +-66.4063f,28.4214f,-152.344f, +-62.5f,30.0187f,-152.344f, +-58.5938f,30.4285f,-152.344f, +-54.6875f,30.9236f,-152.344f, +-50.7813f,31.3519f,-152.344f, +-46.875f,31.0939f,-152.344f, +-42.9688f,30.2517f,-152.344f, +-39.0625f,32.8953f,-152.344f, +-35.1563f,34.6998f,-152.344f, +-31.25f,36.8107f,-152.344f, +-27.3438f,38.8491f,-152.344f, +-23.4375f,41.3749f,-152.344f, +-19.5313f,42.0838f,-152.344f, +-15.625f,42.3106f,-152.344f, +-11.7188f,43.9654f,-152.344f, +-7.8125f,44.3642f,-152.344f, +-3.90625f,43.1787f,-152.344f, +0.0f,41.875f,-152.344f, +3.90625f,42.7212f,-152.344f, +-250.0f,27.3076f,-156.25f, +-246.094f,27.8739f,-156.25f, +-242.188f,27.7337f,-156.25f, +-238.281f,28.4499f,-156.25f, +-234.375f,30.5068f,-156.25f, +-230.469f,31.1326f,-156.25f, +-226.563f,32.3149f,-156.25f, +-222.656f,31.2724f,-156.25f, +-218.75f,29.5487f,-156.25f, +-214.844f,26.8408f,-156.25f, +-210.938f,25.2503f,-156.25f, +-207.031f,24.2811f,-156.25f, +-203.125f,23.8635f,-156.25f, +-199.219f,22.2573f,-156.25f, +-195.313f,20.6368f,-156.25f, +-191.406f,19.4922f,-156.25f, +-187.5f,18.0281f,-156.25f, +-183.594f,15.4098f,-156.25f, +-179.688f,13.9176f,-156.25f, +-175.781f,11.8192f,-156.25f, +-171.875f,9.31112f,-156.25f, +-167.969f,8.81167f,-156.25f, +-164.063f,8.04908f,-156.25f, +-160.156f,6.4764f,-156.25f, +-156.25f,5.83656f,-156.25f, +-152.344f,5.70173f,-156.25f, +-148.438f,6.05686f,-156.25f, +-144.531f,3.98364f,-156.25f, +-140.625f,2.80636f,-156.25f, +-136.719f,3.53326f,-156.25f, +-132.813f,4.97177f,-156.25f, +-128.906f,6.71319f,-156.25f, +-125.0f,8.26478f,-156.25f, +-121.094f,9.00909f,-156.25f, +-117.188f,8.8849f,-156.25f, +-113.281f,9.50654f,-156.25f, +-109.375f,9.16878f,-156.25f, +-105.469f,8.84796f,-156.25f, +-101.563f,9.78015f,-156.25f, +-97.6563f,11.1536f,-156.25f, +-93.75f,13.416f,-156.25f, +-89.8438f,15.8674f,-156.25f, +-85.9375f,17.2814f,-156.25f, +-82.0313f,18.1958f,-156.25f, +-78.125f,19.5037f,-156.25f, +-74.2188f,22.0147f,-156.25f, +-70.3125f,24.3288f,-156.25f, +-66.4063f,26.5193f,-156.25f, +-62.5f,27.9571f,-156.25f, +-58.5938f,28.8524f,-156.25f, +-54.6875f,30.6249f,-156.25f, +-50.7813f,30.9824f,-156.25f, +-46.875f,31.0372f,-156.25f, +-42.9688f,30.2189f,-156.25f, +-39.0625f,32.0632f,-156.25f, +-35.1563f,34.0061f,-156.25f, +-31.25f,35.3975f,-156.25f, +-27.3438f,37.8006f,-156.25f, +-23.4375f,40.1384f,-156.25f, +-19.5313f,40.5455f,-156.25f, +-15.625f,41.6044f,-156.25f, +-11.7188f,43.1078f,-156.25f, +-7.8125f,43.5927f,-156.25f, +-3.90625f,43.0245f,-156.25f, +0.0f,41.3824f,-156.25f, +3.90625f,41.7368f,-156.25f, +-250.0f,27.1128f,-160.156f, +-246.094f,26.9845f,-160.156f, +-242.188f,26.7433f,-160.156f, +-238.281f,27.3777f,-160.156f, +-234.375f,29.1743f,-160.156f, +-230.469f,31.0712f,-160.156f, +-226.563f,31.3707f,-160.156f, +-222.656f,30.2327f,-160.156f, +-218.75f,27.897f,-160.156f, +-214.844f,26.4218f,-160.156f, +-210.938f,24.0007f,-160.156f, +-207.031f,23.6445f,-160.156f, +-203.125f,23.6467f,-160.156f, +-199.219f,22.8576f,-160.156f, +-195.313f,20.6778f,-160.156f, +-191.406f,19.3331f,-160.156f, +-187.5f,17.8893f,-160.156f, +-183.594f,14.3376f,-160.156f, +-179.688f,11.9084f,-160.156f, +-175.781f,9.60285f,-160.156f, +-171.875f,7.78231f,-160.156f, +-167.969f,8.15369f,-160.156f, +-164.063f,7.46984f,-160.156f, +-160.156f,6.48522f,-160.156f, +-156.25f,5.27847f,-160.156f, +-152.344f,4.69473f,-160.156f, +-148.438f,5.14018f,-160.156f, +-144.531f,3.26777f,-160.156f, +-140.625f,3.33507f,-160.156f, +-136.719f,2.47156f,-160.156f, +-132.813f,4.15824f,-160.156f, +-128.906f,6.45432f,-160.156f, +-125.0f,7.99373f,-160.156f, +-121.094f,8.38925f,-160.156f, +-117.188f,8.59802f,-160.156f, +-113.281f,9.4891f,-160.156f, +-109.375f,9.20323f,-160.156f, +-105.469f,8.27038f,-160.156f, +-101.563f,9.71848f,-160.156f, +-97.6563f,11.8577f,-160.156f, +-93.75f,14.596f,-160.156f, +-89.8438f,16.1058f,-160.156f, +-85.9375f,17.6531f,-160.156f, +-82.0313f,18.2123f,-160.156f, +-78.125f,18.7175f,-160.156f, +-74.2188f,20.7283f,-160.156f, +-70.3125f,23.5217f,-160.156f, +-66.4063f,26.4239f,-160.156f, +-62.5f,27.757f,-160.156f, +-58.5938f,28.1862f,-160.156f, +-54.6875f,28.9075f,-160.156f, +-50.7813f,29.5287f,-160.156f, +-46.875f,29.3972f,-160.156f, +-42.9688f,29.568f,-160.156f, +-39.0625f,30.605f,-160.156f, +-35.1563f,33.0369f,-160.156f, +-31.25f,34.749f,-160.156f, +-27.3438f,37.4864f,-160.156f, +-23.4375f,39.2291f,-160.156f, +-19.5313f,39.6275f,-160.156f, +-15.625f,39.865f,-160.156f, +-11.7188f,41.1833f,-160.156f, +-7.8125f,41.7789f,-160.156f, +-3.90625f,41.6972f,-160.156f, +0.0f,40.379f,-160.156f, +3.90625f,40.4755f,-160.156f, +-250.0f,26.3982f,-164.063f, +-246.094f,26.3606f,-164.063f, +-242.188f,26.6508f,-164.063f, +-238.281f,27.2228f,-164.063f, +-234.375f,29.1682f,-164.063f, +-230.469f,30.116f,-164.063f, +-226.563f,30.3591f,-164.063f, +-222.656f,28.8713f,-164.063f, +-218.75f,26.8459f,-164.063f, +-214.844f,24.9771f,-164.063f, +-210.938f,24.4581f,-164.063f, +-207.031f,23.6584f,-164.063f, +-203.125f,22.7316f,-164.063f, +-199.219f,21.1836f,-164.063f, +-195.313f,19.6131f,-164.063f, +-191.406f,18.5182f,-164.063f, +-187.5f,16.824f,-164.063f, +-183.594f,13.8772f,-164.063f, +-179.688f,10.3923f,-164.063f, +-175.781f,7.50643f,-164.063f, +-171.875f,6.58466f,-164.063f, +-167.969f,6.81413f,-164.063f, +-164.063f,6.88249f,-164.063f, +-160.156f,6.78655f,-164.063f, +-156.25f,5.18348f,-164.063f, +-152.344f,4.44173f,-164.063f, +-148.438f,4.56392f,-164.063f, +-144.531f,3.00722f,-164.063f, +-140.625f,2.88808f,-164.063f, +-136.719f,2.58477f,-164.063f, +-132.813f,3.20911f,-164.063f, +-128.906f,5.33043f,-164.063f, +-125.0f,6.73698f,-164.063f, +-121.094f,7.71971f,-164.063f, +-117.188f,8.44689f,-164.063f, +-113.281f,9.05366f,-164.063f, +-109.375f,8.81111f,-164.063f, +-105.469f,7.75706f,-164.063f, +-101.563f,11.1131f,-164.063f, +-97.6563f,12.8283f,-164.063f, +-93.75f,14.7771f,-164.063f, +-89.8438f,16.181f,-164.063f, +-85.9375f,17.4228f,-164.063f, +-82.0313f,18.5185f,-164.063f, +-78.125f,19.3122f,-164.063f, +-74.2188f,20.1572f,-164.063f, +-70.3125f,22.741f,-164.063f, +-66.4063f,24.5911f,-164.063f, +-62.5f,26.3846f,-164.063f, +-58.5938f,26.7315f,-164.063f, +-54.6875f,27.0842f,-164.063f, +-50.7813f,28.7654f,-164.063f, +-46.875f,28.7233f,-164.063f, +-42.9688f,29.2872f,-164.063f, +-39.0625f,29.4838f,-164.063f, +-35.1563f,32.7848f,-164.063f, +-31.25f,34.771f,-164.063f, +-27.3438f,36.568f,-164.063f, +-23.4375f,37.5518f,-164.063f, +-19.5313f,38.4106f,-164.063f, +-15.625f,39.2979f,-164.063f, +-11.7188f,39.3573f,-164.063f, +-7.8125f,40.0034f,-164.063f, +-3.90625f,39.5971f,-164.063f, +0.0f,38.8676f,-164.063f, +3.90625f,38.8633f,-164.063f, +-250.0f,25.2893f,-167.969f, +-246.094f,25.108f,-167.969f, +-242.188f,25.5028f,-167.969f, +-238.281f,26.6095f,-167.969f, +-234.375f,28.3221f,-167.969f, +-230.469f,28.5453f,-167.969f, +-226.563f,28.2595f,-167.969f, +-222.656f,26.8423f,-167.969f, +-218.75f,25.0092f,-167.969f, +-214.844f,24.2925f,-167.969f, +-210.938f,23.8404f,-167.969f, +-207.031f,22.7515f,-167.969f, +-203.125f,22.5332f,-167.969f, +-199.219f,20.3284f,-167.969f, +-195.313f,18.8238f,-167.969f, +-191.406f,17.0096f,-167.969f, +-187.5f,14.7741f,-167.969f, +-183.594f,12.4233f,-167.969f, +-179.688f,9.35872f,-167.969f, +-175.781f,6.39156f,-167.969f, +-171.875f,4.97533f,-167.969f, +-167.969f,4.85484f,-167.969f, +-164.063f,5.54727f,-167.969f, +-160.156f,5.08595f,-167.969f, +-156.25f,3.82379f,-167.969f, +-152.344f,3.95751f,-167.969f, +-148.438f,4.60866f,-167.969f, +-144.531f,3.48771f,-167.969f, +-140.625f,3.26748f,-167.969f, +-136.719f,1.87672f,-167.969f, +-132.813f,2.70232f,-167.969f, +-128.906f,4.51339f,-167.969f, +-125.0f,6.0309f,-167.969f, +-121.094f,7.41076f,-167.969f, +-117.188f,7.44121f,-167.969f, +-113.281f,7.50774f,-167.969f, +-109.375f,6.89121f,-167.969f, +-105.469f,8.13035f,-167.969f, +-101.563f,11.7503f,-167.969f, +-97.6563f,14.1358f,-167.969f, +-93.75f,15.4553f,-167.969f, +-89.8438f,16.6233f,-167.969f, +-85.9375f,16.9002f,-167.969f, +-82.0313f,18.4951f,-167.969f, +-78.125f,19.0947f,-167.969f, +-74.2188f,20.0506f,-167.969f, +-70.3125f,20.9426f,-167.969f, +-66.4063f,22.9738f,-167.969f, +-62.5f,24.6229f,-167.969f, +-58.5938f,26.446f,-167.969f, +-54.6875f,26.6448f,-167.969f, +-50.7813f,26.7349f,-167.969f, +-46.875f,28.1266f,-167.969f, +-42.9688f,29.6034f,-167.969f, +-39.0625f,30.3572f,-167.969f, +-35.1563f,31.5467f,-167.969f, +-31.25f,33.6878f,-167.969f, +-27.3438f,35.587f,-167.969f, +-23.4375f,36.0939f,-167.969f, +-19.5313f,37.5008f,-167.969f, +-15.625f,38.2137f,-167.969f, +-11.7188f,38.0843f,-167.969f, +-7.8125f,38.5726f,-167.969f, +-3.90625f,38.3565f,-167.969f, +0.0f,37.8848f,-167.969f, +3.90625f,37.2199f,-167.969f, +-250.0f,24.1398f,-171.875f, +-246.094f,23.8227f,-171.875f, +-242.188f,24.7818f,-171.875f, +-238.281f,26.1053f,-171.875f, +-234.375f,26.9542f,-171.875f, +-230.469f,26.4956f,-171.875f, +-226.563f,25.4866f,-171.875f, +-222.656f,24.7397f,-171.875f, +-218.75f,23.4337f,-171.875f, +-214.844f,23.2342f,-171.875f, +-210.938f,22.1055f,-171.875f, +-207.031f,20.7279f,-171.875f, +-203.125f,20.7273f,-171.875f, +-199.219f,19.1302f,-171.875f, +-195.313f,16.3679f,-171.875f, +-191.406f,14.4548f,-171.875f, +-187.5f,12.5085f,-171.875f, +-183.594f,10.0081f,-171.875f, +-179.688f,7.8572f,-171.875f, +-175.781f,4.38151f,-171.875f, +-171.875f,3.2342f,-171.875f, +-167.969f,3.37553f,-171.875f, +-164.063f,3.90509f,-171.875f, +-160.156f,3.26335f,-171.875f, +-156.25f,2.88438f,-171.875f, +-152.344f,4.22045f,-171.875f, +-148.438f,3.83297f,-171.875f, +-144.531f,2.98648f,-171.875f, +-140.625f,2.83916f,-171.875f, +-136.719f,1.97368f,-171.875f, +-132.813f,1.85909f,-171.875f, +-128.906f,3.2051f,-171.875f, +-125.0f,5.12684f,-171.875f, +-121.094f,5.86909f,-171.875f, +-117.188f,6.45429f,-171.875f, +-113.281f,6.28889f,-171.875f, +-109.375f,7.53536f,-171.875f, +-105.469f,9.44844f,-171.875f, +-101.563f,11.4162f,-171.875f, +-97.6563f,13.7412f,-171.875f, +-93.75f,14.8315f,-171.875f, +-89.8438f,15.4968f,-171.875f, +-85.9375f,16.3468f,-171.875f, +-82.0313f,18.2605f,-171.875f, +-78.125f,18.0829f,-171.875f, +-74.2188f,18.1489f,-171.875f, +-70.3125f,20.6678f,-171.875f, +-66.4063f,23.1234f,-171.875f, +-62.5f,24.4247f,-171.875f, +-58.5938f,26.5223f,-171.875f, +-54.6875f,26.4286f,-171.875f, +-50.7813f,26.7163f,-171.875f, +-46.875f,28.0436f,-171.875f, +-42.9688f,29.6821f,-171.875f, +-39.0625f,30.721f,-171.875f, +-35.1563f,31.1869f,-171.875f, +-31.25f,32.2507f,-171.875f, +-27.3438f,33.3898f,-171.875f, +-23.4375f,33.9008f,-171.875f, +-19.5313f,34.8028f,-171.875f, +-15.625f,35.7178f,-171.875f, +-11.7188f,35.7796f,-171.875f, +-7.8125f,35.6384f,-171.875f, +-3.90625f,35.5122f,-171.875f, +0.0f,35.5973f,-171.875f, +3.90625f,35.3898f,-171.875f, +-250.0f,23.4472f,-175.781f, +-246.094f,24.0295f,-175.781f, +-242.188f,25.0451f,-175.781f, +-238.281f,25.8985f,-175.781f, +-234.375f,26.561f,-175.781f, +-230.469f,25.8342f,-175.781f, +-226.563f,24.8466f,-175.781f, +-222.656f,24.9204f,-175.781f, +-218.75f,23.1933f,-175.781f, +-214.844f,22.3916f,-175.781f, +-210.938f,20.9595f,-175.781f, +-207.031f,19.4013f,-175.781f, +-203.125f,18.3359f,-175.781f, +-199.219f,16.2135f,-175.781f, +-195.313f,14.3022f,-175.781f, +-191.406f,12.4792f,-175.781f, +-187.5f,10.1621f,-175.781f, +-183.594f,7.8368f,-175.781f, +-179.688f,5.59407f,-175.781f, +-175.781f,3.47332f,-175.781f, +-171.875f,2.4167f,-175.781f, +-167.969f,2.13794f,-175.781f, +-164.063f,2.36632f,-175.781f, +-160.156f,2.44955f,-175.781f, +-156.25f,2.40042f,-175.781f, +-152.344f,3.0142f,-175.781f, +-148.438f,2.58304f,-175.781f, +-144.531f,3.06221f,-175.781f, +-140.625f,2.8937f,-175.781f, +-136.719f,2.59115f,-175.781f, +-132.813f,2.27806f,-175.781f, +-128.906f,3.67695f,-175.781f, +-125.0f,5.23254f,-175.781f, +-121.094f,6.12339f,-175.781f, +-117.188f,6.24689f,-175.781f, +-113.281f,6.79282f,-175.781f, +-109.375f,7.83542f,-175.781f, +-105.469f,9.33972f,-175.781f, +-101.563f,11.2701f,-175.781f, +-97.6563f,13.0689f,-175.781f, +-93.75f,13.927f,-175.781f, +-89.8438f,14.9788f,-175.781f, +-85.9375f,15.6647f,-175.781f, +-82.0313f,16.3833f,-175.781f, +-78.125f,16.1061f,-175.781f, +-74.2188f,17.7393f,-175.781f, +-70.3125f,19.8808f,-175.781f, +-66.4063f,22.2751f,-175.781f, +-62.5f,23.8491f,-175.781f, +-58.5938f,25.3344f,-175.781f, +-54.6875f,26.6818f,-175.781f, +-50.7813f,27.9151f,-175.781f, +-46.875f,28.5054f,-175.781f, +-42.9688f,29.7057f,-175.781f, +-39.0625f,30.623f,-175.781f, +-35.1563f,31.5341f,-175.781f, +-31.25f,31.663f,-175.781f, +-27.3438f,31.1886f,-175.781f, +-23.4375f,31.5377f,-175.781f, +-19.5313f,31.9508f,-175.781f, +-15.625f,32.9549f,-175.781f, +-11.7188f,33.7731f,-175.781f, +-7.8125f,33.8023f,-175.781f, +-3.90625f,34.5283f,-175.781f, +0.0f,34.7929f,-175.781f, +3.90625f,34.823f,-175.781f, +-250.0f,22.2698f,-179.688f, +-246.094f,23.7669f,-179.688f, +-242.188f,24.59f,-179.688f, +-238.281f,26.1637f,-179.688f, +-234.375f,25.5266f,-179.688f, +-230.469f,24.4911f,-179.688f, +-226.563f,24.894f,-179.688f, +-222.656f,23.7469f,-179.688f, +-218.75f,22.9663f,-179.688f, +-214.844f,20.6574f,-179.688f, +-210.938f,19.2502f,-179.688f, +-207.031f,17.3967f,-179.688f, +-203.125f,15.9684f,-179.688f, +-199.219f,13.2948f,-179.688f, +-195.313f,11.9318f,-179.688f, +-191.406f,9.64213f,-179.688f, +-187.5f,7.9435f,-179.688f, +-183.594f,6.1917f,-179.688f, +-179.688f,4.0394f,-179.688f, +-175.781f,1.9267f,-179.688f, +-171.875f,1.73477f,-179.688f, +-167.969f,0.994442f,-179.688f, +-164.063f,0.99617f,-179.688f, +-160.156f,1.00048f,-179.688f, +-156.25f,1.54446f,-179.688f, +-152.344f,0.849521f,-179.688f, +-148.438f,1.3046f,-179.688f, +-144.531f,1.38519f,-179.688f, +-140.625f,0.916628f,-179.688f, +-136.719f,1.39685f,-179.688f, +-132.813f,2.17945f,-179.688f, +-128.906f,4.01973f,-179.688f, +-125.0f,5.72989f,-179.688f, +-121.094f,7.24268f,-179.688f, +-117.188f,7.06199f,-179.688f, +-113.281f,7.91292f,-179.688f, +-109.375f,7.8138f,-179.688f, +-105.469f,10.102f,-179.688f, +-101.563f,11.8106f,-179.688f, +-97.6563f,12.9642f,-179.688f, +-93.75f,13.5879f,-179.688f, +-89.8438f,13.4552f,-179.688f, +-85.9375f,14.1844f,-179.688f, +-82.0313f,14.3802f,-179.688f, +-78.125f,15.3847f,-179.688f, +-74.2188f,17.2288f,-179.688f, +-70.3125f,18.9285f,-179.688f, +-66.4063f,20.0035f,-179.688f, +-62.5f,22.2672f,-179.688f, +-58.5938f,25.1262f,-179.688f, +-54.6875f,27.2745f,-179.688f, +-50.7813f,28.2648f,-179.688f, +-46.875f,29.3825f,-179.688f, +-42.9688f,30.2137f,-179.688f, +-39.0625f,31.3826f,-179.688f, +-35.1563f,31.25f,-179.688f, +-31.25f,31.0392f,-179.688f, +-27.3438f,30.3369f,-179.688f, +-23.4375f,30.5503f,-179.688f, +-19.5313f,30.9715f,-179.688f, +-15.625f,31.8287f,-179.688f, +-11.7188f,32.1393f,-179.688f, +-7.8125f,32.0725f,-179.688f, +-3.90625f,32.6574f,-179.688f, +0.0f,32.8889f,-179.688f, +3.90625f,32.9461f,-179.688f, +-250.0f,22.3874f,-183.594f, +-246.094f,22.8072f,-183.594f, +-242.188f,23.1353f,-183.594f, +-238.281f,24.0949f,-183.594f, +-234.375f,24.0026f,-183.594f, +-230.469f,23.458f,-183.594f, +-226.563f,23.872f,-183.594f, +-222.656f,22.969f,-183.594f, +-218.75f,21.8375f,-183.594f, +-214.844f,19.9316f,-183.594f, +-210.938f,16.812f,-183.594f, +-207.031f,15.1789f,-183.594f, +-203.125f,13.7876f,-183.594f, +-199.219f,11.6818f,-183.594f, +-195.313f,9.75291f,-183.594f, +-191.406f,7.08878f,-183.594f, +-187.5f,6.43001f,-183.594f, +-183.594f,5.15238f,-183.594f, +-179.688f,3.77653f,-183.594f, +-175.781f,3.01737f,-183.594f, +-171.875f,1.46355f,-183.594f, +-167.969f,0.767798f,-183.594f, +-164.063f,1.98474f,-183.594f, +-160.156f,1.09473f,-183.594f, +-156.25f,1.29857f,-183.594f, +-152.344f,-0.203491f,-183.594f, +-148.438f,-0.506199f,-183.594f, +-144.531f,-0.678603f,-183.594f, +-140.625f,0.165814f,-183.594f, +-136.719f,1.44759f,-183.594f, +-132.813f,1.43337f,-183.594f, +-128.906f,3.23614f,-183.594f, +-125.0f,4.8541f,-183.594f, +-121.094f,6.64038f,-183.594f, +-117.188f,7.96432f,-183.594f, +-113.281f,8.52594f,-183.594f, +-109.375f,7.78399f,-183.594f, +-105.469f,9.45422f,-183.594f, +-101.563f,11.3198f,-183.594f, +-97.6563f,12.2369f,-183.594f, +-93.75f,12.7733f,-183.594f, +-89.8438f,12.9184f,-183.594f, +-85.9375f,12.958f,-183.594f, +-82.0313f,13.3326f,-183.594f, +-78.125f,14.3984f,-183.594f, +-74.2188f,16.2737f,-183.594f, +-70.3125f,17.9981f,-183.594f, +-66.4063f,19.5314f,-183.594f, +-62.5f,21.4039f,-183.594f, +-58.5938f,24.8945f,-183.594f, +-54.6875f,26.9904f,-183.594f, +-50.7813f,28.6222f,-183.594f, +-46.875f,30.2128f,-183.594f, +-42.9688f,30.5142f,-183.594f, +-39.0625f,30.7026f,-183.594f, +-35.1563f,30.6413f,-183.594f, +-31.25f,29.7659f,-183.594f, +-27.3438f,30.2613f,-183.594f, +-23.4375f,31.0694f,-183.594f, +-19.5313f,31.0437f,-183.594f, +-15.625f,30.9824f,-183.594f, +-11.7188f,30.4648f,-183.594f, +-7.8125f,30.0916f,-183.594f, +-3.90625f,30.0801f,-183.594f, +0.0f,29.9992f,-183.594f, +3.90625f,30.0027f,-183.594f, +-250.0f,22.2829f,-187.5f, +-246.094f,23.1567f,-187.5f, +-242.188f,23.2229f,-187.5f, +-238.281f,23.6644f,-187.5f, +-234.375f,23.5148f,-187.5f, +-230.469f,22.8756f,-187.5f, +-226.563f,22.2471f,-187.5f, +-222.656f,21.4292f,-187.5f, +-218.75f,20.4108f,-187.5f, +-214.844f,18.2601f,-187.5f, +-210.938f,16.3575f,-187.5f, +-207.031f,13.0762f,-187.5f, +-203.125f,11.5916f,-187.5f, +-199.219f,9.81885f,-187.5f, +-195.313f,8.57193f,-187.5f, +-191.406f,5.93865f,-187.5f, +-187.5f,5.15801f,-187.5f, +-183.594f,3.89597f,-187.5f, +-179.688f,4.52236f,-187.5f, +-175.781f,4.21162f,-187.5f, +-171.875f,2.62521f,-187.5f, +-167.969f,1.85733f,-187.5f, +-164.063f,2.14119f,-187.5f, +-160.156f,2.60992f,-187.5f, +-156.25f,1.99742f,-187.5f, +-152.344f,0.836315f,-187.5f, +-148.438f,-0.122141f,-187.5f, +-144.531f,-1.21041f,-187.5f, +-140.625f,0.620409f,-187.5f, +-136.719f,2.20372f,-187.5f, +-132.813f,2.55457f,-187.5f, +-128.906f,3.09944f,-187.5f, +-125.0f,4.76219f,-187.5f, +-121.094f,6.5939f,-187.5f, +-117.188f,7.40657f,-187.5f, +-113.281f,8.17096f,-187.5f, +-109.375f,8.8965f,-187.5f, +-105.469f,9.54116f,-187.5f, +-101.563f,10.8183f,-187.5f, +-97.6563f,12.2345f,-187.5f, +-93.75f,11.945f,-187.5f, +-89.8438f,12.3063f,-187.5f, +-85.9375f,12.7736f,-187.5f, +-82.0313f,13.2581f,-187.5f, +-78.125f,14.2241f,-187.5f, +-74.2188f,15.1957f,-187.5f, +-70.3125f,17.7241f,-187.5f, +-66.4063f,21.0931f,-187.5f, +-62.5f,23.7741f,-187.5f, +-58.5938f,24.8775f,-187.5f, +-54.6875f,26.5924f,-187.5f, +-50.7813f,28.0699f,-187.5f, +-46.875f,30.1552f,-187.5f, +-42.9688f,30.8508f,-187.5f, +-39.0625f,30.7935f,-187.5f, +-35.1563f,30.3224f,-187.5f, +-31.25f,28.8455f,-187.5f, +-27.3438f,30.2059f,-187.5f, +-23.4375f,31.5456f,-187.5f, +-19.5313f,31.0657f,-187.5f, +-15.625f,30.5686f,-187.5f, +-11.7188f,29.9754f,-187.5f, +-7.8125f,28.7754f,-187.5f, +-3.90625f,28.2457f,-187.5f, +0.0f,27.4045f,-187.5f, +3.90625f,27.6405f,-187.5f, +-250.0f,21.5096f,-191.406f, +-246.094f,22.1931f,-191.406f, +-242.188f,22.416f,-191.406f, +-238.281f,22.619f,-191.406f, +-234.375f,22.9242f,-191.406f, +-230.469f,22.6042f,-191.406f, +-226.563f,21.5344f,-191.406f, +-222.656f,20.226f,-191.406f, +-218.75f,19.6198f,-191.406f, +-214.844f,18.0849f,-191.406f, +-210.938f,15.9896f,-191.406f, +-207.031f,12.7402f,-191.406f, +-203.125f,9.98899f,-191.406f, +-199.219f,7.38602f,-191.406f, +-195.313f,6.23078f,-191.406f, +-191.406f,4.8714f,-191.406f, +-187.5f,4.87792f,-191.406f, +-183.594f,4.53381f,-191.406f, +-179.688f,5.23517f,-191.406f, +-175.781f,4.22349f,-191.406f, +-171.875f,3.46214f,-191.406f, +-167.969f,3.62202f,-191.406f, +-164.063f,3.07142f,-191.406f, +-160.156f,3.69893f,-191.406f, +-156.25f,4.20827f,-191.406f, +-152.344f,2.23654f,-191.406f, +-148.438f,0.582121f,-191.406f, +-144.531f,0.44941f,-191.406f, +-140.625f,2.42446f,-191.406f, +-136.719f,3.54807f,-191.406f, +-132.813f,3.58143f,-191.406f, +-128.906f,4.42162f,-191.406f, +-125.0f,5.24153f,-191.406f, +-121.094f,6.55792f,-191.406f, +-117.188f,6.93471f,-191.406f, +-113.281f,7.73309f,-191.406f, +-109.375f,8.04468f,-191.406f, +-105.469f,9.15528f,-191.406f, +-101.563f,10.9583f,-191.406f, +-97.6563f,12.1897f,-191.406f, +-93.75f,11.6481f,-191.406f, +-89.8438f,11.6514f,-191.406f, +-85.9375f,12.4326f,-191.406f, +-82.0313f,13.3808f,-191.406f, +-78.125f,14.386f,-191.406f, +-74.2188f,16.182f,-191.406f, +-70.3125f,18.9931f,-191.406f, +-66.4063f,22.8308f,-191.406f, +-62.5f,25.3868f,-191.406f, +-58.5938f,26.1484f,-191.406f, +-54.6875f,25.6258f,-191.406f, +-50.7813f,26.9464f,-191.406f, +-46.875f,29.0075f,-191.406f, +-42.9688f,29.8523f,-191.406f, +-39.0625f,30.1236f,-191.406f, +-35.1563f,29.7557f,-191.406f, +-31.25f,28.4913f,-191.406f, +-27.3438f,29.5389f,-191.406f, +-23.4375f,30.4685f,-191.406f, +-19.5313f,30.3743f,-191.406f, +-15.625f,30.3762f,-191.406f, +-11.7188f,29.0099f,-191.406f, +-7.8125f,28.1952f,-191.406f, +-3.90625f,26.135f,-191.406f, +0.0f,25.2418f,-191.406f, +3.90625f,25.3652f,-191.406f, +-250.0f,20.78f,-195.313f, +-246.094f,20.8279f,-195.313f, +-242.188f,21.2199f,-195.313f, +-238.281f,22.0652f,-195.313f, +-234.375f,22.2095f,-195.313f, +-230.469f,22.1372f,-195.313f, +-226.563f,21.0165f,-195.313f, +-222.656f,19.4174f,-195.313f, +-218.75f,17.7927f,-195.313f, +-214.844f,16.6172f,-195.313f, +-210.938f,14.7065f,-195.313f, +-207.031f,11.8095f,-195.313f, +-203.125f,9.63824f,-195.313f, +-199.219f,6.4991f,-195.313f, +-195.313f,6.23707f,-195.313f, +-191.406f,6.60374f,-195.313f, +-187.5f,6.22557f,-195.313f, +-183.594f,5.47951f,-195.313f, +-179.688f,5.16851f,-195.313f, +-175.781f,4.83538f,-195.313f, +-171.875f,4.16992f,-195.313f, +-167.969f,5.40533f,-195.313f, +-164.063f,5.01562f,-195.313f, +-160.156f,4.58978f,-195.313f, +-156.25f,4.73252f,-195.313f, +-152.344f,3.14586f,-195.313f, +-148.438f,1.16894f,-195.313f, +-144.531f,2.4916f,-195.313f, +-140.625f,3.98933f,-195.313f, +-136.719f,5.16861f,-195.313f, +-132.813f,5.68931f,-195.313f, +-128.906f,5.45815f,-195.313f, +-125.0f,5.15506f,-195.313f, +-121.094f,6.46153f,-195.313f, +-117.188f,7.36577f,-195.313f, +-113.281f,8.13491f,-195.313f, +-109.375f,7.50896f,-195.313f, +-105.469f,8.93662f,-195.313f, +-101.563f,10.6513f,-195.313f, +-97.6563f,10.6255f,-195.313f, +-93.75f,10.5332f,-195.313f, +-89.8438f,11.5758f,-195.313f, +-85.9375f,11.568f,-195.313f, +-82.0313f,14.2419f,-195.313f, +-78.125f,16.1272f,-195.313f, +-74.2188f,17.0994f,-195.313f, +-70.3125f,20.4651f,-195.313f, +-66.4063f,23.534f,-195.313f, +-62.5f,25.1181f,-195.313f, +-58.5938f,25.9427f,-195.313f, +-54.6875f,25.5166f,-195.313f, +-50.7813f,25.1027f,-195.313f, +-46.875f,27.2281f,-195.313f, +-42.9688f,28.7319f,-195.313f, +-39.0625f,28.8984f,-195.313f, +-35.1563f,28.3307f,-195.313f, +-31.25f,27.4754f,-195.313f, +-27.3438f,27.8763f,-195.313f, +-23.4375f,28.1023f,-195.313f, +-19.5313f,28.9815f,-195.313f, +-15.625f,28.5849f,-195.313f, +-11.7188f,27.2687f,-195.313f, +-7.8125f,26.8112f,-195.313f, +-3.90625f,25.3636f,-195.313f, +0.0f,23.2134f,-195.313f, +3.90625f,23.0993f,-195.313f, +-250.0f,20.2026f,-199.219f, +-246.094f,19.5895f,-199.219f, +-242.188f,20.3489f,-199.219f, +-238.281f,21.0293f,-199.219f, +-234.375f,21.5343f,-199.219f, +-230.469f,20.6859f,-199.219f, +-226.563f,19.9279f,-199.219f, +-222.656f,18.7217f,-199.219f, +-218.75f,17.4818f,-199.219f, +-214.844f,15.0438f,-199.219f, +-210.938f,13.4082f,-199.219f, +-207.031f,10.7188f,-199.219f, +-203.125f,8.32176f,-199.219f, +-199.219f,7.30407f,-199.219f, +-195.313f,7.02569f,-199.219f, +-191.406f,7.38826f,-199.219f, +-187.5f,6.94954f,-199.219f, +-183.594f,6.62067f,-199.219f, +-179.688f,6.55308f,-199.219f, +-175.781f,6.3403f,-199.219f, +-171.875f,5.0001f,-199.219f, +-167.969f,6.51564f,-199.219f, +-164.063f,6.69774f,-199.219f, +-160.156f,5.67189f,-199.219f, +-156.25f,4.8973f,-199.219f, +-152.344f,3.43798f,-199.219f, +-148.438f,2.08531f,-199.219f, +-144.531f,3.86643f,-199.219f, +-140.625f,6.0862f,-199.219f, +-136.719f,6.99995f,-199.219f, +-132.813f,8.32808f,-199.219f, +-128.906f,8.55809f,-199.219f, +-125.0f,8.26904f,-199.219f, +-121.094f,8.63733f,-199.219f, +-117.188f,9.11106f,-199.219f, +-113.281f,9.73154f,-199.219f, +-109.375f,9.14108f,-199.219f, +-105.469f,9.3525f,-199.219f, +-101.563f,9.56281f,-199.219f, +-97.6563f,9.74866f,-199.219f, +-93.75f,10.9852f,-199.219f, +-89.8438f,12.3926f,-199.219f, +-85.9375f,13.6407f,-199.219f, +-82.0313f,15.9886f,-199.219f, +-78.125f,17.7913f,-199.219f, +-74.2188f,18.8352f,-199.219f, +-70.3125f,20.2718f,-199.219f, +-66.4063f,23.501f,-199.219f, +-62.5f,24.6073f,-199.219f, +-58.5938f,25.3028f,-199.219f, +-54.6875f,25.2244f,-199.219f, +-50.7813f,23.9922f,-199.219f, +-46.875f,24.6425f,-199.219f, +-42.9688f,26.6199f,-199.219f, +-39.0625f,27.5474f,-199.219f, +-35.1563f,27.4672f,-199.219f, +-31.25f,27.2906f,-199.219f, +-27.3438f,26.489f,-199.219f, +-23.4375f,26.3554f,-199.219f, +-19.5313f,26.1787f,-199.219f, +-15.625f,26.2538f,-199.219f, +-11.7188f,25.7694f,-199.219f, +-7.8125f,25.2691f,-199.219f, +-3.90625f,23.3867f,-199.219f, +0.0f,22.5717f,-199.219f, +3.90625f,21.5827f,-199.219f, +-250.0f,19.3526f,-203.125f, +-246.094f,19.2964f,-203.125f, +-242.188f,19.226f,-203.125f, +-238.281f,19.4274f,-203.125f, +-234.375f,19.4317f,-203.125f, +-230.469f,19.3079f,-203.125f, +-226.563f,18.212f,-203.125f, +-222.656f,17.8371f,-203.125f, +-218.75f,16.8642f,-203.125f, +-214.844f,14.8539f,-203.125f, +-210.938f,12.425f,-203.125f, +-207.031f,10.0369f,-203.125f, +-203.125f,9.00151f,-203.125f, +-199.219f,8.61334f,-203.125f, +-195.313f,8.09586f,-203.125f, +-191.406f,8.18143f,-203.125f, +-187.5f,7.75345f,-203.125f, +-183.594f,7.72772f,-203.125f, +-179.688f,7.71649f,-203.125f, +-175.781f,7.72935f,-203.125f, +-171.875f,6.70116f,-203.125f, +-167.969f,6.58828f,-203.125f, +-164.063f,6.47975f,-203.125f, +-160.156f,5.96451f,-203.125f, +-156.25f,5.85253f,-203.125f, +-152.344f,5.14982f,-203.125f, +-148.438f,4.60646f,-203.125f, +-144.531f,6.3659f,-203.125f, +-140.625f,7.66587f,-203.125f, +-136.719f,8.68095f,-203.125f, +-132.813f,9.86922f,-203.125f, +-128.906f,9.93481f,-203.125f, +-125.0f,10.9585f,-203.125f, +-121.094f,10.9271f,-203.125f, +-117.188f,11.4348f,-203.125f, +-113.281f,11.0548f,-203.125f, +-109.375f,11.2501f,-203.125f, +-105.469f,11.7673f,-203.125f, +-101.563f,10.8899f,-203.125f, +-97.6563f,11.3791f,-203.125f, +-93.75f,12.168f,-203.125f, +-89.8438f,12.7667f,-203.125f, +-85.9375f,15.2415f,-203.125f, +-82.0313f,17.9783f,-203.125f, +-78.125f,19.6193f,-203.125f, +-74.2188f,19.6343f,-203.125f, +-70.3125f,19.7814f,-203.125f, +-66.4063f,21.45f,-203.125f, +-62.5f,24.1224f,-203.125f, +-58.5938f,24.9145f,-203.125f, +-54.6875f,24.2614f,-203.125f, +-50.7813f,24.025f,-203.125f, +-46.875f,23.1092f,-203.125f, +-42.9688f,24.0294f,-203.125f, +-39.0625f,25.4744f,-203.125f, +-35.1563f,25.9477f,-203.125f, +-31.25f,25.5895f,-203.125f, +-27.3438f,25.0752f,-203.125f, +-23.4375f,24.6537f,-203.125f, +-19.5313f,25.0025f,-203.125f, +-15.625f,25.211f,-203.125f, +-11.7188f,24.2103f,-203.125f, +-7.8125f,23.1363f,-203.125f, +-3.90625f,21.4314f,-203.125f, +0.0f,20.8784f,-203.125f, +3.90625f,20.3179f,-203.125f, +-250.0f,18.4857f,-207.031f, +-246.094f,18.9103f,-207.031f, +-242.188f,17.7666f,-207.031f, +-238.281f,18.3803f,-207.031f, +-234.375f,17.7746f,-207.031f, +-230.469f,18.1956f,-207.031f, +-226.563f,17.4596f,-207.031f, +-222.656f,16.5346f,-207.031f, +-218.75f,15.3933f,-207.031f, +-214.844f,14.0342f,-207.031f, +-210.938f,11.5492f,-207.031f, +-207.031f,10.8526f,-207.031f, +-203.125f,10.5164f,-207.031f, +-199.219f,10.4957f,-207.031f, +-195.313f,9.57889f,-207.031f, +-191.406f,9.42031f,-207.031f, +-187.5f,9.08544f,-207.031f, +-183.594f,8.10082f,-207.031f, +-179.688f,8.5632f,-207.031f, +-175.781f,8.74392f,-207.031f, +-171.875f,8.56175f,-207.031f, +-167.969f,7.13665f,-207.031f, +-164.063f,6.99003f,-207.031f, +-160.156f,7.1192f,-207.031f, +-156.25f,6.173f,-207.031f, +-152.344f,6.44193f,-207.031f, +-148.438f,7.15583f,-207.031f, +-144.531f,7.74526f,-207.031f, +-140.625f,9.38846f,-207.031f, +-136.719f,10.1943f,-207.031f, +-132.813f,10.5195f,-207.031f, +-128.906f,11.4457f,-207.031f, +-125.0f,12.4233f,-207.031f, +-121.094f,12.8633f,-207.031f, +-117.188f,13.4045f,-207.031f, +-113.281f,12.9134f,-207.031f, +-109.375f,12.9203f,-207.031f, +-105.469f,13.2173f,-207.031f, +-101.563f,12.9065f,-207.031f, +-97.6563f,12.9327f,-207.031f, +-93.75f,13.5926f,-207.031f, +-89.8438f,14.5472f,-207.031f, +-85.9375f,16.41f,-207.031f, +-82.0313f,19.1484f,-207.031f, +-78.125f,20.5688f,-207.031f, +-74.2188f,20.1464f,-207.031f, +-70.3125f,19.9352f,-207.031f, +-66.4063f,20.4543f,-207.031f, +-62.5f,22.0083f,-207.031f, +-58.5938f,23.2866f,-207.031f, +-54.6875f,23.3242f,-207.031f, +-50.7813f,23.0127f,-207.031f, +-46.875f,23.4455f,-207.031f, +-42.9688f,23.4808f,-207.031f, +-39.0625f,24.4622f,-207.031f, +-35.1563f,25.1122f,-207.031f, +-31.25f,25.3818f,-207.031f, +-27.3438f,24.0051f,-207.031f, +-23.4375f,22.3971f,-207.031f, +-19.5313f,23.4811f,-207.031f, +-15.625f,23.8447f,-207.031f, +-11.7188f,22.3912f,-207.031f, +-7.8125f,21.7286f,-207.031f, +-3.90625f,20.1632f,-207.031f, +0.0f,18.6587f,-207.031f, +3.90625f,18.3149f,-207.031f, +-250.0f,17.6517f,-210.938f, +-246.094f,17.8132f,-210.938f, +-242.188f,17.4894f,-210.938f, +-238.281f,16.7087f,-210.938f, +-234.375f,15.9111f,-210.938f, +-230.469f,16.6733f,-210.938f, +-226.563f,16.6911f,-210.938f, +-222.656f,14.6177f,-210.938f, +-218.75f,13.6959f,-210.938f, +-214.844f,12.227f,-210.938f, +-210.938f,11.5376f,-210.938f, +-207.031f,11.7259f,-210.938f, +-203.125f,11.4804f,-210.938f, +-199.219f,11.8728f,-210.938f, +-195.313f,11.7357f,-210.938f, +-191.406f,10.6319f,-210.938f, +-187.5f,10.7016f,-210.938f, +-183.594f,9.53811f,-210.938f, +-179.688f,9.65149f,-210.938f, +-175.781f,9.45993f,-210.938f, +-171.875f,9.4427f,-210.938f, +-167.969f,8.02525f,-210.938f, +-164.063f,6.71089f,-210.938f, +-160.156f,7.22567f,-210.938f, +-156.25f,7.52391f,-210.938f, +-152.344f,8.46765f,-210.938f, +-148.438f,8.60801f,-210.938f, +-144.531f,9.89046f,-210.938f, +-140.625f,10.9163f,-210.938f, +-136.719f,11.445f,-210.938f, +-132.813f,12.6949f,-210.938f, +-128.906f,13.3645f,-210.938f, +-125.0f,14.5389f,-210.938f, +-121.094f,14.7689f,-210.938f, +-117.188f,15.8285f,-210.938f, +-113.281f,15.5058f,-210.938f, +-109.375f,14.3542f,-210.938f, +-105.469f,14.9928f,-210.938f, +-101.563f,14.9601f,-210.938f, +-97.6563f,15.1602f,-210.938f, +-93.75f,15.1589f,-210.938f, +-89.8438f,16.5401f,-210.938f, +-85.9375f,18.2407f,-210.938f, +-82.0313f,19.8006f,-210.938f, +-78.125f,20.9223f,-210.938f, +-74.2188f,20.5615f,-210.938f, +-70.3125f,21.0505f,-210.938f, +-66.4063f,21.024f,-210.938f, +-62.5f,21.7216f,-210.938f, +-58.5938f,22.8737f,-210.938f, +-54.6875f,23.631f,-210.938f, +-50.7813f,23.6265f,-210.938f, +-46.875f,23.5636f,-210.938f, +-42.9688f,24.1299f,-210.938f, +-39.0625f,24.6395f,-210.938f, +-35.1563f,25.3237f,-210.938f, +-31.25f,24.7459f,-210.938f, +-27.3438f,22.2327f,-210.938f, +-23.4375f,21.6309f,-210.938f, +-19.5313f,22.3059f,-210.938f, +-15.625f,22.1894f,-210.938f, +-11.7188f,21.2088f,-210.938f, +-7.8125f,20.3383f,-210.938f, +-3.90625f,18.4799f,-210.938f, +0.0f,17.18f,-210.938f, +3.90625f,16.2147f,-210.938f, +-250.0f,17.6547f,-214.844f, +-246.094f,17.1845f,-214.844f, +-242.188f,17.6913f,-214.844f, +-238.281f,16.8842f,-214.844f, +-234.375f,14.7169f,-214.844f, +-230.469f,15.4287f,-214.844f, +-226.563f,14.5659f,-214.844f, +-222.656f,13.1756f,-214.844f, +-218.75f,12.021f,-214.844f, +-214.844f,11.9663f,-214.844f, +-210.938f,12.535f,-214.844f, +-207.031f,12.5802f,-214.844f, +-203.125f,12.7437f,-214.844f, +-199.219f,12.9859f,-214.844f, +-195.313f,12.7714f,-214.844f, +-191.406f,11.9783f,-214.844f, +-187.5f,11.9282f,-214.844f, +-183.594f,10.7633f,-214.844f, +-179.688f,10.3463f,-214.844f, +-175.781f,10.1867f,-214.844f, +-171.875f,10.378f,-214.844f, +-167.969f,8.81572f,-214.844f, +-164.063f,7.29133f,-214.844f, +-160.156f,8.45242f,-214.844f, +-156.25f,9.77224f,-214.844f, +-152.344f,10.4567f,-214.844f, +-148.438f,11.0484f,-214.844f, +-144.531f,12.1985f,-214.844f, +-140.625f,13.766f,-214.844f, +-136.719f,14.9123f,-214.844f, +-132.813f,15.4577f,-214.844f, +-128.906f,16.3401f,-214.844f, +-125.0f,16.5963f,-214.844f, +-121.094f,16.9605f,-214.844f, +-117.188f,16.548f,-214.844f, +-113.281f,16.701f,-214.844f, +-109.375f,16.6987f,-214.844f, +-105.469f,16.1393f,-214.844f, +-101.563f,15.4379f,-214.844f, +-97.6563f,15.9931f,-214.844f, +-93.75f,16.7962f,-214.844f, +-89.8438f,18.5464f,-214.844f, +-85.9375f,20.2834f,-214.844f, +-82.0313f,20.8463f,-214.844f, +-78.125f,21.263f,-214.844f, +-74.2188f,22.137f,-214.844f, +-70.3125f,22.1614f,-214.844f, +-66.4063f,21.7706f,-214.844f, +-62.5f,23.0496f,-214.844f, +-58.5938f,23.0762f,-214.844f, +-54.6875f,24.2163f,-214.844f, +-50.7813f,23.9415f,-214.844f, +-46.875f,23.115f,-214.844f, +-42.9688f,24.4371f,-214.844f, +-39.0625f,25.7433f,-214.844f, +-35.1563f,24.6385f,-214.844f, +-31.25f,23.2822f,-214.844f, +-27.3438f,21.8583f,-214.844f, +-23.4375f,21.2352f,-214.844f, +-19.5313f,21.3084f,-214.844f, +-15.625f,20.7264f,-214.844f, +-11.7188f,19.67f,-214.844f, +-7.8125f,18.8192f,-214.844f, +-3.90625f,16.6504f,-214.844f, +0.0f,14.8779f,-214.844f, +3.90625f,14.284f,-214.844f, +-250.0f,17.1549f,-218.75f, +-246.094f,16.6295f,-218.75f, +-242.188f,17.7459f,-218.75f, +-238.281f,17.3894f,-218.75f, +-234.375f,15.2738f,-218.75f, +-230.469f,13.3984f,-218.75f, +-226.563f,12.8639f,-218.75f, +-222.656f,12.3225f,-218.75f, +-218.75f,12.1914f,-218.75f, +-214.844f,12.4104f,-218.75f, +-210.938f,12.9278f,-218.75f, +-207.031f,13.387f,-218.75f, +-203.125f,13.4342f,-218.75f, +-199.219f,12.7445f,-218.75f, +-195.313f,12.543f,-218.75f, +-191.406f,12.1437f,-218.75f, +-187.5f,12.3491f,-218.75f, +-183.594f,11.2334f,-218.75f, +-179.688f,11.4016f,-218.75f, +-175.781f,11.2455f,-218.75f, +-171.875f,10.3681f,-218.75f, +-167.969f,9.23056f,-218.75f, +-164.063f,8.35869f,-218.75f, +-160.156f,10.3612f,-218.75f, +-156.25f,11.8429f,-218.75f, +-152.344f,13.2154f,-218.75f, +-148.438f,13.6238f,-218.75f, +-144.531f,14.8343f,-218.75f, +-140.625f,15.5549f,-218.75f, +-136.719f,16.9496f,-218.75f, +-132.813f,17.9187f,-218.75f, +-128.906f,17.7467f,-218.75f, +-125.0f,17.8229f,-218.75f, +-121.094f,17.4408f,-218.75f, +-117.188f,17.3929f,-218.75f, +-113.281f,17.9861f,-218.75f, +-109.375f,18.0206f,-218.75f, +-105.469f,17.6787f,-218.75f, +-101.563f,17.3769f,-218.75f, +-97.6563f,17.5683f,-218.75f, +-93.75f,18.0067f,-218.75f, +-89.8438f,18.9639f,-218.75f, +-85.9375f,20.8377f,-218.75f, +-82.0313f,22.207f,-218.75f, +-78.125f,23.1239f,-218.75f, +-74.2188f,22.384f,-218.75f, +-70.3125f,22.2939f,-218.75f, +-66.4063f,21.8208f,-218.75f, +-62.5f,22.9458f,-218.75f, +-58.5938f,24.2547f,-218.75f, +-54.6875f,24.5855f,-218.75f, +-50.7813f,23.9529f,-218.75f, +-46.875f,22.9226f,-218.75f, +-42.9688f,25.1015f,-218.75f, +-39.0625f,25.1591f,-218.75f, +-35.1563f,23.6146f,-218.75f, +-31.25f,21.7924f,-218.75f, +-27.3438f,20.3147f,-218.75f, +-23.4375f,19.9227f,-218.75f, +-19.5313f,20.3267f,-218.75f, +-15.625f,19.1903f,-218.75f, +-11.7188f,17.3132f,-218.75f, +-7.8125f,16.5145f,-218.75f, +-3.90625f,15.5991f,-218.75f, +0.0f,13.7865f,-218.75f, +3.90625f,13.272f,-218.75f, +-250.0f,16.7536f,-222.656f, +-246.094f,16.7692f,-222.656f, +-242.188f,17.6216f,-222.656f, +-238.281f,17.7524f,-222.656f, +-234.375f,15.7102f,-222.656f, +-230.469f,13.9934f,-222.656f, +-226.563f,13.1311f,-222.656f, +-222.656f,13.6218f,-222.656f, +-218.75f,13.8812f,-222.656f, +-214.844f,13.6928f,-222.656f, +-210.938f,13.2498f,-222.656f, +-207.031f,13.9199f,-222.656f, +-203.125f,14.8224f,-222.656f, +-199.219f,14.7821f,-222.656f, +-195.313f,14.4118f,-222.656f, +-191.406f,13.2421f,-222.656f, +-187.5f,13.1953f,-222.656f, +-183.594f,11.9441f,-222.656f, +-179.688f,11.8006f,-222.656f, +-175.781f,11.2509f,-222.656f, +-171.875f,9.7863f,-222.656f, +-167.969f,8.85086f,-222.656f, +-164.063f,10.6896f,-222.656f, +-160.156f,12.9132f,-222.656f, +-156.25f,13.602f,-222.656f, +-152.344f,15.3711f,-222.656f, +-148.438f,16.1768f,-222.656f, +-144.531f,16.9203f,-222.656f, +-140.625f,17.0404f,-222.656f, +-136.719f,18.4968f,-222.656f, +-132.813f,18.8222f,-222.656f, +-128.906f,19.2736f,-222.656f, +-125.0f,19.1956f,-222.656f, +-121.094f,18.5998f,-222.656f, +-117.188f,18.5054f,-222.656f, +-113.281f,19.68f,-222.656f, +-109.375f,19.5038f,-222.656f, +-105.469f,19.4749f,-222.656f, +-101.563f,18.7504f,-222.656f, +-97.6563f,18.6121f,-222.656f, +-93.75f,19.1119f,-222.656f, +-89.8438f,20.5347f,-222.656f, +-85.9375f,21.4412f,-222.656f, +-82.0313f,22.187f,-222.656f, +-78.125f,22.9384f,-222.656f, +-74.2188f,22.5226f,-222.656f, +-70.3125f,22.7323f,-222.656f, +-66.4063f,23.4931f,-222.656f, +-62.5f,24.6895f,-222.656f, +-58.5938f,24.9745f,-222.656f, +-54.6875f,24.801f,-222.656f, +-50.7813f,23.2235f,-222.656f, +-46.875f,22.4973f,-222.656f, +-42.9688f,23.9826f,-222.656f, +-39.0625f,23.4458f,-222.656f, +-35.1563f,22.66f,-222.656f, +-31.25f,20.8011f,-222.656f, +-27.3438f,18.877f,-222.656f, +-23.4375f,17.9999f,-222.656f, +-19.5313f,18.2206f,-222.656f, +-15.625f,17.8501f,-222.656f, +-11.7188f,16.2125f,-222.656f, +-7.8125f,15.4897f,-222.656f, +-3.90625f,14.2048f,-222.656f, +0.0f,13.1443f,-222.656f, +3.90625f,13.0199f,-222.656f, +-250.0f,15.9959f,-226.563f, +-246.094f,16.3902f,-226.563f, +-242.188f,17.2433f,-226.563f, +-238.281f,16.8903f,-226.563f, +-234.375f,16.2616f,-226.563f, +-230.469f,16.3335f,-226.563f, +-226.563f,15.3662f,-226.563f, +-222.656f,14.6429f,-226.563f, +-218.75f,15.2987f,-226.563f, +-214.844f,15.1249f,-226.563f, +-210.938f,14.6321f,-226.563f, +-207.031f,15.402f,-226.563f, +-203.125f,15.5803f,-226.563f, +-199.219f,15.8024f,-226.563f, +-195.313f,14.9564f,-226.563f, +-191.406f,14.7272f,-226.563f, +-187.5f,14.0749f,-226.563f, +-183.594f,12.2838f,-226.563f, +-179.688f,12.0268f,-226.563f, +-175.781f,10.904f,-226.563f, +-171.875f,10.0049f,-226.563f, +-167.969f,9.85558f,-226.563f, +-164.063f,11.873f,-226.563f, +-160.156f,14.0684f,-226.563f, +-156.25f,15.4765f,-226.563f, +-152.344f,16.7458f,-226.563f, +-148.438f,17.9359f,-226.563f, +-144.531f,18.4507f,-226.563f, +-140.625f,18.3457f,-226.563f, +-136.719f,20.0059f,-226.563f, +-132.813f,20.3125f,-226.563f, +-128.906f,19.751f,-226.563f, +-125.0f,19.8084f,-226.563f, +-121.094f,19.9091f,-226.563f, +-117.188f,20.3401f,-226.563f, +-113.281f,20.8121f,-226.563f, +-109.375f,20.5705f,-226.563f, +-105.469f,20.9909f,-226.563f, +-101.563f,20.4171f,-226.563f, +-97.6563f,19.834f,-226.563f, +-93.75f,19.9289f,-226.563f, +-89.8438f,20.4305f,-226.563f, +-85.9375f,21.4097f,-226.563f, +-82.0313f,21.9666f,-226.563f, +-78.125f,22.5232f,-226.563f, +-74.2188f,22.2049f,-226.563f, +-70.3125f,22.7045f,-226.563f, +-66.4063f,23.7933f,-226.563f, +-62.5f,24.5938f,-226.563f, +-58.5938f,24.6161f,-226.563f, +-54.6875f,23.6008f,-226.563f, +-50.7813f,21.9411f,-226.563f, +-46.875f,21.6164f,-226.563f, +-42.9688f,22.5551f,-226.563f, +-39.0625f,22.5032f,-226.563f, +-35.1563f,21.5165f,-226.563f, +-31.25f,19.8362f,-226.563f, +-27.3438f,17.5967f,-226.563f, +-23.4375f,15.6932f,-226.563f, +-19.5313f,15.7774f,-226.563f, +-15.625f,15.6405f,-226.563f, +-11.7188f,14.7549f,-226.563f, +-7.8125f,14.3205f,-226.563f, +-3.90625f,13.2947f,-226.563f, +0.0f,11.9266f,-226.563f, +3.90625f,11.9733f,-226.563f, +-250.0f,15.2423f,-230.469f, +-246.094f,16.2143f,-230.469f, +-242.188f,17.2462f,-230.469f, +-238.281f,17.7941f,-230.469f, +-234.375f,18.4029f,-230.469f, +-230.469f,18.5726f,-230.469f, +-226.563f,17.4729f,-230.469f, +-222.656f,15.9467f,-230.469f, +-218.75f,15.5021f,-230.469f, +-214.844f,15.7096f,-230.469f, +-210.938f,15.6276f,-230.469f, +-207.031f,15.7025f,-230.469f, +-203.125f,14.8851f,-230.469f, +-199.219f,14.87f,-230.469f, +-195.313f,14.3971f,-230.469f, +-191.406f,14.5771f,-230.469f, +-187.5f,13.8163f,-230.469f, +-183.594f,12.7605f,-230.469f, +-179.688f,12.587f,-230.469f, +-175.781f,11.0727f,-230.469f, +-171.875f,10.0166f,-230.469f, +-167.969f,12.5787f,-230.469f, +-164.063f,13.3613f,-230.469f, +-160.156f,14.7537f,-230.469f, +-156.25f,15.9879f,-230.469f, +-152.344f,17.6792f,-230.469f, +-148.438f,18.5224f,-230.469f, +-144.531f,18.5026f,-230.469f, +-140.625f,19.4852f,-230.469f, +-136.719f,20.3222f,-230.469f, +-132.813f,20.2809f,-230.469f, +-128.906f,21.0408f,-230.469f, +-125.0f,20.4729f,-230.469f, +-121.094f,20.8829f,-230.469f, +-117.188f,21.532f,-230.469f, +-113.281f,21.3373f,-230.469f, +-109.375f,22.0014f,-230.469f, +-105.469f,22.1484f,-230.469f, +-101.563f,21.7053f,-230.469f, +-97.6563f,20.5255f,-230.469f, +-93.75f,19.6269f,-230.469f, +-89.8438f,20.0012f,-230.469f, +-85.9375f,21.0697f,-230.469f, +-82.0313f,21.8192f,-230.469f, +-78.125f,22.7525f,-230.469f, +-74.2188f,22.3932f,-230.469f, +-70.3125f,22.0383f,-230.469f, +-66.4063f,22.5989f,-230.469f, +-62.5f,23.0428f,-230.469f, +-58.5938f,22.4512f,-230.469f, +-54.6875f,21.5848f,-230.469f, +-50.7813f,20.085f,-230.469f, +-46.875f,19.9106f,-230.469f, +-42.9688f,20.5256f,-230.469f, +-39.0625f,20.2072f,-230.469f, +-35.1563f,18.9414f,-230.469f, +-31.25f,17.9342f,-230.469f, +-27.3438f,15.3472f,-230.469f, +-23.4375f,13.2173f,-230.469f, +-19.5313f,13.1448f,-230.469f, +-15.625f,13.7506f,-230.469f, +-11.7188f,12.7439f,-230.469f, +-7.8125f,12.5338f,-230.469f, +-3.90625f,12.0435f,-230.469f, +0.0f,11.0483f,-230.469f, +3.90625f,10.4619f,-230.469f, +-250.0f,15.6879f,-234.375f, +-246.094f,17.6667f,-234.375f, +-242.188f,18.8427f,-234.375f, +-238.281f,19.6527f,-234.375f, +-234.375f,19.7979f,-234.375f, +-230.469f,19.8698f,-234.375f, +-226.563f,19.1736f,-234.375f, +-222.656f,16.9995f,-234.375f, +-218.75f,15.4573f,-234.375f, +-214.844f,15.6294f,-234.375f, +-210.938f,15.4315f,-234.375f, +-207.031f,15.1239f,-234.375f, +-203.125f,14.669f,-234.375f, +-199.219f,14.4586f,-234.375f, +-195.313f,14.1329f,-234.375f, +-191.406f,14.0558f,-234.375f, +-187.5f,13.3746f,-234.375f, +-183.594f,13.2348f,-234.375f, +-179.688f,13.3354f,-234.375f, +-175.781f,12.1532f,-234.375f, +-171.875f,11.4785f,-234.375f, +-167.969f,12.7174f,-234.375f, +-164.063f,14.0617f,-234.375f, +-160.156f,15.3367f,-234.375f, +-156.25f,16.6196f,-234.375f, +-152.344f,17.6677f,-234.375f, +-148.438f,18.475f,-234.375f, +-144.531f,19.8205f,-234.375f, +-140.625f,19.6973f,-234.375f, +-136.719f,20.5952f,-234.375f, +-132.813f,20.3507f,-234.375f, +-128.906f,20.8729f,-234.375f, +-125.0f,21.9377f,-234.375f, +-121.094f,21.8916f,-234.375f, +-117.188f,21.9614f,-234.375f, +-113.281f,22.1752f,-234.375f, +-109.375f,22.2881f,-234.375f, +-105.469f,23.1063f,-234.375f, +-101.563f,23.4826f,-234.375f, +-97.6563f,22.5968f,-234.375f, +-93.75f,21.3142f,-234.375f, +-89.8438f,19.9609f,-234.375f, +-85.9375f,21.4353f,-234.375f, +-82.0313f,21.9716f,-234.375f, +-78.125f,22.6918f,-234.375f, +-74.2188f,21.9561f,-234.375f, +-70.3125f,21.3085f,-234.375f, +-66.4063f,21.4104f,-234.375f, +-62.5f,21.4904f,-234.375f, +-58.5938f,20.2467f,-234.375f, +-54.6875f,19.1535f,-234.375f, +-50.7813f,17.9598f,-234.375f, +-46.875f,18.0449f,-234.375f, +-42.9688f,18.3612f,-234.375f, +-39.0625f,17.5008f,-234.375f, +-35.1563f,16.7819f,-234.375f, +-31.25f,15.4328f,-234.375f, +-27.3438f,13.9747f,-234.375f, +-23.4375f,12.1868f,-234.375f, +-19.5313f,12.0847f,-234.375f, +-15.625f,11.926f,-234.375f, +-11.7188f,11.3058f,-234.375f, +-7.8125f,11.0187f,-234.375f, +-3.90625f,10.1275f,-234.375f, +0.0f,9.73133f,-234.375f, +3.90625f,8.85224f,-234.375f, +-250.0f,16.6463f,-238.281f, +-246.094f,18.8582f,-238.281f, +-242.188f,19.6269f,-238.281f, +-238.281f,20.3222f,-238.281f, +-234.375f,20.8316f,-238.281f, +-230.469f,20.6072f,-238.281f, +-226.563f,19.2331f,-238.281f, +-222.656f,18.0021f,-238.281f, +-218.75f,16.4891f,-238.281f, +-214.844f,15.7845f,-238.281f, +-210.938f,15.4622f,-238.281f, +-207.031f,14.3459f,-238.281f, +-203.125f,14.6544f,-238.281f, +-199.219f,13.7779f,-238.281f, +-195.313f,13.4199f,-238.281f, +-191.406f,13.2089f,-238.281f, +-187.5f,12.5036f,-238.281f, +-183.594f,12.6398f,-238.281f, +-179.688f,13.015f,-238.281f, +-175.781f,12.659f,-238.281f, +-171.875f,13.2801f,-238.281f, +-167.969f,13.9547f,-238.281f, +-164.063f,14.8792f,-238.281f, +-160.156f,16.4144f,-238.281f, +-156.25f,17.1062f,-238.281f, +-152.344f,17.9028f,-238.281f, +-148.438f,19.1823f,-238.281f, +-144.531f,20.6903f,-238.281f, +-140.625f,19.9053f,-238.281f, +-136.719f,20.8795f,-238.281f, +-132.813f,21.7034f,-238.281f, +-128.906f,21.8373f,-238.281f, +-125.0f,22.5134f,-238.281f, +-121.094f,22.7918f,-238.281f, +-117.188f,23.1126f,-238.281f, +-113.281f,23.0308f,-238.281f, +-109.375f,23.7212f,-238.281f, +-105.469f,24.6127f,-238.281f, +-101.563f,24.5942f,-238.281f, +-97.6563f,24.0315f,-238.281f, +-93.75f,23.2191f,-238.281f, +-89.8438f,21.3372f,-238.281f, +-85.9375f,20.6395f,-238.281f, +-82.0313f,22.2808f,-238.281f, +-78.125f,22.2977f,-238.281f, +-74.2188f,21.5802f,-238.281f, +-70.3125f,20.5131f,-238.281f, +-66.4063f,20.0882f,-238.281f, +-62.5f,19.9865f,-238.281f, +-58.5938f,19.1423f,-238.281f, +-54.6875f,16.917f,-238.281f, +-50.7813f,16.0256f,-238.281f, +-46.875f,15.4122f,-238.281f, +-42.9688f,15.0531f,-238.281f, +-39.0625f,15.8819f,-238.281f, +-35.1563f,14.3724f,-238.281f, +-31.25f,12.993f,-238.281f, +-27.3438f,11.8948f,-238.281f, +-23.4375f,10.1339f,-238.281f, +-19.5313f,10.4205f,-238.281f, +-15.625f,10.7339f,-238.281f, +-11.7188f,9.86852f,-238.281f, +-7.8125f,8.89818f,-238.281f, +-3.90625f,8.20848f,-238.281f, +0.0f,7.89095f,-238.281f, +3.90625f,7.99527f,-238.281f, +-250.0f,16.461f,-242.188f, +-246.094f,18.8623f,-242.188f, +-242.188f,19.6097f,-242.188f, +-238.281f,20.8167f,-242.188f, +-234.375f,21.0667f,-242.188f, +-230.469f,20.3337f,-242.188f, +-226.563f,18.9993f,-242.188f, +-222.656f,17.8141f,-242.188f, +-218.75f,17.3651f,-242.188f, +-214.844f,16.1703f,-242.188f, +-210.938f,15.3612f,-242.188f, +-207.031f,14.5062f,-242.188f, +-203.125f,14.0333f,-242.188f, +-199.219f,13.0731f,-242.188f, +-195.313f,13.0716f,-242.188f, +-191.406f,12.2773f,-242.188f, +-187.5f,12.1599f,-242.188f, +-183.594f,12.0841f,-242.188f, +-179.688f,11.1979f,-242.188f, +-175.781f,11.7767f,-242.188f, +-171.875f,13.5192f,-242.188f, +-167.969f,13.6117f,-242.188f, +-164.063f,14.5377f,-242.188f, +-160.156f,16.1128f,-242.188f, +-156.25f,17.0591f,-242.188f, +-152.344f,18.0547f,-242.188f, +-148.438f,19.9927f,-242.188f, +-144.531f,20.5592f,-242.188f, +-140.625f,20.5602f,-242.188f, +-136.719f,20.6585f,-242.188f, +-132.813f,22.6924f,-242.188f, +-128.906f,23.4786f,-242.188f, +-125.0f,23.9921f,-242.188f, +-121.094f,24.3221f,-242.188f, +-117.188f,24.7845f,-242.188f, +-113.281f,24.0995f,-242.188f, +-109.375f,25.5836f,-242.188f, +-105.469f,25.1932f,-242.188f, +-101.563f,25.0022f,-242.188f, +-97.6563f,24.569f,-242.188f, +-93.75f,24.5749f,-242.188f, +-89.8438f,22.6678f,-242.188f, +-85.9375f,20.6652f,-242.188f, +-82.0313f,21.1719f,-242.188f, +-78.125f,21.9102f,-242.188f, +-74.2188f,20.9512f,-242.188f, +-70.3125f,19.1099f,-242.188f, +-66.4063f,18.2366f,-242.188f, +-62.5f,16.9751f,-242.188f, +-58.5938f,16.938f,-242.188f, +-54.6875f,16.3692f,-242.188f, +-50.7813f,14.5702f,-242.188f, +-46.875f,13.5527f,-242.188f, +-42.9688f,13.0169f,-242.188f, +-39.0625f,11.9599f,-242.188f, +-35.1563f,11.4675f,-242.188f, +-31.25f,10.1264f,-242.188f, +-27.3438f,9.05124f,-242.188f, +-23.4375f,8.17722f,-242.188f, +-19.5313f,8.42066f,-242.188f, +-15.625f,8.13199f,-242.188f, +-11.7188f,7.70744f,-242.188f, +-7.8125f,7.06448f,-242.188f, +-3.90625f,6.2428f,-242.188f, +0.0f,6.35893f,-242.188f, +3.90625f,6.40337f,-242.188f, +-250.0f,16.6546f,-246.094f, +-246.094f,17.6689f,-246.094f, +-242.188f,18.7575f,-246.094f, +-238.281f,20.3967f,-246.094f, +-234.375f,20.3065f,-246.094f, +-230.469f,20.2082f,-246.094f, +-226.563f,19.5383f,-246.094f, +-222.656f,17.7409f,-246.094f, +-218.75f,16.6708f,-246.094f, +-214.844f,15.9584f,-246.094f, +-210.938f,14.8412f,-246.094f, +-207.031f,14.5591f,-246.094f, +-203.125f,13.9049f,-246.094f, +-199.219f,12.4723f,-246.094f, +-195.313f,11.7361f,-246.094f, +-191.406f,11.5463f,-246.094f, +-187.5f,10.9687f,-246.094f, +-183.594f,10.6795f,-246.094f, +-179.688f,10.6856f,-246.094f, +-175.781f,10.6342f,-246.094f, +-171.875f,12.061f,-246.094f, +-167.969f,12.3131f,-246.094f, +-164.063f,13.8453f,-246.094f, +-160.156f,15.3522f,-246.094f, +-156.25f,16.575f,-246.094f, +-152.344f,17.953f,-246.094f, +-148.438f,18.9271f,-246.094f, +-144.531f,19.6463f,-246.094f, +-140.625f,20.0348f,-246.094f, +-136.719f,20.8966f,-246.094f, +-132.813f,22.7081f,-246.094f, +-128.906f,24.2289f,-246.094f, +-125.0f,24.3296f,-246.094f, +-121.094f,25.513f,-246.094f, +-117.188f,26.0616f,-246.094f, +-113.281f,25.9026f,-246.094f, +-109.375f,25.3793f,-246.094f, +-105.469f,26.0086f,-246.094f, +-101.563f,25.9668f,-246.094f, +-97.6563f,25.4377f,-246.094f, +-93.75f,24.6398f,-246.094f, +-89.8438f,22.6277f,-246.094f, +-85.9375f,20.9377f,-246.094f, +-82.0313f,20.5815f,-246.094f, +-78.125f,20.2521f,-246.094f, +-74.2188f,19.1439f,-246.094f, +-70.3125f,17.8492f,-246.094f, +-66.4063f,16.6347f,-246.094f, +-62.5f,15.9154f,-246.094f, +-58.5938f,14.2098f,-246.094f, +-54.6875f,13.5957f,-246.094f, +-50.7813f,12.5676f,-246.094f, +-46.875f,11.2422f,-246.094f, +-42.9688f,10.426f,-246.094f, +-39.0625f,10.1665f,-246.094f, +-35.1563f,9.19605f,-246.094f, +-31.25f,7.36042f,-246.094f, +-27.3438f,5.74959f,-246.094f, +-23.4375f,5.41512f,-246.094f, +-19.5313f,6.03312f,-246.094f, +-15.625f,5.93285f,-246.094f, +-11.7188f,5.3331f,-246.094f, +-7.8125f,5.48059f,-246.094f, +-3.90625f,4.92566f,-246.094f, +0.0f,5.05645f,-246.094f, +3.90625f,6.09425f,-246.094f, +-250.0f,17.2418f,-250.0f, +-246.094f,17.9679f,-250.0f, +-242.188f,19.359f,-250.0f, +-238.281f,19.3277f,-250.0f, +-234.375f,20.1575f,-250.0f, +-230.469f,19.8999f,-250.0f, +-226.563f,18.9681f,-250.0f, +-222.656f,17.7696f,-250.0f, +-218.75f,15.6199f,-250.0f, +-214.844f,14.6555f,-250.0f, +-210.938f,13.0514f,-250.0f, +-207.031f,13.6029f,-250.0f, +-203.125f,13.1455f,-250.0f, +-199.219f,12.0056f,-250.0f, +-195.313f,11.1773f,-250.0f, +-191.406f,10.7263f,-250.0f, +-187.5f,10.2543f,-250.0f, +-183.594f,9.76389f,-250.0f, +-179.688f,9.00623f,-250.0f, +-175.781f,9.47424f,-250.0f, +-171.875f,10.8011f,-250.0f, +-167.969f,12.4395f,-250.0f, +-164.063f,13.7736f,-250.0f, +-160.156f,14.0938f,-250.0f, +-156.25f,15.8447f,-250.0f, +-152.344f,17.1975f,-250.0f, +-148.438f,17.963f,-250.0f, +-144.531f,19.3662f,-250.0f, +-140.625f,20.309f,-250.0f, +-136.719f,21.9063f,-250.0f, +-132.813f,22.8363f,-250.0f, +-128.906f,24.0073f,-250.0f, +-125.0f,25.2989f,-250.0f, +-121.094f,26.2944f,-250.0f, +-117.188f,27.4482f,-250.0f, +-113.281f,27.4823f,-250.0f, +-109.375f,27.2835f,-250.0f, +-105.469f,27.4754f,-250.0f, +-101.563f,27.7731f,-250.0f, +-97.6563f,26.6981f,-250.0f, +-93.75f,24.4699f,-250.0f, +-89.8438f,22.81f,-250.0f, +-85.9375f,21.6739f,-250.0f, +-82.0313f,19.8713f,-250.0f, +-78.125f,18.5848f,-250.0f, +-74.2188f,17.7134f,-250.0f, +-70.3125f,15.5276f,-250.0f, +-66.4063f,14.6805f,-250.0f, +-62.5f,14.0332f,-250.0f, +-58.5938f,12.1429f,-250.0f, +-54.6875f,10.3027f,-250.0f, +-50.7813f,9.68001f,-250.0f, +-46.875f,8.12561f,-250.0f, +-42.9688f,8.26581f,-250.0f, +-39.0625f,7.98056f,-250.0f, +-35.1563f,7.43215f,-250.0f, +-31.25f,6.33038f,-250.0f, +-27.3438f,4.62549f,-250.0f, +-23.4375f,3.83616f,-250.0f, +-19.5313f,4.24597f,-250.0f, +-15.625f,3.79997f,-250.0f, +-11.7188f,3.74461f,-250.0f, +-7.8125f,3.79853f,-250.0f, +-3.90625f,3.95418f,-250.0f, +0.0f,5.70623f,-250.0f, +3.90625f,6.31953f,-250.0f, +}; + +btScalar Landscape08Nml[] = { +-0.193879f,0.980285f,-0.0381128f, +-0.101407f,0.994799f,-0.00961843f, +-0.17812f,0.983422f,0.0339701f, +-0.107869f,0.990758f,0.0822321f, +-0.150224f,0.986838f,0.0598614f, +-0.176421f,0.983338f,0.0438458f, +0.00771709f,0.999873f,0.0139132f, +-0.0458501f,0.998747f,-0.0200731f, +0.170866f,0.984802f,-0.0311488f, +0.198428f,0.979783f,-0.0255296f, +0.223966f,0.969797f,0.0966125f, +0.319719f,0.946459f,0.0446654f, +0.155788f,0.942148f,0.296794f, +0.226142f,0.945324f,0.234996f, +0.0234229f,0.954977f,0.295752f, +-0.0213542f,0.981077f,0.192434f, +-0.0320299f,0.976907f,0.211248f, +-0.0305686f,0.97015f,0.240572f, +-0.00290395f,0.990031f,0.14082f, +-0.0740282f,0.98339f,0.165723f, +0.0359831f,0.998663f,0.0371117f, +-0.048977f,0.998654f,0.0171003f, +0.119085f,0.992879f,0.00312204f, +0.163687f,0.985928f,0.0339365f, +0.233927f,0.967265f,0.0983717f, +0.258555f,0.954734f,0.147076f, +0.185228f,0.98177f,0.0426319f, +0.171781f,0.975163f,0.139813f, +0.312497f,0.949826f,0.0132586f, +0.315278f,0.937034f,0.150223f, +0.455936f,0.889912f,-0.0133666f, +0.444363f,0.88993f,0.102789f, +0.477095f,0.878821f,-0.00729384f, +0.442265f,0.892911f,0.0843273f, +0.441901f,0.89445f,-0.0684218f, +0.356563f,0.929766f,-0.091634f, +0.46452f,0.88048f,-0.0947459f, +0.399286f,0.883106f,-0.246362f, +0.430625f,0.899506f,-0.073831f, +0.418125f,0.862027f,-0.286498f, +0.390492f,0.919986f,-0.0337736f, +0.451928f,0.884249f,-0.117748f, +0.389473f,0.920638f,-0.0271218f, +0.401911f,0.911214f,-0.0903147f, +0.411594f,0.910246f,-0.0451926f, +0.385985f,0.916603f,-0.104187f, +0.406515f,0.904587f,-0.128329f, +0.375686f,0.920382f,-0.108425f, +0.421893f,0.886378f,-0.190632f, +0.362475f,0.891842f,-0.270609f, +0.382406f,0.917607f,-0.108459f, +0.380095f,0.864773f,-0.32817f, +0.206545f,0.977978f,-0.0299668f, +0.319336f,0.938074f,-0.134321f, +-0.0276167f,0.998803f,0.0403598f, +0.0724517f,0.997355f,-0.00577643f, +-0.170399f,0.974366f,0.146884f, +-0.0444923f,0.976538f,0.210699f, +-0.123713f,0.961736f,0.244457f, +-0.0585476f,0.950932f,0.303809f, +-0.0436638f,0.948824f,0.312774f, +-0.0108452f,0.950133f,0.311655f, +-0.0562151f,0.924389f,0.377285f, +-0.024656f,0.918307f,0.3951f, +-0.11936f,0.930674f,0.345831f, +-0.21058f,0.936144f,0.281584f, +-0.166672f,0.952976f,0.253095f, +-0.262868f,0.958623f,0.109278f, +-0.138859f,0.97532f,0.171667f, +-0.166823f,0.980233f,0.106364f, +-0.016911f,0.994026f,0.107828f, +0.014088f,0.986713f,0.161858f, +-0.0269312f,0.989998f,0.138489f, +-0.0681193f,0.995186f,0.0704648f, +-0.241507f,0.962694f,0.122045f, +-0.306148f,0.951983f,0.00131283f, +-0.400562f,0.916076f,-0.0188573f, +-0.46755f,0.872686f,-0.140772f, +-0.451983f,0.886731f,-0.0970551f, +-0.445163f,0.885181f,-0.135217f, +-0.440559f,0.893764f,-0.0842181f, +-0.44058f,0.883958f,-0.156548f, +-0.530573f,0.842324f,-0.094771f, +-0.559377f,0.815929f,-0.14614f, +-0.675146f,0.724837f,-0.137074f, +-0.671227f,0.729467f,-0.131655f, +-0.627673f,0.767191f,-0.132076f, +-0.630683f,0.736819f,-0.243592f, +-0.548071f,0.819689f,-0.166518f, +-0.526895f,0.799727f,-0.287781f, +-0.521779f,0.83885f,-0.155167f, +-0.501504f,0.822365f,-0.268719f, +-0.465479f,0.867433f,-0.175756f, +-0.453816f,0.862676f,-0.223251f, +-0.458424f,0.854844f,-0.243083f, +-0.470698f,0.860374f,-0.195446f, +-0.485669f,0.830839f,-0.27172f, +-0.494445f,0.85319f,-0.166102f, +-0.418394f,0.865747f,-0.274642f, +-0.405345f,0.892443f,-0.198093f, +-0.287108f,0.926134f,-0.244631f, +-0.325256f,0.923685f,-0.202519f, +-0.192384f,0.91848f,-0.345518f, +-0.208186f,0.935081f,-0.28685f, +0.0681073f,0.948251f,-0.310131f, +0.077158f,0.955715f,-0.283998f, +0.102278f,0.947499f,-0.302962f, +0.02043f,0.921087f,-0.388821f, +0.0627177f,0.929646f,-0.363077f, +0.0629047f,0.918578f,-0.390202f, +-0.00415691f,0.947597f,-0.31944f, +-0.00512929f,0.899538f,-0.436812f, +-0.271944f,0.935195f,-0.226842f, +-0.177509f,0.92231f,-0.343271f, +-0.413186f,0.904845f,-0.102632f, +-0.338265f,0.931446f,-0.13411f, +-0.418276f,0.90315f,-0.0967731f, +-0.404177f,0.914278f,-0.0271442f, +-0.400569f,0.902696f,-0.157112f, +-0.429625f,0.894308f,-0.125039f, +-0.29004f,0.948484f,-0.127491f, +-0.188203f,0.980777f,0.0515283f, +-0.0585039f,0.997556f,-0.0381961f, +-0.133431f,0.99094f,0.0152943f, +-0.143343f,0.971126f,-0.1907f, +-0.24516f,0.938627f,-0.242644f, +-0.188833f,0.958258f,-0.214673f, +-0.174705f,0.963776f,-0.201528f, +-0.196517f,0.95296f,-0.230756f, +-0.128653f,0.987396f,-0.0921772f, +-0.120365f,0.975049f,-0.186527f, +0.0117596f,0.998991f,0.0433545f, +-0.146882f,0.98666f,-0.0701983f, +-0.218442f,0.971087f,-0.0962923f, +-0.179096f,0.983284f,-0.0328244f, +0.0658277f,0.997324f,0.0318063f, +0.120963f,0.992647f,0.00454206f, +0.0263542f,0.988052f,0.151849f, +0.0179305f,0.957276f,0.288619f, +0.0987151f,0.955923f,0.276526f, +0.113577f,0.970939f,0.210662f, +0.111989f,0.989066f,0.0959572f, +0.0937332f,0.995324f,-0.0233266f, +0.0889156f,0.995493f,-0.0329669f, +0.214527f,0.976717f,-0.0013568f, +0.281036f,0.957864f,-0.0592866f, +0.349427f,0.927689f,-0.131507f, +0.460507f,0.876585f,-0.139754f, +0.465208f,0.877856f,-0.1138f, +0.432422f,0.897621f,-0.0853653f, +0.392928f,0.918987f,-0.032723f, +0.389134f,0.920603f,0.0326418f, +0.40247f,0.914003f,0.0511488f, +0.41651f,0.90858f,0.031652f, +0.468908f,0.883168f,-0.0118055f, +0.497957f,0.862594f,-0.0892785f, +0.342146f,0.929254f,-0.139366f, +0.262957f,0.964807f,-0.00115352f, +0.156573f,0.98302f,0.095691f, +-0.0479214f,0.988417f,0.143995f, +-0.198695f,0.970386f,0.13737f, +-0.222539f,0.963461f,0.14906f, +-0.145574f,0.943362f,0.298121f, +-0.065459f,0.922659f,0.380021f, +-0.0644219f,0.950539f,0.303852f, +-0.126762f,0.967843f,0.217283f, +-0.017815f,0.980142f,0.197496f, +0.0660407f,0.994277f,0.0839804f, +-0.101583f,0.994471f,0.0266049f, +-0.224345f,0.969139f,0.102176f, +-0.280297f,0.958092f,0.0591033f, +-0.402555f,0.91416f,-0.047541f, +-0.458467f,0.883974f,-0.0916445f, +-0.50134f,0.862765f,-0.0655406f, +-0.644808f,0.754744f,-0.12077f, +-0.636358f,0.756299f,-0.151855f, +-0.556238f,0.818404f,-0.144268f, +-0.504016f,0.849904f,-0.153725f, +-0.404172f,0.887071f,-0.223046f, +-0.360363f,0.894242f,-0.265463f, +-0.432057f,0.840836f,-0.326069f, +-0.4393f,0.818603f,-0.370006f, +-0.249988f,0.890718f,-0.379642f, +-0.114697f,0.874572f,-0.471135f, +-0.0301956f,0.870113f,-0.491927f, +0.0871874f,0.907337f,-0.411263f, +0.0509325f,0.923392f,-0.380464f, +-0.106299f,0.953821f,-0.280938f, +-0.389809f,0.901657f,-0.187255f, +-0.420279f,0.904001f,-0.0784108f, +-0.360569f,0.922439f,-0.138186f, +-0.332116f,0.91853f,-0.214478f, +-0.305854f,0.899541f,-0.311896f, +-0.11957f,0.95083f,-0.285701f, +-0.0843961f,0.977455f,-0.193542f, +-0.186555f,0.968589f,-0.164414f, +-0.1142f,0.975963f,-0.185618f, +-0.138309f,0.943055f,-0.30252f, +-0.101226f,0.981339f,-0.163482f, +-0.184633f,0.97099f,-0.151951f, +-0.239394f,0.95355f,-0.182845f, +-0.0575173f,0.989733f,-0.130847f, +0.0688205f,0.993792f,0.0874178f, +-0.0714424f,0.990397f,0.118361f, +-0.0225247f,0.994972f,0.0975878f, +0.167362f,0.976776f,0.133786f, +0.156506f,0.98511f,0.0711603f, +0.198564f,0.979194f,0.0418473f, +0.173408f,0.984455f,-0.0278778f, +0.108869f,0.989375f,-0.0963545f, +0.224679f,0.96015f,-0.166226f, +0.339104f,0.91731f,-0.208688f, +0.367935f,0.88797f,-0.275922f, +0.418707f,0.869398f,-0.262357f, +0.420889f,0.892687f,-0.161129f, +0.397172f,0.910077f,-0.118378f, +0.374326f,0.920598f,-0.11126f, +0.397932f,0.911721f,-0.102056f, +0.386888f,0.911258f,-0.141166f, +0.41482f,0.902273f,-0.117593f, +0.501715f,0.859192f,-0.100356f, +0.491949f,0.863362f,-0.112214f, +0.357466f,0.931719f,-0.0641779f, +0.171333f,0.982821f,-0.068616f, +0.100623f,0.994346f,0.0339287f, +-0.0698557f,0.996834f,0.0379692f, +-0.194026f,0.980994f,0.00220452f, +-0.288205f,0.957419f,0.0169548f, +-0.304635f,0.947239f,0.0996808f, +-0.10216f,0.973655f,0.20386f, +0.100532f,0.974742f,0.199427f, +-0.0238908f,0.99964f,0.0121747f, +-0.00850096f,0.997624f,-0.0683673f, +0.116859f,0.992157f,-0.044359f, +-0.0433286f,0.998946f,-0.0151181f, +-0.258294f,0.961617f,-0.0926162f, +-0.256378f,0.96262f,-0.0873673f, +-0.327211f,0.940376f,-0.0928767f, +-0.431734f,0.888327f,-0.15646f, +-0.514253f,0.844258f,-0.150905f, +-0.599748f,0.789083f,-0.132858f, +-0.620824f,0.749219f,-0.230756f, +-0.533018f,0.803035f,-0.266508f, +-0.441513f,0.840682f,-0.313561f, +-0.38701f,0.854241f,-0.347124f, +-0.380219f,0.879441f,-0.286385f, +-0.39628f,0.874175f,-0.280679f, +-0.390488f,0.846052f,-0.362926f, +-0.205032f,0.876667f,-0.435221f, +-0.00372872f,0.883142f,-0.46909f, +-0.0083869f,0.837348f,-0.546606f, +-0.00127167f,0.831923f,-0.55489f, +-0.11424f,0.875282f,-0.469926f, +-0.256213f,0.933918f,-0.249305f, +-0.393049f,0.915109f,-0.0899313f, +-0.484342f,0.863396f,-0.141282f, +-0.32612f,0.940905f,-0.0913441f, +-0.240051f,0.956808f,-0.163992f, +-0.189326f,0.934609f,-0.301099f, +-0.228613f,0.900757f,-0.369288f, +-0.206601f,0.953154f,-0.220936f, +-0.220523f,0.958575f,-0.180285f, +-0.0691943f,0.98249f,-0.172992f, +0.0652464f,0.984331f,-0.163816f, +-0.308082f,0.909128f,-0.280306f, +-0.234588f,0.948864f,-0.211249f, +-0.164432f,0.95809f,-0.234578f, +-0.206026f,0.945244f,-0.253116f, +-0.143287f,0.989535f,-0.0170174f, +0.0124441f,0.996035f,0.0880878f, +0.00356068f,0.999352f,-0.0358152f, +0.110457f,0.993318f,-0.0334531f, +0.202646f,0.978802f,0.0296789f, +0.245502f,0.969355f,0.00893075f, +0.235742f,0.966989f,-0.096741f, +0.211469f,0.957228f,-0.197474f, +0.297424f,0.906479f,-0.299724f, +0.384843f,0.8614f,-0.331489f, +0.405425f,0.833969f,-0.374335f, +0.330388f,0.8594f,-0.390224f, +0.318232f,0.891429f,-0.32262f, +0.388106f,0.870631f,-0.302284f, +0.354731f,0.863719f,-0.357989f, +0.344798f,0.878386f,-0.330988f, +0.405293f,0.884611f,-0.230654f, +0.388923f,0.889959f,-0.23814f, +0.464087f,0.861962f,-0.20407f, +0.454884f,0.878774f,-0.144348f, +0.334448f,0.940492f,-0.0601651f, +0.155367f,0.984248f,-0.0843604f, +0.0216917f,0.991768f,-0.126198f, +-0.0136477f,0.995915f,-0.089255f, +-0.167328f,0.979282f,-0.114052f, +-0.307453f,0.946588f,-0.0971837f, +-0.335506f,0.9366f,-0.101072f, +-0.175739f,0.978185f,-0.110768f, +0.119064f,0.992411f,-0.0307238f, +0.11077f,0.993829f,0.00590121f, +0.0501349f,0.998052f,-0.0371321f, +0.0267572f,0.997581f,-0.0641572f, +-0.0614311f,0.997945f,0.0181992f, +-0.171984f,0.984492f,-0.0345973f, +-0.25243f,0.961435f,-0.109187f, +-0.338599f,0.935923f,-0.0969507f, +-0.406007f,0.913202f,-0.0349361f, +-0.506218f,0.860674f,-0.0546185f, +-0.568342f,0.8123f,-0.130983f, +-0.570141f,0.791669f,-0.219544f, +-0.495272f,0.816181f,-0.297581f, +-0.441753f,0.829099f,-0.342707f, +-0.433015f,0.854206f,-0.287802f, +-0.452692f,0.8617f,-0.229223f, +-0.349843f,0.914647f,-0.202562f, +-0.26556f,0.912134f,-0.312233f, +-0.238012f,0.870367f,-0.431058f, +0.0104117f,0.943359f,-0.331612f, +0.0744935f,0.949145f,-0.305899f, +-0.0305186f,0.956187f,-0.291161f, +-0.253914f,0.939488f,-0.229978f, +-0.449831f,0.878563f,-0.160557f, +-0.46937f,0.880955f,-0.0600792f, +-0.456075f,0.88917f,-0.0370459f, +-0.35963f,0.932902f,-0.0189682f, +-0.136797f,0.989932f,0.0363352f, +-0.0613131f,0.996495f,-0.0569106f, +-0.21207f,0.964351f,-0.158282f, +-0.303853f,0.931291f,-0.200924f, +-0.14101f,0.957182f,-0.252823f, +-0.0888984f,0.919027f,-0.384041f, +0.0067746f,0.936029f,-0.351857f, +-0.277531f,0.936633f,-0.213766f, +-0.206375f,0.947006f,-0.246148f, +-0.159145f,0.94264f,-0.293433f, +-0.254895f,0.932893f,-0.254437f, +-0.289527f,0.928279f,-0.233391f, +-0.0765713f,0.988951f,-0.126934f, +0.118605f,0.992812f,0.0160497f, +0.122094f,0.985714f,-0.116021f, +0.123131f,0.980876f,-0.150734f, +0.257926f,0.962137f,-0.0881221f, +0.397575f,0.90803f,-0.131971f, +0.301628f,0.898949f,-0.317666f, +0.360055f,0.863992f,-0.351962f, +0.391486f,0.830925f,-0.39535f, +0.399022f,0.829333f,-0.391136f, +0.323505f,0.871183f,-0.369302f, +0.290418f,0.885393f,-0.362955f, +0.422788f,0.860776f,-0.283398f, +0.400499f,0.876008f,-0.26872f, +0.272367f,0.912425f,-0.305444f, +0.289824f,0.919053f,-0.267101f, +0.375469f,0.907173f,-0.189898f, +0.450189f,0.881784f,-0.140667f, +0.386895f,0.914552f,-0.117932f, +0.236065f,0.970562f,-0.0477698f, +0.25497f,0.966484f,0.0299776f, +0.147152f,0.978905f,-0.141747f, +-0.0638684f,0.954892f,-0.290005f, +-0.198781f,0.952653f,-0.230082f, +-0.310279f,0.934977f,-0.171888f, +-0.315284f,0.933842f,-0.168923f, +-0.14676f,0.971582f,-0.185715f, +-0.0201641f,0.976785f,-0.213271f, +0.0408109f,0.997823f,-0.0518006f, +-0.000100141f,1.0f,-0.000656924f, +0.0713875f,0.992775f,0.096444f, +-0.0699693f,0.997522f,-0.0073179f, +-0.120441f,0.992484f,-0.0216487f, +-0.200799f,0.979135f,-0.0312183f, +-0.379156f,0.923729f,-0.0544518f, +-0.468756f,0.883079f,0.0209709f, +-0.451556f,0.890079f,0.0621062f, +-0.476504f,0.87674f,-0.0653536f, +-0.492274f,0.840855f,-0.22501f, +-0.481358f,0.828756f,-0.285409f, +-0.474733f,0.852404f,-0.219173f, +-0.502016f,0.852123f,-0.147874f, +-0.474734f,0.870513f,-0.12975f, +-0.344408f,0.92173f,-0.178317f, +-0.150823f,0.963991f,-0.21903f, +-0.180013f,0.935609f,-0.303696f, +-0.154788f,0.929555f,-0.334617f, +0.0226749f,0.973389f,-0.228036f, +-0.128469f,0.975007f,-0.181264f, +-0.302747f,0.952293f,-0.0385077f, +-0.427741f,0.902872f,-0.0431169f, +-0.47673f,0.871329f,-0.116249f, +-0.489254f,0.866227f,-0.101399f, +-0.407231f,0.911582f,-0.0564075f, +-0.202058f,0.978968f,-0.0281862f, +-0.00674228f,0.999486f,0.0313481f, +-0.103136f,0.994637f,-0.00773474f, +-0.196734f,0.967877f,-0.156554f, +0.0323675f,0.951182f,-0.306928f, +0.00132526f,0.886111f,-0.463472f, +-0.0819618f,0.88666f,-0.4551f, +-0.207835f,0.973361f,-0.0968142f, +-0.157163f,0.972283f,-0.173105f, +-0.187284f,0.955049f,-0.229797f, +-0.285445f,0.950862f,-0.119931f, +-0.25293f,0.964263f,-0.078892f, +-0.219599f,0.957265f,-0.188204f, +-0.0108412f,0.995374f,-0.0954668f, +0.265678f,0.963807f,-0.0221529f, +0.203794f,0.959343f,-0.195266f, +0.214345f,0.928921f,-0.301932f, +0.439386f,0.868442f,-0.22967f, +0.401404f,0.868685f,-0.290278f, +0.386804f,0.861005f,-0.330232f, +0.428054f,0.836263f,-0.342686f, +0.371108f,0.864198f,-0.339765f, +0.321515f,0.897421f,-0.302098f, +0.213518f,0.927633f,-0.306443f, +0.325579f,0.933219f,-0.151988f, +0.403183f,0.912352f,-0.0711129f, +0.337076f,0.932606f,-0.128942f, +0.295377f,0.932293f,-0.208765f, +0.330751f,0.922115f,-0.200767f, +0.392168f,0.906602f,-0.155808f, +0.373592f,0.925323f,-0.0648487f, +0.191498f,0.98018f,-0.0507507f, +0.210624f,0.977447f,-0.015309f, +0.322948f,0.945895f,0.0314047f, +0.111956f,0.981203f,-0.157186f, +-0.247376f,0.91284f,-0.32485f, +-0.344293f,0.903462f,-0.255381f, +-0.317143f,0.916625f,-0.243348f, +-0.146502f,0.958945f,-0.242819f, +-0.0529375f,0.980235f,-0.19062f, +-0.0439655f,0.993569f,-0.104344f, +-0.0681441f,0.993007f,-0.0964036f, +0.0333119f,0.999062f,-0.0276811f, +0.0418264f,0.997289f,-0.0605344f, +-0.133447f,0.982771f,-0.127878f, +-0.204776f,0.9734f,-0.102754f, +-0.405337f,0.909688f,-0.0903804f, +-0.513852f,0.857872f,0.00340788f, +-0.448907f,0.892038f,0.0524446f, +-0.345596f,0.938383f,0.000245611f, +-0.371875f,0.917654f,-0.14007f, +-0.507047f,0.834221f,-0.216744f, +-0.563482f,0.814021f,-0.140919f, +-0.549501f,0.831415f,-0.0824446f, +-0.452205f,0.89061f,-0.0482179f, +-0.283377f,0.952701f,-0.109812f, +-0.141817f,0.97445f,-0.174169f, +-0.1066f,0.981505f,-0.159008f, +-0.128743f,0.958435f,-0.254611f, +0.00656601f,0.946015f,-0.324056f, +-0.2018f,0.913066f,-0.354384f, +-0.37997f,0.904414f,-0.19406f, +-0.423353f,0.890783f,-0.165163f, +-0.446411f,0.883929f,-0.139235f, +-0.512365f,0.844229f,-0.157352f, +-0.38243f,0.91272f,-0.143839f, +-0.20154f,0.953013f,-0.226157f, +-0.104673f,0.977037f,-0.185586f, +-0.0458745f,0.998873f,-0.0121567f, +-0.0345945f,0.993617f,-0.107371f, +0.172752f,0.948616f,-0.265111f, +0.0733608f,0.946968f,-0.312842f, +-0.16546f,0.93251f,-0.321012f, +-0.129843f,0.991294f,-0.0218587f, +-0.0514732f,0.996939f,-0.0588533f, +-0.139666f,0.979954f,-0.142066f, +-0.409538f,0.893138f,-0.185964f, +-0.25948f,0.963277f,-0.0690542f, +-0.106228f,0.993322f,-0.0450175f, +-0.047863f,0.993002f,-0.107966f, +0.238746f,0.962198f,-0.131057f, +0.395076f,0.900486f,-0.181771f, +0.285693f,0.874669f,-0.391577f, +0.358513f,0.848133f,-0.39005f, +0.400938f,0.884343f,-0.239137f, +0.415724f,0.899223f,-0.136277f, +0.438653f,0.894164f,-0.0897495f, +0.361082f,0.930821f,-0.0565009f, +0.321158f,0.946416f,-0.0339725f, +0.242073f,0.961641f,-0.129024f, +0.199607f,0.93926f,-0.279192f, +0.404284f,0.887623f,-0.220636f, +0.424881f,0.860893f,-0.279892f, +0.291182f,0.870529f,-0.396727f, +0.302468f,0.897545f,-0.320822f, +0.33835f,0.898885f,-0.278433f, +0.289098f,0.929341f,-0.229667f, +0.170367f,0.971163f,-0.166783f, +0.129237f,0.986609f,-0.0995005f, +0.305057f,0.951694f,0.0349234f, +0.306439f,0.951736f,-0.0171507f, +-0.0808802f,0.976235f,-0.201056f, +-0.37625f,0.871862f,-0.313516f, +-0.307717f,0.906797f,-0.28815f, +-0.221648f,0.946026f,-0.236446f, +-0.153972f,0.983161f,-0.0984244f, +-0.108206f,0.992418f,-0.0582996f, +-0.0581427f,0.997361f,-0.0434687f, +0.00296039f,0.999365f,-0.0355116f, +0.0891034f,0.995894f,-0.0160169f, +-0.110645f,0.991801f,-0.0639364f, +-0.218461f,0.975223f,-0.0348525f, +-0.395365f,0.918398f,-0.0152307f, +-0.576836f,0.816159f,-0.0338453f, +-0.444941f,0.895556f,-0.00249309f, +-0.286239f,0.957764f,-0.0274641f, +-0.294715f,0.953259f,-0.0666355f, +-0.477956f,0.87064f,-0.116377f, +-0.574643f,0.800737f,-0.169131f, +-0.54804f,0.808388f,-0.214852f, +-0.442187f,0.863382f,-0.242986f, +-0.246722f,0.934143f,-0.257887f, +-0.157124f,0.964153f,-0.213827f, +-0.112706f,0.987993f,-0.10568f, +-0.0332674f,0.993709f,-0.106936f, +0.112688f,0.981964f,-0.151814f, +-0.167f,0.962022f,-0.215928f, +-0.466198f,0.854366f,-0.229606f, +-0.414399f,0.885329f,-0.210869f, +-0.461383f,0.855213f,-0.236084f, +-0.488245f,0.847976f,-0.206287f, +-0.351309f,0.900136f,-0.257559f, +-0.14601f,0.942734f,-0.29989f, +-0.222931f,0.937875f,-0.265879f, +-0.195469f,0.970505f,-0.141106f, +0.07525f,0.994532f,-0.0724173f, +0.279727f,0.951429f,-0.128592f, +0.077712f,0.980159f,-0.182341f, +-0.20264f,0.956685f,-0.209022f, +-0.0986596f,0.987061f,-0.126403f, +-0.0477559f,0.985147f,-0.164941f, +-0.0669351f,0.983547f,-0.167793f, +-0.331517f,0.915331f,-0.228616f, +-0.350669f,0.900109f,-0.258526f, +-0.179805f,0.971282f,-0.155824f, +0.0156578f,0.989915f,-0.140797f, +0.301547f,0.9226f,-0.240579f, +0.457383f,0.852861f,-0.25185f, +0.449776f,0.84917f,-0.276789f, +0.26609f,0.885033f,-0.381984f, +0.182331f,0.952085f,-0.245538f, +0.260541f,0.964562f,-0.0416928f, +0.408684f,0.907067f,0.101033f, +0.342263f,0.936545f,0.0757594f, +0.318298f,0.944991f,0.0753604f, +0.467785f,0.882822f,0.0424513f, +0.409568f,0.864687f,-0.290809f, +0.379738f,0.82358f,-0.421325f, +0.451329f,0.792384f,-0.410402f, +0.275091f,0.868881f,-0.411547f, +0.161796f,0.92881f,-0.333367f, +0.286521f,0.932696f,-0.219053f, +0.272475f,0.944744f,-0.182252f, +0.119383f,0.965719f,-0.230508f, +-0.0212448f,0.971989f,-0.234063f, +0.226311f,0.969491f,-0.094178f, +0.326176f,0.942844f,-0.068215f, +0.104404f,0.994209f,-0.0254499f, +-0.295807f,0.921372f,-0.252133f, +-0.383855f,0.886842f,-0.257228f, +-0.359597f,0.921141f,-0.148961f, +-0.240318f,0.969399f,-0.0501282f, +-0.0922578f,0.994071f,-0.0575481f, +-0.0797027f,0.995693f,-0.047355f, +-0.026569f,0.999636f,0.00472767f, +0.105393f,0.994402f,0.00758912f, +-0.0968377f,0.99427f,-0.0452707f, +-0.304918f,0.952227f,0.0169656f, +-0.404524f,0.901318f,0.154875f, +-0.513873f,0.850873f,0.109318f, +-0.450348f,0.892744f,-0.0139455f, +-0.274075f,0.961559f,-0.0169546f, +-0.246789f,0.966677f,-0.068048f, +-0.421796f,0.89143f,-0.165651f, +-0.530762f,0.820949f,-0.210556f, +-0.518596f,0.828643f,-0.210734f, +-0.419929f,0.882924f,-0.210013f, +-0.267086f,0.925885f,-0.26721f, +-0.260528f,0.916111f,-0.304739f, +-0.212437f,0.941505f,-0.261606f, +-0.048105f,0.973033f,-0.225594f, +0.0765563f,0.979806f,-0.184712f, +-0.093108f,0.98921f,-0.113109f, +-0.45825f,0.862094f,-0.216335f, +-0.388948f,0.902314f,-0.185873f, +-0.448149f,0.871913f,-0.197307f, +-0.488741f,0.854988f,-0.173574f, +-0.313337f,0.916762f,-0.247724f, +-0.157546f,0.938004f,-0.308753f, +-0.267357f,0.911027f,-0.313926f, +-0.236818f,0.920159f,-0.311809f, +0.000164176f,0.954985f,-0.296656f, +0.271822f,0.944232f,-0.185848f, +0.151331f,0.970946f,-0.185371f, +-0.118147f,0.962507f,-0.244174f, +0.026977f,0.993643f,-0.109301f, +0.00824696f,0.988318f,-0.152184f, +-0.049843f,0.98983f,-0.133236f, +-0.292853f,0.946012f,-0.138915f, +-0.402779f,0.899681f,-0.168355f, +-0.216565f,0.962959f,-0.160656f, +0.0811851f,0.971223f,-0.223909f, +0.376654f,0.888442f,-0.262304f, +0.412611f,0.862287f,-0.293621f, +0.420494f,0.885689f,-0.196825f, +0.303261f,0.948914f,-0.0871512f, +0.0927021f,0.987654f,-0.12628f, +0.131263f,0.975894f,-0.174359f, +0.34789f,0.928255f,-0.131586f, +0.388684f,0.916314f,-0.0964015f, +0.334363f,0.935247f,-0.116251f, +0.500896f,0.857152f,-0.119971f, +0.598542f,0.784881f,-0.160341f, +0.47847f,0.803478f,-0.354245f, +0.40143f,0.813052f,-0.421663f, +0.177917f,0.923323f,-0.340324f, +0.0444056f,0.967329f,-0.249605f, +0.182957f,0.975679f,-0.12074f, +0.298547f,0.954355f,0.00877178f, +0.20958f,0.975318f,-0.0695111f, +0.014388f,0.988042f,-0.153512f, +0.159715f,0.970499f,-0.180618f, +0.22067f,0.966546f,-0.130745f, +0.121564f,0.992499f,-0.0129668f, +-0.106928f,0.989668f,-0.0955226f, +-0.432009f,0.877086f,-0.209972f, +-0.412195f,0.894243f,-0.174429f, +-0.247992f,0.954923f,-0.163162f, +-0.103668f,0.985418f,-0.134925f, +-0.118626f,0.990103f,-0.0749928f, +-0.0679366f,0.995617f,-0.0642786f, +0.157737f,0.986207f,-0.0501565f, +-0.132086f,0.989105f,-0.064997f, +-0.385668f,0.914108f,0.125169f, +-0.489653f,0.859555f,0.146305f, +-0.451033f,0.881762f,0.138074f, +-0.379544f,0.923663f,0.0528468f, +-0.267976f,0.962936f,0.0307148f, +-0.154653f,0.986101f,0.0607174f, +-0.285519f,0.958009f,-0.0264139f, +-0.517333f,0.83498f,-0.187551f, +-0.544673f,0.81339f,-0.204273f, +-0.443255f,0.872475f,-0.205697f, +-0.212541f,0.959106f,-0.18693f, +-0.144834f,0.956217f,-0.254307f, +-0.219765f,0.912031f,-0.346271f, +-0.054698f,0.959311f,-0.277002f, +-0.0226538f,0.964658f,-0.262528f, +-0.09277f,0.980401f,-0.173803f, +-0.427129f,0.87184f,-0.2397f, +-0.458168f,0.877303f,-0.142906f, +-0.456008f,0.884075f,-0.102317f, +-0.457836f,0.873049f,-0.167843f, +-0.276231f,0.922652f,-0.269091f, +-0.0986428f,0.965162f,-0.242345f, +-0.166497f,0.944239f,-0.284061f, +-0.221568f,0.881867f,-0.416194f, +-0.047486f,0.902488f,-0.428089f, +0.159799f,0.906084f,-0.391761f, +0.154437f,0.936571f,-0.314616f, +-0.0388024f,0.943344f,-0.329539f, +0.0179311f,0.971802f,-0.235116f, +-0.0317957f,0.972144f,-0.232219f, +-0.108238f,0.982139f,-0.153906f, +-0.294778f,0.950488f,-0.098378f, +-0.31352f,0.940894f,-0.128155f, +-0.158161f,0.944104f,-0.289226f, +0.136392f,0.925587f,-0.353108f, +0.369725f,0.858345f,-0.355736f, +0.408427f,0.863142f,-0.296941f, +0.264495f,0.934318f,-0.238939f, +0.231394f,0.968992f,-0.0866717f, +0.180537f,0.980662f,-0.0755592f, +0.289728f,0.94884f,-0.125539f, +0.338081f,0.901985f,-0.268559f, +0.344111f,0.905129f,-0.249658f, +0.337921f,0.897299f,-0.284014f, +0.46242f,0.831252f,-0.308526f, +0.625979f,0.756355f,-0.18994f, +0.59942f,0.766009f,-0.232218f, +0.396651f,0.850096f,-0.346416f, +0.113051f,0.922761f,-0.368417f, +-0.0568672f,0.928859f,-0.366041f, +0.0370994f,0.962262f,-0.269583f, +0.21844f,0.959083f,-0.180121f, +0.248457f,0.958661f,-0.138705f, +0.0562715f,0.995806f,-0.072134f, +0.151796f,0.987439f,-0.0438309f, +0.213126f,0.976907f,0.0151789f, +0.0825188f,0.995896f,-0.0371849f, +-0.0293603f,0.995761f,-0.0871655f, +-0.339382f,0.929166f,-0.146528f, +-0.407976f,0.887929f,-0.212458f, +-0.300706f,0.928797f,-0.216592f, +-0.171876f,0.971688f,-0.162117f, +-0.133134f,0.975354f,-0.175954f, +-0.0436112f,0.969589f,-0.240823f, +0.0955252f,0.97277f,-0.211171f, +-0.222971f,0.974797f,-0.00733171f, +-0.502187f,0.842082f,0.19674f, +-0.406382f,0.878535f,0.251057f, +-0.403841f,0.907763f,0.113486f, +-0.295941f,0.954472f,0.0374491f, +-0.309098f,0.948653f,-0.0672074f, +-0.212726f,0.977025f,0.0130525f, +-0.199979f,0.978912f,0.0417118f, +-0.374584f,0.922961f,-0.0884893f, +-0.481248f,0.836641f,-0.261597f, +-0.419239f,0.839768f,-0.345005f, +-0.269419f,0.905569f,-0.327654f, +-0.084614f,0.973021f,-0.214643f, +-0.193736f,0.935164f,-0.296537f, +-0.190273f,0.932167f,-0.307995f, +-0.0917672f,0.986648f,-0.134552f, +-0.101923f,0.994749f,0.009248f, +-0.329353f,0.943234f,-0.0428565f, +-0.527408f,0.832391f,-0.170191f, +-0.427451f,0.895563f,-0.123505f, +-0.337252f,0.917187f,-0.212202f, +-0.254472f,0.911026f,-0.324462f, +-0.191138f,0.941948f,-0.276043f, +-0.0895186f,0.969134f,-0.229708f, +-0.115141f,0.935532f,-0.33395f, +-0.0316994f,0.925937f,-0.376346f, +0.117945f,0.920189f,-0.373285f, +0.121803f,0.934924f,-0.333287f, +-0.0046923f,0.925271f,-0.379279f, +0.0524128f,0.95708f,-0.285046f, +-0.0476851f,0.956392f,-0.288167f, +-0.185718f,0.956668f,-0.224263f, +-0.292875f,0.939689f,-0.176661f, +-0.212138f,0.937073f,-0.277295f, +0.00215598f,0.9095f,-0.415698f, +0.155074f,0.855231f,-0.494501f, +0.3372f,0.836708f,-0.431528f, +0.272726f,0.886233f,-0.374449f, +0.193484f,0.944931f,-0.263949f, +0.192169f,0.938969f,-0.285322f, +0.141281f,0.932743f,-0.331708f, +0.278032f,0.931044f,-0.236339f, +0.426985f,0.871432f,-0.241434f, +0.368362f,0.861689f,-0.349f, +0.400587f,0.825418f,-0.397762f, +0.451323f,0.785144f,-0.424095f, +0.523643f,0.765884f,-0.373121f, +0.603289f,0.753586f,-0.261056f, +0.44978f,0.832328f,-0.323928f, +0.156509f,0.915232f,-0.371289f, +-0.0704135f,0.915939f,-0.395092f, +-0.00319557f,0.926331f,-0.376696f, +0.166676f,0.911893f,-0.37506f, +0.102989f,0.962696f,-0.250219f, +-0.0387958f,0.995347f,-0.0881961f, +0.0653507f,0.992864f,-0.0997527f, +0.179449f,0.98367f,-0.0138117f, +0.177828f,0.983985f,0.012264f, +0.0645076f,0.995168f,-0.0740203f, +-0.292502f,0.938695f,-0.182468f, +-0.400433f,0.889464f,-0.220243f, +-0.318802f,0.923541f,-0.213161f, +-0.169897f,0.961934f,-0.214052f, +-0.0267051f,0.972116f,-0.232975f, +-0.00536052f,0.964395f,-0.264412f, +-0.100769f,0.988596f,-0.111905f, +-0.404303f,0.910751f,0.0840968f, +-0.594207f,0.803932f,0.0247338f, +-0.396136f,0.914658f,0.0804795f, +-0.304433f,0.952514f,0.00620435f, +-0.201276f,0.977901f,-0.0565476f, +-0.264949f,0.959844f,-0.0922019f, +-0.227773f,0.971084f,-0.0715179f, +-0.172114f,0.969698f,-0.173387f, +-0.26936f,0.945102f,-0.185006f, +-0.392685f,0.904465f,-0.166556f, +-0.407044f,0.896103f,-0.176958f, +-0.40747f,0.889993f,-0.204647f, +-0.189782f,0.978511f,-0.0806113f, +-0.0480587f,0.996223f,-0.0723184f, +-0.217275f,0.958525f,-0.184451f, +-0.306094f,0.944116f,-0.122276f, +-0.254593f,0.966558f,0.0308049f, +-0.20196f,0.972664f,0.114613f, +-0.409794f,0.899925f,-0.14901f, +-0.415034f,0.857771f,-0.303274f, +-0.263165f,0.89665f,-0.356039f, +-0.215387f,0.884962f,-0.412857f, +-0.225079f,0.887943f,-0.401119f, +-0.0773061f,0.916142f,-0.393328f, +-0.0308036f,0.905486f,-0.423257f, +-0.0371917f,0.883129f,-0.467653f, +0.0716369f,0.893813f,-0.442681f, +0.12997f,0.919319f,-0.371429f, +0.119867f,0.921216f,-0.370126f, +0.0228827f,0.984493f,-0.173923f, +-0.0834452f,0.988816f,-0.123614f, +-0.247718f,0.964917f,-0.0870125f, +-0.254118f,0.961997f,-0.0999321f, +-0.0671834f,0.977202f,-0.201403f, +0.157483f,0.940773f,-0.300243f, +0.164503f,0.92764f,-0.335294f, +0.27582f,0.929794f,-0.243733f, +0.209142f,0.946949f,-0.244024f, +0.183638f,0.949161f,-0.255677f, +0.277174f,0.906106f,-0.319605f, +0.178788f,0.896597f,-0.405153f, +0.185529f,0.860132f,-0.475134f, +0.438868f,0.800307f,-0.408538f, +0.441024f,0.788796f,-0.428135f, +0.397261f,0.791714f,-0.464083f, +0.440809f,0.77176f,-0.458338f, +0.455755f,0.768172f,-0.449666f, +0.535299f,0.762932f,-0.362477f, +0.450448f,0.842352f,-0.295872f, +0.136515f,0.937333f,-0.320579f, +-0.0637901f,0.937145f,-0.343061f, +-0.0112309f,0.935306f,-0.353662f, +0.108413f,0.948157f,-0.298738f, +-0.0660356f,0.972239f,-0.224477f, +-0.07256f,0.985988f,-0.150208f, +0.0814078f,0.980504f,-0.178842f, +0.133209f,0.989139f,-0.0621265f, +0.112681f,0.993117f,-0.0319677f, +0.144875f,0.987157f,0.0673239f, +-0.178705f,0.983714f,-0.0192655f, +-0.383305f,0.919432f,-0.0878717f, +-0.311703f,0.944518f,-0.103569f, +-0.170547f,0.974222f,-0.147663f, +-0.0584686f,0.987712f,-0.144938f, +-0.130239f,0.988008f,-0.0829397f, +-0.30957f,0.949755f,0.0461837f, +-0.426068f,0.896859f,0.118784f, +-0.505712f,0.862298f,-0.0263905f, +-0.384432f,0.913927f,-0.130189f, +-0.233817f,0.957708f,-0.167708f, +-0.196686f,0.961804f,-0.190386f, +-0.272431f,0.94059f,-0.202662f, +-0.180772f,0.950727f,-0.251872f, +-0.0565853f,0.956064f,-0.287647f, +-0.288561f,0.926858f,-0.240141f, +-0.491099f,0.856076f,-0.161104f, +-0.419638f,0.904096f,-0.0807095f, +-0.388583f,0.916169f,-0.0981701f, +-0.261262f,0.961028f,-0.0903754f, +-0.0632456f,0.997064f,0.0431658f, +-0.169715f,0.97859f,0.116442f, +-0.344027f,0.938297f,0.0352825f, +-0.314669f,0.949192f,0.00417096f, +-0.192981f,0.980434f,0.0388389f, +-0.184602f,0.98279f,-0.00683269f, +-0.246496f,0.934378f,-0.25725f, +-0.19921f,0.861846f,-0.466409f, +-0.140436f,0.848535f,-0.510163f, +-0.20288f,0.807079f,-0.554493f, +-0.11519f,0.832336f,-0.542169f, +0.00924053f,0.875455f,-0.483211f, +-0.00888073f,0.876341f,-0.48161f, +0.00107193f,0.907613f,-0.419807f, +0.021101f,0.930448f,-0.365817f, +0.0745313f,0.948396f,-0.308205f, +-0.200438f,0.964136f,-0.17397f, +-0.166231f,0.985214f,-0.0414839f, +-0.252324f,0.967639f,-0.00281073f, +-0.16447f,0.986195f,-0.0192238f, +0.0101706f,0.983613f,-0.180006f, +0.16229f,0.966979f,-0.196502f, +0.152128f,0.981833f,-0.113406f, +0.194455f,0.973444f,-0.120809f, +0.334057f,0.938492f,-0.0874058f, +0.243016f,0.928299f,-0.281434f, +0.337071f,0.885295f,-0.320369f, +0.298461f,0.876938f,-0.376698f, +0.311828f,0.819683f,-0.480502f, +0.369257f,0.755567f,-0.54108f, +0.401798f,0.784012f,-0.473163f, +0.404891f,0.784738f,-0.469309f, +0.444437f,0.782155f,-0.436702f, +0.466084f,0.794919f,-0.388419f, +0.447341f,0.805216f,-0.389247f, +0.362297f,0.887389f,-0.285098f, +0.179937f,0.962799f,-0.201595f, +0.000795301f,0.958246f,-0.285946f, +-0.0439986f,0.938528f,-0.342389f, +0.000314903f,0.959745f,-0.280871f, +-0.0200826f,0.975564f,-0.218794f, +-0.0669112f,0.936012f,-0.345551f, +0.0051897f,0.948012f,-0.318192f, +0.0134178f,0.970832f,-0.239387f, +0.036317f,0.978504f,-0.203005f, +0.0625457f,0.996542f,-0.0547064f, +-0.151505f,0.986626f,0.0601296f, +-0.354535f,0.929709f,0.0997293f, +-0.323458f,0.940866f,0.100727f, +-0.112965f,0.981029f,0.157548f, +-0.108156f,0.989168f,0.0992381f, +-0.141093f,0.979303f,0.145114f, +-0.335564f,0.940028f,0.061184f, +-0.404784f,0.910739f,0.081883f, +-0.415621f,0.909054f,0.0296628f, +-0.326024f,0.941449f,-0.0859172f, +-0.204455f,0.961807f,-0.182004f, +-0.198427f,0.946732f,-0.253624f, +-0.160629f,0.949f,-0.27129f, +-0.122223f,0.918206f,-0.376775f, +-0.161284f,0.939678f,-0.301651f, +-0.374966f,0.911783f,-0.167489f, +-0.467696f,0.856498f,-0.218336f, +-0.443475f,0.843003f,-0.304427f, +-0.385194f,0.898165f,-0.211955f, +-0.377418f,0.917998f,-0.121804f, +-0.264639f,0.962925f,0.0523651f, +-0.211739f,0.961017f,0.177801f, +-0.229995f,0.957255f,0.175401f, +-0.280377f,0.956102f,0.0851875f, +-0.20016f,0.97825f,0.0544282f, +-0.10573f,0.994257f,-0.0165441f, +0.0203896f,0.991211f,-0.130708f, +-0.0236073f,0.94884f,-0.314873f, +-0.0941765f,0.92043f,-0.379394f, +-0.167941f,0.897458f,-0.407879f, +-0.187085f,0.877031f,-0.442511f, +-0.0729267f,0.89358f,-0.44294f, +-0.0781669f,0.903365f,-0.421688f, +-0.0898224f,0.927661f,-0.362461f, +-0.0306254f,0.944826f,-0.326139f, +0.00767666f,0.952077f,-0.305762f, +-0.288656f,0.939633f,-0.183761f, +-0.235623f,0.952993f,-0.190489f, +-0.273085f,0.931861f,-0.238874f, +-0.0949222f,0.974332f,-0.204123f, +0.149266f,0.955245f,-0.255397f, +0.0666117f,0.957576f,-0.280376f, +0.127398f,0.979355f,-0.156952f, +0.209457f,0.954497f,-0.21228f, +0.367092f,0.913409f,-0.175864f, +0.415953f,0.865553f,-0.278928f, +0.34245f,0.832959f,-0.434635f, +0.340781f,0.830404f,-0.440793f, +0.395293f,0.802521f,-0.446882f, +0.405952f,0.792834f,-0.454552f, +0.385024f,0.788348f,-0.479858f, +0.365166f,0.783008f,-0.503539f, +0.371074f,0.838688f,-0.39863f, +0.42233f,0.859897f,-0.286732f, +0.440629f,0.882917f,-0.162183f, +0.299827f,0.949298f,-0.0945333f, +0.141695f,0.979344f,-0.144247f, +0.039666f,0.992248f,-0.117771f, +0.021245f,0.997585f,-0.0661304f, +-0.0594041f,0.983411f,-0.17139f, +0.0611812f,0.981318f,-0.182404f, +0.0186916f,0.932529f,-0.360611f, +-0.0300853f,0.91754f,-0.396504f, +-0.00135599f,0.922081f,-0.386995f, +-0.0351954f,0.956784f,-0.28866f, +-0.108108f,0.976189f,-0.188065f, +-0.279221f,0.950183f,-0.13852f, +-0.398641f,0.914814f,-0.0648175f, +-0.383626f,0.922668f,-0.0389249f, +-0.188191f,0.977628f,0.0939533f, +-0.083441f,0.973103f,0.21473f, +-0.0631642f,0.980575f,0.185698f, +-0.269017f,0.963031f,0.0141438f, +-0.4376f,0.89917f,-0.000301879f, +-0.339736f,0.940513f,0.00384959f, +-0.235638f,0.967987f,-0.0864624f, +-0.0773761f,0.988655f,-0.128744f, +-0.0852549f,0.968269f,-0.234917f, +-0.114948f,0.939941f,-0.3214f, +-0.156571f,0.928217f,-0.337488f, +-0.29563f,0.924155f,-0.241951f, +-0.401682f,0.899225f,-0.173337f, +-0.351799f,0.915761f,-0.193956f, +-0.391021f,0.882077f,-0.262761f, +-0.525453f,0.810665f,-0.258305f, +-0.504092f,0.859496f,-0.0846014f, +-0.362403f,0.931317f,0.0362275f, +-0.27912f,0.954258f,0.107159f, +-0.207619f,0.961802f,0.178414f, +-0.228638f,0.970139f,0.0809669f, +-0.12077f,0.992669f,0.00484841f, +0.0304882f,0.99448f,-0.100401f, +0.0674392f,0.979801f,-0.18826f, +0.0351304f,0.9953f,-0.090241f, +-0.0704736f,0.995263f,-0.0669708f, +-0.129706f,0.981562f,-0.1404f, +-0.122442f,0.956888f,-0.263387f, +-0.0356665f,0.922731f,-0.38379f, +-0.0454106f,0.896226f,-0.441267f, +-0.0870705f,0.865568f,-0.493164f, +-0.0312927f,0.854755f,-0.518087f, +-0.0110302f,0.85359f,-0.520829f, +-0.135251f,0.990349f,0.0302781f, +-0.120846f,0.991438f,-0.049458f, +-0.156404f,0.974115f,-0.163209f, +-0.121903f,0.951948f,-0.280952f, +0.0966131f,0.959924f,-0.263082f, +0.0624341f,0.96714f,-0.24646f, +0.0557469f,0.94749f,-0.31489f, +0.245712f,0.928812f,-0.27737f, +0.339947f,0.895451f,-0.28741f, +0.505833f,0.828917f,-0.238808f, +0.492153f,0.815708f,-0.303985f, +0.325713f,0.824266f,-0.463138f, +0.357884f,0.8174f,-0.451416f, +0.423911f,0.828952f,-0.364879f, +0.465983f,0.818349f,-0.3364f, +0.340136f,0.856815f,-0.387524f, +0.250037f,0.902839f,-0.349804f, +0.270063f,0.93551f,-0.227788f, +0.268197f,0.961943f,0.0523086f, +0.314452f,0.921737f,0.226982f, +0.230483f,0.962611f,0.142328f, +-0.0337231f,0.996519f,0.0762456f, +-0.0478467f,0.987694f,0.1489f, +0.0777224f,0.977564f,0.195776f, +0.137813f,0.987309f,0.0789204f, +0.213773f,0.976881f,-0.00209812f, +0.0678985f,0.982243f,-0.174896f, +-0.118448f,0.956882f,-0.26523f, +-0.229961f,0.9707f,-0.0697049f, +-0.144208f,0.98561f,0.0881926f, +-0.198479f,0.979386f,0.0375393f, +-0.401292f,0.909987f,-0.104347f, +-0.400254f,0.91005f,-0.107726f, +-0.346067f,0.932825f,-0.100374f, +-0.193125f,0.981161f,0.00517742f, +-0.0334943f,0.995589f,0.0876359f, +-0.09901f,0.987334f,0.12397f, +-0.411919f,0.909058f,-0.0627387f, +-0.33988f,0.934279f,-0.107727f, +-0.163445f,0.980417f,-0.109859f, +-0.094399f,0.976137f,-0.195566f, +-0.0281723f,0.98965f,-0.140708f, +-0.0765865f,0.985816f,-0.149338f, +-0.168645f,0.974838f,-0.145776f, +-0.316363f,0.934327f,-0.164156f, +-0.429172f,0.879196f,-0.206943f, +-0.428946f,0.898522f,-0.0930795f, +-0.397223f,0.909843f,0.12f, +-0.511164f,0.850782f,0.12199f, +-0.553545f,0.831305f,-0.0501975f, +-0.425265f,0.901367f,-0.0817687f, +-0.377377f,0.925701f,-0.0257517f, +-0.226427f,0.969468f,0.0941363f, +-0.0709665f,0.993431f,0.0897693f, +-0.0343935f,0.997803f,-0.0566276f, +0.136725f,0.981098f,-0.136942f, +-0.000388307f,0.974615f,-0.223888f, +-0.143125f,0.988947f,-0.0387096f, +-0.0654844f,0.993475f,0.0933713f, +0.0107967f,0.999865f,0.0124207f, +0.0463655f,0.990074f,-0.132676f, +0.111072f,0.958636f,-0.262069f, +0.052211f,0.918497f,-0.391967f, +0.014765f,0.869476f,-0.493754f, +-0.00446669f,0.826302f,-0.56321f, +-0.00312167f,0.829643f,-0.558286f, +-0.205328f,0.971118f,-0.121531f, +-0.107279f,0.990692f,-0.0837913f, +-0.0655817f,0.993795f,-0.089834f, +-0.0669083f,0.985851f,-0.15369f, +0.0877486f,0.98832f,-0.124596f, +0.169572f,0.978484f,-0.117533f, +0.160152f,0.950603f,-0.265903f, +0.208233f,0.926f,-0.314903f, +0.349792f,0.904675f,-0.243329f, +0.449891f,0.870303f,-0.200426f, +0.566229f,0.816333f,-0.113956f, +0.48817f,0.833849f,-0.257655f, +0.363235f,0.831342f,-0.420631f, +0.324206f,0.826771f,-0.459718f, +0.3997f,0.840833f,-0.365021f, +0.353025f,0.906211f,-0.232714f, +0.219616f,0.962891f,-0.156874f, +0.0720827f,0.994934f,-0.0700696f, +0.045678f,0.994046f,0.0989266f, +0.213575f,0.964796f,0.153475f, +0.24905f,0.930442f,0.268798f, +0.0777133f,0.945053f,0.317546f, +-0.128028f,0.977296f,0.168824f, +0.0217263f,0.951068f,0.308215f, +0.207313f,0.918764f,0.335998f, +0.282654f,0.924456f,0.255906f, +0.201157f,0.96204f,0.184429f, +-0.110233f,0.981395f,0.157205f, +-0.355659f,0.909169f,0.216606f, +-0.21295f,0.947904f,0.236917f, +-0.107393f,0.959263f,0.261306f, +-0.278087f,0.947596f,0.157257f, +-0.393558f,0.918794f,0.0304824f, +-0.302068f,0.952957f,-0.0250724f, +-0.213276f,0.970666f,-0.110997f, +-0.166999f,0.978773f,-0.118807f, +-0.142246f,0.989828f,0.00258048f, +-0.283745f,0.958854f,0.0093455f, +-0.336957f,0.941016f,-0.0308147f, +-0.113565f,0.9931f,-0.02925f, +-0.0231129f,0.991621f,-0.127093f, +-0.107284f,0.981887f,-0.156166f, +-0.121783f,0.990389f,-0.0655664f, +-0.179469f,0.983757f,0.00373427f, +-0.267261f,0.963295f,0.0251965f, +-0.419417f,0.907445f,0.0251735f, +-0.582729f,0.80835f,0.0836507f, +-0.554692f,0.78035f,0.288741f, +-0.368624f,0.840437f,0.397218f, +-0.336016f,0.929619f,0.151335f, +-0.379048f,0.912637f,-0.153022f, +-0.410461f,0.89244f,-0.187275f, +-0.310698f,0.938768f,-0.148932f, +-0.0772428f,0.993562f,-0.0828798f, +0.0559112f,0.996518f,-0.0618564f, +0.218481f,0.971621f,-0.090653f, +0.0070055f,0.988587f,-0.150488f, +-0.287385f,0.949521f,-0.125778f, +-0.0963797f,0.992515f,-0.0749989f, +0.0940601f,0.994076f,-0.0544632f, +0.147534f,0.985277f,-0.0863886f, +0.20617f,0.964455f,-0.165287f, +0.228919f,0.941159f,-0.248628f, +0.142687f,0.889558f,-0.433967f, +0.0525074f,0.86193f,-0.5043f, +-0.0400559f,0.852931f,-0.520485f, +-0.12929f,0.965503f,-0.226025f, +-0.12119f,0.954637f,-0.271994f, +-0.0677494f,0.970158f,-0.232815f, +-0.0658176f,0.978188f,-0.197017f, +0.00868199f,0.985201f,-0.171183f, +0.183883f,0.977449f,-0.103828f, +0.283397f,0.948052f,-0.144513f, +0.244002f,0.935244f,-0.256481f, +0.251457f,0.918413f,-0.305429f, +0.421894f,0.885288f,-0.195626f, +0.539016f,0.82675f,-0.161076f, +0.595125f,0.795068f,-0.117014f, +0.542945f,0.81823f,-0.188971f, +0.36087f,0.878337f,-0.313523f, +0.249934f,0.94591f,-0.206849f, +0.203095f,0.978645f,0.0317209f, +0.0808087f,0.992314f,0.0937131f, +0.015528f,0.990219f,0.138653f, +0.01799f,0.994881f,0.09944f, +0.195411f,0.975412f,0.101915f, +0.0694818f,0.977162f,0.200816f, +0.0667035f,0.917371f,0.392404f, +-0.00815505f,0.942331f,0.334582f, +-0.124548f,0.965608f,0.228228f, +0.172601f,0.943034f,0.284421f, +0.392995f,0.877789f,0.273937f, +0.148864f,0.962548f,0.226586f, +-0.160978f,0.90924f,0.383887f, +-0.338041f,0.865118f,0.370538f, +-0.158685f,0.913484f,0.374654f, +-0.085827f,0.934088f,0.346573f, +-0.160284f,0.956319f,0.244467f, +-0.286424f,0.955431f,0.0715057f, +-0.239888f,0.970684f,0.0150701f, +-0.160609f,0.986985f,0.00807186f, +-0.109896f,0.993313f,-0.0353894f, +-0.197211f,0.969041f,-0.148551f, +-0.329877f,0.939761f,-0.0896172f, +-0.308832f,0.948199f,-0.0744408f, +-0.098416f,0.980296f,-0.171271f, +0.0274733f,0.990192f,-0.136989f, +-0.0841565f,0.99088f,-0.105235f, +-0.256459f,0.960709f,-0.106143f, +-0.249667f,0.95978f,0.128406f, +-0.305999f,0.931391f,0.197168f, +-0.484241f,0.852569f,0.196565f, +-0.610379f,0.753144f,0.245383f, +-0.585787f,0.783089f,0.208867f, +-0.367515f,0.91758f,0.151588f, +-0.0411995f,0.989239f,0.140389f, +-0.109078f,0.987353f,-0.115051f, +-0.380949f,0.866858f,-0.321615f, +-0.342318f,0.88779f,-0.307647f, +-0.12792f,0.955198f,-0.266896f, +0.0278952f,0.967981f,-0.249469f, +0.188442f,0.9544f,-0.231539f, +0.052008f,0.978364f,-0.200246f, +-0.225418f,0.931417f,-0.285742f, +-0.134566f,0.926089f,-0.352493f, +0.0345745f,0.959769f,-0.278653f, +0.174695f,0.953806f,-0.24441f, +0.227273f,0.930386f,-0.287627f, +0.325716f,0.918321f,-0.224934f, +0.329407f,0.888239f,-0.32019f, +0.0905336f,0.875389f,-0.474867f, +-0.0331275f,0.86706f,-0.497102f, +0.0288126f,0.978255f,-0.205394f, +-0.0838329f,0.954569f,-0.285956f, +-0.140323f,0.954698f,-0.262415f, +-0.112432f,0.972197f,-0.205408f, +0.0092799f,0.981035f,-0.193608f, +0.142017f,0.962963f,-0.229203f, +0.310781f,0.933484f,-0.17895f, +0.359578f,0.919553f,-0.158514f, +0.334745f,0.907674f,-0.253129f, +0.345814f,0.873436f,-0.342815f, +0.500723f,0.821828f,-0.271799f, +0.538977f,0.812424f,-0.22242f, +0.523422f,0.839245f,-0.147303f, +0.340441f,0.940266f,0.000412888f, +0.0152874f,0.997305f,0.0717554f, +0.0533145f,0.966764f,0.250049f, +0.112464f,0.954457f,0.276338f, +0.109039f,0.955163f,0.275271f, +0.0445431f,0.979533f,0.196291f, +0.165433f,0.962373f,0.21557f, +-0.0715535f,0.977821f,0.196841f, +-0.0891149f,0.939351f,0.331178f, +0.117094f,0.910023f,0.397676f, +0.030807f,0.968216f,0.248212f, +0.157233f,0.982334f,0.101481f, +0.403254f,0.903723f,0.143774f, +0.0482774f,0.97679f,0.208689f, +-0.297552f,0.88274f,0.363639f, +-0.30014f,0.861944f,0.408619f, +-0.211374f,0.886111f,0.412466f, +-0.03076f,0.854928f,0.517834f, +0.0282722f,0.878122f,0.477601f, +-0.13332f,0.93673f,0.32367f, +-0.256519f,0.940042f,0.224764f, +-0.183801f,0.953616f,0.238397f, +-0.0194462f,0.968434f,0.24851f, +-0.0907191f,0.988269f,0.122863f, +-0.322189f,0.946234f,-0.028899f, +-0.20601f,0.965456f,-0.159543f, +-0.0654489f,0.973414f,-0.219504f, +-0.113732f,0.990052f,-0.0828341f, +-0.135223f,0.986029f,0.0972711f, +-0.295266f,0.944373f,0.144834f, +-0.450404f,0.860579f,0.237781f, +-0.30004f,0.881766f,0.363958f, +-0.429075f,0.860577f,0.274411f, +-0.624789f,0.771784f,0.118272f, +-0.497638f,0.864372f,0.0722275f, +-0.313601f,0.946808f,-0.0721819f, +-0.057809f,0.993544f,-0.0976184f, +0.13458f,0.987765f,-0.078798f, +-0.184662f,0.92514f,-0.331688f, +-0.385787f,0.812528f,-0.436996f, +-0.187957f,0.911737f,-0.36525f, +0.0316981f,0.954599f,-0.296202f, +0.147926f,0.956328f,-0.252101f, +0.104858f,0.974711f,-0.197342f, +-0.0836115f,0.931387f,-0.354298f, +-0.111379f,0.87594f,-0.469386f, +-0.0328315f,0.880204f,-0.473458f, +0.162025f,0.887756f,-0.430856f, +0.205253f,0.903446f,-0.376373f, +0.237481f,0.902569f,-0.359125f, +0.385116f,0.876359f,-0.289276f, +0.249914f,0.920198f,-0.301294f, +0.0143883f,0.906805f,-0.421304f, +0.1198f,0.98226f,-0.14427f, +-0.009516f,0.980934f,-0.194106f, +-0.149357f,0.951394f,-0.269335f, +-0.133007f,0.936454f,-0.324597f, +0.034566f,0.948692f,-0.314306f, +0.178184f,0.929444f,-0.323086f, +0.219637f,0.922638f,-0.317015f, +0.296463f,0.935411f,-0.192652f, +0.416664f,0.902617f,-0.108048f, +0.442812f,0.876638f,-0.188209f, +0.465688f,0.849444f,-0.248152f, +0.511879f,0.84424f,-0.158868f, +0.360617f,0.931627f,-0.0450278f, +0.228988f,0.955033f,0.188354f, +-0.00280316f,0.974776f,0.223168f, +0.00899431f,0.980078f,0.198407f, +0.0845579f,0.975657f,0.202347f, +0.0600237f,0.962271f,0.265389f, +0.0344627f,0.950379f,0.309181f, +0.173636f,0.921696f,0.346881f, +-0.00190385f,0.960894f,0.276909f, +-0.186383f,0.97431f,0.126416f, +0.101162f,0.98048f,0.168596f, +0.181976f,0.961147f,0.207559f, +0.220019f,0.957024f,0.188939f, +0.310192f,0.917199f,0.250053f, +-0.02225f,0.932984f,0.359229f, +-0.395015f,0.837639f,0.377259f, +-0.325443f,0.861588f,0.389554f, +-0.255559f,0.880464f,0.39934f, +-0.151471f,0.886274f,0.437693f, +-0.0211154f,0.863177f,0.50446f, +0.00094362f,0.808505f,0.588488f, +-0.114242f,0.850647f,0.513176f, +-0.11027f,0.888828f,0.444776f, +-0.0310984f,0.926772f,0.374335f, +0.036991f,0.899416f,0.435525f, +-0.0593828f,0.941327f,0.33223f, +-0.108182f,0.990534f,0.0844942f, +-0.153469f,0.985899f,0.066708f, +-0.257292f,0.956946f,0.134368f, +-0.339432f,0.926138f,0.164482f, +-0.361227f,0.853531f,0.3755f, +-0.433268f,0.811828f,0.391425f, +-0.292152f,0.883075f,0.367186f, +-0.254971f,0.931997f,0.257627f, +-0.51111f,0.857028f,-0.0653379f, +-0.482419f,0.859823f,-0.167263f, +-0.240122f,0.964988f,-0.105544f, +-0.0637549f,0.987476f,-0.144314f, +0.14266f,0.980144f,-0.137714f, +0.096896f,0.982614f,-0.158371f, +-0.287298f,0.856944f,-0.42791f, +-0.299829f,0.819408f,-0.488542f, +-0.0881013f,0.911449f,-0.40187f, +0.0509938f,0.949808f,-0.308649f, +0.13334f,0.962273f,-0.237174f, +0.0865622f,0.946427f,-0.311099f, +0.0118172f,0.924665f,-0.380599f, +-0.0178448f,0.910652f,-0.412789f, +0.073892f,0.906856f,-0.414913f, +0.15114f,0.90612f,-0.395099f, +0.255577f,0.878518f,-0.403593f, +0.278013f,0.865146f,-0.417411f, +0.239832f,0.923443f,-0.299555f, +0.188412f,0.940744f,-0.281961f, +-0.0158305f,0.982567f,-0.185231f, +0.0666038f,0.988337f,-0.136945f, +-0.0538402f,0.959334f,-0.277092f, +-0.0212127f,0.945816f,-0.324009f, +-0.0150833f,0.913689f,-0.406133f, +0.15601f,0.93774f,-0.310331f, +0.182702f,0.936618f,-0.298942f, +0.189924f,0.93758f,-0.29133f, +0.333869f,0.91329f,-0.233307f, +0.499532f,0.857573f,-0.122619f, +0.46551f,0.873216f,-0.144201f, +0.373694f,0.926999f,0.0320189f, +0.203779f,0.950539f,0.234414f, +0.13831f,0.928366f,0.344974f, +0.0515931f,0.949665f,0.30899f, +0.0310079f,0.96445f,0.262439f, +0.0853119f,0.968829f,0.232577f, +-0.00103764f,0.981733f,0.190261f, +-0.00365072f,0.967667f,0.252206f, +0.10066f,0.945677f,0.309134f, +0.178572f,0.914026f,0.364237f, +-0.0213985f,0.991455f,0.128684f, +0.0498313f,0.996519f,0.0668339f, +0.120586f,0.983203f,0.137006f, +0.0910496f,0.981472f,0.16859f, +0.13401f,0.919805f,0.368783f, +-0.0801133f,0.861028f,0.502208f, +-0.337717f,0.841946f,0.420801f, +-0.27627f,0.878916f,0.388821f, +-0.2301f,0.91025f,0.344237f, +-0.177792f,0.940411f,0.289857f, +-0.131507f,0.928729f,0.346652f, +-0.0961971f,0.892019f,0.441642f, +-0.0639687f,0.872394f,0.4846f, +-0.0102449f,0.879124f,0.476482f, +-0.00257342f,0.917704f,0.397258f, +-0.0554909f,0.910659f,0.409416f, +0.0291401f,0.896118f,0.442858f, +0.0220451f,0.91331f,0.406668f, +-0.138595f,0.921526f,0.362741f, +-0.186305f,0.924786f,0.331755f, +-0.347011f,0.903153f,0.25278f, +-0.513046f,0.817508f,0.261656f, +-0.445268f,0.835978f,0.320745f, +-0.177443f,0.933005f,0.313074f, +-0.0397144f,0.982015f,0.184579f, +-0.223543f,0.974128f,-0.0332155f, +-0.4666f,0.831165f,-0.302406f, +-0.335541f,0.890675f,-0.306773f, +-0.0318096f,0.973987f,-0.224358f, +0.0953506f,0.970682f,-0.220646f, +0.134482f,0.984534f,-0.112281f, +-0.0162953f,0.992479f,-0.121323f, +-0.284204f,0.902721f,-0.322992f, +-0.211997f,0.906314f,-0.365585f, +-0.016875f,0.958349f,-0.285101f, +0.129044f,0.959618f,-0.24996f, +0.151996f,0.928771f,-0.338057f, +-0.0199776f,0.904327f,-0.426372f, +-0.0559071f,0.940256f,-0.335846f, +0.108952f,0.945546f,-0.306712f, +0.215589f,0.905767f,-0.364838f, +0.293281f,0.878158f,-0.377921f, +0.279356f,0.877367f,-0.390112f, +0.127912f,0.886694f,-0.444312f, +0.153161f,0.902051f,-0.403541f, +-0.0890667f,0.969622f,-0.227816f, +0.0791521f,0.98141f,-0.174841f, +0.0791423f,0.971591f,-0.22304f, +0.0168825f,0.939671f,-0.341662f, +-0.00465273f,0.922224f,-0.386629f, +0.0341103f,0.949158f,-0.312946f, +0.243022f,0.94331f,-0.226069f, +0.218985f,0.910646f,-0.350386f, +0.282576f,0.88974f,-0.358487f, +0.398347f,0.877162f,-0.268155f, +0.330147f,0.941044f,-0.073754f, +0.178397f,0.970659f,0.16123f, +0.0525065f,0.954596f,0.293241f, +0.0945297f,0.914894f,0.392472f, +0.13661f,0.905749f,0.401193f, +0.0406243f,0.947359f,0.317587f, +0.163762f,0.925717f,0.340926f, +0.040504f,0.970394f,0.238108f, +-0.0543453f,0.975142f,0.214812f, +2.68223e-005f,0.976435f,0.215812f, +0.209407f,0.932778f,0.293383f, +0.184464f,0.966229f,0.179928f, +-0.0113387f,0.999016f,0.0428878f, +0.079177f,0.981677f,0.173323f, +0.0362262f,0.968187f,0.24759f, +-0.0723427f,0.93572f,0.345245f, +-0.135834f,0.890086f,0.435082f, +-0.264248f,0.873681f,0.408479f, +-0.262216f,0.89706f,0.355706f, +-0.164052f,0.919196f,0.358002f, +-0.167176f,0.924403f,0.342829f, +-0.200682f,0.904947f,0.375229f, +-0.158624f,0.899685f,0.406701f, +-0.112022f,0.891533f,0.438886f, +-0.00921475f,0.869473f,0.493894f, +0.0802624f,0.881225f,0.465833f, +-0.0504548f,0.922517f,0.382645f, +-0.0121989f,0.918687f,0.394797f, +0.0440736f,0.891185f,0.451494f, +-0.0756766f,0.900734f,0.427728f, +-0.202037f,0.909488f,0.363335f, +-0.295423f,0.866009f,0.403428f, +-0.471319f,0.827048f,0.30635f, +-0.443758f,0.874939f,0.193806f, +-0.125026f,0.977756f,0.168412f, +0.0442668f,0.987172f,0.153403f, +-0.0338798f,0.987768f,0.152205f, +-0.259589f,0.965039f,-0.0362462f, +-0.35784f,0.903258f,-0.236805f, +-0.167942f,0.956248f,-0.239554f, +0.0460995f,0.994911f,-0.0895878f, +-0.00166787f,0.99811f,-0.0614342f, +-0.0336402f,0.998923f,0.0319432f, +-0.139942f,0.989786f,0.0271849f, +-0.21913f,0.971861f,-0.0864193f, +-0.083914f,0.990307f,-0.110685f, +0.180721f,0.971397f,-0.154041f, +0.29639f,0.913592f,-0.278393f, +0.0452233f,0.94418f,-0.326312f, +-0.13463f,0.924181f,-0.357441f, +0.11753f,0.929423f,-0.349798f, +0.238754f,0.909243f,-0.340989f, +0.272577f,0.899491f,-0.341494f, +0.343945f,0.879082f,-0.330025f, +0.202726f,0.889055f,-0.410468f, +0.0880936f,0.876474f,-0.473321f, +-0.000386659f,0.989518f,-0.144407f, +-0.0138532f,0.983228f,-0.181856f, +0.165824f,0.98552f,-0.0353913f, +0.196669f,0.963831f,-0.179867f, +0.00115533f,0.93443f,-0.356144f, +-0.0579019f,0.928374f,-0.36711f, +0.234096f,0.913194f,-0.333581f, +0.311749f,0.881031f,-0.355805f, +0.243154f,0.902483f,-0.355529f, +0.214274f,0.956658f,-0.197209f, +0.120355f,0.990537f,0.0659672f, +0.0219689f,0.979298f,0.201227f, +-0.0108785f,0.963809f,0.266373f, +-0.016985f,0.957116f,0.289205f, +0.15437f,0.922679f,0.353316f, +0.0959731f,0.93811f,0.332776f, +0.138832f,0.935317f,0.325434f, +0.133758f,0.941295f,0.309956f, +-0.00148525f,0.972503f,0.232885f, +0.00817406f,0.979885f,0.199396f, +0.180862f,0.960033f,0.213602f, +0.330054f,0.924212f,0.192085f, +0.039978f,0.994865f,0.0929833f, +-0.118088f,0.976595f,0.179768f, +-0.100092f,0.923425f,0.370498f, +-0.117559f,0.88568f,0.449166f, +-0.170937f,0.879572f,0.443997f, +-0.244838f,0.844603f,0.47613f, +-0.196312f,0.844324f,0.498577f, +-0.188529f,0.85759f,0.478535f, +-0.188501f,0.839785f,0.509145f, +-0.185899f,0.842964f,0.50483f, +-0.154293f,0.872091f,0.464382f, +-0.115474f,0.894542f,0.431811f, +-0.0887035f,0.930393f,0.35567f, +0.133188f,0.884773f,0.446583f, +0.0484666f,0.90226f,0.42846f, +-0.0427135f,0.946807f,0.318954f, +-0.0239721f,0.952831f,0.302554f, +-0.0435714f,0.926502f,0.373759f, +-0.182333f,0.899048f,0.398079f, +-0.323546f,0.846433f,0.422929f, +-0.334412f,0.852971f,0.40076f, +-0.325744f,0.921829f,0.210052f, +-0.140593f,0.980752f,0.135497f, +-0.000911154f,0.974293f,0.225285f, +-0.0250989f,0.969759f,0.242771f, +-0.116671f,0.973198f,0.198177f, +-0.222025f,0.967605f,0.12019f, +-0.252573f,0.967519f,-0.0106675f, +-0.0639595f,0.99456f,0.0822198f, +0.0427289f,0.995551f,0.0839736f, +-0.103724f,0.994603f,-0.00239601f, +-0.143088f,0.981404f,0.127957f, +-0.10974f,0.986771f,0.119333f, +0.0104156f,0.996494f,-0.083017f, +0.293943f,0.936018f,-0.193565f, +0.319276f,0.921897f,-0.219472f, +0.0381885f,0.98033f,-0.193638f, +-0.0675527f,0.960756f,-0.269042f, +0.11652f,0.926645f,-0.357425f, +0.2292f,0.915276f,-0.331265f, +0.30797f,0.891339f,-0.33267f, +0.348546f,0.853103f,-0.38824f, +0.249601f,0.874176f,-0.416553f, +0.18778f,0.887174f,-0.421499f, +0.122671f,0.990262f,-0.0658213f, +-0.0435566f,0.992887f,-0.11081f, +0.0494387f,0.998572f,0.0202637f, +0.34574f,0.93458f,0.0838063f, +0.205482f,0.970541f,-0.125808f, +0.00807532f,0.928646f,-0.370879f, +0.212354f,0.896105f,-0.389746f, +0.285287f,0.924061f,-0.254407f, +0.130923f,0.978283f,-0.160691f, +-0.0198715f,0.999555f,-0.0222427f, +-0.0516664f,0.987583f,0.148362f, +-0.0269196f,0.97761f,0.208697f, +-0.00903021f,0.979554f,0.200976f, +-0.00834551f,0.993685f,0.111894f, +0.110842f,0.987362f,0.113269f, +0.106874f,0.976878f,0.185167f, +0.141547f,0.968321f,0.205716f, +0.174972f,0.958256f,0.22612f, +0.054828f,0.97071f,0.233913f, +0.0299952f,0.981566f,0.188753f, +0.154988f,0.980787f,0.118472f, +0.340268f,0.925521f,0.166219f, +0.0136729f,0.972695f,0.231683f, +-0.270301f,0.899629f,0.342937f, +-0.212226f,0.859098f,0.465736f, +-0.140535f,0.846284f,0.513861f, +-0.175101f,0.833937f,0.523345f, +-0.270288f,0.821688f,0.501769f, +-0.282918f,0.830124f,0.48047f, +-0.174774f,0.812594f,0.556008f, +-0.140913f,0.828898f,0.541361f, +-0.117146f,0.878471f,0.463211f, +-0.0728003f,0.920501f,0.383899f, +-0.00293246f,0.948861f,0.315679f, +-0.025836f,0.967046f,0.253289f, +-0.00528251f,0.957042f,0.289901f, +0.088837f,0.914901f,0.393781f, +0.103014f,0.924276f,0.367561f, +0.00437406f,0.95596f,0.293464f, +-0.1442f,0.952275f,0.269032f, +-0.25396f,0.922416f,0.290951f, +-0.3894f,0.883133f,0.261618f, +-0.283615f,0.906122f,0.313857f, +-0.158058f,0.930594f,0.330171f, +-0.134893f,0.961854f,0.237993f, +-0.0720522f,0.980808f,0.181173f, +0.0349752f,0.985618f,0.16533f, +-0.115886f,0.987377f,0.107965f, +-0.182211f,0.968171f,0.171592f, +-0.154769f,0.971197f,0.181169f, +-0.0833304f,0.991727f,0.0976435f, +0.136344f,0.989699f,0.0436644f, +-0.106946f,0.993768f,-0.0314277f, +-0.261215f,0.963441f,0.0595659f, +0.0120329f,0.999596f,0.0257635f, +0.254582f,0.953185f,-0.163178f, +0.299581f,0.899014f,-0.319413f, +0.266729f,0.9307f,-0.250307f, +0.0579078f,0.977779f,-0.201483f, +0.0590491f,0.968354f,-0.242494f, +0.196887f,0.912909f,-0.357536f, +0.211047f,0.877381f,-0.430885f, +0.301745f,0.869054f,-0.39204f, +0.422629f,0.852977f,-0.306291f, +0.252055f,0.896241f,-0.364994f, +0.158615f,0.91987f,-0.35872f, +0.099088f,0.991841f,-0.0802016f, +-0.0649468f,0.996188f,-0.0582405f, +-0.09006f,0.995865f,-0.0119566f, +0.299186f,0.949686f,0.0926523f, +0.448961f,0.886032f,0.115674f, +0.225408f,0.968479f,-0.106019f, +0.110364f,0.983262f,-0.144965f, +0.0982296f,0.994337f,0.0405443f, +0.03386f,0.98307f,0.180072f, +-0.0548904f,0.982813f,0.176255f, +-0.131535f,0.986412f,0.0984329f, +-0.0772354f,0.9803f,0.181787f, +0.0556449f,0.958844f,0.278429f, +0.08308f,0.969903f,0.228882f, +0.0990101f,0.980512f,0.169685f, +0.044494f,0.989611f,0.136713f, +0.124145f,0.981303f,0.14708f, +0.126925f,0.98249f,0.136391f, +0.0289993f,0.988064f,0.151292f, +0.146433f,0.982737f,0.113073f, +0.210582f,0.977005f,-0.0334257f, +0.179552f,0.980748f,0.0767724f, +-0.0986728f,0.925956f,0.364513f, +-0.333893f,0.835984f,0.435484f, +-0.316161f,0.849609f,0.422146f, +-0.184942f,0.836066f,0.516517f, +-0.165011f,0.827696f,0.536368f, +-0.1919f,0.849729f,0.491054f, +-0.260791f,0.881445f,0.393754f, +-0.244518f,0.891442f,0.3815f, +-0.101674f,0.91665f,0.386543f, +-0.0135975f,0.926806f,0.375295f, +0.0383624f,0.948469f,0.31454f, +0.0311937f,0.973858f,0.225008f, +-0.0712105f,0.966505f,0.24657f, +-0.0567001f,0.939446f,0.337973f, +0.028793f,0.937988f,0.345471f, +0.0944493f,0.922855f,0.373388f, +0.0339618f,0.928396f,0.370037f, +-0.0877384f,0.940895f,0.327137f, +-0.18953f,0.934542f,0.301182f, +-0.32638f,0.91712f,0.22884f, +-0.359606f,0.925931f,0.115484f, +-0.250341f,0.958991f,0.132911f, +-0.0188851f,0.981881f,0.188556f, +0.0444017f,0.992958f,0.109832f, +0.0292244f,0.992914f,0.115188f, +-0.0809364f,0.975181f,0.206087f, +-0.271318f,0.947628f,0.168488f, +-0.147667f,0.972329f,0.181027f, +0.0428511f,0.996597f,0.0704105f, +0.186761f,0.979997f,-0.0687482f, +-0.111624f,0.989428f,-0.0925828f, +-0.210799f,0.973161f,-0.0923101f, +0.115063f,0.969975f,-0.214262f, +0.376036f,0.900817f,-0.217086f, +0.373114f,0.884398f,-0.280403f, +0.226074f,0.905778f,-0.358407f, +0.0100432f,0.919347f,-0.393319f, +0.0770135f,0.93428f,-0.348124f, +0.321395f,0.895396f,-0.308175f, +0.278274f,0.88968f,-0.361984f, +0.208857f,0.897848f,-0.387619f, +0.325776f,0.898072f,-0.295527f, +0.259741f,0.94586f,-0.194637f, +0.133572f,0.977992f,-0.160282f, +-0.0277257f,0.992037f,-0.122857f, +-0.0924217f,0.994571f,-0.0478129f, +-0.116438f,0.990661f,-0.0709396f, +0.19557f,0.979919f,-0.0388625f, +0.381806f,0.908869f,0.167871f, +0.299282f,0.900933f,0.314247f, +0.0638964f,0.963274f,0.260808f, +-0.0731879f,0.961388f,0.265284f, +0.00180295f,0.933351f,0.35896f, +0.0655899f,0.939022f,0.337544f, +-0.0612046f,0.96894f,0.239602f, +-0.166052f,0.961913f,0.217141f, +-0.0893118f,0.965245f,0.245614f, +0.0820047f,0.941494f,0.326902f, +0.146932f,0.937808f,0.314527f, +0.136588f,0.939539f,0.314023f, +0.166222f,0.964584f,0.204811f, +0.17109f,0.976368f,0.132039f, +0.0961069f,0.992806f,0.0714098f, +0.21778f,0.975905f,-0.013487f, +0.251597f,0.967828f,-0.00281592f, +-0.0966896f,0.992674f,0.0724564f, +-0.377842f,0.87018f,0.316262f, +-0.323773f,0.853386f,0.408537f, +-0.278729f,0.867238f,0.412564f, +-0.286188f,0.874143f,0.392391f, +-0.157911f,0.873337f,0.46081f, +-0.102832f,0.901917f,0.419488f, +-0.202979f,0.914239f,0.350665f, +-0.202531f,0.912766f,0.354739f, +-0.0843061f,0.956165f,0.28043f, +-0.032801f,0.972626f,0.23005f, +0.0558474f,0.961664f,0.268485f, +0.0617913f,0.944956f,0.321309f, +-0.110343f,0.937288f,0.330629f, +-0.100375f,0.942449f,0.318927f, +0.00551388f,0.94452f,0.328408f, +0.0918462f,0.918926f,0.383587f, +0.101653f,0.927592f,0.3595f, +-0.0426308f,0.960188f,0.276083f, +-0.204594f,0.956809f,0.206539f, +-0.269971f,0.94929f,0.161132f, +-0.226691f,0.969699f,0.0910768f, +-0.201053f,0.979426f,-0.0173973f, +-0.0500104f,0.996428f,-0.0680439f, +0.0272717f,0.999341f,-0.0239459f, +-0.123434f,0.99095f,0.0527561f, +-0.192945f,0.962627f,0.190054f, +-0.168165f,0.969015f,0.180916f, +-0.018086f,0.998622f,0.0492547f, +0.193647f,0.975713f,-0.102395f, +0.238523f,0.949336f,-0.204618f, +-0.0631885f,0.979427f,-0.191649f, +-0.143153f,0.951631f,-0.271858f, +0.148284f,0.940281f,-0.306403f, +0.321113f,0.91022f,-0.261508f, +0.430557f,0.873923f,-0.225566f, +0.33081f,0.885978f,-0.324974f, +0.0651303f,0.881392f,-0.467874f, +0.0061581f,0.870221f,-0.492623f, +0.228459f,0.886891f,-0.401535f, +0.271547f,0.915184f,-0.297827f, +0.234822f,0.937165f,-0.258033f, +0.27549f,0.92259f,-0.270061f, +0.15924f,0.956523f,-0.244348f, +0.0559303f,0.980799f,-0.186831f, +-0.135424f,0.978967f,-0.152593f, +-0.15029f,0.985676f,-0.0765294f, +-0.0914165f,0.995631f,-0.0190383f, +0.0718608f,0.995714f,0.0582141f, +0.110439f,0.955564f,0.273313f, +0.150494f,0.878589f,0.453246f, +0.206788f,0.864483f,0.458157f, +0.00161058f,0.957582f,0.288156f, +-0.0606597f,0.978401f,0.197616f, +0.0692656f,0.9636f,0.25822f, +-0.0150286f,0.961837f,0.273212f, +-0.0821089f,0.979895f,0.181835f, +-0.0658015f,0.997594f,0.0218166f, +0.0735253f,0.997209f,0.0129617f, +0.108564f,0.993746f,0.0261473f, +0.141903f,0.981669f,0.127241f, +0.25029f,0.961471f,0.113707f, +0.225135f,0.967003f,0.119246f, +0.180078f,0.979492f,0.0903737f, +0.237995f,0.971216f,-0.00990333f, +0.0690008f,0.993039f,0.0954582f, +-0.15301f,0.921345f,0.357369f, +-0.436898f,0.858127f,0.2697f, +-0.402318f,0.892319f,0.204714f, +-0.306797f,0.913547f,0.267033f, +-0.291188f,0.917032f,0.272509f, +-0.177835f,0.951614f,0.250608f, +-0.0915363f,0.968867f,0.230039f, +-0.166531f,0.945303f,0.280483f, +-0.214524f,0.956179f,0.199251f, +-0.012479f,0.976094f,0.216991f, +0.0485598f,0.972045f,0.22972f, +-0.0252191f,0.985709f,0.166561f, +-0.0505751f,0.962642f,0.266012f, +-0.0744793f,0.942362f,0.3262f, +-0.0759606f,0.964725f,0.252062f, +-0.0161104f,0.954528f,0.297687f, +0.0264811f,0.949176f,0.313631f, +0.160628f,0.931063f,0.327597f, +0.0783265f,0.972396f,0.219798f, +-0.0844827f,0.993769f,0.0727062f, +-0.216702f,0.975588f,-0.035603f, +-0.195742f,0.979732f,-0.0425419f, +-0.158684f,0.986912f,-0.0287187f, +-0.0351752f,0.999203f,-0.0188605f, +0.0075235f,0.998877f,-0.0467686f, +-0.172586f,0.978556f,-0.112436f, +-0.211691f,0.968971f,-0.127601f, +-0.0966389f,0.974492f,-0.202552f, +0.105494f,0.955113f,-0.276822f, +0.276059f,0.900517f,-0.335947f, +0.219894f,0.907239f,-0.358557f, +-0.0517693f,0.940977f,-0.334489f, +-0.112634f,0.913693f,-0.390485f, +0.139923f,0.91136f,-0.387097f, +0.277005f,0.880398f,-0.384926f, +0.432717f,0.843875f,-0.317222f, +0.433921f,0.823502f,-0.365455f, +0.17364f,0.848637f,-0.499665f, +-0.015678f,0.850557f,-0.525649f, +0.122709f,0.874405f,-0.469423f, +0.164019f,0.896294f,-0.412014f, +0.166557f,0.925047f,-0.34139f, +0.280426f,0.925939f,-0.25298f, +0.167623f,0.949542f,-0.265088f, +-0.00102675f,0.947405f,-0.320035f, +-0.299103f,0.954018f,0.0196808f, +-0.231787f,0.963234f,0.135851f, +-0.196753f,0.961454f,0.192081f, +-0.100151f,0.951932f,0.289472f, +-0.0563981f,0.925245f,0.375154f, +0.0944709f,0.906549f,0.411394f, +0.305132f,0.862547f,0.403618f, +0.241596f,0.931691f,0.271261f, +-0.00370494f,0.998524f,0.0541932f, +-0.000261525f,0.998839f,0.0481646f, +0.0260826f,0.996855f,0.0748309f, +0.0599122f,0.998202f,-0.00179631f, +0.0800977f,0.992669f,-0.0905174f, +0.0495455f,0.986325f,-0.157186f, +0.0563113f,0.99071f,-0.123787f, +0.0832843f,0.991933f,-0.095561f, +0.195142f,0.979158f,-0.0563024f, +0.166634f,0.980307f,0.105976f, +0.195862f,0.965878f,0.169461f, +0.284001f,0.943304f,0.171815f, +-0.127388f,0.981047f,0.146008f, +-0.325222f,0.907949f,0.264311f, +-0.283635f,0.916157f,0.28321f, +-0.335047f,0.926228f,0.17276f, +-0.335005f,0.934046f,0.123816f, +-0.290471f,0.951826f,0.098256f, +-0.155538f,0.980437f,0.120632f, +-0.103955f,0.982905f,0.151957f, +-0.195165f,0.971298f,0.135979f, +-0.117017f,0.988828f,0.0923353f, +-0.0942839f,0.995508f,0.00860997f, +-0.0378307f,0.988218f,0.148301f, +0.011735f,0.964206f,0.264893f, +-0.104568f,0.970188f,0.218634f, +-0.0628876f,0.976435f,0.206445f, +-0.0629747f,0.98253f,0.175127f, +-0.0956593f,0.974263f,0.204109f, +0.00313264f,0.95614f,0.292895f, +0.184054f,0.913334f,0.363241f, +0.234886f,0.917194f,0.321843f, +0.0818984f,0.986888f,0.139086f, +-0.195667f,0.979747f,-0.0425424f, +-0.217661f,0.976006f,-0.00606019f, +-0.197993f,0.980131f,-0.011927f, +-0.0476541f,0.998861f,-0.00224411f, +0.0987461f,0.994341f,-0.039179f, +-0.0376594f,0.985822f,-0.163515f, +-0.127665f,0.950129f,-0.284528f, +0.022229f,0.926621f,-0.37534f, +0.1509f,0.867911f,-0.473243f, +0.251356f,0.84329f,-0.475061f, +0.180391f,0.877498f,-0.44436f, +-0.0381311f,0.903323f,-0.427263f, +-0.0302687f,0.878817f,-0.476199f, +0.151045f,0.843437f,-0.515557f, +0.243043f,0.829132f,-0.503459f, +0.361214f,0.815934f,-0.451416f, +0.469501f,0.80804f,-0.355866f, +0.232058f,0.89573f,-0.379233f, +-0.0406313f,0.902008f,-0.429803f, +0.0570971f,0.896722f,-0.438895f, +0.139199f,0.907425f,-0.396488f, +0.0981956f,0.909915f,-0.403003f, +0.173099f,0.913856f,-0.367293f, +0.208242f,0.936494f,-0.28216f, +0.104323f,0.936228f,-0.335549f, +-0.455877f,0.874672f,0.164697f, +-0.324643f,0.906811f,0.268889f, +-0.22917f,0.934048f,0.273927f, +-0.11917f,0.945648f,0.302569f, +-0.0303449f,0.953424f,0.300104f, +0.0953211f,0.968161f,0.231468f, +0.307551f,0.928088f,0.209914f, +0.396906f,0.882705f,0.251588f, +0.154339f,0.98019f,0.124127f, +0.00614755f,0.999958f,0.00674104f, +0.0862143f,0.995356f,-0.0428297f, +0.0605751f,0.988948f,-0.135323f, +0.116851f,0.991236f,-0.0616197f, +0.0626175f,0.989161f,-0.132815f, +0.0598334f,0.989391f,-0.132381f, +0.0870904f,0.982628f,-0.163882f, +0.0967617f,0.982554f,-0.15882f, +0.0255981f,0.999032f,-0.0357718f, +0.114826f,0.99101f,0.0686587f, +0.196799f,0.954402f,0.22447f, +-0.0385546f,0.932725f,0.358521f, +-0.332784f,0.924223f,0.18726f, +-0.304588f,0.936692f,0.172726f, +-0.293315f,0.937819f,0.185638f, +-0.274742f,0.953043f,0.127381f, +-0.263119f,0.962853f,0.0606766f, +-0.268024f,0.959606f,0.0855591f, +-0.0879001f,0.973995f,0.208824f, +-0.133948f,0.986848f,0.0904876f, +-0.113332f,0.988235f,0.102703f, +-0.0299834f,0.985262f,0.168402f, +-0.19277f,0.976736f,0.0939502f, +-0.0881002f,0.973369f,0.211639f, +-0.024161f,0.965814f,0.258109f, +-0.0447814f,0.977625f,0.205534f, +-0.0454862f,0.975256f,0.216349f, +-0.133105f,0.964838f,0.22665f, +-0.114579f,0.956534f,0.268169f, +0.0712671f,0.941693f,0.328841f, +0.238728f,0.884921f,0.399904f, +0.297664f,0.869038f,0.395183f, +-0.00961778f,0.988677f,0.149748f, +-0.265709f,0.963666f,-0.0273077f, +-0.143358f,0.988736f,0.0430136f, +-0.00534208f,0.998711f,-0.0504723f, +0.174549f,0.979244f,-0.103024f, +0.0753759f,0.97722f,-0.198391f, +-0.0309169f,0.954209f,-0.297538f, +0.114484f,0.932628f,-0.342197f, +0.277629f,0.881086f,-0.382896f, +0.233881f,0.840787f,-0.488238f, +0.145974f,0.866169f,-0.477957f, +-0.0214889f,0.855591f,-0.517207f, +0.015747f,0.850281f,-0.526094f, +0.181736f,0.859322f,-0.478056f, +0.233268f,0.832868f,-0.501913f, +0.278912f,0.819449f,-0.500711f, +0.37496f,0.838284f,-0.395834f, +0.211098f,0.909912f,-0.357069f, +0.0173895f,0.949305f,-0.313875f, +0.0778513f,0.935569f,-0.344455f, +0.13573f,0.919161f,-0.369756f, +0.128317f,0.903382f,-0.40919f, +0.134873f,0.894846f,-0.425512f, +0.140765f,0.922098f,-0.360446f, +0.195779f,0.941368f,-0.274766f, +-0.498792f,0.861228f,0.0974355f, +-0.334273f,0.933116f,0.132498f, +-0.209899f,0.97009f,0.121936f, +-0.146122f,0.979163f,0.141027f, +-0.00844043f,0.991347f,0.130997f, +0.183871f,0.98064f,0.0673491f, +0.295623f,0.955305f,0.000649681f, +0.325261f,0.940591f,0.0974362f, +0.279972f,0.936209f,0.212435f, +0.117319f,0.989809f,0.0807136f, +0.167452f,0.985876f,0.00303625f, +0.0997326f,0.991951f,-0.0780129f, +0.0970545f,0.989541f,-0.106723f, +0.122983f,0.982138f,-0.14241f, +0.0889416f,0.984545f,-0.150867f, +0.0922265f,0.975522f,-0.199627f, +0.0767647f,0.98447f,-0.15788f, +-0.0166949f,0.981051f,-0.193027f, +-0.0192651f,0.97159f,-0.235885f, +-0.0430007f,0.99834f,-0.038322f, +-0.1057f,0.976121f,0.189775f, +-0.21501f,0.968939f,0.122177f, +-0.312622f,0.947332f,0.0695023f, +-0.268759f,0.958656f,0.0935212f, +-0.210053f,0.974561f,0.0781578f, +-0.280996f,0.956877f,0.0736733f, +-0.29425f,0.945004f,0.142776f, +-0.103752f,0.988352f,0.111339f, +-0.0179991f,0.994529f,0.102897f, +-0.257355f,0.965403f,0.0420096f, +-0.105403f,0.956057f,0.273578f, +-0.10459f,0.942017f,0.318851f, +-0.129983f,0.956026f,0.262903f, +-0.0671262f,0.95499f,0.288944f, +-0.00387184f,0.948915f,0.315508f, +-0.104327f,0.957897f,0.267486f, +-0.136557f,0.931775f,0.336375f, +-0.0981417f,0.964639f,0.24462f, +0.0564237f,0.977306f,0.204178f, +0.151449f,0.955346f,0.253725f, +0.313069f,0.882901f,0.349962f, +0.317375f,0.903515f,0.287983f, +-0.14146f,0.988238f,-0.0580959f, +-0.183704f,0.977531f,-0.10337f, +0.0729777f,0.993775f,-0.0841813f, +0.241185f,0.959561f,-0.145165f, +0.180872f,0.946861f,-0.26597f, +0.0759246f,0.918564f,-0.387911f, +0.0834031f,0.881426f,-0.4649f, +0.312989f,0.886301f,-0.341334f, +0.345782f,0.8869f,-0.306339f, +0.190174f,0.893803f,-0.40614f, +0.0967003f,0.870562f,-0.482463f, +-0.011292f,0.813313f,-0.581716f, +0.104307f,0.818569f,-0.564858f, +0.278742f,0.804599f,-0.524332f, +0.252871f,0.80123f,-0.542298f, +0.288393f,0.816691f,-0.499846f, +0.158986f,0.877853f,-0.451771f, +-0.0422089f,0.892803f,-0.448466f, +0.0676213f,0.902423f,-0.425511f, +0.196008f,0.897779f,-0.394428f, +0.174291f,0.88488f,-0.431984f, +0.107973f,0.893114f,-0.43668f, +0.0286973f,0.916566f,-0.398853f, +0.0334026f,0.935074f,-0.352875f, +-0.456752f,0.886621f,-0.0726759f, +-0.35821f,0.92461f,-0.129546f, +-0.255187f,0.962466f,-0.0924034f, +-0.153659f,0.987984f,-0.0166497f, +0.0326193f,0.998752f,-0.0378261f, +0.219848f,0.975435f,-0.0138776f, +0.325192f,0.945498f,0.0168406f, +0.223054f,0.973348f,-0.0532875f, +0.221049f,0.975263f,0.000679153f, +0.242907f,0.969656f,0.0276409f, +0.175892f,0.983375f,-0.0451076f, +0.180873f,0.98342f,0.0130764f, +0.169259f,0.981997f,-0.0838673f, +0.138819f,0.973225f,-0.183198f, +0.0923263f,0.975478f,-0.199795f, +0.109785f,0.97291f,-0.203452f, +0.048887f,0.975403f,-0.214938f, +0.0862303f,0.974446f,-0.207409f, +0.0239822f,0.965181f,-0.260482f, +-0.234299f,0.93066f,-0.281028f, +-0.183154f,0.968628f,-0.167974f, +-0.163946f,0.9725f,-0.165423f, +-0.29935f,0.945623f,-0.127226f, +-0.309491f,0.943295f,-0.120043f, +-0.244588f,0.967669f,-0.0615978f, +-0.316375f,0.948228f,-0.0277512f, +-0.278706f,0.959538f,-0.0401272f, +-0.112855f,0.98959f,-0.0893067f, +-0.0120823f,0.999804f,0.015665f, +-0.269265f,0.962743f,0.0249422f, +-0.319779f,0.940968f,0.110998f, +-0.127925f,0.957822f,0.257316f, +-0.134411f,0.958853f,0.250069f, +-0.0963489f,0.939739f,0.328035f, +0.013379f,0.931979f,0.362265f, +-0.059723f,0.950577f,0.304692f, +-0.140375f,0.96932f,0.201776f, +0.0285405f,0.975242f,0.219289f, +0.0759984f,0.981739f,0.174395f, +0.082912f,0.985645f,0.14707f, +0.244118f,0.959921f,0.137686f, +0.433469f,0.888297f,0.151764f, +0.159753f,0.986026f,0.0472448f, +-0.155828f,0.965805f,-0.207217f, +0.0529598f,0.961817f,-0.268522f, +0.302231f,0.91749f,-0.258588f, +0.300969f,0.905771f,-0.298324f, +0.219954f,0.902269f,-0.370851f, +0.168125f,0.874674f,-0.45462f, +0.0852064f,0.832228f,-0.547846f, +0.293285f,0.876411f,-0.381953f, +0.299707f,0.878674f,-0.371628f, +0.169625f,0.87124f,-0.460618f, +0.152784f,0.862886f,-0.481751f, +0.140952f,0.826781f,-0.544578f, +0.216806f,0.796193f,-0.564865f, +0.252088f,0.778347f,-0.575003f, +0.184028f,0.779276f,-0.599052f, +0.07662f,0.847353f,-0.525474f, +-0.000576164f,0.875581f,-0.483072f, +0.0676453f,0.855821f,-0.51283f, +0.10935f,0.864233f,-0.491064f, +0.170357f,0.902391f,-0.395814f, +0.0783522f,0.922085f,-0.378973f, +-0.0376769f,0.945309f,-0.323992f, +-0.0145087f,0.973617f,-0.227725f, +-0.23379f,0.969091f,0.0787691f, +-0.308611f,0.949667f,-0.0537712f, +-0.26795f,0.959457f,-0.087437f, +-0.196118f,0.96672f,-0.16429f, +0.0184009f,0.993828f,-0.109391f, +0.124962f,0.988681f,-0.0830367f, +0.297057f,0.954812f,-0.00955538f, +0.355506f,0.934478f,-0.0191401f, +0.206845f,0.957298f,-0.201981f, +0.24827f,0.946264f,-0.207234f, +0.137685f,0.959548f,-0.245584f, +0.129837f,0.983718f,-0.124261f, +0.240211f,0.966075f,-0.0948542f, +0.253383f,0.959847f,-0.120381f, +0.101386f,0.970431f,-0.219056f, +0.110568f,0.971775f,-0.208395f, +0.09998f,0.968593f,-0.227667f, +0.051279f,0.9528f,-0.299236f, +0.0182953f,0.960636f,-0.277207f, +-0.177379f,0.948528f,-0.262356f, +-0.248744f,0.930203f,-0.269905f, +-0.201336f,0.9681f,-0.14915f, +-0.308378f,0.940105f,-0.145279f, +-0.337871f,0.915739f,-0.217407f, +-0.303349f,0.940151f,-0.155226f, +-0.267648f,0.955794f,-0.121746f, +-0.256838f,0.946595f,-0.194914f, +-0.151848f,0.978969f,-0.136244f, +-0.166527f,0.98578f,-0.0225025f, +-0.271416f,0.956933f,0.103014f, +-0.388293f,0.921445f,0.0129329f, +-0.211649f,0.973838f,0.0827345f, +-0.164151f,0.971899f,0.168719f, +-0.20343f,0.950968f,0.232971f, +-0.0501604f,0.944198f,0.325535f, +0.0851988f,0.916779f,0.390203f, +-0.0675238f,0.966737f,0.246698f, +-0.050967f,0.964665f,0.258503f, +0.0897532f,0.945965f,0.311599f, +0.203817f,0.954291f,0.218604f, +0.298323f,0.9542f,0.0224806f, +0.409994f,0.911395f,0.0355409f, +0.297451f,0.952362f,0.0673044f, +0.087158f,0.982486f,-0.164695f, +0.130693f,0.926163f,-0.353753f, +0.287973f,0.877932f,-0.3825f, +0.285473f,0.870692f,-0.400501f, +0.210236f,0.894171f,-0.395297f, +0.291478f,0.889926f,-0.350816f, +0.238796f,0.833f,-0.499086f, +0.156519f,0.786723f,-0.597134f, +0.265294f,0.807831f,-0.526334f, +0.196683f,0.821511f,-0.535197f, +0.111545f,0.852981f,-0.509883f, +0.148451f,0.876975f,-0.457031f, +0.27925f,0.865803f,-0.415216f, +0.364812f,0.845771f,-0.389337f, +0.213362f,0.862896f,-0.458135f, +-0.014091f,0.870788f,-0.491456f, +-0.0389733f,0.872117f,-0.487742f, +0.0697073f,0.876793f,-0.475789f, +0.0500075f,0.893805f,-0.445659f, +0.0507492f,0.920605f,-0.387184f, +0.00717016f,0.971083f,-0.238636f, +-0.12982f,0.987525f,-0.0891113f, +-0.196671f,0.977747f,-0.0730188f, +-0.180786f,0.972597f,0.146192f, +-0.276836f,0.956623f,0.0907445f, +-0.145247f,0.980389f,0.133193f, +-0.201228f,0.967008f,-0.156214f, +-0.0137179f,0.995281f,-0.0960578f, +0.139707f,0.987867f,-0.0678349f, +0.246306f,0.96116f,-0.124516f, +0.421865f,0.906227f,-0.0279788f, +0.299255f,0.934152f,-0.194439f, +0.288356f,0.912569f,-0.289945f, +0.0853497f,0.915952f,-0.392106f, +0.039019f,0.957394f,-0.286136f, +0.208597f,0.95771f,-0.198188f, +0.25753f,0.95731f,-0.131287f, +0.153643f,0.978938f,-0.134439f, +0.0994252f,0.976974f,-0.188775f, +0.12654f,0.974603f,-0.184759f, +0.142684f,0.966335f,-0.214099f, +-0.00843645f,0.93512f,-0.354231f, +-0.17704f,0.933769f,-0.311017f, +-0.343277f,0.895674f,-0.282717f, +-0.276715f,0.959562f,-0.0516624f, +-0.215753f,0.976427f,-0.00633257f, +-0.305134f,0.926522f,-0.220112f, +-0.33388f,0.920497f,-0.203001f, +-0.259644f,0.948413f,-0.181927f, +-0.268974f,0.938104f,-0.218205f, +-0.245938f,0.962991f,-0.110289f, +-0.275564f,0.96071f,0.0331654f, +-0.258271f,0.944524f,0.202903f, +-0.309053f,0.947461f,0.0824847f, +-0.320335f,0.94673f,-0.0329778f, +-0.208609f,0.963472f,0.167941f, +-0.270763f,0.941796f,0.199269f, +-0.104692f,0.947993f,0.30058f, +0.0304241f,0.930802f,0.364255f, +0.0189457f,0.906511f,0.421757f, +-0.0823065f,0.924037f,0.373337f, +0.102263f,0.911082f,0.39934f, +0.325851f,0.888801f,0.322263f, +0.371159f,0.927767f,0.0385981f, +0.355076f,0.934525f,0.0241533f, +0.375158f,0.916478f,0.139015f, +0.286108f,0.953917f,-0.0904664f, +0.199009f,0.919897f,-0.337913f, +0.358636f,0.872243f,-0.332523f, +0.268543f,0.846175f,-0.460296f, +0.182977f,0.871041f,-0.455858f, +0.289295f,0.860781f,-0.418765f, +0.382576f,0.820168f,-0.425393f, +0.183794f,0.780369f,-0.597699f, +0.239111f,0.770893f,-0.590381f, +0.11759f,0.781853f,-0.612273f, +0.0625615f,0.849006f,-0.524666f, +0.09237f,0.869569f,-0.485096f, +0.210947f,0.881757f,-0.421908f, +0.36331f,0.890409f,-0.274185f, +0.280816f,0.923638f,-0.260836f, +0.0186632f,0.936387f,-0.350473f, +-0.00764646f,0.914133f,-0.405343f, +0.0383964f,0.885647f,-0.462769f, +0.0296537f,0.913944f,-0.404755f, +-0.02984f,0.920171f,-0.390377f, +-0.172982f,0.943792f,-0.281663f, +-0.19032f,0.979403f,0.0674393f, +-0.205961f,0.972526f,0.108505f, +}; + +btScalar Landscape08Tex[] = { +0.0f,0.757813f, +0.0f,0.75f, +0.0078125f,0.757813f, +0.0078125f,0.75f, +0.015625f,0.757813f, +0.015625f,0.75f, +0.0234375f,0.757813f, +0.0234375f,0.75f, +0.03125f,0.757813f, +0.03125f,0.75f, +0.0390625f,0.757813f, +0.0390625f,0.75f, +0.046875f,0.757813f, +0.046875f,0.75f, +0.0546875f,0.757813f, +0.0546875f,0.75f, +0.0625f,0.757813f, +0.0625f,0.75f, +0.0703125f,0.757813f, +0.0703125f,0.75f, +0.078125f,0.757813f, +0.078125f,0.75f, +0.0859375f,0.757813f, +0.0859375f,0.75f, +0.09375f,0.757813f, +0.09375f,0.75f, +0.101563f,0.757813f, +0.101563f,0.75f, +0.109375f,0.757813f, +0.109375f,0.75f, +0.117188f,0.757813f, +0.117188f,0.75f, +0.125f,0.757813f, +0.125f,0.75f, +0.132813f,0.757813f, +0.132813f,0.75f, +0.140625f,0.757813f, +0.140625f,0.75f, +0.148438f,0.757813f, +0.148438f,0.75f, +0.15625f,0.757813f, +0.15625f,0.75f, +0.164063f,0.757813f, +0.164063f,0.75f, +0.171875f,0.757813f, +0.171875f,0.75f, +0.179688f,0.757813f, +0.179688f,0.75f, +0.1875f,0.757813f, +0.1875f,0.75f, +0.195313f,0.757813f, +0.195313f,0.75f, +0.203125f,0.757813f, +0.203125f,0.75f, +0.210938f,0.757813f, +0.210938f,0.75f, +0.21875f,0.757813f, +0.21875f,0.75f, +0.226563f,0.757813f, +0.226563f,0.75f, +0.234375f,0.757813f, +0.234375f,0.75f, +0.242188f,0.757813f, +0.242188f,0.75f, +0.25f,0.757813f, +0.25f,0.75f, +0.257813f,0.757813f, +0.257813f,0.75f, +0.265625f,0.757813f, +0.265625f,0.75f, +0.273438f,0.757813f, +0.273438f,0.75f, +0.28125f,0.757813f, +0.28125f,0.75f, +0.289063f,0.757813f, +0.289063f,0.75f, +0.296875f,0.757813f, +0.296875f,0.75f, +0.304688f,0.757813f, +0.304688f,0.75f, +0.3125f,0.757813f, +0.3125f,0.75f, +0.320313f,0.757813f, +0.320313f,0.75f, +0.328125f,0.757813f, +0.328125f,0.75f, +0.335938f,0.757813f, +0.335938f,0.75f, +0.34375f,0.757813f, +0.34375f,0.75f, +0.351563f,0.757813f, +0.351563f,0.75f, +0.359375f,0.757813f, +0.359375f,0.75f, +0.367188f,0.757813f, +0.367188f,0.75f, +0.375f,0.757813f, +0.375f,0.75f, +0.382813f,0.757813f, +0.382813f,0.75f, +0.390625f,0.757813f, +0.390625f,0.75f, +0.398438f,0.757813f, +0.398438f,0.75f, +0.40625f,0.757813f, +0.40625f,0.75f, +0.414063f,0.757813f, +0.414063f,0.75f, +0.421875f,0.757813f, +0.421875f,0.75f, +0.429688f,0.757813f, +0.429688f,0.75f, +0.4375f,0.757813f, +0.4375f,0.75f, +0.445313f,0.757813f, +0.445313f,0.75f, +0.453125f,0.757813f, +0.453125f,0.75f, +0.460938f,0.757813f, +0.460938f,0.75f, +0.46875f,0.757813f, +0.46875f,0.75f, +0.476563f,0.757813f, +0.476563f,0.75f, +0.484375f,0.757813f, +0.484375f,0.75f, +0.492188f,0.757813f, +0.492188f,0.75f, +0.5f,0.757813f, +0.5f,0.75f, +0.507813f,0.757813f, +0.507813f,0.75f, +0.0f,0.765625f, +0.0078125f,0.765625f, +0.015625f,0.765625f, +0.0234375f,0.765625f, +0.03125f,0.765625f, +0.0390625f,0.765625f, +0.046875f,0.765625f, +0.0546875f,0.765625f, +0.0625f,0.765625f, +0.0703125f,0.765625f, +0.078125f,0.765625f, +0.0859375f,0.765625f, +0.09375f,0.765625f, +0.101563f,0.765625f, +0.109375f,0.765625f, +0.117188f,0.765625f, +0.125f,0.765625f, +0.132813f,0.765625f, +0.140625f,0.765625f, +0.148438f,0.765625f, +0.15625f,0.765625f, +0.164063f,0.765625f, +0.171875f,0.765625f, +0.179688f,0.765625f, +0.1875f,0.765625f, +0.195313f,0.765625f, +0.203125f,0.765625f, +0.210938f,0.765625f, +0.21875f,0.765625f, +0.226563f,0.765625f, +0.234375f,0.765625f, +0.242188f,0.765625f, +0.25f,0.765625f, +0.257813f,0.765625f, +0.265625f,0.765625f, +0.273438f,0.765625f, +0.28125f,0.765625f, +0.289063f,0.765625f, +0.296875f,0.765625f, +0.304688f,0.765625f, +0.3125f,0.765625f, +0.320313f,0.765625f, +0.328125f,0.765625f, +0.335938f,0.765625f, +0.34375f,0.765625f, +0.351563f,0.765625f, +0.359375f,0.765625f, +0.367188f,0.765625f, +0.375f,0.765625f, +0.382813f,0.765625f, +0.390625f,0.765625f, +0.398438f,0.765625f, +0.40625f,0.765625f, +0.414063f,0.765625f, +0.421875f,0.765625f, +0.429688f,0.765625f, +0.4375f,0.765625f, +0.445313f,0.765625f, +0.453125f,0.765625f, +0.460938f,0.765625f, +0.46875f,0.765625f, +0.476563f,0.765625f, +0.484375f,0.765625f, +0.492188f,0.765625f, +0.5f,0.765625f, +0.507813f,0.765625f, +0.0f,0.773438f, +0.0078125f,0.773438f, +0.015625f,0.773438f, +0.0234375f,0.773438f, +0.03125f,0.773438f, +0.0390625f,0.773438f, +0.046875f,0.773438f, +0.0546875f,0.773438f, +0.0625f,0.773438f, +0.0703125f,0.773438f, +0.078125f,0.773438f, +0.0859375f,0.773438f, +0.09375f,0.773438f, +0.101563f,0.773438f, +0.109375f,0.773438f, +0.117188f,0.773438f, +0.125f,0.773438f, +0.132813f,0.773438f, +0.140625f,0.773438f, +0.148438f,0.773438f, +0.15625f,0.773438f, +0.164063f,0.773438f, +0.171875f,0.773438f, +0.179688f,0.773438f, +0.1875f,0.773438f, +0.195313f,0.773438f, +0.203125f,0.773438f, +0.210938f,0.773438f, +0.21875f,0.773438f, +0.226563f,0.773438f, +0.234375f,0.773438f, +0.242188f,0.773438f, +0.25f,0.773438f, +0.257813f,0.773438f, +0.265625f,0.773438f, +0.273438f,0.773438f, +0.28125f,0.773438f, +0.289063f,0.773438f, +0.296875f,0.773438f, +0.304688f,0.773438f, +0.3125f,0.773438f, +0.320313f,0.773438f, +0.328125f,0.773438f, +0.335938f,0.773438f, +0.34375f,0.773438f, +0.351563f,0.773438f, +0.359375f,0.773438f, +0.367188f,0.773438f, +0.375f,0.773438f, +0.382813f,0.773438f, +0.390625f,0.773438f, +0.398438f,0.773438f, +0.40625f,0.773438f, +0.414063f,0.773438f, +0.421875f,0.773438f, +0.429688f,0.773438f, +0.4375f,0.773438f, +0.445313f,0.773438f, +0.453125f,0.773438f, +0.460938f,0.773438f, +0.46875f,0.773438f, +0.476563f,0.773438f, +0.484375f,0.773438f, +0.492188f,0.773438f, +0.5f,0.773438f, +0.507813f,0.773438f, +0.0f,0.78125f, +0.0078125f,0.78125f, +0.015625f,0.78125f, +0.0234375f,0.78125f, +0.03125f,0.78125f, +0.0390625f,0.78125f, +0.046875f,0.78125f, +0.0546875f,0.78125f, +0.0625f,0.78125f, +0.0703125f,0.78125f, +0.078125f,0.78125f, +0.0859375f,0.78125f, +0.09375f,0.78125f, +0.101563f,0.78125f, +0.109375f,0.78125f, +0.117188f,0.78125f, +0.125f,0.78125f, +0.132813f,0.78125f, +0.140625f,0.78125f, +0.148438f,0.78125f, +0.15625f,0.78125f, +0.164063f,0.78125f, +0.171875f,0.78125f, +0.179688f,0.78125f, +0.1875f,0.78125f, +0.195313f,0.78125f, +0.203125f,0.78125f, +0.210938f,0.78125f, +0.21875f,0.78125f, +0.226563f,0.78125f, +0.234375f,0.78125f, +0.242188f,0.78125f, +0.25f,0.78125f, +0.257813f,0.78125f, +0.265625f,0.78125f, +0.273438f,0.78125f, +0.28125f,0.78125f, +0.289063f,0.78125f, +0.296875f,0.78125f, +0.304688f,0.78125f, +0.3125f,0.78125f, +0.320313f,0.78125f, +0.328125f,0.78125f, +0.335938f,0.78125f, +0.34375f,0.78125f, +0.351563f,0.78125f, +0.359375f,0.78125f, +0.367188f,0.78125f, +0.375f,0.78125f, +0.382813f,0.78125f, +0.390625f,0.78125f, +0.398438f,0.78125f, +0.40625f,0.78125f, +0.414063f,0.78125f, +0.421875f,0.78125f, +0.429688f,0.78125f, +0.4375f,0.78125f, +0.445313f,0.78125f, +0.453125f,0.78125f, +0.460938f,0.78125f, +0.46875f,0.78125f, +0.476563f,0.78125f, +0.484375f,0.78125f, +0.492188f,0.78125f, +0.5f,0.78125f, +0.507813f,0.78125f, +0.0f,0.789063f, +0.0078125f,0.789063f, +0.015625f,0.789063f, +0.0234375f,0.789063f, +0.03125f,0.789063f, +0.0390625f,0.789063f, +0.046875f,0.789063f, +0.0546875f,0.789063f, +0.0625f,0.789063f, +0.0703125f,0.789063f, +0.078125f,0.789063f, +0.0859375f,0.789063f, +0.09375f,0.789063f, +0.101563f,0.789063f, +0.109375f,0.789063f, +0.117188f,0.789063f, +0.125f,0.789063f, +0.132813f,0.789063f, +0.140625f,0.789063f, +0.148438f,0.789063f, +0.15625f,0.789063f, +0.164063f,0.789063f, +0.171875f,0.789063f, +0.179688f,0.789063f, +0.1875f,0.789063f, +0.195313f,0.789063f, +0.203125f,0.789063f, +0.210938f,0.789063f, +0.21875f,0.789063f, +0.226563f,0.789063f, +0.234375f,0.789063f, +0.242188f,0.789063f, +0.25f,0.789063f, +0.257813f,0.789063f, +0.265625f,0.789063f, +0.273438f,0.789063f, +0.28125f,0.789063f, +0.289063f,0.789063f, +0.296875f,0.789063f, +0.304688f,0.789063f, +0.3125f,0.789063f, +0.320313f,0.789063f, +0.328125f,0.789063f, +0.335938f,0.789063f, +0.34375f,0.789063f, +0.351563f,0.789063f, +0.359375f,0.789063f, +0.367188f,0.789063f, +0.375f,0.789063f, +0.382813f,0.789063f, +0.390625f,0.789063f, +0.398438f,0.789063f, +0.40625f,0.789063f, +0.414063f,0.789063f, +0.421875f,0.789063f, +0.429688f,0.789063f, +0.4375f,0.789063f, +0.445313f,0.789063f, +0.453125f,0.789063f, +0.460938f,0.789063f, +0.46875f,0.789063f, +0.476563f,0.789063f, +0.484375f,0.789063f, +0.492188f,0.789063f, +0.5f,0.789063f, +0.507813f,0.789063f, +0.0f,0.796875f, +0.0078125f,0.796875f, +0.015625f,0.796875f, +0.0234375f,0.796875f, +0.03125f,0.796875f, +0.0390625f,0.796875f, +0.046875f,0.796875f, +0.0546875f,0.796875f, +0.0625f,0.796875f, +0.0703125f,0.796875f, +0.078125f,0.796875f, +0.0859375f,0.796875f, +0.09375f,0.796875f, +0.101563f,0.796875f, +0.109375f,0.796875f, +0.117188f,0.796875f, +0.125f,0.796875f, +0.132813f,0.796875f, +0.140625f,0.796875f, +0.148438f,0.796875f, +0.15625f,0.796875f, +0.164063f,0.796875f, +0.171875f,0.796875f, +0.179688f,0.796875f, +0.1875f,0.796875f, +0.195313f,0.796875f, +0.203125f,0.796875f, +0.210938f,0.796875f, +0.21875f,0.796875f, +0.226563f,0.796875f, +0.234375f,0.796875f, +0.242188f,0.796875f, +0.25f,0.796875f, +0.257813f,0.796875f, +0.265625f,0.796875f, +0.273438f,0.796875f, +0.28125f,0.796875f, +0.289063f,0.796875f, +0.296875f,0.796875f, +0.304688f,0.796875f, +0.3125f,0.796875f, +0.320313f,0.796875f, +0.328125f,0.796875f, +0.335938f,0.796875f, +0.34375f,0.796875f, +0.351563f,0.796875f, +0.359375f,0.796875f, +0.367188f,0.796875f, +0.375f,0.796875f, +0.382813f,0.796875f, +0.390625f,0.796875f, +0.398438f,0.796875f, +0.40625f,0.796875f, +0.414063f,0.796875f, +0.421875f,0.796875f, +0.429688f,0.796875f, +0.4375f,0.796875f, +0.445313f,0.796875f, +0.453125f,0.796875f, +0.460938f,0.796875f, +0.46875f,0.796875f, +0.476563f,0.796875f, +0.484375f,0.796875f, +0.492188f,0.796875f, +0.5f,0.796875f, +0.507813f,0.796875f, +0.0f,0.804688f, +0.0078125f,0.804688f, +0.015625f,0.804688f, +0.0234375f,0.804688f, +0.03125f,0.804688f, +0.0390625f,0.804688f, +0.046875f,0.804688f, +0.0546875f,0.804688f, +0.0625f,0.804688f, +0.0703125f,0.804688f, +0.078125f,0.804688f, +0.0859375f,0.804688f, +0.09375f,0.804688f, +0.101563f,0.804688f, +0.109375f,0.804688f, +0.117188f,0.804688f, +0.125f,0.804688f, +0.132813f,0.804688f, +0.140625f,0.804688f, +0.148438f,0.804688f, +0.15625f,0.804688f, +0.164063f,0.804688f, +0.171875f,0.804688f, +0.179688f,0.804688f, +0.1875f,0.804688f, +0.195313f,0.804688f, +0.203125f,0.804688f, +0.210938f,0.804688f, +0.21875f,0.804688f, +0.226563f,0.804688f, +0.234375f,0.804688f, +0.242188f,0.804688f, +0.25f,0.804688f, +0.257813f,0.804688f, +0.265625f,0.804688f, +0.273438f,0.804688f, +0.28125f,0.804688f, +0.289063f,0.804688f, +0.296875f,0.804688f, +0.304688f,0.804688f, +0.3125f,0.804688f, +0.320313f,0.804688f, +0.328125f,0.804688f, +0.335938f,0.804688f, +0.34375f,0.804688f, +0.351563f,0.804688f, +0.359375f,0.804688f, +0.367188f,0.804688f, +0.375f,0.804688f, +0.382813f,0.804688f, +0.390625f,0.804688f, +0.398438f,0.804688f, +0.40625f,0.804688f, +0.414063f,0.804688f, +0.421875f,0.804688f, +0.429688f,0.804688f, +0.4375f,0.804688f, +0.445313f,0.804688f, +0.453125f,0.804688f, +0.460938f,0.804688f, +0.46875f,0.804688f, +0.476563f,0.804688f, +0.484375f,0.804688f, +0.492188f,0.804688f, +0.5f,0.804688f, +0.507813f,0.804688f, +0.0f,0.8125f, +0.0078125f,0.8125f, +0.015625f,0.8125f, +0.0234375f,0.8125f, +0.03125f,0.8125f, +0.0390625f,0.8125f, +0.046875f,0.8125f, +0.0546875f,0.8125f, +0.0625f,0.8125f, +0.0703125f,0.8125f, +0.078125f,0.8125f, +0.0859375f,0.8125f, +0.09375f,0.8125f, +0.101563f,0.8125f, +0.109375f,0.8125f, +0.117188f,0.8125f, +0.125f,0.8125f, +0.132813f,0.8125f, +0.140625f,0.8125f, +0.148438f,0.8125f, +0.15625f,0.8125f, +0.164063f,0.8125f, +0.171875f,0.8125f, +0.179688f,0.8125f, +0.1875f,0.8125f, +0.195313f,0.8125f, +0.203125f,0.8125f, +0.210938f,0.8125f, +0.21875f,0.8125f, +0.226563f,0.8125f, +0.234375f,0.8125f, +0.242188f,0.8125f, +0.25f,0.8125f, +0.257813f,0.8125f, +0.265625f,0.8125f, +0.273438f,0.8125f, +0.28125f,0.8125f, +0.289063f,0.8125f, +0.296875f,0.8125f, +0.304688f,0.8125f, +0.3125f,0.8125f, +0.320313f,0.8125f, +0.328125f,0.8125f, +0.335938f,0.8125f, +0.34375f,0.8125f, +0.351563f,0.8125f, +0.359375f,0.8125f, +0.367188f,0.8125f, +0.375f,0.8125f, +0.382813f,0.8125f, +0.390625f,0.8125f, +0.398438f,0.8125f, +0.40625f,0.8125f, +0.414063f,0.8125f, +0.421875f,0.8125f, +0.429688f,0.8125f, +0.4375f,0.8125f, +0.445313f,0.8125f, +0.453125f,0.8125f, +0.460938f,0.8125f, +0.46875f,0.8125f, +0.476563f,0.8125f, +0.484375f,0.8125f, +0.492188f,0.8125f, +0.5f,0.8125f, +0.507813f,0.8125f, +0.0f,0.820313f, +0.0078125f,0.820313f, +0.015625f,0.820313f, +0.0234375f,0.820313f, +0.03125f,0.820313f, +0.0390625f,0.820313f, +0.046875f,0.820313f, +0.0546875f,0.820313f, +0.0625f,0.820313f, +0.0703125f,0.820313f, +0.078125f,0.820313f, +0.0859375f,0.820313f, +0.09375f,0.820313f, +0.101563f,0.820313f, +0.109375f,0.820313f, +0.117188f,0.820313f, +0.125f,0.820313f, +0.132813f,0.820313f, +0.140625f,0.820313f, +0.148438f,0.820313f, +0.15625f,0.820313f, +0.164063f,0.820313f, +0.171875f,0.820313f, +0.179688f,0.820313f, +0.1875f,0.820313f, +0.195313f,0.820313f, +0.203125f,0.820313f, +0.210938f,0.820313f, +0.21875f,0.820313f, +0.226563f,0.820313f, +0.234375f,0.820313f, +0.242188f,0.820313f, +0.25f,0.820313f, +0.257813f,0.820313f, +0.265625f,0.820313f, +0.273438f,0.820313f, +0.28125f,0.820313f, +0.289063f,0.820313f, +0.296875f,0.820313f, +0.304688f,0.820313f, +0.3125f,0.820313f, +0.320313f,0.820313f, +0.328125f,0.820313f, +0.335938f,0.820313f, +0.34375f,0.820313f, +0.351563f,0.820313f, +0.359375f,0.820313f, +0.367188f,0.820313f, +0.375f,0.820313f, +0.382813f,0.820313f, +0.390625f,0.820313f, +0.398438f,0.820313f, +0.40625f,0.820313f, +0.414063f,0.820313f, +0.421875f,0.820313f, +0.429688f,0.820313f, +0.4375f,0.820313f, +0.445313f,0.820313f, +0.453125f,0.820313f, +0.460938f,0.820313f, +0.46875f,0.820313f, +0.476563f,0.820313f, +0.484375f,0.820313f, +0.492188f,0.820313f, +0.5f,0.820313f, +0.507813f,0.820313f, +0.0f,0.828125f, +0.0078125f,0.828125f, +0.015625f,0.828125f, +0.0234375f,0.828125f, +0.03125f,0.828125f, +0.0390625f,0.828125f, +0.046875f,0.828125f, +0.0546875f,0.828125f, +0.0625f,0.828125f, +0.0703125f,0.828125f, +0.078125f,0.828125f, +0.0859375f,0.828125f, +0.09375f,0.828125f, +0.101563f,0.828125f, +0.109375f,0.828125f, +0.117188f,0.828125f, +0.125f,0.828125f, +0.132813f,0.828125f, +0.140625f,0.828125f, +0.148438f,0.828125f, +0.15625f,0.828125f, +0.164063f,0.828125f, +0.171875f,0.828125f, +0.179688f,0.828125f, +0.1875f,0.828125f, +0.195313f,0.828125f, +0.203125f,0.828125f, +0.210938f,0.828125f, +0.21875f,0.828125f, +0.226563f,0.828125f, +0.234375f,0.828125f, +0.242188f,0.828125f, +0.25f,0.828125f, +0.257813f,0.828125f, +0.265625f,0.828125f, +0.273438f,0.828125f, +0.28125f,0.828125f, +0.289063f,0.828125f, +0.296875f,0.828125f, +0.304688f,0.828125f, +0.3125f,0.828125f, +0.320313f,0.828125f, +0.328125f,0.828125f, +0.335938f,0.828125f, +0.34375f,0.828125f, +0.351563f,0.828125f, +0.359375f,0.828125f, +0.367188f,0.828125f, +0.375f,0.828125f, +0.382813f,0.828125f, +0.390625f,0.828125f, +0.398438f,0.828125f, +0.40625f,0.828125f, +0.414063f,0.828125f, +0.421875f,0.828125f, +0.429688f,0.828125f, +0.4375f,0.828125f, +0.445313f,0.828125f, +0.453125f,0.828125f, +0.460938f,0.828125f, +0.46875f,0.828125f, +0.476563f,0.828125f, +0.484375f,0.828125f, +0.492188f,0.828125f, +0.5f,0.828125f, +0.507813f,0.828125f, +0.0f,0.835938f, +0.0078125f,0.835938f, +0.015625f,0.835938f, +0.0234375f,0.835938f, +0.03125f,0.835938f, +0.0390625f,0.835938f, +0.046875f,0.835938f, +0.0546875f,0.835938f, +0.0625f,0.835938f, +0.0703125f,0.835938f, +0.078125f,0.835938f, +0.0859375f,0.835938f, +0.09375f,0.835938f, +0.101563f,0.835938f, +0.109375f,0.835938f, +0.117188f,0.835938f, +0.125f,0.835938f, +0.132813f,0.835938f, +0.140625f,0.835938f, +0.148438f,0.835938f, +0.15625f,0.835938f, +0.164063f,0.835938f, +0.171875f,0.835938f, +0.179688f,0.835938f, +0.1875f,0.835938f, +0.195313f,0.835938f, +0.203125f,0.835938f, +0.210938f,0.835938f, +0.21875f,0.835938f, +0.226563f,0.835938f, +0.234375f,0.835938f, +0.242188f,0.835938f, +0.25f,0.835938f, +0.257813f,0.835938f, +0.265625f,0.835938f, +0.273438f,0.835938f, +0.28125f,0.835938f, +0.289063f,0.835938f, +0.296875f,0.835938f, +0.304688f,0.835938f, +0.3125f,0.835938f, +0.320313f,0.835938f, +0.328125f,0.835938f, +0.335938f,0.835938f, +0.34375f,0.835938f, +0.351563f,0.835938f, +0.359375f,0.835938f, +0.367188f,0.835938f, +0.375f,0.835938f, +0.382813f,0.835938f, +0.390625f,0.835938f, +0.398438f,0.835938f, +0.40625f,0.835938f, +0.414063f,0.835938f, +0.421875f,0.835938f, +0.429688f,0.835938f, +0.4375f,0.835938f, +0.445313f,0.835938f, +0.453125f,0.835938f, +0.460938f,0.835938f, +0.46875f,0.835938f, +0.476563f,0.835938f, +0.484375f,0.835938f, +0.492188f,0.835938f, +0.5f,0.835938f, +0.507813f,0.835938f, +0.0f,0.84375f, +0.0078125f,0.84375f, +0.015625f,0.84375f, +0.0234375f,0.84375f, +0.03125f,0.84375f, +0.0390625f,0.84375f, +0.046875f,0.84375f, +0.0546875f,0.84375f, +0.0625f,0.84375f, +0.0703125f,0.84375f, +0.078125f,0.84375f, +0.0859375f,0.84375f, +0.09375f,0.84375f, +0.101563f,0.84375f, +0.109375f,0.84375f, +0.117188f,0.84375f, +0.125f,0.84375f, +0.132813f,0.84375f, +0.140625f,0.84375f, +0.148438f,0.84375f, +0.15625f,0.84375f, +0.164063f,0.84375f, +0.171875f,0.84375f, +0.179688f,0.84375f, +0.1875f,0.84375f, +0.195313f,0.84375f, +0.203125f,0.84375f, +0.210938f,0.84375f, +0.21875f,0.84375f, +0.226563f,0.84375f, +0.234375f,0.84375f, +0.242188f,0.84375f, +0.25f,0.84375f, +0.257813f,0.84375f, +0.265625f,0.84375f, +0.273438f,0.84375f, +0.28125f,0.84375f, +0.289063f,0.84375f, +0.296875f,0.84375f, +0.304688f,0.84375f, +0.3125f,0.84375f, +0.320313f,0.84375f, +0.328125f,0.84375f, +0.335938f,0.84375f, +0.34375f,0.84375f, +0.351563f,0.84375f, +0.359375f,0.84375f, +0.367188f,0.84375f, +0.375f,0.84375f, +0.382813f,0.84375f, +0.390625f,0.84375f, +0.398438f,0.84375f, +0.40625f,0.84375f, +0.414063f,0.84375f, +0.421875f,0.84375f, +0.429688f,0.84375f, +0.4375f,0.84375f, +0.445313f,0.84375f, +0.453125f,0.84375f, +0.460938f,0.84375f, +0.46875f,0.84375f, +0.476563f,0.84375f, +0.484375f,0.84375f, +0.492188f,0.84375f, +0.5f,0.84375f, +0.507813f,0.84375f, +0.0f,0.851563f, +0.0078125f,0.851563f, +0.015625f,0.851563f, +0.0234375f,0.851563f, +0.03125f,0.851563f, +0.0390625f,0.851563f, +0.046875f,0.851563f, +0.0546875f,0.851563f, +0.0625f,0.851563f, +0.0703125f,0.851563f, +0.078125f,0.851563f, +0.0859375f,0.851563f, +0.09375f,0.851563f, +0.101563f,0.851563f, +0.109375f,0.851563f, +0.117188f,0.851563f, +0.125f,0.851563f, +0.132813f,0.851563f, +0.140625f,0.851563f, +0.148438f,0.851563f, +0.15625f,0.851563f, +0.164063f,0.851563f, +0.171875f,0.851563f, +0.179688f,0.851563f, +0.1875f,0.851563f, +0.195313f,0.851563f, +0.203125f,0.851563f, +0.210938f,0.851563f, +0.21875f,0.851563f, +0.226563f,0.851563f, +0.234375f,0.851563f, +0.242188f,0.851563f, +0.25f,0.851563f, +0.257813f,0.851563f, +0.265625f,0.851563f, +0.273438f,0.851563f, +0.28125f,0.851563f, +0.289063f,0.851563f, +0.296875f,0.851563f, +0.304688f,0.851563f, +0.3125f,0.851563f, +0.320313f,0.851563f, +0.328125f,0.851563f, +0.335938f,0.851563f, +0.34375f,0.851563f, +0.351563f,0.851563f, +0.359375f,0.851563f, +0.367188f,0.851563f, +0.375f,0.851563f, +0.382813f,0.851563f, +0.390625f,0.851563f, +0.398438f,0.851563f, +0.40625f,0.851563f, +0.414063f,0.851563f, +0.421875f,0.851563f, +0.429688f,0.851563f, +0.4375f,0.851563f, +0.445313f,0.851563f, +0.453125f,0.851563f, +0.460938f,0.851563f, +0.46875f,0.851563f, +0.476563f,0.851563f, +0.484375f,0.851563f, +0.492188f,0.851563f, +0.5f,0.851563f, +0.507813f,0.851563f, +0.0f,0.859375f, +0.0078125f,0.859375f, +0.015625f,0.859375f, +0.0234375f,0.859375f, +0.03125f,0.859375f, +0.0390625f,0.859375f, +0.046875f,0.859375f, +0.0546875f,0.859375f, +0.0625f,0.859375f, +0.0703125f,0.859375f, +0.078125f,0.859375f, +0.0859375f,0.859375f, +0.09375f,0.859375f, +0.101563f,0.859375f, +0.109375f,0.859375f, +0.117188f,0.859375f, +0.125f,0.859375f, +0.132813f,0.859375f, +0.140625f,0.859375f, +0.148438f,0.859375f, +0.15625f,0.859375f, +0.164063f,0.859375f, +0.171875f,0.859375f, +0.179688f,0.859375f, +0.1875f,0.859375f, +0.195313f,0.859375f, +0.203125f,0.859375f, +0.210938f,0.859375f, +0.21875f,0.859375f, +0.226563f,0.859375f, +0.234375f,0.859375f, +0.242188f,0.859375f, +0.25f,0.859375f, +0.257813f,0.859375f, +0.265625f,0.859375f, +0.273438f,0.859375f, +0.28125f,0.859375f, +0.289063f,0.859375f, +0.296875f,0.859375f, +0.304688f,0.859375f, +0.3125f,0.859375f, +0.320313f,0.859375f, +0.328125f,0.859375f, +0.335938f,0.859375f, +0.34375f,0.859375f, +0.351563f,0.859375f, +0.359375f,0.859375f, +0.367188f,0.859375f, +0.375f,0.859375f, +0.382813f,0.859375f, +0.390625f,0.859375f, +0.398438f,0.859375f, +0.40625f,0.859375f, +0.414063f,0.859375f, +0.421875f,0.859375f, +0.429688f,0.859375f, +0.4375f,0.859375f, +0.445313f,0.859375f, +0.453125f,0.859375f, +0.460938f,0.859375f, +0.46875f,0.859375f, +0.476563f,0.859375f, +0.484375f,0.859375f, +0.492188f,0.859375f, +0.5f,0.859375f, +0.507813f,0.859375f, +0.0f,0.867188f, +0.0078125f,0.867188f, +0.015625f,0.867188f, +0.0234375f,0.867188f, +0.03125f,0.867188f, +0.0390625f,0.867188f, +0.046875f,0.867188f, +0.0546875f,0.867188f, +0.0625f,0.867188f, +0.0703125f,0.867188f, +0.078125f,0.867188f, +0.0859375f,0.867188f, +0.09375f,0.867188f, +0.101563f,0.867188f, +0.109375f,0.867188f, +0.117188f,0.867188f, +0.125f,0.867188f, +0.132813f,0.867188f, +0.140625f,0.867188f, +0.148438f,0.867188f, +0.15625f,0.867188f, +0.164063f,0.867188f, +0.171875f,0.867188f, +0.179688f,0.867188f, +0.1875f,0.867188f, +0.195313f,0.867188f, +0.203125f,0.867188f, +0.210938f,0.867188f, +0.21875f,0.867188f, +0.226563f,0.867188f, +0.234375f,0.867188f, +0.242188f,0.867188f, +0.25f,0.867188f, +0.257813f,0.867188f, +0.265625f,0.867188f, +0.273438f,0.867188f, +0.28125f,0.867188f, +0.289063f,0.867188f, +0.296875f,0.867188f, +0.304688f,0.867188f, +0.3125f,0.867188f, +0.320313f,0.867188f, +0.328125f,0.867188f, +0.335938f,0.867188f, +0.34375f,0.867188f, +0.351563f,0.867188f, +0.359375f,0.867188f, +0.367188f,0.867188f, +0.375f,0.867188f, +0.382813f,0.867188f, +0.390625f,0.867188f, +0.398438f,0.867188f, +0.40625f,0.867188f, +0.414063f,0.867188f, +0.421875f,0.867188f, +0.429688f,0.867188f, +0.4375f,0.867188f, +0.445313f,0.867188f, +0.453125f,0.867188f, +0.460938f,0.867188f, +0.46875f,0.867188f, +0.476563f,0.867188f, +0.484375f,0.867188f, +0.492188f,0.867188f, +0.5f,0.867188f, +0.507813f,0.867188f, +0.0f,0.875f, +0.0078125f,0.875f, +0.015625f,0.875f, +0.0234375f,0.875f, +0.03125f,0.875f, +0.0390625f,0.875f, +0.046875f,0.875f, +0.0546875f,0.875f, +0.0625f,0.875f, +0.0703125f,0.875f, +0.078125f,0.875f, +0.0859375f,0.875f, +0.09375f,0.875f, +0.101563f,0.875f, +0.109375f,0.875f, +0.117188f,0.875f, +0.125f,0.875f, +0.132813f,0.875f, +0.140625f,0.875f, +0.148438f,0.875f, +0.15625f,0.875f, +0.164063f,0.875f, +0.171875f,0.875f, +0.179688f,0.875f, +0.1875f,0.875f, +0.195313f,0.875f, +0.203125f,0.875f, +0.210938f,0.875f, +0.21875f,0.875f, +0.226563f,0.875f, +0.234375f,0.875f, +0.242188f,0.875f, +0.25f,0.875f, +0.257813f,0.875f, +0.265625f,0.875f, +0.273438f,0.875f, +0.28125f,0.875f, +0.289063f,0.875f, +0.296875f,0.875f, +0.304688f,0.875f, +0.3125f,0.875f, +0.320313f,0.875f, +0.328125f,0.875f, +0.335938f,0.875f, +0.34375f,0.875f, +0.351563f,0.875f, +0.359375f,0.875f, +0.367188f,0.875f, +0.375f,0.875f, +0.382813f,0.875f, +0.390625f,0.875f, +0.398438f,0.875f, +0.40625f,0.875f, +0.414063f,0.875f, +0.421875f,0.875f, +0.429688f,0.875f, +0.4375f,0.875f, +0.445313f,0.875f, +0.453125f,0.875f, +0.460938f,0.875f, +0.46875f,0.875f, +0.476563f,0.875f, +0.484375f,0.875f, +0.492188f,0.875f, +0.5f,0.875f, +0.507813f,0.875f, +0.0f,0.882813f, +0.0078125f,0.882813f, +0.015625f,0.882813f, +0.0234375f,0.882813f, +0.03125f,0.882813f, +0.0390625f,0.882813f, +0.046875f,0.882813f, +0.0546875f,0.882813f, +0.0625f,0.882813f, +0.0703125f,0.882813f, +0.078125f,0.882813f, +0.0859375f,0.882813f, +0.09375f,0.882813f, +0.101563f,0.882813f, +0.109375f,0.882813f, +0.117188f,0.882813f, +0.125f,0.882813f, +0.132813f,0.882813f, +0.140625f,0.882813f, +0.148438f,0.882813f, +0.15625f,0.882813f, +0.164063f,0.882813f, +0.171875f,0.882813f, +0.179688f,0.882813f, +0.1875f,0.882813f, +0.195313f,0.882813f, +0.203125f,0.882813f, +0.210938f,0.882813f, +0.21875f,0.882813f, +0.226563f,0.882813f, +0.234375f,0.882813f, +0.242188f,0.882813f, +0.25f,0.882813f, +0.257813f,0.882813f, +0.265625f,0.882813f, +0.273438f,0.882813f, +0.28125f,0.882813f, +0.289063f,0.882813f, +0.296875f,0.882813f, +0.304688f,0.882813f, +0.3125f,0.882813f, +0.320313f,0.882813f, +0.328125f,0.882813f, +0.335938f,0.882813f, +0.34375f,0.882813f, +0.351563f,0.882813f, +0.359375f,0.882813f, +0.367188f,0.882813f, +0.375f,0.882813f, +0.382813f,0.882813f, +0.390625f,0.882813f, +0.398438f,0.882813f, +0.40625f,0.882813f, +0.414063f,0.882813f, +0.421875f,0.882813f, +0.429688f,0.882813f, +0.4375f,0.882813f, +0.445313f,0.882813f, +0.453125f,0.882813f, +0.460938f,0.882813f, +0.46875f,0.882813f, +0.476563f,0.882813f, +0.484375f,0.882813f, +0.492188f,0.882813f, +0.5f,0.882813f, +0.507813f,0.882813f, +0.0f,0.890625f, +0.0078125f,0.890625f, +0.015625f,0.890625f, +0.0234375f,0.890625f, +0.03125f,0.890625f, +0.0390625f,0.890625f, +0.046875f,0.890625f, +0.0546875f,0.890625f, +0.0625f,0.890625f, +0.0703125f,0.890625f, +0.078125f,0.890625f, +0.0859375f,0.890625f, +0.09375f,0.890625f, +0.101563f,0.890625f, +0.109375f,0.890625f, +0.117188f,0.890625f, +0.125f,0.890625f, +0.132813f,0.890625f, +0.140625f,0.890625f, +0.148438f,0.890625f, +0.15625f,0.890625f, +0.164063f,0.890625f, +0.171875f,0.890625f, +0.179688f,0.890625f, +0.1875f,0.890625f, +0.195313f,0.890625f, +0.203125f,0.890625f, +0.210938f,0.890625f, +0.21875f,0.890625f, +0.226563f,0.890625f, +0.234375f,0.890625f, +0.242188f,0.890625f, +0.25f,0.890625f, +0.257813f,0.890625f, +0.265625f,0.890625f, +0.273438f,0.890625f, +0.28125f,0.890625f, +0.289063f,0.890625f, +0.296875f,0.890625f, +0.304688f,0.890625f, +0.3125f,0.890625f, +0.320313f,0.890625f, +0.328125f,0.890625f, +0.335938f,0.890625f, +0.34375f,0.890625f, +0.351563f,0.890625f, +0.359375f,0.890625f, +0.367188f,0.890625f, +0.375f,0.890625f, +0.382813f,0.890625f, +0.390625f,0.890625f, +0.398438f,0.890625f, +0.40625f,0.890625f, +0.414063f,0.890625f, +0.421875f,0.890625f, +0.429688f,0.890625f, +0.4375f,0.890625f, +0.445313f,0.890625f, +0.453125f,0.890625f, +0.460938f,0.890625f, +0.46875f,0.890625f, +0.476563f,0.890625f, +0.484375f,0.890625f, +0.492188f,0.890625f, +0.5f,0.890625f, +0.507813f,0.890625f, +0.0f,0.898438f, +0.0078125f,0.898438f, +0.015625f,0.898438f, +0.0234375f,0.898438f, +0.03125f,0.898438f, +0.0390625f,0.898438f, +0.046875f,0.898438f, +0.0546875f,0.898438f, +0.0625f,0.898438f, +0.0703125f,0.898438f, +0.078125f,0.898438f, +0.0859375f,0.898438f, +0.09375f,0.898438f, +0.101563f,0.898438f, +0.109375f,0.898438f, +0.117188f,0.898438f, +0.125f,0.898438f, +0.132813f,0.898438f, +0.140625f,0.898438f, +0.148438f,0.898438f, +0.15625f,0.898438f, +0.164063f,0.898438f, +0.171875f,0.898438f, +0.179688f,0.898438f, +0.1875f,0.898438f, +0.195313f,0.898438f, +0.203125f,0.898438f, +0.210938f,0.898438f, +0.21875f,0.898438f, +0.226563f,0.898438f, +0.234375f,0.898438f, +0.242188f,0.898438f, +0.25f,0.898438f, +0.257813f,0.898438f, +0.265625f,0.898438f, +0.273438f,0.898438f, +0.28125f,0.898438f, +0.289063f,0.898438f, +0.296875f,0.898438f, +0.304688f,0.898438f, +0.3125f,0.898438f, +0.320313f,0.898438f, +0.328125f,0.898438f, +0.335938f,0.898438f, +0.34375f,0.898438f, +0.351563f,0.898438f, +0.359375f,0.898438f, +0.367188f,0.898438f, +0.375f,0.898438f, +0.382813f,0.898438f, +0.390625f,0.898438f, +0.398438f,0.898438f, +0.40625f,0.898438f, +0.414063f,0.898438f, +0.421875f,0.898438f, +0.429688f,0.898438f, +0.4375f,0.898438f, +0.445313f,0.898438f, +0.453125f,0.898438f, +0.460938f,0.898438f, +0.46875f,0.898438f, +0.476563f,0.898438f, +0.484375f,0.898438f, +0.492188f,0.898438f, +0.5f,0.898438f, +0.507813f,0.898438f, +0.0f,0.90625f, +0.0078125f,0.90625f, +0.015625f,0.90625f, +0.0234375f,0.90625f, +0.03125f,0.90625f, +0.0390625f,0.90625f, +0.046875f,0.90625f, +0.0546875f,0.90625f, +0.0625f,0.90625f, +0.0703125f,0.90625f, +0.078125f,0.90625f, +0.0859375f,0.90625f, +0.09375f,0.90625f, +0.101563f,0.90625f, +0.109375f,0.90625f, +0.117188f,0.90625f, +0.125f,0.90625f, +0.132813f,0.90625f, +0.140625f,0.90625f, +0.148438f,0.90625f, +0.15625f,0.90625f, +0.164063f,0.90625f, +0.171875f,0.90625f, +0.179688f,0.90625f, +0.1875f,0.90625f, +0.195313f,0.90625f, +0.203125f,0.90625f, +0.210938f,0.90625f, +0.21875f,0.90625f, +0.226563f,0.90625f, +0.234375f,0.90625f, +0.242188f,0.90625f, +0.25f,0.90625f, +0.257813f,0.90625f, +0.265625f,0.90625f, +0.273438f,0.90625f, +0.28125f,0.90625f, +0.289063f,0.90625f, +0.296875f,0.90625f, +0.304688f,0.90625f, +0.3125f,0.90625f, +0.320313f,0.90625f, +0.328125f,0.90625f, +0.335938f,0.90625f, +0.34375f,0.90625f, +0.351563f,0.90625f, +0.359375f,0.90625f, +0.367188f,0.90625f, +0.375f,0.90625f, +0.382813f,0.90625f, +0.390625f,0.90625f, +0.398438f,0.90625f, +0.40625f,0.90625f, +0.414063f,0.90625f, +0.421875f,0.90625f, +0.429688f,0.90625f, +0.4375f,0.90625f, +0.445313f,0.90625f, +0.453125f,0.90625f, +0.460938f,0.90625f, +0.46875f,0.90625f, +0.476563f,0.90625f, +0.484375f,0.90625f, +0.492188f,0.90625f, +0.5f,0.90625f, +0.507813f,0.90625f, +0.0f,0.914063f, +0.0078125f,0.914063f, +0.015625f,0.914063f, +0.0234375f,0.914063f, +0.03125f,0.914063f, +0.0390625f,0.914063f, +0.046875f,0.914063f, +0.0546875f,0.914063f, +0.0625f,0.914063f, +0.0703125f,0.914063f, +0.078125f,0.914063f, +0.0859375f,0.914063f, +0.09375f,0.914063f, +0.101563f,0.914063f, +0.109375f,0.914063f, +0.117188f,0.914063f, +0.125f,0.914063f, +0.132813f,0.914063f, +0.140625f,0.914063f, +0.148438f,0.914063f, +0.15625f,0.914063f, +0.164063f,0.914063f, +0.171875f,0.914063f, +0.179688f,0.914063f, +0.1875f,0.914063f, +0.195313f,0.914063f, +0.203125f,0.914063f, +0.210938f,0.914063f, +0.21875f,0.914063f, +0.226563f,0.914063f, +0.234375f,0.914063f, +0.242188f,0.914063f, +0.25f,0.914063f, +0.257813f,0.914063f, +0.265625f,0.914063f, +0.273438f,0.914063f, +0.28125f,0.914063f, +0.289063f,0.914063f, +0.296875f,0.914063f, +0.304688f,0.914063f, +0.3125f,0.914063f, +0.320313f,0.914063f, +0.328125f,0.914063f, +0.335938f,0.914063f, +0.34375f,0.914063f, +0.351563f,0.914063f, +0.359375f,0.914063f, +0.367188f,0.914063f, +0.375f,0.914063f, +0.382813f,0.914063f, +0.390625f,0.914063f, +0.398438f,0.914063f, +0.40625f,0.914063f, +0.414063f,0.914063f, +0.421875f,0.914063f, +0.429688f,0.914063f, +0.4375f,0.914063f, +0.445313f,0.914063f, +0.453125f,0.914063f, +0.460938f,0.914063f, +0.46875f,0.914063f, +0.476563f,0.914063f, +0.484375f,0.914063f, +0.492188f,0.914063f, +0.5f,0.914063f, +0.507813f,0.914063f, +0.0f,0.921875f, +0.0078125f,0.921875f, +0.015625f,0.921875f, +0.0234375f,0.921875f, +0.03125f,0.921875f, +0.0390625f,0.921875f, +0.046875f,0.921875f, +0.0546875f,0.921875f, +0.0625f,0.921875f, +0.0703125f,0.921875f, +0.078125f,0.921875f, +0.0859375f,0.921875f, +0.09375f,0.921875f, +0.101563f,0.921875f, +0.109375f,0.921875f, +0.117188f,0.921875f, +0.125f,0.921875f, +0.132813f,0.921875f, +0.140625f,0.921875f, +0.148438f,0.921875f, +0.15625f,0.921875f, +0.164063f,0.921875f, +0.171875f,0.921875f, +0.179688f,0.921875f, +0.1875f,0.921875f, +0.195313f,0.921875f, +0.203125f,0.921875f, +0.210938f,0.921875f, +0.21875f,0.921875f, +0.226563f,0.921875f, +0.234375f,0.921875f, +0.242188f,0.921875f, +0.25f,0.921875f, +0.257813f,0.921875f, +0.265625f,0.921875f, +0.273438f,0.921875f, +0.28125f,0.921875f, +0.289063f,0.921875f, +0.296875f,0.921875f, +0.304688f,0.921875f, +0.3125f,0.921875f, +0.320313f,0.921875f, +0.328125f,0.921875f, +0.335938f,0.921875f, +0.34375f,0.921875f, +0.351563f,0.921875f, +0.359375f,0.921875f, +0.367188f,0.921875f, +0.375f,0.921875f, +0.382813f,0.921875f, +0.390625f,0.921875f, +0.398438f,0.921875f, +0.40625f,0.921875f, +0.414063f,0.921875f, +0.421875f,0.921875f, +0.429688f,0.921875f, +0.4375f,0.921875f, +0.445313f,0.921875f, +0.453125f,0.921875f, +0.460938f,0.921875f, +0.46875f,0.921875f, +0.476563f,0.921875f, +0.484375f,0.921875f, +0.492188f,0.921875f, +0.5f,0.921875f, +0.507813f,0.921875f, +0.0f,0.929688f, +0.0078125f,0.929688f, +0.015625f,0.929688f, +0.0234375f,0.929688f, +0.03125f,0.929688f, +0.0390625f,0.929688f, +0.046875f,0.929688f, +0.0546875f,0.929688f, +0.0625f,0.929688f, +0.0703125f,0.929688f, +0.078125f,0.929688f, +0.0859375f,0.929688f, +0.09375f,0.929688f, +0.101563f,0.929688f, +0.109375f,0.929688f, +0.117188f,0.929688f, +0.125f,0.929688f, +0.132813f,0.929688f, +0.140625f,0.929688f, +0.148438f,0.929688f, +0.15625f,0.929688f, +0.164063f,0.929688f, +0.171875f,0.929688f, +0.179688f,0.929688f, +0.1875f,0.929688f, +0.195313f,0.929688f, +0.203125f,0.929688f, +0.210938f,0.929688f, +0.21875f,0.929688f, +0.226563f,0.929688f, +0.234375f,0.929688f, +0.242188f,0.929688f, +0.25f,0.929688f, +0.257813f,0.929688f, +0.265625f,0.929688f, +0.273438f,0.929688f, +0.28125f,0.929688f, +0.289063f,0.929688f, +0.296875f,0.929688f, +0.304688f,0.929688f, +0.3125f,0.929688f, +0.320313f,0.929688f, +0.328125f,0.929688f, +0.335938f,0.929688f, +0.34375f,0.929688f, +0.351563f,0.929688f, +0.359375f,0.929688f, +0.367188f,0.929688f, +0.375f,0.929688f, +0.382813f,0.929688f, +0.390625f,0.929688f, +0.398438f,0.929688f, +0.40625f,0.929688f, +0.414063f,0.929688f, +0.421875f,0.929688f, +0.429688f,0.929688f, +0.4375f,0.929688f, +0.445313f,0.929688f, +0.453125f,0.929688f, +0.460938f,0.929688f, +0.46875f,0.929688f, +0.476563f,0.929688f, +0.484375f,0.929688f, +0.492188f,0.929688f, +0.5f,0.929688f, +0.507813f,0.929688f, +0.0f,0.9375f, +0.0078125f,0.9375f, +0.015625f,0.9375f, +0.0234375f,0.9375f, +0.03125f,0.9375f, +0.0390625f,0.9375f, +0.046875f,0.9375f, +0.0546875f,0.9375f, +0.0625f,0.9375f, +0.0703125f,0.9375f, +0.078125f,0.9375f, +0.0859375f,0.9375f, +0.09375f,0.9375f, +0.101563f,0.9375f, +0.109375f,0.9375f, +0.117188f,0.9375f, +0.125f,0.9375f, +0.132813f,0.9375f, +0.140625f,0.9375f, +0.148438f,0.9375f, +0.15625f,0.9375f, +0.164063f,0.9375f, +0.171875f,0.9375f, +0.179688f,0.9375f, +0.1875f,0.9375f, +0.195313f,0.9375f, +0.203125f,0.9375f, +0.210938f,0.9375f, +0.21875f,0.9375f, +0.226563f,0.9375f, +0.234375f,0.9375f, +0.242188f,0.9375f, +0.25f,0.9375f, +0.257813f,0.9375f, +0.265625f,0.9375f, +0.273438f,0.9375f, +0.28125f,0.9375f, +0.289063f,0.9375f, +0.296875f,0.9375f, +0.304688f,0.9375f, +0.3125f,0.9375f, +0.320313f,0.9375f, +0.328125f,0.9375f, +0.335938f,0.9375f, +0.34375f,0.9375f, +0.351563f,0.9375f, +0.359375f,0.9375f, +0.367188f,0.9375f, +0.375f,0.9375f, +0.382813f,0.9375f, +0.390625f,0.9375f, +0.398438f,0.9375f, +0.40625f,0.9375f, +0.414063f,0.9375f, +0.421875f,0.9375f, +0.429688f,0.9375f, +0.4375f,0.9375f, +0.445313f,0.9375f, +0.453125f,0.9375f, +0.460938f,0.9375f, +0.46875f,0.9375f, +0.476563f,0.9375f, +0.484375f,0.9375f, +0.492188f,0.9375f, +0.5f,0.9375f, +0.507813f,0.9375f, +0.0f,0.945313f, +0.0078125f,0.945313f, +0.015625f,0.945313f, +0.0234375f,0.945313f, +0.03125f,0.945313f, +0.0390625f,0.945313f, +0.046875f,0.945313f, +0.0546875f,0.945313f, +0.0625f,0.945313f, +0.0703125f,0.945313f, +0.078125f,0.945313f, +0.0859375f,0.945313f, +0.09375f,0.945313f, +0.101563f,0.945313f, +0.109375f,0.945313f, +0.117188f,0.945313f, +0.125f,0.945313f, +0.132813f,0.945313f, +0.140625f,0.945313f, +0.148438f,0.945313f, +0.15625f,0.945313f, +0.164063f,0.945313f, +0.171875f,0.945313f, +0.179688f,0.945313f, +0.1875f,0.945313f, +0.195313f,0.945313f, +0.203125f,0.945313f, +0.210938f,0.945313f, +0.21875f,0.945313f, +0.226563f,0.945313f, +0.234375f,0.945313f, +0.242188f,0.945313f, +0.25f,0.945313f, +0.257813f,0.945313f, +0.265625f,0.945313f, +0.273438f,0.945313f, +0.28125f,0.945313f, +0.289063f,0.945313f, +0.296875f,0.945313f, +0.304688f,0.945313f, +0.3125f,0.945313f, +0.320313f,0.945313f, +0.328125f,0.945313f, +0.335938f,0.945313f, +0.34375f,0.945313f, +0.351563f,0.945313f, +0.359375f,0.945313f, +0.367188f,0.945313f, +0.375f,0.945313f, +0.382813f,0.945313f, +0.390625f,0.945313f, +0.398438f,0.945313f, +0.40625f,0.945313f, +0.414063f,0.945313f, +0.421875f,0.945313f, +0.429688f,0.945313f, +0.4375f,0.945313f, +0.445313f,0.945313f, +0.453125f,0.945313f, +0.460938f,0.945313f, +0.46875f,0.945313f, +0.476563f,0.945313f, +0.484375f,0.945313f, +0.492188f,0.945313f, +0.5f,0.945313f, +0.507813f,0.945313f, +0.0f,0.953125f, +0.0078125f,0.953125f, +0.015625f,0.953125f, +0.0234375f,0.953125f, +0.03125f,0.953125f, +0.0390625f,0.953125f, +0.046875f,0.953125f, +0.0546875f,0.953125f, +0.0625f,0.953125f, +0.0703125f,0.953125f, +0.078125f,0.953125f, +0.0859375f,0.953125f, +0.09375f,0.953125f, +0.101563f,0.953125f, +0.109375f,0.953125f, +0.117188f,0.953125f, +0.125f,0.953125f, +0.132813f,0.953125f, +0.140625f,0.953125f, +0.148438f,0.953125f, +0.15625f,0.953125f, +0.164063f,0.953125f, +0.171875f,0.953125f, +0.179688f,0.953125f, +0.1875f,0.953125f, +0.195313f,0.953125f, +0.203125f,0.953125f, +0.210938f,0.953125f, +0.21875f,0.953125f, +0.226563f,0.953125f, +0.234375f,0.953125f, +0.242188f,0.953125f, +0.25f,0.953125f, +0.257813f,0.953125f, +0.265625f,0.953125f, +0.273438f,0.953125f, +0.28125f,0.953125f, +0.289063f,0.953125f, +0.296875f,0.953125f, +0.304688f,0.953125f, +0.3125f,0.953125f, +0.320313f,0.953125f, +0.328125f,0.953125f, +0.335938f,0.953125f, +0.34375f,0.953125f, +0.351563f,0.953125f, +0.359375f,0.953125f, +0.367188f,0.953125f, +0.375f,0.953125f, +0.382813f,0.953125f, +0.390625f,0.953125f, +0.398438f,0.953125f, +0.40625f,0.953125f, +0.414063f,0.953125f, +0.421875f,0.953125f, +0.429688f,0.953125f, +0.4375f,0.953125f, +0.445313f,0.953125f, +0.453125f,0.953125f, +0.460938f,0.953125f, +0.46875f,0.953125f, +0.476563f,0.953125f, +0.484375f,0.953125f, +0.492188f,0.953125f, +0.5f,0.953125f, +0.507813f,0.953125f, +0.0f,0.960938f, +0.0078125f,0.960938f, +0.015625f,0.960938f, +0.0234375f,0.960938f, +0.03125f,0.960938f, +0.0390625f,0.960938f, +0.046875f,0.960938f, +0.0546875f,0.960938f, +0.0625f,0.960938f, +0.0703125f,0.960938f, +0.078125f,0.960938f, +0.0859375f,0.960938f, +0.09375f,0.960938f, +0.101563f,0.960938f, +0.109375f,0.960938f, +0.117188f,0.960938f, +0.125f,0.960938f, +0.132813f,0.960938f, +0.140625f,0.960938f, +0.148438f,0.960938f, +0.15625f,0.960938f, +0.164063f,0.960938f, +0.171875f,0.960938f, +0.179688f,0.960938f, +0.1875f,0.960938f, +0.195313f,0.960938f, +0.203125f,0.960938f, +0.210938f,0.960938f, +0.21875f,0.960938f, +0.226563f,0.960938f, +0.234375f,0.960938f, +0.242188f,0.960938f, +0.25f,0.960938f, +0.257813f,0.960938f, +0.265625f,0.960938f, +0.273438f,0.960938f, +0.28125f,0.960938f, +0.289063f,0.960938f, +0.296875f,0.960938f, +0.304688f,0.960938f, +0.3125f,0.960938f, +0.320313f,0.960938f, +0.328125f,0.960938f, +0.335938f,0.960938f, +0.34375f,0.960938f, +0.351563f,0.960938f, +0.359375f,0.960938f, +0.367188f,0.960938f, +0.375f,0.960938f, +0.382813f,0.960938f, +0.390625f,0.960938f, +0.398438f,0.960938f, +0.40625f,0.960938f, +0.414063f,0.960938f, +0.421875f,0.960938f, +0.429688f,0.960938f, +0.4375f,0.960938f, +0.445313f,0.960938f, +0.453125f,0.960938f, +0.460938f,0.960938f, +0.46875f,0.960938f, +0.476563f,0.960938f, +0.484375f,0.960938f, +0.492188f,0.960938f, +0.5f,0.960938f, +0.507813f,0.960938f, +0.0f,0.96875f, +0.0078125f,0.96875f, +0.015625f,0.96875f, +0.0234375f,0.96875f, +0.03125f,0.96875f, +0.0390625f,0.96875f, +0.046875f,0.96875f, +0.0546875f,0.96875f, +0.0625f,0.96875f, +0.0703125f,0.96875f, +0.078125f,0.96875f, +0.0859375f,0.96875f, +0.09375f,0.96875f, +0.101563f,0.96875f, +0.109375f,0.96875f, +0.117188f,0.96875f, +0.125f,0.96875f, +0.132813f,0.96875f, +0.140625f,0.96875f, +0.148438f,0.96875f, +0.15625f,0.96875f, +0.164063f,0.96875f, +0.171875f,0.96875f, +0.179688f,0.96875f, +0.1875f,0.96875f, +0.195313f,0.96875f, +0.203125f,0.96875f, +0.210938f,0.96875f, +0.21875f,0.96875f, +0.226563f,0.96875f, +0.234375f,0.96875f, +0.242188f,0.96875f, +0.25f,0.96875f, +0.257813f,0.96875f, +0.265625f,0.96875f, +0.273438f,0.96875f, +0.28125f,0.96875f, +0.289063f,0.96875f, +0.296875f,0.96875f, +0.304688f,0.96875f, +0.3125f,0.96875f, +0.320313f,0.96875f, +0.328125f,0.96875f, +0.335938f,0.96875f, +0.34375f,0.96875f, +0.351563f,0.96875f, +0.359375f,0.96875f, +0.367188f,0.96875f, +0.375f,0.96875f, +0.382813f,0.96875f, +0.390625f,0.96875f, +0.398438f,0.96875f, +0.40625f,0.96875f, +0.414063f,0.96875f, +0.421875f,0.96875f, +0.429688f,0.96875f, +0.4375f,0.96875f, +0.445313f,0.96875f, +0.453125f,0.96875f, +0.460938f,0.96875f, +0.46875f,0.96875f, +0.476563f,0.96875f, +0.484375f,0.96875f, +0.492188f,0.96875f, +0.5f,0.96875f, +0.507813f,0.96875f, +0.0f,0.976563f, +0.0078125f,0.976563f, +0.015625f,0.976563f, +0.0234375f,0.976563f, +0.03125f,0.976563f, +0.0390625f,0.976563f, +0.046875f,0.976563f, +0.0546875f,0.976563f, +0.0625f,0.976563f, +0.0703125f,0.976563f, +0.078125f,0.976563f, +0.0859375f,0.976563f, +0.09375f,0.976563f, +0.101563f,0.976563f, +0.109375f,0.976563f, +0.117188f,0.976563f, +0.125f,0.976563f, +0.132813f,0.976563f, +0.140625f,0.976563f, +0.148438f,0.976563f, +0.15625f,0.976563f, +0.164063f,0.976563f, +0.171875f,0.976563f, +0.179688f,0.976563f, +0.1875f,0.976563f, +0.195313f,0.976563f, +0.203125f,0.976563f, +0.210938f,0.976563f, +0.21875f,0.976563f, +0.226563f,0.976563f, +0.234375f,0.976563f, +0.242188f,0.976563f, +0.25f,0.976563f, +0.257813f,0.976563f, +0.265625f,0.976563f, +0.273438f,0.976563f, +0.28125f,0.976563f, +0.289063f,0.976563f, +0.296875f,0.976563f, +0.304688f,0.976563f, +0.3125f,0.976563f, +0.320313f,0.976563f, +0.328125f,0.976563f, +0.335938f,0.976563f, +0.34375f,0.976563f, +0.351563f,0.976563f, +0.359375f,0.976563f, +0.367188f,0.976563f, +0.375f,0.976563f, +0.382813f,0.976563f, +0.390625f,0.976563f, +0.398438f,0.976563f, +0.40625f,0.976563f, +0.414063f,0.976563f, +0.421875f,0.976563f, +0.429688f,0.976563f, +0.4375f,0.976563f, +0.445313f,0.976563f, +0.453125f,0.976563f, +0.460938f,0.976563f, +0.46875f,0.976563f, +0.476563f,0.976563f, +0.484375f,0.976563f, +0.492188f,0.976563f, +0.5f,0.976563f, +0.507813f,0.976563f, +0.0f,0.984375f, +0.0078125f,0.984375f, +0.015625f,0.984375f, +0.0234375f,0.984375f, +0.03125f,0.984375f, +0.0390625f,0.984375f, +0.046875f,0.984375f, +0.0546875f,0.984375f, +0.0625f,0.984375f, +0.0703125f,0.984375f, +0.078125f,0.984375f, +0.0859375f,0.984375f, +0.09375f,0.984375f, +0.101563f,0.984375f, +0.109375f,0.984375f, +0.117188f,0.984375f, +0.125f,0.984375f, +0.132813f,0.984375f, +0.140625f,0.984375f, +0.148438f,0.984375f, +0.15625f,0.984375f, +0.164063f,0.984375f, +0.171875f,0.984375f, +0.179688f,0.984375f, +0.1875f,0.984375f, +0.195313f,0.984375f, +0.203125f,0.984375f, +0.210938f,0.984375f, +0.21875f,0.984375f, +0.226563f,0.984375f, +0.234375f,0.984375f, +0.242188f,0.984375f, +0.25f,0.984375f, +0.257813f,0.984375f, +0.265625f,0.984375f, +0.273438f,0.984375f, +0.28125f,0.984375f, +0.289063f,0.984375f, +0.296875f,0.984375f, +0.304688f,0.984375f, +0.3125f,0.984375f, +0.320313f,0.984375f, +0.328125f,0.984375f, +0.335938f,0.984375f, +0.34375f,0.984375f, +0.351563f,0.984375f, +0.359375f,0.984375f, +0.367188f,0.984375f, +0.375f,0.984375f, +0.382813f,0.984375f, +0.390625f,0.984375f, +0.398438f,0.984375f, +0.40625f,0.984375f, +0.414063f,0.984375f, +0.421875f,0.984375f, +0.429688f,0.984375f, +0.4375f,0.984375f, +0.445313f,0.984375f, +0.453125f,0.984375f, +0.460938f,0.984375f, +0.46875f,0.984375f, +0.476563f,0.984375f, +0.484375f,0.984375f, +0.492188f,0.984375f, +0.5f,0.984375f, +0.507813f,0.984375f, +0.0f,0.992188f, +0.0078125f,0.992188f, +0.015625f,0.992188f, +0.0234375f,0.992188f, +0.03125f,0.992188f, +0.0390625f,0.992188f, +0.046875f,0.992188f, +0.0546875f,0.992188f, +0.0625f,0.992188f, +0.0703125f,0.992188f, +0.078125f,0.992188f, +0.0859375f,0.992188f, +0.09375f,0.992188f, +0.101563f,0.992188f, +0.109375f,0.992188f, +0.117188f,0.992188f, +0.125f,0.992188f, +0.132813f,0.992188f, +0.140625f,0.992188f, +0.148438f,0.992188f, +0.15625f,0.992188f, +0.164063f,0.992188f, +0.171875f,0.992188f, +0.179688f,0.992188f, +0.1875f,0.992188f, +0.195313f,0.992188f, +0.203125f,0.992188f, +0.210938f,0.992188f, +0.21875f,0.992188f, +0.226563f,0.992188f, +0.234375f,0.992188f, +0.242188f,0.992188f, +0.25f,0.992188f, +0.257813f,0.992188f, +0.265625f,0.992188f, +0.273438f,0.992188f, +0.28125f,0.992188f, +0.289063f,0.992188f, +0.296875f,0.992188f, +0.304688f,0.992188f, +0.3125f,0.992188f, +0.320313f,0.992188f, +0.328125f,0.992188f, +0.335938f,0.992188f, +0.34375f,0.992188f, +0.351563f,0.992188f, +0.359375f,0.992188f, +0.367188f,0.992188f, +0.375f,0.992188f, +0.382813f,0.992188f, +0.390625f,0.992188f, +0.398438f,0.992188f, +0.40625f,0.992188f, +0.414063f,0.992188f, +0.421875f,0.992188f, +0.429688f,0.992188f, +0.4375f,0.992188f, +0.445313f,0.992188f, +0.453125f,0.992188f, +0.460938f,0.992188f, +0.46875f,0.992188f, +0.476563f,0.992188f, +0.484375f,0.992188f, +0.492188f,0.992188f, +0.5f,0.992188f, +0.507813f,0.992188f, +0.0f,1.0f, +0.0078125f,1.0f, +0.015625f,1.0f, +0.0234375f,1.0f, +0.03125f,1.0f, +0.0390625f,1.0f, +0.046875f,1.0f, +0.0546875f,1.0f, +0.0625f,1.0f, +0.0703125f,1.0f, +0.078125f,1.0f, +0.0859375f,1.0f, +0.09375f,1.0f, +0.101563f,1.0f, +0.109375f,1.0f, +0.117188f,1.0f, +0.125f,1.0f, +0.132813f,1.0f, +0.140625f,1.0f, +0.148438f,1.0f, +0.15625f,1.0f, +0.164063f,1.0f, +0.171875f,1.0f, +0.179688f,1.0f, +0.1875f,1.0f, +0.195313f,1.0f, +0.203125f,1.0f, +0.210938f,1.0f, +0.21875f,1.0f, +0.226563f,1.0f, +0.234375f,1.0f, +0.242188f,1.0f, +0.25f,1.0f, +0.257813f,1.0f, +0.265625f,1.0f, +0.273438f,1.0f, +0.28125f,1.0f, +0.289063f,1.0f, +0.296875f,1.0f, +0.304688f,1.0f, +0.3125f,1.0f, +0.320313f,1.0f, +0.328125f,1.0f, +0.335938f,1.0f, +0.34375f,1.0f, +0.351563f,1.0f, +0.359375f,1.0f, +0.367188f,1.0f, +0.375f,1.0f, +0.382813f,1.0f, +0.390625f,1.0f, +0.398438f,1.0f, +0.40625f,1.0f, +0.414063f,1.0f, +0.421875f,1.0f, +0.429688f,1.0f, +0.4375f,1.0f, +0.445313f,1.0f, +0.453125f,1.0f, +0.460938f,1.0f, +0.46875f,1.0f, +0.476563f,1.0f, +0.484375f,1.0f, +0.492188f,1.0f, +0.5f,1.0f, +0.507813f,1.0f, +}; + +unsigned short Landscape08Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +}; + +#define Landscape01VtxCount 2048 +#define Landscape01IdxCount 11718 + +btScalar Landscape01Vtx[] = { +3.90626f,0.452911f,246.094f, +3.90626f,1.52302f,250.0f, +7.8125f,1.18238f,246.094f, +7.81251f,1.7549f,250.0f, +11.7188f,2.12911f,246.094f, +11.7188f,2.62454f,250.0f, +15.625f,3.01456f,246.094f, +15.625f,3.22814f,250.0f, +19.5313f,3.97431f,246.094f, +19.5313f,3.63231f,250.0f, +23.4375f,4.08741f,246.094f, +23.4375f,4.24097f,250.0f, +27.3438f,5.8163f,246.094f, +27.3438f,5.93409f,250.0f, +31.25f,6.86809f,246.094f, +31.25f,7.34105f,250.0f, +35.1563f,8.25405f,246.094f, +35.1563f,8.62507f,250.0f, +39.0625f,8.38601f,246.094f, +39.0625f,8.68483f,250.0f, +42.9688f,6.94797f,246.094f, +42.9688f,7.71847f,250.0f, +46.875f,4.60698f,246.094f, +46.875f,6.12159f,250.0f, +50.7813f,3.6429f,246.094f, +50.7813f,5.13002f,250.0f, +54.6875f,4.01945f,246.094f, +54.6875f,5.50476f,250.0f, +58.5938f,4.05996f,246.094f, +58.5938f,5.31917f,250.0f, +62.5f,3.98995f,246.094f, +62.5f,5.51823f,250.0f, +66.4063f,5.44402f,246.094f, +66.4063f,6.80029f,250.0f, +70.3125f,6.03873f,246.094f, +70.3125f,7.41783f,250.0f, +74.2188f,6.37187f,246.094f, +74.2188f,8.16051f,250.0f, +78.125f,6.74414f,246.094f, +78.125f,8.72099f,250.0f, +82.0313f,7.37958f,246.094f, +82.0313f,10.1125f,250.0f, +85.9375f,8.97782f,246.094f, +85.9375f,10.4624f,250.0f, +89.8438f,11.0829f,246.094f, +89.8438f,11.6403f,250.0f, +93.75f,12.3286f,246.094f, +93.75f,13.1378f,250.0f, +97.6563f,13.5966f,246.094f, +97.6563f,14.2949f,250.0f, +101.563f,15.5602f,246.094f, +101.563f,16.9487f,250.0f, +105.469f,16.9944f,246.094f, +105.469f,18.1946f,250.0f, +109.375f,17.886f,246.094f, +109.375f,19.5101f,250.0f, +113.281f,18.9289f,246.094f, +113.281f,20.9286f,250.0f, +117.188f,18.9873f,246.094f, +117.188f,20.0636f,250.0f, +121.094f,18.4954f,246.094f, +121.094f,20.5657f,250.0f, +125.0f,20.1484f,246.094f, +125.0f,21.1466f,250.0f, +128.906f,20.5032f,246.094f, +128.906f,22.3026f,250.0f, +132.813f,21.212f,246.094f, +132.813f,22.9139f,250.0f, +136.719f,22.289f,246.094f, +136.719f,24.4671f,250.0f, +140.625f,23.2441f,246.094f, +140.625f,24.3276f,250.0f, +144.531f,22.4971f,246.094f, +144.531f,24.3128f,250.0f, +148.438f,22.6347f,246.094f, +148.438f,23.8291f,250.0f, +152.344f,23.5767f,246.094f, +152.344f,24.1369f,250.0f, +156.25f,25.193f,246.094f, +156.25f,24.9132f,250.0f, +160.156f,25.2521f,246.094f, +160.156f,24.7251f,250.0f, +164.063f,25.7424f,246.094f, +164.063f,24.1169f,250.0f, +167.969f,24.3269f,246.094f, +167.969f,24.6092f,250.0f, +171.875f,25.0479f,246.094f, +171.875f,24.967f,250.0f, +175.781f,25.0107f,246.094f, +175.781f,24.7879f,250.0f, +179.688f,23.583f,246.094f, +179.688f,22.6841f,250.0f, +183.594f,20.958f,246.094f, +183.594f,20.6584f,250.0f, +187.5f,19.7535f,246.094f, +187.5f,20.0313f,250.0f, +191.406f,20.4707f,246.094f, +191.406f,20.3896f,250.0f, +195.313f,19.7551f,246.094f, +195.313f,21.5643f,250.0f, +199.219f,19.698f,246.094f, +199.219f,21.5733f,250.0f, +203.125f,20.0732f,246.094f, +203.125f,20.38f,250.0f, +207.031f,19.8667f,246.094f, +207.031f,19.3779f,250.0f, +210.938f,19.4501f,246.094f, +210.938f,19.5994f,250.0f, +214.844f,19.2918f,246.094f, +214.844f,19.0966f,250.0f, +218.75f,18.7652f,246.094f, +218.75f,19.9256f,250.0f, +222.656f,18.8129f,246.094f, +222.656f,19.8704f,250.0f, +226.563f,18.3547f,246.094f, +226.563f,18.8671f,250.0f, +230.469f,16.9801f,246.094f, +230.469f,17.4931f,250.0f, +234.375f,15.6173f,246.094f, +234.375f,16.1699f,250.0f, +238.281f,15.549f,246.094f, +238.281f,15.3704f,250.0f, +242.188f,15.2468f,246.094f, +242.188f,15.0306f,250.0f, +246.094f,14.1325f,246.094f, +246.094f,14.2622f,250.0f, +250.0f,14.4063f,246.094f, +250.0f,14.3657f,250.0f, +3.90626f,2.21488f,242.188f, +7.81252f,2.28606f,242.188f, +11.7188f,3.88428f,242.188f, +15.625f,3.39117f,242.188f, +19.5313f,3.64824f,242.188f, +23.4375f,4.14072f,242.188f, +27.3438f,5.74104f,242.188f, +31.25f,6.66142f,242.188f, +35.1563f,7.31371f,242.188f, +39.0625f,7.68371f,242.188f, +42.9688f,6.99041f,242.188f, +46.875f,4.89778f,242.188f, +50.7813f,2.64913f,242.188f, +54.6875f,2.76175f,242.188f, +58.5938f,3.10499f,242.188f, +62.5f,4.61915f,242.188f, +66.4063f,5.36769f,242.188f, +70.3125f,5.41759f,242.188f, +74.2188f,5.42279f,242.188f, +78.125f,5.53934f,242.188f, +82.0313f,5.38421f,242.188f, +85.9375f,7.77227f,242.188f, +89.8438f,9.40622f,242.188f, +93.75f,11.2904f,242.188f, +97.6563f,12.0748f,242.188f, +101.563f,14.1058f,242.188f, +105.469f,15.1513f,242.188f, +109.375f,15.9477f,242.188f, +113.281f,16.843f,242.188f, +117.188f,17.2117f,242.188f, +121.094f,18.2641f,242.188f, +125.0f,18.8672f,242.188f, +128.906f,19.3239f,242.188f, +132.813f,20.1067f,242.188f, +136.719f,20.8307f,242.188f, +140.625f,21.3646f,242.188f, +144.531f,21.6047f,242.188f, +148.438f,22.2456f,242.188f, +152.344f,23.5103f,242.188f, +156.25f,24.8533f,242.188f, +160.156f,25.4504f,242.188f, +164.063f,25.9357f,242.188f, +167.969f,24.8535f,242.188f, +171.875f,25.3099f,242.188f, +175.781f,25.3494f,242.188f, +179.688f,24.2229f,242.188f, +183.594f,21.0829f,242.188f, +187.5f,19.574f,242.188f, +191.406f,19.9835f,242.188f, +195.313f,19.6061f,242.188f, +199.219f,18.9509f,242.188f, +203.125f,20.1818f,242.188f, +207.031f,19.2962f,242.188f, +210.938f,18.8908f,242.188f, +214.844f,18.7996f,242.188f, +218.75f,18.7982f,242.188f, +222.656f,18.3283f,242.188f, +226.563f,17.7287f,242.188f, +230.469f,15.6882f,242.188f, +234.375f,15.2468f,242.188f, +238.281f,15.2703f,242.188f, +242.188f,14.4812f,242.188f, +246.094f,14.5597f,242.188f, +250.0f,14.178f,242.188f, +3.90626f,3.04396f,238.281f, +7.81252f,3.88428f,238.281f, +11.7188f,4.51367f,238.281f, +15.625f,4.1993f,238.281f, +19.5313f,4.48585f,238.281f, +23.4375f,5.11452f,238.281f, +27.3438f,4.98441f,238.281f, +31.25f,5.77536f,238.281f, +35.1563f,5.42743f,238.281f, +39.0625f,6.4581f,238.281f, +42.9688f,5.55272f,238.281f, +46.875f,3.69555f,238.281f, +50.7813f,3.08321f,238.281f, +54.6875f,2.96664f,238.281f, +58.5938f,3.94595f,238.281f, +62.5f,4.71605f,238.281f, +66.4063f,5.07906f,238.281f, +70.3125f,5.39291f,238.281f, +74.2188f,4.29289f,238.281f, +78.125f,4.20855f,238.281f, +82.0313f,5.10829f,238.281f, +85.9375f,5.48654f,238.281f, +89.8438f,7.06082f,238.281f, +93.75f,8.6827f,238.281f, +97.6563f,9.99779f,238.281f, +101.563f,11.9757f,238.281f, +105.469f,12.9031f,238.281f, +109.375f,13.7947f,238.281f, +113.281f,13.6154f,238.281f, +117.188f,15.9897f,238.281f, +121.094f,18.0884f,238.281f, +125.0f,18.714f,238.281f, +128.906f,19.1457f,238.281f, +132.813f,20.0791f,238.281f, +136.719f,20.3929f,238.281f, +140.625f,20.8277f,238.281f, +144.531f,21.2111f,238.281f, +148.438f,22.5091f,238.281f, +152.344f,23.9188f,238.281f, +156.25f,25.0278f,238.281f, +160.156f,25.8335f,238.281f, +164.063f,25.6558f,238.281f, +167.969f,24.3663f,238.281f, +171.875f,30.6775f,238.281f, +175.781f,30.89f,238.281f, +179.688f,29.2543f,238.281f, +183.594f,26.6241f,238.281f, +187.5f,24.7124f,238.281f, +191.406f,23.7048f,238.281f, +195.313f,23.3839f,238.281f, +199.219f,23.312f,238.281f, +203.125f,17.5221f,238.281f, +207.031f,17.418f,238.281f, +210.938f,17.5259f,238.281f, +214.844f,18.2392f,238.281f, +218.75f,18.6793f,238.281f, +222.656f,18.3701f,238.281f, +226.563f,17.2487f,238.281f, +230.469f,16.4f,238.281f, +234.375f,15.4998f,238.281f, +238.281f,14.6207f,238.281f, +242.188f,14.3055f,238.281f, +246.094f,14.2255f,238.281f, +250.0f,14.1326f,238.281f, +3.90626f,5.19166f,234.375f, +7.81252f,4.93292f,234.375f, +11.7188f,4.03413f,234.375f, +15.625f,3.70957f,234.375f, +19.5313f,4.44484f,234.375f, +23.4375f,5.12277f,234.375f, +27.3438f,4.60029f,234.375f, +31.25f,4.55048f,234.375f, +35.1563f,4.78512f,234.375f, +39.0625f,4.94627f,234.375f, +42.9688f,5.03351f,234.375f, +46.875f,3.08166f,234.375f, +50.7813f,2.57752f,234.375f, +54.6875f,3.08533f,234.375f, +58.5938f,4.0254f,234.375f, +62.5f,4.57575f,234.375f, +66.4063f,4.67125f,234.375f, +70.3125f,4.5612f,234.375f, +74.2188f,4.232f,234.375f, +78.125f,4.1571f,234.375f, +82.0313f,4.20157f,234.375f, +85.9375f,4.29102f,234.375f, +89.8438f,5.54826f,234.375f, +93.75f,7.06094f,234.375f, +97.6563f,8.27366f,234.375f, +101.563f,9.83852f,234.375f, +105.469f,10.9262f,234.375f, +109.375f,11.7812f,234.375f, +113.281f,13.8453f,234.375f, +117.188f,15.5538f,234.375f, +121.094f,16.8977f,234.375f, +125.0f,18.2996f,234.375f, +128.906f,19.6512f,234.375f, +132.813f,19.411f,234.375f, +136.719f,19.3317f,234.375f, +140.625f,20.656f,234.375f, +144.531f,21.6048f,234.375f, +148.438f,22.2246f,234.375f, +152.344f,23.6649f,234.375f, +156.25f,24.8772f,234.375f, +160.156f,27.6423f,234.375f, +164.063f,29.4442f,234.375f, +167.969f,29.6691f,234.375f, +171.875f,30.0772f,234.375f, +175.781f,30.3189f,234.375f, +179.688f,28.7319f,234.375f, +183.594f,26.6952f,234.375f, +187.5f,25.3375f,234.375f, +191.406f,24.1666f,234.375f, +195.313f,22.5458f,234.375f, +199.219f,22.2182f,234.375f, +203.125f,22.2413f,234.375f, +207.031f,21.8533f,234.375f, +210.938f,17.4596f,234.375f, +214.844f,17.2677f,234.375f, +218.75f,16.9584f,234.375f, +222.656f,16.6188f,234.375f, +226.563f,17.4388f,234.375f, +230.469f,16.936f,234.375f, +234.375f,15.6181f,234.375f, +238.281f,15.8373f,234.375f, +242.188f,15.0881f,234.375f, +246.094f,14.2247f,234.375f, +250.0f,14.111f,234.375f, +3.90626f,5.885f,230.469f, +7.81251f,5.4786f,230.469f, +11.7188f,5.0584f,230.469f, +15.625f,4.10283f,230.469f, +19.5313f,4.10569f,230.469f, +23.4375f,4.42202f,230.469f, +27.3438f,4.27849f,230.469f, +31.25f,4.25612f,230.469f, +35.1563f,3.83542f,230.469f, +39.0625f,3.37515f,230.469f, +42.9688f,4.16288f,230.469f, +46.875f,2.84197f,230.469f, +50.7813f,2.83467f,230.469f, +54.6875f,3.07874f,230.469f, +58.5938f,3.37745f,230.469f, +62.5f,4.09612f,230.469f, +66.4063f,4.65777f,230.469f, +70.3125f,4.45712f,230.469f, +74.2188f,3.89296f,230.469f, +78.125f,3.87471f,230.469f, +82.0313f,4.64568f,230.469f, +85.9375f,5.82987f,230.469f, +89.8438f,6.40084f,230.469f, +93.75f,7.65914f,230.469f, +97.6563f,8.07052f,230.469f, +101.563f,9.86632f,230.469f, +105.469f,11.8636f,230.469f, +109.375f,12.9547f,230.469f, +113.281f,14.2745f,230.469f, +117.188f,15.6876f,230.469f, +121.094f,17.2089f,230.469f, +125.0f,18.1267f,230.469f, +128.906f,19.379f,230.469f, +132.813f,19.2097f,230.469f, +136.719f,18.9335f,230.469f, +140.625f,19.9763f,230.469f, +144.531f,21.5401f,230.469f, +148.438f,21.7302f,230.469f, +152.344f,23.0108f,230.469f, +156.25f,28.7387f,230.469f, +160.156f,28.4179f,230.469f, +164.063f,28.6483f,230.469f, +167.969f,29.5567f,230.469f, +171.875f,29.589f,230.469f, +175.781f,29.7943f,230.469f, +179.688f,28.0587f,230.469f, +183.594f,27.6387f,230.469f, +187.5f,26.92f,230.469f, +191.406f,25.7995f,230.469f, +195.313f,23.8573f,230.469f, +199.219f,22.1543f,230.469f, +203.125f,21.8606f,230.469f, +207.031f,21.7644f,230.469f, +210.938f,22.284f,230.469f, +214.844f,22.465f,230.469f, +218.75f,16.4018f,230.469f, +222.656f,16.1053f,230.469f, +226.563f,16.9553f,230.469f, +230.469f,16.9851f,230.469f, +234.375f,16.0967f,230.469f, +238.281f,15.9758f,230.469f, +242.188f,15.3258f,230.469f, +246.094f,15.2909f,230.469f, +250.0f,14.7208f,230.469f, +3.90626f,6.89682f,226.563f, +7.81251f,6.58742f,226.563f, +11.7188f,6.03516f,226.563f, +15.625f,4.72243f,226.563f, +19.5313f,3.6445f,226.563f, +23.4375f,4.35761f,226.563f, +27.3438f,4.11714f,226.563f, +31.25f,4.31125f,226.563f, +35.1563f,3.42415f,226.563f, +39.0625f,2.29216f,226.563f, +42.9688f,2.47915f,226.563f, +46.875f,2.26767f,226.563f, +50.7813f,1.11914f,226.563f, +54.6875f,2.43266f,226.563f, +58.5938f,3.88718f,226.563f, +62.5f,3.9963f,226.563f, +66.4063f,4.30547f,226.563f, +70.3125f,4.43739f,226.563f, +74.2188f,3.89069f,226.563f, +78.125f,4.12082f,226.563f, +82.0313f,5.53252f,226.563f, +85.9375f,6.38493f,226.563f, +89.8438f,6.79959f,226.563f, +93.75f,8.29598f,226.563f, +97.6563f,8.48723f,226.563f, +101.563f,9.93554f,226.563f, +105.469f,11.5657f,226.563f, +109.375f,13.0486f,226.563f, +113.281f,13.8621f,226.563f, +117.188f,14.9688f,226.563f, +121.094f,16.3799f,226.563f, +125.0f,17.1973f,226.563f, +128.906f,17.376f,226.563f, +132.813f,18.1073f,226.563f, +136.719f,18.6844f,226.563f, +140.625f,18.5161f,226.563f, +144.531f,20.7617f,226.563f, +148.438f,21.0578f,226.563f, +152.344f,26.44f,226.563f, +156.25f,27.1807f,226.563f, +160.156f,27.2962f,226.563f, +164.063f,28.0507f,226.563f, +167.969f,28.6572f,226.563f, +171.875f,28.3487f,226.563f, +175.781f,23.7294f,226.563f, +179.688f,23.1113f,226.563f, +183.594f,22.5708f,226.563f, +187.5f,22.6165f,226.563f, +191.406f,21.8697f,226.563f, +195.313f,19.9841f,226.563f, +199.219f,22.9835f,226.563f, +203.125f,22.0743f,226.563f, +207.031f,22.4886f,226.563f, +210.938f,22.2516f,226.563f, +214.844f,22.3739f,226.563f, +218.75f,22.7815f,226.563f, +222.656f,17.0366f,226.563f, +226.563f,16.1334f,226.563f, +230.469f,16.9265f,226.563f, +234.375f,17.1793f,226.563f, +238.281f,17.3365f,226.563f, +242.188f,16.1971f,226.563f, +246.094f,15.2775f,226.563f, +250.0f,15.1313f,226.563f, +3.90626f,6.81349f,222.656f, +7.81251f,7.23848f,222.656f, +11.7188f,6.09864f,222.656f, +15.625f,4.9545f,222.656f, +19.5313f,3.88133f,222.656f, +23.4375f,4.06964f,222.656f, +27.3438f,3.90589f,222.656f, +31.25f,4.08304f,222.656f, +35.1563f,3.26204f,222.656f, +39.0625f,1.53457f,222.656f, +42.9688f,1.90835f,222.656f, +46.875f,1.98509f,222.656f, +50.7813f,2.14652f,222.656f, +54.6875f,2.7418f,222.656f, +58.5938f,3.74695f,222.656f, +62.5f,4.00354f,222.656f, +66.4063f,4.38792f,222.656f, +70.3125f,3.93121f,222.656f, +74.2188f,3.42647f,222.656f, +78.125f,5.0562f,222.656f, +82.0313f,5.98572f,222.656f, +85.9375f,6.52919f,222.656f, +89.8438f,6.83394f,222.656f, +93.75f,7.48974f,222.656f, +97.6563f,8.19267f,222.656f, +101.563f,9.33438f,222.656f, +105.469f,11.8423f,222.656f, +109.375f,13.1158f,222.656f, +113.281f,13.8944f,222.656f, +117.188f,14.8014f,222.656f, +121.094f,15.4129f,222.656f, +125.0f,15.6942f,222.656f, +128.906f,16.2049f,222.656f, +132.813f,17.0318f,222.656f, +136.719f,18.5423f,222.656f, +140.625f,18.8685f,222.656f, +144.531f,19.4529f,222.656f, +148.438f,25.9153f,222.656f, +152.344f,25.6773f,222.656f, +156.25f,26.0432f,222.656f, +160.156f,26.3016f,222.656f, +164.063f,27.084f,222.656f, +167.969f,27.1073f,222.656f, +171.875f,22.7536f,222.656f, +175.781f,23.3785f,222.656f, +179.688f,23.0862f,222.656f, +183.594f,22.5993f,222.656f, +187.5f,22.0197f,222.656f, +191.406f,21.8352f,222.656f, +195.313f,20.0501f,222.656f, +199.219f,18.5797f,222.656f, +203.125f,18.2905f,222.656f, +207.031f,22.7876f,222.656f, +210.938f,21.9787f,222.656f, +214.844f,21.4782f,222.656f, +218.75f,21.5786f,222.656f, +222.656f,21.6231f,222.656f, +226.563f,17.8058f,222.656f, +230.469f,17.6169f,222.656f, +234.375f,18.3242f,222.656f, +238.281f,18.4847f,222.656f, +242.188f,17.3189f,222.656f, +246.094f,16.7726f,222.656f, +250.0f,16.587f,222.656f, +3.90627f,8.02546f,218.75f, +7.81251f,8.24803f,218.75f, +11.7188f,6.92174f,218.75f, +15.625f,5.86085f,218.75f, +19.5313f,4.56603f,218.75f, +23.4375f,3.6909f,218.75f, +27.3438f,4.26522f,218.75f, +31.25f,3.37783f,218.75f, +35.1563f,1.72339f,218.75f, +39.0625f,2.22205f,218.75f, +42.9688f,2.71848f,218.75f, +46.875f,3.1467f,218.75f, +50.7813f,3.05327f,218.75f, +54.6875f,3.19537f,218.75f, +58.5938f,3.68243f,218.75f, +62.5f,3.35279f,218.75f, +66.4063f,4.00402f,218.75f, +70.3125f,2.9244f,218.75f, +74.2188f,4.39027f,218.75f, +78.125f,5.55878f,218.75f, +82.0313f,6.38772f,218.75f, +85.9375f,6.34964f,218.75f, +89.8438f,6.80441f,218.75f, +93.75f,6.5829f,218.75f, +97.6563f,7.27657f,218.75f, +101.563f,9.67388f,218.75f, +105.469f,10.833f,218.75f, +109.375f,12.1666f,218.75f, +113.281f,13.2095f,218.75f, +117.188f,14.2491f,218.75f, +121.094f,14.6953f,218.75f, +125.0f,14.2707f,218.75f, +128.906f,15.9556f,218.75f, +132.813f,16.7068f,218.75f, +136.719f,17.6679f,218.75f, +140.625f,18.8257f,218.75f, +144.531f,24.2255f,218.75f, +148.438f,25.0749f,218.75f, +152.344f,25.9271f,218.75f, +156.25f,26.2032f,218.75f, +160.156f,24.5168f,218.75f, +164.063f,26.2403f,218.75f, +167.969f,26.6223f,218.75f, +171.875f,22.4271f,218.75f, +175.781f,23.7925f,218.75f, +179.688f,23.3478f,218.75f, +183.594f,22.2279f,218.75f, +187.5f,22.2148f,218.75f, +191.406f,20.7538f,218.75f, +195.313f,19.5131f,218.75f, +199.219f,19.4834f,218.75f, +203.125f,18.3756f,218.75f, +207.031f,18.1034f,218.75f, +210.938f,20.0003f,218.75f, +214.844f,22.2111f,218.75f, +218.75f,21.6123f,218.75f, +222.656f,22.5943f,218.75f, +226.563f,24.3115f,218.75f, +230.469f,19.0536f,218.75f, +234.375f,18.6613f,218.75f, +238.281f,18.7675f,218.75f, +242.188f,18.3163f,218.75f, +246.094f,16.7013f,218.75f, +250.0f,17.0786f,218.75f, +3.90627f,9.25513f,214.844f, +7.81251f,9.67426f,214.844f, +11.7188f,8.92139f,214.844f, +15.625f,6.90738f,214.844f, +19.5313f,6.12616f,214.844f, +23.4375f,4.98302f,214.844f, +27.3438f,3.63786f,214.844f, +31.25f,2.52097f,214.844f, +35.1563f,3.30816f,214.844f, +39.0625f,4.04406f,214.844f, +42.9688f,4.48446f,214.844f, +46.875f,4.40695f,214.844f, +50.7813f,3.7693f,214.844f, +54.6875f,2.85523f,214.844f, +58.5938f,2.56849f,214.844f, +62.5f,2.56561f,214.844f, +66.4063f,2.82937f,214.844f, +70.3125f,2.75221f,214.844f, +74.2188f,5.02974f,214.844f, +78.125f,5.7988f,214.844f, +82.0313f,6.03219f,214.844f, +85.9375f,6.27423f,214.844f, +89.8438f,6.1671f,214.844f, +93.75f,6.86893f,214.844f, +97.6563f,7.94747f,214.844f, +101.563f,9.13548f,214.844f, +105.469f,9.63636f,214.844f, +109.375f,10.3351f,214.844f, +113.281f,12.4028f,214.844f, +117.188f,13.0321f,214.844f, +121.094f,13.6284f,214.844f, +125.0f,14.3167f,214.844f, +128.906f,15.0573f,214.844f, +132.813f,16.2022f,214.844f, +136.719f,17.7526f,214.844f, +140.625f,23.7093f,214.844f, +144.531f,24.3603f,214.844f, +148.438f,24.9195f,214.844f, +152.344f,25.198f,214.844f, +156.25f,20.8225f,214.844f, +160.156f,24.5918f,214.844f, +164.063f,25.1404f,214.844f, +167.969f,26.0659f,214.844f, +171.875f,22.1485f,214.844f, +175.781f,27.7236f,214.844f, +179.688f,27.4914f,214.844f, +183.594f,26.6606f,214.844f, +187.5f,26.623f,214.844f, +191.406f,26.3244f,214.844f, +195.313f,24.8535f,214.844f, +199.219f,23.6373f,214.844f, +203.125f,21.1881f,214.844f, +207.031f,19.7509f,214.844f, +210.938f,22.3046f,214.844f, +214.844f,22.5297f,214.844f, +218.75f,22.9498f,214.844f, +222.656f,23.2271f,214.844f, +226.563f,24.89f,214.844f, +230.469f,23.5226f,214.844f, +234.375f,19.0463f,214.844f, +238.281f,17.96f,214.844f, +242.188f,18.8106f,214.844f, +246.094f,17.3168f,214.844f, +250.0f,16.7955f,214.844f, +3.90627f,10.5728f,210.938f, +7.81251f,9.81018f,210.938f, +11.7188f,9.69715f,210.938f, +15.625f,8.42137f,210.938f, +19.5313f,7.09174f,210.938f, +23.4375f,6.45357f,210.938f, +27.3438f,4.58257f,210.938f, +31.25f,4.31044f,210.938f, +35.1563f,4.23584f,210.938f, +39.0625f,4.77527f,210.938f, +42.9688f,5.51217f,210.938f, +46.875f,5.48962f,210.938f, +50.7813f,4.50211f,210.938f, +54.6875f,4.06287f,210.938f, +58.5938f,3.43161f,210.938f, +62.5f,3.43195f,210.938f, +66.4063f,3.64204f,210.938f, +70.3125f,5.16151f,210.938f, +74.2188f,6.72853f,210.938f, +78.125f,7.43878f,210.938f, +82.0313f,7.30716f,210.938f, +85.9375f,6.54327f,210.938f, +89.8438f,5.96003f,210.938f, +93.75f,6.45099f,210.938f, +97.6563f,8.32748f,210.938f, +101.563f,8.85186f,210.938f, +105.469f,9.64058f,210.938f, +109.375f,10.4181f,210.938f, +113.281f,11.6911f,210.938f, +117.188f,12.0508f,210.938f, +121.094f,13.1004f,210.938f, +125.0f,14.4899f,210.938f, +128.906f,15.1295f,210.938f, +132.813f,15.6195f,210.938f, +136.719f,16.9219f,210.938f, +140.625f,23.4614f,210.938f, +144.531f,24.6763f,210.938f, +148.438f,26.12f,210.938f, +152.344f,21.7533f,210.938f, +156.25f,20.7448f,210.938f, +160.156f,24.1481f,210.938f, +164.063f,26.0464f,210.938f, +167.969f,25.1633f,210.938f, +171.875f,20.8056f,210.938f, +175.781f,26.3651f,210.938f, +179.688f,25.5322f,210.938f, +183.594f,26.3828f,210.938f, +187.5f,26.3586f,210.938f, +191.406f,26.1714f,210.938f, +195.313f,25.9695f,210.938f, +199.219f,24.3505f,210.938f, +203.125f,23.872f,210.938f, +207.031f,23.0401f,210.938f, +210.938f,22.3904f,210.938f, +214.844f,22.7647f,210.938f, +218.75f,23.266f,210.938f, +222.656f,23.8563f,210.938f, +226.563f,24.6635f,210.938f, +230.469f,24.3846f,210.938f, +234.375f,18.3213f,210.938f, +238.281f,17.6531f,210.938f, +242.188f,17.8854f,210.938f, +246.094f,17.1692f,210.938f, +250.0f,16.127f,210.938f, +3.90626f,10.4539f,207.031f, +7.81251f,10.0241f,207.031f, +11.7188f,10.3861f,207.031f, +15.625f,8.84417f,207.031f, +19.5313f,8.35477f,207.031f, +23.4375f,6.48112f,207.031f, +27.3438f,6.10753f,207.031f, +31.25f,6.13796f,207.031f, +35.1563f,6.51045f,207.031f, +39.0625f,6.65278f,207.031f, +42.9688f,6.27698f,207.031f, +46.875f,5.80577f,207.031f, +50.7813f,5.90354f,207.031f, +54.6875f,5.66137f,207.031f, +58.5938f,4.67472f,207.031f, +62.5f,4.81103f,207.031f, +66.4063f,6.06764f,207.031f, +70.3125f,7.61387f,207.031f, +74.2188f,8.72682f,207.031f, +78.125f,9.33231f,207.031f, +82.0313f,8.49751f,207.031f, +85.9375f,7.85293f,207.031f, +89.8438f,7.37573f,207.031f, +93.75f,7.4561f,207.031f, +97.6563f,7.76623f,207.031f, +101.563f,8.68264f,207.031f, +105.469f,10.4373f,207.031f, +109.375f,10.4722f,207.031f, +113.281f,11.4418f,207.031f, +117.188f,12.3081f,207.031f, +121.094f,12.9224f,207.031f, +125.0f,14.3204f,207.031f, +128.906f,15.1746f,207.031f, +132.813f,14.4847f,207.031f, +136.719f,20.974f,207.031f, +140.625f,23.4669f,207.031f, +144.531f,24.9918f,207.031f, +148.438f,25.7345f,207.031f, +152.344f,21.4943f,207.031f, +156.25f,22.169f,207.031f, +160.156f,24.9739f,207.031f, +164.063f,26.4423f,207.031f, +167.969f,25.8928f,207.031f, +171.875f,20.5408f,207.031f, +175.781f,24.2294f,207.031f, +179.688f,24.4008f,207.031f, +183.594f,25.2809f,207.031f, +187.5f,25.8589f,207.031f, +191.406f,26.3716f,207.031f, +195.313f,26.0525f,207.031f, +199.219f,24.6109f,207.031f, +203.125f,24.1128f,207.031f, +207.031f,23.4731f,207.031f, +210.938f,22.6487f,207.031f, +214.844f,22.7977f,207.031f, +218.75f,18.4754f,207.031f, +222.656f,23.1848f,207.031f, +226.563f,23.1818f,207.031f, +230.469f,22.9194f,207.031f, +234.375f,19.8052f,207.031f, +238.281f,16.8602f,207.031f, +242.188f,17.1047f,207.031f, +246.094f,16.1145f,207.031f, +250.0f,15.0049f,207.031f, +3.90626f,11.4706f,203.125f, +7.81251f,11.0922f,203.125f, +11.7188f,11.454f,203.125f, +15.625f,10.399f,203.125f, +19.5313f,8.89365f,203.125f, +23.4375f,7.52605f,203.125f, +27.3438f,7.07779f,203.125f, +31.25f,7.98082f,203.125f, +35.1563f,8.78342f,203.125f, +39.0625f,8.87165f,203.125f, +42.9688f,8.39122f,203.125f, +46.875f,7.48032f,203.125f, +50.7813f,6.77944f,203.125f, +54.6875f,7.14862f,203.125f, +58.5938f,6.46173f,203.125f, +62.5f,6.73824f,203.125f, +66.4063f,7.64505f,203.125f, +70.3125f,9.22763f,203.125f, +74.2188f,9.87781f,203.125f, +78.125f,10.1574f,203.125f, +82.0313f,9.81606f,203.125f, +85.9375f,9.8669f,203.125f, +89.8438f,10.0032f,203.125f, +93.75f,9.76597f,203.125f, +97.6563f,9.2129f,203.125f, +101.563f,8.89917f,203.125f, +105.469f,9.85112f,203.125f, +109.375f,11.4827f,203.125f, +113.281f,11.8911f,203.125f, +117.188f,12.3305f,203.125f, +121.094f,13.6098f,203.125f, +125.0f,14.1477f,203.125f, +128.906f,14.7928f,203.125f, +132.813f,16.3422f,203.125f, +136.719f,22.7583f,203.125f, +140.625f,24.5881f,203.125f, +144.531f,25.3565f,203.125f, +148.438f,21.7799f,203.125f, +152.344f,24.1222f,203.125f, +156.25f,26.6774f,203.125f, +160.156f,25.7031f,203.125f, +164.063f,26.9766f,203.125f, +167.969f,25.936f,203.125f, +171.875f,19.7727f,203.125f, +175.781f,19.3015f,203.125f, +179.688f,19.2421f,203.125f, +183.594f,24.8014f,203.125f, +187.5f,25.3041f,203.125f, +191.406f,25.3226f,203.125f, +195.313f,20.0369f,203.125f, +199.219f,19.4927f,203.125f, +203.125f,23.4349f,203.125f, +207.031f,22.748f,203.125f, +210.938f,22.4583f,203.125f, +214.844f,18.8936f,203.125f, +218.75f,17.4565f,203.125f, +222.656f,18.8235f,203.125f, +226.563f,21.4749f,203.125f, +230.469f,21.7691f,203.125f, +234.375f,21.1398f,203.125f, +238.281f,15.9012f,203.125f, +242.188f,15.9735f,203.125f, +246.094f,15.2287f,203.125f, +250.0f,13.5655f,203.125f, +3.90626f,12.1184f,199.219f, +7.81251f,12.3652f,199.219f, +11.7188f,12.1177f,199.219f, +15.625f,11.107f,199.219f, +19.5313f,9.91183f,199.219f, +23.4375f,8.6581f,199.219f, +27.3438f,7.98212f,199.219f, +31.25f,9.14995f,199.219f, +35.1563f,10.2879f,199.219f, +39.0625f,10.2569f,199.219f, +42.9688f,9.58908f,199.219f, +46.875f,8.1296f,199.219f, +50.7813f,7.81944f,199.219f, +54.6875f,8.54521f,199.219f, +58.5938f,8.14627f,199.219f, +62.5f,8.60974f,199.219f, +66.4063f,9.63518f,199.219f, +70.3125f,10.5321f,199.219f, +74.2188f,10.3348f,199.219f, +78.125f,11.2806f,199.219f, +82.0313f,11.3874f,199.219f, +85.9375f,11.6949f,199.219f, +89.8438f,12.3833f,199.219f, +93.75f,12.4654f,199.219f, +97.6563f,11.369f,199.219f, +101.563f,10.2737f,199.219f, +105.469f,10.4291f,199.219f, +109.375f,11.0962f,199.219f, +113.281f,12.1388f,199.219f, +117.188f,12.5535f,199.219f, +121.094f,13.2826f,199.219f, +125.0f,15.1899f,199.219f, +128.906f,16.3486f,199.219f, +132.813f,17.6147f,199.219f, +136.719f,23.878f,199.219f, +140.625f,24.5901f,199.219f, +144.531f,26.2181f,199.219f, +148.438f,21.847f,199.219f, +152.344f,26.5018f,199.219f, +156.25f,26.2772f,199.219f, +160.156f,26.4621f,199.219f, +164.063f,26.1902f,199.219f, +167.969f,26.1086f,199.219f, +171.875f,20.7414f,199.219f, +175.781f,20.393f,199.219f, +179.688f,19.7885f,199.219f, +183.594f,20.9687f,199.219f, +187.5f,23.8625f,199.219f, +191.406f,24.0825f,199.219f, +195.313f,19.4921f,199.219f, +199.219f,20.8763f,199.219f, +203.125f,21.987f,199.219f, +207.031f,21.9212f,199.219f, +210.938f,20.0341f,199.219f, +214.844f,15.7998f,199.219f, +218.75f,15.7759f,199.219f, +222.656f,15.8963f,199.219f, +226.563f,19.8168f,199.219f, +230.469f,19.9894f,199.219f, +234.375f,19.4382f,199.219f, +238.281f,14.2335f,199.219f, +242.188f,14.9225f,199.219f, +246.094f,13.5857f,199.219f, +250.0f,11.7225f,199.219f, +3.90626f,13.8013f,195.313f, +7.81251f,13.8046f,195.313f, +11.7188f,13.1462f,195.313f, +15.625f,12.2626f,195.313f, +19.5313f,10.67f,195.313f, +23.4375f,10.0372f,195.313f, +27.3438f,9.3255f,195.313f, +31.25f,10.5057f,195.313f, +35.1563f,11.0615f,195.313f, +39.0625f,11.2421f,195.313f, +42.9688f,10.4767f,195.313f, +46.875f,9.03042f,195.313f, +50.7813f,9.47397f,195.313f, +54.6875f,9.65703f,195.313f, +58.5938f,9.6345f,195.313f, +62.5f,9.9552f,195.313f, +66.4063f,10.8427f,195.313f, +70.3125f,11.7912f,195.313f, +74.2188f,11.5822f,195.313f, +78.125f,13.07f,195.313f, +82.0313f,13.803f,195.313f, +85.9375f,12.9764f,195.313f, +89.8438f,14.639f,195.313f, +93.75f,14.6139f,195.313f, +97.6563f,13.3162f,195.313f, +101.563f,12.7402f,195.313f, +105.469f,12.8061f,195.313f, +109.375f,12.1167f,195.313f, +113.281f,12.705f,195.313f, +117.188f,12.4568f,195.313f, +121.094f,13.5698f,195.313f, +125.0f,15.1843f,195.313f, +128.906f,16.7529f,195.313f, +132.813f,19.1744f,195.313f, +136.719f,23.9261f,195.313f, +140.625f,25.9824f,195.313f, +144.531f,26.1631f,195.313f, +148.438f,21.4735f,195.313f, +152.344f,25.5313f,195.313f, +156.25f,27.0098f,195.313f, +160.156f,27.5776f,195.313f, +164.063f,27.0858f,195.313f, +167.969f,26.3007f,195.313f, +171.875f,23.4599f,195.313f, +175.781f,26.4252f,195.313f, +179.688f,21.1453f,195.313f, +183.594f,21.1021f,195.313f, +187.5f,25.1644f,195.313f, +191.406f,24.8681f,195.313f, +195.313f,24.1757f,195.313f, +199.219f,20.0013f,195.313f, +203.125f,23.6085f,195.313f, +207.031f,22.7043f,195.313f, +210.938f,17.4097f,195.313f, +214.844f,16.8216f,195.313f, +218.75f,16.2595f,195.313f, +222.656f,15.547f,195.313f, +226.563f,20.5074f,195.313f, +230.469f,20.0296f,195.313f, +234.375f,19.4594f,195.313f, +238.281f,14.3376f,195.313f, +242.188f,13.8667f,195.313f, +246.094f,12.7786f,195.313f, +250.0f,12.669f,195.313f, +3.90626f,14.3936f,191.406f, +7.81251f,14.3324f,191.406f, +11.7188f,13.5165f,191.406f, +15.625f,12.3486f,191.406f, +19.5313f,10.8996f,191.406f, +23.4375f,10.767f,191.406f, +27.3438f,12.0663f,191.406f, +31.25f,12.0032f,191.406f, +35.1563f,12.6763f,191.406f, +39.0625f,12.4746f,191.406f, +42.9688f,10.9305f,191.406f, +46.875f,11.0794f,191.406f, +50.7813f,11.2588f,191.406f, +54.6875f,11.0855f,191.406f, +58.5938f,10.1448f,191.406f, +62.5f,11.1184f,191.406f, +66.4063f,12.2266f,191.406f, +70.3125f,12.3132f,191.406f, +74.2188f,13.6918f,191.406f, +78.125f,14.4314f,191.406f, +82.0313f,14.6924f,191.406f, +85.9375f,15.6669f,191.406f, +89.8438f,16.085f,191.406f, +93.75f,16.2697f,191.406f, +97.6563f,16.3584f,191.406f, +101.563f,15.6226f,191.406f, +105.469f,14.7096f,191.406f, +109.375f,14.172f,191.406f, +113.281f,13.6538f,191.406f, +117.188f,14.6791f,191.406f, +121.094f,15.1835f,191.406f, +125.0f,16.4947f,191.406f, +128.906f,17.5173f,191.406f, +132.813f,22.4657f,191.406f, +136.719f,25.2206f,191.406f, +140.625f,26.6814f,191.406f, +144.531f,27.4657f,191.406f, +148.438f,22.8092f,191.406f, +152.344f,22.336f,191.406f, +156.25f,29.0833f,191.406f, +160.156f,29.5204f,191.406f, +164.063f,29.4008f,191.406f, +167.969f,28.5038f,191.406f, +171.875f,27.7213f,191.406f, +175.781f,27.6884f,191.406f, +179.688f,25.8434f,191.406f, +183.594f,23.3048f,191.406f, +187.5f,27.635f,191.406f, +191.406f,26.1341f,191.406f, +195.313f,26.6792f,191.406f, +199.219f,22.747f,191.406f, +203.125f,22.8472f,191.406f, +207.031f,21.8628f,191.406f, +210.938f,20.5896f,191.406f, +214.844f,20.683f,191.406f, +218.75f,15.9904f,191.406f, +222.656f,16.3766f,191.406f, +226.563f,21.611f,191.406f, +230.469f,20.8727f,191.406f, +234.375f,20.2044f,191.406f, +238.281f,15.3358f,191.406f, +242.188f,14.7065f,191.406f, +246.094f,14.4372f,191.406f, +250.0f,14.1124f,191.406f, +3.90626f,14.1738f,187.5f, +7.81252f,14.5502f,187.5f, +11.7188f,13.6083f,187.5f, +15.625f,12.2654f,187.5f, +19.5313f,11.7405f,187.5f, +23.4375f,12.3756f,187.5f, +27.3438f,14.0775f,187.5f, +31.25f,13.9675f,187.5f, +35.1563f,14.3286f,187.5f, +39.0625f,13.1055f,187.5f, +42.9688f,13.0413f,187.5f, +46.875f,13.318f,187.5f, +50.7813f,12.9383f,187.5f, +54.6875f,12.9366f,187.5f, +58.5938f,12.1308f,187.5f, +62.5f,12.8501f,187.5f, +66.4063f,13.0312f,187.5f, +70.3125f,13.1657f,187.5f, +74.2188f,14.6177f,187.5f, +78.125f,16.1865f,187.5f, +82.0313f,16.3194f,187.5f, +85.9375f,16.9023f,187.5f, +89.8438f,17.5469f,187.5f, +93.75f,18.1166f,187.5f, +97.6563f,18.7398f,187.5f, +101.563f,18.2643f,187.5f, +105.469f,17.5115f,187.5f, +109.375f,16.8559f,187.5f, +113.281f,15.8332f,187.5f, +117.188f,16.4429f,187.5f, +121.094f,17.0698f,187.5f, +125.0f,18.0389f,187.5f, +128.906f,19.8697f,187.5f, +132.813f,24.8511f,187.5f, +136.719f,26.6838f,187.5f, +140.625f,28.5323f,187.5f, +144.531f,28.756f,187.5f, +148.438f,25.5762f,187.5f, +152.344f,25.8993f,187.5f, +156.25f,29.0469f,187.5f, +160.156f,32.1254f,187.5f, +164.063f,32.1318f,187.5f, +167.969f,31.7887f,187.5f, +171.875f,30.3727f,187.5f, +175.781f,30.1222f,187.5f, +179.688f,30.3556f,187.5f, +183.594f,30.49f,187.5f, +187.5f,29.3956f,187.5f, +191.406f,30.6569f,187.5f, +195.313f,30.8632f,187.5f, +199.219f,26.1118f,187.5f, +203.125f,25.5008f,187.5f, +207.031f,24.7878f,187.5f, +210.938f,27.5453f,187.5f, +214.844f,25.5271f,187.5f, +218.75f,20.2295f,187.5f, +222.656f,17.2785f,187.5f, +226.563f,22.0337f,187.5f, +230.469f,22.1938f,187.5f, +234.375f,21.6646f,187.5f, +238.281f,16.8654f,187.5f, +242.188f,15.704f,187.5f, +246.094f,15.9973f,187.5f, +250.0f,15.209f,187.5f, +3.90626f,13.9878f,183.594f, +7.81252f,14.3413f,183.594f, +11.7188f,13.1779f,183.594f, +15.625f,12.8538f,183.594f, +19.5313f,13.9436f,183.594f, +23.4375f,14.716f,183.594f, +27.3438f,14.991f,183.594f, +31.25f,15.4235f,183.594f, +35.1563f,15.3865f,183.594f, +39.0625f,14.2459f,183.594f, +42.9688f,15.2992f,183.594f, +46.875f,16.0599f,183.594f, +50.7813f,14.8603f,183.594f, +54.6875f,14.9726f,183.594f, +58.5938f,13.6053f,183.594f, +62.5f,13.057f,183.594f, +66.4063f,13.4201f,183.594f, +70.3125f,14.0782f,183.594f, +74.2188f,15.3178f,183.594f, +78.125f,16.3995f,183.594f, +82.0313f,17.4379f,183.594f, +85.9375f,17.9502f,183.594f, +89.8438f,18.4811f,183.594f, +93.75f,19.4227f,183.594f, +97.6563f,20.1694f,183.594f, +101.563f,20.1609f,183.594f, +105.469f,19.5537f,183.594f, +109.375f,19.039f,183.594f, +113.281f,18.2247f,183.594f, +117.188f,18.6643f,183.594f, +121.094f,19.2334f,183.594f, +125.0f,20.4158f,183.594f, +128.906f,21.1136f,183.594f, +132.813f,25.6638f,183.594f, +136.719f,27.4642f,183.594f, +140.625f,29.0749f,183.594f, +144.531f,30.6966f,183.594f, +148.438f,26.933f,183.594f, +152.344f,27.9984f,183.594f, +156.25f,28.4094f,183.594f, +160.156f,33.857f,183.594f, +164.063f,34.6528f,183.594f, +167.969f,33.405f,183.594f, +171.875f,31.8412f,183.594f, +175.781f,31.8788f,183.594f, +179.688f,32.395f,183.594f, +183.594f,32.8498f,183.594f, +187.5f,28.7385f,183.594f, +191.406f,33.6253f,183.594f, +195.313f,32.9673f,183.594f, +199.219f,31.8413f,183.594f, +203.125f,26.491f,183.594f, +207.031f,29.4589f,183.594f, +210.938f,28.7843f,183.594f, +214.844f,26.577f,183.594f, +218.75f,25.0304f,183.594f, +222.656f,18.7948f,183.594f, +226.563f,23.1467f,183.594f, +230.469f,22.3329f,183.594f, +234.375f,21.6877f,183.594f, +238.281f,16.4114f,183.594f, +242.188f,16.4672f,183.594f, +246.094f,16.3324f,183.594f, +250.0f,16.0497f,183.594f, +3.90626f,14.6785f,179.688f, +7.81252f,14.4582f,179.688f, +11.7188f,13.7379f,179.688f, +15.625f,13.9816f,179.688f, +19.5313f,14.9647f,179.688f, +23.4375f,15.3633f,179.688f, +27.3438f,16.1346f,179.688f, +31.25f,16.4088f,179.688f, +35.1563f,16.195f,179.688f, +39.0625f,16.1785f,179.688f, +42.9688f,17.2534f,179.688f, +46.875f,17.329f,179.688f, +50.7813f,16.0096f,179.688f, +54.6875f,15.4766f,179.688f, +58.5938f,14.0828f,179.688f, +62.5f,12.8927f,179.688f, +66.4063f,14.1195f,179.688f, +70.3125f,14.9421f,179.688f, +74.2188f,15.9015f,179.688f, +78.125f,17.3756f,179.688f, +82.0313f,18.6339f,179.688f, +85.9375f,19.7602f,179.688f, +89.8438f,19.8522f,179.688f, +93.75f,20.5838f,179.688f, +97.6563f,21.2938f,179.688f, +101.563f,21.1808f,179.688f, +105.469f,21.4575f,179.688f, +109.375f,21.1629f,179.688f, +113.281f,20.4789f,179.688f, +117.188f,20.5729f,179.688f, +121.094f,20.3917f,179.688f, +125.0f,21.8501f,179.688f, +128.906f,22.6846f,179.688f, +132.813f,23.4145f,179.688f, +136.719f,28.3033f,179.688f, +140.625f,30.5638f,179.688f, +144.531f,32.761f,179.688f, +148.438f,29.4434f,179.688f, +152.344f,30.346f,179.688f, +156.25f,31.7037f,179.688f, +160.156f,36.287f,179.688f, +164.063f,36.7423f,179.688f, +167.969f,35.7482f,179.688f, +171.875f,30.0008f,179.688f, +175.781f,29.6748f,179.688f, +179.688f,34.5316f,179.688f, +183.594f,34.4476f,179.688f, +187.5f,34.3489f,179.688f, +191.406f,33.4208f,179.688f, +195.313f,29.5511f,179.688f, +199.219f,28.9653f,179.688f, +203.125f,28.1749f,179.688f, +207.031f,30.5574f,179.688f, +210.938f,28.6513f,179.688f, +214.844f,27.1867f,179.688f, +218.75f,20.8455f,179.688f, +222.656f,20.3256f,179.688f, +226.563f,24.3717f,179.688f, +230.469f,23.2197f,179.688f, +234.375f,21.6566f,179.688f, +238.281f,16.2487f,179.688f, +242.188f,16.7759f,179.688f, +246.094f,16.5259f,179.688f, +250.0f,15.8782f,179.688f, +3.90626f,15.2963f,175.781f, +7.81252f,15.075f,175.781f, +11.7188f,14.8069f,175.781f, +15.625f,14.4469f,175.781f, +19.5313f,15.8073f,175.781f, +23.4375f,16.5419f,175.781f, +27.3438f,16.7791f,175.781f, +31.25f,17.1945f,175.781f, +35.1563f,16.9974f,175.781f, +39.0625f,16.9655f,175.781f, +42.9688f,17.7583f,175.781f, +46.875f,18.115f,175.781f, +50.7813f,16.6524f,175.781f, +54.6875f,15.897f,175.781f, +58.5938f,15.4613f,175.781f, +62.5f,14.3684f,175.781f, +66.4063f,15.0403f,175.781f, +70.3125f,15.9604f,175.781f, +74.2188f,16.9477f,175.781f, +78.125f,18.0563f,175.781f, +82.0313f,18.8971f,175.781f, +85.9375f,20.1037f,175.781f, +89.8438f,20.3627f,175.781f, +93.75f,20.0215f,175.781f, +97.6563f,20.8917f,175.781f, +101.563f,21.8702f,175.781f, +105.469f,22.7304f,175.781f, +109.375f,22.6873f,175.781f, +113.281f,21.4896f,175.781f, +117.188f,21.3864f,175.781f, +121.094f,22.4194f,175.781f, +125.0f,23.5751f,175.781f, +128.906f,23.9616f,175.781f, +132.813f,24.6066f,175.781f, +136.719f,30.8792f,175.781f, +140.625f,31.6572f,175.781f, +144.531f,34.2264f,175.781f, +148.438f,30.9611f,175.781f, +152.344f,35.8851f,175.781f, +156.25f,38.6379f,175.781f, +160.156f,39.1098f,175.781f, +164.063f,39.046f,175.781f, +167.969f,38.0327f,175.781f, +171.875f,36.6611f,175.781f, +175.781f,36.0664f,175.781f, +179.688f,36.1227f,175.781f, +183.594f,36.0705f,175.781f, +187.5f,35.9099f,175.781f, +191.406f,30.4106f,175.781f, +195.313f,30.0475f,175.781f, +199.219f,28.9213f,175.781f, +203.125f,32.8995f,175.781f, +207.031f,31.2376f,175.781f, +210.938f,30.0194f,175.781f, +214.844f,23.402f,175.781f, +218.75f,21.7271f,175.781f, +222.656f,20.0594f,175.781f, +226.563f,25.2266f,175.781f, +230.469f,24.1549f,175.781f, +234.375f,22.0418f,175.781f, +238.281f,15.6301f,175.781f, +242.188f,15.4767f,175.781f, +246.094f,15.8876f,175.781f, +250.0f,15.1339f,175.781f, +3.90626f,16.0791f,171.875f, +7.81251f,16.012f,171.875f, +11.7188f,15.027f,171.875f, +15.625f,15.1362f,171.875f, +19.5313f,16.3622f,171.875f, +23.4375f,16.7304f,171.875f, +27.3438f,17.228f,171.875f, +31.25f,16.4882f,171.875f, +35.1563f,16.5399f,171.875f, +39.0625f,17.5505f,171.875f, +42.9688f,17.6944f,171.875f, +46.875f,17.7481f,171.875f, +50.7813f,17.4568f,171.875f, +54.6875f,16.5655f,171.875f, +58.5938f,15.4313f,171.875f, +62.5f,14.962f,171.875f, +66.4063f,15.2516f,171.875f, +70.3125f,16.3088f,171.875f, +74.2188f,17.5354f,171.875f, +78.125f,18.5759f,171.875f, +82.0313f,19.1666f,171.875f, +85.9375f,19.8244f,171.875f, +89.8438f,20.6303f,171.875f, +93.75f,20.5635f,171.875f, +97.6563f,20.5768f,171.875f, +101.563f,21.542f,171.875f, +105.469f,22.5605f,171.875f, +109.375f,23.0118f,171.875f, +113.281f,22.6086f,171.875f, +117.188f,22.8502f,171.875f, +121.094f,23.2278f,171.875f, +125.0f,24.368f,171.875f, +128.906f,25.5759f,171.875f, +132.813f,27.7217f,171.875f, +136.719f,33.4581f,171.875f, +140.625f,33.4128f,171.875f, +144.531f,34.9465f,171.875f, +148.438f,31.4923f,171.875f, +152.344f,38.6707f,171.875f, +156.25f,40.2713f,171.875f, +160.156f,40.4155f,171.875f, +164.063f,41.0232f,171.875f, +167.969f,39.781f,171.875f, +171.875f,37.8376f,171.875f, +175.781f,38.0559f,171.875f, +179.688f,32.0147f,171.875f, +183.594f,35.2298f,171.875f, +187.5f,34.7221f,171.875f, +191.406f,31.5516f,171.875f, +195.313f,28.9984f,171.875f, +199.219f,29.8767f,171.875f, +203.125f,32.6404f,171.875f, +207.031f,31.3413f,171.875f, +210.938f,28.4132f,171.875f, +214.844f,22.9909f,171.875f, +218.75f,21.3955f,171.875f, +222.656f,25.3135f,171.875f, +226.563f,25.1463f,171.875f, +230.469f,23.4716f,171.875f, +234.375f,22.494f,171.875f, +238.281f,15.9351f,171.875f, +242.188f,15.2882f,171.875f, +246.094f,14.8463f,171.875f, +250.0f,14.5269f,171.875f, +3.90626f,17.1455f,167.969f, +7.81251f,16.6981f,167.969f, +11.7188f,16.5681f,167.969f, +15.625f,16.1667f,167.969f, +19.5313f,16.3523f,167.969f, +23.4375f,16.5389f,167.969f, +27.3438f,16.8075f,167.969f, +31.25f,17.1987f,167.969f, +35.1563f,17.86f,167.969f, +39.0625f,18.5438f,167.969f, +42.9688f,18.6718f,167.969f, +46.875f,17.9387f,167.969f, +50.7813f,17.5403f,167.969f, +54.6875f,17.4895f,167.969f, +58.5938f,16.9679f,167.969f, +62.5f,16.2192f,167.969f, +66.4063f,15.5699f,167.969f, +70.3125f,17.0017f,167.969f, +74.2188f,18.0147f,167.969f, +78.125f,18.9836f,167.969f, +82.0313f,19.8197f,167.969f, +85.9375f,19.8969f,167.969f, +89.8438f,20.6411f,167.969f, +93.75f,20.9768f,167.969f, +97.6563f,21.1498f,167.969f, +101.563f,21.3269f,167.969f, +105.469f,22.1153f,167.969f, +109.375f,22.208f,167.969f, +113.281f,23.2278f,167.969f, +117.188f,24.5722f,167.969f, +121.094f,25.3921f,167.969f, +125.0f,26.2683f,167.969f, +128.906f,28.138f,167.969f, +132.813f,29.9483f,167.969f, +136.719f,34.7607f,167.969f, +140.625f,35.3745f,167.969f, +144.531f,36.1401f,167.969f, +148.438f,38.0587f,167.969f, +152.344f,40.0092f,167.969f, +156.25f,40.9205f,167.969f, +160.156f,41.4664f,167.969f, +164.063f,41.8834f,167.969f, +167.969f,40.2863f,167.969f, +171.875f,38.4111f,167.969f, +175.781f,37.4971f,167.969f, +179.688f,32.0995f,167.969f, +183.594f,36.4852f,167.969f, +187.5f,34.5523f,167.969f, +191.406f,34.4101f,167.969f, +195.313f,29.577f,167.969f, +199.219f,33.7462f,167.969f, +203.125f,33.0191f,167.969f, +207.031f,31.6651f,167.969f, +210.938f,24.6623f,167.969f, +214.844f,22.6532f,167.969f, +218.75f,21.898f,167.969f, +222.656f,26.1764f,167.969f, +226.563f,24.7619f,167.969f, +230.469f,22.6772f,167.969f, +234.375f,17.6202f,167.969f, +238.281f,16.1581f,167.969f, +242.188f,14.7308f,167.969f, +246.094f,14.294f,167.969f, +250.0f,13.1169f,167.969f, +3.90627f,16.4621f,164.063f, +7.81251f,17.581f,164.063f, +11.7188f,17.7296f,164.063f, +15.625f,17.126f,164.063f, +19.5313f,17.3484f,164.063f, +23.4375f,17.9863f,164.063f, +27.3438f,18.6623f,164.063f, +31.25f,18.7934f,164.063f, +35.1563f,18.8245f,164.063f, +39.0625f,18.9554f,164.063f, +42.9688f,19.3152f,164.063f, +46.875f,18.5996f,164.063f, +50.7813f,18.0094f,164.063f, +54.6875f,17.5702f,164.063f, +58.5938f,17.5846f,164.063f, +62.5f,17.3718f,164.063f, +66.4063f,17.7189f,164.063f, +70.3125f,17.9805f,164.063f, +74.2188f,18.2986f,164.063f, +78.125f,18.9566f,164.063f, +82.0313f,20.4142f,164.063f, +85.9375f,20.5066f,164.063f, +89.8438f,20.7654f,164.063f, +93.75f,20.9457f,164.063f, +97.6563f,21.1078f,164.063f, +101.563f,20.7505f,164.063f, +105.469f,21.4615f,164.063f, +109.375f,22.8061f,164.063f, +113.281f,24.2655f,164.063f, +117.188f,24.815f,164.063f, +121.094f,26.3141f,164.063f, +125.0f,28.393f,164.063f, +128.906f,30.0565f,164.063f, +132.813f,31.4858f,164.063f, +136.719f,31.6549f,164.063f, +140.625f,37.0597f,164.063f, +144.531f,37.7613f,164.063f, +148.438f,38.9888f,164.063f, +152.344f,39.1482f,164.063f, +156.25f,36.6367f,164.063f, +160.156f,41.2606f,164.063f, +164.063f,42.2366f,164.063f, +167.969f,40.9757f,164.063f, +171.875f,33.9016f,164.063f, +175.781f,34.1798f,164.063f, +179.688f,33.0682f,164.063f, +183.594f,35.2269f,164.063f, +187.5f,35.1129f,164.063f, +191.406f,34.7006f,164.063f, +195.313f,30.1221f,164.063f, +199.219f,34.6592f,164.063f, +203.125f,33.6195f,164.063f, +207.031f,30.0546f,164.063f, +210.938f,24.8295f,164.063f, +214.844f,23.0298f,164.063f, +218.75f,26.5636f,164.063f, +222.656f,25.7973f,164.063f, +226.563f,23.7612f,164.063f, +230.469f,22.3646f,164.063f, +234.375f,16.1956f,164.063f, +238.281f,14.863f,164.063f, +242.188f,13.95f,164.063f, +246.094f,14.1968f,164.063f, +250.0f,13.2951f,164.063f, +3.90627f,16.628f,160.156f, +7.81251f,17.4268f,160.156f, +11.7188f,18.0363f,160.156f, +15.625f,18.1287f,160.156f, +19.5313f,18.6222f,160.156f, +23.4375f,18.2801f,160.156f, +27.3438f,18.5912f,160.156f, +31.25f,18.8635f,160.156f, +35.1563f,19.2193f,160.156f, +39.0625f,18.8821f,160.156f, +42.9688f,19.0078f,160.156f, +46.875f,19.3506f,160.156f, +50.7813f,17.8504f,160.156f, +54.6875f,18.5322f,160.156f, +58.5938f,18.2223f,160.156f, +62.5f,18.032f,160.156f, +66.4063f,18.574f,160.156f, +70.3125f,18.3835f,160.156f, +74.2188f,18.0842f,160.156f, +78.125f,19.8632f,160.156f, +82.0313f,20.9487f,160.156f, +85.9375f,20.6197f,160.156f, +89.8438f,20.5117f,160.156f, +93.75f,20.4182f,160.156f, +97.6563f,19.8654f,160.156f, +101.563f,20.1971f,160.156f, +105.469f,22.0419f,160.156f, +109.375f,23.4698f,160.156f, +113.281f,24.6461f,160.156f, +117.188f,26.2207f,160.156f, +121.094f,28.1249f,160.156f, +125.0f,29.8102f,160.156f, +128.906f,31.7349f,160.156f, +132.813f,32.4376f,160.156f, +136.719f,33.2795f,160.156f, +140.625f,37.4588f,160.156f, +144.531f,38.8195f,160.156f, +148.438f,39.9622f,160.156f, +152.344f,41.6752f,160.156f, +156.25f,37.6576f,160.156f, +160.156f,41.4722f,160.156f, +164.063f,41.8372f,160.156f, +167.969f,40.7289f,160.156f, +171.875f,35.5243f,160.156f, +175.781f,34.1726f,160.156f, +179.688f,33.9628f,160.156f, +183.594f,33.3012f,160.156f, +187.5f,37.6064f,160.156f, +191.406f,36.2987f,160.156f, +195.313f,32.9836f,160.156f, +199.219f,34.2771f,160.156f, +203.125f,33.5607f,160.156f, +207.031f,26.9351f,160.156f, +210.938f,24.3584f,160.156f, +214.844f,25.5428f,160.156f, +218.75f,26.0054f,160.156f, +222.656f,24.092f,160.156f, +226.563f,22.8948f,160.156f, +230.469f,17.1899f,160.156f, +234.375f,15.0552f,160.156f, +238.281f,14.2468f,160.156f, +242.188f,13.7862f,160.156f, +246.094f,14.5132f,160.156f, +250.0f,14.3684f,160.156f, +3.90627f,16.9346f,156.25f, +7.81251f,18.2437f,156.25f, +11.7188f,18.3869f,156.25f, +15.625f,18.1055f,156.25f, +19.5313f,18.7445f,156.25f, +23.4375f,18.9235f,156.25f, +27.3438f,18.455f,156.25f, +31.25f,18.6644f,156.25f, +35.1563f,18.9448f,156.25f, +39.0625f,18.9971f,156.25f, +42.9688f,18.8628f,156.25f, +46.875f,18.6886f,156.25f, +50.7813f,18.8494f,156.25f, +54.6875f,19.4408f,156.25f, +58.5938f,18.7384f,156.25f, +62.5f,17.473f,156.25f, +66.4063f,18.5906f,156.25f, +70.3125f,18.7252f,156.25f, +74.2188f,19.5013f,156.25f, +78.125f,19.8221f,156.25f, +82.0313f,19.8648f,156.25f, +85.9375f,19.8955f,156.25f, +89.8438f,19.4401f,156.25f, +93.75f,18.7973f,156.25f, +97.6563f,18.8923f,156.25f, +101.563f,20.6151f,156.25f, +105.469f,22.9824f,156.25f, +109.375f,25.2251f,156.25f, +113.281f,26.7829f,156.25f, +117.188f,27.8131f,156.25f, +121.094f,29.6707f,156.25f, +125.0f,31.4614f,156.25f, +128.906f,32.8387f,156.25f, +132.813f,33.7834f,156.25f, +136.719f,34.3986f,156.25f, +140.625f,35.1609f,156.25f, +144.531f,40.0963f,156.25f, +148.438f,41.0412f,156.25f, +152.344f,42.0325f,156.25f, +156.25f,42.1696f,156.25f, +160.156f,41.9265f,156.25f, +164.063f,43.279f,156.25f, +167.969f,42.5995f,156.25f, +171.875f,36.6937f,156.25f, +175.781f,34.8393f,156.25f, +179.688f,34.7157f,156.25f, +183.594f,34.0579f,156.25f, +187.5f,33.7647f,156.25f, +191.406f,33.2242f,156.25f, +195.313f,32.1053f,156.25f, +199.219f,30.6563f,156.25f, +203.125f,33.623f,156.25f, +207.031f,28.0199f,156.25f, +210.938f,30.5092f,156.25f, +214.844f,29.3828f,156.25f, +218.75f,27.3486f,156.25f, +222.656f,25.8671f,156.25f, +226.563f,24.1209f,156.25f, +230.469f,17.9979f,156.25f, +234.375f,16.1304f,156.25f, +238.281f,14.8281f,156.25f, +242.188f,13.097f,156.25f, +246.094f,13.3642f,156.25f, +250.0f,13.6085f,156.25f, +3.90627f,17.6952f,152.344f, +7.81251f,19.1063f,152.344f, +11.7188f,19.6398f,152.344f, +15.625f,19.8626f,152.344f, +19.5313f,19.1453f,152.344f, +23.4375f,19.4932f,152.344f, +27.3438f,19.3908f,152.344f, +31.25f,18.6492f,152.344f, +35.1563f,18.3861f,152.344f, +39.0625f,18.198f,152.344f, +42.9688f,18.4497f,152.344f, +46.875f,17.8083f,152.344f, +50.7813f,18.5296f,152.344f, +54.6875f,19.8096f,152.344f, +58.5938f,19.3324f,152.344f, +62.5f,18.1507f,152.344f, +66.4063f,17.7998f,152.344f, +70.3125f,17.9266f,152.344f, +74.2188f,18.569f,152.344f, +78.125f,19.5043f,152.344f, +82.0313f,20.0768f,152.344f, +85.9375f,19.5187f,152.344f, +89.8438f,20.2592f,152.344f, +93.75f,19.2159f,152.344f, +97.6563f,20.1174f,152.344f, +101.563f,21.9257f,152.344f, +105.469f,23.9219f,152.344f, +109.375f,25.8476f,152.344f, +113.281f,27.9183f,152.344f, +117.188f,29.2798f,152.344f, +121.094f,30.2289f,152.344f, +125.0f,31.7495f,152.344f, +128.906f,33.1684f,152.344f, +132.813f,34.4626f,152.344f, +136.719f,35.9981f,152.344f, +140.625f,36.5168f,152.344f, +144.531f,35.9325f,152.344f, +148.438f,41.231f,152.344f, +152.344f,42.7257f,152.344f, +156.25f,43.5162f,152.344f, +160.156f,44.357f,152.344f, +164.063f,44.2347f,152.344f, +167.969f,40.2679f,152.344f, +171.875f,36.2109f,152.344f, +175.781f,36.3906f,152.344f, +179.688f,35.227f,152.344f, +183.594f,34.7006f,152.344f, +187.5f,34.7763f,152.344f, +191.406f,34.0912f,152.344f, +195.313f,32.201f,152.344f, +199.219f,30.6601f,152.344f, +203.125f,28.7526f,152.344f, +207.031f,33.0587f,152.344f, +210.938f,31.7955f,152.344f, +214.844f,29.893f,152.344f, +218.75f,27.5989f,152.344f, +222.656f,26.1347f,152.344f, +226.563f,19.6378f,152.344f, +230.469f,18.6596f,152.344f, +234.375f,17.3965f,152.344f, +238.281f,15.5807f,152.344f, +242.188f,13.4071f,152.344f, +246.094f,12.7989f,152.344f, +250.0f,12.5897f,152.344f, +3.90626f,18.4109f,148.438f, +7.81251f,18.8163f,148.438f, +11.7188f,20.7396f,148.438f, +15.625f,21.7833f,148.438f, +19.5313f,20.6586f,148.438f, +23.4375f,19.8597f,148.438f, +27.3438f,20.0951f,148.438f, +31.25f,18.7811f,148.438f, +35.1563f,18.123f,148.438f, +39.0625f,17.773f,148.438f, +42.9688f,18.0095f,148.438f, +46.875f,17.694f,148.438f, +50.7813f,17.1666f,148.438f, +54.6875f,18.3484f,148.438f, +58.5938f,18.5612f,148.438f, +62.5f,18.1324f,148.438f, +66.4063f,17.4119f,148.438f, +70.3125f,17.2873f,148.438f, +74.2188f,17.6855f,148.438f, +78.125f,18.6618f,148.438f, +82.0313f,19.6447f,148.438f, +85.9375f,19.4743f,148.438f, +89.8438f,20.2887f,148.438f, +93.75f,20.2469f,148.438f, +97.6563f,21.1802f,148.438f, +101.563f,23.2002f,148.438f, +105.469f,24.8874f,148.438f, +109.375f,26.5433f,148.438f, +113.281f,28.653f,148.438f, +117.188f,30.2347f,148.438f, +121.094f,31.6949f,148.438f, +125.0f,33.2452f,148.438f, +128.906f,34.3964f,148.438f, +132.813f,35.2835f,148.438f, +136.719f,36.7099f,148.438f, +140.625f,37.1893f,148.438f, +144.531f,36.5212f,148.438f, +148.438f,36.7413f,148.438f, +152.344f,43.9965f,148.438f, +156.25f,44.9543f,148.438f, +160.156f,44.8078f,148.438f, +164.063f,45.09f,148.438f, +167.969f,43.0871f,148.438f, +171.875f,42.2067f,148.438f, +175.781f,40.5399f,148.438f, +179.688f,35.9902f,148.438f, +183.594f,34.4093f,148.438f, +187.5f,35.1087f,148.438f, +191.406f,34.3372f,148.438f, +195.313f,35.6724f,148.438f, +199.219f,34.961f,148.438f, +203.125f,34.4106f,148.438f, +207.031f,32.0028f,148.438f, +210.938f,31.3925f,148.438f, +214.844f,29.3539f,148.438f, +218.75f,27.6213f,148.438f, +222.656f,21.6694f,148.438f, +226.563f,20.356f,148.438f, +230.469f,19.6202f,148.438f, +234.375f,17.6247f,148.438f, +238.281f,16.5152f,148.438f, +242.188f,14.901f,148.438f, +246.094f,12.7994f,148.438f, +250.0f,12.2743f,148.438f, +3.90626f,17.8758f,144.531f, +7.81251f,19.3177f,144.531f, +11.7188f,20.9214f,144.531f, +15.625f,21.8589f,144.531f, +19.5313f,21.2904f,144.531f, +23.4375f,19.9784f,144.531f, +27.3438f,19.6359f,144.531f, +31.25f,19.4398f,144.531f, +35.1563f,18.6596f,144.531f, +39.0625f,17.1967f,144.531f, +42.9688f,16.797f,144.531f, +46.875f,16.4099f,144.531f, +50.7813f,16.54f,144.531f, +54.6875f,16.811f,144.531f, +58.5938f,17.31f,144.531f, +62.5f,17.5358f,144.531f, +66.4063f,16.8495f,144.531f, +70.3125f,17.2148f,144.531f, +74.2188f,16.6285f,144.531f, +78.125f,17.7911f,144.531f, +82.0313f,18.6054f,144.531f, +85.9375f,18.787f,144.531f, +89.8438f,20.4804f,144.531f, +93.75f,21.0544f,144.531f, +97.6563f,20.9487f,144.531f, +101.563f,23.1098f,144.531f, +105.469f,25.2196f,144.531f, +109.375f,27.0389f,144.531f, +113.281f,29.4971f,144.531f, +117.188f,31.0049f,144.531f, +121.094f,33.086f,144.531f, +125.0f,34.6611f,144.531f, +128.906f,35.8626f,144.531f, +132.813f,36.8672f,144.531f, +136.719f,37.5515f,144.531f, +140.625f,37.6433f,144.531f, +144.531f,37.8923f,144.531f, +148.438f,37.1277f,144.531f, +152.344f,40.0287f,144.531f, +156.25f,44.9863f,144.531f, +160.156f,45.0845f,144.531f, +164.063f,44.7823f,144.531f, +167.969f,42.5338f,144.531f, +171.875f,41.7912f,144.531f, +175.781f,41.5762f,144.531f, +179.688f,41.3242f,144.531f, +183.594f,39.6796f,144.531f, +187.5f,39.4704f,144.531f, +191.406f,38.5401f,144.531f, +195.313f,37.3853f,144.531f, +199.219f,35.4345f,144.531f, +203.125f,34.2437f,144.531f, +207.031f,31.8218f,144.531f, +210.938f,30.6041f,144.531f, +214.844f,26.9001f,144.531f, +218.75f,22.3094f,144.531f, +222.656f,21.4446f,144.531f, +226.563f,20.6643f,144.531f, +230.469f,20.3246f,144.531f, +234.375f,18.0382f,144.531f, +238.281f,15.7854f,144.531f, +242.188f,14.3314f,144.531f, +246.094f,12.4723f,144.531f, +250.0f,12.5491f,144.531f, +3.90626f,18.5798f,140.625f, +7.81251f,19.7271f,140.625f, +11.7188f,20.8566f,140.625f, +15.625f,21.6914f,140.625f, +19.5313f,20.9288f,140.625f, +23.4375f,20.0531f,140.625f, +27.3438f,19.1655f,140.625f, +31.25f,18.7947f,140.625f, +35.1563f,18.2984f,140.625f, +39.0625f,17.3295f,140.625f, +42.9688f,16.5557f,140.625f, +46.875f,16.1679f,140.625f, +50.7813f,16.0262f,140.625f, +54.6875f,16.1659f,140.625f, +58.5938f,16.459f,140.625f, +62.5f,17.0307f,140.625f, +66.4063f,17.6303f,140.625f, +70.3125f,16.7576f,140.625f, +74.2188f,16.9614f,140.625f, +78.125f,17.3439f,140.625f, +82.0313f,17.7742f,140.625f, +85.9375f,19.0774f,140.625f, +89.8438f,20.0724f,140.625f, +93.75f,21.5734f,140.625f, +97.6563f,21.4923f,140.625f, +101.563f,24.2474f,140.625f, +105.469f,25.9666f,140.625f, +109.375f,27.8803f,140.625f, +113.281f,29.6397f,140.625f, +117.188f,32.0374f,140.625f, +121.094f,34.014f,140.625f, +125.0f,35.1589f,140.625f, +128.906f,36.2526f,140.625f, +132.813f,37.5386f,140.625f, +136.719f,38.1647f,140.625f, +140.625f,37.9014f,140.625f, +144.531f,39.0558f,140.625f, +148.438f,38.1493f,140.625f, +152.344f,39.5967f,140.625f, +156.25f,40.3409f,140.625f, +160.156f,39.4778f,140.625f, +164.063f,43.7911f,140.625f, +167.969f,42.7467f,140.625f, +171.875f,41.4394f,140.625f, +175.781f,41.222f,140.625f, +179.688f,40.9501f,140.625f, +183.594f,40.2741f,140.625f, +187.5f,40.5011f,140.625f, +191.406f,39.8634f,140.625f, +195.313f,37.8944f,140.625f, +199.219f,35.6917f,140.625f, +203.125f,33.0921f,140.625f, +207.031f,30.7497f,140.625f, +210.938f,24.355f,140.625f, +214.844f,23.6102f,140.625f, +218.75f,23.2298f,140.625f, +222.656f,21.8035f,140.625f, +226.563f,21.0813f,140.625f, +230.469f,20.4423f,140.625f, +234.375f,19.372f,140.625f, +238.281f,16.9074f,140.625f, +242.188f,15.6931f,140.625f, +246.094f,14.0046f,140.625f, +250.0f,12.7719f,140.625f, +3.90626f,19.7224f,136.719f, +7.81251f,20.3645f,136.719f, +11.7188f,20.1938f,136.719f, +15.625f,20.0122f,136.719f, +19.5313f,20.9204f,136.719f, +23.4375f,20.2208f,136.719f, +27.3438f,19.3419f,136.719f, +31.25f,18.2059f,136.719f, +35.1563f,17.6089f,136.719f, +39.0625f,17.131f,136.719f, +42.9688f,16.8349f,136.719f, +46.875f,16.3462f,136.719f, +50.7813f,15.4488f,136.719f, +54.6875f,15.7887f,136.719f, +58.5938f,16.431f,136.719f, +62.5f,16.3378f,136.719f, +66.4063f,17.4585f,136.719f, +70.3125f,17.5113f,136.719f, +74.2188f,17.6407f,136.719f, +78.125f,17.0887f,136.719f, +82.0313f,17.2555f,136.719f, +85.9375f,18.6283f,136.719f, +89.8438f,19.6874f,136.719f, +93.75f,21.0963f,136.719f, +97.6563f,21.5582f,136.719f, +101.563f,24.9129f,136.719f, +105.469f,27.5761f,136.719f, +109.375f,28.7426f,136.719f, +113.281f,31.0958f,136.719f, +117.188f,33.7564f,136.719f, +121.094f,34.6927f,136.719f, +125.0f,35.0503f,136.719f, +128.906f,36.0657f,136.719f, +132.813f,37.2001f,136.719f, +136.719f,38.5625f,136.719f, +140.625f,38.8809f,136.719f, +144.531f,39.3646f,136.719f, +148.438f,38.919f,136.719f, +152.344f,39.5251f,136.719f, +156.25f,39.5392f,136.719f, +160.156f,39.7011f,136.719f, +164.063f,38.4043f,136.719f, +167.969f,37.7232f,136.719f, +171.875f,37.8418f,136.719f, +175.781f,41.0576f,136.719f, +179.688f,40.6804f,136.719f, +183.594f,40.6431f,136.719f, +187.5f,41.2286f,136.719f, +191.406f,40.221f,136.719f, +195.313f,37.9197f,136.719f, +199.219f,30.9591f,136.719f, +203.125f,28.2027f,136.719f, +207.031f,25.2338f,136.719f, +210.938f,24.1525f,136.719f, +214.844f,23.6344f,136.719f, +218.75f,22.6246f,136.719f, +222.656f,21.3675f,136.719f, +226.563f,21.0207f,136.719f, +230.469f,20.2558f,136.719f, +234.375f,18.3661f,136.719f, +238.281f,16.7584f,136.719f, +242.188f,16.2723f,136.719f, +246.094f,14.7268f,136.719f, +250.0f,13.5973f,136.719f, +3.90626f,19.9574f,132.813f, +7.8125f,21.126f,132.813f, +11.7188f,20.9977f,132.813f, +15.625f,21.2478f,132.813f, +19.5313f,21.5981f,132.813f, +23.4375f,20.0536f,132.813f, +27.3438f,18.6025f,132.813f, +31.25f,18.166f,132.813f, +35.1563f,17.207f,132.813f, +39.0625f,17.3703f,132.813f, +42.9688f,16.3317f,132.813f, +46.875f,15.4769f,132.813f, +50.7813f,14.7771f,132.813f, +54.6875f,14.8038f,132.813f, +58.5938f,15.7291f,132.813f, +62.5f,16.2292f,132.813f, +66.4063f,17.1488f,132.813f, +70.3125f,17.5027f,132.813f, +74.2188f,16.9736f,132.813f, +78.125f,16.4014f,132.813f, +82.0313f,16.7581f,132.813f, +85.9375f,18.1894f,132.813f, +89.8438f,20.0178f,132.813f, +93.75f,20.5813f,132.813f, +97.6563f,22.5893f,132.813f, +101.563f,25.6741f,132.813f, +105.469f,28.0908f,132.813f, +109.375f,29.1124f,132.813f, +113.281f,31.4752f,132.813f, +117.188f,33.2328f,132.813f, +121.094f,34.3747f,132.813f, +125.0f,34.8849f,132.813f, +128.906f,36.3771f,132.813f, +132.813f,37.3154f,132.813f, +136.719f,38.6196f,132.813f, +140.625f,39.1474f,132.813f, +144.531f,39.5395f,132.813f, +148.438f,38.9241f,132.813f, +152.344f,39.6801f,132.813f, +156.25f,39.7675f,132.813f, +160.156f,39.4464f,132.813f, +164.063f,38.2967f,132.813f, +167.969f,37.3679f,132.813f, +171.875f,36.5147f,132.813f, +175.781f,35.9217f,132.813f, +179.688f,35.6874f,132.813f, +183.594f,36.0348f,132.813f, +187.5f,36.167f,132.813f, +191.406f,34.7462f,132.813f, +195.313f,32.5911f,132.813f, +199.219f,30.8509f,132.813f, +203.125f,27.889f,132.813f, +207.031f,25.0869f,132.813f, +210.938f,23.713f,132.813f, +214.844f,23.4714f,132.813f, +218.75f,22.2633f,132.813f, +222.656f,21.1409f,132.813f, +226.563f,20.2725f,132.813f, +230.469f,19.4678f,132.813f, +234.375f,18.4511f,132.813f, +238.281f,18.0306f,132.813f, +242.188f,17.5677f,132.813f, +246.094f,16.403f,132.813f, +250.0f,14.7316f,132.813f, +3.90626f,20.0876f,128.906f, +7.81252f,21.0764f,128.906f, +11.7188f,21.4076f,128.906f, +15.625f,22.6299f,128.906f, +19.5313f,22.1174f,128.906f, +23.4375f,20.3977f,128.906f, +27.3438f,18.7343f,128.906f, +31.25f,17.9144f,128.906f, +35.1563f,17.2941f,128.906f, +39.0625f,16.5386f,128.906f, +42.9688f,15.6892f,128.906f, +46.875f,14.6414f,128.906f, +50.7813f,14.3505f,128.906f, +54.6875f,14.1604f,128.906f, +58.5938f,14.517f,128.906f, +62.5f,15.1057f,128.906f, +66.4063f,16.0684f,128.906f, +70.3125f,16.6251f,128.906f, +74.2188f,15.9689f,128.906f, +78.125f,16.0234f,128.906f, +82.0313f,16.205f,128.906f, +85.9375f,18.8167f,128.906f, +89.8438f,19.6433f,128.906f, +93.75f,20.2916f,128.906f, +97.6563f,23.2308f,128.906f, +101.563f,25.882f,128.906f, +105.469f,27.5736f,128.906f, +109.375f,28.9662f,128.906f, +113.281f,30.5702f,128.906f, +117.188f,31.8627f,128.906f, +121.094f,32.5216f,128.906f, +125.0f,34.1918f,128.906f, +128.906f,37.0161f,128.906f, +132.813f,38.5084f,128.906f, +136.719f,39.1631f,128.906f, +140.625f,39.0529f,128.906f, +144.531f,38.9229f,128.906f, +148.438f,38.4312f,128.906f, +152.344f,39.1086f,128.906f, +156.25f,39.7022f,128.906f, +160.156f,39.3007f,128.906f, +164.063f,38.2318f,128.906f, +167.969f,36.7493f,128.906f, +171.875f,35.9781f,128.906f, +175.781f,35.7712f,128.906f, +179.688f,35.6247f,128.906f, +183.594f,35.4808f,128.906f, +187.5f,35.6102f,128.906f, +191.406f,34.0305f,128.906f, +195.313f,32.0227f,128.906f, +199.219f,29.7666f,128.906f, +203.125f,27.3968f,128.906f, +207.031f,25.1642f,128.906f, +210.938f,24.279f,128.906f, +214.844f,22.4357f,128.906f, +218.75f,21.7754f,128.906f, +222.656f,19.6381f,128.906f, +226.563f,19.78f,128.906f, +230.469f,20.0349f,128.906f, +234.375f,19.1534f,128.906f, +238.281f,17.863f,128.906f, +242.188f,17.658f,128.906f, +246.094f,16.951f,128.906f, +250.0f,16.2961f,128.906f, +}; + +btScalar Landscape01Nml[] = { +-0.145347f,0.988603f,0.0392193f, +-0.118578f,0.971903f,-0.203332f, +-0.210348f,0.975548f,0.0637181f, +-0.143154f,0.979915f,-0.138828f, +-0.186466f,0.976661f,0.106602f, +-0.200996f,0.973874f,-0.105691f, +-0.200019f,0.979742f,-0.00987837f, +-0.162567f,0.986516f,-0.0189093f, +-0.128872f,0.991658f,-0.00262187f, +-0.0972065f,0.993702f,0.0557464f, +-0.232168f,0.972676f,8.39761e-005f, +-0.280715f,0.959127f,-0.0356947f, +-0.328537f,0.944066f,-0.0283446f, +-0.348021f,0.936189f,-0.0493126f, +-0.28502f,0.953899f,-0.0940249f, +-0.329197f,0.938125f,-0.107479f, +-0.186873f,0.969867f,-0.15632f, +-0.168074f,0.98179f,-0.088542f, +0.138723f,0.984643f,-0.105994f, +0.139713f,0.984758f,-0.103594f, +0.415149f,0.907443f,-0.0647914f, +0.335594f,0.916204f,-0.218967f, +0.391251f,0.906316f,-0.159731f, +0.297117f,0.890775f,-0.343864f, +0.0782406f,0.948307f,-0.307558f, +0.0742546f,0.932023f,-0.354711f, +-0.0593029f,0.94484f,-0.322118f, +-0.035102f,0.9388f,-0.342668f, +-0.0398386f,0.972105f,-0.231139f, +0.0142535f,0.946652f,-0.321942f, +-0.149407f,0.982239f,-0.113505f, +-0.186817f,0.918353f,-0.348895f, +-0.227035f,0.95418f,-0.194923f, +-0.217455f,0.921613f,-0.32147f, +-0.104683f,0.961425f,-0.254368f, +-0.137473f,0.92562f,-0.352602f, +-0.0889131f,0.942391f,-0.322479f, +-0.137942f,0.895959f,-0.422173f, +-0.0994313f,0.915873f,-0.38896f, +-0.177412f,0.858967f,-0.480312f, +-0.28046f,0.843765f,-0.457605f, +-0.23875f,0.832625f,-0.499733f, +-0.35769f,0.865922f,-0.349624f, +-0.239679f,0.924761f,-0.295585f, +-0.367472f,0.894137f,-0.255898f, +-0.306721f,0.940051f,-0.149083f, +-0.29191f,0.929123f,-0.226977f, +-0.3205f,0.928892f,-0.185579f, +-0.367832f,0.894452f,-0.254274f, +-0.393375f,0.898238f,-0.196023f, +-0.386104f,0.869165f,-0.308993f, +-0.416765f,0.860247f,-0.293737f, +-0.257238f,0.898443f,-0.355849f, +-0.273377f,0.911812f,-0.306372f, +-0.228654f,0.889208f,-0.396265f, +-0.28545f,0.876522f,-0.387592f, +-0.142316f,0.885962f,-0.441381f, +-0.101084f,0.908701f,-0.405025f, +0.035618f,0.945519f,-0.323614f, +0.103277f,0.941647f,-0.320368f, +-0.120589f,0.957422f,-0.262302f, +-0.186114f,0.894712f,-0.40602f, +-0.202962f,0.931974f,-0.300385f, +-0.162074f,0.943023f,-0.290584f, +-0.152017f,0.933176f,-0.325688f, +-0.202811f,0.891764f,-0.404505f, +-0.195614f,0.919053f,-0.342165f, +-0.221332f,0.883262f,-0.413352f, +-0.230949f,0.883479f,-0.407587f, +-0.202664f,0.884798f,-0.419595f, +-0.013827f,0.935183f,-0.353894f, +0.0613953f,0.949306f,-0.308299f, +0.0379666f,0.956996f,-0.287605f, +0.0239474f,0.920688f,-0.389564f, +-0.124568f,0.971246f,-0.20289f, +-0.0173673f,0.966674f,-0.255421f, +-0.280608f,0.954174f,-0.103981f, +-0.188825f,0.978003f,-0.0886339f, +-0.193278f,0.981044f,-0.0139968f, +-0.089832f,0.992161f,0.0868734f, +-0.0617809f,0.994525f,0.0842802f, +0.0316335f,0.979002f,0.20138f, +0.126601f,0.973442f,0.190743f, +0.126356f,0.954056f,0.271683f, +0.0296197f,0.996225f,0.0816031f, +-0.130879f,0.990212f,-0.0484936f, +-0.0775613f,0.996382f,0.0347567f, +-0.0318445f,0.999049f,0.0297665f, +0.174213f,0.981835f,0.0751658f, +0.230898f,0.968544f,0.0927823f, +0.477724f,0.867555f,0.138304f, +0.489512f,0.856269f,0.164868f, +0.425011f,0.903484f,0.0555235f, +0.345126f,0.937885f,0.0355011f, +0.051136f,0.997417f,-0.0504465f, +0.0111243f,0.99878f,-0.0481145f, +0.00085351f,0.998643f,-0.0520782f, +-0.0736129f,0.992491f,-0.0976874f, +0.0605446f,0.978416f,-0.197578f, +-0.1248f,0.898669f,-0.420499f, +-0.068151f,0.956411f,-0.28396f, +0.0502596f,0.934397f,-0.35267f, +0.0492358f,0.99416f,-0.096025f, +0.22311f,0.97441f,-0.0273246f, +0.104257f,0.993921f,-0.0353788f, +0.135731f,0.987345f,0.0820234f, +0.0508084f,0.996415f,-0.0676404f, +0.013783f,0.999772f,-0.0162859f, +0.0814861f,0.996154f,-0.0322044f, +0.0451487f,0.998313f,-0.0365194f, +0.035547f,0.992801f,-0.114375f, +-0.0977551f,0.955799f,-0.277294f, +0.0588118f,0.977967f,-0.200303f, +0.0956551f,0.968682f,-0.229142f, +0.255494f,0.951171f,-0.173197f, +0.287347f,0.949686f,-0.124613f, +0.300983f,0.934694f,-0.189092f, +0.326044f,0.937015f,-0.125296f, +0.170234f,0.979103f,-0.111255f, +0.217643f,0.971688f,-0.0919459f, +0.0857423f,0.995f,-0.0512173f, +0.141055f,0.988855f,0.0476293f, +0.141065f,0.98942f,-0.0338874f, +0.161562f,0.986303f,0.0332183f, +0.113059f,0.993231f,0.0266602f, +0.073071f,0.997081f,-0.0221543f, +-0.0590251f,0.997651f,-0.034775f, +-0.0264959f,0.999595f,0.0103962f, +-0.0628475f,0.932757f,0.354985f, +-0.188464f,0.930547f,0.31395f, +-0.11595f,0.95582f,0.270118f, +-0.0150745f,0.981122f,0.192801f, +-0.121292f,0.98854f,0.0898753f, +-0.191875f,0.979293f,0.0645635f, +-0.302211f,0.947932f,-0.100469f, +-0.168835f,0.972187f,-0.162321f, +-0.165107f,0.942083f,-0.291925f, +0.0524842f,0.966783f,-0.250151f, +0.334898f,0.925425f,-0.177288f, +0.453352f,0.888614f,-0.0695481f, +0.212879f,0.976177f,-0.0419751f, +-0.0859137f,0.991174f,-0.100958f, +-0.19247f,0.980365f,-0.0428897f, +-0.217979f,0.975456f,0.0311624f, +-0.130678f,0.991292f,-0.0162531f, +0.0105625f,0.994964f,-0.0996785f, +-0.0191557f,0.967247f,-0.253114f, +-0.034833f,0.962122f,-0.270385f, +-0.195874f,0.937997f,-0.285996f, +-0.397161f,0.831379f,-0.388681f, +-0.379064f,0.825916f,-0.417342f, +-0.284483f,0.874083f,-0.393762f, +-0.320157f,0.86551f,-0.385217f, +-0.327447f,0.85814f,-0.395442f, +-0.219114f,0.871062f,-0.439592f, +-0.161876f,0.861769f,-0.480781f, +-0.18946f,0.845726f,-0.498852f, +-0.191307f,0.924603f,-0.32941f, +-0.159365f,0.982225f,-0.0991764f, +-0.164558f,0.975832f,-0.143777f, +-0.155521f,0.974006f,-0.164699f, +-0.172244f,0.972979f,-0.153766f, +-0.162541f,0.961346f,-0.222247f, +-0.11171f,0.955927f,-0.271523f, +-0.101714f,0.980079f,-0.170586f, +-0.223397f,0.974336f,-0.0276274f, +-0.300622f,0.953413f,0.0251167f, +-0.254202f,0.967133f,-0.00586307f, +-0.0994566f,0.994394f,0.0359007f, +0.078652f,0.996758f,-0.0169243f, +-0.0552979f,0.987555f,0.147234f, +-0.0666628f,0.864508f,0.498179f, +0.131082f,0.854494f,0.502651f, +0.414695f,0.764646f,0.4933f, +0.432926f,0.790826f,0.432632f, +0.126593f,0.91514f,0.382744f, +-0.0157552f,0.943082f,0.332186f, +0.122694f,0.924647f,0.36052f, +0.0975822f,0.984244f,0.147447f, +-0.026294f,0.960938f,-0.275512f, +0.1231f,0.958251f,-0.258072f, +0.037902f,0.976085f,-0.214059f, +-0.000148888f,0.992562f,-0.121742f, +0.0716429f,0.997173f,-0.0226693f, +0.135484f,0.989193f,-0.0560393f, +0.275603f,0.956281f,-0.0978236f, +0.283097f,0.956822f,-0.0659346f, +0.109624f,0.991403f,-0.0714361f, +0.084436f,0.990816f,-0.105609f, +0.0791881f,0.990931f,-0.108558f, +0.0674956f,0.997569f,-0.0173508f, +0.0556006f,0.998429f,0.00688119f, +-0.144974f,0.947519f,0.28494f, +-0.110826f,0.961365f,0.251981f, +-0.0669451f,0.996693f,0.0460586f, +-0.00516145f,0.998802f,0.0486696f, +-0.116537f,0.988089f,0.100498f, +-0.0456605f,0.993379f,0.105422f, +-0.110131f,0.987256f,-0.114879f, +-0.0746162f,0.968429f,-0.237861f, +-0.0785155f,0.952358f,-0.294703f, +-0.0192369f,0.946876f,-0.321024f, +0.320056f,0.920022f,-0.226108f, +0.288692f,0.932613f,-0.216541f, +0.123147f,0.991593f,-0.0397145f, +-0.113817f,0.992375f,0.0473138f, +-0.192042f,0.9774f,0.0883642f, +-0.156949f,0.987573f,0.00819321f, +-0.0848586f,0.992344f,-0.0897344f, +0.0818673f,0.992357f,-0.0923282f, +0.113464f,0.986976f,-0.114035f, +-0.0777263f,0.979155f,-0.187653f, +-0.11587f,0.975173f,-0.188711f, +-0.26618f,0.902421f,-0.338799f, +-0.343104f,0.842974f,-0.414336f, +-0.318919f,0.837107f,-0.444457f, +-0.324821f,0.839352f,-0.435867f, +-0.312979f,0.836318f,-0.45013f, +-0.203015f,0.862499f,-0.463553f, +-0.14187f,0.900483f,-0.411101f, +-0.22968f,0.933243f,-0.276233f, +-0.413973f,0.871187f,-0.263932f, +-0.305656f,0.93798f,-0.163607f, +-0.161875f,0.985861f,-0.0433003f, +-0.135788f,0.990721f,0.00582442f, +-0.138617f,0.984876f,-0.103942f, +-0.135024f,0.980056f,-0.145806f, +-0.124871f,0.989793f,-0.068687f, +-0.182018f,0.982992f,-0.024403f, +-0.309743f,0.950592f,-0.0208625f, +-0.30492f,0.95221f,0.0178823f, +-0.299424f,0.951826f,0.066125f, +-0.120448f,0.944431f,0.305848f, +0.118213f,0.907792f,0.402418f, +-0.261318f,0.917154f,0.300902f, +-0.411401f,0.860866f,0.299431f, +0.15139f,0.91772f,0.367249f, +0.409879f,0.832051f,0.373752f, +0.446772f,0.77668f,0.44403f, +0.301572f,0.80653f,0.508491f, +0.168293f,0.89172f,0.420135f, +0.0587854f,0.961406f,0.26878f, +0.30067f,0.896979f,0.324077f, +0.282217f,0.935284f,0.213535f, +0.148185f,0.986837f,0.0647602f, +-0.0572401f,0.974528f,-0.216838f, +-0.0945497f,0.96665f,-0.238009f, +-0.000668496f,0.9725f,-0.232902f, +0.125989f,0.980136f,-0.15317f, +0.218059f,0.975888f,-0.00959987f, +0.265461f,0.958501f,0.103951f, +0.173443f,0.98019f,0.0956349f, +0.133691f,0.987754f,0.0804258f, +0.0900836f,0.995272f,0.0363034f, +0.0177237f,0.999106f,-0.0383914f, +0.042211f,0.998744f,-0.0269875f, +0.0720539f,0.94434f,0.320982f, +0.0948772f,0.964987f,0.244537f, +0.123635f,0.987961f,0.0929884f, +-0.0283728f,0.998997f,-0.0346279f, +-0.152337f,0.985597f,-0.0734363f, +-0.0291778f,0.996634f,-0.0766092f, +0.0594392f,0.995285f,-0.0766423f, +-0.027888f,0.982723f,-0.182971f, +-0.0125244f,0.971758f,-0.235647f, +-0.0767296f,0.943557f,-0.322201f, +0.2299f,0.955601f,-0.184318f, +0.271645f,0.9586f,-0.0854157f, +0.0112173f,0.999015f,-0.0429278f, +-0.142475f,0.989464f,-0.02574f, +-0.192441f,0.979224f,-0.0639254f, +-0.103523f,0.99301f,-0.0567016f, +-0.00378459f,0.998834f,-0.0481324f, +0.0499927f,0.992415f,-0.112309f, +0.0737699f,0.994576f,-0.0733206f, +-0.0190206f,0.999623f,-0.0197948f, +-0.0783652f,0.99692f,0.00307073f, +-0.152226f,0.987897f,0.0297819f, +-0.333638f,0.940154f,-0.069252f, +-0.307736f,0.941909f,-0.134557f, +-0.334924f,0.918699f,-0.209327f, +-0.35357f,0.914459f,-0.19686f, +-0.243406f,0.963329f,-0.112917f, +-0.31479f,0.943784f,-0.100892f, +-0.368184f,0.929745f,0.00391099f, +-0.386308f,0.922293f,-0.0119138f, +-0.337617f,0.936762f,-0.0921568f, +-0.305867f,0.947033f,-0.0978487f, +-0.109063f,0.994026f,0.00418869f, +0.00976093f,0.996792f,-0.0794369f, +-0.152053f,0.972765f,-0.17495f, +-0.268682f,0.956747f,-0.111559f, +-0.16583f,0.986099f,0.0104333f, +-0.26795f,0.960138f,-0.0796053f, +-0.428361f,0.903607f,0.000904858f, +-0.364896f,0.884093f,0.291943f, +-0.411739f,0.889329f,0.19891f, +-0.213918f,0.942658f,0.256194f, +-0.0353818f,0.912316f,0.407955f, +-0.234679f,0.972031f,0.0090071f, +0.164799f,0.976041f,-0.142074f, +0.378329f,0.920537f,-0.0973577f, +0.389048f,0.913009f,0.122701f, +0.312785f,0.918579f,0.241617f, +0.331426f,0.913352f,0.236529f, +0.235473f,0.970893f,0.043811f, +0.0409183f,0.988429f,-0.14606f, +0.183882f,0.951979f,0.244794f, +0.256685f,0.844334f,0.470333f, +0.243297f,0.84406f,0.47788f, +0.178194f,0.957255f,0.227835f, +0.0574376f,0.965885f,-0.252523f, +-0.0590426f,0.961892f,-0.266977f, +0.0063288f,0.996614f,-0.081983f, +0.221194f,0.97242f,0.0739783f, +0.131016f,0.988415f,0.0766141f, +0.0953963f,0.986256f,0.134901f, +0.160579f,0.972927f,0.166216f, +0.109946f,0.983906f,0.14086f, +0.027673f,0.996741f,0.0757784f, +0.095102f,0.971229f,0.218334f, +0.102357f,0.973251f,0.205684f, +0.193741f,0.956416f,0.218477f, +0.132416f,0.984788f,0.112512f, +-0.0766537f,0.99488f,-0.0658589f, +-0.0304197f,0.995587f,-0.0887742f, +0.0261631f,0.997431f,-0.0666789f, +0.0720508f,0.996334f,-0.0461268f, +0.110802f,0.979106f,-0.170512f, +-0.036534f,0.946972f,-0.319234f, +0.0562543f,0.953438f,-0.296297f, +0.21433f,0.964539f,-0.154036f, +-0.0463138f,0.986383f,-0.157808f, +-0.114222f,0.99275f,-0.0374399f, +-0.129535f,0.99146f,-0.0150624f, +-0.148036f,0.985214f,-0.0862475f, +-0.0412316f,0.997863f,-0.050697f, +0.0938182f,0.995513f,-0.0123356f, +0.0585542f,0.997889f,-0.0281043f, +-0.11195f,0.993633f,0.0126653f, +-0.208443f,0.969116f,0.131782f, +-0.178284f,0.959747f,0.217024f, +-0.249524f,0.951637f,0.179236f, +-0.204568f,0.966799f,0.153139f, +-0.277831f,0.959694f,0.042405f, +-0.421523f,0.906804f,-0.00501147f, +-0.349246f,0.93481f,0.0644755f, +-0.271825f,0.953501f,0.130185f, +-0.341243f,0.939899f,0.0119564f, +-0.356048f,0.93224f,-0.0644791f, +-0.286188f,0.955628f,-0.0697892f, +-0.248084f,0.956522f,-0.153364f, +-0.154022f,0.960443f,-0.232007f, +0.032406f,0.989794f,-0.138774f, +-0.0622078f,0.991529f,-0.114016f, +-0.335467f,0.915845f,-0.220659f, +-0.194821f,0.973732f,-0.117857f, +-0.29903f,0.953799f,-0.0291431f, +-0.514277f,0.834668f,0.197101f, +-0.344769f,0.927072f,0.147212f, +-0.0936834f,0.993837f,0.0592615f, +-0.181141f,0.974379f,-0.133321f, +-0.0841805f,0.983933f,-0.157447f, +0.0661375f,0.94785f,-0.31178f, +0.143104f,0.856028f,-0.496726f, +0.226417f,0.827547f,-0.513714f, +0.178899f,0.912784f,-0.367179f, +0.234616f,0.943911f,-0.232351f, +0.346693f,0.91935f,-0.186008f, +0.307074f,0.943627f,-0.123586f, +0.214863f,0.970065f,0.113171f, +0.0234555f,0.999712f,0.00506759f, +-0.0206358f,0.99868f,0.047041f, +0.0320247f,0.946177f,0.322062f, +0.23638f,0.837444f,0.492759f, +0.410368f,0.848265f,0.33473f, +-0.0124285f,0.999913f,-0.00451951f, +-0.13197f,0.981357f,-0.139724f, +0.0888915f,0.995883f,0.0177605f, +0.12955f,0.973581f,0.188033f, +0.100974f,0.97841f,0.18033f, +0.116628f,0.987352f,0.107396f, +0.0879041f,0.989191f,0.117361f, +0.114472f,0.980893f,0.157306f, +0.0306685f,0.986407f,0.161431f, +0.128704f,0.972047f,0.196366f, +0.21783f,0.966546f,0.135421f, +0.280184f,0.953049f,0.114866f, +0.0272615f,0.999564f,-0.0113551f, +-0.0491486f,0.997279f,-0.0549472f, +0.00337261f,0.998977f,-0.0450999f, +0.0913253f,0.995457f,-0.0269266f, +0.252481f,0.964775f,-0.0739122f, +0.0897947f,0.975122f,-0.202665f, +-0.0238258f,0.968534f,-0.247739f, +0.162662f,0.981573f,-0.10028f, +-0.0276113f,0.997652f,-0.0626774f, +-0.289082f,0.95335f,-0.0869268f, +-0.160594f,0.986876f,0.0169191f, +-0.0752137f,0.997117f,0.00999502f, +-0.0455931f,0.997939f,-0.0451647f, +0.0616976f,0.995202f,-0.0759372f, +-0.00353073f,0.999867f,-0.0159004f, +-0.177748f,0.976224f,0.124065f, +-0.247702f,0.959217f,0.136188f, +-0.164797f,0.981869f,0.0936766f, +-0.214718f,0.976098f,0.0335935f, +-0.211552f,0.977318f,-0.00980662f, +-0.200169f,0.979677f,0.0128577f, +-0.39928f,0.916411f,-0.027687f, +-0.374531f,0.927212f,0.0022105f, +-0.268102f,0.963363f,0.00736207f, +-0.247283f,0.968232f,-0.0371081f, +-0.289483f,0.949449f,-0.121432f, +-0.253482f,0.93971f,-0.229547f, +-0.132892f,0.950758f,-0.279997f, +-0.140676f,0.931036f,-0.336723f, +-0.161496f,0.9509f,-0.264023f, +-0.0403886f,0.9973f,-0.0613364f, +-0.215095f,0.96767f,-0.131717f, +-0.434628f,0.895597f,-0.0948964f, +-0.381939f,0.886142f,0.262442f, +-0.43994f,0.880276f,0.177672f, +-0.252792f,0.948954f,-0.188633f, +-0.0941535f,0.957693f,-0.271953f, +-0.13352f,0.964535f,-0.227692f, +0.0341173f,0.927935f,-0.371176f, +0.348577f,0.799586f,-0.489036f, +0.387188f,0.819484f,-0.42253f, +0.14352f,0.883544f,-0.445815f, +0.0762879f,0.891752f,-0.446047f, +0.0742711f,0.875908f,-0.476728f, +0.300515f,0.871535f,-0.38745f, +0.0625809f,0.886656f,-0.458175f, +-0.0365474f,0.9191f,-0.392325f, +-0.0762363f,0.966891f,-0.243538f, +0.0117284f,0.995382f,0.0952715f, +0.0102532f,0.999347f,-0.0346391f, +-0.059511f,0.989492f,-0.131776f, +0.349383f,0.904972f,0.24281f, +0.425179f,0.763732f,0.485732f, +-0.0166138f,0.992406f,0.121875f, +-0.122272f,0.990094f,0.0690156f, +-0.015652f,0.970579f,0.240273f, +0.124649f,0.94771f,0.293785f, +0.220282f,0.938434f,0.266116f, +0.102745f,0.973801f,0.202865f, +0.0640356f,0.977435f,0.201297f, +-0.0952943f,0.987515f,0.125435f, +0.114947f,0.977151f,0.178783f, +0.258472f,0.957495f,0.128042f, +0.282157f,0.951094f,0.125728f, +0.142066f,0.986542f,0.0809464f, +-0.0434313f,0.998053f,-0.0447576f, +0.0347776f,0.999239f,-0.0176595f, +0.102204f,0.984881f,-0.139871f, +0.245582f,0.958619f,-0.144014f, +0.135608f,0.990697f,0.0113886f, +-0.0626335f,0.997441f,0.0344788f, +-0.0132478f,0.995736f,0.0912912f, +-0.039638f,0.981575f,0.186922f, +-0.205229f,0.973473f,0.10115f, +-0.153245f,0.987696f,-0.0311751f, +-0.0852914f,0.993336f,-0.0775215f, +0.0304281f,0.997751f,-0.0597208f, +0.0412582f,0.993049f,-0.110237f, +-0.115798f,0.992196f,0.0462328f, +-0.265664f,0.954942f,0.132323f, +-0.179634f,0.978355f,0.102729f, +-0.122093f,0.992469f,0.00988423f, +-0.0976525f,0.994936f,-0.0237989f, +-0.19391f,0.963376f,-0.185219f, +-0.249328f,0.960076f,-0.126845f, +-0.386054f,0.920896f,-0.0539736f, +-0.40236f,0.909842f,-0.101455f, +-0.264839f,0.959901f,-0.091928f, +-0.215529f,0.973573f,-0.0755211f, +-0.190591f,0.977631f,-0.0889496f, +-0.114636f,0.971653f,-0.20676f, +-0.147698f,0.942871f,-0.29863f, +-0.153003f,0.970479f,-0.186443f, +-0.259911f,0.94737f,-0.186912f, +-0.218176f,0.967871f,-0.124997f, +-0.218418f,0.965394f,0.142507f, +-0.497944f,0.825767f,0.264878f, +-0.394522f,0.874216f,0.283017f, +-0.174161f,0.980284f,0.0933364f, +-0.0291225f,0.984908f,-0.170609f, +-0.149188f,0.939649f,-0.307902f, +-0.109448f,0.970586f,-0.214438f, +0.391051f,0.895182f,-0.213842f, +0.237246f,0.888641f,-0.392468f, +0.104812f,0.984981f,-0.137213f, +0.1294f,0.991592f,-0.000205693f, +0.119158f,0.992497f,-0.0274125f, +0.117487f,0.990494f,-0.071548f, +0.234708f,0.962187f,-0.138234f, +0.347721f,0.937443f,-0.017023f, +0.135989f,0.962379f,-0.235229f, +-0.193384f,0.875532f,-0.442772f, +-0.209357f,0.905544f,-0.368998f, +0.0641865f,0.982942f,-0.172352f, +0.0534516f,0.998302f,-0.023133f, +-0.0579793f,0.992675f,-0.105989f, +0.299444f,0.827258f,0.475371f, +0.320901f,0.752799f,0.574731f, +-0.0625162f,0.964286f,0.257381f, +-0.0931157f,0.981324f,0.168322f, +0.0981691f,0.975509f,0.19684f, +0.238911f,0.944952f,0.223577f, +0.0852945f,0.980047f,0.179533f, +0.0437708f,0.96942f,0.241474f, +-0.0654565f,0.948925f,0.308637f, +0.105877f,0.941798f,0.319071f, +0.298409f,0.90697f,0.29725f, +0.267454f,0.931587f,0.246198f, +0.257873f,0.930012f,0.261877f, +0.0608152f,0.99476f,0.0821851f, +0.0682325f,0.995644f,-0.0635329f, +0.204976f,0.974836f,-0.0876375f, +0.100643f,0.994422f,0.031559f, +-0.0498971f,0.971595f,0.231328f, +-0.0948982f,0.951903f,0.291332f, +-0.0140779f,0.962693f,0.270229f, +0.0194699f,0.983768f,0.178386f, +-0.0700516f,0.997536f,0.00373294f, +-0.0458738f,0.991776f,-0.119485f, +-0.0457685f,0.983541f,-0.17479f, +0.031836f,0.984739f,-0.171101f, +-0.0846163f,0.991107f,-0.102703f, +-0.250146f,0.959975f,0.125993f, +-0.240823f,0.966766f,0.0858408f, +-0.110771f,0.993685f,0.0178603f, +-0.0536647f,0.99805f,-0.0318645f, +-0.0537905f,0.996775f,-0.0595505f, +-0.0979926f,0.994498f,-0.0370296f, +-0.317761f,0.946482f,-0.0565711f, +-0.353331f,0.932392f,-0.0761719f, +-0.315921f,0.918114f,-0.23929f, +-0.304095f,0.907663f,-0.289264f, +-0.232301f,0.951296f,-0.202665f, +-0.181242f,0.959764f,-0.214488f, +-0.0415921f,0.982269f,-0.182804f, +-0.134113f,0.976644f,-0.16787f, +-0.266673f,0.950383f,-0.160182f, +-0.233335f,0.968889f,-0.0825141f, +-0.383896f,0.923094f,0.0228394f, +-0.46523f,0.826401f,0.317211f, +-0.448022f,0.824389f,0.345917f, +-0.335673f,0.941977f,-0.00160348f, +0.00939714f,0.9768f,-0.213948f, +0.0525806f,0.945774f,-0.320541f, +-0.0139338f,0.984205f,-0.176483f, +-0.233879f,0.941098f,-0.244203f, +0.35813f,0.924476f,-0.13072f, +0.148621f,0.988076f,0.040214f, +-0.0873945f,0.896884f,0.433546f, +0.16715f,0.882598f,0.43941f, +0.105867f,0.92276f,0.370549f, +0.162793f,0.877156f,0.451769f, +0.26606f,0.895485f,0.356818f, +0.178343f,0.923603f,0.339339f, +0.205659f,0.876785f,0.434686f, +0.164046f,0.939287f,0.301379f, +-0.304778f,0.94913f,-0.0791393f, +-0.351721f,0.931897f,-0.088655f, +-0.137155f,0.986834f,0.0857151f, +-0.0493791f,0.984585f,0.167793f, +-0.29261f,0.942092f,0.163834f, +0.175576f,0.863797f,0.472257f, +0.388427f,0.769345f,0.507181f, +0.0396361f,0.995255f,0.0888612f, +0.000897162f,0.999738f,-0.022857f, +0.263974f,0.951061f,0.160623f, +0.140984f,0.987533f,0.0700142f, +-0.0604349f,0.998129f,-0.00925637f, +-0.0323604f,0.969904f,0.241328f, +0.0249905f,0.978924f,0.202689f, +0.301944f,0.900385f,0.313268f, +0.302439f,0.903212f,0.304531f, +0.227241f,0.927301f,0.297445f, +0.295557f,0.903047f,0.311692f, +0.215996f,0.968849f,0.121149f, +0.0543993f,0.994951f,0.0843384f, +-0.108272f,0.967731f,0.227539f, +-0.144218f,0.941468f,0.304694f, +-0.0465574f,0.94074f,0.335917f, +0.0834793f,0.95338f,0.289996f, +0.159412f,0.96437f,0.211135f, +0.125672f,0.984055f,0.125864f, +0.0125305f,0.999902f,-0.00630946f, +-0.0213081f,0.999771f,-0.00209364f, +-0.0845682f,0.99631f,0.014661f, +-0.191644f,0.962461f,0.192203f, +-0.326186f,0.912172f,0.248084f, +-0.125723f,0.965189f,0.229357f, +-0.0487346f,0.993706f,0.100859f, +0.0069351f,0.999976f,0.00057427f, +-0.0853775f,0.991791f,-0.0951918f, +-0.217561f,0.97582f,-0.0210368f, +-0.247132f,0.964013f,0.0979986f, +-0.253847f,0.965546f,-0.0573009f, +-0.17269f,0.977352f,-0.122318f, +-0.308873f,0.930936f,-0.19482f, +-0.274273f,0.935966f,-0.220775f, +-0.176582f,0.954344f,-0.240926f, +-0.17678f,0.967725f,-0.179601f, +-0.142126f,0.989789f,-0.0108556f, +-0.241082f,0.966299f,-0.0902532f, +-0.303483f,0.94088f,-0.150476f, +-0.634535f,0.768468f,-0.082594f, +-0.47113f,0.814002f,0.339761f, +-0.289984f,0.937003f,0.194769f, +0.025067f,0.999685f,-0.000862102f, +0.289006f,0.893747f,-0.343064f, +0.00615404f,0.935866f,-0.352301f, +-0.338901f,0.929111f,-0.147984f, +-0.164518f,0.985591f,-0.0393034f, +0.290961f,0.935697f,-0.199533f, +-0.0876053f,0.971539f,-0.220083f, +-0.32548f,0.935239f,0.139248f, +0.0766933f,0.974848f,0.20926f, +0.108828f,0.917507f,0.382541f, +0.0350786f,0.924503f,0.379557f, +0.162845f,0.883516f,0.439183f, +0.280718f,0.786151f,0.550603f, +0.282161f,0.80649f,0.519575f, +0.319525f,0.746566f,0.583561f, +-0.0912168f,0.872752f,0.479567f, +-0.288082f,0.924626f,0.249148f, +-0.142667f,0.981082f,0.130856f, +-0.066753f,0.9808f,0.183236f, +-0.230244f,0.961075f,0.152718f, +-0.067082f,0.99457f,0.0795691f, +0.611911f,0.730537f,0.303119f, +0.451199f,0.889041f,0.077617f, +0.0130284f,0.992329f,-0.12294f, +0.0930856f,0.993052f,-0.0719959f, +0.26722f,0.962884f,0.0380388f, +0.075301f,0.995117f,-0.0638176f, +0.167918f,0.972374f,0.162147f, +0.0578882f,0.993576f,0.0972437f, +0.196869f,0.968468f,0.152684f, +0.304163f,0.924874f,0.228237f, +0.255006f,0.935584f,0.244244f, +0.260728f,0.944471f,0.199987f, +0.218361f,0.924111f,0.313587f, +0.0535174f,0.911234f,0.408398f, +-0.0710624f,0.921034f,0.382946f, +-0.130246f,0.949543f,0.285314f, +-0.0655027f,0.977569f,0.200169f, +0.0903252f,0.974724f,0.204338f, +0.155207f,0.949154f,0.273892f, +0.153701f,0.938218f,0.310037f, +0.0621551f,0.960028f,0.272917f, +-0.0534301f,0.951765f,0.30214f, +-0.196733f,0.911558f,0.361052f, +-0.281614f,0.838193f,0.46704f, +-0.263195f,0.866235f,0.424694f, +-0.0481024f,0.917426f,0.394989f, +0.0935627f,0.945047f,0.31326f, +0.130693f,0.965135f,0.226792f, +0.00742185f,0.989033f,0.14751f, +-0.243053f,0.969364f,0.0354789f, +-0.273599f,0.961363f,-0.0304179f, +-0.215123f,0.976563f,-0.00682047f, +-0.164989f,0.983922f,0.068385f, +-0.241802f,0.97031f,0.00552545f, +-0.241315f,0.967202f,-0.0792945f, +-0.169018f,0.981272f,-0.0923975f, +-0.282714f,0.953981f,-0.0999632f, +-0.234963f,0.971912f,-0.0134244f, +-0.109087f,0.993838f,-0.0196489f, +-0.369236f,0.9273f,-0.0614783f, +-0.551241f,0.800465f,0.235349f, +-0.62344f,0.781571f,-0.0216512f, +-0.285923f,0.957424f,0.0398505f, +0.246101f,0.967083f,0.064696f, +0.379822f,0.894837f,-0.234526f, +-0.124179f,0.991035f,0.0492959f, +-0.55499f,0.830986f,0.0380685f, +-0.0883601f,0.986961f,0.13454f, +0.492332f,0.870217f,0.0182045f, +-0.0249785f,0.975709f,-0.217643f, +-0.368665f,0.864796f,-0.340902f, +-0.0172444f,0.938433f,-0.345031f, +-0.0663306f,0.97669f,-0.204147f, +0.00514992f,0.997132f,-0.0755029f, +0.0570337f,0.998371f,-0.00125828f, +0.249285f,0.962439f,0.107557f, +0.242481f,0.961206f,0.131476f, +0.205153f,0.940815f,0.269776f, +0.193253f,0.908579f,0.370322f, +-0.0564604f,0.989265f,0.134783f, +0.0286103f,0.993761f,-0.107795f, +-0.22802f,0.927614f,-0.29587f, +-0.141654f,0.989087f,-0.0405023f, +-0.0918591f,0.979413f,-0.179757f, +0.474817f,0.877478f,-0.067685f, +0.562064f,0.827022f,0.0108876f, +0.0667731f,0.98619f,-0.151561f, +0.0478258f,0.978171f,-0.202223f, +0.240461f,0.955483f,-0.170967f, +0.22331f,0.956303f,-0.188725f, +0.105513f,0.987685f,0.115519f, +0.0191904f,0.988704f,0.148645f, +0.138326f,0.966121f,0.217888f, +0.261136f,0.942738f,0.207491f, +0.283954f,0.937656f,0.20043f, +0.227821f,0.960294f,0.161036f, +0.0632997f,0.956465f,0.284901f, +-0.0487147f,0.902832f,0.427225f, +-0.0448066f,0.869805f,0.491357f, +0.0191513f,0.881775f,0.471282f, +0.0794772f,0.93047f,0.357644f, +0.0542875f,0.971817f,0.2294f, +0.0315472f,0.963796f,0.264769f, +0.140004f,0.919916f,0.36627f, +0.0838185f,0.924915f,0.370818f, +-0.147814f,0.916849f,0.370861f, +-0.285354f,0.864307f,0.414182f, +-0.277978f,0.859855f,0.428226f, +-0.199243f,0.910371f,0.362666f, +0.00801534f,0.941586f,0.336678f, +0.134574f,0.9298f,0.342582f, +0.118153f,0.909557f,0.398429f, +0.0557977f,0.896269f,0.439987f, +-0.0363608f,0.927402f,0.372294f, +-0.166377f,0.978738f,0.119962f, +-0.285966f,0.957794f,-0.0292047f, +-0.233552f,0.97096f,0.0518564f, +-0.131443f,0.981568f,0.138735f, +-0.225195f,0.974079f,0.0213645f, +-0.190643f,0.980844f,0.0400016f, +-0.234677f,0.970688f,0.051878f, +-0.269033f,0.961888f,-0.0489107f, +-0.0845976f,0.996159f,0.0225919f, +-0.404645f,0.907558f,0.112255f, +-0.609864f,0.674076f,0.416758f, +-0.498816f,0.848126f,0.178504f, +-0.144072f,0.987953f,-0.0565038f, +0.166758f,0.948601f,-0.268974f, +0.264567f,0.924612f,0.274038f, +-0.242512f,0.859891f,0.449195f, +-0.469649f,0.864648f,0.178364f, +-0.10506f,0.987899f,0.114094f, +0.522959f,0.850167f,0.0610757f, +0.207342f,0.943984f,-0.256717f, +-0.370985f,0.736513f,-0.565613f, +-0.196204f,0.840957f,-0.504277f, +-0.176697f,0.964208f,-0.197689f, +-0.102305f,0.980589f,-0.167266f, +0.103476f,0.966902f,-0.233225f, +0.176136f,0.882185f,-0.436721f, +0.1356f,0.926363f,-0.351374f, +0.144454f,0.987968f,-0.0552396f, +0.173673f,0.98445f,-0.0263929f, +0.186245f,0.978364f,-0.0900963f, +0.313839f,0.899877f,-0.302865f, +0.0432774f,0.865555f,-0.498941f, +-0.311487f,0.833772f,-0.45585f, +-0.00804547f,0.940342f,-0.340136f, +0.304128f,0.919914f,-0.247515f, +0.693924f,0.703662f,0.152743f, +0.239861f,0.957303f,-0.161363f, +0.0838446f,0.969769f,-0.229169f, +0.258925f,0.935636f,-0.239881f, +0.257223f,0.918931f,-0.299002f, +0.0548176f,0.967903f,0.245271f, +0.0212885f,0.963347f,0.267412f, +0.0818858f,0.973102f,0.215332f, +0.303912f,0.917546f,0.25641f, +0.304793f,0.927062f,0.218307f, +0.238677f,0.941098f,0.239517f, +-0.064428f,0.967965f,0.242677f, +-0.187169f,0.922119f,0.338622f, +-0.088608f,0.904799f,0.416518f, +0.0498324f,0.910793f,0.409846f, +0.176362f,0.913248f,0.367253f, +0.168717f,0.938419f,0.301504f, +0.00502329f,0.962305f,0.271928f, +0.0457173f,0.940418f,0.336934f, +0.0516487f,0.913931f,0.402569f, +-0.133343f,0.891616f,0.432713f, +-0.271457f,0.878825f,0.392399f, +-0.232052f,0.920355f,0.3148f, +-0.147635f,0.961854f,0.230305f, +-0.0156622f,0.96416f,0.264858f, +0.0430262f,0.93984f,0.338894f, +-0.0165403f,0.899263f,0.437095f, +0.0174547f,0.845985f,0.53292f, +0.0913065f,0.841589f,0.532345f, +0.0967863f,0.903784f,0.416901f, +-0.0948439f,0.973273f,0.209153f, +-0.30724f,0.95163f,-0.00197291f, +-0.219507f,0.974242f,0.051671f, +-0.123616f,0.986822f,0.104414f, +-0.209302f,0.977457f,0.0277521f, +-0.245642f,0.966973f,0.0679884f, +-0.189013f,0.970874f,0.147233f, +-0.260969f,0.955926f,0.134541f, +-0.586593f,0.772947f,0.241789f, +-0.622505f,0.744412f,0.241534f, +-0.343069f,0.923585f,0.171158f, +0.270136f,0.949637f,0.158794f, +-0.0270125f,0.976583f,-0.213437f, +-0.293688f,0.905533f,0.306199f, +-0.165876f,0.923469f,0.345963f, +-0.101353f,0.963266f,0.248689f, +-0.0607966f,0.998139f,0.00473307f, +0.571806f,0.81892f,0.04908f, +0.496821f,0.86721f,0.0334054f, +-0.0103979f,0.971297f,-0.237642f, +-0.296903f,0.868994f,-0.395851f, +-0.405401f,0.821757f,-0.400457f, +-0.0724266f,0.96927f,-0.235097f, +0.416989f,0.879556f,-0.229132f, +0.361436f,0.845922f,-0.392148f, +-0.194841f,0.930819f,-0.309213f, +-0.180426f,0.920987f,-0.345297f, +0.16396f,0.957989f,-0.235318f, +0.390246f,0.873397f,-0.291351f, +0.368832f,0.745912f,-0.554597f, +0.0989123f,0.900328f,-0.423823f, +-0.474178f,0.712544f,-0.517143f, +-0.225662f,0.862106f,-0.453707f, +0.0544551f,0.930953f,-0.361055f, +0.547706f,0.827837f,-0.121263f, +0.394416f,0.886974f,-0.240235f, +0.0920684f,0.955894f,-0.278909f, +0.287609f,0.908713f,-0.302524f, +0.34308f,0.875033f,-0.341487f, +-0.0471282f,0.962572f,0.266897f, +0.0309198f,0.953932f,0.298424f, +0.131633f,0.963671f,0.232402f, +0.278528f,0.937297f,0.209515f, +0.282669f,0.933258f,0.221646f, +0.232384f,0.927485f,0.292863f, +-0.0647083f,0.957687f,0.280443f, +-0.249973f,0.928177f,0.275683f, +-0.129841f,0.953629f,0.271538f, +0.0843284f,0.953748f,0.288536f, +0.245794f,0.935145f,0.255127f, +0.172562f,0.957759f,0.230042f, +-0.0230052f,0.954645f,0.296857f, +-0.041189f,0.951248f,0.305663f, +0.00483043f,0.930995f,0.364999f, +-0.165245f,0.915404f,0.367054f, +-0.220878f,0.904299f,0.365316f, +-0.0993279f,0.939818f,0.326919f, +-0.130653f,0.959943f,0.247869f, +-0.122986f,0.930904f,0.343936f, +-0.00592517f,0.911134f,0.412068f, +-0.1345f,0.9137f,0.383488f, +-0.0693903f,0.866333f,0.494623f, +0.121472f,0.852483f,0.508447f, +0.210048f,0.85163f,0.480215f, +0.0819942f,0.889969f,0.448588f, +-0.0885916f,0.940837f,0.327072f, +-0.228328f,0.96901f,0.0942702f, +-0.142437f,0.987843f,0.0622738f, +-0.157298f,0.987135f,0.0286638f, +-0.320718f,0.947161f,0.00499032f, +-0.336449f,0.936473f,0.0990975f, +-0.304779f,0.919932f,0.246646f, +-0.589969f,0.761912f,0.267259f, +-0.577652f,0.799842f,0.163009f, +-0.2738f,0.948238f,0.160868f, +0.240449f,0.968762f,0.0607085f, +-0.0196269f,0.999224f,-0.0341484f, +-0.384279f,0.908117f,0.166292f, +-0.0937293f,0.985711f,0.139963f, +0.0542133f,0.980144f,0.190731f, +0.0177665f,0.999043f,0.039964f, +0.448192f,0.892243f,0.0550135f, +0.417622f,0.800327f,0.430197f, +0.199972f,0.838529f,0.506833f, +-0.0526069f,0.975321f,0.214434f, +-0.547935f,0.818163f,-0.174291f, +-0.280437f,0.954205f,-0.10415f, +0.341739f,0.938698f,0.0453871f, +0.346269f,0.925369f,0.15424f, +-0.319444f,0.944119f,0.0812127f, +-0.192857f,0.977783f,0.0821343f, +0.335818f,0.935599f,-0.108997f, +0.474712f,0.785031f,-0.397964f, +0.373974f,0.907089f,-0.193218f, +0.0523306f,0.977738f,-0.203201f, +-0.41385f,0.870502f,-0.266372f, +-0.377073f,0.911356f,-0.165066f, +0.0445989f,0.977381f,-0.206731f, +0.525837f,0.831576f,-0.178819f, +0.378975f,0.901633f,-0.208411f, +0.088353f,0.958416f,-0.271353f, +0.309469f,0.925076f,-0.220144f, +0.420279f,0.904173f,-0.0763995f, +0.00329705f,0.962532f,0.271149f, +0.0784063f,0.967252f,0.241403f, +0.186812f,0.966508f,0.175965f, +0.294591f,0.944303f,0.146656f, +0.242144f,0.958708f,0.149151f, +0.122249f,0.946777f,0.297772f, +-0.0273117f,0.906407f,0.421521f, +-0.206066f,0.9181f,0.338568f, +-0.0954796f,0.950658f,0.295183f, +0.102184f,0.964671f,0.242834f, +0.213961f,0.952875f,0.215059f, +0.119187f,0.935673f,0.33213f, +-0.0431159f,0.926594f,0.373584f, +-0.0072858f,0.954565f,0.297913f, +-0.0455381f,0.966183f,0.253806f, +-0.154593f,0.937454f,0.311898f, +-0.199077f,0.936411f,0.288969f, +-0.136466f,0.95497f,0.263457f, +-0.127877f,0.920831f,0.3684f, +-0.229636f,0.912787f,0.337767f, +-0.0324452f,0.91205f,0.408794f, +-0.100812f,0.892675f,0.439282f, +-0.166782f,0.900555f,0.401477f, +0.102011f,0.876619f,0.470247f, +0.195025f,0.830402f,0.521918f, +0.0914158f,0.843587f,0.529154f, +0.0626366f,0.873316f,0.48311f, +-0.00226622f,0.929744f,0.3682f, +-0.0934177f,0.966149f,0.240479f, +-0.109555f,0.963702f,0.243468f, +-0.302241f,0.931855f,0.200739f, +-0.368178f,0.918352f,0.145171f, +-0.476623f,0.864028f,0.162128f, +-0.569304f,0.726984f,0.383911f, +-0.64096f,0.755201f,0.137264f, +-0.241026f,0.942011f,0.233501f, +0.376487f,0.905115f,0.197547f, +0.13011f,0.991259f,-0.0218225f, +-0.643013f,0.733979f,-0.218653f, +-0.19089f,0.942227f,0.275264f, +-0.00867818f,0.931663f,0.363219f, +0.146287f,0.916711f,0.371809f, +0.32054f,0.88208f,0.345239f, +0.0976689f,0.827123f,0.55347f, +0.0475977f,0.818583f,0.572413f, +0.312042f,0.775215f,0.549246f, +-0.398647f,0.872033f,0.283969f, +-0.297551f,0.880657f,0.368657f, +0.0684096f,0.950263f,0.303844f, +0.473417f,0.718991f,0.50885f, +-0.0712795f,0.964076f,0.255885f, +-0.187608f,0.981414f,0.0403824f, +0.441688f,0.892595f,0.090477f, +0.402228f,0.910874f,0.0923076f, +0.356001f,0.889285f,0.287114f, +0.109119f,0.990916f,0.0786044f, +-0.366364f,0.926283f,0.0881909f, +-0.361407f,0.913864f,0.185034f, +0.114451f,0.98516f,0.127909f, +0.511212f,0.854805f,0.0892759f, +0.488262f,0.865451f,0.112231f, +0.135362f,0.990178f,0.0350016f, +0.158924f,0.983832f,0.0825671f, +0.139428f,0.973099f,0.183407f, +-0.0124598f,0.997106f,0.0750005f, +0.111778f,0.989445f,0.0922193f, +0.245419f,0.967744f,0.0569325f, +0.2823f,0.95863f,0.0365395f, +0.172017f,0.973333f,0.151766f, +-0.129296f,0.953534f,0.27213f, +-0.0899396f,0.877846f,0.470422f, +-0.0963581f,0.899855f,0.425413f, +-0.0212856f,0.934761f,0.354638f, +0.147549f,0.94824f,0.281195f, +0.129526f,0.93959f,0.316849f, +0.0223606f,0.903767f,0.427441f, +-0.0124316f,0.909175f,0.41623f, +0.115235f,0.910193f,0.397831f, +-0.0283739f,0.950232f,0.310248f, +-0.203804f,0.932573f,0.297946f, +-0.13899f,0.955458f,0.260347f, +-0.204301f,0.958838f,0.197208f, +-0.229868f,0.915186f,0.331053f, +-0.132513f,0.91447f,0.38234f, +-0.151493f,0.940711f,0.3035f, +-0.124022f,0.907796f,0.400656f, +-0.112999f,0.914934f,0.387462f, +-0.039891f,0.908327f,0.416355f, +0.0930682f,0.835427f,0.541664f, +0.161351f,0.801381f,0.575981f, +0.131487f,0.83942f,0.527339f, +0.132693f,0.857332f,0.497367f, +-0.0832448f,0.920852f,0.380923f, +-0.145993f,0.894645f,0.422252f, +-0.213236f,0.888697f,0.405893f, +-0.293641f,0.888131f,0.353551f, +-0.525155f,0.788991f,0.318912f, +-0.588027f,0.679363f,0.438964f, +-0.478637f,0.812929f,0.331743f, +-0.264049f,0.917426f,0.297671f, +0.302963f,0.900818f,0.31103f, +0.420369f,0.80167f,0.424988f, +-0.470879f,0.867699f,0.159284f, +-0.530406f,0.817263f,0.225279f, +-0.0411983f,0.860627f,0.507566f, +0.103255f,0.833118f,0.543372f, +0.186539f,0.814428f,0.549463f, +0.132619f,0.779192f,0.612594f, +0.0761138f,0.83531f,0.544485f, +0.378863f,0.611781f,0.694397f, +-0.172003f,0.719417f,0.672944f, +-0.295852f,0.804769f,0.514605f, +0.0593285f,0.827842f,0.557814f, +0.323809f,0.743921f,0.584575f, +0.339913f,0.758357f,0.556197f, +-0.00694706f,0.946602f,0.322331f, +0.188872f,0.934445f,0.301895f, +0.251044f,0.713229f,0.654432f, +0.351195f,0.638214f,0.685087f, +0.295602f,0.899369f,0.322109f, +-0.450583f,0.880167f,0.14927f, +-0.375985f,0.904392f,0.201769f, +0.158376f,0.94847f,0.274448f, +0.500024f,0.831884f,0.240719f, +0.503159f,0.8293f,0.243089f, +0.0889199f,0.964326f,0.249335f, +0.108789f,0.932871f,0.34339f, +0.066105f,0.944864f,0.320722f, +-0.09433f,0.994124f,-0.0530892f, +0.0903529f,0.995715f,-0.0196726f, +0.246451f,0.969124f,-0.00783612f, +0.17532f,0.977334f,0.118663f, +0.0145033f,0.945036f,0.326645f, +-0.208385f,0.89773f,0.388145f, +-0.186403f,0.920929f,0.342264f, +-0.0196042f,0.920127f,0.391129f, +0.088861f,0.938743f,0.332966f, +0.0904885f,0.955513f,0.280725f, +0.00776342f,0.887041f,0.461625f, +0.0357997f,0.855618f,0.516368f, +0.0251977f,0.899984f,0.435195f, +0.113155f,0.898436f,0.424273f, +0.0488401f,0.928538f,0.36801f, +-0.122117f,0.962671f,0.241562f, +-0.0832756f,0.977563f,0.193483f, +-0.182752f,0.960599f,0.209407f, +-0.340533f,0.923546f,0.176353f, +-0.207225f,0.949201f,0.236801f, +-0.0875863f,0.939463f,0.331268f, +-0.156293f,0.945917f,0.284277f, +-0.15128f,0.944026f,0.293135f, +-0.133917f,0.921967f,0.363377f, +-0.0187779f,0.901995f,0.431337f, +0.137151f,0.859664f,0.492105f, +0.151864f,0.841546f,0.518398f, +0.169983f,0.832825f,0.526791f, +0.0329472f,0.8585f,0.511754f, +-0.148058f,0.877168f,0.456787f, +-0.179554f,0.872912f,0.453636f, +-0.29061f,0.863835f,0.411502f, +-0.582219f,0.748049f,0.318501f, +-0.586418f,0.753548f,0.297117f, +-0.423744f,0.867437f,0.260755f, +-0.266814f,0.914007f,0.305617f, +0.297036f,0.879751f,0.371224f, +0.301464f,0.846429f,0.438951f, +-0.267915f,0.8201f,0.505626f, +-0.708126f,0.705156f,0.0362171f, +-0.280503f,0.856013f,0.434234f, +0.0634361f,0.843315f,0.533662f, +0.203328f,0.848496f,0.488581f, +0.157757f,0.86266f,0.480552f, +-0.0108627f,0.875364f,0.483343f, +-0.00732908f,0.804113f,0.594431f, +0.217513f,0.756413f,0.616869f, +-0.242879f,0.903897f,0.352108f, +-0.0770731f,0.775477f,0.626654f, +0.238061f,0.731126f,0.639361f, +0.459013f,0.658034f,0.596908f, +0.0332364f,0.855326f,0.517022f, +-0.132848f,0.766918f,0.627844f, +-0.0252308f,0.840734f,0.54086f, +0.442735f,0.688282f,0.574677f, +0.624206f,0.545029f,0.559742f, +-0.216833f,0.89857f,0.381516f, +-0.428783f,0.890698f,0.151005f, +0.076598f,0.986116f,0.147334f, +0.479671f,0.865386f,0.144994f, +0.542246f,0.827427f,0.146065f, +0.100899f,0.969794f,0.222079f, +0.0591096f,0.972132f,0.226859f, +0.163564f,0.950136f,0.265495f, +-0.0539816f,0.998166f,0.0273959f, +0.085626f,0.996323f,0.00278248f, +0.159482f,0.986364f,0.0406345f, +-0.0565903f,0.982572f,0.177057f, +-0.167853f,0.932231f,0.320579f, +-0.135579f,0.92648f,0.351075f, +-0.12175f,0.950039f,0.287407f, +-0.0275f,0.960651f,0.276393f, +0.0945575f,0.956567f,0.27575f, +0.0118837f,0.934274f,0.356358f, +-0.160104f,0.889888f,0.42716f, +0.0609856f,0.903744f,0.423707f, +0.121664f,0.922268f,0.366906f, +0.148425f,0.946235f,0.287418f, +0.23463f,0.944122f,0.231479f, +-0.0440541f,0.996345f,0.0731815f, +-0.127251f,0.98255f,0.135658f, +-0.207412f,0.958865f,0.1938f, +-0.296871f,0.939382f,0.171549f, +-0.278192f,0.946498f,0.163558f, +-0.178451f,0.945897f,0.270988f, +-0.115294f,0.937073f,0.329548f, +-0.175206f,0.945254f,0.275312f, +-0.191323f,0.939359f,0.284604f, +-0.0822793f,0.949627f,0.302389f, +0.0583847f,0.93226f,0.357046f, +0.125066f,0.884667f,0.449136f, +0.147347f,0.866347f,0.477213f, +0.0545541f,0.865292f,0.49829f, +-0.098516f,0.887377f,0.450395f, +-0.209769f,0.897417f,0.388122f, +-0.210182f,0.881546f,0.422729f, +-0.451263f,0.852365f,0.264264f, +-0.650724f,0.758775f,-0.0286192f, +-0.407582f,0.890583f,0.201838f, +-0.388367f,0.887583f,0.247725f, +0.193188f,0.884808f,0.424019f, +0.215311f,0.880386f,0.422566f, +-0.165147f,0.855262f,0.491176f, +-0.520864f,0.795129f,0.310596f, +-0.488998f,0.786967f,0.37625f, +0.0562235f,0.868104f,0.493187f, +0.400928f,0.84731f,0.348313f, +0.199813f,0.978725f,-0.0465961f, +-0.198621f,0.97682f,0.0798329f, +-0.0891351f,0.888352f,0.450429f, +0.204835f,0.834736f,0.511135f, +-0.0720813f,0.941881f,0.328121f, +-0.196291f,0.972713f,0.123691f, +0.179787f,0.980826f,-0.0752149f, +0.511674f,0.853811f,0.0958982f, +0.0191479f,0.909767f,0.414677f, +-0.125562f,0.89333f,0.431505f, +0.22305f,0.943278f,0.245918f, +0.527748f,0.84488f,0.0875187f, +0.598212f,0.799615f,-0.0525252f, +0.0107332f,0.903361f,0.428747f, +-0.300811f,0.914951f,0.269032f, +0.179787f,0.975264f,0.128593f, +0.519301f,0.854591f,0.00126655f, +0.419398f,0.906587f,-0.0469514f, +0.0522982f,0.994257f,0.0933686f, +0.0513278f,0.996267f,0.0694112f, +0.103651f,0.993237f,0.0523089f, +0.0555975f,0.984758f,0.164805f, +0.0862163f,0.988349f,0.12543f, +0.0909734f,0.981273f,0.169784f, +-0.14512f,0.970727f,0.191388f, +-0.180918f,0.953611f,0.240612f, +-0.140102f,0.96533f,0.22025f, +-0.119189f,0.970295f,0.210526f, +-0.0126783f,0.974075f,0.225869f, +0.0237961f,0.97809f,0.20682f, +-0.0862872f,0.95413f,0.286688f, +-0.14433f,0.944949f,0.293667f, +0.132869f,0.954959f,0.265329f, +0.22733f,0.94991f,0.214458f, +0.185536f,0.968744f,0.164655f, +0.30218f,0.927213f,0.221277f, +-0.010566f,0.987352f,0.158194f, +-0.227641f,0.957817f,0.175404f, +-0.212635f,0.950922f,0.224799f, +-0.288872f,0.93765f,0.193302f, +-0.303211f,0.936666f,0.175273f, +-0.283958f,0.943546f,0.170553f, +-0.13575f,0.960553f,0.242714f, +-0.0816944f,0.973992f,0.211345f, +-0.191701f,0.977982f,0.0824724f, +-0.110352f,0.986199f,0.123427f, +-0.0409453f,0.971384f,0.233958f, +0.0185038f,0.933683f,0.357621f, +0.13477f,0.907601f,0.397615f, +0.0792432f,0.925049f,0.371489f, +-0.0350852f,0.929789f,0.366418f, +-0.159548f,0.910971f,0.380363f, +-0.245138f,0.905643f,0.346003f, +-0.179352f,0.926492f,0.330825f, +-0.589052f,0.80668f,0.0478056f, +-0.578625f,0.779472f,0.240033f, +-0.471687f,0.839166f,0.270762f, +0.0987404f,0.916105f,0.388589f, +0.173592f,0.831445f,0.527792f, +-0.220086f,0.704489f,0.674728f, +-0.395802f,0.62503f,0.672813f, +-0.417304f,0.755058f,0.505712f, +0.0513487f,0.865997f,0.497406f, +0.431689f,0.734124f,0.524124f, +0.359032f,0.884637f,0.297512f, +-0.308259f,0.930686f,0.196975f, +-0.34698f,0.877125f,0.332049f, +0.00851592f,0.919266f,0.393545f, +0.326193f,0.840272f,0.433061f, +0.261231f,0.960149f,-0.0993615f, +0.388612f,0.889039f,-0.242053f, +0.0354931f,0.979528f,-0.198152f, +0.0485316f,0.907873f,0.416427f, +-0.0781845f,0.964592f,0.251892f, +0.47974f,0.876345f,0.0432286f, +0.568817f,0.783907f,-0.248873f, +0.483889f,0.834837f,-0.262485f, +-0.220496f,0.975376f,0.00471288f, +-0.25449f,0.933474f,0.252706f, +0.326168f,0.921789f,0.209569f, +0.609761f,0.790958f,0.0507595f, +0.419183f,0.900774f,-0.11354f, +-0.0389936f,0.992704f,-0.114095f, +0.112818f,0.992086f,-0.0551048f, +0.140261f,0.98577f,-0.0926471f, +0.0460285f,0.981507f,0.185811f, +0.0839854f,0.981486f,0.172137f, +0.0780195f,0.983837f,0.161178f, +-0.135272f,0.977846f,0.159743f, +-0.233239f,0.960885f,0.149328f, +-0.119476f,0.978748f,0.166665f, +-0.0623017f,0.991047f,0.118089f, +-0.0310067f,0.999432f,0.0132292f, +-0.0037253f,0.997112f,0.0758502f, +-0.0758016f,0.98526f,0.153355f, +-0.143296f,0.988211f,0.0539015f, +0.103486f,0.991653f,0.076914f, +0.266632f,0.947722f,0.175298f, +0.164045f,0.978994f,0.121078f, +0.196418f,0.969063f,0.149458f, +0.0648458f,0.968138f,0.241876f, +-0.21695f,0.963194f,0.158716f, +-0.238014f,0.956133f,0.17076f, +-0.251543f,0.948014f,0.194926f, +-0.241597f,0.958745f,0.149794f, +-0.248822f,0.966568f,0.0619263f, +-0.195635f,0.9804f,0.0233089f, +0.00681016f,0.994726f,0.102342f, +-0.0728308f,0.997328f,0.00570638f, +-0.223928f,0.970021f,-0.0944255f, +-0.201047f,0.979434f,0.0169867f, +-0.100278f,0.986057f,0.132801f, +0.129703f,0.962794f,0.237074f, +0.129196f,0.949613f,0.28556f, +-0.100355f,0.959332f,0.263838f, +-0.226831f,0.927446f,0.297306f, +-0.211803f,0.921673f,0.325051f, +-0.16781f,0.90652f,0.387378f, +-0.507141f,0.76624f,0.394569f, +-0.499456f,0.740703f,0.449336f, +-0.375574f,0.865361f,0.331805f, +0.0665425f,0.96722f,0.245068f, +-0.127974f,0.946728f,0.295513f, +-0.531445f,0.627941f,0.568557f, +-0.268657f,0.746051f,0.609287f, +-0.123398f,0.84105f,0.526695f, +0.113268f,0.868801f,0.482033f, +0.278975f,0.860996f,0.425274f, +0.256512f,0.783766f,0.565608f, +0.24637f,0.788587f,0.563411f, +-0.207735f,0.977522f,-0.036006f, +0.0390118f,0.996098f,0.0791601f, +0.408253f,0.910351f,0.0677493f, +0.466297f,0.863647f,-0.191525f, +0.226125f,0.967725f,-0.111247f, +-0.24034f,0.965221f,0.102887f, +-0.130757f,0.944853f,0.300258f, +0.283435f,0.943407f,0.172188f, +0.590839f,0.8059f,-0.0378747f, +0.573782f,0.756596f,-0.313587f, +0.355206f,0.926281f,0.12583f, +-0.219704f,0.910923f,0.349212f, +-0.277723f,0.959254f,0.051969f, +0.340807f,0.938572f,0.0541606f, +0.677372f,0.729826f,0.0923128f, +0.49544f,0.867668f,-0.0411347f, +-0.024834f,0.981688f,-0.188872f, +0.050519f,0.974996f,-0.216403f, +0.180767f,0.970256f,-0.161015f, +0.0401148f,0.977494f,0.207113f, +0.106256f,0.969045f,0.222848f, +0.0969035f,0.97128f,0.217314f, +-0.118574f,0.978564f,0.16838f, +-0.194437f,0.978726f,0.0655019f, +-0.11441f,0.993427f,0.0037257f, +0.00229181f,0.999514f,0.0311045f, +0.0309142f,0.998007f,0.0550047f, +-0.113357f,0.989867f,0.085516f, +-0.111292f,0.980012f,0.164894f, +-0.0212066f,0.993646f,0.110539f, +0.0241257f,0.999577f,-0.0162417f, +0.157698f,0.982481f,0.0993122f, +0.222931f,0.950361f,0.21706f, +0.18078f,0.964986f,0.190052f, +0.0702985f,0.98108f,0.180387f, +-0.190259f,0.977665f,0.089291f, +-0.268574f,0.956136f,0.116926f, +-0.267756f,0.955804f,0.121429f, +-0.211446f,0.969418f,0.124579f, +-0.14687f,0.983484f,0.105776f, +-0.198985f,0.979945f,-0.0106117f, +-0.0887412f,0.995564f,0.0312775f, +0.0104704f,0.992989f,0.117739f, +-0.125001f,0.9915f,0.0360868f, +-0.238906f,0.968221f,-0.0739686f, +-0.167029f,0.981518f,-0.0933989f, +-0.0351406f,0.998931f,-0.030045f, +0.0130186f,0.974123f,0.225643f, +-0.0745329f,0.922898f,0.377762f, +-0.18971f,0.916591f,0.351953f, +-0.286917f,0.902381f,0.321538f, +-0.328487f,0.84853f,0.414841f, +-0.591704f,0.685127f,0.424839f, +-0.448564f,0.796089f,0.406241f, +-0.170353f,0.888356f,0.426384f, +-0.00830475f,0.908708f,0.417349f, +-0.140027f,0.883683f,0.446651f, +-0.599598f,0.727182f,0.334197f, +-0.234879f,0.924162f,0.301258f, +-0.0954672f,0.951872f,0.291248f, +0.100155f,0.948228f,0.301383f, +0.352663f,0.898478f,0.261471f, +0.217902f,0.956165f,0.19562f, +0.428441f,0.89557f,0.119967f, +0.0504867f,0.972497f,-0.227379f, +-0.160086f,0.98254f,-0.0948013f, +0.319131f,0.945228f,-0.0685555f, +0.64992f,0.715088f,0.257397f, +0.0361031f,0.995429f,0.0884124f, +-0.2599f,0.897768f,0.355618f, +-0.17567f,0.983498f,0.0432638f, +0.53944f,0.841427f,-0.0317039f, +0.60742f,0.697232f,-0.380669f, +0.609044f,0.790595f,-0.063438f, +-0.195234f,0.980448f,0.0245981f, +-0.224173f,0.885759f,0.406419f, +0.0964403f,0.992198f,0.0790071f, +0.380926f,0.892571f,-0.241272f, +0.532566f,0.777301f,-0.334927f, +0.58332f,0.811668f,0.0305478f, +0.122052f,0.989417f,-0.0784701f, +0.094933f,0.975516f,-0.198385f, +0.104703f,0.956209f,-0.273317f, +0.0116109f,0.989434f,0.144515f, +0.0514824f,0.974923f,0.216505f, +0.096067f,0.950842f,0.294399f, +0.00976988f,0.964716f,0.263111f, +-0.0931121f,0.98126f,0.168699f, +-0.0745948f,0.982842f,0.168693f, +-0.083139f,0.982475f,0.166825f, +-0.0763046f,0.97088f,0.22709f, +-0.130809f,0.960701f,0.244832f, +-0.117161f,0.974629f,0.190711f, +0.0735371f,0.976475f,0.202706f, +0.123062f,0.984428f,0.125529f, +0.0660058f,0.995943f,0.0611663f, +0.0811078f,0.98996f,0.115763f, +0.156048f,0.953727f,0.257008f, +0.12971f,0.935453f,0.32879f, +-0.0928149f,0.955298f,0.280698f, +-0.264252f,0.949049f,0.171686f, +-0.241724f,0.966072f,0.0909662f, +-0.244999f,0.96713f,0.0680795f, +-0.106995f,0.982895f,0.149898f, +-0.106861f,0.990227f,0.089616f, +-0.133621f,0.990932f,0.0141138f, +-0.0517957f,0.998024f,0.0355675f, +-0.0225779f,0.998718f,0.0453005f, +-0.144281f,0.986502f,-0.0774439f, +-0.157036f,0.983398f,-0.0909287f, +-0.161108f,0.986936f,-0.00118469f, +-0.22235f,0.965394f,0.136287f, +-0.250578f,0.942366f,0.221715f, +-0.217658f,0.901831f,0.373264f, +-0.29708f,0.848133f,0.438651f, +-0.36269f,0.819581f,0.443558f, +-0.534096f,0.793842f,0.290785f, +-0.584404f,0.811192f,0.0209707f, +-0.1404f,0.905222f,0.401075f, +-0.307079f,0.89418f,0.325797f, +-0.27164f,0.834087f,0.480115f, +-0.322843f,0.946322f,0.0157466f, +-0.301281f,0.933652f,-0.193713f, +-0.127165f,0.985755f,0.11007f, +0.121812f,0.97858f,0.165962f, +0.500139f,0.864928f,0.0419482f, +0.30357f,0.892132f,-0.334582f, +0.443241f,0.85073f,-0.282481f, +0.0967978f,0.993781f,0.0550442f, +-0.201565f,0.978713f,0.0386423f, +0.209591f,0.974539f,0.0796601f, +0.481917f,0.851558f,0.20641f, +-0.0224044f,0.977009f,0.212016f, +-0.238315f,0.88567f,0.398491f, +0.220358f,0.960844f,0.167992f, +0.601263f,0.791797f,-0.107428f, +0.618362f,0.741713f,-0.25979f, +0.284452f,0.956119f,0.0701626f, +-0.201478f,0.913131f,0.3544f, +-0.20526f,0.978252f,0.0298624f, +0.352634f,0.929538f,-0.107737f, +0.649062f,0.752634f,-0.110725f, +0.490387f,0.729272f,-0.477162f, +0.431974f,0.874843f,-0.219197f, +0.184608f,0.975155f,-0.122446f, +0.192786f,0.978517f,-0.0730681f, +0.240097f,0.966116f,-0.094733f, +-0.255309f,0.963455f,-0.0810722f, +-0.124334f,0.990531f,0.0582188f, +0.042075f,0.979967f,0.194667f, +0.0324324f,0.965776f,0.25734f, +-0.0760147f,0.965606f,0.248649f, +-0.138926f,0.972343f,0.187746f, +-0.0932442f,0.974882f,0.202264f, +-0.0380092f,0.975147f,0.218276f, +-0.0242537f,0.984345f,0.174576f, +-0.0724602f,0.995976f,0.0527463f, +0.0175716f,0.997526f,0.068069f, +0.191598f,0.97051f,0.146287f, +0.0888492f,0.992747f,0.0809944f, +0.0509079f,0.989914f,0.132209f, +0.0413152f,0.988953f,0.142354f, +-0.00590782f,0.97647f,0.215574f, +-0.0327876f,0.94937f,0.312443f, +-0.0862721f,0.978712f,0.186225f, +-0.179337f,0.981669f,0.0645377f, +-0.255621f,0.960924f,0.106226f, +-0.157413f,0.981394f,0.109943f, +-0.0325878f,0.996293f,0.0796149f, +-0.0627116f,0.997982f,-0.00999288f, +-0.0263234f,0.995733f,-0.0884504f, +0.00359159f,0.990572f,-0.136946f, +-0.0963f,0.991181f,-0.0910356f, +-0.255814f,0.966717f,-0.00409974f, +-0.292954f,0.950051f,0.107618f, +-0.259513f,0.946888f,0.189886f, +-0.274998f,0.934354f,0.226623f, +-0.37248f,0.885745f,0.276974f, +-0.384203f,0.849481f,0.361622f, +-0.326853f,0.86434f,0.382208f, +-0.213332f,0.922586f,0.321442f, +-0.528611f,0.848285f,0.0313709f, +-0.466119f,0.869006f,0.166018f, +-0.226659f,0.921685f,0.314837f, +-0.225942f,0.929604f,0.291181f, +0.262979f,0.943638f,0.200972f, +-0.158823f,0.970135f,-0.183342f, +-0.433654f,0.893597f,-0.115884f, +0.0458639f,0.99877f,-0.0188405f, +0.612149f,0.789064f,0.0514904f, +0.423383f,0.878106f,-0.222881f, +0.0967751f,0.930754f,-0.352606f, +0.0811144f,0.996202f,0.0316668f, +-0.413686f,0.895072f,-0.166465f, +0.148131f,0.951189f,0.270735f, +0.436798f,0.864787f,0.247692f, +0.0437864f,0.959427f,0.278536f, +-0.28501f,0.956226f,0.0663364f, +0.510274f,0.859616f,0.0260981f, +0.648806f,0.686419f,-0.328451f, +0.586912f,0.808674f,0.0397475f, +-0.0852935f,0.966768f,0.241009f, +-0.148057f,0.961052f,0.233361f, +0.164136f,0.983527f,-0.0757203f, +0.450314f,0.849987f,-0.273386f, +0.550526f,0.728504f,-0.407679f, +0.58281f,0.780161f,-0.227338f, +0.258267f,0.941325f,-0.21727f, +0.0807909f,0.98982f,-0.117172f, +0.0801488f,0.996327f,0.0301511f, +0.239863f,0.961671f,0.132871f, +-0.229647f,0.969202f,0.0889415f, +-0.172859f,0.981826f,0.0783421f, +-0.0626565f,0.996388f,0.0573105f, +-0.0572909f,0.992727f,0.105883f, +-0.0279351f,0.983375f,0.179427f, +-0.00285096f,0.99214f,0.125102f, +-0.084025f,0.99632f,-0.0168937f, +-0.0732377f,0.997041f,-0.0233556f, +-0.0045065f,0.999839f,0.0173404f, +0.0203121f,0.999722f,0.0119547f, +-0.0506539f,0.996487f,-0.0666886f, +0.119651f,0.992498f,0.0251293f, +0.0686084f,0.989615f,0.126312f, +0.000108814f,0.982339f,0.187109f, +0.0874025f,0.98865f,0.122196f, +-0.0625717f,0.997577f,0.0304034f, +-0.0486926f,0.992353f,0.113426f, +0.0140738f,0.989644f,0.142855f, +-0.151919f,0.980609f,0.123804f, +-0.280176f,0.959074f,0.0409668f, +-0.112828f,0.992642f,-0.0439511f, +0.0530002f,0.995827f,-0.0742939f, +0.0297885f,0.985001f,-0.169959f, +0.0528437f,0.970999f,-0.233169f, +-0.0380639f,0.977109f,-0.209305f, +-0.249056f,0.968138f,-0.0260696f, +-0.370842f,0.913812f,0.165599f, +-0.310025f,0.907402f,0.283736f, +-0.313659f,0.908343f,0.276641f, +-0.360766f,0.88042f,0.307747f, +-0.383668f,0.851108f,0.358349f, +-0.392242f,0.857478f,0.332984f, +-0.296931f,0.900087f,0.318865f, +-0.199402f,0.936164f,0.289543f, +-0.412291f,0.885214f,0.215434f, +-0.62242f,0.781068f,-0.0502514f, +-0.272781f,0.928261f,0.252828f, +-0.317665f,0.921151f,0.224876f, +0.0813846f,0.925309f,0.370378f, +0.00278871f,0.889899f,0.45615f, +-0.460626f,0.879338f,0.120782f, +0.0601251f,0.985077f,0.161272f, +0.599887f,0.787248f,0.142742f, +0.617017f,0.753279f,0.227729f, +0.13665f,0.981422f,0.134675f, +0.136502f,0.974756f,0.176687f, +-0.27066f,0.954113f,-0.128105f, +-0.13295f,0.980241f,-0.146465f, +0.409773f,0.909514f,-0.0697851f, +0.339811f,0.93455f,0.10557f, +-0.243979f,0.943604f,-0.223798f, +0.572252f,0.820076f,0.00181093f, +0.58136f,0.813444f,0.0181706f, +0.213313f,0.927464f,0.307095f, +-0.0427767f,0.853854f,0.518751f, +0.0717407f,0.97577f,0.206702f, +0.349298f,0.936925f,0.0127626f, +0.643074f,0.765767f,0.00757208f, +0.584117f,0.763349f,-0.275872f, +0.414478f,0.906497f,-0.0804466f, +0.213842f,0.975055f,-0.0594842f, +-0.00469446f,0.990505f,-0.137399f, +-0.0685672f,0.992236f,-0.103764f, +0.0844774f,0.996384f,-0.00904741f, +-0.320391f,0.938064f,0.131853f, +-0.173519f,0.96335f,0.204565f, +-0.0123366f,0.973468f,0.228492f, +-0.018009f,0.983892f,0.177855f, +-0.10447f,0.992257f,0.0671745f, +0.0409931f,0.988078f,0.148399f, +0.0370075f,0.994865f,0.0941976f, +-0.0471895f,0.997972f,-0.0427132f, +-0.0371271f,0.993135f,-0.110921f, +0.0109117f,0.996203f,-0.0863686f, +0.0455917f,0.995961f,-0.0773449f, +-0.0321894f,0.986545f,-0.160288f, +-0.0649603f,0.996397f,0.0545189f, +0.00369488f,0.985567f,0.169244f, +0.226168f,0.962189f,0.151787f, +0.029392f,0.999567f,0.00117257f, +-0.13579f,0.984206f,-0.113581f, +-0.10103f,0.992288f,-0.0718192f, +-0.125171f,0.991084f,0.0456533f, +-0.108309f,0.993989f,0.015999f, +-0.0231464f,0.995269f,-0.0943563f, +0.0270486f,0.99325f,-0.112795f, +0.141677f,0.989359f,-0.0331051f, +0.0268575f,0.994547f,-0.100767f, +-0.194101f,0.980932f,0.009818f, +-0.41139f,0.899763f,0.145547f, +-0.482013f,0.8562f,0.185973f, +-0.415606f,0.872343f,0.257468f, +-0.291757f,0.884021f,0.365218f, +-0.316561f,0.886381f,0.337814f, +-0.406f,0.884827f,0.22857f, +-0.363525f,0.905831f,0.217534f, +-0.301242f,0.93366f,0.193734f, +-0.208193f,0.941974f,0.263325f, +-0.164184f,0.932027f,0.323063f, +-0.4694f,0.88027f,-0.0691917f, +-0.525104f,0.840943f,-0.130688f, +-0.256903f,0.950739f,0.17348f, +-0.180022f,0.968548f,0.171775f, +0.0734506f,0.860739f,0.50372f, +-0.205317f,0.895889f,0.393991f, +0.0472127f,0.984089f,0.171289f, +0.492639f,0.869295f,-0.040419f, +0.615313f,0.776504f,0.135761f, +0.240143f,0.940103f,0.241946f, +0.0961855f,0.982412f,0.160044f, +0.107308f,0.976554f,0.186622f, +-0.0192621f,0.988216f,-0.151846f, +0.243819f,0.934285f,-0.260122f, +0.363158f,0.92047f,-0.144401f, +-0.0181857f,0.911833f,-0.410158f, +0.13216f,0.935755f,-0.326948f, +0.234069f,0.876493f,0.42068f, +-0.0429998f,0.864233f,0.501251f, +0.30178f,0.838678f,0.453374f, +0.334916f,0.905993f,0.258858f, +0.486799f,0.865003f,0.121641f, +0.551114f,0.813232f,-0.186886f, +0.639118f,0.75121f,0.164956f, +0.383938f,0.890692f,0.243432f, +0.354878f,0.921145f,0.159855f, +0.162961f,0.98584f,-0.0395363f, +-0.0637937f,0.974986f,-0.212914f, +-0.0365262f,0.968846f,-0.244954f, +-0.281965f,0.951785f,0.120834f, +-0.274882f,0.955225f,0.109473f, +-0.104135f,0.948711f,0.298502f, +0.0826411f,0.912269f,0.401168f, +0.0342531f,0.97031f,0.239425f, +-0.0365634f,0.991589f,0.124154f, +0.134024f,0.975461f,0.174679f, +0.109589f,0.99345f,0.032348f, +0.0453955f,0.994687f,-0.0923934f, +-0.0149079f,0.988982f,-0.147281f, +0.0512217f,0.992549f,-0.110554f, +0.0167819f,0.988638f,-0.149377f, +-0.222271f,0.949144f,-0.222982f, +-0.0921327f,0.987637f,-0.126823f, +0.189567f,0.98184f,-0.00744372f, +0.205171f,0.976356f,0.0680753f, +-0.00982996f,0.993812f,-0.110639f, +-0.0883427f,0.978311f,-0.18736f, +-0.198236f,0.955921f,-0.216604f, +-0.180283f,0.972159f,-0.149685f, +0.0029493f,0.99947f,-0.0324137f, +-0.0433514f,0.998534f,-0.0324142f, +0.0405175f,0.99421f,0.0995223f, +0.00286263f,0.981263f,0.19265f, +-0.296663f,0.921382f,0.251091f, +-0.412123f,0.867858f,0.277446f, +-0.439996f,0.871969f,0.214648f, +-0.457669f,0.875232f,0.156552f, +-0.384822f,0.899193f,0.208242f, +-0.276213f,0.916653f,0.288882f, +-0.314226f,0.91283f,0.260774f, +-0.345662f,0.91535f,0.206522f, +-0.311859f,0.934366f,0.17235f, +-0.323293f,0.931681f,0.165688f, +-0.218081f,0.943645f,0.248946f, +0.00414662f,0.967721f,0.251991f, +-0.350612f,0.910773f,-0.218092f, +-0.590427f,0.768592f,-0.246296f, +-0.263693f,0.937904f,0.225393f, +-0.149885f,0.945975f,0.287518f, +-0.0723712f,0.947676f,0.310922f, +0.303995f,0.902765f,0.304306f, +0.615729f,0.768916f,0.172179f, +0.376573f,0.870472f,0.316971f, +0.258103f,0.862435f,0.435417f, +0.208037f,0.965523f,0.156476f, +0.041711f,0.997309f,0.0602974f, +0.0896451f,0.984172f,0.152868f, +0.200861f,0.950569f,0.236798f, +0.331115f,0.861074f,0.385894f, +0.343908f,0.839357f,0.420961f, +-0.162885f,0.985003f,0.0568977f, +-0.0608521f,0.991774f,0.112611f, +0.279417f,0.937386f,0.207929f, +0.438178f,0.898268f,0.033396f, +0.516016f,0.854846f,-0.0544561f, +0.550254f,0.781096f,-0.295143f, +0.499018f,0.830127f,-0.248738f, +0.421585f,0.905472f,0.0488414f, +0.355515f,0.918443f,0.173411f, +0.416018f,0.882036f,0.221226f, +0.346021f,0.922667f,0.170161f, +0.0862406f,0.994799f,-0.0542001f, +0.0251294f,0.989963f,-0.139071f, +-0.167311f,0.982002f,0.0876306f, +-0.296088f,0.953872f,0.0496014f, +-0.309819f,0.944071f,0.112878f, +0.0107419f,0.974593f,0.223724f, +0.235566f,0.938548f,0.252263f, +0.0528759f,0.995406f,0.0798236f, +0.106055f,0.992977f,0.0524375f, +0.227694f,0.967451f,0.110427f, +0.15013f,0.988604f,0.0110517f, +0.0292872f,0.989448f,-0.141897f, +0.0113647f,0.978518f,-0.205848f, +0.0966514f,0.981912f,-0.162811f, +-0.0834695f,0.969158f,-0.231875f, +-0.173766f,0.92349f,-0.34201f, +0.0289323f,0.967596f,-0.250839f, +0.166759f,0.980973f,-0.0994165f, +0.0796755f,0.992423f,-0.0935347f, +-0.0109031f,0.993494f,-0.113363f, +-0.181202f,0.957527f,-0.224295f, +-0.231371f,0.948894f,-0.214636f, +-0.0963906f,0.978232f,-0.183771f, +-0.0964169f,0.992283f,-0.0779687f, +-0.114591f,0.992373f,0.045429f, +-0.0476997f,0.984744f,0.167343f, +-0.353531f,0.929974f,0.100818f, +-0.42903f,0.892447f,0.139543f, +-0.399459f,0.902474f,0.161164f, +-0.44275f,0.883954f,0.150326f, +-0.416721f,0.891582f,0.177271f, +-0.364313f,0.907101f,0.210818f, +-0.329954f,0.890729f,0.312622f, +-0.308128f,0.891277f,0.33269f, +-0.248313f,0.912421f,0.325314f, +-0.264673f,0.92449f,0.274348f, +-0.221501f,0.958108f,0.181568f, +-0.00722143f,0.985032f,0.17222f, +0.0811419f,0.973825f,0.212324f, +-0.519461f,0.82914f,-0.206608f, +-0.561212f,0.816969f,-0.132674f, +-0.10198f,0.978452f,0.179533f, +-0.0294922f,0.994047f,0.104885f, +0.212965f,0.975972f,0.0461033f, +0.39072f,0.902699f,0.180202f, +0.284816f,0.877828f,0.385096f, +0.371584f,0.726424f,0.578129f, +0.415725f,0.734903f,0.535809f, +0.0647658f,0.913533f,0.401575f, +0.0316961f,0.895539f,0.443852f, +-0.0215836f,0.930013f,0.366891f, +0.0389377f,0.900411f,0.433293f, +0.182398f,0.888094f,0.421923f, +0.319795f,0.864372f,0.388061f, +0.179682f,0.983355f,0.0269752f, +0.358016f,0.913314f,-0.19412f, +0.445422f,0.82688f,-0.343321f, +0.564533f,0.736553f,-0.372547f, +0.511683f,0.792162f,-0.332656f, +0.362215f,0.931906f,0.0187495f, +0.332114f,0.925718f,0.180958f, +0.376936f,0.924108f,0.0628019f, +0.34207f,0.939661f,0.00505146f, +0.432513f,0.89733f,0.0879243f, +0.250624f,0.96783f,0.022189f, +0.113333f,0.993448f,0.0146943f, +-0.330108f,0.943938f,0.00323688f, +-0.32108f,0.944743f,0.0660874f, +-0.312445f,0.949733f,0.0196284f, +-0.0425447f,0.998988f,-0.0145795f, +0.234895f,0.971633f,0.0274452f, +0.205978f,0.978297f,0.0225396f, +0.0556133f,0.99289f,-0.10525f, +0.149272f,0.988455f,-0.0259672f, +0.25486f,0.966188f,0.0390683f, +0.206371f,0.977859f,-0.0346908f, +0.0798975f,0.983688f,-0.161166f, +0.0387149f,0.980238f,-0.193996f, +-0.0261652f,0.985317f,-0.168719f, +-0.115457f,0.963019f,-0.243441f, +-0.0914394f,0.962229f,-0.256427f, +0.0382488f,0.992063f,-0.119784f, +0.0800161f,0.996698f,-0.0137989f, +0.0187475f,0.998138f,-0.0580508f, +-0.073595f,0.994051f,-0.0802936f, +-0.224165f,0.957926f,-0.179241f, +-0.16346f,0.967941f,-0.190711f, +-0.19173f,0.978244f,-0.0792358f, +-0.275576f,0.961029f,-0.0219235f, +-0.0407932f,0.98802f,0.148838f, +-0.278629f,0.956556f,0.085827f, +-0.465684f,0.878931f,0.103047f, +-0.438529f,0.89146f,0.11398f, +-0.455089f,0.880964f,0.129601f, +-0.457802f,0.879895f,0.127287f, +-0.406331f,0.89051f,0.204664f, +-0.386395f,0.891456f,0.236654f, +-0.321818f,0.921226f,0.218577f, +-0.271011f,0.935727f,0.22576f, +-0.198383f,0.944022f,0.263564f, +-0.105727f,0.975806f,0.191373f, +-0.0832756f,0.987941f,0.130528f, +0.0931562f,0.956641f,0.27597f, +-0.216408f,0.96162f,0.168686f, +-0.648586f,0.688743f,-0.323988f, +-0.276841f,0.843915f,-0.459527f, +-0.060911f,0.935148f,-0.348981f, +0.243821f,0.963831f,-0.107611f, +0.35478f,0.93349f,-0.0522288f, +0.124674f,0.987025f,-0.101179f, +0.106145f,0.993646f,0.0374371f, +0.264307f,0.911176f,0.316069f, +0.180037f,0.821936f,0.540378f, +0.0976487f,0.839888f,0.533903f, +0.242869f,0.82432f,0.511381f, +0.296956f,0.900742f,0.316987f, +0.37446f,0.92343f,0.0840066f, +0.38614f,0.913414f,-0.128727f, +0.497691f,0.838063f,-0.223505f, +0.399217f,0.778523f,-0.484281f, +0.607215f,0.684189f,-0.403949f, +0.455879f,0.835157f,-0.307715f, +0.317815f,0.943806f,-0.0906903f, +0.166917f,0.983806f,0.0653043f, +0.277188f,0.953387f,0.119249f, +0.491287f,0.85011f,0.189606f, +0.3858f,0.919271f,0.0780984f, +0.390109f,0.91635f,0.0900968f, +0.247947f,0.964668f,0.0890966f, +0.0188396f,0.999506f,0.0251451f, +-0.249227f,0.949063f,0.192782f, +-0.24873f,0.963608f,0.0979465f, +-0.225537f,0.968208f,-0.108193f, +-0.0586638f,0.984304f,-0.166448f, +0.193919f,0.980395f,-0.0349386f, +0.232927f,0.972341f,0.0172453f, +0.165218f,0.985248f,-0.0445953f, +0.10666f,0.982482f,-0.152814f, +0.176402f,0.976328f,-0.125164f, +0.217875f,0.975941f,-0.00837002f, +0.138055f,0.990338f,0.0130638f, +0.0914598f,0.995289f,-0.0321788f, +-0.014672f,0.992233f,-0.123523f, +-0.0701479f,0.990985f,-0.114142f, +-0.0940689f,0.987781f,-0.124254f, +-0.152176f,0.977744f,-0.144426f, +0.043676f,0.996991f,0.0640382f, +0.0457416f,0.996307f,0.07266f, +-0.0198973f,0.997072f,0.0738311f, +-0.119455f,0.990174f,-0.0727032f, +-0.224875f,0.962572f,-0.151282f, +-0.250045f,0.966903f,-0.0507448f, +-0.319974f,0.944248f,-0.0775328f, +-0.16005f,0.987102f,-0.00365841f, +-0.307005f,0.947659f,0.0876954f, +-0.490256f,0.846833f,0.206209f, +-0.400386f,0.879926f,0.255778f, +-0.427515f,0.880624f,0.204282f, +-0.477897f,0.856347f,0.195663f, +-0.43217f,0.864768f,0.255745f, +-0.342474f,0.92438f,0.16803f, +-0.284468f,0.956998f,0.0568588f, +-0.290121f,0.956708f,0.023234f, +-0.249156f,0.966838f,0.0560771f, +-0.0655515f,0.986836f,0.147842f, +-0.100568f,0.984251f,0.145384f, +-0.0191778f,0.985445f,0.168911f, +-0.0443403f,0.97787f,0.204462f, +-0.28653f,0.957033f,-0.044587f, +-0.127864f,0.901634f,-0.413166f, +-0.0930849f,0.861283f,-0.499526f, +-0.10032f,0.791759f,-0.60254f, +0.277857f,0.863349f,-0.421218f, +0.0733471f,0.944573f,-0.320003f, +0.0656198f,0.995434f,-0.0693225f, +0.0994234f,0.993172f,-0.0610351f, +0.0758799f,0.991718f,0.103618f, +0.0755546f,0.978148f,0.193698f, +0.318521f,0.931105f,0.177731f, +0.532035f,0.846717f,0.00302226f, +0.479952f,0.801468f,-0.356785f, +0.444207f,0.753204f,-0.485143f, +0.599635f,0.661874f,-0.449845f, +0.467802f,0.782561f,-0.410805f, +0.194572f,0.899472f,-0.391269f, +0.334078f,0.938895f,-0.0828733f, +0.236858f,0.971355f,0.0191963f, +0.177255f,0.983392f,0.0389945f, +0.22691f,0.973661f,-0.0222777f, +0.408661f,0.912593f,0.013075f, +0.394434f,0.908333f,0.139114f, +0.34039f,0.913901f,0.221176f, +0.340162f,0.904445f,0.257428f, +0.21637f,0.954077f,0.207173f, +-0.190356f,0.960699f,0.202044f, +-0.0745122f,0.978557f,0.192026f, +-0.0103556f,0.997337f,0.0721953f, +-0.102208f,0.994222f,-0.0328074f, +0.0538732f,0.998534f,0.00527007f, +0.220064f,0.97523f,-0.0223306f, +0.22889f,0.972208f,-0.0492086f, +0.203387f,0.976813f,-0.0668524f, +0.112155f,0.987122f,-0.114071f, +0.137033f,0.989998f,-0.0335468f, +0.125928f,0.990544f,-0.0544465f, +0.164164f,0.983484f,-0.0762248f, +0.056178f,0.987899f,-0.14457f, +-0.125491f,0.977887f,-0.167299f, +-0.0763702f,0.993552f,-0.0837951f, +-0.140516f,0.986451f,-0.0846751f, +-0.138825f,0.988035f,-0.0671838f, +0.0272382f,0.998662f,0.0439583f, +0.051406f,0.998673f,0.00322772f, +0.0131796f,0.996364f,-0.0841692f, +-0.197723f,0.973335f,-0.116299f, +-0.315939f,0.94482f,-0.0865842f, +-0.273936f,0.961179f,-0.0330844f, +-0.278588f,0.957771f,-0.0711653f, +-0.371629f,0.922753f,0.102078f, +-0.589295f,0.797687f,0.128167f, +-0.394808f,0.893641f,0.213383f, +-0.419749f,0.89327f,0.160869f, +-0.503386f,0.848953f,0.160878f, +-0.392151f,0.910681f,0.129912f, +-0.194389f,0.97789f,0.0771005f, +-0.210697f,0.97754f,0.00473511f, +-0.261758f,0.965059f,0.0120029f, +-0.306606f,0.951531f,-0.0240962f, +-0.191391f,0.98062f,0.0418887f, +-0.0805366f,0.9875f,0.135492f, +-0.0197042f,0.996843f,0.0769187f, +-0.0102082f,0.996001f,0.0887568f, +-0.106967f,0.993499f,0.0389638f, +-0.0299932f,0.997488f,-0.0641764f, +0.166392f,0.98551f,-0.0329295f, +0.122834f,0.919366f,-0.373736f, +0.0989442f,0.860803f,-0.499228f, +-0.16483f,0.786842f,-0.594736f, +-0.139994f,0.854441f,-0.500331f, +0.037386f,0.884593f,-0.464864f, +-0.0340706f,0.910599f,-0.411885f, +0.0643546f,0.934103f,-0.351155f, +0.330549f,0.864687f,-0.378225f, +0.61879f,0.706641f,-0.343158f, +0.664468f,0.668218f,-0.334614f, +0.535603f,0.737564f,-0.411252f, +0.392926f,0.807647f,-0.439677f, +0.299634f,0.936543f,-0.181953f, +0.20385f,0.978529f,-0.030423f, +0.255219f,0.962099f,-0.0960637f, +0.218057f,0.97044f,-0.103423f, +0.152183f,0.981776f,-0.113823f, +0.287579f,0.953452f,-0.0907011f, +0.354102f,0.933846f,-0.0504376f, +0.271766f,0.955964f,0.110796f, +0.254566f,0.942907f,0.214762f, +0.330431f,0.909031f,0.253925f, +0.276649f,0.934017f,0.226003f, +-0.276078f,0.960525f,0.0342386f, +-0.126608f,0.988039f,0.088024f, +-0.0433883f,0.982429f,0.181523f, +-0.0351658f,0.95918f,0.280603f, +0.130316f,0.978179f,0.161815f, +0.34012f,0.939563f,0.0392436f, +0.225269f,0.971719f,-0.0708295f, +0.186144f,0.981343f,-0.0481244f, +0.117145f,0.991402f,-0.0582961f, +0.122374f,0.988553f,-0.0882497f, +0.217284f,0.968092f,-0.124844f, +0.168939f,0.967628f,-0.1875f, +0.0966952f,0.983818f,-0.150838f, +-0.108071f,0.971789f,-0.209635f, +-0.167419f,0.956466f,-0.239047f, +-0.15925f,0.972646f,-0.169115f, +-0.169755f,0.972705f,-0.158205f, +0.0352685f,0.991682f,-0.123784f, +0.0984439f,0.980655f,-0.169186f, +0.0318934f,0.989724f,-0.139387f, +-0.246309f,0.963763f,-0.102435f, +-0.355567f,0.934631f,-0.00599911f, +-0.265814f,0.963735f,-0.0236194f, +-0.351588f,0.935043f,-0.0456126f, +-0.494494f,0.858936f,0.133056f, +-0.559402f,0.824266f,0.0874941f, +-0.405326f,0.914016f,0.0169127f, +-0.376559f,0.926338f,0.010028f, +-0.448864f,0.890609f,-0.0730511f, +-0.3487f,0.913403f,-0.210007f, +-0.225518f,0.948441f,-0.222713f, +-0.278172f,0.957801f,-0.0723737f, +-0.296428f,0.947861f,0.117f, +-0.260326f,0.954501f,0.14546f, +-0.208806f,0.976306f,0.0568064f, +-0.0937503f,0.995595f,-0.00141652f, +0.0211825f,0.998587f,-0.0487327f, +-0.0203898f,0.998016f,-0.0595622f, +-0.117256f,0.992273f,-0.0405676f, +0.0346735f,0.999272f,0.0158994f, +0.165596f,0.985653f,-0.0326431f, +0.277068f,0.959929f,-0.0420538f, +0.211278f,0.971116f,-0.110882f, +0.138826f,0.972226f,-0.188423f, +0.0186164f,0.920791f,-0.389612f, +0.00693313f,0.891348f,-0.453267f, +-0.0471378f,0.869656f,-0.491403f, +0.135484f,0.84445f,-0.518217f, +0.351566f,0.784405f,-0.510988f, +0.399468f,0.772299f,-0.493943f, +0.574953f,0.790421f,-0.211338f, +0.577809f,0.813449f,-0.0666111f, +0.451377f,0.892327f,0.00336233f, +0.237932f,0.970883f,-0.0278435f, +0.170635f,0.975266f,-0.140498f, +0.305065f,0.94416f,-0.124487f, +0.219111f,0.958291f,-0.183492f, +0.160317f,0.981326f,-0.106286f, +0.222178f,0.974771f,-0.021419f, +0.23168f,0.971792f,0.0441002f, +0.140177f,0.984507f,0.105338f, +0.184383f,0.966339f,0.179422f, +0.307531f,0.911743f,0.272303f, +0.342083f,0.879118f,0.331859f, +-0.245266f,0.968917f,0.0323163f, +-0.176433f,0.984311f,-0.00156667f, +-0.164847f,0.983548f,0.0738887f, +-0.0271087f,0.959686f,0.279762f, +0.210185f,0.960158f,0.18417f, +0.386525f,0.917795f,0.0908302f, +0.288585f,0.956426f,0.04436f, +0.157424f,0.986731f,-0.0397454f, +0.194229f,0.980956f,0.000793421f, +0.143953f,0.978f,-0.150974f, +0.243865f,0.955091f,-0.168319f, +0.151307f,0.968911f,-0.195749f, +0.0861511f,0.987302f,-0.133462f, +-0.0343302f,0.988258f,-0.148887f, +-0.149683f,0.954065f,-0.259529f, +-0.180054f,0.943807f,-0.277143f, +-0.182632f,0.946912f,-0.26458f, +0.0250152f,0.97257f,-0.23126f, +0.0655433f,0.96826f,-0.241197f, +0.00940225f,0.990707f,-0.135685f, +-0.313822f,0.94168f,-0.121471f, +-0.325919f,0.940955f,0.0915474f, +-0.245857f,0.968763f,-0.0324418f, +-0.38384f,0.920444f,-0.0738245f, +-0.542624f,0.834584f,0.0950211f, +-0.496894f,0.865347f,0.0653522f, +-0.40471f,0.910862f,-0.0808731f, +-0.336326f,0.940002f,-0.0572751f, +-0.384947f,0.90765f,-0.167296f, +-0.26052f,0.919475f,-0.294439f, +-0.278076f,0.879766f,-0.385599f, +-0.415096f,0.880667f,-0.2283f, +-0.411169f,0.907675f,0.0840562f, +-0.22106f,0.940981f,0.256296f, +-0.105371f,0.978797f,0.175653f, +-0.0100537f,0.999811f,0.0166273f, +0.0459065f,0.991326f,-0.123151f, +-0.0151969f,0.991011f,-0.132912f, +-0.164041f,0.976761f,-0.137947f, +0.00793599f,0.998771f,-0.0489272f, +0.178958f,0.98335f,-0.031577f, +0.314466f,0.949045f,-0.0206086f, +0.240757f,0.963062f,-0.120617f, +0.126531f,0.982046f,-0.139911f, +0.0695074f,0.9956f,-0.062839f, +0.0427419f,0.998852f,-0.02164f, +-0.0292495f,0.993565f,-0.109419f, +0.176081f,0.974549f,-0.138744f, +0.405406f,0.900659f,-0.156393f, +0.48202f,0.865956f,-0.133334f, +0.477566f,0.852664f,-0.211881f, +0.526274f,0.839922f,-0.132537f, +0.390331f,0.920621f,-0.0098857f, +0.349443f,0.931118f,0.104442f, +0.205374f,0.96487f,-0.163851f, +0.359411f,0.921384f,-0.147904f, +0.161592f,0.938137f,-0.306246f, +0.0124614f,0.982178f,-0.187542f, +0.143914f,0.986786f,0.0744463f, +0.270333f,0.949018f,0.162126f, +0.132f,0.991194f,0.0105184f, +0.131712f,0.991267f,0.00644011f, +0.199003f,0.974024f,0.108048f, +0.274163f,0.928953f,0.248757f, +}; + +btScalar Landscape01Tex[] = { +0.507813f,0.0078125f, +0.507813f,0.0f, +0.515625f,0.0078125f, +0.515625f,0.0f, +0.523438f,0.0078125f, +0.523438f,0.0f, +0.53125f,0.0078125f, +0.53125f,0.0f, +0.539063f,0.0078125f, +0.539063f,0.0f, +0.546875f,0.0078125f, +0.546875f,0.0f, +0.554688f,0.0078125f, +0.554688f,0.0f, +0.5625f,0.0078125f, +0.5625f,0.0f, +0.570313f,0.0078125f, +0.570313f,0.0f, +0.578125f,0.0078125f, +0.578125f,0.0f, +0.585938f,0.0078125f, +0.585938f,0.0f, +0.59375f,0.0078125f, +0.59375f,0.0f, +0.601563f,0.0078125f, +0.601563f,0.0f, +0.609375f,0.0078125f, +0.609375f,0.0f, +0.617188f,0.0078125f, +0.617188f,0.0f, +0.625f,0.0078125f, +0.625f,0.0f, +0.632813f,0.0078125f, +0.632813f,0.0f, +0.640625f,0.0078125f, +0.640625f,0.0f, +0.648438f,0.0078125f, +0.648438f,0.0f, +0.65625f,0.0078125f, +0.65625f,0.0f, +0.664063f,0.0078125f, +0.664063f,0.0f, +0.671875f,0.0078125f, +0.671875f,0.0f, +0.679688f,0.0078125f, +0.679688f,0.0f, +0.6875f,0.0078125f, +0.6875f,0.0f, +0.695313f,0.0078125f, +0.695313f,0.0f, +0.703125f,0.0078125f, +0.703125f,0.0f, +0.710938f,0.0078125f, +0.710938f,0.0f, +0.71875f,0.0078125f, +0.71875f,0.0f, +0.726563f,0.0078125f, +0.726563f,0.0f, +0.734375f,0.0078125f, +0.734375f,0.0f, +0.742188f,0.0078125f, +0.742188f,0.0f, +0.75f,0.0078125f, +0.75f,0.0f, +0.757813f,0.0078125f, +0.757813f,0.0f, +0.765625f,0.0078125f, +0.765625f,0.0f, +0.773438f,0.0078125f, +0.773438f,0.0f, +0.78125f,0.0078125f, +0.78125f,0.0f, +0.789063f,0.0078125f, +0.789063f,0.0f, +0.796875f,0.0078125f, +0.796875f,0.0f, +0.804688f,0.0078125f, +0.804688f,0.0f, +0.8125f,0.0078125f, +0.8125f,0.0f, +0.820313f,0.0078125f, +0.820313f,0.0f, +0.828125f,0.0078125f, +0.828125f,0.0f, +0.835938f,0.0078125f, +0.835938f,0.0f, +0.84375f,0.0078125f, +0.84375f,0.0f, +0.851563f,0.0078125f, +0.851563f,0.0f, +0.859375f,0.0078125f, +0.859375f,0.0f, +0.867188f,0.0078125f, +0.867188f,0.0f, +0.875f,0.0078125f, +0.875f,0.0f, +0.882813f,0.0078125f, +0.882813f,0.0f, +0.890625f,0.0078125f, +0.890625f,0.0f, +0.898438f,0.0078125f, +0.898438f,0.0f, +0.90625f,0.0078125f, +0.90625f,0.0f, +0.914063f,0.0078125f, +0.914063f,0.0f, +0.921875f,0.0078125f, +0.921875f,0.0f, +0.929688f,0.0078125f, +0.929688f,0.0f, +0.9375f,0.0078125f, +0.9375f,0.0f, +0.945313f,0.0078125f, +0.945313f,0.0f, +0.953125f,0.0078125f, +0.953125f,0.0f, +0.960938f,0.0078125f, +0.960938f,0.0f, +0.96875f,0.0078125f, +0.96875f,0.0f, +0.976563f,0.0078125f, +0.976563f,0.0f, +0.984375f,0.0078125f, +0.984375f,0.0f, +0.992188f,0.0078125f, +0.992188f,0.0f, +1.0f,0.0078125f, +1.0f,0.0f, +0.507813f,0.015625f, +0.515625f,0.015625f, +0.523438f,0.015625f, +0.53125f,0.015625f, +0.539063f,0.015625f, +0.546875f,0.015625f, +0.554688f,0.015625f, +0.5625f,0.015625f, +0.570313f,0.015625f, +0.578125f,0.015625f, +0.585938f,0.015625f, +0.59375f,0.015625f, +0.601563f,0.015625f, +0.609375f,0.015625f, +0.617188f,0.015625f, +0.625f,0.015625f, +0.632813f,0.015625f, +0.640625f,0.015625f, +0.648438f,0.015625f, +0.65625f,0.015625f, +0.664063f,0.015625f, +0.671875f,0.015625f, +0.679688f,0.015625f, +0.6875f,0.015625f, +0.695313f,0.015625f, +0.703125f,0.015625f, +0.710938f,0.015625f, +0.71875f,0.015625f, +0.726563f,0.015625f, +0.734375f,0.015625f, +0.742188f,0.015625f, +0.75f,0.015625f, +0.757813f,0.015625f, +0.765625f,0.015625f, +0.773438f,0.015625f, +0.78125f,0.015625f, +0.789063f,0.015625f, +0.796875f,0.015625f, +0.804688f,0.015625f, +0.8125f,0.015625f, +0.820313f,0.015625f, +0.828125f,0.015625f, +0.835938f,0.015625f, +0.84375f,0.015625f, +0.851563f,0.015625f, +0.859375f,0.015625f, +0.867188f,0.015625f, +0.875f,0.015625f, +0.882813f,0.015625f, +0.890625f,0.015625f, +0.898438f,0.015625f, +0.90625f,0.015625f, +0.914063f,0.015625f, +0.921875f,0.015625f, +0.929688f,0.015625f, +0.9375f,0.015625f, +0.945313f,0.015625f, +0.953125f,0.015625f, +0.960938f,0.015625f, +0.96875f,0.015625f, +0.976563f,0.015625f, +0.984375f,0.015625f, +0.992188f,0.015625f, +1.0f,0.015625f, +0.507813f,0.0234375f, +0.515625f,0.0234375f, +0.523438f,0.0234375f, +0.53125f,0.0234375f, +0.539063f,0.0234375f, +0.546875f,0.0234375f, +0.554688f,0.0234375f, +0.5625f,0.0234375f, +0.570313f,0.0234375f, +0.578125f,0.0234375f, +0.585938f,0.0234375f, +0.59375f,0.0234375f, +0.601563f,0.0234375f, +0.609375f,0.0234375f, +0.617188f,0.0234375f, +0.625f,0.0234375f, +0.632813f,0.0234375f, +0.640625f,0.0234375f, +0.648438f,0.0234375f, +0.65625f,0.0234375f, +0.664063f,0.0234375f, +0.671875f,0.0234375f, +0.679688f,0.0234375f, +0.6875f,0.0234375f, +0.695313f,0.0234375f, +0.703125f,0.0234375f, +0.710938f,0.0234375f, +0.71875f,0.0234375f, +0.726563f,0.0234375f, +0.734375f,0.0234375f, +0.742188f,0.0234375f, +0.75f,0.0234375f, +0.757813f,0.0234375f, +0.765625f,0.0234375f, +0.773438f,0.0234375f, +0.78125f,0.0234375f, +0.789063f,0.0234375f, +0.796875f,0.0234375f, +0.804688f,0.0234375f, +0.8125f,0.0234375f, +0.820313f,0.0234375f, +0.828125f,0.0234375f, +0.835938f,0.0234375f, +0.84375f,0.0234375f, +0.851563f,0.0234375f, +0.859375f,0.0234375f, +0.867188f,0.0234375f, +0.875f,0.0234375f, +0.882813f,0.0234375f, +0.890625f,0.0234375f, +0.898438f,0.0234375f, +0.90625f,0.0234375f, +0.914063f,0.0234375f, +0.921875f,0.0234375f, +0.929688f,0.0234375f, +0.9375f,0.0234375f, +0.945313f,0.0234375f, +0.953125f,0.0234375f, +0.960938f,0.0234375f, +0.96875f,0.0234375f, +0.976563f,0.0234375f, +0.984375f,0.0234375f, +0.992188f,0.0234375f, +1.0f,0.0234375f, +0.507813f,0.03125f, +0.515625f,0.03125f, +0.523438f,0.03125f, +0.53125f,0.03125f, +0.539063f,0.03125f, +0.546875f,0.03125f, +0.554688f,0.03125f, +0.5625f,0.03125f, +0.570313f,0.03125f, +0.578125f,0.03125f, +0.585938f,0.03125f, +0.59375f,0.03125f, +0.601563f,0.03125f, +0.609375f,0.03125f, +0.617188f,0.03125f, +0.625f,0.03125f, +0.632813f,0.03125f, +0.640625f,0.03125f, +0.648438f,0.03125f, +0.65625f,0.03125f, +0.664063f,0.03125f, +0.671875f,0.03125f, +0.679688f,0.03125f, +0.6875f,0.03125f, +0.695313f,0.03125f, +0.703125f,0.03125f, +0.710938f,0.03125f, +0.71875f,0.03125f, +0.726563f,0.03125f, +0.734375f,0.03125f, +0.742188f,0.03125f, +0.75f,0.03125f, +0.757813f,0.03125f, +0.765625f,0.03125f, +0.773438f,0.03125f, +0.78125f,0.03125f, +0.789063f,0.03125f, +0.796875f,0.03125f, +0.804688f,0.03125f, +0.8125f,0.03125f, +0.820313f,0.03125f, +0.828125f,0.03125f, +0.835938f,0.03125f, +0.84375f,0.03125f, +0.851563f,0.03125f, +0.859375f,0.03125f, +0.867188f,0.03125f, +0.875f,0.03125f, +0.882813f,0.03125f, +0.890625f,0.03125f, +0.898438f,0.03125f, +0.90625f,0.03125f, +0.914063f,0.03125f, +0.921875f,0.03125f, +0.929688f,0.03125f, +0.9375f,0.03125f, +0.945313f,0.03125f, +0.953125f,0.03125f, +0.960938f,0.03125f, +0.96875f,0.03125f, +0.976563f,0.03125f, +0.984375f,0.03125f, +0.992188f,0.03125f, +1.0f,0.03125f, +0.507813f,0.0390625f, +0.515625f,0.0390625f, +0.523438f,0.0390625f, +0.53125f,0.0390625f, +0.539063f,0.0390625f, +0.546875f,0.0390625f, +0.554688f,0.0390625f, +0.5625f,0.0390625f, +0.570313f,0.0390625f, +0.578125f,0.0390625f, +0.585938f,0.0390625f, +0.59375f,0.0390625f, +0.601563f,0.0390625f, +0.609375f,0.0390625f, +0.617188f,0.0390625f, +0.625f,0.0390625f, +0.632813f,0.0390625f, +0.640625f,0.0390625f, +0.648438f,0.0390625f, +0.65625f,0.0390625f, +0.664063f,0.0390625f, +0.671875f,0.0390625f, +0.679688f,0.0390625f, +0.6875f,0.0390625f, +0.695313f,0.0390625f, +0.703125f,0.0390625f, +0.710938f,0.0390625f, +0.71875f,0.0390625f, +0.726563f,0.0390625f, +0.734375f,0.0390625f, +0.742188f,0.0390625f, +0.75f,0.0390625f, +0.757813f,0.0390625f, +0.765625f,0.0390625f, +0.773438f,0.0390625f, +0.78125f,0.0390625f, +0.789063f,0.0390625f, +0.796875f,0.0390625f, +0.804688f,0.0390625f, +0.8125f,0.0390625f, +0.820313f,0.0390625f, +0.828125f,0.0390625f, +0.835938f,0.0390625f, +0.84375f,0.0390625f, +0.851563f,0.0390625f, +0.859375f,0.0390625f, +0.867188f,0.0390625f, +0.875f,0.0390625f, +0.882813f,0.0390625f, +0.890625f,0.0390625f, +0.898438f,0.0390625f, +0.90625f,0.0390625f, +0.914063f,0.0390625f, +0.921875f,0.0390625f, +0.929688f,0.0390625f, +0.9375f,0.0390625f, +0.945313f,0.0390625f, +0.953125f,0.0390625f, +0.960938f,0.0390625f, +0.96875f,0.0390625f, +0.976563f,0.0390625f, +0.984375f,0.0390625f, +0.992188f,0.0390625f, +1.0f,0.0390625f, +0.507813f,0.046875f, +0.515625f,0.046875f, +0.523438f,0.046875f, +0.53125f,0.046875f, +0.539063f,0.046875f, +0.546875f,0.046875f, +0.554688f,0.046875f, +0.5625f,0.046875f, +0.570313f,0.046875f, +0.578125f,0.046875f, +0.585938f,0.046875f, +0.59375f,0.046875f, +0.601563f,0.046875f, +0.609375f,0.046875f, +0.617188f,0.046875f, +0.625f,0.046875f, +0.632813f,0.046875f, +0.640625f,0.046875f, +0.648438f,0.046875f, +0.65625f,0.046875f, +0.664063f,0.046875f, +0.671875f,0.046875f, +0.679688f,0.046875f, +0.6875f,0.046875f, +0.695313f,0.046875f, +0.703125f,0.046875f, +0.710938f,0.046875f, +0.71875f,0.046875f, +0.726563f,0.046875f, +0.734375f,0.046875f, +0.742188f,0.046875f, +0.75f,0.046875f, +0.757813f,0.046875f, +0.765625f,0.046875f, +0.773438f,0.046875f, +0.78125f,0.046875f, +0.789063f,0.046875f, +0.796875f,0.046875f, +0.804688f,0.046875f, +0.8125f,0.046875f, +0.820313f,0.046875f, +0.828125f,0.046875f, +0.835938f,0.046875f, +0.84375f,0.046875f, +0.851563f,0.046875f, +0.859375f,0.046875f, +0.867188f,0.046875f, +0.875f,0.046875f, +0.882813f,0.046875f, +0.890625f,0.046875f, +0.898438f,0.046875f, +0.90625f,0.046875f, +0.914063f,0.046875f, +0.921875f,0.046875f, +0.929688f,0.046875f, +0.9375f,0.046875f, +0.945313f,0.046875f, +0.953125f,0.046875f, +0.960938f,0.046875f, +0.96875f,0.046875f, +0.976563f,0.046875f, +0.984375f,0.046875f, +0.992188f,0.046875f, +1.0f,0.046875f, +0.507813f,0.0546875f, +0.515625f,0.0546875f, +0.523438f,0.0546875f, +0.53125f,0.0546875f, +0.539063f,0.0546875f, +0.546875f,0.0546875f, +0.554688f,0.0546875f, +0.5625f,0.0546875f, +0.570313f,0.0546875f, +0.578125f,0.0546875f, +0.585938f,0.0546875f, +0.59375f,0.0546875f, +0.601563f,0.0546875f, +0.609375f,0.0546875f, +0.617188f,0.0546875f, +0.625f,0.0546875f, +0.632813f,0.0546875f, +0.640625f,0.0546875f, +0.648438f,0.0546875f, +0.65625f,0.0546875f, +0.664063f,0.0546875f, +0.671875f,0.0546875f, +0.679688f,0.0546875f, +0.6875f,0.0546875f, +0.695313f,0.0546875f, +0.703125f,0.0546875f, +0.710938f,0.0546875f, +0.71875f,0.0546875f, +0.726563f,0.0546875f, +0.734375f,0.0546875f, +0.742188f,0.0546875f, +0.75f,0.0546875f, +0.757813f,0.0546875f, +0.765625f,0.0546875f, +0.773438f,0.0546875f, +0.78125f,0.0546875f, +0.789063f,0.0546875f, +0.796875f,0.0546875f, +0.804688f,0.0546875f, +0.8125f,0.0546875f, +0.820313f,0.0546875f, +0.828125f,0.0546875f, +0.835938f,0.0546875f, +0.84375f,0.0546875f, +0.851563f,0.0546875f, +0.859375f,0.0546875f, +0.867188f,0.0546875f, +0.875f,0.0546875f, +0.882813f,0.0546875f, +0.890625f,0.0546875f, +0.898438f,0.0546875f, +0.90625f,0.0546875f, +0.914063f,0.0546875f, +0.921875f,0.0546875f, +0.929688f,0.0546875f, +0.9375f,0.0546875f, +0.945313f,0.0546875f, +0.953125f,0.0546875f, +0.960938f,0.0546875f, +0.96875f,0.0546875f, +0.976563f,0.0546875f, +0.984375f,0.0546875f, +0.992188f,0.0546875f, +1.0f,0.0546875f, +0.507813f,0.0625f, +0.515625f,0.0625f, +0.523438f,0.0625f, +0.53125f,0.0625f, +0.539063f,0.0625f, +0.546875f,0.0625f, +0.554688f,0.0625f, +0.5625f,0.0625f, +0.570313f,0.0625f, +0.578125f,0.0625f, +0.585938f,0.0625f, +0.59375f,0.0625f, +0.601563f,0.0625f, +0.609375f,0.0625f, +0.617188f,0.0625f, +0.625f,0.0625f, +0.632813f,0.0625f, +0.640625f,0.0625f, +0.648438f,0.0625f, +0.65625f,0.0625f, +0.664063f,0.0625f, +0.671875f,0.0625f, +0.679688f,0.0625f, +0.6875f,0.0625f, +0.695313f,0.0625f, +0.703125f,0.0625f, +0.710938f,0.0625f, +0.71875f,0.0625f, +0.726563f,0.0625f, +0.734375f,0.0625f, +0.742188f,0.0625f, +0.75f,0.0625f, +0.757813f,0.0625f, +0.765625f,0.0625f, +0.773438f,0.0625f, +0.78125f,0.0625f, +0.789063f,0.0625f, +0.796875f,0.0625f, +0.804688f,0.0625f, +0.8125f,0.0625f, +0.820313f,0.0625f, +0.828125f,0.0625f, +0.835938f,0.0625f, +0.84375f,0.0625f, +0.851563f,0.0625f, +0.859375f,0.0625f, +0.867188f,0.0625f, +0.875f,0.0625f, +0.882813f,0.0625f, +0.890625f,0.0625f, +0.898438f,0.0625f, +0.90625f,0.0625f, +0.914063f,0.0625f, +0.921875f,0.0625f, +0.929688f,0.0625f, +0.9375f,0.0625f, +0.945313f,0.0625f, +0.953125f,0.0625f, +0.960938f,0.0625f, +0.96875f,0.0625f, +0.976563f,0.0625f, +0.984375f,0.0625f, +0.992188f,0.0625f, +1.0f,0.0625f, +0.507813f,0.0703125f, +0.515625f,0.0703125f, +0.523438f,0.0703125f, +0.53125f,0.0703125f, +0.539063f,0.0703125f, +0.546875f,0.0703125f, +0.554688f,0.0703125f, +0.5625f,0.0703125f, +0.570313f,0.0703125f, +0.578125f,0.0703125f, +0.585938f,0.0703125f, +0.59375f,0.0703125f, +0.601563f,0.0703125f, +0.609375f,0.0703125f, +0.617188f,0.0703125f, +0.625f,0.0703125f, +0.632813f,0.0703125f, +0.640625f,0.0703125f, +0.648438f,0.0703125f, +0.65625f,0.0703125f, +0.664063f,0.0703125f, +0.671875f,0.0703125f, +0.679688f,0.0703125f, +0.6875f,0.0703125f, +0.695313f,0.0703125f, +0.703125f,0.0703125f, +0.710938f,0.0703125f, +0.71875f,0.0703125f, +0.726563f,0.0703125f, +0.734375f,0.0703125f, +0.742188f,0.0703125f, +0.75f,0.0703125f, +0.757813f,0.0703125f, +0.765625f,0.0703125f, +0.773438f,0.0703125f, +0.78125f,0.0703125f, +0.789063f,0.0703125f, +0.796875f,0.0703125f, +0.804688f,0.0703125f, +0.8125f,0.0703125f, +0.820313f,0.0703125f, +0.828125f,0.0703125f, +0.835938f,0.0703125f, +0.84375f,0.0703125f, +0.851563f,0.0703125f, +0.859375f,0.0703125f, +0.867188f,0.0703125f, +0.875f,0.0703125f, +0.882813f,0.0703125f, +0.890625f,0.0703125f, +0.898438f,0.0703125f, +0.90625f,0.0703125f, +0.914063f,0.0703125f, +0.921875f,0.0703125f, +0.929688f,0.0703125f, +0.9375f,0.0703125f, +0.945313f,0.0703125f, +0.953125f,0.0703125f, +0.960938f,0.0703125f, +0.96875f,0.0703125f, +0.976563f,0.0703125f, +0.984375f,0.0703125f, +0.992188f,0.0703125f, +1.0f,0.0703125f, +0.507813f,0.078125f, +0.515625f,0.078125f, +0.523438f,0.078125f, +0.53125f,0.078125f, +0.539063f,0.078125f, +0.546875f,0.078125f, +0.554688f,0.078125f, +0.5625f,0.078125f, +0.570313f,0.078125f, +0.578125f,0.078125f, +0.585938f,0.078125f, +0.59375f,0.078125f, +0.601563f,0.078125f, +0.609375f,0.078125f, +0.617188f,0.078125f, +0.625f,0.078125f, +0.632813f,0.078125f, +0.640625f,0.078125f, +0.648438f,0.078125f, +0.65625f,0.078125f, +0.664063f,0.078125f, +0.671875f,0.078125f, +0.679688f,0.078125f, +0.6875f,0.078125f, +0.695313f,0.078125f, +0.703125f,0.078125f, +0.710938f,0.078125f, +0.71875f,0.078125f, +0.726563f,0.078125f, +0.734375f,0.078125f, +0.742188f,0.078125f, +0.75f,0.078125f, +0.757813f,0.078125f, +0.765625f,0.078125f, +0.773438f,0.078125f, +0.78125f,0.078125f, +0.789063f,0.078125f, +0.796875f,0.078125f, +0.804688f,0.078125f, +0.8125f,0.078125f, +0.820313f,0.078125f, +0.828125f,0.078125f, +0.835938f,0.078125f, +0.84375f,0.078125f, +0.851563f,0.078125f, +0.859375f,0.078125f, +0.867188f,0.078125f, +0.875f,0.078125f, +0.882813f,0.078125f, +0.890625f,0.078125f, +0.898438f,0.078125f, +0.90625f,0.078125f, +0.914063f,0.078125f, +0.921875f,0.078125f, +0.929688f,0.078125f, +0.9375f,0.078125f, +0.945313f,0.078125f, +0.953125f,0.078125f, +0.960938f,0.078125f, +0.96875f,0.078125f, +0.976563f,0.078125f, +0.984375f,0.078125f, +0.992188f,0.078125f, +1.0f,0.078125f, +0.507813f,0.0859375f, +0.515625f,0.0859375f, +0.523438f,0.0859375f, +0.53125f,0.0859375f, +0.539063f,0.0859375f, +0.546875f,0.0859375f, +0.554688f,0.0859375f, +0.5625f,0.0859375f, +0.570313f,0.0859375f, +0.578125f,0.0859375f, +0.585938f,0.0859375f, +0.59375f,0.0859375f, +0.601563f,0.0859375f, +0.609375f,0.0859375f, +0.617188f,0.0859375f, +0.625f,0.0859375f, +0.632813f,0.0859375f, +0.640625f,0.0859375f, +0.648438f,0.0859375f, +0.65625f,0.0859375f, +0.664063f,0.0859375f, +0.671875f,0.0859375f, +0.679688f,0.0859375f, +0.6875f,0.0859375f, +0.695313f,0.0859375f, +0.703125f,0.0859375f, +0.710938f,0.0859375f, +0.71875f,0.0859375f, +0.726563f,0.0859375f, +0.734375f,0.0859375f, +0.742188f,0.0859375f, +0.75f,0.0859375f, +0.757813f,0.0859375f, +0.765625f,0.0859375f, +0.773438f,0.0859375f, +0.78125f,0.0859375f, +0.789063f,0.0859375f, +0.796875f,0.0859375f, +0.804688f,0.0859375f, +0.8125f,0.0859375f, +0.820313f,0.0859375f, +0.828125f,0.0859375f, +0.835938f,0.0859375f, +0.84375f,0.0859375f, +0.851563f,0.0859375f, +0.859375f,0.0859375f, +0.867188f,0.0859375f, +0.875f,0.0859375f, +0.882813f,0.0859375f, +0.890625f,0.0859375f, +0.898438f,0.0859375f, +0.90625f,0.0859375f, +0.914063f,0.0859375f, +0.921875f,0.0859375f, +0.929688f,0.0859375f, +0.9375f,0.0859375f, +0.945313f,0.0859375f, +0.953125f,0.0859375f, +0.960938f,0.0859375f, +0.96875f,0.0859375f, +0.976563f,0.0859375f, +0.984375f,0.0859375f, +0.992188f,0.0859375f, +1.0f,0.0859375f, +0.507813f,0.09375f, +0.515625f,0.09375f, +0.523438f,0.09375f, +0.53125f,0.09375f, +0.539063f,0.09375f, +0.546875f,0.09375f, +0.554688f,0.09375f, +0.5625f,0.09375f, +0.570313f,0.09375f, +0.578125f,0.09375f, +0.585938f,0.09375f, +0.59375f,0.09375f, +0.601563f,0.09375f, +0.609375f,0.09375f, +0.617188f,0.09375f, +0.625f,0.09375f, +0.632813f,0.09375f, +0.640625f,0.09375f, +0.648438f,0.09375f, +0.65625f,0.09375f, +0.664063f,0.09375f, +0.671875f,0.09375f, +0.679688f,0.09375f, +0.6875f,0.09375f, +0.695313f,0.09375f, +0.703125f,0.09375f, +0.710938f,0.09375f, +0.71875f,0.09375f, +0.726563f,0.09375f, +0.734375f,0.09375f, +0.742188f,0.09375f, +0.75f,0.09375f, +0.757813f,0.09375f, +0.765625f,0.09375f, +0.773438f,0.09375f, +0.78125f,0.09375f, +0.789063f,0.09375f, +0.796875f,0.09375f, +0.804688f,0.09375f, +0.8125f,0.09375f, +0.820313f,0.09375f, +0.828125f,0.09375f, +0.835938f,0.09375f, +0.84375f,0.09375f, +0.851563f,0.09375f, +0.859375f,0.09375f, +0.867188f,0.09375f, +0.875f,0.09375f, +0.882813f,0.09375f, +0.890625f,0.09375f, +0.898438f,0.09375f, +0.90625f,0.09375f, +0.914063f,0.09375f, +0.921875f,0.09375f, +0.929688f,0.09375f, +0.9375f,0.09375f, +0.945313f,0.09375f, +0.953125f,0.09375f, +0.960938f,0.09375f, +0.96875f,0.09375f, +0.976563f,0.09375f, +0.984375f,0.09375f, +0.992188f,0.09375f, +1.0f,0.09375f, +0.507813f,0.101563f, +0.515625f,0.101563f, +0.523438f,0.101563f, +0.53125f,0.101563f, +0.539063f,0.101563f, +0.546875f,0.101563f, +0.554688f,0.101563f, +0.5625f,0.101563f, +0.570313f,0.101563f, +0.578125f,0.101563f, +0.585938f,0.101563f, +0.59375f,0.101563f, +0.601563f,0.101563f, +0.609375f,0.101563f, +0.617188f,0.101563f, +0.625f,0.101563f, +0.632813f,0.101563f, +0.640625f,0.101563f, +0.648438f,0.101563f, +0.65625f,0.101563f, +0.664063f,0.101563f, +0.671875f,0.101563f, +0.679688f,0.101563f, +0.6875f,0.101563f, +0.695313f,0.101563f, +0.703125f,0.101563f, +0.710938f,0.101563f, +0.71875f,0.101563f, +0.726563f,0.101563f, +0.734375f,0.101563f, +0.742188f,0.101563f, +0.75f,0.101563f, +0.757813f,0.101563f, +0.765625f,0.101563f, +0.773438f,0.101563f, +0.78125f,0.101563f, +0.789063f,0.101563f, +0.796875f,0.101563f, +0.804688f,0.101563f, +0.8125f,0.101563f, +0.820313f,0.101563f, +0.828125f,0.101563f, +0.835938f,0.101563f, +0.84375f,0.101563f, +0.851563f,0.101563f, +0.859375f,0.101563f, +0.867188f,0.101563f, +0.875f,0.101563f, +0.882813f,0.101563f, +0.890625f,0.101563f, +0.898438f,0.101563f, +0.90625f,0.101563f, +0.914063f,0.101563f, +0.921875f,0.101563f, +0.929688f,0.101563f, +0.9375f,0.101563f, +0.945313f,0.101563f, +0.953125f,0.101563f, +0.960938f,0.101563f, +0.96875f,0.101563f, +0.976563f,0.101563f, +0.984375f,0.101563f, +0.992188f,0.101563f, +1.0f,0.101563f, +0.507813f,0.109375f, +0.515625f,0.109375f, +0.523438f,0.109375f, +0.53125f,0.109375f, +0.539063f,0.109375f, +0.546875f,0.109375f, +0.554688f,0.109375f, +0.5625f,0.109375f, +0.570313f,0.109375f, +0.578125f,0.109375f, +0.585938f,0.109375f, +0.59375f,0.109375f, +0.601563f,0.109375f, +0.609375f,0.109375f, +0.617188f,0.109375f, +0.625f,0.109375f, +0.632813f,0.109375f, +0.640625f,0.109375f, +0.648438f,0.109375f, +0.65625f,0.109375f, +0.664063f,0.109375f, +0.671875f,0.109375f, +0.679688f,0.109375f, +0.6875f,0.109375f, +0.695313f,0.109375f, +0.703125f,0.109375f, +0.710938f,0.109375f, +0.71875f,0.109375f, +0.726563f,0.109375f, +0.734375f,0.109375f, +0.742188f,0.109375f, +0.75f,0.109375f, +0.757813f,0.109375f, +0.765625f,0.109375f, +0.773438f,0.109375f, +0.78125f,0.109375f, +0.789063f,0.109375f, +0.796875f,0.109375f, +0.804688f,0.109375f, +0.8125f,0.109375f, +0.820313f,0.109375f, +0.828125f,0.109375f, +0.835938f,0.109375f, +0.84375f,0.109375f, +0.851563f,0.109375f, +0.859375f,0.109375f, +0.867188f,0.109375f, +0.875f,0.109375f, +0.882813f,0.109375f, +0.890625f,0.109375f, +0.898438f,0.109375f, +0.90625f,0.109375f, +0.914063f,0.109375f, +0.921875f,0.109375f, +0.929688f,0.109375f, +0.9375f,0.109375f, +0.945313f,0.109375f, +0.953125f,0.109375f, +0.960938f,0.109375f, +0.96875f,0.109375f, +0.976563f,0.109375f, +0.984375f,0.109375f, +0.992188f,0.109375f, +1.0f,0.109375f, +0.507813f,0.117188f, +0.515625f,0.117188f, +0.523438f,0.117188f, +0.53125f,0.117188f, +0.539063f,0.117188f, +0.546875f,0.117188f, +0.554688f,0.117188f, +0.5625f,0.117188f, +0.570313f,0.117188f, +0.578125f,0.117188f, +0.585938f,0.117188f, +0.59375f,0.117188f, +0.601563f,0.117188f, +0.609375f,0.117188f, +0.617188f,0.117188f, +0.625f,0.117188f, +0.632813f,0.117188f, +0.640625f,0.117188f, +0.648438f,0.117188f, +0.65625f,0.117188f, +0.664063f,0.117188f, +0.671875f,0.117188f, +0.679688f,0.117188f, +0.6875f,0.117188f, +0.695313f,0.117188f, +0.703125f,0.117188f, +0.710938f,0.117188f, +0.71875f,0.117188f, +0.726563f,0.117188f, +0.734375f,0.117188f, +0.742188f,0.117188f, +0.75f,0.117188f, +0.757813f,0.117188f, +0.765625f,0.117188f, +0.773438f,0.117188f, +0.78125f,0.117188f, +0.789063f,0.117188f, +0.796875f,0.117188f, +0.804688f,0.117188f, +0.8125f,0.117188f, +0.820313f,0.117188f, +0.828125f,0.117188f, +0.835938f,0.117188f, +0.84375f,0.117188f, +0.851563f,0.117188f, +0.859375f,0.117188f, +0.867188f,0.117188f, +0.875f,0.117188f, +0.882813f,0.117188f, +0.890625f,0.117188f, +0.898438f,0.117188f, +0.90625f,0.117188f, +0.914063f,0.117188f, +0.921875f,0.117188f, +0.929688f,0.117188f, +0.9375f,0.117188f, +0.945313f,0.117188f, +0.953125f,0.117188f, +0.960938f,0.117188f, +0.96875f,0.117188f, +0.976563f,0.117188f, +0.984375f,0.117188f, +0.992188f,0.117188f, +1.0f,0.117188f, +0.507813f,0.125f, +0.515625f,0.125f, +0.523438f,0.125f, +0.53125f,0.125f, +0.539063f,0.125f, +0.546875f,0.125f, +0.554688f,0.125f, +0.5625f,0.125f, +0.570313f,0.125f, +0.578125f,0.125f, +0.585938f,0.125f, +0.59375f,0.125f, +0.601563f,0.125f, +0.609375f,0.125f, +0.617188f,0.125f, +0.625f,0.125f, +0.632813f,0.125f, +0.640625f,0.125f, +0.648438f,0.125f, +0.65625f,0.125f, +0.664063f,0.125f, +0.671875f,0.125f, +0.679688f,0.125f, +0.6875f,0.125f, +0.695313f,0.125f, +0.703125f,0.125f, +0.710938f,0.125f, +0.71875f,0.125f, +0.726563f,0.125f, +0.734375f,0.125f, +0.742188f,0.125f, +0.75f,0.125f, +0.757813f,0.125f, +0.765625f,0.125f, +0.773438f,0.125f, +0.78125f,0.125f, +0.789063f,0.125f, +0.796875f,0.125f, +0.804688f,0.125f, +0.8125f,0.125f, +0.820313f,0.125f, +0.828125f,0.125f, +0.835938f,0.125f, +0.84375f,0.125f, +0.851563f,0.125f, +0.859375f,0.125f, +0.867188f,0.125f, +0.875f,0.125f, +0.882813f,0.125f, +0.890625f,0.125f, +0.898438f,0.125f, +0.90625f,0.125f, +0.914063f,0.125f, +0.921875f,0.125f, +0.929688f,0.125f, +0.9375f,0.125f, +0.945313f,0.125f, +0.953125f,0.125f, +0.960938f,0.125f, +0.96875f,0.125f, +0.976563f,0.125f, +0.984375f,0.125f, +0.992188f,0.125f, +1.0f,0.125f, +0.507813f,0.132813f, +0.515625f,0.132813f, +0.523438f,0.132813f, +0.53125f,0.132813f, +0.539063f,0.132813f, +0.546875f,0.132813f, +0.554688f,0.132813f, +0.5625f,0.132813f, +0.570313f,0.132813f, +0.578125f,0.132813f, +0.585938f,0.132813f, +0.59375f,0.132813f, +0.601563f,0.132813f, +0.609375f,0.132813f, +0.617188f,0.132813f, +0.625f,0.132813f, +0.632813f,0.132813f, +0.640625f,0.132813f, +0.648438f,0.132813f, +0.65625f,0.132813f, +0.664063f,0.132813f, +0.671875f,0.132813f, +0.679688f,0.132813f, +0.6875f,0.132813f, +0.695313f,0.132813f, +0.703125f,0.132813f, +0.710938f,0.132813f, +0.71875f,0.132813f, +0.726563f,0.132813f, +0.734375f,0.132813f, +0.742188f,0.132813f, +0.75f,0.132813f, +0.757813f,0.132813f, +0.765625f,0.132813f, +0.773438f,0.132813f, +0.78125f,0.132813f, +0.789063f,0.132813f, +0.796875f,0.132813f, +0.804688f,0.132813f, +0.8125f,0.132813f, +0.820313f,0.132813f, +0.828125f,0.132813f, +0.835938f,0.132813f, +0.84375f,0.132813f, +0.851563f,0.132813f, +0.859375f,0.132813f, +0.867188f,0.132813f, +0.875f,0.132813f, +0.882813f,0.132813f, +0.890625f,0.132813f, +0.898438f,0.132813f, +0.90625f,0.132813f, +0.914063f,0.132813f, +0.921875f,0.132813f, +0.929688f,0.132813f, +0.9375f,0.132813f, +0.945313f,0.132813f, +0.953125f,0.132813f, +0.960938f,0.132813f, +0.96875f,0.132813f, +0.976563f,0.132813f, +0.984375f,0.132813f, +0.992188f,0.132813f, +1.0f,0.132813f, +0.507813f,0.140625f, +0.515625f,0.140625f, +0.523438f,0.140625f, +0.53125f,0.140625f, +0.539063f,0.140625f, +0.546875f,0.140625f, +0.554688f,0.140625f, +0.5625f,0.140625f, +0.570313f,0.140625f, +0.578125f,0.140625f, +0.585938f,0.140625f, +0.59375f,0.140625f, +0.601563f,0.140625f, +0.609375f,0.140625f, +0.617188f,0.140625f, +0.625f,0.140625f, +0.632813f,0.140625f, +0.640625f,0.140625f, +0.648438f,0.140625f, +0.65625f,0.140625f, +0.664063f,0.140625f, +0.671875f,0.140625f, +0.679688f,0.140625f, +0.6875f,0.140625f, +0.695313f,0.140625f, +0.703125f,0.140625f, +0.710938f,0.140625f, +0.71875f,0.140625f, +0.726563f,0.140625f, +0.734375f,0.140625f, +0.742188f,0.140625f, +0.75f,0.140625f, +0.757813f,0.140625f, +0.765625f,0.140625f, +0.773438f,0.140625f, +0.78125f,0.140625f, +0.789063f,0.140625f, +0.796875f,0.140625f, +0.804688f,0.140625f, +0.8125f,0.140625f, +0.820313f,0.140625f, +0.828125f,0.140625f, +0.835938f,0.140625f, +0.84375f,0.140625f, +0.851563f,0.140625f, +0.859375f,0.140625f, +0.867188f,0.140625f, +0.875f,0.140625f, +0.882813f,0.140625f, +0.890625f,0.140625f, +0.898438f,0.140625f, +0.90625f,0.140625f, +0.914063f,0.140625f, +0.921875f,0.140625f, +0.929688f,0.140625f, +0.9375f,0.140625f, +0.945313f,0.140625f, +0.953125f,0.140625f, +0.960938f,0.140625f, +0.96875f,0.140625f, +0.976563f,0.140625f, +0.984375f,0.140625f, +0.992188f,0.140625f, +1.0f,0.140625f, +0.507813f,0.148438f, +0.515625f,0.148438f, +0.523438f,0.148438f, +0.53125f,0.148438f, +0.539063f,0.148438f, +0.546875f,0.148438f, +0.554688f,0.148438f, +0.5625f,0.148438f, +0.570313f,0.148438f, +0.578125f,0.148438f, +0.585938f,0.148438f, +0.59375f,0.148438f, +0.601563f,0.148438f, +0.609375f,0.148438f, +0.617188f,0.148438f, +0.625f,0.148438f, +0.632813f,0.148438f, +0.640625f,0.148438f, +0.648438f,0.148438f, +0.65625f,0.148438f, +0.664063f,0.148438f, +0.671875f,0.148438f, +0.679688f,0.148438f, +0.6875f,0.148438f, +0.695313f,0.148438f, +0.703125f,0.148438f, +0.710938f,0.148438f, +0.71875f,0.148438f, +0.726563f,0.148438f, +0.734375f,0.148438f, +0.742188f,0.148438f, +0.75f,0.148438f, +0.757813f,0.148438f, +0.765625f,0.148438f, +0.773438f,0.148438f, +0.78125f,0.148438f, +0.789063f,0.148438f, +0.796875f,0.148438f, +0.804688f,0.148438f, +0.8125f,0.148438f, +0.820313f,0.148438f, +0.828125f,0.148438f, +0.835938f,0.148438f, +0.84375f,0.148438f, +0.851563f,0.148438f, +0.859375f,0.148438f, +0.867188f,0.148438f, +0.875f,0.148438f, +0.882813f,0.148438f, +0.890625f,0.148438f, +0.898438f,0.148438f, +0.90625f,0.148438f, +0.914063f,0.148438f, +0.921875f,0.148438f, +0.929688f,0.148438f, +0.9375f,0.148438f, +0.945313f,0.148438f, +0.953125f,0.148438f, +0.960938f,0.148438f, +0.96875f,0.148438f, +0.976563f,0.148438f, +0.984375f,0.148438f, +0.992188f,0.148438f, +1.0f,0.148438f, +0.507813f,0.15625f, +0.515625f,0.15625f, +0.523438f,0.15625f, +0.53125f,0.15625f, +0.539063f,0.15625f, +0.546875f,0.15625f, +0.554688f,0.15625f, +0.5625f,0.15625f, +0.570313f,0.15625f, +0.578125f,0.15625f, +0.585938f,0.15625f, +0.59375f,0.15625f, +0.601563f,0.15625f, +0.609375f,0.15625f, +0.617188f,0.15625f, +0.625f,0.15625f, +0.632813f,0.15625f, +0.640625f,0.15625f, +0.648438f,0.15625f, +0.65625f,0.15625f, +0.664063f,0.15625f, +0.671875f,0.15625f, +0.679688f,0.15625f, +0.6875f,0.15625f, +0.695313f,0.15625f, +0.703125f,0.15625f, +0.710938f,0.15625f, +0.71875f,0.15625f, +0.726563f,0.15625f, +0.734375f,0.15625f, +0.742188f,0.15625f, +0.75f,0.15625f, +0.757813f,0.15625f, +0.765625f,0.15625f, +0.773438f,0.15625f, +0.78125f,0.15625f, +0.789063f,0.15625f, +0.796875f,0.15625f, +0.804688f,0.15625f, +0.8125f,0.15625f, +0.820313f,0.15625f, +0.828125f,0.15625f, +0.835938f,0.15625f, +0.84375f,0.15625f, +0.851563f,0.15625f, +0.859375f,0.15625f, +0.867188f,0.15625f, +0.875f,0.15625f, +0.882813f,0.15625f, +0.890625f,0.15625f, +0.898438f,0.15625f, +0.90625f,0.15625f, +0.914063f,0.15625f, +0.921875f,0.15625f, +0.929688f,0.15625f, +0.9375f,0.15625f, +0.945313f,0.15625f, +0.953125f,0.15625f, +0.960938f,0.15625f, +0.96875f,0.15625f, +0.976563f,0.15625f, +0.984375f,0.15625f, +0.992188f,0.15625f, +1.0f,0.15625f, +0.507813f,0.164063f, +0.515625f,0.164063f, +0.523438f,0.164063f, +0.53125f,0.164063f, +0.539063f,0.164063f, +0.546875f,0.164063f, +0.554688f,0.164063f, +0.5625f,0.164063f, +0.570313f,0.164063f, +0.578125f,0.164063f, +0.585938f,0.164063f, +0.59375f,0.164063f, +0.601563f,0.164063f, +0.609375f,0.164063f, +0.617188f,0.164063f, +0.625f,0.164063f, +0.632813f,0.164063f, +0.640625f,0.164063f, +0.648438f,0.164063f, +0.65625f,0.164063f, +0.664063f,0.164063f, +0.671875f,0.164063f, +0.679688f,0.164063f, +0.6875f,0.164063f, +0.695313f,0.164063f, +0.703125f,0.164063f, +0.710938f,0.164063f, +0.71875f,0.164063f, +0.726563f,0.164063f, +0.734375f,0.164063f, +0.742188f,0.164063f, +0.75f,0.164063f, +0.757813f,0.164063f, +0.765625f,0.164063f, +0.773438f,0.164063f, +0.78125f,0.164063f, +0.789063f,0.164063f, +0.796875f,0.164063f, +0.804688f,0.164063f, +0.8125f,0.164063f, +0.820313f,0.164063f, +0.828125f,0.164063f, +0.835938f,0.164063f, +0.84375f,0.164063f, +0.851563f,0.164063f, +0.859375f,0.164063f, +0.867188f,0.164063f, +0.875f,0.164063f, +0.882813f,0.164063f, +0.890625f,0.164063f, +0.898438f,0.164063f, +0.90625f,0.164063f, +0.914063f,0.164063f, +0.921875f,0.164063f, +0.929688f,0.164063f, +0.9375f,0.164063f, +0.945313f,0.164063f, +0.953125f,0.164063f, +0.960938f,0.164063f, +0.96875f,0.164063f, +0.976563f,0.164063f, +0.984375f,0.164063f, +0.992188f,0.164063f, +1.0f,0.164063f, +0.507813f,0.171875f, +0.515625f,0.171875f, +0.523438f,0.171875f, +0.53125f,0.171875f, +0.539063f,0.171875f, +0.546875f,0.171875f, +0.554688f,0.171875f, +0.5625f,0.171875f, +0.570313f,0.171875f, +0.578125f,0.171875f, +0.585938f,0.171875f, +0.59375f,0.171875f, +0.601563f,0.171875f, +0.609375f,0.171875f, +0.617188f,0.171875f, +0.625f,0.171875f, +0.632813f,0.171875f, +0.640625f,0.171875f, +0.648438f,0.171875f, +0.65625f,0.171875f, +0.664063f,0.171875f, +0.671875f,0.171875f, +0.679688f,0.171875f, +0.6875f,0.171875f, +0.695313f,0.171875f, +0.703125f,0.171875f, +0.710938f,0.171875f, +0.71875f,0.171875f, +0.726563f,0.171875f, +0.734375f,0.171875f, +0.742188f,0.171875f, +0.75f,0.171875f, +0.757813f,0.171875f, +0.765625f,0.171875f, +0.773438f,0.171875f, +0.78125f,0.171875f, +0.789063f,0.171875f, +0.796875f,0.171875f, +0.804688f,0.171875f, +0.8125f,0.171875f, +0.820313f,0.171875f, +0.828125f,0.171875f, +0.835938f,0.171875f, +0.84375f,0.171875f, +0.851563f,0.171875f, +0.859375f,0.171875f, +0.867188f,0.171875f, +0.875f,0.171875f, +0.882813f,0.171875f, +0.890625f,0.171875f, +0.898438f,0.171875f, +0.90625f,0.171875f, +0.914063f,0.171875f, +0.921875f,0.171875f, +0.929688f,0.171875f, +0.9375f,0.171875f, +0.945313f,0.171875f, +0.953125f,0.171875f, +0.960938f,0.171875f, +0.96875f,0.171875f, +0.976563f,0.171875f, +0.984375f,0.171875f, +0.992188f,0.171875f, +1.0f,0.171875f, +0.507813f,0.179688f, +0.515625f,0.179688f, +0.523438f,0.179688f, +0.53125f,0.179688f, +0.539063f,0.179688f, +0.546875f,0.179688f, +0.554688f,0.179688f, +0.5625f,0.179688f, +0.570313f,0.179688f, +0.578125f,0.179688f, +0.585938f,0.179688f, +0.59375f,0.179688f, +0.601563f,0.179688f, +0.609375f,0.179688f, +0.617188f,0.179688f, +0.625f,0.179688f, +0.632813f,0.179688f, +0.640625f,0.179688f, +0.648438f,0.179688f, +0.65625f,0.179688f, +0.664063f,0.179688f, +0.671875f,0.179688f, +0.679688f,0.179688f, +0.6875f,0.179688f, +0.695313f,0.179688f, +0.703125f,0.179688f, +0.710938f,0.179688f, +0.71875f,0.179688f, +0.726563f,0.179688f, +0.734375f,0.179688f, +0.742188f,0.179688f, +0.75f,0.179688f, +0.757813f,0.179688f, +0.765625f,0.179688f, +0.773438f,0.179688f, +0.78125f,0.179688f, +0.789063f,0.179688f, +0.796875f,0.179688f, +0.804688f,0.179688f, +0.8125f,0.179688f, +0.820313f,0.179688f, +0.828125f,0.179688f, +0.835938f,0.179688f, +0.84375f,0.179688f, +0.851563f,0.179688f, +0.859375f,0.179688f, +0.867188f,0.179688f, +0.875f,0.179688f, +0.882813f,0.179688f, +0.890625f,0.179688f, +0.898438f,0.179688f, +0.90625f,0.179688f, +0.914063f,0.179688f, +0.921875f,0.179688f, +0.929688f,0.179688f, +0.9375f,0.179688f, +0.945313f,0.179688f, +0.953125f,0.179688f, +0.960938f,0.179688f, +0.96875f,0.179688f, +0.976563f,0.179688f, +0.984375f,0.179688f, +0.992188f,0.179688f, +1.0f,0.179688f, +0.507813f,0.1875f, +0.515625f,0.1875f, +0.523438f,0.1875f, +0.53125f,0.1875f, +0.539063f,0.1875f, +0.546875f,0.1875f, +0.554688f,0.1875f, +0.5625f,0.1875f, +0.570313f,0.1875f, +0.578125f,0.1875f, +0.585938f,0.1875f, +0.59375f,0.1875f, +0.601563f,0.1875f, +0.609375f,0.1875f, +0.617188f,0.1875f, +0.625f,0.1875f, +0.632813f,0.1875f, +0.640625f,0.1875f, +0.648438f,0.1875f, +0.65625f,0.1875f, +0.664063f,0.1875f, +0.671875f,0.1875f, +0.679688f,0.1875f, +0.6875f,0.1875f, +0.695313f,0.1875f, +0.703125f,0.1875f, +0.710938f,0.1875f, +0.71875f,0.1875f, +0.726563f,0.1875f, +0.734375f,0.1875f, +0.742188f,0.1875f, +0.75f,0.1875f, +0.757813f,0.1875f, +0.765625f,0.1875f, +0.773438f,0.1875f, +0.78125f,0.1875f, +0.789063f,0.1875f, +0.796875f,0.1875f, +0.804688f,0.1875f, +0.8125f,0.1875f, +0.820313f,0.1875f, +0.828125f,0.1875f, +0.835938f,0.1875f, +0.84375f,0.1875f, +0.851563f,0.1875f, +0.859375f,0.1875f, +0.867188f,0.1875f, +0.875f,0.1875f, +0.882813f,0.1875f, +0.890625f,0.1875f, +0.898438f,0.1875f, +0.90625f,0.1875f, +0.914063f,0.1875f, +0.921875f,0.1875f, +0.929688f,0.1875f, +0.9375f,0.1875f, +0.945313f,0.1875f, +0.953125f,0.1875f, +0.960938f,0.1875f, +0.96875f,0.1875f, +0.976563f,0.1875f, +0.984375f,0.1875f, +0.992188f,0.1875f, +1.0f,0.1875f, +0.507813f,0.195313f, +0.515625f,0.195313f, +0.523438f,0.195313f, +0.53125f,0.195313f, +0.539063f,0.195313f, +0.546875f,0.195313f, +0.554688f,0.195313f, +0.5625f,0.195313f, +0.570313f,0.195313f, +0.578125f,0.195313f, +0.585938f,0.195313f, +0.59375f,0.195313f, +0.601563f,0.195313f, +0.609375f,0.195313f, +0.617188f,0.195313f, +0.625f,0.195313f, +0.632813f,0.195313f, +0.640625f,0.195313f, +0.648438f,0.195313f, +0.65625f,0.195313f, +0.664063f,0.195313f, +0.671875f,0.195313f, +0.679688f,0.195313f, +0.6875f,0.195313f, +0.695313f,0.195313f, +0.703125f,0.195313f, +0.710938f,0.195313f, +0.71875f,0.195313f, +0.726563f,0.195313f, +0.734375f,0.195313f, +0.742188f,0.195313f, +0.75f,0.195313f, +0.757813f,0.195313f, +0.765625f,0.195313f, +0.773438f,0.195313f, +0.78125f,0.195313f, +0.789063f,0.195313f, +0.796875f,0.195313f, +0.804688f,0.195313f, +0.8125f,0.195313f, +0.820313f,0.195313f, +0.828125f,0.195313f, +0.835938f,0.195313f, +0.84375f,0.195313f, +0.851563f,0.195313f, +0.859375f,0.195313f, +0.867188f,0.195313f, +0.875f,0.195313f, +0.882813f,0.195313f, +0.890625f,0.195313f, +0.898438f,0.195313f, +0.90625f,0.195313f, +0.914063f,0.195313f, +0.921875f,0.195313f, +0.929688f,0.195313f, +0.9375f,0.195313f, +0.945313f,0.195313f, +0.953125f,0.195313f, +0.960938f,0.195313f, +0.96875f,0.195313f, +0.976563f,0.195313f, +0.984375f,0.195313f, +0.992188f,0.195313f, +1.0f,0.195313f, +0.507813f,0.203125f, +0.515625f,0.203125f, +0.523438f,0.203125f, +0.53125f,0.203125f, +0.539063f,0.203125f, +0.546875f,0.203125f, +0.554688f,0.203125f, +0.5625f,0.203125f, +0.570313f,0.203125f, +0.578125f,0.203125f, +0.585938f,0.203125f, +0.59375f,0.203125f, +0.601563f,0.203125f, +0.609375f,0.203125f, +0.617188f,0.203125f, +0.625f,0.203125f, +0.632813f,0.203125f, +0.640625f,0.203125f, +0.648438f,0.203125f, +0.65625f,0.203125f, +0.664063f,0.203125f, +0.671875f,0.203125f, +0.679688f,0.203125f, +0.6875f,0.203125f, +0.695313f,0.203125f, +0.703125f,0.203125f, +0.710938f,0.203125f, +0.71875f,0.203125f, +0.726563f,0.203125f, +0.734375f,0.203125f, +0.742188f,0.203125f, +0.75f,0.203125f, +0.757813f,0.203125f, +0.765625f,0.203125f, +0.773438f,0.203125f, +0.78125f,0.203125f, +0.789063f,0.203125f, +0.796875f,0.203125f, +0.804688f,0.203125f, +0.8125f,0.203125f, +0.820313f,0.203125f, +0.828125f,0.203125f, +0.835938f,0.203125f, +0.84375f,0.203125f, +0.851563f,0.203125f, +0.859375f,0.203125f, +0.867188f,0.203125f, +0.875f,0.203125f, +0.882813f,0.203125f, +0.890625f,0.203125f, +0.898438f,0.203125f, +0.90625f,0.203125f, +0.914063f,0.203125f, +0.921875f,0.203125f, +0.929688f,0.203125f, +0.9375f,0.203125f, +0.945313f,0.203125f, +0.953125f,0.203125f, +0.960938f,0.203125f, +0.96875f,0.203125f, +0.976563f,0.203125f, +0.984375f,0.203125f, +0.992188f,0.203125f, +1.0f,0.203125f, +0.507813f,0.210938f, +0.515625f,0.210938f, +0.523438f,0.210938f, +0.53125f,0.210938f, +0.539063f,0.210938f, +0.546875f,0.210938f, +0.554688f,0.210938f, +0.5625f,0.210938f, +0.570313f,0.210938f, +0.578125f,0.210938f, +0.585938f,0.210938f, +0.59375f,0.210938f, +0.601563f,0.210938f, +0.609375f,0.210938f, +0.617188f,0.210938f, +0.625f,0.210938f, +0.632813f,0.210938f, +0.640625f,0.210938f, +0.648438f,0.210938f, +0.65625f,0.210938f, +0.664063f,0.210938f, +0.671875f,0.210938f, +0.679688f,0.210938f, +0.6875f,0.210938f, +0.695313f,0.210938f, +0.703125f,0.210938f, +0.710938f,0.210938f, +0.71875f,0.210938f, +0.726563f,0.210938f, +0.734375f,0.210938f, +0.742188f,0.210938f, +0.75f,0.210938f, +0.757813f,0.210938f, +0.765625f,0.210938f, +0.773438f,0.210938f, +0.78125f,0.210938f, +0.789063f,0.210938f, +0.796875f,0.210938f, +0.804688f,0.210938f, +0.8125f,0.210938f, +0.820313f,0.210938f, +0.828125f,0.210938f, +0.835938f,0.210938f, +0.84375f,0.210938f, +0.851563f,0.210938f, +0.859375f,0.210938f, +0.867188f,0.210938f, +0.875f,0.210938f, +0.882813f,0.210938f, +0.890625f,0.210938f, +0.898438f,0.210938f, +0.90625f,0.210938f, +0.914063f,0.210938f, +0.921875f,0.210938f, +0.929688f,0.210938f, +0.9375f,0.210938f, +0.945313f,0.210938f, +0.953125f,0.210938f, +0.960938f,0.210938f, +0.96875f,0.210938f, +0.976563f,0.210938f, +0.984375f,0.210938f, +0.992188f,0.210938f, +1.0f,0.210938f, +0.507813f,0.21875f, +0.515625f,0.21875f, +0.523438f,0.21875f, +0.53125f,0.21875f, +0.539063f,0.21875f, +0.546875f,0.21875f, +0.554688f,0.21875f, +0.5625f,0.21875f, +0.570313f,0.21875f, +0.578125f,0.21875f, +0.585938f,0.21875f, +0.59375f,0.21875f, +0.601563f,0.21875f, +0.609375f,0.21875f, +0.617188f,0.21875f, +0.625f,0.21875f, +0.632813f,0.21875f, +0.640625f,0.21875f, +0.648438f,0.21875f, +0.65625f,0.21875f, +0.664063f,0.21875f, +0.671875f,0.21875f, +0.679688f,0.21875f, +0.6875f,0.21875f, +0.695313f,0.21875f, +0.703125f,0.21875f, +0.710938f,0.21875f, +0.71875f,0.21875f, +0.726563f,0.21875f, +0.734375f,0.21875f, +0.742188f,0.21875f, +0.75f,0.21875f, +0.757813f,0.21875f, +0.765625f,0.21875f, +0.773438f,0.21875f, +0.78125f,0.21875f, +0.789063f,0.21875f, +0.796875f,0.21875f, +0.804688f,0.21875f, +0.8125f,0.21875f, +0.820313f,0.21875f, +0.828125f,0.21875f, +0.835938f,0.21875f, +0.84375f,0.21875f, +0.851563f,0.21875f, +0.859375f,0.21875f, +0.867188f,0.21875f, +0.875f,0.21875f, +0.882813f,0.21875f, +0.890625f,0.21875f, +0.898438f,0.21875f, +0.90625f,0.21875f, +0.914063f,0.21875f, +0.921875f,0.21875f, +0.929688f,0.21875f, +0.9375f,0.21875f, +0.945313f,0.21875f, +0.953125f,0.21875f, +0.960938f,0.21875f, +0.96875f,0.21875f, +0.976563f,0.21875f, +0.984375f,0.21875f, +0.992188f,0.21875f, +1.0f,0.21875f, +0.507813f,0.226563f, +0.515625f,0.226563f, +0.523438f,0.226563f, +0.53125f,0.226563f, +0.539063f,0.226563f, +0.546875f,0.226563f, +0.554688f,0.226563f, +0.5625f,0.226563f, +0.570313f,0.226563f, +0.578125f,0.226563f, +0.585938f,0.226563f, +0.59375f,0.226563f, +0.601563f,0.226563f, +0.609375f,0.226563f, +0.617188f,0.226563f, +0.625f,0.226563f, +0.632813f,0.226563f, +0.640625f,0.226563f, +0.648438f,0.226563f, +0.65625f,0.226563f, +0.664063f,0.226563f, +0.671875f,0.226563f, +0.679688f,0.226563f, +0.6875f,0.226563f, +0.695313f,0.226563f, +0.703125f,0.226563f, +0.710938f,0.226563f, +0.71875f,0.226563f, +0.726563f,0.226563f, +0.734375f,0.226563f, +0.742188f,0.226563f, +0.75f,0.226563f, +0.757813f,0.226563f, +0.765625f,0.226563f, +0.773438f,0.226563f, +0.78125f,0.226563f, +0.789063f,0.226563f, +0.796875f,0.226563f, +0.804688f,0.226563f, +0.8125f,0.226563f, +0.820313f,0.226563f, +0.828125f,0.226563f, +0.835938f,0.226563f, +0.84375f,0.226563f, +0.851563f,0.226563f, +0.859375f,0.226563f, +0.867188f,0.226563f, +0.875f,0.226563f, +0.882813f,0.226563f, +0.890625f,0.226563f, +0.898438f,0.226563f, +0.90625f,0.226563f, +0.914063f,0.226563f, +0.921875f,0.226563f, +0.929688f,0.226563f, +0.9375f,0.226563f, +0.945313f,0.226563f, +0.953125f,0.226563f, +0.960938f,0.226563f, +0.96875f,0.226563f, +0.976563f,0.226563f, +0.984375f,0.226563f, +0.992188f,0.226563f, +1.0f,0.226563f, +0.507813f,0.234375f, +0.515625f,0.234375f, +0.523438f,0.234375f, +0.53125f,0.234375f, +0.539063f,0.234375f, +0.546875f,0.234375f, +0.554688f,0.234375f, +0.5625f,0.234375f, +0.570313f,0.234375f, +0.578125f,0.234375f, +0.585938f,0.234375f, +0.59375f,0.234375f, +0.601563f,0.234375f, +0.609375f,0.234375f, +0.617188f,0.234375f, +0.625f,0.234375f, +0.632813f,0.234375f, +0.640625f,0.234375f, +0.648438f,0.234375f, +0.65625f,0.234375f, +0.664063f,0.234375f, +0.671875f,0.234375f, +0.679688f,0.234375f, +0.6875f,0.234375f, +0.695313f,0.234375f, +0.703125f,0.234375f, +0.710938f,0.234375f, +0.71875f,0.234375f, +0.726563f,0.234375f, +0.734375f,0.234375f, +0.742188f,0.234375f, +0.75f,0.234375f, +0.757813f,0.234375f, +0.765625f,0.234375f, +0.773438f,0.234375f, +0.78125f,0.234375f, +0.789063f,0.234375f, +0.796875f,0.234375f, +0.804688f,0.234375f, +0.8125f,0.234375f, +0.820313f,0.234375f, +0.828125f,0.234375f, +0.835938f,0.234375f, +0.84375f,0.234375f, +0.851563f,0.234375f, +0.859375f,0.234375f, +0.867188f,0.234375f, +0.875f,0.234375f, +0.882813f,0.234375f, +0.890625f,0.234375f, +0.898438f,0.234375f, +0.90625f,0.234375f, +0.914063f,0.234375f, +0.921875f,0.234375f, +0.929688f,0.234375f, +0.9375f,0.234375f, +0.945313f,0.234375f, +0.953125f,0.234375f, +0.960938f,0.234375f, +0.96875f,0.234375f, +0.976563f,0.234375f, +0.984375f,0.234375f, +0.992188f,0.234375f, +1.0f,0.234375f, +0.507813f,0.242188f, +0.515625f,0.242188f, +0.523438f,0.242188f, +0.53125f,0.242188f, +0.539063f,0.242188f, +0.546875f,0.242188f, +0.554688f,0.242188f, +0.5625f,0.242188f, +0.570313f,0.242188f, +0.578125f,0.242188f, +0.585938f,0.242188f, +0.59375f,0.242188f, +0.601563f,0.242188f, +0.609375f,0.242188f, +0.617188f,0.242188f, +0.625f,0.242188f, +0.632813f,0.242188f, +0.640625f,0.242188f, +0.648438f,0.242188f, +0.65625f,0.242188f, +0.664063f,0.242188f, +0.671875f,0.242188f, +0.679688f,0.242188f, +0.6875f,0.242188f, +0.695313f,0.242188f, +0.703125f,0.242188f, +0.710938f,0.242188f, +0.71875f,0.242188f, +0.726563f,0.242188f, +0.734375f,0.242188f, +0.742188f,0.242188f, +0.75f,0.242188f, +0.757813f,0.242188f, +0.765625f,0.242188f, +0.773438f,0.242188f, +0.78125f,0.242188f, +0.789063f,0.242188f, +0.796875f,0.242188f, +0.804688f,0.242188f, +0.8125f,0.242188f, +0.820313f,0.242188f, +0.828125f,0.242188f, +0.835938f,0.242188f, +0.84375f,0.242188f, +0.851563f,0.242188f, +0.859375f,0.242188f, +0.867188f,0.242188f, +0.875f,0.242188f, +0.882813f,0.242188f, +0.890625f,0.242188f, +0.898438f,0.242188f, +0.90625f,0.242188f, +0.914063f,0.242188f, +0.921875f,0.242188f, +0.929688f,0.242188f, +0.9375f,0.242188f, +0.945313f,0.242188f, +0.953125f,0.242188f, +0.960938f,0.242188f, +0.96875f,0.242188f, +0.976563f,0.242188f, +0.984375f,0.242188f, +0.992188f,0.242188f, +1.0f,0.242188f, +}; + +unsigned short Landscape01Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +}; + diff --git a/Demos/Benchmarks/main.cpp b/Demos/Benchmarks/main.cpp index 412f08b20..3683e3bea 100644 --- a/Demos/Benchmarks/main.cpp +++ b/Demos/Benchmarks/main.cpp @@ -1,88 +1,88 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 "BenchmarkDemo.h" -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btHashMap.h" -#include - -#ifdef USE_GRAPHICAL_BENCHMARK - #include "GlutStuff.h" - #include "GLDebugDrawer.h" - GLDebugDrawer gDebugDrawer; -#define benchmarkDemo benchmarkDemo2 -#endif //USE_GRAPHICAL_BENCHMARK - - -#define NUM_DEMOS 7 -#define NUM_TESTS 650 - -extern bool gDisableDeactivation; - -int main(int argc,char** argv) -{ - gDisableDeactivation = true; - - BenchmarkDemo1 benchmarkDemo1; - BenchmarkDemo2 benchmarkDemo2; - BenchmarkDemo3 benchmarkDemo3; - BenchmarkDemo4 benchmarkDemo4; - BenchmarkDemo5 benchmarkDemo5; - BenchmarkDemo6 benchmarkDemo6; - BenchmarkDemo7 benchmarkDemo7; - - BenchmarkDemo* demoArray[NUM_DEMOS] = {&benchmarkDemo1,&benchmarkDemo2,&benchmarkDemo3,&benchmarkDemo4,&benchmarkDemo5,&benchmarkDemo6,&benchmarkDemo7}; - const char* demoNames[NUM_DEMOS] = {"3000 fall", "1000 stack", "136 ragdolls","1000 convex", "prim-trimesh", "convex-trimesh","raytests"}; - float totalTime[NUM_DEMOS] = {0.f,0.f,0.f,0.f,0.f,0.f,0.f}; - -#ifdef USE_GRAPHICAL_BENCHMARK - benchmarkDemo.initPhysics(); - benchmarkDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - benchmarkDemo.setDebugMode(benchmarkDemo.getDebugMode() | btIDebugDraw::DBG_NoDeactivation); - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&benchmarkDemo); - -#else //USE_GRAPHICAL_BENCHMARK - int d; - - for (d=0;dinitPhysics(); - - - for (int i=0;iclientMoveAndDisplay(); - float frameTime = CProfileManager::Get_Time_Since_Reset(); - if ((i % 25)==0) - { - printf("BenchmarkDemo: %s, Frame %d, Duration (ms): %f\n",demoNames[d],i,frameTime); - } - totalTime[d] += frameTime; - if (i==NUM_TESTS-1) - CProfileManager::dumpAll(); - - - } - } - - for (d=0;d + +#ifdef USE_GRAPHICAL_BENCHMARK + #include "GlutStuff.h" + #include "GLDebugDrawer.h" + GLDebugDrawer gDebugDrawer; +#define benchmarkDemo benchmarkDemo2 +#endif //USE_GRAPHICAL_BENCHMARK + + +#define NUM_DEMOS 7 +#define NUM_TESTS 650 + +extern bool gDisableDeactivation; + +int main(int argc,char** argv) +{ + gDisableDeactivation = true; + + BenchmarkDemo1 benchmarkDemo1; + BenchmarkDemo2 benchmarkDemo2; + BenchmarkDemo3 benchmarkDemo3; + BenchmarkDemo4 benchmarkDemo4; + BenchmarkDemo5 benchmarkDemo5; + BenchmarkDemo6 benchmarkDemo6; + BenchmarkDemo7 benchmarkDemo7; + + BenchmarkDemo* demoArray[NUM_DEMOS] = {&benchmarkDemo1,&benchmarkDemo2,&benchmarkDemo3,&benchmarkDemo4,&benchmarkDemo5,&benchmarkDemo6,&benchmarkDemo7}; + const char* demoNames[NUM_DEMOS] = {"3000 fall", "1000 stack", "136 ragdolls","1000 convex", "prim-trimesh", "convex-trimesh","raytests"}; + float totalTime[NUM_DEMOS] = {0.f,0.f,0.f,0.f,0.f,0.f,0.f}; + +#ifdef USE_GRAPHICAL_BENCHMARK + benchmarkDemo.initPhysics(); + benchmarkDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + benchmarkDemo.setDebugMode(benchmarkDemo.getDebugMode() | btIDebugDraw::DBG_NoDeactivation); + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&benchmarkDemo); + +#else //USE_GRAPHICAL_BENCHMARK + int d; + + for (d=0;dinitPhysics(); + + + for (int i=0;iclientMoveAndDisplay(); + float frameTime = CProfileManager::Get_Time_Since_Reset(); + if ((i % 25)==0) + { + printf("BenchmarkDemo: %s, Frame %d, Duration (ms): %f\n",demoNames[d],i,frameTime); + } + totalTime[d] += frameTime; + if (i==NUM_TESTS-1) + CProfileManager::dumpAll(); + + + } + } + + for (d=0;d //printf debugging - - -void Box2dDemo::clientMoveAndDisplay() -{ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - ///step the simulation - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(ms / 1000000.f); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - - renderme(); - - if (m_dialogDynamicsWorld) - m_dialogDynamicsWorld->draw(ms / 1000000.f); - - glFlush(); - - swapBuffers(); - -} - - - -void Box2dDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing to detect problems - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - if (m_dialogDynamicsWorld) - m_dialogDynamicsWorld->draw(0.f); - - glFlush(); - swapBuffers(); -} - - - -void Box2dDemo::reshape(int w, int h) -{ - if (m_dialogDynamicsWorld) - m_dialogDynamicsWorld->setScreenSize(w,h); - PlatformDemoApplication::reshape(w,h); -} - -void Box2dDemo::initPhysics() -{ - - m_dialogDynamicsWorld = new GL_DialogDynamicsWorld(); - - //m_dialogDynamicsWorld->createDialog(100,110,200,50); - //m_dialogDynamicsWorld->createDialog(100,00,100,100); - //m_dialogDynamicsWorld->createDialog(0,0,100,100); - GL_DialogWindow* settings = m_dialogDynamicsWorld->createDialog(50,0,200,120,"Settings"); - GL_ToggleControl* toggle = m_dialogDynamicsWorld->createToggle(settings,"Toggle 1"); - toggle = m_dialogDynamicsWorld->createToggle(settings,"Toggle 2"); - toggle ->m_active = true; - toggle = m_dialogDynamicsWorld->createToggle(settings,"Toggle 3"); - GL_SliderControl* slider = m_dialogDynamicsWorld->createSlider(settings,"Slider"); - - GL_DialogWindow* dialog = m_dialogDynamicsWorld->createDialog(0,200,420,300,"Help"); - GL_TextControl* txt = new GL_TextControl; - dialog->addControl(txt); - txt->m_textLines.push_back("Mouse to move"); - txt->m_textLines.push_back("Test 2"); - txt->m_textLines.push_back("mouse to interact"); - txt->m_textLines.push_back("ALT + mouse to move camera"); - txt->m_textLines.push_back("space to reset"); - txt->m_textLines.push_back("cursor keys and z,x to navigate"); - txt->m_textLines.push_back("i to toggle simulation, s single step"); - txt->m_textLines.push_back("q to quit"); - txt->m_textLines.push_back(". to shoot box"); - txt->m_textLines.push_back("d to toggle deactivation"); - txt->m_textLines.push_back("g to toggle mesh animation (ConcaveDemo)"); - txt->m_textLines.push_back("h to toggle help text"); - txt->m_textLines.push_back("o to toggle orthogonal/perspective view"); - //txt->m_textLines.push_back("+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); - - - - setTexturing(true); - setShadows(true); - - setCameraDistance(btScalar(SCALING*50.)); - m_cameraTargetPosition.setValue(0,0,0);//0, ARRAY_SIZE_Y, 0); - - ///collision configuration contains default setup for memory, collision setup - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - //m_collisionConfiguration->setConvexConvexMultipointIterations(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - btVoronoiSimplexSolver* simplex = new btVoronoiSimplexSolver(); - btMinkowskiPenetrationDepthSolver* pdSolver = new btMinkowskiPenetrationDepthSolver(); - - - btConvex2dConvex2dAlgorithm::CreateFunc* convexAlgo2d = new btConvex2dConvex2dAlgorithm::CreateFunc(simplex,pdSolver); - - m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); - m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); - m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,convexAlgo2d); - m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,new btBox2dBox2dCollisionAlgorithm::CreateFunc()); - - m_broadphase = new btDbvtBroadphase(); - //m_broadphase = new btSimpleBroadphase(); - - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; - m_solver = sol; - - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - //m_dynamicsWorld->getSolverInfo().m_erp = 1.f; - //m_dynamicsWorld->getSolverInfo().m_numIterations = 4; - - - - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - - ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(150.),btScalar(50.),btScalar(150.))); -// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); - - m_collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-43,0)); - - //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: - { - btScalar mass(0.); - - //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) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - m_dynamicsWorld->addRigidBody(body); - } - - - { - //create a few dynamic rigidbodies - // Re-using the same collision is better for memory usage and performance - - btScalar u= btScalar(1*SCALING-0.04); - btVector3 points[3] = {btVector3(0,u,0),btVector3(-u,-u,0),btVector3(u,-u,0)}; - btConvexShape* colShape= new btConvex2dShape(new btBoxShape(btVector3(btScalar(SCALING*1),btScalar(SCALING*1),btScalar(0.04)))); - //btCollisionShape* colShape = new btBox2dShape(btVector3(SCALING*1,SCALING*1,0.04)); - - btConvexShape* colShape2= new btConvex2dShape(new btConvexHullShape(&points[0].getX(),3)); - btConvexShape* colShape3= new btConvex2dShape(new btCylinderShapeZ(btVector3(btScalar(SCALING*1),btScalar(SCALING*1),btScalar(0.04)))); - - - - - - //btUniformScalingShape* colShape = new btUniformScalingShape(convexColShape,1.f); - colShape->setMargin(btScalar(0.03)); - //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - m_collisionShapes.push_back(colShape); - m_collisionShapes.push_back(colShape2); - - - /// 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; - - btVector3 x(-ARRAY_SIZE_X, 8.0f,-20.f); - btVector3 y; - btVector3 deltaX(SCALING*1, SCALING*2,0.f); - btVector3 deltaY(SCALING*2, 0.0f,0.f); - - for (int i = 0; i < ARRAY_SIZE_X; ++i) - { - y = x; - - for (int j = i; j < ARRAY_SIZE_Y; ++j) - { - startTransform.setOrigin(y-btVector3(-10,0,0)); - - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(0,0,0); - switch (j%3) - { -#if 1 - case 0: - rbInfo = btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,colShape,localInertia); - break; - case 1: - rbInfo = btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,colShape3,localInertia); - break; -#endif - default: - rbInfo = btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,colShape2,localInertia); - } - btRigidBody* body = new btRigidBody(rbInfo); - //body->setContactProcessingThreshold(colShape->getContactBreakingThreshold()); - body->setActivationState(ISLAND_SLEEPING); - body->setLinearFactor(btVector3(1,1,0)); - body->setAngularFactor(btVector3(0,0,1)); - - m_dynamicsWorld->addRigidBody(body); - body->setActivationState(ISLAND_SLEEPING); - - - // y += -0.8*deltaY; - y += deltaY; - } - - x += deltaX; - } - - } - - - clientResetScene(); -} - - -void Box2dDemo::exitPhysics() -{ - delete m_dialogDynamicsWorld; - m_dialogDynamicsWorld = 0; - - //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;jmouseFunc(button,state,x,y)) - { - DemoApplication::mouseFunc(button,state,x,y); - } -} - -void Box2dDemo::mouseMotionFunc(int x,int y) -{ - m_dialogDynamicsWorld->mouseMotionFunc(x,y); - DemoApplication::mouseMotionFunc(x,y); -} - +/* +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 "BulletCollision/CollisionShapes/btBox2dShape.h" +#include "BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h" +#include "GL_DialogDynamicsWorld.h" +#include "GL_DialogWindow.h" + + +#include "BulletCollision/CollisionShapes/btBox2dShape.h" +#include "BulletCollision/CollisionShapes/btConvex2dShape.h" +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" + +///create 125 (5x5x5) dynamic object +#define ARRAY_SIZE_X 5 +#define ARRAY_SIZE_Y 5 +#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) + +///scaling of the objects (0.1 = 20 centimeter boxes ) +#define SCALING 1 +#define START_POS_X -5 +#define START_POS_Y -5 +#define START_POS_Z -3 + +#include "Box2dDemo.h" +#include "GlutStuff.h" +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging + + +void Box2dDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + if (m_dialogDynamicsWorld) + m_dialogDynamicsWorld->draw(ms / 1000000.f); + + glFlush(); + + swapBuffers(); + +} + + + +void Box2dDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + if (m_dialogDynamicsWorld) + m_dialogDynamicsWorld->draw(0.f); + + glFlush(); + swapBuffers(); +} + + + +void Box2dDemo::reshape(int w, int h) +{ + if (m_dialogDynamicsWorld) + m_dialogDynamicsWorld->setScreenSize(w,h); + PlatformDemoApplication::reshape(w,h); +} + +void Box2dDemo::initPhysics() +{ + + m_dialogDynamicsWorld = new GL_DialogDynamicsWorld(); + + //m_dialogDynamicsWorld->createDialog(100,110,200,50); + //m_dialogDynamicsWorld->createDialog(100,00,100,100); + //m_dialogDynamicsWorld->createDialog(0,0,100,100); + GL_DialogWindow* settings = m_dialogDynamicsWorld->createDialog(50,0,200,120,"Settings"); + GL_ToggleControl* toggle = m_dialogDynamicsWorld->createToggle(settings,"Toggle 1"); + toggle = m_dialogDynamicsWorld->createToggle(settings,"Toggle 2"); + toggle ->m_active = true; + toggle = m_dialogDynamicsWorld->createToggle(settings,"Toggle 3"); + GL_SliderControl* slider = m_dialogDynamicsWorld->createSlider(settings,"Slider"); + + GL_DialogWindow* dialog = m_dialogDynamicsWorld->createDialog(0,200,420,300,"Help"); + GL_TextControl* txt = new GL_TextControl; + dialog->addControl(txt); + txt->m_textLines.push_back("Mouse to move"); + txt->m_textLines.push_back("Test 2"); + txt->m_textLines.push_back("mouse to interact"); + txt->m_textLines.push_back("ALT + mouse to move camera"); + txt->m_textLines.push_back("space to reset"); + txt->m_textLines.push_back("cursor keys and z,x to navigate"); + txt->m_textLines.push_back("i to toggle simulation, s single step"); + txt->m_textLines.push_back("q to quit"); + txt->m_textLines.push_back(". to shoot box"); + txt->m_textLines.push_back("d to toggle deactivation"); + txt->m_textLines.push_back("g to toggle mesh animation (ConcaveDemo)"); + txt->m_textLines.push_back("h to toggle help text"); + txt->m_textLines.push_back("o to toggle orthogonal/perspective view"); + //txt->m_textLines.push_back("+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); + + + + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(SCALING*50.)); + m_cameraTargetPosition.setValue(0,0,0);//0, ARRAY_SIZE_Y, 0); + + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + //m_collisionConfiguration->setConvexConvexMultipointIterations(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVoronoiSimplexSolver* simplex = new btVoronoiSimplexSolver(); + btMinkowskiPenetrationDepthSolver* pdSolver = new btMinkowskiPenetrationDepthSolver(); + + + btConvex2dConvex2dAlgorithm::CreateFunc* convexAlgo2d = new btConvex2dConvex2dAlgorithm::CreateFunc(simplex,pdSolver); + + m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); + m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); + m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,convexAlgo2d); + m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,new btBox2dBox2dCollisionAlgorithm::CreateFunc()); + + m_broadphase = new btDbvtBroadphase(); + //m_broadphase = new btSimpleBroadphase(); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + m_solver = sol; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + //m_dynamicsWorld->getSolverInfo().m_erp = 1.f; + //m_dynamicsWorld->getSolverInfo().m_numIterations = 4; + + + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(150.),btScalar(50.),btScalar(150.))); +// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-43,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //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) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btScalar u= btScalar(1*SCALING-0.04); + btVector3 points[3] = {btVector3(0,u,0),btVector3(-u,-u,0),btVector3(u,-u,0)}; + btConvexShape* colShape= new btConvex2dShape(new btBoxShape(btVector3(btScalar(SCALING*1),btScalar(SCALING*1),btScalar(0.04)))); + //btCollisionShape* colShape = new btBox2dShape(btVector3(SCALING*1,SCALING*1,0.04)); + + btConvexShape* colShape2= new btConvex2dShape(new btConvexHullShape(&points[0].getX(),3)); + btConvexShape* colShape3= new btConvex2dShape(new btCylinderShapeZ(btVector3(btScalar(SCALING*1),btScalar(SCALING*1),btScalar(0.04)))); + + + + + + //btUniformScalingShape* colShape = new btUniformScalingShape(convexColShape,1.f); + colShape->setMargin(btScalar(0.03)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + m_collisionShapes.push_back(colShape); + m_collisionShapes.push_back(colShape2); + + + /// 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; + + btVector3 x(-ARRAY_SIZE_X, 8.0f,-20.f); + btVector3 y; + btVector3 deltaX(SCALING*1, SCALING*2,0.f); + btVector3 deltaY(SCALING*2, 0.0f,0.f); + + for (int i = 0; i < ARRAY_SIZE_X; ++i) + { + y = x; + + for (int j = i; j < ARRAY_SIZE_Y; ++j) + { + startTransform.setOrigin(y-btVector3(-10,0,0)); + + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(0,0,0); + switch (j%3) + { +#if 1 + case 0: + rbInfo = btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,colShape,localInertia); + break; + case 1: + rbInfo = btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,colShape3,localInertia); + break; +#endif + default: + rbInfo = btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,colShape2,localInertia); + } + btRigidBody* body = new btRigidBody(rbInfo); + //body->setContactProcessingThreshold(colShape->getContactBreakingThreshold()); + body->setActivationState(ISLAND_SLEEPING); + body->setLinearFactor(btVector3(1,1,0)); + body->setAngularFactor(btVector3(0,0,1)); + + m_dynamicsWorld->addRigidBody(body); + body->setActivationState(ISLAND_SLEEPING); + + + // y += -0.8*deltaY; + y += deltaY; + } + + x += deltaX; + } + + } + + + clientResetScene(); +} + + +void Box2dDemo::exitPhysics() +{ + delete m_dialogDynamicsWorld; + m_dialogDynamicsWorld = 0; + + //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;jmouseFunc(button,state,x,y)) + { + DemoApplication::mouseFunc(button,state,x,y); + } +} + +void Box2dDemo::mouseMotionFunc(int x,int y) +{ + m_dialogDynamicsWorld->mouseMotionFunc(x,y); + DemoApplication::mouseMotionFunc(x,y); +} + diff --git a/Demos/Box2dDemo/Box2dDemo.h b/Demos/Box2dDemo/Box2dDemo.h index ce69ec0c0..02d4cc69b 100644 --- a/Demos/Box2dDemo/Box2dDemo.h +++ b/Demos/Box2dDemo/Box2dDemo.h @@ -1,89 +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. -*/ -#ifndef BOX2D_DEMO_H -#define BOX2D_DEMO_H - -#ifdef _WINDOWS -#include "Win32DemoApplication.h" -#define PlatformDemoApplication Win32DemoApplication -#else -#include "GlutDemoApplication.h" -#define PlatformDemoApplication GlutDemoApplication -#endif - -#include "LinearMath/btAlignedObjectArray.h" - -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; -class GL_DialogDynamicsWorld; - -///Box2dDemo is good starting point for learning the code base and porting. -class Box2dDemo : public PlatformDemoApplication -{ - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - GL_DialogDynamicsWorld* m_dialogDynamicsWorld; - - public: - - Box2dDemo() : m_dialogDynamicsWorld(0) - { - } - virtual ~Box2dDemo() - { - exitPhysics(); - } - - virtual void reshape(int w, int h); - - void initPhysics(); - - void exitPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - Box2dDemo* demo = new Box2dDemo; - demo->myinit(); - demo->initPhysics(); - return demo; - } - - virtual void mouseFunc(int button, int state, int x, int y); - virtual void mouseMotionFunc(int x,int y); - - -}; - -#endif //BOX2D_DEMO_H - +/* +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 BOX2D_DEMO_H +#define BOX2D_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class GL_DialogDynamicsWorld; + +///Box2dDemo is good starting point for learning the code base and porting. +class Box2dDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + GL_DialogDynamicsWorld* m_dialogDynamicsWorld; + + public: + + Box2dDemo() : m_dialogDynamicsWorld(0) + { + } + virtual ~Box2dDemo() + { + exitPhysics(); + } + + virtual void reshape(int w, int h); + + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + Box2dDemo* demo = new Box2dDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + virtual void mouseFunc(int button, int state, int x, int y); + virtual void mouseMotionFunc(int x,int y); + + +}; + +#endif //BOX2D_DEMO_H + diff --git a/Demos/Box2dDemo/Win32Box2dDemo.cpp b/Demos/Box2dDemo/Win32Box2dDemo.cpp index 146cf9a6f..fb439063d 100644 --- a/Demos/Box2dDemo/Win32Box2dDemo.cpp +++ b/Demos/Box2dDemo/Win32Box2dDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "Box2dDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new Box2dDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "Box2dDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new Box2dDemo(); +} + +#endif diff --git a/Demos/Box2dDemo/main.cpp b/Demos/Box2dDemo/main.cpp index e84f21135..1b0651c39 100644 --- a/Demos/Box2dDemo/main.cpp +++ b/Demos/Box2dDemo/main.cpp @@ -1,61 +1,61 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 "Box2dDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btHashMap.h" - -class OurValue - { - int m_uid; - - public: - OurValue(const btVector3& initialPos) - :m_position(initialPos) - { - static int gUid=0; - m_uid=gUid; - gUid++; - } - - btVector3 m_position; - int getUid() const - { - return m_uid; - } - }; - - -int main(int argc,char** argv) -{ - GLDebugDrawer gDebugDrawer; - - Box2dDemo ccdDemo; - ccdDemo.initPhysics(); - ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - - -#ifdef CHECK_MEMORY_LEAKS - ccdDemo.exitPhysics(); -#else - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); -#endif - - //default glut doesn't return from mainloop - return 0; -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 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 "Box2dDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" + +class OurValue + { + int m_uid; + + public: + OurValue(const btVector3& initialPos) + :m_position(initialPos) + { + static int gUid=0; + m_uid=gUid; + gUid++; + } + + btVector3 m_position; + int getUid() const + { + return m_uid; + } + }; + + +int main(int argc,char** argv) +{ + GLDebugDrawer gDebugDrawer; + + Box2dDemo ccdDemo; + ccdDemo.initPhysics(); + ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + +#ifdef CHECK_MEMORY_LEAKS + ccdDemo.exitPhysics(); +#else + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); +#endif + + //default glut doesn't return from mainloop + return 0; +} + diff --git a/Demos/BspDemo/BspConverter.cpp b/Demos/BspDemo/BspConverter.cpp index 483d414d3..8d750c32a 100644 --- a/Demos/BspDemo/BspConverter.cpp +++ b/Demos/BspDemo/BspConverter.cpp @@ -1,207 +1,207 @@ -/* -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 "BspConverter.h" -#include "BspLoader.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btGeometryUtil.h" -#include -#include - - -void BspConverter::convertBsp(BspLoader& bspLoader,float scaling) -{ - { - - float playstartf[3] = {0,0,100}; - - if (bspLoader.findVectorByName(&playstartf[0],"info_player_start")) - { - printf("found playerstart\n"); - } - else - { - if (bspLoader.findVectorByName(&playstartf[0],"info_player_deathmatch")) - { - printf("found deatchmatch start\n"); - } - } - - btVector3 playerStart (playstartf[0],playstartf[1],playstartf[2]); - - - playerStart[2] += 20.f; //start a bit higher - - playerStart *= scaling; - - - - //progressBegin("Loading bsp"); - - for (int i=0;i planeEquations; - - int brushid = bspLoader.m_dleafbrushes[leaf.firstLeafBrush+b]; - - BSPBrush& brush = bspLoader.m_dbrushes[brushid]; - if (brush.shaderNum!=-1) - { - if (bspLoader.m_dshaders[ brush.shaderNum ].contentFlags & BSPCONTENTS_SOLID) - { - brush.shaderNum = -1; - - for (int p=0;p vertices; - btGeometryUtil::getVerticesFromPlaneEquations(planeEquations,vertices); - - bool isEntity = false; - btVector3 entityTarget(0.f,0.f,0.f); - addConvexVerticesCollider(vertices,isEntity,entityTarget); - - } - } - } - } - } - -#define USE_ENTITIES -#ifdef USE_ENTITIES - - - { - int i; - for (i=0;i=0) && (modelnr < bspLoader.m_nummodels)) - { - const BSPModel& model = bspLoader.m_dmodels[modelnr]; - for (int n=0;n planeEquations; - bool isValidBrush = false; - - //convert brush - const BSPBrush& brush = bspLoader.m_dbrushes[model.firstBrush+n]; - { - for (int p=0;p vertices; - btGeometryUtil::getVerticesFromPlaneEquations(planeEquations,vertices); - - bool isEntity=true; - addConvexVerticesCollider(vertices,isEntity,targetLocation); - - } - } - - } - } - } - else - { - printf("unsupported trigger_push model, md3 ?\n"); - } - } - - } - } - } - } - -#endif //USE_ENTITIES - - - - //progressEnd(); - } - - } - - - - - - +/* +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 "BspConverter.h" +#include "BspLoader.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btGeometryUtil.h" +#include +#include + + +void BspConverter::convertBsp(BspLoader& bspLoader,float scaling) +{ + { + + float playstartf[3] = {0,0,100}; + + if (bspLoader.findVectorByName(&playstartf[0],"info_player_start")) + { + printf("found playerstart\n"); + } + else + { + if (bspLoader.findVectorByName(&playstartf[0],"info_player_deathmatch")) + { + printf("found deatchmatch start\n"); + } + } + + btVector3 playerStart (playstartf[0],playstartf[1],playstartf[2]); + + + playerStart[2] += 20.f; //start a bit higher + + playerStart *= scaling; + + + + //progressBegin("Loading bsp"); + + for (int i=0;i planeEquations; + + int brushid = bspLoader.m_dleafbrushes[leaf.firstLeafBrush+b]; + + BSPBrush& brush = bspLoader.m_dbrushes[brushid]; + if (brush.shaderNum!=-1) + { + if (bspLoader.m_dshaders[ brush.shaderNum ].contentFlags & BSPCONTENTS_SOLID) + { + brush.shaderNum = -1; + + for (int p=0;p vertices; + btGeometryUtil::getVerticesFromPlaneEquations(planeEquations,vertices); + + bool isEntity = false; + btVector3 entityTarget(0.f,0.f,0.f); + addConvexVerticesCollider(vertices,isEntity,entityTarget); + + } + } + } + } + } + +#define USE_ENTITIES +#ifdef USE_ENTITIES + + + { + int i; + for (i=0;i=0) && (modelnr < bspLoader.m_nummodels)) + { + const BSPModel& model = bspLoader.m_dmodels[modelnr]; + for (int n=0;n planeEquations; + bool isValidBrush = false; + + //convert brush + const BSPBrush& brush = bspLoader.m_dbrushes[model.firstBrush+n]; + { + for (int p=0;p vertices; + btGeometryUtil::getVerticesFromPlaneEquations(planeEquations,vertices); + + bool isEntity=true; + addConvexVerticesCollider(vertices,isEntity,targetLocation); + + } + } + + } + } + } + else + { + printf("unsupported trigger_push model, md3 ?\n"); + } + } + + } + } + } + } + +#endif //USE_ENTITIES + + + + //progressEnd(); + } + + } + + + + + + diff --git a/Demos/BspDemo/BspConverter.h b/Demos/BspDemo/BspConverter.h index 775309330..aca44db27 100644 --- a/Demos/BspDemo/BspConverter.h +++ b/Demos/BspDemo/BspConverter.h @@ -1,39 +1,39 @@ -/* -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 BSP_CONVERTER_H -#define BSP_CONVERTER_H - -class BspLoader; -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" - -///BspConverter turns a loaded bsp level into convex parts (vertices) -class BspConverter -{ - public: - - void convertBsp(BspLoader& bspLoader,float scaling); - virtual ~BspConverter() - { - } - - ///this callback is called for each brush that succesfully converted into vertices - virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) = 0; - -}; - -#endif //BSP_CONVERTER_H - +/* +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 BSP_CONVERTER_H +#define BSP_CONVERTER_H + +class BspLoader; +#include "LinearMath/btVector3.h" +#include "LinearMath/btAlignedObjectArray.h" + +///BspConverter turns a loaded bsp level into convex parts (vertices) +class BspConverter +{ + public: + + void convertBsp(BspLoader& bspLoader,float scaling); + virtual ~BspConverter() + { + } + + ///this callback is called for each brush that succesfully converted into vertices + virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) = 0; + +}; + +#endif //BSP_CONVERTER_H + diff --git a/Demos/BspDemo/BspDemo.cpp b/Demos/BspDemo/BspDemo.cpp index a8fdb7494..8301eac3e 100644 --- a/Demos/BspDemo/BspDemo.cpp +++ b/Demos/BspDemo/BspDemo.cpp @@ -1,321 +1,321 @@ -/* -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 "LinearMath/btQuickprof.h" -#include "LinearMath/btIDebugDraw.h" - -#include "GLDebugDrawer.h" - - -#define QUAKE_BSP_IMPORTING 1 - -#ifdef QUAKE_BSP_IMPORTING -#include "BspLoader.h" -#include "BspConverter.h" -#endif //QUAKE_BSP_IMPORTING - - -#include //printf debugging - - -#include "BspDemo.h" -#include "GL_ShapeDrawer.h" -#include "GlutStuff.h" - - - - -#define CUBE_HALF_EXTENTS 1 -#define EXTRA_HEIGHT -20.f - - - -///BspToBulletConverter extends the BspConverter to convert to Bullet datastructures -class BspToBulletConverter : public BspConverter -{ - BspDemo* m_demoApp; - -public: - - BspToBulletConverter(BspDemo* demoApp) - :m_demoApp(demoApp) - { - } - - virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) - { - ///perhaps we can do something special with entities (isEntity) - ///like adding a collision Triggering (as example) - - if (vertices.size() > 0) - { - float mass = 0.f; - btTransform startTransform; - //can use a shift - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,0,-10.f)); - //this create an internal copy of the vertices - - btCollisionShape* shape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); - m_demoApp->m_collisionShapes.push_back(shape); - - //btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape); - m_demoApp->localCreateRigidBody(mass, startTransform,shape); - } - } -}; - - - - - -//////////////////////////////////// - - - - - - - -BspDemo::~BspDemo() -{ - //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;jsetGravity(-m_cameraUp * 10); - - -#ifdef QUAKE_BSP_IMPORTING - - void* memoryBuffer = 0; - - FILE* file = fopen(bspfilename,"r"); - if (!file) - { - //try again other path, - //sight... visual studio leaves the current working directory in the projectfiles folder - //instead of executable folder. who wants this default behaviour?!? - bspfilename = "../../BspDemo.bsp"; - file = fopen(bspfilename,"r"); - } - if (!file) - { - - //try again other path, cmake needs 4 levels deep back... - bspfilename = "../../../../BspDemo.bsp"; - file = fopen(bspfilename,"r"); - } - if (!file) - { - //try again other path, - //sight... visual studio leaves the current working directory in the projectfiles folder - //instead of executable folder. who wants this default behaviour?!? - bspfilename = "BspDemo.bsp"; - file = fopen(bspfilename,"r"); - } - - if (file) - { - BspLoader bspLoader; - int size=0; - if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ - printf("Error: cannot get filesize from %s\n", bspfilename); - } else - { - //how to detect file size? - memoryBuffer = malloc(size+1); - fread(memoryBuffer,1,size,file); - bspLoader.loadBSPFile( memoryBuffer); - - BspToBulletConverter bsp2bullet(this); - float bspScaling = 0.1f; - bsp2bullet.convertBsp(bspLoader,bspScaling); - - } - fclose(file); - } - -#endif - - - - - clientResetScene(); - -} - - -void BspDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - glutSwapBuffers(); - -} - - - -void BspDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - - - - - - -//some code that de-mangles the windows filename passed in as argument -char cleaned_filename[512]; -char* getLastFileName() -{ - return cleaned_filename; -} -char* makeExeToBspFilename(const char* lpCmdLine) -{ - - - // We might get a windows-style path on the command line, this can mess up the DOM which expects - // all paths to be URI's. This block of code does some conversion to try and make the input - // compliant without breaking the ability to accept a properly formatted URI. Right now this only - // displays the first filename - const char *in = lpCmdLine; - char* out = cleaned_filename; - *out = '\0'; - // If the first character is a ", skip it (filenames with spaces in them are quoted) - if(*in == '\"') - { - in++; - } - int i; - for(i =0; i<512; i++) - { - //if we get '.' we stop as well, unless it's the first character. Then we add .bsp as extension - // If we hit a null or a quote, stop copying. This will get just the first filename. - if(i && (in[0] == '.') && (in[1] == 'e') && (in[2] == 'x') && (in[3] == 'e')) - break; - - // If we hit a null or a quote, stop copying. This will get just the first filename. - if(*in == '\0' || *in == '\"') - break; - // Copy while swapping backslashes for forward ones - if(*in == '\\') - { - *out = '/'; - } - else - { - *out = *in; - } - in++; - out++; - } - *(out++) = '.'; - *(out++) = 'b'; - *(out++) = 's'; - *(out++) = 'p'; - *(out++) = 0; - - return cleaned_filename; -} +/* +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 "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" + + +#define QUAKE_BSP_IMPORTING 1 + +#ifdef QUAKE_BSP_IMPORTING +#include "BspLoader.h" +#include "BspConverter.h" +#endif //QUAKE_BSP_IMPORTING + + +#include //printf debugging + + +#include "BspDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + + + + +#define CUBE_HALF_EXTENTS 1 +#define EXTRA_HEIGHT -20.f + + + +///BspToBulletConverter extends the BspConverter to convert to Bullet datastructures +class BspToBulletConverter : public BspConverter +{ + BspDemo* m_demoApp; + +public: + + BspToBulletConverter(BspDemo* demoApp) + :m_demoApp(demoApp) + { + } + + virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) + { + ///perhaps we can do something special with entities (isEntity) + ///like adding a collision Triggering (as example) + + if (vertices.size() > 0) + { + float mass = 0.f; + btTransform startTransform; + //can use a shift + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,0,-10.f)); + //this create an internal copy of the vertices + + btCollisionShape* shape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); + m_demoApp->m_collisionShapes.push_back(shape); + + //btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape); + m_demoApp->localCreateRigidBody(mass, startTransform,shape); + } + } +}; + + + + + +//////////////////////////////////// + + + + + + + +BspDemo::~BspDemo() +{ + //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;jsetGravity(-m_cameraUp * 10); + + +#ifdef QUAKE_BSP_IMPORTING + + void* memoryBuffer = 0; + + FILE* file = fopen(bspfilename,"r"); + if (!file) + { + //try again other path, + //sight... visual studio leaves the current working directory in the projectfiles folder + //instead of executable folder. who wants this default behaviour?!? + bspfilename = "../../BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + if (!file) + { + + //try again other path, cmake needs 4 levels deep back... + bspfilename = "../../../../BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + if (!file) + { + //try again other path, + //sight... visual studio leaves the current working directory in the projectfiles folder + //instead of executable folder. who wants this default behaviour?!? + bspfilename = "BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + + if (file) + { + BspLoader bspLoader; + int size=0; + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", bspfilename); + } else + { + //how to detect file size? + memoryBuffer = malloc(size+1); + fread(memoryBuffer,1,size,file); + bspLoader.loadBSPFile( memoryBuffer); + + BspToBulletConverter bsp2bullet(this); + float bspScaling = 0.1f; + bsp2bullet.convertBsp(bspLoader,bspScaling); + + } + fclose(file); + } + +#endif + + + + + clientResetScene(); + +} + + +void BspDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + +void BspDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + + + + +//some code that de-mangles the windows filename passed in as argument +char cleaned_filename[512]; +char* getLastFileName() +{ + return cleaned_filename; +} +char* makeExeToBspFilename(const char* lpCmdLine) +{ + + + // We might get a windows-style path on the command line, this can mess up the DOM which expects + // all paths to be URI's. This block of code does some conversion to try and make the input + // compliant without breaking the ability to accept a properly formatted URI. Right now this only + // displays the first filename + const char *in = lpCmdLine; + char* out = cleaned_filename; + *out = '\0'; + // If the first character is a ", skip it (filenames with spaces in them are quoted) + if(*in == '\"') + { + in++; + } + int i; + for(i =0; i<512; i++) + { + //if we get '.' we stop as well, unless it's the first character. Then we add .bsp as extension + // If we hit a null or a quote, stop copying. This will get just the first filename. + if(i && (in[0] == '.') && (in[1] == 'e') && (in[2] == 'x') && (in[3] == 'e')) + break; + + // If we hit a null or a quote, stop copying. This will get just the first filename. + if(*in == '\0' || *in == '\"') + break; + // Copy while swapping backslashes for forward ones + if(*in == '\\') + { + *out = '/'; + } + else + { + *out = *in; + } + in++; + out++; + } + *(out++) = '.'; + *(out++) = 'b'; + *(out++) = 's'; + *(out++) = 'p'; + *(out++) = 0; + + return cleaned_filename; +} diff --git a/Demos/BspDemo/BspDemo.h b/Demos/BspDemo/BspDemo.h index 4111c05b1..d2f5d7a30 100644 --- a/Demos/BspDemo/BspDemo.h +++ b/Demos/BspDemo/BspDemo.h @@ -1,71 +1,71 @@ -/* -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 BSP_DEMO_H -#define BSP_DEMO_H - -#include "GlutDemoApplication.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; - - -///BspDemo shows the convex collision detection, by converting a Quake BSP file into convex objects and allowing interaction with boxes. -class BspDemo : public GlutDemoApplication -{ - public: - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - - - - virtual ~BspDemo(); - - virtual void initPhysics(); - - void initPhysics(const char* bspfilename); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - BspDemo* demo = new BspDemo; - demo->myinit(); - demo->initPhysics("BspDemo.bsp"); - return demo; - } - -}; - -#endif //BSP_DEMO_H - - +/* +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 BSP_DEMO_H +#define BSP_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + + +///BspDemo shows the convex collision detection, by converting a Quake BSP file into convex objects and allowing interaction with boxes. +class BspDemo : public GlutDemoApplication +{ + public: + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + + + virtual ~BspDemo(); + + virtual void initPhysics(); + + void initPhysics(const char* bspfilename); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + BspDemo* demo = new BspDemo; + demo->myinit(); + demo->initPhysics("BspDemo.bsp"); + return demo; + } + +}; + +#endif //BSP_DEMO_H + + diff --git a/Demos/BspDemo/BspLoader.cpp b/Demos/BspDemo/BspLoader.cpp index c5f274913..0572463ae 100644 --- a/Demos/BspDemo/BspLoader.cpp +++ b/Demos/BspDemo/BspLoader.cpp @@ -1,730 +1,730 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code is free software; you can redistribute it -and/or modify it under the terms of the GNU bteral Public License as -published by the Free Software Foundation; either version 2 of the License, -or (at your option) any later version. - -Quake III Arena source code is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU bteral Public License for more details. - -You should have received a copy of the GNU bteral Public License -along with Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ - - -#include "BspLoader.h" -#include -#include - -typedef struct -{ - char filename[1024]; - char *buffer,*script_p,*end_p; - int line; -} BSPScript; - -#define MAX_INCLUDES 8 -BSPScript scriptstack[MAX_INCLUDES]; -BSPScript *script; -int scriptline; - -char token[BSPMAXTOKEN]; -bool endofscript; -bool tokenready; // only true if UnGetToken was just called - -// -//loadBSPFile -// - -int extrasize = 100; - -BspLoader::BspLoader() - :m_num_entities(0) -{ - m_Endianness = getMachineEndianness(); - if (m_Endianness == BSP_BIG_ENDIAN) - { - printf("Machine is BIG_ENDIAN\n"); - } else - { - printf("Machine is Little Endian\n"); - } -} - - -bool BspLoader::loadBSPFile( void* memoryBuffer) { - - BSPHeader *header = (BSPHeader*) memoryBuffer; - - // load the file header - if (header) - { - // swap the header - swapBlock( (int *)header, sizeof(*header) ); - - int length = (header->lumps[BSPLUMP_SHADERS].filelen) / sizeof(BSPShader); - m_dshaders.resize(length+extrasize); - m_numShaders = copyLump( header, BSPLUMP_SHADERS, &m_dshaders[0], sizeof(BSPShader) ); - - length = (header->lumps[LUMP_MODELS].filelen) / sizeof(BSPModel); - m_dmodels.resize(length+extrasize); - m_nummodels = copyLump( header, LUMP_MODELS, &m_dmodels[0], sizeof(BSPModel) ); - - length = (header->lumps[BSPLUMP_PLANES].filelen) / sizeof(BSPPlane); - m_dplanes.resize(length+extrasize); - m_numplanes = copyLump( header, BSPLUMP_PLANES, &m_dplanes[0], sizeof(BSPPlane) ); - - length = (header->lumps[BSPLUMP_LEAFS].filelen) / sizeof(BSPLeaf); - m_dleafs.resize(length+extrasize); - m_numleafs = copyLump( header, BSPLUMP_LEAFS, &m_dleafs[0], sizeof(BSPLeaf) ); - - length = (header->lumps[BSPLUMP_NODES].filelen) / sizeof(BSPNode); - m_dnodes.resize(length+extrasize); - m_numnodes = copyLump( header, BSPLUMP_NODES, &m_dnodes[0], sizeof(BSPNode) ); - - length = (header->lumps[BSPLUMP_LEAFSURFACES].filelen) / sizeof(m_dleafsurfaces[0]); - m_dleafsurfaces.resize(length+extrasize); - m_numleafsurfaces = copyLump( header, BSPLUMP_LEAFSURFACES, &m_dleafsurfaces[0], sizeof(m_dleafsurfaces[0]) ); - - length = (header->lumps[BSPLUMP_LEAFBRUSHES].filelen) / sizeof(m_dleafbrushes[0]) ; - m_dleafbrushes.resize(length+extrasize); - m_numleafbrushes = copyLump( header, BSPLUMP_LEAFBRUSHES, &m_dleafbrushes[0], sizeof(m_dleafbrushes[0]) ); - - length = (header->lumps[LUMP_BRUSHES].filelen) / sizeof(BSPBrush); - m_dbrushes.resize(length+extrasize); - m_numbrushes = copyLump( header, LUMP_BRUSHES, &m_dbrushes[0], sizeof(BSPBrush) ); - - - length = (header->lumps[LUMP_BRUSHSIDES].filelen) / sizeof(BSPBrushSide); - m_dbrushsides.resize(length+extrasize); - m_numbrushsides = copyLump( header, LUMP_BRUSHSIDES, &m_dbrushsides[0], sizeof(BSPBrushSide) ); - - - length = (header->lumps[LUMP_SURFACES].filelen) / sizeof(BSPSurface); - m_drawSurfaces.resize(length+extrasize); - m_numDrawSurfaces = copyLump( header, LUMP_SURFACES, &m_drawSurfaces[0], sizeof(BSPSurface) ); - - - length = (header->lumps[LUMP_DRAWINDEXES].filelen) / sizeof(m_drawIndexes[0]); - m_drawIndexes.resize(length+extrasize); - m_numDrawIndexes = copyLump( header, LUMP_DRAWINDEXES, &m_drawIndexes[0], sizeof(m_drawIndexes[0]) ); - - length = (header->lumps[LUMP_VISIBILITY].filelen) / 1; - m_visBytes.resize(length+extrasize); - m_numVisBytes = copyLump( header, LUMP_VISIBILITY, &m_visBytes[0], 1 ); - - length = (header->lumps[LUMP_LIGHTMAPS].filelen) / 1; - m_lightBytes.resize(length+extrasize); - m_numLightBytes = copyLump( header, LUMP_LIGHTMAPS, &m_lightBytes[0], 1 ); - - length = (header->lumps[BSPLUMP_ENTITIES].filelen) / 1; - m_dentdata.resize(length+extrasize); - m_entdatasize = copyLump( header, BSPLUMP_ENTITIES, &m_dentdata[0], 1); - - length = (header->lumps[LUMP_LIGHTGRID].filelen) / 1; - m_gridData.resize(length+extrasize); - m_numGridPoints = copyLump( header, LUMP_LIGHTGRID, &m_gridData[0], 8 ); - - // swap everything - swapBSPFile(); - - return true; - - } - return false; -} - - - -const char* BspLoader::getValueForKey( const BSPEntity* ent, const char* key ) const { - - const BSPKeyValuePair* ep; - - for (ep=ent->epairs ; ep ; ep=ep->next) { - if (!strcmp(ep->key, key) ) { - return ep->value; - } - } - return ""; -} - -float BspLoader::getFloatForKey( const BSPEntity *ent, const char *key ) { - const char *k; - - k = getValueForKey( ent, key ); - return float(atof(k)); -} - -bool BspLoader::getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ) { - - const char *k; - k = getValueForKey (ent, key); - if (strcmp(k, "")) - { - sscanf (k, "%f %f %f", &vec[0], &vec[1], &vec[2]); - return true; - } - return false; -} - - - - -/* -============== -parseFromMemory -============== -*/ -void BspLoader::parseFromMemory (char *buffer, int size) -{ - script = scriptstack; - script++; - if (script == &scriptstack[MAX_INCLUDES]) - { - //printf("script file exceeded MAX_INCLUDES"); - } - strcpy (script->filename, "memory buffer" ); - - script->buffer = buffer; - script->line = 1; - script->script_p = script->buffer; - script->end_p = script->buffer + size; - - endofscript = false; - tokenready = false; -} - - -bool BspLoader::isEndOfScript (bool crossline) -{ - if (!crossline) - //printf("Line %i is incomplete\n",scriptline); - - if (!strcmp (script->filename, "memory buffer")) - { - endofscript = true; - return false; - } - - //free (script->buffer); - if (script == scriptstack+1) - { - endofscript = true; - return false; - } - script--; - scriptline = script->line; - //printf ("returning to %s\n", script->filename); - return getToken (crossline); -} - -/* - -============== -getToken -============== -*/ -bool BspLoader::getToken (bool crossline) -{ - char *token_p; - - if (tokenready) // is a token allready waiting? - { - tokenready = false; - return true; - } - - if (script->script_p >= script->end_p) - return isEndOfScript (crossline); - -// -// skip space -// -skipspace: - while (*script->script_p <= 32) - { - if (script->script_p >= script->end_p) - return isEndOfScript (crossline); - if (*script->script_p++ == '\n') - { - if (!crossline) - { - //printf("Line %i is incomplete\n",scriptline); - } - scriptline = script->line++; - } - } - - if (script->script_p >= script->end_p) - return isEndOfScript (crossline); - - // ; # // comments - if (*script->script_p == ';' || *script->script_p == '#' - || ( script->script_p[0] == '/' && script->script_p[1] == '/') ) - { - if (!crossline) - { - //printf("Line %i is incomplete\n",scriptline); - } - while (*script->script_p++ != '\n') - if (script->script_p >= script->end_p) - return isEndOfScript (crossline); - scriptline = script->line++; - goto skipspace; - } - - // /* */ comments - if (script->script_p[0] == '/' && script->script_p[1] == '*') - { - if (!crossline) - { - //printf("Line %i is incomplete\n",scriptline); - } - script->script_p+=2; - while (script->script_p[0] != '*' && script->script_p[1] != '/') - { - if ( *script->script_p == '\n' ) { - scriptline = script->line++; - } - script->script_p++; - if (script->script_p >= script->end_p) - return isEndOfScript (crossline); - } - script->script_p += 2; - goto skipspace; - } - -// -// copy token -// - token_p = token; - - if (*script->script_p == '"') - { - // quoted token - script->script_p++; - while (*script->script_p != '"') - { - *token_p++ = *script->script_p++; - if (script->script_p == script->end_p) - break; - if (token_p == &token[BSPMAXTOKEN]) - { - //printf ("Token too large on line %i\n",scriptline); - } - } - script->script_p++; - } - else // regular token - while ( *script->script_p > 32 && *script->script_p != ';') - { - *token_p++ = *script->script_p++; - if (script->script_p == script->end_p) - break; - if (token_p == &token[BSPMAXTOKEN]) - { - //printf ("Token too large on line %i\n",scriptline); - } - } - - *token_p = 0; - - if (!strcmp (token, "$include")) - { - //getToken (false); - //AddScriptToStack (token); - return false;//getToken (crossline); - } - - return true; -} - -char *BspLoader::copystring(const char *s) -{ - char *b; - b = (char*) malloc( strlen(s)+1); - strcpy (b, s); - return b; -} - -void BspLoader::stripTrailing( char *e ) { - char *s; - - s = e + strlen(e)-1; - while (s >= e && *s <= 32) - { - *s = 0; - s--; - } -} -/* -================= -parseEpair -================= -*/ -BSPKeyValuePair *BspLoader::parseEpair( void ) { - BSPKeyValuePair *e; - - e = (struct BSPPair*) malloc( sizeof(BSPKeyValuePair)); - memset( e, 0, sizeof(BSPKeyValuePair) ); - - if ( strlen(token) >= BSPMAX_KEY-1 ) { - //printf ("ParseEpar: token too long"); - } - e->key = copystring( token ); - getToken( false ); - if ( strlen(token) >= BSPMAX_VALUE-1 ) { - - //printf ("ParseEpar: token too long"); - } - e->value = copystring( token ); - - // strip trailing spaces that sometimes get accidentally - // added in the editor - stripTrailing( e->key ); - stripTrailing( e->value ); - - return e; -} - - -/* -================ -parseEntity -================ -*/ -bool BspLoader::parseEntity( void ) { - BSPKeyValuePair *e; - BSPEntity *mapent; - - if ( !getToken (true) ) { - return false; - } - - if ( strcmp (token, "{") ) { - - //printf ("parseEntity: { not found"); - } - - BSPEntity bla; - bla.brushes = 0; - bla.epairs = 0; - bla.firstDrawSurf = 0; - bla.origin[0] = 0.f; - bla.origin[1] = 0.f; - bla.origin[2] = 0.f; - bla.patches = 0; - - m_entities.push_back(bla); - mapent = &m_entities[m_entities.size()-1]; - m_num_entities++; - - do { - if ( !getToken (true) ) { - //printf("parseEntity: EOF without closing brace"); - } - if ( !strcmp (token, "}") ) { - break; - } - e = (struct BSPPair*)parseEpair (); - e->next = mapent->epairs; - mapent->epairs = e; - } while (1); - - return true; -} - -/* -================ -parseEntities - -Parses the dentdata string into entities -================ -*/ -void BspLoader::parseEntities( void ) { - m_num_entities = 0; - m_entities.clear(); - - parseFromMemory( &m_dentdata[0], m_entdatasize ); - - while ( parseEntity () ) { - } -} - - - -int BspLoader::getMachineEndianness() -{ - long int i = 1; - const char *p = (const char *) &i; - if (p[0] == 1) // Lowest address contains the least significant byte - return BSP_LITTLE_ENDIAN; - else - return BSP_BIG_ENDIAN; -} - -short BspLoader::isLittleShort (short l) -{ - if (machineEndianness() == BSP_BIG_ENDIAN) - { - unsigned char b1,b2; - - b1 = l&255; - b2 = (l>>8)&255; - - return (b1<<8) + b2; - } - //little endian - return l; -} - -short BspLoader::isBigShort (short l) -{ - if (machineEndianness() == BSP_BIG_ENDIAN) - { - return l; - } - - unsigned char b1,b2; - - b1 = l&255; - b2 = (l>>8)&255; - - return (b1<<8) + b2; - - - -} - - -int BspLoader::isLittleLong (int l) -{ - if (machineEndianness() == BSP_BIG_ENDIAN) - { - unsigned char b1,b2,b3,b4; - - b1 = l&255; - b2 = (l>>8)&255; - b3 = (l>>16)&255; - b4 = (l>>24)&255; - - return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; - } - - //little endian - return l; - -} - -int BspLoader::isBigLong (int l) -{ - if (machineEndianness() == BSP_BIG_ENDIAN) - { - return l; - } - - - unsigned char b1,b2,b3,b4; - - b1 = l&255; - b2 = (l>>8)&255; - b3 = (l>>16)&255; - b4 = (l>>24)&255; - - return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; - -} - - -float BspLoader::isLittleFloat (float l) -{ - if (machineEndianness() == BSP_BIG_ENDIAN) - { - union {unsigned char b[4]; float f;} in, out; - - in.f = l; - out.b[0] = in.b[3]; - out.b[1] = in.b[2]; - out.b[2] = in.b[1]; - out.b[3] = in.b[0]; - - return out.f; - } - - //little endian - return l; -} - -float BspLoader::isBigFloat (float l) -{ - if (machineEndianness() == BSP_BIG_ENDIAN) - { - return l; - } - //little endian - union {unsigned char b[4]; float f;} in, out; - - in.f = l; - out.b[0] = in.b[3]; - out.b[1] = in.b[2]; - out.b[2] = in.b[1]; - out.b[3] = in.b[0]; - - return out.f; -} - - - - - - -// -// swapBlock -// If all values are 32 bits, this can be used to swap everything -// - -void BspLoader::swapBlock( int *block, int sizeOfBlock ) { - int i; - - sizeOfBlock >>= 2; - for ( i = 0 ; i < sizeOfBlock ; i++ ) { - block[i] = isLittleLong( block[i] ); - } -} - -// -// copyLump -// - -int BspLoader::copyLump( BSPHeader *header, int lump, void *dest, int size ) { - int length, ofs; - - length = header->lumps[lump].filelen; - ofs = header->lumps[lump].fileofs; - - //if ( length % size ) { - // printf ("loadBSPFile: odd lump size"); - //} - - memcpy( dest, (unsigned char *)header + ofs, length ); - - return length / size; -} - - - - -// -// swapBSPFile -// - -void BspLoader::swapBSPFile( void ) { - int i; - - // models - swapBlock( (int *) &m_dmodels[0], m_nummodels * sizeof( m_dmodels[0] ) ); - - // shaders (don't swap the name) - for ( i = 0 ; i < m_numShaders ; i++ ) { - m_dshaders[i].contentFlags = isLittleLong( m_dshaders[i].contentFlags ); - m_dshaders[i].surfaceFlags = isLittleLong( m_dshaders[i].surfaceFlags ); - } - - // planes - swapBlock( (int *)&m_dplanes[0], m_numplanes * sizeof( m_dplanes[0] ) ); - - // nodes - swapBlock( (int *)&m_dnodes[0], m_numnodes * sizeof( m_dnodes[0] ) ); - - // leafs - swapBlock( (int *)&m_dleafs[0], m_numleafs * sizeof( m_dleafs[0] ) ); - - // leaffaces - swapBlock( (int *)&m_dleafsurfaces[0], m_numleafsurfaces * sizeof( m_dleafsurfaces[0] ) ); - - // leafbrushes - swapBlock( (int *)&m_dleafbrushes[0], m_numleafbrushes * sizeof( m_dleafbrushes[0] ) ); - - // brushes - swapBlock( (int *)&m_dbrushes[0], m_numbrushes * sizeof( m_dbrushes[0] ) ); - - // brushsides - swapBlock( (int *)&m_dbrushsides[0], m_numbrushsides * sizeof( m_dbrushsides[0] ) ); - - // vis - ((int *)&m_visBytes)[0] = isLittleLong( ((int *)&m_visBytes)[0] ); - ((int *)&m_visBytes)[1] = isLittleLong( ((int *)&m_visBytes)[1] ); - - - // drawindexes - swapBlock( (int *)&m_drawIndexes[0], m_numDrawIndexes * sizeof( m_drawIndexes[0] ) ); - - // drawsurfs - swapBlock( (int *)&m_drawSurfaces[0], m_numDrawSurfaces * sizeof( m_drawSurfaces[0] ) ); - -} - - - - - -bool BspLoader::findVectorByName(float* outvec,const char* name) -{ - const char *cl; - BSPVector3 origin; - - bool found = false; - - parseEntities(); - - for ( int i = 1; i < m_num_entities; i++ ) { - cl = getValueForKey (&m_entities[i], "classname"); - if ( !strcmp( cl, "info_player_start" ) ) { - getVectorForKey( &m_entities[i], "origin", origin ); - found = true; - break; - } - if ( !strcmp( cl, "info_player_deathmatch" ) ) { - getVectorForKey( &m_entities[i], "origin", origin ); - found = true; - break; - } - } - - if (found) - { - outvec[0] = origin[0]; - outvec[1] = origin[1]; - outvec[2] = origin[2]; - } - return found; -} - - - -const BSPEntity * BspLoader::getEntityByValue( const char* name, const char* value) -{ - const BSPEntity* entity = NULL; - - for ( int i = 1; i < m_num_entities; i++ ) { - - const BSPEntity& ent = m_entities[i]; - - const char* cl = getValueForKey (&m_entities[i], name); - if ( !strcmp( cl, value ) ) { - entity = &ent; - break; - } - } - return entity; -} - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU bteral Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU bteral Public License for more details. + +You should have received a copy of the GNU bteral Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + +#include "BspLoader.h" +#include +#include + +typedef struct +{ + char filename[1024]; + char *buffer,*script_p,*end_p; + int line; +} BSPScript; + +#define MAX_INCLUDES 8 +BSPScript scriptstack[MAX_INCLUDES]; +BSPScript *script; +int scriptline; + +char token[BSPMAXTOKEN]; +bool endofscript; +bool tokenready; // only true if UnGetToken was just called + +// +//loadBSPFile +// + +int extrasize = 100; + +BspLoader::BspLoader() + :m_num_entities(0) +{ + m_Endianness = getMachineEndianness(); + if (m_Endianness == BSP_BIG_ENDIAN) + { + printf("Machine is BIG_ENDIAN\n"); + } else + { + printf("Machine is Little Endian\n"); + } +} + + +bool BspLoader::loadBSPFile( void* memoryBuffer) { + + BSPHeader *header = (BSPHeader*) memoryBuffer; + + // load the file header + if (header) + { + // swap the header + swapBlock( (int *)header, sizeof(*header) ); + + int length = (header->lumps[BSPLUMP_SHADERS].filelen) / sizeof(BSPShader); + m_dshaders.resize(length+extrasize); + m_numShaders = copyLump( header, BSPLUMP_SHADERS, &m_dshaders[0], sizeof(BSPShader) ); + + length = (header->lumps[LUMP_MODELS].filelen) / sizeof(BSPModel); + m_dmodels.resize(length+extrasize); + m_nummodels = copyLump( header, LUMP_MODELS, &m_dmodels[0], sizeof(BSPModel) ); + + length = (header->lumps[BSPLUMP_PLANES].filelen) / sizeof(BSPPlane); + m_dplanes.resize(length+extrasize); + m_numplanes = copyLump( header, BSPLUMP_PLANES, &m_dplanes[0], sizeof(BSPPlane) ); + + length = (header->lumps[BSPLUMP_LEAFS].filelen) / sizeof(BSPLeaf); + m_dleafs.resize(length+extrasize); + m_numleafs = copyLump( header, BSPLUMP_LEAFS, &m_dleafs[0], sizeof(BSPLeaf) ); + + length = (header->lumps[BSPLUMP_NODES].filelen) / sizeof(BSPNode); + m_dnodes.resize(length+extrasize); + m_numnodes = copyLump( header, BSPLUMP_NODES, &m_dnodes[0], sizeof(BSPNode) ); + + length = (header->lumps[BSPLUMP_LEAFSURFACES].filelen) / sizeof(m_dleafsurfaces[0]); + m_dleafsurfaces.resize(length+extrasize); + m_numleafsurfaces = copyLump( header, BSPLUMP_LEAFSURFACES, &m_dleafsurfaces[0], sizeof(m_dleafsurfaces[0]) ); + + length = (header->lumps[BSPLUMP_LEAFBRUSHES].filelen) / sizeof(m_dleafbrushes[0]) ; + m_dleafbrushes.resize(length+extrasize); + m_numleafbrushes = copyLump( header, BSPLUMP_LEAFBRUSHES, &m_dleafbrushes[0], sizeof(m_dleafbrushes[0]) ); + + length = (header->lumps[LUMP_BRUSHES].filelen) / sizeof(BSPBrush); + m_dbrushes.resize(length+extrasize); + m_numbrushes = copyLump( header, LUMP_BRUSHES, &m_dbrushes[0], sizeof(BSPBrush) ); + + + length = (header->lumps[LUMP_BRUSHSIDES].filelen) / sizeof(BSPBrushSide); + m_dbrushsides.resize(length+extrasize); + m_numbrushsides = copyLump( header, LUMP_BRUSHSIDES, &m_dbrushsides[0], sizeof(BSPBrushSide) ); + + + length = (header->lumps[LUMP_SURFACES].filelen) / sizeof(BSPSurface); + m_drawSurfaces.resize(length+extrasize); + m_numDrawSurfaces = copyLump( header, LUMP_SURFACES, &m_drawSurfaces[0], sizeof(BSPSurface) ); + + + length = (header->lumps[LUMP_DRAWINDEXES].filelen) / sizeof(m_drawIndexes[0]); + m_drawIndexes.resize(length+extrasize); + m_numDrawIndexes = copyLump( header, LUMP_DRAWINDEXES, &m_drawIndexes[0], sizeof(m_drawIndexes[0]) ); + + length = (header->lumps[LUMP_VISIBILITY].filelen) / 1; + m_visBytes.resize(length+extrasize); + m_numVisBytes = copyLump( header, LUMP_VISIBILITY, &m_visBytes[0], 1 ); + + length = (header->lumps[LUMP_LIGHTMAPS].filelen) / 1; + m_lightBytes.resize(length+extrasize); + m_numLightBytes = copyLump( header, LUMP_LIGHTMAPS, &m_lightBytes[0], 1 ); + + length = (header->lumps[BSPLUMP_ENTITIES].filelen) / 1; + m_dentdata.resize(length+extrasize); + m_entdatasize = copyLump( header, BSPLUMP_ENTITIES, &m_dentdata[0], 1); + + length = (header->lumps[LUMP_LIGHTGRID].filelen) / 1; + m_gridData.resize(length+extrasize); + m_numGridPoints = copyLump( header, LUMP_LIGHTGRID, &m_gridData[0], 8 ); + + // swap everything + swapBSPFile(); + + return true; + + } + return false; +} + + + +const char* BspLoader::getValueForKey( const BSPEntity* ent, const char* key ) const { + + const BSPKeyValuePair* ep; + + for (ep=ent->epairs ; ep ; ep=ep->next) { + if (!strcmp(ep->key, key) ) { + return ep->value; + } + } + return ""; +} + +float BspLoader::getFloatForKey( const BSPEntity *ent, const char *key ) { + const char *k; + + k = getValueForKey( ent, key ); + return float(atof(k)); +} + +bool BspLoader::getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ) { + + const char *k; + k = getValueForKey (ent, key); + if (strcmp(k, "")) + { + sscanf (k, "%f %f %f", &vec[0], &vec[1], &vec[2]); + return true; + } + return false; +} + + + + +/* +============== +parseFromMemory +============== +*/ +void BspLoader::parseFromMemory (char *buffer, int size) +{ + script = scriptstack; + script++; + if (script == &scriptstack[MAX_INCLUDES]) + { + //printf("script file exceeded MAX_INCLUDES"); + } + strcpy (script->filename, "memory buffer" ); + + script->buffer = buffer; + script->line = 1; + script->script_p = script->buffer; + script->end_p = script->buffer + size; + + endofscript = false; + tokenready = false; +} + + +bool BspLoader::isEndOfScript (bool crossline) +{ + if (!crossline) + //printf("Line %i is incomplete\n",scriptline); + + if (!strcmp (script->filename, "memory buffer")) + { + endofscript = true; + return false; + } + + //free (script->buffer); + if (script == scriptstack+1) + { + endofscript = true; + return false; + } + script--; + scriptline = script->line; + //printf ("returning to %s\n", script->filename); + return getToken (crossline); +} + +/* + +============== +getToken +============== +*/ +bool BspLoader::getToken (bool crossline) +{ + char *token_p; + + if (tokenready) // is a token allready waiting? + { + tokenready = false; + return true; + } + + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + +// +// skip space +// +skipspace: + while (*script->script_p <= 32) + { + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + if (*script->script_p++ == '\n') + { + if (!crossline) + { + //printf("Line %i is incomplete\n",scriptline); + } + scriptline = script->line++; + } + } + + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + + // ; # // comments + if (*script->script_p == ';' || *script->script_p == '#' + || ( script->script_p[0] == '/' && script->script_p[1] == '/') ) + { + if (!crossline) + { + //printf("Line %i is incomplete\n",scriptline); + } + while (*script->script_p++ != '\n') + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + scriptline = script->line++; + goto skipspace; + } + + // /* */ comments + if (script->script_p[0] == '/' && script->script_p[1] == '*') + { + if (!crossline) + { + //printf("Line %i is incomplete\n",scriptline); + } + script->script_p+=2; + while (script->script_p[0] != '*' && script->script_p[1] != '/') + { + if ( *script->script_p == '\n' ) { + scriptline = script->line++; + } + script->script_p++; + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + } + script->script_p += 2; + goto skipspace; + } + +// +// copy token +// + token_p = token; + + if (*script->script_p == '"') + { + // quoted token + script->script_p++; + while (*script->script_p != '"') + { + *token_p++ = *script->script_p++; + if (script->script_p == script->end_p) + break; + if (token_p == &token[BSPMAXTOKEN]) + { + //printf ("Token too large on line %i\n",scriptline); + } + } + script->script_p++; + } + else // regular token + while ( *script->script_p > 32 && *script->script_p != ';') + { + *token_p++ = *script->script_p++; + if (script->script_p == script->end_p) + break; + if (token_p == &token[BSPMAXTOKEN]) + { + //printf ("Token too large on line %i\n",scriptline); + } + } + + *token_p = 0; + + if (!strcmp (token, "$include")) + { + //getToken (false); + //AddScriptToStack (token); + return false;//getToken (crossline); + } + + return true; +} + +char *BspLoader::copystring(const char *s) +{ + char *b; + b = (char*) malloc( strlen(s)+1); + strcpy (b, s); + return b; +} + +void BspLoader::stripTrailing( char *e ) { + char *s; + + s = e + strlen(e)-1; + while (s >= e && *s <= 32) + { + *s = 0; + s--; + } +} +/* +================= +parseEpair +================= +*/ +BSPKeyValuePair *BspLoader::parseEpair( void ) { + BSPKeyValuePair *e; + + e = (struct BSPPair*) malloc( sizeof(BSPKeyValuePair)); + memset( e, 0, sizeof(BSPKeyValuePair) ); + + if ( strlen(token) >= BSPMAX_KEY-1 ) { + //printf ("ParseEpar: token too long"); + } + e->key = copystring( token ); + getToken( false ); + if ( strlen(token) >= BSPMAX_VALUE-1 ) { + + //printf ("ParseEpar: token too long"); + } + e->value = copystring( token ); + + // strip trailing spaces that sometimes get accidentally + // added in the editor + stripTrailing( e->key ); + stripTrailing( e->value ); + + return e; +} + + +/* +================ +parseEntity +================ +*/ +bool BspLoader::parseEntity( void ) { + BSPKeyValuePair *e; + BSPEntity *mapent; + + if ( !getToken (true) ) { + return false; + } + + if ( strcmp (token, "{") ) { + + //printf ("parseEntity: { not found"); + } + + BSPEntity bla; + bla.brushes = 0; + bla.epairs = 0; + bla.firstDrawSurf = 0; + bla.origin[0] = 0.f; + bla.origin[1] = 0.f; + bla.origin[2] = 0.f; + bla.patches = 0; + + m_entities.push_back(bla); + mapent = &m_entities[m_entities.size()-1]; + m_num_entities++; + + do { + if ( !getToken (true) ) { + //printf("parseEntity: EOF without closing brace"); + } + if ( !strcmp (token, "}") ) { + break; + } + e = (struct BSPPair*)parseEpair (); + e->next = mapent->epairs; + mapent->epairs = e; + } while (1); + + return true; +} + +/* +================ +parseEntities + +Parses the dentdata string into entities +================ +*/ +void BspLoader::parseEntities( void ) { + m_num_entities = 0; + m_entities.clear(); + + parseFromMemory( &m_dentdata[0], m_entdatasize ); + + while ( parseEntity () ) { + } +} + + + +int BspLoader::getMachineEndianness() +{ + long int i = 1; + const char *p = (const char *) &i; + if (p[0] == 1) // Lowest address contains the least significant byte + return BSP_LITTLE_ENDIAN; + else + return BSP_BIG_ENDIAN; +} + +short BspLoader::isLittleShort (short l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + unsigned char b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; + } + //little endian + return l; +} + +short BspLoader::isBigShort (short l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + return l; + } + + unsigned char b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; + + + +} + + +int BspLoader::isLittleLong (int l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + unsigned char b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; + } + + //little endian + return l; + +} + +int BspLoader::isBigLong (int l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + return l; + } + + + unsigned char b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; + +} + + +float BspLoader::isLittleFloat (float l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + union {unsigned char b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; + } + + //little endian + return l; +} + +float BspLoader::isBigFloat (float l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + return l; + } + //little endian + union {unsigned char b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; +} + + + + + + +// +// swapBlock +// If all values are 32 bits, this can be used to swap everything +// + +void BspLoader::swapBlock( int *block, int sizeOfBlock ) { + int i; + + sizeOfBlock >>= 2; + for ( i = 0 ; i < sizeOfBlock ; i++ ) { + block[i] = isLittleLong( block[i] ); + } +} + +// +// copyLump +// + +int BspLoader::copyLump( BSPHeader *header, int lump, void *dest, int size ) { + int length, ofs; + + length = header->lumps[lump].filelen; + ofs = header->lumps[lump].fileofs; + + //if ( length % size ) { + // printf ("loadBSPFile: odd lump size"); + //} + + memcpy( dest, (unsigned char *)header + ofs, length ); + + return length / size; +} + + + + +// +// swapBSPFile +// + +void BspLoader::swapBSPFile( void ) { + int i; + + // models + swapBlock( (int *) &m_dmodels[0], m_nummodels * sizeof( m_dmodels[0] ) ); + + // shaders (don't swap the name) + for ( i = 0 ; i < m_numShaders ; i++ ) { + m_dshaders[i].contentFlags = isLittleLong( m_dshaders[i].contentFlags ); + m_dshaders[i].surfaceFlags = isLittleLong( m_dshaders[i].surfaceFlags ); + } + + // planes + swapBlock( (int *)&m_dplanes[0], m_numplanes * sizeof( m_dplanes[0] ) ); + + // nodes + swapBlock( (int *)&m_dnodes[0], m_numnodes * sizeof( m_dnodes[0] ) ); + + // leafs + swapBlock( (int *)&m_dleafs[0], m_numleafs * sizeof( m_dleafs[0] ) ); + + // leaffaces + swapBlock( (int *)&m_dleafsurfaces[0], m_numleafsurfaces * sizeof( m_dleafsurfaces[0] ) ); + + // leafbrushes + swapBlock( (int *)&m_dleafbrushes[0], m_numleafbrushes * sizeof( m_dleafbrushes[0] ) ); + + // brushes + swapBlock( (int *)&m_dbrushes[0], m_numbrushes * sizeof( m_dbrushes[0] ) ); + + // brushsides + swapBlock( (int *)&m_dbrushsides[0], m_numbrushsides * sizeof( m_dbrushsides[0] ) ); + + // vis + ((int *)&m_visBytes)[0] = isLittleLong( ((int *)&m_visBytes)[0] ); + ((int *)&m_visBytes)[1] = isLittleLong( ((int *)&m_visBytes)[1] ); + + + // drawindexes + swapBlock( (int *)&m_drawIndexes[0], m_numDrawIndexes * sizeof( m_drawIndexes[0] ) ); + + // drawsurfs + swapBlock( (int *)&m_drawSurfaces[0], m_numDrawSurfaces * sizeof( m_drawSurfaces[0] ) ); + +} + + + + + +bool BspLoader::findVectorByName(float* outvec,const char* name) +{ + const char *cl; + BSPVector3 origin; + + bool found = false; + + parseEntities(); + + for ( int i = 1; i < m_num_entities; i++ ) { + cl = getValueForKey (&m_entities[i], "classname"); + if ( !strcmp( cl, "info_player_start" ) ) { + getVectorForKey( &m_entities[i], "origin", origin ); + found = true; + break; + } + if ( !strcmp( cl, "info_player_deathmatch" ) ) { + getVectorForKey( &m_entities[i], "origin", origin ); + found = true; + break; + } + } + + if (found) + { + outvec[0] = origin[0]; + outvec[1] = origin[1]; + outvec[2] = origin[2]; + } + return found; +} + + + +const BSPEntity * BspLoader::getEntityByValue( const char* name, const char* value) +{ + const BSPEntity* entity = NULL; + + for ( int i = 1; i < m_num_entities; i++ ) { + + const BSPEntity& ent = m_entities[i]; + + const char* cl = getValueForKey (&m_entities[i], name); + if ( !strcmp( cl, value ) ) { + entity = &ent; + break; + } + } + return entity; +} + diff --git a/Demos/BspDemo/BspLoader.h b/Demos/BspDemo/BspLoader.h index 314f21e8b..b7fc302d7 100644 --- a/Demos/BspDemo/BspLoader.h +++ b/Demos/BspDemo/BspLoader.h @@ -1,295 +1,295 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code is free software; you can redistribute it -and/or modify it under the terms of the GNU bteral Public License as -published by the Free Software Foundation; either version 2 of the License, -or (at your option) any later version. - -Quake III Arena source code is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU bteral Public License for more details. - -You should have received a copy of the GNU bteral Public License -along with Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ - - - -#ifndef BSP_LOADER_H -#define BSP_LOADER_H - -#include "LinearMath/btAlignedObjectArray.h" - -#define BSPMAXTOKEN 1024 -#define BSPMAX_KEY 32 -#define BSPMAX_VALUE 1024 -#define BSPCONTENTS_SOLID 1 -#define BSPCONTENTS_AREAPORTAL 0x8000 -#define BSPLUMP_ENTITIES 0 -#define BSPLUMP_SHADERS 1 -#define BSPLUMP_PLANES 2 -#define BSPLUMP_NODES 3 -#define BSPLUMP_LEAFS 4 -#define BSPLUMP_LEAFSURFACES 5 -#define BSPLUMP_LEAFBRUSHES 6 -#define LUMP_MODELS 7 -#define LUMP_BRUSHES 8 -#define LUMP_BRUSHSIDES 9 -#define LUMP_DRAWVERTS 10 -#define LUMP_DRAWINDEXES 11 -#define LUMP_SURFACES 13 -#define LUMP_LIGHTMAPS 14 -#define LUMP_LIGHTGRID 15 -#define LUMP_VISIBILITY 16 -#define HEADER_LUMPS 17 -#define MAX_QPATH 64 - - - -typedef struct { - int fileofs, filelen; -} BSPLump; - -typedef float BSPVector3[3]; - -typedef struct { - int ident; - int version; - - BSPLump lumps[HEADER_LUMPS]; -} BSPHeader; - - -typedef struct { - float mins[3], maxs[3]; - int firstSurface, numSurfaces; - int firstBrush, numBrushes; -} BSPModel; - -typedef struct { - char shader[MAX_QPATH]; - int surfaceFlags; - int contentFlags; -} BSPShader; - -typedef struct { - float normal[3]; - float dist; -} BSPPlane; - -typedef struct { - int planeNum; - int children[2]; - int mins[3]; - int maxs[3]; -} BSPNode; - -typedef struct { - int cluster; - int area; - - int mins[3]; - int maxs[3]; - - int firstLeafSurface; - int numLeafSurfaces; - - int firstLeafBrush; - int numLeafBrushes; -} BSPLeaf; - -typedef struct { - int planeNum; - int shaderNum; -} BSPBrushSide; - -typedef struct { - int firstSide; - int numSides; - int shaderNum; -} BSPBrush; - - - - -typedef struct BSPPair { - struct BSPPair *next; - char *key; - char *value; -} BSPKeyValuePair; - -typedef struct { - BSPVector3 origin; - struct bspbrush_s *brushes; - struct parseMesh_s *patches; - int firstDrawSurf; - BSPKeyValuePair *epairs; -} BSPEntity; - -typedef enum { - MST_BAD, - MST_PLANAR, - MST_PATCH, - MST_TRIANGLE_SOUP, - MST_FLARE -} BSPMapSurface; - -typedef struct { - int shaderNum; - int fogNum; - int surfaceType; - - int firstVert; - int numVerts; - - int firstIndex; - int numIndexes; - - int lightmapNum; - int lightmapX, lightmapY; - int lightmapWidth, lightmapHeight; - - BSPVector3 lightmapOrigin; - BSPVector3 lightmapVecs[3]; - - int patchWidth; - int patchHeight; -} BSPSurface; - - - -///GPL code from IdSofware to parse a Quake 3 BSP file -///check that your platform define __BIG_ENDIAN__ correctly (in BspLoader.cpp) -class BspLoader -{ - int m_Endianness; - - public: - - BspLoader(); - - bool loadBSPFile( void* memoryBuffer); - - const char* getValueForKey( const BSPEntity *ent, const char *key ) const; - - bool getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ); - - float getFloatForKey( const BSPEntity *ent, const char *key ); - - void parseEntities( void ); - - bool findVectorByName(float* outvec,const char* name); - - const BSPEntity * getEntityByValue( const char* name, const char* value); - - - protected: - - void parseFromMemory (char *buffer, int size); - - - - bool isEndOfScript (bool crossline); - - bool getToken (bool crossline); - - char *copystring(const char *s); - - void stripTrailing( char *e ); - - BSPKeyValuePair * parseEpair( void ); - - bool parseEntity( void ); - - short isLittleShort (short l); - int isLittleLong (int l); - float isLittleFloat (float l); - - int isBigLong (int l); - short isBigShort (short l); - float isBigFloat (float l); - - void swapBlock( int *block, int sizeOfBlock ); - - int copyLump( BSPHeader *header, int lump, void *dest, int size ); - - void swapBSPFile( void ); - - - - - public: //easier for conversion - int m_num_entities; - btAlignedObjectArray m_entities; - - int m_nummodels; - btAlignedObjectArray m_dmodels; - - int m_numShaders; - btAlignedObjectArray m_dshaders; - - int m_entdatasize; - btAlignedObjectArray m_dentdata; - - int m_numleafs; - btAlignedObjectArray m_dleafs; - - int m_numplanes; - btAlignedObjectArray m_dplanes; - - int m_numnodes; - btAlignedObjectArray m_dnodes; - - int m_numleafsurfaces; - btAlignedObjectArray m_dleafsurfaces; - - int m_numleafbrushes; - btAlignedObjectArray m_dleafbrushes; - - int m_numbrushes; - btAlignedObjectArray m_dbrushes; - - int m_numbrushsides; - btAlignedObjectArray m_dbrushsides; - - int m_numLightBytes; - btAlignedObjectArray m_lightBytes; - - int m_numGridPoints; - btAlignedObjectArray m_gridData; - - int m_numVisBytes; - btAlignedObjectArray m_visBytes; - - - int m_numDrawIndexes; - btAlignedObjectArray m_drawIndexes; - - int m_numDrawSurfaces; - btAlignedObjectArray m_drawSurfaces; - - enum - { - BSP_LITTLE_ENDIAN = 0, - BSP_BIG_ENDIAN = 1 - }; - - //returns machines big endian / little endian - // - int getMachineEndianness(); - - inline int machineEndianness() - { - return m_Endianness; - } - -}; - -#endif //BSP_LOADER_H +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU bteral Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU bteral Public License for more details. + +You should have received a copy of the GNU bteral Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + + +#ifndef BSP_LOADER_H +#define BSP_LOADER_H + +#include "LinearMath/btAlignedObjectArray.h" + +#define BSPMAXTOKEN 1024 +#define BSPMAX_KEY 32 +#define BSPMAX_VALUE 1024 +#define BSPCONTENTS_SOLID 1 +#define BSPCONTENTS_AREAPORTAL 0x8000 +#define BSPLUMP_ENTITIES 0 +#define BSPLUMP_SHADERS 1 +#define BSPLUMP_PLANES 2 +#define BSPLUMP_NODES 3 +#define BSPLUMP_LEAFS 4 +#define BSPLUMP_LEAFSURFACES 5 +#define BSPLUMP_LEAFBRUSHES 6 +#define LUMP_MODELS 7 +#define LUMP_BRUSHES 8 +#define LUMP_BRUSHSIDES 9 +#define LUMP_DRAWVERTS 10 +#define LUMP_DRAWINDEXES 11 +#define LUMP_SURFACES 13 +#define LUMP_LIGHTMAPS 14 +#define LUMP_LIGHTGRID 15 +#define LUMP_VISIBILITY 16 +#define HEADER_LUMPS 17 +#define MAX_QPATH 64 + + + +typedef struct { + int fileofs, filelen; +} BSPLump; + +typedef float BSPVector3[3]; + +typedef struct { + int ident; + int version; + + BSPLump lumps[HEADER_LUMPS]; +} BSPHeader; + + +typedef struct { + float mins[3], maxs[3]; + int firstSurface, numSurfaces; + int firstBrush, numBrushes; +} BSPModel; + +typedef struct { + char shader[MAX_QPATH]; + int surfaceFlags; + int contentFlags; +} BSPShader; + +typedef struct { + float normal[3]; + float dist; +} BSPPlane; + +typedef struct { + int planeNum; + int children[2]; + int mins[3]; + int maxs[3]; +} BSPNode; + +typedef struct { + int cluster; + int area; + + int mins[3]; + int maxs[3]; + + int firstLeafSurface; + int numLeafSurfaces; + + int firstLeafBrush; + int numLeafBrushes; +} BSPLeaf; + +typedef struct { + int planeNum; + int shaderNum; +} BSPBrushSide; + +typedef struct { + int firstSide; + int numSides; + int shaderNum; +} BSPBrush; + + + + +typedef struct BSPPair { + struct BSPPair *next; + char *key; + char *value; +} BSPKeyValuePair; + +typedef struct { + BSPVector3 origin; + struct bspbrush_s *brushes; + struct parseMesh_s *patches; + int firstDrawSurf; + BSPKeyValuePair *epairs; +} BSPEntity; + +typedef enum { + MST_BAD, + MST_PLANAR, + MST_PATCH, + MST_TRIANGLE_SOUP, + MST_FLARE +} BSPMapSurface; + +typedef struct { + int shaderNum; + int fogNum; + int surfaceType; + + int firstVert; + int numVerts; + + int firstIndex; + int numIndexes; + + int lightmapNum; + int lightmapX, lightmapY; + int lightmapWidth, lightmapHeight; + + BSPVector3 lightmapOrigin; + BSPVector3 lightmapVecs[3]; + + int patchWidth; + int patchHeight; +} BSPSurface; + + + +///GPL code from IdSofware to parse a Quake 3 BSP file +///check that your platform define __BIG_ENDIAN__ correctly (in BspLoader.cpp) +class BspLoader +{ + int m_Endianness; + + public: + + BspLoader(); + + bool loadBSPFile( void* memoryBuffer); + + const char* getValueForKey( const BSPEntity *ent, const char *key ) const; + + bool getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ); + + float getFloatForKey( const BSPEntity *ent, const char *key ); + + void parseEntities( void ); + + bool findVectorByName(float* outvec,const char* name); + + const BSPEntity * getEntityByValue( const char* name, const char* value); + + + protected: + + void parseFromMemory (char *buffer, int size); + + + + bool isEndOfScript (bool crossline); + + bool getToken (bool crossline); + + char *copystring(const char *s); + + void stripTrailing( char *e ); + + BSPKeyValuePair * parseEpair( void ); + + bool parseEntity( void ); + + short isLittleShort (short l); + int isLittleLong (int l); + float isLittleFloat (float l); + + int isBigLong (int l); + short isBigShort (short l); + float isBigFloat (float l); + + void swapBlock( int *block, int sizeOfBlock ); + + int copyLump( BSPHeader *header, int lump, void *dest, int size ); + + void swapBSPFile( void ); + + + + + public: //easier for conversion + int m_num_entities; + btAlignedObjectArray m_entities; + + int m_nummodels; + btAlignedObjectArray m_dmodels; + + int m_numShaders; + btAlignedObjectArray m_dshaders; + + int m_entdatasize; + btAlignedObjectArray m_dentdata; + + int m_numleafs; + btAlignedObjectArray m_dleafs; + + int m_numplanes; + btAlignedObjectArray m_dplanes; + + int m_numnodes; + btAlignedObjectArray m_dnodes; + + int m_numleafsurfaces; + btAlignedObjectArray m_dleafsurfaces; + + int m_numleafbrushes; + btAlignedObjectArray m_dleafbrushes; + + int m_numbrushes; + btAlignedObjectArray m_dbrushes; + + int m_numbrushsides; + btAlignedObjectArray m_dbrushsides; + + int m_numLightBytes; + btAlignedObjectArray m_lightBytes; + + int m_numGridPoints; + btAlignedObjectArray m_gridData; + + int m_numVisBytes; + btAlignedObjectArray m_visBytes; + + + int m_numDrawIndexes; + btAlignedObjectArray m_drawIndexes; + + int m_numDrawSurfaces; + btAlignedObjectArray m_drawSurfaces; + + enum + { + BSP_LITTLE_ENDIAN = 0, + BSP_BIG_ENDIAN = 1 + }; + + //returns machines big endian / little endian + // + int getMachineEndianness(); + + inline int machineEndianness() + { + return m_Endianness; + } + +}; + +#endif //BSP_LOADER_H diff --git a/Demos/BspDemo/CMakeLists.txt b/Demos/BspDemo/CMakeLists.txt index 3ea7740a2..6105a183c 100644 --- a/Demos/BspDemo/CMakeLists.txt +++ b/Demos/BspDemo/CMakeLists.txt @@ -1,60 +1,60 @@ -# 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( - OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppBspPhysicsDemo - main.cpp - BspDemo.cpp - BspLoader.cpp - BspConverter.cpp -) - - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppBspPhysicsDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppBspPhysicsDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - - - -IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ADD_CUSTOM_COMMAND( - TARGET AppBspPhysicsDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} - ) -ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppBspPhysicsDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppBspPhysicsDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppBspPhysicsDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppBspPhysicsDemo + main.cpp + BspDemo.cpp + BspLoader.cpp + BspConverter.cpp +) + + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppBspPhysicsDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppBspPhysicsDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + + + +IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ADD_CUSTOM_COMMAND( + TARGET AppBspPhysicsDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} + ) +ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppBspPhysicsDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppBspPhysicsDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppBspPhysicsDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/CcdPhysicsDemo/CMakeLists.txt b/Demos/CcdPhysicsDemo/CMakeLists.txt index 1d8fdeb1e..515d83c71 100644 --- a/Demos/CcdPhysicsDemo/CMakeLists.txt +++ b/Demos/CcdPhysicsDemo/CMakeLists.txt @@ -1,57 +1,57 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -IF (WIN32) - ADD_EXECUTABLE(AppCcdPhysicsDemo - main.cpp - CcdPhysicsDemo.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ELSE() - ADD_EXECUTABLE(AppCcdPhysicsDemo - main.cpp - CcdPhysicsDemo.cpp - ) -ENDIF() - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppCcdPhysicsDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppCcdPhysicsDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppCcdPhysicsDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppCcdPhysicsDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppCcdPhysicsDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +IF (WIN32) + ADD_EXECUTABLE(AppCcdPhysicsDemo + main.cpp + CcdPhysicsDemo.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ELSE() + ADD_EXECUTABLE(AppCcdPhysicsDemo + main.cpp + CcdPhysicsDemo.cpp + ) +ENDIF() + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppCcdPhysicsDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppCcdPhysicsDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppCcdPhysicsDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppCcdPhysicsDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppCcdPhysicsDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.h b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.h index 370427dd5..b91a5427a 100644 --- a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.h +++ b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.h @@ -1,83 +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 CCD_PHYSICS_DEMO_H -#define CCD_PHYSICS_DEMO_H - -#include "GlutDemoApplication.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; - - -///CcdPhysicsDemo shows basic stacking using Bullet physics, and allows toggle of Ccd (using key '1') -class CcdPhysicsDemo : public GlutDemoApplication -{ - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - -#ifdef USE_PARALLEL_DISPATCHER -#ifdef WIN32 - class Win32ThreadSupport* m_threadSupportCollision; - class Win32ThreadSupport* m_threadSupportSolver; -#endif -#endif - - btConstraintSolver* m_solver; - - btCollisionAlgorithmCreateFunc* m_boxBoxCF; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - - public: - - void initPhysics(); - - void exitPhysics(); - - virtual ~CcdPhysicsDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); - - static DemoApplication* Create() - { - CcdPhysicsDemo* demo = new CcdPhysicsDemo; - demo->myinit(); - demo->initPhysics(); - return demo; - } - -}; - -#endif //CCD_PHYSICS_DEMO_H - +/* +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 CCD_PHYSICS_DEMO_H +#define CCD_PHYSICS_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + + +///CcdPhysicsDemo shows basic stacking using Bullet physics, and allows toggle of Ccd (using key '1') +class CcdPhysicsDemo : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + +#ifdef USE_PARALLEL_DISPATCHER +#ifdef WIN32 + class Win32ThreadSupport* m_threadSupportCollision; + class Win32ThreadSupport* m_threadSupportSolver; +#endif +#endif + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + public: + + void initPhysics(); + + void exitPhysics(); + + virtual ~CcdPhysicsDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + CcdPhysicsDemo* demo = new CcdPhysicsDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //CCD_PHYSICS_DEMO_H + diff --git a/Demos/CharacterDemo/CMakeLists.txt b/Demos/CharacterDemo/CMakeLists.txt index ac152d8af..175e11b56 100644 --- a/Demos/CharacterDemo/CMakeLists.txt +++ b/Demos/CharacterDemo/CMakeLists.txt @@ -1,75 +1,75 @@ -# 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( - OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) -SET(CharacterDemo_SRCS - - DynamicCharacterController.cpp - DynamicCharacterController.h - CharacterDemo.cpp - CharacterDemo.h - ../BspDemo/BspConverter.cpp - ../BspDemo/BspConverter.h - ../BspDemo/BspLoader.cpp - ../BspDemo/BspLoader.h - main.cpp -) - -IF (WIN32) - ADD_EXECUTABLE(AppCharacterDemo - ${CharacterDemo_SRCS} - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ELSE() - ADD_EXECUTABLE(AppCharacterDemo - ${CharacterDemo_SRCS} - ) -ENDIF() - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppCharacterDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppCharacterDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - -IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ADD_CUSTOM_COMMAND( - TARGET AppCharacterDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} - ) -ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppCharacterDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppCharacterDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppCharacterDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") -ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) +# 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( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) +SET(CharacterDemo_SRCS + + DynamicCharacterController.cpp + DynamicCharacterController.h + CharacterDemo.cpp + CharacterDemo.h + ../BspDemo/BspConverter.cpp + ../BspDemo/BspConverter.h + ../BspDemo/BspLoader.cpp + ../BspDemo/BspLoader.h + main.cpp +) + +IF (WIN32) + ADD_EXECUTABLE(AppCharacterDemo + ${CharacterDemo_SRCS} + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ELSE() + ADD_EXECUTABLE(AppCharacterDemo + ${CharacterDemo_SRCS} + ) +ENDIF() + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppCharacterDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppCharacterDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + +IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ADD_CUSTOM_COMMAND( + TARGET AppCharacterDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} + ) +ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppCharacterDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppCharacterDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppCharacterDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/Demos/CharacterDemo/CharacterDemo.cpp b/Demos/CharacterDemo/CharacterDemo.cpp index 68445dc6d..70960795c 100644 --- a/Demos/CharacterDemo/CharacterDemo.cpp +++ b/Demos/CharacterDemo/CharacterDemo.cpp @@ -1,530 +1,530 @@ -/* -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 "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" -#include "BulletCollision/CollisionDispatch/btGhostObject.h" - -#include "GLDebugDrawer.h" -#include //printf debugging - -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" -#include "CharacterDemo.h" -#ifdef DYNAMIC_CHARACTER_CONTROLLER -#include "DynamicCharacterController.h" -#else -#include "BulletDynamics/Character/btKinematicCharacterController.h" -#endif - -const int maxProxies = 32766; -const int maxOverlap = 65535; - -static int gForward = 0; -static int gBackward = 0; -static int gLeft = 0; -static int gRight = 0; -static int gJump = 0; - - - - -CharacterDemo::CharacterDemo() -: -m_cameraHeight(4.f), -m_minCameraDistance(3.f), -m_maxCameraDistance(10.f), -m_indexVertexArrays(0), -m_vertices(0) -{ - m_character = 0; - m_cameraPosition = btVector3(30,30,30); -} - - -void CharacterDemo::initPhysics() -{ - btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); - m_collisionShapes.push_back(groundShape); - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - btVector3 worldMin(-1000,-1000,-1000); - btVector3 worldMax(1000,1000,1000); - btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax); - m_overlappingPairCache = sweepBP; - - m_constraintSolver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); - -#ifdef DYNAMIC_CHARACTER_CONTROLLER - m_character = new DynamicCharacterController (); -#else - - btTransform startTransform; - startTransform.setIdentity (); - //startTransform.setOrigin (btVector3(0.0, 4.0, 0.0)); - startTransform.setOrigin (btVector3(10.210098,-1.6433364,16.453260)); - - - m_ghostObject = new btPairCachingGhostObject(); - m_ghostObject->setWorldTransform(startTransform); - sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); - btScalar characterHeight=1.75; - btScalar characterWidth =1.75; - btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight); - m_ghostObject->setCollisionShape (capsule); - m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT); - - btScalar stepHeight = btScalar(0.35); - m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight); -#endif - - //////////////// - - /// Create some basic environment from a Quake level - - //m_dynamicsWorld->setGravity(btVector3(0,0,0)); - btTransform tr; - tr.setIdentity(); - - char* bspfilename = "BspDemo.bsp"; - void* memoryBuffer = 0; - - FILE* file = fopen(bspfilename,"r"); - if (!file) - { - //cmake generated visual studio projects need 4 levels back - bspfilename = "../../../../BspDemo.bsp"; - file = fopen(bspfilename,"r"); - } - if (!file) - { - //visual studio leaves the current working directory in the projectfiles folder - bspfilename = "../../BspDemo.bsp"; - file = fopen(bspfilename,"r"); - } - if (!file) - { - //visual studio leaves the current working directory in the projectfiles folder - bspfilename = "BspDemo.bsp"; - file = fopen(bspfilename,"r"); - } - - if (file) - { - BspLoader bspLoader; - int size=0; - if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ - printf("Error: cannot get filesize from %s\n", bspfilename); - } else - { - //how to detect file size? - memoryBuffer = malloc(size+1); - fread(memoryBuffer,1,size,file); - bspLoader.loadBSPFile( memoryBuffer); - - BspToBulletConverter bsp2bullet(this); - float bspScaling = 0.1f; - bsp2bullet.convertBsp(bspLoader,bspScaling); - - } - fclose(file); - } - - ///only collide with static for now (no interaction with dynamic objects) - m_dynamicsWorld->addCollisionObject(m_ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter); - - m_dynamicsWorld->addAction(m_character); - - - /////////////// - - clientResetScene(); - - setCameraDistance(56.f); - -} - - -//to be implemented by the demo -void CharacterDemo::renderme() -{ - updateCamera(); - - DemoApplication::renderme(); -} - - - -void CharacterDemo::debugDrawContacts() -{ -// printf("numPairs = %d\n",m_customPairCallback->getOverlappingPairArray().size()); - { - btManifoldArray manifoldArray; - btBroadphasePairArray& pairArray = m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray(); - int numPairs = pairArray.size(); - - for (int i=0;igetOverlappingPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); - if (!collisionPair) - continue; - - if (collisionPair->m_algorithm) - collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); - - for (int j=0;jgetNumContacts();p++) - { - const btManifoldPoint&pt = manifold->getContactPoint(p); - - btVector3 color(255,255,255); - m_dynamicsWorld->getDebugDrawer()->drawContactPoint(pt.getPositionWorldOnB(),pt.m_normalWorldOnB,pt.getDistance(),pt.getLifeTime(),color); - } - } - } - } - -} - -void CharacterDemo::clientMoveAndDisplay() -{ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - /* Character stuff &*/ - if (m_character) - { - - } - - debugDrawContacts(); - - - if (m_dynamicsWorld) - { - //during idle mode, just run 1 simulation step maximum - int maxSimSubSteps = m_idle ? 1 : 2; - if (m_idle) - dt = 1.0/420.f; - - ///set walkDirection for our character - btTransform xform; - xform = m_ghostObject->getWorldTransform (); - - btVector3 forwardDir = xform.getBasis()[2]; - // printf("forwardDir=%f,%f,%f\n",forwardDir[0],forwardDir[1],forwardDir[2]); - btVector3 upDir = xform.getBasis()[1]; - btVector3 strafeDir = xform.getBasis()[0]; - forwardDir.normalize (); - upDir.normalize (); - strafeDir.normalize (); - - btVector3 walkDirection = btVector3(0.0, 0.0, 0.0); - btScalar walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s - btScalar walkSpeed = walkVelocity * dt; - - //rotate view - if (gLeft) - { - btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis(); - orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),0.01)); - m_ghostObject->getWorldTransform ().setBasis(orn); - } - - if (gRight) - { - btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis(); - orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),-0.01)); - m_ghostObject->getWorldTransform ().setBasis(orn); - } - - if (gForward) - walkDirection += forwardDir; - - if (gBackward) - walkDirection -= forwardDir; - - - m_character->setWalkDirection(walkDirection*walkSpeed); - - - int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - -//#define VERBOSE_FEEDBACK -#ifdef VERBOSE_FEEDBACK - 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_FEEDBACK - - } - - - - - - - -#ifdef USE_QUICKPROF - btProfiler::beginBlock("render"); -#endif //USE_QUICKPROF - - - renderme(); - -#ifdef USE_QUICKPROF - btProfiler::endBlock("render"); -#endif - - - glFlush(); - glutSwapBuffers(); - -} - - - -void CharacterDemo::displayCallback(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - debugDrawContacts(); - - glFlush(); - glutSwapBuffers(); -} - -void CharacterDemo::clientResetScene() -{ - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_ghostObject->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - - m_character->reset (); - ///WTF - m_character->warp (btVector3(10.210001,-2.0306311,16.576973)); - -} - -void CharacterDemo::specialKeyboardUp(int key, int x, int y) -{ - switch (key) - { - case GLUT_KEY_UP: - { - gForward = 0; - } - break; - case GLUT_KEY_DOWN: - { - gBackward = 0; - } - break; - case GLUT_KEY_LEFT: - { - gLeft = 0; - } - break; - case GLUT_KEY_RIGHT: - { - gRight = 0; - } - break; - default: - DemoApplication::specialKeyboardUp(key,x,y); - break; - } -} - - -void CharacterDemo::specialKeyboard(int key, int x, int y) -{ - -// printf("key = %i x=%i y=%i\n",key,x,y); - - switch (key) - { - case GLUT_KEY_UP: - { - gForward = 1; - } - break; - case GLUT_KEY_DOWN: - { - gBackward = 1; - } - break; - case GLUT_KEY_LEFT: - { - gLeft = 1; - } - break; - case GLUT_KEY_RIGHT: - { - gRight = 1; - } - break; - case GLUT_KEY_F1: - { - if (m_character && m_character->canJump()) - gJump = 1; - } - break; - default: - DemoApplication::specialKeyboard(key,x,y); - break; - } - -// glutPostRedisplay(); - - -} - -void CharacterDemo::updateCamera() -{ - -//#define DISABLE_CAMERA 1 -#ifdef DISABLE_CAMERA - DemoApplication::updateCamera(); - return; -#endif //DISABLE_CAMERA - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - btTransform characterWorldTrans; - - //look at the vehicle - characterWorldTrans = m_ghostObject->getWorldTransform(); - btVector3 up = characterWorldTrans.getBasis()[1]; - btVector3 backward = -characterWorldTrans.getBasis()[2]; - up.normalize (); - backward.normalize (); - - m_cameraTargetPosition = characterWorldTrans.getOrigin(); - m_cameraPosition = m_cameraTargetPosition + up * 10.0 + backward * 12.0; - - //use the convex sweep test to find a safe position for the camera (not blocked by static geometry) - btSphereShape cameraSphere(0.2f); - btTransform cameraFrom,cameraTo; - cameraFrom.setIdentity(); - cameraFrom.setOrigin(characterWorldTrans.getOrigin()); - cameraTo.setIdentity(); - cameraTo.setOrigin(m_cameraPosition); - - btCollisionWorld::ClosestConvexResultCallback cb( characterWorldTrans.getOrigin(), cameraTo.getOrigin() ); - cb.m_collisionFilterMask = btBroadphaseProxy::StaticFilter; - - m_dynamicsWorld->convexSweepTest(&cameraSphere,cameraFrom,cameraTo,cb); - if (cb.hasHit()) - { - - btScalar minFraction = cb.m_closestHitFraction;//btMax(btScalar(0.3),cb.m_closestHitFraction); - m_cameraPosition.setInterpolate3(cameraFrom.getOrigin(),cameraTo.getOrigin(),minFraction); - } - - - - - //update OpenGL camera settings - glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], - m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], - m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); - - - -} - - -CharacterDemo::~CharacterDemo() -{ - //cleanup in the reverse order of creation/initialization - if (m_character) - { - m_dynamicsWorld->removeCollisionObject(m_ghostObject); - } - //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 //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "CharacterDemo.h" +#ifdef DYNAMIC_CHARACTER_CONTROLLER +#include "DynamicCharacterController.h" +#else +#include "BulletDynamics/Character/btKinematicCharacterController.h" +#endif + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +static int gForward = 0; +static int gBackward = 0; +static int gLeft = 0; +static int gRight = 0; +static int gJump = 0; + + + + +CharacterDemo::CharacterDemo() +: +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_character = 0; + m_cameraPosition = btVector3(30,30,30); +} + + +void CharacterDemo::initPhysics() +{ + btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); + m_collisionShapes.push_back(groundShape); + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax); + m_overlappingPairCache = sweepBP; + + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + +#ifdef DYNAMIC_CHARACTER_CONTROLLER + m_character = new DynamicCharacterController (); +#else + + btTransform startTransform; + startTransform.setIdentity (); + //startTransform.setOrigin (btVector3(0.0, 4.0, 0.0)); + startTransform.setOrigin (btVector3(10.210098,-1.6433364,16.453260)); + + + m_ghostObject = new btPairCachingGhostObject(); + m_ghostObject->setWorldTransform(startTransform); + sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); + btScalar characterHeight=1.75; + btScalar characterWidth =1.75; + btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight); + m_ghostObject->setCollisionShape (capsule); + m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT); + + btScalar stepHeight = btScalar(0.35); + m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight); +#endif + + //////////////// + + /// Create some basic environment from a Quake level + + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); + btTransform tr; + tr.setIdentity(); + + char* bspfilename = "BspDemo.bsp"; + void* memoryBuffer = 0; + + FILE* file = fopen(bspfilename,"r"); + if (!file) + { + //cmake generated visual studio projects need 4 levels back + bspfilename = "../../../../BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + if (!file) + { + //visual studio leaves the current working directory in the projectfiles folder + bspfilename = "../../BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + if (!file) + { + //visual studio leaves the current working directory in the projectfiles folder + bspfilename = "BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + + if (file) + { + BspLoader bspLoader; + int size=0; + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", bspfilename); + } else + { + //how to detect file size? + memoryBuffer = malloc(size+1); + fread(memoryBuffer,1,size,file); + bspLoader.loadBSPFile( memoryBuffer); + + BspToBulletConverter bsp2bullet(this); + float bspScaling = 0.1f; + bsp2bullet.convertBsp(bspLoader,bspScaling); + + } + fclose(file); + } + + ///only collide with static for now (no interaction with dynamic objects) + m_dynamicsWorld->addCollisionObject(m_ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter); + + m_dynamicsWorld->addAction(m_character); + + + /////////////// + + clientResetScene(); + + setCameraDistance(56.f); + +} + + +//to be implemented by the demo +void CharacterDemo::renderme() +{ + updateCamera(); + + DemoApplication::renderme(); +} + + + +void CharacterDemo::debugDrawContacts() +{ +// printf("numPairs = %d\n",m_customPairCallback->getOverlappingPairArray().size()); + { + btManifoldArray manifoldArray; + btBroadphasePairArray& pairArray = m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray(); + int numPairs = pairArray.size(); + + for (int i=0;igetOverlappingPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); + if (!collisionPair) + continue; + + if (collisionPair->m_algorithm) + collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); + + for (int j=0;jgetNumContacts();p++) + { + const btManifoldPoint&pt = manifold->getContactPoint(p); + + btVector3 color(255,255,255); + m_dynamicsWorld->getDebugDrawer()->drawContactPoint(pt.getPositionWorldOnB(),pt.m_normalWorldOnB,pt.getDistance(),pt.getLifeTime(),color); + } + } + } + } + +} + +void CharacterDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + /* Character stuff &*/ + if (m_character) + { + + } + + debugDrawContacts(); + + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + ///set walkDirection for our character + btTransform xform; + xform = m_ghostObject->getWorldTransform (); + + btVector3 forwardDir = xform.getBasis()[2]; + // printf("forwardDir=%f,%f,%f\n",forwardDir[0],forwardDir[1],forwardDir[2]); + btVector3 upDir = xform.getBasis()[1]; + btVector3 strafeDir = xform.getBasis()[0]; + forwardDir.normalize (); + upDir.normalize (); + strafeDir.normalize (); + + btVector3 walkDirection = btVector3(0.0, 0.0, 0.0); + btScalar walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s + btScalar walkSpeed = walkVelocity * dt; + + //rotate view + if (gLeft) + { + btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis(); + orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),0.01)); + m_ghostObject->getWorldTransform ().setBasis(orn); + } + + if (gRight) + { + btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis(); + orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),-0.01)); + m_ghostObject->getWorldTransform ().setBasis(orn); + } + + if (gForward) + walkDirection += forwardDir; + + if (gBackward) + walkDirection -= forwardDir; + + + m_character->setWalkDirection(walkDirection*walkSpeed); + + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + 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_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void CharacterDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + debugDrawContacts(); + + glFlush(); + glutSwapBuffers(); +} + +void CharacterDemo::clientResetScene() +{ + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_ghostObject->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + + m_character->reset (); + ///WTF + m_character->warp (btVector3(10.210001,-2.0306311,16.576973)); + +} + +void CharacterDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP: + { + gForward = 0; + } + break; + case GLUT_KEY_DOWN: + { + gBackward = 0; + } + break; + case GLUT_KEY_LEFT: + { + gLeft = 0; + } + break; + case GLUT_KEY_RIGHT: + { + gRight = 0; + } + break; + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } +} + + +void CharacterDemo::specialKeyboard(int key, int x, int y) +{ + +// printf("key = %i x=%i y=%i\n",key,x,y); + + switch (key) + { + case GLUT_KEY_UP: + { + gForward = 1; + } + break; + case GLUT_KEY_DOWN: + { + gBackward = 1; + } + break; + case GLUT_KEY_LEFT: + { + gLeft = 1; + } + break; + case GLUT_KEY_RIGHT: + { + gRight = 1; + } + break; + case GLUT_KEY_F1: + { + if (m_character && m_character->canJump()) + gJump = 1; + } + break; + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + +// glutPostRedisplay(); + + +} + +void CharacterDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 +#ifdef DISABLE_CAMERA + DemoApplication::updateCamera(); + return; +#endif //DISABLE_CAMERA + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform characterWorldTrans; + + //look at the vehicle + characterWorldTrans = m_ghostObject->getWorldTransform(); + btVector3 up = characterWorldTrans.getBasis()[1]; + btVector3 backward = -characterWorldTrans.getBasis()[2]; + up.normalize (); + backward.normalize (); + + m_cameraTargetPosition = characterWorldTrans.getOrigin(); + m_cameraPosition = m_cameraTargetPosition + up * 10.0 + backward * 12.0; + + //use the convex sweep test to find a safe position for the camera (not blocked by static geometry) + btSphereShape cameraSphere(0.2f); + btTransform cameraFrom,cameraTo; + cameraFrom.setIdentity(); + cameraFrom.setOrigin(characterWorldTrans.getOrigin()); + cameraTo.setIdentity(); + cameraTo.setOrigin(m_cameraPosition); + + btCollisionWorld::ClosestConvexResultCallback cb( characterWorldTrans.getOrigin(), cameraTo.getOrigin() ); + cb.m_collisionFilterMask = btBroadphaseProxy::StaticFilter; + + m_dynamicsWorld->convexSweepTest(&cameraSphere,cameraFrom,cameraTo,cb); + if (cb.hasHit()) + { + + btScalar minFraction = cb.m_closestHitFraction;//btMax(btScalar(0.3),cb.m_closestHitFraction); + m_cameraPosition.setInterpolate3(cameraFrom.getOrigin(),cameraTo.getOrigin(),minFraction); + } + + + + + //update OpenGL camera settings + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + + +CharacterDemo::~CharacterDemo() +{ + //cleanup in the reverse order of creation/initialization + if (m_character) + { + m_dynamicsWorld->removeCollisionObject(m_ghostObject); + } + //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_collisionShapes; - - class btBroadphaseInterface* m_overlappingPairCache; - - class btCollisionDispatcher* m_dispatcher; - - class btConstraintSolver* m_constraintSolver; - - class btDefaultCollisionConfiguration* m_collisionConfiguration; - - class btTriangleIndexVertexArray* m_indexVertexArrays; - - btVector3* m_vertices; - - void debugDrawContacts(); - - float m_cameraHeight; - - float m_minCameraDistance; - float m_maxCameraDistance; - - - CharacterDemo(); - - virtual ~CharacterDemo(); - - virtual void clientMoveAndDisplay(); - - virtual void clientResetScene(); - - virtual void displayCallback(); - - ///a very basic camera following the character - virtual void updateCamera(); - - virtual void specialKeyboard(int key, int x, int y); - - virtual void specialKeyboardUp(int key, int x, int y); - - void renderme(); - - void initPhysics(); - - static DemoApplication* Create() - { - CharacterDemo* demo = new CharacterDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - - - -#define QUAKE_BSP_IMPORTING 1 -#ifdef QUAKE_BSP_IMPORTING -#include "../BspDemo/BspLoader.h" -#include "../BspDemo/BspConverter.h" - - - - -class BspToBulletConverter : public BspConverter -{ - CharacterDemo* m_demoApp; - -public: - - BspToBulletConverter(CharacterDemo* demoApp) - :m_demoApp(demoApp) - { - } - - virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) - { - ///perhaps we can do something special with entities (isEntity) - ///like adding a collision Triggering (as example) - - if (vertices.size() > 0) - { - float mass = 0.f; - btTransform startTransform; - //can use a shift - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,-10.0f,0.0f)); - //this create an internal copy of the vertices - for (int i = 0; i < vertices.size(); i++) - { - vertices[i] *= btScalar(0.5); - float t = vertices[i].getZ() * btScalar(0.75); - vertices[i].setZ(-vertices[i].getY()); - vertices[i].setY(t); - } - - btCollisionShape* shape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); - m_demoApp->m_collisionShapes.push_back(shape); - - //btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape); - m_demoApp->localCreateRigidBody(mass, startTransform,shape); - } - } -}; -#endif //QUAKE_BSP_IMPORTING - - -#endif //CHARACTER_DEMO_H - - +/* +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 CHARACTER_DEMO_H +#define CHARACTER_DEMO_H + + +///DYNAMIC_CHARACTER_CONTROLLER is not fully implemented yet at the moment +//#define DYNAMIC_CHARACTER_CONTROLLER 1 + +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" + +class btCharacterControllerInterface; +class btDynamicCharacterController; +class btKinematicCharacterController; + +class btCollisionShape; + + +#include "GlutDemoApplication.h" + +///CharacterDemo shows how to setup and use the built-in raycast vehicle +class CharacterDemo : public GlutDemoApplication +{ + public: + +#ifdef DYNAMIC_CHARACTER_CONTROLLER + btCharacterControllerInterface* m_character; +#else + btKinematicCharacterController* m_character; + class btPairCachingGhostObject* m_ghostObject; +#endif + + + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + class btTriangleIndexVertexArray* m_indexVertexArrays; + + btVector3* m_vertices; + + void debugDrawContacts(); + + float m_cameraHeight; + + float m_minCameraDistance; + float m_maxCameraDistance; + + + CharacterDemo(); + + virtual ~CharacterDemo(); + + virtual void clientMoveAndDisplay(); + + virtual void clientResetScene(); + + virtual void displayCallback(); + + ///a very basic camera following the character + virtual void updateCamera(); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + void renderme(); + + void initPhysics(); + + static DemoApplication* Create() + { + CharacterDemo* demo = new CharacterDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + + +#define QUAKE_BSP_IMPORTING 1 +#ifdef QUAKE_BSP_IMPORTING +#include "../BspDemo/BspLoader.h" +#include "../BspDemo/BspConverter.h" + + + + +class BspToBulletConverter : public BspConverter +{ + CharacterDemo* m_demoApp; + +public: + + BspToBulletConverter(CharacterDemo* demoApp) + :m_demoApp(demoApp) + { + } + + virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) + { + ///perhaps we can do something special with entities (isEntity) + ///like adding a collision Triggering (as example) + + if (vertices.size() > 0) + { + float mass = 0.f; + btTransform startTransform; + //can use a shift + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-10.0f,0.0f)); + //this create an internal copy of the vertices + for (int i = 0; i < vertices.size(); i++) + { + vertices[i] *= btScalar(0.5); + float t = vertices[i].getZ() * btScalar(0.75); + vertices[i].setZ(-vertices[i].getY()); + vertices[i].setY(t); + } + + btCollisionShape* shape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); + m_demoApp->m_collisionShapes.push_back(shape); + + //btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape); + m_demoApp->localCreateRigidBody(mass, startTransform,shape); + } + } +}; +#endif //QUAKE_BSP_IMPORTING + + +#endif //CHARACTER_DEMO_H + + diff --git a/Demos/CharacterDemo/DynamicCharacterController.cpp b/Demos/CharacterDemo/DynamicCharacterController.cpp index ce8ed96ef..452d86bc4 100644 --- a/Demos/CharacterDemo/DynamicCharacterController.cpp +++ b/Demos/CharacterDemo/DynamicCharacterController.cpp @@ -1,204 +1,204 @@ -#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" -#include "LinearMath/btDefaultMotionState.h" -#include "DynamicCharacterController.h" - -DynamicCharacterController::DynamicCharacterController () -{ - m_rayLambda[0] = 1.0; - m_rayLambda[1] = 1.0; - m_halfHeight = 1.0; - m_turnAngle = 0.0; - m_maxLinearVelocity = 10.0; - m_walkVelocity = 8.0; // meters/sec - m_turnVelocity = 1.0; // radians/sec - m_shape = NULL; - m_rigidBody = NULL; -} - -DynamicCharacterController::~DynamicCharacterController () -{ -} - -void DynamicCharacterController::setup (btScalar height, btScalar width, btScalar stepHeight) -{ - btVector3 spherePositions[2]; - btScalar sphereRadii[2]; - - sphereRadii[0] = width; - sphereRadii[1] = width; - spherePositions[0] = btVector3 (0.0, (height/btScalar(2.0) - width), 0.0); - spherePositions[1] = btVector3 (0.0, (-height/btScalar(2.0) + width), 0.0); - - m_halfHeight = height/btScalar(2.0); - - m_shape = new btMultiSphereShape (&spherePositions[0], &sphereRadii[0], 2); - - btTransform startTransform; - startTransform.setIdentity (); - startTransform.setOrigin (btVector3(0.0, 2.0, 0.0)); - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo cInfo(1.0, myMotionState, m_shape); - m_rigidBody = new btRigidBody(cInfo); - // kinematic vs. static doesn't work - //m_rigidBody->setCollisionFlags( m_rigidBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - m_rigidBody->setSleepingThresholds (0.0, 0.0); - m_rigidBody->setAngularFactor (0.0); - -} - -void DynamicCharacterController::destroy () -{ - if (m_shape) - { - delete m_shape; - } - - if (m_rigidBody) - { - delete m_rigidBody; - m_rigidBody = 0; - } -} - -btCollisionObject* DynamicCharacterController::getCollisionObject () -{ - return m_rigidBody; -} - -void DynamicCharacterController::preStep (const btCollisionWorld* collisionWorld) -{ - btTransform xform; - m_rigidBody->getMotionState()->getWorldTransform (xform); - btVector3 down = -xform.getBasis()[1]; - btVector3 forward = xform.getBasis()[2]; - down.normalize (); - forward.normalize(); - - m_raySource[0] = xform.getOrigin(); - m_raySource[1] = xform.getOrigin(); - - m_rayTarget[0] = m_raySource[0] + down * m_halfHeight * btScalar(1.1); - m_rayTarget[1] = m_raySource[1] + forward * m_halfHeight * btScalar(1.1); - - class ClosestNotMe : public btCollisionWorld::ClosestRayResultCallback - { - public: - ClosestNotMe (btRigidBody* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0)) - { - m_me = me; - } - - virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace) - { - if (rayResult.m_collisionObject == m_me) - return 1.0; - - return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace - ); - } - protected: - btRigidBody* m_me; - }; - - ClosestNotMe rayCallback(m_rigidBody); - - int i = 0; - for (i = 0; i < 2; i++) - { - rayCallback.m_closestHitFraction = 1.0; - collisionWorld->rayTest (m_raySource[i], m_rayTarget[i], rayCallback); - if (rayCallback.hasHit()) - { - m_rayLambda[i] = rayCallback.m_closestHitFraction; - } else { - m_rayLambda[i] = 1.0; - } - } -} - -void DynamicCharacterController::playerStep (const btCollisionWorld* dynaWorld,btScalar dt, - int forward, - int backward, - int left, - int right, - int jump) -{ - btTransform xform; - m_rigidBody->getMotionState()->getWorldTransform (xform); - - /* Handle turning */ - if (left) - m_turnAngle -= dt * m_turnVelocity; - if (right) - m_turnAngle += dt * m_turnVelocity; - - xform.setRotation (btQuaternion (btVector3(0.0, 1.0, 0.0), m_turnAngle)); - - btVector3 linearVelocity = m_rigidBody->getLinearVelocity(); - btScalar speed = m_rigidBody->getLinearVelocity().length(); - - btVector3 forwardDir = xform.getBasis()[2]; - forwardDir.normalize (); - btVector3 walkDirection = btVector3(0.0, 0.0, 0.0); - btScalar walkSpeed = m_walkVelocity * dt; - - if (forward) - walkDirection += forwardDir; - if (backward) - walkDirection -= forwardDir; - - - - if (!forward && !backward && onGround()) - { - /* Dampen when on the ground and not being moved by the player */ - linearVelocity *= btScalar(0.2); - m_rigidBody->setLinearVelocity (linearVelocity); - } else { - if (speed < m_maxLinearVelocity) - { - btVector3 velocity = linearVelocity + walkDirection * walkSpeed; - m_rigidBody->setLinearVelocity (velocity); - } - } - - m_rigidBody->getMotionState()->setWorldTransform (xform); - m_rigidBody->setCenterOfMassTransform (xform); -} - -bool DynamicCharacterController::canJump () const -{ - return onGround(); -} - -void DynamicCharacterController::jump () -{ - if (!canJump()) - return; - - btTransform xform; - m_rigidBody->getMotionState()->getWorldTransform (xform); - btVector3 up = xform.getBasis()[1]; - up.normalize (); - btScalar magnitude = (btScalar(1.0)/m_rigidBody->getInvMass()) * btScalar(8.0); - m_rigidBody->applyCentralImpulse (up * magnitude); -} - -bool DynamicCharacterController::onGround () const -{ - return m_rayLambda[0] < btScalar(1.0); -} - -void DynamicCharacterController::reset () -{ -} -void DynamicCharacterController::warp (const btVector3& origin) -{ -} -void DynamicCharacterController::registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher) -{ - -} - +#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" +#include "LinearMath/btDefaultMotionState.h" +#include "DynamicCharacterController.h" + +DynamicCharacterController::DynamicCharacterController () +{ + m_rayLambda[0] = 1.0; + m_rayLambda[1] = 1.0; + m_halfHeight = 1.0; + m_turnAngle = 0.0; + m_maxLinearVelocity = 10.0; + m_walkVelocity = 8.0; // meters/sec + m_turnVelocity = 1.0; // radians/sec + m_shape = NULL; + m_rigidBody = NULL; +} + +DynamicCharacterController::~DynamicCharacterController () +{ +} + +void DynamicCharacterController::setup (btScalar height, btScalar width, btScalar stepHeight) +{ + btVector3 spherePositions[2]; + btScalar sphereRadii[2]; + + sphereRadii[0] = width; + sphereRadii[1] = width; + spherePositions[0] = btVector3 (0.0, (height/btScalar(2.0) - width), 0.0); + spherePositions[1] = btVector3 (0.0, (-height/btScalar(2.0) + width), 0.0); + + m_halfHeight = height/btScalar(2.0); + + m_shape = new btMultiSphereShape (&spherePositions[0], &sphereRadii[0], 2); + + btTransform startTransform; + startTransform.setIdentity (); + startTransform.setOrigin (btVector3(0.0, 2.0, 0.0)); + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo cInfo(1.0, myMotionState, m_shape); + m_rigidBody = new btRigidBody(cInfo); + // kinematic vs. static doesn't work + //m_rigidBody->setCollisionFlags( m_rigidBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + m_rigidBody->setSleepingThresholds (0.0, 0.0); + m_rigidBody->setAngularFactor (0.0); + +} + +void DynamicCharacterController::destroy () +{ + if (m_shape) + { + delete m_shape; + } + + if (m_rigidBody) + { + delete m_rigidBody; + m_rigidBody = 0; + } +} + +btCollisionObject* DynamicCharacterController::getCollisionObject () +{ + return m_rigidBody; +} + +void DynamicCharacterController::preStep (const btCollisionWorld* collisionWorld) +{ + btTransform xform; + m_rigidBody->getMotionState()->getWorldTransform (xform); + btVector3 down = -xform.getBasis()[1]; + btVector3 forward = xform.getBasis()[2]; + down.normalize (); + forward.normalize(); + + m_raySource[0] = xform.getOrigin(); + m_raySource[1] = xform.getOrigin(); + + m_rayTarget[0] = m_raySource[0] + down * m_halfHeight * btScalar(1.1); + m_rayTarget[1] = m_raySource[1] + forward * m_halfHeight * btScalar(1.1); + + class ClosestNotMe : public btCollisionWorld::ClosestRayResultCallback + { + public: + ClosestNotMe (btRigidBody* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0)) + { + m_me = me; + } + + virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace) + { + if (rayResult.m_collisionObject == m_me) + return 1.0; + + return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace + ); + } + protected: + btRigidBody* m_me; + }; + + ClosestNotMe rayCallback(m_rigidBody); + + int i = 0; + for (i = 0; i < 2; i++) + { + rayCallback.m_closestHitFraction = 1.0; + collisionWorld->rayTest (m_raySource[i], m_rayTarget[i], rayCallback); + if (rayCallback.hasHit()) + { + m_rayLambda[i] = rayCallback.m_closestHitFraction; + } else { + m_rayLambda[i] = 1.0; + } + } +} + +void DynamicCharacterController::playerStep (const btCollisionWorld* dynaWorld,btScalar dt, + int forward, + int backward, + int left, + int right, + int jump) +{ + btTransform xform; + m_rigidBody->getMotionState()->getWorldTransform (xform); + + /* Handle turning */ + if (left) + m_turnAngle -= dt * m_turnVelocity; + if (right) + m_turnAngle += dt * m_turnVelocity; + + xform.setRotation (btQuaternion (btVector3(0.0, 1.0, 0.0), m_turnAngle)); + + btVector3 linearVelocity = m_rigidBody->getLinearVelocity(); + btScalar speed = m_rigidBody->getLinearVelocity().length(); + + btVector3 forwardDir = xform.getBasis()[2]; + forwardDir.normalize (); + btVector3 walkDirection = btVector3(0.0, 0.0, 0.0); + btScalar walkSpeed = m_walkVelocity * dt; + + if (forward) + walkDirection += forwardDir; + if (backward) + walkDirection -= forwardDir; + + + + if (!forward && !backward && onGround()) + { + /* Dampen when on the ground and not being moved by the player */ + linearVelocity *= btScalar(0.2); + m_rigidBody->setLinearVelocity (linearVelocity); + } else { + if (speed < m_maxLinearVelocity) + { + btVector3 velocity = linearVelocity + walkDirection * walkSpeed; + m_rigidBody->setLinearVelocity (velocity); + } + } + + m_rigidBody->getMotionState()->setWorldTransform (xform); + m_rigidBody->setCenterOfMassTransform (xform); +} + +bool DynamicCharacterController::canJump () const +{ + return onGround(); +} + +void DynamicCharacterController::jump () +{ + if (!canJump()) + return; + + btTransform xform; + m_rigidBody->getMotionState()->getWorldTransform (xform); + btVector3 up = xform.getBasis()[1]; + up.normalize (); + btScalar magnitude = (btScalar(1.0)/m_rigidBody->getInvMass()) * btScalar(8.0); + m_rigidBody->applyCentralImpulse (up * magnitude); +} + +bool DynamicCharacterController::onGround () const +{ + return m_rayLambda[0] < btScalar(1.0); +} + +void DynamicCharacterController::reset () +{ +} +void DynamicCharacterController::warp (const btVector3& origin) +{ +} +void DynamicCharacterController::registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher) +{ + +} + diff --git a/Demos/CharacterDemo/DynamicCharacterController.h b/Demos/CharacterDemo/DynamicCharacterController.h index e054f59e2..241aaeac1 100644 --- a/Demos/CharacterDemo/DynamicCharacterController.h +++ b/Demos/CharacterDemo/DynamicCharacterController.h @@ -1,55 +1,55 @@ -#ifndef CHARACTER_CONTROLLER_H -#define CHARACTER_CONTROLLER_H - -#include "LinearMath/btVector3.h" - -#include "BulletDynamics/Character/btCharacterControllerInterface.h" - -class btCollisionShape; -class btRigidBody; -class btCollisionWorld; - -///DynamicCharacterController is obsolete/unsupported at the moment -class DynamicCharacterController : public btCharacterControllerInterface -{ -protected: - btScalar m_halfHeight; - btCollisionShape* m_shape; - btRigidBody* m_rigidBody; - - btVector3 m_raySource[2]; - btVector3 m_rayTarget[2]; - btScalar m_rayLambda[2]; - btVector3 m_rayNormal[2]; - - btScalar m_turnAngle; - - btScalar m_maxLinearVelocity; - btScalar m_walkVelocity; - btScalar m_turnVelocity; -public: - DynamicCharacterController (); - ~DynamicCharacterController (); - void setup (btScalar height = 2.0, btScalar width = 0.25, btScalar stepHeight = 0.25); - void destroy (); - - virtual void reset (); - virtual void warp (const btVector3& origin); - virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher); - - btCollisionObject* getCollisionObject (); - - void preStep (const btCollisionWorld* collisionWorld); - void playerStep (const btCollisionWorld* collisionWorld,btScalar dt, - int forward, - int backward, - int left, - int right, - int jump); - bool canJump () const; - void jump (); - - bool onGround () const; -}; - -#endif +#ifndef CHARACTER_CONTROLLER_H +#define CHARACTER_CONTROLLER_H + +#include "LinearMath/btVector3.h" + +#include "BulletDynamics/Character/btCharacterControllerInterface.h" + +class btCollisionShape; +class btRigidBody; +class btCollisionWorld; + +///DynamicCharacterController is obsolete/unsupported at the moment +class DynamicCharacterController : public btCharacterControllerInterface +{ +protected: + btScalar m_halfHeight; + btCollisionShape* m_shape; + btRigidBody* m_rigidBody; + + btVector3 m_raySource[2]; + btVector3 m_rayTarget[2]; + btScalar m_rayLambda[2]; + btVector3 m_rayNormal[2]; + + btScalar m_turnAngle; + + btScalar m_maxLinearVelocity; + btScalar m_walkVelocity; + btScalar m_turnVelocity; +public: + DynamicCharacterController (); + ~DynamicCharacterController (); + void setup (btScalar height = 2.0, btScalar width = 0.25, btScalar stepHeight = 0.25); + void destroy (); + + virtual void reset (); + virtual void warp (const btVector3& origin); + virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher); + + btCollisionObject* getCollisionObject (); + + void preStep (const btCollisionWorld* collisionWorld); + void playerStep (const btCollisionWorld* collisionWorld,btScalar dt, + int forward, + int backward, + int left, + int right, + int jump); + bool canJump () const; + void jump (); + + bool onGround () const; +}; + +#endif diff --git a/Demos/CollisionDemo/CMakeLists.txt b/Demos/CollisionDemo/CMakeLists.txt index efe318726..d9209b9ac 100644 --- a/Demos/CollisionDemo/CMakeLists.txt +++ b/Demos/CollisionDemo/CMakeLists.txt @@ -1,36 +1,36 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -IF (WIN32) - ADD_EXECUTABLE(AppCollisionDemo - CollisionDemo.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ELSE() - ADD_EXECUTABLE(AppCollisionDemo - CollisionDemo.cpp - ) -ENDIF() - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +IF (WIN32) + ADD_EXECUTABLE(AppCollisionDemo + CollisionDemo.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ELSE() + ADD_EXECUTABLE(AppCollisionDemo + CollisionDemo.cpp + ) +ENDIF() + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/CollisionDemo/CollisionDemo.h b/Demos/CollisionDemo/CollisionDemo.h index 56b68ada8..9f95fb3cb 100644 --- a/Demos/CollisionDemo/CollisionDemo.h +++ b/Demos/CollisionDemo/CollisionDemo.h @@ -1,34 +1,34 @@ -/* -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 COLLISION_DEMO_H -#define COLLISION_DEMO_H - -#include "GlutDemoApplication.h" - -///CollisionDemo shows the low-level direct access to GJK -class CollisionDemo : public GlutDemoApplication -{ - public: - - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - -}; - -#endif //COLLISION_DEMO_H - +/* +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 COLLISION_DEMO_H +#define COLLISION_DEMO_H + +#include "GlutDemoApplication.h" + +///CollisionDemo shows the low-level direct access to GJK +class CollisionDemo : public GlutDemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + +}; + +#endif //COLLISION_DEMO_H + diff --git a/Demos/CollisionInterfaceDemo/CMakeLists.txt b/Demos/CollisionInterfaceDemo/CMakeLists.txt index cb7ab82c0..2848f525e 100644 --- a/Demos/CollisionInterfaceDemo/CMakeLists.txt +++ b/Demos/CollisionInterfaceDemo/CMakeLists.txt @@ -1,77 +1,77 @@ -# 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 -######################################################## - - -IF (USE_GLUT) - INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL - ) - - LINK_LIBRARIES( - OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - IF (WIN32) - ADD_EXECUTABLE(AppCollisionInterfaceDemo - CollisionInterfaceDemo.cpp - CollisionInterfaceDemo.h - main.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) - ELSE() - ADD_EXECUTABLE(AppCollisionInterfaceDemo - CollisionInterfaceDemo.cpp - CollisionInterfaceDemo.h - main.cpp - ) - ENDIF() - IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppCollisionInterfaceDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppCollisionInterfaceDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ENDIF(WIN32) -ELSE (USE_GLUT) - INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL - ) - - LINK_LIBRARIES( - OpenGLSupport BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - ADD_EXECUTABLE(AppCollisionInterfaceDemo - WIN32 - CollisionInterfaceDemo.cpp - CollisionInterfaceDemo.h - Win32CollisionInterfaceDemo.cpp - ../OpenGL/Win32AppMain.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ENDIF (USE_GLUT) - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppCollisionInterfaceDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppCollisionInterfaceDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppCollisionInterfaceDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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 +######################################################## + + +IF (USE_GLUT) + INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL + ) + + LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + IF (WIN32) + ADD_EXECUTABLE(AppCollisionInterfaceDemo + CollisionInterfaceDemo.cpp + CollisionInterfaceDemo.h + main.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) + ELSE() + ADD_EXECUTABLE(AppCollisionInterfaceDemo + CollisionInterfaceDemo.cpp + CollisionInterfaceDemo.h + main.cpp + ) + ENDIF() + IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppCollisionInterfaceDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppCollisionInterfaceDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ENDIF(WIN32) +ELSE (USE_GLUT) + INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL + ) + + LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + ADD_EXECUTABLE(AppCollisionInterfaceDemo + WIN32 + CollisionInterfaceDemo.cpp + CollisionInterfaceDemo.h + Win32CollisionInterfaceDemo.cpp + ../OpenGL/Win32AppMain.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ENDIF (USE_GLUT) + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppCollisionInterfaceDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppCollisionInterfaceDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppCollisionInterfaceDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h b/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h index d8e2124c8..9c0d61130 100644 --- a/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h +++ b/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h @@ -1,42 +1,42 @@ -/* -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 COLLISION_INTERFACE_DEMO_H -#define COLLISION_INTERFACE_DEMO_H - -#ifdef _WINDOWS -#include "Win32DemoApplication.h" -#define PlatformDemoApplication Win32DemoApplication -#else -#include "GlutDemoApplication.h" -#define PlatformDemoApplication GlutDemoApplication -#endif - -///CollisionInterfaceDemo shows how to use the collision detection without dynamics (btCollisionWorld/CollisionObject) -class CollisionInterfaceDemo : public PlatformDemoApplication -{ - public: - - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void clientResetScene(); - -}; - -#endif //COLLISION_INTERFACE_DEMO_H - +/* +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 COLLISION_INTERFACE_DEMO_H +#define COLLISION_INTERFACE_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +///CollisionInterfaceDemo shows how to use the collision detection without dynamics (btCollisionWorld/CollisionObject) +class CollisionInterfaceDemo : public PlatformDemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void clientResetScene(); + +}; + +#endif //COLLISION_INTERFACE_DEMO_H + diff --git a/Demos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp b/Demos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp index ec2fab45c..c2f59060a 100644 --- a/Demos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp +++ b/Demos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "CollisionInterfaceDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new CollisionInterfaceDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "CollisionInterfaceDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new CollisionInterfaceDemo(); +} + +#endif diff --git a/Demos/CollisionInterfaceDemo/main.cpp b/Demos/CollisionInterfaceDemo/main.cpp index 4c0f65120..f8cbb77df 100644 --- a/Demos/CollisionInterfaceDemo/main.cpp +++ b/Demos/CollisionInterfaceDemo/main.cpp @@ -1,19 +1,19 @@ - -#include "CollisionInterfaceDemo.h" -#include "GlutStuff.h" -#include "btBulletDynamicsCommon.h" - -int screenWidth = 640; -int screenHeight = 480; - - -int main(int argc,char** argv) -{ - CollisionInterfaceDemo* collisionInterfaceDemo = new CollisionInterfaceDemo(); - - collisionInterfaceDemo->initPhysics(); - - collisionInterfaceDemo->clientResetScene(); - - return glutmain(argc, argv,screenWidth,screenHeight,"Collision Interface Demo",collisionInterfaceDemo); -} + +#include "CollisionInterfaceDemo.h" +#include "GlutStuff.h" +#include "btBulletDynamicsCommon.h" + +int screenWidth = 640; +int screenHeight = 480; + + +int main(int argc,char** argv) +{ + CollisionInterfaceDemo* collisionInterfaceDemo = new CollisionInterfaceDemo(); + + collisionInterfaceDemo->initPhysics(); + + collisionInterfaceDemo->clientResetScene(); + + return glutmain(argc, argv,screenWidth,screenHeight,"Collision Interface Demo",collisionInterfaceDemo); +} diff --git a/Demos/ConcaveConvexcastDemo/CMakeLists.txt b/Demos/ConcaveConvexcastDemo/CMakeLists.txt index 3a48e8080..bf0c2bc31 100644 --- a/Demos/ConcaveConvexcastDemo/CMakeLists.txt +++ b/Demos/ConcaveConvexcastDemo/CMakeLists.txt @@ -1,48 +1,48 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppConcaveConvexCastDemo - ConcaveConvexcastDemo.cpp - main.cpp -) - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppConcaveConvexCastDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppConcaveConvexCastDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppConcaveConvexCastDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppConcaveConvexCastDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppConcaveConvexCastDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppConcaveConvexCastDemo + ConcaveConvexcastDemo.cpp + main.cpp +) + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppConcaveConvexCastDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppConcaveConvexCastDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppConcaveConvexCastDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppConcaveConvexCastDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppConcaveConvexCastDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp b/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp index 9e10654ba..95094829a 100644 --- a/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp +++ b/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp @@ -1,516 +1,516 @@ -/* -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 "LinearMath/btIDebugDraw.h" -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "GLDebugDrawer.h" -#include "ConcaveConvexcastDemo.h" -#include "GL_ShapeDrawer.h" -#include "GlutStuff.h" - -#define NUM_DYNAMIC_BOXES_X 30 -#define NUM_DYNAMIC_BOXES_Y 30 - -static btVector3* gVertices=0; -static int* gIndices=0; -static btBvhTriangleMeshShape* trimeshShape =0; -static btRigidBody* staticBody = 0; -static float waveheight = 5.f; - -const float TRIANGLE_SIZE=8.f; - - -/* Scrolls back and forth over terrain */ -#define NUMRAYS_IN_BAR 100 -class btConvexcastBatch -{ -public: - btVector3 source[NUMRAYS_IN_BAR]; - btVector3 dest[NUMRAYS_IN_BAR]; - btVector3 direction[NUMRAYS_IN_BAR]; - btVector3 hit_com[NUMRAYS_IN_BAR]; - btVector3 hit_surface[NUMRAYS_IN_BAR]; - btScalar hit_fraction[NUMRAYS_IN_BAR]; - btVector3 normal[NUMRAYS_IN_BAR]; - - int frame_counter; - int ms; - int sum_ms; - int sum_ms_samples; - int min_ms; - int max_ms; - -#ifdef USE_BT_CLOCK - btClock frame_timer; -#endif //USE_BT_CLOCK - - btScalar dx; - btScalar min_x; - btScalar max_x; - btScalar min_y; - btScalar max_y; - btScalar sign; - - btVector3 boxShapeHalfExtents; - btBoxShape boxShape; - - btConvexcastBatch () : boxShape(btVector3(0.0, 0.0, 0.0)) - { - ms = 0; - max_ms = 0; - min_ms = 9999.0; - sum_ms_samples = 0; - sum_ms = 0; - } - - btConvexcastBatch (bool unused, btScalar ray_length, btScalar min_z, btScalar max_z, btScalar min_y , btScalar max_y ) : boxShape(btVector3(0.0, 0.0, 0.0)) - { - boxShapeHalfExtents = btVector3(1.0, 1.0, 1.0); - boxShape = btBoxShape(boxShapeHalfExtents); - frame_counter = 0; - ms = 0; - max_ms = 0; - min_ms = 9999.0; - sum_ms_samples = 0; - sum_ms = 0; - dx = 10.0; - min_x = -40; - max_x = 20; - this->min_y = min_y; - this->max_y = max_y; - sign = 1.0; - btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - btScalar z = (max_z-min_z)/NUMRAYS_IN_BAR * i + min_z; - source[i] = btVector3(min_x, max_y, z); - dest[i] = btVector3(min_x + ray_length, min_y, z); - normal[i] = btVector3(1.0, 0.0, 0.0); - } - } - - btConvexcastBatch (btScalar ray_length, btScalar z, btScalar min_y = -1000, btScalar max_y = 10) : boxShape(btVector3(0.0, 0.0, 0.0)) - { - boxShapeHalfExtents = btVector3(1.0, 1.0, 1.0); - boxShape = btBoxShape(boxShapeHalfExtents); - frame_counter = 0; - ms = 0; - max_ms = 0; - min_ms = 9999.0; - sum_ms_samples = 0; - sum_ms = 0; - dx = 10.0; - min_x = -40; - max_x = 20; - this->min_y = min_y; - this->max_y = max_y; - sign = 1.0; - btScalar dalpha = btScalar(2)*SIMD_2_PI/btScalar(NUMRAYS_IN_BAR); - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - btScalar alpha = dalpha * btScalar(i); - // rotate around by alpha degrees y - btTransform tr(btQuaternion(btVector3(0.0, 1.0, 0.0), alpha)); - direction[i] = btVector3(1.0, 0.0, 0.0); - direction[i] = tr * direction[i]; - source[i] = btVector3(min_x, max_y, z); - dest[i] = source[i] + direction[i] * ray_length; - dest[i][1] = min_y; - normal[i] = btVector3(1.0, 0.0, 0.0); - } - } - - void move (btScalar dt) - { - if (dt > (1.0/60.0)) - dt = 1.0/60.0; - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - source[i][0] += dx * dt * sign; - dest[i][0] += dx * dt * sign; - } - if (source[0][0] < min_x) - sign = 1.0; - else if (source[0][0] > max_x) - sign = -1.0; - } - - void cast (btCollisionWorld* cw) - { -#ifdef USE_BT_CLOCK - frame_timer.reset (); -#endif //USE_BT_CLOCK - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - btCollisionWorld::ClosestConvexResultCallback cb(source[i], dest[i]); - btQuaternion qFrom; - btQuaternion qTo; - qFrom.setRotation (btVector3(1.0, 0.0, 0.0), 0.0); - qTo.setRotation (btVector3(1.0, 0.0, 0.0), 0.7); - btTransform from(qFrom, source[i]); - btTransform to(qTo, dest[i]); - cw->convexSweepTest (&boxShape, from, to, cb); - if (cb.hasHit ()) - { - hit_surface[i] = cb.m_hitPointWorld; - hit_com[i].setInterpolate3(source[i], dest[i], cb.m_closestHitFraction); - hit_fraction[i] = cb.m_closestHitFraction; - normal[i] = cb.m_hitNormalWorld; - normal[i].normalize (); - } else { - hit_com[i] = dest[i]; - hit_surface[i] = dest[i]; - hit_fraction[i] = 1.0f; - normal[i] = btVector3(1.0, 0.0, 0.0); - } - - } -#ifdef USE_BT_CLOCK - ms += frame_timer.getTimeMilliseconds (); -#endif //USE_BT_CLOCK - frame_counter++; - if (frame_counter > 50) - { - min_ms = ms < min_ms ? ms : min_ms; - max_ms = ms > max_ms ? ms : max_ms; - sum_ms += ms; - sum_ms_samples++; - btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; - printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms); - ms = 0; - frame_counter = 0; - } - } - - - void drawCube (const btTransform& T) - { - btScalar m[16]; - T.getOpenGLMatrix (&m[0]); - glPushMatrix (); -#ifdef BT_USE_DOUBLE_PRECISION - glMultMatrixd (&m[0]); - glScaled (2.0 * boxShapeHalfExtents[0], 2.0 * boxShapeHalfExtents[1], 2.0 * boxShapeHalfExtents[2]); -#else - glMultMatrixf (&m[0]); - glScalef (2.0 * boxShapeHalfExtents[0], 2.0 * boxShapeHalfExtents[1], 2.0 * boxShapeHalfExtents[2]); -#endif //BT_USE_DOUBLE_PRECISION - glutSolidCube (1.0); - glPopMatrix (); - } - - void draw () - { - glDisable (GL_LIGHTING); - glColor3f (0.0, 1.0, 0.0); - glBegin (GL_LINES); - int i; - for (i = 0; i < NUMRAYS_IN_BAR; i++) - { - glVertex3f (source[i][0], source[i][1], source[i][2]); - glVertex3f (hit_com[i][0], hit_com[i][1], hit_com[i][2]); - } - glColor3f (1.0, 1.0, 1.0); - glBegin (GL_LINES); - btScalar normal_scale = 10.0; // easier to see if this is big - for (i = 0; i < NUMRAYS_IN_BAR; i++) - { - glVertex3f (hit_surface[i][0], hit_surface[i][1], hit_surface[i][2]); - glVertex3f (hit_surface[i][0] + normal_scale * normal[i][0], hit_surface[i][1] + normal_scale * normal[i][1], hit_surface[i][2] + normal_scale * normal[i][2]); - } - glEnd (); - glColor3f (0.0, 1.0, 1.0); - btQuaternion qFrom; - btQuaternion qTo; - qFrom.setRotation (btVector3(1.0, 0.0, 0.0), 0.0); - qTo.setRotation (btVector3(1.0, 0.0, 0.0), 0.7); - for ( i = 0; i < NUMRAYS_IN_BAR; i++) - { - btTransform from(qFrom, source[i]); - btTransform to(qTo, dest[i]); - btVector3 linVel, angVel; - btTransformUtil::calculateVelocity (from, to, 1.0, linVel, angVel); - btTransform T; - btTransformUtil::integrateTransform (from, linVel, angVel, hit_fraction[i], T); - drawCube (T); - } - glEnable (GL_LIGHTING); - } -}; - - -static btConvexcastBatch convexcastBatch; - - - - - -const int NUM_VERTS_X = 30; -const int NUM_VERTS_Y = 30; -const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - -void ConcaveConvexcastDemo::setVertexPositions(float waveheight, float offset) -{ - int i; - int j; - - for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->setActivationState(DISABLE_DEACTIVATION); - } else - { - staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->forceActivationState(ACTIVE_TAG); - } - } - - DemoApplication::keyboardCallback(key,x,y); - -} - -void ConcaveConvexcastDemo::initPhysics() -{ - #define TRISIZE 10.f - - setCameraDistance(100.f); - - - int vertStride = sizeof(btVector3); - int indexStride = 3*sizeof(int); - - - const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); - - gVertices = new btVector3[totalVerts]; - gIndices = new int[totalTriangles*3]; - - int i; - - - setVertexPositions(waveheight,0.f); - - int index=0; - for ( i=0;isetCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); - - //enable custom material callback - staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - - convexcastBatch = btConvexcastBatch (40.0, 0.0, -10.0,80.0); - //convexcastBatch = btConvexcastBatch (true, 40.0, -50.0, 50.0); -} - -void ConcaveConvexcastDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - if (m_animatedMesh) - { - static float offset=0.f; - offset+=0.01f; - - - - int i; - int j; - btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); - btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); - - for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); - - - //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - } - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - convexcastBatch.move (dt); - convexcastBatch.cast (m_dynamicsWorld); - renderme(); - convexcastBatch.draw (); - glFlush(); - glutSwapBuffers(); - -} - - - - -void ConcaveConvexcastDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - convexcastBatch.draw (); - glFlush(); - glutSwapBuffers(); -} - - - -void ConcaveConvexcastDemo::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;jmin_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar z = (max_z-min_z)/NUMRAYS_IN_BAR * i + min_z; + source[i] = btVector3(min_x, max_y, z); + dest[i] = btVector3(min_x + ray_length, min_y, z); + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + btConvexcastBatch (btScalar ray_length, btScalar z, btScalar min_y = -1000, btScalar max_y = 10) : boxShape(btVector3(0.0, 0.0, 0.0)) + { + boxShapeHalfExtents = btVector3(1.0, 1.0, 1.0); + boxShape = btBoxShape(boxShapeHalfExtents); + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = -40; + max_x = 20; + this->min_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = btScalar(2)*SIMD_2_PI/btScalar(NUMRAYS_IN_BAR); + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar alpha = dalpha * btScalar(i); + // rotate around by alpha degrees y + btTransform tr(btQuaternion(btVector3(0.0, 1.0, 0.0), alpha)); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = tr * direction[i]; + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i] * ray_length; + dest[i][1] = min_y; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > (1.0/60.0)) + dt = 1.0/60.0; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btCollisionWorld::ClosestConvexResultCallback cb(source[i], dest[i]); + btQuaternion qFrom; + btQuaternion qTo; + qFrom.setRotation (btVector3(1.0, 0.0, 0.0), 0.0); + qTo.setRotation (btVector3(1.0, 0.0, 0.0), 0.7); + btTransform from(qFrom, source[i]); + btTransform to(qTo, dest[i]); + cw->convexSweepTest (&boxShape, from, to, cb); + if (cb.hasHit ()) + { + hit_surface[i] = cb.m_hitPointWorld; + hit_com[i].setInterpolate3(source[i], dest[i], cb.m_closestHitFraction); + hit_fraction[i] = cb.m_closestHitFraction; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit_com[i] = dest[i]; + hit_surface[i] = dest[i]; + hit_fraction[i] = 1.0f; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } + } + + + void drawCube (const btTransform& T) + { + btScalar m[16]; + T.getOpenGLMatrix (&m[0]); + glPushMatrix (); +#ifdef BT_USE_DOUBLE_PRECISION + glMultMatrixd (&m[0]); + glScaled (2.0 * boxShapeHalfExtents[0], 2.0 * boxShapeHalfExtents[1], 2.0 * boxShapeHalfExtents[2]); +#else + glMultMatrixf (&m[0]); + glScalef (2.0 * boxShapeHalfExtents[0], 2.0 * boxShapeHalfExtents[1], 2.0 * boxShapeHalfExtents[2]); +#endif //BT_USE_DOUBLE_PRECISION + glutSolidCube (1.0); + glPopMatrix (); + } + + void draw () + { + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit_com[i][0], hit_com[i][1], hit_com[i][2]); + } + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + btScalar normal_scale = 10.0; // easier to see if this is big + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (hit_surface[i][0], hit_surface[i][1], hit_surface[i][2]); + glVertex3f (hit_surface[i][0] + normal_scale * normal[i][0], hit_surface[i][1] + normal_scale * normal[i][1], hit_surface[i][2] + normal_scale * normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + btQuaternion qFrom; + btQuaternion qTo; + qFrom.setRotation (btVector3(1.0, 0.0, 0.0), 0.0); + qTo.setRotation (btVector3(1.0, 0.0, 0.0), 0.7); + for ( i = 0; i < NUMRAYS_IN_BAR; i++) + { + btTransform from(qFrom, source[i]); + btTransform to(qTo, dest[i]); + btVector3 linVel, angVel; + btTransformUtil::calculateVelocity (from, to, 1.0, linVel, angVel); + btTransform T; + btTransformUtil::integrateTransform (from, linVel, angVel, hit_fraction[i], T); + drawCube (T); + } + glEnable (GL_LIGHTING); + } +}; + + +static btConvexcastBatch convexcastBatch; + + + + + +const int NUM_VERTS_X = 30; +const int NUM_VERTS_Y = 30; +const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void ConcaveConvexcastDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void ConcaveConvexcastDemo::initPhysics() +{ + #define TRISIZE 10.f + + setCameraDistance(100.f); + + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + + int i; + + + setVertexPositions(waveheight,0.f); + + int index=0; + for ( i=0;isetCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + convexcastBatch = btConvexcastBatch (40.0, 0.0, -10.0,80.0); + //convexcastBatch = btConvexcastBatch (true, 40.0, -50.0, 50.0); +} + +void ConcaveConvexcastDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + + + int i; + int j; + btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); + btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); + + for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); + + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + convexcastBatch.move (dt); + convexcastBatch.cast (m_dynamicsWorld); + renderme(); + convexcastBatch.draw (); + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveConvexcastDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + convexcastBatch.draw (); + glFlush(); + glutSwapBuffers(); +} + + + +void ConcaveConvexcastDemo::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_collisionShapes; - - btTriangleIndexVertexArray* m_indexVertexArrays; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - bool m_animatedMesh; - - public: - - ConcaveConvexcastDemo() : m_animatedMesh(true) - { - - } - void initPhysics(); - - void exitPhysics(); - - virtual ~ConcaveConvexcastDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - //to show refit works - void setVertexPositions(float waveheight, float offset); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - ConcaveConvexcastDemo* demo = new ConcaveConvexcastDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - }; -}; - -#endif //CONCAVE_CONVEXCAST_DEMO_H - +/* +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 CONCAVE_CONVEXCAST_DEMO_H +#define CONCAVE_CONVEXCAST_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleIndexVertexArray; + +///ConcaveRaycaseDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class ConcaveConvexcastDemo : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + ConcaveConvexcastDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~ConcaveConvexcastDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + ConcaveConvexcastDemo* demo = new ConcaveConvexcastDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_CONVEXCAST_DEMO_H + diff --git a/Demos/ConcaveDemo/ConcaveDemo.h b/Demos/ConcaveDemo/ConcaveDemo.h index f317cf255..86144c7e8 100644 --- a/Demos/ConcaveDemo/ConcaveDemo.h +++ b/Demos/ConcaveDemo/ConcaveDemo.h @@ -1,91 +1,91 @@ -/* -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 CONCAVE_DEMO_H -#define CONCAVE_DEMO_H - -#ifdef _WINDOWS -#include "Win32DemoApplication.h" -#define PlatformDemoApplication Win32DemoApplication -#else -#include "GlutDemoApplication.h" -#define PlatformDemoApplication GlutDemoApplication -#endif - -#include "LinearMath/btAlignedObjectArray.h" - -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; -class btTriangleIndexVertexArray; - -///ConcaveDemo shows usage of static concave triangle meshes -///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback -class ConcaveDemo : public PlatformDemoApplication -{ - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btTriangleIndexVertexArray* m_indexVertexArrays; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - bool m_animatedMesh; - - public: - - ConcaveDemo() : m_animatedMesh(true) - { - - } - void initPhysics(); - - void exitPhysics(); - - virtual ~ConcaveDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - //to show refit works - void setVertexPositions(float waveheight, float offset); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - ConcaveDemo* demo = new ConcaveDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - }; -}; - -#endif //CONCAVE_DEMO_H - +/* +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 CONCAVE_DEMO_H +#define CONCAVE_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleIndexVertexArray; + +///ConcaveDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class ConcaveDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + ConcaveDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~ConcaveDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + ConcaveDemo* demo = new ConcaveDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_DEMO_H + diff --git a/Demos/ConcaveDemo/Win32ConcaveDemo.cpp b/Demos/ConcaveDemo/Win32ConcaveDemo.cpp index a0c718e5d..26cde62b4 100644 --- a/Demos/ConcaveDemo/Win32ConcaveDemo.cpp +++ b/Demos/ConcaveDemo/Win32ConcaveDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "ConcaveDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new ConcaveDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "ConcaveDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new ConcaveDemo(); +} + +#endif diff --git a/Demos/ConcaveRaycastDemo/CMakeLists.txt b/Demos/ConcaveRaycastDemo/CMakeLists.txt index 9702dbac9..f1cb3478f 100644 --- a/Demos/ConcaveRaycastDemo/CMakeLists.txt +++ b/Demos/ConcaveRaycastDemo/CMakeLists.txt @@ -1,39 +1,39 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -IF (WIN32) - ADD_EXECUTABLE(AppConcaveRayCastDemo - ConcaveRaycastDemo.cpp - main.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) -ELSE() - ADD_EXECUTABLE(AppConcaveRayCastDemo - ConcaveRaycastDemo.cpp - main.cpp - ) -ENDIF() - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppConcaveRayCastDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppConcaveRayCastDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppConcaveRayCastDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +IF (WIN32) + ADD_EXECUTABLE(AppConcaveRayCastDemo + ConcaveRaycastDemo.cpp + main.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) +ELSE() + ADD_EXECUTABLE(AppConcaveRayCastDemo + ConcaveRaycastDemo.cpp + main.cpp + ) +ENDIF() + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppConcaveRayCastDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppConcaveRayCastDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppConcaveRayCastDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp b/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp index e4c0dff13..d1abd1c0c 100644 --- a/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp +++ b/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp @@ -1,493 +1,493 @@ -/* -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 "LinearMath/btIDebugDraw.h" -#include "GLDebugDrawer.h" -#include "ConcaveRaycastDemo.h" -#include "GL_ShapeDrawer.h" -#include "GlutStuff.h" - -//#define BATCH_RAYCASTER - -#ifdef BATCH_RAYCASTER -#include "BulletMultiThreaded/SpuBatchRaycaster.h" -static SpuBatchRaycaster* gBatchRaycaster = NULL; -#endif - -#ifdef USE_LIBSPE2 -#include "BulletMultiThreaded/SpuLibspe2Support.h" -#elif defined (_WIN32) -#include "BulletMultiThreaded/Win32ThreadSupport.h" -#else -//other platforms run the parallel code sequentially (until pthread support or other parallel implementation is added) -#include "BulletMultiThreaded/SequentialThreadSupport.h" -#endif //USE_LIBSPE2 - -static btVector3* gVertices=0; -static int* gIndices=0; -static btBvhTriangleMeshShape* trimeshShape =0; -static btRigidBody* staticBody = 0; -static float waveheight = 5.f; - -const float TRIANGLE_SIZE=8.f; - - -/* Scrolls back and forth over terrain */ -#define NUMRAYS_IN_BAR 100 -class btRaycastBar -{ -public: - btVector3 source[NUMRAYS_IN_BAR]; - btVector3 dest[NUMRAYS_IN_BAR]; - btVector3 direction[NUMRAYS_IN_BAR]; - btVector3 hit[NUMRAYS_IN_BAR]; - btVector3 normal[NUMRAYS_IN_BAR]; - - int frame_counter; - int ms; - int sum_ms; - int sum_ms_samples; - int min_ms; - int max_ms; - -#ifdef USE_BT_CLOCK - btClock frame_timer; -#endif //USE_BT_CLOCK - - btScalar dx; - btScalar min_x; - btScalar max_x; - btScalar min_y; - btScalar max_y; - btScalar sign; - - btRaycastBar () - { - ms = 0; - max_ms = 0; - min_ms = 9999.0; - sum_ms_samples = 0; - sum_ms = 0; - } - - btRaycastBar (bool unused, btScalar ray_length, btScalar min_z, btScalar max_z, btScalar min_y = -10, btScalar max_y = 10) - { - frame_counter = 0; - ms = 0; - max_ms = 0; - min_ms = 9999.0; - sum_ms_samples = 0; - sum_ms = 0; - dx = 10.0; - min_x = -40; - max_x = 20; - this->min_y = min_y; - this->max_y = max_y; - sign = 1.0; - btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - btScalar z = (max_z-min_z)/btScalar(NUMRAYS_IN_BAR) * btScalar(i) + min_z; - source[i] = btVector3(min_x, max_y, z); - dest[i] = btVector3(min_x + ray_length, min_y, z); - normal[i] = btVector3(1.0, 0.0, 0.0); - } - } - - btRaycastBar (btScalar ray_length, btScalar z, btScalar min_y = -1000, btScalar max_y = 10) - { - frame_counter = 0; - ms = 0; - max_ms = 0; - min_ms = 9999.0; - sum_ms_samples = 0; - sum_ms = 0; - dx = 10.0; - min_x = -40; - max_x = 20; - this->min_y = min_y; - this->max_y = max_y; - sign = 1.0; - btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - btScalar alpha = dalpha * i; - // rotate around by alpha degrees y - btTransform tr (btQuaternion (btVector3(0.0, 1.0, 0.0), alpha)); - direction[i] = btVector3(1.0, 0.0, 0.0); - direction[i] = tr* direction[i]; - direction[i] = direction[i] * ray_length; - source[i] = btVector3(min_x, max_y, z); - dest[i] = source[i] + direction[i]; - dest[i][1] = min_y; - normal[i] = btVector3(1.0, 0.0, 0.0); - } - } - - void move (btScalar dt) - { - if (dt > (1.0/60.0)) - dt = 1.0/60.0; - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - source[i][0] += dx * dt * sign; - dest[i][0] += dx * dt * sign; - } - if (source[0][0] < min_x) - sign = 1.0; - else if (source[0][0] > max_x) - sign = -1.0; - } - - void cast (btCollisionWorld* cw) - { -#ifdef USE_BT_CLOCK - frame_timer.reset (); -#endif //USE_BT_CLOCK - -#ifdef BATCH_RAYCASTER - if (!gBatchRaycaster) - return; - - gBatchRaycaster->clearRays (); - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - gBatchRaycaster->addRay (source[i], dest[i]); - } - gBatchRaycaster->performBatchRaycast (); - for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) - { - const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; - hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); - normal[i] = out.hitNormal; - normal[i].normalize (); - } -#else - for (int i = 0; i < NUMRAYS_IN_BAR; i++) - { - btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); - - cw->rayTest (source[i], dest[i], cb); - if (cb.hasHit ()) - { - hit[i] = cb.m_hitPointWorld; - normal[i] = cb.m_hitNormalWorld; - normal[i].normalize (); - } else { - hit[i] = dest[i]; - normal[i] = btVector3(1.0, 0.0, 0.0); - } - - } -#ifdef USE_BT_CLOCK - ms += frame_timer.getTimeMilliseconds (); -#endif //USE_BT_CLOCK - frame_counter++; - if (frame_counter > 50) - { - min_ms = ms < min_ms ? ms : min_ms; - max_ms = ms > max_ms ? ms : max_ms; - sum_ms += ms; - sum_ms_samples++; - btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; - printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms); - ms = 0; - frame_counter = 0; - } -#endif - } - - void draw () - { - glDisable (GL_LIGHTING); - glColor3f (0.0, 1.0, 0.0); - glBegin (GL_LINES); - int i; - - for (i = 0; i < NUMRAYS_IN_BAR; i++) - { - glVertex3f (source[i][0], source[i][1], source[i][2]); - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - } - glEnd (); - glColor3f (1.0, 1.0, 1.0); - glBegin (GL_LINES); - for (i = 0; i < NUMRAYS_IN_BAR; i++) - { - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); - } - glEnd (); - glColor3f (0.0, 1.0, 1.0); - glBegin (GL_POINTS); - for ( i = 0; i < NUMRAYS_IN_BAR; i++) - { - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - } - glEnd (); - glEnable (GL_LIGHTING); - } -}; - - -static btRaycastBar raycastBar; - - -const int NUM_VERTS_X = 30; -const int NUM_VERTS_Y = 30; -const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - -void ConcaveRaycastDemo::setVertexPositions(float waveheight, float offset) -{ - int i; - int j; - - for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->setActivationState(DISABLE_DEACTIVATION); - } else - { - staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->forceActivationState(ACTIVE_TAG); - } - } - - DemoApplication::keyboardCallback(key,x,y); - -} - -void ConcaveRaycastDemo::initPhysics() -{ - #define TRISIZE 10.f - - - - int vertStride = sizeof(btVector3); - int indexStride = 3*sizeof(int); - - - const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); - - gVertices = new btVector3[totalVerts]; - gIndices = new int[totalTriangles*3]; - - int i; - - - setVertexPositions(waveheight,0.f); - - int index=0; - for ( i=0;isetCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); - -#ifdef BATCH_RAYCASTER -int maxNumOutstandingTasks = 4; - -#ifdef USE_WIN32_THREADING - Win32ThreadSupport::Win32ThreadConstructionInfo tci("batch raycast", - processRaycastTask, - createRaycastLocalStoreMemory, - maxNumOutstandingTasks); - m_threadSupportRaycast = new Win32ThreadSupport(tci); - printf("m_threadSupportRaycast = %p\n", m_threadSupportRaycast); -#endif - - gBatchRaycaster = new SpuBatchRaycaster (m_threadSupportRaycast, maxNumOutstandingTasks, m_dynamicsWorld->getCollisionObjectArray(), m_dynamicsWorld->getNumCollisionObjects()); -#endif - - raycastBar = btRaycastBar (4000.0, 0.0); - //raycastBar = btRaycastBar (true, 40.0, -50.0, 50.0); -} - -void ConcaveRaycastDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - if (m_animatedMesh) - { - static float offset=0.f; - offset+=0.01f; - - setVertexPositions(waveheight,offset); - - btVector3 worldMin(-1000,-1000,-1000); - btVector3 worldMax(1000,1000,1000); - - trimeshShape->refitTree(worldMin,worldMax); - - //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - } - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - raycastBar.move (dt); - raycastBar.cast (m_dynamicsWorld); - renderme(); - raycastBar.draw (); - glFlush(); - glutSwapBuffers(); - -} - - - - -void ConcaveRaycastDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - raycastBar.draw (); - glFlush(); - glutSwapBuffers(); -} - - - -void ConcaveRaycastDemo::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;jmin_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar z = (max_z-min_z)/btScalar(NUMRAYS_IN_BAR) * btScalar(i) + min_z; + source[i] = btVector3(min_x, max_y, z); + dest[i] = btVector3(min_x + ray_length, min_y, z); + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + btRaycastBar (btScalar ray_length, btScalar z, btScalar min_y = -1000, btScalar max_y = 10) + { + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = -40; + max_x = 20; + this->min_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar alpha = dalpha * i; + // rotate around by alpha degrees y + btTransform tr (btQuaternion (btVector3(0.0, 1.0, 0.0), alpha)); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = tr* direction[i]; + direction[i] = direction[i] * ray_length; + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i]; + dest[i][1] = min_y; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > (1.0/60.0)) + dt = 1.0/60.0; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + +#ifdef BATCH_RAYCASTER + if (!gBatchRaycaster) + return; + + gBatchRaycaster->clearRays (); + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + gBatchRaycaster->addRay (source[i], dest[i]); + } + gBatchRaycaster->performBatchRaycast (); + for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) + { + const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; + hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); + normal[i] = out.hitNormal; + normal[i].normalize (); + } +#else + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); + + cw->rayTest (source[i], dest[i], cb); + if (cb.hasHit ()) + { + hit[i] = cb.m_hitPointWorld; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit[i] = dest[i]; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } +#endif + } + + void draw () + { + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + glBegin (GL_POINTS); + for ( i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glEnable (GL_LIGHTING); + } +}; + + +static btRaycastBar raycastBar; + + +const int NUM_VERTS_X = 30; +const int NUM_VERTS_Y = 30; +const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void ConcaveRaycastDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void ConcaveRaycastDemo::initPhysics() +{ + #define TRISIZE 10.f + + + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + + int i; + + + setVertexPositions(waveheight,0.f); + + int index=0; + for ( i=0;isetCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + +#ifdef BATCH_RAYCASTER +int maxNumOutstandingTasks = 4; + +#ifdef USE_WIN32_THREADING + Win32ThreadSupport::Win32ThreadConstructionInfo tci("batch raycast", + processRaycastTask, + createRaycastLocalStoreMemory, + maxNumOutstandingTasks); + m_threadSupportRaycast = new Win32ThreadSupport(tci); + printf("m_threadSupportRaycast = %p\n", m_threadSupportRaycast); +#endif + + gBatchRaycaster = new SpuBatchRaycaster (m_threadSupportRaycast, maxNumOutstandingTasks, m_dynamicsWorld->getCollisionObjectArray(), m_dynamicsWorld->getNumCollisionObjects()); +#endif + + raycastBar = btRaycastBar (4000.0, 0.0); + //raycastBar = btRaycastBar (true, 40.0, -50.0, 50.0); +} + +void ConcaveRaycastDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + setVertexPositions(waveheight,offset); + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + + trimeshShape->refitTree(worldMin,worldMax); + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + raycastBar.move (dt); + raycastBar.cast (m_dynamicsWorld); + renderme(); + raycastBar.draw (); + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveRaycastDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + raycastBar.draw (); + glFlush(); + glutSwapBuffers(); +} + + + +void ConcaveRaycastDemo::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_collisionShapes; - - btTriangleIndexVertexArray* m_indexVertexArrays; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - class btThreadSupportInterface* m_threadSupportRaycast; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - bool m_animatedMesh; - - public: - - ConcaveRaycastDemo() : m_animatedMesh(false) - { - - } - void initPhysics(); - - void exitPhysics(); - - virtual ~ConcaveRaycastDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - //to show refit works - void setVertexPositions(float waveheight, float offset); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - ConcaveRaycastDemo* demo = new ConcaveRaycastDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - }; -}; - -#endif //CONCAVE_RAYCAST_DEMO_H - +/* +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 CONCAVE_RAYCAST_DEMO_H +#define CONCAVE_RAYCAST_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleIndexVertexArray; + +///ConcaveRaycastDemo shows usage of static concave triangle meshes +class ConcaveRaycastDemo : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + class btThreadSupportInterface* m_threadSupportRaycast; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + ConcaveRaycastDemo() : m_animatedMesh(false) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~ConcaveRaycastDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + ConcaveRaycastDemo* demo = new ConcaveRaycastDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_RAYCAST_DEMO_H + diff --git a/Demos/ConstraintDemo/CMakeLists.txt b/Demos/ConstraintDemo/CMakeLists.txt index a02792f2c..d11359c26 100644 --- a/Demos/ConstraintDemo/CMakeLists.txt +++ b/Demos/ConstraintDemo/CMakeLists.txt @@ -1,69 +1,69 @@ -# 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 -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter -) - - -IF (USE_GLUT) - LINK_LIBRARIES( - OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - ADD_EXECUTABLE(AppConstraintDemo - ConstraintDemo.cpp - ConstraintDemo.h - main.cpp - ) - IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppConcaveDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppConcaveDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ENDIF(WIN32) -ELSE (USE_GLUT) - LINK_LIBRARIES( - OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - ADD_EXECUTABLE(AppConstraintDemo - WIN32 - ../OpenGL/Win32AppMain.cpp - Win32ConstraintDemo.cpp - ConstraintDemo.cpp - ConstraintDemo.h - ) -ENDIF (USE_GLUT) - - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppConstraintDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppConstraintDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppConstraintDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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 +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter +) + + +IF (USE_GLUT) + LINK_LIBRARIES( + OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + ADD_EXECUTABLE(AppConstraintDemo + ConstraintDemo.cpp + ConstraintDemo.h + main.cpp + ) + IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppConcaveDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppConcaveDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ENDIF(WIN32) +ELSE (USE_GLUT) + LINK_LIBRARIES( + OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + ADD_EXECUTABLE(AppConstraintDemo + WIN32 + ../OpenGL/Win32AppMain.cpp + Win32ConstraintDemo.cpp + ConstraintDemo.cpp + ConstraintDemo.h + ) +ENDIF (USE_GLUT) + + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppConstraintDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppConstraintDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppConstraintDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/ConstraintDemo/ConstraintDemo.h b/Demos/ConstraintDemo/ConstraintDemo.h index 8696a5d5c..6b73e0784 100644 --- a/Demos/ConstraintDemo/ConstraintDemo.h +++ b/Demos/ConstraintDemo/ConstraintDemo.h @@ -1,72 +1,72 @@ -/* -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 CONSTRAINT_DEMO_H -#define CONSTRAINT_DEMO_H - -#ifdef _WINDOWS -#include "Win32DemoApplication.h" -#define PlatformDemoApplication Win32DemoApplication -#else -#include "GlutDemoApplication.h" -#define PlatformDemoApplication GlutDemoApplication -#endif - -///ConstraintDemo shows how to create a constraint, like Hinge or btGenericD6constraint -class ConstraintDemo : public PlatformDemoApplication -{ - //keep track of variables to delete memory at the end - btAlignedObjectArray m_collisionShapes; - - class btBroadphaseInterface* m_overlappingPairCache; - - class btCollisionDispatcher* m_dispatcher; - - class btConstraintSolver* m_constraintSolver; - - class btDefaultCollisionConfiguration* m_collisionConfiguration; - - void setupEmptyDynamicsWorld(); - - public: - - - virtual ~ConstraintDemo(); - - void initPhysics(); - - void exitPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - ConstraintDemo* demo = new ConstraintDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } - - virtual void keyboardCallback(unsigned char key, int x, int y); - - // for cone-twist motor driving - float m_Time; - class btConeTwistConstraint* m_ctc; - -}; - -#endif //CONSTRAINT_DEMO_H - +/* +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 CONSTRAINT_DEMO_H +#define CONSTRAINT_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +///ConstraintDemo shows how to create a constraint, like Hinge or btGenericD6constraint +class ConstraintDemo : public PlatformDemoApplication +{ + //keep track of variables to delete memory at the end + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + void setupEmptyDynamicsWorld(); + + public: + + + virtual ~ConstraintDemo(); + + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + ConstraintDemo* demo = new ConstraintDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + + virtual void keyboardCallback(unsigned char key, int x, int y); + + // for cone-twist motor driving + float m_Time; + class btConeTwistConstraint* m_ctc; + +}; + +#endif //CONSTRAINT_DEMO_H + diff --git a/Demos/ConstraintDemo/Win32ConstraintDemo.cpp b/Demos/ConstraintDemo/Win32ConstraintDemo.cpp index 66abb66e1..552c263cd 100644 --- a/Demos/ConstraintDemo/Win32ConstraintDemo.cpp +++ b/Demos/ConstraintDemo/Win32ConstraintDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "ConstraintDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new ConstraintDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "ConstraintDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new ConstraintDemo(); +} + +#endif diff --git a/Demos/ConstraintDemo/main.cpp b/Demos/ConstraintDemo/main.cpp index dcc1add68..c5e853846 100644 --- a/Demos/ConstraintDemo/main.cpp +++ b/Demos/ConstraintDemo/main.cpp @@ -1,20 +1,20 @@ -#include "ConstraintDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" - -int main(int argc,char** argv) -{ - - GLDebugDrawer gDebugDrawer; - - ConstraintDemo* constraintDemo = new ConstraintDemo(); - - - constraintDemo->initPhysics(); - constraintDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - constraintDemo->setDebugMode(btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits); - - return glutmain(argc, argv,640,480,"Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/",constraintDemo); -} - +#include "ConstraintDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +int main(int argc,char** argv) +{ + + GLDebugDrawer gDebugDrawer; + + ConstraintDemo* constraintDemo = new ConstraintDemo(); + + + constraintDemo->initPhysics(); + constraintDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + constraintDemo->setDebugMode(btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits); + + return glutmain(argc, argv,640,480,"Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/",constraintDemo); +} + diff --git a/Demos/ContinuousConvexCollision/CMakeLists.txt b/Demos/ContinuousConvexCollision/CMakeLists.txt index d6764fb6d..bca97504a 100644 --- a/Demos/ContinuousConvexCollision/CMakeLists.txt +++ b/Demos/ContinuousConvexCollision/CMakeLists.txt @@ -1,47 +1,47 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppContinuousConvexCollisionDemo - ContinuousConvexCollisionDemo.cpp -) - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppContinuousConvexCollisionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppContinuousConvexCollisionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppContinuousConvexCollisionDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppContinuousConvexCollisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppContinuousConvexCollisionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppContinuousConvexCollisionDemo + ContinuousConvexCollisionDemo.cpp +) + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppContinuousConvexCollisionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppContinuousConvexCollisionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppContinuousConvexCollisionDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppContinuousConvexCollisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppContinuousConvexCollisionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h b/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h index dd591332c..3f08900a4 100644 --- a/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h +++ b/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h @@ -1,36 +1,36 @@ -/* -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 CONTINUOUS_CONVEX_COLLISION_DEMO_H -#define CONTINUOUS_CONVEX_COLLISION_DEMO_H - - - -///ContinuousConvexCollisionDemo shows the working of the continuous collision detection, including linear and angular motion -#include "GlutDemoApplication.h" -class btContinuousConvexCollisionDemo : public GlutDemoApplication -{ - public: - - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - -}; - -#endif //CONTINUOUS_CONVEX_COLLISION_DEMO_H - +/* +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 CONTINUOUS_CONVEX_COLLISION_DEMO_H +#define CONTINUOUS_CONVEX_COLLISION_DEMO_H + + + +///ContinuousConvexCollisionDemo shows the working of the continuous collision detection, including linear and angular motion +#include "GlutDemoApplication.h" +class btContinuousConvexCollisionDemo : public GlutDemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + +}; + +#endif //CONTINUOUS_CONVEX_COLLISION_DEMO_H + diff --git a/Demos/ConvexDecompositionDemo/CMakeLists.txt b/Demos/ConvexDecompositionDemo/CMakeLists.txt index cc3b788c2..03ac8189c 100644 --- a/Demos/ConvexDecompositionDemo/CMakeLists.txt +++ b/Demos/ConvexDecompositionDemo/CMakeLists.txt @@ -1,82 +1,82 @@ -# 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. - - -# This is the variable for Windows. I use this to define the root of my directory structure. -SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) - -# You shouldn't have to modify anything below this line -######################################################## - -INCLUDE_DIRECTORIES( -${BULLET_PHYSICS_SOURCE_DIR}/src -${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL -${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter -) - -IF (USE_GLUT) - - LINK_LIBRARIES( - OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ConvexDecomposition ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - ADD_EXECUTABLE(AppConvexDecompositionDemo - main.cpp - ConvexDecompositionDemo.cpp - ConvexDecompositionDemo.h - ) - IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppConvexDecompositionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppConvexDecompositionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ENDIF(WIN32) -ELSE (USE_GLUT) - -LINK_LIBRARIES( - OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ConvexDecomposition ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - ADD_EXECUTABLE(AppConvexDecompositionDemo - WIN32 - ../OpenGL/Win32AppMain.cpp - ConvexDecompositionDemo.cpp - ConvexDecompositionDemo.h - Win32ConvexDecompositionDemo.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) - -ENDIF (USE_GLUT) - -IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ADD_CUSTOM_COMMAND( - TARGET AppConvexDecompositionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/SerializeDemo/testFile.bullet ${CMAKE_CURRENT_BINARY_DIR}/testFile.bullet - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/file.obj ${CMAKE_CURRENT_BINARY_DIR} - ) -ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppConvexDecompositionDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppConvexDecompositionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppConvexDecompositionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") -ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) +# 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. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# You shouldn't have to modify anything below this line +######################################################## + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src +${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL +${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter +) + +IF (USE_GLUT) + + LINK_LIBRARIES( + OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ConvexDecomposition ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + ADD_EXECUTABLE(AppConvexDecompositionDemo + main.cpp + ConvexDecompositionDemo.cpp + ConvexDecompositionDemo.h + ) + IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppConvexDecompositionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppConvexDecompositionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ENDIF(WIN32) +ELSE (USE_GLUT) + +LINK_LIBRARIES( + OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ConvexDecomposition ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + ADD_EXECUTABLE(AppConvexDecompositionDemo + WIN32 + ../OpenGL/Win32AppMain.cpp + ConvexDecompositionDemo.cpp + ConvexDecompositionDemo.h + Win32ConvexDecompositionDemo.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) + +ENDIF (USE_GLUT) + +IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ADD_CUSTOM_COMMAND( + TARGET AppConvexDecompositionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/SerializeDemo/testFile.bullet ${CMAKE_CURRENT_BINARY_DIR}/testFile.bullet + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/file.obj ${CMAKE_CURRENT_BINARY_DIR} + ) +ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppConvexDecompositionDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppConvexDecompositionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppConvexDecompositionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp index 4faadd5d5..83807db7e 100644 --- a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp +++ b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp @@ -1,634 +1,634 @@ -/* -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 "cd_wavefront.h" -#include "ConvexBuilder.h" - -#include "btBulletDynamicsCommon.h" - -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btIDebugDraw.h" -#include "LinearMath/btGeometryUtil.h" -#include "BulletCollision/CollisionShapes/btShapeHull.h" - -//#define TEST_SERIALIZATION -//#define NO_OBJ_TO_BULLET - -#ifdef TEST_SERIALIZATION -#include "LinearMath/btSerializer.h" -#include "btBulletFile.h" -#include "btBulletWorldImporter.h" -#endif - -//#define USE_PARALLEL_DISPATCHER 1 -#ifdef USE_PARALLEL_DISPATCHER -#include "../../Extras/BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" -#include "../../Extras/BulletMultiThreaded/Win32ThreadSupport.h" -#include "../../Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" -#endif//USE_PARALLEL_DISPATCHER - - - - - -#include "GLDebugFont.h" -#include //printf debugging - - -#include "ConvexDecompositionDemo.h" -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" - - -btVector3 centroid=btVector3(0,0,0); -btVector3 convexDecompositionObjectOffset(10,0,0); - -#define CUBE_HALF_EXTENTS 4 - - -//////////////////////////////////// - -unsigned int tcount = 0; - - -void ConvexDecompositionDemo::initPhysics() -{ - initPhysics("file.obj"); -} - - - -///MyContactCallback is just an example to show how to get access to the child shape that collided -bool MyContactCallback ( - btManifoldPoint& cp, - const btCollisionObject* colObj0, - int partId0, - int index0, - const btCollisionObject* colObj1, - int partId1, - int index1) -{ - - if (colObj0->getRootCollisionShape()->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) - { - btCompoundShape* compound = (btCompoundShape*)colObj0->getRootCollisionShape(); - btCollisionShape* childShape; - childShape = compound->getChildShape(index0); - } - - if (colObj1->getRootCollisionShape()->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) - { - btCompoundShape* compound = (btCompoundShape*)colObj1->getRootCollisionShape(); - btCollisionShape* childShape; - childShape = compound->getChildShape(index1); - } - - return true; -} - - -void ConvexDecompositionDemo::setupEmptyDynamicsWorld() -{ -m_collisionConfiguration = new btDefaultCollisionConfiguration(); - -#ifdef USE_PARALLEL_DISPATCHER -#ifdef USE_WIN32_THREADING - - int maxNumOutstandingTasks = 4;//number of maximum outstanding tasks - Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( - "collision", - processCollisionTask, - createCollisionLocalStoreMemory, - maxNumOutstandingTasks)); -#else -///@todo other platform threading -///Playstation 3 SPU (SPURS) version is available through PS3 Devnet -///Libspe2 SPU support will be available soon -///pthreads version -///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface -#endif - - m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupport,maxNumOutstandingTasks,m_collisionConfiguration); -#else - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); -#endif//USE_PARALLEL_DISPATCHER - - - convexDecompositionObjectOffset.setValue(10,0,0); - - btVector3 worldAabbMin(-10000,-10000,-10000); - btVector3 worldAabbMax(10000,10000,10000); - - m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); - //m_broadphase = new btSimpleBroadphase(); - - m_solver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - -#ifdef USE_PARALLEL_DISPATCHER - m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; -#endif //USE_PARALLEL_DISPATCHER - -} - -void ConvexDecompositionDemo::initPhysics(const char* filename) -{ - - - gContactAddedCallback = &MyContactCallback; - - setupEmptyDynamicsWorld(); - - setTexturing(true); - setShadows(true); - - setCameraDistance(26.f); - - -#ifndef NO_OBJ_TO_BULLET - - ConvexDecomposition::WavefrontObj wo; - - tcount = wo.loadObj(filename); - - if (!tcount) - { - //when running this app from visual studio, the default starting folder is different, so make a second attempt... - tcount = wo.loadObj("../../file.obj"); - } - if (!tcount) - { - //cmake generated msvc files need 4 levels deep back... so make a 3rd attempt... - tcount = wo.loadObj("../../../../file.obj"); - } - - - - - - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,-4.5,0)); - - btCollisionShape* boxShape = new btBoxShape(btVector3(30,2,30)); - m_collisionShapes.push_back(boxShape); - localCreateRigidBody(0.f,startTransform,boxShape); - - class MyConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface - { - ConvexDecompositionDemo* m_convexDemo; - - public: - - btAlignedObjectArray m_convexShapes; - btAlignedObjectArray m_convexCentroids; - - MyConvexDecomposition (FILE* outputFile,ConvexDecompositionDemo* demo) - :m_convexDemo(demo), - mBaseCount(0), - mHullCount(0), - mOutputFile(outputFile) - - { - } - - virtual void ConvexDecompResult(ConvexDecomposition::ConvexResult &result) - { - - btTriangleMesh* trimesh = new btTriangleMesh(); - m_convexDemo->m_trimeshes.push_back(trimesh); - - btVector3 localScaling(6.f,6.f,6.f); - - //export data to .obj - printf("ConvexResult. "); - if (mOutputFile) - { - fprintf(mOutputFile,"## Hull Piece %d with %d vertices and %d triangles.\r\n", mHullCount, result.mHullVcount, result.mHullTcount ); - - fprintf(mOutputFile,"usemtl Material%i\r\n",mBaseCount); - fprintf(mOutputFile,"o Object%i\r\n",mBaseCount); - - for (unsigned int i=0; i vertices; - if ( 1 ) - { - //const unsigned int *src = result.mHullIndices; - for (unsigned int i=0; iaddTriangle(vertex0,vertex1,vertex2); - - index0+=mBaseCount; - index1+=mBaseCount; - index2+=mBaseCount; - - fprintf(mOutputFile,"f %d %d %d\r\n", index0+1, index1+1, index2+1 ); - } - } - - // float mass = 1.f; - //float collisionMargin = 0.01f; - -//this is a tools issue: due to collision margin, convex objects overlap, compensate for it here: -//#define SHRINK_OBJECT_INWARDS 1 -#ifdef SHRINK_OBJECT_INWARDS - - - std::vector planeEquations; - btGeometryUtil::getPlaneEquationsFromVertices(vertices,planeEquations); - - std::vector shiftedPlaneEquations; - for (int p=0;p shiftedVertices; - btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations,shiftedVertices); - - - btConvexHullShape* convexShape = new btConvexHullShape(&(shiftedVertices[0].getX()),shiftedVertices.size()); - -#else //SHRINK_OBJECT_INWARDS - - btConvexHullShape* convexShape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); -#endif - - convexShape->setMargin(0.01f); - m_convexShapes.push_back(convexShape); - m_convexCentroids.push_back(centroid); - m_convexDemo->m_collisionShapes.push_back(convexShape); - mBaseCount+=result.mHullVcount; // advance the 'base index' counter. - - - } - } - - int mBaseCount; - int mHullCount; - FILE* mOutputFile; - - }; - - if (tcount) - { - btTriangleMesh* trimesh = new btTriangleMesh(); - m_trimeshes.push_back(trimesh); - - btVector3 localScaling(6.f,6.f,6.f); - - int i; - for ( i=0;iaddTriangle(vertex0,vertex1,vertex2); - } - - - btConvexShape* tmpConvexShape = new btConvexTriangleMeshShape(trimesh); - - printf("old numTriangles= %d\n",wo.mTriCount); - printf("old numIndices = %d\n",wo.mTriCount*3); - printf("old numVertices = %d\n",wo.mVertexCount); - - printf("reducing vertices by creating a convex hull\n"); - - //create a hull approximation - btShapeHull* hull = new btShapeHull(tmpConvexShape); - btScalar margin = tmpConvexShape->getMargin(); - hull->buildHull(margin); - tmpConvexShape->setUserPointer(hull); - - - printf("new numTriangles = %d\n", hull->numTriangles ()); - printf("new numIndices = %d\n", hull->numIndices ()); - printf("new numVertices = %d\n", hull->numVertices ()); - - btConvexHullShape* convexShape = new btConvexHullShape(); - for (i=0;inumVertices();i++) - { - convexShape->addPoint(hull->getVertexPointer()[i]); - } - - delete tmpConvexShape; - delete hull; - - - - m_collisionShapes.push_back(convexShape); - - float mass = 1.f; - - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,2,14)); - - localCreateRigidBody(mass, startTransform,convexShape); - - bool useQuantization = true; - btCollisionShape* concaveShape = new btBvhTriangleMeshShape(trimesh,useQuantization); - startTransform.setOrigin(convexDecompositionObjectOffset); - localCreateRigidBody(0.f,startTransform,concaveShape); - - m_collisionShapes.push_back (concaveShape); - - } - - - if (tcount) - { - - char outputFileName[512]; - strcpy(outputFileName,filename); - char *dot = strstr(outputFileName,"."); - if ( dot ) - *dot = 0; - strcat(outputFileName,"_convex.obj"); - FILE* outputFile = fopen(outputFileName,"wb"); - - unsigned int depth = 5; - float cpercent = 5; - float ppercent = 15; - unsigned int maxv = 16; - float skinWidth = 0.0; - - printf("WavefrontObj num triangles read %i\n",tcount); - ConvexDecomposition::DecompDesc desc; - desc.mVcount = wo.mVertexCount; - desc.mVertices = wo.mVertices; - desc.mTcount = wo.mTriCount; - desc.mIndices = (unsigned int *)wo.mIndices; - desc.mDepth = depth; - desc.mCpercent = cpercent; - desc.mPpercent = ppercent; - desc.mMaxVertices = maxv; - desc.mSkinWidth = skinWidth; - - MyConvexDecomposition convexDecomposition(outputFile,this); - desc.mCallback = &convexDecomposition; - - - - //convexDecomposition.performConvexDecomposition(desc); - - ConvexBuilder cb(desc.mCallback); - cb.process(desc); - //now create some bodies - - if (1) - { - btCompoundShape* compound = new btCompoundShape(false); - m_collisionShapes.push_back (compound); - - btTransform trans; - trans.setIdentity(); - for (int i=0;iaddChildShape(trans,convexShape); - - btRigidBody* body; - body = localCreateRigidBody( 1.0, trans,convexShape); - - } -#if 1 - btScalar mass=10.f; - trans.setOrigin(-convexDecompositionObjectOffset); - btRigidBody* body = localCreateRigidBody( mass, trans,compound); - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - - convexDecompositionObjectOffset.setZ(6); - trans.setOrigin(-convexDecompositionObjectOffset); - body = localCreateRigidBody( mass, trans,compound); - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - - convexDecompositionObjectOffset.setZ(-6); - trans.setOrigin(-convexDecompositionObjectOffset); - body = localCreateRigidBody( mass, trans,compound); - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); -#endif - } - - - if (outputFile) - fclose(outputFile); - - - } - - - -#ifdef TEST_SERIALIZATION - //test serializing this - - int maxSerializeBufferSize = 1024*1024*5; - - btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); - m_dynamicsWorld->serialize(serializer); - - FILE* f2 = fopen("testFile.bullet","wb"); - fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); - fclose(f2); - - exitPhysics(); - - //now try again from the loaded file - setupEmptyDynamicsWorld(); -#endif //TEST_SERIALIZATION - -#endif //NO_OBJ_TO_BULLET - -#ifdef TEST_SERIALIZATION - - btBulletWorldImporter* fileLoader = new btBulletWorldImporter(m_dynamicsWorld); - //fileLoader->setVerboseMode(true); - - fileLoader->loadFile("testFile.bullet"); - //fileLoader->loadFile("testFile64Double.bullet"); - //fileLoader->loadFile("testFile64Single.bullet"); - //fileLoader->loadFile("testFile32Single.bullet"); - - - - -#endif //TEST_SERIALIZATION - -} - -void ConvexDecompositionDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - swapBuffers(); - -} - - - -void ConvexDecompositionDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - - glFlush(); - swapBuffers(); -} - - - - -void ConvexDecompositionDemo::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 (i=0;i //printf debugging + + +#include "ConvexDecompositionDemo.h" +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + + +btVector3 centroid=btVector3(0,0,0); +btVector3 convexDecompositionObjectOffset(10,0,0); + +#define CUBE_HALF_EXTENTS 4 + + +//////////////////////////////////// + +unsigned int tcount = 0; + + +void ConvexDecompositionDemo::initPhysics() +{ + initPhysics("file.obj"); +} + + + +///MyContactCallback is just an example to show how to get access to the child shape that collided +bool MyContactCallback ( + btManifoldPoint& cp, + const btCollisionObject* colObj0, + int partId0, + int index0, + const btCollisionObject* colObj1, + int partId1, + int index1) +{ + + if (colObj0->getRootCollisionShape()->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) + { + btCompoundShape* compound = (btCompoundShape*)colObj0->getRootCollisionShape(); + btCollisionShape* childShape; + childShape = compound->getChildShape(index0); + } + + if (colObj1->getRootCollisionShape()->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) + { + btCompoundShape* compound = (btCompoundShape*)colObj1->getRootCollisionShape(); + btCollisionShape* childShape; + childShape = compound->getChildShape(index1); + } + + return true; +} + + +void ConvexDecompositionDemo::setupEmptyDynamicsWorld() +{ +m_collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER +#ifdef USE_WIN32_THREADING + + int maxNumOutstandingTasks = 4;//number of maximum outstanding tasks + Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else +///@todo other platform threading +///Playstation 3 SPU (SPURS) version is available through PS3 Devnet +///Libspe2 SPU support will be available soon +///pthreads version +///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface +#endif + + m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupport,maxNumOutstandingTasks,m_collisionConfiguration); +#else + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#endif//USE_PARALLEL_DISPATCHER + + + convexDecompositionObjectOffset.setValue(10,0,0); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); + //m_broadphase = new btSimpleBroadphase(); + + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + +#ifdef USE_PARALLEL_DISPATCHER + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; +#endif //USE_PARALLEL_DISPATCHER + +} + +void ConvexDecompositionDemo::initPhysics(const char* filename) +{ + + + gContactAddedCallback = &MyContactCallback; + + setupEmptyDynamicsWorld(); + + setTexturing(true); + setShadows(true); + + setCameraDistance(26.f); + + +#ifndef NO_OBJ_TO_BULLET + + ConvexDecomposition::WavefrontObj wo; + + tcount = wo.loadObj(filename); + + if (!tcount) + { + //when running this app from visual studio, the default starting folder is different, so make a second attempt... + tcount = wo.loadObj("../../file.obj"); + } + if (!tcount) + { + //cmake generated msvc files need 4 levels deep back... so make a 3rd attempt... + tcount = wo.loadObj("../../../../file.obj"); + } + + + + + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-4.5,0)); + + btCollisionShape* boxShape = new btBoxShape(btVector3(30,2,30)); + m_collisionShapes.push_back(boxShape); + localCreateRigidBody(0.f,startTransform,boxShape); + + class MyConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface + { + ConvexDecompositionDemo* m_convexDemo; + + public: + + btAlignedObjectArray m_convexShapes; + btAlignedObjectArray m_convexCentroids; + + MyConvexDecomposition (FILE* outputFile,ConvexDecompositionDemo* demo) + :m_convexDemo(demo), + mBaseCount(0), + mHullCount(0), + mOutputFile(outputFile) + + { + } + + virtual void ConvexDecompResult(ConvexDecomposition::ConvexResult &result) + { + + btTriangleMesh* trimesh = new btTriangleMesh(); + m_convexDemo->m_trimeshes.push_back(trimesh); + + btVector3 localScaling(6.f,6.f,6.f); + + //export data to .obj + printf("ConvexResult. "); + if (mOutputFile) + { + fprintf(mOutputFile,"## Hull Piece %d with %d vertices and %d triangles.\r\n", mHullCount, result.mHullVcount, result.mHullTcount ); + + fprintf(mOutputFile,"usemtl Material%i\r\n",mBaseCount); + fprintf(mOutputFile,"o Object%i\r\n",mBaseCount); + + for (unsigned int i=0; i vertices; + if ( 1 ) + { + //const unsigned int *src = result.mHullIndices; + for (unsigned int i=0; iaddTriangle(vertex0,vertex1,vertex2); + + index0+=mBaseCount; + index1+=mBaseCount; + index2+=mBaseCount; + + fprintf(mOutputFile,"f %d %d %d\r\n", index0+1, index1+1, index2+1 ); + } + } + + // float mass = 1.f; + //float collisionMargin = 0.01f; + +//this is a tools issue: due to collision margin, convex objects overlap, compensate for it here: +//#define SHRINK_OBJECT_INWARDS 1 +#ifdef SHRINK_OBJECT_INWARDS + + + std::vector planeEquations; + btGeometryUtil::getPlaneEquationsFromVertices(vertices,planeEquations); + + std::vector shiftedPlaneEquations; + for (int p=0;p shiftedVertices; + btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations,shiftedVertices); + + + btConvexHullShape* convexShape = new btConvexHullShape(&(shiftedVertices[0].getX()),shiftedVertices.size()); + +#else //SHRINK_OBJECT_INWARDS + + btConvexHullShape* convexShape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); +#endif + + convexShape->setMargin(0.01f); + m_convexShapes.push_back(convexShape); + m_convexCentroids.push_back(centroid); + m_convexDemo->m_collisionShapes.push_back(convexShape); + mBaseCount+=result.mHullVcount; // advance the 'base index' counter. + + + } + } + + int mBaseCount; + int mHullCount; + FILE* mOutputFile; + + }; + + if (tcount) + { + btTriangleMesh* trimesh = new btTriangleMesh(); + m_trimeshes.push_back(trimesh); + + btVector3 localScaling(6.f,6.f,6.f); + + int i; + for ( i=0;iaddTriangle(vertex0,vertex1,vertex2); + } + + + btConvexShape* tmpConvexShape = new btConvexTriangleMeshShape(trimesh); + + printf("old numTriangles= %d\n",wo.mTriCount); + printf("old numIndices = %d\n",wo.mTriCount*3); + printf("old numVertices = %d\n",wo.mVertexCount); + + printf("reducing vertices by creating a convex hull\n"); + + //create a hull approximation + btShapeHull* hull = new btShapeHull(tmpConvexShape); + btScalar margin = tmpConvexShape->getMargin(); + hull->buildHull(margin); + tmpConvexShape->setUserPointer(hull); + + + printf("new numTriangles = %d\n", hull->numTriangles ()); + printf("new numIndices = %d\n", hull->numIndices ()); + printf("new numVertices = %d\n", hull->numVertices ()); + + btConvexHullShape* convexShape = new btConvexHullShape(); + for (i=0;inumVertices();i++) + { + convexShape->addPoint(hull->getVertexPointer()[i]); + } + + delete tmpConvexShape; + delete hull; + + + + m_collisionShapes.push_back(convexShape); + + float mass = 1.f; + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,2,14)); + + localCreateRigidBody(mass, startTransform,convexShape); + + bool useQuantization = true; + btCollisionShape* concaveShape = new btBvhTriangleMeshShape(trimesh,useQuantization); + startTransform.setOrigin(convexDecompositionObjectOffset); + localCreateRigidBody(0.f,startTransform,concaveShape); + + m_collisionShapes.push_back (concaveShape); + + } + + + if (tcount) + { + + char outputFileName[512]; + strcpy(outputFileName,filename); + char *dot = strstr(outputFileName,"."); + if ( dot ) + *dot = 0; + strcat(outputFileName,"_convex.obj"); + FILE* outputFile = fopen(outputFileName,"wb"); + + unsigned int depth = 5; + float cpercent = 5; + float ppercent = 15; + unsigned int maxv = 16; + float skinWidth = 0.0; + + printf("WavefrontObj num triangles read %i\n",tcount); + ConvexDecomposition::DecompDesc desc; + desc.mVcount = wo.mVertexCount; + desc.mVertices = wo.mVertices; + desc.mTcount = wo.mTriCount; + desc.mIndices = (unsigned int *)wo.mIndices; + desc.mDepth = depth; + desc.mCpercent = cpercent; + desc.mPpercent = ppercent; + desc.mMaxVertices = maxv; + desc.mSkinWidth = skinWidth; + + MyConvexDecomposition convexDecomposition(outputFile,this); + desc.mCallback = &convexDecomposition; + + + + //convexDecomposition.performConvexDecomposition(desc); + + ConvexBuilder cb(desc.mCallback); + cb.process(desc); + //now create some bodies + + if (1) + { + btCompoundShape* compound = new btCompoundShape(false); + m_collisionShapes.push_back (compound); + + btTransform trans; + trans.setIdentity(); + for (int i=0;iaddChildShape(trans,convexShape); + + btRigidBody* body; + body = localCreateRigidBody( 1.0, trans,convexShape); + + } +#if 1 + btScalar mass=10.f; + trans.setOrigin(-convexDecompositionObjectOffset); + btRigidBody* body = localCreateRigidBody( mass, trans,compound); + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + convexDecompositionObjectOffset.setZ(6); + trans.setOrigin(-convexDecompositionObjectOffset); + body = localCreateRigidBody( mass, trans,compound); + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + convexDecompositionObjectOffset.setZ(-6); + trans.setOrigin(-convexDecompositionObjectOffset); + body = localCreateRigidBody( mass, trans,compound); + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); +#endif + } + + + if (outputFile) + fclose(outputFile); + + + } + + + +#ifdef TEST_SERIALIZATION + //test serializing this + + int maxSerializeBufferSize = 1024*1024*5; + + btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); + m_dynamicsWorld->serialize(serializer); + + FILE* f2 = fopen("testFile.bullet","wb"); + fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); + fclose(f2); + + exitPhysics(); + + //now try again from the loaded file + setupEmptyDynamicsWorld(); +#endif //TEST_SERIALIZATION + +#endif //NO_OBJ_TO_BULLET + +#ifdef TEST_SERIALIZATION + + btBulletWorldImporter* fileLoader = new btBulletWorldImporter(m_dynamicsWorld); + //fileLoader->setVerboseMode(true); + + fileLoader->loadFile("testFile.bullet"); + //fileLoader->loadFile("testFile64Double.bullet"); + //fileLoader->loadFile("testFile64Single.bullet"); + //fileLoader->loadFile("testFile32Single.bullet"); + + + + +#endif //TEST_SERIALIZATION + +} + +void ConvexDecompositionDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + swapBuffers(); + +} + + + +void ConvexDecompositionDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + + glFlush(); + swapBuffers(); +} + + + + +void ConvexDecompositionDemo::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 (i=0;i m_collisionShapes; - - btAlignedObjectArray m_trimeshes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - - virtual void initPhysics(); - - void initPhysics(const char* filename); - - void exitPhysics(); - - virtual ~ConvexDecompositionDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - ConvexDecompositionDemo* demo = new ConvexDecompositionDemo(); - demo->myinit(); - demo->initPhysics("file.obj"); - return demo; - } - - -}; - -#endif //CONVEX_DECOMPOSITION_DEMO_H - - +/* +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 CONVEX_DECOMPOSITION_DEMO_H +#define CONVEX_DECOMPOSITION_DEMO_H + + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleMesh; + +///ConvexDecompositionDemo shows automatic convex decomposition of a concave mesh +class ConvexDecompositionDemo : public PlatformDemoApplication +{ + + void setupEmptyDynamicsWorld(); +public: + + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btAlignedObjectArray m_trimeshes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + virtual void initPhysics(); + + void initPhysics(const char* filename); + + void exitPhysics(); + + virtual ~ConvexDecompositionDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + ConvexDecompositionDemo* demo = new ConvexDecompositionDemo(); + demo->myinit(); + demo->initPhysics("file.obj"); + return demo; + } + + +}; + +#endif //CONVEX_DECOMPOSITION_DEMO_H + + diff --git a/Demos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp index a6ece05e7..d04e1d378 100644 --- a/Demos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp +++ b/Demos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 Erwin Coumans http://bulletphysics.org - -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 "ConvexDecompositionDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new ConvexDecompositionDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2010 Erwin Coumans http://bulletphysics.org + +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 "ConvexDecompositionDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new ConvexDecompositionDemo(); +} + +#endif diff --git a/Demos/ConvexDecompositionDemo/main.cpp b/Demos/ConvexDecompositionDemo/main.cpp index 1f99d83b7..b8f3a6567 100644 --- a/Demos/ConvexDecompositionDemo/main.cpp +++ b/Demos/ConvexDecompositionDemo/main.cpp @@ -1,32 +1,32 @@ - - -#include "ConvexDecompositionDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" - - -GLDebugDrawer gDebugDrawer; - -int main(int argc,char** argv) -{ - const char* filename = "file.obj"; - - - ConvexDecompositionDemo* convexDecompDemo = new ConvexDecompositionDemo(); - - convexDecompDemo->initPhysics(filename); - - convexDecompDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - - - convexDecompDemo->clientResetScene(); - - - - glutmain(argc, argv,640,480,"Bullet Physics Demo. http://www.continuousphysics.com/Bullet/phpBB2/",convexDecompDemo); - - delete convexDecompDemo; - - return 0; -} + + +#include "ConvexDecompositionDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + const char* filename = "file.obj"; + + + ConvexDecompositionDemo* convexDecompDemo = new ConvexDecompositionDemo(); + + convexDecompDemo->initPhysics(filename); + + convexDecompDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + convexDecompDemo->clientResetScene(); + + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://www.continuousphysics.com/Bullet/phpBB2/",convexDecompDemo); + + delete convexDecompDemo; + + return 0; +} diff --git a/Demos/DoublePrecisionDemo/CMakeLists.txt b/Demos/DoublePrecisionDemo/CMakeLists.txt index 2f733dbe5..cda49cb30 100644 --- a/Demos/DoublePrecisionDemo/CMakeLists.txt +++ b/Demos/DoublePrecisionDemo/CMakeLists.txt @@ -1,49 +1,49 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppDoublePrecisionDemo - DoublePrecisionDemo.cpp -) - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppDoublePrecisionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppDoublePrecisionDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppDoublePrecisionDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppDoublePrecisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppDoublePrecisionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppDoublePrecisionDemo + DoublePrecisionDemo.cpp +) + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppDoublePrecisionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppDoublePrecisionDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppDoublePrecisionDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppDoublePrecisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppDoublePrecisionDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp b/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp index 580830a3e..6ba380dc6 100644 --- a/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp +++ b/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp @@ -1,280 +1,280 @@ -/* -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 "GLDebugFont.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;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 - GLDebugDrawString(10.f,yStart,"Double Precision Mode"); - #else - GLDebugDrawString(10.f,yStart,"Single Precision Mode"); - #endif - yStart += yIncr; - - glRasterPos3f(10.0f,yStart,0); - sprintf(buf,"Movement distance in x and y axis = %lf", VERY_SMALL_INCREMENT); - - GLDebugDrawString(10.f,yStart,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); - GLDebugDrawString(10.f,yStart,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); - GLDebugDrawString(10.f,yStart,buf); - yStart += yIncr; - - glRasterPos3f(10.0f,yStart,0); - GLDebugDrawString(10.f,yStart,"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); -} - - +/* +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 "GLDebugFont.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;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 + GLDebugDrawString(10.f,yStart,"Double Precision Mode"); + #else + GLDebugDrawString(10.f,yStart,"Single Precision Mode"); + #endif + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + sprintf(buf,"Movement distance in x and y axis = %lf", VERY_SMALL_INCREMENT); + + GLDebugDrawString(10.f,yStart,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); + GLDebugDrawString(10.f,yStart,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); + GLDebugDrawString(10.f,yStart,buf); + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + GLDebugDrawString(10.f,yStart,"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/DynamicControlDemo/CMakeLists.txt b/Demos/DynamicControlDemo/CMakeLists.txt index 4e32c5a4f..2fc7fda90 100644 --- a/Demos/DynamicControlDemo/CMakeLists.txt +++ b/Demos/DynamicControlDemo/CMakeLists.txt @@ -1,49 +1,49 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppMotorDemo - MotorDemo.cpp - main.cpp -) - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppMotorDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppMotorDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppMotorDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppMotorDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppMotorDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppMotorDemo + MotorDemo.cpp + main.cpp +) + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppMotorDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppMotorDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppMotorDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppMotorDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppMotorDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/DynamicControlDemo/MotorDemo.cpp b/Demos/DynamicControlDemo/MotorDemo.cpp index 674acc61c..ee2184e28 100644 --- a/Demos/DynamicControlDemo/MotorDemo.cpp +++ b/Demos/DynamicControlDemo/MotorDemo.cpp @@ -1,468 +1,468 @@ -/* -Bullet Continuous Collision Detection and Physics Library Copyright (c) 2007 Erwin Coumans -Motor Demo - -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 "GlutStuff.h" -#include "GL_ShapeDrawer.h" - -#include "LinearMath/btIDebugDraw.h" - -#include "GLDebugDrawer.h" -#include "MotorDemo.h" - - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#ifndef M_PI_2 -#define M_PI_2 1.57079632679489661923 -#endif - -#ifndef M_PI_4 -#define M_PI_4 0.785398163397448309616 -#endif - -#ifndef M_PI_8 -#define M_PI_8 0.5 * M_PI_4 -#endif - - -// LOCAL FUNCTIONS - -void vertex(btVector3 &v) -{ - glVertex3d(v.getX(), v.getY(), v.getZ()); -} - -void drawFrame(btTransform &tr) -{ - const float fSize = 1.f; - - glBegin(GL_LINES); - - // x - glColor3f(255.f,0,0); - btVector3 vX = tr*btVector3(fSize,0,0); - vertex(tr.getOrigin()); vertex(vX); - - // y - glColor3f(0,255.f,0); - btVector3 vY = tr*btVector3(0,fSize,0); - vertex(tr.getOrigin()); vertex(vY); - - // z - glColor3f(0,0,255.f); - btVector3 vZ = tr*btVector3(0,0,fSize); - vertex(tr.getOrigin()); vertex(vZ); - - glEnd(); -} - -// /LOCAL FUNCTIONS - - - -#define NUM_LEGS 6 -#define BODYPART_COUNT 2 * NUM_LEGS + 1 -#define JOINT_COUNT BODYPART_COUNT - 1 - -class TestRig -{ - btDynamicsWorld* m_ownerWorld; - btCollisionShape* m_shapes[BODYPART_COUNT]; - btRigidBody* m_bodies[BODYPART_COUNT]; - btTypedConstraint* m_joints[JOINT_COUNT]; - - btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) - { - bool isDynamic = (mass != 0.f); - - btVector3 localInertia(0,0,0); - if (isDynamic) - shape->calculateLocalInertia(mass,localInertia); - - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - m_ownerWorld->addRigidBody(body); - - return body; - } - - -public: - TestRig (btDynamicsWorld* ownerWorld, const btVector3& positionOffset, bool bFixed) - : m_ownerWorld (ownerWorld) - { - btVector3 vUp(0, 1, 0); - - // - // Setup geometry - // - float fBodySize = 0.25f; - float fLegLength = 0.45f; - float fForeLegLength = 0.75f; - m_shapes[0] = new btCapsuleShape(btScalar(fBodySize), btScalar(0.10)); - int i; - for ( i=0; isetDamping(0.05, 0.85); - m_bodies[i]->setDeactivationTime(0.8); - //m_bodies[i]->setSleepingThresholds(1.6, 2.5); - m_bodies[i]->setSleepingThresholds(0.5f, 0.5f); - } - - - // - // Setup the constraints - // - btHingeConstraint* hingeC; - //btConeTwistConstraint* coneC; - - btTransform localA, localB, localC; - - for ( i=0; igetWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; - hingeC = new btHingeConstraint(*m_bodies[0], *m_bodies[1+2*i], localA, localB); - hingeC->setLimit(btScalar(-0.75 * M_PI_4), btScalar(M_PI_8)); - //hingeC->setLimit(btScalar(-0.1), btScalar(0.1)); - m_joints[2*i] = hingeC; - m_ownerWorld->addConstraint(m_joints[2*i], true); - - // knee joints - localA.setIdentity(); localB.setIdentity(); localC.setIdentity(); - localA.getBasis().setEulerZYX(0,-fAngle,0); localA.setOrigin(btVector3(btScalar(fCos*(fBodySize+fLegLength)), btScalar(0.), btScalar(fSin*(fBodySize+fLegLength)))); - localB = m_bodies[1+2*i]->getWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; - localC = m_bodies[2+2*i]->getWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; - hingeC = new btHingeConstraint(*m_bodies[1+2*i], *m_bodies[2+2*i], localB, localC); - //hingeC->setLimit(btScalar(-0.01), btScalar(0.01)); - hingeC->setLimit(btScalar(-M_PI_8), btScalar(0.2)); - m_joints[1+2*i] = hingeC; - m_ownerWorld->addConstraint(m_joints[1+2*i], true); - } - } - - virtual ~TestRig () - { - int i; - - // Remove all constraints - for ( i = 0; i < JOINT_COUNT; ++i) - { - m_ownerWorld->removeConstraint(m_joints[i]); - delete m_joints[i]; m_joints[i] = 0; - } - - // Remove all bodies and shapes - for ( i = 0; i < BODYPART_COUNT; ++i) - { - m_ownerWorld->removeRigidBody(m_bodies[i]); - - delete m_bodies[i]->getMotionState(); - - delete m_bodies[i]; m_bodies[i] = 0; - delete m_shapes[i]; m_shapes[i] = 0; - } - } - - btTypedConstraint** GetJoints() {return &m_joints[0];} - -}; - - - -void motorPreTickCallback (btDynamicsWorld *world, btScalar timeStep) -{ - MotorDemo* motorDemo = (MotorDemo*)world->getWorldUserInfo(); - - motorDemo->setMotorTargets(timeStep); - -} - - - -void MotorDemo::initPhysics() -{ - setTexturing(true); - setShadows(true); - - // Setup the basic world - - m_Time = 0; - m_fCyclePeriod = 2000.f; // in milliseconds - -// m_fMuscleStrength = 0.05f; - // new SIMD solver for joints clips accumulated impulse, so the new limits for the motor - // should be (numberOfsolverIterations * oldLimits) - // currently solver uses 10 iterations, so: - m_fMuscleStrength = 0.5f; - - setCameraDistance(btScalar(5.)); - - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - btVector3 worldAabbMin(-10000,-10000,-10000); - btVector3 worldAabbMax(10000,10000,10000); - m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); - - m_solver = new btSequentialImpulseConstraintSolver; - - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - - m_dynamicsWorld->setInternalTickCallback(motorPreTickCallback,this,true); - - - // Setup a big ground box - { - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); - m_collisionShapes.push_back(groundShape); - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-10,0)); - localCreateRigidBody(btScalar(0.),groundTransform,groundShape); - } - - // Spawn one ragdoll - btVector3 startOffset(1,0.5,0); - spawnTestRig(startOffset, false); - startOffset.setValue(-2,0.5,0); - spawnTestRig(startOffset, true); - - clientResetScene(); -} - - -void MotorDemo::spawnTestRig(const btVector3& startOffset, bool bFixed) -{ - TestRig* rig = new TestRig(m_dynamicsWorld, startOffset, bFixed); - m_rigs.push_back(rig); -} - -void PreStep() -{ - -} - - - - -void MotorDemo::setMotorTargets(btScalar deltaTime) -{ - - float ms = deltaTime*1000000.; - float minFPS = 1000000.f/60.f; - if (ms > minFPS) - ms = minFPS; - - m_Time += ms; - - // - // set per-frame sinusoidal position targets using angular motor (hacky?) - // - for (int r=0; r(m_rigs[r]->GetJoints()[i]); - btScalar fCurAngle = hingeC->getHingeAngle(); - - btScalar fTargetPercent = (int(m_Time / 1000) % int(m_fCyclePeriod)) / m_fCyclePeriod; - btScalar fTargetAngle = 0.5 * (1 + sin(2 * M_PI * fTargetPercent)); - btScalar fTargetLimitAngle = hingeC->getLowerLimit() + fTargetAngle * (hingeC->getUpperLimit() - hingeC->getLowerLimit()); - btScalar fAngleError = fTargetLimitAngle - fCurAngle; - btScalar fDesiredAngularVel = 1000000.f * fAngleError/ms; - hingeC->enableAngularMotor(true, fDesiredAngularVel, m_fMuscleStrength); - } - } - - -} - -void MotorDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float deltaTime = getDeltaTimeMicroseconds()/1000000.f; - - - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(deltaTime); - m_dynamicsWorld->debugDrawWorld(); - } - - renderme(); - - for (int i=2; i>=0 ;i--) - { - btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; - btRigidBody* body = btRigidBody::upcast(obj); - drawFrame(body->getWorldTransform()); - } - - glFlush(); - - glutSwapBuffers(); -} - -void MotorDemo::displayCallback() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - glutSwapBuffers(); -} - -void MotorDemo::keyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case '+': case '=': - m_fCyclePeriod /= 1.1f; - if (m_fCyclePeriod < 1.f) - m_fCyclePeriod = 1.f; - break; - case '-': case '_': - m_fCyclePeriod *= 1.1f; - break; - case '[': - m_fMuscleStrength /= 1.1f; - break; - case ']': - m_fMuscleStrength *= 1.1f; - break; - default: - DemoApplication::keyboardCallback(key, x, y); - } -} - - - -void MotorDemo::exitPhysics() -{ - - int i; - - for (i=0;igetNumCollisionObjects()-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;jcalculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + + +public: + TestRig (btDynamicsWorld* ownerWorld, const btVector3& positionOffset, bool bFixed) + : m_ownerWorld (ownerWorld) + { + btVector3 vUp(0, 1, 0); + + // + // Setup geometry + // + float fBodySize = 0.25f; + float fLegLength = 0.45f; + float fForeLegLength = 0.75f; + m_shapes[0] = new btCapsuleShape(btScalar(fBodySize), btScalar(0.10)); + int i; + for ( i=0; isetDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + //m_bodies[i]->setSleepingThresholds(1.6, 2.5); + m_bodies[i]->setSleepingThresholds(0.5f, 0.5f); + } + + + // + // Setup the constraints + // + btHingeConstraint* hingeC; + //btConeTwistConstraint* coneC; + + btTransform localA, localB, localC; + + for ( i=0; igetWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; + hingeC = new btHingeConstraint(*m_bodies[0], *m_bodies[1+2*i], localA, localB); + hingeC->setLimit(btScalar(-0.75 * M_PI_4), btScalar(M_PI_8)); + //hingeC->setLimit(btScalar(-0.1), btScalar(0.1)); + m_joints[2*i] = hingeC; + m_ownerWorld->addConstraint(m_joints[2*i], true); + + // knee joints + localA.setIdentity(); localB.setIdentity(); localC.setIdentity(); + localA.getBasis().setEulerZYX(0,-fAngle,0); localA.setOrigin(btVector3(btScalar(fCos*(fBodySize+fLegLength)), btScalar(0.), btScalar(fSin*(fBodySize+fLegLength)))); + localB = m_bodies[1+2*i]->getWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; + localC = m_bodies[2+2*i]->getWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; + hingeC = new btHingeConstraint(*m_bodies[1+2*i], *m_bodies[2+2*i], localB, localC); + //hingeC->setLimit(btScalar(-0.01), btScalar(0.01)); + hingeC->setLimit(btScalar(-M_PI_8), btScalar(0.2)); + m_joints[1+2*i] = hingeC; + m_ownerWorld->addConstraint(m_joints[1+2*i], true); + } + } + + virtual ~TestRig () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } + + btTypedConstraint** GetJoints() {return &m_joints[0];} + +}; + + + +void motorPreTickCallback (btDynamicsWorld *world, btScalar timeStep) +{ + MotorDemo* motorDemo = (MotorDemo*)world->getWorldUserInfo(); + + motorDemo->setMotorTargets(timeStep); + +} + + + +void MotorDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + // Setup the basic world + + m_Time = 0; + m_fCyclePeriod = 2000.f; // in milliseconds + +// m_fMuscleStrength = 0.05f; + // new SIMD solver for joints clips accumulated impulse, so the new limits for the motor + // should be (numberOfsolverIterations * oldLimits) + // currently solver uses 10 iterations, so: + m_fMuscleStrength = 0.5f; + + setCameraDistance(btScalar(5.)); + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); + + m_solver = new btSequentialImpulseConstraintSolver; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + m_dynamicsWorld->setInternalTickCallback(motorPreTickCallback,this,true); + + + // Setup a big ground box + { + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-10,0)); + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); + } + + // Spawn one ragdoll + btVector3 startOffset(1,0.5,0); + spawnTestRig(startOffset, false); + startOffset.setValue(-2,0.5,0); + spawnTestRig(startOffset, true); + + clientResetScene(); +} + + +void MotorDemo::spawnTestRig(const btVector3& startOffset, bool bFixed) +{ + TestRig* rig = new TestRig(m_dynamicsWorld, startOffset, bFixed); + m_rigs.push_back(rig); +} + +void PreStep() +{ + +} + + + + +void MotorDemo::setMotorTargets(btScalar deltaTime) +{ + + float ms = deltaTime*1000000.; + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + m_Time += ms; + + // + // set per-frame sinusoidal position targets using angular motor (hacky?) + // + for (int r=0; r(m_rigs[r]->GetJoints()[i]); + btScalar fCurAngle = hingeC->getHingeAngle(); + + btScalar fTargetPercent = (int(m_Time / 1000) % int(m_fCyclePeriod)) / m_fCyclePeriod; + btScalar fTargetAngle = 0.5 * (1 + sin(2 * M_PI * fTargetPercent)); + btScalar fTargetLimitAngle = hingeC->getLowerLimit() + fTargetAngle * (hingeC->getUpperLimit() - hingeC->getLowerLimit()); + btScalar fAngleError = fTargetLimitAngle - fCurAngle; + btScalar fDesiredAngularVel = 1000000.f * fAngleError/ms; + hingeC->enableAngularMotor(true, fDesiredAngularVel, m_fMuscleStrength); + } + } + + +} + +void MotorDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float deltaTime = getDeltaTimeMicroseconds()/1000000.f; + + + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(deltaTime); + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + for (int i=2; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + drawFrame(body->getWorldTransform()); + } + + glFlush(); + + glutSwapBuffers(); +} + +void MotorDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + +void MotorDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case '+': case '=': + m_fCyclePeriod /= 1.1f; + if (m_fCyclePeriod < 1.f) + m_fCyclePeriod = 1.f; + break; + case '-': case '_': + m_fCyclePeriod *= 1.1f; + break; + case '[': + m_fMuscleStrength /= 1.1f; + break; + case ']': + m_fMuscleStrength *= 1.1f; + break; + default: + DemoApplication::keyboardCallback(key, x, y); + } +} + + + +void MotorDemo::exitPhysics() +{ + + int i; + + for (i=0;igetNumCollisionObjects()-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_rigs; - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - -public: - void initPhysics(); - - void exitPhysics(); - - virtual ~MotorDemo() - { - exitPhysics(); - } - - void spawnTestRig(const btVector3& startOffset, bool bFixed); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - MotorDemo* demo = new MotorDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } - - void setMotorTargets(btScalar deltaTime); - -}; - - -#endif +/* +Bullet Continuous Collision Detection and Physics Library Copyright (c) 2007 Erwin Coumans +Motor Demo + +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 MOTORDEMO_H +#define MOTORDEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +class MotorDemo : public GlutDemoApplication +{ + float m_Time; + float m_fCyclePeriod; // in milliseconds + float m_fMuscleStrength; + + btAlignedObjectArray m_rigs; + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + +public: + void initPhysics(); + + void exitPhysics(); + + virtual ~MotorDemo() + { + exitPhysics(); + } + + void spawnTestRig(const btVector3& startOffset, bool bFixed); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + MotorDemo* demo = new MotorDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + + void setMotorTargets(btScalar deltaTime); + +}; + + +#endif diff --git a/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp b/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp index a2e448ee2..319e01bff 100644 --- a/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp +++ b/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp @@ -1,855 +1,855 @@ - -///contribution by Pierre Terdiman to check penetration depth solvers -///see http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=638 - -#ifdef WIN32//for glut.h -#include -#endif - - -//think different -#if defined(__APPLE__) && !defined (VMDMESA) -#include -#include -#include -#else -#include -#endif - - -#include -#include -#include - -#define VERBOSE_TEXT_ONSCREEN 1 -#ifdef VERBOSE_TEXT_ONSCREEN -#include "GLDebugFont.h" -#endif - -#include "btBulletCollisionCommon.h" - -#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" -#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" -#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" -#include "LinearMath/btStackAlloc.h" - -//We can use the Bullet EPA or sampling penetration depth solver, but comparison might be useful -//#define COMPARE_WITH_SOLID35_AND_OTHER_EPA 1 -#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA -#include "../Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h" -#include "../Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h" -#include "../Extras/EPA/EpaPenetrationDepthSolver.h" -#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA - -#define USE_ORIGINAL 1 -#ifndef USE_ORIGINAL -#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" -#endif //USE_ORIGINAL - -static bool gRefMode = false; -static int gMethod = 0; -static int gLastUsedMethod = -1; -static int gNumGjkIterations = -1; -static int gLastDegenerateSimplex = -1; - -static const float gDisp = 0.01f; -static const float gCamSpeed = 0.1f; -static btVector3 Eye(3.0616338f, 1.1985892f, 2.5769043f); -static btVector3 Dir(-0.66853905,-0.14004262,-0.73037237); -static btVector3 N; -static int mx = 0; -static int my = 0; -static int glutScreenHeight = 512; -static int glutScreenWidth = 512; - -static void DrawLine(const btVector3& p0, const btVector3& p1, const btVector3& color, float line_width) -{ - glDisable(GL_LIGHTING); - glLineWidth(line_width); - glColor4f(color.x(), color.y(), color.z(), 1.0f); - btVector3 tmp[] = {p0, p1}; - glEnableClientState(GL_VERTEX_ARRAY); -#ifndef BT_USE_DOUBLE_PRECISION - glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &tmp[0].x()); -#else - glVertexPointer(3, GL_DOUBLE, sizeof(btVector3), &tmp[0].x()); -#endif - glDrawArrays(GL_LINES, 0, 2); - glDisableClientState(GL_VERTEX_ARRAY); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glEnable(GL_LIGHTING); -} - -void DrawTriangle(const btVector3& p0, const btVector3& p1, const btVector3& p2, const btVector3& color) -{ -// glDisable(GL_LIGHTING); - glColor4f(color.x(), color.y(), color.z(), 1.0f); - btVector3 tmp[] = {p0, p1, p2}; - glEnableClientState(GL_VERTEX_ARRAY); -#ifndef BT_USE_DOUBLE_PRECISION - glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &tmp[0].x()); -#else - glVertexPointer(3, GL_DOUBLE, sizeof(btVector3), &tmp[0].x()); -#endif - glDrawArrays(GL_TRIANGLES, 0, 3); - glDisableClientState(GL_VERTEX_ARRAY); -// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); -// glEnable(GL_LIGHTING); -} - -class MyPoly -{ - public: - MyPoly() : mNbVerts(0), mIndices(NULL) {} - ~MyPoly() { delete[]mIndices; } - - short mNbVerts; - char* mIndices; - float mPlane[4]; -}; - -class MyConvex -{ - public: - MyConvex(); - ~MyConvex(); - - bool LoadFromFile(const char* filename); - void Render(bool only_wireframe, const btVector3& wire_color) const; - void Project(const btVector3& dir, float& min, float& max) const; - - int mNbVerts; - btVector3* mVerts; - int mNbPolys; - MyPoly* mPolys; - btTransform mTransform; -}; - -MyConvex::MyConvex() : - mNbVerts (0), - mVerts (NULL), - mNbPolys (0), - mPolys (NULL) -{ - mTransform.setIdentity(); -} - -MyConvex::~MyConvex() -{ - delete[]mPolys; - delete[]mVerts; -} - -bool MyConvex::LoadFromFile(const char* filename) -{ - FILE* fp = fopen(filename, "rb"); - if(!fp) return false; - - fread(&mNbVerts, sizeof(int), 1, fp); - - int i; - - mVerts = new btVector3[mNbVerts]; - for( i=0;i max) max = dp; - } - if(min>max) - { - float tmp = min; - min = max; - max = tmp; - } -} - -static btVector3 gNormal; -static btVector3 gPoint; -static float gDepth; - - struct MyResult : public btDiscreteCollisionDetectorInterface::Result - { - virtual void setShapeIdentifiersA(int partId0, int index0) - { - } - virtual void setShapeIdentifiersB(int partId1, int index1) - { - } - - virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth) - { - gNormal = normalOnBInWorld; - gPoint = pointInWorld; - gDepth = depth; - } - }; - -//2 Mb by default, could be made smaller -btStackAlloc gStackAlloc(1024*1024*2); - -static bool TestEPA(const MyConvex& hull0, const MyConvex& hull1) -{ - static btSimplexSolverInterface simplexSolver; -#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA -// static Solid3JohnsonSimplexSolver simplexSolver2; -#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA - - simplexSolver.reset(); - - btConvexHullShape convexA((btScalar*)hull0.mVerts, hull0.mNbVerts, sizeof(btVector3)); - btConvexHullShape convexB((btScalar*)hull1.mVerts, hull1.mNbVerts, sizeof(btVector3)); - - static btGjkEpaPenetrationDepthSolver Solver0; - static btMinkowskiPenetrationDepthSolver Solver1; - -#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA - static Solid3EpaPenetrationDepth Solver2; - static EpaPenetrationDepthSolver Solver3; -#endif - - - btConvexPenetrationDepthSolver* Solver = NULL ; - if(gMethod==0) - Solver = &Solver0; - else if(gMethod==1) - Solver = &Solver1; -#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA - else if(gMethod==2) - Solver = &Solver2; - else - Solver = &Solver3; -#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA - - -#ifdef USE_ORIGINAL - - btGjkPairDetector GJK(&convexA, &convexB, &simplexSolver, Solver); - GJK.m_catchDegeneracies = 1; - convexA.setMargin(0.01f); - convexB.setMargin(0.01f); - - btDiscreteCollisionDetectorInterface::ClosestPointInput input; - input.m_transformA = hull0.mTransform; - input.m_transformB = hull1.mTransform; - input.m_stackAlloc = &gStackAlloc; - - MyResult output; - GJK.getClosestPoints(input, output, 0); - gLastUsedMethod = GJK.m_lastUsedMethod; - gNumGjkIterations = GJK.m_curIter; - gLastDegenerateSimplex= GJK.m_degenerateSimplex; -#else - MyResult output; - btVector3 witnesses[2]; - btVector3 normal; - btScalar depth; - - btGjkEpaSolver::sResults results; - btScalar radialMargin = 0.01f; - - btGjkEpaSolver::Collide(&convexA,hull0.mTransform, - &convexB,hull1.mTransform, - radialMargin, - results); - if (results.depth>0) - { - output.addContactPoint(results.normal,results.witnesses[1],-results.depth); - } -#endif - return true; -} - -static bool TestSepAxis(const btVector3& sep_axis, const MyConvex& hull0, const MyConvex& hull1, float& depth) -{ - float Min0,Max0; - float Min1,Max1; - hull0.Project(sep_axis, Min0, Max0); - hull1.Project(sep_axis, Min1, Max1); - - if(Max0=0.0f); - float d1 = Max1 - Min0; - assert(d1>=0.0f); - depth = d01e-6 || fabsf(v.y())>1e-6 || fabsf(v.z())>1e-6) return false; - return true; -} - -static bool ReferenceCode(const MyConvex& hull0, const MyConvex& hull1, float& dmin, btVector3& sep) -{ - dmin = FLT_MAX; - - int i; - - // Test normals from hull0 - for( i=0;i0.0f) sep = -sep; - - return true; -} - - - -static MyConvex gConvex0; -static MyConvex gConvex1; - -static void KeyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case 27: exit(0); break; - - case 'R': - case 'r': - gRefMode = !gRefMode; - break; - - case ' ': - gMethod++; -#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA - if(gMethod==4) gMethod=0; -#else - if(gMethod==2) gMethod=0; -#endif - break; - - case '4': - gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(-gDisp,0,0)); - break; - case '7': - gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(1,0,0),0.01)); - break; - case '9': - gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(1,0,0),-0.01)); - break; - case '1': - gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,1,0),0.01)); - break; - case '3': - gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,1,0),-0.01)); - break; - case '5': - gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,0,1),0.01)); - break; - - case '6': - gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(gDisp,0,0)); - break; - case '8': - gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(0,gDisp,0)); - break; - case '2': - gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(0,-gDisp,0)); - break; - - case 101: Eye += Dir * gCamSpeed; break; - case 103: Eye -= Dir * gCamSpeed; break; - case 100: Eye -= N * gCamSpeed; break; - case 102: Eye += N * gCamSpeed; break; - } -} - -static void ArrowKeyCallback(int key, int x, int y) -{ - KeyboardCallback(key,x,y); -} - -static void MouseCallback(int button, int state, int x, int y) -{ - mx = x; - my = y; -} - -static const float NxPiF32 = 3.141592653589793f; - -float degToRad(float a) - { - return (float)0.01745329251994329547 * a; - } - -class NxQuat - { - public: - NxQuat(){} - - NxQuat(const float angle, const btVector3 & axis) - { - x = axis.x(); - y = axis.y(); - z = axis.z(); - - const float i_length = 1.0f / sqrtf( x*x + y*y + z*z ); - x = x * i_length; - y = y * i_length; - z = z * i_length; - - float Half = degToRad(angle * 0.5f); - - w = cosf(Half); - const float sin_theta_over_two = sinf(Half ); - x = x * sin_theta_over_two; - y = y * sin_theta_over_two; - z = z * sin_theta_over_two; - } - - void multiply(const NxQuat& left, const btVector3& right) - { - float a,b,c,d; - - a = - left.x*right.x() - left.y*right.y() - left.z *right.z(); - b = left.w*right.x() + left.y*right.z() - right.y()*left.z; - c = left.w*right.y() + left.z*right.x() - right.z()*left.x; - d = left.w*right.z() + left.x*right.y() - right.x()*left.y; - - w = a; - x = b; - y = c; - z = d; - } - - void rotate(btVector3 & v) const - { - NxQuat myInverse; - myInverse.x = -x; - myInverse.y = -y; - myInverse.z = -z; - myInverse.w = w; - - NxQuat left; - left.multiply(*this,v); - float vx = left.w*myInverse.x + myInverse.w*left.x + left.y*myInverse.z - myInverse.y*left.z; - float vy = left.w*myInverse.y + myInverse.w*left.y + left.z*myInverse.x - myInverse.z*left.x; - float vz = left.w*myInverse.z + myInverse.w*left.z + left.x*myInverse.y - myInverse.x*left.y; - v.setValue(vx, vy, vz); - } - - float x,y,z,w; -}; - - -static void MotionCallback(int x, int y) -{ - int dx = mx - x; - int dy = my - y; - - Dir = Dir.normalize(); - N = Dir.cross(btVector3(0,1,0)); - - NxQuat qx(NxPiF32 * dx * 20/ 180.0f, btVector3(0,1,0)); - qx.rotate(Dir); - NxQuat qy(NxPiF32 * dy * 20/ 180.0f, N); - qy.rotate(Dir); - - mx = x; - my = y; -} - -static void RenderCallback() -{ - // Clear buffers - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // Setup camera - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(60.0f, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); - gluLookAt(Eye.x(), Eye.y(), Eye.z(), Eye.x() + Dir.x(), Eye.y() + Dir.y(), Eye.z() + Dir.z(), 0.0f, 1.0f, 0.0f); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glEnable(GL_LIGHTING); - - //clear previous frames result - gNormal.setValue(10,0,0); - gPoint.setValue(0,0,0); - gDepth = 999.999; - gLastUsedMethod = -1; - gNumGjkIterations = -1; - - - TestEPA(gConvex0, gConvex1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - btVector3 RefSep(btScalar(0.), btScalar(0.), btScalar(0.)); - float RefDMin=0.f; - bool RefResult = false; - if(gRefMode) - RefResult = ReferenceCode(gConvex0, gConvex1, RefDMin, RefSep); - -// DrawLine(gPoint, gPoint + gNormal*20.0f, btVector3(1,0,0), 2.0f); -// printf("%f: %f %f %f\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); - -#ifdef VERBOSE_TEXT_ONSCREEN - glColor3f(255.f, 255.f, 255.f); - - setOrthographicProjection(); - float xOffset = 10.f; - float yStart = 20.f; - float yIncr = 20.f; - char buf[124]; - - sprintf(buf,"gDepth=%f: gNormal=(%f %f %f)\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - sprintf(buf,"num GJK iterations =%d\n", gNumGjkIterations); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - sprintf(buf,"gLastUsedMethod=%d\n", gLastUsedMethod); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - - - - if (gLastUsedMethod >= 3) - { - switch ( gMethod) - { - case 0: - sprintf(buf,"Bullet GjkEpa Penetration depth solver (zlib free\n" ); - break; - case 1: - sprintf(buf,"Bullet Minkowski sampling Penetration depth solver\n" ); - break; - case 2: - sprintf(buf,"Solid35 EPA Penetration depth solver\n" ); - break; - case 3: - sprintf(buf,"EPA Penetration depth solver (Experimental/WorkInProgress, zlib free\n" ); - break; - default: - sprintf(buf,"Unknown Penetration Depth\n" ); - } - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - } else - { - sprintf(buf,"Hybrid GJK method %d\n", gLastUsedMethod); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - } - - if (gLastDegenerateSimplex) - { - sprintf(buf,"DegenerateSimplex %d\n", gLastDegenerateSimplex); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - } - - - - - resetPerspectiveProjection(); -#endif //VERBOSE_TEXT_ONSCREEN - - btVector3 color(0,0,0); - gConvex0.Render(false, color); - gConvex1.Render(false, color); - - if(gDepth<0.0f) - { - btTransform Saved = gConvex0.mTransform; - gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() - btVector3(gNormal*gDepth)); - gConvex0.Render(true, btVector3(1.0f, 0.5f, 0.0f)); - gConvex0.mTransform = Saved; - } - else - { - DrawLine(gPoint, gPoint + gNormal, btVector3(0,1,0), 2.0f); - } - - if(RefResult & gRefMode) - { - btTransform Saved = gConvex0.mTransform; - gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(RefSep*RefDMin)); - gConvex0.Render(true, btVector3(0.0f, 0.5f, 1.0f)); - gConvex0.mTransform = Saved; - } - - glutSwapBuffers(); -} - -static void ReshapeCallback(int width, int height) -{ - glViewport(0, 0, width, height); -} - -static void IdleCallback() -{ - glutPostRedisplay(); -} - -int main(int argc, char** argv) -{ - // Initialize Glut - glutInit(&argc, argv); - glutInitWindowSize(glutScreenWidth, glutScreenHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - int mainHandle = glutCreateWindow("TestBullet"); - glutSetWindow(mainHandle); - glutDisplayFunc(RenderCallback); - glutReshapeFunc(ReshapeCallback); - glutIdleFunc(IdleCallback); - glutKeyboardFunc(KeyboardCallback); - glutSpecialFunc(ArrowKeyCallback); - glutMouseFunc(MouseCallback); - glutMotionFunc(MotionCallback); - MotionCallback(0,0); - - // Setup default render states - glClearColor(0.3f, 0.4f, 0.5f, 1.0); - glEnable(GL_DEPTH_TEST); - glEnable(GL_COLOR_MATERIAL); - glEnable(GL_CULL_FACE); - - // Setup lighting - glEnable(GL_LIGHTING); - float AmbientColor[] = { 0.0f, 0.1f, 0.2f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientColor); - float DiffuseColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseColor); - float SpecularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularColor); - float Position[] = { -10.0f, 1000.0f, -4.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, Position); - glEnable(GL_LIGHT0); - - // - bool Status = gConvex0.LoadFromFile("convex0.bin"); - if(!Status) - { - Status = gConvex0.LoadFromFile("../../convex0.bin"); - if(!Status) - { - printf("Failed to load object!\n"); - exit(0); - } - } - Status = gConvex1.LoadFromFile("convex0.bin"); - if(!Status) - { - Status = gConvex1.LoadFromFile("../../convex0.bin"); - if(!Status) - { - printf("Failed to load object!\n"); - exit(0); - } - } - -// gConvex0.mTransform.setOrigin(btVector3(1.0f, 1.0f, 0.0f)); - gConvex0.mTransform.setOrigin(btVector3(0.20000069f, 0.95000005f, 0.0f)); - - // Run - glutMainLoop(); - - return 0; -} + +///contribution by Pierre Terdiman to check penetration depth solvers +///see http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=638 + +#ifdef WIN32//for glut.h +#include +#endif + + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + + +#include +#include +#include + +#define VERBOSE_TEXT_ONSCREEN 1 +#ifdef VERBOSE_TEXT_ONSCREEN +#include "GLDebugFont.h" +#endif + +#include "btBulletCollisionCommon.h" + +#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" +#include "LinearMath/btStackAlloc.h" + +//We can use the Bullet EPA or sampling penetration depth solver, but comparison might be useful +//#define COMPARE_WITH_SOLID35_AND_OTHER_EPA 1 +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA +#include "../Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h" +#include "../Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h" +#include "../Extras/EPA/EpaPenetrationDepthSolver.h" +#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA + +#define USE_ORIGINAL 1 +#ifndef USE_ORIGINAL +#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" +#endif //USE_ORIGINAL + +static bool gRefMode = false; +static int gMethod = 0; +static int gLastUsedMethod = -1; +static int gNumGjkIterations = -1; +static int gLastDegenerateSimplex = -1; + +static const float gDisp = 0.01f; +static const float gCamSpeed = 0.1f; +static btVector3 Eye(3.0616338f, 1.1985892f, 2.5769043f); +static btVector3 Dir(-0.66853905,-0.14004262,-0.73037237); +static btVector3 N; +static int mx = 0; +static int my = 0; +static int glutScreenHeight = 512; +static int glutScreenWidth = 512; + +static void DrawLine(const btVector3& p0, const btVector3& p1, const btVector3& color, float line_width) +{ + glDisable(GL_LIGHTING); + glLineWidth(line_width); + glColor4f(color.x(), color.y(), color.z(), 1.0f); + btVector3 tmp[] = {p0, p1}; + glEnableClientState(GL_VERTEX_ARRAY); +#ifndef BT_USE_DOUBLE_PRECISION + glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &tmp[0].x()); +#else + glVertexPointer(3, GL_DOUBLE, sizeof(btVector3), &tmp[0].x()); +#endif + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawTriangle(const btVector3& p0, const btVector3& p1, const btVector3& p2, const btVector3& color) +{ +// glDisable(GL_LIGHTING); + glColor4f(color.x(), color.y(), color.z(), 1.0f); + btVector3 tmp[] = {p0, p1, p2}; + glEnableClientState(GL_VERTEX_ARRAY); +#ifndef BT_USE_DOUBLE_PRECISION + glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &tmp[0].x()); +#else + glVertexPointer(3, GL_DOUBLE, sizeof(btVector3), &tmp[0].x()); +#endif + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); +// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +// glEnable(GL_LIGHTING); +} + +class MyPoly +{ + public: + MyPoly() : mNbVerts(0), mIndices(NULL) {} + ~MyPoly() { delete[]mIndices; } + + short mNbVerts; + char* mIndices; + float mPlane[4]; +}; + +class MyConvex +{ + public: + MyConvex(); + ~MyConvex(); + + bool LoadFromFile(const char* filename); + void Render(bool only_wireframe, const btVector3& wire_color) const; + void Project(const btVector3& dir, float& min, float& max) const; + + int mNbVerts; + btVector3* mVerts; + int mNbPolys; + MyPoly* mPolys; + btTransform mTransform; +}; + +MyConvex::MyConvex() : + mNbVerts (0), + mVerts (NULL), + mNbPolys (0), + mPolys (NULL) +{ + mTransform.setIdentity(); +} + +MyConvex::~MyConvex() +{ + delete[]mPolys; + delete[]mVerts; +} + +bool MyConvex::LoadFromFile(const char* filename) +{ + FILE* fp = fopen(filename, "rb"); + if(!fp) return false; + + fread(&mNbVerts, sizeof(int), 1, fp); + + int i; + + mVerts = new btVector3[mNbVerts]; + for( i=0;i max) max = dp; + } + if(min>max) + { + float tmp = min; + min = max; + max = tmp; + } +} + +static btVector3 gNormal; +static btVector3 gPoint; +static float gDepth; + + struct MyResult : public btDiscreteCollisionDetectorInterface::Result + { + virtual void setShapeIdentifiersA(int partId0, int index0) + { + } + virtual void setShapeIdentifiersB(int partId1, int index1) + { + } + + virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth) + { + gNormal = normalOnBInWorld; + gPoint = pointInWorld; + gDepth = depth; + } + }; + +//2 Mb by default, could be made smaller +btStackAlloc gStackAlloc(1024*1024*2); + +static bool TestEPA(const MyConvex& hull0, const MyConvex& hull1) +{ + static btSimplexSolverInterface simplexSolver; +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA +// static Solid3JohnsonSimplexSolver simplexSolver2; +#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA + + simplexSolver.reset(); + + btConvexHullShape convexA((btScalar*)hull0.mVerts, hull0.mNbVerts, sizeof(btVector3)); + btConvexHullShape convexB((btScalar*)hull1.mVerts, hull1.mNbVerts, sizeof(btVector3)); + + static btGjkEpaPenetrationDepthSolver Solver0; + static btMinkowskiPenetrationDepthSolver Solver1; + +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA + static Solid3EpaPenetrationDepth Solver2; + static EpaPenetrationDepthSolver Solver3; +#endif + + + btConvexPenetrationDepthSolver* Solver = NULL ; + if(gMethod==0) + Solver = &Solver0; + else if(gMethod==1) + Solver = &Solver1; +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA + else if(gMethod==2) + Solver = &Solver2; + else + Solver = &Solver3; +#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA + + +#ifdef USE_ORIGINAL + + btGjkPairDetector GJK(&convexA, &convexB, &simplexSolver, Solver); + GJK.m_catchDegeneracies = 1; + convexA.setMargin(0.01f); + convexB.setMargin(0.01f); + + btDiscreteCollisionDetectorInterface::ClosestPointInput input; + input.m_transformA = hull0.mTransform; + input.m_transformB = hull1.mTransform; + input.m_stackAlloc = &gStackAlloc; + + MyResult output; + GJK.getClosestPoints(input, output, 0); + gLastUsedMethod = GJK.m_lastUsedMethod; + gNumGjkIterations = GJK.m_curIter; + gLastDegenerateSimplex= GJK.m_degenerateSimplex; +#else + MyResult output; + btVector3 witnesses[2]; + btVector3 normal; + btScalar depth; + + btGjkEpaSolver::sResults results; + btScalar radialMargin = 0.01f; + + btGjkEpaSolver::Collide(&convexA,hull0.mTransform, + &convexB,hull1.mTransform, + radialMargin, + results); + if (results.depth>0) + { + output.addContactPoint(results.normal,results.witnesses[1],-results.depth); + } +#endif + return true; +} + +static bool TestSepAxis(const btVector3& sep_axis, const MyConvex& hull0, const MyConvex& hull1, float& depth) +{ + float Min0,Max0; + float Min1,Max1; + hull0.Project(sep_axis, Min0, Max0); + hull1.Project(sep_axis, Min1, Max1); + + if(Max0=0.0f); + float d1 = Max1 - Min0; + assert(d1>=0.0f); + depth = d01e-6 || fabsf(v.y())>1e-6 || fabsf(v.z())>1e-6) return false; + return true; +} + +static bool ReferenceCode(const MyConvex& hull0, const MyConvex& hull1, float& dmin, btVector3& sep) +{ + dmin = FLT_MAX; + + int i; + + // Test normals from hull0 + for( i=0;i0.0f) sep = -sep; + + return true; +} + + + +static MyConvex gConvex0; +static MyConvex gConvex1; + +static void KeyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 27: exit(0); break; + + case 'R': + case 'r': + gRefMode = !gRefMode; + break; + + case ' ': + gMethod++; +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA + if(gMethod==4) gMethod=0; +#else + if(gMethod==2) gMethod=0; +#endif + break; + + case '4': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(-gDisp,0,0)); + break; + case '7': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(1,0,0),0.01)); + break; + case '9': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(1,0,0),-0.01)); + break; + case '1': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,1,0),0.01)); + break; + case '3': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,1,0),-0.01)); + break; + case '5': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,0,1),0.01)); + break; + + case '6': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(gDisp,0,0)); + break; + case '8': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(0,gDisp,0)); + break; + case '2': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(0,-gDisp,0)); + break; + + case 101: Eye += Dir * gCamSpeed; break; + case 103: Eye -= Dir * gCamSpeed; break; + case 100: Eye -= N * gCamSpeed; break; + case 102: Eye += N * gCamSpeed; break; + } +} + +static void ArrowKeyCallback(int key, int x, int y) +{ + KeyboardCallback(key,x,y); +} + +static void MouseCallback(int button, int state, int x, int y) +{ + mx = x; + my = y; +} + +static const float NxPiF32 = 3.141592653589793f; + +float degToRad(float a) + { + return (float)0.01745329251994329547 * a; + } + +class NxQuat + { + public: + NxQuat(){} + + NxQuat(const float angle, const btVector3 & axis) + { + x = axis.x(); + y = axis.y(); + z = axis.z(); + + const float i_length = 1.0f / sqrtf( x*x + y*y + z*z ); + x = x * i_length; + y = y * i_length; + z = z * i_length; + + float Half = degToRad(angle * 0.5f); + + w = cosf(Half); + const float sin_theta_over_two = sinf(Half ); + x = x * sin_theta_over_two; + y = y * sin_theta_over_two; + z = z * sin_theta_over_two; + } + + void multiply(const NxQuat& left, const btVector3& right) + { + float a,b,c,d; + + a = - left.x*right.x() - left.y*right.y() - left.z *right.z(); + b = left.w*right.x() + left.y*right.z() - right.y()*left.z; + c = left.w*right.y() + left.z*right.x() - right.z()*left.x; + d = left.w*right.z() + left.x*right.y() - right.x()*left.y; + + w = a; + x = b; + y = c; + z = d; + } + + void rotate(btVector3 & v) const + { + NxQuat myInverse; + myInverse.x = -x; + myInverse.y = -y; + myInverse.z = -z; + myInverse.w = w; + + NxQuat left; + left.multiply(*this,v); + float vx = left.w*myInverse.x + myInverse.w*left.x + left.y*myInverse.z - myInverse.y*left.z; + float vy = left.w*myInverse.y + myInverse.w*left.y + left.z*myInverse.x - myInverse.z*left.x; + float vz = left.w*myInverse.z + myInverse.w*left.z + left.x*myInverse.y - myInverse.x*left.y; + v.setValue(vx, vy, vz); + } + + float x,y,z,w; +}; + + +static void MotionCallback(int x, int y) +{ + int dx = mx - x; + int dy = my - y; + + Dir = Dir.normalize(); + N = Dir.cross(btVector3(0,1,0)); + + NxQuat qx(NxPiF32 * dx * 20/ 180.0f, btVector3(0,1,0)); + qx.rotate(Dir); + NxQuat qy(NxPiF32 * dy * 20/ 180.0f, N); + qy.rotate(Dir); + + mx = x; + my = y; +} + +static void RenderCallback() +{ + // Clear buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Setup camera + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0f, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); + gluLookAt(Eye.x(), Eye.y(), Eye.z(), Eye.x() + Dir.x(), Eye.y() + Dir.y(), Eye.z() + Dir.z(), 0.0f, 1.0f, 0.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_LIGHTING); + + //clear previous frames result + gNormal.setValue(10,0,0); + gPoint.setValue(0,0,0); + gDepth = 999.999; + gLastUsedMethod = -1; + gNumGjkIterations = -1; + + + TestEPA(gConvex0, gConvex1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + btVector3 RefSep(btScalar(0.), btScalar(0.), btScalar(0.)); + float RefDMin=0.f; + bool RefResult = false; + if(gRefMode) + RefResult = ReferenceCode(gConvex0, gConvex1, RefDMin, RefSep); + +// DrawLine(gPoint, gPoint + gNormal*20.0f, btVector3(1,0,0), 2.0f); +// printf("%f: %f %f %f\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); + +#ifdef VERBOSE_TEXT_ONSCREEN + glColor3f(255.f, 255.f, 255.f); + + setOrthographicProjection(); + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + sprintf(buf,"gDepth=%f: gNormal=(%f %f %f)\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + sprintf(buf,"num GJK iterations =%d\n", gNumGjkIterations); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + sprintf(buf,"gLastUsedMethod=%d\n", gLastUsedMethod); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + + + + if (gLastUsedMethod >= 3) + { + switch ( gMethod) + { + case 0: + sprintf(buf,"Bullet GjkEpa Penetration depth solver (zlib free\n" ); + break; + case 1: + sprintf(buf,"Bullet Minkowski sampling Penetration depth solver\n" ); + break; + case 2: + sprintf(buf,"Solid35 EPA Penetration depth solver\n" ); + break; + case 3: + sprintf(buf,"EPA Penetration depth solver (Experimental/WorkInProgress, zlib free\n" ); + break; + default: + sprintf(buf,"Unknown Penetration Depth\n" ); + } + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + } else + { + sprintf(buf,"Hybrid GJK method %d\n", gLastUsedMethod); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + } + + if (gLastDegenerateSimplex) + { + sprintf(buf,"DegenerateSimplex %d\n", gLastDegenerateSimplex); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + } + + + + + resetPerspectiveProjection(); +#endif //VERBOSE_TEXT_ONSCREEN + + btVector3 color(0,0,0); + gConvex0.Render(false, color); + gConvex1.Render(false, color); + + if(gDepth<0.0f) + { + btTransform Saved = gConvex0.mTransform; + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() - btVector3(gNormal*gDepth)); + gConvex0.Render(true, btVector3(1.0f, 0.5f, 0.0f)); + gConvex0.mTransform = Saved; + } + else + { + DrawLine(gPoint, gPoint + gNormal, btVector3(0,1,0), 2.0f); + } + + if(RefResult & gRefMode) + { + btTransform Saved = gConvex0.mTransform; + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(RefSep*RefDMin)); + gConvex0.Render(true, btVector3(0.0f, 0.5f, 1.0f)); + gConvex0.mTransform = Saved; + } + + glutSwapBuffers(); +} + +static void ReshapeCallback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +static void IdleCallback() +{ + glutPostRedisplay(); +} + +int main(int argc, char** argv) +{ + // Initialize Glut + glutInit(&argc, argv); + glutInitWindowSize(glutScreenWidth, glutScreenHeight); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + int mainHandle = glutCreateWindow("TestBullet"); + glutSetWindow(mainHandle); + glutDisplayFunc(RenderCallback); + glutReshapeFunc(ReshapeCallback); + glutIdleFunc(IdleCallback); + glutKeyboardFunc(KeyboardCallback); + glutSpecialFunc(ArrowKeyCallback); + glutMouseFunc(MouseCallback); + glutMotionFunc(MotionCallback); + MotionCallback(0,0); + + // Setup default render states + glClearColor(0.3f, 0.4f, 0.5f, 1.0); + glEnable(GL_DEPTH_TEST); + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_CULL_FACE); + + // Setup lighting + glEnable(GL_LIGHTING); + float AmbientColor[] = { 0.0f, 0.1f, 0.2f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientColor); + float DiffuseColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseColor); + float SpecularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularColor); + float Position[] = { -10.0f, 1000.0f, -4.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, Position); + glEnable(GL_LIGHT0); + + // + bool Status = gConvex0.LoadFromFile("convex0.bin"); + if(!Status) + { + Status = gConvex0.LoadFromFile("../../convex0.bin"); + if(!Status) + { + printf("Failed to load object!\n"); + exit(0); + } + } + Status = gConvex1.LoadFromFile("convex0.bin"); + if(!Status) + { + Status = gConvex1.LoadFromFile("../../convex0.bin"); + if(!Status) + { + printf("Failed to load object!\n"); + exit(0); + } + } + +// gConvex0.mTransform.setOrigin(btVector3(1.0f, 1.0f, 0.0f)); + gConvex0.mTransform.setOrigin(btVector3(0.20000069f, 0.95000005f, 0.0f)); + + // Run + glutMainLoop(); + + return 0; +} diff --git a/Demos/ForkLiftDemo/CMakeLists.txt b/Demos/ForkLiftDemo/CMakeLists.txt index 72a0b52e5..f0c566738 100644 --- a/Demos/ForkLiftDemo/CMakeLists.txt +++ b/Demos/ForkLiftDemo/CMakeLists.txt @@ -1,59 +1,59 @@ -# 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. - - -# This is the variable for Windows. I use this to define the root of my directory structure. -SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) - -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -IF (WIN32) - ADD_EXECUTABLE(AppForkLiftDemo - ForkLiftDemo.cpp - main.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) - - IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppForkLiftDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppForkLiftDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ENDIF(WIN32) - -ELSE() - ADD_EXECUTABLE(AppForkLiftDemo - ForkLiftDemo.cpp - main.cpp - ) -ENDIF() - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppForkLiftDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppForkLiftDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppForkLiftDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +IF (WIN32) + ADD_EXECUTABLE(AppForkLiftDemo + ForkLiftDemo.cpp + main.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) + + IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppForkLiftDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppForkLiftDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ENDIF(WIN32) + +ELSE() + ADD_EXECUTABLE(AppForkLiftDemo + ForkLiftDemo.cpp + main.cpp + ) +ENDIF() + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppForkLiftDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppForkLiftDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppForkLiftDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/ForkLiftDemo/ForkLiftDemo.cpp b/Demos/ForkLiftDemo/ForkLiftDemo.cpp index 357311a20..cc761d9d5 100644 --- a/Demos/ForkLiftDemo/ForkLiftDemo.cpp +++ b/Demos/ForkLiftDemo/ForkLiftDemo.cpp @@ -1,865 +1,865 @@ -/* -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. -*/ - -///September 2006: VehicleDemo is work in progress, this file is mostly just a placeholder -///This VehicleDemo file is very early in development, please check it later -///@todo is a basic engine model: -///A function that maps user input (throttle) into torque/force applied on the wheels -///with gears etc. -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" -#include "GLDebugFont.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#ifndef M_PI_2 -#define M_PI_2 1.57079632679489661923 -#endif - -#ifndef M_PI_4 -#define M_PI_4 0.785398163397448309616 -#endif - -//#define LIFT_EPS 0.0000001f -// -// By default, Bullet Vehicle uses Y as up axis. -// You can override the up axis, for example Z-axis up. Enable this define to see how to: -//#define FORCE_ZAXIS_UP 1 -// - -#ifdef FORCE_ZAXIS_UP - int rightIndex = 0; - int upIndex = 2; - int forwardIndex = 1; - btVector3 wheelDirectionCS0(0,0,-1); - btVector3 wheelAxleCS(1,0,0); -#else - int rightIndex = 0; - int upIndex = 1; - int forwardIndex = 2; - btVector3 wheelDirectionCS0(0,-1,0); - btVector3 wheelAxleCS(-1,0,0); -#endif - -#include "GLDebugDrawer.h" -#include //printf debugging - -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" -#include "ForkLiftDemo.h" - - -const int maxProxies = 32766; -const int maxOverlap = 65535; - -///btRaycastVehicle is the interface for the constraint that implements the raycast vehicle -///notice that for higher-quality slow-moving vehicles, another approach might be better -///implementing explicit hinged-wheel constraints with cylinder collision, rather then raycasts -float gEngineForce = 0.f; - -float defaultBreakingForce = 10.f; -float gBreakingForce = 100.f; - -float maxEngineForce = 1000.f;//this should be engine/velocity dependent -float maxBreakingForce = 100.f; - -float gVehicleSteering = 0.f; -float steeringIncrement = 0.04f; -float steeringClamp = 0.3f; -float wheelRadius = 0.5f; -float wheelWidth = 0.4f; -float wheelFriction = 1000;//BT_LARGE_FLOAT; -float suspensionStiffness = 20.f; -float suspensionDamping = 2.3f; -float suspensionCompression = 4.4f; -float rollInfluence = 0.1f;//1.0f; - - -btScalar suspensionRestLength(0.6); - -#define CUBE_HALF_EXTENTS 1 - - - -//////////////////////////////////// - - - - -ForkLiftDemo::ForkLiftDemo() -: -m_carChassis(0), -m_liftBody(0), -m_forkBody(0), -m_loadBody(0), -m_cameraHeight(4.f), -m_minCameraDistance(3.f), -m_maxCameraDistance(10.f), -m_indexVertexArrays(0), -m_vertices(0) -{ - m_vehicle = 0; - m_wheelShape = 0; - m_cameraPosition = btVector3(30,30,30); - m_useDefaultCamera = false; - setTexturing(true); - setShadows(true); - -} - - -void ForkLiftDemo::termPhysics() -{ - //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()) - { - - while (body->getNumConstraintRefs()) - { - btTypedConstraint* constraint = body->getConstraintRef(0); - m_dynamicsWorld->removeConstraint(constraint); - delete constraint; - } - delete body->getMotionState(); - m_dynamicsWorld->removeRigidBody(body); - } else - { - m_dynamicsWorld->removeCollisionObject( obj ); - } - delete obj; - } - - //delete collision shapes - for (int j=0;jsetGravity(btVector3(0,0,-10)); -#endif - - //m_dynamicsWorld->setGravity(btVector3(0,0,0)); -btTransform tr; -tr.setIdentity(); -tr.setOrigin(btVector3(0,-10,0)); - -//either use heightfield or triangle mesh - - - //create ground object - localCreateRigidBody(0,tr,groundShape); - -#ifdef FORCE_ZAXIS_UP -// indexRightAxis = 0; -// indexUpAxis = 2; -// indexForwardAxis = 1; - btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); - btCompoundShape* compound = new btCompoundShape(); - btTransform localTrans; - localTrans.setIdentity(); - //localTrans effectively shifts the center of mass with respect to the chassis - localTrans.setOrigin(btVector3(0,0,1)); -#else - btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); - m_collisionShapes.push_back(chassisShape); - - btCompoundShape* compound = new btCompoundShape(); - m_collisionShapes.push_back(compound); - btTransform localTrans; - localTrans.setIdentity(); - //localTrans effectively shifts the center of mass with respect to the chassis - localTrans.setOrigin(btVector3(0,1,0)); -#endif - - compound->addChildShape(localTrans,chassisShape); - - { - btCollisionShape* suppShape = new btBoxShape(btVector3(0.5f,0.1f,0.5f)); - btTransform suppLocalTrans; - suppLocalTrans.setIdentity(); - //localTrans effectively shifts the center of mass with respect to the chassis - suppLocalTrans.setOrigin(btVector3(0,1.0,2.5)); - compound->addChildShape(suppLocalTrans, suppShape); - } - - tr.setOrigin(btVector3(0,0.f,0)); - - m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); - //m_carChassis->setDamping(0.2,0.2); - - m_wheelShape = new btCylinderShapeX(btVector3(wheelWidth,wheelRadius,wheelRadius)); - - { - btCollisionShape* liftShape = new btBoxShape(btVector3(0.5f,2.0f,0.05f)); - m_collisionShapes.push_back(liftShape); - btTransform liftTrans; - m_liftStartPos = btVector3(0.0f, 2.5f, 3.05f); - liftTrans.setIdentity(); - liftTrans.setOrigin(m_liftStartPos); - m_liftBody = localCreateRigidBody(10,liftTrans, liftShape); - - btTransform localA, localB; - localA.setIdentity(); - localB.setIdentity(); - localA.getBasis().setEulerZYX(0, M_PI_2, 0); - localA.setOrigin(btVector3(0.0, 1.0, 3.05)); - localB.getBasis().setEulerZYX(0, M_PI_2, 0); - localB.setOrigin(btVector3(0.0, -1.5, -0.05)); - m_liftHinge = new btHingeConstraint(*m_carChassis,*m_liftBody, localA, localB); -// m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); - m_liftHinge->setLimit(0.0f, 0.0f); - m_dynamicsWorld->addConstraint(m_liftHinge, true); - - btCollisionShape* forkShapeA = new btBoxShape(btVector3(1.0f,0.1f,0.1f)); - m_collisionShapes.push_back(forkShapeA); - btCompoundShape* forkCompound = new btCompoundShape(); - m_collisionShapes.push_back(forkCompound); - btTransform forkLocalTrans; - forkLocalTrans.setIdentity(); - forkCompound->addChildShape(forkLocalTrans, forkShapeA); - - btCollisionShape* forkShapeB = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); - m_collisionShapes.push_back(forkShapeB); - forkLocalTrans.setIdentity(); - forkLocalTrans.setOrigin(btVector3(-0.9f, -0.08f, 0.7f)); - forkCompound->addChildShape(forkLocalTrans, forkShapeB); - - btCollisionShape* forkShapeC = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); - m_collisionShapes.push_back(forkShapeC); - forkLocalTrans.setIdentity(); - forkLocalTrans.setOrigin(btVector3(0.9f, -0.08f, 0.7f)); - forkCompound->addChildShape(forkLocalTrans, forkShapeC); - - btTransform forkTrans; - m_forkStartPos = btVector3(0.0f, 0.6f, 3.2f); - forkTrans.setIdentity(); - forkTrans.setOrigin(m_forkStartPos); - m_forkBody = localCreateRigidBody(5, forkTrans, forkCompound); - - localA.setIdentity(); - localB.setIdentity(); - localA.getBasis().setEulerZYX(0, 0, M_PI_2); - localA.setOrigin(btVector3(0.0f, -1.9f, 0.05f)); - localB.getBasis().setEulerZYX(0, 0, M_PI_2); - localB.setOrigin(btVector3(0.0, 0.0, -0.1)); - m_forkSlider = new btSliderConstraint(*m_liftBody, *m_forkBody, localA, localB, true); - m_forkSlider->setLowerLinLimit(0.1f); - m_forkSlider->setUpperLinLimit(0.1f); -// m_forkSlider->setLowerAngLimit(-LIFT_EPS); -// m_forkSlider->setUpperAngLimit(LIFT_EPS); - m_forkSlider->setLowerAngLimit(0.0f); - m_forkSlider->setUpperAngLimit(0.0f); - m_dynamicsWorld->addConstraint(m_forkSlider, true); - - - btCompoundShape* loadCompound = new btCompoundShape(); - m_collisionShapes.push_back(loadCompound); - btCollisionShape* loadShapeA = new btBoxShape(btVector3(2.0f,0.5f,0.5f)); - m_collisionShapes.push_back(loadShapeA); - btTransform loadTrans; - loadTrans.setIdentity(); - loadCompound->addChildShape(loadTrans, loadShapeA); - btCollisionShape* loadShapeB = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); - m_collisionShapes.push_back(loadShapeB); - loadTrans.setIdentity(); - loadTrans.setOrigin(btVector3(2.1f, 0.0f, 0.0f)); - loadCompound->addChildShape(loadTrans, loadShapeB); - btCollisionShape* loadShapeC = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); - m_collisionShapes.push_back(loadShapeC); - loadTrans.setIdentity(); - loadTrans.setOrigin(btVector3(-2.1f, 0.0f, 0.0f)); - loadCompound->addChildShape(loadTrans, loadShapeC); - loadTrans.setIdentity(); - m_loadStartPos = btVector3(0.0f, -3.5f, 7.0f); - loadTrans.setOrigin(m_loadStartPos); - m_loadBody = localCreateRigidBody(4, loadTrans, loadCompound); - } - - - - clientResetScene(); - - /// create vehicle - { - - m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); - m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); - - ///never deactivate the vehicle - m_carChassis->setActivationState(DISABLE_DEACTIVATION); - - m_dynamicsWorld->addVehicle(m_vehicle); - - float connectionHeight = 1.2f; - - - bool isFrontWheel=true; - - //choose coordinate system - m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); - -#ifdef FORCE_ZAXIS_UP - btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); -#else - btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); -#endif - - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); -#ifdef FORCE_ZAXIS_UP - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); -#else - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); -#endif - - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); -#ifdef FORCE_ZAXIS_UP - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); -#else - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); -#endif //FORCE_ZAXIS_UP - isFrontWheel = false; - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); -#ifdef FORCE_ZAXIS_UP - connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); -#else - connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); -#endif - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); - - for (int i=0;igetNumWheels();i++) - { - btWheelInfo& wheel = m_vehicle->getWheelInfo(i); - wheel.m_suspensionStiffness = suspensionStiffness; - wheel.m_wheelsDampingRelaxation = suspensionDamping; - wheel.m_wheelsDampingCompression = suspensionCompression; - wheel.m_frictionSlip = wheelFriction; - wheel.m_rollInfluence = rollInfluence; - } - } - - - setCameraDistance(26.f); - -} - - -//to be implemented by the demo -void ForkLiftDemo::renderme() -{ - - updateCamera(); - - btScalar m[16]; - int i; - - btVector3 wheelColor(1,0,0); - - btVector3 worldBoundsMin,worldBoundsMax; - getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); - - - - for (i=0;igetNumWheels();i++) - { - //synchronize the wheels with the (interpolated) chassis worldtransform - m_vehicle->updateWheelTransform(i,true); - //draw wheels (cylinders) - m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); - m_shapeDrawer->drawOpenGL(m,m_wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); - } - - - int lineWidth=250; - int xStart = m_glutScreenWidth - lineWidth; - int yStart = 20; - - if((getDebugMode() & btIDebugDraw::DBG_NoHelpText)==0) - { - setOrthographicProjection(); - glDisable(GL_LIGHTING); - glColor3f(0, 0, 0); - char buf[124]; - - glRasterPos3f(xStart, yStart, 0); - sprintf(buf,"SHIFT+Cursor Left/Right - rotate lift"); - GLDebugDrawString(xStart,20,buf); - yStart+=20; - glRasterPos3f(xStart, yStart, 0); - sprintf(buf,"SHIFT+Cursor UP/Down - move fork up/down"); - yStart+=20; - GLDebugDrawString(xStart,yStart,buf); - glRasterPos3f(xStart, yStart, 0); - sprintf(buf,"F5 - toggle camera mode"); - yStart+=20; - GLDebugDrawString(xStart,yStart,buf); - glRasterPos3f(xStart, yStart, 0); - sprintf(buf,"Click inside this window for keyboard focus"); - yStart+=20; - GLDebugDrawString(xStart,yStart,buf); - - - resetPerspectiveProjection(); - glEnable(GL_LIGHTING); - } - DemoApplication::renderme(); -} - -void ForkLiftDemo::clientMoveAndDisplay() -{ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - { - int wheelIndex = 2; - m_vehicle->applyEngineForce(gEngineForce,wheelIndex); - m_vehicle->setBrake(gBreakingForce,wheelIndex); - wheelIndex = 3; - m_vehicle->applyEngineForce(gEngineForce,wheelIndex); - m_vehicle->setBrake(gBreakingForce,wheelIndex); - - - wheelIndex = 0; - m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); - wheelIndex = 1; - m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); - - } - - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - if (m_dynamicsWorld) - { - //during idle mode, just run 1 simulation step maximum - int maxSimSubSteps = m_idle ? 1 : 2; - if (m_idle) - dt = 1.0/420.f; - - int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); - - -//#define VERBOSE_FEEDBACK -#ifdef VERBOSE_FEEDBACK - 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_FEEDBACK - - } - - - - - - - -#ifdef USE_QUICKPROF - btProfiler::beginBlock("render"); -#endif //USE_QUICKPROF - - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - -#ifdef USE_QUICKPROF - btProfiler::endBlock("render"); -#endif - - - glFlush(); - glutSwapBuffers(); - -} - - - -void ForkLiftDemo::displayCallback(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - -//optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - - - -void ForkLiftDemo::clientResetScene() -{ - gVehicleSteering = 0.f; - gBreakingForce = defaultBreakingForce; - gEngineForce = 0.f; - - m_carChassis->setCenterOfMassTransform(btTransform::getIdentity()); - m_carChassis->setLinearVelocity(btVector3(0,0,0)); - m_carChassis->setAngularVelocity(btVector3(0,0,0)); - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_carChassis->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - if (m_vehicle) - { - m_vehicle->resetSuspension(); - for (int i=0;igetNumWheels();i++) - { - //synchronize the wheels with the (interpolated) chassis worldtransform - m_vehicle->updateWheelTransform(i,true); - } - } - btTransform liftTrans; - liftTrans.setIdentity(); - liftTrans.setOrigin(m_liftStartPos); - m_liftBody->activate(); - m_liftBody->setCenterOfMassTransform(liftTrans); - m_liftBody->setLinearVelocity(btVector3(0,0,0)); - m_liftBody->setAngularVelocity(btVector3(0,0,0)); - - btTransform forkTrans; - forkTrans.setIdentity(); - forkTrans.setOrigin(m_forkStartPos); - m_forkBody->activate(); - m_forkBody->setCenterOfMassTransform(forkTrans); - m_forkBody->setLinearVelocity(btVector3(0,0,0)); - m_forkBody->setAngularVelocity(btVector3(0,0,0)); - -// m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); - m_liftHinge->setLimit(0.0f, 0.0f); - m_liftHinge->enableAngularMotor(false, 0, 0); - - - m_forkSlider->setLowerLinLimit(0.1f); - m_forkSlider->setUpperLinLimit(0.1f); - m_forkSlider->setPoweredLinMotor(false); - - btTransform loadTrans; - loadTrans.setIdentity(); - loadTrans.setOrigin(m_loadStartPos); - m_loadBody->activate(); - m_loadBody->setCenterOfMassTransform(loadTrans); - m_loadBody->setLinearVelocity(btVector3(0,0,0)); - m_loadBody->setAngularVelocity(btVector3(0,0,0)); - -} - - - -void ForkLiftDemo::specialKeyboardUp(int key, int x, int y) -{ - switch (key) - { - case GLUT_KEY_UP : - { - lockForkSlider(); - gEngineForce = 0.f; - gBreakingForce = defaultBreakingForce; - break; - } - case GLUT_KEY_DOWN : - { - lockForkSlider(); - gEngineForce = 0.f; - gBreakingForce = defaultBreakingForce; - break; - } - case GLUT_KEY_LEFT: - case GLUT_KEY_RIGHT: - { - lockLiftHinge(); - break; - } - default: - DemoApplication::specialKeyboardUp(key,x,y); - break; - } -} - - -void ForkLiftDemo::specialKeyboard(int key, int x, int y) -{ - - if (key==GLUT_KEY_END) - return; - - // printf("key = %i x=%i y=%i\n",key,x,y); - - int state; - state=glutGetModifiers(); - if (state & GLUT_ACTIVE_SHIFT) - { - switch (key) - { - case GLUT_KEY_LEFT : - { - - m_liftHinge->setLimit(-M_PI/16.0f, M_PI/8.0f); - m_liftHinge->enableAngularMotor(true, -0.1, 10.0); - break; - } - case GLUT_KEY_RIGHT : - { - - m_liftHinge->setLimit(-M_PI/16.0f, M_PI/8.0f); - m_liftHinge->enableAngularMotor(true, 0.1, 10.0); - break; - } - case GLUT_KEY_UP : - { - m_forkSlider->setLowerLinLimit(0.1f); - m_forkSlider->setUpperLinLimit(3.9f); - m_forkSlider->setPoweredLinMotor(true); - m_forkSlider->setMaxLinMotorForce(10.0); - m_forkSlider->setTargetLinMotorVelocity(1.0); - break; - } - case GLUT_KEY_DOWN : - { - m_forkSlider->setLowerLinLimit(0.1f); - m_forkSlider->setUpperLinLimit(3.9f); - m_forkSlider->setPoweredLinMotor(true); - m_forkSlider->setMaxLinMotorForce(10.0); - m_forkSlider->setTargetLinMotorVelocity(-1.0); - break; - } - - default: - DemoApplication::specialKeyboard(key,x,y); - break; - } - - } else - { - switch (key) - { - case GLUT_KEY_LEFT : - { - gVehicleSteering += steeringIncrement; - if ( gVehicleSteering > steeringClamp) - gVehicleSteering = steeringClamp; - - break; - } - case GLUT_KEY_RIGHT : - { - gVehicleSteering -= steeringIncrement; - if ( gVehicleSteering < -steeringClamp) - gVehicleSteering = -steeringClamp; - - break; - } - case GLUT_KEY_UP : - { - gEngineForce = maxEngineForce; - gBreakingForce = 0.f; - break; - } - case GLUT_KEY_DOWN : - { - gEngineForce = -maxEngineForce; - gBreakingForce = 0.f; - break; - } - - case GLUT_KEY_F5: - m_useDefaultCamera = !m_useDefaultCamera; - break; - default: - DemoApplication::specialKeyboard(key,x,y); - break; - } - - } - // glutPostRedisplay(); - - -} - -void ForkLiftDemo::updateCamera() -{ - -//#define DISABLE_CAMERA 1 - if(m_useDefaultCamera) - { - DemoApplication::updateCamera(); - return; - } - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - btTransform chassisWorldTrans; - - //look at the vehicle - m_carChassis->getMotionState()->getWorldTransform(chassisWorldTrans); - m_cameraTargetPosition = chassisWorldTrans.getOrigin(); - - //interpolate the camera height -#ifdef FORCE_ZAXIS_UP - m_cameraPosition[2] = (15.0*m_cameraPosition[2] + m_cameraTargetPosition[2] + m_cameraHeight)/16.0; -#else - m_cameraPosition[1] = (15.0*m_cameraPosition[1] + m_cameraTargetPosition[1] + m_cameraHeight)/16.0; -#endif - - btVector3 camToObject = m_cameraTargetPosition - m_cameraPosition; - - //keep distance between min and max distance - float cameraDistance = camToObject.length(); - float correctionFactor = 0.f; - if (cameraDistance < m_minCameraDistance) - { - correctionFactor = 0.15*(m_minCameraDistance-cameraDistance)/cameraDistance; - } - if (cameraDistance > m_maxCameraDistance) - { - correctionFactor = 0.15*(m_maxCameraDistance-cameraDistance)/cameraDistance; - } - m_cameraPosition -= correctionFactor*camToObject; - - //update OpenGL camera settings - btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; - glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], - m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], - m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); - - - -} - -void ForkLiftDemo::lockLiftHinge(void) -{ - btScalar hingeAngle = m_liftHinge->getHingeAngle(); - btScalar lowLim = m_liftHinge->getLowerLimit(); - btScalar hiLim = m_liftHinge->getUpperLimit(); - m_liftHinge->enableAngularMotor(false, 0, 0); - if(hingeAngle < lowLim) - { -// m_liftHinge->setLimit(lowLim, lowLim + LIFT_EPS); - m_liftHinge->setLimit(lowLim, lowLim); - } - else if(hingeAngle > hiLim) - { -// m_liftHinge->setLimit(hiLim - LIFT_EPS, hiLim); - m_liftHinge->setLimit(hiLim, hiLim); - } - else - { -// m_liftHinge->setLimit(hingeAngle - LIFT_EPS, hingeAngle + LIFT_EPS); - m_liftHinge->setLimit(hingeAngle, hingeAngle); - } - return; -} // ForkLiftDemo::lockLiftHinge() - -void ForkLiftDemo::lockForkSlider(void) -{ - btScalar linDepth = m_forkSlider->getLinearPos(); - btScalar lowLim = m_forkSlider->getLowerLinLimit(); - btScalar hiLim = m_forkSlider->getUpperLinLimit(); - m_forkSlider->setPoweredLinMotor(false); - if(linDepth <= lowLim) - { - m_forkSlider->setLowerLinLimit(lowLim); - m_forkSlider->setUpperLinLimit(lowLim); - } - else if(linDepth > hiLim) - { - m_forkSlider->setLowerLinLimit(hiLim); - m_forkSlider->setUpperLinLimit(hiLim); - } - else - { - m_forkSlider->setLowerLinLimit(linDepth); - m_forkSlider->setUpperLinLimit(linDepth); - } - return; -} // ForkLiftDemo::lockForkSlider() +/* +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. +*/ + +///September 2006: VehicleDemo is work in progress, this file is mostly just a placeholder +///This VehicleDemo file is very early in development, please check it later +///@todo is a basic engine model: +///A function that maps user input (throttle) into torque/force applied on the wheels +///with gears etc. +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" +#include "GLDebugFont.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 +#endif + +#ifndef M_PI_4 +#define M_PI_4 0.785398163397448309616 +#endif + +//#define LIFT_EPS 0.0000001f +// +// By default, Bullet Vehicle uses Y as up axis. +// You can override the up axis, for example Z-axis up. Enable this define to see how to: +//#define FORCE_ZAXIS_UP 1 +// + +#ifdef FORCE_ZAXIS_UP + int rightIndex = 0; + int upIndex = 2; + int forwardIndex = 1; + btVector3 wheelDirectionCS0(0,0,-1); + btVector3 wheelAxleCS(1,0,0); +#else + int rightIndex = 0; + int upIndex = 1; + int forwardIndex = 2; + btVector3 wheelDirectionCS0(0,-1,0); + btVector3 wheelAxleCS(-1,0,0); +#endif + +#include "GLDebugDrawer.h" +#include //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "ForkLiftDemo.h" + + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +///btRaycastVehicle is the interface for the constraint that implements the raycast vehicle +///notice that for higher-quality slow-moving vehicles, another approach might be better +///implementing explicit hinged-wheel constraints with cylinder collision, rather then raycasts +float gEngineForce = 0.f; + +float defaultBreakingForce = 10.f; +float gBreakingForce = 100.f; + +float maxEngineForce = 1000.f;//this should be engine/velocity dependent +float maxBreakingForce = 100.f; + +float gVehicleSteering = 0.f; +float steeringIncrement = 0.04f; +float steeringClamp = 0.3f; +float wheelRadius = 0.5f; +float wheelWidth = 0.4f; +float wheelFriction = 1000;//BT_LARGE_FLOAT; +float suspensionStiffness = 20.f; +float suspensionDamping = 2.3f; +float suspensionCompression = 4.4f; +float rollInfluence = 0.1f;//1.0f; + + +btScalar suspensionRestLength(0.6); + +#define CUBE_HALF_EXTENTS 1 + + + +//////////////////////////////////// + + + + +ForkLiftDemo::ForkLiftDemo() +: +m_carChassis(0), +m_liftBody(0), +m_forkBody(0), +m_loadBody(0), +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_vehicle = 0; + m_wheelShape = 0; + m_cameraPosition = btVector3(30,30,30); + m_useDefaultCamera = false; + setTexturing(true); + setShadows(true); + +} + + +void ForkLiftDemo::termPhysics() +{ + //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()) + { + + while (body->getNumConstraintRefs()) + { + btTypedConstraint* constraint = body->getConstraintRef(0); + m_dynamicsWorld->removeConstraint(constraint); + delete constraint; + } + delete body->getMotionState(); + m_dynamicsWorld->removeRigidBody(body); + } else + { + m_dynamicsWorld->removeCollisionObject( obj ); + } + delete obj; + } + + //delete collision shapes + for (int j=0;jsetGravity(btVector3(0,0,-10)); +#endif + + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); +btTransform tr; +tr.setIdentity(); +tr.setOrigin(btVector3(0,-10,0)); + +//either use heightfield or triangle mesh + + + //create ground object + localCreateRigidBody(0,tr,groundShape); + +#ifdef FORCE_ZAXIS_UP +// indexRightAxis = 0; +// indexUpAxis = 2; +// indexForwardAxis = 1; + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); + btCompoundShape* compound = new btCompoundShape(); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,0,1)); +#else + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); + m_collisionShapes.push_back(chassisShape); + + btCompoundShape* compound = new btCompoundShape(); + m_collisionShapes.push_back(compound); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,1,0)); +#endif + + compound->addChildShape(localTrans,chassisShape); + + { + btCollisionShape* suppShape = new btBoxShape(btVector3(0.5f,0.1f,0.5f)); + btTransform suppLocalTrans; + suppLocalTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + suppLocalTrans.setOrigin(btVector3(0,1.0,2.5)); + compound->addChildShape(suppLocalTrans, suppShape); + } + + tr.setOrigin(btVector3(0,0.f,0)); + + m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); + //m_carChassis->setDamping(0.2,0.2); + + m_wheelShape = new btCylinderShapeX(btVector3(wheelWidth,wheelRadius,wheelRadius)); + + { + btCollisionShape* liftShape = new btBoxShape(btVector3(0.5f,2.0f,0.05f)); + m_collisionShapes.push_back(liftShape); + btTransform liftTrans; + m_liftStartPos = btVector3(0.0f, 2.5f, 3.05f); + liftTrans.setIdentity(); + liftTrans.setOrigin(m_liftStartPos); + m_liftBody = localCreateRigidBody(10,liftTrans, liftShape); + + btTransform localA, localB; + localA.setIdentity(); + localB.setIdentity(); + localA.getBasis().setEulerZYX(0, M_PI_2, 0); + localA.setOrigin(btVector3(0.0, 1.0, 3.05)); + localB.getBasis().setEulerZYX(0, M_PI_2, 0); + localB.setOrigin(btVector3(0.0, -1.5, -0.05)); + m_liftHinge = new btHingeConstraint(*m_carChassis,*m_liftBody, localA, localB); +// m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); + m_liftHinge->setLimit(0.0f, 0.0f); + m_dynamicsWorld->addConstraint(m_liftHinge, true); + + btCollisionShape* forkShapeA = new btBoxShape(btVector3(1.0f,0.1f,0.1f)); + m_collisionShapes.push_back(forkShapeA); + btCompoundShape* forkCompound = new btCompoundShape(); + m_collisionShapes.push_back(forkCompound); + btTransform forkLocalTrans; + forkLocalTrans.setIdentity(); + forkCompound->addChildShape(forkLocalTrans, forkShapeA); + + btCollisionShape* forkShapeB = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); + m_collisionShapes.push_back(forkShapeB); + forkLocalTrans.setIdentity(); + forkLocalTrans.setOrigin(btVector3(-0.9f, -0.08f, 0.7f)); + forkCompound->addChildShape(forkLocalTrans, forkShapeB); + + btCollisionShape* forkShapeC = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); + m_collisionShapes.push_back(forkShapeC); + forkLocalTrans.setIdentity(); + forkLocalTrans.setOrigin(btVector3(0.9f, -0.08f, 0.7f)); + forkCompound->addChildShape(forkLocalTrans, forkShapeC); + + btTransform forkTrans; + m_forkStartPos = btVector3(0.0f, 0.6f, 3.2f); + forkTrans.setIdentity(); + forkTrans.setOrigin(m_forkStartPos); + m_forkBody = localCreateRigidBody(5, forkTrans, forkCompound); + + localA.setIdentity(); + localB.setIdentity(); + localA.getBasis().setEulerZYX(0, 0, M_PI_2); + localA.setOrigin(btVector3(0.0f, -1.9f, 0.05f)); + localB.getBasis().setEulerZYX(0, 0, M_PI_2); + localB.setOrigin(btVector3(0.0, 0.0, -0.1)); + m_forkSlider = new btSliderConstraint(*m_liftBody, *m_forkBody, localA, localB, true); + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(0.1f); +// m_forkSlider->setLowerAngLimit(-LIFT_EPS); +// m_forkSlider->setUpperAngLimit(LIFT_EPS); + m_forkSlider->setLowerAngLimit(0.0f); + m_forkSlider->setUpperAngLimit(0.0f); + m_dynamicsWorld->addConstraint(m_forkSlider, true); + + + btCompoundShape* loadCompound = new btCompoundShape(); + m_collisionShapes.push_back(loadCompound); + btCollisionShape* loadShapeA = new btBoxShape(btVector3(2.0f,0.5f,0.5f)); + m_collisionShapes.push_back(loadShapeA); + btTransform loadTrans; + loadTrans.setIdentity(); + loadCompound->addChildShape(loadTrans, loadShapeA); + btCollisionShape* loadShapeB = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); + m_collisionShapes.push_back(loadShapeB); + loadTrans.setIdentity(); + loadTrans.setOrigin(btVector3(2.1f, 0.0f, 0.0f)); + loadCompound->addChildShape(loadTrans, loadShapeB); + btCollisionShape* loadShapeC = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); + m_collisionShapes.push_back(loadShapeC); + loadTrans.setIdentity(); + loadTrans.setOrigin(btVector3(-2.1f, 0.0f, 0.0f)); + loadCompound->addChildShape(loadTrans, loadShapeC); + loadTrans.setIdentity(); + m_loadStartPos = btVector3(0.0f, -3.5f, 7.0f); + loadTrans.setOrigin(m_loadStartPos); + m_loadBody = localCreateRigidBody(4, loadTrans, loadCompound); + } + + + + clientResetScene(); + + /// create vehicle + { + + m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); + m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); + + ///never deactivate the vehicle + m_carChassis->setActivationState(DISABLE_DEACTIVATION); + + m_dynamicsWorld->addVehicle(m_vehicle); + + float connectionHeight = 1.2f; + + + bool isFrontWheel=true; + + //choose coordinate system + m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); + +#ifdef FORCE_ZAXIS_UP + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif //FORCE_ZAXIS_UP + isFrontWheel = false; + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); + + for (int i=0;igetNumWheels();i++) + { + btWheelInfo& wheel = m_vehicle->getWheelInfo(i); + wheel.m_suspensionStiffness = suspensionStiffness; + wheel.m_wheelsDampingRelaxation = suspensionDamping; + wheel.m_wheelsDampingCompression = suspensionCompression; + wheel.m_frictionSlip = wheelFriction; + wheel.m_rollInfluence = rollInfluence; + } + } + + + setCameraDistance(26.f); + +} + + +//to be implemented by the demo +void ForkLiftDemo::renderme() +{ + + updateCamera(); + + btScalar m[16]; + int i; + + btVector3 wheelColor(1,0,0); + + btVector3 worldBoundsMin,worldBoundsMax; + getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + + for (i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + //draw wheels (cylinders) + m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); + m_shapeDrawer->drawOpenGL(m,m_wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + int lineWidth=250; + int xStart = m_glutScreenWidth - lineWidth; + int yStart = 20; + + if((getDebugMode() & btIDebugDraw::DBG_NoHelpText)==0) + { + setOrthographicProjection(); + glDisable(GL_LIGHTING); + glColor3f(0, 0, 0); + char buf[124]; + + glRasterPos3f(xStart, yStart, 0); + sprintf(buf,"SHIFT+Cursor Left/Right - rotate lift"); + GLDebugDrawString(xStart,20,buf); + yStart+=20; + glRasterPos3f(xStart, yStart, 0); + sprintf(buf,"SHIFT+Cursor UP/Down - move fork up/down"); + yStart+=20; + GLDebugDrawString(xStart,yStart,buf); + glRasterPos3f(xStart, yStart, 0); + sprintf(buf,"F5 - toggle camera mode"); + yStart+=20; + GLDebugDrawString(xStart,yStart,buf); + glRasterPos3f(xStart, yStart, 0); + sprintf(buf,"Click inside this window for keyboard focus"); + yStart+=20; + GLDebugDrawString(xStart,yStart,buf); + + + resetPerspectiveProjection(); + glEnable(GL_LIGHTING); + } + DemoApplication::renderme(); +} + +void ForkLiftDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + { + int wheelIndex = 2; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + wheelIndex = 3; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + + + wheelIndex = 0; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + wheelIndex = 1; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + + } + + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + 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_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void ForkLiftDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + +//optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + +void ForkLiftDemo::clientResetScene() +{ + gVehicleSteering = 0.f; + gBreakingForce = defaultBreakingForce; + gEngineForce = 0.f; + + m_carChassis->setCenterOfMassTransform(btTransform::getIdentity()); + m_carChassis->setLinearVelocity(btVector3(0,0,0)); + m_carChassis->setAngularVelocity(btVector3(0,0,0)); + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_carChassis->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + if (m_vehicle) + { + m_vehicle->resetSuspension(); + for (int i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + } + } + btTransform liftTrans; + liftTrans.setIdentity(); + liftTrans.setOrigin(m_liftStartPos); + m_liftBody->activate(); + m_liftBody->setCenterOfMassTransform(liftTrans); + m_liftBody->setLinearVelocity(btVector3(0,0,0)); + m_liftBody->setAngularVelocity(btVector3(0,0,0)); + + btTransform forkTrans; + forkTrans.setIdentity(); + forkTrans.setOrigin(m_forkStartPos); + m_forkBody->activate(); + m_forkBody->setCenterOfMassTransform(forkTrans); + m_forkBody->setLinearVelocity(btVector3(0,0,0)); + m_forkBody->setAngularVelocity(btVector3(0,0,0)); + +// m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); + m_liftHinge->setLimit(0.0f, 0.0f); + m_liftHinge->enableAngularMotor(false, 0, 0); + + + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(0.1f); + m_forkSlider->setPoweredLinMotor(false); + + btTransform loadTrans; + loadTrans.setIdentity(); + loadTrans.setOrigin(m_loadStartPos); + m_loadBody->activate(); + m_loadBody->setCenterOfMassTransform(loadTrans); + m_loadBody->setLinearVelocity(btVector3(0,0,0)); + m_loadBody->setAngularVelocity(btVector3(0,0,0)); + +} + + + +void ForkLiftDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP : + { + lockForkSlider(); + gEngineForce = 0.f; + gBreakingForce = defaultBreakingForce; + break; + } + case GLUT_KEY_DOWN : + { + lockForkSlider(); + gEngineForce = 0.f; + gBreakingForce = defaultBreakingForce; + break; + } + case GLUT_KEY_LEFT: + case GLUT_KEY_RIGHT: + { + lockLiftHinge(); + break; + } + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } +} + + +void ForkLiftDemo::specialKeyboard(int key, int x, int y) +{ + + if (key==GLUT_KEY_END) + return; + + // printf("key = %i x=%i y=%i\n",key,x,y); + + int state; + state=glutGetModifiers(); + if (state & GLUT_ACTIVE_SHIFT) + { + switch (key) + { + case GLUT_KEY_LEFT : + { + + m_liftHinge->setLimit(-M_PI/16.0f, M_PI/8.0f); + m_liftHinge->enableAngularMotor(true, -0.1, 10.0); + break; + } + case GLUT_KEY_RIGHT : + { + + m_liftHinge->setLimit(-M_PI/16.0f, M_PI/8.0f); + m_liftHinge->enableAngularMotor(true, 0.1, 10.0); + break; + } + case GLUT_KEY_UP : + { + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(3.9f); + m_forkSlider->setPoweredLinMotor(true); + m_forkSlider->setMaxLinMotorForce(10.0); + m_forkSlider->setTargetLinMotorVelocity(1.0); + break; + } + case GLUT_KEY_DOWN : + { + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(3.9f); + m_forkSlider->setPoweredLinMotor(true); + m_forkSlider->setMaxLinMotorForce(10.0); + m_forkSlider->setTargetLinMotorVelocity(-1.0); + break; + } + + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + + } else + { + switch (key) + { + case GLUT_KEY_LEFT : + { + gVehicleSteering += steeringIncrement; + if ( gVehicleSteering > steeringClamp) + gVehicleSteering = steeringClamp; + + break; + } + case GLUT_KEY_RIGHT : + { + gVehicleSteering -= steeringIncrement; + if ( gVehicleSteering < -steeringClamp) + gVehicleSteering = -steeringClamp; + + break; + } + case GLUT_KEY_UP : + { + gEngineForce = maxEngineForce; + gBreakingForce = 0.f; + break; + } + case GLUT_KEY_DOWN : + { + gEngineForce = -maxEngineForce; + gBreakingForce = 0.f; + break; + } + + case GLUT_KEY_F5: + m_useDefaultCamera = !m_useDefaultCamera; + break; + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + + } + // glutPostRedisplay(); + + +} + +void ForkLiftDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 + if(m_useDefaultCamera) + { + DemoApplication::updateCamera(); + return; + } + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform chassisWorldTrans; + + //look at the vehicle + m_carChassis->getMotionState()->getWorldTransform(chassisWorldTrans); + m_cameraTargetPosition = chassisWorldTrans.getOrigin(); + + //interpolate the camera height +#ifdef FORCE_ZAXIS_UP + m_cameraPosition[2] = (15.0*m_cameraPosition[2] + m_cameraTargetPosition[2] + m_cameraHeight)/16.0; +#else + m_cameraPosition[1] = (15.0*m_cameraPosition[1] + m_cameraTargetPosition[1] + m_cameraHeight)/16.0; +#endif + + btVector3 camToObject = m_cameraTargetPosition - m_cameraPosition; + + //keep distance between min and max distance + float cameraDistance = camToObject.length(); + float correctionFactor = 0.f; + if (cameraDistance < m_minCameraDistance) + { + correctionFactor = 0.15*(m_minCameraDistance-cameraDistance)/cameraDistance; + } + if (cameraDistance > m_maxCameraDistance) + { + correctionFactor = 0.15*(m_maxCameraDistance-cameraDistance)/cameraDistance; + } + m_cameraPosition -= correctionFactor*camToObject; + + //update OpenGL camera settings + btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + +void ForkLiftDemo::lockLiftHinge(void) +{ + btScalar hingeAngle = m_liftHinge->getHingeAngle(); + btScalar lowLim = m_liftHinge->getLowerLimit(); + btScalar hiLim = m_liftHinge->getUpperLimit(); + m_liftHinge->enableAngularMotor(false, 0, 0); + if(hingeAngle < lowLim) + { +// m_liftHinge->setLimit(lowLim, lowLim + LIFT_EPS); + m_liftHinge->setLimit(lowLim, lowLim); + } + else if(hingeAngle > hiLim) + { +// m_liftHinge->setLimit(hiLim - LIFT_EPS, hiLim); + m_liftHinge->setLimit(hiLim, hiLim); + } + else + { +// m_liftHinge->setLimit(hingeAngle - LIFT_EPS, hingeAngle + LIFT_EPS); + m_liftHinge->setLimit(hingeAngle, hingeAngle); + } + return; +} // ForkLiftDemo::lockLiftHinge() + +void ForkLiftDemo::lockForkSlider(void) +{ + btScalar linDepth = m_forkSlider->getLinearPos(); + btScalar lowLim = m_forkSlider->getLowerLinLimit(); + btScalar hiLim = m_forkSlider->getUpperLinLimit(); + m_forkSlider->setPoweredLinMotor(false); + if(linDepth <= lowLim) + { + m_forkSlider->setLowerLinLimit(lowLim); + m_forkSlider->setUpperLinLimit(lowLim); + } + else if(linDepth > hiLim) + { + m_forkSlider->setLowerLinLimit(hiLim); + m_forkSlider->setUpperLinLimit(hiLim); + } + else + { + m_forkSlider->setLowerLinLimit(linDepth); + m_forkSlider->setUpperLinLimit(linDepth); + } + return; +} // ForkLiftDemo::lockForkSlider() diff --git a/Demos/ForkLiftDemo/ForkLiftDemo.h b/Demos/ForkLiftDemo/ForkLiftDemo.h index 37e77b30f..6d0c8255a 100644 --- a/Demos/ForkLiftDemo/ForkLiftDemo.h +++ b/Demos/ForkLiftDemo/ForkLiftDemo.h @@ -1,113 +1,113 @@ -/* -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 FORKLIFT_DEMO_H -#define FORKLIFT_DEMO_H - -class btVehicleTuning; -struct btVehicleRaycaster; -class btCollisionShape; - -#include "BulletDynamics/Vehicle/btRaycastVehicle.h" -#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" -#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" - -#include "GlutDemoApplication.h" - -///VehicleDemo shows how to setup and use the built-in raycast vehicle -class ForkLiftDemo : public GlutDemoApplication -{ - public: - - btRigidBody* m_carChassis; - -//---------------------------- - btRigidBody* m_liftBody; - btVector3 m_liftStartPos; - btHingeConstraint* m_liftHinge; - - btRigidBody* m_forkBody; - btVector3 m_forkStartPos; - btSliderConstraint* m_forkSlider; - - btRigidBody* m_loadBody; - btVector3 m_loadStartPos; - - void lockLiftHinge(void); - void lockForkSlider(void); - - bool m_useDefaultCamera; -//---------------------------- - - - btAlignedObjectArray m_collisionShapes; - - class btBroadphaseInterface* m_overlappingPairCache; - - class btCollisionDispatcher* m_dispatcher; - - class btConstraintSolver* m_constraintSolver; - - class btDefaultCollisionConfiguration* m_collisionConfiguration; - - class btTriangleIndexVertexArray* m_indexVertexArrays; - - btVector3* m_vertices; - - - btRaycastVehicle::btVehicleTuning m_tuning; - btVehicleRaycaster* m_vehicleRayCaster; - btRaycastVehicle* m_vehicle; - btCollisionShape* m_wheelShape; - - float m_cameraHeight; - - float m_minCameraDistance; - float m_maxCameraDistance; - - - ForkLiftDemo(); - - virtual ~ForkLiftDemo(); - - virtual void clientMoveAndDisplay(); - - virtual void clientResetScene(); - - virtual void displayCallback(); - - ///a very basic camera following the vehicle - virtual void updateCamera(); - - virtual void specialKeyboard(int key, int x, int y); - - virtual void specialKeyboardUp(int key, int x, int y); - - void renderme(); - - void initPhysics(); - void termPhysics(); - - static DemoApplication* Create() - { - ForkLiftDemo* demo = new ForkLiftDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -#endif // FORKLIFT_DEMO_H - - +/* +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 FORKLIFT_DEMO_H +#define FORKLIFT_DEMO_H + +class btVehicleTuning; +struct btVehicleRaycaster; +class btCollisionShape; + +#include "BulletDynamics/Vehicle/btRaycastVehicle.h" +#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" +#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" + +#include "GlutDemoApplication.h" + +///VehicleDemo shows how to setup and use the built-in raycast vehicle +class ForkLiftDemo : public GlutDemoApplication +{ + public: + + btRigidBody* m_carChassis; + +//---------------------------- + btRigidBody* m_liftBody; + btVector3 m_liftStartPos; + btHingeConstraint* m_liftHinge; + + btRigidBody* m_forkBody; + btVector3 m_forkStartPos; + btSliderConstraint* m_forkSlider; + + btRigidBody* m_loadBody; + btVector3 m_loadStartPos; + + void lockLiftHinge(void); + void lockForkSlider(void); + + bool m_useDefaultCamera; +//---------------------------- + + + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + class btTriangleIndexVertexArray* m_indexVertexArrays; + + btVector3* m_vertices; + + + btRaycastVehicle::btVehicleTuning m_tuning; + btVehicleRaycaster* m_vehicleRayCaster; + btRaycastVehicle* m_vehicle; + btCollisionShape* m_wheelShape; + + float m_cameraHeight; + + float m_minCameraDistance; + float m_maxCameraDistance; + + + ForkLiftDemo(); + + virtual ~ForkLiftDemo(); + + virtual void clientMoveAndDisplay(); + + virtual void clientResetScene(); + + virtual void displayCallback(); + + ///a very basic camera following the vehicle + virtual void updateCamera(); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + void renderme(); + + void initPhysics(); + void termPhysics(); + + static DemoApplication* Create() + { + ForkLiftDemo* demo = new ForkLiftDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif // FORKLIFT_DEMO_H + + diff --git a/Demos/GenericJointDemo/GenericJointDemo.cpp b/Demos/GenericJointDemo/GenericJointDemo.cpp index 7fb2957d0..35e24c1f7 100644 --- a/Demos/GenericJointDemo/GenericJointDemo.cpp +++ b/Demos/GenericJointDemo/GenericJointDemo.cpp @@ -1,135 +1,135 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Ragdoll Demo -Copyright (c) 2007 Starbreeze Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Originally Written by: Marten Svanfeldt -ReWritten by: Francisco León -*/ - - - -#include "btBulletDynamicsCommon.h" -#include "GlutStuff.h" -#include "GL_ShapeDrawer.h" - -#include "LinearMath/btIDebugDraw.h" - -#include "GLDebugDrawer.h" -#include "GenericJointDemo.h" - - - -GLDebugDrawer debugDrawer; - - - - - - -void GenericJointDemo::initPhysics() -{ - setTexturing(true); - setShadows(true); - - // Setup the basic world - - btDefaultCollisionConfiguration * collision_config = new btDefaultCollisionConfiguration(); - - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collision_config); - - btVector3 worldAabbMin(-10000,-10000,-10000); - btVector3 worldAabbMax(10000,10000,10000); - btBroadphaseInterface* overlappingPairCache = new btAxisSweep3 (worldAabbMin, worldAabbMax); - - btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver; - - - m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,constraintSolver,collision_config); - - m_dynamicsWorld->setGravity(btVector3(0,-30,0)); - - m_dynamicsWorld->setDebugDrawer(&debugDrawer); - - // Setup a big ground box - { - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-15,0)); - localCreateRigidBody(btScalar(0.),groundTransform,groundShape); - } - - // Spawn one ragdoll - spawnRagdoll(); - - clientResetScene(); -} - -void GenericJointDemo::spawnRagdoll(bool random) -{ - RagDoll* ragDoll = new RagDoll (m_dynamicsWorld, btVector3 (0,0,10),5.f); - m_ragdolls.push_back(ragDoll); -} - -void GenericJointDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - float minFPS = 1000000.f/60.f; - if (ms > minFPS) - ms = minFPS; - - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(ms / 1000000.f); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - - renderme(); - - glFlush(); - - swapBuffers(); -} - -void GenericJointDemo::displayCallback() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - swapBuffers(); -} - -void GenericJointDemo::keyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case 'e': - spawnRagdoll(true); - break; - default: - DemoApplication::keyboardCallback(key, x, y); - } - - -} +/* +Bullet Continuous Collision Detection and Physics Library +Ragdoll Demo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Originally Written by: Marten Svanfeldt +ReWritten by: Francisco León +*/ + + + +#include "btBulletDynamicsCommon.h" +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" + +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" +#include "GenericJointDemo.h" + + + +GLDebugDrawer debugDrawer; + + + + + + +void GenericJointDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + // Setup the basic world + + btDefaultCollisionConfiguration * collision_config = new btDefaultCollisionConfiguration(); + + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collision_config); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + btBroadphaseInterface* overlappingPairCache = new btAxisSweep3 (worldAabbMin, worldAabbMax); + + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver; + + + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,constraintSolver,collision_config); + + m_dynamicsWorld->setGravity(btVector3(0,-30,0)); + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); + + // Setup a big ground box + { + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-15,0)); + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); + } + + // Spawn one ragdoll + spawnRagdoll(); + + clientResetScene(); +} + +void GenericJointDemo::spawnRagdoll(bool random) +{ + RagDoll* ragDoll = new RagDoll (m_dynamicsWorld, btVector3 (0,0,10),5.f); + m_ragdolls.push_back(ragDoll); +} + +void GenericJointDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + glFlush(); + + swapBuffers(); +} + +void GenericJointDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + swapBuffers(); +} + +void GenericJointDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 'e': + spawnRagdoll(true); + break; + default: + DemoApplication::keyboardCallback(key, x, y); + } + + +} diff --git a/Demos/GenericJointDemo/GenericJointDemo.h b/Demos/GenericJointDemo/GenericJointDemo.h index 03bfe3f1c..68a11c052 100644 --- a/Demos/GenericJointDemo/GenericJointDemo.h +++ b/Demos/GenericJointDemo/GenericJointDemo.h @@ -1,51 +1,51 @@ -/* -Bullet Continuous Collision Detection and Physics Library -GenericJointDemo -Copyright (c) 2007 Starbreeze Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Marten Svanfeldt -*/ - -#ifndef GENERIGJOINTDEMO_H -#define GENERIGJOINTDEMO_H - -#ifdef _WINDOWS -#include "Win32DemoApplication.h" -#define PlatformDemoApplication Win32DemoApplication -#else -#include "GlutDemoApplication.h" -#define PlatformDemoApplication GlutDemoApplication -#endif - -#include "LinearMath/btAlignedObjectArray.h" -#include "Ragdoll.h" - -class GenericJointDemo : public PlatformDemoApplication -{ - - btAlignedObjectArray m_ragdolls; - -public: - void initPhysics(); - - void spawnRagdoll(bool random = false); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void keyboardCallback(unsigned char key, int x, int y); -}; - - -#endif +/* +Bullet Continuous Collision Detection and Physics Library +GenericJointDemo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Marten Svanfeldt +*/ + +#ifndef GENERIGJOINTDEMO_H +#define GENERIGJOINTDEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" +#include "Ragdoll.h" + +class GenericJointDemo : public PlatformDemoApplication +{ + + btAlignedObjectArray m_ragdolls; + +public: + void initPhysics(); + + void spawnRagdoll(bool random = false); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); +}; + + +#endif diff --git a/Demos/GenericJointDemo/Ragdoll.cpp b/Demos/GenericJointDemo/Ragdoll.cpp index 34451808b..0229f5ab5 100644 --- a/Demos/GenericJointDemo/Ragdoll.cpp +++ b/Demos/GenericJointDemo/Ragdoll.cpp @@ -1,373 +1,373 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Ragdoll Demo -Copyright (c) 2007 Starbreeze Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Marten Svanfeldt -*/ - -#include "Ragdoll.h" - -//#define RIGID 1 - -RagDoll::RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset, - btScalar scale_ragdoll) : m_ownerWorld (ownerWorld) -{ - - - // Setup the geometry - m_shapes[BODYPART_PELVIS] = new btCapsuleShape( - btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.20)); - m_shapes[BODYPART_SPINE] = new btCapsuleShape( - btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.28)); - m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(scale_ragdoll*0.10), btScalar(scale_ragdoll*0.05)); - m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45)); - m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37)); - m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45)); - m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37)); - m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33)); - m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25)); - m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33)); - m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25)); - - // Setup all the rigid bodies - btTransform offset; offset.setIdentity(); - offset.setOrigin(positionOffset); - - btTransform transform; - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.), btScalar(0.))); - m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.2), btScalar(0.))); - m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.6), btScalar(0.))); - m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), -btScalar(0.))); - m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.))); - m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), btScalar(0.))); - m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.))); - m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); - m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); - m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI); - m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI); - m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); - - // Setup some damping on the m_bodies - for (int i = 0; i < BODYPART_COUNT; ++i) - { - m_bodies[i]->setDamping(0.05f, 0.85f); - m_bodies[i]->setDeactivationTime(0.8f); - m_bodies[i]->setSleepingThresholds(1.6f, 2.5f); - } - -///////////////////////////// SETTING THE CONSTRAINTS /////////////////////////////////////////////7777 - // Now setup the constraints - btGeneric6DofConstraint * joint6DOF; - btTransform localA, localB; - bool useLinearReferenceFrameA = true; -/// ******* SPINE HEAD ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30*scale_ragdoll), btScalar(0.))); - - localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); - - joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.3f,-SIMD_EPSILON,-SIMD_PI*0.3f)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.5f,SIMD_EPSILON,SIMD_PI*0.3f)); -#endif - m_joints[JOINT_SPINE_HEAD] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); - } -/// *************************** /// - - - - -/// ******* LEFT SHOULDER ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(-0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.))); - - localB.getBasis().setEulerZYX(SIMD_HALF_PI,0,-SIMD_HALF_PI); - localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.))); - - joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f)); -#endif - m_joints[JOINT_LEFT_SHOULDER] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); - } -/// *************************** /// - - -/// ******* RIGHT SHOULDER ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); - localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.))); - joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f)); -#endif - m_joints[JOINT_RIGHT_SHOULDER] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); - } -/// *************************** /// - -/// ******* LEFT ELBOW ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.))); - localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); - joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); -#endif - m_joints[JOINT_LEFT_ELBOW] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); - } -/// *************************** /// - -/// ******* RIGHT ELBOW ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.))); - localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); - joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7,SIMD_EPSILON,SIMD_EPSILON)); -#endif - - m_joints[JOINT_RIGHT_ELBOW] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); - } -/// *************************** /// - - -/// ******* PELVIS ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.getBasis().setEulerZYX(0,SIMD_HALF_PI,0); - localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15*scale_ragdoll), btScalar(0.))); - localB.getBasis().setEulerZYX(0,SIMD_HALF_PI,0); - localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15*scale_ragdoll), btScalar(0.))); - joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.2,-SIMD_EPSILON,-SIMD_PI*0.3)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.2,SIMD_EPSILON,SIMD_PI*0.6)); -#endif - m_joints[JOINT_PELVIS_SPINE] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); - } -/// *************************** /// - -/// ******* LEFT HIP ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.))); - - localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.))); - - joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_HALF_PI*0.6f)); -#endif - m_joints[JOINT_LEFT_HIP] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); - } -/// *************************** /// - - -/// ******* RIGHT HIP ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.))); - localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.))); - - joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_HALF_PI*0.6f)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_EPSILON)); -#endif - m_joints[JOINT_RIGHT_HIP] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); - } -/// *************************** /// - - -/// ******* LEFT KNEE ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.))); - localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.))); - joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB,useLinearReferenceFrameA); -// -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); -#endif - m_joints[JOINT_LEFT_KNEE] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); - } -/// *************************** /// - -/// ******* RIGHT KNEE ******** /// - { - localA.setIdentity(); localB.setIdentity(); - - localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.))); - localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.))); - joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB,useLinearReferenceFrameA); - -#ifdef RIGID - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); -#else - joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); - joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); -#endif - m_joints[JOINT_RIGHT_KNEE] = joint6DOF; - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); - } -/// *************************** /// - -} - - -RagDoll::~RagDoll() -{ - int i; - - // Remove all constraints - for (i = 0; i < JOINT_COUNT; ++i) - { - m_ownerWorld->removeConstraint(m_joints[i]); - delete m_joints[i]; m_joints[i] = 0; - } - - // Remove all bodies and shapes - for (i = 0; i < BODYPART_COUNT; ++i) - { - m_ownerWorld->removeRigidBody(m_bodies[i]); - - delete m_bodies[i]->getMotionState(); - - delete m_bodies[i]; m_bodies[i] = 0; - delete m_shapes[i]; m_shapes[i] = 0; - } -} - - -btRigidBody* RagDoll::localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) -{ - bool isDynamic = (mass != 0.f); - - btVector3 localInertia(0,0,0); - if (isDynamic) - shape->calculateLocalInertia(mass,localInertia); - - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); - rbInfo.m_additionalDamping = true; - btRigidBody* body = new btRigidBody(rbInfo); - - m_ownerWorld->addRigidBody(body); - - return body; -} +/* +Bullet Continuous Collision Detection and Physics Library +Ragdoll Demo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Marten Svanfeldt +*/ + +#include "Ragdoll.h" + +//#define RIGID 1 + +RagDoll::RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset, + btScalar scale_ragdoll) : m_ownerWorld (ownerWorld) +{ + + + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape( + btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.20)); + m_shapes[BODYPART_SPINE] = new btCapsuleShape( + btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.28)); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(scale_ragdoll*0.10), btScalar(scale_ragdoll*0.05)); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45)); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37)); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45)); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37)); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33)); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25)); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33)); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25)); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), +btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05f, 0.85f); + m_bodies[i]->setDeactivationTime(0.8f); + m_bodies[i]->setSleepingThresholds(1.6f, 2.5f); + } + +///////////////////////////// SETTING THE CONSTRAINTS /////////////////////////////////////////////7777 + // Now setup the constraints + btGeneric6DofConstraint * joint6DOF; + btTransform localA, localB; + bool useLinearReferenceFrameA = true; +/// ******* SPINE HEAD ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30*scale_ragdoll), btScalar(0.))); + + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.3f,-SIMD_EPSILON,-SIMD_PI*0.3f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.5f,SIMD_EPSILON,SIMD_PI*0.3f)); +#endif + m_joints[JOINT_SPINE_HEAD] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + } +/// *************************** /// + + + + +/// ******* LEFT SHOULDER ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(-0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.))); + + localB.getBasis().setEulerZYX(SIMD_HALF_PI,0,-SIMD_HALF_PI); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f)); +#endif + m_joints[JOINT_LEFT_SHOULDER] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + } +/// *************************** /// + + +/// ******* RIGHT SHOULDER ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f)); +#endif + m_joints[JOINT_RIGHT_SHOULDER] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + } +/// *************************** /// + +/// ******* LEFT ELBOW ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_LEFT_ELBOW] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + } +/// *************************** /// + +/// ******* RIGHT ELBOW ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7,SIMD_EPSILON,SIMD_EPSILON)); +#endif + + m_joints[JOINT_RIGHT_ELBOW] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } +/// *************************** /// + + +/// ******* PELVIS ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.getBasis().setEulerZYX(0,SIMD_HALF_PI,0); + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15*scale_ragdoll), btScalar(0.))); + localB.getBasis().setEulerZYX(0,SIMD_HALF_PI,0); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.2,-SIMD_EPSILON,-SIMD_PI*0.3)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.2,SIMD_EPSILON,SIMD_PI*0.6)); +#endif + m_joints[JOINT_PELVIS_SPINE] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + } +/// *************************** /// + +/// ******* LEFT HIP ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.))); + + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_HALF_PI*0.6f)); +#endif + m_joints[JOINT_LEFT_HIP] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + } +/// *************************** /// + + +/// ******* RIGHT HIP ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_HALF_PI*0.6f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_RIGHT_HIP] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + } +/// *************************** /// + + +/// ******* LEFT KNEE ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB,useLinearReferenceFrameA); +// +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_LEFT_KNEE] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + } +/// *************************** /// + +/// ******* RIGHT KNEE ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_RIGHT_KNEE] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + } +/// *************************** /// + +} + + +RagDoll::~RagDoll() +{ + int i; + + // Remove all constraints + for (i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for (i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } +} + + +btRigidBody* RagDoll::localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) +{ + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + rbInfo.m_additionalDamping = true; + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; +} diff --git a/Demos/GenericJointDemo/Ragdoll.h b/Demos/GenericJointDemo/Ragdoll.h index 5fe6e185e..29a9cbde1 100644 --- a/Demos/GenericJointDemo/Ragdoll.h +++ b/Demos/GenericJointDemo/Ragdoll.h @@ -1,71 +1,71 @@ -#ifndef RAGDOLL_H_INCLUDED -#define RAGDOLL_H_INCLUDED - -#include "DemoApplication.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "btBulletDynamicsCommon.h" - - - - -class RagDoll -{ - enum - { - BODYPART_PELVIS = 0, - BODYPART_SPINE, - BODYPART_HEAD, - - BODYPART_LEFT_UPPER_LEG, - BODYPART_LEFT_LOWER_LEG, - - BODYPART_RIGHT_UPPER_LEG, - BODYPART_RIGHT_LOWER_LEG, - - BODYPART_LEFT_UPPER_ARM, - BODYPART_LEFT_LOWER_ARM, - - BODYPART_RIGHT_UPPER_ARM, - BODYPART_RIGHT_LOWER_ARM, - - BODYPART_COUNT - }; - - enum - { - JOINT_PELVIS_SPINE = 0, - JOINT_SPINE_HEAD, - - JOINT_LEFT_HIP, - JOINT_LEFT_KNEE, - - JOINT_RIGHT_HIP, - JOINT_RIGHT_KNEE, - - JOINT_LEFT_SHOULDER, - JOINT_LEFT_ELBOW, - - JOINT_RIGHT_SHOULDER, - JOINT_RIGHT_ELBOW, - - JOINT_COUNT - }; - - btDynamicsWorld* m_ownerWorld; - btCollisionShape* m_shapes[BODYPART_COUNT]; - btRigidBody* m_bodies[BODYPART_COUNT]; - btTypedConstraint* m_joints[JOINT_COUNT]; - - btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape); - -public: - RagDoll (btDynamicsWorld* ownerWorld, - const btVector3& positionOffset, - btScalar scale_ragdoll = btScalar(1.0)); - - ~RagDoll (); -}; - - - -#endif // RAGDOLL_H_INCLUDED +#ifndef RAGDOLL_H_INCLUDED +#define RAGDOLL_H_INCLUDED + +#include "DemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "btBulletDynamicsCommon.h" + + + + +class RagDoll +{ + enum + { + BODYPART_PELVIS = 0, + BODYPART_SPINE, + BODYPART_HEAD, + + BODYPART_LEFT_UPPER_LEG, + BODYPART_LEFT_LOWER_LEG, + + BODYPART_RIGHT_UPPER_LEG, + BODYPART_RIGHT_LOWER_LEG, + + BODYPART_LEFT_UPPER_ARM, + BODYPART_LEFT_LOWER_ARM, + + BODYPART_RIGHT_UPPER_ARM, + BODYPART_RIGHT_LOWER_ARM, + + BODYPART_COUNT + }; + + enum + { + JOINT_PELVIS_SPINE = 0, + JOINT_SPINE_HEAD, + + JOINT_LEFT_HIP, + JOINT_LEFT_KNEE, + + JOINT_RIGHT_HIP, + JOINT_RIGHT_KNEE, + + JOINT_LEFT_SHOULDER, + JOINT_LEFT_ELBOW, + + JOINT_RIGHT_SHOULDER, + JOINT_RIGHT_ELBOW, + + JOINT_COUNT + }; + + btDynamicsWorld* m_ownerWorld; + btCollisionShape* m_shapes[BODYPART_COUNT]; + btRigidBody* m_bodies[BODYPART_COUNT]; + btTypedConstraint* m_joints[JOINT_COUNT]; + + btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape); + +public: + RagDoll (btDynamicsWorld* ownerWorld, + const btVector3& positionOffset, + btScalar scale_ragdoll = btScalar(1.0)); + + ~RagDoll (); +}; + + + +#endif // RAGDOLL_H_INCLUDED diff --git a/Demos/GenericJointDemo/Win32GenericJointDemo.cpp b/Demos/GenericJointDemo/Win32GenericJointDemo.cpp index 35f604063..990b1fac1 100644 --- a/Demos/GenericJointDemo/Win32GenericJointDemo.cpp +++ b/Demos/GenericJointDemo/Win32GenericJointDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "GenericJointDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new GenericJointDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "GenericJointDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new GenericJointDemo(); +} + +#endif diff --git a/Demos/GenericJointDemo/main.cpp b/Demos/GenericJointDemo/main.cpp index a3dd20062..4dd56b85e 100644 --- a/Demos/GenericJointDemo/main.cpp +++ b/Demos/GenericJointDemo/main.cpp @@ -1,28 +1,28 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 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 "GenericJointDemo.h" - -int main(int argc,char* argv[]) -{ - GenericJointDemo demoApp; -// demoApp.configDebugDrawer(&debugDrawer); - - demoApp.initPhysics(); - demoApp.setCameraDistance(btScalar(10.)); - - return glutmain(argc, argv,640,480,"Joint 6DOF - Sequencial Impulse Solver",&demoApp); - -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2010 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 "GenericJointDemo.h" + +int main(int argc,char* argv[]) +{ + GenericJointDemo demoApp; +// demoApp.configDebugDrawer(&debugDrawer); + + demoApp.initPhysics(); + demoApp.setCameraDistance(btScalar(10.)); + + return glutmain(argc, argv,640,480,"Joint 6DOF - Sequencial Impulse Solver",&demoApp); + +} diff --git a/Demos/GimpactTestDemo/Win32GimpactDemo.cpp b/Demos/GimpactTestDemo/Win32GimpactDemo.cpp index 73d3eb27d..57cc15d8a 100644 --- a/Demos/GimpactTestDemo/Win32GimpactDemo.cpp +++ b/Demos/GimpactTestDemo/Win32GimpactDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "GimpactTestDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new GimpactConcaveDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "GimpactTestDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new GimpactConcaveDemo(); +} + +#endif diff --git a/Demos/GjkConvexCastDemo/CMakeLists.txt b/Demos/GjkConvexCastDemo/CMakeLists.txt index 2e0b7dbe9..c053ac721 100644 --- a/Demos/GjkConvexCastDemo/CMakeLists.txt +++ b/Demos/GjkConvexCastDemo/CMakeLists.txt @@ -1,48 +1,48 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppLinearConvexCastDemo - LinearConvexCastDemo.cpp - main.cpp -) - -IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppLinearConvexCastDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppLinearConvexCastDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) -ENDIF(WIN32) - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppLinearConvexCastDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppLinearConvexCastDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppLinearConvexCastDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppLinearConvexCastDemo + LinearConvexCastDemo.cpp + main.cpp +) + +IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppLinearConvexCastDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppLinearConvexCastDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF(WIN32) + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppLinearConvexCastDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppLinearConvexCastDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppLinearConvexCastDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h b/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h index 0a7cc3486..9b64d2855 100644 --- a/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h +++ b/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h @@ -1,44 +1,44 @@ -/* -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 LINEAR_CONVEX_CAST_DEMO_H -#define LINEAR_CONVEX_CAST_DEMO_H - -#include "GlutDemoApplication.h" - -///LinearConvexCastDemo shows the working of the object sweep / pure-linear continuous collision detection query -class LinearConvexCastDemo : public GlutDemoApplication -{ - public: - - virtual ~LinearConvexCastDemo(); - - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - LinearConvexCastDemo* demo = new LinearConvexCastDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } - -}; - -#endif //LINEAR_CONVEX_CAST_DEMO_H - +/* +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 LINEAR_CONVEX_CAST_DEMO_H +#define LINEAR_CONVEX_CAST_DEMO_H + +#include "GlutDemoApplication.h" + +///LinearConvexCastDemo shows the working of the object sweep / pure-linear continuous collision detection query +class LinearConvexCastDemo : public GlutDemoApplication +{ + public: + + virtual ~LinearConvexCastDemo(); + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + LinearConvexCastDemo* demo = new LinearConvexCastDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //LINEAR_CONVEX_CAST_DEMO_H + diff --git a/Demos/Gpu2dDemo/BasicDemo.cpp b/Demos/Gpu2dDemo/BasicDemo.cpp index 8a16cdc67..47f9dc221 100644 --- a/Demos/Gpu2dDemo/BasicDemo.cpp +++ b/Demos/Gpu2dDemo/BasicDemo.cpp @@ -1,808 +1,808 @@ -/* -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. -*/ - -///The 3 following lines include the CPU implementation of the kernels, keep them in this order. -#include "BulletMultiThreaded/btGpuDefines.h" -#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "BulletMultiThreaded/btGpuUtilsSharedCode.h" - - - -#include "BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h" - -#include "btGpuDemoPairCache.h" - -#include "btGpuDemoDynamicsWorld.h" -#include "GLDebugFont.h" - -#define USE_CUDA_DEMO_PAIR_CASHE 0 - -#define SPEC_TEST 0 -#define OECAKE_LOADER 1 - -#ifdef _DEBUG -// #define LARGE_DEMO 0 - #define LARGE_DEMO 1 -#else - #define LARGE_DEMO 1 -#endif - -#if LARGE_DEMO - ///create 512 (8x8x8) dynamic object -// #define ARRAY_SIZE_X 116 -// #define ARRAY_SIZE_Y 116 - -// #define ARRAY_SIZE_X 228 -// #define ARRAY_SIZE_Y 228 -// #define ARRAY_SIZE_X 256 -// #define ARRAY_SIZE_Y 156 - #define ARRAY_SIZE_X 50 - #define ARRAY_SIZE_Y 100 - #define ARRAY_SIZE_Z 1 -#else - ///create 125 (5x5x5) dynamic object - #define ARRAY_SIZE_X 5 - #define ARRAY_SIZE_Y 5 -// #define ARRAY_SIZE_Z 5 - #define ARRAY_SIZE_Z 1 -#endif - - -//maximum number of objects (and allow user to shoot additional boxes) -#define NUM_SMALL_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z) -#define MAX_PROXIES (NUM_SMALL_PROXIES + 1024) -#define MAX_LARGE_PROXIES 0 -#define MAX_SMALL_PROXIES (MAX_PROXIES - MAX_LARGE_PROXIES) - -///scaling of the objects (0.1 = 20 centimeter boxes ) -//#define SCALING 0.1 -#define SCALING 1 -#define START_POS_X 0 -#define START_POS_Y 0 -#define START_POS_Z 0 - -#include "BasicDemo.h" -#include "GlutStuff.h" -///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. -#include "btBulletDynamicsCommon.h" -#include //printf debugging - -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" - -#ifdef BT_USE_CUDA -#include "../Extras/CUDA/btCudaBroadphase.h" -#else -#include "BulletMultiThreaded/btGpu3DGridBroadphase.h" -#endif - -btScalar gTimeStep = btScalar(1./60.); - -bool gbDrawBatches = false; -int gSelectedBatch = CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; -#ifdef BT_USE_CUDA -bool gUseCPUSolver = false; -#else -bool gUseCPUSolver = true; -#endif //BT_USE_CUDA - -bool gUseBulletNarrowphase = false; - -#include "oecakeLoader.h" - - -class BasicDemoOecakeLoader : public BasicOECakeReader -{ - - BasicDemo* m_demo; - -public: - - BasicDemoOecakeLoader(BasicDemo* demo) - :m_demo(demo) - { - - } - - virtual void createBodyForCompoundShape(btCompoundShape* compoundTmpShape,bool addConstraint, const btTransform& worldTransform, btScalar mass) - { - - btDefaultMotionState* myMotionState= 0; - - btVector3 aabbMin,aabbMax; - compoundTmpShape->getAabb(btTransform::getIdentity(),aabbMin,aabbMax); - int numSpheres = compoundTmpShape->getNumChildShapes(); - btAssert(numSpheres>0); - if (numSpheres>8) - { - printf("error: exceeded 8 spheres\n"); - return; - } - - btVector3* positions = new btVector3[numSpheres]; - btScalar* radii = new btScalar[numSpheres]; - - for (int i=0;igetChildShape(i)->getShapeType()== SPHERE_SHAPE_PROXYTYPE); - btSphereShape* sphereShape = (btSphereShape*)compoundTmpShape->getChildShape(i); - radii[i]=sphereShape->getRadius(); - positions[i] = compoundTmpShape->getChildTransform(i).getOrigin(); - } - - btMultiSphereShape* multiSphere = new btMultiSphereShape(positions,radii,numSpheres); - m_demo->addCollisionShape(multiSphere); - - btVector3 localInertia(0,0,0); - if (mass) - { - myMotionState = new btDefaultMotionState(worldTransform); - multiSphere->calculateLocalInertia(mass,localInertia); - } - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btRigidBody* body = new btRigidBody(mass,myMotionState,multiSphere,localInertia); - body->setLinearFactor(btVector3(1,1,0)); - body->setAngularFactor(btVector3(0,0,1)); - - body->setWorldTransform(worldTransform); - - - m_demo->getDynamicsWorld()->addRigidBody(body); - - if (addConstraint) - { - btVector3 pivotInA(0,0,0); - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,pivotInA); - m_demo->getDynamicsWorld()->addConstraint(p2p); - } - } - -}; - - -void BasicDemo::clientMoveAndDisplay() -{ - updateCamera(); - glDisable(GL_LIGHTING); - glColor3f(1.f, 1.f, 1.f); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glDisable(GL_TEXTURE_2D); // we always draw wireframe in this demo - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - ///step the simulation - if (m_dynamicsWorld) - { -#if USE_CUDA_DEMO_PAIR_CASHE - btGpuDemoPairCache* pc = (btGpuDemoPairCache*)m_dynamicsWorld->getPairCache(); - pc->m_numSmallProxies = m_dynamicsWorld->getNumCollisionObjects(); // - 1; // exclude floor -#endif - m_dynamicsWorld->stepSimulation(gTimeStep,0);//ms / 1000000.f); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - renderme(); - - ms = getDeltaTimeMicroseconds(); - - glFlush(); - - glutSwapBuffers(); - -} - - - -void BasicDemo::displayCallback(void) { - - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing to detect problems - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - - -#define POS_OFFS_X (ARRAY_SIZE_X * SCALING + 20) -#define POS_OFFS_Y (ARRAY_SIZE_Y * SCALING + 10) -#define POS_OFFS_Z (ARRAY_SIZE_Z * SCALING) - -#if OECAKE_LOADER - btVector3 gWorldMin(-200, 0, 0); - btVector3 gWorldMax( 200, 200, 0); -#else - btVector3 gWorldMin(-POS_OFFS_X, -POS_OFFS_Y, -POS_OFFS_Z); - btVector3 gWorldMax( POS_OFFS_X, POS_OFFS_Y, POS_OFFS_Z); -#endif - -//btGpuDemoPairCache* gPairCache; -btOverlappingPairCache* gPairCache; - - -static btScalar fRandMinMax(btScalar fMin, btScalar fMax) -{ - btScalar fr = btScalar(rand()) / btScalar(RAND_MAX); - return fMax - (fMax - fMin) * fr; -} - - -void BasicDemo::initPhysics() -{ - setTexturing(false); - setShadows(false); - -#if OECAKE_LOADER - setCameraDistance(80.); - m_cameraTargetPosition.setValue(50, 10, 0); -#else - #if LARGE_DEMO - setCameraDistance(btScalar(SCALING*100.)); - #else - setCameraDistance(btScalar(SCALING*20.)); - #endif - m_cameraTargetPosition.setValue(START_POS_X, -START_POS_Y-20, START_POS_Z); -#endif - m_azi = btScalar(0.f); - m_ele = btScalar(0.f); - - ///collision configuration contains default setup for memory, collision setup - - btDefaultCollisionConstructionInfo dci; - dci.m_defaultMaxPersistentManifoldPoolSize=50000; - dci.m_defaultMaxCollisionAlgorithmPoolSize=50000; - - m_collisionConfiguration = new btDefaultCollisionConfiguration(dci); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,new btEmptyAlgorithm::CreateFunc); - - m_dispatcher->setNearCallback(cudaDemoNearCallback); - - -#if USE_CUDA_DEMO_PAIR_CASHE - gPairCache = new (btAlignedAlloc(sizeof(btGpuDemoPairCache),16)) btGpuDemoPairCache(MAX_PROXIES, 24, MAX_SMALL_PROXIES); -#else - gPairCache = new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16))btHashedOverlappingPairCache(); -#endif - - - btVector3 numOfCells = (gWorldMax - gWorldMin) / (2. * SCALING); - int numOfCellsX = (int)numOfCells[0]; - int numOfCellsY = (int)numOfCells[1]; - int numOfCellsZ = (int)numOfCells[2]; - -// m_broadphase = new btAxisSweep3(gWorldMin, gWorldMax, MAX_PROXIES,gPairCache); - m_broadphase = new btDbvtBroadphase(gPairCache); -// m_broadphase = new btGpu3DGridBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,10,24,24); -// m_broadphase = new btCudaBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,10,24,24); - - - ///the default constraint solver - m_solver = new btSequentialImpulseConstraintSolver(); - - btGpuDemoDynamicsWorld* pDdw = new btGpuDemoDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration, MAX_PROXIES); - m_dynamicsWorld = pDdw; - pDdw->getSimulationIslandManager()->setSplitIslands(true); - pDdw->setObjRad(SCALING); - pDdw->setWorldMin(gWorldMin); - pDdw->setWorldMax(gWorldMax); -// gUseCPUSolver = true; - pDdw->setUseCPUSolver(gUseCPUSolver); - gUseBulletNarrowphase = false; - pDdw->setUseBulletNarrowphase(gUseBulletNarrowphase); - -// m_dynamicsWorld->setGravity(btVector3(0,0,0)); - m_dynamicsWorld->setGravity(btVector3(0,-10.,0)); - m_dynamicsWorld->getSolverInfo().m_numIterations = 4; - - { - //create a few dynamic rigidbodies - // Re-using the same collision is better for memory usage and performance - - - -#if 1 - #define SPRADIUS btScalar(SCALING*0.1f) - #define SPRPOS btScalar(SCALING*0.05f) - static btVector3 sSphPos[8]; - - for (int k=0;k<8;k++) - { - sSphPos[k].setValue((k-4)*0.25*SCALING,0,0); - } - - btVector3 inertiaHalfExtents(SPRADIUS, SPRADIUS, SPRADIUS); - static btScalar sSphRad[8] = - { -// SPRADIUS, SPRADIUS, SPRADIUS, SPRADIUS,SPRADIUS, SPRADIUS, SPRADIUS, 0.3 - SPRADIUS, SPRADIUS, SPRADIUS, SPRADIUS,SPRADIUS, SPRADIUS, SPRADIUS, SPRADIUS - }; -// sSphPos[0].setX(sSphPos[0].getX()-0.15); - #undef SPR - btMultiSphereShape* colShape[2]; - colShape[0] = new btMultiSphereShape( sSphPos, sSphRad, 8); - colShape[1] = new btMultiSphereShape( sSphPos, sSphRad, 2); - - //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - m_collisionShapes.push_back(colShape[0]); - m_collisionShapes.push_back(colShape[1]); -#endif - - /// Create Dynamic Objects - btTransform startTransform; - startTransform.setIdentity(); - - btScalar mass(0.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 OECAKE_LOADER - BasicDemoOecakeLoader loader(this); - if (!loader.processFile("test1.oec")) - { - loader.processFile("../../test1.oec"); - } -#if 0 // perfomance test : work-in-progress - { // add more object, but share their shapes - int numNewObjects = 500; - mass = 1.f; - for(int n_obj = 0; n_obj < numNewObjects; n_obj++) - { - btDefaultMotionState* myMotionState= 0; - btVector3 localInertia(0,0,0); - btTransform worldTransform; - worldTransform.setIdentity(); - btScalar fx = fRandMinMax(-30., 30.); - btScalar fy = fRandMinMax(5., 30.); - worldTransform.setOrigin(btVector3(fx, fy, 0.f)); - int sz = m_collisionShapes.size(); - btMultiSphereShape* multiSphere = (btMultiSphereShape*)m_collisionShapes[1]; - myMotionState = new btDefaultMotionState(worldTransform); - multiSphere->calculateLocalInertia(mass, localInertia); - btRigidBody* body = new btRigidBody(mass,myMotionState,multiSphere,localInertia); - body->setLinearFactor(btVector3(1,1,0)); - body->setAngularFactor(btVector3(0,0,1)); - body->setWorldTransform(worldTransform); - getDynamicsWorld()->addRigidBody(body); - } - } -#endif - -#else -#if (!SPEC_TEST) - float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; - float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; - float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; - - int collisionShapeIndex = 0; - for (int k=0;kcalculateLocalInertia(mass,localInertia); - - - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - //btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,colShape[collisionShapeIndex],localInertia); - collisionShapeIndex = 1 - collisionShapeIndex; - rbInfo.m_startWorldTransform=startTransform; - btRigidBody* body = new btRigidBody(rbInfo); - m_dynamicsWorld->addRigidBody(body); - } - } - } -#else//SPEC_TEST - // narrowphase test - 2 bodies at the same position - float start_x = START_POS_X; -// float start_y = START_POS_Y; - float start_y = gWorldMin[1] + SCALING * 0.7f + 5.f; - float start_z = START_POS_Z; - startTransform.setOrigin(SCALING*btVector3(start_x,start_y,start_z)); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,colShape[0],localInertia); - rbInfo.m_startWorldTransform=startTransform; - btRigidBody* body = new btRigidBody(rbInfo); - m_dynamicsWorld->addRigidBody(body); - - btPoint2PointConstraint * p2pConstr = new btPoint2PointConstraint(*body, btVector3(1., 0., 0.)); - m_dynamicsWorld->addConstraint(p2pConstr); - - startTransform.setOrigin(SCALING*btVector3(start_x-2.f, start_y,start_z)); - rbInfo.m_startWorldTransform=startTransform; - btRigidBody* body1 = new btRigidBody(rbInfo); - m_dynamicsWorld->addRigidBody(body1); - - p2pConstr = new btPoint2PointConstraint(*body, *body1, btVector3(-1., 0., 0.), btVector3(1., 0., 0.)); - m_dynamicsWorld->addConstraint(p2pConstr); - - -#endif//SPEC_TEST -#endif //OE_CAKE_LOADER - } - // now set Ids used by collision detector and constraint solver - int numObjects = m_dynamicsWorld->getNumCollisionObjects(); - btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); - for(int i = 0; i < numObjects; i++) - { - btCollisionObject* colObj = collisionObjects[i]; - colObj->setCompanionId(i+1); // 0 reserved for the "world" object - btCollisionShape* pShape = colObj->getCollisionShape(); - int shapeType = pShape->getShapeType(); - if(shapeType == MULTI_SPHERE_SHAPE_PROXYTYPE) - { - btMultiSphereShape* pMs = (btMultiSphereShape*)pShape; - int numSpheres = pMs->getSphereCount(); - pDdw->addMultiShereObject(numSpheres, i + 1); - for(int j = 0; j < numSpheres; j++) - { - btVector3 sphPos = pMs->getSpherePosition(j); - float sphRad = pMs->getSphereRadius(j); - pDdw->addSphere(sphPos, sphRad); - } - } - else - { - btAssert(0); - } - } -#if OECAKE_LOADER - clientResetScene(); -#endif -} - -void BasicDemo::clientResetScene() -{ - DemoApplication::clientResetScene(); -#if OECAKE_LOADER - return; -#endif -#if SPEC_TEST - { - float start_x = START_POS_X; -// float start_y = START_POS_Y; - float start_y = gWorldMin[1] + SCALING * 0.7f + 5.f; - float start_z = START_POS_Z; - int numObjects = m_dynamicsWorld->getNumCollisionObjects(); - btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); - btTransform startTransform; - startTransform.setIdentity(); - for(int n = 0; n < numObjects; n++) - { - btCollisionObject* colObj = collisionObjects[n]; - btRigidBody* rb = btRigidBody::upcast(colObj); - if(!n) - { - startTransform.setOrigin(SCALING*btVector3(start_x,start_y,start_z)); - } - else - { -// startTransform.setOrigin(SCALING*btVector3(start_x+0.1f,start_y+SCALING * 0.7f * 2.f, start_z)); - startTransform.setOrigin(SCALING*btVector3(start_x-2.f,start_y, start_z)); - } - rb->setCenterOfMassTransform(startTransform); - } - return; - } -#endif -// we don't use motionState, so reset transforms here - int numObjects = m_dynamicsWorld->getNumCollisionObjects(); - btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); - - float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; - float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; - float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; - btTransform startTransform; - startTransform.setIdentity(); - - for(int n = 0; n < numObjects; n++) - { - btCollisionObject* colObj = collisionObjects[n]; - colObj->setCompanionId(n); - btRigidBody* rb = btRigidBody::upcast(colObj); - int offs = ARRAY_SIZE_X * ARRAY_SIZE_Z; - int indx = n; - int ky = indx / offs; - indx -= ky * offs; - int kx = indx / ARRAY_SIZE_Z; - indx -= kx * ARRAY_SIZE_Z; - int kz = indx; - startTransform.setOrigin(SCALING*btVector3( - 2.0*SCALING*kx + start_x, - 2.0*SCALING*ky + start_y, - 2.0*SCALING*kz + start_z)); - rb->setCenterOfMassTransform(startTransform); - } -} - - - -void BasicDemo::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;jsetUseCPUSolver(gUseCPUSolver); - break; - } - case 'j' : - { - btGpuDemoDynamicsWorld* pDdw = (btGpuDemoDynamicsWorld*)m_dynamicsWorld; - gUseBulletNarrowphase = !gUseBulletNarrowphase; - pDdw->setUseBulletNarrowphase(gUseBulletNarrowphase); - if(gUseBulletNarrowphase) - { - m_dispatcher->setNearCallback(btCollisionDispatcher::defaultNearCallback); - } - else - { - m_dispatcher->setNearCallback(cudaDemoNearCallback); - } - break; - } - default : - { - DemoApplication::keyboardCallback(key, x, y); - } - break; - } - - if(key == ' ') - { -#if USE_CUDA_DEMO_PAIR_CASHE - ((btGpuDemoPairCache*)gPairCache)->reset(); -#endif - } -} - - - - -#define BATCH_NUM_COLORS 12 - -const float cBatchColorTab[BATCH_NUM_COLORS * 3] = - { - 1.f, 0.f, 0.f, - 0.f, 1.f, 0.f, - 0.f, 0.f, 1.f, - 1.f, 1.f, 0.f, - 0.f, 1.f, 1.f, - 1.f, 0.f, 1.f, - 1.f, .5f, 0.f, - .5f, 1.f, 0.f, - 0.f, 1.f, .5f, - 0.f, .5f, 1.f, - .5f, 0.f, 1.f, - 1.f, 0.f, .5f - }; - - -void BasicDemo::DrawConstraintInfo() -{ - int fontW = 10; // hack, could be changed - int fontH = 14; // hack, could be changed - char buf[32]; - float xOffs; - float yOffs = fontH * 2; - glDisable(GL_LIGHTING); - glColor3f(1, 1, 1); - sprintf(buf,"solver on %s", gUseCPUSolver ? "CPU" : "CUDA"); - xOffs = m_glutScreenWidth - (strlen(buf) + 1) * fontW; - GLDebugDrawString(xOffs, yOffs,buf); - yOffs += fontH; - btGpuDemoDynamicsWorld* cddw = (btGpuDemoDynamicsWorld*)m_dynamicsWorld; - for(int i = 0; i < CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; i++) - { - const float* pCol = cBatchColorTab + i * 3; - glColor3f(pCol[0], pCol[1], pCol[2]); - sprintf(buf,"%2d : %5d", i, cddw->m_numInBatches[i]); - xOffs = m_glutScreenWidth - (strlen(buf) + 1) * fontW; - GLDebugDrawString(xOffs, yOffs,buf); - yOffs += fontH; - } -} - - -void BasicDemo::renderme() -{ - renderscene(0); - if(gbDrawBatches) - { - ((btGpuDemoDynamicsWorld*)m_dynamicsWorld)->debugDrawConstraints(gSelectedBatch, cBatchColorTab); - } - -// if (0) - if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) - { - setOrthographicProjection(); - int xOffset = 10.f; - int yStart = 20.f; - int yIncr = 20.f; - showProfileInfo(xOffset, yStart, yIncr); - DrawConstraintInfo(); - outputDebugInfo(xOffset, yStart, yIncr); - resetPerspectiveProjection(); - } -} - - - -extern int gNumClampedCcdMotions; -#define SHOW_NUM_DEEP_PENETRATIONS 1 -#ifdef SHOW_NUM_DEEP_PENETRATIONS - extern int gNumDeepPenetrationChecks; - extern int gNumSplitImpulseRecoveries; - extern int gNumGjkChecks; - extern int gNumAlignedAllocs; - extern int gNumAlignedFree; - extern int gTotalBytesAlignedAllocs; -#endif // - - -void BasicDemo::outputDebugInfo(int & xOffset,int & yStart, int yIncr) -{ - char buf[124]; - glDisable(GL_LIGHTING); - glColor3f(0, 0, 0); - - sprintf(buf,"mouse move+buttons to interact"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"space to reset"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"cursor keys and z,x to navigate"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"i to toggle simulation, s single step"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"q to quit"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"h to toggle help text"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"p to toggle profiling (+results to file)"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"c to toggle constraint drawing"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"b to draw single constraint batch"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"u to toggle between CPU and CUDA solvers"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - - sprintf(buf,"d to toggle between different batch builders"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - if (getDynamicsWorld()) - { - - sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - } -} // BasicDemo::outputDebugInfo() +/* +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. +*/ + +///The 3 following lines include the CPU implementation of the kernels, keep them in this order. +#include "BulletMultiThreaded/btGpuDefines.h" +#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "BulletMultiThreaded/btGpuUtilsSharedCode.h" + + + +#include "BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h" + +#include "btGpuDemoPairCache.h" + +#include "btGpuDemoDynamicsWorld.h" +#include "GLDebugFont.h" + +#define USE_CUDA_DEMO_PAIR_CASHE 0 + +#define SPEC_TEST 0 +#define OECAKE_LOADER 1 + +#ifdef _DEBUG +// #define LARGE_DEMO 0 + #define LARGE_DEMO 1 +#else + #define LARGE_DEMO 1 +#endif + +#if LARGE_DEMO + ///create 512 (8x8x8) dynamic object +// #define ARRAY_SIZE_X 116 +// #define ARRAY_SIZE_Y 116 + +// #define ARRAY_SIZE_X 228 +// #define ARRAY_SIZE_Y 228 +// #define ARRAY_SIZE_X 256 +// #define ARRAY_SIZE_Y 156 + #define ARRAY_SIZE_X 50 + #define ARRAY_SIZE_Y 100 + #define ARRAY_SIZE_Z 1 +#else + ///create 125 (5x5x5) dynamic object + #define ARRAY_SIZE_X 5 + #define ARRAY_SIZE_Y 5 +// #define ARRAY_SIZE_Z 5 + #define ARRAY_SIZE_Z 1 +#endif + + +//maximum number of objects (and allow user to shoot additional boxes) +#define NUM_SMALL_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z) +#define MAX_PROXIES (NUM_SMALL_PROXIES + 1024) +#define MAX_LARGE_PROXIES 0 +#define MAX_SMALL_PROXIES (MAX_PROXIES - MAX_LARGE_PROXIES) + +///scaling of the objects (0.1 = 20 centimeter boxes ) +//#define SCALING 0.1 +#define SCALING 1 +#define START_POS_X 0 +#define START_POS_Y 0 +#define START_POS_Z 0 + +#include "BasicDemo.h" +#include "GlutStuff.h" +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging + +#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" + +#ifdef BT_USE_CUDA +#include "../Extras/CUDA/btCudaBroadphase.h" +#else +#include "BulletMultiThreaded/btGpu3DGridBroadphase.h" +#endif + +btScalar gTimeStep = btScalar(1./60.); + +bool gbDrawBatches = false; +int gSelectedBatch = CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; +#ifdef BT_USE_CUDA +bool gUseCPUSolver = false; +#else +bool gUseCPUSolver = true; +#endif //BT_USE_CUDA + +bool gUseBulletNarrowphase = false; + +#include "oecakeLoader.h" + + +class BasicDemoOecakeLoader : public BasicOECakeReader +{ + + BasicDemo* m_demo; + +public: + + BasicDemoOecakeLoader(BasicDemo* demo) + :m_demo(demo) + { + + } + + virtual void createBodyForCompoundShape(btCompoundShape* compoundTmpShape,bool addConstraint, const btTransform& worldTransform, btScalar mass) + { + + btDefaultMotionState* myMotionState= 0; + + btVector3 aabbMin,aabbMax; + compoundTmpShape->getAabb(btTransform::getIdentity(),aabbMin,aabbMax); + int numSpheres = compoundTmpShape->getNumChildShapes(); + btAssert(numSpheres>0); + if (numSpheres>8) + { + printf("error: exceeded 8 spheres\n"); + return; + } + + btVector3* positions = new btVector3[numSpheres]; + btScalar* radii = new btScalar[numSpheres]; + + for (int i=0;igetChildShape(i)->getShapeType()== SPHERE_SHAPE_PROXYTYPE); + btSphereShape* sphereShape = (btSphereShape*)compoundTmpShape->getChildShape(i); + radii[i]=sphereShape->getRadius(); + positions[i] = compoundTmpShape->getChildTransform(i).getOrigin(); + } + + btMultiSphereShape* multiSphere = new btMultiSphereShape(positions,radii,numSpheres); + m_demo->addCollisionShape(multiSphere); + + btVector3 localInertia(0,0,0); + if (mass) + { + myMotionState = new btDefaultMotionState(worldTransform); + multiSphere->calculateLocalInertia(mass,localInertia); + } + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btRigidBody* body = new btRigidBody(mass,myMotionState,multiSphere,localInertia); + body->setLinearFactor(btVector3(1,1,0)); + body->setAngularFactor(btVector3(0,0,1)); + + body->setWorldTransform(worldTransform); + + + m_demo->getDynamicsWorld()->addRigidBody(body); + + if (addConstraint) + { + btVector3 pivotInA(0,0,0); + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,pivotInA); + m_demo->getDynamicsWorld()->addConstraint(p2p); + } + } + +}; + + +void BasicDemo::clientMoveAndDisplay() +{ + updateCamera(); + glDisable(GL_LIGHTING); + glColor3f(1.f, 1.f, 1.f); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glDisable(GL_TEXTURE_2D); // we always draw wireframe in this demo + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { +#if USE_CUDA_DEMO_PAIR_CASHE + btGpuDemoPairCache* pc = (btGpuDemoPairCache*)m_dynamicsWorld->getPairCache(); + pc->m_numSmallProxies = m_dynamicsWorld->getNumCollisionObjects(); // - 1; // exclude floor +#endif + m_dynamicsWorld->stepSimulation(gTimeStep,0);//ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + renderme(); + + ms = getDeltaTimeMicroseconds(); + + glFlush(); + + glutSwapBuffers(); + +} + + + +void BasicDemo::displayCallback(void) { + + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + +#define POS_OFFS_X (ARRAY_SIZE_X * SCALING + 20) +#define POS_OFFS_Y (ARRAY_SIZE_Y * SCALING + 10) +#define POS_OFFS_Z (ARRAY_SIZE_Z * SCALING) + +#if OECAKE_LOADER + btVector3 gWorldMin(-200, 0, 0); + btVector3 gWorldMax( 200, 200, 0); +#else + btVector3 gWorldMin(-POS_OFFS_X, -POS_OFFS_Y, -POS_OFFS_Z); + btVector3 gWorldMax( POS_OFFS_X, POS_OFFS_Y, POS_OFFS_Z); +#endif + +//btGpuDemoPairCache* gPairCache; +btOverlappingPairCache* gPairCache; + + +static btScalar fRandMinMax(btScalar fMin, btScalar fMax) +{ + btScalar fr = btScalar(rand()) / btScalar(RAND_MAX); + return fMax - (fMax - fMin) * fr; +} + + +void BasicDemo::initPhysics() +{ + setTexturing(false); + setShadows(false); + +#if OECAKE_LOADER + setCameraDistance(80.); + m_cameraTargetPosition.setValue(50, 10, 0); +#else + #if LARGE_DEMO + setCameraDistance(btScalar(SCALING*100.)); + #else + setCameraDistance(btScalar(SCALING*20.)); + #endif + m_cameraTargetPosition.setValue(START_POS_X, -START_POS_Y-20, START_POS_Z); +#endif + m_azi = btScalar(0.f); + m_ele = btScalar(0.f); + + ///collision configuration contains default setup for memory, collision setup + + btDefaultCollisionConstructionInfo dci; + dci.m_defaultMaxPersistentManifoldPoolSize=50000; + dci.m_defaultMaxCollisionAlgorithmPoolSize=50000; + + m_collisionConfiguration = new btDefaultCollisionConfiguration(dci); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,new btEmptyAlgorithm::CreateFunc); + + m_dispatcher->setNearCallback(cudaDemoNearCallback); + + +#if USE_CUDA_DEMO_PAIR_CASHE + gPairCache = new (btAlignedAlloc(sizeof(btGpuDemoPairCache),16)) btGpuDemoPairCache(MAX_PROXIES, 24, MAX_SMALL_PROXIES); +#else + gPairCache = new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16))btHashedOverlappingPairCache(); +#endif + + + btVector3 numOfCells = (gWorldMax - gWorldMin) / (2. * SCALING); + int numOfCellsX = (int)numOfCells[0]; + int numOfCellsY = (int)numOfCells[1]; + int numOfCellsZ = (int)numOfCells[2]; + +// m_broadphase = new btAxisSweep3(gWorldMin, gWorldMax, MAX_PROXIES,gPairCache); + m_broadphase = new btDbvtBroadphase(gPairCache); +// m_broadphase = new btGpu3DGridBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,10,24,24); +// m_broadphase = new btCudaBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,10,24,24); + + + ///the default constraint solver + m_solver = new btSequentialImpulseConstraintSolver(); + + btGpuDemoDynamicsWorld* pDdw = new btGpuDemoDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration, MAX_PROXIES); + m_dynamicsWorld = pDdw; + pDdw->getSimulationIslandManager()->setSplitIslands(true); + pDdw->setObjRad(SCALING); + pDdw->setWorldMin(gWorldMin); + pDdw->setWorldMax(gWorldMax); +// gUseCPUSolver = true; + pDdw->setUseCPUSolver(gUseCPUSolver); + gUseBulletNarrowphase = false; + pDdw->setUseBulletNarrowphase(gUseBulletNarrowphase); + +// m_dynamicsWorld->setGravity(btVector3(0,0,0)); + m_dynamicsWorld->setGravity(btVector3(0,-10.,0)); + m_dynamicsWorld->getSolverInfo().m_numIterations = 4; + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + + +#if 1 + #define SPRADIUS btScalar(SCALING*0.1f) + #define SPRPOS btScalar(SCALING*0.05f) + static btVector3 sSphPos[8]; + + for (int k=0;k<8;k++) + { + sSphPos[k].setValue((k-4)*0.25*SCALING,0,0); + } + + btVector3 inertiaHalfExtents(SPRADIUS, SPRADIUS, SPRADIUS); + static btScalar sSphRad[8] = + { +// SPRADIUS, SPRADIUS, SPRADIUS, SPRADIUS,SPRADIUS, SPRADIUS, SPRADIUS, 0.3 + SPRADIUS, SPRADIUS, SPRADIUS, SPRADIUS,SPRADIUS, SPRADIUS, SPRADIUS, SPRADIUS + }; +// sSphPos[0].setX(sSphPos[0].getX()-0.15); + #undef SPR + btMultiSphereShape* colShape[2]; + colShape[0] = new btMultiSphereShape( sSphPos, sSphRad, 8); + colShape[1] = new btMultiSphereShape( sSphPos, sSphRad, 2); + + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + m_collisionShapes.push_back(colShape[0]); + m_collisionShapes.push_back(colShape[1]); +#endif + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(0.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 OECAKE_LOADER + BasicDemoOecakeLoader loader(this); + if (!loader.processFile("test1.oec")) + { + loader.processFile("../../test1.oec"); + } +#if 0 // perfomance test : work-in-progress + { // add more object, but share their shapes + int numNewObjects = 500; + mass = 1.f; + for(int n_obj = 0; n_obj < numNewObjects; n_obj++) + { + btDefaultMotionState* myMotionState= 0; + btVector3 localInertia(0,0,0); + btTransform worldTransform; + worldTransform.setIdentity(); + btScalar fx = fRandMinMax(-30., 30.); + btScalar fy = fRandMinMax(5., 30.); + worldTransform.setOrigin(btVector3(fx, fy, 0.f)); + int sz = m_collisionShapes.size(); + btMultiSphereShape* multiSphere = (btMultiSphereShape*)m_collisionShapes[1]; + myMotionState = new btDefaultMotionState(worldTransform); + multiSphere->calculateLocalInertia(mass, localInertia); + btRigidBody* body = new btRigidBody(mass,myMotionState,multiSphere,localInertia); + body->setLinearFactor(btVector3(1,1,0)); + body->setAngularFactor(btVector3(0,0,1)); + body->setWorldTransform(worldTransform); + getDynamicsWorld()->addRigidBody(body); + } + } +#endif + +#else +#if (!SPEC_TEST) + float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; + float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; + float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; + + int collisionShapeIndex = 0; + for (int k=0;kcalculateLocalInertia(mass,localInertia); + + + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + //btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,colShape[collisionShapeIndex],localInertia); + collisionShapeIndex = 1 - collisionShapeIndex; + rbInfo.m_startWorldTransform=startTransform; + btRigidBody* body = new btRigidBody(rbInfo); + m_dynamicsWorld->addRigidBody(body); + } + } + } +#else//SPEC_TEST + // narrowphase test - 2 bodies at the same position + float start_x = START_POS_X; +// float start_y = START_POS_Y; + float start_y = gWorldMin[1] + SCALING * 0.7f + 5.f; + float start_z = START_POS_Z; + startTransform.setOrigin(SCALING*btVector3(start_x,start_y,start_z)); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,colShape[0],localInertia); + rbInfo.m_startWorldTransform=startTransform; + btRigidBody* body = new btRigidBody(rbInfo); + m_dynamicsWorld->addRigidBody(body); + + btPoint2PointConstraint * p2pConstr = new btPoint2PointConstraint(*body, btVector3(1., 0., 0.)); + m_dynamicsWorld->addConstraint(p2pConstr); + + startTransform.setOrigin(SCALING*btVector3(start_x-2.f, start_y,start_z)); + rbInfo.m_startWorldTransform=startTransform; + btRigidBody* body1 = new btRigidBody(rbInfo); + m_dynamicsWorld->addRigidBody(body1); + + p2pConstr = new btPoint2PointConstraint(*body, *body1, btVector3(-1., 0., 0.), btVector3(1., 0., 0.)); + m_dynamicsWorld->addConstraint(p2pConstr); + + +#endif//SPEC_TEST +#endif //OE_CAKE_LOADER + } + // now set Ids used by collision detector and constraint solver + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); + for(int i = 0; i < numObjects; i++) + { + btCollisionObject* colObj = collisionObjects[i]; + colObj->setCompanionId(i+1); // 0 reserved for the "world" object + btCollisionShape* pShape = colObj->getCollisionShape(); + int shapeType = pShape->getShapeType(); + if(shapeType == MULTI_SPHERE_SHAPE_PROXYTYPE) + { + btMultiSphereShape* pMs = (btMultiSphereShape*)pShape; + int numSpheres = pMs->getSphereCount(); + pDdw->addMultiShereObject(numSpheres, i + 1); + for(int j = 0; j < numSpheres; j++) + { + btVector3 sphPos = pMs->getSpherePosition(j); + float sphRad = pMs->getSphereRadius(j); + pDdw->addSphere(sphPos, sphRad); + } + } + else + { + btAssert(0); + } + } +#if OECAKE_LOADER + clientResetScene(); +#endif +} + +void BasicDemo::clientResetScene() +{ + DemoApplication::clientResetScene(); +#if OECAKE_LOADER + return; +#endif +#if SPEC_TEST + { + float start_x = START_POS_X; +// float start_y = START_POS_Y; + float start_y = gWorldMin[1] + SCALING * 0.7f + 5.f; + float start_z = START_POS_Z; + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); + btTransform startTransform; + startTransform.setIdentity(); + for(int n = 0; n < numObjects; n++) + { + btCollisionObject* colObj = collisionObjects[n]; + btRigidBody* rb = btRigidBody::upcast(colObj); + if(!n) + { + startTransform.setOrigin(SCALING*btVector3(start_x,start_y,start_z)); + } + else + { +// startTransform.setOrigin(SCALING*btVector3(start_x+0.1f,start_y+SCALING * 0.7f * 2.f, start_z)); + startTransform.setOrigin(SCALING*btVector3(start_x-2.f,start_y, start_z)); + } + rb->setCenterOfMassTransform(startTransform); + } + return; + } +#endif +// we don't use motionState, so reset transforms here + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); + + float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; + float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; + float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; + btTransform startTransform; + startTransform.setIdentity(); + + for(int n = 0; n < numObjects; n++) + { + btCollisionObject* colObj = collisionObjects[n]; + colObj->setCompanionId(n); + btRigidBody* rb = btRigidBody::upcast(colObj); + int offs = ARRAY_SIZE_X * ARRAY_SIZE_Z; + int indx = n; + int ky = indx / offs; + indx -= ky * offs; + int kx = indx / ARRAY_SIZE_Z; + indx -= kx * ARRAY_SIZE_Z; + int kz = indx; + startTransform.setOrigin(SCALING*btVector3( + 2.0*SCALING*kx + start_x, + 2.0*SCALING*ky + start_y, + 2.0*SCALING*kz + start_z)); + rb->setCenterOfMassTransform(startTransform); + } +} + + + +void BasicDemo::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;jsetUseCPUSolver(gUseCPUSolver); + break; + } + case 'j' : + { + btGpuDemoDynamicsWorld* pDdw = (btGpuDemoDynamicsWorld*)m_dynamicsWorld; + gUseBulletNarrowphase = !gUseBulletNarrowphase; + pDdw->setUseBulletNarrowphase(gUseBulletNarrowphase); + if(gUseBulletNarrowphase) + { + m_dispatcher->setNearCallback(btCollisionDispatcher::defaultNearCallback); + } + else + { + m_dispatcher->setNearCallback(cudaDemoNearCallback); + } + break; + } + default : + { + DemoApplication::keyboardCallback(key, x, y); + } + break; + } + + if(key == ' ') + { +#if USE_CUDA_DEMO_PAIR_CASHE + ((btGpuDemoPairCache*)gPairCache)->reset(); +#endif + } +} + + + + +#define BATCH_NUM_COLORS 12 + +const float cBatchColorTab[BATCH_NUM_COLORS * 3] = + { + 1.f, 0.f, 0.f, + 0.f, 1.f, 0.f, + 0.f, 0.f, 1.f, + 1.f, 1.f, 0.f, + 0.f, 1.f, 1.f, + 1.f, 0.f, 1.f, + 1.f, .5f, 0.f, + .5f, 1.f, 0.f, + 0.f, 1.f, .5f, + 0.f, .5f, 1.f, + .5f, 0.f, 1.f, + 1.f, 0.f, .5f + }; + + +void BasicDemo::DrawConstraintInfo() +{ + int fontW = 10; // hack, could be changed + int fontH = 14; // hack, could be changed + char buf[32]; + float xOffs; + float yOffs = fontH * 2; + glDisable(GL_LIGHTING); + glColor3f(1, 1, 1); + sprintf(buf,"solver on %s", gUseCPUSolver ? "CPU" : "CUDA"); + xOffs = m_glutScreenWidth - (strlen(buf) + 1) * fontW; + GLDebugDrawString(xOffs, yOffs,buf); + yOffs += fontH; + btGpuDemoDynamicsWorld* cddw = (btGpuDemoDynamicsWorld*)m_dynamicsWorld; + for(int i = 0; i < CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; i++) + { + const float* pCol = cBatchColorTab + i * 3; + glColor3f(pCol[0], pCol[1], pCol[2]); + sprintf(buf,"%2d : %5d", i, cddw->m_numInBatches[i]); + xOffs = m_glutScreenWidth - (strlen(buf) + 1) * fontW; + GLDebugDrawString(xOffs, yOffs,buf); + yOffs += fontH; + } +} + + +void BasicDemo::renderme() +{ + renderscene(0); + if(gbDrawBatches) + { + ((btGpuDemoDynamicsWorld*)m_dynamicsWorld)->debugDrawConstraints(gSelectedBatch, cBatchColorTab); + } + +// if (0) + if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) + { + setOrthographicProjection(); + int xOffset = 10.f; + int yStart = 20.f; + int yIncr = 20.f; + showProfileInfo(xOffset, yStart, yIncr); + DrawConstraintInfo(); + outputDebugInfo(xOffset, yStart, yIncr); + resetPerspectiveProjection(); + } +} + + + +extern int gNumClampedCcdMotions; +#define SHOW_NUM_DEEP_PENETRATIONS 1 +#ifdef SHOW_NUM_DEEP_PENETRATIONS + extern int gNumDeepPenetrationChecks; + extern int gNumSplitImpulseRecoveries; + extern int gNumGjkChecks; + extern int gNumAlignedAllocs; + extern int gNumAlignedFree; + extern int gTotalBytesAlignedAllocs; +#endif // + + +void BasicDemo::outputDebugInfo(int & xOffset,int & yStart, int yIncr) +{ + char buf[124]; + glDisable(GL_LIGHTING); + glColor3f(0, 0, 0); + + sprintf(buf,"mouse move+buttons to interact"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"space to reset"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"cursor keys and z,x to navigate"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"i to toggle simulation, s single step"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"q to quit"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"h to toggle help text"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"p to toggle profiling (+results to file)"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"c to toggle constraint drawing"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"b to draw single constraint batch"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"u to toggle between CPU and CUDA solvers"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + + sprintf(buf,"d to toggle between different batch builders"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + if (getDynamicsWorld()) + { + + sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + } +} // BasicDemo::outputDebugInfo() diff --git a/Demos/Gpu2dDemo/BasicDemo.h b/Demos/Gpu2dDemo/BasicDemo.h index eee848240..5596ba61c 100644 --- a/Demos/Gpu2dDemo/BasicDemo.h +++ b/Demos/Gpu2dDemo/BasicDemo.h @@ -1,99 +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 BASIC_DEMO_H -#define BASIC_DEMO_H - -#include "DemoApplication.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" - - -#ifdef BT_USE_CUDA -//#include "btCudaDemoPairCache.h" -//#include -#endif //BT_USE_CUDA - -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; -#include "GlutDemoApplication.h" - -///BasicDemo is good starting point for learning the code base and porting. -class BasicDemo : public GlutDemoApplication -{ - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - int m_mouseButtons; - int m_mouseOldX; - int m_mouseOldY; - - public: - - BasicDemo() - { - } - virtual ~BasicDemo() - { - exitPhysics(); - } - void initPhysics(); - - void exitPhysics(); - - ///don't shoot a box in this demo ;-) - virtual void shootBox(const btVector3& dest) {} - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - virtual void clientResetScene(); - - static DemoApplication* Create() - { - BasicDemo* demo = new BasicDemo; - demo->myinit(); - demo->initPhysics(); - demo->m_mouseButtons = 0; - demo->m_mouseOldX = 0; - demo->m_mouseOldY = 0; - return demo; - } - - void DrawConstraintInfo(); - void outputDebugInfo(int & xOffset,int & yStart, int yIncr); - virtual void renderme(); - void addCollisionShape(btCollisionShape* pShape) { m_collisionShapes.push_back(pShape); } -}; - - -#endif //BASIC_DEMO_H - +/* +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 BASIC_DEMO_H +#define BASIC_DEMO_H + +#include "DemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + + +#ifdef BT_USE_CUDA +//#include "btCudaDemoPairCache.h" +//#include +#endif //BT_USE_CUDA + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +#include "GlutDemoApplication.h" + +///BasicDemo is good starting point for learning the code base and porting. +class BasicDemo : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + int m_mouseButtons; + int m_mouseOldX; + int m_mouseOldY; + + public: + + BasicDemo() + { + } + virtual ~BasicDemo() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + ///don't shoot a box in this demo ;-) + virtual void shootBox(const btVector3& dest) {} + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + virtual void clientResetScene(); + + static DemoApplication* Create() + { + BasicDemo* demo = new BasicDemo; + demo->myinit(); + demo->initPhysics(); + demo->m_mouseButtons = 0; + demo->m_mouseOldX = 0; + demo->m_mouseOldY = 0; + return demo; + } + + void DrawConstraintInfo(); + void outputDebugInfo(int & xOffset,int & yStart, int yIncr); + virtual void renderme(); + void addCollisionShape(btCollisionShape* pShape) { m_collisionShapes.push_back(pShape); } +}; + + +#endif //BASIC_DEMO_H + diff --git a/Demos/Gpu2dDemo/btGpuDemo2dCpuFunc.cpp b/Demos/Gpu2dDemo/btGpuDemo2dCpuFunc.cpp index 858ddf6da..879375c90 100644 --- a/Demos/Gpu2dDemo/btGpuDemo2dCpuFunc.cpp +++ b/Demos/Gpu2dDemo/btGpuDemo2dCpuFunc.cpp @@ -1,30 +1,30 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "LinearMath/btQuickprof.h" - - -#include "LinearMath/btScalar.h" - -#include "btGpuDemo2dSharedTypes.h" - - - -#include "BulletMultiThreaded/btGpuDefines.h" -#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "btGpuDemo2dSharedCode.h" - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "LinearMath/btQuickprof.h" + + +#include "LinearMath/btScalar.h" + +#include "btGpuDemo2dSharedTypes.h" + + + +#include "BulletMultiThreaded/btGpuDefines.h" +#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "btGpuDemo2dSharedCode.h" + diff --git a/Demos/Gpu2dDemo/btGpuDemo2dSharedCode.h b/Demos/Gpu2dDemo/btGpuDemo2dSharedCode.h index 64d1f2be3..7a8290662 100644 --- a/Demos/Gpu2dDemo/btGpuDemo2dSharedCode.h +++ b/Demos/Gpu2dDemo/btGpuDemo2dSharedCode.h @@ -1,497 +1,497 @@ -/* -Impulse based Rigid body simulation using CUDA -Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html - -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. -*/ - - - -#define USE_FRICTION 1 -#define FRICTION_BOX_GROUND_FACT 0.05f -#define FRICTION_BOX_BOX_FACT 0.05f -#define USE_CENTERS 1 -//#include "LinearMath/btMinMax.h" - -//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- - -#define MAX_VTX_PER_OBJ 8 - -/* -BT_GPU___device__ void kill_me() -{ - char* badPtr = (char*)0xFFFFFFFF; - *badPtr = 10; -} -*/ - - -BT_GPU___global__ void clearAccumulationOfLambdaDtD(float* lambdaDtBox, int numConstraints, int numContPoints) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index < numConstraints) - { - for(int i=0; i < numContPoints; i++) - lambdaDtBox[numContPoints * index + i] = 0; - } -} - -#define SPHERE_FACT 1.0f - -BT_GPU___device__ void testSphSph(float3 aPos, float3 bPos, float radA, float radB, float4* pOut) -{ - float3 del = bPos - aPos; - float dist = BT_GPU_dot(del, del); - dist = sqrtf(dist); - float maxD = radA + radB; - - if(dist > maxD) - { - return; - } - float penetration = (radA + radB - dist) * SPHERE_FACT; -// float penetration = (dist - radA - radB) * SPHERE_FACT; - float3 normal; - if(dist > 0.f) - { - float fact = -1.0f/dist; -// float fact = 1.0f/dist; - normal = del * fact; - } - else - { - normal = BT_GPU_make_float3(1.f, 0.f, 0.f); - } -// float3 contact = (bPos + aPos + normal * (radB - radA)) * 0.5f; - float3 tmp = (normal * radA); - float3 contact = aPos - tmp; - - // now add point - int numPoints = 0; - for(int i = 0; i < MAX_VTX_PER_OBJ; i++) - { - if(pOut[i*2].w >= 0.f) - { - numPoints++; - } - } - if(numPoints < MAX_VTX_PER_OBJ) - { - pOut[numPoints * 2] = BT_GPU_make_float42(contact, penetration); - pOut[numPoints * 2 + 1] = BT_GPU_make_float42(normal, 0.f); - } -} // testSphSph() - - - -BT_GPU___global__ void setConstraintDataD(int2 *constraints, - int numConstraints, - float4 *pos, - float *rotation, - char* shapes, - int2* shapeIds, - btCudaPartProps pProp, - float4 *contact) -{ - int idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - int aId,bId; - float3 aPos,bPos; -// float positionConstraint; -// float3 normal; - float aRot,bRot; - float sideLength2 = pProp.m_diameter*0.5f/sqrt(2.0f); - - if(idx < numConstraints) - { - aId=constraints[idx].x; - bId=constraints[idx].y; - - aPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,aId)); - bPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,bId)); - aRot= rotation[aId]; - bRot= rotation[bId]; - float cosA = cosf(aRot); - float sinA = sinf(aRot); - float cosB = cosf(bRot); - float sinB = sinf(bRot); - float4* shapeA = (float4*)(shapes + shapeIds[aId].x); - int numSphA = shapeIds[aId].y; - float4* shapeB = (float4*)(shapes + shapeIds[bId].x); - int numSphB = shapeIds[bId].y; - int i, j; - float3 ai = BT_GPU_make_float3(cosA, sinA, 0.f); - float3 aj = BT_GPU_make_float3(-sinA, cosA, 0.f); - float3 bi = BT_GPU_make_float3(cosB, sinB, 0.f); - float3 bj = BT_GPU_make_float3(-sinB, cosB, 0.f); - float4* pOut = contact + idx * MAX_VTX_PER_OBJ * 2; - for(i = 0; i < MAX_VTX_PER_OBJ; i++) - { - pOut[i * 2].w = -1.f; - pOut[i * 2 + 1].w = 0.f; - } - for(i = 0; i < numSphA; i++) - { - float3 va = aPos; - float3 tmp = ai * shapeA[i].x; - float3 tmp2 = aj * shapeA[i].y; - - va += tmp; - va += tmp2; - - float radA = shapeA[i].w; - for(j = 0; j < numSphB; j++) - { - float3 vb = bPos; - float3 tmp =bi * shapeB[j].x; - float3 tmp2 = bj * shapeB[j].y; - vb += tmp; - vb += tmp2; - float radB = shapeB[j].w; - testSphSph(va, vb, radA, radB, pOut); - } - } - } -} - - -BT_GPU___device__ float computeImpulse1(float3 rVel, - float positionConstraint, - float3 cNormal, - float dt) -{ -// const float collisionConstant = 0.1f; -// const float baumgarteConstant = 0.5f; -// const float penetrationError = 0.02f; - const float collisionConstant = -0.1f; - const float baumgarteConstant = 0.3f; - const float penetrationError = 0.02f; - - float lambdaDt=0; - float3 impulse=BT_GPU_make_float3(0.f,0.f,0.f); - - if(positionConstraint > 0) - return lambdaDt; - -// positionConstraint = btMin(0.0f,positionConstraint+penetrationError); - positionConstraint = (positionConstraint+penetrationError) < 0.f ? (positionConstraint+penetrationError) : 0.0f; - - lambdaDt = -(BT_GPU_dot(cNormal,rVel)*(1+collisionConstant)); - lambdaDt -= (baumgarteConstant/dt*positionConstraint); - - return lambdaDt; -} - - -BT_GPU___global__ void collisionWithWallBoxD(float4 *pos, - float4 *vel, - float *rotation, - float *angVel, - char* shapes, - int2* shapeIds, - float* invMass, - btCudaPartProps pProp, - btCudaBoxProps gProp, - int nParticles, - float dt) -{ - int idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - float3 aPos; - float aRot; - float positionConstraint; - float3 impulse; - - - if((idx > 0) && (idx < nParticles)) - { - float inv_mass = invMass[idx]; - if(inv_mass <= 0.f) - { - return; - } - aPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,idx)); - aRot=rotation[idx]; - float4* shape = (float4*)(shapes + shapeIds[idx].x); - int numSph = shapeIds[idx].y; - float cosA = cosf(aRot); - float sinA = sinf(aRot); - float3 ai = BT_GPU_make_float3(cosA, sinA, 0.f); - float3 aj = BT_GPU_make_float3(-sinA, cosA, 0.f); - - for(int iVtx=0;iVtx < numSph; iVtx++){ - float3 aVel = BT_GPU_make_float3(vel[idx].x, vel[idx].y, vel[idx].z); - float aAngVel = angVel[idx]; - float3 rerVertex = ai * shape[iVtx].x; - float3 tmp = aj * shape[iVtx].y; - rerVertex += tmp; - float3 vPos = aPos + rerVertex; - float rad = shape[iVtx].w; - float3 vVel =aVel+BT_GPU_cross(BT_GPU_make_float3(0.0f,0.0f,aAngVel),rerVertex); -// float restitution=1.0; - float restitution=0.3f; - { - positionConstraint =vPos.y - rad - gProp.minY; - impulse =BT_GPU_make_float31(0.0f); - - if(positionConstraint < 0) - { - float3 groundNormal; - groundNormal = BT_GPU_make_float3(0.0f,1.0f,0.0f); - impulse =groundNormal* - restitution * computeImpulse1(vVel,positionConstraint, - groundNormal, - dt); -#if USE_FRICTION // only with ground for now - float3 lat_vel = vVel - groundNormal * BT_GPU_dot(groundNormal,vVel); - float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); - if (lat_vel_len > 0) - { - lat_vel_len = sqrtf(lat_vel_len); - lat_vel *= 1.f/lat_vel_len; - float3 tmp = lat_vel * BT_GPU_dot(lat_vel, vVel) * FRICTION_BOX_GROUND_FACT; - impulse -= tmp; - } -#endif //USE_FRICTION - float4 tmp = BT_GPU_make_float42(impulse,0.0f); - vel[idx] += tmp; - float tmp2 = BT_GPU_cross(rerVertex,impulse).z; - angVel[idx] += tmp2; - } - } - - { - positionConstraint =vPos.x - rad - gProp.minX; - impulse =BT_GPU_make_float31(0.0f); - - if(positionConstraint < 0){ - impulse =BT_GPU_make_float3(1.0f,0.0f,0.0f)* restitution * - computeImpulse1(vVel,positionConstraint, - BT_GPU_make_float3(1.0f,0.0f,0.0f), - dt); - - float4 tmp = BT_GPU_make_float42(impulse,0.0f); - vel[idx] += tmp; - angVel[idx] += BT_GPU_cross(rerVertex,impulse).z; - } - } - - { - positionConstraint = gProp.maxX - vPos.x - rad; - impulse =BT_GPU_make_float31(0.0f); - - if(positionConstraint < 0){ - impulse =BT_GPU_make_float3(-1.0f,0.0f,0.0f)* restitution * - computeImpulse1(vVel,positionConstraint, - BT_GPU_make_float3(-1.0f,0.0f,0.0f), - dt); - - float4 tmp = BT_GPU_make_float42(impulse,0.0f); - vel[idx] += tmp; - angVel[idx] += BT_GPU_cross(rerVertex,impulse).z; - } - } - } - } -} - -BT_GPU___device__ void collisionResolutionBox( int constrId, - int2* constraints, - float4 *pos, - float4 *vel, - float *rotation, - float *angularVel, - float *lambdaDtBox, - float4* contact, - float* invMass, - btCudaPartProps pProp, - float dt) -{ -#if 1 - float3 relVel; - float3 impulse; - float lambdaDt; - float positionConstraint; - int aId=constraints[constrId].x; - int bId=constraints[constrId].y; - float3 aPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,aId)); - float3 bPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,bId)); - float3 aVel=BT_GPU_make_float34(vel[aId]); - float3 bVel=BT_GPU_make_float34(vel[bId]); - float aAngVel=angularVel[aId]; - float bAngVel=angularVel[bId]; - float4* pCont = contact + constrId * MAX_VTX_PER_OBJ * 2; - // test Vertices in A to Box B - for(int iVtx=0;iVtx= 0) - { - float3 contactNormal = BT_GPU_make_float34(pCont[iVtx * 2 + 1]); - relVel=(aVel+BT_GPU_cross(BT_GPU_make_float3(0.0f,0.0f,aAngVel), - contactPoint)) - -(bVel+BT_GPU_cross(BT_GPU_make_float3(0.0f,0.0f,bAngVel), - contactPoint+aPos-bPos)); - - lambdaDt= computeImpulse1(relVel,-positionConstraint, - contactNormal,dt); - - { - float rLambdaDt=lambdaDtBox[(MAX_VTX_PER_OBJ)*(2*constrId)+iVtx]; - float pLambdaDt=rLambdaDt; -// rLambdaDt=btMax(pLambdaDt+lambdaDt,0.0f); - rLambdaDt=(pLambdaDt+lambdaDt) > 0.0f ? (pLambdaDt+lambdaDt) : 0.0f; - lambdaDt=rLambdaDt-pLambdaDt; - lambdaDtBox[(MAX_VTX_PER_OBJ)*(2*constrId)+iVtx]=rLambdaDt; - } - impulse= contactNormal*lambdaDt*0.5; -#if USE_FRICTION - if(pCont[iVtx * 2 + 1].w <= 0) - { - float3 lat_vel = relVel - contactNormal * BT_GPU_dot(contactNormal, relVel); - float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); - if (lat_vel_len > 0) - { - lat_vel_len = sqrtf(lat_vel_len); - lat_vel *= 1.f/lat_vel_len; - float3 tmp = lat_vel * BT_GPU_dot(lat_vel , relVel) * FRICTION_BOX_BOX_FACT; - impulse -= tmp; - } - } -#endif //USE_FRICTION - if(aId && (invMass[aId] > 0.f)) - { - aVel+= impulse; - aAngVel+= BT_GPU_cross(contactPoint, impulse).z; - } - if(bId && (invMass[bId] > 0.f)) - { - bVel-= impulse; - bAngVel-= BT_GPU_cross(contactPoint+aPos-bPos, impulse).z; - } - } - } - vel[aId]=BT_GPU_make_float42(aVel,0.0f); - vel[bId]=BT_GPU_make_float42(bVel,0.0f); - angularVel[aId]=aAngVel; - angularVel[bId]=bAngVel; -#endif -} - -BT_GPU___global__ void collisionBatchResolutionBoxD(int2 *constraints, - int *batch, - int nConstraints, - float4 *pos, - float4 *vel, - float *rotation, - float *angularVel, - float *lambdaDtBox, - float4* contact, - float* invMass, - btCudaPartProps pProp, - int iBatch, - float dt) -{ - int k_idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(k_idx < nConstraints) - { - int idx = batch[k_idx]; - collisionResolutionBox( idx, constraints, pos, vel, rotation, angularVel, lambdaDtBox, - contact, invMass, pProp, dt); - } -} - - -extern "C" -{ - -void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)) -{ - if(!numConstraints) - { - return; - } - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numConstraints, 256, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, clearAccumulationOfLambdaDtD, (lambdaDtBox, numConstraints, numContPoints)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("clearAccumulationOfLambdaDtD kernel execution failed"); - -} - -void BT_GPU_PREF(setConstraintData(void* constraints,int numConstraints,int numObjs,void* pos,float *rotation,char* shapes,void* shapeIds,btCudaPartProps pProp,void* contact)) -{ - if(!numConstraints) - { - return; - } - int2* pConst = (int2*)constraints; - float4* pPos = (float4*)pos; - float4* pCont = (float4*)contact; - int2* pShapeIds = (int2*)shapeIds; - - BT_GPU_SAFE_CALL(BT_GPU_BindTexture(0, posTex, pPos, numObjs * sizeof(float4))); - - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numConstraints, 256, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, setConstraintDataD, (pConst,numConstraints,pPos,rotation,shapes,pShapeIds,pProp,pCont)); - BT_GPU_SAFE_CALL(BT_GPU_UnbindTexture(posTex)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("setConstraintDataD kernel execution failed"); -} - -void BT_GPU_PREF(collisionWithWallBox(void* pos,void* vel,float *rotation,float *angVel,char* shapes,void* shapeIds,void* invMass,btCudaPartProps pProp, btCudaBoxProps gProp,int numObjs,float dt)) -{ - if(!numObjs) - { - return; - } - float4* pPos = (float4*)pos; - float4* pVel = (float4*)vel; - int2* pShapeIds = (int2*)shapeIds; - float* pInvMass = (float*)invMass; - BT_GPU_SAFE_CALL(BT_GPU_BindTexture(0, posTex, pPos, numObjs * sizeof(float4))); - - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numObjs, 256, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionWithWallBoxD, (pPos,pVel,rotation,angVel,shapes, pShapeIds,pInvMass,pProp,gProp,numObjs,dt)); - - BT_GPU_SAFE_CALL(BT_GPU_UnbindTexture(posTex)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("collisionWithWallBoxD kernel execution failed"); -} - -void BT_GPU_PREF(collisionBatchResolutionBox(void* constraints,int *batch,int numConstraints,int numObjs,void *pos,void *vel,float *rotation,float *angularVel,float *lambdaDtBox,void* contact,void* invMass,btCudaPartProps pProp,int iBatch,float dt)) -{ - if(!numConstraints) - { - return; - } - int2* pConstr = (int2*)constraints; - float4* pPos = (float4*)pos; - float4* pVel = (float4*)vel; - float4* pCont = (float4*)contact; - float* pInvMass = (float*)invMass; - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numConstraints, 128, numBlocks, numThreads); - BT_GPU_SAFE_CALL(BT_GPU_BindTexture(0, posTex, pPos, numObjs * sizeof(float4))); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionBatchResolutionBoxD, (pConstr,batch,numConstraints,pPos,pVel,rotation,angularVel,lambdaDtBox,pCont,pInvMass,pProp,iBatch,dt)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("collisionBatchResolutionBox2D kernel execution failed"); - BT_GPU_SAFE_CALL(BT_GPU_UnbindTexture(posTex)); - -} - - -} // extern "C" +/* +Impulse based Rigid body simulation using CUDA +Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html + +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. +*/ + + + +#define USE_FRICTION 1 +#define FRICTION_BOX_GROUND_FACT 0.05f +#define FRICTION_BOX_BOX_FACT 0.05f +#define USE_CENTERS 1 +//#include "LinearMath/btMinMax.h" + +//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- + +#define MAX_VTX_PER_OBJ 8 + +/* +BT_GPU___device__ void kill_me() +{ + char* badPtr = (char*)0xFFFFFFFF; + *badPtr = 10; +} +*/ + + +BT_GPU___global__ void clearAccumulationOfLambdaDtD(float* lambdaDtBox, int numConstraints, int numContPoints) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index < numConstraints) + { + for(int i=0; i < numContPoints; i++) + lambdaDtBox[numContPoints * index + i] = 0; + } +} + +#define SPHERE_FACT 1.0f + +BT_GPU___device__ void testSphSph(float3 aPos, float3 bPos, float radA, float radB, float4* pOut) +{ + float3 del = bPos - aPos; + float dist = BT_GPU_dot(del, del); + dist = sqrtf(dist); + float maxD = radA + radB; + + if(dist > maxD) + { + return; + } + float penetration = (radA + radB - dist) * SPHERE_FACT; +// float penetration = (dist - radA - radB) * SPHERE_FACT; + float3 normal; + if(dist > 0.f) + { + float fact = -1.0f/dist; +// float fact = 1.0f/dist; + normal = del * fact; + } + else + { + normal = BT_GPU_make_float3(1.f, 0.f, 0.f); + } +// float3 contact = (bPos + aPos + normal * (radB - radA)) * 0.5f; + float3 tmp = (normal * radA); + float3 contact = aPos - tmp; + + // now add point + int numPoints = 0; + for(int i = 0; i < MAX_VTX_PER_OBJ; i++) + { + if(pOut[i*2].w >= 0.f) + { + numPoints++; + } + } + if(numPoints < MAX_VTX_PER_OBJ) + { + pOut[numPoints * 2] = BT_GPU_make_float42(contact, penetration); + pOut[numPoints * 2 + 1] = BT_GPU_make_float42(normal, 0.f); + } +} // testSphSph() + + + +BT_GPU___global__ void setConstraintDataD(int2 *constraints, + int numConstraints, + float4 *pos, + float *rotation, + char* shapes, + int2* shapeIds, + btCudaPartProps pProp, + float4 *contact) +{ + int idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + int aId,bId; + float3 aPos,bPos; +// float positionConstraint; +// float3 normal; + float aRot,bRot; + float sideLength2 = pProp.m_diameter*0.5f/sqrt(2.0f); + + if(idx < numConstraints) + { + aId=constraints[idx].x; + bId=constraints[idx].y; + + aPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,aId)); + bPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,bId)); + aRot= rotation[aId]; + bRot= rotation[bId]; + float cosA = cosf(aRot); + float sinA = sinf(aRot); + float cosB = cosf(bRot); + float sinB = sinf(bRot); + float4* shapeA = (float4*)(shapes + shapeIds[aId].x); + int numSphA = shapeIds[aId].y; + float4* shapeB = (float4*)(shapes + shapeIds[bId].x); + int numSphB = shapeIds[bId].y; + int i, j; + float3 ai = BT_GPU_make_float3(cosA, sinA, 0.f); + float3 aj = BT_GPU_make_float3(-sinA, cosA, 0.f); + float3 bi = BT_GPU_make_float3(cosB, sinB, 0.f); + float3 bj = BT_GPU_make_float3(-sinB, cosB, 0.f); + float4* pOut = contact + idx * MAX_VTX_PER_OBJ * 2; + for(i = 0; i < MAX_VTX_PER_OBJ; i++) + { + pOut[i * 2].w = -1.f; + pOut[i * 2 + 1].w = 0.f; + } + for(i = 0; i < numSphA; i++) + { + float3 va = aPos; + float3 tmp = ai * shapeA[i].x; + float3 tmp2 = aj * shapeA[i].y; + + va += tmp; + va += tmp2; + + float radA = shapeA[i].w; + for(j = 0; j < numSphB; j++) + { + float3 vb = bPos; + float3 tmp =bi * shapeB[j].x; + float3 tmp2 = bj * shapeB[j].y; + vb += tmp; + vb += tmp2; + float radB = shapeB[j].w; + testSphSph(va, vb, radA, radB, pOut); + } + } + } +} + + +BT_GPU___device__ float computeImpulse1(float3 rVel, + float positionConstraint, + float3 cNormal, + float dt) +{ +// const float collisionConstant = 0.1f; +// const float baumgarteConstant = 0.5f; +// const float penetrationError = 0.02f; + const float collisionConstant = -0.1f; + const float baumgarteConstant = 0.3f; + const float penetrationError = 0.02f; + + float lambdaDt=0; + float3 impulse=BT_GPU_make_float3(0.f,0.f,0.f); + + if(positionConstraint > 0) + return lambdaDt; + +// positionConstraint = btMin(0.0f,positionConstraint+penetrationError); + positionConstraint = (positionConstraint+penetrationError) < 0.f ? (positionConstraint+penetrationError) : 0.0f; + + lambdaDt = -(BT_GPU_dot(cNormal,rVel)*(1+collisionConstant)); + lambdaDt -= (baumgarteConstant/dt*positionConstraint); + + return lambdaDt; +} + + +BT_GPU___global__ void collisionWithWallBoxD(float4 *pos, + float4 *vel, + float *rotation, + float *angVel, + char* shapes, + int2* shapeIds, + float* invMass, + btCudaPartProps pProp, + btCudaBoxProps gProp, + int nParticles, + float dt) +{ + int idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + float3 aPos; + float aRot; + float positionConstraint; + float3 impulse; + + + if((idx > 0) && (idx < nParticles)) + { + float inv_mass = invMass[idx]; + if(inv_mass <= 0.f) + { + return; + } + aPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,idx)); + aRot=rotation[idx]; + float4* shape = (float4*)(shapes + shapeIds[idx].x); + int numSph = shapeIds[idx].y; + float cosA = cosf(aRot); + float sinA = sinf(aRot); + float3 ai = BT_GPU_make_float3(cosA, sinA, 0.f); + float3 aj = BT_GPU_make_float3(-sinA, cosA, 0.f); + + for(int iVtx=0;iVtx < numSph; iVtx++){ + float3 aVel = BT_GPU_make_float3(vel[idx].x, vel[idx].y, vel[idx].z); + float aAngVel = angVel[idx]; + float3 rerVertex = ai * shape[iVtx].x; + float3 tmp = aj * shape[iVtx].y; + rerVertex += tmp; + float3 vPos = aPos + rerVertex; + float rad = shape[iVtx].w; + float3 vVel =aVel+BT_GPU_cross(BT_GPU_make_float3(0.0f,0.0f,aAngVel),rerVertex); +// float restitution=1.0; + float restitution=0.3f; + { + positionConstraint =vPos.y - rad - gProp.minY; + impulse =BT_GPU_make_float31(0.0f); + + if(positionConstraint < 0) + { + float3 groundNormal; + groundNormal = BT_GPU_make_float3(0.0f,1.0f,0.0f); + impulse =groundNormal* + restitution * computeImpulse1(vVel,positionConstraint, + groundNormal, + dt); +#if USE_FRICTION // only with ground for now + float3 lat_vel = vVel - groundNormal * BT_GPU_dot(groundNormal,vVel); + float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); + if (lat_vel_len > 0) + { + lat_vel_len = sqrtf(lat_vel_len); + lat_vel *= 1.f/lat_vel_len; + float3 tmp = lat_vel * BT_GPU_dot(lat_vel, vVel) * FRICTION_BOX_GROUND_FACT; + impulse -= tmp; + } +#endif //USE_FRICTION + float4 tmp = BT_GPU_make_float42(impulse,0.0f); + vel[idx] += tmp; + float tmp2 = BT_GPU_cross(rerVertex,impulse).z; + angVel[idx] += tmp2; + } + } + + { + positionConstraint =vPos.x - rad - gProp.minX; + impulse =BT_GPU_make_float31(0.0f); + + if(positionConstraint < 0){ + impulse =BT_GPU_make_float3(1.0f,0.0f,0.0f)* restitution * + computeImpulse1(vVel,positionConstraint, + BT_GPU_make_float3(1.0f,0.0f,0.0f), + dt); + + float4 tmp = BT_GPU_make_float42(impulse,0.0f); + vel[idx] += tmp; + angVel[idx] += BT_GPU_cross(rerVertex,impulse).z; + } + } + + { + positionConstraint = gProp.maxX - vPos.x - rad; + impulse =BT_GPU_make_float31(0.0f); + + if(positionConstraint < 0){ + impulse =BT_GPU_make_float3(-1.0f,0.0f,0.0f)* restitution * + computeImpulse1(vVel,positionConstraint, + BT_GPU_make_float3(-1.0f,0.0f,0.0f), + dt); + + float4 tmp = BT_GPU_make_float42(impulse,0.0f); + vel[idx] += tmp; + angVel[idx] += BT_GPU_cross(rerVertex,impulse).z; + } + } + } + } +} + +BT_GPU___device__ void collisionResolutionBox( int constrId, + int2* constraints, + float4 *pos, + float4 *vel, + float *rotation, + float *angularVel, + float *lambdaDtBox, + float4* contact, + float* invMass, + btCudaPartProps pProp, + float dt) +{ +#if 1 + float3 relVel; + float3 impulse; + float lambdaDt; + float positionConstraint; + int aId=constraints[constrId].x; + int bId=constraints[constrId].y; + float3 aPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,aId)); + float3 bPos=BT_GPU_make_float34(BT_GPU_FETCH4(pos,bId)); + float3 aVel=BT_GPU_make_float34(vel[aId]); + float3 bVel=BT_GPU_make_float34(vel[bId]); + float aAngVel=angularVel[aId]; + float bAngVel=angularVel[bId]; + float4* pCont = contact + constrId * MAX_VTX_PER_OBJ * 2; + // test Vertices in A to Box B + for(int iVtx=0;iVtx= 0) + { + float3 contactNormal = BT_GPU_make_float34(pCont[iVtx * 2 + 1]); + relVel=(aVel+BT_GPU_cross(BT_GPU_make_float3(0.0f,0.0f,aAngVel), + contactPoint)) + -(bVel+BT_GPU_cross(BT_GPU_make_float3(0.0f,0.0f,bAngVel), + contactPoint+aPos-bPos)); + + lambdaDt= computeImpulse1(relVel,-positionConstraint, + contactNormal,dt); + + { + float rLambdaDt=lambdaDtBox[(MAX_VTX_PER_OBJ)*(2*constrId)+iVtx]; + float pLambdaDt=rLambdaDt; +// rLambdaDt=btMax(pLambdaDt+lambdaDt,0.0f); + rLambdaDt=(pLambdaDt+lambdaDt) > 0.0f ? (pLambdaDt+lambdaDt) : 0.0f; + lambdaDt=rLambdaDt-pLambdaDt; + lambdaDtBox[(MAX_VTX_PER_OBJ)*(2*constrId)+iVtx]=rLambdaDt; + } + impulse= contactNormal*lambdaDt*0.5; +#if USE_FRICTION + if(pCont[iVtx * 2 + 1].w <= 0) + { + float3 lat_vel = relVel - contactNormal * BT_GPU_dot(contactNormal, relVel); + float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); + if (lat_vel_len > 0) + { + lat_vel_len = sqrtf(lat_vel_len); + lat_vel *= 1.f/lat_vel_len; + float3 tmp = lat_vel * BT_GPU_dot(lat_vel , relVel) * FRICTION_BOX_BOX_FACT; + impulse -= tmp; + } + } +#endif //USE_FRICTION + if(aId && (invMass[aId] > 0.f)) + { + aVel+= impulse; + aAngVel+= BT_GPU_cross(contactPoint, impulse).z; + } + if(bId && (invMass[bId] > 0.f)) + { + bVel-= impulse; + bAngVel-= BT_GPU_cross(contactPoint+aPos-bPos, impulse).z; + } + } + } + vel[aId]=BT_GPU_make_float42(aVel,0.0f); + vel[bId]=BT_GPU_make_float42(bVel,0.0f); + angularVel[aId]=aAngVel; + angularVel[bId]=bAngVel; +#endif +} + +BT_GPU___global__ void collisionBatchResolutionBoxD(int2 *constraints, + int *batch, + int nConstraints, + float4 *pos, + float4 *vel, + float *rotation, + float *angularVel, + float *lambdaDtBox, + float4* contact, + float* invMass, + btCudaPartProps pProp, + int iBatch, + float dt) +{ + int k_idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(k_idx < nConstraints) + { + int idx = batch[k_idx]; + collisionResolutionBox( idx, constraints, pos, vel, rotation, angularVel, lambdaDtBox, + contact, invMass, pProp, dt); + } +} + + +extern "C" +{ + +void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)) +{ + if(!numConstraints) + { + return; + } + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numConstraints, 256, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, clearAccumulationOfLambdaDtD, (lambdaDtBox, numConstraints, numContPoints)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("clearAccumulationOfLambdaDtD kernel execution failed"); + +} + +void BT_GPU_PREF(setConstraintData(void* constraints,int numConstraints,int numObjs,void* pos,float *rotation,char* shapes,void* shapeIds,btCudaPartProps pProp,void* contact)) +{ + if(!numConstraints) + { + return; + } + int2* pConst = (int2*)constraints; + float4* pPos = (float4*)pos; + float4* pCont = (float4*)contact; + int2* pShapeIds = (int2*)shapeIds; + + BT_GPU_SAFE_CALL(BT_GPU_BindTexture(0, posTex, pPos, numObjs * sizeof(float4))); + + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numConstraints, 256, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, setConstraintDataD, (pConst,numConstraints,pPos,rotation,shapes,pShapeIds,pProp,pCont)); + BT_GPU_SAFE_CALL(BT_GPU_UnbindTexture(posTex)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("setConstraintDataD kernel execution failed"); +} + +void BT_GPU_PREF(collisionWithWallBox(void* pos,void* vel,float *rotation,float *angVel,char* shapes,void* shapeIds,void* invMass,btCudaPartProps pProp, btCudaBoxProps gProp,int numObjs,float dt)) +{ + if(!numObjs) + { + return; + } + float4* pPos = (float4*)pos; + float4* pVel = (float4*)vel; + int2* pShapeIds = (int2*)shapeIds; + float* pInvMass = (float*)invMass; + BT_GPU_SAFE_CALL(BT_GPU_BindTexture(0, posTex, pPos, numObjs * sizeof(float4))); + + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numObjs, 256, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionWithWallBoxD, (pPos,pVel,rotation,angVel,shapes, pShapeIds,pInvMass,pProp,gProp,numObjs,dt)); + + BT_GPU_SAFE_CALL(BT_GPU_UnbindTexture(posTex)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("collisionWithWallBoxD kernel execution failed"); +} + +void BT_GPU_PREF(collisionBatchResolutionBox(void* constraints,int *batch,int numConstraints,int numObjs,void *pos,void *vel,float *rotation,float *angularVel,float *lambdaDtBox,void* contact,void* invMass,btCudaPartProps pProp,int iBatch,float dt)) +{ + if(!numConstraints) + { + return; + } + int2* pConstr = (int2*)constraints; + float4* pPos = (float4*)pos; + float4* pVel = (float4*)vel; + float4* pCont = (float4*)contact; + float* pInvMass = (float*)invMass; + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numConstraints, 128, numBlocks, numThreads); + BT_GPU_SAFE_CALL(BT_GPU_BindTexture(0, posTex, pPos, numObjs * sizeof(float4))); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionBatchResolutionBoxD, (pConstr,batch,numConstraints,pPos,pVel,rotation,angularVel,lambdaDtBox,pCont,pInvMass,pProp,iBatch,dt)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("collisionBatchResolutionBox2D kernel execution failed"); + BT_GPU_SAFE_CALL(BT_GPU_UnbindTexture(posTex)); + +} + + +} // extern "C" diff --git a/Demos/Gpu2dDemo/btGpuDemo2dSharedDefs.h b/Demos/Gpu2dDemo/btGpuDemo2dSharedDefs.h index 1a2904811..36bfe41eb 100644 --- a/Demos/Gpu2dDemo/btGpuDemo2dSharedDefs.h +++ b/Demos/Gpu2dDemo/btGpuDemo2dSharedDefs.h @@ -1,33 +1,33 @@ -/* -Impulse based Rigid body simulation using CUDA -Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html - -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. -*/ - - - -//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- - - - - -extern "C" -{ - -void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)); -void BT_GPU_PREF(setConstraintData(void* constraints,int numConstraints,int numObjs,void* pos,float *rotation,char* shapes,void* shapeIds,btCudaPartProps pProp,void* oContact)); -void BT_GPU_PREF(collisionWithWallBox(void* pos,void* vel,float *rotation,float *angVel,char* shapes,void* shapeIds,void* invMass,btCudaPartProps pProp,btCudaBoxProps gProp,int numObjs,float dt)); -void BT_GPU_PREF(collisionBatchResolutionBox(void* constraints,int *batch,int numConstraints,int numObjs,void *pos,void *vel,float *rotation,float *angularVel,float *lambdaDtBox,void* contact,void* invMass,btCudaPartProps pProp,int iBatch,float dt)); - -} // extern "C" - - +/* +Impulse based Rigid body simulation using CUDA +Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html + +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. +*/ + + + +//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- + + + + +extern "C" +{ + +void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)); +void BT_GPU_PREF(setConstraintData(void* constraints,int numConstraints,int numObjs,void* pos,float *rotation,char* shapes,void* shapeIds,btCudaPartProps pProp,void* oContact)); +void BT_GPU_PREF(collisionWithWallBox(void* pos,void* vel,float *rotation,float *angVel,char* shapes,void* shapeIds,void* invMass,btCudaPartProps pProp,btCudaBoxProps gProp,int numObjs,float dt)); +void BT_GPU_PREF(collisionBatchResolutionBox(void* constraints,int *batch,int numConstraints,int numObjs,void *pos,void *vel,float *rotation,float *angularVel,float *lambdaDtBox,void* contact,void* invMass,btCudaPartProps pProp,int iBatch,float dt)); + +} // extern "C" + + diff --git a/Demos/Gpu2dDemo/btGpuDemo2dSharedTypes.h b/Demos/Gpu2dDemo/btGpuDemo2dSharedTypes.h index 2d4a18baa..469e9497d 100644 --- a/Demos/Gpu2dDemo/btGpuDemo2dSharedTypes.h +++ b/Demos/Gpu2dDemo/btGpuDemo2dSharedTypes.h @@ -1,35 +1,35 @@ -/* -Impulse based Rigid body simulation using CUDA -Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html - -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. -*/ - -//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- - -struct btCudaPartProps -{ - float m_mass; - float m_diameter; - float m_restCoeff; -}; - -struct btCudaBoxProps -{ - float minX; - float maxX; - float minY; - float maxY; - float minZ; - float maxZ; -}; - - +/* +Impulse based Rigid body simulation using CUDA +Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html + +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. +*/ + +//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- + +struct btCudaPartProps +{ + float m_mass; + float m_diameter; + float m_restCoeff; +}; + +struct btCudaBoxProps +{ + float minX; + float maxX; + float minY; + float maxY; + float minZ; + float maxZ; +}; + + diff --git a/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.cpp b/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.cpp index f98c731a0..9d9f20866 100644 --- a/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.cpp +++ b/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.cpp @@ -1,592 +1,592 @@ -/* -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 "btGpuDemoDynamicsWorld.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" -#include "BulletCollision/CollisionShapes/btCollisionShape.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" -#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" -#include "LinearMath/btQuickprof.h" -#include "GlutStuff.h" -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" -#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" - - - - -#define BT_GPU_PREF(func) btCuda_##func - -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "btGpuDemo2dSharedDefs.h" -#undef BT_GPU_PREF - -#define BT_GPU_PREF(func) btGpu_##func -#include "btGpuDemo2dSharedDefs.h" -#undef BT_GPU_PREF - - - -btGpuDemoDynamicsWorld* gpCudaDemoDynamicsWorld = NULL; - - - -void btGpuDemoDynamicsWorld::grabNonContactConstraintData() -{ - m_numNonContactConstraints = 0; - int numNonContactConstraints = getNumConstraints(); - for(int i = 0; i < numNonContactConstraints; i++) - { - btTypedConstraint* ct = m_constraints[i]; - int ctype = ct->getConstraintType(); - switch(ctype) - { - case POINT2POINT_CONSTRAINT_TYPE : - grabP2PConstraintData((btPoint2PointConstraint*)ct); - break; - default : - // warning (not supported) here? - break; - } - } -} - - - -void btGpuDemoDynamicsWorld::grabContactData() -{ - int i; - btDispatcher* dispatcher = getDispatcher(); - btPersistentManifold** manifoldPtr = dispatcher->getInternalManifoldPointer(); - int numManifolds = dispatcher->getNumManifolds(); - btPersistentManifold* manifold = 0; - m_totalNumConstraints = 0; - for(i = 0; i < numManifolds; i++) - { - manifold = manifoldPtr[i]; - int numPoints = manifold->getNumContacts(); - if(!numPoints) - { - continue; - } - int numActualPoints = 0; - for(int n = 0; n < numPoints; n++) - { - btManifoldPoint& cp = manifold->getContactPoint(n); - if (cp.m_distance1<=0) - { - numActualPoints++; - } - } - if (!numActualPoints) - continue; - - btRigidBody *rbA, *rbB; - rbA = (btRigidBody*)manifold->getBody0(); - rbB = (btRigidBody*)manifold->getBody1(); - int idA = rbA->getCompanionId(); - int idB = rbB->getCompanionId(); - btVector3* pConstrData = (btVector3*)(m_hContact + m_totalNumConstraints * 2 * m_maxVtxPerObj); - if(idA < idB) - { - m_hIds[m_totalNumConstraints].x = idA; - m_hIds[m_totalNumConstraints].y = idB; - - for(int n = 0; n < numPoints; n++) - { - btManifoldPoint& cp = manifold->getContactPoint(n); - btVector3 v = cp.getPositionWorldOnA(); - pConstrData[0] = cp.getPositionWorldOnA(); - float dist = cp.getDistance(); - if(dist > 0.f) - { - pConstrData[0][3] = -1.f; - } - else - { - pConstrData[0][3] = -dist; - } - pConstrData[1] = cp.m_normalWorldOnB; - pConstrData[1][3] = 0.f; - pConstrData += 2; - } - } - else - { // should never happen - btAssert(0); - } - for(int n = numPoints; n < m_maxVtxPerObj; n++) - { - pConstrData[0][3] = -1.f; - pConstrData += 2; - } - m_totalNumConstraints++; - } -} - - - -void btGpuDemoDynamicsWorld::grabP2PConstraintData(btPoint2PointConstraint* ct) -{ - btRigidBody& bodyA = ct->getRigidBodyA(); - btTransform trA = bodyA.getCenterOfMassTransform(); - btVector3 pivotA = trA.getBasis() * ct->getPivotInA(); - btRigidBody& bodyB = ct->getRigidBodyB(); - btTransform trB = bodyB.getCenterOfMassTransform(); - btVector3 pivotB = trB.getBasis() * ct->getPivotInB(); - btVector3 pivotA_W = pivotA + trA.getOrigin(); - btVector3 pivotB_W = pivotB + trB.getOrigin(); - btVector3 delta = pivotB_W - pivotA_W; - int idA = bodyA.getCompanionId(); - int idB = bodyB.getCompanionId(); - m_hIds[m_totalNumConstraints].x = idA; - m_hIds[m_totalNumConstraints].y = (idB > 0) ? idB : 0; - btVector3* pConstrData = (btVector3*)(m_hContact + m_totalNumConstraints * 2 * m_maxVtxPerObj); - for(int k = 0; k < 2; k++) - { - btScalar penetration = delta[k]; - btScalar sign = (penetration < 0) ? btScalar(-1.f) : btScalar(1.f); - btVector3 normal = btVector3(0., 0., 0.); - normal[k] = sign; - penetration *= sign; - pConstrData[0] = pivotA_W; - pConstrData[0][3] = penetration; - pConstrData[1] = normal; - pConstrData[1][3] = btScalar(1.f); - pConstrData += 2; - } - for(int n = 2; n < m_maxVtxPerObj; n++) - { - pConstrData[0][3] = -1.f; - pConstrData += 2; - } - m_totalNumConstraints++; - m_numNonContactConstraints++; -} - - - -void btGpuDemoDynamicsWorld::grabData() -{ - BT_PROFILE("grab data"); - m_numObj = getNumCollisionObjects(); - m_hPos[0].x = m_hPos[0].y = m_hPos[0].z = m_hPos[0].w = 0.f; - m_hRot[0] = 0.f; - m_hVel[0].x = m_hVel[0].y = m_hVel[0].z = m_hVel[0].w = 0.f; - m_hAngVel[0] = 0.f; - for(int i = 0; i < m_numObj; i++) - { - btCollisionObject* colObj = m_collisionObjects[i]; - btRigidBody* rb = btRigidBody::upcast(colObj); - btVector3 v; - v = rb->getCenterOfMassPosition(); - m_hPos[i+1] = *((float4*)&v); - const btTransform& tr = rb->getCenterOfMassTransform(); - v = tr.getBasis().getColumn(0); - float rot = btAtan2(v[1], v[0]); - m_hRot[i+1] = rot; - v = rb->getLinearVelocity(); - m_hVel[i+1] = *((float4*)&v); - v = rb->getAngularVelocity(); - m_hAngVel[i+1] = v[2]; - if(m_copyMassDataToGPU) - { - m_hInvMass[i+1] = rb->getInvMass(); - } - } - if(m_useBulletNarrowphase) - { - grabContactData(); - } - grabNonContactConstraintData(); -} - - - -void btGpuDemoDynamicsWorld::createBatches2() -{ - BT_PROFILE("create batches"); - int sz = m_maxObjs * m_maxNeighbors; - for(int idx = 0; idx < sz; idx++) - { - m_hBatchIds[idx] = -1; - } - for(int i = 0; i < m_totalNumConstraints; i++) - { - m_hConstraintUsed[i] = 0; - } - int curBatchId=0; - int* pBatchIds = m_hBatchIds; - for(int stage = 0; stage < m_maxBatches; stage++) - { - bool isLast = (stage == m_maxBatches-1); - for(int j = 0; j < m_numObj + 1; j++) - { - m_hConstraintCounter[j] = 0; - } - int numInBatch = 0; - for(int i = 0; i < m_totalNumConstraints; i++) - { - if(m_hConstraintUsed[i]) - { - continue; - } - int2 ids = m_hIds[i]; - if(!isLast) - { - if((m_hConstraintCounter[ids.x] == 0) && (m_hConstraintCounter[ids.y] == 0)) - { - m_hConstraintCounter[ids.x]=1; - m_hConstraintCounter[ids.y]=1; - pBatchIds[numInBatch]=i; - numInBatch++; - m_hConstraintUsed[i] = 1; - } - } - else - { - pBatchIds[numInBatch]=i; - numInBatch++; - m_hConstraintUsed[i] = 1; - } - } - m_numInBatches[stage] = numInBatch; - pBatchIds += numInBatch; - } -} - - - -void btGpuDemoDynamicsWorld::writebackData() -{ - BT_PROFILE("copy velocity into btRigidBody"); - for(int i = 0; i < m_numObj; i++) - { - btCollisionObject* colObj = m_collisionObjects[i]; - btRigidBody* rb = btRigidBody::upcast(colObj); - btVector3 v; - v = *((btVector3*)(m_hVel + i + 1)); - v[2] = 0.f; - rb->setLinearVelocity(v); - v[0] = btScalar(0.f); - v[1] = btScalar(0.f); - v[2] = m_hAngVel[i + 1]; - rb->setAngularVelocity(v); - } -} - - - -void btGpuDemoDynamicsWorld::copyDataToGPU() -{ - BT_PROFILE("copyDataToGPU"); - -#ifdef BT_USE_CUDA - - btCuda_copyArrayToDevice(m_dIds, m_hIds, sizeof(int2) * m_totalNumConstraints); - btCuda_copyArrayToDevice(m_dBatchIds, m_hBatchIds, sizeof(int) * m_totalNumConstraints); - - if(m_numNonContactConstraints) - { // non-contact constraints are set up by CPU, so copy data to GPU - int nonContConstrOffs = (m_totalNumConstraints - m_numNonContactConstraints) * 2 * m_maxVtxPerObj; - int nonContConstrSize = 2 * m_numNonContactConstraints * m_maxVtxPerObj; - btCuda_copyArrayToDevice(m_dContact + nonContConstrOffs, m_hContact + nonContConstrOffs, sizeof(float4) * nonContConstrSize); - } - - if(m_numSimStep & 1) - { - m_dcPos = m_dpPos; - m_dcVel = m_dpVel; - m_dcRot = m_dpRot; - m_dcAngVel = m_dpAngVel; - } - else - { - m_dcPos = m_dPos; - m_dcVel = m_dVel; - m_dcRot = m_dRot; - m_dcAngVel = m_dAngVel; - } - btCuda_copyArrayToDevice(m_dcPos, m_hPos, (m_numObj + 1) * sizeof(float4)); - btCuda_copyArrayToDevice(m_dcVel, m_hVel, (m_numObj + 1) * sizeof(float4)); - btCuda_copyArrayToDevice(m_dcRot, m_hRot, (m_numObj + 1) * sizeof(float)); - btCuda_copyArrayToDevice(m_dcAngVel, m_hAngVel, (m_numObj + 1) * sizeof(float)); - if(m_copyShapeDataToGPU) - { - btCuda_copyArrayToDevice(m_dShapeBuffer, m_hShapeBuffer, m_firstFreeShapeBufferOffset); - btCuda_copyArrayToDevice(m_dShapeIds, m_hShapeIds, (m_numObj + 1) * sizeof(int2)); - m_copyShapeDataToGPU = false; - } - if(m_copyMassDataToGPU) - { - btCuda_copyArrayToDevice(m_dInvMass, m_hInvMass, (m_numObj + 1) * sizeof(float)); - m_copyMassDataToGPU = false; - } -#endif //BT_USE_CUDA - -} - - - -void btGpuDemoDynamicsWorld::setConstraintData(btCudaPartProps& partProps) -{ - BT_PROFILE("set constraint data"); - partProps.m_mass = 1.0f; - partProps.m_diameter = m_objRad * 2.0f; - partProps.m_restCoeff = 1.0f; -#ifdef BT_USE_CUDA - btCuda_clearAccumulationOfLambdaDt(m_dLambdaDtBox, m_totalNumConstraints, m_maxVtxPerObj * 2); - if(!m_useBulletNarrowphase) - { - btCuda_setConstraintData(m_dIds, m_totalNumConstraints - m_numNonContactConstraints, m_numObj + 1, m_dcPos, m_dcRot, m_dShapeBuffer, m_dShapeIds, - partProps, m_dContact); - } -#endif //BT_USE_CUDA - -} - - - -void btGpuDemoDynamicsWorld::copyDataFromGPU() -{ - BT_PROFILE("copy velocity data from device"); -#ifdef BT_USE_CUDA - btCuda_copyArrayFromDevice(m_hVel, m_dcVel, (m_numObj + 1) * sizeof(float4)); - btCuda_copyArrayFromDevice(m_hAngVel, m_dcAngVel, (m_numObj + 1) * sizeof(float)); -#endif //BT_USE_CUDA -} - - - -void btGpuDemoDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo) -{ - if(m_useCPUSolver) - { - solveConstraintsCPU2(solverInfo); - } - else - { - solveConstraints2(solverInfo); - } - m_totalNumConstraints = 0; -} - - - -void btGpuDemoDynamicsWorld::solveConstraints2(btContactSolverInfo& solverInfo) -{ -#ifdef BT_USE_CUDA - BT_PROFILE("solveConstraints"); - grabData(); - createBatches2(); - copyDataToGPU(); - - btCudaPartProps partProps; - setConstraintData(partProps); - - btCudaBoxProps boxProps; - boxProps.minX = m_worldMin[0]; - boxProps.maxX = m_worldMax[0]; - boxProps.minY = m_worldMin[1]; - boxProps.maxY = m_worldMax[1]; - { - BT_PROFILE("btCuda_collisionBatchResolutionBox"); - - int nIter=getSolverInfo().m_numIterations; - btDispatcherInfo& dispatchInfo = getDispatchInfo(); - btScalar timeStep = dispatchInfo.m_timeStep; - - for(int i=0;i 0) && (idB > 0)) - { - btCollisionObject* colObjA = m_collisionObjects[idA]; - btCollisionObject* colObjB = m_collisionObjects[idB]; - btVector3 vA = colObjA->getWorldTransform().getOrigin(); - btVector3 vB = colObjB->getWorldTransform().getOrigin(); - glVertex3f(vA[0], vA[1], vA[2]); - glVertex3f(vB[0], vB[1], vB[2]); - } - } - pBatchIds += numConstraints; - glEnd(); - } -} - - - -void btGpuDemoDynamicsWorld::initShapeBuffer(int maxShapeBufferSize) -{ - m_maxShapeBufferSize = maxShapeBufferSize; - m_firstFreeShapeBufferOffset = 0; - m_hShapeBuffer = new char[m_maxShapeBufferSize]; - m_hShapeIds = new int2[m_maxObjs]; - -#ifdef BT_USE_CUDA - btCuda_allocateArray((void**)&m_dShapeBuffer, m_maxShapeBufferSize); - btCuda_allocateArray((void**)&m_dShapeIds, sizeof(int) * 2 * m_maxObjs); -#endif //BT_USE_CUDA - - m_copyShapeDataToGPU = true; -} - - - -void btGpuDemoDynamicsWorld::freeShapeBuffer() -{ - delete [] m_hShapeBuffer; - delete [] m_hShapeIds; -#ifdef BT_USE_CUDA - btCuda_freeArray(m_dShapeBuffer); - btCuda_freeArray(m_dShapeIds); -#endif //BT_USE_CUDA -} - - - -void btGpuDemoDynamicsWorld::addSphere(btVector3& pos, btScalar rad) -{ - btVector3* pBuf = (btVector3*)(m_hShapeBuffer + m_firstFreeShapeBufferOffset); - *pBuf = pos; - pBuf->setW(rad); - m_firstFreeShapeBufferOffset += sizeof(btVector3); -} - - - -void btGpuDemoDynamicsWorld::addMultiShereObject(int numSpheres, int objIndex) -{ - m_hShapeIds[objIndex].x = m_firstFreeShapeBufferOffset; - m_hShapeIds[objIndex].y = numSpheres; - return; -} - - +/* +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 "btGpuDemoDynamicsWorld.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" +#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" +#include "LinearMath/btQuickprof.h" +#include "GlutStuff.h" +#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" +#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" + + + + +#define BT_GPU_PREF(func) btCuda_##func + +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "btGpuDemo2dSharedDefs.h" +#undef BT_GPU_PREF + +#define BT_GPU_PREF(func) btGpu_##func +#include "btGpuDemo2dSharedDefs.h" +#undef BT_GPU_PREF + + + +btGpuDemoDynamicsWorld* gpCudaDemoDynamicsWorld = NULL; + + + +void btGpuDemoDynamicsWorld::grabNonContactConstraintData() +{ + m_numNonContactConstraints = 0; + int numNonContactConstraints = getNumConstraints(); + for(int i = 0; i < numNonContactConstraints; i++) + { + btTypedConstraint* ct = m_constraints[i]; + int ctype = ct->getConstraintType(); + switch(ctype) + { + case POINT2POINT_CONSTRAINT_TYPE : + grabP2PConstraintData((btPoint2PointConstraint*)ct); + break; + default : + // warning (not supported) here? + break; + } + } +} + + + +void btGpuDemoDynamicsWorld::grabContactData() +{ + int i; + btDispatcher* dispatcher = getDispatcher(); + btPersistentManifold** manifoldPtr = dispatcher->getInternalManifoldPointer(); + int numManifolds = dispatcher->getNumManifolds(); + btPersistentManifold* manifold = 0; + m_totalNumConstraints = 0; + for(i = 0; i < numManifolds; i++) + { + manifold = manifoldPtr[i]; + int numPoints = manifold->getNumContacts(); + if(!numPoints) + { + continue; + } + int numActualPoints = 0; + for(int n = 0; n < numPoints; n++) + { + btManifoldPoint& cp = manifold->getContactPoint(n); + if (cp.m_distance1<=0) + { + numActualPoints++; + } + } + if (!numActualPoints) + continue; + + btRigidBody *rbA, *rbB; + rbA = (btRigidBody*)manifold->getBody0(); + rbB = (btRigidBody*)manifold->getBody1(); + int idA = rbA->getCompanionId(); + int idB = rbB->getCompanionId(); + btVector3* pConstrData = (btVector3*)(m_hContact + m_totalNumConstraints * 2 * m_maxVtxPerObj); + if(idA < idB) + { + m_hIds[m_totalNumConstraints].x = idA; + m_hIds[m_totalNumConstraints].y = idB; + + for(int n = 0; n < numPoints; n++) + { + btManifoldPoint& cp = manifold->getContactPoint(n); + btVector3 v = cp.getPositionWorldOnA(); + pConstrData[0] = cp.getPositionWorldOnA(); + float dist = cp.getDistance(); + if(dist > 0.f) + { + pConstrData[0][3] = -1.f; + } + else + { + pConstrData[0][3] = -dist; + } + pConstrData[1] = cp.m_normalWorldOnB; + pConstrData[1][3] = 0.f; + pConstrData += 2; + } + } + else + { // should never happen + btAssert(0); + } + for(int n = numPoints; n < m_maxVtxPerObj; n++) + { + pConstrData[0][3] = -1.f; + pConstrData += 2; + } + m_totalNumConstraints++; + } +} + + + +void btGpuDemoDynamicsWorld::grabP2PConstraintData(btPoint2PointConstraint* ct) +{ + btRigidBody& bodyA = ct->getRigidBodyA(); + btTransform trA = bodyA.getCenterOfMassTransform(); + btVector3 pivotA = trA.getBasis() * ct->getPivotInA(); + btRigidBody& bodyB = ct->getRigidBodyB(); + btTransform trB = bodyB.getCenterOfMassTransform(); + btVector3 pivotB = trB.getBasis() * ct->getPivotInB(); + btVector3 pivotA_W = pivotA + trA.getOrigin(); + btVector3 pivotB_W = pivotB + trB.getOrigin(); + btVector3 delta = pivotB_W - pivotA_W; + int idA = bodyA.getCompanionId(); + int idB = bodyB.getCompanionId(); + m_hIds[m_totalNumConstraints].x = idA; + m_hIds[m_totalNumConstraints].y = (idB > 0) ? idB : 0; + btVector3* pConstrData = (btVector3*)(m_hContact + m_totalNumConstraints * 2 * m_maxVtxPerObj); + for(int k = 0; k < 2; k++) + { + btScalar penetration = delta[k]; + btScalar sign = (penetration < 0) ? btScalar(-1.f) : btScalar(1.f); + btVector3 normal = btVector3(0., 0., 0.); + normal[k] = sign; + penetration *= sign; + pConstrData[0] = pivotA_W; + pConstrData[0][3] = penetration; + pConstrData[1] = normal; + pConstrData[1][3] = btScalar(1.f); + pConstrData += 2; + } + for(int n = 2; n < m_maxVtxPerObj; n++) + { + pConstrData[0][3] = -1.f; + pConstrData += 2; + } + m_totalNumConstraints++; + m_numNonContactConstraints++; +} + + + +void btGpuDemoDynamicsWorld::grabData() +{ + BT_PROFILE("grab data"); + m_numObj = getNumCollisionObjects(); + m_hPos[0].x = m_hPos[0].y = m_hPos[0].z = m_hPos[0].w = 0.f; + m_hRot[0] = 0.f; + m_hVel[0].x = m_hVel[0].y = m_hVel[0].z = m_hVel[0].w = 0.f; + m_hAngVel[0] = 0.f; + for(int i = 0; i < m_numObj; i++) + { + btCollisionObject* colObj = m_collisionObjects[i]; + btRigidBody* rb = btRigidBody::upcast(colObj); + btVector3 v; + v = rb->getCenterOfMassPosition(); + m_hPos[i+1] = *((float4*)&v); + const btTransform& tr = rb->getCenterOfMassTransform(); + v = tr.getBasis().getColumn(0); + float rot = btAtan2(v[1], v[0]); + m_hRot[i+1] = rot; + v = rb->getLinearVelocity(); + m_hVel[i+1] = *((float4*)&v); + v = rb->getAngularVelocity(); + m_hAngVel[i+1] = v[2]; + if(m_copyMassDataToGPU) + { + m_hInvMass[i+1] = rb->getInvMass(); + } + } + if(m_useBulletNarrowphase) + { + grabContactData(); + } + grabNonContactConstraintData(); +} + + + +void btGpuDemoDynamicsWorld::createBatches2() +{ + BT_PROFILE("create batches"); + int sz = m_maxObjs * m_maxNeighbors; + for(int idx = 0; idx < sz; idx++) + { + m_hBatchIds[idx] = -1; + } + for(int i = 0; i < m_totalNumConstraints; i++) + { + m_hConstraintUsed[i] = 0; + } + int curBatchId=0; + int* pBatchIds = m_hBatchIds; + for(int stage = 0; stage < m_maxBatches; stage++) + { + bool isLast = (stage == m_maxBatches-1); + for(int j = 0; j < m_numObj + 1; j++) + { + m_hConstraintCounter[j] = 0; + } + int numInBatch = 0; + for(int i = 0; i < m_totalNumConstraints; i++) + { + if(m_hConstraintUsed[i]) + { + continue; + } + int2 ids = m_hIds[i]; + if(!isLast) + { + if((m_hConstraintCounter[ids.x] == 0) && (m_hConstraintCounter[ids.y] == 0)) + { + m_hConstraintCounter[ids.x]=1; + m_hConstraintCounter[ids.y]=1; + pBatchIds[numInBatch]=i; + numInBatch++; + m_hConstraintUsed[i] = 1; + } + } + else + { + pBatchIds[numInBatch]=i; + numInBatch++; + m_hConstraintUsed[i] = 1; + } + } + m_numInBatches[stage] = numInBatch; + pBatchIds += numInBatch; + } +} + + + +void btGpuDemoDynamicsWorld::writebackData() +{ + BT_PROFILE("copy velocity into btRigidBody"); + for(int i = 0; i < m_numObj; i++) + { + btCollisionObject* colObj = m_collisionObjects[i]; + btRigidBody* rb = btRigidBody::upcast(colObj); + btVector3 v; + v = *((btVector3*)(m_hVel + i + 1)); + v[2] = 0.f; + rb->setLinearVelocity(v); + v[0] = btScalar(0.f); + v[1] = btScalar(0.f); + v[2] = m_hAngVel[i + 1]; + rb->setAngularVelocity(v); + } +} + + + +void btGpuDemoDynamicsWorld::copyDataToGPU() +{ + BT_PROFILE("copyDataToGPU"); + +#ifdef BT_USE_CUDA + + btCuda_copyArrayToDevice(m_dIds, m_hIds, sizeof(int2) * m_totalNumConstraints); + btCuda_copyArrayToDevice(m_dBatchIds, m_hBatchIds, sizeof(int) * m_totalNumConstraints); + + if(m_numNonContactConstraints) + { // non-contact constraints are set up by CPU, so copy data to GPU + int nonContConstrOffs = (m_totalNumConstraints - m_numNonContactConstraints) * 2 * m_maxVtxPerObj; + int nonContConstrSize = 2 * m_numNonContactConstraints * m_maxVtxPerObj; + btCuda_copyArrayToDevice(m_dContact + nonContConstrOffs, m_hContact + nonContConstrOffs, sizeof(float4) * nonContConstrSize); + } + + if(m_numSimStep & 1) + { + m_dcPos = m_dpPos; + m_dcVel = m_dpVel; + m_dcRot = m_dpRot; + m_dcAngVel = m_dpAngVel; + } + else + { + m_dcPos = m_dPos; + m_dcVel = m_dVel; + m_dcRot = m_dRot; + m_dcAngVel = m_dAngVel; + } + btCuda_copyArrayToDevice(m_dcPos, m_hPos, (m_numObj + 1) * sizeof(float4)); + btCuda_copyArrayToDevice(m_dcVel, m_hVel, (m_numObj + 1) * sizeof(float4)); + btCuda_copyArrayToDevice(m_dcRot, m_hRot, (m_numObj + 1) * sizeof(float)); + btCuda_copyArrayToDevice(m_dcAngVel, m_hAngVel, (m_numObj + 1) * sizeof(float)); + if(m_copyShapeDataToGPU) + { + btCuda_copyArrayToDevice(m_dShapeBuffer, m_hShapeBuffer, m_firstFreeShapeBufferOffset); + btCuda_copyArrayToDevice(m_dShapeIds, m_hShapeIds, (m_numObj + 1) * sizeof(int2)); + m_copyShapeDataToGPU = false; + } + if(m_copyMassDataToGPU) + { + btCuda_copyArrayToDevice(m_dInvMass, m_hInvMass, (m_numObj + 1) * sizeof(float)); + m_copyMassDataToGPU = false; + } +#endif //BT_USE_CUDA + +} + + + +void btGpuDemoDynamicsWorld::setConstraintData(btCudaPartProps& partProps) +{ + BT_PROFILE("set constraint data"); + partProps.m_mass = 1.0f; + partProps.m_diameter = m_objRad * 2.0f; + partProps.m_restCoeff = 1.0f; +#ifdef BT_USE_CUDA + btCuda_clearAccumulationOfLambdaDt(m_dLambdaDtBox, m_totalNumConstraints, m_maxVtxPerObj * 2); + if(!m_useBulletNarrowphase) + { + btCuda_setConstraintData(m_dIds, m_totalNumConstraints - m_numNonContactConstraints, m_numObj + 1, m_dcPos, m_dcRot, m_dShapeBuffer, m_dShapeIds, + partProps, m_dContact); + } +#endif //BT_USE_CUDA + +} + + + +void btGpuDemoDynamicsWorld::copyDataFromGPU() +{ + BT_PROFILE("copy velocity data from device"); +#ifdef BT_USE_CUDA + btCuda_copyArrayFromDevice(m_hVel, m_dcVel, (m_numObj + 1) * sizeof(float4)); + btCuda_copyArrayFromDevice(m_hAngVel, m_dcAngVel, (m_numObj + 1) * sizeof(float)); +#endif //BT_USE_CUDA +} + + + +void btGpuDemoDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo) +{ + if(m_useCPUSolver) + { + solveConstraintsCPU2(solverInfo); + } + else + { + solveConstraints2(solverInfo); + } + m_totalNumConstraints = 0; +} + + + +void btGpuDemoDynamicsWorld::solveConstraints2(btContactSolverInfo& solverInfo) +{ +#ifdef BT_USE_CUDA + BT_PROFILE("solveConstraints"); + grabData(); + createBatches2(); + copyDataToGPU(); + + btCudaPartProps partProps; + setConstraintData(partProps); + + btCudaBoxProps boxProps; + boxProps.minX = m_worldMin[0]; + boxProps.maxX = m_worldMax[0]; + boxProps.minY = m_worldMin[1]; + boxProps.maxY = m_worldMax[1]; + { + BT_PROFILE("btCuda_collisionBatchResolutionBox"); + + int nIter=getSolverInfo().m_numIterations; + btDispatcherInfo& dispatchInfo = getDispatchInfo(); + btScalar timeStep = dispatchInfo.m_timeStep; + + for(int i=0;i 0) && (idB > 0)) + { + btCollisionObject* colObjA = m_collisionObjects[idA]; + btCollisionObject* colObjB = m_collisionObjects[idB]; + btVector3 vA = colObjA->getWorldTransform().getOrigin(); + btVector3 vB = colObjB->getWorldTransform().getOrigin(); + glVertex3f(vA[0], vA[1], vA[2]); + glVertex3f(vB[0], vB[1], vB[2]); + } + } + pBatchIds += numConstraints; + glEnd(); + } +} + + + +void btGpuDemoDynamicsWorld::initShapeBuffer(int maxShapeBufferSize) +{ + m_maxShapeBufferSize = maxShapeBufferSize; + m_firstFreeShapeBufferOffset = 0; + m_hShapeBuffer = new char[m_maxShapeBufferSize]; + m_hShapeIds = new int2[m_maxObjs]; + +#ifdef BT_USE_CUDA + btCuda_allocateArray((void**)&m_dShapeBuffer, m_maxShapeBufferSize); + btCuda_allocateArray((void**)&m_dShapeIds, sizeof(int) * 2 * m_maxObjs); +#endif //BT_USE_CUDA + + m_copyShapeDataToGPU = true; +} + + + +void btGpuDemoDynamicsWorld::freeShapeBuffer() +{ + delete [] m_hShapeBuffer; + delete [] m_hShapeIds; +#ifdef BT_USE_CUDA + btCuda_freeArray(m_dShapeBuffer); + btCuda_freeArray(m_dShapeIds); +#endif //BT_USE_CUDA +} + + + +void btGpuDemoDynamicsWorld::addSphere(btVector3& pos, btScalar rad) +{ + btVector3* pBuf = (btVector3*)(m_hShapeBuffer + m_firstFreeShapeBufferOffset); + *pBuf = pos; + pBuf->setW(rad); + m_firstFreeShapeBufferOffset += sizeof(btVector3); +} + + + +void btGpuDemoDynamicsWorld::addMultiShereObject(int numSpheres, int objIndex) +{ + m_hShapeIds[objIndex].x = m_firstFreeShapeBufferOffset; + m_hShapeIds[objIndex].y = numSpheres; + return; +} + + diff --git a/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.h b/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.h index 88a77d1c8..bc820c4a1 100644 --- a/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.h +++ b/Demos/Gpu2dDemo/btGpuDemoDynamicsWorld.h @@ -1,291 +1,291 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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_CUDA_DEMO_DYNAMICS_WORLD_H -#define BT_CUDA_DEMO_DYNAMICS_WORLD_H - - - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" -#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" - - -//#define BT_USE_CUDA 1 -// To enable CUDA : -// 1. Uncomment //#define BT_USE_CUDA 1 -// 2. Build and add libbulletcuda (Extras/CUDA) to project -// 3. Add $(CUDA_LIB_PATH) and cudart.lib to linker properties - -#ifdef BT_USE_CUDA -// #include "btCudaDemoPairCache.h" -// #include - #include "BulletMultiThreaded/btGpuDefines.h" - #undef BT_GPU_PREF - #define BT_GPU_PREF(func) btCuda_##func - #include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#else - #include "BulletMultiThreaded/btGpuDefines.h" - #include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#endif - -#undef BT_GPU_PREF - - -#include "btGpuDemo2dSharedTypes.h" - - - -#define CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES 20 - -#define CUDA_DEMO_DYNAMICS_WORLD_MAX_OBJS 1024 -#define CUDA_DEMO_DYNAMICS_WORLD_MAX_NEIGHBORS 24 - -#define CUDA_DEMO_DYNAMICS_WORLD_MAX_SPHERES_PER_OBJ 8 - -class btGpuDemoDynamicsWorld; - -extern btGpuDemoDynamicsWorld* gpCudaDemoDynamicsWorld; // to access world members from pair cache - -class btGpuDemoDynamicsWorld : public btDiscreteDynamicsWorld -{ -protected: - int m_maxObjs; - int m_maxNeighbors; - - int m_numObj; - int m_numSimStep; - bool m_useCPUSolver; - bool m_useBulletNarrowphase; - - float4* m_hPos; - float* m_hRot; - float4* m_hVel; - float* m_hAngVel; - - float* m_hInvMass; - float* m_dInvMass; - bool m_copyMassDataToGPU; - -#ifdef BT_USE_CUDA - float4* m_dPos; - float* m_dRot; - float4* m_dVel; - float* m_dAngVel; - float4* m_dpPos; - float* m_dpRot; - float4* m_dpVel; - float* m_dpAngVel; - - float4* m_dcPos; - float* m_dcRot; - float4* m_dcVel; - float* m_dcAngVel; -#endif //BT_USE_CUDA - - - btOverlappingPairCache* m_pairCache; - int* m_hConstraintBuffer; - int* m_hConstraintCounter; - int m_maxBatches; - int m_numBatches; - int m_totalNumConstraints; - int2* m_hIds; - int* m_hBatchIds; - - int m_maxVtxPerObj; - - int2* m_dIds; - int* m_dBatchIds; - - float* m_dLambdaDtBox; - float4* m_dContact; // 8 floats : pos.x, pos.y, pos.z, penetration, norm.x, norm.y, norm.z, reserved - - // ------------- these are only needed for CPU version and for debugging - float* m_hLambdaDtBox; - float4* m_hContact; // 8 floats : pos.x, pos.y, pos.z, penetration, norm.x, norm.y, norm.z, reserved - // ------------- - - btScalar m_objRad; - btVector3 m_worldMin; - btVector3 m_worldMax; - - - int* m_hConstraintUsed; - - - // shape buffer - int m_maxShapeBufferSize; - int m_firstFreeShapeBufferOffset; - char* m_hShapeBuffer; // (pos.x, pos.y, pos.z, radius) - char* m_dShapeBuffer;//pointer in device memory - int2* m_hShapeIds; - int2* m_dShapeIds; - bool m_copyShapeDataToGPU; - void initShapeBuffer(int maxShapeBufferSize); - void freeShapeBuffer(); - void sendShapeDataToGpu(); - - - int m_numNonContactConstraints; - void grabNonContactConstraintData(); - void grabP2PConstraintData(btPoint2PointConstraint* ct); - -public: - int m_numInBatches[CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES]; - void addSphere(btVector3& pos, btScalar rad); - void addMultiShereObject(int numSpheres, int objIndex); - - - btGpuDemoDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration, - int maxObjs = CUDA_DEMO_DYNAMICS_WORLD_MAX_OBJS, int maxNeighbors = CUDA_DEMO_DYNAMICS_WORLD_MAX_NEIGHBORS) - : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration) - { - m_maxObjs = maxObjs; - m_maxNeighbors = maxNeighbors; - m_useCPUSolver = false; - m_pairCache = pairCache->getOverlappingPairCache(); - int sz = m_maxObjs * m_maxNeighbors; - m_hConstraintBuffer = new int[sz]; - m_hConstraintCounter = new int[m_maxObjs]; - m_maxBatches = CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; - m_hIds = new int2[sz]; - m_hBatchIds = new int[sz]; - for(int i = 0; i < sz; i++) - { - m_hBatchIds[i] = -1; - } - m_hPos = new float4[m_maxObjs]; - m_hVel = new float4[m_maxObjs]; - m_hRot = new float[m_maxObjs]; - m_hAngVel = new float[m_maxObjs]; - - m_hInvMass = new float[m_maxObjs]; - - m_maxVtxPerObj = 8; - -#ifdef BT_USE_CUDA - btCuda_allocateArray((void**)&m_dPos, sizeof(float4) * m_maxObjs); - btCuda_allocateArray((void**)&m_dRot, sizeof(float) * m_maxObjs); - btCuda_allocateArray((void**)&m_dVel, sizeof(float4) * m_maxObjs); - btCuda_allocateArray((void**)&m_dAngVel, sizeof(float) * m_maxObjs); - btCuda_allocateArray((void**)&m_dpPos, sizeof(float4) * m_maxObjs); - btCuda_allocateArray((void**)&m_dpRot, sizeof(float) * m_maxObjs); - btCuda_allocateArray((void**)&m_dpVel, sizeof(float4) * m_maxObjs); - btCuda_allocateArray((void**)&m_dpAngVel, sizeof(float) * m_maxObjs); - - btCuda_allocateArray((void**)&m_dInvMass, sizeof(float) * m_maxObjs); - - btCuda_allocateArray((void**)&m_dIds, sizeof(int2) * sz); - btCuda_allocateArray((void**)&m_dBatchIds, sizeof(int) * sz); - - btCuda_allocateArray((void**)&m_dLambdaDtBox, sizeof(float) * sz * m_maxVtxPerObj); - btCuda_allocateArray((void**)&m_dContact, sizeof(float) * sz * m_maxVtxPerObj * 8); -// btCuda_allocateArray((void**)&m_dPositionConstraint, sizeof(float) * sz * m_maxVtxPerObj * 2); -// btCuda_allocateArray((void**)&m_dNormal, sizeof(float3) * sz * m_maxVtxPerObj * 2); -#endif //BT_USE_CUDA - - - m_hLambdaDtBox = new float[sz * m_maxVtxPerObj]; - m_hContact = new float4[sz * m_maxVtxPerObj * 2]; -// m_hPositionConstraint = new float[sz * m_maxVtxPerObj * 2]; -// m_hNormal = new float3[sz * m_maxVtxPerObj * 2]; - - m_numSimStep = 0; - - m_objRad = 1.0f; - - m_hConstraintUsed = new int[sz]; - - - gpCudaDemoDynamicsWorld = this; - m_totalNumConstraints = 0; - - initShapeBuffer(m_maxObjs * CUDA_DEMO_DYNAMICS_WORLD_MAX_SPHERES_PER_OBJ * sizeof(float) * 4); - - m_copyMassDataToGPU = true; - - } - virtual ~btGpuDemoDynamicsWorld() - { - delete [] m_hConstraintBuffer; - delete [] m_hConstraintCounter; - delete [] m_hIds; - delete [] m_hBatchIds; - delete [] m_hPos; - delete [] m_hRot; - delete [] m_hVel; - delete [] m_hAngVel; - delete [] m_hInvMass; -#ifdef BT_USE_CUDA - btCuda_freeArray(m_dPos); - btCuda_freeArray(m_dRot); - btCuda_freeArray(m_dVel); - btCuda_freeArray(m_dAngVel); - btCuda_freeArray(m_dpPos); - btCuda_freeArray(m_dpRot); - btCuda_freeArray(m_dpVel); - btCuda_freeArray(m_dpAngVel); - btCuda_freeArray(m_dInvMass); - - btCuda_freeArray(m_dIds); - btCuda_freeArray(m_dBatchIds); - btCuda_freeArray(m_dLambdaDtBox); - btCuda_freeArray(m_dContact); -#endif //BT_USE_CUDA - - delete [] m_hLambdaDtBox; - delete [] m_hContact; - delete [] m_hConstraintUsed; - - gpCudaDemoDynamicsWorld = NULL; - - freeShapeBuffer(); - } - - virtual void calculateSimulationIslands() - { - } - virtual void solveConstraints(btContactSolverInfo& solverInfo); - void solveConstraints2(btContactSolverInfo& solverInfo); - void solveConstraintsCPU2(btContactSolverInfo& solverInfo); - - void debugDrawConstraints(int selectedBatch, const float* pColorTab); - - void setObjRad(btScalar rad) { m_objRad = rad; } - void setWorldMin(const btVector3& worldMin) { m_worldMin = worldMin; } - void setWorldMax(const btVector3& worldMax) { m_worldMax = worldMax; } - - void grabData(); - void grabContactData(); - void copyDataToGPU(); - void setConstraintData(btCudaPartProps& partProps); - void copyDataFromGPU(); - void writebackData(); - void setUseCPUSolver(bool useCPU) { m_useCPUSolver = useCPU; } - void setUseBulletNarrowphase(bool useBulletNarrowphase) {m_useBulletNarrowphase = useBulletNarrowphase; } - - void createBatches2(); - - int2* getIdsPtr() { return m_hIds; } - void setTotalNumConstraints(int totalNumConstraints) { m_totalNumConstraints = totalNumConstraints; } - int getTotalNumConstraints() { return m_totalNumConstraints; } - -}; - - -#endif //BT_CUDA_DEMO_DYNAMICS_WORLD_H +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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_CUDA_DEMO_DYNAMICS_WORLD_H +#define BT_CUDA_DEMO_DYNAMICS_WORLD_H + + + +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" +#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" +#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" + + +//#define BT_USE_CUDA 1 +// To enable CUDA : +// 1. Uncomment //#define BT_USE_CUDA 1 +// 2. Build and add libbulletcuda (Extras/CUDA) to project +// 3. Add $(CUDA_LIB_PATH) and cudart.lib to linker properties + +#ifdef BT_USE_CUDA +// #include "btCudaDemoPairCache.h" +// #include + #include "BulletMultiThreaded/btGpuDefines.h" + #undef BT_GPU_PREF + #define BT_GPU_PREF(func) btCuda_##func + #include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#else + #include "BulletMultiThreaded/btGpuDefines.h" + #include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#endif + +#undef BT_GPU_PREF + + +#include "btGpuDemo2dSharedTypes.h" + + + +#define CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES 20 + +#define CUDA_DEMO_DYNAMICS_WORLD_MAX_OBJS 1024 +#define CUDA_DEMO_DYNAMICS_WORLD_MAX_NEIGHBORS 24 + +#define CUDA_DEMO_DYNAMICS_WORLD_MAX_SPHERES_PER_OBJ 8 + +class btGpuDemoDynamicsWorld; + +extern btGpuDemoDynamicsWorld* gpCudaDemoDynamicsWorld; // to access world members from pair cache + +class btGpuDemoDynamicsWorld : public btDiscreteDynamicsWorld +{ +protected: + int m_maxObjs; + int m_maxNeighbors; + + int m_numObj; + int m_numSimStep; + bool m_useCPUSolver; + bool m_useBulletNarrowphase; + + float4* m_hPos; + float* m_hRot; + float4* m_hVel; + float* m_hAngVel; + + float* m_hInvMass; + float* m_dInvMass; + bool m_copyMassDataToGPU; + +#ifdef BT_USE_CUDA + float4* m_dPos; + float* m_dRot; + float4* m_dVel; + float* m_dAngVel; + float4* m_dpPos; + float* m_dpRot; + float4* m_dpVel; + float* m_dpAngVel; + + float4* m_dcPos; + float* m_dcRot; + float4* m_dcVel; + float* m_dcAngVel; +#endif //BT_USE_CUDA + + + btOverlappingPairCache* m_pairCache; + int* m_hConstraintBuffer; + int* m_hConstraintCounter; + int m_maxBatches; + int m_numBatches; + int m_totalNumConstraints; + int2* m_hIds; + int* m_hBatchIds; + + int m_maxVtxPerObj; + + int2* m_dIds; + int* m_dBatchIds; + + float* m_dLambdaDtBox; + float4* m_dContact; // 8 floats : pos.x, pos.y, pos.z, penetration, norm.x, norm.y, norm.z, reserved + + // ------------- these are only needed for CPU version and for debugging + float* m_hLambdaDtBox; + float4* m_hContact; // 8 floats : pos.x, pos.y, pos.z, penetration, norm.x, norm.y, norm.z, reserved + // ------------- + + btScalar m_objRad; + btVector3 m_worldMin; + btVector3 m_worldMax; + + + int* m_hConstraintUsed; + + + // shape buffer + int m_maxShapeBufferSize; + int m_firstFreeShapeBufferOffset; + char* m_hShapeBuffer; // (pos.x, pos.y, pos.z, radius) + char* m_dShapeBuffer;//pointer in device memory + int2* m_hShapeIds; + int2* m_dShapeIds; + bool m_copyShapeDataToGPU; + void initShapeBuffer(int maxShapeBufferSize); + void freeShapeBuffer(); + void sendShapeDataToGpu(); + + + int m_numNonContactConstraints; + void grabNonContactConstraintData(); + void grabP2PConstraintData(btPoint2PointConstraint* ct); + +public: + int m_numInBatches[CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES]; + void addSphere(btVector3& pos, btScalar rad); + void addMultiShereObject(int numSpheres, int objIndex); + + + btGpuDemoDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration, + int maxObjs = CUDA_DEMO_DYNAMICS_WORLD_MAX_OBJS, int maxNeighbors = CUDA_DEMO_DYNAMICS_WORLD_MAX_NEIGHBORS) + : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration) + { + m_maxObjs = maxObjs; + m_maxNeighbors = maxNeighbors; + m_useCPUSolver = false; + m_pairCache = pairCache->getOverlappingPairCache(); + int sz = m_maxObjs * m_maxNeighbors; + m_hConstraintBuffer = new int[sz]; + m_hConstraintCounter = new int[m_maxObjs]; + m_maxBatches = CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; + m_hIds = new int2[sz]; + m_hBatchIds = new int[sz]; + for(int i = 0; i < sz; i++) + { + m_hBatchIds[i] = -1; + } + m_hPos = new float4[m_maxObjs]; + m_hVel = new float4[m_maxObjs]; + m_hRot = new float[m_maxObjs]; + m_hAngVel = new float[m_maxObjs]; + + m_hInvMass = new float[m_maxObjs]; + + m_maxVtxPerObj = 8; + +#ifdef BT_USE_CUDA + btCuda_allocateArray((void**)&m_dPos, sizeof(float4) * m_maxObjs); + btCuda_allocateArray((void**)&m_dRot, sizeof(float) * m_maxObjs); + btCuda_allocateArray((void**)&m_dVel, sizeof(float4) * m_maxObjs); + btCuda_allocateArray((void**)&m_dAngVel, sizeof(float) * m_maxObjs); + btCuda_allocateArray((void**)&m_dpPos, sizeof(float4) * m_maxObjs); + btCuda_allocateArray((void**)&m_dpRot, sizeof(float) * m_maxObjs); + btCuda_allocateArray((void**)&m_dpVel, sizeof(float4) * m_maxObjs); + btCuda_allocateArray((void**)&m_dpAngVel, sizeof(float) * m_maxObjs); + + btCuda_allocateArray((void**)&m_dInvMass, sizeof(float) * m_maxObjs); + + btCuda_allocateArray((void**)&m_dIds, sizeof(int2) * sz); + btCuda_allocateArray((void**)&m_dBatchIds, sizeof(int) * sz); + + btCuda_allocateArray((void**)&m_dLambdaDtBox, sizeof(float) * sz * m_maxVtxPerObj); + btCuda_allocateArray((void**)&m_dContact, sizeof(float) * sz * m_maxVtxPerObj * 8); +// btCuda_allocateArray((void**)&m_dPositionConstraint, sizeof(float) * sz * m_maxVtxPerObj * 2); +// btCuda_allocateArray((void**)&m_dNormal, sizeof(float3) * sz * m_maxVtxPerObj * 2); +#endif //BT_USE_CUDA + + + m_hLambdaDtBox = new float[sz * m_maxVtxPerObj]; + m_hContact = new float4[sz * m_maxVtxPerObj * 2]; +// m_hPositionConstraint = new float[sz * m_maxVtxPerObj * 2]; +// m_hNormal = new float3[sz * m_maxVtxPerObj * 2]; + + m_numSimStep = 0; + + m_objRad = 1.0f; + + m_hConstraintUsed = new int[sz]; + + + gpCudaDemoDynamicsWorld = this; + m_totalNumConstraints = 0; + + initShapeBuffer(m_maxObjs * CUDA_DEMO_DYNAMICS_WORLD_MAX_SPHERES_PER_OBJ * sizeof(float) * 4); + + m_copyMassDataToGPU = true; + + } + virtual ~btGpuDemoDynamicsWorld() + { + delete [] m_hConstraintBuffer; + delete [] m_hConstraintCounter; + delete [] m_hIds; + delete [] m_hBatchIds; + delete [] m_hPos; + delete [] m_hRot; + delete [] m_hVel; + delete [] m_hAngVel; + delete [] m_hInvMass; +#ifdef BT_USE_CUDA + btCuda_freeArray(m_dPos); + btCuda_freeArray(m_dRot); + btCuda_freeArray(m_dVel); + btCuda_freeArray(m_dAngVel); + btCuda_freeArray(m_dpPos); + btCuda_freeArray(m_dpRot); + btCuda_freeArray(m_dpVel); + btCuda_freeArray(m_dpAngVel); + btCuda_freeArray(m_dInvMass); + + btCuda_freeArray(m_dIds); + btCuda_freeArray(m_dBatchIds); + btCuda_freeArray(m_dLambdaDtBox); + btCuda_freeArray(m_dContact); +#endif //BT_USE_CUDA + + delete [] m_hLambdaDtBox; + delete [] m_hContact; + delete [] m_hConstraintUsed; + + gpCudaDemoDynamicsWorld = NULL; + + freeShapeBuffer(); + } + + virtual void calculateSimulationIslands() + { + } + virtual void solveConstraints(btContactSolverInfo& solverInfo); + void solveConstraints2(btContactSolverInfo& solverInfo); + void solveConstraintsCPU2(btContactSolverInfo& solverInfo); + + void debugDrawConstraints(int selectedBatch, const float* pColorTab); + + void setObjRad(btScalar rad) { m_objRad = rad; } + void setWorldMin(const btVector3& worldMin) { m_worldMin = worldMin; } + void setWorldMax(const btVector3& worldMax) { m_worldMax = worldMax; } + + void grabData(); + void grabContactData(); + void copyDataToGPU(); + void setConstraintData(btCudaPartProps& partProps); + void copyDataFromGPU(); + void writebackData(); + void setUseCPUSolver(bool useCPU) { m_useCPUSolver = useCPU; } + void setUseBulletNarrowphase(bool useBulletNarrowphase) {m_useBulletNarrowphase = useBulletNarrowphase; } + + void createBatches2(); + + int2* getIdsPtr() { return m_hIds; } + void setTotalNumConstraints(int totalNumConstraints) { m_totalNumConstraints = totalNumConstraints; } + int getTotalNumConstraints() { return m_totalNumConstraints; } + +}; + + +#endif //BT_CUDA_DEMO_DYNAMICS_WORLD_H diff --git a/Demos/Gpu2dDemo/btGpuDemoPairCache.cpp b/Demos/Gpu2dDemo/btGpuDemoPairCache.cpp index c258be484..3fa0fa1a4 100644 --- a/Demos/Gpu2dDemo/btGpuDemoPairCache.cpp +++ b/Demos/Gpu2dDemo/btGpuDemoPairCache.cpp @@ -1,76 +1,76 @@ -/* -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 "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" - -#include "btGpuDemoPairCache.h" - -#include "btGpuDemoDynamicsWorld.h" - - - -void btGpuDemoPairCache::processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher) -{ - int sz = m_maxProxies * m_maxNeighbors; - int numContConstraints = 0; - int2* pIds = gpCudaDemoDynamicsWorld->getIdsPtr(); - for(int idx = 0; idx < sz; idx++) - { - int neigh = m_hNeighbors[idx]; - if(neigh >= 0) - { - int i=idx / m_maxNeighbors; - int j=idx % m_maxNeighbors; - pIds[numContConstraints].x = i; - pIds[numContConstraints].y = m_hNeighbors[i * m_maxNeighbors + j]; - numContConstraints++; - } - } - gpCudaDemoDynamicsWorld->setTotalNumConstraints(numContConstraints); -} - - - -// this will be called for each overlapping pair if collision detection uses pairCache other than btGpuDemoPairCache -// IMPORTANT : m_numConstraints in gpCudaDemoDynamicsWorld is set to 0 at start of simulation step -// IMPORTANT : companionIds for all objects should be properly set at start of simulation step -void cudaDemoNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) -{ - btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject; - btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject; - if (dispatcher.needsCollision(colObj0,colObj1)) - { - // int id0 = collisionPair.m_pProxy0->m_uniqueId - 2; - // int id1 = collisionPair.m_pProxy1->m_uniqueId - 2; - // cannot use m_uniqueId : it may be altered by broadphase code - // so we'll use companionIds set on the initialization stage - unsigned int id0 = colObj0->getCompanionId(); - unsigned int id1 = colObj1->getCompanionId(); - if(id0 > id1) - { - int tmp = id0; id0 = id1; id1 = tmp; - } - int totalNumConstraints = gpCudaDemoDynamicsWorld->getTotalNumConstraints(); - int2* pIds = gpCudaDemoDynamicsWorld->getIdsPtr(); - pIds += totalNumConstraints; - pIds->x = id0; - pIds->y = id1; - totalNumConstraints++; - gpCudaDemoDynamicsWorld->setTotalNumConstraints(totalNumConstraints); - } -} // cudaDemoNearCallback() - +/* +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 "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" + +#include "btGpuDemoPairCache.h" + +#include "btGpuDemoDynamicsWorld.h" + + + +void btGpuDemoPairCache::processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher) +{ + int sz = m_maxProxies * m_maxNeighbors; + int numContConstraints = 0; + int2* pIds = gpCudaDemoDynamicsWorld->getIdsPtr(); + for(int idx = 0; idx < sz; idx++) + { + int neigh = m_hNeighbors[idx]; + if(neigh >= 0) + { + int i=idx / m_maxNeighbors; + int j=idx % m_maxNeighbors; + pIds[numContConstraints].x = i; + pIds[numContConstraints].y = m_hNeighbors[i * m_maxNeighbors + j]; + numContConstraints++; + } + } + gpCudaDemoDynamicsWorld->setTotalNumConstraints(numContConstraints); +} + + + +// this will be called for each overlapping pair if collision detection uses pairCache other than btGpuDemoPairCache +// IMPORTANT : m_numConstraints in gpCudaDemoDynamicsWorld is set to 0 at start of simulation step +// IMPORTANT : companionIds for all objects should be properly set at start of simulation step +void cudaDemoNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) +{ + btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject; + btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject; + if (dispatcher.needsCollision(colObj0,colObj1)) + { + // int id0 = collisionPair.m_pProxy0->m_uniqueId - 2; + // int id1 = collisionPair.m_pProxy1->m_uniqueId - 2; + // cannot use m_uniqueId : it may be altered by broadphase code + // so we'll use companionIds set on the initialization stage + unsigned int id0 = colObj0->getCompanionId(); + unsigned int id1 = colObj1->getCompanionId(); + if(id0 > id1) + { + int tmp = id0; id0 = id1; id1 = tmp; + } + int totalNumConstraints = gpCudaDemoDynamicsWorld->getTotalNumConstraints(); + int2* pIds = gpCudaDemoDynamicsWorld->getIdsPtr(); + pIds += totalNumConstraints; + pIds->x = id0; + pIds->y = id1; + totalNumConstraints++; + gpCudaDemoDynamicsWorld->setTotalNumConstraints(totalNumConstraints); + } +} // cudaDemoNearCallback() + diff --git a/Demos/Gpu2dDemo/btGpuDemoPairCache.h b/Demos/Gpu2dDemo/btGpuDemoPairCache.h index 85c802b66..6b9503b91 100644 --- a/Demos/Gpu2dDemo/btGpuDemoPairCache.h +++ b/Demos/Gpu2dDemo/btGpuDemoPairCache.h @@ -1,136 +1,136 @@ -/* -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 CUDA_DEMO_PAIR_CACHE_H -#define CUDA_DEMO_PAIR_CACHE_H - - -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btGpuDemoPairCache : public btNullPairCache -{ -public: - int m_maxProxies; - int m_maxNeighbors; - int* m_hNeighbors; - int m_numPairs; - int m_numSmallProxies; - int m_maxSmallProxies; - - btGpuDemoPairCache(int maxProxies, int maxNeighbors, int maxSmallProxies) - { - m_maxProxies = maxProxies; - m_maxNeighbors = maxNeighbors; - m_maxSmallProxies = maxSmallProxies; - int sz = maxProxies * maxNeighbors; - m_hNeighbors = new int [sz]; - reset(); - } - - ~btGpuDemoPairCache() - { - delete [] m_hNeighbors; - } - - void reset(void) - { - int sz = m_maxProxies * m_maxNeighbors; - for(int i = 0; i < sz; i++) - { - m_hNeighbors[i] = -1; - } - m_numPairs = 0; - } - - virtual int getNumOverlappingPairs() const - { - return m_numPairs; - //return 0; // to skip btSimulationIslandManager::findUnions() - } - - virtual void processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher); - - virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) - { - int id0 = proxy0->m_uniqueId - 2; - int id1 = proxy1->m_uniqueId - 2; - if(id0 >= m_maxSmallProxies) - { - id0 -= m_maxSmallProxies - m_numSmallProxies; - } - if(id1 >= m_maxSmallProxies) - { - id1 -= m_maxSmallProxies - m_numSmallProxies; - } - if(id0 > id1) - { - int tmp = id0; id0 = id1; id1 = tmp; - } - int offs = id0 * m_maxNeighbors; - int i; - for(i = 0; i < m_maxNeighbors; i++) - { - if(m_hNeighbors[offs + i] < 0) - { - m_hNeighbors[offs + i] = id1; - m_numPairs++; - break; - } - } - // btAssert(i < m_maxNeighbors); - return 0; - } - - virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1,btDispatcher* /*dispatcher*/) - { - int id0 = proxy0->m_uniqueId - 2; - int id1 = proxy1->m_uniqueId - 2; - if(id0 >= m_maxSmallProxies) - { - id0 -= m_maxSmallProxies - m_numSmallProxies; - } - if(id1 >= m_maxSmallProxies) - { - id1 -= m_maxSmallProxies - m_numSmallProxies; - } - if(id0 > id1) - { - int tmp = id0; id0 = id1; id1 = tmp; - } - int offs = id0 * m_maxNeighbors; - int i; - for(i = 0; i < m_maxNeighbors; i++) - { - if(m_hNeighbors[offs + i] == id1) - { - m_hNeighbors[offs + i] = -1; - m_numPairs--; - break; - } - } -// btAssert(i < m_maxNeighbors); - return 0; - } -}; - -extern void cudaDemoNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo); - -#endif //CUDA_DEMO_PAIR_CACHE_H - - +/* +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 CUDA_DEMO_PAIR_CACHE_H +#define CUDA_DEMO_PAIR_CACHE_H + + +#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h" +#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btGpuDemoPairCache : public btNullPairCache +{ +public: + int m_maxProxies; + int m_maxNeighbors; + int* m_hNeighbors; + int m_numPairs; + int m_numSmallProxies; + int m_maxSmallProxies; + + btGpuDemoPairCache(int maxProxies, int maxNeighbors, int maxSmallProxies) + { + m_maxProxies = maxProxies; + m_maxNeighbors = maxNeighbors; + m_maxSmallProxies = maxSmallProxies; + int sz = maxProxies * maxNeighbors; + m_hNeighbors = new int [sz]; + reset(); + } + + ~btGpuDemoPairCache() + { + delete [] m_hNeighbors; + } + + void reset(void) + { + int sz = m_maxProxies * m_maxNeighbors; + for(int i = 0; i < sz; i++) + { + m_hNeighbors[i] = -1; + } + m_numPairs = 0; + } + + virtual int getNumOverlappingPairs() const + { + return m_numPairs; + //return 0; // to skip btSimulationIslandManager::findUnions() + } + + virtual void processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher); + + virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) + { + int id0 = proxy0->m_uniqueId - 2; + int id1 = proxy1->m_uniqueId - 2; + if(id0 >= m_maxSmallProxies) + { + id0 -= m_maxSmallProxies - m_numSmallProxies; + } + if(id1 >= m_maxSmallProxies) + { + id1 -= m_maxSmallProxies - m_numSmallProxies; + } + if(id0 > id1) + { + int tmp = id0; id0 = id1; id1 = tmp; + } + int offs = id0 * m_maxNeighbors; + int i; + for(i = 0; i < m_maxNeighbors; i++) + { + if(m_hNeighbors[offs + i] < 0) + { + m_hNeighbors[offs + i] = id1; + m_numPairs++; + break; + } + } + // btAssert(i < m_maxNeighbors); + return 0; + } + + virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1,btDispatcher* /*dispatcher*/) + { + int id0 = proxy0->m_uniqueId - 2; + int id1 = proxy1->m_uniqueId - 2; + if(id0 >= m_maxSmallProxies) + { + id0 -= m_maxSmallProxies - m_numSmallProxies; + } + if(id1 >= m_maxSmallProxies) + { + id1 -= m_maxSmallProxies - m_numSmallProxies; + } + if(id0 > id1) + { + int tmp = id0; id0 = id1; id1 = tmp; + } + int offs = id0 * m_maxNeighbors; + int i; + for(i = 0; i < m_maxNeighbors; i++) + { + if(m_hNeighbors[offs + i] == id1) + { + m_hNeighbors[offs + i] = -1; + m_numPairs--; + break; + } + } +// btAssert(i < m_maxNeighbors); + return 0; + } +}; + +extern void cudaDemoNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo); + +#endif //CUDA_DEMO_PAIR_CACHE_H + + diff --git a/Demos/Gpu2dDemo/main.cpp b/Demos/Gpu2dDemo/main.cpp index 64abb0cae..70f8a9020 100644 --- a/Demos/Gpu2dDemo/main.cpp +++ b/Demos/Gpu2dDemo/main.cpp @@ -1,62 +1,62 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 "BasicDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" - -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btHashMap.h" - -class OurValue - { - int m_uid; - - public: - OurValue(const btVector3& initialPos) - :m_position(initialPos) - { - static int gUid=0; - m_uid=gUid; - gUid++; - } - - btVector3 m_position; - int getUid() const - { - return m_uid; - } - }; - -GLDebugDrawer gDebugDrawer; - -int main(int argc,char** argv) -{ - - - BasicDemo ccdDemo; - ccdDemo.initPhysics(); - ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - - -#ifdef CHECK_MEMORY_LEAKS - ccdDemo.exitPhysics(); -#else - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); -#endif - - //default glut doesn't return from mainloop - return 0; +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 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 "BasicDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" + +class OurValue + { + int m_uid; + + public: + OurValue(const btVector3& initialPos) + :m_position(initialPos) + { + static int gUid=0; + m_uid=gUid; + gUid++; + } + + btVector3 m_position; + int getUid() const + { + return m_uid; + } + }; + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + + BasicDemo ccdDemo; + ccdDemo.initPhysics(); + ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + +#ifdef CHECK_MEMORY_LEAKS + ccdDemo.exitPhysics(); +#else + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); +#endif + + //default glut doesn't return from mainloop + return 0; } \ No newline at end of file diff --git a/Demos/Gpu2dDemo/oecakeLoader.cpp b/Demos/Gpu2dDemo/oecakeLoader.cpp index ffcec6ddd..3158dea7f 100644 --- a/Demos/Gpu2dDemo/oecakeLoader.cpp +++ b/Demos/Gpu2dDemo/oecakeLoader.cpp @@ -1,264 +1,264 @@ -#include "oecakeLoader.h" -#include //printf debugging -#include - - - - -btCompoundShape* shiftTransform(btCompoundShape* boxCompound,btScalar mass,btTransform& shift) -{ - btTransform principal; - btVector3 principalInertia; - btScalar* masses = new btScalar[boxCompound->getNumChildShapes()]; - for (int j=0;jgetNumChildShapes();j++) - { - //evenly distribute mass - masses[j]=mass/boxCompound->getNumChildShapes(); - } - - - boxCompound->calculatePrincipalAxisTransform(masses,principal,principalInertia); - - - ///create a new compound with world transform/center of mass properly aligned with the principal axis - - ///non-recursive compound shapes perform better - //#define USE_RECURSIVE_COMPOUND 1 -#ifdef USE_RECURSIVE_COMPOUND - - btCompoundShape* newCompound = new btCompoundShape(); - newCompound->addChildShape(principal.inverse(),boxCompound); - m_collisionShapes.push_back(newCompound); - - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,newCompound,principalInertia); - -#else -#ifdef CHANGE_COMPOUND_INPLACE - for (int i=0;igetNumChildShapes();i++) - { - btTransform newChildTransform = principal.inverse()*boxCompound->getChildTransform(i); - ///updateChildTransform is really slow, because it re-calculates the AABB each time. todo: add option to disable this update - boxCompound->updateChildTransform(i,newChildTransform); - } - if (isDynamic) - boxCompound->calculateLocalInertia(mass,localInertia); - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,boxCompound,localInertia); -#else - ///creation is faster using a new compound to store the shifted children - btCompoundShape* newBoxCompound = new btCompoundShape(); - for (int i=0;igetNumChildShapes();i++) - { - btTransform newChildTransform = principal.inverse()*boxCompound->getChildTransform(i); - ///updateChildTransform is really slow, because it re-calculates the AABB each time. todo: add option to disable this update - newBoxCompound->addChildShape(newChildTransform,boxCompound->getChildShape(i)); - } - - - -#endif - -#endif//USE_RECURSIVE_COMPOUND - - shift = principal; - return newBoxCompound; -} - - -void BasicOECakeReader::addParticle(int materialType, int pIndex, int pColor, float pPosX, float pPosY,float radius) -{ - //determine that we have a new shape? - if (m_particlePositions.size()) - { - if ( - (materialType != m_materialType) - || - (pIndex != m_particleObjectIndex) - ) - { - convertParticleGroup(); - } - } - - - //add to array - m_materialType = materialType; - m_particleObjectIndex = pIndex; - m_particleColor = pColor; - m_particlePositions.push_back(btVector3(pPosX,pPosY,0.)); - m_particleRadii.push_back(radius); - -} - -void BasicOECakeReader::convertParticleGroup() -{ - printf("found a particle group of %d particles\n",m_particlePositions.size()); - if (m_particlePositions.size()>0) - { - addNewCollisionShape(m_particlePositions.size(),&m_particlePositions[0],&m_particleRadii[0],m_materialType,m_particleObjectIndex,m_particleColor); - m_particlePositions.clear(); - m_particleRadii.clear(); - } -} - -void BasicOECakeReader::addNewCollisionShape(int numParticles, btVector3* particlePositions, btScalar* radii, int materialType, int objectIndex,int color ) -{ - //create Bullet stuff - btCompoundShape* colShape = 0; - btScalar mass; - - bool addConstraint = false; - - - if (materialType&0x800000) - { - addConstraint = true; - } - - if ((materialType & 0x20000) ||(materialType & 0x12)) - { - mass = 1.f; - } else - { - mass = 0.f; - } - btTransform startTransform; - startTransform.setIdentity(); - - int numCurSpheres = 0; - - { - - - btTransform localTrans; - localTrans.setIdentity(); - - //static - btCompoundShape* compound = new btCompoundShape(); - - for (int i=0;iaddChildShape(localTrans,particle); - if (mass==0.f && (numCurSpheres>=7)) - { - createBodyForCompoundShape(compound,false,startTransform,mass); - compound = new btCompoundShape(); - numCurSpheres = 0; - } - } - if (mass) - { - //shift the center of mass, based on all spheres - btCompoundShape* newCompound = shiftTransform(compound,mass,startTransform); - colShape = newCompound; - } else - { - //use unmodified - colShape = compound; - } - } - - btDefaultMotionState* myMotionState = 0; - - if (colShape && numCurSpheres) - { - createBodyForCompoundShape(colShape,addConstraint,startTransform,mass); - } -} - - - -int BasicOECakeReader::processLine(char * buffer, int size) -{ - int numBytesRead = 0; - - if (buffer[0] == 'p') - { - int materialType; - int particleObjectIndex; - int particleColor; - int dummy1; - float particlePosX; - float particlePosY; - - if (sscanf (buffer, "p %x %x %x %x %f %f", &materialType,&particleObjectIndex,&dummy1, &particleColor, &particlePosX, &particlePosY) == 6) - { - addParticle(materialType,particleObjectIndex,particleColor,particlePosX,particlePosY); - } - else - { - printf("ERROR: invalid line (%s)\n", buffer); - } - } - - while (*buffer != '\n' && size != 0) - { - buffer++; - numBytesRead++; - } - - - if (buffer[0]==0x0a) - { - buffer++; - numBytesRead++; - } - - - return numBytesRead; -} - -bool BasicOECakeReader::processFile(char * fileName) -{ - FILE * fp = fopen(fileName, "rb"); - if (fp == NULL) - { - printf("ERROR: file(%s) not found", fileName); - return false; - } - - int size; - if (fseek(fp, 0, SEEK_END) || (size = ftell(fp)) == EOF || fseek(fp, 0, SEEK_SET)) - { - printf("ERROR: problem reading file(%s)", fileName); - fclose(fp); - return false; - } - else - { - rewind (fp); - char * buffer = (char *) malloc(size+1); - memset(buffer,0,size); - - if (fread(buffer,1,size,fp) != size) - { - printf("Error reading file %s!\n",fileName); - fclose(fp); - return false; - } - - int totalBytesRead = 0; - - while(totalBytesRead //printf debugging +#include + + + + +btCompoundShape* shiftTransform(btCompoundShape* boxCompound,btScalar mass,btTransform& shift) +{ + btTransform principal; + btVector3 principalInertia; + btScalar* masses = new btScalar[boxCompound->getNumChildShapes()]; + for (int j=0;jgetNumChildShapes();j++) + { + //evenly distribute mass + masses[j]=mass/boxCompound->getNumChildShapes(); + } + + + boxCompound->calculatePrincipalAxisTransform(masses,principal,principalInertia); + + + ///create a new compound with world transform/center of mass properly aligned with the principal axis + + ///non-recursive compound shapes perform better + //#define USE_RECURSIVE_COMPOUND 1 +#ifdef USE_RECURSIVE_COMPOUND + + btCompoundShape* newCompound = new btCompoundShape(); + newCompound->addChildShape(principal.inverse(),boxCompound); + m_collisionShapes.push_back(newCompound); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,newCompound,principalInertia); + +#else +#ifdef CHANGE_COMPOUND_INPLACE + for (int i=0;igetNumChildShapes();i++) + { + btTransform newChildTransform = principal.inverse()*boxCompound->getChildTransform(i); + ///updateChildTransform is really slow, because it re-calculates the AABB each time. todo: add option to disable this update + boxCompound->updateChildTransform(i,newChildTransform); + } + if (isDynamic) + boxCompound->calculateLocalInertia(mass,localInertia); + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,boxCompound,localInertia); +#else + ///creation is faster using a new compound to store the shifted children + btCompoundShape* newBoxCompound = new btCompoundShape(); + for (int i=0;igetNumChildShapes();i++) + { + btTransform newChildTransform = principal.inverse()*boxCompound->getChildTransform(i); + ///updateChildTransform is really slow, because it re-calculates the AABB each time. todo: add option to disable this update + newBoxCompound->addChildShape(newChildTransform,boxCompound->getChildShape(i)); + } + + + +#endif + +#endif//USE_RECURSIVE_COMPOUND + + shift = principal; + return newBoxCompound; +} + + +void BasicOECakeReader::addParticle(int materialType, int pIndex, int pColor, float pPosX, float pPosY,float radius) +{ + //determine that we have a new shape? + if (m_particlePositions.size()) + { + if ( + (materialType != m_materialType) + || + (pIndex != m_particleObjectIndex) + ) + { + convertParticleGroup(); + } + } + + + //add to array + m_materialType = materialType; + m_particleObjectIndex = pIndex; + m_particleColor = pColor; + m_particlePositions.push_back(btVector3(pPosX,pPosY,0.)); + m_particleRadii.push_back(radius); + +} + +void BasicOECakeReader::convertParticleGroup() +{ + printf("found a particle group of %d particles\n",m_particlePositions.size()); + if (m_particlePositions.size()>0) + { + addNewCollisionShape(m_particlePositions.size(),&m_particlePositions[0],&m_particleRadii[0],m_materialType,m_particleObjectIndex,m_particleColor); + m_particlePositions.clear(); + m_particleRadii.clear(); + } +} + +void BasicOECakeReader::addNewCollisionShape(int numParticles, btVector3* particlePositions, btScalar* radii, int materialType, int objectIndex,int color ) +{ + //create Bullet stuff + btCompoundShape* colShape = 0; + btScalar mass; + + bool addConstraint = false; + + + if (materialType&0x800000) + { + addConstraint = true; + } + + if ((materialType & 0x20000) ||(materialType & 0x12)) + { + mass = 1.f; + } else + { + mass = 0.f; + } + btTransform startTransform; + startTransform.setIdentity(); + + int numCurSpheres = 0; + + { + + + btTransform localTrans; + localTrans.setIdentity(); + + //static + btCompoundShape* compound = new btCompoundShape(); + + for (int i=0;iaddChildShape(localTrans,particle); + if (mass==0.f && (numCurSpheres>=7)) + { + createBodyForCompoundShape(compound,false,startTransform,mass); + compound = new btCompoundShape(); + numCurSpheres = 0; + } + } + if (mass) + { + //shift the center of mass, based on all spheres + btCompoundShape* newCompound = shiftTransform(compound,mass,startTransform); + colShape = newCompound; + } else + { + //use unmodified + colShape = compound; + } + } + + btDefaultMotionState* myMotionState = 0; + + if (colShape && numCurSpheres) + { + createBodyForCompoundShape(colShape,addConstraint,startTransform,mass); + } +} + + + +int BasicOECakeReader::processLine(char * buffer, int size) +{ + int numBytesRead = 0; + + if (buffer[0] == 'p') + { + int materialType; + int particleObjectIndex; + int particleColor; + int dummy1; + float particlePosX; + float particlePosY; + + if (sscanf (buffer, "p %x %x %x %x %f %f", &materialType,&particleObjectIndex,&dummy1, &particleColor, &particlePosX, &particlePosY) == 6) + { + addParticle(materialType,particleObjectIndex,particleColor,particlePosX,particlePosY); + } + else + { + printf("ERROR: invalid line (%s)\n", buffer); + } + } + + while (*buffer != '\n' && size != 0) + { + buffer++; + numBytesRead++; + } + + + if (buffer[0]==0x0a) + { + buffer++; + numBytesRead++; + } + + + return numBytesRead; +} + +bool BasicOECakeReader::processFile(char * fileName) +{ + FILE * fp = fopen(fileName, "rb"); + if (fp == NULL) + { + printf("ERROR: file(%s) not found", fileName); + return false; + } + + int size; + if (fseek(fp, 0, SEEK_END) || (size = ftell(fp)) == EOF || fseek(fp, 0, SEEK_SET)) + { + printf("ERROR: problem reading file(%s)", fileName); + fclose(fp); + return false; + } + else + { + rewind (fp); + char * buffer = (char *) malloc(size+1); + memset(buffer,0,size); + + if (fread(buffer,1,size,fp) != size) + { + printf("Error reading file %s!\n",fileName); + fclose(fp); + return false; + } + + int totalBytesRead = 0; + + while(totalBytesRead m_particlePositions; - btAlignedObjectArray m_particleRadii; - - void addParticle(int materialType, int pIndex, int pColor, float pPosX, float pPosY, float radius=1); - - virtual void addNewCollisionShape(int numParticles, btVector3* particlePositions, btScalar* radii, int materialType, int objectIndex,int color ); - - int processLine(char * buffer, int size); - - void convertParticleGroup(); - -public: - - BasicOECakeReader() - { - } - - bool processFile(char * fileName); - - virtual void createBodyForCompoundShape(btCompoundShape* compound,bool addConstraint,const btTransform& worldTransform, btScalar mass) = 0; - -}; -#endif //OE_CAKE_LOADER_H + +#ifndef OE_CAKE_LOADER_H +#define OE_CAKE_LOADER_H + +#include "btBulletDynamicsCommon.h" + + +class BasicOECakeReader +{ + int m_materialType; + int m_particleObjectIndex; + int m_particleColor; + btAlignedObjectArray m_particlePositions; + btAlignedObjectArray m_particleRadii; + + void addParticle(int materialType, int pIndex, int pColor, float pPosX, float pPosY, float radius=1); + + virtual void addNewCollisionShape(int numParticles, btVector3* particlePositions, btScalar* radii, int materialType, int objectIndex,int color ); + + int processLine(char * buffer, int size); + + void convertParticleGroup(); + +public: + + BasicOECakeReader() + { + } + + bool processFile(char * fileName); + + virtual void createBodyForCompoundShape(btCompoundShape* compound,bool addConstraint,const btTransform& worldTransform, btScalar mass) = 0; + +}; +#endif //OE_CAKE_LOADER_H diff --git a/Demos/Gpu3dDemo/BasicDemo3d.cpp b/Demos/Gpu3dDemo/BasicDemo3d.cpp index 13952c43c..5e99703c6 100644 --- a/Demos/Gpu3dDemo/BasicDemo3d.cpp +++ b/Demos/Gpu3dDemo/BasicDemo3d.cpp @@ -1,852 +1,852 @@ -/* -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 "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" -#include "BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h" - -#include "btGpuDemoDynamicsWorld3D.h" - -#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" -#include "BulletMultiThreaded/Win32ThreadSupport.h" -#include "GLDebugFont.h" -extern int gSkippedCol; -extern int gProcessedCol; - - - -#define SPEC_TEST 0 - -#ifdef _DEBUG - #define LARGE_DEMO 1 -// #define LARGE_DEMO 1 -#else - #define LARGE_DEMO 1 -#endif - -#if LARGE_DEMO - ///create 512 (8x8x8) dynamic object -// #define ARRAY_SIZE_X 100 -// #define ARRAY_SIZE_Y 100 -// #define ARRAY_SIZE_Z 1 -// #define ARRAY_SIZE_X 228 -// #define ARRAY_SIZE_Y 228 -// #define ARRAY_SIZE_X 30 -// #define ARRAY_SIZE_Y 100 - -#define ARRAY_SIZE_X 8 -#define ARRAY_SIZE_Y 47 -#define ARRAY_SIZE_Z 8 -#else - ///create 125 (5x5x5) dynamic object - #define ARRAY_SIZE_X 45 - #define ARRAY_SIZE_Y 45 -// #define ARRAY_SIZE_Z 5 - #define ARRAY_SIZE_Z 1 -#endif - - -//maximum number of objects (and allow user to shoot additional boxes) -#define NUM_SMALL_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z) -#define MAX_PROXIES (NUM_SMALL_PROXIES + 1024) -#define MAX_LARGE_PROXIES 10 -#define MAX_SMALL_PROXIES (MAX_PROXIES - MAX_LARGE_PROXIES) - -///scaling of the objects (0.1 = 20 centimeter boxes ) -//#define SCALING 0.1 -#define SCALING 1 -#define START_POS_X 0 -#define START_POS_Y 5 -#define START_POS_Z 0 - -#include "BasicDemo3d.h" -#include "GlutStuff.h" -///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. -#include "btBulletDynamicsCommon.h" -#include //printf debugging - -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" - -#include "../Extras/CUDA/btCudaBroadphase.h" - -btScalar gTimeStep = btScalar(1./60.); - -bool gbDrawBatches = false; -int gSelectedBatch = CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES; -bool gUseCPUSolver = false; -bool gUseSolver2 = true; -bool gDrawWire = false; -bool gUseCudaMotIntegr = true; - - -void BasicDemo3D::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - ///step the simulation - if (m_dynamicsWorld) - { -// btCudaDemoPairCache* pc = (btCudaDemoPairCache*)m_dynamicsWorld->getPairCache(); -// pc->m_numSmallProxies = m_dynamicsWorld->getNumCollisionObjects(); // - 1; // exclude floor - m_dynamicsWorld->stepSimulation(gTimeStep,0);//ms / 1000000.f); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - renderme(); - - ms = getDeltaTimeMicroseconds(); - - glFlush(); - - glutSwapBuffers(); - -} - - - -void BasicDemo3D::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing to detect problems - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - -#define NUM_SOLVERS 11 -static btConstraintSolver* sConstraintSolvers[NUM_SOLVERS]; -static int sCurrSolverIndex = 9; -static char* sConstraintSolverNames[NUM_SOLVERS] = -{ - "btSequentialImpulseConstraintSolver", - "btParallelBatchConstraintSolver", - "btCudaConstraintSolver", - "btParallelBatchConstraintSolver2", - "btParallelBatchConstraintSolver3", - "btCudaConstraintSolver3", - "btParallelBatchConstraintSolver4", - "btCudaConstraintSolver4", - "btParallelBatchConstraintSolver5", - "btParallelBatchConstraintSolver6", - "btCudaConstraintSolver6", -}; - -//btVector3 gWorldMin(-228,-228,-32); -//btVector3 gWorldMin(-228,0,-32); -//btVector3 gWorldMax(228,228,32); - -//btVector3 gWorldMin(-150,-228,-32); -//btVector3 gWorldMax(150,228,32); - -#define POS_OFFS_X (ARRAY_SIZE_X * SCALING + 50) -#define POS_OFFS_Y (ARRAY_SIZE_Y * SCALING ) -#define POS_OFFS_Z (ARRAY_SIZE_Z * SCALING + 5) - -btVector3 gWorldMin(-POS_OFFS_X, -ARRAY_SIZE_Y*SCALING, -80-POS_OFFS_Z); -btVector3 gWorldMax( POS_OFFS_X, POS_OFFS_Y, 80+POS_OFFS_Z); - -//btCudaDemoPairCache* gPairCache; -btHashedOverlappingPairCache* gPairCache; - -void BasicDemo3D::initPhysics() -{ - setTexturing(true); - setShadows(false); - -// setCameraDistance(btScalar(SCALING*50.)); -#if LARGE_DEMO - setCameraDistance(btScalar(SCALING*50.)); -#else - setCameraDistance(btScalar(SCALING*20.)); -#endif - - m_cameraTargetPosition.setValue(START_POS_X, -START_POS_Y-20, START_POS_Z); - m_azi = btScalar(0.f); - m_ele = btScalar(0.f); - - ///collision configuration contains default setup for memory, collision setup - - btDefaultCollisionConstructionInfo dci; - dci.m_defaultMaxPersistentManifoldPoolSize=100000; - dci.m_defaultMaxCollisionAlgorithmPoolSize=100000; - dci.m_customCollisionAlgorithmMaxElementSize = sizeof(SpuContactManifoldCollisionAlgorithm); - - - ///SpuContactManifoldCollisionAlgorithm is larger than any of the other collision algorithms -//@@ dci.m_customMaxCollisionAlgorithmSize = sizeof(SpuContactManifoldCollisionAlgorithm); - - m_collisionConfiguration = new btDefaultCollisionConfiguration(dci); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - //m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); -#ifndef WIN32 - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); -#else - unsigned int maxNumOutstandingTasks =4; - //createCollisionLocalStoreMemory(); - //processSolverTask - Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("narrowphase_multi",processCollisionTask,createCollisionLocalStoreMemory,maxNumOutstandingTasks); - class btThreadSupportInterface* threadInterface = new Win32ThreadSupport(threadConstructionInfo); - m_dispatcher = new SpuGatheringCollisionDispatcher(threadInterface,maxNumOutstandingTasks,m_collisionConfiguration); -#endif //SINGLE_THREADED_NARROWPHASE - - -//## m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,new btEmptyAlgorithm::CreateFunc); -//## m_dispatcher->registerCollisionCreateFunc(CUSTOM_CONVEX_SHAPE_TYPE,CUSTOM_CONVEX_SHAPE_TYPE,new btBox2dBox2dCollisionAlgorithm::CreateFunc); - -// m_broadphase = new btDbvtBroadphase(); - - -//## gPairCache = new (btAlignedAlloc(sizeof(btCudaDemoPairCache),16)) btCudaDemoPairCache(MAX_PROXIES, 24, MAX_SMALL_PROXIES); -// gPairCache = NULL; - gPairCache = new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache(); - - //m_broadphase = new btSimpleBroadphase(16384, gPairCache); - -/* -btCudaBroadphase::btCudaBroadphase( btOverlappingPairCache* overlappingPairCache, - const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell, - btScalar cellFactorAABB) -*/ -// btVector3 numOfCells = (gWorldMax - gWorldMin) / (2. * SCALING * 0.7); - btVector3 numOfCells = (gWorldMax - gWorldMin) / (2. * SCALING); - int numOfCellsX = (int)numOfCells[0]; - int numOfCellsY = (int)numOfCells[1]; - int numOfCellsZ = (int)numOfCells[2]; - -// m_broadphase = new bt3DGridBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,10,8,8,1./1.5); -//#define USE_CUDA_BROADPHASE 1 -#ifdef USE_CUDA_BROADPHASE - m_broadphase = new btCudaBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,20,18,8,1./1.5); -#else - -#if DBVT - btDbvtBroadphase* dbvt = new btDbvtBroadphase(gPairCache); - m_broadphase = dbvt; - dbvt->m_deferedcollide=false; - dbvt->m_prediction = 0.f; -#else - m_broadphase = new btAxisSweep3(gWorldMin,gWorldMax,32000,gPairCache,true);//(btDbvtBroadphase(gPairCache); -#endif //DBVT - -#endif - - - // create solvers for tests - ///the default constraint solver - sConstraintSolvers[0] = new btSequentialImpulseConstraintSolver(); -/* - sConstraintSolvers[1] = new btParallelBatchConstraintSolver(); - sConstraintSolvers[2] = new btCudaConstraintSolver(); - sConstraintSolvers[3] = new btParallelBatchConstraintSolver2(); - sConstraintSolvers[4] = new btParallelBatchConstraintSolver3(); - sConstraintSolvers[5] = new btCudaConstraintSolver3(); - sConstraintSolvers[6] = new btParallelBatchConstraintSolver4(); - sConstraintSolvers[7] = new btCudaConstraintSolver4(); - sConstraintSolvers[8] = new btParallelBatchConstraintSolver5(); - sConstraintSolvers[9] = new btParallelBatchConstraintSolver6(); - sConstraintSolvers[10] = new btCudaConstraintSolver6(); -*/ - sCurrSolverIndex = 0; - m_solver = sConstraintSolvers[sCurrSolverIndex]; - printf("\nUsing %s\n", sConstraintSolverNames[sCurrSolverIndex]); - -// sCudaMotionInterface = new btCudaMotionInterface(MAX_PROXIES); -// m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration, sCudaMotionInterface); -// m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); -//## btCudaDemoDynamicsWorld* pDdw = new btCudaDemoDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - btCudaDemoDynamicsWorld3D* pDdw = new btCudaDemoDynamicsWorld3D(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - m_dynamicsWorld = pDdw; - pDdw->getDispatchInfo().m_enableSPU=true; - pDdw->getSimulationIslandManager()->setSplitIslands(sCurrSolverIndex == 0); - pDdw->setObjRad(SCALING); - pDdw->setWorldMin(gWorldMin); - pDdw->setWorldMax(gWorldMax); -#ifdef BT_USE_CUDA - gUseCPUSolver = false; -#else - gUseCPUSolver = true; -#endif - pDdw->setUseCPUSolver(gUseCPUSolver); -// pDdw->setUseSolver2(gUseSolver2); - -// m_dynamicsWorld->setGravity(btVector3(0,0,0)); - m_dynamicsWorld->setGravity(btVector3(0.f,-10.f,0.f)); - m_dynamicsWorld->getSolverInfo().m_numIterations = 4; - - - { - //create a few dynamic rigidbodies - // Re-using the same collision is better for memory usage and performance - - - //btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,0.1));//SCALING*1)); -//## btCollisionShape* colShape = new btBox2dShape(btVector3(SCALING*.7,SCALING*.7,0.1));//SCALING*1)); - btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*.7,SCALING*.7, SCALING*.7)); - - //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - 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); -#if (!SPEC_TEST) - float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; - float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; - float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; - - for (int k=0;kaddRigidBody(body); - } - } - } -#else - // narrowphase test - 2 bodies at the same position - float start_x = START_POS_X; - float start_y = START_POS_Y; - float start_z = START_POS_Z; -// startTransform.setOrigin(SCALING*btVector3(start_x,start_y-14.f,start_z)); - startTransform.setOrigin(SCALING*btVector3(start_x,start_y-11.f,start_z)); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,colShape,localInertia); - rbInfo.m_startWorldTransform=startTransform; - btRigidBody* body = new btRigidBody(rbInfo); - m_dynamicsWorld->addRigidBody(body); -// startTransform.setOrigin(SCALING*btVector3(start_x+1.2f,start_y+1.4f-14.f,start_z)); - startTransform.setOrigin(SCALING*btVector3(start_x,start_y + 1.5f -11.f, start_z)); - rbInfo.m_startWorldTransform=startTransform; - body = new btRigidBody(rbInfo); - m_dynamicsWorld->addRigidBody(body); -#endif - } - - -#if 0 - ///create a few basic rigid bodies -// btCollisionShape* groundShape = new btBox2dShape(btVector3(btScalar(50.),btScalar(1.),btScalar(50.))); -// btCollisionShape* groundShape = new btBox2dShape(btVector3(btScalar(228.),btScalar(1.),btScalar(228.))); -// btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(228.),btScalar(1.),btScalar(228.))); -// btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); -// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); - btCollisionShape* groundShape = new btBoxShape(btVector3(POS_OFFS_X, btScalar(1.), POS_OFFS_Z)); - - m_collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0, gWorldMin[1], 0)); - -// groundTransform.setOrigin(btVector3(0,-5,0)); -// groundTransform.setOrigin(btVector3(0,-50,0)); - - //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: - { - btScalar mass(0.); - - //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) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - m_dynamicsWorld->addRigidBody(body); - } -#endif - //clientResetScene(); -} - -void BasicDemo3D::clientResetScene() -{ - DemoApplication::clientResetScene(); - btCudaDemoDynamicsWorld3D* pDdw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; - pDdw->resetScene(); -#if SPEC_TEST - { - float start_x = START_POS_X; - float start_y = START_POS_Y; - float start_z = START_POS_Z; - int numObjects = m_dynamicsWorld->getNumCollisionObjects(); - btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); - btTransform startTransform; - startTransform.setIdentity(); - for(int n = 0; n < numObjects; n++) - { - btCollisionObject* colObj = collisionObjects[n]; - btRigidBody* rb = btRigidBody::upcast(colObj); - if(!n) - { -// startTransform.setOrigin(SCALING*btVector3(start_x,start_y-14.f,start_z)); - startTransform.setOrigin(SCALING*btVector3(start_x,start_y-11.f,start_z)); - } - else - { -// startTransform.setOrigin(SCALING*btVector3(start_x+1.2f,start_y+1.4f-14.f,start_z)); - startTransform.setOrigin(SCALING*btVector3(start_x, start_y+1.5f-11.f,start_z)); - } - rb->setCenterOfMassTransform(startTransform); - } - return; - } -#endif -// we don't use motionState, so reset transforms here - int numObjects = m_dynamicsWorld->getNumCollisionObjects(); - btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); - - float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; - float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; - float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; - btTransform startTransform; - startTransform.setIdentity(); - - for(int n = 0; n < numObjects; n++) - { - btCollisionObject* colObj = collisionObjects[n]; - btRigidBody* rb = btRigidBody::upcast(colObj); - int offs = ARRAY_SIZE_X * ARRAY_SIZE_Z; - int indx = n; - int ky = indx / offs; - indx -= ky * offs; - int kx = indx / ARRAY_SIZE_Z; - indx -= kx * ARRAY_SIZE_Z; - int kz = indx; - startTransform.setOrigin(SCALING*btVector3( - 2.0*SCALING*kx + start_x, - 2.0*SCALING*ky + start_y, - 2.0*SCALING*kz + start_z)); - rb->setCenterOfMassTransform(startTransform); - } -} - - - -void BasicDemo3D::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;jgetSimulationIslandManager()->setSplitIslands(sCurrSolverIndex == 0); - pDdw->setConstraintSolver(sConstraintSolvers[sCurrSolverIndex]); - printf("\nUsing %s\n", sConstraintSolverNames[sCurrSolverIndex]); - } - break; -#endif - case 'c' : - { - gbDrawBatches = !gbDrawBatches; - break; - } - case 'b' : - { - gSelectedBatch++; - gSelectedBatch %= (CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES + 1); - break; - } - case 'u' : - { -#ifdef BT_USE_CUDA - btCudaDemoDynamicsWorld3D* pDdw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; - gUseCPUSolver = !gUseCPUSolver; - pDdw->setUseCPUSolver(gUseCPUSolver); -#endif - break; - } - case 'w' : - { - gDrawWire = !gDrawWire; - setWireMode(gDrawWire); - break; - } - case 'm' : - { - btCudaDemoDynamicsWorld3D* pDdw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; - gUseCudaMotIntegr = !gUseCudaMotIntegr; - pDdw->setUseCudaMotIntegr(gUseCudaMotIntegr); - break; - } - - default : - { - DemoApplication::keyboardCallback(key, x, y); - } - break; - } - - if(key == ' ') - { - //gPairCache->reset(); - } -} - - -void BasicDemo3D::mouseFunc(int button, int state, int x, int y) -{ - if (state == GLUT_DOWN) { - m_mouseButtons |= 1<m_numInBatches[i]); - GLDebugDrawString(xOffs-80, yOffs,buf); - yOffs += 15.f; - } -} - - -void BasicDemo3D::renderme() -{ - updateCamera(); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if(gDrawWire) - { - glColor3f(1.f, 1.f, 1.f); - glDisable(GL_LIGHTING); - setTexturing(false); - } - else - { - myinit(); - setTexturing(true); - } - - renderscene(0); - - if(gbDrawBatches) - { - ((btCudaDemoDynamicsWorld3D*)m_dynamicsWorld)->debugDrawConstraints(gSelectedBatch, cBatchColorTab); - } - glColor3f(0, 0, 0); - if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) - { - setOrthographicProjection(); - int xOffset = 10.f; - int yStart = 20.f; - int yIncr = 20.f; - showProfileInfo(xOffset, yStart, yIncr); - DrawConstraintInfo(); - outputDebugInfo(xOffset, yStart, yIncr); - resetPerspectiveProjection(); - } -} - - - -extern int gNumClampedCcdMotions; -#define SHOW_NUM_DEEP_PENETRATIONS 1 -#ifdef SHOW_NUM_DEEP_PENETRATIONS - extern int gNumDeepPenetrationChecks; - extern int gNumSplitImpulseRecoveries; - extern int gNumGjkChecks; - extern int gNumAlignedAllocs; - extern int gNumAlignedFree; - extern int gTotalBytesAlignedAllocs; -#endif // - - -void BasicDemo3D::outputDebugInfo(int & xOffset,int & yStart, int yIncr) -{ - char buf[124]; - glDisable(GL_LIGHTING); - glColor3f(0, 0, 0); - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"mouse to interact"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"space to reset"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"cursor keys and z,x to navigate"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"i to toggle simulation, s single step"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"q to quit"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"h to toggle help text"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"p to toggle profiling (+results to file)"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"w to toggle wireframe/solid rendering"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"c to toggle constraint drawing"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"b to draw single constraint batch"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"u to toggle between CPU and CUDA solvers"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"d to toggle between different batch builders"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"m to toggle between CUDA / CPU motion integrators"); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - if (getDynamicsWorld()) - { - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); - GLDebugDrawString(xOffset,yStart,buf); - - - yStart += yIncr; - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"# skipped collisions=%d",gSkippedCol); - GLDebugDrawString(xOffset,yStart,buf); - - yStart += yIncr; - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"# processed collisions=%d",gProcessedCol); - GLDebugDrawString(xOffset,yStart,buf); - - yStart += yIncr; - glRasterPos3f(xOffset,yStart,0); - btScalar fract = (gProcessedCol+gSkippedCol)? btScalar(gSkippedCol)/(gProcessedCol+gSkippedCol) : 0.f; - sprintf(buf,"culled narrowphase collisions=%f",fract); - GLDebugDrawString(xOffset,yStart,buf); - yStart += yIncr; - - gProcessedCol = 0; - gSkippedCol = 0; - - } -} // BasicDemo3D::outputDebugInfo() - -void BasicDemo3D::setWireMode(bool wireOnOff) -{ - int dbgDrawMode = m_dynamicsWorld->getDebugDrawer()->getDebugMode(); - if(wireOnOff) - { - dbgDrawMode |= btIDebugDraw::DBG_FastWireframe; - } - else - { - dbgDrawMode &= ~btIDebugDraw::DBG_FastWireframe; - } - m_dynamicsWorld->getDebugDrawer()->setDebugMode(dbgDrawMode); - m_debugMode = dbgDrawMode; -} // BasicDemo3D::setWireMode() +/* +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 "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#include "BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h" + +#include "btGpuDemoDynamicsWorld3D.h" + +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#include "GLDebugFont.h" +extern int gSkippedCol; +extern int gProcessedCol; + + + +#define SPEC_TEST 0 + +#ifdef _DEBUG + #define LARGE_DEMO 1 +// #define LARGE_DEMO 1 +#else + #define LARGE_DEMO 1 +#endif + +#if LARGE_DEMO + ///create 512 (8x8x8) dynamic object +// #define ARRAY_SIZE_X 100 +// #define ARRAY_SIZE_Y 100 +// #define ARRAY_SIZE_Z 1 +// #define ARRAY_SIZE_X 228 +// #define ARRAY_SIZE_Y 228 +// #define ARRAY_SIZE_X 30 +// #define ARRAY_SIZE_Y 100 + +#define ARRAY_SIZE_X 8 +#define ARRAY_SIZE_Y 47 +#define ARRAY_SIZE_Z 8 +#else + ///create 125 (5x5x5) dynamic object + #define ARRAY_SIZE_X 45 + #define ARRAY_SIZE_Y 45 +// #define ARRAY_SIZE_Z 5 + #define ARRAY_SIZE_Z 1 +#endif + + +//maximum number of objects (and allow user to shoot additional boxes) +#define NUM_SMALL_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z) +#define MAX_PROXIES (NUM_SMALL_PROXIES + 1024) +#define MAX_LARGE_PROXIES 10 +#define MAX_SMALL_PROXIES (MAX_PROXIES - MAX_LARGE_PROXIES) + +///scaling of the objects (0.1 = 20 centimeter boxes ) +//#define SCALING 0.1 +#define SCALING 1 +#define START_POS_X 0 +#define START_POS_Y 5 +#define START_POS_Z 0 + +#include "BasicDemo3d.h" +#include "GlutStuff.h" +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging + +#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" + +#include "../Extras/CUDA/btCudaBroadphase.h" + +btScalar gTimeStep = btScalar(1./60.); + +bool gbDrawBatches = false; +int gSelectedBatch = CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES; +bool gUseCPUSolver = false; +bool gUseSolver2 = true; +bool gDrawWire = false; +bool gUseCudaMotIntegr = true; + + +void BasicDemo3D::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { +// btCudaDemoPairCache* pc = (btCudaDemoPairCache*)m_dynamicsWorld->getPairCache(); +// pc->m_numSmallProxies = m_dynamicsWorld->getNumCollisionObjects(); // - 1; // exclude floor + m_dynamicsWorld->stepSimulation(gTimeStep,0);//ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + renderme(); + + ms = getDeltaTimeMicroseconds(); + + glFlush(); + + glutSwapBuffers(); + +} + + + +void BasicDemo3D::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + +#define NUM_SOLVERS 11 +static btConstraintSolver* sConstraintSolvers[NUM_SOLVERS]; +static int sCurrSolverIndex = 9; +static char* sConstraintSolverNames[NUM_SOLVERS] = +{ + "btSequentialImpulseConstraintSolver", + "btParallelBatchConstraintSolver", + "btCudaConstraintSolver", + "btParallelBatchConstraintSolver2", + "btParallelBatchConstraintSolver3", + "btCudaConstraintSolver3", + "btParallelBatchConstraintSolver4", + "btCudaConstraintSolver4", + "btParallelBatchConstraintSolver5", + "btParallelBatchConstraintSolver6", + "btCudaConstraintSolver6", +}; + +//btVector3 gWorldMin(-228,-228,-32); +//btVector3 gWorldMin(-228,0,-32); +//btVector3 gWorldMax(228,228,32); + +//btVector3 gWorldMin(-150,-228,-32); +//btVector3 gWorldMax(150,228,32); + +#define POS_OFFS_X (ARRAY_SIZE_X * SCALING + 50) +#define POS_OFFS_Y (ARRAY_SIZE_Y * SCALING ) +#define POS_OFFS_Z (ARRAY_SIZE_Z * SCALING + 5) + +btVector3 gWorldMin(-POS_OFFS_X, -ARRAY_SIZE_Y*SCALING, -80-POS_OFFS_Z); +btVector3 gWorldMax( POS_OFFS_X, POS_OFFS_Y, 80+POS_OFFS_Z); + +//btCudaDemoPairCache* gPairCache; +btHashedOverlappingPairCache* gPairCache; + +void BasicDemo3D::initPhysics() +{ + setTexturing(true); + setShadows(false); + +// setCameraDistance(btScalar(SCALING*50.)); +#if LARGE_DEMO + setCameraDistance(btScalar(SCALING*50.)); +#else + setCameraDistance(btScalar(SCALING*20.)); +#endif + + m_cameraTargetPosition.setValue(START_POS_X, -START_POS_Y-20, START_POS_Z); + m_azi = btScalar(0.f); + m_ele = btScalar(0.f); + + ///collision configuration contains default setup for memory, collision setup + + btDefaultCollisionConstructionInfo dci; + dci.m_defaultMaxPersistentManifoldPoolSize=100000; + dci.m_defaultMaxCollisionAlgorithmPoolSize=100000; + dci.m_customCollisionAlgorithmMaxElementSize = sizeof(SpuContactManifoldCollisionAlgorithm); + + + ///SpuContactManifoldCollisionAlgorithm is larger than any of the other collision algorithms +//@@ dci.m_customMaxCollisionAlgorithmSize = sizeof(SpuContactManifoldCollisionAlgorithm); + + m_collisionConfiguration = new btDefaultCollisionConfiguration(dci); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + //m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#ifndef WIN32 + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#else + unsigned int maxNumOutstandingTasks =4; + //createCollisionLocalStoreMemory(); + //processSolverTask + Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("narrowphase_multi",processCollisionTask,createCollisionLocalStoreMemory,maxNumOutstandingTasks); + class btThreadSupportInterface* threadInterface = new Win32ThreadSupport(threadConstructionInfo); + m_dispatcher = new SpuGatheringCollisionDispatcher(threadInterface,maxNumOutstandingTasks,m_collisionConfiguration); +#endif //SINGLE_THREADED_NARROWPHASE + + +//## m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,new btEmptyAlgorithm::CreateFunc); +//## m_dispatcher->registerCollisionCreateFunc(CUSTOM_CONVEX_SHAPE_TYPE,CUSTOM_CONVEX_SHAPE_TYPE,new btBox2dBox2dCollisionAlgorithm::CreateFunc); + +// m_broadphase = new btDbvtBroadphase(); + + +//## gPairCache = new (btAlignedAlloc(sizeof(btCudaDemoPairCache),16)) btCudaDemoPairCache(MAX_PROXIES, 24, MAX_SMALL_PROXIES); +// gPairCache = NULL; + gPairCache = new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache(); + + //m_broadphase = new btSimpleBroadphase(16384, gPairCache); + +/* +btCudaBroadphase::btCudaBroadphase( btOverlappingPairCache* overlappingPairCache, + const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell, + btScalar cellFactorAABB) +*/ +// btVector3 numOfCells = (gWorldMax - gWorldMin) / (2. * SCALING * 0.7); + btVector3 numOfCells = (gWorldMax - gWorldMin) / (2. * SCALING); + int numOfCellsX = (int)numOfCells[0]; + int numOfCellsY = (int)numOfCells[1]; + int numOfCellsZ = (int)numOfCells[2]; + +// m_broadphase = new bt3DGridBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,10,8,8,1./1.5); +//#define USE_CUDA_BROADPHASE 1 +#ifdef USE_CUDA_BROADPHASE + m_broadphase = new btCudaBroadphase(gPairCache, gWorldMin, gWorldMax,numOfCellsX, numOfCellsY, numOfCellsZ,MAX_SMALL_PROXIES,20,18,8,1./1.5); +#else + +#if DBVT + btDbvtBroadphase* dbvt = new btDbvtBroadphase(gPairCache); + m_broadphase = dbvt; + dbvt->m_deferedcollide=false; + dbvt->m_prediction = 0.f; +#else + m_broadphase = new btAxisSweep3(gWorldMin,gWorldMax,32000,gPairCache,true);//(btDbvtBroadphase(gPairCache); +#endif //DBVT + +#endif + + + // create solvers for tests + ///the default constraint solver + sConstraintSolvers[0] = new btSequentialImpulseConstraintSolver(); +/* + sConstraintSolvers[1] = new btParallelBatchConstraintSolver(); + sConstraintSolvers[2] = new btCudaConstraintSolver(); + sConstraintSolvers[3] = new btParallelBatchConstraintSolver2(); + sConstraintSolvers[4] = new btParallelBatchConstraintSolver3(); + sConstraintSolvers[5] = new btCudaConstraintSolver3(); + sConstraintSolvers[6] = new btParallelBatchConstraintSolver4(); + sConstraintSolvers[7] = new btCudaConstraintSolver4(); + sConstraintSolvers[8] = new btParallelBatchConstraintSolver5(); + sConstraintSolvers[9] = new btParallelBatchConstraintSolver6(); + sConstraintSolvers[10] = new btCudaConstraintSolver6(); +*/ + sCurrSolverIndex = 0; + m_solver = sConstraintSolvers[sCurrSolverIndex]; + printf("\nUsing %s\n", sConstraintSolverNames[sCurrSolverIndex]); + +// sCudaMotionInterface = new btCudaMotionInterface(MAX_PROXIES); +// m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration, sCudaMotionInterface); +// m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); +//## btCudaDemoDynamicsWorld* pDdw = new btCudaDemoDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + btCudaDemoDynamicsWorld3D* pDdw = new btCudaDemoDynamicsWorld3D(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = pDdw; + pDdw->getDispatchInfo().m_enableSPU=true; + pDdw->getSimulationIslandManager()->setSplitIslands(sCurrSolverIndex == 0); + pDdw->setObjRad(SCALING); + pDdw->setWorldMin(gWorldMin); + pDdw->setWorldMax(gWorldMax); +#ifdef BT_USE_CUDA + gUseCPUSolver = false; +#else + gUseCPUSolver = true; +#endif + pDdw->setUseCPUSolver(gUseCPUSolver); +// pDdw->setUseSolver2(gUseSolver2); + +// m_dynamicsWorld->setGravity(btVector3(0,0,0)); + m_dynamicsWorld->setGravity(btVector3(0.f,-10.f,0.f)); + m_dynamicsWorld->getSolverInfo().m_numIterations = 4; + + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + + //btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,0.1));//SCALING*1)); +//## btCollisionShape* colShape = new btBox2dShape(btVector3(SCALING*.7,SCALING*.7,0.1));//SCALING*1)); + btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*.7,SCALING*.7, SCALING*.7)); + + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + 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); +#if (!SPEC_TEST) + float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; + float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; + float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; + + for (int k=0;kaddRigidBody(body); + } + } + } +#else + // narrowphase test - 2 bodies at the same position + float start_x = START_POS_X; + float start_y = START_POS_Y; + float start_z = START_POS_Z; +// startTransform.setOrigin(SCALING*btVector3(start_x,start_y-14.f,start_z)); + startTransform.setOrigin(SCALING*btVector3(start_x,start_y-11.f,start_z)); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,colShape,localInertia); + rbInfo.m_startWorldTransform=startTransform; + btRigidBody* body = new btRigidBody(rbInfo); + m_dynamicsWorld->addRigidBody(body); +// startTransform.setOrigin(SCALING*btVector3(start_x+1.2f,start_y+1.4f-14.f,start_z)); + startTransform.setOrigin(SCALING*btVector3(start_x,start_y + 1.5f -11.f, start_z)); + rbInfo.m_startWorldTransform=startTransform; + body = new btRigidBody(rbInfo); + m_dynamicsWorld->addRigidBody(body); +#endif + } + + +#if 0 + ///create a few basic rigid bodies +// btCollisionShape* groundShape = new btBox2dShape(btVector3(btScalar(50.),btScalar(1.),btScalar(50.))); +// btCollisionShape* groundShape = new btBox2dShape(btVector3(btScalar(228.),btScalar(1.),btScalar(228.))); +// btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(228.),btScalar(1.),btScalar(228.))); +// btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); +// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + btCollisionShape* groundShape = new btBoxShape(btVector3(POS_OFFS_X, btScalar(1.), POS_OFFS_Z)); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0, gWorldMin[1], 0)); + +// groundTransform.setOrigin(btVector3(0,-5,0)); +// groundTransform.setOrigin(btVector3(0,-50,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //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) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } +#endif + //clientResetScene(); +} + +void BasicDemo3D::clientResetScene() +{ + DemoApplication::clientResetScene(); + btCudaDemoDynamicsWorld3D* pDdw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; + pDdw->resetScene(); +#if SPEC_TEST + { + float start_x = START_POS_X; + float start_y = START_POS_Y; + float start_z = START_POS_Z; + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); + btTransform startTransform; + startTransform.setIdentity(); + for(int n = 0; n < numObjects; n++) + { + btCollisionObject* colObj = collisionObjects[n]; + btRigidBody* rb = btRigidBody::upcast(colObj); + if(!n) + { +// startTransform.setOrigin(SCALING*btVector3(start_x,start_y-14.f,start_z)); + startTransform.setOrigin(SCALING*btVector3(start_x,start_y-11.f,start_z)); + } + else + { +// startTransform.setOrigin(SCALING*btVector3(start_x+1.2f,start_y+1.4f-14.f,start_z)); + startTransform.setOrigin(SCALING*btVector3(start_x, start_y+1.5f-11.f,start_z)); + } + rb->setCenterOfMassTransform(startTransform); + } + return; + } +#endif +// we don't use motionState, so reset transforms here + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btCollisionObjectArray& collisionObjects = m_dynamicsWorld->getCollisionObjectArray(); + + float start_x = START_POS_X - ARRAY_SIZE_X * SCALING; + float start_y = START_POS_Y - ARRAY_SIZE_Y * SCALING; + float start_z = START_POS_Z - ARRAY_SIZE_Z * SCALING; + btTransform startTransform; + startTransform.setIdentity(); + + for(int n = 0; n < numObjects; n++) + { + btCollisionObject* colObj = collisionObjects[n]; + btRigidBody* rb = btRigidBody::upcast(colObj); + int offs = ARRAY_SIZE_X * ARRAY_SIZE_Z; + int indx = n; + int ky = indx / offs; + indx -= ky * offs; + int kx = indx / ARRAY_SIZE_Z; + indx -= kx * ARRAY_SIZE_Z; + int kz = indx; + startTransform.setOrigin(SCALING*btVector3( + 2.0*SCALING*kx + start_x, + 2.0*SCALING*ky + start_y, + 2.0*SCALING*kz + start_z)); + rb->setCenterOfMassTransform(startTransform); + } +} + + + +void BasicDemo3D::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;jgetSimulationIslandManager()->setSplitIslands(sCurrSolverIndex == 0); + pDdw->setConstraintSolver(sConstraintSolvers[sCurrSolverIndex]); + printf("\nUsing %s\n", sConstraintSolverNames[sCurrSolverIndex]); + } + break; +#endif + case 'c' : + { + gbDrawBatches = !gbDrawBatches; + break; + } + case 'b' : + { + gSelectedBatch++; + gSelectedBatch %= (CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES + 1); + break; + } + case 'u' : + { +#ifdef BT_USE_CUDA + btCudaDemoDynamicsWorld3D* pDdw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; + gUseCPUSolver = !gUseCPUSolver; + pDdw->setUseCPUSolver(gUseCPUSolver); +#endif + break; + } + case 'w' : + { + gDrawWire = !gDrawWire; + setWireMode(gDrawWire); + break; + } + case 'm' : + { + btCudaDemoDynamicsWorld3D* pDdw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; + gUseCudaMotIntegr = !gUseCudaMotIntegr; + pDdw->setUseCudaMotIntegr(gUseCudaMotIntegr); + break; + } + + default : + { + DemoApplication::keyboardCallback(key, x, y); + } + break; + } + + if(key == ' ') + { + //gPairCache->reset(); + } +} + + +void BasicDemo3D::mouseFunc(int button, int state, int x, int y) +{ + if (state == GLUT_DOWN) { + m_mouseButtons |= 1<m_numInBatches[i]); + GLDebugDrawString(xOffs-80, yOffs,buf); + yOffs += 15.f; + } +} + + +void BasicDemo3D::renderme() +{ + updateCamera(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if(gDrawWire) + { + glColor3f(1.f, 1.f, 1.f); + glDisable(GL_LIGHTING); + setTexturing(false); + } + else + { + myinit(); + setTexturing(true); + } + + renderscene(0); + + if(gbDrawBatches) + { + ((btCudaDemoDynamicsWorld3D*)m_dynamicsWorld)->debugDrawConstraints(gSelectedBatch, cBatchColorTab); + } + glColor3f(0, 0, 0); + if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) + { + setOrthographicProjection(); + int xOffset = 10.f; + int yStart = 20.f; + int yIncr = 20.f; + showProfileInfo(xOffset, yStart, yIncr); + DrawConstraintInfo(); + outputDebugInfo(xOffset, yStart, yIncr); + resetPerspectiveProjection(); + } +} + + + +extern int gNumClampedCcdMotions; +#define SHOW_NUM_DEEP_PENETRATIONS 1 +#ifdef SHOW_NUM_DEEP_PENETRATIONS + extern int gNumDeepPenetrationChecks; + extern int gNumSplitImpulseRecoveries; + extern int gNumGjkChecks; + extern int gNumAlignedAllocs; + extern int gNumAlignedFree; + extern int gTotalBytesAlignedAllocs; +#endif // + + +void BasicDemo3D::outputDebugInfo(int & xOffset,int & yStart, int yIncr) +{ + char buf[124]; + glDisable(GL_LIGHTING); + glColor3f(0, 0, 0); + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"mouse to interact"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"space to reset"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"cursor keys and z,x to navigate"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"i to toggle simulation, s single step"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"q to quit"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"h to toggle help text"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"p to toggle profiling (+results to file)"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"w to toggle wireframe/solid rendering"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"c to toggle constraint drawing"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"b to draw single constraint batch"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"u to toggle between CPU and CUDA solvers"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"d to toggle between different batch builders"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"m to toggle between CUDA / CPU motion integrators"); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + if (getDynamicsWorld()) + { + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); + GLDebugDrawString(xOffset,yStart,buf); + + + yStart += yIncr; + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# skipped collisions=%d",gSkippedCol); + GLDebugDrawString(xOffset,yStart,buf); + + yStart += yIncr; + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# processed collisions=%d",gProcessedCol); + GLDebugDrawString(xOffset,yStart,buf); + + yStart += yIncr; + glRasterPos3f(xOffset,yStart,0); + btScalar fract = (gProcessedCol+gSkippedCol)? btScalar(gSkippedCol)/(gProcessedCol+gSkippedCol) : 0.f; + sprintf(buf,"culled narrowphase collisions=%f",fract); + GLDebugDrawString(xOffset,yStart,buf); + yStart += yIncr; + + gProcessedCol = 0; + gSkippedCol = 0; + + } +} // BasicDemo3D::outputDebugInfo() + +void BasicDemo3D::setWireMode(bool wireOnOff) +{ + int dbgDrawMode = m_dynamicsWorld->getDebugDrawer()->getDebugMode(); + if(wireOnOff) + { + dbgDrawMode |= btIDebugDraw::DBG_FastWireframe; + } + else + { + dbgDrawMode &= ~btIDebugDraw::DBG_FastWireframe; + } + m_dynamicsWorld->getDebugDrawer()->setDebugMode(dbgDrawMode); + m_debugMode = dbgDrawMode; +} // BasicDemo3D::setWireMode() diff --git a/Demos/Gpu3dDemo/BasicDemo3d.h b/Demos/Gpu3dDemo/BasicDemo3d.h index 7fe6625cd..7600e2728 100644 --- a/Demos/Gpu3dDemo/BasicDemo3d.h +++ b/Demos/Gpu3dDemo/BasicDemo3d.h @@ -1,93 +1,93 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 BASIC_DEMO3D_H -#define BASIC_DEMO3D_H - -#include "GlutDemoApplication.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" - -class btBroadphaseInterface; -class btCollisionShape; -class btOverlappingPairCache; -class btCollisionDispatcher; -class btConstraintSolver; -struct btCollisionAlgorithmCreateFunc; -class btDefaultCollisionConfiguration; - -///BasicDemo is good starting point for learning the code base and porting. -class BasicDemo3D : public GlutDemoApplication -{ - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - int m_mouseButtons; - int m_mouseOldX; - int m_mouseOldY; - - public: - - BasicDemo3D() - { - } - virtual ~BasicDemo3D() - { - exitPhysics(); - } - void initPhysics(); - - void exitPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void keyboardCallback(unsigned char key, int x, int y); - virtual void mouseFunc(int button, int state, int x, int y); - virtual void mouseMotionFunc(int x,int y); - - virtual void clientResetScene(); - - static DemoApplication* Create() - { - BasicDemo3D* demo = new BasicDemo3D; - demo->myinit(); - demo->initPhysics(); - demo->m_mouseButtons = 0; - demo->m_mouseOldX = 0; - demo->m_mouseOldY = 0; - return demo; - } - - void DrawConstraintInfo(); - void outputDebugInfo(int & xOffset,int & yStart, int yIncr); - virtual void renderme(); - - void setWireMode(bool wireOnOff); -}; - - -#endif //BASIC_DEMO3D_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 BASIC_DEMO3D_H +#define BASIC_DEMO3D_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +///BasicDemo is good starting point for learning the code base and porting. +class BasicDemo3D : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + int m_mouseButtons; + int m_mouseOldX; + int m_mouseOldY; + + public: + + BasicDemo3D() + { + } + virtual ~BasicDemo3D() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + virtual void mouseFunc(int button, int state, int x, int y); + virtual void mouseMotionFunc(int x,int y); + + virtual void clientResetScene(); + + static DemoApplication* Create() + { + BasicDemo3D* demo = new BasicDemo3D; + demo->myinit(); + demo->initPhysics(); + demo->m_mouseButtons = 0; + demo->m_mouseOldX = 0; + demo->m_mouseOldY = 0; + return demo; + } + + void DrawConstraintInfo(); + void outputDebugInfo(int & xOffset,int & yStart, int yIncr); + virtual void renderme(); + + void setWireMode(bool wireOnOff); +}; + + +#endif //BASIC_DEMO3D_H + diff --git a/Demos/Gpu3dDemo/btGpuDemo3dCpuFunc.cpp b/Demos/Gpu3dDemo/btGpuDemo3dCpuFunc.cpp index fabb17493..9c956d4f9 100644 --- a/Demos/Gpu3dDemo/btGpuDemo3dCpuFunc.cpp +++ b/Demos/Gpu3dDemo/btGpuDemo3dCpuFunc.cpp @@ -1,32 +1,32 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "LinearMath/btQuickprof.h" - -//---------------------------------------------------------------------------------------- - -#include "btGpuDemo3dSharedTypes.h" - -//---------------------------------------------------------------------------------------- - -#include "BulletMultiThreaded/btGpuDefines.h" -#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "btGpuDemo3dSharedCode.h" - -//-------------------------------------------------------------------------- -//-------------------------------------------------------------------------- -//-------------------------------------------------------------------------- +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "LinearMath/btQuickprof.h" + +//---------------------------------------------------------------------------------------- + +#include "btGpuDemo3dSharedTypes.h" + +//---------------------------------------------------------------------------------------- + +#include "BulletMultiThreaded/btGpuDefines.h" +#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "btGpuDemo3dSharedCode.h" + +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- diff --git a/Demos/Gpu3dDemo/btGpuDemo3dSharedCode.h b/Demos/Gpu3dDemo/btGpuDemo3dSharedCode.h index e1350ac88..487b60f97 100644 --- a/Demos/Gpu3dDemo/btGpuDemo3dSharedCode.h +++ b/Demos/Gpu3dDemo/btGpuDemo3dSharedCode.h @@ -1,545 +1,545 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "LinearMath/btMinMax.h" - -//---------------------------------------------------------------------------------------- - -#define USE_FRICTION 1 -#define FRICTION_BOX_GROUND_FACT 0.01f -#define FRICTION_BOX_BOX_FACT 0.01f -//#define FRICTION_BOX_BOX_FACT 0.05f -#define USE_CENTERS 1 - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------- C o n s t r a i n t s o l v e r d e m o 3D -------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -// kernel functions - - -BT_GPU___global__ void clearAccumulationOfLambdaDtD(float* lambdaDtBox, int numConstraints, int numContPoints) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index < numConstraints) - { - for(int i=0; i < numContPoints; i++) - lambdaDtBox[numContPoints * index + i] = 0; - } -} // clearAccumulationOfLambdaDtD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ float computeImpulse3D(float3 rVel, - float positionConstraint, - float3 cNormal, - float dt) -{ - const float collisionConstant = 0.1f; - const float baumgarteConstant = 0.1f; - const float penetrationError = 0.02f; - - float lambdaDt=0; - float3 impulse=BT_GPU_make_float3(0.f,0.f,0.f); - - if(positionConstraint >= 0) - return lambdaDt; - - positionConstraint = btMin(0.0f,positionConstraint+penetrationError); - - lambdaDt = -(BT_GPU_dot(cNormal,rVel)*(collisionConstant)); - lambdaDt -= (baumgarteConstant/dt*positionConstraint); - - return lambdaDt; -} // computeImpulse3D() - -//---------------------------------------------------------------------------------------- - -#if 0 -#define VLIM 1000.f -void BT_GPU___device__ chk_vect(float4* v) -{ - if(v->x < -VLIM) v->x = 0.f; - if(v->x > VLIM) v->x = 0.f; - if(v->y < -VLIM) v->y = 0.f; - if(v->y > VLIM) v->y = 0.f; - if(v->z < -VLIM) v->z = 0.f; - if(v->z > VLIM) v->z = 0.f; -} // chk_vect() -#endif - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void collisionWithWallBox3DD(float4 *trans, - float4 *vel, - float4* angVel, - btCudaPartProps pProp, - btCudaBoxProps gProp, - int nParticles, - float dt) -{ - int idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - float3 aPos; - float positionConstraint; - float3 impulse; - - if(idx < nParticles) - { - aPos = BT_GPU_make_float34(trans[idx * 4 + 3]); - for(int iVtx=0; iVtx < 8; iVtx++) - { - float3 dx = BT_GPU_make_float34(trans[idx * 4 + 0]); - float3 dy = BT_GPU_make_float34(trans[idx * 4 + 1]); - float3 dz = BT_GPU_make_float34(trans[idx * 4 + 2]); - float3 rerVertex = ((iVtx & 1) ? dx : dx * (-1.f)); - - rerVertex += ((iVtx & 2) ? dy : dy * (-1.f)); - rerVertex += ((iVtx & 4) ? dz : dz * (-1.f)); - float3 vPos = aPos + rerVertex; - float3 aVel = BT_GPU_make_float3(vel[idx].x, vel[idx].y, vel[idx].z); - float3 aAngVel = BT_GPU_make_float34(angVel[idx]); - float3 vVel =aVel+BT_GPU_cross(aAngVel, rerVertex); - float restitution=0.5; - { - positionConstraint = vPos.y - gProp.minY; - impulse = BT_GPU_make_float31(0.0f); - if(positionConstraint < 0) - { - float3 groundNormal; - groundNormal = BT_GPU_make_float3(0.0f,1.0f,0.0f); - impulse = groundNormal * restitution * computeImpulse3D(vVel, positionConstraint, groundNormal, dt); -#if USE_FRICTION // only with ground for now - float3 lat_vel = vVel - groundNormal * BT_GPU_dot(groundNormal,vVel); - float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); - if (lat_vel_len > 0) - { - lat_vel_len = sqrtf(lat_vel_len); - lat_vel *= 1.f/lat_vel_len; - impulse -= lat_vel * BT_GPU_dot(lat_vel, vVel) * FRICTION_BOX_GROUND_FACT; - } -#endif //USE_FRICTION - vel[idx] += BT_GPU_make_float42(impulse,0.0f); - angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); - } - } - { - positionConstraint = vPos.x - gProp.minX; - impulse = BT_GPU_make_float31(0.0f); - if(positionConstraint < 0) - { - float3 normal = BT_GPU_make_float3(1.0f,0.0f,0.0f); - impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); - vel[idx] += BT_GPU_make_float42(impulse,0.0f); - angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); - } - } - { - positionConstraint = gProp.maxX - vPos.x; - impulse = BT_GPU_make_float31(0.0f); - if(positionConstraint < 0) - { - float3 normal = BT_GPU_make_float3(-1.0f,0.0f,0.0f); - impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); - vel[idx] += BT_GPU_make_float42(impulse,0.0f); - angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); - } - } - { - positionConstraint = vPos.z - gProp.minZ; - impulse = BT_GPU_make_float31(0.0f); - if(positionConstraint < 0) - { - float3 normal = BT_GPU_make_float3(0.0f,0.0f,1.0f); - impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); - vel[idx] += BT_GPU_make_float42(impulse,0.0f); - angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); - } - } - { - positionConstraint = gProp.maxZ - vPos.z; - impulse = BT_GPU_make_float31(0.0f); - if(positionConstraint < 0) - { - float3 normal = BT_GPU_make_float3(0.0f,0.0f,-1.0f); - impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); - vel[idx] += BT_GPU_make_float42(impulse,0.0f); - angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); - } - } - } - } -} // collisionWithWallBox3DD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void collisionBatchResolutionBox3DD(int2 *constraints, - int *batch, - int nConstraints, - float4 *trans, - float4 *vel, - float4 *angularVel, - float *lambdaDtBox, - float *iPositionConstraint, - float3 *normal, - float3 *contact, - btCudaPartProps pProp, - int iBatch, - float dt) -{ - float3 relVel; - float3 impulse; - float lambdaDt; - float positionConstraint; - int k_idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(k_idx < nConstraints) - { - int idx = batch[k_idx]; - int aId=constraints[idx].x; - int bId=constraints[idx].y; - float3 aPos = BT_GPU_make_float34(trans[aId * 4 + 3]); - float3 bPos = BT_GPU_make_float34(trans[bId * 4 + 3]); - float3 aVel = BT_GPU_make_float34(vel[aId]); - float3 bVel = BT_GPU_make_float34(vel[bId]); - float3 aAngVel = BT_GPU_make_float34(angularVel[aId]); - float3 bAngVel = BT_GPU_make_float34(angularVel[bId]); - for(int iVtx = 0; iVtx < 4; iVtx++) - { - float3 contactPoint = contact[idx * 4 + iVtx] - aPos; - positionConstraint = iPositionConstraint[idx * 4 + iVtx]; - if(positionConstraint > 0) - { - float3 contactNormal = normal[idx * 4 + iVtx]; - relVel = (aVel + BT_GPU_cross(aAngVel, contactPoint)) - -(bVel + BT_GPU_cross(bAngVel, contactPoint+aPos-bPos)); - - lambdaDt= computeImpulse3D(relVel, -positionConstraint, contactNormal, dt); - { - float rLambdaDt=lambdaDtBox[idx * 4 + iVtx]; - float pLambdaDt=rLambdaDt; - rLambdaDt=btMax(pLambdaDt+lambdaDt,0.0f); - lambdaDt=rLambdaDt-pLambdaDt; - lambdaDtBox[idx * 4 + iVtx]=rLambdaDt; - } - impulse = contactNormal*lambdaDt*0.5; -#if USE_FRICTION - float3 lat_vel = relVel - contactNormal * BT_GPU_dot(contactNormal, relVel); - float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); - if (lat_vel_len > 0) - { - lat_vel_len = sqrtf(lat_vel_len); - lat_vel *= 1.f/lat_vel_len; - impulse -= lat_vel * BT_GPU_dot(lat_vel , relVel) * FRICTION_BOX_BOX_FACT; - } -#endif //USE_FRICTION - aVel+= impulse; - bVel-= impulse; - aAngVel += BT_GPU_cross(contactPoint, impulse); - bAngVel -= BT_GPU_cross(contactPoint+aPos-bPos, impulse); - } - } - vel[aId]=BT_GPU_make_float42(aVel,0.0f); - vel[bId]=BT_GPU_make_float42(bVel,0.0f); - angularVel[aId]=BT_GPU_make_float42(aAngVel,0.0f); - angularVel[bId]=BT_GPU_make_float42(bAngVel,0.0f); - } -} // collisionBatchResolutionBox3DD() - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - - -extern "C" -{ - -// global functions - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)) -{ - if(!numConstraints) - { - return; - } - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numConstraints, 256, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, clearAccumulationOfLambdaDtD, (lambdaDtBox, numConstraints, numContPoints)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("clearAccumulationOfLambdaDtD kernel execution failed"); - -} // clearAccumulationOfLambdaDt() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(collisionWithWallBox3D(void* trans,void* vel,void* angVel,btCudaPartProps pProp, btCudaBoxProps gProp,int numObjs,float dt)) -{ - if(!numObjs) - { - return; - } - float4* pTrans = (float4*)trans; - float4* pVel = (float4*)vel; - float4* pAngVel = (float4*)angVel; - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numObjs, 256, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionWithWallBox3DD, (pTrans,pVel,pAngVel,pProp,gProp,numObjs,dt)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("collisionWithWallBox3DD kernel execution failed"); -} // collisionWithWallBox3D() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(collisionBatchResolutionBox3D(void* constraints,int *batch,int numConstraints,void *trans,void *vel, - void *angularVel,float *lambdaDtBox,float *positionConstraint,void* normal,void* contact, - btCudaPartProps pProp,int iBatch,float dt)) -{ - if(!numConstraints) - { - return; - } - int2* pConstr = (int2*)constraints; - float4* pTrans = (float4*)trans; - float4* pVel = (float4*)vel; - float4* pAngVel = (float4*)angularVel; - float3* pNorm = (float3*)normal; - float3* pContact = (float3*)contact; - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numConstraints, 128, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionBatchResolutionBox3DD, (pConstr,batch,numConstraints,pTrans,pVel,pAngVel,lambdaDtBox,positionConstraint,pNorm,pContact,pProp,iBatch,dt)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("collisionBatchResolutionBox3DD kernel execution failed"); -} // collisionBatchResolutionBox3D() - -//---------------------------------------------------------------------------------------- - -} // extern "C" - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------- M o t i o n i n t e g r a t o r d e m o ----------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -// kernel functions - -BT_GPU___global__ void integrVelD(float4* pForceTorqueDamp, float4* pInvInertiaMass, float4* pVel, float4* pAngVel, float timeStep, unsigned int numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - // unpack input data - float3 force = BT_GPU_make_float34(pForceTorqueDamp[index * 2]); - float lin_damp = pForceTorqueDamp[index * 2].w; - float3 torque = BT_GPU_make_float34(pForceTorqueDamp[index * 2 + 1]); - float ang_damp = pForceTorqueDamp[index * 2 + 1].w; - float3 linVel = BT_GPU_make_float34(pVel[index]); - float3 angVel = BT_GPU_make_float34(pAngVel[index]); - float3 in_mass_0 = BT_GPU_make_float34(pInvInertiaMass[index * 3]); - float3 in_mass_1 = BT_GPU_make_float34(pInvInertiaMass[index * 3 + 1]); - float3 in_mass_2 = BT_GPU_make_float34(pInvInertiaMass[index * 3 + 2]); - float mass = pInvInertiaMass[index * 3].w; - // integrate linear velocity - float3 outLinVel, outAngVel; - outLinVel = linVel + force * mass * timeStep; - // integrate angular velocity - outAngVel.x = BT_GPU_dot(in_mass_0, torque); - outAngVel.y = BT_GPU_dot(in_mass_1, torque); - outAngVel.z = BT_GPU_dot(in_mass_2, torque); - outAngVel += angVel; - /// clamp angular velocity. collision calculations will fail on higher angular velocities - #if(!defined(M_PI)) - #define M_PI 3.1415926f - #endif - #define BT_CUDA_MAX_SQ_ANGVEL (M_PI*M_PI) - float sq_angvel = BT_GPU_dot(outAngVel, outAngVel); - sq_angvel *= timeStep * timeStep; - float fact; - if(sq_angvel > BT_CUDA_MAX_SQ_ANGVEL) - { - fact = sqrtf(BT_CUDA_MAX_SQ_ANGVEL/sq_angvel) / timeStep; - outAngVel *= fact; - } - // now apply damping - fact = powf(1.0f - lin_damp, timeStep); - outLinVel *= fact; - fact = powf(1.0f - ang_damp, timeStep); - outAngVel *= fact; - // pack results - pVel[index] = BT_GPU_make_float42(outLinVel, 0.f); - pAngVel[index] = BT_GPU_make_float42(outAngVel, 0.f); -} // integrVelD() - -#define BT_GPU__ANGULAR_MOTION_THRESHOLD (0.25f * M_PI) - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ float4 getRotation(float4* trans) -{ - float trace = trans[0].x + trans[1].y + trans[2].z; - float temp[4]; - if(trace > 0.0f) - { - float s = sqrtf(trace + 1.0f); - temp[3] = s * 0.5f; - s = 0.5f / s; - temp[0] = (trans[1].z - trans[2].y) * s; - temp[1] = (trans[2].x - trans[0].z) * s; - temp[2] = (trans[0].y - trans[1].x) * s; - } - else - { - typedef float btMatrRow[4]; - btMatrRow* m_el = (btMatrRow*)trans; - int i = m_el[0][0] < m_el[1][1] ? - (m_el[1][1] < m_el[2][2] ? 2 : 1) : - (m_el[0][0] < m_el[2][2] ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - float s = sqrtf(m_el[i][i] - m_el[j][j] - m_el[k][k] + 1.0f); - temp[i] = s * 0.5f; - s = 0.5f / s; - temp[3] = (m_el[j][k] - m_el[k][j]) * s; - temp[j] = (m_el[i][j] + m_el[j][i]) * s; - temp[k] = (m_el[i][k] + m_el[k][i]) * s; - } - float4 q = BT_GPU_make_float44(temp[0],temp[1],temp[2],temp[3]); - return q; -} // getRotation() - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ float4 quatMult(float4& q1, float4& q2) -{ - return BT_GPU_make_float44(q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y, - q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z, - q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x, - q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z); -} // quatMult() - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ void quatNorm(float4& q) -{ - float len = sqrtf(BT_GPU_dot4(q, q)); - q *= 1.f / len; -} // quatNorm() - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ void setRotation(float4& q, float4* trans) -{ - float d = BT_GPU_dot4(q, q); - float s = 2.0f / d; - float xs = q.x * s, ys = q.y * s, zs = q.z * s; - float wx = q.w * xs, wy = q.w * ys, wz = q.w * zs; - float xx = q.x * xs, xy = q.x * ys, xz = q.x * zs; - float yy = q.y * ys, yz = q.y * zs, zz = q.z * zs; - trans[0].x = 1.0f - (yy + zz); - trans[1].x = xy - wz; - trans[2].x = xz + wy; - trans[0].y = xy + wz; - trans[1].y = 1.0f - (xx + zz); - trans[2].y = yz - wx; - trans[0].z = xz - wy; - trans[1].z = yz + wx; - trans[2].z = 1.0f - (xx + yy); - trans[0].w = trans[1].w = trans[2].w = 0.0f; -} // setRotation() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void integrTransD(float4* pTrans, float4* pVel, float4* pAngVel, float timeStep, unsigned int numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - float3 pos = BT_GPU_make_float34(pTrans[index * 4 + 3]); - float3 linvel = BT_GPU_make_float34(pVel[index]); - pos += linvel * timeStep; - - float3 axis; - float3 angvel = BT_GPU_make_float34(pAngVel[index]); - float fAngle = sqrtf(BT_GPU_dot(angvel, angvel)); - //limit the angular motion - if(fAngle*timeStep > BT_GPU__ANGULAR_MOTION_THRESHOLD) - { - fAngle = BT_GPU__ANGULAR_MOTION_THRESHOLD / timeStep; - } - if(fAngle < 0.001f) - { - // use Taylor's expansions of sync function - axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angvel * ( sinf(0.5f * fAngle * timeStep) / fAngle); - } - float4 dorn = BT_GPU_make_float42(axis, cosf(fAngle * timeStep * 0.5f)); - float4 orn0 = getRotation(pTrans + index * 4); - float4 predictedOrn = quatMult(dorn, orn0); - quatNorm(predictedOrn); - setRotation(predictedOrn, pTrans + index * 4); - pTrans[index * 4 + 3] = BT_GPU_make_float42(pos, 0.f); -} // integrTransD() - - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -// global functions - -extern "C" -{ - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(integrVel(float* pForceTorqueDamp, float* pInvInertiaMass, void* pVel, void* pAngVel, float timeStep, unsigned int numBodies)) -{ - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); - BT_GPU_EXECKERNEL(numBlocks, numThreads, integrVelD, ((float4*)pForceTorqueDamp, (float4*)pInvInertiaMass, (float4*)pVel, (float4*)pAngVel, timeStep, numBodies)); - BT_GPU_CHECK_ERROR("Kernel execution failed: btCuda_integrVelD"); -} // integrVel() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(integrTrans(void* trans, void* vel, void* angVel, float timeStep, int numBodies)) -{ - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); - BT_GPU_EXECKERNEL(numBlocks, numThreads, integrTransD, ((float4*)trans, (float4*)vel, (float4*)angVel, timeStep, numBodies)); - BT_GPU_CHECK_ERROR("Kernel execution failed: btCuda_integrTransD"); -} // integrTrans() - -//---------------------------------------------------------------------------------------- - -} // extern "C" - -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ -//---------------------------------------------------------------------------------------- +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "LinearMath/btMinMax.h" + +//---------------------------------------------------------------------------------------- + +#define USE_FRICTION 1 +#define FRICTION_BOX_GROUND_FACT 0.01f +#define FRICTION_BOX_BOX_FACT 0.01f +//#define FRICTION_BOX_BOX_FACT 0.05f +#define USE_CENTERS 1 + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------- C o n s t r a i n t s o l v e r d e m o 3D -------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +// kernel functions + + +BT_GPU___global__ void clearAccumulationOfLambdaDtD(float* lambdaDtBox, int numConstraints, int numContPoints) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index < numConstraints) + { + for(int i=0; i < numContPoints; i++) + lambdaDtBox[numContPoints * index + i] = 0; + } +} // clearAccumulationOfLambdaDtD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ float computeImpulse3D(float3 rVel, + float positionConstraint, + float3 cNormal, + float dt) +{ + const float collisionConstant = 0.1f; + const float baumgarteConstant = 0.1f; + const float penetrationError = 0.02f; + + float lambdaDt=0; + float3 impulse=BT_GPU_make_float3(0.f,0.f,0.f); + + if(positionConstraint >= 0) + return lambdaDt; + + positionConstraint = btMin(0.0f,positionConstraint+penetrationError); + + lambdaDt = -(BT_GPU_dot(cNormal,rVel)*(collisionConstant)); + lambdaDt -= (baumgarteConstant/dt*positionConstraint); + + return lambdaDt; +} // computeImpulse3D() + +//---------------------------------------------------------------------------------------- + +#if 0 +#define VLIM 1000.f +void BT_GPU___device__ chk_vect(float4* v) +{ + if(v->x < -VLIM) v->x = 0.f; + if(v->x > VLIM) v->x = 0.f; + if(v->y < -VLIM) v->y = 0.f; + if(v->y > VLIM) v->y = 0.f; + if(v->z < -VLIM) v->z = 0.f; + if(v->z > VLIM) v->z = 0.f; +} // chk_vect() +#endif + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void collisionWithWallBox3DD(float4 *trans, + float4 *vel, + float4* angVel, + btCudaPartProps pProp, + btCudaBoxProps gProp, + int nParticles, + float dt) +{ + int idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + float3 aPos; + float positionConstraint; + float3 impulse; + + if(idx < nParticles) + { + aPos = BT_GPU_make_float34(trans[idx * 4 + 3]); + for(int iVtx=0; iVtx < 8; iVtx++) + { + float3 dx = BT_GPU_make_float34(trans[idx * 4 + 0]); + float3 dy = BT_GPU_make_float34(trans[idx * 4 + 1]); + float3 dz = BT_GPU_make_float34(trans[idx * 4 + 2]); + float3 rerVertex = ((iVtx & 1) ? dx : dx * (-1.f)); + + rerVertex += ((iVtx & 2) ? dy : dy * (-1.f)); + rerVertex += ((iVtx & 4) ? dz : dz * (-1.f)); + float3 vPos = aPos + rerVertex; + float3 aVel = BT_GPU_make_float3(vel[idx].x, vel[idx].y, vel[idx].z); + float3 aAngVel = BT_GPU_make_float34(angVel[idx]); + float3 vVel =aVel+BT_GPU_cross(aAngVel, rerVertex); + float restitution=0.5; + { + positionConstraint = vPos.y - gProp.minY; + impulse = BT_GPU_make_float31(0.0f); + if(positionConstraint < 0) + { + float3 groundNormal; + groundNormal = BT_GPU_make_float3(0.0f,1.0f,0.0f); + impulse = groundNormal * restitution * computeImpulse3D(vVel, positionConstraint, groundNormal, dt); +#if USE_FRICTION // only with ground for now + float3 lat_vel = vVel - groundNormal * BT_GPU_dot(groundNormal,vVel); + float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); + if (lat_vel_len > 0) + { + lat_vel_len = sqrtf(lat_vel_len); + lat_vel *= 1.f/lat_vel_len; + impulse -= lat_vel * BT_GPU_dot(lat_vel, vVel) * FRICTION_BOX_GROUND_FACT; + } +#endif //USE_FRICTION + vel[idx] += BT_GPU_make_float42(impulse,0.0f); + angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); + } + } + { + positionConstraint = vPos.x - gProp.minX; + impulse = BT_GPU_make_float31(0.0f); + if(positionConstraint < 0) + { + float3 normal = BT_GPU_make_float3(1.0f,0.0f,0.0f); + impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); + vel[idx] += BT_GPU_make_float42(impulse,0.0f); + angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); + } + } + { + positionConstraint = gProp.maxX - vPos.x; + impulse = BT_GPU_make_float31(0.0f); + if(positionConstraint < 0) + { + float3 normal = BT_GPU_make_float3(-1.0f,0.0f,0.0f); + impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); + vel[idx] += BT_GPU_make_float42(impulse,0.0f); + angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); + } + } + { + positionConstraint = vPos.z - gProp.minZ; + impulse = BT_GPU_make_float31(0.0f); + if(positionConstraint < 0) + { + float3 normal = BT_GPU_make_float3(0.0f,0.0f,1.0f); + impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); + vel[idx] += BT_GPU_make_float42(impulse,0.0f); + angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); + } + } + { + positionConstraint = gProp.maxZ - vPos.z; + impulse = BT_GPU_make_float31(0.0f); + if(positionConstraint < 0) + { + float3 normal = BT_GPU_make_float3(0.0f,0.0f,-1.0f); + impulse = normal * restitution * computeImpulse3D(vVel,positionConstraint,normal,dt); + vel[idx] += BT_GPU_make_float42(impulse,0.0f); + angVel[idx] += BT_GPU_make_float42(BT_GPU_cross(rerVertex,impulse), 0.0f); + } + } + } + } +} // collisionWithWallBox3DD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void collisionBatchResolutionBox3DD(int2 *constraints, + int *batch, + int nConstraints, + float4 *trans, + float4 *vel, + float4 *angularVel, + float *lambdaDtBox, + float *iPositionConstraint, + float3 *normal, + float3 *contact, + btCudaPartProps pProp, + int iBatch, + float dt) +{ + float3 relVel; + float3 impulse; + float lambdaDt; + float positionConstraint; + int k_idx = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(k_idx < nConstraints) + { + int idx = batch[k_idx]; + int aId=constraints[idx].x; + int bId=constraints[idx].y; + float3 aPos = BT_GPU_make_float34(trans[aId * 4 + 3]); + float3 bPos = BT_GPU_make_float34(trans[bId * 4 + 3]); + float3 aVel = BT_GPU_make_float34(vel[aId]); + float3 bVel = BT_GPU_make_float34(vel[bId]); + float3 aAngVel = BT_GPU_make_float34(angularVel[aId]); + float3 bAngVel = BT_GPU_make_float34(angularVel[bId]); + for(int iVtx = 0; iVtx < 4; iVtx++) + { + float3 contactPoint = contact[idx * 4 + iVtx] - aPos; + positionConstraint = iPositionConstraint[idx * 4 + iVtx]; + if(positionConstraint > 0) + { + float3 contactNormal = normal[idx * 4 + iVtx]; + relVel = (aVel + BT_GPU_cross(aAngVel, contactPoint)) + -(bVel + BT_GPU_cross(bAngVel, contactPoint+aPos-bPos)); + + lambdaDt= computeImpulse3D(relVel, -positionConstraint, contactNormal, dt); + { + float rLambdaDt=lambdaDtBox[idx * 4 + iVtx]; + float pLambdaDt=rLambdaDt; + rLambdaDt=btMax(pLambdaDt+lambdaDt,0.0f); + lambdaDt=rLambdaDt-pLambdaDt; + lambdaDtBox[idx * 4 + iVtx]=rLambdaDt; + } + impulse = contactNormal*lambdaDt*0.5; +#if USE_FRICTION + float3 lat_vel = relVel - contactNormal * BT_GPU_dot(contactNormal, relVel); + float lat_vel_len = BT_GPU_dot(lat_vel, lat_vel); + if (lat_vel_len > 0) + { + lat_vel_len = sqrtf(lat_vel_len); + lat_vel *= 1.f/lat_vel_len; + impulse -= lat_vel * BT_GPU_dot(lat_vel , relVel) * FRICTION_BOX_BOX_FACT; + } +#endif //USE_FRICTION + aVel+= impulse; + bVel-= impulse; + aAngVel += BT_GPU_cross(contactPoint, impulse); + bAngVel -= BT_GPU_cross(contactPoint+aPos-bPos, impulse); + } + } + vel[aId]=BT_GPU_make_float42(aVel,0.0f); + vel[bId]=BT_GPU_make_float42(bVel,0.0f); + angularVel[aId]=BT_GPU_make_float42(aAngVel,0.0f); + angularVel[bId]=BT_GPU_make_float42(bAngVel,0.0f); + } +} // collisionBatchResolutionBox3DD() + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + + +extern "C" +{ + +// global functions + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)) +{ + if(!numConstraints) + { + return; + } + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numConstraints, 256, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, clearAccumulationOfLambdaDtD, (lambdaDtBox, numConstraints, numContPoints)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("clearAccumulationOfLambdaDtD kernel execution failed"); + +} // clearAccumulationOfLambdaDt() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(collisionWithWallBox3D(void* trans,void* vel,void* angVel,btCudaPartProps pProp, btCudaBoxProps gProp,int numObjs,float dt)) +{ + if(!numObjs) + { + return; + } + float4* pTrans = (float4*)trans; + float4* pVel = (float4*)vel; + float4* pAngVel = (float4*)angVel; + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numObjs, 256, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionWithWallBox3DD, (pTrans,pVel,pAngVel,pProp,gProp,numObjs,dt)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("collisionWithWallBox3DD kernel execution failed"); +} // collisionWithWallBox3D() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(collisionBatchResolutionBox3D(void* constraints,int *batch,int numConstraints,void *trans,void *vel, + void *angularVel,float *lambdaDtBox,float *positionConstraint,void* normal,void* contact, + btCudaPartProps pProp,int iBatch,float dt)) +{ + if(!numConstraints) + { + return; + } + int2* pConstr = (int2*)constraints; + float4* pTrans = (float4*)trans; + float4* pVel = (float4*)vel; + float4* pAngVel = (float4*)angularVel; + float3* pNorm = (float3*)normal; + float3* pContact = (float3*)contact; + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numConstraints, 128, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, collisionBatchResolutionBox3DD, (pConstr,batch,numConstraints,pTrans,pVel,pAngVel,lambdaDtBox,positionConstraint,pNorm,pContact,pProp,iBatch,dt)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("collisionBatchResolutionBox3DD kernel execution failed"); +} // collisionBatchResolutionBox3D() + +//---------------------------------------------------------------------------------------- + +} // extern "C" + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------- M o t i o n i n t e g r a t o r d e m o ----------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +// kernel functions + +BT_GPU___global__ void integrVelD(float4* pForceTorqueDamp, float4* pInvInertiaMass, float4* pVel, float4* pAngVel, float timeStep, unsigned int numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + // unpack input data + float3 force = BT_GPU_make_float34(pForceTorqueDamp[index * 2]); + float lin_damp = pForceTorqueDamp[index * 2].w; + float3 torque = BT_GPU_make_float34(pForceTorqueDamp[index * 2 + 1]); + float ang_damp = pForceTorqueDamp[index * 2 + 1].w; + float3 linVel = BT_GPU_make_float34(pVel[index]); + float3 angVel = BT_GPU_make_float34(pAngVel[index]); + float3 in_mass_0 = BT_GPU_make_float34(pInvInertiaMass[index * 3]); + float3 in_mass_1 = BT_GPU_make_float34(pInvInertiaMass[index * 3 + 1]); + float3 in_mass_2 = BT_GPU_make_float34(pInvInertiaMass[index * 3 + 2]); + float mass = pInvInertiaMass[index * 3].w; + // integrate linear velocity + float3 outLinVel, outAngVel; + outLinVel = linVel + force * mass * timeStep; + // integrate angular velocity + outAngVel.x = BT_GPU_dot(in_mass_0, torque); + outAngVel.y = BT_GPU_dot(in_mass_1, torque); + outAngVel.z = BT_GPU_dot(in_mass_2, torque); + outAngVel += angVel; + /// clamp angular velocity. collision calculations will fail on higher angular velocities + #if(!defined(M_PI)) + #define M_PI 3.1415926f + #endif + #define BT_CUDA_MAX_SQ_ANGVEL (M_PI*M_PI) + float sq_angvel = BT_GPU_dot(outAngVel, outAngVel); + sq_angvel *= timeStep * timeStep; + float fact; + if(sq_angvel > BT_CUDA_MAX_SQ_ANGVEL) + { + fact = sqrtf(BT_CUDA_MAX_SQ_ANGVEL/sq_angvel) / timeStep; + outAngVel *= fact; + } + // now apply damping + fact = powf(1.0f - lin_damp, timeStep); + outLinVel *= fact; + fact = powf(1.0f - ang_damp, timeStep); + outAngVel *= fact; + // pack results + pVel[index] = BT_GPU_make_float42(outLinVel, 0.f); + pAngVel[index] = BT_GPU_make_float42(outAngVel, 0.f); +} // integrVelD() + +#define BT_GPU__ANGULAR_MOTION_THRESHOLD (0.25f * M_PI) + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ float4 getRotation(float4* trans) +{ + float trace = trans[0].x + trans[1].y + trans[2].z; + float temp[4]; + if(trace > 0.0f) + { + float s = sqrtf(trace + 1.0f); + temp[3] = s * 0.5f; + s = 0.5f / s; + temp[0] = (trans[1].z - trans[2].y) * s; + temp[1] = (trans[2].x - trans[0].z) * s; + temp[2] = (trans[0].y - trans[1].x) * s; + } + else + { + typedef float btMatrRow[4]; + btMatrRow* m_el = (btMatrRow*)trans; + int i = m_el[0][0] < m_el[1][1] ? + (m_el[1][1] < m_el[2][2] ? 2 : 1) : + (m_el[0][0] < m_el[2][2] ? 2 : 0); + int j = (i + 1) % 3; + int k = (i + 2) % 3; + float s = sqrtf(m_el[i][i] - m_el[j][j] - m_el[k][k] + 1.0f); + temp[i] = s * 0.5f; + s = 0.5f / s; + temp[3] = (m_el[j][k] - m_el[k][j]) * s; + temp[j] = (m_el[i][j] + m_el[j][i]) * s; + temp[k] = (m_el[i][k] + m_el[k][i]) * s; + } + float4 q = BT_GPU_make_float44(temp[0],temp[1],temp[2],temp[3]); + return q; +} // getRotation() + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ float4 quatMult(float4& q1, float4& q2) +{ + return BT_GPU_make_float44(q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y, + q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z, + q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x, + q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z); +} // quatMult() + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ void quatNorm(float4& q) +{ + float len = sqrtf(BT_GPU_dot4(q, q)); + q *= 1.f / len; +} // quatNorm() + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ void setRotation(float4& q, float4* trans) +{ + float d = BT_GPU_dot4(q, q); + float s = 2.0f / d; + float xs = q.x * s, ys = q.y * s, zs = q.z * s; + float wx = q.w * xs, wy = q.w * ys, wz = q.w * zs; + float xx = q.x * xs, xy = q.x * ys, xz = q.x * zs; + float yy = q.y * ys, yz = q.y * zs, zz = q.z * zs; + trans[0].x = 1.0f - (yy + zz); + trans[1].x = xy - wz; + trans[2].x = xz + wy; + trans[0].y = xy + wz; + trans[1].y = 1.0f - (xx + zz); + trans[2].y = yz - wx; + trans[0].z = xz - wy; + trans[1].z = yz + wx; + trans[2].z = 1.0f - (xx + yy); + trans[0].w = trans[1].w = trans[2].w = 0.0f; +} // setRotation() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void integrTransD(float4* pTrans, float4* pVel, float4* pAngVel, float timeStep, unsigned int numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + float3 pos = BT_GPU_make_float34(pTrans[index * 4 + 3]); + float3 linvel = BT_GPU_make_float34(pVel[index]); + pos += linvel * timeStep; + + float3 axis; + float3 angvel = BT_GPU_make_float34(pAngVel[index]); + float fAngle = sqrtf(BT_GPU_dot(angvel, angvel)); + //limit the angular motion + if(fAngle*timeStep > BT_GPU__ANGULAR_MOTION_THRESHOLD) + { + fAngle = BT_GPU__ANGULAR_MOTION_THRESHOLD / timeStep; + } + if(fAngle < 0.001f) + { + // use Taylor's expansions of sync function + axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle); + } + else + { + // sync(fAngle) = sin(c*fAngle)/t + axis = angvel * ( sinf(0.5f * fAngle * timeStep) / fAngle); + } + float4 dorn = BT_GPU_make_float42(axis, cosf(fAngle * timeStep * 0.5f)); + float4 orn0 = getRotation(pTrans + index * 4); + float4 predictedOrn = quatMult(dorn, orn0); + quatNorm(predictedOrn); + setRotation(predictedOrn, pTrans + index * 4); + pTrans[index * 4 + 3] = BT_GPU_make_float42(pos, 0.f); +} // integrTransD() + + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +// global functions + +extern "C" +{ + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(integrVel(float* pForceTorqueDamp, float* pInvInertiaMass, void* pVel, void* pAngVel, float timeStep, unsigned int numBodies)) +{ + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT_GPU_EXECKERNEL(numBlocks, numThreads, integrVelD, ((float4*)pForceTorqueDamp, (float4*)pInvInertiaMass, (float4*)pVel, (float4*)pAngVel, timeStep, numBodies)); + BT_GPU_CHECK_ERROR("Kernel execution failed: btCuda_integrVelD"); +} // integrVel() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(integrTrans(void* trans, void* vel, void* angVel, float timeStep, int numBodies)) +{ + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT_GPU_EXECKERNEL(numBlocks, numThreads, integrTransD, ((float4*)trans, (float4*)vel, (float4*)angVel, timeStep, numBodies)); + BT_GPU_CHECK_ERROR("Kernel execution failed: btCuda_integrTransD"); +} // integrTrans() + +//---------------------------------------------------------------------------------------- + +} // extern "C" + +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +//---------------------------------------------------------------------------------------- diff --git a/Demos/Gpu3dDemo/btGpuDemo3dSharedDefs.h b/Demos/Gpu3dDemo/btGpuDemo3dSharedDefs.h index 6e4adaa8a..d0abea4e9 100644 --- a/Demos/Gpu3dDemo/btGpuDemo3dSharedDefs.h +++ b/Demos/Gpu3dDemo/btGpuDemo3dSharedDefs.h @@ -1,38 +1,38 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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. -*/ - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - - -extern "C" -{ - -void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)); -void BT_GPU_PREF(collisionWithWallBox3D(void* trans,void* vel,void* angVel,btCudaPartProps pProp, btCudaBoxProps gProp,int numObjs,float dt)); -void BT_GPU_PREF(collisionBatchResolutionBox3D(void* constraints,int *batch,int numConstraints,void *trans,void *vel, - void *angularVel,float *lambdaDtBox,float *positionConstraint,void* normal,void* contact, - btCudaPartProps pProp,int iBatch,float dt)); - -void BT_GPU_PREF(integrVel(float* pForceTorqueDamp, float* pInvInertiaMass, void* pVel, void* pAngVel, float timeStep, unsigned int numBodies)); -void BT_GPU_PREF(integrTrans(void* trans, void* vel, void* angVel, float timeStep, int numBodies)); - - -} // extern "C" - -//---------------------------------------------------------------------------------------- +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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. +*/ + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + + +extern "C" +{ + +void BT_GPU_PREF(clearAccumulationOfLambdaDt(float* lambdaDtBox, int numConstraints, int numContPoints)); +void BT_GPU_PREF(collisionWithWallBox3D(void* trans,void* vel,void* angVel,btCudaPartProps pProp, btCudaBoxProps gProp,int numObjs,float dt)); +void BT_GPU_PREF(collisionBatchResolutionBox3D(void* constraints,int *batch,int numConstraints,void *trans,void *vel, + void *angularVel,float *lambdaDtBox,float *positionConstraint,void* normal,void* contact, + btCudaPartProps pProp,int iBatch,float dt)); + +void BT_GPU_PREF(integrVel(float* pForceTorqueDamp, float* pInvInertiaMass, void* pVel, void* pAngVel, float timeStep, unsigned int numBodies)); +void BT_GPU_PREF(integrTrans(void* trans, void* vel, void* angVel, float timeStep, int numBodies)); + + +} // extern "C" + +//---------------------------------------------------------------------------------------- diff --git a/Demos/Gpu3dDemo/btGpuDemo3dSharedTypes.h b/Demos/Gpu3dDemo/btGpuDemo3dSharedTypes.h index 35713a22c..2d6400ea7 100644 --- a/Demos/Gpu3dDemo/btGpuDemo3dSharedTypes.h +++ b/Demos/Gpu3dDemo/btGpuDemo3dSharedTypes.h @@ -1,39 +1,39 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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. -*/ - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -struct btCudaPartProps -{ - float m_mass; - float m_diameter; - float m_restCoeff; -}; - -struct btCudaBoxProps -{ - float minX; - float maxX; - float minY; - float maxY; - float minZ; - float maxZ; -}; - -//---------------------------------------------------------------------------------------- +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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. +*/ + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------- C o n s t r a i n t s o l v e r d e m o ---------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +struct btCudaPartProps +{ + float m_mass; + float m_diameter; + float m_restCoeff; +}; + +struct btCudaBoxProps +{ + float minX; + float maxX; + float minY; + float maxY; + float minZ; + float maxZ; +}; + +//---------------------------------------------------------------------------------------- diff --git a/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.cpp b/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.cpp index ad014cd86..3398c9611 100644 --- a/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.cpp +++ b/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.cpp @@ -1,593 +1,593 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "btGpuDemoDynamicsWorld3D.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" -#include "BulletCollision/CollisionShapes/btCollisionShape.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" -#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" -#include "LinearMath/btQuickprof.h" -#include "GlutStuff.h" - -#include - -//-------------------------------------------------------------------------- - -#define BT_GPU_PREF(func) btCuda_##func -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "btGpuDemo3dSharedDefs.h" -#undef BT_GPU_PREF - -#define BT_GPU_PREF(func) btGpu_##func -#include "btGpuDemo3dSharedDefs.h" -#undef BT_GPU_PREF - -//-------------------------------------------------------------------------- - -#if 0 -static void check_vel(btVector3& v, int id, char* tag) -{ - int i; - for(i = 0; i < 3; i++) - { - btScalar a = v[i]; - a = btFabs(a); - if(a > 1000.f) - { - break; - } - } - if(i < 3) - { - printf("\nERROR in %s (%4d) : %7.2f %7.2f %7.2f\n", tag, id, v[0], v[1], v[2]); - v[0] = v[1] = v[2] = 0.f; - } -} -#endif - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::grabObjData() -{ - int i; - m_numObj = getNumCollisionObjects(); - for(i = 0; i < m_numObj; i++) - { - btCollisionObject* colObj = m_collisionObjects[i]; - colObj->setCompanionId(i); - btRigidBody* rb = btRigidBody::upcast(colObj); - btVector3 v; - if(m_copyIntegrDataToGPU) - { - const btTransform& tr = rb->getCenterOfMassTransform(); - v = tr.getBasis().getColumn(0); - m_hTrans[i * 4 + 0] = *((float4*)&v); - v = tr.getBasis().getColumn(1); - m_hTrans[i * 4 + 1] = *((float4*)&v); - v = tr.getBasis().getColumn(2); - m_hTrans[i * 4 + 2] = *((float4*)&v); - v = rb->getCenterOfMassPosition(); - m_hTrans[i * 4 + 3] = *((float4*)&v); - } - if(!m_useCudaMotIntegr) - { - v = rb->getLinearVelocity(); - m_hVel[i] = *((float4*)&v); - v = rb->getAngularVelocity(); - m_hAngVel[i] = *((float4*)&v); - } - } -} // btCudaDemoDynamicsWorld3D::grabObjData() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::grabConstrData() -{ - int i; - btDispatcher* dispatcher = getDispatcher(); - btPersistentManifold** manifoldPtr = dispatcher->getInternalManifoldPointer(); - int numManifolds = dispatcher->getNumManifolds(); - btPersistentManifold* manifold = 0; - m_numConstraints = 0; - -/* // paranoia - for(int j = 0; j < m_numObj; j++) - { - m_hConstraintCounter[j] = 0; - } -*/ - for(i = 0; i < numManifolds; i++) - { - manifold = manifoldPtr[i]; - int numPoints = manifold->getNumContacts(); - if(!numPoints) - { - continue; - } - - int numActualPoints = 0; - for(int n = 0; n < numPoints; n++) - { - btManifoldPoint& cp = manifold->getContactPoint(n); - if (cp.m_distance1<=0) - { - numActualPoints++; - } - - } - if (!numActualPoints) - continue; - - btRigidBody *rbA, *rbB; - rbA = (btRigidBody*)manifold->getBody0(); - rbB = (btRigidBody*)manifold->getBody1(); - int idA = rbA->getCompanionId(); - int idB = rbB->getCompanionId(); - m_hConstraintCounter[idA]++; - m_hConstraintCounter[idB]++; - if(idA < idB) - { - m_hIds[m_numConstraints].x = idA; - m_hIds[m_numConstraints].y = idB; - - for(int n = 0; n < numPoints; n++) - { - btManifoldPoint& cp = manifold->getContactPoint(n); - btVector3 v = cp.getPositionWorldOnA(); - m_hContact[m_numConstraints * m_maxPointsPerConstr + n] = *((float3*)&v); - v = cp.m_normalWorldOnB; - m_hNormal[m_numConstraints * m_maxPointsPerConstr + n] = *((float3*)&v); - float dist = cp.getDistance(); - if(dist > 0.f) - { - dist = 0.f; - } - m_hPositionConstraint[m_numConstraints * m_maxPointsPerConstr + n] = -dist; - } - } - else - { // should never happen - btAssert(0); - } - for(int n = numPoints; n < m_maxPointsPerConstr; n++) - { - m_hPositionConstraint[m_numConstraints * m_maxPointsPerConstr + n] = 0.f; - } - m_numConstraints++; - } -/* - // paranoia - for(int j = 0; j < m_numObj; j++) - { - if(m_hConstraintCounter[j] > m_maxNeihbors) - { - printf("WARN : constraint connter is %d for object %d\n", m_hConstraintCounter[j], j); - } - } -*/ -} // btCudaDemoDynamicsWorld3D::grabConstrData() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::grabData() -{ - BT_PROFILE("grab data from rigidbody and manifold"); - grabObjData(); - // constraints - grabConstrData(); -} // btCudaDemoDynamicsWorld3D::grabGata() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::createBatches() -{ - BT_PROFILE("create batches"); - int sz = m_numConstraints; - for(int i = 0; i < m_numConstraints; i++) - { - m_hBatchIds[i] = -1; - m_hConstraintUsed[i] = 0; - } - int curBatchId=0; - int* pBatchIds = m_hBatchIds; - int stage; - for(stage = 0; stage < m_maxBatches; stage++) - { // don't print junk on demo screen :-) - m_numInBatches[stage] = 0; - } - for(stage = 0; stage < m_maxBatches; stage++) - { - bool isLast = (stage == m_maxBatches-1); - for(int j = 0; j < m_numObj; j++) - { - m_hConstraintCounter[j] = 0; - } - int numInBatch = 0; - for(int i = 0; i < m_numConstraints; i++) - { - if(m_hConstraintUsed[i]) - { - continue; - } - int2 ids = m_hIds[i]; - if(!isLast) - { - if((m_hConstraintCounter[ids.x] == 0) && (m_hConstraintCounter[ids.y] == 0)) - { - m_hConstraintCounter[ids.x]=1; - m_hConstraintCounter[ids.y]=1; - pBatchIds[numInBatch]=i; - numInBatch++; - m_hConstraintUsed[i] = 1; - } - } - else - { - pBatchIds[numInBatch]=i; - numInBatch++; - m_hConstraintUsed[i] = 1; - } - } - m_numInBatches[stage] = numInBatch; - pBatchIds += numInBatch; - if(!numInBatch) break; - } -} // btCudaDemoDynamicsWorld3D::createBatches() - -//-------------------------------------------------------------------------- - - -void btCudaDemoDynamicsWorld3D::writebackData() -{ - BT_PROFILE("copy velocity into btRigidBody"); - for(int i = 0; i < m_numObj; i++) - { - btCollisionObject* colObj = m_collisionObjects[i]; - btRigidBody* rb = btRigidBody::upcast(colObj); - btVector3 v; - v = *((btVector3*)(m_hVel + i)); - rb->setLinearVelocity(v); - v = *((btVector3*)(m_hAngVel + i)); - rb->setAngularVelocity(v); - } -} // btCudaDemoDynamicsWorld3D::writebackData() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::copyDataToGPU() -{ - BT_PROFILE("copyDataToGPU"); -#ifdef BT_USE_CUDA - btCuda_copyArrayToDevice(m_dIds, m_hIds, sizeof(int2) * m_numConstraints); - btCuda_copyArrayToDevice(m_dBatchIds, m_hBatchIds, sizeof(int) * m_numConstraints); - btCuda_copyArrayToDevice(m_dContact, m_hContact, m_numConstraints * m_maxPointsPerConstr * sizeof(float3)); - btCuda_copyArrayToDevice(m_dNormal, m_hNormal, m_numConstraints * m_maxPointsPerConstr * sizeof(float3)); - btCuda_copyArrayToDevice(m_dPositionConstraint, m_hPositionConstraint, m_numConstraints * m_maxPointsPerConstr * sizeof(float)); - - if(m_copyIntegrDataToGPU) - { - btCuda_copyArrayToDevice(m_dTrans, m_hTrans, m_numObj * sizeof(float4) * 4); - if(m_useCudaMotIntegr) - { - m_copyIntegrDataToGPU = false; - } - } - - if(!m_useCudaMotIntegr) - { - btCuda_copyArrayToDevice(m_dVel, m_hVel, m_numObj * sizeof(float4)); - btCuda_copyArrayToDevice(m_dAngVel, m_hAngVel, m_numObj * sizeof(float4)); - } -#endif -} // btCudaDemoDynamicsWorld3D::copyDataToGPU() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::copyDataFromGPU() -{ - BT_PROFILE("copy velocity data from device"); -#ifdef BT_USE_CUDA - btCuda_copyArrayFromDevice(m_hVel, m_dVel, m_numObj * sizeof(float4)); - btCuda_copyArrayFromDevice(m_hAngVel, m_dAngVel, m_numObj * sizeof(float4)); -#endif -} // btCudaDemoDynamicsWorld3D::copyDataFromGPU() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::solveConstraints(btContactSolverInfo& solverInfo) -{ - if(m_useSeqImpSolver) - { - btDiscreteDynamicsWorld::solveConstraints(solverInfo); - return; - } - if(m_useCPUSolver) - { - solveConstraintsCPU(solverInfo); - return; - } -#ifdef BT_USE_CUDA - BT_PROFILE("solveConstraints"); - grabData(); - createBatches(); - copyDataToGPU(); - - btCudaPartProps partProps; - partProps.m_mass = 1.0f; - partProps.m_diameter = m_objRad * 2.0f; - partProps.m_restCoeff = 1.0f; - - btCudaBoxProps boxProps; - boxProps.minX = m_worldMin[0]; - boxProps.maxX = m_worldMax[0]; - boxProps.minY = m_worldMin[1]; - boxProps.maxY = m_worldMax[1]; - boxProps.minZ = m_worldMin[2]; - boxProps.maxZ = m_worldMax[2]; - { - BT_PROFILE("btCuda_collisionBatchResolutionBox"); - - int nIter=getSolverInfo().m_numIterations; - btDispatcherInfo& dispatchInfo = getDispatchInfo(); - btScalar timeStep = dispatchInfo.m_timeStep; - - btCuda_clearAccumulationOfLambdaDt(m_dLambdaDtBox, m_numConstraints, m_maxPointsPerConstr); - - for(int i=0;igetWorldTransform().getOrigin(); - btVector3 vB = colObjB->getWorldTransform().getOrigin(); - glVertex3f(vA[0], vA[1], vA[2]); - glVertex3f(vB[0], vB[1], vB[2]); - } - pBatchIds += numConstraints; - glEnd(); - } -} // btCudaDemoDynamicsWorld3D::debugDrawConstraints() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::predictUnconstraintMotion(btScalar timeStep) -{ - if(m_useCudaMotIntegr) - { - BT_PROFILE("motIntegr -- predictUnconstraintMotion"); - int i; - { - m_numObj = getNumCollisionObjects(); - float* p_fbuf = m_hForceTorqueDamp; - float* p_mbuf = m_hInvInertiaMass; - for(i = 0; i < m_numObj; i++) - { - btCollisionObject* colObj = m_collisionObjects[i]; - btRigidBody* rb = btRigidBody::upcast(colObj); - btVector3* pForce = (btVector3*)p_fbuf; - *pForce = rb->getTotalForce(); - p_fbuf[3] = rb->getLinearDamping(); - p_fbuf += 4; - btVector3* pTorque = (btVector3*)p_fbuf; - *pTorque = rb->getTotalTorque(); - p_fbuf[3] = rb->getAngularDamping(); - p_fbuf += 4; - if(m_copyIntegrDataToGPU) - { - for(int k = 0; k < 3; k++) - { - btVector3* pInert = (btVector3*)(p_mbuf + k * 4); - *pInert = rb->getInvInertiaTensorWorld().getRow(k); - } - p_mbuf[3] = rb->getInvMass(); - p_mbuf += 12; - } - btVector3 v = rb->getLinearVelocity(); - m_hVel[i] = *((float4*)&v); - v = rb->getAngularVelocity(); - m_hAngVel[i] = *((float4*)&v); - } - } - if(m_useCPUSolver) - { - //BT_PROFILE("motIntegr -- integrate on CPU"); - btGpu_integrVel(m_hForceTorqueDamp, m_hInvInertiaMass, m_hVel, m_hAngVel, timeStep, m_numObj); - writebackData(); - } - else - { -#ifdef BT_USE_CUDA - //BT_PROFILE("CUDA motIntegr -- integrate on CUDA"); - btCuda_copyArrayToDevice(m_dForceTorqueDamp, m_hForceTorqueDamp, sizeof(float) * m_numObj * 4 * 2); - if(m_copyIntegrDataToGPU) - { - btCuda_copyArrayToDevice(m_dInvInertiaMass, m_hInvInertiaMass, sizeof(float) * m_numObj * 4 * 3); - } - btCuda_copyArrayToDevice(m_dVel, m_hVel, m_numObj * sizeof(float4)); - btCuda_copyArrayToDevice(m_dAngVel, m_hAngVel, m_numObj * sizeof(float4)); - btCuda_integrVel(m_dForceTorqueDamp, m_dInvInertiaMass, m_dVel, m_dAngVel, timeStep, m_numObj); - copyDataFromGPU(); - writebackData(); -#endif - } - } - else - { - btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep); - m_copyIntegrDataToGPU = true; - } -} // btCudaDemoDynamicsWorld3D::predictUnconstraintMotion() - -//-------------------------------------------------------------------------- - -void btCudaDemoDynamicsWorld3D::integrateTransforms(btScalar timeStep) -{ - if(m_useCudaMotIntegr) - { - BT_PROFILE("motIntegr -- integrateTransforms"); - if(m_useCPUSolver) - { - btGpu_integrTrans(m_hTrans, m_hVel, m_hAngVel, timeStep, m_numObj); - } - else - { -#ifdef BT_USE_CUDA - btCuda_integrTrans(m_dTrans, m_dVel, m_dAngVel, timeStep, m_numObj); - btCuda_copyArrayFromDevice(m_hTrans, m_dTrans, m_numObj * sizeof(float4) * 4); -#endif - } - m_numObj = getNumCollisionObjects(); - for(int i = 0; i < m_numObj; i++) - { - btCollisionObject* colObj = m_collisionObjects[i]; - btRigidBody* rb = btRigidBody::upcast(colObj); - btVector3 v; - btTransform tr; - const btVector3& v0 = *((btVector3*)&m_hTrans[i * 4 + 0]); - const btVector3& v1 = *((btVector3*)&m_hTrans[i * 4 + 1]); - const btVector3& v2 = *((btVector3*)&m_hTrans[i * 4 + 2]); - const btVector3& v3 = *((btVector3*)&m_hTrans[i * 4 + 3]); - tr.getBasis().setValue(v0[0], v1[0], v2[0], v0[1], v1[1], v2[1], v0[2], v1[2], v2[2]); - tr.getOrigin().setValue(v3[0], v3[1], v3[2]); - rb->proceedToTransform(tr); - } - } - else - { - btDiscreteDynamicsWorld::integrateTransforms(timeStep); - } -} // btCudaDemoDynamicsWorld3D::integrateTransforms() - -//-------------------------------------------------------------------------- -//-------------------------------------------------------------------------- -//-------------------------------------------------------------------------- +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "btGpuDemoDynamicsWorld3D.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" +#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" +#include "LinearMath/btQuickprof.h" +#include "GlutStuff.h" + +#include + +//-------------------------------------------------------------------------- + +#define BT_GPU_PREF(func) btCuda_##func +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "btGpuDemo3dSharedDefs.h" +#undef BT_GPU_PREF + +#define BT_GPU_PREF(func) btGpu_##func +#include "btGpuDemo3dSharedDefs.h" +#undef BT_GPU_PREF + +//-------------------------------------------------------------------------- + +#if 0 +static void check_vel(btVector3& v, int id, char* tag) +{ + int i; + for(i = 0; i < 3; i++) + { + btScalar a = v[i]; + a = btFabs(a); + if(a > 1000.f) + { + break; + } + } + if(i < 3) + { + printf("\nERROR in %s (%4d) : %7.2f %7.2f %7.2f\n", tag, id, v[0], v[1], v[2]); + v[0] = v[1] = v[2] = 0.f; + } +} +#endif + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::grabObjData() +{ + int i; + m_numObj = getNumCollisionObjects(); + for(i = 0; i < m_numObj; i++) + { + btCollisionObject* colObj = m_collisionObjects[i]; + colObj->setCompanionId(i); + btRigidBody* rb = btRigidBody::upcast(colObj); + btVector3 v; + if(m_copyIntegrDataToGPU) + { + const btTransform& tr = rb->getCenterOfMassTransform(); + v = tr.getBasis().getColumn(0); + m_hTrans[i * 4 + 0] = *((float4*)&v); + v = tr.getBasis().getColumn(1); + m_hTrans[i * 4 + 1] = *((float4*)&v); + v = tr.getBasis().getColumn(2); + m_hTrans[i * 4 + 2] = *((float4*)&v); + v = rb->getCenterOfMassPosition(); + m_hTrans[i * 4 + 3] = *((float4*)&v); + } + if(!m_useCudaMotIntegr) + { + v = rb->getLinearVelocity(); + m_hVel[i] = *((float4*)&v); + v = rb->getAngularVelocity(); + m_hAngVel[i] = *((float4*)&v); + } + } +} // btCudaDemoDynamicsWorld3D::grabObjData() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::grabConstrData() +{ + int i; + btDispatcher* dispatcher = getDispatcher(); + btPersistentManifold** manifoldPtr = dispatcher->getInternalManifoldPointer(); + int numManifolds = dispatcher->getNumManifolds(); + btPersistentManifold* manifold = 0; + m_numConstraints = 0; + +/* // paranoia + for(int j = 0; j < m_numObj; j++) + { + m_hConstraintCounter[j] = 0; + } +*/ + for(i = 0; i < numManifolds; i++) + { + manifold = manifoldPtr[i]; + int numPoints = manifold->getNumContacts(); + if(!numPoints) + { + continue; + } + + int numActualPoints = 0; + for(int n = 0; n < numPoints; n++) + { + btManifoldPoint& cp = manifold->getContactPoint(n); + if (cp.m_distance1<=0) + { + numActualPoints++; + } + + } + if (!numActualPoints) + continue; + + btRigidBody *rbA, *rbB; + rbA = (btRigidBody*)manifold->getBody0(); + rbB = (btRigidBody*)manifold->getBody1(); + int idA = rbA->getCompanionId(); + int idB = rbB->getCompanionId(); + m_hConstraintCounter[idA]++; + m_hConstraintCounter[idB]++; + if(idA < idB) + { + m_hIds[m_numConstraints].x = idA; + m_hIds[m_numConstraints].y = idB; + + for(int n = 0; n < numPoints; n++) + { + btManifoldPoint& cp = manifold->getContactPoint(n); + btVector3 v = cp.getPositionWorldOnA(); + m_hContact[m_numConstraints * m_maxPointsPerConstr + n] = *((float3*)&v); + v = cp.m_normalWorldOnB; + m_hNormal[m_numConstraints * m_maxPointsPerConstr + n] = *((float3*)&v); + float dist = cp.getDistance(); + if(dist > 0.f) + { + dist = 0.f; + } + m_hPositionConstraint[m_numConstraints * m_maxPointsPerConstr + n] = -dist; + } + } + else + { // should never happen + btAssert(0); + } + for(int n = numPoints; n < m_maxPointsPerConstr; n++) + { + m_hPositionConstraint[m_numConstraints * m_maxPointsPerConstr + n] = 0.f; + } + m_numConstraints++; + } +/* + // paranoia + for(int j = 0; j < m_numObj; j++) + { + if(m_hConstraintCounter[j] > m_maxNeihbors) + { + printf("WARN : constraint connter is %d for object %d\n", m_hConstraintCounter[j], j); + } + } +*/ +} // btCudaDemoDynamicsWorld3D::grabConstrData() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::grabData() +{ + BT_PROFILE("grab data from rigidbody and manifold"); + grabObjData(); + // constraints + grabConstrData(); +} // btCudaDemoDynamicsWorld3D::grabGata() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::createBatches() +{ + BT_PROFILE("create batches"); + int sz = m_numConstraints; + for(int i = 0; i < m_numConstraints; i++) + { + m_hBatchIds[i] = -1; + m_hConstraintUsed[i] = 0; + } + int curBatchId=0; + int* pBatchIds = m_hBatchIds; + int stage; + for(stage = 0; stage < m_maxBatches; stage++) + { // don't print junk on demo screen :-) + m_numInBatches[stage] = 0; + } + for(stage = 0; stage < m_maxBatches; stage++) + { + bool isLast = (stage == m_maxBatches-1); + for(int j = 0; j < m_numObj; j++) + { + m_hConstraintCounter[j] = 0; + } + int numInBatch = 0; + for(int i = 0; i < m_numConstraints; i++) + { + if(m_hConstraintUsed[i]) + { + continue; + } + int2 ids = m_hIds[i]; + if(!isLast) + { + if((m_hConstraintCounter[ids.x] == 0) && (m_hConstraintCounter[ids.y] == 0)) + { + m_hConstraintCounter[ids.x]=1; + m_hConstraintCounter[ids.y]=1; + pBatchIds[numInBatch]=i; + numInBatch++; + m_hConstraintUsed[i] = 1; + } + } + else + { + pBatchIds[numInBatch]=i; + numInBatch++; + m_hConstraintUsed[i] = 1; + } + } + m_numInBatches[stage] = numInBatch; + pBatchIds += numInBatch; + if(!numInBatch) break; + } +} // btCudaDemoDynamicsWorld3D::createBatches() + +//-------------------------------------------------------------------------- + + +void btCudaDemoDynamicsWorld3D::writebackData() +{ + BT_PROFILE("copy velocity into btRigidBody"); + for(int i = 0; i < m_numObj; i++) + { + btCollisionObject* colObj = m_collisionObjects[i]; + btRigidBody* rb = btRigidBody::upcast(colObj); + btVector3 v; + v = *((btVector3*)(m_hVel + i)); + rb->setLinearVelocity(v); + v = *((btVector3*)(m_hAngVel + i)); + rb->setAngularVelocity(v); + } +} // btCudaDemoDynamicsWorld3D::writebackData() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::copyDataToGPU() +{ + BT_PROFILE("copyDataToGPU"); +#ifdef BT_USE_CUDA + btCuda_copyArrayToDevice(m_dIds, m_hIds, sizeof(int2) * m_numConstraints); + btCuda_copyArrayToDevice(m_dBatchIds, m_hBatchIds, sizeof(int) * m_numConstraints); + btCuda_copyArrayToDevice(m_dContact, m_hContact, m_numConstraints * m_maxPointsPerConstr * sizeof(float3)); + btCuda_copyArrayToDevice(m_dNormal, m_hNormal, m_numConstraints * m_maxPointsPerConstr * sizeof(float3)); + btCuda_copyArrayToDevice(m_dPositionConstraint, m_hPositionConstraint, m_numConstraints * m_maxPointsPerConstr * sizeof(float)); + + if(m_copyIntegrDataToGPU) + { + btCuda_copyArrayToDevice(m_dTrans, m_hTrans, m_numObj * sizeof(float4) * 4); + if(m_useCudaMotIntegr) + { + m_copyIntegrDataToGPU = false; + } + } + + if(!m_useCudaMotIntegr) + { + btCuda_copyArrayToDevice(m_dVel, m_hVel, m_numObj * sizeof(float4)); + btCuda_copyArrayToDevice(m_dAngVel, m_hAngVel, m_numObj * sizeof(float4)); + } +#endif +} // btCudaDemoDynamicsWorld3D::copyDataToGPU() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::copyDataFromGPU() +{ + BT_PROFILE("copy velocity data from device"); +#ifdef BT_USE_CUDA + btCuda_copyArrayFromDevice(m_hVel, m_dVel, m_numObj * sizeof(float4)); + btCuda_copyArrayFromDevice(m_hAngVel, m_dAngVel, m_numObj * sizeof(float4)); +#endif +} // btCudaDemoDynamicsWorld3D::copyDataFromGPU() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::solveConstraints(btContactSolverInfo& solverInfo) +{ + if(m_useSeqImpSolver) + { + btDiscreteDynamicsWorld::solveConstraints(solverInfo); + return; + } + if(m_useCPUSolver) + { + solveConstraintsCPU(solverInfo); + return; + } +#ifdef BT_USE_CUDA + BT_PROFILE("solveConstraints"); + grabData(); + createBatches(); + copyDataToGPU(); + + btCudaPartProps partProps; + partProps.m_mass = 1.0f; + partProps.m_diameter = m_objRad * 2.0f; + partProps.m_restCoeff = 1.0f; + + btCudaBoxProps boxProps; + boxProps.minX = m_worldMin[0]; + boxProps.maxX = m_worldMax[0]; + boxProps.minY = m_worldMin[1]; + boxProps.maxY = m_worldMax[1]; + boxProps.minZ = m_worldMin[2]; + boxProps.maxZ = m_worldMax[2]; + { + BT_PROFILE("btCuda_collisionBatchResolutionBox"); + + int nIter=getSolverInfo().m_numIterations; + btDispatcherInfo& dispatchInfo = getDispatchInfo(); + btScalar timeStep = dispatchInfo.m_timeStep; + + btCuda_clearAccumulationOfLambdaDt(m_dLambdaDtBox, m_numConstraints, m_maxPointsPerConstr); + + for(int i=0;igetWorldTransform().getOrigin(); + btVector3 vB = colObjB->getWorldTransform().getOrigin(); + glVertex3f(vA[0], vA[1], vA[2]); + glVertex3f(vB[0], vB[1], vB[2]); + } + pBatchIds += numConstraints; + glEnd(); + } +} // btCudaDemoDynamicsWorld3D::debugDrawConstraints() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::predictUnconstraintMotion(btScalar timeStep) +{ + if(m_useCudaMotIntegr) + { + BT_PROFILE("motIntegr -- predictUnconstraintMotion"); + int i; + { + m_numObj = getNumCollisionObjects(); + float* p_fbuf = m_hForceTorqueDamp; + float* p_mbuf = m_hInvInertiaMass; + for(i = 0; i < m_numObj; i++) + { + btCollisionObject* colObj = m_collisionObjects[i]; + btRigidBody* rb = btRigidBody::upcast(colObj); + btVector3* pForce = (btVector3*)p_fbuf; + *pForce = rb->getTotalForce(); + p_fbuf[3] = rb->getLinearDamping(); + p_fbuf += 4; + btVector3* pTorque = (btVector3*)p_fbuf; + *pTorque = rb->getTotalTorque(); + p_fbuf[3] = rb->getAngularDamping(); + p_fbuf += 4; + if(m_copyIntegrDataToGPU) + { + for(int k = 0; k < 3; k++) + { + btVector3* pInert = (btVector3*)(p_mbuf + k * 4); + *pInert = rb->getInvInertiaTensorWorld().getRow(k); + } + p_mbuf[3] = rb->getInvMass(); + p_mbuf += 12; + } + btVector3 v = rb->getLinearVelocity(); + m_hVel[i] = *((float4*)&v); + v = rb->getAngularVelocity(); + m_hAngVel[i] = *((float4*)&v); + } + } + if(m_useCPUSolver) + { + //BT_PROFILE("motIntegr -- integrate on CPU"); + btGpu_integrVel(m_hForceTorqueDamp, m_hInvInertiaMass, m_hVel, m_hAngVel, timeStep, m_numObj); + writebackData(); + } + else + { +#ifdef BT_USE_CUDA + //BT_PROFILE("CUDA motIntegr -- integrate on CUDA"); + btCuda_copyArrayToDevice(m_dForceTorqueDamp, m_hForceTorqueDamp, sizeof(float) * m_numObj * 4 * 2); + if(m_copyIntegrDataToGPU) + { + btCuda_copyArrayToDevice(m_dInvInertiaMass, m_hInvInertiaMass, sizeof(float) * m_numObj * 4 * 3); + } + btCuda_copyArrayToDevice(m_dVel, m_hVel, m_numObj * sizeof(float4)); + btCuda_copyArrayToDevice(m_dAngVel, m_hAngVel, m_numObj * sizeof(float4)); + btCuda_integrVel(m_dForceTorqueDamp, m_dInvInertiaMass, m_dVel, m_dAngVel, timeStep, m_numObj); + copyDataFromGPU(); + writebackData(); +#endif + } + } + else + { + btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep); + m_copyIntegrDataToGPU = true; + } +} // btCudaDemoDynamicsWorld3D::predictUnconstraintMotion() + +//-------------------------------------------------------------------------- + +void btCudaDemoDynamicsWorld3D::integrateTransforms(btScalar timeStep) +{ + if(m_useCudaMotIntegr) + { + BT_PROFILE("motIntegr -- integrateTransforms"); + if(m_useCPUSolver) + { + btGpu_integrTrans(m_hTrans, m_hVel, m_hAngVel, timeStep, m_numObj); + } + else + { +#ifdef BT_USE_CUDA + btCuda_integrTrans(m_dTrans, m_dVel, m_dAngVel, timeStep, m_numObj); + btCuda_copyArrayFromDevice(m_hTrans, m_dTrans, m_numObj * sizeof(float4) * 4); +#endif + } + m_numObj = getNumCollisionObjects(); + for(int i = 0; i < m_numObj; i++) + { + btCollisionObject* colObj = m_collisionObjects[i]; + btRigidBody* rb = btRigidBody::upcast(colObj); + btVector3 v; + btTransform tr; + const btVector3& v0 = *((btVector3*)&m_hTrans[i * 4 + 0]); + const btVector3& v1 = *((btVector3*)&m_hTrans[i * 4 + 1]); + const btVector3& v2 = *((btVector3*)&m_hTrans[i * 4 + 2]); + const btVector3& v3 = *((btVector3*)&m_hTrans[i * 4 + 3]); + tr.getBasis().setValue(v0[0], v1[0], v2[0], v0[1], v1[1], v2[1], v0[2], v1[2], v2[2]); + tr.getOrigin().setValue(v3[0], v3[1], v3[2]); + rb->proceedToTransform(tr); + } + } + else + { + btDiscreteDynamicsWorld::integrateTransforms(timeStep); + } +} // btCudaDemoDynamicsWorld3D::integrateTransforms() + +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- diff --git a/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.h b/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.h index 74d08e017..845e8f74a 100644 --- a/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.h +++ b/Demos/Gpu3dDemo/btGpuDemoDynamicsWorld3D.h @@ -1,252 +1,252 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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_CUDA_DEMO_DYNAMICS_WORLD3D_H -#define BT_CUDA_DEMO_DYNAMICS_WORLD3D_H - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" - -//#define BT_USE_CUDA 1 -// To enable CUDA : -// 1. Uncomment //#define BT_USE_CUDA 1 -// 2. Build and add libbulletcuda (Extras/CUDA) to project -// 3. Add $(CUDA_LIB_PATH) and cudart.lib to linker properties - - -#ifdef BT_USE_CUDA - #include "BulletMultiThreaded/btGpuDefines.h" - #undef BT_GPU_PREF - #define BT_GPU_PREF(func) btCuda_##func - #include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#else - #include "BulletMultiThreaded/btGpuDefines.h" - #include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#endif - -#undef BT_GPU_PREF - - -#if 0 // ### -#include -#define BT_GPU_PREF(func) btCuda_##func -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#undef BT_GPU_PREF -#endif - -#include "btGpuDemo3dSharedTypes.h" - -//#define CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES 20 -#define CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES 15 - -class btCudaDemoDynamicsWorld3D : public btDiscreteDynamicsWorld -{ -protected: - int m_maxObj; - int m_maxNeihbors; - int m_maxConstr; - int m_maxPointsPerConstr; - - int m_numObj; - int m_numSimStep; - bool m_useCPUSolver; - bool m_useSeqImpSolver; - bool m_useCudaMotIntegr; - bool m_copyIntegrDataToGPU; - - -#ifdef BT_USE_CUDA - float4* m_dTrans; - float4* m_dVel; - float4* m_dAngVel; - int2* m_dIds; - int* m_dBatchIds; - float* m_dLambdaDtBox; - float* m_dPositionConstraint; - float3* m_dNormal; - float3* m_dContact; - float* m_dForceTorqueDamp; - float* m_dInvInertiaMass; -#endif - - float4* m_hTrans; - float4* m_hVel; - float4* m_hAngVel; - int* m_hConstraintBuffer; - int* m_hConstraintCounter; - int m_maxBatches; - int m_numBatches; - int m_numConstraints; - int2* m_hIds; - int* m_hBatchIds; - - int m_maxVtxPerObj; - - - // ------------- these are only needed for CPU version and for debugging - float* m_hLambdaDtBox; - float* m_hPositionConstraint; - float3* m_hNormal; - float3* m_hContact; - // ------------- - - btScalar m_objRad; - btVector3 m_worldMin; - btVector3 m_worldMax; - - //------------------------------- - int* m_hConstraintUsed; - - //------------------------------- - - float* m_hForceTorqueDamp; - float* m_hInvInertiaMass; - -public: - int m_numInBatches[CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES]; - - - btCudaDemoDynamicsWorld3D(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration, int maxPointsPerConstr = 4) - : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration) - { - m_useCPUSolver = false; - m_useSeqImpSolver = false; - m_useCudaMotIntegr = true; - m_copyIntegrDataToGPU = true; - m_maxObj = 32768; - m_maxNeihbors = 26; - m_maxConstr = m_maxObj * m_maxNeihbors; - int sz = m_maxConstr; - m_hConstraintBuffer = new int[sz]; - m_hConstraintCounter = new int[m_maxObj]; - m_maxBatches = CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES; - m_hIds = new int2[sz]; - m_hBatchIds = new int[sz]; - for(int i = 0; i < sz; i++) - { - m_hBatchIds[i] = -1; - } - m_hTrans = new float4[m_maxObj * 4]; - m_hVel = new float4[m_maxObj]; - m_hAngVel = new float4[m_maxObj]; - - m_maxPointsPerConstr = maxPointsPerConstr; - -#ifdef BT_USE_CUDA - btCuda_allocateArray((void**)&m_dTrans, sizeof(float4) * m_maxObj * 4); - btCuda_allocateArray((void**)&m_dVel, sizeof(float4) * m_maxObj); - btCuda_allocateArray((void**)&m_dAngVel, sizeof(float4) * m_maxObj); - - btCuda_allocateArray((void**)&m_dIds, sizeof(int2) * sz); - btCuda_allocateArray((void**)&m_dBatchIds, sizeof(int) * sz); - - - btCuda_allocateArray((void**)&m_dLambdaDtBox, sizeof(float) * sz * m_maxPointsPerConstr); - btCuda_allocateArray((void**)&m_dPositionConstraint, sizeof(float) * sz * m_maxPointsPerConstr); - btCuda_allocateArray((void**)&m_dNormal, sizeof(float3) * sz * m_maxPointsPerConstr); - btCuda_allocateArray((void**)&m_dContact, sizeof(float3) * sz * m_maxPointsPerConstr); - - btCuda_allocateArray((void**)&m_dForceTorqueDamp, sizeof(float) * m_maxObj * 4 * 2); - btCuda_allocateArray((void**)&m_dInvInertiaMass, sizeof(float) * m_maxObj * 4 * 3); -#endif - - m_hLambdaDtBox = new float[sz * m_maxPointsPerConstr]; - m_hPositionConstraint = new float[sz * m_maxPointsPerConstr]; - m_hNormal = new float3[sz * m_maxPointsPerConstr]; - m_hContact = new float3[sz * m_maxPointsPerConstr]; - - m_numSimStep = 0; - - m_objRad = 1.0f; - - m_hConstraintUsed = new int[sz]; - - m_hForceTorqueDamp = new float[m_maxObj * 4 * 2]; - m_hInvInertiaMass = new float[4 * m_maxObj * 3]; - - } - virtual ~btCudaDemoDynamicsWorld3D() - { - delete [] m_hConstraintBuffer; - delete [] m_hConstraintCounter; - delete [] m_hIds; - delete [] m_hBatchIds; - delete [] m_hTrans; - delete [] m_hVel; - delete [] m_hAngVel; - - delete [] m_hLambdaDtBox; - delete [] m_hPositionConstraint; - delete [] m_hNormal; - delete [] m_hContact; - delete [] m_hConstraintUsed; - - delete [] m_hForceTorqueDamp; - delete [] m_hInvInertiaMass; - - -#ifdef BT_USE_CUDA - btCuda_freeArray(m_dTrans); - btCuda_freeArray(m_dVel); - btCuda_freeArray(m_dAngVel); - - btCuda_freeArray(m_dIds); - btCuda_freeArray(m_dBatchIds); - btCuda_freeArray(m_dLambdaDtBox); - btCuda_freeArray(m_dPositionConstraint); - btCuda_freeArray(m_dNormal); - btCuda_freeArray(m_dContact); - btCuda_freeArray(m_dForceTorqueDamp); - btCuda_freeArray(m_dInvInertiaMass); -#endif - - } - virtual void calculateSimulationIslands() - { - if(m_useSeqImpSolver) - { - btDiscreteDynamicsWorld::calculateSimulationIslands(); - } - } - virtual void solveConstraints(btContactSolverInfo& solverInfo); - - virtual void predictUnconstraintMotion(btScalar timeStep); - virtual void integrateTransforms(btScalar timeStep); - - - - - void solveConstraintsCPU(btContactSolverInfo& solverInfo); - - void debugDrawConstraints(int selectedBatch, const float* pColorTab); - - void setObjRad(btScalar rad) { m_objRad = rad; } - void setWorldMin(const btVector3& worldMin) { m_worldMin = worldMin; } - void setWorldMax(const btVector3& worldMax) { m_worldMax = worldMax; } - - void grabData(); - void grabObjData(); - void grabConstrData(); - void createBatches(); - void copyDataToGPU(); - void copyDataFromGPU(); - void writebackData(); - void setUseCPUSolver(bool useCPU) { m_useCPUSolver = useCPU; } - void setUseSeqImpSolver(bool useSeqImpSolver) { m_useSeqImpSolver = useSeqImpSolver; } - void setUseCudaMotIntegr(bool useCudaMotIntegr) { m_useCudaMotIntegr = useCudaMotIntegr; } - void resetScene(void) { m_copyIntegrDataToGPU = true; } -}; - - -#endif //BT_CUDA_DEMO_DYNAMICS_WORLD3D_H +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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_CUDA_DEMO_DYNAMICS_WORLD3D_H +#define BT_CUDA_DEMO_DYNAMICS_WORLD3D_H + +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +//#define BT_USE_CUDA 1 +// To enable CUDA : +// 1. Uncomment //#define BT_USE_CUDA 1 +// 2. Build and add libbulletcuda (Extras/CUDA) to project +// 3. Add $(CUDA_LIB_PATH) and cudart.lib to linker properties + + +#ifdef BT_USE_CUDA + #include "BulletMultiThreaded/btGpuDefines.h" + #undef BT_GPU_PREF + #define BT_GPU_PREF(func) btCuda_##func + #include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#else + #include "BulletMultiThreaded/btGpuDefines.h" + #include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#endif + +#undef BT_GPU_PREF + + +#if 0 // ### +#include +#define BT_GPU_PREF(func) btCuda_##func +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#undef BT_GPU_PREF +#endif + +#include "btGpuDemo3dSharedTypes.h" + +//#define CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES 20 +#define CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES 15 + +class btCudaDemoDynamicsWorld3D : public btDiscreteDynamicsWorld +{ +protected: + int m_maxObj; + int m_maxNeihbors; + int m_maxConstr; + int m_maxPointsPerConstr; + + int m_numObj; + int m_numSimStep; + bool m_useCPUSolver; + bool m_useSeqImpSolver; + bool m_useCudaMotIntegr; + bool m_copyIntegrDataToGPU; + + +#ifdef BT_USE_CUDA + float4* m_dTrans; + float4* m_dVel; + float4* m_dAngVel; + int2* m_dIds; + int* m_dBatchIds; + float* m_dLambdaDtBox; + float* m_dPositionConstraint; + float3* m_dNormal; + float3* m_dContact; + float* m_dForceTorqueDamp; + float* m_dInvInertiaMass; +#endif + + float4* m_hTrans; + float4* m_hVel; + float4* m_hAngVel; + int* m_hConstraintBuffer; + int* m_hConstraintCounter; + int m_maxBatches; + int m_numBatches; + int m_numConstraints; + int2* m_hIds; + int* m_hBatchIds; + + int m_maxVtxPerObj; + + + // ------------- these are only needed for CPU version and for debugging + float* m_hLambdaDtBox; + float* m_hPositionConstraint; + float3* m_hNormal; + float3* m_hContact; + // ------------- + + btScalar m_objRad; + btVector3 m_worldMin; + btVector3 m_worldMax; + + //------------------------------- + int* m_hConstraintUsed; + + //------------------------------- + + float* m_hForceTorqueDamp; + float* m_hInvInertiaMass; + +public: + int m_numInBatches[CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES]; + + + btCudaDemoDynamicsWorld3D(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration, int maxPointsPerConstr = 4) + : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration) + { + m_useCPUSolver = false; + m_useSeqImpSolver = false; + m_useCudaMotIntegr = true; + m_copyIntegrDataToGPU = true; + m_maxObj = 32768; + m_maxNeihbors = 26; + m_maxConstr = m_maxObj * m_maxNeihbors; + int sz = m_maxConstr; + m_hConstraintBuffer = new int[sz]; + m_hConstraintCounter = new int[m_maxObj]; + m_maxBatches = CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES; + m_hIds = new int2[sz]; + m_hBatchIds = new int[sz]; + for(int i = 0; i < sz; i++) + { + m_hBatchIds[i] = -1; + } + m_hTrans = new float4[m_maxObj * 4]; + m_hVel = new float4[m_maxObj]; + m_hAngVel = new float4[m_maxObj]; + + m_maxPointsPerConstr = maxPointsPerConstr; + +#ifdef BT_USE_CUDA + btCuda_allocateArray((void**)&m_dTrans, sizeof(float4) * m_maxObj * 4); + btCuda_allocateArray((void**)&m_dVel, sizeof(float4) * m_maxObj); + btCuda_allocateArray((void**)&m_dAngVel, sizeof(float4) * m_maxObj); + + btCuda_allocateArray((void**)&m_dIds, sizeof(int2) * sz); + btCuda_allocateArray((void**)&m_dBatchIds, sizeof(int) * sz); + + + btCuda_allocateArray((void**)&m_dLambdaDtBox, sizeof(float) * sz * m_maxPointsPerConstr); + btCuda_allocateArray((void**)&m_dPositionConstraint, sizeof(float) * sz * m_maxPointsPerConstr); + btCuda_allocateArray((void**)&m_dNormal, sizeof(float3) * sz * m_maxPointsPerConstr); + btCuda_allocateArray((void**)&m_dContact, sizeof(float3) * sz * m_maxPointsPerConstr); + + btCuda_allocateArray((void**)&m_dForceTorqueDamp, sizeof(float) * m_maxObj * 4 * 2); + btCuda_allocateArray((void**)&m_dInvInertiaMass, sizeof(float) * m_maxObj * 4 * 3); +#endif + + m_hLambdaDtBox = new float[sz * m_maxPointsPerConstr]; + m_hPositionConstraint = new float[sz * m_maxPointsPerConstr]; + m_hNormal = new float3[sz * m_maxPointsPerConstr]; + m_hContact = new float3[sz * m_maxPointsPerConstr]; + + m_numSimStep = 0; + + m_objRad = 1.0f; + + m_hConstraintUsed = new int[sz]; + + m_hForceTorqueDamp = new float[m_maxObj * 4 * 2]; + m_hInvInertiaMass = new float[4 * m_maxObj * 3]; + + } + virtual ~btCudaDemoDynamicsWorld3D() + { + delete [] m_hConstraintBuffer; + delete [] m_hConstraintCounter; + delete [] m_hIds; + delete [] m_hBatchIds; + delete [] m_hTrans; + delete [] m_hVel; + delete [] m_hAngVel; + + delete [] m_hLambdaDtBox; + delete [] m_hPositionConstraint; + delete [] m_hNormal; + delete [] m_hContact; + delete [] m_hConstraintUsed; + + delete [] m_hForceTorqueDamp; + delete [] m_hInvInertiaMass; + + +#ifdef BT_USE_CUDA + btCuda_freeArray(m_dTrans); + btCuda_freeArray(m_dVel); + btCuda_freeArray(m_dAngVel); + + btCuda_freeArray(m_dIds); + btCuda_freeArray(m_dBatchIds); + btCuda_freeArray(m_dLambdaDtBox); + btCuda_freeArray(m_dPositionConstraint); + btCuda_freeArray(m_dNormal); + btCuda_freeArray(m_dContact); + btCuda_freeArray(m_dForceTorqueDamp); + btCuda_freeArray(m_dInvInertiaMass); +#endif + + } + virtual void calculateSimulationIslands() + { + if(m_useSeqImpSolver) + { + btDiscreteDynamicsWorld::calculateSimulationIslands(); + } + } + virtual void solveConstraints(btContactSolverInfo& solverInfo); + + virtual void predictUnconstraintMotion(btScalar timeStep); + virtual void integrateTransforms(btScalar timeStep); + + + + + void solveConstraintsCPU(btContactSolverInfo& solverInfo); + + void debugDrawConstraints(int selectedBatch, const float* pColorTab); + + void setObjRad(btScalar rad) { m_objRad = rad; } + void setWorldMin(const btVector3& worldMin) { m_worldMin = worldMin; } + void setWorldMax(const btVector3& worldMax) { m_worldMax = worldMax; } + + void grabData(); + void grabObjData(); + void grabConstrData(); + void createBatches(); + void copyDataToGPU(); + void copyDataFromGPU(); + void writebackData(); + void setUseCPUSolver(bool useCPU) { m_useCPUSolver = useCPU; } + void setUseSeqImpSolver(bool useSeqImpSolver) { m_useSeqImpSolver = useSeqImpSolver; } + void setUseCudaMotIntegr(bool useCudaMotIntegr) { m_useCudaMotIntegr = useCudaMotIntegr; } + void resetScene(void) { m_copyIntegrDataToGPU = true; } +}; + + +#endif //BT_CUDA_DEMO_DYNAMICS_WORLD3D_H diff --git a/Demos/Gpu3dDemo/main.cpp b/Demos/Gpu3dDemo/main.cpp index b3ab3c73b..f5eea8006 100644 --- a/Demos/Gpu3dDemo/main.cpp +++ b/Demos/Gpu3dDemo/main.cpp @@ -1,61 +1,61 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 "BasicDemo3d.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btHashMap.h" - -class OurValue - { - int m_uid; - - public: - OurValue(const btVector3& initialPos) - :m_position(initialPos) - { - static int gUid=0; - m_uid=gUid; - gUid++; - } - - btVector3 m_position; - int getUid() const - { - return m_uid; - } - }; - - -int main(int argc,char** argv) -{ - GLDebugDrawer gDebugDrawer; - - BasicDemo3D ccdDemo; - ccdDemo.initPhysics(); - ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - ccdDemo.setWireMode(false); - - -#ifdef CHECK_MEMORY_LEAKS - ccdDemo.exitPhysics(); -#else - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); -#endif - - //default glut doesn't return from mainloop - return 0; -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 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 "BasicDemo3d.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" + +class OurValue + { + int m_uid; + + public: + OurValue(const btVector3& initialPos) + :m_position(initialPos) + { + static int gUid=0; + m_uid=gUid; + gUid++; + } + + btVector3 m_position; + int getUid() const + { + return m_uid; + } + }; + + +int main(int argc,char** argv) +{ + GLDebugDrawer gDebugDrawer; + + BasicDemo3D ccdDemo; + ccdDemo.initPhysics(); + ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + ccdDemo.setWireMode(false); + + +#ifdef CHECK_MEMORY_LEAKS + ccdDemo.exitPhysics(); +#else + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); +#endif + + //default glut doesn't return from mainloop + return 0; +} diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp index 55d59b4c8..77976d003 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp @@ -1,1045 +1,1045 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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 "../../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 (); - m_voxelPositionsXformed = (btVector3*)btAlignedAlloc(sizeof(btVector3)*m_numVoxels, 16); - m_voxelSubmerged = (bool*)btAlignedAlloc(sizeof(bool)*m_numVoxels, 16); - 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; - } -} - -btHfFluidColumnRigidBodyCallback::~btHfFluidColumnRigidBodyCallback () -{ - if (m_voxelPositionsXformed) - btAlignedFree (m_voxelPositionsXformed); - if (m_voxelSubmerged) - btAlignedFree (m_voxelSubmerged); -} - -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; -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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 "../../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 (); + m_voxelPositionsXformed = (btVector3*)btAlignedAlloc(sizeof(btVector3)*m_numVoxels, 16); + m_voxelSubmerged = (bool*)btAlignedAlloc(sizeof(bool)*m_numVoxels, 16); + 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; + } +} + +btHfFluidColumnRigidBodyCallback::~btHfFluidColumnRigidBodyCallback () +{ + if (m_voxelPositionsXformed) + btAlignedFree (m_voxelPositionsXformed); + if (m_voxelSubmerged) + btAlignedFree (m_voxelSubmerged); +} + +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; +} + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h index ce6ed5caa..0017c07a0 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h @@ -1,243 +1,243 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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) - -///experimental buyancy fluid demo -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; - bool* m_voxelSubmerged; - 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); - ~btHfFluidColumnRigidBodyCallback (); - bool processColumn (btHfFluid* fluid, int w, int l); - btScalar getVolume () const { return m_volume; } -}; - -#endif - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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) + +///experimental buyancy fluid demo +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; + bool* m_voxelSubmerged; + 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); + ~btHfFluidColumnRigidBodyCallback (); + 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 index 8ca55deba..e222bd61d 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp @@ -1,195 +1,195 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ -#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 "btHfFluidBuoyantConvexShape.h" - -btHfFluidBuoyantConvexShape::btHfFluidBuoyantConvexShape (btConvexShape* convexShape) -{ - m_convexShape = convexShape; - m_shapeType = HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE; - m_radius = btScalar(0.f); - m_numVoxels = 0; - m_voxelPositions = NULL; - m_totalVolume = btScalar(0.0f); - m_floatyness = btScalar(1.5f); -} - -btHfFluidBuoyantConvexShape::~btHfFluidBuoyantConvexShape () -{ - if (m_voxelPositions) - btAlignedFree (m_voxelPositions); -} - -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); - btVector3* voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION,16); - 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)) - { - voxelPositions[m_numVoxels] = point; - m_numVoxels++; - } - } - } - } - } - m_voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*m_numVoxels, 16); - for (int i = 0; i < m_numVoxels;i++) - { - m_voxelPositions[i] = voxelPositions[i]; - } - btAlignedFree (voxelPositions); - m_volumePerVoxel = btScalar(4.0f)/btScalar(3.0f)*SIMD_PI*radius*radius*radius; - m_totalVolume = m_numVoxels * m_volumePerVoxel; - m_radius = radius; -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#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 "btHfFluidBuoyantConvexShape.h" + +btHfFluidBuoyantConvexShape::btHfFluidBuoyantConvexShape (btConvexShape* convexShape) +{ + m_convexShape = convexShape; + m_shapeType = HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE; + m_radius = btScalar(0.f); + m_numVoxels = 0; + m_voxelPositions = NULL; + m_totalVolume = btScalar(0.0f); + m_floatyness = btScalar(1.5f); +} + +btHfFluidBuoyantConvexShape::~btHfFluidBuoyantConvexShape () +{ + if (m_voxelPositions) + btAlignedFree (m_voxelPositions); +} + +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); + btVector3* voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION,16); + 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)) + { + voxelPositions[m_numVoxels] = point; + m_numVoxels++; + } + } + } + } + } + m_voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*m_numVoxels, 16); + for (int i = 0; i < m_numVoxels;i++) + { + m_voxelPositions[i] = voxelPositions[i]; + } + btAlignedFree (voxelPositions); + m_volumePerVoxel = btScalar(4.0f)/btScalar(3.0f)*SIMD_PI*radius*radius*radius; + m_totalVolume = m_numVoxels * m_volumePerVoxel; + m_radius = radius; +} + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h index 3346abd58..13948caa5 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h @@ -1,62 +1,62 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ -#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; -///experimental buyancy fluid demo -class btHfFluidBuoyantConvexShape : public btCollisionShape -{ -public: - btHfFluidBuoyantConvexShape (btConvexShape* convexShape); - ~btHfFluidBuoyantConvexShape (); - 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; - btConvexShape* m_convexShape; -}; - -#endif +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#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; +///experimental buyancy fluid demo +class btHfFluidBuoyantConvexShape : public btCollisionShape +{ +public: + btHfFluidBuoyantConvexShape (btConvexShape* convexShape); + ~btHfFluidBuoyantConvexShape (); + 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; + btConvexShape* m_convexShape; +}; + +#endif diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp index 81fd6af90..6273b4607 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp @@ -1,74 +1,74 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ -#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,0,0) -{ - 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; -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#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,0,0) +{ + 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 index a117c2e78..a744dc0ac 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h @@ -1,87 +1,87 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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; - -///experimental buyancy fluid demo -/// 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 +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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; + +///experimental buyancy fluid demo +/// 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 index 2f526f1d3..71820923e 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp @@ -1,18 +1,18 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ -#include "btHfFluidCollisionShape.h" - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#include "btHfFluidCollisionShape.h" + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h index 2a83442f7..bf24670bf 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h @@ -1,94 +1,94 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ -#ifndef BT_HF_FLUID_COLLISION_SHAPE_H -#define BT_HF_FLUID_COLLISION_SHAPE_H - -#include "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 +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#ifndef BT_HF_FLUID_COLLISION_SHAPE_H +#define BT_HF_FLUID_COLLISION_SHAPE_H + +#include "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 index 06c45e0f8..7584fff2a 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp @@ -1,133 +1,133 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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); -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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 index 598d92622..a72eb34e0 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h @@ -1,81 +1,81 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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; - -///experimental buyancy fluid demo -/// 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 +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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; + +///experimental buyancy fluid demo +/// 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 index d87a09e31..f828ec130 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp @@ -1,88 +1,88 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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); -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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); +} + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h index 458835230..7860d586a 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h @@ -1,47 +1,47 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#ifndef BT_HFFLUID_RIGID_COLLISION_CONFIGURATION -#define BT_HFFLUID_RIGID_COLLISION_CONFIGURATION - -#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" - -class btVoronoiSimplexSolver; -class btGjkEpaPenetrationDepthSolver; - -///experimental buyancy fluid demo -///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 - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef BT_HFFLUID_RIGID_COLLISION_CONFIGURATION +#define BT_HFFLUID_RIGID_COLLISION_CONFIGURATION + +#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" + +class btVoronoiSimplexSolver; +class btGjkEpaPenetrationDepthSolver; + +///experimental buyancy fluid demo +///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 index 17b1fcd68..79d44b820 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp @@ -1,273 +1,273 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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))); - } - } -} - -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(); -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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))); + } + } +} + +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 index 7e06d4218..39fb2ebfa 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h @@ -1,92 +1,92 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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; - -///experimental buyancy fluid demo -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 +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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; + +///experimental buyancy fluid demo +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/HfFluidDemo.cpp b/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp index 3edb2067f..1c07777e6 100644 --- a/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp +++ b/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp @@ -1,1457 +1,1457 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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 //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 = btMax(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, -}; - -btScalar g_ele_array[NUM_DEMOS] = { - btScalar(10), - btScalar(45), - btScalar(35), - btScalar(35), - btScalar(10), - btScalar(10), - btScalar(35), - btScalar(45), - btScalar(35), - btScalar(20), - btScalar(20), -}; - -btScalar g_azi_array[NUM_DEMOS] = { - btScalar(0), - btScalar(55), - btScalar(245), - btScalar(270), - btScalar(55), - btScalar(55), - btScalar(180), - btScalar(205), - btScalar(255), - btScalar(305), - btScalar(305), -}; - -btScalar g_cameraDistance_array[NUM_DEMOS] = { - btScalar(20), - btScalar(29), - btScalar(43), - btScalar(26), - btScalar(77), - btScalar(77), - btScalar(77), - btScalar(32), - btScalar(62), - btScalar(70), - btScalar(70), -}; - -#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=btDot(m_impact,N); - const btScalar den=btDot(N,rayDir); - if((den*den)>0) - { - const btScalar num=O-btDot(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); - m_azi = g_azi_array[current_demo]; - m_ele = g_ele_array[current_demo]; - m_cameraDistance = g_cameraDistance_array[current_demo]; - updateCamera(); - 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 //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 = btMax(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, +}; + +btScalar g_ele_array[NUM_DEMOS] = { + btScalar(10), + btScalar(45), + btScalar(35), + btScalar(35), + btScalar(10), + btScalar(10), + btScalar(35), + btScalar(45), + btScalar(35), + btScalar(20), + btScalar(20), +}; + +btScalar g_azi_array[NUM_DEMOS] = { + btScalar(0), + btScalar(55), + btScalar(245), + btScalar(270), + btScalar(55), + btScalar(55), + btScalar(180), + btScalar(205), + btScalar(255), + btScalar(305), + btScalar(305), +}; + +btScalar g_cameraDistance_array[NUM_DEMOS] = { + btScalar(20), + btScalar(29), + btScalar(43), + btScalar(26), + btScalar(77), + btScalar(77), + btScalar(77), + btScalar(32), + btScalar(62), + btScalar(70), + btScalar(70), +}; + +#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=btDot(m_impact,N); + const btScalar den=btDot(N,rayDir); + if((den*den)>0) + { + const btScalar num=O-btDot(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); + m_azi = g_azi_array[current_demo]; + m_ele = g_ele_array[current_demo]; + m_cameraDistance = g_cameraDistance_array[current_demo]; + updateCamera(); + 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 - - - - - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef HFFLUID_DEMO_H +#define HFFLUID_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "BulletHfFluid/btHfFluid.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +class btHfFluidRigidDynamicsWorld; +///collisions between a btSoftBody and a btRigidBody +class btFluidRididCollisionAlgorithm; + +///experimental buyancy fluid demo +///CcdPhysicsDemo shows basic stacking using Bullet physics, and allows toggle of Ccd (using key '1') +class HfFluidDemo : public GlutDemoApplication +{ +public: + btAlignedObjectArray 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 index 5b5cd11e8..33f2e032e 100644 --- a/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp +++ b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp @@ -1,606 +1,606 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#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 //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(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT)); -btVector3 aabbMin(-btScalar(BT_LARGE_FLOAT),-btScalar(BT_LARGE_FLOAT),-btScalar(BT_LARGE_FLOAT)); -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=btDot(sc->m_edges[i].n[0],extrusion); - if((d*btDot(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() -{ -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#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 //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(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT)); +btVector3 aabbMin(-btScalar(BT_LARGE_FLOAT),-btScalar(BT_LARGE_FLOAT),-btScalar(BT_LARGE_FLOAT)); +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=btDot(sc->m_edges[i].n[0],extrusion); + if((d*btDot(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() +{ +} + diff --git a/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h index 6a2d3ecb6..6d4a2a045 100644 --- a/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h +++ b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h @@ -1,37 +1,37 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com - -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. - -Experimental Buoyancy fluid demo written by John McCutchan -*/ - -#ifndef HFFLUID_GL_SHAPE_DRAWER_H -#define HFFLUID_GL_SHAPE_DRAWER_H - -#include "GL_ShapeDrawer.h" - -///experimental buyancy fluid demo -/// 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 +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +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. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef HFFLUID_GL_SHAPE_DRAWER_H +#define HFFLUID_GL_SHAPE_DRAWER_H + +#include "GL_ShapeDrawer.h" + +///experimental buyancy fluid demo +/// 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/HelloWorld/HelloWorld.cpp b/Demos/HelloWorld/HelloWorld.cpp index ebd8982b7..c312667b5 100644 --- a/Demos/HelloWorld/HelloWorld.cpp +++ b/Demos/HelloWorld/HelloWorld.cpp @@ -1,172 +1,172 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 - -/// This is a Hello World program for running a basic Bullet physics simulation - -int main(int argc, char** argv) -{ - - int i; - - ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration. - btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); - - ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep. - btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase(); - - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; - - btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration); - - dynamicsWorld->setGravity(btVector3(0,-10,0)); - - ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); - - //keep track of the shapes, we release memory at exit. - //make sure to re-use collision shapes among rigid bodies whenever possible! - btAlignedObjectArray collisionShapes; - - collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-56,0)); - - { - btScalar mass(0.); - - //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) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - dynamicsWorld->addRigidBody(body); - } - - - { - //create a dynamic rigidbody - - //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); - btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - 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); - - startTransform.setOrigin(btVector3(2,10,0)); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - dynamicsWorld->addRigidBody(body); - } - - - -/// Do some simulation - - - - for (i=0;i<100;i++) - { - dynamicsWorld->stepSimulation(1.f/60.f,10); - - //print positions of all objects - for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--) - { - btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j]; - btRigidBody* body = btRigidBody::upcast(obj); - if (body && body->getMotionState()) - { - btTransform trans; - body->getMotionState()->getWorldTransform(trans); - printf("world pos = %f,%f,%f\n",float(trans.getOrigin().getX()),float(trans.getOrigin().getY()),float(trans.getOrigin().getZ())); - } - } - } - - - //cleanup in the reverse order of creation/initialization - - //remove the rigidbodies from the dynamics world and delete them - for (i=dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) - { - btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i]; - btRigidBody* body = btRigidBody::upcast(obj); - if (body && body->getMotionState()) - { - delete body->getMotionState(); - } - dynamicsWorld->removeCollisionObject( obj ); - delete obj; - } - - //delete collision shapes - for (int j=0;j + +/// This is a Hello World program for running a basic Bullet physics simulation + +int main(int argc, char** argv) +{ + + int i; + + ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration. + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + + ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep. + btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase(); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + + btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration); + + dynamicsWorld->setGravity(btVector3(0,-10,0)); + + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + + //keep track of the shapes, we release memory at exit. + //make sure to re-use collision shapes among rigid bodies whenever possible! + btAlignedObjectArray collisionShapes; + + collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-56,0)); + + { + btScalar mass(0.); + + //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) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + dynamicsWorld->addRigidBody(body); + } + + + { + //create a dynamic rigidbody + + //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + 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); + + startTransform.setOrigin(btVector3(2,10,0)); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + dynamicsWorld->addRigidBody(body); + } + + + +/// Do some simulation + + + + for (i=0;i<100;i++) + { + dynamicsWorld->stepSimulation(1.f/60.f,10); + + //print positions of all objects + for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--) + { + btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + btTransform trans; + body->getMotionState()->getWorldTransform(trans); + printf("world pos = %f,%f,%f\n",float(trans.getOrigin().getX()),float(trans.getOrigin().getY()),float(trans.getOrigin().getZ())); + } + } + } + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + for (i=dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;jm_collisionFlags |= btCollisionObject::customMaterialCallback; -inline btScalar calculateCombinedFriction(float friction0,float friction1) -{ - return 0.f; - 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; -} - - -/////////////////////////////////////////////////////////////// - - -static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) -{ - - if (enable) - { - btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); - //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE); - //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED); - } - - 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; - - const int NUM_VERTS_X = 2; - const int NUM_VERTS_Y = 2; - const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - -void InternalEdgeDemo::setVertexPositions(float waveheight, float offset) -{ - int i; - int j; - - for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->setActivationState(DISABLE_DEACTIVATION); - } else - { - staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->forceActivationState(ACTIVE_TAG); - } - } - - DemoApplication::keyboardCallback(key,x,y); - -} - - - -void InternalEdgeDemo::initPhysics() -{ - - setTexturing(true); - setShadows(false);//true); - - #define TRISIZE 10.f - - gContactAddedCallback = CustomMaterialCombinerCallback; - -#define USE_TRIMESH_SHAPE 1 -#ifdef USE_TRIMESH_SHAPE - - int vertStride = sizeof(btVector3); - int indexStride = 3*sizeof(int); - - - const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); - - gVertices = new btVector3[totalVerts]; - gIndices = new int[totalTriangles*3]; - - int i; - - - setVertexPositions(waveheight,0.f); - - - //gVertices[1].setY(21.1); - //gVertices[1].setY(121.1); - gVertices[1].setY(.1f); - -#ifdef ROTATE_GROUND - //gVertices[1].setY(-1.1); -#else - //gVertices[1].setY(0.1); - //gVertices[1].setY(-0.1); - //gVertices[1].setY(-20.1); - //gVertices[1].setY(-20); -#endif - - int index=0; - for ( i=0;igetOptimizedBvh()->calculateSerializeBufferSize(); - buffer = btAlignedAlloc(numBytes,16); - bool swapEndian = false; - trimeshShape->getOptimizedBvh()->serialize(buffer,numBytes,swapEndian); - FILE* file = fopen("bvh.bin","wb"); - fwrite(buffer,1,numBytes,file); - fclose(file); - btAlignedFree(buffer); - - - -#else - - trimeshShape = new btBvhTriangleMeshShape(m_indexVertexArrays,useQuantizedAabbCompression,false); - - char* fileName = "bvh.bin"; - - FILE* file = fopen(fileName,"rb"); - int size=0; - btOptimizedBvh* bvh = 0; - - if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ - printf("Error: cannot get filesize from %s\n", fileName); - exit(0); - } else - { - - fseek(file, 0, SEEK_SET); - - int buffersize = size+btOptimizedBvh::getAlignmentSerializationPadding(); - - void* buffer = btAlignedAlloc(buffersize,16); - int read = fread(buffer,1,size,file); - fclose(file); - bool swapEndian = false; - bvh = btOptimizedBvh::deSerializeInPlace(buffer,buffersize,swapEndian); - } - - trimeshShape->setOptimizedBvh(bvh); - -#endif - - btCollisionShape* groundShape = trimeshShape; - - btTriangleInfoMap* triangleInfoMap = new btTriangleInfoMap(); - - - btGenerateInternalEdgeInfo(trimeshShape,triangleInfoMap); - - - -#else - btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); - - m_collisionShapes.push_back(groundShape); - -#endif //USE_TRIMESH_SHAPE - - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_collisionConfiguration->setConvexConvexMultipointIterations(10,5); - - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - - btVector3 worldMin(-1000,-1000,-1000); - btVector3 worldMax(1000,1000,1000); - m_broadphase = new btAxisSweep3(worldMin,worldMax); - m_solver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - m_dynamicsWorld->getSolverInfo().m_splitImpulse = true; - m_dynamicsWorld->getSolverInfo().m_splitImpulsePenetrationThreshold = 1e30f; - m_dynamicsWorld->getSolverInfo().m_maxErrorReduction = 1e30f; - m_dynamicsWorld->getSolverInfo().m_erp =1.f; - m_dynamicsWorld->getSolverInfo().m_erp2 = 1.f; - - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - - - float mass = 0.f; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,-2,0)); - - btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); - //colShape->setMargin(0.f); - colShape->setMargin(0.1f); - - - m_collisionShapes.push_back(colShape); - - { - for (int i=0;i<1;i++) - { - startTransform.setOrigin(btVector3(-10.f+i*3.f,1.f+btScalar(i)*0.1f,-1.3f)); - btRigidBody* body = localCreateRigidBody(100, startTransform,colShape); - body->setActivationState(DISABLE_DEACTIVATION); - body->setLinearVelocity(btVector3(0,0,-1)); - } - } - - startTransform.setIdentity(); -#ifdef ROTATE_GROUND - btQuaternion orn(btVector3(0,0,1),SIMD_PI); - startTransform.setOrigin(btVector3(-20,0,0)); - startTransform.setRotation(orn); -#endif //ROTATE_GROUND - - staticBody = localCreateRigidBody(mass, startTransform,groundShape); - //staticBody->setContactProcessingThreshold(-0.031f); - staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);//STATIC_OBJECT); - - //enable custom material callback - staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - - getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btSetDebugDrawer(&gDebugDrawer); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - -} - - -void InternalEdgeDemo::clientResetScene() -{ - DemoApplication::clientResetScene(); - for (int i=0;igetNumCollisionObjects();i++) - { - btCollisionObject* colobj = m_dynamicsWorld->getCollisionObjectArray()[i]; - btRigidBody* body = btRigidBody::upcast(colobj); - if (body && body->getInvMass() != 0.f) - { - - body->setLinearVelocity(btVector3(0,0,-1)); - } - - } -} - -void InternalEdgeDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - if (m_animatedMesh) - { - static float offset=0.f; - offset+=0.01f; - - // setVertexPositions(waveheight,offset); -#if 0 ///not currently supported, we need to update the btInternalTriangleInfoMap - int i; - int j; - btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); - btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); - - for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); -#else - btVector3 aabbMin,aabbMax; - trimeshShape->getMeshInterface()->calculateAabbBruteForce(aabbMin,aabbMax); - trimeshShape->refitTree(aabbMin,aabbMax); - -#endif - - //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - } - - - - m_dynamicsWorld->stepSimulation(dt); - ///enable one of the following to debug (render debug lines each frame) - //m_dynamicsWorld->stepSimulation(1./800.,0); - //m_dynamicsWorld->stepSimulation(1./60.,100,1./800.); - //m_dynamicsWorld->stepSimulation(1./60.,0); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - - renderme(); - - glFlush(); - swapBuffers(); - -} - - - - -void InternalEdgeDemo::displayCallback(void) { - - clientMoveAndDisplay(); - /* - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - - glFlush(); - glutSwapBuffers(); - */ - -} - - - -void InternalEdgeDemo::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;jm_collisionFlags |= btCollisionObject::customMaterialCallback; +inline btScalar calculateCombinedFriction(float friction0,float friction1) +{ + return 0.f; + 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; +} + + +/////////////////////////////////////////////////////////////// + + +static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + if (enable) + { + btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); + //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE); + //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED); + } + + 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; + + const int NUM_VERTS_X = 2; + const int NUM_VERTS_Y = 2; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void InternalEdgeDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + + + +void InternalEdgeDemo::initPhysics() +{ + + setTexturing(true); + setShadows(false);//true); + + #define TRISIZE 10.f + + gContactAddedCallback = CustomMaterialCombinerCallback; + +#define USE_TRIMESH_SHAPE 1 +#ifdef USE_TRIMESH_SHAPE + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + + int i; + + + setVertexPositions(waveheight,0.f); + + + //gVertices[1].setY(21.1); + //gVertices[1].setY(121.1); + gVertices[1].setY(.1f); + +#ifdef ROTATE_GROUND + //gVertices[1].setY(-1.1); +#else + //gVertices[1].setY(0.1); + //gVertices[1].setY(-0.1); + //gVertices[1].setY(-20.1); + //gVertices[1].setY(-20); +#endif + + int index=0; + for ( i=0;igetOptimizedBvh()->calculateSerializeBufferSize(); + buffer = btAlignedAlloc(numBytes,16); + bool swapEndian = false; + trimeshShape->getOptimizedBvh()->serialize(buffer,numBytes,swapEndian); + FILE* file = fopen("bvh.bin","wb"); + fwrite(buffer,1,numBytes,file); + fclose(file); + btAlignedFree(buffer); + + + +#else + + trimeshShape = new btBvhTriangleMeshShape(m_indexVertexArrays,useQuantizedAabbCompression,false); + + char* fileName = "bvh.bin"; + + FILE* file = fopen(fileName,"rb"); + int size=0; + btOptimizedBvh* bvh = 0; + + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", fileName); + exit(0); + } else + { + + fseek(file, 0, SEEK_SET); + + int buffersize = size+btOptimizedBvh::getAlignmentSerializationPadding(); + + void* buffer = btAlignedAlloc(buffersize,16); + int read = fread(buffer,1,size,file); + fclose(file); + bool swapEndian = false; + bvh = btOptimizedBvh::deSerializeInPlace(buffer,buffersize,swapEndian); + } + + trimeshShape->setOptimizedBvh(bvh); + +#endif + + btCollisionShape* groundShape = trimeshShape; + + btTriangleInfoMap* triangleInfoMap = new btTriangleInfoMap(); + + + btGenerateInternalEdgeInfo(trimeshShape,triangleInfoMap); + + + +#else + btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); + + m_collisionShapes.push_back(groundShape); + +#endif //USE_TRIMESH_SHAPE + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_collisionConfiguration->setConvexConvexMultipointIterations(10,5); + + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_broadphase = new btAxisSweep3(worldMin,worldMax); + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld->getSolverInfo().m_splitImpulse = true; + m_dynamicsWorld->getSolverInfo().m_splitImpulsePenetrationThreshold = 1e30f; + m_dynamicsWorld->getSolverInfo().m_maxErrorReduction = 1e30f; + m_dynamicsWorld->getSolverInfo().m_erp =1.f; + m_dynamicsWorld->getSolverInfo().m_erp2 = 1.f; + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-2,0)); + + btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + //colShape->setMargin(0.f); + colShape->setMargin(0.1f); + + + m_collisionShapes.push_back(colShape); + + { + for (int i=0;i<1;i++) + { + startTransform.setOrigin(btVector3(-10.f+i*3.f,1.f+btScalar(i)*0.1f,-1.3f)); + btRigidBody* body = localCreateRigidBody(100, startTransform,colShape); + body->setActivationState(DISABLE_DEACTIVATION); + body->setLinearVelocity(btVector3(0,0,-1)); + } + } + + startTransform.setIdentity(); +#ifdef ROTATE_GROUND + btQuaternion orn(btVector3(0,0,1),SIMD_PI); + startTransform.setOrigin(btVector3(-20,0,0)); + startTransform.setRotation(orn); +#endif //ROTATE_GROUND + + staticBody = localCreateRigidBody(mass, startTransform,groundShape); + //staticBody->setContactProcessingThreshold(-0.031f); + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);//STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btSetDebugDrawer(&gDebugDrawer); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + +} + + +void InternalEdgeDemo::clientResetScene() +{ + DemoApplication::clientResetScene(); + for (int i=0;igetNumCollisionObjects();i++) + { + btCollisionObject* colobj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(colobj); + if (body && body->getInvMass() != 0.f) + { + + body->setLinearVelocity(btVector3(0,0,-1)); + } + + } +} + +void InternalEdgeDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + // setVertexPositions(waveheight,offset); +#if 0 ///not currently supported, we need to update the btInternalTriangleInfoMap + int i; + int j; + btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); + btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); + + for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); +#else + btVector3 aabbMin,aabbMax; + trimeshShape->getMeshInterface()->calculateAabbBruteForce(aabbMin,aabbMax); + trimeshShape->refitTree(aabbMin,aabbMax); + +#endif + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + + + m_dynamicsWorld->stepSimulation(dt); + ///enable one of the following to debug (render debug lines each frame) + //m_dynamicsWorld->stepSimulation(1./800.,0); + //m_dynamicsWorld->stepSimulation(1./60.,100,1./800.); + //m_dynamicsWorld->stepSimulation(1./60.,0); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + + renderme(); + + glFlush(); + swapBuffers(); + +} + + + + +void InternalEdgeDemo::displayCallback(void) { + + clientMoveAndDisplay(); + /* + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + + glFlush(); + glutSwapBuffers(); + */ + +} + + + +void InternalEdgeDemo::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_collisionShapes; - - btTriangleIndexVertexArray* m_indexVertexArrays; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - bool m_animatedMesh; - - public: - - InternalEdgeDemo() : m_animatedMesh(true) - { - - } - void initPhysics(); - - void exitPhysics(); - - virtual ~InternalEdgeDemo() - { - exitPhysics(); - } - - virtual void clientResetScene(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - //to show refit works - void setVertexPositions(float waveheight, float offset); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - InternalEdgeDemo* demo = new InternalEdgeDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - }; -}; - -#endif //CONCAVE_DEMO_H - +/* +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 CONCAVE_DEMO_H +#define CONCAVE_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleIndexVertexArray; + +///InternalEdgeDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class InternalEdgeDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + InternalEdgeDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~InternalEdgeDemo() + { + exitPhysics(); + } + + virtual void clientResetScene(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + InternalEdgeDemo* demo = new InternalEdgeDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_DEMO_H + diff --git a/Demos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp b/Demos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp index d2ff2fc13..f55071383 100644 --- a/Demos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp +++ b/Demos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "InternalEdgeDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new InternalEdgeDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "InternalEdgeDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new InternalEdgeDemo(); +} + +#endif diff --git a/Demos/MiniCL_VectorAdd/MiniCL_VectorAdd.cpp b/Demos/MiniCL_VectorAdd/MiniCL_VectorAdd.cpp index 890d1e384..f387b914e 100644 --- a/Demos/MiniCL_VectorAdd/MiniCL_VectorAdd.cpp +++ b/Demos/MiniCL_VectorAdd/MiniCL_VectorAdd.cpp @@ -1,188 +1,188 @@ - -///VectorAdd sample, from the NVidia JumpStart Guide -///http://developer.download.nvidia.com/OpenCL/NVIDIA_OpenCL_JumpStart_Guide.pdf - -///Instead of #include we include -///Apart from this include file, all other code should compile and work on OpenCL compliant implementation - -#define USE_MINICL 1 -#ifdef USE_MINICL -#include "MiniCL/cl.h" -#else //USE_MINICL -#include -#endif//USE_MINICL - -#include -#include -#include - - -void printDevInfo(cl_device_id device) -{ - char device_string[1024]; - - clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(device_string), &device_string, NULL); - printf( " Device %s:\n", device_string); - - // CL_DEVICE_INFO - cl_device_type type; - clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(type), &type, NULL); - if( type & CL_DEVICE_TYPE_CPU ) - printf(" CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_CPU"); - if( type & CL_DEVICE_TYPE_GPU ) - printf( " CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_GPU"); - if( type & CL_DEVICE_TYPE_ACCELERATOR ) - printf( " CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_ACCELERATOR"); - if( type & CL_DEVICE_TYPE_DEFAULT ) - printf( " CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_DEFAULT"); - - // CL_DEVICE_MAX_COMPUTE_UNITS - cl_uint compute_units; - clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL); - printf( " CL_DEVICE_MAX_COMPUTE_UNITS:\t%d\n", compute_units); - - // CL_DEVICE_MAX_WORK_GROUP_SIZE - size_t workitem_size[3]; - clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof(workitem_size), &workitem_size, NULL); - printf( " CL_DEVICE_MAX_WORK_ITEM_SIZES:\t%d / %d / %d \n", workitem_size[0], workitem_size[1], workitem_size[2]); - -} - - - - -// Main function -// ********************************************************************* -int main(int argc, char **argv) -{ - void *srcA, *srcB, *dst; // Host buffers for OpenCL test - cl_context cxGPUContext; // OpenCL context - cl_command_queue cqCommandQue; // OpenCL command que - cl_device_id* cdDevices; // OpenCL device list - cl_program cpProgram; // OpenCL program - cl_kernel ckKernel; // OpenCL kernel - cl_mem cmMemObjs[3]; // OpenCL memory buffer objects: 3 for device - size_t szGlobalWorkSize[1]; // 1D var for Total # of work items - size_t szLocalWorkSize[1]; // 1D var for # of work items in the work group - size_t szParmDataBytes; // Byte size of context information - cl_int ciErr1, ciErr2; // Error code var - int iTestN = 100000 * 8; // Size of Vectors to process - - // set Global and Local work size dimensions - szGlobalWorkSize[0] = iTestN >> 3; // do 8 computations per work item - szLocalWorkSize[0]= iTestN>>3; - - - // Allocate and initialize host arrays - srcA = (void *)malloc (sizeof(cl_float) * iTestN); - srcB = (void *)malloc (sizeof(cl_float) * iTestN); - dst = (void *)malloc (sizeof(cl_float) * iTestN); - - int i; - - // Initialize arrays with some values - for (i=0;i we include +///Apart from this include file, all other code should compile and work on OpenCL compliant implementation + +#define USE_MINICL 1 +#ifdef USE_MINICL +#include "MiniCL/cl.h" +#else //USE_MINICL +#include +#endif//USE_MINICL + +#include +#include +#include + + +void printDevInfo(cl_device_id device) +{ + char device_string[1024]; + + clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(device_string), &device_string, NULL); + printf( " Device %s:\n", device_string); + + // CL_DEVICE_INFO + cl_device_type type; + clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(type), &type, NULL); + if( type & CL_DEVICE_TYPE_CPU ) + printf(" CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_CPU"); + if( type & CL_DEVICE_TYPE_GPU ) + printf( " CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_GPU"); + if( type & CL_DEVICE_TYPE_ACCELERATOR ) + printf( " CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_ACCELERATOR"); + if( type & CL_DEVICE_TYPE_DEFAULT ) + printf( " CL_DEVICE_TYPE:\t\t%s\n", "CL_DEVICE_TYPE_DEFAULT"); + + // CL_DEVICE_MAX_COMPUTE_UNITS + cl_uint compute_units; + clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL); + printf( " CL_DEVICE_MAX_COMPUTE_UNITS:\t%d\n", compute_units); + + // CL_DEVICE_MAX_WORK_GROUP_SIZE + size_t workitem_size[3]; + clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof(workitem_size), &workitem_size, NULL); + printf( " CL_DEVICE_MAX_WORK_ITEM_SIZES:\t%d / %d / %d \n", workitem_size[0], workitem_size[1], workitem_size[2]); + +} + + + + +// Main function +// ********************************************************************* +int main(int argc, char **argv) +{ + void *srcA, *srcB, *dst; // Host buffers for OpenCL test + cl_context cxGPUContext; // OpenCL context + cl_command_queue cqCommandQue; // OpenCL command que + cl_device_id* cdDevices; // OpenCL device list + cl_program cpProgram; // OpenCL program + cl_kernel ckKernel; // OpenCL kernel + cl_mem cmMemObjs[3]; // OpenCL memory buffer objects: 3 for device + size_t szGlobalWorkSize[1]; // 1D var for Total # of work items + size_t szLocalWorkSize[1]; // 1D var for # of work items in the work group + size_t szParmDataBytes; // Byte size of context information + cl_int ciErr1, ciErr2; // Error code var + int iTestN = 100000 * 8; // Size of Vectors to process + + // set Global and Local work size dimensions + szGlobalWorkSize[0] = iTestN >> 3; // do 8 computations per work item + szLocalWorkSize[0]= iTestN>>3; + + + // Allocate and initialize host arrays + srcA = (void *)malloc (sizeof(cl_float) * iTestN); + srcB = (void *)malloc (sizeof(cl_float) * iTestN); + dst = (void *)malloc (sizeof(cl_float) * iTestN); + + int i; + + // Initialize arrays with some values + for (i=0;im_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; - - - -int main(int argc,char** argv) -{ - gContactAddedCallback = CustomMaterialCombinerCallback; - - ConcaveDemo* concaveDemo = new ConcaveDemo(); - concaveDemo->initPhysics(); - concaveDemo->setCameraDistance(30.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,"Moving Concave Mesh Demo",concaveDemo); -} - -void ConcaveDemo::renderme() -{ - updateCamera(); - - btScalar m[16]; - - if (m_dynamicsWorld) - { - btVector3 worldBoundsMin,worldBoundsMax; - getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); - - - int numObjects = m_dynamicsWorld->getNumCollisionObjects(); - btVector3 wireColor(1,0,0); - for (int i=0;igetCollisionObjectArray()[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 (1.f,0.f,0.f); - } else - { - wireColor += btVector3 (.5f,0.f,0.f); - } - } - if (colObj->getActivationState() == 2) //ISLAND_SLEEPING - { - if (i & 1) - { - wireColor += btVector3 (0.f,1.f, 0.f); - } else - { - wireColor += btVector3 (0.f,0.5f,0.f); - } - } - - m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); - } - - - float xOffset = 10.f; - float yStart = 20.f; - float yIncr = 20.f; - char buf[124]; - - glColor3f(0, 0, 0); - - setOrthographicProjection(); - - sprintf(buf,"mouse to interact"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - /* glRasterPos3f(xOffset,xOffset,0); - sprintf(buf,"space to reset"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - */ - - sprintf(buf,"cursor keys and z,x to navigate"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - - sprintf(buf,"i to toggle simulation, s single step"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - - sprintf(buf,"q to quit"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - - sprintf(buf,". to shoot TRIMESH (dot)"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - // not yet hooked up again after refactoring... - -/* glRasterPos3f(xOffset,xOffset,0); - sprintf(buf,"d to toggle deactivation"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; -*/ - - /* - glRasterPos3f(xOffset,xOffset,0); - sprintf(buf,"a to draw temporal AABBs"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - */ - - - sprintf(buf,"h to toggle help text"); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); - - bool useCCD = ((getDebugMode() & btIDebugDraw::DBG_EnableCCD) != 0); - - - sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - - sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); - GLDebugDrawString(xOffset,xOffset,buf); - xOffset += yIncr; - - resetPerspectiveProjection(); - - - } - -} - - - -void ConcaveDemo::initGImpactCollision() -{ - // create trimesh - btTriangleIndexVertexArray* indexVertexArrays = new btTriangleIndexVertexArray(NUM_TRIANGLES, - &gIndices[0][0], - 3*sizeof(int), - NUM_VERTICES,(REAL*) &gVertices[0],sizeof(REAL)*3); - - btGImpactMeshShape * trimesh = new btGImpactMeshShape(indexVertexArrays); - trimesh->setLocalScaling(btVector3(4.f,4.f,4.f)); - trimesh->updateBound(); - m_trimeshShape = trimesh; - - //register algorithm - - btCollisionDispatcher * dispatcher = static_cast(m_dynamicsWorld ->getDispatcher()); - btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); - -} - -void ConcaveDemo::initPhysics() -{ - - btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); - - //btConstraintSolver* solver = new btSequentialImpulseConstraintSolver; - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); - //btOverlappingPairCache* broadphase = new btSimpleBroadphase(); - btBroadphaseInterface* broadphase = new btSimpleBroadphase(); - - btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,constraintSolver,collisionConfiguration); - - - //create trimesh model and shape - initGImpactCollision(); - - - - 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,0,0)); - staticScenario->addChildShape(startTransform,staticboxShape1); - startTransform.setOrigin(btVector3(-200,25,0)); - staticScenario->addChildShape(startTransform,staticboxShape2); - startTransform.setOrigin(btVector3(200,25,0)); - staticScenario->addChildShape(startTransform,staticboxShape3); - startTransform.setOrigin(btVector3(0,25,200)); - staticScenario->addChildShape(startTransform,staticboxShape4); - startTransform.setOrigin(btVector3(0,25,-200)); - staticScenario->addChildShape(startTransform,staticboxShape5); - - startTransform.setOrigin(btVector3(0,0,0)); - - btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticScenario); - - staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); - - //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,0,0)); - - btRigidBody* staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape6 ); - - staticBody2->setCollisionFlags(staticBody2->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); - - { - 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); - } - } - - shootTrimesh(btVector3(0,10,0),btVector3(0,0,0)); - - shootTrimesh(btVector3(0,20,0),btVector3(0,10,0)); - - //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; - -} - -void ConcaveDemo::keyboardCallback(unsigned char key, int x, int y) -{ - m_lastKey = 0; - - switch (key) - { - case 'q' : exit(0); break; - - 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); - else - m_debugMode |= btIDebugDraw::DBG_DrawAabb; - 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(getCameraPosition(),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(); - -} - - -void ConcaveDemo::shootTrimesh(const btVector3& startPosition,const btVector3& destination) -{ - - if (m_dynamicsWorld) - { - float mass = 4.f; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(startPosition); - - btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_trimeshShape); - - btVector3 linVel(destination[0]-startPosition[0],destination[1]-startPosition[1],destination[2]-startPosition[2]); - linVel.normalize(); - linVel*=m_ShootBoxInitialSpeed*0.25; - - body->getWorldTransform().setOrigin(startPosition); - body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); - body->setLinearVelocity(linVel); - body->setAngularVelocity(btVector3(0,0,0)); - } -} - -void ConcaveDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = float(getDeltaTimeMicroseconds()) * 0.000001f; - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - glutSwapBuffers(); - -} - - - - -void ConcaveDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - - +/* +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 "ConcaveDemo.h" + +#include "LinearMath/btDefaultMotionState.h" +#include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btDefaultMotionState.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" +#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h" +#include "GLDebugFont.h" + + + +#include "GLDebugDrawer.h" + +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + + +GLDebugDrawer debugDrawer; + +//***************************THE FAMOUS BUNNY TRIMESH********************************************// + +#define REAL btScalar +const int NUM_TRIANGLES =902; +const int NUM_VERTICES = 453; +const int NUM_INDICES = NUM_TRIANGLES * 3; + + +REAL gVertices[NUM_VERTICES * 3] = { + REAL(-0.334392), REAL(0.133007), REAL(0.062259), + REAL(-0.350189), REAL(0.150354), REAL(-0.147769), + REAL(-0.234201), REAL(0.343811), REAL(-0.174307), + REAL(-0.200259), REAL(0.285207), REAL(0.093749), + REAL(0.003520), REAL(0.475208), REAL(-0.159365), + REAL(0.001856), REAL(0.419203), REAL(0.098582), + REAL(-0.252802), REAL(0.093666), REAL(0.237538), + REAL(-0.162901), REAL(0.237984), REAL(0.206905), + REAL(0.000865), REAL(0.318141), REAL(0.235370), + REAL(-0.414624), REAL(0.164083), REAL(-0.278254), + REAL(-0.262213), REAL(0.357334), REAL(-0.293246), + REAL(0.004628), REAL(0.482694), REAL(-0.338626), + REAL(-0.402162), REAL(0.133528), REAL(-0.443247), + REAL(-0.243781), REAL(0.324275), REAL(-0.436763), + REAL(0.005293), REAL(0.437592), REAL(-0.458332), + REAL(-0.339884), REAL(-0.041150), REAL(-0.668211), + REAL(-0.248382), REAL(0.255825), REAL(-0.627493), + REAL(0.006261), REAL(0.376103), REAL(-0.631506), + REAL(-0.216201), REAL(-0.126776), REAL(-0.886936), + REAL(-0.171075), REAL(0.011544), REAL(-0.881386), + REAL(-0.181074), REAL(0.098223), REAL(-0.814779), + REAL(-0.119891), REAL(0.218786), REAL(-0.760153), + REAL(-0.078895), REAL(0.276780), REAL(-0.739281), + REAL(0.006801), REAL(0.310959), REAL(-0.735661), + REAL(-0.168842), REAL(0.102387), REAL(-0.920381), + REAL(-0.104072), REAL(0.177278), REAL(-0.952530), + REAL(-0.129704), REAL(0.211848), REAL(-0.836678), + REAL(-0.099875), REAL(0.310931), REAL(-0.799381), + REAL(0.007237), REAL(0.361687), REAL(-0.794439), + REAL(-0.077913), REAL(0.258753), REAL(-0.921640), + REAL(0.007957), REAL(0.282241), REAL(-0.931680), + REAL(-0.252222), REAL(-0.550401), REAL(-0.557810), + REAL(-0.267633), REAL(-0.603419), REAL(-0.655209), + REAL(-0.446838), REAL(-0.118517), REAL(-0.466159), + REAL(-0.459488), REAL(-0.093017), REAL(-0.311341), + REAL(-0.370645), REAL(-0.100108), REAL(-0.159454), + REAL(-0.371984), REAL(-0.091991), REAL(-0.011044), + REAL(-0.328945), REAL(-0.098269), REAL(0.088659), + REAL(-0.282452), REAL(-0.018862), REAL(0.311501), + REAL(-0.352403), REAL(-0.131341), REAL(0.144902), + REAL(-0.364126), REAL(-0.200299), REAL(0.202388), + REAL(-0.283965), REAL(-0.231869), REAL(0.023668), + REAL(-0.298943), REAL(-0.155218), REAL(0.369716), + REAL(-0.293787), REAL(-0.121856), REAL(0.419097), + REAL(-0.290163), REAL(-0.290797), REAL(0.107824), + REAL(-0.264165), REAL(-0.272849), REAL(0.036347), + REAL(-0.228567), REAL(-0.372573), REAL(0.290309), + REAL(-0.190431), REAL(-0.286997), REAL(0.421917), + REAL(-0.191039), REAL(-0.240973), REAL(0.507118), + REAL(-0.287272), REAL(-0.276431), REAL(-0.065444), + REAL(-0.295675), REAL(-0.280818), REAL(-0.174200), + REAL(-0.399537), REAL(-0.313131), REAL(-0.376167), + REAL(-0.392666), REAL(-0.488581), REAL(-0.427494), + REAL(-0.331669), REAL(-0.570185), REAL(-0.466054), + REAL(-0.282290), REAL(-0.618140), REAL(-0.589220), + REAL(-0.374238), REAL(-0.594882), REAL(-0.323298), + REAL(-0.381071), REAL(-0.629723), REAL(-0.350777), + REAL(-0.382112), REAL(-0.624060), REAL(-0.221577), + REAL(-0.272701), REAL(-0.566522), REAL(0.259157), + REAL(-0.256702), REAL(-0.663406), REAL(0.286079), + REAL(-0.280948), REAL(-0.428359), REAL(0.055790), + REAL(-0.184974), REAL(-0.508894), REAL(0.326265), + REAL(-0.279971), REAL(-0.526918), REAL(0.395319), + REAL(-0.282599), REAL(-0.663393), REAL(0.412411), + REAL(-0.188329), REAL(-0.475093), REAL(0.417954), + REAL(-0.263384), REAL(-0.663396), REAL(0.466604), + REAL(-0.209063), REAL(-0.663393), REAL(0.509344), + REAL(-0.002044), REAL(-0.319624), REAL(0.553078), + REAL(-0.001266), REAL(-0.371260), REAL(0.413296), + REAL(-0.219753), REAL(-0.339762), REAL(-0.040921), + REAL(-0.256986), REAL(-0.282511), REAL(-0.006349), + REAL(-0.271706), REAL(-0.260881), REAL(0.001764), + REAL(-0.091191), REAL(-0.419184), REAL(-0.045912), + REAL(-0.114944), REAL(-0.429752), REAL(-0.124739), + REAL(-0.113970), REAL(-0.382987), REAL(-0.188540), + REAL(-0.243012), REAL(-0.464942), REAL(-0.242850), + REAL(-0.314815), REAL(-0.505402), REAL(-0.324768), + REAL(0.002774), REAL(-0.437526), REAL(-0.262766), + REAL(-0.072625), REAL(-0.417748), REAL(-0.221440), + REAL(-0.160112), REAL(-0.476932), REAL(-0.293450), + REAL(0.003859), REAL(-0.453425), REAL(-0.443916), + REAL(-0.120363), REAL(-0.581567), REAL(-0.438689), + REAL(-0.091499), REAL(-0.584191), REAL(-0.294511), + REAL(-0.116469), REAL(-0.599861), REAL(-0.188308), + REAL(-0.208032), REAL(-0.513640), REAL(-0.134649), + REAL(-0.235749), REAL(-0.610017), REAL(-0.040939), + REAL(-0.344916), REAL(-0.622487), REAL(-0.085380), + REAL(-0.336401), REAL(-0.531864), REAL(-0.212298), + REAL(0.001961), REAL(-0.459550), REAL(-0.135547), + REAL(-0.058296), REAL(-0.430536), REAL(-0.043440), + REAL(0.001378), REAL(-0.449511), REAL(-0.037762), + REAL(-0.130135), REAL(-0.510222), REAL(0.079144), + REAL(0.000142), REAL(-0.477549), REAL(0.157064), + REAL(-0.114284), REAL(-0.453206), REAL(0.304397), + REAL(-0.000592), REAL(-0.443558), REAL(0.285401), + REAL(-0.056215), REAL(-0.663402), REAL(0.326073), + REAL(-0.026248), REAL(-0.568010), REAL(0.273318), + REAL(-0.049261), REAL(-0.531064), REAL(0.389854), + REAL(-0.127096), REAL(-0.663398), REAL(0.479316), + REAL(-0.058384), REAL(-0.663401), REAL(0.372891), + REAL(-0.303961), REAL(0.054199), REAL(0.625921), + REAL(-0.268594), REAL(0.193403), REAL(0.502766), + REAL(-0.277159), REAL(0.126123), REAL(0.443289), + REAL(-0.287605), REAL(-0.005722), REAL(0.531844), + REAL(-0.231396), REAL(-0.121289), REAL(0.587387), + REAL(-0.253475), REAL(-0.081797), REAL(0.756541), + REAL(-0.195164), REAL(-0.137969), REAL(0.728011), + REAL(-0.167673), REAL(-0.156573), REAL(0.609388), + REAL(-0.145917), REAL(-0.169029), REAL(0.697600), + REAL(-0.077776), REAL(-0.214247), REAL(0.622586), + REAL(-0.076873), REAL(-0.214971), REAL(0.696301), + REAL(-0.002341), REAL(-0.233135), REAL(0.622859), + REAL(-0.002730), REAL(-0.213526), REAL(0.691267), + REAL(-0.003136), REAL(-0.192628), REAL(0.762731), + REAL(-0.056136), REAL(-0.201222), REAL(0.763806), + REAL(-0.114589), REAL(-0.166192), REAL(0.770723), + REAL(-0.155145), REAL(-0.129632), REAL(0.791738), + REAL(-0.183611), REAL(-0.058705), REAL(0.847012), + REAL(-0.165562), REAL(0.001980), REAL(0.833386), + REAL(-0.220084), REAL(0.019914), REAL(0.768935), + REAL(-0.255730), REAL(0.090306), REAL(0.670782), + REAL(-0.255594), REAL(0.113833), REAL(0.663389), + REAL(-0.226380), REAL(0.212655), REAL(0.617740), + REAL(-0.003367), REAL(-0.195342), REAL(0.799680), + REAL(-0.029743), REAL(-0.210508), REAL(0.827180), + REAL(-0.003818), REAL(-0.194783), REAL(0.873636), + REAL(-0.004116), REAL(-0.157907), REAL(0.931268), + REAL(-0.031280), REAL(-0.184555), REAL(0.889476), + REAL(-0.059885), REAL(-0.184448), REAL(0.841330), + REAL(-0.135333), REAL(-0.164332), REAL(0.878200), + REAL(-0.085574), REAL(-0.170948), REAL(0.925547), + REAL(-0.163833), REAL(-0.094170), REAL(0.897114), + REAL(-0.138444), REAL(-0.104250), REAL(0.945975), + REAL(-0.083497), REAL(-0.084934), REAL(0.979607), + REAL(-0.004433), REAL(-0.146642), REAL(0.985872), + REAL(-0.150715), REAL(0.032650), REAL(0.884111), + REAL(-0.135892), REAL(-0.035520), REAL(0.945455), + REAL(-0.070612), REAL(0.036849), REAL(0.975733), + REAL(-0.004458), REAL(-0.042526), REAL(1.015670), + REAL(-0.004249), REAL(0.046042), REAL(1.003240), + REAL(-0.086969), REAL(0.133224), REAL(0.947633), + REAL(-0.003873), REAL(0.161605), REAL(0.970499), + REAL(-0.125544), REAL(0.140012), REAL(0.917678), + REAL(-0.125651), REAL(0.250246), REAL(0.857602), + REAL(-0.003127), REAL(0.284070), REAL(0.878870), + REAL(-0.159174), REAL(0.125726), REAL(0.888878), + REAL(-0.183807), REAL(0.196970), REAL(0.844480), + REAL(-0.159890), REAL(0.291736), REAL(0.732480), + REAL(-0.199495), REAL(0.207230), REAL(0.779864), + REAL(-0.206182), REAL(0.164608), REAL(0.693257), + REAL(-0.186315), REAL(0.160689), REAL(0.817193), + REAL(-0.192827), REAL(0.166706), REAL(0.782271), + REAL(-0.175112), REAL(0.110008), REAL(0.860621), + REAL(-0.161022), REAL(0.057420), REAL(0.855111), + REAL(-0.172319), REAL(0.036155), REAL(0.816189), + REAL(-0.190318), REAL(0.064083), REAL(0.760605), + REAL(-0.195072), REAL(0.129179), REAL(0.731104), + REAL(-0.203126), REAL(0.410287), REAL(0.680536), + REAL(-0.216677), REAL(0.309274), REAL(0.642272), + REAL(-0.241515), REAL(0.311485), REAL(0.587832), + REAL(-0.002209), REAL(0.366663), REAL(0.749413), + REAL(-0.088230), REAL(0.396265), REAL(0.678635), + REAL(-0.170147), REAL(0.109517), REAL(0.840784), + REAL(-0.160521), REAL(0.067766), REAL(0.830650), + REAL(-0.181546), REAL(0.139805), REAL(0.812146), + REAL(-0.180495), REAL(0.148568), REAL(0.776087), + REAL(-0.180255), REAL(0.129125), REAL(0.744192), + REAL(-0.186298), REAL(0.078308), REAL(0.769352), + REAL(-0.167622), REAL(0.060539), REAL(0.806675), + REAL(-0.189876), REAL(0.102760), REAL(0.802582), + REAL(-0.108340), REAL(0.455446), REAL(0.657174), + REAL(-0.241585), REAL(0.527592), REAL(0.669296), + REAL(-0.265676), REAL(0.513366), REAL(0.634594), + REAL(-0.203073), REAL(0.478550), REAL(0.581526), + REAL(-0.266772), REAL(0.642330), REAL(0.602061), + REAL(-0.216961), REAL(0.564846), REAL(0.535435), + REAL(-0.202210), REAL(0.525495), REAL(0.475944), + REAL(-0.193888), REAL(0.467925), REAL(0.520606), + REAL(-0.265837), REAL(0.757267), REAL(0.500933), + REAL(-0.240306), REAL(0.653440), REAL(0.463215), + REAL(-0.309239), REAL(0.776868), REAL(0.304726), + REAL(-0.271009), REAL(0.683094), REAL(0.382018), + REAL(-0.312111), REAL(0.671099), REAL(0.286687), + REAL(-0.268791), REAL(0.624342), REAL(0.377231), + REAL(-0.302457), REAL(0.533996), REAL(0.360289), + REAL(-0.263656), REAL(0.529310), REAL(0.412564), + REAL(-0.282311), REAL(0.415167), REAL(0.447666), + REAL(-0.239201), REAL(0.442096), REAL(0.495604), + REAL(-0.220043), REAL(0.569026), REAL(0.445877), + REAL(-0.001263), REAL(0.395631), REAL(0.602029), + REAL(-0.057345), REAL(0.442535), REAL(0.572224), + REAL(-0.088927), REAL(0.506333), REAL(0.529106), + REAL(-0.125738), REAL(0.535076), REAL(0.612913), + REAL(-0.126251), REAL(0.577170), REAL(0.483159), + REAL(-0.149594), REAL(0.611520), REAL(0.557731), + REAL(-0.163188), REAL(0.660791), REAL(0.491080), + REAL(-0.172482), REAL(0.663387), REAL(0.415416), + REAL(-0.160464), REAL(0.591710), REAL(0.370659), + REAL(-0.156445), REAL(0.536396), REAL(0.378302), + REAL(-0.136496), REAL(0.444358), REAL(0.425226), + REAL(-0.095564), REAL(0.373768), REAL(0.473659), + REAL(-0.104146), REAL(0.315912), REAL(0.498104), + REAL(-0.000496), REAL(0.384194), REAL(0.473817), + REAL(-0.000183), REAL(0.297770), REAL(0.401486), + REAL(-0.129042), REAL(0.270145), REAL(0.434495), + REAL(0.000100), REAL(0.272963), REAL(0.349138), + REAL(-0.113060), REAL(0.236984), REAL(0.385554), + REAL(0.007260), REAL(0.016311), REAL(-0.883396), + REAL(0.007865), REAL(0.122104), REAL(-0.956137), + REAL(-0.032842), REAL(0.115282), REAL(-0.953252), + REAL(-0.089115), REAL(0.108449), REAL(-0.950317), + REAL(-0.047440), REAL(0.014729), REAL(-0.882756), + REAL(-0.104458), REAL(0.013137), REAL(-0.882070), + REAL(-0.086439), REAL(-0.584866), REAL(-0.608343), + REAL(-0.115026), REAL(-0.662605), REAL(-0.436732), + REAL(-0.071683), REAL(-0.665372), REAL(-0.606385), + REAL(-0.257884), REAL(-0.665381), REAL(-0.658052), + REAL(-0.272542), REAL(-0.665381), REAL(-0.592063), + REAL(-0.371322), REAL(-0.665382), REAL(-0.353620), + REAL(-0.372362), REAL(-0.665381), REAL(-0.224420), + REAL(-0.335166), REAL(-0.665380), REAL(-0.078623), + REAL(-0.225999), REAL(-0.665375), REAL(-0.038981), + REAL(-0.106719), REAL(-0.665374), REAL(-0.186351), + REAL(-0.081749), REAL(-0.665372), REAL(-0.292554), + REAL(0.006943), REAL(-0.091505), REAL(-0.858354), + REAL(0.006117), REAL(-0.280985), REAL(-0.769967), + REAL(0.004495), REAL(-0.502360), REAL(-0.559799), + REAL(-0.198638), REAL(-0.302135), REAL(-0.845816), + REAL(-0.237395), REAL(-0.542544), REAL(-0.587188), + REAL(-0.270001), REAL(-0.279489), REAL(-0.669861), + REAL(-0.134547), REAL(-0.119852), REAL(-0.959004), + REAL(-0.052088), REAL(-0.122463), REAL(-0.944549), + REAL(-0.124463), REAL(-0.293508), REAL(-0.899566), + REAL(-0.047616), REAL(-0.289643), REAL(-0.879292), + REAL(-0.168595), REAL(-0.529132), REAL(-0.654931), + REAL(-0.099793), REAL(-0.515719), REAL(-0.645873), + REAL(-0.186168), REAL(-0.605282), REAL(-0.724690), + REAL(-0.112970), REAL(-0.583097), REAL(-0.707469), + REAL(-0.108152), REAL(-0.665375), REAL(-0.700408), + REAL(-0.183019), REAL(-0.665378), REAL(-0.717630), + REAL(-0.349529), REAL(-0.334459), REAL(-0.511985), + REAL(-0.141182), REAL(-0.437705), REAL(-0.798194), + REAL(-0.212670), REAL(-0.448725), REAL(-0.737447), + REAL(-0.261111), REAL(-0.414945), REAL(-0.613835), + REAL(-0.077364), REAL(-0.431480), REAL(-0.778113), + REAL(0.005174), REAL(-0.425277), REAL(-0.651592), + REAL(0.089236), REAL(-0.431732), REAL(-0.777093), + REAL(0.271006), REAL(-0.415749), REAL(-0.610577), + REAL(0.223981), REAL(-0.449384), REAL(-0.734774), + REAL(0.153275), REAL(-0.438150), REAL(-0.796391), + REAL(0.358414), REAL(-0.335529), REAL(-0.507649), + REAL(0.193434), REAL(-0.665946), REAL(-0.715325), + REAL(0.118363), REAL(-0.665717), REAL(-0.699021), + REAL(0.123515), REAL(-0.583454), REAL(-0.706020), + REAL(0.196851), REAL(-0.605860), REAL(-0.722345), + REAL(0.109788), REAL(-0.516035), REAL(-0.644590), + REAL(0.178656), REAL(-0.529656), REAL(-0.652804), + REAL(0.061157), REAL(-0.289807), REAL(-0.878626), + REAL(0.138234), REAL(-0.293905), REAL(-0.897958), + REAL(0.066933), REAL(-0.122643), REAL(-0.943820), + REAL(0.149571), REAL(-0.120281), REAL(-0.957264), + REAL(0.280989), REAL(-0.280321), REAL(-0.666487), + REAL(0.246581), REAL(-0.543275), REAL(-0.584224), + REAL(0.211720), REAL(-0.302754), REAL(-0.843303), + REAL(0.086966), REAL(-0.665627), REAL(-0.291520), + REAL(0.110634), REAL(-0.665702), REAL(-0.185021), + REAL(0.228099), REAL(-0.666061), REAL(-0.036201), + REAL(0.337743), REAL(-0.666396), REAL(-0.074503), + REAL(0.376722), REAL(-0.666513), REAL(-0.219833), + REAL(0.377265), REAL(-0.666513), REAL(-0.349036), + REAL(0.281411), REAL(-0.666217), REAL(-0.588670), + REAL(0.267564), REAL(-0.666174), REAL(-0.654834), + REAL(0.080745), REAL(-0.665602), REAL(-0.605452), + REAL(0.122016), REAL(-0.662963), REAL(-0.435280), + REAL(0.095767), REAL(-0.585141), REAL(-0.607228), + REAL(0.118944), REAL(0.012799), REAL(-0.880702), + REAL(0.061944), REAL(0.014564), REAL(-0.882086), + REAL(0.104725), REAL(0.108156), REAL(-0.949130), + REAL(0.048513), REAL(0.115159), REAL(-0.952753), + REAL(0.112696), REAL(0.236643), REAL(0.386937), + REAL(0.128177), REAL(0.269757), REAL(0.436071), + REAL(0.102643), REAL(0.315600), REAL(0.499370), + REAL(0.094535), REAL(0.373481), REAL(0.474824), + REAL(0.136270), REAL(0.443946), REAL(0.426895), + REAL(0.157071), REAL(0.535923), REAL(0.380222), + REAL(0.161350), REAL(0.591224), REAL(0.372630), + REAL(0.173035), REAL(0.662865), REAL(0.417531), + REAL(0.162808), REAL(0.660299), REAL(0.493077), + REAL(0.148250), REAL(0.611070), REAL(0.559555), + REAL(0.125719), REAL(0.576790), REAL(0.484702), + REAL(0.123489), REAL(0.534699), REAL(0.614440), + REAL(0.087621), REAL(0.506066), REAL(0.530188), + REAL(0.055321), REAL(0.442365), REAL(0.572915), + REAL(0.219936), REAL(0.568361), REAL(0.448571), + REAL(0.238099), REAL(0.441375), REAL(0.498528), + REAL(0.281711), REAL(0.414315), REAL(0.451121), + REAL(0.263833), REAL(0.528513), REAL(0.415794), + REAL(0.303284), REAL(0.533081), REAL(0.363998), + REAL(0.269687), REAL(0.623528), REAL(0.380528), + REAL(0.314255), REAL(0.670153), REAL(0.290524), + REAL(0.272023), REAL(0.682273), REAL(0.385343), + REAL(0.311480), REAL(0.775931), REAL(0.308527), + REAL(0.240239), REAL(0.652714), REAL(0.466159), + REAL(0.265619), REAL(0.756464), REAL(0.504187), + REAL(0.192562), REAL(0.467341), REAL(0.522972), + REAL(0.201605), REAL(0.524885), REAL(0.478417), + REAL(0.215743), REAL(0.564193), REAL(0.538084), + REAL(0.264969), REAL(0.641527), REAL(0.605317), + REAL(0.201031), REAL(0.477940), REAL(0.584002), + REAL(0.263086), REAL(0.512567), REAL(0.637832), + REAL(0.238615), REAL(0.526867), REAL(0.672237), + REAL(0.105309), REAL(0.455123), REAL(0.658482), + REAL(0.183993), REAL(0.102195), REAL(0.804872), + REAL(0.161563), REAL(0.060042), REAL(0.808692), + REAL(0.180748), REAL(0.077754), REAL(0.771600), + REAL(0.175168), REAL(0.128588), REAL(0.746368), + REAL(0.175075), REAL(0.148030), REAL(0.778264), + REAL(0.175658), REAL(0.139265), REAL(0.814333), + REAL(0.154191), REAL(0.067291), REAL(0.832578), + REAL(0.163818), REAL(0.109013), REAL(0.842830), + REAL(0.084760), REAL(0.396004), REAL(0.679695), + REAL(0.238888), REAL(0.310760), REAL(0.590775), + REAL(0.213380), REAL(0.308625), REAL(0.644905), + REAL(0.199666), REAL(0.409678), REAL(0.683003), + REAL(0.190143), REAL(0.128597), REAL(0.733463), + REAL(0.184833), REAL(0.063516), REAL(0.762902), + REAL(0.166070), REAL(0.035644), REAL(0.818261), + REAL(0.154361), REAL(0.056943), REAL(0.857042), + REAL(0.168542), REAL(0.109489), REAL(0.862725), + REAL(0.187387), REAL(0.166131), REAL(0.784599), + REAL(0.180428), REAL(0.160135), REAL(0.819438), + REAL(0.201823), REAL(0.163991), REAL(0.695756), + REAL(0.194206), REAL(0.206635), REAL(0.782275), + REAL(0.155438), REAL(0.291260), REAL(0.734412), + REAL(0.177696), REAL(0.196424), REAL(0.846693), + REAL(0.152305), REAL(0.125256), REAL(0.890786), + REAL(0.119546), REAL(0.249876), REAL(0.859104), + REAL(0.118369), REAL(0.139643), REAL(0.919173), + REAL(0.079410), REAL(0.132973), REAL(0.948652), + REAL(0.062419), REAL(0.036648), REAL(0.976547), + REAL(0.127847), REAL(-0.035919), REAL(0.947070), + REAL(0.143624), REAL(0.032206), REAL(0.885913), + REAL(0.074888), REAL(-0.085173), REAL(0.980577), + REAL(0.130184), REAL(-0.104656), REAL(0.947620), + REAL(0.156201), REAL(-0.094653), REAL(0.899074), + REAL(0.077366), REAL(-0.171194), REAL(0.926545), + REAL(0.127722), REAL(-0.164729), REAL(0.879810), + REAL(0.052670), REAL(-0.184618), REAL(0.842019), + REAL(0.023477), REAL(-0.184638), REAL(0.889811), + REAL(0.022626), REAL(-0.210587), REAL(0.827500), + REAL(0.223089), REAL(0.211976), REAL(0.620493), + REAL(0.251444), REAL(0.113067), REAL(0.666494), + REAL(0.251419), REAL(0.089540), REAL(0.673887), + REAL(0.214360), REAL(0.019258), REAL(0.771595), + REAL(0.158999), REAL(0.001490), REAL(0.835374), + REAL(0.176696), REAL(-0.059249), REAL(0.849218), + REAL(0.148696), REAL(-0.130091), REAL(0.793599), + REAL(0.108290), REAL(-0.166528), REAL(0.772088), + REAL(0.049820), REAL(-0.201382), REAL(0.764454), + REAL(0.071341), REAL(-0.215195), REAL(0.697209), + REAL(0.073148), REAL(-0.214475), REAL(0.623510), + REAL(0.140502), REAL(-0.169461), REAL(0.699354), + REAL(0.163374), REAL(-0.157073), REAL(0.611416), + REAL(0.189466), REAL(-0.138550), REAL(0.730366), + REAL(0.247593), REAL(-0.082554), REAL(0.759610), + REAL(0.227468), REAL(-0.121982), REAL(0.590197), + REAL(0.284702), REAL(-0.006586), REAL(0.535347), + REAL(0.275741), REAL(0.125287), REAL(0.446676), + REAL(0.266650), REAL(0.192594), REAL(0.506044), + REAL(0.300086), REAL(0.053287), REAL(0.629620), + REAL(0.055450), REAL(-0.663935), REAL(0.375065), + REAL(0.122854), REAL(-0.664138), REAL(0.482323), + REAL(0.046520), REAL(-0.531571), REAL(0.391918), + REAL(0.024824), REAL(-0.568450), REAL(0.275106), + REAL(0.053855), REAL(-0.663931), REAL(0.328224), + REAL(0.112829), REAL(-0.453549), REAL(0.305788), + REAL(0.131265), REAL(-0.510617), REAL(0.080746), + REAL(0.061174), REAL(-0.430716), REAL(-0.042710), + REAL(0.341019), REAL(-0.532887), REAL(-0.208150), + REAL(0.347705), REAL(-0.623533), REAL(-0.081139), + REAL(0.238040), REAL(-0.610732), REAL(-0.038037), + REAL(0.211764), REAL(-0.514274), REAL(-0.132078), + REAL(0.120605), REAL(-0.600219), REAL(-0.186856), + REAL(0.096985), REAL(-0.584476), REAL(-0.293357), + REAL(0.127621), REAL(-0.581941), REAL(-0.437170), + REAL(0.165902), REAL(-0.477425), REAL(-0.291453), + REAL(0.077720), REAL(-0.417975), REAL(-0.220519), + REAL(0.320892), REAL(-0.506363), REAL(-0.320874), + REAL(0.248214), REAL(-0.465684), REAL(-0.239842), + REAL(0.118764), REAL(-0.383338), REAL(-0.187114), + REAL(0.118816), REAL(-0.430106), REAL(-0.123307), + REAL(0.094131), REAL(-0.419464), REAL(-0.044777), + REAL(0.274526), REAL(-0.261706), REAL(0.005110), + REAL(0.259842), REAL(-0.283292), REAL(-0.003185), + REAL(0.222861), REAL(-0.340431), REAL(-0.038210), + REAL(0.204445), REAL(-0.664380), REAL(0.513353), + REAL(0.259286), REAL(-0.664547), REAL(0.471281), + REAL(0.185402), REAL(-0.476020), REAL(0.421718), + REAL(0.279163), REAL(-0.664604), REAL(0.417328), + REAL(0.277157), REAL(-0.528122), REAL(0.400208), + REAL(0.183069), REAL(-0.509812), REAL(0.329995), + REAL(0.282599), REAL(-0.429210), REAL(0.059242), + REAL(0.254816), REAL(-0.664541), REAL(0.290687), + REAL(0.271436), REAL(-0.567707), REAL(0.263966), + REAL(0.386561), REAL(-0.625221), REAL(-0.216870), + REAL(0.387086), REAL(-0.630883), REAL(-0.346073), + REAL(0.380021), REAL(-0.596021), REAL(-0.318679), + REAL(0.291269), REAL(-0.619007), REAL(-0.585707), + REAL(0.339280), REAL(-0.571198), REAL(-0.461946), + REAL(0.400045), REAL(-0.489778), REAL(-0.422640), + REAL(0.406817), REAL(-0.314349), REAL(-0.371230), + REAL(0.300588), REAL(-0.281718), REAL(-0.170549), + REAL(0.290866), REAL(-0.277304), REAL(-0.061905), + REAL(0.187735), REAL(-0.241545), REAL(0.509437), + REAL(0.188032), REAL(-0.287569), REAL(0.424234), + REAL(0.227520), REAL(-0.373262), REAL(0.293102), + REAL(0.266526), REAL(-0.273650), REAL(0.039597), + REAL(0.291592), REAL(-0.291676), REAL(0.111386), + REAL(0.291914), REAL(-0.122741), REAL(0.422683), + REAL(0.297574), REAL(-0.156119), REAL(0.373368), + REAL(0.286603), REAL(-0.232731), REAL(0.027162), + REAL(0.364663), REAL(-0.201399), REAL(0.206850), + REAL(0.353855), REAL(-0.132408), REAL(0.149228), + REAL(0.282208), REAL(-0.019715), REAL(0.314960), + REAL(0.331187), REAL(-0.099266), REAL(0.092701), + REAL(0.375463), REAL(-0.093120), REAL(-0.006467), + REAL(0.375917), REAL(-0.101236), REAL(-0.154882), + REAL(0.466635), REAL(-0.094416), REAL(-0.305669), + REAL(0.455805), REAL(-0.119881), REAL(-0.460632), + REAL(0.277465), REAL(-0.604242), REAL(-0.651871), + REAL(0.261022), REAL(-0.551176), REAL(-0.554667), + REAL(0.093627), REAL(0.258494), REAL(-0.920589), + REAL(0.114248), REAL(0.310608), REAL(-0.798070), + REAL(0.144232), REAL(0.211434), REAL(-0.835001), + REAL(0.119916), REAL(0.176940), REAL(-0.951159), + REAL(0.184061), REAL(0.101854), REAL(-0.918220), + REAL(0.092431), REAL(0.276521), REAL(-0.738231), + REAL(0.133504), REAL(0.218403), REAL(-0.758602), + REAL(0.194987), REAL(0.097655), REAL(-0.812476), + REAL(0.185542), REAL(0.011005), REAL(-0.879202), + REAL(0.230315), REAL(-0.127450), REAL(-0.884202), + REAL(0.260471), REAL(0.255056), REAL(-0.624378), + REAL(0.351567), REAL(-0.042194), REAL(-0.663976), + REAL(0.253742), REAL(0.323524), REAL(-0.433716), + REAL(0.411612), REAL(0.132299), REAL(-0.438264), + REAL(0.270513), REAL(0.356530), REAL(-0.289984), + REAL(0.422146), REAL(0.162819), REAL(-0.273130), + REAL(0.164724), REAL(0.237490), REAL(0.208912), + REAL(0.253806), REAL(0.092900), REAL(0.240640), + REAL(0.203608), REAL(0.284597), REAL(0.096223), + REAL(0.241006), REAL(0.343093), REAL(-0.171396), + REAL(0.356076), REAL(0.149288), REAL(-0.143443), + REAL(0.337656), REAL(0.131992), REAL(0.066374) +}; + +int gIndices[NUM_TRIANGLES][3] = { + {126,134,133}, + {342,138,134}, + {133,134,138}, + {126,342,134}, + {312,316,317}, + {169,163,162}, + {312,317,319}, + {312,319,318}, + {169,162,164}, + {169,168,163}, + {312,314,315}, + {169,164,165}, + {169,167,168}, + {312,315,316}, + {312,313,314}, + {169,165,166}, + {169,166,167}, + {312,318,313}, + {308,304,305}, + {308,305,306}, + {179,181,188}, + {177,173,175}, + {177,175,176}, + {302,293,300}, + {322,294,304}, + {188,176,175}, + {188,175,179}, + {158,177,187}, + {305,293,302}, + {305,302,306}, + {322,304,308}, + {188,181,183}, + {158,173,177}, + {293,298,300}, + {304,294,296}, + {304,296,305}, + {185,176,188}, + {185,188,183}, + {187,177,176}, + {187,176,185}, + {305,296,298}, + {305,298,293}, + {436,432, 28}, + {436, 28, 23}, + {434,278,431}, + { 30,208,209}, + { 30,209, 29}, + { 19, 20, 24}, + {208,207,211}, + {208,211,209}, + { 19,210,212}, + {433,434,431}, + {433,431,432}, + {433,432,436}, + {436,437,433}, + {277,275,276}, + {277,276,278}, + {209,210, 25}, + { 21, 26, 24}, + { 21, 24, 20}, + { 25, 26, 27}, + { 25, 27, 29}, + {435,439,277}, + {439,275,277}, + {432,431, 30}, + {432, 30, 28}, + {433,437,438}, + {433,438,435}, + {434,277,278}, + { 24, 25,210}, + { 24, 26, 25}, + { 29, 27, 28}, + { 29, 28, 30}, + { 19, 24,210}, + {208, 30,431}, + {208,431,278}, + {435,434,433}, + {435,277,434}, + { 25, 29,209}, + { 27, 22, 23}, + { 27, 23, 28}, + { 26, 22, 27}, + { 26, 21, 22}, + {212,210,209}, + {212,209,211}, + {207,208,278}, + {207,278,276}, + {439,435,438}, + { 12, 9, 10}, + { 12, 10, 13}, + { 2, 3, 5}, + { 2, 5, 4}, + { 16, 13, 14}, + { 16, 14, 17}, + { 22, 21, 16}, + { 13, 10, 11}, + { 13, 11, 14}, + { 1, 0, 3}, + { 1, 3, 2}, + { 15, 12, 16}, + { 19, 18, 15}, + { 19, 15, 16}, + { 19, 16, 20}, + { 9, 1, 2}, + { 9, 2, 10}, + { 3, 7, 8}, + { 3, 8, 5}, + { 16, 17, 23}, + { 16, 23, 22}, + { 21, 20, 16}, + { 10, 2, 4}, + { 10, 4, 11}, + { 0, 6, 7}, + { 0, 7, 3}, + { 12, 13, 16}, + {451,446,445}, + {451,445,450}, + {442,440,439}, + {442,439,438}, + {442,438,441}, + {421,420,422}, + {412,411,426}, + {412,426,425}, + {408,405,407}, + {413, 67, 68}, + {413, 68,414}, + {391,390,412}, + { 80,384,386}, + {404,406,378}, + {390,391,377}, + {390,377, 88}, + {400,415,375}, + {398,396,395}, + {398,395,371}, + {398,371,370}, + {112,359,358}, + {112,358,113}, + {351,352,369}, + {125,349,348}, + {345,343,342}, + {342,340,339}, + {341,335,337}, + {328,341,327}, + {331,323,333}, + {331,322,323}, + {327,318,319}, + {327,319,328}, + {315,314,324}, + {302,300,301}, + {302,301,303}, + {320,311,292}, + {285,284,289}, + {310,307,288}, + {310,288,290}, + {321,350,281}, + {321,281,282}, + {423,448,367}, + {272,273,384}, + {272,384,274}, + {264,265,382}, + {264,382,383}, + {440,442,261}, + {440,261,263}, + {252,253,254}, + {252,254,251}, + {262,256,249}, + {262,249,248}, + {228,243,242}, + {228, 31,243}, + {213,215,238}, + {213,238,237}, + { 19,212,230}, + {224,225,233}, + {224,233,231}, + {217,218, 56}, + {217, 56, 54}, + {217,216,239}, + {217,239,238}, + {217,238,215}, + {218,217,215}, + {218,215,214}, + { 6,102,206}, + {186,199,200}, + {197,182,180}, + {170,171,157}, + {201,200,189}, + {170,190,191}, + {170,191,192}, + {175,174,178}, + {175,178,179}, + {168,167,155}, + {122,149,158}, + {122,158,159}, + {135,153,154}, + {135,154,118}, + {143,140,141}, + {143,141,144}, + {132,133,136}, + {130,126,133}, + {124,125,127}, + {122,101,100}, + {122,100,121}, + {110,108,107}, + {110,107,109}, + { 98, 99, 97}, + { 98, 97, 64}, + { 98, 64, 66}, + { 87, 55, 57}, + { 83, 82, 79}, + { 83, 79, 84}, + { 78, 74, 50}, + { 49, 71, 41}, + { 49, 41, 37}, + { 49, 37, 36}, + { 58, 44, 60}, + { 60, 59, 58}, + { 51, 34, 33}, + { 39, 40, 42}, + { 39, 42, 38}, + {243,240, 33}, + {243, 33,229}, + { 39, 38, 6}, + { 44, 46, 40}, + { 55, 56, 57}, + { 64, 62, 65}, + { 64, 65, 66}, + { 41, 71, 45}, + { 75, 50, 51}, + { 81, 79, 82}, + { 77, 88, 73}, + { 93, 92, 94}, + { 68, 47, 46}, + { 96, 97, 99}, + { 96, 99, 95}, + {110,109,111}, + {111,112,110}, + {114,113,123}, + {114,123,124}, + {132,131,129}, + {133,137,136}, + {135,142,145}, + {145,152,135}, + {149,147,157}, + {157,158,149}, + {164,150,151}, + {153,163,168}, + {153,168,154}, + {185,183,182}, + {185,182,184}, + {161,189,190}, + {200,199,191}, + {200,191,190}, + {180,178,195}, + {180,195,196}, + {102,101,204}, + {102,204,206}, + { 43, 48,104}, + { 43,104,103}, + {216,217, 54}, + {216, 54, 32}, + {207,224,231}, + {230,212,211}, + {230,211,231}, + {227,232,241}, + {227,241,242}, + {235,234,241}, + {235,241,244}, + {430,248,247}, + {272,274,253}, + {272,253,252}, + {439,260,275}, + {225,224,259}, + {225,259,257}, + {269,270,407}, + {269,407,405}, + {270,269,273}, + {270,273,272}, + {273,269,268}, + {273,268,267}, + {273,267,266}, + {273,266,265}, + {273,265,264}, + {448,279,367}, + {281,350,368}, + {285,286,301}, + {290,323,310}, + {290,311,323}, + {282,281,189}, + {292,311,290}, + {292,290,291}, + {307,306,302}, + {307,302,303}, + {316,315,324}, + {316,324,329}, + {331,351,350}, + {330,334,335}, + {330,335,328}, + {341,337,338}, + {344,355,354}, + {346,345,348}, + {346,348,347}, + {364,369,352}, + {364,352,353}, + {365,363,361}, + {365,361,362}, + {376,401,402}, + {373,372,397}, + {373,397,400}, + {376, 92,377}, + {381,378,387}, + {381,387,385}, + {386, 77, 80}, + {390,389,412}, + {416,417,401}, + {403,417,415}, + {408,429,430}, + {419,423,418}, + {427,428,444}, + {427,444,446}, + {437,436,441}, + {450,445, 11}, + {450, 11, 4}, + {447,449, 5}, + {447, 5, 8}, + {441,438,437}, + {425,426,451}, + {425,451,452}, + {417,421,415}, + {408,407,429}, + {399,403,400}, + {399,400,397}, + {394,393,416}, + {389,411,412}, + {386,383,385}, + {408,387,378}, + {408,378,406}, + {377,391,376}, + { 94,375,415}, + {372,373,374}, + {372,374,370}, + {359,111,360}, + {359,112,111}, + {113,358,349}, + {113,349,123}, + {346,343,345}, + {343,340,342}, + {338,336,144}, + {338,144,141}, + {327,341,354}, + {327,354,326}, + {331,350,321}, + {331,321,322}, + {314,313,326}, + {314,326,325}, + {300,298,299}, + {300,299,301}, + {288,287,289}, + {189,292,282}, + {287,288,303}, + {284,285,297}, + {368,280,281}, + {448,447,279}, + {274,226,255}, + {267,268,404}, + {267,404,379}, + {429,262,430}, + {439,440,260}, + {257,258,249}, + {257,249,246}, + {430,262,248}, + {234,228,242}, + {234,242,241}, + {237,238,239}, + {237,239,236}, + { 15, 18,227}, + { 15,227,229}, + {222,223, 82}, + {222, 82, 83}, + {214,215,213}, + {214,213, 81}, + { 38,102, 6}, + {122,159,200}, + {122,200,201}, + {174,171,192}, + {174,192,194}, + {197,193,198}, + {190,170,161}, + {181,179,178}, + {181,178,180}, + {166,156,155}, + {163,153,152}, + {163,152,162}, + {120,156,149}, + {120,149,121}, + {152,153,135}, + {140,143,142}, + {135,131,132}, + {135,132,136}, + {130,129,128}, + {130,128,127}, + {100,105,119}, + {100,119,120}, + {106,104,107}, + {106,107,108}, + { 91, 95, 59}, + { 93, 94, 68}, + { 91, 89, 92}, + { 76, 53, 55}, + { 76, 55, 87}, + { 81, 78, 79}, + { 74, 73, 49}, + { 69, 60, 45}, + { 58, 62, 64}, + { 58, 64, 61}, + { 53, 31, 32}, + { 32, 54, 53}, + { 42, 43, 38}, + { 35, 36, 0}, + { 35, 0, 1}, + { 34, 35, 1}, + { 34, 1, 9}, + { 44, 40, 41}, + { 44, 41, 45}, + { 33,240, 51}, + { 63, 62, 58}, + { 63, 58, 59}, + { 45, 71, 70}, + { 76, 75, 51}, + { 76, 51, 52}, + { 86, 85, 84}, + { 86, 84, 87}, + { 89, 72, 73}, + { 89, 73, 88}, + { 91, 92, 96}, + { 91, 96, 95}, + { 72, 91, 60}, + { 72, 60, 69}, + {104,106,105}, + {119,105,117}, + {119,117,118}, + {124,127,128}, + {117,116,129}, + {117,129,131}, + {118,117,131}, + {135,140,142}, + {146,150,152}, + {146,152,145}, + {149,122,121}, + {166,165,151}, + {166,151,156}, + {158,172,173}, + {161,160,189}, + {199,198,193}, + {199,193,191}, + {204,201,202}, + {178,174,194}, + {200,159,186}, + {109, 48, 67}, + { 48,107,104}, + {216, 32,236}, + {216,236,239}, + {223,214, 81}, + {223, 81, 82}, + { 33, 12, 15}, + { 32,228,234}, + { 32,234,236}, + {240, 31, 52}, + {256,255,246}, + {256,246,249}, + {258,263,248}, + {258,248,249}, + {275,260,259}, + {275,259,276}, + {207,276,259}, + {270,271,429}, + {270,429,407}, + {413,418,366}, + {413,366,365}, + {368,367,279}, + {368,279,280}, + {303,301,286}, + {303,286,287}, + {283,282,292}, + {283,292,291}, + {320,292,189}, + {298,296,297}, + {298,297,299}, + {318,327,326}, + {318,326,313}, + {329,330,317}, + {336,333,320}, + {326,354,353}, + {334,332,333}, + {334,333,336}, + {342,339,139}, + {342,139,138}, + {345,342,126}, + {347,357,356}, + {369,368,351}, + {363,356,357}, + {363,357,361}, + {366,367,368}, + {366,368,369}, + {375,373,400}, + { 92, 90,377}, + {409,387,408}, + {386,385,387}, + {386,387,388}, + {412,394,391}, + {396,398,399}, + {408,406,405}, + {415,421,419}, + {415,419,414}, + {425,452,448}, + {425,448,424}, + {444,441,443}, + {448,452,449}, + {448,449,447}, + {446,444,443}, + {446,443,445}, + {250,247,261}, + {250,261,428}, + {421,422,423}, + {421,423,419}, + {427,410,250}, + {417,403,401}, + {403,402,401}, + {420,392,412}, + {420,412,425}, + {420,425,424}, + {386,411,389}, + {383,382,381}, + {383,381,385}, + {378,379,404}, + {372,371,395}, + {372,395,397}, + {371,372,370}, + {361,359,360}, + {361,360,362}, + {368,350,351}, + {349,347,348}, + {356,355,344}, + {356,344,346}, + {344,341,340}, + {344,340,343}, + {338,337,336}, + {328,335,341}, + {324,352,351}, + {324,351,331}, + {320,144,336}, + {314,325,324}, + {322,308,309}, + {310,309,307}, + {287,286,289}, + {203,280,279}, + {203,279,205}, + {297,295,283}, + {297,283,284}, + {447,205,279}, + {274,384, 80}, + {274, 80,226}, + {266,267,379}, + {266,379,380}, + {225,257,246}, + {225,246,245}, + {256,254,253}, + {256,253,255}, + {430,247,250}, + {226,235,244}, + {226,244,245}, + {232,233,244}, + {232,244,241}, + {230, 18, 19}, + { 32, 31,228}, + {219,220, 86}, + {219, 86, 57}, + {226,213,235}, + {206, 7, 6}, + {122,201,101}, + {201,204,101}, + {180,196,197}, + {170,192,171}, + {200,190,189}, + {194,193,195}, + {183,181,180}, + {183,180,182}, + {155,154,168}, + {149,156,151}, + {149,151,148}, + {155,156,120}, + {145,142,143}, + {145,143,146}, + {136,137,140}, + {133,132,130}, + {128,129,116}, + {100,120,121}, + {110,112,113}, + {110,113,114}, + { 66, 65, 63}, + { 66, 63, 99}, + { 66, 99, 98}, + { 96, 46, 61}, + { 89, 88, 90}, + { 86, 87, 57}, + { 80, 78, 81}, + { 72, 69, 49}, + { 67, 48, 47}, + { 67, 47, 68}, + { 56, 55, 53}, + { 50, 49, 36}, + { 50, 36, 35}, + { 40, 39, 41}, + {242,243,229}, + {242,229,227}, + { 6, 37, 39}, + { 42, 47, 48}, + { 42, 48, 43}, + { 61, 46, 44}, + { 45, 70, 69}, + { 69, 70, 71}, + { 69, 71, 49}, + { 74, 78, 77}, + { 83, 84, 85}, + { 73, 74, 77}, + { 93, 96, 92}, + { 68, 46, 93}, + { 95, 99, 63}, + { 95, 63, 59}, + {115,108,110}, + {115,110,114}, + {125,126,127}, + {129,130,132}, + {137,133,138}, + {137,138,139}, + {148,146,143}, + {148,143,147}, + {119,118,154}, + {161,147,143}, + {165,164,151}, + {158,157,171}, + {158,171,172}, + {159,158,187}, + {159,187,186}, + {194,192,191}, + {194,191,193}, + {189,202,201}, + {182,197,184}, + {205, 8, 7}, + { 48,109,107}, + {218,219, 57}, + {218, 57, 56}, + {207,231,211}, + {232,230,231}, + {232,231,233}, + { 53, 52, 31}, + {388,411,386}, + {409,430,250}, + {262,429,254}, + {262,254,256}, + {442,444,428}, + {273,264,383}, + {273,383,384}, + {429,271,251}, + {429,251,254}, + {413,365,362}, + { 67,413,360}, + {282,283,295}, + {285,301,299}, + {202,281,280}, + {284,283,291}, + {284,291,289}, + {320,189,160}, + {308,306,307}, + {307,309,308}, + {319,317,330}, + {319,330,328}, + {353,352,324}, + {332,331,333}, + {340,341,338}, + {354,341,344}, + {349,358,357}, + {349,357,347}, + {364,355,356}, + {364,356,363}, + {364,365,366}, + {364,366,369}, + {374,376,402}, + {375, 92,373}, + { 77,389,390}, + {382,380,381}, + {389, 77,386}, + {393,394,412}, + {393,412,392}, + {401,394,416}, + {415,400,403}, + {411,410,427}, + {411,427,426}, + {422,420,424}, + {247,248,263}, + {247,263,261}, + {445,443, 14}, + {445, 14, 11}, + {449,450, 4}, + {449, 4, 5}, + {443,441, 17}, + {443, 17, 14}, + {436, 23, 17}, + {436, 17,441}, + {424,448,422}, + {448,423,422}, + {414,419,418}, + {414,418,413}, + {406,404,405}, + {399,397,395}, + {399,395,396}, + {420,416,392}, + {388,410,411}, + {386,384,383}, + {390, 88, 77}, + {375, 94, 92}, + {415,414, 68}, + {415, 68, 94}, + {370,374,402}, + {370,402,398}, + {361,357,358}, + {361,358,359}, + {125,348,126}, + {346,344,343}, + {340,338,339}, + {337,335,334}, + {337,334,336}, + {325,353,324}, + {324,331,332}, + {324,332,329}, + {323,322,309}, + {323,309,310}, + {294,295,297}, + {294,297,296}, + {289,286,285}, + {202,280,203}, + {288,307,303}, + {282,295,321}, + { 67,360,111}, + {418,423,367}, + {418,367,366}, + {272,252,251}, + {272,251,271}, + {272,271,270}, + {255,253,274}, + {265,266,380}, + {265,380,382}, + {442,428,261}, + {440,263,258}, + {440,258,260}, + {409,250,410}, + {255,226,245}, + {255,245,246}, + { 31,240,243}, + {236,234,235}, + {236,235,237}, + {233,225,245}, + {233,245,244}, + {220,221, 85}, + {220, 85, 86}, + { 81,213,226}, + { 81,226, 80}, + { 7,206,205}, + {186,184,198}, + {186,198,199}, + {204,203,205}, + {204,205,206}, + {195,193,196}, + {171,174,172}, + {173,174,175}, + {173,172,174}, + {155,167,166}, + {160,161,143}, + {160,143,144}, + {119,154,155}, + {148,151,150}, + {148,150,146}, + {140,137,139}, + {140,139,141}, + {127,126,130}, + {114,124,128}, + {114,128,115}, + {117,105,106}, + {117,106,116}, + {104,105,100}, + {104,100,103}, + { 59, 60, 91}, + { 97, 96, 61}, + { 97, 61, 64}, + { 91, 72, 89}, + { 87, 84, 79}, + { 87, 79, 76}, + { 78, 80, 77}, + { 49, 50, 74}, + { 60, 44, 45}, + { 61, 44, 58}, + { 51, 50, 35}, + { 51, 35, 34}, + { 39, 37, 41}, + { 33, 34, 9}, + { 33, 9, 12}, + { 0, 36, 37}, + { 0, 37, 6}, + { 40, 46, 47}, + { 40, 47, 42}, + { 53, 54, 56}, + { 65, 62, 63}, + { 72, 49, 73}, + { 79, 78, 75}, + { 79, 75, 76}, + { 52, 53, 76}, + { 92, 89, 90}, + { 96, 93, 46}, + {102,103,100}, + {102,100,101}, + {116,106,108}, + {116,108,115}, + {123,125,124}, + {116,115,128}, + {118,131,135}, + {140,135,136}, + {148,147,149}, + {120,119,155}, + {164,162,152}, + {164,152,150}, + {157,147,161}, + {157,161,170}, + {186,187,185}, + {186,185,184}, + {193,197,196}, + {202,203,204}, + {194,195,178}, + {198,184,197}, + { 67,111,109}, + { 38, 43,103}, + { 38,103,102}, + {214,223,222}, + {214,222,221}, + {214,221,220}, + {214,220,219}, + {214,219,218}, + {213,237,235}, + {221,222, 83}, + {221, 83, 85}, + { 15,229, 33}, + {227, 18,230}, + {227,230,232}, + { 52, 51,240}, + { 75, 78, 50}, + {408,430,409}, + {260,258,257}, + {260,257,259}, + {224,207,259}, + {268,269,405}, + {268,405,404}, + {413,362,360}, + {447, 8,205}, + {299,297,285}, + {189,281,202}, + {290,288,289}, + {290,289,291}, + {322,321,295}, + {322,295,294}, + {333,323,311}, + {333,311,320}, + {317,316,329}, + {320,160,144}, + {353,325,326}, + {329,332,334}, + {329,334,330}, + {339,338,141}, + {339,141,139}, + {348,345,126}, + {347,356,346}, + {123,349,125}, + {364,353,354}, + {364,354,355}, + {365,364,363}, + {376,391,394}, + {376,394,401}, + { 92,376,374}, + { 92,374,373}, + {377, 90, 88}, + {380,379,378}, + {380,378,381}, + {388,387,409}, + {388,409,410}, + {416,393,392}, + {399,398,402}, + {399,402,403}, + {250,428,427}, + {421,417,416}, + {421,416,420}, + {426,427,446}, + {426,446,451}, + {444,442,441}, + {452,451,450}, + {452,450,449} +}; + + +//***************************THE END OF FAMOUS BUNNY TRIMESH********************************************// + +//****GLOBALS + +//****GLOBALS + +///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; + + + +int main(int argc,char** argv) +{ + gContactAddedCallback = CustomMaterialCombinerCallback; + + ConcaveDemo* concaveDemo = new ConcaveDemo(); + concaveDemo->initPhysics(); + concaveDemo->setCameraDistance(30.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,"Moving Concave Mesh Demo",concaveDemo); +} + +void ConcaveDemo::renderme() +{ + updateCamera(); + + btScalar m[16]; + + if (m_dynamicsWorld) + { + btVector3 worldBoundsMin,worldBoundsMax; + getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btVector3 wireColor(1,0,0); + for (int i=0;igetCollisionObjectArray()[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 (1.f,0.f,0.f); + } else + { + wireColor += btVector3 (.5f,0.f,0.f); + } + } + if (colObj->getActivationState() == 2) //ISLAND_SLEEPING + { + if (i & 1) + { + wireColor += btVector3 (0.f,1.f, 0.f); + } else + { + wireColor += btVector3 (0.f,0.5f,0.f); + } + } + + m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glColor3f(0, 0, 0); + + setOrthographicProjection(); + + sprintf(buf,"mouse to interact"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + /* glRasterPos3f(xOffset,xOffset,0); + sprintf(buf,"space to reset"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + */ + + sprintf(buf,"cursor keys and z,x to navigate"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + + sprintf(buf,"i to toggle simulation, s single step"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + + sprintf(buf,"q to quit"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + + sprintf(buf,". to shoot TRIMESH (dot)"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + // not yet hooked up again after refactoring... + +/* glRasterPos3f(xOffset,xOffset,0); + sprintf(buf,"d to toggle deactivation"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; +*/ + + /* + glRasterPos3f(xOffset,xOffset,0); + sprintf(buf,"a to draw temporal AABBs"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + */ + + + sprintf(buf,"h to toggle help text"); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); + + bool useCCD = ((getDebugMode() & btIDebugDraw::DBG_EnableCCD) != 0); + + + sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + + sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); + GLDebugDrawString(xOffset,xOffset,buf); + xOffset += yIncr; + + resetPerspectiveProjection(); + + + } + +} + + + +void ConcaveDemo::initGImpactCollision() +{ + // create trimesh + btTriangleIndexVertexArray* indexVertexArrays = new btTriangleIndexVertexArray(NUM_TRIANGLES, + &gIndices[0][0], + 3*sizeof(int), + NUM_VERTICES,(REAL*) &gVertices[0],sizeof(REAL)*3); + + btGImpactMeshShape * trimesh = new btGImpactMeshShape(indexVertexArrays); + trimesh->setLocalScaling(btVector3(4.f,4.f,4.f)); + trimesh->updateBound(); + m_trimeshShape = trimesh; + + //register algorithm + + btCollisionDispatcher * dispatcher = static_cast(m_dynamicsWorld ->getDispatcher()); + btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); + +} + +void ConcaveDemo::initPhysics() +{ + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + + //btConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + //btOverlappingPairCache* broadphase = new btSimpleBroadphase(); + btBroadphaseInterface* broadphase = new btSimpleBroadphase(); + + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,constraintSolver,collisionConfiguration); + + + //create trimesh model and shape + initGImpactCollision(); + + + + 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,0,0)); + staticScenario->addChildShape(startTransform,staticboxShape1); + startTransform.setOrigin(btVector3(-200,25,0)); + staticScenario->addChildShape(startTransform,staticboxShape2); + startTransform.setOrigin(btVector3(200,25,0)); + staticScenario->addChildShape(startTransform,staticboxShape3); + startTransform.setOrigin(btVector3(0,25,200)); + staticScenario->addChildShape(startTransform,staticboxShape4); + startTransform.setOrigin(btVector3(0,25,-200)); + staticScenario->addChildShape(startTransform,staticboxShape5); + + startTransform.setOrigin(btVector3(0,0,0)); + + btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticScenario); + + staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); + + //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,0,0)); + + btRigidBody* staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape6 ); + + staticBody2->setCollisionFlags(staticBody2->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); + + { + 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); + } + } + + shootTrimesh(btVector3(0,10,0),btVector3(0,0,0)); + + shootTrimesh(btVector3(0,20,0),btVector3(0,10,0)); + + //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + +} + +void ConcaveDemo::keyboardCallback(unsigned char key, int x, int y) +{ + m_lastKey = 0; + + switch (key) + { + case 'q' : exit(0); break; + + 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); + else + m_debugMode |= btIDebugDraw::DBG_DrawAabb; + 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(getCameraPosition(),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(); + +} + + +void ConcaveDemo::shootTrimesh(const btVector3& startPosition,const btVector3& destination) +{ + + if (m_dynamicsWorld) + { + float mass = 4.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(startPosition); + + btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_trimeshShape); + + btVector3 linVel(destination[0]-startPosition[0],destination[1]-startPosition[1],destination[2]-startPosition[2]); + linVel.normalize(); + linVel*=m_ShootBoxInitialSpeed*0.25; + + body->getWorldTransform().setOrigin(startPosition); + body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); + body->setLinearVelocity(linVel); + body->setAngularVelocity(btVector3(0,0,0)); + } +} + +void ConcaveDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = float(getDeltaTimeMicroseconds()) * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + diff --git a/Demos/MultiMaterialDemo/CMakeLists.txt b/Demos/MultiMaterialDemo/CMakeLists.txt index 80d83185b..b995b8865 100644 --- a/Demos/MultiMaterialDemo/CMakeLists.txt +++ b/Demos/MultiMaterialDemo/CMakeLists.txt @@ -1,31 +1,31 @@ -# 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( -OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) - -ADD_EXECUTABLE(AppMultiMaterialDemo - MultiMaterialDemo.cpp - main.cpp -) - - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppMultiMaterialDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppMultiMaterialDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppMultiMaterialDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppMultiMaterialDemo + MultiMaterialDemo.cpp + main.cpp +) + + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppMultiMaterialDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppMultiMaterialDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppMultiMaterialDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp b/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp index 71fd5b54c..6c748d8ca 100644 --- a/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp +++ b/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp @@ -1,382 +1,382 @@ -/* -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 "LinearMath/btIDebugDraw.h" -#include "GLDebugDrawer.h" -#include "MultiMaterialDemo.h" -#include "GL_ShapeDrawer.h" -#include "GlutStuff.h" - -#include "BulletCollision/CollisionShapes/btTriangleShape.h" -#include "BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h" -#include "BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btMaterial.h" - -// Create a custom material, just because we can -class CustomMaterial : public btMaterial -{ -public: - int foo1; - int foo2; - CustomMaterial(){} - CustomMaterial(int a, int b) {foo1 = a; foo2 = b;} -}; - -// Storage for the vertex data -static btVector3* gVertices = 0; -// Storage for the face data -static int* gIndices = 0; -// Storage for the material data -static CustomMaterial* gMaterials = 0; -// Storage for the face -> material index data -static int* gFaceMaterialIndices = 0; - -static btBvhTriangleMeshShape* trimeshShape =0; -static btRigidBody* staticBody = 0; -static float waveheight = 0.f; - -const float TRIANGLE_SIZE=1.f; - - -///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; -} - - - -static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) -{ - - // Apply material properties - if (colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) - { - const btCollisionShape* parent0 = colObj0->getRootCollisionShape(); - if(parent0 != 0 && parent0->getShapeType() == MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE) - { - btMultimaterialTriangleMeshShape* shape = (btMultimaterialTriangleMeshShape*)parent0; - const btMaterial * props = shape->getMaterialProperties(partId0, index0); - cp.m_combinedFriction = calculateCombinedFriction(props->m_friction, colObj1->getFriction()); - cp.m_combinedRestitution = props->m_restitution * colObj1->getRestitution(); - } - } - else if (colObj1->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) - { - const btCollisionShape* parent1 = colObj1->getRootCollisionShape(); - if(parent1 != 0 && parent1->getShapeType() == MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE) - { - btMultimaterialTriangleMeshShape* shape = (btMultimaterialTriangleMeshShape*)parent1; - const btMaterial * props = shape->getMaterialProperties(partId1, index1); - cp.m_combinedFriction = calculateCombinedFriction(props->m_friction, colObj0->getFriction()); - cp.m_combinedRestitution = props->m_restitution * colObj0->getRestitution(); - } - } - - //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; - -const int NUM_VERTS_X = 20; -const int NUM_VERTS_Y = 50; -const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - -void MultiMaterialDemo::setVertexPositions(float waveheight, float offset) -{ - int i; - int j; - - for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->setActivationState(DISABLE_DEACTIVATION); - } else - { - staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); - staticBody->forceActivationState(ACTIVE_TAG); - } - } - - DemoApplication::keyboardCallback(key,x,y); - -} - -void MultiMaterialDemo::initPhysics() -{ -#define TRISIZE 50.f - - gContactAddedCallback = CustomMaterialCombinerCallback; - - // The number of triangles - const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); - // The number of materials - const int totalMaterials = 2; - - int vertStride = sizeof(btVector3); - int indexStride = 3*sizeof(int); - int materialStride = sizeof(CustomMaterial); - int triangleMaterialStride = sizeof(int); - - gVertices = new btVector3[totalVerts]; - gIndices = new int[totalTriangles*3]; - gMaterials = new CustomMaterial[totalMaterials]; - gFaceMaterialIndices = new int[totalTriangles]; - - // Explicitly set up the materials. It's a small array so let's do it bit by bit. - gMaterials[0].m_friction = 0; - gMaterials[0].m_restitution = 0.9; - gMaterials[0].foo1 = 5; - gMaterials[0].foo2 = 7; - gMaterials[1].m_friction = 0.9; - gMaterials[1].m_restitution = 0.1; - gMaterials[1].foo1 = 53; - gMaterials[1].foo2 = 15; - - int i; - // Set up the vertex data - setVertexPositions(waveheight,0.f); - int index=0; - // Set up the face data - for ( i=0;imaterial index data - for(int a = 0; a < totalTriangles; a++) - { - // This will give the first half of the faces low friction and high restitution - // and the second half of the faces high friction and low restitution - if(a > totalTriangles*0.5f) - gFaceMaterialIndices[a] = 0; - else - gFaceMaterialIndices[a] = 1; - } - - // Create the array structure - m_indexVertexArrays = new btTriangleIndexVertexMaterialArray( - totalTriangles, gIndices, indexStride, - totalVerts,(btScalar*) &gVertices[0].x(),vertStride, - totalMaterials, (unsigned char *)gMaterials, sizeof(CustomMaterial), - gFaceMaterialIndices, sizeof(int)); - - bool useQuantizedAabbCompression = true; - // Create the multimaterial mesh shape - trimeshShape = new btMultimaterialTriangleMeshShape((btTriangleIndexVertexMaterialArray*)m_indexVertexArrays,useQuantizedAabbCompression); - m_collisionShapes.push_back(trimeshShape); - - btCollisionShape* groundShape = trimeshShape; - - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - btVector3 worldMin(-1000,-1000,-1000); - btVector3 worldMax(1000,1000,1000); - m_broadphase = new btAxisSweep3(worldMin,worldMax); - m_solver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - - float mass = 0.f; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,-2,0)); - - btCollisionShape* colShape = new btBoxShape(btVector3(0.5f,0.5f,0.5f)); - m_collisionShapes.push_back(colShape); - - { - for (int i=0;i<1;i++) - { - startTransform.setOrigin(btVector3(10,10,-20)); - btRigidBody* body = localCreateRigidBody(1, startTransform,colShape); - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - body->setFriction(0.9f); - body->setGravity(btVector3(0,-20.f,0)); - body->applyCentralImpulse(btVector3(-7.7f,0,0)); - } - } - - startTransform.setIdentity(); - staticBody = localCreateRigidBody(mass, startTransform,groundShape); - - staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); - - //enable custom material callback - staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); -} - -void MultiMaterialDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - if (m_animatedMesh) - { - static float offset=0.f; - offset+=0.01f; - - // setVertexPositions(waveheight,offset); - - int i; - int j; - btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); - btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); - - for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); - - //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - } - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - glutSwapBuffers(); - -} - - - - -void MultiMaterialDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - glFlush(); - glutSwapBuffers(); -} - - - -void MultiMaterialDemo::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 material index data +static int* gFaceMaterialIndices = 0; + +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 0.f; + +const float TRIANGLE_SIZE=1.f; + + +///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; +} + + + +static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + // Apply material properties + if (colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) + { + const btCollisionShape* parent0 = colObj0->getRootCollisionShape(); + if(parent0 != 0 && parent0->getShapeType() == MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE) + { + btMultimaterialTriangleMeshShape* shape = (btMultimaterialTriangleMeshShape*)parent0; + const btMaterial * props = shape->getMaterialProperties(partId0, index0); + cp.m_combinedFriction = calculateCombinedFriction(props->m_friction, colObj1->getFriction()); + cp.m_combinedRestitution = props->m_restitution * colObj1->getRestitution(); + } + } + else if (colObj1->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) + { + const btCollisionShape* parent1 = colObj1->getRootCollisionShape(); + if(parent1 != 0 && parent1->getShapeType() == MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE) + { + btMultimaterialTriangleMeshShape* shape = (btMultimaterialTriangleMeshShape*)parent1; + const btMaterial * props = shape->getMaterialProperties(partId1, index1); + cp.m_combinedFriction = calculateCombinedFriction(props->m_friction, colObj0->getFriction()); + cp.m_combinedRestitution = props->m_restitution * colObj0->getRestitution(); + } + } + + //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; + +const int NUM_VERTS_X = 20; +const int NUM_VERTS_Y = 50; +const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void MultiMaterialDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void MultiMaterialDemo::initPhysics() +{ +#define TRISIZE 50.f + + gContactAddedCallback = CustomMaterialCombinerCallback; + + // The number of triangles + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + // The number of materials + const int totalMaterials = 2; + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + int materialStride = sizeof(CustomMaterial); + int triangleMaterialStride = sizeof(int); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + gMaterials = new CustomMaterial[totalMaterials]; + gFaceMaterialIndices = new int[totalTriangles]; + + // Explicitly set up the materials. It's a small array so let's do it bit by bit. + gMaterials[0].m_friction = 0; + gMaterials[0].m_restitution = 0.9; + gMaterials[0].foo1 = 5; + gMaterials[0].foo2 = 7; + gMaterials[1].m_friction = 0.9; + gMaterials[1].m_restitution = 0.1; + gMaterials[1].foo1 = 53; + gMaterials[1].foo2 = 15; + + int i; + // Set up the vertex data + setVertexPositions(waveheight,0.f); + int index=0; + // Set up the face data + for ( i=0;imaterial index data + for(int a = 0; a < totalTriangles; a++) + { + // This will give the first half of the faces low friction and high restitution + // and the second half of the faces high friction and low restitution + if(a > totalTriangles*0.5f) + gFaceMaterialIndices[a] = 0; + else + gFaceMaterialIndices[a] = 1; + } + + // Create the array structure + m_indexVertexArrays = new btTriangleIndexVertexMaterialArray( + totalTriangles, gIndices, indexStride, + totalVerts,(btScalar*) &gVertices[0].x(),vertStride, + totalMaterials, (unsigned char *)gMaterials, sizeof(CustomMaterial), + gFaceMaterialIndices, sizeof(int)); + + bool useQuantizedAabbCompression = true; + // Create the multimaterial mesh shape + trimeshShape = new btMultimaterialTriangleMeshShape((btTriangleIndexVertexMaterialArray*)m_indexVertexArrays,useQuantizedAabbCompression); + m_collisionShapes.push_back(trimeshShape); + + btCollisionShape* groundShape = trimeshShape; + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_broadphase = new btAxisSweep3(worldMin,worldMax); + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-2,0)); + + btCollisionShape* colShape = new btBoxShape(btVector3(0.5f,0.5f,0.5f)); + m_collisionShapes.push_back(colShape); + + { + for (int i=0;i<1;i++) + { + startTransform.setOrigin(btVector3(10,10,-20)); + btRigidBody* body = localCreateRigidBody(1, startTransform,colShape); + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + body->setFriction(0.9f); + body->setGravity(btVector3(0,-20.f,0)); + body->applyCentralImpulse(btVector3(-7.7f,0,0)); + } + } + + startTransform.setIdentity(); + staticBody = localCreateRigidBody(mass, startTransform,groundShape); + + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); +} + +void MultiMaterialDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + // setVertexPositions(waveheight,offset); + + int i; + int j; + btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); + btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); + + for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + +void MultiMaterialDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + + +void MultiMaterialDemo::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_collisionShapes; - - btTriangleIndexVertexArray* m_indexVertexArrays; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - bool m_animatedMesh; - - public: - - MultiMaterialDemo() : m_animatedMesh(true) - { - - } - void initPhysics(); - - void exitPhysics(); - - virtual ~MultiMaterialDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - //to show refit works - void setVertexPositions(float waveheight, float offset); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - MultiMaterialDemo* demo = new MultiMaterialDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - }; -}; - -#endif //CONCAVE_DEMO_H - +/* +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 CONCAVE_DEMO_H +#define CONCAVE_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleIndexVertexArray; + +///MultiMaterialDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class MultiMaterialDemo : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + MultiMaterialDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~MultiMaterialDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + MultiMaterialDemo* demo = new MultiMaterialDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_DEMO_H + diff --git a/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp index 765b1c0df..4fff696df 100644 --- a/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp +++ b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp @@ -1,480 +1,480 @@ -/* -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. -*/ - -//#define USE_PARALLEL_SOLVER 1 //experimental parallel solver -#define USE_PARALLEL_DISPATCHER 1 - -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" -#include "BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h" - -#ifdef USE_PARALLEL_DISPATCHER -#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" -#include "BulletMultiThreaded/PlatformDefinitions.h" - -#ifdef USE_LIBSPE2 -#include "BulletMultiThreaded/SpuLibspe2Support.h" -#elif defined (_WIN32) -#include "BulletMultiThreaded/Win32ThreadSupport.h" -#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" - -#elif defined (USE_PTHREADS) - -#include "BulletMultiThreaded/PosixThreadSupport.h" -#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" - -#else -//other platforms run the parallel code sequentially (until pthread support or other parallel implementation is added) -#include "BulletMultiThreaded/SequentialThreadSupport.h" -#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" -#endif //USE_LIBSPE2 - -#ifdef USE_PARALLEL_SOLVER -#include "BulletMultiThreaded/SpuParallelSolver.h" -#include "BulletMultiThreaded/SpuSolverTask/SpuParallellSolverTask.h" -#endif //USE_PARALLEL_SOLVER - -#endif//USE_PARALLEL_DISPATCHER - - -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btIDebugDraw.h" - - - -#include //printf debugging - -#include "MultiThreadedDemo.h" -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" - - -extern float eye[3]; -extern int glutScreenWidth; -extern int glutScreenHeight; - -const int maxProxies = 32766; -const int maxOverlap = 65535; - - - - -#ifdef _DEBUG -const int gNumObjects = 120; -#else -const int gNumObjects = 120;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp -#endif - - -const int maxNumObjects = 32760; - -static int shapeIndex[maxNumObjects]; - - -#define CUBE_HALF_EXTENTS 0.5 - -#define EXTRA_HEIGHT -10.f -//GL_LineSegmentShape shapeE(btVector3(-50,0,0), -// btVector3(50,0,0)); - - -void MultiThreadedDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) -{ - btTransform trans; - trans.setIdentity(); - - for(int i=0; istepSimulation(1.0f/60.f,0); - //CProfileManager::dumpAll(); - -#else - //during idle mode, just run 1 simulation step maximum - int maxSimSubSteps = m_idle ? 1 : 1; - if (m_idle) - dt = 1.0/420.f; - - int numSimSteps = 0; - numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - -#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 - } - -#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(); - - - glutSwapBuffers(); - -} - - - -void MultiThreadedDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - - renderme(); - - glFlush(); - glutSwapBuffers(); -} - - - - - -void MultiThreadedDemo::initPhysics() -{ -#ifdef USE_PARALLEL_DISPATCHER - m_threadSupportSolver = 0; - m_threadSupportCollision = 0; -#endif - -//#define USE_GROUND_PLANE 1 -#ifdef USE_GROUND_PLANE - m_collisionShapes.push_back(new btStaticPlaneShape(btVector3(0,1,0),0.5)); -#else - - ///Please don't make the box sizes larger then 1000: the collision detection will be inaccurate. - ///See http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=346 - m_collisionShapes.push_back(new btBoxShape (btVector3(200,CUBE_HALF_EXTENTS,200))); -#endif - - m_collisionShapes.push_back(new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); - - - - setCameraDistance(32.5f); - - m_azi = 90.f; - - m_dispatcher=0; - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - -#ifdef USE_PARALLEL_DISPATCHER - int maxNumOutstandingTasks = 4; - -#ifdef USE_WIN32_THREADING - -m_threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( - "collision", - processCollisionTask, - createCollisionLocalStoreMemory, - maxNumOutstandingTasks)); -#else - -#ifdef USE_LIBSPE2 - - spe_program_handle_t * program_handle; -#ifndef USE_CESOF - program_handle = spe_image_open ("./spuCollision.elf"); - if (program_handle == NULL) - { - perror( "SPU OPEN IMAGE ERROR\n"); - } - else - { - printf( "IMAGE OPENED\n"); - } -#else - extern spe_program_handle_t spu_program; - program_handle = &spu_program; -#endif - SpuLibspe2Support* threadSupportCollision = new SpuLibspe2Support( program_handle, maxNumOutstandingTasks); -#elif defined (USE_PTHREADS) - PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", - processCollisionTask, - createCollisionLocalStoreMemory, - maxNumOutstandingTasks); - m_threadSupportCollision = new PosixThreadSupport(constructionInfo); -#else - - SequentialThreadSupport::SequentialThreadConstructionInfo colCI("collision",processCollisionTask,createCollisionLocalStoreMemory); - SequentialThreadSupport* m_threadSupportCollision = new SequentialThreadSupport(colCI); - -#endif //USE_LIBSPE2 - -///Playstation 3 SPU (SPURS) version is available through PS3 Devnet -/// For Unix/Mac someone could implement a pthreads version of btThreadSupportInterface? -///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface -#endif - - - m_dispatcher = new SpuGatheringCollisionDispatcher(m_threadSupportCollision,maxNumOutstandingTasks,m_collisionConfiguration); -// m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); -#else - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); -#endif //USE_PARALLEL_DISPATCHER - - - btVector3 worldAabbMin(-1000,-1000,-1000); - btVector3 worldAabbMax(1000,1000,1000); - - m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); - - - -#ifdef USE_PARALLEL_SOLVER - -#ifdef USE_WIN32_THREADING - m_threadSupportSolver = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( - "solver", - processSolverTask, - createSolverLocalStoreMemory, - maxNumOutstandingTasks)); -#elif defined (USE_PTHREADS) - PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processSolverTask, - createSolverLocalStoreMemory, maxNumOutstandingTasks); - - m_threadSupportSolver = new PosixThreadSupport(solverConstructionInfo); -#else - //for now use sequential version - SequentialThreadSupport::SequentialThreadConstructionInfo solverCI("solver",processSolverTask,createSolverLocalStoreMemory); - m_threadSupportSolver = new SequentialThreadSupport(solverCI); - -#endif //USE_WIN32_THREADING - m_solver = new btParallelSequentialImpulseSolver(m_threadSupportSolver,maxNumOutstandingTasks); - -#else - - btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); - - m_solver = solver; - //default solverMode is SOLVER_RANDMIZE_ORDER. Warmstarting seems not to improve convergence, see - //solver->setSolverMode(0);//btSequentialImpulseConstraintSolver::SOLVER_USE_WARMSTARTING | btSequentialImpulseConstraintSolver::SOLVER_RANDMIZE_ORDER); - -#endif //USE_PARALLEL_SOLVER - - btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - m_dynamicsWorld = world; - - world->getSolverInfo().m_numIterations = 4; - world->getSolverInfo().m_solverMode = SOLVER_SIMD+SOLVER_USE_WARMSTARTING; - - m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - - - - int i; - - btTransform tr; - tr.setIdentity(); - - - for (i=0;i0) - { - shapeIndex[i] = 1;//sphere - } - else - shapeIndex[i] = 0; - } - - - btTransform trans; - trans.setIdentity(); - - btScalar halfExtents = CUBE_HALF_EXTENTS; - - trans.setOrigin(btVector3(0,-halfExtents,0)); - - - - localCreateRigidBody(0.f,trans,m_collisionShapes[shapeIndex[0]]); - - int numWalls = 15; - int wallHeight = 15; - float wallDistance = 3; - - - for ( i=0;isetLinearVelocity(btVector3(0,0,-10)); -#endif -// clientResetScene(); - - -} - - - - - - -void MultiThreadedDemo::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 //printf debugging + +#include "MultiThreadedDemo.h" +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + + +extern float eye[3]; +extern int glutScreenWidth; +extern int glutScreenHeight; + +const int maxProxies = 32766; +const int maxOverlap = 65535; + + + + +#ifdef _DEBUG +const int gNumObjects = 120; +#else +const int gNumObjects = 120;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp +#endif + + +const int maxNumObjects = 32760; + +static int shapeIndex[maxNumObjects]; + + +#define CUBE_HALF_EXTENTS 0.5 + +#define EXTRA_HEIGHT -10.f +//GL_LineSegmentShape shapeE(btVector3(-50,0,0), +// btVector3(50,0,0)); + + +void MultiThreadedDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; istepSimulation(1.0f/60.f,0); + //CProfileManager::dumpAll(); + +#else + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 1; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = 0; + numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + +#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 + } + +#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(); + + + glutSwapBuffers(); + +} + + + +void MultiThreadedDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + + + + +void MultiThreadedDemo::initPhysics() +{ +#ifdef USE_PARALLEL_DISPATCHER + m_threadSupportSolver = 0; + m_threadSupportCollision = 0; +#endif + +//#define USE_GROUND_PLANE 1 +#ifdef USE_GROUND_PLANE + m_collisionShapes.push_back(new btStaticPlaneShape(btVector3(0,1,0),0.5)); +#else + + ///Please don't make the box sizes larger then 1000: the collision detection will be inaccurate. + ///See http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=346 + m_collisionShapes.push_back(new btBoxShape (btVector3(200,CUBE_HALF_EXTENTS,200))); +#endif + + m_collisionShapes.push_back(new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); + + + + setCameraDistance(32.5f); + + m_azi = 90.f; + + m_dispatcher=0; + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER + int maxNumOutstandingTasks = 4; + +#ifdef USE_WIN32_THREADING + +m_threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else + +#ifdef USE_LIBSPE2 + + spe_program_handle_t * program_handle; +#ifndef USE_CESOF + program_handle = spe_image_open ("./spuCollision.elf"); + if (program_handle == NULL) + { + perror( "SPU OPEN IMAGE ERROR\n"); + } + else + { + printf( "IMAGE OPENED\n"); + } +#else + extern spe_program_handle_t spu_program; + program_handle = &spu_program; +#endif + SpuLibspe2Support* threadSupportCollision = new SpuLibspe2Support( program_handle, maxNumOutstandingTasks); +#elif defined (USE_PTHREADS) + PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks); + m_threadSupportCollision = new PosixThreadSupport(constructionInfo); +#else + + SequentialThreadSupport::SequentialThreadConstructionInfo colCI("collision",processCollisionTask,createCollisionLocalStoreMemory); + SequentialThreadSupport* m_threadSupportCollision = new SequentialThreadSupport(colCI); + +#endif //USE_LIBSPE2 + +///Playstation 3 SPU (SPURS) version is available through PS3 Devnet +/// For Unix/Mac someone could implement a pthreads version of btThreadSupportInterface? +///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface +#endif + + + m_dispatcher = new SpuGatheringCollisionDispatcher(m_threadSupportCollision,maxNumOutstandingTasks,m_collisionConfiguration); +// m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#else + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#endif //USE_PARALLEL_DISPATCHER + + + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + + +#ifdef USE_PARALLEL_SOLVER + +#ifdef USE_WIN32_THREADING + m_threadSupportSolver = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "solver", + processSolverTask, + createSolverLocalStoreMemory, + maxNumOutstandingTasks)); +#elif defined (USE_PTHREADS) + PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processSolverTask, + createSolverLocalStoreMemory, maxNumOutstandingTasks); + + m_threadSupportSolver = new PosixThreadSupport(solverConstructionInfo); +#else + //for now use sequential version + SequentialThreadSupport::SequentialThreadConstructionInfo solverCI("solver",processSolverTask,createSolverLocalStoreMemory); + m_threadSupportSolver = new SequentialThreadSupport(solverCI); + +#endif //USE_WIN32_THREADING + m_solver = new btParallelSequentialImpulseSolver(m_threadSupportSolver,maxNumOutstandingTasks); + +#else + + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver; + //default solverMode is SOLVER_RANDMIZE_ORDER. Warmstarting seems not to improve convergence, see + //solver->setSolverMode(0);//btSequentialImpulseConstraintSolver::SOLVER_USE_WARMSTARTING | btSequentialImpulseConstraintSolver::SOLVER_RANDMIZE_ORDER); + +#endif //USE_PARALLEL_SOLVER + + btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + + world->getSolverInfo().m_numIterations = 4; + world->getSolverInfo().m_solverMode = SOLVER_SIMD+SOLVER_USE_WARMSTARTING; + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + + + int i; + + btTransform tr; + tr.setIdentity(); + + + for (i=0;i0) + { + shapeIndex[i] = 1;//sphere + } + else + shapeIndex[i] = 0; + } + + + btTransform trans; + trans.setIdentity(); + + btScalar halfExtents = CUBE_HALF_EXTENTS; + + trans.setOrigin(btVector3(0,-halfExtents,0)); + + + + localCreateRigidBody(0.f,trans,m_collisionShapes[shapeIndex[0]]); + + int numWalls = 15; + int wallHeight = 15; + float wallDistance = 3; + + + for ( i=0;isetLinearVelocity(btVector3(0,0,-10)); +#endif +// clientResetScene(); + + +} + + + + + + +void MultiThreadedDemo::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_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - class btThreadSupportInterface* m_threadSupportCollision; - class btThreadSupportInterface* m_threadSupportSolver; - - btConstraintSolver* m_solver; - - btCollisionAlgorithmCreateFunc* m_boxBoxCF; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - - public: - - void initPhysics(); - - void exitPhysics(); - - virtual ~MultiThreadedDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); - - static DemoApplication* Create() - { - MultiThreadedDemo* demo = new MultiThreadedDemo; - demo->myinit(); - demo->initPhysics(); - return demo; - } - -}; - -#endif //MULTI_THREADED_DEMO_H - +/* +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 MULTI_THREADED_DEMO_H +#define MULTI_THREADED_DEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + + +///MultiThreadedDemo shows basic stacking using Bullet physics, and allows toggle of Ccd (using key '1') +class MultiThreadedDemo : public GlutDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + class btThreadSupportInterface* m_threadSupportCollision; + class btThreadSupportInterface* m_threadSupportSolver; + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + public: + + void initPhysics(); + + void exitPhysics(); + + virtual ~MultiThreadedDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + MultiThreadedDemo* demo = new MultiThreadedDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //MULTI_THREADED_DEMO_H + diff --git a/Demos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp index 7eb06348e..9fe47febe 100644 --- a/Demos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -1,1382 +1,1382 @@ -/* -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 "DemoApplication.h" -#include "LinearMath/btIDebugDraw.h" -#include "BulletDynamics/Dynamics/btDynamicsWorld.h" - -#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"//picking -#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"//picking - -#include "BulletCollision/CollisionShapes/btCollisionShape.h" -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "BulletCollision/CollisionShapes/btSphereShape.h" -#include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" -#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h" -#include "GL_ShapeDrawer.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btDefaultMotionState.h" -#include "LinearMath/btSerializer.h" -#include "GLDebugFont.h" - -static bool use6Dof = false; -extern bool gDisableDeactivation; -int numObjects = 0; -const int maxNumObjects = 16384; -btTransform startTransforms[maxNumObjects]; -btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use of shapes) -#define SHOW_NUM_DEEP_PENETRATIONS 1 - -extern int gNumClampedCcdMotions; - -#ifdef SHOW_NUM_DEEP_PENETRATIONS -extern int gNumDeepPenetrationChecks; - -extern int gNumSplitImpulseRecoveries; -extern int gNumGjkChecks; -extern int gNumAlignedAllocs; -extern int gNumAlignedFree; -extern int gTotalBytesAlignedAllocs; - -#endif // - - -DemoApplication::DemoApplication() -//see btIDebugDraw.h for modes -: -m_dynamicsWorld(0), -m_pickConstraint(0), -m_shootBoxShape(0), -m_cameraDistance(15.0), -m_debugMode(0), -m_ele(20.f), -m_azi(0.f), -m_cameraPosition(0.f,0.f,0.f), -m_cameraTargetPosition(0.f,0.f,0.f), -m_mouseOldX(0), -m_mouseOldY(0), -m_mouseButtons(0), -m_modifierKeys(0), -m_scaleBottom(0.5f), -m_scaleFactor(2.f), -m_cameraUp(0,1,0), -m_forwardAxis(2), -m_glutScreenWidth(0), -m_glutScreenHeight(0), -m_ortho(0), -m_ShootBoxInitialSpeed(40.f), -m_stepping(true), -m_singleStep(false), -m_idle(false), - -m_enableshadows(false), -m_sundirection(btVector3(1,-2,1)*1000), -m_defaultContactProcessingThreshold(BT_LARGE_FLOAT) -{ -#ifndef BT_NO_PROFILE - m_profileIterator = CProfileManager::Get_Iterator(); -#endif //BT_NO_PROFILE - - m_shapeDrawer = new GL_ShapeDrawer (); - m_shapeDrawer->enableTexture(true); - m_enableshadows = false; -} - - - -DemoApplication::~DemoApplication() -{ -#ifndef BT_NO_PROFILE - CProfileManager::Release_Iterator(m_profileIterator); -#endif //BT_NO_PROFILE - - 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) -{ - - GLfloat light_ambient[] = { btScalar(0.2), btScalar(0.2), btScalar(0.2), btScalar(1.0) }; - GLfloat light_diffuse[] = { btScalar(1.0), btScalar(1.0), btScalar(1.0), btScalar(1.0) }; - GLfloat light_specular[] = { btScalar(1.0), btScalar(1.0), btScalar(1.0), btScalar(1.0 )}; - /* light_position is NOT default value */ - GLfloat light_position0[] = { btScalar(1.0), btScalar(10.0), btScalar(1.0), btScalar(0.0 )}; - GLfloat light_position1[] = { btScalar(-1.0), btScalar(-10.0), btScalar(-1.0), btScalar(0.0) }; - - glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); - glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); - glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); - glLightfv(GL_LIGHT0, GL_POSITION, light_position0); - - glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); - glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); - glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); - glLightfv(GL_LIGHT1, GL_POSITION, light_position1); - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_LIGHT1); - - - glShadeModel(GL_SMOOTH); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - - glClearColor(btScalar(0.7),btScalar(0.7),btScalar(0.7),btScalar(0)); - - // glEnable(GL_CULL_FACE); - // glCullFace(GL_BACK); -} - - -void DemoApplication::setCameraDistance(float dist) -{ - m_cameraDistance = dist; -} - -float DemoApplication::getCameraDistance() -{ - return m_cameraDistance; -} - - - -void DemoApplication::toggleIdle() { - if (m_idle) { - m_idle = false; - } - else { - m_idle = true; - } -} - - - - -void DemoApplication::updateCamera() { - - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - btScalar rele = m_ele * btScalar(0.01745329251994329547);// rads per deg - btScalar razi = m_azi * btScalar(0.01745329251994329547);// rads per deg - - - btQuaternion rot(m_cameraUp,razi); - - - btVector3 eyePos(0,0,0); - eyePos[m_forwardAxis] = -m_cameraDistance; - - btVector3 forward(eyePos[0],eyePos[1],eyePos[2]); - if (forward.length2() < SIMD_EPSILON) - { - forward.setValue(1.f,0.f,0.f); - } - btVector3 right = m_cameraUp.cross(forward); - btQuaternion roll(right,-rele); - - eyePos = btMatrix3x3(rot) * btMatrix3x3(roll) * eyePos; - - m_cameraPosition[0] = eyePos.getX(); - m_cameraPosition[1] = eyePos.getY(); - m_cameraPosition[2] = eyePos.getZ(); - m_cameraPosition += m_cameraTargetPosition; - - if (m_glutScreenWidth == 0 && m_glutScreenHeight == 0) - return; - - btScalar aspect; - btVector3 extents; - - if (m_glutScreenWidth > m_glutScreenHeight) - { - aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; - extents.setValue(aspect * 1.0f, 1.0f,0); - } else - { - aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; - extents.setValue(1.0f, aspect*1.f,0); - } - - - if (m_ortho) - { - // reset matrix - glLoadIdentity(); - - - extents *= m_cameraDistance; - btVector3 lower = m_cameraTargetPosition - extents; - btVector3 upper = m_cameraTargetPosition + extents; - //gluOrtho2D(lower.x, upper.x, lower.y, upper.y); - glOrtho(lower.getX(), upper.getX(), lower.getY(), upper.getY(),-1000,1000); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - //glTranslatef(100,210,0); - } else - { - if (m_glutScreenWidth > m_glutScreenHeight) - { - glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); - } else - { - glFrustum (-1.0, 1.0, -aspect, aspect, 1.0, 10000.0); - } - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2], - m_cameraTargetPosition[0], m_cameraTargetPosition[1], m_cameraTargetPosition[2], - m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); - } - -} - - - -const float STEPSIZE = 5; - -void DemoApplication::stepLeft() -{ - m_azi -= STEPSIZE; if (m_azi < 0) m_azi += 360; updateCamera(); -} -void DemoApplication::stepRight() -{ - m_azi += STEPSIZE; if (m_azi >= 360) m_azi -= 360; updateCamera(); -} -void DemoApplication::stepFront() -{ - m_ele += STEPSIZE; if (m_ele >= 360) m_ele -= 360; updateCamera(); -} -void DemoApplication::stepBack() -{ - m_ele -= STEPSIZE; if (m_ele < 0) m_ele += 360; updateCamera(); -} -void DemoApplication::zoomIn() -{ - m_cameraDistance -= btScalar(0.4); updateCamera(); - if (m_cameraDistance < btScalar(0.1)) - m_cameraDistance = btScalar(0.1); - -} -void DemoApplication::zoomOut() -{ - m_cameraDistance += btScalar(0.4); updateCamera(); - -} - - - - - - - - - - -void DemoApplication::reshape(int w, int h) -{ - GLDebugResetFont(w,h); - - m_glutScreenWidth = w; - m_glutScreenHeight = h; - - glViewport(0, 0, w, h); - updateCamera(); -} - - -void DemoApplication::keyboardCallback(unsigned char key, int x, int y) -{ - (void)x; - (void)y; - - m_lastKey = 0; - -#ifndef BT_NO_PROFILE - if (key >= 0x31 && key <= 0x39) - { - int child = key-0x31; - m_profileIterator->Enter_Child(child); - } - if (key==0x30) - { - m_profileIterator->Enter_Parent(); - } -#endif //BT_NO_PROFILE - - switch (key) - { - case 'q' : -#ifdef BT_USE_FREEGLUT - //return from glutMainLoop(), detect memory leaks etc. - glutLeaveMainLoop(); -#else - exit(0); -#endif - break; - - 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 'g' : m_enableshadows=!m_enableshadows;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); - 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 '=': - { - int maxSerializeBufferSize = 1024*1024*5; - btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); - //serializer->setSerializationFlags(BT_SERIALIZE_NO_DUPLICATE_ASSERT); - m_dynamicsWorld->serialize(serializer); - FILE* f2 = fopen("testFile.bullet","wb"); - fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); - fclose(f2); - delete serializer; - 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); - else - m_debugMode |= btIDebugDraw::DBG_DrawAabb; - break; - case 'c' : - if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) - m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints); - else - m_debugMode |= btIDebugDraw::DBG_DrawContactPoints; - break; - case 'C' : - if (m_debugMode & btIDebugDraw::DBG_DrawConstraints) - m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraints); - else - m_debugMode |= btIDebugDraw::DBG_DrawConstraints; - break; - case 'L' : - if (m_debugMode & btIDebugDraw::DBG_DrawConstraintLimits) - m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraintLimits); - else - m_debugMode |= btIDebugDraw::DBG_DrawConstraintLimits; - 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_ortho = !m_ortho;//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 '.': - { - shootBox(getRayTo(x,y));//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); - - - -} - -void DemoApplication::setDebugMode(int mode) -{ - m_debugMode = mode; - if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) - getDynamicsWorld()->getDebugDrawer()->setDebugMode(mode); -} - - - - - - -void DemoApplication::moveAndDisplay() -{ - if (!m_idle) - clientMoveAndDisplay(); - else - displayCallback(); -} - - - - -void DemoApplication::displayCallback() -{ -} - -#define NUM_SPHERES_ON_DIAGONAL 9 - -void DemoApplication::setShootBoxShape () -{ - if (!m_shootBoxShape) - { - m_shootBoxShape = new btBoxShape(btVector3(.5f,.5f,.5f)); - } -} - -void DemoApplication::shootBox(const btVector3& destination) -{ - - if (m_dynamicsWorld) - { - float mass = 1.f; - btTransform startTransform; - startTransform.setIdentity(); - btVector3 camPos = getCameraPosition(); - startTransform.setOrigin(camPos); - - setShootBoxShape (); - - btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_shootBoxShape); - body->setLinearFactor(btVector3(1,1,1)); - //body->setRestitution(1); - - btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]); - linVel.normalize(); - linVel*=m_ShootBoxInitialSpeed; - - body->getWorldTransform().setOrigin(camPos); - body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); - body->setLinearVelocity(linVel); - body->setAngularVelocity(btVector3(0,0,0)); - body->setCcdMotionThreshold(1.); - body->setCcdSweptSphereRadius(0.2f); - - } -} - - -int gPickingConstraintId = 0; -btVector3 gOldPickingPos; -btVector3 gHitPos(-1,-1,-1); -float gOldPickingDist = 0.f; -btRigidBody* pickedBody = 0;//for deactivation state - - -btVector3 DemoApplication::getRayTo(int x,int y) -{ - - - - if (m_ortho) - { - - btScalar aspect; - btVector3 extents; - if (m_glutScreenWidth > m_glutScreenHeight) - { - aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; - extents.setValue(aspect * 1.0f, 1.0f,0); - } else - { - aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; - extents.setValue(1.0f, aspect*1.f,0); - } - - extents *= m_cameraDistance; - btVector3 lower = m_cameraTargetPosition - extents; - btVector3 upper = m_cameraTargetPosition + extents; - - btScalar u = x / btScalar(m_glutScreenWidth); - btScalar v = (m_glutScreenHeight - y) / btScalar(m_glutScreenHeight); - - btVector3 p(0,0,0); - p.setValue((1.0f - u) * lower.getX() + u * upper.getX(),(1.0f - v) * lower.getY() + v * upper.getY(),m_cameraTargetPosition.getZ()); - return p; - } - - float top = 1.f; - float bottom = -1.f; - float nearPlane = 1.f; - float tanFov = (top-bottom)*0.5f / nearPlane; - float fov = btScalar(2.0) * btAtan(tanFov); - - btVector3 rayFrom = getCameraPosition(); - btVector3 rayForward = (getCameraTargetPosition()-getCameraPosition()); - rayForward.normalize(); - float farPlane = 10000.f; - rayForward*= farPlane; - - btVector3 rightOffset; - btVector3 vertical = m_cameraUp; - - btVector3 hor; - hor = rayForward.cross(vertical); - hor.normalize(); - vertical = hor.cross(rayForward); - vertical.normalize(); - - float tanfov = tanf(0.5f*fov); - - - hor *= 2.f * farPlane * tanfov; - vertical *= 2.f * farPlane * tanfov; - - btScalar aspect; - - if (m_glutScreenWidth > m_glutScreenHeight) - { - aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; - - hor*=aspect; - } else - { - aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; - vertical*=aspect; - } - - - btVector3 rayToCenter = rayFrom + rayForward; - btVector3 dHor = hor * 1.f/float(m_glutScreenWidth); - btVector3 dVert = vertical * 1.f/float(m_glutScreenHeight); - - - btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; - rayTo += btScalar(x) * dHor; - rayTo -= btScalar(y) * dVert; - return rayTo; -} - -btScalar mousePickClamping = 30.f; - - -void DemoApplication::mouseFunc(int button, int state, int x, int y) -{ - if (state == 0) - { - m_mouseButtons |= 1<rayTest(m_cameraPosition,rayTo,rayCallback); - if (rayCallback.hasHit()) - { - - btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - body->setActivationState(ACTIVE_TAG); - btVector3 impulse = rayTo; - impulse.normalize(); - float impulseStrength = 10.f; - impulse *= impulseStrength; - btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); - body->applyImpulse(impulse,relPos); - } - } - } -#endif - - - - } else - { - - } - break; - } - case 0: - { - if (state==0) - { - - - //add a point to point constraint for picking - if (m_dynamicsWorld) - { - - btVector3 rayFrom; - if (m_ortho) - { - rayFrom = rayTo; - rayFrom.setZ(-100.f); - } else - { - rayFrom = m_cameraPosition; - } - - btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); - m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); - if (rayCallback.hasHit()) - { - - - btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - //other exclusions? - if (!(body->isStaticObject() || body->isKinematicObject())) - { - pickedBody = body; - pickedBody->setActivationState(DISABLE_DEACTIVATION); - - - btVector3 pickPos = rayCallback.m_hitPointWorld; - printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); - - - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - - - - - - - if (use6Dof) - { - btTransform tr; - tr.setIdentity(); - tr.setOrigin(localPivot); - btGeneric6DofConstraint* dof6 = new btGeneric6DofConstraint(*body, tr,false); - dof6->setLinearLowerLimit(btVector3(0,0,0)); - dof6->setLinearUpperLimit(btVector3(0,0,0)); - dof6->setAngularLowerLimit(btVector3(0,0,0)); - dof6->setAngularUpperLimit(btVector3(0,0,0)); - - m_dynamicsWorld->addConstraint(dof6); - m_pickConstraint = dof6; - - dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,0); - dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,1); - dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,2); - dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,3); - dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,4); - dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,5); - - dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,0); - dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,1); - dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,2); - dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,3); - dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,4); - dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,5); - } else - { - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); - m_dynamicsWorld->addConstraint(p2p); - m_pickConstraint = p2p; - p2p->m_setting.m_impulseClamp = mousePickClamping; - //very weak constraint for picking - p2p->m_setting.m_tau = 0.001f; -/* - p2p->setParam(BT_CONSTRAINT_CFM,0.8,0); - p2p->setParam(BT_CONSTRAINT_CFM,0.8,1); - p2p->setParam(BT_CONSTRAINT_CFM,0.8,2); - p2p->setParam(BT_CONSTRAINT_ERP,0.1,0); - p2p->setParam(BT_CONSTRAINT_ERP,0.1,1); - p2p->setParam(BT_CONSTRAINT_ERP,0.1,2); - */ - - - } - use6Dof = !use6Dof; - - //save mouse position for dragging - gOldPickingPos = rayTo; - gHitPos = pickPos; - - gOldPickingDist = (pickPos-rayFrom).length(); - } - } - } - } - - } else - { - - if (m_pickConstraint && m_dynamicsWorld) - { - m_dynamicsWorld->removeConstraint(m_pickConstraint); - delete m_pickConstraint; - //printf("removed constraint %i",gPickingConstraintId); - m_pickConstraint = 0; - pickedBody->forceActivationState(ACTIVE_TAG); - pickedBody->setDeactivationTime( 0.f ); - pickedBody = 0; - } - - - } - - break; - - } - default: - { - } - } - -} - -void DemoApplication::mouseMotionFunc(int x,int y) -{ - - if (m_pickConstraint) - { - //move the constraint pivot - - if (m_pickConstraint->getConstraintType() == D6_CONSTRAINT_TYPE) - { - btGeneric6DofConstraint* pickCon = static_cast(m_pickConstraint); - if (pickCon) - { - //keep it at the same picking distance - - btVector3 newRayTo = getRayTo(x,y); - btVector3 rayFrom; - btVector3 oldPivotInB = pickCon->getFrameOffsetA().getOrigin(); - - btVector3 newPivotB; - if (m_ortho) - { - newPivotB = oldPivotInB; - newPivotB.setX(newRayTo.getX()); - newPivotB.setY(newRayTo.getY()); - } else - { - rayFrom = m_cameraPosition; - btVector3 dir = newRayTo-rayFrom; - dir.normalize(); - dir *= gOldPickingDist; - - newPivotB = rayFrom + dir; - } - pickCon->getFrameOffsetA().setOrigin(newPivotB); - } - - } else - { - btPoint2PointConstraint* pickCon = static_cast(m_pickConstraint); - if (pickCon) - { - //keep it at the same picking distance - - btVector3 newRayTo = getRayTo(x,y); - btVector3 rayFrom; - btVector3 oldPivotInB = pickCon->getPivotInB(); - btVector3 newPivotB; - if (m_ortho) - { - newPivotB = oldPivotInB; - newPivotB.setX(newRayTo.getX()); - newPivotB.setY(newRayTo.getY()); - } else - { - rayFrom = m_cameraPosition; - btVector3 dir = newRayTo-rayFrom; - dir.normalize(); - dir *= gOldPickingDist; - - newPivotB = rayFrom + dir; - } - pickCon->setPivotB(newPivotB); - } - } - } - - float dx, dy; - dx = btScalar(x) - m_mouseOldX; - dy = btScalar(y) - m_mouseOldY; - - - ///only if ALT key is pressed (Maya style) - if (m_modifierKeys& BT_ACTIVE_ALT) - { - if(m_mouseButtons & 2) - { - btVector3 hor = getRayTo(0,0)-getRayTo(1,0); - btVector3 vert = getRayTo(0,0)-getRayTo(0,1); - btScalar multiplierX = btScalar(0.01); - btScalar multiplierY = btScalar(0.01); - if (m_ortho) - { - multiplierX = 1; - multiplierY = 1; - } - - - m_cameraTargetPosition += hor* dx * multiplierX; - m_cameraTargetPosition += vert* dy * multiplierY; - } - - if(m_mouseButtons & (2 << 2) && m_mouseButtons & 1) - { - } - else if(m_mouseButtons & 1) - { - m_azi += dx * btScalar(0.2); - m_azi = fmodf(m_azi, btScalar(360.f)); - m_ele += dy * btScalar(0.2); - m_ele = fmodf(m_ele, btScalar(180.f)); - } - else if(m_mouseButtons & 4) - { - m_cameraDistance -= dy * btScalar(0.2f); - if (m_cameraDistancegetShapeType() != INVALID_SHAPE_PROXYTYPE)); - - //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) - shape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - -#define USE_MOTIONSTATE 1 -#ifdef USE_MOTIONSTATE - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - - btRigidBody::btRigidBodyConstructionInfo cInfo(mass,myMotionState,shape,localInertia); - - btRigidBody* body = new btRigidBody(cInfo); - body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); - -#else - btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); - body->setWorldTransform(startTransform); -#endif// - - m_dynamicsWorld->addRigidBody(body); - - return body; -} - -//See http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho -void DemoApplication::setOrthographicProjection() -{ - - // switch to projection mode - glMatrixMode(GL_PROJECTION); - - // save previous matrix which contains the - //settings for the perspective projection - glPushMatrix(); - // reset matrix - glLoadIdentity(); - // set a 2D orthographic projection - gluOrtho2D(0, m_glutScreenWidth, 0, m_glutScreenHeight); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - // invert the y axis, down is positive - glScalef(1, -1, 1); - // mover the origin from the bottom left corner - // to the upper left corner - glTranslatef(btScalar(0), btScalar(-m_glutScreenHeight), btScalar(0)); - -} - -void DemoApplication::resetPerspectiveProjection() -{ - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - updateCamera(); -} - - - - -extern CProfileIterator * m_profileIterator; - -void DemoApplication::displayProfileString(int xOffset,int yStart,char* message) -{ - glRasterPos3f(btScalar(xOffset),btScalar(yStart),btScalar(0)); - GLDebugDrawString(xOffset,yStart,message); -} - - -void DemoApplication::showProfileInfo(int& xOffset,int& yStart, int yIncr) -{ -#ifndef BT_NO_PROFILE - - static double time_since_reset = 0.f; - if (!m_idle) - { - time_since_reset = CProfileManager::Get_Time_Since_Reset(); - } - - - { - //recompute profiling data, and store profile strings - - char blockTime[128]; - - double totalTime = 0; - - int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset(); - - m_profileIterator->First(); - - double parent_time = m_profileIterator->Is_Root() ? time_since_reset : m_profileIterator->Get_Current_Parent_Total_Time(); - - { - sprintf(blockTime,"--- Profiling: %s (total running time: %.3f ms) ---", m_profileIterator->Get_Current_Parent_Name(), parent_time ); - displayProfileString(xOffset,yStart,blockTime); - yStart += yIncr; - sprintf(blockTime,"press number (1,2...) to display child timings, or 0 to go up to parent" ); - displayProfileString(xOffset,yStart,blockTime); - yStart += yIncr; - - } - - - double accumulated_time = 0.f; - - for (int i = 0; !m_profileIterator->Is_Done(); m_profileIterator->Next()) - { - double current_total_time = m_profileIterator->Get_Current_Total_Time(); - accumulated_time += current_total_time; - double fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f; - - sprintf(blockTime,"%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)", - ++i, m_profileIterator->Get_Current_Name(), fraction, - (current_total_time / (double)frames_since_reset),m_profileIterator->Get_Current_Total_Calls()); - displayProfileString(xOffset,yStart,blockTime); - yStart += yIncr; - totalTime += current_total_time; - } - - sprintf(blockTime,"%s (%.3f %%) :: %.3f ms", "Unaccounted", - // (min(0, time_since_reset - totalTime) / time_since_reset) * 100); - parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); - - displayProfileString(xOffset,yStart,blockTime); - yStart += yIncr; - - - - sprintf(blockTime,"-------------------------------------------------"); - displayProfileString(xOffset,yStart,blockTime); - yStart += yIncr; - - } -#endif//BT_NO_PROFILE - - - - -} - - -// -void DemoApplication::renderscene(int pass) -{ - btScalar m[16]; - btMatrix3x3 rot;rot.setIdentity(); - const int numObjects=m_dynamicsWorld->getNumCollisionObjects(); - btVector3 wireColor(1,0,0); - for(int i=0;igetCollisionObjectArray()[i]; - btRigidBody* body=btRigidBody::upcast(colObj); - if(body&&body->getMotionState()) - { - btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); - myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m); - rot=myMotionState->m_graphicsWorldTrans.getBasis(); - } - else - { - colObj->getWorldTransform().getOpenGLMatrix(m); - rot=colObj->getWorldTransform().getBasis(); - } - 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 (1.f,0.f,0.f); - } - else - { - wireColor += btVector3 (.5f,0.f,0.f); - } - } - if(colObj->getActivationState()==2) //ISLAND_SLEEPING - { - if(i&1) - { - wireColor += btVector3 (0.f,1.f, 0.f); - } - else - { - wireColor += btVector3 (0.f,0.5f,0.f); - } - } - - btVector3 aabbMin,aabbMax; - m_dynamicsWorld->getBroadphase()->getBroadphaseAabb(aabbMin,aabbMax); - - aabbMin-=btVector3(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); - aabbMax+=btVector3(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); -// printf("aabbMin=(%f,%f,%f)\n",aabbMin.getX(),aabbMin.getY(),aabbMin.getZ()); -// printf("aabbMax=(%f,%f,%f)\n",aabbMax.getX(),aabbMax.getY(),aabbMax.getZ()); -// m_dynamicsWorld->getDebugDrawer()->drawAabb(aabbMin,aabbMax,btVector3(1,1,1)); - - - if (!(getDebugMode()& btIDebugDraw::DBG_DrawWireframe)) - { - 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*btScalar(0.3),0,aabbMin,aabbMax);break; - } - } - } -} - -// -void DemoApplication::renderme() -{ - myinit(); - - updateCamera(); - - if (m_dynamicsWorld) - { - if(m_enableshadows) - { - glClear(GL_STENCIL_BUFFER_BIT); - glEnable(GL_CULL_FACE); - renderscene(0); - - glDisable(GL_LIGHTING); - glDepthMask(GL_FALSE); - glDepthFunc(GL_LEQUAL); - glEnable(GL_STENCIL_TEST); - glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); - glStencilFunc(GL_ALWAYS,1,0xFFFFFFFFL); - glFrontFace(GL_CCW); - glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); - renderscene(1); - glFrontFace(GL_CW); - glStencilOp(GL_KEEP,GL_KEEP,GL_DECR); - renderscene(1); - glFrontFace(GL_CCW); - - glPolygonMode(GL_FRONT,GL_FILL); - glPolygonMode(GL_BACK,GL_FILL); - glShadeModel(GL_SMOOTH); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - glEnable(GL_LIGHTING); - glDepthMask(GL_TRUE); - glCullFace(GL_BACK); - glFrontFace(GL_CCW); - glEnable(GL_CULL_FACE); - glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); - - glDepthFunc(GL_LEQUAL); - glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFFL ); - glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); - glDisable(GL_LIGHTING); - renderscene(2); - glEnable(GL_LIGHTING); - glDepthFunc(GL_LESS); - glDisable(GL_STENCIL_TEST); - glDisable(GL_CULL_FACE); - } - else - { - glDisable(GL_CULL_FACE); - renderscene(0); - } - - int xOffset = 10; - int yStart = 20; - int yIncr = 20; - - - glDisable(GL_LIGHTING); - glColor3f(0, 0, 0); - - if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) - { - setOrthographicProjection(); - - showProfileInfo(xOffset,yStart,yIncr); - -#ifdef USE_QUICKPROF - - - if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) - { - static int counter = 0; - counter++; - std::map::iterator iter; - for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter) - { - char blockTime[128]; - sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT)); - glRasterPos3f(xOffset,yStart,0); - GLDebugDrawString(BMF_GetFont(BMF_kHelvetica10),blockTime); - yStart += yIncr; - - } - - } -#endif //USE_QUICKPROF - - - - - resetPerspectiveProjection(); - } - - glEnable(GL_LIGHTING); - - - } - - updateCamera(); - -} -#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" - -void DemoApplication::clientResetScene() -{ -#ifdef SHOW_NUM_DEEP_PENETRATIONS - gNumDeepPenetrationChecks = 0; - gNumGjkChecks = 0; -#endif //SHOW_NUM_DEEP_PENETRATIONS - - gNumClampedCcdMotions = 0; - int numObjects = 0; - int i; - - if (m_dynamicsWorld) - { - numObjects = m_dynamicsWorld->getNumCollisionObjects(); - - ///create a copy of the array, not a reference! - btCollisionObjectArray copyArray = m_dynamicsWorld->getCollisionObjectArray(); - - - - - for (i=0;igetMotionState()) - { - btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); - myMotionState->m_graphicsWorldTrans = myMotionState->m_startWorldTrans; - body->setCenterOfMassTransform( myMotionState->m_graphicsWorldTrans ); - colObj->setInterpolationWorldTransform( myMotionState->m_startWorldTrans ); - colObj->forceActivationState(ACTIVE_TAG); - colObj->activate(); - colObj->setDeactivationTime(0); - //colObj->setActivationState(WANTS_DEACTIVATION); - } - //removed cached contact points (this is not necessary if all objects have been removed from the dynamics world) - //m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(colObj->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - - btRigidBody* body = btRigidBody::upcast(colObj); - if (body && !body->isStaticObject()) - { - btRigidBody::upcast(colObj)->setLinearVelocity(btVector3(0,0,0)); - btRigidBody::upcast(colObj)->setAngularVelocity(btVector3(0,0,0)); - } - } - - } - - ///reset some internal cached data in the broadphase - m_dynamicsWorld->getBroadphase()->resetPool(getDynamicsWorld()->getDispatcher()); - m_dynamicsWorld->getConstraintSolver()->reset(); - - } - -} +/* +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 "DemoApplication.h" +#include "LinearMath/btIDebugDraw.h" +#include "BulletDynamics/Dynamics/btDynamicsWorld.h" + +#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"//picking +#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"//picking + +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" +#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h" +#include "GL_ShapeDrawer.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btDefaultMotionState.h" +#include "LinearMath/btSerializer.h" +#include "GLDebugFont.h" + +static bool use6Dof = false; +extern bool gDisableDeactivation; +int numObjects = 0; +const int maxNumObjects = 16384; +btTransform startTransforms[maxNumObjects]; +btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use of shapes) +#define SHOW_NUM_DEEP_PENETRATIONS 1 + +extern int gNumClampedCcdMotions; + +#ifdef SHOW_NUM_DEEP_PENETRATIONS +extern int gNumDeepPenetrationChecks; + +extern int gNumSplitImpulseRecoveries; +extern int gNumGjkChecks; +extern int gNumAlignedAllocs; +extern int gNumAlignedFree; +extern int gTotalBytesAlignedAllocs; + +#endif // + + +DemoApplication::DemoApplication() +//see btIDebugDraw.h for modes +: +m_dynamicsWorld(0), +m_pickConstraint(0), +m_shootBoxShape(0), +m_cameraDistance(15.0), +m_debugMode(0), +m_ele(20.f), +m_azi(0.f), +m_cameraPosition(0.f,0.f,0.f), +m_cameraTargetPosition(0.f,0.f,0.f), +m_mouseOldX(0), +m_mouseOldY(0), +m_mouseButtons(0), +m_modifierKeys(0), +m_scaleBottom(0.5f), +m_scaleFactor(2.f), +m_cameraUp(0,1,0), +m_forwardAxis(2), +m_glutScreenWidth(0), +m_glutScreenHeight(0), +m_ortho(0), +m_ShootBoxInitialSpeed(40.f), +m_stepping(true), +m_singleStep(false), +m_idle(false), + +m_enableshadows(false), +m_sundirection(btVector3(1,-2,1)*1000), +m_defaultContactProcessingThreshold(BT_LARGE_FLOAT) +{ +#ifndef BT_NO_PROFILE + m_profileIterator = CProfileManager::Get_Iterator(); +#endif //BT_NO_PROFILE + + m_shapeDrawer = new GL_ShapeDrawer (); + m_shapeDrawer->enableTexture(true); + m_enableshadows = false; +} + + + +DemoApplication::~DemoApplication() +{ +#ifndef BT_NO_PROFILE + CProfileManager::Release_Iterator(m_profileIterator); +#endif //BT_NO_PROFILE + + 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) +{ + + GLfloat light_ambient[] = { btScalar(0.2), btScalar(0.2), btScalar(0.2), btScalar(1.0) }; + GLfloat light_diffuse[] = { btScalar(1.0), btScalar(1.0), btScalar(1.0), btScalar(1.0) }; + GLfloat light_specular[] = { btScalar(1.0), btScalar(1.0), btScalar(1.0), btScalar(1.0 )}; + /* light_position is NOT default value */ + GLfloat light_position0[] = { btScalar(1.0), btScalar(10.0), btScalar(1.0), btScalar(0.0 )}; + GLfloat light_position1[] = { btScalar(-1.0), btScalar(-10.0), btScalar(-1.0), btScalar(0.0) }; + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + + glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT1, GL_POSITION, light_position1); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + + + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + + glClearColor(btScalar(0.7),btScalar(0.7),btScalar(0.7),btScalar(0)); + + // glEnable(GL_CULL_FACE); + // glCullFace(GL_BACK); +} + + +void DemoApplication::setCameraDistance(float dist) +{ + m_cameraDistance = dist; +} + +float DemoApplication::getCameraDistance() +{ + return m_cameraDistance; +} + + + +void DemoApplication::toggleIdle() { + if (m_idle) { + m_idle = false; + } + else { + m_idle = true; + } +} + + + + +void DemoApplication::updateCamera() { + + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + btScalar rele = m_ele * btScalar(0.01745329251994329547);// rads per deg + btScalar razi = m_azi * btScalar(0.01745329251994329547);// rads per deg + + + btQuaternion rot(m_cameraUp,razi); + + + btVector3 eyePos(0,0,0); + eyePos[m_forwardAxis] = -m_cameraDistance; + + btVector3 forward(eyePos[0],eyePos[1],eyePos[2]); + if (forward.length2() < SIMD_EPSILON) + { + forward.setValue(1.f,0.f,0.f); + } + btVector3 right = m_cameraUp.cross(forward); + btQuaternion roll(right,-rele); + + eyePos = btMatrix3x3(rot) * btMatrix3x3(roll) * eyePos; + + m_cameraPosition[0] = eyePos.getX(); + m_cameraPosition[1] = eyePos.getY(); + m_cameraPosition[2] = eyePos.getZ(); + m_cameraPosition += m_cameraTargetPosition; + + if (m_glutScreenWidth == 0 && m_glutScreenHeight == 0) + return; + + btScalar aspect; + btVector3 extents; + + if (m_glutScreenWidth > m_glutScreenHeight) + { + aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + extents.setValue(aspect * 1.0f, 1.0f,0); + } else + { + aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; + extents.setValue(1.0f, aspect*1.f,0); + } + + + if (m_ortho) + { + // reset matrix + glLoadIdentity(); + + + extents *= m_cameraDistance; + btVector3 lower = m_cameraTargetPosition - extents; + btVector3 upper = m_cameraTargetPosition + extents; + //gluOrtho2D(lower.x, upper.x, lower.y, upper.y); + glOrtho(lower.getX(), upper.getX(), lower.getY(), upper.getY(),-1000,1000); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + //glTranslatef(100,210,0); + } else + { + if (m_glutScreenWidth > m_glutScreenHeight) + { + glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); + } else + { + glFrustum (-1.0, 1.0, -aspect, aspect, 1.0, 10000.0); + } + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2], + m_cameraTargetPosition[0], m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + } + +} + + + +const float STEPSIZE = 5; + +void DemoApplication::stepLeft() +{ + m_azi -= STEPSIZE; if (m_azi < 0) m_azi += 360; updateCamera(); +} +void DemoApplication::stepRight() +{ + m_azi += STEPSIZE; if (m_azi >= 360) m_azi -= 360; updateCamera(); +} +void DemoApplication::stepFront() +{ + m_ele += STEPSIZE; if (m_ele >= 360) m_ele -= 360; updateCamera(); +} +void DemoApplication::stepBack() +{ + m_ele -= STEPSIZE; if (m_ele < 0) m_ele += 360; updateCamera(); +} +void DemoApplication::zoomIn() +{ + m_cameraDistance -= btScalar(0.4); updateCamera(); + if (m_cameraDistance < btScalar(0.1)) + m_cameraDistance = btScalar(0.1); + +} +void DemoApplication::zoomOut() +{ + m_cameraDistance += btScalar(0.4); updateCamera(); + +} + + + + + + + + + + +void DemoApplication::reshape(int w, int h) +{ + GLDebugResetFont(w,h); + + m_glutScreenWidth = w; + m_glutScreenHeight = h; + + glViewport(0, 0, w, h); + updateCamera(); +} + + +void DemoApplication::keyboardCallback(unsigned char key, int x, int y) +{ + (void)x; + (void)y; + + m_lastKey = 0; + +#ifndef BT_NO_PROFILE + if (key >= 0x31 && key <= 0x39) + { + int child = key-0x31; + m_profileIterator->Enter_Child(child); + } + if (key==0x30) + { + m_profileIterator->Enter_Parent(); + } +#endif //BT_NO_PROFILE + + switch (key) + { + case 'q' : +#ifdef BT_USE_FREEGLUT + //return from glutMainLoop(), detect memory leaks etc. + glutLeaveMainLoop(); +#else + exit(0); +#endif + break; + + 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 'g' : m_enableshadows=!m_enableshadows;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); + 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 '=': + { + int maxSerializeBufferSize = 1024*1024*5; + btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); + //serializer->setSerializationFlags(BT_SERIALIZE_NO_DUPLICATE_ASSERT); + m_dynamicsWorld->serialize(serializer); + FILE* f2 = fopen("testFile.bullet","wb"); + fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); + fclose(f2); + delete serializer; + 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); + else + m_debugMode |= btIDebugDraw::DBG_DrawAabb; + break; + case 'c' : + if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints); + else + m_debugMode |= btIDebugDraw::DBG_DrawContactPoints; + break; + case 'C' : + if (m_debugMode & btIDebugDraw::DBG_DrawConstraints) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraints); + else + m_debugMode |= btIDebugDraw::DBG_DrawConstraints; + break; + case 'L' : + if (m_debugMode & btIDebugDraw::DBG_DrawConstraintLimits) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraintLimits); + else + m_debugMode |= btIDebugDraw::DBG_DrawConstraintLimits; + 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_ortho = !m_ortho;//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 '.': + { + shootBox(getRayTo(x,y));//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); + + + +} + +void DemoApplication::setDebugMode(int mode) +{ + m_debugMode = mode; + if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) + getDynamicsWorld()->getDebugDrawer()->setDebugMode(mode); +} + + + + + + +void DemoApplication::moveAndDisplay() +{ + if (!m_idle) + clientMoveAndDisplay(); + else + displayCallback(); +} + + + + +void DemoApplication::displayCallback() +{ +} + +#define NUM_SPHERES_ON_DIAGONAL 9 + +void DemoApplication::setShootBoxShape () +{ + if (!m_shootBoxShape) + { + m_shootBoxShape = new btBoxShape(btVector3(.5f,.5f,.5f)); + } +} + +void DemoApplication::shootBox(const btVector3& destination) +{ + + if (m_dynamicsWorld) + { + float mass = 1.f; + btTransform startTransform; + startTransform.setIdentity(); + btVector3 camPos = getCameraPosition(); + startTransform.setOrigin(camPos); + + setShootBoxShape (); + + btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_shootBoxShape); + body->setLinearFactor(btVector3(1,1,1)); + //body->setRestitution(1); + + btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]); + linVel.normalize(); + linVel*=m_ShootBoxInitialSpeed; + + body->getWorldTransform().setOrigin(camPos); + body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); + body->setLinearVelocity(linVel); + body->setAngularVelocity(btVector3(0,0,0)); + body->setCcdMotionThreshold(1.); + body->setCcdSweptSphereRadius(0.2f); + + } +} + + +int gPickingConstraintId = 0; +btVector3 gOldPickingPos; +btVector3 gHitPos(-1,-1,-1); +float gOldPickingDist = 0.f; +btRigidBody* pickedBody = 0;//for deactivation state + + +btVector3 DemoApplication::getRayTo(int x,int y) +{ + + + + if (m_ortho) + { + + btScalar aspect; + btVector3 extents; + if (m_glutScreenWidth > m_glutScreenHeight) + { + aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + extents.setValue(aspect * 1.0f, 1.0f,0); + } else + { + aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; + extents.setValue(1.0f, aspect*1.f,0); + } + + extents *= m_cameraDistance; + btVector3 lower = m_cameraTargetPosition - extents; + btVector3 upper = m_cameraTargetPosition + extents; + + btScalar u = x / btScalar(m_glutScreenWidth); + btScalar v = (m_glutScreenHeight - y) / btScalar(m_glutScreenHeight); + + btVector3 p(0,0,0); + p.setValue((1.0f - u) * lower.getX() + u * upper.getX(),(1.0f - v) * lower.getY() + v * upper.getY(),m_cameraTargetPosition.getZ()); + return p; + } + + float top = 1.f; + float bottom = -1.f; + float nearPlane = 1.f; + float tanFov = (top-bottom)*0.5f / nearPlane; + float fov = btScalar(2.0) * btAtan(tanFov); + + btVector3 rayFrom = getCameraPosition(); + btVector3 rayForward = (getCameraTargetPosition()-getCameraPosition()); + rayForward.normalize(); + float farPlane = 10000.f; + rayForward*= farPlane; + + btVector3 rightOffset; + btVector3 vertical = m_cameraUp; + + btVector3 hor; + hor = rayForward.cross(vertical); + hor.normalize(); + vertical = hor.cross(rayForward); + vertical.normalize(); + + float tanfov = tanf(0.5f*fov); + + + hor *= 2.f * farPlane * tanfov; + vertical *= 2.f * farPlane * tanfov; + + btScalar aspect; + + if (m_glutScreenWidth > m_glutScreenHeight) + { + aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + + hor*=aspect; + } else + { + aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; + vertical*=aspect; + } + + + btVector3 rayToCenter = rayFrom + rayForward; + btVector3 dHor = hor * 1.f/float(m_glutScreenWidth); + btVector3 dVert = vertical * 1.f/float(m_glutScreenHeight); + + + btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; + rayTo += btScalar(x) * dHor; + rayTo -= btScalar(y) * dVert; + return rayTo; +} + +btScalar mousePickClamping = 30.f; + + +void DemoApplication::mouseFunc(int button, int state, int x, int y) +{ + if (state == 0) + { + m_mouseButtons |= 1<rayTest(m_cameraPosition,rayTo,rayCallback); + if (rayCallback.hasHit()) + { + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + body->setActivationState(ACTIVE_TAG); + btVector3 impulse = rayTo; + impulse.normalize(); + float impulseStrength = 10.f; + impulse *= impulseStrength; + btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); + body->applyImpulse(impulse,relPos); + } + } + } +#endif + + + + } else + { + + } + break; + } + case 0: + { + if (state==0) + { + + + //add a point to point constraint for picking + if (m_dynamicsWorld) + { + + btVector3 rayFrom; + if (m_ortho) + { + rayFrom = rayTo; + rayFrom.setZ(-100.f); + } else + { + rayFrom = m_cameraPosition; + } + + btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); + m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); + if (rayCallback.hasHit()) + { + + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + //other exclusions? + if (!(body->isStaticObject() || body->isKinematicObject())) + { + pickedBody = body; + pickedBody->setActivationState(DISABLE_DEACTIVATION); + + + btVector3 pickPos = rayCallback.m_hitPointWorld; + printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); + + + btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; + + + + + + + if (use6Dof) + { + btTransform tr; + tr.setIdentity(); + tr.setOrigin(localPivot); + btGeneric6DofConstraint* dof6 = new btGeneric6DofConstraint(*body, tr,false); + dof6->setLinearLowerLimit(btVector3(0,0,0)); + dof6->setLinearUpperLimit(btVector3(0,0,0)); + dof6->setAngularLowerLimit(btVector3(0,0,0)); + dof6->setAngularUpperLimit(btVector3(0,0,0)); + + m_dynamicsWorld->addConstraint(dof6); + m_pickConstraint = dof6; + + dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,0); + dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,1); + dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,2); + dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,3); + dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,4); + dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,5); + + dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,0); + dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,1); + dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,2); + dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,3); + dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,4); + dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,5); + } else + { + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); + m_dynamicsWorld->addConstraint(p2p); + m_pickConstraint = p2p; + p2p->m_setting.m_impulseClamp = mousePickClamping; + //very weak constraint for picking + p2p->m_setting.m_tau = 0.001f; +/* + p2p->setParam(BT_CONSTRAINT_CFM,0.8,0); + p2p->setParam(BT_CONSTRAINT_CFM,0.8,1); + p2p->setParam(BT_CONSTRAINT_CFM,0.8,2); + p2p->setParam(BT_CONSTRAINT_ERP,0.1,0); + p2p->setParam(BT_CONSTRAINT_ERP,0.1,1); + p2p->setParam(BT_CONSTRAINT_ERP,0.1,2); + */ + + + } + use6Dof = !use6Dof; + + //save mouse position for dragging + gOldPickingPos = rayTo; + gHitPos = pickPos; + + gOldPickingDist = (pickPos-rayFrom).length(); + } + } + } + } + + } else + { + + if (m_pickConstraint && m_dynamicsWorld) + { + m_dynamicsWorld->removeConstraint(m_pickConstraint); + delete m_pickConstraint; + //printf("removed constraint %i",gPickingConstraintId); + m_pickConstraint = 0; + pickedBody->forceActivationState(ACTIVE_TAG); + pickedBody->setDeactivationTime( 0.f ); + pickedBody = 0; + } + + + } + + break; + + } + default: + { + } + } + +} + +void DemoApplication::mouseMotionFunc(int x,int y) +{ + + if (m_pickConstraint) + { + //move the constraint pivot + + if (m_pickConstraint->getConstraintType() == D6_CONSTRAINT_TYPE) + { + btGeneric6DofConstraint* pickCon = static_cast(m_pickConstraint); + if (pickCon) + { + //keep it at the same picking distance + + btVector3 newRayTo = getRayTo(x,y); + btVector3 rayFrom; + btVector3 oldPivotInB = pickCon->getFrameOffsetA().getOrigin(); + + btVector3 newPivotB; + if (m_ortho) + { + newPivotB = oldPivotInB; + newPivotB.setX(newRayTo.getX()); + newPivotB.setY(newRayTo.getY()); + } else + { + rayFrom = m_cameraPosition; + btVector3 dir = newRayTo-rayFrom; + dir.normalize(); + dir *= gOldPickingDist; + + newPivotB = rayFrom + dir; + } + pickCon->getFrameOffsetA().setOrigin(newPivotB); + } + + } else + { + btPoint2PointConstraint* pickCon = static_cast(m_pickConstraint); + if (pickCon) + { + //keep it at the same picking distance + + btVector3 newRayTo = getRayTo(x,y); + btVector3 rayFrom; + btVector3 oldPivotInB = pickCon->getPivotInB(); + btVector3 newPivotB; + if (m_ortho) + { + newPivotB = oldPivotInB; + newPivotB.setX(newRayTo.getX()); + newPivotB.setY(newRayTo.getY()); + } else + { + rayFrom = m_cameraPosition; + btVector3 dir = newRayTo-rayFrom; + dir.normalize(); + dir *= gOldPickingDist; + + newPivotB = rayFrom + dir; + } + pickCon->setPivotB(newPivotB); + } + } + } + + float dx, dy; + dx = btScalar(x) - m_mouseOldX; + dy = btScalar(y) - m_mouseOldY; + + + ///only if ALT key is pressed (Maya style) + if (m_modifierKeys& BT_ACTIVE_ALT) + { + if(m_mouseButtons & 2) + { + btVector3 hor = getRayTo(0,0)-getRayTo(1,0); + btVector3 vert = getRayTo(0,0)-getRayTo(0,1); + btScalar multiplierX = btScalar(0.01); + btScalar multiplierY = btScalar(0.01); + if (m_ortho) + { + multiplierX = 1; + multiplierY = 1; + } + + + m_cameraTargetPosition += hor* dx * multiplierX; + m_cameraTargetPosition += vert* dy * multiplierY; + } + + if(m_mouseButtons & (2 << 2) && m_mouseButtons & 1) + { + } + else if(m_mouseButtons & 1) + { + m_azi += dx * btScalar(0.2); + m_azi = fmodf(m_azi, btScalar(360.f)); + m_ele += dy * btScalar(0.2); + m_ele = fmodf(m_ele, btScalar(180.f)); + } + else if(m_mouseButtons & 4) + { + m_cameraDistance -= dy * btScalar(0.2f); + if (m_cameraDistancegetShapeType() != INVALID_SHAPE_PROXYTYPE)); + + //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) + shape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + +#define USE_MOTIONSTATE 1 +#ifdef USE_MOTIONSTATE + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo cInfo(mass,myMotionState,shape,localInertia); + + btRigidBody* body = new btRigidBody(cInfo); + body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); + +#else + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + body->setWorldTransform(startTransform); +#endif// + + m_dynamicsWorld->addRigidBody(body); + + return body; +} + +//See http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho +void DemoApplication::setOrthographicProjection() +{ + + // switch to projection mode + glMatrixMode(GL_PROJECTION); + + // save previous matrix which contains the + //settings for the perspective projection + glPushMatrix(); + // reset matrix + glLoadIdentity(); + // set a 2D orthographic projection + gluOrtho2D(0, m_glutScreenWidth, 0, m_glutScreenHeight); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // invert the y axis, down is positive + glScalef(1, -1, 1); + // mover the origin from the bottom left corner + // to the upper left corner + glTranslatef(btScalar(0), btScalar(-m_glutScreenHeight), btScalar(0)); + +} + +void DemoApplication::resetPerspectiveProjection() +{ + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + updateCamera(); +} + + + + +extern CProfileIterator * m_profileIterator; + +void DemoApplication::displayProfileString(int xOffset,int yStart,char* message) +{ + glRasterPos3f(btScalar(xOffset),btScalar(yStart),btScalar(0)); + GLDebugDrawString(xOffset,yStart,message); +} + + +void DemoApplication::showProfileInfo(int& xOffset,int& yStart, int yIncr) +{ +#ifndef BT_NO_PROFILE + + static double time_since_reset = 0.f; + if (!m_idle) + { + time_since_reset = CProfileManager::Get_Time_Since_Reset(); + } + + + { + //recompute profiling data, and store profile strings + + char blockTime[128]; + + double totalTime = 0; + + int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset(); + + m_profileIterator->First(); + + double parent_time = m_profileIterator->Is_Root() ? time_since_reset : m_profileIterator->Get_Current_Parent_Total_Time(); + + { + sprintf(blockTime,"--- Profiling: %s (total running time: %.3f ms) ---", m_profileIterator->Get_Current_Parent_Name(), parent_time ); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + sprintf(blockTime,"press number (1,2...) to display child timings, or 0 to go up to parent" ); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + } + + + double accumulated_time = 0.f; + + for (int i = 0; !m_profileIterator->Is_Done(); m_profileIterator->Next()) + { + double current_total_time = m_profileIterator->Get_Current_Total_Time(); + accumulated_time += current_total_time; + double fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f; + + sprintf(blockTime,"%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)", + ++i, m_profileIterator->Get_Current_Name(), fraction, + (current_total_time / (double)frames_since_reset),m_profileIterator->Get_Current_Total_Calls()); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + totalTime += current_total_time; + } + + sprintf(blockTime,"%s (%.3f %%) :: %.3f ms", "Unaccounted", + // (min(0, time_since_reset - totalTime) / time_since_reset) * 100); + parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); + + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + + + sprintf(blockTime,"-------------------------------------------------"); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + } +#endif//BT_NO_PROFILE + + + + +} + + +// +void DemoApplication::renderscene(int pass) +{ + btScalar m[16]; + btMatrix3x3 rot;rot.setIdentity(); + const int numObjects=m_dynamicsWorld->getNumCollisionObjects(); + btVector3 wireColor(1,0,0); + for(int i=0;igetCollisionObjectArray()[i]; + btRigidBody* body=btRigidBody::upcast(colObj); + if(body&&body->getMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m); + rot=myMotionState->m_graphicsWorldTrans.getBasis(); + } + else + { + colObj->getWorldTransform().getOpenGLMatrix(m); + rot=colObj->getWorldTransform().getBasis(); + } + 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 (1.f,0.f,0.f); + } + else + { + wireColor += btVector3 (.5f,0.f,0.f); + } + } + if(colObj->getActivationState()==2) //ISLAND_SLEEPING + { + if(i&1) + { + wireColor += btVector3 (0.f,1.f, 0.f); + } + else + { + wireColor += btVector3 (0.f,0.5f,0.f); + } + } + + btVector3 aabbMin,aabbMax; + m_dynamicsWorld->getBroadphase()->getBroadphaseAabb(aabbMin,aabbMax); + + aabbMin-=btVector3(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); + aabbMax+=btVector3(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); +// printf("aabbMin=(%f,%f,%f)\n",aabbMin.getX(),aabbMin.getY(),aabbMin.getZ()); +// printf("aabbMax=(%f,%f,%f)\n",aabbMax.getX(),aabbMax.getY(),aabbMax.getZ()); +// m_dynamicsWorld->getDebugDrawer()->drawAabb(aabbMin,aabbMax,btVector3(1,1,1)); + + + if (!(getDebugMode()& btIDebugDraw::DBG_DrawWireframe)) + { + 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*btScalar(0.3),0,aabbMin,aabbMax);break; + } + } + } +} + +// +void DemoApplication::renderme() +{ + myinit(); + + updateCamera(); + + if (m_dynamicsWorld) + { + if(m_enableshadows) + { + glClear(GL_STENCIL_BUFFER_BIT); + glEnable(GL_CULL_FACE); + renderscene(0); + + glDisable(GL_LIGHTING); + glDepthMask(GL_FALSE); + glDepthFunc(GL_LEQUAL); + glEnable(GL_STENCIL_TEST); + glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); + glStencilFunc(GL_ALWAYS,1,0xFFFFFFFFL); + glFrontFace(GL_CCW); + glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); + renderscene(1); + glFrontFace(GL_CW); + glStencilOp(GL_KEEP,GL_KEEP,GL_DECR); + renderscene(1); + glFrontFace(GL_CCW); + + glPolygonMode(GL_FRONT,GL_FILL); + glPolygonMode(GL_BACK,GL_FILL); + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glEnable(GL_LIGHTING); + glDepthMask(GL_TRUE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + + glDepthFunc(GL_LEQUAL); + glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFFL ); + glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); + glDisable(GL_LIGHTING); + renderscene(2); + glEnable(GL_LIGHTING); + glDepthFunc(GL_LESS); + glDisable(GL_STENCIL_TEST); + glDisable(GL_CULL_FACE); + } + else + { + glDisable(GL_CULL_FACE); + renderscene(0); + } + + int xOffset = 10; + int yStart = 20; + int yIncr = 20; + + + glDisable(GL_LIGHTING); + glColor3f(0, 0, 0); + + if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) + { + setOrthographicProjection(); + + showProfileInfo(xOffset,yStart,yIncr); + +#ifdef USE_QUICKPROF + + + if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) + { + static int counter = 0; + counter++; + std::map::iterator iter; + for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter) + { + char blockTime[128]; + sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT)); + glRasterPos3f(xOffset,yStart,0); + GLDebugDrawString(BMF_GetFont(BMF_kHelvetica10),blockTime); + yStart += yIncr; + + } + + } +#endif //USE_QUICKPROF + + + + + resetPerspectiveProjection(); + } + + glEnable(GL_LIGHTING); + + + } + + updateCamera(); + +} +#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" + +void DemoApplication::clientResetScene() +{ +#ifdef SHOW_NUM_DEEP_PENETRATIONS + gNumDeepPenetrationChecks = 0; + gNumGjkChecks = 0; +#endif //SHOW_NUM_DEEP_PENETRATIONS + + gNumClampedCcdMotions = 0; + int numObjects = 0; + int i; + + if (m_dynamicsWorld) + { + numObjects = m_dynamicsWorld->getNumCollisionObjects(); + + ///create a copy of the array, not a reference! + btCollisionObjectArray copyArray = m_dynamicsWorld->getCollisionObjectArray(); + + + + + for (i=0;igetMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans = myMotionState->m_startWorldTrans; + body->setCenterOfMassTransform( myMotionState->m_graphicsWorldTrans ); + colObj->setInterpolationWorldTransform( myMotionState->m_startWorldTrans ); + colObj->forceActivationState(ACTIVE_TAG); + colObj->activate(); + colObj->setDeactivationTime(0); + //colObj->setActivationState(WANTS_DEACTIVATION); + } + //removed cached contact points (this is not necessary if all objects have been removed from the dynamics world) + //m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(colObj->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + + btRigidBody* body = btRigidBody::upcast(colObj); + if (body && !body->isStaticObject()) + { + btRigidBody::upcast(colObj)->setLinearVelocity(btVector3(0,0,0)); + btRigidBody::upcast(colObj)->setAngularVelocity(btVector3(0,0,0)); + } + } + + } + + ///reset some internal cached data in the broadphase + m_dynamicsWorld->getBroadphase()->resetPool(getDynamicsWorld()->getDispatcher()); + m_dynamicsWorld->getConstraintSolver()->reset(); + + } + +} diff --git a/Demos/OpenGL/DemoApplication.h b/Demos/OpenGL/DemoApplication.h index d77391efa..ef6a26799 100644 --- a/Demos/OpenGL/DemoApplication.h +++ b/Demos/OpenGL/DemoApplication.h @@ -1,246 +1,246 @@ -/* -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 DEMO_APPLICATION_H -#define DEMO_APPLICATION_H - - -#include "GlutStuff.h" -#include "GL_ShapeDrawer.h" - -#include -#include -#include - - -#include "LinearMath/btVector3.h" -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btCollisionShape; -class btDynamicsWorld; -class btRigidBody; -class btTypedConstraint; - - - -class DemoApplication -{ - void displayProfileString(int xOffset,int yStart,char* message); - class CProfileIterator* m_profileIterator; - - protected: -#ifdef USE_BT_CLOCK - btClock m_clock; -#endif //USE_BT_CLOCK - - ///this is the most important class - btDynamicsWorld* m_dynamicsWorld; - - ///constraint for mouse picking - btTypedConstraint* m_pickConstraint; - - btCollisionShape* m_shootBoxShape; - - float m_cameraDistance; - int m_debugMode; - - float m_ele; - float m_azi; - btVector3 m_cameraPosition; - btVector3 m_cameraTargetPosition;//look at - - int m_mouseOldX; - int m_mouseOldY; - int m_mouseButtons; -public: - int m_modifierKeys; -protected: - - float m_scaleBottom; - float m_scaleFactor; - btVector3 m_cameraUp; - int m_forwardAxis; - - int m_glutScreenWidth; - int m_glutScreenHeight; - - int m_ortho; - - float m_ShootBoxInitialSpeed; - - bool m_stepping; - bool m_singleStep; - bool m_idle; - int m_lastKey; - - void showProfileInfo(int& xOffset,int& yStart, int yIncr); - void renderscene(int pass); - - GL_ShapeDrawer* m_shapeDrawer; - bool m_enableshadows; - btVector3 m_sundirection; - btScalar m_defaultContactProcessingThreshold; - -public: - - DemoApplication(); - - virtual ~DemoApplication(); - - btDynamicsWorld* getDynamicsWorld() - { - return m_dynamicsWorld; - } - - virtual void initPhysics() = 0; - - virtual void setDrawClusters(bool drawClusters) - { - - } - - void overrideGLShapeDrawer (GL_ShapeDrawer* shapeDrawer); - - void setOrthographicProjection(); - void resetPerspectiveProjection(); - - 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(); - } - bool getShadows() const - { - return m_enableshadows; - } - - - int getDebugMode() - { - return m_debugMode ; - } - - void setDebugMode(int mode); - - void setAzi(float azi) - { - m_azi = azi; - } - - void setCameraUp(const btVector3& camUp) - { - m_cameraUp = camUp; - } - void setCameraForwardAxis(int axis) - { - m_forwardAxis = axis; - } - - virtual void myinit(); - - void toggleIdle(); - - virtual void updateCamera(); - - btVector3 getCameraPosition() - { - return m_cameraPosition; - } - btVector3 getCameraTargetPosition() - { - return m_cameraTargetPosition; - } - - btScalar getDeltaTimeMicroseconds() - { -#ifdef USE_BT_CLOCK - btScalar dt = (btScalar)m_clock.getTimeMicroseconds(); - m_clock.reset(); - return dt; -#else - return btScalar(16666.); -#endif - } - - ///glut callbacks - - float getCameraDistance(); - void setCameraDistance(float dist); - void moveAndDisplay(); - - virtual void clientMoveAndDisplay() = 0; - - virtual void clientResetScene(); - - ///Demo functions - virtual void setShootBoxShape (); - virtual void shootBox(const btVector3& destination); - - - btVector3 getRayTo(int x,int y); - - btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); - - ///callback methods by glut - - virtual void keyboardCallback(unsigned char key, int x, int y); - - virtual void keyboardUpCallback(unsigned char key, int x, int y) {} - - virtual void specialKeyboard(int key, int x, int y){} - - virtual void specialKeyboardUp(int key, int x, int y){} - - virtual void reshape(int w, int h); - - virtual void mouseFunc(int button, int state, int x, int y); - - virtual void mouseMotionFunc(int x,int y); - - virtual void displayCallback(); - - virtual void renderme(); - - virtual void swapBuffers() = 0; - - virtual void updateModifierKeys() = 0; - - void stepLeft(); - void stepRight(); - void stepFront(); - void stepBack(); - void zoomIn(); - void zoomOut(); - - bool isIdle() const - { - return m_idle; - } - - void setIdle(bool idle) - { - m_idle = idle; - } - - -}; - -#endif //DEMO_APPLICATION_H - - +/* +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 DEMO_APPLICATION_H +#define DEMO_APPLICATION_H + + +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" + +#include +#include +#include + + +#include "LinearMath/btVector3.h" +#include "LinearMath/btMatrix3x3.h" +#include "LinearMath/btTransform.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btCollisionShape; +class btDynamicsWorld; +class btRigidBody; +class btTypedConstraint; + + + +class DemoApplication +{ + void displayProfileString(int xOffset,int yStart,char* message); + class CProfileIterator* m_profileIterator; + + protected: +#ifdef USE_BT_CLOCK + btClock m_clock; +#endif //USE_BT_CLOCK + + ///this is the most important class + btDynamicsWorld* m_dynamicsWorld; + + ///constraint for mouse picking + btTypedConstraint* m_pickConstraint; + + btCollisionShape* m_shootBoxShape; + + float m_cameraDistance; + int m_debugMode; + + float m_ele; + float m_azi; + btVector3 m_cameraPosition; + btVector3 m_cameraTargetPosition;//look at + + int m_mouseOldX; + int m_mouseOldY; + int m_mouseButtons; +public: + int m_modifierKeys; +protected: + + float m_scaleBottom; + float m_scaleFactor; + btVector3 m_cameraUp; + int m_forwardAxis; + + int m_glutScreenWidth; + int m_glutScreenHeight; + + int m_ortho; + + float m_ShootBoxInitialSpeed; + + bool m_stepping; + bool m_singleStep; + bool m_idle; + int m_lastKey; + + void showProfileInfo(int& xOffset,int& yStart, int yIncr); + void renderscene(int pass); + + GL_ShapeDrawer* m_shapeDrawer; + bool m_enableshadows; + btVector3 m_sundirection; + btScalar m_defaultContactProcessingThreshold; + +public: + + DemoApplication(); + + virtual ~DemoApplication(); + + btDynamicsWorld* getDynamicsWorld() + { + return m_dynamicsWorld; + } + + virtual void initPhysics() = 0; + + virtual void setDrawClusters(bool drawClusters) + { + + } + + void overrideGLShapeDrawer (GL_ShapeDrawer* shapeDrawer); + + void setOrthographicProjection(); + void resetPerspectiveProjection(); + + 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(); + } + bool getShadows() const + { + return m_enableshadows; + } + + + int getDebugMode() + { + return m_debugMode ; + } + + void setDebugMode(int mode); + + void setAzi(float azi) + { + m_azi = azi; + } + + void setCameraUp(const btVector3& camUp) + { + m_cameraUp = camUp; + } + void setCameraForwardAxis(int axis) + { + m_forwardAxis = axis; + } + + virtual void myinit(); + + void toggleIdle(); + + virtual void updateCamera(); + + btVector3 getCameraPosition() + { + return m_cameraPosition; + } + btVector3 getCameraTargetPosition() + { + return m_cameraTargetPosition; + } + + btScalar getDeltaTimeMicroseconds() + { +#ifdef USE_BT_CLOCK + btScalar dt = (btScalar)m_clock.getTimeMicroseconds(); + m_clock.reset(); + return dt; +#else + return btScalar(16666.); +#endif + } + + ///glut callbacks + + float getCameraDistance(); + void setCameraDistance(float dist); + void moveAndDisplay(); + + virtual void clientMoveAndDisplay() = 0; + + virtual void clientResetScene(); + + ///Demo functions + virtual void setShootBoxShape (); + virtual void shootBox(const btVector3& destination); + + + btVector3 getRayTo(int x,int y); + + btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); + + ///callback methods by glut + + virtual void keyboardCallback(unsigned char key, int x, int y); + + virtual void keyboardUpCallback(unsigned char key, int x, int y) {} + + virtual void specialKeyboard(int key, int x, int y){} + + virtual void specialKeyboardUp(int key, int x, int y){} + + virtual void reshape(int w, int h); + + virtual void mouseFunc(int button, int state, int x, int y); + + virtual void mouseMotionFunc(int x,int y); + + virtual void displayCallback(); + + virtual void renderme(); + + virtual void swapBuffers() = 0; + + virtual void updateModifierKeys() = 0; + + void stepLeft(); + void stepRight(); + void stepFront(); + void stepBack(); + void zoomIn(); + void zoomOut(); + + bool isIdle() const + { + return m_idle; + } + + void setIdle(bool idle) + { + m_idle = idle; + } + + +}; + +#endif //DEMO_APPLICATION_H + + diff --git a/Demos/OpenGL/GLDebugFont.cpp b/Demos/OpenGL/GLDebugFont.cpp index c023664c7..c7f69a4b7 100644 --- a/Demos/OpenGL/GLDebugFont.cpp +++ b/Demos/OpenGL/GLDebugFont.cpp @@ -1,987 +1,987 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "GLDebugFont.h" - - -#ifdef _WIN32//for glut.h -#include -#endif - -//think different -#if defined(__APPLE__) && !defined (VMDMESA) -#include -#if (defined (TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined (TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR) -#import -#define glOrtho glOrthof -#else -#include -#include -#include -#endif -#else - - - -#ifdef _WINDOWS -#include -#include -#include -#else -#include -#endif -#endif - -#include -#include //for memset - -extern unsigned char sFontData[]; -static bool sTexturesInitialized = false; - -static GLuint sTexture = -1; -static int sScreenWidth = -1; -static int sScreenHeight = -1; - - -void GLDebugResetFont(int screenWidth,int screenHeight) -{ - - if ((sScreenWidth == screenWidth) && (sScreenHeight == screenHeight)) - return; - - sScreenWidth = screenWidth; - sScreenHeight = screenHeight; - - if (!sTexturesInitialized) - { - sTexturesInitialized = true; - glGenTextures(1, &sTexture); - glBindTexture(GL_TEXTURE_2D, sTexture); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, 3, 256 , 256 , 0, GL_RGB, GL_UNSIGNED_BYTE, &sFontData[0]); - } - - printf("generating font at resolution %d,%d\n",screenWidth,screenHeight); - -} - -#define USE_ARRAYS 1 - -void GLDebugDrawStringInternal(int x,int y,const char* string, const btVector3& rgb) -{ - - if (!sTexturesInitialized) - { - GLDebugResetFont(sScreenWidth,sScreenHeight); - } - if (strlen(string)) - { - - glColor4f(rgb.getX(),rgb.getY(),rgb.getZ(),1.f); - float cx; - float cy; - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); - glDisable(GL_TEXTURE_GEN_R); - - glEnable(GL_TEXTURE_2D); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glDepthFunc (GL_LEQUAL); - glEnable(GL_BLEND); - glEnable (GL_DEPTH_TEST); - glBindTexture(GL_TEXTURE_2D, sTexture); - glDisable(GL_DEPTH_TEST); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glOrtho(0,sScreenWidth,0,sScreenHeight,-1,1); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glTranslatef(btScalar(x),btScalar(sScreenHeight - y),btScalar(0)); - -#if USE_ARRAYS - - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState (GL_TEXTURE_COORD_ARRAY); -#endif - - GLfloat verts[] ={ - 0.0f, 1.0f, 0.0f, - -1.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - 0.f,0.f,0.f - }; - - GLfloat uv_texcoords[] = { - 0,0, - 0,0, - 0,0, - 0,0 - }; - verts[0] = 0; verts[1] = 0; verts[2] = 0; - verts[3] = 16-1; verts[4] = 0; verts[5] = 0; - verts[6] = 16-1; verts[7] = 16-1; verts[8] = 0; - verts[9] = 0; verts[10] = 16-1; verts[11] = 0; - - for (int i=0;i=0) - { - cx=float(ch%16) * btScalar(1./16.f); - cy=float(ch/16) * btScalar(1./16.f); - - uv_texcoords[0] = cx; uv_texcoords[1] = btScalar(1-cy-1./16.f); - uv_texcoords[2] = btScalar(cx+1./16.f); uv_texcoords[3] = btScalar(1-cy-1./16.f); - uv_texcoords[4] = btScalar(cx+1./16.f); uv_texcoords[5] = btScalar(1-cy); - uv_texcoords[6] = cx; uv_texcoords[7] = btScalar(1-cy); -#if USE_ARRAYS - glTexCoordPointer(2,GL_FLOAT,0,uv_texcoords); - glVertexPointer(3, GL_FLOAT, 0, verts); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); -#else - glBegin(GL_QUADS); - glTexCoord2f(cx,1-cy-1./16.f); - - glVertex2i(0,0); - glTexCoord2f(cx+1./16.f,1-cy-1./16.f); - - glVertex2i(16 - 1,0); - glTexCoord2f(cx+1./16.f,1-cy); - - glVertex2i(16 - 1,16 -1); - glTexCoord2f(cx,1-cy); - - glVertex2i(0,16 -1); - glEnd(); -#endif - - glTranslatef(10,0,0); - } - } - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); -#if 1 - glEnable(GL_DEPTH_TEST); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glDepthFunc (GL_LEQUAL); - glDisable(GL_BLEND); - glDisable(GL_TEXTURE_2D); - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glScalef(btScalar(0.025),btScalar(0.025),btScalar(0.025)); -#endif - glMatrixMode(GL_MODELVIEW); -#if USE_ARRAYS - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState (GL_TEXTURE_COORD_ARRAY); -#endif - //glDisable(GL_TEXTURE_2D); - } -} - -void GLDebugDrawString(int x,int y,const char* string) -{ - - btVector3 rgb(1,1,1); - GLDebugDrawStringInternal(x,y,string,rgb); -} - - -unsigned char sFontData[] = -{ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,213,213,213,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,2,2,2,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213, - 213,213,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,213,213,213,255,255,255,255,255,255,255,255,255,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,178,178,178,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,0,0,0,0,0,0,0,0,0,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,178,178,178,255,255,255,255,255,255,255,255,255,145,145,145,103,103,103,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,2,2,2,255,255,255,178,178,178,103,103,103,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, - 255,255,145,145,145,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,145,145,145,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70, - 70,70,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,70,70, - 70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,213,213,213,255,255,255,255,255,255,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,255,255,255,213,213,213,70,70,70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,255,255,255,246,246,246,178,178,178,246,246,246,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37, - 37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,213,213, - 213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,255,255,255,103,103,103,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,255,255,255,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, - 255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,145,145,145,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,70,70,70,255,255,255,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,103,103,103,246,246,246,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,70,70,70,255,255,255,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,70,70,70,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,213,213,213,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,145,145,145,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,255,255,255,37,37,37,0,0,0,145,145,145,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255, - 255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,246,246,246,103,103,103,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,37,37,37,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,70,70,70,0,0,0,103,103,103,255,255, - 255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,255,255,255,255,255, - 255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,246,246, - 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255, - 255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,178,178,178,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178, - 178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,145,145,145,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,145,145,145,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,145,145,145,0,0,0,37,37,37,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,145,145,145,0,0,0,37,37,37,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2, - 2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103, - 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178, - 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, - 37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246, - 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103, - 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103, - 103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, - 246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,145,145,145,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,178,178,178,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, - 255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,178,178,178,0,0,0,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,103,103,103,178,178,178,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,2,2,2,37,37,37,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, - 255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,145,145,145,255,255,255,103,103,103,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,178,178,178,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,246,246,246,0,0,0,0,0,0,246,246,246,70,70, - 70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,2,2,2,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,70,70,70,2,2,2,2,2,2,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,178,178,178,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,145,145,145,255,255,255,103,103,103,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,178,178,178,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,246,246,246,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,103,103,103,178,178,178,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,103,103,103,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, - 255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,70,70,70,103,103,103,246,246,246,0,0,0,213,213,213,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,246,246, - 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255, - 255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,103,103,103,103,103,103,145,145,145,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178,178,178,103,103,103,178,178,178,255,255,255,145,145,145,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213, - 213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,145,145,145,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246, - 246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,255,255,255,178,178,178,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,178,178,178,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,178,178,178,255,255,255,37,37,37,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,70,70,70,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,103,103,103,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246, - 246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255, - 255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,213,213,213,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,37,37,37,255,255,255,255,255,255,70,70,70,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,178,178,178,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,178,178,178,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,178,178,178,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37, - 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,246,246,246,255,255,255,145,145,145,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246, - 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,246,246,246,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, - 255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, - 255,255,145,145,145,103,103,103,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,255,255,255,246,246,246,2,2,2,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,103,103,103,178,178,178,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37, - 37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,2,2,2,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,255,255,255,103,103, - 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,103,103,103,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2, - 2,2,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,255,255,255,2,2,2,246,246,246,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,145,145,145,103,103, - 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103, - 103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,103,103,103,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,70,70,70,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,2,2,2,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,145,145,145,2,2,2,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213, - 213,213,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,255,255,255,255,255,255,2,2,2,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,255,255,255,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,255,255,255,37,37,37,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255, - 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,255,255,255,246,246,246,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255, - 255,255,103,103,103,103,103,103,0,0,0,70,70,70,103,103,103,255,255,255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,213,213,213,255,255,255,145,145,145,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,145,145,145,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,103,103,103,213,213,213,255,255,255,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, - 255,255,255,255,255,255,255,255,2,2,2,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,178,178,178,103,103,103,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255, - 255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,103,103,103,213,213,213,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,0,0,0,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,70,70,70,0,0,0,37,37,37,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,103,103,103,0,0,0,2,2,2,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,103,103,103,0,0,0,70,70,70,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,178,178,178,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, - 255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,145,145,145,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,246,246,246,255,255,255,2,2,2,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,178,178,178,103,103,103,255,255,255,213,213,213,70,70,70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,103,103,103,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,2,2,2,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,246,246,246,255,255,255,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,213,213,213,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,178,178,178,37,37,37,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,255,255,255,178,178,178,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,70,70,70,255,255,255,70,70,70,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,145,145,145,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, - 246,246,213,213,213,0,0,0,70,70,70,255,255,255,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,70,70,70,255,255,255,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,246,246,246,103,103,103,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,213,213,213,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145, - 145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37, - 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,2,2,2,103,103,103,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,103,103,103,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213, - 213,213,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,103,103,103,255,255,255,246,246,246,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,255,255,255,246,246, - 246,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,0,0,0,255,255,255,255,255,255,145,145,145,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,255,255,255,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,70,70,70,0,0,0,103,103,103,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255, - 255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213, - 213,213,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,246,246,246,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,37,37,37,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,213,213,213,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,178,178,178,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, - 246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145, - 145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,246,246,246,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, - 37,37,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,213,213,213,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,213,213,213,103,103,103,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,246,246,246,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,178,178,178,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,246,246,246,213,213,213,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,213,213,213,255,255,255,255,255,255,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178, - 178,178,0,0,0,0,0,0,213,213,213,213,213,213,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,178,178,178,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103, - 103,103,255,255,255,178,178,178,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,246,246,246,255,255,255,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,2,2,178,178,178,255,255,255,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,213,213,213,37,37,37,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,255,255,255,37,37, - 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,145,145,145,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255, - 255,255,255,255,255,145,145,145,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,70,70,70,2,2,2,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, - 255,255,0,0,0,255,255,255,2,2,2,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255, - 255,255,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,2,2,2,255,255,255,145,145,145,70,70, - 70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70, - 70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,145,145,145,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255, - 255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, - 37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0, - 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,213,213,213,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,2,2,2,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,213,213,213,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,2,2,2,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,246,246,246,103,103,103,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,2,2,2,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,103,103,103,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,213,213,213,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,145,145,145,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,103,103,103,255,255,255,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, - 37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,37,37,37,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,70,70,70,0,0,0,2,2,2,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, - 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0,0,70,70,70,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,178,178,178,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0, - 0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,159,159,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255, - 255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0, - 0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103, - 103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255, - 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145, - 145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255, - 255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178, - 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,70,70,70,0,0,0,2,2,2,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,2,2,2,0,0,0,70,70,70,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0,0,70,70,70,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,246,246,246,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,70,70,70,0,0,0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,145,145,145,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,213,213,213,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,70,70,70,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,37,37,37,246,246,246,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,37,37,37,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,213,213,213,0,0,0,145,145,145,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,213,213,213,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,246,246,246,0,0,0,255,255,255,0,0,0,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,103,103,103,246,246,246,255,255,255,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178, - 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,37,37,37,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,70,70,70,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, - 255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,70,70,70,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,246,246,246,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,213,213,213,255,255,255,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,70,70,70,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,37,37,37,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, - 37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,37,37,37,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, - 255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213, - 213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,213,213,213,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,246,246,246,246,246,246,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,37,37,37,70,70,70,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,246,246,246,2,2,2,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,70,70,70,255,255,255,246,246,246,178,178,178,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,246,246,246,2,2,2,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,145,145,145,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,178,178,178,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,246,246,246,255,255,255,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,246,246,246,103,103,103,103,103,103,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,145,145,145,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,246,246,246,0,0,0,255,255,255,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,255,255,255,0,0,0,255,255,255,2,2,2,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,103,103,103,255,255,255,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,246,246,246,255,255,255,178,178,178,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37, - 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, - 255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,103,103,103,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,37,37,37,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,178,178,178,255,255,255,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,178,178, - 178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,213,213,213,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,246,246,246,246,246,246,246,246,246,246,246,246,246,246, - 246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,37,37, - 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,0,0,0,103,103,103,0,0,0,70,70,70,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,178,178,178,178,178,178,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,2,2,2,255,255,255,0,0,0,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,246,246,246,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,213,213,213,178,178,178,255,255,255,70,70,70,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,103,103,103,255,255,255,2,2,2,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,2,2,2,103,103,103,213,213,213,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,178,178,178,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,145,145,145,103,103,103,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,37,37,37,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,70,70,70,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,178,178,178,255,255,255,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,103,103,103,255,255, - 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246, - 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,213,213,213,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,246,246,246,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,246,246,246,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,70,70,70,103,103,103,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,37,37,37,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,246,246,246,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, - 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,178,178,178,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,246,246,246,246,246,246,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,145,145,145,246,246,246,246,246,246,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178, - 178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,2,2,2,0,0,0,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, - 246,246,37,37,37,0,0,0,37,37,37,246,246,246,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,255,255,255,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,70,70,70,246,246,246,37,37,37,246,246,246,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,213,213,213,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,255,255,255,103,103,103,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,37,37,37,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,2,2,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,255,255,255,246,246,246,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,255,255, - 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,246,246,246,103,103,103,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255, - 255,255,145,145,145,255,255,255,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,145,145,145,178,178, - 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,255,255,255,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0, - 0,0,0,0,0,255,255,255,255,255,255,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,2,2,2,0,0,0,70,70, - 70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0, - 0,0,0,0,0,103,103,103,103,103,103,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,2,2,2,70,70,70,70,70, - 70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,178,178,178,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,255,255,255,2,2,2,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,103, - 103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178, - 178,178,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "GLDebugFont.h" + + +#ifdef _WIN32//for glut.h +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#if (defined (TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined (TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR) +#import +#define glOrtho glOrthof +#else +#include +#include +#include +#endif +#else + + + +#ifdef _WINDOWS +#include +#include +#include +#else +#include +#endif +#endif + +#include +#include //for memset + +extern unsigned char sFontData[]; +static bool sTexturesInitialized = false; + +static GLuint sTexture = -1; +static int sScreenWidth = -1; +static int sScreenHeight = -1; + + +void GLDebugResetFont(int screenWidth,int screenHeight) +{ + + if ((sScreenWidth == screenWidth) && (sScreenHeight == screenHeight)) + return; + + sScreenWidth = screenWidth; + sScreenHeight = screenHeight; + + if (!sTexturesInitialized) + { + sTexturesInitialized = true; + glGenTextures(1, &sTexture); + glBindTexture(GL_TEXTURE_2D, sTexture); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, 3, 256 , 256 , 0, GL_RGB, GL_UNSIGNED_BYTE, &sFontData[0]); + } + + printf("generating font at resolution %d,%d\n",screenWidth,screenHeight); + +} + +#define USE_ARRAYS 1 + +void GLDebugDrawStringInternal(int x,int y,const char* string, const btVector3& rgb) +{ + + if (!sTexturesInitialized) + { + GLDebugResetFont(sScreenWidth,sScreenHeight); + } + if (strlen(string)) + { + + glColor4f(rgb.getX(),rgb.getY(),rgb.getZ(),1.f); + float cx; + float cy; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + glDepthFunc (GL_LEQUAL); + glEnable(GL_BLEND); + glEnable (GL_DEPTH_TEST); + glBindTexture(GL_TEXTURE_2D, sTexture); + glDisable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glOrtho(0,sScreenWidth,0,sScreenHeight,-1,1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(btScalar(x),btScalar(sScreenHeight - y),btScalar(0)); + +#if USE_ARRAYS + + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState (GL_TEXTURE_COORD_ARRAY); +#endif + + GLfloat verts[] ={ + 0.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 0.0f, + 1.0f, -1.0f, 0.0f, + 0.f,0.f,0.f + }; + + GLfloat uv_texcoords[] = { + 0,0, + 0,0, + 0,0, + 0,0 + }; + verts[0] = 0; verts[1] = 0; verts[2] = 0; + verts[3] = 16-1; verts[4] = 0; verts[5] = 0; + verts[6] = 16-1; verts[7] = 16-1; verts[8] = 0; + verts[9] = 0; verts[10] = 16-1; verts[11] = 0; + + for (int i=0;i=0) + { + cx=float(ch%16) * btScalar(1./16.f); + cy=float(ch/16) * btScalar(1./16.f); + + uv_texcoords[0] = cx; uv_texcoords[1] = btScalar(1-cy-1./16.f); + uv_texcoords[2] = btScalar(cx+1./16.f); uv_texcoords[3] = btScalar(1-cy-1./16.f); + uv_texcoords[4] = btScalar(cx+1./16.f); uv_texcoords[5] = btScalar(1-cy); + uv_texcoords[6] = cx; uv_texcoords[7] = btScalar(1-cy); +#if USE_ARRAYS + glTexCoordPointer(2,GL_FLOAT,0,uv_texcoords); + glVertexPointer(3, GL_FLOAT, 0, verts); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); +#else + glBegin(GL_QUADS); + glTexCoord2f(cx,1-cy-1./16.f); + + glVertex2i(0,0); + glTexCoord2f(cx+1./16.f,1-cy-1./16.f); + + glVertex2i(16 - 1,0); + glTexCoord2f(cx+1./16.f,1-cy); + + glVertex2i(16 - 1,16 -1); + glTexCoord2f(cx,1-cy); + + glVertex2i(0,16 -1); + glEnd(); +#endif + + glTranslatef(10,0,0); + } + } + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +#if 1 + glEnable(GL_DEPTH_TEST); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + glDepthFunc (GL_LEQUAL); + glDisable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glScalef(btScalar(0.025),btScalar(0.025),btScalar(0.025)); +#endif + glMatrixMode(GL_MODELVIEW); +#if USE_ARRAYS + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState (GL_TEXTURE_COORD_ARRAY); +#endif + //glDisable(GL_TEXTURE_2D); + } +} + +void GLDebugDrawString(int x,int y,const char* string) +{ + + btVector3 rgb(1,1,1); + GLDebugDrawStringInternal(x,y,string,rgb); +} + + +unsigned char sFontData[] = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,213,213,213,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,2,2,2,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213, + 213,213,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,213,213,213,255,255,255,255,255,255,255,255,255,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,178,178,178,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,0,0,0,0,0,0,0,0,0,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,178,178,178,255,255,255,255,255,255,255,255,255,145,145,145,103,103,103,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,2,2,2,255,255,255,178,178,178,103,103,103,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,145,145,145,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,145,145,145,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70, + 70,70,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,70,70, + 70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,213,213,213,255,255,255,255,255,255,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,255,255,255,213,213,213,70,70,70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,255,255,255,246,246,246,178,178,178,246,246,246,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37, + 37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,213,213, + 213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,255,255,255,103,103,103,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,255,255,255,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,145,145,145,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,70,70,70,255,255,255,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,103,103,103,246,246,246,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,70,70,70,255,255,255,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,70,70,70,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,213,213,213,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,145,145,145,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,255,255,255,37,37,37,0,0,0,145,145,145,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,246,246,246,103,103,103,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,37,37,37,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,70,70,70,0,0,0,103,103,103,255,255, + 255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,255,255,255,255,255, + 255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,246,246, + 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255, + 255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,178,178,178,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178, + 178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,145,145,145,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,145,145,145,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,145,145,145,0,0,0,37,37,37,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,145,145,145,0,0,0,37,37,37,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2, + 2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103, + 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178, + 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, + 37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246, + 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103, + 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103, + 103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, + 246,246,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,145,145,145,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,178,178,178,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, + 255,255,213,213,213,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,178,178,178,0,0,0,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,103,103,103,178,178,178,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,2,2,2,37,37,37,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, + 255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,145,145,145,255,255,255,103,103,103,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,178,178,178,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,246,246,246,0,0,0,0,0,0,246,246,246,70,70, + 70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,2,2,2,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,70,70,70,2,2,2,2,2,2,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,178,178,178,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,145,145,145,255,255,255,103,103,103,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,178,178,178,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,246,246,246,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,103,103,103,178,178,178,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,103,103,103,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, + 255,255,213,213,213,0,0,0,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,70,70,70,103,103,103,246,246,246,0,0,0,213,213,213,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,246,246, + 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255, + 255,255,255,255,255,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,103,103,103,103,103,103,145,145,145,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178,178,178,103,103,103,178,178,178,255,255,255,145,145,145,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,213,213,213,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213, + 213,213,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,145,145,145,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,178,178,178,255,255,255,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246, + 246,246,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,255,255,255,178,178,178,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,178,178,178,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,178,178,178,255,255,255,37,37,37,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,70,70,70,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,103,103,103,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246, + 246,246,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,213,213,213,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,37,37,37,255,255,255,255,255,255,70,70,70,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,178,178,178,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,145,145,145,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,178,178,178,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,178,178,178,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37, + 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,246,246,246,255,255,255,145,145,145,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,213,213,213,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246, + 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,246,246,246,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, + 255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,145,145,145,103,103,103,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,255,255,255,246,246,246,2,2,2,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,103,103,103,178,178,178,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37, + 37,37,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,2,2,2,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,255,255,255,103,103, + 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,103,103,103,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2, + 2,2,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,37,37,37,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,255,255,255,2,2,2,246,246,246,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,145,145,145,103,103, + 103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103, + 103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,103,103,103,246,246,246,255,255,255,103,103,103,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,70,70,70,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,2,2,2,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,145,145,145,2,2,2,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213, + 213,213,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,255,255,255,255,255,255,2,2,2,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,255,255,255,37,37,37,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,103,103,103,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,255,255,255,246,246,246,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255, + 255,255,103,103,103,103,103,103,0,0,0,70,70,70,103,103,103,255,255,255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,213,213,213,255,255,255,145,145,145,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,145,145,145,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,103,103,103,213,213,213,255,255,255,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,255,255,255,255,255,255,2,2,2,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,213,213,213,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,103,103,103,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,178,178,178,103,103,103,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255, + 255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,103,103,103,103,103,103,213,213,213,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,103,103,103,0,0,0,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,70,70,70,0,0,0,37,37,37,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,103,103,103,103,103,103,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,103,103,103,0,0,0,2,2,2,178,178,178,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,103,103,103,0,0,0,70,70,70,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,178,178,178,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,145,145,145,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,246,246,246,255,255,255,2,2,2,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,178,178,178,103,103,103,255,255,255,213,213,213,70,70,70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,103,103,103,103,103,103,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,2,2,2,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,246,246,246,255,255,255,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,213,213,213,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,178,178,178,37,37,37,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,255,255,255,178,178,178,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,70,70,70,255,255,255,70,70,70,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,145,145,145,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, + 246,246,213,213,213,0,0,0,70,70,70,255,255,255,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,70,70,70,255,255,255,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,246,246,246,103,103,103,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,213,213,213,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145, + 145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37, + 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,2,2,2,103,103,103,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,246,246,246,103,103,103,103,103,103,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213, + 213,213,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,103,103,103,255,255,255,246,246,246,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,255,255,255,246,246, + 246,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,103,103,103,103,103,103,0,0,0,255,255,255,255,255,255,145,145,145,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,2,2,2,0,0,0,255,255,255,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,70,70,70,0,0,0,103,103,103,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,103,103,103,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255, + 255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,178,178,178,255,255,255,178,178,178,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,103,103,103,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,255,255,255,178,178,178,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213, + 213,213,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,246,246,246,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,37,37,37,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,213,213,213,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,213,213,213,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,178,178,178,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, + 246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178,178,178,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145, + 145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,246,246,246,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, + 37,37,255,255,255,103,103,103,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,103,103,103,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,213,213,213,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,213,213,213,103,103,103,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,246,246,246,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,178,178,178,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,246,246,246,213,213,213,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,213,213,213,255,255,255,255,255,255,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178, + 178,178,0,0,0,0,0,0,213,213,213,213,213,213,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,2,2,2,178,178,178,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,255,255,255,178,178,178,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,145,145,145,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103, + 103,103,255,255,255,178,178,178,0,0,0,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,246,246,246,255,255,255,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,2,2,178,178,178,255,255,255,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,213,213,213,37,37,37,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,213,213,213,255,255,255,37,37, + 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,213,213,213,255,255,255,145,145,145,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255, + 255,255,255,255,255,145,145,145,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,70,70,70,2,2,2,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255, + 255,255,0,0,0,255,255,255,2,2,2,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255, + 255,255,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,2,2,2,255,255,255,145,145,145,70,70, + 70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70, + 70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,145,145,145,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255, + 255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,246,246,246,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, + 37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,213,213,213,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,2,2,2,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,213,213,213,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,37,37,37,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,2,2,2,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,246,246,246,103,103,103,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,2,2,2,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,103,103,103,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,213,213,213,246,246,246,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,145,145,145,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,103,103,103,255,255,255,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, + 37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,37,37,37,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,145,145,145,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,70,70,70,0,0,0,2,2,2,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0, + 0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0,0,70,70,70,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,178,178,178,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0, + 0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,159,159,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255, + 255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0, + 0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103, + 103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145, + 145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255, + 255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178, + 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,70,70,70,0,0,0,2,2,2,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,2,2,2,0,0,0,70,70,70,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,37,37,37,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0,0,70,70,70,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,246,246,246,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,70,70,70,0,0,0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,145,145,145,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,213,213,213,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,70,70,70,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,37,37,37,246,246,246,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,255,255,255,37,37,37,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,37,37,37,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,213,213,213,0,0,0,145,145,145,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,213,213,213,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,246,246,246,0,0,0,255,255,255,0,0,0,213,213,213,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,103,103,103,246,246,246,255,255,255,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178, + 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,37,37,37,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,2,2,2,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,70,70,70,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,70,70,70,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,246,246,246,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,213,213,213,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,37,37,37,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,37,37,37,246,246,246,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,70,70,70,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,213,213,213,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,37,37,37,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37, + 37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,37,37,37,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,178,178,178,246,246,246,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,246,246,246,103,103,103,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213, + 213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,213,213,213,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,246,246,246,246,246,246,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,255,255,255,37,37,37,70,70,70,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,246,246,246,2,2,2,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,70,70,70,255,255,255,246,246,246,178,178,178,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,246,246,246,2,2,2,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,145,145,145,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,2,2,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,178,178,178,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,246,246,246,255,255,255,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,37,37,37,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,246,246,246,103,103,103,103,103,103,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,37,37,37,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37,37,0,0,0,145,145,145,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,246,246,246,0,0,0,255,255,255,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,255,255,255,0,0,0,255,255,255,2,2,2,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,103,103,103,255,255,255,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,246,246,246,255,255,255,178,178,178,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,37,37,37,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,37,37, + 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,103,103,103,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,37,37,37,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,213,213,213,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,178,178,178,255,255,255,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,178,178, + 178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,213,213,213,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,145,145,145,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,246,246,246,246,246,246,246,246,246,246,246,246,246,246, + 246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,246,246,246,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,37,37, + 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,0,0,0,103,103,103,0,0,0,70,70,70,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,255,255,255,178,178,178,178,178,178,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,103,103,103,255,255,255,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,2,2,2,255,255,255,0,0,0,178,178,178,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,246,246,246,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,2,2,2,246,246,246,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,246,246,246,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,213,213,213,178,178,178,255,255,255,70,70,70,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,103,103,103,255,255,255,2,2,2,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,2,2,2,103,103,103,213,213,213,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,178,178,178,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,103,103,103,0,0,0,145,145,145,103,103,103,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,255,255,255,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,103,103,103,246,246,246,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,37,37,37,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,70,70,70,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,178,178,178,255,255,255,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,103,103,103,255,255, + 255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,213,213,213,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246, + 246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,213,213,213,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,246,246,246,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,246,246,246,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,103,103,103,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,246,246,246,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,70,70,70,103,103,103,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,37,37,37,246,246,246,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,246,246,246,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,213,213,213,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,103,103,103,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,178,178,178,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,246,246,246,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,213,213,213,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,2,2,2,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,246,246,246,246,246,246,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,103,103,103,103,103,103,145,145,145,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,2,2,2,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,2,2,2,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,255,255,255,255,255,255,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,145,145,145,246,246,246,246,246,246,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,255,255,255,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,70,70,70,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,255,255,255,255,255,255,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,178, + 178,178,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,255,255,255,255,255,255,103,103,103,145,145,145,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,2,2,2,0,0,0,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246, + 246,246,37,37,37,0,0,0,37,37,37,246,246,246,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,103,103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,246,246,246,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,255,255,255,246,246,246,255,255,255,255,255,255,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,70,70,70,246,246,246,37,37,37,246,246,246,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,246,246,246,255,255,255,0,0,0,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,255,255,255,255,255,255,246,246,246,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,103,103,103,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,213,213,213,103,103,103,145,145,145,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,70,70,70,255,255,255,2,2,2,0,0,0,246,246,246,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,255,255,255,103,103,103,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,37,37,37,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,2,2,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,255,255,255,246,246,246,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,246,246,246,246,246,246,103,103,103,255,255,255,178,178,178,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255, + 255,255,145,145,145,255,255,255,37,37,37,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,255,255,255,145,145,145,178,178, + 178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,255,255,255,103,103,103,213,213,213,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0, + 0,0,0,0,0,255,255,255,255,255,255,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,2,2,2,0,0,0,70,70, + 70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,2,2,2,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,255,255,255,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0, + 0,0,0,0,0,103,103,103,103,103,103,0,0,0,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,103,103,103,2,2,2,70,70,70,70,70, + 70,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,70,70,70,0,0,0,178,178,178,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,70,70,70,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,255,255,255,103,103,103,255,255,255,2,2,2,103,103,103,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,213,213,103, + 103,103,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,213,213,213,0,0,0,255,255,255,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,178,178,178,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,103,103,103,0,0,0,246,246,246,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,103,103,103,0,0,0,103,103,103,37,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,213,213,213,255,255,255,246,246,246,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178, + 178,178,246,246,246,37,37,37,0,0,0,0,0,0,0,0,0,103,103,103,213,213,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,178,178,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,255,255,255,255,255,255,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,178,178,255,255,255,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,145,145,145,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,70,70,70,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,2,2,2,0,0,0,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,246,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; diff --git a/Demos/OpenGL/GLDebugFont.h b/Demos/OpenGL/GLDebugFont.h index 3b91df0df..858062227 100644 --- a/Demos/OpenGL/GLDebugFont.h +++ b/Demos/OpenGL/GLDebugFont.h @@ -1,27 +1,27 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_DEBUG_FONT_H -#define BT_DEBUG_FONT_H - -#include "LinearMath/btVector3.h" - -void GLDebugDrawStringInternal(int x,int y,const char* string,const btVector3& rgb); -void GLDebugDrawString(int x,int y,const char* string); -void GLDebugResetFont(int screenWidth,int screenHeight); - -#endif //BT_DEBUG_FONT_H - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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_DEBUG_FONT_H +#define BT_DEBUG_FONT_H + +#include "LinearMath/btVector3.h" + +void GLDebugDrawStringInternal(int x,int y,const char* string,const btVector3& rgb); +void GLDebugDrawString(int x,int y,const char* string); +void GLDebugResetFont(int screenWidth,int screenHeight); + +#endif //BT_DEBUG_FONT_H + diff --git a/Demos/OpenGL/GL_DialogDynamicsWorld.cpp b/Demos/OpenGL/GL_DialogDynamicsWorld.cpp index 16cc3a529..63501808d 100644 --- a/Demos/OpenGL/GL_DialogDynamicsWorld.cpp +++ b/Demos/OpenGL/GL_DialogDynamicsWorld.cpp @@ -1,739 +1,739 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "GL_DialogDynamicsWorld.h" -#include "GL_DialogWindow.h" -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h" -#include "BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h" -#include "BulletCollision/CollisionShapes/btBox2dShape.h" -#include "BulletCollision/CollisionShapes/btConvex2dShape.h" -#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" - -GL_DialogDynamicsWorld::GL_DialogDynamicsWorld() -{ - m_upperBorder = 0; - m_lowerBorder =0; - - m_pickConstraint = 0; - m_screenWidth = 0; - m_screenHeight = 0; - - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_broadphase = new btDbvtBroadphase(); - m_constraintSolver = new btSequentialImpulseConstraintSolver(); - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_constraintSolver,m_collisionConfiguration); - m_dynamicsWorld ->getSolverInfo().m_splitImpulse = true; - //m_dynamicsWorld->setGravity(btVector3(0,10,0)); - m_dynamicsWorld->setGravity(btVector3(0,0,0)); - - m_simplexSolver = new btVoronoiSimplexSolver(); - m_pdSolver = new btMinkowskiPenetrationDepthSolver(); - - btConvex2dConvex2dAlgorithm::CreateFunc* convexAlgo2d = new btConvex2dConvex2dAlgorithm::CreateFunc(m_simplexSolver,m_pdSolver); - - m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); - m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); - m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,convexAlgo2d); - m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,new btBox2dBox2dCollisionAlgorithm::CreateFunc()); - - ///enable boarders, to avoid 'loosing' menus -#if 1 - btTransform tr; - tr.setIdentity(); - - { - btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(0,1,0),0); - m_upperBorder = new btCollisionObject(); - tr.setOrigin(btVector3(0,-BT_LARGE_FLOAT,0)); - m_upperBorder->setWorldTransform(tr); - m_upperBorder->setCollisionShape(plane); - m_dynamicsWorld->addCollisionObject(m_upperBorder); - } - - { - btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(0,-1,0),0); - m_lowerBorder = new btCollisionObject(); - - tr.setIdentity(); - tr.setOrigin(btVector3(0,BT_LARGE_FLOAT,0)); - m_lowerBorder->setWorldTransform(tr); - m_lowerBorder->setCollisionShape(plane); - m_dynamicsWorld->addCollisionObject(m_lowerBorder); - } - { - btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(1,0,0),0); - m_leftBorder = new btCollisionObject(); - tr.setIdentity(); - tr.setOrigin(btVector3(-BT_LARGE_FLOAT,0,0)); - m_leftBorder->setWorldTransform(tr); - m_leftBorder->setCollisionShape(plane); - m_dynamicsWorld->addCollisionObject(m_leftBorder); - } - { - btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(-1,0,0),0); - m_rightBorder = new btCollisionObject(); - tr.setIdentity(); - tr.setOrigin(btVector3(BT_LARGE_FLOAT,0,0)); - m_rightBorder->setWorldTransform(tr); - m_rightBorder->setCollisionShape(plane); - m_dynamicsWorld->addCollisionObject(m_rightBorder); - } -#endif - -} - -GL_DialogDynamicsWorld::~GL_DialogDynamicsWorld() -{ - delete m_dynamicsWorld; - delete m_dispatcher; - delete m_constraintSolver; - delete m_broadphase; - delete m_collisionConfiguration; -} - -void GL_DialogDynamicsWorld::setScreenSize(int width, int height) -{ - - - int i; - - for ( i=0;igetCollisionObjectArray().size();i++) - { - btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i]; - btRigidBody* body = btRigidBody::upcast(colObj); - if (body) - { - m_dynamicsWorld->removeRigidBody(body); - btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(btScalar(m_screenWidth/2.),btScalar(m_screenHeight/2),btScalar(0))-btVector3(btScalar(width/2.),btScalar(height/2.),btScalar(0)); - colObj->getWorldTransform().setOrigin(newPos); - m_dynamicsWorld->addRigidBody(body); - } else - { - m_dynamicsWorld->removeCollisionObject(colObj); - btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(btScalar(m_screenWidth/2.),btScalar(m_screenHeight/2.),btScalar(0))-btVector3(btScalar(width/2.),btScalar(height/2.),btScalar(0)); - colObj->getWorldTransform().setOrigin(newPos); - m_dynamicsWorld->addCollisionObject(colObj); - } - } - - for ( i=0;isetScreenSize(width,height); - } - if (width && height) - { - if (m_upperBorder) - { - m_dynamicsWorld->removeCollisionObject(m_upperBorder); - - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(btScalar(0),btScalar(-height/2.),btScalar(0.))); - m_upperBorder->setWorldTransform(tr); - m_dynamicsWorld->addCollisionObject(m_upperBorder); - } - - if (m_lowerBorder) - { - m_dynamicsWorld->removeCollisionObject(m_lowerBorder); - - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(btScalar(0),btScalar(height/2.),btScalar(0))); - m_lowerBorder->setWorldTransform(tr); - m_dynamicsWorld->addCollisionObject(m_lowerBorder); - } - if (m_leftBorder) - { - m_dynamicsWorld->removeCollisionObject(m_leftBorder); - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(btScalar(-width/2.),btScalar(0),btScalar(0))); - m_leftBorder->setWorldTransform(tr); - m_dynamicsWorld->addCollisionObject(m_leftBorder); - } - if (m_rightBorder) - { - m_dynamicsWorld->removeCollisionObject(m_rightBorder); - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(btScalar(width/2.),btScalar(0),btScalar(0))); - m_rightBorder->setWorldTransform(tr); - m_dynamicsWorld->addCollisionObject(m_rightBorder); - - } - - } - - - m_screenWidth = width; - m_screenHeight = height; -} - -GL_DialogWindow* GL_DialogDynamicsWorld::createDialog(int horPos,int vertPos,int dialogWidth,int dialogHeight, const char* dialogTitle ) -{ - btBox2dShape* boxShape = new btBox2dShape(btVector3(dialogWidth/2.f,dialogHeight/2.f,0.4f)); - btScalar mass = 100.f; - btVector3 localInertia; - boxShape->calculateLocalInertia(mass,localInertia); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,boxShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - btTransform trans; - trans.setIdentity(); - trans.setOrigin(btVector3(btScalar(horPos-m_screenWidth/2+dialogWidth/2), btScalar(vertPos+m_screenHeight/2.+dialogHeight/2),btScalar(0.))); - - - - body->setWorldTransform(trans); - body->setDamping(0.999f,0.99f); - - //body->setActivationState(ISLAND_SLEEPING); - body->setLinearFactor(btVector3(1,1,0)); - //body->setAngularFactor(btVector3(0,0,1)); - body->setAngularFactor(btVector3(0,0,0)); - - GL_DialogWindow* dialogWindow = new GL_DialogWindow(horPos,vertPos,dialogWidth,dialogHeight,body,dialogTitle); - m_dialogs.push_back(dialogWindow); - m_dynamicsWorld->addRigidBody(body); - - return dialogWindow; - -} - -GL_SliderControl* GL_DialogDynamicsWorld::createSlider(GL_DialogWindow* dialog, const char* sliderText) -{ - btBox2dShape* boxShape = new btBox2dShape(btVector3(6.f,6.f,0.4f)); - btScalar mass = .1f; - btVector3 localInertia; - boxShape->calculateLocalInertia(mass,localInertia); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,boxShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - btTransform trans; - trans.setIdentity(); - trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2.f+dialog->getDialogWidth()/2.f, dialog->getDialogVertPos()+m_screenHeight/2.f+dialog->getDialogHeight()/2+dialog->getNumControls()*20.f,-0.2f)); - - body->setWorldTransform(trans); - //body->setDamping(0.999,0.99); - - //body->setActivationState(ISLAND_SLEEPING); - body->setLinearFactor(btVector3(1,1,0)); - //body->setAngularFactor(btVector3(0,0,1)); - body->setAngularFactor(btVector3(0,0,0)); - - m_dynamicsWorld->addRigidBody(body); - body->setCollisionFlags(body->getFlags()|btCollisionObject::CF_NO_CONTACT_RESPONSE); - - btRigidBody* dialogBody = btRigidBody::upcast(dialog->getCollisionObject()); - btAssert(dialogBody); - - - - btTransform frameInA; - frameInA.setIdentity(); - btVector3 offset(btVector3(-dialog->getDialogWidth()/2.f+16.f,-dialog->getDialogHeight()/2.f+dialog->getNumControls()*20.f+36.f,0.2f)); - frameInA.setOrigin(offset); - - - btTransform frameInB; - frameInB.setIdentity(); - //frameInB.setOrigin(-offset/2); - - btScalar lowerLimit = 80.f; - btScalar upperLimit = 170.f; - -#if 0 - bool useFrameA = false; - - btGeneric6DofConstraint* constraint = new btGeneric6DofConstraint(*dialogBody,*body,frameInA,frameInB,useFrameA); - m_dynamicsWorld->addConstraint(constraint,true); - constraint->setLimit(0,lowerLimit,upperLimit); -#else - btSliderConstraint* sliderConstraint = new btSliderConstraint(*dialogBody,*body,frameInA,frameInB,true);//useFrameA); - sliderConstraint->setLowerLinLimit(lowerLimit); - sliderConstraint->setUpperLinLimit(upperLimit); - m_dynamicsWorld->addConstraint(sliderConstraint,true); - -#endif - - GL_SliderControl* slider = new GL_SliderControl(sliderText, body,dialog,lowerLimit,upperLimit, sliderConstraint); - body->setUserPointer(slider); - dialog->addControl(slider); - return slider; -} - - -GL_ToggleControl* GL_DialogDynamicsWorld::createToggle(GL_DialogWindow* dialog, const char* toggleText) -{ - - - btBox2dShape* boxShape = new btBox2dShape(btVector3(6.f,6.f,0.4f)); - btScalar mass = 0.1f; - btVector3 localInertia; - boxShape->calculateLocalInertia(mass,localInertia); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,boxShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - btTransform trans; - trans.setIdentity(); - trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2.f+dialog->getDialogWidth()/2.f, dialog->getDialogVertPos()+m_screenHeight/2.f+dialog->getDialogHeight()/2+dialog->getNumControls()*20.f,-0.2f)); - - body->setWorldTransform(trans); - body->setDamping(0.999f,0.99f); - - //body->setActivationState(ISLAND_SLEEPING); - body->setLinearFactor(btVector3(1,1,0)); - //body->setAngularFactor(btVector3(0,0,1)); - body->setAngularFactor(btVector3(0,0,0)); - - m_dynamicsWorld->addRigidBody(body); - body->setCollisionFlags(body->getFlags()|btCollisionObject::CF_NO_CONTACT_RESPONSE); - - btRigidBody* dialogBody = btRigidBody::upcast(dialog->getCollisionObject()); - btAssert(dialogBody); - - - - btTransform frameInA; - frameInA.setIdentity(); - btVector3 offset(btVector3(+dialog->getDialogWidth()/2.f-32.f,-dialog->getDialogHeight()/2.f+dialog->getNumControls()*20.f+36.f,0.2f)); - frameInA.setOrigin(offset); - - - btTransform frameInB; - frameInB.setIdentity(); - //frameInB.setOrigin(-offset/2); - bool useFrameA = true; - - btGeneric6DofConstraint* constraint = new btGeneric6DofConstraint(*dialogBody,*body,frameInA,frameInB,useFrameA); - m_dynamicsWorld->addConstraint(constraint,true); - - - GL_ToggleControl* toggle = new GL_ToggleControl(toggleText, body,dialog); - body->setUserPointer(toggle); - dialog->addControl(toggle); - return toggle; -} - -void GL_DialogDynamicsWorld::draw(btScalar timeStep) -{ - if (timeStep) - { - m_dynamicsWorld->stepSimulation(timeStep); - } - - for (int i=0;idraw(timeStep); - } -} - -static btRigidBody* pickedBody = 0;//for deactivation state -static btScalar mousePickClamping = 111130.f; - -//static int gPickingConstraintId = 0; -static btVector3 gOldPickingPos; -static btVector3 gHitPos(-1,-1,-1); - -static btScalar gOldPickingDist = 0.f; - -bool GL_DialogDynamicsWorld::mouseFunc(int button, int state, int x, int y) -{ - if (state == 0) - { - m_mouseButtons |= 1<rayTest(m_cameraPosition,rayTo,rayCallback); - if (rayCallback.hasHit()) - { - - btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - body->setActivationState(ACTIVE_TAG); - btVector3 impulse = rayTo; - impulse.normalize(); - float impulseStrength = 10.f; - impulse *= impulseStrength; - btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); - body->applyImpulse(impulse,relPos); - } - } - } -#endif - - - - } else - { - - } - break; - } - - case 0: - { - if (state==0) - { - - - //add a point to point constraint for picking - if (m_dynamicsWorld) - { - - btVector3 rayFrom; - if (1)//m_ortho) - { - rayFrom = rayTo; - rayFrom.setZ(-100.f); - } - //else - //{ - // rayFrom = m_cameraPosition; - //} - - btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); - m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); - if (rayCallback.hasHit()) - { - - - btScalar maxPickingClamp = mousePickClamping; - - btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - bool doPick = true; - if (body->getUserPointer()) - { - ///deal with controls in a special way - GL_DialogControl* ctrl = (GL_DialogControl*)body->getUserPointer(); - - switch(ctrl->getType()) - { - case GL_TOGGLE_CONTROL: - { - GL_ToggleControl* toggle = (GL_ToggleControl*) ctrl; - toggle->m_active = !toggle->m_active; - doPick = false; - break; - } - case GL_SLIDER_CONTROL: - { - GL_SliderControl* slider = (GL_SliderControl*) ctrl; - btTypedConstraint* constraint = slider->getConstraint(); - if (constraint->getConstraintType() == SLIDER_CONSTRAINT_TYPE) - { - btSliderConstraint* sliderConstraint = (btSliderConstraint*) constraint; - sliderConstraint->setLowerLinLimit(slider->getLowerLimit()); - sliderConstraint->setUpperLinLimit(slider->getUpperLimit()); - } - maxPickingClamp = 100; - } - default: - { - } - }; - - }; - - if (doPick) - { - //other exclusions? - if (!(body->isStaticObject() || body->isKinematicObject())) - { - pickedBody = body; - pickedBody->setActivationState(DISABLE_DEACTIVATION); - - - - btVector3 pickPos = rayCallback.m_hitPointWorld; - //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); - - - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); - p2p->m_setting.m_impulseClamp = maxPickingClamp; - - m_dynamicsWorld->addConstraint(p2p); - m_pickConstraint = p2p; - - //save mouse position for dragging - gOldPickingPos = rayTo; - gHitPos = pickPos; - - gOldPickingDist = (pickPos-rayFrom).length(); - - //very weak constraint for picking - p2p->m_setting.m_tau = 0.1f; - } - } - return true; - } - } - } - - } else - { - - if (m_pickConstraint && m_dynamicsWorld) - { - m_dynamicsWorld->removeConstraint(m_pickConstraint); - delete m_pickConstraint; - //printf("removed constraint %i",gPickingConstraintId); - m_pickConstraint = 0; - pickedBody->forceActivationState(ACTIVE_TAG); - pickedBody->setDeactivationTime( 0.f ); - - - if (pickedBody->getUserPointer()) - { - ///deal with controls in a special way - GL_DialogControl* ctrl = (GL_DialogControl*)pickedBody->getUserPointer(); - if (ctrl->getType()==GL_SLIDER_CONTROL) - { - GL_SliderControl* sliderControl = (GL_SliderControl*) ctrl; - - btSliderConstraint* slider = 0; - btTypedConstraint* constraint = sliderControl->getConstraint(); - if (constraint->getConstraintType() == SLIDER_CONSTRAINT_TYPE) - { - slider = (btSliderConstraint*)constraint; - } - if (slider) - { - btScalar linDepth = slider->getLinearPos(); - btScalar lowLim = slider->getLowerLinLimit(); - btScalar hiLim = slider->getUpperLinLimit(); - slider->setPoweredLinMotor(false); - if(linDepth <= lowLim) - { - slider->setLowerLinLimit(lowLim); - slider->setUpperLinLimit(lowLim); - } - else if(linDepth > hiLim) - { - slider->setLowerLinLimit(hiLim); - slider->setUpperLinLimit(hiLim); - } - else - { - slider->setLowerLinLimit(linDepth); - slider->setUpperLinLimit(linDepth); - } - } - } - - } - - pickedBody = 0; - - } - - - - } - - break; - - } - - default: - { - } - } - - return false; - -} - - - -btVector3 GL_DialogDynamicsWorld::getRayTo(int x,int y) -{ - float cameraDistance = m_screenHeight/2.f;//m_screenWidth/2;//1.f; - btVector3 cameraTargetPosition(0,0,0); - btVector3 cameraUp(0,-1,0); - - if (1)//_ortho) - { - - btScalar aspect; - btVector3 extents; - if (m_screenWidth> m_screenHeight) - { - - aspect = m_screenWidth / (btScalar)m_screenHeight; - extents.setValue(aspect * 1.0f, 1.0f,0); - } else - { - cameraDistance = m_screenWidth/2.f; - aspect = m_screenHeight / (btScalar)m_screenWidth; - extents.setValue(1.0f, aspect*1.f,0); - } - - - - extents *= cameraDistance; - btVector3 lower = cameraTargetPosition - extents; - btVector3 upper = cameraTargetPosition + extents; - - btScalar u = x / btScalar(m_screenWidth); - btScalar v = (m_screenHeight - y) / btScalar(m_screenHeight); - - btVector3 p(0,0,0); - p.setValue( - (1.0f - u) * lower.getX() + u * upper.getX(), - -((1.0f - v) * lower.getY() + v * upper.getY()), - cameraTargetPosition.getZ()); - return p; - } - - float top = 1.f; - float bottom = -1.f; - float nearPlane = 1.f; - float tanFov = (top-bottom)*0.5f / nearPlane; - float fov = 2 * atanf (tanFov); - - btVector3 cameraPosition(0,0,-100); - btVector3 rayFrom = cameraPosition; - btVector3 rayForward = (cameraTargetPosition-cameraPosition); - rayForward.normalize(); - float farPlane = 10000.f; - rayForward*= farPlane; - - btVector3 rightOffset; - btVector3 vertical = cameraUp; - - btVector3 hor; - hor = rayForward.cross(vertical); - hor.normalize(); - vertical = hor.cross(rayForward); - vertical.normalize(); - - float tanfov = tanf(0.5f*fov); - - - hor *= 2.f * farPlane * tanfov; - vertical *= 2.f * farPlane * tanfov; - - btScalar aspect; - - if (m_screenWidth > m_screenHeight) - { - aspect = m_screenWidth / (btScalar)m_screenHeight; - - hor*=aspect; - } else - { - aspect = m_screenHeight / (btScalar)m_screenWidth; - vertical*=aspect; - } - - - btVector3 rayToCenter = rayFrom + rayForward; - btVector3 dHor = hor * 1.f/float(m_screenWidth); - btVector3 dVert = vertical * 1.f/float(m_screenHeight); - - - btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; - rayTo += btScalar(x) * dHor; - rayTo -= btScalar(y) * dVert; - //rayTo += y * dVert; - - return rayTo; -} - - - -void GL_DialogDynamicsWorld::mouseMotionFunc(int x,int y) -{ - - if (m_pickConstraint) - { - //move the constraint pivot - btPoint2PointConstraint* p2p = static_cast(m_pickConstraint); - if (p2p) - { - //keep it at the same picking distance - - btVector3 newRayTo = getRayTo(x,y); - btVector3 rayFrom; - btVector3 oldPivotInB = p2p->getPivotInB(); - btVector3 newPivotB; - if (1)//_ortho) - { - newPivotB = oldPivotInB; - newPivotB.setX(newRayTo.getX()); - newPivotB.setY(newRayTo.getY()); - } else - { - //rayFrom = m_cameraPosition; - // btVector3 dir = newRayTo-rayFrom; - // dir.normalize(); - // dir *= gOldPickingDist; - - // newPivotB = rayFrom + dir; - } - - - - p2p->setPivotB(newPivotB); - } - - } - - btScalar dx, dy; - dx = btScalar(x) - m_mouseOldX; - dy = btScalar(y) - m_mouseOldY; - - - - - m_mouseOldX = x; - m_mouseOldY = y; -// updateCamera(); - - -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "GL_DialogDynamicsWorld.h" +#include "GL_DialogWindow.h" +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h" +#include "BulletCollision/CollisionShapes/btBox2dShape.h" +#include "BulletCollision/CollisionShapes/btConvex2dShape.h" +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" + +GL_DialogDynamicsWorld::GL_DialogDynamicsWorld() +{ + m_upperBorder = 0; + m_lowerBorder =0; + + m_pickConstraint = 0; + m_screenWidth = 0; + m_screenHeight = 0; + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_broadphase = new btDbvtBroadphase(); + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_constraintSolver,m_collisionConfiguration); + m_dynamicsWorld ->getSolverInfo().m_splitImpulse = true; + //m_dynamicsWorld->setGravity(btVector3(0,10,0)); + m_dynamicsWorld->setGravity(btVector3(0,0,0)); + + m_simplexSolver = new btVoronoiSimplexSolver(); + m_pdSolver = new btMinkowskiPenetrationDepthSolver(); + + btConvex2dConvex2dAlgorithm::CreateFunc* convexAlgo2d = new btConvex2dConvex2dAlgorithm::CreateFunc(m_simplexSolver,m_pdSolver); + + m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); + m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,CONVEX_2D_SHAPE_PROXYTYPE,convexAlgo2d); + m_dispatcher->registerCollisionCreateFunc(CONVEX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,convexAlgo2d); + m_dispatcher->registerCollisionCreateFunc(BOX_2D_SHAPE_PROXYTYPE,BOX_2D_SHAPE_PROXYTYPE,new btBox2dBox2dCollisionAlgorithm::CreateFunc()); + + ///enable boarders, to avoid 'loosing' menus +#if 1 + btTransform tr; + tr.setIdentity(); + + { + btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(0,1,0),0); + m_upperBorder = new btCollisionObject(); + tr.setOrigin(btVector3(0,-BT_LARGE_FLOAT,0)); + m_upperBorder->setWorldTransform(tr); + m_upperBorder->setCollisionShape(plane); + m_dynamicsWorld->addCollisionObject(m_upperBorder); + } + + { + btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(0,-1,0),0); + m_lowerBorder = new btCollisionObject(); + + tr.setIdentity(); + tr.setOrigin(btVector3(0,BT_LARGE_FLOAT,0)); + m_lowerBorder->setWorldTransform(tr); + m_lowerBorder->setCollisionShape(plane); + m_dynamicsWorld->addCollisionObject(m_lowerBorder); + } + { + btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(1,0,0),0); + m_leftBorder = new btCollisionObject(); + tr.setIdentity(); + tr.setOrigin(btVector3(-BT_LARGE_FLOAT,0,0)); + m_leftBorder->setWorldTransform(tr); + m_leftBorder->setCollisionShape(plane); + m_dynamicsWorld->addCollisionObject(m_leftBorder); + } + { + btStaticPlaneShape* plane = new btStaticPlaneShape(btVector3(-1,0,0),0); + m_rightBorder = new btCollisionObject(); + tr.setIdentity(); + tr.setOrigin(btVector3(BT_LARGE_FLOAT,0,0)); + m_rightBorder->setWorldTransform(tr); + m_rightBorder->setCollisionShape(plane); + m_dynamicsWorld->addCollisionObject(m_rightBorder); + } +#endif + +} + +GL_DialogDynamicsWorld::~GL_DialogDynamicsWorld() +{ + delete m_dynamicsWorld; + delete m_dispatcher; + delete m_constraintSolver; + delete m_broadphase; + delete m_collisionConfiguration; +} + +void GL_DialogDynamicsWorld::setScreenSize(int width, int height) +{ + + + int i; + + for ( i=0;igetCollisionObjectArray().size();i++) + { + btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) + { + m_dynamicsWorld->removeRigidBody(body); + btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(btScalar(m_screenWidth/2.),btScalar(m_screenHeight/2),btScalar(0))-btVector3(btScalar(width/2.),btScalar(height/2.),btScalar(0)); + colObj->getWorldTransform().setOrigin(newPos); + m_dynamicsWorld->addRigidBody(body); + } else + { + m_dynamicsWorld->removeCollisionObject(colObj); + btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(btScalar(m_screenWidth/2.),btScalar(m_screenHeight/2.),btScalar(0))-btVector3(btScalar(width/2.),btScalar(height/2.),btScalar(0)); + colObj->getWorldTransform().setOrigin(newPos); + m_dynamicsWorld->addCollisionObject(colObj); + } + } + + for ( i=0;isetScreenSize(width,height); + } + if (width && height) + { + if (m_upperBorder) + { + m_dynamicsWorld->removeCollisionObject(m_upperBorder); + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(0),btScalar(-height/2.),btScalar(0.))); + m_upperBorder->setWorldTransform(tr); + m_dynamicsWorld->addCollisionObject(m_upperBorder); + } + + if (m_lowerBorder) + { + m_dynamicsWorld->removeCollisionObject(m_lowerBorder); + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(0),btScalar(height/2.),btScalar(0))); + m_lowerBorder->setWorldTransform(tr); + m_dynamicsWorld->addCollisionObject(m_lowerBorder); + } + if (m_leftBorder) + { + m_dynamicsWorld->removeCollisionObject(m_leftBorder); + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(-width/2.),btScalar(0),btScalar(0))); + m_leftBorder->setWorldTransform(tr); + m_dynamicsWorld->addCollisionObject(m_leftBorder); + } + if (m_rightBorder) + { + m_dynamicsWorld->removeCollisionObject(m_rightBorder); + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(width/2.),btScalar(0),btScalar(0))); + m_rightBorder->setWorldTransform(tr); + m_dynamicsWorld->addCollisionObject(m_rightBorder); + + } + + } + + + m_screenWidth = width; + m_screenHeight = height; +} + +GL_DialogWindow* GL_DialogDynamicsWorld::createDialog(int horPos,int vertPos,int dialogWidth,int dialogHeight, const char* dialogTitle ) +{ + btBox2dShape* boxShape = new btBox2dShape(btVector3(dialogWidth/2.f,dialogHeight/2.f,0.4f)); + btScalar mass = 100.f; + btVector3 localInertia; + boxShape->calculateLocalInertia(mass,localInertia); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,boxShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + btTransform trans; + trans.setIdentity(); + trans.setOrigin(btVector3(btScalar(horPos-m_screenWidth/2+dialogWidth/2), btScalar(vertPos+m_screenHeight/2.+dialogHeight/2),btScalar(0.))); + + + + body->setWorldTransform(trans); + body->setDamping(0.999f,0.99f); + + //body->setActivationState(ISLAND_SLEEPING); + body->setLinearFactor(btVector3(1,1,0)); + //body->setAngularFactor(btVector3(0,0,1)); + body->setAngularFactor(btVector3(0,0,0)); + + GL_DialogWindow* dialogWindow = new GL_DialogWindow(horPos,vertPos,dialogWidth,dialogHeight,body,dialogTitle); + m_dialogs.push_back(dialogWindow); + m_dynamicsWorld->addRigidBody(body); + + return dialogWindow; + +} + +GL_SliderControl* GL_DialogDynamicsWorld::createSlider(GL_DialogWindow* dialog, const char* sliderText) +{ + btBox2dShape* boxShape = new btBox2dShape(btVector3(6.f,6.f,0.4f)); + btScalar mass = .1f; + btVector3 localInertia; + boxShape->calculateLocalInertia(mass,localInertia); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,boxShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + btTransform trans; + trans.setIdentity(); + trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2.f+dialog->getDialogWidth()/2.f, dialog->getDialogVertPos()+m_screenHeight/2.f+dialog->getDialogHeight()/2+dialog->getNumControls()*20.f,-0.2f)); + + body->setWorldTransform(trans); + //body->setDamping(0.999,0.99); + + //body->setActivationState(ISLAND_SLEEPING); + body->setLinearFactor(btVector3(1,1,0)); + //body->setAngularFactor(btVector3(0,0,1)); + body->setAngularFactor(btVector3(0,0,0)); + + m_dynamicsWorld->addRigidBody(body); + body->setCollisionFlags(body->getFlags()|btCollisionObject::CF_NO_CONTACT_RESPONSE); + + btRigidBody* dialogBody = btRigidBody::upcast(dialog->getCollisionObject()); + btAssert(dialogBody); + + + + btTransform frameInA; + frameInA.setIdentity(); + btVector3 offset(btVector3(-dialog->getDialogWidth()/2.f+16.f,-dialog->getDialogHeight()/2.f+dialog->getNumControls()*20.f+36.f,0.2f)); + frameInA.setOrigin(offset); + + + btTransform frameInB; + frameInB.setIdentity(); + //frameInB.setOrigin(-offset/2); + + btScalar lowerLimit = 80.f; + btScalar upperLimit = 170.f; + +#if 0 + bool useFrameA = false; + + btGeneric6DofConstraint* constraint = new btGeneric6DofConstraint(*dialogBody,*body,frameInA,frameInB,useFrameA); + m_dynamicsWorld->addConstraint(constraint,true); + constraint->setLimit(0,lowerLimit,upperLimit); +#else + btSliderConstraint* sliderConstraint = new btSliderConstraint(*dialogBody,*body,frameInA,frameInB,true);//useFrameA); + sliderConstraint->setLowerLinLimit(lowerLimit); + sliderConstraint->setUpperLinLimit(upperLimit); + m_dynamicsWorld->addConstraint(sliderConstraint,true); + +#endif + + GL_SliderControl* slider = new GL_SliderControl(sliderText, body,dialog,lowerLimit,upperLimit, sliderConstraint); + body->setUserPointer(slider); + dialog->addControl(slider); + return slider; +} + + +GL_ToggleControl* GL_DialogDynamicsWorld::createToggle(GL_DialogWindow* dialog, const char* toggleText) +{ + + + btBox2dShape* boxShape = new btBox2dShape(btVector3(6.f,6.f,0.4f)); + btScalar mass = 0.1f; + btVector3 localInertia; + boxShape->calculateLocalInertia(mass,localInertia); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,0,boxShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + btTransform trans; + trans.setIdentity(); + trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2.f+dialog->getDialogWidth()/2.f, dialog->getDialogVertPos()+m_screenHeight/2.f+dialog->getDialogHeight()/2+dialog->getNumControls()*20.f,-0.2f)); + + body->setWorldTransform(trans); + body->setDamping(0.999f,0.99f); + + //body->setActivationState(ISLAND_SLEEPING); + body->setLinearFactor(btVector3(1,1,0)); + //body->setAngularFactor(btVector3(0,0,1)); + body->setAngularFactor(btVector3(0,0,0)); + + m_dynamicsWorld->addRigidBody(body); + body->setCollisionFlags(body->getFlags()|btCollisionObject::CF_NO_CONTACT_RESPONSE); + + btRigidBody* dialogBody = btRigidBody::upcast(dialog->getCollisionObject()); + btAssert(dialogBody); + + + + btTransform frameInA; + frameInA.setIdentity(); + btVector3 offset(btVector3(+dialog->getDialogWidth()/2.f-32.f,-dialog->getDialogHeight()/2.f+dialog->getNumControls()*20.f+36.f,0.2f)); + frameInA.setOrigin(offset); + + + btTransform frameInB; + frameInB.setIdentity(); + //frameInB.setOrigin(-offset/2); + bool useFrameA = true; + + btGeneric6DofConstraint* constraint = new btGeneric6DofConstraint(*dialogBody,*body,frameInA,frameInB,useFrameA); + m_dynamicsWorld->addConstraint(constraint,true); + + + GL_ToggleControl* toggle = new GL_ToggleControl(toggleText, body,dialog); + body->setUserPointer(toggle); + dialog->addControl(toggle); + return toggle; +} + +void GL_DialogDynamicsWorld::draw(btScalar timeStep) +{ + if (timeStep) + { + m_dynamicsWorld->stepSimulation(timeStep); + } + + for (int i=0;idraw(timeStep); + } +} + +static btRigidBody* pickedBody = 0;//for deactivation state +static btScalar mousePickClamping = 111130.f; + +//static int gPickingConstraintId = 0; +static btVector3 gOldPickingPos; +static btVector3 gHitPos(-1,-1,-1); + +static btScalar gOldPickingDist = 0.f; + +bool GL_DialogDynamicsWorld::mouseFunc(int button, int state, int x, int y) +{ + if (state == 0) + { + m_mouseButtons |= 1<rayTest(m_cameraPosition,rayTo,rayCallback); + if (rayCallback.hasHit()) + { + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + body->setActivationState(ACTIVE_TAG); + btVector3 impulse = rayTo; + impulse.normalize(); + float impulseStrength = 10.f; + impulse *= impulseStrength; + btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); + body->applyImpulse(impulse,relPos); + } + } + } +#endif + + + + } else + { + + } + break; + } + + case 0: + { + if (state==0) + { + + + //add a point to point constraint for picking + if (m_dynamicsWorld) + { + + btVector3 rayFrom; + if (1)//m_ortho) + { + rayFrom = rayTo; + rayFrom.setZ(-100.f); + } + //else + //{ + // rayFrom = m_cameraPosition; + //} + + btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); + m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); + if (rayCallback.hasHit()) + { + + + btScalar maxPickingClamp = mousePickClamping; + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + bool doPick = true; + if (body->getUserPointer()) + { + ///deal with controls in a special way + GL_DialogControl* ctrl = (GL_DialogControl*)body->getUserPointer(); + + switch(ctrl->getType()) + { + case GL_TOGGLE_CONTROL: + { + GL_ToggleControl* toggle = (GL_ToggleControl*) ctrl; + toggle->m_active = !toggle->m_active; + doPick = false; + break; + } + case GL_SLIDER_CONTROL: + { + GL_SliderControl* slider = (GL_SliderControl*) ctrl; + btTypedConstraint* constraint = slider->getConstraint(); + if (constraint->getConstraintType() == SLIDER_CONSTRAINT_TYPE) + { + btSliderConstraint* sliderConstraint = (btSliderConstraint*) constraint; + sliderConstraint->setLowerLinLimit(slider->getLowerLimit()); + sliderConstraint->setUpperLinLimit(slider->getUpperLimit()); + } + maxPickingClamp = 100; + } + default: + { + } + }; + + }; + + if (doPick) + { + //other exclusions? + if (!(body->isStaticObject() || body->isKinematicObject())) + { + pickedBody = body; + pickedBody->setActivationState(DISABLE_DEACTIVATION); + + + + btVector3 pickPos = rayCallback.m_hitPointWorld; + //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); + + + btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; + + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); + p2p->m_setting.m_impulseClamp = maxPickingClamp; + + m_dynamicsWorld->addConstraint(p2p); + m_pickConstraint = p2p; + + //save mouse position for dragging + gOldPickingPos = rayTo; + gHitPos = pickPos; + + gOldPickingDist = (pickPos-rayFrom).length(); + + //very weak constraint for picking + p2p->m_setting.m_tau = 0.1f; + } + } + return true; + } + } + } + + } else + { + + if (m_pickConstraint && m_dynamicsWorld) + { + m_dynamicsWorld->removeConstraint(m_pickConstraint); + delete m_pickConstraint; + //printf("removed constraint %i",gPickingConstraintId); + m_pickConstraint = 0; + pickedBody->forceActivationState(ACTIVE_TAG); + pickedBody->setDeactivationTime( 0.f ); + + + if (pickedBody->getUserPointer()) + { + ///deal with controls in a special way + GL_DialogControl* ctrl = (GL_DialogControl*)pickedBody->getUserPointer(); + if (ctrl->getType()==GL_SLIDER_CONTROL) + { + GL_SliderControl* sliderControl = (GL_SliderControl*) ctrl; + + btSliderConstraint* slider = 0; + btTypedConstraint* constraint = sliderControl->getConstraint(); + if (constraint->getConstraintType() == SLIDER_CONSTRAINT_TYPE) + { + slider = (btSliderConstraint*)constraint; + } + if (slider) + { + btScalar linDepth = slider->getLinearPos(); + btScalar lowLim = slider->getLowerLinLimit(); + btScalar hiLim = slider->getUpperLinLimit(); + slider->setPoweredLinMotor(false); + if(linDepth <= lowLim) + { + slider->setLowerLinLimit(lowLim); + slider->setUpperLinLimit(lowLim); + } + else if(linDepth > hiLim) + { + slider->setLowerLinLimit(hiLim); + slider->setUpperLinLimit(hiLim); + } + else + { + slider->setLowerLinLimit(linDepth); + slider->setUpperLinLimit(linDepth); + } + } + } + + } + + pickedBody = 0; + + } + + + + } + + break; + + } + + default: + { + } + } + + return false; + +} + + + +btVector3 GL_DialogDynamicsWorld::getRayTo(int x,int y) +{ + float cameraDistance = m_screenHeight/2.f;//m_screenWidth/2;//1.f; + btVector3 cameraTargetPosition(0,0,0); + btVector3 cameraUp(0,-1,0); + + if (1)//_ortho) + { + + btScalar aspect; + btVector3 extents; + if (m_screenWidth> m_screenHeight) + { + + aspect = m_screenWidth / (btScalar)m_screenHeight; + extents.setValue(aspect * 1.0f, 1.0f,0); + } else + { + cameraDistance = m_screenWidth/2.f; + aspect = m_screenHeight / (btScalar)m_screenWidth; + extents.setValue(1.0f, aspect*1.f,0); + } + + + + extents *= cameraDistance; + btVector3 lower = cameraTargetPosition - extents; + btVector3 upper = cameraTargetPosition + extents; + + btScalar u = x / btScalar(m_screenWidth); + btScalar v = (m_screenHeight - y) / btScalar(m_screenHeight); + + btVector3 p(0,0,0); + p.setValue( + (1.0f - u) * lower.getX() + u * upper.getX(), + -((1.0f - v) * lower.getY() + v * upper.getY()), + cameraTargetPosition.getZ()); + return p; + } + + float top = 1.f; + float bottom = -1.f; + float nearPlane = 1.f; + float tanFov = (top-bottom)*0.5f / nearPlane; + float fov = 2 * atanf (tanFov); + + btVector3 cameraPosition(0,0,-100); + btVector3 rayFrom = cameraPosition; + btVector3 rayForward = (cameraTargetPosition-cameraPosition); + rayForward.normalize(); + float farPlane = 10000.f; + rayForward*= farPlane; + + btVector3 rightOffset; + btVector3 vertical = cameraUp; + + btVector3 hor; + hor = rayForward.cross(vertical); + hor.normalize(); + vertical = hor.cross(rayForward); + vertical.normalize(); + + float tanfov = tanf(0.5f*fov); + + + hor *= 2.f * farPlane * tanfov; + vertical *= 2.f * farPlane * tanfov; + + btScalar aspect; + + if (m_screenWidth > m_screenHeight) + { + aspect = m_screenWidth / (btScalar)m_screenHeight; + + hor*=aspect; + } else + { + aspect = m_screenHeight / (btScalar)m_screenWidth; + vertical*=aspect; + } + + + btVector3 rayToCenter = rayFrom + rayForward; + btVector3 dHor = hor * 1.f/float(m_screenWidth); + btVector3 dVert = vertical * 1.f/float(m_screenHeight); + + + btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; + rayTo += btScalar(x) * dHor; + rayTo -= btScalar(y) * dVert; + //rayTo += y * dVert; + + return rayTo; +} + + + +void GL_DialogDynamicsWorld::mouseMotionFunc(int x,int y) +{ + + if (m_pickConstraint) + { + //move the constraint pivot + btPoint2PointConstraint* p2p = static_cast(m_pickConstraint); + if (p2p) + { + //keep it at the same picking distance + + btVector3 newRayTo = getRayTo(x,y); + btVector3 rayFrom; + btVector3 oldPivotInB = p2p->getPivotInB(); + btVector3 newPivotB; + if (1)//_ortho) + { + newPivotB = oldPivotInB; + newPivotB.setX(newRayTo.getX()); + newPivotB.setY(newRayTo.getY()); + } else + { + //rayFrom = m_cameraPosition; + // btVector3 dir = newRayTo-rayFrom; + // dir.normalize(); + // dir *= gOldPickingDist; + + // newPivotB = rayFrom + dir; + } + + + + p2p->setPivotB(newPivotB); + } + + } + + btScalar dx, dy; + dx = btScalar(x) - m_mouseOldX; + dy = btScalar(y) - m_mouseOldY; + + + + + m_mouseOldX = x; + m_mouseOldY = y; +// updateCamera(); + + +} diff --git a/Demos/OpenGL/GL_DialogDynamicsWorld.h b/Demos/OpenGL/GL_DialogDynamicsWorld.h index 0babec618..24854de3f 100644 --- a/Demos/OpenGL/GL_DialogDynamicsWorld.h +++ b/Demos/OpenGL/GL_DialogDynamicsWorld.h @@ -1,91 +1,91 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 GL_DIALOG_DYNAMICS_WORLD_H -#define GL_DIALOG_DYNAMICS_WORLD_H - -class btDiscreteDynamicsWorld; -class GL_DialogWindow; -class btDefaultCollisionConfiguration; -struct btDbvtBroadphase; -class btSequentialImpulseConstraintSolver; -class btCollisionDispatcher; -class btVoronoiSimplexSolver; -class btMinkowskiPenetrationDepthSolver; -class btCollisionObject; -class btTypedConstraint; -struct GL_ToggleControl; -struct GL_SliderControl; - - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btVector3.h" - -class GL_DialogDynamicsWorld -{ - - btDefaultCollisionConfiguration* m_collisionConfiguration; - btDbvtBroadphase* m_broadphase; - btSequentialImpulseConstraintSolver* m_constraintSolver; - btCollisionDispatcher* m_dispatcher; - btVoronoiSimplexSolver* m_simplexSolver; - btMinkowskiPenetrationDepthSolver* m_pdSolver; - - btDiscreteDynamicsWorld* m_dynamicsWorld; - - btCollisionObject* m_lowerBorder; - btCollisionObject* m_upperBorder; - btCollisionObject* m_leftBorder; - btCollisionObject* m_rightBorder; - - btAlignedObjectArray m_dialogs; - - int m_screenWidth; - int m_screenHeight; - - - ///for picking - int m_mouseOldX; - int m_mouseOldY; - int m_mouseButtons; - ///constraint for mouse picking - btTypedConstraint* m_pickConstraint; - - btVector3 getRayTo(int x,int y); - -public: - - GL_DialogDynamicsWorld(); - - virtual ~GL_DialogDynamicsWorld(); - - virtual void setScreenSize(int width, int height); - - virtual GL_DialogWindow* createDialog(int horPos,int vertPos,int dialogWidth,int dialogHeight, const char* dialogTitle ); - - GL_ToggleControl* createToggle(GL_DialogWindow* dialog, const char* toggleText); - - GL_SliderControl* createSlider(GL_DialogWindow* dialog, const char* sliderText); - - virtual void draw(btScalar timeStep); - - virtual bool mouseFunc(int button, int state, int x, int y); - - virtual void mouseMotionFunc(int x,int y); - -}; - -#endif //GL_DIALOG_DYNAMICS_WORLD_H +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 GL_DIALOG_DYNAMICS_WORLD_H +#define GL_DIALOG_DYNAMICS_WORLD_H + +class btDiscreteDynamicsWorld; +class GL_DialogWindow; +class btDefaultCollisionConfiguration; +struct btDbvtBroadphase; +class btSequentialImpulseConstraintSolver; +class btCollisionDispatcher; +class btVoronoiSimplexSolver; +class btMinkowskiPenetrationDepthSolver; +class btCollisionObject; +class btTypedConstraint; +struct GL_ToggleControl; +struct GL_SliderControl; + + +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btVector3.h" + +class GL_DialogDynamicsWorld +{ + + btDefaultCollisionConfiguration* m_collisionConfiguration; + btDbvtBroadphase* m_broadphase; + btSequentialImpulseConstraintSolver* m_constraintSolver; + btCollisionDispatcher* m_dispatcher; + btVoronoiSimplexSolver* m_simplexSolver; + btMinkowskiPenetrationDepthSolver* m_pdSolver; + + btDiscreteDynamicsWorld* m_dynamicsWorld; + + btCollisionObject* m_lowerBorder; + btCollisionObject* m_upperBorder; + btCollisionObject* m_leftBorder; + btCollisionObject* m_rightBorder; + + btAlignedObjectArray m_dialogs; + + int m_screenWidth; + int m_screenHeight; + + + ///for picking + int m_mouseOldX; + int m_mouseOldY; + int m_mouseButtons; + ///constraint for mouse picking + btTypedConstraint* m_pickConstraint; + + btVector3 getRayTo(int x,int y); + +public: + + GL_DialogDynamicsWorld(); + + virtual ~GL_DialogDynamicsWorld(); + + virtual void setScreenSize(int width, int height); + + virtual GL_DialogWindow* createDialog(int horPos,int vertPos,int dialogWidth,int dialogHeight, const char* dialogTitle ); + + GL_ToggleControl* createToggle(GL_DialogWindow* dialog, const char* toggleText); + + GL_SliderControl* createSlider(GL_DialogWindow* dialog, const char* sliderText); + + virtual void draw(btScalar timeStep); + + virtual bool mouseFunc(int button, int state, int x, int y); + + virtual void mouseMotionFunc(int x,int y); + +}; + +#endif //GL_DIALOG_DYNAMICS_WORLD_H diff --git a/Demos/OpenGL/GL_DialogWindow.cpp b/Demos/OpenGL/GL_DialogWindow.cpp index 8f00715b1..70477d5a7 100644 --- a/Demos/OpenGL/GL_DialogWindow.cpp +++ b/Demos/OpenGL/GL_DialogWindow.cpp @@ -1,336 +1,336 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "GL_DialogWindow.h" - - - -#include "GLDebugFont.h" -#include "btBulletDynamicsCommon.h" - -#define USE_ARRAYS 1 - - -GL_DialogWindow::GL_DialogWindow(int horPos,int vertPos,int dialogWidth,int dialogHeight, btCollisionObject* collisionObject,const char* dialogTitle) -:m_dialogHorPos(horPos), -m_dialogVertPos(vertPos), -m_dialogWidth(dialogWidth), -m_dialogHeight(dialogHeight), -m_screenWidth(0), -m_screenHeight(0), -m_dialogTitle(dialogTitle), -m_MaxClipPlanes(-1), -m_collisionObject(collisionObject) - -{ -} - -void GL_DialogWindow::setScreenSize(int width, int height) -{ - m_screenWidth = width; - m_screenHeight = height; -} -GL_DialogWindow::~GL_DialogWindow() -{ - -} - - - -static void drawLine(int _X0, int _Y0, int _X1, int _Y1, unsigned int _Color0, unsigned int _Color1) -{ - const GLfloat dx = +0.5f; - const GLfloat dy = -0.5f; - - GLfloat vVertices[] = {(GLfloat)_X0+dx,(GLfloat)_Y0+dy,(GLfloat)_X1+dx,(GLfloat)_Y1+dy}; - - bool antiAliased = false; - if( antiAliased ) - glEnable(GL_LINE_SMOOTH); - else - glDisable(GL_LINE_SMOOTH); - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - -#ifdef USE_ARRAYS - glColor4ub(GLubyte(_Color0>>16), GLubyte(_Color0>>8), GLubyte(_Color0), GLubyte(_Color0>>24)); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glLineWidth(2.0f); - glVertexPointer(2, GL_FLOAT, 0, vVertices); - glEnableClientState(GL_VERTEX_ARRAY); - glDrawArrays(GL_LINES,0,2); -#else - glLineWidth(13.0f); - glBegin(GL_LINES); - glColor4ub(GLubyte(_Color0>>16), GLubyte(_Color0>>8), GLubyte(_Color0), GLubyte(_Color0>>24)); - glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y0+dy); - glColor4ub(GLubyte(_Color1>>16), GLubyte(_Color1>>8), GLubyte(_Color1), GLubyte(_Color1>>24)); - glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y1+dy); - glEnd(); -#endif - glDisable(GL_LINE_SMOOTH); -} - -static void drawRect(int horStart, int vertStart, int horEnd, int vertEnd, unsigned int argbColor00,unsigned int argbColor10,unsigned int argbColor01,unsigned int argbColor11) -{ - float dx = 0; - float dy = 0; - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -#ifdef USE_ARRAYS - GLfloat verts[] ={ - 0.0f, 1.0f, 0.0f, - -1.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - 0.f,0.f,0.f - }; - - glColor4ub(GLubyte(argbColor00>>16), GLubyte(argbColor00>>8), GLubyte(argbColor00), GLubyte(argbColor00>>24)); - verts[0] = (GLfloat)horStart+dx; verts[1] = (GLfloat)vertStart+dy; - verts[2] = (GLfloat)horEnd+dx; verts[3] = (GLfloat)vertStart+dy; - verts[4] = (GLfloat)horEnd+dx; verts[5] = (GLfloat)vertEnd+dy; - verts[6] = (GLfloat)horStart+dx; verts[7] = (GLfloat)vertEnd+dy; - - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState (GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(2, GL_FLOAT, 0, verts); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - -#else - glBegin(GL_QUADS); - glColor4ub(GLubyte(argbColor00>>16), GLubyte(argbColor00>>8), GLubyte(argbColor00), GLubyte(argbColor00>>24)); - glVertex2f((GLfloat)horStart+dx, (GLfloat)vertStart+dy); - glColor4ub(GLubyte(argbColor10>>16), GLubyte(argbColor10>>8), GLubyte(argbColor10), GLubyte(argbColor10>>24)); - glVertex2f((GLfloat)horEnd+dx, (GLfloat)vertStart+dy); - glColor4ub(GLubyte(argbColor11>>16), GLubyte(argbColor11>>8), GLubyte(argbColor11), GLubyte(argbColor11>>24)); - glVertex2f((GLfloat)horEnd+dx, (GLfloat)vertEnd+dy); - glColor4ub(GLubyte(argbColor01>>16), GLubyte(argbColor01>>8), GLubyte(argbColor01), GLubyte(argbColor01>>24)); - glVertex2f((GLfloat)horStart+dx, (GLfloat)vertEnd+dy); - glEnd(); -#endif - -} - -void GL_DialogWindow::draw(btScalar deltaTime) -{ - if (!m_screenWidth || !m_screenHeight) - return; - - m_dialogHorPos = int(m_collisionObject->getWorldTransform().getOrigin()[0]+m_screenWidth/2.f-m_dialogWidth/2.f); - - m_dialogVertPos = int(m_collisionObject->getWorldTransform().getOrigin()[1]+m_screenHeight/2.f-m_dialogHeight/2.f); - saveOpenGLState(); - - //drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth,m_dialogVertPos+m_dialogHeight,0xa6000000); - unsigned int argbColor = 0x86000000; - int charHeight = 16; - int charWidth = 10; - - int titleHeight = charHeight + 2; - - drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+titleHeight,argbColor,argbColor,argbColor,argbColor); - //const unsigned int COL0 = 0x50ffffff; - const unsigned int COL0 = 0xffffffff; - const unsigned int COL1 = 0xff1f1f1f; - - drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+1,COL0,COL0,COL1,COL1); - - argbColor = 0x864f4f4f; - drawRect(m_dialogHorPos+1,m_dialogVertPos+titleHeight,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+m_dialogHeight,argbColor,argbColor,argbColor,argbColor); - - - int y = m_dialogVertPos+charHeight+1; - glLineWidth(3); - drawLine(m_dialogHorPos, y, m_dialogHorPos+m_dialogWidth-1, y, 0x80afafaf,0x80afafaf); - - - - unsigned int clight = 0x5FFFFFFF; // bar contour - drawLine(m_dialogHorPos, m_dialogVertPos, m_dialogHorPos, m_dialogVertPos+m_dialogHeight, clight,clight); - drawLine(m_dialogHorPos, m_dialogVertPos, m_dialogHorPos+m_dialogWidth, m_dialogVertPos, clight,clight); - drawLine(m_dialogHorPos+m_dialogWidth, m_dialogVertPos, m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, clight,clight); - drawLine(m_dialogHorPos, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, clight,clight); - int dshad = 3; // bar shadows - - unsigned int cshad = (((0x40000000>>24)/2)<<24) & 0xFF000000; - drawRect(m_dialogHorPos, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+dshad, m_dialogVertPos+m_dialogHeight+dshad, 0, cshad, 0, 0); - drawRect(m_dialogHorPos+dshad+1, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth-1, m_dialogVertPos+m_dialogHeight+dshad, cshad, cshad, 0, 0); - drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+m_dialogHeight+dshad, cshad, 0, 0, 0); - drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+dshad, 0, 0, cshad, 0); - drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos+dshad+1, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+m_dialogHeight-1, cshad, 0, cshad, 0); - - int yInc = 16; - int curHorPos = m_dialogHorPos+5; - int curVertPos = m_dialogVertPos; - curVertPos += yInc; - - GLDebugDrawString(m_dialogHorPos+m_dialogWidth/2-((int(strlen(m_dialogTitle)/2))*charWidth),m_dialogVertPos+yInc ,m_dialogTitle); - curVertPos += 20; - - - for (int i=0;idraw(curHorPos,curVertPos,deltaTime); - } - - restoreOpenGLState(); -} - - -void GL_DialogWindow::saveOpenGLState() -{ -#if 0 - glPushAttrib(GL_ALL_ATTRIB_BITS); - glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); -#endif - - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - GLint Vp[4]; - glGetIntegerv(GL_VIEWPORT, Vp); - - if( m_screenWidth>0 && m_screenHeight>0 ) - { - Vp[0] = 0; - Vp[1] = 0; - Vp[2] = m_screenWidth-1; - Vp[3] = m_screenHeight-1; - glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); - } - glLoadIdentity(); - glOrtho(Vp[0], Vp[0]+Vp[2], Vp[1]+Vp[3], Vp[1], -1, 1); - glGetIntegerv(GL_VIEWPORT, m_ViewportInit); - glGetFloatv(GL_PROJECTION_MATRIX, m_ProjMatrixInit); - - glGetFloatv(GL_LINE_WIDTH, &m_PrevLineWidth); - // glDisable(GL_POLYGON_STIPPLE); - glLineWidth(1); - - glDisable(GL_LINE_SMOOTH); -// glDisable(GL_LINE_STIPPLE); - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &m_PrevTexEnv); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glDisable(GL_TEXTURE_2D); - -} - -void GL_DialogWindow::restoreOpenGLState() -{ - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m_PrevTexEnv); - glLineWidth(m_PrevLineWidth); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glPopClientAttrib(); - glPopAttrib(); - -} - - -void GL_TextControl::draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime) -{ - for (int i=0;igetWorldTransform().getOrigin()[0]+m_parentWindow->getScreenWidth()/2); - int controlVertPos = int(m_toggleBody->getWorldTransform().getOrigin()[1]+m_parentWindow->getScreenHeight()/2); - - int parentHorPos = controlHorPos-8; - int parentVertPos = controlVertPos-8; - - unsigned int grey = 0xff6f6f6f; - - drawRect(parentHorPos, parentVertPos, parentHorPos+16, parentVertPos+16, grey, grey, grey, grey); - - int borderSize = 2; - unsigned int white = 0xffefefef; - drawRect(parentHorPos+borderSize, parentVertPos+borderSize, parentHorPos+16-borderSize, parentVertPos+16-borderSize, white,white,white,white); - - - if (m_active) - { - //unsigned int red = 0xff8f0000; - // unsigned int white = 0xff8f0000; - unsigned int black = 0xff1f1f1f; - borderSize = 4; - drawRect(parentHorPos+borderSize, parentVertPos+borderSize, parentHorPos+16-borderSize, parentVertPos+16-borderSize, black,black,black,black); - } - - btVector3 rgb(1,1,1); - - GLDebugDrawStringInternal(parentHorPos2,parentVertPos+16,m_toggleText,rgb); - parentVertPos2+=20; - -} - - -void GL_SliderControl::draw(int& parentHorPos2,int& parentVertPos2,btScalar deltaTime) -{ - - int controlHorPos = int(m_sliderBody->getWorldTransform().getOrigin()[0]+m_parentWindow->getScreenWidth()/2); - int controlVertPos = int(m_sliderBody->getWorldTransform().getOrigin()[1]+m_parentWindow->getScreenHeight()/2); - - int parentHorPos = controlHorPos-8; - int parentVertPos = controlVertPos-8; - - unsigned int grey = 0xff6f6f6f; - int borderSize = 2; - unsigned int white = 0xffefefef; - drawRect(parentHorPos2+80+borderSize, parentVertPos2+borderSize, parentHorPos2+m_parentWindow->getDialogWidth()-16-borderSize, parentVertPos2+2-borderSize, white,white,white,white); - - drawRect(parentHorPos, parentVertPos, parentHorPos+16, parentVertPos+16, grey, grey, grey, grey); - - - - drawRect(parentHorPos+borderSize, parentVertPos+borderSize, parentHorPos+16-borderSize, parentVertPos+16-borderSize, white,white,white,white); - - - - btVector3 rgb(1,1,1); - - GLDebugDrawStringInternal(parentHorPos2,parentVertPos2+8,m_sliderText,rgb); - parentVertPos2+=20; - -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "GL_DialogWindow.h" + + + +#include "GLDebugFont.h" +#include "btBulletDynamicsCommon.h" + +#define USE_ARRAYS 1 + + +GL_DialogWindow::GL_DialogWindow(int horPos,int vertPos,int dialogWidth,int dialogHeight, btCollisionObject* collisionObject,const char* dialogTitle) +:m_dialogHorPos(horPos), +m_dialogVertPos(vertPos), +m_dialogWidth(dialogWidth), +m_dialogHeight(dialogHeight), +m_screenWidth(0), +m_screenHeight(0), +m_dialogTitle(dialogTitle), +m_MaxClipPlanes(-1), +m_collisionObject(collisionObject) + +{ +} + +void GL_DialogWindow::setScreenSize(int width, int height) +{ + m_screenWidth = width; + m_screenHeight = height; +} +GL_DialogWindow::~GL_DialogWindow() +{ + +} + + + +static void drawLine(int _X0, int _Y0, int _X1, int _Y1, unsigned int _Color0, unsigned int _Color1) +{ + const GLfloat dx = +0.5f; + const GLfloat dy = -0.5f; + + GLfloat vVertices[] = {(GLfloat)_X0+dx,(GLfloat)_Y0+dy,(GLfloat)_X1+dx,(GLfloat)_Y1+dy}; + + bool antiAliased = false; + if( antiAliased ) + glEnable(GL_LINE_SMOOTH); + else + glDisable(GL_LINE_SMOOTH); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + +#ifdef USE_ARRAYS + glColor4ub(GLubyte(_Color0>>16), GLubyte(_Color0>>8), GLubyte(_Color0), GLubyte(_Color0>>24)); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glLineWidth(2.0f); + glVertexPointer(2, GL_FLOAT, 0, vVertices); + glEnableClientState(GL_VERTEX_ARRAY); + glDrawArrays(GL_LINES,0,2); +#else + glLineWidth(13.0f); + glBegin(GL_LINES); + glColor4ub(GLubyte(_Color0>>16), GLubyte(_Color0>>8), GLubyte(_Color0), GLubyte(_Color0>>24)); + glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y0+dy); + glColor4ub(GLubyte(_Color1>>16), GLubyte(_Color1>>8), GLubyte(_Color1), GLubyte(_Color1>>24)); + glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y1+dy); + glEnd(); +#endif + glDisable(GL_LINE_SMOOTH); +} + +static void drawRect(int horStart, int vertStart, int horEnd, int vertEnd, unsigned int argbColor00,unsigned int argbColor10,unsigned int argbColor01,unsigned int argbColor11) +{ + float dx = 0; + float dy = 0; + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +#ifdef USE_ARRAYS + GLfloat verts[] ={ + 0.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 0.0f, + 1.0f, -1.0f, 0.0f, + 0.f,0.f,0.f + }; + + glColor4ub(GLubyte(argbColor00>>16), GLubyte(argbColor00>>8), GLubyte(argbColor00), GLubyte(argbColor00>>24)); + verts[0] = (GLfloat)horStart+dx; verts[1] = (GLfloat)vertStart+dy; + verts[2] = (GLfloat)horEnd+dx; verts[3] = (GLfloat)vertStart+dy; + verts[4] = (GLfloat)horEnd+dx; verts[5] = (GLfloat)vertEnd+dy; + verts[6] = (GLfloat)horStart+dx; verts[7] = (GLfloat)vertEnd+dy; + + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState (GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, verts); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + +#else + glBegin(GL_QUADS); + glColor4ub(GLubyte(argbColor00>>16), GLubyte(argbColor00>>8), GLubyte(argbColor00), GLubyte(argbColor00>>24)); + glVertex2f((GLfloat)horStart+dx, (GLfloat)vertStart+dy); + glColor4ub(GLubyte(argbColor10>>16), GLubyte(argbColor10>>8), GLubyte(argbColor10), GLubyte(argbColor10>>24)); + glVertex2f((GLfloat)horEnd+dx, (GLfloat)vertStart+dy); + glColor4ub(GLubyte(argbColor11>>16), GLubyte(argbColor11>>8), GLubyte(argbColor11), GLubyte(argbColor11>>24)); + glVertex2f((GLfloat)horEnd+dx, (GLfloat)vertEnd+dy); + glColor4ub(GLubyte(argbColor01>>16), GLubyte(argbColor01>>8), GLubyte(argbColor01), GLubyte(argbColor01>>24)); + glVertex2f((GLfloat)horStart+dx, (GLfloat)vertEnd+dy); + glEnd(); +#endif + +} + +void GL_DialogWindow::draw(btScalar deltaTime) +{ + if (!m_screenWidth || !m_screenHeight) + return; + + m_dialogHorPos = int(m_collisionObject->getWorldTransform().getOrigin()[0]+m_screenWidth/2.f-m_dialogWidth/2.f); + + m_dialogVertPos = int(m_collisionObject->getWorldTransform().getOrigin()[1]+m_screenHeight/2.f-m_dialogHeight/2.f); + saveOpenGLState(); + + //drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth,m_dialogVertPos+m_dialogHeight,0xa6000000); + unsigned int argbColor = 0x86000000; + int charHeight = 16; + int charWidth = 10; + + int titleHeight = charHeight + 2; + + drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+titleHeight,argbColor,argbColor,argbColor,argbColor); + //const unsigned int COL0 = 0x50ffffff; + const unsigned int COL0 = 0xffffffff; + const unsigned int COL1 = 0xff1f1f1f; + + drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+1,COL0,COL0,COL1,COL1); + + argbColor = 0x864f4f4f; + drawRect(m_dialogHorPos+1,m_dialogVertPos+titleHeight,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+m_dialogHeight,argbColor,argbColor,argbColor,argbColor); + + + int y = m_dialogVertPos+charHeight+1; + glLineWidth(3); + drawLine(m_dialogHorPos, y, m_dialogHorPos+m_dialogWidth-1, y, 0x80afafaf,0x80afafaf); + + + + unsigned int clight = 0x5FFFFFFF; // bar contour + drawLine(m_dialogHorPos, m_dialogVertPos, m_dialogHorPos, m_dialogVertPos+m_dialogHeight, clight,clight); + drawLine(m_dialogHorPos, m_dialogVertPos, m_dialogHorPos+m_dialogWidth, m_dialogVertPos, clight,clight); + drawLine(m_dialogHorPos+m_dialogWidth, m_dialogVertPos, m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, clight,clight); + drawLine(m_dialogHorPos, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, clight,clight); + int dshad = 3; // bar shadows + + unsigned int cshad = (((0x40000000>>24)/2)<<24) & 0xFF000000; + drawRect(m_dialogHorPos, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+dshad, m_dialogVertPos+m_dialogHeight+dshad, 0, cshad, 0, 0); + drawRect(m_dialogHorPos+dshad+1, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth-1, m_dialogVertPos+m_dialogHeight+dshad, cshad, cshad, 0, 0); + drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+m_dialogHeight+dshad, cshad, 0, 0, 0); + drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+dshad, 0, 0, cshad, 0); + drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos+dshad+1, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+m_dialogHeight-1, cshad, 0, cshad, 0); + + int yInc = 16; + int curHorPos = m_dialogHorPos+5; + int curVertPos = m_dialogVertPos; + curVertPos += yInc; + + GLDebugDrawString(m_dialogHorPos+m_dialogWidth/2-((int(strlen(m_dialogTitle)/2))*charWidth),m_dialogVertPos+yInc ,m_dialogTitle); + curVertPos += 20; + + + for (int i=0;idraw(curHorPos,curVertPos,deltaTime); + } + + restoreOpenGLState(); +} + + +void GL_DialogWindow::saveOpenGLState() +{ +#if 0 + glPushAttrib(GL_ALL_ATTRIB_BITS); + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); +#endif + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + GLint Vp[4]; + glGetIntegerv(GL_VIEWPORT, Vp); + + if( m_screenWidth>0 && m_screenHeight>0 ) + { + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = m_screenWidth-1; + Vp[3] = m_screenHeight-1; + glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); + } + glLoadIdentity(); + glOrtho(Vp[0], Vp[0]+Vp[2], Vp[1]+Vp[3], Vp[1], -1, 1); + glGetIntegerv(GL_VIEWPORT, m_ViewportInit); + glGetFloatv(GL_PROJECTION_MATRIX, m_ProjMatrixInit); + + glGetFloatv(GL_LINE_WIDTH, &m_PrevLineWidth); + // glDisable(GL_POLYGON_STIPPLE); + glLineWidth(1); + + glDisable(GL_LINE_SMOOTH); +// glDisable(GL_LINE_STIPPLE); + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glEnable(GL_BLEND); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &m_PrevTexEnv); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glDisable(GL_TEXTURE_2D); + +} + +void GL_DialogWindow::restoreOpenGLState() +{ + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m_PrevTexEnv); + glLineWidth(m_PrevLineWidth); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glPopClientAttrib(); + glPopAttrib(); + +} + + +void GL_TextControl::draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime) +{ + for (int i=0;igetWorldTransform().getOrigin()[0]+m_parentWindow->getScreenWidth()/2); + int controlVertPos = int(m_toggleBody->getWorldTransform().getOrigin()[1]+m_parentWindow->getScreenHeight()/2); + + int parentHorPos = controlHorPos-8; + int parentVertPos = controlVertPos-8; + + unsigned int grey = 0xff6f6f6f; + + drawRect(parentHorPos, parentVertPos, parentHorPos+16, parentVertPos+16, grey, grey, grey, grey); + + int borderSize = 2; + unsigned int white = 0xffefefef; + drawRect(parentHorPos+borderSize, parentVertPos+borderSize, parentHorPos+16-borderSize, parentVertPos+16-borderSize, white,white,white,white); + + + if (m_active) + { + //unsigned int red = 0xff8f0000; + // unsigned int white = 0xff8f0000; + unsigned int black = 0xff1f1f1f; + borderSize = 4; + drawRect(parentHorPos+borderSize, parentVertPos+borderSize, parentHorPos+16-borderSize, parentVertPos+16-borderSize, black,black,black,black); + } + + btVector3 rgb(1,1,1); + + GLDebugDrawStringInternal(parentHorPos2,parentVertPos+16,m_toggleText,rgb); + parentVertPos2+=20; + +} + + +void GL_SliderControl::draw(int& parentHorPos2,int& parentVertPos2,btScalar deltaTime) +{ + + int controlHorPos = int(m_sliderBody->getWorldTransform().getOrigin()[0]+m_parentWindow->getScreenWidth()/2); + int controlVertPos = int(m_sliderBody->getWorldTransform().getOrigin()[1]+m_parentWindow->getScreenHeight()/2); + + int parentHorPos = controlHorPos-8; + int parentVertPos = controlVertPos-8; + + unsigned int grey = 0xff6f6f6f; + int borderSize = 2; + unsigned int white = 0xffefefef; + drawRect(parentHorPos2+80+borderSize, parentVertPos2+borderSize, parentHorPos2+m_parentWindow->getDialogWidth()-16-borderSize, parentVertPos2+2-borderSize, white,white,white,white); + + drawRect(parentHorPos, parentVertPos, parentHorPos+16, parentVertPos+16, grey, grey, grey, grey); + + + + drawRect(parentHorPos+borderSize, parentVertPos+borderSize, parentHorPos+16-borderSize, parentVertPos+16-borderSize, white,white,white,white); + + + + btVector3 rgb(1,1,1); + + GLDebugDrawStringInternal(parentHorPos2,parentVertPos2+8,m_sliderText,rgb); + parentVertPos2+=20; + +} diff --git a/Demos/OpenGL/GL_DialogWindow.h b/Demos/OpenGL/GL_DialogWindow.h index 7b18b28eb..25a90cf00 100644 --- a/Demos/OpenGL/GL_DialogWindow.h +++ b/Demos/OpenGL/GL_DialogWindow.h @@ -1,283 +1,283 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 GL_DIALOG_WINDOW_H -#define GL_DIALOG_WINDOW_H - -class btCollisionObject; - - -//think different -#if defined(__APPLE__) && !defined (VMDMESA) -#include -#if (defined (TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined (TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR) -#import -#define glOrtho glOrthof -#else -#include -#include -#include -#endif -#else - - -#ifdef _WINDOWS -#include -#include -#include -#else -#include -#endif -#endif - - -#include "LinearMath/btScalar.h" -#include "LinearMath/btAlignedObjectArray.h" -class btTypedConstraint; - -class GL_DialogWindow; - -enum GL_DIALOG_CONTROL_TYPES -{ - GL_TEXT_CONTROL=1, - GL_TOGGLE_CONTROL, - GL_SLIDER_CONTROL, - GL_CONTROL_MAX_TYPE -}; - -class GL_DialogControl -{ -protected: - int m_type; - -public: - - virtual ~GL_DialogControl() - { - } - virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime)=0; - - int getType() const - { - return m_type; - } -}; - -struct GL_TextControl : public GL_DialogControl -{ -public: - - btAlignedObjectArray m_textLines; - - GL_TextControl() - { - m_type = GL_TEXT_CONTROL; - } - - virtual ~GL_TextControl() {} - - virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime); -}; - - -struct GL_ToggleControl : public GL_DialogControl -{ - btCollisionObject* m_toggleBody; - GL_DialogWindow* m_parentWindow; - - const char* m_toggleText; - -public: - - bool m_active; - - - GL_ToggleControl(const char* toggleText,btCollisionObject* toggleBody, GL_DialogWindow* parentWindow) - :m_toggleBody(toggleBody), - m_parentWindow(parentWindow), - m_toggleText(toggleText), - m_active(false) - { - m_type = GL_TOGGLE_CONTROL; - } - - virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime); -}; - -struct GL_SliderControl : public GL_DialogControl -{ - btCollisionObject* m_sliderBody; - GL_DialogWindow* m_parentWindow; - btScalar m_lowerLimit; - btScalar m_upperLimit; - btTypedConstraint* m_constraint; - - const char* m_sliderText; -public: - - GL_SliderControl(const char* sliderText,btCollisionObject* sliderBody, GL_DialogWindow* parentWindow, btScalar lowerLimit,btScalar upperLimit,btTypedConstraint* constaint) - :m_sliderBody(sliderBody), - m_parentWindow(parentWindow), - m_lowerLimit(lowerLimit), - m_upperLimit(upperLimit), - m_constraint(constaint), - m_sliderText(sliderText) - { - m_type = GL_SLIDER_CONTROL; - } - - virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime); - - btScalar btGetFraction(); - - btScalar getLowerLimit() - { - return m_lowerLimit; - } - btScalar getUpperLimit() - { - return m_upperLimit; - } - btTypedConstraint* getConstraint() - { - return m_constraint; - } -}; - -///Very basic OpenGL Graphical Userinterface Window with text, toggle, slider control -class GL_DialogWindow -{ - - int m_dialogHorPos; - int m_dialogVertPos; - int m_dialogWidth; - int m_dialogHeight; - - int m_screenWidth; - int m_screenHeight; - - const char* m_dialogTitle; - - //saved OpenGL settings - GLfloat m_PrevLineWidth; - GLint m_PrevTexEnv; - GLint m_PrevPolygonMode[2]; - GLint m_MaxClipPlanes; - GLint m_PrevTexture; - GLint m_PrevArrayBufferARB; - GLint m_PrevElementArrayBufferARB; - GLboolean m_PrevVertexProgramARB; - GLboolean m_PrevFragmentProgramARB; - GLuint m_PrevProgramObjectARB; - GLboolean m_PrevTexture3D; - GLboolean m_PrevActiveTexture1D[32]; - GLboolean m_PrevActiveTexture2D[32]; - GLboolean m_PrevActiveTexture3D[32]; - GLint m_PrevActiveTextureARB; - bool m_SupportTexRect; - GLboolean m_PrevTexRectARB; - GLint m_PrevBlendEquation; - GLint m_PrevBlendEquationRGB; - GLint m_PrevBlendEquationAlpha; - GLint m_PrevBlendSrcRGB; - GLint m_PrevBlendDstRGB; - GLint m_PrevBlendSrcAlpha; - GLint m_PrevBlendDstAlpha; - GLint m_ViewportInit[4]; - GLfloat m_ProjMatrixInit[16]; - - btCollisionObject* m_collisionObject; - - btAlignedObjectArray m_controls; - -protected: - - - void saveOpenGLState(); - void restoreOpenGLState(); - -// void drawLine(int _X0, int _Y0, int _X1, int _Y1, unsigned int _Color0, unsigned int _Color1, bool antiAliased); -// void drawRect(int horStart, int vertStart, int horEnd, int vertEnd, unsigned int argbColor00,unsigned int argbColor10,unsigned int argbColor01,unsigned int argbColor11); - -public: - - - GL_DialogWindow(int horPos,int vertPos,int dialogWidth,int dialogHeight,btCollisionObject* colObject, const char* dialogTitle); - - virtual ~GL_DialogWindow(); - - void draw(btScalar deltaTime); - - void setScreenSize(int width, int height); - - void setStartPosition(int dialogHorPos,int dialogVertPos); - - void addControl(GL_DialogControl* control) - { - m_controls.push_back(control); - } - - void removeControl(GL_DialogControl* control) - { - m_controls.remove(control); - } - - btCollisionObject* getCollisionObject() - { - return m_collisionObject; - } - - int getDialogHorPos() const - { - return m_dialogHorPos; - } - int getDialogVertPos() const - { - return m_dialogVertPos; - } - int getDialogWidth() const - { - return m_dialogWidth; - } - - int getDialogHeight() const - { - return m_dialogHeight; - } - int getScreenWidth() const - { - return m_screenWidth; - } - int getScreenHeight() const - { - return m_screenHeight; - } - - int getNumControls() const - { - return m_controls.size(); - } - - const GL_DialogControl* getControl(int index) const - { - return m_controls[index]; - } - GL_DialogControl* getControl(int index) - { - return m_controls[index]; - } -}; - -#endif //GL_DIALOG_WINDOW_H +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 GL_DIALOG_WINDOW_H +#define GL_DIALOG_WINDOW_H + +class btCollisionObject; + + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#if (defined (TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined (TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR) +#import +#define glOrtho glOrthof +#else +#include +#include +#include +#endif +#else + + +#ifdef _WINDOWS +#include +#include +#include +#else +#include +#endif +#endif + + +#include "LinearMath/btScalar.h" +#include "LinearMath/btAlignedObjectArray.h" +class btTypedConstraint; + +class GL_DialogWindow; + +enum GL_DIALOG_CONTROL_TYPES +{ + GL_TEXT_CONTROL=1, + GL_TOGGLE_CONTROL, + GL_SLIDER_CONTROL, + GL_CONTROL_MAX_TYPE +}; + +class GL_DialogControl +{ +protected: + int m_type; + +public: + + virtual ~GL_DialogControl() + { + } + virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime)=0; + + int getType() const + { + return m_type; + } +}; + +struct GL_TextControl : public GL_DialogControl +{ +public: + + btAlignedObjectArray m_textLines; + + GL_TextControl() + { + m_type = GL_TEXT_CONTROL; + } + + virtual ~GL_TextControl() {} + + virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime); +}; + + +struct GL_ToggleControl : public GL_DialogControl +{ + btCollisionObject* m_toggleBody; + GL_DialogWindow* m_parentWindow; + + const char* m_toggleText; + +public: + + bool m_active; + + + GL_ToggleControl(const char* toggleText,btCollisionObject* toggleBody, GL_DialogWindow* parentWindow) + :m_toggleBody(toggleBody), + m_parentWindow(parentWindow), + m_toggleText(toggleText), + m_active(false) + { + m_type = GL_TOGGLE_CONTROL; + } + + virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime); +}; + +struct GL_SliderControl : public GL_DialogControl +{ + btCollisionObject* m_sliderBody; + GL_DialogWindow* m_parentWindow; + btScalar m_lowerLimit; + btScalar m_upperLimit; + btTypedConstraint* m_constraint; + + const char* m_sliderText; +public: + + GL_SliderControl(const char* sliderText,btCollisionObject* sliderBody, GL_DialogWindow* parentWindow, btScalar lowerLimit,btScalar upperLimit,btTypedConstraint* constaint) + :m_sliderBody(sliderBody), + m_parentWindow(parentWindow), + m_lowerLimit(lowerLimit), + m_upperLimit(upperLimit), + m_constraint(constaint), + m_sliderText(sliderText) + { + m_type = GL_SLIDER_CONTROL; + } + + virtual void draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime); + + btScalar btGetFraction(); + + btScalar getLowerLimit() + { + return m_lowerLimit; + } + btScalar getUpperLimit() + { + return m_upperLimit; + } + btTypedConstraint* getConstraint() + { + return m_constraint; + } +}; + +///Very basic OpenGL Graphical Userinterface Window with text, toggle, slider control +class GL_DialogWindow +{ + + int m_dialogHorPos; + int m_dialogVertPos; + int m_dialogWidth; + int m_dialogHeight; + + int m_screenWidth; + int m_screenHeight; + + const char* m_dialogTitle; + + //saved OpenGL settings + GLfloat m_PrevLineWidth; + GLint m_PrevTexEnv; + GLint m_PrevPolygonMode[2]; + GLint m_MaxClipPlanes; + GLint m_PrevTexture; + GLint m_PrevArrayBufferARB; + GLint m_PrevElementArrayBufferARB; + GLboolean m_PrevVertexProgramARB; + GLboolean m_PrevFragmentProgramARB; + GLuint m_PrevProgramObjectARB; + GLboolean m_PrevTexture3D; + GLboolean m_PrevActiveTexture1D[32]; + GLboolean m_PrevActiveTexture2D[32]; + GLboolean m_PrevActiveTexture3D[32]; + GLint m_PrevActiveTextureARB; + bool m_SupportTexRect; + GLboolean m_PrevTexRectARB; + GLint m_PrevBlendEquation; + GLint m_PrevBlendEquationRGB; + GLint m_PrevBlendEquationAlpha; + GLint m_PrevBlendSrcRGB; + GLint m_PrevBlendDstRGB; + GLint m_PrevBlendSrcAlpha; + GLint m_PrevBlendDstAlpha; + GLint m_ViewportInit[4]; + GLfloat m_ProjMatrixInit[16]; + + btCollisionObject* m_collisionObject; + + btAlignedObjectArray m_controls; + +protected: + + + void saveOpenGLState(); + void restoreOpenGLState(); + +// void drawLine(int _X0, int _Y0, int _X1, int _Y1, unsigned int _Color0, unsigned int _Color1, bool antiAliased); +// void drawRect(int horStart, int vertStart, int horEnd, int vertEnd, unsigned int argbColor00,unsigned int argbColor10,unsigned int argbColor01,unsigned int argbColor11); + +public: + + + GL_DialogWindow(int horPos,int vertPos,int dialogWidth,int dialogHeight,btCollisionObject* colObject, const char* dialogTitle); + + virtual ~GL_DialogWindow(); + + void draw(btScalar deltaTime); + + void setScreenSize(int width, int height); + + void setStartPosition(int dialogHorPos,int dialogVertPos); + + void addControl(GL_DialogControl* control) + { + m_controls.push_back(control); + } + + void removeControl(GL_DialogControl* control) + { + m_controls.remove(control); + } + + btCollisionObject* getCollisionObject() + { + return m_collisionObject; + } + + int getDialogHorPos() const + { + return m_dialogHorPos; + } + int getDialogVertPos() const + { + return m_dialogVertPos; + } + int getDialogWidth() const + { + return m_dialogWidth; + } + + int getDialogHeight() const + { + return m_dialogHeight; + } + int getScreenWidth() const + { + return m_screenWidth; + } + int getScreenHeight() const + { + return m_screenHeight; + } + + int getNumControls() const + { + return m_controls.size(); + } + + const GL_DialogControl* getControl(int index) const + { + return m_controls[index]; + } + GL_DialogControl* getControl(int index) + { + return m_controls[index]; + } +}; + +#endif //GL_DIALOG_WINDOW_H diff --git a/Demos/OpenGL/GlutDemoApplication.cpp b/Demos/OpenGL/GlutDemoApplication.cpp index 1f39aac5f..0ceaede76 100644 --- a/Demos/OpenGL/GlutDemoApplication.cpp +++ b/Demos/OpenGL/GlutDemoApplication.cpp @@ -1,87 +1,87 @@ - -#ifndef _WINDOWS - -#include "GlutDemoApplication.h" - -#include "GlutStuff.h" - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" - -void GlutDemoApplication::updateModifierKeys() -{ - m_modifierKeys = 0; - if (glutGetModifiers() & GLUT_ACTIVE_ALT) - m_modifierKeys |= BT_ACTIVE_ALT; - - if (glutGetModifiers() & GLUT_ACTIVE_CTRL) - m_modifierKeys |= BT_ACTIVE_CTRL; - - if (glutGetModifiers() & GLUT_ACTIVE_SHIFT) - m_modifierKeys |= BT_ACTIVE_SHIFT; -} - -void GlutDemoApplication::specialKeyboard(int key, int x, int y) -{ - (void)x; - (void)y; - - switch (key) - { - case GLUT_KEY_F1: - { - - break; - } - - case GLUT_KEY_F2: - { - - break; - } - - - case GLUT_KEY_END: - { - int numObj = getDynamicsWorld()->getNumCollisionObjects(); - if (numObj) - { - btCollisionObject* obj = getDynamicsWorld()->getCollisionObjectArray()[numObj-1]; - - getDynamicsWorld()->removeCollisionObject(obj); - btRigidBody* body = btRigidBody::upcast(obj); - if (body && body->getMotionState()) - { - delete body->getMotionState(); - } - delete obj; - - - } - break; - } - case GLUT_KEY_LEFT : stepLeft(); break; - case GLUT_KEY_RIGHT : stepRight(); break; - case GLUT_KEY_UP : stepFront(); break; - case GLUT_KEY_DOWN : stepBack(); break; - case GLUT_KEY_PAGE_UP : zoomIn(); break; - case GLUT_KEY_PAGE_DOWN : zoomOut(); break; - case GLUT_KEY_HOME : toggleIdle(); break; - default: - // std::cout << "unused (special) key : " << key << std::endl; - break; - } - - glutPostRedisplay(); - -} - -void GlutDemoApplication::swapBuffers() -{ - glutSwapBuffers(); - -} - -#endif //_WINDOWS - - + +#ifndef _WINDOWS + +#include "GlutDemoApplication.h" + +#include "GlutStuff.h" + +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" + +void GlutDemoApplication::updateModifierKeys() +{ + m_modifierKeys = 0; + if (glutGetModifiers() & GLUT_ACTIVE_ALT) + m_modifierKeys |= BT_ACTIVE_ALT; + + if (glutGetModifiers() & GLUT_ACTIVE_CTRL) + m_modifierKeys |= BT_ACTIVE_CTRL; + + if (glutGetModifiers() & GLUT_ACTIVE_SHIFT) + m_modifierKeys |= BT_ACTIVE_SHIFT; +} + +void GlutDemoApplication::specialKeyboard(int key, int x, int y) +{ + (void)x; + (void)y; + + switch (key) + { + case GLUT_KEY_F1: + { + + break; + } + + case GLUT_KEY_F2: + { + + break; + } + + + case GLUT_KEY_END: + { + int numObj = getDynamicsWorld()->getNumCollisionObjects(); + if (numObj) + { + btCollisionObject* obj = getDynamicsWorld()->getCollisionObjectArray()[numObj-1]; + + getDynamicsWorld()->removeCollisionObject(obj); + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + delete obj; + + + } + break; + } + case GLUT_KEY_LEFT : stepLeft(); break; + case GLUT_KEY_RIGHT : stepRight(); break; + case GLUT_KEY_UP : stepFront(); break; + case GLUT_KEY_DOWN : stepBack(); break; + case GLUT_KEY_PAGE_UP : zoomIn(); break; + case GLUT_KEY_PAGE_DOWN : zoomOut(); break; + case GLUT_KEY_HOME : toggleIdle(); break; + default: + // std::cout << "unused (special) key : " << key << std::endl; + break; + } + + glutPostRedisplay(); + +} + +void GlutDemoApplication::swapBuffers() +{ + glutSwapBuffers(); + +} + +#endif //_WINDOWS + + diff --git a/Demos/OpenGL/GlutDemoApplication.h b/Demos/OpenGL/GlutDemoApplication.h index 427cf021f..e2727a777 100644 --- a/Demos/OpenGL/GlutDemoApplication.h +++ b/Demos/OpenGL/GlutDemoApplication.h @@ -1,34 +1,34 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 GLUT_DEMO_APPLICATION_H -#define GLUT_DEMO_APPLICATION_H - -#include "DemoApplication.h" - -class GlutDemoApplication : public DemoApplication -{ -public: - - void specialKeyboard(int key, int x, int y); - - virtual void swapBuffers(); - - virtual void updateModifierKeys(); - -}; -#endif //GLUT_DEMO_APPLICATION_H - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 GLUT_DEMO_APPLICATION_H +#define GLUT_DEMO_APPLICATION_H + +#include "DemoApplication.h" + +class GlutDemoApplication : public DemoApplication +{ +public: + + void specialKeyboard(int key, int x, int y); + + virtual void swapBuffers(); + + virtual void updateModifierKeys(); + +}; +#endif //GLUT_DEMO_APPLICATION_H + diff --git a/Demos/OpenGL/Win32AppMain.cpp b/Demos/OpenGL/Win32AppMain.cpp index 89c028d1c..9ef788e72 100644 --- a/Demos/OpenGL/Win32AppMain.cpp +++ b/Demos/OpenGL/Win32AppMain.cpp @@ -1,402 +1,402 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 Erwin Coumans http://bulletphysics.org - -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 - - -#include "DemoApplication.h" - -#include "GLDebugDrawer.h" -#include "GLDebugFont.h" - -#include "BulletDynamics/Dynamics/btDynamicsWorld.h" - -/// This Win32AppMain is shared code between all demos. -/// The actual demo, derived from DemoApplication is created using 'createDemo', in a separate .cpp file -DemoApplication* gDemoApplication = 0; -DemoApplication* createDemo(); - - -// Function Declarations - -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); -void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC); -void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC); -static bool sOpenGLInitialized = false; -static int sWidth = 0; -static int sHeight =0; -static int quitRequest = 0; - -// WinMain - -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int iCmdShow) -{ - WNDCLASS wc; - HWND hWnd; - HDC hDC; - HGLRC hRC; - MSG msg; - BOOL quit = FALSE; - float theta = 0.0f; - - gDemoApplication = createDemo(); - - - // register window class - wc.style = CS_OWNDC; - wc.lpfnWndProc = WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "BulletPhysics"; - RegisterClass( &wc ); - - // create main window - hWnd = CreateWindow( - "BulletPhysics", "Bullet Physics Sample. http://bulletphysics.org", - WS_CAPTION | WS_VISIBLE | WS_OVERLAPPEDWINDOW, -// 0, 0, 640, 480, - 0, 0, 1024, 768, - NULL, NULL, hInstance, NULL ); - - // enable OpenGL for the window - EnableOpenGL( hWnd, &hDC, &hRC ); - - - GLDebugDrawer debugDraw; - gDemoApplication->myinit(); - //gDemoApplication->reshape(1024, 768); - gDemoApplication->initPhysics(); - if (gDemoApplication->getDynamicsWorld()) - gDemoApplication->getDynamicsWorld()->setDebugDrawer(&debugDraw); - - gDemoApplication->reshape(sWidth,sHeight); - - // program main loop - while ( !quit ) - { - - // check for messages - if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) - { - - // handle or dispatch messages - if ( msg.message == WM_QUIT ) - { - quit = TRUE; - } - else - { - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } - -// gDemoApplication->displayCallback(); - - - }; - - // OpenGL animation code goes here - - glClearColor( .7f, 0.7f, 0.7f, 1.f ); - - gDemoApplication->moveAndDisplay(); - - - SwapBuffers( hDC ); - - theta += 1.0f; - - - } - - - - // shutdown OpenGL - DisableOpenGL( hWnd, hDC, hRC ); - - // destroy the window explicitly - DestroyWindow( hWnd ); - - delete gDemoApplication; - - return msg.wParam; - -} - -// Window Procedure - -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - - - - switch (message) - { - - case WM_SYSKEYDOWN: - { - if (lParam & 1<<29) - { - gDemoApplication->m_modifierKeys = VK_LMENU; - } - break; - } - case WM_SYSKEYUP: - { - if (lParam & 1<<29) - { - gDemoApplication->m_modifierKeys = VK_LMENU; - } else - { - gDemoApplication->m_modifierKeys = 0; - } - - break; - } - - - case WM_SIZE: // Size Action Has Taken Place - - switch (wParam) // Evaluate Size Action - { - case SIZE_MINIMIZED: // Was Window Minimized? - return 0; // Return - - case SIZE_MAXIMIZED: // Was Window Maximized? - sWidth = LOWORD (lParam); - sHeight = HIWORD (lParam); - if (sOpenGLInitialized) - { - gDemoApplication->reshape(sWidth,sHeight); - } - return 0; // Return - - case SIZE_RESTORED: // Was Window Restored? - sWidth = LOWORD (lParam); - sHeight = HIWORD (lParam); - if (sOpenGLInitialized) - { - gDemoApplication->reshape(sWidth,sHeight); - } - return 0; // Return - } - break; - - case WM_CREATE: - return 0; - - case WM_MBUTTONUP: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseFunc(1,1,xPos,yPos); - break; - } - case WM_MBUTTONDOWN: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseFunc(1,0,xPos,yPos); - break; - } - - case WM_LBUTTONUP: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseFunc(0,1,xPos,yPos); - break; - } - case 0x020A://WM_MOUSEWHEEL: - { - - int zDelta = (short)HIWORD(wParam); - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - if (zDelta>0) - gDemoApplication->zoomIn(); - else - gDemoApplication->zoomOut(); - break; - } - - case WM_MOUSEMOVE: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseMotionFunc(xPos,yPos); - break; - } - case WM_RBUTTONUP: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseFunc(2,1,xPos,yPos); - break; - } - case WM_RBUTTONDOWN: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseFunc(2,0,xPos,yPos); - break; - } - case WM_LBUTTONDOWN: - { - int xPos = LOWORD(lParam); - int yPos = HIWORD(lParam); - gDemoApplication->mouseFunc(0,0,xPos,yPos); - break; - } -/*#define WM_LBUTTONUP 0x0202 -#define WM_LBUTTONDBLCLK 0x0203 -#define WM_RBUTTONDOWN 0x0204 -#define WM_RBUTTONUP 0x0205 -#define WM_RBUTTONDBLCLK 0x0206 -#define WM_MBUTTONDOWN 0x0207 -#define WM_MBUTTONUP 0x0208 -#define WM_MBUTTONDBLCLK 0x0209 -*/ - - - - case WM_CLOSE: - PostQuitMessage( 0 ); - return 0; - - case WM_DESTROY: - return 0; - - case WM_KEYUP: - switch ( wParam ) - { - - case VK_PRIOR: - case VK_NEXT: - case VK_END: - case VK_HOME: - case VK_LEFT: - case VK_UP: - case VK_RIGHT: - case VK_DOWN: - { - if (gDemoApplication) - gDemoApplication->specialKeyboardUp(wParam,0,0); - return 0; - } - default: - return DefWindowProc( hWnd, message, wParam, lParam ); - } - - case WM_KEYDOWN: - printf("bla\n"); - switch ( wParam ) - { - case VK_CONTROL: - case VK_PRIOR: - case VK_NEXT: - case VK_END: - case VK_HOME: - case VK_LEFT: - case VK_UP: - case VK_RIGHT: - case VK_DOWN: - { - if (gDemoApplication) - gDemoApplication->specialKeyboard(wParam,0,0); - break; - } - - case ' ': - { - if (gDemoApplication) - gDemoApplication->clientResetScene(); - break; - } - case 'Q': - case VK_ESCAPE: - { - quitRequest = 1; - PostQuitMessage(0); - } - return 0; - - } - return 0; - - case WM_CHAR: - if (!quitRequest) - gDemoApplication->keyboardCallback(wParam,0,0); - break; - - default: - return DefWindowProc( hWnd, message, wParam, lParam ); - - } - return 0; -} - -// Enable OpenGL - -void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC) -{ - PIXELFORMATDESCRIPTOR pfd; - int format; - - // get the device context (DC) - *hDC = GetDC( hWnd ); - - // set the pixel format for the DC - ZeroMemory( &pfd, sizeof( pfd ) ); - pfd.nSize = sizeof( pfd ); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 24; - pfd.cDepthBits = 16; - pfd.cStencilBits = 1; - pfd.iLayerType = PFD_MAIN_PLANE; - format = ChoosePixelFormat( *hDC, &pfd ); - SetPixelFormat( *hDC, format, &pfd ); - - // create and enable the render context (RC) - *hRC = wglCreateContext( *hDC ); - wglMakeCurrent( *hDC, *hRC ); - sOpenGLInitialized = true; - - -} - -// Disable OpenGL - -void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC) -{ - sOpenGLInitialized = false; - - wglMakeCurrent( NULL, NULL ); - wglDeleteContext( hRC ); - ReleaseDC( hWnd, hDC ); -} - -#endif //_WINDOWS +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2010 Erwin Coumans http://bulletphysics.org + +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 + + +#include "DemoApplication.h" + +#include "GLDebugDrawer.h" +#include "GLDebugFont.h" + +#include "BulletDynamics/Dynamics/btDynamicsWorld.h" + +/// This Win32AppMain is shared code between all demos. +/// The actual demo, derived from DemoApplication is created using 'createDemo', in a separate .cpp file +DemoApplication* gDemoApplication = 0; +DemoApplication* createDemo(); + + +// Function Declarations + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC); +void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC); +static bool sOpenGLInitialized = false; +static int sWidth = 0; +static int sHeight =0; +static int quitRequest = 0; + +// WinMain + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int iCmdShow) +{ + WNDCLASS wc; + HWND hWnd; + HDC hDC; + HGLRC hRC; + MSG msg; + BOOL quit = FALSE; + float theta = 0.0f; + + gDemoApplication = createDemo(); + + + // register window class + wc.style = CS_OWNDC; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); + wc.hCursor = LoadCursor( NULL, IDC_ARROW ); + wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); + wc.lpszMenuName = NULL; + wc.lpszClassName = "BulletPhysics"; + RegisterClass( &wc ); + + // create main window + hWnd = CreateWindow( + "BulletPhysics", "Bullet Physics Sample. http://bulletphysics.org", + WS_CAPTION | WS_VISIBLE | WS_OVERLAPPEDWINDOW, +// 0, 0, 640, 480, + 0, 0, 1024, 768, + NULL, NULL, hInstance, NULL ); + + // enable OpenGL for the window + EnableOpenGL( hWnd, &hDC, &hRC ); + + + GLDebugDrawer debugDraw; + gDemoApplication->myinit(); + //gDemoApplication->reshape(1024, 768); + gDemoApplication->initPhysics(); + if (gDemoApplication->getDynamicsWorld()) + gDemoApplication->getDynamicsWorld()->setDebugDrawer(&debugDraw); + + gDemoApplication->reshape(sWidth,sHeight); + + // program main loop + while ( !quit ) + { + + // check for messages + if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) + { + + // handle or dispatch messages + if ( msg.message == WM_QUIT ) + { + quit = TRUE; + } + else + { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + +// gDemoApplication->displayCallback(); + + + }; + + // OpenGL animation code goes here + + glClearColor( .7f, 0.7f, 0.7f, 1.f ); + + gDemoApplication->moveAndDisplay(); + + + SwapBuffers( hDC ); + + theta += 1.0f; + + + } + + + + // shutdown OpenGL + DisableOpenGL( hWnd, hDC, hRC ); + + // destroy the window explicitly + DestroyWindow( hWnd ); + + delete gDemoApplication; + + return msg.wParam; + +} + +// Window Procedure + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + + + + switch (message) + { + + case WM_SYSKEYDOWN: + { + if (lParam & 1<<29) + { + gDemoApplication->m_modifierKeys = VK_LMENU; + } + break; + } + case WM_SYSKEYUP: + { + if (lParam & 1<<29) + { + gDemoApplication->m_modifierKeys = VK_LMENU; + } else + { + gDemoApplication->m_modifierKeys = 0; + } + + break; + } + + + case WM_SIZE: // Size Action Has Taken Place + + switch (wParam) // Evaluate Size Action + { + case SIZE_MINIMIZED: // Was Window Minimized? + return 0; // Return + + case SIZE_MAXIMIZED: // Was Window Maximized? + sWidth = LOWORD (lParam); + sHeight = HIWORD (lParam); + if (sOpenGLInitialized) + { + gDemoApplication->reshape(sWidth,sHeight); + } + return 0; // Return + + case SIZE_RESTORED: // Was Window Restored? + sWidth = LOWORD (lParam); + sHeight = HIWORD (lParam); + if (sOpenGLInitialized) + { + gDemoApplication->reshape(sWidth,sHeight); + } + return 0; // Return + } + break; + + case WM_CREATE: + return 0; + + case WM_MBUTTONUP: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseFunc(1,1,xPos,yPos); + break; + } + case WM_MBUTTONDOWN: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseFunc(1,0,xPos,yPos); + break; + } + + case WM_LBUTTONUP: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseFunc(0,1,xPos,yPos); + break; + } + case 0x020A://WM_MOUSEWHEEL: + { + + int zDelta = (short)HIWORD(wParam); + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + if (zDelta>0) + gDemoApplication->zoomIn(); + else + gDemoApplication->zoomOut(); + break; + } + + case WM_MOUSEMOVE: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseMotionFunc(xPos,yPos); + break; + } + case WM_RBUTTONUP: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseFunc(2,1,xPos,yPos); + break; + } + case WM_RBUTTONDOWN: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseFunc(2,0,xPos,yPos); + break; + } + case WM_LBUTTONDOWN: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + gDemoApplication->mouseFunc(0,0,xPos,yPos); + break; + } +/*#define WM_LBUTTONUP 0x0202 +#define WM_LBUTTONDBLCLK 0x0203 +#define WM_RBUTTONDOWN 0x0204 +#define WM_RBUTTONUP 0x0205 +#define WM_RBUTTONDBLCLK 0x0206 +#define WM_MBUTTONDOWN 0x0207 +#define WM_MBUTTONUP 0x0208 +#define WM_MBUTTONDBLCLK 0x0209 +*/ + + + + case WM_CLOSE: + PostQuitMessage( 0 ); + return 0; + + case WM_DESTROY: + return 0; + + case WM_KEYUP: + switch ( wParam ) + { + + case VK_PRIOR: + case VK_NEXT: + case VK_END: + case VK_HOME: + case VK_LEFT: + case VK_UP: + case VK_RIGHT: + case VK_DOWN: + { + if (gDemoApplication) + gDemoApplication->specialKeyboardUp(wParam,0,0); + return 0; + } + default: + return DefWindowProc( hWnd, message, wParam, lParam ); + } + + case WM_KEYDOWN: + printf("bla\n"); + switch ( wParam ) + { + case VK_CONTROL: + case VK_PRIOR: + case VK_NEXT: + case VK_END: + case VK_HOME: + case VK_LEFT: + case VK_UP: + case VK_RIGHT: + case VK_DOWN: + { + if (gDemoApplication) + gDemoApplication->specialKeyboard(wParam,0,0); + break; + } + + case ' ': + { + if (gDemoApplication) + gDemoApplication->clientResetScene(); + break; + } + case 'Q': + case VK_ESCAPE: + { + quitRequest = 1; + PostQuitMessage(0); + } + return 0; + + } + return 0; + + case WM_CHAR: + if (!quitRequest) + gDemoApplication->keyboardCallback(wParam,0,0); + break; + + default: + return DefWindowProc( hWnd, message, wParam, lParam ); + + } + return 0; +} + +// Enable OpenGL + +void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC) +{ + PIXELFORMATDESCRIPTOR pfd; + int format; + + // get the device context (DC) + *hDC = GetDC( hWnd ); + + // set the pixel format for the DC + ZeroMemory( &pfd, sizeof( pfd ) ); + pfd.nSize = sizeof( pfd ); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 16; + pfd.cStencilBits = 1; + pfd.iLayerType = PFD_MAIN_PLANE; + format = ChoosePixelFormat( *hDC, &pfd ); + SetPixelFormat( *hDC, format, &pfd ); + + // create and enable the render context (RC) + *hRC = wglCreateContext( *hDC ); + wglMakeCurrent( *hDC, *hRC ); + sOpenGLInitialized = true; + + +} + +// Disable OpenGL + +void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC) +{ + sOpenGLInitialized = false; + + wglMakeCurrent( NULL, NULL ); + wglDeleteContext( hRC ); + ReleaseDC( hWnd, hDC ); +} + +#endif //_WINDOWS diff --git a/Demos/OpenGL/Win32DemoApplication.cpp b/Demos/OpenGL/Win32DemoApplication.cpp index 31a20e7c1..f959cbf4f 100644 --- a/Demos/OpenGL/Win32DemoApplication.cpp +++ b/Demos/OpenGL/Win32DemoApplication.cpp @@ -1,79 +1,79 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 _WINDOWS - -#include "Win32DemoApplication.h" - - - - -#if 0 -void Win32DemoApplication::renderme() -{ -} -void Win32DemoApplication::setTexturing(bool useTexture) -{ -} - -void Win32DemoApplication::setShadows(bool useShadows) -{ -} - -void Win32DemoApplication::setCameraDistance(float camDist) -{ -} -void Win32DemoApplication::clientResetScene() -{ - -} -#endif - -void Win32DemoApplication::updateModifierKeys() -{ - //not yet -} - - - -void Win32DemoApplication::specialKeyboard(int key, int x, int y) -{ - (void)x; - (void)y; - - switch (key) - { - case VK_LEFT : stepLeft(); break; - case VK_RIGHT : stepRight(); break; - case VK_UP : stepFront(); break; - case VK_DOWN : stepBack(); break; - -// case GLUT_KEY_PAGE_UP : zoomIn(); break; -// case GLUT_KEY_PAGE_DOWN : zoomOut(); break; -// case GLUT_KEY_HOME : toggleIdle(); break; - - default: - // std::cout << "unused (special) key : " << key << std::endl; - break; - } - -} - -void Win32DemoApplication::swapBuffers() -{ -} - -#endif - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 _WINDOWS + +#include "Win32DemoApplication.h" + + + + +#if 0 +void Win32DemoApplication::renderme() +{ +} +void Win32DemoApplication::setTexturing(bool useTexture) +{ +} + +void Win32DemoApplication::setShadows(bool useShadows) +{ +} + +void Win32DemoApplication::setCameraDistance(float camDist) +{ +} +void Win32DemoApplication::clientResetScene() +{ + +} +#endif + +void Win32DemoApplication::updateModifierKeys() +{ + //not yet +} + + + +void Win32DemoApplication::specialKeyboard(int key, int x, int y) +{ + (void)x; + (void)y; + + switch (key) + { + case VK_LEFT : stepLeft(); break; + case VK_RIGHT : stepRight(); break; + case VK_UP : stepFront(); break; + case VK_DOWN : stepBack(); break; + +// case GLUT_KEY_PAGE_UP : zoomIn(); break; +// case GLUT_KEY_PAGE_DOWN : zoomOut(); break; +// case GLUT_KEY_HOME : toggleIdle(); break; + + default: + // std::cout << "unused (special) key : " << key << std::endl; + break; + } + +} + +void Win32DemoApplication::swapBuffers() +{ +} + +#endif + diff --git a/Demos/OpenGL/Win32DemoApplication.h b/Demos/OpenGL/Win32DemoApplication.h index 4d2daac9a..0c2a1ee49 100644 --- a/Demos/OpenGL/Win32DemoApplication.h +++ b/Demos/OpenGL/Win32DemoApplication.h @@ -1,40 +1,40 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 WIN32_DEMO_APPLICATION_H -#define WIN32_DEMO_APPLICATION_H - - -#include "DemoApplication.h" - -class Win32DemoApplication : public DemoApplication -{ -protected: - - -public: - - - virtual void swapBuffers(); - - void specialKeyboard(int key, int x, int y); - - virtual void updateModifierKeys(); - - -}; - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 WIN32_DEMO_APPLICATION_H +#define WIN32_DEMO_APPLICATION_H + + +#include "DemoApplication.h" + +class Win32DemoApplication : public DemoApplication +{ +protected: + + +public: + + + virtual void swapBuffers(); + + void specialKeyboard(int key, int x, int y); + + virtual void updateModifierKeys(); + + +}; + #endif //WIN32_DEMO_APPLICATION_H \ No newline at end of file diff --git a/Demos/OpenGL/ibmsdk/Makefile b/Demos/OpenGL/ibmsdk/Makefile index b80fedf63..85a19c6e6 100644 --- a/Demos/OpenGL/ibmsdk/Makefile +++ b/Demos/OpenGL/ibmsdk/Makefile @@ -1,45 +1,45 @@ -#### Source code Dirs -VPATH = ../ - -ROOT = ../../.. -HOST = /usr/include - -#### Library -LIBRARY_ppu = bulletopenglsupport.a - -#### Compiler flags -CPPFLAGS = -DUSE_LIBSPE2 \ --I$(ROOT)/Extras/ConvexHull \ --I$(ROOT)/src/ \ --I$(SDKINC) \ --I$(HOST) - -#### Optimization level flags -#CC_OPT_LEVEL = $(CC_OPT_LEVEL_DEBUG) -CC_OPT_LEVEL = -O3 - -##### Objects to be archived in lib -OBJS = \ -BMF_Api.o \ -BMF_BitmapFont.o \ -BMF_font_helv10.o \ -DemoApplication.o \ -GLDebugDrawer.o \ -GL_ShapeDrawer.o \ -GL_Simplex1to4.o \ -GlutStuff.o \ -RenderTexture.o - -#### Install directories -INSTALL_DIR = $(ROOT)/lib/ibmsdk/ -INSTALL_FILES = $(LIBRARY) - -IBM_CELLSDK_VERSION := $(shell if [ -d /opt/cell ]; then echo "3.0"; fi) - -ifeq ("$(IBM_CELLSDK_VERSION)","3.0") - CELL_TOP ?= /opt/cell/sdk - include $(CELL_TOP)/buildutils/make.footer -else - CELL_TOP ?= /opt/ibm/cell-sdk/prototype - include $(CELL_TOP)/make.footer -endif +#### Source code Dirs +VPATH = ../ + +ROOT = ../../.. +HOST = /usr/include + +#### Library +LIBRARY_ppu = bulletopenglsupport.a + +#### Compiler flags +CPPFLAGS = -DUSE_LIBSPE2 \ +-I$(ROOT)/Extras/ConvexHull \ +-I$(ROOT)/src/ \ +-I$(SDKINC) \ +-I$(HOST) + +#### Optimization level flags +#CC_OPT_LEVEL = $(CC_OPT_LEVEL_DEBUG) +CC_OPT_LEVEL = -O3 + +##### Objects to be archived in lib +OBJS = \ +BMF_Api.o \ +BMF_BitmapFont.o \ +BMF_font_helv10.o \ +DemoApplication.o \ +GLDebugDrawer.o \ +GL_ShapeDrawer.o \ +GL_Simplex1to4.o \ +GlutStuff.o \ +RenderTexture.o + +#### Install directories +INSTALL_DIR = $(ROOT)/lib/ibmsdk/ +INSTALL_FILES = $(LIBRARY) + +IBM_CELLSDK_VERSION := $(shell if [ -d /opt/cell ]; then echo "3.0"; fi) + +ifeq ("$(IBM_CELLSDK_VERSION)","3.0") + CELL_TOP ?= /opt/cell/sdk + include $(CELL_TOP)/buildutils/make.footer +else + CELL_TOP ?= /opt/ibm/cell-sdk/prototype + include $(CELL_TOP)/make.footer +endif diff --git a/Demos/OpenPL_Demo/CApi.cpp b/Demos/OpenPL_Demo/CApi.cpp index baec3fbe8..171c7700b 100644 --- a/Demos/OpenPL_Demo/CApi.cpp +++ b/Demos/OpenPL_Demo/CApi.cpp @@ -1,159 +1,159 @@ -/* -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. -*/ - -/* - Draft high-level generic physics C-API. For low-level access, use the physics SDK native API's. - Work in progress, functionality will be added on demand. - - If possible, use the richer Bullet C++ API, by including -*/ - -#include "Bullet-C-Api.h" -#include "btBulletDynamicsCommon.h" - -/* - Create and Delete a Physics SDK -*/ - -plPhysicsSdkHandle plNewBulletSdk() -{ - return 0; -} - -void plDeletePhysicsSdk(plPhysicsSdkHandle physicsSdk) -{ - -} - -/* Dynamics World */ -plDynamicsWorldHandle plCreateDynamicsWorld(plPhysicsSdkHandle physicsSdk) -{ - return (plDynamicsWorldHandle) new btDiscreteDynamicsWorld; -} -void plDeleteDynamicsWorld(plDynamicsWorldHandle world) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - delete dynamicsWorld; -} - -void plStepSimulation(plDynamicsWorldHandle world, plReal timeStep) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - assert(dynamicsWorld); - dynamicsWorld->stepSimulation(timeStep); -} - -void plAddRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - assert(dynamicsWorld); - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - assert(body); - - dynamicsWorld->addRigidBody(body); -} - -void plRemoveRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - assert(dynamicsWorld); - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - assert(body); - - dynamicsWorld->removeRigidBody(body); -} - -/* Rigid Body */ - -plRigidBodyHandle plCreateRigidBody( void* user_data, float mass, plCollisionShapeHandle cshape ) -{ - btTransform trans; - trans.setIdentity(); - btVector3 localInertia; - btCollisionShape* shape = reinterpret_cast( cshape); - assert(shape); - shape->calculateLocalInertia(mass,localInertia); - btRigidBody* body = new btRigidBody(mass, trans,shape,localInertia); - body->m_userObjectPointer = user_data; - return (plRigidBodyHandle) body; -} - -void plDeleteRigidBody(plRigidBodyHandle cbody) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(cbody); - assert(body); - delete body; -} - - -/* Collision Shape definition */ - -plCollisionShapeHandle plNewSphereShape(plReal radius) -{ - return (plCollisionShapeHandle) new btSphereShape(radius); - -} - -plCollisionShapeHandle plNewBoxShape(plReal x, plReal y, plReal z) -{ - return (plCollisionShapeHandle) new btBoxShape(btVector3(x,y,z)); -} - -plCollisionShapeHandle plNewCapsuleShape(plReal radius, plReal height) -{ - //capsule is convex hull of 2 spheres, so use btMultiSphereShape - btVector3 inertiaHalfExtents(radius,height,radius); - const int numSpheres = 2; - btVector3 positions[numSpheres] = {btVector3(0,height,0),btVector3(0,-height,0)}; - btScalar radi[numSpheres] = {radius,radius}; - return (plCollisionShapeHandle) new btMultiSphereShape(inertiaHalfExtents,positions,radi,numSpheres); -} -plCollisionShapeHandle plNewConeShape(plReal radius, plReal height) -{ - return (plCollisionShapeHandle) new btConeShape(radius,height); -} - -plCollisionShapeHandle plNewCylinderShape(plReal radius, plReal height) -{ - return (plCollisionShapeHandle) new btCylinderShape(btVector3(radius,height,radius)); -} - -void plDeleteShape(plCollisionShapeHandle cshape) -{ - btCollisionShape* shape = reinterpret_cast( cshape); - assert(shape); - delete shape; -} -void plSetScaling(plCollisionShapeHandle cshape, plVector3 cscaling) -{ - btCollisionShape* shape = reinterpret_cast( cshape); - assert(shape); - btVector3 scaling(cscaling[0],cscaling[1],cscaling[2]); - shape->setLocalScaling(scaling); -} - - - -void plSetPosition(plRigidBodyHandle object, const plVector3 position) -{ -} -void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation) -{ -} - - -//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); - -// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); +/* +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. +*/ + +/* + Draft high-level generic physics C-API. For low-level access, use the physics SDK native API's. + Work in progress, functionality will be added on demand. + + If possible, use the richer Bullet C++ API, by including +*/ + +#include "Bullet-C-Api.h" +#include "btBulletDynamicsCommon.h" + +/* + Create and Delete a Physics SDK +*/ + +plPhysicsSdkHandle plNewBulletSdk() +{ + return 0; +} + +void plDeletePhysicsSdk(plPhysicsSdkHandle physicsSdk) +{ + +} + +/* Dynamics World */ +plDynamicsWorldHandle plCreateDynamicsWorld(plPhysicsSdkHandle physicsSdk) +{ + return (plDynamicsWorldHandle) new btDiscreteDynamicsWorld; +} +void plDeleteDynamicsWorld(plDynamicsWorldHandle world) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + delete dynamicsWorld; +} + +void plStepSimulation(plDynamicsWorldHandle world, plReal timeStep) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + assert(dynamicsWorld); + dynamicsWorld->stepSimulation(timeStep); +} + +void plAddRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + assert(dynamicsWorld); + btRigidBody* body = reinterpret_cast< btRigidBody* >(object); + assert(body); + + dynamicsWorld->addRigidBody(body); +} + +void plRemoveRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + assert(dynamicsWorld); + btRigidBody* body = reinterpret_cast< btRigidBody* >(object); + assert(body); + + dynamicsWorld->removeRigidBody(body); +} + +/* Rigid Body */ + +plRigidBodyHandle plCreateRigidBody( void* user_data, float mass, plCollisionShapeHandle cshape ) +{ + btTransform trans; + trans.setIdentity(); + btVector3 localInertia; + btCollisionShape* shape = reinterpret_cast( cshape); + assert(shape); + shape->calculateLocalInertia(mass,localInertia); + btRigidBody* body = new btRigidBody(mass, trans,shape,localInertia); + body->m_userObjectPointer = user_data; + return (plRigidBodyHandle) body; +} + +void plDeleteRigidBody(plRigidBodyHandle cbody) +{ + btRigidBody* body = reinterpret_cast< btRigidBody* >(cbody); + assert(body); + delete body; +} + + +/* Collision Shape definition */ + +plCollisionShapeHandle plNewSphereShape(plReal radius) +{ + return (plCollisionShapeHandle) new btSphereShape(radius); + +} + +plCollisionShapeHandle plNewBoxShape(plReal x, plReal y, plReal z) +{ + return (plCollisionShapeHandle) new btBoxShape(btVector3(x,y,z)); +} + +plCollisionShapeHandle plNewCapsuleShape(plReal radius, plReal height) +{ + //capsule is convex hull of 2 spheres, so use btMultiSphereShape + btVector3 inertiaHalfExtents(radius,height,radius); + const int numSpheres = 2; + btVector3 positions[numSpheres] = {btVector3(0,height,0),btVector3(0,-height,0)}; + btScalar radi[numSpheres] = {radius,radius}; + return (plCollisionShapeHandle) new btMultiSphereShape(inertiaHalfExtents,positions,radi,numSpheres); +} +plCollisionShapeHandle plNewConeShape(plReal radius, plReal height) +{ + return (plCollisionShapeHandle) new btConeShape(radius,height); +} + +plCollisionShapeHandle plNewCylinderShape(plReal radius, plReal height) +{ + return (plCollisionShapeHandle) new btCylinderShape(btVector3(radius,height,radius)); +} + +void plDeleteShape(plCollisionShapeHandle cshape) +{ + btCollisionShape* shape = reinterpret_cast( cshape); + assert(shape); + delete shape; +} +void plSetScaling(plCollisionShapeHandle cshape, plVector3 cscaling) +{ + btCollisionShape* shape = reinterpret_cast( cshape); + assert(shape); + btVector3 scaling(cscaling[0],cscaling[1],cscaling[2]); + shape->setLocalScaling(scaling); +} + + + +void plSetPosition(plRigidBodyHandle object, const plVector3 position) +{ +} +void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation) +{ +} + + +//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); + +// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); diff --git a/Demos/OpenPL_Demo/OpenPL_Demo.c b/Demos/OpenPL_Demo/OpenPL_Demo.c index 639072a7c..cef1f76ae 100644 --- a/Demos/OpenPL_Demo/OpenPL_Demo.c +++ b/Demos/OpenPL_Demo/OpenPL_Demo.c @@ -1,44 +1,44 @@ - -#include "Bullet-C-Api.h" - - -int main() -{ - float timeStep = 1.f/60.f; - - /* initialize */ - plPhysicsSdkHandle sdk = plNewBulletSdk(); - - plDynamicsWorldHandle world = plCreateDynamicsWorld(sdk); - - - float radius = 1.f; - plCollisionShapeHandle collisionShape = plNewSphereShape(radius); - - void* user_data = 0;/* can point to a graphics object */ - - float mass = 1.f; - - plRigidBodyHandle body = plCreateRigidBody(user_data, mass, collisionShape ); - - plAddRigidBody(world, body); - - - - plStepSimulation(world,0.1f); - - /* cleanup */ - - plRemoveRigidBody(world, body); - - - plDeleteRigidBody(body); - - plDeleteShape( collisionShape); - - plDeleteDynamicsWorld( world); - - plDeletePhysicsSdk(sdk); - - return 0; + +#include "Bullet-C-Api.h" + + +int main() +{ + float timeStep = 1.f/60.f; + + /* initialize */ + plPhysicsSdkHandle sdk = plNewBulletSdk(); + + plDynamicsWorldHandle world = plCreateDynamicsWorld(sdk); + + + float radius = 1.f; + plCollisionShapeHandle collisionShape = plNewSphereShape(radius); + + void* user_data = 0;/* can point to a graphics object */ + + float mass = 1.f; + + plRigidBodyHandle body = plCreateRigidBody(user_data, mass, collisionShape ); + + plAddRigidBody(world, body); + + + + plStepSimulation(world,0.1f); + + /* cleanup */ + + plRemoveRigidBody(world, body); + + + plDeleteRigidBody(body); + + plDeleteShape( collisionShape); + + plDeleteDynamicsWorld( world); + + plDeletePhysicsSdk(sdk); + + return 0; } \ No newline at end of file diff --git a/Demos/RagdollDemo/RagdollDemo.cpp b/Demos/RagdollDemo/RagdollDemo.cpp index 2e7bcb7dd..0ec12df1d 100644 --- a/Demos/RagdollDemo/RagdollDemo.cpp +++ b/Demos/RagdollDemo/RagdollDemo.cpp @@ -1,507 +1,507 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Ragdoll Demo -Copyright (c) 2007 Starbreeze Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Marten Svanfeldt -*/ - -#define CONSTRAINT_DEBUG_SIZE 0.2f - - -#include "btBulletDynamicsCommon.h" -#include "GlutStuff.h" -#include "GL_ShapeDrawer.h" - -#include "LinearMath/btIDebugDraw.h" - -#include "GLDebugDrawer.h" -#include "RagdollDemo.h" - - -// Enrico: Shouldn't these three variables be real constants and not defines? - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#ifndef M_PI_2 -#define M_PI_2 1.57079632679489661923 -#endif - -#ifndef M_PI_4 -#define M_PI_4 0.785398163397448309616 -#endif - -class RagDoll -{ - enum - { - BODYPART_PELVIS = 0, - BODYPART_SPINE, - BODYPART_HEAD, - - BODYPART_LEFT_UPPER_LEG, - BODYPART_LEFT_LOWER_LEG, - - BODYPART_RIGHT_UPPER_LEG, - BODYPART_RIGHT_LOWER_LEG, - - BODYPART_LEFT_UPPER_ARM, - BODYPART_LEFT_LOWER_ARM, - - BODYPART_RIGHT_UPPER_ARM, - BODYPART_RIGHT_LOWER_ARM, - - BODYPART_COUNT - }; - - enum - { - JOINT_PELVIS_SPINE = 0, - JOINT_SPINE_HEAD, - - JOINT_LEFT_HIP, - JOINT_LEFT_KNEE, - - JOINT_RIGHT_HIP, - JOINT_RIGHT_KNEE, - - JOINT_LEFT_SHOULDER, - JOINT_LEFT_ELBOW, - - JOINT_RIGHT_SHOULDER, - JOINT_RIGHT_ELBOW, - - JOINT_COUNT - }; - - btDynamicsWorld* m_ownerWorld; - btCollisionShape* m_shapes[BODYPART_COUNT]; - btRigidBody* m_bodies[BODYPART_COUNT]; - btTypedConstraint* m_joints[JOINT_COUNT]; - - btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) - { - bool isDynamic = (mass != 0.f); - - btVector3 localInertia(0,0,0); - if (isDynamic) - shape->calculateLocalInertia(mass,localInertia); - - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - m_ownerWorld->addRigidBody(body); - - return body; - } - -public: - RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset) - : m_ownerWorld (ownerWorld) - { - // Setup the geometry - m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15), btScalar(0.20)); - m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15), btScalar(0.28)); - m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10), btScalar(0.05)); - m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); - m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); - m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); - m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); - m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); - m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); - m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); - m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); - - // Setup all the rigid bodies - btTransform offset; offset.setIdentity(); - offset.setOrigin(positionOffset); - - btTransform transform; - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); - m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); - m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); - m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); - m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); - m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); - m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); - m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,M_PI_2); - m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,M_PI_2); - m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,-M_PI_2); - m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); - - transform.setIdentity(); - transform.setOrigin(btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); - transform.getBasis().setEulerZYX(0,0,-M_PI_2); - m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); - - // Setup some damping on the m_bodies - for (int i = 0; i < BODYPART_COUNT; ++i) - { - m_bodies[i]->setDamping(0.05, 0.85); - m_bodies[i]->setDeactivationTime(0.8); - m_bodies[i]->setSleepingThresholds(1.6, 2.5); - } - - // Now setup the constraints - btHingeConstraint* hingeC; - btConeTwistConstraint* coneC; - - btTransform localA, localB; - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); - hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); - m_joints[JOINT_PELVIS_SPINE] = hingeC; - hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); - coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); - m_joints[JOINT_SPINE_HEAD] = coneC; - coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); - coneC->setLimit(M_PI_4, M_PI_4, 0); - m_joints[JOINT_LEFT_HIP] = coneC; - coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); - hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); - m_joints[JOINT_LEFT_KNEE] = hingeC; - hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); - coneC->setLimit(M_PI_4, M_PI_4, 0); - m_joints[JOINT_RIGHT_HIP] = coneC; - coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); - hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); - m_joints[JOINT_RIGHT_KNEE] = hingeC; - hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); - coneC->setLimit(M_PI_2, M_PI_2, 0); - coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_joints[JOINT_LEFT_SHOULDER] = coneC; - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); -// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); - hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); - m_joints[JOINT_LEFT_ELBOW] = hingeC; - hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); - - - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); - localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); - coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); - coneC->setLimit(M_PI_2, M_PI_2, 0); - m_joints[JOINT_RIGHT_SHOULDER] = coneC; - coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); - - localA.setIdentity(); localB.setIdentity(); - localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); - localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); - hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); -// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); - hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); - m_joints[JOINT_RIGHT_ELBOW] = hingeC; - hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); - - m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); - } - - virtual ~RagDoll () - { - int i; - - // Remove all constraints - for ( i = 0; i < JOINT_COUNT; ++i) - { - m_ownerWorld->removeConstraint(m_joints[i]); - delete m_joints[i]; m_joints[i] = 0; - } - - // Remove all bodies and shapes - for ( i = 0; i < BODYPART_COUNT; ++i) - { - m_ownerWorld->removeRigidBody(m_bodies[i]); - - delete m_bodies[i]->getMotionState(); - - delete m_bodies[i]; m_bodies[i] = 0; - delete m_shapes[i]; m_shapes[i] = 0; - } - } -}; - - - - -void RagdollDemo::initPhysics() -{ - // Setup the basic world - - setTexturing(true); - setShadows(true); - - setCameraDistance(btScalar(5.)); - - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - btVector3 worldAabbMin(-10000,-10000,-10000); - btVector3 worldAabbMax(10000,10000,10000); - m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); - - m_solver = new btSequentialImpulseConstraintSolver; - - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; - //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; - - - - // Setup a big ground box - { - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); - m_collisionShapes.push_back(groundShape); - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-10,0)); - -#define CREATE_GROUND_COLLISION_OBJECT 1 -#ifdef CREATE_GROUND_COLLISION_OBJECT - btCollisionObject* fixedGround = new btCollisionObject(); - fixedGround->setCollisionShape(groundShape); - fixedGround->setWorldTransform(groundTransform); - m_dynamicsWorld->addCollisionObject(fixedGround); -#else - localCreateRigidBody(btScalar(0.),groundTransform,groundShape); -#endif //CREATE_GROUND_COLLISION_OBJECT - - } - - // Spawn one ragdoll - btVector3 startOffset(1,0.5,0); - spawnRagdoll(startOffset); - startOffset.setValue(-1,0.5,0); - spawnRagdoll(startOffset); - - clientResetScene(); -} - -void RagdollDemo::spawnRagdoll(const btVector3& startOffset) -{ - RagDoll* ragDoll = new RagDoll (m_dynamicsWorld, startOffset); - m_ragdolls.push_back(ragDoll); -} - -void RagdollDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - float minFPS = 1000000.f/60.f; - if (ms > minFPS) - ms = minFPS; - - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(ms / 1000000.f); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - - } - - renderme(); - - glFlush(); - - glutSwapBuffers(); -} - -void RagdollDemo::displayCallback() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - -void RagdollDemo::keyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case 'e': - { - btVector3 startOffset(0,2,0); - spawnRagdoll(startOffset); - break; - } - default: - DemoApplication::keyboardCallback(key, x, y); - } - - -} - - - -void RagdollDemo::exitPhysics() -{ - - int i; - - for (i=0;igetNumCollisionObjects()-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;jcalculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + +public: + RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset) + : m_ownerWorld (ownerWorld) + { + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15), btScalar(0.20)); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15), btScalar(0.28)); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10), btScalar(0.05)); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + m_bodies[i]->setSleepingThresholds(1.6, 2.5); + } + + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); +// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); +// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } + + virtual ~RagDoll () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } +}; + + + + +void RagdollDemo::initPhysics() +{ + // Setup the basic world + + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(5.)); + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); + + m_solver = new btSequentialImpulseConstraintSolver; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; + //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; + + + + // Setup a big ground box + { + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-10,0)); + +#define CREATE_GROUND_COLLISION_OBJECT 1 +#ifdef CREATE_GROUND_COLLISION_OBJECT + btCollisionObject* fixedGround = new btCollisionObject(); + fixedGround->setCollisionShape(groundShape); + fixedGround->setWorldTransform(groundTransform); + m_dynamicsWorld->addCollisionObject(fixedGround); +#else + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); +#endif //CREATE_GROUND_COLLISION_OBJECT + + } + + // Spawn one ragdoll + btVector3 startOffset(1,0.5,0); + spawnRagdoll(startOffset); + startOffset.setValue(-1,0.5,0); + spawnRagdoll(startOffset); + + clientResetScene(); +} + +void RagdollDemo::spawnRagdoll(const btVector3& startOffset) +{ + RagDoll* ragDoll = new RagDoll (m_dynamicsWorld, startOffset); + m_ragdolls.push_back(ragDoll); +} + +void RagdollDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + + } + + renderme(); + + glFlush(); + + glutSwapBuffers(); +} + +void RagdollDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + +void RagdollDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 'e': + { + btVector3 startOffset(0,2,0); + spawnRagdoll(startOffset); + break; + } + default: + DemoApplication::keyboardCallback(key, x, y); + } + + +} + + + +void RagdollDemo::exitPhysics() +{ + + int i; + + for (i=0;igetNumCollisionObjects()-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_ragdolls; - - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - -public: - void initPhysics(); - - void exitPhysics(); - - virtual ~RagdollDemo() - { - exitPhysics(); - } - - void spawnRagdoll(const btVector3& startOffset); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - static DemoApplication* Create() - { - RagdollDemo* demo = new RagdollDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } - -}; - - -#endif +/* +Bullet Continuous Collision Detection and Physics Library +RagdollDemo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Marten Svanfeldt +*/ + +#ifndef RAGDOLLDEMO_H +#define RAGDOLLDEMO_H + +#include "GlutDemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +class RagdollDemo : public GlutDemoApplication +{ + + btAlignedObjectArray m_ragdolls; + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + +public: + void initPhysics(); + + void exitPhysics(); + + virtual ~RagdollDemo() + { + exitPhysics(); + } + + void spawnRagdoll(const btVector3& startOffset); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + RagdollDemo* demo = new RagdollDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + + +#endif diff --git a/Demos/RagdollDemo/main.cpp b/Demos/RagdollDemo/main.cpp index 87fdf1cec..0cbf63b9f 100644 --- a/Demos/RagdollDemo/main.cpp +++ b/Demos/RagdollDemo/main.cpp @@ -1,31 +1,31 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com - -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 "RagdollDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" - -GLDebugDrawer gDebugDrawer; - -int main(int argc,char* argv[]) -{ - RagdollDemo demoApp; - - demoApp.initPhysics(); - demoApp.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&demoApp); -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com + +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 "RagdollDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char* argv[]) +{ + RagdollDemo demoApp; + + demoApp.initPhysics(); + demoApp.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&demoApp); +} diff --git a/Demos/Raytracer/Raytracer.h b/Demos/Raytracer/Raytracer.h index f6ece677e..a8ff33f7f 100644 --- a/Demos/Raytracer/Raytracer.h +++ b/Demos/Raytracer/Raytracer.h @@ -1,65 +1,65 @@ -/* -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 RAYTRACER_H -#define RAYTRACER_H - -#include "GlutDemoApplication.h" - -class btDefaultCollisionConfiguration; -class btCollisionDispatcher; -class btAxisSweep3; -class btCollisionWorld; - -///Raytracer shows the inner working of the ray casting, using ray tracing rendering into a texture. -class Raytracer : public GlutDemoApplication -{ - - btDefaultCollisionConfiguration* m_collisionConfiguration; - btCollisionDispatcher* m_dispatcher; - btAxisSweep3* m_overlappingPairCache; - btCollisionWorld* m_collisionWorld; - bool m_initialized; - - public: - - void initPhysics(); - - virtual ~Raytracer(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - ///worldRaytest performs a ray versus all objects in a collision world, returning true is a hit is found (filling in worldNormal and worldHitPoint) - bool worldRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); - - ///singleObjectRaytest performs a ray versus one collision shape, returning true is a hit is found (filling in worldNormal and worldHitPoint) - bool singleObjectRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); - - ///lowlevelRaytest performs a ray versus convex shape, returning true is a hit is found (filling in worldNormal and worldHitPoint) - bool lowlevelRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); - - static DemoApplication* Create() - { - Raytracer* demo = new Raytracer(); - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -#endif //RAYTRACER_H - - +/* +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 RAYTRACER_H +#define RAYTRACER_H + +#include "GlutDemoApplication.h" + +class btDefaultCollisionConfiguration; +class btCollisionDispatcher; +class btAxisSweep3; +class btCollisionWorld; + +///Raytracer shows the inner working of the ray casting, using ray tracing rendering into a texture. +class Raytracer : public GlutDemoApplication +{ + + btDefaultCollisionConfiguration* m_collisionConfiguration; + btCollisionDispatcher* m_dispatcher; + btAxisSweep3* m_overlappingPairCache; + btCollisionWorld* m_collisionWorld; + bool m_initialized; + + public: + + void initPhysics(); + + virtual ~Raytracer(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + ///worldRaytest performs a ray versus all objects in a collision world, returning true is a hit is found (filling in worldNormal and worldHitPoint) + bool worldRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); + + ///singleObjectRaytest performs a ray versus one collision shape, returning true is a hit is found (filling in worldNormal and worldHitPoint) + bool singleObjectRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); + + ///lowlevelRaytest performs a ray versus convex shape, returning true is a hit is found (filling in worldNormal and worldHitPoint) + bool lowlevelRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); + + static DemoApplication* Create() + { + Raytracer* demo = new Raytracer(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //RAYTRACER_H + + diff --git a/Demos/SerializeDemo/SerializeDemo.cpp b/Demos/SerializeDemo/SerializeDemo.cpp index 4f2197eb8..3beda6235 100644 --- a/Demos/SerializeDemo/SerializeDemo.cpp +++ b/Demos/SerializeDemo/SerializeDemo.cpp @@ -1,298 +1,298 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 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. -*/ - - -#define TEST_SERIALIZATION 1 - -#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES -#define CREATE_NEW_BULLETFILE 1 -#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - -///create 125 (5x5x5) dynamic object -#define ARRAY_SIZE_X 5 -#define ARRAY_SIZE_Y 5 -#define ARRAY_SIZE_Z 5 - -//maximum number of objects (and allow user to shoot additional boxes) -#define MAX_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z + 1024) - -///scaling of the objects (0.1 = 20 centimeter boxes ) -#define SCALING 1. -#define START_POS_X -5 -#define START_POS_Y -5 -#define START_POS_Z -3 - -#include "SerializeDemo.h" -#include "GlutStuff.h" -///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. -#include "btBulletDynamicsCommon.h" -#ifdef TEST_SERIALIZATION -#include "LinearMath/btSerializer.h" -#include "btBulletFile.h" -#include "btBulletWorldImporter.h" -#endif //TEST_SERIALIZATION - -#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h" -#include //printf debugging - - -void SerializeDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //simple dynamics world doesn't handle fixed-time-stepping - float ms = getDeltaTimeMicroseconds(); - - ///step the simulation - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(ms / 1000000.f); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - } - - renderme(); - - glFlush(); - - swapBuffers(); - -} - - - -void SerializeDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - //optional but useful: debug drawing to detect problems - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - swapBuffers(); -} - - - -void SerializeDemo::setupEmptyDynamicsWorld() -{ - ///collision configuration contains default setup for memory, collision setup - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - //m_collisionConfiguration->setConvexConvexMultipointIterations(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - m_broadphase = new btDbvtBroadphase(); - - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; - m_solver = sol; - - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - - btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher*)m_dynamicsWorld->getDispatcher()); - - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - -} - -void SerializeDemo::initPhysics() -{ - setTexturing(true); - setShadows(true); - - setCameraDistance(btScalar(SCALING*50.)); - - setupEmptyDynamicsWorld(); - - btBulletWorldImporter* fileLoader = new btBulletWorldImporter(m_dynamicsWorld); -// fileLoader->setVerboseMode(true); - - if (!fileLoader->loadFile("testFile.bullet")) - { - ///create a few basic rigid bodies and save them to testFile.bullet - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); - // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); - btCollisionObject* groundObject = 0; - - - m_collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-50,0)); - - //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: - { - btScalar mass(0.); - - //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) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - m_dynamicsWorld->addRigidBody(body); - groundObject = body; - } - - - { - //create a few dynamic rigidbodies - // Re-using the same collision is better for memory usage and performance - - int numSpheres = 2; - btVector3 positions[2] = {btVector3(0.1f,0.2f,0.3f),btVector3(0.4f,0.5f,0.6f)}; - btScalar radii[2] = {0.3f,0.4f}; - - btMultiSphereShape* colShape = new btMultiSphereShape(positions,radii,numSpheres); - - //btCollisionShape* colShape = new btCapsuleShapeZ(SCALING*1,SCALING*1); - //btCollisionShape* colShape = new btCylinderShapeZ(btVector3(SCALING*1,SCALING*1,SCALING*1)); - //btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); - //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - 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;ksetActivationState(ISLAND_SLEEPING); - - m_dynamicsWorld->addRigidBody(body); - body->setActivationState(ISLAND_SLEEPING); - } - } - } - } - - int maxSerializeBufferSize = 1024*1024*5; - - btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); - - static char* groundName = "GroundName"; - serializer->registerNameForPointer(groundObject, groundName); - - for (int i=0;iregisterNameForPointer(m_collisionShapes[i],name); - } - - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*(btRigidBody*)getDynamicsWorld()->getCollisionObjectArray()[2],btVector3(0,1,0)); - m_dynamicsWorld->addConstraint(p2p); - - const char* name = "constraintje"; - serializer->registerNameForPointer(p2p,name); - - m_dynamicsWorld->serialize(serializer); - - FILE* f2 = fopen("testFile.bullet","wb"); - fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); - fclose(f2); - } - - clientResetScene(); - -} - - -void SerializeDemo::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 //printf debugging + + +void SerializeDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + glFlush(); + + swapBuffers(); + +} + + + +void SerializeDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + swapBuffers(); +} + + + +void SerializeDemo::setupEmptyDynamicsWorld() +{ + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + //m_collisionConfiguration->setConvexConvexMultipointIterations(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + m_broadphase = new btDbvtBroadphase(); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + m_solver = sol; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher*)m_dynamicsWorld->getDispatcher()); + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + +} + +void SerializeDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(SCALING*50.)); + + setupEmptyDynamicsWorld(); + + btBulletWorldImporter* fileLoader = new btBulletWorldImporter(m_dynamicsWorld); +// fileLoader->setVerboseMode(true); + + if (!fileLoader->loadFile("testFile.bullet")) + { + ///create a few basic rigid bodies and save them to testFile.bullet + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + btCollisionObject* groundObject = 0; + + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //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) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + groundObject = body; + } + + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + int numSpheres = 2; + btVector3 positions[2] = {btVector3(0.1f,0.2f,0.3f),btVector3(0.4f,0.5f,0.6f)}; + btScalar radii[2] = {0.3f,0.4f}; + + btMultiSphereShape* colShape = new btMultiSphereShape(positions,radii,numSpheres); + + //btCollisionShape* colShape = new btCapsuleShapeZ(SCALING*1,SCALING*1); + //btCollisionShape* colShape = new btCylinderShapeZ(btVector3(SCALING*1,SCALING*1,SCALING*1)); + //btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + 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;ksetActivationState(ISLAND_SLEEPING); + + m_dynamicsWorld->addRigidBody(body); + body->setActivationState(ISLAND_SLEEPING); + } + } + } + } + + int maxSerializeBufferSize = 1024*1024*5; + + btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); + + static char* groundName = "GroundName"; + serializer->registerNameForPointer(groundObject, groundName); + + for (int i=0;iregisterNameForPointer(m_collisionShapes[i],name); + } + + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*(btRigidBody*)getDynamicsWorld()->getCollisionObjectArray()[2],btVector3(0,1,0)); + m_dynamicsWorld->addConstraint(p2p); + + const char* name = "constraintje"; + serializer->registerNameForPointer(p2p,name); + + m_dynamicsWorld->serialize(serializer); + + FILE* f2 = fopen("testFile.bullet","wb"); + fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); + fclose(f2); + } + + clientResetScene(); + +} + + +void SerializeDemo::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_collisionShapes; - - btBroadphaseInterface* m_broadphase; - - btCollisionDispatcher* m_dispatcher; - - btConstraintSolver* m_solver; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - - public: - - SerializeDemo() - { - } - virtual ~SerializeDemo() - { - exitPhysics(); - } - void initPhysics(); - - void setupEmptyDynamicsWorld(); - - void exitPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - static DemoApplication* Create() - { - SerializeDemo* demo = new SerializeDemo; - demo->myinit(); - demo->initPhysics(); - return demo; - } - - -}; - -#endif //SERIALIZE_DEMO_H - + +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2010 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 SERIALIZE_DEMO_H +#define SERIALIZE_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +///SerializeDemo shows how to use save and load binary .bullet physics files (work-in-progress) +class SerializeDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + public: + + SerializeDemo() + { + } + virtual ~SerializeDemo() + { + exitPhysics(); + } + void initPhysics(); + + void setupEmptyDynamicsWorld(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + SerializeDemo* demo = new SerializeDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + +}; + +#endif //SERIALIZE_DEMO_H + diff --git a/Demos/SerializeDemo/Win32SerializeDemo.cpp b/Demos/SerializeDemo/Win32SerializeDemo.cpp index e9f539c54..0cf13e86b 100644 --- a/Demos/SerializeDemo/Win32SerializeDemo.cpp +++ b/Demos/SerializeDemo/Win32SerializeDemo.cpp @@ -1,25 +1,25 @@ -#ifdef _WINDOWS -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 Erwin Coumans http://bulletphysics.org - -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 "SerializeDemo.h" - -///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo -DemoApplication* createDemo() -{ - return new SerializeDemo(); -} - -#endif +#ifdef _WINDOWS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2010 Erwin Coumans http://bulletphysics.org + +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 "SerializeDemo.h" + +///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo +DemoApplication* createDemo() +{ + return new SerializeDemo(); +} + +#endif diff --git a/Demos/SerializeDemo/main.cpp b/Demos/SerializeDemo/main.cpp index cb529b910..d19b0aa8f 100644 --- a/Demos/SerializeDemo/main.cpp +++ b/Demos/SerializeDemo/main.cpp @@ -1,90 +1,90 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 "SerializeDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btHashMap.h" - -class OurValue - { - int m_uid; - - public: - OurValue(const btVector3& initialPos) - :m_position(initialPos) - { - static int gUid=0; - m_uid=gUid; - gUid++; - } - - btVector3 m_position; - int getUid() const - { - return m_uid; - } - }; - - -int main(int argc,char** argv) -{ - GLDebugDrawer gDebugDrawer; - - ///testing the btHashMap - btHashMap,OurValue> map; - - OurValue value1(btVector3(2,3,4)); - btHashKey key1(value1.getUid()); - map.insert(key1,value1); - - - OurValue value2(btVector3(5,6,7)); - btHashKey key2(value2.getUid()); - map.insert(key2,value2); - - - { - OurValue value3(btVector3(7,8,9)); - btHashKey key3(value3.getUid()); - map.insert(key3,value3); - } - - - map.remove(key2); - -// const OurValue* ourPtr = map.find(key1); -// for (int i=0;im_position.getX(),tmp->m_position.getY(),tmp->m_position.getZ()); -// } - - SerializeDemo ccdDemo; - ccdDemo.initPhysics(); - ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - - -#ifdef CHECK_MEMORY_LEAKS - ccdDemo.exitPhysics(); -#else - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.org",&ccdDemo); -#endif - - //default glut doesn't return from mainloop - return 0; -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 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 "SerializeDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" + +class OurValue + { + int m_uid; + + public: + OurValue(const btVector3& initialPos) + :m_position(initialPos) + { + static int gUid=0; + m_uid=gUid; + gUid++; + } + + btVector3 m_position; + int getUid() const + { + return m_uid; + } + }; + + +int main(int argc,char** argv) +{ + GLDebugDrawer gDebugDrawer; + + ///testing the btHashMap + btHashMap,OurValue> map; + + OurValue value1(btVector3(2,3,4)); + btHashKey key1(value1.getUid()); + map.insert(key1,value1); + + + OurValue value2(btVector3(5,6,7)); + btHashKey key2(value2.getUid()); + map.insert(key2,value2); + + + { + OurValue value3(btVector3(7,8,9)); + btHashKey key3(value3.getUid()); + map.insert(key3,value3); + } + + + map.remove(key2); + +// const OurValue* ourPtr = map.find(key1); +// for (int i=0;im_position.getX(),tmp->m_position.getY(),tmp->m_position.getZ()); +// } + + SerializeDemo ccdDemo; + ccdDemo.initPhysics(); + ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + +#ifdef CHECK_MEMORY_LEAKS + ccdDemo.exitPhysics(); +#else + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.org",&ccdDemo); +#endif + + //default glut doesn't return from mainloop + return 0; +} + diff --git a/Demos/SimplexDemo/SimplexDemo.h b/Demos/SimplexDemo/SimplexDemo.h index 7bd3ec963..72f620039 100644 --- a/Demos/SimplexDemo/SimplexDemo.h +++ b/Demos/SimplexDemo/SimplexDemo.h @@ -1,36 +1,36 @@ -/* -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 SIMPLEX_DEMO_H -#define SIMPLEX_DEMO_H - -#include "GlutDemoApplication.h" - -///SimplexDemo shows the working of the sub-distance algorithm, used inside GJK -class SimplexDemo : public GlutDemoApplication -{ - public: - - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - -}; - -#endif //SIMPLEX_DEMO_H - - +/* +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 SIMPLEX_DEMO_H +#define SIMPLEX_DEMO_H + +#include "GlutDemoApplication.h" + +///SimplexDemo shows the working of the sub-distance algorithm, used inside GJK +class SimplexDemo : public GlutDemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + +}; + +#endif //SIMPLEX_DEMO_H + + diff --git a/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp b/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp index f7a584fba..9b6db8a21 100755 --- a/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp +++ b/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp @@ -1,511 +1,511 @@ -/* -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. -*/ - -/* -Added by Roman Ponomarev (rponom@gmail.com) -April 04, 2008 - -Added support for ODE sover -April 24, 2008 -*/ - - - - -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btIDebugDraw.h" - -#include "GLDebugDrawer.h" - - -#include //printf debugging - -#include "SliderConstraintDemo.h" -#include "GL_ShapeDrawer.h" -#include "GlutStuff.h" - - - -#define SLIDER_DEMO_USE_ODE_SOLVER 0 -#define SLIDER_DEMO_USE_6DOF 0 - -#define CUBE_HALF_EXTENTS 1.f - -#define SLIDER_ENABLE_ALL_DEMOS 1 - - - -// A couple of sliders -#if SLIDER_DEMO_USE_6DOF - static btGeneric6DofConstraint *spSlider1, *spSlider2; -#else - static btSliderConstraint *spSlider1, *spSlider2; -#endif - -static btPoint2PointConstraint* spP2PConst; -static btHingeConstraint* spHingeConst; - - - -static void draw_axes(const btRigidBody& rb, const btTransform& frame) -{ - glBegin(GL_LINES); - // draw world transform - btVector3 from = rb.getWorldTransform().getOrigin(); - btVector3 to = from + rb.getWorldTransform().getBasis() * btVector3(5,0,0); - // X in red - glColor3f(255.0F, 0.0F, 0.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - to = from + rb.getWorldTransform().getBasis() * btVector3(0,5,0); - // Y in green - glColor3f(0.0F, 255.0F, 0.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - to = from + rb.getWorldTransform().getBasis() * btVector3(0,0,5); - // Z in blue - glColor3f(0.0F, 0.0F, 255.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - // draw slider frame - btTransform calc_frame = rb.getWorldTransform() * frame; - from = calc_frame.getOrigin(); - to = from + calc_frame.getBasis() * btVector3(10,0,0); - // X in red - glColor3f(255.0F, 0.0F, 0.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - to = from + calc_frame.getBasis() * btVector3(0,10,0); - // Y in green - glColor3f(0.0F, 255.0F, 0.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - to = from + calc_frame.getBasis() * btVector3(0,0,10); - // Z in blue - glColor3f(0.0F, 0.0F, 255.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - glEnd(); -} // draw_axes() - - - -#if SLIDER_DEMO_USE_6DOF -static void drawSlider(btGeneric6DofConstraint* pSlider) -{ - draw_axes(pSlider->getRigidBodyA(), pSlider->getFrameOffsetA()); - draw_axes(pSlider->getRigidBodyB(), pSlider->getFrameOffsetB()); -} // drawSlider() -#else -static void drawSlider(btSliderConstraint* pSlider) -{ - draw_axes(pSlider->getRigidBodyA(), pSlider->getFrameOffsetA()); - draw_axes(pSlider->getRigidBodyB(), pSlider->getFrameOffsetB()); - // draw limits in white - btVector3 from(pSlider->getLowerLinLimit(), 0, 0); - btVector3 to(pSlider->getUpperLinLimit(), 0, 0); - btTransform trans; - if(pSlider->getUseLinearReferenceFrameA()) - { - trans = pSlider->getRigidBodyA().getWorldTransform() * pSlider->getFrameOffsetA(); - } - else - { - trans = pSlider->getRigidBodyB().getWorldTransform() * pSlider->getFrameOffsetB(); - } - from = trans * from; - to = trans * to; - glBegin(GL_LINES); - glColor3f(255.0F, 255.0F, 255.0F); - glVertex3d(from.getX(), from.getY(), from.getZ()); - glVertex3d(to.getX(), to.getY(), to.getZ()); - glEnd(); -} // drawSlider() -#endif - - - -void SliderConstraintDemo::initPhysics() -{ - setTexturing(true); - setShadows(true); - - setCameraDistance(26.f); - - // init world - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - btVector3 worldMin(-1000,-1000,-1000); - btVector3 worldMax(1000,1000,1000); - m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); - -#if SLIDER_DEMO_USE_ODE_SOLVER - m_constraintSolver = new btOdeQuickstepConstraintSolver(); -#else - m_constraintSolver = new btSequentialImpulseConstraintSolver(); -#endif - - btDiscreteDynamicsWorld* wp = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); - // wp->getSolverInfo().m_numIterations = 20; // default is 10 - m_dynamicsWorld = wp; -// wp->getSolverInfo().m_erp = 0.8; - - // add floor - //btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); - m_collisionShapes.push_back(groundShape); - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-76,0)); - btRigidBody* groundBody = localCreateRigidBody(0, groundTransform, groundShape); - - // add box shape (will be reused for all bodies) - btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); - m_collisionShapes.push_back(shape); - // mass of dymamic bodies - btScalar mass = btScalar(1.); - - // add dynamic rigid body A1 - btTransform trans; - trans.setIdentity(); - btVector3 worldPos(-20,0,0); - trans.setOrigin(worldPos); - btTransform frameInA, frameInB; - frameInA = btTransform::getIdentity(); - frameInB = btTransform::getIdentity(); - -#if SLIDER_ENABLE_ALL_DEMOS - btRigidBody* pRbA1 = localCreateRigidBody(mass, trans, shape); -// btRigidBody* pRbA1 = localCreateRigidBody(0.f, trans, shape); - pRbA1->setActivationState(DISABLE_DEACTIVATION); - - // add dynamic rigid body B1 - worldPos.setValue(-30,0,0); - trans.setOrigin(worldPos); - btRigidBody* pRbB1 = localCreateRigidBody(mass, trans, shape); -// btRigidBody* pRbB1 = localCreateRigidBody(0.f, trans, shape); - pRbB1->setActivationState(DISABLE_DEACTIVATION); - - // create slider constraint between A1 and B1 and add it to world - -#if SLIDER_DEMO_USE_6DOF - spSlider1 = new btGeneric6DofConstraint(*pRbA1, *pRbB1, frameInA, frameInB, true); - btVector3 lowerSliderLimit = btVector3(-20,0,0); - btVector3 hiSliderLimit = btVector3(-10,0,0); -// btVector3 lowerSliderLimit = btVector3(-20,-5,-5); -// btVector3 hiSliderLimit = btVector3(-10,5,5); - spSlider1->setLinearLowerLimit(lowerSliderLimit); - spSlider1->setLinearUpperLimit(hiSliderLimit); - spSlider1->setAngularLowerLimit(btVector3(0,0,0)); - spSlider1->setAngularUpperLimit(btVector3(0,0,0)); -#else - spSlider1 = new btSliderConstraint(*pRbA1, *pRbB1, frameInA, frameInB, true); -// spSlider1 = new btSliderConstraint(*pRbA1, *pRbB1, frameInA, frameInB, false); - spSlider1->setLowerLinLimit(-15.0F); - spSlider1->setUpperLinLimit(-5.0F); -// spSlider1->setLowerLinLimit(5.0F); -// spSlider1->setUpperLinLimit(15.0F); -// spSlider1->setLowerLinLimit(-10.0F); -// spSlider1->setUpperLinLimit(-10.0F); - - spSlider1->setLowerAngLimit(-SIMD_PI / 3.0F); - spSlider1->setUpperAngLimit( SIMD_PI / 3.0F); -#endif - - m_dynamicsWorld->addConstraint(spSlider1, true); - spSlider1->setDbgDrawSize(btScalar(5.f)); -#endif - -#if SLIDER_ENABLE_ALL_DEMOS - // add kinematic rigid body A2 -// worldPos.setValue(20,4,0); - worldPos.setValue(5,-20,0); - trans.setOrigin(worldPos); - btRigidBody* pRbA2 = localCreateRigidBody(0., trans, shape); -// btRigidBody* pRbA2 = localCreateRigidBody(mass, trans, shape); -// btRigidBody* pRbA2 = localCreateRigidBody(mass * 10000, trans, shape); - pRbA2->setActivationState(DISABLE_DEACTIVATION); - - // add dynamic rigid body B2 -// worldPos.setValue(-20,4,0); - worldPos.setValue(-5,-20,0); - trans.setOrigin(worldPos); -// btRigidBody* pRbB2 = localCreateRigidBody(0., trans, shape); - btRigidBody* pRbB2 = localCreateRigidBody(mass, trans, shape); -// btRigidBody* pRbB2 = localCreateRigidBody(mass * 10000, trans, shape); - pRbB2->setActivationState(DISABLE_DEACTIVATION); - -// frameInA.getBasis().setEulerZYX(1.f, 1.f, 1.f); -// frameInB.getBasis().setEulerZYX(1.f, 1.f, 1.f); -// frameInA.getBasis().setEulerZYX(1.f, 1.f, 1.f); -// frameInB.getBasis().setEulerZYX(1.f, 1.f, 1.f); - - -// frameInA.setOrigin(btVector3(-20., 5., 0)); -// frameInB.setOrigin(btVector3( 20., 5., 0)); - frameInA.setOrigin(btVector3(-5., 20., 0)); - frameInB.setOrigin(btVector3( 5., 20., 0)); - - - // create slider constraint between A2 and B2 and add it to world -#if SLIDER_DEMO_USE_6DOF - spSlider2 = new btGeneric6DofConstraint(*pRbA2, *pRbB2, frameInA, frameInB, true); - spSlider2->setLinearLowerLimit(lowerSliderLimit); - spSlider2->setLinearUpperLimit(hiSliderLimit); - spSlider2->setAngularLowerLimit(btVector3(0,0,0)); - spSlider2->setAngularUpperLimit(btVector3(0,0,0)); -#else - spSlider2 = new btSliderConstraint(*pRbA2, *pRbB2, frameInA, frameInB, true); -// spSlider2 = new btSliderConstraint(*pRbA2, *pRbB2, frameInA, frameInB, false); -// spSlider2->setLowerLinLimit(0.0F); -// spSlider2->setUpperLinLimit(0.0F); - spSlider2->setLowerLinLimit(-2.0F); - spSlider2->setUpperLinLimit(2.0F); -// spSlider2->setLowerLinLimit(5.0F); -// spSlider2->setUpperLinLimit(25.0F); -// spSlider2->setUpperLinLimit(-5.0F); -// spSlider2->setUpperLinLimit(-9.99F); - - -// spSlider2->setLowerAngLimit(SIMD_PI / 2.0F); -// spSlider2->setUpperAngLimit(-SIMD_PI / 2.0F); - - // spSlider2->setLowerAngLimit(-SIMD_PI / 2.0F); -// spSlider2->setUpperAngLimit(SIMD_PI / 2.0F); - -// spSlider2->setLowerAngLimit(-SIMD_PI); -// spSlider2->setUpperAngLimit(SIMD_PI *0.8F); - - -// spSlider2->setLowerAngLimit(-0.01F); -// spSlider2->setUpperAngLimit(0.01F); - spSlider2->setLowerAngLimit(-1.570796326F * 0.5f); - spSlider2->setUpperAngLimit(1.570796326F * 0.5f); -// spSlider2->setLowerAngLimit(1.F); -// spSlider2->setUpperAngLimit(-1.F); - - -// spSlider2->setDampingLimLin(0.5f); - -#if 0 - // add motors - spSlider2->setPoweredLinMotor(true); - spSlider2->setMaxLinMotorForce(0.1); - spSlider2->setTargetLinMotorVelocity(-5.0); - - spSlider2->setPoweredAngMotor(true); -// spSlider2->setMaxAngMotorForce(0.01); - spSlider2->setMaxAngMotorForce(10.0); - spSlider2->setTargetAngMotorVelocity(1.0); - - // change default damping and restitution - - spSlider2->setDampingDirLin(0.005F); - spSlider2->setRestitutionLimLin(1.1F); -#endif - - // various ODE tests -// spSlider2->setDampingLimLin(0.1F); // linear bounce factor for ODE == 1.0 - DampingLimLin; -// spSlider2->setDampingLimAng(0.1F); // angular bounce factor for ODE == 1.0 - DampingLimAng; -// spSlider2->setSoftnessOrthoAng(0.1); -// spSlider2->setSoftnessOrthoLin(0.1); -// spSlider2->setSoftnessLimLin(0.1); -// spSlider2->setSoftnessLimAng(0.1); -#endif - m_dynamicsWorld->addConstraint(spSlider2, true); - spSlider2->setDbgDrawSize(btScalar(5.f)); -#endif - -#if SLIDER_ENABLE_ALL_DEMOS -{ - // add dynamic rigid body A1 - trans.setIdentity(); - worldPos.setValue(20,0,0); - trans.setOrigin(worldPos); - btRigidBody* pRbA3 = localCreateRigidBody(0.0F, trans, shape); - pRbA3->setActivationState(DISABLE_DEACTIVATION); - - // add dynamic rigid body B1 - worldPos.setValue(25,0,0); - trans.setOrigin(worldPos); - btRigidBody* pRbB3 = localCreateRigidBody(mass, trans, shape); - pRbB3->setActivationState(DISABLE_DEACTIVATION); - - btVector3 pivA( 2.5, 0., 0.); - btVector3 pivB(-2.5, 0., 0.); - spP2PConst = new btPoint2PointConstraint(*pRbA3, *pRbB3, pivA, pivB); - m_dynamicsWorld->addConstraint(spP2PConst, true); - spP2PConst->setDbgDrawSize(btScalar(5.f)); - -} -#endif - -#if 0 // SLIDER_ENABLE_ALL_DEMOS - // add dynamic rigid body A4 - trans.setIdentity(); - worldPos.setValue(20,10,0); - trans.setOrigin(worldPos); - btRigidBody* pRbA4 = localCreateRigidBody(0.0F, trans, shape); - pRbA4->setActivationState(DISABLE_DEACTIVATION); - - // add dynamic rigid body B1 - worldPos.setValue(27,10,0); - trans.setOrigin(worldPos); - btRigidBody* pRbB4 = localCreateRigidBody(mass, trans, shape); - pRbB1->setActivationState(DISABLE_DEACTIVATION); - - - btVector3 pivA( 2., 0., 0.); - btVector3 pivB(-5., 0., 0.); - btVector3 axisA(0., 0., 1.); - btVector3 axisB(0., 0., 1.); - - spHingeConst = new btHingeConstraint(*pRbA4, *pRbB4, pivA, pivB, axisA, axisB); -// spHingeConst->setLimit(-1.57, 1.57); - spHingeConst->setLimit(1.57, -1.57); - spHingeConst->enableAngularMotor(true, 10.0, 0.19); - - m_dynamicsWorld->addConstraint(spHingeConst, true); - spHingeConst->setDbgDrawSize(btScalar(5.f)); - -#endif - -} // SliderConstraintDemo::initPhysics() - - - -SliderConstraintDemo::~SliderConstraintDemo() -{ - //cleanup in the reverse order of creation/initialization - int i; - //removed/delete constraints - for (i=m_dynamicsWorld->getNumConstraints()-1; i>=0 ;i--) - { - btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); - m_dynamicsWorld->removeConstraint(constraint); - delete constraint; - } - //remove the rigidbodies from the dynamics world and delete them - 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;jstepSimulation(dt,maxSimSubSteps); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - bool verbose = false; - if (verbose) - { - 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); - } - } - } - renderme(); -// drawSlider(spSlider1); -// drawSlider(spSlider2); - glFlush(); - glutSwapBuffers(); -} // SliderConstraintDemo::clientMoveAndDisplay() - - - -void SliderConstraintDemo::displayCallback(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - if(m_dynamicsWorld) - { - m_dynamicsWorld->debugDrawWorld(); - } -// drawSlider(spSlider1); -// drawSlider(spSlider2); - renderme(); - glFlush(); - glutSwapBuffers(); -} // SliderConstraintDemo::displayCallback() - - -void SliderConstraintDemo::keyboardCallback(unsigned char key, int x, int y) -{ - (void)x; - (void)y; - switch (key) - { - case 'O' : - { - bool offectOnOff; - offectOnOff = spSlider1->getUseFrameOffset(); - offectOnOff = !offectOnOff; - spSlider1->setUseFrameOffset(offectOnOff); - printf("Slider1 %s frame offset\n", offectOnOff ? "uses" : "does not use"); - offectOnOff = spSlider2->getUseFrameOffset(); - offectOnOff = !offectOnOff; - spSlider2->setUseFrameOffset(offectOnOff); - printf("Slider2 %s frame offset\n", offectOnOff ? "uses" : "does not use"); - } - break; - default : - { - DemoApplication::keyboardCallback(key, x, y); - } - break; - } -} - +/* +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. +*/ + +/* +Added by Roman Ponomarev (rponom@gmail.com) +April 04, 2008 + +Added support for ODE sover +April 24, 2008 +*/ + + + + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" + + +#include //printf debugging + +#include "SliderConstraintDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + + + +#define SLIDER_DEMO_USE_ODE_SOLVER 0 +#define SLIDER_DEMO_USE_6DOF 0 + +#define CUBE_HALF_EXTENTS 1.f + +#define SLIDER_ENABLE_ALL_DEMOS 1 + + + +// A couple of sliders +#if SLIDER_DEMO_USE_6DOF + static btGeneric6DofConstraint *spSlider1, *spSlider2; +#else + static btSliderConstraint *spSlider1, *spSlider2; +#endif + +static btPoint2PointConstraint* spP2PConst; +static btHingeConstraint* spHingeConst; + + + +static void draw_axes(const btRigidBody& rb, const btTransform& frame) +{ + glBegin(GL_LINES); + // draw world transform + btVector3 from = rb.getWorldTransform().getOrigin(); + btVector3 to = from + rb.getWorldTransform().getBasis() * btVector3(5,0,0); + // X in red + glColor3f(255.0F, 0.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + rb.getWorldTransform().getBasis() * btVector3(0,5,0); + // Y in green + glColor3f(0.0F, 255.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + rb.getWorldTransform().getBasis() * btVector3(0,0,5); + // Z in blue + glColor3f(0.0F, 0.0F, 255.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + // draw slider frame + btTransform calc_frame = rb.getWorldTransform() * frame; + from = calc_frame.getOrigin(); + to = from + calc_frame.getBasis() * btVector3(10,0,0); + // X in red + glColor3f(255.0F, 0.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + calc_frame.getBasis() * btVector3(0,10,0); + // Y in green + glColor3f(0.0F, 255.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + calc_frame.getBasis() * btVector3(0,0,10); + // Z in blue + glColor3f(0.0F, 0.0F, 255.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} // draw_axes() + + + +#if SLIDER_DEMO_USE_6DOF +static void drawSlider(btGeneric6DofConstraint* pSlider) +{ + draw_axes(pSlider->getRigidBodyA(), pSlider->getFrameOffsetA()); + draw_axes(pSlider->getRigidBodyB(), pSlider->getFrameOffsetB()); +} // drawSlider() +#else +static void drawSlider(btSliderConstraint* pSlider) +{ + draw_axes(pSlider->getRigidBodyA(), pSlider->getFrameOffsetA()); + draw_axes(pSlider->getRigidBodyB(), pSlider->getFrameOffsetB()); + // draw limits in white + btVector3 from(pSlider->getLowerLinLimit(), 0, 0); + btVector3 to(pSlider->getUpperLinLimit(), 0, 0); + btTransform trans; + if(pSlider->getUseLinearReferenceFrameA()) + { + trans = pSlider->getRigidBodyA().getWorldTransform() * pSlider->getFrameOffsetA(); + } + else + { + trans = pSlider->getRigidBodyB().getWorldTransform() * pSlider->getFrameOffsetB(); + } + from = trans * from; + to = trans * to; + glBegin(GL_LINES); + glColor3f(255.0F, 255.0F, 255.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} // drawSlider() +#endif + + + +void SliderConstraintDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(26.f); + + // init world + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); + +#if SLIDER_DEMO_USE_ODE_SOLVER + m_constraintSolver = new btOdeQuickstepConstraintSolver(); +#else + m_constraintSolver = new btSequentialImpulseConstraintSolver(); +#endif + + btDiscreteDynamicsWorld* wp = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + // wp->getSolverInfo().m_numIterations = 20; // default is 10 + m_dynamicsWorld = wp; +// wp->getSolverInfo().m_erp = 0.8; + + // add floor + //btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-76,0)); + btRigidBody* groundBody = localCreateRigidBody(0, groundTransform, groundShape); + + // add box shape (will be reused for all bodies) + btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); + m_collisionShapes.push_back(shape); + // mass of dymamic bodies + btScalar mass = btScalar(1.); + + // add dynamic rigid body A1 + btTransform trans; + trans.setIdentity(); + btVector3 worldPos(-20,0,0); + trans.setOrigin(worldPos); + btTransform frameInA, frameInB; + frameInA = btTransform::getIdentity(); + frameInB = btTransform::getIdentity(); + +#if SLIDER_ENABLE_ALL_DEMOS + btRigidBody* pRbA1 = localCreateRigidBody(mass, trans, shape); +// btRigidBody* pRbA1 = localCreateRigidBody(0.f, trans, shape); + pRbA1->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B1 + worldPos.setValue(-30,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB1 = localCreateRigidBody(mass, trans, shape); +// btRigidBody* pRbB1 = localCreateRigidBody(0.f, trans, shape); + pRbB1->setActivationState(DISABLE_DEACTIVATION); + + // create slider constraint between A1 and B1 and add it to world + +#if SLIDER_DEMO_USE_6DOF + spSlider1 = new btGeneric6DofConstraint(*pRbA1, *pRbB1, frameInA, frameInB, true); + btVector3 lowerSliderLimit = btVector3(-20,0,0); + btVector3 hiSliderLimit = btVector3(-10,0,0); +// btVector3 lowerSliderLimit = btVector3(-20,-5,-5); +// btVector3 hiSliderLimit = btVector3(-10,5,5); + spSlider1->setLinearLowerLimit(lowerSliderLimit); + spSlider1->setLinearUpperLimit(hiSliderLimit); + spSlider1->setAngularLowerLimit(btVector3(0,0,0)); + spSlider1->setAngularUpperLimit(btVector3(0,0,0)); +#else + spSlider1 = new btSliderConstraint(*pRbA1, *pRbB1, frameInA, frameInB, true); +// spSlider1 = new btSliderConstraint(*pRbA1, *pRbB1, frameInA, frameInB, false); + spSlider1->setLowerLinLimit(-15.0F); + spSlider1->setUpperLinLimit(-5.0F); +// spSlider1->setLowerLinLimit(5.0F); +// spSlider1->setUpperLinLimit(15.0F); +// spSlider1->setLowerLinLimit(-10.0F); +// spSlider1->setUpperLinLimit(-10.0F); + + spSlider1->setLowerAngLimit(-SIMD_PI / 3.0F); + spSlider1->setUpperAngLimit( SIMD_PI / 3.0F); +#endif + + m_dynamicsWorld->addConstraint(spSlider1, true); + spSlider1->setDbgDrawSize(btScalar(5.f)); +#endif + +#if SLIDER_ENABLE_ALL_DEMOS + // add kinematic rigid body A2 +// worldPos.setValue(20,4,0); + worldPos.setValue(5,-20,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA2 = localCreateRigidBody(0., trans, shape); +// btRigidBody* pRbA2 = localCreateRigidBody(mass, trans, shape); +// btRigidBody* pRbA2 = localCreateRigidBody(mass * 10000, trans, shape); + pRbA2->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B2 +// worldPos.setValue(-20,4,0); + worldPos.setValue(-5,-20,0); + trans.setOrigin(worldPos); +// btRigidBody* pRbB2 = localCreateRigidBody(0., trans, shape); + btRigidBody* pRbB2 = localCreateRigidBody(mass, trans, shape); +// btRigidBody* pRbB2 = localCreateRigidBody(mass * 10000, trans, shape); + pRbB2->setActivationState(DISABLE_DEACTIVATION); + +// frameInA.getBasis().setEulerZYX(1.f, 1.f, 1.f); +// frameInB.getBasis().setEulerZYX(1.f, 1.f, 1.f); +// frameInA.getBasis().setEulerZYX(1.f, 1.f, 1.f); +// frameInB.getBasis().setEulerZYX(1.f, 1.f, 1.f); + + +// frameInA.setOrigin(btVector3(-20., 5., 0)); +// frameInB.setOrigin(btVector3( 20., 5., 0)); + frameInA.setOrigin(btVector3(-5., 20., 0)); + frameInB.setOrigin(btVector3( 5., 20., 0)); + + + // create slider constraint between A2 and B2 and add it to world +#if SLIDER_DEMO_USE_6DOF + spSlider2 = new btGeneric6DofConstraint(*pRbA2, *pRbB2, frameInA, frameInB, true); + spSlider2->setLinearLowerLimit(lowerSliderLimit); + spSlider2->setLinearUpperLimit(hiSliderLimit); + spSlider2->setAngularLowerLimit(btVector3(0,0,0)); + spSlider2->setAngularUpperLimit(btVector3(0,0,0)); +#else + spSlider2 = new btSliderConstraint(*pRbA2, *pRbB2, frameInA, frameInB, true); +// spSlider2 = new btSliderConstraint(*pRbA2, *pRbB2, frameInA, frameInB, false); +// spSlider2->setLowerLinLimit(0.0F); +// spSlider2->setUpperLinLimit(0.0F); + spSlider2->setLowerLinLimit(-2.0F); + spSlider2->setUpperLinLimit(2.0F); +// spSlider2->setLowerLinLimit(5.0F); +// spSlider2->setUpperLinLimit(25.0F); +// spSlider2->setUpperLinLimit(-5.0F); +// spSlider2->setUpperLinLimit(-9.99F); + + +// spSlider2->setLowerAngLimit(SIMD_PI / 2.0F); +// spSlider2->setUpperAngLimit(-SIMD_PI / 2.0F); + + // spSlider2->setLowerAngLimit(-SIMD_PI / 2.0F); +// spSlider2->setUpperAngLimit(SIMD_PI / 2.0F); + +// spSlider2->setLowerAngLimit(-SIMD_PI); +// spSlider2->setUpperAngLimit(SIMD_PI *0.8F); + + +// spSlider2->setLowerAngLimit(-0.01F); +// spSlider2->setUpperAngLimit(0.01F); + spSlider2->setLowerAngLimit(-1.570796326F * 0.5f); + spSlider2->setUpperAngLimit(1.570796326F * 0.5f); +// spSlider2->setLowerAngLimit(1.F); +// spSlider2->setUpperAngLimit(-1.F); + + +// spSlider2->setDampingLimLin(0.5f); + +#if 0 + // add motors + spSlider2->setPoweredLinMotor(true); + spSlider2->setMaxLinMotorForce(0.1); + spSlider2->setTargetLinMotorVelocity(-5.0); + + spSlider2->setPoweredAngMotor(true); +// spSlider2->setMaxAngMotorForce(0.01); + spSlider2->setMaxAngMotorForce(10.0); + spSlider2->setTargetAngMotorVelocity(1.0); + + // change default damping and restitution + + spSlider2->setDampingDirLin(0.005F); + spSlider2->setRestitutionLimLin(1.1F); +#endif + + // various ODE tests +// spSlider2->setDampingLimLin(0.1F); // linear bounce factor for ODE == 1.0 - DampingLimLin; +// spSlider2->setDampingLimAng(0.1F); // angular bounce factor for ODE == 1.0 - DampingLimAng; +// spSlider2->setSoftnessOrthoAng(0.1); +// spSlider2->setSoftnessOrthoLin(0.1); +// spSlider2->setSoftnessLimLin(0.1); +// spSlider2->setSoftnessLimAng(0.1); +#endif + m_dynamicsWorld->addConstraint(spSlider2, true); + spSlider2->setDbgDrawSize(btScalar(5.f)); +#endif + +#if SLIDER_ENABLE_ALL_DEMOS +{ + // add dynamic rigid body A1 + trans.setIdentity(); + worldPos.setValue(20,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA3 = localCreateRigidBody(0.0F, trans, shape); + pRbA3->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B1 + worldPos.setValue(25,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB3 = localCreateRigidBody(mass, trans, shape); + pRbB3->setActivationState(DISABLE_DEACTIVATION); + + btVector3 pivA( 2.5, 0., 0.); + btVector3 pivB(-2.5, 0., 0.); + spP2PConst = new btPoint2PointConstraint(*pRbA3, *pRbB3, pivA, pivB); + m_dynamicsWorld->addConstraint(spP2PConst, true); + spP2PConst->setDbgDrawSize(btScalar(5.f)); + +} +#endif + +#if 0 // SLIDER_ENABLE_ALL_DEMOS + // add dynamic rigid body A4 + trans.setIdentity(); + worldPos.setValue(20,10,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA4 = localCreateRigidBody(0.0F, trans, shape); + pRbA4->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B1 + worldPos.setValue(27,10,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB4 = localCreateRigidBody(mass, trans, shape); + pRbB1->setActivationState(DISABLE_DEACTIVATION); + + + btVector3 pivA( 2., 0., 0.); + btVector3 pivB(-5., 0., 0.); + btVector3 axisA(0., 0., 1.); + btVector3 axisB(0., 0., 1.); + + spHingeConst = new btHingeConstraint(*pRbA4, *pRbB4, pivA, pivB, axisA, axisB); +// spHingeConst->setLimit(-1.57, 1.57); + spHingeConst->setLimit(1.57, -1.57); + spHingeConst->enableAngularMotor(true, 10.0, 0.19); + + m_dynamicsWorld->addConstraint(spHingeConst, true); + spHingeConst->setDbgDrawSize(btScalar(5.f)); + +#endif + +} // SliderConstraintDemo::initPhysics() + + + +SliderConstraintDemo::~SliderConstraintDemo() +{ + //cleanup in the reverse order of creation/initialization + int i; + //removed/delete constraints + for (i=m_dynamicsWorld->getNumConstraints()-1; i>=0 ;i--) + { + btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); + m_dynamicsWorld->removeConstraint(constraint); + delete constraint; + } + //remove the rigidbodies from the dynamics world and delete them + 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;jstepSimulation(dt,maxSimSubSteps); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + bool verbose = false; + if (verbose) + { + 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); + } + } + } + renderme(); +// drawSlider(spSlider1); +// drawSlider(spSlider2); + glFlush(); + glutSwapBuffers(); +} // SliderConstraintDemo::clientMoveAndDisplay() + + + +void SliderConstraintDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + if(m_dynamicsWorld) + { + m_dynamicsWorld->debugDrawWorld(); + } +// drawSlider(spSlider1); +// drawSlider(spSlider2); + renderme(); + glFlush(); + glutSwapBuffers(); +} // SliderConstraintDemo::displayCallback() + + +void SliderConstraintDemo::keyboardCallback(unsigned char key, int x, int y) +{ + (void)x; + (void)y; + switch (key) + { + case 'O' : + { + bool offectOnOff; + offectOnOff = spSlider1->getUseFrameOffset(); + offectOnOff = !offectOnOff; + spSlider1->setUseFrameOffset(offectOnOff); + printf("Slider1 %s frame offset\n", offectOnOff ? "uses" : "does not use"); + offectOnOff = spSlider2->getUseFrameOffset(); + offectOnOff = !offectOnOff; + spSlider2->setUseFrameOffset(offectOnOff); + printf("Slider2 %s frame offset\n", offectOnOff ? "uses" : "does not use"); + } + break; + default : + { + DemoApplication::keyboardCallback(key, x, y); + } + break; + } +} + diff --git a/Demos/SoftDemo/CMakeLists.txt b/Demos/SoftDemo/CMakeLists.txt index dd562a97d..c92199df8 100644 --- a/Demos/SoftDemo/CMakeLists.txt +++ b/Demos/SoftDemo/CMakeLists.txt @@ -1,64 +1,64 @@ -# 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 -######################################################## - -IF (USE_GLUT) - - INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL - ) - - LINK_LIBRARIES( - OpenGLSupport BulletSoftBody BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} - ) - - IF (WIN32) - ADD_EXECUTABLE(AppSoftBodyDemo - main.cpp - SoftDemo.cpp - ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc - ) - ELSE() - ADD_EXECUTABLE(AppSoftBodyDemo - main.cpp - SoftDemo.cpp - - ) - ENDIF() - - IF (WIN32) - IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - IF (CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppSoftBodyDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} - ) - ELSE(CMAKE_CL_64) - ADD_CUSTOM_COMMAND( - TARGET AppSoftBodyDemo - POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} - ) - ENDIF(CMAKE_CL_64) - ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) - ENDIF(WIN32) - - -ELSE(USE_GLUT) - -ENDIF (USE_GLUT) - -IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) - SET_TARGET_PROPERTIES(AppSoftBodyDemo PROPERTIES DEBUG_POSTFIX "_Debug") - SET_TARGET_PROPERTIES(AppSoftBodyDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") - SET_TARGET_PROPERTIES(AppSoftBodyDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") +# 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 +######################################################## + +IF (USE_GLUT) + + INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL + ) + + LINK_LIBRARIES( + OpenGLSupport BulletSoftBody BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + ) + + IF (WIN32) + ADD_EXECUTABLE(AppSoftBodyDemo + main.cpp + SoftDemo.cpp + ${BULLET_PHYSICS_SOURCE_DIR}/msvc/bullet.rc + ) + ELSE() + ADD_EXECUTABLE(AppSoftBodyDemo + main.cpp + SoftDemo.cpp + + ) + ENDIF() + + IF (WIN32) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppSoftBodyDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + ELSE(CMAKE_CL_64) + ADD_CUSTOM_COMMAND( + TARGET AppSoftBodyDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR} + ) + ENDIF(CMAKE_CL_64) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ENDIF(WIN32) + + +ELSE(USE_GLUT) + +ENDIF (USE_GLUT) + +IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) + SET_TARGET_PROPERTIES(AppSoftBodyDemo PROPERTIES DEBUG_POSTFIX "_Debug") + SET_TARGET_PROPERTIES(AppSoftBodyDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") + SET_TARGET_PROPERTIES(AppSoftBodyDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file diff --git a/Demos/SoftDemo/SoftDemo.cpp b/Demos/SoftDemo/SoftDemo.cpp index 0792f3616..fdd28d7e4 100644 --- a/Demos/SoftDemo/SoftDemo.cpp +++ b/Demos/SoftDemo/SoftDemo.cpp @@ -1,1906 +1,1906 @@ -/* -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. -*/ - -///btSoftBody implementation by Nathanael Presson - - -#include "btBulletDynamicsCommon.h" -#include "BulletSoftBody/btSoftRigidDynamicsWorld.h" - -#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btIDebugDraw.h" - -#include "../GimpactTestDemo/BunnyMesh.h" -#include "../GimpactTestDemo/TorusMesh.h" -#include //printf debugging -#include "LinearMath/btConvexHull.h" -#include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" -#include "BulletSoftBody/btSoftBodyHelpers.h" - -#include "SoftDemo.h" -#include "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; - - - -#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 SoftDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) -{ - btTransform trans; - trans.setIdentity(); - - for(int i=0; igetWorldUserInfo(); - - if(softDemo->m_drag) - { - const int x=softDemo->m_lastmousepos[0]; - const int y=softDemo->m_lastmousepos[1]; - const btVector3 rayFrom=softDemo->getCameraPosition(); - const btVector3 rayTo=softDemo->getRayTo(x,y); - const btVector3 rayDir=(rayTo-rayFrom).normalized(); - const btVector3 N=(softDemo->getCameraTargetPosition()-softDemo->getCameraPosition()).normalized(); - const btScalar O=btDot(softDemo->m_impact,N); - const btScalar den=btDot(N,rayDir); - if((den*den)>0) - { - const btScalar num=O-btDot(N,rayFrom); - const btScalar hit=num/den; - if((hit>0)&&(hit<1500)) - { - softDemo->m_goal=rayFrom+rayDir*hit; - } - } - btVector3 delta=softDemo->m_goal-softDemo->m_node->m_x; - static const btScalar maxdrag=10; - if(delta.length2()>(maxdrag*maxdrag)) - { - delta=delta.normalized()*maxdrag; - } - softDemo->m_node->m_v+=delta/timeStep; - } - -} - - -void SoftDemo::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); - - - - - float ms = getDeltaTimeMicroseconds(); - float dt = ms / 1000000.f;//1.0/60.; - - - - if (m_dynamicsWorld) - { - - - -//#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); - //numSimSteps = m_dynamicsWorld->stepSimulation(dt,10,1./240.f); - -#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 - - if(m_drag) - { - m_node->m_v*=0; - } - - m_softBodyWorldInfo.m_sparsesdf.GarbageCollect(); - - //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); - -#endif //PRINT_CONTACT_STATISTICS - - - swapBuffers(); - -} - - - -void SoftDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - renderme(); - - glFlush(); - swapBuffers(); -} - - -// -// ImplicitShape -// - -// -struct ImplicitSphere : btSoftBody::ImplicitFn -{ - btVector3 center; - btScalar sqradius; - ImplicitSphere() {} - ImplicitSphere(const btVector3& c,btScalar r) : center(c),sqradius(r*r) {} - btScalar Eval(const btVector3& x) - { - return((x-center).length2()-sqradius); - } -}; - -// -// Tetra meshes -// - -struct TetraBunny -{ -#include "bunny.inl" -}; - -struct TetraCube -{ -#include "cube.inl" -}; - - -// -// Random -// - -static inline btScalar UnitRand() -{ - return(rand()/(btScalar)RAND_MAX); -} - -static inline btScalar SignedUnitRand() -{ - return(UnitRand()*2-1); -} - -static inline btVector3 Vector3Rand() -{ - const btVector3 p=btVector3(SignedUnitRand(),SignedUnitRand(),SignedUnitRand()); - return(p.normalized()); -} - -// -// Rb rain -// -static void Ctor_RbUpStack(SoftDemo* pdemo,int count) -{ - float mass=10; - - btCompoundShape* cylinderCompound = new btCompoundShape; - btCollisionShape* cylinderShape = new btCylinderShapeX(btVector3(4,1,1)); - btCollisionShape* boxShape = new btBoxShape(btVector3(4,1,1)); - btTransform localTransform; - localTransform.setIdentity(); - cylinderCompound->addChildShape(localTransform,boxShape); - btQuaternion orn(SIMD_HALF_PI,0,0); - localTransform.setRotation(orn); - // localTransform.setOrigin(btVector3(1,1,1)); - cylinderCompound->addChildShape(localTransform,cylinderShape); - - - btCollisionShape* shape[]={cylinderCompound, - new btBoxShape(btVector3(1,1,1)), - new btSphereShape(1.5) - - }; - static const int nshapes=sizeof(shape)/sizeof(shape[0]); - for(int i=0;ilocalCreateRigidBody(mass,startTransform,shape[i%nshapes]); - //pdemo->localCreateRigidBody(mass,startTransform,shape[0]); - } -} - -// -// Big ball -// -static void Ctor_BigBall(SoftDemo* pdemo,btScalar mass=10) -{ - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,13,0)); - pdemo->localCreateRigidBody(mass,startTransform,new btSphereShape(3)); -} - -// -// Big plate -// -static btRigidBody* Ctor_BigPlate(SoftDemo* pdemo,btScalar mass=15,btScalar height=4) -{ - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,height,0.5)); - btRigidBody* body=pdemo->localCreateRigidBody(mass,startTransform,new btBoxShape(btVector3(5,1,5))); - body->setFriction(1); - return(body); -} - -// -// Linear stair -// -static void Ctor_LinearStair(SoftDemo* pdemo,const btVector3& org,const btVector3& sizes,btScalar angle,int count) -{ - btBoxShape* shape=new btBoxShape(sizes); - for(int i=0;ilocalCreateRigidBody(0,startTransform,shape); - body->setFriction(1); - } -} - -// -// Softbox -// -static btSoftBody* Ctor_SoftBox(SoftDemo* pdemo,const btVector3& p,const btVector3& s) -{ - const btVector3 h=s*0.5; - const btVector3 c[]={ p+h*btVector3(-1,-1,-1), - p+h*btVector3(+1,-1,-1), - p+h*btVector3(-1,+1,-1), - p+h*btVector3(+1,+1,-1), - p+h*btVector3(-1,-1,+1), - p+h*btVector3(+1,-1,+1), - p+h*btVector3(-1,+1,+1), - p+h*btVector3(+1,+1,+1)}; - btSoftBody* psb=btSoftBodyHelpers::CreateFromConvexHull(pdemo->m_softBodyWorldInfo,c,8); - psb->generateBendingConstraints(2); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - return(psb); - -} - -// -// SoftBoulder -// -static btSoftBody* Ctor_SoftBoulder(SoftDemo* pdemo,const btVector3& p,const btVector3& s,int np,int id) -{ - btAlignedObjectArray pts; - if(id) srand(id); - for(int i=0;im_softBodyWorldInfo,&pts[0],pts.size()); - psb->generateBendingConstraints(2); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - return(psb); -} - -//#define TRACEDEMO { pdemo->demoname=__FUNCTION__+5;printf("Launching demo: " __FUNCTION__ "\r\n"); } - -// -// Basic ropes -// -static void Init_Ropes(SoftDemo* pdemo) -{ - //TRACEDEMO - const int n=15; - for(int i=0;im_softBodyWorldInfo, btVector3(-10,0,i*0.25), - btVector3(10,0,i*0.25), - 16, - 1+2); - psb->m_cfg.piterations = 4; - psb->m_materials[0]->m_kLST = 0.1+(i/(btScalar)(n-1))*0.9; - psb->setTotalMass(20); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - } -} - -// -// Rope attach -// -static void Init_RopeAttach(SoftDemo* pdemo) -{ - //TRACEDEMO - pdemo->m_softBodyWorldInfo.m_sparsesdf.RemoveReferences(0); - struct Functors - { - static btSoftBody* CtorRope(SoftDemo* pdemo,const btVector3& p) - { - btSoftBody* psb=btSoftBodyHelpers::CreateRope(pdemo->m_softBodyWorldInfo,p,p+btVector3(10,0,0),8,1); - psb->setTotalMass(50); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); - } - }; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(12,8,0)); - btRigidBody* body=pdemo->localCreateRigidBody(50,startTransform,new btBoxShape(btVector3(2,6,2))); - btSoftBody* psb0=Functors::CtorRope(pdemo,btVector3(0,8,-1)); - btSoftBody* psb1=Functors::CtorRope(pdemo,btVector3(0,8,+1)); - psb0->appendAnchor(psb0->m_nodes.size()-1,body); - psb1->appendAnchor(psb1->m_nodes.size()-1,body); -} - -// -// Cloth attach -// -static void Init_ClothAttach(SoftDemo* pdemo) -{ - //TRACEDEMO - const btScalar s=4; - const btScalar h=6; - const int r=9; - btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,btVector3(-s,h,-s), - btVector3(+s,h,-s), - btVector3(-s,h,+s), - btVector3(+s,h,+s),r,r,4+8,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,h,-(s+3.5))); - btRigidBody* body=pdemo->localCreateRigidBody(20,startTransform,new btBoxShape(btVector3(s,1,3))); - psb->appendAnchor(0,body); - psb->appendAnchor(r-1,body); - pdemo->m_cutting=true; -} - -// -// Impact -// -static void Init_Impact(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateRope(pdemo->m_softBodyWorldInfo, btVector3(0,0,0), - btVector3(0,-1,0), - 0, - 1); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - psb->m_cfg.kCHR=0.5; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,20,0)); - pdemo->localCreateRigidBody(10,startTransform,new btBoxShape(btVector3(2,2,2))); -} - -// -// Collide -// -static void Init_Collide(SoftDemo* pdemo) -{ - //TRACEDEMO - struct Functor - { - static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) - { - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices, - &gIndices[0][0], - NUM_TRIANGLES); - psb->generateBendingConstraints(2); - psb->m_cfg.piterations=2; - psb->m_cfg.collisions|=btSoftBody::fCollision::VF_SS; - psb->randomizeConstraints(); - btMatrix3x3 m; - m.setEulerZYX(a.x(),a.y(),a.z()); - psb->transform(btTransform(m,x)); - psb->scale(btVector3(2,2,2)); - psb->setTotalMass(50,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); - } - }; - for(int i=0;i<3;++i) - { - Functor::Create(pdemo,btVector3(3*i,2,0),btVector3(SIMD_PI/2*(1-(i&1)),SIMD_PI/2*(i&1),0)); - } - pdemo->m_cutting=true; -} - -// -// Collide2 -// -static void Init_Collide2(SoftDemo* pdemo) -{ - //TRACEDEMO - struct Functor - { - static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) - { - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny, - &gIndicesBunny[0][0], - BUNNY_NUM_TRIANGLES); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 0.5; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_cfg.piterations = 2; - psb->m_cfg.kDF = 0.5; - psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; - psb->randomizeConstraints(); - btMatrix3x3 m; - m.setEulerZYX(a.x(),a.y(),a.z()); - psb->transform(btTransform(m,x)); - psb->scale(btVector3(6,6,6)); - psb->setTotalMass(100,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); - } - }; - for(int i=0;i<3;++i) - { - Functor::Create(pdemo,btVector3(0,-1+5*i,0),btVector3(0,SIMD_PI/2*(i&1),0)); - } - pdemo->m_cutting=true; -} - -// -// Collide3 -// -static void Init_Collide3(SoftDemo* pdemo) -{ - //TRACEDEMO - { - const btScalar s=8; - btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), - btVector3(+s,0,-s), - btVector3(-s,0,+s), - btVector3(+s,0,+s), - 15,15,1+2+4+8,true); - psb->m_materials[0]->m_kLST = 0.4; - psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; - psb->setTotalMass(150); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - } - { - const btScalar s=4; - const btVector3 o=btVector3(5,10,0); - btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo, - btVector3(-s,0,-s)+o, - btVector3(+s,0,-s)+o, - btVector3(-s,0,+s)+o, - btVector3(+s,0,+s)+o, - 7,7,0,true); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 0.1; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_materials[0]->m_kLST = 0.5; - psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; - psb->setTotalMass(150); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - pdemo->m_cutting=true; - } -} - -// -// Aerodynamic forces, 50x1g flyers -// -static void Init_Aero(SoftDemo* pdemo) -{ - //TRACEDEMO - const btScalar s=2; - const btScalar h=10; - const int segments=6; - const int count=50; - for(int i=0;im_softBodyWorldInfo,btVector3(-s,h,-s), - btVector3(+s,h,-s), - btVector3(-s,h,+s), - btVector3(+s,h,+s), - segments,segments, - 0,true); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_cfg.kLF = 0.004; - psb->m_cfg.kDG = 0.0003; - psb->m_cfg.aeromodel = btSoftBody::eAeroModel::V_TwoSided; - btTransform trs; - btQuaternion rot; - btVector3 ra=Vector3Rand()*0.1; - btVector3 rp=Vector3Rand()*15+btVector3(0,20,80); - rot.setEuler(SIMD_PI/8+ra.x(),-SIMD_PI/7+ra.y(),ra.z()); - trs.setIdentity(); - trs.setOrigin(rp); - trs.setRotation(rot); - psb->transform(trs); - psb->setTotalMass(0.1); - psb->addForce(btVector3(0,2,0),0); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - } - pdemo->m_autocam=true; -} - -// -// Friction -// -static void Init_Friction(SoftDemo* pdemo) -{ - //TRACEDEMO - const btScalar bs=2; - const btScalar ts=bs+bs/4; - for(int i=0,ni=20;im_cfg.kDF = 0.1 * ((i+1)/(btScalar)ni); - psb->addVelocity(btVector3(0,0,-10)); - } -} - -// -// Pressure -// -static void Init_Pressure(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,btVector3(35,25,0), - btVector3(1,1,1)*3, - 512); - psb->m_materials[0]->m_kLST = 0.1; - psb->m_cfg.kDF = 1; - psb->m_cfg.kDP = 0.001; // fun factor... - psb->m_cfg.kPR = 2500; - psb->setTotalMass(30,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - Ctor_BigPlate(pdemo); - Ctor_LinearStair(pdemo,btVector3(0,0,0),btVector3(2,1,5),0,10); - pdemo->m_autocam=true; -} - -// -// Volume conservation -// -static void Init_Volume(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,btVector3(35,25,0), - btVector3(1,1,1)*3, - 512); - psb->m_materials[0]->m_kLST = 0.45; - psb->m_cfg.kVC = 20; - psb->setTotalMass(50,true); - psb->setPose(true,false); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - Ctor_BigPlate(pdemo); - Ctor_LinearStair(pdemo,btVector3(0,0,0),btVector3(2,1,5),0,10); - pdemo->m_autocam=true; -} - -// -// Stick+Bending+Rb's -// -static void Init_Sticks(SoftDemo* pdemo) -{ - //TRACEDEMO - const int n=16; - const int sg=4; - const btScalar sz=5; - const btScalar hg=4; - const btScalar in=1/(btScalar)(n-1); - for(int y=0;ym_softBodyWorldInfo, org, - org+btVector3(hg*0.001,hg,0), - sg, - 1); - psb->m_cfg.kDP = 0.005; - psb->m_cfg.kCHR = 0.1; - for(int i=0;i<3;++i) - { - psb->generateBendingConstraints(2+i); - } - psb->setMass(1,0); - psb->setTotalMass(0.01); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - } - } - Ctor_BigBall(pdemo); -} - -// -// Bending -// -static void Init_Bending(SoftDemo* pdemo) -{ - //TRACEDEMO - const btScalar s=4; - const btVector3 x[]={ btVector3(-s,0,-s), - btVector3(+s,0,-s), - btVector3(+s,0,+s), - btVector3(-s,0,+s)}; - const btScalar m[]={ 0,0,0,1}; - btSoftBody* psb=new btSoftBody(&pdemo->m_softBodyWorldInfo,4,x,m); - psb->appendLink(0,1); - psb->appendLink(1,2); - psb->appendLink(2,3); - psb->appendLink(3,0); - psb->appendLink(0,2); - - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); -} - -// -// 100kg cloth locked at corners, 10 falling 10kg rb's. -// -static void Init_Cloth(SoftDemo* pdemo) -{ - //TRACEDEMO - const btScalar s=8; - btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), - btVector3(+s,0,-s), - btVector3(-s,0,+s), - btVector3(+s,0,+s), - 31,31, - // 31,31, - 1+2+4+8,true); - - psb->getCollisionShape()->setMargin(0.5); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 0.4; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->setTotalMass(150); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - Ctor_RbUpStack(pdemo,10); - pdemo->m_cutting=true; -} - -// -// 100kg Stanford's bunny -// -static void Init_Bunny(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny, - &gIndicesBunny[0][0], - BUNNY_NUM_TRIANGLES); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 0.5; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_cfg.piterations = 2; - psb->m_cfg.kDF = 0.5; - psb->randomizeConstraints(); - psb->scale(btVector3(6,6,6)); - psb->setTotalMass(100,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - pdemo->m_cutting=true; - -} - -// -// 100kg Stanford's bunny with pose matching -// -static void Init_BunnyMatch(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo, gVerticesBunny, - &gIndicesBunny[0][0], - BUNNY_NUM_TRIANGLES); - psb->m_cfg.kDF = 0.5; - psb->m_cfg.kMT = 0.05; - psb->m_cfg.piterations = 5; - psb->randomizeConstraints(); - psb->scale(btVector3(6,6,6)); - psb->setTotalMass(100,true); - psb->setPose(false,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - -} - -// -// 50Kg Torus -// -static void Init_Torus(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh( pdemo->m_softBodyWorldInfo, gVertices, - &gIndices[0][0], - NUM_TRIANGLES); - psb->generateBendingConstraints(2); - psb->m_cfg.piterations=2; - psb->randomizeConstraints(); - btMatrix3x3 m; - m.setEulerZYX(SIMD_PI/2,0,0); - psb->transform(btTransform(m,btVector3(0,4,0))); - psb->scale(btVector3(2,2,2)); - psb->setTotalMass(50,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - pdemo->m_cutting=true; - -} - -// -// 50Kg Torus with pose matching -// -static void Init_TorusMatch(SoftDemo* pdemo) -{ - //TRACEDEMO - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo, gVertices, - &gIndices[0][0], - NUM_TRIANGLES); - psb->m_materials[0]->m_kLST = 0.1; - psb->m_cfg.kMT = 0.05; - psb->randomizeConstraints(); - btMatrix3x3 m; - m.setEulerZYX(SIMD_PI/2,0,0); - psb->transform(btTransform(m,btVector3(0,4,0))); - psb->scale(btVector3(2,2,2)); - psb->setTotalMass(50,true); - psb->setPose(false,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); -} - -// -// Cutting1 -// -static void Init_Cutting1(SoftDemo* pdemo) -{ - const btScalar s=6; - const btScalar h=2; - const int r=16; - const btVector3 p[]={ btVector3(+s,h,-s), - btVector3(-s,h,-s), - btVector3(+s,h,+s), - btVector3(-s,h,+s)}; - btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,p[0],p[1],p[2],p[3],r,r,1+2+4+8,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - psb->m_cfg.piterations=1; - pdemo->m_cutting=true; -} - -// -// Clusters -// - -// -static void Ctor_Gear(SoftDemo* pdemo,const btVector3& pos,btScalar speed) -{ - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(pos); - btCompoundShape* shape=new btCompoundShape(); -#if 1 - shape->addChildShape(btTransform(btQuaternion(0,0,0)),new btBoxShape(btVector3(5,1,6))); - shape->addChildShape(btTransform(btQuaternion(0,0,SIMD_HALF_PI)),new btBoxShape(btVector3(5,1,6))); -#else - shape->addChildShape(btTransform(btQuaternion(0,0,0)),new btCylinderShapeZ(btVector3(5,1,7))); - shape->addChildShape(btTransform(btQuaternion(0,0,SIMD_HALF_PI)),new btBoxShape(btVector3(4,1,8))); -#endif - btRigidBody* body=pdemo->localCreateRigidBody(10,startTransform,shape); - body->setFriction(1); - btDynamicsWorld* world=pdemo->getDynamicsWorld(); - btHingeConstraint* hinge=new btHingeConstraint(*body,btTransform::getIdentity()); - if(speed!=0) hinge->enableAngularMotor(true,speed,3); - world->addConstraint(hinge); -} - -// -static btSoftBody* Ctor_ClusterBunny(SoftDemo* pdemo,const btVector3& x,const btVector3& a) -{ - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny,&gIndicesBunny[0][0],BUNNY_NUM_TRIANGLES); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 1; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_cfg.piterations = 2; - psb->m_cfg.kDF = 1; - psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ - btSoftBody::fCollision::CL_RS; - psb->randomizeConstraints(); - btMatrix3x3 m; - m.setEulerZYX(a.x(),a.y(),a.z()); - psb->transform(btTransform(m,x)); - psb->scale(btVector3(8,8,8)); - psb->setTotalMass(150,true); - psb->generateClusters(1); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); -} - -// -static btSoftBody* Ctor_ClusterTorus(SoftDemo* pdemo,const btVector3& x,const btVector3& a,const btVector3& s=btVector3(2,2,2)) -{ - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices,&gIndices[0][0],NUM_TRIANGLES); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 1; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_cfg.piterations = 2; - psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ - btSoftBody::fCollision::CL_RS; - psb->randomizeConstraints(); - psb->scale(s); - psb->rotate(btQuaternion(a[0],a[1],a[2])); - psb->translate(x); - psb->setTotalMass(50,true); - psb->generateClusters(64); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); -} - -// -static struct MotorControl : btSoftBody::AJoint::IControl -{ - MotorControl() - { - goal=0; - maxtorque=0; - } - btScalar Speed(btSoftBody::AJoint*,btScalar current) - { - return(current+btMin(maxtorque,btMax(-maxtorque,goal-current))); - } - btScalar goal; - btScalar maxtorque; -} motorcontrol; - -// -struct SteerControl : btSoftBody::AJoint::IControl -{ - SteerControl(btScalar s) - { - angle=0; - sign=s; - } - void Prepare(btSoftBody::AJoint* joint) - { - joint->m_refs[0][0]=btCos(angle*sign); - joint->m_refs[0][2]=btSin(angle*sign); - } - btScalar Speed(btSoftBody::AJoint* joint,btScalar current) - { - return(motorcontrol.Speed(joint,current)); - } - btScalar angle; - btScalar sign; -}; - -static SteerControl steercontrol_f(+1); -static SteerControl steercontrol_r(-1); - -// -static void Init_ClusterDeform(SoftDemo* pdemo) -{ - btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); - psb->generateClusters(8); - psb->m_cfg.kDF=1; -} - -// -static void Init_ClusterCollide1(SoftDemo* pdemo) -{ - const btScalar s=8; - btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), - btVector3(+s,0,-s), - btVector3(-s,0,+s), - btVector3(+s,0,+s), - 17,17,//9,9,//31,31, - 1+2+4+8, - true); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_kLST = 0.4; - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->m_cfg.kDF = 1; - psb->m_cfg.kSRHR_CL = 1; - psb->m_cfg.kSR_SPLT_CL = 0; - psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ - - btSoftBody::fCollision::CL_RS; - psb->generateBendingConstraints(2,pm); - - psb->getCollisionShape()->setMargin(0.05); - psb->setTotalMass(50); - - ///pass zero in generateClusters to create cluster for each tetrahedron or triangle - psb->generateClusters(0); - //psb->generateClusters(64); - - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - - Ctor_RbUpStack(pdemo,10); -} - -// -static void Init_ClusterCollide2(SoftDemo* pdemo) -{ - struct Functor - { - static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) - { - btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices, - &gIndices[0][0], - NUM_TRIANGLES); - btSoftBody::Material* pm=psb->appendMaterial(); - pm->m_flags -= btSoftBody::fMaterial::DebugDraw; - psb->generateBendingConstraints(2,pm); - psb->m_cfg.piterations=2; - psb->m_cfg.kDF =1; - psb->m_cfg.kSSHR_CL =1; - psb->m_cfg.kSS_SPLT_CL =0; - psb->m_cfg.kSKHR_CL =0.1f; - psb->m_cfg.kSK_SPLT_CL =1; - psb->m_cfg.collisions= btSoftBody::fCollision::CL_SS+ - btSoftBody::fCollision::CL_RS; - psb->randomizeConstraints(); - btMatrix3x3 m; - m.setEulerZYX(a.x(),a.y(),a.z()); - psb->transform(btTransform(m,x)); - psb->scale(btVector3(2,2,2)); - psb->setTotalMass(50,true); - psb->generateClusters(16); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); - } - }; - for(int i=0;i<3;++i) - { - Functor::Create(pdemo,btVector3(3*i,2,0),btVector3(SIMD_PI/2*(1-(i&1)),SIMD_PI/2*(i&1),0)); - } -} - -// -static void Init_ClusterSocket(SoftDemo* pdemo) -{ - btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); - btRigidBody* prb=Ctor_BigPlate(pdemo,50,8); - psb->m_cfg.kDF=1; - btSoftBody::LJoint::Specs lj; - lj.position = btVector3(0,5,0); - psb->appendLinearJoint(lj,prb); -} - -// -static void Init_ClusterHinge(SoftDemo* pdemo) -{ - btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); - btRigidBody* prb=Ctor_BigPlate(pdemo,50,8); - psb->m_cfg.kDF=1; - btSoftBody::AJoint::Specs aj; - aj.axis = btVector3(0,0,1); - psb->appendAngularJoint(aj,prb); -} - -// -static void Init_ClusterCombine(SoftDemo* pdemo) -{ - const btVector3 sz(2,4,2); - btSoftBody* psb0=Ctor_ClusterTorus(pdemo,btVector3(0,8,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI),sz); - btSoftBody* psb1=Ctor_ClusterTorus(pdemo,btVector3(0,8,10),btVector3(SIMD_PI/2,0,SIMD_HALF_PI),sz); - btSoftBody* psbs[]={psb0,psb1}; - for(int j=0;j<2;++j) - { - psbs[j]->m_cfg.kDF=1; - psbs[j]->m_cfg.kDP=0; - psbs[j]->m_cfg.piterations=1; - psbs[j]->m_clusters[0]->m_matching = 0.05; - psbs[j]->m_clusters[0]->m_ndamping = 0.05; - } - btSoftBody::AJoint::Specs aj; - aj.axis = btVector3(0,0,1); - aj.icontrol = &motorcontrol; - psb0->appendAngularJoint(aj,psb1); - - btSoftBody::LJoint::Specs lj; - lj.position = btVector3(0,8,5); - psb0->appendLinearJoint(lj,psb1); -} - -// -static void Init_ClusterCar(SoftDemo* pdemo) -{ - pdemo->setAzi(180); - const btVector3 origin(100,80,0); - const btQuaternion orientation(-SIMD_PI/2,0,0); - const btScalar widthf=8; - const btScalar widthr=9; - const btScalar length=8; - const btScalar height=4; - const btVector3 wheels[]= { - btVector3(+widthf,-height,+length), // Front left - btVector3(-widthf,-height,+length), // Front right - btVector3(+widthr,-height,-length), // Rear left - btVector3(-widthr,-height,-length), // Rear right - }; - btSoftBody* pa=Ctor_ClusterBunny(pdemo,btVector3(0,0,0),btVector3(0,0,0)); - btSoftBody* pfl=Ctor_ClusterTorus(pdemo,wheels[0],btVector3(0,0,SIMD_HALF_PI),btVector3(2,4,2)); - btSoftBody* pfr=Ctor_ClusterTorus(pdemo,wheels[1],btVector3(0,0,SIMD_HALF_PI),btVector3(2,4,2)); - btSoftBody* prl=Ctor_ClusterTorus(pdemo,wheels[2],btVector3(0,0,SIMD_HALF_PI),btVector3(2,5,2)); - btSoftBody* prr=Ctor_ClusterTorus(pdemo,wheels[3],btVector3(0,0,SIMD_HALF_PI),btVector3(2,5,2)); - - pfl->m_cfg.kDF = - pfr->m_cfg.kDF = - prl->m_cfg.kDF = - prr->m_cfg.kDF = 1; - - btSoftBody::LJoint::Specs lspecs; - lspecs.cfm = 1; - lspecs.erp = 1; - lspecs.position = btVector3(0,0,0); - - lspecs.position=wheels[0];pa->appendLinearJoint(lspecs,pfl); - lspecs.position=wheels[1];pa->appendLinearJoint(lspecs,pfr); - lspecs.position=wheels[2];pa->appendLinearJoint(lspecs,prl); - lspecs.position=wheels[3];pa->appendLinearJoint(lspecs,prr); - - btSoftBody::AJoint::Specs aspecs; - aspecs.cfm = 1; - aspecs.erp = 1; - aspecs.axis = btVector3(1,0,0); - - aspecs.icontrol = &steercontrol_f; - pa->appendAngularJoint(aspecs,pfl); - pa->appendAngularJoint(aspecs,pfr); - - aspecs.icontrol = &motorcontrol; - pa->appendAngularJoint(aspecs,prl); - pa->appendAngularJoint(aspecs,prr); - - pa->rotate(orientation); - pfl->rotate(orientation); - pfr->rotate(orientation); - prl->rotate(orientation); - prr->rotate(orientation); - pa->translate(origin); - pfl->translate(origin); - pfr->translate(origin); - prl->translate(origin); - prr->translate(origin); - pfl->m_cfg.piterations = - pfr->m_cfg.piterations = - prl->m_cfg.piterations = - prr->m_cfg.piterations = 1; - pfl->m_clusters[0]->m_matching = - pfr->m_clusters[0]->m_matching = - prl->m_clusters[0]->m_matching = - prr->m_clusters[0]->m_matching = 0.05; - pfl->m_clusters[0]->m_ndamping = - pfr->m_clusters[0]->m_ndamping = - prl->m_clusters[0]->m_ndamping = - prr->m_clusters[0]->m_ndamping = 0.05; - - Ctor_LinearStair(pdemo,btVector3(0,-8,0),btVector3(3,2,40),0,20); - Ctor_RbUpStack(pdemo,50); - pdemo->m_autocam=true; -} - -// -static void Init_ClusterRobot(SoftDemo* pdemo) -{ - struct Functor - { - static btSoftBody* CreateBall(SoftDemo* pdemo,const btVector3& pos) - { - btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,pos,btVector3(1,1,1)*3,512); - psb->m_materials[0]->m_kLST = 0.45; - psb->m_cfg.kVC = 20; - psb->setTotalMass(50,true); - psb->setPose(true,false); - psb->generateClusters(1); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - return(psb); - } - }; - const btVector3 base=btVector3(0,25,8); - btSoftBody* psb0=Functor::CreateBall(pdemo,base+btVector3(-8,0,0)); - btSoftBody* psb1=Functor::CreateBall(pdemo,base+btVector3(+8,0,0)); - btSoftBody* psb2=Functor::CreateBall(pdemo,base+btVector3(0,0,+8*btSqrt(2))); - const btVector3 ctr=(psb0->clusterCom(0)+psb1->clusterCom(0)+psb2->clusterCom(0))/3; - btCylinderShape* pshp=new btCylinderShape(btVector3(8,1,8)); - btRigidBody* prb=pdemo->localCreateRigidBody(50,btTransform(btQuaternion(0,0,0),ctr+btVector3(0,5,0)),pshp); - btSoftBody::LJoint::Specs ls; - ls.erp=0.5f; - ls.position=psb0->clusterCom(0);psb0->appendLinearJoint(ls,prb); - ls.position=psb1->clusterCom(0);psb1->appendLinearJoint(ls,prb); - ls.position=psb2->clusterCom(0);psb2->appendLinearJoint(ls,prb); - - btBoxShape* pbox=new btBoxShape(btVector3(20,1,40)); - btRigidBody* pgrn=pdemo->localCreateRigidBody(0,btTransform(btQuaternion(0,-SIMD_HALF_PI/2,0),btVector3(0,0,0)),pbox); - - pdemo->m_autocam=true; -} - -// -static void Init_ClusterStackSoft(SoftDemo* pdemo) -{ - for(int i=0;i<10;++i) - { - btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,-9+8.25*i,0),btVector3(0,0,0)); - psb->m_cfg.kDF=1; - } -} - -// -static void Init_ClusterStackMixed(SoftDemo* pdemo) -{ - for(int i=0;i<10;++i) - { - if((i+1)&1) - { - Ctor_BigPlate(pdemo,50,-9+4.25*i); - } - else - { - btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,-9+4.25*i,0),btVector3(0,0,0)); - psb->m_cfg.kDF=1; - } - } -} - - -// -// TetraBunny -// -static void Init_TetraBunny(SoftDemo* pdemo) -{ - btSoftBody* psb=btSoftBodyHelpers::CreateFromTetGenData(pdemo->m_softBodyWorldInfo, - TetraBunny::getElements(), - 0, - TetraBunny::getNodes(), - false,true,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - psb->rotate(btQuaternion(SIMD_PI/2,0,0)); - psb->setVolumeMass(150); - psb->m_cfg.piterations=2; - //psb->m_cfg.piterations=1; - pdemo->m_cutting=true; - //psb->getCollisionShape()->setMargin(0.01); - psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ btSoftBody::fCollision::CL_RS - //+ btSoftBody::fCollision::CL_SELF - ; - - ///pass zero in generateClusters to create cluster for each tetrahedron or triangle - psb->generateClusters(0); - //psb->m_materials[0]->m_kLST=.2; - psb->m_cfg.kDF = 10. ; - - -} - -// -// TetraCube -// -static void Init_TetraCube(SoftDemo* pdemo) -{ - btSoftBody* psb=btSoftBodyHelpers::CreateFromTetGenData(pdemo->m_softBodyWorldInfo, - TetraCube::getElements(), - 0, - TetraCube::getNodes(), - false,true,true); - pdemo->getSoftDynamicsWorld()->addSoftBody(psb); - psb->scale(btVector3(4,4,4)); - psb->translate(btVector3(0,5,0)); - psb->setVolumeMass(300); - - - ///fix one vertex - //psb->setMass(0,0); - //psb->setMass(10,0); - //psb->setMass(20,0); - psb->m_cfg.piterations=1; - //psb->generateClusters(128); - psb->generateClusters(16); - //psb->getCollisionShape()->setMargin(0.5); - - psb->getCollisionShape()->setMargin(0.01); - psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ btSoftBody::fCollision::CL_RS - //+ btSoftBody::fCollision::CL_SELF - ; - psb->m_materials[0]->m_kLST=0.8; - pdemo->m_cutting=true; -} - - - -unsigned current_demo=28;//19; - -void SoftDemo::clientResetScene() -{ - m_azi = 0; - m_cameraDistance = 30.f; - m_cameraTargetPosition.setValue(0,0,0); - - 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; - } - btSoftBody* softBody = btSoftBody::upcast(obj); - if (softBody) - { - getSoftDynamicsWorld()->removeSoftBody(softBody); - } else - { - btRigidBody* body = btRigidBody::upcast(obj); - if (body) - m_dynamicsWorld->removeRigidBody(body); - else - m_dynamicsWorld->removeCollisionObject(obj); - } - delete obj; - } - - m_softBodyWorldInfo.m_sparsesdf.Reset(); - /* Init */ - void (*demofncs[])(SoftDemo*)= - { - Init_Cloth, - Init_Pressure, - Init_Volume, - Init_Ropes, - Init_RopeAttach, - Init_ClothAttach, - Init_Sticks, - Init_Collide, - Init_Collide2, - Init_Collide3, - Init_Impact, - Init_Aero, - Init_Friction, - Init_Torus, - Init_TorusMatch, - Init_Bunny, - Init_BunnyMatch, - Init_Cutting1, - Init_ClusterDeform, - Init_ClusterCollide1, - Init_ClusterCollide2, - Init_ClusterSocket, - Init_ClusterHinge, - Init_ClusterCombine, - Init_ClusterCar, - Init_ClusterRobot, - Init_ClusterStackSoft, - Init_ClusterStackMixed, - Init_TetraCube, - Init_TetraBunny, - }; - current_demo=current_demo%(sizeof(demofncs)/sizeof(demofncs[0])); - - - //create ground object - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(0,-12,0)); - - btCollisionObject* newOb = new btCollisionObject(); - newOb->setWorldTransform(tr); - newOb->setInterpolationWorldTransform( tr); - if (current_demo>19) - { - newOb->setCollisionShape(m_collisionShapes[0]); - } else - { - newOb->setCollisionShape(m_collisionShapes[1]); - } - - m_dynamicsWorld->addCollisionObject(newOb); - - motorcontrol.goal = 0; - motorcontrol.maxtorque = 0; - - - - m_softBodyWorldInfo.air_density = (btScalar)1.2; - m_softBodyWorldInfo.water_density = 0; - m_softBodyWorldInfo.water_offset = 0; - m_softBodyWorldInfo.water_normal = btVector3(0,0,0); - m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); - - - m_autocam = false; - m_raycast = false; - m_cutting = false; - m_results.fraction = 1.f; - demofncs[current_demo](this); -} - -void SoftDemo::renderme() -{ - btIDebugDraw* idraw=m_dynamicsWorld->getDebugDrawer(); - - m_dynamicsWorld->debugDrawWorld(); - - /* Bodies */ - btVector3 ps(0,0,0); - int nps=0; - - btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); - for(int ib=0;ibm_nodes.size(); - for(int i=0;im_nodes.size();++i) - { - ps+=psb->m_nodes[i].m_x; - } - } - ps/=nps; - if(m_autocam) - m_cameraTargetPosition+=(ps-m_cameraTargetPosition)*0.05; - /* Anm */ - if(!isIdle()) - m_animtime=m_clock.getTimeMilliseconds()/1000.f; - /* Ray cast */ - if(m_raycast) - { - /* Prepare rays */ - const int res=64; - const btScalar fres=res-1; - const btScalar size=8; - const btScalar dist=10; - btTransform trs; - trs.setOrigin(ps); - btScalar rayLength = 1000.f; - - const btScalar angle=m_animtime*0.2; - trs.setRotation(btQuaternion(angle,SIMD_PI/4,0)); - btVector3 dir=trs.getBasis()*btVector3(0,-1,0); - trs.setOrigin(ps-dir*dist); - btAlignedObjectArray origins; - btAlignedObjectArray fractions; - origins.resize(res*res); - fractions.resize(res*res,1.f); - for(int y=0;yrayTest(rayFrom,rayTo,results)) - { - *fraction=results.fraction; - } - } - ++org;++fraction; - } - long ms=btMax(m_clock.getTimeMilliseconds(),1); - long rayperseconds=(1000*(origins.size()*sbs.size()))/ms; - printf("%d ms (%d rays/s)\r\n",int(ms),int(rayperseconds)); - } - /* Draw rays */ - const btVector3 c[]={ origins[0], - origins[res-1], - origins[res*(res-1)], - origins[res*(res-1)+res-1]}; - idraw->drawLine(c[0],c[1],btVector3(0,0,0)); - idraw->drawLine(c[1],c[3],btVector3(0,0,0)); - idraw->drawLine(c[3],c[2],btVector3(0,0,0)); - idraw->drawLine(c[2],c[0],btVector3(0,0,0)); - for(int i=0,ni=origins.size();idrawLine(org,org+dir*rayLength*fraction,btVector3(1,0,0)); - } - else - { - idraw->drawLine(org,org-dir*rayLength*0.1,btVector3(0,0,0)); - } - } -#undef RES - } - /* Water level */ - static const btVector3 axis[]={btVector3(1,0,0), - btVector3(0,1,0), - btVector3(0,0,1)}; - if(m_softBodyWorldInfo.water_density>0) - { - const btVector3 c= btVector3((btScalar)0.25,(btScalar)0.25,1); - const btScalar a= (btScalar)0.5; - const btVector3 n= m_softBodyWorldInfo.water_normal; - const btVector3 o= -n*m_softBodyWorldInfo.water_offset; - const btVector3 x= btCross(n,axis[n.minAxis()]).normalized(); - const btVector3 y= btCross(x,n).normalized(); - const btScalar s= 25; - idraw->drawTriangle(o-x*s-y*s,o+x*s-y*s,o+x*s+y*s,c,a); - idraw->drawTriangle(o-x*s-y*s,o+x*s+y*s,o-x*s+y*s,c,a); - } - // - DemoApplication::renderme(); - -} - -void SoftDemo::setDrawClusters(bool drawClusters) -{ - if (drawClusters) - { - getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()|fDrawFlags::Clusters); - } else - { - getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()& (~fDrawFlags::Clusters)); - } -} - - - -void SoftDemo::keyboardCallback(unsigned char key, int x, int y) -{ - switch(key) - { - case 'n': motorcontrol.maxtorque=10;motorcontrol.goal+=1;break; - case 'm': motorcontrol.maxtorque=10;motorcontrol.goal-=1;break; - case 'l': steercontrol_f.angle+=0.1;steercontrol_r.angle+=0.1;break; - case 'k': steercontrol_f.angle-=0.1;steercontrol_r.angle-=0.1;break; - case ']': ++current_demo;clientResetScene();break; - case '[': --current_demo;clientResetScene();break; - case ',': m_raycast=!m_raycast;break; - case ';': m_autocam=!m_autocam;break; - case 'c': getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()^fDrawFlags::Clusters);break; - case '`': - { - btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); - for(int ib=0;ibstaticSolve(128); - } - } - break; - default: DemoApplication::keyboardCallback(key,x,y); - } -} - -// -void SoftDemo::mouseMotionFunc(int x,int y) -{ - if(m_node&&(m_results.fraction<1.f)) - { - if(!m_drag) - { -#define SQ(_x_) (_x_)*(_x_) - if((SQ(x-m_lastmousepos[0])+SQ(y-m_lastmousepos[1]))>6) - { - m_drag=true; - } -#undef SQ - } - if(m_drag) - { - m_lastmousepos[0] = x; - m_lastmousepos[1] = y; - } - } - else - { - DemoApplication::mouseMotionFunc(x,y); - } -} - -// -void SoftDemo::mouseFunc(int button, int state, int x, int y) -{ - if(button==0) - { - switch(state) - { - case 0: - { - m_results.fraction=1.f; - DemoApplication::mouseFunc(button,state,x,y); - if(!m_pickConstraint) - { - const btVector3 rayFrom=m_cameraPosition; - const btVector3 rayTo=getRayTo(x,y); - const btVector3 rayDir=(rayTo-rayFrom).normalized(); - btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); - for(int ib=0;ibrayTest(rayFrom,rayTo,res)) - { - m_results=res; - } - } - if(m_results.fraction<1.f) - { - m_impact = rayFrom+(rayTo-rayFrom)*m_results.fraction; - m_drag = false; - m_lastmousepos[0] = x; - m_lastmousepos[1] = y; - m_node = 0; - switch(m_results.feature) - { - case btSoftBody::eFeature::Face: - { - btSoftBody::Face& f=m_results.body->m_faces[m_results.index]; - m_node=f.m_n[0]; - for(int i=1;i<3;++i) - { - if( (m_node->m_x-m_impact).length2()> - (f.m_n[i]->m_x-m_impact).length2()) - { - m_node=f.m_n[i]; - } - } - } - break; - } - if(m_node) m_goal=m_node->m_x; - return; - } - } - } - break; - case 1: - if((!m_drag)&&m_cutting&&(m_results.fraction<1.f)) - { - ImplicitSphere isphere(m_impact,1); - printf("Mass before: %f\r\n",m_results.body->getTotalMass()); - m_results.body->refine(&isphere,0.0001,true); - printf("Mass after: %f\r\n",m_results.body->getTotalMass()); - } - m_results.fraction=1.f; - m_drag=false; - DemoApplication::mouseFunc(button,state,x,y); - break; - } - } - else - { - DemoApplication::mouseFunc(button,state,x,y); - } -} - - -void SoftDemo::initPhysics() -{ - ///create concave ground mesh - - - m_azi = 0; - - //reset and disable motorcontrol at the start - motorcontrol.goal = 0; - motorcontrol.maxtorque = 0; - - btCollisionShape* groundShape = 0; - { - 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;isetMargin(0.5); - } - - m_collisionShapes.push_back(groundShape); - - btCollisionShape* groundBox = new btBoxShape (btVector3(100,CUBE_HALF_EXTENTS,100)); - m_collisionShapes.push_back(groundBox); - - btCompoundShape* cylinderCompound = new btCompoundShape; - btCollisionShape* cylinderShape = new btCylinderShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); - btTransform localTransform; - localTransform.setIdentity(); - cylinderCompound->addChildShape(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; - - ///register some softbody collision algorithms on top of the default btDefaultCollisionConfiguration - m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration(); - - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - m_softBodyWorldInfo.m_dispatcher = m_dispatcher; - - //////////////////////////// - ///Register softbody versus softbody collision algorithm - - - ///Register softbody versus rigidbody collision algorithm - - - //////////////////////////// - - btVector3 worldAabbMin(-1000,-1000,-1000); - btVector3 worldAabbMax(1000,1000,1000); - - m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); - - m_softBodyWorldInfo.m_broadphase = m_broadphase; - - btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); - - m_solver = solver; - - btDiscreteDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); - m_dynamicsWorld = world; - m_dynamicsWorld->setInternalTickCallback(pickingPreTickCallback,this,true); - - - m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); - - - - - - - // clientResetScene(); - - m_softBodyWorldInfo.m_sparsesdf.Initialize(); - clientResetScene(); -} - - - - - - -void SoftDemo::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 //printf debugging +#include "LinearMath/btConvexHull.h" +#include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" +#include "BulletSoftBody/btSoftBodyHelpers.h" + +#include "SoftDemo.h" +#include "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; + + + +#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 SoftDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; igetWorldUserInfo(); + + if(softDemo->m_drag) + { + const int x=softDemo->m_lastmousepos[0]; + const int y=softDemo->m_lastmousepos[1]; + const btVector3 rayFrom=softDemo->getCameraPosition(); + const btVector3 rayTo=softDemo->getRayTo(x,y); + const btVector3 rayDir=(rayTo-rayFrom).normalized(); + const btVector3 N=(softDemo->getCameraTargetPosition()-softDemo->getCameraPosition()).normalized(); + const btScalar O=btDot(softDemo->m_impact,N); + const btScalar den=btDot(N,rayDir); + if((den*den)>0) + { + const btScalar num=O-btDot(N,rayFrom); + const btScalar hit=num/den; + if((hit>0)&&(hit<1500)) + { + softDemo->m_goal=rayFrom+rayDir*hit; + } + } + btVector3 delta=softDemo->m_goal-softDemo->m_node->m_x; + static const btScalar maxdrag=10; + if(delta.length2()>(maxdrag*maxdrag)) + { + delta=delta.normalized()*maxdrag; + } + softDemo->m_node->m_v+=delta/timeStep; + } + +} + + +void SoftDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); + + + + + float ms = getDeltaTimeMicroseconds(); + float dt = ms / 1000000.f;//1.0/60.; + + + + if (m_dynamicsWorld) + { + + + +//#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); + //numSimSteps = m_dynamicsWorld->stepSimulation(dt,10,1./240.f); + +#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 + + if(m_drag) + { + m_node->m_v*=0; + } + + m_softBodyWorldInfo.m_sparsesdf.GarbageCollect(); + + //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); + +#endif //PRINT_CONTACT_STATISTICS + + + swapBuffers(); + +} + + + +void SoftDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + renderme(); + + glFlush(); + swapBuffers(); +} + + +// +// ImplicitShape +// + +// +struct ImplicitSphere : btSoftBody::ImplicitFn +{ + btVector3 center; + btScalar sqradius; + ImplicitSphere() {} + ImplicitSphere(const btVector3& c,btScalar r) : center(c),sqradius(r*r) {} + btScalar Eval(const btVector3& x) + { + return((x-center).length2()-sqradius); + } +}; + +// +// Tetra meshes +// + +struct TetraBunny +{ +#include "bunny.inl" +}; + +struct TetraCube +{ +#include "cube.inl" +}; + + +// +// Random +// + +static inline btScalar UnitRand() +{ + return(rand()/(btScalar)RAND_MAX); +} + +static inline btScalar SignedUnitRand() +{ + return(UnitRand()*2-1); +} + +static inline btVector3 Vector3Rand() +{ + const btVector3 p=btVector3(SignedUnitRand(),SignedUnitRand(),SignedUnitRand()); + return(p.normalized()); +} + +// +// Rb rain +// +static void Ctor_RbUpStack(SoftDemo* pdemo,int count) +{ + float mass=10; + + btCompoundShape* cylinderCompound = new btCompoundShape; + btCollisionShape* cylinderShape = new btCylinderShapeX(btVector3(4,1,1)); + btCollisionShape* boxShape = new btBoxShape(btVector3(4,1,1)); + btTransform localTransform; + localTransform.setIdentity(); + cylinderCompound->addChildShape(localTransform,boxShape); + btQuaternion orn(SIMD_HALF_PI,0,0); + localTransform.setRotation(orn); + // localTransform.setOrigin(btVector3(1,1,1)); + cylinderCompound->addChildShape(localTransform,cylinderShape); + + + btCollisionShape* shape[]={cylinderCompound, + new btBoxShape(btVector3(1,1,1)), + new btSphereShape(1.5) + + }; + static const int nshapes=sizeof(shape)/sizeof(shape[0]); + for(int i=0;ilocalCreateRigidBody(mass,startTransform,shape[i%nshapes]); + //pdemo->localCreateRigidBody(mass,startTransform,shape[0]); + } +} + +// +// Big ball +// +static void Ctor_BigBall(SoftDemo* pdemo,btScalar mass=10) +{ + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,13,0)); + pdemo->localCreateRigidBody(mass,startTransform,new btSphereShape(3)); +} + +// +// Big plate +// +static btRigidBody* Ctor_BigPlate(SoftDemo* pdemo,btScalar mass=15,btScalar height=4) +{ + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,height,0.5)); + btRigidBody* body=pdemo->localCreateRigidBody(mass,startTransform,new btBoxShape(btVector3(5,1,5))); + body->setFriction(1); + return(body); +} + +// +// Linear stair +// +static void Ctor_LinearStair(SoftDemo* pdemo,const btVector3& org,const btVector3& sizes,btScalar angle,int count) +{ + btBoxShape* shape=new btBoxShape(sizes); + for(int i=0;ilocalCreateRigidBody(0,startTransform,shape); + body->setFriction(1); + } +} + +// +// Softbox +// +static btSoftBody* Ctor_SoftBox(SoftDemo* pdemo,const btVector3& p,const btVector3& s) +{ + const btVector3 h=s*0.5; + const btVector3 c[]={ p+h*btVector3(-1,-1,-1), + p+h*btVector3(+1,-1,-1), + p+h*btVector3(-1,+1,-1), + p+h*btVector3(+1,+1,-1), + p+h*btVector3(-1,-1,+1), + p+h*btVector3(+1,-1,+1), + p+h*btVector3(-1,+1,+1), + p+h*btVector3(+1,+1,+1)}; + btSoftBody* psb=btSoftBodyHelpers::CreateFromConvexHull(pdemo->m_softBodyWorldInfo,c,8); + psb->generateBendingConstraints(2); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + return(psb); + +} + +// +// SoftBoulder +// +static btSoftBody* Ctor_SoftBoulder(SoftDemo* pdemo,const btVector3& p,const btVector3& s,int np,int id) +{ + btAlignedObjectArray pts; + if(id) srand(id); + for(int i=0;im_softBodyWorldInfo,&pts[0],pts.size()); + psb->generateBendingConstraints(2); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + return(psb); +} + +//#define TRACEDEMO { pdemo->demoname=__FUNCTION__+5;printf("Launching demo: " __FUNCTION__ "\r\n"); } + +// +// Basic ropes +// +static void Init_Ropes(SoftDemo* pdemo) +{ + //TRACEDEMO + const int n=15; + for(int i=0;im_softBodyWorldInfo, btVector3(-10,0,i*0.25), + btVector3(10,0,i*0.25), + 16, + 1+2); + psb->m_cfg.piterations = 4; + psb->m_materials[0]->m_kLST = 0.1+(i/(btScalar)(n-1))*0.9; + psb->setTotalMass(20); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + } +} + +// +// Rope attach +// +static void Init_RopeAttach(SoftDemo* pdemo) +{ + //TRACEDEMO + pdemo->m_softBodyWorldInfo.m_sparsesdf.RemoveReferences(0); + struct Functors + { + static btSoftBody* CtorRope(SoftDemo* pdemo,const btVector3& p) + { + btSoftBody* psb=btSoftBodyHelpers::CreateRope(pdemo->m_softBodyWorldInfo,p,p+btVector3(10,0,0),8,1); + psb->setTotalMass(50); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(12,8,0)); + btRigidBody* body=pdemo->localCreateRigidBody(50,startTransform,new btBoxShape(btVector3(2,6,2))); + btSoftBody* psb0=Functors::CtorRope(pdemo,btVector3(0,8,-1)); + btSoftBody* psb1=Functors::CtorRope(pdemo,btVector3(0,8,+1)); + psb0->appendAnchor(psb0->m_nodes.size()-1,body); + psb1->appendAnchor(psb1->m_nodes.size()-1,body); +} + +// +// Cloth attach +// +static void Init_ClothAttach(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=4; + const btScalar h=6; + const int r=9; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,btVector3(-s,h,-s), + btVector3(+s,h,-s), + btVector3(-s,h,+s), + btVector3(+s,h,+s),r,r,4+8,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,h,-(s+3.5))); + btRigidBody* body=pdemo->localCreateRigidBody(20,startTransform,new btBoxShape(btVector3(s,1,3))); + psb->appendAnchor(0,body); + psb->appendAnchor(r-1,body); + pdemo->m_cutting=true; +} + +// +// Impact +// +static void Init_Impact(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateRope(pdemo->m_softBodyWorldInfo, btVector3(0,0,0), + btVector3(0,-1,0), + 0, + 1); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + psb->m_cfg.kCHR=0.5; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,20,0)); + pdemo->localCreateRigidBody(10,startTransform,new btBoxShape(btVector3(2,2,2))); +} + +// +// Collide +// +static void Init_Collide(SoftDemo* pdemo) +{ + //TRACEDEMO + struct Functor + { + static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) + { + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + psb->generateBendingConstraints(2); + psb->m_cfg.piterations=2; + psb->m_cfg.collisions|=btSoftBody::fCollision::VF_SS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + for(int i=0;i<3;++i) + { + Functor::Create(pdemo,btVector3(3*i,2,0),btVector3(SIMD_PI/2*(1-(i&1)),SIMD_PI/2*(i&1),0)); + } + pdemo->m_cutting=true; +} + +// +// Collide2 +// +static void Init_Collide2(SoftDemo* pdemo) +{ + //TRACEDEMO + struct Functor + { + static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) + { + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny, + &gIndicesBunny[0][0], + BUNNY_NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.5; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.kDF = 0.5; + psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(6,6,6)); + psb->setTotalMass(100,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + for(int i=0;i<3;++i) + { + Functor::Create(pdemo,btVector3(0,-1+5*i,0),btVector3(0,SIMD_PI/2*(i&1),0)); + } + pdemo->m_cutting=true; +} + +// +// Collide3 +// +static void Init_Collide3(SoftDemo* pdemo) +{ + //TRACEDEMO + { + const btScalar s=8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(-s,0,+s), + btVector3(+s,0,+s), + 15,15,1+2+4+8,true); + psb->m_materials[0]->m_kLST = 0.4; + psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; + psb->setTotalMass(150); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + } + { + const btScalar s=4; + const btVector3 o=btVector3(5,10,0); + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo, + btVector3(-s,0,-s)+o, + btVector3(+s,0,-s)+o, + btVector3(-s,0,+s)+o, + btVector3(+s,0,+s)+o, + 7,7,0,true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.1; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_materials[0]->m_kLST = 0.5; + psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; + psb->setTotalMass(150); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + pdemo->m_cutting=true; + } +} + +// +// Aerodynamic forces, 50x1g flyers +// +static void Init_Aero(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=2; + const btScalar h=10; + const int segments=6; + const int count=50; + for(int i=0;im_softBodyWorldInfo,btVector3(-s,h,-s), + btVector3(+s,h,-s), + btVector3(-s,h,+s), + btVector3(+s,h,+s), + segments,segments, + 0,true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.kLF = 0.004; + psb->m_cfg.kDG = 0.0003; + psb->m_cfg.aeromodel = btSoftBody::eAeroModel::V_TwoSided; + btTransform trs; + btQuaternion rot; + btVector3 ra=Vector3Rand()*0.1; + btVector3 rp=Vector3Rand()*15+btVector3(0,20,80); + rot.setEuler(SIMD_PI/8+ra.x(),-SIMD_PI/7+ra.y(),ra.z()); + trs.setIdentity(); + trs.setOrigin(rp); + trs.setRotation(rot); + psb->transform(trs); + psb->setTotalMass(0.1); + psb->addForce(btVector3(0,2,0),0); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + } + pdemo->m_autocam=true; +} + +// +// Friction +// +static void Init_Friction(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar bs=2; + const btScalar ts=bs+bs/4; + for(int i=0,ni=20;im_cfg.kDF = 0.1 * ((i+1)/(btScalar)ni); + psb->addVelocity(btVector3(0,0,-10)); + } +} + +// +// Pressure +// +static void Init_Pressure(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,btVector3(35,25,0), + btVector3(1,1,1)*3, + 512); + psb->m_materials[0]->m_kLST = 0.1; + psb->m_cfg.kDF = 1; + psb->m_cfg.kDP = 0.001; // fun factor... + psb->m_cfg.kPR = 2500; + psb->setTotalMass(30,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_BigPlate(pdemo); + Ctor_LinearStair(pdemo,btVector3(0,0,0),btVector3(2,1,5),0,10); + pdemo->m_autocam=true; +} + +// +// Volume conservation +// +static void Init_Volume(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,btVector3(35,25,0), + btVector3(1,1,1)*3, + 512); + psb->m_materials[0]->m_kLST = 0.45; + psb->m_cfg.kVC = 20; + psb->setTotalMass(50,true); + psb->setPose(true,false); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_BigPlate(pdemo); + Ctor_LinearStair(pdemo,btVector3(0,0,0),btVector3(2,1,5),0,10); + pdemo->m_autocam=true; +} + +// +// Stick+Bending+Rb's +// +static void Init_Sticks(SoftDemo* pdemo) +{ + //TRACEDEMO + const int n=16; + const int sg=4; + const btScalar sz=5; + const btScalar hg=4; + const btScalar in=1/(btScalar)(n-1); + for(int y=0;ym_softBodyWorldInfo, org, + org+btVector3(hg*0.001,hg,0), + sg, + 1); + psb->m_cfg.kDP = 0.005; + psb->m_cfg.kCHR = 0.1; + for(int i=0;i<3;++i) + { + psb->generateBendingConstraints(2+i); + } + psb->setMass(1,0); + psb->setTotalMass(0.01); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + } + } + Ctor_BigBall(pdemo); +} + +// +// Bending +// +static void Init_Bending(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=4; + const btVector3 x[]={ btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(+s,0,+s), + btVector3(-s,0,+s)}; + const btScalar m[]={ 0,0,0,1}; + btSoftBody* psb=new btSoftBody(&pdemo->m_softBodyWorldInfo,4,x,m); + psb->appendLink(0,1); + psb->appendLink(1,2); + psb->appendLink(2,3); + psb->appendLink(3,0); + psb->appendLink(0,2); + + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); +} + +// +// 100kg cloth locked at corners, 10 falling 10kg rb's. +// +static void Init_Cloth(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(-s,0,+s), + btVector3(+s,0,+s), + 31,31, + // 31,31, + 1+2+4+8,true); + + psb->getCollisionShape()->setMargin(0.5); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.4; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->setTotalMass(150); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_RbUpStack(pdemo,10); + pdemo->m_cutting=true; +} + +// +// 100kg Stanford's bunny +// +static void Init_Bunny(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny, + &gIndicesBunny[0][0], + BUNNY_NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.5; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.kDF = 0.5; + psb->randomizeConstraints(); + psb->scale(btVector3(6,6,6)); + psb->setTotalMass(100,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + pdemo->m_cutting=true; + +} + +// +// 100kg Stanford's bunny with pose matching +// +static void Init_BunnyMatch(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo, gVerticesBunny, + &gIndicesBunny[0][0], + BUNNY_NUM_TRIANGLES); + psb->m_cfg.kDF = 0.5; + psb->m_cfg.kMT = 0.05; + psb->m_cfg.piterations = 5; + psb->randomizeConstraints(); + psb->scale(btVector3(6,6,6)); + psb->setTotalMass(100,true); + psb->setPose(false,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + +} + +// +// 50Kg Torus +// +static void Init_Torus(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh( pdemo->m_softBodyWorldInfo, gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + psb->generateBendingConstraints(2); + psb->m_cfg.piterations=2; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(SIMD_PI/2,0,0); + psb->transform(btTransform(m,btVector3(0,4,0))); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + pdemo->m_cutting=true; + +} + +// +// 50Kg Torus with pose matching +// +static void Init_TorusMatch(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo, gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + psb->m_materials[0]->m_kLST = 0.1; + psb->m_cfg.kMT = 0.05; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(SIMD_PI/2,0,0); + psb->transform(btTransform(m,btVector3(0,4,0))); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + psb->setPose(false,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); +} + +// +// Cutting1 +// +static void Init_Cutting1(SoftDemo* pdemo) +{ + const btScalar s=6; + const btScalar h=2; + const int r=16; + const btVector3 p[]={ btVector3(+s,h,-s), + btVector3(-s,h,-s), + btVector3(+s,h,+s), + btVector3(-s,h,+s)}; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,p[0],p[1],p[2],p[3],r,r,1+2+4+8,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + psb->m_cfg.piterations=1; + pdemo->m_cutting=true; +} + +// +// Clusters +// + +// +static void Ctor_Gear(SoftDemo* pdemo,const btVector3& pos,btScalar speed) +{ + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(pos); + btCompoundShape* shape=new btCompoundShape(); +#if 1 + shape->addChildShape(btTransform(btQuaternion(0,0,0)),new btBoxShape(btVector3(5,1,6))); + shape->addChildShape(btTransform(btQuaternion(0,0,SIMD_HALF_PI)),new btBoxShape(btVector3(5,1,6))); +#else + shape->addChildShape(btTransform(btQuaternion(0,0,0)),new btCylinderShapeZ(btVector3(5,1,7))); + shape->addChildShape(btTransform(btQuaternion(0,0,SIMD_HALF_PI)),new btBoxShape(btVector3(4,1,8))); +#endif + btRigidBody* body=pdemo->localCreateRigidBody(10,startTransform,shape); + body->setFriction(1); + btDynamicsWorld* world=pdemo->getDynamicsWorld(); + btHingeConstraint* hinge=new btHingeConstraint(*body,btTransform::getIdentity()); + if(speed!=0) hinge->enableAngularMotor(true,speed,3); + world->addConstraint(hinge); +} + +// +static btSoftBody* Ctor_ClusterBunny(SoftDemo* pdemo,const btVector3& x,const btVector3& a) +{ + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny,&gIndicesBunny[0][0],BUNNY_NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 1; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.kDF = 1; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(8,8,8)); + psb->setTotalMass(150,true); + psb->generateClusters(1); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); +} + +// +static btSoftBody* Ctor_ClusterTorus(SoftDemo* pdemo,const btVector3& x,const btVector3& a,const btVector3& s=btVector3(2,2,2)) +{ + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices,&gIndices[0][0],NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 1; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->randomizeConstraints(); + psb->scale(s); + psb->rotate(btQuaternion(a[0],a[1],a[2])); + psb->translate(x); + psb->setTotalMass(50,true); + psb->generateClusters(64); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); +} + +// +static struct MotorControl : btSoftBody::AJoint::IControl +{ + MotorControl() + { + goal=0; + maxtorque=0; + } + btScalar Speed(btSoftBody::AJoint*,btScalar current) + { + return(current+btMin(maxtorque,btMax(-maxtorque,goal-current))); + } + btScalar goal; + btScalar maxtorque; +} motorcontrol; + +// +struct SteerControl : btSoftBody::AJoint::IControl +{ + SteerControl(btScalar s) + { + angle=0; + sign=s; + } + void Prepare(btSoftBody::AJoint* joint) + { + joint->m_refs[0][0]=btCos(angle*sign); + joint->m_refs[0][2]=btSin(angle*sign); + } + btScalar Speed(btSoftBody::AJoint* joint,btScalar current) + { + return(motorcontrol.Speed(joint,current)); + } + btScalar angle; + btScalar sign; +}; + +static SteerControl steercontrol_f(+1); +static SteerControl steercontrol_r(-1); + +// +static void Init_ClusterDeform(SoftDemo* pdemo) +{ + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); + psb->generateClusters(8); + psb->m_cfg.kDF=1; +} + +// +static void Init_ClusterCollide1(SoftDemo* pdemo) +{ + const btScalar s=8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(-s,0,+s), + btVector3(+s,0,+s), + 17,17,//9,9,//31,31, + 1+2+4+8, + true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.4; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->m_cfg.kDF = 1; + psb->m_cfg.kSRHR_CL = 1; + psb->m_cfg.kSR_SPLT_CL = 0; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ + + btSoftBody::fCollision::CL_RS; + psb->generateBendingConstraints(2,pm); + + psb->getCollisionShape()->setMargin(0.05); + psb->setTotalMass(50); + + ///pass zero in generateClusters to create cluster for each tetrahedron or triangle + psb->generateClusters(0); + //psb->generateClusters(64); + + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_RbUpStack(pdemo,10); +} + +// +static void Init_ClusterCollide2(SoftDemo* pdemo) +{ + struct Functor + { + static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) + { + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations=2; + psb->m_cfg.kDF =1; + psb->m_cfg.kSSHR_CL =1; + psb->m_cfg.kSS_SPLT_CL =0; + psb->m_cfg.kSKHR_CL =0.1f; + psb->m_cfg.kSK_SPLT_CL =1; + psb->m_cfg.collisions= btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + psb->generateClusters(16); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + for(int i=0;i<3;++i) + { + Functor::Create(pdemo,btVector3(3*i,2,0),btVector3(SIMD_PI/2*(1-(i&1)),SIMD_PI/2*(i&1),0)); + } +} + +// +static void Init_ClusterSocket(SoftDemo* pdemo) +{ + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); + btRigidBody* prb=Ctor_BigPlate(pdemo,50,8); + psb->m_cfg.kDF=1; + btSoftBody::LJoint::Specs lj; + lj.position = btVector3(0,5,0); + psb->appendLinearJoint(lj,prb); +} + +// +static void Init_ClusterHinge(SoftDemo* pdemo) +{ + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); + btRigidBody* prb=Ctor_BigPlate(pdemo,50,8); + psb->m_cfg.kDF=1; + btSoftBody::AJoint::Specs aj; + aj.axis = btVector3(0,0,1); + psb->appendAngularJoint(aj,prb); +} + +// +static void Init_ClusterCombine(SoftDemo* pdemo) +{ + const btVector3 sz(2,4,2); + btSoftBody* psb0=Ctor_ClusterTorus(pdemo,btVector3(0,8,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI),sz); + btSoftBody* psb1=Ctor_ClusterTorus(pdemo,btVector3(0,8,10),btVector3(SIMD_PI/2,0,SIMD_HALF_PI),sz); + btSoftBody* psbs[]={psb0,psb1}; + for(int j=0;j<2;++j) + { + psbs[j]->m_cfg.kDF=1; + psbs[j]->m_cfg.kDP=0; + psbs[j]->m_cfg.piterations=1; + psbs[j]->m_clusters[0]->m_matching = 0.05; + psbs[j]->m_clusters[0]->m_ndamping = 0.05; + } + btSoftBody::AJoint::Specs aj; + aj.axis = btVector3(0,0,1); + aj.icontrol = &motorcontrol; + psb0->appendAngularJoint(aj,psb1); + + btSoftBody::LJoint::Specs lj; + lj.position = btVector3(0,8,5); + psb0->appendLinearJoint(lj,psb1); +} + +// +static void Init_ClusterCar(SoftDemo* pdemo) +{ + pdemo->setAzi(180); + const btVector3 origin(100,80,0); + const btQuaternion orientation(-SIMD_PI/2,0,0); + const btScalar widthf=8; + const btScalar widthr=9; + const btScalar length=8; + const btScalar height=4; + const btVector3 wheels[]= { + btVector3(+widthf,-height,+length), // Front left + btVector3(-widthf,-height,+length), // Front right + btVector3(+widthr,-height,-length), // Rear left + btVector3(-widthr,-height,-length), // Rear right + }; + btSoftBody* pa=Ctor_ClusterBunny(pdemo,btVector3(0,0,0),btVector3(0,0,0)); + btSoftBody* pfl=Ctor_ClusterTorus(pdemo,wheels[0],btVector3(0,0,SIMD_HALF_PI),btVector3(2,4,2)); + btSoftBody* pfr=Ctor_ClusterTorus(pdemo,wheels[1],btVector3(0,0,SIMD_HALF_PI),btVector3(2,4,2)); + btSoftBody* prl=Ctor_ClusterTorus(pdemo,wheels[2],btVector3(0,0,SIMD_HALF_PI),btVector3(2,5,2)); + btSoftBody* prr=Ctor_ClusterTorus(pdemo,wheels[3],btVector3(0,0,SIMD_HALF_PI),btVector3(2,5,2)); + + pfl->m_cfg.kDF = + pfr->m_cfg.kDF = + prl->m_cfg.kDF = + prr->m_cfg.kDF = 1; + + btSoftBody::LJoint::Specs lspecs; + lspecs.cfm = 1; + lspecs.erp = 1; + lspecs.position = btVector3(0,0,0); + + lspecs.position=wheels[0];pa->appendLinearJoint(lspecs,pfl); + lspecs.position=wheels[1];pa->appendLinearJoint(lspecs,pfr); + lspecs.position=wheels[2];pa->appendLinearJoint(lspecs,prl); + lspecs.position=wheels[3];pa->appendLinearJoint(lspecs,prr); + + btSoftBody::AJoint::Specs aspecs; + aspecs.cfm = 1; + aspecs.erp = 1; + aspecs.axis = btVector3(1,0,0); + + aspecs.icontrol = &steercontrol_f; + pa->appendAngularJoint(aspecs,pfl); + pa->appendAngularJoint(aspecs,pfr); + + aspecs.icontrol = &motorcontrol; + pa->appendAngularJoint(aspecs,prl); + pa->appendAngularJoint(aspecs,prr); + + pa->rotate(orientation); + pfl->rotate(orientation); + pfr->rotate(orientation); + prl->rotate(orientation); + prr->rotate(orientation); + pa->translate(origin); + pfl->translate(origin); + pfr->translate(origin); + prl->translate(origin); + prr->translate(origin); + pfl->m_cfg.piterations = + pfr->m_cfg.piterations = + prl->m_cfg.piterations = + prr->m_cfg.piterations = 1; + pfl->m_clusters[0]->m_matching = + pfr->m_clusters[0]->m_matching = + prl->m_clusters[0]->m_matching = + prr->m_clusters[0]->m_matching = 0.05; + pfl->m_clusters[0]->m_ndamping = + pfr->m_clusters[0]->m_ndamping = + prl->m_clusters[0]->m_ndamping = + prr->m_clusters[0]->m_ndamping = 0.05; + + Ctor_LinearStair(pdemo,btVector3(0,-8,0),btVector3(3,2,40),0,20); + Ctor_RbUpStack(pdemo,50); + pdemo->m_autocam=true; +} + +// +static void Init_ClusterRobot(SoftDemo* pdemo) +{ + struct Functor + { + static btSoftBody* CreateBall(SoftDemo* pdemo,const btVector3& pos) + { + btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,pos,btVector3(1,1,1)*3,512); + psb->m_materials[0]->m_kLST = 0.45; + psb->m_cfg.kVC = 20; + psb->setTotalMass(50,true); + psb->setPose(true,false); + psb->generateClusters(1); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + const btVector3 base=btVector3(0,25,8); + btSoftBody* psb0=Functor::CreateBall(pdemo,base+btVector3(-8,0,0)); + btSoftBody* psb1=Functor::CreateBall(pdemo,base+btVector3(+8,0,0)); + btSoftBody* psb2=Functor::CreateBall(pdemo,base+btVector3(0,0,+8*btSqrt(2))); + const btVector3 ctr=(psb0->clusterCom(0)+psb1->clusterCom(0)+psb2->clusterCom(0))/3; + btCylinderShape* pshp=new btCylinderShape(btVector3(8,1,8)); + btRigidBody* prb=pdemo->localCreateRigidBody(50,btTransform(btQuaternion(0,0,0),ctr+btVector3(0,5,0)),pshp); + btSoftBody::LJoint::Specs ls; + ls.erp=0.5f; + ls.position=psb0->clusterCom(0);psb0->appendLinearJoint(ls,prb); + ls.position=psb1->clusterCom(0);psb1->appendLinearJoint(ls,prb); + ls.position=psb2->clusterCom(0);psb2->appendLinearJoint(ls,prb); + + btBoxShape* pbox=new btBoxShape(btVector3(20,1,40)); + btRigidBody* pgrn=pdemo->localCreateRigidBody(0,btTransform(btQuaternion(0,-SIMD_HALF_PI/2,0),btVector3(0,0,0)),pbox); + + pdemo->m_autocam=true; +} + +// +static void Init_ClusterStackSoft(SoftDemo* pdemo) +{ + for(int i=0;i<10;++i) + { + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,-9+8.25*i,0),btVector3(0,0,0)); + psb->m_cfg.kDF=1; + } +} + +// +static void Init_ClusterStackMixed(SoftDemo* pdemo) +{ + for(int i=0;i<10;++i) + { + if((i+1)&1) + { + Ctor_BigPlate(pdemo,50,-9+4.25*i); + } + else + { + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,-9+4.25*i,0),btVector3(0,0,0)); + psb->m_cfg.kDF=1; + } + } +} + + +// +// TetraBunny +// +static void Init_TetraBunny(SoftDemo* pdemo) +{ + btSoftBody* psb=btSoftBodyHelpers::CreateFromTetGenData(pdemo->m_softBodyWorldInfo, + TetraBunny::getElements(), + 0, + TetraBunny::getNodes(), + false,true,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + psb->rotate(btQuaternion(SIMD_PI/2,0,0)); + psb->setVolumeMass(150); + psb->m_cfg.piterations=2; + //psb->m_cfg.piterations=1; + pdemo->m_cutting=true; + //psb->getCollisionShape()->setMargin(0.01); + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ btSoftBody::fCollision::CL_RS + //+ btSoftBody::fCollision::CL_SELF + ; + + ///pass zero in generateClusters to create cluster for each tetrahedron or triangle + psb->generateClusters(0); + //psb->m_materials[0]->m_kLST=.2; + psb->m_cfg.kDF = 10. ; + + +} + +// +// TetraCube +// +static void Init_TetraCube(SoftDemo* pdemo) +{ + btSoftBody* psb=btSoftBodyHelpers::CreateFromTetGenData(pdemo->m_softBodyWorldInfo, + TetraCube::getElements(), + 0, + TetraCube::getNodes(), + false,true,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + psb->scale(btVector3(4,4,4)); + psb->translate(btVector3(0,5,0)); + psb->setVolumeMass(300); + + + ///fix one vertex + //psb->setMass(0,0); + //psb->setMass(10,0); + //psb->setMass(20,0); + psb->m_cfg.piterations=1; + //psb->generateClusters(128); + psb->generateClusters(16); + //psb->getCollisionShape()->setMargin(0.5); + + psb->getCollisionShape()->setMargin(0.01); + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ btSoftBody::fCollision::CL_RS + //+ btSoftBody::fCollision::CL_SELF + ; + psb->m_materials[0]->m_kLST=0.8; + pdemo->m_cutting=true; +} + + + +unsigned current_demo=28;//19; + +void SoftDemo::clientResetScene() +{ + m_azi = 0; + m_cameraDistance = 30.f; + m_cameraTargetPosition.setValue(0,0,0); + + 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; + } + btSoftBody* softBody = btSoftBody::upcast(obj); + if (softBody) + { + getSoftDynamicsWorld()->removeSoftBody(softBody); + } else + { + btRigidBody* body = btRigidBody::upcast(obj); + if (body) + m_dynamicsWorld->removeRigidBody(body); + else + m_dynamicsWorld->removeCollisionObject(obj); + } + delete obj; + } + + m_softBodyWorldInfo.m_sparsesdf.Reset(); + /* Init */ + void (*demofncs[])(SoftDemo*)= + { + Init_Cloth, + Init_Pressure, + Init_Volume, + Init_Ropes, + Init_RopeAttach, + Init_ClothAttach, + Init_Sticks, + Init_Collide, + Init_Collide2, + Init_Collide3, + Init_Impact, + Init_Aero, + Init_Friction, + Init_Torus, + Init_TorusMatch, + Init_Bunny, + Init_BunnyMatch, + Init_Cutting1, + Init_ClusterDeform, + Init_ClusterCollide1, + Init_ClusterCollide2, + Init_ClusterSocket, + Init_ClusterHinge, + Init_ClusterCombine, + Init_ClusterCar, + Init_ClusterRobot, + Init_ClusterStackSoft, + Init_ClusterStackMixed, + Init_TetraCube, + Init_TetraBunny, + }; + current_demo=current_demo%(sizeof(demofncs)/sizeof(demofncs[0])); + + + //create ground object + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(0,-12,0)); + + btCollisionObject* newOb = new btCollisionObject(); + newOb->setWorldTransform(tr); + newOb->setInterpolationWorldTransform( tr); + if (current_demo>19) + { + newOb->setCollisionShape(m_collisionShapes[0]); + } else + { + newOb->setCollisionShape(m_collisionShapes[1]); + } + + m_dynamicsWorld->addCollisionObject(newOb); + + motorcontrol.goal = 0; + motorcontrol.maxtorque = 0; + + + + m_softBodyWorldInfo.air_density = (btScalar)1.2; + m_softBodyWorldInfo.water_density = 0; + m_softBodyWorldInfo.water_offset = 0; + m_softBodyWorldInfo.water_normal = btVector3(0,0,0); + m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); + + + m_autocam = false; + m_raycast = false; + m_cutting = false; + m_results.fraction = 1.f; + demofncs[current_demo](this); +} + +void SoftDemo::renderme() +{ + btIDebugDraw* idraw=m_dynamicsWorld->getDebugDrawer(); + + m_dynamicsWorld->debugDrawWorld(); + + /* Bodies */ + btVector3 ps(0,0,0); + int nps=0; + + btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); + for(int ib=0;ibm_nodes.size(); + for(int i=0;im_nodes.size();++i) + { + ps+=psb->m_nodes[i].m_x; + } + } + ps/=nps; + if(m_autocam) + m_cameraTargetPosition+=(ps-m_cameraTargetPosition)*0.05; + /* Anm */ + if(!isIdle()) + m_animtime=m_clock.getTimeMilliseconds()/1000.f; + /* Ray cast */ + if(m_raycast) + { + /* Prepare rays */ + const int res=64; + const btScalar fres=res-1; + const btScalar size=8; + const btScalar dist=10; + btTransform trs; + trs.setOrigin(ps); + btScalar rayLength = 1000.f; + + const btScalar angle=m_animtime*0.2; + trs.setRotation(btQuaternion(angle,SIMD_PI/4,0)); + btVector3 dir=trs.getBasis()*btVector3(0,-1,0); + trs.setOrigin(ps-dir*dist); + btAlignedObjectArray origins; + btAlignedObjectArray fractions; + origins.resize(res*res); + fractions.resize(res*res,1.f); + for(int y=0;yrayTest(rayFrom,rayTo,results)) + { + *fraction=results.fraction; + } + } + ++org;++fraction; + } + long ms=btMax(m_clock.getTimeMilliseconds(),1); + long rayperseconds=(1000*(origins.size()*sbs.size()))/ms; + printf("%d ms (%d rays/s)\r\n",int(ms),int(rayperseconds)); + } + /* Draw rays */ + const btVector3 c[]={ origins[0], + origins[res-1], + origins[res*(res-1)], + origins[res*(res-1)+res-1]}; + idraw->drawLine(c[0],c[1],btVector3(0,0,0)); + idraw->drawLine(c[1],c[3],btVector3(0,0,0)); + idraw->drawLine(c[3],c[2],btVector3(0,0,0)); + idraw->drawLine(c[2],c[0],btVector3(0,0,0)); + for(int i=0,ni=origins.size();idrawLine(org,org+dir*rayLength*fraction,btVector3(1,0,0)); + } + else + { + idraw->drawLine(org,org-dir*rayLength*0.1,btVector3(0,0,0)); + } + } +#undef RES + } + /* Water level */ + static const btVector3 axis[]={btVector3(1,0,0), + btVector3(0,1,0), + btVector3(0,0,1)}; + if(m_softBodyWorldInfo.water_density>0) + { + const btVector3 c= btVector3((btScalar)0.25,(btScalar)0.25,1); + const btScalar a= (btScalar)0.5; + const btVector3 n= m_softBodyWorldInfo.water_normal; + const btVector3 o= -n*m_softBodyWorldInfo.water_offset; + const btVector3 x= btCross(n,axis[n.minAxis()]).normalized(); + const btVector3 y= btCross(x,n).normalized(); + const btScalar s= 25; + idraw->drawTriangle(o-x*s-y*s,o+x*s-y*s,o+x*s+y*s,c,a); + idraw->drawTriangle(o-x*s-y*s,o+x*s+y*s,o-x*s+y*s,c,a); + } + // + DemoApplication::renderme(); + +} + +void SoftDemo::setDrawClusters(bool drawClusters) +{ + if (drawClusters) + { + getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()|fDrawFlags::Clusters); + } else + { + getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()& (~fDrawFlags::Clusters)); + } +} + + + +void SoftDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch(key) + { + case 'n': motorcontrol.maxtorque=10;motorcontrol.goal+=1;break; + case 'm': motorcontrol.maxtorque=10;motorcontrol.goal-=1;break; + case 'l': steercontrol_f.angle+=0.1;steercontrol_r.angle+=0.1;break; + case 'k': steercontrol_f.angle-=0.1;steercontrol_r.angle-=0.1;break; + case ']': ++current_demo;clientResetScene();break; + case '[': --current_demo;clientResetScene();break; + case ',': m_raycast=!m_raycast;break; + case ';': m_autocam=!m_autocam;break; + case 'c': getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()^fDrawFlags::Clusters);break; + case '`': + { + btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); + for(int ib=0;ibstaticSolve(128); + } + } + break; + default: DemoApplication::keyboardCallback(key,x,y); + } +} + +// +void SoftDemo::mouseMotionFunc(int x,int y) +{ + if(m_node&&(m_results.fraction<1.f)) + { + if(!m_drag) + { +#define SQ(_x_) (_x_)*(_x_) + if((SQ(x-m_lastmousepos[0])+SQ(y-m_lastmousepos[1]))>6) + { + m_drag=true; + } +#undef SQ + } + if(m_drag) + { + m_lastmousepos[0] = x; + m_lastmousepos[1] = y; + } + } + else + { + DemoApplication::mouseMotionFunc(x,y); + } +} + +// +void SoftDemo::mouseFunc(int button, int state, int x, int y) +{ + if(button==0) + { + switch(state) + { + case 0: + { + m_results.fraction=1.f; + DemoApplication::mouseFunc(button,state,x,y); + if(!m_pickConstraint) + { + const btVector3 rayFrom=m_cameraPosition; + const btVector3 rayTo=getRayTo(x,y); + const btVector3 rayDir=(rayTo-rayFrom).normalized(); + btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); + for(int ib=0;ibrayTest(rayFrom,rayTo,res)) + { + m_results=res; + } + } + if(m_results.fraction<1.f) + { + m_impact = rayFrom+(rayTo-rayFrom)*m_results.fraction; + m_drag = false; + m_lastmousepos[0] = x; + m_lastmousepos[1] = y; + m_node = 0; + switch(m_results.feature) + { + case btSoftBody::eFeature::Face: + { + btSoftBody::Face& f=m_results.body->m_faces[m_results.index]; + m_node=f.m_n[0]; + for(int i=1;i<3;++i) + { + if( (m_node->m_x-m_impact).length2()> + (f.m_n[i]->m_x-m_impact).length2()) + { + m_node=f.m_n[i]; + } + } + } + break; + } + if(m_node) m_goal=m_node->m_x; + return; + } + } + } + break; + case 1: + if((!m_drag)&&m_cutting&&(m_results.fraction<1.f)) + { + ImplicitSphere isphere(m_impact,1); + printf("Mass before: %f\r\n",m_results.body->getTotalMass()); + m_results.body->refine(&isphere,0.0001,true); + printf("Mass after: %f\r\n",m_results.body->getTotalMass()); + } + m_results.fraction=1.f; + m_drag=false; + DemoApplication::mouseFunc(button,state,x,y); + break; + } + } + else + { + DemoApplication::mouseFunc(button,state,x,y); + } +} + + +void SoftDemo::initPhysics() +{ + ///create concave ground mesh + + + m_azi = 0; + + //reset and disable motorcontrol at the start + motorcontrol.goal = 0; + motorcontrol.maxtorque = 0; + + btCollisionShape* groundShape = 0; + { + 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;isetMargin(0.5); + } + + m_collisionShapes.push_back(groundShape); + + btCollisionShape* groundBox = new btBoxShape (btVector3(100,CUBE_HALF_EXTENTS,100)); + m_collisionShapes.push_back(groundBox); + + btCompoundShape* cylinderCompound = new btCompoundShape; + btCollisionShape* cylinderShape = new btCylinderShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); + btTransform localTransform; + localTransform.setIdentity(); + cylinderCompound->addChildShape(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; + + ///register some softbody collision algorithms on top of the default btDefaultCollisionConfiguration + m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration(); + + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + m_softBodyWorldInfo.m_dispatcher = m_dispatcher; + + //////////////////////////// + ///Register softbody versus softbody collision algorithm + + + ///Register softbody versus rigidbody collision algorithm + + + //////////////////////////// + + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + m_softBodyWorldInfo.m_broadphase = m_broadphase; + + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver; + + btDiscreteDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + m_dynamicsWorld->setInternalTickCallback(pickingPreTickCallback,this,true); + + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); + + + + + + + // clientResetScene(); + + m_softBodyWorldInfo.m_sparsesdf.Initialize(); + clientResetScene(); +} + + + + + + +void SoftDemo::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_SoftSoftCollisionAlgorithms; - - btAlignedObjectArray m_SoftRigidCollisionAlgorithms; - - btSoftBodyWorldInfo m_softBodyWorldInfo; - - - bool m_autocam; - bool m_cutting; - bool m_raycast; - btScalar m_animtime; - btClock m_clock; - int m_lastmousepos[2]; - btVector3 m_impact; - btSoftBody::sRayCast m_results; - btSoftBody::Node* m_node; - 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(); - - SoftDemo() : m_drag(false) - { - setTexturing(true); - setShadows(true); - } - virtual ~SoftDemo() - { - exitPhysics(); - } - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); - - static DemoApplication* Create() - { - SoftDemo* demo = new SoftDemo; - demo->myinit(); - demo->initPhysics(); - return demo; - } - - virtual void setDrawClusters(bool drawClusters); - - virtual const btSoftRigidDynamicsWorld* getSoftDynamicsWorld() const - { - ///just make it a btSoftRigidDynamicsWorld please - ///or we will add type checking - return (btSoftRigidDynamicsWorld*) m_dynamicsWorld; - } - - virtual btSoftRigidDynamicsWorld* getSoftDynamicsWorld() - { - ///just make it a btSoftRigidDynamicsWorld please - ///or we will add type checking - return (btSoftRigidDynamicsWorld*) 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 SoftDemo##a : public SoftDemo\ -{\ -public:\ - static DemoApplication* Create()\ - {\ - SoftDemo* demo = new SoftDemo##a;\ - extern unsigned int current_demo;\ - current_demo=a;\ - demo->myinit();\ - demo->initPhysics();\ - return demo;\ - }\ -}; - - -MACRO_SOFT_DEMO(0) //Init_Cloth -MACRO_SOFT_DEMO(1) //Init_Pressure -MACRO_SOFT_DEMO(2)//Init_Volume -MACRO_SOFT_DEMO(3)//Init_Ropes -MACRO_SOFT_DEMO(4)//Init_Ropes_Attach -MACRO_SOFT_DEMO(5)//Init_ClothAttach -MACRO_SOFT_DEMO(6)//Init_Sticks -MACRO_SOFT_DEMO(7)//Init_Collide -MACRO_SOFT_DEMO(8)//Init_Collide2 -MACRO_SOFT_DEMO(9)//Init_Collide3 -MACRO_SOFT_DEMO(10)//Init_Impact -MACRO_SOFT_DEMO(11)//Init_Aero -MACRO_SOFT_DEMO(12)//Init_Friction -MACRO_SOFT_DEMO(13)//Init_Torus -MACRO_SOFT_DEMO(14)//Init_TorusMatch -MACRO_SOFT_DEMO(15)//Init_Bunny -MACRO_SOFT_DEMO(16)//Init_BunnyMatch -MACRO_SOFT_DEMO(17)//Init_Cutting1 -MACRO_SOFT_DEMO(18)//Init_ClusterDeform -MACRO_SOFT_DEMO(19)//Init_ClusterCollide1 -MACRO_SOFT_DEMO(20)//Init_ClusterCollide2 -MACRO_SOFT_DEMO(21)//Init_ClusterSocket -MACRO_SOFT_DEMO(22)//Init_ClusterHinge -MACRO_SOFT_DEMO(23)//Init_ClusterCombine -MACRO_SOFT_DEMO(24)//Init_ClusterCar -MACRO_SOFT_DEMO(25)//Init_ClusterRobot -MACRO_SOFT_DEMO(26)//Init_ClusterStackSoft -MACRO_SOFT_DEMO(27)//Init_ClusterStackMixed -MACRO_SOFT_DEMO(28)//Init_TetraCube -MACRO_SOFT_DEMO(29)//Init_TetraBunny - - -#endif //CCD_PHYSICS_DEMO_H - - - - - + +/* +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. +*/ + +///btSoftBody implementation by Nathanael Presson + +#ifndef SOFT_DEMO_H +#define SOFT_DEMO_H + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif +#include "LinearMath/btAlignedObjectArray.h" +#include "BulletSoftBody/btSoftBody.h" + + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +///collisions between two btSoftBody's +class btSoftSoftCollisionAlgorithm; + +///collisions between a btSoftBody and a btRigidBody +class btSoftRididCollisionAlgorithm; +class btSoftRigidDynamicsWorld; + + +///CcdPhysicsDemo shows basic stacking using Bullet physics, and allows toggle of Ccd (using key '1') +class SoftDemo : public PlatformDemoApplication +{ +public: + + btAlignedObjectArray m_SoftSoftCollisionAlgorithms; + + btAlignedObjectArray m_SoftRigidCollisionAlgorithms; + + btSoftBodyWorldInfo m_softBodyWorldInfo; + + + bool m_autocam; + bool m_cutting; + bool m_raycast; + btScalar m_animtime; + btClock m_clock; + int m_lastmousepos[2]; + btVector3 m_impact; + btSoftBody::sRayCast m_results; + btSoftBody::Node* m_node; + 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(); + + SoftDemo() : m_drag(false) + { + setTexturing(true); + setShadows(true); + } + virtual ~SoftDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + SoftDemo* demo = new SoftDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + virtual void setDrawClusters(bool drawClusters); + + virtual const btSoftRigidDynamicsWorld* getSoftDynamicsWorld() const + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btSoftRigidDynamicsWorld*) m_dynamicsWorld; + } + + virtual btSoftRigidDynamicsWorld* getSoftDynamicsWorld() + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btSoftRigidDynamicsWorld*) 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 SoftDemo##a : public SoftDemo\ +{\ +public:\ + static DemoApplication* Create()\ + {\ + SoftDemo* demo = new SoftDemo##a;\ + extern unsigned int current_demo;\ + current_demo=a;\ + demo->myinit();\ + demo->initPhysics();\ + return demo;\ + }\ +}; + + +MACRO_SOFT_DEMO(0) //Init_Cloth +MACRO_SOFT_DEMO(1) //Init_Pressure +MACRO_SOFT_DEMO(2)//Init_Volume +MACRO_SOFT_DEMO(3)//Init_Ropes +MACRO_SOFT_DEMO(4)//Init_Ropes_Attach +MACRO_SOFT_DEMO(5)//Init_ClothAttach +MACRO_SOFT_DEMO(6)//Init_Sticks +MACRO_SOFT_DEMO(7)//Init_Collide +MACRO_SOFT_DEMO(8)//Init_Collide2 +MACRO_SOFT_DEMO(9)//Init_Collide3 +MACRO_SOFT_DEMO(10)//Init_Impact +MACRO_SOFT_DEMO(11)//Init_Aero +MACRO_SOFT_DEMO(12)//Init_Friction +MACRO_SOFT_DEMO(13)//Init_Torus +MACRO_SOFT_DEMO(14)//Init_TorusMatch +MACRO_SOFT_DEMO(15)//Init_Bunny +MACRO_SOFT_DEMO(16)//Init_BunnyMatch +MACRO_SOFT_DEMO(17)//Init_Cutting1 +MACRO_SOFT_DEMO(18)//Init_ClusterDeform +MACRO_SOFT_DEMO(19)//Init_ClusterCollide1 +MACRO_SOFT_DEMO(20)//Init_ClusterCollide2 +MACRO_SOFT_DEMO(21)//Init_ClusterSocket +MACRO_SOFT_DEMO(22)//Init_ClusterHinge +MACRO_SOFT_DEMO(23)//Init_ClusterCombine +MACRO_SOFT_DEMO(24)//Init_ClusterCar +MACRO_SOFT_DEMO(25)//Init_ClusterRobot +MACRO_SOFT_DEMO(26)//Init_ClusterStackSoft +MACRO_SOFT_DEMO(27)//Init_ClusterStackMixed +MACRO_SOFT_DEMO(28)//Init_TetraCube +MACRO_SOFT_DEMO(29)//Init_TetraBunny + + +#endif //CCD_PHYSICS_DEMO_H + + + + + diff --git a/Demos/SoftDemo/bunny.inl b/Demos/SoftDemo/bunny.inl index d5f838d95..fbdbfd3fb 100755 --- a/Demos/SoftDemo/bunny.inl +++ b/Demos/SoftDemo/bunny.inl @@ -1,4 +1,4 @@ -static const char* getNodes() { return( -"454 3 0 0\n"" 0 -2.0063499999999999 0.79804200000000003 0.373554\n"" 1 -2.1011299999999999 0.90212400000000004 -0.88661400000000001\n"" 2 -1.4052100000000001 2.0628700000000002 -1.0458400000000001\n"" 3 -1.2015499999999999 1.7112400000000001 0.56249400000000005\n"" 4 0.02112 2.8512499999999998 -0.95618999999999998\n"" 5 0.011136 2.5152199999999998 0.59149200000000002\n"" 6 -1.51681 0.56199600000000005 1.42523\n"" 7 -0.977406 1.4278999999999999 1.24143\n"" 8 0.0051900000000000002 1.9088499999999999 1.41222\n"" 9 -2.4877400000000001 0.98449799999999998 -1.6695199999999999\n"" 10 -1.57328 2.1440000000000001 -1.7594799999999999\n"" 11 0.027768000000000001 2.8961600000000001 -2.0317599999999998\n"" 12 -2.4129700000000001 0.80116799999999999 -2.6594799999999998\n"" 13 -1.46269 1.9456500000000001 -2.6205799999999999\n"" 14 0.031758000000000002 2.6255500000000001 -2.7499899999999999\n"" 15 -2.0392999999999999 -0.24690000000000001 -4.0092699999999999\n"" 16 -1.4902899999999999 1.53495 -3.7649599999999999\n"" 17 0.037566000000000002 2.2566199999999998 -3.78904\n"" 18 -1.29721 -0.760656 -5.3216200000000002\n"" 19 -1.0264500000000001 0.069264000000000006 -5.2883199999999997\n"" 20 -1.0864400000000001 0.58933800000000003 -4.8886700000000003\n"" 21 -0.71934600000000004 1.3127200000000001 -4.5609200000000003\n"" 22 -0.47337000000000001 1.6606799999999999 -4.4356900000000001\n"" 23 0.040806000000000002 1.86575 -4.4139699999999999\n"" 24 -1.01305 0.61432200000000003 -5.5222899999999999\n"" 25 -0.62443199999999999 1.0636699999999999 -5.7151800000000001\n"" 26 -0.77822400000000003 1.2710900000000001 -5.0200699999999996\n"" 27 -0.59924999999999995 1.8655900000000001 -4.7962899999999999\n"" 28 0.043422000000000002 2.1701199999999998 -4.7666300000000001\n"" 29 -0.467478 1.5525199999999999 -5.5298400000000001\n"" 30 0.047742 1.6934499999999999 -5.5900800000000004\n"" 31 -1.5133300000000001 -3.3024100000000001 -3.3468599999999999\n"" 32 -1.6057999999999999 -3.6205099999999999 -3.9312499999999999\n"" 33 -2.6810299999999998 -0.71110200000000001 -2.7969499999999998\n"" 34 -2.7569300000000001 -0.55810199999999999 -1.86805\n"" 35 -2.2238699999999998 -0.60064799999999996 -0.95672400000000002\n"" 36 -2.2319 -0.55194600000000005 -0.066264000000000003\n"" 37 -1.97367 -0.58961399999999997 0.53195400000000004\n"" 38 -1.6947099999999999 -0.11317199999999999 1.8690100000000001\n"" 39 -2.11442 -0.78804600000000002 0.86941199999999996\n"" 40 -2.1847599999999998 -1.2017899999999999 1.2143299999999999\n"" 41 -1.7037899999999999 -1.3912100000000001 0.142008\n"" 42 -1.79366 -0.93130800000000002 2.2183000000000002\n"" 43 -1.7627200000000001 -0.73113600000000001 2.51458\n"" 44 -1.74098 -1.74478 0.64694399999999996\n"" 45 -1.5849899999999999 -1.6370899999999999 0.218082\n"" 46 -1.3714 -2.2354400000000001 1.7418499999999999\n"" 47 -1.14259 -1.7219800000000001 2.5314999999999999\n"" 48 -1.1462300000000001 -1.44584 3.04271\n"" 49 -1.72363 -1.65859 -0.39266400000000001\n"" 50 -1.7740499999999999 -1.6849099999999999 -1.0451999999999999\n"" 51 -2.3972199999999999 -1.87879 -2.2570000000000001\n"" 52 -2.3559999999999999 -2.9314900000000002 -2.5649600000000001\n"" 53 -1.9900100000000001 -3.4211100000000001 -2.7963200000000001\n"" 54 -1.69374 -3.7088399999999999 -3.53532\n"" 55 -2.2454299999999998 -3.5692900000000001 -1.9397899999999999\n"" 56 -2.2864300000000002 -3.77834 -2.10466\n"" 57 -2.2926700000000002 -3.7443599999999999 -1.3294600000000001\n"" 58 -1.6362099999999999 -3.39913 1.55494\n"" 59 -1.5402100000000001 -3.9804400000000002 1.7164699999999999\n"" 60 -1.6856899999999999 -2.5701499999999999 0.33473999999999998\n"" 61 -1.1098399999999999 -3.0533600000000001 1.9575899999999999\n"" 62 -1.6798299999999999 -3.1615099999999998 2.3719100000000002\n"" 63 -1.6955899999999999 -3.9803600000000001 2.4744700000000002\n"" 64 -1.1299699999999999 -2.8505600000000002 2.5077199999999999\n"" 65 -1.5803 -3.9803799999999998 2.79962\n"" 66 -1.2543800000000001 -3.9803600000000001 3.05606\n"" 67 -0.012264000000000001 -1.91774 3.31847\n"" 68 -0.0075960000000000003 -2.22756 2.4797799999999999\n"" 69 -1.3185199999999999 -2.03857 -0.24552599999999999\n"" 70 -1.54192 -1.6950700000000001 -0.038094000000000003\n"" 71 -1.6302399999999999 -1.5652900000000001 0.010584\n"" 72 -0.54714600000000002 -2.5150999999999999 -0.27547199999999999\n"" 73 -0.68966400000000005 -2.5785100000000001 -0.74843400000000004\n"" 74 -0.68381999999999998 -2.29792 -1.13124\n"" 75 -1.45807 -2.78965 -1.4571000000000001\n"" 76 -1.88889 -3.03241 -1.94861\n"" 77 0.016643999999999999 -2.6251600000000002 -1.5766\n"" 78 -0.43575000000000003 -2.5064899999999999 -1.32864\n"" 79 -0.96067199999999997 -2.8615900000000001 -1.7606999999999999\n"" 80 0.023154000000000001 -2.7205499999999998 -2.6635\n"" 81 -0.72217799999999999 -3.4893999999999998 -2.6321300000000001\n"" 82 -0.54899399999999998 -3.50515 -1.7670699999999999\n"" 83 -0.69881400000000005 -3.59917 -1.12985\n"" 84 -1.2481899999999999 -3.0818400000000001 -0.807894\n"" 85 -1.41449 -3.6600999999999999 -0.24563399999999999\n"" 86 -2.0695000000000001 -3.7349199999999998 -0.51227999999999996\n"" 87 -2.0184099999999998 -3.1911800000000001 -1.27379\n"" 88 0.011766 -2.7572999999999999 -0.81328199999999995\n"" 89 -0.34977599999999998 -2.5832199999999998 -0.26063999999999998\n"" 90 0.0082679999999999993 -2.6970700000000001 -0.226572\n"" 91 -0.78081 -3.0613299999999999 0.47486400000000001\n"" 92 0.000852 -2.8652899999999999 0.942384\n"" 93 -0.68570399999999998 -2.7192400000000001 1.8263799999999999\n"" 94 -0.003552 -2.6613500000000001 1.71241\n"" 95 -0.33728999999999998 -3.98041 1.95644\n"" 96 -0.15748799999999999 -3.4080599999999999 1.63991\n"" 97 -0.295566 -3.1863800000000002 2.3391199999999999\n"" 98 -0.76257600000000003 -3.9803899999999999 2.8759000000000001\n"" 99 -0.350304 -3.98041 2.2373500000000002\n"" 100 -1.8237699999999999 0.32519399999999998 3.7555299999999998\n"" 101 -1.6115600000000001 1.16042 3.0165999999999999\n"" 102 -1.6629499999999999 0.75673800000000002 2.6597300000000001\n"" 103 -1.72563 -0.034332000000000001 3.1910599999999998\n"" 104 -1.3883799999999999 -0.72773399999999999 3.5243199999999999\n"" 105 -1.52085 -0.490782 4.53925\n"" 106 -1.1709799999999999 -0.82781400000000005 4.3680700000000003\n"" 107 -1.00604 -0.939438 3.6563300000000001\n"" 108 -0.875502 -1.01417 4.1856\n"" 109 -0.46665600000000002 -1.28548 3.7355200000000002\n"" 110 -0.46123799999999998 -1.28983 4.17781\n"" 111 -0.014045999999999999 -1.3988100000000001 3.7371500000000002\n"" 112 -0.016379999999999999 -1.2811600000000001 4.1475999999999997\n"" 113 -0.018815999999999999 -1.15577 4.57639\n"" 114 -0.336816 -1.20733 4.58284\n"" 115 -0.68753399999999998 -0.99715200000000004 4.6243400000000001\n"" 116 -0.93086999999999998 -0.77779200000000004 4.7504299999999997\n"" 117 -1.1016699999999999 -0.35222999999999999 5.0820699999999999\n"" 118 -0.99337200000000003 0.01188 5.0003200000000003\n"" 119 -1.3205 0.11948400000000001 4.6136100000000004\n"" 120 -1.5343800000000001 0.54183599999999998 4.0246899999999997\n"" 121 -1.53356 0.68299799999999999 3.9803299999999999\n"" 122 -1.3582799999999999 1.27593 3.7064400000000002\n"" 123 -0.020202000000000001 -1.17205 4.7980799999999997\n"" 124 -0.17845800000000001 -1.26305 4.9630799999999997\n"" 125 -0.022908000000000001 -1.1687000000000001 5.2418199999999997\n"" 126 -0.024695999999999999 -0.94744200000000001 5.5876099999999997\n"" 127 -0.18768000000000001 -1.1073299999999999 5.3368599999999997\n"" 128 -0.35931000000000002 -1.10669 5.0479799999999999\n"" 129 -0.811998 -0.98599199999999998 5.2691999999999997\n"" 130 -0.51344400000000001 -1.02569 5.55328\n"" 131 -0.98299800000000004 -0.56501999999999997 5.3826799999999997\n"" 132 -0.83066399999999996 -0.62549999999999994 5.6758499999999996\n"" 133 -0.50098200000000004 -0.50960399999999995 5.8776400000000004\n"" 134 -0.026598 -0.87985199999999997 5.9152300000000002\n"" 135 -0.90429000000000004 0.19589999999999999 5.3046699999999998\n"" 136 -0.81535199999999997 -0.21312 5.6727299999999996\n"" 137 -0.42367199999999999 0.22109400000000001 5.8544\n"" 138 -0.026748000000000001 -0.25515599999999999 6.0940200000000004\n"" 139 -0.025493999999999999 0.276252 6.0194400000000003\n"" 140 -0.521814 0.79934400000000005 5.6858000000000004\n"" 141 -0.023238000000000002 0.96962999999999999 5.8229899999999999\n"" 142 -0.75326400000000004 0.84007200000000004 5.5060700000000002\n"" 143 -0.75390599999999997 1.5014799999999999 5.1456099999999996\n"" 144 -0.018762000000000001 1.70442 5.2732200000000002\n"" 145 -0.955044 0.75435600000000003 5.3332699999999997\n"" 146 -1.10284 1.1818200000000001 5.0668800000000003\n"" 147 -0.95933999999999997 1.7504200000000001 4.3948799999999997\n"" 148 -1.1969700000000001 1.2433799999999999 4.6791799999999997\n"" 149 -1.23709 0.98764799999999997 4.1595399999999998\n"" 150 -1.1178900000000001 0.96413400000000005 4.9031599999999997\n"" 151 -1.15696 1.00024 4.6936299999999997\n"" 152 -1.05067 0.66004799999999997 5.1637300000000002\n"" 153 -0.96613199999999999 0.34451999999999999 5.1306700000000003\n"" 154 -1.0339100000000001 0.21693000000000001 4.8971299999999998\n"" 155 -1.14191 0.38449800000000001 4.5636299999999999\n"" 156 -1.1704300000000001 0.77507400000000004 4.3866199999999997\n"" 157 -1.2187600000000001 2.4617200000000001 4.0832199999999998\n"" 158 -1.30006 1.85564 3.8536299999999999\n"" 159 -1.44909 1.8689100000000001 3.5269900000000001\n"" 160 -0.013254 2.19998 4.49648\n"" 161 -0.52937999999999996 2.3775900000000001 4.0718100000000002\n"" 162 -1.02088 0.65710199999999996 5.0446999999999997\n"" 163 -0.96312600000000004 0.40659600000000001 4.9839000000000002\n"" 164 -1.08928 0.83882999999999996 4.8728800000000003\n"" 165 -1.08297 0.89140799999999998 4.6565200000000004\n"" 166 -1.0815300000000001 0.77475000000000005 4.4651500000000004\n"" 167 -1.1177900000000001 0.46984799999999999 4.6161099999999999\n"" 168 -1.00573 0.363234 4.8400499999999997\n"" 169 -1.1392599999999999 0.61656 4.8154899999999996\n"" 170 -0.65003999999999995 2.7326800000000002 3.9430399999999999\n"" 171 -1.4495100000000001 3.1655500000000001 4.0157800000000003\n"" 172 -1.59406 3.0802 3.8075600000000001\n"" 173 -1.21844 2.8713000000000002 3.48916\n"" 174 -1.60063 3.85398 3.6123699999999999\n"" 175 -1.3017700000000001 3.3890799999999999 3.2126100000000002\n"" 176 -1.21326 3.1529699999999998 2.8556599999999999\n"" 177 -1.16333 2.80755 3.12364\n"" 178 -1.5950200000000001 4.5435999999999996 3.0055999999999998\n"" 179 -1.44184 3.9206400000000001 2.77929\n"" 180 -1.8554299999999999 4.6612099999999996 1.82836\n"" 181 -1.62605 4.09856 2.2921100000000001\n"" 182 -1.8726700000000001 4.0265899999999997 1.7201200000000001\n"" 183 -1.6127499999999999 3.7460499999999999 2.2633899999999998\n"" 184 -1.81474 3.2039800000000001 2.1617299999999999\n"" 185 -1.5819399999999999 3.1758600000000001 2.4753799999999999\n"" 186 -1.69387 2.4910000000000001 2.6859999999999999\n"" 187 -1.4352100000000001 2.6525799999999999 2.9736199999999999\n"" 188 -1.32026 3.4141599999999999 2.6752600000000002\n"" 189 -0.0075779999999999997 2.3737900000000001 3.6121699999999999\n"" 190 -0.34406999999999999 2.6552099999999998 3.4333399999999998\n"" 191 -0.53356199999999998 3.0379999999999998 3.1746400000000001\n"" 192 -0.75442799999999999 3.2104599999999999 3.6774800000000001\n"" 193 -0.75750600000000001 3.4630200000000002 2.8989500000000001\n"" 194 -0.89756400000000003 3.6691199999999999 3.34639\n"" 195 -0.979128 3.96475 2.9464800000000002\n"" 196 -1.0348900000000001 3.9803199999999999 2.4925000000000002\n"" 197 -0.96278399999999997 3.5502600000000002 2.2239499999999999\n"" 198 -0.93867 3.2183799999999998 2.2698100000000001\n"" 199 -0.81897600000000004 2.66615 2.5513599999999999\n"" 200 -0.573384 2.24261 2.8419500000000002\n"" 201 -0.62487599999999999 1.89547 2.9886200000000001\n"" 202 -0.0029759999999999999 2.3051599999999999 2.8429000000000002\n"" 203 -0.001098 1.7866200000000001 2.4089200000000002\n"" 204 -0.77425200000000005 1.62087 2.60697\n"" 205 0.00059999999999999995 1.63778 2.09483\n"" 206 -0.67835999999999996 1.4218999999999999 2.31332\n"" 207 0.043560000000000001 0.097865999999999995 -5.3003799999999996\n"" 208 0.047190000000000003 0.73262400000000005 -5.7368199999999998\n"" 209 -0.197052 0.69169199999999997 -5.7195099999999996\n"" 210 -0.53469 0.65069399999999999 -5.7019000000000002\n"" 211 -0.28464 0.088373999999999994 -5.2965400000000002\n"" 212 -0.62674799999999997 0.078822000000000003 -5.2924199999999999\n"" 213 -0.51863400000000004 -3.5091999999999999 -3.6500599999999999\n"" 214 -0.69015599999999999 -3.9756300000000002 -2.62039\n"" 215 -0.43009799999999998 -3.9922300000000002 -3.6383100000000002\n"" 216 -1.5472999999999999 -3.9922900000000001 -3.9483100000000002\n"" 217 -1.6352500000000001 -3.9922900000000001 -3.5523799999999999\n"" 218 -2.2279300000000002 -3.9922900000000001 -2.1217199999999998\n"" 219 -2.2341700000000002 -3.9922900000000001 -1.3465199999999999\n"" 220 -2.0110000000000001 -3.9922800000000001 -0.47173799999999999\n"" 221 -1.35599 -3.9922499999999999 -0.23388600000000001\n"" 222 -0.64031400000000005 -3.9922399999999998 -1.1181099999999999\n"" 223 -0.49049399999999999 -3.9922300000000002 -1.75532\n"" 224 0.041658000000000001 -0.54903000000000002 -5.1501200000000003\n"" 225 0.036701999999999999 -1.68591 -4.6197999999999997\n"" 226 0.026970000000000001 -3.01416 -3.3587899999999999\n"" 227 -1.1918299999999999 -1.81281 -5.0749000000000004\n"" 228 -1.4243699999999999 -3.2552599999999998 -3.5231300000000001\n"" 229 -1.62001 -1.67693 -4.0191699999999999\n"" 230 -0.80728200000000006 -0.71911199999999997 -5.7540199999999997\n"" 231 -0.31252799999999997 -0.73477800000000004 -5.6672900000000004\n"" 232 -0.74677800000000005 -1.76105 -5.3974000000000002\n"" 233 -0.28569600000000001 -1.73786 -5.2757500000000004\n"" 234 -1.0115700000000001 -3.1747899999999998 -3.9295900000000001\n"" 235 -0.59875800000000001 -3.0943100000000001 -3.8752399999999998\n"" 236 -1.1170100000000001 -3.6316899999999999 -4.3481399999999999\n"" 237 -0.67781999999999998 -3.49858 -4.2448100000000002\n"" 238 -0.64891200000000004 -3.9922499999999999 -4.2024499999999998\n"" 239 -1.0981099999999999 -3.99227 -4.3057800000000004\n"" 240 -2.0971700000000002 -2.0067499999999998 -3.0719099999999999\n"" 241 -0.84709199999999996 -2.6262300000000001 -4.7891599999999999\n"" 242 -1.2760199999999999 -2.6923499999999998 -4.4246800000000004\n"" 243 -1.56667 -2.4896699999999998 -3.6830099999999999\n"" 244 -0.46418399999999999 -2.5888800000000001 -4.6686800000000002\n"" 245 0.031043999999999999 -2.55166 -3.9095499999999999\n"" 246 0.535416 -2.5903900000000002 -4.66256\n"" 247 1.6260399999999999 -2.4944899999999999 -3.6634600000000002\n"" 248 1.34389 -2.6962999999999999 -4.4086400000000001\n"" 249 0.91964999999999997 -2.6288999999999998 -4.7783499999999997\n"" 250 2.1504799999999999 -2.0131700000000001 -3.04589\n"" 251 1.1606000000000001 -3.9956800000000001 -4.2919499999999999\n"" 252 0.71017799999999998 -3.9943 -4.1941300000000004\n"" 253 0.74109000000000003 -3.5007199999999998 -4.2361199999999997\n"" 254 1.1811100000000001 -3.6351599999999999 -4.3340699999999996\n"" 255 0.65872799999999998 -3.0962100000000001 -3.86754\n"" 256 1.0719399999999999 -3.17794 -3.91682\n"" 257 0.36694199999999999 -1.7388399999999999 -5.2717599999999996\n"" 258 0.82940400000000003 -1.7634300000000001 -5.3877499999999996\n"" 259 0.40159800000000001 -0.73585800000000001 -5.6629199999999997\n"" 260 0.89742599999999995 -0.72168600000000005 -5.7435799999999997\n"" 261 1.6859299999999999 -1.6819299999999999 -3.99892\n"" 262 1.47949 -3.2596500000000002 -3.5053399999999999\n"" 263 1.2703199999999999 -1.8165199999999999 -5.0598200000000002\n"" 264 0.52179600000000004 -3.99376 -1.74912\n"" 265 0.66380399999999995 -3.9942099999999998 -1.1101300000000001\n"" 266 1.36859 -3.9963700000000002 -0.21720600000000001\n"" 267 2.0264600000000002 -3.99838 -0.44701800000000003\n"" 268 2.2603300000000002 -3.9990800000000002 -1.319\n"" 269 2.2635900000000002 -3.9990800000000002 -2.09422\n"" 270 1.6884699999999999 -3.9973000000000001 -3.5320200000000002\n"" 271 1.60538 -3.9970400000000001 -3.9289999999999998\n"" 272 0.48447000000000001 -3.9936099999999999 -3.6327099999999999\n"" 273 0.73209599999999997 -3.9777800000000001 -2.6116799999999998\n"" 274 0.57460199999999995 -3.51085 -3.64337\n"" 275 0.71366399999999997 0.076794000000000001 -5.2842099999999999\n"" 276 0.37166399999999999 0.087384000000000003 -5.2925199999999997\n"" 277 0.62834999999999996 0.64893599999999996 -5.6947799999999997\n"" 278 0.291078 0.69095399999999996 -5.71652\n"" 279 0.676176 1.4198599999999999 2.3216199999999998\n"" 280 0.76906200000000002 1.6185400000000001 2.6164299999999998\n"" 281 0.61585800000000002 1.8935999999999999 2.9962200000000001\n"" 282 0.56720999999999999 2.2408899999999998 2.8489399999999998\n"" 283 0.81762000000000001 2.6636799999999998 2.5613700000000001\n"" 284 0.94242599999999999 3.2155399999999998 2.2813300000000001\n"" 285 0.96809999999999996 3.5473400000000002 2.2357800000000001\n"" 286 1.0382100000000001 3.9771899999999998 2.5051899999999998\n"" 287 0.97684800000000005 3.9617900000000001 2.9584600000000001\n"" 288 0.88949999999999996 3.66642 3.3573300000000001\n"" 289 0.75431400000000004 3.4607399999999999 2.90821\n"" 290 0.74093399999999998 3.2081900000000001 3.6866400000000001\n"" 291 0.52572600000000003 3.0364 3.18113\n"" 292 0.331926 2.6541899999999998 3.4374899999999999\n"" 293 1.31962 3.4101699999999999 2.69143\n"" 294 1.42859 2.64825 2.9911699999999999\n"" 295 1.6902699999999999 2.4858899999999999 2.7067299999999999\n"" 296 1.583 3.1710799999999999 2.4947599999999999\n"" 297 1.8197000000000001 3.1984900000000001 2.1839900000000001\n"" 298 1.61812 3.7411699999999999 2.2831700000000001\n"" 299 1.8855299999999999 4.0209200000000003 1.7431399999999999\n"" 300 1.6321399999999999 4.0936399999999997 2.3120599999999998\n"" 301 1.8688800000000001 4.6555900000000001 1.8511599999999999\n"" 302 1.44143 3.91628 2.7969499999999998\n"" 303 1.59371 4.53878 3.0251199999999998\n"" 304 1.15537 2.8040500000000002 3.1378300000000001\n"" 305 1.20963 3.1493099999999998 2.8704999999999998\n"" 306 1.2944599999999999 3.3851599999999999 3.2284999999999999\n"" 307 1.5898099999999999 3.8491599999999999 3.6318999999999999\n"" 308 1.2061900000000001 2.8676400000000002 3.5040100000000001\n"" 309 1.5785199999999999 3.0754000000000001 3.8269899999999999\n"" 310 1.4316899999999999 3.1612 4.0334199999999996\n"" 311 0.63185400000000003 2.7307399999999999 3.9508899999999998\n"" 312 1.1039600000000001 0.61316999999999999 4.8292299999999999\n"" 313 0.96937799999999996 0.36025200000000002 4.85215\n"" 314 1.08449 0.46652399999999999 4.6295999999999999\n"" 315 1.05101 0.77152799999999999 4.4782099999999998\n"" 316 1.0504500000000001 0.88817999999999997 4.6695799999999998\n"" 317 1.0539499999999999 0.83559000000000005 4.8860000000000001\n"" 318 0.92514600000000002 0.40374599999999999 4.9954700000000001\n"" 319 0.982908 0.65407800000000005 5.0569800000000003\n"" 320 0.50856000000000001 2.37602 4.0781700000000001\n"" 321 1.43333 1.86456 3.5446499999999999\n"" 322 1.2802800000000001 1.85175 3.8694299999999999\n"" 323 1.198 2.4580700000000002 4.09802\n"" 324 1.14086 0.77158199999999999 4.4007800000000001\n"" 325 1.109 0.38109599999999999 4.5774100000000004\n"" 326 0.99641999999999997 0.213864 4.9095700000000004\n"" 327 0.92616600000000004 0.34165800000000002 5.1422499999999998\n"" 328 1.01125 0.65693400000000002 5.1763500000000002\n"" 329 1.12432 0.99678599999999995 4.7075899999999997\n"" 330 1.08257 0.96081000000000005 4.9166299999999996\n"" 331 1.2109399999999999 0.98394599999999999 4.1745400000000004\n"" 332 1.1652400000000001 1.2398100000000001 4.6936499999999999\n"" 333 0.93262800000000001 1.74756 4.4064699999999997\n"" 334 1.0661799999999999 1.1785399999999999 5.0801600000000002\n"" 335 0.91383000000000003 0.75153599999999998 5.3447199999999997\n"" 336 0.71727600000000002 1.49926 5.1546200000000004\n"" 337 0.71021400000000001 0.83785799999999999 5.5150399999999999\n"" 338 0.47645999999999999 0.79783800000000005 5.69191\n"" 339 0.37451400000000001 0.219888 5.85928\n"" 340 0.76708200000000004 -0.21551400000000001 5.6824199999999996\n"" 341 0.86174399999999995 0.19323599999999999 5.31548\n"" 342 0.44932800000000001 -0.51103799999999999 5.8834600000000004\n"" 343 0.78110400000000002 -0.62793600000000005 5.6857199999999999\n"" 344 0.93720599999999998 -0.56791800000000003 5.3944400000000003\n"" 345 0.464196 -1.0271600000000001 5.5592699999999997\n"" 346 0.76633200000000001 -0.98837399999999997 5.2788599999999999\n"" 347 0.31602000000000002 -1.10771 5.0521099999999999\n"" 348 0.14086199999999999 -1.1078300000000001 5.33887\n"" 349 0.13575599999999999 -1.26352 4.9649999999999999\n"" 350 1.33853 1.27186 3.72296\n"" 351 1.5086599999999999 0.67840199999999995 3.9989599999999998\n"" 352 1.50851 0.53724000000000005 4.0433199999999996\n"" 353 1.28616 0.115548 4.6295700000000002\n"" 354 0.95399400000000001 0.00894 5.0122400000000003\n"" 355 1.0601799999999999 -0.35549399999999998 5.0953099999999996\n"" 356 0.89217599999999997 -0.78054599999999996 4.76159\n"" 357 0.64973999999999998 -0.99916799999999995 4.63253\n"" 358 0.29892000000000002 -1.2082900000000001 4.5867199999999997\n"" 359 0.42804599999999998 -1.2911699999999999 4.1832500000000001\n"" 360 0.438888 -1.28685 3.7410600000000001\n"" 361 0.84301199999999998 -1.01677 4.1961199999999996\n"" 362 0.980244 -0.942438 3.6684999999999999\n"" 363 1.1368 -0.83130000000000004 4.3822000000000001\n"" 364 1.48556 -0.49532399999999999 4.5576600000000003\n"" 365 1.3648100000000001 -0.73189199999999999 3.5411800000000002\n"" 366 1.70821 -0.039516000000000003 3.2120799999999998\n"" 367 1.65445 0.751722 2.6800600000000001\n"" 368 1.5999000000000001 1.1555599999999999 3.03626\n"" 369 1.8005199999999999 0.31972200000000001 3.77772\n"" 370 0.3327 -3.9836100000000001 2.2503899999999999\n"" 371 0.737124 -3.9848300000000001 2.8939400000000002\n"" 372 0.27911999999999998 -3.1894300000000002 2.3515100000000002\n"" 373 0.14894399999999999 -3.4106999999999998 1.6506400000000001\n"" 374 0.32312999999999997 -3.98359 1.9693400000000001\n"" 375 0.67697399999999996 -2.7212900000000002 1.83473\n"" 376 0.78759000000000001 -3.0636999999999999 0.48447600000000002\n"" 377 0.36704399999999998 -2.5842999999999998 -0.25625999999999999\n"" 378 2.0461100000000001 -3.1973199999999999 -1.2488999999999999\n"" 379 2.08623 -3.7412000000000001 -0.48683399999999999\n"" 380 1.42824 -3.66439 -0.22822200000000001\n"" 381 1.27058 -3.0856400000000002 -0.79246799999999995\n"" 382 0.72363 -3.6013099999999998 -1.12114\n"" 383 0.58191000000000004 -3.5068600000000001 -1.76014\n"" 384 0.76572600000000002 -3.4916499999999999 -2.6230199999999999\n"" 385 0.99541199999999996 -2.8645499999999999 -1.7487200000000001\n"" 386 0.46632000000000001 -2.5078499999999999 -1.32311\n"" 387 1.9253499999999999 -3.0381800000000001 -1.9252400000000001\n"" 388 1.4892799999999999 -2.7940999999999998 -1.4390499999999999\n"" 389 0.712584 -2.30003 -1.1226799999999999\n"" 390 0.71289599999999997 -2.5806399999999998 -0.739842\n"" 391 0.56478600000000001 -2.5167799999999998 -0.26866200000000001\n"" 392 1.64716 -1.5702400000000001 0.03066\n"" 393 1.55905 -1.6997500000000001 -0.019109999999999999\n"" 394 1.33717 -2.0425900000000001 -0.22925999999999999\n"" 395 1.2266699999999999 -3.9862799999999998 3.08012\n"" 396 1.55572 -3.9872800000000002 2.82769\n"" 397 1.1124099999999999 -2.8561200000000002 2.5303100000000001\n"" 398 1.6749799999999999 -3.9876200000000002 2.5039699999999998\n"" 399 1.6629400000000001 -3.16873 2.4012500000000001\n"" 400 1.0984100000000001 -3.0588700000000002 1.97997\n"" 401 1.6955899999999999 -2.5752600000000001 0.35545199999999999\n"" 402 1.5288999999999999 -3.98725 1.7441199999999999\n"" 403 1.62862 -3.4062399999999999 1.5838000000000001\n"" 404 2.3193700000000002 -3.7513299999999998 -1.30122\n"" 405 2.3225199999999999 -3.7852999999999999 -2.0764399999999998\n"" 406 2.2801300000000002 -3.57613 -1.9120699999999999\n"" 407 1.7476100000000001 -3.7140399999999998 -3.51424\n"" 408 2.0356800000000002 -3.42719 -2.7716799999999999\n"" 409 2.4002699999999999 -2.9386700000000001 -2.5358399999999999\n"" 410 2.4409000000000001 -1.88609 -2.2273800000000001\n"" 411 1.8035300000000001 -1.69031 -1.02329\n"" 412 1.7452000000000001 -1.6638200000000001 -0.37142999999999998\n"" 413 1.1264099999999999 -1.4492700000000001 3.0566200000000001\n"" 414 1.12819 -1.7254100000000001 2.5453999999999999\n"" 415 1.3651199999999999 -2.2395700000000001 1.75861\n"" 416 1.5991599999999999 -1.6418999999999999 0.23758199999999999\n"" 417 1.7495499999999999 -1.7500599999999999 0.66831600000000002\n"" 418 1.7514799999999999 -0.73644600000000005 2.5360999999999998\n"" 419 1.7854399999999999 -0.93671400000000005 2.2402099999999998\n"" 420 1.7196199999999999 -1.39639 0.16297200000000001\n"" 421 2.18798 -1.2083900000000001 1.2411000000000001\n"" 422 2.1231300000000002 -0.79444800000000004 0.89536800000000005\n"" 423 1.6932499999999999 -0.11829000000000001 1.8897600000000001\n"" 424 1.98712 -0.59559600000000001 0.55620599999999998\n"" 425 2.25278 -0.55871999999999999 -0.038802000000000003\n"" 426 2.2555000000000001 -0.60741599999999996 -0.92929200000000001\n"" 427 2.7998099999999999 -0.566496 -1.8340099999999999\n"" 428 2.7348300000000001 -0.71928599999999998 -2.7637900000000002\n"" 429 1.66479 -3.6254499999999998 -3.9112300000000002\n"" 430 1.56613 -3.3070599999999999 -3.3279999999999998\n"" 431 0.56176199999999998 1.5509599999999999 -5.5235300000000001\n"" 432 0.68548799999999999 1.86365 -4.7884200000000003\n"" 433 0.86539200000000005 1.2685999999999999 -5.0100100000000003\n"" 434 0.71949600000000002 1.0616399999999999 -5.70695\n"" 435 1.1043700000000001 0.611124 -5.5093199999999998\n"" 436 0.55458600000000002 1.65913 -4.4293899999999997\n"" 437 0.80102399999999996 1.3104199999999999 -4.5516100000000002\n"" 438 1.1699200000000001 0.58592999999999995 -4.87486\n"" 439 1.1132500000000001 0.066030000000000005 -5.2752100000000004\n"" 440 1.3818900000000001 -0.76470000000000005 -5.3052099999999998\n"" 441 1.5628299999999999 1.53034 -3.74627\n"" 442 2.1093999999999999 -0.253164 -3.98386\n"" 443 1.5224500000000001 1.9411400000000001 -2.6023000000000001\n"" 444 2.4696699999999998 0.793794 -2.6295799999999998\n"" 445 1.6230800000000001 2.1391800000000001 -1.7399\n"" 446 2.53288 0.97691399999999995 -1.6387799999999999\n"" 447 0.988344 1.4249400000000001 1.2534700000000001\n"" 448 1.52284 0.55740000000000001 1.44384\n"" 449 1.2216499999999999 1.7075800000000001 0.57733800000000002\n"" 450 1.44604 2.0585599999999999 -1.0283800000000001\n"" 451 2.13646 0.89572799999999997 -0.86065800000000003\n"" 452 2.0259399999999999 0.79195199999999999 0.39824399999999999\n"" 453 -0.42761063083709772 1.6952470543869633 2.5510779406671853\n""# Generated by tetgen -YY bunny.smesh \n"); } -static const char* getElements() { return( -"1374 4 0\n"" 0 395 372 399 371\n"" 1 96 46 93 44\n"" 2 135 140 137 163\n"" 3 318 326 354 313\n"" 4 133 127 128 126\n"" 5 76 83 55 218\n"" 6 193 188 198 176\n"" 7 450 443 451 1\n"" 8 437 442 438 441\n"" 9 160 336 320 144\n"" 10 79 50 51 75\n"" 11 408 378 387 273\n"" 12 94 38 47 68\n"" 13 323 308 322 311\n"" 14 339 135 163 341\n"" 15 152 135 153 145\n"" 16 333 166 160 147\n"" 17 348 346 347 342\n"" 18 446 426 451 444\n"" 19 46 92 94 93\n"" 20 208 21 26 207\n"" 21 38 360 48 413\n"" 22 229 80 243 245\n"" 23 241 229 227 242\n"" 24 34 50 35 51\n"" 25 9 33 35 34\n"" 26 103 122 121 206\n"" 27 257 260 259 440\n"" 28 142 318 163 144\n"" 29 446 443 444 451\n"" 30 272 251 252 274\n"" 31 193 199 176 198\n"" 32 165 149 147 166\n"" 33 447 3 8 449\n"" 34 29 208 209 30\n"" 35 300 285 286 299\n"" 36 100 104 119 105\n"" 37 39 44 40 41\n"" 38 315 318 313 316\n"" 39 422 417 421 419\n"" 40 382 273 264 383\n"" 41 145 143 150 146\n"" 42 406 268 405 404\n"" 43 427 411 426 428\n"" 44 323 290 308 311\n"" 45 232 18 230 227\n"" 46 243 79 80 240\n"" 47 391 412 390 389\n"" 48 360 423 107 362\n"" 49 389 71 393 392\n"" 50 142 162 163 145\n"" 51 245 247 261 80\n"" 52 376 373 375 92\n"" 53 324 352 325 362\n"" 54 119 104 106 105\n"" 55 165 149 166 151\n"" 56 428 389 411 442\n"" 57 366 351 331 352\n"" 58 166 318 316 163\n"" 59 368 281 280 350\n"" 60 315 168 313 166\n"" 61 417 422 423 419\n"" 62 279 203 205 453\n"" 63 80 243 245 226\n"" 64 416 41 420 45\n"" 65 319 330 317 335\n"" 66 15 442 225 224\n"" 67 116 131 117 129\n"" 68 335 318 337 319\n"" 69 188 197 193 198\n"" 70 326 314 325 313\n"" 71 313 315 314 325\n"" 72 451 3 449 450\n"" 73 451 449 452 450\n"" 74 299 286 300 301\n"" 75 450 1 3 2\n"" 76 107 103 120 149\n"" 77 76 82 81 79\n"" 78 81 83 218 214\n"" 79 14 10 2 11\n"" 80 22 436 437 23\n"" 81 318 144 316 163\n"" 82 420 426 425 412\n"" 83 450 14 11 445\n"" 84 262 254 429 274\n"" 85 443 442 441 444\n"" 86 356 353 364 363\n"" 87 102 122 206 101\n"" 88 315 168 325 313\n"" 89 281 331 280 350\n"" 90 107 155 120 104\n"" 91 443 426 444 451\n"" 92 123 118 354 113\n"" 93 84 220 86 83\n"" 94 268 406 405 269\n"" 95 287 293 289 286\n"" 96 17 16 443 13\n"" 97 315 168 166 325\n"" 98 283 296 297 284\n"" 99 333 144 336 160\n"" 100 450 13 1 2\n"" 101 414 423 418 419\n"" 102 331 352 324 362\n"" 103 144 315 333 316\n"" 104 21 442 16 15\n"" 105 45 72 91 69\n"" 106 437 208 21 433\n"" 107 288 310 290 306\n"" 108 213 217 214 31\n"" 109 335 327 328 341\n"" 110 109 67 48 111\n"" 111 316 314 315 312\n"" 112 45 60 91 44\n"" 113 128 118 115 116\n"" 114 423 45 38 448\n"" 115 155 362 166 325\n"" 116 130 136 132 133\n"" 117 92 72 89 91\n"" 118 145 143 142 150\n"" 119 153 140 163 142\n"" 120 317 313 312 319\n"" 121 347 118 126 354\n"" 122 148 165 147 143\n"" 123 170 157 171 173\n"" 124 78 50 74 240\n"" 125 381 273 385 378\n"" 126 337 330 335 317\n"" 127 267 273 379 268\n"" 128 80 247 261 250\n"" 129 80 225 261 245\n"" 130 80 442 261 225\n"" 131 211 24 212 20\n"" 132 398 395 399 371\n"" 133 390 389 377 391\n"" 134 308 292 290 291\n"" 135 176 191 177 199\n"" 136 318 166 313 163\n"" 137 23 16 436 17\n"" 138 354 353 325 326\n"" 139 423 362 366 279\n"" 140 415 400 375 403\n"" 141 217 239 216 213\n"" 142 377 89 88 90\n"" 143 10 12 13 9\n"" 144 155 325 113 112\n"" 145 151 164 165 150\n"" 146 113 118 128 123\n"" 147 95 97 99 96\n"" 148 449 3 8 5\n"" 149 61 99 97 64\n"" 150 223 83 222 82\n"" 151 37 38 6 39\n"" 152 0 7 6 37\n"" 153 385 430 247 250\n"" 154 108 109 110 107\n"" 155 415 401 417 403\n"" 156 102 121 122 101\n"" 157 120 107 149 156\n"" 158 104 100 119 120\n"" 159 3 4 2 5\n"" 160 207 21 224 437\n"" 161 270 273 408 430\n"" 162 80 247 226 245\n"" 163 80 228 81 243\n"" 164 43 107 48 38\n"" 165 354 340 344 341\n"" 166 312 316 313 317\n"" 167 435 275 277 439\n"" 168 27 30 29 28\n"" 169 52 76 31 240\n"" 170 338 339 163 318\n"" 171 47 43 42 48\n"" 172 61 96 59 58\n"" 173 428 389 442 261\n"" 174 194 171 192 174\n"" 175 318 339 341 338\n"" 176 417 422 416 423\n"" 177 123 124 125 128\n"" 178 113 108 115 155\n"" 179 300 285 299 298\n"" 180 320 160 189 333\n"" 181 443 35 1 13\n"" 182 96 46 44 61\n"" 183 316 314 313 315\n"" 184 119 107 155 106\n"" 185 357 325 356 361\n"" 186 224 15 21 20\n"" 187 319 336 337 317\n"" 188 306 287 307 302\n"" 189 143 141 140 144\n"" 190 366 423 279 367\n"" 191 74 73 88 89\n"" 192 447 7 8 3\n"" 193 449 8 447 5\n"" 194 436 21 22 437\n"" 195 92 72 91 45\n"" 196 153 140 142 135\n"" 197 206 121 103 149\n"" 198 35 69 389 71\n"" 199 165 168 167 166\n"" 200 12 1 13 9\n"" 201 361 112 113 325\n"" 202 195 175 193 194\n"" 203 292 304 322 321\n"" 204 337 336 144 338\n"" 205 399 372 400 371\n"" 206 332 336 334 333\n"" 207 111 68 67 48\n"" 208 389 391 393 72\n"" 209 196 179 188 195\n"" 210 104 119 155 120\n"" 211 168 166 325 155\n"" 212 112 108 113 155\n"" 213 449 425 451 452\n"" 214 220 214 83 221\n"" 215 261 246 245 225\n"" 216 93 44 46 92\n"" 217 80 255 226 247\n"" 218 384 262 247 430\n"" 219 336 144 319 337\n"" 220 144 315 316 166\n"" 221 332 336 333 316\n"" 222 175 191 194 192\n"" 223 362 353 325 363\n"" 224 110 113 115 114\n"" 225 400 370 374 402\n"" 226 319 337 335 317\n"" 227 430 262 247 248\n"" 228 324 362 315 331\n"" 229 80 228 235 81\n"" 230 347 342 126 348\n"" 231 295 283 296 297\n"" 232 306 304 305 308\n"" 233 356 353 325 354\n"" 234 21 23 437 433\n"" 235 195 174 194 178\n"" 236 192 175 177 173\n"" 237 302 287 303 286\n"" 238 208 211 26 209\n"" 239 118 128 115 113\n"" 240 351 366 369 352\n"" 241 342 344 340 343\n"" 242 118 347 123 354\n"" 243 354 168 163 313\n"" 244 356 325 363 361\n"" 245 282 321 294 304\n"" 246 268 379 267 404\n"" 247 296 305 284 283\n"" 248 290 304 308 291\n"" 249 316 318 313 319\n"" 250 143 160 147 161\n"" 251 149 201 122 147\n"" 252 38 448 45 6\n"" 253 92 415 417 94\n"" 254 225 224 261 440\n"" 255 198 185 184 186\n"" 256 7 205 447 8\n"" 257 368 351 350 367\n"" 258 74 13 12 35\n"" 259 190 147 161 158\n"" 260 270 429 262 407\n"" 261 3 4 450 2\n"" 262 15 443 442 16\n"" 263 193 188 195 196\n"" 264 342 347 340 344\n"" 265 391 393 45 416\n"" 266 92 415 94 375\n"" 267 61 60 91 58\n"" 268 60 72 69 91\n"" 269 289 283 305 291\n"" 270 96 44 93 92\n"" 271 324 362 325 315\n"" 272 13 2 14 10\n"" 273 62 63 61 64\n"" 274 144 166 160 315\n"" 275 417 423 416 94\n"" 276 449 4 450 3\n"" 277 450 13 443 1\n"" 278 352 364 365 369\n"" 279 7 448 205 6\n"" 280 225 440 261 263\n"" 281 116 155 119 118\n"" 282 2 4 450 11\n"" 283 416 377 92 89\n"" 284 376 403 415 375\n"" 285 417 376 415 92\n"" 286 416 377 89 391\n"" 287 249 262 246 256\n"" 288 336 317 316 330\n"" 289 47 43 48 38\n"" 290 354 168 313 113\n"" 291 115 168 118 113\n"" 292 34 50 51 33\n"" 293 166 169 167 165\n"" 294 319 316 317 313\n"" 295 318 144 337 319\n"" 296 354 325 313 326\n"" 297 30 436 433 431\n"" 298 289 283 291 284\n"" 299 58 91 96 59\n"" 300 185 182 183 197\n"" 301 224 438 276 437\n"" 302 15 442 80 225\n"" 303 111 110 112 109\n"" 304 52 76 240 51\n"" 305 208 26 30 29\n"" 306 7 449 3 447\n"" 307 296 294 283 295\n"" 308 306 291 289 305\n"" 309 338 140 141 144\n"" 310 331 352 351 324\n"" 311 322 281 333 320\n"" 312 83 81 76 82\n"" 313 384 262 274 255\n"" 314 60 45 91 69\n"" 315 15 20 19 16\n"" 316 197 188 193 196\n"" 317 80 229 225 245\n"" 318 18 233 227 232\n"" 319 344 345 343 342\n"" 320 417 414 94 415\n"" 321 443 16 441 442\n"" 322 177 199 187 176\n"" 323 149 206 121 453\n"" 324 350 279 331 280\n"" 325 181 188 196 179\n"" 326 102 121 101 103\n"" 327 347 357 354 356\n"" 328 338 327 318 337\n"" 329 337 330 334 335\n"" 330 319 336 317 316\n"" 331 193 175 188 176\n"" 332 164 143 162 165\n"" 333 120 104 100 103\n"" 334 376 416 92 417\n"" 335 113 325 155 168\n"" 336 416 376 92 391\n"" 337 420 45 41 393\n"" 338 249 262 248 246\n"" 339 147 189 161 160\n"" 340 18 231 224 233\n"" 341 71 45 70 41\n"" 342 126 341 135 339\n"" 343 21 23 22 437\n"" 344 148 165 143 151\n"" 345 337 327 318 335\n"" 346 354 318 313 163\n"" 347 115 118 155 116\n"" 348 341 340 338 339\n"" 349 166 168 313 163\n"" 350 166 318 313 315\n"" 351 48 68 67 47\n"" 352 150 162 145 152\n"" 353 140 339 137 163\n"" 354 199 185 187 176\n"" 355 333 144 316 336\n"" 356 338 327 337 341\n"" 357 389 70 72 393\n"" 358 331 366 350 351\n"" 359 94 45 92 44\n"" 360 9 33 12 35\n"" 361 126 139 137 138\n"" 362 321 295 282 294\n"" 363 135 140 136 137\n"" 364 153 162 163 152\n"" 365 325 362 363 361\n"" 366 80 235 226 81\n"" 367 74 377 89 88\n"" 368 13 14 450 443\n"" 369 157 172 158 171\n"" 370 450 443 14 445\n"" 371 155 107 120 156\n"" 372 135 339 163 137\n"" 373 365 325 352 362\n"" 374 153 140 135 163\n"" 375 448 206 205 6\n"" 376 137 141 139 339\n"" 377 103 107 120 104\n"" 378 448 425 447 452\n"" 379 165 162 168 163\n"" 380 76 83 79 87\n"" 381 420 45 393 416\n"" 382 334 329 330 336\n"" 383 89 45 92 416\n"" 384 181 195 179 196\n"" 385 420 448 41 416\n"" 386 438 277 435 275\n"" 387 400 399 402 403\n"" 388 304 296 283 305\n"" 389 170 158 190 161\n"" 390 387 386 388 250\n"" 391 54 218 217 53\n"" 392 311 304 308 322\n"" 393 149 281 201 189\n"" 394 211 24 209 212\n"" 395 166 333 149 147\n"" 396 426 424 420 425\n"" 397 394 376 401 416\n"" 398 147 159 122 158\n"" 399 202 203 201 453\n"" 400 280 203 279 453\n"" 401 135 126 339 137\n"" 402 449 4 3 5\n"" 403 14 2 450 11\n"" 404 126 125 127 347\n"" 405 423 413 38 414\n"" 406 185 198 188 176\n"" 407 144 163 142 162\n"" 408 201 122 204 453\n"" 409 447 425 451 449\n"" 410 290 289 306 291\n"" 411 35 69 71 49\n"" 412 207 224 211 231\n"" 413 135 154 163 118\n"" 414 126 118 341 354\n"" 415 191 175 194 193\n"" 416 436 16 437 17\n"" 417 420 422 416 421\n"" 418 135 142 153 145\n"" 419 15 443 16 13\n"" 420 440 275 259 224\n"" 421 416 421 422 417\n"" 422 442 275 440 224\n"" 423 347 340 354 126\n"" 424 254 256 253 274\n"" 425 34 50 33 35\n"" 426 176 191 175 177\n"" 427 433 278 434 277\n"" 428 175 191 192 177\n"" 429 101 206 102 204\n"" 430 132 135 136 130\n"" 431 49 35 50 36\n"" 432 353 356 325 363\n"" 433 435 277 433 434\n"" 434 224 275 276 438\n"" 435 212 230 18 19\n"" 436 143 150 148 151\n"" 437 235 228 243 234\n"" 438 29 22 26 30\n"" 439 125 347 349 123\n"" 440 237 234 235 236\n"" 441 144 336 319 316\n"" 442 165 316 166 144\n"" 443 142 318 338 163\n"" 444 137 141 140 139\n"" 445 447 279 205 448\n"" 446 106 116 108 155\n"" 447 217 238 239 215\n"" 448 16 17 443 441\n"" 449 407 262 270 430\n"" 450 88 74 389 77\n"" 451 78 79 80 81\n"" 452 126 138 134 342\n"" 453 165 150 143 151\n"" 454 409 430 387 250\n"" 455 128 118 116 131\n"" 456 339 126 340 342\n"" 457 173 192 171 170\n"" 458 400 376 403 373\n"" 459 15 18 212 224\n"" 460 37 49 36 35\n"" 461 81 82 83 214\n"" 462 173 157 171 172\n"" 463 220 214 219 83\n"" 464 114 113 128 123\n"" 465 366 423 367 418\n"" 466 379 273 378 406\n"" 467 30 436 23 433\n"" 468 23 432 28 436\n"" 469 147 144 160 143\n"" 470 79 243 31 240\n"" 471 33 74 50 240\n"" 472 342 348 345 126\n"" 473 94 416 417 92\n"" 474 416 377 391 92\n"" 475 147 158 149 157\n"" 476 273 274 384 430\n"" 477 203 281 201 453\n"" 478 243 235 245 226\n"" 479 18 229 227 225\n"" 480 45 72 69 70\n"" 481 189 149 147 201\n"" 482 175 195 193 188\n"" 483 362 107 155 166\n"" 484 185 199 198 176\n"" 485 331 166 333 149\n"" 486 31 76 81 79\n"" 487 323 290 310 308\n"" 488 43 107 104 48\n"" 489 436 16 21 437\n"" 490 368 279 350 280\n"" 491 424 416 423 448\n"" 492 150 142 164 143\n"" 493 258 248 246 249\n"" 494 381 383 385 273\n"" 495 73 49 72 74\n"" 496 117 106 119 116\n"" 497 74 377 88 389\n"" 498 408 273 387 384\n"" 499 191 170 173 190\n"" 500 199 177 200 191\n"" 501 13 80 74 12\n"" 502 130 135 128 131\n"" 503 92 90 89 377\n"" 504 84 219 83 86\n"" 505 408 378 273 406\n"" 506 386 384 80 385\n"" 507 392 426 389 420\n"" 508 80 79 243 81\n"" 509 158 177 173 190\n"" 510 377 72 89 391\n"" 511 394 376 416 391\n"" 512 442 224 440 261\n"" 513 130 131 129 132\n"" 514 95 63 61 59\n"" 515 252 274 253 272\n"" 516 273 274 272 384\n"" 517 225 263 246 257\n"" 518 76 52 31 53\n"" 519 243 79 31 81\n"" 520 448 420 424 416\n"" 521 347 358 349 123\n"" 522 138 137 126 133\n"" 523 368 279 367 350\n"" 524 38 360 413 423\n"" 525 165 168 166 163\n"" 526 207 211 26 208\n"" 527 54 217 32 228\n"" 528 125 347 348 349\n"" 529 118 347 128 123\n"" 530 423 94 45 416\n"" 531 250 389 428 261\n"" 532 119 116 118 117\n"" 533 358 113 347 357\n"" 534 168 164 165 169\n"" 535 242 235 243 234\n"" 536 354 318 341 327\n"" 537 226 247 255 245\n"" 538 377 72 389 74\n"" 539 168 354 163 118\n"" 540 163 316 166 165\n"" 541 145 163 142 153\n"" 542 262 80 247 255\n"" 543 281 304 292 321\n"" 544 12 1 9 35\n"" 545 392 426 420 412\n"" 546 51 79 76 240\n"" 547 274 270 273 272\n"" 548 270 274 273 430\n"" 549 329 331 332 324\n"" 550 325 313 168 113\n"" 551 306 304 308 290\n"" 552 71 35 49 41\n"" 553 348 346 342 345\n"" 554 270 262 274 430\n"" 555 353 363 365 364\n"" 556 29 22 30 27\n"" 557 447 425 424 451\n"" 558 53 31 217 54\n"" 559 194 171 175 192\n"" 560 29 25 209 210\n"" 561 123 358 349 113\n"" 562 80 385 384 247\n"" 563 204 202 201 453\n"" 564 259 225 440 224\n"" 565 128 347 125 123\n"" 566 111 68 48 413\n"" 567 48 68 47 414\n"" 568 415 68 414 94\n"" 569 437 208 207 21\n"" 570 424 1 3 451\n"" 571 447 452 449 448\n"" 572 389 390 377 88\n"" 573 158 170 190 173\n"" 574 169 165 168 167\n"" 575 155 154 119 118\n"" 576 115 168 155 118\n"" 577 354 168 113 118\n"" 578 147 201 161 189\n"" 579 115 168 113 155\n"" 580 168 166 155 167\n"" 581 259 225 257 440\n"" 582 263 247 261 246\n"" 583 281 279 201 453\n"" 584 128 135 136 126\n"" 585 275 260 439 440\n"" 586 66 63 65 64\n"" 587 277 438 276 275\n"" 588 163 339 341 318\n"" 589 325 314 324 315\n"" 590 338 327 341 318\n"" 591 319 327 328 335\n"" 592 391 45 89 416\n"" 593 203 281 280 202\n"" 594 362 423 206 279\n"" 595 239 237 213 238\n"" 596 362 353 365 325\n"" 597 80 235 243 226\n"" 598 80 228 243 235\n"" 599 15 21 20 16\n"" 600 31 214 81 53\n"" 601 227 244 233 225\n"" 602 442 21 224 15\n"" 603 284 293 298 285\n"" 604 233 18 227 225\n"" 605 18 233 224 225\n"" 606 205 203 204 453\n"" 607 163 154 168 118\n"" 608 208 21 433 26\n"" 609 443 389 442 444\n"" 610 27 23 30 28\n"" 611 54 218 56 217\n"" 612 391 412 389 393\n"" 613 9 13 10 1\n"" 614 61 44 96 91\n"" 615 316 314 312 313\n"" 616 416 376 401 417\n"" 617 116 108 155 115\n"" 618 106 107 155 108\n"" 619 442 389 411 426\n"" 620 164 142 162 143\n"" 621 321 294 322 295\n"" 622 144 165 143 147\n"" 623 357 325 313 354\n"" 624 389 35 41 426\n"" 625 448 7 205 447\n"" 626 227 244 229 241\n"" 627 206 38 103 102\n"" 628 206 448 205 279\n"" 629 10 4 2 11\n"" 630 246 256 245 255\n"" 631 37 49 35 41\n"" 632 128 127 124 125\n"" 633 126 138 133 134\n"" 634 312 318 319 313\n"" 635 81 235 226 213\n"" 636 213 228 235 234\n"" 637 228 81 243 31\n"" 638 81 228 235 213\n"" 639 317 336 337 330\n"" 640 330 336 337 334\n"" 641 316 330 317 329\n"" 642 319 330 335 328\n"" 643 231 18 232 233\n"" 644 18 231 232 230\n"" 645 17 437 436 441\n"" 646 287 307 302 303\n"" 647 287 306 307 288\n"" 648 303 288 287 307\n"" 649 323 320 333 311\n"" 650 393 420 416 392\n"" 651 79 51 76 75\n"" 652 336 329 316 332\n"" 653 213 236 234 237\n"" 654 76 31 81 53\n"" 655 45 72 391 89\n"" 656 31 76 79 240\n"" 657 395 372 397 399\n"" 658 393 45 41 70\n"" 659 45 416 94 92\n"" 660 211 21 224 207\n"" 661 376 417 415 401\n"" 662 262 254 274 256\n"" 663 320 304 292 311\n"" 664 1 10 9 2\n"" 665 162 165 168 164\n"" 666 385 247 80 250\n"" 667 371 400 370 372\n"" 668 384 247 385 430\n"" 669 128 130 131 129\n"" 670 443 13 442 80\n"" 671 284 293 289 305\n"" 672 448 206 6 423\n"" 673 360 107 109 362\n"" 674 112 360 359 111\n"" 675 287 305 306 289\n"" 676 362 325 112 361\n"" 677 362 166 325 315\n"" 678 437 17 16 441\n"" 679 438 277 276 433\n"" 680 200 189 190 201\n"" 681 416 422 424 423\n"" 682 320 292 281 189\n"" 683 110 108 113 112\n"" 684 108 110 113 115\n"" 685 144 318 316 319\n"" 686 250 386 389 80\n"" 687 166 318 315 316\n"" 688 63 62 59 58\n"" 689 319 327 335 318\n"" 690 337 327 335 341\n"" 691 1 450 3 451\n"" 692 239 237 236 213\n"" 693 21 442 437 16\n"" 694 450 443 445 451\n"" 695 14 13 450 2\n"" 696 39 44 42 40\n"" 697 363 357 356 361\n"" 698 350 366 367 351\n"" 699 331 366 362 279\n"" 700 368 366 369 351\n"" 701 47 43 38 42\n"" 702 140 339 163 338\n"" 703 289 285 293 284\n"" 704 339 141 338 140\n"" 705 137 141 339 140\n"" 706 234 216 213 32\n"" 707 273 408 430 384\n"" 708 273 270 408 269\n"" 709 84 220 83 85\n"" 710 158 170 157 161\n"" 711 255 262 274 256\n"" 712 304 282 283 294\n"" 713 83 218 219 87\n"" 714 377 72 74 89\n"" 715 206 205 204 453\n"" 716 446 443 451 445\n"" 717 304 292 322 320\n"" 718 155 362 112 107\n"" 719 292 283 304 282\n"" 720 443 1 426 451\n"" 721 149 362 166 107\n"" 722 272 271 274 270\n"" 723 306 287 289 288\n"" 724 366 331 350 279\n"" 725 331 366 352 362\n"" 726 61 95 96 97\n"" 727 224 442 275 438\n"" 728 273 387 384 385\n"" 729 262 271 429 270\n"" 730 185 182 197 184\n"" 731 153 162 145 163\n"" 732 74 443 35 426\n"" 733 41 389 426 420\n"" 734 40 47 46 44\n"" 735 262 246 247 248\n"" 736 1 37 3 0\n"" 737 433 432 431 436\n"" 738 23 432 436 30\n"" 739 67 360 413 111\n"" 740 109 360 112 111\n"" 741 361 360 112 362\n"" 742 246 258 249 257\n"" 743 87 218 219 55\n"" 744 151 149 166 156\n"" 745 165 149 151 148\n"" 746 149 165 147 148\n"" 747 155 154 118 168\n"" 748 217 214 218 215\n"" 749 31 214 53 217\n"" 750 291 304 283 305\n"" 751 23 16 22 436\n"" 752 143 162 165 144\n"" 753 103 102 100 101\n"" 754 195 175 179 188\n"" 755 182 196 197 180\n"" 756 400 376 375 403\n"" 757 149 281 189 331\n"" 758 146 143 150 148\n"" 759 150 146 152 145\n"" 760 168 162 164 169\n"" 761 262 384 274 430\n"" 762 54 218 53 56\n"" 763 125 127 347 128\n"" 764 304 306 291 290\n"" 765 262 80 384 247\n"" 766 153 162 152 145\n"" 767 150 162 152 164\n"" 768 168 162 169 163\n"" 769 262 80 255 384\n"" 770 38 68 414 47\n"" 771 423 206 38 107\n"" 772 46 68 94 47\n"" 773 385 430 250 387\n"" 774 413 68 48 414\n"" 775 46 68 93 94\n"" 776 41 416 448 45\n"" 777 111 68 413 67\n"" 778 77 88 74 73\n"" 779 393 41 420 392\n"" 780 274 256 253 255\n"" 781 26 23 433 30\n"" 782 218 217 53 214\n"" 783 231 212 18 224\n"" 784 446 426 444 427\n"" 785 113 114 128 115\n"" 786 128 114 123 124\n"" 787 285 289 293 286\n"" 788 301 285 299 286\n"" 789 300 285 298 286\n"" 790 297 285 298 299\n"" 791 26 23 30 22\n"" 792 44 38 94 45\n"" 793 187 158 159 177\n"" 794 218 76 81 53\n"" 795 162 143 142 144\n"" 796 397 373 400 372\n"" 797 164 142 145 162\n"" 798 128 135 126 118\n"" 799 289 283 284 305\n"" 800 282 189 281 292\n"" 801 200 186 187 199\n"" 802 21 24 211 20\n"" 803 11 13 14 10\n"" 804 2 13 1 10\n"" 805 72 377 389 391\n"" 806 74 72 73 89\n"" 807 92 72 45 89\n"" 808 413 366 418 362\n"" 809 281 304 282 292\n"" 810 429 251 274 254\n"" 811 438 439 275 435\n"" 812 37 424 1 3\n"" 813 202 189 201 281\n"" 814 333 189 320 281\n"" 815 94 38 68 423\n"" 816 389 261 250 80\n"" 817 242 241 235 234\n"" 818 364 366 365 369\n"" 819 302 305 306 287\n"" 820 362 366 352 365\n"" 821 350 366 279 367\n"" 822 368 366 351 367\n"" 823 191 176 175 193\n"" 824 173 191 177 192\n"" 825 103 121 101 100\n"" 826 176 191 199 193\n"" 827 191 177 200 190\n"" 828 275 442 439 438\n"" 829 275 442 440 439\n"" 830 224 442 225 261\n"" 831 442 224 437 438\n"" 832 258 246 263 257\n"" 833 386 384 385 383\n"" 834 149 333 331 189\n"" 835 318 326 327 354\n"" 836 207 437 224 276\n"" 837 56 76 218 53\n"" 838 350 333 322 281\n"" 839 37 38 45 6\n"" 840 232 244 227 241\n"" 841 423 206 6 38\n"" 842 411 386 250 410\n"" 843 224 229 18 225\n"" 844 6 423 38 448\n"" 845 218 57 219 55\n"" 846 68 423 38 414\n"" 847 377 376 391 92\n"" 848 415 376 375 92\n"" 849 103 121 100 120\n"" 850 101 121 122 100\n"" 851 102 121 103 122\n"" 852 7 206 6 205\n"" 853 38 206 6 102\n"" 854 107 38 103 206\n"" 855 448 206 423 279\n"" 856 298 305 284 296\n"" 857 30 432 436 431\n"" 858 23 432 30 28\n"" 859 119 107 104 155\n"" 860 142 337 318 144\n"" 861 107 103 43 104\n"" 862 426 424 425 451\n"" 863 107 156 155 166\n"" 864 119 107 106 104\n"" 865 156 107 149 166\n"" 866 103 107 43 38\n"" 867 103 122 206 102\n"" 868 448 41 45 37\n"" 869 423 416 45 448\n"" 870 81 228 213 31\n"" 871 217 239 213 215\n"" 872 403 376 415 401\n"" 873 443 74 80 389\n"" 874 135 163 341 118\n"" 875 133 126 136 137\n"" 876 228 216 213 217\n"" 877 447 451 7 449\n"" 878 71 41 393 392\n"" 879 282 321 304 281\n"" 880 95 63 99 61\n"" 881 185 197 183 188\n"" 882 433 23 437 436\n"" 883 212 24 210 19\n"" 884 257 260 440 258\n"" 885 184 197 185 198\n"" 886 175 178 195 179\n"" 887 61 60 58 44\n"" 888 362 363 361 365\n"" 889 447 451 424 7\n"" 890 132 135 130 131\n"" 891 61 91 96 58\n"" 892 385 430 387 384\n"" 893 127 133 130 126\n"" 894 80 274 226 255\n"" 895 80 274 255 384\n"" 896 219 87 86 84\n"" 897 275 259 224 276\n"" 898 18 229 15 227\n"" 899 320 304 311 322\n"" 900 23 21 26 433\n"" 901 109 38 48 107\n"" 902 342 139 126 138\n"" 903 21 23 26 22\n"" 904 426 428 444 427\n"" 905 331 166 362 315\n"" 906 122 206 204 453\n"" 907 12 1 35 13\n"" 908 189 331 281 333\n"" 909 35 9 34 1\n"" 910 426 412 389 411\n"" 911 287 305 289 293\n"" 912 320 160 333 336\n"" 913 0 35 37 36\n"" 914 262 255 247 256\n"" 915 353 352 325 324\n"" 916 336 329 330 316\n"" 917 275 260 440 259\n"" 918 16 442 437 441\n"" 919 380 378 273 381\n"" 920 7 424 447 448\n"" 921 400 376 373 375\n"" 922 222 223 214 83\n"" 923 30 22 23 27\n"" 924 262 271 274 429\n"" 925 45 44 37 41\n"" 926 380 265 382 273\n"" 927 149 333 189 147\n"" 928 242 245 229 243\n"" 929 131 135 128 118\n"" 930 245 256 247 255\n"" 931 391 412 393 394\n"" 932 99 61 97 95\n"" 933 281 203 280 453\n"" 934 350 333 331 322\n"" 935 41 71 393 70\n"" 936 398 400 399 402\n"" 937 323 309 308 310\n"" 938 37 3 0 7\n"" 939 72 393 45 391\n"" 940 408 270 430 407\n"" 941 40 47 44 42\n"" 942 298 305 293 284\n"" 943 250 385 386 80\n"" 944 266 379 273 380\n"" 945 191 170 192 173\n"" 946 364 354 356 355\n"" 947 200 186 159 187\n"" 948 159 147 190 158\n"" 949 229 244 225 245\n"" 950 427 250 411 428\n"" 951 342 347 126 340\n"" 952 13 80 12 15\n"" 953 342 346 347 344\n"" 954 268 273 379 406\n"" 955 352 365 366 369\n"" 956 78 50 240 51\n"" 957 322 321 304 294\n"" 958 183 180 196 182\n"" 959 266 379 267 273\n"" 960 58 59 60 91\n"" 961 405 273 269 406\n"" 962 84 220 85 86\n"" 963 81 82 214 223\n"" 964 21 24 26 211\n"" 965 87 219 86 57\n"" 966 442 411 428 426\n"" 967 35 443 1 426\n"" 968 47 44 94 46\n"" 969 357 325 113 313\n"" 970 313 357 354 113\n"" 971 31 217 228 213\n"" 972 99 61 66 64\n"" 973 144 166 147 160\n"" 974 298 284 285 297\n"" 975 398 400 371 399\n"" 976 51 78 50 79\n"" 977 298 284 297 296\n"" 978 7 451 3 449\n"" 979 281 279 280 331\n"" 980 158 177 190 159\n"" 981 117 106 105 119\n"" 982 278 276 277 433\n"" 983 200 122 201 177\n"" 984 72 35 389 74\n"" 985 54 228 31 217\n"" 986 379 406 378 404\n"" 987 347 127 126 128\n"" 988 109 362 112 360\n"" 989 126 339 340 341\n"" 990 142 338 140 163\n"" 991 38 44 47 42\n"" 992 150 142 145 164\n"" 993 426 424 451 420\n"" 994 431 208 433 30\n"" 995 437 207 433 276\n"" 996 135 154 153 163\n"" 997 163 341 354 318\n"" 998 443 13 74 35\n"" 999 143 142 144 140\n"" 1000 320 322 323 333\n"" 1001 122 147 158 149\n"" 1002 112 359 361 113\n"" 1003 359 112 361 360\n"" 1004 149 121 201 453\n"" 1005 361 358 113 359\n"" 1006 361 113 357 325\n"" 1007 113 359 358 112\n"" 1008 409 388 410 250\n"" 1009 71 69 389 70\n"" 1010 430 409 387 408\n"" 1011 32 217 216 228\n"" 1012 400 374 372 373\n"" 1013 419 422 423 421\n"" 1014 51 78 79 240\n"" 1015 387 386 250 385\n"" 1016 48 360 109 111\n"" 1017 438 277 433 435\n"" 1018 316 331 329 315\n"" 1019 74 50 49 35\n"" 1020 302 305 287 293\n"" 1021 287 293 286 302\n"" 1022 258 440 257 263\n"" 1023 188 183 181 196\n"" 1024 1 426 41 35\n"" 1025 236 216 213 234\n"" 1026 292 283 291 304\n"" 1027 381 383 273 382\n"" 1028 50 15 33 35\n"" 1029 79 240 78 80\n"" 1030 177 122 201 190\n"" 1031 307 308 309 310\n"" 1032 229 240 33 243\n"" 1033 200 187 177 199\n"" 1034 31 214 213 81\n"" 1035 128 133 126 136\n"" 1036 37 424 448 41\n"" 1037 263 247 246 248\n"" 1038 444 389 442 426\n"" 1039 423 417 414 94\n"" 1040 177 190 191 173\n"" 1041 417 419 415 421\n"" 1042 300 293 302 286\n"" 1043 442 13 15 80\n"" 1044 121 103 149 120\n"" 1045 136 126 135 137\n"" 1046 201 122 121 149\n"" 1047 331 316 333 315\n"" 1048 18 19 15 212\n"" 1049 38 45 423 94\n"" 1050 113 347 354 123\n"" 1051 273 405 269 408\n"" 1052 26 208 30 433\n"" 1053 431 208 278 433\n"" 1054 429 251 271 274\n"" 1055 109 38 360 48\n"" 1056 400 398 371 370\n"" 1057 174 173 175 171\n"" 1058 149 362 107 206\n"" 1059 245 242 229 244\n"" 1060 417 423 414 419\n"" 1061 185 199 186 198\n"" 1062 158 170 173 157\n"" 1063 177 122 190 159\n"" 1064 308 292 311 290\n"" 1065 380 378 379 273\n"" 1066 218 81 214 53\n"" 1067 232 244 233 227\n"" 1068 72 49 35 74\n"" 1069 235 245 226 244\n"" 1070 234 243 242 228\n"" 1071 316 331 332 329\n"" 1072 451 41 424 1\n"" 1073 362 353 363 365\n"" 1074 224 20 21 211\n"" 1075 258 248 263 246\n"" 1076 393 389 392 412\n"" 1077 212 15 224 20\n"" 1078 342 346 344 345\n"" 1079 229 74 240 80\n"" 1080 302 301 300 286\n"" 1081 203 202 204 453\n"" 1082 216 234 236 32\n"" 1083 386 388 410 411\n"" 1084 144 163 165 316\n"" 1085 347 344 346 356\n"" 1086 21 442 224 437\n"" 1087 190 122 201 147\n"" 1088 6 424 7 448\n"" 1089 269 270 408 407\n"" 1090 126 125 347 348\n"" 1091 37 44 45 38\n"" 1092 393 72 45 70\n"" 1093 413 423 418 414\n"" 1094 31 32 54 53\n"" 1095 29 22 27 26\n"" 1096 403 376 401 402\n"" 1097 83 220 221 85\n"" 1098 433 207 278 276\n"" 1099 218 57 55 56\n"" 1100 155 116 119 106\n"" 1101 173 175 171 192\n"" 1102 244 225 245 233\n"" 1103 158 173 172 157\n"" 1104 281 203 201 202\n"" 1105 344 354 356 347\n"" 1106 315 144 333 160\n"" 1107 392 426 412 389\n"" 1108 87 83 79 84\n"" 1109 347 358 357 349\n"" 1110 342 139 339 126\n"" 1111 126 341 340 354\n"" 1112 37 424 3 7\n"" 1113 210 29 25 26\n"" 1114 261 389 442 80\n"" 1115 107 112 155 108\n"" 1116 389 250 428 411\n"" 1117 80 12 15 74\n"" 1118 380 265 273 266\n"" 1119 190 122 147 159\n"" 1120 142 338 144 140\n"" 1121 109 362 107 112\n"" 1122 362 423 366 418\n"" 1123 97 66 98 64\n"" 1124 300 293 286 298\n"" 1125 130 136 133 128\n"" 1126 389 77 80 386\n"" 1127 142 337 338 318\n"" 1128 56 76 55 218\n"" 1129 214 82 83 223\n"" 1130 246 261 263 225\n"" 1131 35 12 15 33\n"" 1132 420 1 451 426\n"" 1133 63 99 61 66\n"" 1134 96 44 92 91\n"" 1135 219 214 218 83\n"" 1136 323 308 309 322\n"" 1137 224 229 225 15\n"" 1138 38 413 48 414\n"" 1139 281 149 279 331\n"" 1140 183 188 197 196\n"" 1141 180 195 181 196\n"" 1142 50 15 35 74\n"" 1143 113 347 357 354\n"" 1144 331 166 315 333\n"" 1145 19 15 212 20\n"" 1146 69 389 70 72\n"" 1147 216 236 213 239\n"" 1148 6 424 448 37\n"" 1149 74 229 33 15\n"" 1150 185 199 187 186\n"" 1151 71 389 41 392\n"" 1152 195 174 175 194\n"" 1153 398 400 402 370\n"" 1154 282 283 294 295\n"" 1155 244 227 229 225\n"" 1156 308 310 306 290\n"" 1157 288 310 306 307\n"" 1158 307 308 310 306\n"" 1159 251 274 254 252\n"" 1160 55 219 87 57\n"" 1161 64 63 65 62\n"" 1162 15 13 16 12\n"" 1163 190 201 189 161\n"" 1164 316 331 333 332\n"" 1165 329 331 324 315\n"" 1166 364 354 353 356\n"" 1167 166 144 147 165\n"" 1168 334 329 336 332\n"" 1169 420 422 424 416\n"" 1170 350 333 281 331\n"" 1171 322 292 321 281\n"" 1172 209 24 210 212\n"" 1173 424 37 1 41\n"" 1174 269 407 408 405\n"" 1175 429 430 407 408\n"" 1176 15 443 13 442\n"" 1177 214 221 222 83\n"" 1178 13 17 16 14\n"" 1179 333 166 315 160\n"" 1180 224 20 211 212\n"" 1181 122 201 121 453\n"" 1182 246 247 245 256\n"" 1183 391 393 416 394\n"" 1184 37 44 38 39\n"" 1185 344 354 355 356\n"" 1186 189 147 333 160\n"" 1187 437 208 433 207\n"" 1188 181 195 178 179\n"" 1189 403 376 402 373\n"" 1190 183 180 181 196\n"" 1191 433 276 438 437\n"" 1192 380 273 382 381\n"" 1193 209 24 26 210\n"" 1194 379 406 404 268\n"" 1195 7 451 424 3\n"" 1196 400 402 373 403\n"" 1197 21 207 211 26\n"" 1198 451 41 1 420\n"" 1199 201 149 279 281\n"" 1200 347 344 354 340\n"" 1201 419 417 415 414\n"" 1202 344 345 346 343\n"" 1203 79 83 76 82\n"" 1204 128 133 130 127\n"" 1205 6 424 37 7\n"" 1206 190 147 201 161\n"" 1207 87 218 55 83\n"" 1208 39 44 41 37\n"" 1209 245 242 235 243\n"" 1210 389 41 392 420\n"" 1211 24 212 20 19\n"" 1212 451 41 420 424\n"" 1213 78 75 50 79\n"" 1214 440 257 263 225\n"" 1215 81 83 76 218\n"" 1216 385 378 387 381\n"" 1217 430 387 384 408\n"" 1218 329 315 324 316\n"" 1219 281 280 279 453\n"" 1220 279 205 206 453\n"" 1221 253 254 274 252\n"" 1222 325 357 356 354\n"" 1223 443 17 13 14\n"" 1224 322 292 281 320\n"" 1225 399 372 397 400\n"" 1226 56 76 53 55\n"" 1227 212 231 18 230\n"" 1228 24 26 211 209\n"" 1229 420 1 426 41\n"" 1230 182 196 183 197\n"" 1231 229 74 80 15\n"" 1232 118 347 126 128\n"" 1233 180 195 178 181\n"" 1234 361 358 357 113\n"" 1235 239 213 215 238\n"" 1236 224 229 15 18\n"" 1237 423 68 94 414\n"" 1238 6 45 37 448\n"" 1239 48 360 111 413\n"" 1240 302 301 286 303\n"" 1241 35 41 1 37\n"" 1242 431 278 434 433\n"" 1243 145 164 162 150\n"" 1244 174 173 171 172\n"" 1245 423 279 367 448\n"" 1246 362 423 107 206\n"" 1247 272 271 251 274\n"" 1248 273 385 378 387\n"" 1249 200 122 177 159\n"" 1250 452 425 447 449\n"" 1251 210 29 26 209\n"" 1252 130 135 136 128\n"" 1253 234 213 237 235\n"" 1254 216 54 217 32\n"" 1255 402 373 376 374\n"" 1256 164 143 165 150\n"" 1257 427 250 410 411\n"" 1258 386 388 250 410\n"" 1259 96 61 59 95\n"" 1260 159 200 187 177\n"" 1261 389 443 442 80\n"" 1262 398 395 396 399\n"" 1263 87 83 55 76\n"" 1264 389 77 74 80\n"" 1265 229 15 80 225\n"" 1266 207 433 278 208\n"" 1267 96 59 91 95\n"" 1268 341 126 135 118\n"" 1269 62 61 59 58\n"" 1270 206 149 279 453\n"" 1271 400 370 372 374\n"" 1272 389 35 426 74\n"" 1273 360 423 362 413\n"" 1274 54 228 32 31\n"" 1275 109 38 107 360\n"" 1276 87 83 84 219\n"" 1277 72 35 69 389\n"" 1278 246 262 247 256\n"" 1279 352 364 353 365\n"" 1280 268 273 406 269\n"" 1281 443 74 13 80\n"" 1282 242 244 241 229\n"" 1283 149 279 362 206\n"" 1284 99 64 66 97\n"" 1285 376 373 92 374\n"" 1286 26 29 25 27\n"" 1287 32 213 228 216\n"" 1288 118 163 341 354\n"" 1289 161 158 147 157\n"" 1290 61 60 44 91\n"" 1291 292 308 304 291\n"" 1292 163 144 165 162\n"" 1293 407 262 430 429\n"" 1294 63 62 61 59\n"" 1295 153 163 154 168\n"" 1296 350 281 322 321\n"" 1297 262 271 270 274\n"" 1298 442 426 428 444\n"" 1299 38 44 42 39\n"" 1300 80 240 229 243\n"" 1301 194 171 174 175\n"" 1302 155 362 325 112\n"" 1303 306 304 291 305\n"" 1304 77 78 74 80\n"" 1305 80 74 240 78\n"" 1306 38 44 94 47\n"" 1307 273 405 408 406\n"" 1308 293 298 285 286\n"" 1309 88 389 390 77\n"" 1310 311 304 292 308\n"" 1311 99 66 98 97\n"" 1312 26 210 24 25\n"" 1313 259 224 276 207\n"" 1314 61 62 64 58\n"" 1315 244 242 235 245\n"" 1316 244 241 235 242\n"" 1317 63 61 64 66\n"" 1318 149 201 279 453\n"" 1319 206 122 121 453\n"" 1320 413 366 362 365\n"" 1321 409 388 250 387\n"" 1322 423 362 413 418\n"" 1323 38 414 48 47\n"" 1324 38 360 423 107\n"" 1325 290 289 288 306\n"" 1326 333 322 323 331\n"" 1327 389 443 74 426\n"" 1328 35 71 389 41\n"" 1329 279 149 362 331\n"" 1330 74 12 15 35\n"" 1331 424 423 422 448\n"" 1332 190 201 177 200\n"" 1333 365 325 353 352\n"" 1334 385 383 384 273\n"" 1335 331 322 321 350\n"" 1336 71 70 389 393\n"" 1337 126 139 339 137\n"" 1338 44 45 92 91\n"" 1339 72 49 69 35\n"" 1340 175 178 174 195\n"" 1341 247 246 245 261\n"" 1342 41 424 448 420\n"" 1343 46 92 44 94\n"" 1344 402 400 373 374\n"" 1345 198 197 185 188\n"" 1346 304 296 294 283\n"" 1347 116 131 129 128\n"" 1348 50 15 74 33\n"" 1349 110 108 112 109\n"" 1350 448 425 424 447\n"" 1351 166 331 362 149\n"" 1352 206 149 103 107\n"" 1353 209 26 208 29\n"" 1354 211 231 224 212\n"" 1355 33 50 51 240\n"" 1356 32 213 234 228\n"" 1357 444 389 426 443\n"" 1358 107 112 108 109\n"" 1359 217 213 214 215\n"" 1360 16 22 436 21\n"" 1361 142 337 144 338\n"" 1362 323 311 322 320\n"" 1363 411 386 389 250\n"" 1364 265 273 264 382\n"" 1365 211 230 231 212\n"" 1366 295 296 294 297\n"" 1367 0 35 1 37\n"" 1368 229 74 33 240\n"" 1369 131 118 116 117\n"" 1370 122 204 101 201\n"" 1371 206 122 204 101\n"" 1372 83 220 86 219\n"" 1373 113 358 347 123\n""# Generated by tetgen -YY bunny.smesh \n"); } +static const char* getNodes() { return( +"454 3 0 0\n"" 0 -2.0063499999999999 0.79804200000000003 0.373554\n"" 1 -2.1011299999999999 0.90212400000000004 -0.88661400000000001\n"" 2 -1.4052100000000001 2.0628700000000002 -1.0458400000000001\n"" 3 -1.2015499999999999 1.7112400000000001 0.56249400000000005\n"" 4 0.02112 2.8512499999999998 -0.95618999999999998\n"" 5 0.011136 2.5152199999999998 0.59149200000000002\n"" 6 -1.51681 0.56199600000000005 1.42523\n"" 7 -0.977406 1.4278999999999999 1.24143\n"" 8 0.0051900000000000002 1.9088499999999999 1.41222\n"" 9 -2.4877400000000001 0.98449799999999998 -1.6695199999999999\n"" 10 -1.57328 2.1440000000000001 -1.7594799999999999\n"" 11 0.027768000000000001 2.8961600000000001 -2.0317599999999998\n"" 12 -2.4129700000000001 0.80116799999999999 -2.6594799999999998\n"" 13 -1.46269 1.9456500000000001 -2.6205799999999999\n"" 14 0.031758000000000002 2.6255500000000001 -2.7499899999999999\n"" 15 -2.0392999999999999 -0.24690000000000001 -4.0092699999999999\n"" 16 -1.4902899999999999 1.53495 -3.7649599999999999\n"" 17 0.037566000000000002 2.2566199999999998 -3.78904\n"" 18 -1.29721 -0.760656 -5.3216200000000002\n"" 19 -1.0264500000000001 0.069264000000000006 -5.2883199999999997\n"" 20 -1.0864400000000001 0.58933800000000003 -4.8886700000000003\n"" 21 -0.71934600000000004 1.3127200000000001 -4.5609200000000003\n"" 22 -0.47337000000000001 1.6606799999999999 -4.4356900000000001\n"" 23 0.040806000000000002 1.86575 -4.4139699999999999\n"" 24 -1.01305 0.61432200000000003 -5.5222899999999999\n"" 25 -0.62443199999999999 1.0636699999999999 -5.7151800000000001\n"" 26 -0.77822400000000003 1.2710900000000001 -5.0200699999999996\n"" 27 -0.59924999999999995 1.8655900000000001 -4.7962899999999999\n"" 28 0.043422000000000002 2.1701199999999998 -4.7666300000000001\n"" 29 -0.467478 1.5525199999999999 -5.5298400000000001\n"" 30 0.047742 1.6934499999999999 -5.5900800000000004\n"" 31 -1.5133300000000001 -3.3024100000000001 -3.3468599999999999\n"" 32 -1.6057999999999999 -3.6205099999999999 -3.9312499999999999\n"" 33 -2.6810299999999998 -0.71110200000000001 -2.7969499999999998\n"" 34 -2.7569300000000001 -0.55810199999999999 -1.86805\n"" 35 -2.2238699999999998 -0.60064799999999996 -0.95672400000000002\n"" 36 -2.2319 -0.55194600000000005 -0.066264000000000003\n"" 37 -1.97367 -0.58961399999999997 0.53195400000000004\n"" 38 -1.6947099999999999 -0.11317199999999999 1.8690100000000001\n"" 39 -2.11442 -0.78804600000000002 0.86941199999999996\n"" 40 -2.1847599999999998 -1.2017899999999999 1.2143299999999999\n"" 41 -1.7037899999999999 -1.3912100000000001 0.142008\n"" 42 -1.79366 -0.93130800000000002 2.2183000000000002\n"" 43 -1.7627200000000001 -0.73113600000000001 2.51458\n"" 44 -1.74098 -1.74478 0.64694399999999996\n"" 45 -1.5849899999999999 -1.6370899999999999 0.218082\n"" 46 -1.3714 -2.2354400000000001 1.7418499999999999\n"" 47 -1.14259 -1.7219800000000001 2.5314999999999999\n"" 48 -1.1462300000000001 -1.44584 3.04271\n"" 49 -1.72363 -1.65859 -0.39266400000000001\n"" 50 -1.7740499999999999 -1.6849099999999999 -1.0451999999999999\n"" 51 -2.3972199999999999 -1.87879 -2.2570000000000001\n"" 52 -2.3559999999999999 -2.9314900000000002 -2.5649600000000001\n"" 53 -1.9900100000000001 -3.4211100000000001 -2.7963200000000001\n"" 54 -1.69374 -3.7088399999999999 -3.53532\n"" 55 -2.2454299999999998 -3.5692900000000001 -1.9397899999999999\n"" 56 -2.2864300000000002 -3.77834 -2.10466\n"" 57 -2.2926700000000002 -3.7443599999999999 -1.3294600000000001\n"" 58 -1.6362099999999999 -3.39913 1.55494\n"" 59 -1.5402100000000001 -3.9804400000000002 1.7164699999999999\n"" 60 -1.6856899999999999 -2.5701499999999999 0.33473999999999998\n"" 61 -1.1098399999999999 -3.0533600000000001 1.9575899999999999\n"" 62 -1.6798299999999999 -3.1615099999999998 2.3719100000000002\n"" 63 -1.6955899999999999 -3.9803600000000001 2.4744700000000002\n"" 64 -1.1299699999999999 -2.8505600000000002 2.5077199999999999\n"" 65 -1.5803 -3.9803799999999998 2.79962\n"" 66 -1.2543800000000001 -3.9803600000000001 3.05606\n"" 67 -0.012264000000000001 -1.91774 3.31847\n"" 68 -0.0075960000000000003 -2.22756 2.4797799999999999\n"" 69 -1.3185199999999999 -2.03857 -0.24552599999999999\n"" 70 -1.54192 -1.6950700000000001 -0.038094000000000003\n"" 71 -1.6302399999999999 -1.5652900000000001 0.010584\n"" 72 -0.54714600000000002 -2.5150999999999999 -0.27547199999999999\n"" 73 -0.68966400000000005 -2.5785100000000001 -0.74843400000000004\n"" 74 -0.68381999999999998 -2.29792 -1.13124\n"" 75 -1.45807 -2.78965 -1.4571000000000001\n"" 76 -1.88889 -3.03241 -1.94861\n"" 77 0.016643999999999999 -2.6251600000000002 -1.5766\n"" 78 -0.43575000000000003 -2.5064899999999999 -1.32864\n"" 79 -0.96067199999999997 -2.8615900000000001 -1.7606999999999999\n"" 80 0.023154000000000001 -2.7205499999999998 -2.6635\n"" 81 -0.72217799999999999 -3.4893999999999998 -2.6321300000000001\n"" 82 -0.54899399999999998 -3.50515 -1.7670699999999999\n"" 83 -0.69881400000000005 -3.59917 -1.12985\n"" 84 -1.2481899999999999 -3.0818400000000001 -0.807894\n"" 85 -1.41449 -3.6600999999999999 -0.24563399999999999\n"" 86 -2.0695000000000001 -3.7349199999999998 -0.51227999999999996\n"" 87 -2.0184099999999998 -3.1911800000000001 -1.27379\n"" 88 0.011766 -2.7572999999999999 -0.81328199999999995\n"" 89 -0.34977599999999998 -2.5832199999999998 -0.26063999999999998\n"" 90 0.0082679999999999993 -2.6970700000000001 -0.226572\n"" 91 -0.78081 -3.0613299999999999 0.47486400000000001\n"" 92 0.000852 -2.8652899999999999 0.942384\n"" 93 -0.68570399999999998 -2.7192400000000001 1.8263799999999999\n"" 94 -0.003552 -2.6613500000000001 1.71241\n"" 95 -0.33728999999999998 -3.98041 1.95644\n"" 96 -0.15748799999999999 -3.4080599999999999 1.63991\n"" 97 -0.295566 -3.1863800000000002 2.3391199999999999\n"" 98 -0.76257600000000003 -3.9803899999999999 2.8759000000000001\n"" 99 -0.350304 -3.98041 2.2373500000000002\n"" 100 -1.8237699999999999 0.32519399999999998 3.7555299999999998\n"" 101 -1.6115600000000001 1.16042 3.0165999999999999\n"" 102 -1.6629499999999999 0.75673800000000002 2.6597300000000001\n"" 103 -1.72563 -0.034332000000000001 3.1910599999999998\n"" 104 -1.3883799999999999 -0.72773399999999999 3.5243199999999999\n"" 105 -1.52085 -0.490782 4.53925\n"" 106 -1.1709799999999999 -0.82781400000000005 4.3680700000000003\n"" 107 -1.00604 -0.939438 3.6563300000000001\n"" 108 -0.875502 -1.01417 4.1856\n"" 109 -0.46665600000000002 -1.28548 3.7355200000000002\n"" 110 -0.46123799999999998 -1.28983 4.17781\n"" 111 -0.014045999999999999 -1.3988100000000001 3.7371500000000002\n"" 112 -0.016379999999999999 -1.2811600000000001 4.1475999999999997\n"" 113 -0.018815999999999999 -1.15577 4.57639\n"" 114 -0.336816 -1.20733 4.58284\n"" 115 -0.68753399999999998 -0.99715200000000004 4.6243400000000001\n"" 116 -0.93086999999999998 -0.77779200000000004 4.7504299999999997\n"" 117 -1.1016699999999999 -0.35222999999999999 5.0820699999999999\n"" 118 -0.99337200000000003 0.01188 5.0003200000000003\n"" 119 -1.3205 0.11948400000000001 4.6136100000000004\n"" 120 -1.5343800000000001 0.54183599999999998 4.0246899999999997\n"" 121 -1.53356 0.68299799999999999 3.9803299999999999\n"" 122 -1.3582799999999999 1.27593 3.7064400000000002\n"" 123 -0.020202000000000001 -1.17205 4.7980799999999997\n"" 124 -0.17845800000000001 -1.26305 4.9630799999999997\n"" 125 -0.022908000000000001 -1.1687000000000001 5.2418199999999997\n"" 126 -0.024695999999999999 -0.94744200000000001 5.5876099999999997\n"" 127 -0.18768000000000001 -1.1073299999999999 5.3368599999999997\n"" 128 -0.35931000000000002 -1.10669 5.0479799999999999\n"" 129 -0.811998 -0.98599199999999998 5.2691999999999997\n"" 130 -0.51344400000000001 -1.02569 5.55328\n"" 131 -0.98299800000000004 -0.56501999999999997 5.3826799999999997\n"" 132 -0.83066399999999996 -0.62549999999999994 5.6758499999999996\n"" 133 -0.50098200000000004 -0.50960399999999995 5.8776400000000004\n"" 134 -0.026598 -0.87985199999999997 5.9152300000000002\n"" 135 -0.90429000000000004 0.19589999999999999 5.3046699999999998\n"" 136 -0.81535199999999997 -0.21312 5.6727299999999996\n"" 137 -0.42367199999999999 0.22109400000000001 5.8544\n"" 138 -0.026748000000000001 -0.25515599999999999 6.0940200000000004\n"" 139 -0.025493999999999999 0.276252 6.0194400000000003\n"" 140 -0.521814 0.79934400000000005 5.6858000000000004\n"" 141 -0.023238000000000002 0.96962999999999999 5.8229899999999999\n"" 142 -0.75326400000000004 0.84007200000000004 5.5060700000000002\n"" 143 -0.75390599999999997 1.5014799999999999 5.1456099999999996\n"" 144 -0.018762000000000001 1.70442 5.2732200000000002\n"" 145 -0.955044 0.75435600000000003 5.3332699999999997\n"" 146 -1.10284 1.1818200000000001 5.0668800000000003\n"" 147 -0.95933999999999997 1.7504200000000001 4.3948799999999997\n"" 148 -1.1969700000000001 1.2433799999999999 4.6791799999999997\n"" 149 -1.23709 0.98764799999999997 4.1595399999999998\n"" 150 -1.1178900000000001 0.96413400000000005 4.9031599999999997\n"" 151 -1.15696 1.00024 4.6936299999999997\n"" 152 -1.05067 0.66004799999999997 5.1637300000000002\n"" 153 -0.96613199999999999 0.34451999999999999 5.1306700000000003\n"" 154 -1.0339100000000001 0.21693000000000001 4.8971299999999998\n"" 155 -1.14191 0.38449800000000001 4.5636299999999999\n"" 156 -1.1704300000000001 0.77507400000000004 4.3866199999999997\n"" 157 -1.2187600000000001 2.4617200000000001 4.0832199999999998\n"" 158 -1.30006 1.85564 3.8536299999999999\n"" 159 -1.44909 1.8689100000000001 3.5269900000000001\n"" 160 -0.013254 2.19998 4.49648\n"" 161 -0.52937999999999996 2.3775900000000001 4.0718100000000002\n"" 162 -1.02088 0.65710199999999996 5.0446999999999997\n"" 163 -0.96312600000000004 0.40659600000000001 4.9839000000000002\n"" 164 -1.08928 0.83882999999999996 4.8728800000000003\n"" 165 -1.08297 0.89140799999999998 4.6565200000000004\n"" 166 -1.0815300000000001 0.77475000000000005 4.4651500000000004\n"" 167 -1.1177900000000001 0.46984799999999999 4.6161099999999999\n"" 168 -1.00573 0.363234 4.8400499999999997\n"" 169 -1.1392599999999999 0.61656 4.8154899999999996\n"" 170 -0.65003999999999995 2.7326800000000002 3.9430399999999999\n"" 171 -1.4495100000000001 3.1655500000000001 4.0157800000000003\n"" 172 -1.59406 3.0802 3.8075600000000001\n"" 173 -1.21844 2.8713000000000002 3.48916\n"" 174 -1.60063 3.85398 3.6123699999999999\n"" 175 -1.3017700000000001 3.3890799999999999 3.2126100000000002\n"" 176 -1.21326 3.1529699999999998 2.8556599999999999\n"" 177 -1.16333 2.80755 3.12364\n"" 178 -1.5950200000000001 4.5435999999999996 3.0055999999999998\n"" 179 -1.44184 3.9206400000000001 2.77929\n"" 180 -1.8554299999999999 4.6612099999999996 1.82836\n"" 181 -1.62605 4.09856 2.2921100000000001\n"" 182 -1.8726700000000001 4.0265899999999997 1.7201200000000001\n"" 183 -1.6127499999999999 3.7460499999999999 2.2633899999999998\n"" 184 -1.81474 3.2039800000000001 2.1617299999999999\n"" 185 -1.5819399999999999 3.1758600000000001 2.4753799999999999\n"" 186 -1.69387 2.4910000000000001 2.6859999999999999\n"" 187 -1.4352100000000001 2.6525799999999999 2.9736199999999999\n"" 188 -1.32026 3.4141599999999999 2.6752600000000002\n"" 189 -0.0075779999999999997 2.3737900000000001 3.6121699999999999\n"" 190 -0.34406999999999999 2.6552099999999998 3.4333399999999998\n"" 191 -0.53356199999999998 3.0379999999999998 3.1746400000000001\n"" 192 -0.75442799999999999 3.2104599999999999 3.6774800000000001\n"" 193 -0.75750600000000001 3.4630200000000002 2.8989500000000001\n"" 194 -0.89756400000000003 3.6691199999999999 3.34639\n"" 195 -0.979128 3.96475 2.9464800000000002\n"" 196 -1.0348900000000001 3.9803199999999999 2.4925000000000002\n"" 197 -0.96278399999999997 3.5502600000000002 2.2239499999999999\n"" 198 -0.93867 3.2183799999999998 2.2698100000000001\n"" 199 -0.81897600000000004 2.66615 2.5513599999999999\n"" 200 -0.573384 2.24261 2.8419500000000002\n"" 201 -0.62487599999999999 1.89547 2.9886200000000001\n"" 202 -0.0029759999999999999 2.3051599999999999 2.8429000000000002\n"" 203 -0.001098 1.7866200000000001 2.4089200000000002\n"" 204 -0.77425200000000005 1.62087 2.60697\n"" 205 0.00059999999999999995 1.63778 2.09483\n"" 206 -0.67835999999999996 1.4218999999999999 2.31332\n"" 207 0.043560000000000001 0.097865999999999995 -5.3003799999999996\n"" 208 0.047190000000000003 0.73262400000000005 -5.7368199999999998\n"" 209 -0.197052 0.69169199999999997 -5.7195099999999996\n"" 210 -0.53469 0.65069399999999999 -5.7019000000000002\n"" 211 -0.28464 0.088373999999999994 -5.2965400000000002\n"" 212 -0.62674799999999997 0.078822000000000003 -5.2924199999999999\n"" 213 -0.51863400000000004 -3.5091999999999999 -3.6500599999999999\n"" 214 -0.69015599999999999 -3.9756300000000002 -2.62039\n"" 215 -0.43009799999999998 -3.9922300000000002 -3.6383100000000002\n"" 216 -1.5472999999999999 -3.9922900000000001 -3.9483100000000002\n"" 217 -1.6352500000000001 -3.9922900000000001 -3.5523799999999999\n"" 218 -2.2279300000000002 -3.9922900000000001 -2.1217199999999998\n"" 219 -2.2341700000000002 -3.9922900000000001 -1.3465199999999999\n"" 220 -2.0110000000000001 -3.9922800000000001 -0.47173799999999999\n"" 221 -1.35599 -3.9922499999999999 -0.23388600000000001\n"" 222 -0.64031400000000005 -3.9922399999999998 -1.1181099999999999\n"" 223 -0.49049399999999999 -3.9922300000000002 -1.75532\n"" 224 0.041658000000000001 -0.54903000000000002 -5.1501200000000003\n"" 225 0.036701999999999999 -1.68591 -4.6197999999999997\n"" 226 0.026970000000000001 -3.01416 -3.3587899999999999\n"" 227 -1.1918299999999999 -1.81281 -5.0749000000000004\n"" 228 -1.4243699999999999 -3.2552599999999998 -3.5231300000000001\n"" 229 -1.62001 -1.67693 -4.0191699999999999\n"" 230 -0.80728200000000006 -0.71911199999999997 -5.7540199999999997\n"" 231 -0.31252799999999997 -0.73477800000000004 -5.6672900000000004\n"" 232 -0.74677800000000005 -1.76105 -5.3974000000000002\n"" 233 -0.28569600000000001 -1.73786 -5.2757500000000004\n"" 234 -1.0115700000000001 -3.1747899999999998 -3.9295900000000001\n"" 235 -0.59875800000000001 -3.0943100000000001 -3.8752399999999998\n"" 236 -1.1170100000000001 -3.6316899999999999 -4.3481399999999999\n"" 237 -0.67781999999999998 -3.49858 -4.2448100000000002\n"" 238 -0.64891200000000004 -3.9922499999999999 -4.2024499999999998\n"" 239 -1.0981099999999999 -3.99227 -4.3057800000000004\n"" 240 -2.0971700000000002 -2.0067499999999998 -3.0719099999999999\n"" 241 -0.84709199999999996 -2.6262300000000001 -4.7891599999999999\n"" 242 -1.2760199999999999 -2.6923499999999998 -4.4246800000000004\n"" 243 -1.56667 -2.4896699999999998 -3.6830099999999999\n"" 244 -0.46418399999999999 -2.5888800000000001 -4.6686800000000002\n"" 245 0.031043999999999999 -2.55166 -3.9095499999999999\n"" 246 0.535416 -2.5903900000000002 -4.66256\n"" 247 1.6260399999999999 -2.4944899999999999 -3.6634600000000002\n"" 248 1.34389 -2.6962999999999999 -4.4086400000000001\n"" 249 0.91964999999999997 -2.6288999999999998 -4.7783499999999997\n"" 250 2.1504799999999999 -2.0131700000000001 -3.04589\n"" 251 1.1606000000000001 -3.9956800000000001 -4.2919499999999999\n"" 252 0.71017799999999998 -3.9943 -4.1941300000000004\n"" 253 0.74109000000000003 -3.5007199999999998 -4.2361199999999997\n"" 254 1.1811100000000001 -3.6351599999999999 -4.3340699999999996\n"" 255 0.65872799999999998 -3.0962100000000001 -3.86754\n"" 256 1.0719399999999999 -3.17794 -3.91682\n"" 257 0.36694199999999999 -1.7388399999999999 -5.2717599999999996\n"" 258 0.82940400000000003 -1.7634300000000001 -5.3877499999999996\n"" 259 0.40159800000000001 -0.73585800000000001 -5.6629199999999997\n"" 260 0.89742599999999995 -0.72168600000000005 -5.7435799999999997\n"" 261 1.6859299999999999 -1.6819299999999999 -3.99892\n"" 262 1.47949 -3.2596500000000002 -3.5053399999999999\n"" 263 1.2703199999999999 -1.8165199999999999 -5.0598200000000002\n"" 264 0.52179600000000004 -3.99376 -1.74912\n"" 265 0.66380399999999995 -3.9942099999999998 -1.1101300000000001\n"" 266 1.36859 -3.9963700000000002 -0.21720600000000001\n"" 267 2.0264600000000002 -3.99838 -0.44701800000000003\n"" 268 2.2603300000000002 -3.9990800000000002 -1.319\n"" 269 2.2635900000000002 -3.9990800000000002 -2.09422\n"" 270 1.6884699999999999 -3.9973000000000001 -3.5320200000000002\n"" 271 1.60538 -3.9970400000000001 -3.9289999999999998\n"" 272 0.48447000000000001 -3.9936099999999999 -3.6327099999999999\n"" 273 0.73209599999999997 -3.9777800000000001 -2.6116799999999998\n"" 274 0.57460199999999995 -3.51085 -3.64337\n"" 275 0.71366399999999997 0.076794000000000001 -5.2842099999999999\n"" 276 0.37166399999999999 0.087384000000000003 -5.2925199999999997\n"" 277 0.62834999999999996 0.64893599999999996 -5.6947799999999997\n"" 278 0.291078 0.69095399999999996 -5.71652\n"" 279 0.676176 1.4198599999999999 2.3216199999999998\n"" 280 0.76906200000000002 1.6185400000000001 2.6164299999999998\n"" 281 0.61585800000000002 1.8935999999999999 2.9962200000000001\n"" 282 0.56720999999999999 2.2408899999999998 2.8489399999999998\n"" 283 0.81762000000000001 2.6636799999999998 2.5613700000000001\n"" 284 0.94242599999999999 3.2155399999999998 2.2813300000000001\n"" 285 0.96809999999999996 3.5473400000000002 2.2357800000000001\n"" 286 1.0382100000000001 3.9771899999999998 2.5051899999999998\n"" 287 0.97684800000000005 3.9617900000000001 2.9584600000000001\n"" 288 0.88949999999999996 3.66642 3.3573300000000001\n"" 289 0.75431400000000004 3.4607399999999999 2.90821\n"" 290 0.74093399999999998 3.2081900000000001 3.6866400000000001\n"" 291 0.52572600000000003 3.0364 3.18113\n"" 292 0.331926 2.6541899999999998 3.4374899999999999\n"" 293 1.31962 3.4101699999999999 2.69143\n"" 294 1.42859 2.64825 2.9911699999999999\n"" 295 1.6902699999999999 2.4858899999999999 2.7067299999999999\n"" 296 1.583 3.1710799999999999 2.4947599999999999\n"" 297 1.8197000000000001 3.1984900000000001 2.1839900000000001\n"" 298 1.61812 3.7411699999999999 2.2831700000000001\n"" 299 1.8855299999999999 4.0209200000000003 1.7431399999999999\n"" 300 1.6321399999999999 4.0936399999999997 2.3120599999999998\n"" 301 1.8688800000000001 4.6555900000000001 1.8511599999999999\n"" 302 1.44143 3.91628 2.7969499999999998\n"" 303 1.59371 4.53878 3.0251199999999998\n"" 304 1.15537 2.8040500000000002 3.1378300000000001\n"" 305 1.20963 3.1493099999999998 2.8704999999999998\n"" 306 1.2944599999999999 3.3851599999999999 3.2284999999999999\n"" 307 1.5898099999999999 3.8491599999999999 3.6318999999999999\n"" 308 1.2061900000000001 2.8676400000000002 3.5040100000000001\n"" 309 1.5785199999999999 3.0754000000000001 3.8269899999999999\n"" 310 1.4316899999999999 3.1612 4.0334199999999996\n"" 311 0.63185400000000003 2.7307399999999999 3.9508899999999998\n"" 312 1.1039600000000001 0.61316999999999999 4.8292299999999999\n"" 313 0.96937799999999996 0.36025200000000002 4.85215\n"" 314 1.08449 0.46652399999999999 4.6295999999999999\n"" 315 1.05101 0.77152799999999999 4.4782099999999998\n"" 316 1.0504500000000001 0.88817999999999997 4.6695799999999998\n"" 317 1.0539499999999999 0.83559000000000005 4.8860000000000001\n"" 318 0.92514600000000002 0.40374599999999999 4.9954700000000001\n"" 319 0.982908 0.65407800000000005 5.0569800000000003\n"" 320 0.50856000000000001 2.37602 4.0781700000000001\n"" 321 1.43333 1.86456 3.5446499999999999\n"" 322 1.2802800000000001 1.85175 3.8694299999999999\n"" 323 1.198 2.4580700000000002 4.09802\n"" 324 1.14086 0.77158199999999999 4.4007800000000001\n"" 325 1.109 0.38109599999999999 4.5774100000000004\n"" 326 0.99641999999999997 0.213864 4.9095700000000004\n"" 327 0.92616600000000004 0.34165800000000002 5.1422499999999998\n"" 328 1.01125 0.65693400000000002 5.1763500000000002\n"" 329 1.12432 0.99678599999999995 4.7075899999999997\n"" 330 1.08257 0.96081000000000005 4.9166299999999996\n"" 331 1.2109399999999999 0.98394599999999999 4.1745400000000004\n"" 332 1.1652400000000001 1.2398100000000001 4.6936499999999999\n"" 333 0.93262800000000001 1.74756 4.4064699999999997\n"" 334 1.0661799999999999 1.1785399999999999 5.0801600000000002\n"" 335 0.91383000000000003 0.75153599999999998 5.3447199999999997\n"" 336 0.71727600000000002 1.49926 5.1546200000000004\n"" 337 0.71021400000000001 0.83785799999999999 5.5150399999999999\n"" 338 0.47645999999999999 0.79783800000000005 5.69191\n"" 339 0.37451400000000001 0.219888 5.85928\n"" 340 0.76708200000000004 -0.21551400000000001 5.6824199999999996\n"" 341 0.86174399999999995 0.19323599999999999 5.31548\n"" 342 0.44932800000000001 -0.51103799999999999 5.8834600000000004\n"" 343 0.78110400000000002 -0.62793600000000005 5.6857199999999999\n"" 344 0.93720599999999998 -0.56791800000000003 5.3944400000000003\n"" 345 0.464196 -1.0271600000000001 5.5592699999999997\n"" 346 0.76633200000000001 -0.98837399999999997 5.2788599999999999\n"" 347 0.31602000000000002 -1.10771 5.0521099999999999\n"" 348 0.14086199999999999 -1.1078300000000001 5.33887\n"" 349 0.13575599999999999 -1.26352 4.9649999999999999\n"" 350 1.33853 1.27186 3.72296\n"" 351 1.5086599999999999 0.67840199999999995 3.9989599999999998\n"" 352 1.50851 0.53724000000000005 4.0433199999999996\n"" 353 1.28616 0.115548 4.6295700000000002\n"" 354 0.95399400000000001 0.00894 5.0122400000000003\n"" 355 1.0601799999999999 -0.35549399999999998 5.0953099999999996\n"" 356 0.89217599999999997 -0.78054599999999996 4.76159\n"" 357 0.64973999999999998 -0.99916799999999995 4.63253\n"" 358 0.29892000000000002 -1.2082900000000001 4.5867199999999997\n"" 359 0.42804599999999998 -1.2911699999999999 4.1832500000000001\n"" 360 0.438888 -1.28685 3.7410600000000001\n"" 361 0.84301199999999998 -1.01677 4.1961199999999996\n"" 362 0.980244 -0.942438 3.6684999999999999\n"" 363 1.1368 -0.83130000000000004 4.3822000000000001\n"" 364 1.48556 -0.49532399999999999 4.5576600000000003\n"" 365 1.3648100000000001 -0.73189199999999999 3.5411800000000002\n"" 366 1.70821 -0.039516000000000003 3.2120799999999998\n"" 367 1.65445 0.751722 2.6800600000000001\n"" 368 1.5999000000000001 1.1555599999999999 3.03626\n"" 369 1.8005199999999999 0.31972200000000001 3.77772\n"" 370 0.3327 -3.9836100000000001 2.2503899999999999\n"" 371 0.737124 -3.9848300000000001 2.8939400000000002\n"" 372 0.27911999999999998 -3.1894300000000002 2.3515100000000002\n"" 373 0.14894399999999999 -3.4106999999999998 1.6506400000000001\n"" 374 0.32312999999999997 -3.98359 1.9693400000000001\n"" 375 0.67697399999999996 -2.7212900000000002 1.83473\n"" 376 0.78759000000000001 -3.0636999999999999 0.48447600000000002\n"" 377 0.36704399999999998 -2.5842999999999998 -0.25625999999999999\n"" 378 2.0461100000000001 -3.1973199999999999 -1.2488999999999999\n"" 379 2.08623 -3.7412000000000001 -0.48683399999999999\n"" 380 1.42824 -3.66439 -0.22822200000000001\n"" 381 1.27058 -3.0856400000000002 -0.79246799999999995\n"" 382 0.72363 -3.6013099999999998 -1.12114\n"" 383 0.58191000000000004 -3.5068600000000001 -1.76014\n"" 384 0.76572600000000002 -3.4916499999999999 -2.6230199999999999\n"" 385 0.99541199999999996 -2.8645499999999999 -1.7487200000000001\n"" 386 0.46632000000000001 -2.5078499999999999 -1.32311\n"" 387 1.9253499999999999 -3.0381800000000001 -1.9252400000000001\n"" 388 1.4892799999999999 -2.7940999999999998 -1.4390499999999999\n"" 389 0.712584 -2.30003 -1.1226799999999999\n"" 390 0.71289599999999997 -2.5806399999999998 -0.739842\n"" 391 0.56478600000000001 -2.5167799999999998 -0.26866200000000001\n"" 392 1.64716 -1.5702400000000001 0.03066\n"" 393 1.55905 -1.6997500000000001 -0.019109999999999999\n"" 394 1.33717 -2.0425900000000001 -0.22925999999999999\n"" 395 1.2266699999999999 -3.9862799999999998 3.08012\n"" 396 1.55572 -3.9872800000000002 2.82769\n"" 397 1.1124099999999999 -2.8561200000000002 2.5303100000000001\n"" 398 1.6749799999999999 -3.9876200000000002 2.5039699999999998\n"" 399 1.6629400000000001 -3.16873 2.4012500000000001\n"" 400 1.0984100000000001 -3.0588700000000002 1.97997\n"" 401 1.6955899999999999 -2.5752600000000001 0.35545199999999999\n"" 402 1.5288999999999999 -3.98725 1.7441199999999999\n"" 403 1.62862 -3.4062399999999999 1.5838000000000001\n"" 404 2.3193700000000002 -3.7513299999999998 -1.30122\n"" 405 2.3225199999999999 -3.7852999999999999 -2.0764399999999998\n"" 406 2.2801300000000002 -3.57613 -1.9120699999999999\n"" 407 1.7476100000000001 -3.7140399999999998 -3.51424\n"" 408 2.0356800000000002 -3.42719 -2.7716799999999999\n"" 409 2.4002699999999999 -2.9386700000000001 -2.5358399999999999\n"" 410 2.4409000000000001 -1.88609 -2.2273800000000001\n"" 411 1.8035300000000001 -1.69031 -1.02329\n"" 412 1.7452000000000001 -1.6638200000000001 -0.37142999999999998\n"" 413 1.1264099999999999 -1.4492700000000001 3.0566200000000001\n"" 414 1.12819 -1.7254100000000001 2.5453999999999999\n"" 415 1.3651199999999999 -2.2395700000000001 1.75861\n"" 416 1.5991599999999999 -1.6418999999999999 0.23758199999999999\n"" 417 1.7495499999999999 -1.7500599999999999 0.66831600000000002\n"" 418 1.7514799999999999 -0.73644600000000005 2.5360999999999998\n"" 419 1.7854399999999999 -0.93671400000000005 2.2402099999999998\n"" 420 1.7196199999999999 -1.39639 0.16297200000000001\n"" 421 2.18798 -1.2083900000000001 1.2411000000000001\n"" 422 2.1231300000000002 -0.79444800000000004 0.89536800000000005\n"" 423 1.6932499999999999 -0.11829000000000001 1.8897600000000001\n"" 424 1.98712 -0.59559600000000001 0.55620599999999998\n"" 425 2.25278 -0.55871999999999999 -0.038802000000000003\n"" 426 2.2555000000000001 -0.60741599999999996 -0.92929200000000001\n"" 427 2.7998099999999999 -0.566496 -1.8340099999999999\n"" 428 2.7348300000000001 -0.71928599999999998 -2.7637900000000002\n"" 429 1.66479 -3.6254499999999998 -3.9112300000000002\n"" 430 1.56613 -3.3070599999999999 -3.3279999999999998\n"" 431 0.56176199999999998 1.5509599999999999 -5.5235300000000001\n"" 432 0.68548799999999999 1.86365 -4.7884200000000003\n"" 433 0.86539200000000005 1.2685999999999999 -5.0100100000000003\n"" 434 0.71949600000000002 1.0616399999999999 -5.70695\n"" 435 1.1043700000000001 0.611124 -5.5093199999999998\n"" 436 0.55458600000000002 1.65913 -4.4293899999999997\n"" 437 0.80102399999999996 1.3104199999999999 -4.5516100000000002\n"" 438 1.1699200000000001 0.58592999999999995 -4.87486\n"" 439 1.1132500000000001 0.066030000000000005 -5.2752100000000004\n"" 440 1.3818900000000001 -0.76470000000000005 -5.3052099999999998\n"" 441 1.5628299999999999 1.53034 -3.74627\n"" 442 2.1093999999999999 -0.253164 -3.98386\n"" 443 1.5224500000000001 1.9411400000000001 -2.6023000000000001\n"" 444 2.4696699999999998 0.793794 -2.6295799999999998\n"" 445 1.6230800000000001 2.1391800000000001 -1.7399\n"" 446 2.53288 0.97691399999999995 -1.6387799999999999\n"" 447 0.988344 1.4249400000000001 1.2534700000000001\n"" 448 1.52284 0.55740000000000001 1.44384\n"" 449 1.2216499999999999 1.7075800000000001 0.57733800000000002\n"" 450 1.44604 2.0585599999999999 -1.0283800000000001\n"" 451 2.13646 0.89572799999999997 -0.86065800000000003\n"" 452 2.0259399999999999 0.79195199999999999 0.39824399999999999\n"" 453 -0.42761063083709772 1.6952470543869633 2.5510779406671853\n""# Generated by tetgen -YY bunny.smesh \n"); } +static const char* getElements() { return( +"1374 4 0\n"" 0 395 372 399 371\n"" 1 96 46 93 44\n"" 2 135 140 137 163\n"" 3 318 326 354 313\n"" 4 133 127 128 126\n"" 5 76 83 55 218\n"" 6 193 188 198 176\n"" 7 450 443 451 1\n"" 8 437 442 438 441\n"" 9 160 336 320 144\n"" 10 79 50 51 75\n"" 11 408 378 387 273\n"" 12 94 38 47 68\n"" 13 323 308 322 311\n"" 14 339 135 163 341\n"" 15 152 135 153 145\n"" 16 333 166 160 147\n"" 17 348 346 347 342\n"" 18 446 426 451 444\n"" 19 46 92 94 93\n"" 20 208 21 26 207\n"" 21 38 360 48 413\n"" 22 229 80 243 245\n"" 23 241 229 227 242\n"" 24 34 50 35 51\n"" 25 9 33 35 34\n"" 26 103 122 121 206\n"" 27 257 260 259 440\n"" 28 142 318 163 144\n"" 29 446 443 444 451\n"" 30 272 251 252 274\n"" 31 193 199 176 198\n"" 32 165 149 147 166\n"" 33 447 3 8 449\n"" 34 29 208 209 30\n"" 35 300 285 286 299\n"" 36 100 104 119 105\n"" 37 39 44 40 41\n"" 38 315 318 313 316\n"" 39 422 417 421 419\n"" 40 382 273 264 383\n"" 41 145 143 150 146\n"" 42 406 268 405 404\n"" 43 427 411 426 428\n"" 44 323 290 308 311\n"" 45 232 18 230 227\n"" 46 243 79 80 240\n"" 47 391 412 390 389\n"" 48 360 423 107 362\n"" 49 389 71 393 392\n"" 50 142 162 163 145\n"" 51 245 247 261 80\n"" 52 376 373 375 92\n"" 53 324 352 325 362\n"" 54 119 104 106 105\n"" 55 165 149 166 151\n"" 56 428 389 411 442\n"" 57 366 351 331 352\n"" 58 166 318 316 163\n"" 59 368 281 280 350\n"" 60 315 168 313 166\n"" 61 417 422 423 419\n"" 62 279 203 205 453\n"" 63 80 243 245 226\n"" 64 416 41 420 45\n"" 65 319 330 317 335\n"" 66 15 442 225 224\n"" 67 116 131 117 129\n"" 68 335 318 337 319\n"" 69 188 197 193 198\n"" 70 326 314 325 313\n"" 71 313 315 314 325\n"" 72 451 3 449 450\n"" 73 451 449 452 450\n"" 74 299 286 300 301\n"" 75 450 1 3 2\n"" 76 107 103 120 149\n"" 77 76 82 81 79\n"" 78 81 83 218 214\n"" 79 14 10 2 11\n"" 80 22 436 437 23\n"" 81 318 144 316 163\n"" 82 420 426 425 412\n"" 83 450 14 11 445\n"" 84 262 254 429 274\n"" 85 443 442 441 444\n"" 86 356 353 364 363\n"" 87 102 122 206 101\n"" 88 315 168 325 313\n"" 89 281 331 280 350\n"" 90 107 155 120 104\n"" 91 443 426 444 451\n"" 92 123 118 354 113\n"" 93 84 220 86 83\n"" 94 268 406 405 269\n"" 95 287 293 289 286\n"" 96 17 16 443 13\n"" 97 315 168 166 325\n"" 98 283 296 297 284\n"" 99 333 144 336 160\n"" 100 450 13 1 2\n"" 101 414 423 418 419\n"" 102 331 352 324 362\n"" 103 144 315 333 316\n"" 104 21 442 16 15\n"" 105 45 72 91 69\n"" 106 437 208 21 433\n"" 107 288 310 290 306\n"" 108 213 217 214 31\n"" 109 335 327 328 341\n"" 110 109 67 48 111\n"" 111 316 314 315 312\n"" 112 45 60 91 44\n"" 113 128 118 115 116\n"" 114 423 45 38 448\n"" 115 155 362 166 325\n"" 116 130 136 132 133\n"" 117 92 72 89 91\n"" 118 145 143 142 150\n"" 119 153 140 163 142\n"" 120 317 313 312 319\n"" 121 347 118 126 354\n"" 122 148 165 147 143\n"" 123 170 157 171 173\n"" 124 78 50 74 240\n"" 125 381 273 385 378\n"" 126 337 330 335 317\n"" 127 267 273 379 268\n"" 128 80 247 261 250\n"" 129 80 225 261 245\n"" 130 80 442 261 225\n"" 131 211 24 212 20\n"" 132 398 395 399 371\n"" 133 390 389 377 391\n"" 134 308 292 290 291\n"" 135 176 191 177 199\n"" 136 318 166 313 163\n"" 137 23 16 436 17\n"" 138 354 353 325 326\n"" 139 423 362 366 279\n"" 140 415 400 375 403\n"" 141 217 239 216 213\n"" 142 377 89 88 90\n"" 143 10 12 13 9\n"" 144 155 325 113 112\n"" 145 151 164 165 150\n"" 146 113 118 128 123\n"" 147 95 97 99 96\n"" 148 449 3 8 5\n"" 149 61 99 97 64\n"" 150 223 83 222 82\n"" 151 37 38 6 39\n"" 152 0 7 6 37\n"" 153 385 430 247 250\n"" 154 108 109 110 107\n"" 155 415 401 417 403\n"" 156 102 121 122 101\n"" 157 120 107 149 156\n"" 158 104 100 119 120\n"" 159 3 4 2 5\n"" 160 207 21 224 437\n"" 161 270 273 408 430\n"" 162 80 247 226 245\n"" 163 80 228 81 243\n"" 164 43 107 48 38\n"" 165 354 340 344 341\n"" 166 312 316 313 317\n"" 167 435 275 277 439\n"" 168 27 30 29 28\n"" 169 52 76 31 240\n"" 170 338 339 163 318\n"" 171 47 43 42 48\n"" 172 61 96 59 58\n"" 173 428 389 442 261\n"" 174 194 171 192 174\n"" 175 318 339 341 338\n"" 176 417 422 416 423\n"" 177 123 124 125 128\n"" 178 113 108 115 155\n"" 179 300 285 299 298\n"" 180 320 160 189 333\n"" 181 443 35 1 13\n"" 182 96 46 44 61\n"" 183 316 314 313 315\n"" 184 119 107 155 106\n"" 185 357 325 356 361\n"" 186 224 15 21 20\n"" 187 319 336 337 317\n"" 188 306 287 307 302\n"" 189 143 141 140 144\n"" 190 366 423 279 367\n"" 191 74 73 88 89\n"" 192 447 7 8 3\n"" 193 449 8 447 5\n"" 194 436 21 22 437\n"" 195 92 72 91 45\n"" 196 153 140 142 135\n"" 197 206 121 103 149\n"" 198 35 69 389 71\n"" 199 165 168 167 166\n"" 200 12 1 13 9\n"" 201 361 112 113 325\n"" 202 195 175 193 194\n"" 203 292 304 322 321\n"" 204 337 336 144 338\n"" 205 399 372 400 371\n"" 206 332 336 334 333\n"" 207 111 68 67 48\n"" 208 389 391 393 72\n"" 209 196 179 188 195\n"" 210 104 119 155 120\n"" 211 168 166 325 155\n"" 212 112 108 113 155\n"" 213 449 425 451 452\n"" 214 220 214 83 221\n"" 215 261 246 245 225\n"" 216 93 44 46 92\n"" 217 80 255 226 247\n"" 218 384 262 247 430\n"" 219 336 144 319 337\n"" 220 144 315 316 166\n"" 221 332 336 333 316\n"" 222 175 191 194 192\n"" 223 362 353 325 363\n"" 224 110 113 115 114\n"" 225 400 370 374 402\n"" 226 319 337 335 317\n"" 227 430 262 247 248\n"" 228 324 362 315 331\n"" 229 80 228 235 81\n"" 230 347 342 126 348\n"" 231 295 283 296 297\n"" 232 306 304 305 308\n"" 233 356 353 325 354\n"" 234 21 23 437 433\n"" 235 195 174 194 178\n"" 236 192 175 177 173\n"" 237 302 287 303 286\n"" 238 208 211 26 209\n"" 239 118 128 115 113\n"" 240 351 366 369 352\n"" 241 342 344 340 343\n"" 242 118 347 123 354\n"" 243 354 168 163 313\n"" 244 356 325 363 361\n"" 245 282 321 294 304\n"" 246 268 379 267 404\n"" 247 296 305 284 283\n"" 248 290 304 308 291\n"" 249 316 318 313 319\n"" 250 143 160 147 161\n"" 251 149 201 122 147\n"" 252 38 448 45 6\n"" 253 92 415 417 94\n"" 254 225 224 261 440\n"" 255 198 185 184 186\n"" 256 7 205 447 8\n"" 257 368 351 350 367\n"" 258 74 13 12 35\n"" 259 190 147 161 158\n"" 260 270 429 262 407\n"" 261 3 4 450 2\n"" 262 15 443 442 16\n"" 263 193 188 195 196\n"" 264 342 347 340 344\n"" 265 391 393 45 416\n"" 266 92 415 94 375\n"" 267 61 60 91 58\n"" 268 60 72 69 91\n"" 269 289 283 305 291\n"" 270 96 44 93 92\n"" 271 324 362 325 315\n"" 272 13 2 14 10\n"" 273 62 63 61 64\n"" 274 144 166 160 315\n"" 275 417 423 416 94\n"" 276 449 4 450 3\n"" 277 450 13 443 1\n"" 278 352 364 365 369\n"" 279 7 448 205 6\n"" 280 225 440 261 263\n"" 281 116 155 119 118\n"" 282 2 4 450 11\n"" 283 416 377 92 89\n"" 284 376 403 415 375\n"" 285 417 376 415 92\n"" 286 416 377 89 391\n"" 287 249 262 246 256\n"" 288 336 317 316 330\n"" 289 47 43 48 38\n"" 290 354 168 313 113\n"" 291 115 168 118 113\n"" 292 34 50 51 33\n"" 293 166 169 167 165\n"" 294 319 316 317 313\n"" 295 318 144 337 319\n"" 296 354 325 313 326\n"" 297 30 436 433 431\n"" 298 289 283 291 284\n"" 299 58 91 96 59\n"" 300 185 182 183 197\n"" 301 224 438 276 437\n"" 302 15 442 80 225\n"" 303 111 110 112 109\n"" 304 52 76 240 51\n"" 305 208 26 30 29\n"" 306 7 449 3 447\n"" 307 296 294 283 295\n"" 308 306 291 289 305\n"" 309 338 140 141 144\n"" 310 331 352 351 324\n"" 311 322 281 333 320\n"" 312 83 81 76 82\n"" 313 384 262 274 255\n"" 314 60 45 91 69\n"" 315 15 20 19 16\n"" 316 197 188 193 196\n"" 317 80 229 225 245\n"" 318 18 233 227 232\n"" 319 344 345 343 342\n"" 320 417 414 94 415\n"" 321 443 16 441 442\n"" 322 177 199 187 176\n"" 323 149 206 121 453\n"" 324 350 279 331 280\n"" 325 181 188 196 179\n"" 326 102 121 101 103\n"" 327 347 357 354 356\n"" 328 338 327 318 337\n"" 329 337 330 334 335\n"" 330 319 336 317 316\n"" 331 193 175 188 176\n"" 332 164 143 162 165\n"" 333 120 104 100 103\n"" 334 376 416 92 417\n"" 335 113 325 155 168\n"" 336 416 376 92 391\n"" 337 420 45 41 393\n"" 338 249 262 248 246\n"" 339 147 189 161 160\n"" 340 18 231 224 233\n"" 341 71 45 70 41\n"" 342 126 341 135 339\n"" 343 21 23 22 437\n"" 344 148 165 143 151\n"" 345 337 327 318 335\n"" 346 354 318 313 163\n"" 347 115 118 155 116\n"" 348 341 340 338 339\n"" 349 166 168 313 163\n"" 350 166 318 313 315\n"" 351 48 68 67 47\n"" 352 150 162 145 152\n"" 353 140 339 137 163\n"" 354 199 185 187 176\n"" 355 333 144 316 336\n"" 356 338 327 337 341\n"" 357 389 70 72 393\n"" 358 331 366 350 351\n"" 359 94 45 92 44\n"" 360 9 33 12 35\n"" 361 126 139 137 138\n"" 362 321 295 282 294\n"" 363 135 140 136 137\n"" 364 153 162 163 152\n"" 365 325 362 363 361\n"" 366 80 235 226 81\n"" 367 74 377 89 88\n"" 368 13 14 450 443\n"" 369 157 172 158 171\n"" 370 450 443 14 445\n"" 371 155 107 120 156\n"" 372 135 339 163 137\n"" 373 365 325 352 362\n"" 374 153 140 135 163\n"" 375 448 206 205 6\n"" 376 137 141 139 339\n"" 377 103 107 120 104\n"" 378 448 425 447 452\n"" 379 165 162 168 163\n"" 380 76 83 79 87\n"" 381 420 45 393 416\n"" 382 334 329 330 336\n"" 383 89 45 92 416\n"" 384 181 195 179 196\n"" 385 420 448 41 416\n"" 386 438 277 435 275\n"" 387 400 399 402 403\n"" 388 304 296 283 305\n"" 389 170 158 190 161\n"" 390 387 386 388 250\n"" 391 54 218 217 53\n"" 392 311 304 308 322\n"" 393 149 281 201 189\n"" 394 211 24 209 212\n"" 395 166 333 149 147\n"" 396 426 424 420 425\n"" 397 394 376 401 416\n"" 398 147 159 122 158\n"" 399 202 203 201 453\n"" 400 280 203 279 453\n"" 401 135 126 339 137\n"" 402 449 4 3 5\n"" 403 14 2 450 11\n"" 404 126 125 127 347\n"" 405 423 413 38 414\n"" 406 185 198 188 176\n"" 407 144 163 142 162\n"" 408 201 122 204 453\n"" 409 447 425 451 449\n"" 410 290 289 306 291\n"" 411 35 69 71 49\n"" 412 207 224 211 231\n"" 413 135 154 163 118\n"" 414 126 118 341 354\n"" 415 191 175 194 193\n"" 416 436 16 437 17\n"" 417 420 422 416 421\n"" 418 135 142 153 145\n"" 419 15 443 16 13\n"" 420 440 275 259 224\n"" 421 416 421 422 417\n"" 422 442 275 440 224\n"" 423 347 340 354 126\n"" 424 254 256 253 274\n"" 425 34 50 33 35\n"" 426 176 191 175 177\n"" 427 433 278 434 277\n"" 428 175 191 192 177\n"" 429 101 206 102 204\n"" 430 132 135 136 130\n"" 431 49 35 50 36\n"" 432 353 356 325 363\n"" 433 435 277 433 434\n"" 434 224 275 276 438\n"" 435 212 230 18 19\n"" 436 143 150 148 151\n"" 437 235 228 243 234\n"" 438 29 22 26 30\n"" 439 125 347 349 123\n"" 440 237 234 235 236\n"" 441 144 336 319 316\n"" 442 165 316 166 144\n"" 443 142 318 338 163\n"" 444 137 141 140 139\n"" 445 447 279 205 448\n"" 446 106 116 108 155\n"" 447 217 238 239 215\n"" 448 16 17 443 441\n"" 449 407 262 270 430\n"" 450 88 74 389 77\n"" 451 78 79 80 81\n"" 452 126 138 134 342\n"" 453 165 150 143 151\n"" 454 409 430 387 250\n"" 455 128 118 116 131\n"" 456 339 126 340 342\n"" 457 173 192 171 170\n"" 458 400 376 403 373\n"" 459 15 18 212 224\n"" 460 37 49 36 35\n"" 461 81 82 83 214\n"" 462 173 157 171 172\n"" 463 220 214 219 83\n"" 464 114 113 128 123\n"" 465 366 423 367 418\n"" 466 379 273 378 406\n"" 467 30 436 23 433\n"" 468 23 432 28 436\n"" 469 147 144 160 143\n"" 470 79 243 31 240\n"" 471 33 74 50 240\n"" 472 342 348 345 126\n"" 473 94 416 417 92\n"" 474 416 377 391 92\n"" 475 147 158 149 157\n"" 476 273 274 384 430\n"" 477 203 281 201 453\n"" 478 243 235 245 226\n"" 479 18 229 227 225\n"" 480 45 72 69 70\n"" 481 189 149 147 201\n"" 482 175 195 193 188\n"" 483 362 107 155 166\n"" 484 185 199 198 176\n"" 485 331 166 333 149\n"" 486 31 76 81 79\n"" 487 323 290 310 308\n"" 488 43 107 104 48\n"" 489 436 16 21 437\n"" 490 368 279 350 280\n"" 491 424 416 423 448\n"" 492 150 142 164 143\n"" 493 258 248 246 249\n"" 494 381 383 385 273\n"" 495 73 49 72 74\n"" 496 117 106 119 116\n"" 497 74 377 88 389\n"" 498 408 273 387 384\n"" 499 191 170 173 190\n"" 500 199 177 200 191\n"" 501 13 80 74 12\n"" 502 130 135 128 131\n"" 503 92 90 89 377\n"" 504 84 219 83 86\n"" 505 408 378 273 406\n"" 506 386 384 80 385\n"" 507 392 426 389 420\n"" 508 80 79 243 81\n"" 509 158 177 173 190\n"" 510 377 72 89 391\n"" 511 394 376 416 391\n"" 512 442 224 440 261\n"" 513 130 131 129 132\n"" 514 95 63 61 59\n"" 515 252 274 253 272\n"" 516 273 274 272 384\n"" 517 225 263 246 257\n"" 518 76 52 31 53\n"" 519 243 79 31 81\n"" 520 448 420 424 416\n"" 521 347 358 349 123\n"" 522 138 137 126 133\n"" 523 368 279 367 350\n"" 524 38 360 413 423\n"" 525 165 168 166 163\n"" 526 207 211 26 208\n"" 527 54 217 32 228\n"" 528 125 347 348 349\n"" 529 118 347 128 123\n"" 530 423 94 45 416\n"" 531 250 389 428 261\n"" 532 119 116 118 117\n"" 533 358 113 347 357\n"" 534 168 164 165 169\n"" 535 242 235 243 234\n"" 536 354 318 341 327\n"" 537 226 247 255 245\n"" 538 377 72 389 74\n"" 539 168 354 163 118\n"" 540 163 316 166 165\n"" 541 145 163 142 153\n"" 542 262 80 247 255\n"" 543 281 304 292 321\n"" 544 12 1 9 35\n"" 545 392 426 420 412\n"" 546 51 79 76 240\n"" 547 274 270 273 272\n"" 548 270 274 273 430\n"" 549 329 331 332 324\n"" 550 325 313 168 113\n"" 551 306 304 308 290\n"" 552 71 35 49 41\n"" 553 348 346 342 345\n"" 554 270 262 274 430\n"" 555 353 363 365 364\n"" 556 29 22 30 27\n"" 557 447 425 424 451\n"" 558 53 31 217 54\n"" 559 194 171 175 192\n"" 560 29 25 209 210\n"" 561 123 358 349 113\n"" 562 80 385 384 247\n"" 563 204 202 201 453\n"" 564 259 225 440 224\n"" 565 128 347 125 123\n"" 566 111 68 48 413\n"" 567 48 68 47 414\n"" 568 415 68 414 94\n"" 569 437 208 207 21\n"" 570 424 1 3 451\n"" 571 447 452 449 448\n"" 572 389 390 377 88\n"" 573 158 170 190 173\n"" 574 169 165 168 167\n"" 575 155 154 119 118\n"" 576 115 168 155 118\n"" 577 354 168 113 118\n"" 578 147 201 161 189\n"" 579 115 168 113 155\n"" 580 168 166 155 167\n"" 581 259 225 257 440\n"" 582 263 247 261 246\n"" 583 281 279 201 453\n"" 584 128 135 136 126\n"" 585 275 260 439 440\n"" 586 66 63 65 64\n"" 587 277 438 276 275\n"" 588 163 339 341 318\n"" 589 325 314 324 315\n"" 590 338 327 341 318\n"" 591 319 327 328 335\n"" 592 391 45 89 416\n"" 593 203 281 280 202\n"" 594 362 423 206 279\n"" 595 239 237 213 238\n"" 596 362 353 365 325\n"" 597 80 235 243 226\n"" 598 80 228 243 235\n"" 599 15 21 20 16\n"" 600 31 214 81 53\n"" 601 227 244 233 225\n"" 602 442 21 224 15\n"" 603 284 293 298 285\n"" 604 233 18 227 225\n"" 605 18 233 224 225\n"" 606 205 203 204 453\n"" 607 163 154 168 118\n"" 608 208 21 433 26\n"" 609 443 389 442 444\n"" 610 27 23 30 28\n"" 611 54 218 56 217\n"" 612 391 412 389 393\n"" 613 9 13 10 1\n"" 614 61 44 96 91\n"" 615 316 314 312 313\n"" 616 416 376 401 417\n"" 617 116 108 155 115\n"" 618 106 107 155 108\n"" 619 442 389 411 426\n"" 620 164 142 162 143\n"" 621 321 294 322 295\n"" 622 144 165 143 147\n"" 623 357 325 313 354\n"" 624 389 35 41 426\n"" 625 448 7 205 447\n"" 626 227 244 229 241\n"" 627 206 38 103 102\n"" 628 206 448 205 279\n"" 629 10 4 2 11\n"" 630 246 256 245 255\n"" 631 37 49 35 41\n"" 632 128 127 124 125\n"" 633 126 138 133 134\n"" 634 312 318 319 313\n"" 635 81 235 226 213\n"" 636 213 228 235 234\n"" 637 228 81 243 31\n"" 638 81 228 235 213\n"" 639 317 336 337 330\n"" 640 330 336 337 334\n"" 641 316 330 317 329\n"" 642 319 330 335 328\n"" 643 231 18 232 233\n"" 644 18 231 232 230\n"" 645 17 437 436 441\n"" 646 287 307 302 303\n"" 647 287 306 307 288\n"" 648 303 288 287 307\n"" 649 323 320 333 311\n"" 650 393 420 416 392\n"" 651 79 51 76 75\n"" 652 336 329 316 332\n"" 653 213 236 234 237\n"" 654 76 31 81 53\n"" 655 45 72 391 89\n"" 656 31 76 79 240\n"" 657 395 372 397 399\n"" 658 393 45 41 70\n"" 659 45 416 94 92\n"" 660 211 21 224 207\n"" 661 376 417 415 401\n"" 662 262 254 274 256\n"" 663 320 304 292 311\n"" 664 1 10 9 2\n"" 665 162 165 168 164\n"" 666 385 247 80 250\n"" 667 371 400 370 372\n"" 668 384 247 385 430\n"" 669 128 130 131 129\n"" 670 443 13 442 80\n"" 671 284 293 289 305\n"" 672 448 206 6 423\n"" 673 360 107 109 362\n"" 674 112 360 359 111\n"" 675 287 305 306 289\n"" 676 362 325 112 361\n"" 677 362 166 325 315\n"" 678 437 17 16 441\n"" 679 438 277 276 433\n"" 680 200 189 190 201\n"" 681 416 422 424 423\n"" 682 320 292 281 189\n"" 683 110 108 113 112\n"" 684 108 110 113 115\n"" 685 144 318 316 319\n"" 686 250 386 389 80\n"" 687 166 318 315 316\n"" 688 63 62 59 58\n"" 689 319 327 335 318\n"" 690 337 327 335 341\n"" 691 1 450 3 451\n"" 692 239 237 236 213\n"" 693 21 442 437 16\n"" 694 450 443 445 451\n"" 695 14 13 450 2\n"" 696 39 44 42 40\n"" 697 363 357 356 361\n"" 698 350 366 367 351\n"" 699 331 366 362 279\n"" 700 368 366 369 351\n"" 701 47 43 38 42\n"" 702 140 339 163 338\n"" 703 289 285 293 284\n"" 704 339 141 338 140\n"" 705 137 141 339 140\n"" 706 234 216 213 32\n"" 707 273 408 430 384\n"" 708 273 270 408 269\n"" 709 84 220 83 85\n"" 710 158 170 157 161\n"" 711 255 262 274 256\n"" 712 304 282 283 294\n"" 713 83 218 219 87\n"" 714 377 72 74 89\n"" 715 206 205 204 453\n"" 716 446 443 451 445\n"" 717 304 292 322 320\n"" 718 155 362 112 107\n"" 719 292 283 304 282\n"" 720 443 1 426 451\n"" 721 149 362 166 107\n"" 722 272 271 274 270\n"" 723 306 287 289 288\n"" 724 366 331 350 279\n"" 725 331 366 352 362\n"" 726 61 95 96 97\n"" 727 224 442 275 438\n"" 728 273 387 384 385\n"" 729 262 271 429 270\n"" 730 185 182 197 184\n"" 731 153 162 145 163\n"" 732 74 443 35 426\n"" 733 41 389 426 420\n"" 734 40 47 46 44\n"" 735 262 246 247 248\n"" 736 1 37 3 0\n"" 737 433 432 431 436\n"" 738 23 432 436 30\n"" 739 67 360 413 111\n"" 740 109 360 112 111\n"" 741 361 360 112 362\n"" 742 246 258 249 257\n"" 743 87 218 219 55\n"" 744 151 149 166 156\n"" 745 165 149 151 148\n"" 746 149 165 147 148\n"" 747 155 154 118 168\n"" 748 217 214 218 215\n"" 749 31 214 53 217\n"" 750 291 304 283 305\n"" 751 23 16 22 436\n"" 752 143 162 165 144\n"" 753 103 102 100 101\n"" 754 195 175 179 188\n"" 755 182 196 197 180\n"" 756 400 376 375 403\n"" 757 149 281 189 331\n"" 758 146 143 150 148\n"" 759 150 146 152 145\n"" 760 168 162 164 169\n"" 761 262 384 274 430\n"" 762 54 218 53 56\n"" 763 125 127 347 128\n"" 764 304 306 291 290\n"" 765 262 80 384 247\n"" 766 153 162 152 145\n"" 767 150 162 152 164\n"" 768 168 162 169 163\n"" 769 262 80 255 384\n"" 770 38 68 414 47\n"" 771 423 206 38 107\n"" 772 46 68 94 47\n"" 773 385 430 250 387\n"" 774 413 68 48 414\n"" 775 46 68 93 94\n"" 776 41 416 448 45\n"" 777 111 68 413 67\n"" 778 77 88 74 73\n"" 779 393 41 420 392\n"" 780 274 256 253 255\n"" 781 26 23 433 30\n"" 782 218 217 53 214\n"" 783 231 212 18 224\n"" 784 446 426 444 427\n"" 785 113 114 128 115\n"" 786 128 114 123 124\n"" 787 285 289 293 286\n"" 788 301 285 299 286\n"" 789 300 285 298 286\n"" 790 297 285 298 299\n"" 791 26 23 30 22\n"" 792 44 38 94 45\n"" 793 187 158 159 177\n"" 794 218 76 81 53\n"" 795 162 143 142 144\n"" 796 397 373 400 372\n"" 797 164 142 145 162\n"" 798 128 135 126 118\n"" 799 289 283 284 305\n"" 800 282 189 281 292\n"" 801 200 186 187 199\n"" 802 21 24 211 20\n"" 803 11 13 14 10\n"" 804 2 13 1 10\n"" 805 72 377 389 391\n"" 806 74 72 73 89\n"" 807 92 72 45 89\n"" 808 413 366 418 362\n"" 809 281 304 282 292\n"" 810 429 251 274 254\n"" 811 438 439 275 435\n"" 812 37 424 1 3\n"" 813 202 189 201 281\n"" 814 333 189 320 281\n"" 815 94 38 68 423\n"" 816 389 261 250 80\n"" 817 242 241 235 234\n"" 818 364 366 365 369\n"" 819 302 305 306 287\n"" 820 362 366 352 365\n"" 821 350 366 279 367\n"" 822 368 366 351 367\n"" 823 191 176 175 193\n"" 824 173 191 177 192\n"" 825 103 121 101 100\n"" 826 176 191 199 193\n"" 827 191 177 200 190\n"" 828 275 442 439 438\n"" 829 275 442 440 439\n"" 830 224 442 225 261\n"" 831 442 224 437 438\n"" 832 258 246 263 257\n"" 833 386 384 385 383\n"" 834 149 333 331 189\n"" 835 318 326 327 354\n"" 836 207 437 224 276\n"" 837 56 76 218 53\n"" 838 350 333 322 281\n"" 839 37 38 45 6\n"" 840 232 244 227 241\n"" 841 423 206 6 38\n"" 842 411 386 250 410\n"" 843 224 229 18 225\n"" 844 6 423 38 448\n"" 845 218 57 219 55\n"" 846 68 423 38 414\n"" 847 377 376 391 92\n"" 848 415 376 375 92\n"" 849 103 121 100 120\n"" 850 101 121 122 100\n"" 851 102 121 103 122\n"" 852 7 206 6 205\n"" 853 38 206 6 102\n"" 854 107 38 103 206\n"" 855 448 206 423 279\n"" 856 298 305 284 296\n"" 857 30 432 436 431\n"" 858 23 432 30 28\n"" 859 119 107 104 155\n"" 860 142 337 318 144\n"" 861 107 103 43 104\n"" 862 426 424 425 451\n"" 863 107 156 155 166\n"" 864 119 107 106 104\n"" 865 156 107 149 166\n"" 866 103 107 43 38\n"" 867 103 122 206 102\n"" 868 448 41 45 37\n"" 869 423 416 45 448\n"" 870 81 228 213 31\n"" 871 217 239 213 215\n"" 872 403 376 415 401\n"" 873 443 74 80 389\n"" 874 135 163 341 118\n"" 875 133 126 136 137\n"" 876 228 216 213 217\n"" 877 447 451 7 449\n"" 878 71 41 393 392\n"" 879 282 321 304 281\n"" 880 95 63 99 61\n"" 881 185 197 183 188\n"" 882 433 23 437 436\n"" 883 212 24 210 19\n"" 884 257 260 440 258\n"" 885 184 197 185 198\n"" 886 175 178 195 179\n"" 887 61 60 58 44\n"" 888 362 363 361 365\n"" 889 447 451 424 7\n"" 890 132 135 130 131\n"" 891 61 91 96 58\n"" 892 385 430 387 384\n"" 893 127 133 130 126\n"" 894 80 274 226 255\n"" 895 80 274 255 384\n"" 896 219 87 86 84\n"" 897 275 259 224 276\n"" 898 18 229 15 227\n"" 899 320 304 311 322\n"" 900 23 21 26 433\n"" 901 109 38 48 107\n"" 902 342 139 126 138\n"" 903 21 23 26 22\n"" 904 426 428 444 427\n"" 905 331 166 362 315\n"" 906 122 206 204 453\n"" 907 12 1 35 13\n"" 908 189 331 281 333\n"" 909 35 9 34 1\n"" 910 426 412 389 411\n"" 911 287 305 289 293\n"" 912 320 160 333 336\n"" 913 0 35 37 36\n"" 914 262 255 247 256\n"" 915 353 352 325 324\n"" 916 336 329 330 316\n"" 917 275 260 440 259\n"" 918 16 442 437 441\n"" 919 380 378 273 381\n"" 920 7 424 447 448\n"" 921 400 376 373 375\n"" 922 222 223 214 83\n"" 923 30 22 23 27\n"" 924 262 271 274 429\n"" 925 45 44 37 41\n"" 926 380 265 382 273\n"" 927 149 333 189 147\n"" 928 242 245 229 243\n"" 929 131 135 128 118\n"" 930 245 256 247 255\n"" 931 391 412 393 394\n"" 932 99 61 97 95\n"" 933 281 203 280 453\n"" 934 350 333 331 322\n"" 935 41 71 393 70\n"" 936 398 400 399 402\n"" 937 323 309 308 310\n"" 938 37 3 0 7\n"" 939 72 393 45 391\n"" 940 408 270 430 407\n"" 941 40 47 44 42\n"" 942 298 305 293 284\n"" 943 250 385 386 80\n"" 944 266 379 273 380\n"" 945 191 170 192 173\n"" 946 364 354 356 355\n"" 947 200 186 159 187\n"" 948 159 147 190 158\n"" 949 229 244 225 245\n"" 950 427 250 411 428\n"" 951 342 347 126 340\n"" 952 13 80 12 15\n"" 953 342 346 347 344\n"" 954 268 273 379 406\n"" 955 352 365 366 369\n"" 956 78 50 240 51\n"" 957 322 321 304 294\n"" 958 183 180 196 182\n"" 959 266 379 267 273\n"" 960 58 59 60 91\n"" 961 405 273 269 406\n"" 962 84 220 85 86\n"" 963 81 82 214 223\n"" 964 21 24 26 211\n"" 965 87 219 86 57\n"" 966 442 411 428 426\n"" 967 35 443 1 426\n"" 968 47 44 94 46\n"" 969 357 325 113 313\n"" 970 313 357 354 113\n"" 971 31 217 228 213\n"" 972 99 61 66 64\n"" 973 144 166 147 160\n"" 974 298 284 285 297\n"" 975 398 400 371 399\n"" 976 51 78 50 79\n"" 977 298 284 297 296\n"" 978 7 451 3 449\n"" 979 281 279 280 331\n"" 980 158 177 190 159\n"" 981 117 106 105 119\n"" 982 278 276 277 433\n"" 983 200 122 201 177\n"" 984 72 35 389 74\n"" 985 54 228 31 217\n"" 986 379 406 378 404\n"" 987 347 127 126 128\n"" 988 109 362 112 360\n"" 989 126 339 340 341\n"" 990 142 338 140 163\n"" 991 38 44 47 42\n"" 992 150 142 145 164\n"" 993 426 424 451 420\n"" 994 431 208 433 30\n"" 995 437 207 433 276\n"" 996 135 154 153 163\n"" 997 163 341 354 318\n"" 998 443 13 74 35\n"" 999 143 142 144 140\n"" 1000 320 322 323 333\n"" 1001 122 147 158 149\n"" 1002 112 359 361 113\n"" 1003 359 112 361 360\n"" 1004 149 121 201 453\n"" 1005 361 358 113 359\n"" 1006 361 113 357 325\n"" 1007 113 359 358 112\n"" 1008 409 388 410 250\n"" 1009 71 69 389 70\n"" 1010 430 409 387 408\n"" 1011 32 217 216 228\n"" 1012 400 374 372 373\n"" 1013 419 422 423 421\n"" 1014 51 78 79 240\n"" 1015 387 386 250 385\n"" 1016 48 360 109 111\n"" 1017 438 277 433 435\n"" 1018 316 331 329 315\n"" 1019 74 50 49 35\n"" 1020 302 305 287 293\n"" 1021 287 293 286 302\n"" 1022 258 440 257 263\n"" 1023 188 183 181 196\n"" 1024 1 426 41 35\n"" 1025 236 216 213 234\n"" 1026 292 283 291 304\n"" 1027 381 383 273 382\n"" 1028 50 15 33 35\n"" 1029 79 240 78 80\n"" 1030 177 122 201 190\n"" 1031 307 308 309 310\n"" 1032 229 240 33 243\n"" 1033 200 187 177 199\n"" 1034 31 214 213 81\n"" 1035 128 133 126 136\n"" 1036 37 424 448 41\n"" 1037 263 247 246 248\n"" 1038 444 389 442 426\n"" 1039 423 417 414 94\n"" 1040 177 190 191 173\n"" 1041 417 419 415 421\n"" 1042 300 293 302 286\n"" 1043 442 13 15 80\n"" 1044 121 103 149 120\n"" 1045 136 126 135 137\n"" 1046 201 122 121 149\n"" 1047 331 316 333 315\n"" 1048 18 19 15 212\n"" 1049 38 45 423 94\n"" 1050 113 347 354 123\n"" 1051 273 405 269 408\n"" 1052 26 208 30 433\n"" 1053 431 208 278 433\n"" 1054 429 251 271 274\n"" 1055 109 38 360 48\n"" 1056 400 398 371 370\n"" 1057 174 173 175 171\n"" 1058 149 362 107 206\n"" 1059 245 242 229 244\n"" 1060 417 423 414 419\n"" 1061 185 199 186 198\n"" 1062 158 170 173 157\n"" 1063 177 122 190 159\n"" 1064 308 292 311 290\n"" 1065 380 378 379 273\n"" 1066 218 81 214 53\n"" 1067 232 244 233 227\n"" 1068 72 49 35 74\n"" 1069 235 245 226 244\n"" 1070 234 243 242 228\n"" 1071 316 331 332 329\n"" 1072 451 41 424 1\n"" 1073 362 353 363 365\n"" 1074 224 20 21 211\n"" 1075 258 248 263 246\n"" 1076 393 389 392 412\n"" 1077 212 15 224 20\n"" 1078 342 346 344 345\n"" 1079 229 74 240 80\n"" 1080 302 301 300 286\n"" 1081 203 202 204 453\n"" 1082 216 234 236 32\n"" 1083 386 388 410 411\n"" 1084 144 163 165 316\n"" 1085 347 344 346 356\n"" 1086 21 442 224 437\n"" 1087 190 122 201 147\n"" 1088 6 424 7 448\n"" 1089 269 270 408 407\n"" 1090 126 125 347 348\n"" 1091 37 44 45 38\n"" 1092 393 72 45 70\n"" 1093 413 423 418 414\n"" 1094 31 32 54 53\n"" 1095 29 22 27 26\n"" 1096 403 376 401 402\n"" 1097 83 220 221 85\n"" 1098 433 207 278 276\n"" 1099 218 57 55 56\n"" 1100 155 116 119 106\n"" 1101 173 175 171 192\n"" 1102 244 225 245 233\n"" 1103 158 173 172 157\n"" 1104 281 203 201 202\n"" 1105 344 354 356 347\n"" 1106 315 144 333 160\n"" 1107 392 426 412 389\n"" 1108 87 83 79 84\n"" 1109 347 358 357 349\n"" 1110 342 139 339 126\n"" 1111 126 341 340 354\n"" 1112 37 424 3 7\n"" 1113 210 29 25 26\n"" 1114 261 389 442 80\n"" 1115 107 112 155 108\n"" 1116 389 250 428 411\n"" 1117 80 12 15 74\n"" 1118 380 265 273 266\n"" 1119 190 122 147 159\n"" 1120 142 338 144 140\n"" 1121 109 362 107 112\n"" 1122 362 423 366 418\n"" 1123 97 66 98 64\n"" 1124 300 293 286 298\n"" 1125 130 136 133 128\n"" 1126 389 77 80 386\n"" 1127 142 337 338 318\n"" 1128 56 76 55 218\n"" 1129 214 82 83 223\n"" 1130 246 261 263 225\n"" 1131 35 12 15 33\n"" 1132 420 1 451 426\n"" 1133 63 99 61 66\n"" 1134 96 44 92 91\n"" 1135 219 214 218 83\n"" 1136 323 308 309 322\n"" 1137 224 229 225 15\n"" 1138 38 413 48 414\n"" 1139 281 149 279 331\n"" 1140 183 188 197 196\n"" 1141 180 195 181 196\n"" 1142 50 15 35 74\n"" 1143 113 347 357 354\n"" 1144 331 166 315 333\n"" 1145 19 15 212 20\n"" 1146 69 389 70 72\n"" 1147 216 236 213 239\n"" 1148 6 424 448 37\n"" 1149 74 229 33 15\n"" 1150 185 199 187 186\n"" 1151 71 389 41 392\n"" 1152 195 174 175 194\n"" 1153 398 400 402 370\n"" 1154 282 283 294 295\n"" 1155 244 227 229 225\n"" 1156 308 310 306 290\n"" 1157 288 310 306 307\n"" 1158 307 308 310 306\n"" 1159 251 274 254 252\n"" 1160 55 219 87 57\n"" 1161 64 63 65 62\n"" 1162 15 13 16 12\n"" 1163 190 201 189 161\n"" 1164 316 331 333 332\n"" 1165 329 331 324 315\n"" 1166 364 354 353 356\n"" 1167 166 144 147 165\n"" 1168 334 329 336 332\n"" 1169 420 422 424 416\n"" 1170 350 333 281 331\n"" 1171 322 292 321 281\n"" 1172 209 24 210 212\n"" 1173 424 37 1 41\n"" 1174 269 407 408 405\n"" 1175 429 430 407 408\n"" 1176 15 443 13 442\n"" 1177 214 221 222 83\n"" 1178 13 17 16 14\n"" 1179 333 166 315 160\n"" 1180 224 20 211 212\n"" 1181 122 201 121 453\n"" 1182 246 247 245 256\n"" 1183 391 393 416 394\n"" 1184 37 44 38 39\n"" 1185 344 354 355 356\n"" 1186 189 147 333 160\n"" 1187 437 208 433 207\n"" 1188 181 195 178 179\n"" 1189 403 376 402 373\n"" 1190 183 180 181 196\n"" 1191 433 276 438 437\n"" 1192 380 273 382 381\n"" 1193 209 24 26 210\n"" 1194 379 406 404 268\n"" 1195 7 451 424 3\n"" 1196 400 402 373 403\n"" 1197 21 207 211 26\n"" 1198 451 41 1 420\n"" 1199 201 149 279 281\n"" 1200 347 344 354 340\n"" 1201 419 417 415 414\n"" 1202 344 345 346 343\n"" 1203 79 83 76 82\n"" 1204 128 133 130 127\n"" 1205 6 424 37 7\n"" 1206 190 147 201 161\n"" 1207 87 218 55 83\n"" 1208 39 44 41 37\n"" 1209 245 242 235 243\n"" 1210 389 41 392 420\n"" 1211 24 212 20 19\n"" 1212 451 41 420 424\n"" 1213 78 75 50 79\n"" 1214 440 257 263 225\n"" 1215 81 83 76 218\n"" 1216 385 378 387 381\n"" 1217 430 387 384 408\n"" 1218 329 315 324 316\n"" 1219 281 280 279 453\n"" 1220 279 205 206 453\n"" 1221 253 254 274 252\n"" 1222 325 357 356 354\n"" 1223 443 17 13 14\n"" 1224 322 292 281 320\n"" 1225 399 372 397 400\n"" 1226 56 76 53 55\n"" 1227 212 231 18 230\n"" 1228 24 26 211 209\n"" 1229 420 1 426 41\n"" 1230 182 196 183 197\n"" 1231 229 74 80 15\n"" 1232 118 347 126 128\n"" 1233 180 195 178 181\n"" 1234 361 358 357 113\n"" 1235 239 213 215 238\n"" 1236 224 229 15 18\n"" 1237 423 68 94 414\n"" 1238 6 45 37 448\n"" 1239 48 360 111 413\n"" 1240 302 301 286 303\n"" 1241 35 41 1 37\n"" 1242 431 278 434 433\n"" 1243 145 164 162 150\n"" 1244 174 173 171 172\n"" 1245 423 279 367 448\n"" 1246 362 423 107 206\n"" 1247 272 271 251 274\n"" 1248 273 385 378 387\n"" 1249 200 122 177 159\n"" 1250 452 425 447 449\n"" 1251 210 29 26 209\n"" 1252 130 135 136 128\n"" 1253 234 213 237 235\n"" 1254 216 54 217 32\n"" 1255 402 373 376 374\n"" 1256 164 143 165 150\n"" 1257 427 250 410 411\n"" 1258 386 388 250 410\n"" 1259 96 61 59 95\n"" 1260 159 200 187 177\n"" 1261 389 443 442 80\n"" 1262 398 395 396 399\n"" 1263 87 83 55 76\n"" 1264 389 77 74 80\n"" 1265 229 15 80 225\n"" 1266 207 433 278 208\n"" 1267 96 59 91 95\n"" 1268 341 126 135 118\n"" 1269 62 61 59 58\n"" 1270 206 149 279 453\n"" 1271 400 370 372 374\n"" 1272 389 35 426 74\n"" 1273 360 423 362 413\n"" 1274 54 228 32 31\n"" 1275 109 38 107 360\n"" 1276 87 83 84 219\n"" 1277 72 35 69 389\n"" 1278 246 262 247 256\n"" 1279 352 364 353 365\n"" 1280 268 273 406 269\n"" 1281 443 74 13 80\n"" 1282 242 244 241 229\n"" 1283 149 279 362 206\n"" 1284 99 64 66 97\n"" 1285 376 373 92 374\n"" 1286 26 29 25 27\n"" 1287 32 213 228 216\n"" 1288 118 163 341 354\n"" 1289 161 158 147 157\n"" 1290 61 60 44 91\n"" 1291 292 308 304 291\n"" 1292 163 144 165 162\n"" 1293 407 262 430 429\n"" 1294 63 62 61 59\n"" 1295 153 163 154 168\n"" 1296 350 281 322 321\n"" 1297 262 271 270 274\n"" 1298 442 426 428 444\n"" 1299 38 44 42 39\n"" 1300 80 240 229 243\n"" 1301 194 171 174 175\n"" 1302 155 362 325 112\n"" 1303 306 304 291 305\n"" 1304 77 78 74 80\n"" 1305 80 74 240 78\n"" 1306 38 44 94 47\n"" 1307 273 405 408 406\n"" 1308 293 298 285 286\n"" 1309 88 389 390 77\n"" 1310 311 304 292 308\n"" 1311 99 66 98 97\n"" 1312 26 210 24 25\n"" 1313 259 224 276 207\n"" 1314 61 62 64 58\n"" 1315 244 242 235 245\n"" 1316 244 241 235 242\n"" 1317 63 61 64 66\n"" 1318 149 201 279 453\n"" 1319 206 122 121 453\n"" 1320 413 366 362 365\n"" 1321 409 388 250 387\n"" 1322 423 362 413 418\n"" 1323 38 414 48 47\n"" 1324 38 360 423 107\n"" 1325 290 289 288 306\n"" 1326 333 322 323 331\n"" 1327 389 443 74 426\n"" 1328 35 71 389 41\n"" 1329 279 149 362 331\n"" 1330 74 12 15 35\n"" 1331 424 423 422 448\n"" 1332 190 201 177 200\n"" 1333 365 325 353 352\n"" 1334 385 383 384 273\n"" 1335 331 322 321 350\n"" 1336 71 70 389 393\n"" 1337 126 139 339 137\n"" 1338 44 45 92 91\n"" 1339 72 49 69 35\n"" 1340 175 178 174 195\n"" 1341 247 246 245 261\n"" 1342 41 424 448 420\n"" 1343 46 92 44 94\n"" 1344 402 400 373 374\n"" 1345 198 197 185 188\n"" 1346 304 296 294 283\n"" 1347 116 131 129 128\n"" 1348 50 15 74 33\n"" 1349 110 108 112 109\n"" 1350 448 425 424 447\n"" 1351 166 331 362 149\n"" 1352 206 149 103 107\n"" 1353 209 26 208 29\n"" 1354 211 231 224 212\n"" 1355 33 50 51 240\n"" 1356 32 213 234 228\n"" 1357 444 389 426 443\n"" 1358 107 112 108 109\n"" 1359 217 213 214 215\n"" 1360 16 22 436 21\n"" 1361 142 337 144 338\n"" 1362 323 311 322 320\n"" 1363 411 386 389 250\n"" 1364 265 273 264 382\n"" 1365 211 230 231 212\n"" 1366 295 296 294 297\n"" 1367 0 35 1 37\n"" 1368 229 74 33 240\n"" 1369 131 118 116 117\n"" 1370 122 204 101 201\n"" 1371 206 122 204 101\n"" 1372 83 220 86 219\n"" 1373 113 358 347 123\n""# Generated by tetgen -YY bunny.smesh \n"); } diff --git a/Demos/SoftDemo/cube.inl b/Demos/SoftDemo/cube.inl index ed92d4924..7015a23e6 100755 --- a/Demos/SoftDemo/cube.inl +++ b/Demos/SoftDemo/cube.inl @@ -1,4 +1,4 @@ -static const char* getNodes() { return( -"400 3 0 0\n"" 0 1 1 -1\n"" 1 1 -1 -1\n"" 2 -1 -1 -1\n"" 3 1 1 1\n"" 4 -1 -1 1\n"" 5 -1 1 -1\n"" 6 1 -1 1\n"" 7 -1 1 1\n"" 8 -1 -1 -0.000116\n"" 9 0.00039500000000000006 -1 1\n"" 10 1 -1 -0.00065799999999999995\n"" 11 1 0.00061700000000000004 -1\n"" 12 0.00098999999999999999 1 -1\n"" 13 -1 1 0.00045400000000000008\n"" 14 0.00052800000000008396 1 1\n"" 15 1 1 -0.00038699999999991519\n"" 16 -1 -5.9999999999504894e-006 1\n"" 17 -1 0.00021000000000004349 -1\n"" 18 1 0.00067400000000006344 1\n"" 19 1.0863393114549872e-007 3.0682525964387253e-008 1\n"" 20 0.00097299999999989062 -1 -1\n"" 21 -1.4065544284846965e-008 1 5.0429866114086973e-008\n"" 22 1 -7.0792689266241382e-008 -4.4728299621228391e-008\n"" 23 8.4069120565846353e-008 3.8392827594879719e-007 -1\n"" 24 1 0.49980668112692161 -0.4996917965899465\n"" 25 1 0.50006700000000004 -1\n"" 26 1 1 -0.50034809999999996\n"" 27 1 1 0.50025040000000009\n"" 28 0.50020930000000008 1 1\n"" 29 -1 0.50010129999999997 1\n"" 30 -0.49958379999999991 1 1\n"" 31 -1 9.2038384777827427e-008 -1.100605984127867e-008\n"" 32 -0.5001201999999999 -1 1\n"" 33 1.0486788869007099e-007 -1 -3.3620911388254626e-008\n"" 34 -1 -1 0.50008699999999995\n"" 35 1 -0.50010220000000005 -1\n"" 36 1 -1 -0.49985400000000002\n"" 37 1 -0.4996526 1\n"" 38 1 -1 0.49990490000000004\n"" 39 -0.49930649999999999 1 -1\n"" 40 -1 1 -0.50002420000000003\n"" 41 1 -0.24974260000000004 -0.50015432157969908\n"" 42 0.50015422769290296 -0.24974260000000001 -1\n"" 43 0.50009680402228707 1 0.24993170000000009\n"" 44 1 0.50009675187018254 0.24993170000000009\n"" 45 0.24987467313200107 0.24987468273492527 -0.24987454967853764\n"" 46 0.50006970000000006 1 -1\n"" 47 -1 1 0.50062509999999982\n"" 48 -0.24952789999999991 1 0.50013191885453001\n"" 49 -0.24952789999999991 0.50013187836130635 1\n"" 50 -1 -0.50000239999999996 -1\n"" 51 -0.49917350000000005 -1 -1\n"" 52 -1 -0.37500110896930483 0.49999770999384097\n"" 53 -0.49999768418870116 -0.37500109958532857 1\n"" 54 0.50016842960649455 -0.24948929999999997 1\n"" 55 1 -0.24948929999999997 0.50016837821653382\n"" 56 -1 0.50011355427218929 -0.24978510000000004\n"" 57 -0.50011349993113807 1 -0.24978510000000009\n"" 58 0.49983560886453382 -1 -0.25025600000000003\n"" 59 1 -0.24959280000000006 -1\n"" 60 0.46861653427920624 0.31279234072878337 -1\n"" 61 0.46874721181012263 1 -0.31263609558485356\n"" 62 1 1 0.24986720000000007\n"" 63 1 0.50004500000000007 1\n"" 64 0.41666006216462159 0.41668749191836219 1\n"" 65 1 0.62492318088559184 0.62497446433589154\n"" 66 0.62493687874554793 1 0.62494713479954256\n"" 67 -0.32510780807963724 -0.32510780489834346 -0.32510793388507692\n"" 68 1 0.12495484505171366 -0.3748231366627352\n"" 69 -0.24915825000000003 0.50024732783000192 -1\n"" 70 1 0.74957571448653726 -0.74971600694021778\n"" 71 0.64874656072370729 1 -0.64882932411306993\n"" 72 0.6488668035834122 0.64886599996407779 -1\n"" 73 -1 0.41673079803079871 0.41664307505523179\n"" 74 -0.62468209179782908 1 0.62494186195929313\n"" 75 -0.62476903429567798 0.62489835940819183 1\n"" 76 -1 0.75020764999999989 1\n"" 77 0.12520010648567331 0.45856412436943739 0.37477910185628149\n"" 78 -0.24942439999999994 1 1\n"" 79 -0.37474797737976173 1 0.74996984889996166\n"" 80 -0.3748348177892612 0.74992638728967431 1\n"" 81 -1 -1 -0.49994339999999993\n"" 82 -0.50002894420427402 -1 0.24998549999999997\n"" 83 -1 -0.50045000000000006 1\n"" 84 -0.015617775048046156 -0.5000062299955631 1\n"" 85 -0.062520154989433377 -1 0.50002475010607028\n"" 86 0.50024029999999997 -1 1\n"" 87 1 -0.24929619999999997 1\n"" 88 0.37505270907528421 -0.3750526949043349 0.12522791934472338\n"" 89 -1 0.5001348000000001 -1\n"" 90 -1 1 -0.24999450000000001\n"" 91 1 -0.62477132796083668 -0.25025600000000003\n"" 92 0.50052129999999995 -1 -1\n"" 93 1 0.018238422269637886 -0.6785517711937521\n"" 94 0.750039598406532 -0.12448790000000004 -1\n"" 95 0.32367160517680327 0.022514689090561368 -0.65701963759824777\n"" 96 0.32369468988306127 0.65698780035674154 -0.022395524628340657\n"" 97 1 1 -0.25020424999999996\n"" 98 1 0.62501462613012171 -0.12492844204372336\n"" 99 0.16205966081319645 0.60689608104137205 -1\n"" 100 0.23307615322925276 1 -0.65509826790501591\n"" 101 0.6349049175761754 0.105723024682608 1\n"" 102 1 0.18290638148392097 0.59627500837254621\n"" 103 0.67708420758319754 0.67702605426027662 1\n"" 104 1 0.7498625000000001 1\n"" 105 0.75029925000000008 1 1\n"" 106 0.75006454389022692 1 0.37500606926950353\n"" 107 1 0.7500645207487896 0.37502882687227923\n"" 108 -0.39273716375981493 0.28664398202145958 -0.051638660454459806\n"" 109 -0.41671246738153483 -0.41657507574696978 -1\n"" 110 -0.24910025000000008 -1 -0.50024283860374685\n"" 111 -1 -0.50000177258228129 0.01562108247952367\n"" 112 -1 0.062713405747402015 -0.49998686350971472\n"" 113 -0.21672667787876426 1 -0.60296047487967241\n"" 114 1 0.7499052299192317 -0.37495181123207261\n"" 115 0.74540338978064358 1 -0.37527617499999999\n"" 116 0.52159008257288741 0.55923294709068649 -0.50062662770660094\n"" 117 0.75009235000000007 1 -1\n"" 118 -0.52928249862025711 0.10679011696853863 1\n"" 119 -1 0.034077217919757319 0.58381620432891879\n"" 120 -1 0.7383278941763165 0.25053954999999994\n"" 121 -0.70891631291249579 1 0.25053954999999989\n"" 122 -0.46050965421976553 0.49218708190674731 0.49218708126315491\n"" 123 -1 0.68039176952095026 0.65291562053589947\n"" 124 0.10567541850782136 0.6349221513724419 1\n"" 125 0.18288602711749127 1 0.59629803533945958\n"" 126 0.54298856425431818 0.54298737875163716 0.56762073808494473\n"" 127 -0.67702799351191578 -0.67732215502802495 -1\n"" 128 -0.74942264999999997 -1 -1\n"" 129 -1 -1 -0.74980449999999998\n"" 130 -1 -0.49218854513728494 -0.49218946358719012\n"" 131 -0.42414945787750447 -1 0.62500198796368489\n"" 132 -0.34611026252144428 -0.35284219355707647 0.34611025416343177\n"" 133 -1 -0.25018009999999996 1\n"" 134 1 -0.62478846817134759 0.62485153607962096\n"" 135 0.46873640237350567 -1 0.46875741869756882\n"" 136 0.62487945516234578 -0.62473271086601501 1\n"" 137 1 -1 0.75017445000000005\n"" 138 0.74996116568713633 -0.37481680473944939 1\n"" 139 1 -0.37487247538331225 0.74993327711783697\n"" 140 0.52037384429375466 0.13732055395658338 0.20134643019667742\n"" 141 0.15110486348630267 -0.58850137906978839 -0.32248691722782763\n"" 142 0.18460607304185575 -0.25601325165021294 0.59072519783751942\n"" 143 0.58280144730296801 -0.1236683742487249 -0.25429890766156527\n"" 144 -0.62459780071323356 0.62480472798869868 -1\n"" 145 -1 0.62491663124728913 -0.6248890159372763\n"" 146 -0.62484746422599169 1 -0.62502715932999464\n"" 147 -0.7093663193037405 1 -0.043380902757278066\n"" 148 -1 0.70881555044570888 -0.042280622034258974\n"" 149 1 -1 -0.25034290000000009\n"" 150 1 -0.40640338795560693 0.10958986646960317\n"" 151 0.62965348921187414 -1 0.11553823232370244\n"" 152 0.62491481284490769 -0.62481034920526324 -1\n"" 153 0.62518044398996542 -1 -0.62501367730297908\n"" 154 1 -0.63771354537448766 -0.63764519345816328\n"" 155 1 0.31875234539841601 -0.74994017167142224\n"" 156 1 0.25014510000000001 -1\n"" 157 0.74289722234692146 0.382058894292784 -1\n"" 158 0.32367160517680327 0.022514689090561313 -1\n"" 159 -0.16523027793533418 0.12134647368575949 -0.52708319267772263\n"" 160 0.66127538009577513 0.12758426427554953 -1\n"" 161 0.66190311587317174 -0.14472935797430672 -0.63288146125613987\n"" 162 0.32369468988306133 1 -0.022395524628340657\n"" 163 0.66678290425073372 1 -0.041514421404229618\n"" 164 0.25040265000000006 1 -1\n"" 165 0.0399620660587649 1 -0.35479393735090492\n"" 166 0.39507172571995386 0.7484116421252891 -1\n"" 167 1 -0.072369672334633761 0.72403943393322545\n"" 168 1 0.25022030000000006 1\n"" 169 -1 0.34715093732334323 0.069506853183406409\n"" 170 0.004224600474193374 -0.00030510666109673235 0.14430736392114327\n"" 171 -0.094962845556292308 0.5834952204256858 0.029410273259612763\n"" 172 -0.37516021595805987 -1 -0.12532788579913123\n"" 173 -0.24910025000000008 -0.73780528173239301 -1\n"" 174 -0.24899625000000003 -1 -1\n"" 175 -1 -0.68752594294730018 0.32233197415569781\n"" 176 -0.63898818329694262 -0.019780155017187176 -0.25640753531059018\n"" 177 -0.24918545000000003 1 -1\n"" 178 -0.090115044090208485 0.73312064098608642 -1\n"" 179 0.70087100707296945 0.7030864101348856 -0.70306291837965817\n"" 180 0.43929348327839085 1 -0.54468859277252801\n"" 181 0.24904127574612012 0.39074020564473289 -0.70186910867307939\n"" 182 1 0.37487410261969639 -0.24965440370335262\n"" 183 -1 0.25002235 1\n"" 184 -1 0.3834446703544917 0.71903607815447956\n"" 185 -0.1156880925075553 0.64434016438489528 0.64434017606689242\n"" 186 -0.49172745225271947 1 0.39835250767529351\n"" 187 -0.49767862299671706 0.38046779215689319 1\n"" 188 -0.71839703681869116 0.71780974657570373 0.44934935063382636\n"" 189 -0.51344827724776054 0.71469177745101886 0.71472798522876002\n"" 190 -0.23617534848477656 0.19448005635194549 1\n"" 191 0.10846459384596518 0.30820266021358389 1\n"" 192 0.25057285000000007 1 1\n"" 193 0.017230183845622971 1 0.32091029596366771\n"" 194 0.73101248242769623 0.7310147155780512 0.70877874225568527\n"" 195 0.31697048198150773 0.74665075980915008 0.4006579958540028\n"" 196 0.22826577744747956 0.47891948624469016 0.71004422740180217\n"" 197 1 0.41190390341165745 0.48757967789479273\n"" 198 0.39445308838583859 1 0.75656358081536812\n"" 199 0.37539107500000007 0.73916688955610543 1\n"" 200 1 0.37513265000000007 0.77169890914285255\n"" 201 0.73942011355234571 0.37513265000000007 1\n"" 202 0.63994038137069154 0.63994036678159205 0.2035446667438317\n"" 203 -0.46370016318896046 -0.62998103084618617 -0.61483850042635191\n"" 204 -1 -0.21786745446900305 -0.71882640763337879\n"" 205 -0.7381625142245487 -0.24989619999999996 -1\n"" 206 -1 -0.68409919087038817 -0.74320185410965045\n"" 207 -0.32233403971208485 -0.68753538843092254 1\n"" 208 -0.24999429999999997 -1 1\n"" 209 -1 -0.68747379665002328 0.68733786195201785\n"" 210 -1 -1 0.74993719999999997\n"" 211 -0.68734034505209507 -0.68746383783523624 1\n"" 212 0.012621642749083783 -0.62121055252239044 0.25549907282899653\n"" 213 -0.6302385799280833 -0.18856073836207951 0.63023858315073289\n"" 214 -1 -0.24375245663389172 0.20780956095073669\n"" 215 0.27457426263537876 -0.71671644193112283 1\n"" 216 0.25031765 -1 0.74826556642116959\n"" 217 0.67415846717387884 -1 0.72313083855082583\n"" 218 0.62503542334105555 -0.31221159888129457 0.62503541050290967\n"" 219 0.5971993096065894 0.14306806366195202 0.59872066564664705\n"" 220 1 0.017233350071975677 0.32090429254255515\n"" 221 0.26312362546126472 0.33468192363906535 0.084065768486193945\n"" 222 0.32197792152690552 -1 0.018797337932729474\n"" 223 0.18800195544968995 -1 -0.56289551925444881\n"" 224 0.57038729142869704 -0.57307887210152808 -0.20881754066389768\n"" 225 -0.0086896099297664228 -0.40801963637004723 -1\n"" 226 0.18460607304185569 -0.25601325165021294 1\n"" 227 -0.20780680948491165 -0.24375608761730455 1\n"" 228 0.16210795897650465 -0.16280891134401318 -0.30907215240469521\n"" 229 1 -0.26636148213032163 -0.17942676839456378\n"" 230 0.56446572384612781 0.1973176117738667 -0.43724659666019622\n"" 231 0.68853374013319157 -0.17744483013216472 0.09783510961497599\n"" 232 -1 0.25009230000000005 -1\n"" 233 -0.44245798368554617 0.091797696559903857 -1\n"" 234 -0.37472098690918887 0.74987909210814685 -1\n"" 235 -1 0.75000438735900432 -0.37495636858710685\n"" 236 -0.74996704638216471 1 -0.37508384505925174\n"" 237 -1 0.74990679999999998 -1\n"" 238 -0.54712707263607874 0.54712707774677038 -0.44245689687343565\n"" 239 -0.74990204999999999 1 -1\n"" 240 -0.72822316548562926 0.72874031845750664 0.1036085388532241\n"" 241 1 -0.71873547817891748 0.28112338497214717\n"" 242 1 -1 0.24972335000000001\n"" 243 0.75048264999999992 -1 -1\n"" 244 0.74989614566839657 -1 -0.37495931701899499\n"" 245 0.32778297288621805 -0.39528027615360428 -0.64821309452322518\n"" 246 1 -0.38051416654716286 -0.74727639147947866\n"" 247 0.75568696149005932 -0.39170758577960507 -1\n"" 248 0.67082477453227773 0.69774082076774491 -0.21670307025395311\n"" 249 0.25644629494787752 0.72897062001391455 -0.35498913750943906\n"" 250 -0.66044139980269567 0.12332997433814857 0.28570391360731856\n"" 251 -0.20800059812674501 0.28777064045558248 0.28593682199556314\n"" 252 0.29133599196527848 -0.095788071590640317 0.30648986161740821\n"" 253 -0.19340828105680374 -0.0068671095901119807 -0.17510149752792639\n"" 254 -0.21084753812463372 1 -0.20339622724796672\n"" 255 -0.098922382084248209 0.356624117376247 -0.256263439404529\n"" 256 -1 -0.74213790787259271 -0.24206983063972595\n"" 257 -0.72511478181115718 -1 -0.25002969999999997\n"" 258 -0.1250383368944159 -1 -0.24987830054645518\n"" 259 -0.5432409326212666 -0.58336779772250913 -0.0060938376146522089\n"" 260 -1 -1 0.25020549999999997\n"" 261 -0.69517902037783963 -1 0.48465629903462193\n"" 262 -1 0.19801494027267907 -0.22908951271298833\n"" 263 -1 -0.21170789004360985 -0.2804810168349573\n"" 264 0.12431896494966958 0.19380761445281547 -0.51506516411314296\n"" 265 0.016877018602808991 0.32057899216794972 -1\n"" 266 0.31815206866103007 0.69886802178230512 -0.69773364246572678\n"" 267 1 0.29452437620263039 0.03597223402760958\n"" 268 -0.23854616157962166 0.70039865549364788 0.32382827237146705\n"" 269 -0.072417036863037423 1 0.7240118059209224\n"" 270 -0.65715846697692126 0.26022065746019457 0.6943166148678479\n"" 271 0.032006652383344852 0.12877070459954792 0.60754383991332461\n"" 272 0.70679839053632465 0.35784100137989416 0.35408213575434944\n"" 273 1 0.75583880296190964 0.10796710954834202\n"" 274 -0.066417091587110066 -0.67493516441615642 -0.64835749920354258\n"" 275 -0.66000110931003353 -0.29732769674682547 -0.5356675566159671\n"" 276 -1 -0.7460956789293286 -0.49597432811515113\n"" 277 -0.63537062135554268 -1 -0.62487395000000001\n"" 278 -0.072189529852730625 -0.75207129129950046 1\n"" 279 -0.12479964999999998 -1 0.76180792382505302\n"" 280 -0.64633703603487636 -0.58450521092750218 0.50482020379778969\n"" 281 -0.19793040641595078 -1 0.22917284009874619\n"" 282 0.36430902573049584 -0.60319992435881997 0.46610302519244695\n"" 283 -0.014560432971481855 -0.28974170434477692 0.31899501601243035\n"" 284 -0.16677858939457951 -0.59736466720530357 0.62746423626615599\n"" 285 -0.70838149553417962 -0.14588171485233958 1\n"" 286 -1 -0.20773576611374234 0.72382280144202749\n"" 287 0.65401865792186442 -0.65865126715652123 0.6540215253821221\n"" 288 0.76868552550191671 -0.1162896631221611 1\n"" 289 0.39236022879703553 0.3070079448900544 0.42979647060190596\n"" 290 0.3368388593683827 0.015623435483033674 1\n"" 291 0.19283437348027005 -1 0.30983198636425424\n"" 292 0.23987671409711908 -0.66618838122351409 0.0008945936534150746\n"" 293 0.42213117252176491 -0.74712687995942406 -0.48458654817973601\n"" 294 1 -0.66026812967233972 0.017464640590841476\n"" 295 0.76163529643898698 -1 -0.11209435873849422\n"" 296 0.71607191560259942 -0.37037315933178871 -0.41086960011962592\n"" 297 -0.21716346053460103 -0.19947717862659675 -1\n"" 298 -0.066700914192858729 -0.25756978212559839 -0.62896708724727191\n"" 299 0.32965714090299714 -0.016623876027232615 -0.04345086208713933\n"" 300 0.3771146741942551 -0.33750921003054202 -0.17865283786030017\n"" 301 0.68867680851486557 0.35765454098697025 -0.68521532739244984\n"" 302 0.68683764447685003 -0.49596319168560488 0.30085803648362652\n"" 303 0.7090270874729655 -0.090415723473831255 0.40719961870896915\n"" 304 -0.71897798523587353 0.032300798531047246 -1\n"" 305 -0.78106895850102998 0.78106955040650416 -1\n"" 306 -1 1 -0.75022459999999991\n"" 307 -0.6917164744917017 0.69170418541265011 -0.69178840942223951\n"" 308 -0.44874465612278081 0.23033846865992608 -0.37975265656437374\n"" 309 -0.42791646676676653 1 -0.48213646482850109\n"" 310 -0.50093773209802361 0.36943796178744326 -1\n"" 311 -0.27376979380830829 0.64426231976101334 -0.66489790575084351\n"" 312 -1 0.35637030336560244 -0.50592472907968644\n"" 313 -0.67546025565396317 0.47435524682845248 -0.12755140965778172\n"" 314 1 -1 -0.74991180000000002\n"" 315 1 -0.75028080000000008 -1\n"" 316 0.75389683099717963 -0.68868788457723729 -0.44203141186583489\n"" 317 0.30599251534318156 -0.52261127269823027 -1\n"" 318 0.40047237565428867 -0.18178393484624253 -0.46933497457143036\n"" 319 0.59482353914036401 0.38624515090984007 -0.049897636224658731\n"" 320 -1 0.12332997433814856 0.2857039136073185\n"" 321 -1 -0.14689524813441618 0.42688908174824769\n"" 322 -0.66262979736993932 -0.22367581355790006 0.28652907305244368\n"" 323 -0.73506511384989526 0.43296210769478211 0.23284828493726362\n"" 324 -0.35917397776062404 -0.0011820981956873755 0.46134022362807492\n"" 325 -0.46329592253134338 -0.04321417701540118 0.047101266600350966\n"" 326 -0.27019578023748486 0.66094639539627242 -0.2626201492532621\n"" 327 -0.034393111593928383 0.28261880242562187 0.033764464745287937\n"" 328 0.18250360638285329 -1 -0.25535398043003921\n"" 329 -0.3030416241215706 -0.68638401151842854 -0.29392180366815041\n"" 330 -0.20024923856661142 -0.43390131265744347 0.010814269493628442\n"" 331 -0.70928533124789683 -1 0.043514240508664342\n"" 332 -0.66723744746271052 -0.6603325322519602 -0.32775579384930814\n"" 333 -0.75004930000000003 -1 1\n"" 334 -0.19527119007052851 0.17101403421852743 -1\n"" 335 0.035377884590221398 0.72616811699961958 0.38837547693302749\n"" 336 -0.3958963327893722 1 0.076655950240576198\n"" 337 -1 0.21457329427678187 0.47543850615348943\n"" 338 -0.7309823244201562 0.04824246580043276 0.53867561355267524\n"" 339 0.31731660817460328 0.019726050398274825 0.58867762989660533\n"" 340 -0.23374781763549932 0.32728908975345111 0.68606341552187544\n"" 341 -0.05707064185106852 -1 -0.71659883209883557\n"" 342 0.025895325626349025 -1 -0.41197380535174077\n"" 343 -0.63238580600180661 -0.3446250983839011 -0.21239475499198135\n"" 344 -1 -0.44899498782248648 -0.76904522126668295\n"" 345 -0.47299161220497166 -0.16458691872110107 -1\n"" 346 -0.71473237282422963 -0.73570249654826969 -0.71737349776128545\n"" 347 -0.74042724546706096 -1 0.74043153378626769\n"" 348 -0.75006482996996637 -0.43746254158362985 1\n"" 349 -1 -0.45163184813329721 0.75853196322407168\n"" 350 -0.50484417551448635 -0.72312317896459377 0.74770602252103513\n"" 351 -0.40758966352762416 -0.67845102844514626 0.2869272680702189\n"" 352 0.34674400209661604 -0.46348651949776365 1\n"" 353 -0.064367666161959269 -0.33637242545568102 0.74735946563471645\n"" 354 0.092602515587840606 -0.73476755239921543 0.53136369836931496\n"" 355 0.7405253302829875 -1 0.37931276242110001\n"" 356 0.72074474478028516 -0.071123657589263783 0.72858260191381197\n"" 357 -0.37493998320650845 -0.13123609584112483 -0.59370675998889832\n"" 358 -0.038352185780633007 -0.36921106178200458 -0.36036098843849301\n"" 359 -0.21058188105209746 -0.51336343843000509 -1\n"" 360 0.48755585676167218 -0.72413212665883209 0.19600157800093837\n"" 361 0.72678157399644117 -0.45646629587434373 0.011780680786240783\n"" 362 1 -0.2170765504241112 0.26033741814256661\n"" 363 -0.74541512030390267 -0.021189991595686748 -0.68170217165320612\n"" 364 -0.37387254482300358 0.32527982613660117 -0.69267828171913437\n"" 365 0.014913421017989981 0.548850834537849 -0.51262186425268497\n"" 366 -0.74537069514237131 0.2884463439624349 -1\n"" 367 -1 0.37511355000000007 -0.76842458715696027\n"" 368 -0.68532657097754035 0.18056419100293586 -0.02075972921423834\n"" 369 0.78133395148913365 -1 -0.78126287896225588\n"" 370 0.78115294817471781 -0.78112807555219699 -1\n"" 371 0.59082087507768066 -0.57000731366339108 -0.68829605397498683\n"" 372 0.062122976656860403 -0.70293283755163305 -1\n"" 373 0.71559274300689513 0.42281759201802555 -0.31813908171117911\n"" 374 0.7564597747876356 0.13217713297538497 -0.16417576007580004\n"" 375 0.40814884545639363 0.4915141193769953 -0.2436752542444009\n"" 376 -0.75696767061236314 -0.5164837362163468 0.21622587965261447\n"" 377 -0.452391830423859 0.55519361636450704 0.12429201972918034\n"" 378 -0.43481019055019038 -0.12925317405502307 1\n"" 379 -0.24742795067222612 -0.11366422696012682 0.2223275751188645\n"" 380 -0.006677616808027087 -0.21615237698969206 -0.065426614396930594\n"" 381 -0.062406752747729527 -0.70182414510247981 -0.087999792237402064\n"" 382 0.10306104864954116 0.76464771966531997 0.11700653142882178\n"" 383 0.27486783995540093 -0.12812237061584772 0.79536259891875982\n"" 384 -0.74059417471417499 -0.15757730258109431 0.00074049988054281091\n"" 385 -0.64002796579304344 -0.45394506207193958 -1\n"" 386 -0.42239397063762912 -0.42048979870740139 0.69490811148992537\n"" 387 -0.17195299402586212 -0.76346805360446235 0.40560748360163079\n"" 388 0.37676760090127209 -0.4417530820461561 0.70978247252690463\n"" 389 -0.20593363392839478 -0.044483242006169432 0.7439953909431003\n"" 390 -0.31521564832256066 -0.39420460209868968 -0.72065547292536469\n"" 391 -0.07315504595340451 0.34077703680706245 -0.71267230392230696\n"" 392 -0.0052948425242513517 1 -0.74523404665783877\n"" 393 -0.70127839101164502 0.30537699044254324 -0.64148488859352526\n"" 394 0.25061214999999992 -1 -1\n"" 395 0.40565131063307963 -0.76032995286218041 -1\n"" 396 0.38398614307047785 -1 -0.75304567260853106\n"" 397 0.23839244367761547 -0.68688896416028877 -0.73641430830181331\n"" 398 0.76674691103343318 0.57740125411814403 -0.50231823898754502\n"" 399 0.14110565781161721 -0.59279131304323562 0.77705687354697894\n""# Generated by tetgen -a0.01 cube.smesh \n"); } -static const char* getElements() { return( -"1580 4 0\n"" 0 120 148 13 240\n"" 1 77 251 185 268\n"" 2 126 194 66 198\n"" 3 297 298 159 357\n"" 4 13 148 147 240\n"" 5 219 272 102 303\n"" 6 134 137 37 136\n"" 7 302 360 88 361\n"" 8 23 264 95 391\n"" 9 307 311 238 364\n"" 10 57 309 254 326\n"" 11 345 357 233 363\n"" 12 176 343 325 384\n"" 13 275 332 67 343\n"" 14 141 245 228 318\n"" 15 108 368 323 377\n"" 16 7 47 74 123\n"" 17 73 188 184 270\n"" 18 56 235 148 313\n"" 19 46 72 117 179\n"" 20 66 105 28 194\n"" 21 205 275 204 344\n"" 22 66 194 28 198\n"" 23 96 221 45 375\n"" 24 93 160 94 161\n"" 25 225 317 245 397\n"" 26 121 186 74 188\n"" 27 213 280 52 322\n"" 28 52 322 280 376\n"" 29 96 195 77 221\n"" 30 8 257 256 331\n"" 31 358 380 330 381\n"" 32 99 181 166 266\n"" 33 120 123 73 188\n"" 34 122 189 187 340\n"" 35 141 292 224 300\n"" 36 313 326 240 377\n"" 37 203 274 173 390\n"" 38 140 299 221 319\n"" 39 44 197 107 272\n"" 40 171 326 108 377\n"" 41 71 166 46 179\n"" 42 69 364 334 391\n"" 43 26 114 97 115\n"" 44 228 253 159 358\n"" 45 221 272 202 289\n"" 46 123 184 73 188\n"" 47 22 220 140 231\n"" 48 250 324 322 325\n"" 49 270 324 213 338\n"" 50 147 240 57 336\n"" 51 69 265 178 391\n"" 52 100 249 165 365\n"" 53 296 316 224 371\n"" 54 74 188 186 189\n"" 55 21 171 165 249\n"" 56 23 297 225 298\n"" 57 191 196 64 290\n"" 58 87 139 138 288\n"" 59 126 198 196 199\n"" 60 223 328 141 342\n"" 61 293 371 153 396\n"" 62 238 308 108 313\n"" 63 49 187 80 189\n"" 64 143 300 224 361\n"" 65 111 256 130 343\n"" 66 62 107 106 273\n"" 67 64 196 126 219\n"" 68 314 154 315 369\n"" 69 50 205 204 344\n"" 70 0 70 26 71\n"" 71 95 158 23 265\n"" 72 37 138 87 139\n"" 73 125 193 43 195\n"" 74 56 312 238 313\n"" 75 257 259 172 332\n"" 76 25 70 0 72\n"" 77 141 300 228 358\n"" 78 32 207 208 350\n"" 79 101 201 200 219\n"" 80 13 147 121 240\n"" 81 67 275 176 357\n"" 82 116 249 180 266\n"" 83 197 219 200 272\n"" 84 152 247 42 371\n"" 85 95 158 60 160\n"" 86 45 230 116 375\n"" 87 88 282 142 283\n"" 88 96 162 61 249\n"" 89 209 280 211 350\n"" 90 84 353 226 399\n"" 91 33 258 172 381\n"" 92 118 285 213 378\n"" 93 196 271 77 289\n"" 94 282 287 218 388\n"" 95 196 198 125 199\n"" 96 74 7 76 30\n"" 97 95 230 181 264\n"" 98 297 359 225 390\n"" 99 280 347 261 350\n"" 100 253 299 170 380\n"" 101 125 269 193 335\n"" 102 245 293 224 300\n"" 103 41 143 68 161\n"" 104 58 295 244 316\n"" 105 83 348 211 349\n"" 106 75 29 76 123\n"" 107 171 249 96 255\n"" 108 124 196 125 199\n"" 109 61 248 96 249\n"" 110 221 255 45 327\n"" 111 254 326 171 336\n"" 112 194 198 126 199\n"" 113 208 278 9 279\n"" 114 94 93 11 160\n"" 115 275 357 345 363\n"" 116 127 173 109 203\n"" 117 134 139 55 218\n"" 118 45 255 253 327\n"" 119 154 35 315 370\n"" 120 283 284 142 353\n"" 121 186 336 268 377\n"" 122 59 93 11 94\n"" 123 110 203 51 277\n"" 124 59 246 94 247\n"" 125 116 248 61 249\n"" 126 41 229 143 296\n"" 127 91 154 36 316\n"" 128 71 179 116 180\n"" 129 45 299 221 327\n"" 130 319 373 182 374\n"" 131 64 219 101 290\n"" 132 116 301 179 398\n"" 133 122 323 188 377\n"" 134 182 373 68 374\n"" 135 97 115 114 248\n"" 136 60 158 95 181\n"" 137 185 268 48 335\n"" 138 66 125 43 195\n"" 139 86 215 136 287\n"" 140 106 202 163 273\n"" 141 43 106 66 195\n"" 142 271 324 283 389\n"" 143 95 158 42 245\n"" 144 186 188 122 189\n"" 145 25 179 157 301\n"" 146 173 274 110 341\n"" 147 136 138 37 287\n"" 148 244 293 58 316\n"" 149 107 197 65 272\n"" 150 42 160 158 161\n"" 151 28 105 103 194\n"" 152 200 201 126 219\n"" 153 147 235 90 236\n"" 154 224 292 141 293\n"" 155 220 272 140 303\n"" 156 4 209 83 211\n"" 157 207 278 208 279\n"" 158 296 300 143 318\n"" 159 226 352 84 399\n"" 160 104 65 63 194\n"" 161 212 282 88 283\n"" 162 255 308 238 364\n"" 163 150 229 91 361\n"" 164 43 163 106 202\n"" 165 126 219 196 289\n"" 166 48 185 79 189\n"" 167 257 329 110 332\n"" 168 170 299 252 380\n"" 169 30 74 75 76\n"" 170 30 79 78 80\n"" 171 39 234 146 307\n"" 172 218 252 142 339\n"" 173 185 251 77 340\n"" 174 102 200 197 219\n"" 175 49 189 185 340\n"" 176 213 348 286 349\n"" 177 133 286 285 348\n"" 178 65 197 126 272\n"" 179 187 189 49 340\n"" 180 213 285 53 378\n"" 181 63 194 65 200\n"" 182 131 279 85 387\n"" 183 120 169 148 323\n"" 184 197 200 126 272\n"" 185 46 166 72 179\n"" 186 15 248 98 273\n"" 187 98 114 24 373\n"" 188 46 180 100 266\n"" 189 22 231 140 374\n"" 190 171 335 77 382\n"" 191 27 106 62 107\n"" 192 255 264 159 391\n"" 193 132 325 322 379\n"" 194 240 323 313 377\n"" 195 155 160 93 301\n"" 196 221 299 170 327\n"" 197 158 160 95 161\n"" 198 79 80 30 189\n"" 199 178 365 311 391\n"" 200 16 285 133 286\n"" 201 249 255 171 365\n"" 202 188 270 73 323\n"" 203 162 165 61 249\n"" 204 107 126 65 194\n"" 205 155 156 93 160\n"" 206 219 303 102 356\n"" 207 259 330 132 351\n"" 208 224 293 141 300\n"" 209 77 271 170 289\n"" 210 231 252 140 299\n"" 211 147 240 148 313\n"" 212 152 370 153 395\n"" 213 154 246 35 247\n"" 214 291 354 212 387\n"" 215 211 348 280 349\n"" 216 144 234 39 307\n"" 217 212 292 33 381\n"" 218 133 348 83 349\n"" 219 119 337 270 338\n"" 220 120 188 73 323\n"" 221 211 280 209 349\n"" 222 209 211 333 347\n"" 223 251 325 108 379\n"" 224 236 238 146 309\n"" 225 274 329 110 342\n"" 226 39 305 144 307\n"" 227 144 305 89 307\n"" 228 96 249 248 375\n"" 229 113 178 177 392\n"" 230 91 294 224 295\n"" 231 94 160 42 161\n"" 232 165 171 21 326\n"" 233 170 324 251 379\n"" 234 211 347 209 350\n"" 235 116 179 115 398\n"" 236 214 263 31 384\n"" 237 70 117 71 0\n"" 238 43 195 96 202\n"" 239 90 235 40 236\n"" 240 134 136 37 287\n"" 241 67 253 159 357\n"" 242 33 328 258 381\n"" 243 71 116 115 180\n"" 244 55 241 134 302\n"" 245 155 301 24 398\n"" 246 275 345 205 363\n"" 247 52 209 175 280\n"" 248 287 302 241 355\n"" 249 79 185 48 269\n"" 250 45 181 116 230\n"" 251 68 182 24 373\n"" 252 106 126 66 195\n"" 253 170 299 253 327\n"" 254 228 298 245 358\n"" 255 275 357 67 390\n"" 256 126 195 77 196\n"" 257 176 275 67 343\n"" 258 17 363 232 367\n"" 259 248 249 116 375\n"" 260 251 324 250 325\n"" 261 122 251 185 340\n"" 262 238 311 309 326\n"" 263 157 160 155 301\n"" 264 60 181 99 265\n"" 265 98 248 114 373\n"" 266 34 261 209 347\n"" 267 132 330 212 351\n"" 268 245 274 141 358\n"" 269 190 191 19 271\n"" 270 236 238 57 313\n"" 271 105 104 103 194\n"" 272 94 246 161 247\n"" 273 35 246 59 247\n"" 274 140 319 267 374\n"" 275 212 281 33 291\n"" 276 117 71 46 179\n"" 277 70 117 72 179\n"" 278 159 253 228 264\n"" 279 80 185 49 189\n"" 280 209 333 4 210\n"" 281 2 128 127 206\n"" 282 100 164 46 166\n"" 283 74 76 7 123\n"" 284 80 187 75 189\n"" 285 103 194 63 201\n"" 286 171 326 249 365\n"" 287 136 6 137 37\n"" 288 216 291 85 354\n"" 289 47 120 13 121\n"" 290 101 288 54 356\n"" 291 130 263 111 343\n"" 292 168 200 101 201\n"" 293 68 143 41 229\n"" 294 282 291 135 354\n"" 295 49 191 190 340\n"" 296 184 189 75 270\n"" 297 202 272 126 289\n"" 298 218 356 339 383\n"" 299 352 388 215 399\n"" 300 124 192 125 269\n"" 301 70 117 0 72\n"" 302 136 218 138 287\n"" 303 108 255 171 327\n"" 304 223 293 153 396\n"" 305 25 156 155 157\n"" 306 115 116 61 180\n"" 307 320 321 250 338\n"" 308 60 166 99 181\n"" 309 228 245 141 358\n"" 310 127 346 203 385\n"" 311 96 249 171 382\n"" 312 219 272 140 289\n"" 313 112 275 204 363\n"" 314 126 197 65 200\n"" 315 270 337 250 338\n"" 316 42 158 95 161\n"" 317 183 187 118 270\n"" 318 212 283 132 284\n"" 319 204 275 205 363\n"" 320 165 180 61 249\n"" 321 67 275 203 332\n"" 322 14 185 80 269\n"" 323 224 296 91 316\n"" 324 209 261 175 280\n"" 325 290 339 219 383\n"" 326 193 269 48 335\n"" 327 106 195 43 202\n"" 328 176 357 275 363\n"" 329 77 251 170 271\n"" 330 44 267 220 272\n"" 331 75 189 187 270\n"" 332 65 194 126 200\n"" 333 68 267 182 374\n"" 334 125 195 66 198\n"" 335 17 204 50 205\n"" 336 250 325 322 384\n"" 337 66 195 126 198\n"" 338 79 185 80 189\n"" 339 159 298 67 357\n"" 340 218 302 88 303\n"" 341 78 80 79 269\n"" 342 77 221 170 327\n"" 343 90 147 13 148\n"" 344 319 373 230 375\n"" 345 126 200 194 201\n"" 346 143 161 41 296\n"" 347 297 357 345 390\n"" 348 126 195 106 202\n"" 349 64 196 124 199\n"" 350 209 333 211 4\n"" 351 44 202 107 273\n"" 352 195 196 125 335\n"" 353 284 353 84 399\n"" 354 125 196 195 198\n"" 355 64 126 103 201\n"" 356 63 200 168 201\n"" 357 278 279 207 284\n"" 358 175 209 34 261\n"" 359 224 294 91 361\n"" 360 274 298 225 390\n"" 361 258 329 172 381\n"" 362 293 316 153 371\n"" 363 37 139 134 287\n"" 364 200 219 126 272\n"" 365 110 277 257 332\n"" 366 158 225 42 245\n"" 367 191 271 190 340\n"" 368 6 86 136 217\n"" 369 96 163 43 202\n"" 370 41 246 154 296\n"" 371 2 127 50 206\n"" 372 120 240 188 323\n"" 373 171 268 77 335\n"" 374 257 277 276 332\n"" 375 308 313 238 393\n"" 376 98 248 202 273\n"" 377 167 303 55 356\n"" 378 136 137 6 217\n"" 379 88 283 252 380\n"" 380 188 323 240 377\n"" 381 140 272 267 319\n"" 382 121 188 120 240\n"" 383 323 368 313 377\n"" 384 172 258 110 329\n"" 385 192 198 28 199\n"" 386 284 354 85 387\n"" 387 155 157 156 160\n"" 388 143 230 45 299\n"" 389 173 341 20 372\n"" 390 248 319 96 375\n"" 391 242 241 151 355\n"" 392 30 80 75 189\n"" 393 51 173 127 203\n"" 394 81 256 8 257\n"" 395 187 270 122 340\n"" 396 38 241 242 355\n"" 397 141 293 245 300\n"" 398 93 156 11 160\n"" 399 88 252 218 303\n"" 400 29 123 75 184\n"" 401 159 334 297 357\n"" 402 206 344 130 346\n"" 403 185 269 125 335\n"" 404 151 294 10 295\n"" 405 105 66 27 194\n"" 406 150 302 55 362\n"" 407 261 280 209 347\n"" 408 312 367 145 393\n"" 409 194 200 63 201\n"" 410 176 275 112 363\n"" 411 334 357 159 364\n"" 412 231 302 88 361\n"" 413 57 238 236 309\n"" 414 88 300 292 380\n"" 415 192 124 125 199\n"" 416 148 240 120 323\n"" 417 126 194 103 201\n"" 418 259 331 82 351\n"" 419 119 184 183 270\n"" 420 150 241 55 302\n"" 421 126 272 219 289\n"" 422 230 301 116 373\n"" 423 123 188 74 189\n"" 424 74 186 79 189\n"" 425 92 369 243 370\n"" 426 131 280 261 350\n"" 427 143 299 228 300\n"" 428 220 303 231 362\n"" 429 277 332 203 346\n"" 430 256 257 81 276\n"" 431 154 314 36 369\n"" 432 100 180 165 249\n"" 433 149 294 91 295\n"" 434 274 329 141 358\n"" 435 126 201 64 219\n"" 436 64 201 101 219\n"" 437 207 211 53 350\n"" 438 283 330 132 379\n"" 439 243 369 1 370\n"" 440 24 373 114 398\n"" 441 143 230 161 318\n"" 442 161 296 245 371\n"" 443 110 257 172 329\n"" 444 96 162 43 163\n"" 445 248 373 319 375\n"" 446 171 221 77 327\n"" 447 21 254 171 336\n"" 448 306 5 239 305\n"" 449 197 220 102 272\n"" 450 82 281 172 351\n"" 451 113 146 39 234\n"" 452 143 229 68 374\n"" 453 68 93 41 161\n"" 454 172 351 281 381\n"" 455 112 204 17 363\n"" 456 124 191 185 196\n"" 457 215 216 9 278\n"" 458 19 383 353 389\n"" 459 185 189 122 340\n"" 460 137 38 287 134\n"" 461 122 270 250 324\n"" 462 126 202 107 272\n"" 463 70 71 117 179\n"" 464 84 227 226 353\n"" 465 109 173 390 203\n"" 466 13 121 120 240\n"" 467 53 285 213 348\n"" 468 228 358 300 380\n"" 469 14 80 78 269\n"" 470 55 302 218 303\n"" 471 285 286 213 348\n"" 472 107 202 106 273\n"" 473 307 367 366 393\n"" 474 147 148 90 235\n"" 475 94 161 42 247\n"" 476 276 332 277 346\n"" 477 141 293 223 397\n"" 478 51 203 127 346\n"" 479 22 229 150 231\n"" 480 163 202 96 248\n"" 481 48 269 185 335\n"" 482 162 163 96 248\n"" 483 141 274 245 397\n"" 484 115 163 61 248\n"" 485 147 236 57 313\n"" 486 158 181 60 265\n"" 487 311 365 364 391\n"" 488 193 195 125 335\n"" 489 125 185 124 269\n"" 490 224 296 245 300\n"" 491 49 185 124 191\n"" 492 132 280 213 322\n"" 493 96 202 195 221\n"" 494 233 357 334 364\n"" 495 99 166 164 266\n"" 496 245 293 141 397\n"" 497 36 244 149 316\n"" 498 74 79 30 189\n"" 499 30 75 74 189\n"" 500 12 178 99 392\n"" 501 322 325 259 384\n"" 502 195 196 126 198\n"" 503 57 313 238 326\n"" 504 48 268 186 336\n"" 505 91 296 154 316\n"" 506 14 192 124 269\n"" 507 259 332 111 343\n"" 508 238 311 255 364\n"" 509 45 230 95 264\n"" 510 140 252 221 299\n"" 511 176 262 112 263\n"" 512 32 211 207 350\n"" 513 261 376 351 82\n"" 514 19 227 190 389\n"" 515 2 129 128 206\n"" 516 102 220 167 303\n"" 517 181 249 116 266\n"" 518 170 271 251 324\n"" 519 186 188 121 240\n"" 520 213 321 286 338\n"" 521 124 185 14 269\n"" 522 91 295 224 316\n"" 523 143 299 231 374\n"" 524 159 364 255 391\n"" 525 310 334 69 364\n"" 526 170 283 271 379\n"" 527 229 231 143 361\n"" 528 241 287 134 302\n"" 529 70 72 25 179\n"" 530 72 157 25 179\n"" 531 26 71 70 179\n"" 532 70 114 26 179\n"" 533 287 388 282 399\n"" 534 68 229 22 374\n"" 535 61 180 116 249\n"" 536 115 116 71 179\n"" 537 143 296 229 361\n"" 538 142 354 282 399\n"" 539 25 155 70 179\n"" 540 139 288 167 356\n"" 541 114 115 26 179\n"" 542 26 115 71 179\n"" 543 116 180 179 266\n"" 544 164 166 100 266\n"" 545 100 166 46 266\n"" 546 171 255 221 327\n"" 547 132 330 325 379\n"" 548 140 289 252 339\n"" 549 24 182 98 373\n"" 550 180 249 100 266\n"" 551 320 321 214 322\n"" 552 213 285 270 338\n"" 553 214 321 52 322\n"" 554 122 188 186 268\n"" 555 271 289 196 339\n"" 556 108 251 250 325\n"" 557 153 293 244 316\n"" 558 43 193 162 382\n"" 559 80 124 49 185\n"" 560 159 67 358 253\n"" 561 142 282 212 283\n"" 562 14 124 80 185\n"" 563 110 174 173 341\n"" 564 187 189 122 270\n"" 565 252 299 88 380\n"" 566 55 218 139 356\n"" 567 227 378 190 389\n"" 568 33 292 222 328\n"" 569 47 121 74 188\n"" 570 74 123 47 188\n"" 571 120 121 47 188\n"" 572 47 123 120 188\n"" 573 55 303 218 356\n"" 574 167 288 18 356\n"" 575 58 224 151 295\n"" 576 18 167 87 288\n"" 577 116 230 181 301\n"" 578 161 246 41 296\n"" 579 91 244 149 295\n"" 580 33 281 212 381\n"" 581 23 225 158 245\n"" 582 79 186 48 189\n"" 583 75 184 123 189\n"" 584 74 75 76 189\n"" 585 75 123 76 189\n"" 586 76 123 74 189\n"" 587 67 357 298 390\n"" 588 124 185 125 196\n"" 589 186 240 121 336\n"" 590 64 191 124 196\n"" 591 209 210 34 347\n"" 592 80 185 79 269\n"" 593 63 103 104 194\n"" 594 27 107 65 194\n"" 595 9 278 216 279\n"" 596 66 126 106 194\n"" 597 104 27 65 194\n"" 598 66 106 27 194\n"" 599 106 107 27 194\n"" 600 27 3 105 194\n"" 601 105 3 104 194\n"" 602 104 3 27 194\n"" 603 77 335 195 382\n"" 604 136 217 86 287\n"" 605 226 290 54 383\n"" 606 290 356 54 383\n"" 607 218 339 142 383\n"" 608 21 268 193 336\n"" 609 193 268 48 336\n"" 610 171 268 21 336\n"" 611 103 194 126 199\n"" 612 28 198 194 199\n"" 613 125 198 192 199\n"" 614 28 194 103 199\n"" 615 106 163 62 273\n"" 616 98 202 44 273\n"" 617 221 252 170 299\n"" 618 141 300 245 318\n"" 619 185 196 77 335\n"" 620 244 295 91 316\n"" 621 62 163 15 273\n"" 622 231 299 143 300\n"" 623 317 371 245 397\n"" 624 126 196 64 199\n"" 625 103 126 64 199\n"" 626 93 94 59 246\n"" 627 127 344 206 346\n"" 628 224 292 222 360\n"" 629 225 359 274 390\n"" 630 221 319 45 375\n"" 631 25 157 155 301\n"" 632 19 271 191 290\n"" 633 110 341 274 342\n"" 634 163 248 15 273\n"" 635 132 283 212 330\n"" 636 119 321 320 338\n"" 637 186 189 122 268\n"" 638 106 194 126 202\n"" 639 126 194 107 202\n"" 640 107 194 106 202\n"" 641 141 358 329 381\n"" 642 88 302 282 360\n"" 643 263 275 176 343\n"" 644 173 203 110 274\n"" 645 260 175 34 261\n"" 646 250 270 122 323\n"" 647 21 165 162 249\n"" 648 193 335 268 382\n"" 649 130 332 275 343\n"" 650 204 275 130 344\n"" 651 51 110 174 203\n"" 652 110 173 174 203\n"" 653 174 173 51 203\n"" 654 70 155 24 398\n"" 655 177 113 39 234\n"" 656 218 252 88 282\n"" 657 352 383 54 388\n"" 658 112 263 204 275\n"" 659 54 352 226 383\n"" 660 134 287 241 355\n"" 661 238 307 146 309\n"" 662 224 295 58 316\n"" 663 325 343 259 384\n"" 664 259 329 67 330\n"" 665 88 292 224 360\n"" 666 9 215 86 216\n"" 667 221 299 45 319\n"" 668 245 296 161 318\n"" 669 136 134 137 287\n"" 670 83 211 209 349\n"" 671 132 324 283 379\n"" 672 84 284 207 353\n"" 673 138 139 37 287\n"" 674 140 252 231 303\n"" 675 219 289 140 339\n"" 676 181 230 45 264\n"" 677 228 300 299 380\n"" 678 85 279 216 354\n"" 679 169 320 250 323\n"" 680 68 230 143 374\n"" 681 207 227 84 353\n"" 682 240 313 57 326\n"" 683 49 190 187 340\n"" 684 286 348 133 349\n"" 685 52 280 213 349\n"" 686 263 343 176 384\n"" 687 51 277 203 346\n"" 688 220 267 140 272\n"" 689 137 217 136 287\n"" 690 203 329 274 390\n"" 691 31 320 250 368\n"" 692 224 316 293 371\n"" 693 231 252 88 303\n"" 694 252 271 170 283\n"" 695 253 358 228 380\n"" 696 256 276 130 332\n"" 697 19 353 227 389\n"" 698 219 339 303 356\n"" 699 170 252 221 289\n"" 700 142 271 252 283\n"" 701 209 347 280 350\n"" 702 142 252 88 283\n"" 703 251 324 271 340\n"" 704 95 264 181 391\n"" 705 171 251 77 268\n"" 706 98 319 248 373\n"" 707 331 351 259 376\n"" 708 41 154 91 296\n"" 709 10 241 151 242\n"" 710 330 380 292 381\n"" 711 132 284 283 353\n"" 712 140 272 221 289\n"" 713 126 196 77 289\n"" 714 152 371 317 395\n"" 715 36 149 91 316\n"" 716 108 253 176 308\n"" 717 255 365 264 391\n"" 718 202 248 163 273\n"" 719 224 300 88 361\n"" 720 65 126 107 272\n"" 721 67 159 358 298\n"" 722 88 300 231 361\n"" 723 153 223 58 293\n"" 724 146 238 236 307\n"" 725 202 248 98 319\n"" 726 141 328 292 381\n"" 727 42 161 95 245\n"" 728 176 253 108 325\n"" 729 10 294 149 295\n"" 730 155 179 25 301\n"" 731 68 161 143 230\n"" 732 264 365 181 391\n"" 733 225 274 245 298\n"" 734 225 245 23 298\n"" 735 41 161 93 246\n"" 736 97 163 115 248\n"" 737 93 161 94 246\n"" 738 45 255 96 375\n"" 739 212 291 282 354\n"" 740 148 313 323 169\n"" 741 224 292 88 300\n"" 742 142 283 212 354\n"" 743 61 162 96 248\n"" 744 97 114 98 248\n"" 745 185 189 48 268\n"" 746 205 345 275 385\n"" 747 48 268 193 335\n"" 748 24 155 68 301\n"" 749 60 160 157 301\n"" 750 159 357 308 364\n"" 751 297 345 109 390\n"" 752 61 163 162 248\n"" 753 61 116 115 248\n"" 754 230 299 143 374\n"" 755 140 267 22 374\n"" 756 102 303 167 356\n"" 757 134 287 218 302\n"" 758 218 282 88 302\n"" 759 93 161 68 230\n"" 760 357 363 308 364\n"" 761 224 295 294 361\n"" 762 153 244 36 316\n"" 763 303 339 218 356\n"" 764 294 302 150 361\n"" 765 153 371 152 395\n"" 766 57 326 254 336\n"" 767 48 189 186 268\n"" 768 238 308 255 326\n"" 769 214 322 52 376\n"" 770 132 322 259 376\n"" 771 111 331 259 376\n"" 772 121 240 147 336\n"" 773 253 379 330 380\n"" 774 223 274 141 397\n"" 775 176 308 262 313\n"" 776 31 262 176 263\n"" 777 334 364 159 391\n"" 778 255 311 238 326\n"" 779 110 274 203 329\n"" 780 315 369 154 370\n"" 781 146 234 113 311\n"" 782 363 366 232 367\n"" 783 159 298 228 358\n"" 784 292 328 33 381\n"" 785 68 301 230 373\n"" 786 271 340 324 389\n"" 787 176 263 112 275\n"" 788 1 369 315 370\n"" 789 159 308 255 364\n"" 790 253 255 159 308\n"" 791 262 312 56 313\n"" 792 19 290 226 383\n"" 793 84 352 215 399\n"" 794 23 158 95 245\n"" 795 145 235 56 238\n"" 796 132 322 213 324\n"" 797 77 268 185 335\n"" 798 175 214 52 376\n"" 799 108 255 253 308\n"" 800 56 238 235 313\n"" 801 111 175 8 331\n"" 802 52 286 213 321\n"" 803 149 244 91 316\n"" 804 237 5 306 305\n"" 805 165 326 113 365\n"" 806 58 293 224 316\n"" 807 204 263 130 275\n"" 808 222 292 58 328\n"" 809 175 261 260 331\n"" 810 45 253 228 299\n"" 811 250 321 320 322\n"" 812 102 272 220 303\n"" 813 182 267 98 319\n"" 814 170 379 253 380\n"" 815 151 241 10 294\n"" 816 52 321 213 322\n"" 817 215 278 84 399\n"" 818 282 354 216 399\n"" 819 22 267 68 374\n"" 820 230 373 319 374\n"" 821 97 98 15 248\n"" 822 274 341 223 342\n"" 823 15 163 97 248\n"" 824 153 316 36 369\n"" 825 132 351 212 387\n"" 826 185 251 122 268\n"" 827 122 189 185 268\n"" 828 250 324 270 338\n"" 829 233 345 297 357\n"" 830 129 277 128 346\n"" 831 165 249 171 326\n"" 832 122 268 251 377\n"" 833 259 329 172 332\n"" 834 255 364 311 365\n"" 835 140 220 22 267\n"" 836 142 282 218 388\n"" 837 108 326 313 377\n"" 838 221 252 140 289\n"" 839 77 196 195 335\n"" 840 251 271 77 340\n"" 841 250 251 122 324\n"" 842 238 309 57 326\n"" 843 227 386 378 389\n"" 844 171 255 108 326\n"" 845 256 259 111 331\n"" 846 178 365 266 392\n"" 847 178 311 69 391\n"" 848 102 219 197 272\n"" 849 172 259 257 331\n"" 850 258 342 329 381\n"" 851 143 296 224 300\n"" 852 88 299 231 300\n"" 853 182 319 98 373\n"" 854 44 220 197 272\n"" 855 107 202 44 272\n"" 856 333 210 209 347\n"" 857 299 300 88 380\n"" 858 67 253 176 325\n"" 859 212 354 284 387\n"" 860 203 110 332 277\n"" 861 171 251 108 327\n"" 862 96 221 171 255\n"" 863 45 221 96 255\n"" 864 58 293 223 328\n"" 865 148 235 147 313\n"" 866 36 316 154 369\n"" 867 92 395 394 396\n"" 868 132 351 280 376\n"" 869 253 299 45 327\n"" 870 233 334 310 364\n"" 871 195 335 193 382\n"" 872 193 268 21 382\n"" 873 223 293 141 328\n"" 874 292 293 58 328\n"" 875 38 137 287 217\n"" 876 315 1 314 369\n"" 877 141 274 223 342\n"" 878 188 268 122 377\n"" 879 141 293 292 328\n"" 880 235 236 147 313\n"" 881 235 238 236 313\n"" 882 57 240 147 313\n"" 883 88 282 212 292\n"" 884 23 297 159 334\n"" 885 259 325 132 330\n"" 886 23 334 159 391\n"" 887 283 324 132 389\n"" 888 205 345 304 363\n"" 889 253 325 67 330\n"" 890 43 162 96 382\n"" 891 257 331 259 332\n"" 892 256 331 257 332\n"" 893 172 329 257 332\n"" 894 54 356 218 383\n"" 895 259 331 256 332\n"" 896 208 131 32 350\n"" 897 280 348 213 349\n"" 898 118 270 213 285\n"" 899 16 270 118 285\n"" 900 253 308 159 357\n"" 901 81 276 257 277\n"" 902 228 253 45 264\n"" 903 31 262 169 368\n"" 904 262 313 169 368\n"" 905 108 313 308 368\n"" 906 159 255 253 264\n"" 907 253 255 45 264\n"" 908 95 181 158 265\n"" 909 45 264 255 365\n"" 910 113 311 178 392\n"" 911 177 178 12 392\n"" 912 100 365 165 392\n"" 913 369 370 92 395\n"" 914 72 179 166 266\n"" 915 150 294 241 302\n"" 916 134 218 55 302\n"" 917 166 179 71 266\n"" 918 179 180 71 266\n"" 919 46 166 71 266\n"" 920 71 180 46 266\n"" 921 308 364 363 393\n"" 922 238 313 312 393\n"" 923 238 364 308 393\n"" 924 366 367 363 393\n"" 925 218 287 282 302\n"" 926 72 166 60 266\n"" 927 166 181 60 266\n"" 928 116 373 301 398\n"" 929 225 372 317 397\n"" 930 226 388 352 399\n"" 931 145 238 56 312\n"" 932 176 325 108 368\n"" 933 152 35 154 370\n"" 934 108 327 251 379\n"" 935 135 291 216 354\n"" 936 283 324 271 379\n"" 937 213 324 322 338\n"" 938 284 351 132 387\n"" 939 321 322 250 338\n"" 940 73 323 270 337\n"" 941 270 323 250 337\n"" 942 286 321 119 338\n"" 943 250 323 320 337\n"" 944 320 323 73 337\n"" 945 213 322 321 338\n"" 946 122 189 188 270\n"" 947 183 184 29 270\n"" 948 29 187 183 270\n"" 949 16 183 118 270\n"" 950 119 183 16 270\n"" 951 252 271 142 339\n"" 952 196 289 219 339\n"" 953 69 311 310 364\n"" 954 185 191 49 340\n"" 955 29 184 75 270\n"" 956 75 187 29 270\n"" 957 184 188 123 270\n"" 958 188 189 123 270\n"" 959 123 189 184 270\n"" 960 255 308 108 326\n"" 961 108 308 238 326\n"" 962 245 298 274 358\n"" 963 111 332 256 343\n"" 964 53 227 207 386\n"" 965 58 244 153 293\n"" 966 91 296 224 361\n"" 967 268 336 171 377\n"" 968 162 249 96 382\n"" 969 141 329 274 342\n"" 970 259 322 132 325\n"" 971 213 348 280 386\n"" 972 130 275 263 343\n"" 973 161 230 95 318\n"" 974 95 230 45 318\n"" 975 228 298 95 318\n"" 976 302 303 55 362\n"" 977 45 230 143 318\n"" 978 95 245 161 318\n"" 979 77 251 171 327\n"" 980 233 363 357 364\n"" 981 213 280 132 386\n"" 982 173 109 390 359\n"" 983 159 297 23 298\n"" 984 213 286 52 349\n"" 985 108 251 171 377\n"" 986 209 280 52 349\n"" 987 252 289 271 339\n"" 988 84 278 207 284\n"" 989 142 252 218 282\n"" 990 88 252 142 282\n"" 991 190 271 19 389\n"" 992 257 276 256 332\n"" 993 251 268 171 377\n"" 994 122 270 188 323\n"" 995 138 218 139 287\n"" 996 226 383 352 388\n"" 997 73 169 120 323\n"" 998 73 320 169 323\n"" 999 324 325 251 379\n"" 1000 364 365 255 391\n"" 1001 228 300 141 318\n"" 1002 224 296 143 361\n"" 1003 87 167 139 288\n"" 1004 297 334 233 357\n"" 1005 85 284 279 354\n"" 1006 122 324 251 340\n"" 1007 170 221 77 289\n"" 1008 170 271 252 289\n"" 1009 77 195 126 289\n"" 1010 167 220 55 303\n"" 1011 139 218 134 287\n"" 1012 216 217 135 287\n"" 1013 135 282 216 287\n"" 1014 245 300 296 318\n"" 1015 58 292 224 293\n"" 1016 171 249 21 382\n"" 1017 172 259 82 351\n"" 1018 131 284 279 387\n"" 1019 134 241 38 355\n"" 1020 18 288 101 356\n"" 1021 38 287 134 355\n"" 1022 139 167 55 356\n"" 1023 139 218 138 356\n"" 1024 142 383 271 389\n"" 1025 216 282 135 354\n"" 1026 353 383 142 389\n"" 1027 271 283 142 389\n"" 1028 131 350 284 387\n"" 1029 274 358 298 390\n"" 1030 86 216 215 287\n"" 1031 86 217 216 287\n"" 1032 195 202 126 289\n"" 1033 195 221 202 289\n"" 1034 77 221 195 289\n"" 1035 140 272 219 303\n"" 1036 33 291 222 292\n"" 1037 212 291 33 292\n"" 1038 229 296 91 361\n"" 1039 140 231 220 303\n"" 1040 145 307 238 393\n"" 1041 222 224 58 292\n"" 1042 270 324 122 340\n"" 1043 96 319 221 375\n"" 1044 216 278 215 399\n"" 1045 274 341 173 372\n"" 1046 88 252 231 299\n"" 1047 216 279 278 399\n"" 1048 115 248 116 398\n"" 1049 274 359 225 372\n"" 1050 153 395 92 396\n"" 1051 245 298 228 318\n"" 1052 95 298 245 318\n"" 1053 143 300 228 318\n"" 1054 231 303 302 362\n"" 1055 91 229 41 296\n"" 1056 293 396 223 397\n"" 1057 249 255 45 375\n"" 1058 42 245 225 317\n"" 1059 304 345 233 363\n"" 1060 55 303 220 362\n"" 1061 231 302 150 362\n"" 1062 216 354 279 399\n"" 1063 361 224 151 360\n"" 1064 282 388 142 399\n"" 1065 96 255 249 375\n"" 1066 151 222 135 360\n"" 1067 222 292 291 360\n"" 1068 159 264 23 391\n"" 1069 127 206 128 346\n"" 1070 95 265 23 391\n"" 1071 69 334 265 391\n"" 1072 159 264 228 298\n"" 1073 228 264 95 298\n"" 1074 23 245 95 298\n"" 1075 282 292 88 360\n"" 1076 67 330 329 358\n"" 1077 23 264 159 298\n"" 1078 95 264 23 298\n"" 1079 229 231 22 374\n"" 1080 60 157 72 301\n"" 1081 157 179 72 301\n"" 1082 116 266 179 301\n"" 1083 95 160 60 301\n"" 1084 60 266 181 301\n"" 1085 181 266 116 301\n"" 1086 60 181 95 301\n"" 1087 181 230 95 301\n"" 1088 160 161 93 301\n"" 1089 161 230 93 301\n"" 1090 68 155 93 301\n"" 1091 93 230 68 301\n"" 1092 179 266 72 301\n"" 1093 72 266 60 301\n"" 1094 95 161 160 301\n"" 1095 95 230 161 301\n"" 1096 308 357 176 363\n"" 1097 255 326 171 365\n"" 1098 91 294 150 361\n"" 1099 294 360 302 361\n"" 1100 231 300 143 361\n"" 1101 88 302 231 303\n"" 1102 245 371 293 397\n"" 1103 146 236 40 307\n"" 1104 236 238 235 307\n"" 1105 235 238 145 307\n"" 1106 110 203 332 329\n"" 1107 177 234 178 311\n"" 1108 113 234 177 311\n"" 1109 169 262 56 313\n"" 1110 148 169 56 313\n"" 1111 89 237 145 307\n"" 1112 89 305 237 307\n"" 1113 306 40 145 307\n"" 1114 146 40 306 307\n"" 1115 237 306 145 307\n"" 1116 237 305 306 307\n"" 1117 306 239 146 307\n"" 1118 305 239 306 307\n"" 1119 146 239 39 307\n"" 1120 239 305 39 307\n"" 1121 40 235 145 307\n"" 1122 40 236 235 307\n"" 1123 177 178 113 311\n"" 1124 253 255 108 327\n"" 1125 307 309 238 311\n"" 1126 178 234 69 311\n"" 1127 170 251 77 327\n"" 1128 271 324 170 379\n"" 1129 146 307 234 311\n"" 1130 181 266 99 365\n"" 1131 69 234 144 311\n"" 1132 234 307 144 311\n"" 1133 228 299 253 380\n"" 1134 100 266 249 365\n"" 1135 178 266 99 392\n"" 1136 99 266 178 365\n"" 1137 113 365 311 392\n"" 1138 99 266 164 392\n"" 1139 108 308 176 368\n"" 1140 313 323 169 368\n"" 1141 45 255 249 365\n"" 1142 232 363 304 366\n"" 1143 308 313 176 368\n"" 1144 146 309 307 311\n"" 1145 113 309 146 311\n"" 1146 52 280 175 376\n"" 1147 144 310 69 311\n"" 1148 115 179 114 398\n"" 1149 114 248 115 398\n"" 1150 176 262 31 368\n"" 1151 212 284 132 387\n"" 1152 89 366 144 367\n"" 1153 153 370 369 395\n"" 1154 153 369 92 395\n"" 1155 301 373 24 398\n"" 1156 53 350 348 386\n"" 1157 108 325 250 368\n"" 1158 371 395 153 396\n"" 1159 24 301 68 373\n"" 1160 70 179 155 398\n"" 1161 161 296 143 318\n"" 1162 95 264 228 318\n"" 1163 228 264 45 318\n"" 1164 45 264 95 318\n"" 1165 45 299 228 318\n"" 1166 228 299 143 318\n"" 1167 143 299 45 318\n"" 1168 68 373 230 374\n"" 1169 267 319 182 374\n"" 1170 259 351 132 376\n"" 1171 202 272 221 319\n"" 1172 221 272 140 319\n"" 1173 202 221 96 319\n"" 1174 96 248 202 319\n"" 1175 116 373 248 375\n"" 1176 44 202 98 319\n"" 1177 98 267 44 319\n"" 1178 267 272 44 319\n"" 1179 44 272 202 319\n"" 1180 230 373 116 375\n"" 1181 143 231 229 374\n"" 1182 116 249 181 375\n"" 1183 45 319 230 375\n"" 1184 116 181 45 375\n"" 1185 175 331 111 376\n"" 1186 280 322 132 376\n"" 1187 171 336 326 377\n"" 1188 261 347 131 350\n"" 1189 131 347 32 350\n"" 1190 128 206 129 346\n"" 1191 238 313 108 326\n"" 1192 171 254 21 326\n"" 1193 329 358 330 381\n"" 1194 251 327 170 379\n"" 1195 325 330 253 379\n"" 1196 172 281 33 381\n"" 1197 212 282 142 354\n"" 1198 110 329 258 342\n"" 1199 205 344 50 385\n"" 1200 376 261 351 280\n"" 1201 173 174 20 341\n"" 1202 322 324 132 379\n"" 1203 322 325 324 379\n"" 1204 298 358 67 390\n"" 1205 67 329 203 390\n"" 1206 21 254 165 326\n"" 1207 184 270 119 337\n"" 1208 142 284 283 354\n"" 1209 73 270 184 337\n"" 1210 218 303 252 339\n"" 1211 250 323 108 368\n"" 1212 245 274 225 397\n"" 1213 165 254 113 326\n"" 1214 275 344 205 385\n"" 1215 254 309 113 326\n"" 1216 309 311 113 326\n"" 1217 96 221 77 382\n"" 1218 249 326 165 365\n"" 1219 125 196 185 335\n"" 1220 224 245 371 293\n"" 1221 203 329 67 332\n"" 1222 50 206 127 344\n"" 1223 162 193 21 382\n"" 1224 8 256 111 331\n"" 1225 82 259 172 331\n"" 1226 245 224 371 296\n"" 1227 260 8 175 331\n"" 1228 250 368 325 384\n"" 1229 219 356 290 383\n"" 1230 96 195 43 382\n"" 1231 271 339 290 383\n"" 1232 212 330 292 381\n"" 1233 265 334 23 391\n"" 1234 329 330 259 381\n"" 1235 329 342 141 381\n"" 1236 77 221 171 382\n"" 1237 43 195 193 382\n"" 1238 292 380 141 381\n"" 1239 141 380 358 381\n"" 1240 111 259 256 332\n"" 1241 135 355 151 360\n"" 1242 130 344 275 346\n"" 1243 206 276 129 346\n"" 1244 207 350 53 386\n"" 1245 128 277 51 346\n"" 1246 51 127 128 346\n"" 1247 353 386 227 389\n"" 1248 271 290 19 383\n"" 1249 339 356 219 383\n"" 1250 322 324 250 338\n"" 1251 250 337 320 338\n"" 1252 320 337 119 338\n"" 1253 119 270 16 338\n"" 1254 270 285 16 338\n"" 1255 213 286 285 338\n"" 1256 285 286 16 338\n"" 1257 16 286 119 338\n"" 1258 343 376 259 384\n"" 1259 250 320 31 384\n"" 1260 252 303 140 339\n"" 1261 140 303 219 339\n"" 1262 191 271 196 339\n"" 1263 191 290 271 339\n"" 1264 196 290 191 339\n"" 1265 196 219 64 339\n"" 1266 219 290 64 339\n"" 1267 64 290 196 339\n"" 1268 31 368 250 384\n"" 1269 31 263 176 384\n"" 1270 322 376 214 384\n"" 1271 185 196 191 340\n"" 1272 196 271 191 340\n"" 1273 203 275 67 390\n"" 1274 345 357 275 390\n"" 1275 77 196 185 340\n"" 1276 77 271 196 340\n"" 1277 187 190 118 340\n"" 1278 118 270 187 340\n"" 1279 256 332 130 343\n"" 1280 67 325 176 343\n"" 1281 67 329 259 343\n"" 1282 67 332 329 343\n"" 1283 329 332 259 343\n"" 1284 298 357 297 390\n"" 1285 227 353 207 386\n"" 1286 344 346 127 385\n"" 1287 203 346 275 385\n"" 1288 348 350 280 386\n"" 1289 67 330 325 343\n"" 1290 325 330 259 343\n"" 1291 259 330 67 343\n"" 1292 284 350 207 386\n"" 1293 280 350 284 386\n"" 1294 207 353 284 386\n"" 1295 130 276 206 346\n"" 1296 130 332 276 346\n"" 1297 129 276 81 346\n"" 1298 276 277 81 346\n"" 1299 81 277 129 346\n"" 1300 203 332 275 346\n"" 1301 275 332 130 346\n"" 1302 53 348 213 386\n"" 1303 284 353 132 386\n"" 1304 280 348 211 350\n"" 1305 211 348 53 350\n"" 1306 85 281 131 387\n"" 1307 207 284 279 350\n"" 1308 279 284 131 350\n"" 1309 207 279 208 350\n"" 1310 208 279 131 350\n"" 1311 333 211 32 350\n"" 1312 333 347 211 350\n"" 1313 32 347 333 350\n"" 1314 350 351 284 387\n"" 1315 85 291 281 387\n"" 1316 281 381 351 387\n"" 1317 240 336 186 377\n"" 1318 313 368 108 377\n"" 1319 21 268 171 382\n"" 1320 171 221 96 382\n"" 1321 268 335 171 382\n"" 1322 218 287 136 388\n"" 1323 54 383 218 388\n"" 1324 218 383 142 388\n"" 1325 142 383 226 388\n"" 1326 82 261 131 351\n"" 1327 261 280 131 351\n"" 1328 284 350 280 351\n"" 1329 280 350 131 351\n"" 1330 226 227 19 353\n"" 1331 85 354 291 387\n"" 1332 131 351 350 387\n"" 1333 150 231 229 361\n"" 1334 88 360 224 361\n"" 1335 279 284 85 387\n"" 1336 281 291 212 387\n"" 1337 135 287 217 355\n"" 1338 150 302 231 361\n"" 1339 217 287 38 355\n"" 1340 283 284 212 354\n"" 1341 132 353 283 389\n"" 1342 118 340 190 389\n"" 1343 190 340 271 389\n"" 1344 271 383 19 389\n"" 1345 138 288 139 356\n"" 1346 176 368 31 384\n"" 1347 102 167 168 356\n"" 1348 101 219 200 356\n"" 1349 200 219 102 356\n"" 1350 167 18 168 356\n"" 1351 168 18 101 356\n"" 1352 101 290 219 356\n"" 1353 54 290 101 356\n"" 1354 138 218 54 356\n"" 1355 54 288 138 356\n"" 1356 259 376 322 384\n"" 1357 325 368 176 384\n"" 1358 168 200 102 356\n"" 1359 101 200 168 356\n"" 1360 176 253 67 357\n"" 1361 176 308 253 357\n"" 1362 307 310 144 364\n"" 1363 266 365 100 392\n"" 1364 135 291 282 360\n"" 1365 222 291 135 360\n"" 1366 282 291 212 360\n"" 1367 291 292 212 360\n"" 1368 212 292 282 360\n"" 1369 58 222 151 360\n"" 1370 58 224 222 360\n"" 1371 151 224 58 360\n"" 1372 22 231 150 362\n"" 1373 220 231 22 362\n"" 1374 241 294 151 360\n"" 1375 241 302 294 360\n"" 1376 282 302 287 360\n"" 1377 302 355 287 360\n"" 1378 282 287 135 360\n"" 1379 287 355 135 360\n"" 1380 241 355 302 360\n"" 1381 151 355 241 360\n"" 1382 294 295 151 361\n"" 1383 151 360 294 361\n"" 1384 204 205 17 363\n"" 1385 205 304 17 363\n"" 1386 132 324 213 386\n"" 1387 17 304 232 363\n"" 1388 250 320 169 368\n"" 1389 113 326 311 365\n"" 1390 274 372 225 397\n"" 1391 238 312 145 393\n"" 1392 372 395 317 397\n"" 1393 144 307 89 367\n"" 1394 89 307 145 367\n"" 1395 181 264 45 365\n"" 1396 249 266 181 365\n"" 1397 311 326 255 365\n"" 1398 310 311 144 364\n"" 1399 144 311 307 364\n"" 1400 176 313 262 368\n"" 1401 169 320 31 368\n"" 1402 144 366 307 367\n"" 1403 169 323 250 368\n"" 1404 232 366 89 367\n"" 1405 112 363 17 367\n"" 1406 275 346 344 385\n"" 1407 317 395 371 397\n"" 1408 145 367 307 393\n"" 1409 363 364 233 393\n"" 1410 363 367 112 393\n"" 1411 164 266 100 392\n"" 1412 307 364 238 393\n"" 1413 112 367 312 393\n"" 1414 165 365 113 392\n"" 1415 311 365 178 392\n"" 1416 12 99 164 392\n"" 1417 173 359 274 372\n"" 1418 248 373 116 398\n"" 1419 245 317 42 371\n"" 1420 42 317 152 371\n"" 1421 161 245 42 371\n"" 1422 42 247 161 371\n"" 1423 161 247 246 371\n"" 1424 246 296 161 371\n"" 1425 154 296 246 371\n"" 1426 154 316 296 371\n"" 1427 246 247 154 371\n"" 1428 152 154 35 371\n"" 1429 154 247 35 371\n"" 1430 35 247 152 371\n"" 1431 152 370 154 371\n"" 1432 114 373 248 398\n"" 1433 179 301 155 398\n"" 1434 114 179 70 398\n"" 1435 24 114 70 398\n"" 1436 153 370 152 371\n"" 1437 154 369 316 371\n"" 1438 154 370 369 371\n"" 1439 316 369 153 371\n"" 1440 369 370 153 371\n"" 1441 215 388 287 399\n"" 1442 278 284 84 399\n"" 1443 231 299 140 374\n"" 1444 299 319 140 374\n"" 1445 45 299 230 374\n"" 1446 45 319 299 374\n"" 1447 230 319 45 374\n"" 1448 45 365 249 375\n"" 1449 249 365 181 375\n"" 1450 181 365 45 375\n"" 1451 311 364 69 391\n"" 1452 259 343 111 376\n"" 1453 111 214 175 376\n"" 1454 175 280 261 376\n"" 1455 224 361 151 295\n"" 1456 82 351 331 376\n"" 1457 127 203 109 385\n"" 1458 50 344 127 385\n"" 1459 82 331 261 376\n"" 1460 261 331 175 376\n"" 1461 250 251 108 377\n"" 1462 108 323 250 377\n"" 1463 122 251 250 377\n"" 1464 250 323 122 377\n"" 1465 188 240 186 377\n"" 1466 186 268 188 377\n"" 1467 240 326 57 377\n"" 1468 326 336 57 377\n"" 1469 57 336 240 377\n"" 1470 108 325 253 379\n"" 1471 170 327 253 379\n"" 1472 253 327 108 379\n"" 1473 252 283 170 380\n"" 1474 212 283 88 380\n"" 1475 212 330 283 380\n"" 1476 330 379 283 380\n"" 1477 283 379 170 380\n"" 1478 253 330 67 380\n"" 1479 330 358 67 380\n"" 1480 67 358 253 380\n"" 1481 21 249 162 382\n"" 1482 300 358 141 380\n"" 1483 292 300 141 380\n"" 1484 77 195 96 382\n"" 1485 88 292 212 380\n"" 1486 292 330 212 380\n"" 1487 330 351 259 381\n"" 1488 172 329 259 381\n"" 1489 259 351 172 381\n"" 1490 212 351 330 381\n"" 1491 141 342 328 381\n"" 1492 328 342 258 381\n"" 1493 142 353 226 383\n"" 1494 226 353 19 383\n"" 1495 142 339 271 383\n"" 1496 274 359 173 390\n"" 1497 225 298 297 390\n"" 1498 31 320 214 384\n"" 1499 250 322 320 384\n"" 1500 320 322 214 384\n"" 1501 111 376 343 384\n"" 1502 214 376 111 384\n"" 1503 111 263 214 384\n"" 1504 111 343 263 384\n"" 1505 53 378 227 386\n"" 1506 213 378 53 386\n"" 1507 203 385 275 390\n"" 1508 132 351 284 386\n"" 1509 284 351 280 386\n"" 1510 280 351 132 386\n"" 1511 109 385 203 390\n"" 1512 109 359 297 390\n"" 1513 351 381 212 387\n"" 1514 212 381 281 387\n"" 1515 131 281 82 387\n"" 1516 281 351 82 387\n"" 1517 82 351 131 387\n"" 1518 313 148 323 240\n"" 1519 136 287 215 388\n"" 1520 215 352 136 388\n"" 1521 136 352 54 388\n"" 1522 54 138 136 388\n"" 1523 54 218 138 388\n"" 1524 138 218 136 388\n"" 1525 283 353 142 389\n"" 1526 190 378 118 389\n"" 1527 324 340 270 389\n"" 1528 270 340 118 389\n"" 1529 378 386 213 389\n"" 1530 213 386 324 389\n"" 1531 132 386 353 389\n"" 1532 324 386 132 389\n"" 1533 118 378 213 389\n"" 1534 213 270 118 389\n"" 1535 213 324 270 389\n"" 1536 275 385 345 390\n"" 1537 345 385 109 390\n"" 1538 67 358 329 390\n"" 1539 329 358 274 390\n"" 1540 181 265 95 391\n"" 1541 99 265 181 391\n"" 1542 181 365 99 391\n"" 1543 178 265 99 391\n"" 1544 99 365 178 391\n"" 1545 233 364 310 393\n"" 1546 310 366 233 393\n"" 1547 304 363 233 393\n"" 1548 304 366 363 393\n"" 1549 233 366 304 393\n"" 1550 310 364 307 393\n"" 1551 308 363 176 393\n"" 1552 176 363 112 393\n"" 1553 312 313 262 393\n"" 1554 262 313 308 393\n"" 1555 144 310 307 393\n"" 1556 144 366 310 393\n"" 1557 307 366 144 393\n"" 1558 262 308 176 393\n"" 1559 112 262 176 393\n"" 1560 112 312 262 393\n"" 1561 223 341 274 397\n"" 1562 341 372 274 397\n"" 1563 223 396 341 397\n"" 1564 394 395 372 397\n"" 1565 394 396 395 397\n"" 1566 395 396 371 397\n"" 1567 371 396 293 397\n"" 1568 341 396 394 397\n"" 1569 341 394 20 397\n"" 1570 394 372 20 397\n"" 1571 20 372 341 397\n"" 1572 279 284 278 399\n"" 1573 279 354 284 399\n"" 1574 216 287 282 399\n"" 1575 215 287 216 399\n"" 1576 142 353 284 399\n"" 1577 284 354 142 399\n"" 1578 226 353 142 399\n"" 1579 142 388 226 399\n""# Generated by tetgen -a0.01 cube.smesh \n"); } +static const char* getNodes() { return( +"400 3 0 0\n"" 0 1 1 -1\n"" 1 1 -1 -1\n"" 2 -1 -1 -1\n"" 3 1 1 1\n"" 4 -1 -1 1\n"" 5 -1 1 -1\n"" 6 1 -1 1\n"" 7 -1 1 1\n"" 8 -1 -1 -0.000116\n"" 9 0.00039500000000000006 -1 1\n"" 10 1 -1 -0.00065799999999999995\n"" 11 1 0.00061700000000000004 -1\n"" 12 0.00098999999999999999 1 -1\n"" 13 -1 1 0.00045400000000000008\n"" 14 0.00052800000000008396 1 1\n"" 15 1 1 -0.00038699999999991519\n"" 16 -1 -5.9999999999504894e-006 1\n"" 17 -1 0.00021000000000004349 -1\n"" 18 1 0.00067400000000006344 1\n"" 19 1.0863393114549872e-007 3.0682525964387253e-008 1\n"" 20 0.00097299999999989062 -1 -1\n"" 21 -1.4065544284846965e-008 1 5.0429866114086973e-008\n"" 22 1 -7.0792689266241382e-008 -4.4728299621228391e-008\n"" 23 8.4069120565846353e-008 3.8392827594879719e-007 -1\n"" 24 1 0.49980668112692161 -0.4996917965899465\n"" 25 1 0.50006700000000004 -1\n"" 26 1 1 -0.50034809999999996\n"" 27 1 1 0.50025040000000009\n"" 28 0.50020930000000008 1 1\n"" 29 -1 0.50010129999999997 1\n"" 30 -0.49958379999999991 1 1\n"" 31 -1 9.2038384777827427e-008 -1.100605984127867e-008\n"" 32 -0.5001201999999999 -1 1\n"" 33 1.0486788869007099e-007 -1 -3.3620911388254626e-008\n"" 34 -1 -1 0.50008699999999995\n"" 35 1 -0.50010220000000005 -1\n"" 36 1 -1 -0.49985400000000002\n"" 37 1 -0.4996526 1\n"" 38 1 -1 0.49990490000000004\n"" 39 -0.49930649999999999 1 -1\n"" 40 -1 1 -0.50002420000000003\n"" 41 1 -0.24974260000000004 -0.50015432157969908\n"" 42 0.50015422769290296 -0.24974260000000001 -1\n"" 43 0.50009680402228707 1 0.24993170000000009\n"" 44 1 0.50009675187018254 0.24993170000000009\n"" 45 0.24987467313200107 0.24987468273492527 -0.24987454967853764\n"" 46 0.50006970000000006 1 -1\n"" 47 -1 1 0.50062509999999982\n"" 48 -0.24952789999999991 1 0.50013191885453001\n"" 49 -0.24952789999999991 0.50013187836130635 1\n"" 50 -1 -0.50000239999999996 -1\n"" 51 -0.49917350000000005 -1 -1\n"" 52 -1 -0.37500110896930483 0.49999770999384097\n"" 53 -0.49999768418870116 -0.37500109958532857 1\n"" 54 0.50016842960649455 -0.24948929999999997 1\n"" 55 1 -0.24948929999999997 0.50016837821653382\n"" 56 -1 0.50011355427218929 -0.24978510000000004\n"" 57 -0.50011349993113807 1 -0.24978510000000009\n"" 58 0.49983560886453382 -1 -0.25025600000000003\n"" 59 1 -0.24959280000000006 -1\n"" 60 0.46861653427920624 0.31279234072878337 -1\n"" 61 0.46874721181012263 1 -0.31263609558485356\n"" 62 1 1 0.24986720000000007\n"" 63 1 0.50004500000000007 1\n"" 64 0.41666006216462159 0.41668749191836219 1\n"" 65 1 0.62492318088559184 0.62497446433589154\n"" 66 0.62493687874554793 1 0.62494713479954256\n"" 67 -0.32510780807963724 -0.32510780489834346 -0.32510793388507692\n"" 68 1 0.12495484505171366 -0.3748231366627352\n"" 69 -0.24915825000000003 0.50024732783000192 -1\n"" 70 1 0.74957571448653726 -0.74971600694021778\n"" 71 0.64874656072370729 1 -0.64882932411306993\n"" 72 0.6488668035834122 0.64886599996407779 -1\n"" 73 -1 0.41673079803079871 0.41664307505523179\n"" 74 -0.62468209179782908 1 0.62494186195929313\n"" 75 -0.62476903429567798 0.62489835940819183 1\n"" 76 -1 0.75020764999999989 1\n"" 77 0.12520010648567331 0.45856412436943739 0.37477910185628149\n"" 78 -0.24942439999999994 1 1\n"" 79 -0.37474797737976173 1 0.74996984889996166\n"" 80 -0.3748348177892612 0.74992638728967431 1\n"" 81 -1 -1 -0.49994339999999993\n"" 82 -0.50002894420427402 -1 0.24998549999999997\n"" 83 -1 -0.50045000000000006 1\n"" 84 -0.015617775048046156 -0.5000062299955631 1\n"" 85 -0.062520154989433377 -1 0.50002475010607028\n"" 86 0.50024029999999997 -1 1\n"" 87 1 -0.24929619999999997 1\n"" 88 0.37505270907528421 -0.3750526949043349 0.12522791934472338\n"" 89 -1 0.5001348000000001 -1\n"" 90 -1 1 -0.24999450000000001\n"" 91 1 -0.62477132796083668 -0.25025600000000003\n"" 92 0.50052129999999995 -1 -1\n"" 93 1 0.018238422269637886 -0.6785517711937521\n"" 94 0.750039598406532 -0.12448790000000004 -1\n"" 95 0.32367160517680327 0.022514689090561368 -0.65701963759824777\n"" 96 0.32369468988306127 0.65698780035674154 -0.022395524628340657\n"" 97 1 1 -0.25020424999999996\n"" 98 1 0.62501462613012171 -0.12492844204372336\n"" 99 0.16205966081319645 0.60689608104137205 -1\n"" 100 0.23307615322925276 1 -0.65509826790501591\n"" 101 0.6349049175761754 0.105723024682608 1\n"" 102 1 0.18290638148392097 0.59627500837254621\n"" 103 0.67708420758319754 0.67702605426027662 1\n"" 104 1 0.7498625000000001 1\n"" 105 0.75029925000000008 1 1\n"" 106 0.75006454389022692 1 0.37500606926950353\n"" 107 1 0.7500645207487896 0.37502882687227923\n"" 108 -0.39273716375981493 0.28664398202145958 -0.051638660454459806\n"" 109 -0.41671246738153483 -0.41657507574696978 -1\n"" 110 -0.24910025000000008 -1 -0.50024283860374685\n"" 111 -1 -0.50000177258228129 0.01562108247952367\n"" 112 -1 0.062713405747402015 -0.49998686350971472\n"" 113 -0.21672667787876426 1 -0.60296047487967241\n"" 114 1 0.7499052299192317 -0.37495181123207261\n"" 115 0.74540338978064358 1 -0.37527617499999999\n"" 116 0.52159008257288741 0.55923294709068649 -0.50062662770660094\n"" 117 0.75009235000000007 1 -1\n"" 118 -0.52928249862025711 0.10679011696853863 1\n"" 119 -1 0.034077217919757319 0.58381620432891879\n"" 120 -1 0.7383278941763165 0.25053954999999994\n"" 121 -0.70891631291249579 1 0.25053954999999989\n"" 122 -0.46050965421976553 0.49218708190674731 0.49218708126315491\n"" 123 -1 0.68039176952095026 0.65291562053589947\n"" 124 0.10567541850782136 0.6349221513724419 1\n"" 125 0.18288602711749127 1 0.59629803533945958\n"" 126 0.54298856425431818 0.54298737875163716 0.56762073808494473\n"" 127 -0.67702799351191578 -0.67732215502802495 -1\n"" 128 -0.74942264999999997 -1 -1\n"" 129 -1 -1 -0.74980449999999998\n"" 130 -1 -0.49218854513728494 -0.49218946358719012\n"" 131 -0.42414945787750447 -1 0.62500198796368489\n"" 132 -0.34611026252144428 -0.35284219355707647 0.34611025416343177\n"" 133 -1 -0.25018009999999996 1\n"" 134 1 -0.62478846817134759 0.62485153607962096\n"" 135 0.46873640237350567 -1 0.46875741869756882\n"" 136 0.62487945516234578 -0.62473271086601501 1\n"" 137 1 -1 0.75017445000000005\n"" 138 0.74996116568713633 -0.37481680473944939 1\n"" 139 1 -0.37487247538331225 0.74993327711783697\n"" 140 0.52037384429375466 0.13732055395658338 0.20134643019667742\n"" 141 0.15110486348630267 -0.58850137906978839 -0.32248691722782763\n"" 142 0.18460607304185575 -0.25601325165021294 0.59072519783751942\n"" 143 0.58280144730296801 -0.1236683742487249 -0.25429890766156527\n"" 144 -0.62459780071323356 0.62480472798869868 -1\n"" 145 -1 0.62491663124728913 -0.6248890159372763\n"" 146 -0.62484746422599169 1 -0.62502715932999464\n"" 147 -0.7093663193037405 1 -0.043380902757278066\n"" 148 -1 0.70881555044570888 -0.042280622034258974\n"" 149 1 -1 -0.25034290000000009\n"" 150 1 -0.40640338795560693 0.10958986646960317\n"" 151 0.62965348921187414 -1 0.11553823232370244\n"" 152 0.62491481284490769 -0.62481034920526324 -1\n"" 153 0.62518044398996542 -1 -0.62501367730297908\n"" 154 1 -0.63771354537448766 -0.63764519345816328\n"" 155 1 0.31875234539841601 -0.74994017167142224\n"" 156 1 0.25014510000000001 -1\n"" 157 0.74289722234692146 0.382058894292784 -1\n"" 158 0.32367160517680327 0.022514689090561313 -1\n"" 159 -0.16523027793533418 0.12134647368575949 -0.52708319267772263\n"" 160 0.66127538009577513 0.12758426427554953 -1\n"" 161 0.66190311587317174 -0.14472935797430672 -0.63288146125613987\n"" 162 0.32369468988306133 1 -0.022395524628340657\n"" 163 0.66678290425073372 1 -0.041514421404229618\n"" 164 0.25040265000000006 1 -1\n"" 165 0.0399620660587649 1 -0.35479393735090492\n"" 166 0.39507172571995386 0.7484116421252891 -1\n"" 167 1 -0.072369672334633761 0.72403943393322545\n"" 168 1 0.25022030000000006 1\n"" 169 -1 0.34715093732334323 0.069506853183406409\n"" 170 0.004224600474193374 -0.00030510666109673235 0.14430736392114327\n"" 171 -0.094962845556292308 0.5834952204256858 0.029410273259612763\n"" 172 -0.37516021595805987 -1 -0.12532788579913123\n"" 173 -0.24910025000000008 -0.73780528173239301 -1\n"" 174 -0.24899625000000003 -1 -1\n"" 175 -1 -0.68752594294730018 0.32233197415569781\n"" 176 -0.63898818329694262 -0.019780155017187176 -0.25640753531059018\n"" 177 -0.24918545000000003 1 -1\n"" 178 -0.090115044090208485 0.73312064098608642 -1\n"" 179 0.70087100707296945 0.7030864101348856 -0.70306291837965817\n"" 180 0.43929348327839085 1 -0.54468859277252801\n"" 181 0.24904127574612012 0.39074020564473289 -0.70186910867307939\n"" 182 1 0.37487410261969639 -0.24965440370335262\n"" 183 -1 0.25002235 1\n"" 184 -1 0.3834446703544917 0.71903607815447956\n"" 185 -0.1156880925075553 0.64434016438489528 0.64434017606689242\n"" 186 -0.49172745225271947 1 0.39835250767529351\n"" 187 -0.49767862299671706 0.38046779215689319 1\n"" 188 -0.71839703681869116 0.71780974657570373 0.44934935063382636\n"" 189 -0.51344827724776054 0.71469177745101886 0.71472798522876002\n"" 190 -0.23617534848477656 0.19448005635194549 1\n"" 191 0.10846459384596518 0.30820266021358389 1\n"" 192 0.25057285000000007 1 1\n"" 193 0.017230183845622971 1 0.32091029596366771\n"" 194 0.73101248242769623 0.7310147155780512 0.70877874225568527\n"" 195 0.31697048198150773 0.74665075980915008 0.4006579958540028\n"" 196 0.22826577744747956 0.47891948624469016 0.71004422740180217\n"" 197 1 0.41190390341165745 0.48757967789479273\n"" 198 0.39445308838583859 1 0.75656358081536812\n"" 199 0.37539107500000007 0.73916688955610543 1\n"" 200 1 0.37513265000000007 0.77169890914285255\n"" 201 0.73942011355234571 0.37513265000000007 1\n"" 202 0.63994038137069154 0.63994036678159205 0.2035446667438317\n"" 203 -0.46370016318896046 -0.62998103084618617 -0.61483850042635191\n"" 204 -1 -0.21786745446900305 -0.71882640763337879\n"" 205 -0.7381625142245487 -0.24989619999999996 -1\n"" 206 -1 -0.68409919087038817 -0.74320185410965045\n"" 207 -0.32233403971208485 -0.68753538843092254 1\n"" 208 -0.24999429999999997 -1 1\n"" 209 -1 -0.68747379665002328 0.68733786195201785\n"" 210 -1 -1 0.74993719999999997\n"" 211 -0.68734034505209507 -0.68746383783523624 1\n"" 212 0.012621642749083783 -0.62121055252239044 0.25549907282899653\n"" 213 -0.6302385799280833 -0.18856073836207951 0.63023858315073289\n"" 214 -1 -0.24375245663389172 0.20780956095073669\n"" 215 0.27457426263537876 -0.71671644193112283 1\n"" 216 0.25031765 -1 0.74826556642116959\n"" 217 0.67415846717387884 -1 0.72313083855082583\n"" 218 0.62503542334105555 -0.31221159888129457 0.62503541050290967\n"" 219 0.5971993096065894 0.14306806366195202 0.59872066564664705\n"" 220 1 0.017233350071975677 0.32090429254255515\n"" 221 0.26312362546126472 0.33468192363906535 0.084065768486193945\n"" 222 0.32197792152690552 -1 0.018797337932729474\n"" 223 0.18800195544968995 -1 -0.56289551925444881\n"" 224 0.57038729142869704 -0.57307887210152808 -0.20881754066389768\n"" 225 -0.0086896099297664228 -0.40801963637004723 -1\n"" 226 0.18460607304185569 -0.25601325165021294 1\n"" 227 -0.20780680948491165 -0.24375608761730455 1\n"" 228 0.16210795897650465 -0.16280891134401318 -0.30907215240469521\n"" 229 1 -0.26636148213032163 -0.17942676839456378\n"" 230 0.56446572384612781 0.1973176117738667 -0.43724659666019622\n"" 231 0.68853374013319157 -0.17744483013216472 0.09783510961497599\n"" 232 -1 0.25009230000000005 -1\n"" 233 -0.44245798368554617 0.091797696559903857 -1\n"" 234 -0.37472098690918887 0.74987909210814685 -1\n"" 235 -1 0.75000438735900432 -0.37495636858710685\n"" 236 -0.74996704638216471 1 -0.37508384505925174\n"" 237 -1 0.74990679999999998 -1\n"" 238 -0.54712707263607874 0.54712707774677038 -0.44245689687343565\n"" 239 -0.74990204999999999 1 -1\n"" 240 -0.72822316548562926 0.72874031845750664 0.1036085388532241\n"" 241 1 -0.71873547817891748 0.28112338497214717\n"" 242 1 -1 0.24972335000000001\n"" 243 0.75048264999999992 -1 -1\n"" 244 0.74989614566839657 -1 -0.37495931701899499\n"" 245 0.32778297288621805 -0.39528027615360428 -0.64821309452322518\n"" 246 1 -0.38051416654716286 -0.74727639147947866\n"" 247 0.75568696149005932 -0.39170758577960507 -1\n"" 248 0.67082477453227773 0.69774082076774491 -0.21670307025395311\n"" 249 0.25644629494787752 0.72897062001391455 -0.35498913750943906\n"" 250 -0.66044139980269567 0.12332997433814857 0.28570391360731856\n"" 251 -0.20800059812674501 0.28777064045558248 0.28593682199556314\n"" 252 0.29133599196527848 -0.095788071590640317 0.30648986161740821\n"" 253 -0.19340828105680374 -0.0068671095901119807 -0.17510149752792639\n"" 254 -0.21084753812463372 1 -0.20339622724796672\n"" 255 -0.098922382084248209 0.356624117376247 -0.256263439404529\n"" 256 -1 -0.74213790787259271 -0.24206983063972595\n"" 257 -0.72511478181115718 -1 -0.25002969999999997\n"" 258 -0.1250383368944159 -1 -0.24987830054645518\n"" 259 -0.5432409326212666 -0.58336779772250913 -0.0060938376146522089\n"" 260 -1 -1 0.25020549999999997\n"" 261 -0.69517902037783963 -1 0.48465629903462193\n"" 262 -1 0.19801494027267907 -0.22908951271298833\n"" 263 -1 -0.21170789004360985 -0.2804810168349573\n"" 264 0.12431896494966958 0.19380761445281547 -0.51506516411314296\n"" 265 0.016877018602808991 0.32057899216794972 -1\n"" 266 0.31815206866103007 0.69886802178230512 -0.69773364246572678\n"" 267 1 0.29452437620263039 0.03597223402760958\n"" 268 -0.23854616157962166 0.70039865549364788 0.32382827237146705\n"" 269 -0.072417036863037423 1 0.7240118059209224\n"" 270 -0.65715846697692126 0.26022065746019457 0.6943166148678479\n"" 271 0.032006652383344852 0.12877070459954792 0.60754383991332461\n"" 272 0.70679839053632465 0.35784100137989416 0.35408213575434944\n"" 273 1 0.75583880296190964 0.10796710954834202\n"" 274 -0.066417091587110066 -0.67493516441615642 -0.64835749920354258\n"" 275 -0.66000110931003353 -0.29732769674682547 -0.5356675566159671\n"" 276 -1 -0.7460956789293286 -0.49597432811515113\n"" 277 -0.63537062135554268 -1 -0.62487395000000001\n"" 278 -0.072189529852730625 -0.75207129129950046 1\n"" 279 -0.12479964999999998 -1 0.76180792382505302\n"" 280 -0.64633703603487636 -0.58450521092750218 0.50482020379778969\n"" 281 -0.19793040641595078 -1 0.22917284009874619\n"" 282 0.36430902573049584 -0.60319992435881997 0.46610302519244695\n"" 283 -0.014560432971481855 -0.28974170434477692 0.31899501601243035\n"" 284 -0.16677858939457951 -0.59736466720530357 0.62746423626615599\n"" 285 -0.70838149553417962 -0.14588171485233958 1\n"" 286 -1 -0.20773576611374234 0.72382280144202749\n"" 287 0.65401865792186442 -0.65865126715652123 0.6540215253821221\n"" 288 0.76868552550191671 -0.1162896631221611 1\n"" 289 0.39236022879703553 0.3070079448900544 0.42979647060190596\n"" 290 0.3368388593683827 0.015623435483033674 1\n"" 291 0.19283437348027005 -1 0.30983198636425424\n"" 292 0.23987671409711908 -0.66618838122351409 0.0008945936534150746\n"" 293 0.42213117252176491 -0.74712687995942406 -0.48458654817973601\n"" 294 1 -0.66026812967233972 0.017464640590841476\n"" 295 0.76163529643898698 -1 -0.11209435873849422\n"" 296 0.71607191560259942 -0.37037315933178871 -0.41086960011962592\n"" 297 -0.21716346053460103 -0.19947717862659675 -1\n"" 298 -0.066700914192858729 -0.25756978212559839 -0.62896708724727191\n"" 299 0.32965714090299714 -0.016623876027232615 -0.04345086208713933\n"" 300 0.3771146741942551 -0.33750921003054202 -0.17865283786030017\n"" 301 0.68867680851486557 0.35765454098697025 -0.68521532739244984\n"" 302 0.68683764447685003 -0.49596319168560488 0.30085803648362652\n"" 303 0.7090270874729655 -0.090415723473831255 0.40719961870896915\n"" 304 -0.71897798523587353 0.032300798531047246 -1\n"" 305 -0.78106895850102998 0.78106955040650416 -1\n"" 306 -1 1 -0.75022459999999991\n"" 307 -0.6917164744917017 0.69170418541265011 -0.69178840942223951\n"" 308 -0.44874465612278081 0.23033846865992608 -0.37975265656437374\n"" 309 -0.42791646676676653 1 -0.48213646482850109\n"" 310 -0.50093773209802361 0.36943796178744326 -1\n"" 311 -0.27376979380830829 0.64426231976101334 -0.66489790575084351\n"" 312 -1 0.35637030336560244 -0.50592472907968644\n"" 313 -0.67546025565396317 0.47435524682845248 -0.12755140965778172\n"" 314 1 -1 -0.74991180000000002\n"" 315 1 -0.75028080000000008 -1\n"" 316 0.75389683099717963 -0.68868788457723729 -0.44203141186583489\n"" 317 0.30599251534318156 -0.52261127269823027 -1\n"" 318 0.40047237565428867 -0.18178393484624253 -0.46933497457143036\n"" 319 0.59482353914036401 0.38624515090984007 -0.049897636224658731\n"" 320 -1 0.12332997433814856 0.2857039136073185\n"" 321 -1 -0.14689524813441618 0.42688908174824769\n"" 322 -0.66262979736993932 -0.22367581355790006 0.28652907305244368\n"" 323 -0.73506511384989526 0.43296210769478211 0.23284828493726362\n"" 324 -0.35917397776062404 -0.0011820981956873755 0.46134022362807492\n"" 325 -0.46329592253134338 -0.04321417701540118 0.047101266600350966\n"" 326 -0.27019578023748486 0.66094639539627242 -0.2626201492532621\n"" 327 -0.034393111593928383 0.28261880242562187 0.033764464745287937\n"" 328 0.18250360638285329 -1 -0.25535398043003921\n"" 329 -0.3030416241215706 -0.68638401151842854 -0.29392180366815041\n"" 330 -0.20024923856661142 -0.43390131265744347 0.010814269493628442\n"" 331 -0.70928533124789683 -1 0.043514240508664342\n"" 332 -0.66723744746271052 -0.6603325322519602 -0.32775579384930814\n"" 333 -0.75004930000000003 -1 1\n"" 334 -0.19527119007052851 0.17101403421852743 -1\n"" 335 0.035377884590221398 0.72616811699961958 0.38837547693302749\n"" 336 -0.3958963327893722 1 0.076655950240576198\n"" 337 -1 0.21457329427678187 0.47543850615348943\n"" 338 -0.7309823244201562 0.04824246580043276 0.53867561355267524\n"" 339 0.31731660817460328 0.019726050398274825 0.58867762989660533\n"" 340 -0.23374781763549932 0.32728908975345111 0.68606341552187544\n"" 341 -0.05707064185106852 -1 -0.71659883209883557\n"" 342 0.025895325626349025 -1 -0.41197380535174077\n"" 343 -0.63238580600180661 -0.3446250983839011 -0.21239475499198135\n"" 344 -1 -0.44899498782248648 -0.76904522126668295\n"" 345 -0.47299161220497166 -0.16458691872110107 -1\n"" 346 -0.71473237282422963 -0.73570249654826969 -0.71737349776128545\n"" 347 -0.74042724546706096 -1 0.74043153378626769\n"" 348 -0.75006482996996637 -0.43746254158362985 1\n"" 349 -1 -0.45163184813329721 0.75853196322407168\n"" 350 -0.50484417551448635 -0.72312317896459377 0.74770602252103513\n"" 351 -0.40758966352762416 -0.67845102844514626 0.2869272680702189\n"" 352 0.34674400209661604 -0.46348651949776365 1\n"" 353 -0.064367666161959269 -0.33637242545568102 0.74735946563471645\n"" 354 0.092602515587840606 -0.73476755239921543 0.53136369836931496\n"" 355 0.7405253302829875 -1 0.37931276242110001\n"" 356 0.72074474478028516 -0.071123657589263783 0.72858260191381197\n"" 357 -0.37493998320650845 -0.13123609584112483 -0.59370675998889832\n"" 358 -0.038352185780633007 -0.36921106178200458 -0.36036098843849301\n"" 359 -0.21058188105209746 -0.51336343843000509 -1\n"" 360 0.48755585676167218 -0.72413212665883209 0.19600157800093837\n"" 361 0.72678157399644117 -0.45646629587434373 0.011780680786240783\n"" 362 1 -0.2170765504241112 0.26033741814256661\n"" 363 -0.74541512030390267 -0.021189991595686748 -0.68170217165320612\n"" 364 -0.37387254482300358 0.32527982613660117 -0.69267828171913437\n"" 365 0.014913421017989981 0.548850834537849 -0.51262186425268497\n"" 366 -0.74537069514237131 0.2884463439624349 -1\n"" 367 -1 0.37511355000000007 -0.76842458715696027\n"" 368 -0.68532657097754035 0.18056419100293586 -0.02075972921423834\n"" 369 0.78133395148913365 -1 -0.78126287896225588\n"" 370 0.78115294817471781 -0.78112807555219699 -1\n"" 371 0.59082087507768066 -0.57000731366339108 -0.68829605397498683\n"" 372 0.062122976656860403 -0.70293283755163305 -1\n"" 373 0.71559274300689513 0.42281759201802555 -0.31813908171117911\n"" 374 0.7564597747876356 0.13217713297538497 -0.16417576007580004\n"" 375 0.40814884545639363 0.4915141193769953 -0.2436752542444009\n"" 376 -0.75696767061236314 -0.5164837362163468 0.21622587965261447\n"" 377 -0.452391830423859 0.55519361636450704 0.12429201972918034\n"" 378 -0.43481019055019038 -0.12925317405502307 1\n"" 379 -0.24742795067222612 -0.11366422696012682 0.2223275751188645\n"" 380 -0.006677616808027087 -0.21615237698969206 -0.065426614396930594\n"" 381 -0.062406752747729527 -0.70182414510247981 -0.087999792237402064\n"" 382 0.10306104864954116 0.76464771966531997 0.11700653142882178\n"" 383 0.27486783995540093 -0.12812237061584772 0.79536259891875982\n"" 384 -0.74059417471417499 -0.15757730258109431 0.00074049988054281091\n"" 385 -0.64002796579304344 -0.45394506207193958 -1\n"" 386 -0.42239397063762912 -0.42048979870740139 0.69490811148992537\n"" 387 -0.17195299402586212 -0.76346805360446235 0.40560748360163079\n"" 388 0.37676760090127209 -0.4417530820461561 0.70978247252690463\n"" 389 -0.20593363392839478 -0.044483242006169432 0.7439953909431003\n"" 390 -0.31521564832256066 -0.39420460209868968 -0.72065547292536469\n"" 391 -0.07315504595340451 0.34077703680706245 -0.71267230392230696\n"" 392 -0.0052948425242513517 1 -0.74523404665783877\n"" 393 -0.70127839101164502 0.30537699044254324 -0.64148488859352526\n"" 394 0.25061214999999992 -1 -1\n"" 395 0.40565131063307963 -0.76032995286218041 -1\n"" 396 0.38398614307047785 -1 -0.75304567260853106\n"" 397 0.23839244367761547 -0.68688896416028877 -0.73641430830181331\n"" 398 0.76674691103343318 0.57740125411814403 -0.50231823898754502\n"" 399 0.14110565781161721 -0.59279131304323562 0.77705687354697894\n""# Generated by tetgen -a0.01 cube.smesh \n"); } +static const char* getElements() { return( +"1580 4 0\n"" 0 120 148 13 240\n"" 1 77 251 185 268\n"" 2 126 194 66 198\n"" 3 297 298 159 357\n"" 4 13 148 147 240\n"" 5 219 272 102 303\n"" 6 134 137 37 136\n"" 7 302 360 88 361\n"" 8 23 264 95 391\n"" 9 307 311 238 364\n"" 10 57 309 254 326\n"" 11 345 357 233 363\n"" 12 176 343 325 384\n"" 13 275 332 67 343\n"" 14 141 245 228 318\n"" 15 108 368 323 377\n"" 16 7 47 74 123\n"" 17 73 188 184 270\n"" 18 56 235 148 313\n"" 19 46 72 117 179\n"" 20 66 105 28 194\n"" 21 205 275 204 344\n"" 22 66 194 28 198\n"" 23 96 221 45 375\n"" 24 93 160 94 161\n"" 25 225 317 245 397\n"" 26 121 186 74 188\n"" 27 213 280 52 322\n"" 28 52 322 280 376\n"" 29 96 195 77 221\n"" 30 8 257 256 331\n"" 31 358 380 330 381\n"" 32 99 181 166 266\n"" 33 120 123 73 188\n"" 34 122 189 187 340\n"" 35 141 292 224 300\n"" 36 313 326 240 377\n"" 37 203 274 173 390\n"" 38 140 299 221 319\n"" 39 44 197 107 272\n"" 40 171 326 108 377\n"" 41 71 166 46 179\n"" 42 69 364 334 391\n"" 43 26 114 97 115\n"" 44 228 253 159 358\n"" 45 221 272 202 289\n"" 46 123 184 73 188\n"" 47 22 220 140 231\n"" 48 250 324 322 325\n"" 49 270 324 213 338\n"" 50 147 240 57 336\n"" 51 69 265 178 391\n"" 52 100 249 165 365\n"" 53 296 316 224 371\n"" 54 74 188 186 189\n"" 55 21 171 165 249\n"" 56 23 297 225 298\n"" 57 191 196 64 290\n"" 58 87 139 138 288\n"" 59 126 198 196 199\n"" 60 223 328 141 342\n"" 61 293 371 153 396\n"" 62 238 308 108 313\n"" 63 49 187 80 189\n"" 64 143 300 224 361\n"" 65 111 256 130 343\n"" 66 62 107 106 273\n"" 67 64 196 126 219\n"" 68 314 154 315 369\n"" 69 50 205 204 344\n"" 70 0 70 26 71\n"" 71 95 158 23 265\n"" 72 37 138 87 139\n"" 73 125 193 43 195\n"" 74 56 312 238 313\n"" 75 257 259 172 332\n"" 76 25 70 0 72\n"" 77 141 300 228 358\n"" 78 32 207 208 350\n"" 79 101 201 200 219\n"" 80 13 147 121 240\n"" 81 67 275 176 357\n"" 82 116 249 180 266\n"" 83 197 219 200 272\n"" 84 152 247 42 371\n"" 85 95 158 60 160\n"" 86 45 230 116 375\n"" 87 88 282 142 283\n"" 88 96 162 61 249\n"" 89 209 280 211 350\n"" 90 84 353 226 399\n"" 91 33 258 172 381\n"" 92 118 285 213 378\n"" 93 196 271 77 289\n"" 94 282 287 218 388\n"" 95 196 198 125 199\n"" 96 74 7 76 30\n"" 97 95 230 181 264\n"" 98 297 359 225 390\n"" 99 280 347 261 350\n"" 100 253 299 170 380\n"" 101 125 269 193 335\n"" 102 245 293 224 300\n"" 103 41 143 68 161\n"" 104 58 295 244 316\n"" 105 83 348 211 349\n"" 106 75 29 76 123\n"" 107 171 249 96 255\n"" 108 124 196 125 199\n"" 109 61 248 96 249\n"" 110 221 255 45 327\n"" 111 254 326 171 336\n"" 112 194 198 126 199\n"" 113 208 278 9 279\n"" 114 94 93 11 160\n"" 115 275 357 345 363\n"" 116 127 173 109 203\n"" 117 134 139 55 218\n"" 118 45 255 253 327\n"" 119 154 35 315 370\n"" 120 283 284 142 353\n"" 121 186 336 268 377\n"" 122 59 93 11 94\n"" 123 110 203 51 277\n"" 124 59 246 94 247\n"" 125 116 248 61 249\n"" 126 41 229 143 296\n"" 127 91 154 36 316\n"" 128 71 179 116 180\n"" 129 45 299 221 327\n"" 130 319 373 182 374\n"" 131 64 219 101 290\n"" 132 116 301 179 398\n"" 133 122 323 188 377\n"" 134 182 373 68 374\n"" 135 97 115 114 248\n"" 136 60 158 95 181\n"" 137 185 268 48 335\n"" 138 66 125 43 195\n"" 139 86 215 136 287\n"" 140 106 202 163 273\n"" 141 43 106 66 195\n"" 142 271 324 283 389\n"" 143 95 158 42 245\n"" 144 186 188 122 189\n"" 145 25 179 157 301\n"" 146 173 274 110 341\n"" 147 136 138 37 287\n"" 148 244 293 58 316\n"" 149 107 197 65 272\n"" 150 42 160 158 161\n"" 151 28 105 103 194\n"" 152 200 201 126 219\n"" 153 147 235 90 236\n"" 154 224 292 141 293\n"" 155 220 272 140 303\n"" 156 4 209 83 211\n"" 157 207 278 208 279\n"" 158 296 300 143 318\n"" 159 226 352 84 399\n"" 160 104 65 63 194\n"" 161 212 282 88 283\n"" 162 255 308 238 364\n"" 163 150 229 91 361\n"" 164 43 163 106 202\n"" 165 126 219 196 289\n"" 166 48 185 79 189\n"" 167 257 329 110 332\n"" 168 170 299 252 380\n"" 169 30 74 75 76\n"" 170 30 79 78 80\n"" 171 39 234 146 307\n"" 172 218 252 142 339\n"" 173 185 251 77 340\n"" 174 102 200 197 219\n"" 175 49 189 185 340\n"" 176 213 348 286 349\n"" 177 133 286 285 348\n"" 178 65 197 126 272\n"" 179 187 189 49 340\n"" 180 213 285 53 378\n"" 181 63 194 65 200\n"" 182 131 279 85 387\n"" 183 120 169 148 323\n"" 184 197 200 126 272\n"" 185 46 166 72 179\n"" 186 15 248 98 273\n"" 187 98 114 24 373\n"" 188 46 180 100 266\n"" 189 22 231 140 374\n"" 190 171 335 77 382\n"" 191 27 106 62 107\n"" 192 255 264 159 391\n"" 193 132 325 322 379\n"" 194 240 323 313 377\n"" 195 155 160 93 301\n"" 196 221 299 170 327\n"" 197 158 160 95 161\n"" 198 79 80 30 189\n"" 199 178 365 311 391\n"" 200 16 285 133 286\n"" 201 249 255 171 365\n"" 202 188 270 73 323\n"" 203 162 165 61 249\n"" 204 107 126 65 194\n"" 205 155 156 93 160\n"" 206 219 303 102 356\n"" 207 259 330 132 351\n"" 208 224 293 141 300\n"" 209 77 271 170 289\n"" 210 231 252 140 299\n"" 211 147 240 148 313\n"" 212 152 370 153 395\n"" 213 154 246 35 247\n"" 214 291 354 212 387\n"" 215 211 348 280 349\n"" 216 144 234 39 307\n"" 217 212 292 33 381\n"" 218 133 348 83 349\n"" 219 119 337 270 338\n"" 220 120 188 73 323\n"" 221 211 280 209 349\n"" 222 209 211 333 347\n"" 223 251 325 108 379\n"" 224 236 238 146 309\n"" 225 274 329 110 342\n"" 226 39 305 144 307\n"" 227 144 305 89 307\n"" 228 96 249 248 375\n"" 229 113 178 177 392\n"" 230 91 294 224 295\n"" 231 94 160 42 161\n"" 232 165 171 21 326\n"" 233 170 324 251 379\n"" 234 211 347 209 350\n"" 235 116 179 115 398\n"" 236 214 263 31 384\n"" 237 70 117 71 0\n"" 238 43 195 96 202\n"" 239 90 235 40 236\n"" 240 134 136 37 287\n"" 241 67 253 159 357\n"" 242 33 328 258 381\n"" 243 71 116 115 180\n"" 244 55 241 134 302\n"" 245 155 301 24 398\n"" 246 275 345 205 363\n"" 247 52 209 175 280\n"" 248 287 302 241 355\n"" 249 79 185 48 269\n"" 250 45 181 116 230\n"" 251 68 182 24 373\n"" 252 106 126 66 195\n"" 253 170 299 253 327\n"" 254 228 298 245 358\n"" 255 275 357 67 390\n"" 256 126 195 77 196\n"" 257 176 275 67 343\n"" 258 17 363 232 367\n"" 259 248 249 116 375\n"" 260 251 324 250 325\n"" 261 122 251 185 340\n"" 262 238 311 309 326\n"" 263 157 160 155 301\n"" 264 60 181 99 265\n"" 265 98 248 114 373\n"" 266 34 261 209 347\n"" 267 132 330 212 351\n"" 268 245 274 141 358\n"" 269 190 191 19 271\n"" 270 236 238 57 313\n"" 271 105 104 103 194\n"" 272 94 246 161 247\n"" 273 35 246 59 247\n"" 274 140 319 267 374\n"" 275 212 281 33 291\n"" 276 117 71 46 179\n"" 277 70 117 72 179\n"" 278 159 253 228 264\n"" 279 80 185 49 189\n"" 280 209 333 4 210\n"" 281 2 128 127 206\n"" 282 100 164 46 166\n"" 283 74 76 7 123\n"" 284 80 187 75 189\n"" 285 103 194 63 201\n"" 286 171 326 249 365\n"" 287 136 6 137 37\n"" 288 216 291 85 354\n"" 289 47 120 13 121\n"" 290 101 288 54 356\n"" 291 130 263 111 343\n"" 292 168 200 101 201\n"" 293 68 143 41 229\n"" 294 282 291 135 354\n"" 295 49 191 190 340\n"" 296 184 189 75 270\n"" 297 202 272 126 289\n"" 298 218 356 339 383\n"" 299 352 388 215 399\n"" 300 124 192 125 269\n"" 301 70 117 0 72\n"" 302 136 218 138 287\n"" 303 108 255 171 327\n"" 304 223 293 153 396\n"" 305 25 156 155 157\n"" 306 115 116 61 180\n"" 307 320 321 250 338\n"" 308 60 166 99 181\n"" 309 228 245 141 358\n"" 310 127 346 203 385\n"" 311 96 249 171 382\n"" 312 219 272 140 289\n"" 313 112 275 204 363\n"" 314 126 197 65 200\n"" 315 270 337 250 338\n"" 316 42 158 95 161\n"" 317 183 187 118 270\n"" 318 212 283 132 284\n"" 319 204 275 205 363\n"" 320 165 180 61 249\n"" 321 67 275 203 332\n"" 322 14 185 80 269\n"" 323 224 296 91 316\n"" 324 209 261 175 280\n"" 325 290 339 219 383\n"" 326 193 269 48 335\n"" 327 106 195 43 202\n"" 328 176 357 275 363\n"" 329 77 251 170 271\n"" 330 44 267 220 272\n"" 331 75 189 187 270\n"" 332 65 194 126 200\n"" 333 68 267 182 374\n"" 334 125 195 66 198\n"" 335 17 204 50 205\n"" 336 250 325 322 384\n"" 337 66 195 126 198\n"" 338 79 185 80 189\n"" 339 159 298 67 357\n"" 340 218 302 88 303\n"" 341 78 80 79 269\n"" 342 77 221 170 327\n"" 343 90 147 13 148\n"" 344 319 373 230 375\n"" 345 126 200 194 201\n"" 346 143 161 41 296\n"" 347 297 357 345 390\n"" 348 126 195 106 202\n"" 349 64 196 124 199\n"" 350 209 333 211 4\n"" 351 44 202 107 273\n"" 352 195 196 125 335\n"" 353 284 353 84 399\n"" 354 125 196 195 198\n"" 355 64 126 103 201\n"" 356 63 200 168 201\n"" 357 278 279 207 284\n"" 358 175 209 34 261\n"" 359 224 294 91 361\n"" 360 274 298 225 390\n"" 361 258 329 172 381\n"" 362 293 316 153 371\n"" 363 37 139 134 287\n"" 364 200 219 126 272\n"" 365 110 277 257 332\n"" 366 158 225 42 245\n"" 367 191 271 190 340\n"" 368 6 86 136 217\n"" 369 96 163 43 202\n"" 370 41 246 154 296\n"" 371 2 127 50 206\n"" 372 120 240 188 323\n"" 373 171 268 77 335\n"" 374 257 277 276 332\n"" 375 308 313 238 393\n"" 376 98 248 202 273\n"" 377 167 303 55 356\n"" 378 136 137 6 217\n"" 379 88 283 252 380\n"" 380 188 323 240 377\n"" 381 140 272 267 319\n"" 382 121 188 120 240\n"" 383 323 368 313 377\n"" 384 172 258 110 329\n"" 385 192 198 28 199\n"" 386 284 354 85 387\n"" 387 155 157 156 160\n"" 388 143 230 45 299\n"" 389 173 341 20 372\n"" 390 248 319 96 375\n"" 391 242 241 151 355\n"" 392 30 80 75 189\n"" 393 51 173 127 203\n"" 394 81 256 8 257\n"" 395 187 270 122 340\n"" 396 38 241 242 355\n"" 397 141 293 245 300\n"" 398 93 156 11 160\n"" 399 88 252 218 303\n"" 400 29 123 75 184\n"" 401 159 334 297 357\n"" 402 206 344 130 346\n"" 403 185 269 125 335\n"" 404 151 294 10 295\n"" 405 105 66 27 194\n"" 406 150 302 55 362\n"" 407 261 280 209 347\n"" 408 312 367 145 393\n"" 409 194 200 63 201\n"" 410 176 275 112 363\n"" 411 334 357 159 364\n"" 412 231 302 88 361\n"" 413 57 238 236 309\n"" 414 88 300 292 380\n"" 415 192 124 125 199\n"" 416 148 240 120 323\n"" 417 126 194 103 201\n"" 418 259 331 82 351\n"" 419 119 184 183 270\n"" 420 150 241 55 302\n"" 421 126 272 219 289\n"" 422 230 301 116 373\n"" 423 123 188 74 189\n"" 424 74 186 79 189\n"" 425 92 369 243 370\n"" 426 131 280 261 350\n"" 427 143 299 228 300\n"" 428 220 303 231 362\n"" 429 277 332 203 346\n"" 430 256 257 81 276\n"" 431 154 314 36 369\n"" 432 100 180 165 249\n"" 433 149 294 91 295\n"" 434 274 329 141 358\n"" 435 126 201 64 219\n"" 436 64 201 101 219\n"" 437 207 211 53 350\n"" 438 283 330 132 379\n"" 439 243 369 1 370\n"" 440 24 373 114 398\n"" 441 143 230 161 318\n"" 442 161 296 245 371\n"" 443 110 257 172 329\n"" 444 96 162 43 163\n"" 445 248 373 319 375\n"" 446 171 221 77 327\n"" 447 21 254 171 336\n"" 448 306 5 239 305\n"" 449 197 220 102 272\n"" 450 82 281 172 351\n"" 451 113 146 39 234\n"" 452 143 229 68 374\n"" 453 68 93 41 161\n"" 454 172 351 281 381\n"" 455 112 204 17 363\n"" 456 124 191 185 196\n"" 457 215 216 9 278\n"" 458 19 383 353 389\n"" 459 185 189 122 340\n"" 460 137 38 287 134\n"" 461 122 270 250 324\n"" 462 126 202 107 272\n"" 463 70 71 117 179\n"" 464 84 227 226 353\n"" 465 109 173 390 203\n"" 466 13 121 120 240\n"" 467 53 285 213 348\n"" 468 228 358 300 380\n"" 469 14 80 78 269\n"" 470 55 302 218 303\n"" 471 285 286 213 348\n"" 472 107 202 106 273\n"" 473 307 367 366 393\n"" 474 147 148 90 235\n"" 475 94 161 42 247\n"" 476 276 332 277 346\n"" 477 141 293 223 397\n"" 478 51 203 127 346\n"" 479 22 229 150 231\n"" 480 163 202 96 248\n"" 481 48 269 185 335\n"" 482 162 163 96 248\n"" 483 141 274 245 397\n"" 484 115 163 61 248\n"" 485 147 236 57 313\n"" 486 158 181 60 265\n"" 487 311 365 364 391\n"" 488 193 195 125 335\n"" 489 125 185 124 269\n"" 490 224 296 245 300\n"" 491 49 185 124 191\n"" 492 132 280 213 322\n"" 493 96 202 195 221\n"" 494 233 357 334 364\n"" 495 99 166 164 266\n"" 496 245 293 141 397\n"" 497 36 244 149 316\n"" 498 74 79 30 189\n"" 499 30 75 74 189\n"" 500 12 178 99 392\n"" 501 322 325 259 384\n"" 502 195 196 126 198\n"" 503 57 313 238 326\n"" 504 48 268 186 336\n"" 505 91 296 154 316\n"" 506 14 192 124 269\n"" 507 259 332 111 343\n"" 508 238 311 255 364\n"" 509 45 230 95 264\n"" 510 140 252 221 299\n"" 511 176 262 112 263\n"" 512 32 211 207 350\n"" 513 261 376 351 82\n"" 514 19 227 190 389\n"" 515 2 129 128 206\n"" 516 102 220 167 303\n"" 517 181 249 116 266\n"" 518 170 271 251 324\n"" 519 186 188 121 240\n"" 520 213 321 286 338\n"" 521 124 185 14 269\n"" 522 91 295 224 316\n"" 523 143 299 231 374\n"" 524 159 364 255 391\n"" 525 310 334 69 364\n"" 526 170 283 271 379\n"" 527 229 231 143 361\n"" 528 241 287 134 302\n"" 529 70 72 25 179\n"" 530 72 157 25 179\n"" 531 26 71 70 179\n"" 532 70 114 26 179\n"" 533 287 388 282 399\n"" 534 68 229 22 374\n"" 535 61 180 116 249\n"" 536 115 116 71 179\n"" 537 143 296 229 361\n"" 538 142 354 282 399\n"" 539 25 155 70 179\n"" 540 139 288 167 356\n"" 541 114 115 26 179\n"" 542 26 115 71 179\n"" 543 116 180 179 266\n"" 544 164 166 100 266\n"" 545 100 166 46 266\n"" 546 171 255 221 327\n"" 547 132 330 325 379\n"" 548 140 289 252 339\n"" 549 24 182 98 373\n"" 550 180 249 100 266\n"" 551 320 321 214 322\n"" 552 213 285 270 338\n"" 553 214 321 52 322\n"" 554 122 188 186 268\n"" 555 271 289 196 339\n"" 556 108 251 250 325\n"" 557 153 293 244 316\n"" 558 43 193 162 382\n"" 559 80 124 49 185\n"" 560 159 67 358 253\n"" 561 142 282 212 283\n"" 562 14 124 80 185\n"" 563 110 174 173 341\n"" 564 187 189 122 270\n"" 565 252 299 88 380\n"" 566 55 218 139 356\n"" 567 227 378 190 389\n"" 568 33 292 222 328\n"" 569 47 121 74 188\n"" 570 74 123 47 188\n"" 571 120 121 47 188\n"" 572 47 123 120 188\n"" 573 55 303 218 356\n"" 574 167 288 18 356\n"" 575 58 224 151 295\n"" 576 18 167 87 288\n"" 577 116 230 181 301\n"" 578 161 246 41 296\n"" 579 91 244 149 295\n"" 580 33 281 212 381\n"" 581 23 225 158 245\n"" 582 79 186 48 189\n"" 583 75 184 123 189\n"" 584 74 75 76 189\n"" 585 75 123 76 189\n"" 586 76 123 74 189\n"" 587 67 357 298 390\n"" 588 124 185 125 196\n"" 589 186 240 121 336\n"" 590 64 191 124 196\n"" 591 209 210 34 347\n"" 592 80 185 79 269\n"" 593 63 103 104 194\n"" 594 27 107 65 194\n"" 595 9 278 216 279\n"" 596 66 126 106 194\n"" 597 104 27 65 194\n"" 598 66 106 27 194\n"" 599 106 107 27 194\n"" 600 27 3 105 194\n"" 601 105 3 104 194\n"" 602 104 3 27 194\n"" 603 77 335 195 382\n"" 604 136 217 86 287\n"" 605 226 290 54 383\n"" 606 290 356 54 383\n"" 607 218 339 142 383\n"" 608 21 268 193 336\n"" 609 193 268 48 336\n"" 610 171 268 21 336\n"" 611 103 194 126 199\n"" 612 28 198 194 199\n"" 613 125 198 192 199\n"" 614 28 194 103 199\n"" 615 106 163 62 273\n"" 616 98 202 44 273\n"" 617 221 252 170 299\n"" 618 141 300 245 318\n"" 619 185 196 77 335\n"" 620 244 295 91 316\n"" 621 62 163 15 273\n"" 622 231 299 143 300\n"" 623 317 371 245 397\n"" 624 126 196 64 199\n"" 625 103 126 64 199\n"" 626 93 94 59 246\n"" 627 127 344 206 346\n"" 628 224 292 222 360\n"" 629 225 359 274 390\n"" 630 221 319 45 375\n"" 631 25 157 155 301\n"" 632 19 271 191 290\n"" 633 110 341 274 342\n"" 634 163 248 15 273\n"" 635 132 283 212 330\n"" 636 119 321 320 338\n"" 637 186 189 122 268\n"" 638 106 194 126 202\n"" 639 126 194 107 202\n"" 640 107 194 106 202\n"" 641 141 358 329 381\n"" 642 88 302 282 360\n"" 643 263 275 176 343\n"" 644 173 203 110 274\n"" 645 260 175 34 261\n"" 646 250 270 122 323\n"" 647 21 165 162 249\n"" 648 193 335 268 382\n"" 649 130 332 275 343\n"" 650 204 275 130 344\n"" 651 51 110 174 203\n"" 652 110 173 174 203\n"" 653 174 173 51 203\n"" 654 70 155 24 398\n"" 655 177 113 39 234\n"" 656 218 252 88 282\n"" 657 352 383 54 388\n"" 658 112 263 204 275\n"" 659 54 352 226 383\n"" 660 134 287 241 355\n"" 661 238 307 146 309\n"" 662 224 295 58 316\n"" 663 325 343 259 384\n"" 664 259 329 67 330\n"" 665 88 292 224 360\n"" 666 9 215 86 216\n"" 667 221 299 45 319\n"" 668 245 296 161 318\n"" 669 136 134 137 287\n"" 670 83 211 209 349\n"" 671 132 324 283 379\n"" 672 84 284 207 353\n"" 673 138 139 37 287\n"" 674 140 252 231 303\n"" 675 219 289 140 339\n"" 676 181 230 45 264\n"" 677 228 300 299 380\n"" 678 85 279 216 354\n"" 679 169 320 250 323\n"" 680 68 230 143 374\n"" 681 207 227 84 353\n"" 682 240 313 57 326\n"" 683 49 190 187 340\n"" 684 286 348 133 349\n"" 685 52 280 213 349\n"" 686 263 343 176 384\n"" 687 51 277 203 346\n"" 688 220 267 140 272\n"" 689 137 217 136 287\n"" 690 203 329 274 390\n"" 691 31 320 250 368\n"" 692 224 316 293 371\n"" 693 231 252 88 303\n"" 694 252 271 170 283\n"" 695 253 358 228 380\n"" 696 256 276 130 332\n"" 697 19 353 227 389\n"" 698 219 339 303 356\n"" 699 170 252 221 289\n"" 700 142 271 252 283\n"" 701 209 347 280 350\n"" 702 142 252 88 283\n"" 703 251 324 271 340\n"" 704 95 264 181 391\n"" 705 171 251 77 268\n"" 706 98 319 248 373\n"" 707 331 351 259 376\n"" 708 41 154 91 296\n"" 709 10 241 151 242\n"" 710 330 380 292 381\n"" 711 132 284 283 353\n"" 712 140 272 221 289\n"" 713 126 196 77 289\n"" 714 152 371 317 395\n"" 715 36 149 91 316\n"" 716 108 253 176 308\n"" 717 255 365 264 391\n"" 718 202 248 163 273\n"" 719 224 300 88 361\n"" 720 65 126 107 272\n"" 721 67 159 358 298\n"" 722 88 300 231 361\n"" 723 153 223 58 293\n"" 724 146 238 236 307\n"" 725 202 248 98 319\n"" 726 141 328 292 381\n"" 727 42 161 95 245\n"" 728 176 253 108 325\n"" 729 10 294 149 295\n"" 730 155 179 25 301\n"" 731 68 161 143 230\n"" 732 264 365 181 391\n"" 733 225 274 245 298\n"" 734 225 245 23 298\n"" 735 41 161 93 246\n"" 736 97 163 115 248\n"" 737 93 161 94 246\n"" 738 45 255 96 375\n"" 739 212 291 282 354\n"" 740 148 313 323 169\n"" 741 224 292 88 300\n"" 742 142 283 212 354\n"" 743 61 162 96 248\n"" 744 97 114 98 248\n"" 745 185 189 48 268\n"" 746 205 345 275 385\n"" 747 48 268 193 335\n"" 748 24 155 68 301\n"" 749 60 160 157 301\n"" 750 159 357 308 364\n"" 751 297 345 109 390\n"" 752 61 163 162 248\n"" 753 61 116 115 248\n"" 754 230 299 143 374\n"" 755 140 267 22 374\n"" 756 102 303 167 356\n"" 757 134 287 218 302\n"" 758 218 282 88 302\n"" 759 93 161 68 230\n"" 760 357 363 308 364\n"" 761 224 295 294 361\n"" 762 153 244 36 316\n"" 763 303 339 218 356\n"" 764 294 302 150 361\n"" 765 153 371 152 395\n"" 766 57 326 254 336\n"" 767 48 189 186 268\n"" 768 238 308 255 326\n"" 769 214 322 52 376\n"" 770 132 322 259 376\n"" 771 111 331 259 376\n"" 772 121 240 147 336\n"" 773 253 379 330 380\n"" 774 223 274 141 397\n"" 775 176 308 262 313\n"" 776 31 262 176 263\n"" 777 334 364 159 391\n"" 778 255 311 238 326\n"" 779 110 274 203 329\n"" 780 315 369 154 370\n"" 781 146 234 113 311\n"" 782 363 366 232 367\n"" 783 159 298 228 358\n"" 784 292 328 33 381\n"" 785 68 301 230 373\n"" 786 271 340 324 389\n"" 787 176 263 112 275\n"" 788 1 369 315 370\n"" 789 159 308 255 364\n"" 790 253 255 159 308\n"" 791 262 312 56 313\n"" 792 19 290 226 383\n"" 793 84 352 215 399\n"" 794 23 158 95 245\n"" 795 145 235 56 238\n"" 796 132 322 213 324\n"" 797 77 268 185 335\n"" 798 175 214 52 376\n"" 799 108 255 253 308\n"" 800 56 238 235 313\n"" 801 111 175 8 331\n"" 802 52 286 213 321\n"" 803 149 244 91 316\n"" 804 237 5 306 305\n"" 805 165 326 113 365\n"" 806 58 293 224 316\n"" 807 204 263 130 275\n"" 808 222 292 58 328\n"" 809 175 261 260 331\n"" 810 45 253 228 299\n"" 811 250 321 320 322\n"" 812 102 272 220 303\n"" 813 182 267 98 319\n"" 814 170 379 253 380\n"" 815 151 241 10 294\n"" 816 52 321 213 322\n"" 817 215 278 84 399\n"" 818 282 354 216 399\n"" 819 22 267 68 374\n"" 820 230 373 319 374\n"" 821 97 98 15 248\n"" 822 274 341 223 342\n"" 823 15 163 97 248\n"" 824 153 316 36 369\n"" 825 132 351 212 387\n"" 826 185 251 122 268\n"" 827 122 189 185 268\n"" 828 250 324 270 338\n"" 829 233 345 297 357\n"" 830 129 277 128 346\n"" 831 165 249 171 326\n"" 832 122 268 251 377\n"" 833 259 329 172 332\n"" 834 255 364 311 365\n"" 835 140 220 22 267\n"" 836 142 282 218 388\n"" 837 108 326 313 377\n"" 838 221 252 140 289\n"" 839 77 196 195 335\n"" 840 251 271 77 340\n"" 841 250 251 122 324\n"" 842 238 309 57 326\n"" 843 227 386 378 389\n"" 844 171 255 108 326\n"" 845 256 259 111 331\n"" 846 178 365 266 392\n"" 847 178 311 69 391\n"" 848 102 219 197 272\n"" 849 172 259 257 331\n"" 850 258 342 329 381\n"" 851 143 296 224 300\n"" 852 88 299 231 300\n"" 853 182 319 98 373\n"" 854 44 220 197 272\n"" 855 107 202 44 272\n"" 856 333 210 209 347\n"" 857 299 300 88 380\n"" 858 67 253 176 325\n"" 859 212 354 284 387\n"" 860 203 110 332 277\n"" 861 171 251 108 327\n"" 862 96 221 171 255\n"" 863 45 221 96 255\n"" 864 58 293 223 328\n"" 865 148 235 147 313\n"" 866 36 316 154 369\n"" 867 92 395 394 396\n"" 868 132 351 280 376\n"" 869 253 299 45 327\n"" 870 233 334 310 364\n"" 871 195 335 193 382\n"" 872 193 268 21 382\n"" 873 223 293 141 328\n"" 874 292 293 58 328\n"" 875 38 137 287 217\n"" 876 315 1 314 369\n"" 877 141 274 223 342\n"" 878 188 268 122 377\n"" 879 141 293 292 328\n"" 880 235 236 147 313\n"" 881 235 238 236 313\n"" 882 57 240 147 313\n"" 883 88 282 212 292\n"" 884 23 297 159 334\n"" 885 259 325 132 330\n"" 886 23 334 159 391\n"" 887 283 324 132 389\n"" 888 205 345 304 363\n"" 889 253 325 67 330\n"" 890 43 162 96 382\n"" 891 257 331 259 332\n"" 892 256 331 257 332\n"" 893 172 329 257 332\n"" 894 54 356 218 383\n"" 895 259 331 256 332\n"" 896 208 131 32 350\n"" 897 280 348 213 349\n"" 898 118 270 213 285\n"" 899 16 270 118 285\n"" 900 253 308 159 357\n"" 901 81 276 257 277\n"" 902 228 253 45 264\n"" 903 31 262 169 368\n"" 904 262 313 169 368\n"" 905 108 313 308 368\n"" 906 159 255 253 264\n"" 907 253 255 45 264\n"" 908 95 181 158 265\n"" 909 45 264 255 365\n"" 910 113 311 178 392\n"" 911 177 178 12 392\n"" 912 100 365 165 392\n"" 913 369 370 92 395\n"" 914 72 179 166 266\n"" 915 150 294 241 302\n"" 916 134 218 55 302\n"" 917 166 179 71 266\n"" 918 179 180 71 266\n"" 919 46 166 71 266\n"" 920 71 180 46 266\n"" 921 308 364 363 393\n"" 922 238 313 312 393\n"" 923 238 364 308 393\n"" 924 366 367 363 393\n"" 925 218 287 282 302\n"" 926 72 166 60 266\n"" 927 166 181 60 266\n"" 928 116 373 301 398\n"" 929 225 372 317 397\n"" 930 226 388 352 399\n"" 931 145 238 56 312\n"" 932 176 325 108 368\n"" 933 152 35 154 370\n"" 934 108 327 251 379\n"" 935 135 291 216 354\n"" 936 283 324 271 379\n"" 937 213 324 322 338\n"" 938 284 351 132 387\n"" 939 321 322 250 338\n"" 940 73 323 270 337\n"" 941 270 323 250 337\n"" 942 286 321 119 338\n"" 943 250 323 320 337\n"" 944 320 323 73 337\n"" 945 213 322 321 338\n"" 946 122 189 188 270\n"" 947 183 184 29 270\n"" 948 29 187 183 270\n"" 949 16 183 118 270\n"" 950 119 183 16 270\n"" 951 252 271 142 339\n"" 952 196 289 219 339\n"" 953 69 311 310 364\n"" 954 185 191 49 340\n"" 955 29 184 75 270\n"" 956 75 187 29 270\n"" 957 184 188 123 270\n"" 958 188 189 123 270\n"" 959 123 189 184 270\n"" 960 255 308 108 326\n"" 961 108 308 238 326\n"" 962 245 298 274 358\n"" 963 111 332 256 343\n"" 964 53 227 207 386\n"" 965 58 244 153 293\n"" 966 91 296 224 361\n"" 967 268 336 171 377\n"" 968 162 249 96 382\n"" 969 141 329 274 342\n"" 970 259 322 132 325\n"" 971 213 348 280 386\n"" 972 130 275 263 343\n"" 973 161 230 95 318\n"" 974 95 230 45 318\n"" 975 228 298 95 318\n"" 976 302 303 55 362\n"" 977 45 230 143 318\n"" 978 95 245 161 318\n"" 979 77 251 171 327\n"" 980 233 363 357 364\n"" 981 213 280 132 386\n"" 982 173 109 390 359\n"" 983 159 297 23 298\n"" 984 213 286 52 349\n"" 985 108 251 171 377\n"" 986 209 280 52 349\n"" 987 252 289 271 339\n"" 988 84 278 207 284\n"" 989 142 252 218 282\n"" 990 88 252 142 282\n"" 991 190 271 19 389\n"" 992 257 276 256 332\n"" 993 251 268 171 377\n"" 994 122 270 188 323\n"" 995 138 218 139 287\n"" 996 226 383 352 388\n"" 997 73 169 120 323\n"" 998 73 320 169 323\n"" 999 324 325 251 379\n"" 1000 364 365 255 391\n"" 1001 228 300 141 318\n"" 1002 224 296 143 361\n"" 1003 87 167 139 288\n"" 1004 297 334 233 357\n"" 1005 85 284 279 354\n"" 1006 122 324 251 340\n"" 1007 170 221 77 289\n"" 1008 170 271 252 289\n"" 1009 77 195 126 289\n"" 1010 167 220 55 303\n"" 1011 139 218 134 287\n"" 1012 216 217 135 287\n"" 1013 135 282 216 287\n"" 1014 245 300 296 318\n"" 1015 58 292 224 293\n"" 1016 171 249 21 382\n"" 1017 172 259 82 351\n"" 1018 131 284 279 387\n"" 1019 134 241 38 355\n"" 1020 18 288 101 356\n"" 1021 38 287 134 355\n"" 1022 139 167 55 356\n"" 1023 139 218 138 356\n"" 1024 142 383 271 389\n"" 1025 216 282 135 354\n"" 1026 353 383 142 389\n"" 1027 271 283 142 389\n"" 1028 131 350 284 387\n"" 1029 274 358 298 390\n"" 1030 86 216 215 287\n"" 1031 86 217 216 287\n"" 1032 195 202 126 289\n"" 1033 195 221 202 289\n"" 1034 77 221 195 289\n"" 1035 140 272 219 303\n"" 1036 33 291 222 292\n"" 1037 212 291 33 292\n"" 1038 229 296 91 361\n"" 1039 140 231 220 303\n"" 1040 145 307 238 393\n"" 1041 222 224 58 292\n"" 1042 270 324 122 340\n"" 1043 96 319 221 375\n"" 1044 216 278 215 399\n"" 1045 274 341 173 372\n"" 1046 88 252 231 299\n"" 1047 216 279 278 399\n"" 1048 115 248 116 398\n"" 1049 274 359 225 372\n"" 1050 153 395 92 396\n"" 1051 245 298 228 318\n"" 1052 95 298 245 318\n"" 1053 143 300 228 318\n"" 1054 231 303 302 362\n"" 1055 91 229 41 296\n"" 1056 293 396 223 397\n"" 1057 249 255 45 375\n"" 1058 42 245 225 317\n"" 1059 304 345 233 363\n"" 1060 55 303 220 362\n"" 1061 231 302 150 362\n"" 1062 216 354 279 399\n"" 1063 361 224 151 360\n"" 1064 282 388 142 399\n"" 1065 96 255 249 375\n"" 1066 151 222 135 360\n"" 1067 222 292 291 360\n"" 1068 159 264 23 391\n"" 1069 127 206 128 346\n"" 1070 95 265 23 391\n"" 1071 69 334 265 391\n"" 1072 159 264 228 298\n"" 1073 228 264 95 298\n"" 1074 23 245 95 298\n"" 1075 282 292 88 360\n"" 1076 67 330 329 358\n"" 1077 23 264 159 298\n"" 1078 95 264 23 298\n"" 1079 229 231 22 374\n"" 1080 60 157 72 301\n"" 1081 157 179 72 301\n"" 1082 116 266 179 301\n"" 1083 95 160 60 301\n"" 1084 60 266 181 301\n"" 1085 181 266 116 301\n"" 1086 60 181 95 301\n"" 1087 181 230 95 301\n"" 1088 160 161 93 301\n"" 1089 161 230 93 301\n"" 1090 68 155 93 301\n"" 1091 93 230 68 301\n"" 1092 179 266 72 301\n"" 1093 72 266 60 301\n"" 1094 95 161 160 301\n"" 1095 95 230 161 301\n"" 1096 308 357 176 363\n"" 1097 255 326 171 365\n"" 1098 91 294 150 361\n"" 1099 294 360 302 361\n"" 1100 231 300 143 361\n"" 1101 88 302 231 303\n"" 1102 245 371 293 397\n"" 1103 146 236 40 307\n"" 1104 236 238 235 307\n"" 1105 235 238 145 307\n"" 1106 110 203 332 329\n"" 1107 177 234 178 311\n"" 1108 113 234 177 311\n"" 1109 169 262 56 313\n"" 1110 148 169 56 313\n"" 1111 89 237 145 307\n"" 1112 89 305 237 307\n"" 1113 306 40 145 307\n"" 1114 146 40 306 307\n"" 1115 237 306 145 307\n"" 1116 237 305 306 307\n"" 1117 306 239 146 307\n"" 1118 305 239 306 307\n"" 1119 146 239 39 307\n"" 1120 239 305 39 307\n"" 1121 40 235 145 307\n"" 1122 40 236 235 307\n"" 1123 177 178 113 311\n"" 1124 253 255 108 327\n"" 1125 307 309 238 311\n"" 1126 178 234 69 311\n"" 1127 170 251 77 327\n"" 1128 271 324 170 379\n"" 1129 146 307 234 311\n"" 1130 181 266 99 365\n"" 1131 69 234 144 311\n"" 1132 234 307 144 311\n"" 1133 228 299 253 380\n"" 1134 100 266 249 365\n"" 1135 178 266 99 392\n"" 1136 99 266 178 365\n"" 1137 113 365 311 392\n"" 1138 99 266 164 392\n"" 1139 108 308 176 368\n"" 1140 313 323 169 368\n"" 1141 45 255 249 365\n"" 1142 232 363 304 366\n"" 1143 308 313 176 368\n"" 1144 146 309 307 311\n"" 1145 113 309 146 311\n"" 1146 52 280 175 376\n"" 1147 144 310 69 311\n"" 1148 115 179 114 398\n"" 1149 114 248 115 398\n"" 1150 176 262 31 368\n"" 1151 212 284 132 387\n"" 1152 89 366 144 367\n"" 1153 153 370 369 395\n"" 1154 153 369 92 395\n"" 1155 301 373 24 398\n"" 1156 53 350 348 386\n"" 1157 108 325 250 368\n"" 1158 371 395 153 396\n"" 1159 24 301 68 373\n"" 1160 70 179 155 398\n"" 1161 161 296 143 318\n"" 1162 95 264 228 318\n"" 1163 228 264 45 318\n"" 1164 45 264 95 318\n"" 1165 45 299 228 318\n"" 1166 228 299 143 318\n"" 1167 143 299 45 318\n"" 1168 68 373 230 374\n"" 1169 267 319 182 374\n"" 1170 259 351 132 376\n"" 1171 202 272 221 319\n"" 1172 221 272 140 319\n"" 1173 202 221 96 319\n"" 1174 96 248 202 319\n"" 1175 116 373 248 375\n"" 1176 44 202 98 319\n"" 1177 98 267 44 319\n"" 1178 267 272 44 319\n"" 1179 44 272 202 319\n"" 1180 230 373 116 375\n"" 1181 143 231 229 374\n"" 1182 116 249 181 375\n"" 1183 45 319 230 375\n"" 1184 116 181 45 375\n"" 1185 175 331 111 376\n"" 1186 280 322 132 376\n"" 1187 171 336 326 377\n"" 1188 261 347 131 350\n"" 1189 131 347 32 350\n"" 1190 128 206 129 346\n"" 1191 238 313 108 326\n"" 1192 171 254 21 326\n"" 1193 329 358 330 381\n"" 1194 251 327 170 379\n"" 1195 325 330 253 379\n"" 1196 172 281 33 381\n"" 1197 212 282 142 354\n"" 1198 110 329 258 342\n"" 1199 205 344 50 385\n"" 1200 376 261 351 280\n"" 1201 173 174 20 341\n"" 1202 322 324 132 379\n"" 1203 322 325 324 379\n"" 1204 298 358 67 390\n"" 1205 67 329 203 390\n"" 1206 21 254 165 326\n"" 1207 184 270 119 337\n"" 1208 142 284 283 354\n"" 1209 73 270 184 337\n"" 1210 218 303 252 339\n"" 1211 250 323 108 368\n"" 1212 245 274 225 397\n"" 1213 165 254 113 326\n"" 1214 275 344 205 385\n"" 1215 254 309 113 326\n"" 1216 309 311 113 326\n"" 1217 96 221 77 382\n"" 1218 249 326 165 365\n"" 1219 125 196 185 335\n"" 1220 224 245 371 293\n"" 1221 203 329 67 332\n"" 1222 50 206 127 344\n"" 1223 162 193 21 382\n"" 1224 8 256 111 331\n"" 1225 82 259 172 331\n"" 1226 245 224 371 296\n"" 1227 260 8 175 331\n"" 1228 250 368 325 384\n"" 1229 219 356 290 383\n"" 1230 96 195 43 382\n"" 1231 271 339 290 383\n"" 1232 212 330 292 381\n"" 1233 265 334 23 391\n"" 1234 329 330 259 381\n"" 1235 329 342 141 381\n"" 1236 77 221 171 382\n"" 1237 43 195 193 382\n"" 1238 292 380 141 381\n"" 1239 141 380 358 381\n"" 1240 111 259 256 332\n"" 1241 135 355 151 360\n"" 1242 130 344 275 346\n"" 1243 206 276 129 346\n"" 1244 207 350 53 386\n"" 1245 128 277 51 346\n"" 1246 51 127 128 346\n"" 1247 353 386 227 389\n"" 1248 271 290 19 383\n"" 1249 339 356 219 383\n"" 1250 322 324 250 338\n"" 1251 250 337 320 338\n"" 1252 320 337 119 338\n"" 1253 119 270 16 338\n"" 1254 270 285 16 338\n"" 1255 213 286 285 338\n"" 1256 285 286 16 338\n"" 1257 16 286 119 338\n"" 1258 343 376 259 384\n"" 1259 250 320 31 384\n"" 1260 252 303 140 339\n"" 1261 140 303 219 339\n"" 1262 191 271 196 339\n"" 1263 191 290 271 339\n"" 1264 196 290 191 339\n"" 1265 196 219 64 339\n"" 1266 219 290 64 339\n"" 1267 64 290 196 339\n"" 1268 31 368 250 384\n"" 1269 31 263 176 384\n"" 1270 322 376 214 384\n"" 1271 185 196 191 340\n"" 1272 196 271 191 340\n"" 1273 203 275 67 390\n"" 1274 345 357 275 390\n"" 1275 77 196 185 340\n"" 1276 77 271 196 340\n"" 1277 187 190 118 340\n"" 1278 118 270 187 340\n"" 1279 256 332 130 343\n"" 1280 67 325 176 343\n"" 1281 67 329 259 343\n"" 1282 67 332 329 343\n"" 1283 329 332 259 343\n"" 1284 298 357 297 390\n"" 1285 227 353 207 386\n"" 1286 344 346 127 385\n"" 1287 203 346 275 385\n"" 1288 348 350 280 386\n"" 1289 67 330 325 343\n"" 1290 325 330 259 343\n"" 1291 259 330 67 343\n"" 1292 284 350 207 386\n"" 1293 280 350 284 386\n"" 1294 207 353 284 386\n"" 1295 130 276 206 346\n"" 1296 130 332 276 346\n"" 1297 129 276 81 346\n"" 1298 276 277 81 346\n"" 1299 81 277 129 346\n"" 1300 203 332 275 346\n"" 1301 275 332 130 346\n"" 1302 53 348 213 386\n"" 1303 284 353 132 386\n"" 1304 280 348 211 350\n"" 1305 211 348 53 350\n"" 1306 85 281 131 387\n"" 1307 207 284 279 350\n"" 1308 279 284 131 350\n"" 1309 207 279 208 350\n"" 1310 208 279 131 350\n"" 1311 333 211 32 350\n"" 1312 333 347 211 350\n"" 1313 32 347 333 350\n"" 1314 350 351 284 387\n"" 1315 85 291 281 387\n"" 1316 281 381 351 387\n"" 1317 240 336 186 377\n"" 1318 313 368 108 377\n"" 1319 21 268 171 382\n"" 1320 171 221 96 382\n"" 1321 268 335 171 382\n"" 1322 218 287 136 388\n"" 1323 54 383 218 388\n"" 1324 218 383 142 388\n"" 1325 142 383 226 388\n"" 1326 82 261 131 351\n"" 1327 261 280 131 351\n"" 1328 284 350 280 351\n"" 1329 280 350 131 351\n"" 1330 226 227 19 353\n"" 1331 85 354 291 387\n"" 1332 131 351 350 387\n"" 1333 150 231 229 361\n"" 1334 88 360 224 361\n"" 1335 279 284 85 387\n"" 1336 281 291 212 387\n"" 1337 135 287 217 355\n"" 1338 150 302 231 361\n"" 1339 217 287 38 355\n"" 1340 283 284 212 354\n"" 1341 132 353 283 389\n"" 1342 118 340 190 389\n"" 1343 190 340 271 389\n"" 1344 271 383 19 389\n"" 1345 138 288 139 356\n"" 1346 176 368 31 384\n"" 1347 102 167 168 356\n"" 1348 101 219 200 356\n"" 1349 200 219 102 356\n"" 1350 167 18 168 356\n"" 1351 168 18 101 356\n"" 1352 101 290 219 356\n"" 1353 54 290 101 356\n"" 1354 138 218 54 356\n"" 1355 54 288 138 356\n"" 1356 259 376 322 384\n"" 1357 325 368 176 384\n"" 1358 168 200 102 356\n"" 1359 101 200 168 356\n"" 1360 176 253 67 357\n"" 1361 176 308 253 357\n"" 1362 307 310 144 364\n"" 1363 266 365 100 392\n"" 1364 135 291 282 360\n"" 1365 222 291 135 360\n"" 1366 282 291 212 360\n"" 1367 291 292 212 360\n"" 1368 212 292 282 360\n"" 1369 58 222 151 360\n"" 1370 58 224 222 360\n"" 1371 151 224 58 360\n"" 1372 22 231 150 362\n"" 1373 220 231 22 362\n"" 1374 241 294 151 360\n"" 1375 241 302 294 360\n"" 1376 282 302 287 360\n"" 1377 302 355 287 360\n"" 1378 282 287 135 360\n"" 1379 287 355 135 360\n"" 1380 241 355 302 360\n"" 1381 151 355 241 360\n"" 1382 294 295 151 361\n"" 1383 151 360 294 361\n"" 1384 204 205 17 363\n"" 1385 205 304 17 363\n"" 1386 132 324 213 386\n"" 1387 17 304 232 363\n"" 1388 250 320 169 368\n"" 1389 113 326 311 365\n"" 1390 274 372 225 397\n"" 1391 238 312 145 393\n"" 1392 372 395 317 397\n"" 1393 144 307 89 367\n"" 1394 89 307 145 367\n"" 1395 181 264 45 365\n"" 1396 249 266 181 365\n"" 1397 311 326 255 365\n"" 1398 310 311 144 364\n"" 1399 144 311 307 364\n"" 1400 176 313 262 368\n"" 1401 169 320 31 368\n"" 1402 144 366 307 367\n"" 1403 169 323 250 368\n"" 1404 232 366 89 367\n"" 1405 112 363 17 367\n"" 1406 275 346 344 385\n"" 1407 317 395 371 397\n"" 1408 145 367 307 393\n"" 1409 363 364 233 393\n"" 1410 363 367 112 393\n"" 1411 164 266 100 392\n"" 1412 307 364 238 393\n"" 1413 112 367 312 393\n"" 1414 165 365 113 392\n"" 1415 311 365 178 392\n"" 1416 12 99 164 392\n"" 1417 173 359 274 372\n"" 1418 248 373 116 398\n"" 1419 245 317 42 371\n"" 1420 42 317 152 371\n"" 1421 161 245 42 371\n"" 1422 42 247 161 371\n"" 1423 161 247 246 371\n"" 1424 246 296 161 371\n"" 1425 154 296 246 371\n"" 1426 154 316 296 371\n"" 1427 246 247 154 371\n"" 1428 152 154 35 371\n"" 1429 154 247 35 371\n"" 1430 35 247 152 371\n"" 1431 152 370 154 371\n"" 1432 114 373 248 398\n"" 1433 179 301 155 398\n"" 1434 114 179 70 398\n"" 1435 24 114 70 398\n"" 1436 153 370 152 371\n"" 1437 154 369 316 371\n"" 1438 154 370 369 371\n"" 1439 316 369 153 371\n"" 1440 369 370 153 371\n"" 1441 215 388 287 399\n"" 1442 278 284 84 399\n"" 1443 231 299 140 374\n"" 1444 299 319 140 374\n"" 1445 45 299 230 374\n"" 1446 45 319 299 374\n"" 1447 230 319 45 374\n"" 1448 45 365 249 375\n"" 1449 249 365 181 375\n"" 1450 181 365 45 375\n"" 1451 311 364 69 391\n"" 1452 259 343 111 376\n"" 1453 111 214 175 376\n"" 1454 175 280 261 376\n"" 1455 224 361 151 295\n"" 1456 82 351 331 376\n"" 1457 127 203 109 385\n"" 1458 50 344 127 385\n"" 1459 82 331 261 376\n"" 1460 261 331 175 376\n"" 1461 250 251 108 377\n"" 1462 108 323 250 377\n"" 1463 122 251 250 377\n"" 1464 250 323 122 377\n"" 1465 188 240 186 377\n"" 1466 186 268 188 377\n"" 1467 240 326 57 377\n"" 1468 326 336 57 377\n"" 1469 57 336 240 377\n"" 1470 108 325 253 379\n"" 1471 170 327 253 379\n"" 1472 253 327 108 379\n"" 1473 252 283 170 380\n"" 1474 212 283 88 380\n"" 1475 212 330 283 380\n"" 1476 330 379 283 380\n"" 1477 283 379 170 380\n"" 1478 253 330 67 380\n"" 1479 330 358 67 380\n"" 1480 67 358 253 380\n"" 1481 21 249 162 382\n"" 1482 300 358 141 380\n"" 1483 292 300 141 380\n"" 1484 77 195 96 382\n"" 1485 88 292 212 380\n"" 1486 292 330 212 380\n"" 1487 330 351 259 381\n"" 1488 172 329 259 381\n"" 1489 259 351 172 381\n"" 1490 212 351 330 381\n"" 1491 141 342 328 381\n"" 1492 328 342 258 381\n"" 1493 142 353 226 383\n"" 1494 226 353 19 383\n"" 1495 142 339 271 383\n"" 1496 274 359 173 390\n"" 1497 225 298 297 390\n"" 1498 31 320 214 384\n"" 1499 250 322 320 384\n"" 1500 320 322 214 384\n"" 1501 111 376 343 384\n"" 1502 214 376 111 384\n"" 1503 111 263 214 384\n"" 1504 111 343 263 384\n"" 1505 53 378 227 386\n"" 1506 213 378 53 386\n"" 1507 203 385 275 390\n"" 1508 132 351 284 386\n"" 1509 284 351 280 386\n"" 1510 280 351 132 386\n"" 1511 109 385 203 390\n"" 1512 109 359 297 390\n"" 1513 351 381 212 387\n"" 1514 212 381 281 387\n"" 1515 131 281 82 387\n"" 1516 281 351 82 387\n"" 1517 82 351 131 387\n"" 1518 313 148 323 240\n"" 1519 136 287 215 388\n"" 1520 215 352 136 388\n"" 1521 136 352 54 388\n"" 1522 54 138 136 388\n"" 1523 54 218 138 388\n"" 1524 138 218 136 388\n"" 1525 283 353 142 389\n"" 1526 190 378 118 389\n"" 1527 324 340 270 389\n"" 1528 270 340 118 389\n"" 1529 378 386 213 389\n"" 1530 213 386 324 389\n"" 1531 132 386 353 389\n"" 1532 324 386 132 389\n"" 1533 118 378 213 389\n"" 1534 213 270 118 389\n"" 1535 213 324 270 389\n"" 1536 275 385 345 390\n"" 1537 345 385 109 390\n"" 1538 67 358 329 390\n"" 1539 329 358 274 390\n"" 1540 181 265 95 391\n"" 1541 99 265 181 391\n"" 1542 181 365 99 391\n"" 1543 178 265 99 391\n"" 1544 99 365 178 391\n"" 1545 233 364 310 393\n"" 1546 310 366 233 393\n"" 1547 304 363 233 393\n"" 1548 304 366 363 393\n"" 1549 233 366 304 393\n"" 1550 310 364 307 393\n"" 1551 308 363 176 393\n"" 1552 176 363 112 393\n"" 1553 312 313 262 393\n"" 1554 262 313 308 393\n"" 1555 144 310 307 393\n"" 1556 144 366 310 393\n"" 1557 307 366 144 393\n"" 1558 262 308 176 393\n"" 1559 112 262 176 393\n"" 1560 112 312 262 393\n"" 1561 223 341 274 397\n"" 1562 341 372 274 397\n"" 1563 223 396 341 397\n"" 1564 394 395 372 397\n"" 1565 394 396 395 397\n"" 1566 395 396 371 397\n"" 1567 371 396 293 397\n"" 1568 341 396 394 397\n"" 1569 341 394 20 397\n"" 1570 394 372 20 397\n"" 1571 20 372 341 397\n"" 1572 279 284 278 399\n"" 1573 279 354 284 399\n"" 1574 216 287 282 399\n"" 1575 215 287 216 399\n"" 1576 142 353 284 399\n"" 1577 284 354 142 399\n"" 1578 226 353 142 399\n"" 1579 142 388 226 399\n""# Generated by tetgen -a0.01 cube.smesh \n"); } diff --git a/Demos/SoftDemo/main.cpp b/Demos/SoftDemo/main.cpp index ec5e70a81..5dbca5a98 100644 --- a/Demos/SoftDemo/main.cpp +++ b/Demos/SoftDemo/main.cpp @@ -1,37 +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 "SoftDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" -#include "btBulletDynamicsCommon.h" - -GLDebugDrawer gDebugDrawer; - -int main(int argc,char** argv) -{ - - SoftDemo* softDemo = new SoftDemo(); - - softDemo->initPhysics(); - softDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); - - - glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",softDemo); - - delete softDemo; - return 0; - -} +/* +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 "SoftDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + SoftDemo* softDemo = new SoftDemo(); + + softDemo->initPhysics(); + softDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",softDemo); + + delete softDemo; + return 0; + +} diff --git a/Demos/TerrainDemo/Makefile.am b/Demos/TerrainDemo/Makefile.am index 9df77829d..1c8e68c85 100644 --- a/Demos/TerrainDemo/Makefile.am +++ b/Demos/TerrainDemo/Makefile.am @@ -1,6 +1,6 @@ - -noinst_PROGRAMS=TerrainDemo - -TerrainDemo_SOURCES=TerrainDemo.cpp TerrainDemo.h main.cpp -TerrainDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) -TerrainDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ + +noinst_PROGRAMS=TerrainDemo + +TerrainDemo_SOURCES=TerrainDemo.cpp TerrainDemo.h main.cpp +TerrainDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) +TerrainDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ diff --git a/Demos/TerrainDemo/TerrainDemo.cpp b/Demos/TerrainDemo/TerrainDemo.cpp index 3e6409152..cc32b689f 100644 --- a/Demos/TerrainDemo/TerrainDemo.cpp +++ b/Demos/TerrainDemo/TerrainDemo.cpp @@ -1,921 +1,921 @@ - -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006,2008 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 "TerrainDemo.h" // always include our own header first! - -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" - -#include "GLDebugDrawer.h" - -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" -#include "GLDebugFont.h" - - - -// constants ------------------------------------------------------------------- -static const float s_gravity = 9.8; // 9.8 m/s^2 - -static const int s_gridSize = 64 + 1; // must be (2^N) + 1 -static const float s_gridSpacing = 5.0; - -static const float s_gridHeightScale = 0.2; - -// the singularity at the center of the radial model means we need a lot of -// finely-spaced time steps to get the physics right. -// These numbers are probably too aggressive for a real game! -static const int s_requestedHz = 180; -static const float s_engineTimeStep = 1.0 / s_requestedHz; - -// delta phase: radians per second -static const float s_deltaPhase = 0.25 * 2.0 * SIMD_PI; - -// what type of terrain is generated? -enum eTerrainModel { - eRadial = 1, // deterministic - eFractal = 2 // random -}; - - -typedef unsigned char byte_t; - - - -//////////////////////////////////////////////////////////////////////////////// -// -// static helper methods -// -// Only used within this file (helpers and terrain generation, etc) -// -//////////////////////////////////////////////////////////////////////////////// - -static const char * -getTerrainTypeName -( -eTerrainModel model -) -{ - switch (model) { - case eRadial: - return "Radial"; - - case eFractal: - return "Fractal"; - - default: - btAssert(!"bad terrain model type"); - } - - return NULL; -} - - - -static const char * -getDataTypeName -( -PHY_ScalarType type -) -{ - switch (type) { - case PHY_UCHAR: - return "UnsignedChar"; - - case PHY_SHORT: - return "Short"; - - case PHY_FLOAT: - return "Float"; - - default: - btAssert(!"bad heightfield data type"); - } - - return NULL; -} - - - -static const char * -getUpAxisName -( -int axis -) -{ - switch (axis) { - case 0: - return "X"; - - case 1: - return "Y"; - - case 2: - return "Z"; - - default: - btAssert(!"bad up axis"); - } - - return NULL; -} - - - -static btVector3 -getUpVector -( -int upAxis, -btScalar regularValue, -btScalar upValue -) -{ - btAssert(upAxis >= 0 && upAxis <= 2 && "bad up axis"); - - btVector3 v(regularValue, regularValue, regularValue); - v[upAxis] = upValue; - - return v; -} - - - -// TODO: it would probably cleaner to have a struct per data type, so -// you could lookup byte sizes, conversion functions, etc. -static int getByteSize -( -PHY_ScalarType type -) -{ - int size = 0; - - switch (type) { - case PHY_FLOAT: - size = sizeof(float); - break; - - case PHY_UCHAR: - size = sizeof(unsigned char); - break; - - case PHY_SHORT: - size = sizeof(short); - break; - - default: - btAssert(!"Bad heightfield data type"); - } - - return size; -} - - - -static float -convertToFloat -( -const byte_t * p, -PHY_ScalarType type -) -{ - btAssert(p); - - switch (type) { - case PHY_FLOAT: - { - float * pf = (float *) p; - return *pf; - } - - case PHY_UCHAR: - { - unsigned char * pu = (unsigned char *) p; - return ((*pu) * s_gridHeightScale); - } - - case PHY_SHORT: - { - short * ps = (short *) p; - return ((*ps) * s_gridHeightScale); - } - - default: - btAssert(!"bad type"); - } - - return 0; -} - - - -static float -getGridHeight -( -byte_t * grid, -int i, -int j, -PHY_ScalarType type -) -{ - btAssert(grid); - btAssert(i >= 0 && i < s_gridSize); - btAssert(j >= 0 && j < s_gridSize); - - int bpe = getByteSize(type); - btAssert(bpe > 0 && "bad bytes per element"); - - int idx = (j * s_gridSize) + i; - long offset = ((long) bpe) * idx; - - byte_t * p = grid + offset; - - return convertToFloat(p, type); -} - - - -static void -convertFromFloat -( -byte_t * p, -float value, -PHY_ScalarType type -) -{ - btAssert(p && "null"); - - switch (type) { - case PHY_FLOAT: - { - float * pf = (float *) p; - *pf = value; - } - break; - - case PHY_UCHAR: - { - unsigned char * pu = (unsigned char *) p; - *pu = (unsigned char) (value / s_gridHeightScale); - } - break; - - case PHY_SHORT: - { - short * ps = (short *) p; - *ps = (short) (value / s_gridHeightScale); - } - break; - - default: - btAssert(!"bad type"); - } -} - - - -// creates a radially-varying heightfield -static void -setRadial -( -byte_t * grid, -int bytesPerElement, -PHY_ScalarType type, -float phase = 0.0 -) -{ - btAssert(grid); - btAssert(bytesPerElement > 0); - - // min/max - float period = 0.5 / s_gridSpacing; - float floor = 0.0; - float min_r = 3.0 * sqrt(s_gridSpacing); - float magnitude = 50.0 * sqrt(s_gridSpacing); - - // pick a base_phase such that phase = 0 results in max height - // (this way, if you create a heightfield with phase = 0, - // you can rely on the min/max heights that result) - float base_phase = (0.5 * SIMD_PI) - (period * min_r); - phase += base_phase; - - // center of grid - float cx = 0.5 * s_gridSize * s_gridSpacing; - float cy = cx; // assume square grid - byte_t * p = grid; - for (int i = 0; i < s_gridSize; ++i) { - float x = i * s_gridSpacing; - for (int j = 0; j < s_gridSize; ++j) { - float y = j * s_gridSpacing; - - float dx = x - cx; - float dy = y - cy; - - float r = sqrt((dx * dx) + (dy * dy)); - - float z = period; - if (r < min_r) { - r = min_r; - } - z = (1.0 / r) * sin(period * r + phase); - if (z > period) { - z = period; - } else if (z < -period) { - z = -period; - } - z = floor + magnitude * z; - - convertFromFloat(p, z, type); - p += bytesPerElement; - } - } -} - - - -static float -randomHeight -( -int step -) -{ - return (0.33 * s_gridSpacing * s_gridSize * step * (rand() - (0.5 * RAND_MAX))) / (1.0 * RAND_MAX * s_gridSize); -} - - - -static void -dumpGrid -( -const byte_t * grid, -int bytesPerElement, -PHY_ScalarType type, -int max -) -{ - //std::cerr << "Grid:\n"; - - char buffer[32]; - - for (int j = 0; j < max; ++j) { - for (int i = 0; i < max; ++i) { - long offset = j * s_gridSize + i; - float z = convertToFloat(grid + offset * bytesPerElement, type); - sprintf(buffer, "%6.2f", z); - //std::cerr << " " << buffer; - } - //std::cerr << "\n"; - } -} - - - -static void -updateHeight -( -byte_t * p, -float new_val, -PHY_ScalarType type -) -{ - float old_val = convertToFloat(p, type); - if (!old_val) { - convertFromFloat(p, new_val, type); - } -} - - - -// creates a random, fractal heightfield -static void -setFractal -( -byte_t * grid, -int bytesPerElement, -PHY_ScalarType type, -int step -) -{ - btAssert(grid); - btAssert(bytesPerElement > 0); - btAssert(step > 0); - btAssert(step < s_gridSize); - - int newStep = step / 2; -// std::cerr << "Computing grid with step = " << step << ": before\n"; -// dumpGrid(grid, bytesPerElement, type, step + 1); - - // special case: starting (must set four corners) - if (s_gridSize - 1 == step) { - // pick a non-zero (possibly negative) base elevation for testing - float base = randomHeight(step / 2); - - convertFromFloat(grid, base, type); - convertFromFloat(grid + step * bytesPerElement, base, type); - convertFromFloat(grid + step * s_gridSize * bytesPerElement, base, type); - convertFromFloat(grid + (step * s_gridSize + step) * bytesPerElement, base, type); - } - - // determine elevation of each corner - float c00 = convertToFloat(grid, type); - float c01 = convertToFloat(grid + step * bytesPerElement, type); - float c10 = convertToFloat(grid + (step * s_gridSize) * bytesPerElement, type); - float c11 = convertToFloat(grid + (step * s_gridSize + step) * bytesPerElement, type); - - // set top middle - updateHeight(grid + newStep * bytesPerElement, 0.5 * (c00 + c01) + randomHeight(step), type); - - // set left middle - updateHeight(grid + (newStep * s_gridSize) * bytesPerElement, 0.5 * (c00 + c10) + randomHeight(step), type); - - // set right middle - updateHeight(grid + (newStep * s_gridSize + step) * bytesPerElement, 0.5 * (c01 + c11) + randomHeight(step), type); - - // set bottom middle - updateHeight(grid + (step * s_gridSize + newStep) * bytesPerElement, 0.5 * (c10 + c11) + randomHeight(step), type); - - // set middle - updateHeight(grid + (newStep * s_gridSize + newStep) * bytesPerElement, 0.25 * (c00 + c01 + c10 + c11) + randomHeight(step), type); - -// std::cerr << "Computing grid with step = " << step << ": after\n"; -// dumpGrid(grid, bytesPerElement, type, step + 1); - - // terminate? - if (newStep < 2) { - return; - } - - // recurse - setFractal(grid, bytesPerElement, type, newStep); - setFractal(grid + newStep * bytesPerElement, bytesPerElement, type, newStep); - setFractal(grid + (newStep * s_gridSize) * bytesPerElement, bytesPerElement, type, newStep); - setFractal(grid + ((newStep * s_gridSize) + newStep) * bytesPerElement, bytesPerElement, type, newStep); -} - - - -static byte_t * -getRawHeightfieldData -( -eTerrainModel model, -PHY_ScalarType type, -btScalar& minHeight, -btScalar& maxHeight -) -{ -// std::cerr << "\nRegenerating terrain\n"; -// std::cerr << " model = " << model << "\n"; -// std::cerr << " type = " << type << "\n"; - - long nElements = ((long) s_gridSize) * s_gridSize; -// std::cerr << " nElements = " << nElements << "\n"; - - int bytesPerElement = getByteSize(type); -// std::cerr << " bytesPerElement = " << bytesPerElement << "\n"; - btAssert(bytesPerElement > 0 && "bad bytes per element"); - - long nBytes = nElements * bytesPerElement; -// std::cerr << " nBytes = " << nBytes << "\n"; - byte_t * raw = new byte_t[nBytes]; - btAssert(raw && "out of memory"); - - // reseed randomization every 30 seconds -// srand(time(NULL) / 30); - - // populate based on model - switch (model) { - case eRadial: - setRadial(raw, bytesPerElement, type); - break; - - case eFractal: - for (int i = 0; i < nBytes; i++) - { - raw[i] = 0; - } - setFractal(raw, bytesPerElement, type, s_gridSize - 1); - break; - - default: - btAssert(!"bad model type"); - } - - if (0) { - // inside if(0) so it keeps compiling but isn't - // exercised and doesn't cause warnings -// std::cerr << "final grid:\n"; - dumpGrid(raw, bytesPerElement, type, s_gridSize - 1); - } - - // find min/max - for (int i = 0; i < s_gridSize; ++i) { - for (int j = 0; j < s_gridSize; ++j) { - float z = getGridHeight(raw, i, j, type); -// std::cerr << "i=" << i << ", j=" << j << ": z=" << z << "\n"; - - // update min/max - if (!i && !j) { - minHeight = z; - maxHeight = z; - } else { - if (z < minHeight) { - minHeight = z; - } - if (z > maxHeight) { - maxHeight = z; - } - } - } - } - - if (maxHeight < -minHeight) { - maxHeight = -minHeight; - } - if (minHeight > -maxHeight) { - minHeight = -maxHeight; - } - -// std::cerr << " minHeight = " << minHeight << "\n"; -// std::cerr << " maxHeight = " << maxHeight << "\n"; - - return raw; -} - - - -//////////////////////////////////////////////////////////////////////////////// -// -// TerrainDemo class -// -//////////////////////////////////////////////////////////////////////////////// - -/// class that demonstrates the btHeightfieldTerrainShape object -class TerrainDemo : public GlutDemoApplication { -public: - // constructor, destructor --------------------------------------------- - TerrainDemo(void); - ~TerrainDemo(void); - - virtual void initPhysics() {} - - // public class methods ------------------------------------------------ - void initialize(void); - - // DemoApplication class interface methods ----------------------------- - void clientMoveAndDisplay(void); - void keyboardCallback(unsigned char key, int x, int y); - void renderme(void); - -private: - // private helper methods ---------------------------------------------- - void resetPhysics(void); - void clearWorld(void); - - // private data members ------------------------------------------------ - btDefaultCollisionConfiguration * m_collisionConfiguration; - btCollisionDispatcher * m_dispatcher; - btAxisSweep3 * m_overlappingPairCache; - btSequentialImpulseConstraintSolver * m_constraintSolver; - btAlignedObjectArray m_collisionShapes; - int m_upAxis; - PHY_ScalarType m_type; - eTerrainModel m_model; - byte_t * m_rawHeightfieldData; - btScalar m_minHeight; - btScalar m_maxHeight; - float m_phase; // for dynamics - bool m_isDynamic; -}; - - - -TerrainDemo::TerrainDemo(void) -: -m_collisionConfiguration(NULL), -m_dispatcher(NULL), -m_overlappingPairCache(NULL), -m_constraintSolver(NULL), -m_upAxis(1), -m_type(PHY_FLOAT), -m_model(eFractal), -m_rawHeightfieldData(NULL), -m_phase(0.0), -m_isDynamic(true) -{ -} - - - -TerrainDemo::~TerrainDemo(void) -{ - clearWorld(); - - //delete dynamics world - delete m_dynamicsWorld; - - //delete solver - delete m_constraintSolver; - - //delete broadphase - delete m_overlappingPairCache; - - //delete dispatcher - delete m_dispatcher; - - delete m_collisionConfiguration; - -} - - - -//////////////////////////////////////////////////////////////////////////////// -// -// TerrainDemo -- public class methods -// -//////////////////////////////////////////////////////////////////////////////// - -/// one-time class and physics initialization -void TerrainDemo::initialize(void) -{ -// std::cerr << "initializing...\n"; - - // set up basic state - m_upAxis = 1; // start with Y-axis as "up" - m_type = PHY_FLOAT; - m_model = eRadial;//eFractal; - m_isDynamic = true; - - // set up the physics world - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - btVector3 worldMin(-1000,-1000,-1000); - btVector3 worldMax(1000,1000,1000); - m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); - m_constraintSolver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); - - // initialize axis- or type-dependent physics from here - this->resetPhysics(); -} - - - -//////////////////////////////////////////////////////////////////////////////// -// -// TerrainDemo -- DemoApplication class interface methods -// -//////////////////////////////////////////////////////////////////////////////// - -void TerrainDemo::clientMoveAndDisplay(void) -{ - // elapsed time - float us = getDeltaTimeMicroseconds(); - float seconds = 1.0e-6 * us; - - // we'll carefully iterate through each time step so we can update - // the dynamic model if necessary - long nStepsPerIteration = 1; - while (seconds > 1.0e-6) { - float dt = nStepsPerIteration * s_engineTimeStep; - if (dt > seconds) { - dt = seconds; - } - seconds -= dt; - // std::cerr << " Stepping through " << dt << " seconds\n"; - - // if dynamic and radial, go ahead and update the field - if (m_rawHeightfieldData && m_isDynamic && eRadial == m_model) { - m_phase += s_deltaPhase * dt; - if (m_phase > 2.0 * SIMD_PI) { - m_phase -= 2.0 * SIMD_PI; - } - int bpe = getByteSize(m_type); - btAssert(bpe > 0 && "Bad bytes per element"); - setRadial(m_rawHeightfieldData, bpe, m_type, m_phase); - } - - if (m_dynamicsWorld) { - m_dynamicsWorld->stepSimulation(dt, - nStepsPerIteration + 1, s_engineTimeStep); - } - } - - // okay, render - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - renderme(); - glFlush(); - glutSwapBuffers(); -} - - -static PHY_ScalarType nextType (PHY_ScalarType type) -{ - switch (type) - { - case PHY_FLOAT: - return PHY_SHORT; - break; - case PHY_SHORT: - return PHY_UCHAR; - break; - case PHY_UCHAR: - return PHY_FLOAT; - break; - } - btAssert (0); - return PHY_FLOAT; -} - -void TerrainDemo::keyboardCallback(unsigned char key, int x, int y) { - - if (',' == key) { - // increment model - m_model = (eFractal == m_model) ? eRadial : eFractal; - this->resetPhysics(); - } - if ('/' == key) { - // increment type - m_type = nextType(m_type); - this->resetPhysics(); - } - if ('\\' == key) { - // increment axis - m_upAxis++; - if (m_upAxis > 2) { - m_upAxis = 0; - } - this->resetPhysics(); - } - if ('[' == key) { - // toggle dynamics - m_isDynamic = !m_isDynamic; - } - - // let demo base class handle! - DemoApplication::keyboardCallback(key, x, y); -} - - - -static void doPrint(int x,int& y,int dy,const char * text) -{ - GLDebugDrawString(x,y, text); - y += dy; -} - - - -/// override the default display just so we can overlay a bit more text -void TerrainDemo::renderme(void) -{ - // give base class a shot - DemoApplication::renderme(); - - // overlay any debug information - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - // switch to orthographic - setOrthographicProjection(); - - // we'll draw on the right top of the screen - const int lineWidth = 200; - const int lineHeight = 16; - char buffer[256]; - - int xStart = m_glutScreenWidth - lineWidth; - int yStart = lineHeight; - - sprintf(buffer, "Terrain Type: %s", getTerrainTypeName(m_model)); - doPrint(xStart, yStart, lineHeight, buffer); - doPrint(xStart, yStart, lineHeight, "Press ',' to cycle terrain types"); - doPrint(xStart, yStart, lineHeight, ""); - - sprintf(buffer, "Data Type: %s", getDataTypeName(m_type)); - doPrint(xStart, yStart, lineHeight, buffer); - doPrint(xStart, yStart, lineHeight, "Press '/' to cycle data types"); - doPrint(xStart, yStart, lineHeight, ""); - - sprintf(buffer, "'up' axis: %s", getUpAxisName(m_upAxis)); - doPrint(xStart, yStart, lineHeight, buffer); - doPrint(xStart, yStart, lineHeight, "Press '\\' to cycle 'up' axes"); - doPrint(xStart, yStart, lineHeight, ""); - - if (eRadial == m_model) { - sprintf(buffer, "Dynamic: %s", m_isDynamic ? "yes" : "no"); - doPrint(xStart, yStart, lineHeight, buffer); - doPrint(xStart, yStart, lineHeight, "Press '[' to toggle dynamics"); - } -} - - - -//////////////////////////////////////////////////////////////////////////////// -// -// TerrainDemo -- private helper methods -// -//////////////////////////////////////////////////////////////////////////////// - -/// called whenever key terrain attribute is changed -void TerrainDemo::resetPhysics(void) -{ - // remove old heightfield - clearWorld(); - - // reset gravity to point in appropriate direction - m_dynamicsWorld->setGravity(getUpVector(m_upAxis, 0.0, -s_gravity)); - - // get new heightfield of appropriate type - m_rawHeightfieldData = - getRawHeightfieldData(m_model, m_type, m_minHeight, m_maxHeight); - btAssert(m_rawHeightfieldData && "failed to create raw heightfield"); - - bool flipQuadEdges = false; - btHeightfieldTerrainShape * heightfieldShape = - new btHeightfieldTerrainShape(s_gridSize, s_gridSize, - m_rawHeightfieldData, - s_gridHeightScale, - m_minHeight, m_maxHeight, - m_upAxis, m_type, flipQuadEdges); - btAssert(heightfieldShape && "null heightfield"); - - // scale the shape - btVector3 localScaling = getUpVector(m_upAxis, s_gridSpacing, 1.0); - heightfieldShape->setLocalScaling(localScaling); - - // stash this shape away - m_collisionShapes.push_back(heightfieldShape); - - // set origin to middle of heightfield - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(0,-20,0)); - - // create ground object - float mass = 0.0; - localCreateRigidBody(mass, tr, heightfieldShape); -} - - -/// removes all objects and shapes from the world -void TerrainDemo::clearWorld(void) -{ - //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;jinitialize(); - - return demo; -} - + +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006,2008 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 "TerrainDemo.h" // always include our own header first! + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" + +#include "GLDebugDrawer.h" + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "GLDebugFont.h" + + + +// constants ------------------------------------------------------------------- +static const float s_gravity = 9.8; // 9.8 m/s^2 + +static const int s_gridSize = 64 + 1; // must be (2^N) + 1 +static const float s_gridSpacing = 5.0; + +static const float s_gridHeightScale = 0.2; + +// the singularity at the center of the radial model means we need a lot of +// finely-spaced time steps to get the physics right. +// These numbers are probably too aggressive for a real game! +static const int s_requestedHz = 180; +static const float s_engineTimeStep = 1.0 / s_requestedHz; + +// delta phase: radians per second +static const float s_deltaPhase = 0.25 * 2.0 * SIMD_PI; + +// what type of terrain is generated? +enum eTerrainModel { + eRadial = 1, // deterministic + eFractal = 2 // random +}; + + +typedef unsigned char byte_t; + + + +//////////////////////////////////////////////////////////////////////////////// +// +// static helper methods +// +// Only used within this file (helpers and terrain generation, etc) +// +//////////////////////////////////////////////////////////////////////////////// + +static const char * +getTerrainTypeName +( +eTerrainModel model +) +{ + switch (model) { + case eRadial: + return "Radial"; + + case eFractal: + return "Fractal"; + + default: + btAssert(!"bad terrain model type"); + } + + return NULL; +} + + + +static const char * +getDataTypeName +( +PHY_ScalarType type +) +{ + switch (type) { + case PHY_UCHAR: + return "UnsignedChar"; + + case PHY_SHORT: + return "Short"; + + case PHY_FLOAT: + return "Float"; + + default: + btAssert(!"bad heightfield data type"); + } + + return NULL; +} + + + +static const char * +getUpAxisName +( +int axis +) +{ + switch (axis) { + case 0: + return "X"; + + case 1: + return "Y"; + + case 2: + return "Z"; + + default: + btAssert(!"bad up axis"); + } + + return NULL; +} + + + +static btVector3 +getUpVector +( +int upAxis, +btScalar regularValue, +btScalar upValue +) +{ + btAssert(upAxis >= 0 && upAxis <= 2 && "bad up axis"); + + btVector3 v(regularValue, regularValue, regularValue); + v[upAxis] = upValue; + + return v; +} + + + +// TODO: it would probably cleaner to have a struct per data type, so +// you could lookup byte sizes, conversion functions, etc. +static int getByteSize +( +PHY_ScalarType type +) +{ + int size = 0; + + switch (type) { + case PHY_FLOAT: + size = sizeof(float); + break; + + case PHY_UCHAR: + size = sizeof(unsigned char); + break; + + case PHY_SHORT: + size = sizeof(short); + break; + + default: + btAssert(!"Bad heightfield data type"); + } + + return size; +} + + + +static float +convertToFloat +( +const byte_t * p, +PHY_ScalarType type +) +{ + btAssert(p); + + switch (type) { + case PHY_FLOAT: + { + float * pf = (float *) p; + return *pf; + } + + case PHY_UCHAR: + { + unsigned char * pu = (unsigned char *) p; + return ((*pu) * s_gridHeightScale); + } + + case PHY_SHORT: + { + short * ps = (short *) p; + return ((*ps) * s_gridHeightScale); + } + + default: + btAssert(!"bad type"); + } + + return 0; +} + + + +static float +getGridHeight +( +byte_t * grid, +int i, +int j, +PHY_ScalarType type +) +{ + btAssert(grid); + btAssert(i >= 0 && i < s_gridSize); + btAssert(j >= 0 && j < s_gridSize); + + int bpe = getByteSize(type); + btAssert(bpe > 0 && "bad bytes per element"); + + int idx = (j * s_gridSize) + i; + long offset = ((long) bpe) * idx; + + byte_t * p = grid + offset; + + return convertToFloat(p, type); +} + + + +static void +convertFromFloat +( +byte_t * p, +float value, +PHY_ScalarType type +) +{ + btAssert(p && "null"); + + switch (type) { + case PHY_FLOAT: + { + float * pf = (float *) p; + *pf = value; + } + break; + + case PHY_UCHAR: + { + unsigned char * pu = (unsigned char *) p; + *pu = (unsigned char) (value / s_gridHeightScale); + } + break; + + case PHY_SHORT: + { + short * ps = (short *) p; + *ps = (short) (value / s_gridHeightScale); + } + break; + + default: + btAssert(!"bad type"); + } +} + + + +// creates a radially-varying heightfield +static void +setRadial +( +byte_t * grid, +int bytesPerElement, +PHY_ScalarType type, +float phase = 0.0 +) +{ + btAssert(grid); + btAssert(bytesPerElement > 0); + + // min/max + float period = 0.5 / s_gridSpacing; + float floor = 0.0; + float min_r = 3.0 * sqrt(s_gridSpacing); + float magnitude = 50.0 * sqrt(s_gridSpacing); + + // pick a base_phase such that phase = 0 results in max height + // (this way, if you create a heightfield with phase = 0, + // you can rely on the min/max heights that result) + float base_phase = (0.5 * SIMD_PI) - (period * min_r); + phase += base_phase; + + // center of grid + float cx = 0.5 * s_gridSize * s_gridSpacing; + float cy = cx; // assume square grid + byte_t * p = grid; + for (int i = 0; i < s_gridSize; ++i) { + float x = i * s_gridSpacing; + for (int j = 0; j < s_gridSize; ++j) { + float y = j * s_gridSpacing; + + float dx = x - cx; + float dy = y - cy; + + float r = sqrt((dx * dx) + (dy * dy)); + + float z = period; + if (r < min_r) { + r = min_r; + } + z = (1.0 / r) * sin(period * r + phase); + if (z > period) { + z = period; + } else if (z < -period) { + z = -period; + } + z = floor + magnitude * z; + + convertFromFloat(p, z, type); + p += bytesPerElement; + } + } +} + + + +static float +randomHeight +( +int step +) +{ + return (0.33 * s_gridSpacing * s_gridSize * step * (rand() - (0.5 * RAND_MAX))) / (1.0 * RAND_MAX * s_gridSize); +} + + + +static void +dumpGrid +( +const byte_t * grid, +int bytesPerElement, +PHY_ScalarType type, +int max +) +{ + //std::cerr << "Grid:\n"; + + char buffer[32]; + + for (int j = 0; j < max; ++j) { + for (int i = 0; i < max; ++i) { + long offset = j * s_gridSize + i; + float z = convertToFloat(grid + offset * bytesPerElement, type); + sprintf(buffer, "%6.2f", z); + //std::cerr << " " << buffer; + } + //std::cerr << "\n"; + } +} + + + +static void +updateHeight +( +byte_t * p, +float new_val, +PHY_ScalarType type +) +{ + float old_val = convertToFloat(p, type); + if (!old_val) { + convertFromFloat(p, new_val, type); + } +} + + + +// creates a random, fractal heightfield +static void +setFractal +( +byte_t * grid, +int bytesPerElement, +PHY_ScalarType type, +int step +) +{ + btAssert(grid); + btAssert(bytesPerElement > 0); + btAssert(step > 0); + btAssert(step < s_gridSize); + + int newStep = step / 2; +// std::cerr << "Computing grid with step = " << step << ": before\n"; +// dumpGrid(grid, bytesPerElement, type, step + 1); + + // special case: starting (must set four corners) + if (s_gridSize - 1 == step) { + // pick a non-zero (possibly negative) base elevation for testing + float base = randomHeight(step / 2); + + convertFromFloat(grid, base, type); + convertFromFloat(grid + step * bytesPerElement, base, type); + convertFromFloat(grid + step * s_gridSize * bytesPerElement, base, type); + convertFromFloat(grid + (step * s_gridSize + step) * bytesPerElement, base, type); + } + + // determine elevation of each corner + float c00 = convertToFloat(grid, type); + float c01 = convertToFloat(grid + step * bytesPerElement, type); + float c10 = convertToFloat(grid + (step * s_gridSize) * bytesPerElement, type); + float c11 = convertToFloat(grid + (step * s_gridSize + step) * bytesPerElement, type); + + // set top middle + updateHeight(grid + newStep * bytesPerElement, 0.5 * (c00 + c01) + randomHeight(step), type); + + // set left middle + updateHeight(grid + (newStep * s_gridSize) * bytesPerElement, 0.5 * (c00 + c10) + randomHeight(step), type); + + // set right middle + updateHeight(grid + (newStep * s_gridSize + step) * bytesPerElement, 0.5 * (c01 + c11) + randomHeight(step), type); + + // set bottom middle + updateHeight(grid + (step * s_gridSize + newStep) * bytesPerElement, 0.5 * (c10 + c11) + randomHeight(step), type); + + // set middle + updateHeight(grid + (newStep * s_gridSize + newStep) * bytesPerElement, 0.25 * (c00 + c01 + c10 + c11) + randomHeight(step), type); + +// std::cerr << "Computing grid with step = " << step << ": after\n"; +// dumpGrid(grid, bytesPerElement, type, step + 1); + + // terminate? + if (newStep < 2) { + return; + } + + // recurse + setFractal(grid, bytesPerElement, type, newStep); + setFractal(grid + newStep * bytesPerElement, bytesPerElement, type, newStep); + setFractal(grid + (newStep * s_gridSize) * bytesPerElement, bytesPerElement, type, newStep); + setFractal(grid + ((newStep * s_gridSize) + newStep) * bytesPerElement, bytesPerElement, type, newStep); +} + + + +static byte_t * +getRawHeightfieldData +( +eTerrainModel model, +PHY_ScalarType type, +btScalar& minHeight, +btScalar& maxHeight +) +{ +// std::cerr << "\nRegenerating terrain\n"; +// std::cerr << " model = " << model << "\n"; +// std::cerr << " type = " << type << "\n"; + + long nElements = ((long) s_gridSize) * s_gridSize; +// std::cerr << " nElements = " << nElements << "\n"; + + int bytesPerElement = getByteSize(type); +// std::cerr << " bytesPerElement = " << bytesPerElement << "\n"; + btAssert(bytesPerElement > 0 && "bad bytes per element"); + + long nBytes = nElements * bytesPerElement; +// std::cerr << " nBytes = " << nBytes << "\n"; + byte_t * raw = new byte_t[nBytes]; + btAssert(raw && "out of memory"); + + // reseed randomization every 30 seconds +// srand(time(NULL) / 30); + + // populate based on model + switch (model) { + case eRadial: + setRadial(raw, bytesPerElement, type); + break; + + case eFractal: + for (int i = 0; i < nBytes; i++) + { + raw[i] = 0; + } + setFractal(raw, bytesPerElement, type, s_gridSize - 1); + break; + + default: + btAssert(!"bad model type"); + } + + if (0) { + // inside if(0) so it keeps compiling but isn't + // exercised and doesn't cause warnings +// std::cerr << "final grid:\n"; + dumpGrid(raw, bytesPerElement, type, s_gridSize - 1); + } + + // find min/max + for (int i = 0; i < s_gridSize; ++i) { + for (int j = 0; j < s_gridSize; ++j) { + float z = getGridHeight(raw, i, j, type); +// std::cerr << "i=" << i << ", j=" << j << ": z=" << z << "\n"; + + // update min/max + if (!i && !j) { + minHeight = z; + maxHeight = z; + } else { + if (z < minHeight) { + minHeight = z; + } + if (z > maxHeight) { + maxHeight = z; + } + } + } + } + + if (maxHeight < -minHeight) { + maxHeight = -minHeight; + } + if (minHeight > -maxHeight) { + minHeight = -maxHeight; + } + +// std::cerr << " minHeight = " << minHeight << "\n"; +// std::cerr << " maxHeight = " << maxHeight << "\n"; + + return raw; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo class +// +//////////////////////////////////////////////////////////////////////////////// + +/// class that demonstrates the btHeightfieldTerrainShape object +class TerrainDemo : public GlutDemoApplication { +public: + // constructor, destructor --------------------------------------------- + TerrainDemo(void); + ~TerrainDemo(void); + + virtual void initPhysics() {} + + // public class methods ------------------------------------------------ + void initialize(void); + + // DemoApplication class interface methods ----------------------------- + void clientMoveAndDisplay(void); + void keyboardCallback(unsigned char key, int x, int y); + void renderme(void); + +private: + // private helper methods ---------------------------------------------- + void resetPhysics(void); + void clearWorld(void); + + // private data members ------------------------------------------------ + btDefaultCollisionConfiguration * m_collisionConfiguration; + btCollisionDispatcher * m_dispatcher; + btAxisSweep3 * m_overlappingPairCache; + btSequentialImpulseConstraintSolver * m_constraintSolver; + btAlignedObjectArray m_collisionShapes; + int m_upAxis; + PHY_ScalarType m_type; + eTerrainModel m_model; + byte_t * m_rawHeightfieldData; + btScalar m_minHeight; + btScalar m_maxHeight; + float m_phase; // for dynamics + bool m_isDynamic; +}; + + + +TerrainDemo::TerrainDemo(void) +: +m_collisionConfiguration(NULL), +m_dispatcher(NULL), +m_overlappingPairCache(NULL), +m_constraintSolver(NULL), +m_upAxis(1), +m_type(PHY_FLOAT), +m_model(eFractal), +m_rawHeightfieldData(NULL), +m_phase(0.0), +m_isDynamic(true) +{ +} + + + +TerrainDemo::~TerrainDemo(void) +{ + clearWorld(); + + //delete dynamics world + delete m_dynamicsWorld; + + //delete solver + delete m_constraintSolver; + + //delete broadphase + delete m_overlappingPairCache; + + //delete dispatcher + delete m_dispatcher; + + delete m_collisionConfiguration; + +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo -- public class methods +// +//////////////////////////////////////////////////////////////////////////////// + +/// one-time class and physics initialization +void TerrainDemo::initialize(void) +{ +// std::cerr << "initializing...\n"; + + // set up basic state + m_upAxis = 1; // start with Y-axis as "up" + m_type = PHY_FLOAT; + m_model = eRadial;//eFractal; + m_isDynamic = true; + + // set up the physics world + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + + // initialize axis- or type-dependent physics from here + this->resetPhysics(); +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo -- DemoApplication class interface methods +// +//////////////////////////////////////////////////////////////////////////////// + +void TerrainDemo::clientMoveAndDisplay(void) +{ + // elapsed time + float us = getDeltaTimeMicroseconds(); + float seconds = 1.0e-6 * us; + + // we'll carefully iterate through each time step so we can update + // the dynamic model if necessary + long nStepsPerIteration = 1; + while (seconds > 1.0e-6) { + float dt = nStepsPerIteration * s_engineTimeStep; + if (dt > seconds) { + dt = seconds; + } + seconds -= dt; + // std::cerr << " Stepping through " << dt << " seconds\n"; + + // if dynamic and radial, go ahead and update the field + if (m_rawHeightfieldData && m_isDynamic && eRadial == m_model) { + m_phase += s_deltaPhase * dt; + if (m_phase > 2.0 * SIMD_PI) { + m_phase -= 2.0 * SIMD_PI; + } + int bpe = getByteSize(m_type); + btAssert(bpe > 0 && "Bad bytes per element"); + setRadial(m_rawHeightfieldData, bpe, m_type, m_phase); + } + + if (m_dynamicsWorld) { + m_dynamicsWorld->stepSimulation(dt, + nStepsPerIteration + 1, s_engineTimeStep); + } + } + + // okay, render + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + renderme(); + glFlush(); + glutSwapBuffers(); +} + + +static PHY_ScalarType nextType (PHY_ScalarType type) +{ + switch (type) + { + case PHY_FLOAT: + return PHY_SHORT; + break; + case PHY_SHORT: + return PHY_UCHAR; + break; + case PHY_UCHAR: + return PHY_FLOAT; + break; + } + btAssert (0); + return PHY_FLOAT; +} + +void TerrainDemo::keyboardCallback(unsigned char key, int x, int y) { + + if (',' == key) { + // increment model + m_model = (eFractal == m_model) ? eRadial : eFractal; + this->resetPhysics(); + } + if ('/' == key) { + // increment type + m_type = nextType(m_type); + this->resetPhysics(); + } + if ('\\' == key) { + // increment axis + m_upAxis++; + if (m_upAxis > 2) { + m_upAxis = 0; + } + this->resetPhysics(); + } + if ('[' == key) { + // toggle dynamics + m_isDynamic = !m_isDynamic; + } + + // let demo base class handle! + DemoApplication::keyboardCallback(key, x, y); +} + + + +static void doPrint(int x,int& y,int dy,const char * text) +{ + GLDebugDrawString(x,y, text); + y += dy; +} + + + +/// override the default display just so we can overlay a bit more text +void TerrainDemo::renderme(void) +{ + // give base class a shot + DemoApplication::renderme(); + + // overlay any debug information + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + // switch to orthographic + setOrthographicProjection(); + + // we'll draw on the right top of the screen + const int lineWidth = 200; + const int lineHeight = 16; + char buffer[256]; + + int xStart = m_glutScreenWidth - lineWidth; + int yStart = lineHeight; + + sprintf(buffer, "Terrain Type: %s", getTerrainTypeName(m_model)); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press ',' to cycle terrain types"); + doPrint(xStart, yStart, lineHeight, ""); + + sprintf(buffer, "Data Type: %s", getDataTypeName(m_type)); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press '/' to cycle data types"); + doPrint(xStart, yStart, lineHeight, ""); + + sprintf(buffer, "'up' axis: %s", getUpAxisName(m_upAxis)); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press '\\' to cycle 'up' axes"); + doPrint(xStart, yStart, lineHeight, ""); + + if (eRadial == m_model) { + sprintf(buffer, "Dynamic: %s", m_isDynamic ? "yes" : "no"); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press '[' to toggle dynamics"); + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo -- private helper methods +// +//////////////////////////////////////////////////////////////////////////////// + +/// called whenever key terrain attribute is changed +void TerrainDemo::resetPhysics(void) +{ + // remove old heightfield + clearWorld(); + + // reset gravity to point in appropriate direction + m_dynamicsWorld->setGravity(getUpVector(m_upAxis, 0.0, -s_gravity)); + + // get new heightfield of appropriate type + m_rawHeightfieldData = + getRawHeightfieldData(m_model, m_type, m_minHeight, m_maxHeight); + btAssert(m_rawHeightfieldData && "failed to create raw heightfield"); + + bool flipQuadEdges = false; + btHeightfieldTerrainShape * heightfieldShape = + new btHeightfieldTerrainShape(s_gridSize, s_gridSize, + m_rawHeightfieldData, + s_gridHeightScale, + m_minHeight, m_maxHeight, + m_upAxis, m_type, flipQuadEdges); + btAssert(heightfieldShape && "null heightfield"); + + // scale the shape + btVector3 localScaling = getUpVector(m_upAxis, s_gridSpacing, 1.0); + heightfieldShape->setLocalScaling(localScaling); + + // stash this shape away + m_collisionShapes.push_back(heightfieldShape); + + // set origin to middle of heightfield + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(0,-20,0)); + + // create ground object + float mass = 0.0; + localCreateRigidBody(mass, tr, heightfieldShape); +} + + +/// removes all objects and shapes from the world +void TerrainDemo::clearWorld(void) +{ + //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;jinitialize(); + + return demo; +} + diff --git a/Demos/TerrainDemo/TerrainDemo.h b/Demos/TerrainDemo/TerrainDemo.h index 94e3a2d5b..1b6a3e6ac 100644 --- a/Demos/TerrainDemo/TerrainDemo.h +++ b/Demos/TerrainDemo/TerrainDemo.h @@ -1,27 +1,27 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006,2008 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 TERRAIN_DEMO_H -#define TERRAIN_DEMO_H - - -#include "GlutDemoApplication.h" - - -// all we need to expose publicly is the factory method! -GlutDemoApplication * btCreateTerrainDemo(void); - - -#endif //TERRAIN_DEMO_H - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006,2008 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 TERRAIN_DEMO_H +#define TERRAIN_DEMO_H + + +#include "GlutDemoApplication.h" + + +// all we need to expose publicly is the factory method! +GlutDemoApplication * btCreateTerrainDemo(void); + + +#endif //TERRAIN_DEMO_H + diff --git a/Demos/TerrainDemo/main.cpp b/Demos/TerrainDemo/main.cpp index 5dcea8619..6510f24f2 100644 --- a/Demos/TerrainDemo/main.cpp +++ b/Demos/TerrainDemo/main.cpp @@ -1,14 +1,14 @@ - -#include "TerrainDemo.h" -#include "GlutStuff.h" - -int main(int argc,char** argv) -{ - DemoApplication * demo = btCreateTerrainDemo(); - btAssert(demo && "failed to create terrain demo object"); - - return glutmain(argc, argv, 800, 600, - "Terrain Demo. http://www.continuousphysics.com/Bullet/phpBB2/", - demo); -} - + +#include "TerrainDemo.h" +#include "GlutStuff.h" + +int main(int argc,char** argv) +{ + DemoApplication * demo = btCreateTerrainDemo(); + btAssert(demo && "failed to create terrain demo object"); + + return glutmain(argc, argv, 800, 600, + "Terrain Demo. http://www.continuousphysics.com/Bullet/phpBB2/", + demo); +} + diff --git a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp index 061454f8e..5d094f2e4 100644 --- a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp +++ b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp @@ -1,175 +1,175 @@ -/* -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 "LinearMath/btIDebugDraw.h" -#include "GLDebugDrawer.h" -#include "UserCollisionAlgorithm.h" -#include "GL_ShapeDrawer.h" -#include "GlutStuff.h" - -//The user defined collision algorithm -#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" - -GLDebugDrawer debugDrawer; - -static const int NUM_VERTICES = 5; -static const int NUM_TRIANGLES=4; - -btVector3 gVertices[NUM_VERTICES]; -int gIndices[NUM_TRIANGLES*3]; -const float TRIANGLE_SIZE=10.f; - - -///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; -} - - - - - - -int main(int argc,char** argv) -{ - - UserCollisionAlgorithm* userCollisionAlgorithm = new UserCollisionAlgorithm; - userCollisionAlgorithm->initPhysics(); - userCollisionAlgorithm->setCameraDistance(30.f); - - return glutmain(argc, argv,640,480,"Static Concave Mesh Demo",userCollisionAlgorithm); -} - -void UserCollisionAlgorithm::initPhysics() -{ - #define TRISIZE 5.f - - - const int NUM_VERTS_X = 50; - const int NUM_VERTS_Y = 50; - const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - - btVector3* gVertices = new btVector3[totalVerts]; - - int i; - for ( i=0;iaddTriangle(gVertices[j*NUM_VERTS_X+i],gVertices[j*NUM_VERTS_X+i+1],gVertices[(j+1)*NUM_VERTS_X+i+1]); - trimesh->addTriangle(gVertices[j*NUM_VERTS_X+i],gVertices[(j+1)*NUM_VERTS_X+i+1],gVertices[(j+1)*NUM_VERTS_X+i]); - } - } - - delete[] gVertices; - - bool useQuantizedBvhTree = true; - btCollisionShape* trimeshShape = new btBvhTriangleMeshShape(trimesh,useQuantizedBvhTree); - - //ConstraintSolver* solver = new btSequentialImpulseConstraintSolver; - btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); - - btVector3 maxAabb(10000,10000,10000); - btBroadphaseInterface* broadphase = new btAxisSweep3(-maxAabb,maxAabb);//SimpleBroadphase(); - dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,GIMPACT_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc); - - btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,constraintSolver,collisionConfiguration); - - float mass = 0.f; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,-2,0)); - - btRigidBody* staticBody= localCreateRigidBody(mass, startTransform,trimeshShape); - //enable custom material callback - staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - - { - for (int i=0;i<10;i++) - { - btCollisionShape* sphereShape = new btSphereShape(1); - startTransform.setOrigin(btVector3(1,2*i,1)); - //btRigidBody* body = localCreateRigidBody(1, startTransform,sphereShape); - localCreateRigidBody(1, startTransform,sphereShape); - } - } - - - - m_dynamicsWorld->setDebugDrawer(&debugDrawer); -} - -void UserCollisionAlgorithm::clientMoveAndDisplay() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - - m_dynamicsWorld->stepSimulation(dt); - - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - renderme(); - - glFlush(); - glutSwapBuffers(); - -} - - - - - - -void UserCollisionAlgorithm::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - glFlush(); - glutSwapBuffers(); -} - - +/* +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 "LinearMath/btIDebugDraw.h" +#include "GLDebugDrawer.h" +#include "UserCollisionAlgorithm.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +//The user defined collision algorithm +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" + +GLDebugDrawer debugDrawer; + +static const int NUM_VERTICES = 5; +static const int NUM_TRIANGLES=4; + +btVector3 gVertices[NUM_VERTICES]; +int gIndices[NUM_TRIANGLES*3]; +const float TRIANGLE_SIZE=10.f; + + +///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; +} + + + + + + +int main(int argc,char** argv) +{ + + UserCollisionAlgorithm* userCollisionAlgorithm = new UserCollisionAlgorithm; + userCollisionAlgorithm->initPhysics(); + userCollisionAlgorithm->setCameraDistance(30.f); + + return glutmain(argc, argv,640,480,"Static Concave Mesh Demo",userCollisionAlgorithm); +} + +void UserCollisionAlgorithm::initPhysics() +{ + #define TRISIZE 5.f + + + const int NUM_VERTS_X = 50; + const int NUM_VERTS_Y = 50; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + + btVector3* gVertices = new btVector3[totalVerts]; + + int i; + for ( i=0;iaddTriangle(gVertices[j*NUM_VERTS_X+i],gVertices[j*NUM_VERTS_X+i+1],gVertices[(j+1)*NUM_VERTS_X+i+1]); + trimesh->addTriangle(gVertices[j*NUM_VERTS_X+i],gVertices[(j+1)*NUM_VERTS_X+i+1],gVertices[(j+1)*NUM_VERTS_X+i]); + } + } + + delete[] gVertices; + + bool useQuantizedBvhTree = true; + btCollisionShape* trimeshShape = new btBvhTriangleMeshShape(trimesh,useQuantizedBvhTree); + + //ConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + + btVector3 maxAabb(10000,10000,10000); + btBroadphaseInterface* broadphase = new btAxisSweep3(-maxAabb,maxAabb);//SimpleBroadphase(); + dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,GIMPACT_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc); + + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,constraintSolver,collisionConfiguration); + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-2,0)); + + btRigidBody* staticBody= localCreateRigidBody(mass, startTransform,trimeshShape); + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + { + for (int i=0;i<10;i++) + { + btCollisionShape* sphereShape = new btSphereShape(1); + startTransform.setOrigin(btVector3(1,2*i,1)); + //btRigidBody* body = localCreateRigidBody(1, startTransform,sphereShape); + localCreateRigidBody(1, startTransform,sphereShape); + } + } + + + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); +} + +void UserCollisionAlgorithm::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + + + +void UserCollisionAlgorithm::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + diff --git a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h index 629c2805f..acfa37c09 100644 --- a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h +++ b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h @@ -1,36 +1,36 @@ -/* -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 USER_COLLISION_ALGORITHM_DEMO_H -#define USER_COLLISION_ALGORITHM_DEMO_H - -#include "GlutDemoApplication.h" - -///UserCollisionAlgorithmDemo shows how to register and use your own collision algorithm for a certain shape pair type -class UserCollisionAlgorithm : public GlutDemoApplication -{ - public: - - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - - -}; - -#endif //USER_COLLISION_ALGORITHM_DEMO_H - +/* +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 USER_COLLISION_ALGORITHM_DEMO_H +#define USER_COLLISION_ALGORITHM_DEMO_H + +#include "GlutDemoApplication.h" + +///UserCollisionAlgorithmDemo shows how to register and use your own collision algorithm for a certain shape pair type +class UserCollisionAlgorithm : public GlutDemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + + +}; + +#endif //USER_COLLISION_ALGORITHM_DEMO_H + diff --git a/Demos/VehicleDemo/VehicleDemo.cpp b/Demos/VehicleDemo/VehicleDemo.cpp index d25d1596a..bbdea6b0c 100644 --- a/Demos/VehicleDemo/VehicleDemo.cpp +++ b/Demos/VehicleDemo/VehicleDemo.cpp @@ -1,671 +1,671 @@ -/* -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. -*/ - -/// September 2006: VehicleDemo is work in progress, this file is mostly just a placeholder -/// This VehicleDemo file is very early in development, please check it later -/// One todo is a basic engine model: -/// A function that maps user input (throttle) into torque/force applied on the wheels -/// with gears etc. -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" - -// -// By default, Bullet Vehicle uses Y as up axis. -// You can override the up axis, for example Z-axis up. Enable this define to see how to: -//#define FORCE_ZAXIS_UP 1 -// - -#ifdef FORCE_ZAXIS_UP - int rightIndex = 0; - int upIndex = 2; - int forwardIndex = 1; - btVector3 wheelDirectionCS0(0,0,-1); - btVector3 wheelAxleCS(1,0,0); -#else - int rightIndex = 0; - int upIndex = 1; - int forwardIndex = 2; - btVector3 wheelDirectionCS0(0,-1,0); - btVector3 wheelAxleCS(-1,0,0); -#endif - -#include "GLDebugDrawer.h" -#include //printf debugging - -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" -#include "VehicleDemo.h" - -const int maxProxies = 32766; -const int maxOverlap = 65535; - -///btRaycastVehicle is the interface for the constraint that implements the raycast vehicle -///notice that for higher-quality slow-moving vehicles, another approach might be better -///implementing explicit hinged-wheel constraints with cylinder collision, rather then raycasts -float gEngineForce = 0.f; -float gBreakingForce = 0.f; - -float maxEngineForce = 1000.f;//this should be engine/velocity dependent -float maxBreakingForce = 100.f; - -float gVehicleSteering = 0.f; -float steeringIncrement = 0.04f; -float steeringClamp = 0.3f; -float wheelRadius = 0.5f; -float wheelWidth = 0.4f; -float wheelFriction = 1000;//BT_LARGE_FLOAT; -float suspensionStiffness = 20.f; -float suspensionDamping = 2.3f; -float suspensionCompression = 4.4f; -float rollInfluence = 0.1f;//1.0f; - - -btScalar suspensionRestLength(0.6); - -#define CUBE_HALF_EXTENTS 1 - - - -//////////////////////////////////// - - - - -VehicleDemo::VehicleDemo() -: -m_carChassis(0), -m_cameraHeight(4.f), -m_minCameraDistance(3.f), -m_maxCameraDistance(10.f), -m_indexVertexArrays(0), -m_vertices(0) -{ - m_vehicle = 0; - m_wheelShape = 0; - m_cameraPosition = btVector3(30,30,30); -} - -VehicleDemo::~VehicleDemo() -{ - //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;jsetGravity(btVector3(0,0,-10)); -#endif - - //m_dynamicsWorld->setGravity(btVector3(0,0,0)); -btTransform tr; -tr.setIdentity(); - -//either use heightfield or triangle mesh -#define USE_TRIMESH_GROUND 1 -#ifdef USE_TRIMESH_GROUND - int i; - -const float TRIANGLE_SIZE=20.f; - - //create a triangle-mesh ground - int vertStride = sizeof(btVector3); - int indexStride = 3*sizeof(int); - - const int NUM_VERTS_X = 20; - const int NUM_VERTS_Y = 20; - const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - - const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); - - m_vertices = new btVector3[totalVerts]; - int* gIndices = new int[totalTriangles*3]; - - - - for ( i=0;isetUseDiamondSubdivision(true); - - btVector3 localScaling(20,20,20); - localScaling[upIndex]=1.f; - groundShape->setLocalScaling(localScaling); - - tr.setOrigin(btVector3(0,-64.5f,0)); - -#endif // - - m_collisionShapes.push_back(groundShape); - - //create ground object - localCreateRigidBody(0,tr,groundShape); - -#ifdef FORCE_ZAXIS_UP -// indexRightAxis = 0; -// indexUpAxis = 2; -// indexForwardAxis = 1; - btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); - btCompoundShape* compound = new btCompoundShape(); - btTransform localTrans; - localTrans.setIdentity(); - //localTrans effectively shifts the center of mass with respect to the chassis - localTrans.setOrigin(btVector3(0,0,1)); -#else - btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); - m_collisionShapes.push_back(chassisShape); - - btCompoundShape* compound = new btCompoundShape(); - m_collisionShapes.push_back(compound); - btTransform localTrans; - localTrans.setIdentity(); - //localTrans effectively shifts the center of mass with respect to the chassis - localTrans.setOrigin(btVector3(0,1,0)); -#endif - - compound->addChildShape(localTrans,chassisShape); - - tr.setOrigin(btVector3(0,0.f,0)); - - m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); - //m_carChassis->setDamping(0.2,0.2); - - m_wheelShape = new btCylinderShapeX(btVector3(wheelWidth,wheelRadius,wheelRadius)); - - clientResetScene(); - - /// create vehicle - { - - m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); - m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); - - ///never deactivate the vehicle - m_carChassis->setActivationState(DISABLE_DEACTIVATION); - - m_dynamicsWorld->addVehicle(m_vehicle); - - float connectionHeight = 1.2f; - - - bool isFrontWheel=true; - - //choose coordinate system - m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); - -#ifdef FORCE_ZAXIS_UP - btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); -#else - btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); -#endif - - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); -#ifdef FORCE_ZAXIS_UP - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); -#else - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); -#endif - - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); -#ifdef FORCE_ZAXIS_UP - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); -#else - connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); -#endif //FORCE_ZAXIS_UP - isFrontWheel = false; - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); -#ifdef FORCE_ZAXIS_UP - connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); -#else - connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); -#endif - m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); - - for (int i=0;igetNumWheels();i++) - { - btWheelInfo& wheel = m_vehicle->getWheelInfo(i); - wheel.m_suspensionStiffness = suspensionStiffness; - wheel.m_wheelsDampingRelaxation = suspensionDamping; - wheel.m_wheelsDampingCompression = suspensionCompression; - wheel.m_frictionSlip = wheelFriction; - wheel.m_rollInfluence = rollInfluence; - } - } - - - setCameraDistance(26.f); - -} - - -//to be implemented by the demo -void VehicleDemo::renderme() -{ - - updateCamera(); - - btScalar m[16]; - int i; - - - btVector3 wheelColor(1,0,0); - - btVector3 worldBoundsMin,worldBoundsMax; - getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); - - - - for (i=0;igetNumWheels();i++) - { - //synchronize the wheels with the (interpolated) chassis worldtransform - m_vehicle->updateWheelTransform(i,true); - //draw wheels (cylinders) - m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); - m_shapeDrawer->drawOpenGL(m,m_wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); - } - - - DemoApplication::renderme(); - -} - -void VehicleDemo::clientMoveAndDisplay() -{ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - { - int wheelIndex = 2; - m_vehicle->applyEngineForce(gEngineForce,wheelIndex); - m_vehicle->setBrake(gBreakingForce,wheelIndex); - wheelIndex = 3; - m_vehicle->applyEngineForce(gEngineForce,wheelIndex); - m_vehicle->setBrake(gBreakingForce,wheelIndex); - - - wheelIndex = 0; - m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); - wheelIndex = 1; - m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); - - } - - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - if (m_dynamicsWorld) - { - //during idle mode, just run 1 simulation step maximum - int maxSimSubSteps = m_idle ? 1 : 2; - if (m_idle) - dt = 1.0/420.f; - - int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); - - -//#define VERBOSE_FEEDBACK -#ifdef VERBOSE_FEEDBACK - 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_FEEDBACK - - } - - - - - - - -#ifdef USE_QUICKPROF - btProfiler::beginBlock("render"); -#endif //USE_QUICKPROF - - - renderme(); - - //optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - -#ifdef USE_QUICKPROF - btProfiler::endBlock("render"); -#endif - - - glFlush(); - glutSwapBuffers(); - -} - - - -void VehicleDemo::displayCallback(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - -//optional but useful: debug drawing - if (m_dynamicsWorld) - m_dynamicsWorld->debugDrawWorld(); - - glFlush(); - glutSwapBuffers(); -} - - - -void VehicleDemo::clientResetScene() -{ - gVehicleSteering = 0.f; - m_carChassis->setCenterOfMassTransform(btTransform::getIdentity()); - m_carChassis->setLinearVelocity(btVector3(0,0,0)); - m_carChassis->setAngularVelocity(btVector3(0,0,0)); - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_carChassis->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - if (m_vehicle) - { - m_vehicle->resetSuspension(); - for (int i=0;igetNumWheels();i++) - { - //synchronize the wheels with the (interpolated) chassis worldtransform - m_vehicle->updateWheelTransform(i,true); - } - } - -} - - - -void VehicleDemo::specialKeyboardUp(int key, int x, int y) -{ - switch (key) - { - case GLUT_KEY_UP : - { - gEngineForce = 0.f; - break; - } - case GLUT_KEY_DOWN : - { - gBreakingForce = 0.f; - break; - } - default: - DemoApplication::specialKeyboardUp(key,x,y); - break; - } - -} - - -void VehicleDemo::specialKeyboard(int key, int x, int y) -{ - -// printf("key = %i x=%i y=%i\n",key,x,y); - - switch (key) - { - case GLUT_KEY_LEFT : - { - gVehicleSteering += steeringIncrement; - if ( gVehicleSteering > steeringClamp) - gVehicleSteering = steeringClamp; - - break; - } - case GLUT_KEY_RIGHT : - { - gVehicleSteering -= steeringIncrement; - if ( gVehicleSteering < -steeringClamp) - gVehicleSteering = -steeringClamp; - - break; - } - case GLUT_KEY_UP : - { - gEngineForce = maxEngineForce; - gBreakingForce = 0.f; - break; - } - case GLUT_KEY_DOWN : - { - gBreakingForce = maxBreakingForce; - gEngineForce = 0.f; - break; - } - default: - DemoApplication::specialKeyboard(key,x,y); - break; - } - -// glutPostRedisplay(); - - -} - - - -void VehicleDemo::updateCamera() -{ - -//#define DISABLE_CAMERA 1 -#ifdef DISABLE_CAMERA - DemoApplication::updateCamera(); - return; -#endif //DISABLE_CAMERA - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - btTransform chassisWorldTrans; - - //look at the vehicle - m_carChassis->getMotionState()->getWorldTransform(chassisWorldTrans); - m_cameraTargetPosition = chassisWorldTrans.getOrigin(); - - //interpolate the camera height -#ifdef FORCE_ZAXIS_UP - m_cameraPosition[2] = (15.0*m_cameraPosition[2] + m_cameraTargetPosition[2] + m_cameraHeight)/16.0; -#else - m_cameraPosition[1] = (15.0*m_cameraPosition[1] + m_cameraTargetPosition[1] + m_cameraHeight)/16.0; -#endif - - btVector3 camToObject = m_cameraTargetPosition - m_cameraPosition; - - //keep distance between min and max distance - float cameraDistance = camToObject.length(); - float correctionFactor = 0.f; - if (cameraDistance < m_minCameraDistance) - { - correctionFactor = 0.15*(m_minCameraDistance-cameraDistance)/cameraDistance; - } - if (cameraDistance > m_maxCameraDistance) - { - correctionFactor = 0.15*(m_maxCameraDistance-cameraDistance)/cameraDistance; - } - m_cameraPosition -= correctionFactor*camToObject; - - btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; - glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], - m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], - m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); - - - -} - +/* +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. +*/ + +/// September 2006: VehicleDemo is work in progress, this file is mostly just a placeholder +/// This VehicleDemo file is very early in development, please check it later +/// One todo is a basic engine model: +/// A function that maps user input (throttle) into torque/force applied on the wheels +/// with gears etc. +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" + +// +// By default, Bullet Vehicle uses Y as up axis. +// You can override the up axis, for example Z-axis up. Enable this define to see how to: +//#define FORCE_ZAXIS_UP 1 +// + +#ifdef FORCE_ZAXIS_UP + int rightIndex = 0; + int upIndex = 2; + int forwardIndex = 1; + btVector3 wheelDirectionCS0(0,0,-1); + btVector3 wheelAxleCS(1,0,0); +#else + int rightIndex = 0; + int upIndex = 1; + int forwardIndex = 2; + btVector3 wheelDirectionCS0(0,-1,0); + btVector3 wheelAxleCS(-1,0,0); +#endif + +#include "GLDebugDrawer.h" +#include //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "VehicleDemo.h" + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +///btRaycastVehicle is the interface for the constraint that implements the raycast vehicle +///notice that for higher-quality slow-moving vehicles, another approach might be better +///implementing explicit hinged-wheel constraints with cylinder collision, rather then raycasts +float gEngineForce = 0.f; +float gBreakingForce = 0.f; + +float maxEngineForce = 1000.f;//this should be engine/velocity dependent +float maxBreakingForce = 100.f; + +float gVehicleSteering = 0.f; +float steeringIncrement = 0.04f; +float steeringClamp = 0.3f; +float wheelRadius = 0.5f; +float wheelWidth = 0.4f; +float wheelFriction = 1000;//BT_LARGE_FLOAT; +float suspensionStiffness = 20.f; +float suspensionDamping = 2.3f; +float suspensionCompression = 4.4f; +float rollInfluence = 0.1f;//1.0f; + + +btScalar suspensionRestLength(0.6); + +#define CUBE_HALF_EXTENTS 1 + + + +//////////////////////////////////// + + + + +VehicleDemo::VehicleDemo() +: +m_carChassis(0), +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_vehicle = 0; + m_wheelShape = 0; + m_cameraPosition = btVector3(30,30,30); +} + +VehicleDemo::~VehicleDemo() +{ + //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;jsetGravity(btVector3(0,0,-10)); +#endif + + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); +btTransform tr; +tr.setIdentity(); + +//either use heightfield or triangle mesh +#define USE_TRIMESH_GROUND 1 +#ifdef USE_TRIMESH_GROUND + int i; + +const float TRIANGLE_SIZE=20.f; + + //create a triangle-mesh ground + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + const int NUM_VERTS_X = 20; + const int NUM_VERTS_Y = 20; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + m_vertices = new btVector3[totalVerts]; + int* gIndices = new int[totalTriangles*3]; + + + + for ( i=0;isetUseDiamondSubdivision(true); + + btVector3 localScaling(20,20,20); + localScaling[upIndex]=1.f; + groundShape->setLocalScaling(localScaling); + + tr.setOrigin(btVector3(0,-64.5f,0)); + +#endif // + + m_collisionShapes.push_back(groundShape); + + //create ground object + localCreateRigidBody(0,tr,groundShape); + +#ifdef FORCE_ZAXIS_UP +// indexRightAxis = 0; +// indexUpAxis = 2; +// indexForwardAxis = 1; + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); + btCompoundShape* compound = new btCompoundShape(); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,0,1)); +#else + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); + m_collisionShapes.push_back(chassisShape); + + btCompoundShape* compound = new btCompoundShape(); + m_collisionShapes.push_back(compound); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,1,0)); +#endif + + compound->addChildShape(localTrans,chassisShape); + + tr.setOrigin(btVector3(0,0.f,0)); + + m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); + //m_carChassis->setDamping(0.2,0.2); + + m_wheelShape = new btCylinderShapeX(btVector3(wheelWidth,wheelRadius,wheelRadius)); + + clientResetScene(); + + /// create vehicle + { + + m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); + m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); + + ///never deactivate the vehicle + m_carChassis->setActivationState(DISABLE_DEACTIVATION); + + m_dynamicsWorld->addVehicle(m_vehicle); + + float connectionHeight = 1.2f; + + + bool isFrontWheel=true; + + //choose coordinate system + m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); + +#ifdef FORCE_ZAXIS_UP + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif //FORCE_ZAXIS_UP + isFrontWheel = false; + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); + + for (int i=0;igetNumWheels();i++) + { + btWheelInfo& wheel = m_vehicle->getWheelInfo(i); + wheel.m_suspensionStiffness = suspensionStiffness; + wheel.m_wheelsDampingRelaxation = suspensionDamping; + wheel.m_wheelsDampingCompression = suspensionCompression; + wheel.m_frictionSlip = wheelFriction; + wheel.m_rollInfluence = rollInfluence; + } + } + + + setCameraDistance(26.f); + +} + + +//to be implemented by the demo +void VehicleDemo::renderme() +{ + + updateCamera(); + + btScalar m[16]; + int i; + + + btVector3 wheelColor(1,0,0); + + btVector3 worldBoundsMin,worldBoundsMax; + getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + + for (i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + //draw wheels (cylinders) + m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); + m_shapeDrawer->drawOpenGL(m,m_wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + DemoApplication::renderme(); + +} + +void VehicleDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + { + int wheelIndex = 2; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + wheelIndex = 3; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + + + wheelIndex = 0; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + wheelIndex = 1; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + + } + + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + 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_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void VehicleDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + +//optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + +void VehicleDemo::clientResetScene() +{ + gVehicleSteering = 0.f; + m_carChassis->setCenterOfMassTransform(btTransform::getIdentity()); + m_carChassis->setLinearVelocity(btVector3(0,0,0)); + m_carChassis->setAngularVelocity(btVector3(0,0,0)); + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_carChassis->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + if (m_vehicle) + { + m_vehicle->resetSuspension(); + for (int i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + } + } + +} + + + +void VehicleDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP : + { + gEngineForce = 0.f; + break; + } + case GLUT_KEY_DOWN : + { + gBreakingForce = 0.f; + break; + } + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } + +} + + +void VehicleDemo::specialKeyboard(int key, int x, int y) +{ + +// printf("key = %i x=%i y=%i\n",key,x,y); + + switch (key) + { + case GLUT_KEY_LEFT : + { + gVehicleSteering += steeringIncrement; + if ( gVehicleSteering > steeringClamp) + gVehicleSteering = steeringClamp; + + break; + } + case GLUT_KEY_RIGHT : + { + gVehicleSteering -= steeringIncrement; + if ( gVehicleSteering < -steeringClamp) + gVehicleSteering = -steeringClamp; + + break; + } + case GLUT_KEY_UP : + { + gEngineForce = maxEngineForce; + gBreakingForce = 0.f; + break; + } + case GLUT_KEY_DOWN : + { + gBreakingForce = maxBreakingForce; + gEngineForce = 0.f; + break; + } + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + +// glutPostRedisplay(); + + +} + + + +void VehicleDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 +#ifdef DISABLE_CAMERA + DemoApplication::updateCamera(); + return; +#endif //DISABLE_CAMERA + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform chassisWorldTrans; + + //look at the vehicle + m_carChassis->getMotionState()->getWorldTransform(chassisWorldTrans); + m_cameraTargetPosition = chassisWorldTrans.getOrigin(); + + //interpolate the camera height +#ifdef FORCE_ZAXIS_UP + m_cameraPosition[2] = (15.0*m_cameraPosition[2] + m_cameraTargetPosition[2] + m_cameraHeight)/16.0; +#else + m_cameraPosition[1] = (15.0*m_cameraPosition[1] + m_cameraTargetPosition[1] + m_cameraHeight)/16.0; +#endif + + btVector3 camToObject = m_cameraTargetPosition - m_cameraPosition; + + //keep distance between min and max distance + float cameraDistance = camToObject.length(); + float correctionFactor = 0.f; + if (cameraDistance < m_minCameraDistance) + { + correctionFactor = 0.15*(m_minCameraDistance-cameraDistance)/cameraDistance; + } + if (cameraDistance > m_maxCameraDistance) + { + correctionFactor = 0.15*(m_maxCameraDistance-cameraDistance)/cameraDistance; + } + m_cameraPosition -= correctionFactor*camToObject; + + btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + diff --git a/Demos/VehicleDemo/VehicleDemo.h b/Demos/VehicleDemo/VehicleDemo.h index 1580312b1..4a05c8fcf 100644 --- a/Demos/VehicleDemo/VehicleDemo.h +++ b/Demos/VehicleDemo/VehicleDemo.h @@ -1,91 +1,91 @@ -/* -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 VEHICLE_DEMO_H -#define VEHICLE_DEMO_H - -class btVehicleTuning; -struct btVehicleRaycaster; -class btCollisionShape; - -#include "BulletDynamics/Vehicle/btRaycastVehicle.h" - -#include "GlutDemoApplication.h" - -///VehicleDemo shows how to setup and use the built-in raycast vehicle -class VehicleDemo : public GlutDemoApplication -{ - public: - - btRigidBody* m_carChassis; - - btAlignedObjectArray m_collisionShapes; - - class btBroadphaseInterface* m_overlappingPairCache; - - class btCollisionDispatcher* m_dispatcher; - - class btConstraintSolver* m_constraintSolver; - - class btDefaultCollisionConfiguration* m_collisionConfiguration; - - class btTriangleIndexVertexArray* m_indexVertexArrays; - - btVector3* m_vertices; - - - btRaycastVehicle::btVehicleTuning m_tuning; - btVehicleRaycaster* m_vehicleRayCaster; - btRaycastVehicle* m_vehicle; - btCollisionShape* m_wheelShape; - - float m_cameraHeight; - - float m_minCameraDistance; - float m_maxCameraDistance; - - - VehicleDemo(); - - virtual ~VehicleDemo(); - - virtual void clientMoveAndDisplay(); - - virtual void clientResetScene(); - - virtual void displayCallback(); - - ///a very basic camera following the vehicle - virtual void updateCamera(); - - virtual void specialKeyboard(int key, int x, int y); - - virtual void specialKeyboardUp(int key, int x, int y); - - void renderme(); - - void initPhysics(); - - static DemoApplication* Create() - { - VehicleDemo* demo = new VehicleDemo(); - demo->myinit(); - demo->initPhysics(); - return demo; - } -}; - -#endif //VEHICLE_DEMO_H - - +/* +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 VEHICLE_DEMO_H +#define VEHICLE_DEMO_H + +class btVehicleTuning; +struct btVehicleRaycaster; +class btCollisionShape; + +#include "BulletDynamics/Vehicle/btRaycastVehicle.h" + +#include "GlutDemoApplication.h" + +///VehicleDemo shows how to setup and use the built-in raycast vehicle +class VehicleDemo : public GlutDemoApplication +{ + public: + + btRigidBody* m_carChassis; + + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + class btTriangleIndexVertexArray* m_indexVertexArrays; + + btVector3* m_vertices; + + + btRaycastVehicle::btVehicleTuning m_tuning; + btVehicleRaycaster* m_vehicleRayCaster; + btRaycastVehicle* m_vehicle; + btCollisionShape* m_wheelShape; + + float m_cameraHeight; + + float m_minCameraDistance; + float m_maxCameraDistance; + + + VehicleDemo(); + + virtual ~VehicleDemo(); + + virtual void clientMoveAndDisplay(); + + virtual void clientResetScene(); + + virtual void displayCallback(); + + ///a very basic camera following the vehicle + virtual void updateCamera(); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + void renderme(); + + void initPhysics(); + + static DemoApplication* Create() + { + VehicleDemo* demo = new VehicleDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //VEHICLE_DEMO_H + + diff --git a/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln b/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln index 6502f91ff..728596ecc 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln +++ b/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln @@ -1,65 +1,65 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwCopyDLL", "TwCopyDLL.vcproj", "{AB180E0E-0EFA-4AD4-8F08-4492D144D963}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLFW", "TwSimpleGLFW.vcproj", "{29C096AF-172E-4A36-A1FE-E15B259D6834}" - ProjectSection(ProjectDependencies) = postProject - {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLUT", "TwSimpleGLUT.vcproj", "{CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}" - ProjectSection(ProjectDependencies) = postProject - {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleSDL", "TwSimpleSDL.vcproj", "{3B516919-D0DA-43CE-820E-8306368F605B}" - ProjectSection(ProjectDependencies) = postProject - {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX9", "TwSimpleDX9.vcproj", "{6B414E54-701C-4ED3-9034-F5CD7BFC3451}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" - ProjectSection(ProjectDependencies) = postProject - {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug.ActiveCfg = Debug|Win32 - {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug.Build.0 = Debug|Win32 - {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release.ActiveCfg = Release|Win32 - {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release.Build.0 = Release|Win32 - {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug.ActiveCfg = Debug|Win32 - {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug.Build.0 = Debug|Win32 - {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release.ActiveCfg = Release|Win32 - {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release.Build.0 = Release|Win32 - {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug.ActiveCfg = Debug|Win32 - {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug.Build.0 = Debug|Win32 - {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release.ActiveCfg = Release|Win32 - {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release.Build.0 = Release|Win32 - {3B516919-D0DA-43CE-820E-8306368F605B}.Debug.ActiveCfg = Debug|Win32 - {3B516919-D0DA-43CE-820E-8306368F605B}.Debug.Build.0 = Debug|Win32 - {3B516919-D0DA-43CE-820E-8306368F605B}.Release.ActiveCfg = Release|Win32 - {3B516919-D0DA-43CE-820E-8306368F605B}.Release.Build.0 = Release|Win32 - {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug.ActiveCfg = Debug|Win32 - {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug.Build.0 = Debug|Win32 - {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release.ActiveCfg = Release|Win32 - {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release.Build.0 = Release|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.ActiveCfg = Debug|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.Build.0 = Debug|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.ActiveCfg = Release|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwCopyDLL", "TwCopyDLL.vcproj", "{AB180E0E-0EFA-4AD4-8F08-4492D144D963}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLFW", "TwSimpleGLFW.vcproj", "{29C096AF-172E-4A36-A1FE-E15B259D6834}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLUT", "TwSimpleGLUT.vcproj", "{CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleSDL", "TwSimpleSDL.vcproj", "{3B516919-D0DA-43CE-820E-8306368F605B}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX9", "TwSimpleDX9.vcproj", "{6B414E54-701C-4ED3-9034-F5CD7BFC3451}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug.ActiveCfg = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug.Build.0 = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release.ActiveCfg = Release|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release.Build.0 = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug.ActiveCfg = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug.Build.0 = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release.ActiveCfg = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release.Build.0 = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug.ActiveCfg = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug.Build.0 = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release.ActiveCfg = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release.Build.0 = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug.ActiveCfg = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug.Build.0 = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release.ActiveCfg = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release.Build.0 = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug.ActiveCfg = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug.Build.0 = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release.ActiveCfg = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release.Build.0 = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.ActiveCfg = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.Build.0 = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.ActiveCfg = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.vcproj b/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.vcproj index 3889e380f..0f156b444 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.vcproj @@ -1,142 +1,142 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/examples/TwCopyDLL.vcproj b/Extras/CDTestFramework/AntTweakBar/examples/TwCopyDLL.vcproj index c58d7a340..0ae300673 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/TwCopyDLL.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/examples/TwCopyDLL.vcproj @@ -1,53 +1,53 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleDX9.vcproj b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleDX9.vcproj index 2c2b572b8..33cfa51ca 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleDX9.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleDX9.vcproj @@ -1,138 +1,138 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLFW.vcproj b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLFW.vcproj index 04f721634..94bd479f8 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLFW.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLFW.vcproj @@ -1,137 +1,137 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLUT.vcproj b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLUT.vcproj index 09aabbf86..170f2d7cd 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLUT.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLUT.vcproj @@ -1,141 +1,141 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleSDL.vcproj b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleSDL.vcproj index d16f408d6..afa4fcc04 100644 --- a/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleSDL.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleSDL.vcproj @@ -1,178 +1,178 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc b/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc index 07ae9558a..8ff7072fd 100644 --- a/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc +++ b/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc @@ -1,83 +1,83 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -//#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Français (France) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) -#ifdef _WIN32 -//LANGUAGE LANG_FRENCH, SUBLANG_FRENCH -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Cursor -// - -IDC_CURSOR1 CURSOR "res\\cur00013.cur" -IDC_CURSOR2 CURSOR "res\\cur00000.cur" -IDC_CURSOR3 CURSOR "res\\cur00001.cur" -IDC_CURSOR4 CURSOR "res\\cur00002.cur" -IDC_CURSOR5 CURSOR "res\\cur00003.cur" -IDC_CURSOR6 CURSOR "res\\cur00004.cur" -IDC_CURSOR7 CURSOR "res\\cur00005.cur" -IDC_CURSOR8 CURSOR "res\\cur00006.cur" -IDC_CURSOR9 CURSOR "res\\cur00007.cur" -IDC_CURSOR10 CURSOR "res\\cur00008.cur" -IDC_CURSOR11 CURSOR "res\\cur00009.cur" -IDC_CURSOR12 CURSOR "res\\cur00010.cur" -IDC_CURSOR13 CURSOR "res\\cur00011.cur" -IDC_CURSOR14 CURSOR "res\\cur00012.cur" -#endif // Français (France) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +//#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Français (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +//LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_CURSOR1 CURSOR "res\\cur00013.cur" +IDC_CURSOR2 CURSOR "res\\cur00000.cur" +IDC_CURSOR3 CURSOR "res\\cur00001.cur" +IDC_CURSOR4 CURSOR "res\\cur00002.cur" +IDC_CURSOR5 CURSOR "res\\cur00003.cur" +IDC_CURSOR6 CURSOR "res\\cur00004.cur" +IDC_CURSOR7 CURSOR "res\\cur00005.cur" +IDC_CURSOR8 CURSOR "res\\cur00006.cur" +IDC_CURSOR9 CURSOR "res\\cur00007.cur" +IDC_CURSOR10 CURSOR "res\\cur00008.cur" +IDC_CURSOR11 CURSOR "res\\cur00009.cur" +IDC_CURSOR12 CURSOR "res\\cur00010.cur" +IDC_CURSOR13 CURSOR "res\\cur00011.cur" +IDC_CURSOR14 CURSOR "res\\cur00012.cur" +#endif // Français (France) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln b/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln index 141fda14c..6b93b89a0 100644 --- a/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln +++ b/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln @@ -1,29 +1,29 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AntTweakBar", "AntTweakBar.vcproj", "{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "..\examples\TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug.ActiveCfg = Debug|Win32 - {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug.Build.0 = Debug|Win32 - {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release.ActiveCfg = Release|Win32 - {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release.Build.0 = Release|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.ActiveCfg = Debug|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.Build.0 = Debug|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.ActiveCfg = Release|Win32 - {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AntTweakBar", "AntTweakBar.vcproj", "{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "..\examples\TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug.ActiveCfg = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug.Build.0 = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release.ActiveCfg = Release|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release.Build.0 = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.ActiveCfg = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.Build.0 = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.ActiveCfg = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj b/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj index db990a568..e713ebf31 100644 --- a/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj +++ b/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj @@ -1,380 +1,380 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt b/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt index 905c05123..70e539374 100644 --- a/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt +++ b/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt @@ -1,232 +1,232 @@ - !"#$%&'()*+,-./0123456789:;<=>? -@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ -`abcdefghijklmnopqrstuvwxyz{|}~ -€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ - ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ -ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß -àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ - -032 -033 ! -034 " -035 # -036 $ -037 % -038 & -039 ' -040 ( -041 ) -042 * -043 + -044 , -045 - -046 . -047 / -048 0 -049 1 -050 2 -051 3 -052 4 -053 5 -054 6 -055 7 -056 8 -057 9 -058 : -059 ; -060 < -061 = -062 > -063 ? -064 @ -065 A -066 B -067 C -068 D -069 E -070 F -071 G -072 H -073 I -074 J -075 K -076 L -077 M -078 N -079 O -080 P -081 Q -082 R -083 S -084 T -085 U -086 V -087 W -088 X -089 Y -090 Z -091 [ -092 \ -093 ] -094 ^ -095 _ -096 ` -097 a -098 b -099 c -100 d -101 e -102 f -103 g -104 h -105 i -106 j -107 k -108 l -109 m -110 n -111 o -112 p -113 q -114 r -115 s -116 t -117 u -118 v -119 w -120 x -121 y -122 z -123 { -124 | -125 } -126 ~ -127  -128 € -129 -130 ‚ -131 ƒ -132 „ -133 … -134 † -135 ‡ -136 ˆ -137 ‰ -138 Š -139 ‹ -140 Œ -141 -142 Ž -143 -144 -145 ‘ -146 ’ -147 “ -148 ” -149 • -150 – -151 — -152 ˜ -153 ™ -154 š -155 › -156 œ -157 -158 ž -159 Ÿ -160   -161 ¡ -162 ¢ -163 £ -164 ¤ -165 ¥ -166 ¦ -167 § -168 ¨ -169 © -170 ª -171 « -172 ¬ -173 ­ -174 ® -175 ¯ -176 ° -177 ± -178 ² -179 ³ -180 ´ -181 µ -182 ¶ -183 · -184 ¸ -185 ¹ -186 º -187 » -188 ¼ -189 ½ -190 ¾ -191 ¿ -192 À -193 Á -194  -195 à -196 Ä -197 Å -198 Æ -199 Ç -200 È -201 É -202 Ê -203 Ë -204 Ì -205 Í -206 Î -207 Ï -208 Ð -209 Ñ -210 Ò -211 Ó -212 Ô -213 Õ -214 Ö -215 × -216 Ø -217 Ù -218 Ú -219 Û -220 Ü -221 Ý -222 Þ -223 ß -224 à -225 á -226 â -227 ã -228 ä -229 å -230 æ -231 ç -232 è -233 é -234 ê -235 ë -236 ì -237 í -238 î -239 ï -240 ð -241 ñ -242 ò -243 ó -244 ô -245 õ -246 ö -247 ÷ -248 ø -249 ù -250 ú -251 û -252 ü -253 ý -254 þ + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ +€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ + ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ +ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß +àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + +032 +033 ! +034 " +035 # +036 $ +037 % +038 & +039 ' +040 ( +041 ) +042 * +043 + +044 , +045 - +046 . +047 / +048 0 +049 1 +050 2 +051 3 +052 4 +053 5 +054 6 +055 7 +056 8 +057 9 +058 : +059 ; +060 < +061 = +062 > +063 ? +064 @ +065 A +066 B +067 C +068 D +069 E +070 F +071 G +072 H +073 I +074 J +075 K +076 L +077 M +078 N +079 O +080 P +081 Q +082 R +083 S +084 T +085 U +086 V +087 W +088 X +089 Y +090 Z +091 [ +092 \ +093 ] +094 ^ +095 _ +096 ` +097 a +098 b +099 c +100 d +101 e +102 f +103 g +104 h +105 i +106 j +107 k +108 l +109 m +110 n +111 o +112 p +113 q +114 r +115 s +116 t +117 u +118 v +119 w +120 x +121 y +122 z +123 { +124 | +125 } +126 ~ +127  +128 € +129 +130 ‚ +131 ƒ +132 „ +133 … +134 † +135 ‡ +136 ˆ +137 ‰ +138 Š +139 ‹ +140 Œ +141 +142 Ž +143 +144 +145 ‘ +146 ’ +147 “ +148 ” +149 • +150 – +151 — +152 ˜ +153 ™ +154 š +155 › +156 œ +157 +158 ž +159 Ÿ +160   +161 ¡ +162 ¢ +163 £ +164 ¤ +165 ¥ +166 ¦ +167 § +168 ¨ +169 © +170 ª +171 « +172 ¬ +173 ­ +174 ® +175 ¯ +176 ° +177 ± +178 ² +179 ³ +180 ´ +181 µ +182 ¶ +183 · +184 ¸ +185 ¹ +186 º +187 » +188 ¼ +189 ½ +190 ¾ +191 ¿ +192 À +193 Á +194  +195 à +196 Ä +197 Å +198 Æ +199 Ç +200 È +201 É +202 Ê +203 Ë +204 Ì +205 Í +206 Î +207 Ï +208 Ð +209 Ñ +210 Ò +211 Ó +212 Ô +213 Õ +214 Ö +215 × +216 Ø +217 Ù +218 Ú +219 Û +220 Ü +221 Ý +222 Þ +223 ß +224 à +225 á +226 â +227 ã +228 ä +229 å +230 æ +231 ç +232 è +233 é +234 ê +235 ë +236 ì +237 í +238 î +239 ï +240 ð +241 ñ +242 ò +243 ó +244 ô +245 õ +246 ö +247 ÷ +248 ø +249 ù +250 ú +251 û +252 ü +253 ý +254 þ 255 ÿ \ No newline at end of file diff --git a/Extras/CDTestFramework/BipartiteBoxPruning.cpp b/Extras/CDTestFramework/BipartiteBoxPruning.cpp index 7209168f8..87d9886be 100644 --- a/Extras/CDTestFramework/BipartiteBoxPruning.cpp +++ b/Extras/CDTestFramework/BipartiteBoxPruning.cpp @@ -1,165 +1,165 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "BipartiteBoxPruning.h" -#include "RenderingHelpers.h" -#include "GLFontRenderer.h" - -BipartiteBoxPruningTest::BipartiteBoxPruningTest() : - mBar (null), - mNbBoxes (0), - mBoxes (null), - mBoxPtrs (null), - mBoxTime (null), - mSpeed (0.0f), - mAmplitude (100.0f) -{ -} - -BipartiteBoxPruningTest::~BipartiteBoxPruningTest() -{ - DELETEARRAY(mBoxTime); - DELETEARRAY(mBoxPtrs); - DELETEARRAY(mBoxes); -} - -void BipartiteBoxPruningTest::Init() -{ - mNbBoxes = 1024; - mBoxes = new AABB[mNbBoxes]; - mBoxPtrs = new const AABB*[mNbBoxes]; - mBoxTime = new float[mNbBoxes]; - for(udword i=0;i buffer; -int sizes[2]; -btScalar scales[2]; -btScalar offsets[2]; -btScalar wtrs[16]; -btVector3 eye; -btVector3 neardist; -btScalar ocarea; -btScalar qrarea; -GLuint texture; - OcclusionBuffer() - { - initialized=false; - neardist=btVector3(2,2,2); - ocarea=(btScalar)0; - qrarea=(btScalar)0; - } -void setup(int w,int h) - { - initialized=true; - sizes[0]=w; - sizes[1]=h; - scales[0]=w/2; - scales[1]=h/2; - offsets[0]=scales[0]+0.5; - offsets[1]=scales[1]+0.5; - glGenTextures(1,&texture); - clear(); - } -void clear() - { - buffer.resize(0); - buffer.resize(sizes[0]*sizes[1],0); - } -void initialize() - { - if(!initialized) - { - setup(128,128); - } - GLint v[4]; - GLdouble m[16],p[16]; - glGetIntegerv(GL_VIEWPORT,v); - glGetDoublev(GL_MODELVIEW_MATRIX,m); - glGetDoublev(GL_PROJECTION_MATRIX,p); - for(int i=0;i<16;++i) wtrs[i]=p[i]; - clear(); - } -void drawBuffer( btScalar l,btScalar t, - btScalar r,btScalar b) - { - btAlignedObjectArray data; - data.resize(buffer.size()); - for(int i=0;i -static int clip(const btVector4* pi,btVector4* po) - { - btScalar s[NP]; - int m=0; - for(int i=0;i0)&&(t<1)) - { - po[n][0] = a[0]+(b[0]-a[0])*t; - po[n][1] = a[1]+(b[1]-a[1])*t; - po[n][2] = a[2]+(b[2]-a[2])*t; - po[n][3] = a[3]+(b[3]-a[3])*t; - ++n; - } - if(s[j]>0) po[n++]=b; - } - return(n); - } - for(int i=0;i -inline bool draw( const btVector4& a, - const btVector4& b, - const btVector4& c, - const btScalar minarea) - { - const btScalar a2=(b-a).cross(c-a)[2]; - if(a2>0) - { - if(a20) - { - const int dx[]={ y[0]-y[1], - y[1]-y[2], - y[2]-y[0]}; - const int dy[]={ x[1]-x[0]-dx[0]*width, - x[2]-x[1]-dx[1]*width, - x[0]-x[2]-dx[2]*width}; - const int a=x[2]*y[0]+x[0]*y[1]-x[2]*y[1]-x[0]*y[2]+x[1]*y[2]-x[1]*y[0]; - const btScalar ia=1/(btScalar)a; - const btScalar dzx=ia*(y[2]*(z[1]-z[0])+y[1]*(z[0]-z[2])+y[0]*(z[2]-z[1])); - const btScalar dzy=ia*(x[2]*(z[0]-z[1])+x[0]*(z[1]-z[2])+x[1]*(z[2]-z[0]))-(dzx*width); - int c[]={ miy*x[1]+mix*y[0]-x[1]*y[0]-mix*y[1]+x[0]*y[1]-miy*x[0], - miy*x[2]+mix*y[1]-x[2]*y[1]-mix*y[2]+x[1]*y[2]-miy*x[1], - miy*x[0]+mix*y[2]-x[0]*y[2]-mix*y[0]+x[2]*y[0]-miy*x[2]}; - btScalar v=ia*((z[2]*c[0])+(z[0]*c[1])+(z[1]*c[2])); - btScalar* scan=&buffer[miy*sizes[1]]; - for(int iy=miy;iy=0)&&(c[1]>=0)&&(c[2]>=0)) - { - if(POLICY::Process(scan[ix],v)) return(true); - } - c[0]+=dx[0];c[1]+=dx[1];c[2]+=dx[2];v+=dzx; - } - c[0]+=dy[0];c[1]+=dy[1];c[2]+=dy[2];v+=dzy; - scan+=sizes[0]; - } - } - } - return(false); - } -template -inline bool clipDraw( const btVector4* p, - btScalar minarea) - { - btVector4 o[NP*2]; - const int n=clip(p,o); - bool earlyexit=false; - project(o,n); - for(int i=2;i(o[0],o[i-1],o[i],minarea); - } - return(earlyexit); - } -void appendOccluder( const btVector3& a, - const btVector3& b, - const btVector3& c) - { - const btVector4 p[]={transform(a),transform(b),transform(c)}; - clipDraw<3,WriteOCL>(p,ocarea); - } -void appendOccluder( const btVector3& a, - const btVector3& b, - const btVector3& c, - const btVector3& d) - { - const btVector4 p[]={transform(a),transform(b),transform(c),transform(d)}; - clipDraw<4,WriteOCL>(p,ocarea); - } -void appendOccluder( const btVector3& c, - const btVector3& e) - { - const btVector4 x[]={ transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]-e[2])), - transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]-e[2])), - transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]-e[2])), - transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]-e[2])), - transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]+e[2])), - transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]+e[2])), - transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]+e[2])), - transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]+e[2]))}; - static const int d[]={ 1,0,3,2, - 4,5,6,7, - 4,7,3,0, - 6,5,1,2, - 7,6,2,3, - 5,4,0,1}; - for(int i=0;i<(sizeof(d)/sizeof(d[0]));) - { - const btVector4 p[]={ x[d[i++]], - x[d[i++]], - x[d[i++]], - x[d[i++]]}; - clipDraw<4,WriteOCL>(p,ocarea); - } - } -inline bool queryOccluder( const btVector3& a, - const btVector3& b, - const btVector3& c) - { - const btVector4 p[]={transform(a),transform(b),transform(c)}; - return(clipDraw<3,QueryOCL>(p,qrarea)); - } -inline bool queryOccluder( const btVector3& a, - const btVector3& b, - const btVector3& c, - const btVector3& d) - { - const btVector4 p[]={transform(a),transform(b),transform(c),transform(d)}; - return(clipDraw<4,QueryOCL>(p,qrarea)); - } -inline bool queryOccluder( const btVector3& c, - const btVector3& e) - { - const btVector4 x[]={ transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]-e[2])), - transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]-e[2])), - transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]-e[2])), - transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]-e[2])), - transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]+e[2])), - transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]+e[2])), - transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]+e[2])), - transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]+e[2]))}; - for(int i=0;i<8;++i) - { - if((x[i][2]+x[i][3])<=0) return(true); - } - static const int d[]={ 1,0,3,2, - 4,5,6,7, - 4,7,3,0, - 6,5,1,2, - 7,6,2,3, - 5,4,0,1}; - for(int i=0;i<(sizeof(d)/sizeof(d[0]));) - { - const btVector4 p[]={ x[d[i++]], - x[d[i++]], - x[d[i++]], - x[d[i++]]}; - if(clipDraw<4,QueryOCL>(p,qrarea)) return(true); - } - return(false); - } -}; - -OcclusionBuffer ocb; - -BulletSAPCompleteBoxPruningTest::BulletSAPCompleteBoxPruningTest(int numBoxes,int method) : - mBar (null), - mNbBoxes (numBoxes), - mBoxes (null), - mBoxPtrs (null), - mBoxTime (null), - mAmplitude (100.0f), - m_method(method) -{ - btVector3 aabbMin(-200,-200,-200); - btVector3 aabbMax(200,200,200); - - int maxNumBoxes = numBoxes; - m_isdbvt=false; - bool disableRaycastAccelerator = true; - switch (method) - { - case 1: - m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,0,disableRaycastAccelerator); - methodname = "btAxisSweep3"; - break; - case 2: - m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,new btNullPairCache(),disableRaycastAccelerator); - methodname = "btAxisSweep3+btNullPairCache"; - break; - case 3: - m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,new btSortedOverlappingPairCache(),disableRaycastAccelerator); - methodname = "btAxisSweep3+btSortedOverlappingPairCache"; - break; - case 4: - m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btSortedOverlappingPairCache()); - methodname = "btSimpleBroadphase+btSortedOverlappingPairCache"; - break; - case 5: - m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btNullPairCache()); - methodname = "btSimpleBroadphase+btNullPairCache"; - break; - - case 6: - { - methodname = "btMultiSapBroadphase"; - btMultiSapBroadphase* multiSap = new btMultiSapBroadphase(maxNumBoxes); - m_broadphase = multiSap; - - btVector3 tmpAabbMin,tmpAabbMax; - - float numP = (float) numParts; - - for (int i=0;igetOverlappingPairCache(),disableRaycastAccelerator); - multiSap->getBroadphaseArray().push_back(childBp); - } - } - } - - // btAxisSweep3* childBp = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,multiSap->getOverlappingPairCache()); - // multiSap->getBroadphaseArray().push_back(childBp); - multiSap->buildTree(aabbMin,aabbMax); - - } - break; - case 7: - { - btDbvtBroadphase* pbp=new btDbvtBroadphase(); - m_broadphase = pbp; - pbp->m_deferedcollide = true; /* Faster initialization, set to false after. */ - m_isdbvt = true; - methodname = "dynamic AABB tree, btDbvtBroadphase"; - } - break; - case 8: -// m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes); -// m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btSortedOverlappingPairCache()); -// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 8, 8, 8, 8192, 8192, 64, 16); -// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 12, 12, 12, 8192, 8192, 64, 16); -// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 16, 16, 16, 8192, 8192, 64, 16); -#ifdef USE_CUDA_BROADPHASE - m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 24, 24, 24,maxNumBoxes , maxNumBoxes, 64, 16); -// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 32, 32, 32, 8192, 8192, 64, 16); - methodname = "btCudaBroadphase"; - break; - - case 9: - m_broadphase = new bt3DGridBroadphase(aabbMin, aabbMax, 24, 24, 24,maxNumBoxes , maxNumBoxes, 64, 16); - methodname = "bt3DGridBroadphase"; - break; -#endif //USE_CUDA_BROADPHASE - - default: - { - - btDbvtBroadphase* pbp=new btDbvtBroadphase(); - m_broadphase = pbp; - pbp->m_deferedcollide = true; /* Faster initialization, set to false after. */ - m_isdbvt = true; - methodname = "dynamic AABB tree, btDbvtBroadphase"; - - //m_broadphase = new btAxisSweep3(aabbMin,aabbMax,numBoxes,new btNullPairCache()); - //methodname = "btAxisSweep3+btNullPairCache"; - } - } -} - -BulletSAPCompleteBoxPruningTest::~BulletSAPCompleteBoxPruningTest() -{ - DELETEARRAY(mBoxTime); - DELETEARRAY(mBoxPtrs); - DELETEARRAY(mBoxes); - delete m_broadphase; -} - -void BulletSAPCompleteBoxPruningTest::Init() -{ - btClock clock; - m_firstTime = true; - SRand(0); - - - mBoxes = new AABB[mNbBoxes]; - mFlags = new bool[mNbBoxes]; - mBoxPtrs = new const AABB*[mNbBoxes]; - mBoxTime = new float[mNbBoxes]; - for(udword i=0;icreateProxy(aabbMin,aabbMax,shapeType,&mBoxes[i],1,1,0,0);//m_dispatcher); - m_proxies.push_back( proxy ); - - mBoxTime[i] = 2000.0f*UnitRandomFloat(); - } - printf("Initialization of %s with %u boxes: %ums\r\n",methodname,mNbBoxes,clock.getTimeMilliseconds()); -} - -void BulletSAPCompleteBoxPruningTest::Release() -{ - DELETEARRAY(mBoxTime); - DELETEARRAY(mBoxes); -} - -extern int doTree; -extern int percentUpdate; -extern float objectSpeed; -extern bool enableDraw; - -static void TW_CALL NormalMode(void* pdata) -{ -btDbvtBroadphase* pb=(btDbvtBroadphase*)pdata; -pb->m_deferedcollide = true; -} - -static void TW_CALL SlowSpeedMode(void* pdata) -{ -btDbvtBroadphase* pb=(btDbvtBroadphase*)pdata; -pb->m_deferedcollide = false; -} - -void BulletSAPCompleteBoxPruningTest::Select() -{ - // Create a tweak bar - { - mBar = TwNewBar("OPC_CompleteBoxPruning"); - TwAddVarRW(mBar, "Speed", TW_TYPE_FLOAT, &objectSpeed, " min=0.0 max=0.01 step=0.0001"); - TwAddVarRW(mBar, "Amplitude", TW_TYPE_FLOAT, &mAmplitude, " min=10.0 max=200.0 step=0.1"); - if(m_isdbvt) - { - btDbvtBroadphase* pbp=(btDbvtBroadphase*)m_broadphase; - TwAddVarRW(mBar, "Enable culling",TW_TYPE_BOOLCPP,&enableCulling,""); - TwAddVarRW(mBar, "Enable occlusion",TW_TYPE_BOOLCPP,&enableOcclusion,""); - TwAddVarRW(mBar, "Show culling",TW_TYPE_BOOLCPP,&showCulling,""); - TwAddVarRW(mBar, "Show occlusion",TW_TYPE_BOOLCPP,&showOcclusion,""); - TwAddVarRW(mBar, "Cull far plane",TW_TYPE_BOOLCPP,&cullFarPlane,""); - TwAddVarRW(mBar, "OC Min area",TW_TYPE_FLOAT,&ocb.ocarea,"min=0.0 max=1.0 step=0.001"); - TwAddVarRW(mBar, "QR Min area",TW_TYPE_FLOAT,&ocb.qrarea,"min=0.0 max=1.0 step=0.001"); - TwAddVarRW(mBar, "Dyn lkhd",TW_TYPE_INT32,&pbp->m_sets[0].m_lkhd,"min=-1 max=32"); - TwAddVarRW(mBar, "Fix lkhd",TW_TYPE_INT32,&pbp->m_sets[1].m_lkhd,"min=-1 max=32"); - TwAddVarRW(mBar, "Dyn opt/f(%)",TW_TYPE_INT32,&pbp->m_dupdates,"min=0 max=100"); - TwAddVarRW(mBar, "Fix opt/f(%)",TW_TYPE_INT32,&pbp->m_fupdates,"min=0 max=100"); - TwAddVarRW(mBar, "Cln opt/f(%)",TW_TYPE_INT32,&pbp->m_cupdates,"min=0 max=100"); - TwAddVarRW(mBar, "Prediction",TW_TYPE_FLOAT,&pbp->m_prediction,"min=0.0 max=2.0 step=0.1"); - TwAddVarRW(mBar, "Defered collide",TW_TYPE_BOOLCPP,&pbp->m_deferedcollide,""); - TwAddVarRO(mBar, "Dyn leafs",TW_TYPE_INT32,&pbp->m_sets[0].m_leaves,""); - TwAddVarRO(mBar, "Fix leafs",TW_TYPE_INT32,&pbp->m_sets[1].m_leaves,""); - TwAddVarRO(mBar, "Updates ratio",TW_TYPE_FLOAT,&pbp->m_updates_ratio,""); - TwAddVarRO(mBar, "Visible",TW_TYPE_INT32,&visiblecount,""); - TwAddButton(mBar,"Normal mode",&NormalMode,m_broadphase,""); - TwAddButton(mBar,"Slow speed mode",&SlowSpeedMode,m_broadphase,""); - } - } - printf("SubMethod: %s\r\n",methodname); -} - -void BulletSAPCompleteBoxPruningTest::Deselect() -{ - if(mBar) - { - TwDeleteBar(mBar); - mBar = null; - } -} - -bool BulletSAPCompleteBoxPruningTest::UpdateBoxes(int numBoxes) -{ - static bool once=true; - - for(udword i=0;i<(udword)numBoxes;i++) - { - mBoxTime[i] += objectSpeed; - - Point Center,Extents; - mBoxes[i].GetExtents(Extents); - - Center.x = cosf(mBoxTime[i]*2.17f)*mAmplitude + sinf(mBoxTime[i])*mAmplitude*0.5f; - Center.y = cosf(mBoxTime[i]*1.38f)*mAmplitude + sinf(mBoxTime[i]*mAmplitude); - Center.z = sinf(mBoxTime[i]*0.777f)*mAmplitude; - - mBoxes[i].SetCenterExtents(Center, Extents); - } - return true; -} - -void BulletSAPCompleteBoxPruningTest::PerformTest() -{ - int numUpdatedBoxes = (mNbBoxes*percentUpdate)/100; - if (m_firstTime) - { - numUpdatedBoxes = mNbBoxes; - } - mProfiler.Start(); - UpdateBoxes(numUpdatedBoxes); - - - mPairs.ResetPairs(); - - //CompleteBoxPruning(mNbBoxes, mBoxPtrs, mPairs, Axes(AXES_XZY)); - ///add batch query? - - - for (int i=0;iGetCenter(Center); - mBoxPtrs[i]->GetExtents(Extents); - btVector3 aabbMin(Center.x-Extents.x,Center.y-Extents.y,Center.z-Extents.z); - btVector3 aabbMax(Center.x+Extents.x,Center.y+Extents.y,Center.z+Extents.z); - m_broadphase->setAabb(m_proxies[i],aabbMin,aabbMax,0);//m_dispatcher); - } - -#ifndef BT_NO_PROFILE - if(sBulletProfilerToggle) - { - CProfileManager::Reset(); - } -#endif //BT_NO_PROFILE - - m_broadphase->calculateOverlappingPairs(0); - -#ifndef BT_NO_PROFILE - if(sBulletProfilerToggle) - { - CProfileManager::Increment_Frame_Counter(); - CProfileManager::dumpAll(); - } -#endif //BT_NO_PROFILE - - - mProfiler.End(); - mProfiler.Accum(); - - if (m_firstTime) - { - //initialization messes up timings - m_firstTime = false; - if(m_isdbvt) - { - ((btDbvtBroadphase*)m_broadphase)->m_deferedcollide=false; - } - mProfiler.Reset(); - } - - #if 0 - { - int missedpairs=0; - for(int i=0;iaabb,pb->aabb)) - { - btDbvtProxy* spa=pa; - btDbvtProxy* spb=pb; - if(spa>spb) btSwap(spa,spb); - if(!m_broadphase->getOverlappingPairCache()->findPair(spa,spb)) - { - ++missedpairs; - printf("Cannot find %i,%i\r\n",i,j); - } - } - } - } - if(missedpairs>0) printf("Missed pairs: %u\r\n",missedpairs); - } - #endif - -// printf("%d pairs colliding\r ", mPairs.GetNbPairs()); - - ZeroMemory(mFlags,sizeof(bool)*mNbBoxes); - - btOverlappingPairCache* pairCache = m_broadphase->getOverlappingPairCache(); - const btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr(); - - for(udword i=0;i<(udword)pairCache->getNumOverlappingPairs();i++) - { -// Flags[pairPtr[i].m_pProxy0->getUid()-1] = true; -// Flags[pairPtr[i].m_pProxy1->getUid()-1] = true; - int j; - j=((AABB*)pairPtr[i].m_pProxy0->m_clientObject)-mBoxes; - mFlags[j] = true; - j=((AABB*)pairPtr[i].m_pProxy1->m_clientObject)-mBoxes; - mFlags[j] = true; - } - - if(enableDraw) - { - btVector3 aabbMin(-200,-200,-200); - btVector3 aabbMax(200,200,200); - - btVector3 tmpAabbMin,tmpAabbMax; - glDisable(GL_DEPTH_TEST); - - - float numP = (float) numParts; - - for (int i=0;igetOverlappingPairCache()->getNumOverlappingPairs()); - -// m_broadphase)->printStats(); - - GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); -} - -// -static void DrawVolume(const btDbvtVolume& volume,const btVector3& color) -{ -const btVector3 mins=volume.Mins(); -const btVector3 maxs=volume.Maxs(); -glColor3f(color.x(),color.y(),color.z()); -glVertex3f(mins.x(),mins.y(),mins.z()); -glVertex3f(maxs.x(),mins.y(),mins.z()); - -glVertex3f(maxs.x(),mins.y(),mins.z()); -glVertex3f(maxs.x(),maxs.y(),mins.z()); - -glVertex3f(maxs.x(),maxs.y(),mins.z()); -glVertex3f(mins.x(),maxs.y(),mins.z()); - -glVertex3f(mins.x(),maxs.y(),mins.z()); -glVertex3f(mins.x(),mins.y(),mins.z()); - -glVertex3f(mins.x(),mins.y(),maxs.z()); -glVertex3f(maxs.x(),mins.y(),maxs.z()); - -glVertex3f(maxs.x(),mins.y(),maxs.z()); -glVertex3f(maxs.x(),maxs.y(),maxs.z()); - -glVertex3f(maxs.x(),maxs.y(),maxs.z()); -glVertex3f(mins.x(),maxs.y(),maxs.z()); - -glVertex3f(mins.x(),maxs.y(),maxs.z()); -glVertex3f(mins.x(),mins.y(),maxs.z()); - -glVertex3f(mins.x(),mins.y(),mins.z()); -glVertex3f(mins.x(),mins.y(),maxs.z()); - -glVertex3f(maxs.x(),mins.y(),mins.z()); -glVertex3f(maxs.x(),mins.y(),maxs.z()); - -glVertex3f(maxs.x(),maxs.y(),mins.z()); -glVertex3f(maxs.x(),maxs.y(),maxs.z()); - -glVertex3f(mins.x(),maxs.y(),mins.z()); -glVertex3f(mins.x(),maxs.y(),maxs.z()); -} - -// -void BulletSAPCompleteBoxPruningTest::RenderAll() -{ -OBB CurrentBox; -CurrentBox.mRot.Identity(); -for(udword i=0;iqueryOccluder(node->volume.Center(),node->volume.Extents())); - } - void Process(const btDbvtNode* node,btScalar depth) - { - Process(node); - } - void Process(const btDbvtNode* leaf) - { - btBroadphaseProxy* proxy=(btBroadphaseProxy*)leaf->data; - int i=((AABB*)proxy->m_clientObject)-self->mBoxes; - if(self->mFlags[i]) glColor3f(1.0f, 0.0f, 0.0f); - else glColor3f(0.0f, 1.0f, 0.0f); - self->mBoxes[i].GetCenter(box.mCenter); - self->mBoxes[i].GetExtents(box.mExtents); - DrawOBB(box);drawn++; - if(ocb) - { - ocb->appendOccluder(btVector3(box.mCenter.x,box.mCenter.y,box.mCenter.z), - btVector3(box.mExtents.x,box.mExtents.y,box.mExtents.z)); - } - } - } srenderer; - srenderer.self=this; - srenderer.ocb=0; - if(enableOcclusion) - { - srenderer.ocb=&ocb; - btDbvt::collideOCL(pbp->m_sets[1].m_root,planes_n,planes_o,dir,acplanes,srenderer); - btDbvt::collideOCL(pbp->m_sets[0].m_root,planes_n,planes_o,dir,acplanes,srenderer); - } - else - { - btDbvt::collideKDOP(pbp->m_sets[1].m_root,planes_n,planes_o,acplanes,srenderer); - btDbvt::collideKDOP(pbp->m_sets[0].m_root,planes_n,planes_o,acplanes,srenderer); - } - visiblecount=srenderer.drawn; - if(showOcclusion&&enableOcclusion) - { - const btScalar ratio=((float)glutGet(GLUT_WINDOW_HEIGHT))/((float)glutGet(GLUT_WINDOW_WIDTH)); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1,1,-1,1,-1,1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - const float mm[]={ 1,0,0,0, - 0,1,0,0, - 0,0,0,1, - 0,0,0,1}; - glMultMatrixf(mm); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - const float size=0.6f; - const float orgx=0.3f; - const float orgy=0.25f; - const float left=orgx; - const float right=orgx+size; - const float top=orgy+size; - const float bottom=orgy; - ocb.drawBuffer(left,bottom,right,top); - } - if(showCulling) - { - const btScalar ratio=((float)glutGet(GLUT_WINDOW_HEIGHT))/((float)glutGet(GLUT_WINDOW_WIDTH)); - static const float scale=0.004; - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1,1,-1*ratio,1*ratio,-1,1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - const float mm[]={ 1,0,0,0, - 0,0,1,0, - 0,1,0,0, - 0,0,0,1}; - glMultMatrixf(mm); - glScalef(scale,scale,scale); - - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - - glBegin(GL_LINES); - glColor4f(1,1,1,1); - - struct DebugRenderer : btDbvt::ICollide - { - OcclusionBuffer* ocb; - int sid; - bool AllLeafs(const btDbvtNode* node) - { - Process(node); - return(false); - } - bool Descent(const btDbvtNode* node) - { - return(ocb->queryOccluder(node->volume.Center(),node->volume.Extents())); - } - void Process(const btDbvtNode* node,btScalar depth) - { - Process(node); - } - void Process(const btDbvtNode* node) - { - if(ocb) - { - ocb->appendOccluder(node->volume.Center(),node->volume.Extents()); - } - if(sid>=0) - { - const float f=sid/1023.; - DrawVolume(node->volume,btVector3(1,f,f)); - sid=(sid+1)%1024; - } - else - { - if(node->isinternal()) - DrawVolume(node->volume,btVector3(0,1,0)); - else - DrawVolume(node->volume,btVector3(1,0,1)); - } - } - } drenderer; - if(enableOcclusion) - { - drenderer.ocb=&ocb; - drenderer.sid=0; - ocb.clear(); - btDbvt::collideOCL(pbp->m_sets[1].m_root,planes_n,planes_o,dir,acplanes,drenderer); - btDbvt::collideOCL(pbp->m_sets[0].m_root,planes_n,planes_o,dir,acplanes,drenderer); - } - else - { - drenderer.ocb=0; - drenderer.sid=-1; - btDbvt::collideKDOP(pbp->m_sets[1].m_root,planes_n,planes_o,acplanes,drenderer); - btDbvt::collideKDOP(pbp->m_sets[0].m_root,planes_n,planes_o,acplanes,drenderer); - } - glEnd(); - - glBegin(GL_LINES); - glColor4f(1,1,1,1); - glVertex3f(eye.x(),eye.y(),eye.z()); - glVertex3f(x00.x(),x00.y(),x00.z()); - glVertex3f(eye.x(),eye.y(),eye.z()); - glVertex3f(x10.x(),x10.y(),x10.z()); - glVertex3f(eye.x(),eye.y(),eye.z()); - glVertex3f(x01.x(),x01.y(),x01.z()); - glVertex3f(eye.x(),eye.y(),eye.z()); - glVertex3f(x11.x(),x11.y(),x11.z()); - - glVertex3f(x00.x(),x00.y(),x00.z()); - glVertex3f(x10.x(),x10.y(),x10.z()); - - glVertex3f(x10.x(),x10.y(),x10.z()); - glVertex3f(x11.x(),x11.y(),x11.z()); - - glVertex3f(x11.x(),x11.y(),x11.z()); - glVertex3f(x01.x(),x01.y(),x01.z()); - - glVertex3f(x01.x(),x01.y(),x01.z()); - glVertex3f(x00.x(),x00.y(),x00.z()); - glEnd(); - } - } -} - -void BulletSAPCompleteBoxPruningTest::KeyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case 'p': - case 'P': - sBulletProfilerToggle = !sBulletProfilerToggle; - break; - default : break; - } -} - -void BulletSAPCompleteBoxPruningTest::MouseCallback(int button, int state, int x, int y) -{ -} - -void BulletSAPCompleteBoxPruningTest::MotionCallback(int x, int y) -{ -} +/* +BulletSAPCompleteBoxPruningTest, Copyright (c) 2008 Erwin Coumans +Part of: +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +//This file was added by Erwin Coumans, to test Bullet SAP performance + +#include "stdafx.h" +#include "BulletSAPCompleteBoxPruningTest.h" +#include "RenderingHelpers.h" +#include "GLFontRenderer.h" +#include "btBulletCollisionCommon.h" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" +#include "Camera.h" +#ifdef USE_CUDA_BROADPHASE +#include "../CUDA/btCudaBroadphase.h" +#endif +#include "LinearMath/btQuickprof.h" + +int numParts =2; + +bool enableCulling = true; +bool cullFarPlane = false; +bool showCulling = false; +bool enableOcclusion = false; +bool showOcclusion = true; +int visiblecount = 0; + +static bool sBulletProfilerToggle = false; + +struct OcclusionBuffer +{ +struct WriteOCL + { + static inline bool Process(btScalar& q,btScalar v) { if(q buffer; +int sizes[2]; +btScalar scales[2]; +btScalar offsets[2]; +btScalar wtrs[16]; +btVector3 eye; +btVector3 neardist; +btScalar ocarea; +btScalar qrarea; +GLuint texture; + OcclusionBuffer() + { + initialized=false; + neardist=btVector3(2,2,2); + ocarea=(btScalar)0; + qrarea=(btScalar)0; + } +void setup(int w,int h) + { + initialized=true; + sizes[0]=w; + sizes[1]=h; + scales[0]=w/2; + scales[1]=h/2; + offsets[0]=scales[0]+0.5; + offsets[1]=scales[1]+0.5; + glGenTextures(1,&texture); + clear(); + } +void clear() + { + buffer.resize(0); + buffer.resize(sizes[0]*sizes[1],0); + } +void initialize() + { + if(!initialized) + { + setup(128,128); + } + GLint v[4]; + GLdouble m[16],p[16]; + glGetIntegerv(GL_VIEWPORT,v); + glGetDoublev(GL_MODELVIEW_MATRIX,m); + glGetDoublev(GL_PROJECTION_MATRIX,p); + for(int i=0;i<16;++i) wtrs[i]=p[i]; + clear(); + } +void drawBuffer( btScalar l,btScalar t, + btScalar r,btScalar b) + { + btAlignedObjectArray data; + data.resize(buffer.size()); + for(int i=0;i +static int clip(const btVector4* pi,btVector4* po) + { + btScalar s[NP]; + int m=0; + for(int i=0;i0)&&(t<1)) + { + po[n][0] = a[0]+(b[0]-a[0])*t; + po[n][1] = a[1]+(b[1]-a[1])*t; + po[n][2] = a[2]+(b[2]-a[2])*t; + po[n][3] = a[3]+(b[3]-a[3])*t; + ++n; + } + if(s[j]>0) po[n++]=b; + } + return(n); + } + for(int i=0;i +inline bool draw( const btVector4& a, + const btVector4& b, + const btVector4& c, + const btScalar minarea) + { + const btScalar a2=(b-a).cross(c-a)[2]; + if(a2>0) + { + if(a20) + { + const int dx[]={ y[0]-y[1], + y[1]-y[2], + y[2]-y[0]}; + const int dy[]={ x[1]-x[0]-dx[0]*width, + x[2]-x[1]-dx[1]*width, + x[0]-x[2]-dx[2]*width}; + const int a=x[2]*y[0]+x[0]*y[1]-x[2]*y[1]-x[0]*y[2]+x[1]*y[2]-x[1]*y[0]; + const btScalar ia=1/(btScalar)a; + const btScalar dzx=ia*(y[2]*(z[1]-z[0])+y[1]*(z[0]-z[2])+y[0]*(z[2]-z[1])); + const btScalar dzy=ia*(x[2]*(z[0]-z[1])+x[0]*(z[1]-z[2])+x[1]*(z[2]-z[0]))-(dzx*width); + int c[]={ miy*x[1]+mix*y[0]-x[1]*y[0]-mix*y[1]+x[0]*y[1]-miy*x[0], + miy*x[2]+mix*y[1]-x[2]*y[1]-mix*y[2]+x[1]*y[2]-miy*x[1], + miy*x[0]+mix*y[2]-x[0]*y[2]-mix*y[0]+x[2]*y[0]-miy*x[2]}; + btScalar v=ia*((z[2]*c[0])+(z[0]*c[1])+(z[1]*c[2])); + btScalar* scan=&buffer[miy*sizes[1]]; + for(int iy=miy;iy=0)&&(c[1]>=0)&&(c[2]>=0)) + { + if(POLICY::Process(scan[ix],v)) return(true); + } + c[0]+=dx[0];c[1]+=dx[1];c[2]+=dx[2];v+=dzx; + } + c[0]+=dy[0];c[1]+=dy[1];c[2]+=dy[2];v+=dzy; + scan+=sizes[0]; + } + } + } + return(false); + } +template +inline bool clipDraw( const btVector4* p, + btScalar minarea) + { + btVector4 o[NP*2]; + const int n=clip(p,o); + bool earlyexit=false; + project(o,n); + for(int i=2;i(o[0],o[i-1],o[i],minarea); + } + return(earlyexit); + } +void appendOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c) + { + const btVector4 p[]={transform(a),transform(b),transform(c)}; + clipDraw<3,WriteOCL>(p,ocarea); + } +void appendOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c, + const btVector3& d) + { + const btVector4 p[]={transform(a),transform(b),transform(c),transform(d)}; + clipDraw<4,WriteOCL>(p,ocarea); + } +void appendOccluder( const btVector3& c, + const btVector3& e) + { + const btVector4 x[]={ transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]+e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]+e[2]))}; + static const int d[]={ 1,0,3,2, + 4,5,6,7, + 4,7,3,0, + 6,5,1,2, + 7,6,2,3, + 5,4,0,1}; + for(int i=0;i<(sizeof(d)/sizeof(d[0]));) + { + const btVector4 p[]={ x[d[i++]], + x[d[i++]], + x[d[i++]], + x[d[i++]]}; + clipDraw<4,WriteOCL>(p,ocarea); + } + } +inline bool queryOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c) + { + const btVector4 p[]={transform(a),transform(b),transform(c)}; + return(clipDraw<3,QueryOCL>(p,qrarea)); + } +inline bool queryOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c, + const btVector3& d) + { + const btVector4 p[]={transform(a),transform(b),transform(c),transform(d)}; + return(clipDraw<4,QueryOCL>(p,qrarea)); + } +inline bool queryOccluder( const btVector3& c, + const btVector3& e) + { + const btVector4 x[]={ transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]+e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]+e[2]))}; + for(int i=0;i<8;++i) + { + if((x[i][2]+x[i][3])<=0) return(true); + } + static const int d[]={ 1,0,3,2, + 4,5,6,7, + 4,7,3,0, + 6,5,1,2, + 7,6,2,3, + 5,4,0,1}; + for(int i=0;i<(sizeof(d)/sizeof(d[0]));) + { + const btVector4 p[]={ x[d[i++]], + x[d[i++]], + x[d[i++]], + x[d[i++]]}; + if(clipDraw<4,QueryOCL>(p,qrarea)) return(true); + } + return(false); + } +}; + +OcclusionBuffer ocb; + +BulletSAPCompleteBoxPruningTest::BulletSAPCompleteBoxPruningTest(int numBoxes,int method) : + mBar (null), + mNbBoxes (numBoxes), + mBoxes (null), + mBoxPtrs (null), + mBoxTime (null), + mAmplitude (100.0f), + m_method(method) +{ + btVector3 aabbMin(-200,-200,-200); + btVector3 aabbMax(200,200,200); + + int maxNumBoxes = numBoxes; + m_isdbvt=false; + bool disableRaycastAccelerator = true; + switch (method) + { + case 1: + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,0,disableRaycastAccelerator); + methodname = "btAxisSweep3"; + break; + case 2: + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,new btNullPairCache(),disableRaycastAccelerator); + methodname = "btAxisSweep3+btNullPairCache"; + break; + case 3: + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,new btSortedOverlappingPairCache(),disableRaycastAccelerator); + methodname = "btAxisSweep3+btSortedOverlappingPairCache"; + break; + case 4: + m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btSortedOverlappingPairCache()); + methodname = "btSimpleBroadphase+btSortedOverlappingPairCache"; + break; + case 5: + m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btNullPairCache()); + methodname = "btSimpleBroadphase+btNullPairCache"; + break; + + case 6: + { + methodname = "btMultiSapBroadphase"; + btMultiSapBroadphase* multiSap = new btMultiSapBroadphase(maxNumBoxes); + m_broadphase = multiSap; + + btVector3 tmpAabbMin,tmpAabbMax; + + float numP = (float) numParts; + + for (int i=0;igetOverlappingPairCache(),disableRaycastAccelerator); + multiSap->getBroadphaseArray().push_back(childBp); + } + } + } + + // btAxisSweep3* childBp = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,multiSap->getOverlappingPairCache()); + // multiSap->getBroadphaseArray().push_back(childBp); + multiSap->buildTree(aabbMin,aabbMax); + + } + break; + case 7: + { + btDbvtBroadphase* pbp=new btDbvtBroadphase(); + m_broadphase = pbp; + pbp->m_deferedcollide = true; /* Faster initialization, set to false after. */ + m_isdbvt = true; + methodname = "dynamic AABB tree, btDbvtBroadphase"; + } + break; + case 8: +// m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes); +// m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btSortedOverlappingPairCache()); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 8, 8, 8, 8192, 8192, 64, 16); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 12, 12, 12, 8192, 8192, 64, 16); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 16, 16, 16, 8192, 8192, 64, 16); +#ifdef USE_CUDA_BROADPHASE + m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 24, 24, 24,maxNumBoxes , maxNumBoxes, 64, 16); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 32, 32, 32, 8192, 8192, 64, 16); + methodname = "btCudaBroadphase"; + break; + + case 9: + m_broadphase = new bt3DGridBroadphase(aabbMin, aabbMax, 24, 24, 24,maxNumBoxes , maxNumBoxes, 64, 16); + methodname = "bt3DGridBroadphase"; + break; +#endif //USE_CUDA_BROADPHASE + + default: + { + + btDbvtBroadphase* pbp=new btDbvtBroadphase(); + m_broadphase = pbp; + pbp->m_deferedcollide = true; /* Faster initialization, set to false after. */ + m_isdbvt = true; + methodname = "dynamic AABB tree, btDbvtBroadphase"; + + //m_broadphase = new btAxisSweep3(aabbMin,aabbMax,numBoxes,new btNullPairCache()); + //methodname = "btAxisSweep3+btNullPairCache"; + } + } +} + +BulletSAPCompleteBoxPruningTest::~BulletSAPCompleteBoxPruningTest() +{ + DELETEARRAY(mBoxTime); + DELETEARRAY(mBoxPtrs); + DELETEARRAY(mBoxes); + delete m_broadphase; +} + +void BulletSAPCompleteBoxPruningTest::Init() +{ + btClock clock; + m_firstTime = true; + SRand(0); + + + mBoxes = new AABB[mNbBoxes]; + mFlags = new bool[mNbBoxes]; + mBoxPtrs = new const AABB*[mNbBoxes]; + mBoxTime = new float[mNbBoxes]; + for(udword i=0;icreateProxy(aabbMin,aabbMax,shapeType,&mBoxes[i],1,1,0,0);//m_dispatcher); + m_proxies.push_back( proxy ); + + mBoxTime[i] = 2000.0f*UnitRandomFloat(); + } + printf("Initialization of %s with %u boxes: %ums\r\n",methodname,mNbBoxes,clock.getTimeMilliseconds()); +} + +void BulletSAPCompleteBoxPruningTest::Release() +{ + DELETEARRAY(mBoxTime); + DELETEARRAY(mBoxes); +} + +extern int doTree; +extern int percentUpdate; +extern float objectSpeed; +extern bool enableDraw; + +static void TW_CALL NormalMode(void* pdata) +{ +btDbvtBroadphase* pb=(btDbvtBroadphase*)pdata; +pb->m_deferedcollide = true; +} + +static void TW_CALL SlowSpeedMode(void* pdata) +{ +btDbvtBroadphase* pb=(btDbvtBroadphase*)pdata; +pb->m_deferedcollide = false; +} + +void BulletSAPCompleteBoxPruningTest::Select() +{ + // Create a tweak bar + { + mBar = TwNewBar("OPC_CompleteBoxPruning"); + TwAddVarRW(mBar, "Speed", TW_TYPE_FLOAT, &objectSpeed, " min=0.0 max=0.01 step=0.0001"); + TwAddVarRW(mBar, "Amplitude", TW_TYPE_FLOAT, &mAmplitude, " min=10.0 max=200.0 step=0.1"); + if(m_isdbvt) + { + btDbvtBroadphase* pbp=(btDbvtBroadphase*)m_broadphase; + TwAddVarRW(mBar, "Enable culling",TW_TYPE_BOOLCPP,&enableCulling,""); + TwAddVarRW(mBar, "Enable occlusion",TW_TYPE_BOOLCPP,&enableOcclusion,""); + TwAddVarRW(mBar, "Show culling",TW_TYPE_BOOLCPP,&showCulling,""); + TwAddVarRW(mBar, "Show occlusion",TW_TYPE_BOOLCPP,&showOcclusion,""); + TwAddVarRW(mBar, "Cull far plane",TW_TYPE_BOOLCPP,&cullFarPlane,""); + TwAddVarRW(mBar, "OC Min area",TW_TYPE_FLOAT,&ocb.ocarea,"min=0.0 max=1.0 step=0.001"); + TwAddVarRW(mBar, "QR Min area",TW_TYPE_FLOAT,&ocb.qrarea,"min=0.0 max=1.0 step=0.001"); + TwAddVarRW(mBar, "Dyn lkhd",TW_TYPE_INT32,&pbp->m_sets[0].m_lkhd,"min=-1 max=32"); + TwAddVarRW(mBar, "Fix lkhd",TW_TYPE_INT32,&pbp->m_sets[1].m_lkhd,"min=-1 max=32"); + TwAddVarRW(mBar, "Dyn opt/f(%)",TW_TYPE_INT32,&pbp->m_dupdates,"min=0 max=100"); + TwAddVarRW(mBar, "Fix opt/f(%)",TW_TYPE_INT32,&pbp->m_fupdates,"min=0 max=100"); + TwAddVarRW(mBar, "Cln opt/f(%)",TW_TYPE_INT32,&pbp->m_cupdates,"min=0 max=100"); + TwAddVarRW(mBar, "Prediction",TW_TYPE_FLOAT,&pbp->m_prediction,"min=0.0 max=2.0 step=0.1"); + TwAddVarRW(mBar, "Defered collide",TW_TYPE_BOOLCPP,&pbp->m_deferedcollide,""); + TwAddVarRO(mBar, "Dyn leafs",TW_TYPE_INT32,&pbp->m_sets[0].m_leaves,""); + TwAddVarRO(mBar, "Fix leafs",TW_TYPE_INT32,&pbp->m_sets[1].m_leaves,""); + TwAddVarRO(mBar, "Updates ratio",TW_TYPE_FLOAT,&pbp->m_updates_ratio,""); + TwAddVarRO(mBar, "Visible",TW_TYPE_INT32,&visiblecount,""); + TwAddButton(mBar,"Normal mode",&NormalMode,m_broadphase,""); + TwAddButton(mBar,"Slow speed mode",&SlowSpeedMode,m_broadphase,""); + } + } + printf("SubMethod: %s\r\n",methodname); +} + +void BulletSAPCompleteBoxPruningTest::Deselect() +{ + if(mBar) + { + TwDeleteBar(mBar); + mBar = null; + } +} + +bool BulletSAPCompleteBoxPruningTest::UpdateBoxes(int numBoxes) +{ + static bool once=true; + + for(udword i=0;i<(udword)numBoxes;i++) + { + mBoxTime[i] += objectSpeed; + + Point Center,Extents; + mBoxes[i].GetExtents(Extents); + + Center.x = cosf(mBoxTime[i]*2.17f)*mAmplitude + sinf(mBoxTime[i])*mAmplitude*0.5f; + Center.y = cosf(mBoxTime[i]*1.38f)*mAmplitude + sinf(mBoxTime[i]*mAmplitude); + Center.z = sinf(mBoxTime[i]*0.777f)*mAmplitude; + + mBoxes[i].SetCenterExtents(Center, Extents); + } + return true; +} + +void BulletSAPCompleteBoxPruningTest::PerformTest() +{ + int numUpdatedBoxes = (mNbBoxes*percentUpdate)/100; + if (m_firstTime) + { + numUpdatedBoxes = mNbBoxes; + } + mProfiler.Start(); + UpdateBoxes(numUpdatedBoxes); + + + mPairs.ResetPairs(); + + //CompleteBoxPruning(mNbBoxes, mBoxPtrs, mPairs, Axes(AXES_XZY)); + ///add batch query? + + + for (int i=0;iGetCenter(Center); + mBoxPtrs[i]->GetExtents(Extents); + btVector3 aabbMin(Center.x-Extents.x,Center.y-Extents.y,Center.z-Extents.z); + btVector3 aabbMax(Center.x+Extents.x,Center.y+Extents.y,Center.z+Extents.z); + m_broadphase->setAabb(m_proxies[i],aabbMin,aabbMax,0);//m_dispatcher); + } + +#ifndef BT_NO_PROFILE + if(sBulletProfilerToggle) + { + CProfileManager::Reset(); + } +#endif //BT_NO_PROFILE + + m_broadphase->calculateOverlappingPairs(0); + +#ifndef BT_NO_PROFILE + if(sBulletProfilerToggle) + { + CProfileManager::Increment_Frame_Counter(); + CProfileManager::dumpAll(); + } +#endif //BT_NO_PROFILE + + + mProfiler.End(); + mProfiler.Accum(); + + if (m_firstTime) + { + //initialization messes up timings + m_firstTime = false; + if(m_isdbvt) + { + ((btDbvtBroadphase*)m_broadphase)->m_deferedcollide=false; + } + mProfiler.Reset(); + } + + #if 0 + { + int missedpairs=0; + for(int i=0;iaabb,pb->aabb)) + { + btDbvtProxy* spa=pa; + btDbvtProxy* spb=pb; + if(spa>spb) btSwap(spa,spb); + if(!m_broadphase->getOverlappingPairCache()->findPair(spa,spb)) + { + ++missedpairs; + printf("Cannot find %i,%i\r\n",i,j); + } + } + } + } + if(missedpairs>0) printf("Missed pairs: %u\r\n",missedpairs); + } + #endif + +// printf("%d pairs colliding\r ", mPairs.GetNbPairs()); + + ZeroMemory(mFlags,sizeof(bool)*mNbBoxes); + + btOverlappingPairCache* pairCache = m_broadphase->getOverlappingPairCache(); + const btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr(); + + for(udword i=0;i<(udword)pairCache->getNumOverlappingPairs();i++) + { +// Flags[pairPtr[i].m_pProxy0->getUid()-1] = true; +// Flags[pairPtr[i].m_pProxy1->getUid()-1] = true; + int j; + j=((AABB*)pairPtr[i].m_pProxy0->m_clientObject)-mBoxes; + mFlags[j] = true; + j=((AABB*)pairPtr[i].m_pProxy1->m_clientObject)-mBoxes; + mFlags[j] = true; + } + + if(enableDraw) + { + btVector3 aabbMin(-200,-200,-200); + btVector3 aabbMax(200,200,200); + + btVector3 tmpAabbMin,tmpAabbMax; + glDisable(GL_DEPTH_TEST); + + + float numP = (float) numParts; + + for (int i=0;igetOverlappingPairCache()->getNumOverlappingPairs()); + +// m_broadphase)->printStats(); + + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +// +static void DrawVolume(const btDbvtVolume& volume,const btVector3& color) +{ +const btVector3 mins=volume.Mins(); +const btVector3 maxs=volume.Maxs(); +glColor3f(color.x(),color.y(),color.z()); +glVertex3f(mins.x(),mins.y(),mins.z()); +glVertex3f(maxs.x(),mins.y(),mins.z()); + +glVertex3f(maxs.x(),mins.y(),mins.z()); +glVertex3f(maxs.x(),maxs.y(),mins.z()); + +glVertex3f(maxs.x(),maxs.y(),mins.z()); +glVertex3f(mins.x(),maxs.y(),mins.z()); + +glVertex3f(mins.x(),maxs.y(),mins.z()); +glVertex3f(mins.x(),mins.y(),mins.z()); + +glVertex3f(mins.x(),mins.y(),maxs.z()); +glVertex3f(maxs.x(),mins.y(),maxs.z()); + +glVertex3f(maxs.x(),mins.y(),maxs.z()); +glVertex3f(maxs.x(),maxs.y(),maxs.z()); + +glVertex3f(maxs.x(),maxs.y(),maxs.z()); +glVertex3f(mins.x(),maxs.y(),maxs.z()); + +glVertex3f(mins.x(),maxs.y(),maxs.z()); +glVertex3f(mins.x(),mins.y(),maxs.z()); + +glVertex3f(mins.x(),mins.y(),mins.z()); +glVertex3f(mins.x(),mins.y(),maxs.z()); + +glVertex3f(maxs.x(),mins.y(),mins.z()); +glVertex3f(maxs.x(),mins.y(),maxs.z()); + +glVertex3f(maxs.x(),maxs.y(),mins.z()); +glVertex3f(maxs.x(),maxs.y(),maxs.z()); + +glVertex3f(mins.x(),maxs.y(),mins.z()); +glVertex3f(mins.x(),maxs.y(),maxs.z()); +} + +// +void BulletSAPCompleteBoxPruningTest::RenderAll() +{ +OBB CurrentBox; +CurrentBox.mRot.Identity(); +for(udword i=0;iqueryOccluder(node->volume.Center(),node->volume.Extents())); + } + void Process(const btDbvtNode* node,btScalar depth) + { + Process(node); + } + void Process(const btDbvtNode* leaf) + { + btBroadphaseProxy* proxy=(btBroadphaseProxy*)leaf->data; + int i=((AABB*)proxy->m_clientObject)-self->mBoxes; + if(self->mFlags[i]) glColor3f(1.0f, 0.0f, 0.0f); + else glColor3f(0.0f, 1.0f, 0.0f); + self->mBoxes[i].GetCenter(box.mCenter); + self->mBoxes[i].GetExtents(box.mExtents); + DrawOBB(box);drawn++; + if(ocb) + { + ocb->appendOccluder(btVector3(box.mCenter.x,box.mCenter.y,box.mCenter.z), + btVector3(box.mExtents.x,box.mExtents.y,box.mExtents.z)); + } + } + } srenderer; + srenderer.self=this; + srenderer.ocb=0; + if(enableOcclusion) + { + srenderer.ocb=&ocb; + btDbvt::collideOCL(pbp->m_sets[1].m_root,planes_n,planes_o,dir,acplanes,srenderer); + btDbvt::collideOCL(pbp->m_sets[0].m_root,planes_n,planes_o,dir,acplanes,srenderer); + } + else + { + btDbvt::collideKDOP(pbp->m_sets[1].m_root,planes_n,planes_o,acplanes,srenderer); + btDbvt::collideKDOP(pbp->m_sets[0].m_root,planes_n,planes_o,acplanes,srenderer); + } + visiblecount=srenderer.drawn; + if(showOcclusion&&enableOcclusion) + { + const btScalar ratio=((float)glutGet(GLUT_WINDOW_HEIGHT))/((float)glutGet(GLUT_WINDOW_WIDTH)); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1,1,-1,1,-1,1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + const float mm[]={ 1,0,0,0, + 0,1,0,0, + 0,0,0,1, + 0,0,0,1}; + glMultMatrixf(mm); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + const float size=0.6f; + const float orgx=0.3f; + const float orgy=0.25f; + const float left=orgx; + const float right=orgx+size; + const float top=orgy+size; + const float bottom=orgy; + ocb.drawBuffer(left,bottom,right,top); + } + if(showCulling) + { + const btScalar ratio=((float)glutGet(GLUT_WINDOW_HEIGHT))/((float)glutGet(GLUT_WINDOW_WIDTH)); + static const float scale=0.004; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1,1,-1*ratio,1*ratio,-1,1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + const float mm[]={ 1,0,0,0, + 0,0,1,0, + 0,1,0,0, + 0,0,0,1}; + glMultMatrixf(mm); + glScalef(scale,scale,scale); + + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glBegin(GL_LINES); + glColor4f(1,1,1,1); + + struct DebugRenderer : btDbvt::ICollide + { + OcclusionBuffer* ocb; + int sid; + bool AllLeafs(const btDbvtNode* node) + { + Process(node); + return(false); + } + bool Descent(const btDbvtNode* node) + { + return(ocb->queryOccluder(node->volume.Center(),node->volume.Extents())); + } + void Process(const btDbvtNode* node,btScalar depth) + { + Process(node); + } + void Process(const btDbvtNode* node) + { + if(ocb) + { + ocb->appendOccluder(node->volume.Center(),node->volume.Extents()); + } + if(sid>=0) + { + const float f=sid/1023.; + DrawVolume(node->volume,btVector3(1,f,f)); + sid=(sid+1)%1024; + } + else + { + if(node->isinternal()) + DrawVolume(node->volume,btVector3(0,1,0)); + else + DrawVolume(node->volume,btVector3(1,0,1)); + } + } + } drenderer; + if(enableOcclusion) + { + drenderer.ocb=&ocb; + drenderer.sid=0; + ocb.clear(); + btDbvt::collideOCL(pbp->m_sets[1].m_root,planes_n,planes_o,dir,acplanes,drenderer); + btDbvt::collideOCL(pbp->m_sets[0].m_root,planes_n,planes_o,dir,acplanes,drenderer); + } + else + { + drenderer.ocb=0; + drenderer.sid=-1; + btDbvt::collideKDOP(pbp->m_sets[1].m_root,planes_n,planes_o,acplanes,drenderer); + btDbvt::collideKDOP(pbp->m_sets[0].m_root,planes_n,planes_o,acplanes,drenderer); + } + glEnd(); + + glBegin(GL_LINES); + glColor4f(1,1,1,1); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x00.x(),x00.y(),x00.z()); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x10.x(),x10.y(),x10.z()); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x01.x(),x01.y(),x01.z()); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x11.x(),x11.y(),x11.z()); + + glVertex3f(x00.x(),x00.y(),x00.z()); + glVertex3f(x10.x(),x10.y(),x10.z()); + + glVertex3f(x10.x(),x10.y(),x10.z()); + glVertex3f(x11.x(),x11.y(),x11.z()); + + glVertex3f(x11.x(),x11.y(),x11.z()); + glVertex3f(x01.x(),x01.y(),x01.z()); + + glVertex3f(x01.x(),x01.y(),x01.z()); + glVertex3f(x00.x(),x00.y(),x00.z()); + glEnd(); + } + } +} + +void BulletSAPCompleteBoxPruningTest::KeyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 'p': + case 'P': + sBulletProfilerToggle = !sBulletProfilerToggle; + break; + default : break; + } +} + +void BulletSAPCompleteBoxPruningTest::MouseCallback(int button, int state, int x, int y) +{ +} + +void BulletSAPCompleteBoxPruningTest::MotionCallback(int x, int y) +{ +} diff --git a/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h b/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h index a11bb43fe..e944d19ca 100644 --- a/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h +++ b/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h @@ -1,65 +1,65 @@ -/* -BulletSAPCompleteBoxPruningTest, Copyright (c) 2008 Erwin Coumans -Part of: -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 BULLET_SAP_COMPLETEBOXPRUNING_H -#define BULLET_SAP_COMPLETEBOXPRUNING_H - -#include "LinearMath/btAlignedObjectArray.h" - -#include "CollisionTest.h" -#include "Profiling.h" - - class BulletSAPCompleteBoxPruningTest : public CollisionTest - { - public: - BulletSAPCompleteBoxPruningTest(int numBoxes,int method); - virtual ~BulletSAPCompleteBoxPruningTest(); - - virtual void Init(); - virtual void Release(); - virtual void PerformTest(); - void RenderAll(); - void Render(); - virtual void Select(); - virtual void Deselect(); - virtual void KeyboardCallback(unsigned char key, int x, int y); - virtual void MouseCallback(int button, int state, int x, int y); - virtual void MotionCallback(int x, int y); - - TwBar* mBar; //!< AntTweakBar - Profiler mProfiler; - - class btBroadphaseInterface* m_broadphase; - bool m_isdbvt; - btAlignedObjectArray m_proxies; - - udword mNbBoxes; - AABB* mBoxes; - bool* mFlags; - const char* methodname; - const AABB** mBoxPtrs; - Pairs mPairs; - float* mBoxTime; - float mAmplitude; - bool m_firstTime; - int m_method; - - private: - bool UpdateBoxes(int numBoxes); - }; - -#endif // BULLET_SAP_COMPLETEBOXPRUNING_H +/* +BulletSAPCompleteBoxPruningTest, Copyright (c) 2008 Erwin Coumans +Part of: +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 BULLET_SAP_COMPLETEBOXPRUNING_H +#define BULLET_SAP_COMPLETEBOXPRUNING_H + +#include "LinearMath/btAlignedObjectArray.h" + +#include "CollisionTest.h" +#include "Profiling.h" + + class BulletSAPCompleteBoxPruningTest : public CollisionTest + { + public: + BulletSAPCompleteBoxPruningTest(int numBoxes,int method); + virtual ~BulletSAPCompleteBoxPruningTest(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + void RenderAll(); + void Render(); + virtual void Select(); + virtual void Deselect(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + Profiler mProfiler; + + class btBroadphaseInterface* m_broadphase; + bool m_isdbvt; + btAlignedObjectArray m_proxies; + + udword mNbBoxes; + AABB* mBoxes; + bool* mFlags; + const char* methodname; + const AABB** mBoxPtrs; + Pairs mPairs; + float* mBoxTime; + float mAmplitude; + bool m_firstTime; + int m_method; + + private: + bool UpdateBoxes(int numBoxes); + }; + +#endif // BULLET_SAP_COMPLETEBOXPRUNING_H diff --git a/Extras/CDTestFramework/CDTestFramework.cpp b/Extras/CDTestFramework/CDTestFramework.cpp index db0d42cff..6ac430919 100644 --- a/Extras/CDTestFramework/CDTestFramework.cpp +++ b/Extras/CDTestFramework/CDTestFramework.cpp @@ -1,444 +1,444 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" - -#include "CollisionTest.h" -#include "SphereMeshQuery.h" -#include "OBBMeshQuery.h" -#include "CapsuleMeshQuery.h" -#include "CompleteBoxPruning.h" -#include "BulletSAPCompleteBoxPruningTest.h" -#include "BulletSAPCompleteBoxPruningTest.h" -#include "BipartiteBoxPruning.h" -#include "OpcodeArraySAPTest.h" -#include "RenderingHelpers.h" -#include "Terrain.h" -#include "Camera.h" -#include "GLFontRenderer.h" -#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" -#include "LinearMath/btQuickprof.h" - -#define NUM_SAP_BOXES 8192 -//#define NUM_SAP_BOXES 16384 -//#define NUM_SAP_BOXES 1024 - -int percentUpdate = 100; -//float objectSpeed = 0.005f; -float objectSpeed = 0.01f; -bool enableDraw = true; - -//Broadphase comparison -//Static case (updating 10% of objects to same position ( -> no swaps) -//number of objects //OPCODE BoxPruning / Bullet SAP / Bullet MultiSAP -//1024 0.35ms, 0.03ms, 0.15ms -//8192 21ms, 0.2ms, 5ms -//16384 92ms , 0.5ms, 28ms - -//Dynamic case, 10% objects are moving as fast as this testbed allows (0.01?) -//number of objects //OPCODE BoxPruning / Bullet SAP / Bullet MultiSAP -//1024 0.35ms, 0.2ms, 0.25ms -//8192 21ms , 15ms , 13ms -//16384 92ms, 80ms, 49ms - - -#define WINDOW_WIDTH 1024 -#define WINDOW_HEIGHT 768 - -static int gMouseX = 0; -static int gMouseY = 0; -static int gButton = 0; - -static TwBar* gMainBar = null; -enum TestIndex -{ -// TEST_SPHERE_MESH_QUERY, -// TEST_OBB_MESH_QUERY, -// TEST_CAPSULE_MESH_QUERY, -// TEST_COMPLETE_BOX_PRUNING=0, - TEST_COMPLETE_BOX_PRUNING_8192, -// TEST_BULLET_SAP_1024, -// TEST_BULLET_SAP_8192, -// TEST_BULLET_SAP_SORTEDPAIRS_8192, -// TEST_BULLET_MULTISAP_8192, -// TEST_BIPARTITE_BOX_PRUNING, - TEST_DBVT_8192, - TEST_BULLET_CUDA_8192, - TEST_BULLET_3DGRID_8192, - TEST_OPCODE_ARRAY_SAP, - MAX_NB_TESTS -}; - -//static int gTest = TEST_DBVT_8192;//TEST_BULLET_MULTISAP_8192; -//static int gSelectedTest = TEST_DBVT_8192;//TEST_BULLET_MULTISAP_8192; -static int gTest = TEST_BULLET_CUDA_8192; -static int gSelectedTest = TEST_BULLET_CUDA_8192; -static CollisionTest* gCollisionTests[MAX_NB_TESTS]; - -static GLFontRenderer gFnt; - -///////////////// - -static void KeyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case 27: exit(0); break; - - case '+': - { - if(gTest!=MAX_NB_TESTS-1) - { - gCollisionTests[gTest]->Deselect(); - gTest++; - gSelectedTest++; - gCollisionTests[gTest]->Select(); - } - } - break; - - case '-': - { - if(gTest) - { - gCollisionTests[gTest]->Deselect(); - gTest--; - gSelectedTest--; - gCollisionTests[gTest]->Select(); - } - } - break; - - case 101: MoveCameraForward(); break; - case 103: MoveCameraBackward(); break; - case 100: MoveCameraRight(); break; - case 102: MoveCameraLeft(); break; - default: gCollisionTests[gTest]->KeyboardCallback(key, x, y); break; - } - - TwEventKeyboardGLUT(key, x, y); -} - -static void ArrowKeyCallback(int key, int x, int y) -{ - KeyboardCallback(key, x, y); - - TwEventSpecialGLUT(key, x, y); -} - -static void MouseCallback(int button, int state, int x, int y) -{ - gButton = button; - gMouseX = x; - gMouseY = y; - - if(!TwEventMouseButtonGLUT(button, state, x, y)) - { - gCollisionTests[gTest]->MouseCallback(button, state, x, y); - } -} - -static void MotionCallback(int x, int y) -{ - if(!TwEventMouseMotionGLUT(x, y)) - { - if(gButton==2) - { - int dx = gMouseX - x; - int dy = gMouseY - y; - - RotateCamera(dx, dy); - - gMouseX = x; - gMouseY = y; - } - else - gCollisionTests[gTest]->MotionCallback(x, y); - } -} - -static void RenderCallback() -{ - // Clear buffers - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // Setup camera - glMatrixMode(GL_PROJECTION); - SetupCameraMatrix(); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glEnable(GL_LIGHTING); - - if(0 /*gRenderWireframe*/) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - gCollisionTests[gTest]->PerformTest(); - - // Draw tweak bars - TwDraw(); - - glutSwapBuffers(); - glutPostRedisplay(); - - if(gSelectedTest!=gTest) - { - gCollisionTests[gTest]->Deselect(); - gTest = gSelectedTest; - gCollisionTests[gTest]->Select(); - } -} - -static void ReshapeCallback(int width, int height) -{ - glViewport(0, 0, width, height); - - // Send the new window size to AntTweakBar - TwWindowSize(width, height); -} - -static void IdleCallback() -{ - glutPostRedisplay(); -} - -static void Terminate() -{ - ReleaseTerrain(); - - for(int i=0;iRelease(); - DELETESINGLE(gCollisionTests[i]); - } - - if(gMainBar) - { - TwDeleteBar(gMainBar); - gMainBar = null; - } - - TwTerminate(); -} - -int main(int argc, char** argv) -{ - { - ::SetPriorityClass(::GetCurrentProcess(),REALTIME_PRIORITY_CLASS); - /*btDbvt::benchmark(); - exit(0);*/ - } - // Initialize AntTweakBar - // (note that AntTweakBar could also be intialize after GLUT, no matter) - if(!TwInit(TW_OPENGL, NULL)) - { - // A fatal error occured - fprintf(stderr, "AntTweakBar initialization failed: %s\n", TwGetLastError()); - } - - // Initialize Glut - glutInit(&argc, argv); - glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - int mainHandle = glutCreateWindow("CD Test Framework"); - -/* HWND hWnd; - hWnd = FindWindow("GLUT", "CD Test Framework"); - RECT Rect; - GetWindowRect(hWnd, &Rect); -*/ - glutCreateMenu(NULL); - glutSetWindow(mainHandle); - glutDisplayFunc(RenderCallback); - glutReshapeFunc(ReshapeCallback); - glutIdleFunc(IdleCallback); - glutKeyboardFunc(KeyboardCallback); - glutSpecialFunc(ArrowKeyCallback); - glutMouseFunc(MouseCallback); - glutMotionFunc(MotionCallback); - atexit(Terminate); // Called after glutMainLoop ends - - glutPassiveMotionFunc((GLUTmousemotionfun)TwEventMouseMotionGLUT); - TwGLUTModifiersFunc(glutGetModifiers); - - // Setup default render states - glClearColor(0.3f, 0.4f, 0.5f, 1.0); - glEnable(GL_DEPTH_TEST); - glEnable(GL_COLOR_MATERIAL); - glEnable(GL_CULL_FACE); - glDepthFunc(GL_LEQUAL); - - // Setup lighting - glEnable(GL_LIGHTING); - float AmbientColor[] = { 0.0f, 0.1f, 0.2f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientColor); - float DiffuseColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseColor); - float SpecularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularColor); - float Position[] = { -10.0f, 1000.0f, -4.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, Position); - glEnable(GL_LIGHT0); - - gFnt.init(); - gFnt.setScreenResolution(WINDOW_WIDTH, WINDOW_HEIGHT); - gFnt.setColor(1.0f, 1.0f, 1.0f, 1.0f); - - CreateTerrain(); - - // Create main tweak bar - { - gMainBar = TwNewBar("CollisionTests"); - TwEnumVal testEV[MAX_NB_TESTS] = { -// {TEST_SPHERE_MESH_QUERY, "Sphere-mesh query"}, -// {TEST_OBB_MESH_QUERY, "OBB-mesh query"}, -// {TEST_CAPSULE_MESH_QUERY, "Capsule-mesh query"}, -// {TEST_COMPLETE_BOX_PRUNING, "OPCODE SAP 1024"}, - {TEST_COMPLETE_BOX_PRUNING_8192, "OPCODE BOX PRUNING 8192"}, -// {TEST_BULLET_SAP_1024, "Bullet SAP HASHPAIR 1024"}, -// {TEST_BULLET_SAP_8192, "Bullet SAP HASHPAIR 8192"}, -// {TEST_BULLET_SAP_SORTEDPAIRS_8192, "Bullet SAP SORTEDPAIR 8192"}, -// {TEST_BULLET_MULTISAP_8192, "Bullet MultiSAP 8192"}, -// {TEST_BIPARTITE_BOX_PRUNING, "Bipartite box pruning"}, - {TEST_DBVT_8192, "Bullet DBVT 8192"}, - {TEST_BULLET_CUDA_8192, "Bullet CUDA 8192"}, - {TEST_BULLET_3DGRID_8192, "Bullet 3D Grid 8192"}, - {TEST_OPCODE_ARRAY_SAP, "OPCODE ARRAY SAP"}, - }; - TwType testType = TwDefineEnum("CollisionTest", testEV, MAX_NB_TESTS); - TwAddVarRW(gMainBar, "CollisionTests", testType, &gSelectedTest, ""); - TwAddVarRW(gMainBar, "% of updates",TW_TYPE_INT32,&percentUpdate,"min=0 max=100"); - TwAddVarRW(gMainBar, "Draw",TW_TYPE_BOOLCPP,&enableDraw,""); - } - - // Create tests - gTest = 0; -// gCollisionTests[TEST_SPHERE_MESH_QUERY] = new SphereMeshQuery; -// gCollisionTests[TEST_OBB_MESH_QUERY] = new OBBMeshQuery; -// gCollisionTests[TEST_CAPSULE_MESH_QUERY] = new CapsuleMeshQuery; -// gCollisionTests[TEST_COMPLETE_BOX_PRUNING] = new CompleteBoxPruningTest(NUM_SAP_BOXES); - // gCollisionTests[TEST_COMPLETE_BOX_PRUNING_8192] = new CompleteBoxPruningTest(NUM_SAP_BOXES); - gCollisionTests[TEST_COMPLETE_BOX_PRUNING_8192] = new CompleteBoxPruningTest(NUM_SAP_BOXES); -// gCollisionTests[TEST_BULLET_SAP_1024] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,1); -// gCollisionTests[TEST_BULLET_SAP_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,1); -// gCollisionTests[TEST_BULLET_SAP_SORTEDPAIRS_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,3); -// gCollisionTests[TEST_BULLET_MULTISAP_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,6); -// gCollisionTests[TEST_BIPARTITE_BOX_PRUNING] = new BipartiteBoxPruningTest; - gCollisionTests[TEST_DBVT_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,7); - gCollisionTests[TEST_BULLET_CUDA_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,8); - gCollisionTests[TEST_BULLET_3DGRID_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,9); - gCollisionTests[TEST_OPCODE_ARRAY_SAP] = new OpcodeArraySAPTest(NUM_SAP_BOXES); - - for(int i=0;iInit(); - gCollisionTests[gTest]->Select(); - - // - MotionCallback(0,0); - - // Run - glutMainLoop(); - - return 0; -} - - -#ifdef OLDIES - -#include "btBulletCollisionCommon.h" - -class BulletMeshInterface : public btStridingMeshInterface -{ - public: - /// get read and write access to a subpart of a triangle mesh - /// this subpart has a continuous array of vertices and indices - /// in this way the mesh can be handled as chunks of memory with striding - /// very similar to OpenGL vertexarray support - /// make a call to unLockVertexBase when the read and write access is finished - virtual void getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) - { - numverts = gTerrainData->nbVerts; - (*vertexbase) = (unsigned char *)gTerrainData->verts; - type = PHY_FLOAT; - stride = sizeof(Point); - - numfaces = gTerrainData->nbFaces; - (*indexbase) = (unsigned char *)gTerrainData->faces; - indicestype = PHY_INTEGER; - indexstride = 3*sizeof(udword); // ?? - } - - virtual void getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,const unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) const - { - numverts = gTerrainData->nbVerts; - (*vertexbase) = (unsigned char *)gTerrainData->verts; - type = PHY_FLOAT; - stride = sizeof(Point); - - numfaces = gTerrainData->nbFaces; - (*indexbase) = (unsigned char *)gTerrainData->faces; - indicestype = PHY_INTEGER; - indexstride = 3*sizeof(udword); // ?? - } - - /// unLockVertexBase finishes the access to a subpart of the triangle mesh - /// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished - virtual void unLockVertexBase(int subpart) - { - } - - virtual void unLockReadOnlyVertexBase(int subpart) const - { - } - - - /// getNumSubParts returns the number of seperate subparts - /// each subpart has a continuous array of vertices and indices - virtual int getNumSubParts() const - { - return 1; - } - - virtual void preallocateVertices(int numverts) - { - } - virtual void preallocateIndices(int numindices) - { - } -}; - -void BuildBulletTree() -{ -/* BulletMeshInterface btMeshInterface; - - btOptimizedBvh* btTree = new btOptimizedBvh; - btTree->build(&btMeshInterface, true); - - - struct MyNodeOverlapCallback : public btNodeOverlapCallback - { - virtual void processNode(int nodeSubPart, int nodeTriangleIndex) - { - } - }; - - MyNodeOverlapCallback myNodeCallback(callback,m_meshInterface); - - m_bvh->reportAabbOverlappingNodex(&myNodeCallback,aabbMin,aabbMax); -*/ - - -} - +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" + +#include "CollisionTest.h" +#include "SphereMeshQuery.h" +#include "OBBMeshQuery.h" +#include "CapsuleMeshQuery.h" +#include "CompleteBoxPruning.h" +#include "BulletSAPCompleteBoxPruningTest.h" +#include "BulletSAPCompleteBoxPruningTest.h" +#include "BipartiteBoxPruning.h" +#include "OpcodeArraySAPTest.h" +#include "RenderingHelpers.h" +#include "Terrain.h" +#include "Camera.h" +#include "GLFontRenderer.h" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" +#include "LinearMath/btQuickprof.h" + +#define NUM_SAP_BOXES 8192 +//#define NUM_SAP_BOXES 16384 +//#define NUM_SAP_BOXES 1024 + +int percentUpdate = 100; +//float objectSpeed = 0.005f; +float objectSpeed = 0.01f; +bool enableDraw = true; + +//Broadphase comparison +//Static case (updating 10% of objects to same position ( -> no swaps) +//number of objects //OPCODE BoxPruning / Bullet SAP / Bullet MultiSAP +//1024 0.35ms, 0.03ms, 0.15ms +//8192 21ms, 0.2ms, 5ms +//16384 92ms , 0.5ms, 28ms + +//Dynamic case, 10% objects are moving as fast as this testbed allows (0.01?) +//number of objects //OPCODE BoxPruning / Bullet SAP / Bullet MultiSAP +//1024 0.35ms, 0.2ms, 0.25ms +//8192 21ms , 15ms , 13ms +//16384 92ms, 80ms, 49ms + + +#define WINDOW_WIDTH 1024 +#define WINDOW_HEIGHT 768 + +static int gMouseX = 0; +static int gMouseY = 0; +static int gButton = 0; + +static TwBar* gMainBar = null; +enum TestIndex +{ +// TEST_SPHERE_MESH_QUERY, +// TEST_OBB_MESH_QUERY, +// TEST_CAPSULE_MESH_QUERY, +// TEST_COMPLETE_BOX_PRUNING=0, + TEST_COMPLETE_BOX_PRUNING_8192, +// TEST_BULLET_SAP_1024, +// TEST_BULLET_SAP_8192, +// TEST_BULLET_SAP_SORTEDPAIRS_8192, +// TEST_BULLET_MULTISAP_8192, +// TEST_BIPARTITE_BOX_PRUNING, + TEST_DBVT_8192, + TEST_BULLET_CUDA_8192, + TEST_BULLET_3DGRID_8192, + TEST_OPCODE_ARRAY_SAP, + MAX_NB_TESTS +}; + +//static int gTest = TEST_DBVT_8192;//TEST_BULLET_MULTISAP_8192; +//static int gSelectedTest = TEST_DBVT_8192;//TEST_BULLET_MULTISAP_8192; +static int gTest = TEST_BULLET_CUDA_8192; +static int gSelectedTest = TEST_BULLET_CUDA_8192; +static CollisionTest* gCollisionTests[MAX_NB_TESTS]; + +static GLFontRenderer gFnt; + +///////////////// + +static void KeyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 27: exit(0); break; + + case '+': + { + if(gTest!=MAX_NB_TESTS-1) + { + gCollisionTests[gTest]->Deselect(); + gTest++; + gSelectedTest++; + gCollisionTests[gTest]->Select(); + } + } + break; + + case '-': + { + if(gTest) + { + gCollisionTests[gTest]->Deselect(); + gTest--; + gSelectedTest--; + gCollisionTests[gTest]->Select(); + } + } + break; + + case 101: MoveCameraForward(); break; + case 103: MoveCameraBackward(); break; + case 100: MoveCameraRight(); break; + case 102: MoveCameraLeft(); break; + default: gCollisionTests[gTest]->KeyboardCallback(key, x, y); break; + } + + TwEventKeyboardGLUT(key, x, y); +} + +static void ArrowKeyCallback(int key, int x, int y) +{ + KeyboardCallback(key, x, y); + + TwEventSpecialGLUT(key, x, y); +} + +static void MouseCallback(int button, int state, int x, int y) +{ + gButton = button; + gMouseX = x; + gMouseY = y; + + if(!TwEventMouseButtonGLUT(button, state, x, y)) + { + gCollisionTests[gTest]->MouseCallback(button, state, x, y); + } +} + +static void MotionCallback(int x, int y) +{ + if(!TwEventMouseMotionGLUT(x, y)) + { + if(gButton==2) + { + int dx = gMouseX - x; + int dy = gMouseY - y; + + RotateCamera(dx, dy); + + gMouseX = x; + gMouseY = y; + } + else + gCollisionTests[gTest]->MotionCallback(x, y); + } +} + +static void RenderCallback() +{ + // Clear buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Setup camera + glMatrixMode(GL_PROJECTION); + SetupCameraMatrix(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_LIGHTING); + + if(0 /*gRenderWireframe*/) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + else + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + gCollisionTests[gTest]->PerformTest(); + + // Draw tweak bars + TwDraw(); + + glutSwapBuffers(); + glutPostRedisplay(); + + if(gSelectedTest!=gTest) + { + gCollisionTests[gTest]->Deselect(); + gTest = gSelectedTest; + gCollisionTests[gTest]->Select(); + } +} + +static void ReshapeCallback(int width, int height) +{ + glViewport(0, 0, width, height); + + // Send the new window size to AntTweakBar + TwWindowSize(width, height); +} + +static void IdleCallback() +{ + glutPostRedisplay(); +} + +static void Terminate() +{ + ReleaseTerrain(); + + for(int i=0;iRelease(); + DELETESINGLE(gCollisionTests[i]); + } + + if(gMainBar) + { + TwDeleteBar(gMainBar); + gMainBar = null; + } + + TwTerminate(); +} + +int main(int argc, char** argv) +{ + { + ::SetPriorityClass(::GetCurrentProcess(),REALTIME_PRIORITY_CLASS); + /*btDbvt::benchmark(); + exit(0);*/ + } + // Initialize AntTweakBar + // (note that AntTweakBar could also be intialize after GLUT, no matter) + if(!TwInit(TW_OPENGL, NULL)) + { + // A fatal error occured + fprintf(stderr, "AntTweakBar initialization failed: %s\n", TwGetLastError()); + } + + // Initialize Glut + glutInit(&argc, argv); + glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + int mainHandle = glutCreateWindow("CD Test Framework"); + +/* HWND hWnd; + hWnd = FindWindow("GLUT", "CD Test Framework"); + RECT Rect; + GetWindowRect(hWnd, &Rect); +*/ + glutCreateMenu(NULL); + glutSetWindow(mainHandle); + glutDisplayFunc(RenderCallback); + glutReshapeFunc(ReshapeCallback); + glutIdleFunc(IdleCallback); + glutKeyboardFunc(KeyboardCallback); + glutSpecialFunc(ArrowKeyCallback); + glutMouseFunc(MouseCallback); + glutMotionFunc(MotionCallback); + atexit(Terminate); // Called after glutMainLoop ends + + glutPassiveMotionFunc((GLUTmousemotionfun)TwEventMouseMotionGLUT); + TwGLUTModifiersFunc(glutGetModifiers); + + // Setup default render states + glClearColor(0.3f, 0.4f, 0.5f, 1.0); + glEnable(GL_DEPTH_TEST); + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_CULL_FACE); + glDepthFunc(GL_LEQUAL); + + // Setup lighting + glEnable(GL_LIGHTING); + float AmbientColor[] = { 0.0f, 0.1f, 0.2f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientColor); + float DiffuseColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseColor); + float SpecularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularColor); + float Position[] = { -10.0f, 1000.0f, -4.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, Position); + glEnable(GL_LIGHT0); + + gFnt.init(); + gFnt.setScreenResolution(WINDOW_WIDTH, WINDOW_HEIGHT); + gFnt.setColor(1.0f, 1.0f, 1.0f, 1.0f); + + CreateTerrain(); + + // Create main tweak bar + { + gMainBar = TwNewBar("CollisionTests"); + TwEnumVal testEV[MAX_NB_TESTS] = { +// {TEST_SPHERE_MESH_QUERY, "Sphere-mesh query"}, +// {TEST_OBB_MESH_QUERY, "OBB-mesh query"}, +// {TEST_CAPSULE_MESH_QUERY, "Capsule-mesh query"}, +// {TEST_COMPLETE_BOX_PRUNING, "OPCODE SAP 1024"}, + {TEST_COMPLETE_BOX_PRUNING_8192, "OPCODE BOX PRUNING 8192"}, +// {TEST_BULLET_SAP_1024, "Bullet SAP HASHPAIR 1024"}, +// {TEST_BULLET_SAP_8192, "Bullet SAP HASHPAIR 8192"}, +// {TEST_BULLET_SAP_SORTEDPAIRS_8192, "Bullet SAP SORTEDPAIR 8192"}, +// {TEST_BULLET_MULTISAP_8192, "Bullet MultiSAP 8192"}, +// {TEST_BIPARTITE_BOX_PRUNING, "Bipartite box pruning"}, + {TEST_DBVT_8192, "Bullet DBVT 8192"}, + {TEST_BULLET_CUDA_8192, "Bullet CUDA 8192"}, + {TEST_BULLET_3DGRID_8192, "Bullet 3D Grid 8192"}, + {TEST_OPCODE_ARRAY_SAP, "OPCODE ARRAY SAP"}, + }; + TwType testType = TwDefineEnum("CollisionTest", testEV, MAX_NB_TESTS); + TwAddVarRW(gMainBar, "CollisionTests", testType, &gSelectedTest, ""); + TwAddVarRW(gMainBar, "% of updates",TW_TYPE_INT32,&percentUpdate,"min=0 max=100"); + TwAddVarRW(gMainBar, "Draw",TW_TYPE_BOOLCPP,&enableDraw,""); + } + + // Create tests + gTest = 0; +// gCollisionTests[TEST_SPHERE_MESH_QUERY] = new SphereMeshQuery; +// gCollisionTests[TEST_OBB_MESH_QUERY] = new OBBMeshQuery; +// gCollisionTests[TEST_CAPSULE_MESH_QUERY] = new CapsuleMeshQuery; +// gCollisionTests[TEST_COMPLETE_BOX_PRUNING] = new CompleteBoxPruningTest(NUM_SAP_BOXES); + // gCollisionTests[TEST_COMPLETE_BOX_PRUNING_8192] = new CompleteBoxPruningTest(NUM_SAP_BOXES); + gCollisionTests[TEST_COMPLETE_BOX_PRUNING_8192] = new CompleteBoxPruningTest(NUM_SAP_BOXES); +// gCollisionTests[TEST_BULLET_SAP_1024] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,1); +// gCollisionTests[TEST_BULLET_SAP_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,1); +// gCollisionTests[TEST_BULLET_SAP_SORTEDPAIRS_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,3); +// gCollisionTests[TEST_BULLET_MULTISAP_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,6); +// gCollisionTests[TEST_BIPARTITE_BOX_PRUNING] = new BipartiteBoxPruningTest; + gCollisionTests[TEST_DBVT_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,7); + gCollisionTests[TEST_BULLET_CUDA_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,8); + gCollisionTests[TEST_BULLET_3DGRID_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,9); + gCollisionTests[TEST_OPCODE_ARRAY_SAP] = new OpcodeArraySAPTest(NUM_SAP_BOXES); + + for(int i=0;iInit(); + gCollisionTests[gTest]->Select(); + + // + MotionCallback(0,0); + + // Run + glutMainLoop(); + + return 0; +} + + +#ifdef OLDIES + +#include "btBulletCollisionCommon.h" + +class BulletMeshInterface : public btStridingMeshInterface +{ + public: + /// get read and write access to a subpart of a triangle mesh + /// this subpart has a continuous array of vertices and indices + /// in this way the mesh can be handled as chunks of memory with striding + /// very similar to OpenGL vertexarray support + /// make a call to unLockVertexBase when the read and write access is finished + virtual void getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) + { + numverts = gTerrainData->nbVerts; + (*vertexbase) = (unsigned char *)gTerrainData->verts; + type = PHY_FLOAT; + stride = sizeof(Point); + + numfaces = gTerrainData->nbFaces; + (*indexbase) = (unsigned char *)gTerrainData->faces; + indicestype = PHY_INTEGER; + indexstride = 3*sizeof(udword); // ?? + } + + virtual void getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,const unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) const + { + numverts = gTerrainData->nbVerts; + (*vertexbase) = (unsigned char *)gTerrainData->verts; + type = PHY_FLOAT; + stride = sizeof(Point); + + numfaces = gTerrainData->nbFaces; + (*indexbase) = (unsigned char *)gTerrainData->faces; + indicestype = PHY_INTEGER; + indexstride = 3*sizeof(udword); // ?? + } + + /// unLockVertexBase finishes the access to a subpart of the triangle mesh + /// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished + virtual void unLockVertexBase(int subpart) + { + } + + virtual void unLockReadOnlyVertexBase(int subpart) const + { + } + + + /// getNumSubParts returns the number of seperate subparts + /// each subpart has a continuous array of vertices and indices + virtual int getNumSubParts() const + { + return 1; + } + + virtual void preallocateVertices(int numverts) + { + } + virtual void preallocateIndices(int numindices) + { + } +}; + +void BuildBulletTree() +{ +/* BulletMeshInterface btMeshInterface; + + btOptimizedBvh* btTree = new btOptimizedBvh; + btTree->build(&btMeshInterface, true); + + + struct MyNodeOverlapCallback : public btNodeOverlapCallback + { + virtual void processNode(int nodeSubPart, int nodeTriangleIndex) + { + } + }; + + MyNodeOverlapCallback myNodeCallback(callback,m_meshInterface); + + m_bvh->reportAabbOverlappingNodex(&myNodeCallback,aabbMin,aabbMax); +*/ + + +} + #endif \ No newline at end of file diff --git a/Extras/CDTestFramework/CDTestFramework.h b/Extras/CDTestFramework/CDTestFramework.h index 356ee0748..b803cb386 100644 --- a/Extras/CDTestFramework/CDTestFramework.h +++ b/Extras/CDTestFramework/CDTestFramework.h @@ -1,20 +1,20 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 CDTESTFRAMEWORK_H -#define CDTESTFRAMEWORK_H - -#endif // CDTESTFRAMEWORK_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 CDTESTFRAMEWORK_H +#define CDTESTFRAMEWORK_H + +#endif // CDTESTFRAMEWORK_H diff --git a/Extras/CDTestFramework/CDTestFramework.sln b/Extras/CDTestFramework/CDTestFramework.sln index 418dcf5f5..7f0943353 100644 --- a/Extras/CDTestFramework/CDTestFramework.sln +++ b/Extras/CDTestFramework/CDTestFramework.sln @@ -1,78 +1,78 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CDTestFramework", "CDTestFramework.vcproj", "{0565DB39-45CC-416E-B549-BFC24F2666D1}" - ProjectSection(ProjectDependencies) = postProject - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {DBE44CA3-2912-4441-8D99-AA2242688AD2} = {DBE44CA3-2912-4441-8D99-AA2242688AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Opcode", "Opcode\Opcode.vcproj", "{DBE44CA3-2912-4441-8D99-AA2242688AD2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" -EndProject -Global - 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(ProjectConfigurationPlatforms) = postSolution - {0565DB39-45CC-416E-B549-BFC24F2666D1}.Debug|Win32.ActiveCfg = Debug|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.Debug|Win32.Build.0 = Debug|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDll|Win32.ActiveCfg = Debug|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDll|Win32.Build.0 = Debug|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.Release|Win32.ActiveCfg = Release|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.Release|Win32.Build.0 = Release|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDll|Win32.ActiveCfg = Release|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDll|Win32.Build.0 = Release|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 - {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDoublePrecision|Win32.Build.0 = Release|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Debug|Win32.ActiveCfg = Debug|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Debug|Win32.Build.0 = Debug|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDll|Win32.ActiveCfg = Debug|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDll|Win32.Build.0 = Debug|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Release|Win32.ActiveCfg = Release|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Release|Win32.Build.0 = Release|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDll|Win32.ActiveCfg = Release|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDll|Win32.Build.0 = Release|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 - {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDoublePrecision|Win32.Build.0 = Release|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 - {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 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CDTestFramework", "CDTestFramework.vcproj", "{0565DB39-45CC-416E-B549-BFC24F2666D1}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {DBE44CA3-2912-4441-8D99-AA2242688AD2} = {DBE44CA3-2912-4441-8D99-AA2242688AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Opcode", "Opcode\Opcode.vcproj", "{DBE44CA3-2912-4441-8D99-AA2242688AD2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" +EndProject +Global + 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(ProjectConfigurationPlatforms) = postSolution + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Debug|Win32.ActiveCfg = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Debug|Win32.Build.0 = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDll|Win32.ActiveCfg = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDll|Win32.Build.0 = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Release|Win32.ActiveCfg = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Release|Win32.Build.0 = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDll|Win32.ActiveCfg = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDll|Win32.Build.0 = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDoublePrecision|Win32.Build.0 = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Debug|Win32.ActiveCfg = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Debug|Win32.Build.0 = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDll|Win32.ActiveCfg = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDll|Win32.Build.0 = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Release|Win32.ActiveCfg = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Release|Win32.Build.0 = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDll|Win32.ActiveCfg = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDll|Win32.Build.0 = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDoublePrecision|Win32.Build.0 = Release|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 + {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 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Extras/CDTestFramework/CDTestFramework.txt b/Extras/CDTestFramework/CDTestFramework.txt index 4e393a1c1..6ff06a0e9 100644 --- a/Extras/CDTestFramework/CDTestFramework.txt +++ b/Extras/CDTestFramework/CDTestFramework.txt @@ -1,31 +1,31 @@ - -CD Test Framework -================= - -This is a very small app used to test various collision detection (CD) algorithms. -It will be first used as a demo/sample for Opcode 1.3 (a lot of people requested this), -and then I will also include benchmarks against competing libraries (Bullet, GIMPACT, etc). - -Update April 2, 2008 -Erwin Coumans added Bullet support for broadphase test (SAP, MultiSAP, other tests follow) -This CDTestFramework is now included in Bullet/Extras under the ZLib license. - -Current version includes tests for: -- sphere vs mesh queries -- OBB vs mesh queries -- capsule vs mesh queries -- complete box pruning -- bipartite box pruning - - -Pierre Terdiman -March 16, 2007 - -External libs used: - -Opcode 1.3 (http://www.codercorner.com/Opcode.htm) -AntTweakBar (http://www.antisphere.com/Wiki/tools:anttweakbar) -Bullet Physics Library (http://bulletphysics.com) - -Contact email: + +CD Test Framework +================= + +This is a very small app used to test various collision detection (CD) algorithms. +It will be first used as a demo/sample for Opcode 1.3 (a lot of people requested this), +and then I will also include benchmarks against competing libraries (Bullet, GIMPACT, etc). + +Update April 2, 2008 +Erwin Coumans added Bullet support for broadphase test (SAP, MultiSAP, other tests follow) +This CDTestFramework is now included in Bullet/Extras under the ZLib license. + +Current version includes tests for: +- sphere vs mesh queries +- OBB vs mesh queries +- capsule vs mesh queries +- complete box pruning +- bipartite box pruning + + +Pierre Terdiman +March 16, 2007 + +External libs used: + +Opcode 1.3 (http://www.codercorner.com/Opcode.htm) +AntTweakBar (http://www.antisphere.com/Wiki/tools:anttweakbar) +Bullet Physics Library (http://bulletphysics.com) + +Contact email: pierre@codercorner.com \ No newline at end of file diff --git a/Extras/CDTestFramework/CDTestFramework.vcproj b/Extras/CDTestFramework/CDTestFramework.vcproj index 895f47fb8..a3bf879ad 100644 --- a/Extras/CDTestFramework/CDTestFramework.vcproj +++ b/Extras/CDTestFramework/CDTestFramework.vcproj @@ -1,365 +1,365 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/Camera.cpp b/Extras/CDTestFramework/Camera.cpp index 73763a1f2..21ee7278d 100644 --- a/Extras/CDTestFramework/Camera.cpp +++ b/Extras/CDTestFramework/Camera.cpp @@ -1,156 +1,156 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "Camera.h" - -static const float gCamSpeed = 1.0f; -//static Point gEye(3.0616338f, 1.1985892f, 2.5769043f); -//static Point gDir(-0.66853905,-0.14004262,-0.73037237); -static Point gEye(240, 205, 205); -static Point gDir(-1,-1,-1); -static Point gN; -static float gFOV = 60.0f; - -const Point& GetCameraPos() -{ - return gEye; -} - -const Point& GetCameraDir() -{ - return gDir; -} - -void MoveCameraForward() -{ - gEye += gDir * gCamSpeed; -} - -void MoveCameraBackward() -{ - gEye -= gDir * gCamSpeed; -} - -void MoveCameraRight() -{ - gEye -= gN * gCamSpeed; -} - -void MoveCameraLeft() -{ - gEye += gN * gCamSpeed; -} - - static const float NxPiF32 = 3.141592653589793f; - - float degToRad(float a) - { - return (float)0.01745329251994329547 * a; - } - - class NxQuat - { - public: - NxQuat(){} - - NxQuat(const float angle, const Point & axis) - { - x = axis.x; - y = axis.y; - z = axis.z; - - const float i_length = 1.0f / sqrtf( x*x + y*y + z*z ); - x = x * i_length; - y = y * i_length; - z = z * i_length; - - float Half = degToRad(angle * 0.5f); - - w = cosf(Half); - const float sin_theta_over_two = sinf(Half ); - x = x * sin_theta_over_two; - y = y * sin_theta_over_two; - z = z * sin_theta_over_two; - } - - void NxQuat::multiply(const NxQuat& left, const Point& right) - { - float a,b,c,d; - - a = - left.x*right.x - left.y*right.y - left.z *right.z; - b = left.w*right.x + left.y*right.z - right.y*left.z; - c = left.w*right.y + left.z*right.x - right.z*left.x; - d = left.w*right.z + left.x*right.y - right.x*left.y; - - w = a; - x = b; - y = c; - z = d; - } - - void NxQuat::rotate(Point & v) const - { - NxQuat myInverse; - myInverse.x = -x; - myInverse.y = -y; - myInverse.z = -z; - myInverse.w = w; - - NxQuat left; - left.multiply(*this,v); - v.x = left.w*myInverse.x + myInverse.w*left.x + left.y*myInverse.z - myInverse.y*left.z; - v.y = left.w*myInverse.y + myInverse.w*left.y + left.z*myInverse.x - myInverse.z*left.x; - v.z = left.w*myInverse.z + myInverse.w*left.z + left.x*myInverse.y - myInverse.x*left.y; - } - - float x,y,z,w; - }; - -void RotateCamera(int dx, int dy) -{ - gDir = gDir.Normalize(); - gN = gDir ^ Point(0,1,0); - - NxQuat qx(NxPiF32 * dx * 20/ 180.0f, Point(0,1,0)); - qx.rotate(gDir); - NxQuat qy(NxPiF32 * dy * 20/ 180.0f, gN); - qy.rotate(gDir); -} - -void SetupCameraMatrix() -{ - glLoadIdentity(); - gluPerspective(gFOV, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); - gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f); -} - -Point ComputeWorldRay(int xs, int ys) -{ - GLint viewPort[4]; - GLdouble modelMatrix[16]; - GLdouble projMatrix[16]; - glGetIntegerv(GL_VIEWPORT, viewPort); - glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); - glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); - ys = viewPort[3] - ys - 1; - GLdouble wx0, wy0, wz0; - gluUnProject((GLdouble) xs, (GLdouble) ys, 0.0, modelMatrix, projMatrix, viewPort, &wx0, &wy0, &wz0); - GLdouble wx1, wy1, wz1; - gluUnProject((GLdouble) xs, (GLdouble) ys, 1.0, modelMatrix, projMatrix, viewPort, &wx1, &wy1, &wz1); - Point tmp(float(wx1-wx0), float(wy1-wy0), float(wz1-wz0)); - tmp.Normalize(); - return tmp; -} +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "Camera.h" + +static const float gCamSpeed = 1.0f; +//static Point gEye(3.0616338f, 1.1985892f, 2.5769043f); +//static Point gDir(-0.66853905,-0.14004262,-0.73037237); +static Point gEye(240, 205, 205); +static Point gDir(-1,-1,-1); +static Point gN; +static float gFOV = 60.0f; + +const Point& GetCameraPos() +{ + return gEye; +} + +const Point& GetCameraDir() +{ + return gDir; +} + +void MoveCameraForward() +{ + gEye += gDir * gCamSpeed; +} + +void MoveCameraBackward() +{ + gEye -= gDir * gCamSpeed; +} + +void MoveCameraRight() +{ + gEye -= gN * gCamSpeed; +} + +void MoveCameraLeft() +{ + gEye += gN * gCamSpeed; +} + + static const float NxPiF32 = 3.141592653589793f; + + float degToRad(float a) + { + return (float)0.01745329251994329547 * a; + } + + class NxQuat + { + public: + NxQuat(){} + + NxQuat(const float angle, const Point & axis) + { + x = axis.x; + y = axis.y; + z = axis.z; + + const float i_length = 1.0f / sqrtf( x*x + y*y + z*z ); + x = x * i_length; + y = y * i_length; + z = z * i_length; + + float Half = degToRad(angle * 0.5f); + + w = cosf(Half); + const float sin_theta_over_two = sinf(Half ); + x = x * sin_theta_over_two; + y = y * sin_theta_over_two; + z = z * sin_theta_over_two; + } + + void NxQuat::multiply(const NxQuat& left, const Point& right) + { + float a,b,c,d; + + a = - left.x*right.x - left.y*right.y - left.z *right.z; + b = left.w*right.x + left.y*right.z - right.y*left.z; + c = left.w*right.y + left.z*right.x - right.z*left.x; + d = left.w*right.z + left.x*right.y - right.x*left.y; + + w = a; + x = b; + y = c; + z = d; + } + + void NxQuat::rotate(Point & v) const + { + NxQuat myInverse; + myInverse.x = -x; + myInverse.y = -y; + myInverse.z = -z; + myInverse.w = w; + + NxQuat left; + left.multiply(*this,v); + v.x = left.w*myInverse.x + myInverse.w*left.x + left.y*myInverse.z - myInverse.y*left.z; + v.y = left.w*myInverse.y + myInverse.w*left.y + left.z*myInverse.x - myInverse.z*left.x; + v.z = left.w*myInverse.z + myInverse.w*left.z + left.x*myInverse.y - myInverse.x*left.y; + } + + float x,y,z,w; + }; + +void RotateCamera(int dx, int dy) +{ + gDir = gDir.Normalize(); + gN = gDir ^ Point(0,1,0); + + NxQuat qx(NxPiF32 * dx * 20/ 180.0f, Point(0,1,0)); + qx.rotate(gDir); + NxQuat qy(NxPiF32 * dy * 20/ 180.0f, gN); + qy.rotate(gDir); +} + +void SetupCameraMatrix() +{ + glLoadIdentity(); + gluPerspective(gFOV, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); + gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f); +} + +Point ComputeWorldRay(int xs, int ys) +{ + GLint viewPort[4]; + GLdouble modelMatrix[16]; + GLdouble projMatrix[16]; + glGetIntegerv(GL_VIEWPORT, viewPort); + glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); + glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); + ys = viewPort[3] - ys - 1; + GLdouble wx0, wy0, wz0; + gluUnProject((GLdouble) xs, (GLdouble) ys, 0.0, modelMatrix, projMatrix, viewPort, &wx0, &wy0, &wz0); + GLdouble wx1, wy1, wz1; + gluUnProject((GLdouble) xs, (GLdouble) ys, 1.0, modelMatrix, projMatrix, viewPort, &wx1, &wy1, &wz1); + Point tmp(float(wx1-wx0), float(wy1-wy0), float(wz1-wz0)); + tmp.Normalize(); + return tmp; +} diff --git a/Extras/CDTestFramework/Camera.h b/Extras/CDTestFramework/Camera.h index a34baaaed..0696e6898 100644 --- a/Extras/CDTestFramework/Camera.h +++ b/Extras/CDTestFramework/Camera.h @@ -1,32 +1,32 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 CAMERA_H -#define CAMERA_H - - const Point& GetCameraPos(); - const Point& GetCameraDir(); - void RotateCamera(int dx, int dy); - - void MoveCameraForward(); - void MoveCameraBackward(); - void MoveCameraRight(); - void MoveCameraLeft(); - - void SetupCameraMatrix(); - Point ComputeWorldRay(int xs, int ys); - -#endif // CAMERA_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 CAMERA_H +#define CAMERA_H + + const Point& GetCameraPos(); + const Point& GetCameraDir(); + void RotateCamera(int dx, int dy); + + void MoveCameraForward(); + void MoveCameraBackward(); + void MoveCameraRight(); + void MoveCameraLeft(); + + void SetupCameraMatrix(); + Point ComputeWorldRay(int xs, int ys); + +#endif // CAMERA_H diff --git a/Extras/CDTestFramework/CapsuleMeshQuery.cpp b/Extras/CDTestFramework/CapsuleMeshQuery.cpp index a8f763558..b1a62090d 100644 --- a/Extras/CDTestFramework/CapsuleMeshQuery.cpp +++ b/Extras/CDTestFramework/CapsuleMeshQuery.cpp @@ -1,127 +1,127 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "IceHelpers.h" -#include "RenderingHelpers.h" -#include "Terrain.h" -#include "CapsuleMeshQuery.h" -#include "Camera.h" -#include "GLFontRenderer.h" - -CapsuleMeshQuery::CapsuleMeshQuery() : - mBar (null), - mDist (0.0f), - mValidHit (false) -{ -} - -CapsuleMeshQuery::~CapsuleMeshQuery() -{ -} - -void CapsuleMeshQuery::Init() -{ - mP0 = Point(0.0f, -4.0f, 0.0f); - mP1 = Point(0.0f, 4.0f, 0.0f); - - Matrix3x3 MX,MY; - RotX(MX, 45.0f); - RotY(MY, 45.0f); - - mWorld = MX * MY; - mWorld.SetTrans(0.0f, 4.0f, 0.0f); -} - -void CapsuleMeshQuery::Release() -{ -} - -void CapsuleMeshQuery::PerformTest() -{ - RenderTerrain(); - - mCapsule.mP0 = mP0 * mWorld; - mCapsule.mP1 = mP1 * mWorld; - mCapsule.mRadius = 1.0f; - DrawCapsule(mWorld, mP0, mP1, 1.0f); - - const Model* TM = GetTerrainModel(); - if(TM) - { - LSSCollider Collider; - - mProfiler.Start(); - bool Status = Collider.Collide(mCache, mCapsule, *TM, null, null); - mProfiler.End(); - mProfiler.Accum(); - - if(Status) - { - if(Collider.GetContactStatus()) - { - udword NbTris = Collider.GetNbTouchedPrimitives(); - const udword* Indices = Collider.GetTouchedPrimitives(); - - RenderTerrainTriangles(NbTris, Indices); - } - } - } - - // Raycast hit - if(mValidHit) - { - Point wp = mLocalHit + (Point)mWorld.GetTrans(); - DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); - DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); - DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); - } - - char Buffer[4096]; - sprintf(Buffer, "Capsule-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); - GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); -} - -void CapsuleMeshQuery::KeyboardCallback(unsigned char key, int x, int y) -{ -} - -void CapsuleMeshQuery::MouseCallback(int button, int state, int x, int y) -{ - mValidHit = false; - if(!button && !state) - { - Point Dir = ComputeWorldRay(x, y); - - float s[2]; - if(RayCapsuleOverlap(GetCameraPos(), Dir, mCapsule, s)) - { - mValidHit = true; - mDist = s[0]; - Point hit = GetCameraPos() + Dir * mDist; - mLocalHit = hit - (Point)mWorld.GetTrans(); - } - } -} - -void CapsuleMeshQuery::MotionCallback(int x, int y) -{ - if(mValidHit) - { - Point Dir = ComputeWorldRay(x, y); - mWorld.SetTrans(GetCameraPos() + Dir*mDist - mLocalHit); - } -} +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "IceHelpers.h" +#include "RenderingHelpers.h" +#include "Terrain.h" +#include "CapsuleMeshQuery.h" +#include "Camera.h" +#include "GLFontRenderer.h" + +CapsuleMeshQuery::CapsuleMeshQuery() : + mBar (null), + mDist (0.0f), + mValidHit (false) +{ +} + +CapsuleMeshQuery::~CapsuleMeshQuery() +{ +} + +void CapsuleMeshQuery::Init() +{ + mP0 = Point(0.0f, -4.0f, 0.0f); + mP1 = Point(0.0f, 4.0f, 0.0f); + + Matrix3x3 MX,MY; + RotX(MX, 45.0f); + RotY(MY, 45.0f); + + mWorld = MX * MY; + mWorld.SetTrans(0.0f, 4.0f, 0.0f); +} + +void CapsuleMeshQuery::Release() +{ +} + +void CapsuleMeshQuery::PerformTest() +{ + RenderTerrain(); + + mCapsule.mP0 = mP0 * mWorld; + mCapsule.mP1 = mP1 * mWorld; + mCapsule.mRadius = 1.0f; + DrawCapsule(mWorld, mP0, mP1, 1.0f); + + const Model* TM = GetTerrainModel(); + if(TM) + { + LSSCollider Collider; + + mProfiler.Start(); + bool Status = Collider.Collide(mCache, mCapsule, *TM, null, null); + mProfiler.End(); + mProfiler.Accum(); + + if(Status) + { + if(Collider.GetContactStatus()) + { + udword NbTris = Collider.GetNbTouchedPrimitives(); + const udword* Indices = Collider.GetTouchedPrimitives(); + + RenderTerrainTriangles(NbTris, Indices); + } + } + } + + // Raycast hit + if(mValidHit) + { + Point wp = mLocalHit + (Point)mWorld.GetTrans(); + DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); + } + + char Buffer[4096]; + sprintf(Buffer, "Capsule-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +void CapsuleMeshQuery::KeyboardCallback(unsigned char key, int x, int y) +{ +} + +void CapsuleMeshQuery::MouseCallback(int button, int state, int x, int y) +{ + mValidHit = false; + if(!button && !state) + { + Point Dir = ComputeWorldRay(x, y); + + float s[2]; + if(RayCapsuleOverlap(GetCameraPos(), Dir, mCapsule, s)) + { + mValidHit = true; + mDist = s[0]; + Point hit = GetCameraPos() + Dir * mDist; + mLocalHit = hit - (Point)mWorld.GetTrans(); + } + } +} + +void CapsuleMeshQuery::MotionCallback(int x, int y) +{ + if(mValidHit) + { + Point Dir = ComputeWorldRay(x, y); + mWorld.SetTrans(GetCameraPos() + Dir*mDist - mLocalHit); + } +} diff --git a/Extras/CDTestFramework/CapsuleMeshQuery.h b/Extras/CDTestFramework/CapsuleMeshQuery.h index a15f607b1..590e36959 100644 --- a/Extras/CDTestFramework/CapsuleMeshQuery.h +++ b/Extras/CDTestFramework/CapsuleMeshQuery.h @@ -1,49 +1,49 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 CAPSULEMESHQUERY_H -#define CAPSULEMESHQUERY_H - -#include "CollisionTest.h" -#include "Profiling.h" - - class CapsuleMeshQuery : public CollisionTest - { - public: - CapsuleMeshQuery(); - virtual ~CapsuleMeshQuery(); - - virtual void Init(); - virtual void Release(); - virtual void PerformTest(); - virtual void KeyboardCallback(unsigned char key, int x, int y); - virtual void MouseCallback(int button, int state, int x, int y); - virtual void MotionCallback(int x, int y); - - TwBar* mBar; //!< AntTweakBar - Profiler mProfiler; - - Point mP0; - Point mP1; - Matrix4x4 mWorld; - LSS mCapsule; - LSSCache mCache; - - float mDist; - Point mLocalHit; - bool mValidHit; - }; - -#endif // CAPSULEMESHQUERY_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 CAPSULEMESHQUERY_H +#define CAPSULEMESHQUERY_H + +#include "CollisionTest.h" +#include "Profiling.h" + + class CapsuleMeshQuery : public CollisionTest + { + public: + CapsuleMeshQuery(); + virtual ~CapsuleMeshQuery(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + Profiler mProfiler; + + Point mP0; + Point mP1; + Matrix4x4 mWorld; + LSS mCapsule; + LSSCache mCache; + + float mDist; + Point mLocalHit; + bool mValidHit; + }; + +#endif // CAPSULEMESHQUERY_H diff --git a/Extras/CDTestFramework/CollisionTest.cpp b/Extras/CDTestFramework/CollisionTest.cpp index 7802a714e..e487154a5 100644 --- a/Extras/CDTestFramework/CollisionTest.cpp +++ b/Extras/CDTestFramework/CollisionTest.cpp @@ -1,38 +1,38 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "CollisionTest.h" - -OpcodeSettings::OpcodeSettings() : - mPrimitiveTests (true), - mFirstContact (false), - mUseCache (false) -{ -} - -void OpcodeSettings::AddToTweakBar(TwBar* tbar) -{ - TwAddVarRW(tbar, "Primitive tests", TW_TYPE_BOOLCPP, &mPrimitiveTests, " group='Opcode' "); - TwAddVarRW(tbar, "First contact", TW_TYPE_BOOLCPP, &mFirstContact, " group='Opcode' "); - TwAddVarRW(tbar, "Temporal coherence", TW_TYPE_BOOLCPP, &mUseCache, " group='Opcode' "); -} - -void OpcodeSettings::SetupCollider(Collider& collider) const -{ - collider.SetFirstContact(mFirstContact); - collider.SetPrimitiveTests(mPrimitiveTests); - collider.SetTemporalCoherence(mUseCache); +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "CollisionTest.h" + +OpcodeSettings::OpcodeSettings() : + mPrimitiveTests (true), + mFirstContact (false), + mUseCache (false) +{ +} + +void OpcodeSettings::AddToTweakBar(TwBar* tbar) +{ + TwAddVarRW(tbar, "Primitive tests", TW_TYPE_BOOLCPP, &mPrimitiveTests, " group='Opcode' "); + TwAddVarRW(tbar, "First contact", TW_TYPE_BOOLCPP, &mFirstContact, " group='Opcode' "); + TwAddVarRW(tbar, "Temporal coherence", TW_TYPE_BOOLCPP, &mUseCache, " group='Opcode' "); +} + +void OpcodeSettings::SetupCollider(Collider& collider) const +{ + collider.SetFirstContact(mFirstContact); + collider.SetPrimitiveTests(mPrimitiveTests); + collider.SetTemporalCoherence(mUseCache); } \ No newline at end of file diff --git a/Extras/CDTestFramework/CollisionTest.h b/Extras/CDTestFramework/CollisionTest.h index 2e945a002..addef25c2 100644 --- a/Extras/CDTestFramework/CollisionTest.h +++ b/Extras/CDTestFramework/CollisionTest.h @@ -1,50 +1,50 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 COLLISIONTEST_H -#define COLLISIONTEST_H - - class CollisionTest - { - public: - - CollisionTest() {} - virtual ~CollisionTest() {} - - virtual void Init() = 0; - virtual void Release() = 0; - virtual void PerformTest() = 0; - virtual void Select() {} - virtual void Deselect() {} - virtual void KeyboardCallback(unsigned char key, int x, int y) {} - virtual void MouseCallback(int button, int state, int x, int y) {} - virtual void MotionCallback(int x, int y) {} - }; - - class OpcodeSettings - { - public: - OpcodeSettings(); - - void AddToTweakBar(TwBar* tbar); - void SetupCollider(Collider& collider) const; - - bool mPrimitiveTests; - bool mFirstContact; - bool mUseCache; - }; - -#endif // COLLISIONTEST_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 COLLISIONTEST_H +#define COLLISIONTEST_H + + class CollisionTest + { + public: + + CollisionTest() {} + virtual ~CollisionTest() {} + + virtual void Init() = 0; + virtual void Release() = 0; + virtual void PerformTest() = 0; + virtual void Select() {} + virtual void Deselect() {} + virtual void KeyboardCallback(unsigned char key, int x, int y) {} + virtual void MouseCallback(int button, int state, int x, int y) {} + virtual void MotionCallback(int x, int y) {} + }; + + class OpcodeSettings + { + public: + OpcodeSettings(); + + void AddToTweakBar(TwBar* tbar); + void SetupCollider(Collider& collider) const; + + bool mPrimitiveTests; + bool mFirstContact; + bool mUseCache; + }; + +#endif // COLLISIONTEST_H diff --git a/Extras/CDTestFramework/CompleteBoxPruning.cpp b/Extras/CDTestFramework/CompleteBoxPruning.cpp index 9980b3488..9f0c1b218 100644 --- a/Extras/CDTestFramework/CompleteBoxPruning.cpp +++ b/Extras/CDTestFramework/CompleteBoxPruning.cpp @@ -1,168 +1,168 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "CompleteBoxPruning.h" -#include "RenderingHelpers.h" -#include "GLFontRenderer.h" - -CompleteBoxPruningTest::CompleteBoxPruningTest(int numBoxes) : - mBar (null), - mNbBoxes (numBoxes), - mBoxes (null), - mBoxPtrs (null), - mBoxTime (null), - mSpeed (0.005f), - mAmplitude (100.0f) -{ -} - -CompleteBoxPruningTest::~CompleteBoxPruningTest() -{ - DELETEARRAY(mBoxTime); - DELETEARRAY(mBoxPtrs); - DELETEARRAY(mBoxes); -} - -void CompleteBoxPruningTest::Init() -{ - m_firstTime = true; - - SRand(0); - mBoxes = new AABB[mNbBoxes]; - mBoxPtrs = new const AABB*[mNbBoxes]; - mBoxTime = new float[mNbBoxes]; - for(udword i=0;i -#include -#include -#include - -#include "GLFontData.h" -#include "GLFontRenderer.h" - -bool GLFontRenderer::m_isInit=false; -unsigned int GLFontRenderer::m_textureObject=0; -int GLFontRenderer::m_screenWidth=640; -int GLFontRenderer::m_screenHeight=480; -float GLFontRenderer::m_color[4]={1.0f, 1.0f, 1.0f, 1.0f}; - -bool GLFontRenderer::init() -{ - glGenTextures(1, &m_textureObject); - if(m_textureObject == 0) return false; - - glBindTexture(GL_TEXTURE_2D, m_textureObject); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - // expand to rgba - unsigned char* pNewSource = new unsigned char[OGL_FONT_TEXTURE_WIDTH*OGL_FONT_TEXTURE_HEIGHT*4]; - for(int i=0;i 0) - { - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, m_textureObject); - - - if(doOrthoProj) - { - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glOrtho(0, m_screenWidth, 0, m_screenHeight, -1, 1); - } - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - glEnable(GL_BLEND); - - glColor4f(m_color[0], m_color[1], m_color[2], m_color[3]); - - const float glyphHeightUV = ((float)OGL_FONT_CHARS_PER_COL)/OGL_FONT_TEXTURE_HEIGHT*2-0.01f; - - float translate = 0.0f; - - float* pVertList = new float[num*3*6]; - float* pTextureCoordList = new float[num*2*6]; - int vertIndex = 0; - int textureCoordIndex = 0; - - float translateDown = 0.0f; - unsigned int count = 0; - - for(unsigned int i=0;i +#include +#include +#include + +#include "GLFontData.h" +#include "GLFontRenderer.h" + +bool GLFontRenderer::m_isInit=false; +unsigned int GLFontRenderer::m_textureObject=0; +int GLFontRenderer::m_screenWidth=640; +int GLFontRenderer::m_screenHeight=480; +float GLFontRenderer::m_color[4]={1.0f, 1.0f, 1.0f, 1.0f}; + +bool GLFontRenderer::init() +{ + glGenTextures(1, &m_textureObject); + if(m_textureObject == 0) return false; + + glBindTexture(GL_TEXTURE_2D, m_textureObject); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + // expand to rgba + unsigned char* pNewSource = new unsigned char[OGL_FONT_TEXTURE_WIDTH*OGL_FONT_TEXTURE_HEIGHT*4]; + for(int i=0;i 0) + { + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, m_textureObject); + + + if(doOrthoProj) + { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, m_screenWidth, 0, m_screenHeight, -1, 1); + } + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glEnable(GL_BLEND); + + glColor4f(m_color[0], m_color[1], m_color[2], m_color[3]); + + const float glyphHeightUV = ((float)OGL_FONT_CHARS_PER_COL)/OGL_FONT_TEXTURE_HEIGHT*2-0.01f; + + float translate = 0.0f; + + float* pVertList = new float[num*3*6]; + float* pTextureCoordList = new float[num*2*6]; + int vertIndex = 0; + int textureCoordIndex = 0; + + float translateDown = 0.0f; + unsigned int count = 0; + + for(unsigned int i=0;i radius) - { - // moving away from object or too far away - return false; - } - - // find hit distance squared - float d = rd2 - (off2 - ray_dist * ray_dist); - if(d<0.0f) - { - // ray passes by sphere without hitting - return false; - } - - // get the distance along the ray - dist = ray_dist - sqrtf(d); - if(dist > length) - { - // hit point beyond length - return false; - } - - // sort out the details - hit_pos = origin + dir * dist; - return true; -} - -bool /*Ctc::*/RayAABB2(const Point& min, const Point& max, const Point& origin, const Point& dir, Point& coord) -{ - BOOL Inside = TRUE; - Point MaxT; - MaxT.x=MaxT.y=MaxT.z=-1.0f; - - // Find candidate planes. - for(udword i=0;i<3;i++) - { - if(origin[i] < min[i]) - { - coord[i] = min[i]; - Inside = FALSE; - - // Calculate T distances to candidate planes - if(IR(dir[i])) MaxT[i] = (min[i] - origin[i]) / dir[i]; - } - else if(origin[i] > max[i]) - { - coord[i] = max[i]; - Inside = FALSE; - - // Calculate T distances to candidate planes - if(IR(dir[i])) MaxT[i] = (max[i] - origin[i]) / dir[i]; - } - } - - // Ray origin inside bounding box - if(Inside) - { - coord = origin; - return true; - } - - // Get largest of the maxT's for final choice of intersection - udword WhichPlane = 0; - if(MaxT[1] > MaxT[WhichPlane]) WhichPlane = 1; - if(MaxT[2] > MaxT[WhichPlane]) WhichPlane = 2; - - // Check final candidate actually inside box - if(IR(MaxT[WhichPlane])&0x80000000) return false; - - for(udword i=0;i<3;i++) - { - if(i!=WhichPlane) - { - coord[i] = origin[i] + MaxT[WhichPlane] * dir[i]; -#ifdef RAYAABB_EPSILON - if(coord[i] < min[i] - RAYAABB_EPSILON || coord[i] > max[i] + RAYAABB_EPSILON) return false; -#else - if(coord[i] < min[i] || coord[i] > max[i]) return false; -#endif - } - } - return true; // ray hits box -} - -static const bool gNormalize = true; - -udword /*Ctc::*/RayCapsuleOverlap(const Point& origin, const Point& dir, const LSS& capsule, float s[2]) -{ - // set up quadratic Q(t) = a*t^2 + 2*b*t + c - Point kU, kV, kW, capsDir; - capsule.ComputeDirection(capsDir); - kW = capsDir; - - float fWLength = kW.Magnitude(); - kW.Normalize(); - - // generate orthonormal basis - - float fInvLength; - if ( fabsf(kW.x) >= fabsf(kW.y) ) - { - // W.x or W.z is the largest magnitude component, swap them - fInvLength = 1.0f/sqrtf(kW.x*kW.x + kW.z*kW.z); - kU.x = -kW.z*fInvLength; - kU.y = 0.0f; - kU.z = +kW.x*fInvLength; - } - else - { - // W.y or W.z is the largest magnitude component, swap them - fInvLength = 1.0f/sqrtf(kW.y*kW.y + kW.z*kW.z); - kU.x = 0.0f; - kU.y = +kW.z*fInvLength; - kU.z = -kW.y*fInvLength; - } - kV = kW^kU; -kU.Normalize(); - if(gNormalize) - kV.Normalize(); - - // compute intersection - - Point kD(kU|dir, kV|dir, kW|dir); - float fDLength = kD.Magnitude(); - kD.Normalize(); - - float fInvDLength = 1.0f/fDLength; - Point kDiff = origin - capsule.mP0; - Point kP(kU|kDiff, kV|kDiff, kW|kDiff); - float fRadiusSqr = capsule.mRadius*capsule.mRadius; - - float fInv, fA, fB, fC, fDiscr, fRoot, fT, fTmp; - - // Is the velocity parallel to the capsule direction? (or zero) - if ( fabsf(kD.z) >= 1.0f - FLT_EPSILON || fDLength < FLT_EPSILON ) - { - - float fAxisDir = dir|capsDir; - - fDiscr = fRadiusSqr - kP.x*kP.x - kP.y*kP.y; - if ( fAxisDir < 0 && fDiscr >= 0.0f ) - { - // Velocity anti-parallel to the capsule direction - fRoot = sqrtf(fDiscr); - s[0] = (kP.z + fRoot)*fInvDLength; - s[1] = -(fWLength - kP.z + fRoot)*fInvDLength; - return 2; - } - else if ( fAxisDir > 0 && fDiscr >= 0.0f ) - { - // Velocity parallel to the capsule direction - fRoot = sqrtf(fDiscr); - s[0] = -(kP.z + fRoot)*fInvDLength; - s[1] = (fWLength - kP.z + fRoot)*fInvDLength; - return 2; - } - else - { - // sphere heading wrong direction, or no velocity at all - return 0; - } - } - - // test intersection with infinite cylinder - fA = kD.x*kD.x + kD.y*kD.y; - fB = kP.x*kD.x + kP.y*kD.y; - fC = kP.x*kP.x + kP.y*kP.y - fRadiusSqr; - fDiscr = fB*fB - fA*fC; - if ( fDiscr < 0.0f ) - { - // line does not intersect infinite cylinder - return 0; - } - - int iQuantity = 0; - - if ( fDiscr > 0.0f ) - { - // line intersects infinite cylinder in two places - fRoot = sqrtf(fDiscr); - fInv = 1.0f/fA; - fT = (-fB - fRoot)*fInv; - fTmp = kP.z + fT*kD.z; - if ( 0.0f <= fTmp && fTmp <= fWLength ) - s[iQuantity++] = fT*fInvDLength; - - fT = (-fB + fRoot)*fInv; - fTmp = kP.z + fT*kD.z; - if ( 0.0f <= fTmp && fTmp <= fWLength ) - s[iQuantity++] = fT*fInvDLength; - - if ( iQuantity == 2 ) - { - // line intersects capsule wall in two places - return 2; - } - } - else - { - // line is tangent to infinite cylinder - fT = -fB/fA; - fTmp = kP.z + fT*kD.z; - if ( 0.0f <= fTmp && fTmp <= fWLength ) - { - s[0] = fT*fInvDLength; - return 1; - } - } - - // test intersection with bottom hemisphere - // fA = 1 - fB += kP.z*kD.z; - fC += kP.z*kP.z; - fDiscr = fB*fB - fC; - if ( fDiscr > 0.0f ) - { - fRoot = sqrtf(fDiscr); - fT = -fB - fRoot; - fTmp = kP.z + fT*kD.z; - if ( fTmp <= 0.0f ) - { - s[iQuantity++] = fT*fInvDLength; - if ( iQuantity == 2 ) - return 2; - } - - fT = -fB + fRoot; - fTmp = kP.z + fT*kD.z; - if ( fTmp <= 0.0f ) - { - s[iQuantity++] = fT*fInvDLength; - if ( iQuantity == 2 ) - return 2; - } - } - else if ( fDiscr == 0.0f ) - { - fT = -fB; - fTmp = kP.z + fT*kD.z; - if ( fTmp <= 0.0f ) - { - s[iQuantity++] = fT*fInvDLength; - if ( iQuantity == 2 ) - return 2; - } - } - - // test intersection with top hemisphere - // fA = 1 - fB -= kD.z*fWLength; - fC += fWLength*(fWLength - 2.0f*kP.z); - - fDiscr = fB*fB - fC; - if ( fDiscr > 0.0f ) - { - fRoot = sqrtf(fDiscr); - fT = -fB - fRoot; - fTmp = kP.z + fT*kD.z; - if ( fTmp >= fWLength ) - { - s[iQuantity++] = fT*fInvDLength; - if ( iQuantity == 2 ) - return 2; - } - - fT = -fB + fRoot; - fTmp = kP.z + fT*kD.z; - if ( fTmp >= fWLength ) - { - s[iQuantity++] = fT*fInvDLength; - if ( iQuantity == 2 ) - return 2; - } - } - else if ( fDiscr == 0.0f ) - { - fT = -fB; - fTmp = kP.z + fT*kD.z; - if ( fTmp >= fWLength ) - { - s[iQuantity++] = fT*fInvDLength; - if ( iQuantity == 2 ) - return 2; - } - } - - return iQuantity; -} - +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "IceHelpers.h" + +// Misc functions borrowed & adapted from ICE + +void RotX(Matrix3x3& m, float angle) +{ + float Cos = cosf(angle); + float Sin = sinf(angle); + m.Identity(); + m.m[1][1] = m.m[2][2] = Cos; + m.m[2][1] = -Sin; + m.m[1][2] = Sin; +} + +void RotY(Matrix3x3& m, float angle) +{ + float Cos = cosf(angle); + float Sin = sinf(angle); + m.Identity(); + m.m[0][0] = m.m[2][2] = Cos; + m.m[2][0] = Sin; + m.m[0][2] = -Sin; +} + +void RotZ(Matrix3x3& m, float angle) +{ + float Cos = cosf(angle); + float Sin = sinf(angle); + m.Identity(); + m.m[0][0] = m.m[1][1] = Cos; + m.m[1][0] = -Sin; + m.m[0][1] = Sin; +} + +bool SegmentSphere(const Point& origin, const Point& dir, float length, const Point& center, float radius, float& dist, Point& hit_pos) +{ + // get the offset vector + Point offset = center - origin; + + // get the distance along the ray to the center point of the sphere + float ray_dist = dir | offset; + + // get the squared distances + float off2 = offset | offset; + float rd2 = radius * radius; + if(off2 <= rd2) + { + // we're in the sphere + hit_pos = origin; + dist = 0.0f; + return true; + } + + if(ray_dist <= 0 || (ray_dist - length) > radius) + { + // moving away from object or too far away + return false; + } + + // find hit distance squared + float d = rd2 - (off2 - ray_dist * ray_dist); + if(d<0.0f) + { + // ray passes by sphere without hitting + return false; + } + + // get the distance along the ray + dist = ray_dist - sqrtf(d); + if(dist > length) + { + // hit point beyond length + return false; + } + + // sort out the details + hit_pos = origin + dir * dist; + return true; +} + +bool /*Ctc::*/RayAABB2(const Point& min, const Point& max, const Point& origin, const Point& dir, Point& coord) +{ + BOOL Inside = TRUE; + Point MaxT; + MaxT.x=MaxT.y=MaxT.z=-1.0f; + + // Find candidate planes. + for(udword i=0;i<3;i++) + { + if(origin[i] < min[i]) + { + coord[i] = min[i]; + Inside = FALSE; + + // Calculate T distances to candidate planes + if(IR(dir[i])) MaxT[i] = (min[i] - origin[i]) / dir[i]; + } + else if(origin[i] > max[i]) + { + coord[i] = max[i]; + Inside = FALSE; + + // Calculate T distances to candidate planes + if(IR(dir[i])) MaxT[i] = (max[i] - origin[i]) / dir[i]; + } + } + + // Ray origin inside bounding box + if(Inside) + { + coord = origin; + return true; + } + + // Get largest of the maxT's for final choice of intersection + udword WhichPlane = 0; + if(MaxT[1] > MaxT[WhichPlane]) WhichPlane = 1; + if(MaxT[2] > MaxT[WhichPlane]) WhichPlane = 2; + + // Check final candidate actually inside box + if(IR(MaxT[WhichPlane])&0x80000000) return false; + + for(udword i=0;i<3;i++) + { + if(i!=WhichPlane) + { + coord[i] = origin[i] + MaxT[WhichPlane] * dir[i]; +#ifdef RAYAABB_EPSILON + if(coord[i] < min[i] - RAYAABB_EPSILON || coord[i] > max[i] + RAYAABB_EPSILON) return false; +#else + if(coord[i] < min[i] || coord[i] > max[i]) return false; +#endif + } + } + return true; // ray hits box +} + +static const bool gNormalize = true; + +udword /*Ctc::*/RayCapsuleOverlap(const Point& origin, const Point& dir, const LSS& capsule, float s[2]) +{ + // set up quadratic Q(t) = a*t^2 + 2*b*t + c + Point kU, kV, kW, capsDir; + capsule.ComputeDirection(capsDir); + kW = capsDir; + + float fWLength = kW.Magnitude(); + kW.Normalize(); + + // generate orthonormal basis + + float fInvLength; + if ( fabsf(kW.x) >= fabsf(kW.y) ) + { + // W.x or W.z is the largest magnitude component, swap them + fInvLength = 1.0f/sqrtf(kW.x*kW.x + kW.z*kW.z); + kU.x = -kW.z*fInvLength; + kU.y = 0.0f; + kU.z = +kW.x*fInvLength; + } + else + { + // W.y or W.z is the largest magnitude component, swap them + fInvLength = 1.0f/sqrtf(kW.y*kW.y + kW.z*kW.z); + kU.x = 0.0f; + kU.y = +kW.z*fInvLength; + kU.z = -kW.y*fInvLength; + } + kV = kW^kU; +kU.Normalize(); + if(gNormalize) + kV.Normalize(); + + // compute intersection + + Point kD(kU|dir, kV|dir, kW|dir); + float fDLength = kD.Magnitude(); + kD.Normalize(); + + float fInvDLength = 1.0f/fDLength; + Point kDiff = origin - capsule.mP0; + Point kP(kU|kDiff, kV|kDiff, kW|kDiff); + float fRadiusSqr = capsule.mRadius*capsule.mRadius; + + float fInv, fA, fB, fC, fDiscr, fRoot, fT, fTmp; + + // Is the velocity parallel to the capsule direction? (or zero) + if ( fabsf(kD.z) >= 1.0f - FLT_EPSILON || fDLength < FLT_EPSILON ) + { + + float fAxisDir = dir|capsDir; + + fDiscr = fRadiusSqr - kP.x*kP.x - kP.y*kP.y; + if ( fAxisDir < 0 && fDiscr >= 0.0f ) + { + // Velocity anti-parallel to the capsule direction + fRoot = sqrtf(fDiscr); + s[0] = (kP.z + fRoot)*fInvDLength; + s[1] = -(fWLength - kP.z + fRoot)*fInvDLength; + return 2; + } + else if ( fAxisDir > 0 && fDiscr >= 0.0f ) + { + // Velocity parallel to the capsule direction + fRoot = sqrtf(fDiscr); + s[0] = -(kP.z + fRoot)*fInvDLength; + s[1] = (fWLength - kP.z + fRoot)*fInvDLength; + return 2; + } + else + { + // sphere heading wrong direction, or no velocity at all + return 0; + } + } + + // test intersection with infinite cylinder + fA = kD.x*kD.x + kD.y*kD.y; + fB = kP.x*kD.x + kP.y*kD.y; + fC = kP.x*kP.x + kP.y*kP.y - fRadiusSqr; + fDiscr = fB*fB - fA*fC; + if ( fDiscr < 0.0f ) + { + // line does not intersect infinite cylinder + return 0; + } + + int iQuantity = 0; + + if ( fDiscr > 0.0f ) + { + // line intersects infinite cylinder in two places + fRoot = sqrtf(fDiscr); + fInv = 1.0f/fA; + fT = (-fB - fRoot)*fInv; + fTmp = kP.z + fT*kD.z; + if ( 0.0f <= fTmp && fTmp <= fWLength ) + s[iQuantity++] = fT*fInvDLength; + + fT = (-fB + fRoot)*fInv; + fTmp = kP.z + fT*kD.z; + if ( 0.0f <= fTmp && fTmp <= fWLength ) + s[iQuantity++] = fT*fInvDLength; + + if ( iQuantity == 2 ) + { + // line intersects capsule wall in two places + return 2; + } + } + else + { + // line is tangent to infinite cylinder + fT = -fB/fA; + fTmp = kP.z + fT*kD.z; + if ( 0.0f <= fTmp && fTmp <= fWLength ) + { + s[0] = fT*fInvDLength; + return 1; + } + } + + // test intersection with bottom hemisphere + // fA = 1 + fB += kP.z*kD.z; + fC += kP.z*kP.z; + fDiscr = fB*fB - fC; + if ( fDiscr > 0.0f ) + { + fRoot = sqrtf(fDiscr); + fT = -fB - fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp <= 0.0f ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + + fT = -fB + fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp <= 0.0f ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + else if ( fDiscr == 0.0f ) + { + fT = -fB; + fTmp = kP.z + fT*kD.z; + if ( fTmp <= 0.0f ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + + // test intersection with top hemisphere + // fA = 1 + fB -= kD.z*fWLength; + fC += fWLength*(fWLength - 2.0f*kP.z); + + fDiscr = fB*fB - fC; + if ( fDiscr > 0.0f ) + { + fRoot = sqrtf(fDiscr); + fT = -fB - fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp >= fWLength ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + + fT = -fB + fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp >= fWLength ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + else if ( fDiscr == 0.0f ) + { + fT = -fB; + fTmp = kP.z + fT*kD.z; + if ( fTmp >= fWLength ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + + return iQuantity; +} + diff --git a/Extras/CDTestFramework/IceHelpers.h b/Extras/CDTestFramework/IceHelpers.h index 5d3a045c5..0d260d508 100644 --- a/Extras/CDTestFramework/IceHelpers.h +++ b/Extras/CDTestFramework/IceHelpers.h @@ -1,41 +1,41 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 ICEHELPERS_H -#define ICEHELPERS_H - - void RotX(Matrix3x3& m, float angle); - void RotY(Matrix3x3& m, float angle); - void RotZ(Matrix3x3& m, float angle); - - udword RayCapsuleOverlap(const Point& origin, const Point& dir, const LSS& capsule, float s[2]); - bool SegmentSphere(const Point& origin, const Point& dir, float length, const Point& center, float radius, float& dist, Point& hit_pos); - bool RayAABB2(const Point& min, const Point& max, const Point& origin, const Point& dir, Point& coord); - - inline_ bool RayOBB(const Point& origin, const Point& dir, const OBB& box, float& dist, Point& hit_pos) - { - Point LocalOrigin = box.mRot * (origin - box.mCenter); - Point LocalDir = box.mRot * dir; - - Point LocalImpact; - if(RayAABB2(-box.mExtents, box.mExtents, LocalOrigin, LocalDir, LocalImpact)) - { - dist = LocalImpact.Distance(LocalOrigin); - hit_pos = LocalImpact * box.mRot + box.mCenter; - return true; - } - return false; - } - -#endif // ICEHELPERS_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 ICEHELPERS_H +#define ICEHELPERS_H + + void RotX(Matrix3x3& m, float angle); + void RotY(Matrix3x3& m, float angle); + void RotZ(Matrix3x3& m, float angle); + + udword RayCapsuleOverlap(const Point& origin, const Point& dir, const LSS& capsule, float s[2]); + bool SegmentSphere(const Point& origin, const Point& dir, float length, const Point& center, float radius, float& dist, Point& hit_pos); + bool RayAABB2(const Point& min, const Point& max, const Point& origin, const Point& dir, Point& coord); + + inline_ bool RayOBB(const Point& origin, const Point& dir, const OBB& box, float& dist, Point& hit_pos) + { + Point LocalOrigin = box.mRot * (origin - box.mCenter); + Point LocalDir = box.mRot * dir; + + Point LocalImpact; + if(RayAABB2(-box.mExtents, box.mExtents, LocalOrigin, LocalDir, LocalImpact)) + { + dist = LocalImpact.Distance(LocalOrigin); + hit_pos = LocalImpact * box.mRot + box.mCenter; + return true; + } + return false; + } + +#endif // ICEHELPERS_H diff --git a/Extras/CDTestFramework/License.txt b/Extras/CDTestFramework/License.txt index 88943db89..290add700 100644 --- a/Extras/CDTestFramework/License.txt +++ b/Extras/CDTestFramework/License.txt @@ -1,49 +1,49 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////// -//CDTestFramework re-distributed under the ZLib license with permission of Pierre Terdiman -//////////////////////////////////////////////////////////////////////////////////////////////// - -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -//////////////////////////////////////////////////////////////////////////////////////////////// -DbvtTest.* and btDbvt.* are distributed under the ZLIb license, Copyright Nathanael Presson -//////////////////////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////////////////////// -BulletSAPCompleteBoxPruningTest.* distributed under the ZLib license, Copyright Erwin Coumans -//////////////////////////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////////////////////////// -//ICE and OPCODE 1.3 re-distributed under the ZLib license with permission of Pierre Terdiman -//////////////////////////////////////////////////////////////////////////////////////////////// - -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. + +//////////////////////////////////////////////////////////////////////////////////////////////// +//CDTestFramework re-distributed under the ZLib license with permission of Pierre Terdiman +//////////////////////////////////////////////////////////////////////////////////////////////// + +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +//////////////////////////////////////////////////////////////////////////////////////////////// +DbvtTest.* and btDbvt.* are distributed under the ZLIb license, Copyright Nathanael Presson +//////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////// +BulletSAPCompleteBoxPruningTest.* distributed under the ZLib license, Copyright Erwin Coumans +//////////////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////////////// +//ICE and OPCODE 1.3 re-distributed under the ZLib license with permission of Pierre Terdiman +//////////////////////////////////////////////////////////////////////////////////////////////// + +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. */ \ No newline at end of file diff --git a/Extras/CDTestFramework/OBBMeshQuery.cpp b/Extras/CDTestFramework/OBBMeshQuery.cpp index 1821ec5ce..2bf7371d0 100644 --- a/Extras/CDTestFramework/OBBMeshQuery.cpp +++ b/Extras/CDTestFramework/OBBMeshQuery.cpp @@ -1,157 +1,157 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "OBBMeshQuery.h" -#include "Terrain.h" -#include "IceHelpers.h" -#include "RenderingHelpers.h" -#include "Camera.h" -#include "GLFontRenderer.h" - -OBBMeshQuery::OBBMeshQuery() : - mBar (null), - mAngleX (0.0f), - mAngleY (0.0f), - mAngleZ (0.0f), - mDist (0.0f), - mValidHit (false) -{ -} - -OBBMeshQuery::~OBBMeshQuery() -{ -} - -void OBBMeshQuery::Init() -{ - mBox.mCenter = Point(0.0f, 0.0f, 0.0f); - mBox.mExtents = Point(1.0f, 1.0f, 1.0f); - mBox.mRot.Identity(); -} - -void OBBMeshQuery::Release() -{ - Deselect(); -} - -void OBBMeshQuery::Select() -{ - // Create a tweak bar - { - mBar = TwNewBar("OBBMeshQuery"); - TwAddVarRW(mBar, "Extents.x", TW_TYPE_FLOAT, &mBox.mExtents.x, " min=0.01 max=200.0 step=0.05 group='Extents' "); - TwAddVarRW(mBar, "Extents.y", TW_TYPE_FLOAT, &mBox.mExtents.y, " min=0.01 max=200.0 step=0.05 group='Extents' "); - TwAddVarRW(mBar, "Extents.z", TW_TYPE_FLOAT, &mBox.mExtents.z, " min=0.01 max=200.0 step=0.05 group='Extents' "); - TwAddVarRW(mBar, "Rot.x", TW_TYPE_FLOAT, &mAngleX, " min=0.0 max=6.28 step=0.01 group='Rotation' "); - TwAddVarRW(mBar, "Rot.y", TW_TYPE_FLOAT, &mAngleY, " min=0.0 max=6.28 step=0.01 group='Rotation' "); - TwAddVarRW(mBar, "Rot.z", TW_TYPE_FLOAT, &mAngleZ, " min=0.0 max=6.28 step=0.01 group='Rotation' "); - - mSettings.AddToTweakBar(mBar); - -// mProfiler.AddToTweakBar(mBar); - } -} - -void OBBMeshQuery::Deselect() -{ - if(mBar) - { - TwDeleteBar(mBar); - mBar = null; - } -} - -void OBBMeshQuery::PerformTest() -{ - RenderTerrain(); - - Matrix3x3 MX,MY,MZ; - RotX(MX, mAngleX); - RotY(MY, mAngleY); - RotY(MZ, mAngleZ); - mBox.mRot = MX * MY * MZ; - - DrawOBB(mBox); - - const Model* TM = GetTerrainModel(); - if(TM) - { - OBBCollider Collider; - mSettings.SetupCollider(Collider); - - mProfiler.Start(); - bool Status = Collider.Collide(mCache, mBox, *TM, null, null); - mProfiler.End(); - mProfiler.Accum(); - - if(Status) - { - if(Collider.GetContactStatus()) - { - udword NbTris = Collider.GetNbTouchedPrimitives(); - const udword* Indices = Collider.GetTouchedPrimitives(); - - RenderTerrainTriangles(NbTris, Indices); - } - } - } - - // Raycast hit - if(mValidHit) - { - Point wp = mLocalHit + mBox.mCenter; - DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); - DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); - DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); - } - - char Buffer[4096]; - sprintf(Buffer, "OBB-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); - GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); -} - -void OBBMeshQuery::KeyboardCallback(unsigned char key, int x, int y) -{ -} - -void OBBMeshQuery::MouseCallback(int button, int state, int x, int y) -{ - mValidHit = false; - if(!button && !state) - { - Point Dir = ComputeWorldRay(x, y); - - float d; - Point hit; - if(RayOBB(GetCameraPos(), Dir, mBox, d, hit)) - { - mValidHit = true; - mDist = d; - mLocalHit = hit - mBox.mCenter; - } - } -} - -void OBBMeshQuery::MotionCallback(int x, int y) -{ - if(mValidHit) - { - Point Dir = ComputeWorldRay(x, y); - mBox.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; - } -} - - +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "OBBMeshQuery.h" +#include "Terrain.h" +#include "IceHelpers.h" +#include "RenderingHelpers.h" +#include "Camera.h" +#include "GLFontRenderer.h" + +OBBMeshQuery::OBBMeshQuery() : + mBar (null), + mAngleX (0.0f), + mAngleY (0.0f), + mAngleZ (0.0f), + mDist (0.0f), + mValidHit (false) +{ +} + +OBBMeshQuery::~OBBMeshQuery() +{ +} + +void OBBMeshQuery::Init() +{ + mBox.mCenter = Point(0.0f, 0.0f, 0.0f); + mBox.mExtents = Point(1.0f, 1.0f, 1.0f); + mBox.mRot.Identity(); +} + +void OBBMeshQuery::Release() +{ + Deselect(); +} + +void OBBMeshQuery::Select() +{ + // Create a tweak bar + { + mBar = TwNewBar("OBBMeshQuery"); + TwAddVarRW(mBar, "Extents.x", TW_TYPE_FLOAT, &mBox.mExtents.x, " min=0.01 max=200.0 step=0.05 group='Extents' "); + TwAddVarRW(mBar, "Extents.y", TW_TYPE_FLOAT, &mBox.mExtents.y, " min=0.01 max=200.0 step=0.05 group='Extents' "); + TwAddVarRW(mBar, "Extents.z", TW_TYPE_FLOAT, &mBox.mExtents.z, " min=0.01 max=200.0 step=0.05 group='Extents' "); + TwAddVarRW(mBar, "Rot.x", TW_TYPE_FLOAT, &mAngleX, " min=0.0 max=6.28 step=0.01 group='Rotation' "); + TwAddVarRW(mBar, "Rot.y", TW_TYPE_FLOAT, &mAngleY, " min=0.0 max=6.28 step=0.01 group='Rotation' "); + TwAddVarRW(mBar, "Rot.z", TW_TYPE_FLOAT, &mAngleZ, " min=0.0 max=6.28 step=0.01 group='Rotation' "); + + mSettings.AddToTweakBar(mBar); + +// mProfiler.AddToTweakBar(mBar); + } +} + +void OBBMeshQuery::Deselect() +{ + if(mBar) + { + TwDeleteBar(mBar); + mBar = null; + } +} + +void OBBMeshQuery::PerformTest() +{ + RenderTerrain(); + + Matrix3x3 MX,MY,MZ; + RotX(MX, mAngleX); + RotY(MY, mAngleY); + RotY(MZ, mAngleZ); + mBox.mRot = MX * MY * MZ; + + DrawOBB(mBox); + + const Model* TM = GetTerrainModel(); + if(TM) + { + OBBCollider Collider; + mSettings.SetupCollider(Collider); + + mProfiler.Start(); + bool Status = Collider.Collide(mCache, mBox, *TM, null, null); + mProfiler.End(); + mProfiler.Accum(); + + if(Status) + { + if(Collider.GetContactStatus()) + { + udword NbTris = Collider.GetNbTouchedPrimitives(); + const udword* Indices = Collider.GetTouchedPrimitives(); + + RenderTerrainTriangles(NbTris, Indices); + } + } + } + + // Raycast hit + if(mValidHit) + { + Point wp = mLocalHit + mBox.mCenter; + DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); + } + + char Buffer[4096]; + sprintf(Buffer, "OBB-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +void OBBMeshQuery::KeyboardCallback(unsigned char key, int x, int y) +{ +} + +void OBBMeshQuery::MouseCallback(int button, int state, int x, int y) +{ + mValidHit = false; + if(!button && !state) + { + Point Dir = ComputeWorldRay(x, y); + + float d; + Point hit; + if(RayOBB(GetCameraPos(), Dir, mBox, d, hit)) + { + mValidHit = true; + mDist = d; + mLocalHit = hit - mBox.mCenter; + } + } +} + +void OBBMeshQuery::MotionCallback(int x, int y) +{ + if(mValidHit) + { + Point Dir = ComputeWorldRay(x, y); + mBox.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; + } +} + + diff --git a/Extras/CDTestFramework/OBBMeshQuery.h b/Extras/CDTestFramework/OBBMeshQuery.h index 61f79f984..e274691db 100644 --- a/Extras/CDTestFramework/OBBMeshQuery.h +++ b/Extras/CDTestFramework/OBBMeshQuery.h @@ -1,53 +1,53 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 OBBMESHQUERY_H -#define OBBMESHQUERY_H - -#include "CollisionTest.h" -#include "Profiling.h" - - class OBBMeshQuery : public CollisionTest - { - public: - OBBMeshQuery(); - virtual ~OBBMeshQuery(); - - virtual void Init(); - virtual void Release(); - virtual void PerformTest(); - virtual void Select(); - virtual void Deselect(); - virtual void KeyboardCallback(unsigned char key, int x, int y); - virtual void MouseCallback(int button, int state, int x, int y); - virtual void MotionCallback(int x, int y); - - TwBar* mBar; //!< AntTweakBar - OBB mBox; - - float mAngleX; - float mAngleY; - float mAngleZ; - - OBBCache mCache; - OpcodeSettings mSettings; - Profiler mProfiler; - - float mDist; - Point mLocalHit; - bool mValidHit; - }; - -#endif // OBBMESHQUERY_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 OBBMESHQUERY_H +#define OBBMESHQUERY_H + +#include "CollisionTest.h" +#include "Profiling.h" + + class OBBMeshQuery : public CollisionTest + { + public: + OBBMeshQuery(); + virtual ~OBBMeshQuery(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + virtual void Select(); + virtual void Deselect(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + OBB mBox; + + float mAngleX; + float mAngleY; + float mAngleZ; + + OBBCache mCache; + OpcodeSettings mSettings; + Profiler mProfiler; + + float mDist; + Point mLocalHit; + bool mValidHit; + }; + +#endif // OBBMESHQUERY_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp b/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp index a8c0b8d0e..7ea20f2e7 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp @@ -1,422 +1,422 @@ -/* - * ICE OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains AABB-related code. - * \file IceAABB.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * AABB class. - * \class AABB - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the sum of two AABBs. - * \param aabb [in] the other AABB - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABB& AABB::Add(const AABB& aabb) -{ - // Compute new min & max values - Point Min; GetMin(Min); - Point Tmp; aabb.GetMin(Tmp); - Min.Min(Tmp); - - Point Max; GetMax(Max); - aabb.GetMax(Tmp); - Max.Max(Tmp); - - // Update this - SetMinMax(Min, Max); - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Makes a cube from the AABB. - * \param cube [out] the cube AABB - * \return cube edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float AABB::MakeCube(AABB& cube) const -{ - Point Ext; GetExtents(Ext); - float Max = Ext.Max(); - - Point Cnt; GetCenter(Cnt); - cube.SetCenterExtents(Cnt, Point(Max, Max, Max)); - return Max; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Makes a sphere from the AABB. - * \param sphere [out] sphere containing the AABB - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABB::MakeSphere(Sphere& sphere) const -{ - GetExtents(sphere.mCenter); - sphere.mRadius = sphere.mCenter.Magnitude() * 1.00001f; // To make sure sphere::Contains(*this) succeeds - GetCenter(sphere.mCenter); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks a box is inside another box. - * \param box [in] the other AABB - * \return true if current box is inside input box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABB::IsInside(const AABB& box) const -{ - if(box.GetMin(0)>GetMin(0)) return false; - if(box.GetMin(1)>GetMin(1)) return false; - if(box.GetMin(2)>GetMin(2)) return false; - if(box.GetMax(0) max.x) ? 2 : 0) // 2 = right - + ((local_eye.y < min.y) ? 4 : 0) // 4 = bottom - + ((local_eye.y > max.y) ? 8 : 0) // 8 = top - + ((local_eye.z < min.z) ? 16 : 0) // 16 = front - + ((local_eye.z > max.z) ? 32 : 0); // 32 = back - - // Look up number of vertices in outline - num = (sdword)gIndexList[pos][7]; - // Zero indicates invalid case - if(!num) return null; - - return &gIndexList[pos][0]; -} - -// calculateBoxArea: computes the screen-projected 2D area of an oriented 3D bounding box - -//const Point& eye, //eye point (in bbox object coordinates) -//const AABB& box, //3d bbox -//const Matrix4x4& mat, //free transformation for bbox -//float width, float height, int& num) -float AABB::ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const -{ - const sbyte* Outline = ComputeOutline(eye, num); - if(!Outline) return -1.0f; - - // Compute box vertices - Point vertexBox[8], dst[8]; - ComputePoints(vertexBox); - - // Transform all outline corners into 2D screen space - for(sdword i=0;iGetMin(0)) return false; + if(box.GetMin(1)>GetMin(1)) return false; + if(box.GetMin(2)>GetMin(2)) return false; + if(box.GetMax(0) max.x) ? 2 : 0) // 2 = right + + ((local_eye.y < min.y) ? 4 : 0) // 4 = bottom + + ((local_eye.y > max.y) ? 8 : 0) // 8 = top + + ((local_eye.z < min.z) ? 16 : 0) // 16 = front + + ((local_eye.z > max.z) ? 32 : 0); // 32 = back + + // Look up number of vertices in outline + num = (sdword)gIndexList[pos][7]; + // Zero indicates invalid case + if(!num) return null; + + return &gIndexList[pos][0]; +} + +// calculateBoxArea: computes the screen-projected 2D area of an oriented 3D bounding box + +//const Point& eye, //eye point (in bbox object coordinates) +//const AABB& box, //3d bbox +//const Matrix4x4& mat, //free transformation for bbox +//float width, float height, int& num) +float AABB::ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const +{ + const sbyte* Outline = ComputeOutline(eye, num); + if(!Outline) return -1.0f; + + // Compute box vertices + Point vertexBox[8], dst[8]; + ComputePoints(vertexBox); + + // Transform all outline corners into 2D screen space + for(sdword i=0;i max.x) max.x = p.x; - if(p.x < min.x) min.x = p.x; - - if(p.y > max.y) max.y = p.y; - if(p.y < min.y) min.y = p.y; - - if(p.z > max.z) max.z = p.z; - if(p.z < min.z) min.z = p.z; - } - - // Forward declarations - class Sphere; - -//! Declarations of type-independent methods (most of them implemented in the .cpp) -#define AABB_COMMON_METHODS \ - AABB& Add(const AABB& aabb); \ - AABB& Sub(const AABB& aabb); \ - float MakeCube(AABB& cube) const; \ - void MakeSphere(Sphere& sphere) const; \ - const sbyte* ComputeOutline(const Point& local_eye, sdword& num) const; \ - float ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const; \ - bool IsInside(const AABB& box) const; \ - bool ComputePlanes(Plane* planes) const; \ - bool ComputePoints(Point* pts) const; \ - const Point* GetVertexNormals() const; \ - const udword* GetEdges() const; \ - const Point* GetEdgeNormals() const; \ - inline_ BOOL ContainsPoint(const Point& p) const \ - { \ - if(p.x > GetMax(0) || p.x < GetMin(0)) return FALSE; \ - if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ - if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ - return TRUE; \ - } - - enum AABBType - { - AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. - AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. - - AABB_FORCE_DWORD = 0x7fffffff, - }; - -#ifdef USE_MINMAX - - struct ICEMATHS_API ShadowAABB - { - Point mMin; - Point mMax; - }; - - class ICEMATHS_API AABB : public Allocateable - { - public: - //! Constructor - inline_ AABB() {} - //! Destructor - inline_ ~AABB() {} - - //! Type-independent methods - AABB_COMMON_METHODS; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from center & extents vectors. - * \param c [in] the center point - * \param e [in] the extents vector - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups a point AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetPoint(const Point& pt) { mMin = mMax = pt; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the size of the AABB. The size is defined as the longest extent. - * \return the size of the AABB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - float GetSize() const { Point e; GetExtents(e); return e.Max(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Extends the AABB. - * \param p [in] the next point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Extend(const Point& p) { ComputeMinMax(p, mMin, mMax); } - - // Data access - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mMin; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mMax; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mMin[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mMax[axis]; } - - //! Get box center - inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } - //! Get box extents - inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } - - //! Get component of the box's center along a given axis - inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } - //! Get component of the box's extents along a given axis - inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } - - //! Get box diagonal - inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } - inline_ float GetWidth() const { return mMax.x - mMin.x; } - inline_ float GetHeight() const { return mMax.y - mMin.y; } - inline_ float GetDepth() const { return mMax.z - mMin.z; } - - //! Volume - inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the intersection between two AABBs. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a) const - { - if(mMax.x < a.mMin.x - || a.mMax.x < mMin.x - || mMax.y < a.mMin.y - || a.mMax.y < mMin.y - || mMax.z < a.mMin.z - || a.mMax.z < mMin.z) return FALSE; - - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the 1D-intersection between two AABBs, on a given axis. - * \param a [in] the other AABB - * \param axis [in] the axis (0, 1, 2) - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a, udword axis) const - { - if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. - * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) - * \param mtx [in] the transform matrix - * \param aabb [out] the transformed AABB [can be *this] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const - { - // The three edges transformed: you can efficiently transform an X-only vector - // by just getting the "X" column of the matrix - Point vx,vy,vz; - mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); - mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); - mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); - - // Transform the min point - aabb.mMin = aabb.mMax = mMin * mtx; - - // Take the transformed min & axes and find new extents - // Using CPU code in the right place is faster... - if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; - if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; - if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; - if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; - if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; - if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; - if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; - if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; - if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the AABB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Min, Max) boxes: min < max - if(mMin.x > mMax.x) return FALSE; - if(mMin.y > mMax.y) return FALSE; - if(mMin.z > mMax.z) return FALSE; - return TRUE; - } - - //! Operator for AABB *= float. Scales the extents, keeps same center. - inline_ AABB& operator*=(float s) - { - Point Center; GetCenter(Center); - Point Extents; GetExtents(Extents); - SetCenterExtents(Center, Extents * s); - return *this; - } - - //! Operator for AABB /= float. Scales the extents, keeps same center. - inline_ AABB& operator/=(float s) - { - Point Center; GetCenter(Center); - Point Extents; GetExtents(Extents); - SetCenterExtents(Center, Extents / s); - return *this; - } - - //! Operator for AABB += Point. Translates the box. - inline_ AABB& operator+=(const Point& trans) - { - mMin+=trans; - mMax+=trans; - return *this; - } - private: - Point mMin; //!< Min point - Point mMax; //!< Max point - }; - -#else - - class ICEMATHS_API AABB - { - public: - //! Constructor - inline_ AABB() {} - //! Destructor - inline_ ~AABB() {} - - //! Type-independent methods - AABB_COMMON_METHODS; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from center & extents vectors. - * \param c [in] the center point - * \param e [in] the extents vector - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups a point AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the size of the AABB. The size is defined as the longest extent. - * \return the size of the AABB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - float GetSize() const { return mExtents.Max(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Extends the AABB. - * \param p [in] the next point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Extend(const Point& p) - { - Point Max = mCenter + mExtents; - Point Min = mCenter - mExtents; - - if(p.x > Max.x) Max.x = p.x; - if(p.x < Min.x) Min.x = p.x; - - if(p.y > Max.y) Max.y = p.y; - if(p.y < Min.y) Min.y = p.y; - - if(p.z > Max.z) Max.z = p.z; - if(p.z < Min.z) Min.z = p.z; - - SetMinMax(Min, Max); - } - // Data access - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } - - //! Get box center - inline_ void GetCenter(Point& center) const { center = mCenter; } - //! Get box extents - inline_ void GetExtents(Point& extents) const { extents = mExtents; } - - //! Get component of the box's center along a given axis - inline_ float GetCenter(udword axis) const { return mCenter[axis]; } - //! Get component of the box's extents along a given axis - inline_ float GetExtents(udword axis) const { return mExtents[axis]; } - - //! Get box diagonal - inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } - inline_ float GetWidth() const { return mExtents.x * 2.0f; } - inline_ float GetHeight() const { return mExtents.y * 2.0f; } - inline_ float GetDepth() const { return mExtents.z * 2.0f; } - - //! Volume - inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the intersection between two AABBs. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a) const - { - float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; - float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; - float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * The standard intersection method from Gamasutra. Just here to check its speed against the one above. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool GomezIntersect(const AABB& a) - { - Point T = mCenter - a.mCenter; // Vector from A to B - return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) - && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) - && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the 1D-intersection between two AABBs, on a given axis. - * \param a [in] the other AABB - * \param axis [in] the axis (0, 1, 2) - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a, udword axis) const - { - float t = mCenter[axis] - a.mCenter[axis]; - float e = a.mExtents[axis] + mExtents[axis]; - if(AIR(t) > IR(e)) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. - * \param mtx [in] the transform matrix - * \param aabb [out] the transformed AABB [can be *this] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const - { - // Compute new center - aabb.mCenter = mCenter * mtx; - - // Compute new extents. FPU code & CPU code have been interleaved for improved performance. - Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); - IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; - - Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); - IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; - - Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); - IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; - - aabb.mExtents.x = Ex.x + Ey.x + Ez.x; - aabb.mExtents.y = Ex.y + Ey.y + Ez.y; - aabb.mExtents.z = Ex.z + Ey.z + Ez.z; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the AABB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Center, Extents) boxes: Extents >= 0 - if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; - if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; - if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; - return TRUE; - } - - //! Operator for AABB *= float. Scales the extents, keeps same center. - inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } - - //! Operator for AABB /= float. Scales the extents, keeps same center. - inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } - - //! Operator for AABB += Point. Translates the box. - inline_ AABB& operator+=(const Point& trans) - { - mCenter+=trans; - return *this; - } - private: - Point mCenter; //!< AABB Center - Point mExtents; //!< x, y and z extents - }; - -#endif - - //! Computes the AABB around a set of vertices - inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) - { - if(list) - { - Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); - Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); - while(nb_pts--) - { -// _prefetch(list+1); // off by one ? - ComputeMinMax(*list++, Mini, Maxi); - } - aabb.SetMinMax(Mini, Maxi); - } - } - - //! Computes the AABB around a set of vertices after transform by a matrix - inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts, const Matrix4x4& world) - { - if(list) - { - Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); - Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); - while(nb_pts--) - { -// _prefetch(list+1); // off by one ? - ComputeMinMax((*list++)*world, Mini, Maxi); - } - aabb.SetMinMax(Mini, Maxi); - } - } - -#endif // ICEAABB_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains AABB-related code. (axis-aligned bounding box) + * \file IceAABB.h + * \author Pierre Terdiman + * \date January, 13, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEAABB_H +#define ICEAABB_H + + inline_ void ComputeMinMax(const Point& p, Point& min, Point& max) + { + if(p.x > max.x) max.x = p.x; + if(p.x < min.x) min.x = p.x; + + if(p.y > max.y) max.y = p.y; + if(p.y < min.y) min.y = p.y; + + if(p.z > max.z) max.z = p.z; + if(p.z < min.z) min.z = p.z; + } + + // Forward declarations + class Sphere; + +//! Declarations of type-independent methods (most of them implemented in the .cpp) +#define AABB_COMMON_METHODS \ + AABB& Add(const AABB& aabb); \ + AABB& Sub(const AABB& aabb); \ + float MakeCube(AABB& cube) const; \ + void MakeSphere(Sphere& sphere) const; \ + const sbyte* ComputeOutline(const Point& local_eye, sdword& num) const; \ + float ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const; \ + bool IsInside(const AABB& box) const; \ + bool ComputePlanes(Plane* planes) const; \ + bool ComputePoints(Point* pts) const; \ + const Point* GetVertexNormals() const; \ + const udword* GetEdges() const; \ + const Point* GetEdgeNormals() const; \ + inline_ BOOL ContainsPoint(const Point& p) const \ + { \ + if(p.x > GetMax(0) || p.x < GetMin(0)) return FALSE; \ + if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ + if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ + return TRUE; \ + } + + enum AABBType + { + AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. + AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. + + AABB_FORCE_DWORD = 0x7fffffff, + }; + +#ifdef USE_MINMAX + + struct ICEMATHS_API ShadowAABB + { + Point mMin; + Point mMax; + }; + + class ICEMATHS_API AABB : public Allocateable + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mMin = mMax = pt; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { Point e; GetExtents(e); return e.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Extend(const Point& p) { ComputeMinMax(p, mMin, mMax); } + + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mMin; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mMax; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mMin[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mMax[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } + inline_ float GetWidth() const { return mMax.x - mMin.x; } + inline_ float GetHeight() const { return mMax.y - mMin.y; } + inline_ float GetDepth() const { return mMax.z - mMin.z; } + + //! Volume + inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + if(mMax.x < a.mMin.x + || a.mMax.x < mMin.x + || mMax.y < a.mMin.y + || a.mMax.y < mMin.y + || mMax.z < a.mMin.z + || a.mMax.z < mMin.z) return FALSE; + + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // The three edges transformed: you can efficiently transform an X-only vector + // by just getting the "X" column of the matrix + Point vx,vy,vz; + mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); + mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); + mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); + + // Transform the min point + aabb.mMin = aabb.mMax = mMin * mtx; + + // Take the transformed min & axes and find new extents + // Using CPU code in the right place is faster... + if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; + if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; + if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; + if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; + if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; + if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; + if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; + if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; + if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Min, Max) boxes: min < max + if(mMin.x > mMax.x) return FALSE; + if(mMin.y > mMax.y) return FALSE; + if(mMin.z > mMax.z) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents * s); + return *this; + } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents / s); + return *this; + } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mMin+=trans; + mMax+=trans; + return *this; + } + private: + Point mMin; //!< Min point + Point mMax; //!< Max point + }; + +#else + + class ICEMATHS_API AABB + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { return mExtents.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Extend(const Point& p) + { + Point Max = mCenter + mExtents; + Point Min = mCenter - mExtents; + + if(p.x > Max.x) Max.x = p.x; + if(p.x < Min.x) Min.x = p.x; + + if(p.y > Max.y) Max.y = p.y; + if(p.y < Min.y) Min.y = p.y; + + if(p.z > Max.z) Max.z = p.z; + if(p.z < Min.z) Min.z = p.z; + + SetMinMax(Min, Max); + } + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = mCenter; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = mExtents; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return mCenter[axis]; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return mExtents[axis]; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } + inline_ float GetWidth() const { return mExtents.x * 2.0f; } + inline_ float GetHeight() const { return mExtents.y * 2.0f; } + inline_ float GetDepth() const { return mExtents.z * 2.0f; } + + //! Volume + inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; + float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; + float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * The standard intersection method from Gamasutra. Just here to check its speed against the one above. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool GomezIntersect(const AABB& a) + { + Point T = mCenter - a.mCenter; // Vector from A to B + return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) + && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) + && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + float t = mCenter[axis] - a.mCenter[axis]; + float e = a.mExtents[axis] + mExtents[axis]; + if(AIR(t) > IR(e)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // Compute new center + aabb.mCenter = mCenter * mtx; + + // Compute new extents. FPU code & CPU code have been interleaved for improved performance. + Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); + IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; + + Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); + IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; + + Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); + IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; + + aabb.mExtents.x = Ex.x + Ey.x + Ez.x; + aabb.mExtents.y = Ex.y + Ey.y + Ez.y; + aabb.mExtents.z = Ex.z + Ey.z + Ez.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Center, Extents) boxes: Extents >= 0 + if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mCenter+=trans; + return *this; + } + private: + Point mCenter; //!< AABB Center + Point mExtents; //!< x, y and z extents + }; + +#endif + + //! Computes the AABB around a set of vertices + inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) + { + if(list) + { + Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); + while(nb_pts--) + { +// _prefetch(list+1); // off by one ? + ComputeMinMax(*list++, Mini, Maxi); + } + aabb.SetMinMax(Mini, Maxi); + } + } + + //! Computes the AABB around a set of vertices after transform by a matrix + inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts, const Matrix4x4& world) + { + if(list) + { + Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); + while(nb_pts--) + { +// _prefetch(list+1); // off by one ? + ComputeMinMax((*list++)*world, Mini, Maxi); + } + aabb.SetMinMax(Mini, Maxi); + } + } + +#endif // ICEAABB_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp b/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp index 59261c214..2b8abe86e 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp @@ -1,805 +1,805 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an allocator base class. - * \file IceAllocator.cpp - * \author Pierre Terdiman - * \date December, 19, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "StdAfx.h" -#include - -using namespace Opcode; - -//#define ZERO_OVERHEAD_RELEASE -#define NEW_CODE -// For some reason dmalloc seems a lot slower than the system malloc? -//#define USE_DMALLOC - -#ifdef USE_DMALLOC - #include "dmalloc.h" - #define LOCAL_MALLOC dlmalloc - #define LOCAL_FREE dlfree -#else - #define LOCAL_MALLOC ::malloc - #define LOCAL_FREE ::free -#endif - - -// WARNING: this makes allocations a lot slower. Only use when tracking memory leaks. -//#define ALLOC_STRINGS - -// ### doesn't seem that useful -//#define FAST_BUFFER_SIZE 256*1024 - -#define DEBUG_IDENTIFIER 0xBeefBabe -#define DEBUG_DEALLOCATED 0xDeadDead - -#ifdef ALLOC_STRINGS -static const char* AllocString(const char* str) -{ - if(!str) return null; - char* mem = (char*)LOCAL_MALLOC(strlen(str)+1); - strcpy(mem, str); - return mem; -} - -static void FreeString(const char* str) -{ - if(str) LOCAL_FREE((void*)str); -} - -#endif - - class DefaultAllocator : public Allocator - { - public: - DefaultAllocator(); - virtual ~DefaultAllocator(); - - void reset(); - - override(Allocator) void* malloc(size_t size, MemoryType type); - override(Allocator) void* mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type); - override(Allocator) void* realloc(void* memory, size_t size); - override(Allocator) void* shrink(void* memory, size_t size); - override(Allocator) void free(void* memory); - - void DumpCurrentMemoryState() const; - - void** mMemBlockList; - udword mMemBlockListSize; -#ifdef NEW_CODE - udword mFirstFree; -#else - udword mMemBlockFirstFree; -#endif - udword mMemBlockUsed; - - sdword mNbAllocatedBytes; - sdword mHighWaterMark; - sdword mTotalNbAllocs; - sdword mNbAllocs; - sdword mNbReallocs; -#ifdef FAST_BUFFER_SIZE - udword mNbFastBytes; - udword mFastBufferOffset; - ubyte* mFastBuffer; -#endif - }; - -#define MEMBLOCKSTART 64 - - struct DebugBlock - { - udword mCheckValue; -#ifdef FAST_BUFFER_SIZE - MemoryType mType; -#endif - udword mSize; - const char* mFilename; - udword mLine; - udword mSlotIndex; - const char* mClassName; - }; - -#ifndef FAST_BUFFER_SIZE - ICE_COMPILE_TIME_ASSERT(sizeof(DebugBlock)==24); // Prevents surprises..... -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -DefaultAllocator::DefaultAllocator() : mNbAllocatedBytes(0), mHighWaterMark(0), mTotalNbAllocs(0), mNbAllocs(0), mNbReallocs(0) -{ - mMemBlockList = null; - -#ifdef _DEBUG - // Initialize the Memory blocks list (DEBUG mode only) - mMemBlockList = (void**)LOCAL_MALLOC(MEMBLOCKSTART*sizeof(void*)); - ZeroMemory(mMemBlockList, MEMBLOCKSTART*sizeof(void*)); - mMemBlockListSize = MEMBLOCKSTART; -#ifdef NEW_CODE - mFirstFree = INVALID_ID; -#else - mMemBlockFirstFree = 0; -#endif - mMemBlockUsed = 0; -#endif - - -#ifdef FAST_BUFFER_SIZE - mNbFastBytes = 0; - mFastBufferOffset = 0; - mFastBuffer = (ubyte*)LOCAL_MALLOC(FAST_BUFFER_SIZE); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -DefaultAllocator::~DefaultAllocator() -{ -#ifdef FAST_BUFFER_SIZE - mNbFastBytes = 0; - mFastBufferOffset = 0; - if(mFastBuffer) LOCAL_FREE(mFastBuffer); - mFastBuffer = null; -#endif - -#ifdef _DEBUG - - // Ok, it is a bad idea to use _F() here, because it internally uses the allocator (for the log string). So let's use good old C style here. - char Buffer[4096]; - - if(mNbAllocatedBytes) - { - sprintf(Buffer, "Memory leak detected: %d bytes non released\n", mNbAllocatedBytes); -// IceTrace(Buffer); -// IceTrace(_F("Memory leak detected: %d bytes non released\n", mNbAllocatedBytes)); - } - if(mNbAllocs) - { - sprintf(Buffer, "Remaining allocs: %d\n", mNbAllocs); -// IceTrace(Buffer); -// IceTrace(_F("Remaining allocs: %d\n", mNbAllocs)); - } -// IceTrace(_F("Nb alloc: %d\n", mTotalNbAllocs)); - sprintf(Buffer, "Total nb alloc: %d\n", mTotalNbAllocs); -// IceTrace(Buffer); - -// IceTrace(_F("Nb realloc: %d\n", mNbReallocs)); - sprintf(Buffer, "Nb realloc: %d\n", mNbReallocs); -// IceTrace(Buffer); - -// IceTrace(_F("High water mark: %d Kb\n", mHighWaterMark/1024)); - sprintf(Buffer, "High water mark: %d Kb\n", mHighWaterMark/1024); -// IceTrace(Buffer); - - // Scanning for memory leaks - if(mMemBlockList && mNbAllocs) - { - udword NbLeaks = 0; -// IceTrace("\n\n ICE Message Memory leaks detected :\n\n"); - -#ifdef NEW_CODE - for(udword i=0; imSize, DB->mClassName, DB->mFilename, DB->mLine)); - sprintf(Buffer, " Address 0x%.8X, %d bytes (%s), allocated in: %s(%d):\n\n", DB+1, DB->mSize, DB->mClassName, DB->mFilename, DB->mLine); -// IceTrace(Buffer); - - NbLeaks++; -// Free(cur+4); - } -#else - for(udword i=0, j=0; imSize, DB->mClassName, DB->mFilename, DB->mLine)); - sprintf(Buffer, " Address 0x%.8X, %d bytes (%s), allocated in: %s(%d):\n\n", DB+1, DB->mSize, DB->mClassName, DB->mFilename, DB->mLine); - IceTrace(Buffer); - - NbLeaks++; -// Free(cur+4); - } -#endif -// IceTrace(_F("\n Dump complete (%d leaks)\n\n", NbLeaks)); - sprintf(Buffer, "\n Dump complete (%d leaks)\n\n", NbLeaks); -// IceTrace(Buffer); - } - // Free the Memory Block list - if(mMemBlockList) LOCAL_FREE(mMemBlockList); - mMemBlockList = null; -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void DefaultAllocator::reset() -{ - mNbAllocatedBytes = 0; - mHighWaterMark = 0; - mNbAllocs = 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void* DefaultAllocator::malloc(udword size, MemoryType type) -{ -// return ::malloc(size); - -#ifdef _DEBUG - return mallocDebug(size, null, 0, "Undefined", type); -#endif - - if(!size) - { -#ifdef _DEBUG -// IceTrace("Warning: trying to allocate 0 bytes\n"); -#endif - return null; - } - - mTotalNbAllocs++; - mNbAllocs++; - - mNbAllocatedBytes+=size; - if(mNbAllocatedBytes>mHighWaterMark) mHighWaterMark = mNbAllocatedBytes; - -#ifdef ZERO_OVERHEAD_RELEASE - return LOCAL_MALLOC(size); -#else - void* ptr = (void*)LOCAL_MALLOC(size+8); - udword* blockStart = (udword*)ptr; - blockStart[0] = DEBUG_IDENTIFIER; - blockStart[1] = size; - return ((udword*)ptr)+2; -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void* DefaultAllocator::mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type) -{ -#ifdef _DEBUG - if(!size) - { -// IceTrace("Warning: trying to allocate 0 bytes\n"); - return null; - } - - // Catch improper use of alloc macro... - if(0 && class_name) - { - const char* c = class_name; - while(*c) - { - if(*c==']' || *c=='[') - { - int stop=0; - } - c++; - } - } - - // Make sure size is even - if(size&1) size++; - -#ifdef FAST_BUFFER_SIZE - // Allocate one debug block in front of each real allocation - void* ptr = null; - if(type==MEMORY_TEMP) - { - udword NeededSize = size + sizeof(DebugBlock); - if(mFastBufferOffset + NeededSize <= FAST_BUFFER_SIZE) - { - ptr = mFastBuffer + mFastBufferOffset; - mFastBufferOffset += NeededSize; - mNbFastBytes += NeededSize; - } - } - - if(!ptr) - { - ptr = (void*)LOCAL_MALLOC(size + sizeof(DebugBlock)); - type = MEMORY_PERSISTENT; - } -#else - // Allocate one debug block in front of each real allocation - void* ptr = (void*)LOCAL_MALLOC(size + sizeof(DebugBlock)); -#endif - ASSERT(IS_ALIGNED_2(udword(ptr))); - - // Fill debug block - DebugBlock* DB = (DebugBlock*)ptr; - DB->mCheckValue = DEBUG_IDENTIFIER; -#ifdef FAST_BUFFER_SIZE - DB->mType = type; -#endif - DB->mSize = size; - DB->mLine = line; - DB->mSlotIndex = INVALID_ID; -#ifdef ALLOC_STRINGS - DB->mFilename = AllocString(filename); - DB->mClassName = AllocString(class_name); -#else - DB->mFilename = filename; - DB->mClassName = class_name; -#endif - - // Update global stats - mTotalNbAllocs++; - mNbAllocs++; - mNbAllocatedBytes += size; - if(mNbAllocatedBytes>mHighWaterMark) - mHighWaterMark = mNbAllocatedBytes; - - // Insert the allocated block in the debug memory block list - if(mMemBlockList) - { -#ifdef NEW_CODE - if(mFirstFree!=INVALID_ID) - { - // Recycle old location - - udword NextFree = udword(mMemBlockList[mFirstFree]); - if(NextFree!=INVALID_ID) NextFree>>=1; - - mMemBlockList[mFirstFree] = ptr; - DB->mSlotIndex = mFirstFree; - - mFirstFree = NextFree; - } - else - { - if(mMemBlockUsed==mMemBlockListSize) - { - // Allocate a bigger block - void** tps = (void**)LOCAL_MALLOC((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); - // Copy already used part - CopyMemory(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); - // Initialize remaining part - void* Next = tps + mMemBlockListSize; - ZeroMemory(Next, MEMBLOCKSTART*sizeof(void*)); - - // Free previous memory, setup new pointer - LOCAL_FREE(mMemBlockList); - mMemBlockList = tps; - // Setup new size - mMemBlockListSize += MEMBLOCKSTART; - } - - mMemBlockList[mMemBlockUsed] = ptr; - DB->mSlotIndex = mMemBlockUsed++; - } -#else - // Store allocated pointer in first free slot - mMemBlockList[mMemBlockFirstFree] = ptr; - DB->mSlotIndex = mMemBlockFirstFree; - - // Count number of used slots - mMemBlockUsed++; - - // Resize if needed - if(mMemBlockUsed==mMemBlockListSize) - { - // Allocate a bigger block - void** tps = (void**)LOCAL_MALLOC((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); - // Copy already used part - CopyMemory(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); - // Initialize remaining part - void* Next = tps + mMemBlockListSize; - ZeroMemory(Next, MEMBLOCKSTART*sizeof(void*)); - - // Free previous memory, setup new pointer - LOCAL_FREE(mMemBlockList); - mMemBlockList = tps; - // -1 because we'll do a ++ just afterwards - mMemBlockFirstFree = mMemBlockListSize-1; - // Setup new size - mMemBlockListSize += MEMBLOCKSTART; - } - - // Look for first free ### recode this ugly thing - while(mMemBlockList[++mMemBlockFirstFree] && (mMemBlockFirstFreemCheckValue!=DEBUG_IDENTIFIER) - { - // Not a valid memory block - return null; - } - if(size>DB->mSize) - { - // New size should be smaller! - return null; - } - - // Try to shrink the block - void* Reduced = _expand(SystemPointer, size + sizeof(DebugBlock)); - if(!Reduced) return null; - - if(Reduced!=SystemPointer) - { - // Should not be possible?! - } - - // Update stats - mNbAllocatedBytes -= DB->mSize; - mNbAllocatedBytes += size; - // Setup new size - DB->mSize = size; - - return memory; // The pointer should not have changed! -#else - // Release codepath - udword* SystemPointer = ((udword*)memory)-2; - if(SystemPointer[0]!=DEBUG_IDENTIFIER) - { - // Not a valid memory block - return null; - } - if(size>SystemPointer[1]) - { - // New size should be smaller! - return null; - } - - // Try to shrink the block - void* Reduced = _expand(SystemPointer, size+8); - if(!Reduced) return null; - - if(Reduced!=SystemPointer) - { - // Should not be possible?! - } - - // Update stats - mNbAllocatedBytes -= SystemPointer[1]; - mNbAllocatedBytes += size; - // Setup new size - SystemPointer[1] = size; - - return memory; // The pointer should not have changed! -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void* DefaultAllocator::realloc(void* memory, udword size) -{ -// return ::realloc(memory, size); - - ASSERT(0); - return null; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void DefaultAllocator::free(void* memory) -{ - if(!memory) - { -#ifdef _DEBUG -// IceTrace("Warning: trying to free null pointer\n"); -#endif - return; - } - -#ifdef _DEBUG - DebugBlock* DB = ((DebugBlock*)memory)-1; - -// DebugBlock TmpDB = *DB; // Keep a local copy to have readable data when ::free() fails! - - // Check we allocated it - if(DB->mCheckValue!=DEBUG_IDENTIFIER) - { -// IceTrace("Error: free unknown memory!!\n"); - // ### should we really continue?? - return; - } - - // Update global stats - mNbAllocatedBytes -= DB->mSize; - mNbAllocs--; - -#ifdef NEW_CODE - // Remove the block from the Memory block list - if(mMemBlockList) - { - udword FreeSlot = DB->mSlotIndex; - ASSERT(mMemBlockList[FreeSlot]==DB); - - udword NextFree = mFirstFree; - if(NextFree!=INVALID_ID) - { - NextFree<<=1; - NextFree|=1; - } - - mMemBlockList[FreeSlot] = (void*)NextFree; - mFirstFree = FreeSlot; - } -#else - udword MemBlockFirstFree = DB->mSlotIndex; // The slot we are in - udword Line = DB->mLine; - const char* File = DB->mFilename; - - // Remove the block from the Memory block list - if(mMemBlockList) - { - ASSERT(mMemBlockList[MemBlockFirstFree]==DB); - mMemBlockList[MemBlockFirstFree] = null; - mMemBlockUsed--; - } -#endif - -#ifdef ALLOC_STRINGS - FreeString(DB->mClassName); - FreeString(DB->mFilename); -#endif - -#ifdef FAST_BUFFER_SIZE - if(DB->mType==MEMORY_TEMP) - { - mNbFastBytes -= DB->mSize + sizeof(DebugBlock); - if(mNbFastBytes==0) - { - mFastBufferOffset = 0; - } - return; - } -#endif - - // ### should be useless since we'll release the memory just afterwards - DB->mCheckValue = DEBUG_DEALLOCATED; - DB->mSize = 0; - DB->mClassName = null; - DB->mFilename = null; - DB->mSlotIndex = INVALID_ID; - DB->mLine = INVALID_ID; - - LOCAL_FREE(DB); -#else - // Release codepath - #ifdef ZERO_OVERHEAD_RELEASE - -// mNbAllocatedBytes -= ptr[1]; // ### use _msize() ? - mNbAllocs--; - LOCAL_FREE(memory); - - #else - - udword* ptr = ((udword*)memory)-2; - if(ptr[0]!=DEBUG_IDENTIFIER) - { - #ifdef _DEBUG - IceTrace("Error: free unknown memory!!\n"); - #endif - } - mNbAllocatedBytes -= ptr[1]; - if(mNbAllocatedBytes<0) - { - #ifdef _DEBUG - IceTrace(_F("Oops (%d)\n", ptr[1])); - #endif - } - mNbAllocs--; - ptr[0]=DEBUG_DEALLOCATED; - ptr[1]=0; - LOCAL_FREE(ptr); - - #endif -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -inline_ bool ValidAddress(const void* addy) -{ -#ifdef NEW_CODE - return (addy && !(udword(addy)&1)); -#else - return addy!=null; -#endif -} - -void DefaultAllocator::DumpCurrentMemoryState() const -{ -#ifdef _DEBUG - // Scanning for memory leaks - if(mMemBlockList && mMemBlockUsed) - { -// IceTrace("\n\n----ALLOCATOR MEMORY DUMP:\n\n"); - - // We can't just use the "const char*" stored in the debug blocks because they're not guaranteed to - // be unique for similar strings. For example if a Container is allocated from two different DLLs, - // the "Container" character string will be duplicated (one per DLL). So we need to group similar - // strings together using the actual characters, not just the string address. We also have to do this - // without allocating any new memory, since it would add new entries to the memory debug structure. - // - // The good news is that we don't care about speed too much in this function, since it's not supposed - // to be called all the time. - - struct Local - { - struct TmpStruct - { - const char* mName; - udword mSize; - }; - static int SortCB(const void* elem1, const void* elem2) - { - const TmpStruct* s1 = (const TmpStruct*)elem1; - const TmpStruct* s2 = (const TmpStruct*)elem2; - return strcmp(s1->mName, s2->mName); - } - }; - - Local::TmpStruct* SortedStrings = (Local::TmpStruct*)LOCAL_MALLOC(sizeof(Local::TmpStruct)*mMemBlockListSize); - udword NbStrings = 0; - udword TotalSize = 0; - for(udword i=0;imClassName) - { - SortedStrings[NbStrings].mName = DB->mClassName; // Memory by class -// SortedStrings[NbStrings].mName = DB->mFilename; // Memory by file - SortedStrings[NbStrings].mSize = DB->mSize; - TotalSize += DB->mSize; - NbStrings++; - } - } - } - qsort(SortedStrings, NbStrings, sizeof(Local::TmpStruct), Local::SortCB); - - // Strings are now sorted. They might still be duplicated, i.e. we may have two strings for the same - // class. So now we parse the list and collect used memory for all classes. Then we sort this again, - // to report results in order of increasing memory. - - udword NbClasses=0; - udword* Classes = (udword*)LOCAL_MALLOC(sizeof(udword)*NbStrings); - udword* Sizes = (udword*)LOCAL_MALLOC(sizeof(udword)*NbStrings); - - udword CurrentSize = SortedStrings[0].mSize; - const char* CurrentClass = SortedStrings[0].mName; - for(udword i=1;i<=NbStrings;i++) // One more time on purpose - { - const char* Current = null; - if(i!=NbStrings) - { - Current = SortedStrings[i].mName; - } - - if(Current && strcmp(Current, CurrentClass)==0) - { - // Same class - CurrentSize += SortedStrings[i].mSize; - } - else - { - // New class - - // Store previous class - if(CurrentClass) - { - Classes[NbClasses] = (udword)CurrentClass; // We can store this pointer now because it's unique in our new array - Sizes[NbClasses++] = CurrentSize; - } - - // Next one - if(Current) - { - CurrentClass = Current; - CurrentSize = SortedStrings[i].mSize; - } - } - } - - udword* Ranks0 = (udword*)LOCAL_MALLOC(sizeof(udword)*NbClasses); - udword* Ranks1 = (udword*)LOCAL_MALLOC(sizeof(udword)*NbClasses); - - StackRadixSort(RS, Ranks0, Ranks1); - const udword* Sorted = RS.Sort(Sizes, NbClasses).GetRanks(); - for(udword i=0;iDumpCurrentMemoryState(); -} - -void InitDefaultAllocator() -{ -// gDefault = ::new DefaultAllocator; -} - -void ReleaseDefaultAllocator() -{ -// if(gDefault) ::delete gDefault; -// gDefault = null; -} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an allocator base class. + * \file IceAllocator.cpp + * \author Pierre Terdiman + * \date December, 19, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" +#include + +using namespace Opcode; + +//#define ZERO_OVERHEAD_RELEASE +#define NEW_CODE +// For some reason dmalloc seems a lot slower than the system malloc? +//#define USE_DMALLOC + +#ifdef USE_DMALLOC + #include "dmalloc.h" + #define LOCAL_MALLOC dlmalloc + #define LOCAL_FREE dlfree +#else + #define LOCAL_MALLOC ::malloc + #define LOCAL_FREE ::free +#endif + + +// WARNING: this makes allocations a lot slower. Only use when tracking memory leaks. +//#define ALLOC_STRINGS + +// ### doesn't seem that useful +//#define FAST_BUFFER_SIZE 256*1024 + +#define DEBUG_IDENTIFIER 0xBeefBabe +#define DEBUG_DEALLOCATED 0xDeadDead + +#ifdef ALLOC_STRINGS +static const char* AllocString(const char* str) +{ + if(!str) return null; + char* mem = (char*)LOCAL_MALLOC(strlen(str)+1); + strcpy(mem, str); + return mem; +} + +static void FreeString(const char* str) +{ + if(str) LOCAL_FREE((void*)str); +} + +#endif + + class DefaultAllocator : public Allocator + { + public: + DefaultAllocator(); + virtual ~DefaultAllocator(); + + void reset(); + + override(Allocator) void* malloc(size_t size, MemoryType type); + override(Allocator) void* mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type); + override(Allocator) void* realloc(void* memory, size_t size); + override(Allocator) void* shrink(void* memory, size_t size); + override(Allocator) void free(void* memory); + + void DumpCurrentMemoryState() const; + + void** mMemBlockList; + udword mMemBlockListSize; +#ifdef NEW_CODE + udword mFirstFree; +#else + udword mMemBlockFirstFree; +#endif + udword mMemBlockUsed; + + sdword mNbAllocatedBytes; + sdword mHighWaterMark; + sdword mTotalNbAllocs; + sdword mNbAllocs; + sdword mNbReallocs; +#ifdef FAST_BUFFER_SIZE + udword mNbFastBytes; + udword mFastBufferOffset; + ubyte* mFastBuffer; +#endif + }; + +#define MEMBLOCKSTART 64 + + struct DebugBlock + { + udword mCheckValue; +#ifdef FAST_BUFFER_SIZE + MemoryType mType; +#endif + udword mSize; + const char* mFilename; + udword mLine; + udword mSlotIndex; + const char* mClassName; + }; + +#ifndef FAST_BUFFER_SIZE + ICE_COMPILE_TIME_ASSERT(sizeof(DebugBlock)==24); // Prevents surprises..... +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DefaultAllocator::DefaultAllocator() : mNbAllocatedBytes(0), mHighWaterMark(0), mTotalNbAllocs(0), mNbAllocs(0), mNbReallocs(0) +{ + mMemBlockList = null; + +#ifdef _DEBUG + // Initialize the Memory blocks list (DEBUG mode only) + mMemBlockList = (void**)LOCAL_MALLOC(MEMBLOCKSTART*sizeof(void*)); + ZeroMemory(mMemBlockList, MEMBLOCKSTART*sizeof(void*)); + mMemBlockListSize = MEMBLOCKSTART; +#ifdef NEW_CODE + mFirstFree = INVALID_ID; +#else + mMemBlockFirstFree = 0; +#endif + mMemBlockUsed = 0; +#endif + + +#ifdef FAST_BUFFER_SIZE + mNbFastBytes = 0; + mFastBufferOffset = 0; + mFastBuffer = (ubyte*)LOCAL_MALLOC(FAST_BUFFER_SIZE); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DefaultAllocator::~DefaultAllocator() +{ +#ifdef FAST_BUFFER_SIZE + mNbFastBytes = 0; + mFastBufferOffset = 0; + if(mFastBuffer) LOCAL_FREE(mFastBuffer); + mFastBuffer = null; +#endif + +#ifdef _DEBUG + + // Ok, it is a bad idea to use _F() here, because it internally uses the allocator (for the log string). So let's use good old C style here. + char Buffer[4096]; + + if(mNbAllocatedBytes) + { + sprintf(Buffer, "Memory leak detected: %d bytes non released\n", mNbAllocatedBytes); +// IceTrace(Buffer); +// IceTrace(_F("Memory leak detected: %d bytes non released\n", mNbAllocatedBytes)); + } + if(mNbAllocs) + { + sprintf(Buffer, "Remaining allocs: %d\n", mNbAllocs); +// IceTrace(Buffer); +// IceTrace(_F("Remaining allocs: %d\n", mNbAllocs)); + } +// IceTrace(_F("Nb alloc: %d\n", mTotalNbAllocs)); + sprintf(Buffer, "Total nb alloc: %d\n", mTotalNbAllocs); +// IceTrace(Buffer); + +// IceTrace(_F("Nb realloc: %d\n", mNbReallocs)); + sprintf(Buffer, "Nb realloc: %d\n", mNbReallocs); +// IceTrace(Buffer); + +// IceTrace(_F("High water mark: %d Kb\n", mHighWaterMark/1024)); + sprintf(Buffer, "High water mark: %d Kb\n", mHighWaterMark/1024); +// IceTrace(Buffer); + + // Scanning for memory leaks + if(mMemBlockList && mNbAllocs) + { + udword NbLeaks = 0; +// IceTrace("\n\n ICE Message Memory leaks detected :\n\n"); + +#ifdef NEW_CODE + for(udword i=0; imSize, DB->mClassName, DB->mFilename, DB->mLine)); + sprintf(Buffer, " Address 0x%.8X, %d bytes (%s), allocated in: %s(%d):\n\n", DB+1, DB->mSize, DB->mClassName, DB->mFilename, DB->mLine); +// IceTrace(Buffer); + + NbLeaks++; +// Free(cur+4); + } +#else + for(udword i=0, j=0; imSize, DB->mClassName, DB->mFilename, DB->mLine)); + sprintf(Buffer, " Address 0x%.8X, %d bytes (%s), allocated in: %s(%d):\n\n", DB+1, DB->mSize, DB->mClassName, DB->mFilename, DB->mLine); + IceTrace(Buffer); + + NbLeaks++; +// Free(cur+4); + } +#endif +// IceTrace(_F("\n Dump complete (%d leaks)\n\n", NbLeaks)); + sprintf(Buffer, "\n Dump complete (%d leaks)\n\n", NbLeaks); +// IceTrace(Buffer); + } + // Free the Memory Block list + if(mMemBlockList) LOCAL_FREE(mMemBlockList); + mMemBlockList = null; +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DefaultAllocator::reset() +{ + mNbAllocatedBytes = 0; + mHighWaterMark = 0; + mNbAllocs = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void* DefaultAllocator::malloc(udword size, MemoryType type) +{ +// return ::malloc(size); + +#ifdef _DEBUG + return mallocDebug(size, null, 0, "Undefined", type); +#endif + + if(!size) + { +#ifdef _DEBUG +// IceTrace("Warning: trying to allocate 0 bytes\n"); +#endif + return null; + } + + mTotalNbAllocs++; + mNbAllocs++; + + mNbAllocatedBytes+=size; + if(mNbAllocatedBytes>mHighWaterMark) mHighWaterMark = mNbAllocatedBytes; + +#ifdef ZERO_OVERHEAD_RELEASE + return LOCAL_MALLOC(size); +#else + void* ptr = (void*)LOCAL_MALLOC(size+8); + udword* blockStart = (udword*)ptr; + blockStart[0] = DEBUG_IDENTIFIER; + blockStart[1] = size; + return ((udword*)ptr)+2; +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void* DefaultAllocator::mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type) +{ +#ifdef _DEBUG + if(!size) + { +// IceTrace("Warning: trying to allocate 0 bytes\n"); + return null; + } + + // Catch improper use of alloc macro... + if(0 && class_name) + { + const char* c = class_name; + while(*c) + { + if(*c==']' || *c=='[') + { + int stop=0; + } + c++; + } + } + + // Make sure size is even + if(size&1) size++; + +#ifdef FAST_BUFFER_SIZE + // Allocate one debug block in front of each real allocation + void* ptr = null; + if(type==MEMORY_TEMP) + { + udword NeededSize = size + sizeof(DebugBlock); + if(mFastBufferOffset + NeededSize <= FAST_BUFFER_SIZE) + { + ptr = mFastBuffer + mFastBufferOffset; + mFastBufferOffset += NeededSize; + mNbFastBytes += NeededSize; + } + } + + if(!ptr) + { + ptr = (void*)LOCAL_MALLOC(size + sizeof(DebugBlock)); + type = MEMORY_PERSISTENT; + } +#else + // Allocate one debug block in front of each real allocation + void* ptr = (void*)LOCAL_MALLOC(size + sizeof(DebugBlock)); +#endif + ASSERT(IS_ALIGNED_2(udword(ptr))); + + // Fill debug block + DebugBlock* DB = (DebugBlock*)ptr; + DB->mCheckValue = DEBUG_IDENTIFIER; +#ifdef FAST_BUFFER_SIZE + DB->mType = type; +#endif + DB->mSize = size; + DB->mLine = line; + DB->mSlotIndex = INVALID_ID; +#ifdef ALLOC_STRINGS + DB->mFilename = AllocString(filename); + DB->mClassName = AllocString(class_name); +#else + DB->mFilename = filename; + DB->mClassName = class_name; +#endif + + // Update global stats + mTotalNbAllocs++; + mNbAllocs++; + mNbAllocatedBytes += size; + if(mNbAllocatedBytes>mHighWaterMark) + mHighWaterMark = mNbAllocatedBytes; + + // Insert the allocated block in the debug memory block list + if(mMemBlockList) + { +#ifdef NEW_CODE + if(mFirstFree!=INVALID_ID) + { + // Recycle old location + + udword NextFree = udword(mMemBlockList[mFirstFree]); + if(NextFree!=INVALID_ID) NextFree>>=1; + + mMemBlockList[mFirstFree] = ptr; + DB->mSlotIndex = mFirstFree; + + mFirstFree = NextFree; + } + else + { + if(mMemBlockUsed==mMemBlockListSize) + { + // Allocate a bigger block + void** tps = (void**)LOCAL_MALLOC((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); + // Copy already used part + CopyMemory(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); + // Initialize remaining part + void* Next = tps + mMemBlockListSize; + ZeroMemory(Next, MEMBLOCKSTART*sizeof(void*)); + + // Free previous memory, setup new pointer + LOCAL_FREE(mMemBlockList); + mMemBlockList = tps; + // Setup new size + mMemBlockListSize += MEMBLOCKSTART; + } + + mMemBlockList[mMemBlockUsed] = ptr; + DB->mSlotIndex = mMemBlockUsed++; + } +#else + // Store allocated pointer in first free slot + mMemBlockList[mMemBlockFirstFree] = ptr; + DB->mSlotIndex = mMemBlockFirstFree; + + // Count number of used slots + mMemBlockUsed++; + + // Resize if needed + if(mMemBlockUsed==mMemBlockListSize) + { + // Allocate a bigger block + void** tps = (void**)LOCAL_MALLOC((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); + // Copy already used part + CopyMemory(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); + // Initialize remaining part + void* Next = tps + mMemBlockListSize; + ZeroMemory(Next, MEMBLOCKSTART*sizeof(void*)); + + // Free previous memory, setup new pointer + LOCAL_FREE(mMemBlockList); + mMemBlockList = tps; + // -1 because we'll do a ++ just afterwards + mMemBlockFirstFree = mMemBlockListSize-1; + // Setup new size + mMemBlockListSize += MEMBLOCKSTART; + } + + // Look for first free ### recode this ugly thing + while(mMemBlockList[++mMemBlockFirstFree] && (mMemBlockFirstFreemCheckValue!=DEBUG_IDENTIFIER) + { + // Not a valid memory block + return null; + } + if(size>DB->mSize) + { + // New size should be smaller! + return null; + } + + // Try to shrink the block + void* Reduced = _expand(SystemPointer, size + sizeof(DebugBlock)); + if(!Reduced) return null; + + if(Reduced!=SystemPointer) + { + // Should not be possible?! + } + + // Update stats + mNbAllocatedBytes -= DB->mSize; + mNbAllocatedBytes += size; + // Setup new size + DB->mSize = size; + + return memory; // The pointer should not have changed! +#else + // Release codepath + udword* SystemPointer = ((udword*)memory)-2; + if(SystemPointer[0]!=DEBUG_IDENTIFIER) + { + // Not a valid memory block + return null; + } + if(size>SystemPointer[1]) + { + // New size should be smaller! + return null; + } + + // Try to shrink the block + void* Reduced = _expand(SystemPointer, size+8); + if(!Reduced) return null; + + if(Reduced!=SystemPointer) + { + // Should not be possible?! + } + + // Update stats + mNbAllocatedBytes -= SystemPointer[1]; + mNbAllocatedBytes += size; + // Setup new size + SystemPointer[1] = size; + + return memory; // The pointer should not have changed! +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void* DefaultAllocator::realloc(void* memory, udword size) +{ +// return ::realloc(memory, size); + + ASSERT(0); + return null; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DefaultAllocator::free(void* memory) +{ + if(!memory) + { +#ifdef _DEBUG +// IceTrace("Warning: trying to free null pointer\n"); +#endif + return; + } + +#ifdef _DEBUG + DebugBlock* DB = ((DebugBlock*)memory)-1; + +// DebugBlock TmpDB = *DB; // Keep a local copy to have readable data when ::free() fails! + + // Check we allocated it + if(DB->mCheckValue!=DEBUG_IDENTIFIER) + { +// IceTrace("Error: free unknown memory!!\n"); + // ### should we really continue?? + return; + } + + // Update global stats + mNbAllocatedBytes -= DB->mSize; + mNbAllocs--; + +#ifdef NEW_CODE + // Remove the block from the Memory block list + if(mMemBlockList) + { + udword FreeSlot = DB->mSlotIndex; + ASSERT(mMemBlockList[FreeSlot]==DB); + + udword NextFree = mFirstFree; + if(NextFree!=INVALID_ID) + { + NextFree<<=1; + NextFree|=1; + } + + mMemBlockList[FreeSlot] = (void*)NextFree; + mFirstFree = FreeSlot; + } +#else + udword MemBlockFirstFree = DB->mSlotIndex; // The slot we are in + udword Line = DB->mLine; + const char* File = DB->mFilename; + + // Remove the block from the Memory block list + if(mMemBlockList) + { + ASSERT(mMemBlockList[MemBlockFirstFree]==DB); + mMemBlockList[MemBlockFirstFree] = null; + mMemBlockUsed--; + } +#endif + +#ifdef ALLOC_STRINGS + FreeString(DB->mClassName); + FreeString(DB->mFilename); +#endif + +#ifdef FAST_BUFFER_SIZE + if(DB->mType==MEMORY_TEMP) + { + mNbFastBytes -= DB->mSize + sizeof(DebugBlock); + if(mNbFastBytes==0) + { + mFastBufferOffset = 0; + } + return; + } +#endif + + // ### should be useless since we'll release the memory just afterwards + DB->mCheckValue = DEBUG_DEALLOCATED; + DB->mSize = 0; + DB->mClassName = null; + DB->mFilename = null; + DB->mSlotIndex = INVALID_ID; + DB->mLine = INVALID_ID; + + LOCAL_FREE(DB); +#else + // Release codepath + #ifdef ZERO_OVERHEAD_RELEASE + +// mNbAllocatedBytes -= ptr[1]; // ### use _msize() ? + mNbAllocs--; + LOCAL_FREE(memory); + + #else + + udword* ptr = ((udword*)memory)-2; + if(ptr[0]!=DEBUG_IDENTIFIER) + { + #ifdef _DEBUG + IceTrace("Error: free unknown memory!!\n"); + #endif + } + mNbAllocatedBytes -= ptr[1]; + if(mNbAllocatedBytes<0) + { + #ifdef _DEBUG + IceTrace(_F("Oops (%d)\n", ptr[1])); + #endif + } + mNbAllocs--; + ptr[0]=DEBUG_DEALLOCATED; + ptr[1]=0; + LOCAL_FREE(ptr); + + #endif +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +inline_ bool ValidAddress(const void* addy) +{ +#ifdef NEW_CODE + return (addy && !(udword(addy)&1)); +#else + return addy!=null; +#endif +} + +void DefaultAllocator::DumpCurrentMemoryState() const +{ +#ifdef _DEBUG + // Scanning for memory leaks + if(mMemBlockList && mMemBlockUsed) + { +// IceTrace("\n\n----ALLOCATOR MEMORY DUMP:\n\n"); + + // We can't just use the "const char*" stored in the debug blocks because they're not guaranteed to + // be unique for similar strings. For example if a Container is allocated from two different DLLs, + // the "Container" character string will be duplicated (one per DLL). So we need to group similar + // strings together using the actual characters, not just the string address. We also have to do this + // without allocating any new memory, since it would add new entries to the memory debug structure. + // + // The good news is that we don't care about speed too much in this function, since it's not supposed + // to be called all the time. + + struct Local + { + struct TmpStruct + { + const char* mName; + udword mSize; + }; + static int SortCB(const void* elem1, const void* elem2) + { + const TmpStruct* s1 = (const TmpStruct*)elem1; + const TmpStruct* s2 = (const TmpStruct*)elem2; + return strcmp(s1->mName, s2->mName); + } + }; + + Local::TmpStruct* SortedStrings = (Local::TmpStruct*)LOCAL_MALLOC(sizeof(Local::TmpStruct)*mMemBlockListSize); + udword NbStrings = 0; + udword TotalSize = 0; + for(udword i=0;imClassName) + { + SortedStrings[NbStrings].mName = DB->mClassName; // Memory by class +// SortedStrings[NbStrings].mName = DB->mFilename; // Memory by file + SortedStrings[NbStrings].mSize = DB->mSize; + TotalSize += DB->mSize; + NbStrings++; + } + } + } + qsort(SortedStrings, NbStrings, sizeof(Local::TmpStruct), Local::SortCB); + + // Strings are now sorted. They might still be duplicated, i.e. we may have two strings for the same + // class. So now we parse the list and collect used memory for all classes. Then we sort this again, + // to report results in order of increasing memory. + + udword NbClasses=0; + udword* Classes = (udword*)LOCAL_MALLOC(sizeof(udword)*NbStrings); + udword* Sizes = (udword*)LOCAL_MALLOC(sizeof(udword)*NbStrings); + + udword CurrentSize = SortedStrings[0].mSize; + const char* CurrentClass = SortedStrings[0].mName; + for(udword i=1;i<=NbStrings;i++) // One more time on purpose + { + const char* Current = null; + if(i!=NbStrings) + { + Current = SortedStrings[i].mName; + } + + if(Current && strcmp(Current, CurrentClass)==0) + { + // Same class + CurrentSize += SortedStrings[i].mSize; + } + else + { + // New class + + // Store previous class + if(CurrentClass) + { + Classes[NbClasses] = (udword)CurrentClass; // We can store this pointer now because it's unique in our new array + Sizes[NbClasses++] = CurrentSize; + } + + // Next one + if(Current) + { + CurrentClass = Current; + CurrentSize = SortedStrings[i].mSize; + } + } + } + + udword* Ranks0 = (udword*)LOCAL_MALLOC(sizeof(udword)*NbClasses); + udword* Ranks1 = (udword*)LOCAL_MALLOC(sizeof(udword)*NbClasses); + + StackRadixSort(RS, Ranks0, Ranks1); + const udword* Sorted = RS.Sort(Sizes, NbClasses).GetRanks(); + for(udword i=0;iDumpCurrentMemoryState(); +} + +void InitDefaultAllocator() +{ +// gDefault = ::new DefaultAllocator; +} + +void ReleaseDefaultAllocator() +{ +// if(gDefault) ::delete gDefault; +// gDefault = null; +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h b/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h index ab6ce4134..694d542c3 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h @@ -1,52 +1,52 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an allocator base class. - * \file IceAllocator.h - * \author Pierre Terdiman - * \date December, 19, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICEALLOCATOR_H -#define ICEALLOCATOR_H - - enum MemoryType - { - MEMORY_PERSISTENT, - MEMORY_TEMP, - }; - - class ICECORE_API Allocator - { - public: - virtual void* malloc(size_t size, MemoryType type) = 0; - virtual void* mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type) = 0; - virtual void* realloc(void* memory, size_t size) = 0; - virtual void* shrink(void* memory, size_t size) = 0; - virtual void free(void* memory) = 0; - }; - - FUNCTION ICECORE_API Allocator* GetAllocator(); - FUNCTION ICECORE_API bool SetAllocator(Allocator& allocator); - FUNCTION ICECORE_API void DumpMemory(); - - class ICECORE_API Allocateable - { - public: -#ifdef DONT_TRACK_MEMORY_LEAKS - inline_ void* operator new (size_t size, MemoryType type) { return GetAllocator()->malloc(size, type); } - inline_ void* operator new (size_t size, const char * filename, int line, const char* class_name, MemoryType type) { return GetAllocator()->mallocDebug(size, filename, line, class_name, type); } - inline_ void* operator new[] (size_t size, MemoryType type) { return GetAllocator()->malloc(size, type); } - inline_ void* operator new[] (size_t size, const char * filename, int line, const char* class_name, MemoryType type) { return GetAllocator()->mallocDebug(size, filename, line, class_name, type); } - inline_ void operator delete (void* p) { GetAllocator()->free(p); } - inline_ void operator delete (void* p, MemoryType) { GetAllocator()->free(p); } - inline_ void operator delete (void* p, const char*, int, const char*, MemoryType) { GetAllocator()->free(p); } - inline_ void operator delete[] (void* p) { GetAllocator()->free(p); } - inline_ void operator delete[] (void* p, MemoryType) { GetAllocator()->free(p); } - inline_ void operator delete[] (void* p, const char*, int, const char*, MemoryType) { GetAllocator()->free(p); } -#endif - }; - -#endif // ICEALLOCATOR_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an allocator base class. + * \file IceAllocator.h + * \author Pierre Terdiman + * \date December, 19, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEALLOCATOR_H +#define ICEALLOCATOR_H + + enum MemoryType + { + MEMORY_PERSISTENT, + MEMORY_TEMP, + }; + + class ICECORE_API Allocator + { + public: + virtual void* malloc(size_t size, MemoryType type) = 0; + virtual void* mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type) = 0; + virtual void* realloc(void* memory, size_t size) = 0; + virtual void* shrink(void* memory, size_t size) = 0; + virtual void free(void* memory) = 0; + }; + + FUNCTION ICECORE_API Allocator* GetAllocator(); + FUNCTION ICECORE_API bool SetAllocator(Allocator& allocator); + FUNCTION ICECORE_API void DumpMemory(); + + class ICECORE_API Allocateable + { + public: +#ifdef DONT_TRACK_MEMORY_LEAKS + inline_ void* operator new (size_t size, MemoryType type) { return GetAllocator()->malloc(size, type); } + inline_ void* operator new (size_t size, const char * filename, int line, const char* class_name, MemoryType type) { return GetAllocator()->mallocDebug(size, filename, line, class_name, type); } + inline_ void* operator new[] (size_t size, MemoryType type) { return GetAllocator()->malloc(size, type); } + inline_ void* operator new[] (size_t size, const char * filename, int line, const char* class_name, MemoryType type) { return GetAllocator()->mallocDebug(size, filename, line, class_name, type); } + inline_ void operator delete (void* p) { GetAllocator()->free(p); } + inline_ void operator delete (void* p, MemoryType) { GetAllocator()->free(p); } + inline_ void operator delete (void* p, const char*, int, const char*, MemoryType) { GetAllocator()->free(p); } + inline_ void operator delete[] (void* p) { GetAllocator()->free(p); } + inline_ void operator delete[] (void* p, MemoryType) { GetAllocator()->free(p); } + inline_ void operator delete[] (void* p, const char*, int, const char*, MemoryType) { GetAllocator()->free(p); } +#endif + }; + +#endif // ICEALLOCATOR_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceAssert.h b/Extras/CDTestFramework/Opcode/Ice/IceAssert.h index c419c5873..386ec13b0 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceAssert.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceAssert.h @@ -1,48 +1,48 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains custom assertion code. - * \file IceAssert.h - * \author Pierre Terdiman - * \date January, 14, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICEASSERT_H -#define ICEASSERT_H - -// Leave the {} so that you can write this kind of things safely in release mode: -// if(condition) ASSERT() - -#ifndef ASSERT - #if defined( _DEBUG ) - FUNCTION ICECORE_API bool CustomAssertFunction(int, char*, int, char*, bool&); - - //! Custom ASSERT function. Various usages: - //! ASSERT(condition) - //! ASSERT(!"Not implemented") - //! ASSERT(condition && "error text") - #define ASSERT(exp) \ - { \ - static bool IgnoreAlways = false; \ - if(!IgnoreAlways) \ - { \ - if(CustomAssertFunction((int)(exp), #exp, __LINE__, __FILE__, IgnoreAlways)) \ - { \ - _asm { int 3 } \ - } \ - } \ - } - #else - #define ASSERT(exp) {} - #endif -#endif - -#ifndef assert - #define assert ASSERT -#endif - - #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] - -#endif // ICEASSERT_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains custom assertion code. + * \file IceAssert.h + * \author Pierre Terdiman + * \date January, 14, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEASSERT_H +#define ICEASSERT_H + +// Leave the {} so that you can write this kind of things safely in release mode: +// if(condition) ASSERT() + +#ifndef ASSERT + #if defined( _DEBUG ) + FUNCTION ICECORE_API bool CustomAssertFunction(int, char*, int, char*, bool&); + + //! Custom ASSERT function. Various usages: + //! ASSERT(condition) + //! ASSERT(!"Not implemented") + //! ASSERT(condition && "error text") + #define ASSERT(exp) \ + { \ + static bool IgnoreAlways = false; \ + if(!IgnoreAlways) \ + { \ + if(CustomAssertFunction((int)(exp), #exp, __LINE__, __FILE__, IgnoreAlways)) \ + { \ + _asm { int 3 } \ + } \ + } \ + } + #else + #define ASSERT(exp) {} + #endif +#endif + +#ifndef assert + #define assert ASSERT +#endif + + #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] + +#endif // ICEASSERT_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceAxes.h b/Extras/CDTestFramework/Opcode/Ice/IceAxes.h index 98ede1ba0..37032dc8c 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceAxes.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceAxes.h @@ -1,70 +1,70 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains axes definition. - * \file IceAxes.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEAXES_H__ -#define __ICEAXES_H__ - - enum PointComponent - { - _X = 0, - _Y = 1, - _Z = 2, - _W = 3, - - _FORCE_DWORD = 0x7fffffff - }; - - enum AxisOrder - { - AXES_XYZ = (_X)|(_Y<<2)|(_Z<<4), - AXES_XZY = (_X)|(_Z<<2)|(_Y<<4), - AXES_YXZ = (_Y)|(_X<<2)|(_Z<<4), - AXES_YZX = (_Y)|(_Z<<2)|(_X<<4), - AXES_ZXY = (_Z)|(_X<<2)|(_Y<<4), - AXES_ZYX = (_Z)|(_Y<<2)|(_X<<4), - - AXES_FORCE_DWORD = 0x7fffffff - }; - - class ICEMATHS_API Axes - { - public: - - inline_ Axes(AxisOrder order) - { - mAxis0 = (order ) & 3; - mAxis1 = (order>>2) & 3; - mAxis2 = (order>>4) & 3; - } - inline_ ~Axes() {} - - udword mAxis0; - udword mAxis1; - udword mAxis2; - }; - -#endif // __ICEAXES_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains axes definition. + * \file IceAxes.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEAXES_H__ +#define __ICEAXES_H__ + + enum PointComponent + { + _X = 0, + _Y = 1, + _Z = 2, + _W = 3, + + _FORCE_DWORD = 0x7fffffff + }; + + enum AxisOrder + { + AXES_XYZ = (_X)|(_Y<<2)|(_Z<<4), + AXES_XZY = (_X)|(_Z<<2)|(_Y<<4), + AXES_YXZ = (_Y)|(_X<<2)|(_Z<<4), + AXES_YZX = (_Y)|(_Z<<2)|(_X<<4), + AXES_ZXY = (_Z)|(_X<<2)|(_Y<<4), + AXES_ZYX = (_Z)|(_Y<<2)|(_X<<4), + + AXES_FORCE_DWORD = 0x7fffffff + }; + + class ICEMATHS_API Axes + { + public: + + inline_ Axes(AxisOrder order) + { + mAxis0 = (order ) & 3; + mAxis1 = (order>>2) & 3; + mAxis2 = (order>>4) & 3; + } + inline_ ~Axes() {} + + udword mAxis0; + udword mAxis1; + udword mAxis2; + }; + +#endif // __ICEAXES_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp b/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp index d63990d66..1ec64c3b9 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp @@ -1,73 +1,73 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for bit arrays. - * \file IceBitArray.cpp - * \author Pierre Terdiman - * \date February, 5, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A simple array of bits stored as bytes. - * - * \class Container - * \author Pierre Terdiman - * \version 1.0 - * \date February, 5, 2000 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "StdAfx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BitArray::BitArray() : mSize(0), mBits(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BitArray::BitArray(udword nb_bits) : mSize(0), mBits(null) -{ - Init(nb_bits); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BitArray::~BitArray() -{ - ICE_FREE(mBits); - mSize = 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes the bit array for a given number of entries - * \param nb_bits [in] max number of entries in the array - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool BitArray::Init(udword nb_bits) -{ - mSize = BitsToDwords(nb_bits); - // Get ram for n bits - ICE_FREE(mBits); - mBits = (udword*)ICE_ALLOC(sizeof(udword)*mSize); - // Set all bits to 0 - ClearAll(); - return true; -} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for bit arrays. + * \file IceBitArray.cpp + * \author Pierre Terdiman + * \date February, 5, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A simple array of bits stored as bytes. + * + * \class Container + * \author Pierre Terdiman + * \version 1.0 + * \date February, 5, 2000 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BitArray::BitArray() : mSize(0), mBits(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BitArray::BitArray(udword nb_bits) : mSize(0), mBits(null) +{ + Init(nb_bits); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BitArray::~BitArray() +{ + ICE_FREE(mBits); + mSize = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes the bit array for a given number of entries + * \param nb_bits [in] max number of entries in the array + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool BitArray::Init(udword nb_bits) +{ + mSize = BitsToDwords(nb_bits); + // Get ram for n bits + ICE_FREE(mBits); + mBits = (udword*)ICE_ALLOC(sizeof(udword)*mSize); + // Set all bits to 0 + ClearAll(); + return true; +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h b/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h index 518776e96..60c60be49 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h @@ -1,82 +1,82 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for bit arrays. - * \file IceBitArray.h - * \author Pierre Terdiman - * \date February, 5, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICEBITARRAY_H -#define ICEBITARRAY_H - - inline_ udword BitsToBytes(udword nb_bits) - { - return (nb_bits>>3) + ((nb_bits&7) ? 1 : 0); - } - - inline_ udword BitsToDwords(udword nb_bits) - { - return (nb_bits>>5) + ((nb_bits&31) ? 1 : 0); - } - - // Use that one instead of an array of bools. Takes less ram, nearly as fast [no bounds checkings and so on]. - class ICECORE_API BitArray - { - public: - //! Constructor - BitArray(); - BitArray(udword nb_bits); - //! Destructor - ~BitArray(); - - bool Init(udword nb_bits); - - // Data management - inline_ void SetBit(udword bit_number) { mBits[bit_number>>5] |= 1<<(bit_number&31); } - inline_ void ClearBit(udword bit_number) { mBits[bit_number>>5] &= ~(1<<(bit_number&31)); } - inline_ void ToggleBit(udword bit_number) { mBits[bit_number>>5] ^= 1<<(bit_number&31); } - - inline_ void ClearAll() { ZeroMemory(mBits, mSize*4); } - inline_ void SetAll() { FillMemory(mBits, mSize*4, 0xff); } - - // Data access - inline_ BOOL IsSet(udword bit_number) const { return mBits[bit_number>>5] & (1<<(bit_number&31)); } - - inline_ const udword* GetBits() const { return mBits; } - inline_ udword GetSize() const { return mSize; } - - protected: - udword* mBits; //!< Array of bits - udword mSize; //!< Size of the array in dwords - }; - - // - We consider square symmetric N*N matrices - // - A N*N symmetric matrix has N(N+1)/2 elements - // - A boolean version needs N(N+1)/16 bytes - // N NbBits NbBytes - // 4 10 - - // 8 36 4.5 - // 16 136 17 <= the one we select - // 32 528 66 - static ubyte BitMasks[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; - static ubyte NegBitMasks[] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F }; - class ICECORE_API BoolSquareSymmetricMatrix16 - { - public: - inline_ udword Index(udword x, udword y) const { if(x>y) Swap(x,y); return x + (y ? ((y-1)*y)>>1 : 0); } - - inline_ void Set(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] |= BitMasks[i&7]; } - inline_ void Clear(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] &= NegBitMasks[i&7]; } - inline_ void Toggle(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] ^= BitMasks[i&7]; } - inline_ bool IsSet(udword x, udword y) const { udword i = Index(x, y); return (mBits[i>>3] & BitMasks[i&7])!=0; } - - inline_ void ClearAll() { ZeroMemory(mBits, 17); } - inline_ void SetAll() { FillMemory(mBits, 17, 0xff); } - - ubyte mBits[17]; - }; - -#endif // ICEBITARRAY_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for bit arrays. + * \file IceBitArray.h + * \author Pierre Terdiman + * \date February, 5, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEBITARRAY_H +#define ICEBITARRAY_H + + inline_ udword BitsToBytes(udword nb_bits) + { + return (nb_bits>>3) + ((nb_bits&7) ? 1 : 0); + } + + inline_ udword BitsToDwords(udword nb_bits) + { + return (nb_bits>>5) + ((nb_bits&31) ? 1 : 0); + } + + // Use that one instead of an array of bools. Takes less ram, nearly as fast [no bounds checkings and so on]. + class ICECORE_API BitArray + { + public: + //! Constructor + BitArray(); + BitArray(udword nb_bits); + //! Destructor + ~BitArray(); + + bool Init(udword nb_bits); + + // Data management + inline_ void SetBit(udword bit_number) { mBits[bit_number>>5] |= 1<<(bit_number&31); } + inline_ void ClearBit(udword bit_number) { mBits[bit_number>>5] &= ~(1<<(bit_number&31)); } + inline_ void ToggleBit(udword bit_number) { mBits[bit_number>>5] ^= 1<<(bit_number&31); } + + inline_ void ClearAll() { ZeroMemory(mBits, mSize*4); } + inline_ void SetAll() { FillMemory(mBits, mSize*4, 0xff); } + + // Data access + inline_ BOOL IsSet(udword bit_number) const { return mBits[bit_number>>5] & (1<<(bit_number&31)); } + + inline_ const udword* GetBits() const { return mBits; } + inline_ udword GetSize() const { return mSize; } + + protected: + udword* mBits; //!< Array of bits + udword mSize; //!< Size of the array in dwords + }; + + // - We consider square symmetric N*N matrices + // - A N*N symmetric matrix has N(N+1)/2 elements + // - A boolean version needs N(N+1)/16 bytes + // N NbBits NbBytes + // 4 10 - + // 8 36 4.5 + // 16 136 17 <= the one we select + // 32 528 66 + static ubyte BitMasks[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; + static ubyte NegBitMasks[] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F }; + class ICECORE_API BoolSquareSymmetricMatrix16 + { + public: + inline_ udword Index(udword x, udword y) const { if(x>y) Swap(x,y); return x + (y ? ((y-1)*y)>>1 : 0); } + + inline_ void Set(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] |= BitMasks[i&7]; } + inline_ void Clear(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] &= NegBitMasks[i&7]; } + inline_ void Toggle(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] ^= BitMasks[i&7]; } + inline_ bool IsSet(udword x, udword y) const { udword i = Index(x, y); return (mBits[i>>3] & BitMasks[i&7])!=0; } + + inline_ void ClearAll() { ZeroMemory(mBits, 17); } + inline_ void SetAll() { FillMemory(mBits, 17, 0xff); } + + ubyte mBits[17]; + }; + +#endif // ICEBITARRAY_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h b/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h index a6c9bb8cb..053f0075c 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h @@ -1,158 +1,158 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code to compute the minimal bounding sphere. - * \file IceBoundingSphere.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEBOUNDINGSPHERE_H__ -#define __ICEBOUNDINGSPHERE_H__ - - enum BSphereMethod - { - BS_NONE, - BS_GEMS, - BS_MINIBALL, - - BS_FORCE_DWORD = 0x7fffffff - }; - - class ICEMATHS_API Sphere - { - public: - //! Constructor - inline_ Sphere() {} - //! Constructor - inline_ Sphere(const Point& center, float radius) : mCenter(center), mRadius(radius) {} - //! Constructor - Sphere(udword nb_verts, const Point* verts); - //! Copy constructor - inline_ Sphere(const Sphere& sphere) : mCenter(sphere.mCenter), mRadius(sphere.mRadius) {} - //! Destructor - inline_ ~Sphere() {} - - BSphereMethod Compute(udword nb_verts, const Point* verts); - bool FastCompute(udword nb_verts, const Point* verts); - - // Access methods - inline_ const Point& GetCenter() const { return mCenter; } - inline_ float GetRadius() const { return mRadius; } - - inline_ const Point& Center() const { return mCenter; } - inline_ float Radius() const { return mRadius; } - - inline_ Sphere& Set(const Point& center, float radius) { mCenter = center; mRadius = radius; return *this; } - inline_ Sphere& SetCenter(const Point& center) { mCenter = center; return *this; } - inline_ Sphere& SetRadius(float radius) { mRadius = radius; return *this; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a point is contained within the sphere. - * \param p [in] the point to test - * \return true if inside the sphere - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Point& p) const - { - return mCenter.SquareDistance(p) <= mRadius*mRadius; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a sphere is contained within the sphere. - * \param sphere [in] the sphere to test - * \return true if inside the sphere - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Sphere& sphere) const - { - // If our radius is the smallest, we can't possibly contain the other sphere - if(mRadius < sphere.mRadius) return false; - // So r is always positive or null now - float r = mRadius - sphere.mRadius; - return mCenter.SquareDistance(sphere.mCenter) <= r*r; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a box is contained within the sphere. - * \param aabb [in] the box to test - * \return true if inside the sphere - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Contains(const AABB& aabb) const - { - // I assume if all 8 box vertices are inside the sphere, so does the whole box. - // Sounds ok but maybe there's a better way? - float R2 = mRadius * mRadius; -#ifdef USE_MIN_MAX - const Point& Max = ((ShadowAABB&)&aabb).mMax; - const Point& Min = ((ShadowAABB&)&aabb).mMin; -#else - Point Max; aabb.GetMax(Max); - Point Min; aabb.GetMin(Min); -#endif - Point p; - p.x=Max.x; p.y=Max.y; p.z=Max.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Max.x; p.y=Max.y; p.z=Min.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if the sphere intersects another sphere - * \param sphere [in] the other sphere - * \return true if spheres overlap - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Intersect(const Sphere& sphere) const - { - float r = mRadius + sphere.mRadius; - return mCenter.SquareDistance(sphere.mCenter) <= r*r; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the sphere is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for spheres: Radius >= 0.0f - if(mRadius < 0.0f) return FALSE; - return TRUE; - } - public: - Point mCenter; //!< Sphere center - float mRadius; //!< Sphere radius - }; - -#endif // __ICEBOUNDINGSPHERE_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code to compute the minimal bounding sphere. + * \file IceBoundingSphere.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEBOUNDINGSPHERE_H__ +#define __ICEBOUNDINGSPHERE_H__ + + enum BSphereMethod + { + BS_NONE, + BS_GEMS, + BS_MINIBALL, + + BS_FORCE_DWORD = 0x7fffffff + }; + + class ICEMATHS_API Sphere + { + public: + //! Constructor + inline_ Sphere() {} + //! Constructor + inline_ Sphere(const Point& center, float radius) : mCenter(center), mRadius(radius) {} + //! Constructor + Sphere(udword nb_verts, const Point* verts); + //! Copy constructor + inline_ Sphere(const Sphere& sphere) : mCenter(sphere.mCenter), mRadius(sphere.mRadius) {} + //! Destructor + inline_ ~Sphere() {} + + BSphereMethod Compute(udword nb_verts, const Point* verts); + bool FastCompute(udword nb_verts, const Point* verts); + + // Access methods + inline_ const Point& GetCenter() const { return mCenter; } + inline_ float GetRadius() const { return mRadius; } + + inline_ const Point& Center() const { return mCenter; } + inline_ float Radius() const { return mRadius; } + + inline_ Sphere& Set(const Point& center, float radius) { mCenter = center; mRadius = radius; return *this; } + inline_ Sphere& SetCenter(const Point& center) { mCenter = center; return *this; } + inline_ Sphere& SetRadius(float radius) { mRadius = radius; return *this; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a point is contained within the sphere. + * \param p [in] the point to test + * \return true if inside the sphere + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Point& p) const + { + return mCenter.SquareDistance(p) <= mRadius*mRadius; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a sphere is contained within the sphere. + * \param sphere [in] the sphere to test + * \return true if inside the sphere + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Sphere& sphere) const + { + // If our radius is the smallest, we can't possibly contain the other sphere + if(mRadius < sphere.mRadius) return false; + // So r is always positive or null now + float r = mRadius - sphere.mRadius; + return mCenter.SquareDistance(sphere.mCenter) <= r*r; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a box is contained within the sphere. + * \param aabb [in] the box to test + * \return true if inside the sphere + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Contains(const AABB& aabb) const + { + // I assume if all 8 box vertices are inside the sphere, so does the whole box. + // Sounds ok but maybe there's a better way? + float R2 = mRadius * mRadius; +#ifdef USE_MIN_MAX + const Point& Max = ((ShadowAABB&)&aabb).mMax; + const Point& Min = ((ShadowAABB&)&aabb).mMin; +#else + Point Max; aabb.GetMax(Max); + Point Min; aabb.GetMin(Min); +#endif + Point p; + p.x=Max.x; p.y=Max.y; p.z=Max.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Max.x; p.y=Max.y; p.z=Min.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if the sphere intersects another sphere + * \param sphere [in] the other sphere + * \return true if spheres overlap + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Intersect(const Sphere& sphere) const + { + float r = mRadius + sphere.mRadius; + return mCenter.SquareDistance(sphere.mCenter) <= r*r; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the sphere is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for spheres: Radius >= 0.0f + if(mRadius < 0.0f) return FALSE; + return TRUE; + } + public: + Point mCenter; //!< Sphere center + float mRadius; //!< Sphere radius + }; + +#endif // __ICEBOUNDINGSPHERE_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp b/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp index 8e7ba2262..2c3e9ac8c 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp @@ -1,423 +1,423 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a simple container class. - * \file IceContainer.cpp - * \author Pierre Terdiman - * \date February, 5, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a list of 32-bits values. - * Use this class when you need to store an unknown number of values. The list is automatically - * resized and can contains 32-bits entities (dwords or floats) - * - * \class Container - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "StdAfx.h" - -using namespace Opcode; - -// Static members -#ifdef CONTAINER_STATS -udword Container::mNbContainers = 0; -udword Container::mUsedRam = 0; -LinkedList Container::mContainers; -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. No entries allocated there. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container() : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); - mContainers.AddElem(this); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. Also allocates a given number of entries. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container(udword size, float growth_factor) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null) -{ - SetGrowthFactor(growth_factor); -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); - mContainers.AddElem(this); -#endif - SetSize(size); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Copy constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container(const Container& object) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); - mContainers.AddElem(this); -#endif - *this = object; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. Frees everything and leaves. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::~Container() -{ - Empty(); -#ifdef CONTAINER_STATS - mNbContainers--; - mUsedRam-=GetUsedRam(); - mContainers.RemElem(this); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes the container so that it uses an external memory buffer. The container doesn't own the memory, resizing is disabled. - * \param max_entries [in] max number of entries in the container - * \param entries [in] external memory buffer - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Container::InitSharedBuffers(udword max_entries, udword* entries) -{ - Empty(); // Make sure everything has been released - mMaxNbEntries = max_entries; - mEntries = entries; - mGrowthFactor = -1.0f; // Negative growth ==> resize is disabled -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Clears the container. All stored values are deleted, and it frees used ram. - * \see Reset() - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container& Container::Empty() -{ -#ifdef CONTAINER_STATS - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - if(mGrowthFactor>=0.0f) ICE_FREE(mEntries); // Release memory if we own it - mCurNbEntries = mMaxNbEntries = 0; - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Resizes the container. - * \param needed [in] assume the container can be added at least "needed" values - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Container::Resize(udword needed) -{ - // Check growth is allowed - if(mGrowthFactor<=0.0f) - { - ASSERT(!"Invalid operation - trying to resize a static buffer!"); - return false; - } - -#ifdef CONTAINER_STATS - // Subtract previous amount of bytes - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - - // Get more entries - mMaxNbEntries = mMaxNbEntries ? udword(float(mMaxNbEntries)*mGrowthFactor) : 2; // Default nb Entries = 2 - if(mMaxNbEntriesshrink(mEntries, sizeof(udword)*mCurNbEntries)) - return false; - -#ifdef CONTAINER_STATS - // Subtract previous amount of bytes - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - - // Get just enough entries - mMaxNbEntries = mCurNbEntries; - -#ifdef CONTAINER_STATS - // Add current amount of bytes - mUsedRam+=mMaxNbEntries*sizeof(udword); -#endif - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the container already contains a given value. - * \param entry [in] the value to look for in the container - * \param location [out] a possible pointer to store the entry location - * \see Add(udword entry) - * \see Add(float entry) - * \see Empty() - * \return true if the value has been found in the container, else false. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Container::Contains(udword entry, udword* location) const -{ - // Look for the entry - for(udword i=0;i resize is disabled +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container& Container::Empty() +{ +#ifdef CONTAINER_STATS + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + if(mGrowthFactor>=0.0f) ICE_FREE(mEntries); // Release memory if we own it + mCurNbEntries = mMaxNbEntries = 0; + return *this; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Resizes the container. + * \param needed [in] assume the container can be added at least "needed" values + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Container::Resize(udword needed) +{ + // Check growth is allowed + if(mGrowthFactor<=0.0f) + { + ASSERT(!"Invalid operation - trying to resize a static buffer!"); + return false; + } + +#ifdef CONTAINER_STATS + // Subtract previous amount of bytes + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + + // Get more entries + mMaxNbEntries = mMaxNbEntries ? udword(float(mMaxNbEntries)*mGrowthFactor) : 2; // Default nb Entries = 2 + if(mMaxNbEntriesshrink(mEntries, sizeof(udword)*mCurNbEntries)) + return false; + +#ifdef CONTAINER_STATS + // Subtract previous amount of bytes + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + + // Get just enough entries + mMaxNbEntries = mCurNbEntries; + +#ifdef CONTAINER_STATS + // Add current amount of bytes + mUsedRam+=mMaxNbEntries*sizeof(udword); +#endif + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the container already contains a given value. + * \param entry [in] the value to look for in the container + * \param location [out] a possible pointer to store the entry location + * \see Add(udword entry) + * \see Add(float entry) + * \see Empty() + * \return true if the value has been found in the container, else false. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Container::Contains(udword entry, udword* location) const +{ + // Look for the entry + for(udword i=0;imMaxNbEntries) Resize(nb); - - // Add new entry - CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); - mCurNbEntries += nb; - } - return *this; - } - - inline_ Container& Add(const Container& container) - { - return Add(container.GetEntries(), container.GetNbEntries()); - } - - inline_ udword* Reserve(udword nb) - { - // Resize if needed - if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); - - // We expect the user to fill reserved memory with 'nb' udwords - udword* Reserved = &mEntries[mCurNbEntries]; - - // Meanwhile, we do as if it had been filled - mCurNbEntries += nb; - - // This is mainly used to avoid the copy when possible - return Reserved; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * A O(1) method to add a value in the container. The container is automatically resized if needed. - * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation - * costs a lot more than the call overhead... - * - * \param entry [in] a float to store in the container - * \see Add(udword entry) - * \see Empty() - * \see Contains(udword entry) - * \return Self-Reference - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ Container& Add(float entry) - { - // Resize if needed - if(mCurNbEntries==mMaxNbEntries) Resize(); - - // Add new entry - mEntries[mCurNbEntries++] = IR(entry); - return *this; - } - - inline_ Container& Add(const float* entries, udword nb) - { - // Resize if needed - if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); - - // Add new entry - CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); - mCurNbEntries+=nb; - return *this; - } - - //! Add unique [slow] - inline_ Container& AddUnique(udword entry) - { - if(!Contains(entry)) Add(entry); - return *this; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Clears the container. All stored values are deleted, and it frees used ram. - * \see Reset() - * \return Self-Reference - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - Container& Empty(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. - * That's a kind of temporal coherence. - * \see Empty() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Reset() - { - // Avoid the write if possible - // ### CMOV - if(mCurNbEntries) mCurNbEntries = 0; - } - - // HANDLE WITH CARE - I hope you know what you're doing - inline_ void ForceSize(udword size) - { - mCurNbEntries = size; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Sets the initial size of the container. If it already contains something, it's discarded. - * \param nb [in] Number of entries - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetSize(udword nb); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the container and get rid of unused bytes. - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Refit(); - - bool Shrink(); - - // Checks whether the container already contains a given value. - bool Contains(udword entry, udword* location=null) const; - // Deletes an entry - doesn't preserve insertion order. - bool Delete(udword entry); - // Deletes an entry - does preserve insertion order. - bool DeleteKeepingOrder(udword entry); - //! Deletes the very last entry. - inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } - //! Deletes the entry whose index is given - inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } - - // Helpers - Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); - Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); - // Data access. - inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. - inline_ udword GetMaxNbEntries() const { return mMaxNbEntries; } //!< Returns max number of entries before resizing. - inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry. - inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. - - inline_ udword GetFirst() const { return mEntries[0]; } - inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } - - // Growth control - float GetGrowthFactor() const; //!< Returns the growth factor - void SetGrowthFactor(float growth); //!< Sets the growth factor - inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full - inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty - - //! Read-access as an array - inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && imMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); + mCurNbEntries += nb; + } + return *this; + } + + inline_ Container& Add(const Container& container) + { + return Add(container.GetEntries(), container.GetNbEntries()); + } + + inline_ udword* Reserve(udword nb) + { + // Resize if needed + if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); + + // We expect the user to fill reserved memory with 'nb' udwords + udword* Reserved = &mEntries[mCurNbEntries]; + + // Meanwhile, we do as if it had been filled + mCurNbEntries += nb; + + // This is mainly used to avoid the copy when possible + return Reserved; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * A O(1) method to add a value in the container. The container is automatically resized if needed. + * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation + * costs a lot more than the call overhead... + * + * \param entry [in] a float to store in the container + * \see Add(udword entry) + * \see Empty() + * \see Contains(udword entry) + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ Container& Add(float entry) + { + // Resize if needed + if(mCurNbEntries==mMaxNbEntries) Resize(); + + // Add new entry + mEntries[mCurNbEntries++] = IR(entry); + return *this; + } + + inline_ Container& Add(const float* entries, udword nb) + { + // Resize if needed + if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); + mCurNbEntries+=nb; + return *this; + } + + //! Add unique [slow] + inline_ Container& AddUnique(udword entry) + { + if(!Contains(entry)) Add(entry); + return *this; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Container& Empty(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. + * That's a kind of temporal coherence. + * \see Empty() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Reset() + { + // Avoid the write if possible + // ### CMOV + if(mCurNbEntries) mCurNbEntries = 0; + } + + // HANDLE WITH CARE - I hope you know what you're doing + inline_ void ForceSize(udword size) + { + mCurNbEntries = size; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Sets the initial size of the container. If it already contains something, it's discarded. + * \param nb [in] Number of entries + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetSize(udword nb); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the container and get rid of unused bytes. + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Refit(); + + bool Shrink(); + + // Checks whether the container already contains a given value. + bool Contains(udword entry, udword* location=null) const; + // Deletes an entry - doesn't preserve insertion order. + bool Delete(udword entry); + // Deletes an entry - does preserve insertion order. + bool DeleteKeepingOrder(udword entry); + //! Deletes the very last entry. + inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } + //! Deletes the entry whose index is given + inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } + + // Helpers + Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); + Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); + // Data access. + inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. + inline_ udword GetMaxNbEntries() const { return mMaxNbEntries; } //!< Returns max number of entries before resizing. + inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry. + inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. + + inline_ udword GetFirst() const { return mEntries[0]; } + inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } + + // Growth control + float GetGrowthFactor() const; //!< Returns the growth factor + void SetGrowthFactor(float growth); //!< Sets the growth factor + inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full + inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty + + //! Read-access as an array + inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && i>31); - return (float&)y; - } - - //! Computes 1.0f / sqrtf(x). - inline_ float frsqrt(float f) - { - float x = f * 0.5f; - udword y = 0x5f3759df - ((udword&)f >> 1); - // Iteration... - (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); - // Result - return (float&)y; - } - - //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. - inline_ float InvSqrt(const float& x) - { - udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; - float y = *(float*)&tmp; - return y * (1.47f - 0.47f * x * y * y); - } - - //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. - //! See http://www.magic-software.com/3DGEDInvSqrt.html - inline_ float RSqrt(float number) - { - long i; - float x2, y; - const float threehalfs = 1.5f; - - x2 = number * 0.5f; - y = number; - i = * (long *) &y; - i = 0x5f3759df - (i >> 1); - y = * (float *) &i; - y = y * (threehalfs - (x2 * y * y)); - - return y; - } - - //! TO BE DOCUMENTED - inline_ float fsqrt(float f) - { - udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; - // Iteration...? - // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; - // Result - return (float&)y; - } - - //! Returns the float ranged espilon value. - inline_ float fepsilon(float f) - { - udword b = (udword&)f & 0xff800000; - udword a = b | 0x00000001; - (float&)a -= (float&)b; - // Result - return (float&)a; - } - - //! Is the float valid ? - inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } - inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } - inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } - inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } - - inline_ bool IsValidFloat(float value) - { - if(IsNAN(value)) return false; - if(IsIndeterminate(value)) return false; - if(IsPlusInf(value)) return false; - if(IsMinusInf(value)) return false; - return true; - } - - #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); - -/* - //! FPU precision setting function. - inline_ void SetFPU() - { - // This function evaluates whether the floating-point - // control word is set to single precision/round to nearest/ - // exceptions disabled. If these conditions don't hold, the - // function changes the control word to set them and returns - // TRUE, putting the old control word value in the passback - // location pointed to by pwOldCW. - { - uword wTemp, wSave; - - __asm fstcw wSave - if (wSave & 0x300 || // Not single mode - 0x3f != (wSave & 0x3f) || // Exceptions enabled - wSave & 0xC00) // Not round to nearest mode - { - __asm - { - mov ax, wSave - and ax, not 300h ;; single mode - or ax, 3fh ;; disable all exceptions - and ax, not 0xC00 ;; round to nearest mode - mov wTemp, ax - fldcw wTemp - } - } - } - } -*/ - //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) - inline_ float ComputeFloatEpsilon() - { - float f = 1.0f; - ((udword&)f)^=1; - return f - 1.0f; // You can check it's the same as FLT_EPSILON - } - - inline_ bool IsFloatZero(float x, float epsilon=1e-6f) - { - return x*x < epsilon; - } - - #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 - #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 - #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 - #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 - - #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 - #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 - #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 - #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 - - #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 - #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 - #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 - #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 - - #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 - #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 - #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 - #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 - - #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 - #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 - #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 - #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 - - #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 - #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 - #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 - #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 - - #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 - #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 - #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 - #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 - - #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 - #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 - #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 - #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 - - //! A global function to find MAX(a,b) using FCOMI/FCMOV - inline_ float FCMax2(float a, float b) - { - float Res; - _asm fld [a] - _asm fld [b] - FCOMI_ST1 - FCMOVB_ST1 - _asm fstp [Res] - _asm fcomp - return Res; - } - - //! A global function to find MIN(a,b) using FCOMI/FCMOV - inline_ float FCMin2(float a, float b) - { - float Res; - _asm fld [a] - _asm fld [b] - FCOMI_ST1 - FCMOVNB_ST1 - _asm fstp [Res] - _asm fcomp - return Res; - } - - //! A global function to find MAX(a,b,c) using FCOMI/FCMOV - inline_ float FCMax3(float a, float b, float c) - { - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - FCOMI_ST1 - FCMOVB_ST1 - FCOMI_ST2 - FCMOVB_ST2 - _asm fstp [Res] - _asm fcompp - return Res; - } - - //! A global function to find MIN(a,b,c) using FCOMI/FCMOV - inline_ float FCMin3(float a, float b, float c) - { - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - FCOMI_ST1 - FCMOVNB_ST1 - FCOMI_ST2 - FCMOVNB_ST2 - _asm fstp [Res] - _asm fcompp - return Res; - } - - //! A global function to find MAX(a,b,c,d) using FCOMI/FCMOV - inline_ float FCMax4(float a, float b, float c, float d) - { - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - _asm fld [d] - FCOMI_ST1 - FCMOVB_ST1 - FCOMI_ST2 - FCMOVB_ST2 - FCOMI_ST3 - FCMOVB_ST3 - _asm fstp [Res] - _asm fcompp - _asm fcomp - return Res; - } - - //! A global function to find MIN(a,b,c,d) using FCOMI/FCMOV - inline_ float FCMin4(float a, float b, float c, float d) - { - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - _asm fld [d] - FCOMI_ST1 - FCMOVNB_ST1 - FCOMI_ST2 - FCMOVNB_ST2 - FCOMI_ST3 - FCMOVNB_ST3 - _asm fstp [Res] - _asm fcompp - _asm fcomp - return Res; - } - - inline_ int ConvertToSortable(float f) - { - int& Fi = (int&)f; - int Fmask = (Fi>>31); - Fi ^= Fmask; - Fmask &= ~(1<<31); - Fi -= Fmask; - return Fi; - } - - inline_ udword EncodeFloat(const float val) - { - // We may need to check on -0 and 0 - // But it should make no practical difference. - udword ir = IR(val); - - if(ir & 0x80000000) //negative? - ir = ~ir;//reverse sequence of negative numbers - else - ir |= 0x80000000; // flip sign - - return ir; - } - - inline_ float DecodeFloat(udword ir) - { - udword rv; - - if(ir & 0x80000000) //positive? - rv = ir & ~0x80000000; //flip sign - else - rv = ~ir; //undo reversal - - return FR(rv); - } - - enum FPUMode - { - FPU_FLOOR = 0, - FPU_CEIL = 1, - FPU_BEST = 2, - - FPU_FORCE_DWORD = 0x7fffffff - }; - - FUNCTION ICECORE_API FPUMode GetFPUMode(); - FUNCTION ICECORE_API void SaveFPU(); - FUNCTION ICECORE_API void RestoreFPU(); - FUNCTION ICECORE_API void SetFPUFloorMode(); - FUNCTION ICECORE_API void SetFPUCeilMode(); - FUNCTION ICECORE_API void SetFPUBestMode(); - - FUNCTION ICECORE_API void SetFPUPrecision24(); - FUNCTION ICECORE_API void SetFPUPrecision53(); - FUNCTION ICECORE_API void SetFPUPrecision64(); - FUNCTION ICECORE_API void SetFPURoundingChop(); - FUNCTION ICECORE_API void SetFPURoundingUp(); - FUNCTION ICECORE_API void SetFPURoundingDown(); - FUNCTION ICECORE_API void SetFPURoundingNear(); - - FUNCTION ICECORE_API int intChop(const float& f); - FUNCTION ICECORE_API int intFloor(const float& f); - FUNCTION ICECORE_API int intCeil(const float& f); - - inline_ sdword MyFloor(float f) - { - return (sdword)f - (IR(f)>>31); - } - - class ICECORE_API FPUGuard - { - public: - FPUGuard(); - ~FPUGuard(); - private: - uword mControlWord; - }; - -#endif // ICEFPU_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains FPU related code. + * \file IceFPU.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEFPU_H +#define ICEFPU_H + + #define SIGN_BITMASK 0x80000000 + + //! Integer representation of a floating-point value. + #define IR(x) ((udword&)(x)) + + //! Signed integer representation of a floating-point value. + #define SIR(x) ((sdword&)(x)) + + //! Absolute integer representation of a floating-point value + #define AIR(x) (IR(x)&0x7fffffff) + + //! Floating-point representation of an integer value. + #define FR(x) ((float&)(x)) + + //! Integer-based comparison of a floating point value. + //! Don't use it blindly, it can be faster or slower than the FPU comparison, depends on the context. + #define IS_NEGATIVE_FLOAT(x) (IR(x)&0x80000000) + + //! Checks 2 values have different signs + inline_ BOOL DifferentSign(float f0, float f1) + { + return (IR(f0)^IR(f1))&SIGN_BITMASK; + } + + //! Fast fabs for floating-point values. It just clears the sign bit. + //! Don't use it blindy, it can be faster or slower than the FPU comparison, depends on the context. + inline_ float FastFabs(float x) + { + udword FloatBits = IR(x)&0x7fffffff; + return FR(FloatBits); + } + + //! Fast square root for floating-point values. + inline_ float FastSqrt(float square) + { + float retval; + + __asm { + mov eax, square + sub eax, 0x3F800000 + sar eax, 1 + add eax, 0x3F800000 + mov [retval], eax + } + return retval; + } + + //! Saturates positive to zero. + inline_ float fsat(float f) + { + udword y = (udword&)f & ~((sdword&)f >>31); + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). + inline_ float frsqrt(float f) + { + float x = f * 0.5f; + udword y = 0x5f3759df - ((udword&)f >> 1); + // Iteration... + (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); + // Result + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. + inline_ float InvSqrt(const float& x) + { + udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; + float y = *(float*)&tmp; + return y * (1.47f - 0.47f * x * y * y); + } + + //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. + //! See http://www.magic-software.com/3DGEDInvSqrt.html + inline_ float RSqrt(float number) + { + long i; + float x2, y; + const float threehalfs = 1.5f; + + x2 = number * 0.5f; + y = number; + i = * (long *) &y; + i = 0x5f3759df - (i >> 1); + y = * (float *) &i; + y = y * (threehalfs - (x2 * y * y)); + + return y; + } + + //! TO BE DOCUMENTED + inline_ float fsqrt(float f) + { + udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; + // Iteration...? + // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; + // Result + return (float&)y; + } + + //! Returns the float ranged espilon value. + inline_ float fepsilon(float f) + { + udword b = (udword&)f & 0xff800000; + udword a = b | 0x00000001; + (float&)a -= (float&)b; + // Result + return (float&)a; + } + + //! Is the float valid ? + inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } + inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } + inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } + inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } + + inline_ bool IsValidFloat(float value) + { + if(IsNAN(value)) return false; + if(IsIndeterminate(value)) return false; + if(IsPlusInf(value)) return false; + if(IsMinusInf(value)) return false; + return true; + } + + #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); + +/* + //! FPU precision setting function. + inline_ void SetFPU() + { + // This function evaluates whether the floating-point + // control word is set to single precision/round to nearest/ + // exceptions disabled. If these conditions don't hold, the + // function changes the control word to set them and returns + // TRUE, putting the old control word value in the passback + // location pointed to by pwOldCW. + { + uword wTemp, wSave; + + __asm fstcw wSave + if (wSave & 0x300 || // Not single mode + 0x3f != (wSave & 0x3f) || // Exceptions enabled + wSave & 0xC00) // Not round to nearest mode + { + __asm + { + mov ax, wSave + and ax, not 300h ;; single mode + or ax, 3fh ;; disable all exceptions + and ax, not 0xC00 ;; round to nearest mode + mov wTemp, ax + fldcw wTemp + } + } + } + } +*/ + //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) + inline_ float ComputeFloatEpsilon() + { + float f = 1.0f; + ((udword&)f)^=1; + return f - 1.0f; // You can check it's the same as FLT_EPSILON + } + + inline_ bool IsFloatZero(float x, float epsilon=1e-6f) + { + return x*x < epsilon; + } + + #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 + #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 + #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 + #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 + + #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 + #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 + #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 + #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 + + #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 + #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 + #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 + #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 + + #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 + #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 + #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 + #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 + + #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 + #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 + #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 + #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 + + #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 + #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 + #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 + #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 + + #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 + #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 + #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 + #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 + + #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 + #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 + #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 + #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 + + //! A global function to find MAX(a,b) using FCOMI/FCMOV + inline_ float FCMax2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MIN(a,b) using FCOMI/FCMOV + inline_ float FCMin2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVNB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MAX(a,b,c) using FCOMI/FCMOV + inline_ float FCMax3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVB_ST1 + FCOMI_ST2 + FCMOVB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + //! A global function to find MIN(a,b,c) using FCOMI/FCMOV + inline_ float FCMin3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVNB_ST1 + FCOMI_ST2 + FCMOVNB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + //! A global function to find MAX(a,b,c,d) using FCOMI/FCMOV + inline_ float FCMax4(float a, float b, float c, float d) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + _asm fld [d] + FCOMI_ST1 + FCMOVB_ST1 + FCOMI_ST2 + FCMOVB_ST2 + FCOMI_ST3 + FCMOVB_ST3 + _asm fstp [Res] + _asm fcompp + _asm fcomp + return Res; + } + + //! A global function to find MIN(a,b,c,d) using FCOMI/FCMOV + inline_ float FCMin4(float a, float b, float c, float d) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + _asm fld [d] + FCOMI_ST1 + FCMOVNB_ST1 + FCOMI_ST2 + FCMOVNB_ST2 + FCOMI_ST3 + FCMOVNB_ST3 + _asm fstp [Res] + _asm fcompp + _asm fcomp + return Res; + } + + inline_ int ConvertToSortable(float f) + { + int& Fi = (int&)f; + int Fmask = (Fi>>31); + Fi ^= Fmask; + Fmask &= ~(1<<31); + Fi -= Fmask; + return Fi; + } + + inline_ udword EncodeFloat(const float val) + { + // We may need to check on -0 and 0 + // But it should make no practical difference. + udword ir = IR(val); + + if(ir & 0x80000000) //negative? + ir = ~ir;//reverse sequence of negative numbers + else + ir |= 0x80000000; // flip sign + + return ir; + } + + inline_ float DecodeFloat(udword ir) + { + udword rv; + + if(ir & 0x80000000) //positive? + rv = ir & ~0x80000000; //flip sign + else + rv = ~ir; //undo reversal + + return FR(rv); + } + + enum FPUMode + { + FPU_FLOOR = 0, + FPU_CEIL = 1, + FPU_BEST = 2, + + FPU_FORCE_DWORD = 0x7fffffff + }; + + FUNCTION ICECORE_API FPUMode GetFPUMode(); + FUNCTION ICECORE_API void SaveFPU(); + FUNCTION ICECORE_API void RestoreFPU(); + FUNCTION ICECORE_API void SetFPUFloorMode(); + FUNCTION ICECORE_API void SetFPUCeilMode(); + FUNCTION ICECORE_API void SetFPUBestMode(); + + FUNCTION ICECORE_API void SetFPUPrecision24(); + FUNCTION ICECORE_API void SetFPUPrecision53(); + FUNCTION ICECORE_API void SetFPUPrecision64(); + FUNCTION ICECORE_API void SetFPURoundingChop(); + FUNCTION ICECORE_API void SetFPURoundingUp(); + FUNCTION ICECORE_API void SetFPURoundingDown(); + FUNCTION ICECORE_API void SetFPURoundingNear(); + + FUNCTION ICECORE_API int intChop(const float& f); + FUNCTION ICECORE_API int intFloor(const float& f); + FUNCTION ICECORE_API int intCeil(const float& f); + + inline_ sdword MyFloor(float f) + { + return (sdword)f - (IR(f)>>31); + } + + class ICECORE_API FPUGuard + { + public: + FPUGuard(); + ~FPUGuard(); + private: + uword mControlWord; + }; + +#endif // ICEFPU_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp b/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp index 47bf81bc6..32d8e59bd 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp @@ -1,87 +1,87 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for homogeneous points. - * \file IceHPoint.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Homogeneous point. - * - * Use it: - * - for clipping in homogeneous space (standard way) - * - to differentiate between points (w=1) and vectors (w=0). - * - in some cases you can also use it instead of Point for padding reasons. - * - * \class HPoint - * \author Pierre Terdiman - * \version 1.0 - * \warning No cross-product in 4D. - * \warning HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Point Mul = HPoint * Matrix3x3; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Point HPoint::operator*(const Matrix3x3& mat) const -{ - return Point( - x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0], - x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1], - x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] ); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// HPoint Mul = HPoint * Matrix4x4; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HPoint HPoint::operator*(const Matrix4x4& mat) const -{ - return HPoint( - x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0], - x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1], - x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2], - x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// HPoint *= Matrix4x4 -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HPoint& HPoint::operator*=(const Matrix4x4& mat) -{ - float xp = x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0]; - float yp = x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1]; - float zp = x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2]; - float wp = x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]; - - x = xp; y = yp; z = zp; w = wp; - - return *this; -} - - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for homogeneous points. + * \file IceHPoint.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Homogeneous point. + * + * Use it: + * - for clipping in homogeneous space (standard way) + * - to differentiate between points (w=1) and vectors (w=0). + * - in some cases you can also use it instead of Point for padding reasons. + * + * \class HPoint + * \author Pierre Terdiman + * \version 1.0 + * \warning No cross-product in 4D. + * \warning HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Point Mul = HPoint * Matrix3x3; +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Point HPoint::operator*(const Matrix3x3& mat) const +{ + return Point( + x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0], + x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1], + x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HPoint Mul = HPoint * Matrix4x4; +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HPoint HPoint::operator*(const Matrix4x4& mat) const +{ + return HPoint( + x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0], + x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1], + x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2], + x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HPoint *= Matrix4x4 +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HPoint& HPoint::operator*=(const Matrix4x4& mat) +{ + float xp = x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0]; + float yp = x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1]; + float zp = x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2]; + float wp = x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]; + + x = xp; y = yp; z = zp; w = wp; + + return *this; +} + + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h b/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h index dc0c87318..b35ac9e6f 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h @@ -1,173 +1,173 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for homogeneous points. - * \file IceHPoint.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEHPOINT_H__ -#define __ICEHPOINT_H__ - - class ICEMATHS_API HPoint : public Point - { - public: - - //! Empty constructor - inline_ HPoint() {} - //! Constructor from floats - inline_ HPoint(float _x, float _y, float _z, float _w=0.0f) : Point(_x, _y, _z), w(_w) {} - //! Constructor from array - inline_ HPoint(const float f[4]) : Point(f), w(f[3]) {} - //! Constructor from a Point - inline_ HPoint(const Point& p, float _w=0.0f) : Point(p), w(_w) {} - //! Destructor - inline_ ~HPoint() {} - - //! Clear the point - inline_ HPoint& Zero() { x = y = z = w = 0.0f; return *this; } - - //! Assignment from values - inline_ HPoint& Set(float _x, float _y, float _z, float _w ) { x = _x; y = _y; z = _z; w = _w; return *this; } - //! Assignment from array - inline_ HPoint& Set(const float f[4]) { x = f[_X]; y = f[_Y]; z = f[_Z]; w = f[_W]; return *this; } - //! Assignment from another h-point - inline_ HPoint& Set(const HPoint& src) { x = src.x; y = src.y; z = src.z; w = src.w; return *this; } - - //! Add a vector - inline_ HPoint& Add(float _x, float _y, float _z, float _w ) { x += _x; y += _y; z += _z; w += _w; return *this; } - //! Add a vector - inline_ HPoint& Add(const float f[4]) { x += f[_X]; y += f[_Y]; z += f[_Z]; w += f[_W]; return *this; } - - //! Subtract a vector - inline_ HPoint& Sub(float _x, float _y, float _z, float _w ) { x -= _x; y -= _y; z -= _z; w -= _w; return *this; } - //! Subtract a vector - inline_ HPoint& Sub(const float f[4]) { x -= f[_X]; y -= f[_Y]; z -= f[_Z]; w -= f[_W]; return *this; } - - //! Multiplies by a scalar - inline_ HPoint& Mul(float s) { x *= s; y *= s; z *= s; w *= s; return *this; } - - //! Returns MIN(x, y, z, w); - float Min() const { return MIN(x, MIN(y, MIN(z, w))); } - //! Returns MAX(x, y, z, w); - float Max() const { return MAX(x, MAX(y, MAX(z, w))); } - //! Sets each element to be componentwise minimum - HPoint& Min(const HPoint& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); w = MIN(w, p.w); return *this; } - //! Sets each element to be componentwise maximum - HPoint& Max(const HPoint& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); w = MAX(w, p.w); return *this; } - - //! Computes square magnitude - inline_ float SquareMagnitude() const { return x*x + y*y + z*z + w*w; } - //! Computes magnitude - inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z + w*w); } - - //! Normalize the vector - inline_ HPoint& Normalize() - { - float M = Magnitude(); - if(M) - { - M = 1.0f / M; - x *= M; - y *= M; - z *= M; - w *= M; - } - return *this; - } - - // Arithmetic operators - //! Operator for HPoint Negate = - HPoint; - inline_ HPoint operator-() const { return HPoint(-x, -y, -z, -w); } - - //! Operator for HPoint Plus = HPoint + HPoint; - inline_ HPoint operator+(const HPoint& p) const { return HPoint(x + p.x, y + p.y, z + p.z, w + p.w); } - //! Operator for HPoint Minus = HPoint - HPoint; - inline_ HPoint operator-(const HPoint& p) const { return HPoint(x - p.x, y - p.y, z - p.z, w - p.w); } - - //! Operator for HPoint Mul = HPoint * HPoint; - inline_ HPoint operator*(const HPoint& p) const { return HPoint(x * p.x, y * p.y, z * p.z, w * p.w); } - //! Operator for HPoint Scale = HPoint * float; - inline_ HPoint operator*(float s) const { return HPoint(x * s, y * s, z * s, w * s); } - //! Operator for HPoint Scale = float * HPoint; - inline_ friend HPoint operator*(float s, const HPoint& p) { return HPoint(s * p.x, s * p.y, s * p.z, s * p.w); } - - //! Operator for HPoint Div = HPoint / HPoint; - inline_ HPoint operator/(const HPoint& p) const { return HPoint(x / p.x, y / p.y, z / p.z, w / p.w); } - //! Operator for HPoint Scale = HPoint / float; - inline_ HPoint operator/(float s) const { s = 1.0f / s; return HPoint(x * s, y * s, z * s, w * s); } - //! Operator for HPoint Scale = float / HPoint; - inline_ friend HPoint operator/(float s, const HPoint& p) { return HPoint(s / p.x, s / p.y, s / p.z, s / p.w); } - - //! Operator for float DotProd = HPoint | HPoint; - inline_ float operator|(const HPoint& p) const { return x*p.x + y*p.y + z*p.z + w*p.w; } - // No cross-product in 4D - - //! Operator for HPoint += HPoint; - inline_ HPoint& operator+=(const HPoint& p) { x += p.x; y += p.y; z += p.z; w += p.w; return *this; } - //! Operator for HPoint += float; - inline_ HPoint& operator+=(float s) { x += s; y += s; z += s; w += s; return *this; } - - //! Operator for HPoint -= HPoint; - inline_ HPoint& operator-=(const HPoint& p) { x -= p.x; y -= p.y; z -= p.z; w -= p.w; return *this; } - //! Operator for HPoint -= float; - inline_ HPoint& operator-=(float s) { x -= s; y -= s; z -= s; w -= s; return *this; } - - //! Operator for HPoint *= HPoint; - inline_ HPoint& operator*=(const HPoint& p) { x *= p.x; y *= p.y; z *= p.z; w *= p.w; return *this; } - //! Operator for HPoint *= float; - inline_ HPoint& operator*=(float s) { x*=s; y*=s; z*=s; w*=s; return *this; } - - //! Operator for HPoint /= HPoint; - inline_ HPoint& operator/=(const HPoint& p) { x /= p.x; y /= p.y; z /= p.z; w /= p.w; return *this; } - //! Operator for HPoint /= float; - inline_ HPoint& operator/=(float s) { s = 1.0f / s; x*=s; y*=s; z*=s; w*=s; return *this; } - - // Arithmetic operators - - //! Operator for Point Mul = HPoint * Matrix3x3; - Point operator*(const Matrix3x3& mat) const; - //! Operator for HPoint Mul = HPoint * Matrix4x4; - HPoint operator*(const Matrix4x4& mat) const; - - // HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 - //! Operator for HPoint *= Matrix4x4 - HPoint& operator*=(const Matrix4x4& mat); - - // Logical operators - - //! Operator for "if(HPoint==HPoint)" - inline_ bool operator==(const HPoint& p) const { return ( (x==p.x)&&(y==p.y)&&(z==p.z)&&(w==p.w)); } - //! Operator for "if(HPoint!=HPoint)" - inline_ bool operator!=(const HPoint& p) const { return ( (x!=p.x)||(y!=p.y)||(z!=p.z)||(w!=p.w)); } - - // Cast operators - - //! Cast a HPoint to a Point. w is discarded. - inline_ operator Point() const { return Point(x, y, z); } - - public: - float w; - }; - -#endif // __ICEHPOINT_H__ - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for homogeneous points. + * \file IceHPoint.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEHPOINT_H__ +#define __ICEHPOINT_H__ + + class ICEMATHS_API HPoint : public Point + { + public: + + //! Empty constructor + inline_ HPoint() {} + //! Constructor from floats + inline_ HPoint(float _x, float _y, float _z, float _w=0.0f) : Point(_x, _y, _z), w(_w) {} + //! Constructor from array + inline_ HPoint(const float f[4]) : Point(f), w(f[3]) {} + //! Constructor from a Point + inline_ HPoint(const Point& p, float _w=0.0f) : Point(p), w(_w) {} + //! Destructor + inline_ ~HPoint() {} + + //! Clear the point + inline_ HPoint& Zero() { x = y = z = w = 0.0f; return *this; } + + //! Assignment from values + inline_ HPoint& Set(float _x, float _y, float _z, float _w ) { x = _x; y = _y; z = _z; w = _w; return *this; } + //! Assignment from array + inline_ HPoint& Set(const float f[4]) { x = f[_X]; y = f[_Y]; z = f[_Z]; w = f[_W]; return *this; } + //! Assignment from another h-point + inline_ HPoint& Set(const HPoint& src) { x = src.x; y = src.y; z = src.z; w = src.w; return *this; } + + //! Add a vector + inline_ HPoint& Add(float _x, float _y, float _z, float _w ) { x += _x; y += _y; z += _z; w += _w; return *this; } + //! Add a vector + inline_ HPoint& Add(const float f[4]) { x += f[_X]; y += f[_Y]; z += f[_Z]; w += f[_W]; return *this; } + + //! Subtract a vector + inline_ HPoint& Sub(float _x, float _y, float _z, float _w ) { x -= _x; y -= _y; z -= _z; w -= _w; return *this; } + //! Subtract a vector + inline_ HPoint& Sub(const float f[4]) { x -= f[_X]; y -= f[_Y]; z -= f[_Z]; w -= f[_W]; return *this; } + + //! Multiplies by a scalar + inline_ HPoint& Mul(float s) { x *= s; y *= s; z *= s; w *= s; return *this; } + + //! Returns MIN(x, y, z, w); + float Min() const { return MIN(x, MIN(y, MIN(z, w))); } + //! Returns MAX(x, y, z, w); + float Max() const { return MAX(x, MAX(y, MAX(z, w))); } + //! Sets each element to be componentwise minimum + HPoint& Min(const HPoint& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); w = MIN(w, p.w); return *this; } + //! Sets each element to be componentwise maximum + HPoint& Max(const HPoint& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); w = MAX(w, p.w); return *this; } + + //! Computes square magnitude + inline_ float SquareMagnitude() const { return x*x + y*y + z*z + w*w; } + //! Computes magnitude + inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z + w*w); } + + //! Normalize the vector + inline_ HPoint& Normalize() + { + float M = Magnitude(); + if(M) + { + M = 1.0f / M; + x *= M; + y *= M; + z *= M; + w *= M; + } + return *this; + } + + // Arithmetic operators + //! Operator for HPoint Negate = - HPoint; + inline_ HPoint operator-() const { return HPoint(-x, -y, -z, -w); } + + //! Operator for HPoint Plus = HPoint + HPoint; + inline_ HPoint operator+(const HPoint& p) const { return HPoint(x + p.x, y + p.y, z + p.z, w + p.w); } + //! Operator for HPoint Minus = HPoint - HPoint; + inline_ HPoint operator-(const HPoint& p) const { return HPoint(x - p.x, y - p.y, z - p.z, w - p.w); } + + //! Operator for HPoint Mul = HPoint * HPoint; + inline_ HPoint operator*(const HPoint& p) const { return HPoint(x * p.x, y * p.y, z * p.z, w * p.w); } + //! Operator for HPoint Scale = HPoint * float; + inline_ HPoint operator*(float s) const { return HPoint(x * s, y * s, z * s, w * s); } + //! Operator for HPoint Scale = float * HPoint; + inline_ friend HPoint operator*(float s, const HPoint& p) { return HPoint(s * p.x, s * p.y, s * p.z, s * p.w); } + + //! Operator for HPoint Div = HPoint / HPoint; + inline_ HPoint operator/(const HPoint& p) const { return HPoint(x / p.x, y / p.y, z / p.z, w / p.w); } + //! Operator for HPoint Scale = HPoint / float; + inline_ HPoint operator/(float s) const { s = 1.0f / s; return HPoint(x * s, y * s, z * s, w * s); } + //! Operator for HPoint Scale = float / HPoint; + inline_ friend HPoint operator/(float s, const HPoint& p) { return HPoint(s / p.x, s / p.y, s / p.z, s / p.w); } + + //! Operator for float DotProd = HPoint | HPoint; + inline_ float operator|(const HPoint& p) const { return x*p.x + y*p.y + z*p.z + w*p.w; } + // No cross-product in 4D + + //! Operator for HPoint += HPoint; + inline_ HPoint& operator+=(const HPoint& p) { x += p.x; y += p.y; z += p.z; w += p.w; return *this; } + //! Operator for HPoint += float; + inline_ HPoint& operator+=(float s) { x += s; y += s; z += s; w += s; return *this; } + + //! Operator for HPoint -= HPoint; + inline_ HPoint& operator-=(const HPoint& p) { x -= p.x; y -= p.y; z -= p.z; w -= p.w; return *this; } + //! Operator for HPoint -= float; + inline_ HPoint& operator-=(float s) { x -= s; y -= s; z -= s; w -= s; return *this; } + + //! Operator for HPoint *= HPoint; + inline_ HPoint& operator*=(const HPoint& p) { x *= p.x; y *= p.y; z *= p.z; w *= p.w; return *this; } + //! Operator for HPoint *= float; + inline_ HPoint& operator*=(float s) { x*=s; y*=s; z*=s; w*=s; return *this; } + + //! Operator for HPoint /= HPoint; + inline_ HPoint& operator/=(const HPoint& p) { x /= p.x; y /= p.y; z /= p.z; w /= p.w; return *this; } + //! Operator for HPoint /= float; + inline_ HPoint& operator/=(float s) { s = 1.0f / s; x*=s; y*=s; z*=s; w*=s; return *this; } + + // Arithmetic operators + + //! Operator for Point Mul = HPoint * Matrix3x3; + Point operator*(const Matrix3x3& mat) const; + //! Operator for HPoint Mul = HPoint * Matrix4x4; + HPoint operator*(const Matrix4x4& mat) const; + + // HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 + //! Operator for HPoint *= Matrix4x4 + HPoint& operator*=(const Matrix4x4& mat); + + // Logical operators + + //! Operator for "if(HPoint==HPoint)" + inline_ bool operator==(const HPoint& p) const { return ( (x==p.x)&&(y==p.y)&&(z==p.z)&&(w==p.w)); } + //! Operator for "if(HPoint!=HPoint)" + inline_ bool operator!=(const HPoint& p) const { return ( (x!=p.x)||(y!=p.y)||(z!=p.z)||(w!=p.w)); } + + // Cast operators + + //! Cast a HPoint to a Point. w is discarded. + inline_ operator Point() const { return Point(x, y, z); } + + public: + float w; + }; + +#endif // __ICEHPOINT_H__ + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceHashing.h b/Extras/CDTestFramework/Opcode/Ice/IceHashing.h index 4ac1fd53d..45160f80d 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceHashing.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceHashing.h @@ -1,78 +1,78 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains hashing code. - * \file IceHashing.h - * \author Pierre Terdiman - * \date May, 08, 1999 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICEHASHING_H -#define ICEHASHING_H - - #define HashSize(n) ((udword)1<<(n)) - #define HashMask(n) (HashSize(n)-1) - - ICECORE_API udword Hash(const char* str); - ICECORE_API udword Hash(ubyte* k, udword length, udword initval); - - // Bob Jenkin's hash - inline_ unsigned int Hash32Bits_0(unsigned int key) - { - key += (key << 12); - key ^= (key >> 22); - key += (key << 4); - key ^= (key >> 9); - key += (key << 10); - key ^= (key >> 2); - key += (key << 7); - key ^= (key >> 12); - return key; - } - - // Thomas Wang's hash - inline_ int Hash32Bits_1(int key) - { - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } - - // Thomas Wang's hash - inline_ __int64 Hash64Bits_0(__int64 key) - { - key += ~(key << 32); - key ^= (key >> 22); - key += ~(key << 13); - key ^= (key >> 8); - key += (key << 3); - key ^= (key >> 15); - key += ~(key << 27); - key ^= (key >> 31); - return key; - } - - inline_ __int64 Hash64Bits_1(__int64 key) - { - __int64 c1 = 0x6e5ea73858134343L; - __int64 c2 = 0xb34e8f99a2ec9ef5L; - key ^= ((c1 ^ key) >> 32); - key *= c1; - key ^= ((c2 ^ key) >> 31); - key *= c2; - key ^= ((c1 ^ key) >> 32); - return key; - } - - inline_ udword Hash(udword id0, udword id1) - { - return Hash32Bits_1( (id0&0xffff)|(id1<<16) ); - } - -#endif // ICEHASHING_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains hashing code. + * \file IceHashing.h + * \author Pierre Terdiman + * \date May, 08, 1999 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEHASHING_H +#define ICEHASHING_H + + #define HashSize(n) ((udword)1<<(n)) + #define HashMask(n) (HashSize(n)-1) + + ICECORE_API udword Hash(const char* str); + ICECORE_API udword Hash(ubyte* k, udword length, udword initval); + + // Bob Jenkin's hash + inline_ unsigned int Hash32Bits_0(unsigned int key) + { + key += (key << 12); + key ^= (key >> 22); + key += (key << 4); + key ^= (key >> 9); + key += (key << 10); + key ^= (key >> 2); + key += (key << 7); + key ^= (key >> 12); + return key; + } + + // Thomas Wang's hash + inline_ int Hash32Bits_1(int key) + { + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; + } + + // Thomas Wang's hash + inline_ __int64 Hash64Bits_0(__int64 key) + { + key += ~(key << 32); + key ^= (key >> 22); + key += ~(key << 13); + key ^= (key >> 8); + key += (key << 3); + key ^= (key >> 15); + key += ~(key << 27); + key ^= (key >> 31); + return key; + } + + inline_ __int64 Hash64Bits_1(__int64 key) + { + __int64 c1 = 0x6e5ea73858134343L; + __int64 c2 = 0xb34e8f99a2ec9ef5L; + key ^= ((c1 ^ key) >> 32); + key *= c1; + key ^= ((c2 ^ key) >> 31); + key *= c2; + key ^= ((c1 ^ key) >> 32); + return key; + } + + inline_ udword Hash(udword id0, udword id1) + { + return Hash32Bits_1( (id0&0xffff)|(id1<<16) ); + } + +#endif // ICEHASHING_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp b/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp index f1eae9fb0..4657f08f8 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp @@ -1,564 +1,564 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy indexed triangle class. - * \file IceIndexedTriangle.cpp - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an indexed triangle class. - * - * \class Triangle - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Flips the winding order. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::Flip() -{ - Swap(mVRef[1], mVRef[2]); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle area. - * \param verts [in] the list of indexed vertices - * \return the area - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Area(const Point* verts) const -{ - if(!verts) return 0.0f; - const Point& p0 = verts[0]; - const Point& p1 = verts[1]; - const Point& p2 = verts[2]; - return ((p0-p1)^(p0-p2)).Magnitude() * 0.5f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle perimeter. - * \param verts [in] the list of indexed vertices - * \return the perimeter - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Perimeter(const Point* verts) const -{ - if(!verts) return 0.0f; - const Point& p0 = verts[0]; - const Point& p1 = verts[1]; - const Point& p2 = verts[2]; - return p0.Distance(p1) - + p0.Distance(p2) - + p1.Distance(p2); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle compacity. - * \param verts [in] the list of indexed vertices - * \return the compacity - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Compacity(const Point* verts) const -{ - if(!verts) return 0.0f; - float P = Perimeter(verts); - if(P==0.0f) return 0.0f; - return (4.0f*PI*Area(verts)/(P*P)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle normal. - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::Normal(const Point* verts, Point& normal) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - normal = ((p2-p1)^(p0-p1)).Normalize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle denormalized normal. - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::DenormalizedNormal(const Point* verts, Point& normal) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - normal = ((p2-p1)^(p0-p1)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle center. - * \param verts [in] the list of indexed vertices - * \param center [out] the computed center - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::Center(const Point* verts, Point& center) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - center = (p0+p1+p2)*INV3; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the centered normal - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed centered normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::CenteredNormal(const Point* verts, Point& normal) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - Point Center = (p0+p1+p2)*INV3; - normal = Center + ((p2-p1)^(p0-p1)).Normalize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a random point within the triangle. - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed centered normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::RandomPoint(const Point* verts, Point& random) const -{ - if(!verts) return; - - // Random barycentric coords - float Alpha = UnitRandomFloat(); - float Beta = UnitRandomFloat(); - float Gamma = UnitRandomFloat(); - float OneOverTotal = 1.0f / (Alpha + Beta + Gamma); - Alpha *= OneOverTotal; - Beta *= OneOverTotal; - Gamma *= OneOverTotal; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - random = Alpha*p0 + Beta*p1 + Gamma*p2; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes backface culling. - * \param verts [in] the list of indexed vertices - * \param source [in] source point (in local space) from which culling must be computed - * \return true if the triangle is visible from the source point - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::IsVisible(const Point* verts, const Point& source) const -{ - // Checkings - if(!verts) return false; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - - // Compute denormalized normal - Point Normal = (p2 - p1)^(p0 - p1); - - // Backface culling - return (Normal | source) >= 0.0f; - -// Same as: -// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); -// return PL.Distance(source) > PL.d; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes backface culling. - * \param verts [in] the list of indexed vertices - * \param source [in] source point (in local space) from which culling must be computed - * \return true if the triangle is visible from the source point - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::BackfaceCulling(const Point* verts, const Point& source) const -{ - // Checkings - if(!verts) return false; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - - // Compute base -// Point Base = (p0 + p1 + p2)*INV3; - - // Compute denormalized normal - Point Normal = (p2 - p1)^(p0 - p1); - - // Backface culling -// return (Normal | (source - Base)) >= 0.0f; - return (Normal | (source - p0)) >= 0.0f; - -// Same as: (but a bit faster) -// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); -// return PL.Distance(source)>0.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the occlusion potential of the triangle. - * \param verts [in] the list of indexed vertices - * \param source [in] source point (in local space) from which occlusion potential must be computed - * \return the occlusion potential - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::ComputeOcclusionPotential(const Point* verts, const Point& view) const -{ - if(!verts) return 0.0f; - // Occlusion potential: -(A * (N|V) / d^2) - // A = polygon area - // N = polygon normal - // V = view vector - // d = distance viewpoint-center of polygon - - float A = Area(verts); - Point N; Normal(verts, N); - Point C; Center(verts, C); - float d = view.Distance(C); - return -(A*(N|view))/(d*d); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Replaces a vertex reference with another one. - * \param oldref [in] the vertex reference to replace - * \param newref [in] the new vertex reference - * \return true if success, else false if the input vertex reference doesn't belong to the triangle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::ReplaceVertex(udword oldref, udword newref) -{ - if(mVRef[0]==oldref) { mVRef[0] = newref; return true; } - else if(mVRef[1]==oldref) { mVRef[1] = newref; return true; } - else if(mVRef[2]==oldref) { mVRef[2] = newref; return true; } - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the triangle is degenerate or not. A degenerate triangle has two common vertex references. This is a zero-area triangle. - * \return true if the triangle is degenerate - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::IsDegenerate() const -{ - if(mVRef[0]==mVRef[1]) return true; - if(mVRef[1]==mVRef[2]) return true; - if(mVRef[2]==mVRef[0]) return true; - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the input vertex reference belongs to the triangle or not. - * \param ref [in] the vertex reference to look for - * \return true if the triangle contains the vertex reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::HasVertex(udword ref) const -{ - if(mVRef[0]==ref) return true; - if(mVRef[1]==ref) return true; - if(mVRef[2]==ref) return true; - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the input vertex reference belongs to the triangle or not. - * \param ref [in] the vertex reference to look for - * \param index [out] the corresponding index in the triangle - * \return true if the triangle contains the vertex reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::HasVertex(udword ref, udword* index) const -{ - if(mVRef[0]==ref) { *index = 0; return true; } - if(mVRef[1]==ref) { *index = 1; return true; } - if(mVRef[2]==ref) { *index = 2; return true; } - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Finds an edge in a tri, given two vertex references. - * \param vref0 [in] the edge's first vertex reference - * \param vref1 [in] the edge's second vertex reference - * \return the edge number between 0 and 2, or 0xff if input refs are wrong. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -ubyte IndexedTriangle::FindEdge(udword vref0, udword vref1) const -{ - if(mVRef[0]==vref0 && mVRef[1]==vref1) return 0; - else if(mVRef[0]==vref1 && mVRef[1]==vref0) return 0; - else if(mVRef[0]==vref0 && mVRef[2]==vref1) return 1; - else if(mVRef[0]==vref1 && mVRef[2]==vref0) return 1; - else if(mVRef[1]==vref0 && mVRef[2]==vref1) return 2; - else if(mVRef[1]==vref1 && mVRef[2]==vref0) return 2; - return 0xff; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the last reference given the first two. - * \param vref0 [in] the first vertex reference - * \param vref1 [in] the second vertex reference - * \return the last reference, or INVALID_ID if input refs are wrong. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword IndexedTriangle::OppositeVertex(udword vref0, udword vref1) const -{ - if(mVRef[0]==vref0 && mVRef[1]==vref1) return mVRef[2]; - else if(mVRef[0]==vref1 && mVRef[1]==vref0) return mVRef[2]; - else if(mVRef[0]==vref0 && mVRef[2]==vref1) return mVRef[1]; - else if(mVRef[0]==vref1 && mVRef[2]==vref0) return mVRef[1]; - else if(mVRef[1]==vref0 && mVRef[2]==vref1) return mVRef[0]; - else if(mVRef[1]==vref1 && mVRef[2]==vref0) return mVRef[0]; - return INVALID_ID; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the three sorted vertex references according to an edge number. - * edgenb = 0 => edge 0-1, returns references 0, 1, 2 - * edgenb = 1 => edge 0-2, returns references 0, 2, 1 - * edgenb = 2 => edge 1-2, returns references 1, 2, 0 - * - * \param edgenb [in] the edge number, 0, 1 or 2 - * \param vref0 [out] the returned first vertex reference - * \param vref1 [out] the returned second vertex reference - * \param vref2 [out] the returned third vertex reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const -{ - if(edgenb==0) - { - vref0 = mVRef[0]; - vref1 = mVRef[1]; - vref2 = mVRef[2]; - } - else if(edgenb==1) - { - vref0 = mVRef[0]; - vref1 = mVRef[2]; - vref2 = mVRef[1]; - } - else if(edgenb==2) - { - vref0 = mVRef[1]; - vref1 = mVRef[2]; - vref2 = mVRef[0]; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's smallest edge length. - * \param verts [in] the list of indexed vertices - * \return the smallest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::MinEdgeLength(const Point* verts) const -{ - if(!verts) return 0.0f; - - float Min = MAX_FLOAT; - float Length01 = verts[0].Distance(verts[1]); - float Length02 = verts[0].Distance(verts[2]); - float Length12 = verts[1].Distance(verts[2]); - if(Length01 < Min) Min = Length01; - if(Length02 < Min) Min = Length02; - if(Length12 < Min) Min = Length12; - return Min; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's largest edge length. - * \param verts [in] the list of indexed vertices - * \return the largest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::MaxEdgeLength(const Point* verts) const -{ - if(!verts) return 0.0f; - - float Max = MIN_FLOAT; - float Length01 = verts[0].Distance(verts[1]); - float Length02 = verts[0].Distance(verts[2]); - float Length12 = verts[1].Distance(verts[2]); - if(Length01 > Max) Max = Length01; - if(Length02 > Max) Max = Length02; - if(Length12 > Max) Max = Length12; - return Max; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a point on the triangle according to the stabbing information. - * \param verts [in] the list of indexed vertices - * \param u,v [in] point's barycentric coordinates - * \param pt [out] point on triangle - * \param nearvtx [out] index of nearest vertex - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx) const -{ - // Checkings - if(!verts) return; - - // Get face in local or global space - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - - // Compute point coordinates - pt = (1.0f - u - v)*p0 + u*p1 + v*p2; - - // Compute nearest vertex if needed - if(nearvtx) - { - // Compute distance vector - Point d(p0.SquareDistance(pt), // Distance^2 from vertex 0 to point on the face - p1.SquareDistance(pt), // Distance^2 from vertex 1 to point on the face - p2.SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face - - // Get smallest distance - *nearvtx = mVRef[d.SmallestAxis()]; - } -} - - //************************************** - // Angle between two vectors (in radians) - // we use this formula - // uv = |u||v| cos(u,v) - // u ^ v = w - // |w| = |u||v| |sin(u,v)| - //************************************** - float Angle(const Point& u, const Point& v) - { - float NormU = u.Magnitude(); // |u| - float NormV = v.Magnitude(); // |v| - float Product = NormU*NormV; // |u||v| - if(Product==0.0f) return 0.0f; - float OneOverProduct = 1.0f / Product; - - // Cosinus - float Cosinus = (u|v) * OneOverProduct; - - // Sinus - Point w = u^v; - float NormW = w.Magnitude(); - - float AbsSinus = NormW * OneOverProduct; - - // Remove degeneracy - if(AbsSinus > 1.0f) AbsSinus = 1.0f; - if(AbsSinus < -1.0f) AbsSinus = -1.0f; - - if(Cosinus>=0.0f) return asinf(AbsSinus); - else return (PI-asinf(AbsSinus)); - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the angle between two triangles. - * \param tri [in] the other triangle - * \param verts [in] the list of indexed vertices - * \return the angle in radians - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Angle(const IndexedTriangle& tri, const Point* verts) const -{ - // Checkings - if(!verts) return 0.0f; - - // Compute face normals - Point n0, n1; - Normal(verts, n0); - tri.Normal(verts, n1); - - // Compute angle - float dp = n0|n1; - if(dp>1.0f) return 0.0f; - if(dp<-1.0f) return PI; - return acosf(dp); - -// return ::Angle(n0,n1); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks a triangle is the same as another one. - * \param tri [in] the other triangle - * \return true if same triangle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::Equal(const IndexedTriangle& tri) const -{ - // Test all vertex references - return (HasVertex(tri.mVRef[0]) && - HasVertex(tri.mVRef[1]) && - HasVertex(tri.mVRef[2])); -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy indexed triangle class. + * \file IceIndexedTriangle.cpp + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an indexed triangle class. + * + * \class Triangle + * \author Pierre Terdiman + * \version 1.0 + * \date 08.15.98 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Flips the winding order. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::Flip() +{ + Swap(mVRef[1], mVRef[2]); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle area. + * \param verts [in] the list of indexed vertices + * \return the area + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Area(const Point* verts) const +{ + if(!verts) return 0.0f; + const Point& p0 = verts[0]; + const Point& p1 = verts[1]; + const Point& p2 = verts[2]; + return ((p0-p1)^(p0-p2)).Magnitude() * 0.5f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle perimeter. + * \param verts [in] the list of indexed vertices + * \return the perimeter + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Perimeter(const Point* verts) const +{ + if(!verts) return 0.0f; + const Point& p0 = verts[0]; + const Point& p1 = verts[1]; + const Point& p2 = verts[2]; + return p0.Distance(p1) + + p0.Distance(p2) + + p1.Distance(p2); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle compacity. + * \param verts [in] the list of indexed vertices + * \return the compacity + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Compacity(const Point* verts) const +{ + if(!verts) return 0.0f; + float P = Perimeter(verts); + if(P==0.0f) return 0.0f; + return (4.0f*PI*Area(verts)/(P*P)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle normal. + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::Normal(const Point* verts, Point& normal) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + normal = ((p2-p1)^(p0-p1)).Normalize(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle denormalized normal. + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::DenormalizedNormal(const Point* verts, Point& normal) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + normal = ((p2-p1)^(p0-p1)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle center. + * \param verts [in] the list of indexed vertices + * \param center [out] the computed center + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::Center(const Point* verts, Point& center) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + center = (p0+p1+p2)*INV3; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the centered normal + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed centered normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::CenteredNormal(const Point* verts, Point& normal) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + Point Center = (p0+p1+p2)*INV3; + normal = Center + ((p2-p1)^(p0-p1)).Normalize(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a random point within the triangle. + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed centered normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::RandomPoint(const Point* verts, Point& random) const +{ + if(!verts) return; + + // Random barycentric coords + float Alpha = UnitRandomFloat(); + float Beta = UnitRandomFloat(); + float Gamma = UnitRandomFloat(); + float OneOverTotal = 1.0f / (Alpha + Beta + Gamma); + Alpha *= OneOverTotal; + Beta *= OneOverTotal; + Gamma *= OneOverTotal; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + random = Alpha*p0 + Beta*p1 + Gamma*p2; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes backface culling. + * \param verts [in] the list of indexed vertices + * \param source [in] source point (in local space) from which culling must be computed + * \return true if the triangle is visible from the source point + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::IsVisible(const Point* verts, const Point& source) const +{ + // Checkings + if(!verts) return false; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + + // Compute denormalized normal + Point Normal = (p2 - p1)^(p0 - p1); + + // Backface culling + return (Normal | source) >= 0.0f; + +// Same as: +// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); +// return PL.Distance(source) > PL.d; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes backface culling. + * \param verts [in] the list of indexed vertices + * \param source [in] source point (in local space) from which culling must be computed + * \return true if the triangle is visible from the source point + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::BackfaceCulling(const Point* verts, const Point& source) const +{ + // Checkings + if(!verts) return false; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + + // Compute base +// Point Base = (p0 + p1 + p2)*INV3; + + // Compute denormalized normal + Point Normal = (p2 - p1)^(p0 - p1); + + // Backface culling +// return (Normal | (source - Base)) >= 0.0f; + return (Normal | (source - p0)) >= 0.0f; + +// Same as: (but a bit faster) +// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); +// return PL.Distance(source)>0.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the occlusion potential of the triangle. + * \param verts [in] the list of indexed vertices + * \param source [in] source point (in local space) from which occlusion potential must be computed + * \return the occlusion potential + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::ComputeOcclusionPotential(const Point* verts, const Point& view) const +{ + if(!verts) return 0.0f; + // Occlusion potential: -(A * (N|V) / d^2) + // A = polygon area + // N = polygon normal + // V = view vector + // d = distance viewpoint-center of polygon + + float A = Area(verts); + Point N; Normal(verts, N); + Point C; Center(verts, C); + float d = view.Distance(C); + return -(A*(N|view))/(d*d); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Replaces a vertex reference with another one. + * \param oldref [in] the vertex reference to replace + * \param newref [in] the new vertex reference + * \return true if success, else false if the input vertex reference doesn't belong to the triangle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::ReplaceVertex(udword oldref, udword newref) +{ + if(mVRef[0]==oldref) { mVRef[0] = newref; return true; } + else if(mVRef[1]==oldref) { mVRef[1] = newref; return true; } + else if(mVRef[2]==oldref) { mVRef[2] = newref; return true; } + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the triangle is degenerate or not. A degenerate triangle has two common vertex references. This is a zero-area triangle. + * \return true if the triangle is degenerate + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::IsDegenerate() const +{ + if(mVRef[0]==mVRef[1]) return true; + if(mVRef[1]==mVRef[2]) return true; + if(mVRef[2]==mVRef[0]) return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the input vertex reference belongs to the triangle or not. + * \param ref [in] the vertex reference to look for + * \return true if the triangle contains the vertex reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::HasVertex(udword ref) const +{ + if(mVRef[0]==ref) return true; + if(mVRef[1]==ref) return true; + if(mVRef[2]==ref) return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the input vertex reference belongs to the triangle or not. + * \param ref [in] the vertex reference to look for + * \param index [out] the corresponding index in the triangle + * \return true if the triangle contains the vertex reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::HasVertex(udword ref, udword* index) const +{ + if(mVRef[0]==ref) { *index = 0; return true; } + if(mVRef[1]==ref) { *index = 1; return true; } + if(mVRef[2]==ref) { *index = 2; return true; } + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Finds an edge in a tri, given two vertex references. + * \param vref0 [in] the edge's first vertex reference + * \param vref1 [in] the edge's second vertex reference + * \return the edge number between 0 and 2, or 0xff if input refs are wrong. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ubyte IndexedTriangle::FindEdge(udword vref0, udword vref1) const +{ + if(mVRef[0]==vref0 && mVRef[1]==vref1) return 0; + else if(mVRef[0]==vref1 && mVRef[1]==vref0) return 0; + else if(mVRef[0]==vref0 && mVRef[2]==vref1) return 1; + else if(mVRef[0]==vref1 && mVRef[2]==vref0) return 1; + else if(mVRef[1]==vref0 && mVRef[2]==vref1) return 2; + else if(mVRef[1]==vref1 && mVRef[2]==vref0) return 2; + return 0xff; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the last reference given the first two. + * \param vref0 [in] the first vertex reference + * \param vref1 [in] the second vertex reference + * \return the last reference, or INVALID_ID if input refs are wrong. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword IndexedTriangle::OppositeVertex(udword vref0, udword vref1) const +{ + if(mVRef[0]==vref0 && mVRef[1]==vref1) return mVRef[2]; + else if(mVRef[0]==vref1 && mVRef[1]==vref0) return mVRef[2]; + else if(mVRef[0]==vref0 && mVRef[2]==vref1) return mVRef[1]; + else if(mVRef[0]==vref1 && mVRef[2]==vref0) return mVRef[1]; + else if(mVRef[1]==vref0 && mVRef[2]==vref1) return mVRef[0]; + else if(mVRef[1]==vref1 && mVRef[2]==vref0) return mVRef[0]; + return INVALID_ID; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the three sorted vertex references according to an edge number. + * edgenb = 0 => edge 0-1, returns references 0, 1, 2 + * edgenb = 1 => edge 0-2, returns references 0, 2, 1 + * edgenb = 2 => edge 1-2, returns references 1, 2, 0 + * + * \param edgenb [in] the edge number, 0, 1 or 2 + * \param vref0 [out] the returned first vertex reference + * \param vref1 [out] the returned second vertex reference + * \param vref2 [out] the returned third vertex reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const +{ + if(edgenb==0) + { + vref0 = mVRef[0]; + vref1 = mVRef[1]; + vref2 = mVRef[2]; + } + else if(edgenb==1) + { + vref0 = mVRef[0]; + vref1 = mVRef[2]; + vref2 = mVRef[1]; + } + else if(edgenb==2) + { + vref0 = mVRef[1]; + vref1 = mVRef[2]; + vref2 = mVRef[0]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's smallest edge length. + * \param verts [in] the list of indexed vertices + * \return the smallest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::MinEdgeLength(const Point* verts) const +{ + if(!verts) return 0.0f; + + float Min = MAX_FLOAT; + float Length01 = verts[0].Distance(verts[1]); + float Length02 = verts[0].Distance(verts[2]); + float Length12 = verts[1].Distance(verts[2]); + if(Length01 < Min) Min = Length01; + if(Length02 < Min) Min = Length02; + if(Length12 < Min) Min = Length12; + return Min; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's largest edge length. + * \param verts [in] the list of indexed vertices + * \return the largest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::MaxEdgeLength(const Point* verts) const +{ + if(!verts) return 0.0f; + + float Max = MIN_FLOAT; + float Length01 = verts[0].Distance(verts[1]); + float Length02 = verts[0].Distance(verts[2]); + float Length12 = verts[1].Distance(verts[2]); + if(Length01 > Max) Max = Length01; + if(Length02 > Max) Max = Length02; + if(Length12 > Max) Max = Length12; + return Max; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a point on the triangle according to the stabbing information. + * \param verts [in] the list of indexed vertices + * \param u,v [in] point's barycentric coordinates + * \param pt [out] point on triangle + * \param nearvtx [out] index of nearest vertex + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx) const +{ + // Checkings + if(!verts) return; + + // Get face in local or global space + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + + // Compute point coordinates + pt = (1.0f - u - v)*p0 + u*p1 + v*p2; + + // Compute nearest vertex if needed + if(nearvtx) + { + // Compute distance vector + Point d(p0.SquareDistance(pt), // Distance^2 from vertex 0 to point on the face + p1.SquareDistance(pt), // Distance^2 from vertex 1 to point on the face + p2.SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face + + // Get smallest distance + *nearvtx = mVRef[d.SmallestAxis()]; + } +} + + //************************************** + // Angle between two vectors (in radians) + // we use this formula + // uv = |u||v| cos(u,v) + // u ^ v = w + // |w| = |u||v| |sin(u,v)| + //************************************** + float Angle(const Point& u, const Point& v) + { + float NormU = u.Magnitude(); // |u| + float NormV = v.Magnitude(); // |v| + float Product = NormU*NormV; // |u||v| + if(Product==0.0f) return 0.0f; + float OneOverProduct = 1.0f / Product; + + // Cosinus + float Cosinus = (u|v) * OneOverProduct; + + // Sinus + Point w = u^v; + float NormW = w.Magnitude(); + + float AbsSinus = NormW * OneOverProduct; + + // Remove degeneracy + if(AbsSinus > 1.0f) AbsSinus = 1.0f; + if(AbsSinus < -1.0f) AbsSinus = -1.0f; + + if(Cosinus>=0.0f) return asinf(AbsSinus); + else return (PI-asinf(AbsSinus)); + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the angle between two triangles. + * \param tri [in] the other triangle + * \param verts [in] the list of indexed vertices + * \return the angle in radians + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Angle(const IndexedTriangle& tri, const Point* verts) const +{ + // Checkings + if(!verts) return 0.0f; + + // Compute face normals + Point n0, n1; + Normal(verts, n0); + tri.Normal(verts, n1); + + // Compute angle + float dp = n0|n1; + if(dp>1.0f) return 0.0f; + if(dp<-1.0f) return PI; + return acosf(dp); + +// return ::Angle(n0,n1); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks a triangle is the same as another one. + * \param tri [in] the other triangle + * \return true if same triangle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::Equal(const IndexedTriangle& tri) const +{ + // Test all vertex references + return (HasVertex(tri.mVRef[0]) && + HasVertex(tri.mVRef[1]) && + HasVertex(tri.mVRef[2])); +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h b/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h index fab6f9f94..3317a9b2c 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h @@ -1,84 +1,84 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy indexed triangle class. - * \file IceIndexedTriangle.h - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEINDEXEDTRIANGLE_H__ -#define __ICEINDEXEDTRIANGLE_H__ - - // Forward declarations - enum CubeIndex; - - // An indexed triangle class. - class ICEMATHS_API IndexedTriangle - { - public: - //! Constructor - inline_ IndexedTriangle() {} - //! Constructor - inline_ IndexedTriangle(udword r0, udword r1, udword r2) { mVRef[0]=r0; mVRef[1]=r1; mVRef[2]=r2; } - //! Copy constructor - inline_ IndexedTriangle(const IndexedTriangle& triangle) - { - mVRef[0] = triangle.mVRef[0]; - mVRef[1] = triangle.mVRef[1]; - mVRef[2] = triangle.mVRef[2]; - } - //! Destructor - inline_ ~IndexedTriangle() {} - //! Vertex-references - udword mVRef[3]; - - // Methods - void Flip(); - float Area(const Point* verts) const; - float Perimeter(const Point* verts) const; - float Compacity(const Point* verts) const; - void Normal(const Point* verts, Point& normal) const; - void DenormalizedNormal(const Point* verts, Point& normal) const; - void Center(const Point* verts, Point& center) const; - void CenteredNormal(const Point* verts, Point& normal) const; - void RandomPoint(const Point* verts, Point& random) const; - bool IsVisible(const Point* verts, const Point& source) const; - bool BackfaceCulling(const Point* verts, const Point& source) const; - float ComputeOcclusionPotential(const Point* verts, const Point& view) const; - bool ReplaceVertex(udword oldref, udword newref); - bool IsDegenerate() const; - bool HasVertex(udword ref) const; - bool HasVertex(udword ref, udword* index) const; - ubyte FindEdge(udword vref0, udword vref1) const; - udword OppositeVertex(udword vref0, udword vref1) const; - inline_ udword OppositeVertex(ubyte edgenb) const { return mVRef[2-edgenb]; } - void GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const; - float MinEdgeLength(const Point* verts) const; - float MaxEdgeLength(const Point* verts) const; - void ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx=null) const; - float Angle(const IndexedTriangle& tri, const Point* verts) const; - inline_ Plane PlaneEquation(const Point* verts) const { return Plane(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); } - bool Equal(const IndexedTriangle& tri) const; - CubeIndex ComputeCubeIndex(const Point* verts) const; - }; - -#endif // __ICEINDEXEDTRIANGLE_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy indexed triangle class. + * \file IceIndexedTriangle.h + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEINDEXEDTRIANGLE_H__ +#define __ICEINDEXEDTRIANGLE_H__ + + // Forward declarations + enum CubeIndex; + + // An indexed triangle class. + class ICEMATHS_API IndexedTriangle + { + public: + //! Constructor + inline_ IndexedTriangle() {} + //! Constructor + inline_ IndexedTriangle(udword r0, udword r1, udword r2) { mVRef[0]=r0; mVRef[1]=r1; mVRef[2]=r2; } + //! Copy constructor + inline_ IndexedTriangle(const IndexedTriangle& triangle) + { + mVRef[0] = triangle.mVRef[0]; + mVRef[1] = triangle.mVRef[1]; + mVRef[2] = triangle.mVRef[2]; + } + //! Destructor + inline_ ~IndexedTriangle() {} + //! Vertex-references + udword mVRef[3]; + + // Methods + void Flip(); + float Area(const Point* verts) const; + float Perimeter(const Point* verts) const; + float Compacity(const Point* verts) const; + void Normal(const Point* verts, Point& normal) const; + void DenormalizedNormal(const Point* verts, Point& normal) const; + void Center(const Point* verts, Point& center) const; + void CenteredNormal(const Point* verts, Point& normal) const; + void RandomPoint(const Point* verts, Point& random) const; + bool IsVisible(const Point* verts, const Point& source) const; + bool BackfaceCulling(const Point* verts, const Point& source) const; + float ComputeOcclusionPotential(const Point* verts, const Point& view) const; + bool ReplaceVertex(udword oldref, udword newref); + bool IsDegenerate() const; + bool HasVertex(udword ref) const; + bool HasVertex(udword ref, udword* index) const; + ubyte FindEdge(udword vref0, udword vref1) const; + udword OppositeVertex(udword vref0, udword vref1) const; + inline_ udword OppositeVertex(ubyte edgenb) const { return mVRef[2-edgenb]; } + void GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const; + float MinEdgeLength(const Point* verts) const; + float MaxEdgeLength(const Point* verts) const; + void ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx=null) const; + float Angle(const IndexedTriangle& tri, const Point* verts) const; + inline_ Plane PlaneEquation(const Point* verts) const { return Plane(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); } + bool Equal(const IndexedTriangle& tri) const; + CubeIndex ComputeCubeIndex(const Point* verts) const; + }; + +#endif // __ICEINDEXEDTRIANGLE_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceLSS.h b/Extras/CDTestFramework/Opcode/Ice/IceLSS.h index f5bb8b844..d9816d55c 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceLSS.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceLSS.h @@ -1,91 +1,91 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for line-swept spheres. - * \file IceLSS.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICELSS_H__ -#define __ICELSS_H__ - - class ICEMATHS_API LSS : public Segment - { - public: - //! Constructor - inline_ LSS() {} - //! Constructor - inline_ LSS(const Segment& seg, float radius) : Segment(seg), mRadius(radius) {} - //! Destructor - inline_ ~LSS() {} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes an OBB surrounding the LSS. - * \param box [out] the OBB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void ComputeOBB(OBB& box); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a point is contained within the LSS. - * \param pt [in] the point to test - * \return true if inside the LSS - * \warning point and LSS must be in same space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Point& pt) const { return SquareDistance(pt) <= mRadius*mRadius; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a sphere is contained within the LSS. - * \param sphere [in] the sphere to test - * \return true if inside the LSS - * \warning sphere and LSS must be in same space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Sphere& sphere) - { - float d = mRadius - sphere.mRadius; - if(d>=0.0f) return SquareDistance(sphere.mCenter) <= d*d; - else return false; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if an LSS is contained within the LSS. - * \param lss [in] the LSS to test - * \return true if inside the LSS - * \warning both LSS must be in same space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const LSS& lss) - { - // We check the LSS contains the two spheres at the start and end of the sweep - return Contains(Sphere(lss.mP0, lss.mRadius)) && Contains(Sphere(lss.mP0, lss.mRadius)); - } - - float mRadius; //!< Sphere radius - }; - -#endif // __ICELSS_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for line-swept spheres. + * \file IceLSS.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICELSS_H__ +#define __ICELSS_H__ + + class ICEMATHS_API LSS : public Segment + { + public: + //! Constructor + inline_ LSS() {} + //! Constructor + inline_ LSS(const Segment& seg, float radius) : Segment(seg), mRadius(radius) {} + //! Destructor + inline_ ~LSS() {} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes an OBB surrounding the LSS. + * \param box [out] the OBB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void ComputeOBB(OBB& box); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a point is contained within the LSS. + * \param pt [in] the point to test + * \return true if inside the LSS + * \warning point and LSS must be in same space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Point& pt) const { return SquareDistance(pt) <= mRadius*mRadius; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a sphere is contained within the LSS. + * \param sphere [in] the sphere to test + * \return true if inside the LSS + * \warning sphere and LSS must be in same space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Sphere& sphere) + { + float d = mRadius - sphere.mRadius; + if(d>=0.0f) return SquareDistance(sphere.mCenter) <= d*d; + else return false; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if an LSS is contained within the LSS. + * \param lss [in] the LSS to test + * \return true if inside the LSS + * \warning both LSS must be in same space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const LSS& lss) + { + // We check the LSS contains the two spheres at the start and end of the sweep + return Contains(Sphere(lss.mP0, lss.mRadius)) && Contains(Sphere(lss.mP0, lss.mRadius)); + } + + float mRadius; //!< Sphere radius + }; + +#endif // __ICELSS_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp b/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp index 274f510b7..8a981b5c7 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp @@ -1,64 +1,64 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3x3 matrices. - * \file IceMatrix3x3.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * 3x3 matrix. - * DirectX-compliant, ie row-column order, ie m[Row][Col]. - * Same as: - * m11 m12 m13 first row. - * m21 m22 m23 second row. - * m31 m32 m33 third row. - * Stored in memory as m11 m12 m13 m21... - * - * Multiplication rules: - * - * [x'y'z'] = [xyz][M] - * - * x' = x*m11 + y*m21 + z*m31 - * y' = x*m12 + y*m22 + z*m32 - * z' = x*m13 + y*m23 + z*m33 - * - * \class Matrix3x3 - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -// Cast operator -Matrix3x3::operator Matrix4x4() const -{ - return Matrix4x4( - m[0][0], m[0][1], m[0][2], 0.0f, - m[1][0], m[1][1], m[1][2], 0.0f, - m[2][0], m[2][1], m[2][2], 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f); -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3x3 matrices. + * \file IceMatrix3x3.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * 3x3 matrix. + * DirectX-compliant, ie row-column order, ie m[Row][Col]. + * Same as: + * m11 m12 m13 first row. + * m21 m22 m23 second row. + * m31 m32 m33 third row. + * Stored in memory as m11 m12 m13 m21... + * + * Multiplication rules: + * + * [x'y'z'] = [xyz][M] + * + * x' = x*m11 + y*m21 + z*m31 + * y' = x*m12 + y*m22 + z*m32 + * z' = x*m13 + y*m23 + z*m33 + * + * \class Matrix3x3 + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +// Cast operator +Matrix3x3::operator Matrix4x4() const +{ + return Matrix4x4( + m[0][0], m[0][1], m[0][2], 0.0f, + m[1][0], m[1][1], m[1][2], 0.0f, + m[2][0], m[2][1], m[2][2], 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h b/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h index bee2e1406..a2da08a16 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h @@ -1,512 +1,512 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3x3 matrices. - * \file IceMatrix3x3.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEMATRIX3X3_H__ -#define __ICEMATRIX3X3_H__ - - // Forward declarations - class Quat; - - #define MATRIX3X3_EPSILON (1.0e-7f) - - class ICEMATHS_API Matrix3x3 - { - public: - //! Empty constructor - inline_ Matrix3x3() {} - //! Constructor from 9 values - inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; - } - //! Copy constructor - inline_ Matrix3x3(const Matrix3x3& mat) { CopyMemory(m, &mat.m, 9*sizeof(float)); } - //! Destructor - inline_ ~Matrix3x3() {} - - //! Assign values - inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; - } - - //! Sets the scale from a Point. The point is put on the diagonal. - inline_ void SetScale(const Point& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; } - - //! Sets the scale from floats. Values are put on the diagonal. - inline_ void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; } - - //! Scales from a Point. Each row is multiplied by a component. - inline_ void Scale(const Point& p) - { - m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x; - m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y; - m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z; - } - - //! Scales from floats. Each row is multiplied by a value. - inline_ void Scale(float sx, float sy, float sz) - { - m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx; - m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy; - m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz; - } - - //! Copy from a Matrix3x3 - inline_ void Copy(const Matrix3x3& source) { CopyMemory(m, source.m, 9*sizeof(float)); } - - // Row-column access - //! Returns a row. - inline_ void GetRow(const udword r, Point& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; } - //! Returns a row. - inline_ const Point& GetRow(const udword r) const { return *(const Point*)&m[r][0]; } - //! Returns a row. - inline_ Point& GetRow(const udword r) { return *(Point*)&m[r][0]; } - //! Sets a row. - inline_ void SetRow(const udword r, const Point& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; } - //! Returns a column. - inline_ void GetCol(const udword c, Point& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; } - //! Sets a column. - inline_ void SetCol(const udword c, const Point& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; } - - //! Computes the trace. The trace is the sum of the 3 diagonal components. - inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2]; } - //! Clears the matrix. - inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } - //! Sets the identity matrix. - inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; } - //! Checks for identity - inline_ bool IsIdentity() const - { - if(IR(m[0][0])!=IEEE_1_0) return false; - if(IR(m[0][1])!=0) return false; - if(IR(m[0][2])!=0) return false; - - if(IR(m[1][0])!=0) return false; - if(IR(m[1][1])!=IEEE_1_0) return false; - if(IR(m[1][2])!=0) return false; - - if(IR(m[2][0])!=0) return false; - if(IR(m[2][1])!=0) return false; - if(IR(m[2][2])!=IEEE_1_0) return false; - - return true; - } - - //! Checks matrix validity - inline_ BOOL IsValid() const - { - for(udword j=0;j<3;j++) - { - for(udword i=0;i<3;i++) - { - if(!IsValidFloat(m[j][i])) return FALSE; - } - } - return TRUE; - } - - //! Makes a skew-symmetric matrix (a.k.a. Star(*) Matrix) - //! [ 0.0 -a.z a.y ] - //! [ a.z 0.0 -a.x ] - //! [ -a.y a.x 0.0 ] - //! This is also called a "cross matrix" since for any vectors A and B, - //! A^B = Skew(A) * B = - B * Skew(A); - inline_ void SkewSymmetric(const Point& a) - { - m[0][0] = 0.0f; - m[0][1] = -a.z; - m[0][2] = a.y; - - m[1][0] = a.z; - m[1][1] = 0.0f; - m[1][2] = -a.x; - - m[2][0] = -a.y; - m[2][1] = a.x; - m[2][2] = 0.0f; - } - - //! Negates the matrix - inline_ void Neg() - { - m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2]; - m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2]; - m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2]; - } - - //! Neg from another matrix - inline_ void Neg(const Matrix3x3& mat) - { - m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2]; - m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2]; - m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2]; - } - - //! Add another matrix - inline_ void Add(const Matrix3x3& mat) - { - m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; - m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; - m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; - } - - //! Sub another matrix - inline_ void Sub(const Matrix3x3& mat) - { - m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; - m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; - m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; - } - //! Mac - inline_ void Mac(const Matrix3x3& a, const Matrix3x3& b, float s) - { - m[0][0] = a.m[0][0] + b.m[0][0] * s; - m[0][1] = a.m[0][1] + b.m[0][1] * s; - m[0][2] = a.m[0][2] + b.m[0][2] * s; - - m[1][0] = a.m[1][0] + b.m[1][0] * s; - m[1][1] = a.m[1][1] + b.m[1][1] * s; - m[1][2] = a.m[1][2] + b.m[1][2] * s; - - m[2][0] = a.m[2][0] + b.m[2][0] * s; - m[2][1] = a.m[2][1] + b.m[2][1] * s; - m[2][2] = a.m[2][2] + b.m[2][2] * s; - } - //! Mac - inline_ void Mac(const Matrix3x3& a, float s) - { - m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s; - m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s; - m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s; - } - - //! this = A * s - inline_ void Mult(const Matrix3x3& a, float s) - { - m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s; - m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s; - m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s; - } - - inline_ void Add(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] + b.m[0][0]; m[0][1] = a.m[0][1] + b.m[0][1]; m[0][2] = a.m[0][2] + b.m[0][2]; - m[1][0] = a.m[1][0] + b.m[1][0]; m[1][1] = a.m[1][1] + b.m[1][1]; m[1][2] = a.m[1][2] + b.m[1][2]; - m[2][0] = a.m[2][0] + b.m[2][0]; m[2][1] = a.m[2][1] + b.m[2][1]; m[2][2] = a.m[2][2] + b.m[2][2]; - } - - inline_ void Sub(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] - b.m[0][0]; m[0][1] = a.m[0][1] - b.m[0][1]; m[0][2] = a.m[0][2] - b.m[0][2]; - m[1][0] = a.m[1][0] - b.m[1][0]; m[1][1] = a.m[1][1] - b.m[1][1]; m[1][2] = a.m[1][2] - b.m[1][2]; - m[2][0] = a.m[2][0] - b.m[2][0]; m[2][1] = a.m[2][1] - b.m[2][1]; m[2][2] = a.m[2][2] - b.m[2][2]; - } - - //! this = a * b - inline_ void Mult(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0] + a.m[0][2] * b.m[2][0]; - m[0][1] = a.m[0][0] * b.m[0][1] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[2][1]; - m[0][2] = a.m[0][0] * b.m[0][2] + a.m[0][1] * b.m[1][2] + a.m[0][2] * b.m[2][2]; - m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[1][2] * b.m[2][0]; - m[1][1] = a.m[1][0] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[2][1]; - m[1][2] = a.m[1][0] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[1][2] * b.m[2][2]; - m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[1][0] + a.m[2][2] * b.m[2][0]; - m[2][1] = a.m[2][0] * b.m[0][1] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[2][1]; - m[2][2] = a.m[2][0] * b.m[0][2] + a.m[2][1] * b.m[1][2] + a.m[2][2] * b.m[2][2]; - } - - //! this = transpose(a) * b - inline_ void MultAtB(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] * b.m[0][0] + a.m[1][0] * b.m[1][0] + a.m[2][0] * b.m[2][0]; - m[0][1] = a.m[0][0] * b.m[0][1] + a.m[1][0] * b.m[1][1] + a.m[2][0] * b.m[2][1]; - m[0][2] = a.m[0][0] * b.m[0][2] + a.m[1][0] * b.m[1][2] + a.m[2][0] * b.m[2][2]; - m[1][0] = a.m[0][1] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[2][1] * b.m[2][0]; - m[1][1] = a.m[0][1] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[2][1] * b.m[2][1]; - m[1][2] = a.m[0][1] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[2][1] * b.m[2][2]; - m[2][0] = a.m[0][2] * b.m[0][0] + a.m[1][2] * b.m[1][0] + a.m[2][2] * b.m[2][0]; - m[2][1] = a.m[0][2] * b.m[0][1] + a.m[1][2] * b.m[1][1] + a.m[2][2] * b.m[2][1]; - m[2][2] = a.m[0][2] * b.m[0][2] + a.m[1][2] * b.m[1][2] + a.m[2][2] * b.m[2][2]; - } - - //! this = a * transpose(b) - inline_ void MultABt(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[0][1] + a.m[0][2] * b.m[0][2]; - m[0][1] = a.m[0][0] * b.m[1][0] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[1][2]; - m[0][2] = a.m[0][0] * b.m[2][0] + a.m[0][1] * b.m[2][1] + a.m[0][2] * b.m[2][2]; - m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[0][1] + a.m[1][2] * b.m[0][2]; - m[1][1] = a.m[1][0] * b.m[1][0] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[1][2]; - m[1][2] = a.m[1][0] * b.m[2][0] + a.m[1][1] * b.m[2][1] + a.m[1][2] * b.m[2][2]; - m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[0][1] + a.m[2][2] * b.m[0][2]; - m[2][1] = a.m[2][0] * b.m[1][0] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[1][2]; - m[2][2] = a.m[2][0] * b.m[2][0] + a.m[2][1] * b.m[2][1] + a.m[2][2] * b.m[2][2]; - } - - //! Makes a rotation matrix mapping vector "from" to vector "to". - Matrix3x3& FromTo(const Point& from, const Point& to); - - //! Set a rotation matrix around the X axis. - //! 1 0 0 - //! RX = 0 cx sx - //! 0 -sx cx - void RotX(float angle); - //! Set a rotation matrix around the Y axis. - //! cy 0 -sy - //! RY = 0 1 0 - //! sy 0 cy - void RotY(float angle); - //! Set a rotation matrix around the Z axis. - //! cz sz 0 - //! RZ = -sz cz 0 - //! 0 0 1 - void RotZ(float angle); - //! cy sx.sy -sy.cx - //! RY.RX 0 cx sx - //! sy -sx.cy cx.cy - void RotYX(float y, float x); - - //! Make a rotation matrix about an arbitrary axis - Matrix3x3& Rot(float angle, const Point& axis); - - //! Transpose the matrix. - void Transpose() - { - IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); - IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); - IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); - } - - //! this = Transpose(a) - void Transpose(const Matrix3x3& a) - { - m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0]; - m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1]; - m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2]; - } - - //! Compute the determinant of the matrix. We use the rule of Sarrus. - float Determinant() const - { - return (m[0][0]*m[1][1]*m[2][2] + m[0][1]*m[1][2]*m[2][0] + m[0][2]*m[1][0]*m[2][1]) - - (m[2][0]*m[1][1]*m[0][2] + m[2][1]*m[1][2]*m[0][0] + m[2][2]*m[1][0]*m[0][1]); - } -/* - //! Compute a cofactor. Used for matrix inversion. - float CoFactor(ubyte row, ubyte column) const - { - static sdword gIndex[3+2] = { 0, 1, 2, 0, 1 }; - return (m[gIndex[row+1]][gIndex[column+1]]*m[gIndex[row+2]][gIndex[column+2]] - m[gIndex[row+2]][gIndex[column+1]]*m[gIndex[row+1]][gIndex[column+2]]); - } -*/ - //! Invert the matrix. Determinant must be different from zero, else matrix can't be inverted. - Matrix3x3& Invert() - { - float Det = Determinant(); // Must be !=0 - float OneOverDet = 1.0f / Det; - - Matrix3x3 Temp; - Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet; - Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet; - Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet; - Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet; - Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet; - Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet; - Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet; - Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet; - Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet; - - *this = Temp; - - return *this; - } - - Matrix3x3& Normalize(); - - //! this = exp(a) - Matrix3x3& Exp(const Matrix3x3& a); - -void FromQuat(const Quat &q); -void FromQuatL2(const Quat &q, float l2); - - // Arithmetic operators - //! Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3; - inline_ Matrix3x3 operator+(const Matrix3x3& mat) const - { - return Matrix3x3( - m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2], - m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2], - m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]); - } - - //! Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3; - inline_ Matrix3x3 operator-(const Matrix3x3& mat) const - { - return Matrix3x3( - m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2], - m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2], - m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]); - } - - //! Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3; - inline_ Matrix3x3 operator*(const Matrix3x3& mat) const - { - return Matrix3x3( - m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0], - m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1], - m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2], - - m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0], - m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1], - m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2], - - m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0], - m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1], - m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]); - } - - //! Operator for Point Mul = Matrix3x3 * Point; - inline_ Point operator*(const Point& v) const { return Point(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v); } - - //! Operator for Matrix3x3 Mul = Matrix3x3 * float; - inline_ Matrix3x3 operator*(float s) const - { - return Matrix3x3( - m[0][0]*s, m[0][1]*s, m[0][2]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s); - } - - //! Operator for Matrix3x3 Mul = float * Matrix3x3; - inline_ friend Matrix3x3 operator*(float s, const Matrix3x3& mat) - { - return Matrix3x3( - s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], - s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], - s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]); - } - - //! Operator for Matrix3x3 Div = Matrix3x3 / float; - inline_ Matrix3x3 operator/(float s) const - { - if (s) s = 1.0f / s; - return Matrix3x3( - m[0][0]*s, m[0][1]*s, m[0][2]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s); - } - - //! Operator for Matrix3x3 Div = float / Matrix3x3; - inline_ friend Matrix3x3 operator/(float s, const Matrix3x3& mat) - { - return Matrix3x3( - s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], - s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], - s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]); - } - - //! Operator for Matrix3x3 += Matrix3x3 - inline_ Matrix3x3& operator+=(const Matrix3x3& mat) - { - m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; - m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; - m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; - return *this; - } - - //! Operator for Matrix3x3 -= Matrix3x3 - inline_ Matrix3x3& operator-=(const Matrix3x3& mat) - { - m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; - m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; - m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; - return *this; - } - - //! Operator for Matrix3x3 *= Matrix3x3 - inline_ Matrix3x3& operator*=(const Matrix3x3& mat) - { - Point TempRow; - - GetRow(0, TempRow); - m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; - m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; - m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; - - GetRow(1, TempRow); - m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; - m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; - m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; - - GetRow(2, TempRow); - m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; - m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; - m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; - return *this; - } - - //! Operator for Matrix3x3 *= float - inline_ Matrix3x3& operator*=(float s) - { - m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; - m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; - m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; - return *this; - } - - //! Operator for Matrix3x3 /= float - inline_ Matrix3x3& operator/=(float s) - { - if (s) s = 1.0f / s; - m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; - m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; - m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; - return *this; - } - - // Cast operators - //! Cast a Matrix3x3 to a Matrix4x4. - operator Matrix4x4() const; - //! Cast a Matrix3x3 to a Quat. - operator Quat() const; - - inline_ const Point& operator[](int row) const { return *(const Point*)&m[row][0]; } - inline_ Point& operator[](int row) { return *(Point*)&m[row][0]; } - - public: - - float m[3][3]; - }; - -#endif // __ICEMATRIX3X3_H__ - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3x3 matrices. + * \file IceMatrix3x3.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEMATRIX3X3_H__ +#define __ICEMATRIX3X3_H__ + + // Forward declarations + class Quat; + + #define MATRIX3X3_EPSILON (1.0e-7f) + + class ICEMATHS_API Matrix3x3 + { + public: + //! Empty constructor + inline_ Matrix3x3() {} + //! Constructor from 9 values + inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; + } + //! Copy constructor + inline_ Matrix3x3(const Matrix3x3& mat) { CopyMemory(m, &mat.m, 9*sizeof(float)); } + //! Destructor + inline_ ~Matrix3x3() {} + + //! Assign values + inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; + } + + //! Sets the scale from a Point. The point is put on the diagonal. + inline_ void SetScale(const Point& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; } + + //! Sets the scale from floats. Values are put on the diagonal. + inline_ void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; } + + //! Scales from a Point. Each row is multiplied by a component. + inline_ void Scale(const Point& p) + { + m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x; + m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y; + m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z; + } + + //! Scales from floats. Each row is multiplied by a value. + inline_ void Scale(float sx, float sy, float sz) + { + m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx; + m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy; + m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz; + } + + //! Copy from a Matrix3x3 + inline_ void Copy(const Matrix3x3& source) { CopyMemory(m, source.m, 9*sizeof(float)); } + + // Row-column access + //! Returns a row. + inline_ void GetRow(const udword r, Point& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; } + //! Returns a row. + inline_ const Point& GetRow(const udword r) const { return *(const Point*)&m[r][0]; } + //! Returns a row. + inline_ Point& GetRow(const udword r) { return *(Point*)&m[r][0]; } + //! Sets a row. + inline_ void SetRow(const udword r, const Point& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; } + //! Returns a column. + inline_ void GetCol(const udword c, Point& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; } + //! Sets a column. + inline_ void SetCol(const udword c, const Point& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; } + + //! Computes the trace. The trace is the sum of the 3 diagonal components. + inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2]; } + //! Clears the matrix. + inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } + //! Sets the identity matrix. + inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; } + //! Checks for identity + inline_ bool IsIdentity() const + { + if(IR(m[0][0])!=IEEE_1_0) return false; + if(IR(m[0][1])!=0) return false; + if(IR(m[0][2])!=0) return false; + + if(IR(m[1][0])!=0) return false; + if(IR(m[1][1])!=IEEE_1_0) return false; + if(IR(m[1][2])!=0) return false; + + if(IR(m[2][0])!=0) return false; + if(IR(m[2][1])!=0) return false; + if(IR(m[2][2])!=IEEE_1_0) return false; + + return true; + } + + //! Checks matrix validity + inline_ BOOL IsValid() const + { + for(udword j=0;j<3;j++) + { + for(udword i=0;i<3;i++) + { + if(!IsValidFloat(m[j][i])) return FALSE; + } + } + return TRUE; + } + + //! Makes a skew-symmetric matrix (a.k.a. Star(*) Matrix) + //! [ 0.0 -a.z a.y ] + //! [ a.z 0.0 -a.x ] + //! [ -a.y a.x 0.0 ] + //! This is also called a "cross matrix" since for any vectors A and B, + //! A^B = Skew(A) * B = - B * Skew(A); + inline_ void SkewSymmetric(const Point& a) + { + m[0][0] = 0.0f; + m[0][1] = -a.z; + m[0][2] = a.y; + + m[1][0] = a.z; + m[1][1] = 0.0f; + m[1][2] = -a.x; + + m[2][0] = -a.y; + m[2][1] = a.x; + m[2][2] = 0.0f; + } + + //! Negates the matrix + inline_ void Neg() + { + m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2]; + m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2]; + m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2]; + } + + //! Neg from another matrix + inline_ void Neg(const Matrix3x3& mat) + { + m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2]; + m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2]; + m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2]; + } + + //! Add another matrix + inline_ void Add(const Matrix3x3& mat) + { + m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; + m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; + m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; + } + + //! Sub another matrix + inline_ void Sub(const Matrix3x3& mat) + { + m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; + m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; + m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; + } + //! Mac + inline_ void Mac(const Matrix3x3& a, const Matrix3x3& b, float s) + { + m[0][0] = a.m[0][0] + b.m[0][0] * s; + m[0][1] = a.m[0][1] + b.m[0][1] * s; + m[0][2] = a.m[0][2] + b.m[0][2] * s; + + m[1][0] = a.m[1][0] + b.m[1][0] * s; + m[1][1] = a.m[1][1] + b.m[1][1] * s; + m[1][2] = a.m[1][2] + b.m[1][2] * s; + + m[2][0] = a.m[2][0] + b.m[2][0] * s; + m[2][1] = a.m[2][1] + b.m[2][1] * s; + m[2][2] = a.m[2][2] + b.m[2][2] * s; + } + //! Mac + inline_ void Mac(const Matrix3x3& a, float s) + { + m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s; + m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s; + m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s; + } + + //! this = A * s + inline_ void Mult(const Matrix3x3& a, float s) + { + m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s; + m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s; + m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s; + } + + inline_ void Add(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] + b.m[0][0]; m[0][1] = a.m[0][1] + b.m[0][1]; m[0][2] = a.m[0][2] + b.m[0][2]; + m[1][0] = a.m[1][0] + b.m[1][0]; m[1][1] = a.m[1][1] + b.m[1][1]; m[1][2] = a.m[1][2] + b.m[1][2]; + m[2][0] = a.m[2][0] + b.m[2][0]; m[2][1] = a.m[2][1] + b.m[2][1]; m[2][2] = a.m[2][2] + b.m[2][2]; + } + + inline_ void Sub(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] - b.m[0][0]; m[0][1] = a.m[0][1] - b.m[0][1]; m[0][2] = a.m[0][2] - b.m[0][2]; + m[1][0] = a.m[1][0] - b.m[1][0]; m[1][1] = a.m[1][1] - b.m[1][1]; m[1][2] = a.m[1][2] - b.m[1][2]; + m[2][0] = a.m[2][0] - b.m[2][0]; m[2][1] = a.m[2][1] - b.m[2][1]; m[2][2] = a.m[2][2] - b.m[2][2]; + } + + //! this = a * b + inline_ void Mult(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0] + a.m[0][2] * b.m[2][0]; + m[0][1] = a.m[0][0] * b.m[0][1] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[2][1]; + m[0][2] = a.m[0][0] * b.m[0][2] + a.m[0][1] * b.m[1][2] + a.m[0][2] * b.m[2][2]; + m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[1][2] * b.m[2][0]; + m[1][1] = a.m[1][0] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[2][1]; + m[1][2] = a.m[1][0] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[1][2] * b.m[2][2]; + m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[1][0] + a.m[2][2] * b.m[2][0]; + m[2][1] = a.m[2][0] * b.m[0][1] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[2][1]; + m[2][2] = a.m[2][0] * b.m[0][2] + a.m[2][1] * b.m[1][2] + a.m[2][2] * b.m[2][2]; + } + + //! this = transpose(a) * b + inline_ void MultAtB(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] * b.m[0][0] + a.m[1][0] * b.m[1][0] + a.m[2][0] * b.m[2][0]; + m[0][1] = a.m[0][0] * b.m[0][1] + a.m[1][0] * b.m[1][1] + a.m[2][0] * b.m[2][1]; + m[0][2] = a.m[0][0] * b.m[0][2] + a.m[1][0] * b.m[1][2] + a.m[2][0] * b.m[2][2]; + m[1][0] = a.m[0][1] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[2][1] * b.m[2][0]; + m[1][1] = a.m[0][1] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[2][1] * b.m[2][1]; + m[1][2] = a.m[0][1] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[2][1] * b.m[2][2]; + m[2][0] = a.m[0][2] * b.m[0][0] + a.m[1][2] * b.m[1][0] + a.m[2][2] * b.m[2][0]; + m[2][1] = a.m[0][2] * b.m[0][1] + a.m[1][2] * b.m[1][1] + a.m[2][2] * b.m[2][1]; + m[2][2] = a.m[0][2] * b.m[0][2] + a.m[1][2] * b.m[1][2] + a.m[2][2] * b.m[2][2]; + } + + //! this = a * transpose(b) + inline_ void MultABt(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[0][1] + a.m[0][2] * b.m[0][2]; + m[0][1] = a.m[0][0] * b.m[1][0] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[1][2]; + m[0][2] = a.m[0][0] * b.m[2][0] + a.m[0][1] * b.m[2][1] + a.m[0][2] * b.m[2][2]; + m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[0][1] + a.m[1][2] * b.m[0][2]; + m[1][1] = a.m[1][0] * b.m[1][0] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[1][2]; + m[1][2] = a.m[1][0] * b.m[2][0] + a.m[1][1] * b.m[2][1] + a.m[1][2] * b.m[2][2]; + m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[0][1] + a.m[2][2] * b.m[0][2]; + m[2][1] = a.m[2][0] * b.m[1][0] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[1][2]; + m[2][2] = a.m[2][0] * b.m[2][0] + a.m[2][1] * b.m[2][1] + a.m[2][2] * b.m[2][2]; + } + + //! Makes a rotation matrix mapping vector "from" to vector "to". + Matrix3x3& FromTo(const Point& from, const Point& to); + + //! Set a rotation matrix around the X axis. + //! 1 0 0 + //! RX = 0 cx sx + //! 0 -sx cx + void RotX(float angle); + //! Set a rotation matrix around the Y axis. + //! cy 0 -sy + //! RY = 0 1 0 + //! sy 0 cy + void RotY(float angle); + //! Set a rotation matrix around the Z axis. + //! cz sz 0 + //! RZ = -sz cz 0 + //! 0 0 1 + void RotZ(float angle); + //! cy sx.sy -sy.cx + //! RY.RX 0 cx sx + //! sy -sx.cy cx.cy + void RotYX(float y, float x); + + //! Make a rotation matrix about an arbitrary axis + Matrix3x3& Rot(float angle, const Point& axis); + + //! Transpose the matrix. + void Transpose() + { + IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); + IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); + IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); + } + + //! this = Transpose(a) + void Transpose(const Matrix3x3& a) + { + m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0]; + m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1]; + m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2]; + } + + //! Compute the determinant of the matrix. We use the rule of Sarrus. + float Determinant() const + { + return (m[0][0]*m[1][1]*m[2][2] + m[0][1]*m[1][2]*m[2][0] + m[0][2]*m[1][0]*m[2][1]) + - (m[2][0]*m[1][1]*m[0][2] + m[2][1]*m[1][2]*m[0][0] + m[2][2]*m[1][0]*m[0][1]); + } +/* + //! Compute a cofactor. Used for matrix inversion. + float CoFactor(ubyte row, ubyte column) const + { + static sdword gIndex[3+2] = { 0, 1, 2, 0, 1 }; + return (m[gIndex[row+1]][gIndex[column+1]]*m[gIndex[row+2]][gIndex[column+2]] - m[gIndex[row+2]][gIndex[column+1]]*m[gIndex[row+1]][gIndex[column+2]]); + } +*/ + //! Invert the matrix. Determinant must be different from zero, else matrix can't be inverted. + Matrix3x3& Invert() + { + float Det = Determinant(); // Must be !=0 + float OneOverDet = 1.0f / Det; + + Matrix3x3 Temp; + Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet; + Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet; + Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet; + Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet; + Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet; + Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet; + Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet; + Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet; + Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet; + + *this = Temp; + + return *this; + } + + Matrix3x3& Normalize(); + + //! this = exp(a) + Matrix3x3& Exp(const Matrix3x3& a); + +void FromQuat(const Quat &q); +void FromQuatL2(const Quat &q, float l2); + + // Arithmetic operators + //! Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3; + inline_ Matrix3x3 operator+(const Matrix3x3& mat) const + { + return Matrix3x3( + m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2], + m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2], + m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]); + } + + //! Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3; + inline_ Matrix3x3 operator-(const Matrix3x3& mat) const + { + return Matrix3x3( + m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2], + m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2], + m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]); + } + + //! Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3; + inline_ Matrix3x3 operator*(const Matrix3x3& mat) const + { + return Matrix3x3( + m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0], + m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1], + m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2], + + m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0], + m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1], + m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2], + + m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0], + m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1], + m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]); + } + + //! Operator for Point Mul = Matrix3x3 * Point; + inline_ Point operator*(const Point& v) const { return Point(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v); } + + //! Operator for Matrix3x3 Mul = Matrix3x3 * float; + inline_ Matrix3x3 operator*(float s) const + { + return Matrix3x3( + m[0][0]*s, m[0][1]*s, m[0][2]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s); + } + + //! Operator for Matrix3x3 Mul = float * Matrix3x3; + inline_ friend Matrix3x3 operator*(float s, const Matrix3x3& mat) + { + return Matrix3x3( + s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], + s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], + s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]); + } + + //! Operator for Matrix3x3 Div = Matrix3x3 / float; + inline_ Matrix3x3 operator/(float s) const + { + if (s) s = 1.0f / s; + return Matrix3x3( + m[0][0]*s, m[0][1]*s, m[0][2]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s); + } + + //! Operator for Matrix3x3 Div = float / Matrix3x3; + inline_ friend Matrix3x3 operator/(float s, const Matrix3x3& mat) + { + return Matrix3x3( + s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], + s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], + s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]); + } + + //! Operator for Matrix3x3 += Matrix3x3 + inline_ Matrix3x3& operator+=(const Matrix3x3& mat) + { + m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; + m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; + m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; + return *this; + } + + //! Operator for Matrix3x3 -= Matrix3x3 + inline_ Matrix3x3& operator-=(const Matrix3x3& mat) + { + m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; + m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; + m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; + return *this; + } + + //! Operator for Matrix3x3 *= Matrix3x3 + inline_ Matrix3x3& operator*=(const Matrix3x3& mat) + { + Point TempRow; + + GetRow(0, TempRow); + m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; + m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; + m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; + + GetRow(1, TempRow); + m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; + m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; + m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; + + GetRow(2, TempRow); + m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; + m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; + m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; + return *this; + } + + //! Operator for Matrix3x3 *= float + inline_ Matrix3x3& operator*=(float s) + { + m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; + m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; + m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; + return *this; + } + + //! Operator for Matrix3x3 /= float + inline_ Matrix3x3& operator/=(float s) + { + if (s) s = 1.0f / s; + m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; + m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; + m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; + return *this; + } + + // Cast operators + //! Cast a Matrix3x3 to a Matrix4x4. + operator Matrix4x4() const; + //! Cast a Matrix3x3 to a Quat. + operator Quat() const; + + inline_ const Point& operator[](int row) const { return *(const Point*)&m[row][0]; } + inline_ Point& operator[](int row) { return *(Point*)&m[row][0]; } + + public: + + float m[3][3]; + }; + +#endif // __ICEMATRIX3X3_H__ + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp b/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp index 45c3fabb6..7e10f4533 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp @@ -1,152 +1,152 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 4x4 matrices. - * \file IceMatrix4x4.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * 4x4 matrix. - * DirectX-compliant, ie row-column order, ie m[Row][Col]. - * Same as: - * m11 m12 m13 m14 first row. - * m21 m22 m23 m24 second row. - * m31 m32 m33 m34 third row. - * m41 m42 m43 m44 fourth row. - * Translation is (m41, m42, m43), (m14, m24, m34, m44) = (0, 0, 0, 1). - * Stored in memory as m11 m12 m13 m14 m21... - * - * Multiplication rules: - * - * [x'y'z'1] = [xyz1][M] - * - * x' = x*m11 + y*m21 + z*m31 + m41 - * y' = x*m12 + y*m22 + z*m32 + m42 - * z' = x*m13 + y*m23 + z*m33 + m43 - * 1' = 0 + 0 + 0 + m44 - * - * \class Matrix4x4 - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Inverts a PR matrix. (which only contains a rotation and a translation) - * This is faster and less subject to FPU errors than the generic inversion code. - * - * \relates Matrix4x4 - * \fn InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) - * \param dest [out] destination matrix - * \param src [in] source matrix - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -ICEMATHS_API void IceMaths::InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) -{ - dest.m[0][0] = src.m[0][0]; - dest.m[1][0] = src.m[0][1]; - dest.m[2][0] = src.m[0][2]; - dest.m[3][0] = -(src.m[3][0]*src.m[0][0] + src.m[3][1]*src.m[0][1] + src.m[3][2]*src.m[0][2]); - - dest.m[0][1] = src.m[1][0]; - dest.m[1][1] = src.m[1][1]; - dest.m[2][1] = src.m[1][2]; - dest.m[3][1] = -(src.m[3][0]*src.m[1][0] + src.m[3][1]*src.m[1][1] + src.m[3][2]*src.m[1][2]); - - dest.m[0][2] = src.m[2][0]; - dest.m[1][2] = src.m[2][1]; - dest.m[2][2] = src.m[2][2]; - dest.m[3][2] = -(src.m[3][0]*src.m[2][0] + src.m[3][1]*src.m[2][1] + src.m[3][2]*src.m[2][2]); - - dest.m[0][3] = 0.0f; - dest.m[1][3] = 0.0f; - dest.m[2][3] = 0.0f; - dest.m[3][3] = 1.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compute the cofactor of the Matrix at a specified location -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Matrix4x4::CoFactor(udword row, udword col) const -{ - return (( m[(row+1)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+3)&3][(col+3)&3] + - m[(row+1)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+3)&3][(col+1)&3] + - m[(row+1)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+3)&3][(col+2)&3]) - - (m[(row+3)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+1)&3][(col+3)&3] + - m[(row+3)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+1)&3][(col+1)&3] + - m[(row+3)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+1)&3][(col+2)&3])) * ((row + col) & 1 ? -1.0f : +1.0f); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compute the determinant of the Matrix -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Matrix4x4::Determinant() const -{ - return m[0][0] * CoFactor(0, 0) + - m[0][1] * CoFactor(0, 1) + - m[0][2] * CoFactor(0, 2) + - m[0][3] * CoFactor(0, 3); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compute the inverse of the matrix -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Matrix4x4& Matrix4x4::Invert() -{ - float Det = Determinant(); - Matrix4x4 Temp; - - if(fabsf(Det) < MATRIX4X4_EPSILON) - return *this; // The matrix is not invertible! Singular case! - - float IDet = 1.0f / Det; - - Temp.m[0][0] = CoFactor(0,0) * IDet; - Temp.m[1][0] = CoFactor(0,1) * IDet; - Temp.m[2][0] = CoFactor(0,2) * IDet; - Temp.m[3][0] = CoFactor(0,3) * IDet; - Temp.m[0][1] = CoFactor(1,0) * IDet; - Temp.m[1][1] = CoFactor(1,1) * IDet; - Temp.m[2][1] = CoFactor(1,2) * IDet; - Temp.m[3][1] = CoFactor(1,3) * IDet; - Temp.m[0][2] = CoFactor(2,0) * IDet; - Temp.m[1][2] = CoFactor(2,1) * IDet; - Temp.m[2][2] = CoFactor(2,2) * IDet; - Temp.m[3][2] = CoFactor(2,3) * IDet; - Temp.m[0][3] = CoFactor(3,0) * IDet; - Temp.m[1][3] = CoFactor(3,1) * IDet; - Temp.m[2][3] = CoFactor(3,2) * IDet; - Temp.m[3][3] = CoFactor(3,3) * IDet; - - *this = Temp; - - return *this; -} - - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 4x4 matrices. + * \file IceMatrix4x4.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * 4x4 matrix. + * DirectX-compliant, ie row-column order, ie m[Row][Col]. + * Same as: + * m11 m12 m13 m14 first row. + * m21 m22 m23 m24 second row. + * m31 m32 m33 m34 third row. + * m41 m42 m43 m44 fourth row. + * Translation is (m41, m42, m43), (m14, m24, m34, m44) = (0, 0, 0, 1). + * Stored in memory as m11 m12 m13 m14 m21... + * + * Multiplication rules: + * + * [x'y'z'1] = [xyz1][M] + * + * x' = x*m11 + y*m21 + z*m31 + m41 + * y' = x*m12 + y*m22 + z*m32 + m42 + * z' = x*m13 + y*m23 + z*m33 + m43 + * 1' = 0 + 0 + 0 + m44 + * + * \class Matrix4x4 + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Inverts a PR matrix. (which only contains a rotation and a translation) + * This is faster and less subject to FPU errors than the generic inversion code. + * + * \relates Matrix4x4 + * \fn InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) + * \param dest [out] destination matrix + * \param src [in] source matrix + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ICEMATHS_API void IceMaths::InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) +{ + dest.m[0][0] = src.m[0][0]; + dest.m[1][0] = src.m[0][1]; + dest.m[2][0] = src.m[0][2]; + dest.m[3][0] = -(src.m[3][0]*src.m[0][0] + src.m[3][1]*src.m[0][1] + src.m[3][2]*src.m[0][2]); + + dest.m[0][1] = src.m[1][0]; + dest.m[1][1] = src.m[1][1]; + dest.m[2][1] = src.m[1][2]; + dest.m[3][1] = -(src.m[3][0]*src.m[1][0] + src.m[3][1]*src.m[1][1] + src.m[3][2]*src.m[1][2]); + + dest.m[0][2] = src.m[2][0]; + dest.m[1][2] = src.m[2][1]; + dest.m[2][2] = src.m[2][2]; + dest.m[3][2] = -(src.m[3][0]*src.m[2][0] + src.m[3][1]*src.m[2][1] + src.m[3][2]*src.m[2][2]); + + dest.m[0][3] = 0.0f; + dest.m[1][3] = 0.0f; + dest.m[2][3] = 0.0f; + dest.m[3][3] = 1.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compute the cofactor of the Matrix at a specified location +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Matrix4x4::CoFactor(udword row, udword col) const +{ + return (( m[(row+1)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+3)&3][(col+3)&3] + + m[(row+1)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+3)&3][(col+1)&3] + + m[(row+1)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+3)&3][(col+2)&3]) + - (m[(row+3)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+1)&3][(col+3)&3] + + m[(row+3)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+1)&3][(col+1)&3] + + m[(row+3)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+1)&3][(col+2)&3])) * ((row + col) & 1 ? -1.0f : +1.0f); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compute the determinant of the Matrix +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Matrix4x4::Determinant() const +{ + return m[0][0] * CoFactor(0, 0) + + m[0][1] * CoFactor(0, 1) + + m[0][2] * CoFactor(0, 2) + + m[0][3] * CoFactor(0, 3); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compute the inverse of the matrix +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Matrix4x4& Matrix4x4::Invert() +{ + float Det = Determinant(); + Matrix4x4 Temp; + + if(fabsf(Det) < MATRIX4X4_EPSILON) + return *this; // The matrix is not invertible! Singular case! + + float IDet = 1.0f / Det; + + Temp.m[0][0] = CoFactor(0,0) * IDet; + Temp.m[1][0] = CoFactor(0,1) * IDet; + Temp.m[2][0] = CoFactor(0,2) * IDet; + Temp.m[3][0] = CoFactor(0,3) * IDet; + Temp.m[0][1] = CoFactor(1,0) * IDet; + Temp.m[1][1] = CoFactor(1,1) * IDet; + Temp.m[2][1] = CoFactor(1,2) * IDet; + Temp.m[3][1] = CoFactor(1,3) * IDet; + Temp.m[0][2] = CoFactor(2,0) * IDet; + Temp.m[1][2] = CoFactor(2,1) * IDet; + Temp.m[2][2] = CoFactor(2,2) * IDet; + Temp.m[3][2] = CoFactor(2,3) * IDet; + Temp.m[0][3] = CoFactor(3,0) * IDet; + Temp.m[1][3] = CoFactor(3,1) * IDet; + Temp.m[2][3] = CoFactor(3,2) * IDet; + Temp.m[3][3] = CoFactor(3,3) * IDet; + + *this = Temp; + + return *this; +} + + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h b/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h index 9befd9ef4..8abc2a72c 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h @@ -1,471 +1,471 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 4x4 matrices. - * \file IceMatrix4x4.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEMATRIX4X4_H__ -#define __ICEMATRIX4X4_H__ - - // Forward declarations - class PRS; - class PR; - - #define MATRIX4X4_EPSILON (1.0e-7f) - - class ICEMATHS_API Matrix4x4 - { -// void LUBackwardSubstitution( sdword *indx, float* b ); -// void LUDecomposition( sdword* indx, float* d ); - - public: - //! Empty constructor. - inline_ Matrix4x4() {} - //! Constructor from 16 values - inline_ Matrix4x4( float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; - m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; - } - //! Copy constructor - inline_ Matrix4x4(const Matrix4x4& mat) { CopyMemory(m, &mat.m, 16*sizeof(float)); } - //! Destructor. - inline_ ~Matrix4x4() {} - - //! Assign values (rotation only) - inline_ Matrix4x4& Set( float m00, float m01, float m02, - float m10, float m11, float m12, - float m20, float m21, float m22) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; - return *this; - } - //! Assign values - inline_ Matrix4x4& Set( float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; - m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; - return *this; - } - - //! Copy from a Matrix4x4 - inline_ void Copy(const Matrix4x4& source) { CopyMemory(m, source.m, 16*sizeof(float)); } - - // Row-column access - //! Returns a row. - inline_ void GetRow(const udword r, HPoint& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; p.w=m[r][3]; } - //! Returns a row. - inline_ void GetRow(const udword r, Point& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; } - //! Returns a row. - inline_ const HPoint& GetRow(const udword r) const { return *(const HPoint*)&m[r][0]; } - //! Returns a row. - inline_ HPoint& GetRow(const udword r) { return *(HPoint*)&m[r][0]; } - //! Sets a row. - inline_ void SetRow(const udword r, const HPoint& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]=p.w; } - //! Sets a row. - inline_ void SetRow(const udword r, const Point& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]= (r!=3) ? 0.0f : 1.0f; } - //! Returns a column. - inline_ void GetCol(const udword c, HPoint& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; p.w=m[3][c]; } - //! Returns a column. - inline_ void GetCol(const udword c, Point& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; } - //! Sets a column. - inline_ void SetCol(const udword c, const HPoint& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]=p.w; } - //! Sets a column. - inline_ void SetCol(const udword c, const Point& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]= (c!=3) ? 0.0f : 1.0f; } - - // Translation - //! Returns the translation part of the matrix. - inline_ const HPoint& GetTrans() const { return GetRow(3); } - //! Gets the translation part of the matrix - inline_ void GetTrans(Point& p) const { p.x=m[3][0]; p.y=m[3][1]; p.z=m[3][2]; } - //! Sets the translation part of the matrix, from a Point. - inline_ void SetTrans(const Point& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; } - //! Sets the translation part of the matrix, from a HPoint. - inline_ void SetTrans(const HPoint& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; m[3][3]=p.w; } - //! Sets the translation part of the matrix, from floats. - inline_ void SetTrans(float tx, float ty, float tz) { m[3][0]=tx; m[3][1]=ty; m[3][2]=tz; } - - // Scale - //! Sets the scale from a Point. The point is put on the diagonal. - inline_ void SetScale(const Point& p) { m[0][0]=p.x; m[1][1]=p.y; m[2][2]=p.z; } - //! Sets the scale from floats. Values are put on the diagonal. - inline_ void SetScale(float sx, float sy, float sz) { m[0][0]=sx; m[1][1]=sy; m[2][2]=sz; } - //! Scales from a Point. Each row is multiplied by a component. - void Scale(const Point& p) - { - m[0][0] *= p.x; m[1][0] *= p.y; m[2][0] *= p.z; - m[0][1] *= p.x; m[1][1] *= p.y; m[2][1] *= p.z; - m[0][2] *= p.x; m[1][2] *= p.y; m[2][2] *= p.z; - } - //! Scales from floats. Each row is multiplied by a value. - void Scale(float sx, float sy, float sz) - { - m[0][0] *= sx; m[1][0] *= sy; m[2][0] *= sz; - m[0][1] *= sx; m[1][1] *= sy; m[2][1] *= sz; - m[0][2] *= sx; m[1][2] *= sy; m[2][2] *= sz; - } -/* - //! Returns a row. - inline_ HPoint GetRow(const udword row) const { return mRow[row]; } - //! Sets a row. - inline_ Matrix4x4& SetRow(const udword row, const HPoint& p) { mRow[row] = p; return *this; } - //! Sets a row. - Matrix4x4& SetRow(const udword row, const Point& p) - { - m[row][0] = p.x; - m[row][1] = p.y; - m[row][2] = p.z; - m[row][3] = (row != 3) ? 0.0f : 1.0f; - return *this; - } - //! Returns a column. - HPoint GetCol(const udword col) const - { - HPoint Res; - Res.x = m[0][col]; - Res.y = m[1][col]; - Res.z = m[2][col]; - Res.w = m[3][col]; - return Res; - } - //! Sets a column. - Matrix4x4& SetCol(const udword col, const HPoint& p) - { - m[0][col] = p.x; - m[1][col] = p.y; - m[2][col] = p.z; - m[3][col] = p.w; - return *this; - } - //! Sets a column. - Matrix4x4& SetCol(const udword col, const Point& p) - { - m[0][col] = p.x; - m[1][col] = p.y; - m[2][col] = p.z; - m[3][col] = (col != 3) ? 0.0f : 1.0f; - return *this; - } -*/ - //! Computes the trace. The trace is the sum of the 4 diagonal components. - inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2] + m[3][3]; } - //! Computes the trace of the upper 3x3 matrix. - inline_ float Trace3x3() const { return m[0][0] + m[1][1] + m[2][2]; } - //! Clears the matrix. - inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } - //! Sets the identity matrix. - inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f; } - //! Checks for identity - inline_ bool IsIdentity() const - { - if(IR(m[0][0])!=IEEE_1_0) return false; - if(IR(m[0][1])!=0) return false; - if(IR(m[0][2])!=0) return false; - if(IR(m[0][3])!=0) return false; - - if(IR(m[1][0])!=0) return false; - if(IR(m[1][1])!=IEEE_1_0) return false; - if(IR(m[1][2])!=0) return false; - if(IR(m[1][3])!=0) return false; - - if(IR(m[2][0])!=0) return false; - if(IR(m[2][1])!=0) return false; - if(IR(m[2][2])!=IEEE_1_0) return false; - if(IR(m[2][3])!=0) return false; - - if(IR(m[3][0])!=0) return false; - if(IR(m[3][1])!=0) return false; - if(IR(m[3][2])!=0) return false; - if(IR(m[3][3])!=IEEE_1_0) return false; - return true; - } - - //! Checks matrix validity - inline_ BOOL IsValid() const - { - for(udword j=0;j<4;j++) - { - for(udword i=0;i<4;i++) - { - if(!IsValidFloat(m[j][i])) return FALSE; - } - } - return TRUE; - } - - //! Sets a rotation matrix around the X axis. - void RotX(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[1][1] = m[2][2] = Cos; m[2][1] = -Sin; m[1][2] = Sin; } - //! Sets a rotation matrix around the Y axis. - void RotY(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[2][2] = Cos; m[2][0] = Sin; m[0][2] = -Sin; } - //! Sets a rotation matrix around the Z axis. - void RotZ(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[1][1] = Cos; m[1][0] = -Sin; m[0][1] = Sin; } - - //! Makes a rotation matrix about an arbitrary axis - Matrix4x4& Rot(float angle, Point& p1, Point& p2); - - //! Transposes the matrix. - void Transpose() - { - IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); - IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); - IR(m[3][0]) ^= IR(m[0][3]); IR(m[0][3]) ^= IR(m[3][0]); IR(m[3][0]) ^= IR(m[0][3]); - IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); - IR(m[1][3]) ^= IR(m[3][1]); IR(m[3][1]) ^= IR(m[1][3]); IR(m[1][3]) ^= IR(m[3][1]); - IR(m[2][3]) ^= IR(m[3][2]); IR(m[3][2]) ^= IR(m[2][3]); IR(m[2][3]) ^= IR(m[3][2]); - } - - //! Computes a cofactor. Used for matrix inversion. - float CoFactor(udword row, udword col) const; - //! Computes the determinant of the matrix. - float Determinant() const; - //! Inverts the matrix. Determinant must be different from zero, else matrix can't be inverted. - Matrix4x4& Invert(); -// Matrix& ComputeAxisMatrix(Point& axis, float angle); - - // Cast operators - //! Casts a Matrix4x4 to a Matrix3x3. - inline_ operator Matrix3x3() const - { - return Matrix3x3( - m[0][0], m[0][1], m[0][2], - m[1][0], m[1][1], m[1][2], - m[2][0], m[2][1], m[2][2]); - } - //! Casts a Matrix4x4 to a Quat. - operator Quat() const; - //! Casts a Matrix4x4 to a PR. - operator PR() const; - - // Arithmetic operators - //! Operator for Matrix4x4 Plus = Matrix4x4 + Matrix4x4; - inline_ Matrix4x4 operator+(const Matrix4x4& mat) const - { - return Matrix4x4( - m[0][0]+mat.m[0][0], m[0][1]+mat.m[0][1], m[0][2]+mat.m[0][2], m[0][3]+mat.m[0][3], - m[1][0]+mat.m[1][0], m[1][1]+mat.m[1][1], m[1][2]+mat.m[1][2], m[1][3]+mat.m[1][3], - m[2][0]+mat.m[2][0], m[2][1]+mat.m[2][1], m[2][2]+mat.m[2][2], m[2][3]+mat.m[2][3], - m[3][0]+mat.m[3][0], m[3][1]+mat.m[3][1], m[3][2]+mat.m[3][2], m[3][3]+mat.m[3][3]); - } - - //! Operator for Matrix4x4 Minus = Matrix4x4 - Matrix4x4; - inline_ Matrix4x4 operator-(const Matrix4x4& mat) const - { - return Matrix4x4( - m[0][0]-mat.m[0][0], m[0][1]-mat.m[0][1], m[0][2]-mat.m[0][2], m[0][3]-mat.m[0][3], - m[1][0]-mat.m[1][0], m[1][1]-mat.m[1][1], m[1][2]-mat.m[1][2], m[1][3]-mat.m[1][3], - m[2][0]-mat.m[2][0], m[2][1]-mat.m[2][1], m[2][2]-mat.m[2][2], m[2][3]-mat.m[2][3], - m[3][0]-mat.m[3][0], m[3][1]-mat.m[3][1], m[3][2]-mat.m[3][2], m[3][3]-mat.m[3][3]); - } - - //! Operator for Matrix4x4 Mul = Matrix4x4 * Matrix4x4; - inline_ Matrix4x4 operator*(const Matrix4x4& mat) const - { - return Matrix4x4( - m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0] + m[0][3]*mat.m[3][0], - m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1] + m[0][3]*mat.m[3][1], - m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2] + m[0][3]*mat.m[3][2], - m[0][0]*mat.m[0][3] + m[0][1]*mat.m[1][3] + m[0][2]*mat.m[2][3] + m[0][3]*mat.m[3][3], - - m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0] + m[1][3]*mat.m[3][0], - m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1] + m[1][3]*mat.m[3][1], - m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2] + m[1][3]*mat.m[3][2], - m[1][0]*mat.m[0][3] + m[1][1]*mat.m[1][3] + m[1][2]*mat.m[2][3] + m[1][3]*mat.m[3][3], - - m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0] + m[2][3]*mat.m[3][0], - m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1] + m[2][3]*mat.m[3][1], - m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2] + m[2][3]*mat.m[3][2], - m[2][0]*mat.m[0][3] + m[2][1]*mat.m[1][3] + m[2][2]*mat.m[2][3] + m[2][3]*mat.m[3][3], - - m[3][0]*mat.m[0][0] + m[3][1]*mat.m[1][0] + m[3][2]*mat.m[2][0] + m[3][3]*mat.m[3][0], - m[3][0]*mat.m[0][1] + m[3][1]*mat.m[1][1] + m[3][2]*mat.m[2][1] + m[3][3]*mat.m[3][1], - m[3][0]*mat.m[0][2] + m[3][1]*mat.m[1][2] + m[3][2]*mat.m[2][2] + m[3][3]*mat.m[3][2], - m[3][0]*mat.m[0][3] + m[3][1]*mat.m[1][3] + m[3][2]*mat.m[2][3] + m[3][3]*mat.m[3][3]); - } - - //! Operator for HPoint Mul = Matrix4x4 * HPoint; - inline_ HPoint operator*(const HPoint& v) const { return HPoint(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v, GetRow(3)|v); } - - //! Operator for Point Mul = Matrix4x4 * Point; - inline_ Point operator*(const Point& v) const - { - return Point( m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z + m[0][3], - m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z + m[1][3], - m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z + m[2][3] ); - } - - //! Operator for Matrix4x4 Scale = Matrix4x4 * float; - inline_ Matrix4x4 operator*(float s) const - { - return Matrix4x4( - m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, - m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); - } - - //! Operator for Matrix4x4 Scale = float * Matrix4x4; - inline_ friend Matrix4x4 operator*(float s, const Matrix4x4& mat) - { - return Matrix4x4( - s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], s*mat.m[0][3], - s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], s*mat.m[1][3], - s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2], s*mat.m[2][3], - s*mat.m[3][0], s*mat.m[3][1], s*mat.m[3][2], s*mat.m[3][3]); - } - - //! Operator for Matrix4x4 Div = Matrix4x4 / float; - inline_ Matrix4x4 operator/(float s) const - { - if(s) s = 1.0f / s; - - return Matrix4x4( - m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, - m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); - } - - //! Operator for Matrix4x4 Div = float / Matrix4x4; - inline_ friend Matrix4x4 operator/(float s, const Matrix4x4& mat) - { - return Matrix4x4( - s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], s/mat.m[0][3], - s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], s/mat.m[1][3], - s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2], s/mat.m[2][3], - s/mat.m[3][0], s/mat.m[3][1], s/mat.m[3][2], s/mat.m[3][3]); - } - - //! Operator for Matrix4x4 += Matrix4x4; - inline_ Matrix4x4& operator+=(const Matrix4x4& mat) - { - m[0][0]+=mat.m[0][0]; m[0][1]+=mat.m[0][1]; m[0][2]+=mat.m[0][2]; m[0][3]+=mat.m[0][3]; - m[1][0]+=mat.m[1][0]; m[1][1]+=mat.m[1][1]; m[1][2]+=mat.m[1][2]; m[1][3]+=mat.m[1][3]; - m[2][0]+=mat.m[2][0]; m[2][1]+=mat.m[2][1]; m[2][2]+=mat.m[2][2]; m[2][3]+=mat.m[2][3]; - m[3][0]+=mat.m[3][0]; m[3][1]+=mat.m[3][1]; m[3][2]+=mat.m[3][2]; m[3][3]+=mat.m[3][3]; - return *this; - } - - //! Operator for Matrix4x4 -= Matrix4x4; - inline_ Matrix4x4& operator-=(const Matrix4x4& mat) - { - m[0][0]-=mat.m[0][0]; m[0][1]-=mat.m[0][1]; m[0][2]-=mat.m[0][2]; m[0][3]-=mat.m[0][3]; - m[1][0]-=mat.m[1][0]; m[1][1]-=mat.m[1][1]; m[1][2]-=mat.m[1][2]; m[1][3]-=mat.m[1][3]; - m[2][0]-=mat.m[2][0]; m[2][1]-=mat.m[2][1]; m[2][2]-=mat.m[2][2]; m[2][3]-=mat.m[2][3]; - m[3][0]-=mat.m[3][0]; m[3][1]-=mat.m[3][1]; m[3][2]-=mat.m[3][2]; m[3][3]-=mat.m[3][3]; - return *this; - } - - //! Operator for Matrix4x4 *= Matrix4x4; - Matrix4x4& operator*=(const Matrix4x4& mat) - { - HPoint TempRow; - - GetRow(0, TempRow); - m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[0][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - GetRow(1, TempRow); - m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[1][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - GetRow(2, TempRow); - m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[2][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - GetRow(3, TempRow); - m[3][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[3][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[3][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[3][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - return *this; - } - - //! Operator for Matrix4x4 *= float; - inline_ Matrix4x4& operator*=(float s) - { - m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; - m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; - m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; - m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; - return *this; - } - - //! Operator for Matrix4x4 /= float; - inline_ Matrix4x4& operator/=(float s) - { - if(s) s = 1.0f / s; - m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; - m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; - m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; - m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; - return *this; - } - - inline_ const HPoint& operator[](int row) const { return *(const HPoint*)&m[row][0]; } - inline_ HPoint& operator[](int row) { return *(HPoint*)&m[row][0]; } - - public: - - float m[4][4]; - }; - - //! Quickly rotates & translates a vector, using the 4x3 part of a 4x4 matrix - inline_ void TransformPoint4x3(Point& dest, const Point& source, const Matrix4x4& rot) - { - dest.x = rot.m[3][0] + source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; - dest.y = rot.m[3][1] + source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; - dest.z = rot.m[3][2] + source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; - } - - //! Quickly rotates a vector, using the 3x3 part of a 4x4 matrix - inline_ void TransformPoint3x3(Point& dest, const Point& source, const Matrix4x4& rot) - { - dest.x = source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; - dest.y = source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; - dest.z = source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; - } - - ICEMATHS_API void InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src); - -#endif // __ICEMATRIX4X4_H__ - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 4x4 matrices. + * \file IceMatrix4x4.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEMATRIX4X4_H__ +#define __ICEMATRIX4X4_H__ + + // Forward declarations + class PRS; + class PR; + + #define MATRIX4X4_EPSILON (1.0e-7f) + + class ICEMATHS_API Matrix4x4 + { +// void LUBackwardSubstitution( sdword *indx, float* b ); +// void LUDecomposition( sdword* indx, float* d ); + + public: + //! Empty constructor. + inline_ Matrix4x4() {} + //! Constructor from 16 values + inline_ Matrix4x4( float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; + m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; + } + //! Copy constructor + inline_ Matrix4x4(const Matrix4x4& mat) { CopyMemory(m, &mat.m, 16*sizeof(float)); } + //! Destructor. + inline_ ~Matrix4x4() {} + + //! Assign values (rotation only) + inline_ Matrix4x4& Set( float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; + return *this; + } + //! Assign values + inline_ Matrix4x4& Set( float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; + m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; + return *this; + } + + //! Copy from a Matrix4x4 + inline_ void Copy(const Matrix4x4& source) { CopyMemory(m, source.m, 16*sizeof(float)); } + + // Row-column access + //! Returns a row. + inline_ void GetRow(const udword r, HPoint& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; p.w=m[r][3]; } + //! Returns a row. + inline_ void GetRow(const udword r, Point& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; } + //! Returns a row. + inline_ const HPoint& GetRow(const udword r) const { return *(const HPoint*)&m[r][0]; } + //! Returns a row. + inline_ HPoint& GetRow(const udword r) { return *(HPoint*)&m[r][0]; } + //! Sets a row. + inline_ void SetRow(const udword r, const HPoint& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]=p.w; } + //! Sets a row. + inline_ void SetRow(const udword r, const Point& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]= (r!=3) ? 0.0f : 1.0f; } + //! Returns a column. + inline_ void GetCol(const udword c, HPoint& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; p.w=m[3][c]; } + //! Returns a column. + inline_ void GetCol(const udword c, Point& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; } + //! Sets a column. + inline_ void SetCol(const udword c, const HPoint& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]=p.w; } + //! Sets a column. + inline_ void SetCol(const udword c, const Point& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]= (c!=3) ? 0.0f : 1.0f; } + + // Translation + //! Returns the translation part of the matrix. + inline_ const HPoint& GetTrans() const { return GetRow(3); } + //! Gets the translation part of the matrix + inline_ void GetTrans(Point& p) const { p.x=m[3][0]; p.y=m[3][1]; p.z=m[3][2]; } + //! Sets the translation part of the matrix, from a Point. + inline_ void SetTrans(const Point& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; } + //! Sets the translation part of the matrix, from a HPoint. + inline_ void SetTrans(const HPoint& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; m[3][3]=p.w; } + //! Sets the translation part of the matrix, from floats. + inline_ void SetTrans(float tx, float ty, float tz) { m[3][0]=tx; m[3][1]=ty; m[3][2]=tz; } + + // Scale + //! Sets the scale from a Point. The point is put on the diagonal. + inline_ void SetScale(const Point& p) { m[0][0]=p.x; m[1][1]=p.y; m[2][2]=p.z; } + //! Sets the scale from floats. Values are put on the diagonal. + inline_ void SetScale(float sx, float sy, float sz) { m[0][0]=sx; m[1][1]=sy; m[2][2]=sz; } + //! Scales from a Point. Each row is multiplied by a component. + void Scale(const Point& p) + { + m[0][0] *= p.x; m[1][0] *= p.y; m[2][0] *= p.z; + m[0][1] *= p.x; m[1][1] *= p.y; m[2][1] *= p.z; + m[0][2] *= p.x; m[1][2] *= p.y; m[2][2] *= p.z; + } + //! Scales from floats. Each row is multiplied by a value. + void Scale(float sx, float sy, float sz) + { + m[0][0] *= sx; m[1][0] *= sy; m[2][0] *= sz; + m[0][1] *= sx; m[1][1] *= sy; m[2][1] *= sz; + m[0][2] *= sx; m[1][2] *= sy; m[2][2] *= sz; + } +/* + //! Returns a row. + inline_ HPoint GetRow(const udword row) const { return mRow[row]; } + //! Sets a row. + inline_ Matrix4x4& SetRow(const udword row, const HPoint& p) { mRow[row] = p; return *this; } + //! Sets a row. + Matrix4x4& SetRow(const udword row, const Point& p) + { + m[row][0] = p.x; + m[row][1] = p.y; + m[row][2] = p.z; + m[row][3] = (row != 3) ? 0.0f : 1.0f; + return *this; + } + //! Returns a column. + HPoint GetCol(const udword col) const + { + HPoint Res; + Res.x = m[0][col]; + Res.y = m[1][col]; + Res.z = m[2][col]; + Res.w = m[3][col]; + return Res; + } + //! Sets a column. + Matrix4x4& SetCol(const udword col, const HPoint& p) + { + m[0][col] = p.x; + m[1][col] = p.y; + m[2][col] = p.z; + m[3][col] = p.w; + return *this; + } + //! Sets a column. + Matrix4x4& SetCol(const udword col, const Point& p) + { + m[0][col] = p.x; + m[1][col] = p.y; + m[2][col] = p.z; + m[3][col] = (col != 3) ? 0.0f : 1.0f; + return *this; + } +*/ + //! Computes the trace. The trace is the sum of the 4 diagonal components. + inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2] + m[3][3]; } + //! Computes the trace of the upper 3x3 matrix. + inline_ float Trace3x3() const { return m[0][0] + m[1][1] + m[2][2]; } + //! Clears the matrix. + inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } + //! Sets the identity matrix. + inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f; } + //! Checks for identity + inline_ bool IsIdentity() const + { + if(IR(m[0][0])!=IEEE_1_0) return false; + if(IR(m[0][1])!=0) return false; + if(IR(m[0][2])!=0) return false; + if(IR(m[0][3])!=0) return false; + + if(IR(m[1][0])!=0) return false; + if(IR(m[1][1])!=IEEE_1_0) return false; + if(IR(m[1][2])!=0) return false; + if(IR(m[1][3])!=0) return false; + + if(IR(m[2][0])!=0) return false; + if(IR(m[2][1])!=0) return false; + if(IR(m[2][2])!=IEEE_1_0) return false; + if(IR(m[2][3])!=0) return false; + + if(IR(m[3][0])!=0) return false; + if(IR(m[3][1])!=0) return false; + if(IR(m[3][2])!=0) return false; + if(IR(m[3][3])!=IEEE_1_0) return false; + return true; + } + + //! Checks matrix validity + inline_ BOOL IsValid() const + { + for(udword j=0;j<4;j++) + { + for(udword i=0;i<4;i++) + { + if(!IsValidFloat(m[j][i])) return FALSE; + } + } + return TRUE; + } + + //! Sets a rotation matrix around the X axis. + void RotX(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[1][1] = m[2][2] = Cos; m[2][1] = -Sin; m[1][2] = Sin; } + //! Sets a rotation matrix around the Y axis. + void RotY(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[2][2] = Cos; m[2][0] = Sin; m[0][2] = -Sin; } + //! Sets a rotation matrix around the Z axis. + void RotZ(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[1][1] = Cos; m[1][0] = -Sin; m[0][1] = Sin; } + + //! Makes a rotation matrix about an arbitrary axis + Matrix4x4& Rot(float angle, Point& p1, Point& p2); + + //! Transposes the matrix. + void Transpose() + { + IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); + IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); + IR(m[3][0]) ^= IR(m[0][3]); IR(m[0][3]) ^= IR(m[3][0]); IR(m[3][0]) ^= IR(m[0][3]); + IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); + IR(m[1][3]) ^= IR(m[3][1]); IR(m[3][1]) ^= IR(m[1][3]); IR(m[1][3]) ^= IR(m[3][1]); + IR(m[2][3]) ^= IR(m[3][2]); IR(m[3][2]) ^= IR(m[2][3]); IR(m[2][3]) ^= IR(m[3][2]); + } + + //! Computes a cofactor. Used for matrix inversion. + float CoFactor(udword row, udword col) const; + //! Computes the determinant of the matrix. + float Determinant() const; + //! Inverts the matrix. Determinant must be different from zero, else matrix can't be inverted. + Matrix4x4& Invert(); +// Matrix& ComputeAxisMatrix(Point& axis, float angle); + + // Cast operators + //! Casts a Matrix4x4 to a Matrix3x3. + inline_ operator Matrix3x3() const + { + return Matrix3x3( + m[0][0], m[0][1], m[0][2], + m[1][0], m[1][1], m[1][2], + m[2][0], m[2][1], m[2][2]); + } + //! Casts a Matrix4x4 to a Quat. + operator Quat() const; + //! Casts a Matrix4x4 to a PR. + operator PR() const; + + // Arithmetic operators + //! Operator for Matrix4x4 Plus = Matrix4x4 + Matrix4x4; + inline_ Matrix4x4 operator+(const Matrix4x4& mat) const + { + return Matrix4x4( + m[0][0]+mat.m[0][0], m[0][1]+mat.m[0][1], m[0][2]+mat.m[0][2], m[0][3]+mat.m[0][3], + m[1][0]+mat.m[1][0], m[1][1]+mat.m[1][1], m[1][2]+mat.m[1][2], m[1][3]+mat.m[1][3], + m[2][0]+mat.m[2][0], m[2][1]+mat.m[2][1], m[2][2]+mat.m[2][2], m[2][3]+mat.m[2][3], + m[3][0]+mat.m[3][0], m[3][1]+mat.m[3][1], m[3][2]+mat.m[3][2], m[3][3]+mat.m[3][3]); + } + + //! Operator for Matrix4x4 Minus = Matrix4x4 - Matrix4x4; + inline_ Matrix4x4 operator-(const Matrix4x4& mat) const + { + return Matrix4x4( + m[0][0]-mat.m[0][0], m[0][1]-mat.m[0][1], m[0][2]-mat.m[0][2], m[0][3]-mat.m[0][3], + m[1][0]-mat.m[1][0], m[1][1]-mat.m[1][1], m[1][2]-mat.m[1][2], m[1][3]-mat.m[1][3], + m[2][0]-mat.m[2][0], m[2][1]-mat.m[2][1], m[2][2]-mat.m[2][2], m[2][3]-mat.m[2][3], + m[3][0]-mat.m[3][0], m[3][1]-mat.m[3][1], m[3][2]-mat.m[3][2], m[3][3]-mat.m[3][3]); + } + + //! Operator for Matrix4x4 Mul = Matrix4x4 * Matrix4x4; + inline_ Matrix4x4 operator*(const Matrix4x4& mat) const + { + return Matrix4x4( + m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0] + m[0][3]*mat.m[3][0], + m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1] + m[0][3]*mat.m[3][1], + m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2] + m[0][3]*mat.m[3][2], + m[0][0]*mat.m[0][3] + m[0][1]*mat.m[1][3] + m[0][2]*mat.m[2][3] + m[0][3]*mat.m[3][3], + + m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0] + m[1][3]*mat.m[3][0], + m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1] + m[1][3]*mat.m[3][1], + m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2] + m[1][3]*mat.m[3][2], + m[1][0]*mat.m[0][3] + m[1][1]*mat.m[1][3] + m[1][2]*mat.m[2][3] + m[1][3]*mat.m[3][3], + + m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0] + m[2][3]*mat.m[3][0], + m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1] + m[2][3]*mat.m[3][1], + m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2] + m[2][3]*mat.m[3][2], + m[2][0]*mat.m[0][3] + m[2][1]*mat.m[1][3] + m[2][2]*mat.m[2][3] + m[2][3]*mat.m[3][3], + + m[3][0]*mat.m[0][0] + m[3][1]*mat.m[1][0] + m[3][2]*mat.m[2][0] + m[3][3]*mat.m[3][0], + m[3][0]*mat.m[0][1] + m[3][1]*mat.m[1][1] + m[3][2]*mat.m[2][1] + m[3][3]*mat.m[3][1], + m[3][0]*mat.m[0][2] + m[3][1]*mat.m[1][2] + m[3][2]*mat.m[2][2] + m[3][3]*mat.m[3][2], + m[3][0]*mat.m[0][3] + m[3][1]*mat.m[1][3] + m[3][2]*mat.m[2][3] + m[3][3]*mat.m[3][3]); + } + + //! Operator for HPoint Mul = Matrix4x4 * HPoint; + inline_ HPoint operator*(const HPoint& v) const { return HPoint(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v, GetRow(3)|v); } + + //! Operator for Point Mul = Matrix4x4 * Point; + inline_ Point operator*(const Point& v) const + { + return Point( m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z + m[0][3], + m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z + m[1][3], + m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z + m[2][3] ); + } + + //! Operator for Matrix4x4 Scale = Matrix4x4 * float; + inline_ Matrix4x4 operator*(float s) const + { + return Matrix4x4( + m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, + m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); + } + + //! Operator for Matrix4x4 Scale = float * Matrix4x4; + inline_ friend Matrix4x4 operator*(float s, const Matrix4x4& mat) + { + return Matrix4x4( + s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], s*mat.m[0][3], + s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], s*mat.m[1][3], + s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2], s*mat.m[2][3], + s*mat.m[3][0], s*mat.m[3][1], s*mat.m[3][2], s*mat.m[3][3]); + } + + //! Operator for Matrix4x4 Div = Matrix4x4 / float; + inline_ Matrix4x4 operator/(float s) const + { + if(s) s = 1.0f / s; + + return Matrix4x4( + m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, + m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); + } + + //! Operator for Matrix4x4 Div = float / Matrix4x4; + inline_ friend Matrix4x4 operator/(float s, const Matrix4x4& mat) + { + return Matrix4x4( + s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], s/mat.m[0][3], + s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], s/mat.m[1][3], + s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2], s/mat.m[2][3], + s/mat.m[3][0], s/mat.m[3][1], s/mat.m[3][2], s/mat.m[3][3]); + } + + //! Operator for Matrix4x4 += Matrix4x4; + inline_ Matrix4x4& operator+=(const Matrix4x4& mat) + { + m[0][0]+=mat.m[0][0]; m[0][1]+=mat.m[0][1]; m[0][2]+=mat.m[0][2]; m[0][3]+=mat.m[0][3]; + m[1][0]+=mat.m[1][0]; m[1][1]+=mat.m[1][1]; m[1][2]+=mat.m[1][2]; m[1][3]+=mat.m[1][3]; + m[2][0]+=mat.m[2][0]; m[2][1]+=mat.m[2][1]; m[2][2]+=mat.m[2][2]; m[2][3]+=mat.m[2][3]; + m[3][0]+=mat.m[3][0]; m[3][1]+=mat.m[3][1]; m[3][2]+=mat.m[3][2]; m[3][3]+=mat.m[3][3]; + return *this; + } + + //! Operator for Matrix4x4 -= Matrix4x4; + inline_ Matrix4x4& operator-=(const Matrix4x4& mat) + { + m[0][0]-=mat.m[0][0]; m[0][1]-=mat.m[0][1]; m[0][2]-=mat.m[0][2]; m[0][3]-=mat.m[0][3]; + m[1][0]-=mat.m[1][0]; m[1][1]-=mat.m[1][1]; m[1][2]-=mat.m[1][2]; m[1][3]-=mat.m[1][3]; + m[2][0]-=mat.m[2][0]; m[2][1]-=mat.m[2][1]; m[2][2]-=mat.m[2][2]; m[2][3]-=mat.m[2][3]; + m[3][0]-=mat.m[3][0]; m[3][1]-=mat.m[3][1]; m[3][2]-=mat.m[3][2]; m[3][3]-=mat.m[3][3]; + return *this; + } + + //! Operator for Matrix4x4 *= Matrix4x4; + Matrix4x4& operator*=(const Matrix4x4& mat) + { + HPoint TempRow; + + GetRow(0, TempRow); + m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[0][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + GetRow(1, TempRow); + m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[1][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + GetRow(2, TempRow); + m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[2][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + GetRow(3, TempRow); + m[3][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[3][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[3][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[3][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + return *this; + } + + //! Operator for Matrix4x4 *= float; + inline_ Matrix4x4& operator*=(float s) + { + m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; + m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; + m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; + m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; + return *this; + } + + //! Operator for Matrix4x4 /= float; + inline_ Matrix4x4& operator/=(float s) + { + if(s) s = 1.0f / s; + m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; + m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; + m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; + m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; + return *this; + } + + inline_ const HPoint& operator[](int row) const { return *(const HPoint*)&m[row][0]; } + inline_ HPoint& operator[](int row) { return *(HPoint*)&m[row][0]; } + + public: + + float m[4][4]; + }; + + //! Quickly rotates & translates a vector, using the 4x3 part of a 4x4 matrix + inline_ void TransformPoint4x3(Point& dest, const Point& source, const Matrix4x4& rot) + { + dest.x = rot.m[3][0] + source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; + dest.y = rot.m[3][1] + source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; + dest.z = rot.m[3][2] + source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; + } + + //! Quickly rotates a vector, using the 3x3 part of a 4x4 matrix + inline_ void TransformPoint3x3(Point& dest, const Point& source, const Matrix4x4& rot) + { + dest.x = source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; + dest.y = source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; + dest.z = source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; + } + + ICEMATHS_API void InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src); + +#endif // __ICEMATRIX4X4_H__ + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h b/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h index f31c59408..3f2497519 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h @@ -1,180 +1,180 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains all memory macros. - * \file IceMemoryMacros.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICEMEMORYMACROS_H -#define ICEMEMORYMACROS_H - -#undef ZeroMemory -#undef CopyMemory -#undef MoveMemory -#undef FillMemory - - //! Clears a buffer. - //! \param addr [in] buffer address - //! \param size [in] buffer length - //! \see FillMemory - //! \see StoreDwords - //! \see CopyMemory - //! \see MoveMemory - inline_ void ZeroMemory(void* addr, regsize size) { memset(addr, 0, size); } - - //! Fills a buffer with a given byte. - //! \param addr [in] buffer address - //! \param size [in] buffer length - //! \param val [in] the byte value - //! \see StoreDwords - //! \see ZeroMemory - //! \see CopyMemory - //! \see MoveMemory - inline_ void FillMemory(void* dest, regsize size, ubyte val) { memset(dest, val, size); } - - //! Fills a buffer with a given dword. - //! \param addr [in] buffer address - //! \param nb [in] number of dwords to write - //! \param value [in] the dword value - //! \see FillMemory - //! \see ZeroMemory - //! \see CopyMemory - //! \see MoveMemory - //! \warning writes nb*4 bytes ! - inline_ void StoreDwords(udword* dest, udword nb, udword value) - { - // The asm code below **SHOULD** be equivalent to one of those C versions - // or the other if your compiled is good: (checked on VC++ 6.0) - // - // 1) while(nb--) *dest++ = value; - // - // 2) for(udword i=0;iRelease(); (x) = null; } - - //! Safe ICE-style release - #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } - -#ifdef ICEERROR_H - //! Standard alloc checking. HANDLE WITH CARE. Relies on strict coding rules. Probably shouldn't be used outside of ICE. - #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); -#else - #define CHECKALLOC(x) if(!x) return false; -#endif - - //! Standard allocation cycle - #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); - #define SAFE_ICE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = ICE_NEW(type)[count]; CHECKALLOC(ptr); - - //! Don't use inline for alloca !!! -#ifdef WIN32 - #define StackAlloc(x) _alloca(x) -#elif LINUX - #define StackAlloc(x) alloca(x) -#elif defined(__APPLE__) - #define StackAlloc(x) alloca(x) -#elif defined(_XBOX) - #define StackAlloc(x) _alloca(x) -#endif - -#ifdef _DEBUG -// #define ICE_ALLOC_TMP(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #x, MEMORY_TEMP) -// #define ICE_ALLOC(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #x, MEMORY_PERSISTENT) - #define ICE_ALLOC_TMP(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, "(undefined)", MEMORY_TEMP) - #define ICE_ALLOC(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, "(undefined)", MEMORY_PERSISTENT) - #define ICE_ALLOC_TMP2(x, y) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #y, MEMORY_TEMP) - #define ICE_ALLOC2(x, y) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #y, MEMORY_PERSISTENT) -#else - #define ICE_ALLOC_TMP(x) GetAllocator()->malloc(x, MEMORY_TEMP) - #define ICE_ALLOC(x) GetAllocator()->malloc(x, MEMORY_PERSISTENT) -#endif - #define ICE_FREE(x) if(x) { GetAllocator()->free(x); x = null; } - -#ifdef DONT_TRACK_MEMORY_LEAKS - #ifdef _DEBUG - #define ICE_NEW_TMP(x) new(__FILE__, __LINE__, #x, MEMORY_TEMP) x - #define ICE_NEW(x) new(__FILE__, __LINE__, #x, MEMORY_PERSISTENT) x - #else - #define ICE_NEW_TMP(x) new(MEMORY_TEMP) x - #define ICE_NEW(x) new(MEMORY_PERSISTENT) x - #endif -#else - #define ICE_NEW_TMP(x) new x - #define ICE_NEW(x) new x -#endif - -#endif // ICEMEMORYMACROS_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains all memory macros. + * \file IceMemoryMacros.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEMEMORYMACROS_H +#define ICEMEMORYMACROS_H + +#undef ZeroMemory +#undef CopyMemory +#undef MoveMemory +#undef FillMemory + + //! Clears a buffer. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \see FillMemory + //! \see StoreDwords + //! \see CopyMemory + //! \see MoveMemory + inline_ void ZeroMemory(void* addr, regsize size) { memset(addr, 0, size); } + + //! Fills a buffer with a given byte. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \param val [in] the byte value + //! \see StoreDwords + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + inline_ void FillMemory(void* dest, regsize size, ubyte val) { memset(dest, val, size); } + + //! Fills a buffer with a given dword. + //! \param addr [in] buffer address + //! \param nb [in] number of dwords to write + //! \param value [in] the dword value + //! \see FillMemory + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + //! \warning writes nb*4 bytes ! + inline_ void StoreDwords(udword* dest, udword nb, udword value) + { + // The asm code below **SHOULD** be equivalent to one of those C versions + // or the other if your compiled is good: (checked on VC++ 6.0) + // + // 1) while(nb--) *dest++ = value; + // + // 2) for(udword i=0;iRelease(); (x) = null; } + + //! Safe ICE-style release + #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } + +#ifdef ICEERROR_H + //! Standard alloc checking. HANDLE WITH CARE. Relies on strict coding rules. Probably shouldn't be used outside of ICE. + #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); +#else + #define CHECKALLOC(x) if(!x) return false; +#endif + + //! Standard allocation cycle + #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); + #define SAFE_ICE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = ICE_NEW(type)[count]; CHECKALLOC(ptr); + + //! Don't use inline for alloca !!! +#ifdef WIN32 + #define StackAlloc(x) _alloca(x) +#elif LINUX + #define StackAlloc(x) alloca(x) +#elif defined(__APPLE__) + #define StackAlloc(x) alloca(x) +#elif defined(_XBOX) + #define StackAlloc(x) _alloca(x) +#endif + +#ifdef _DEBUG +// #define ICE_ALLOC_TMP(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #x, MEMORY_TEMP) +// #define ICE_ALLOC(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #x, MEMORY_PERSISTENT) + #define ICE_ALLOC_TMP(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, "(undefined)", MEMORY_TEMP) + #define ICE_ALLOC(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, "(undefined)", MEMORY_PERSISTENT) + #define ICE_ALLOC_TMP2(x, y) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #y, MEMORY_TEMP) + #define ICE_ALLOC2(x, y) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #y, MEMORY_PERSISTENT) +#else + #define ICE_ALLOC_TMP(x) GetAllocator()->malloc(x, MEMORY_TEMP) + #define ICE_ALLOC(x) GetAllocator()->malloc(x, MEMORY_PERSISTENT) +#endif + #define ICE_FREE(x) if(x) { GetAllocator()->free(x); x = null; } + +#ifdef DONT_TRACK_MEMORY_LEAKS + #ifdef _DEBUG + #define ICE_NEW_TMP(x) new(__FILE__, __LINE__, #x, MEMORY_TEMP) x + #define ICE_NEW(x) new(__FILE__, __LINE__, #x, MEMORY_PERSISTENT) x + #else + #define ICE_NEW_TMP(x) new(MEMORY_TEMP) x + #define ICE_NEW(x) new(MEMORY_PERSISTENT) x + #endif +#else + #define ICE_NEW_TMP(x) new x + #define ICE_NEW(x) new x +#endif + +#endif // ICEMEMORYMACROS_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp b/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp index b8b76fd5d..79563218d 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp @@ -1,339 +1,339 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains OBB-related code. - * \file IceOBB.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * An Oriented Bounding Box (OBB). - * \class OBB - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Tests if a point is contained within the OBB. - * \param p [in] the world point to test - * \return true if inside the OBB - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ContainsPoint(const Point& p) const -{ - // Point in OBB test using lazy evaluation and early exits - - // Translate to box space - Point RelPoint = p - mCenter; - - // Point * mRot maps from box space to world space - // mRot * Point maps from world space to box space (what we need here) - - float f = mRot.m[0][0] * RelPoint.x + mRot.m[0][1] * RelPoint.y + mRot.m[0][2] * RelPoint.z; - if(f >= mExtents.x || f <= -mExtents.x) return false; - - f = mRot.m[1][0] * RelPoint.x + mRot.m[1][1] * RelPoint.y + mRot.m[1][2] * RelPoint.z; - if(f >= mExtents.y || f <= -mExtents.y) return false; - - f = mRot.m[2][0] * RelPoint.x + mRot.m[2][1] * RelPoint.y + mRot.m[2][2] * RelPoint.z; - if(f >= mExtents.z || f <= -mExtents.z) return false; - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds an OBB from an AABB and a world transform. - * \param aabb [in] the aabb - * \param mat [in] the world transform - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBB::Create(const AABB& aabb, const Matrix4x4& mat) -{ - // Note: must be coherent with Rotate() - - aabb.GetCenter(mCenter); - aabb.GetExtents(mExtents); - // Here we have the same as OBB::Rotate(mat) where the obb is (mCenter, mExtents, Identity). - - // So following what's done in Rotate: - // - x-form the center - mCenter *= mat; - // - combine rotation with identity, i.e. just use given matrix - mRot = mat; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the obb planes. - * \param planes [out] 6 box planes - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ComputePlanes(Plane* planes) const -{ - // Checkings - if(!planes) return false; - - Point Axis0 = mRot[0]; - Point Axis1 = mRot[1]; - Point Axis2 = mRot[2]; - - // Writes normals - planes[0].n = Axis0; - planes[1].n = -Axis0; - planes[2].n = Axis1; - planes[3].n = -Axis1; - planes[4].n = Axis2; - planes[5].n = -Axis2; - - // Compute a point on each plane - Point p0 = mCenter + Axis0 * mExtents.x; - Point p1 = mCenter - Axis0 * mExtents.x; - Point p2 = mCenter + Axis1 * mExtents.y; - Point p3 = mCenter - Axis1 * mExtents.y; - Point p4 = mCenter + Axis2 * mExtents.z; - Point p5 = mCenter - Axis2 * mExtents.z; - - // Compute d - planes[0].d = -(planes[0].n|p0); - planes[1].d = -(planes[1].n|p1); - planes[2].d = -(planes[2].n|p2); - planes[3].d = -(planes[3].n|p3); - planes[4].d = -(planes[4].n|p4); - planes[5].d = -(planes[5].n|p5); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the obb points. - * \param pts [out] 8 box points - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ComputePoints(Point* pts) const -{ - // Checkings - if(!pts) return false; - - Point Axis0 = mRot[0]; - Point Axis1 = mRot[1]; - Point Axis2 = mRot[2]; - - Axis0 *= mExtents.x; - Axis1 *= mExtents.y; - Axis2 *= mExtents.z; - - // 7+------+6 0 = --- - // /| /| 1 = +-- - // / | / | 2 = ++- - // / 4+---/--+5 3 = -+- - // 3+------+2 / y z 4 = --+ - // | / | / | / 5 = +-+ - // |/ |/ |/ 6 = +++ - // 0+------+1 *---x 7 = -++ - - pts[0] = mCenter - Axis0 - Axis1 - Axis2; - pts[1] = mCenter + Axis0 - Axis1 - Axis2; - pts[2] = mCenter + Axis0 + Axis1 - Axis2; - pts[3] = mCenter - Axis0 + Axis1 - Axis2; - pts[4] = mCenter - Axis0 - Axis1 + Axis2; - pts[5] = mCenter + Axis0 - Axis1 + Axis2; - pts[6] = mCenter + Axis0 + Axis1 + Axis2; - pts[7] = mCenter - Axis0 + Axis1 + Axis2; - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes vertex normals. - * \param pts [out] 8 box points - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ComputeVertexNormals(Point* pts) const -{ - static float VertexNormals[] = - { - -INVSQRT3, -INVSQRT3, -INVSQRT3, - INVSQRT3, -INVSQRT3, -INVSQRT3, - INVSQRT3, INVSQRT3, -INVSQRT3, - -INVSQRT3, INVSQRT3, -INVSQRT3, - -INVSQRT3, -INVSQRT3, INVSQRT3, - INVSQRT3, -INVSQRT3, INVSQRT3, - INVSQRT3, INVSQRT3, INVSQRT3, - -INVSQRT3, INVSQRT3, INVSQRT3 - }; - - if(!pts) return false; - - const Point* VN = (const Point*)VertexNormals; - for(udword i=0;i<8;i++) - { - pts[i] = VN[i] * mRot; - } - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Returns edges. - * \return 24 indices (12 edges) indexing the list returned by ComputePoints() - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const udword* OBB::GetEdges() const -{ - static udword Indices[] = { - 0, 1, 1, 2, 2, 3, 3, 0, - 7, 6, 6, 5, 5, 4, 4, 7, - 1, 5, 6, 2, - 3, 7, 4, 0 - }; - return Indices; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Returns local edge normals. - * \return edge normals in local space - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const Point* OBB::GetLocalEdgeNormals() const -{ - static float EdgeNormals[] = - { - 0, -INVSQRT2, -INVSQRT2, // 0-1 - INVSQRT2, 0, -INVSQRT2, // 1-2 - 0, INVSQRT2, -INVSQRT2, // 2-3 - -INVSQRT2, 0, -INVSQRT2, // 3-0 - - 0, INVSQRT2, INVSQRT2, // 7-6 - INVSQRT2, 0, INVSQRT2, // 6-5 - 0, -INVSQRT2, INVSQRT2, // 5-4 - -INVSQRT2, 0, INVSQRT2, // 4-7 - - INVSQRT2, -INVSQRT2, 0, // 1-5 - INVSQRT2, INVSQRT2, 0, // 6-2 - -INVSQRT2, INVSQRT2, 0, // 3-7 - -INVSQRT2, -INVSQRT2, 0 // 4-0 - }; - return (const Point*)EdgeNormals; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Returns world edge normal - * \param edge_index [in] 0 <= edge index < 12 - * \param world_normal [out] edge normal in world space - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBB::ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const -{ - ASSERT(edge_index<12); - world_normal = GetLocalEdgeNormals()[edge_index] * mRot; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes an LSS surrounding the OBB. - * \param lss [out] the LSS - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBB::ComputeLSS(LSS& lss) const -{ - Point Axis0 = mRot[0]; - Point Axis1 = mRot[1]; - Point Axis2 = mRot[2]; - - switch(mExtents.LargestAxis()) - { - case 0: - lss.mRadius = (mExtents.y + mExtents.z)*0.5f; - lss.mP0 = mCenter + Axis0 * (mExtents.x - lss.mRadius); - lss.mP1 = mCenter - Axis0 * (mExtents.x - lss.mRadius); - break; - case 1: - lss.mRadius = (mExtents.x + mExtents.z)*0.5f; - lss.mP0 = mCenter + Axis1 * (mExtents.y - lss.mRadius); - lss.mP1 = mCenter - Axis1 * (mExtents.y - lss.mRadius); - break; - case 2: - lss.mRadius = (mExtents.x + mExtents.y)*0.5f; - lss.mP0 = mCenter + Axis2 * (mExtents.z - lss.mRadius); - lss.mP1 = mCenter - Axis2 * (mExtents.z - lss.mRadius); - break; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the OBB is inside another OBB. - * \param box [in] the other OBB - * \return TRUE if we're inside the other box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL OBB::IsInside(const OBB& box) const -{ - // Make a 4x4 from the box & inverse it - Matrix4x4 M0Inv; - { - Matrix4x4 M0 = box.mRot; - M0.SetTrans(box.mCenter); - InvertPRMatrix(M0Inv, M0); - } - - // With our inversed 4x4, create box1 in space of box0 - OBB _1in0; - Rotate(M0Inv, _1in0); - - // This should cancel out box0's rotation, i.e. it's now an AABB. - // => Center(0,0,0), Rot(identity) - - // The two boxes are in the same space so now we can compare them. - - // Create the AABB of (box1 in space of box0) - const Matrix3x3& mtx = _1in0.mRot; - - float f = fabsf(mtx.m[0][0] * mExtents.x) + fabsf(mtx.m[1][0] * mExtents.y) + fabsf(mtx.m[2][0] * mExtents.z) - box.mExtents.x; - if(f > _1in0.mCenter.x) return FALSE; - if(-f < _1in0.mCenter.x) return FALSE; - - f = fabsf(mtx.m[0][1] * mExtents.x) + fabsf(mtx.m[1][1] * mExtents.y) + fabsf(mtx.m[2][1] * mExtents.z) - box.mExtents.y; - if(f > _1in0.mCenter.y) return FALSE; - if(-f < _1in0.mCenter.y) return FALSE; - - f = fabsf(mtx.m[0][2] * mExtents.x) + fabsf(mtx.m[1][2] * mExtents.y) + fabsf(mtx.m[2][2] * mExtents.z) - box.mExtents.z; - if(f > _1in0.mCenter.z) return FALSE; - if(-f < _1in0.mCenter.z) return FALSE; - - return TRUE; -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains OBB-related code. + * \file IceOBB.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * An Oriented Bounding Box (OBB). + * \class OBB + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Tests if a point is contained within the OBB. + * \param p [in] the world point to test + * \return true if inside the OBB + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ContainsPoint(const Point& p) const +{ + // Point in OBB test using lazy evaluation and early exits + + // Translate to box space + Point RelPoint = p - mCenter; + + // Point * mRot maps from box space to world space + // mRot * Point maps from world space to box space (what we need here) + + float f = mRot.m[0][0] * RelPoint.x + mRot.m[0][1] * RelPoint.y + mRot.m[0][2] * RelPoint.z; + if(f >= mExtents.x || f <= -mExtents.x) return false; + + f = mRot.m[1][0] * RelPoint.x + mRot.m[1][1] * RelPoint.y + mRot.m[1][2] * RelPoint.z; + if(f >= mExtents.y || f <= -mExtents.y) return false; + + f = mRot.m[2][0] * RelPoint.x + mRot.m[2][1] * RelPoint.y + mRot.m[2][2] * RelPoint.z; + if(f >= mExtents.z || f <= -mExtents.z) return false; + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds an OBB from an AABB and a world transform. + * \param aabb [in] the aabb + * \param mat [in] the world transform + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBB::Create(const AABB& aabb, const Matrix4x4& mat) +{ + // Note: must be coherent with Rotate() + + aabb.GetCenter(mCenter); + aabb.GetExtents(mExtents); + // Here we have the same as OBB::Rotate(mat) where the obb is (mCenter, mExtents, Identity). + + // So following what's done in Rotate: + // - x-form the center + mCenter *= mat; + // - combine rotation with identity, i.e. just use given matrix + mRot = mat; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the obb planes. + * \param planes [out] 6 box planes + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ComputePlanes(Plane* planes) const +{ + // Checkings + if(!planes) return false; + + Point Axis0 = mRot[0]; + Point Axis1 = mRot[1]; + Point Axis2 = mRot[2]; + + // Writes normals + planes[0].n = Axis0; + planes[1].n = -Axis0; + planes[2].n = Axis1; + planes[3].n = -Axis1; + planes[4].n = Axis2; + planes[5].n = -Axis2; + + // Compute a point on each plane + Point p0 = mCenter + Axis0 * mExtents.x; + Point p1 = mCenter - Axis0 * mExtents.x; + Point p2 = mCenter + Axis1 * mExtents.y; + Point p3 = mCenter - Axis1 * mExtents.y; + Point p4 = mCenter + Axis2 * mExtents.z; + Point p5 = mCenter - Axis2 * mExtents.z; + + // Compute d + planes[0].d = -(planes[0].n|p0); + planes[1].d = -(planes[1].n|p1); + planes[2].d = -(planes[2].n|p2); + planes[3].d = -(planes[3].n|p3); + planes[4].d = -(planes[4].n|p4); + planes[5].d = -(planes[5].n|p5); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the obb points. + * \param pts [out] 8 box points + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ComputePoints(Point* pts) const +{ + // Checkings + if(!pts) return false; + + Point Axis0 = mRot[0]; + Point Axis1 = mRot[1]; + Point Axis2 = mRot[2]; + + Axis0 *= mExtents.x; + Axis1 *= mExtents.y; + Axis2 *= mExtents.z; + + // 7+------+6 0 = --- + // /| /| 1 = +-- + // / | / | 2 = ++- + // / 4+---/--+5 3 = -+- + // 3+------+2 / y z 4 = --+ + // | / | / | / 5 = +-+ + // |/ |/ |/ 6 = +++ + // 0+------+1 *---x 7 = -++ + + pts[0] = mCenter - Axis0 - Axis1 - Axis2; + pts[1] = mCenter + Axis0 - Axis1 - Axis2; + pts[2] = mCenter + Axis0 + Axis1 - Axis2; + pts[3] = mCenter - Axis0 + Axis1 - Axis2; + pts[4] = mCenter - Axis0 - Axis1 + Axis2; + pts[5] = mCenter + Axis0 - Axis1 + Axis2; + pts[6] = mCenter + Axis0 + Axis1 + Axis2; + pts[7] = mCenter - Axis0 + Axis1 + Axis2; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes vertex normals. + * \param pts [out] 8 box points + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ComputeVertexNormals(Point* pts) const +{ + static float VertexNormals[] = + { + -INVSQRT3, -INVSQRT3, -INVSQRT3, + INVSQRT3, -INVSQRT3, -INVSQRT3, + INVSQRT3, INVSQRT3, -INVSQRT3, + -INVSQRT3, INVSQRT3, -INVSQRT3, + -INVSQRT3, -INVSQRT3, INVSQRT3, + INVSQRT3, -INVSQRT3, INVSQRT3, + INVSQRT3, INVSQRT3, INVSQRT3, + -INVSQRT3, INVSQRT3, INVSQRT3 + }; + + if(!pts) return false; + + const Point* VN = (const Point*)VertexNormals; + for(udword i=0;i<8;i++) + { + pts[i] = VN[i] * mRot; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Returns edges. + * \return 24 indices (12 edges) indexing the list returned by ComputePoints() + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const udword* OBB::GetEdges() const +{ + static udword Indices[] = { + 0, 1, 1, 2, 2, 3, 3, 0, + 7, 6, 6, 5, 5, 4, 4, 7, + 1, 5, 6, 2, + 3, 7, 4, 0 + }; + return Indices; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Returns local edge normals. + * \return edge normals in local space + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const Point* OBB::GetLocalEdgeNormals() const +{ + static float EdgeNormals[] = + { + 0, -INVSQRT2, -INVSQRT2, // 0-1 + INVSQRT2, 0, -INVSQRT2, // 1-2 + 0, INVSQRT2, -INVSQRT2, // 2-3 + -INVSQRT2, 0, -INVSQRT2, // 3-0 + + 0, INVSQRT2, INVSQRT2, // 7-6 + INVSQRT2, 0, INVSQRT2, // 6-5 + 0, -INVSQRT2, INVSQRT2, // 5-4 + -INVSQRT2, 0, INVSQRT2, // 4-7 + + INVSQRT2, -INVSQRT2, 0, // 1-5 + INVSQRT2, INVSQRT2, 0, // 6-2 + -INVSQRT2, INVSQRT2, 0, // 3-7 + -INVSQRT2, -INVSQRT2, 0 // 4-0 + }; + return (const Point*)EdgeNormals; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Returns world edge normal + * \param edge_index [in] 0 <= edge index < 12 + * \param world_normal [out] edge normal in world space + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBB::ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const +{ + ASSERT(edge_index<12); + world_normal = GetLocalEdgeNormals()[edge_index] * mRot; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes an LSS surrounding the OBB. + * \param lss [out] the LSS + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBB::ComputeLSS(LSS& lss) const +{ + Point Axis0 = mRot[0]; + Point Axis1 = mRot[1]; + Point Axis2 = mRot[2]; + + switch(mExtents.LargestAxis()) + { + case 0: + lss.mRadius = (mExtents.y + mExtents.z)*0.5f; + lss.mP0 = mCenter + Axis0 * (mExtents.x - lss.mRadius); + lss.mP1 = mCenter - Axis0 * (mExtents.x - lss.mRadius); + break; + case 1: + lss.mRadius = (mExtents.x + mExtents.z)*0.5f; + lss.mP0 = mCenter + Axis1 * (mExtents.y - lss.mRadius); + lss.mP1 = mCenter - Axis1 * (mExtents.y - lss.mRadius); + break; + case 2: + lss.mRadius = (mExtents.x + mExtents.y)*0.5f; + lss.mP0 = mCenter + Axis2 * (mExtents.z - lss.mRadius); + lss.mP1 = mCenter - Axis2 * (mExtents.z - lss.mRadius); + break; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the OBB is inside another OBB. + * \param box [in] the other OBB + * \return TRUE if we're inside the other box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL OBB::IsInside(const OBB& box) const +{ + // Make a 4x4 from the box & inverse it + Matrix4x4 M0Inv; + { + Matrix4x4 M0 = box.mRot; + M0.SetTrans(box.mCenter); + InvertPRMatrix(M0Inv, M0); + } + + // With our inversed 4x4, create box1 in space of box0 + OBB _1in0; + Rotate(M0Inv, _1in0); + + // This should cancel out box0's rotation, i.e. it's now an AABB. + // => Center(0,0,0), Rot(identity) + + // The two boxes are in the same space so now we can compare them. + + // Create the AABB of (box1 in space of box0) + const Matrix3x3& mtx = _1in0.mRot; + + float f = fabsf(mtx.m[0][0] * mExtents.x) + fabsf(mtx.m[1][0] * mExtents.y) + fabsf(mtx.m[2][0] * mExtents.z) - box.mExtents.x; + if(f > _1in0.mCenter.x) return FALSE; + if(-f < _1in0.mCenter.x) return FALSE; + + f = fabsf(mtx.m[0][1] * mExtents.x) + fabsf(mtx.m[1][1] * mExtents.y) + fabsf(mtx.m[2][1] * mExtents.z) - box.mExtents.y; + if(f > _1in0.mCenter.y) return FALSE; + if(-f < _1in0.mCenter.y) return FALSE; + + f = fabsf(mtx.m[0][2] * mExtents.x) + fabsf(mtx.m[1][2] * mExtents.y) + fabsf(mtx.m[2][2] * mExtents.z) - box.mExtents.z; + if(f > _1in0.mCenter.z) return FALSE; + if(-f < _1in0.mCenter.z) return FALSE; + + return TRUE; +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceOBB.h b/Extras/CDTestFramework/Opcode/Ice/IceOBB.h index 4e69f1087..28ad400bc 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceOBB.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceOBB.h @@ -1,193 +1,193 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains OBB-related code. (oriented bounding box) - * \file IceOBB.h - * \author Pierre Terdiman - * \date January, 13, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEOBB_H__ -#define __ICEOBB_H__ - - // Forward declarations - class LSS; - - class ICEMATHS_API OBB - { - public: - //! Constructor - inline_ OBB() {} - //! Constructor - inline_ OBB(const Point& center, const Point& extents, const Matrix3x3& rot) : mCenter(center), mExtents(extents), mRot(rot) {} - //! Destructor - inline_ ~OBB() {} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty OBB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() - { - mCenter.Zero(); - mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); - mRot.Identity(); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a point is contained within the OBB. - * \param p [in] the world point to test - * \return true if inside the OBB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ContainsPoint(const Point& p) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds an OBB from an AABB and a world transform. - * \param aabb [in] the aabb - * \param mat [in] the world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Create(const AABB& aabb, const Matrix4x4& mat); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the OBB after an arbitrary transform by a 4x4 matrix. - * \param mtx [in] the transform matrix - * \param obb [out] the transformed OBB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, OBB& obb) const - { - // The extents remain constant - obb.mExtents = mExtents; - // The center gets x-formed - obb.mCenter = mCenter * mtx; - // Combine rotations - obb.mRot = mRot * Matrix3x3(mtx); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the OBB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Center, Extents) boxes: Extents >= 0.0f - if(mExtents.x < 0.0f) return FALSE; - if(mExtents.y < 0.0f) return FALSE; - if(mExtents.z < 0.0f) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the obb planes. - * \param planes [out] 6 box planes - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ComputePlanes(Plane* planes) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the obb points. - * \param pts [out] 8 box points - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ComputePoints(Point* pts) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes vertex normals. - * \param pts [out] 8 box points - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ComputeVertexNormals(Point* pts) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns edges. - * \return 24 indices (12 edges) indexing the list returned by ComputePoints() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const udword* GetEdges() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns local edge normals. - * \return edge normals in local space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const Point* GetLocalEdgeNormals() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns world edge normal - * \param edge_index [in] 0 <= edge index < 12 - * \param world_normal [out] edge normal in world space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes an LSS surrounding the OBB. - * \param lss [out] the LSS - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void ComputeLSS(LSS& lss) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the OBB is inside another OBB. - * \param box [in] the other OBB - * \return TRUE if we're inside the other box - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - BOOL IsInside(const OBB& box) const; - - inline_ const Point& GetCenter() const { return mCenter; } - inline_ const Point& GetExtents() const { return mExtents; } - inline_ const Matrix3x3& GetRot() const { return mRot; } - - inline_ void GetRotatedExtents(Matrix3x3& extents) const - { - extents = mRot; - extents.Scale(mExtents); - } - - Point mCenter; //!< B for Box - Point mExtents; //!< B for Bounding - Matrix3x3 mRot; //!< O for Oriented - - // Orientation is stored in row-major format, - // i.e. rows = eigen vectors of the covariance matrix - }; - -#endif // __ICEOBB_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains OBB-related code. (oriented bounding box) + * \file IceOBB.h + * \author Pierre Terdiman + * \date January, 13, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEOBB_H__ +#define __ICEOBB_H__ + + // Forward declarations + class LSS; + + class ICEMATHS_API OBB + { + public: + //! Constructor + inline_ OBB() {} + //! Constructor + inline_ OBB(const Point& center, const Point& extents, const Matrix3x3& rot) : mCenter(center), mExtents(extents), mRot(rot) {} + //! Destructor + inline_ ~OBB() {} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty OBB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() + { + mCenter.Zero(); + mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + mRot.Identity(); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a point is contained within the OBB. + * \param p [in] the world point to test + * \return true if inside the OBB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ContainsPoint(const Point& p) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds an OBB from an AABB and a world transform. + * \param aabb [in] the aabb + * \param mat [in] the world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Create(const AABB& aabb, const Matrix4x4& mat); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the OBB after an arbitrary transform by a 4x4 matrix. + * \param mtx [in] the transform matrix + * \param obb [out] the transformed OBB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, OBB& obb) const + { + // The extents remain constant + obb.mExtents = mExtents; + // The center gets x-formed + obb.mCenter = mCenter * mtx; + // Combine rotations + obb.mRot = mRot * Matrix3x3(mtx); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the OBB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Center, Extents) boxes: Extents >= 0.0f + if(mExtents.x < 0.0f) return FALSE; + if(mExtents.y < 0.0f) return FALSE; + if(mExtents.z < 0.0f) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the obb planes. + * \param planes [out] 6 box planes + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ComputePlanes(Plane* planes) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the obb points. + * \param pts [out] 8 box points + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ComputePoints(Point* pts) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes vertex normals. + * \param pts [out] 8 box points + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ComputeVertexNormals(Point* pts) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns edges. + * \return 24 indices (12 edges) indexing the list returned by ComputePoints() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + const udword* GetEdges() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns local edge normals. + * \return edge normals in local space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + const Point* GetLocalEdgeNormals() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns world edge normal + * \param edge_index [in] 0 <= edge index < 12 + * \param world_normal [out] edge normal in world space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes an LSS surrounding the OBB. + * \param lss [out] the LSS + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void ComputeLSS(LSS& lss) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the OBB is inside another OBB. + * \param box [in] the other OBB + * \return TRUE if we're inside the other box + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + BOOL IsInside(const OBB& box) const; + + inline_ const Point& GetCenter() const { return mCenter; } + inline_ const Point& GetExtents() const { return mExtents; } + inline_ const Matrix3x3& GetRot() const { return mRot; } + + inline_ void GetRotatedExtents(Matrix3x3& extents) const + { + extents = mRot; + extents.Scale(mExtents); + } + + Point mCenter; //!< B for Box + Point mExtents; //!< B for Bounding + Matrix3x3 mRot; //!< O for Oriented + + // Orientation is stored in row-major format, + // i.e. rows = eigen vectors of the covariance matrix + }; + +#endif // __ICEOBB_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IcePairs.h b/Extras/CDTestFramework/Opcode/Ice/IcePairs.h index b73bd3c7c..6817c336f 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IcePairs.h +++ b/Extras/CDTestFramework/Opcode/Ice/IcePairs.h @@ -1,61 +1,61 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a simple pair class. - * \file IcePairs.h - * \author Pierre Terdiman - * \date January, 13, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPAIRS_H__ -#define __ICEPAIRS_H__ - - //! A generic couple structure - struct ICECORE_API Pair - { - inline_ Pair() {} - inline_ Pair(udword i0, udword i1) : id0(i0), id1(i1) {} - - udword id0; //!< First index of the pair - udword id1; //!< Second index of the pair - }; - - class ICECORE_API Pairs : private Container - { - public: - // Constructor / Destructor - Pairs() {} - ~Pairs() {} - - inline_ udword GetNbPairs() const { return GetNbEntries()>>1; } - inline_ const Pair* GetPairs() const { return (const Pair*)GetEntries(); } - inline_ const Pair* GetPair(udword i) const { return (const Pair*)&GetEntries()[i+i]; } - - inline_ BOOL HasPairs() const { return IsNotEmpty(); } - - inline_ void ResetPairs() { Reset(); } - inline_ void DeleteLastPair() { DeleteLastEntry(); DeleteLastEntry(); } - - inline_ void AddPair(const Pair& p) { Add(p.id0).Add(p.id1); } - inline_ void AddPair(udword id0, udword id1) { Add(id0).Add(id1); } - }; - -#endif // __ICEPAIRS_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a simple pair class. + * \file IcePairs.h + * \author Pierre Terdiman + * \date January, 13, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPAIRS_H__ +#define __ICEPAIRS_H__ + + //! A generic couple structure + struct ICECORE_API Pair + { + inline_ Pair() {} + inline_ Pair(udword i0, udword i1) : id0(i0), id1(i1) {} + + udword id0; //!< First index of the pair + udword id1; //!< Second index of the pair + }; + + class ICECORE_API Pairs : private Container + { + public: + // Constructor / Destructor + Pairs() {} + ~Pairs() {} + + inline_ udword GetNbPairs() const { return GetNbEntries()>>1; } + inline_ const Pair* GetPairs() const { return (const Pair*)GetEntries(); } + inline_ const Pair* GetPair(udword i) const { return (const Pair*)&GetEntries()[i+i]; } + + inline_ BOOL HasPairs() const { return IsNotEmpty(); } + + inline_ void ResetPairs() { Reset(); } + inline_ void DeleteLastPair() { DeleteLastEntry(); DeleteLastEntry(); } + + inline_ void AddPair(const Pair& p) { Add(p.id0).Add(p.id1); } + inline_ void AddPair(udword id0, udword id1) { Add(id0).Add(id1); } + }; + +#endif // __ICEPAIRS_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp b/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp index 9233def60..b7fe6523f 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp @@ -1,61 +1,61 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for planes. - * \file IcePlane.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Plane class. - * \class Plane - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the plane equation from 3 points. - * \param p0 [in] first point - * \param p1 [in] second point - * \param p2 [in] third point - * \return Self-reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Plane& Plane::Set(const Point& p0, const Point& p1, const Point& p2) -{ - Point Edge0 = p1 - p0; - Point Edge1 = p2 - p0; - - n = Edge0 ^ Edge1; - n.Normalize(); - - d = -(p0 | n); - - return *this; -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for planes. + * \file IcePlane.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Plane class. + * \class Plane + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the plane equation from 3 points. + * \param p0 [in] first point + * \param p1 [in] second point + * \param p2 [in] third point + * \return Self-reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Plane& Plane::Set(const Point& p0, const Point& p1, const Point& p2) +{ + Point Edge0 = p1 - p0; + Point Edge1 = p2 - p0; + + n = Edge0 ^ Edge1; + n.Normalize(); + + d = -(p0 | n); + + return *this; +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IcePlane.h b/Extras/CDTestFramework/Opcode/Ice/IcePlane.h index 7707350bb..1f3669bd9 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IcePlane.h +++ b/Extras/CDTestFramework/Opcode/Ice/IcePlane.h @@ -1,129 +1,129 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for planes. - * \file IcePlane.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPLANE_H__ -#define __ICEPLANE_H__ - - #define PLANE_EPSILON (1.0e-7f) - - class ICEMATHS_API Plane - { - public: - //! Constructor - inline_ Plane() { } - //! Constructor from a normal and a distance - inline_ Plane(float nx, float ny, float nz, float d) { Set(nx, ny, nz, d); } - //! Constructor from a point on the plane and a normal - inline_ Plane(const Point& p, const Point& n) { Set(p, n); } - //! Constructor from three points - inline_ Plane(const Point& p0, const Point& p1, const Point& p2) { Set(p0, p1, p2); } - //! Constructor from a normal and a distance - inline_ Plane(const Point& _n, float _d) { n = _n; d = _d; } - //! Copy constructor - inline_ Plane(const Plane& plane) : n(plane.n), d(plane.d) { } - //! Destructor - inline_ ~Plane() { } - - inline_ Plane& Zero() { n.Zero(); d = 0.0f; return *this; } - inline_ Plane& Set(float nx, float ny, float nz, float _d) { n.Set(nx, ny, nz); d = _d; return *this; } - inline_ Plane& Set(const Point& p, const Point& _n) { n = _n; d = - p | _n; return *this; } - Plane& Set(const Point& p0, const Point& p1, const Point& p2); - - inline_ float Distance(const Point& p) const { return (p | n) + d; } - inline_ bool Belongs(const Point& p) const { return fabsf(Distance(p)) < PLANE_EPSILON; } - - inline_ void Normalize() - { - float Denom = 1.0f / n.Magnitude(); - n.x *= Denom; - n.y *= Denom; - n.z *= Denom; - d *= Denom; - } - public: - // Members - Point n; //!< The normal to the plane - float d; //!< The distance from the origin - - // Cast operators - inline_ operator Point() const { return n; } - inline_ operator HPoint() const { return HPoint(n, d); } - - // Arithmetic operators - inline_ Plane operator*(const Matrix4x4& m) const - { - // Old code from Irion. Kept for reference. - Plane Ret(*this); - return Ret *= m; - } - - inline_ Plane& operator*=(const Matrix4x4& m) - { - // Old code from Irion. Kept for reference. - Point n2 = HPoint(n, 0.0f) * m; - d = -((Point) (HPoint( -d*n, 1.0f ) * m) | n2); - n = n2; - return *this; - } - }; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. - * \param transformed [out] transformed plane - * \param plane [in] source plane - * \param transform [in] transform matrix - * \warning the plane normal must be unit-length - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void TransformPlane(Plane& transformed, const Plane& plane, const Matrix4x4& transform) - { - // Rotate the normal using the rotation part of the 4x4 matrix - transformed.n = plane.n * Matrix3x3(transform); - - // Compute new d - transformed.d = plane.d - (Point(transform.GetTrans())|transformed.n); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. - * \param plane [in/out] source plane (transformed on return) - * \param transform [in] transform matrix - * \warning the plane normal must be unit-length - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void TransformPlane(Plane& plane, const Matrix4x4& transform) - { - // Rotate the normal using the rotation part of the 4x4 matrix - plane.n *= Matrix3x3(transform); - - // Compute new d - plane.d -= Point(transform.GetTrans())|plane.n; - } - -#endif // __ICEPLANE_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for planes. + * \file IcePlane.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPLANE_H__ +#define __ICEPLANE_H__ + + #define PLANE_EPSILON (1.0e-7f) + + class ICEMATHS_API Plane + { + public: + //! Constructor + inline_ Plane() { } + //! Constructor from a normal and a distance + inline_ Plane(float nx, float ny, float nz, float d) { Set(nx, ny, nz, d); } + //! Constructor from a point on the plane and a normal + inline_ Plane(const Point& p, const Point& n) { Set(p, n); } + //! Constructor from three points + inline_ Plane(const Point& p0, const Point& p1, const Point& p2) { Set(p0, p1, p2); } + //! Constructor from a normal and a distance + inline_ Plane(const Point& _n, float _d) { n = _n; d = _d; } + //! Copy constructor + inline_ Plane(const Plane& plane) : n(plane.n), d(plane.d) { } + //! Destructor + inline_ ~Plane() { } + + inline_ Plane& Zero() { n.Zero(); d = 0.0f; return *this; } + inline_ Plane& Set(float nx, float ny, float nz, float _d) { n.Set(nx, ny, nz); d = _d; return *this; } + inline_ Plane& Set(const Point& p, const Point& _n) { n = _n; d = - p | _n; return *this; } + Plane& Set(const Point& p0, const Point& p1, const Point& p2); + + inline_ float Distance(const Point& p) const { return (p | n) + d; } + inline_ bool Belongs(const Point& p) const { return fabsf(Distance(p)) < PLANE_EPSILON; } + + inline_ void Normalize() + { + float Denom = 1.0f / n.Magnitude(); + n.x *= Denom; + n.y *= Denom; + n.z *= Denom; + d *= Denom; + } + public: + // Members + Point n; //!< The normal to the plane + float d; //!< The distance from the origin + + // Cast operators + inline_ operator Point() const { return n; } + inline_ operator HPoint() const { return HPoint(n, d); } + + // Arithmetic operators + inline_ Plane operator*(const Matrix4x4& m) const + { + // Old code from Irion. Kept for reference. + Plane Ret(*this); + return Ret *= m; + } + + inline_ Plane& operator*=(const Matrix4x4& m) + { + // Old code from Irion. Kept for reference. + Point n2 = HPoint(n, 0.0f) * m; + d = -((Point) (HPoint( -d*n, 1.0f ) * m) | n2); + n = n2; + return *this; + } + }; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. + * \param transformed [out] transformed plane + * \param plane [in] source plane + * \param transform [in] transform matrix + * \warning the plane normal must be unit-length + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void TransformPlane(Plane& transformed, const Plane& plane, const Matrix4x4& transform) + { + // Rotate the normal using the rotation part of the 4x4 matrix + transformed.n = plane.n * Matrix3x3(transform); + + // Compute new d + transformed.d = plane.d - (Point(transform.GetTrans())|transformed.n); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. + * \param plane [in/out] source plane (transformed on return) + * \param transform [in] transform matrix + * \warning the plane normal must be unit-length + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void TransformPlane(Plane& plane, const Matrix4x4& transform) + { + // Rotate the normal using the rotation part of the 4x4 matrix + plane.n *= Matrix3x3(transform); + + // Compute new d + plane.d -= Point(transform.GetTrans())|plane.n; + } + +#endif // __ICEPLANE_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp b/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp index ff96b49b9..5fcbd5236 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp @@ -1,209 +1,209 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3D vectors. - * \file IcePoint.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * 3D point. - * - * The name is "Point" instead of "Vector" since a vector is N-dimensional, whereas a point is an implicit "vector of dimension 3". - * So the choice was between "Point" and "Vector3", the first one looked better (IMHO). - * - * Some people, then, use a typedef to handle both points & vectors using the same class: typedef Point Vector3; - * This is bad since it opens the door to a lot of confusion while reading the code. I know it may sounds weird but check this out: - * - * \code - * Point P0,P1 = some 3D points; - * Point Delta = P1 - P0; - * \endcode - * - * This compiles fine, although you should have written: - * - * \code - * Point P0,P1 = some 3D points; - * Vector3 Delta = P1 - P0; - * \endcode - * - * Subtle things like this are not caught at compile-time, and when you find one in the code, you never know whether it's a mistake - * from the author or something you don't get. - * - * One way to handle it at compile-time would be to use different classes for Point & Vector3, only overloading operator "-" for vectors. - * But then, you get a lot of redundant code in thoses classes, and basically it's really a lot of useless work. - * - * Another way would be to use homogeneous points: w=1 for points, w=0 for vectors. That's why the HPoint class exists. Now, to store - * your model's vertices and in most cases, you really want to use Points to save ram. - * - * \class Point - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Creates a positive unit random vector. - * \return Self-reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Point& Point::PositiveUnitRandomVector() -{ - x = UnitRandomFloat(); - y = UnitRandomFloat(); - z = UnitRandomFloat(); - Normalize(); - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Creates a unit random vector. - * \return Self-reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Point& Point::UnitRandomVector() -{ - x = UnitRandomFloat() - 0.5f; - y = UnitRandomFloat() - 0.5f; - z = UnitRandomFloat() - 0.5f; - Normalize(); - return *this; -} - -// Cast operator -// WARNING: not inlined -Point::operator HPoint() const { return HPoint(x, y, z, 0.0f); } - -Point& Point::Refract(const Point& eye, const Point& n, float refractindex, Point& refracted) -{ - // Point EyePt = eye position - // Point p = current vertex - // Point n = vertex normal - // Point rv = refracted vector - // Eye vector - doesn't need to be normalized - Point Env; - Env.x = eye.x - x; - Env.y = eye.y - y; - Env.z = eye.z - z; - - float NDotE = n|Env; - float NDotN = n|n; - NDotE /= refractindex; - - // Refracted vector - refracted = n*NDotE - Env*NDotN; - - return *this; -} - -Point& Point::ProjectToPlane(const Plane& p) -{ - *this-= (p.d + (*this|p.n))*p.n; - return *this; -} - -void Point::ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const -{ - projected = HPoint(x, y, z, 1.0f) * mat; - projected.w = 1.0f / projected.w; - - projected.x*=projected.w; - projected.y*=projected.w; - projected.z*=projected.w; - - projected.x *= halfrenderwidth; projected.x += halfrenderwidth; - projected.y *= -halfrenderheight; projected.y += halfrenderheight; -} - -void Point::SetNotUsed() -{ - // We use a particular integer pattern : 0xffffffff everywhere. This is a NAN. - IR(x) = 0xffffffff; - IR(y) = 0xffffffff; - IR(z) = 0xffffffff; -} - -BOOL Point::IsNotUsed() const -{ - if(IR(x)!=0xffffffff) return FALSE; - if(IR(y)!=0xffffffff) return FALSE; - if(IR(z)!=0xffffffff) return FALSE; - return TRUE; -} - -Point& Point::Mult(const Matrix3x3& mat, const Point& a) -{ - x = a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; - y = a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; - z = a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; - return *this; -} - -Point& Point::Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2) -{ - x = a1.x * mat1.m[0][0] + a1.y * mat1.m[0][1] + a1.z * mat1.m[0][2] + a2.x * mat2.m[0][0] + a2.y * mat2.m[0][1] + a2.z * mat2.m[0][2]; - y = a1.x * mat1.m[1][0] + a1.y * mat1.m[1][1] + a1.z * mat1.m[1][2] + a2.x * mat2.m[1][0] + a2.y * mat2.m[1][1] + a2.z * mat2.m[1][2]; - z = a1.x * mat1.m[2][0] + a1.y * mat1.m[2][1] + a1.z * mat1.m[2][2] + a2.x * mat2.m[2][0] + a2.y * mat2.m[2][1] + a2.z * mat2.m[2][2]; - return *this; -} - -Point& Point::Mac(const Matrix3x3& mat, const Point& a) -{ - x += a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; - y += a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; - z += a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; - return *this; -} - -Point& Point::TransMult(const Matrix3x3& mat, const Point& a) -{ - x = a.x * mat.m[0][0] + a.y * mat.m[1][0] + a.z * mat.m[2][0]; - y = a.x * mat.m[0][1] + a.y * mat.m[1][1] + a.z * mat.m[2][1]; - z = a.x * mat.m[0][2] + a.y * mat.m[1][2] + a.z * mat.m[2][2]; - return *this; -} - -Point& Point::Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) -{ - x = r.x * rotpos.m[0][0] + r.y * rotpos.m[0][1] + r.z * rotpos.m[0][2] + linpos.x; - y = r.x * rotpos.m[1][0] + r.y * rotpos.m[1][1] + r.z * rotpos.m[1][2] + linpos.y; - z = r.x * rotpos.m[2][0] + r.y * rotpos.m[2][1] + r.z * rotpos.m[2][2] + linpos.z; - return *this; -} - -Point& Point::InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) -{ - float sx = r.x - linpos.x; - float sy = r.y - linpos.y; - float sz = r.z - linpos.z; - x = sx * rotpos.m[0][0] + sy * rotpos.m[1][0] + sz * rotpos.m[2][0]; - y = sx * rotpos.m[0][1] + sy * rotpos.m[1][1] + sz * rotpos.m[2][1]; - z = sx * rotpos.m[0][2] + sy * rotpos.m[1][2] + sz * rotpos.m[2][2]; - return *this; -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3D vectors. + * \file IcePoint.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * 3D point. + * + * The name is "Point" instead of "Vector" since a vector is N-dimensional, whereas a point is an implicit "vector of dimension 3". + * So the choice was between "Point" and "Vector3", the first one looked better (IMHO). + * + * Some people, then, use a typedef to handle both points & vectors using the same class: typedef Point Vector3; + * This is bad since it opens the door to a lot of confusion while reading the code. I know it may sounds weird but check this out: + * + * \code + * Point P0,P1 = some 3D points; + * Point Delta = P1 - P0; + * \endcode + * + * This compiles fine, although you should have written: + * + * \code + * Point P0,P1 = some 3D points; + * Vector3 Delta = P1 - P0; + * \endcode + * + * Subtle things like this are not caught at compile-time, and when you find one in the code, you never know whether it's a mistake + * from the author or something you don't get. + * + * One way to handle it at compile-time would be to use different classes for Point & Vector3, only overloading operator "-" for vectors. + * But then, you get a lot of redundant code in thoses classes, and basically it's really a lot of useless work. + * + * Another way would be to use homogeneous points: w=1 for points, w=0 for vectors. That's why the HPoint class exists. Now, to store + * your model's vertices and in most cases, you really want to use Points to save ram. + * + * \class Point + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Creates a positive unit random vector. + * \return Self-reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Point& Point::PositiveUnitRandomVector() +{ + x = UnitRandomFloat(); + y = UnitRandomFloat(); + z = UnitRandomFloat(); + Normalize(); + return *this; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Creates a unit random vector. + * \return Self-reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Point& Point::UnitRandomVector() +{ + x = UnitRandomFloat() - 0.5f; + y = UnitRandomFloat() - 0.5f; + z = UnitRandomFloat() - 0.5f; + Normalize(); + return *this; +} + +// Cast operator +// WARNING: not inlined +Point::operator HPoint() const { return HPoint(x, y, z, 0.0f); } + +Point& Point::Refract(const Point& eye, const Point& n, float refractindex, Point& refracted) +{ + // Point EyePt = eye position + // Point p = current vertex + // Point n = vertex normal + // Point rv = refracted vector + // Eye vector - doesn't need to be normalized + Point Env; + Env.x = eye.x - x; + Env.y = eye.y - y; + Env.z = eye.z - z; + + float NDotE = n|Env; + float NDotN = n|n; + NDotE /= refractindex; + + // Refracted vector + refracted = n*NDotE - Env*NDotN; + + return *this; +} + +Point& Point::ProjectToPlane(const Plane& p) +{ + *this-= (p.d + (*this|p.n))*p.n; + return *this; +} + +void Point::ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const +{ + projected = HPoint(x, y, z, 1.0f) * mat; + projected.w = 1.0f / projected.w; + + projected.x*=projected.w; + projected.y*=projected.w; + projected.z*=projected.w; + + projected.x *= halfrenderwidth; projected.x += halfrenderwidth; + projected.y *= -halfrenderheight; projected.y += halfrenderheight; +} + +void Point::SetNotUsed() +{ + // We use a particular integer pattern : 0xffffffff everywhere. This is a NAN. + IR(x) = 0xffffffff; + IR(y) = 0xffffffff; + IR(z) = 0xffffffff; +} + +BOOL Point::IsNotUsed() const +{ + if(IR(x)!=0xffffffff) return FALSE; + if(IR(y)!=0xffffffff) return FALSE; + if(IR(z)!=0xffffffff) return FALSE; + return TRUE; +} + +Point& Point::Mult(const Matrix3x3& mat, const Point& a) +{ + x = a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; + y = a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; + z = a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; + return *this; +} + +Point& Point::Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2) +{ + x = a1.x * mat1.m[0][0] + a1.y * mat1.m[0][1] + a1.z * mat1.m[0][2] + a2.x * mat2.m[0][0] + a2.y * mat2.m[0][1] + a2.z * mat2.m[0][2]; + y = a1.x * mat1.m[1][0] + a1.y * mat1.m[1][1] + a1.z * mat1.m[1][2] + a2.x * mat2.m[1][0] + a2.y * mat2.m[1][1] + a2.z * mat2.m[1][2]; + z = a1.x * mat1.m[2][0] + a1.y * mat1.m[2][1] + a1.z * mat1.m[2][2] + a2.x * mat2.m[2][0] + a2.y * mat2.m[2][1] + a2.z * mat2.m[2][2]; + return *this; +} + +Point& Point::Mac(const Matrix3x3& mat, const Point& a) +{ + x += a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; + y += a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; + z += a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; + return *this; +} + +Point& Point::TransMult(const Matrix3x3& mat, const Point& a) +{ + x = a.x * mat.m[0][0] + a.y * mat.m[1][0] + a.z * mat.m[2][0]; + y = a.x * mat.m[0][1] + a.y * mat.m[1][1] + a.z * mat.m[2][1]; + z = a.x * mat.m[0][2] + a.y * mat.m[1][2] + a.z * mat.m[2][2]; + return *this; +} + +Point& Point::Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) +{ + x = r.x * rotpos.m[0][0] + r.y * rotpos.m[0][1] + r.z * rotpos.m[0][2] + linpos.x; + y = r.x * rotpos.m[1][0] + r.y * rotpos.m[1][1] + r.z * rotpos.m[1][2] + linpos.y; + z = r.x * rotpos.m[2][0] + r.y * rotpos.m[2][1] + r.z * rotpos.m[2][2] + linpos.z; + return *this; +} + +Point& Point::InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) +{ + float sx = r.x - linpos.x; + float sy = r.y - linpos.y; + float sz = r.z - linpos.z; + x = sx * rotpos.m[0][0] + sy * rotpos.m[1][0] + sz * rotpos.m[2][0]; + y = sx * rotpos.m[0][1] + sy * rotpos.m[1][1] + sz * rotpos.m[2][1]; + z = sx * rotpos.m[0][2] + sy * rotpos.m[1][2] + sz * rotpos.m[2][2]; + return *this; +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IcePoint.h b/Extras/CDTestFramework/Opcode/Ice/IcePoint.h index 4baf26c42..a5b372b52 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IcePoint.h +++ b/Extras/CDTestFramework/Opcode/Ice/IcePoint.h @@ -1,544 +1,544 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3D vectors. - * \file IcePoint.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPOINT_H__ -#define __ICEPOINT_H__ - - // Forward declarations - class HPoint; - class Plane; - class Matrix3x3; - class Matrix4x4; - - #define CROSS2D(a, b) (a.x*b.y - b.x*a.y) - - const float EPSILON2 = 1.0e-20f; - - class ICEMATHS_API Point - { - public: - - //! Empty constructor - inline_ Point() {} - //! Constructor from a single float -// inline_ Point(float val) : x(val), y(val), z(val) {} -// Removed since it introduced the nasty "Point T = *Matrix4x4.GetTrans();" bug....... - //! Constructor from floats - inline_ Point(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} - //! Constructor from array - inline_ Point(const float f[3]) : x(f[_X]), y(f[_Y]), z(f[_Z]) {} - //! Copy constructor - inline_ Point(const Point& p) : x(p.x), y(p.y), z(p.z) {} - //! Destructor - inline_ ~Point() {} - - //! Clears the vector - inline_ Point& Zero() { x = y = z = 0.0f; return *this; } - - //! + infinity - inline_ Point& SetPlusInfinity() { x = y = z = MAX_FLOAT; return *this; } - //! - infinity - inline_ Point& SetMinusInfinity() { x = y = z = MIN_FLOAT; return *this; } - - //! Sets positive unit random vector - Point& PositiveUnitRandomVector(); - //! Sets unit random vector - Point& UnitRandomVector(); - - //! Assignment from values - inline_ Point& Set(float _x, float _y, float _z) { x = _x; y = _y; z = _z; return *this; } - //! Assignment from array - inline_ Point& Set(const float f[3]) { x = f[_X]; y = f[_Y]; z = f[_Z]; return *this; } - //! Assignment from another point - inline_ Point& Set(const Point& src) { x = src.x; y = src.y; z = src.z; return *this; } - - //! Adds a vector - inline_ Point& Add(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } - //! Adds a vector - inline_ Point& Add(float _x, float _y, float _z) { x += _x; y += _y; z += _z; return *this; } - //! Adds a vector - inline_ Point& Add(const float f[3]) { x += f[_X]; y += f[_Y]; z += f[_Z]; return *this; } - //! Adds vectors - inline_ Point& Add(const Point& p, const Point& q) { x = p.x+q.x; y = p.y+q.y; z = p.z+q.z; return *this; } - - //! Subtracts a vector - inline_ Point& Sub(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } - //! Subtracts a vector - inline_ Point& Sub(float _x, float _y, float _z) { x -= _x; y -= _y; z -= _z; return *this; } - //! Subtracts a vector - inline_ Point& Sub(const float f[3]) { x -= f[_X]; y -= f[_Y]; z -= f[_Z]; return *this; } - //! Subtracts vectors - inline_ Point& Sub(const Point& p, const Point& q) { x = p.x-q.x; y = p.y-q.y; z = p.z-q.z; return *this; } - - //! this = -this - inline_ Point& Neg() { x = -x; y = -y; z = -z; return *this; } - //! this = -a - inline_ Point& Neg(const Point& a) { x = -a.x; y = -a.y; z = -a.z; return *this; } - - //! Multiplies by a scalar - inline_ Point& Mult(float s) { x *= s; y *= s; z *= s; return *this; } - - //! this = a * scalar - inline_ Point& Mult(const Point& a, float scalar) - { - x = a.x * scalar; - y = a.y * scalar; - z = a.z * scalar; - return *this; - } - - //! this = a + b * scalar - inline_ Point& Mac(const Point& a, const Point& b, float scalar) - { - x = a.x + b.x * scalar; - y = a.y + b.y * scalar; - z = a.z + b.z * scalar; - return *this; - } - - //! this = this + a * scalar - inline_ Point& Mac(const Point& a, float scalar) - { - x += a.x * scalar; - y += a.y * scalar; - z += a.z * scalar; - return *this; - } - - //! this = a - b * scalar - inline_ Point& Msc(const Point& a, const Point& b, float scalar) - { - x = a.x - b.x * scalar; - y = a.y - b.y * scalar; - z = a.z - b.z * scalar; - return *this; - } - - //! this = this - a * scalar - inline_ Point& Msc(const Point& a, float scalar) - { - x -= a.x * scalar; - y -= a.y * scalar; - z -= a.z * scalar; - return *this; - } - - //! this = a + b * scalarb + c * scalarc - inline_ Point& Mac2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) - { - x = a.x + b.x * scalarb + c.x * scalarc; - y = a.y + b.y * scalarb + c.y * scalarc; - z = a.z + b.z * scalarb + c.z * scalarc; - return *this; - } - - //! this = a - b * scalarb - c * scalarc - inline_ Point& Msc2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) - { - x = a.x - b.x * scalarb - c.x * scalarc; - y = a.y - b.y * scalarb - c.y * scalarc; - z = a.z - b.z * scalarb - c.z * scalarc; - return *this; - } - - //! this = mat * a - inline_ Point& Mult(const Matrix3x3& mat, const Point& a); - - //! this = mat1 * a1 + mat2 * a2 - inline_ Point& Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2); - - //! this = this + mat * a - inline_ Point& Mac(const Matrix3x3& mat, const Point& a); - - //! this = transpose(mat) * a - inline_ Point& TransMult(const Matrix3x3& mat, const Point& a); - - //! Linear interpolate between two vectors: this = a + t * (b - a) - inline_ Point& Lerp(const Point& a, const Point& b, float t) - { - x = a.x + t * (b.x - a.x); - y = a.y + t * (b.y - a.y); - z = a.z + t * (b.z - a.z); - return *this; - } - - //! Hermite interpolate between p1 and p2. p0 and p3 are used for finding gradient at p1 and p2. - //! this = p0 * (2t^2 - t^3 - t)/2 - //! + p1 * (3t^3 - 5t^2 + 2)/2 - //! + p2 * (4t^2 - 3t^3 + t)/2 - //! + p3 * (t^3 - t^2)/2 - inline_ Point& Herp(const Point& p0, const Point& p1, const Point& p2, const Point& p3, float t) - { - float t2 = t * t; - float t3 = t2 * t; - float kp0 = (2.0f * t2 - t3 - t) * 0.5f; - float kp1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f; - float kp2 = (4.0f * t2 - 3.0f * t3 + t) * 0.5f; - float kp3 = (t3 - t2) * 0.5f; - x = p0.x * kp0 + p1.x * kp1 + p2.x * kp2 + p3.x * kp3; - y = p0.y * kp0 + p1.y * kp1 + p2.y * kp2 + p3.y * kp3; - z = p0.z * kp0 + p1.z * kp1 + p2.z * kp2 + p3.z * kp3; - return *this; - } - - //! this = rotpos * r + linpos - inline_ Point& Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); - - //! this = trans(rotpos) * (r - linpos) - inline_ Point& InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); - - //! Returns MIN(x, y, z); - inline_ float Min() const { return MIN(x, MIN(y, z)); } - //! Returns MAX(x, y, z); - inline_ float Max() const { return MAX(x, MAX(y, z)); } - //! Sets each element to be componentwise minimum - inline_ Point& Min(const Point& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); return *this; } - //! Sets each element to be componentwise maximum - inline_ Point& Max(const Point& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); return *this; } - - //! Clamps each element - inline_ Point& Clamp(float min, float max) - { - if(xmax) x=max; - if(ymax) y=max; - if(zmax) z=max; - return *this; - } - - //! Computes square magnitude - inline_ float SquareMagnitude() const { return x*x + y*y + z*z; } - //! Computes magnitude - inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z); } - //! Computes volume - inline_ float Volume() const { return x * y * z; } - - //! Checks the point is near zero - inline_ bool ApproxZero() const { return SquareMagnitude() < EPSILON2; } - - //! Tests for exact zero vector - inline_ BOOL IsZero() const - { - if(IR(x) || IR(y) || IR(z)) return FALSE; - return TRUE; - } - - //! Checks point validity - inline_ BOOL IsValid() const - { - if(!IsValidFloat(x)) return FALSE; - if(!IsValidFloat(y)) return FALSE; - if(!IsValidFloat(z)) return FALSE; - return TRUE; - } - - //! Slighty moves the point - void Tweak(udword coord_mask, udword tweak_mask) - { - if(coord_mask&1) { udword Dummy = IR(x); Dummy^=tweak_mask; x = FR(Dummy); } - if(coord_mask&2) { udword Dummy = IR(y); Dummy^=tweak_mask; y = FR(Dummy); } - if(coord_mask&4) { udword Dummy = IR(z); Dummy^=tweak_mask; z = FR(Dummy); } - } - - #define TWEAKMASK 0x3fffff - #define TWEAKNOTMASK ~TWEAKMASK - //! Slighty moves the point out - inline_ void TweakBigger() - { - udword Dummy = (IR(x)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); - Dummy = (IR(y)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); - Dummy = (IR(z)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); - } - - //! Slighty moves the point in - inline_ void TweakSmaller() - { - udword Dummy = (IR(x)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); - Dummy = (IR(y)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); - Dummy = (IR(z)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); - } - - //! Normalizes the vector - inline_ Point& Normalize() - { - float M = x*x + y*y + z*z; - if(M) - { - M = 1.0f / sqrtf(M); - x *= M; - y *= M; - z *= M; - } - return *this; - } - - //! Sets vector length - inline_ Point& SetLength(float length) - { - float NewLength = length / Magnitude(); - x *= NewLength; - y *= NewLength; - z *= NewLength; - return *this; - } - - //! Clamps vector length - inline_ Point& ClampLength(float limit_length) - { - if(limit_length>=0.0f) // Magnitude must be positive - { - float CurrentSquareLength = SquareMagnitude(); - - if(CurrentSquareLength > limit_length * limit_length) - { - float Coeff = limit_length / sqrtf(CurrentSquareLength); - x *= Coeff; - y *= Coeff; - z *= Coeff; - } - } - return *this; - } - - //! Computes distance to another point - inline_ float Distance(const Point& b) const - { - return sqrtf((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); - } - - //! Computes square distance to another point - inline_ float SquareDistance(const Point& b) const - { - return ((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); - } - - //! Dot product dp = this|a - inline_ float Dot(const Point& p) const { return p.x * x + p.y * y + p.z * z; } - - //! Cross product this = a x b - inline_ Point& Cross(const Point& a, const Point& b) - { - x = a.y * b.z - a.z * b.y; - y = a.z * b.x - a.x * b.z; - z = a.x * b.y - a.y * b.x; - return *this; - } - - //! Vector code ( bitmask = sign(z) | sign(y) | sign(x) ) - inline_ udword VectorCode() const - { - return (IR(x)>>31) | ((IR(y)&SIGN_BITMASK)>>30) | ((IR(z)&SIGN_BITMASK)>>29); - } - - //! Returns largest axis - inline_ PointComponent LargestAxis() const - { - const float* Vals = &x; - PointComponent m = _X; - if(Vals[_Y] > Vals[m]) m = _Y; - if(Vals[_Z] > Vals[m]) m = _Z; - return m; - } - - //! Returns closest axis - inline_ PointComponent ClosestAxis() const - { - const float* Vals = &x; - PointComponent m = _X; - if(AIR(Vals[_Y]) > AIR(Vals[m])) m = _Y; - if(AIR(Vals[_Z]) > AIR(Vals[m])) m = _Z; - return m; - } - - //! Returns smallest axis - inline_ PointComponent SmallestAxis() const - { - const float* Vals = &x; - PointComponent m = _X; - if(Vals[_Y] < Vals[m]) m = _Y; - if(Vals[_Z] < Vals[m]) m = _Z; - return m; - } - - //! Refracts the point - Point& Refract(const Point& eye, const Point& n, float refractindex, Point& refracted); - - //! Projects the point onto a plane - Point& ProjectToPlane(const Plane& p); - - //! Projects the point onto the screen - void ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const; - - //! Unfolds the point onto a plane according to edge(a,b) - Point& Unfold(Plane& p, Point& a, Point& b); - - //! Hash function from Ville Miettinen - inline_ udword GetHashValue() const - { - const udword* h = (const udword*)(this); - udword f = (h[0]+h[1]*11-(h[2]*17)) & 0x7fffffff; // avoid problems with +-0 - return (f>>22)^(f>>12)^(f); - } - - //! Stuff magic values in the point, marking it as explicitely not used. - void SetNotUsed(); - //! Checks the point is marked as not used - BOOL IsNotUsed() const; - - // Arithmetic operators - - //! Unary operator for Point Negate = - Point - inline_ Point operator-() const { return Point(-x, -y, -z); } - - //! Operator for Point Plus = Point + Point. - inline_ Point operator+(const Point& p) const { return Point(x + p.x, y + p.y, z + p.z); } - //! Operator for Point Minus = Point - Point. - inline_ Point operator-(const Point& p) const { return Point(x - p.x, y - p.y, z - p.z); } - - //! Operator for Point Mul = Point * Point. - inline_ Point operator*(const Point& p) const { return Point(x * p.x, y * p.y, z * p.z); } - //! Operator for Point Scale = Point * float. - inline_ Point operator*(float s) const { return Point(x * s, y * s, z * s ); } - //! Operator for Point Scale = float * Point. - inline_ friend Point operator*(float s, const Point& p) { return Point(s * p.x, s * p.y, s * p.z); } - - //! Operator for Point Div = Point / Point. - inline_ Point operator/(const Point& p) const { return Point(x / p.x, y / p.y, z / p.z); } - //! Operator for Point Scale = Point / float. - inline_ Point operator/(float s) const { s = 1.0f / s; return Point(x * s, y * s, z * s); } - //! Operator for Point Scale = float / Point. - inline_ friend Point operator/(float s, const Point& p) { return Point(s / p.x, s / p.y, s / p.z); } - - //! Operator for float DotProd = Point | Point. - inline_ float operator|(const Point& p) const { return x*p.x + y*p.y + z*p.z; } - //! Operator for Point VecProd = Point ^ Point. - inline_ Point operator^(const Point& p) const - { - return Point( - y * p.z - z * p.y, - z * p.x - x * p.z, - x * p.y - y * p.x ); - } - - //! Operator for Point += Point. - inline_ Point& operator+=(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } - //! Operator for Point += float. - inline_ Point& operator+=(float s) { x += s; y += s; z += s; return *this; } - - //! Operator for Point -= Point. - inline_ Point& operator-=(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } - //! Operator for Point -= float. - inline_ Point& operator-=(float s) { x -= s; y -= s; z -= s; return *this; } - - //! Operator for Point *= Point. - inline_ Point& operator*=(const Point& p) { x *= p.x; y *= p.y; z *= p.z; return *this; } - //! Operator for Point *= float. - inline_ Point& operator*=(float s) { x *= s; y *= s; z *= s; return *this; } - - //! Operator for Point /= Point. - inline_ Point& operator/=(const Point& p) { x /= p.x; y /= p.y; z /= p.z; return *this; } - //! Operator for Point /= float. - inline_ Point& operator/=(float s) { s = 1.0f/s; x *= s; y *= s; z *= s; return *this; } - - // Logical operators - - //! Operator for "if(Point==Point)" - inline_ bool operator==(const Point& p) const { return ( (IR(x)==IR(p.x))&&(IR(y)==IR(p.y))&&(IR(z)==IR(p.z))); } - //! Operator for "if(Point!=Point)" - inline_ bool operator!=(const Point& p) const { return ( (IR(x)!=IR(p.x))||(IR(y)!=IR(p.y))||(IR(z)!=IR(p.z))); } - - // Arithmetic operators - - //! Operator for Point Mul = Point * Matrix3x3. - inline_ Point operator*(const Matrix3x3& mat) const - { - class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining - const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; - - return Point( - x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0], - x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1], - x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] ); - } - - //! Operator for Point Mul = Point * Matrix4x4. - inline_ Point operator*(const Matrix4x4& mat) const - { - class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining - const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; - - return Point( - x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0], - x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1], - x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]); - } - - //! Operator for Point *= Matrix3x3. - inline_ Point& operator*=(const Matrix3x3& mat) - { - class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining - const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; - - float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0]; - float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1]; - float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2]; - - x = xp; y = yp; z = zp; - - return *this; - } - - //! Operator for Point *= Matrix4x4. - inline_ Point& operator*=(const Matrix4x4& mat) - { - class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining - const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; - - float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0]; - float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1]; - float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]; - - x = xp; y = yp; z = zp; - - return *this; - } - - // Cast operators - - //! Cast a Point to a HPoint. w is set to zero. - operator HPoint() const; - - inline_ operator const float*() const { return &x; } - inline_ operator float*() { return &x; } - - public: - float x, y, z; - }; - - FUNCTION ICEMATHS_API void Normalize1(Point& a); - FUNCTION ICEMATHS_API void Normalize2(Point& a); - -#endif //__ICEPOINT_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3D vectors. + * \file IcePoint.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPOINT_H__ +#define __ICEPOINT_H__ + + // Forward declarations + class HPoint; + class Plane; + class Matrix3x3; + class Matrix4x4; + + #define CROSS2D(a, b) (a.x*b.y - b.x*a.y) + + const float EPSILON2 = 1.0e-20f; + + class ICEMATHS_API Point + { + public: + + //! Empty constructor + inline_ Point() {} + //! Constructor from a single float +// inline_ Point(float val) : x(val), y(val), z(val) {} +// Removed since it introduced the nasty "Point T = *Matrix4x4.GetTrans();" bug....... + //! Constructor from floats + inline_ Point(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} + //! Constructor from array + inline_ Point(const float f[3]) : x(f[_X]), y(f[_Y]), z(f[_Z]) {} + //! Copy constructor + inline_ Point(const Point& p) : x(p.x), y(p.y), z(p.z) {} + //! Destructor + inline_ ~Point() {} + + //! Clears the vector + inline_ Point& Zero() { x = y = z = 0.0f; return *this; } + + //! + infinity + inline_ Point& SetPlusInfinity() { x = y = z = MAX_FLOAT; return *this; } + //! - infinity + inline_ Point& SetMinusInfinity() { x = y = z = MIN_FLOAT; return *this; } + + //! Sets positive unit random vector + Point& PositiveUnitRandomVector(); + //! Sets unit random vector + Point& UnitRandomVector(); + + //! Assignment from values + inline_ Point& Set(float _x, float _y, float _z) { x = _x; y = _y; z = _z; return *this; } + //! Assignment from array + inline_ Point& Set(const float f[3]) { x = f[_X]; y = f[_Y]; z = f[_Z]; return *this; } + //! Assignment from another point + inline_ Point& Set(const Point& src) { x = src.x; y = src.y; z = src.z; return *this; } + + //! Adds a vector + inline_ Point& Add(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } + //! Adds a vector + inline_ Point& Add(float _x, float _y, float _z) { x += _x; y += _y; z += _z; return *this; } + //! Adds a vector + inline_ Point& Add(const float f[3]) { x += f[_X]; y += f[_Y]; z += f[_Z]; return *this; } + //! Adds vectors + inline_ Point& Add(const Point& p, const Point& q) { x = p.x+q.x; y = p.y+q.y; z = p.z+q.z; return *this; } + + //! Subtracts a vector + inline_ Point& Sub(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } + //! Subtracts a vector + inline_ Point& Sub(float _x, float _y, float _z) { x -= _x; y -= _y; z -= _z; return *this; } + //! Subtracts a vector + inline_ Point& Sub(const float f[3]) { x -= f[_X]; y -= f[_Y]; z -= f[_Z]; return *this; } + //! Subtracts vectors + inline_ Point& Sub(const Point& p, const Point& q) { x = p.x-q.x; y = p.y-q.y; z = p.z-q.z; return *this; } + + //! this = -this + inline_ Point& Neg() { x = -x; y = -y; z = -z; return *this; } + //! this = -a + inline_ Point& Neg(const Point& a) { x = -a.x; y = -a.y; z = -a.z; return *this; } + + //! Multiplies by a scalar + inline_ Point& Mult(float s) { x *= s; y *= s; z *= s; return *this; } + + //! this = a * scalar + inline_ Point& Mult(const Point& a, float scalar) + { + x = a.x * scalar; + y = a.y * scalar; + z = a.z * scalar; + return *this; + } + + //! this = a + b * scalar + inline_ Point& Mac(const Point& a, const Point& b, float scalar) + { + x = a.x + b.x * scalar; + y = a.y + b.y * scalar; + z = a.z + b.z * scalar; + return *this; + } + + //! this = this + a * scalar + inline_ Point& Mac(const Point& a, float scalar) + { + x += a.x * scalar; + y += a.y * scalar; + z += a.z * scalar; + return *this; + } + + //! this = a - b * scalar + inline_ Point& Msc(const Point& a, const Point& b, float scalar) + { + x = a.x - b.x * scalar; + y = a.y - b.y * scalar; + z = a.z - b.z * scalar; + return *this; + } + + //! this = this - a * scalar + inline_ Point& Msc(const Point& a, float scalar) + { + x -= a.x * scalar; + y -= a.y * scalar; + z -= a.z * scalar; + return *this; + } + + //! this = a + b * scalarb + c * scalarc + inline_ Point& Mac2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) + { + x = a.x + b.x * scalarb + c.x * scalarc; + y = a.y + b.y * scalarb + c.y * scalarc; + z = a.z + b.z * scalarb + c.z * scalarc; + return *this; + } + + //! this = a - b * scalarb - c * scalarc + inline_ Point& Msc2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) + { + x = a.x - b.x * scalarb - c.x * scalarc; + y = a.y - b.y * scalarb - c.y * scalarc; + z = a.z - b.z * scalarb - c.z * scalarc; + return *this; + } + + //! this = mat * a + inline_ Point& Mult(const Matrix3x3& mat, const Point& a); + + //! this = mat1 * a1 + mat2 * a2 + inline_ Point& Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2); + + //! this = this + mat * a + inline_ Point& Mac(const Matrix3x3& mat, const Point& a); + + //! this = transpose(mat) * a + inline_ Point& TransMult(const Matrix3x3& mat, const Point& a); + + //! Linear interpolate between two vectors: this = a + t * (b - a) + inline_ Point& Lerp(const Point& a, const Point& b, float t) + { + x = a.x + t * (b.x - a.x); + y = a.y + t * (b.y - a.y); + z = a.z + t * (b.z - a.z); + return *this; + } + + //! Hermite interpolate between p1 and p2. p0 and p3 are used for finding gradient at p1 and p2. + //! this = p0 * (2t^2 - t^3 - t)/2 + //! + p1 * (3t^3 - 5t^2 + 2)/2 + //! + p2 * (4t^2 - 3t^3 + t)/2 + //! + p3 * (t^3 - t^2)/2 + inline_ Point& Herp(const Point& p0, const Point& p1, const Point& p2, const Point& p3, float t) + { + float t2 = t * t; + float t3 = t2 * t; + float kp0 = (2.0f * t2 - t3 - t) * 0.5f; + float kp1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f; + float kp2 = (4.0f * t2 - 3.0f * t3 + t) * 0.5f; + float kp3 = (t3 - t2) * 0.5f; + x = p0.x * kp0 + p1.x * kp1 + p2.x * kp2 + p3.x * kp3; + y = p0.y * kp0 + p1.y * kp1 + p2.y * kp2 + p3.y * kp3; + z = p0.z * kp0 + p1.z * kp1 + p2.z * kp2 + p3.z * kp3; + return *this; + } + + //! this = rotpos * r + linpos + inline_ Point& Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); + + //! this = trans(rotpos) * (r - linpos) + inline_ Point& InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); + + //! Returns MIN(x, y, z); + inline_ float Min() const { return MIN(x, MIN(y, z)); } + //! Returns MAX(x, y, z); + inline_ float Max() const { return MAX(x, MAX(y, z)); } + //! Sets each element to be componentwise minimum + inline_ Point& Min(const Point& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); return *this; } + //! Sets each element to be componentwise maximum + inline_ Point& Max(const Point& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); return *this; } + + //! Clamps each element + inline_ Point& Clamp(float min, float max) + { + if(xmax) x=max; + if(ymax) y=max; + if(zmax) z=max; + return *this; + } + + //! Computes square magnitude + inline_ float SquareMagnitude() const { return x*x + y*y + z*z; } + //! Computes magnitude + inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z); } + //! Computes volume + inline_ float Volume() const { return x * y * z; } + + //! Checks the point is near zero + inline_ bool ApproxZero() const { return SquareMagnitude() < EPSILON2; } + + //! Tests for exact zero vector + inline_ BOOL IsZero() const + { + if(IR(x) || IR(y) || IR(z)) return FALSE; + return TRUE; + } + + //! Checks point validity + inline_ BOOL IsValid() const + { + if(!IsValidFloat(x)) return FALSE; + if(!IsValidFloat(y)) return FALSE; + if(!IsValidFloat(z)) return FALSE; + return TRUE; + } + + //! Slighty moves the point + void Tweak(udword coord_mask, udword tweak_mask) + { + if(coord_mask&1) { udword Dummy = IR(x); Dummy^=tweak_mask; x = FR(Dummy); } + if(coord_mask&2) { udword Dummy = IR(y); Dummy^=tweak_mask; y = FR(Dummy); } + if(coord_mask&4) { udword Dummy = IR(z); Dummy^=tweak_mask; z = FR(Dummy); } + } + + #define TWEAKMASK 0x3fffff + #define TWEAKNOTMASK ~TWEAKMASK + //! Slighty moves the point out + inline_ void TweakBigger() + { + udword Dummy = (IR(x)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); + Dummy = (IR(y)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); + Dummy = (IR(z)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); + } + + //! Slighty moves the point in + inline_ void TweakSmaller() + { + udword Dummy = (IR(x)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); + Dummy = (IR(y)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); + Dummy = (IR(z)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); + } + + //! Normalizes the vector + inline_ Point& Normalize() + { + float M = x*x + y*y + z*z; + if(M) + { + M = 1.0f / sqrtf(M); + x *= M; + y *= M; + z *= M; + } + return *this; + } + + //! Sets vector length + inline_ Point& SetLength(float length) + { + float NewLength = length / Magnitude(); + x *= NewLength; + y *= NewLength; + z *= NewLength; + return *this; + } + + //! Clamps vector length + inline_ Point& ClampLength(float limit_length) + { + if(limit_length>=0.0f) // Magnitude must be positive + { + float CurrentSquareLength = SquareMagnitude(); + + if(CurrentSquareLength > limit_length * limit_length) + { + float Coeff = limit_length / sqrtf(CurrentSquareLength); + x *= Coeff; + y *= Coeff; + z *= Coeff; + } + } + return *this; + } + + //! Computes distance to another point + inline_ float Distance(const Point& b) const + { + return sqrtf((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); + } + + //! Computes square distance to another point + inline_ float SquareDistance(const Point& b) const + { + return ((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); + } + + //! Dot product dp = this|a + inline_ float Dot(const Point& p) const { return p.x * x + p.y * y + p.z * z; } + + //! Cross product this = a x b + inline_ Point& Cross(const Point& a, const Point& b) + { + x = a.y * b.z - a.z * b.y; + y = a.z * b.x - a.x * b.z; + z = a.x * b.y - a.y * b.x; + return *this; + } + + //! Vector code ( bitmask = sign(z) | sign(y) | sign(x) ) + inline_ udword VectorCode() const + { + return (IR(x)>>31) | ((IR(y)&SIGN_BITMASK)>>30) | ((IR(z)&SIGN_BITMASK)>>29); + } + + //! Returns largest axis + inline_ PointComponent LargestAxis() const + { + const float* Vals = &x; + PointComponent m = _X; + if(Vals[_Y] > Vals[m]) m = _Y; + if(Vals[_Z] > Vals[m]) m = _Z; + return m; + } + + //! Returns closest axis + inline_ PointComponent ClosestAxis() const + { + const float* Vals = &x; + PointComponent m = _X; + if(AIR(Vals[_Y]) > AIR(Vals[m])) m = _Y; + if(AIR(Vals[_Z]) > AIR(Vals[m])) m = _Z; + return m; + } + + //! Returns smallest axis + inline_ PointComponent SmallestAxis() const + { + const float* Vals = &x; + PointComponent m = _X; + if(Vals[_Y] < Vals[m]) m = _Y; + if(Vals[_Z] < Vals[m]) m = _Z; + return m; + } + + //! Refracts the point + Point& Refract(const Point& eye, const Point& n, float refractindex, Point& refracted); + + //! Projects the point onto a plane + Point& ProjectToPlane(const Plane& p); + + //! Projects the point onto the screen + void ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const; + + //! Unfolds the point onto a plane according to edge(a,b) + Point& Unfold(Plane& p, Point& a, Point& b); + + //! Hash function from Ville Miettinen + inline_ udword GetHashValue() const + { + const udword* h = (const udword*)(this); + udword f = (h[0]+h[1]*11-(h[2]*17)) & 0x7fffffff; // avoid problems with +-0 + return (f>>22)^(f>>12)^(f); + } + + //! Stuff magic values in the point, marking it as explicitely not used. + void SetNotUsed(); + //! Checks the point is marked as not used + BOOL IsNotUsed() const; + + // Arithmetic operators + + //! Unary operator for Point Negate = - Point + inline_ Point operator-() const { return Point(-x, -y, -z); } + + //! Operator for Point Plus = Point + Point. + inline_ Point operator+(const Point& p) const { return Point(x + p.x, y + p.y, z + p.z); } + //! Operator for Point Minus = Point - Point. + inline_ Point operator-(const Point& p) const { return Point(x - p.x, y - p.y, z - p.z); } + + //! Operator for Point Mul = Point * Point. + inline_ Point operator*(const Point& p) const { return Point(x * p.x, y * p.y, z * p.z); } + //! Operator for Point Scale = Point * float. + inline_ Point operator*(float s) const { return Point(x * s, y * s, z * s ); } + //! Operator for Point Scale = float * Point. + inline_ friend Point operator*(float s, const Point& p) { return Point(s * p.x, s * p.y, s * p.z); } + + //! Operator for Point Div = Point / Point. + inline_ Point operator/(const Point& p) const { return Point(x / p.x, y / p.y, z / p.z); } + //! Operator for Point Scale = Point / float. + inline_ Point operator/(float s) const { s = 1.0f / s; return Point(x * s, y * s, z * s); } + //! Operator for Point Scale = float / Point. + inline_ friend Point operator/(float s, const Point& p) { return Point(s / p.x, s / p.y, s / p.z); } + + //! Operator for float DotProd = Point | Point. + inline_ float operator|(const Point& p) const { return x*p.x + y*p.y + z*p.z; } + //! Operator for Point VecProd = Point ^ Point. + inline_ Point operator^(const Point& p) const + { + return Point( + y * p.z - z * p.y, + z * p.x - x * p.z, + x * p.y - y * p.x ); + } + + //! Operator for Point += Point. + inline_ Point& operator+=(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } + //! Operator for Point += float. + inline_ Point& operator+=(float s) { x += s; y += s; z += s; return *this; } + + //! Operator for Point -= Point. + inline_ Point& operator-=(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } + //! Operator for Point -= float. + inline_ Point& operator-=(float s) { x -= s; y -= s; z -= s; return *this; } + + //! Operator for Point *= Point. + inline_ Point& operator*=(const Point& p) { x *= p.x; y *= p.y; z *= p.z; return *this; } + //! Operator for Point *= float. + inline_ Point& operator*=(float s) { x *= s; y *= s; z *= s; return *this; } + + //! Operator for Point /= Point. + inline_ Point& operator/=(const Point& p) { x /= p.x; y /= p.y; z /= p.z; return *this; } + //! Operator for Point /= float. + inline_ Point& operator/=(float s) { s = 1.0f/s; x *= s; y *= s; z *= s; return *this; } + + // Logical operators + + //! Operator for "if(Point==Point)" + inline_ bool operator==(const Point& p) const { return ( (IR(x)==IR(p.x))&&(IR(y)==IR(p.y))&&(IR(z)==IR(p.z))); } + //! Operator for "if(Point!=Point)" + inline_ bool operator!=(const Point& p) const { return ( (IR(x)!=IR(p.x))||(IR(y)!=IR(p.y))||(IR(z)!=IR(p.z))); } + + // Arithmetic operators + + //! Operator for Point Mul = Point * Matrix3x3. + inline_ Point operator*(const Matrix3x3& mat) const + { + class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining + const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; + + return Point( + x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0], + x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1], + x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] ); + } + + //! Operator for Point Mul = Point * Matrix4x4. + inline_ Point operator*(const Matrix4x4& mat) const + { + class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining + const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; + + return Point( + x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0], + x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1], + x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]); + } + + //! Operator for Point *= Matrix3x3. + inline_ Point& operator*=(const Matrix3x3& mat) + { + class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining + const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; + + float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0]; + float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1]; + float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2]; + + x = xp; y = yp; z = zp; + + return *this; + } + + //! Operator for Point *= Matrix4x4. + inline_ Point& operator*=(const Matrix4x4& mat) + { + class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining + const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; + + float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0]; + float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1]; + float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]; + + x = xp; y = yp; z = zp; + + return *this; + } + + // Cast operators + + //! Cast a Point to a HPoint. w is set to zero. + operator HPoint() const; + + inline_ operator const float*() const { return &x; } + inline_ operator float*() { return &x; } + + public: + float x, y, z; + }; + + FUNCTION ICEMATHS_API void Normalize1(Point& a); + FUNCTION ICEMATHS_API void Normalize2(Point& a); + +#endif //__ICEPOINT_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h b/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h index 9036feb85..f02501ab7 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h +++ b/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h @@ -1,158 +1,158 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains preprocessor stuff. This should be the first included header. - * \file IcePreprocessor.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICEPREPROCESSOR_H -#define ICEPREPROCESSOR_H - - // Check platform - #if defined( _WIN32 ) || defined( WIN32 ) - #pragma message("Compiling on Windows...") - #define PLATFORM_WINDOWS - #else - #pragma message("Compiling on unknown platform...") - #endif - - // Check compiler - #if defined(_MSC_VER) - #pragma message("Compiling with VC++...") - #define COMPILER_VISUAL_CPP - - #if _MSC_VER > 1300 - #pragma message("Compiling with VC7") - #define COMPILER_VC7 - #else - #pragma message("Compiling with VC6") - #define COMPILER_VC6 - #endif - #else - #pragma message("Compiling with unknown compiler...") - #endif - - // Check compiler options. If this file is included in user-apps, this - // shouldn't be needed, so that they can use what they like best. - #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS - #ifdef COMPILER_VISUAL_CPP - #if defined(_CHAR_UNSIGNED) - #endif - - #if defined(_CPPRTTI) - #error Please disable RTTI... - #endif - - #if defined(_CPPUNWIND) - #error Please disable exceptions... - #endif - - #if defined(_MT) - // Multithreading - #endif - #endif - #endif - - // Check debug mode - #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. - #ifndef _DEBUG - #define _DEBUG - #endif - #endif - - #ifdef _DEBUG - // Here you may define items for debug builds - #endif - - #ifndef THIS_FILE - #define THIS_FILE __FILE__ - #endif - - #ifndef ICE_NO_DLL - #ifdef ICECORE_EXPORTS - #define ICECORE_API __declspec(dllexport) - #else - #define ICECORE_API __declspec(dllimport) - #endif - #else - #define ICECORE_API - #endif - - #define FUNCTION extern "C" - - // Cosmetic stuff [mainly useful with multiple inheritance] - #define override(base_class) virtual - - // Our own inline keyword, so that: - // - we can switch to __forceinline to check it's really better or not - // - we can remove __forceinline if the compiler doesn't support it -// #define inline_ __forceinline -// #define inline_ inline - - // Contributed by Bruce Mitchener - #if defined(COMPILER_VISUAL_CPP) - #define inline_ __forceinline -// #define inline_ inline - #elif defined(__GNUC__) && __GNUC__ < 3 - #define inline_ inline - #elif defined(__GNUC__) - #define inline_ inline __attribute__ ((always_inline)) - #else - #define inline_ inline - #endif - - // Down the hatch - #pragma inline_depth( 255 ) - - #ifdef COMPILER_VISUAL_CPP - #pragma intrinsic(memcmp) - #pragma intrinsic(memcpy) - #pragma intrinsic(memset) - #pragma intrinsic(strcat) - #pragma intrinsic(strcmp) - #pragma intrinsic(strcpy) - #pragma intrinsic(strlen) - #pragma intrinsic(abs) - #pragma intrinsic(labs) - #endif - - // ANSI compliance - #ifdef _DEBUG - // Remove painful warning in debug - inline_ bool ReturnsFalse(){ return false; } - #define for if(ReturnsFalse()){} else for - #else - #define for if(0){} else for - #endif - - // Don't override new/delete - #define DEFAULT_NEWDELETE - #define DONT_TRACK_MEMORY_LEAKS - - //! Macro used to give me a clue when it crashes in release and only the assembly is available - #define INCLUDE_GUARDIANS - #ifdef INCLUDE_GUARDIANS - #define GUARD(x) \ - { \ - static const char guard_text[] = x; \ - _asm push eax \ - _asm nop \ - _asm nop \ - _asm nop \ - _asm nop \ - _asm lea eax, guard_text \ - _asm nop \ - _asm nop \ - _asm nop \ - _asm nop \ - _asm pop eax \ - } - #else - #define GUARD(x) - #endif - -#endif // ICEPREPROCESSOR_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains preprocessor stuff. This should be the first included header. + * \file IcePreprocessor.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEPREPROCESSOR_H +#define ICEPREPROCESSOR_H + + // Check platform + #if defined( _WIN32 ) || defined( WIN32 ) + #pragma message("Compiling on Windows...") + #define PLATFORM_WINDOWS + #else + #pragma message("Compiling on unknown platform...") + #endif + + // Check compiler + #if defined(_MSC_VER) + #pragma message("Compiling with VC++...") + #define COMPILER_VISUAL_CPP + + #if _MSC_VER > 1300 + #pragma message("Compiling with VC7") + #define COMPILER_VC7 + #else + #pragma message("Compiling with VC6") + #define COMPILER_VC6 + #endif + #else + #pragma message("Compiling with unknown compiler...") + #endif + + // Check compiler options. If this file is included in user-apps, this + // shouldn't be needed, so that they can use what they like best. + #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS + #ifdef COMPILER_VISUAL_CPP + #if defined(_CHAR_UNSIGNED) + #endif + + #if defined(_CPPRTTI) + #error Please disable RTTI... + #endif + + #if defined(_CPPUNWIND) + #error Please disable exceptions... + #endif + + #if defined(_MT) + // Multithreading + #endif + #endif + #endif + + // Check debug mode + #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. + #ifndef _DEBUG + #define _DEBUG + #endif + #endif + + #ifdef _DEBUG + // Here you may define items for debug builds + #endif + + #ifndef THIS_FILE + #define THIS_FILE __FILE__ + #endif + + #ifndef ICE_NO_DLL + #ifdef ICECORE_EXPORTS + #define ICECORE_API __declspec(dllexport) + #else + #define ICECORE_API __declspec(dllimport) + #endif + #else + #define ICECORE_API + #endif + + #define FUNCTION extern "C" + + // Cosmetic stuff [mainly useful with multiple inheritance] + #define override(base_class) virtual + + // Our own inline keyword, so that: + // - we can switch to __forceinline to check it's really better or not + // - we can remove __forceinline if the compiler doesn't support it +// #define inline_ __forceinline +// #define inline_ inline + + // Contributed by Bruce Mitchener + #if defined(COMPILER_VISUAL_CPP) + #define inline_ __forceinline +// #define inline_ inline + #elif defined(__GNUC__) && __GNUC__ < 3 + #define inline_ inline + #elif defined(__GNUC__) + #define inline_ inline __attribute__ ((always_inline)) + #else + #define inline_ inline + #endif + + // Down the hatch + #pragma inline_depth( 255 ) + + #ifdef COMPILER_VISUAL_CPP + #pragma intrinsic(memcmp) + #pragma intrinsic(memcpy) + #pragma intrinsic(memset) + #pragma intrinsic(strcat) + #pragma intrinsic(strcmp) + #pragma intrinsic(strcpy) + #pragma intrinsic(strlen) + #pragma intrinsic(abs) + #pragma intrinsic(labs) + #endif + + // ANSI compliance + #ifdef _DEBUG + // Remove painful warning in debug + inline_ bool ReturnsFalse(){ return false; } + #define for if(ReturnsFalse()){} else for + #else + #define for if(0){} else for + #endif + + // Don't override new/delete + #define DEFAULT_NEWDELETE + #define DONT_TRACK_MEMORY_LEAKS + + //! Macro used to give me a clue when it crashes in release and only the assembly is available + #define INCLUDE_GUARDIANS + #ifdef INCLUDE_GUARDIANS + #define GUARD(x) \ + { \ + static const char guard_text[] = x; \ + _asm push eax \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm lea eax, guard_text \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm pop eax \ + } + #else + #define GUARD(x) + #endif + +#endif // ICEPREPROCESSOR_H diff --git a/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp b/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp index 75ae48675..93bdd1336 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp @@ -1,52 +1,52 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for random generators. - * \file IceRandom.cpp - * \author Pierre Terdiman - * \date August, 9, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -void IceCore:: SRand(udword seed) -{ - srand(seed); -} - -udword IceCore::Rand() -{ - return rand(); -} - - -static BasicRandom gRandomGenerator(42); - -udword IceCore::GetRandomIndex(udword max_index) -{ - // We don't use rand() since it's limited to RAND_MAX - udword Index = gRandomGenerator.Randomize(); - return Index % max_index; -} - - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for random generators. + * \file IceRandom.cpp + * \author Pierre Terdiman + * \date August, 9, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +void IceCore:: SRand(udword seed) +{ + srand(seed); +} + +udword IceCore::Rand() +{ + return rand(); +} + + +static BasicRandom gRandomGenerator(42); + +udword IceCore::GetRandomIndex(udword max_index) +{ + // We don't use rand() since it's limited to RAND_MAX + udword Index = gRandomGenerator.Randomize(); + return Index % max_index; +} + + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceRandom.h b/Extras/CDTestFramework/Opcode/Ice/IceRandom.h index 3db0f8cb9..67c3a9b7a 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceRandom.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceRandom.h @@ -1,58 +1,58 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for random generators. - * \file IceRandom.h - * \author Pierre Terdiman - * \date August, 9, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICERANDOM_H__ -#define __ICERANDOM_H__ - - FUNCTION ICECORE_API void SRand(udword seed); - FUNCTION ICECORE_API udword Rand(); - - //! Returns a unit random floating-point value - inline_ float UnitRandomFloat() { return float(Rand()) * ONE_OVER_RAND_MAX; } - - //! Returns a random index so that 0<= index < max_index - ICECORE_API udword GetRandomIndex(udword max_index); - - class ICECORE_API BasicRandom - { - public: - - //! Constructor - inline_ BasicRandom(udword seed=0) : mRnd(seed) {} - //! Destructor - inline_ ~BasicRandom() {} - - inline_ void SetSeed(udword seed) { mRnd = seed; } - inline_ udword GetCurrentValue() const { return mRnd; } - inline_ udword Randomize() { mRnd = mRnd * 2147001325 + 715136305; return mRnd; } - - private: - udword mRnd; - }; - -#endif // __ICERANDOM_H__ - +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for random generators. + * \file IceRandom.h + * \author Pierre Terdiman + * \date August, 9, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICERANDOM_H__ +#define __ICERANDOM_H__ + + FUNCTION ICECORE_API void SRand(udword seed); + FUNCTION ICECORE_API udword Rand(); + + //! Returns a unit random floating-point value + inline_ float UnitRandomFloat() { return float(Rand()) * ONE_OVER_RAND_MAX; } + + //! Returns a random index so that 0<= index < max_index + ICECORE_API udword GetRandomIndex(udword max_index); + + class ICECORE_API BasicRandom + { + public: + + //! Constructor + inline_ BasicRandom(udword seed=0) : mRnd(seed) {} + //! Destructor + inline_ ~BasicRandom() {} + + inline_ void SetSeed(udword seed) { mRnd = seed; } + inline_ udword GetCurrentValue() const { return mRnd; } + inline_ udword Randomize() { mRnd = mRnd * 2147001325 + 715136305; return mRnd; } + + private: + udword mRnd; + }; + +#endif // __ICERANDOM_H__ + diff --git a/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp b/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp index 2beb08b11..ce93b9132 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp @@ -1,100 +1,100 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for rays. - * \file IceRay.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Ray class. - * A ray is a half-line P(t) = mOrig + mDir * t, with 0 <= t <= +infinity - * \class Ray - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* - O = Origin = impact point - i = normalized vector along the x axis - j = normalized vector along the y axis = actually the normal vector in O - D = Direction vector, norm |D| = 1 - N = Projection of D on y axis, norm |N| = normal reaction - T = Projection of D on x axis, norm |T| = tangential reaction - R = Reflexion vector - - ^y - | - | - | - _ _ _| _ _ _ - * * *| - \ | / - \ |N / | - R\ | /D - \ | / | - \ | / - _________\|/______*_______>x - O T - - Let define theta = angle between D and N. Then cos(theta) = |N| / |D| = |N| since D is normalized. - - j|D = |j|*|D|*cos(theta) => |N| = j|D - - Then we simply have: - - D = N + T - - To compute tangential reaction : - - T = D - N - - To compute reflexion vector : - - R = N - T = N - (D-N) = 2*N - D -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -float Ray::SquareDistance(const Point& point, float* t) const -{ - Point Diff = point - mOrig; - float fT = Diff | mDir; - - if(fT<=0.0f) - { - fT = 0.0f; - } - else - { - fT /= mDir.SquareMagnitude(); - Diff -= fT*mDir; - } - - if(t) *t = fT; - - return Diff.SquareMagnitude(); -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for rays. + * \file IceRay.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Ray class. + * A ray is a half-line P(t) = mOrig + mDir * t, with 0 <= t <= +infinity + * \class Ray + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* + O = Origin = impact point + i = normalized vector along the x axis + j = normalized vector along the y axis = actually the normal vector in O + D = Direction vector, norm |D| = 1 + N = Projection of D on y axis, norm |N| = normal reaction + T = Projection of D on x axis, norm |T| = tangential reaction + R = Reflexion vector + + ^y + | + | + | + _ _ _| _ _ _ + * * *| + \ | / + \ |N / | + R\ | /D + \ | / | + \ | / + _________\|/______*_______>x + O T + + Let define theta = angle between D and N. Then cos(theta) = |N| / |D| = |N| since D is normalized. + + j|D = |j|*|D|*cos(theta) => |N| = j|D + + Then we simply have: + + D = N + T + + To compute tangential reaction : + + T = D - N + + To compute reflexion vector : + + R = N - T = N - (D-N) = 2*N - D +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +float Ray::SquareDistance(const Point& point, float* t) const +{ + Point Diff = point - mOrig; + float fT = Diff | mDir; + + if(fT<=0.0f) + { + fT = 0.0f; + } + else + { + fT /= mDir.SquareMagnitude(); + Diff -= fT*mDir; + } + + if(t) *t = fT; + + return Diff.SquareMagnitude(); +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceRay.h b/Extras/CDTestFramework/Opcode/Ice/IceRay.h index d404ff6a3..7ea57730e 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceRay.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceRay.h @@ -1,114 +1,114 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for rays. - * \file IceRay.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICERAY_H__ -#define __ICERAY_H__ - - class ICEMATHS_API Ray - { - public: - //! Constructor - inline_ Ray() {} - //! Constructor - inline_ Ray(const Point& orig, const Point& dir) : mOrig(orig), mDir(dir) {} - //! Copy constructor - inline_ Ray(const Ray& ray) : mOrig(ray.mOrig), mDir(ray.mDir) {} - //! Destructor - inline_ ~Ray() {} - - float SquareDistance(const Point& point, float* t=null) const; - inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } - - Point mOrig; //!< Ray origin - Point mDir; //!< Normalized direction - }; - - inline_ void ComputeReflexionVector(Point& reflected, const Point& incoming_dir, const Point& outward_normal) - { - reflected = incoming_dir - outward_normal * 2.0f * (incoming_dir|outward_normal); - } - - inline_ void ComputeReflexionVector(Point& reflected, const Point& source, const Point& impact, const Point& normal) - { - Point V = impact - source; - reflected = V - normal * 2.0f * (V|normal); - } - - inline_ void DecomposeVector(Point& normal_compo, Point& tangent_compo, const Point& outward_dir, const Point& outward_normal) - { - normal_compo = outward_normal * (outward_dir|outward_normal); - tangent_compo = outward_dir - normal_compo; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a direction vector from world space to local space - * \param local_dir [out] direction vector in local space - * \param world_dir [in] direction vector in world space - * \param world [in] world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputeLocalDirection(Point& local_dir, const Point& world_dir, const Matrix4x4& world) - { - // Get world direction back in local space -// Matrix3x3 InvWorld = world; -// local_dir = InvWorld * world_dir; - local_dir = Matrix3x3(world) * world_dir; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a position vector from world space to local space - * \param local_pt [out] position vector in local space - * \param world_pt [in] position vector in world space - * \param world [in] world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputeLocalPoint(Point& local_pt, const Point& world_pt, const Matrix4x4& world) - { - // Get world vertex back in local space - Matrix4x4 InvWorld = world; - InvWorld.Invert(); - local_pt = world_pt * InvWorld; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a ray from world space to local space - * \param local_ray [out] ray in local space - * \param world_ray [in] ray in world space - * \param world [in] world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputeLocalRay(Ray& local_ray, const Ray& world_ray, const Matrix4x4& world) - { - // Get world ray back in local space - ComputeLocalDirection(local_ray.mDir, world_ray.mDir, world); - ComputeLocalPoint(local_ray.mOrig, world_ray.mOrig, world); - } - -#endif // __ICERAY_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for rays. + * \file IceRay.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICERAY_H__ +#define __ICERAY_H__ + + class ICEMATHS_API Ray + { + public: + //! Constructor + inline_ Ray() {} + //! Constructor + inline_ Ray(const Point& orig, const Point& dir) : mOrig(orig), mDir(dir) {} + //! Copy constructor + inline_ Ray(const Ray& ray) : mOrig(ray.mOrig), mDir(ray.mDir) {} + //! Destructor + inline_ ~Ray() {} + + float SquareDistance(const Point& point, float* t=null) const; + inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } + + Point mOrig; //!< Ray origin + Point mDir; //!< Normalized direction + }; + + inline_ void ComputeReflexionVector(Point& reflected, const Point& incoming_dir, const Point& outward_normal) + { + reflected = incoming_dir - outward_normal * 2.0f * (incoming_dir|outward_normal); + } + + inline_ void ComputeReflexionVector(Point& reflected, const Point& source, const Point& impact, const Point& normal) + { + Point V = impact - source; + reflected = V - normal * 2.0f * (V|normal); + } + + inline_ void DecomposeVector(Point& normal_compo, Point& tangent_compo, const Point& outward_dir, const Point& outward_normal) + { + normal_compo = outward_normal * (outward_dir|outward_normal); + tangent_compo = outward_dir - normal_compo; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a direction vector from world space to local space + * \param local_dir [out] direction vector in local space + * \param world_dir [in] direction vector in world space + * \param world [in] world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputeLocalDirection(Point& local_dir, const Point& world_dir, const Matrix4x4& world) + { + // Get world direction back in local space +// Matrix3x3 InvWorld = world; +// local_dir = InvWorld * world_dir; + local_dir = Matrix3x3(world) * world_dir; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a position vector from world space to local space + * \param local_pt [out] position vector in local space + * \param world_pt [in] position vector in world space + * \param world [in] world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputeLocalPoint(Point& local_pt, const Point& world_pt, const Matrix4x4& world) + { + // Get world vertex back in local space + Matrix4x4 InvWorld = world; + InvWorld.Invert(); + local_pt = world_pt * InvWorld; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a ray from world space to local space + * \param local_ray [out] ray in local space + * \param world_ray [in] ray in world space + * \param world [in] world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputeLocalRay(Ray& local_ray, const Ray& world_ray, const Matrix4x4& world) + { + // Get world ray back in local space + ComputeLocalDirection(local_ray.mDir, world_ray.mDir, world); + ComputeLocalPoint(local_ray.mOrig, world_ray.mOrig, world); + } + +#endif // __ICERAY_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp b/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp index d42814294..3cb3aacc4 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp @@ -1,592 +1,592 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains source code from the article "Radix Sort Revisited". - * \file IceRevisitedRadix.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Revisited Radix Sort. - * This is my new radix routine: - * - it uses indices and doesn't recopy the values anymore, hence wasting less ram - * - it creates all the histograms in one run instead of four - * - it sorts words faster than dwords and bytes faster than words - * - it correctly sorts negative floating-point values by patching the offsets - * - it automatically takes advantage of temporal coherence - * - multiple keys support is a side effect of temporal coherence - * - it may be worth recoding in asm... (mainly to use FCOMI, FCMOV, etc) [it's probably memory-bound anyway] - * - * History: - * - 08.15.98: very first version - * - 04.04.00: recoded for the radix article - * - 12.xx.00: code lifting - * - 09.18.01: faster CHECK_PASS_VALIDITY thanks to Mark D. Shattuck (who provided other tips, not included here) - * - 10.11.01: added local ram support - * - 01.20.02: bugfix! In very particular cases the last pass was skipped in the float code-path, leading to incorrect sorting...... - * - 01.02.02: - "mIndices" renamed => "mRanks". That's a rank sorter after all. - * - ranks are not "reset" anymore, but implicit on first calls - * - 07.05.02: offsets rewritten with one less indirection. - * - 11.03.02: "bool" replaced with RadixHint enum - * - 07.15.04: stack-based radix added - * - we want to use the radix sort but without making it static, and without allocating anything. - * - we internally allocate two arrays of ranks. Each of them has N udwords to sort N values. - * - 1Mb/2/sizeof(udword) = 131072 values max, at the same time. - * - 09.22.04: - adapted to MacOS by Chris Lamb - * - 01.12.06: - added optimizations suggested by Kyle Hubert - * - * \class RadixSort - * \author Pierre Terdiman - * \version 1.5 - * \date August, 15, 1998 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* -To do: - - add an offset parameter between two input values (avoid some data recopy sometimes) - - unroll ? asm ? - - prefetch stuff the day I have a P3 - - make a version with 16-bits indices ? -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "StdAfx.h" - -using namespace Opcode; - -#define INVALIDATE_RANKS mCurrentSize|=0x80000000 -#define VALIDATE_RANKS mCurrentSize&=0x7fffffff -#define CURRENT_SIZE (mCurrentSize&0x7fffffff) -#define INVALID_RANKS (mCurrentSize&0x80000000) - -#define CHECK_RESIZE(n) \ - if(n!=mPreviousSize) \ - { \ - if(n>mCurrentSize) Resize(n); \ - else ResetRanks(); \ - mPreviousSize = n; \ - } - -#if defined(__APPLE__) || defined(_XBOX) - #define H0_OFFSET 768 - #define H1_OFFSET 512 - #define H2_OFFSET 256 - #define H3_OFFSET 0 - #define BYTES_INC (3-j) -#else - #define H0_OFFSET 0 - #define H1_OFFSET 256 - #define H2_OFFSET 512 - #define H3_OFFSET 768 - #define BYTES_INC j -#endif - -#define CREATE_HISTOGRAMS(type, buffer) \ - /* Clear counters/histograms */ \ - ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ - \ - /* Prepare to count */ \ - const ubyte* p = (const ubyte*)input; \ - const ubyte* pe = &p[nb*4]; \ - udword* h0= &mHistogram[H0_OFFSET]; /* Histogram for first pass (LSB) */ \ - udword* h1= &mHistogram[H1_OFFSET]; /* Histogram for second pass */ \ - udword* h2= &mHistogram[H2_OFFSET]; /* Histogram for third pass */ \ - udword* h3= &mHistogram[H3_OFFSET]; /* Histogram for last pass (MSB) */ \ - \ - bool AlreadySorted = true; /* Optimism... */ \ - \ - if(INVALID_RANKS) \ - { \ - /* Prepare for temporal coherence */ \ - type* Running = (type*)buffer; \ - type PrevVal = *Running; \ - \ - while(p!=pe) \ - { \ - /* Read input buffer in previous sorted order */ \ - type Val = *Running++; \ - /* Check whether already sorted or not */ \ - if(ValCurSize) Resize(nb); - mCurrentSize = nb; - INVALIDATE_RANKS; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main sort routine. - * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. - * \param input [in] a list of integer values to sort - * \param nb [in] number of values to sort, must be < 2^31 - * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) -{ - // Checkings - if(!input || !nb || nb&0x80000000) return *this; - - // Stats - mTotalCalls++; - - // Resize lists if needed - CheckResize(nb); - -#ifdef RADIX_LOCAL_RAM - // Allocate histograms & offsets on the stack - udword mHistogram[256*4]; -// udword mOffset[256]; - udword* mLink[256]; -#endif - - // Create histograms (counters). Counters for all passes are created in one run. - // Pros: read input buffer once instead of four times - // Cons: mHistogram is 4Kb instead of 1Kb - // We must take care of signed/unsigned values for temporal coherence.... I just - // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? - if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } - else { CREATE_HISTOGRAMS(sdword, input); } -/* - // Compute #negative values involved if needed - udword NbNegativeValues = 0; - if(hint==RADIX_SIGNED) - { - // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 - // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, - // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. - udword* h3= &mHistogram[768]; - for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part - } -*/ - // Radix sort, j is the pass number (0=LSB, 3=MSB) - for(udword j=0;j<4;j++) - { - CHECK_PASS_VALIDITY(j); - - // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is - // not a problem, numbers are correctly sorted anyway. - if(PerformPass) - { - // Should we care about negative values? - if(j!=3 || hint==RADIX_UNSIGNED) - { - // Here we deal with positive values only - - // Create offsets -// mOffset[0] = 0; -// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; - mLink[0] = mRanks2; - for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - } - else - { - // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. -/* - // Create biased offsets, in order for negative numbers to be sorted as well -// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones -// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers - mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones - for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers - - // Fixing the wrong place for negative values -// mOffset[128] = 0; -// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; - mLink[128] = mRanks2; - for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; -*/ - -// From Kyle Hubert: - -//mOffset[128] = 0; -mLink[128] = mRanks2; -//for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; -for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - -//mOffset[0] = mOffset[255] + CurCount[255]; -mLink[0] = mLink[255] + CurCount[255]; -//for(i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; -for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - - - } - - // Perform Radix Sort - const ubyte* InputBytes = (const ubyte*)input; - InputBytes += BYTES_INC; - if(INVALID_RANKS) - { -// for(udword i=0;i127;i--) mOffset[i] = mOffset[i+1] + CurCount[i]; -for(udword i=254;i>127;i--) mLink[i] = mLink[i+1] + CurCount[i]; -//mOffset[0] = mOffset[128] + CurCount[128]; -mLink[0] = mLink[128] + CurCount[128]; -//for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; -for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - - // Perform Radix Sort - if(INVALID_RANKS) - { - for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). - // ### cmp to be killed. Not good. Later. -// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above -// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order - if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above - else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order - } - VALIDATE_RANKS; - } - else - { - for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). - // ### cmp to be killed. Not good. Later. -// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above -// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order - if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above - else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order - } - } - // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. - udword* Tmp = mRanks; - mRanks = mRanks2; - mRanks2 = Tmp; - } - else - { - // The pass is useless, yet we still have to reverse the order of current list if all values are negative. - if(UniqueVal>=128) - { - if(INVALID_RANKS) - { - // ###Possible? - for(udword i=0;i "mRanks". That's a rank sorter after all. + * - ranks are not "reset" anymore, but implicit on first calls + * - 07.05.02: offsets rewritten with one less indirection. + * - 11.03.02: "bool" replaced with RadixHint enum + * - 07.15.04: stack-based radix added + * - we want to use the radix sort but without making it static, and without allocating anything. + * - we internally allocate two arrays of ranks. Each of them has N udwords to sort N values. + * - 1Mb/2/sizeof(udword) = 131072 values max, at the same time. + * - 09.22.04: - adapted to MacOS by Chris Lamb + * - 01.12.06: - added optimizations suggested by Kyle Hubert + * + * \class RadixSort + * \author Pierre Terdiman + * \version 1.5 + * \date August, 15, 1998 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* +To do: + - add an offset parameter between two input values (avoid some data recopy sometimes) + - unroll ? asm ? + - prefetch stuff the day I have a P3 + - make a version with 16-bits indices ? +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +#define INVALIDATE_RANKS mCurrentSize|=0x80000000 +#define VALIDATE_RANKS mCurrentSize&=0x7fffffff +#define CURRENT_SIZE (mCurrentSize&0x7fffffff) +#define INVALID_RANKS (mCurrentSize&0x80000000) + +#define CHECK_RESIZE(n) \ + if(n!=mPreviousSize) \ + { \ + if(n>mCurrentSize) Resize(n); \ + else ResetRanks(); \ + mPreviousSize = n; \ + } + +#if defined(__APPLE__) || defined(_XBOX) + #define H0_OFFSET 768 + #define H1_OFFSET 512 + #define H2_OFFSET 256 + #define H3_OFFSET 0 + #define BYTES_INC (3-j) +#else + #define H0_OFFSET 0 + #define H1_OFFSET 256 + #define H2_OFFSET 512 + #define H3_OFFSET 768 + #define BYTES_INC j +#endif + +#define CREATE_HISTOGRAMS(type, buffer) \ + /* Clear counters/histograms */ \ + ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ + \ + /* Prepare to count */ \ + const ubyte* p = (const ubyte*)input; \ + const ubyte* pe = &p[nb*4]; \ + udword* h0= &mHistogram[H0_OFFSET]; /* Histogram for first pass (LSB) */ \ + udword* h1= &mHistogram[H1_OFFSET]; /* Histogram for second pass */ \ + udword* h2= &mHistogram[H2_OFFSET]; /* Histogram for third pass */ \ + udword* h3= &mHistogram[H3_OFFSET]; /* Histogram for last pass (MSB) */ \ + \ + bool AlreadySorted = true; /* Optimism... */ \ + \ + if(INVALID_RANKS) \ + { \ + /* Prepare for temporal coherence */ \ + type* Running = (type*)buffer; \ + type PrevVal = *Running; \ + \ + while(p!=pe) \ + { \ + /* Read input buffer in previous sorted order */ \ + type Val = *Running++; \ + /* Check whether already sorted or not */ \ + if(ValCurSize) Resize(nb); + mCurrentSize = nb; + INVALIDATE_RANKS; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main sort routine. + * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. + * \param input [in] a list of integer values to sort + * \param nb [in] number of values to sort, must be < 2^31 + * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) +{ + // Checkings + if(!input || !nb || nb&0x80000000) return *this; + + // Stats + mTotalCalls++; + + // Resize lists if needed + CheckResize(nb); + +#ifdef RADIX_LOCAL_RAM + // Allocate histograms & offsets on the stack + udword mHistogram[256*4]; +// udword mOffset[256]; + udword* mLink[256]; +#endif + + // Create histograms (counters). Counters for all passes are created in one run. + // Pros: read input buffer once instead of four times + // Cons: mHistogram is 4Kb instead of 1Kb + // We must take care of signed/unsigned values for temporal coherence.... I just + // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? + if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } + else { CREATE_HISTOGRAMS(sdword, input); } +/* + // Compute #negative values involved if needed + udword NbNegativeValues = 0; + if(hint==RADIX_SIGNED) + { + // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 + // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, + // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. + udword* h3= &mHistogram[768]; + for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part + } +*/ + // Radix sort, j is the pass number (0=LSB, 3=MSB) + for(udword j=0;j<4;j++) + { + CHECK_PASS_VALIDITY(j); + + // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is + // not a problem, numbers are correctly sorted anyway. + if(PerformPass) + { + // Should we care about negative values? + if(j!=3 || hint==RADIX_UNSIGNED) + { + // Here we deal with positive values only + + // Create offsets +// mOffset[0] = 0; +// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + mLink[0] = mRanks2; + for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + } + else + { + // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. +/* + // Create biased offsets, in order for negative numbers to be sorted as well +// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones +// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones + for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + + // Fixing the wrong place for negative values +// mOffset[128] = 0; +// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + mLink[128] = mRanks2; + for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; +*/ + +// From Kyle Hubert: + +//mOffset[128] = 0; +mLink[128] = mRanks2; +//for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; +for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + +//mOffset[0] = mOffset[255] + CurCount[255]; +mLink[0] = mLink[255] + CurCount[255]; +//for(i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; +for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + + + } + + // Perform Radix Sort + const ubyte* InputBytes = (const ubyte*)input; + InputBytes += BYTES_INC; + if(INVALID_RANKS) + { +// for(udword i=0;i127;i--) mOffset[i] = mOffset[i+1] + CurCount[i]; +for(udword i=254;i>127;i--) mLink[i] = mLink[i+1] + CurCount[i]; +//mOffset[0] = mOffset[128] + CurCount[128]; +mLink[0] = mLink[128] + CurCount[128]; +//for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; +for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + + // Perform Radix Sort + if(INVALID_RANKS) + { + for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above + else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order + } + VALIDATE_RANKS; + } + else + { + for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above + else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order + } + } + // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. + udword* Tmp = mRanks; + mRanks = mRanks2; + mRanks2 = Tmp; + } + else + { + // The pass is useless, yet we still have to reverse the order of current list if all values are negative. + if(UniqueVal>=128) + { + if(INVALID_RANKS) + { + // ###Possible? + for(udword i=0;i=SqrLen) - { - fT = 1.0f; - Diff -= Dir; - } - else - { - fT /= SqrLen; - Diff -= fT*Dir; - } - } - - if(t) *t = fT; - - return Diff.SquareMagnitude(); -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for segments. + * \file IceSegment.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Segment class. + * A segment is defined by S(t) = mP0 * (1 - t) + mP1 * t, with 0 <= t <= 1 + * Alternatively, a segment is S(t) = Origin + t * Direction for 0 <= t <= 1. + * Direction is not necessarily unit length. The end points are Origin = mP0 and Origin + Direction = mP1. + * + * \class Segment + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +float Segment::SquareDistance(const Point& point, float* t) const +{ + Point Diff = point - mP0; + Point Dir = mP1 - mP0; + float fT = Diff | Dir; + + if(fT<=0.0f) + { + fT = 0.0f; + } + else + { + float SqrLen= Dir.SquareMagnitude(); + if(fT>=SqrLen) + { + fT = 1.0f; + Diff -= Dir; + } + else + { + fT /= SqrLen; + Diff -= fT*Dir; + } + } + + if(t) *t = fT; + + return Diff.SquareMagnitude(); +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceSegment.h b/Extras/CDTestFramework/Opcode/Ice/IceSegment.h index 83778acc0..6764c0c49 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceSegment.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceSegment.h @@ -1,71 +1,71 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for segments. - * \file IceSegment.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICESEGMENT_H__ -#define __ICESEGMENT_H__ - - class ICEMATHS_API Segment - { - public: - //! Constructor - inline_ Segment() {} - //! Constructor - inline_ Segment(const Point& p0, const Point& p1) : mP0(p0), mP1(p1) {} - //! Copy constructor - inline_ Segment(const Segment& seg) : mP0(seg.mP0), mP1(seg.mP1) {} - //! Destructor - inline_ ~Segment() {} - - inline_ const Point& GetOrigin() const { return mP0; } - inline_ Point ComputeDirection() const { return mP1 - mP0; } - inline_ void ComputeDirection(Point& dir) const { dir = mP1 - mP0; } - inline_ float ComputeLength() const { return mP1.Distance(mP0); } - inline_ float ComputeSquareLength() const { return mP1.SquareDistance(mP0); } - - inline_ void SetOriginDirection(const Point& origin, const Point& direction) - { - mP0 = mP1 = origin; - mP1 += direction; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes a point on the segment - * \param pt [out] point on segment - * \param t [in] point's parameter [t=0 => pt = mP0, t=1 => pt = mP1] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputePoint(Point& pt, float t) const { pt = mP0 + t * (mP1 - mP0); } - - float SquareDistance(const Point& point, float* t=null) const; - inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } - - Point mP0; //!< Start of segment - Point mP1; //!< End of segment - }; - -#endif // __ICESEGMENT_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for segments. + * \file IceSegment.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICESEGMENT_H__ +#define __ICESEGMENT_H__ + + class ICEMATHS_API Segment + { + public: + //! Constructor + inline_ Segment() {} + //! Constructor + inline_ Segment(const Point& p0, const Point& p1) : mP0(p0), mP1(p1) {} + //! Copy constructor + inline_ Segment(const Segment& seg) : mP0(seg.mP0), mP1(seg.mP1) {} + //! Destructor + inline_ ~Segment() {} + + inline_ const Point& GetOrigin() const { return mP0; } + inline_ Point ComputeDirection() const { return mP1 - mP0; } + inline_ void ComputeDirection(Point& dir) const { dir = mP1 - mP0; } + inline_ float ComputeLength() const { return mP1.Distance(mP0); } + inline_ float ComputeSquareLength() const { return mP1.SquareDistance(mP0); } + + inline_ void SetOriginDirection(const Point& origin, const Point& direction) + { + mP0 = mP1 = origin; + mP1 += direction; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes a point on the segment + * \param pt [out] point on segment + * \param t [in] point's parameter [t=0 => pt = mP0, t=1 => pt = mP1] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputePoint(Point& pt, float t) const { pt = mP0 + t * (mP1 - mP0); } + + float SquareDistance(const Point& point, float* t=null) const; + inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } + + Point mP0; //!< Start of segment + Point mP1; //!< End of segment + }; + +#endif // __ICESEGMENT_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp b/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp index 7cbb2da9e..d95174d67 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp @@ -1,302 +1,302 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy triangle class. - * \file IceTriangle.cpp - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a triangle class. - * - * \class Tri - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -static sdword VPlaneSideEps(const Point& v, const Plane& plane, float epsilon) -{ - // Compute distance from current vertex to the plane - float Dist = plane.Distance(v); - // Compute side: - // 1 = the vertex is on the positive side of the plane - // -1 = the vertex is on the negative side of the plane - // 0 = the vertex is on the plane (within epsilon) - return Dist > epsilon ? 1 : Dist < -epsilon ? -1 : 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Flips the winding order. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::Flip() -{ - Point Tmp = mVerts[1]; - mVerts[1] = mVerts[2]; - mVerts[2] = Tmp; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle area. - * \return the area - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::Area() const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - return ((p0 - p1)^(p0 - p2)).Magnitude() * 0.5f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle perimeter. - * \return the perimeter - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::Perimeter() const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - return p0.Distance(p1) - + p0.Distance(p2) - + p1.Distance(p2); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle compacity. - * \return the compacity - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::Compacity() const -{ - float P = Perimeter(); - if(P==0.0f) return 0.0f; - return (4.0f*PI*Area()/(P*P)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle normal. - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::Normal(Point& normal) const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - normal = ((p0 - p1)^(p0 - p2)).Normalize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle denormalized normal. - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::DenormalizedNormal(Point& normal) const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - normal = ((p0 - p1)^(p0 - p2)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle center. - * \param center [out] the computed center - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::Center(Point& center) const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - center = (p0 + p1 + p2)*INV3; -} - -PartVal Triangle::TestAgainstPlane(const Plane& plane, float epsilon) const -{ - bool Pos = false, Neg = false; - - // Loop through all vertices - for(udword i=0;i<3;i++) - { - // Compute side: - sdword Side = VPlaneSideEps(mVerts[i], plane, epsilon); - - if (Side < 0) Neg = true; - else if (Side > 0) Pos = true; - } - - if (!Pos && !Neg) return TRI_ON_PLANE; - else if (Pos && Neg) return TRI_INTERSECT; - else if (Pos && !Neg) return TRI_PLUS_SPACE; - else if (!Pos && Neg) return TRI_MINUS_SPACE; - - // What?! - return TRI_FORCEDWORD; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle moment. - * \param m [out] the moment - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -void Triangle::ComputeMoment(Moment& m) -{ - // Compute the area of the triangle - m.mArea = Area(); - - // Compute the centroid - Center(m.mCentroid); - - // Second-order components. Handle zero-area faces. - Point& p = mVerts[0]; - Point& q = mVerts[1]; - Point& r = mVerts[2]; - if(m.mArea==0.0f) - { - // This triangle has zero area. The second order components would be eliminated with the usual formula, so, for the - // sake of robustness we use an alternative form. These are the centroid and second-order components of the triangle's vertices. - m.mCovariance.m[0][0] = (p.x*p.x + q.x*q.x + r.x*r.x); - m.mCovariance.m[0][1] = (p.x*p.y + q.x*q.y + r.x*r.y); - m.mCovariance.m[0][2] = (p.x*p.z + q.x*q.z + r.x*r.z); - m.mCovariance.m[1][1] = (p.y*p.y + q.y*q.y + r.y*r.y); - m.mCovariance.m[1][2] = (p.y*p.z + q.y*q.z + r.y*r.z); - m.mCovariance.m[2][2] = (p.z*p.z + q.z*q.z + r.z*r.z); - m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; - m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; - m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; - } - else - { - const float OneOverTwelve = 1.0f / 12.0f; - m.mCovariance.m[0][0] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.x + p.x*p.x + q.x*q.x + r.x*r.x) * OneOverTwelve; - m.mCovariance.m[0][1] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.y + p.x*p.y + q.x*q.y + r.x*r.y) * OneOverTwelve; - m.mCovariance.m[1][1] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.y + p.y*p.y + q.y*q.y + r.y*r.y) * OneOverTwelve; - m.mCovariance.m[0][2] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.z + p.x*p.z + q.x*q.z + r.x*r.z) * OneOverTwelve; - m.mCovariance.m[1][2] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.z + p.y*p.z + q.y*q.z + r.y*r.z) * OneOverTwelve; - m.mCovariance.m[2][2] = m.mArea * (9.0f * m.mCentroid.z*m.mCentroid.z + p.z*p.z + q.z*q.z + r.z*r.z) * OneOverTwelve; - m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; - m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; - m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; - } -} -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's smallest edge length. - * \return the smallest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::MinEdgeLength() const -{ - float Min = MAX_FLOAT; - float Length01 = mVerts[0].Distance(mVerts[1]); - float Length02 = mVerts[0].Distance(mVerts[2]); - float Length12 = mVerts[1].Distance(mVerts[2]); - if(Length01 < Min) Min = Length01; - if(Length02 < Min) Min = Length02; - if(Length12 < Min) Min = Length12; - return Min; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's largest edge length. - * \return the largest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::MaxEdgeLength() const -{ - float Max = MIN_FLOAT; - float Length01 = mVerts[0].Distance(mVerts[1]); - float Length02 = mVerts[0].Distance(mVerts[2]); - float Length12 = mVerts[1].Distance(mVerts[2]); - if(Length01 > Max) Max = Length01; - if(Length02 > Max) Max = Length02; - if(Length12 > Max) Max = Length12; - return Max; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a point on the triangle according to the stabbing information. - * \param u,v [in] point's barycentric coordinates - * \param pt [out] point on triangle - * \param nearvtx [out] index of nearest vertex - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::ComputePoint(float u, float v, Point& pt, udword* nearvtx) const -{ - // Compute point coordinates - pt = (1.0f - u - v)*mVerts[0] + u*mVerts[1] + v*mVerts[2]; - - // Compute nearest vertex if needed - if(nearvtx) - { - // Compute distance vector - Point d(mVerts[0].SquareDistance(pt), // Distance^2 from vertex 0 to point on the face - mVerts[1].SquareDistance(pt), // Distance^2 from vertex 1 to point on the face - mVerts[2].SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face - - // Get smallest distance - *nearvtx = d.SmallestAxis(); - } -} - -void Triangle::Inflate(float fat_coeff, bool constant_border) -{ - // Compute triangle center - Point TriangleCenter; - Center(TriangleCenter); - - // Don't normalize? - // Normalize => add a constant border, regardless of triangle size - // Don't => add more to big triangles - for(udword i=0;i<3;i++) - { - Point v = mVerts[i] - TriangleCenter; - - if(constant_border) v.Normalize(); - - mVerts[i] += v * fat_coeff; - } -} +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy triangle class. + * \file IceTriangle.cpp + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a triangle class. + * + * \class Tri + * \author Pierre Terdiman + * \version 1.0 + * \date 08.15.98 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static sdword VPlaneSideEps(const Point& v, const Plane& plane, float epsilon) +{ + // Compute distance from current vertex to the plane + float Dist = plane.Distance(v); + // Compute side: + // 1 = the vertex is on the positive side of the plane + // -1 = the vertex is on the negative side of the plane + // 0 = the vertex is on the plane (within epsilon) + return Dist > epsilon ? 1 : Dist < -epsilon ? -1 : 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Flips the winding order. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::Flip() +{ + Point Tmp = mVerts[1]; + mVerts[1] = mVerts[2]; + mVerts[2] = Tmp; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle area. + * \return the area + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::Area() const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + return ((p0 - p1)^(p0 - p2)).Magnitude() * 0.5f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle perimeter. + * \return the perimeter + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::Perimeter() const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + return p0.Distance(p1) + + p0.Distance(p2) + + p1.Distance(p2); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle compacity. + * \return the compacity + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::Compacity() const +{ + float P = Perimeter(); + if(P==0.0f) return 0.0f; + return (4.0f*PI*Area()/(P*P)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle normal. + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::Normal(Point& normal) const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + normal = ((p0 - p1)^(p0 - p2)).Normalize(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle denormalized normal. + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::DenormalizedNormal(Point& normal) const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + normal = ((p0 - p1)^(p0 - p2)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle center. + * \param center [out] the computed center + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::Center(Point& center) const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + center = (p0 + p1 + p2)*INV3; +} + +PartVal Triangle::TestAgainstPlane(const Plane& plane, float epsilon) const +{ + bool Pos = false, Neg = false; + + // Loop through all vertices + for(udword i=0;i<3;i++) + { + // Compute side: + sdword Side = VPlaneSideEps(mVerts[i], plane, epsilon); + + if (Side < 0) Neg = true; + else if (Side > 0) Pos = true; + } + + if (!Pos && !Neg) return TRI_ON_PLANE; + else if (Pos && Neg) return TRI_INTERSECT; + else if (Pos && !Neg) return TRI_PLUS_SPACE; + else if (!Pos && Neg) return TRI_MINUS_SPACE; + + // What?! + return TRI_FORCEDWORD; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle moment. + * \param m [out] the moment + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +void Triangle::ComputeMoment(Moment& m) +{ + // Compute the area of the triangle + m.mArea = Area(); + + // Compute the centroid + Center(m.mCentroid); + + // Second-order components. Handle zero-area faces. + Point& p = mVerts[0]; + Point& q = mVerts[1]; + Point& r = mVerts[2]; + if(m.mArea==0.0f) + { + // This triangle has zero area. The second order components would be eliminated with the usual formula, so, for the + // sake of robustness we use an alternative form. These are the centroid and second-order components of the triangle's vertices. + m.mCovariance.m[0][0] = (p.x*p.x + q.x*q.x + r.x*r.x); + m.mCovariance.m[0][1] = (p.x*p.y + q.x*q.y + r.x*r.y); + m.mCovariance.m[0][2] = (p.x*p.z + q.x*q.z + r.x*r.z); + m.mCovariance.m[1][1] = (p.y*p.y + q.y*q.y + r.y*r.y); + m.mCovariance.m[1][2] = (p.y*p.z + q.y*q.z + r.y*r.z); + m.mCovariance.m[2][2] = (p.z*p.z + q.z*q.z + r.z*r.z); + m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; + m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; + m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; + } + else + { + const float OneOverTwelve = 1.0f / 12.0f; + m.mCovariance.m[0][0] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.x + p.x*p.x + q.x*q.x + r.x*r.x) * OneOverTwelve; + m.mCovariance.m[0][1] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.y + p.x*p.y + q.x*q.y + r.x*r.y) * OneOverTwelve; + m.mCovariance.m[1][1] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.y + p.y*p.y + q.y*q.y + r.y*r.y) * OneOverTwelve; + m.mCovariance.m[0][2] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.z + p.x*p.z + q.x*q.z + r.x*r.z) * OneOverTwelve; + m.mCovariance.m[1][2] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.z + p.y*p.z + q.y*q.z + r.y*r.z) * OneOverTwelve; + m.mCovariance.m[2][2] = m.mArea * (9.0f * m.mCentroid.z*m.mCentroid.z + p.z*p.z + q.z*q.z + r.z*r.z) * OneOverTwelve; + m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; + m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; + m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; + } +} +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's smallest edge length. + * \return the smallest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::MinEdgeLength() const +{ + float Min = MAX_FLOAT; + float Length01 = mVerts[0].Distance(mVerts[1]); + float Length02 = mVerts[0].Distance(mVerts[2]); + float Length12 = mVerts[1].Distance(mVerts[2]); + if(Length01 < Min) Min = Length01; + if(Length02 < Min) Min = Length02; + if(Length12 < Min) Min = Length12; + return Min; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's largest edge length. + * \return the largest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::MaxEdgeLength() const +{ + float Max = MIN_FLOAT; + float Length01 = mVerts[0].Distance(mVerts[1]); + float Length02 = mVerts[0].Distance(mVerts[2]); + float Length12 = mVerts[1].Distance(mVerts[2]); + if(Length01 > Max) Max = Length01; + if(Length02 > Max) Max = Length02; + if(Length12 > Max) Max = Length12; + return Max; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a point on the triangle according to the stabbing information. + * \param u,v [in] point's barycentric coordinates + * \param pt [out] point on triangle + * \param nearvtx [out] index of nearest vertex + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::ComputePoint(float u, float v, Point& pt, udword* nearvtx) const +{ + // Compute point coordinates + pt = (1.0f - u - v)*mVerts[0] + u*mVerts[1] + v*mVerts[2]; + + // Compute nearest vertex if needed + if(nearvtx) + { + // Compute distance vector + Point d(mVerts[0].SquareDistance(pt), // Distance^2 from vertex 0 to point on the face + mVerts[1].SquareDistance(pt), // Distance^2 from vertex 1 to point on the face + mVerts[2].SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face + + // Get smallest distance + *nearvtx = d.SmallestAxis(); + } +} + +void Triangle::Inflate(float fat_coeff, bool constant_border) +{ + // Compute triangle center + Point TriangleCenter; + Center(TriangleCenter); + + // Don't normalize? + // Normalize => add a constant border, regardless of triangle size + // Don't => add more to big triangles + for(udword i=0;i<3;i++) + { + Point v = mVerts[i] - TriangleCenter; + + if(constant_border) v.Normalize(); + + mVerts[i] += v * fat_coeff; + } +} diff --git a/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h b/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h index 6b6d7fe4b..99a6467f2 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h @@ -1,84 +1,84 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy triangle class. - * \file IceTriangle.h - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICETRIANGLE_H__ -#define __ICETRIANGLE_H__ - - // Forward declarations - class Moment; - - // Partitioning values - enum PartVal - { - TRI_MINUS_SPACE = 0, //!< Triangle is in the negative space - TRI_PLUS_SPACE = 1, //!< Triangle is in the positive space - TRI_INTERSECT = 2, //!< Triangle intersects plane - TRI_ON_PLANE = 3, //!< Triangle and plane are coplanar - - TRI_FORCEDWORD = 0x7fffffff - }; - - // A triangle class. - class ICEMATHS_API Triangle - { - public: - //! Constructor - inline_ Triangle() {} - //! Constructor - inline_ Triangle(const Point& p0, const Point& p1, const Point& p2) { mVerts[0]=p0; mVerts[1]=p1; mVerts[2]=p2; } - //! Copy constructor - inline_ Triangle(const Triangle& triangle) - { - mVerts[0] = triangle.mVerts[0]; - mVerts[1] = triangle.mVerts[1]; - mVerts[2] = triangle.mVerts[2]; - } - //! Destructor - inline_ ~Triangle() {} - //! Vertices - Point mVerts[3]; - - // Methods - void Flip(); - float Area() const; - float Perimeter() const; - float Compacity() const; - void Normal(Point& normal) const; - void DenormalizedNormal(Point& normal) const; - void Center(Point& center) const; - inline_ Plane PlaneEquation() const { return Plane(mVerts[0], mVerts[1], mVerts[2]); } - - PartVal TestAgainstPlane(const Plane& plane, float epsilon) const; -// float Distance(Point& cp, Point& cq, Tri& tri); - void ComputeMoment(Moment& m); - float MinEdgeLength() const; - float MaxEdgeLength() const; - void ComputePoint(float u, float v, Point& pt, udword* nearvtx=null) const; - void Inflate(float fat_coeff, bool constant_border); - }; - -#endif // __ICETRIANGLE_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy triangle class. + * \file IceTriangle.h + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICETRIANGLE_H__ +#define __ICETRIANGLE_H__ + + // Forward declarations + class Moment; + + // Partitioning values + enum PartVal + { + TRI_MINUS_SPACE = 0, //!< Triangle is in the negative space + TRI_PLUS_SPACE = 1, //!< Triangle is in the positive space + TRI_INTERSECT = 2, //!< Triangle intersects plane + TRI_ON_PLANE = 3, //!< Triangle and plane are coplanar + + TRI_FORCEDWORD = 0x7fffffff + }; + + // A triangle class. + class ICEMATHS_API Triangle + { + public: + //! Constructor + inline_ Triangle() {} + //! Constructor + inline_ Triangle(const Point& p0, const Point& p1, const Point& p2) { mVerts[0]=p0; mVerts[1]=p1; mVerts[2]=p2; } + //! Copy constructor + inline_ Triangle(const Triangle& triangle) + { + mVerts[0] = triangle.mVerts[0]; + mVerts[1] = triangle.mVerts[1]; + mVerts[2] = triangle.mVerts[2]; + } + //! Destructor + inline_ ~Triangle() {} + //! Vertices + Point mVerts[3]; + + // Methods + void Flip(); + float Area() const; + float Perimeter() const; + float Compacity() const; + void Normal(Point& normal) const; + void DenormalizedNormal(Point& normal) const; + void Center(Point& center) const; + inline_ Plane PlaneEquation() const { return Plane(mVerts[0], mVerts[1], mVerts[2]); } + + PartVal TestAgainstPlane(const Plane& plane, float epsilon) const; +// float Distance(Point& cp, Point& cq, Tri& tri); + void ComputeMoment(Moment& m); + float MinEdgeLength() const; + float MaxEdgeLength() const; + void ComputePoint(float u, float v, Point& pt, udword* nearvtx=null) const; + void Inflate(float fat_coeff, bool constant_border); + }; + +#endif // __ICETRIANGLE_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h b/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h index 3a0d987f6..73d23b596 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h @@ -1,77 +1,77 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a triangle container. - * \file IceTrilist.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICETRILIST_H__ -#define __ICETRILIST_H__ - - class ICEMATHS_API TriList : public Container - { - public: - // Constructor / Destructor - TriList() {} - ~TriList() {} - - inline_ udword GetNbTriangles() const { return GetNbEntries()/9; } - inline_ Triangle* GetTriangles() const { return (Triangle*)GetEntries(); } - - void AddTri(const Triangle& tri) - { - Add(tri.mVerts[0].x).Add(tri.mVerts[0].y).Add(tri.mVerts[0].z); - Add(tri.mVerts[1].x).Add(tri.mVerts[1].y).Add(tri.mVerts[1].z); - Add(tri.mVerts[2].x).Add(tri.mVerts[2].y).Add(tri.mVerts[2].z); - } - - void AddTri(const Point& p0, const Point& p1, const Point& p2) - { - Add(p0.x).Add(p0.y).Add(p0.z); - Add(p1.x).Add(p1.y).Add(p1.z); - Add(p2.x).Add(p2.y).Add(p2.z); - } - }; - - class ICEMATHS_API TriangleList : public Container - { - public: - // Constructor / Destructor - TriangleList() {} - ~TriangleList() {} - - inline_ udword GetNbTriangles() const { return GetNbEntries()/3; } - inline_ IndexedTriangle* GetTriangles() const { return (IndexedTriangle*)GetEntries();} - - void AddTriangle(const IndexedTriangle& tri) - { - Add(tri.mVRef[0]).Add(tri.mVRef[1]).Add(tri.mVRef[2]); - } - - void AddTriangle(udword vref0, udword vref1, udword vref2) - { - Add(vref0).Add(vref1).Add(vref2); - } - }; - -#endif //__ICETRILIST_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a triangle container. + * \file IceTrilist.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICETRILIST_H__ +#define __ICETRILIST_H__ + + class ICEMATHS_API TriList : public Container + { + public: + // Constructor / Destructor + TriList() {} + ~TriList() {} + + inline_ udword GetNbTriangles() const { return GetNbEntries()/9; } + inline_ Triangle* GetTriangles() const { return (Triangle*)GetEntries(); } + + void AddTri(const Triangle& tri) + { + Add(tri.mVerts[0].x).Add(tri.mVerts[0].y).Add(tri.mVerts[0].z); + Add(tri.mVerts[1].x).Add(tri.mVerts[1].y).Add(tri.mVerts[1].z); + Add(tri.mVerts[2].x).Add(tri.mVerts[2].y).Add(tri.mVerts[2].z); + } + + void AddTri(const Point& p0, const Point& p1, const Point& p2) + { + Add(p0.x).Add(p0.y).Add(p0.z); + Add(p1.x).Add(p1.y).Add(p1.z); + Add(p2.x).Add(p2.y).Add(p2.z); + } + }; + + class ICEMATHS_API TriangleList : public Container + { + public: + // Constructor / Destructor + TriangleList() {} + ~TriangleList() {} + + inline_ udword GetNbTriangles() const { return GetNbEntries()/3; } + inline_ IndexedTriangle* GetTriangles() const { return (IndexedTriangle*)GetEntries();} + + void AddTriangle(const IndexedTriangle& tri) + { + Add(tri.mVRef[0]).Add(tri.mVRef[1]).Add(tri.mVRef[2]); + } + + void AddTriangle(udword vref0, udword vref1, udword vref2) + { + Add(vref0).Add(vref1).Add(vref2); + } + }; + +#endif //__ICETRILIST_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/IceTypes.h b/Extras/CDTestFramework/Opcode/Ice/IceTypes.h index e4f9717ad..9316d8d53 100644 --- a/Extras/CDTestFramework/Opcode/Ice/IceTypes.h +++ b/Extras/CDTestFramework/Opcode/Ice/IceTypes.h @@ -1,181 +1,181 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains custom types. - * \file IceTypes.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef ICETYPES_H -#define ICETYPES_H - - #define USE_HANDLE_MANAGER - - // Constants -#ifndef PI - #define PI 3.1415926535897932384626433832795028841971693993751f //!< PI -#endif - #define HALFPI 1.57079632679489661923f //!< 0.5 * PI - #define TWOPI 6.28318530717958647692f //!< 2.0 * PI - #define INVPI 0.31830988618379067154f //!< 1.0 / PI - - #define RADTODEG 57.2957795130823208768f //!< 180.0 / PI, convert radians to degrees - #define DEGTORAD 0.01745329251994329577f //!< PI / 180.0, convert degrees to radians - - #define EXP 2.71828182845904523536f //!< e - #define INVLOG2 3.32192809488736234787f //!< 1.0 / log10(2) - #define LN2 0.693147180559945f //!< ln(2) - #define INVLN2 1.44269504089f //!< 1.0f / ln(2) - - #define INV3 0.33333333333333333333f //!< 1/3 - #define INV6 0.16666666666666666666f //!< 1/6 - #define INV7 0.14285714285714285714f //!< 1/7 - #define INV9 0.11111111111111111111f //!< 1/9 - #define INV255 0.00392156862745098039f //!< 1/255 - - #define SQRT2 1.41421356237f //!< sqrt(2) - #define INVSQRT2 0.707106781188f //!< 1 / sqrt(2) - - #define SQRT3 1.73205080757f //!< sqrt(3) - #define INVSQRT3 0.577350269189f //!< 1 / sqrt(3) - - #define null 0 //!< our own NULL pointer - - // Custom types used in ICE - typedef signed char sbyte; //!< sizeof(sbyte) must be 1 - typedef unsigned char ubyte; //!< sizeof(ubyte) must be 1 - typedef signed short sword; //!< sizeof(sword) must be 2 - typedef unsigned short uword; //!< sizeof(uword) must be 2 - typedef signed int sdword; //!< sizeof(sdword) must be 4 - typedef unsigned int udword; //!< sizeof(udword) must be 4 -#ifdef WIN32 - typedef signed __int64 sqword; //!< sizeof(sqword) must be 8 - typedef unsigned __int64 uqword; //!< sizeof(uqword) must be 8 -#elif LINUX - typedef signed long long sqword; //!< sizeof(sqword) must be 8 - typedef unsigned long long uqword; //!< sizeof(uqword) must be 8 -#elif defined(__APPLE__) - typedef signed long long sqword; //!< sizeof(sqword) must be 8 - typedef unsigned long long uqword; //!< sizeof(uqword) must be 8 -#elif defined(_XBOX) - typedef signed __int64 sqword; //!< sizeof(sqword) must be 8 - typedef unsigned __int64 uqword; //!< sizeof(uqword) must be 8 -#endif - typedef float float32; //!< sizeof(float32) must be 4 - typedef double float64; //!< sizeof(float64) must be 8 - typedef size_t regsize; //!< sizeof(regsize) must be sizeof(void*) - - // For test purpose you can force one of those: -// typedef udword regsize; -// typedef uqword regsize; - - ICE_COMPILE_TIME_ASSERT(sizeof(bool)==1); // ...otherwise things might fail with VC++ 4.2 ! - ICE_COMPILE_TIME_ASSERT(sizeof(ubyte)==1); - ICE_COMPILE_TIME_ASSERT(sizeof(sbyte)==1); - ICE_COMPILE_TIME_ASSERT(sizeof(sword)==2); - ICE_COMPILE_TIME_ASSERT(sizeof(uword)==2); - ICE_COMPILE_TIME_ASSERT(sizeof(udword)==4); - ICE_COMPILE_TIME_ASSERT(sizeof(sdword)==4); - ICE_COMPILE_TIME_ASSERT(sizeof(uqword)==8); - ICE_COMPILE_TIME_ASSERT(sizeof(sqword)==8); - ICE_COMPILE_TIME_ASSERT(sizeof(float32)==4); - ICE_COMPILE_TIME_ASSERT(sizeof(float64)==8); - ICE_COMPILE_TIME_ASSERT(sizeof(regsize)==sizeof(void*)); - - //! TO BE DOCUMENTED - #define DECLARE_ICE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name - - typedef udword DynID; //!< Dynamic identifier -#ifdef USE_HANDLE_MANAGER - typedef udword KID; //!< Kernel ID -// DECLARE_ICE_HANDLE(KID); -#else - typedef uword KID; //!< Kernel ID -#endif - #define INVALID_ID 0xffffffff //!< Invalid dword ID (counterpart of null pointers) -#ifdef USE_HANDLE_MANAGER - #define INVALID_KID 0xffffffff //!< Invalid Kernel ID -#else - #define INVALID_KID 0xffff //!< Invalid Kernel ID -#endif - #define INVALID_NUMBER 0xDEADBEEF //!< Standard junk value - - // Define BOOL if needed - #ifndef BOOL - typedef int BOOL; //!< Another boolean type. - #endif - - //! Union of a float and a sdword - typedef union { - float f; //!< The float - sdword d; //!< The integer - }scell; - - //! Union of a float and a udword - typedef union { - float f; //!< The float - udword d; //!< The integer - }ucell; - - // Type ranges - #define MAX_SBYTE 0x7f //!< max possible sbyte value - #define MIN_SBYTE 0x80 //!< min possible sbyte value - #define MAX_UBYTE 0xff //!< max possible ubyte value - #define MIN_UBYTE 0x00 //!< min possible ubyte value - #define MAX_SWORD 0x7fff //!< max possible sword value - #define MIN_SWORD 0x8000 //!< min possible sword value - #define MAX_UWORD 0xffff //!< max possible uword value - #define MIN_UWORD 0x0000 //!< min possible uword value - #define MAX_SDWORD 0x7fffffff //!< max possible sdword value - #define MIN_SDWORD 0x80000000 //!< min possible sdword value - #define MAX_UDWORD 0xffffffff //!< max possible udword value - #define MIN_UDWORD 0x00000000 //!< min possible udword value - #define MAX_FLOAT FLT_MAX //!< max possible float value - #define MIN_FLOAT (-FLT_MAX) //!< min possible loat value - #define IEEE_1_0 0x3f800000 //!< integer representation of 1.0 - #define IEEE_255_0 0x437f0000 //!< integer representation of 255.0 - #define IEEE_MAX_FLOAT 0x7f7fffff //!< integer representation of MAX_FLOAT - #define IEEE_MIN_FLOAT 0xff7fffff //!< integer representation of MIN_FLOAT - #define IEEE_UNDERFLOW_LIMIT 0x1a000000 - - #define ONE_OVER_RAND_MAX (1.0f / float(RAND_MAX)) //!< Inverse of the max possible value returned by rand() - - typedef void** VTABLE; //!< A V-Table. - - #undef MIN - #undef MAX - #define MIN(a, b) ((a) < (b) ? (a) : (b)) //!< Returns the min value between a and b - #define MAX(a, b) ((a) > (b) ? (a) : (b)) //!< Returns the max value between a and b - #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c - - template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } - template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } - template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } - template inline_ void TSetMax (T& a, const T& b) { if(a (b) ? (a) : (b)) //!< Returns the max value between a and b + #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c + + template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } + template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } + template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } + template inline_ void TSetMax (T& a, const T& b) { if(a> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); - n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); - n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); - n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); - n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); - // Etc for larger integers (64 bits in Java) - // NOTE: the >> operation must be unsigned! (>>> in java) - } - - //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) - inline_ udword CountBits(udword n) - { - // This relies of the fact that the count of n bits can NOT overflow - // an n bit integer. EG: 1 bit count takes a 1 bit integer, 2 bit counts - // 2 bit integer, 3 bit count requires only a 2 bit integer. - // So we add all bit pairs, then each nible, then each byte etc... - n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); - n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); - n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); - n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); - n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); - // Etc for larger integers (64 bits in Java) - // NOTE: the >> operation must be unsigned! (>>> in java) - return n; - } - - //! Even faster? - inline_ udword CountBits2(udword bits) - { - bits = bits - ((bits >> 1) & 0x55555555); - bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); - bits = ((bits >> 4) + bits) & 0x0F0F0F0F; - return (bits * 0x01010101) >> 24; - } - - // "Population Count (Ones Count) - // The population count of a binary integer value x is the number of one bits in the value. Although many machines have - // single instructions for this, the single instructions are usually microcoded loops that test a bit per cycle; a log-time - // algorithm coded in C is often faster. The following code uses a variable-precision SWAR algorithm to perform a tree - // reduction adding the bits in a 32-bit value:" - inline_ udword ones32(udword x) - { - /* 32-bit recursive reduction using SWAR... - but first step is mapping 2-bit values - into sum of 2 1-bit values in sneaky way - */ - x -= ((x >> 1) & 0x55555555); - x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); - x = (((x >> 4) + x) & 0x0f0f0f0f); - x += (x >> 8); - x += (x >> 16); - return (x & 0x0000003f); - // "It is worthwhile noting that the SWAR population count algorithm given above can be improved upon for the case of - // counting the population of multi-word bit sets. How? The last few steps in the reduction are using only a portion - // of the SWAR width to produce their results; thus, it would be possible to combine these steps across multiple words - // being reduced. One additional note: the AMD Athlon optimization guidelines suggest a very similar algorithm that - // replaces the last three lines with return((x * 0x01010101) >> 24);. For the Athlon (which has a very fast integer - // multiply), I would have expected AMD's code to be faster... but it is actually 6% slower according to my benchmarks - // using a 1.2GHz Athlon (a Thunderbird). Why? Well, it so happens that GCC doesn't use a multiply instruction - it - // writes out the equivalent shift and add sequence!" - } - - // "Trailing Zero Count - // Given the Least Significant 1 Bit and Population Count (Ones Count) algorithms, it is trivial to combine them to - // construct a trailing zero count (as pointed-out by Joe Bowbeer):" - inline_ udword tzc(sdword x) - { - return(ones32((x & -x) - 1)); - } - - //! Spread out bits. EG 00001111 -> 0101010101 - //! 00001010 -> 0100010000 - //! This is used to interleave two integers to produce a `Morton Key' - //! used in Space Filling Curves (See DrDobbs Journal, July 1999) - //! Order is important. - inline_ void SpreadBits(udword& n) - { - n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); - n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); - n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); - n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); - n = ( n & 0x11111111) | (( n & 0x22222222) << 1); - } - - // "Next Largest Power of 2 - // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm - // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with - // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next - // largest power of 2. For a 32-bit value:" - inline_ udword NextPowerOfTwo(udword x) - { - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x+1; - } - - //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) - inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } - - //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) - inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } - - //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) - inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } - - // "Integer Minimum or Maximum - // Given 2's complement integer values x and y, the minimum can be computed without any branches as - // x+(((y-x)>>(WORDBITS-1))&(y-x)). - // Logically, this works because the shift by (WORDBITS-1) replicates the sign bit to create a mask - // -- be aware, however, that the C language does not require that shifts are signed even if their - // operands are signed, so there is a potential portability problem. Additionally, one might think - // that a shift by any number greater than or equal to WORDBITS would have the same effect, but many - // instruction sets have shifts that behave strangely when such shift distances are specified. - // Of course, maximum can be computed using the same trick: - // x-(((x-y)>>(WORDBITS-1))&(x-y))." - - //!< Alternative min function - inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } - //!< Alternative max function - inline_ sdword max_(sdword a, sdword b) { sdword delta = a-b; return a - (delta&(delta>>31)); } - - // "Integer Selection - // A branchless, lookup-free, alternative to code like if (a> (WORDBITS-1)) & (c^d)) ^ d). - // This code assumes that the shift is signed, which, of course, C does not promise." - inline_ sdword IntegerSelection(sdword a, sdword b, sdword c, sdword d) - { - return ((((a-b)>>31) & (c^d)) ^ d); - } - - // Determine if one of the bytes in a 4 byte word is zero - inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } - - // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 - inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } -// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } - - // "Most Significant 1 Bit - // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) - // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. - // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. - // Bitwise AND of the original value with the complement of the "folded" value shifted down by one - // yields the most significant bit. For a 32-bit value:" - inline_ udword msb32(udword x) - { - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return (x & ~(x >> 1)); - } - - // "Gray Code Conversion - // A Gray code is any binary coding sequence in which only a single bit position changes as we move from one value to the next. - // There are many such codes, but the traditional one is computed such that the Kth Gray code is K^(K>>1). - // - // The well-known algorithm for conversion from Gray to binary is a linear sequence of XORs that makes it seem each bit must be - // dealt with separately. Fortunately, that is equivalent to a parallel prefix XOR that can be computed using SWAR techniques - // in log time. For 32-bit Gray code values produced as described above, the conversion from Gray code back to unsigned binary is:" - inline_ udword g2b(udword gray) - { - gray ^= (gray >> 16); - gray ^= (gray >> 8); - gray ^= (gray >> 4); - gray ^= (gray >> 2); - gray ^= (gray >> 1); - return gray; - } - - /* - "Just call it repeatedly with various input values and always with the same variable as "memory". - The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 - does no filtering at all. - - I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed - to the more typical FIR (Finite Impulse Response). - - Also, I'd say that you can make more intelligent and interesting filters than this, for example filters - that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter - to be applied before this one, of course." - - (JCAB on Flipcode) - */ - inline_ float FeedbackFilter(float val, float& memory, float sharpness) - { - ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); - if(sharpness<0.0f) sharpness = 0.0f; - else if(sharpness>1.0f) sharpness = 1.0f; - return memory = val * sharpness + memory * (1.0f - sharpness); - } - - //! "If you can guarantee that your input domain (i.e. value of x) is slightly - //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the - //! following code to clamp the resulting value into [-32768,+32767] range:" - inline_ int ClampToInt16(int x) - { -// ASSERT(abs(x) < (int)((1<<31u)-32767)); - - int delta = 32767 - x; - x += (delta>>31) & delta; - delta = x + 32768; - x -= (delta>>31) & delta; - return x; - } - - // Generic functions - template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } - template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } - - template inline_ void TSort(Type& a, Type& b) - { - if(a>b) TSwap(a, b); - } - - template inline_ void TSort(Type& a, Type& b, Type& c) - { - if(a>b) TSwap(a, b); - if(b>c) TSwap(b, c); - if(a>b) TSwap(a, b); - if(b>c) TSwap(b, c); - } - - // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) -// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } - // ... actually this is better ! - #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); - - //! TO BE DOCUMENTED - #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) - - //! TO BE DOCUMENTED - #if !defined(_XBOX) - // Already defined on Xbox. - #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) - #endif - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns the alignment of the input address. - * \fn Alignment() - * \param address [in] address to check - * \return the best alignment (e.g. 1 for odd addresses, etc) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - FUNCTION ICECORE_API udword Alignment(udword address); - - #define IS_ALIGNED_2(x) ((x&1)==0) - #define IS_ALIGNED_4(x) ((x&3)==0) - #define IS_ALIGNED_8(x) ((x&7)==0) - - // Updates a pointer with "stride" bytes - inline_ void UpdatePtr(void*& ptr, udword stride) { ptr = ((ubyte*)ptr) + stride; } - - // From Jon Watte IIRC - inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } - - // Compute implicit coords from an index: - // The idea is to get back 2D coords from a 1D index. - // For example: - // - // 0 1 2 ... nbu-1 - // nbu nbu+1 i ... - // - // We have i, we're looking for the equivalent (u=2, v=1) location. - // i = u + v*nbu - // <=> i/nbu = u/nbu + v - // Since 0 <= u < nbu, u/nbu = 0 (integer) - // Hence: v = i/nbu - // Then we simply put it back in the original equation to compute u = i - v*nbu - inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) - { - v = i / nbu; - u = i - (v * nbu); - } - - // In 3D: i = u + v*nbu + w*nbu*nbv - // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w - // u/(nbu*nbv) is null since u/nbu was null already. - // v/nbv is null as well for the same reason. - // Hence w = i/(nbu*nbv) - // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu - inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) - { - w = i / (nbu_nbv); - Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); - } - - // Calling fsincos instead of fsin+fcos. Twice faster. - inline_ void FSinCos(float& c, float& s, float f) - { - float LocalCos, LocalSin; - float Local = f; -#ifdef WIN32 - _asm fld Local - _asm fsincos - _asm fstp LocalCos - _asm fstp LocalSin -#elif LINUX - asm("fld Local\n\t" - "fsincos\n\t" - "fstp LocalCos\n\t" - "fstp LocalSin\n\t" - ); -#endif - c = LocalCos; - s = LocalSin; - } - - // Modulo3 macros. See http://www.codercorner.com/Modulo3.htm - #define GET_NEXT_INDICES(i, j, k) \ - k = 0x01000201; \ - k>>=(i<<3); \ - j = k & 0xff; \ - k>>=8; \ - k&=0xff; - - #define GET_NEXT_INDICES2(i, j, k) \ - j = ( 9 >> (i<<1)) & 3; \ - k = (18 >> (i<<1)) & 3; - - // 0=>1, 1=>2, 2=>0 - inline_ udword Modulo3(udword i) - { - ASSERT(i==0 || i==1 || i==2); - return (9 >> (i << 1)) & 3; - } - -#endif // ICEUTILS_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains misc. useful macros & defines. + * \file IceUtils.h + * \author Pierre Terdiman (personal code + collected from various sources) + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEUTILS_H +#define ICEUTILS_H + + #define START_RUNONCE { static bool __RunOnce__ = false; if(!__RunOnce__){ + #define END_RUNONCE __RunOnce__ = true;}} + + //! Reverse all the bits in a 32 bit word (from Steve Baker's Cute Code Collection) + //! (each line can be done in any order. + inline_ void ReverseBits(udword& n) + { + n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); + n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); + n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); + n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); + n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); + // Etc for larger integers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + } + + //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) + inline_ udword CountBits(udword n) + { + // This relies of the fact that the count of n bits can NOT overflow + // an n bit integer. EG: 1 bit count takes a 1 bit integer, 2 bit counts + // 2 bit integer, 3 bit count requires only a 2 bit integer. + // So we add all bit pairs, then each nible, then each byte etc... + n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); + n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); + n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); + n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); + n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); + // Etc for larger integers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + return n; + } + + //! Even faster? + inline_ udword CountBits2(udword bits) + { + bits = bits - ((bits >> 1) & 0x55555555); + bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); + bits = ((bits >> 4) + bits) & 0x0F0F0F0F; + return (bits * 0x01010101) >> 24; + } + + // "Population Count (Ones Count) + // The population count of a binary integer value x is the number of one bits in the value. Although many machines have + // single instructions for this, the single instructions are usually microcoded loops that test a bit per cycle; a log-time + // algorithm coded in C is often faster. The following code uses a variable-precision SWAR algorithm to perform a tree + // reduction adding the bits in a 32-bit value:" + inline_ udword ones32(udword x) + { + /* 32-bit recursive reduction using SWAR... + but first step is mapping 2-bit values + into sum of 2 1-bit values in sneaky way + */ + x -= ((x >> 1) & 0x55555555); + x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); + x = (((x >> 4) + x) & 0x0f0f0f0f); + x += (x >> 8); + x += (x >> 16); + return (x & 0x0000003f); + // "It is worthwhile noting that the SWAR population count algorithm given above can be improved upon for the case of + // counting the population of multi-word bit sets. How? The last few steps in the reduction are using only a portion + // of the SWAR width to produce their results; thus, it would be possible to combine these steps across multiple words + // being reduced. One additional note: the AMD Athlon optimization guidelines suggest a very similar algorithm that + // replaces the last three lines with return((x * 0x01010101) >> 24);. For the Athlon (which has a very fast integer + // multiply), I would have expected AMD's code to be faster... but it is actually 6% slower according to my benchmarks + // using a 1.2GHz Athlon (a Thunderbird). Why? Well, it so happens that GCC doesn't use a multiply instruction - it + // writes out the equivalent shift and add sequence!" + } + + // "Trailing Zero Count + // Given the Least Significant 1 Bit and Population Count (Ones Count) algorithms, it is trivial to combine them to + // construct a trailing zero count (as pointed-out by Joe Bowbeer):" + inline_ udword tzc(sdword x) + { + return(ones32((x & -x) - 1)); + } + + //! Spread out bits. EG 00001111 -> 0101010101 + //! 00001010 -> 0100010000 + //! This is used to interleave two integers to produce a `Morton Key' + //! used in Space Filling Curves (See DrDobbs Journal, July 1999) + //! Order is important. + inline_ void SpreadBits(udword& n) + { + n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); + n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); + n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); + n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); + n = ( n & 0x11111111) | (( n & 0x22222222) << 1); + } + + // "Next Largest Power of 2 + // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm + // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with + // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next + // largest power of 2. For a 32-bit value:" + inline_ udword NextPowerOfTwo(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x+1; + } + + //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) + inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } + + //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) + inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } + + //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) + inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } + + // "Integer Minimum or Maximum + // Given 2's complement integer values x and y, the minimum can be computed without any branches as + // x+(((y-x)>>(WORDBITS-1))&(y-x)). + // Logically, this works because the shift by (WORDBITS-1) replicates the sign bit to create a mask + // -- be aware, however, that the C language does not require that shifts are signed even if their + // operands are signed, so there is a potential portability problem. Additionally, one might think + // that a shift by any number greater than or equal to WORDBITS would have the same effect, but many + // instruction sets have shifts that behave strangely when such shift distances are specified. + // Of course, maximum can be computed using the same trick: + // x-(((x-y)>>(WORDBITS-1))&(x-y))." + + //!< Alternative min function + inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } + //!< Alternative max function + inline_ sdword max_(sdword a, sdword b) { sdword delta = a-b; return a - (delta&(delta>>31)); } + + // "Integer Selection + // A branchless, lookup-free, alternative to code like if (a> (WORDBITS-1)) & (c^d)) ^ d). + // This code assumes that the shift is signed, which, of course, C does not promise." + inline_ sdword IntegerSelection(sdword a, sdword b, sdword c, sdword d) + { + return ((((a-b)>>31) & (c^d)) ^ d); + } + + // Determine if one of the bytes in a 4 byte word is zero + inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } + + // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 + inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } +// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } + + // "Most Significant 1 Bit + // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) + // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. + // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. + // Bitwise AND of the original value with the complement of the "folded" value shifted down by one + // yields the most significant bit. For a 32-bit value:" + inline_ udword msb32(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return (x & ~(x >> 1)); + } + + // "Gray Code Conversion + // A Gray code is any binary coding sequence in which only a single bit position changes as we move from one value to the next. + // There are many such codes, but the traditional one is computed such that the Kth Gray code is K^(K>>1). + // + // The well-known algorithm for conversion from Gray to binary is a linear sequence of XORs that makes it seem each bit must be + // dealt with separately. Fortunately, that is equivalent to a parallel prefix XOR that can be computed using SWAR techniques + // in log time. For 32-bit Gray code values produced as described above, the conversion from Gray code back to unsigned binary is:" + inline_ udword g2b(udword gray) + { + gray ^= (gray >> 16); + gray ^= (gray >> 8); + gray ^= (gray >> 4); + gray ^= (gray >> 2); + gray ^= (gray >> 1); + return gray; + } + + /* + "Just call it repeatedly with various input values and always with the same variable as "memory". + The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 + does no filtering at all. + + I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed + to the more typical FIR (Finite Impulse Response). + + Also, I'd say that you can make more intelligent and interesting filters than this, for example filters + that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter + to be applied before this one, of course." + + (JCAB on Flipcode) + */ + inline_ float FeedbackFilter(float val, float& memory, float sharpness) + { + ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); + if(sharpness<0.0f) sharpness = 0.0f; + else if(sharpness>1.0f) sharpness = 1.0f; + return memory = val * sharpness + memory * (1.0f - sharpness); + } + + //! "If you can guarantee that your input domain (i.e. value of x) is slightly + //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the + //! following code to clamp the resulting value into [-32768,+32767] range:" + inline_ int ClampToInt16(int x) + { +// ASSERT(abs(x) < (int)((1<<31u)-32767)); + + int delta = 32767 - x; + x += (delta>>31) & delta; + delta = x + 32768; + x -= (delta>>31) & delta; + return x; + } + + // Generic functions + template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } + template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } + + template inline_ void TSort(Type& a, Type& b) + { + if(a>b) TSwap(a, b); + } + + template inline_ void TSort(Type& a, Type& b, Type& c) + { + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + } + + // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) +// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } + // ... actually this is better ! + #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); + + //! TO BE DOCUMENTED + #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) + + //! TO BE DOCUMENTED + #if !defined(_XBOX) + // Already defined on Xbox. + #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + #endif + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns the alignment of the input address. + * \fn Alignment() + * \param address [in] address to check + * \return the best alignment (e.g. 1 for odd addresses, etc) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + FUNCTION ICECORE_API udword Alignment(udword address); + + #define IS_ALIGNED_2(x) ((x&1)==0) + #define IS_ALIGNED_4(x) ((x&3)==0) + #define IS_ALIGNED_8(x) ((x&7)==0) + + // Updates a pointer with "stride" bytes + inline_ void UpdatePtr(void*& ptr, udword stride) { ptr = ((ubyte*)ptr) + stride; } + + // From Jon Watte IIRC + inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } + + // Compute implicit coords from an index: + // The idea is to get back 2D coords from a 1D index. + // For example: + // + // 0 1 2 ... nbu-1 + // nbu nbu+1 i ... + // + // We have i, we're looking for the equivalent (u=2, v=1) location. + // i = u + v*nbu + // <=> i/nbu = u/nbu + v + // Since 0 <= u < nbu, u/nbu = 0 (integer) + // Hence: v = i/nbu + // Then we simply put it back in the original equation to compute u = i - v*nbu + inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) + { + v = i / nbu; + u = i - (v * nbu); + } + + // In 3D: i = u + v*nbu + w*nbu*nbv + // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w + // u/(nbu*nbv) is null since u/nbu was null already. + // v/nbv is null as well for the same reason. + // Hence w = i/(nbu*nbv) + // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu + inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) + { + w = i / (nbu_nbv); + Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); + } + + // Calling fsincos instead of fsin+fcos. Twice faster. + inline_ void FSinCos(float& c, float& s, float f) + { + float LocalCos, LocalSin; + float Local = f; +#ifdef WIN32 + _asm fld Local + _asm fsincos + _asm fstp LocalCos + _asm fstp LocalSin +#elif LINUX + asm("fld Local\n\t" + "fsincos\n\t" + "fstp LocalCos\n\t" + "fstp LocalSin\n\t" + ); +#endif + c = LocalCos; + s = LocalSin; + } + + // Modulo3 macros. See http://www.codercorner.com/Modulo3.htm + #define GET_NEXT_INDICES(i, j, k) \ + k = 0x01000201; \ + k>>=(i<<3); \ + j = k & 0xff; \ + k>>=8; \ + k&=0xff; + + #define GET_NEXT_INDICES2(i, j, k) \ + j = ( 9 >> (i<<1)) & 3; \ + k = (18 >> (i<<1)) & 3; + + // 0=>1, 1=>2, 2=>0 + inline_ udword Modulo3(udword i) + { + ASSERT(i==0 || i==1 || i==2); + return (9 >> (i << 1)) & 3; + } + +#endif // ICEUTILS_H diff --git a/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h b/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h index 10ff34b67..23375fa73 100644 --- a/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h +++ b/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h @@ -1,522 +1,522 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains AABB-related code. (axis-aligned bounding box) - * \file IceAABB.h - * \author Pierre Terdiman - * \date January, 13, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEAABB_H__ -#define __ICEAABB_H__ - - // Forward declarations - class Sphere; - -//! Declarations of type-independent methods (most of them implemented in the .cpp) -#define AABB_COMMON_METHODS \ - AABB& Add(const AABB& aabb); \ - float MakeCube(AABB& cube) const; \ - void MakeSphere(Sphere& sphere) const; \ - const sbyte* ComputeOutline(const Point& local_eye, sdword& num) const; \ - float ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const; \ - bool IsInside(const AABB& box) const; \ - bool ComputePlanes(Plane* planes) const; \ - bool ComputePoints(Point* pts) const; \ - const Point* GetVertexNormals() const; \ - const udword* GetEdges() const; \ - const Point* GetEdgeNormals() const; \ - inline_ BOOL ContainsPoint(const Point& p) const \ - { \ - if(p.x > GetMax(0) || p.x < GetMin(0)) return FALSE; \ - if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ - if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ - return TRUE; \ - } - - enum AABBType - { - AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. - AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. - - AABB_FORCE_DWORD = 0x7fffffff, - }; - -#ifdef USE_MINMAX - - struct ICEMATHS_API ShadowAABB - { - Point mMin; - Point mMax; - }; - - class ICEMATHS_API AABB - { - public: - //! Constructor - inline_ AABB() {} - //! Destructor - inline_ ~AABB() {} - - //! Type-independent methods - AABB_COMMON_METHODS; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from center & extents vectors. - * \param c [in] the center point - * \param e [in] the extents vector - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups a point AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetPoint(const Point& pt) { mMin = mMax = pt; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the size of the AABB. The size is defined as the longest extent. - * \return the size of the AABB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - float GetSize() const { Point e; GetExtents(e); return e.Max(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Extends the AABB. - * \param p [in] the next point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Extend(const Point& p) - { - if(p.x > mMax.x) mMax.x = p.x; - if(p.x < mMin.x) mMin.x = p.x; - - if(p.y > mMax.y) mMax.y = p.y; - if(p.y < mMin.y) mMin.y = p.y; - - if(p.z > mMax.z) mMax.z = p.z; - if(p.z < mMin.z) mMin.z = p.z; - } - // Data access - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mMin; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mMax; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mMin[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mMax[axis]; } - - //! Get box center - inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } - //! Get box extents - inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } - - //! Get component of the box's center along a given axis - inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } - //! Get component of the box's extents along a given axis - inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } - - //! Get box diagonal - inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } - inline_ float GetWidth() const { return mMax.x - mMin.x; } - inline_ float GetHeight() const { return mMax.y - mMin.y; } - inline_ float GetDepth() const { return mMax.z - mMin.z; } - - //! Volume - inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the intersection between two AABBs. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a) const - { - if(mMax.x < a.mMin.x - || a.mMax.x < mMin.x - || mMax.y < a.mMin.y - || a.mMax.y < mMin.y - || mMax.z < a.mMin.z - || a.mMax.z < mMin.z) return FALSE; - - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the 1D-intersection between two AABBs, on a given axis. - * \param a [in] the other AABB - * \param axis [in] the axis (0, 1, 2) - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a, udword axis) const - { - if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. - * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) - * \param mtx [in] the transform matrix - * \param aabb [out] the transformed AABB [can be *this] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const - { - // The three edges transformed: you can efficiently transform an X-only vector - // by just getting the "X" column of the matrix - Point vx,vy,vz; - mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); - mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); - mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); - - // Transform the min point - aabb.mMin = aabb.mMax = mMin * mtx; - - // Take the transformed min & axes and find new extents - // Using CPU code in the right place is faster... - if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; - if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; - if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; - if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; - if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; - if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; - if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; - if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; - if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the AABB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Min, Max) boxes: min < max - if(mMin.x > mMax.x) return FALSE; - if(mMin.y > mMax.y) return FALSE; - if(mMin.z > mMax.z) return FALSE; - return TRUE; - } - - //! Operator for AABB *= float. Scales the extents, keeps same center. - inline_ AABB& operator*=(float s) - { - Point Center; GetCenter(Center); - Point Extents; GetExtents(Extents); - SetCenterExtents(Center, Extents * s); - return *this; - } - - //! Operator for AABB /= float. Scales the extents, keeps same center. - inline_ AABB& operator/=(float s) - { - Point Center; GetCenter(Center); - Point Extents; GetExtents(Extents); - SetCenterExtents(Center, Extents / s); - return *this; - } - - //! Operator for AABB += Point. Translates the box. - inline_ AABB& operator+=(const Point& trans) - { - mMin+=trans; - mMax+=trans; - return *this; - } - private: - Point mMin; //!< Min point - Point mMax; //!< Max point - }; - -#else - - class ICEMATHS_API AABB - { - public: - //! Constructor - inline_ AABB() {} - //! Destructor - inline_ ~AABB() {} - - //! Type-independent methods - AABB_COMMON_METHODS; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from center & extents vectors. - * \param c [in] the center point - * \param e [in] the extents vector - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups a point AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the size of the AABB. The size is defined as the longest extent. - * \return the size of the AABB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - float GetSize() const { return mExtents.Max(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Extends the AABB. - * \param p [in] the next point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Extend(const Point& p) - { - Point Max = mCenter + mExtents; - Point Min = mCenter - mExtents; - - if(p.x > Max.x) Max.x = p.x; - if(p.x < Min.x) Min.x = p.x; - - if(p.y > Max.y) Max.y = p.y; - if(p.y < Min.y) Min.y = p.y; - - if(p.z > Max.z) Max.z = p.z; - if(p.z < Min.z) Min.z = p.z; - - SetMinMax(Min, Max); - } - // Data access - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } - - //! Get box center - inline_ void GetCenter(Point& center) const { center = mCenter; } - //! Get box extents - inline_ void GetExtents(Point& extents) const { extents = mExtents; } - - //! Get component of the box's center along a given axis - inline_ float GetCenter(udword axis) const { return mCenter[axis]; } - //! Get component of the box's extents along a given axis - inline_ float GetExtents(udword axis) const { return mExtents[axis]; } - - //! Get box diagonal - inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } - inline_ float GetWidth() const { return mExtents.x * 2.0f; } - inline_ float GetHeight() const { return mExtents.y * 2.0f; } - inline_ float GetDepth() const { return mExtents.z * 2.0f; } - - //! Volume - inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the intersection between two AABBs. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a) const - { - float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; - float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; - float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * The standard intersection method from Gamasutra. Just here to check its speed against the one above. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool GomezIntersect(const AABB& a) - { - Point T = mCenter - a.mCenter; // Vector from A to B - return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) - && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) - && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the 1D-intersection between two AABBs, on a given axis. - * \param a [in] the other AABB - * \param axis [in] the axis (0, 1, 2) - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a, udword axis) const - { - float t = mCenter[axis] - a.mCenter[axis]; - float e = a.mExtents[axis] + mExtents[axis]; - if(AIR(t) > IR(e)) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. - * \param mtx [in] the transform matrix - * \param aabb [out] the transformed AABB [can be *this] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const - { - // Compute new center - aabb.mCenter = mCenter * mtx; - - // Compute new extents. FPU code & CPU code have been interleaved for improved performance. - Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); - IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; - - Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); - IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; - - Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); - IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; - - aabb.mExtents.x = Ex.x + Ey.x + Ez.x; - aabb.mExtents.y = Ex.y + Ey.y + Ez.y; - aabb.mExtents.z = Ex.z + Ey.z + Ez.z; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the AABB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Center, Extents) boxes: Extents >= 0 - if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; - if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; - if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; - return TRUE; - } - - //! Operator for AABB *= float. Scales the extents, keeps same center. - inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } - - //! Operator for AABB /= float. Scales the extents, keeps same center. - inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } - - //! Operator for AABB += Point. Translates the box. - inline_ AABB& operator+=(const Point& trans) - { - mCenter+=trans; - return *this; - } - private: - Point mCenter; //!< AABB Center - Point mExtents; //!< x, y and z extents - }; - -#endif - - inline_ void ComputeMinMax(const Point& p, Point& min, Point& max) - { - if(p.x > max.x) max.x = p.x; - if(p.x < min.x) min.x = p.x; - - if(p.y > max.y) max.y = p.y; - if(p.y < min.y) min.y = p.y; - - if(p.z > max.z) max.z = p.z; - if(p.z < min.z) min.z = p.z; - } - - inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) - { - if(list) - { - Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); - Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); - while(nb_pts--) - { -// _prefetch(list+1); // off by one ? - ComputeMinMax(*list++, Mini, Maxi); - } - aabb.SetMinMax(Mini, Maxi); - } - } - -#endif // __ICEAABB_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains AABB-related code. (axis-aligned bounding box) + * \file IceAABB.h + * \author Pierre Terdiman + * \date January, 13, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEAABB_H__ +#define __ICEAABB_H__ + + // Forward declarations + class Sphere; + +//! Declarations of type-independent methods (most of them implemented in the .cpp) +#define AABB_COMMON_METHODS \ + AABB& Add(const AABB& aabb); \ + float MakeCube(AABB& cube) const; \ + void MakeSphere(Sphere& sphere) const; \ + const sbyte* ComputeOutline(const Point& local_eye, sdword& num) const; \ + float ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const; \ + bool IsInside(const AABB& box) const; \ + bool ComputePlanes(Plane* planes) const; \ + bool ComputePoints(Point* pts) const; \ + const Point* GetVertexNormals() const; \ + const udword* GetEdges() const; \ + const Point* GetEdgeNormals() const; \ + inline_ BOOL ContainsPoint(const Point& p) const \ + { \ + if(p.x > GetMax(0) || p.x < GetMin(0)) return FALSE; \ + if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ + if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ + return TRUE; \ + } + + enum AABBType + { + AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. + AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. + + AABB_FORCE_DWORD = 0x7fffffff, + }; + +#ifdef USE_MINMAX + + struct ICEMATHS_API ShadowAABB + { + Point mMin; + Point mMax; + }; + + class ICEMATHS_API AABB + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mMin = mMax = pt; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { Point e; GetExtents(e); return e.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Extend(const Point& p) + { + if(p.x > mMax.x) mMax.x = p.x; + if(p.x < mMin.x) mMin.x = p.x; + + if(p.y > mMax.y) mMax.y = p.y; + if(p.y < mMin.y) mMin.y = p.y; + + if(p.z > mMax.z) mMax.z = p.z; + if(p.z < mMin.z) mMin.z = p.z; + } + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mMin; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mMax; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mMin[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mMax[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } + inline_ float GetWidth() const { return mMax.x - mMin.x; } + inline_ float GetHeight() const { return mMax.y - mMin.y; } + inline_ float GetDepth() const { return mMax.z - mMin.z; } + + //! Volume + inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + if(mMax.x < a.mMin.x + || a.mMax.x < mMin.x + || mMax.y < a.mMin.y + || a.mMax.y < mMin.y + || mMax.z < a.mMin.z + || a.mMax.z < mMin.z) return FALSE; + + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // The three edges transformed: you can efficiently transform an X-only vector + // by just getting the "X" column of the matrix + Point vx,vy,vz; + mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); + mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); + mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); + + // Transform the min point + aabb.mMin = aabb.mMax = mMin * mtx; + + // Take the transformed min & axes and find new extents + // Using CPU code in the right place is faster... + if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; + if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; + if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; + if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; + if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; + if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; + if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; + if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; + if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Min, Max) boxes: min < max + if(mMin.x > mMax.x) return FALSE; + if(mMin.y > mMax.y) return FALSE; + if(mMin.z > mMax.z) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents * s); + return *this; + } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents / s); + return *this; + } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mMin+=trans; + mMax+=trans; + return *this; + } + private: + Point mMin; //!< Min point + Point mMax; //!< Max point + }; + +#else + + class ICEMATHS_API AABB + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { return mExtents.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Extend(const Point& p) + { + Point Max = mCenter + mExtents; + Point Min = mCenter - mExtents; + + if(p.x > Max.x) Max.x = p.x; + if(p.x < Min.x) Min.x = p.x; + + if(p.y > Max.y) Max.y = p.y; + if(p.y < Min.y) Min.y = p.y; + + if(p.z > Max.z) Max.z = p.z; + if(p.z < Min.z) Min.z = p.z; + + SetMinMax(Min, Max); + } + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = mCenter; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = mExtents; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return mCenter[axis]; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return mExtents[axis]; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } + inline_ float GetWidth() const { return mExtents.x * 2.0f; } + inline_ float GetHeight() const { return mExtents.y * 2.0f; } + inline_ float GetDepth() const { return mExtents.z * 2.0f; } + + //! Volume + inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; + float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; + float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * The standard intersection method from Gamasutra. Just here to check its speed against the one above. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool GomezIntersect(const AABB& a) + { + Point T = mCenter - a.mCenter; // Vector from A to B + return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) + && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) + && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + float t = mCenter[axis] - a.mCenter[axis]; + float e = a.mExtents[axis] + mExtents[axis]; + if(AIR(t) > IR(e)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // Compute new center + aabb.mCenter = mCenter * mtx; + + // Compute new extents. FPU code & CPU code have been interleaved for improved performance. + Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); + IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; + + Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); + IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; + + Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); + IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; + + aabb.mExtents.x = Ex.x + Ey.x + Ez.x; + aabb.mExtents.y = Ex.y + Ey.y + Ez.y; + aabb.mExtents.z = Ex.z + Ey.z + Ez.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Center, Extents) boxes: Extents >= 0 + if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mCenter+=trans; + return *this; + } + private: + Point mCenter; //!< AABB Center + Point mExtents; //!< x, y and z extents + }; + +#endif + + inline_ void ComputeMinMax(const Point& p, Point& min, Point& max) + { + if(p.x > max.x) max.x = p.x; + if(p.x < min.x) min.x = p.x; + + if(p.y > max.y) max.y = p.y; + if(p.y < min.y) min.y = p.y; + + if(p.z > max.z) max.z = p.z; + if(p.z < min.z) min.z = p.z; + } + + inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) + { + if(list) + { + Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); + while(nb_pts--) + { +// _prefetch(list+1); // off by one ? + ComputeMinMax(*list++, Mini, Maxi); + } + aabb.SetMinMax(Mini, Maxi); + } + } + +#endif // __ICEAABB_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp b/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp index 53c2b4465..b5b673435 100644 --- a/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp @@ -1,361 +1,361 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a simple container class. - * \file IceContainer.cpp - * \author Pierre Terdiman - * \date February, 5, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a list of 32-bits values. - * Use this class when you need to store an unknown number of values. The list is automatically - * resized and can contains 32-bits entities (dwords or floats) - * - * \class Container - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceCore; - -// Static members -#ifdef CONTAINER_STATS -udword Container::mNbContainers = 0; -udword Container::mUsedRam = 0; -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. No entries allocated there. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container() : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. Also allocates a given number of entries. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container(udword size, float growth_factor) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(growth_factor) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); -#endif - SetSize(size); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Copy constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container(const Container& object) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); -#endif - *this = object; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. Frees everything and leaves. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::~Container() -{ - Empty(); -#ifdef CONTAINER_STATS - mNbContainers--; - mUsedRam-=GetUsedRam(); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Clears the container. All stored values are deleted, and it frees used ram. - * \see Reset() - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container& Container::Empty() -{ -#ifdef CONTAINER_STATS - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - DELETEARRAY(mEntries); - mCurNbEntries = mMaxNbEntries = 0; - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Resizes the container. - * \param needed [in] assume the container can be added at least "needed" values - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Container::Resize(udword needed) -{ -#ifdef CONTAINER_STATS - // Subtract previous amount of bytes - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - - // Get more entries - mMaxNbEntries = mMaxNbEntries ? udword(float(mMaxNbEntries)*mGrowthFactor) : 2; // Default nb Entries = 2 - if(mMaxNbEntriesmMaxNbEntries) Resize(nb); - - // Add new entry - CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); - mCurNbEntries+=nb; - return *this; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * A O(1) method to add a value in the container. The container is automatically resized if needed. - * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation - * costs a lot more than the call overhead... - * - * \param entry [in] a float to store in the container - * \see Add(udword entry) - * \see Empty() - * \see Contains(udword entry) - * \return Self-Reference - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ Container& Add(float entry) - { - // Resize if needed - if(mCurNbEntries==mMaxNbEntries) Resize(); - - // Add new entry - mEntries[mCurNbEntries++] = IR(entry); - return *this; - } - - inline_ Container& Add(const float* entries, udword nb) - { - // Resize if needed - if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); - - // Add new entry - CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); - mCurNbEntries+=nb; - return *this; - } - - //! Add unique [slow] - inline_ Container& AddUnique(udword entry) - { - if(!Contains(entry)) Add(entry); - return *this; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Clears the container. All stored values are deleted, and it frees used ram. - * \see Reset() - * \return Self-Reference - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - Container& Empty(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. - * That's a kind of temporal coherence. - * \see Empty() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Reset() - { - // Avoid the write if possible - // ### CMOV - if(mCurNbEntries) mCurNbEntries = 0; - } - - // HANDLE WITH CARE - inline_ void ForceSize(udword size) - { - mCurNbEntries = size; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Sets the initial size of the container. If it already contains something, it's discarded. - * \param nb [in] Number of entries - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetSize(udword nb); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the container and get rid of unused bytes. - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Refit(); - - // Checks whether the container already contains a given value. - bool Contains(udword entry, udword* location=null) const; - // Deletes an entry - doesn't preserve insertion order. - bool Delete(udword entry); - // Deletes an entry - does preserve insertion order. - bool DeleteKeepingOrder(udword entry); - //! Deletes the very last entry. - inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } - //! Deletes the entry whose index is given - inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } - - // Helpers - Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); - Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); - // Data access. - inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. - inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry - inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. - - inline_ udword GetFirst() const { return mEntries[0]; } - inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } - - // Growth control - inline_ float GetGrowthFactor() const { return mGrowthFactor; } //!< Returns the growth factor - inline_ void SetGrowthFactor(float growth) { mGrowthFactor = growth; } //!< Sets the growth factor - inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full - inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty - - //! Read-access as an array - inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && imMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); + mCurNbEntries+=nb; + return *this; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * A O(1) method to add a value in the container. The container is automatically resized if needed. + * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation + * costs a lot more than the call overhead... + * + * \param entry [in] a float to store in the container + * \see Add(udword entry) + * \see Empty() + * \see Contains(udword entry) + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ Container& Add(float entry) + { + // Resize if needed + if(mCurNbEntries==mMaxNbEntries) Resize(); + + // Add new entry + mEntries[mCurNbEntries++] = IR(entry); + return *this; + } + + inline_ Container& Add(const float* entries, udword nb) + { + // Resize if needed + if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); + mCurNbEntries+=nb; + return *this; + } + + //! Add unique [slow] + inline_ Container& AddUnique(udword entry) + { + if(!Contains(entry)) Add(entry); + return *this; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Container& Empty(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. + * That's a kind of temporal coherence. + * \see Empty() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Reset() + { + // Avoid the write if possible + // ### CMOV + if(mCurNbEntries) mCurNbEntries = 0; + } + + // HANDLE WITH CARE + inline_ void ForceSize(udword size) + { + mCurNbEntries = size; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Sets the initial size of the container. If it already contains something, it's discarded. + * \param nb [in] Number of entries + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetSize(udword nb); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the container and get rid of unused bytes. + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Refit(); + + // Checks whether the container already contains a given value. + bool Contains(udword entry, udword* location=null) const; + // Deletes an entry - doesn't preserve insertion order. + bool Delete(udword entry); + // Deletes an entry - does preserve insertion order. + bool DeleteKeepingOrder(udword entry); + //! Deletes the very last entry. + inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } + //! Deletes the entry whose index is given + inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } + + // Helpers + Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); + Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); + // Data access. + inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. + inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry + inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. + + inline_ udword GetFirst() const { return mEntries[0]; } + inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } + + // Growth control + inline_ float GetGrowthFactor() const { return mGrowthFactor; } //!< Returns the growth factor + inline_ void SetGrowthFactor(float growth) { mGrowthFactor = growth; } //!< Sets the growth factor + inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full + inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty + + //! Read-access as an array + inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && i>31); - return (float&)y; - } - - //! Computes 1.0f / sqrtf(x). - inline_ float frsqrt(float f) - { - float x = f * 0.5f; - udword y = 0x5f3759df - ((udword&)f >> 1); - // Iteration... - (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); - // Result - return (float&)y; - } - - //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. - inline_ float InvSqrt(const float& x) - { - udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; - float y = *(float*)&tmp; - return y * (1.47f - 0.47f * x * y * y); - } - - //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. - //! See http://www.magic-software.com/3DGEDInvSqrt.html - inline_ float RSqrt(float number) - { - long i; - float x2, y; - const float threehalfs = 1.5f; - - x2 = number * 0.5f; - y = number; - i = * (long *) &y; - i = 0x5f3759df - (i >> 1); - y = * (float *) &i; - y = y * (threehalfs - (x2 * y * y)); - - return y; - } - - //! TO BE DOCUMENTED - inline_ float fsqrt(float f) - { - udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; - // Iteration...? - // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; - // Result - return (float&)y; - } - - //! Returns the float ranged espilon value. - inline_ float fepsilon(float f) - { - udword b = (udword&)f & 0xff800000; - udword a = b | 0x00000001; - (float&)a -= (float&)b; - // Result - return (float&)a; - } - - //! Is the float valid ? - inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } - inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } - inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } - inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } - - inline_ bool IsValidFloat(float value) - { - if(IsNAN(value)) return false; - if(IsIndeterminate(value)) return false; - if(IsPlusInf(value)) return false; - if(IsMinusInf(value)) return false; - return true; - } - - #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); - -/* - //! FPU precision setting function. - inline_ void SetFPU() - { - // This function evaluates whether the floating-point - // control word is set to single precision/round to nearest/ - // exceptions disabled. If these conditions don't hold, the - // function changes the control word to set them and returns - // TRUE, putting the old control word value in the passback - // location pointed to by pwOldCW. - { - uword wTemp, wSave; - - __asm fstcw wSave - if (wSave & 0x300 || // Not single mode - 0x3f != (wSave & 0x3f) || // Exceptions enabled - wSave & 0xC00) // Not round to nearest mode - { - __asm - { - mov ax, wSave - and ax, not 300h ;; single mode - or ax, 3fh ;; disable all exceptions - and ax, not 0xC00 ;; round to nearest mode - mov wTemp, ax - fldcw wTemp - } - } - } - } -*/ - //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) - inline_ float ComputeFloatEpsilon() - { - float f = 1.0f; - ((udword&)f)^=1; - return f - 1.0f; // You can check it's the same as FLT_EPSILON - } - - inline_ bool IsFloatZero(float x, float epsilon=1e-6f) - { - return x*x < epsilon; - } - - #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 - #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 - #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 - #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 - - #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 - #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 - #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 - #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 - - #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 - #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 - #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 - #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 - - #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 - #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 - #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 - #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 - - #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 - #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 - #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 - #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 - - #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 - #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 - #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 - #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 - - #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 - #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 - #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 - #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 - - #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 - #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 - #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 - #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 - - //! A global function to find MAX(a,b) using FCOMI/FCMOV - inline_ float FCMax2(float a, float b) - { - float Res; - _asm fld [a] - _asm fld [b] - FCOMI_ST1 - FCMOVB_ST1 - _asm fstp [Res] - _asm fcomp - return Res; - } - - //! A global function to find MIN(a,b) using FCOMI/FCMOV - inline_ float FCMin2(float a, float b) - { - float Res; - _asm fld [a] - _asm fld [b] - FCOMI_ST1 - FCMOVNB_ST1 - _asm fstp [Res] - _asm fcomp - return Res; - } - - //! A global function to find MAX(a,b,c) using FCOMI/FCMOV - inline_ float FCMax3(float a, float b, float c) - { - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - FCOMI_ST1 - FCMOVB_ST1 - FCOMI_ST2 - FCMOVB_ST2 - _asm fstp [Res] - _asm fcompp - return Res; - } - - //! A global function to find MIN(a,b,c) using FCOMI/FCMOV - inline_ float FCMin3(float a, float b, float c) - { - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - FCOMI_ST1 - FCMOVNB_ST1 - FCOMI_ST2 - FCMOVNB_ST2 - _asm fstp [Res] - _asm fcompp - return Res; - } - - inline_ int ConvertToSortable(float f) - { - int& Fi = (int&)f; - int Fmask = (Fi>>31); - Fi ^= Fmask; - Fmask &= ~(1<<31); - Fi -= Fmask; - return Fi; - } - - enum FPUMode - { - FPU_FLOOR = 0, - FPU_CEIL = 1, - FPU_BEST = 2, - - FPU_FORCE_DWORD = 0x7fffffff - }; - - FUNCTION ICECORE_API FPUMode GetFPUMode(); - FUNCTION ICECORE_API void SaveFPU(); - FUNCTION ICECORE_API void RestoreFPU(); - FUNCTION ICECORE_API void SetFPUFloorMode(); - FUNCTION ICECORE_API void SetFPUCeilMode(); - FUNCTION ICECORE_API void SetFPUBestMode(); - - FUNCTION ICECORE_API void SetFPUPrecision24(); - FUNCTION ICECORE_API void SetFPUPrecision53(); - FUNCTION ICECORE_API void SetFPUPrecision64(); - FUNCTION ICECORE_API void SetFPURoundingChop(); - FUNCTION ICECORE_API void SetFPURoundingUp(); - FUNCTION ICECORE_API void SetFPURoundingDown(); - FUNCTION ICECORE_API void SetFPURoundingNear(); - - FUNCTION ICECORE_API int intChop(const float& f); - FUNCTION ICECORE_API int intFloor(const float& f); - FUNCTION ICECORE_API int intCeil(const float& f); - -#endif // __ICEFPU_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains FPU related code. + * \file IceFPU.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEFPU_H__ +#define __ICEFPU_H__ + + #define SIGN_BITMASK 0x80000000 + + //! Integer representation of a floating-point value. + #define IR(x) ((udword&)(x)) + + //! Signed integer representation of a floating-point value. + #define SIR(x) ((sdword&)(x)) + + //! Absolute integer representation of a floating-point value + #define AIR(x) (IR(x)&0x7fffffff) + + //! Floating-point representation of an integer value. + #define FR(x) ((float&)(x)) + + //! Integer-based comparison of a floating point value. + //! Don't use it blindly, it can be faster or slower than the FPU comparison, depends on the context. + #define IS_NEGATIVE_FLOAT(x) (IR(x)&0x80000000) + + //! Fast fabs for floating-point values. It just clears the sign bit. + //! Don't use it blindy, it can be faster or slower than the FPU comparison, depends on the context. + inline_ float FastFabs(float x) + { + udword FloatBits = IR(x)&0x7fffffff; + return FR(FloatBits); + } + + //! Fast square root for floating-point values. + inline_ float FastSqrt(float square) + { + float retval; + + __asm { + mov eax, square + sub eax, 0x3F800000 + sar eax, 1 + add eax, 0x3F800000 + mov [retval], eax + } + return retval; + } + + //! Saturates positive to zero. + inline_ float fsat(float f) + { + udword y = (udword&)f & ~((sdword&)f >>31); + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). + inline_ float frsqrt(float f) + { + float x = f * 0.5f; + udword y = 0x5f3759df - ((udword&)f >> 1); + // Iteration... + (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); + // Result + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. + inline_ float InvSqrt(const float& x) + { + udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; + float y = *(float*)&tmp; + return y * (1.47f - 0.47f * x * y * y); + } + + //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. + //! See http://www.magic-software.com/3DGEDInvSqrt.html + inline_ float RSqrt(float number) + { + long i; + float x2, y; + const float threehalfs = 1.5f; + + x2 = number * 0.5f; + y = number; + i = * (long *) &y; + i = 0x5f3759df - (i >> 1); + y = * (float *) &i; + y = y * (threehalfs - (x2 * y * y)); + + return y; + } + + //! TO BE DOCUMENTED + inline_ float fsqrt(float f) + { + udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; + // Iteration...? + // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; + // Result + return (float&)y; + } + + //! Returns the float ranged espilon value. + inline_ float fepsilon(float f) + { + udword b = (udword&)f & 0xff800000; + udword a = b | 0x00000001; + (float&)a -= (float&)b; + // Result + return (float&)a; + } + + //! Is the float valid ? + inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } + inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } + inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } + inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } + + inline_ bool IsValidFloat(float value) + { + if(IsNAN(value)) return false; + if(IsIndeterminate(value)) return false; + if(IsPlusInf(value)) return false; + if(IsMinusInf(value)) return false; + return true; + } + + #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); + +/* + //! FPU precision setting function. + inline_ void SetFPU() + { + // This function evaluates whether the floating-point + // control word is set to single precision/round to nearest/ + // exceptions disabled. If these conditions don't hold, the + // function changes the control word to set them and returns + // TRUE, putting the old control word value in the passback + // location pointed to by pwOldCW. + { + uword wTemp, wSave; + + __asm fstcw wSave + if (wSave & 0x300 || // Not single mode + 0x3f != (wSave & 0x3f) || // Exceptions enabled + wSave & 0xC00) // Not round to nearest mode + { + __asm + { + mov ax, wSave + and ax, not 300h ;; single mode + or ax, 3fh ;; disable all exceptions + and ax, not 0xC00 ;; round to nearest mode + mov wTemp, ax + fldcw wTemp + } + } + } + } +*/ + //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) + inline_ float ComputeFloatEpsilon() + { + float f = 1.0f; + ((udword&)f)^=1; + return f - 1.0f; // You can check it's the same as FLT_EPSILON + } + + inline_ bool IsFloatZero(float x, float epsilon=1e-6f) + { + return x*x < epsilon; + } + + #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 + #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 + #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 + #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 + + #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 + #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 + #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 + #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 + + #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 + #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 + #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 + #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 + + #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 + #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 + #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 + #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 + + #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 + #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 + #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 + #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 + + #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 + #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 + #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 + #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 + + #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 + #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 + #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 + #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 + + #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 + #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 + #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 + #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 + + //! A global function to find MAX(a,b) using FCOMI/FCMOV + inline_ float FCMax2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MIN(a,b) using FCOMI/FCMOV + inline_ float FCMin2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVNB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MAX(a,b,c) using FCOMI/FCMOV + inline_ float FCMax3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVB_ST1 + FCOMI_ST2 + FCMOVB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + //! A global function to find MIN(a,b,c) using FCOMI/FCMOV + inline_ float FCMin3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVNB_ST1 + FCOMI_ST2 + FCMOVNB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + inline_ int ConvertToSortable(float f) + { + int& Fi = (int&)f; + int Fmask = (Fi>>31); + Fi ^= Fmask; + Fmask &= ~(1<<31); + Fi -= Fmask; + return Fi; + } + + enum FPUMode + { + FPU_FLOOR = 0, + FPU_CEIL = 1, + FPU_BEST = 2, + + FPU_FORCE_DWORD = 0x7fffffff + }; + + FUNCTION ICECORE_API FPUMode GetFPUMode(); + FUNCTION ICECORE_API void SaveFPU(); + FUNCTION ICECORE_API void RestoreFPU(); + FUNCTION ICECORE_API void SetFPUFloorMode(); + FUNCTION ICECORE_API void SetFPUCeilMode(); + FUNCTION ICECORE_API void SetFPUBestMode(); + + FUNCTION ICECORE_API void SetFPUPrecision24(); + FUNCTION ICECORE_API void SetFPUPrecision53(); + FUNCTION ICECORE_API void SetFPUPrecision64(); + FUNCTION ICECORE_API void SetFPURoundingChop(); + FUNCTION ICECORE_API void SetFPURoundingUp(); + FUNCTION ICECORE_API void SetFPURoundingDown(); + FUNCTION ICECORE_API void SetFPURoundingNear(); + + FUNCTION ICECORE_API int intChop(const float& f); + FUNCTION ICECORE_API int intFloor(const float& f); + FUNCTION ICECORE_API int intCeil(const float& f); + +#endif // __ICEFPU_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h b/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h index d845e52fb..c1867dcc6 100644 --- a/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h +++ b/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h @@ -1,121 +1,121 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains all memory macros. - * \file IceMemoryMacros.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEMEMORYMACROS_H__ -#define __ICEMEMORYMACROS_H__ - -#undef ZeroMemory -#undef CopyMemory -#undef MoveMemory -#undef FillMemory - - //! Clears a buffer. - //! \param addr [in] buffer address - //! \param size [in] buffer length - //! \see FillMemory - //! \see StoreDwords - //! \see CopyMemory - //! \see MoveMemory - inline_ void ZeroMemory(void* addr, udword size) { memset(addr, 0, size); } - - //! Fills a buffer with a given byte. - //! \param addr [in] buffer address - //! \param size [in] buffer length - //! \param val [in] the byte value - //! \see StoreDwords - //! \see ZeroMemory - //! \see CopyMemory - //! \see MoveMemory - inline_ void FillMemory(void* dest, udword size, ubyte val) { memset(dest, val, size); } - - //! Fills a buffer with a given dword. - //! \param addr [in] buffer address - //! \param nb [in] number of dwords to write - //! \param value [in] the dword value - //! \see FillMemory - //! \see ZeroMemory - //! \see CopyMemory - //! \see MoveMemory - //! \warning writes nb*4 bytes ! - inline_ void StoreDwords(udword* dest, udword nb, udword value) - { - // The asm code below **SHOULD** be equivalent to one of those C versions - // or the other if your compiled is good: (checked on VC++ 6.0) - // - // 1) while(nb--) *dest++ = value; - // - // 2) for(udword i=0;iRelease(); (x) = null; } //!< Safe D3D-style release - #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } //!< Safe ICE-style release - -#ifdef __ICEERROR_H__ - #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); //!< Standard alloc checking. HANDLE WITH CARE. -#else - #define CHECKALLOC(x) if(!x) return false; -#endif - - //! Standard allocation cycle - #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); - -#endif // __ICEMEMORYMACROS_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains all memory macros. + * \file IceMemoryMacros.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEMEMORYMACROS_H__ +#define __ICEMEMORYMACROS_H__ + +#undef ZeroMemory +#undef CopyMemory +#undef MoveMemory +#undef FillMemory + + //! Clears a buffer. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \see FillMemory + //! \see StoreDwords + //! \see CopyMemory + //! \see MoveMemory + inline_ void ZeroMemory(void* addr, udword size) { memset(addr, 0, size); } + + //! Fills a buffer with a given byte. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \param val [in] the byte value + //! \see StoreDwords + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + inline_ void FillMemory(void* dest, udword size, ubyte val) { memset(dest, val, size); } + + //! Fills a buffer with a given dword. + //! \param addr [in] buffer address + //! \param nb [in] number of dwords to write + //! \param value [in] the dword value + //! \see FillMemory + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + //! \warning writes nb*4 bytes ! + inline_ void StoreDwords(udword* dest, udword nb, udword value) + { + // The asm code below **SHOULD** be equivalent to one of those C versions + // or the other if your compiled is good: (checked on VC++ 6.0) + // + // 1) while(nb--) *dest++ = value; + // + // 2) for(udword i=0;iRelease(); (x) = null; } //!< Safe D3D-style release + #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } //!< Safe ICE-style release + +#ifdef __ICEERROR_H__ + #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); //!< Standard alloc checking. HANDLE WITH CARE. +#else + #define CHECKALLOC(x) if(!x) return false; +#endif + + //! Standard allocation cycle + #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); + +#endif // __ICEMEMORYMACROS_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h b/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h index e3a2d1173..80193437b 100644 --- a/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h +++ b/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h @@ -1,144 +1,144 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains preprocessor stuff. This should be the first included header. - * \file IcePreprocessor.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPREPROCESSOR_H__ -#define __ICEPREPROCESSOR_H__ - - // Check platform - #if defined( _WIN32 ) || defined( WIN32 ) - #pragma message("Compiling on Windows...") - #define PLATFORM_WINDOWS - #else - #pragma message("Compiling on unknown platform...") - #endif - - // Check compiler - #if defined(_MSC_VER) - #pragma message("Compiling with VC++...") - #define COMPILER_VISUAL_CPP - #else - #pragma message("Compiling with unknown compiler...") - #endif - - // Check compiler options. If this file is included in user-apps, this - // shouldn't be needed, so that they can use what they like best. - #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS - #ifdef COMPILER_VISUAL_CPP - #if defined(_CHAR_UNSIGNED) - #endif - - #if defined(_CPPRTTI) - #error Please disable RTTI... - #endif - - #if defined(_CPPUNWIND) - #error Please disable exceptions... - #endif - - #if defined(_MT) - // Multithreading - #endif - #endif - #endif - - // Check debug mode - #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. - #ifndef _DEBUG - #define _DEBUG - #endif - #endif - - #ifdef _DEBUG - // Here you may define items for debug builds - #endif - - #ifndef THIS_FILE - #define THIS_FILE __FILE__ - #endif - - #ifndef ICE_NO_DLL - #ifdef ICECORE_EXPORTS - #define ICECORE_API __declspec(dllexport) - #else - #define ICECORE_API __declspec(dllimport) - #endif - #else - #define ICECORE_API - #endif - - // Don't override new/delete -// #define DEFAULT_NEWDELETE - #define DONT_TRACK_MEMORY_LEAKS - - #define FUNCTION extern "C" - - // Cosmetic stuff [mainly useful with multiple inheritance] - #define override(base_class) virtual - - // Our own inline keyword, so that: - // - we can switch to __forceinline to check it's really better or not - // - we can remove __forceinline if the compiler doesn't support it -// #define inline_ __forceinline -// #define inline_ inline - - // Contributed by Bruce Mitchener - #if defined(COMPILER_VISUAL_CPP) - #define inline_ __forceinline -// #define inline_ inline - #elif defined(__GNUC__) && __GNUC__ < 3 - #define inline_ inline - #elif defined(__GNUC__) - #define inline_ inline __attribute__ ((always_inline)) - #else - #define inline_ inline - #endif - - // Down the hatch - #pragma inline_depth( 255 ) - - #ifdef COMPILER_VISUAL_CPP - #pragma intrinsic(memcmp) - #pragma intrinsic(memcpy) - #pragma intrinsic(memset) - #pragma intrinsic(strcat) - #pragma intrinsic(strcmp) - #pragma intrinsic(strcpy) - #pragma intrinsic(strlen) - #pragma intrinsic(abs) - #pragma intrinsic(labs) - #endif - - // ANSI compliance - #ifdef _DEBUG - // Remove painful warning in debug - inline_ bool __False__(){ return false; } - #define for if(__False__()){} else for - #else - #define for if(0){} else for - #endif - -#endif // __ICEPREPROCESSOR_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains preprocessor stuff. This should be the first included header. + * \file IcePreprocessor.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPREPROCESSOR_H__ +#define __ICEPREPROCESSOR_H__ + + // Check platform + #if defined( _WIN32 ) || defined( WIN32 ) + #pragma message("Compiling on Windows...") + #define PLATFORM_WINDOWS + #else + #pragma message("Compiling on unknown platform...") + #endif + + // Check compiler + #if defined(_MSC_VER) + #pragma message("Compiling with VC++...") + #define COMPILER_VISUAL_CPP + #else + #pragma message("Compiling with unknown compiler...") + #endif + + // Check compiler options. If this file is included in user-apps, this + // shouldn't be needed, so that they can use what they like best. + #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS + #ifdef COMPILER_VISUAL_CPP + #if defined(_CHAR_UNSIGNED) + #endif + + #if defined(_CPPRTTI) + #error Please disable RTTI... + #endif + + #if defined(_CPPUNWIND) + #error Please disable exceptions... + #endif + + #if defined(_MT) + // Multithreading + #endif + #endif + #endif + + // Check debug mode + #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. + #ifndef _DEBUG + #define _DEBUG + #endif + #endif + + #ifdef _DEBUG + // Here you may define items for debug builds + #endif + + #ifndef THIS_FILE + #define THIS_FILE __FILE__ + #endif + + #ifndef ICE_NO_DLL + #ifdef ICECORE_EXPORTS + #define ICECORE_API __declspec(dllexport) + #else + #define ICECORE_API __declspec(dllimport) + #endif + #else + #define ICECORE_API + #endif + + // Don't override new/delete +// #define DEFAULT_NEWDELETE + #define DONT_TRACK_MEMORY_LEAKS + + #define FUNCTION extern "C" + + // Cosmetic stuff [mainly useful with multiple inheritance] + #define override(base_class) virtual + + // Our own inline keyword, so that: + // - we can switch to __forceinline to check it's really better or not + // - we can remove __forceinline if the compiler doesn't support it +// #define inline_ __forceinline +// #define inline_ inline + + // Contributed by Bruce Mitchener + #if defined(COMPILER_VISUAL_CPP) + #define inline_ __forceinline +// #define inline_ inline + #elif defined(__GNUC__) && __GNUC__ < 3 + #define inline_ inline + #elif defined(__GNUC__) + #define inline_ inline __attribute__ ((always_inline)) + #else + #define inline_ inline + #endif + + // Down the hatch + #pragma inline_depth( 255 ) + + #ifdef COMPILER_VISUAL_CPP + #pragma intrinsic(memcmp) + #pragma intrinsic(memcpy) + #pragma intrinsic(memset) + #pragma intrinsic(strcat) + #pragma intrinsic(strcmp) + #pragma intrinsic(strcpy) + #pragma intrinsic(strlen) + #pragma intrinsic(abs) + #pragma intrinsic(labs) + #endif + + // ANSI compliance + #ifdef _DEBUG + // Remove painful warning in debug + inline_ bool __False__(){ return false; } + #define for if(__False__()){} else for + #else + #define for if(0){} else for + #endif + +#endif // __ICEPREPROCESSOR_H__ diff --git a/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp b/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp index 3a77b4a22..15e2468a5 100644 --- a/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp +++ b/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp @@ -1,536 +1,536 @@ -/* - * ICE / OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains source code from the article "Radix Sort Revisited". - * \file IceRevisitedRadix.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Revisited Radix Sort. - * This is my new radix routine: - * - it uses indices and doesn't recopy the values anymore, hence wasting less ram - * - it creates all the histograms in one run instead of four - * - it sorts words faster than dwords and bytes faster than words - * - it correctly sorts negative floating-point values by patching the offsets - * - it automatically takes advantage of temporal coherence - * - multiple keys support is a side effect of temporal coherence - * - it may be worth recoding in asm... (mainly to use FCOMI, FCMOV, etc) [it's probably memory-bound anyway] - * - * History: - * - 08.15.98: very first version - * - 04.04.00: recoded for the radix article - * - 12.xx.00: code lifting - * - 09.18.01: faster CHECK_PASS_VALIDITY thanks to Mark D. Shattuck (who provided other tips, not included here) - * - 10.11.01: added local ram support - * - 01.20.02: bugfix! In very particular cases the last pass was skipped in the float code-path, leading to incorrect sorting...... - * - 01.02.02: - "mIndices" renamed => "mRanks". That's a rank sorter after all. - * - ranks are not "reset" anymore, but implicit on first calls - * - 07.05.02: - offsets rewritten with one less indirection. - * - 11.03.02: - "bool" replaced with RadixHint enum - * - * \class RadixSort - * \author Pierre Terdiman - * \version 1.4 - * \date August, 15, 1998 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* -To do: - - add an offset parameter between two input values (avoid some data recopy sometimes) - - unroll ? asm ? - - 11 bits trick & 3 passes as Michael did - - prefetch stuff the day I have a P3 - - make a version with 16-bits indices ? -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceCore; - -#define INVALIDATE_RANKS mCurrentSize|=0x80000000 -#define VALIDATE_RANKS mCurrentSize&=0x7fffffff -#define CURRENT_SIZE (mCurrentSize&0x7fffffff) -#define INVALID_RANKS (mCurrentSize&0x80000000) - -#define CHECK_RESIZE(n) \ - if(n!=mPreviousSize) \ - { \ - if(n>mCurrentSize) Resize(n); \ - else ResetRanks(); \ - mPreviousSize = n; \ - } - -#define CREATE_HISTOGRAMS(type, buffer) \ - /* Clear counters/histograms */ \ - ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ - \ - /* Prepare to count */ \ - ubyte* p = (ubyte*)input; \ - ubyte* pe = &p[nb*4]; \ - udword* h0= &mHistogram[0]; /* Histogram for first pass (LSB) */ \ - udword* h1= &mHistogram[256]; /* Histogram for second pass */ \ - udword* h2= &mHistogram[512]; /* Histogram for third pass */ \ - udword* h3= &mHistogram[768]; /* Histogram for last pass (MSB) */ \ - \ - bool AlreadySorted = true; /* Optimism... */ \ - \ - if(INVALID_RANKS) \ - { \ - /* Prepare for temporal coherence */ \ - type* Running = (type*)buffer; \ - type PrevVal = *Running; \ - \ - while(p!=pe) \ - { \ - /* Read input buffer in previous sorted order */ \ - type Val = *Running++; \ - /* Check whether already sorted or not */ \ - if(ValCurSize) Resize(nb); - mCurrentSize = nb; - INVALIDATE_RANKS; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main sort routine. - * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. - * \param input [in] a list of integer values to sort - * \param nb [in] number of values to sort, must be < 2^31 - * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) -{ - // Checkings - if(!input || !nb || nb&0x80000000) return *this; - - // Stats - mTotalCalls++; - - // Resize lists if needed - CheckResize(nb); - -#ifdef RADIX_LOCAL_RAM - // Allocate histograms & offsets on the stack - udword mHistogram[256*4]; -// udword mOffset[256]; - udword* mLink[256]; -#endif - - // Create histograms (counters). Counters for all passes are created in one run. - // Pros: read input buffer once instead of four times - // Cons: mHistogram is 4Kb instead of 1Kb - // We must take care of signed/unsigned values for temporal coherence.... I just - // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? - if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } - else { CREATE_HISTOGRAMS(sdword, input); } - - // Compute #negative values involved if needed - udword NbNegativeValues = 0; - if(hint==RADIX_SIGNED) - { - // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 - // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, - // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. - udword* h3= &mHistogram[768]; - for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part - } - - // Radix sort, j is the pass number (0=LSB, 3=MSB) - for(udword j=0;j<4;j++) - { - CHECK_PASS_VALIDITY(j); - - // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is - // not a problem, numbers are correctly sorted anyway. - if(PerformPass) - { - // Should we care about negative values? - if(j!=3 || hint==RADIX_UNSIGNED) - { - // Here we deal with positive values only - - // Create offsets -// mOffset[0] = 0; -// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; - mLink[0] = mRanks2; - for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - } - else - { - // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. - - // Create biased offsets, in order for negative numbers to be sorted as well -// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones - mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones -// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers - for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers - - // Fixing the wrong place for negative values -// mOffset[128] = 0; - mLink[128] = mRanks2; -// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; - for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - } - - // Perform Radix Sort - ubyte* InputBytes = (ubyte*)input; - InputBytes += j; - if(INVALID_RANKS) - { -// for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). - // ### cmp to be killed. Not good. Later. -// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above -// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order - if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above - else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order - } - VALIDATE_RANKS; - } - else - { - for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). - // ### cmp to be killed. Not good. Later. -// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above -// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order - if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above - else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order - } - } - // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. - udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp; - } - else - { - // The pass is useless, yet we still have to reverse the order of current list if all values are negative. - if(UniqueVal>=128) - { - if(INVALID_RANKS) - { - // ###Possible? - for(udword i=0;i "mRanks". That's a rank sorter after all. + * - ranks are not "reset" anymore, but implicit on first calls + * - 07.05.02: - offsets rewritten with one less indirection. + * - 11.03.02: - "bool" replaced with RadixHint enum + * + * \class RadixSort + * \author Pierre Terdiman + * \version 1.4 + * \date August, 15, 1998 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* +To do: + - add an offset parameter between two input values (avoid some data recopy sometimes) + - unroll ? asm ? + - 11 bits trick & 3 passes as Michael did + - prefetch stuff the day I have a P3 + - make a version with 16-bits indices ? +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace IceCore; + +#define INVALIDATE_RANKS mCurrentSize|=0x80000000 +#define VALIDATE_RANKS mCurrentSize&=0x7fffffff +#define CURRENT_SIZE (mCurrentSize&0x7fffffff) +#define INVALID_RANKS (mCurrentSize&0x80000000) + +#define CHECK_RESIZE(n) \ + if(n!=mPreviousSize) \ + { \ + if(n>mCurrentSize) Resize(n); \ + else ResetRanks(); \ + mPreviousSize = n; \ + } + +#define CREATE_HISTOGRAMS(type, buffer) \ + /* Clear counters/histograms */ \ + ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ + \ + /* Prepare to count */ \ + ubyte* p = (ubyte*)input; \ + ubyte* pe = &p[nb*4]; \ + udword* h0= &mHistogram[0]; /* Histogram for first pass (LSB) */ \ + udword* h1= &mHistogram[256]; /* Histogram for second pass */ \ + udword* h2= &mHistogram[512]; /* Histogram for third pass */ \ + udword* h3= &mHistogram[768]; /* Histogram for last pass (MSB) */ \ + \ + bool AlreadySorted = true; /* Optimism... */ \ + \ + if(INVALID_RANKS) \ + { \ + /* Prepare for temporal coherence */ \ + type* Running = (type*)buffer; \ + type PrevVal = *Running; \ + \ + while(p!=pe) \ + { \ + /* Read input buffer in previous sorted order */ \ + type Val = *Running++; \ + /* Check whether already sorted or not */ \ + if(ValCurSize) Resize(nb); + mCurrentSize = nb; + INVALIDATE_RANKS; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main sort routine. + * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. + * \param input [in] a list of integer values to sort + * \param nb [in] number of values to sort, must be < 2^31 + * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) +{ + // Checkings + if(!input || !nb || nb&0x80000000) return *this; + + // Stats + mTotalCalls++; + + // Resize lists if needed + CheckResize(nb); + +#ifdef RADIX_LOCAL_RAM + // Allocate histograms & offsets on the stack + udword mHistogram[256*4]; +// udword mOffset[256]; + udword* mLink[256]; +#endif + + // Create histograms (counters). Counters for all passes are created in one run. + // Pros: read input buffer once instead of four times + // Cons: mHistogram is 4Kb instead of 1Kb + // We must take care of signed/unsigned values for temporal coherence.... I just + // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? + if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } + else { CREATE_HISTOGRAMS(sdword, input); } + + // Compute #negative values involved if needed + udword NbNegativeValues = 0; + if(hint==RADIX_SIGNED) + { + // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 + // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, + // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. + udword* h3= &mHistogram[768]; + for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part + } + + // Radix sort, j is the pass number (0=LSB, 3=MSB) + for(udword j=0;j<4;j++) + { + CHECK_PASS_VALIDITY(j); + + // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is + // not a problem, numbers are correctly sorted anyway. + if(PerformPass) + { + // Should we care about negative values? + if(j!=3 || hint==RADIX_UNSIGNED) + { + // Here we deal with positive values only + + // Create offsets +// mOffset[0] = 0; +// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + mLink[0] = mRanks2; + for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + } + else + { + // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. + + // Create biased offsets, in order for negative numbers to be sorted as well +// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones + mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones +// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + + // Fixing the wrong place for negative values +// mOffset[128] = 0; + mLink[128] = mRanks2; +// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + } + + // Perform Radix Sort + ubyte* InputBytes = (ubyte*)input; + InputBytes += j; + if(INVALID_RANKS) + { +// for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above + else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order + } + VALIDATE_RANKS; + } + else + { + for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above + else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order + } + } + // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. + udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp; + } + else + { + // The pass is useless, yet we still have to reverse the order of current list if all values are negative. + if(UniqueVal>=128) + { + if(INVALID_RANKS) + { + // ###Possible? + for(udword i=0;i (b) ? (a) : (b)) //!< Returns the max value between a and b - #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c - - template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } - template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } - template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } - template inline_ void TSetMax (T& a, const T& b) { if(a (b) ? (a) : (b)) //!< Returns the max value between a and b + #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c + + template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } + template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } + template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } + template inline_ void TSetMax (T& a, const T& b) { if(a> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); - n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); - n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); - n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); - n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); - // Etc for larger intergers (64 bits in Java) - // NOTE: the >> operation must be unsigned! (>>> in java) - } - - //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) - inline_ udword CountBits(udword n) - { - // This relies of the fact that the count of n bits can NOT overflow - // an n bit interger. EG: 1 bit count takes a 1 bit interger, 2 bit counts - // 2 bit interger, 3 bit count requires only a 2 bit interger. - // So we add all bit pairs, then each nible, then each byte etc... - n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); - n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); - n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); - n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); - n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); - // Etc for larger intergers (64 bits in Java) - // NOTE: the >> operation must be unsigned! (>>> in java) - return n; - } - - //! Even faster? - inline_ udword CountBits2(udword bits) - { - bits = bits - ((bits >> 1) & 0x55555555); - bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); - bits = ((bits >> 4) + bits) & 0x0F0F0F0F; - return (bits * 0x01010101) >> 24; - } - - //! Spread out bits. EG 00001111 -> 0101010101 - //! 00001010 -> 0100010000 - //! This is used to interleve to intergers to produce a `Morten Key' - //! used in Space Filling Curves (See DrDobbs Journal, July 1999) - //! Order is important. - inline_ void SpreadBits(udword& n) - { - n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); - n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); - n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); - n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); - n = ( n & 0x11111111) | (( n & 0x22222222) << 1); - } - - // Next Largest Power of 2 - // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm - // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with - // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next - // largest power of 2. For a 32-bit value: - inline_ udword nlpo2(udword x) - { - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x+1; - } - - //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) - inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } - - //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) - inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } - - //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) - inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } - - //!< Alternative min function - inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } - - // Determine if one of the bytes in a 4 byte word is zero - inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } - - // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 - inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } -// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } - - // Most Significant 1 Bit - // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) - // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. - // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. - // Bitwise AND of the original value with the complement of the "folded" value shifted down by one - // yields the most significant bit. For a 32-bit value: - inline_ udword msb32(udword x) - { - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return (x & ~(x >> 1)); - } - - /* - "Just call it repeatedly with various input values and always with the same variable as "memory". - The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 - does no filtering at all. - - I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed - to the more typical FIR (Finite Impulse Response). - - Also, I'd say that you can make more intelligent and interesting filters than this, for example filters - that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter - to be applied before this one, of course." - - (JCAB on Flipcode) - */ - inline_ float FeedbackFilter(float val, float& memory, float sharpness) - { - ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); - if(sharpness<0.0f) sharpness = 0.0f; - else if(sharpness>1.0f) sharpness = 1.0f; - return memory = val * sharpness + memory * (1.0f - sharpness); - } - - //! If you can guarantee that your input domain (i.e. value of x) is slightly - //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the - //! following code to clamp the resulting value into [-32768,+32767] range: - inline_ int ClampToInt16(int x) - { -// ASSERT(abs(x) < (int)((1<<31u)-32767)); - - int delta = 32767 - x; - x += (delta>>31) & delta; - delta = x + 32768; - x -= (delta>>31) & delta; - return x; - } - - // Generic functions - template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } - template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } - - template inline_ void TSort(Type& a, Type& b) - { - if(a>b) TSwap(a, b); - } - - template inline_ void TSort(Type& a, Type& b, Type& c) - { - if(a>b) TSwap(a, b); - if(b>c) TSwap(b, c); - if(a>b) TSwap(a, b); - if(b>c) TSwap(b, c); - } - - // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) -// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } - // ... actually this is better ! - #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); - - //! TO BE DOCUMENTED - #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) - //! TO BE DOCUMENTED - #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns the alignment of the input address. - * \fn Alignment() - * \param address [in] address to check - * \return the best alignment (e.g. 1 for odd addresses, etc) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - FUNCTION ICECORE_API udword Alignment(udword address); - - #define IS_ALIGNED_2(x) ((x&1)==0) - #define IS_ALIGNED_4(x) ((x&3)==0) - #define IS_ALIGNED_8(x) ((x&7)==0) - - inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } - - // Compute implicit coords from an index: - // The idea is to get back 2D coords from a 1D index. - // For example: - // - // 0 1 2 ... nbu-1 - // nbu nbu+1 i ... - // - // We have i, we're looking for the equivalent (u=2, v=1) location. - // i = u + v*nbu - // <=> i/nbu = u/nbu + v - // Since 0 <= u < nbu, u/nbu = 0 (integer) - // Hence: v = i/nbu - // Then we simply put it back in the original equation to compute u = i - v*nbu - inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) - { - v = i / nbu; - u = i - (v * nbu); - } - - // In 3D: i = u + v*nbu + w*nbu*nbv - // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w - // u/(nbu*nbv) is null since u/nbu was null already. - // v/nbv is null as well for the same reason. - // Hence w = i/(nbu*nbv) - // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu - inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) - { - w = i / (nbu_nbv); - Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); - } - -#endif // __ICEUTILS_H__ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains misc. useful macros & defines. + * \file IceUtils.h + * \author Pierre Terdiman (collected from various sources) + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEUTILS_H__ +#define __ICEUTILS_H__ + + #define START_RUNONCE { static bool __RunOnce__ = false; if(!__RunOnce__){ + #define END_RUNONCE __RunOnce__ = true;}} + + //! Reverse all the bits in a 32 bit word (from Steve Baker's Cute Code Collection) + //! (each line can be done in any order. + inline_ void ReverseBits(udword& n) + { + n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); + n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); + n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); + n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); + n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); + // Etc for larger intergers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + } + + //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) + inline_ udword CountBits(udword n) + { + // This relies of the fact that the count of n bits can NOT overflow + // an n bit interger. EG: 1 bit count takes a 1 bit interger, 2 bit counts + // 2 bit interger, 3 bit count requires only a 2 bit interger. + // So we add all bit pairs, then each nible, then each byte etc... + n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); + n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); + n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); + n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); + n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); + // Etc for larger intergers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + return n; + } + + //! Even faster? + inline_ udword CountBits2(udword bits) + { + bits = bits - ((bits >> 1) & 0x55555555); + bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); + bits = ((bits >> 4) + bits) & 0x0F0F0F0F; + return (bits * 0x01010101) >> 24; + } + + //! Spread out bits. EG 00001111 -> 0101010101 + //! 00001010 -> 0100010000 + //! This is used to interleve to intergers to produce a `Morten Key' + //! used in Space Filling Curves (See DrDobbs Journal, July 1999) + //! Order is important. + inline_ void SpreadBits(udword& n) + { + n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); + n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); + n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); + n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); + n = ( n & 0x11111111) | (( n & 0x22222222) << 1); + } + + // Next Largest Power of 2 + // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm + // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with + // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next + // largest power of 2. For a 32-bit value: + inline_ udword nlpo2(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x+1; + } + + //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) + inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } + + //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) + inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } + + //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) + inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } + + //!< Alternative min function + inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } + + // Determine if one of the bytes in a 4 byte word is zero + inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } + + // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 + inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } +// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } + + // Most Significant 1 Bit + // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) + // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. + // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. + // Bitwise AND of the original value with the complement of the "folded" value shifted down by one + // yields the most significant bit. For a 32-bit value: + inline_ udword msb32(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return (x & ~(x >> 1)); + } + + /* + "Just call it repeatedly with various input values and always with the same variable as "memory". + The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 + does no filtering at all. + + I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed + to the more typical FIR (Finite Impulse Response). + + Also, I'd say that you can make more intelligent and interesting filters than this, for example filters + that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter + to be applied before this one, of course." + + (JCAB on Flipcode) + */ + inline_ float FeedbackFilter(float val, float& memory, float sharpness) + { + ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); + if(sharpness<0.0f) sharpness = 0.0f; + else if(sharpness>1.0f) sharpness = 1.0f; + return memory = val * sharpness + memory * (1.0f - sharpness); + } + + //! If you can guarantee that your input domain (i.e. value of x) is slightly + //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the + //! following code to clamp the resulting value into [-32768,+32767] range: + inline_ int ClampToInt16(int x) + { +// ASSERT(abs(x) < (int)((1<<31u)-32767)); + + int delta = 32767 - x; + x += (delta>>31) & delta; + delta = x + 32768; + x -= (delta>>31) & delta; + return x; + } + + // Generic functions + template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } + template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } + + template inline_ void TSort(Type& a, Type& b) + { + if(a>b) TSwap(a, b); + } + + template inline_ void TSort(Type& a, Type& b, Type& c) + { + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + } + + // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) +// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } + // ... actually this is better ! + #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); + + //! TO BE DOCUMENTED + #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) + //! TO BE DOCUMENTED + #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns the alignment of the input address. + * \fn Alignment() + * \param address [in] address to check + * \return the best alignment (e.g. 1 for odd addresses, etc) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + FUNCTION ICECORE_API udword Alignment(udword address); + + #define IS_ALIGNED_2(x) ((x&1)==0) + #define IS_ALIGNED_4(x) ((x&3)==0) + #define IS_ALIGNED_8(x) ((x&7)==0) + + inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } + + // Compute implicit coords from an index: + // The idea is to get back 2D coords from a 1D index. + // For example: + // + // 0 1 2 ... nbu-1 + // nbu nbu+1 i ... + // + // We have i, we're looking for the equivalent (u=2, v=1) location. + // i = u + v*nbu + // <=> i/nbu = u/nbu + v + // Since 0 <= u < nbu, u/nbu = 0 (integer) + // Hence: v = i/nbu + // Then we simply put it back in the original equation to compute u = i - v*nbu + inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) + { + v = i / nbu; + u = i - (v * nbu); + } + + // In 3D: i = u + v*nbu + w*nbu*nbv + // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w + // u/(nbu*nbv) is null since u/nbu was null already. + // v/nbv is null as well for the same reason. + // Hence w = i/(nbu*nbv) + // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu + inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) + { + w = i / (nbu_nbv); + Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); + } + +#endif // __ICEUTILS_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp b/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp index c06e10331..568fd6b6d 100644 --- a/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp @@ -1,705 +1,705 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an AABB collider. - * \file OPC_AABBCollider.cpp - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an AABB-vs-tree collider. - * - * \class AABBCollider - * \author Pierre Terdiman - * \version 1.3 - * \date January, 1st, 2002 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_BoxBoxOverlap.h" -#include "OPC_TriBoxOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - /* Set contact status */ \ - mFlags |= flag; \ - mTouchedPrimitives->Add(prim_index); - -//! AABB-triangle test -#define AABB_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index);\ - mLeafVerts[0] = *VP.Vertex[0]; \ - mLeafVerts[1] = *VP.Vertex[1]; \ - mLeafVerts[2] = *VP.Vertex[2]; \ - /* Perform triangle-box overlap test */ \ - if(TriBoxOverlap()) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollider::AABBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollider::~AABBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision AABB in world space - * \param model [in] Opcode model to collide with - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const Model& model) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - check temporal coherence - * - * \param cache [in/out] a box cache - * \param box [in] AABB in world space - * \return TRUE if we can return immediately - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL AABBCollider::InitQuery(AABBCache& cache, const CollisionAABB& box) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Keep track of the query box - mBox = box; - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the box (and set contact status if needed) - AABB_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence : - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the box (and set contact status if needed) - AABB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): - if(IsCacheValid(cache) && mBox.IsInside(cache.FatBox)) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat box so that coherence will work for subsequent frames - mBox.mExtents *= cache.FatCoeff; - - // Update cache with query data (signature for cached faces) - cache.FatBox = mBox; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - // 5) Precompute min & max bounds if needed - mMin = box.mCenter - box.mExtents; - mMax = box.mCenter + box.mExtents; - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for vanilla AABB trees. - * \param cache [in/out] a box cache - * \param box [in] collision AABB in world space - * \param tree [in] AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree) -{ - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - if(InitQuery(cache, box)) return true; - - // Perform collision query - _Collide(tree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the AABB completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the AABB contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBCollider::AABBContainsBox(const Point& bc, const Point& be) -{ - if(mMin.x > bc.x - be.x) return FALSE; - if(mMin.y > bc.y - be.y) return FALSE; - if(mMin.z > bc.z - be.z) return FALSE; - - if(mMax.x < bc.x + be.x) return FALSE; - if(mMax.y < bc.y + be.y) return FALSE; - if(mMax.z < bc.z + be.z) return FALSE; - - return TRUE; -} - -#define TEST_BOX_IN_AABB(center, extents) \ - if(AABBContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->IsLeaf()) - { - AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for vanilla AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBTreeNode* node) -{ - // Perform AABB-AABB overlap test - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!AABBAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf() || AABBContainsBox(Center, Extents)) - { - mFlags |= OPC_CONTACT; - mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _Collide(node->GetPos()); - _Collide(node->GetNeg()); - } -} - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridAABBCollider::HybridAABBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridAABBCollider::~HybridAABBCollider() -{ -} - -bool HybridAABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - AABB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - AABB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an AABB collider. + * \file OPC_AABBCollider.cpp + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an AABB-vs-tree collider. + * + * \class AABBCollider + * \author Pierre Terdiman + * \version 1.3 + * \date January, 1st, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_BoxBoxOverlap.h" +#include "OPC_TriBoxOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! AABB-triangle test +#define AABB_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index);\ + mLeafVerts[0] = *VP.Vertex[0]; \ + mLeafVerts[1] = *VP.Vertex[1]; \ + mLeafVerts[2] = *VP.Vertex[2]; \ + /* Perform triangle-box overlap test */ \ + if(TriBoxOverlap()) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollider::AABBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollider::~AABBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision AABB in world space + * \param model [in] Opcode model to collide with + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const Model& model) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - check temporal coherence + * + * \param cache [in/out] a box cache + * \param box [in] AABB in world space + * \return TRUE if we can return immediately + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL AABBCollider::InitQuery(AABBCache& cache, const CollisionAABB& box) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Keep track of the query box + mBox = box; + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the box (and set contact status if needed) + AABB_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence : + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the box (and set contact status if needed) + AABB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): + if(IsCacheValid(cache) && mBox.IsInside(cache.FatBox)) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat box so that coherence will work for subsequent frames + mBox.mExtents *= cache.FatCoeff; + + // Update cache with query data (signature for cached faces) + cache.FatBox = mBox; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + // 5) Precompute min & max bounds if needed + mMin = box.mCenter - box.mExtents; + mMax = box.mCenter + box.mExtents; + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for vanilla AABB trees. + * \param cache [in/out] a box cache + * \param box [in] collision AABB in world space + * \param tree [in] AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree) +{ + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + if(InitQuery(cache, box)) return true; + + // Perform collision query + _Collide(tree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the AABB completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the AABB contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBCollider::AABBContainsBox(const Point& bc, const Point& be) +{ + if(mMin.x > bc.x - be.x) return FALSE; + if(mMin.y > bc.y - be.y) return FALSE; + if(mMin.z > bc.z - be.z) return FALSE; + + if(mMax.x < bc.x + be.x) return FALSE; + if(mMax.y < bc.y + be.y) return FALSE; + if(mMax.z < bc.z + be.z) return FALSE; + + return TRUE; +} + +#define TEST_BOX_IN_AABB(center, extents) \ + if(AABBContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->IsLeaf()) + { + AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for vanilla AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBTreeNode* node) +{ + // Perform AABB-AABB overlap test + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!AABBAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf() || AABBContainsBox(Center, Extents)) + { + mFlags |= OPC_CONTACT; + mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _Collide(node->GetPos()); + _Collide(node->GetNeg()); + } +} + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridAABBCollider::HybridAABBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridAABBCollider::~HybridAABBCollider() +{ +} + +bool HybridAABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + AABB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + AABB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h b/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h index 370b811dd..ca8aee984 100644 --- a/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h @@ -1,106 +1,106 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an AABB collider. - * \file OPC_AABBCollider.h - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_AABBCOLLIDER_H__ -#define __OPC_AABBCOLLIDER_H__ - - struct OPCODE_API AABBCache : VolumeCache - { - AABBCache() : FatCoeff(1.1f) - { - FatBox.mCenter.Zero(); - FatBox.mExtents.Zero(); - } - - // Cached faces signature - CollisionAABB FatBox; //!< Box used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere - }; - - class OPCODE_API AABBCollider : public VolumeCollider - { - public: - // Constructor / Destructor - AABBCollider(); - virtual ~AABBCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision AABB in world space - * \param model [in] Opcode model to collide with - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(AABBCache& cache, const CollisionAABB& box, const Model& model); - // - bool Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree); - protected: - CollisionAABB mBox; //!< Query box in (center, extents) form - Point mMin; //!< Query box min point - Point mMax; //!< Query box max point - // Leaf description - Point mLeafVerts[3]; //!< Triangle vertices - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _Collide(const AABBTreeNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL AABBContainsBox(const Point& bc, const Point& be); - inline_ BOOL AABBAABBOverlap(const Point& b, const Point& Pb); - inline_ BOOL TriBoxOverlap(); - // Init methods - BOOL InitQuery(AABBCache& cache, const CollisionAABB& box); - }; - - class OPCODE_API HybridAABBCollider : public AABBCollider - { - public: - // Constructor / Destructor - HybridAABBCollider(); - virtual ~HybridAABBCollider(); - - bool Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_AABBCOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an AABB collider. + * \file OPC_AABBCollider.h + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_AABBCOLLIDER_H__ +#define __OPC_AABBCOLLIDER_H__ + + struct OPCODE_API AABBCache : VolumeCache + { + AABBCache() : FatCoeff(1.1f) + { + FatBox.mCenter.Zero(); + FatBox.mExtents.Zero(); + } + + // Cached faces signature + CollisionAABB FatBox; //!< Box used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere + }; + + class OPCODE_API AABBCollider : public VolumeCollider + { + public: + // Constructor / Destructor + AABBCollider(); + virtual ~AABBCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision AABB in world space + * \param model [in] Opcode model to collide with + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(AABBCache& cache, const CollisionAABB& box, const Model& model); + // + bool Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree); + protected: + CollisionAABB mBox; //!< Query box in (center, extents) form + Point mMin; //!< Query box min point + Point mMax; //!< Query box max point + // Leaf description + Point mLeafVerts[3]; //!< Triangle vertices + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _Collide(const AABBTreeNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL AABBContainsBox(const Point& bc, const Point& be); + inline_ BOOL AABBAABBOverlap(const Point& b, const Point& Pb); + inline_ BOOL TriBoxOverlap(); + // Init methods + BOOL InitQuery(AABBCache& cache, const CollisionAABB& box); + }; + + class OPCODE_API HybridAABBCollider : public AABBCollider + { + public: + // Constructor / Destructor + HybridAABBCollider(); + virtual ~HybridAABBCollider(); + + bool Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_AABBCOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp b/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp index 0bc878969..bb692bb7d 100644 --- a/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp @@ -1,582 +1,582 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a versatile AABB tree. - * \file OPC_AABBTree.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a generic AABB tree node. - * - * \class AABBTreeNode - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a generic AABB tree. - * This is a vanilla AABB tree, without any particular optimization. It contains anonymous references to - * user-provided primitives, which can theoretically be anything - triangles, boxes, etc. Each primitive - * is surrounded by an AABB, regardless of the primitive's nature. When the primitive is a triangle, the - * resulting tree can be converted into an optimized tree. If the primitive is a box, the resulting tree - * can be used for culling - VFC or occlusion -, assuming you cull on a mesh-by-mesh basis (modern way). - * - * \class AABBTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTreeNode::AABBTreeNode() : - mPos (null), -#ifndef OPC_NO_NEG_VANILLA_TREE - mNeg (null), -#endif - mNbPrimitives (0), - mNodePrimitives (null) -{ -#ifdef OPC_USE_TREE_COHERENCE - mBitmask = 0; -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTreeNode::~AABBTreeNode() -{ - // Opcode 1.3: - const AABBTreeNode* Pos = GetPos(); - const AABBTreeNode* Neg = GetNeg(); -#ifndef OPC_NO_NEG_VANILLA_TREE - if(!(mPos&1)) DELETESINGLE(Pos); - if(!(mNeg&1)) DELETESINGLE(Neg); -#else - if(!(mPos&1)) DELETEARRAY(Pos); -#endif - mNodePrimitives = null; // This was just a shortcut to the global list => no release - mNbPrimitives = 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Splits the node along a given axis. - * The list of indices is reorganized according to the split values. - * \param axis [in] splitting axis index - * \param builder [in] the tree builder - * \return the number of primitives assigned to the first child - * \warning this method reorganizes the internal list of primitives - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTreeNode::Split(udword axis, AABBTreeBuilder* builder) -{ - // Get node split value - float SplitValue = builder->GetSplittingValue(mNodePrimitives, mNbPrimitives, mBV, axis); - - udword NbPos = 0; - // Loop through all node-related primitives. Their indices range from mNodePrimitives[0] to mNodePrimitives[mNbPrimitives-1]. - // Those indices map the global list in the tree builder. - for(udword i=0;iGetSplittingValue(Index, axis); - - // Reorganize the list of indices in this order: positive - negative. - if(PrimitiveValue > SplitValue) - { - // Swap entries - udword Tmp = mNodePrimitives[i]; - mNodePrimitives[i] = mNodePrimitives[NbPos]; - mNodePrimitives[NbPos] = Tmp; - // Count primitives assigned to positive space - NbPos++; - } - } - return NbPos; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Subdivides the node. - * - * N - * / \ - * / \ - * N/2 N/2 - * / \ / \ - * N/4 N/4 N/4 N/4 - * (etc) - * - * A well-balanced tree should have a O(log n) depth. - * A degenerate tree would have a O(n) depth. - * Note a perfectly-balanced tree is not well-suited to collision detection anyway. - * - * \param builder [in] the tree builder - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeNode::Subdivide(AABBTreeBuilder* builder) -{ - // Checkings - if(!builder) return false; - - // Stop subdividing if we reach a leaf node. This is always performed here, - // else we could end in trouble if user overrides this. - if(mNbPrimitives==1) return true; - - // Let the user validate the subdivision - if(!builder->ValidateSubdivision(mNodePrimitives, mNbPrimitives, mBV)) return true; - - bool ValidSplit = true; // Optimism... - udword NbPos; - if(builder->mSettings.mRules & SPLIT_LARGEST_AXIS) - { - // Find the largest axis to split along - Point Extents; mBV.GetExtents(Extents); // Box extents - udword Axis = Extents.LargestAxis(); // Index of largest axis - - // Split along the axis - NbPos = Split(Axis, builder); - - // Check split validity - if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; - } - else if(builder->mSettings.mRules & SPLIT_SPLATTER_POINTS) - { - // Compute the means - Point Means(0.0f, 0.0f, 0.0f); - for(udword i=0;iGetSplittingValue(Index, 0); - Means.y+=builder->GetSplittingValue(Index, 1); - Means.z+=builder->GetSplittingValue(Index, 2); - } - Means/=float(mNbPrimitives); - - // Compute variances - Point Vars(0.0f, 0.0f, 0.0f); - for(udword i=0;iGetSplittingValue(Index, 0); - float Cy = builder->GetSplittingValue(Index, 1); - float Cz = builder->GetSplittingValue(Index, 2); - Vars.x += (Cx - Means.x)*(Cx - Means.x); - Vars.y += (Cy - Means.y)*(Cy - Means.y); - Vars.z += (Cz - Means.z)*(Cz - Means.z); - } - Vars/=float(mNbPrimitives-1); - - // Choose axis with greatest variance - udword Axis = Vars.LargestAxis(); - - // Split along the axis - NbPos = Split(Axis, builder); - - // Check split validity - if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; - } - else if(builder->mSettings.mRules & SPLIT_BALANCED) - { - // Test 3 axis, take the best - float Results[3]; - NbPos = Split(0, builder); Results[0] = float(NbPos)/float(mNbPrimitives); - NbPos = Split(1, builder); Results[1] = float(NbPos)/float(mNbPrimitives); - NbPos = Split(2, builder); Results[2] = float(NbPos)/float(mNbPrimitives); - Results[0]-=0.5f; Results[0]*=Results[0]; - Results[1]-=0.5f; Results[1]*=Results[1]; - Results[2]-=0.5f; Results[2]*=Results[2]; - udword Min=0; - if(Results[1]mSettings.mRules & SPLIT_BEST_AXIS) - { - // Test largest, then middle, then smallest axis... - - // Sort axis - Point Extents; mBV.GetExtents(Extents); // Box extents - udword SortedAxis[] = { 0, 1, 2 }; - float* Keys = (float*)&Extents.x; - for(udword j=0;j<3;j++) - { - for(udword i=0;i<2;i++) - { - if(Keys[SortedAxis[i]]mSettings.mRules & SPLIT_FIFTY) - { - // Don't even bother splitting (mainly a performance test) - NbPos = mNbPrimitives>>1; - } - else return false; // Unknown splitting rules - - // Check the subdivision has been successful - if(!ValidSplit) - { - // Here, all boxes lie in the same sub-space. Two strategies: - // - if the tree *must* be complete, make an arbitrary 50-50 split - // - else stop subdividing -// if(builder->mSettings.mRules&SPLIT_COMPLETE) - if(builder->mSettings.mLimit==1) - { - builder->IncreaseNbInvalidSplits(); - NbPos = mNbPrimitives>>1; - } - else return true; - } - - // Now create children and assign their pointers. - if(builder->mNodeBase) - { - // We use a pre-allocated linear pool for complete trees [Opcode 1.3] - AABBTreeNode* Pool = (AABBTreeNode*)builder->mNodeBase; - udword Count = builder->GetCount() - 1; // Count begins to 1... - // Set last bit to tell it shouldn't be freed ### pretty ugly, find a better way. Maybe one bit in mNbPrimitives - ASSERT(!(udword(&Pool[Count+0])&1)); - ASSERT(!(udword(&Pool[Count+1])&1)); - mPos = udword(&Pool[Count+0])|1; -#ifndef OPC_NO_NEG_VANILLA_TREE - mNeg = udword(&Pool[Count+1])|1; -#endif - } - else - { - // Non-complete trees and/or Opcode 1.2 allocate nodes on-the-fly -#ifndef OPC_NO_NEG_VANILLA_TREE - mPos = (udword)new AABBTreeNode; CHECKALLOC(mPos); - mNeg = (udword)new AABBTreeNode; CHECKALLOC(mNeg); -#else - AABBTreeNode* PosNeg = new AABBTreeNode[2]; - CHECKALLOC(PosNeg); - mPos = (udword)PosNeg; -#endif - } - - // Update stats - builder->IncreaseCount(2); - - // Assign children - AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); - AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); - Pos->mNodePrimitives = &mNodePrimitives[0]; - Pos->mNbPrimitives = NbPos; - Neg->mNodePrimitives = &mNodePrimitives[NbPos]; - Neg->mNbPrimitives = mNbPrimitives - NbPos; - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive hierarchy building in a top-down fashion. - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeNode::_BuildHierarchy(AABBTreeBuilder* builder) -{ - // 1) Compute the global box for current node. The box is stored in mBV. - builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); - - // 2) Subdivide current node - Subdivide(builder); - - // 3) Recurse - AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); - AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); - if(Pos) Pos->_BuildHierarchy(builder); - if(Neg) Neg->_BuildHierarchy(builder); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the tree (top-down). - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeNode::_Refit(AABBTreeBuilder* builder) -{ - // 1) Recompute the new global box for current node - builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); - - // 2) Recurse - AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); - AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); - if(Pos) Pos->_Refit(builder); - if(Neg) Neg->_Refit(builder); -} - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTree::AABBTree() : mIndices(null), mTotalNbNodes(0), mPool(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTree::~AABBTree() -{ - Release(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Releases the tree. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTree::Release() -{ - DELETEARRAY(mPool); - DELETEARRAY(mIndices); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds a generic AABB tree from a tree builder. - * \param builder [in] the tree builder - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::Build(AABBTreeBuilder* builder) -{ - // Checkings - if(!builder || !builder->mNbPrimitives) return false; - - // Release previous tree - Release(); - - // Init stats - builder->SetCount(1); - builder->SetNbInvalidSplits(0); - - // Initialize indices. This list will be modified during build. - mIndices = new udword[builder->mNbPrimitives]; - CHECKALLOC(mIndices); - // Identity permutation - for(udword i=0;imNbPrimitives;i++) mIndices[i] = i; - - // Setup initial node. Here we have a complete permutation of the app's primitives. - mNodePrimitives = mIndices; - mNbPrimitives = builder->mNbPrimitives; - - // Use a linear array for complete trees (since we can predict the final number of nodes) [Opcode 1.3] -// if(builder->mRules&SPLIT_COMPLETE) - if(builder->mSettings.mLimit==1) - { - // Allocate a pool of nodes - mPool = new AABBTreeNode[builder->mNbPrimitives*2 - 1]; - - builder->mNodeBase = mPool; // ### ugly ! - } - - // Build the hierarchy - _BuildHierarchy(builder); - - // Get back total number of nodes - mTotalNbNodes = builder->GetCount(); - - // For complete trees, check the correct number of nodes has been created [Opcode 1.3] - if(mPool) ASSERT(mTotalNbNodes==builder->mNbPrimitives*2 - 1); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the depth of the tree. - * A well-balanced tree should have a log(n) depth. A degenerate tree O(n) depth. - * \return depth of the tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTree::ComputeDepth() const -{ - return Walk(null, null); // Use the walking code without callback -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Walks the tree, calling the user back for each node. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTree::Walk(WalkingCallback callback, void* user_data) const -{ - // Call it without callback to compute max depth - udword MaxDepth = 0; - udword CurrentDepth = 0; - - struct Local - { - static void _Walk(const AABBTreeNode* current_node, udword& max_depth, udword& current_depth, WalkingCallback callback, void* user_data) - { - // Checkings - if(!current_node) return; - // Entering a new node => increase depth - current_depth++; - // Keep track of max depth - if(current_depth>max_depth) max_depth = current_depth; - - // Callback - if(callback && !(callback)(current_node, current_depth, user_data)) return; - - // Recurse - if(current_node->GetPos()) { _Walk(current_node->GetPos(), max_depth, current_depth, callback, user_data); current_depth--; } - if(current_node->GetNeg()) { _Walk(current_node->GetNeg(), max_depth, current_depth, callback, user_data); current_depth--; } - } - }; - Local::_Walk(this, MaxDepth, CurrentDepth, callback, user_data); - return MaxDepth; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the tree in a top-down way. - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::Refit(AABBTreeBuilder* builder) -{ - if(!builder) return false; - _Refit(builder); - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the tree in a bottom-up way. - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::Refit2(AABBTreeBuilder* builder) -{ - // Checkings - if(!builder) return false; - - ASSERT(mPool); - - // Bottom-up update - Point Min,Max; - Point Min_,Max_; - udword Index = mTotalNbNodes; - while(Index--) - { - AABBTreeNode& Current = mPool[Index]; - - if(Current.IsLeaf()) - { - builder->ComputeGlobalBox(Current.GetPrimitives(), Current.GetNbPrimitives(), *(AABB*)Current.GetAABB()); - } - else - { - Current.GetPos()->GetAABB()->GetMin(Min); - Current.GetPos()->GetAABB()->GetMax(Max); - - Current.GetNeg()->GetAABB()->GetMin(Min_); - Current.GetNeg()->GetAABB()->GetMax(Max_); - - Min.Min(Min_); - Max.Max(Max_); - - ((AABB*)Current.GetAABB())->SetMinMax(Min, Max); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the number of bytes used by the tree. - * \return number of bytes used - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTree::GetUsedBytes() const -{ - udword TotalSize = mTotalNbNodes*GetNodeSize(); - if(mIndices) TotalSize+=mNbPrimitives*sizeof(udword); - return TotalSize; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the tree is a complete tree or not. - * A complete tree is made of 2*N-1 nodes, where N is the number of primitives in the tree. - * \return true for complete trees - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::IsComplete() const -{ - return (GetNbNodes()==GetNbPrimitives()*2-1); -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a versatile AABB tree. + * \file OPC_AABBTree.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a generic AABB tree node. + * + * \class AABBTreeNode + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a generic AABB tree. + * This is a vanilla AABB tree, without any particular optimization. It contains anonymous references to + * user-provided primitives, which can theoretically be anything - triangles, boxes, etc. Each primitive + * is surrounded by an AABB, regardless of the primitive's nature. When the primitive is a triangle, the + * resulting tree can be converted into an optimized tree. If the primitive is a box, the resulting tree + * can be used for culling - VFC or occlusion -, assuming you cull on a mesh-by-mesh basis (modern way). + * + * \class AABBTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTreeNode::AABBTreeNode() : + mPos (null), +#ifndef OPC_NO_NEG_VANILLA_TREE + mNeg (null), +#endif + mNbPrimitives (0), + mNodePrimitives (null) +{ +#ifdef OPC_USE_TREE_COHERENCE + mBitmask = 0; +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTreeNode::~AABBTreeNode() +{ + // Opcode 1.3: + const AABBTreeNode* Pos = GetPos(); + const AABBTreeNode* Neg = GetNeg(); +#ifndef OPC_NO_NEG_VANILLA_TREE + if(!(mPos&1)) DELETESINGLE(Pos); + if(!(mNeg&1)) DELETESINGLE(Neg); +#else + if(!(mPos&1)) DELETEARRAY(Pos); +#endif + mNodePrimitives = null; // This was just a shortcut to the global list => no release + mNbPrimitives = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Splits the node along a given axis. + * The list of indices is reorganized according to the split values. + * \param axis [in] splitting axis index + * \param builder [in] the tree builder + * \return the number of primitives assigned to the first child + * \warning this method reorganizes the internal list of primitives + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTreeNode::Split(udword axis, AABBTreeBuilder* builder) +{ + // Get node split value + float SplitValue = builder->GetSplittingValue(mNodePrimitives, mNbPrimitives, mBV, axis); + + udword NbPos = 0; + // Loop through all node-related primitives. Their indices range from mNodePrimitives[0] to mNodePrimitives[mNbPrimitives-1]. + // Those indices map the global list in the tree builder. + for(udword i=0;iGetSplittingValue(Index, axis); + + // Reorganize the list of indices in this order: positive - negative. + if(PrimitiveValue > SplitValue) + { + // Swap entries + udword Tmp = mNodePrimitives[i]; + mNodePrimitives[i] = mNodePrimitives[NbPos]; + mNodePrimitives[NbPos] = Tmp; + // Count primitives assigned to positive space + NbPos++; + } + } + return NbPos; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Subdivides the node. + * + * N + * / \ + * / \ + * N/2 N/2 + * / \ / \ + * N/4 N/4 N/4 N/4 + * (etc) + * + * A well-balanced tree should have a O(log n) depth. + * A degenerate tree would have a O(n) depth. + * Note a perfectly-balanced tree is not well-suited to collision detection anyway. + * + * \param builder [in] the tree builder + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeNode::Subdivide(AABBTreeBuilder* builder) +{ + // Checkings + if(!builder) return false; + + // Stop subdividing if we reach a leaf node. This is always performed here, + // else we could end in trouble if user overrides this. + if(mNbPrimitives==1) return true; + + // Let the user validate the subdivision + if(!builder->ValidateSubdivision(mNodePrimitives, mNbPrimitives, mBV)) return true; + + bool ValidSplit = true; // Optimism... + udword NbPos; + if(builder->mSettings.mRules & SPLIT_LARGEST_AXIS) + { + // Find the largest axis to split along + Point Extents; mBV.GetExtents(Extents); // Box extents + udword Axis = Extents.LargestAxis(); // Index of largest axis + + // Split along the axis + NbPos = Split(Axis, builder); + + // Check split validity + if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; + } + else if(builder->mSettings.mRules & SPLIT_SPLATTER_POINTS) + { + // Compute the means + Point Means(0.0f, 0.0f, 0.0f); + for(udword i=0;iGetSplittingValue(Index, 0); + Means.y+=builder->GetSplittingValue(Index, 1); + Means.z+=builder->GetSplittingValue(Index, 2); + } + Means/=float(mNbPrimitives); + + // Compute variances + Point Vars(0.0f, 0.0f, 0.0f); + for(udword i=0;iGetSplittingValue(Index, 0); + float Cy = builder->GetSplittingValue(Index, 1); + float Cz = builder->GetSplittingValue(Index, 2); + Vars.x += (Cx - Means.x)*(Cx - Means.x); + Vars.y += (Cy - Means.y)*(Cy - Means.y); + Vars.z += (Cz - Means.z)*(Cz - Means.z); + } + Vars/=float(mNbPrimitives-1); + + // Choose axis with greatest variance + udword Axis = Vars.LargestAxis(); + + // Split along the axis + NbPos = Split(Axis, builder); + + // Check split validity + if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; + } + else if(builder->mSettings.mRules & SPLIT_BALANCED) + { + // Test 3 axis, take the best + float Results[3]; + NbPos = Split(0, builder); Results[0] = float(NbPos)/float(mNbPrimitives); + NbPos = Split(1, builder); Results[1] = float(NbPos)/float(mNbPrimitives); + NbPos = Split(2, builder); Results[2] = float(NbPos)/float(mNbPrimitives); + Results[0]-=0.5f; Results[0]*=Results[0]; + Results[1]-=0.5f; Results[1]*=Results[1]; + Results[2]-=0.5f; Results[2]*=Results[2]; + udword Min=0; + if(Results[1]mSettings.mRules & SPLIT_BEST_AXIS) + { + // Test largest, then middle, then smallest axis... + + // Sort axis + Point Extents; mBV.GetExtents(Extents); // Box extents + udword SortedAxis[] = { 0, 1, 2 }; + float* Keys = (float*)&Extents.x; + for(udword j=0;j<3;j++) + { + for(udword i=0;i<2;i++) + { + if(Keys[SortedAxis[i]]mSettings.mRules & SPLIT_FIFTY) + { + // Don't even bother splitting (mainly a performance test) + NbPos = mNbPrimitives>>1; + } + else return false; // Unknown splitting rules + + // Check the subdivision has been successful + if(!ValidSplit) + { + // Here, all boxes lie in the same sub-space. Two strategies: + // - if the tree *must* be complete, make an arbitrary 50-50 split + // - else stop subdividing +// if(builder->mSettings.mRules&SPLIT_COMPLETE) + if(builder->mSettings.mLimit==1) + { + builder->IncreaseNbInvalidSplits(); + NbPos = mNbPrimitives>>1; + } + else return true; + } + + // Now create children and assign their pointers. + if(builder->mNodeBase) + { + // We use a pre-allocated linear pool for complete trees [Opcode 1.3] + AABBTreeNode* Pool = (AABBTreeNode*)builder->mNodeBase; + udword Count = builder->GetCount() - 1; // Count begins to 1... + // Set last bit to tell it shouldn't be freed ### pretty ugly, find a better way. Maybe one bit in mNbPrimitives + ASSERT(!(udword(&Pool[Count+0])&1)); + ASSERT(!(udword(&Pool[Count+1])&1)); + mPos = udword(&Pool[Count+0])|1; +#ifndef OPC_NO_NEG_VANILLA_TREE + mNeg = udword(&Pool[Count+1])|1; +#endif + } + else + { + // Non-complete trees and/or Opcode 1.2 allocate nodes on-the-fly +#ifndef OPC_NO_NEG_VANILLA_TREE + mPos = (udword)new AABBTreeNode; CHECKALLOC(mPos); + mNeg = (udword)new AABBTreeNode; CHECKALLOC(mNeg); +#else + AABBTreeNode* PosNeg = new AABBTreeNode[2]; + CHECKALLOC(PosNeg); + mPos = (udword)PosNeg; +#endif + } + + // Update stats + builder->IncreaseCount(2); + + // Assign children + AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); + AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); + Pos->mNodePrimitives = &mNodePrimitives[0]; + Pos->mNbPrimitives = NbPos; + Neg->mNodePrimitives = &mNodePrimitives[NbPos]; + Neg->mNbPrimitives = mNbPrimitives - NbPos; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive hierarchy building in a top-down fashion. + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeNode::_BuildHierarchy(AABBTreeBuilder* builder) +{ + // 1) Compute the global box for current node. The box is stored in mBV. + builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); + + // 2) Subdivide current node + Subdivide(builder); + + // 3) Recurse + AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); + AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); + if(Pos) Pos->_BuildHierarchy(builder); + if(Neg) Neg->_BuildHierarchy(builder); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the tree (top-down). + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeNode::_Refit(AABBTreeBuilder* builder) +{ + // 1) Recompute the new global box for current node + builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); + + // 2) Recurse + AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); + AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); + if(Pos) Pos->_Refit(builder); + if(Neg) Neg->_Refit(builder); +} + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTree::AABBTree() : mIndices(null), mTotalNbNodes(0), mPool(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTree::~AABBTree() +{ + Release(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases the tree. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTree::Release() +{ + DELETEARRAY(mPool); + DELETEARRAY(mIndices); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a generic AABB tree from a tree builder. + * \param builder [in] the tree builder + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::Build(AABBTreeBuilder* builder) +{ + // Checkings + if(!builder || !builder->mNbPrimitives) return false; + + // Release previous tree + Release(); + + // Init stats + builder->SetCount(1); + builder->SetNbInvalidSplits(0); + + // Initialize indices. This list will be modified during build. + mIndices = new udword[builder->mNbPrimitives]; + CHECKALLOC(mIndices); + // Identity permutation + for(udword i=0;imNbPrimitives;i++) mIndices[i] = i; + + // Setup initial node. Here we have a complete permutation of the app's primitives. + mNodePrimitives = mIndices; + mNbPrimitives = builder->mNbPrimitives; + + // Use a linear array for complete trees (since we can predict the final number of nodes) [Opcode 1.3] +// if(builder->mRules&SPLIT_COMPLETE) + if(builder->mSettings.mLimit==1) + { + // Allocate a pool of nodes + mPool = new AABBTreeNode[builder->mNbPrimitives*2 - 1]; + + builder->mNodeBase = mPool; // ### ugly ! + } + + // Build the hierarchy + _BuildHierarchy(builder); + + // Get back total number of nodes + mTotalNbNodes = builder->GetCount(); + + // For complete trees, check the correct number of nodes has been created [Opcode 1.3] + if(mPool) ASSERT(mTotalNbNodes==builder->mNbPrimitives*2 - 1); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the depth of the tree. + * A well-balanced tree should have a log(n) depth. A degenerate tree O(n) depth. + * \return depth of the tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTree::ComputeDepth() const +{ + return Walk(null, null); // Use the walking code without callback +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Walks the tree, calling the user back for each node. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTree::Walk(WalkingCallback callback, void* user_data) const +{ + // Call it without callback to compute max depth + udword MaxDepth = 0; + udword CurrentDepth = 0; + + struct Local + { + static void _Walk(const AABBTreeNode* current_node, udword& max_depth, udword& current_depth, WalkingCallback callback, void* user_data) + { + // Checkings + if(!current_node) return; + // Entering a new node => increase depth + current_depth++; + // Keep track of max depth + if(current_depth>max_depth) max_depth = current_depth; + + // Callback + if(callback && !(callback)(current_node, current_depth, user_data)) return; + + // Recurse + if(current_node->GetPos()) { _Walk(current_node->GetPos(), max_depth, current_depth, callback, user_data); current_depth--; } + if(current_node->GetNeg()) { _Walk(current_node->GetNeg(), max_depth, current_depth, callback, user_data); current_depth--; } + } + }; + Local::_Walk(this, MaxDepth, CurrentDepth, callback, user_data); + return MaxDepth; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the tree in a top-down way. + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::Refit(AABBTreeBuilder* builder) +{ + if(!builder) return false; + _Refit(builder); + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the tree in a bottom-up way. + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::Refit2(AABBTreeBuilder* builder) +{ + // Checkings + if(!builder) return false; + + ASSERT(mPool); + + // Bottom-up update + Point Min,Max; + Point Min_,Max_; + udword Index = mTotalNbNodes; + while(Index--) + { + AABBTreeNode& Current = mPool[Index]; + + if(Current.IsLeaf()) + { + builder->ComputeGlobalBox(Current.GetPrimitives(), Current.GetNbPrimitives(), *(AABB*)Current.GetAABB()); + } + else + { + Current.GetPos()->GetAABB()->GetMin(Min); + Current.GetPos()->GetAABB()->GetMax(Max); + + Current.GetNeg()->GetAABB()->GetMin(Min_); + Current.GetNeg()->GetAABB()->GetMax(Max_); + + Min.Min(Min_); + Max.Max(Max_); + + ((AABB*)Current.GetAABB())->SetMinMax(Min, Max); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the number of bytes used by the tree. + * \return number of bytes used + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTree::GetUsedBytes() const +{ + udword TotalSize = mTotalNbNodes*GetNodeSize(); + if(mIndices) TotalSize+=mNbPrimitives*sizeof(udword); + return TotalSize; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the tree is a complete tree or not. + * A complete tree is made of 2*N-1 nodes, where N is the number of primitives in the tree. + * \return true for complete trees + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::IsComplete() const +{ + return (GetNbNodes()==GetNbPrimitives()*2-1); +} diff --git a/Extras/CDTestFramework/Opcode/OPC_AABBTree.h b/Extras/CDTestFramework/Opcode/OPC_AABBTree.h index 8b22c38e3..c63bfa30d 100644 --- a/Extras/CDTestFramework/Opcode/OPC_AABBTree.h +++ b/Extras/CDTestFramework/Opcode/OPC_AABBTree.h @@ -1,146 +1,146 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a versatile AABB tree. - * \file OPC_AABBTree.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_AABBTREE_H__ -#define __OPC_AABBTREE_H__ - -#ifdef OPC_NO_NEG_VANILLA_TREE - //! TO BE DOCUMENTED - #define IMPLEMENT_TREE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - base_class(); \ - ~base_class(); \ - /* Data access */ \ - inline_ const volume* Get##volume() const { return &mBV; } \ - /* Clear the last bit */ \ - inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ - inline_ const base_class* GetNeg() const { const base_class* P = GetPos(); return P ? P+1 : null;} \ - \ - /* We don't need to test both nodes since we can't have one without the other */ \ - inline_ bool IsLeaf() const { return !GetPos(); } \ - \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - protected: \ - /* Tree-independent data */ \ - /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ - /* Whatever happens we need the two children and the enclosing volume.*/ \ - volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ - udword mPos; /* "Positive" & "Negative" children */ -#else - //! TO BE DOCUMENTED - #define IMPLEMENT_TREE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - base_class(); \ - ~base_class(); \ - /* Data access */ \ - inline_ const volume* Get##volume() const { return &mBV; } \ - /* Clear the last bit */ \ - inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ - inline_ const base_class* GetNeg() const { return (const base_class*)(mNeg&~1); } \ - \ -/* inline_ bool IsLeaf() const { return (!GetPos() && !GetNeg()); } */ \ - /* We don't need to test both nodes since we can't have one without the other */ \ - inline_ bool IsLeaf() const { return !GetPos(); } \ - \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - protected: \ - /* Tree-independent data */ \ - /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ - /* Whatever happens we need the two children and the enclosing volume.*/ \ - volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ - udword mPos; /* "Positive" child */ \ - udword mNeg; /* "Negative" child */ -#endif - - typedef void (*CullingCallback) (udword nb_primitives, udword* node_primitives, BOOL need_clipping, void* user_data); - - class OPCODE_API AABBTreeNode - { - IMPLEMENT_TREE(AABBTreeNode, AABB) - public: - // Data access - inline_ const udword* GetPrimitives() const { return mNodePrimitives; } - inline_ udword GetNbPrimitives() const { return mNbPrimitives; } - - protected: - // Tree-dependent data - udword* mNodePrimitives; //!< Node-related primitives (shortcut to a position in mIndices below) - udword mNbPrimitives; //!< Number of primitives for this node - // Internal methods - udword Split(udword axis, AABBTreeBuilder* builder); - bool Subdivide(AABBTreeBuilder* builder); - void _BuildHierarchy(AABBTreeBuilder* builder); - void _Refit(AABBTreeBuilder* builder); - }; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called for each node by the walking code. - * \param current [in] current node - * \param depth [in] current node's depth - * \param user_data [in] user-defined data - * \return true to recurse through children, else false to bypass them - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef bool (*WalkingCallback) (const AABBTreeNode* current, udword depth, void* user_data); - - class OPCODE_API AABBTree : public AABBTreeNode - { - public: - // Constructor / Destructor - AABBTree(); - ~AABBTree(); - // Build - bool Build(AABBTreeBuilder* builder); - void Release(); - - // Data access - inline_ const udword* GetIndices() const { return mIndices; } //!< Catch the indices - inline_ udword GetNbNodes() const { return mTotalNbNodes; } //!< Catch the number of nodes - - // Infos - bool IsComplete() const; - // Stats - udword ComputeDepth() const; - udword GetUsedBytes() const; - udword Walk(WalkingCallback callback, void* user_data) const; - - bool Refit(AABBTreeBuilder* builder); - bool Refit2(AABBTreeBuilder* builder); - private: - udword* mIndices; //!< Indices in the app list. Indices are reorganized during build (permutation). - AABBTreeNode* mPool; //!< Linear pool of nodes for complete trees. Null otherwise. [Opcode 1.3] - // Stats - udword mTotalNbNodes; //!< Number of nodes in the tree. - }; - -#endif // __OPC_AABBTREE_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a versatile AABB tree. + * \file OPC_AABBTree.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_AABBTREE_H__ +#define __OPC_AABBTREE_H__ + +#ifdef OPC_NO_NEG_VANILLA_TREE + //! TO BE DOCUMENTED + #define IMPLEMENT_TREE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + base_class(); \ + ~base_class(); \ + /* Data access */ \ + inline_ const volume* Get##volume() const { return &mBV; } \ + /* Clear the last bit */ \ + inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ + inline_ const base_class* GetNeg() const { const base_class* P = GetPos(); return P ? P+1 : null;} \ + \ + /* We don't need to test both nodes since we can't have one without the other */ \ + inline_ bool IsLeaf() const { return !GetPos(); } \ + \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + protected: \ + /* Tree-independent data */ \ + /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ + /* Whatever happens we need the two children and the enclosing volume.*/ \ + volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ + udword mPos; /* "Positive" & "Negative" children */ +#else + //! TO BE DOCUMENTED + #define IMPLEMENT_TREE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + base_class(); \ + ~base_class(); \ + /* Data access */ \ + inline_ const volume* Get##volume() const { return &mBV; } \ + /* Clear the last bit */ \ + inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ + inline_ const base_class* GetNeg() const { return (const base_class*)(mNeg&~1); } \ + \ +/* inline_ bool IsLeaf() const { return (!GetPos() && !GetNeg()); } */ \ + /* We don't need to test both nodes since we can't have one without the other */ \ + inline_ bool IsLeaf() const { return !GetPos(); } \ + \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + protected: \ + /* Tree-independent data */ \ + /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ + /* Whatever happens we need the two children and the enclosing volume.*/ \ + volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ + udword mPos; /* "Positive" child */ \ + udword mNeg; /* "Negative" child */ +#endif + + typedef void (*CullingCallback) (udword nb_primitives, udword* node_primitives, BOOL need_clipping, void* user_data); + + class OPCODE_API AABBTreeNode + { + IMPLEMENT_TREE(AABBTreeNode, AABB) + public: + // Data access + inline_ const udword* GetPrimitives() const { return mNodePrimitives; } + inline_ udword GetNbPrimitives() const { return mNbPrimitives; } + + protected: + // Tree-dependent data + udword* mNodePrimitives; //!< Node-related primitives (shortcut to a position in mIndices below) + udword mNbPrimitives; //!< Number of primitives for this node + // Internal methods + udword Split(udword axis, AABBTreeBuilder* builder); + bool Subdivide(AABBTreeBuilder* builder); + void _BuildHierarchy(AABBTreeBuilder* builder); + void _Refit(AABBTreeBuilder* builder); + }; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called for each node by the walking code. + * \param current [in] current node + * \param depth [in] current node's depth + * \param user_data [in] user-defined data + * \return true to recurse through children, else false to bypass them + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef bool (*WalkingCallback) (const AABBTreeNode* current, udword depth, void* user_data); + + class OPCODE_API AABBTree : public AABBTreeNode + { + public: + // Constructor / Destructor + AABBTree(); + ~AABBTree(); + // Build + bool Build(AABBTreeBuilder* builder); + void Release(); + + // Data access + inline_ const udword* GetIndices() const { return mIndices; } //!< Catch the indices + inline_ udword GetNbNodes() const { return mTotalNbNodes; } //!< Catch the number of nodes + + // Infos + bool IsComplete() const; + // Stats + udword ComputeDepth() const; + udword GetUsedBytes() const; + udword Walk(WalkingCallback callback, void* user_data) const; + + bool Refit(AABBTreeBuilder* builder); + bool Refit2(AABBTreeBuilder* builder); + private: + udword* mIndices; //!< Indices in the app list. Indices are reorganized during build (permutation). + AABBTreeNode* mPool; //!< Linear pool of nodes for complete trees. Null otherwise. [Opcode 1.3] + // Stats + udword mTotalNbNodes; //!< Number of nodes in the tree. + }; + +#endif // __OPC_AABBTREE_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp b/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp index a7b0ee207..14f16c720 100644 --- a/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp @@ -1,1221 +1,1221 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an array-based version of the sweep-and-prune algorithm - * \file OPC_ArraySAP.cpp - * \author Pierre Terdiman - * \date December, 2, 2007 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "StdAfx.h" - -using namespace Opcode; - -//#include "SAP_Utils.h" - -#define INVALID_USER_ID 0xffff - -inline_ void Sort(uword& id0, uword& id1) { if(id0>id1) TSwap(id0, id1); } -inline_ void Sort(uword& id0, uword& id1, const void*& obj0, const void*& obj1) { if(id0>id1) { TSwap(id0, id1); TSwap(obj0, obj1); } } - - - struct Opcode::IAABB : public Allocateable - { - udword mMinX; - udword mMinY; - udword mMinZ; - udword mMaxX; - udword mMaxY; - udword mMaxZ; - - inline_ udword GetMin(udword i) const { return (&mMinX)[i]; } - inline_ udword GetMax(udword i) const { return (&mMaxX)[i]; } - }; - - - -/* - - already sorted for batch create? - - better axis selection batch create -*/ - -//#define USE_WORDS // Use words or dwords for box indices. Words save memory but seriously limit the max number of objects in the SAP. -#define USE_PREFETCH -#define USE_INTEGERS -#define PAIR_USER_DATA -#define USE_OVERLAP_TEST_ON_REMOVES // "Useless" but faster overall because seriously reduces number of calls (from ~10000 to ~3 sometimes!) -#define RELEASE_ON_RESET // Release memory instead of just doing a reset - -#include "OPC_ArraySAP.h" - -//#include "SAP_PairManager.h" -//#include "SAP_PairManager.cpp" - - -inline_ udword Hash(uword id0, uword id1) { return Hash32Bits_1( udword(id0)|(udword(id1)<<16) ); } -inline_ bool DifferentPair(const ASAP_Pair& p, uword id0, uword id1) { return (id0!=p.id0) || (id1!=p.id1); } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ASAP_PairManager::ASAP_PairManager() : - mHashSize (0), - mMask (0), - mHashTable (null), - mNext (null), - mNbActivePairs (0), - mActivePairs (null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ASAP_PairManager::~ASAP_PairManager() -{ - Purge(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void ASAP_PairManager::Purge() -{ - ICE_FREE(mNext); - ICE_FREE(mActivePairs); - ICE_FREE(mHashTable); - mHashSize = 0; - mMask = 0; - mNbActivePairs = 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const ASAP_Pair* ASAP_PairManager::FindPair(uword id0, uword id1) const -{ - if(!mHashTable) return null; // Nothing has been allocated yet - - // Order the ids - Sort(id0, id1); - - // Compute hash value for this pair - udword HashValue = Hash(id0, id1) & mMask; - - // Look for it in the table - udword Offset = mHashTable[HashValue]; - while(Offset!=INVALID_ID && DifferentPair(mActivePairs[Offset], id0, id1)) - { - ASSERT(mActivePairs[Offset].id0!=INVALID_USER_ID); - Offset = mNext[Offset]; // Better to have a separate array for this - } - if(Offset==INVALID_ID) return null; - ASSERT(Offset the pair is persistent - return &mActivePairs[Offset]; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// Internal version saving hash computation -inline_ ASAP_Pair* ASAP_PairManager::FindPair(uword id0, uword id1, udword hash_value) const -{ - if(!mHashTable) return null; // Nothing has been allocated yet - - // Look for it in the table - udword Offset = mHashTable[hash_value]; - while(Offset!=INVALID_ID && DifferentPair(mActivePairs[Offset], id0, id1)) - { - ASSERT(mActivePairs[Offset].id0!=INVALID_USER_ID); - Offset = mNext[Offset]; // Better to have a separate array for this - } - if(Offset==INVALID_ID) return null; - ASSERT(Offset the pair is persistent - return &mActivePairs[Offset]; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const ASAP_Pair* ASAP_PairManager::AddPair(uword id0, uword id1, const void* object0, const void* object1) -{ - // Order the ids - Sort(id0, id1, object0, object1); - - udword HashValue = Hash(id0, id1) & mMask; - - ASAP_Pair* P = FindPair(id0, id1, HashValue); - if(P) - { - return P; // Persistent pair - } - - // This is a new pair - if(mNbActivePairs >= mHashSize) - { - // Get more entries - mHashSize = NextPowerOfTwo(mNbActivePairs+1); - mMask = mHashSize-1; - - ReallocPairs(); - - // Recompute hash value with new hash size - HashValue = Hash(id0, id1) & mMask; - } - - ASAP_Pair* p = &mActivePairs[mNbActivePairs]; - p->id0 = id0; // ### CMOVs would be nice here - p->id1 = id1; - p->object0 = object0; - p->object1 = object1; - - mNext[mNbActivePairs] = mHashTable[HashValue]; - mHashTable[HashValue] = mNbActivePairs++; - return p; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void ASAP_PairManager::RemovePair(uword id0, uword id1, udword hash_value, udword pair_index) -{ - // Walk the hash table to fix mNext - udword Offset = mHashTable[hash_value]; - ASSERT(Offset!=INVALID_ID); - - udword Previous=INVALID_ID; - while(Offset!=pair_index) - { - Previous = Offset; - Offset = mNext[Offset]; - } - - // Let us go/jump us - if(Previous!=INVALID_ID) - { - ASSERT(mNext[Previous]==pair_index); - mNext[Previous] = mNext[pair_index]; - } - // else we were the first - else mHashTable[hash_value] = mNext[pair_index]; - // we're now free to reuse mNext[PairIndex] without breaking the list - -#ifdef _DEBUG - mNext[pair_index]=INVALID_ID; -#endif - // Invalidate entry - - // Fill holes - if(1) - { - // 1) Remove last pair - const udword LastPairIndex = mNbActivePairs-1; - if(LastPairIndex==pair_index) - { - mNbActivePairs--; - } - else - { - const ASAP_Pair* Last = &mActivePairs[LastPairIndex]; - const udword LastHashValue = Hash(Last->id0, Last->id1) & mMask; - - // Walk the hash table to fix mNext - udword Offset = mHashTable[LastHashValue]; - ASSERT(Offset!=INVALID_ID); - - udword Previous=INVALID_ID; - while(Offset!=LastPairIndex) - { - Previous = Offset; - Offset = mNext[Offset]; - } - - // Let us go/jump us - if(Previous!=INVALID_ID) - { - ASSERT(mNext[Previous]==LastPairIndex); - mNext[Previous] = mNext[LastPairIndex]; - } - // else we were the first - else mHashTable[LastHashValue] = mNext[LastPairIndex]; - // we're now free to reuse mNext[LastPairIndex] without breaking the list - -#ifdef _DEBUG - mNext[LastPairIndex]=INVALID_ID; -#endif - - // Don't invalidate entry since we're going to shrink the array - - // 2) Re-insert in free slot - mActivePairs[pair_index] = mActivePairs[LastPairIndex]; -#ifdef _DEBUG - ASSERT(mNext[pair_index]==INVALID_ID); -#endif - mNext[pair_index] = mHashTable[LastHashValue]; - mHashTable[LastHashValue] = pair_index; - - mNbActivePairs--; - } - } -} - -bool ASAP_PairManager::RemovePair(uword id0, uword id1) -{ - // Order the ids - Sort(id0, id1); - - const udword HashValue = Hash(id0, id1) & mMask; - const ASAP_Pair* P = FindPair(id0, id1, HashValue); - if(!P) return false; - ASSERT(P->id0==id0); - ASSERT(P->id1==id1); - - RemovePair(id0, id1, HashValue, GetPairIndex(P)); - - ShrinkMemory(); - return true; -} - -bool ASAP_PairManager::RemovePairs(const BitArray& array) -{ - udword i=0; - while(i only less efficient but still ok - for(udword i=0;i>2; } - }; - - class Opcode::ASAP_Box : public Allocateable - { - public: - inline_ ASAP_Box() {} - inline_ ~ASAP_Box() {} - - IndexType mMin[3]; - IndexType mMax[3]; - void* mObject; - udword mGUID; - - inline_ ValType GetMaxValue(udword i, const ASAP_EndPoint* base) const - { - return base[mMax[i]].mValue; - } - - inline_ ValType GetMinValue(udword i, const ASAP_EndPoint* base) const - { - return base[mMin[i]].mValue; - } -#ifdef _DEBUG - bool HasBeenInserted() const - { - assert(mMin[0]!=INVALID_INDEX); - assert(mMax[0]!=INVALID_INDEX); - assert(mMin[1]!=INVALID_INDEX); - assert(mMax[1]!=INVALID_INDEX); - assert(mMin[2]!=INVALID_INDEX); - assert(mMax[2]!=INVALID_INDEX); - return true; - } -#endif - }; - -inline_ BOOL Intersect1D_Min(const SAP_AABB& a, const ASAP_Box& b, const ASAP_EndPoint* const base, udword axis) -{ - if(b.GetMaxValue(axis, base) < a.GetMin(axis)) - return FALSE; - return TRUE; -} - -inline_ BOOL Intersect2D(const ASAP_Box& c, const ASAP_Box& b, udword axis1, udword axis2) -{ - if( b.mMax[axis1] < c.mMin[axis1] || c.mMax[axis1] < b.mMin[axis1] - || b.mMax[axis2] < c.mMin[axis2] || c.mMax[axis2] < b.mMin[axis2]) return FALSE; - return TRUE; -} - - -ArraySAP::ArraySAP() -{ - mNbBoxes = 0; - mMaxNbBoxes = 0; - mBoxes = null; - mEndPoints[0] = mEndPoints[1] = mEndPoints[2] = null; - mFirstFree = INVALID_ID; -} - -ArraySAP::~ArraySAP() -{ - mNbBoxes = 0; - mMaxNbBoxes = 0; - DELETEARRAY(mBoxes); - for(udword i=0;i<3;i++) - { - DELETEARRAY(mEndPoints[i]); - } -} - -void ArraySAP::ResizeBoxArray() -{ - const udword NewMaxBoxes = mMaxNbBoxes ? mMaxNbBoxes*2 : 64; - - ASAP_Box* NewBoxes = ICE_NEW_TMP(ASAP_Box)[NewMaxBoxes]; - const udword NbSentinels=2; - ASAP_EndPoint* NewEndPointsX = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; - ASAP_EndPoint* NewEndPointsY = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; - ASAP_EndPoint* NewEndPointsZ = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; - - if(mNbBoxes) - { - CopyMemory(NewBoxes, mBoxes, sizeof(ASAP_Box)*mNbBoxes); - CopyMemory(NewEndPointsX, mEndPoints[0], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); - CopyMemory(NewEndPointsY, mEndPoints[1], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); - CopyMemory(NewEndPointsZ, mEndPoints[2], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); - } - else - { - // Initialize sentinels -#ifdef USE_INTEGERS - const udword Min = EncodeFloat(MIN_FLOAT); - const udword Max = EncodeFloat(MAX_FLOAT); -#else - const float Min = MIN_FLOAT; - const float Max = MAX_FLOAT; -#endif - NewEndPointsX[0].SetData(Min, INVALID_INDEX, FALSE); - NewEndPointsX[1].SetData(Max, INVALID_INDEX, TRUE); - NewEndPointsY[0].SetData(Min, INVALID_INDEX, FALSE); - NewEndPointsY[1].SetData(Max, INVALID_INDEX, TRUE); - NewEndPointsZ[0].SetData(Min, INVALID_INDEX, FALSE); - NewEndPointsZ[1].SetData(Max, INVALID_INDEX, TRUE); - } - DELETEARRAY(mBoxes); - DELETEARRAY(mEndPoints[2]); - DELETEARRAY(mEndPoints[1]); - DELETEARRAY(mEndPoints[0]); - mBoxes = NewBoxes; - mEndPoints[0] = NewEndPointsX; - mEndPoints[1] = NewEndPointsY; - mEndPoints[2] = NewEndPointsZ; - - mMaxNbBoxes = NewMaxBoxes; -} - -inline_ BOOL Intersect(const IAABB& a, const IAABB& b, udword axis) -{ - if(b.GetMax(axis) < a.GetMin(axis) || a.GetMax(axis) < b.GetMin(axis)) return FALSE; - return TRUE; -} - -// ### TODO: the sorts here might be useless, as the values have been sorted already -bool ArraySAP::CompleteBoxPruning2(udword nb, const IAABB* array, const Axes& axes, const CreateData* batched) -{ - // Checkings - if(!nb || !array) return false; - - // Catch axes - const udword Axis0 = axes.mAxis0; - const udword Axis1 = axes.mAxis1; - const udword Axis2 = axes.mAxis2; - - // Allocate some temporary data - udword* PosList = (udword*)ICE_ALLOC_TMP(sizeof(udword)*(nb+1)); - - // 1) Build main list using the primary axis - for(udword i=0;iSort(PosList, nb, RADIX_SIGNED).GetRanks(); - const udword* Sorted = RS->Sort(PosList, nb, RADIX_UNSIGNED).GetRanks(); - - // 3) Prune the list - const udword* const LastSorted = &Sorted[nb]; - const udword* RunningAddress = Sorted; - udword Index0, Index1; - while(RunningAddressmObject, Box1->mObject, Box0->mGUID, Box1->mGUID); - } - } - } - } - } - - ICE_FREE(PosList); - return true; -} - -bool ArraySAP::BipartiteBoxPruning2(udword nb0, const IAABB* array0, udword nb1, const IAABB* array1, const Axes& axes, const CreateData* batched, const udword* box_indices) -{ - // Checkings - if(!nb0 || !array0 || !nb1 || !array1) return false; - - // Catch axes - const udword Axis0 = axes.mAxis0; - const udword Axis1 = axes.mAxis1; - const udword Axis2 = axes.mAxis2; - - // Allocate some temporary data - udword* MinPosList0 = (udword*)ICE_ALLOC_TMP(sizeof(udword)*nb0); - udword* MinPosList1 = (udword*)ICE_ALLOC_TMP(sizeof(udword)*nb1); - - // 1) Build main lists using the primary axis - for(udword i=0;iSort(MinPosList0, nb0, RADIX_UNSIGNED).GetRanks(); - const udword* Sorted1 = RS1->Sort(MinPosList1, nb1, RADIX_UNSIGNED).GetRanks(); - - // 3) Prune the lists - udword Index0, Index1; - - const udword* const LastSorted0 = &Sorted0[nb0]; - const udword* const LastSorted1 = &Sorted1[nb1]; - const udword* RunningAddress0 = Sorted0; - const udword* RunningAddress1 = Sorted1; - - while(RunningAddress1mObject, Box1->mObject, Box0->mGUID, Box1->mGUID); - } - } - } - } - - //// - - while(RunningAddress0mObject, Box1->mObject, Box0->mGUID, Box1->mGUID); - } - } - - } - } - - ICE_FREE(MinPosList0); - ICE_FREE(MinPosList1); - return true; -} - -udword ArraySAP::AddObject(void* object, uword guid, const AABB& box) -{ - assert(!(size_t(object)&3)); // We will use the 2 LSBs - -#ifdef _DEBUG - int a = sizeof(ASAP_Box); // 32 - int b = sizeof(ASAP_EndPoint); // 8 -#endif - - udword BoxIndex; - if(mFirstFree!=INVALID_ID) - { - BoxIndex = mFirstFree; - mFirstFree = mBoxes[BoxIndex].mGUID; - } - else - { - if(mNbBoxes==mMaxNbBoxes) - ResizeBoxArray(); - BoxIndex = mNbBoxes; - } - - ASAP_Box* Box = &mBoxes[BoxIndex]; - // Initialize box - Box->mObject = object; - Box->mGUID = guid; - for(udword i=0;i<3;i++) - { - Box->mMin[i] = INVALID_INDEX; - Box->mMax[i] = INVALID_INDEX; - } - - mNbBoxes++; - - CreateData* CD = (CreateData*)mCreated.Reserve(sizeof(CreateData)/sizeof(udword)); - CD->mHandle = BoxIndex; - CD->mBox = box; - - return BoxIndex; -} - -void ArraySAP::InsertEndPoints(udword axis, const ASAP_EndPoint* end_points, udword nb_endpoints) -{ - ASAP_EndPoint* const BaseEP = mEndPoints[axis]; - - const udword OldSize = mNbBoxes*2 - nb_endpoints; - const udword NewSize = mNbBoxes*2; - - BaseEP[NewSize + 1] = BaseEP[OldSize + 1]; - - sdword WriteIdx = NewSize; - udword CurrInsIdx = 0; - - const ASAP_EndPoint* First = &BaseEP[0]; - const ASAP_EndPoint* Current = &BaseEP[OldSize]; - while(Current>=First) - { - const ASAP_EndPoint& Src = *Current; - const ASAP_EndPoint& Ins = end_points[CurrInsIdx]; - - // We need to make sure we insert maxs before mins to handle exactly equal endpoints correctly - const bool ShouldInsert = Ins.IsMax() ? (Src.mValue <= Ins.mValue) : (Src.mValue < Ins.mValue); - - const ASAP_EndPoint& Moved = ShouldInsert ? Ins : Src; - BaseEP[WriteIdx] = Moved; - mBoxes[Moved.GetOwner()].mMin[axis + Moved.IsMax()] = WriteIdx--; - - if(ShouldInsert) - { - CurrInsIdx++; - if(CurrInsIdx >= nb_endpoints) - break;//we just inserted the last endpoint - } - else - { - Current--; - } - } -} - -void ArraySAP::BatchCreate() -{ - udword NbBatched = mCreated.GetNbEntries(); - if(!NbBatched) return; // Early-exit if no object has been created - NbBatched /= sizeof(CreateData)/sizeof(udword); - const CreateData* Batched = (const CreateData*)mCreated.GetEntries(); - mCreated.Reset(); - - { - const udword NbEndPoints = NbBatched*2; - ASAP_EndPoint* NewEPSorted = ICE_NEW_TMP(ASAP_EndPoint)[NbEndPoints]; - ASAP_EndPoint* Buffer = (ASAP_EndPoint*)ICE_ALLOC_TMP(sizeof(ASAP_EndPoint)*NbEndPoints); - RadixSort RS; - - for(udword Axis=0;Axis<3;Axis++) - { - for(udword i=0;iHasBeenInserted()); - } - for(udword i=0;imMin[0]; - NewBoxes[i].mMaxX = Box->mMax[0]; - NewBoxes[i].mMinY = Box->mMin[1]; - NewBoxes[i].mMaxY = Box->mMax[1]; - NewBoxes[i].mMinZ = Box->mMin[2]; - NewBoxes[i].mMaxZ = Box->mMax[2]; - } - - CompleteBoxPruning2(NbBatched, NewBoxes, Axes(AXES_XZY), Batched); - - // the old boxes are not the first ones in the array - - const udword NbOldBoxes = mNbBoxes - NbBatched; - if(NbOldBoxes) - { - IAABB* OldBoxes = ICE_NEW_TMP(IAABB)[NbOldBoxes]; - udword* OldBoxesIndices = (udword*)ICE_ALLOC_TMP(sizeof(udword)*NbOldBoxes); - udword Offset=0; - udword i=0; - while(imMin[0]; - OldBoxes[i].mMaxX = Box->mMax[0]; - OldBoxes[i].mMinY = Box->mMin[1]; - OldBoxes[i].mMaxY = Box->mMax[1]; - OldBoxes[i].mMinZ = Box->mMin[2]; - OldBoxes[i].mMaxZ = Box->mMax[2]; - Offset++; - i++; - } - assert(i==NbOldBoxes); - - BipartiteBoxPruning2(NbBatched, NewBoxes, NbOldBoxes, OldBoxes, Axes(AXES_XZY), Batched, OldBoxesIndices); - - ICE_FREE(OldBoxesIndices); - DELETEARRAY(OldBoxes); - } - DELETEARRAY(NewBoxes); - } -#ifdef RELEASE_ON_RESET - mCreated.Empty(); -#endif -} - -void ArraySAP::BatchRemove() -{ - udword NbRemoved = mRemoved.GetNbEntries(); - if(!NbRemoved) return; // Early-exit if no object has been removed - const udword* Removed = mRemoved.GetEntries(); - mRemoved.Reset(); - - for(udword Axis=0;Axis<3;Axis++) - { - ASAP_EndPoint* const BaseEP = mEndPoints[Axis]; - udword MinMinIndex = MAX_UDWORD; - for(udword i=0;imMin[Axis]; - assert(MinIndexmMax[Axis]; - assert(MaxIndexmMin[Axis + BaseEP[DestIndex].IsMax()] = DestIndex; - } - } - DestIndex++; - ReadIndex++; - } - } - } - - BitArray BA(65536); - const udword Saved = NbRemoved; - while(NbRemoved--) - { - udword Index = *Removed++; - assert(IndexmGUID < 65536); - BA.SetBit(Object->mGUID); - - Object->mGUID = mFirstFree; - mFirstFree = Index; - } - mNbBoxes -= Saved; - mPairs.RemovePairs(BA); - -#ifdef RELEASE_ON_RESET - mRemoved.Empty(); -#endif -} - -bool ArraySAP::RemoveObject(udword handle) -{ - mRemoved.Add(handle); - return true; -} - -#ifdef USE_INTEGERS -bool ArraySAP::UpdateObject(udword handle, const AABB& box_) -#else -bool ArraySAP::UpdateObject(udword handle, const AABB& box) -#endif -{ - const ASAP_Box* Object = mBoxes + handle; - assert(Object->HasBeenInserted()); - const void* UserObject = Object->mObject; - const udword UserGUID = Object->mGUID; - -#ifdef USE_INTEGERS - IAABB box; - box.mMinX = EncodeFloat(box_.GetMin(0)); - box.mMinY = EncodeFloat(box_.GetMin(1)); - box.mMinZ = EncodeFloat(box_.GetMin(2)); - box.mMaxX = EncodeFloat(box_.GetMax(0)); - box.mMaxY = EncodeFloat(box_.GetMax(1)); - box.mMaxZ = EncodeFloat(box_.GetMax(2)); -#endif - - for(udword Axis=0;Axis<3;Axis++) - { - const udword Axis1 = (1 << Axis) & 3; - const udword Axis2 = (1 << Axis1) & 3; - - ASAP_EndPoint* const BaseEP = mEndPoints[Axis]; - - // Update min - { - ASAP_EndPoint* CurrentMin = BaseEP + Object->mMin[Axis]; - ASSERT(!CurrentMin->IsMax()); - - const ValType Limit = box.GetMin(Axis); - if(Limit < CurrentMin->mValue) - { - CurrentMin->mValue = Limit; - - // Min is moving left: - ASAP_EndPoint Saved = *CurrentMin; - udword EPIndex = (size_t(CurrentMin) - size_t(BaseEP))/sizeof(ASAP_EndPoint); - const udword SavedIndex = EPIndex; - - while((--CurrentMin)->mValue > Limit) - { -#ifdef USE_PREFETCH - _prefetch(CurrentMin-1); -#endif - ASAP_Box* id1 = mBoxes + CurrentMin->GetOwner(); - const BOOL IsMax = CurrentMin->IsMax(); - if(IsMax) - { - // Our min passed a max => start overlap - if(Object!=id1 - && Intersect2D(*Object, *id1, Axis1, Axis2) - && Intersect1D_Min(box, *id1, BaseEP, Axis) - ) - AddPair(UserObject, id1->mObject, UserGUID, id1->mGUID); - } - - id1->mMin[Axis + IsMax] = EPIndex--; - *(CurrentMin+1) = *CurrentMin; - } - - if(SavedIndex!=EPIndex) - { - mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; - BaseEP[EPIndex] = Saved; - } - } - else if(Limit > CurrentMin->mValue) - { - CurrentMin->mValue = Limit; - - // Min is moving right: - ASAP_EndPoint Saved = *CurrentMin; - udword EPIndex = (size_t(CurrentMin) - size_t(BaseEP))/sizeof(ASAP_EndPoint); - const udword SavedIndex = EPIndex; - - while((++CurrentMin)->mValue < Limit) - { -#ifdef USE_PREFETCH - _prefetch(CurrentMin+1); -#endif - ASAP_Box* id1 = mBoxes + CurrentMin->GetOwner(); - const BOOL IsMax = CurrentMin->IsMax(); - if(IsMax) - { - // Our min passed a max => stop overlap - if(Object!=id1 -#ifdef USE_OVERLAP_TEST_ON_REMOVES - && Intersect2D(*Object, *id1, Axis1, Axis2) -#endif - ) - RemovePair(UserObject, id1->mObject, UserGUID, id1->mGUID); - } - - id1->mMin[Axis + IsMax] = EPIndex++; - *(CurrentMin-1) = *CurrentMin; - } - - if(SavedIndex!=EPIndex) - { - mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; - BaseEP[EPIndex] = Saved; - } - } - } - - // Update max - { - ASAP_EndPoint* CurrentMax = BaseEP + Object->mMax[Axis]; - ASSERT(CurrentMax->IsMax()); - - const ValType Limit = box.GetMax(Axis); - if(Limit > CurrentMax->mValue) - { - CurrentMax->mValue = Limit; - - // Max is moving right: - ASAP_EndPoint Saved = *CurrentMax; - udword EPIndex = (size_t(CurrentMax) - size_t(BaseEP))/sizeof(ASAP_EndPoint); - const udword SavedIndex = EPIndex; - - while((++CurrentMax)->mValue < Limit) - { -#ifdef USE_PREFETCH - _prefetch(CurrentMax+1); -#endif - ASAP_Box* id1 = mBoxes + CurrentMax->GetOwner(); - const BOOL IsMax = CurrentMax->IsMax(); - if(!IsMax) - { - // Our max passed a min => start overlap - if(Object!=id1 - && Intersect2D(*Object, *id1, Axis1, Axis2) - && Intersect1D_Min(box, *id1, BaseEP, Axis) - ) - AddPair(UserObject, id1->mObject, UserGUID, id1->mGUID); - } - - id1->mMin[Axis + IsMax] = EPIndex++; - *(CurrentMax-1) = *CurrentMax; - } - - if(SavedIndex!=EPIndex) - { - mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; - BaseEP[EPIndex] = Saved; - } - } - else if(Limit < CurrentMax->mValue) - { - CurrentMax->mValue = Limit; - - // Max is moving left: - ASAP_EndPoint Saved = *CurrentMax; - udword EPIndex = (size_t(CurrentMax) - size_t(BaseEP))/sizeof(ASAP_EndPoint); - const udword SavedIndex = EPIndex; - - while((--CurrentMax)->mValue > Limit) - { -#ifdef USE_PREFETCH - _prefetch(CurrentMax-1); -#endif - ASAP_Box* id1 = mBoxes + CurrentMax->GetOwner(); - const BOOL IsMax = CurrentMax->IsMax(); - if(!IsMax) - { - // Our max passed a min => stop overlap - if(Object!=id1 -#ifdef USE_OVERLAP_TEST_ON_REMOVES - && Intersect2D(*Object, *id1, Axis1, Axis2) -#endif - ) - RemovePair(UserObject, id1->mObject, UserGUID, id1->mGUID); - } - - id1->mMin[Axis + IsMax] = EPIndex--; - *(CurrentMax+1) = *CurrentMax; - } - - if(SavedIndex!=EPIndex) - { - mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; - BaseEP[EPIndex] = Saved; - } - } - } - } - return true; -} - -udword ArraySAP::DumpPairs(SAP_CreatePair create_cb, SAP_DeletePair delete_cb, void* cb_user_data, ASAP_Pair** pairs) -{ - BatchCreate(); - - const udword* Entries = mData.GetEntries(); - const udword* Last = Entries + mData.GetNbEntries(); - mData.Reset(); - - udword* ToRemove = (udword*)Entries; - while(Entries!=Last) - { - const udword ID = *Entries++; - ASAP_Pair* UP = mPairs.mActivePairs + ID; - - { - ASSERT(UP->IsInArray()); - if(UP->IsRemoved()) - { - // No need to call "ClearInArray" in this case, since the pair will get removed anyway - - // Remove - if(delete_cb && !UP->IsNew()) - { -#ifdef PAIR_USER_DATA - (delete_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data, UP->userData); -#else - (delete_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data, null); -#endif - } - - *ToRemove++ = udword(UP->id0)<<16|UP->id1; - } - else - { - UP->ClearInArray(); - // Add => already there... Might want to create user data, though - if(UP->IsNew()) - { - if(create_cb) - { -#ifdef PAIR_USER_DATA - UP->userData = (create_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data); -#else - (create_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data); -#endif - } - UP->ClearNew(); - } - } - } - } - - // #### try batch removal here - Entries = mData.GetEntries(); - while(Entries!=ToRemove) - { - const udword ID = *Entries++; - const udword id0 = ID>>16; - const udword id1 = ID&0xffff; - bool Status = mPairs.RemovePair(id0, id1); - ASSERT(Status); - } - -#ifdef RELEASE_ON_RESET - mData.Empty(); -#endif - - BatchRemove(); - - if(pairs) *pairs = mPairs.mActivePairs; - - return mPairs.mNbActivePairs; -} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* + * OPCODE - Optimized Collision Detection + * Copyright (C) 2001 Pierre Terdiman + * Homepage: http://www.codercorner.com/Opcode.htm + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an array-based version of the sweep-and-prune algorithm + * \file OPC_ArraySAP.cpp + * \author Pierre Terdiman + * \date December, 2, 2007 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +//#include "SAP_Utils.h" + +#define INVALID_USER_ID 0xffff + +inline_ void Sort(uword& id0, uword& id1) { if(id0>id1) TSwap(id0, id1); } +inline_ void Sort(uword& id0, uword& id1, const void*& obj0, const void*& obj1) { if(id0>id1) { TSwap(id0, id1); TSwap(obj0, obj1); } } + + + struct Opcode::IAABB : public Allocateable + { + udword mMinX; + udword mMinY; + udword mMinZ; + udword mMaxX; + udword mMaxY; + udword mMaxZ; + + inline_ udword GetMin(udword i) const { return (&mMinX)[i]; } + inline_ udword GetMax(udword i) const { return (&mMaxX)[i]; } + }; + + + +/* + - already sorted for batch create? + - better axis selection batch create +*/ + +//#define USE_WORDS // Use words or dwords for box indices. Words save memory but seriously limit the max number of objects in the SAP. +#define USE_PREFETCH +#define USE_INTEGERS +#define PAIR_USER_DATA +#define USE_OVERLAP_TEST_ON_REMOVES // "Useless" but faster overall because seriously reduces number of calls (from ~10000 to ~3 sometimes!) +#define RELEASE_ON_RESET // Release memory instead of just doing a reset + +#include "OPC_ArraySAP.h" + +//#include "SAP_PairManager.h" +//#include "SAP_PairManager.cpp" + + +inline_ udword Hash(uword id0, uword id1) { return Hash32Bits_1( udword(id0)|(udword(id1)<<16) ); } +inline_ bool DifferentPair(const ASAP_Pair& p, uword id0, uword id1) { return (id0!=p.id0) || (id1!=p.id1); } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ASAP_PairManager::ASAP_PairManager() : + mHashSize (0), + mMask (0), + mHashTable (null), + mNext (null), + mNbActivePairs (0), + mActivePairs (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ASAP_PairManager::~ASAP_PairManager() +{ + Purge(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ASAP_PairManager::Purge() +{ + ICE_FREE(mNext); + ICE_FREE(mActivePairs); + ICE_FREE(mHashTable); + mHashSize = 0; + mMask = 0; + mNbActivePairs = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +const ASAP_Pair* ASAP_PairManager::FindPair(uword id0, uword id1) const +{ + if(!mHashTable) return null; // Nothing has been allocated yet + + // Order the ids + Sort(id0, id1); + + // Compute hash value for this pair + udword HashValue = Hash(id0, id1) & mMask; + + // Look for it in the table + udword Offset = mHashTable[HashValue]; + while(Offset!=INVALID_ID && DifferentPair(mActivePairs[Offset], id0, id1)) + { + ASSERT(mActivePairs[Offset].id0!=INVALID_USER_ID); + Offset = mNext[Offset]; // Better to have a separate array for this + } + if(Offset==INVALID_ID) return null; + ASSERT(Offset the pair is persistent + return &mActivePairs[Offset]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Internal version saving hash computation +inline_ ASAP_Pair* ASAP_PairManager::FindPair(uword id0, uword id1, udword hash_value) const +{ + if(!mHashTable) return null; // Nothing has been allocated yet + + // Look for it in the table + udword Offset = mHashTable[hash_value]; + while(Offset!=INVALID_ID && DifferentPair(mActivePairs[Offset], id0, id1)) + { + ASSERT(mActivePairs[Offset].id0!=INVALID_USER_ID); + Offset = mNext[Offset]; // Better to have a separate array for this + } + if(Offset==INVALID_ID) return null; + ASSERT(Offset the pair is persistent + return &mActivePairs[Offset]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +const ASAP_Pair* ASAP_PairManager::AddPair(uword id0, uword id1, const void* object0, const void* object1) +{ + // Order the ids + Sort(id0, id1, object0, object1); + + udword HashValue = Hash(id0, id1) & mMask; + + ASAP_Pair* P = FindPair(id0, id1, HashValue); + if(P) + { + return P; // Persistent pair + } + + // This is a new pair + if(mNbActivePairs >= mHashSize) + { + // Get more entries + mHashSize = NextPowerOfTwo(mNbActivePairs+1); + mMask = mHashSize-1; + + ReallocPairs(); + + // Recompute hash value with new hash size + HashValue = Hash(id0, id1) & mMask; + } + + ASAP_Pair* p = &mActivePairs[mNbActivePairs]; + p->id0 = id0; // ### CMOVs would be nice here + p->id1 = id1; + p->object0 = object0; + p->object1 = object1; + + mNext[mNbActivePairs] = mHashTable[HashValue]; + mHashTable[HashValue] = mNbActivePairs++; + return p; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ASAP_PairManager::RemovePair(uword id0, uword id1, udword hash_value, udword pair_index) +{ + // Walk the hash table to fix mNext + udword Offset = mHashTable[hash_value]; + ASSERT(Offset!=INVALID_ID); + + udword Previous=INVALID_ID; + while(Offset!=pair_index) + { + Previous = Offset; + Offset = mNext[Offset]; + } + + // Let us go/jump us + if(Previous!=INVALID_ID) + { + ASSERT(mNext[Previous]==pair_index); + mNext[Previous] = mNext[pair_index]; + } + // else we were the first + else mHashTable[hash_value] = mNext[pair_index]; + // we're now free to reuse mNext[PairIndex] without breaking the list + +#ifdef _DEBUG + mNext[pair_index]=INVALID_ID; +#endif + // Invalidate entry + + // Fill holes + if(1) + { + // 1) Remove last pair + const udword LastPairIndex = mNbActivePairs-1; + if(LastPairIndex==pair_index) + { + mNbActivePairs--; + } + else + { + const ASAP_Pair* Last = &mActivePairs[LastPairIndex]; + const udword LastHashValue = Hash(Last->id0, Last->id1) & mMask; + + // Walk the hash table to fix mNext + udword Offset = mHashTable[LastHashValue]; + ASSERT(Offset!=INVALID_ID); + + udword Previous=INVALID_ID; + while(Offset!=LastPairIndex) + { + Previous = Offset; + Offset = mNext[Offset]; + } + + // Let us go/jump us + if(Previous!=INVALID_ID) + { + ASSERT(mNext[Previous]==LastPairIndex); + mNext[Previous] = mNext[LastPairIndex]; + } + // else we were the first + else mHashTable[LastHashValue] = mNext[LastPairIndex]; + // we're now free to reuse mNext[LastPairIndex] without breaking the list + +#ifdef _DEBUG + mNext[LastPairIndex]=INVALID_ID; +#endif + + // Don't invalidate entry since we're going to shrink the array + + // 2) Re-insert in free slot + mActivePairs[pair_index] = mActivePairs[LastPairIndex]; +#ifdef _DEBUG + ASSERT(mNext[pair_index]==INVALID_ID); +#endif + mNext[pair_index] = mHashTable[LastHashValue]; + mHashTable[LastHashValue] = pair_index; + + mNbActivePairs--; + } + } +} + +bool ASAP_PairManager::RemovePair(uword id0, uword id1) +{ + // Order the ids + Sort(id0, id1); + + const udword HashValue = Hash(id0, id1) & mMask; + const ASAP_Pair* P = FindPair(id0, id1, HashValue); + if(!P) return false; + ASSERT(P->id0==id0); + ASSERT(P->id1==id1); + + RemovePair(id0, id1, HashValue, GetPairIndex(P)); + + ShrinkMemory(); + return true; +} + +bool ASAP_PairManager::RemovePairs(const BitArray& array) +{ + udword i=0; + while(i only less efficient but still ok + for(udword i=0;i>2; } + }; + + class Opcode::ASAP_Box : public Allocateable + { + public: + inline_ ASAP_Box() {} + inline_ ~ASAP_Box() {} + + IndexType mMin[3]; + IndexType mMax[3]; + void* mObject; + udword mGUID; + + inline_ ValType GetMaxValue(udword i, const ASAP_EndPoint* base) const + { + return base[mMax[i]].mValue; + } + + inline_ ValType GetMinValue(udword i, const ASAP_EndPoint* base) const + { + return base[mMin[i]].mValue; + } +#ifdef _DEBUG + bool HasBeenInserted() const + { + assert(mMin[0]!=INVALID_INDEX); + assert(mMax[0]!=INVALID_INDEX); + assert(mMin[1]!=INVALID_INDEX); + assert(mMax[1]!=INVALID_INDEX); + assert(mMin[2]!=INVALID_INDEX); + assert(mMax[2]!=INVALID_INDEX); + return true; + } +#endif + }; + +inline_ BOOL Intersect1D_Min(const SAP_AABB& a, const ASAP_Box& b, const ASAP_EndPoint* const base, udword axis) +{ + if(b.GetMaxValue(axis, base) < a.GetMin(axis)) + return FALSE; + return TRUE; +} + +inline_ BOOL Intersect2D(const ASAP_Box& c, const ASAP_Box& b, udword axis1, udword axis2) +{ + if( b.mMax[axis1] < c.mMin[axis1] || c.mMax[axis1] < b.mMin[axis1] + || b.mMax[axis2] < c.mMin[axis2] || c.mMax[axis2] < b.mMin[axis2]) return FALSE; + return TRUE; +} + + +ArraySAP::ArraySAP() +{ + mNbBoxes = 0; + mMaxNbBoxes = 0; + mBoxes = null; + mEndPoints[0] = mEndPoints[1] = mEndPoints[2] = null; + mFirstFree = INVALID_ID; +} + +ArraySAP::~ArraySAP() +{ + mNbBoxes = 0; + mMaxNbBoxes = 0; + DELETEARRAY(mBoxes); + for(udword i=0;i<3;i++) + { + DELETEARRAY(mEndPoints[i]); + } +} + +void ArraySAP::ResizeBoxArray() +{ + const udword NewMaxBoxes = mMaxNbBoxes ? mMaxNbBoxes*2 : 64; + + ASAP_Box* NewBoxes = ICE_NEW_TMP(ASAP_Box)[NewMaxBoxes]; + const udword NbSentinels=2; + ASAP_EndPoint* NewEndPointsX = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; + ASAP_EndPoint* NewEndPointsY = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; + ASAP_EndPoint* NewEndPointsZ = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; + + if(mNbBoxes) + { + CopyMemory(NewBoxes, mBoxes, sizeof(ASAP_Box)*mNbBoxes); + CopyMemory(NewEndPointsX, mEndPoints[0], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); + CopyMemory(NewEndPointsY, mEndPoints[1], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); + CopyMemory(NewEndPointsZ, mEndPoints[2], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); + } + else + { + // Initialize sentinels +#ifdef USE_INTEGERS + const udword Min = EncodeFloat(MIN_FLOAT); + const udword Max = EncodeFloat(MAX_FLOAT); +#else + const float Min = MIN_FLOAT; + const float Max = MAX_FLOAT; +#endif + NewEndPointsX[0].SetData(Min, INVALID_INDEX, FALSE); + NewEndPointsX[1].SetData(Max, INVALID_INDEX, TRUE); + NewEndPointsY[0].SetData(Min, INVALID_INDEX, FALSE); + NewEndPointsY[1].SetData(Max, INVALID_INDEX, TRUE); + NewEndPointsZ[0].SetData(Min, INVALID_INDEX, FALSE); + NewEndPointsZ[1].SetData(Max, INVALID_INDEX, TRUE); + } + DELETEARRAY(mBoxes); + DELETEARRAY(mEndPoints[2]); + DELETEARRAY(mEndPoints[1]); + DELETEARRAY(mEndPoints[0]); + mBoxes = NewBoxes; + mEndPoints[0] = NewEndPointsX; + mEndPoints[1] = NewEndPointsY; + mEndPoints[2] = NewEndPointsZ; + + mMaxNbBoxes = NewMaxBoxes; +} + +inline_ BOOL Intersect(const IAABB& a, const IAABB& b, udword axis) +{ + if(b.GetMax(axis) < a.GetMin(axis) || a.GetMax(axis) < b.GetMin(axis)) return FALSE; + return TRUE; +} + +// ### TODO: the sorts here might be useless, as the values have been sorted already +bool ArraySAP::CompleteBoxPruning2(udword nb, const IAABB* array, const Axes& axes, const CreateData* batched) +{ + // Checkings + if(!nb || !array) return false; + + // Catch axes + const udword Axis0 = axes.mAxis0; + const udword Axis1 = axes.mAxis1; + const udword Axis2 = axes.mAxis2; + + // Allocate some temporary data + udword* PosList = (udword*)ICE_ALLOC_TMP(sizeof(udword)*(nb+1)); + + // 1) Build main list using the primary axis + for(udword i=0;iSort(PosList, nb, RADIX_SIGNED).GetRanks(); + const udword* Sorted = RS->Sort(PosList, nb, RADIX_UNSIGNED).GetRanks(); + + // 3) Prune the list + const udword* const LastSorted = &Sorted[nb]; + const udword* RunningAddress = Sorted; + udword Index0, Index1; + while(RunningAddressmObject, Box1->mObject, Box0->mGUID, Box1->mGUID); + } + } + } + } + } + + ICE_FREE(PosList); + return true; +} + +bool ArraySAP::BipartiteBoxPruning2(udword nb0, const IAABB* array0, udword nb1, const IAABB* array1, const Axes& axes, const CreateData* batched, const udword* box_indices) +{ + // Checkings + if(!nb0 || !array0 || !nb1 || !array1) return false; + + // Catch axes + const udword Axis0 = axes.mAxis0; + const udword Axis1 = axes.mAxis1; + const udword Axis2 = axes.mAxis2; + + // Allocate some temporary data + udword* MinPosList0 = (udword*)ICE_ALLOC_TMP(sizeof(udword)*nb0); + udword* MinPosList1 = (udword*)ICE_ALLOC_TMP(sizeof(udword)*nb1); + + // 1) Build main lists using the primary axis + for(udword i=0;iSort(MinPosList0, nb0, RADIX_UNSIGNED).GetRanks(); + const udword* Sorted1 = RS1->Sort(MinPosList1, nb1, RADIX_UNSIGNED).GetRanks(); + + // 3) Prune the lists + udword Index0, Index1; + + const udword* const LastSorted0 = &Sorted0[nb0]; + const udword* const LastSorted1 = &Sorted1[nb1]; + const udword* RunningAddress0 = Sorted0; + const udword* RunningAddress1 = Sorted1; + + while(RunningAddress1mObject, Box1->mObject, Box0->mGUID, Box1->mGUID); + } + } + } + } + + //// + + while(RunningAddress0mObject, Box1->mObject, Box0->mGUID, Box1->mGUID); + } + } + + } + } + + ICE_FREE(MinPosList0); + ICE_FREE(MinPosList1); + return true; +} + +udword ArraySAP::AddObject(void* object, uword guid, const AABB& box) +{ + assert(!(size_t(object)&3)); // We will use the 2 LSBs + +#ifdef _DEBUG + int a = sizeof(ASAP_Box); // 32 + int b = sizeof(ASAP_EndPoint); // 8 +#endif + + udword BoxIndex; + if(mFirstFree!=INVALID_ID) + { + BoxIndex = mFirstFree; + mFirstFree = mBoxes[BoxIndex].mGUID; + } + else + { + if(mNbBoxes==mMaxNbBoxes) + ResizeBoxArray(); + BoxIndex = mNbBoxes; + } + + ASAP_Box* Box = &mBoxes[BoxIndex]; + // Initialize box + Box->mObject = object; + Box->mGUID = guid; + for(udword i=0;i<3;i++) + { + Box->mMin[i] = INVALID_INDEX; + Box->mMax[i] = INVALID_INDEX; + } + + mNbBoxes++; + + CreateData* CD = (CreateData*)mCreated.Reserve(sizeof(CreateData)/sizeof(udword)); + CD->mHandle = BoxIndex; + CD->mBox = box; + + return BoxIndex; +} + +void ArraySAP::InsertEndPoints(udword axis, const ASAP_EndPoint* end_points, udword nb_endpoints) +{ + ASAP_EndPoint* const BaseEP = mEndPoints[axis]; + + const udword OldSize = mNbBoxes*2 - nb_endpoints; + const udword NewSize = mNbBoxes*2; + + BaseEP[NewSize + 1] = BaseEP[OldSize + 1]; + + sdword WriteIdx = NewSize; + udword CurrInsIdx = 0; + + const ASAP_EndPoint* First = &BaseEP[0]; + const ASAP_EndPoint* Current = &BaseEP[OldSize]; + while(Current>=First) + { + const ASAP_EndPoint& Src = *Current; + const ASAP_EndPoint& Ins = end_points[CurrInsIdx]; + + // We need to make sure we insert maxs before mins to handle exactly equal endpoints correctly + const bool ShouldInsert = Ins.IsMax() ? (Src.mValue <= Ins.mValue) : (Src.mValue < Ins.mValue); + + const ASAP_EndPoint& Moved = ShouldInsert ? Ins : Src; + BaseEP[WriteIdx] = Moved; + mBoxes[Moved.GetOwner()].mMin[axis + Moved.IsMax()] = WriteIdx--; + + if(ShouldInsert) + { + CurrInsIdx++; + if(CurrInsIdx >= nb_endpoints) + break;//we just inserted the last endpoint + } + else + { + Current--; + } + } +} + +void ArraySAP::BatchCreate() +{ + udword NbBatched = mCreated.GetNbEntries(); + if(!NbBatched) return; // Early-exit if no object has been created + NbBatched /= sizeof(CreateData)/sizeof(udword); + const CreateData* Batched = (const CreateData*)mCreated.GetEntries(); + mCreated.Reset(); + + { + const udword NbEndPoints = NbBatched*2; + ASAP_EndPoint* NewEPSorted = ICE_NEW_TMP(ASAP_EndPoint)[NbEndPoints]; + ASAP_EndPoint* Buffer = (ASAP_EndPoint*)ICE_ALLOC_TMP(sizeof(ASAP_EndPoint)*NbEndPoints); + RadixSort RS; + + for(udword Axis=0;Axis<3;Axis++) + { + for(udword i=0;iHasBeenInserted()); + } + for(udword i=0;imMin[0]; + NewBoxes[i].mMaxX = Box->mMax[0]; + NewBoxes[i].mMinY = Box->mMin[1]; + NewBoxes[i].mMaxY = Box->mMax[1]; + NewBoxes[i].mMinZ = Box->mMin[2]; + NewBoxes[i].mMaxZ = Box->mMax[2]; + } + + CompleteBoxPruning2(NbBatched, NewBoxes, Axes(AXES_XZY), Batched); + + // the old boxes are not the first ones in the array + + const udword NbOldBoxes = mNbBoxes - NbBatched; + if(NbOldBoxes) + { + IAABB* OldBoxes = ICE_NEW_TMP(IAABB)[NbOldBoxes]; + udword* OldBoxesIndices = (udword*)ICE_ALLOC_TMP(sizeof(udword)*NbOldBoxes); + udword Offset=0; + udword i=0; + while(imMin[0]; + OldBoxes[i].mMaxX = Box->mMax[0]; + OldBoxes[i].mMinY = Box->mMin[1]; + OldBoxes[i].mMaxY = Box->mMax[1]; + OldBoxes[i].mMinZ = Box->mMin[2]; + OldBoxes[i].mMaxZ = Box->mMax[2]; + Offset++; + i++; + } + assert(i==NbOldBoxes); + + BipartiteBoxPruning2(NbBatched, NewBoxes, NbOldBoxes, OldBoxes, Axes(AXES_XZY), Batched, OldBoxesIndices); + + ICE_FREE(OldBoxesIndices); + DELETEARRAY(OldBoxes); + } + DELETEARRAY(NewBoxes); + } +#ifdef RELEASE_ON_RESET + mCreated.Empty(); +#endif +} + +void ArraySAP::BatchRemove() +{ + udword NbRemoved = mRemoved.GetNbEntries(); + if(!NbRemoved) return; // Early-exit if no object has been removed + const udword* Removed = mRemoved.GetEntries(); + mRemoved.Reset(); + + for(udword Axis=0;Axis<3;Axis++) + { + ASAP_EndPoint* const BaseEP = mEndPoints[Axis]; + udword MinMinIndex = MAX_UDWORD; + for(udword i=0;imMin[Axis]; + assert(MinIndexmMax[Axis]; + assert(MaxIndexmMin[Axis + BaseEP[DestIndex].IsMax()] = DestIndex; + } + } + DestIndex++; + ReadIndex++; + } + } + } + + BitArray BA(65536); + const udword Saved = NbRemoved; + while(NbRemoved--) + { + udword Index = *Removed++; + assert(IndexmGUID < 65536); + BA.SetBit(Object->mGUID); + + Object->mGUID = mFirstFree; + mFirstFree = Index; + } + mNbBoxes -= Saved; + mPairs.RemovePairs(BA); + +#ifdef RELEASE_ON_RESET + mRemoved.Empty(); +#endif +} + +bool ArraySAP::RemoveObject(udword handle) +{ + mRemoved.Add(handle); + return true; +} + +#ifdef USE_INTEGERS +bool ArraySAP::UpdateObject(udword handle, const AABB& box_) +#else +bool ArraySAP::UpdateObject(udword handle, const AABB& box) +#endif +{ + const ASAP_Box* Object = mBoxes + handle; + assert(Object->HasBeenInserted()); + const void* UserObject = Object->mObject; + const udword UserGUID = Object->mGUID; + +#ifdef USE_INTEGERS + IAABB box; + box.mMinX = EncodeFloat(box_.GetMin(0)); + box.mMinY = EncodeFloat(box_.GetMin(1)); + box.mMinZ = EncodeFloat(box_.GetMin(2)); + box.mMaxX = EncodeFloat(box_.GetMax(0)); + box.mMaxY = EncodeFloat(box_.GetMax(1)); + box.mMaxZ = EncodeFloat(box_.GetMax(2)); +#endif + + for(udword Axis=0;Axis<3;Axis++) + { + const udword Axis1 = (1 << Axis) & 3; + const udword Axis2 = (1 << Axis1) & 3; + + ASAP_EndPoint* const BaseEP = mEndPoints[Axis]; + + // Update min + { + ASAP_EndPoint* CurrentMin = BaseEP + Object->mMin[Axis]; + ASSERT(!CurrentMin->IsMax()); + + const ValType Limit = box.GetMin(Axis); + if(Limit < CurrentMin->mValue) + { + CurrentMin->mValue = Limit; + + // Min is moving left: + ASAP_EndPoint Saved = *CurrentMin; + udword EPIndex = (size_t(CurrentMin) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((--CurrentMin)->mValue > Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMin-1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMin->GetOwner(); + const BOOL IsMax = CurrentMin->IsMax(); + if(IsMax) + { + // Our min passed a max => start overlap + if(Object!=id1 + && Intersect2D(*Object, *id1, Axis1, Axis2) + && Intersect1D_Min(box, *id1, BaseEP, Axis) + ) + AddPair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex--; + *(CurrentMin+1) = *CurrentMin; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + else if(Limit > CurrentMin->mValue) + { + CurrentMin->mValue = Limit; + + // Min is moving right: + ASAP_EndPoint Saved = *CurrentMin; + udword EPIndex = (size_t(CurrentMin) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((++CurrentMin)->mValue < Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMin+1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMin->GetOwner(); + const BOOL IsMax = CurrentMin->IsMax(); + if(IsMax) + { + // Our min passed a max => stop overlap + if(Object!=id1 +#ifdef USE_OVERLAP_TEST_ON_REMOVES + && Intersect2D(*Object, *id1, Axis1, Axis2) +#endif + ) + RemovePair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex++; + *(CurrentMin-1) = *CurrentMin; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + } + + // Update max + { + ASAP_EndPoint* CurrentMax = BaseEP + Object->mMax[Axis]; + ASSERT(CurrentMax->IsMax()); + + const ValType Limit = box.GetMax(Axis); + if(Limit > CurrentMax->mValue) + { + CurrentMax->mValue = Limit; + + // Max is moving right: + ASAP_EndPoint Saved = *CurrentMax; + udword EPIndex = (size_t(CurrentMax) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((++CurrentMax)->mValue < Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMax+1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMax->GetOwner(); + const BOOL IsMax = CurrentMax->IsMax(); + if(!IsMax) + { + // Our max passed a min => start overlap + if(Object!=id1 + && Intersect2D(*Object, *id1, Axis1, Axis2) + && Intersect1D_Min(box, *id1, BaseEP, Axis) + ) + AddPair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex++; + *(CurrentMax-1) = *CurrentMax; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + else if(Limit < CurrentMax->mValue) + { + CurrentMax->mValue = Limit; + + // Max is moving left: + ASAP_EndPoint Saved = *CurrentMax; + udword EPIndex = (size_t(CurrentMax) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((--CurrentMax)->mValue > Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMax-1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMax->GetOwner(); + const BOOL IsMax = CurrentMax->IsMax(); + if(!IsMax) + { + // Our max passed a min => stop overlap + if(Object!=id1 +#ifdef USE_OVERLAP_TEST_ON_REMOVES + && Intersect2D(*Object, *id1, Axis1, Axis2) +#endif + ) + RemovePair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex--; + *(CurrentMax+1) = *CurrentMax; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + } + } + return true; +} + +udword ArraySAP::DumpPairs(SAP_CreatePair create_cb, SAP_DeletePair delete_cb, void* cb_user_data, ASAP_Pair** pairs) +{ + BatchCreate(); + + const udword* Entries = mData.GetEntries(); + const udword* Last = Entries + mData.GetNbEntries(); + mData.Reset(); + + udword* ToRemove = (udword*)Entries; + while(Entries!=Last) + { + const udword ID = *Entries++; + ASAP_Pair* UP = mPairs.mActivePairs + ID; + + { + ASSERT(UP->IsInArray()); + if(UP->IsRemoved()) + { + // No need to call "ClearInArray" in this case, since the pair will get removed anyway + + // Remove + if(delete_cb && !UP->IsNew()) + { +#ifdef PAIR_USER_DATA + (delete_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data, UP->userData); +#else + (delete_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data, null); +#endif + } + + *ToRemove++ = udword(UP->id0)<<16|UP->id1; + } + else + { + UP->ClearInArray(); + // Add => already there... Might want to create user data, though + if(UP->IsNew()) + { + if(create_cb) + { +#ifdef PAIR_USER_DATA + UP->userData = (create_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data); +#else + (create_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data); +#endif + } + UP->ClearNew(); + } + } + } + } + + // #### try batch removal here + Entries = mData.GetEntries(); + while(Entries!=ToRemove) + { + const udword ID = *Entries++; + const udword id0 = ID>>16; + const udword id1 = ID&0xffff; + bool Status = mPairs.RemovePair(id0, id1); + ASSERT(Status); + } + +#ifdef RELEASE_ON_RESET + mData.Empty(); +#endif + + BatchRemove(); + + if(pairs) *pairs = mPairs.mActivePairs; + + return mPairs.mNbActivePairs; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h b/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h index f9d370667..db3557181 100644 --- a/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h +++ b/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h @@ -1,159 +1,159 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an array-based version of the sweep-and-prune algorithm - * \file OPC_ArraySAP.h - * \author Pierre Terdiman - * \date December, 2, 2007 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef OPC_ARRAYSAP_H -#define OPC_ARRAYSAP_H - -#pragma pack(1) - struct OPCODE_API ASAP_Pair - { - uword id0; - uword id1; - const void* object0; - const void* object1; -//#ifdef PAIR_USER_DATA - void* userData; -//#endif - inline_ const void* GetObject0() const { return (const void*)(size_t(object0) & ~3); } - inline_ const void* GetObject1() const { return (const void*)(size_t(object1) & ~3); } - inline_ size_t IsInArray() const { return size_t(object0) & 1; } - inline_ size_t IsRemoved() const { return size_t(object1) & 1; } - inline_ size_t IsNew() const { return size_t(object0) & 2; } - private: - inline_ void SetInArray() { object0 = (const void*)(size_t(object0) | 1); } - inline_ void SetRemoved() { object1 = (const void*)(size_t(object1) | 1); } - inline_ void SetNew() { object0 = (const void*)(size_t(object0) | 2); } - inline_ void ClearInArray() { object0 = (const void*)(size_t(object0) & ~1); } - inline_ void ClearRemoved() { object1 = (const void*)(size_t(object1) & ~1); } - inline_ void ClearNew() { object0 = (const void*)(size_t(object0) & ~2); } - - friend class ArraySAP; - }; -#pragma pack() - - class OPCODE_API ASAP_PairManager - { - public: - ASAP_PairManager(); - ~ASAP_PairManager(); - - void Purge(); - void ShrinkMemory(); - - const ASAP_Pair* AddPair (uword id0, uword id1, const void* object0, const void* object1); - bool RemovePair (uword id0, uword id1); - bool RemovePairs (const BitArray& array); - const ASAP_Pair* FindPair (uword id0, uword id1) const; - inline_ udword GetPairIndex(const ASAP_Pair* pair) const - { - return ((udword)((size_t(pair) - size_t(mActivePairs)))/sizeof(ASAP_Pair)); - } - - udword mHashSize; - udword mMask; - udword mNbActivePairs; - udword* mHashTable; - udword* mNext; - ASAP_Pair* mActivePairs; - inline_ ASAP_Pair* FindPair(uword id0, uword id1, udword hash_value) const; - void RemovePair(uword id0, uword id1, udword hash_value, udword pair_index); - void ReallocPairs(); - }; - - typedef void* (*SAP_CreatePair)(const void* object0, const void* object1, void* user_data); - typedef void (*SAP_DeletePair)(const void* object0, const void* object1, void* user_data, void* pair_user_data); - - // Forward declarations - class ASAP_EndPoint; - class ASAP_Box; - struct IAABB; - struct CreateData; - - class OPCODE_API ArraySAP : public Allocateable - { - public: - ArraySAP(); - ~ArraySAP(); - - udword AddObject(void* object, uword guid, const AABB& box); - bool RemoveObject(udword handle); - bool UpdateObject(udword handle, const AABB& box); - - udword DumpPairs(SAP_CreatePair create_cb, SAP_DeletePair delete_cb, void* cb_user_data, ASAP_Pair** pairs=null); - private: - Container mData; - ASAP_PairManager mPairs; - - inline_ void AddPair(const void* object0, const void* object1, uword id0, uword id1) - { - ASSERT(object0); - ASAP_Pair* UP = (ASAP_Pair*)mPairs.AddPair(id0, id1, null, null); - ASSERT(UP); - - if(UP->object0) - { - // Persistent pair - } - else - { - // New pair - ASSERT(!(int(object0)&1)); - ASSERT(!(int(object1)&1)); - UP->object0 = object0; - UP->object1 = object1; - UP->SetInArray(); - mData.Add(mPairs.GetPairIndex(UP)); - UP->SetNew(); - } - UP->ClearRemoved(); - } - - inline_ void RemovePair(const void* object0, const void* object1, uword id0, uword id1) - { - ASAP_Pair* UP = (ASAP_Pair*)mPairs.FindPair(id0, id1); - if(UP) - { - if(!UP->IsInArray()) - { - UP->SetInArray(); - mData.Add(mPairs.GetPairIndex(UP)); - } - UP->SetRemoved(); - } - } - - udword mNbBoxes; - udword mMaxNbBoxes; - ASAP_Box* mBoxes; - ASAP_EndPoint* mEndPoints[3]; - udword mFirstFree; - - void ResizeBoxArray(); - // For batch creation - Container mCreated; - void BatchCreate(); - void InsertEndPoints(udword axis, const ASAP_EndPoint* end_points, udword nb_endpoints); - bool CompleteBoxPruning2(udword nb, const IAABB* array, const Axes& axes, const CreateData* batched); - bool BipartiteBoxPruning2(udword nb0, const IAABB* array0, udword nb1, const IAABB* array1, const Axes& axes, const CreateData* batched, const udword* box_indices); - // For batch removal - Container mRemoved; - void BatchRemove(); - }; - -#endif // OPC_ARRAYSAP_H +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* + * OPCODE - Optimized Collision Detection + * Copyright (C) 2001 Pierre Terdiman + * Homepage: http://www.codercorner.com/Opcode.htm + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an array-based version of the sweep-and-prune algorithm + * \file OPC_ArraySAP.h + * \author Pierre Terdiman + * \date December, 2, 2007 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef OPC_ARRAYSAP_H +#define OPC_ARRAYSAP_H + +#pragma pack(1) + struct OPCODE_API ASAP_Pair + { + uword id0; + uword id1; + const void* object0; + const void* object1; +//#ifdef PAIR_USER_DATA + void* userData; +//#endif + inline_ const void* GetObject0() const { return (const void*)(size_t(object0) & ~3); } + inline_ const void* GetObject1() const { return (const void*)(size_t(object1) & ~3); } + inline_ size_t IsInArray() const { return size_t(object0) & 1; } + inline_ size_t IsRemoved() const { return size_t(object1) & 1; } + inline_ size_t IsNew() const { return size_t(object0) & 2; } + private: + inline_ void SetInArray() { object0 = (const void*)(size_t(object0) | 1); } + inline_ void SetRemoved() { object1 = (const void*)(size_t(object1) | 1); } + inline_ void SetNew() { object0 = (const void*)(size_t(object0) | 2); } + inline_ void ClearInArray() { object0 = (const void*)(size_t(object0) & ~1); } + inline_ void ClearRemoved() { object1 = (const void*)(size_t(object1) & ~1); } + inline_ void ClearNew() { object0 = (const void*)(size_t(object0) & ~2); } + + friend class ArraySAP; + }; +#pragma pack() + + class OPCODE_API ASAP_PairManager + { + public: + ASAP_PairManager(); + ~ASAP_PairManager(); + + void Purge(); + void ShrinkMemory(); + + const ASAP_Pair* AddPair (uword id0, uword id1, const void* object0, const void* object1); + bool RemovePair (uword id0, uword id1); + bool RemovePairs (const BitArray& array); + const ASAP_Pair* FindPair (uword id0, uword id1) const; + inline_ udword GetPairIndex(const ASAP_Pair* pair) const + { + return ((udword)((size_t(pair) - size_t(mActivePairs)))/sizeof(ASAP_Pair)); + } + + udword mHashSize; + udword mMask; + udword mNbActivePairs; + udword* mHashTable; + udword* mNext; + ASAP_Pair* mActivePairs; + inline_ ASAP_Pair* FindPair(uword id0, uword id1, udword hash_value) const; + void RemovePair(uword id0, uword id1, udword hash_value, udword pair_index); + void ReallocPairs(); + }; + + typedef void* (*SAP_CreatePair)(const void* object0, const void* object1, void* user_data); + typedef void (*SAP_DeletePair)(const void* object0, const void* object1, void* user_data, void* pair_user_data); + + // Forward declarations + class ASAP_EndPoint; + class ASAP_Box; + struct IAABB; + struct CreateData; + + class OPCODE_API ArraySAP : public Allocateable + { + public: + ArraySAP(); + ~ArraySAP(); + + udword AddObject(void* object, uword guid, const AABB& box); + bool RemoveObject(udword handle); + bool UpdateObject(udword handle, const AABB& box); + + udword DumpPairs(SAP_CreatePair create_cb, SAP_DeletePair delete_cb, void* cb_user_data, ASAP_Pair** pairs=null); + private: + Container mData; + ASAP_PairManager mPairs; + + inline_ void AddPair(const void* object0, const void* object1, uword id0, uword id1) + { + ASSERT(object0); + ASAP_Pair* UP = (ASAP_Pair*)mPairs.AddPair(id0, id1, null, null); + ASSERT(UP); + + if(UP->object0) + { + // Persistent pair + } + else + { + // New pair + ASSERT(!(int(object0)&1)); + ASSERT(!(int(object1)&1)); + UP->object0 = object0; + UP->object1 = object1; + UP->SetInArray(); + mData.Add(mPairs.GetPairIndex(UP)); + UP->SetNew(); + } + UP->ClearRemoved(); + } + + inline_ void RemovePair(const void* object0, const void* object1, uword id0, uword id1) + { + ASAP_Pair* UP = (ASAP_Pair*)mPairs.FindPair(id0, id1); + if(UP) + { + if(!UP->IsInArray()) + { + UP->SetInArray(); + mData.Add(mPairs.GetPairIndex(UP)); + } + UP->SetRemoved(); + } + } + + udword mNbBoxes; + udword mMaxNbBoxes; + ASAP_Box* mBoxes; + ASAP_EndPoint* mEndPoints[3]; + udword mFirstFree; + + void ResizeBoxArray(); + // For batch creation + Container mCreated; + void BatchCreate(); + void InsertEndPoints(udword axis, const ASAP_EndPoint* end_points, udword nb_endpoints); + bool CompleteBoxPruning2(udword nb, const IAABB* array, const Axes& axes, const CreateData* batched); + bool BipartiteBoxPruning2(udword nb0, const IAABB* array0, udword nb1, const IAABB* array1, const Axes& axes, const CreateData* batched, const udword* box_indices); + // For batch removal + Container mRemoved; + void BatchRemove(); + }; + +#endif // OPC_ARRAYSAP_H diff --git a/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp b/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp index 9bee0f961..bdb2ae8e7 100644 --- a/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp @@ -1,147 +1,147 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base model interface. - * \file OPC_BaseModel.cpp - * \author Pierre Terdiman - * \date May, 18, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * The base class for collision models. - * - * \class BaseModel - * \author Pierre Terdiman - * \version 1.3 - * \date May, 18, 2003 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -OPCODECREATE::OPCODECREATE() -{ - mIMesh = null; - mSettings.mRules = SPLIT_SPLATTER_POINTS | SPLIT_GEOM_CENTER; - mSettings.mLimit = 1; // Mandatory for complete trees - mNoLeaf = true; - mQuantized = true; -#ifdef __MESHMERIZER_H__ - mCollisionHull = false; -#endif // __MESHMERIZER_H__ - mKeepOriginal = false; - mCanRemap = false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BaseModel::BaseModel() : mIMesh(null), mModelCode(0), mSource(null), mTree(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BaseModel::~BaseModel() -{ - ReleaseBase(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Releases everything. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void BaseModel::ReleaseBase() -{ - DELETESINGLE(mSource); - DELETESINGLE(mTree); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Creates an optimized tree according to user-settings, and setups mModelCode. - * \param no_leaf [in] true for "no leaf" tree - * \param quantized [in] true for quantized tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool BaseModel::CreateTree(bool no_leaf, bool quantized) -{ - DELETESINGLE(mTree); - - // Setup model code - if(no_leaf) mModelCode |= OPC_NO_LEAF; - else mModelCode &= ~OPC_NO_LEAF; - - if(quantized) mModelCode |= OPC_QUANTIZED; - else mModelCode &= ~OPC_QUANTIZED; - - // Create the correct class - if(mModelCode & OPC_NO_LEAF) - { - if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedNoLeafTree; - else mTree = new AABBNoLeafTree; - } - else - { - if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedTree; - else mTree = new AABBCollisionTree; - } - CHECKALLOC(mTree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool BaseModel::Refit() -{ - // Refit the optimized tree - return mTree->Refit(mIMesh); - -// Old code kept for reference : refit the source tree then rebuild ! -// if(!mSource) return false; -// // Ouch... -// mSource->Refit(&mTB); -// // Ouch... -// return mTree->Build(mSource); -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base model interface. + * \file OPC_BaseModel.cpp + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * The base class for collision models. + * + * \class BaseModel + * \author Pierre Terdiman + * \version 1.3 + * \date May, 18, 2003 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OPCODECREATE::OPCODECREATE() +{ + mIMesh = null; + mSettings.mRules = SPLIT_SPLATTER_POINTS | SPLIT_GEOM_CENTER; + mSettings.mLimit = 1; // Mandatory for complete trees + mNoLeaf = true; + mQuantized = true; +#ifdef __MESHMERIZER_H__ + mCollisionHull = false; +#endif // __MESHMERIZER_H__ + mKeepOriginal = false; + mCanRemap = false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BaseModel::BaseModel() : mIMesh(null), mModelCode(0), mSource(null), mTree(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BaseModel::~BaseModel() +{ + ReleaseBase(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases everything. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void BaseModel::ReleaseBase() +{ + DELETESINGLE(mSource); + DELETESINGLE(mTree); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Creates an optimized tree according to user-settings, and setups mModelCode. + * \param no_leaf [in] true for "no leaf" tree + * \param quantized [in] true for quantized tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool BaseModel::CreateTree(bool no_leaf, bool quantized) +{ + DELETESINGLE(mTree); + + // Setup model code + if(no_leaf) mModelCode |= OPC_NO_LEAF; + else mModelCode &= ~OPC_NO_LEAF; + + if(quantized) mModelCode |= OPC_QUANTIZED; + else mModelCode &= ~OPC_QUANTIZED; + + // Create the correct class + if(mModelCode & OPC_NO_LEAF) + { + if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedNoLeafTree; + else mTree = new AABBNoLeafTree; + } + else + { + if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedTree; + else mTree = new AABBCollisionTree; + } + CHECKALLOC(mTree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool BaseModel::Refit() +{ + // Refit the optimized tree + return mTree->Refit(mIMesh); + +// Old code kept for reference : refit the source tree then rebuild ! +// if(!mSource) return false; +// // Ouch... +// mSource->Refit(&mTB); +// // Ouch... +// return mTree->Build(mSource); +} diff --git a/Extras/CDTestFramework/Opcode/OPC_BaseModel.h b/Extras/CDTestFramework/Opcode/OPC_BaseModel.h index 416d74efe..905fc92a0 100644 --- a/Extras/CDTestFramework/Opcode/OPC_BaseModel.h +++ b/Extras/CDTestFramework/Opcode/OPC_BaseModel.h @@ -1,184 +1,184 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base model interface. - * \file OPC_BaseModel.h - * \author Pierre Terdiman - * \date May, 18, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_BASEMODEL_H__ -#define __OPC_BASEMODEL_H__ - - //! Model creation structure - struct OPCODE_API OPCODECREATE - { - //! Constructor - OPCODECREATE(); - - MeshInterface* mIMesh; //!< Mesh interface (access to triangles & vertices) (*) - BuildSettings mSettings; //!< Builder's settings - bool mNoLeaf; //!< true => discard leaf nodes (else use a normal tree) - bool mQuantized; //!< true => quantize the tree (else use a normal tree) -#ifdef __MESHMERIZER_H__ - bool mCollisionHull; //!< true => use convex hull + GJK -#endif // __MESHMERIZER_H__ - bool mKeepOriginal; //!< true => keep a copy of the original tree (debug purpose) - bool mCanRemap; //!< true => allows OPCODE to reorganize client arrays - - // (*) This pointer is saved internally and used by OPCODE until collision structures are released, - // so beware of the object's lifetime. - }; - - enum ModelFlag - { - OPC_QUANTIZED = (1<<0), //!< Compressed/uncompressed tree - OPC_NO_LEAF = (1<<1), //!< Leaf/NoLeaf tree - OPC_SINGLE_NODE = (1<<2) //!< Special case for 1-node models - }; - - class OPCODE_API BaseModel - { - public: - // Constructor/Destructor - BaseModel(); - virtual ~BaseModel(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Build(const OPCODECREATE& create) = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual udword GetUsedBytes() const = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Refit(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the source tree. - * \return generic tree - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const AABBTree* GetSourceTree() const { return mSource; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the tree. - * \return the collision tree - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const AABBOptimizedTree* GetTree() const { return mTree; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the tree. - * \return the collision tree - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ AABBOptimizedTree* GetTree() { return mTree; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of nodes in the tree. - * Should be 2*N-1 for normal trees and N-1 for optimized ones. - * \return number of nodes - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbNodes() const { return mTree->GetNbNodes(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks whether the tree has leaf nodes or not. - * \return true if the tree has leaf nodes (normal tree), else false (optimized tree) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL HasLeafNodes() const { return !(mModelCode & OPC_NO_LEAF); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks whether the tree is quantized or not. - * \return true if the tree is quantized - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsQuantized() const { return mModelCode & OPC_QUANTIZED; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks whether the model has a single node or not. This special case must be handled separately. - * \return true if the model has only 1 node - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL HasSingleNode() const { return mModelCode & OPC_SINGLE_NODE; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the model's code. - * \return model's code - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetModelCode() const { return mModelCode; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the mesh interface. - * \return mesh interface - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const MeshInterface* GetMeshInterface() const { return mIMesh; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Sets the mesh interface. - * \param imesh [in] mesh interface - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetMeshInterface(const MeshInterface* imesh) { mIMesh = imesh; } - - protected: - const MeshInterface* mIMesh; //!< User-defined mesh interface - udword mModelCode; //!< Model code = combination of ModelFlag(s) - AABBTree* mSource; //!< Original source tree - AABBOptimizedTree* mTree; //!< Optimized tree owned by the model - // Internal methods - void ReleaseBase(); - bool CreateTree(bool no_leaf, bool quantized); - }; - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base model interface. + * \file OPC_BaseModel.h + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_BASEMODEL_H__ +#define __OPC_BASEMODEL_H__ + + //! Model creation structure + struct OPCODE_API OPCODECREATE + { + //! Constructor + OPCODECREATE(); + + MeshInterface* mIMesh; //!< Mesh interface (access to triangles & vertices) (*) + BuildSettings mSettings; //!< Builder's settings + bool mNoLeaf; //!< true => discard leaf nodes (else use a normal tree) + bool mQuantized; //!< true => quantize the tree (else use a normal tree) +#ifdef __MESHMERIZER_H__ + bool mCollisionHull; //!< true => use convex hull + GJK +#endif // __MESHMERIZER_H__ + bool mKeepOriginal; //!< true => keep a copy of the original tree (debug purpose) + bool mCanRemap; //!< true => allows OPCODE to reorganize client arrays + + // (*) This pointer is saved internally and used by OPCODE until collision structures are released, + // so beware of the object's lifetime. + }; + + enum ModelFlag + { + OPC_QUANTIZED = (1<<0), //!< Compressed/uncompressed tree + OPC_NO_LEAF = (1<<1), //!< Leaf/NoLeaf tree + OPC_SINGLE_NODE = (1<<2) //!< Special case for 1-node models + }; + + class OPCODE_API BaseModel + { + public: + // Constructor/Destructor + BaseModel(); + virtual ~BaseModel(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Build(const OPCODECREATE& create) = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual udword GetUsedBytes() const = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Refit(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the source tree. + * \return generic tree + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const AABBTree* GetSourceTree() const { return mSource; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the tree. + * \return the collision tree + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const AABBOptimizedTree* GetTree() const { return mTree; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the tree. + * \return the collision tree + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ AABBOptimizedTree* GetTree() { return mTree; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of nodes in the tree. + * Should be 2*N-1 for normal trees and N-1 for optimized ones. + * \return number of nodes + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbNodes() const { return mTree->GetNbNodes(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks whether the tree has leaf nodes or not. + * \return true if the tree has leaf nodes (normal tree), else false (optimized tree) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL HasLeafNodes() const { return !(mModelCode & OPC_NO_LEAF); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks whether the tree is quantized or not. + * \return true if the tree is quantized + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsQuantized() const { return mModelCode & OPC_QUANTIZED; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks whether the model has a single node or not. This special case must be handled separately. + * \return true if the model has only 1 node + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL HasSingleNode() const { return mModelCode & OPC_SINGLE_NODE; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the model's code. + * \return model's code + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetModelCode() const { return mModelCode; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the mesh interface. + * \return mesh interface + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const MeshInterface* GetMeshInterface() const { return mIMesh; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Sets the mesh interface. + * \param imesh [in] mesh interface + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetMeshInterface(const MeshInterface* imesh) { mIMesh = imesh; } + + protected: + const MeshInterface* mIMesh; //!< User-defined mesh interface + udword mModelCode; //!< Model code = combination of ModelFlag(s) + AABBTree* mSource; //!< Original source tree + AABBOptimizedTree* mTree; //!< Optimized tree owned by the model + // Internal methods + void ReleaseBase(); + bool CreateTree(bool no_leaf, bool quantized); + }; + #endif //__OPC_BASEMODEL_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h b/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h index 1aca02cbd..63aa87ec1 100644 --- a/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h @@ -1,139 +1,139 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * OBB-OBB overlap test using the separating axis theorem. - * - original code by Gomez / Gamasutra (similar to Gottschalk's one in RAPID) - * - optimized for AABB trees by computing the rotation matrix once (SOLID-fashion) - * - the fabs matrix is precomputed as well and epsilon-tweaked (RAPID-style, we found this almost mandatory) - * - Class III axes can be disabled... (SOLID & Intel fashion) - * - ...or enabled to perform some profiling - * - CPU comparisons used when appropriate - * - lazy evaluation sometimes saves some work in case of early exits (unlike SOLID) - * - * \param ea [in] extents from box A - * \param ca [in] center from box A - * \param eb [in] extents from box B - * \param cb [in] center from box B - * \return true if boxes overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBTreeCollider::BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb) -{ - // Stats - mNbBVBVTests++; - - float t,t2; - - // Class I : A's basis vectors - float Tx = (mR1to0.m[0][0]*cb.x + mR1to0.m[1][0]*cb.y + mR1to0.m[2][0]*cb.z) + mT1to0.x - ca.x; - t = ea.x + eb.x*mAR.m[0][0] + eb.y*mAR.m[1][0] + eb.z*mAR.m[2][0]; - if(GREATER(Tx, t)) return FALSE; - - float Ty = (mR1to0.m[0][1]*cb.x + mR1to0.m[1][1]*cb.y + mR1to0.m[2][1]*cb.z) + mT1to0.y - ca.y; - t = ea.y + eb.x*mAR.m[0][1] + eb.y*mAR.m[1][1] + eb.z*mAR.m[2][1]; - if(GREATER(Ty, t)) return FALSE; - - float Tz = (mR1to0.m[0][2]*cb.x + mR1to0.m[1][2]*cb.y + mR1to0.m[2][2]*cb.z) + mT1to0.z - ca.z; - t = ea.z + eb.x*mAR.m[0][2] + eb.y*mAR.m[1][2] + eb.z*mAR.m[2][2]; - if(GREATER(Tz, t)) return FALSE; - - // Class II : B's basis vectors - t = Tx*mR1to0.m[0][0] + Ty*mR1to0.m[0][1] + Tz*mR1to0.m[0][2]; t2 = ea.x*mAR.m[0][0] + ea.y*mAR.m[0][1] + ea.z*mAR.m[0][2] + eb.x; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mR1to0.m[1][0] + Ty*mR1to0.m[1][1] + Tz*mR1to0.m[1][2]; t2 = ea.x*mAR.m[1][0] + ea.y*mAR.m[1][1] + ea.z*mAR.m[1][2] + eb.y; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mR1to0.m[2][0] + Ty*mR1to0.m[2][1] + Tz*mR1to0.m[2][2]; t2 = ea.x*mAR.m[2][0] + ea.y*mAR.m[2][1] + ea.z*mAR.m[2][2] + eb.z; - if(GREATER(t, t2)) return FALSE; - - // Class III : 9 cross products - // Cool trick: always perform the full test for first level, regardless of settings. - // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! - if(mFullBoxBoxTest || mNbBVBVTests==1) - { - t = Tz*mR1to0.m[0][1] - Ty*mR1to0.m[0][2]; t2 = ea.y*mAR.m[0][2] + ea.z*mAR.m[0][1] + eb.y*mAR.m[2][0] + eb.z*mAR.m[1][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 - t = Tz*mR1to0.m[1][1] - Ty*mR1to0.m[1][2]; t2 = ea.y*mAR.m[1][2] + ea.z*mAR.m[1][1] + eb.x*mAR.m[2][0] + eb.z*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 - t = Tz*mR1to0.m[2][1] - Ty*mR1to0.m[2][2]; t2 = ea.y*mAR.m[2][2] + ea.z*mAR.m[2][1] + eb.x*mAR.m[1][0] + eb.y*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 - t = Tx*mR1to0.m[0][2] - Tz*mR1to0.m[0][0]; t2 = ea.x*mAR.m[0][2] + ea.z*mAR.m[0][0] + eb.y*mAR.m[2][1] + eb.z*mAR.m[1][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 - t = Tx*mR1to0.m[1][2] - Tz*mR1to0.m[1][0]; t2 = ea.x*mAR.m[1][2] + ea.z*mAR.m[1][0] + eb.x*mAR.m[2][1] + eb.z*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 - t = Tx*mR1to0.m[2][2] - Tz*mR1to0.m[2][0]; t2 = ea.x*mAR.m[2][2] + ea.z*mAR.m[2][0] + eb.x*mAR.m[1][1] + eb.y*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 - t = Ty*mR1to0.m[0][0] - Tx*mR1to0.m[0][1]; t2 = ea.x*mAR.m[0][1] + ea.y*mAR.m[0][0] + eb.y*mAR.m[2][2] + eb.z*mAR.m[1][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 - t = Ty*mR1to0.m[1][0] - Tx*mR1to0.m[1][1]; t2 = ea.x*mAR.m[1][1] + ea.y*mAR.m[1][0] + eb.x*mAR.m[2][2] + eb.z*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 - t = Ty*mR1to0.m[2][0] - Tx*mR1to0.m[2][1]; t2 = ea.x*mAR.m[2][1] + ea.y*mAR.m[2][0] + eb.x*mAR.m[1][2] + eb.y*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 - } - return TRUE; -} - -//! A dedicated version when one box is constant -inline_ BOOL OBBCollider::BoxBoxOverlap(const Point& extents, const Point& center) -{ - // Stats - mNbVolumeBVTests++; - - float t,t2; - - // Class I : A's basis vectors - float Tx = mTBoxToModel.x - center.x; t = extents.x + mBBx1; if(GREATER(Tx, t)) return FALSE; - float Ty = mTBoxToModel.y - center.y; t = extents.y + mBBy1; if(GREATER(Ty, t)) return FALSE; - float Tz = mTBoxToModel.z - center.z; t = extents.z + mBBz1; if(GREATER(Tz, t)) return FALSE; - - // Class II : B's basis vectors - t = Tx*mRBoxToModel.m[0][0] + Ty*mRBoxToModel.m[0][1] + Tz*mRBoxToModel.m[0][2]; - t2 = extents.x*mAR.m[0][0] + extents.y*mAR.m[0][1] + extents.z*mAR.m[0][2] + mBoxExtents.x; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mRBoxToModel.m[1][0] + Ty*mRBoxToModel.m[1][1] + Tz*mRBoxToModel.m[1][2]; - t2 = extents.x*mAR.m[1][0] + extents.y*mAR.m[1][1] + extents.z*mAR.m[1][2] + mBoxExtents.y; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mRBoxToModel.m[2][0] + Ty*mRBoxToModel.m[2][1] + Tz*mRBoxToModel.m[2][2]; - t2 = extents.x*mAR.m[2][0] + extents.y*mAR.m[2][1] + extents.z*mAR.m[2][2] + mBoxExtents.z; - if(GREATER(t, t2)) return FALSE; - - // Class III : 9 cross products - // Cool trick: always perform the full test for first level, regardless of settings. - // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! - if(mFullBoxBoxTest || mNbVolumeBVTests==1) - { - t = Tz*mRBoxToModel.m[0][1] - Ty*mRBoxToModel.m[0][2]; t2 = extents.y*mAR.m[0][2] + extents.z*mAR.m[0][1] + mBB_1; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 - t = Tz*mRBoxToModel.m[1][1] - Ty*mRBoxToModel.m[1][2]; t2 = extents.y*mAR.m[1][2] + extents.z*mAR.m[1][1] + mBB_2; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 - t = Tz*mRBoxToModel.m[2][1] - Ty*mRBoxToModel.m[2][2]; t2 = extents.y*mAR.m[2][2] + extents.z*mAR.m[2][1] + mBB_3; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 - t = Tx*mRBoxToModel.m[0][2] - Tz*mRBoxToModel.m[0][0]; t2 = extents.x*mAR.m[0][2] + extents.z*mAR.m[0][0] + mBB_4; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 - t = Tx*mRBoxToModel.m[1][2] - Tz*mRBoxToModel.m[1][0]; t2 = extents.x*mAR.m[1][2] + extents.z*mAR.m[1][0] + mBB_5; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 - t = Tx*mRBoxToModel.m[2][2] - Tz*mRBoxToModel.m[2][0]; t2 = extents.x*mAR.m[2][2] + extents.z*mAR.m[2][0] + mBB_6; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 - t = Ty*mRBoxToModel.m[0][0] - Tx*mRBoxToModel.m[0][1]; t2 = extents.x*mAR.m[0][1] + extents.y*mAR.m[0][0] + mBB_7; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 - t = Ty*mRBoxToModel.m[1][0] - Tx*mRBoxToModel.m[1][1]; t2 = extents.x*mAR.m[1][1] + extents.y*mAR.m[1][0] + mBB_8; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 - t = Ty*mRBoxToModel.m[2][0] - Tx*mRBoxToModel.m[2][1]; t2 = extents.x*mAR.m[2][1] + extents.y*mAR.m[2][0] + mBB_9; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 - } - return TRUE; -} - -//! A special version for 2 axis-aligned boxes -inline_ BOOL AABBCollider::AABBAABBOverlap(const Point& extents, const Point& center) -{ - // Stats - mNbVolumeBVTests++; - - float tx = mBox.mCenter.x - center.x; float ex = extents.x + mBox.mExtents.x; if(GREATER(tx, ex)) return FALSE; - float ty = mBox.mCenter.y - center.y; float ey = extents.y + mBox.mExtents.y; if(GREATER(ty, ey)) return FALSE; - float tz = mBox.mCenter.z - center.z; float ez = extents.z + mBox.mExtents.z; if(GREATER(tz, ez)) return FALSE; - - return TRUE; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * OBB-OBB overlap test using the separating axis theorem. + * - original code by Gomez / Gamasutra (similar to Gottschalk's one in RAPID) + * - optimized for AABB trees by computing the rotation matrix once (SOLID-fashion) + * - the fabs matrix is precomputed as well and epsilon-tweaked (RAPID-style, we found this almost mandatory) + * - Class III axes can be disabled... (SOLID & Intel fashion) + * - ...or enabled to perform some profiling + * - CPU comparisons used when appropriate + * - lazy evaluation sometimes saves some work in case of early exits (unlike SOLID) + * + * \param ea [in] extents from box A + * \param ca [in] center from box A + * \param eb [in] extents from box B + * \param cb [in] center from box B + * \return true if boxes overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBTreeCollider::BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb) +{ + // Stats + mNbBVBVTests++; + + float t,t2; + + // Class I : A's basis vectors + float Tx = (mR1to0.m[0][0]*cb.x + mR1to0.m[1][0]*cb.y + mR1to0.m[2][0]*cb.z) + mT1to0.x - ca.x; + t = ea.x + eb.x*mAR.m[0][0] + eb.y*mAR.m[1][0] + eb.z*mAR.m[2][0]; + if(GREATER(Tx, t)) return FALSE; + + float Ty = (mR1to0.m[0][1]*cb.x + mR1to0.m[1][1]*cb.y + mR1to0.m[2][1]*cb.z) + mT1to0.y - ca.y; + t = ea.y + eb.x*mAR.m[0][1] + eb.y*mAR.m[1][1] + eb.z*mAR.m[2][1]; + if(GREATER(Ty, t)) return FALSE; + + float Tz = (mR1to0.m[0][2]*cb.x + mR1to0.m[1][2]*cb.y + mR1to0.m[2][2]*cb.z) + mT1to0.z - ca.z; + t = ea.z + eb.x*mAR.m[0][2] + eb.y*mAR.m[1][2] + eb.z*mAR.m[2][2]; + if(GREATER(Tz, t)) return FALSE; + + // Class II : B's basis vectors + t = Tx*mR1to0.m[0][0] + Ty*mR1to0.m[0][1] + Tz*mR1to0.m[0][2]; t2 = ea.x*mAR.m[0][0] + ea.y*mAR.m[0][1] + ea.z*mAR.m[0][2] + eb.x; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mR1to0.m[1][0] + Ty*mR1to0.m[1][1] + Tz*mR1to0.m[1][2]; t2 = ea.x*mAR.m[1][0] + ea.y*mAR.m[1][1] + ea.z*mAR.m[1][2] + eb.y; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mR1to0.m[2][0] + Ty*mR1to0.m[2][1] + Tz*mR1to0.m[2][2]; t2 = ea.x*mAR.m[2][0] + ea.y*mAR.m[2][1] + ea.z*mAR.m[2][2] + eb.z; + if(GREATER(t, t2)) return FALSE; + + // Class III : 9 cross products + // Cool trick: always perform the full test for first level, regardless of settings. + // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! + if(mFullBoxBoxTest || mNbBVBVTests==1) + { + t = Tz*mR1to0.m[0][1] - Ty*mR1to0.m[0][2]; t2 = ea.y*mAR.m[0][2] + ea.z*mAR.m[0][1] + eb.y*mAR.m[2][0] + eb.z*mAR.m[1][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 + t = Tz*mR1to0.m[1][1] - Ty*mR1to0.m[1][2]; t2 = ea.y*mAR.m[1][2] + ea.z*mAR.m[1][1] + eb.x*mAR.m[2][0] + eb.z*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 + t = Tz*mR1to0.m[2][1] - Ty*mR1to0.m[2][2]; t2 = ea.y*mAR.m[2][2] + ea.z*mAR.m[2][1] + eb.x*mAR.m[1][0] + eb.y*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 + t = Tx*mR1to0.m[0][2] - Tz*mR1to0.m[0][0]; t2 = ea.x*mAR.m[0][2] + ea.z*mAR.m[0][0] + eb.y*mAR.m[2][1] + eb.z*mAR.m[1][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 + t = Tx*mR1to0.m[1][2] - Tz*mR1to0.m[1][0]; t2 = ea.x*mAR.m[1][2] + ea.z*mAR.m[1][0] + eb.x*mAR.m[2][1] + eb.z*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 + t = Tx*mR1to0.m[2][2] - Tz*mR1to0.m[2][0]; t2 = ea.x*mAR.m[2][2] + ea.z*mAR.m[2][0] + eb.x*mAR.m[1][1] + eb.y*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 + t = Ty*mR1to0.m[0][0] - Tx*mR1to0.m[0][1]; t2 = ea.x*mAR.m[0][1] + ea.y*mAR.m[0][0] + eb.y*mAR.m[2][2] + eb.z*mAR.m[1][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 + t = Ty*mR1to0.m[1][0] - Tx*mR1to0.m[1][1]; t2 = ea.x*mAR.m[1][1] + ea.y*mAR.m[1][0] + eb.x*mAR.m[2][2] + eb.z*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 + t = Ty*mR1to0.m[2][0] - Tx*mR1to0.m[2][1]; t2 = ea.x*mAR.m[2][1] + ea.y*mAR.m[2][0] + eb.x*mAR.m[1][2] + eb.y*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 + } + return TRUE; +} + +//! A dedicated version when one box is constant +inline_ BOOL OBBCollider::BoxBoxOverlap(const Point& extents, const Point& center) +{ + // Stats + mNbVolumeBVTests++; + + float t,t2; + + // Class I : A's basis vectors + float Tx = mTBoxToModel.x - center.x; t = extents.x + mBBx1; if(GREATER(Tx, t)) return FALSE; + float Ty = mTBoxToModel.y - center.y; t = extents.y + mBBy1; if(GREATER(Ty, t)) return FALSE; + float Tz = mTBoxToModel.z - center.z; t = extents.z + mBBz1; if(GREATER(Tz, t)) return FALSE; + + // Class II : B's basis vectors + t = Tx*mRBoxToModel.m[0][0] + Ty*mRBoxToModel.m[0][1] + Tz*mRBoxToModel.m[0][2]; + t2 = extents.x*mAR.m[0][0] + extents.y*mAR.m[0][1] + extents.z*mAR.m[0][2] + mBoxExtents.x; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mRBoxToModel.m[1][0] + Ty*mRBoxToModel.m[1][1] + Tz*mRBoxToModel.m[1][2]; + t2 = extents.x*mAR.m[1][0] + extents.y*mAR.m[1][1] + extents.z*mAR.m[1][2] + mBoxExtents.y; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mRBoxToModel.m[2][0] + Ty*mRBoxToModel.m[2][1] + Tz*mRBoxToModel.m[2][2]; + t2 = extents.x*mAR.m[2][0] + extents.y*mAR.m[2][1] + extents.z*mAR.m[2][2] + mBoxExtents.z; + if(GREATER(t, t2)) return FALSE; + + // Class III : 9 cross products + // Cool trick: always perform the full test for first level, regardless of settings. + // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! + if(mFullBoxBoxTest || mNbVolumeBVTests==1) + { + t = Tz*mRBoxToModel.m[0][1] - Ty*mRBoxToModel.m[0][2]; t2 = extents.y*mAR.m[0][2] + extents.z*mAR.m[0][1] + mBB_1; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 + t = Tz*mRBoxToModel.m[1][1] - Ty*mRBoxToModel.m[1][2]; t2 = extents.y*mAR.m[1][2] + extents.z*mAR.m[1][1] + mBB_2; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 + t = Tz*mRBoxToModel.m[2][1] - Ty*mRBoxToModel.m[2][2]; t2 = extents.y*mAR.m[2][2] + extents.z*mAR.m[2][1] + mBB_3; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 + t = Tx*mRBoxToModel.m[0][2] - Tz*mRBoxToModel.m[0][0]; t2 = extents.x*mAR.m[0][2] + extents.z*mAR.m[0][0] + mBB_4; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 + t = Tx*mRBoxToModel.m[1][2] - Tz*mRBoxToModel.m[1][0]; t2 = extents.x*mAR.m[1][2] + extents.z*mAR.m[1][0] + mBB_5; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 + t = Tx*mRBoxToModel.m[2][2] - Tz*mRBoxToModel.m[2][0]; t2 = extents.x*mAR.m[2][2] + extents.z*mAR.m[2][0] + mBB_6; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 + t = Ty*mRBoxToModel.m[0][0] - Tx*mRBoxToModel.m[0][1]; t2 = extents.x*mAR.m[0][1] + extents.y*mAR.m[0][0] + mBB_7; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 + t = Ty*mRBoxToModel.m[1][0] - Tx*mRBoxToModel.m[1][1]; t2 = extents.x*mAR.m[1][1] + extents.y*mAR.m[1][0] + mBB_8; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 + t = Ty*mRBoxToModel.m[2][0] - Tx*mRBoxToModel.m[2][1]; t2 = extents.x*mAR.m[2][1] + extents.y*mAR.m[2][0] + mBB_9; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 + } + return TRUE; +} + +//! A special version for 2 axis-aligned boxes +inline_ BOOL AABBCollider::AABBAABBOverlap(const Point& extents, const Point& center) +{ + // Stats + mNbVolumeBVTests++; + + float tx = mBox.mCenter.x - center.x; float ex = extents.x + mBox.mExtents.x; if(GREATER(tx, ex)) return FALSE; + float ty = mBox.mCenter.y - center.y; float ey = extents.y + mBox.mExtents.y; if(GREATER(ty, ey)) return FALSE; + float tz = mBox.mCenter.z - center.z; float ez = extents.z + mBox.mExtents.z; if(GREATER(tz, ez)) return FALSE; + + return TRUE; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp b/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp index bd88526cc..7d4f50dd5 100644 --- a/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp @@ -1,376 +1,376 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for box pruning. - * \file IceBoxPruning.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - You could use a complex sweep-and-prune as implemented in I-Collide. - You could use a complex hashing scheme as implemented in V-Clip or recently in ODE it seems. - You could use a "Recursive Dimensional Clustering" algorithm as implemented in GPG2. - - Or you could use this. - Faster ? I don't know. Probably not. It would be a shame. But who knows ? - Easier ? Definitely. Enjoy the sheer simplicity. -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -*/ - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - - inline_ void FindRunningIndex(udword& index, float* array, udword* sorted, int last, float max) - { - int First=index; - while(First<=last) - { - index = (First+last)>>1; - - if(max>array[sorted[index]]) First = index+1; - else last = index-1; - } - } -// ### could be log(n) ! -// and maybe use cmp integers - -// InsertionSort has better coherence, RadixSort is better for one-shot queries. -#define PRUNING_SORTER RadixSort -//#define PRUNING_SORTER InsertionSort - -// Static for coherence -static PRUNING_SORTER* gCompletePruningSorter = null; -static PRUNING_SORTER* gBipartitePruningSorter0 = null; -static PRUNING_SORTER* gBipartitePruningSorter1 = null; -inline_ PRUNING_SORTER* GetCompletePruningSorter() -{ - if(!gCompletePruningSorter) gCompletePruningSorter = ICE_NEW(PRUNING_SORTER); - return gCompletePruningSorter; -} -inline_ PRUNING_SORTER* GetBipartitePruningSorter0() -{ - if(!gBipartitePruningSorter0) gBipartitePruningSorter0 = ICE_NEW(PRUNING_SORTER); - return gBipartitePruningSorter0; -} -inline_ PRUNING_SORTER* GetBipartitePruningSorter1() -{ - if(!gBipartitePruningSorter1) gBipartitePruningSorter1 = ICE_NEW(PRUNING_SORTER); - return gBipartitePruningSorter1; -} -void ReleasePruningSorters() -{ - DELETESINGLE(gBipartitePruningSorter1); - DELETESINGLE(gBipartitePruningSorter0); - DELETESINGLE(gCompletePruningSorter); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. - * \param nb0 [in] number of boxes in the first set - * \param array0 [in] array of boxes for the first set - * \param nb1 [in] number of boxes in the second set - * \param array1 [in] array of boxes for the second set - * \param pairs [out] array of overlapping pairs - * \param axes [in] projection order (0,2,1 is often best) - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes) -{ - // Checkings - if(!nb0 || !array0 || !nb1 || !array1) return false; - - // Catch axes - udword Axis0 = axes.mAxis0; - udword Axis1 = axes.mAxis1; - udword Axis2 = axes.mAxis2; - - // Allocate some temporary data - float* MinPosList0 = new float[nb0]; - float* MinPosList1 = new float[nb1]; - - // 1) Build main lists using the primary axis - for(udword i=0;iGetMin(Axis0); - for(udword i=0;iGetMin(Axis0); - - // 2) Sort the lists - PRUNING_SORTER* RS0 = GetBipartitePruningSorter0(); - PRUNING_SORTER* RS1 = GetBipartitePruningSorter1(); - const udword* Sorted0 = RS0->Sort(MinPosList0, nb0).GetRanks(); - const udword* Sorted1 = RS1->Sort(MinPosList1, nb1).GetRanks(); - - // 3) Prune the lists - udword Index0, Index1; - - const udword* const LastSorted0 = &Sorted0[nb0]; - const udword* const LastSorted1 = &Sorted1[nb1]; - const udword* RunningAddress0 = Sorted0; - const udword* RunningAddress1 = Sorted1; - - while(RunningAddress1GetMax(Axis0)) - { - if(array0[Index0]->Intersect(*array1[Index1], Axis1)) - { - if(array0[Index0]->Intersect(*array1[Index1], Axis2)) - { - pairs.AddPair(Index0, Index1); - } - } - } - } - - //// - - while(RunningAddress0GetMax(Axis0)) - { - if(array0[Index1]->Intersect(*array1[Index0], Axis1)) - { - if(array0[Index1]->Intersect(*array1[Index0], Axis2)) - { - pairs.AddPair(Index1, Index0); - } - } - - } - } - - DELETEARRAY(MinPosList1); - DELETEARRAY(MinPosList0); - - return true; -} - -#define ORIGINAL_VERSION -//#define JOAKIM - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. - * \param nb [in] number of boxes - * \param array [in] array of boxes - * \param pairs [out] array of overlapping pairs - * \param axes [in] projection order (0,2,1 is often best) - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes) -{ - // Checkings - if(!nb || !array) return false; - - // Catch axes - udword Axis0 = axes.mAxis0; - udword Axis1 = axes.mAxis1; - udword Axis2 = axes.mAxis2; - -#ifdef ORIGINAL_VERSION - // Allocate some temporary data -// float* PosList = new float[nb]; - float* PosList = new float[nb+1]; - - // 1) Build main list using the primary axis - for(udword i=0;iGetMin(Axis0); -PosList[nb++] = MAX_FLOAT; - - // 2) Sort the list - PRUNING_SORTER* RS = GetCompletePruningSorter(); - const udword* Sorted = RS->Sort(PosList, nb).GetRanks(); - - // 3) Prune the list - const udword* const LastSorted = &Sorted[nb]; - const udword* RunningAddress = Sorted; - udword Index0, Index1; - while(RunningAddressGetMax(Axis0)) - while(PosList[Index1 = *RunningAddress2++]<=array[Index0]->GetMax(Axis0)) - { -// if(Index0!=Index1) -// { - if(array[Index0]->Intersect(*array[Index1], Axis1)) - { - if(array[Index0]->Intersect(*array[Index1], Axis2)) - { - pairs.AddPair(Index0, Index1); - } - } -// } - } - } - } - - DELETEARRAY(PosList); -#endif - -#ifdef JOAKIM - // Allocate some temporary data -// float* PosList = new float[nb]; - float* MinList = new float[nb+1]; - - // 1) Build main list using the primary axis - for(udword i=0;iGetMin(Axis0); - MinList[nb] = MAX_FLOAT; - - // 2) Sort the list - PRUNING_SORTER* RS = GetCompletePruningSorter(); - udword* Sorted = RS->Sort(MinList, nb+1).GetRanks(); - - // 3) Prune the list -// const udword* const LastSorted = &Sorted[nb]; -// const udword* const LastSorted = &Sorted[nb-1]; - const udword* RunningAddress = Sorted; - udword Index0, Index1; - -// while(RunningAddressGetMax(Axis0)) - -// float CurrentMin = array[Index0]->GetMin(Axis0); - float CurrentMax = array[Index0]->GetMax(Axis0); - - while(MinList[Index1 = *RunningAddress2] <= CurrentMax) -// while(PosList[Index1 = *RunningAddress] <= CurrentMax) - { -// if(Index0!=Index1) -// { - if(array[Index0]->Intersect(*array[Index1], Axis1)) - { - if(array[Index0]->Intersect(*array[Index1], Axis2)) - { - pairs.AddPair(Index0, Index1); - } - } -// } - - RunningAddress2++; -// RunningAddress++; - } - } - } - - DELETEARRAY(MinList); -#endif - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Brute-force versions are kept: -// - to check the optimized versions return the correct list of intersections -// - to check the speed of the optimized code against the brute-force one -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Brute-force bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. - * \param nb0 [in] number of boxes in the first set - * \param array0 [in] array of boxes for the first set - * \param nb1 [in] number of boxes in the second set - * \param array1 [in] array of boxes for the second set - * \param pairs [out] array of overlapping pairs - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs) -{ - // Checkings - if(!nb0 || !array0 || !nb1 || !array1) return false; - - // Brute-force nb0*nb1 overlap tests - for(udword i=0;iIntersect(*array1[j])) pairs.AddPair(i, j); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. - * \param nb [in] number of boxes - * \param array [in] array of boxes - * \param pairs [out] array of overlapping pairs - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs) -{ - // Checkings - if(!nb || !array) return false; - - // Brute-force n(n-1)/2 overlap tests - for(udword i=0;iIntersect(*array[j])) pairs.AddPair(i, j); - } - } - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for box pruning. + * \file IceBoxPruning.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + You could use a complex sweep-and-prune as implemented in I-Collide. + You could use a complex hashing scheme as implemented in V-Clip or recently in ODE it seems. + You could use a "Recursive Dimensional Clustering" algorithm as implemented in GPG2. + + Or you could use this. + Faster ? I don't know. Probably not. It would be a shame. But who knows ? + Easier ? Definitely. Enjoy the sheer simplicity. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +*/ + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + + inline_ void FindRunningIndex(udword& index, float* array, udword* sorted, int last, float max) + { + int First=index; + while(First<=last) + { + index = (First+last)>>1; + + if(max>array[sorted[index]]) First = index+1; + else last = index-1; + } + } +// ### could be log(n) ! +// and maybe use cmp integers + +// InsertionSort has better coherence, RadixSort is better for one-shot queries. +#define PRUNING_SORTER RadixSort +//#define PRUNING_SORTER InsertionSort + +// Static for coherence +static PRUNING_SORTER* gCompletePruningSorter = null; +static PRUNING_SORTER* gBipartitePruningSorter0 = null; +static PRUNING_SORTER* gBipartitePruningSorter1 = null; +inline_ PRUNING_SORTER* GetCompletePruningSorter() +{ + if(!gCompletePruningSorter) gCompletePruningSorter = ICE_NEW(PRUNING_SORTER); + return gCompletePruningSorter; +} +inline_ PRUNING_SORTER* GetBipartitePruningSorter0() +{ + if(!gBipartitePruningSorter0) gBipartitePruningSorter0 = ICE_NEW(PRUNING_SORTER); + return gBipartitePruningSorter0; +} +inline_ PRUNING_SORTER* GetBipartitePruningSorter1() +{ + if(!gBipartitePruningSorter1) gBipartitePruningSorter1 = ICE_NEW(PRUNING_SORTER); + return gBipartitePruningSorter1; +} +void ReleasePruningSorters() +{ + DELETESINGLE(gBipartitePruningSorter1); + DELETESINGLE(gBipartitePruningSorter0); + DELETESINGLE(gCompletePruningSorter); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. + * \param nb0 [in] number of boxes in the first set + * \param array0 [in] array of boxes for the first set + * \param nb1 [in] number of boxes in the second set + * \param array1 [in] array of boxes for the second set + * \param pairs [out] array of overlapping pairs + * \param axes [in] projection order (0,2,1 is often best) + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes) +{ + // Checkings + if(!nb0 || !array0 || !nb1 || !array1) return false; + + // Catch axes + udword Axis0 = axes.mAxis0; + udword Axis1 = axes.mAxis1; + udword Axis2 = axes.mAxis2; + + // Allocate some temporary data + float* MinPosList0 = new float[nb0]; + float* MinPosList1 = new float[nb1]; + + // 1) Build main lists using the primary axis + for(udword i=0;iGetMin(Axis0); + for(udword i=0;iGetMin(Axis0); + + // 2) Sort the lists + PRUNING_SORTER* RS0 = GetBipartitePruningSorter0(); + PRUNING_SORTER* RS1 = GetBipartitePruningSorter1(); + const udword* Sorted0 = RS0->Sort(MinPosList0, nb0).GetRanks(); + const udword* Sorted1 = RS1->Sort(MinPosList1, nb1).GetRanks(); + + // 3) Prune the lists + udword Index0, Index1; + + const udword* const LastSorted0 = &Sorted0[nb0]; + const udword* const LastSorted1 = &Sorted1[nb1]; + const udword* RunningAddress0 = Sorted0; + const udword* RunningAddress1 = Sorted1; + + while(RunningAddress1GetMax(Axis0)) + { + if(array0[Index0]->Intersect(*array1[Index1], Axis1)) + { + if(array0[Index0]->Intersect(*array1[Index1], Axis2)) + { + pairs.AddPair(Index0, Index1); + } + } + } + } + + //// + + while(RunningAddress0GetMax(Axis0)) + { + if(array0[Index1]->Intersect(*array1[Index0], Axis1)) + { + if(array0[Index1]->Intersect(*array1[Index0], Axis2)) + { + pairs.AddPair(Index1, Index0); + } + } + + } + } + + DELETEARRAY(MinPosList1); + DELETEARRAY(MinPosList0); + + return true; +} + +#define ORIGINAL_VERSION +//#define JOAKIM + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. + * \param nb [in] number of boxes + * \param array [in] array of boxes + * \param pairs [out] array of overlapping pairs + * \param axes [in] projection order (0,2,1 is often best) + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes) +{ + // Checkings + if(!nb || !array) return false; + + // Catch axes + udword Axis0 = axes.mAxis0; + udword Axis1 = axes.mAxis1; + udword Axis2 = axes.mAxis2; + +#ifdef ORIGINAL_VERSION + // Allocate some temporary data +// float* PosList = new float[nb]; + float* PosList = new float[nb+1]; + + // 1) Build main list using the primary axis + for(udword i=0;iGetMin(Axis0); +PosList[nb++] = MAX_FLOAT; + + // 2) Sort the list + PRUNING_SORTER* RS = GetCompletePruningSorter(); + const udword* Sorted = RS->Sort(PosList, nb).GetRanks(); + + // 3) Prune the list + const udword* const LastSorted = &Sorted[nb]; + const udword* RunningAddress = Sorted; + udword Index0, Index1; + while(RunningAddressGetMax(Axis0)) + while(PosList[Index1 = *RunningAddress2++]<=array[Index0]->GetMax(Axis0)) + { +// if(Index0!=Index1) +// { + if(array[Index0]->Intersect(*array[Index1], Axis1)) + { + if(array[Index0]->Intersect(*array[Index1], Axis2)) + { + pairs.AddPair(Index0, Index1); + } + } +// } + } + } + } + + DELETEARRAY(PosList); +#endif + +#ifdef JOAKIM + // Allocate some temporary data +// float* PosList = new float[nb]; + float* MinList = new float[nb+1]; + + // 1) Build main list using the primary axis + for(udword i=0;iGetMin(Axis0); + MinList[nb] = MAX_FLOAT; + + // 2) Sort the list + PRUNING_SORTER* RS = GetCompletePruningSorter(); + udword* Sorted = RS->Sort(MinList, nb+1).GetRanks(); + + // 3) Prune the list +// const udword* const LastSorted = &Sorted[nb]; +// const udword* const LastSorted = &Sorted[nb-1]; + const udword* RunningAddress = Sorted; + udword Index0, Index1; + +// while(RunningAddressGetMax(Axis0)) + +// float CurrentMin = array[Index0]->GetMin(Axis0); + float CurrentMax = array[Index0]->GetMax(Axis0); + + while(MinList[Index1 = *RunningAddress2] <= CurrentMax) +// while(PosList[Index1 = *RunningAddress] <= CurrentMax) + { +// if(Index0!=Index1) +// { + if(array[Index0]->Intersect(*array[Index1], Axis1)) + { + if(array[Index0]->Intersect(*array[Index1], Axis2)) + { + pairs.AddPair(Index0, Index1); + } + } +// } + + RunningAddress2++; +// RunningAddress++; + } + } + } + + DELETEARRAY(MinList); +#endif + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Brute-force versions are kept: +// - to check the optimized versions return the correct list of intersections +// - to check the speed of the optimized code against the brute-force one +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Brute-force bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. + * \param nb0 [in] number of boxes in the first set + * \param array0 [in] array of boxes for the first set + * \param nb1 [in] number of boxes in the second set + * \param array1 [in] array of boxes for the second set + * \param pairs [out] array of overlapping pairs + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs) +{ + // Checkings + if(!nb0 || !array0 || !nb1 || !array1) return false; + + // Brute-force nb0*nb1 overlap tests + for(udword i=0;iIntersect(*array1[j])) pairs.AddPair(i, j); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. + * \param nb [in] number of boxes + * \param array [in] array of boxes + * \param pairs [out] array of overlapping pairs + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs) +{ + // Checkings + if(!nb || !array) return false; + + // Brute-force n(n-1)/2 overlap tests + for(udword i=0;iIntersect(*array[j])) pairs.AddPair(i, j); + } + } + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h b/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h index a6e6abdeb..163fe4e1a 100644 --- a/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h +++ b/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h @@ -1,40 +1,40 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for box pruning. - * \file IceBoxPruning.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_BOXPRUNING_H__ -#define __OPC_BOXPRUNING_H__ - - // Optimized versions - FUNCTION OPCODE_API bool CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes); - FUNCTION OPCODE_API bool BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes); - - // Brute-force versions - FUNCTION OPCODE_API bool BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs); - FUNCTION OPCODE_API bool BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs); - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for box pruning. + * \file IceBoxPruning.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_BOXPRUNING_H__ +#define __OPC_BOXPRUNING_H__ + + // Optimized versions + FUNCTION OPCODE_API bool CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes); + FUNCTION OPCODE_API bool BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes); + + // Brute-force versions + FUNCTION OPCODE_API bool BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs); + FUNCTION OPCODE_API bool BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs); + #endif //__OPC_BOXPRUNING_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_Collider.cpp b/Extras/CDTestFramework/Opcode/OPC_Collider.cpp index b88168322..bd62aec92 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Collider.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_Collider.cpp @@ -1,63 +1,63 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base collider class. - * \file OPC_Collider.cpp - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains the abstract class for colliders. - * - * \class Collider - * \author Pierre Terdiman - * \version 1.3 - * \date June, 2, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Collider::Collider() : - mFlags (0), - mCurrentModel (null), - mIMesh (null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Collider::~Collider() -{ -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base collider class. + * \file OPC_Collider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains the abstract class for colliders. + * + * \class Collider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Collider::Collider() : + mFlags (0), + mCurrentModel (null), + mIMesh (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Collider::~Collider() +{ +} diff --git a/Extras/CDTestFramework/Opcode/OPC_Collider.h b/Extras/CDTestFramework/Opcode/OPC_Collider.h index fbb3d4431..594109b33 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Collider.h +++ b/Extras/CDTestFramework/Opcode/OPC_Collider.h @@ -1,185 +1,185 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base collider class. - * \file OPC_Collider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_COLLIDER_H__ -#define __OPC_COLLIDER_H__ - - enum CollisionFlag - { - OPC_FIRST_CONTACT = (1<<0), //!< Report all contacts (false) or only first one (true) - OPC_TEMPORAL_COHERENCE = (1<<1), //!< Use temporal coherence or not - OPC_CONTACT = (1<<2), //!< Final contact status after a collision query - OPC_TEMPORAL_HIT = (1<<3), //!< There has been an early exit due to temporal coherence - OPC_NO_PRIMITIVE_TESTS = (1<<4), //!< Keep or discard primitive-bv tests in leaf nodes (volume-mesh queries) - - OPC_CONTACT_FOUND = OPC_FIRST_CONTACT | OPC_CONTACT, - OPC_TEMPORAL_CONTACT = OPC_TEMPORAL_HIT | OPC_CONTACT, - - OPC_FORCE_DWORD = 0x7fffffff - }; - - class OPCODE_API Collider - { - public: - // Constructor / Destructor - Collider(); - virtual ~Collider(); - - // Collision report - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the last collision status after a collision query. - * \return true if a collision occured - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL GetContactStatus() const { return mFlags & OPC_CONTACT; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the "first contact" mode. - * \return true if "first contact" mode is on - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL FirstContactEnabled() const { return mFlags & OPC_FIRST_CONTACT; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the temporal coherence mode. - * \return true if temporal coherence is on - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL TemporalCoherenceEnabled() const { return mFlags & OPC_TEMPORAL_COHERENCE; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks a first contact has already been found. - * \return true if a first contact has been found and we can stop a query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL ContactFound() const { return (mFlags&OPC_CONTACT_FOUND)==OPC_CONTACT_FOUND; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks there's been an early exit due to temporal coherence; - * \return true if a temporal hit has occured - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL TemporalHit() const { return mFlags & OPC_TEMPORAL_HIT; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks primitive tests are enabled; - * \return true if primitive tests must be skipped - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL SkipPrimitiveTests() const { return mFlags & OPC_NO_PRIMITIVE_TESTS; } - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Reports all contacts (false) or first contact only (true) - * \param flag [in] true for first contact, false for all contacts - * \see SetTemporalCoherence(bool flag) - * \see ValidateSettings() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFirstContact(bool flag) - { - if(flag) mFlags |= OPC_FIRST_CONTACT; - else mFlags &= ~OPC_FIRST_CONTACT; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Enable/disable temporal coherence. - * \param flag [in] true to enable temporal coherence, false to discard it - * \see SetFirstContact(bool flag) - * \see ValidateSettings() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetTemporalCoherence(bool flag) - { - if(flag) mFlags |= OPC_TEMPORAL_COHERENCE; - else mFlags &= ~OPC_TEMPORAL_COHERENCE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Enable/disable primitive tests. - * \param flag [in] true to enable primitive tests, false to discard them - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetPrimitiveTests(bool flag) - { - if(!flag) mFlags |= OPC_NO_PRIMITIVE_TESTS; - else mFlags &= ~OPC_NO_PRIMITIVE_TESTS; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual const char* ValidateSettings() = 0; - - protected: - udword mFlags; //!< Bit flags - const BaseModel* mCurrentModel; //!< Current model for collision query (owner of touched faces) - // User mesh interface - const MeshInterface* mIMesh; //!< User-defined mesh interface - - // Internal methods - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups current collision model - * \param model [in] current collision model - * \return TRUE if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Setup(const BaseModel* model) - { - // Keep track of current model - mCurrentModel = model; - if(!mCurrentModel) return FALSE; - - mIMesh = model->GetMeshInterface(); - return mIMesh!=null; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Initializes a query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual inline_ void InitQuery() { mFlags &= ~OPC_TEMPORAL_CONTACT; } - }; - -#endif // __OPC_COLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base collider class. + * \file OPC_Collider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_COLLIDER_H__ +#define __OPC_COLLIDER_H__ + + enum CollisionFlag + { + OPC_FIRST_CONTACT = (1<<0), //!< Report all contacts (false) or only first one (true) + OPC_TEMPORAL_COHERENCE = (1<<1), //!< Use temporal coherence or not + OPC_CONTACT = (1<<2), //!< Final contact status after a collision query + OPC_TEMPORAL_HIT = (1<<3), //!< There has been an early exit due to temporal coherence + OPC_NO_PRIMITIVE_TESTS = (1<<4), //!< Keep or discard primitive-bv tests in leaf nodes (volume-mesh queries) + + OPC_CONTACT_FOUND = OPC_FIRST_CONTACT | OPC_CONTACT, + OPC_TEMPORAL_CONTACT = OPC_TEMPORAL_HIT | OPC_CONTACT, + + OPC_FORCE_DWORD = 0x7fffffff + }; + + class OPCODE_API Collider + { + public: + // Constructor / Destructor + Collider(); + virtual ~Collider(); + + // Collision report + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the last collision status after a collision query. + * \return true if a collision occured + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL GetContactStatus() const { return mFlags & OPC_CONTACT; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the "first contact" mode. + * \return true if "first contact" mode is on + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL FirstContactEnabled() const { return mFlags & OPC_FIRST_CONTACT; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the temporal coherence mode. + * \return true if temporal coherence is on + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL TemporalCoherenceEnabled() const { return mFlags & OPC_TEMPORAL_COHERENCE; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks a first contact has already been found. + * \return true if a first contact has been found and we can stop a query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL ContactFound() const { return (mFlags&OPC_CONTACT_FOUND)==OPC_CONTACT_FOUND; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks there's been an early exit due to temporal coherence; + * \return true if a temporal hit has occured + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL TemporalHit() const { return mFlags & OPC_TEMPORAL_HIT; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks primitive tests are enabled; + * \return true if primitive tests must be skipped + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL SkipPrimitiveTests() const { return mFlags & OPC_NO_PRIMITIVE_TESTS; } + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Reports all contacts (false) or first contact only (true) + * \param flag [in] true for first contact, false for all contacts + * \see SetTemporalCoherence(bool flag) + * \see ValidateSettings() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFirstContact(bool flag) + { + if(flag) mFlags |= OPC_FIRST_CONTACT; + else mFlags &= ~OPC_FIRST_CONTACT; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Enable/disable temporal coherence. + * \param flag [in] true to enable temporal coherence, false to discard it + * \see SetFirstContact(bool flag) + * \see ValidateSettings() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetTemporalCoherence(bool flag) + { + if(flag) mFlags |= OPC_TEMPORAL_COHERENCE; + else mFlags &= ~OPC_TEMPORAL_COHERENCE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Enable/disable primitive tests. + * \param flag [in] true to enable primitive tests, false to discard them + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetPrimitiveTests(bool flag) + { + if(!flag) mFlags |= OPC_NO_PRIMITIVE_TESTS; + else mFlags &= ~OPC_NO_PRIMITIVE_TESTS; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual const char* ValidateSettings() = 0; + + protected: + udword mFlags; //!< Bit flags + const BaseModel* mCurrentModel; //!< Current model for collision query (owner of touched faces) + // User mesh interface + const MeshInterface* mIMesh; //!< User-defined mesh interface + + // Internal methods + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups current collision model + * \param model [in] current collision model + * \return TRUE if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Setup(const BaseModel* model) + { + // Keep track of current model + mCurrentModel = model; + if(!mCurrentModel) return FALSE; + + mIMesh = model->GetMeshInterface(); + return mIMesh!=null; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Initializes a query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual inline_ void InitQuery() { mFlags &= ~OPC_TEMPORAL_CONTACT; } + }; + +#endif // __OPC_COLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_Common.cpp b/Extras/CDTestFramework/Opcode/OPC_Common.cpp index 1da8b30d3..4f1a2503e 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Common.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_Common.cpp @@ -1,57 +1,57 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains common classes & defs used in OPCODE. - * \file OPC_Common.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * An AABB dedicated to collision detection. - * We don't use the generic AABB class included in ICE, since it can be a Min/Max or a Center/Extents one (depends - * on compilation flags). Since the Center/Extents model is more efficient in collision detection, it was worth - * using an extra special class. - * - * \class CollisionAABB - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A quantized AABB. - * Center/Extent model, using 16-bits integers. - * - * \class QuantizedAABB - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains common classes & defs used in OPCODE. + * \file OPC_Common.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * An AABB dedicated to collision detection. + * We don't use the generic AABB class included in ICE, since it can be a Min/Max or a Center/Extents one (depends + * on compilation flags). Since the Center/Extents model is more efficient in collision detection, it was worth + * using an extra special class. + * + * \class CollisionAABB + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A quantized AABB. + * Center/Extent model, using 16-bits integers. + * + * \class QuantizedAABB + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; diff --git a/Extras/CDTestFramework/Opcode/OPC_Common.h b/Extras/CDTestFramework/Opcode/OPC_Common.h index 1fbc6a979..9510668cd 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Common.h +++ b/Extras/CDTestFramework/Opcode/OPC_Common.h @@ -1,110 +1,110 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains common classes & defs used in OPCODE. - * \file OPC_Common.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_COMMON_H__ -#define __OPC_COMMON_H__ - -// [GOTTFRIED]: Just a small change for readability. -#ifdef OPC_CPU_COMPARE - #define GREATER(x, y) AIR(x) > IR(y) -#else - #define GREATER(x, y) fabsf(x) > (y) -#endif - - class OPCODE_API CollisionAABB - { - public: - //! Constructor - inline_ CollisionAABB() {} - //! Constructor - inline_ CollisionAABB(const AABB& b) { b.GetCenter(mCenter); b.GetExtents(mExtents); } - //! Destructor - inline_ ~CollisionAABB() {} - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks a box is inside another box. - * \param box [in] the other box - * \return true if current box is inside input box - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsInside(const CollisionAABB& box) const - { - if(box.GetMin(0)>GetMin(0)) return FALSE; - if(box.GetMin(1)>GetMin(1)) return FALSE; - if(box.GetMin(2)>GetMin(2)) return FALSE; - if(box.GetMax(0) IR(y) +#else + #define GREATER(x, y) fabsf(x) > (y) +#endif + + class OPCODE_API CollisionAABB + { + public: + //! Constructor + inline_ CollisionAABB() {} + //! Constructor + inline_ CollisionAABB(const AABB& b) { b.GetCenter(mCenter); b.GetExtents(mExtents); } + //! Destructor + inline_ ~CollisionAABB() {} + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks a box is inside another box. + * \param box [in] the other box + * \return true if current box is inside input box + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsInside(const CollisionAABB& box) const + { + if(box.GetMin(0)>GetMin(0)) return FALSE; + if(box.GetMin(1)>GetMin(1)) return FALSE; + if(box.GetMin(2)>GetMin(2)) return FALSE; + if(box.GetMax(0)IsValid()) return false; - - // Look for degenerate faces. - udword NbDegenerate = create.mIMesh->CheckTopology(); - if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); - // We continue nonetheless.... - - Release(); // Make sure previous tree has been discarded - - // 1-1) Setup mesh interface automatically - SetMeshInterface(create.mIMesh); - - bool Status = false; - AABBTree* LeafTree = null; - Internal Data; - - // 2) Build a generic AABB Tree. - mSource = new AABBTree; - CHECKALLOC(mSource); - - // 2-1) Setup a builder. Our primitives here are triangles from input mesh, - // so we use an AABBTreeOfTrianglesBuilder..... - { - AABBTreeOfTrianglesBuilder TB; - TB.mIMesh = create.mIMesh; - TB.mNbPrimitives = create.mIMesh->GetNbTriangles(); - TB.mSettings = create.mSettings; - TB.mSettings.mLimit = 16; // ### Hardcoded, but maybe we could let the user choose 8 / 16 / 32 ... - if(!mSource->Build(&TB)) goto FreeAndExit; - } - - // 2-2) Here's the trick : create *another* AABB tree using the leaves of the first one (which are boxes, this time) - struct Local - { - // A callback to count leaf nodes - static bool CountLeaves(const AABBTreeNode* current, udword depth, void* user_data) - { - if(current->IsLeaf()) - { - Internal* Data = (Internal*)user_data; - Data->mNbLeaves++; - } - return true; - } - - // A callback to setup leaf nodes in our internal structures - static bool SetupLeafData(const AABBTreeNode* current, udword depth, void* user_data) - { - if(current->IsLeaf()) - { - Internal* Data = (Internal*)user_data; - - // Get current leaf's box - Data->mLeaves[Data->mNbLeaves] = *current->GetAABB(); - - // Setup leaf data - udword Index = (udword(current->GetPrimitives()) - udword(Data->mBase))/sizeof(udword); - Data->mTriangles[Data->mNbLeaves].SetData(current->GetNbPrimitives(), Index); - - Data->mNbLeaves++; - } - return true; - } - }; - - // Walk the tree & count number of leaves - Data.mNbLeaves = 0; - mSource->Walk(Local::CountLeaves, &Data); - mNbLeaves = Data.mNbLeaves; // Keep track of it - - // Special case for 1-leaf meshes - if(mNbLeaves==1) - { - mModelCode |= OPC_SINGLE_NODE; - Status = true; - goto FreeAndExit; - } - - // Allocate our structures - Data.mLeaves = new AABB[Data.mNbLeaves]; CHECKALLOC(Data.mLeaves); - mTriangles = new LeafTriangles[Data.mNbLeaves]; CHECKALLOC(mTriangles); - - // Walk the tree again & setup leaf data - Data.mTriangles = mTriangles; - Data.mBase = mSource->GetIndices(); - Data.mNbLeaves = 0; // Reset for incoming walk - mSource->Walk(Local::SetupLeafData, &Data); - - // Handle source indices - { - bool MustKeepIndices = true; - if(create.mCanRemap) - { - // We try to get rid of source indices (saving more ram!) by reorganizing triangle arrays... - // Remap can fail when we use callbacks => keep track of indices in that case (it still - // works, only using more memory) - if(create.mIMesh->RemapClient(mSource->GetNbPrimitives(), mSource->GetIndices())) - { - MustKeepIndices = false; - } - } - - if(MustKeepIndices) - { - // Keep track of source indices (from vanilla tree) - mNbPrimitives = mSource->GetNbPrimitives(); - mIndices = new udword[mNbPrimitives]; - CopyMemory(mIndices, mSource->GetIndices(), mNbPrimitives*sizeof(udword)); - } - } - - // Now, create our optimized tree using previous leaf nodes - LeafTree = new AABBTree; - CHECKALLOC(LeafTree); - { - AABBTreeOfAABBsBuilder TB; // Now using boxes ! - TB.mSettings = create.mSettings; - TB.mSettings.mLimit = 1; // We now want a complete tree so that we can "optimize" it - TB.mNbPrimitives = Data.mNbLeaves; - TB.mAABBArray = Data.mLeaves; - if(!LeafTree->Build(&TB)) goto FreeAndExit; - } - - // 3) Create an optimized tree according to user-settings - if(!CreateTree(create.mNoLeaf, create.mQuantized)) goto FreeAndExit; - - // 3-2) Create optimized tree - if(!mTree->Build(LeafTree)) goto FreeAndExit; - - // Finally ok... - Status = true; - -FreeAndExit: // Allow me this one... - DELETESINGLE(LeafTree); - - // 3-3) Delete generic tree if needed - if(!create.mKeepOriginal) DELETESINGLE(mSource); - - return Status; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword HybridModel::GetUsedBytes() const -{ - udword UsedBytes = 0; - if(mTree) UsedBytes += mTree->GetUsedBytes(); - if(mIndices) UsedBytes += mNbPrimitives * sizeof(udword); // mIndices - if(mTriangles) UsedBytes += mNbLeaves * sizeof(LeafTriangles); // mTriangles - return UsedBytes; -} - -inline_ void ComputeMinMax_HM(Point& min, Point& max, const VertexPointers& vp) -{ - // Compute triangle's AABB = a leaf box -#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much - min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - - min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - - min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); - max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); -#else - min = *vp.Vertex[0]; - max = *vp.Vertex[0]; - min.Min(*vp.Vertex[1]); - max.Max(*vp.Vertex[1]); - min.Min(*vp.Vertex[2]); - max.Max(*vp.Vertex[2]); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool HybridModel::Refit() -{ - if(!mIMesh) return false; - if(!mTree) return false; - - if(IsQuantized()) return false; - if(HasLeafNodes()) return false; - - const LeafTriangles* LT = GetLeafTriangles(); - const udword* Indices = GetIndices(); - - // Bottom-up update - VertexPointers VP; - Point Min,Max; - Point Min_,Max_; - udword Index = mTree->GetNbNodes(); - AABBNoLeafNode* Nodes = (AABBNoLeafNode*)((AABBNoLeafTree*)mTree)->GetNodes(); - while(Index--) - { - AABBNoLeafNode& Current = Nodes[Index]; - - if(Current.HasPosLeaf()) - { - const LeafTriangles& CurrentLeaf = LT[Current.GetPosPrimitive()]; - - Min.SetPlusInfinity(); - Max.SetMinusInfinity(); - - Point TmpMin, TmpMax; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, *T++); - ComputeMinMax_HM(TmpMin, TmpMax, VP); - Min.Min(TmpMin); - Max.Max(TmpMax); - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, BaseIndex++); - ComputeMinMax_HM(TmpMin, TmpMax, VP); - Min.Min(TmpMin); - Max.Max(TmpMax); - } - } - } - else - { - const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; - CurrentBox.GetMin(Min); - CurrentBox.GetMax(Max); - } - - if(Current.HasNegLeaf()) - { - const LeafTriangles& CurrentLeaf = LT[Current.GetNegPrimitive()]; - - Min_.SetPlusInfinity(); - Max_.SetMinusInfinity(); - - Point TmpMin, TmpMax; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, *T++); - ComputeMinMax_HM(TmpMin, TmpMax, VP); - Min_.Min(TmpMin); - Max_.Max(TmpMax); - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, BaseIndex++); - ComputeMinMax_HM(TmpMin, TmpMax, VP); - Min_.Min(TmpMin); - Max_.Max(TmpMax); - } - } - } - else - { - const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; - CurrentBox.GetMin(Min_); - CurrentBox.GetMax(Max_); - } -#ifdef OPC_USE_FCOMI - Min.x = FCMin2(Min.x, Min_.x); - Max.x = FCMax2(Max.x, Max_.x); - Min.y = FCMin2(Min.y, Min_.y); - Max.y = FCMax2(Max.y, Max_.y); - Min.z = FCMin2(Min.z, Min_.z); - Max.z = FCMax2(Max.z, Max_.z); -#else - Min.Min(Min_); - Max.Max(Max_); -#endif - Current.mAABB.SetMinMax(Min, Max); - } - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for hybrid models. + * \file OPC_HybridModel.cpp + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * An hybrid collision model. + * + * The problem : + * + * Opcode really shines for mesh-mesh collision, especially when meshes are deeply overlapping + * (it typically outperforms RAPID in those cases). + * + * Unfortunately this is not the typical scenario in games. + * + * For close-proximity cases, especially for volume-mesh queries, it's relatively easy to run faster + * than Opcode, that suffers from a relatively high setup time. + * + * In particular, Opcode's "vanilla" trees in those cases -can- run faster. They can also use -less- + * memory than the optimized ones, when you let the system stop at ~10 triangles / leaf for example + * (i.e. when you don't use "complete" trees). However, those trees tend to fragment memory quite a + * lot, increasing cache misses : since they're not "complete", we can't predict the final number of + * nodes and we have to allocate nodes on-the-fly. For the same reasons we can't use Opcode's "optimized" + * trees here, since they rely on a known layout to perform the "optimization". + * + * Hybrid trees : + * + * Hybrid trees try to combine best of both worlds : + * + * - they use a maximum limit of 16 triangles/leaf. "16" is used so that we'll be able to save the + * number of triangles using 4 bits only. + * + * - they're still "complete" trees thanks to a two-passes building phase. First we create a "vanilla" + * AABB-tree with Opcode, limited to 16 triangles/leaf. Then we create a *second* vanilla tree, this + * time using the leaves of the first one. The trick is : this second tree is now "complete"... so we + * can further transform it into an Opcode's optimized tree. + * + * - then we run the collision queries on that standard Opcode tree. The only difference is that leaf + * nodes contain indices to leaf nodes of another tree. Also, we have to skip all primitive tests in + * Opcode optimized trees, since our leaves don't contain triangles anymore. + * + * - finally, for each collided leaf, we simply loop through 16 triangles max, and collide them with + * the bounding volume used in the query (we only support volume-vs-mesh queries here, not mesh-vs-mesh) + * + * All of that is wrapped in this "hybrid model" that contains the minimal data required for this to work. + * It's a mix between old "vanilla" trees, and old "optimized" trees. + * + * Extra advantages: + * + * - If we use them for dynamic models, we're left with a very small number of leaf nodes to refit. It + * might be a bit faster since we have less nodes to write back. + * + * - In rigid body simulation, using temporal coherence and sleeping objects greatly reduce the actual + * influence of one tree over another (i.e. the speed difference is often invisible). So memory is really + * the key element to consider, and in this regard hybrid trees are just better. + * + * Information to take home: + * - they use less ram + * - they're not slower (they're faster or slower depending on cases, overall there's no significant + * difference *as long as objects don't interpenetrate too much* - in which case Opcode's optimized trees + * are still notably faster) + * + * \class HybridModel + * \author Pierre Terdiman + * \version 1.3 + * \date May, 18, 2003 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridModel::HybridModel() : + mNbLeaves (0), + mNbPrimitives (0), + mTriangles (null), + mIndices (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridModel::~HybridModel() +{ + Release(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases everything. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void HybridModel::Release() +{ + ReleaseBase(); + DELETEARRAY(mIndices); + DELETEARRAY(mTriangles); + mNbLeaves = 0; + mNbPrimitives = 0; +} + + struct Internal + { + Internal() + { + mNbLeaves = 0; + mLeaves = null; + mTriangles = null; + mBase = null; + } + ~Internal() + { + DELETEARRAY(mLeaves); + } + + udword mNbLeaves; + AABB* mLeaves; + LeafTriangles* mTriangles; + const udword* mBase; + }; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool HybridModel::Build(const OPCODECREATE& create) +{ + // 1) Checkings + if(!create.mIMesh || !create.mIMesh->IsValid()) return false; + + // Look for degenerate faces. + udword NbDegenerate = create.mIMesh->CheckTopology(); + if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); + // We continue nonetheless.... + + Release(); // Make sure previous tree has been discarded + + // 1-1) Setup mesh interface automatically + SetMeshInterface(create.mIMesh); + + bool Status = false; + AABBTree* LeafTree = null; + Internal Data; + + // 2) Build a generic AABB Tree. + mSource = new AABBTree; + CHECKALLOC(mSource); + + // 2-1) Setup a builder. Our primitives here are triangles from input mesh, + // so we use an AABBTreeOfTrianglesBuilder..... + { + AABBTreeOfTrianglesBuilder TB; + TB.mIMesh = create.mIMesh; + TB.mNbPrimitives = create.mIMesh->GetNbTriangles(); + TB.mSettings = create.mSettings; + TB.mSettings.mLimit = 16; // ### Hardcoded, but maybe we could let the user choose 8 / 16 / 32 ... + if(!mSource->Build(&TB)) goto FreeAndExit; + } + + // 2-2) Here's the trick : create *another* AABB tree using the leaves of the first one (which are boxes, this time) + struct Local + { + // A callback to count leaf nodes + static bool CountLeaves(const AABBTreeNode* current, udword depth, void* user_data) + { + if(current->IsLeaf()) + { + Internal* Data = (Internal*)user_data; + Data->mNbLeaves++; + } + return true; + } + + // A callback to setup leaf nodes in our internal structures + static bool SetupLeafData(const AABBTreeNode* current, udword depth, void* user_data) + { + if(current->IsLeaf()) + { + Internal* Data = (Internal*)user_data; + + // Get current leaf's box + Data->mLeaves[Data->mNbLeaves] = *current->GetAABB(); + + // Setup leaf data + udword Index = (udword(current->GetPrimitives()) - udword(Data->mBase))/sizeof(udword); + Data->mTriangles[Data->mNbLeaves].SetData(current->GetNbPrimitives(), Index); + + Data->mNbLeaves++; + } + return true; + } + }; + + // Walk the tree & count number of leaves + Data.mNbLeaves = 0; + mSource->Walk(Local::CountLeaves, &Data); + mNbLeaves = Data.mNbLeaves; // Keep track of it + + // Special case for 1-leaf meshes + if(mNbLeaves==1) + { + mModelCode |= OPC_SINGLE_NODE; + Status = true; + goto FreeAndExit; + } + + // Allocate our structures + Data.mLeaves = new AABB[Data.mNbLeaves]; CHECKALLOC(Data.mLeaves); + mTriangles = new LeafTriangles[Data.mNbLeaves]; CHECKALLOC(mTriangles); + + // Walk the tree again & setup leaf data + Data.mTriangles = mTriangles; + Data.mBase = mSource->GetIndices(); + Data.mNbLeaves = 0; // Reset for incoming walk + mSource->Walk(Local::SetupLeafData, &Data); + + // Handle source indices + { + bool MustKeepIndices = true; + if(create.mCanRemap) + { + // We try to get rid of source indices (saving more ram!) by reorganizing triangle arrays... + // Remap can fail when we use callbacks => keep track of indices in that case (it still + // works, only using more memory) + if(create.mIMesh->RemapClient(mSource->GetNbPrimitives(), mSource->GetIndices())) + { + MustKeepIndices = false; + } + } + + if(MustKeepIndices) + { + // Keep track of source indices (from vanilla tree) + mNbPrimitives = mSource->GetNbPrimitives(); + mIndices = new udword[mNbPrimitives]; + CopyMemory(mIndices, mSource->GetIndices(), mNbPrimitives*sizeof(udword)); + } + } + + // Now, create our optimized tree using previous leaf nodes + LeafTree = new AABBTree; + CHECKALLOC(LeafTree); + { + AABBTreeOfAABBsBuilder TB; // Now using boxes ! + TB.mSettings = create.mSettings; + TB.mSettings.mLimit = 1; // We now want a complete tree so that we can "optimize" it + TB.mNbPrimitives = Data.mNbLeaves; + TB.mAABBArray = Data.mLeaves; + if(!LeafTree->Build(&TB)) goto FreeAndExit; + } + + // 3) Create an optimized tree according to user-settings + if(!CreateTree(create.mNoLeaf, create.mQuantized)) goto FreeAndExit; + + // 3-2) Create optimized tree + if(!mTree->Build(LeafTree)) goto FreeAndExit; + + // Finally ok... + Status = true; + +FreeAndExit: // Allow me this one... + DELETESINGLE(LeafTree); + + // 3-3) Delete generic tree if needed + if(!create.mKeepOriginal) DELETESINGLE(mSource); + + return Status; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword HybridModel::GetUsedBytes() const +{ + udword UsedBytes = 0; + if(mTree) UsedBytes += mTree->GetUsedBytes(); + if(mIndices) UsedBytes += mNbPrimitives * sizeof(udword); // mIndices + if(mTriangles) UsedBytes += mNbLeaves * sizeof(LeafTriangles); // mTriangles + return UsedBytes; +} + +inline_ void ComputeMinMax_HM(Point& min, Point& max, const VertexPointers& vp) +{ + // Compute triangle's AABB = a leaf box +#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much + min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + + min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + + min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); + max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); +#else + min = *vp.Vertex[0]; + max = *vp.Vertex[0]; + min.Min(*vp.Vertex[1]); + max.Max(*vp.Vertex[1]); + min.Min(*vp.Vertex[2]); + max.Max(*vp.Vertex[2]); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool HybridModel::Refit() +{ + if(!mIMesh) return false; + if(!mTree) return false; + + if(IsQuantized()) return false; + if(HasLeafNodes()) return false; + + const LeafTriangles* LT = GetLeafTriangles(); + const udword* Indices = GetIndices(); + + // Bottom-up update + VertexPointers VP; + Point Min,Max; + Point Min_,Max_; + udword Index = mTree->GetNbNodes(); + AABBNoLeafNode* Nodes = (AABBNoLeafNode*)((AABBNoLeafTree*)mTree)->GetNodes(); + while(Index--) + { + AABBNoLeafNode& Current = Nodes[Index]; + + if(Current.HasPosLeaf()) + { + const LeafTriangles& CurrentLeaf = LT[Current.GetPosPrimitive()]; + + Min.SetPlusInfinity(); + Max.SetMinusInfinity(); + + Point TmpMin, TmpMax; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, *T++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min.Min(TmpMin); + Max.Max(TmpMax); + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, BaseIndex++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min.Min(TmpMin); + Max.Max(TmpMax); + } + } + } + else + { + const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; + CurrentBox.GetMin(Min); + CurrentBox.GetMax(Max); + } + + if(Current.HasNegLeaf()) + { + const LeafTriangles& CurrentLeaf = LT[Current.GetNegPrimitive()]; + + Min_.SetPlusInfinity(); + Max_.SetMinusInfinity(); + + Point TmpMin, TmpMax; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, *T++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min_.Min(TmpMin); + Max_.Max(TmpMax); + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, BaseIndex++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min_.Min(TmpMin); + Max_.Max(TmpMax); + } + } + } + else + { + const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; + CurrentBox.GetMin(Min_); + CurrentBox.GetMax(Max_); + } +#ifdef OPC_USE_FCOMI + Min.x = FCMin2(Min.x, Min_.x); + Max.x = FCMax2(Max.x, Max_.x); + Min.y = FCMin2(Min.y, Min_.y); + Max.y = FCMax2(Max.y, Max_.y); + Min.z = FCMin2(Min.z, Min_.z); + Max.z = FCMax2(Max.z, Max_.z); +#else + Min.Min(Min_); + Max.Max(Max_); +#endif + Current.mAABB.SetMinMax(Min, Max); + } + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_HybridModel.h b/Extras/CDTestFramework/Opcode/OPC_HybridModel.h index 8a01d1528..117b9c39d 100644 --- a/Extras/CDTestFramework/Opcode/OPC_HybridModel.h +++ b/Extras/CDTestFramework/Opcode/OPC_HybridModel.h @@ -1,115 +1,115 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for hybrid models. - * \file OPC_HybridModel.h - * \author Pierre Terdiman - * \date May, 18, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_HYBRIDMODEL_H__ -#define __OPC_HYBRIDMODEL_H__ - - //! Leaf descriptor - struct LeafTriangles - { - udword Data; //!< Packed data - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets number of triangles in the leaf. - * \return number of triangles N, with 0 < N <= 16 - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbTriangles() const { return (Data & 15)+1; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets triangle index for this leaf. Indexed model's array of indices retrieved with HybridModel::GetIndices() - * \return triangle index - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetTriangleIndex() const { return Data>>4; } - inline_ void SetData(udword nb, udword index) { ASSERT(nb>0 && nb<=16); nb--; Data = (index<<4)|(nb&15); } - }; - - class OPCODE_API HybridModel : public BaseModel - { - public: - // Constructor/Destructor - HybridModel(); - virtual ~HybridModel(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) bool Build(const OPCODECREATE& create); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) udword GetUsedBytes() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) bool Refit(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets array of triangles. - * \return array of triangles - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const LeafTriangles* GetLeafTriangles() const { return mTriangles; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets array of indices. - * \return array of indices - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const udword* GetIndices() const { return mIndices; } - - private: - udword mNbLeaves; //!< Number of leaf nodes in the model - LeafTriangles* mTriangles; //!< Array of mNbLeaves leaf descriptors - udword mNbPrimitives; //!< Number of primitives in the model - udword* mIndices; //!< Array of primitive indices - - // Internal methods - void Release(); - }; - -#endif // __OPC_HYBRIDMODEL_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for hybrid models. + * \file OPC_HybridModel.h + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_HYBRIDMODEL_H__ +#define __OPC_HYBRIDMODEL_H__ + + //! Leaf descriptor + struct LeafTriangles + { + udword Data; //!< Packed data + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets number of triangles in the leaf. + * \return number of triangles N, with 0 < N <= 16 + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbTriangles() const { return (Data & 15)+1; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets triangle index for this leaf. Indexed model's array of indices retrieved with HybridModel::GetIndices() + * \return triangle index + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetTriangleIndex() const { return Data>>4; } + inline_ void SetData(udword nb, udword index) { ASSERT(nb>0 && nb<=16); nb--; Data = (index<<4)|(nb&15); } + }; + + class OPCODE_API HybridModel : public BaseModel + { + public: + // Constructor/Destructor + HybridModel(); + virtual ~HybridModel(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) bool Build(const OPCODECREATE& create); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) udword GetUsedBytes() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) bool Refit(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets array of triangles. + * \return array of triangles + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const LeafTriangles* GetLeafTriangles() const { return mTriangles; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets array of indices. + * \return array of indices + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const udword* GetIndices() const { return mIndices; } + + private: + udword mNbLeaves; //!< Number of leaf nodes in the model + LeafTriangles* mTriangles; //!< Array of mNbLeaves leaf descriptors + udword mNbPrimitives; //!< Number of primitives in the model + udword* mIndices; //!< Array of primitive indices + + // Internal methods + void Release(); + }; + +#endif // __OPC_HYBRIDMODEL_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_IceHook.h b/Extras/CDTestFramework/Opcode/OPC_IceHook.h index a257fc1d4..4666d44e5 100644 --- a/Extras/CDTestFramework/Opcode/OPC_IceHook.h +++ b/Extras/CDTestFramework/Opcode/OPC_IceHook.h @@ -1,92 +1,92 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -// Should be included by Opcode.h if needed - - #define ICE_DONT_CHECK_COMPILER_OPTIONS - - // From Windows... - typedef int BOOL; - #ifndef FALSE - #define FALSE 0 - #endif - - #ifndef TRUE - #define TRUE 1 - #endif - - #include - #include - #include - #include - #include - #include - - #ifndef ASSERT - #define ASSERT(exp) {} - #endif - #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] - - #define Log {} - #define SetIceError false - #define EC_OUTOFMEMORY "Out of memory" - - #include ".\Ice\IcePreprocessor.h" - - #undef ICECORE_API - #define ICECORE_API OPCODE_API - - #include ".\Ice\IceTypes.h" - #include ".\Ice\IceFPU.h" - #include ".\Ice\IceMemoryMacros.h" - - namespace Opcode - { - namespace IceCore - { - #include ".\Ice\IceAllocator.h" - #include ".\Ice\IceUtils.h" - #include ".\Ice\IceBitArray.h" - #include ".\Ice\IceContainer.h" - #include ".\Ice\IcePairs.h" - #include ".\Ice\IceRevisitedRadix.h" - #include ".\Ice\IceRandom.h" - #include ".\Ice\IceHashing.h" - } - using namespace IceCore; - - #define ICEMATHS_API OPCODE_API - namespace IceMaths - { - #include ".\Ice\IceAxes.h" - #include ".\Ice\IcePoint.h" - #include ".\Ice\IceHPoint.h" - #include ".\Ice\IceMatrix3x3.h" - #include ".\Ice\IceMatrix4x4.h" - #include ".\Ice\IcePlane.h" - #include ".\Ice\IceRay.h" - #include ".\Ice\IceIndexedTriangle.h" - #include ".\Ice\IceTriangle.h" - #include ".\Ice\IceTriList.h" - #include ".\Ice\IceAABB.h" - #include ".\Ice\IceOBB.h" - #include ".\Ice\IceBoundingSphere.h" - #include ".\Ice\IceSegment.h" - #include ".\Ice\IceLSS.h" - } - using namespace IceMaths; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +// Should be included by Opcode.h if needed + + #define ICE_DONT_CHECK_COMPILER_OPTIONS + + // From Windows... + typedef int BOOL; + #ifndef FALSE + #define FALSE 0 + #endif + + #ifndef TRUE + #define TRUE 1 + #endif + + #include + #include + #include + #include + #include + #include + + #ifndef ASSERT + #define ASSERT(exp) {} + #endif + #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] + + #define Log {} + #define SetIceError false + #define EC_OUTOFMEMORY "Out of memory" + + #include ".\Ice\IcePreprocessor.h" + + #undef ICECORE_API + #define ICECORE_API OPCODE_API + + #include ".\Ice\IceTypes.h" + #include ".\Ice\IceFPU.h" + #include ".\Ice\IceMemoryMacros.h" + + namespace Opcode + { + namespace IceCore + { + #include ".\Ice\IceAllocator.h" + #include ".\Ice\IceUtils.h" + #include ".\Ice\IceBitArray.h" + #include ".\Ice\IceContainer.h" + #include ".\Ice\IcePairs.h" + #include ".\Ice\IceRevisitedRadix.h" + #include ".\Ice\IceRandom.h" + #include ".\Ice\IceHashing.h" + } + using namespace IceCore; + + #define ICEMATHS_API OPCODE_API + namespace IceMaths + { + #include ".\Ice\IceAxes.h" + #include ".\Ice\IcePoint.h" + #include ".\Ice\IceHPoint.h" + #include ".\Ice\IceMatrix3x3.h" + #include ".\Ice\IceMatrix4x4.h" + #include ".\Ice\IcePlane.h" + #include ".\Ice\IceRay.h" + #include ".\Ice\IceIndexedTriangle.h" + #include ".\Ice\IceTriangle.h" + #include ".\Ice\IceTriList.h" + #include ".\Ice\IceAABB.h" + #include ".\Ice\IceOBB.h" + #include ".\Ice\IceBoundingSphere.h" + #include ".\Ice\IceSegment.h" + #include ".\Ice\IceLSS.h" + } + using namespace IceMaths; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h b/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h index 4f4b19f87..6e8e47779 100644 --- a/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h @@ -1,539 +1,539 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -// Following code from Magic-Software (http://www.magic-software.com/) -// A bit modified for Opcode - -inline_ float OPC_PointAABBSqrDist(const Point& point, const Point& center, const Point& extents) -{ - // Compute coordinates of point in box coordinate system - Point Closest = point - center; - - float SqrDistance = 0.0f; - - if(Closest.x < -extents.x) - { - float Delta = Closest.x + extents.x; - SqrDistance += Delta*Delta; - } - else if(Closest.x > extents.x) - { - float Delta = Closest.x - extents.x; - SqrDistance += Delta*Delta; - } - - if(Closest.y < -extents.y) - { - float Delta = Closest.y + extents.y; - SqrDistance += Delta*Delta; - } - else if(Closest.y > extents.y) - { - float Delta = Closest.y - extents.y; - SqrDistance += Delta*Delta; - } - - if(Closest.z < -extents.z) - { - float Delta = Closest.z + extents.z; - SqrDistance += Delta*Delta; - } - else if(Closest.z > extents.z) - { - float Delta = Closest.z - extents.z; - SqrDistance += Delta*Delta; - } - return SqrDistance; -} - -static void Face(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, const Point& rkPmE, float* pfLParam, float& rfSqrDistance) -{ - Point kPpE; - float fLSqr, fInv, fTmp, fParam, fT, fDelta; - - kPpE[i1] = rkPnt[i1] + extents[i1]; - kPpE[i2] = rkPnt[i2] + extents[i2]; - if(rkDir[i0]*kPpE[i1] >= rkDir[i1]*rkPmE[i0]) - { - if(rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0]) - { - // v[i1] >= -e[i1], v[i2] >= -e[i2] (distance = 0) - if(pfLParam) - { - rkPnt[i0] = extents[i0]; - fInv = 1.0f/rkDir[i0]; - rkPnt[i1] -= rkDir[i1]*rkPmE[i0]*fInv; - rkPnt[i2] -= rkDir[i2]*rkPmE[i0]*fInv; - *pfLParam = -rkPmE[i0]*fInv; - } - } - else - { - // v[i1] >= -e[i1], v[i2] < -e[i2] - fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i2]*rkDir[i2]; - fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); - if(fTmp <= 2.0f*fLSqr*extents[i1]) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i1]*rkDir[i1]; - fTmp = kPpE[i1] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = fT - extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - else - { - fLSqr += rkDir[i1]*rkDir[i1]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - } - } - else - { - if ( rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0] ) - { - // v[i1] < -e[i1], v[i2] >= -e[i2] - fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; - fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); - if(fTmp <= 2.0f*fLSqr*extents[i2]) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i2]*rkDir[i2]; - fTmp = kPpE[i2] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = fT - extents[i2]; - } - } - else - { - fLSqr += rkDir[i2]*rkDir[i2]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = extents[i2]; - } - } - } - else - { - // v[i1] < -e[i1], v[i2] < -e[i2] - fLSqr = rkDir[i0]*rkDir[i0]+rkDir[i2]*rkDir[i2]; - fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); - if(fTmp >= 0.0f) - { - // v[i1]-edge is closest - if ( fTmp <= 2.0f*fLSqr*extents[i1] ) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i1]*rkDir[i1]; - fTmp = kPpE[i1] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = fT - extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - else - { - fLSqr += rkDir[i1]*rkDir[i1]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - return; - } - - fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; - fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); - if(fTmp >= 0.0f) - { - // v[i2]-edge is closest - if(fTmp <= 2.0f*fLSqr*extents[i2]) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i2]*rkDir[i2]; - fTmp = kPpE[i2] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = fT - extents[i2]; - } - } - else - { - fLSqr += rkDir[i2]*rkDir[i2]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = extents[i2]; - } - } - return; - } - - // (v[i1],v[i2])-corner is closest - fLSqr += rkDir[i2]*rkDir[i2]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - } -} - -static void CaseNoZeros(Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) -{ - Point kPmE(rkPnt.x - extents.x, rkPnt.y - extents.y, rkPnt.z - extents.z); - - float fProdDxPy, fProdDyPx, fProdDzPx, fProdDxPz, fProdDzPy, fProdDyPz; - - fProdDxPy = rkDir.x*kPmE.y; - fProdDyPx = rkDir.y*kPmE.x; - if(fProdDyPx >= fProdDxPy) - { - fProdDzPx = rkDir.z*kPmE.x; - fProdDxPz = rkDir.x*kPmE.z; - if(fProdDzPx >= fProdDxPz) - { - // line intersects x = e0 - Face(0, 1, 2, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - else - { - // line intersects z = e2 - Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - } - else - { - fProdDzPy = rkDir.z*kPmE.y; - fProdDyPz = rkDir.y*kPmE.z; - if(fProdDzPy >= fProdDyPz) - { - // line intersects y = e1 - Face(1, 2, 0, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - else - { - // line intersects z = e2 - Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - } -} - -static void Case0(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) -{ - float fPmE0 = rkPnt[i0] - extents[i0]; - float fPmE1 = rkPnt[i1] - extents[i1]; - float fProd0 = rkDir[i1]*fPmE0; - float fProd1 = rkDir[i0]*fPmE1; - float fDelta, fInvLSqr, fInv; - - if(fProd0 >= fProd1) - { - // line intersects P[i0] = e[i0] - rkPnt[i0] = extents[i0]; - - float fPpE1 = rkPnt[i1] + extents[i1]; - fDelta = fProd0 - rkDir[i0]*fPpE1; - if(fDelta >= 0.0f) - { - fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); - rfSqrDistance += fDelta*fDelta*fInvLSqr; - if(pfLParam) - { - rkPnt[i1] = -extents[i1]; - *pfLParam = -(rkDir[i0]*fPmE0+rkDir[i1]*fPpE1)*fInvLSqr; - } - } - else - { - if(pfLParam) - { - fInv = 1.0f/rkDir[i0]; - rkPnt[i1] -= fProd0*fInv; - *pfLParam = -fPmE0*fInv; - } - } - } - else - { - // line intersects P[i1] = e[i1] - rkPnt[i1] = extents[i1]; - - float fPpE0 = rkPnt[i0] + extents[i0]; - fDelta = fProd1 - rkDir[i1]*fPpE0; - if(fDelta >= 0.0f) - { - fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); - rfSqrDistance += fDelta*fDelta*fInvLSqr; - if(pfLParam) - { - rkPnt[i0] = -extents[i0]; - *pfLParam = -(rkDir[i0]*fPpE0+rkDir[i1]*fPmE1)*fInvLSqr; - } - } - else - { - if(pfLParam) - { - fInv = 1.0f/rkDir[i1]; - rkPnt[i0] -= fProd1*fInv; - *pfLParam = -fPmE1*fInv; - } - } - } - - if(rkPnt[i2] < -extents[i2]) - { - fDelta = rkPnt[i2] + extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i2] = -extents[i2]; - } - else if ( rkPnt[i2] > extents[i2] ) - { - fDelta = rkPnt[i2] - extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i2] = extents[i2]; - } -} - -static void Case00(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) -{ - float fDelta; - - if(pfLParam) - *pfLParam = (extents[i0] - rkPnt[i0])/rkDir[i0]; - - rkPnt[i0] = extents[i0]; - - if(rkPnt[i1] < -extents[i1]) - { - fDelta = rkPnt[i1] + extents[i1]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i1] = -extents[i1]; - } - else if(rkPnt[i1] > extents[i1]) - { - fDelta = rkPnt[i1] - extents[i1]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i1] = extents[i1]; - } - - if(rkPnt[i2] < -extents[i2]) - { - fDelta = rkPnt[i2] + extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i1] = -extents[i2]; - } - else if(rkPnt[i2] > extents[i2]) - { - fDelta = rkPnt[i2] - extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i2] = extents[i2]; - } -} - -static void Case000(Point& rkPnt, const Point& extents, float& rfSqrDistance) -{ - float fDelta; - - if(rkPnt.x < -extents.x) - { - fDelta = rkPnt.x + extents.x; - rfSqrDistance += fDelta*fDelta; - rkPnt.x = -extents.x; - } - else if(rkPnt.x > extents.x) - { - fDelta = rkPnt.x - extents.x; - rfSqrDistance += fDelta*fDelta; - rkPnt.x = extents.x; - } - - if(rkPnt.y < -extents.y) - { - fDelta = rkPnt.y + extents.y; - rfSqrDistance += fDelta*fDelta; - rkPnt.y = -extents.y; - } - else if(rkPnt.y > extents.y) - { - fDelta = rkPnt.y - extents.y; - rfSqrDistance += fDelta*fDelta; - rkPnt.y = extents.y; - } - - if(rkPnt.z < -extents.z) - { - fDelta = rkPnt.z + extents.z; - rfSqrDistance += fDelta*fDelta; - rkPnt.z = -extents.z; - } - else if(rkPnt.z > extents.z) - { - fDelta = rkPnt.z - extents.z; - rfSqrDistance += fDelta*fDelta; - rkPnt.z = extents.z; - } -} - -static float SqrDistance(const Ray& rkLine, const Point& center, const Point& extents, float* pfLParam) -{ - // compute coordinates of line in box coordinate system - Point kDiff = rkLine.mOrig - center; - Point kPnt = kDiff; - Point kDir = rkLine.mDir; - - // Apply reflections so that direction vector has nonnegative components. - bool bReflect[3]; - for(int i=0;i<3;i++) - { - if(kDir[i]<0.0f) - { - kPnt[i] = -kPnt[i]; - kDir[i] = -kDir[i]; - bReflect[i] = true; - } - else - { - bReflect[i] = false; - } - } - - float fSqrDistance = 0.0f; - - if(kDir.x>0.0f) - { - if(kDir.y>0.0f) - { - if(kDir.z>0.0f) CaseNoZeros(kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,+) - else Case0(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,0) - } - else - { - if(kDir.z>0.0f) Case0(0, 2, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,+) - else Case00(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,0) - } - } - else - { - if(kDir.y>0.0f) - { - if(kDir.z>0.0f) Case0(1, 2, 0, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,+) - else Case00(1, 0, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,0) - } - else - { - if(kDir.z>0.0f) Case00(2, 0, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,0,+) - else - { - Case000(kPnt, extents, fSqrDistance); // (0,0,0) - if(pfLParam) *pfLParam = 0.0f; - } - } - } - return fSqrDistance; -} - -inline_ float OPC_SegmentOBBSqrDist(const Segment& segment, const Point& c0, const Point& e0) -{ - float fLP; - float fSqrDistance = SqrDistance(Ray(segment.GetOrigin(), segment.ComputeDirection()), c0, e0, &fLP); - if(fLP>=0.0f) - { - if(fLP<=1.0f) return fSqrDistance; - else return OPC_PointAABBSqrDist(segment.mP1, c0, e0); - } - else return OPC_PointAABBSqrDist(segment.mP0, c0, e0); -} - -inline_ BOOL LSSCollider::LSSAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbVolumeBVTests++; - - float s2 = OPC_SegmentOBBSqrDist(mSeg, center, extents); - if(s2 extents.x) + { + float Delta = Closest.x - extents.x; + SqrDistance += Delta*Delta; + } + + if(Closest.y < -extents.y) + { + float Delta = Closest.y + extents.y; + SqrDistance += Delta*Delta; + } + else if(Closest.y > extents.y) + { + float Delta = Closest.y - extents.y; + SqrDistance += Delta*Delta; + } + + if(Closest.z < -extents.z) + { + float Delta = Closest.z + extents.z; + SqrDistance += Delta*Delta; + } + else if(Closest.z > extents.z) + { + float Delta = Closest.z - extents.z; + SqrDistance += Delta*Delta; + } + return SqrDistance; +} + +static void Face(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, const Point& rkPmE, float* pfLParam, float& rfSqrDistance) +{ + Point kPpE; + float fLSqr, fInv, fTmp, fParam, fT, fDelta; + + kPpE[i1] = rkPnt[i1] + extents[i1]; + kPpE[i2] = rkPnt[i2] + extents[i2]; + if(rkDir[i0]*kPpE[i1] >= rkDir[i1]*rkPmE[i0]) + { + if(rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0]) + { + // v[i1] >= -e[i1], v[i2] >= -e[i2] (distance = 0) + if(pfLParam) + { + rkPnt[i0] = extents[i0]; + fInv = 1.0f/rkDir[i0]; + rkPnt[i1] -= rkDir[i1]*rkPmE[i0]*fInv; + rkPnt[i2] -= rkDir[i2]*rkPmE[i0]*fInv; + *pfLParam = -rkPmE[i0]*fInv; + } + } + else + { + // v[i1] >= -e[i1], v[i2] < -e[i2] + fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i2]*rkDir[i2]; + fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); + if(fTmp <= 2.0f*fLSqr*extents[i1]) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i1]*rkDir[i1]; + fTmp = kPpE[i1] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = fT - extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + else + { + fLSqr += rkDir[i1]*rkDir[i1]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + } + } + else + { + if ( rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0] ) + { + // v[i1] < -e[i1], v[i2] >= -e[i2] + fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; + fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); + if(fTmp <= 2.0f*fLSqr*extents[i2]) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i2]*rkDir[i2]; + fTmp = kPpE[i2] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = fT - extents[i2]; + } + } + else + { + fLSqr += rkDir[i2]*rkDir[i2]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = extents[i2]; + } + } + } + else + { + // v[i1] < -e[i1], v[i2] < -e[i2] + fLSqr = rkDir[i0]*rkDir[i0]+rkDir[i2]*rkDir[i2]; + fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); + if(fTmp >= 0.0f) + { + // v[i1]-edge is closest + if ( fTmp <= 2.0f*fLSqr*extents[i1] ) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i1]*rkDir[i1]; + fTmp = kPpE[i1] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = fT - extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + else + { + fLSqr += rkDir[i1]*rkDir[i1]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + return; + } + + fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; + fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); + if(fTmp >= 0.0f) + { + // v[i2]-edge is closest + if(fTmp <= 2.0f*fLSqr*extents[i2]) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i2]*rkDir[i2]; + fTmp = kPpE[i2] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = fT - extents[i2]; + } + } + else + { + fLSqr += rkDir[i2]*rkDir[i2]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = extents[i2]; + } + } + return; + } + + // (v[i1],v[i2])-corner is closest + fLSqr += rkDir[i2]*rkDir[i2]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + } +} + +static void CaseNoZeros(Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) +{ + Point kPmE(rkPnt.x - extents.x, rkPnt.y - extents.y, rkPnt.z - extents.z); + + float fProdDxPy, fProdDyPx, fProdDzPx, fProdDxPz, fProdDzPy, fProdDyPz; + + fProdDxPy = rkDir.x*kPmE.y; + fProdDyPx = rkDir.y*kPmE.x; + if(fProdDyPx >= fProdDxPy) + { + fProdDzPx = rkDir.z*kPmE.x; + fProdDxPz = rkDir.x*kPmE.z; + if(fProdDzPx >= fProdDxPz) + { + // line intersects x = e0 + Face(0, 1, 2, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + else + { + // line intersects z = e2 + Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + } + else + { + fProdDzPy = rkDir.z*kPmE.y; + fProdDyPz = rkDir.y*kPmE.z; + if(fProdDzPy >= fProdDyPz) + { + // line intersects y = e1 + Face(1, 2, 0, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + else + { + // line intersects z = e2 + Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + } +} + +static void Case0(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) +{ + float fPmE0 = rkPnt[i0] - extents[i0]; + float fPmE1 = rkPnt[i1] - extents[i1]; + float fProd0 = rkDir[i1]*fPmE0; + float fProd1 = rkDir[i0]*fPmE1; + float fDelta, fInvLSqr, fInv; + + if(fProd0 >= fProd1) + { + // line intersects P[i0] = e[i0] + rkPnt[i0] = extents[i0]; + + float fPpE1 = rkPnt[i1] + extents[i1]; + fDelta = fProd0 - rkDir[i0]*fPpE1; + if(fDelta >= 0.0f) + { + fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); + rfSqrDistance += fDelta*fDelta*fInvLSqr; + if(pfLParam) + { + rkPnt[i1] = -extents[i1]; + *pfLParam = -(rkDir[i0]*fPmE0+rkDir[i1]*fPpE1)*fInvLSqr; + } + } + else + { + if(pfLParam) + { + fInv = 1.0f/rkDir[i0]; + rkPnt[i1] -= fProd0*fInv; + *pfLParam = -fPmE0*fInv; + } + } + } + else + { + // line intersects P[i1] = e[i1] + rkPnt[i1] = extents[i1]; + + float fPpE0 = rkPnt[i0] + extents[i0]; + fDelta = fProd1 - rkDir[i1]*fPpE0; + if(fDelta >= 0.0f) + { + fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); + rfSqrDistance += fDelta*fDelta*fInvLSqr; + if(pfLParam) + { + rkPnt[i0] = -extents[i0]; + *pfLParam = -(rkDir[i0]*fPpE0+rkDir[i1]*fPmE1)*fInvLSqr; + } + } + else + { + if(pfLParam) + { + fInv = 1.0f/rkDir[i1]; + rkPnt[i0] -= fProd1*fInv; + *pfLParam = -fPmE1*fInv; + } + } + } + + if(rkPnt[i2] < -extents[i2]) + { + fDelta = rkPnt[i2] + extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i2] = -extents[i2]; + } + else if ( rkPnt[i2] > extents[i2] ) + { + fDelta = rkPnt[i2] - extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i2] = extents[i2]; + } +} + +static void Case00(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) +{ + float fDelta; + + if(pfLParam) + *pfLParam = (extents[i0] - rkPnt[i0])/rkDir[i0]; + + rkPnt[i0] = extents[i0]; + + if(rkPnt[i1] < -extents[i1]) + { + fDelta = rkPnt[i1] + extents[i1]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i1] = -extents[i1]; + } + else if(rkPnt[i1] > extents[i1]) + { + fDelta = rkPnt[i1] - extents[i1]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i1] = extents[i1]; + } + + if(rkPnt[i2] < -extents[i2]) + { + fDelta = rkPnt[i2] + extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i1] = -extents[i2]; + } + else if(rkPnt[i2] > extents[i2]) + { + fDelta = rkPnt[i2] - extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i2] = extents[i2]; + } +} + +static void Case000(Point& rkPnt, const Point& extents, float& rfSqrDistance) +{ + float fDelta; + + if(rkPnt.x < -extents.x) + { + fDelta = rkPnt.x + extents.x; + rfSqrDistance += fDelta*fDelta; + rkPnt.x = -extents.x; + } + else if(rkPnt.x > extents.x) + { + fDelta = rkPnt.x - extents.x; + rfSqrDistance += fDelta*fDelta; + rkPnt.x = extents.x; + } + + if(rkPnt.y < -extents.y) + { + fDelta = rkPnt.y + extents.y; + rfSqrDistance += fDelta*fDelta; + rkPnt.y = -extents.y; + } + else if(rkPnt.y > extents.y) + { + fDelta = rkPnt.y - extents.y; + rfSqrDistance += fDelta*fDelta; + rkPnt.y = extents.y; + } + + if(rkPnt.z < -extents.z) + { + fDelta = rkPnt.z + extents.z; + rfSqrDistance += fDelta*fDelta; + rkPnt.z = -extents.z; + } + else if(rkPnt.z > extents.z) + { + fDelta = rkPnt.z - extents.z; + rfSqrDistance += fDelta*fDelta; + rkPnt.z = extents.z; + } +} + +static float SqrDistance(const Ray& rkLine, const Point& center, const Point& extents, float* pfLParam) +{ + // compute coordinates of line in box coordinate system + Point kDiff = rkLine.mOrig - center; + Point kPnt = kDiff; + Point kDir = rkLine.mDir; + + // Apply reflections so that direction vector has nonnegative components. + bool bReflect[3]; + for(int i=0;i<3;i++) + { + if(kDir[i]<0.0f) + { + kPnt[i] = -kPnt[i]; + kDir[i] = -kDir[i]; + bReflect[i] = true; + } + else + { + bReflect[i] = false; + } + } + + float fSqrDistance = 0.0f; + + if(kDir.x>0.0f) + { + if(kDir.y>0.0f) + { + if(kDir.z>0.0f) CaseNoZeros(kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,+) + else Case0(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,0) + } + else + { + if(kDir.z>0.0f) Case0(0, 2, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,+) + else Case00(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,0) + } + } + else + { + if(kDir.y>0.0f) + { + if(kDir.z>0.0f) Case0(1, 2, 0, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,+) + else Case00(1, 0, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,0) + } + else + { + if(kDir.z>0.0f) Case00(2, 0, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,0,+) + else + { + Case000(kPnt, extents, fSqrDistance); // (0,0,0) + if(pfLParam) *pfLParam = 0.0f; + } + } + } + return fSqrDistance; +} + +inline_ float OPC_SegmentOBBSqrDist(const Segment& segment, const Point& c0, const Point& e0) +{ + float fLP; + float fSqrDistance = SqrDistance(Ray(segment.GetOrigin(), segment.ComputeDirection()), c0, e0, &fLP); + if(fLP>=0.0f) + { + if(fLP<=1.0f) return fSqrDistance; + else return OPC_PointAABBSqrDist(segment.mP1, c0, e0); + } + else return OPC_PointAABBSqrDist(segment.mP0, c0, e0); +} + +inline_ BOOL LSSCollider::LSSAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbVolumeBVTests++; + + float s2 = OPC_SegmentOBBSqrDist(mSeg, center, extents); + if(s2Add(prim_index); - -//! LSS-triangle overlap test -#define LSS_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - \ - /* Perform LSS-tri overlap test */ \ - if(LSSTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -LSSCollider::LSSCollider() -{ -// mCenter.Zero(); -// mRadius2 = 0.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -LSSCollider::~LSSCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] an lss cache - * \param lss [in] collision lss in local space - * \param model [in] Opcode model to collide with - * \param worldl [in] lss world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, lss, worldl, worldm)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - check temporal coherence - * - * \param cache [in/out] an lss cache - * \param lss [in] lss in local space - * \param worldl [in] lss world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL LSSCollider::InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute LSS in model space: - // - Precompute R^2 - mRadius2 = lss.mRadius * lss.mRadius; - // - Compute segment - mSeg.mP0 = lss.mP0; - mSeg.mP1 = lss.mP1; - // -> to world space - if(worldl) - { - mSeg.mP0 *= *worldl; - mSeg.mP1 *= *worldl; - } - // -> to model space - if(worldm) - { - // Invert model matrix - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - - mSeg.mP0 *= InvWorldM; - mSeg.mP1 *= InvWorldM; - } - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the LSS (and set contact status if needed) - LSS_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence : - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the LSS (and set contact status if needed) - LSS_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // We're interested in all contacts =>test the new real LSS N(ew) against the previous fat LSS P(revious): - - // ### rewrite this - - LSS Test(mSeg, lss.mRadius); // in model space - LSS Previous(cache.Previous, sqrtf(cache.Previous.mRadius)); - -// if(cache.Previous.Contains(Test)) - if(IsCacheValid(cache) && Previous.Contains(Test)) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat sphere so that coherence will work for subsequent frames - mRadius2 *= cache.FatCoeff; -// mRadius2 = (lss.mRadius * cache.FatCoeff)*(lss.mRadius * cache.FatCoeff); - - - // Update cache with query data (signature for cached faces) - cache.Previous.mP0 = mSeg.mP0; - cache.Previous.mP1 = mSeg.mP1; - cache.Previous.mRadius = mRadius2; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for vanilla AABB trees. - * \param cache [in/out] an lss cache - * \param lss [in] collision lss in world space - * \param tree [in] AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree) -{ - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - if(InitQuery(cache, lss)) return true; - - // Perform collision query - _Collide(tree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the LSS completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the LSS contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL LSSCollider::LSSContainsBox(const Point& bc, const Point& be) -{ - // Not implemented - return FALSE; -} - -#define TEST_BOX_IN_LSS(center, extents) \ - if(LSSContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->IsLeaf()) - { - LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for vanilla AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBTreeNode* node) -{ - // Perform LSS-AABB overlap test - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!LSSAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf() || LSSContainsBox(Center, Extents)) - { - mFlags |= OPC_CONTACT; - mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _Collide(node->GetPos()); - _Collide(node->GetNeg()); - } -} - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridLSSCollider::HybridLSSCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridLSSCollider::~HybridLSSCollider() -{ -} - -bool HybridLSSCollider::Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, lss, worldl, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - LSS_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - LSS_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an LSS collider. + * \file OPC_LSSCollider.cpp + * \author Pierre Terdiman + * \date December, 28, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a lss-vs-tree collider. + * + * \class LSSCollider + * \author Pierre Terdiman + * \version 1.3 + * \date December, 28, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_LSSAABBOverlap.h" +#include "OPC_LSSTriOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! LSS-triangle overlap test +#define LSS_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + \ + /* Perform LSS-tri overlap test */ \ + if(LSSTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +LSSCollider::LSSCollider() +{ +// mCenter.Zero(); +// mRadius2 = 0.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +LSSCollider::~LSSCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] an lss cache + * \param lss [in] collision lss in local space + * \param model [in] Opcode model to collide with + * \param worldl [in] lss world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, lss, worldl, worldm)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * - check temporal coherence + * + * \param cache [in/out] an lss cache + * \param lss [in] lss in local space + * \param worldl [in] lss world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL LSSCollider::InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute LSS in model space: + // - Precompute R^2 + mRadius2 = lss.mRadius * lss.mRadius; + // - Compute segment + mSeg.mP0 = lss.mP0; + mSeg.mP1 = lss.mP1; + // -> to world space + if(worldl) + { + mSeg.mP0 *= *worldl; + mSeg.mP1 *= *worldl; + } + // -> to model space + if(worldm) + { + // Invert model matrix + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + + mSeg.mP0 *= InvWorldM; + mSeg.mP1 *= InvWorldM; + } + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the LSS (and set contact status if needed) + LSS_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence : + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the LSS (and set contact status if needed) + LSS_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // We're interested in all contacts =>test the new real LSS N(ew) against the previous fat LSS P(revious): + + // ### rewrite this + + LSS Test(mSeg, lss.mRadius); // in model space + LSS Previous(cache.Previous, sqrtf(cache.Previous.mRadius)); + +// if(cache.Previous.Contains(Test)) + if(IsCacheValid(cache) && Previous.Contains(Test)) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat sphere so that coherence will work for subsequent frames + mRadius2 *= cache.FatCoeff; +// mRadius2 = (lss.mRadius * cache.FatCoeff)*(lss.mRadius * cache.FatCoeff); + + + // Update cache with query data (signature for cached faces) + cache.Previous.mP0 = mSeg.mP0; + cache.Previous.mP1 = mSeg.mP1; + cache.Previous.mRadius = mRadius2; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for vanilla AABB trees. + * \param cache [in/out] an lss cache + * \param lss [in] collision lss in world space + * \param tree [in] AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree) +{ + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + if(InitQuery(cache, lss)) return true; + + // Perform collision query + _Collide(tree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the LSS completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the LSS contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL LSSCollider::LSSContainsBox(const Point& bc, const Point& be) +{ + // Not implemented + return FALSE; +} + +#define TEST_BOX_IN_LSS(center, extents) \ + if(LSSContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->IsLeaf()) + { + LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for vanilla AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBTreeNode* node) +{ + // Perform LSS-AABB overlap test + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!LSSAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf() || LSSContainsBox(Center, Extents)) + { + mFlags |= OPC_CONTACT; + mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _Collide(node->GetPos()); + _Collide(node->GetNeg()); + } +} + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridLSSCollider::HybridLSSCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridLSSCollider::~HybridLSSCollider() +{ +} + +bool HybridLSSCollider::Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, lss, worldl, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + LSS_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + LSS_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h b/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h index d4d9a99cc..43921b309 100644 --- a/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h @@ -1,108 +1,108 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an LSS collider. - * \file OPC_LSSCollider.h - * \author Pierre Terdiman - * \date December, 28, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_LSSCOLLIDER_H__ -#define __OPC_LSSCOLLIDER_H__ - - struct OPCODE_API LSSCache : VolumeCache - { - LSSCache() - { - Previous.mP0 = Point(0.0f, 0.0f, 0.0f); - Previous.mP1 = Point(0.0f, 0.0f, 0.0f); - Previous.mRadius = 0.0f; - FatCoeff = 1.1f; - } - - // Cached faces signature - LSS Previous; //!< LSS used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< mRadius2 multiplier used to create a fat LSS - }; - - class OPCODE_API LSSCollider : public VolumeCollider - { - public: - // Constructor / Destructor - LSSCollider(); - virtual ~LSSCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] an lss cache - * \param lss [in] collision lss in local space - * \param model [in] Opcode model to collide with - * \param worldl [in] lss world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); - // - bool Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree); - protected: - // LSS in model space - Segment mSeg; //!< Segment - float mRadius2; //!< LSS radius squared - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _Collide(const AABBTreeNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL LSSContainsBox(const Point& bc, const Point& be); - inline_ BOOL LSSAABBOverlap(const Point& center, const Point& extents); - inline_ BOOL LSSTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); - // Init methods - BOOL InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); - }; - - class OPCODE_API HybridLSSCollider : public LSSCollider - { - public: - // Constructor / Destructor - HybridLSSCollider(); - virtual ~HybridLSSCollider(); - - bool Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_LSSCOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an LSS collider. + * \file OPC_LSSCollider.h + * \author Pierre Terdiman + * \date December, 28, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_LSSCOLLIDER_H__ +#define __OPC_LSSCOLLIDER_H__ + + struct OPCODE_API LSSCache : VolumeCache + { + LSSCache() + { + Previous.mP0 = Point(0.0f, 0.0f, 0.0f); + Previous.mP1 = Point(0.0f, 0.0f, 0.0f); + Previous.mRadius = 0.0f; + FatCoeff = 1.1f; + } + + // Cached faces signature + LSS Previous; //!< LSS used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< mRadius2 multiplier used to create a fat LSS + }; + + class OPCODE_API LSSCollider : public VolumeCollider + { + public: + // Constructor / Destructor + LSSCollider(); + virtual ~LSSCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] an lss cache + * \param lss [in] collision lss in local space + * \param model [in] Opcode model to collide with + * \param worldl [in] lss world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); + // + bool Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree); + protected: + // LSS in model space + Segment mSeg; //!< Segment + float mRadius2; //!< LSS radius squared + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _Collide(const AABBTreeNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL LSSContainsBox(const Point& bc, const Point& be); + inline_ BOOL LSSAABBOverlap(const Point& center, const Point& extents); + inline_ BOOL LSSTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); + // Init methods + BOOL InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); + }; + + class OPCODE_API HybridLSSCollider : public LSSCollider + { + public: + // Constructor / Destructor + HybridLSSCollider(); + virtual ~HybridLSSCollider(); + + bool Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_LSSCOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h b/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h index ea4fb7526..b6171a86f 100644 --- a/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h @@ -1,696 +1,696 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -// Following code from Magic-Software (http://www.magic-software.com/) -// A bit modified for Opcode - -static const float gs_fTolerance = 1e-05f; - -static float OPC_PointTriangleSqrDist(const Point& point, const Point& p0, const Point& p1, const Point& p2) -{ - // Hook - Point TriEdge0 = p1 - p0; - Point TriEdge1 = p2 - p0; - - Point kDiff = p0 - point; - float fA00 = TriEdge0.SquareMagnitude(); - float fA01 = TriEdge0 | TriEdge1; - float fA11 = TriEdge1.SquareMagnitude(); - float fB0 = kDiff | TriEdge0; - float fB1 = kDiff | TriEdge1; - float fC = kDiff.SquareMagnitude(); - float fDet = fabsf(fA00*fA11 - fA01*fA01); - float fS = fA01*fB1-fA11*fB0; - float fT = fA01*fB0-fA00*fB1; - float fSqrDist; - - if(fS + fT <= fDet) - { - if(fS < 0.0f) - { - if(fT < 0.0f) // region 4 - { - if(fB0 < 0.0f) - { - if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - if(fB1 >= 0.0f) fSqrDist = fC; - else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - else // region 3 - { - if(fB1 >= 0.0f) fSqrDist = fC; - else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - else if(fT < 0.0f) // region 5 - { - if(fB0 >= 0.0f) fSqrDist = fC; - else if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else // region 0 - { - // minimum at interior point - if(fDet==0.0f) - { - fSqrDist = MAX_FLOAT; - } - else - { - float fInvDet = 1.0f/fDet; - fS *= fInvDet; - fT *= fInvDet; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - } - else - { - float fTmp0, fTmp1, fNumer, fDenom; - - if(fS < 0.0f) // region 2 - { - fTmp0 = fA01 + fB0; - fTmp1 = fA11 + fB1; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { - fSqrDist = fA00+2.0f*fB0+fC; - } - else - { - fS = fNumer/fDenom; - fT = 1.0f - fS; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - else - { - if(fTmp1 <= 0.0f) fSqrDist = fA11+2.0f*fB1+fC; - else if(fB1 >= 0.0f) fSqrDist = fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - else if(fT < 0.0f) // region 6 - { - fTmp0 = fA01 + fB1; - fTmp1 = fA00 + fB0; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { - fSqrDist = fA11+2.0f*fB1+fC; - } - else - { - fT = fNumer/fDenom; - fS = 1.0f - fT; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - else - { - if(fTmp1 <= 0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(fB0 >= 0.0f) fSqrDist = fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - } - else // region 1 - { - fNumer = fA11 + fB1 - fA01 - fB0; - if(fNumer <= 0.0f) - { - fSqrDist = fA11+2.0f*fB1+fC; - } - else - { - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { - fSqrDist = fA00+2.0f*fB0+fC; - } - else - { - fS = fNumer/fDenom; - fT = 1.0f - fS; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - } - } - return fabsf(fSqrDist); -} - -static float OPC_SegmentSegmentSqrDist(const Segment& rkSeg0, const Segment& rkSeg1) -{ - // Hook - Point rkSeg0Direction = rkSeg0.ComputeDirection(); - Point rkSeg1Direction = rkSeg1.ComputeDirection(); - - Point kDiff = rkSeg0.mP0 - rkSeg1.mP0; - float fA00 = rkSeg0Direction.SquareMagnitude(); - float fA01 = -rkSeg0Direction.Dot(rkSeg1Direction); - float fA11 = rkSeg1Direction.SquareMagnitude(); - float fB0 = kDiff.Dot(rkSeg0Direction); - float fC = kDiff.SquareMagnitude(); - float fDet = fabsf(fA00*fA11-fA01*fA01); - - float fB1, fS, fT, fSqrDist, fTmp; - - if(fDet>=gs_fTolerance) - { - // line segments are not parallel - fB1 = -kDiff.Dot(rkSeg1Direction); - fS = fA01*fB1-fA11*fB0; - fT = fA01*fB0-fA00*fB1; - - if(fS >= 0.0f) - { - if(fS <= fDet) - { - if(fT >= 0.0f) - { - if(fT <= fDet) // region 0 (interior) - { - // minimum at two interior points of 3D lines - float fInvDet = 1.0f/fDet; - fS *= fInvDet; - fT *= fInvDet; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - else // region 3 (side) - { - fTmp = fA01+fB0; - if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; - else if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); - else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; - } - } - else // region 7 (side) - { - if(fB0>=0.0f) fSqrDist = fC; - else if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - } - else - { - if ( fT >= 0.0 ) - { - if ( fT <= fDet ) // region 1 (side) - { - fTmp = fA01+fB1; - if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); - else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; - } - else // region 2 (corner) - { - fTmp = fA01+fB0; - if ( -fTmp <= fA00 ) - { - if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; - } - else - { - fTmp = fA01+fB1; - if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); - else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; - } - } - } - else // region 8 (corner) - { - if ( -fB0 < fA00 ) - { - if(fB0>=0.0f) fSqrDist = fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - fTmp = fA01+fB1; - if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); - else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; - } - } - } - } - else - { - if ( fT >= 0.0f ) - { - if ( fT <= fDet ) // region 5 (side) - { - if(fB1>=0.0f) fSqrDist = fC; - else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - else // region 4 (corner) - { - fTmp = fA01+fB0; - if ( fTmp < 0.0f ) - { - if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); - else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; - } - else - { - if(fB1>=0.0f) fSqrDist = fC; - else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - } - else // region 6 (corner) - { - if ( fB0 < 0.0f ) - { - if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - if(fB1>=0.0f) fSqrDist = fC; - else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - } - } - else - { - // line segments are parallel - if ( fA01 > 0.0f ) - { - // direction vectors form an obtuse angle - if ( fB0 >= 0.0f ) - { - fSqrDist = fC; - } - else if ( -fB0 <= fA00 ) - { - fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - fB1 = -kDiff.Dot(rkSeg1Direction); - fTmp = fA00+fB0; - if ( -fTmp >= fA01 ) - { - fSqrDist = fA00+fA11+fC+2.0f*(fA01+fB0+fB1); - } - else - { - fT = -fTmp/fA01; - fSqrDist = fA00+2.0f*fB0+fC+fT*(fA11*fT+2.0f*(fA01+fB1)); - } - } - } - else - { - // direction vectors form an acute angle - if ( -fB0 >= fA00 ) - { - fSqrDist = fA00+2.0f*fB0+fC; - } - else if ( fB0 <= 0.0f ) - { - fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - fB1 = -kDiff.Dot(rkSeg1Direction); - if ( fB0 >= -fA01 ) - { - fSqrDist = fA11+2.0f*fB1+fC; - } - else - { - fT = -fB0/fA01; - fSqrDist = fC+fT*(2.0f*fB1+fA11*fT); - } - } - } - } - return fabsf(fSqrDist); -} - -inline_ float OPC_SegmentRaySqrDist(const Segment& rkSeg0, const Ray& rkSeg1) -{ - return OPC_SegmentSegmentSqrDist(rkSeg0, Segment(rkSeg1.mOrig, rkSeg1.mOrig + rkSeg1.mDir)); -} - -static float OPC_SegmentTriangleSqrDist(const Segment& segment, const Point& p0, const Point& p1, const Point& p2) -{ - // Hook - const Point TriEdge0 = p1 - p0; - const Point TriEdge1 = p2 - p0; - - const Point& rkSegOrigin = segment.GetOrigin(); - Point rkSegDirection = segment.ComputeDirection(); - - Point kDiff = p0 - rkSegOrigin; - float fA00 = rkSegDirection.SquareMagnitude(); - float fA01 = -rkSegDirection.Dot(TriEdge0); - float fA02 = -rkSegDirection.Dot(TriEdge1); - float fA11 = TriEdge0.SquareMagnitude(); - float fA12 = TriEdge0.Dot(TriEdge1); - float fA22 = TriEdge1.Dot(TriEdge1); - float fB0 = -kDiff.Dot(rkSegDirection); - float fB1 = kDiff.Dot(TriEdge0); - float fB2 = kDiff.Dot(TriEdge1); - float fCof00 = fA11*fA22-fA12*fA12; - float fCof01 = fA02*fA12-fA01*fA22; - float fCof02 = fA01*fA12-fA02*fA11; - float fDet = fA00*fCof00+fA01*fCof01+fA02*fCof02; - - Ray kTriSeg; - Point kPt; - float fSqrDist, fSqrDist0; - - if(fabsf(fDet)>=gs_fTolerance) - { - float fCof11 = fA00*fA22-fA02*fA02; - float fCof12 = fA02*fA01-fA00*fA12; - float fCof22 = fA00*fA11-fA01*fA01; - float fInvDet = 1.0f/fDet; - float fRhs0 = -fB0*fInvDet; - float fRhs1 = -fB1*fInvDet; - float fRhs2 = -fB2*fInvDet; - - float fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2; - float fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2; - float fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2; - - if ( fR < 0.0f ) - { - if ( fS+fT <= 1.0f ) - { - if ( fS < 0.0f ) - { - if ( fT < 0.0f ) // region 4m - { - // min on face s=0 or t=0 or r=0 - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge1; - fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge0; - fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); - if(fSqrDist0 1 - { - if ( fS+fT <= 1.0f ) - { - if ( fS < 0.0f ) - { - if ( fT < 0.0f ) // region 4p - { - // min on face s=0 or t=0 or r=1 - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge1; - fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge0; - fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); - if(fSqrDist0= fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + if(fB1 >= 0.0f) fSqrDist = fC; + else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + else // region 3 + { + if(fB1 >= 0.0f) fSqrDist = fC; + else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + else if(fT < 0.0f) // region 5 + { + if(fB0 >= 0.0f) fSqrDist = fC; + else if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else // region 0 + { + // minimum at interior point + if(fDet==0.0f) + { + fSqrDist = MAX_FLOAT; + } + else + { + float fInvDet = 1.0f/fDet; + fS *= fInvDet; + fT *= fInvDet; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + } + else + { + float fTmp0, fTmp1, fNumer, fDenom; + + if(fS < 0.0f) // region 2 + { + fTmp0 = fA01 + fB0; + fTmp1 = fA11 + fB1; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { + fSqrDist = fA00+2.0f*fB0+fC; + } + else + { + fS = fNumer/fDenom; + fT = 1.0f - fS; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + else + { + if(fTmp1 <= 0.0f) fSqrDist = fA11+2.0f*fB1+fC; + else if(fB1 >= 0.0f) fSqrDist = fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + else if(fT < 0.0f) // region 6 + { + fTmp0 = fA01 + fB1; + fTmp1 = fA00 + fB0; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { + fSqrDist = fA11+2.0f*fB1+fC; + } + else + { + fT = fNumer/fDenom; + fS = 1.0f - fT; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + else + { + if(fTmp1 <= 0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(fB0 >= 0.0f) fSqrDist = fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + } + else // region 1 + { + fNumer = fA11 + fB1 - fA01 - fB0; + if(fNumer <= 0.0f) + { + fSqrDist = fA11+2.0f*fB1+fC; + } + else + { + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { + fSqrDist = fA00+2.0f*fB0+fC; + } + else + { + fS = fNumer/fDenom; + fT = 1.0f - fS; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + } + } + return fabsf(fSqrDist); +} + +static float OPC_SegmentSegmentSqrDist(const Segment& rkSeg0, const Segment& rkSeg1) +{ + // Hook + Point rkSeg0Direction = rkSeg0.ComputeDirection(); + Point rkSeg1Direction = rkSeg1.ComputeDirection(); + + Point kDiff = rkSeg0.mP0 - rkSeg1.mP0; + float fA00 = rkSeg0Direction.SquareMagnitude(); + float fA01 = -rkSeg0Direction.Dot(rkSeg1Direction); + float fA11 = rkSeg1Direction.SquareMagnitude(); + float fB0 = kDiff.Dot(rkSeg0Direction); + float fC = kDiff.SquareMagnitude(); + float fDet = fabsf(fA00*fA11-fA01*fA01); + + float fB1, fS, fT, fSqrDist, fTmp; + + if(fDet>=gs_fTolerance) + { + // line segments are not parallel + fB1 = -kDiff.Dot(rkSeg1Direction); + fS = fA01*fB1-fA11*fB0; + fT = fA01*fB0-fA00*fB1; + + if(fS >= 0.0f) + { + if(fS <= fDet) + { + if(fT >= 0.0f) + { + if(fT <= fDet) // region 0 (interior) + { + // minimum at two interior points of 3D lines + float fInvDet = 1.0f/fDet; + fS *= fInvDet; + fT *= fInvDet; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + else // region 3 (side) + { + fTmp = fA01+fB0; + if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; + else if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); + else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; + } + } + else // region 7 (side) + { + if(fB0>=0.0f) fSqrDist = fC; + else if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + } + else + { + if ( fT >= 0.0 ) + { + if ( fT <= fDet ) // region 1 (side) + { + fTmp = fA01+fB1; + if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); + else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; + } + else // region 2 (corner) + { + fTmp = fA01+fB0; + if ( -fTmp <= fA00 ) + { + if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; + } + else + { + fTmp = fA01+fB1; + if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); + else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; + } + } + } + else // region 8 (corner) + { + if ( -fB0 < fA00 ) + { + if(fB0>=0.0f) fSqrDist = fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + fTmp = fA01+fB1; + if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); + else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; + } + } + } + } + else + { + if ( fT >= 0.0f ) + { + if ( fT <= fDet ) // region 5 (side) + { + if(fB1>=0.0f) fSqrDist = fC; + else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + else // region 4 (corner) + { + fTmp = fA01+fB0; + if ( fTmp < 0.0f ) + { + if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); + else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; + } + else + { + if(fB1>=0.0f) fSqrDist = fC; + else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + } + else // region 6 (corner) + { + if ( fB0 < 0.0f ) + { + if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + if(fB1>=0.0f) fSqrDist = fC; + else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + } + } + else + { + // line segments are parallel + if ( fA01 > 0.0f ) + { + // direction vectors form an obtuse angle + if ( fB0 >= 0.0f ) + { + fSqrDist = fC; + } + else if ( -fB0 <= fA00 ) + { + fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + fB1 = -kDiff.Dot(rkSeg1Direction); + fTmp = fA00+fB0; + if ( -fTmp >= fA01 ) + { + fSqrDist = fA00+fA11+fC+2.0f*(fA01+fB0+fB1); + } + else + { + fT = -fTmp/fA01; + fSqrDist = fA00+2.0f*fB0+fC+fT*(fA11*fT+2.0f*(fA01+fB1)); + } + } + } + else + { + // direction vectors form an acute angle + if ( -fB0 >= fA00 ) + { + fSqrDist = fA00+2.0f*fB0+fC; + } + else if ( fB0 <= 0.0f ) + { + fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + fB1 = -kDiff.Dot(rkSeg1Direction); + if ( fB0 >= -fA01 ) + { + fSqrDist = fA11+2.0f*fB1+fC; + } + else + { + fT = -fB0/fA01; + fSqrDist = fC+fT*(2.0f*fB1+fA11*fT); + } + } + } + } + return fabsf(fSqrDist); +} + +inline_ float OPC_SegmentRaySqrDist(const Segment& rkSeg0, const Ray& rkSeg1) +{ + return OPC_SegmentSegmentSqrDist(rkSeg0, Segment(rkSeg1.mOrig, rkSeg1.mOrig + rkSeg1.mDir)); +} + +static float OPC_SegmentTriangleSqrDist(const Segment& segment, const Point& p0, const Point& p1, const Point& p2) +{ + // Hook + const Point TriEdge0 = p1 - p0; + const Point TriEdge1 = p2 - p0; + + const Point& rkSegOrigin = segment.GetOrigin(); + Point rkSegDirection = segment.ComputeDirection(); + + Point kDiff = p0 - rkSegOrigin; + float fA00 = rkSegDirection.SquareMagnitude(); + float fA01 = -rkSegDirection.Dot(TriEdge0); + float fA02 = -rkSegDirection.Dot(TriEdge1); + float fA11 = TriEdge0.SquareMagnitude(); + float fA12 = TriEdge0.Dot(TriEdge1); + float fA22 = TriEdge1.Dot(TriEdge1); + float fB0 = -kDiff.Dot(rkSegDirection); + float fB1 = kDiff.Dot(TriEdge0); + float fB2 = kDiff.Dot(TriEdge1); + float fCof00 = fA11*fA22-fA12*fA12; + float fCof01 = fA02*fA12-fA01*fA22; + float fCof02 = fA01*fA12-fA02*fA11; + float fDet = fA00*fCof00+fA01*fCof01+fA02*fCof02; + + Ray kTriSeg; + Point kPt; + float fSqrDist, fSqrDist0; + + if(fabsf(fDet)>=gs_fTolerance) + { + float fCof11 = fA00*fA22-fA02*fA02; + float fCof12 = fA02*fA01-fA00*fA12; + float fCof22 = fA00*fA11-fA01*fA01; + float fInvDet = 1.0f/fDet; + float fRhs0 = -fB0*fInvDet; + float fRhs1 = -fB1*fInvDet; + float fRhs2 = -fB2*fInvDet; + + float fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2; + float fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2; + float fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2; + + if ( fR < 0.0f ) + { + if ( fS+fT <= 1.0f ) + { + if ( fS < 0.0f ) + { + if ( fT < 0.0f ) // region 4m + { + // min on face s=0 or t=0 or r=0 + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge1; + fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge0; + fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); + if(fSqrDist0 1 + { + if ( fS+fT <= 1.0f ) + { + if ( fS < 0.0f ) + { + if ( fT < 0.0f ) // region 4p + { + // min on face s=0 or t=0 or r=1 + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge1; + fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge0; + fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); + if(fSqrDist0GetTriangle(triangle_index); - * // Setup pointers to vertices for the collision system - * triangle.Vertex[0] = MyMesh->GetVertex(Tri->mVRef[0]); - * triangle.Vertex[1] = MyMesh->GetVertex(Tri->mVRef[1]); - * triangle.Vertex[2] = MyMesh->GetVertex(Tri->mVRef[2]); - * } - * - * // Setup callbacks - * MeshInterface0->SetCallback(ColCallback, udword(Mesh0)); - * MeshInterface1->SetCallback(ColCallback, udword(Mesh1)); - * \endcode - * - * Of course, you should make this callback as fast as possible. And you're also not supposed - * to modify the geometry *after* the collision trees have been built. The alternative was to - * store the geometry & topology in the collision system as well (as in RAPID) but we have found - * this approach to waste a lot of ram in many cases. - * - * - * POINTERS: - * - * If you're internally using the following canonical structures: - * - a vertex made of three 32-bits floating point values - * - a triangle made of three 32-bits integer vertex references - * ...then you may want to use pointers instead of callbacks. This is the same, except OPCODE will directly - * use provided pointers to access the topology and geometry, without using a callback. It might be faster, - * but probably not as safe. Pointers have been introduced in OPCODE 1.2. - * - * Ex: - * - * \code - * // Setup pointers - * MeshInterface0->SetPointers(Mesh0->GetFaces(), Mesh0->GetVerts()); - * MeshInterface1->SetPointers(Mesh1->GetFaces(), Mesh1->GetVerts()); - * \endcode - * - * - * STRIDES: - * - * If your vertices are D3D-like entities interleaving a position, a normal and/or texture coordinates - * (i.e. if your vertices are FVFs), you might want to use a vertex stride to skip extra data OPCODE - * doesn't need. Using a stride shouldn't be notably slower than not using it, but it might increase - * cache misses. Please also note that you *shouldn't* read from AGP or video-memory buffers ! - * - * - * In any case, compilation flags are here to select callbacks/pointers/strides at compile time, so - * choose what's best for your application. All of this has been wrapped into this MeshInterface. - * - * \class MeshInterface - * \author Pierre Terdiman - * \version 1.3 - * \date November, 27, 2002 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -MeshInterface::MeshInterface() : -#ifdef OPC_USE_CALLBACKS - mUserData (null), - mObjCallback (null), -#else - mTris (null), - mVerts (null), - #ifdef OPC_USE_STRIDE - mTriStride (sizeof(IndexedTriangle)), - mVertexStride (sizeof(Point)), - #endif -#endif - mNbTris (0), - mNbVerts (0) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -MeshInterface::~MeshInterface() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the mesh interface is valid, i.e. things have been setup correctly. - * \return true if valid - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool MeshInterface::IsValid() const -{ - if(!mNbTris || !mNbVerts) return false; -#ifdef OPC_USE_CALLBACKS - if(!mObjCallback) return false; -#else - if(!mTris || !mVerts) return false; -#endif - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the mesh itself is valid. - * Currently we only look for degenerate faces. - * \return number of degenerate faces - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword MeshInterface::CheckTopology() const -{ - // Check topology. If the model contains degenerate faces, collision report can be wrong in some cases. - // e.g. it happens with the standard MAX teapot. So clean your meshes first... If you don't have a mesh cleaner - // you can try this: www.codercorner.com/Consolidation.zip - - udword NbDegenerate = 0; - - VertexPointers VP; - - // Using callbacks, we don't have access to vertex indices. Nevertheless we still can check for - // redundant vertex pointers, which cover all possibilities (callbacks/pointers/strides). - for(udword i=0;iGetTriangle(triangle_index); + * // Setup pointers to vertices for the collision system + * triangle.Vertex[0] = MyMesh->GetVertex(Tri->mVRef[0]); + * triangle.Vertex[1] = MyMesh->GetVertex(Tri->mVRef[1]); + * triangle.Vertex[2] = MyMesh->GetVertex(Tri->mVRef[2]); + * } + * + * // Setup callbacks + * MeshInterface0->SetCallback(ColCallback, udword(Mesh0)); + * MeshInterface1->SetCallback(ColCallback, udword(Mesh1)); + * \endcode + * + * Of course, you should make this callback as fast as possible. And you're also not supposed + * to modify the geometry *after* the collision trees have been built. The alternative was to + * store the geometry & topology in the collision system as well (as in RAPID) but we have found + * this approach to waste a lot of ram in many cases. + * + * + * POINTERS: + * + * If you're internally using the following canonical structures: + * - a vertex made of three 32-bits floating point values + * - a triangle made of three 32-bits integer vertex references + * ...then you may want to use pointers instead of callbacks. This is the same, except OPCODE will directly + * use provided pointers to access the topology and geometry, without using a callback. It might be faster, + * but probably not as safe. Pointers have been introduced in OPCODE 1.2. + * + * Ex: + * + * \code + * // Setup pointers + * MeshInterface0->SetPointers(Mesh0->GetFaces(), Mesh0->GetVerts()); + * MeshInterface1->SetPointers(Mesh1->GetFaces(), Mesh1->GetVerts()); + * \endcode + * + * + * STRIDES: + * + * If your vertices are D3D-like entities interleaving a position, a normal and/or texture coordinates + * (i.e. if your vertices are FVFs), you might want to use a vertex stride to skip extra data OPCODE + * doesn't need. Using a stride shouldn't be notably slower than not using it, but it might increase + * cache misses. Please also note that you *shouldn't* read from AGP or video-memory buffers ! + * + * + * In any case, compilation flags are here to select callbacks/pointers/strides at compile time, so + * choose what's best for your application. All of this has been wrapped into this MeshInterface. + * + * \class MeshInterface + * \author Pierre Terdiman + * \version 1.3 + * \date November, 27, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +MeshInterface::MeshInterface() : +#ifdef OPC_USE_CALLBACKS + mUserData (null), + mObjCallback (null), +#else + mTris (null), + mVerts (null), + #ifdef OPC_USE_STRIDE + mTriStride (sizeof(IndexedTriangle)), + mVertexStride (sizeof(Point)), + #endif +#endif + mNbTris (0), + mNbVerts (0) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +MeshInterface::~MeshInterface() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the mesh interface is valid, i.e. things have been setup correctly. + * \return true if valid + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool MeshInterface::IsValid() const +{ + if(!mNbTris || !mNbVerts) return false; +#ifdef OPC_USE_CALLBACKS + if(!mObjCallback) return false; +#else + if(!mTris || !mVerts) return false; +#endif + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the mesh itself is valid. + * Currently we only look for degenerate faces. + * \return number of degenerate faces + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword MeshInterface::CheckTopology() const +{ + // Check topology. If the model contains degenerate faces, collision report can be wrong in some cases. + // e.g. it happens with the standard MAX teapot. So clean your meshes first... If you don't have a mesh cleaner + // you can try this: www.codercorner.com/Consolidation.zip + + udword NbDegenerate = 0; + + VertexPointers VP; + + // Using callbacks, we don't have access to vertex indices. Nevertheless we still can check for + // redundant vertex pointers, which cover all possibilities (callbacks/pointers/strides). + for(udword i=0;i= 0.0f; - } - }; - -#ifdef OPC_USE_CALLBACKS - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called by OPCODE to request vertices from the app. - * \param triangle_index [in] face index for which the system is requesting the vertices - * \param triangle [out] triangle's vertices (must be provided by the user) - * \param user_data [in] user-defined data from SetCallback() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef void (*RequestCallback) (udword triangle_index, VertexPointers& triangle, void* user_data); -#endif - - class OPCODE_API MeshInterface - { - public: - // Constructor / Destructor - MeshInterface(); - ~MeshInterface(); - // Common settings - inline_ udword GetNbTriangles() const { return mNbTris; } - inline_ udword GetNbVertices() const { return mNbVerts; } - inline_ void SetNbTriangles(udword nb) { mNbTris = nb; } - inline_ void SetNbVertices(udword nb) { mNbVerts = nb; } - -#ifdef OPC_USE_CALLBACKS - // Callback settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Callback control: setups object callback. Must provide triangle-vertices for a given triangle index. - * \param callback [in] user-defined callback - * \param user_data [in] user-defined data - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetCallback(RequestCallback callback, void* user_data); - inline_ void* GetUserData() const { return mUserData; } - inline_ RequestCallback GetCallback() const { return mObjCallback; } -#else - // Pointers settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Pointers control: setups object pointers. Must provide access to faces and vertices for a given object. - * \param tris [in] pointer to triangles - * \param verts [in] pointer to vertices - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetPointers(const IndexedTriangle* tris, const Point* verts); - inline_ const IndexedTriangle* GetTris() const { return mTris; } - inline_ const Point* GetVerts() const { return mVerts; } - - #ifdef OPC_USE_STRIDE - // Strides settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Strides control - * \param tri_stride [in] size of a triangle in bytes. The first sizeof(IndexedTriangle) bytes are used to get vertex indices. - * \param vertex_stride [in] size of a vertex in bytes. The first sizeof(Point) bytes are used to get vertex position. - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetStrides(udword tri_stride=sizeof(IndexedTriangle), udword vertex_stride=sizeof(Point)); - inline_ udword GetTriStride() const { return mTriStride; } - inline_ udword GetVertexStride() const { return mVertexStride; } - #endif -#endif - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Fetches a triangle given a triangle index. - * \param vp [out] required triangle's vertex pointers - * \param index [in] triangle index - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void GetTriangle(VertexPointers& vp, udword index) const - { -#ifdef OPC_USE_CALLBACKS - (mObjCallback)(index, vp, mUserData); -#else - #ifdef OPC_USE_STRIDE - const IndexedTriangle* T = (const IndexedTriangle*)(((ubyte*)mTris) + index * mTriStride); - vp.Vertex[0] = (const Point*)(((ubyte*)mVerts) + T->mVRef[0] * mVertexStride); - vp.Vertex[1] = (const Point*)(((ubyte*)mVerts) + T->mVRef[1] * mVertexStride); - vp.Vertex[2] = (const Point*)(((ubyte*)mVerts) + T->mVRef[2] * mVertexStride); - #else - const IndexedTriangle* T = &mTris[index]; - vp.Vertex[0] = &mVerts[T->mVRef[0]]; - vp.Vertex[1] = &mVerts[T->mVRef[1]]; - vp.Vertex[2] = &mVerts[T->mVRef[2]]; - #endif -#endif - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Remaps client's mesh according to a permutation. - * \param nb_indices [in] number of indices in the permutation (will be checked against number of triangles) - * \param permutation [in] list of triangle indices - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool RemapClient(udword nb_indices, const udword* permutation) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the mesh interface is valid, i.e. things have been setup correctly. - * \return true if valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool IsValid() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the mesh itself is valid. - * Currently we only look for degenerate faces. - * \return number of degenerate faces - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - udword CheckTopology() const; - private: - - udword mNbTris; //!< Number of triangles in the input model - udword mNbVerts; //!< Number of vertices in the input model -#ifdef OPC_USE_CALLBACKS - // User callback - void* mUserData; //!< User-defined data sent to callback - RequestCallback mObjCallback; //!< Object callback -#else - // User pointers - const IndexedTriangle* mTris; //!< Array of indexed triangles - const Point* mVerts; //!< Array of vertices - #ifdef OPC_USE_STRIDE - udword mTriStride; //!< Possible triangle stride in bytes [Opcode 1.3] - udword mVertexStride; //!< Possible vertex stride in bytes [Opcode 1.3] - #endif -#endif - }; - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a mesh interface. + * \file OPC_MeshInterface.h + * \author Pierre Terdiman + * \date November, 27, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_MESHINTERFACE_H__ +#define __OPC_MESHINTERFACE_H__ + + struct VertexPointers + { + const Point* Vertex[3]; + + bool BackfaceCulling(const Point& source) + { + const Point& p0 = *Vertex[0]; + const Point& p1 = *Vertex[1]; + const Point& p2 = *Vertex[2]; + + // Compute normal direction + Point Normal = (p2 - p1)^(p0 - p1); + + // Backface culling + return (Normal | (source - p0)) >= 0.0f; + } + }; + +#ifdef OPC_USE_CALLBACKS + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called by OPCODE to request vertices from the app. + * \param triangle_index [in] face index for which the system is requesting the vertices + * \param triangle [out] triangle's vertices (must be provided by the user) + * \param user_data [in] user-defined data from SetCallback() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef void (*RequestCallback) (udword triangle_index, VertexPointers& triangle, void* user_data); +#endif + + class OPCODE_API MeshInterface + { + public: + // Constructor / Destructor + MeshInterface(); + ~MeshInterface(); + // Common settings + inline_ udword GetNbTriangles() const { return mNbTris; } + inline_ udword GetNbVertices() const { return mNbVerts; } + inline_ void SetNbTriangles(udword nb) { mNbTris = nb; } + inline_ void SetNbVertices(udword nb) { mNbVerts = nb; } + +#ifdef OPC_USE_CALLBACKS + // Callback settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Callback control: setups object callback. Must provide triangle-vertices for a given triangle index. + * \param callback [in] user-defined callback + * \param user_data [in] user-defined data + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetCallback(RequestCallback callback, void* user_data); + inline_ void* GetUserData() const { return mUserData; } + inline_ RequestCallback GetCallback() const { return mObjCallback; } +#else + // Pointers settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Pointers control: setups object pointers. Must provide access to faces and vertices for a given object. + * \param tris [in] pointer to triangles + * \param verts [in] pointer to vertices + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetPointers(const IndexedTriangle* tris, const Point* verts); + inline_ const IndexedTriangle* GetTris() const { return mTris; } + inline_ const Point* GetVerts() const { return mVerts; } + + #ifdef OPC_USE_STRIDE + // Strides settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Strides control + * \param tri_stride [in] size of a triangle in bytes. The first sizeof(IndexedTriangle) bytes are used to get vertex indices. + * \param vertex_stride [in] size of a vertex in bytes. The first sizeof(Point) bytes are used to get vertex position. + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetStrides(udword tri_stride=sizeof(IndexedTriangle), udword vertex_stride=sizeof(Point)); + inline_ udword GetTriStride() const { return mTriStride; } + inline_ udword GetVertexStride() const { return mVertexStride; } + #endif +#endif + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Fetches a triangle given a triangle index. + * \param vp [out] required triangle's vertex pointers + * \param index [in] triangle index + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void GetTriangle(VertexPointers& vp, udword index) const + { +#ifdef OPC_USE_CALLBACKS + (mObjCallback)(index, vp, mUserData); +#else + #ifdef OPC_USE_STRIDE + const IndexedTriangle* T = (const IndexedTriangle*)(((ubyte*)mTris) + index * mTriStride); + vp.Vertex[0] = (const Point*)(((ubyte*)mVerts) + T->mVRef[0] * mVertexStride); + vp.Vertex[1] = (const Point*)(((ubyte*)mVerts) + T->mVRef[1] * mVertexStride); + vp.Vertex[2] = (const Point*)(((ubyte*)mVerts) + T->mVRef[2] * mVertexStride); + #else + const IndexedTriangle* T = &mTris[index]; + vp.Vertex[0] = &mVerts[T->mVRef[0]]; + vp.Vertex[1] = &mVerts[T->mVRef[1]]; + vp.Vertex[2] = &mVerts[T->mVRef[2]]; + #endif +#endif + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Remaps client's mesh according to a permutation. + * \param nb_indices [in] number of indices in the permutation (will be checked against number of triangles) + * \param permutation [in] list of triangle indices + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool RemapClient(udword nb_indices, const udword* permutation) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the mesh interface is valid, i.e. things have been setup correctly. + * \return true if valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool IsValid() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the mesh itself is valid. + * Currently we only look for degenerate faces. + * \return number of degenerate faces + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + udword CheckTopology() const; + private: + + udword mNbTris; //!< Number of triangles in the input model + udword mNbVerts; //!< Number of vertices in the input model +#ifdef OPC_USE_CALLBACKS + // User callback + void* mUserData; //!< User-defined data sent to callback + RequestCallback mObjCallback; //!< Object callback +#else + // User pointers + const IndexedTriangle* mTris; //!< Array of indexed triangles + const Point* mVerts; //!< Array of vertices + #ifdef OPC_USE_STRIDE + udword mTriStride; //!< Possible triangle stride in bytes [Opcode 1.3] + udword mVertexStride; //!< Possible vertex stride in bytes [Opcode 1.3] + #endif +#endif + }; + #endif //__OPC_MESHINTERFACE_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_Model.cpp b/Extras/CDTestFramework/Opcode/OPC_Model.cpp index 1859567e8..f8c4c877f 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Model.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_Model.cpp @@ -1,231 +1,231 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for OPCODE models. - * \file OPC_Model.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * The main collision wrapper, for all trees. Supported trees are: - * - Normal trees (2*N-1 nodes, full size) - * - No-leaf trees (N-1 nodes, full size) - * - Quantized trees (2*N-1 nodes, half size) - * - Quantized no-leaf trees (N-1 nodes, half size) - * - * Usage: - * - * 1) Create a static mesh interface using callbacks or pointers. (see OPC_MeshInterface.cpp). - * Keep it around in your app, since a pointer to this interface is saved internally and - * used until you release the collision structures. - * - * 2) Build a Model using a creation structure: - * - * \code - * Model Sample; - * - * OPCODECREATE OPCC; - * OPCC.IMesh = ...; - * OPCC.Rules = ...; - * OPCC.NoLeaf = ...; - * OPCC.Quantized = ...; - * OPCC.KeepOriginal = ...; - * bool Status = Sample.Build(OPCC); - * \endcode - * - * 3) Create a tree collider and set it up: - * - * \code - * AABBTreeCollider TC; - * TC.SetFirstContact(...); - * TC.SetFullBoxBoxTest(...); - * TC.SetFullPrimBoxTest(...); - * TC.SetTemporalCoherence(...); - * \endcode - * - * 4) Perform a collision query - * - * \code - * // Setup cache - * static BVTCache ColCache; - * ColCache.Model0 = &Model0; - * ColCache.Model1 = &Model1; - * - * // Collision query - * bool IsOk = TC.Collide(ColCache, World0, World1); - * - * // Get collision status => if true, objects overlap - * BOOL Status = TC.GetContactStatus(); - * - * // Number of colliding pairs and list of pairs - * udword NbPairs = TC.GetNbPairs(); - * const Pair* p = TC.GetPairs() - * \endcode - * - * 5) Stats - * - * \code - * Model0.GetUsedBytes() = number of bytes used for this collision tree - * TC.GetNbBVBVTests() = number of BV-BV overlap tests performed during last query - * TC.GetNbPrimPrimTests() = number of Triangle-Triangle overlap tests performed during last query - * TC.GetNbBVPrimTests() = number of Triangle-BV overlap tests performed during last query - * \endcode - * - * \class Model - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Model::Model() -{ -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - mHull = null; -#endif // __MESHMERIZER_H__ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Model::~Model() -{ - Release(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Releases the model. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Model::Release() -{ - ReleaseBase(); -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - DELETESINGLE(mHull); -#endif // __MESHMERIZER_H__ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Model::Build(const OPCODECREATE& create) -{ - // 1) Checkings - if(!create.mIMesh || !create.mIMesh->IsValid()) return false; - - // For this model, we only support complete trees - if(create.mSettings.mLimit!=1) return SetIceError("OPCODE WARNING: supports complete trees only! Use mLimit = 1.\n", null); - - // Look for degenerate faces. - udword NbDegenerate = create.mIMesh->CheckTopology(); - if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); - // We continue nonetheless.... - - Release(); // Make sure previous tree has been discarded [Opcode 1.3, thanks Adam] - - // 1-1) Setup mesh interface automatically [Opcode 1.3] - SetMeshInterface(create.mIMesh); - - // Special case for 1-triangle meshes [Opcode 1.3] - udword NbTris = create.mIMesh->GetNbTriangles(); - if(NbTris==1) - { - // We don't need to actually create a tree here, since we'll only have a single triangle to deal with anyway. - // It's a waste to use a "model" for this but at least it will work. - mModelCode |= OPC_SINGLE_NODE; - return true; - } - - // 2) Build a generic AABB Tree. - mSource = new AABBTree; - CHECKALLOC(mSource); - - // 2-1) Setup a builder. Our primitives here are triangles from input mesh, - // so we use an AABBTreeOfTrianglesBuilder..... - { - AABBTreeOfTrianglesBuilder TB; - TB.mIMesh = create.mIMesh; - TB.mSettings = create.mSettings; - TB.mNbPrimitives = NbTris; - if(!mSource->Build(&TB)) return false; - } - - // 3) Create an optimized tree according to user-settings - if(!CreateTree(create.mNoLeaf, create.mQuantized)) return false; - - // 3-2) Create optimized tree - if(!mTree->Build(mSource)) return false; - - // 3-3) Delete generic tree if needed - if(!create.mKeepOriginal) DELETESINGLE(mSource); - -#ifdef __MESHMERIZER_H__ - // 4) Convex hull - if(create.mCollisionHull) - { - // Create hull - mHull = new CollisionHull; - CHECKALLOC(mHull); - - CONVEXHULLCREATE CHC; - // ### doesn't work with strides - CHC.NbVerts = create.mIMesh->GetNbVertices(); - CHC.Vertices = create.mIMesh->GetVerts(); - CHC.UnifyNormals = true; - CHC.ReduceVertices = true; - CHC.WordFaces = false; - mHull->Compute(CHC); - } -#endif // __MESHMERIZER_H__ - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword Model::GetUsedBytes() const -{ - if(!mTree) return 0; - return mTree->GetUsedBytes(); -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for OPCODE models. + * \file OPC_Model.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * The main collision wrapper, for all trees. Supported trees are: + * - Normal trees (2*N-1 nodes, full size) + * - No-leaf trees (N-1 nodes, full size) + * - Quantized trees (2*N-1 nodes, half size) + * - Quantized no-leaf trees (N-1 nodes, half size) + * + * Usage: + * + * 1) Create a static mesh interface using callbacks or pointers. (see OPC_MeshInterface.cpp). + * Keep it around in your app, since a pointer to this interface is saved internally and + * used until you release the collision structures. + * + * 2) Build a Model using a creation structure: + * + * \code + * Model Sample; + * + * OPCODECREATE OPCC; + * OPCC.IMesh = ...; + * OPCC.Rules = ...; + * OPCC.NoLeaf = ...; + * OPCC.Quantized = ...; + * OPCC.KeepOriginal = ...; + * bool Status = Sample.Build(OPCC); + * \endcode + * + * 3) Create a tree collider and set it up: + * + * \code + * AABBTreeCollider TC; + * TC.SetFirstContact(...); + * TC.SetFullBoxBoxTest(...); + * TC.SetFullPrimBoxTest(...); + * TC.SetTemporalCoherence(...); + * \endcode + * + * 4) Perform a collision query + * + * \code + * // Setup cache + * static BVTCache ColCache; + * ColCache.Model0 = &Model0; + * ColCache.Model1 = &Model1; + * + * // Collision query + * bool IsOk = TC.Collide(ColCache, World0, World1); + * + * // Get collision status => if true, objects overlap + * BOOL Status = TC.GetContactStatus(); + * + * // Number of colliding pairs and list of pairs + * udword NbPairs = TC.GetNbPairs(); + * const Pair* p = TC.GetPairs() + * \endcode + * + * 5) Stats + * + * \code + * Model0.GetUsedBytes() = number of bytes used for this collision tree + * TC.GetNbBVBVTests() = number of BV-BV overlap tests performed during last query + * TC.GetNbPrimPrimTests() = number of Triangle-Triangle overlap tests performed during last query + * TC.GetNbBVPrimTests() = number of Triangle-BV overlap tests performed during last query + * \endcode + * + * \class Model + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Model::Model() +{ +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + mHull = null; +#endif // __MESHMERIZER_H__ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Model::~Model() +{ + Release(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases the model. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Model::Release() +{ + ReleaseBase(); +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + DELETESINGLE(mHull); +#endif // __MESHMERIZER_H__ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Model::Build(const OPCODECREATE& create) +{ + // 1) Checkings + if(!create.mIMesh || !create.mIMesh->IsValid()) return false; + + // For this model, we only support complete trees + if(create.mSettings.mLimit!=1) return SetIceError("OPCODE WARNING: supports complete trees only! Use mLimit = 1.\n", null); + + // Look for degenerate faces. + udword NbDegenerate = create.mIMesh->CheckTopology(); + if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); + // We continue nonetheless.... + + Release(); // Make sure previous tree has been discarded [Opcode 1.3, thanks Adam] + + // 1-1) Setup mesh interface automatically [Opcode 1.3] + SetMeshInterface(create.mIMesh); + + // Special case for 1-triangle meshes [Opcode 1.3] + udword NbTris = create.mIMesh->GetNbTriangles(); + if(NbTris==1) + { + // We don't need to actually create a tree here, since we'll only have a single triangle to deal with anyway. + // It's a waste to use a "model" for this but at least it will work. + mModelCode |= OPC_SINGLE_NODE; + return true; + } + + // 2) Build a generic AABB Tree. + mSource = new AABBTree; + CHECKALLOC(mSource); + + // 2-1) Setup a builder. Our primitives here are triangles from input mesh, + // so we use an AABBTreeOfTrianglesBuilder..... + { + AABBTreeOfTrianglesBuilder TB; + TB.mIMesh = create.mIMesh; + TB.mSettings = create.mSettings; + TB.mNbPrimitives = NbTris; + if(!mSource->Build(&TB)) return false; + } + + // 3) Create an optimized tree according to user-settings + if(!CreateTree(create.mNoLeaf, create.mQuantized)) return false; + + // 3-2) Create optimized tree + if(!mTree->Build(mSource)) return false; + + // 3-3) Delete generic tree if needed + if(!create.mKeepOriginal) DELETESINGLE(mSource); + +#ifdef __MESHMERIZER_H__ + // 4) Convex hull + if(create.mCollisionHull) + { + // Create hull + mHull = new CollisionHull; + CHECKALLOC(mHull); + + CONVEXHULLCREATE CHC; + // ### doesn't work with strides + CHC.NbVerts = create.mIMesh->GetNbVertices(); + CHC.Vertices = create.mIMesh->GetVerts(); + CHC.UnifyNormals = true; + CHC.ReduceVertices = true; + CHC.WordFaces = false; + mHull->Compute(CHC); + } +#endif // __MESHMERIZER_H__ + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword Model::GetUsedBytes() const +{ + if(!mTree) return 0; + return mTree->GetUsedBytes(); +} diff --git a/Extras/CDTestFramework/Opcode/OPC_Model.h b/Extras/CDTestFramework/Opcode/OPC_Model.h index f4a7dc535..0124135d7 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Model.h +++ b/Extras/CDTestFramework/Opcode/OPC_Model.h @@ -1,74 +1,74 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for OPCODE models. - * \file OPC_Model.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_MODEL_H__ -#define __OPC_MODEL_H__ - - class OPCODE_API Model : public BaseModel - { - public: - // Constructor/Destructor - Model(); - virtual ~Model(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) bool Build(const OPCODECREATE& create); - -#ifdef __MESHMERIZER_H__ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the collision hull. - * \return the collision hull if it exists - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const CollisionHull* GetHull() const { return mHull; } -#endif // __MESHMERIZER_H__ - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) udword GetUsedBytes() const; - - private: -#ifdef __MESHMERIZER_H__ - CollisionHull* mHull; //!< Possible convex hull -#endif // __MESHMERIZER_H__ - // Internal methods - void Release(); - }; - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for OPCODE models. + * \file OPC_Model.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_MODEL_H__ +#define __OPC_MODEL_H__ + + class OPCODE_API Model : public BaseModel + { + public: + // Constructor/Destructor + Model(); + virtual ~Model(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) bool Build(const OPCODECREATE& create); + +#ifdef __MESHMERIZER_H__ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the collision hull. + * \return the collision hull if it exists + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const CollisionHull* GetHull() const { return mHull; } +#endif // __MESHMERIZER_H__ + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) udword GetUsedBytes() const; + + private: +#ifdef __MESHMERIZER_H__ + CollisionHull* mHull; //!< Possible convex hull +#endif // __MESHMERIZER_H__ + // Internal methods + void Release(); + }; + #endif //__OPC_MODEL_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp b/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp index 152869dcb..993024007 100644 --- a/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp @@ -1,776 +1,776 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an OBB collider. - * \file OPC_OBBCollider.cpp - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an OBB-vs-tree collider. - * - * \class OBBCollider - * \author Pierre Terdiman - * \version 1.3 - * \date January, 1st, 2002 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_BoxBoxOverlap.h" -#include "OPC_TriBoxOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - /* Set contact status */ \ - mFlags |= flag; \ - mTouchedPrimitives->Add(prim_index); - -//! OBB-triangle test -#define OBB_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - /* Transform them in a common space */ \ - TransformPoint(mLeafVerts[0], *VP.Vertex[0], mRModelToBox, mTModelToBox); \ - TransformPoint(mLeafVerts[1], *VP.Vertex[1], mRModelToBox, mTModelToBox); \ - TransformPoint(mLeafVerts[2], *VP.Vertex[2], mRModelToBox, mTModelToBox); \ - /* Perform triangle-box overlap test */ \ - if(TriBoxOverlap()) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -OBBCollider::OBBCollider() : mFullBoxBoxTest(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -OBBCollider::~OBBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Validates current settings. You should call this method after all the settings and callbacks have been defined. - * \return null if everything is ok, else a string describing the problem - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const char* OBBCollider::ValidateSettings() -{ - if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; - - return VolumeCollider::ValidateSettings(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision OBB in local space - * \param model [in] Opcode model to collide with - * \param worldb [in] OBB's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBBCollider::Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box, worldb, worldm)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - check temporal coherence - * - * \param cache [in/out] a box cache - * \param box [in] obb in local space - * \param worldb [in] obb's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL OBBCollider::InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute obb in world space - mBoxExtents = box.mExtents; - - Matrix4x4 WorldB; - - if(worldb) - { - WorldB = Matrix4x4( box.mRot * Matrix3x3(*worldb) ); - WorldB.SetTrans(box.mCenter * *worldb); - } - else - { - WorldB = box.mRot; - WorldB.SetTrans(box.mCenter); - } - - // Setup matrices - Matrix4x4 InvWorldB; - InvertPRMatrix(InvWorldB, WorldB); - - if(worldm) - { - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - - Matrix4x4 WorldBtoM = WorldB * InvWorldM; - Matrix4x4 WorldMtoB = *worldm * InvWorldB; - - mRModelToBox = WorldMtoB; WorldMtoB.GetTrans(mTModelToBox); - mRBoxToModel = WorldBtoM; WorldBtoM.GetTrans(mTBoxToModel); - } - else - { - mRModelToBox = InvWorldB; InvWorldB.GetTrans(mTModelToBox); - mRBoxToModel = WorldB; WorldB.GetTrans(mTBoxToModel); - } - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the box (and set contact status if needed) - OBB_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence: - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the box (and set contact status if needed) - OBB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // ### rewrite this - OBB TestBox(mTBoxToModel, mBoxExtents, mRBoxToModel); - - // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): - if(IsCacheValid(cache) && TestBox.IsInside(cache.FatBox)) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat box so that coherence will work for subsequent frames - TestBox.mExtents *= cache.FatCoeff; - mBoxExtents *= cache.FatCoeff; - - // Update cache with query data (signature for cached faces) - cache.FatBox = TestBox; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - // Now we can precompute box-box data - - // Precompute absolute box-to-model rotation matrix - for(udword i=0;i<3;i++) - { - for(udword j=0;j<3;j++) - { - // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) - mAR.m[i][j] = 1e-6f + fabsf(mRBoxToModel.m[i][j]); - } - } - - // Precompute bounds for box-in-box test - mB0 = mBoxExtents - mTModelToBox; - mB1 = - mBoxExtents - mTModelToBox; - - // Precompute box-box data - Courtesy of Erwin de Vries - mBBx1 = mBoxExtents.x*mAR.m[0][0] + mBoxExtents.y*mAR.m[1][0] + mBoxExtents.z*mAR.m[2][0]; - mBBy1 = mBoxExtents.x*mAR.m[0][1] + mBoxExtents.y*mAR.m[1][1] + mBoxExtents.z*mAR.m[2][1]; - mBBz1 = mBoxExtents.x*mAR.m[0][2] + mBoxExtents.y*mAR.m[1][2] + mBoxExtents.z*mAR.m[2][2]; - - mBB_1 = mBoxExtents.y*mAR.m[2][0] + mBoxExtents.z*mAR.m[1][0]; - mBB_2 = mBoxExtents.x*mAR.m[2][0] + mBoxExtents.z*mAR.m[0][0]; - mBB_3 = mBoxExtents.x*mAR.m[1][0] + mBoxExtents.y*mAR.m[0][0]; - mBB_4 = mBoxExtents.y*mAR.m[2][1] + mBoxExtents.z*mAR.m[1][1]; - mBB_5 = mBoxExtents.x*mAR.m[2][1] + mBoxExtents.z*mAR.m[0][1]; - mBB_6 = mBoxExtents.x*mAR.m[1][1] + mBoxExtents.y*mAR.m[0][1]; - mBB_7 = mBoxExtents.y*mAR.m[2][2] + mBoxExtents.z*mAR.m[1][2]; - mBB_8 = mBoxExtents.x*mAR.m[2][2] + mBoxExtents.z*mAR.m[0][2]; - mBB_9 = mBoxExtents.x*mAR.m[1][2] + mBoxExtents.y*mAR.m[0][2]; - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the OBB completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the OBB contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL OBBCollider::OBBContainsBox(const Point& bc, const Point& be) -{ - // I assume if all 8 box vertices are inside the OBB, so does the whole box. - // Sounds ok but maybe there's a better way? -/* -#define TEST_PT(a,b,c) \ - p.x=a; p.y=b; p.z=c; p+=bc; \ - f = p.x * mRModelToBox.m[0][0] + p.y * mRModelToBox.m[1][0] + p.z * mRModelToBox.m[2][0]; if(f>mB0.x || fmB0.y || fmB0.z || f NCx-NEx) return FALSE; - - float NCy = bc.x * mRModelToBox.m[0][1] + bc.y * mRModelToBox.m[1][1] + bc.z * mRModelToBox.m[2][1]; - float NEy = fabsf(mRModelToBox.m[0][1] * be.x) + fabsf(mRModelToBox.m[1][1] * be.y) + fabsf(mRModelToBox.m[2][1] * be.z); - - if(mB0.y < NCy+NEy) return FALSE; - if(mB1.y > NCy-NEy) return FALSE; - - float NCz = bc.x * mRModelToBox.m[0][2] + bc.y * mRModelToBox.m[1][2] + bc.z * mRModelToBox.m[2][2]; - float NEz = fabsf(mRModelToBox.m[0][2] * be.x) + fabsf(mRModelToBox.m[1][2] * be.y) + fabsf(mRModelToBox.m[2][2] * be.z); - - if(mB0.z < NCz+NEz) return FALSE; - if(mB1.z > NCz-NEz) return FALSE; - - return TRUE; -} - -#define TEST_BOX_IN_OBB(center, extents) \ - if(OBBContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->IsLeaf()) - { - OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridOBBCollider::HybridOBBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridOBBCollider::~HybridOBBCollider() -{ -} - -bool HybridOBBCollider::Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box, worldb, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - OBB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - OBB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an OBB collider. + * \file OPC_OBBCollider.cpp + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an OBB-vs-tree collider. + * + * \class OBBCollider + * \author Pierre Terdiman + * \version 1.3 + * \date January, 1st, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_BoxBoxOverlap.h" +#include "OPC_TriBoxOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! OBB-triangle test +#define OBB_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + /* Transform them in a common space */ \ + TransformPoint(mLeafVerts[0], *VP.Vertex[0], mRModelToBox, mTModelToBox); \ + TransformPoint(mLeafVerts[1], *VP.Vertex[1], mRModelToBox, mTModelToBox); \ + TransformPoint(mLeafVerts[2], *VP.Vertex[2], mRModelToBox, mTModelToBox); \ + /* Perform triangle-box overlap test */ \ + if(TriBoxOverlap()) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OBBCollider::OBBCollider() : mFullBoxBoxTest(true) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OBBCollider::~OBBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* OBBCollider::ValidateSettings() +{ + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; + + return VolumeCollider::ValidateSettings(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision OBB in local space + * \param model [in] Opcode model to collide with + * \param worldb [in] OBB's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBBCollider::Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box, worldb, worldm)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * - check temporal coherence + * + * \param cache [in/out] a box cache + * \param box [in] obb in local space + * \param worldb [in] obb's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL OBBCollider::InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute obb in world space + mBoxExtents = box.mExtents; + + Matrix4x4 WorldB; + + if(worldb) + { + WorldB = Matrix4x4( box.mRot * Matrix3x3(*worldb) ); + WorldB.SetTrans(box.mCenter * *worldb); + } + else + { + WorldB = box.mRot; + WorldB.SetTrans(box.mCenter); + } + + // Setup matrices + Matrix4x4 InvWorldB; + InvertPRMatrix(InvWorldB, WorldB); + + if(worldm) + { + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + + Matrix4x4 WorldBtoM = WorldB * InvWorldM; + Matrix4x4 WorldMtoB = *worldm * InvWorldB; + + mRModelToBox = WorldMtoB; WorldMtoB.GetTrans(mTModelToBox); + mRBoxToModel = WorldBtoM; WorldBtoM.GetTrans(mTBoxToModel); + } + else + { + mRModelToBox = InvWorldB; InvWorldB.GetTrans(mTModelToBox); + mRBoxToModel = WorldB; WorldB.GetTrans(mTBoxToModel); + } + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the box (and set contact status if needed) + OBB_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence: + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the box (and set contact status if needed) + OBB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // ### rewrite this + OBB TestBox(mTBoxToModel, mBoxExtents, mRBoxToModel); + + // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): + if(IsCacheValid(cache) && TestBox.IsInside(cache.FatBox)) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat box so that coherence will work for subsequent frames + TestBox.mExtents *= cache.FatCoeff; + mBoxExtents *= cache.FatCoeff; + + // Update cache with query data (signature for cached faces) + cache.FatBox = TestBox; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + // Now we can precompute box-box data + + // Precompute absolute box-to-model rotation matrix + for(udword i=0;i<3;i++) + { + for(udword j=0;j<3;j++) + { + // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) + mAR.m[i][j] = 1e-6f + fabsf(mRBoxToModel.m[i][j]); + } + } + + // Precompute bounds for box-in-box test + mB0 = mBoxExtents - mTModelToBox; + mB1 = - mBoxExtents - mTModelToBox; + + // Precompute box-box data - Courtesy of Erwin de Vries + mBBx1 = mBoxExtents.x*mAR.m[0][0] + mBoxExtents.y*mAR.m[1][0] + mBoxExtents.z*mAR.m[2][0]; + mBBy1 = mBoxExtents.x*mAR.m[0][1] + mBoxExtents.y*mAR.m[1][1] + mBoxExtents.z*mAR.m[2][1]; + mBBz1 = mBoxExtents.x*mAR.m[0][2] + mBoxExtents.y*mAR.m[1][2] + mBoxExtents.z*mAR.m[2][2]; + + mBB_1 = mBoxExtents.y*mAR.m[2][0] + mBoxExtents.z*mAR.m[1][0]; + mBB_2 = mBoxExtents.x*mAR.m[2][0] + mBoxExtents.z*mAR.m[0][0]; + mBB_3 = mBoxExtents.x*mAR.m[1][0] + mBoxExtents.y*mAR.m[0][0]; + mBB_4 = mBoxExtents.y*mAR.m[2][1] + mBoxExtents.z*mAR.m[1][1]; + mBB_5 = mBoxExtents.x*mAR.m[2][1] + mBoxExtents.z*mAR.m[0][1]; + mBB_6 = mBoxExtents.x*mAR.m[1][1] + mBoxExtents.y*mAR.m[0][1]; + mBB_7 = mBoxExtents.y*mAR.m[2][2] + mBoxExtents.z*mAR.m[1][2]; + mBB_8 = mBoxExtents.x*mAR.m[2][2] + mBoxExtents.z*mAR.m[0][2]; + mBB_9 = mBoxExtents.x*mAR.m[1][2] + mBoxExtents.y*mAR.m[0][2]; + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the OBB completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the OBB contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL OBBCollider::OBBContainsBox(const Point& bc, const Point& be) +{ + // I assume if all 8 box vertices are inside the OBB, so does the whole box. + // Sounds ok but maybe there's a better way? +/* +#define TEST_PT(a,b,c) \ + p.x=a; p.y=b; p.z=c; p+=bc; \ + f = p.x * mRModelToBox.m[0][0] + p.y * mRModelToBox.m[1][0] + p.z * mRModelToBox.m[2][0]; if(f>mB0.x || fmB0.y || fmB0.z || f NCx-NEx) return FALSE; + + float NCy = bc.x * mRModelToBox.m[0][1] + bc.y * mRModelToBox.m[1][1] + bc.z * mRModelToBox.m[2][1]; + float NEy = fabsf(mRModelToBox.m[0][1] * be.x) + fabsf(mRModelToBox.m[1][1] * be.y) + fabsf(mRModelToBox.m[2][1] * be.z); + + if(mB0.y < NCy+NEy) return FALSE; + if(mB1.y > NCy-NEy) return FALSE; + + float NCz = bc.x * mRModelToBox.m[0][2] + bc.y * mRModelToBox.m[1][2] + bc.z * mRModelToBox.m[2][2]; + float NEz = fabsf(mRModelToBox.m[0][2] * be.x) + fabsf(mRModelToBox.m[1][2] * be.y) + fabsf(mRModelToBox.m[2][2] * be.z); + + if(mB0.z < NCz+NEz) return FALSE; + if(mB1.z > NCz-NEz) return FALSE; + + return TRUE; +} + +#define TEST_BOX_IN_OBB(center, extents) \ + if(OBBContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->IsLeaf()) + { + OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridOBBCollider::HybridOBBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridOBBCollider::~HybridOBBCollider() +{ +} + +bool HybridOBBCollider::Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box, worldb, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + OBB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + OBB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h b/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h index 010d892bf..58272cd26 100644 --- a/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h @@ -1,151 +1,151 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an OBB collider. - * \file OPC_OBBCollider.h - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_OBBCOLLIDER_H__ -#define __OPC_OBBCOLLIDER_H__ - - struct OPCODE_API OBBCache : VolumeCache - { - OBBCache() : FatCoeff(1.1f) - { - FatBox.mCenter.Zero(); - FatBox.mExtents.Zero(); - FatBox.mRot.Identity(); - } - - // Cached faces signature - OBB FatBox; //!< Box used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< extents multiplier used to create a fat box - }; - - class OPCODE_API OBBCollider : public VolumeCollider - { - public: - // Constructor / Destructor - OBBCollider(); - virtual ~OBBCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision OBB in local space - * \param model [in] Opcode model to collide with - * \param worldb [in] OBB's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) - * \param flag [in] true for full tests, false for coarse tests - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Precomputed data - Matrix3x3 mAR; //!< Absolute rotation matrix - Matrix3x3 mRModelToBox; //!< Rotation from model space to obb space - Matrix3x3 mRBoxToModel; //!< Rotation from obb space to model space - Point mTModelToBox; //!< Translation from model space to obb space - Point mTBoxToModel; //!< Translation from obb space to model space - - Point mBoxExtents; - Point mB0; //!< - mTModelToBox + mBoxExtents - Point mB1; //!< - mTModelToBox - mBoxExtents - - float mBBx1; - float mBBy1; - float mBBz1; - - float mBB_1; - float mBB_2; - float mBB_3; - float mBB_4; - float mBB_5; - float mBB_6; - float mBB_7; - float mBB_8; - float mBB_9; - - // Leaf description - Point mLeafVerts[3]; //!< Triangle vertices - // Settings - bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL OBBContainsBox(const Point& bc, const Point& be); - inline_ BOOL BoxBoxOverlap(const Point& extents, const Point& center); - inline_ BOOL TriBoxOverlap(); - // Init methods - BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); - }; - - class OPCODE_API HybridOBBCollider : public OBBCollider - { - public: - // Constructor / Destructor - HybridOBBCollider(); - virtual ~HybridOBBCollider(); - - bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_OBBCOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an OBB collider. + * \file OPC_OBBCollider.h + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_OBBCOLLIDER_H__ +#define __OPC_OBBCOLLIDER_H__ + + struct OPCODE_API OBBCache : VolumeCache + { + OBBCache() : FatCoeff(1.1f) + { + FatBox.mCenter.Zero(); + FatBox.mExtents.Zero(); + FatBox.mRot.Identity(); + } + + // Cached faces signature + OBB FatBox; //!< Box used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< extents multiplier used to create a fat box + }; + + class OPCODE_API OBBCollider : public VolumeCollider + { + public: + // Constructor / Destructor + OBBCollider(); + virtual ~OBBCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision OBB in local space + * \param model [in] Opcode model to collide with + * \param worldb [in] OBB's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) + * \param flag [in] true for full tests, false for coarse tests + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Precomputed data + Matrix3x3 mAR; //!< Absolute rotation matrix + Matrix3x3 mRModelToBox; //!< Rotation from model space to obb space + Matrix3x3 mRBoxToModel; //!< Rotation from obb space to model space + Point mTModelToBox; //!< Translation from model space to obb space + Point mTBoxToModel; //!< Translation from obb space to model space + + Point mBoxExtents; + Point mB0; //!< - mTModelToBox + mBoxExtents + Point mB1; //!< - mTModelToBox - mBoxExtents + + float mBBx1; + float mBBy1; + float mBBz1; + + float mBB_1; + float mBB_2; + float mBB_3; + float mBB_4; + float mBB_5; + float mBB_6; + float mBB_7; + float mBB_8; + float mBB_9; + + // Leaf description + Point mLeafVerts[3]; //!< Triangle vertices + // Settings + bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL OBBContainsBox(const Point& bc, const Point& be); + inline_ BOOL BoxBoxOverlap(const Point& extents, const Point& center); + inline_ BOOL TriBoxOverlap(); + // Init methods + BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); + }; + + class OPCODE_API HybridOBBCollider : public OBBCollider + { + public: + // Constructor / Destructor + HybridOBBCollider(); + virtual ~HybridOBBCollider(); + + bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_OBBCOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp b/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp index 98a3c1613..59eb56220 100644 --- a/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp @@ -1,791 +1,791 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for optimized trees. Implements 4 trees: - * - normal - * - no leaf - * - quantized - * - no leaf / quantized - * - * \file OPC_OptimizedTree.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A standard AABB tree. - * - * \class AABBCollisionTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A no-leaf AABB tree. - * - * \class AABBNoLeafTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A quantized AABB tree. - * - * \class AABBQuantizedTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A quantized no-leaf AABB tree. - * - * \class AABBQuantizedNoLeafTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -//! Compilation flag: -//! - true to fix quantized boxes (i.e. make sure they enclose the original ones) -//! - false to see the effects of quantization errors (faster, but wrong results in some cases) -static bool gFixQuantized = true; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds an implicit tree from a standard one. An implicit tree is a complete tree (2*N-1 nodes) whose negative - * box pointers and primitive pointers have been made implicit, hence packing 3 pointers in one. - * - * Layout for implicit trees: - * Node: - * - box - * - data (32-bits value) - * - * if data's LSB = 1 => remaining bits are a primitive pointer - * else remaining bits are a P-node pointer, and N = P + 1 - * - * \relates AABBCollisionNode - * \fn _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) - * \param linear [in] base address of destination nodes - * \param box_id [in] index of destination node - * \param current_id [in] current running index - * \param current_node [in] current node from input tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static void _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) -{ - // Current node from input tree is "current_node". Must be flattened into "linear[boxid]". - - // Store the AABB - current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); - current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); - // Store remaining info - if(current_node->IsLeaf()) - { - // The input tree must be complete => i.e. one primitive/leaf - ASSERT(current_node->GetNbPrimitives()==1); - // Get the primitive index from the input tree - udword PrimitiveIndex = current_node->GetPrimitives()[0]; - // Setup box data as the primitive index, marked as leaf - linear[box_id].mData = (PrimitiveIndex<<1)|1; - } - else - { - // To make the negative one implicit, we must store P and N in successive order - udword PosID = current_id++; // Get a new id for positive child - udword NegID = current_id++; // Get a new id for negative child - // Setup box data as the forthcoming new P pointer - linear[box_id].mData = (udword)&linear[PosID]; - // Make sure it's not marked as leaf - ASSERT(!(linear[box_id].mData&1)); - // Recurse with new IDs - _BuildCollisionTree(linear, PosID, current_id, current_node->GetPos()); - _BuildCollisionTree(linear, NegID, current_id, current_node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds a "no-leaf" tree from a standard one. This is a tree whose leaf nodes have been removed. - * - * Layout for no-leaf trees: - * - * Node: - * - box - * - P pointer => a node (LSB=0) or a primitive (LSB=1) - * - N pointer => a node (LSB=0) or a primitive (LSB=1) - * - * \relates AABBNoLeafNode - * \fn _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) - * \param linear [in] base address of destination nodes - * \param box_id [in] index of destination node - * \param current_id [in] current running index - * \param current_node [in] current node from input tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static void _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) -{ - const AABBTreeNode* P = current_node->GetPos(); - const AABBTreeNode* N = current_node->GetNeg(); - // Leaf nodes here?! - ASSERT(P); - ASSERT(N); - // Internal node => keep the box - current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); - current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); - - if(P->IsLeaf()) - { - // The input tree must be complete => i.e. one primitive/leaf - ASSERT(P->GetNbPrimitives()==1); - // Get the primitive index from the input tree - udword PrimitiveIndex = P->GetPrimitives()[0]; - // Setup prev box data as the primitive index, marked as leaf - linear[box_id].mPosData = (PrimitiveIndex<<1)|1; - } - else - { - // Get a new id for positive child - udword PosID = current_id++; - // Setup box data - linear[box_id].mPosData = (udword)&linear[PosID]; - // Make sure it's not marked as leaf - ASSERT(!(linear[box_id].mPosData&1)); - // Recurse - _BuildNoLeafTree(linear, PosID, current_id, P); - } - - if(N->IsLeaf()) - { - // The input tree must be complete => i.e. one primitive/leaf - ASSERT(N->GetNbPrimitives()==1); - // Get the primitive index from the input tree - udword PrimitiveIndex = N->GetPrimitives()[0]; - // Setup prev box data as the primitive index, marked as leaf - linear[box_id].mNegData = (PrimitiveIndex<<1)|1; - } - else - { - // Get a new id for negative child - udword NegID = current_id++; - // Setup box data - linear[box_id].mNegData = (udword)&linear[NegID]; - // Make sure it's not marked as leaf - ASSERT(!(linear[box_id].mNegData&1)); - // Recurse - _BuildNoLeafTree(linear, NegID, current_id, N); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollisionTree::AABBCollisionTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollisionTree::~AABBCollisionTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollisionTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - if(mNbNodes!=NbNodes) // Same number of nodes => keep moving - { - mNbNodes = NbNodes; - DELETEARRAY(mNodes); - mNodes = new AABBCollisionNode[mNbNodes]; - CHECKALLOC(mNodes); - } - - // Build the tree - udword CurID = 1; - _BuildCollisionTree(mNodes, 0, CurID, tree); - ASSERT(CurID==mNbNodes); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision tree after vertices have been modified. - * \param mesh_interface [in] mesh interface for current model - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollisionTree::Refit(const MeshInterface* mesh_interface) -{ - ASSERT(!"Not implemented since AABBCollisionTrees have twice as more nodes to refit as AABBNoLeafTrees!"); - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Walks the tree and call the user back for each node. - * \param callback [in] walking callback - * \param user_data [in] callback's user data - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollisionTree::Walk(GenericWalkingCallback callback, void* user_data) const -{ - if(!callback) return false; - - struct Local - { - static void _Walk(const AABBCollisionNode* current_node, GenericWalkingCallback callback, void* user_data) - { - if(!current_node || !(callback)(current_node, user_data)) return; - - if(!current_node->IsLeaf()) - { - _Walk(current_node->GetPos(), callback, user_data); - _Walk(current_node->GetNeg(), callback, user_data); - } - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBNoLeafTree::AABBNoLeafTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBNoLeafTree::~AABBNoLeafTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBNoLeafTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - if(mNbNodes!=NbTriangles-1) // Same number of nodes => keep moving - { - mNbNodes = NbTriangles-1; - DELETEARRAY(mNodes); - mNodes = new AABBNoLeafNode[mNbNodes]; - CHECKALLOC(mNodes); - } - - // Build the tree - udword CurID = 1; - _BuildNoLeafTree(mNodes, 0, CurID, tree); - ASSERT(CurID==mNbNodes); - - return true; -} - -inline_ void ComputeMinMax_OT(Point& min, Point& max, const VertexPointers& vp) -{ - // Compute triangle's AABB = a leaf box -#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much - min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - - min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - - min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); - max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); -#else - min = *vp.Vertex[0]; - max = *vp.Vertex[0]; - min.Min(*vp.Vertex[1]); - max.Max(*vp.Vertex[1]); - min.Min(*vp.Vertex[2]); - max.Max(*vp.Vertex[2]); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision tree after vertices have been modified. - * \param mesh_interface [in] mesh interface for current model - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBNoLeafTree::Refit(const MeshInterface* mesh_interface) -{ - // Checkings - if(!mesh_interface) return false; - - // Bottom-up update - VertexPointers VP; - Point Min,Max; - Point Min_,Max_; - udword Index = mNbNodes; - while(Index--) - { - AABBNoLeafNode& Current = mNodes[Index]; - - if(Current.HasPosLeaf()) - { - mesh_interface->GetTriangle(VP, Current.GetPosPrimitive()); - ComputeMinMax_OT(Min, Max, VP); - } - else - { - const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; - CurrentBox.GetMin(Min); - CurrentBox.GetMax(Max); - } - - if(Current.HasNegLeaf()) - { - mesh_interface->GetTriangle(VP, Current.GetNegPrimitive()); - ComputeMinMax_OT(Min_, Max_, VP); - } - else - { - const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; - CurrentBox.GetMin(Min_); - CurrentBox.GetMax(Max_); - } -#ifdef OPC_USE_FCOMI - Min.x = FCMin2(Min.x, Min_.x); - Max.x = FCMax2(Max.x, Max_.x); - Min.y = FCMin2(Min.y, Min_.y); - Max.y = FCMax2(Max.y, Max_.y); - Min.z = FCMin2(Min.z, Min_.z); - Max.z = FCMax2(Max.z, Max_.z); -#else - Min.Min(Min_); - Max.Max(Max_); -#endif - Current.mAABB.SetMinMax(Min, Max); - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Walks the tree and call the user back for each node. - * \param callback [in] walking callback - * \param user_data [in] callback's user data - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBNoLeafTree::Walk(GenericWalkingCallback callback, void* user_data) const -{ - if(!callback) return false; - - struct Local - { - static void _Walk(const AABBNoLeafNode* current_node, GenericWalkingCallback callback, void* user_data) - { - if(!current_node || !(callback)(current_node, user_data)) return; - - if(!current_node->HasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); - if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} - -// Quantization notes: -// - We could use the highest bits of mData to store some more quantized bits. Dequantization code -// would be slightly more complex, but number of overlap tests would be reduced (and anyhow those -// bits are currently wasted). Of course it's not possible if we move to 16 bits mData. -// - Something like "16 bits floats" could be tested, to bypass the int-to-float conversion. -// - A dedicated BV-BV test could be used, dequantizing while testing for overlap. (i.e. it's some -// lazy-dequantization which may save some work in case of early exits). At the very least some -// muls could be saved by precomputing several more matrices. But maybe not worth the pain. -// - Do we need to dequantize anyway? Not doing the extents-related muls only implies the box has -// been scaled, for example. -// - The deeper we move into the hierarchy, the smaller the extents should be. May not need a fixed -// number of quantization bits. Even better, could probably be best delta-encoded. - - -// Find max values. Some people asked why I wasn't simply using the first node. Well, I can't. -// I'm not looking for (min, max) values like in a standard AABB, I'm looking for the extremal -// centers/extents in order to quantize them. The first node would only give a single center and -// a single extents. While extents would be the biggest, the center wouldn't. -#define FIND_MAX_VALUES \ - /* Get max values */ \ - Point CMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ - Point EMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ - for(udword i=0;iCMax.x) CMax.x = fabsf(Nodes[i].mAABB.mCenter.x); \ - if(fabsf(Nodes[i].mAABB.mCenter.y)>CMax.y) CMax.y = fabsf(Nodes[i].mAABB.mCenter.y); \ - if(fabsf(Nodes[i].mAABB.mCenter.z)>CMax.z) CMax.z = fabsf(Nodes[i].mAABB.mCenter.z); \ - if(fabsf(Nodes[i].mAABB.mExtents.x)>EMax.x) EMax.x = fabsf(Nodes[i].mAABB.mExtents.x); \ - if(fabsf(Nodes[i].mAABB.mExtents.y)>EMax.y) EMax.y = fabsf(Nodes[i].mAABB.mExtents.y); \ - if(fabsf(Nodes[i].mAABB.mExtents.z)>EMax.z) EMax.z = fabsf(Nodes[i].mAABB.mExtents.z); \ - } - -#define INIT_QUANTIZATION \ - udword nbc=15; /* Keep one bit for sign */ \ - udword nbe=15; /* Keep one bit for fix */ \ - if(!gFixQuantized) nbe++; \ - \ - /* Compute quantization coeffs */ \ - Point CQuantCoeff, EQuantCoeff; \ - CQuantCoeff.x = CMax.x!=0.0f ? float((1<Min[j]) mNodes[i].mAABB.mExtents[j]++; \ - else FixMe=false; \ - /* Prevent wrapping */ \ - if(!mNodes[i].mAABB.mExtents[j]) \ - { \ - mNodes[i].mAABB.mExtents[j]=0xffff; \ - FixMe=false; \ - } \ - }while(FixMe); \ - } \ - } - -#define REMAP_DATA(member) \ - /* Fix data */ \ - Data = Nodes[i].member; \ - if(!(Data&1)) \ - { \ - /* Compute box number */ \ - udword Nb = (Data - udword(Nodes))/Nodes[i].GetNodeSize(); \ - Data = udword(&mNodes[Nb]); \ - } \ - /* ...remapped */ \ - mNodes[i].member = Data; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedTree::AABBQuantizedTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedTree::~AABBQuantizedTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBQuantizedTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - mNbNodes = NbNodes; - DELETEARRAY(mNodes); - AABBCollisionNode* Nodes = new AABBCollisionNode[mNbNodes]; - CHECKALLOC(Nodes); - - // Build the tree - udword CurID = 1; - _BuildCollisionTree(Nodes, 0, CurID, tree); - - // Quantize - { - mNodes = new AABBQuantizedNode[mNbNodes]; - CHECKALLOC(mNodes); - - // Get max values - FIND_MAX_VALUES - - // Quantization - INIT_QUANTIZATION - - // Quantize - udword Data; - for(udword i=0;iIsLeaf()) - { - _Walk(current_node->GetPos(), callback, user_data); - _Walk(current_node->GetNeg(), callback, user_data); - } - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedNoLeafTree::AABBQuantizedNoLeafTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedNoLeafTree::~AABBQuantizedNoLeafTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBQuantizedNoLeafTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - mNbNodes = NbTriangles-1; - DELETEARRAY(mNodes); - AABBNoLeafNode* Nodes = new AABBNoLeafNode[mNbNodes]; - CHECKALLOC(Nodes); - - // Build the tree - udword CurID = 1; - _BuildNoLeafTree(Nodes, 0, CurID, tree); - ASSERT(CurID==mNbNodes); - - // Quantize - { - mNodes = new AABBQuantizedNoLeafNode[mNbNodes]; - CHECKALLOC(mNodes); - - // Get max values - FIND_MAX_VALUES - - // Quantization - INIT_QUANTIZATION - - // Quantize - udword Data; - for(udword i=0;iHasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); - if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for optimized trees. Implements 4 trees: + * - normal + * - no leaf + * - quantized + * - no leaf / quantized + * + * \file OPC_OptimizedTree.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A standard AABB tree. + * + * \class AABBCollisionTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A no-leaf AABB tree. + * + * \class AABBNoLeafTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A quantized AABB tree. + * + * \class AABBQuantizedTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A quantized no-leaf AABB tree. + * + * \class AABBQuantizedNoLeafTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +//! Compilation flag: +//! - true to fix quantized boxes (i.e. make sure they enclose the original ones) +//! - false to see the effects of quantization errors (faster, but wrong results in some cases) +static bool gFixQuantized = true; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds an implicit tree from a standard one. An implicit tree is a complete tree (2*N-1 nodes) whose negative + * box pointers and primitive pointers have been made implicit, hence packing 3 pointers in one. + * + * Layout for implicit trees: + * Node: + * - box + * - data (32-bits value) + * + * if data's LSB = 1 => remaining bits are a primitive pointer + * else remaining bits are a P-node pointer, and N = P + 1 + * + * \relates AABBCollisionNode + * \fn _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) + * \param linear [in] base address of destination nodes + * \param box_id [in] index of destination node + * \param current_id [in] current running index + * \param current_node [in] current node from input tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static void _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) +{ + // Current node from input tree is "current_node". Must be flattened into "linear[boxid]". + + // Store the AABB + current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); + current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); + // Store remaining info + if(current_node->IsLeaf()) + { + // The input tree must be complete => i.e. one primitive/leaf + ASSERT(current_node->GetNbPrimitives()==1); + // Get the primitive index from the input tree + udword PrimitiveIndex = current_node->GetPrimitives()[0]; + // Setup box data as the primitive index, marked as leaf + linear[box_id].mData = (PrimitiveIndex<<1)|1; + } + else + { + // To make the negative one implicit, we must store P and N in successive order + udword PosID = current_id++; // Get a new id for positive child + udword NegID = current_id++; // Get a new id for negative child + // Setup box data as the forthcoming new P pointer + linear[box_id].mData = (udword)&linear[PosID]; + // Make sure it's not marked as leaf + ASSERT(!(linear[box_id].mData&1)); + // Recurse with new IDs + _BuildCollisionTree(linear, PosID, current_id, current_node->GetPos()); + _BuildCollisionTree(linear, NegID, current_id, current_node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a "no-leaf" tree from a standard one. This is a tree whose leaf nodes have been removed. + * + * Layout for no-leaf trees: + * + * Node: + * - box + * - P pointer => a node (LSB=0) or a primitive (LSB=1) + * - N pointer => a node (LSB=0) or a primitive (LSB=1) + * + * \relates AABBNoLeafNode + * \fn _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) + * \param linear [in] base address of destination nodes + * \param box_id [in] index of destination node + * \param current_id [in] current running index + * \param current_node [in] current node from input tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static void _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) +{ + const AABBTreeNode* P = current_node->GetPos(); + const AABBTreeNode* N = current_node->GetNeg(); + // Leaf nodes here?! + ASSERT(P); + ASSERT(N); + // Internal node => keep the box + current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); + current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); + + if(P->IsLeaf()) + { + // The input tree must be complete => i.e. one primitive/leaf + ASSERT(P->GetNbPrimitives()==1); + // Get the primitive index from the input tree + udword PrimitiveIndex = P->GetPrimitives()[0]; + // Setup prev box data as the primitive index, marked as leaf + linear[box_id].mPosData = (PrimitiveIndex<<1)|1; + } + else + { + // Get a new id for positive child + udword PosID = current_id++; + // Setup box data + linear[box_id].mPosData = (udword)&linear[PosID]; + // Make sure it's not marked as leaf + ASSERT(!(linear[box_id].mPosData&1)); + // Recurse + _BuildNoLeafTree(linear, PosID, current_id, P); + } + + if(N->IsLeaf()) + { + // The input tree must be complete => i.e. one primitive/leaf + ASSERT(N->GetNbPrimitives()==1); + // Get the primitive index from the input tree + udword PrimitiveIndex = N->GetPrimitives()[0]; + // Setup prev box data as the primitive index, marked as leaf + linear[box_id].mNegData = (PrimitiveIndex<<1)|1; + } + else + { + // Get a new id for negative child + udword NegID = current_id++; + // Setup box data + linear[box_id].mNegData = (udword)&linear[NegID]; + // Make sure it's not marked as leaf + ASSERT(!(linear[box_id].mNegData&1)); + // Recurse + _BuildNoLeafTree(linear, NegID, current_id, N); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollisionTree::AABBCollisionTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollisionTree::~AABBCollisionTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollisionTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + if(mNbNodes!=NbNodes) // Same number of nodes => keep moving + { + mNbNodes = NbNodes; + DELETEARRAY(mNodes); + mNodes = new AABBCollisionNode[mNbNodes]; + CHECKALLOC(mNodes); + } + + // Build the tree + udword CurID = 1; + _BuildCollisionTree(mNodes, 0, CurID, tree); + ASSERT(CurID==mNbNodes); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision tree after vertices have been modified. + * \param mesh_interface [in] mesh interface for current model + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollisionTree::Refit(const MeshInterface* mesh_interface) +{ + ASSERT(!"Not implemented since AABBCollisionTrees have twice as more nodes to refit as AABBNoLeafTrees!"); + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Walks the tree and call the user back for each node. + * \param callback [in] walking callback + * \param user_data [in] callback's user data + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollisionTree::Walk(GenericWalkingCallback callback, void* user_data) const +{ + if(!callback) return false; + + struct Local + { + static void _Walk(const AABBCollisionNode* current_node, GenericWalkingCallback callback, void* user_data) + { + if(!current_node || !(callback)(current_node, user_data)) return; + + if(!current_node->IsLeaf()) + { + _Walk(current_node->GetPos(), callback, user_data); + _Walk(current_node->GetNeg(), callback, user_data); + } + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBNoLeafTree::AABBNoLeafTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBNoLeafTree::~AABBNoLeafTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBNoLeafTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + if(mNbNodes!=NbTriangles-1) // Same number of nodes => keep moving + { + mNbNodes = NbTriangles-1; + DELETEARRAY(mNodes); + mNodes = new AABBNoLeafNode[mNbNodes]; + CHECKALLOC(mNodes); + } + + // Build the tree + udword CurID = 1; + _BuildNoLeafTree(mNodes, 0, CurID, tree); + ASSERT(CurID==mNbNodes); + + return true; +} + +inline_ void ComputeMinMax_OT(Point& min, Point& max, const VertexPointers& vp) +{ + // Compute triangle's AABB = a leaf box +#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much + min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + + min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + + min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); + max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); +#else + min = *vp.Vertex[0]; + max = *vp.Vertex[0]; + min.Min(*vp.Vertex[1]); + max.Max(*vp.Vertex[1]); + min.Min(*vp.Vertex[2]); + max.Max(*vp.Vertex[2]); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision tree after vertices have been modified. + * \param mesh_interface [in] mesh interface for current model + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBNoLeafTree::Refit(const MeshInterface* mesh_interface) +{ + // Checkings + if(!mesh_interface) return false; + + // Bottom-up update + VertexPointers VP; + Point Min,Max; + Point Min_,Max_; + udword Index = mNbNodes; + while(Index--) + { + AABBNoLeafNode& Current = mNodes[Index]; + + if(Current.HasPosLeaf()) + { + mesh_interface->GetTriangle(VP, Current.GetPosPrimitive()); + ComputeMinMax_OT(Min, Max, VP); + } + else + { + const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; + CurrentBox.GetMin(Min); + CurrentBox.GetMax(Max); + } + + if(Current.HasNegLeaf()) + { + mesh_interface->GetTriangle(VP, Current.GetNegPrimitive()); + ComputeMinMax_OT(Min_, Max_, VP); + } + else + { + const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; + CurrentBox.GetMin(Min_); + CurrentBox.GetMax(Max_); + } +#ifdef OPC_USE_FCOMI + Min.x = FCMin2(Min.x, Min_.x); + Max.x = FCMax2(Max.x, Max_.x); + Min.y = FCMin2(Min.y, Min_.y); + Max.y = FCMax2(Max.y, Max_.y); + Min.z = FCMin2(Min.z, Min_.z); + Max.z = FCMax2(Max.z, Max_.z); +#else + Min.Min(Min_); + Max.Max(Max_); +#endif + Current.mAABB.SetMinMax(Min, Max); + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Walks the tree and call the user back for each node. + * \param callback [in] walking callback + * \param user_data [in] callback's user data + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBNoLeafTree::Walk(GenericWalkingCallback callback, void* user_data) const +{ + if(!callback) return false; + + struct Local + { + static void _Walk(const AABBNoLeafNode* current_node, GenericWalkingCallback callback, void* user_data) + { + if(!current_node || !(callback)(current_node, user_data)) return; + + if(!current_node->HasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); + if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} + +// Quantization notes: +// - We could use the highest bits of mData to store some more quantized bits. Dequantization code +// would be slightly more complex, but number of overlap tests would be reduced (and anyhow those +// bits are currently wasted). Of course it's not possible if we move to 16 bits mData. +// - Something like "16 bits floats" could be tested, to bypass the int-to-float conversion. +// - A dedicated BV-BV test could be used, dequantizing while testing for overlap. (i.e. it's some +// lazy-dequantization which may save some work in case of early exits). At the very least some +// muls could be saved by precomputing several more matrices. But maybe not worth the pain. +// - Do we need to dequantize anyway? Not doing the extents-related muls only implies the box has +// been scaled, for example. +// - The deeper we move into the hierarchy, the smaller the extents should be. May not need a fixed +// number of quantization bits. Even better, could probably be best delta-encoded. + + +// Find max values. Some people asked why I wasn't simply using the first node. Well, I can't. +// I'm not looking for (min, max) values like in a standard AABB, I'm looking for the extremal +// centers/extents in order to quantize them. The first node would only give a single center and +// a single extents. While extents would be the biggest, the center wouldn't. +#define FIND_MAX_VALUES \ + /* Get max values */ \ + Point CMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ + Point EMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ + for(udword i=0;iCMax.x) CMax.x = fabsf(Nodes[i].mAABB.mCenter.x); \ + if(fabsf(Nodes[i].mAABB.mCenter.y)>CMax.y) CMax.y = fabsf(Nodes[i].mAABB.mCenter.y); \ + if(fabsf(Nodes[i].mAABB.mCenter.z)>CMax.z) CMax.z = fabsf(Nodes[i].mAABB.mCenter.z); \ + if(fabsf(Nodes[i].mAABB.mExtents.x)>EMax.x) EMax.x = fabsf(Nodes[i].mAABB.mExtents.x); \ + if(fabsf(Nodes[i].mAABB.mExtents.y)>EMax.y) EMax.y = fabsf(Nodes[i].mAABB.mExtents.y); \ + if(fabsf(Nodes[i].mAABB.mExtents.z)>EMax.z) EMax.z = fabsf(Nodes[i].mAABB.mExtents.z); \ + } + +#define INIT_QUANTIZATION \ + udword nbc=15; /* Keep one bit for sign */ \ + udword nbe=15; /* Keep one bit for fix */ \ + if(!gFixQuantized) nbe++; \ + \ + /* Compute quantization coeffs */ \ + Point CQuantCoeff, EQuantCoeff; \ + CQuantCoeff.x = CMax.x!=0.0f ? float((1<Min[j]) mNodes[i].mAABB.mExtents[j]++; \ + else FixMe=false; \ + /* Prevent wrapping */ \ + if(!mNodes[i].mAABB.mExtents[j]) \ + { \ + mNodes[i].mAABB.mExtents[j]=0xffff; \ + FixMe=false; \ + } \ + }while(FixMe); \ + } \ + } + +#define REMAP_DATA(member) \ + /* Fix data */ \ + Data = Nodes[i].member; \ + if(!(Data&1)) \ + { \ + /* Compute box number */ \ + udword Nb = (Data - udword(Nodes))/Nodes[i].GetNodeSize(); \ + Data = udword(&mNodes[Nb]); \ + } \ + /* ...remapped */ \ + mNodes[i].member = Data; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedTree::AABBQuantizedTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedTree::~AABBQuantizedTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBQuantizedTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + mNbNodes = NbNodes; + DELETEARRAY(mNodes); + AABBCollisionNode* Nodes = new AABBCollisionNode[mNbNodes]; + CHECKALLOC(Nodes); + + // Build the tree + udword CurID = 1; + _BuildCollisionTree(Nodes, 0, CurID, tree); + + // Quantize + { + mNodes = new AABBQuantizedNode[mNbNodes]; + CHECKALLOC(mNodes); + + // Get max values + FIND_MAX_VALUES + + // Quantization + INIT_QUANTIZATION + + // Quantize + udword Data; + for(udword i=0;iIsLeaf()) + { + _Walk(current_node->GetPos(), callback, user_data); + _Walk(current_node->GetNeg(), callback, user_data); + } + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedNoLeafTree::AABBQuantizedNoLeafTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedNoLeafTree::~AABBQuantizedNoLeafTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBQuantizedNoLeafTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + mNbNodes = NbTriangles-1; + DELETEARRAY(mNodes); + AABBNoLeafNode* Nodes = new AABBNoLeafNode[mNbNodes]; + CHECKALLOC(Nodes); + + // Build the tree + udword CurID = 1; + _BuildNoLeafTree(Nodes, 0, CurID, tree); + ASSERT(CurID==mNbNodes); + + // Quantize + { + mNodes = new AABBQuantizedNoLeafNode[mNbNodes]; + CHECKALLOC(mNodes); + + // Get max values + FIND_MAX_VALUES + + // Quantization + INIT_QUANTIZATION + + // Quantize + udword Data; + for(udword i=0;iHasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); + if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h b/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h index fd76d6d32..e25db74a3 100644 --- a/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h +++ b/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h @@ -1,215 +1,215 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for optimized trees. - * \file OPC_OptimizedTree.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_OPTIMIZEDTREE_H__ -#define __OPC_OPTIMIZEDTREE_H__ - - //! Common interface for a node of an implicit tree - #define IMPLEMENT_IMPLICIT_NODE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - inline_ base_class() : mData(0) {} \ - inline_ ~base_class() {} \ - /* Leaf test */ \ - inline_ BOOL IsLeaf() const { return mData&1; } \ - /* Data access */ \ - inline_ const base_class* GetPos() const { return (base_class*)mData; } \ - inline_ const base_class* GetNeg() const { return ((base_class*)mData)+1; } \ - inline_ udword GetPrimitive() const { return (mData>>1); } \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - \ - volume mAABB; \ - udword mData; - - //! Common interface for a node of a no-leaf tree - #define IMPLEMENT_NOLEAF_NODE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - inline_ base_class() : mPosData(0), mNegData(0) {} \ - inline_ ~base_class() {} \ - /* Leaf tests */ \ - inline_ BOOL HasPosLeaf() const { return mPosData&1; } \ - inline_ BOOL HasNegLeaf() const { return mNegData&1; } \ - /* Data access */ \ - inline_ const base_class* GetPos() const { return (base_class*)mPosData; } \ - inline_ const base_class* GetNeg() const { return (base_class*)mNegData; } \ - inline_ udword GetPosPrimitive() const { return (mPosData>>1); } \ - inline_ udword GetNegPrimitive() const { return (mNegData>>1); } \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - \ - volume mAABB; \ - udword mPosData; \ - udword mNegData; - - class OPCODE_API AABBCollisionNode - { - IMPLEMENT_IMPLICIT_NODE(AABBCollisionNode, CollisionAABB) - - inline_ float GetVolume() const { return mAABB.mExtents.x * mAABB.mExtents.y * mAABB.mExtents.z; } - inline_ float GetSize() const { return mAABB.mExtents.SquareMagnitude(); } - inline_ udword GetRadius() const - { - udword* Bits = (udword*)&mAABB.mExtents.x; - udword Max = Bits[0]; - if(Bits[1]>Max) Max = Bits[1]; - if(Bits[2]>Max) Max = Bits[2]; - return Max; - } - - // NB: using the square-magnitude or the true volume of the box, seems to yield better results - // (assuming UNC-like informed traversal methods). I borrowed this idea from PQP. The usual "size" - // otherwise, is the largest box extent. In SOLID that extent is computed on-the-fly each time it's - // needed (the best approach IMHO). In RAPID the rotation matrix is permuted so that Extent[0] is - // always the greatest, which saves looking for it at runtime. On the other hand, it yields matrices - // whose determinant is not 1, i.e. you can't encode them anymore as unit quaternions. Not a very - // good strategy. - }; - - class OPCODE_API AABBQuantizedNode - { - IMPLEMENT_IMPLICIT_NODE(AABBQuantizedNode, QuantizedAABB) - - inline_ uword GetSize() const - { - const uword* Bits = mAABB.mExtents; - uword Max = Bits[0]; - if(Bits[1]>Max) Max = Bits[1]; - if(Bits[2]>Max) Max = Bits[2]; - return Max; - } - // NB: for quantized nodes I don't feel like computing a square-magnitude with integers all - // over the place.......! - }; - - class OPCODE_API AABBNoLeafNode - { - IMPLEMENT_NOLEAF_NODE(AABBNoLeafNode, CollisionAABB) - }; - - class OPCODE_API AABBQuantizedNoLeafNode - { - IMPLEMENT_NOLEAF_NODE(AABBQuantizedNoLeafNode, QuantizedAABB) - }; - - //! Common interface for a collision tree - #define IMPLEMENT_COLLISION_TREE(base_class, node) \ - public: \ - /* Constructor / Destructor */ \ - base_class(); \ - virtual ~base_class(); \ - /* Builds from a standard tree */ \ - override(AABBOptimizedTree) bool Build(AABBTree* tree); \ - /* Refits the tree */ \ - override(AABBOptimizedTree) bool Refit(const MeshInterface* mesh_interface); \ - /* Walks the tree */ \ - override(AABBOptimizedTree) bool Walk(GenericWalkingCallback callback, void* user_data) const; \ - /* Data access */ \ - inline_ const node* GetNodes() const { return mNodes; } \ - /* Stats */ \ - override(AABBOptimizedTree) udword GetUsedBytes() const { return mNbNodes*sizeof(node); } \ - private: \ - node* mNodes; - - typedef bool (*GenericWalkingCallback) (const void* current, void* user_data); - - class OPCODE_API AABBOptimizedTree - { - public: - // Constructor / Destructor - AABBOptimizedTree() : - mNbNodes (0) - {} - virtual ~AABBOptimizedTree() {} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Build(AABBTree* tree) = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the collision tree after vertices have been modified. - * \param mesh_interface [in] mesh interface for current model - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Refit(const MeshInterface* mesh_interface) = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Walks the tree and call the user back for each node. - * \param callback [in] walking callback - * \param user_data [in] callback's user data - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Walk(GenericWalkingCallback callback, void* user_data) const = 0; - - // Data access - virtual udword GetUsedBytes() const = 0; - inline_ udword GetNbNodes() const { return mNbNodes; } - - protected: - udword mNbNodes; - }; - - class OPCODE_API AABBCollisionTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBCollisionTree, AABBCollisionNode) - }; - - class OPCODE_API AABBNoLeafTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBNoLeafTree, AABBNoLeafNode) - }; - - class OPCODE_API AABBQuantizedTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBQuantizedTree, AABBQuantizedNode) - - public: - Point mCenterCoeff; - Point mExtentsCoeff; - }; - - class OPCODE_API AABBQuantizedNoLeafTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBQuantizedNoLeafTree, AABBQuantizedNoLeafNode) - - public: - Point mCenterCoeff; - Point mExtentsCoeff; - }; - -#endif // __OPC_OPTIMIZEDTREE_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for optimized trees. + * \file OPC_OptimizedTree.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_OPTIMIZEDTREE_H__ +#define __OPC_OPTIMIZEDTREE_H__ + + //! Common interface for a node of an implicit tree + #define IMPLEMENT_IMPLICIT_NODE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + inline_ base_class() : mData(0) {} \ + inline_ ~base_class() {} \ + /* Leaf test */ \ + inline_ BOOL IsLeaf() const { return mData&1; } \ + /* Data access */ \ + inline_ const base_class* GetPos() const { return (base_class*)mData; } \ + inline_ const base_class* GetNeg() const { return ((base_class*)mData)+1; } \ + inline_ udword GetPrimitive() const { return (mData>>1); } \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + \ + volume mAABB; \ + udword mData; + + //! Common interface for a node of a no-leaf tree + #define IMPLEMENT_NOLEAF_NODE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + inline_ base_class() : mPosData(0), mNegData(0) {} \ + inline_ ~base_class() {} \ + /* Leaf tests */ \ + inline_ BOOL HasPosLeaf() const { return mPosData&1; } \ + inline_ BOOL HasNegLeaf() const { return mNegData&1; } \ + /* Data access */ \ + inline_ const base_class* GetPos() const { return (base_class*)mPosData; } \ + inline_ const base_class* GetNeg() const { return (base_class*)mNegData; } \ + inline_ udword GetPosPrimitive() const { return (mPosData>>1); } \ + inline_ udword GetNegPrimitive() const { return (mNegData>>1); } \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + \ + volume mAABB; \ + udword mPosData; \ + udword mNegData; + + class OPCODE_API AABBCollisionNode + { + IMPLEMENT_IMPLICIT_NODE(AABBCollisionNode, CollisionAABB) + + inline_ float GetVolume() const { return mAABB.mExtents.x * mAABB.mExtents.y * mAABB.mExtents.z; } + inline_ float GetSize() const { return mAABB.mExtents.SquareMagnitude(); } + inline_ udword GetRadius() const + { + udword* Bits = (udword*)&mAABB.mExtents.x; + udword Max = Bits[0]; + if(Bits[1]>Max) Max = Bits[1]; + if(Bits[2]>Max) Max = Bits[2]; + return Max; + } + + // NB: using the square-magnitude or the true volume of the box, seems to yield better results + // (assuming UNC-like informed traversal methods). I borrowed this idea from PQP. The usual "size" + // otherwise, is the largest box extent. In SOLID that extent is computed on-the-fly each time it's + // needed (the best approach IMHO). In RAPID the rotation matrix is permuted so that Extent[0] is + // always the greatest, which saves looking for it at runtime. On the other hand, it yields matrices + // whose determinant is not 1, i.e. you can't encode them anymore as unit quaternions. Not a very + // good strategy. + }; + + class OPCODE_API AABBQuantizedNode + { + IMPLEMENT_IMPLICIT_NODE(AABBQuantizedNode, QuantizedAABB) + + inline_ uword GetSize() const + { + const uword* Bits = mAABB.mExtents; + uword Max = Bits[0]; + if(Bits[1]>Max) Max = Bits[1]; + if(Bits[2]>Max) Max = Bits[2]; + return Max; + } + // NB: for quantized nodes I don't feel like computing a square-magnitude with integers all + // over the place.......! + }; + + class OPCODE_API AABBNoLeafNode + { + IMPLEMENT_NOLEAF_NODE(AABBNoLeafNode, CollisionAABB) + }; + + class OPCODE_API AABBQuantizedNoLeafNode + { + IMPLEMENT_NOLEAF_NODE(AABBQuantizedNoLeafNode, QuantizedAABB) + }; + + //! Common interface for a collision tree + #define IMPLEMENT_COLLISION_TREE(base_class, node) \ + public: \ + /* Constructor / Destructor */ \ + base_class(); \ + virtual ~base_class(); \ + /* Builds from a standard tree */ \ + override(AABBOptimizedTree) bool Build(AABBTree* tree); \ + /* Refits the tree */ \ + override(AABBOptimizedTree) bool Refit(const MeshInterface* mesh_interface); \ + /* Walks the tree */ \ + override(AABBOptimizedTree) bool Walk(GenericWalkingCallback callback, void* user_data) const; \ + /* Data access */ \ + inline_ const node* GetNodes() const { return mNodes; } \ + /* Stats */ \ + override(AABBOptimizedTree) udword GetUsedBytes() const { return mNbNodes*sizeof(node); } \ + private: \ + node* mNodes; + + typedef bool (*GenericWalkingCallback) (const void* current, void* user_data); + + class OPCODE_API AABBOptimizedTree + { + public: + // Constructor / Destructor + AABBOptimizedTree() : + mNbNodes (0) + {} + virtual ~AABBOptimizedTree() {} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Build(AABBTree* tree) = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the collision tree after vertices have been modified. + * \param mesh_interface [in] mesh interface for current model + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Refit(const MeshInterface* mesh_interface) = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Walks the tree and call the user back for each node. + * \param callback [in] walking callback + * \param user_data [in] callback's user data + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Walk(GenericWalkingCallback callback, void* user_data) const = 0; + + // Data access + virtual udword GetUsedBytes() const = 0; + inline_ udword GetNbNodes() const { return mNbNodes; } + + protected: + udword mNbNodes; + }; + + class OPCODE_API AABBCollisionTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBCollisionTree, AABBCollisionNode) + }; + + class OPCODE_API AABBNoLeafTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBNoLeafTree, AABBNoLeafNode) + }; + + class OPCODE_API AABBQuantizedTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBQuantizedTree, AABBQuantizedNode) + + public: + Point mCenterCoeff; + Point mExtentsCoeff; + }; + + class OPCODE_API AABBQuantizedNoLeafTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBQuantizedNoLeafTree, AABBQuantizedNoLeafNode) + + public: + Point mCenterCoeff; + Point mExtentsCoeff; + }; + +#endif // __OPC_OPTIMIZEDTREE_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_Picking.cpp b/Extras/CDTestFramework/Opcode/OPC_Picking.cpp index 7d6b0e713..02a9ed70b 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Picking.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_Picking.cpp @@ -1,191 +1,191 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code to perform "picking". - * \file OPC_Picking.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#ifdef OPC_RAYHIT_CALLBACK - -/* - Possible RayCollider usages: - - boolean query (shadow feeler) - - closest hit - - all hits - - number of intersection (boolean) - -*/ - -bool Opcode::SetupAllHits(RayCollider& collider, CollisionFaces& contacts) -{ - struct Local - { - static void AllContacts(const CollisionFace& hit, void* user_data) - { - CollisionFaces* CF = (CollisionFaces*)user_data; - CF->AddFace(hit); - } - }; - - collider.SetFirstContact(false); - collider.SetHitCallback(Local::AllContacts); - collider.SetUserData(&contacts); - return true; -} - -bool Opcode::SetupClosestHit(RayCollider& collider, CollisionFace& closest_contact) -{ - struct Local - { - static void ClosestContact(const CollisionFace& hit, void* user_data) - { - CollisionFace* CF = (CollisionFace*)user_data; - if(hit.mDistancemDistance) *CF = hit; - } - }; - - collider.SetFirstContact(false); - collider.SetHitCallback(Local::ClosestContact); - collider.SetUserData(&closest_contact); - closest_contact.mDistance = MAX_FLOAT; - return true; -} - -bool Opcode::SetupShadowFeeler(RayCollider& collider) -{ - collider.SetFirstContact(true); - collider.SetHitCallback(null); - return true; -} - -bool Opcode::SetupInOutTest(RayCollider& collider) -{ - collider.SetFirstContact(false); - collider.SetHitCallback(null); - // Results with collider.GetNbIntersections() - return true; -} - -bool Opcode::Picking( -CollisionFace& picked_face, -const Ray& world_ray, const Model& model, const Matrix4x4* world, -float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data) -{ - struct Local - { - struct CullData - { - CollisionFace* Closest; - float MinLimit; - CullModeCallback Callback; - void* UserData; - Point ViewPoint; - const MeshInterface* IMesh; - }; - - // Called for each stabbed face - static void RenderCullingCallback(const CollisionFace& hit, void* user_data) - { - CullData* Data = (CullData*)user_data; - - // Discard face if we already have a closer hit - if(hit.mDistance>=Data->Closest->mDistance) return; - - // Discard face if hit point is smaller than min limit. This mainly happens when the face is in front - // of the near clip plane (or straddles it). If we keep the face nonetheless, the user can select an - // object that he may not even be able to see, which is very annoying. - if(hit.mDistance<=Data->MinLimit) return; - - // This is the index of currently stabbed triangle. - udword StabbedFaceIndex = hit.mFaceID; - - // We may keep it or not, depending on backface culling - bool KeepIt = true; - - // Catch *render* cull mode for this face - CullMode CM = (Data->Callback)(StabbedFaceIndex, Data->UserData); - - if(CM!=CULLMODE_NONE) // Don't even compute culling for double-sided triangles - { - // Compute backface culling for current face - - VertexPointers VP; - Data->IMesh->GetTriangle(VP, StabbedFaceIndex); - if(VP.BackfaceCulling(Data->ViewPoint)) - { - if(CM==CULLMODE_CW) KeepIt = false; - } - else - { - if(CM==CULLMODE_CCW) KeepIt = false; - } - } - - if(KeepIt) *Data->Closest = hit; - } - }; - - RayCollider RC; - RC.SetMaxDist(max_dist); - RC.SetTemporalCoherence(false); - RC.SetCulling(false); // We need all faces since some of them can be double-sided - RC.SetFirstContact(false); - RC.SetHitCallback(Local::RenderCullingCallback); - - picked_face.mFaceID = INVALID_ID; - picked_face.mDistance = MAX_FLOAT; - picked_face.mU = 0.0f; - picked_face.mV = 0.0f; - - Local::CullData Data; - Data.Closest = &picked_face; - Data.MinLimit = min_dist; - Data.Callback = callback; - Data.UserData = user_data; - Data.ViewPoint = view_point; - Data.IMesh = model.GetMeshInterface(); - - if(world) - { - // Get matrices - Matrix4x4 InvWorld; - InvertPRMatrix(InvWorld, *world); - - // Compute camera position in mesh space - Data.ViewPoint *= InvWorld; - } - - RC.SetUserData(&Data); - if(RC.Collide(world_ray, model, world)) - { - return picked_face.mFaceID!=INVALID_ID; - } - return false; -} - -#endif +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code to perform "picking". + * \file OPC_Picking.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#ifdef OPC_RAYHIT_CALLBACK + +/* + Possible RayCollider usages: + - boolean query (shadow feeler) + - closest hit + - all hits + - number of intersection (boolean) + +*/ + +bool Opcode::SetupAllHits(RayCollider& collider, CollisionFaces& contacts) +{ + struct Local + { + static void AllContacts(const CollisionFace& hit, void* user_data) + { + CollisionFaces* CF = (CollisionFaces*)user_data; + CF->AddFace(hit); + } + }; + + collider.SetFirstContact(false); + collider.SetHitCallback(Local::AllContacts); + collider.SetUserData(&contacts); + return true; +} + +bool Opcode::SetupClosestHit(RayCollider& collider, CollisionFace& closest_contact) +{ + struct Local + { + static void ClosestContact(const CollisionFace& hit, void* user_data) + { + CollisionFace* CF = (CollisionFace*)user_data; + if(hit.mDistancemDistance) *CF = hit; + } + }; + + collider.SetFirstContact(false); + collider.SetHitCallback(Local::ClosestContact); + collider.SetUserData(&closest_contact); + closest_contact.mDistance = MAX_FLOAT; + return true; +} + +bool Opcode::SetupShadowFeeler(RayCollider& collider) +{ + collider.SetFirstContact(true); + collider.SetHitCallback(null); + return true; +} + +bool Opcode::SetupInOutTest(RayCollider& collider) +{ + collider.SetFirstContact(false); + collider.SetHitCallback(null); + // Results with collider.GetNbIntersections() + return true; +} + +bool Opcode::Picking( +CollisionFace& picked_face, +const Ray& world_ray, const Model& model, const Matrix4x4* world, +float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data) +{ + struct Local + { + struct CullData + { + CollisionFace* Closest; + float MinLimit; + CullModeCallback Callback; + void* UserData; + Point ViewPoint; + const MeshInterface* IMesh; + }; + + // Called for each stabbed face + static void RenderCullingCallback(const CollisionFace& hit, void* user_data) + { + CullData* Data = (CullData*)user_data; + + // Discard face if we already have a closer hit + if(hit.mDistance>=Data->Closest->mDistance) return; + + // Discard face if hit point is smaller than min limit. This mainly happens when the face is in front + // of the near clip plane (or straddles it). If we keep the face nonetheless, the user can select an + // object that he may not even be able to see, which is very annoying. + if(hit.mDistance<=Data->MinLimit) return; + + // This is the index of currently stabbed triangle. + udword StabbedFaceIndex = hit.mFaceID; + + // We may keep it or not, depending on backface culling + bool KeepIt = true; + + // Catch *render* cull mode for this face + CullMode CM = (Data->Callback)(StabbedFaceIndex, Data->UserData); + + if(CM!=CULLMODE_NONE) // Don't even compute culling for double-sided triangles + { + // Compute backface culling for current face + + VertexPointers VP; + Data->IMesh->GetTriangle(VP, StabbedFaceIndex); + if(VP.BackfaceCulling(Data->ViewPoint)) + { + if(CM==CULLMODE_CW) KeepIt = false; + } + else + { + if(CM==CULLMODE_CCW) KeepIt = false; + } + } + + if(KeepIt) *Data->Closest = hit; + } + }; + + RayCollider RC; + RC.SetMaxDist(max_dist); + RC.SetTemporalCoherence(false); + RC.SetCulling(false); // We need all faces since some of them can be double-sided + RC.SetFirstContact(false); + RC.SetHitCallback(Local::RenderCullingCallback); + + picked_face.mFaceID = INVALID_ID; + picked_face.mDistance = MAX_FLOAT; + picked_face.mU = 0.0f; + picked_face.mV = 0.0f; + + Local::CullData Data; + Data.Closest = &picked_face; + Data.MinLimit = min_dist; + Data.Callback = callback; + Data.UserData = user_data; + Data.ViewPoint = view_point; + Data.IMesh = model.GetMeshInterface(); + + if(world) + { + // Get matrices + Matrix4x4 InvWorld; + InvertPRMatrix(InvWorld, *world); + + // Compute camera position in mesh space + Data.ViewPoint *= InvWorld; + } + + RC.SetUserData(&Data); + if(RC.Collide(world_ray, model, world)) + { + return picked_face.mFaceID!=INVALID_ID; + } + return false; +} + +#endif diff --git a/Extras/CDTestFramework/Opcode/OPC_Picking.h b/Extras/CDTestFramework/Opcode/OPC_Picking.h index a96810cc1..5c69f5d46 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Picking.h +++ b/Extras/CDTestFramework/Opcode/OPC_Picking.h @@ -1,54 +1,54 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code to perform "picking". - * \file OPC_Picking.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_PICKING_H__ -#define __OPC_PICKING_H__ - -#ifdef OPC_RAYHIT_CALLBACK - - enum CullMode - { - CULLMODE_NONE = 0, - CULLMODE_CW = 1, - CULLMODE_CCW = 2 - }; - - typedef CullMode (*CullModeCallback)(udword triangle_index, void* user_data); - - OPCODE_API bool SetupAllHits (RayCollider& collider, CollisionFaces& contacts); - OPCODE_API bool SetupClosestHit (RayCollider& collider, CollisionFace& closest_contact); - OPCODE_API bool SetupShadowFeeler (RayCollider& collider); - OPCODE_API bool SetupInOutTest (RayCollider& collider); - - OPCODE_API bool Picking( - CollisionFace& picked_face, - const Ray& world_ray, const Model& model, const Matrix4x4* world, - float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data); -#endif - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code to perform "picking". + * \file OPC_Picking.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_PICKING_H__ +#define __OPC_PICKING_H__ + +#ifdef OPC_RAYHIT_CALLBACK + + enum CullMode + { + CULLMODE_NONE = 0, + CULLMODE_CW = 1, + CULLMODE_CCW = 2 + }; + + typedef CullMode (*CullModeCallback)(udword triangle_index, void* user_data); + + OPCODE_API bool SetupAllHits (RayCollider& collider, CollisionFaces& contacts); + OPCODE_API bool SetupClosestHit (RayCollider& collider, CollisionFace& closest_contact); + OPCODE_API bool SetupShadowFeeler (RayCollider& collider); + OPCODE_API bool SetupInOutTest (RayCollider& collider); + + OPCODE_API bool Picking( + CollisionFace& picked_face, + const Ray& world_ray, const Model& model, const Matrix4x4* world, + float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data); +#endif + #endif //__OPC_PICKING_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h b/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h index 3121b02ee..21ab91c72 100644 --- a/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h @@ -1,67 +1,67 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Planes-AABB overlap test. - * - original code by Ville Miettinen, from Umbra/dPVS (released on the GD-Algorithms mailing list) - * - almost used "as-is", I even left the comments (hence the frustum-related notes) - * - * \param center [in] box center - * \param extents [in] box extents - * \param out_clip_mask [out] bitmask for active planes - * \param in_clip_mask [in] bitmask for active planes - * \return TRUE if boxes overlap planes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL PlanesCollider::PlanesAABBOverlap(const Point& center, const Point& extents, udword& out_clip_mask, udword in_clip_mask) -{ - // Stats - mNbVolumeBVTests++; - - const Plane* p = mPlanes; - - // Evaluate through all active frustum planes. We determine the relation - // between the AABB and a plane by using the concept of "near" and "far" - // vertices originally described by Zhang (and later by Möller). Our - // variant here uses 3 fabs ops, 6 muls, 7 adds and two floating point - // comparisons per plane. The routine early-exits if the AABB is found - // to be outside any of the planes. The loop also constructs a new output - // clip mask. Most FPUs have a native single-cycle fabsf() operation. - - udword Mask = 1; // current mask index (1,2,4,8,..) - udword TmpOutClipMask = 0; // initialize output clip mask into empty. - - while(Mask<=in_clip_mask) // keep looping while we have active planes left... - { - if(in_clip_mask & Mask) // if clip plane is active, process it.. - { - float NP = extents.x*fabsf(p->n.x) + extents.y*fabsf(p->n.y) + extents.z*fabsf(p->n.z); // ### fabsf could be precomputed - float MP = center.x*p->n.x + center.y*p->n.y + center.z*p->n.z + p->d; - - if(NP < MP) // near vertex behind the clip plane... - return FALSE; // .. so there is no intersection.. - if((-NP) < MP) // near and far vertices on different sides of plane.. - TmpOutClipMask |= Mask; // .. so update the clip mask... - } - Mask+=Mask; // mk = (1<n.x) + extents.y*fabsf(p->n.y) + extents.z*fabsf(p->n.z); // ### fabsf could be precomputed + float MP = center.x*p->n.x + center.y*p->n.y + center.z*p->n.z + p->d; + + if(NP < MP) // near vertex behind the clip plane... + return FALSE; // .. so there is no intersection.. + if((-NP) < MP) // near and far vertices on different sides of plane.. + TmpOutClipMask |= Mask; // .. so update the clip mask... + } + Mask+=Mask; // mk = (1<Add(prim_index); - -//! Planes-triangle test -#define PLANES_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - mIMesh->GetTriangle(mVP, prim_index); \ - /* Perform triangle-box overlap test */ \ - if(PlanesTriOverlap(clip_mask)) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -PlanesCollider::PlanesCollider() : - mPlanes (null), - mNbPlanes (0) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -PlanesCollider::~PlanesCollider() -{ - DELETEARRAY(mPlanes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Validates current settings. You should call this method after all the settings and callbacks have been defined. - * \return null if everything is ok, else a string describing the problem - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const char* PlanesCollider::ValidateSettings() -{ - if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; - - return VolumeCollider::ValidateSettings(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a planes cache - * \param planes [in] list of planes in world space - * \param nb_planes [in] number of planes - * \param model [in] Opcode model to collide with - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool PlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const Model& model, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, planes, nb_planes, worldm)) return true; - - udword PlaneMask = (1<mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - compute planes in model space - * - check temporal coherence - * - * \param cache [in/out] a planes cache - * \param planes [in] list of planes - * \param nb_planes [in] number of planes - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL PlanesCollider::InitQuery(PlanesCache& cache, const Plane* planes, udword nb_planes, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute planes in model space - if(nb_planes>mNbPlanes) - { - DELETEARRAY(mPlanes); - mPlanes = new Plane[nb_planes]; - } - mNbPlanes = nb_planes; - - if(worldm) - { - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - -// for(udword i=0;iHasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the planes (and set contact status if needed) - udword clip_mask = (1< check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the planes (and set contact status if needed) - udword clip_mask = (1< we'll have to perform a normal query - } - else mTouchedPrimitives->Reset(); - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - return FALSE; -} - -#define TEST_CLIP_MASK \ - /* If the box is completely included, so are its children. We don't need to do extra tests, we */ \ - /* can immediately output a list of visible children. Those ones won't need to be clipped. */ \ - if(!OutClipMask) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBCollisionNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _Collide(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBQuantizedNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _Collide(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBNoLeafNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg(), OutClipMask); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBQuantizedNoLeafNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg(), OutClipMask); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); -} - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridPlanesCollider::HybridPlanesCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridPlanesCollider::~HybridPlanesCollider() -{ -} - -bool HybridPlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const HybridModel& model, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, planes, nb_planes, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - udword clip_mask = (1<mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - udword clip_mask = (1<Add(prim_index); + +//! Planes-triangle test +#define PLANES_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + mIMesh->GetTriangle(mVP, prim_index); \ + /* Perform triangle-box overlap test */ \ + if(PlanesTriOverlap(clip_mask)) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +PlanesCollider::PlanesCollider() : + mPlanes (null), + mNbPlanes (0) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +PlanesCollider::~PlanesCollider() +{ + DELETEARRAY(mPlanes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* PlanesCollider::ValidateSettings() +{ + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; + + return VolumeCollider::ValidateSettings(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a planes cache + * \param planes [in] list of planes in world space + * \param nb_planes [in] number of planes + * \param model [in] Opcode model to collide with + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool PlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const Model& model, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, planes, nb_planes, worldm)) return true; + + udword PlaneMask = (1<mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - compute planes in model space + * - check temporal coherence + * + * \param cache [in/out] a planes cache + * \param planes [in] list of planes + * \param nb_planes [in] number of planes + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL PlanesCollider::InitQuery(PlanesCache& cache, const Plane* planes, udword nb_planes, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute planes in model space + if(nb_planes>mNbPlanes) + { + DELETEARRAY(mPlanes); + mPlanes = new Plane[nb_planes]; + } + mNbPlanes = nb_planes; + + if(worldm) + { + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + +// for(udword i=0;iHasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the planes (and set contact status if needed) + udword clip_mask = (1< check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the planes (and set contact status if needed) + udword clip_mask = (1< we'll have to perform a normal query + } + else mTouchedPrimitives->Reset(); + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + return FALSE; +} + +#define TEST_CLIP_MASK \ + /* If the box is completely included, so are its children. We don't need to do extra tests, we */ \ + /* can immediately output a list of visible children. Those ones won't need to be clipped. */ \ + if(!OutClipMask) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBCollisionNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _Collide(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBQuantizedNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _Collide(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBNoLeafNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg(), OutClipMask); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBQuantizedNoLeafNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg(), OutClipMask); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); +} + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridPlanesCollider::HybridPlanesCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridPlanesCollider::~HybridPlanesCollider() +{ +} + +bool HybridPlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const HybridModel& model, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, planes, nb_planes, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + udword clip_mask = (1<mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + udword clip_mask = (1<Distance(*mVP.Vertex[0]); - float d1 = p->Distance(*mVP.Vertex[1]); - float d2 = p->Distance(*mVP.Vertex[2]); - if(d0>0.0f && d1>0.0f && d2>0.0f) return FALSE; -// if(!(IR(d0)&SIGN_BITMASK) && !(IR(d1)&SIGN_BITMASK) && !(IR(d2)&SIGN_BITMASK)) return FALSE; - } - Mask+=Mask; - p++; - } -/* - for(udword i=0;i<6;i++) - { - float d0 = p[i].Distance(mLeafVerts[0]); - float d1 = p[i].Distance(mLeafVerts[1]); - float d2 = p[i].Distance(mLeafVerts[2]); - if(d0>0.0f && d1>0.0f && d2>0.0f) return false; - } -*/ - return TRUE; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Planes-triangle overlap test. + * \param in_clip_mask [in] bitmask for active planes + * \return TRUE if triangle overlap planes + * \warning THIS IS A CONSERVATIVE TEST !! Some triangles will be returned as intersecting, while they're not! + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL PlanesCollider::PlanesTriOverlap(udword in_clip_mask) +{ + // Stats + mNbVolumePrimTests++; + + const Plane* p = mPlanes; + udword Mask = 1; + + while(Mask<=in_clip_mask) + { + if(in_clip_mask & Mask) + { + float d0 = p->Distance(*mVP.Vertex[0]); + float d1 = p->Distance(*mVP.Vertex[1]); + float d2 = p->Distance(*mVP.Vertex[2]); + if(d0>0.0f && d1>0.0f && d2>0.0f) return FALSE; +// if(!(IR(d0)&SIGN_BITMASK) && !(IR(d1)&SIGN_BITMASK) && !(IR(d2)&SIGN_BITMASK)) return FALSE; + } + Mask+=Mask; + p++; + } +/* + for(udword i=0;i<6;i++) + { + float d0 = p[i].Distance(mLeafVerts[0]); + float d1 = p[i].Distance(mLeafVerts[1]); + float d2 = p[i].Distance(mLeafVerts[2]); + if(d0>0.0f && d1>0.0f && d2>0.0f) return false; + } +*/ + return TRUE; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h b/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h index e134202a9..0d2639c6b 100644 --- a/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h @@ -1,81 +1,81 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - - -// Opcode 1.1: ray-AABB overlap tests based on Woo's code -// Opcode 1.2: ray-AABB overlap tests based on the separating axis theorem -// -// The point of intersection is not computed anymore. The distance to impact is not needed anymore -// since we now have two different queries for segments or rays. - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a segment-AABB overlap test using the separating axis theorem. Segment is cached within the class. - * \param center [in] AABB center - * \param extents [in] AABB extents - * \return true on overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::SegmentAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbRayBVTests++; - - float Dx = mData2.x - center.x; if(fabsf(Dx) > extents.x + mFDir.x) return FALSE; - float Dy = mData2.y - center.y; if(fabsf(Dy) > extents.y + mFDir.y) return FALSE; - float Dz = mData2.z - center.z; if(fabsf(Dz) > extents.z + mFDir.z) return FALSE; - - float f; - f = mData.y * Dz - mData.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; - f = mData.z * Dx - mData.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; - f = mData.x * Dy - mData.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; - - return TRUE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a ray-AABB overlap test using the separating axis theorem. Ray is cached within the class. - * \param center [in] AABB center - * \param extents [in] AABB extents - * \return true on overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::RayAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbRayBVTests++; - -// float Dx = mOrigin.x - center.x; if(fabsf(Dx) > extents.x && Dx*mDir.x>=0.0f) return FALSE; -// float Dy = mOrigin.y - center.y; if(fabsf(Dy) > extents.y && Dy*mDir.y>=0.0f) return FALSE; -// float Dz = mOrigin.z - center.z; if(fabsf(Dz) > extents.z && Dz*mDir.z>=0.0f) return FALSE; - - float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && Dx*mDir.x>=0.0f) return FALSE; - float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && Dy*mDir.y>=0.0f) return FALSE; - float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && Dz*mDir.z>=0.0f) return FALSE; - -// float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && ((SIR(Dx)-1)^SIR(mDir.x))>=0.0f) return FALSE; -// float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && ((SIR(Dy)-1)^SIR(mDir.y))>=0.0f) return FALSE; -// float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && ((SIR(Dz)-1)^SIR(mDir.z))>=0.0f) return FALSE; - - float f; - f = mDir.y * Dz - mDir.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; - f = mDir.z * Dx - mDir.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; - f = mDir.x * Dy - mDir.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; - - return TRUE; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + + +// Opcode 1.1: ray-AABB overlap tests based on Woo's code +// Opcode 1.2: ray-AABB overlap tests based on the separating axis theorem +// +// The point of intersection is not computed anymore. The distance to impact is not needed anymore +// since we now have two different queries for segments or rays. + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a segment-AABB overlap test using the separating axis theorem. Segment is cached within the class. + * \param center [in] AABB center + * \param extents [in] AABB extents + * \return true on overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL RayCollider::SegmentAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbRayBVTests++; + + float Dx = mData2.x - center.x; if(fabsf(Dx) > extents.x + mFDir.x) return FALSE; + float Dy = mData2.y - center.y; if(fabsf(Dy) > extents.y + mFDir.y) return FALSE; + float Dz = mData2.z - center.z; if(fabsf(Dz) > extents.z + mFDir.z) return FALSE; + + float f; + f = mData.y * Dz - mData.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; + f = mData.z * Dx - mData.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; + f = mData.x * Dy - mData.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; + + return TRUE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a ray-AABB overlap test using the separating axis theorem. Ray is cached within the class. + * \param center [in] AABB center + * \param extents [in] AABB extents + * \return true on overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL RayCollider::RayAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbRayBVTests++; + +// float Dx = mOrigin.x - center.x; if(fabsf(Dx) > extents.x && Dx*mDir.x>=0.0f) return FALSE; +// float Dy = mOrigin.y - center.y; if(fabsf(Dy) > extents.y && Dy*mDir.y>=0.0f) return FALSE; +// float Dz = mOrigin.z - center.z; if(fabsf(Dz) > extents.z && Dz*mDir.z>=0.0f) return FALSE; + + float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && Dx*mDir.x>=0.0f) return FALSE; + float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && Dy*mDir.y>=0.0f) return FALSE; + float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && Dz*mDir.z>=0.0f) return FALSE; + +// float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && ((SIR(Dx)-1)^SIR(mDir.x))>=0.0f) return FALSE; +// float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && ((SIR(Dy)-1)^SIR(mDir.y))>=0.0f) return FALSE; +// float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && ((SIR(Dz)-1)^SIR(mDir.z))>=0.0f) return FALSE; + + float f; + f = mDir.y * Dz - mDir.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; + f = mDir.z * Dx - mDir.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; + f = mDir.x * Dy - mDir.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; + + return TRUE; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp b/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp index 2c4bf8c75..07ceb32bb 100644 --- a/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp @@ -1,771 +1,771 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a ray collider. - * \file OPC_RayCollider.cpp - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a ray-vs-tree collider. - * This class performs a stabbing query on an AABB tree, i.e. does a ray-mesh collision. - * - * HIGHER DISTANCE BOUND: - * - * If P0 and P1 are two 3D points, let's define: - * - d = distance between P0 and P1 - * - Origin = P0 - * - Direction = (P1 - P0) / d = normalized direction vector - * - A parameter t such as a point P on the line (P0,P1) is P = Origin + t * Direction - * - t = 0 --> P = P0 - * - t = d --> P = P1 - * - * Then we can define a general "ray" as: - * - * struct Ray - * { - * Point Origin; - * Point Direction; - * }; - * - * But it actually maps three different things: - * - a segment, when 0 <= t <= d - * - a half-line, when 0 <= t < +infinity, or -infinity < t <= d - * - a line, when -infinity < t < +infinity - * - * In Opcode, we support segment queries, which yield half-line queries by setting d = +infinity. - * We don't support line-queries. If you need them, shift the origin along the ray by an appropriate margin. - * - * In short, the lower bound is always 0, and you can setup the higher bound "d" with RayCollider::SetMaxDist(). - * - * Query |segment |half-line |line - * --------|-------------------|---------------|---------------- - * Usages |-shadow feelers |-raytracing |- - * |-sweep tests |-in/out tests | - * - * FIRST CONTACT: - * - * - You can setup "first contact" mode or "all contacts" mode with RayCollider::SetFirstContact(). - * - In "first contact" mode we return as soon as the ray hits one face. If can be useful e.g. for shadow feelers, where - * you want to know whether the path to the light is free or not (a boolean answer is enough). - * - In "all contacts" mode we return all faces hit by the ray. - * - * TEMPORAL COHERENCE: - * - * - You can enable or disable temporal coherence with RayCollider::SetTemporalCoherence(). - * - It currently only works in "first contact" mode. - * - If temporal coherence is enabled, the previously hit triangle is cached during the first query. Then, next queries - * start by colliding the ray against the cached triangle. If they still collide, we return immediately. - * - * CLOSEST HIT: - * - * - You can enable or disable "closest hit" with RayCollider::SetClosestHit(). - * - It currently only works in "all contacts" mode. - * - If closest hit is enabled, faces are sorted by distance on-the-fly and the closest one only is reported. - * - * BACKFACE CULLING: - * - * - You can enable or disable backface culling with RayCollider::SetCulling(). - * - If culling is enabled, ray will not hit back faces (only front faces). - * - * - * - * \class RayCollider - * \author Pierre Terdiman - * \version 1.3 - * \date June, 2, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * This class describes a face hit by a ray or segment. - * This is a particular class dedicated to stabbing queries. - * - * \class CollisionFace - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * This class is a dedicated collection of CollisionFace. - * - * \class CollisionFaces - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_RayAABBOverlap.h" -#include "OPC_RayTriOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - mNbIntersections++; \ - /* Set contact status */ \ - mFlags |= flag; \ - /* In any case the contact has been found and recorded in mStabbedFace */ \ - mStabbedFace.mFaceID = prim_index; - -#ifdef OPC_RAYHIT_CALLBACK - - #define HANDLE_CONTACT(prim_index, flag) \ - SET_CONTACT(prim_index, flag) \ - \ - if(mHitCallback) (mHitCallback)(mStabbedFace, mUserData); - - #define UPDATE_CACHE \ - if(cache && GetContactStatus()) \ - { \ - *cache = mStabbedFace.mFaceID; \ - } -#else - - #define HANDLE_CONTACT(prim_index, flag) \ - SET_CONTACT(prim_index, flag) \ - \ - /* Now we can also record it in mStabbedFaces if available */ \ - if(mStabbedFaces) \ - { \ - /* If we want all faces or if that's the first one we hit */ \ - if(!mClosestHit || !mStabbedFaces->GetNbFaces()) \ - { \ - mStabbedFaces->AddFace(mStabbedFace); \ - } \ - else \ - { \ - /* We only keep closest hit */ \ - CollisionFace* Current = const_cast(mStabbedFaces->GetFaces()); \ - if(Current && mStabbedFace.mDistancemDistance) \ - { \ - *Current = mStabbedFace; \ - } \ - } \ - } - - #define UPDATE_CACHE \ - if(cache && GetContactStatus() && mStabbedFaces) \ - { \ - const CollisionFace* Current = mStabbedFaces->GetFaces(); \ - if(Current) *cache = Current->mFaceID; \ - else *cache = INVALID_ID; \ - } -#endif - -#define SEGMENT_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - \ - /* Perform ray-tri overlap test and return */ \ - if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - /* Intersection point is valid if dist < segment's length */ \ - /* We know dist>0 so we can use integers */ \ - if(IR(mStabbedFace.mDistance)GetTriangle(VP, prim_index); \ - \ - /* Perform ray-tri overlap test and return */ \ - if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - HANDLE_CONTACT(prim_index, flag) \ - } - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RayCollider::RayCollider() : - mNbRayBVTests (0), - mNbRayPrimTests (0), - mNbIntersections (0), - mCulling (true), -#ifdef OPC_RAYHIT_CALLBACK - mHitCallback (null), - mUserData (0), -#else - mClosestHit (false), - mStabbedFaces (null), -#endif - mMaxDist (MAX_FLOAT) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RayCollider::~RayCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Validates current settings. You should call this method after all the settings and callbacks have been defined. - * \return null if everything is ok, else a string describing the problem - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const char* RayCollider::ValidateSettings() -{ - if(mMaxDist<0.0f) return "Higher distance bound must be positive!"; - if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; -#ifndef OPC_RAYHIT_CALLBACK - if(mClosestHit && FirstContactEnabled()) return "Closest hit doesn't work with ""First contact"" mode!"; - if(TemporalCoherenceEnabled() && mClosestHit) return "Temporal coherence can't guarantee to report closest hit!"; -#endif - if(SkipPrimitiveTests()) return "SkipPrimitiveTests not possible for RayCollider ! (not implemented)"; - return null; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic stabbing query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - in the user-provided destination array - * - * \param world_ray [in] stabbing ray in world space - * \param model [in] Opcode model to collide with - * \param world [in] model's world matrix, or null - * \param cache [in] a possibly cached face index, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool RayCollider::Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world, udword* cache) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(world_ray, world, cache)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - } - - // Update cache if needed - UPDATE_CACHE - return true; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a stabbing query : - * - reset stats & contact status - * - compute ray in local space - * - check temporal coherence - * - * \param world_ray [in] stabbing ray in world space - * \param world [in] object's world matrix, or null - * \param face_id [in] index of previously stabbed triangle - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL RayCollider::InitQuery(const Ray& world_ray, const Matrix4x4* world, udword* face_id) -{ - // Reset stats & contact status - Collider::InitQuery(); - mNbRayBVTests = 0; - mNbRayPrimTests = 0; - mNbIntersections = 0; -#ifndef OPC_RAYHIT_CALLBACK - if(mStabbedFaces) mStabbedFaces->Reset(); -#endif - - // Compute ray in local space - // The (Origin/Dir) form is needed for the ray-triangle test anyway (even for segment tests) - if(world) - { - Matrix3x3 InvWorld = *world; - mDir = InvWorld * world_ray.mDir; - - Matrix4x4 World; - InvertPRMatrix(World, *world); - mOrigin = world_ray.mOrig * World; - } - else - { - mDir = world_ray.mDir; - mOrigin = world_ray.mOrig; - } - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - if(!SkipPrimitiveTests()) - { - // Perform overlap test between the unique triangle and the ray (and set contact status if needed) - SEGMENT_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // Check temporal coherence : - - // Test previously colliding primitives first - if(TemporalCoherenceEnabled() && FirstContactEnabled() && face_id && *face_id!=INVALID_ID) - { -#ifdef OLD_CODE -#ifndef OPC_RAYHIT_CALLBACK - if(!mClosestHit) -#endif - { - // Request vertices from the app - VertexPointers VP; - mIMesh->GetTriangle(VP, *face_id); - // Perform ray-cached tri overlap test - if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) - { - // Intersection point is valid if: - // - distance is positive (else it can just be a face behind the orig point) - // - distance is smaller than a given max distance (useful for shadow feelers) -// if(mStabbedFace.mDistance>0.0f && mStabbedFace.mDistanceAddFace(mStabbedFace); -#endif - return TRUE; - } - } - } -#else - // New code - // We handle both Segment/ray queries with the same segment code, and a possible infinite limit - SEGMENT_PRIM(*face_id, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; -#endif - } - - // Precompute data (moved after temporal coherence since only needed for ray-AABB) - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) - { - // For Segment-AABB overlap - mData = 0.5f * mDir * mMaxDist; - mData2 = mOrigin + mData; - - // Precompute mFDir; - mFDir.x = fabsf(mData.x); - mFDir.y = fabsf(mData.y); - mFDir.z = fabsf(mData.z); - } - else - { - // For Ray-AABB overlap -// udword x = SIR(mDir.x)-1; -// udword y = SIR(mDir.y)-1; -// udword z = SIR(mDir.z)-1; -// mData.x = FR(x); -// mData.y = FR(y); -// mData.z = FR(z); - - // Precompute mFDir; - mFDir.x = fabsf(mDir.x); - mFDir.y = fabsf(mDir.y); - mFDir.z = fabsf(mDir.z); - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Stabbing query for vanilla AABB trees. - * \param world_ray [in] stabbing ray in world space - * \param tree [in] AABB tree - * \param box_indices [out] indices of stabbed boxes - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool RayCollider::Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices) -{ - // ### bad design here - - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - // Basically this is only called to initialize precomputed data - if(InitQuery(world_ray)) return true; - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(tree, box_indices); - else _RayStab(tree, box_indices); - - return true; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBCollisionNode* node) -{ - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->IsLeaf()) - { - SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - _SegmentStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - _SegmentStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBNoLeafNode* node) -{ - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->HasPosLeaf()) - { - SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(Center, Extents)) return; - - if(node->HasPosLeaf()) - { - SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for vanilla AABB trees. - * \param node [in] current collision node - * \param box_indices [out] indices of stabbed boxes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBTreeNode* node, Container& box_indices) -{ - // Test the box against the segment - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!SegmentAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _SegmentStab(node->GetPos(), box_indices); - _SegmentStab(node->GetNeg(), box_indices); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBCollisionNode* node) -{ - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->IsLeaf()) - { - RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _RayStab(node->GetPos()); - - if(ContactFound()) return; - - _RayStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _RayStab(node->GetPos()); - - if(ContactFound()) return; - - _RayStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBNoLeafNode* node) -{ - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->HasPosLeaf()) - { - RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(Center, Extents)) return; - - if(node->HasPosLeaf()) - { - RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for vanilla AABB trees. - * \param node [in] current collision node - * \param box_indices [out] indices of stabbed boxes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBTreeNode* node, Container& box_indices) -{ - // Test the box against the ray - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!RayAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - mFlags |= OPC_CONTACT; - box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _RayStab(node->GetPos(), box_indices); - _RayStab(node->GetNeg(), box_indices); - } -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a ray collider. + * \file OPC_RayCollider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a ray-vs-tree collider. + * This class performs a stabbing query on an AABB tree, i.e. does a ray-mesh collision. + * + * HIGHER DISTANCE BOUND: + * + * If P0 and P1 are two 3D points, let's define: + * - d = distance between P0 and P1 + * - Origin = P0 + * - Direction = (P1 - P0) / d = normalized direction vector + * - A parameter t such as a point P on the line (P0,P1) is P = Origin + t * Direction + * - t = 0 --> P = P0 + * - t = d --> P = P1 + * + * Then we can define a general "ray" as: + * + * struct Ray + * { + * Point Origin; + * Point Direction; + * }; + * + * But it actually maps three different things: + * - a segment, when 0 <= t <= d + * - a half-line, when 0 <= t < +infinity, or -infinity < t <= d + * - a line, when -infinity < t < +infinity + * + * In Opcode, we support segment queries, which yield half-line queries by setting d = +infinity. + * We don't support line-queries. If you need them, shift the origin along the ray by an appropriate margin. + * + * In short, the lower bound is always 0, and you can setup the higher bound "d" with RayCollider::SetMaxDist(). + * + * Query |segment |half-line |line + * --------|-------------------|---------------|---------------- + * Usages |-shadow feelers |-raytracing |- + * |-sweep tests |-in/out tests | + * + * FIRST CONTACT: + * + * - You can setup "first contact" mode or "all contacts" mode with RayCollider::SetFirstContact(). + * - In "first contact" mode we return as soon as the ray hits one face. If can be useful e.g. for shadow feelers, where + * you want to know whether the path to the light is free or not (a boolean answer is enough). + * - In "all contacts" mode we return all faces hit by the ray. + * + * TEMPORAL COHERENCE: + * + * - You can enable or disable temporal coherence with RayCollider::SetTemporalCoherence(). + * - It currently only works in "first contact" mode. + * - If temporal coherence is enabled, the previously hit triangle is cached during the first query. Then, next queries + * start by colliding the ray against the cached triangle. If they still collide, we return immediately. + * + * CLOSEST HIT: + * + * - You can enable or disable "closest hit" with RayCollider::SetClosestHit(). + * - It currently only works in "all contacts" mode. + * - If closest hit is enabled, faces are sorted by distance on-the-fly and the closest one only is reported. + * + * BACKFACE CULLING: + * + * - You can enable or disable backface culling with RayCollider::SetCulling(). + * - If culling is enabled, ray will not hit back faces (only front faces). + * + * + * + * \class RayCollider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * This class describes a face hit by a ray or segment. + * This is a particular class dedicated to stabbing queries. + * + * \class CollisionFace + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * This class is a dedicated collection of CollisionFace. + * + * \class CollisionFaces + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_RayAABBOverlap.h" +#include "OPC_RayTriOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + mNbIntersections++; \ + /* Set contact status */ \ + mFlags |= flag; \ + /* In any case the contact has been found and recorded in mStabbedFace */ \ + mStabbedFace.mFaceID = prim_index; + +#ifdef OPC_RAYHIT_CALLBACK + + #define HANDLE_CONTACT(prim_index, flag) \ + SET_CONTACT(prim_index, flag) \ + \ + if(mHitCallback) (mHitCallback)(mStabbedFace, mUserData); + + #define UPDATE_CACHE \ + if(cache && GetContactStatus()) \ + { \ + *cache = mStabbedFace.mFaceID; \ + } +#else + + #define HANDLE_CONTACT(prim_index, flag) \ + SET_CONTACT(prim_index, flag) \ + \ + /* Now we can also record it in mStabbedFaces if available */ \ + if(mStabbedFaces) \ + { \ + /* If we want all faces or if that's the first one we hit */ \ + if(!mClosestHit || !mStabbedFaces->GetNbFaces()) \ + { \ + mStabbedFaces->AddFace(mStabbedFace); \ + } \ + else \ + { \ + /* We only keep closest hit */ \ + CollisionFace* Current = const_cast(mStabbedFaces->GetFaces()); \ + if(Current && mStabbedFace.mDistancemDistance) \ + { \ + *Current = mStabbedFace; \ + } \ + } \ + } + + #define UPDATE_CACHE \ + if(cache && GetContactStatus() && mStabbedFaces) \ + { \ + const CollisionFace* Current = mStabbedFaces->GetFaces(); \ + if(Current) *cache = Current->mFaceID; \ + else *cache = INVALID_ID; \ + } +#endif + +#define SEGMENT_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + \ + /* Perform ray-tri overlap test and return */ \ + if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + /* Intersection point is valid if dist < segment's length */ \ + /* We know dist>0 so we can use integers */ \ + if(IR(mStabbedFace.mDistance)GetTriangle(VP, prim_index); \ + \ + /* Perform ray-tri overlap test and return */ \ + if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + HANDLE_CONTACT(prim_index, flag) \ + } + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RayCollider::RayCollider() : + mNbRayBVTests (0), + mNbRayPrimTests (0), + mNbIntersections (0), + mCulling (true), +#ifdef OPC_RAYHIT_CALLBACK + mHitCallback (null), + mUserData (0), +#else + mClosestHit (false), + mStabbedFaces (null), +#endif + mMaxDist (MAX_FLOAT) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RayCollider::~RayCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* RayCollider::ValidateSettings() +{ + if(mMaxDist<0.0f) return "Higher distance bound must be positive!"; + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; +#ifndef OPC_RAYHIT_CALLBACK + if(mClosestHit && FirstContactEnabled()) return "Closest hit doesn't work with ""First contact"" mode!"; + if(TemporalCoherenceEnabled() && mClosestHit) return "Temporal coherence can't guarantee to report closest hit!"; +#endif + if(SkipPrimitiveTests()) return "SkipPrimitiveTests not possible for RayCollider ! (not implemented)"; + return null; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic stabbing query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - in the user-provided destination array + * + * \param world_ray [in] stabbing ray in world space + * \param model [in] Opcode model to collide with + * \param world [in] model's world matrix, or null + * \param cache [in] a possibly cached face index, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool RayCollider::Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world, udword* cache) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(world_ray, world, cache)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + } + + // Update cache if needed + UPDATE_CACHE + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a stabbing query : + * - reset stats & contact status + * - compute ray in local space + * - check temporal coherence + * + * \param world_ray [in] stabbing ray in world space + * \param world [in] object's world matrix, or null + * \param face_id [in] index of previously stabbed triangle + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL RayCollider::InitQuery(const Ray& world_ray, const Matrix4x4* world, udword* face_id) +{ + // Reset stats & contact status + Collider::InitQuery(); + mNbRayBVTests = 0; + mNbRayPrimTests = 0; + mNbIntersections = 0; +#ifndef OPC_RAYHIT_CALLBACK + if(mStabbedFaces) mStabbedFaces->Reset(); +#endif + + // Compute ray in local space + // The (Origin/Dir) form is needed for the ray-triangle test anyway (even for segment tests) + if(world) + { + Matrix3x3 InvWorld = *world; + mDir = InvWorld * world_ray.mDir; + + Matrix4x4 World; + InvertPRMatrix(World, *world); + mOrigin = world_ray.mOrig * World; + } + else + { + mDir = world_ray.mDir; + mOrigin = world_ray.mOrig; + } + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + if(!SkipPrimitiveTests()) + { + // Perform overlap test between the unique triangle and the ray (and set contact status if needed) + SEGMENT_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // Check temporal coherence : + + // Test previously colliding primitives first + if(TemporalCoherenceEnabled() && FirstContactEnabled() && face_id && *face_id!=INVALID_ID) + { +#ifdef OLD_CODE +#ifndef OPC_RAYHIT_CALLBACK + if(!mClosestHit) +#endif + { + // Request vertices from the app + VertexPointers VP; + mIMesh->GetTriangle(VP, *face_id); + // Perform ray-cached tri overlap test + if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) + { + // Intersection point is valid if: + // - distance is positive (else it can just be a face behind the orig point) + // - distance is smaller than a given max distance (useful for shadow feelers) +// if(mStabbedFace.mDistance>0.0f && mStabbedFace.mDistanceAddFace(mStabbedFace); +#endif + return TRUE; + } + } + } +#else + // New code + // We handle both Segment/ray queries with the same segment code, and a possible infinite limit + SEGMENT_PRIM(*face_id, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; +#endif + } + + // Precompute data (moved after temporal coherence since only needed for ray-AABB) + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) + { + // For Segment-AABB overlap + mData = 0.5f * mDir * mMaxDist; + mData2 = mOrigin + mData; + + // Precompute mFDir; + mFDir.x = fabsf(mData.x); + mFDir.y = fabsf(mData.y); + mFDir.z = fabsf(mData.z); + } + else + { + // For Ray-AABB overlap +// udword x = SIR(mDir.x)-1; +// udword y = SIR(mDir.y)-1; +// udword z = SIR(mDir.z)-1; +// mData.x = FR(x); +// mData.y = FR(y); +// mData.z = FR(z); + + // Precompute mFDir; + mFDir.x = fabsf(mDir.x); + mFDir.y = fabsf(mDir.y); + mFDir.z = fabsf(mDir.z); + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Stabbing query for vanilla AABB trees. + * \param world_ray [in] stabbing ray in world space + * \param tree [in] AABB tree + * \param box_indices [out] indices of stabbed boxes + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool RayCollider::Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices) +{ + // ### bad design here + + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + // Basically this is only called to initialize precomputed data + if(InitQuery(world_ray)) return true; + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(tree, box_indices); + else _RayStab(tree, box_indices); + + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBCollisionNode* node) +{ + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->IsLeaf()) + { + SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + _SegmentStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + _SegmentStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBNoLeafNode* node) +{ + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->HasPosLeaf()) + { + SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(Center, Extents)) return; + + if(node->HasPosLeaf()) + { + SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for vanilla AABB trees. + * \param node [in] current collision node + * \param box_indices [out] indices of stabbed boxes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBTreeNode* node, Container& box_indices) +{ + // Test the box against the segment + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!SegmentAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _SegmentStab(node->GetPos(), box_indices); + _SegmentStab(node->GetNeg(), box_indices); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBCollisionNode* node) +{ + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->IsLeaf()) + { + RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _RayStab(node->GetPos()); + + if(ContactFound()) return; + + _RayStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _RayStab(node->GetPos()); + + if(ContactFound()) return; + + _RayStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBNoLeafNode* node) +{ + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->HasPosLeaf()) + { + RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(Center, Extents)) return; + + if(node->HasPosLeaf()) + { + RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for vanilla AABB trees. + * \param node [in] current collision node + * \param box_indices [out] indices of stabbed boxes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBTreeNode* node, Container& box_indices) +{ + // Test the box against the ray + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!RayAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + mFlags |= OPC_CONTACT; + box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _RayStab(node->GetPos(), box_indices); + _RayStab(node->GetNeg(), box_indices); + } +} diff --git a/Extras/CDTestFramework/Opcode/OPC_RayCollider.h b/Extras/CDTestFramework/Opcode/OPC_RayCollider.h index 9de1cf5a7..d347b18aa 100644 --- a/Extras/CDTestFramework/Opcode/OPC_RayCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_RayCollider.h @@ -1,234 +1,234 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a ray collider. - * \file OPC_RayCollider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_RAYCOLLIDER_H__ -#define __OPC_RAYCOLLIDER_H__ - - class OPCODE_API CollisionFace - { - public: - //! Constructor - inline_ CollisionFace() {} - //! Destructor - inline_ ~CollisionFace() {} - - udword mFaceID; //!< Index of touched face - float mDistance; //!< Distance from collider to hitpoint - float mU, mV; //!< Impact barycentric coordinates - }; - - class OPCODE_API CollisionFaces : private Container - { - public: - //! Constructor - CollisionFaces() {} - //! Destructor - ~CollisionFaces() {} - - inline_ udword GetNbFaces() const { return GetNbEntries()>>2; } - inline_ const CollisionFace* GetFaces() const { return (const CollisionFace*)GetEntries(); } - - inline_ void Reset() { Container::Reset(); } - - inline_ void AddFace(const CollisionFace& face) { Add(face.mFaceID).Add(face.mDistance).Add(face.mU).Add(face.mV); } - }; - -#ifdef OPC_RAYHIT_CALLBACK - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called by OPCODE to record a hit. - * \param hit [in] current hit - * \param user_data [in] user-defined data from SetCallback() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef void (*HitCallback) (const CollisionFace& hit, void* user_data); -#endif - - class OPCODE_API RayCollider : public Collider - { - public: - // Constructor / Destructor - RayCollider(); - virtual ~RayCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic stabbing query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - in the user-provided destination array - * - * \param world_ray [in] stabbing ray in world space - * \param model [in] Opcode model to collide with - * \param world [in] model's world matrix, or null - * \param cache [in] a possibly cached face index, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world=null, udword* cache=null); - // - bool Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices); - // Settings - -#ifndef OPC_RAYHIT_CALLBACK - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: enable or disable "closest hit" mode. - * \param flag [in] true to report closest hit only - * \see SetCulling(bool flag) - * \see SetMaxDist(float max_dist) - * \see SetDestination(StabbedFaces* sf) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetClosestHit(bool flag) { mClosestHit = flag; } -#endif - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: enable or disable backface culling. - * \param flag [in] true to enable backface culling - * \see SetClosestHit(bool flag) - * \see SetMaxDist(float max_dist) - * \see SetDestination(StabbedFaces* sf) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetCulling(bool flag) { mCulling = flag; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: sets the higher distance bound. - * \param max_dist [in] higher distance bound. Default = maximal value, for ray queries (else segment) - * \see SetClosestHit(bool flag) - * \see SetCulling(bool flag) - * \see SetDestination(StabbedFaces* sf) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetMaxDist(float max_dist=MAX_FLOAT) { mMaxDist = max_dist; } - -#ifdef OPC_RAYHIT_CALLBACK - inline_ void SetHitCallback(HitCallback cb) { mHitCallback = cb; } - inline_ void SetUserData(void* user_data) { mUserData = user_data; } -#else - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: sets the destination array for stabbed faces. - * \param cf [in] destination array, filled during queries - * \see SetClosestHit(bool flag) - * \see SetCulling(bool flag) - * \see SetMaxDist(float max_dist) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetDestination(CollisionFaces* cf) { mStabbedFaces = cf; } -#endif - // Stats - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Ray-BV overlap tests after a collision query. - * \see GetNbRayPrimTests() - * \see GetNbIntersections() - * \return the number of Ray-BV tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbRayBVTests() const { return mNbRayBVTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Ray-Triangle overlap tests after a collision query. - * \see GetNbRayBVTests() - * \see GetNbIntersections() - * \return the number of Ray-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbRayPrimTests() const { return mNbRayPrimTests; } - - // In-out test - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of intersection found after a collision query. Can be used for in/out tests. - * \see GetNbRayBVTests() - * \see GetNbRayPrimTests() - * \return the number of valid intersections during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbIntersections() const { return mNbIntersections; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Ray in local space - Point mOrigin; //!< Ray origin - Point mDir; //!< Ray direction (normalized) - Point mFDir; //!< fabsf(mDir) - Point mData, mData2; - // Stabbed faces - CollisionFace mStabbedFace; //!< Current stabbed face -#ifdef OPC_RAYHIT_CALLBACK - HitCallback mHitCallback; //!< Callback used to record a hit - void* mUserData; //!< User-defined data -#else - CollisionFaces* mStabbedFaces; //!< List of stabbed faces -#endif - // Stats - udword mNbRayBVTests; //!< Number of Ray-BV tests - udword mNbRayPrimTests; //!< Number of Ray-Primitive tests - // In-out test - udword mNbIntersections; //!< Number of valid intersections - // Dequantization coeffs - Point mCenterCoeff; - Point mExtentsCoeff; - // Settings - float mMaxDist; //!< Valid segment on the ray -#ifndef OPC_RAYHIT_CALLBACK - bool mClosestHit; //!< Report closest hit only -#endif - bool mCulling; //!< Stab culled faces or not - // Internal methods - void _SegmentStab(const AABBCollisionNode* node); - void _SegmentStab(const AABBNoLeafNode* node); - void _SegmentStab(const AABBQuantizedNode* node); - void _SegmentStab(const AABBQuantizedNoLeafNode* node); - void _SegmentStab(const AABBTreeNode* node, Container& box_indices); - void _RayStab(const AABBCollisionNode* node); - void _RayStab(const AABBNoLeafNode* node); - void _RayStab(const AABBQuantizedNode* node); - void _RayStab(const AABBQuantizedNoLeafNode* node); - void _RayStab(const AABBTreeNode* node, Container& box_indices); - // Overlap tests - inline_ BOOL RayAABBOverlap(const Point& center, const Point& extents); - inline_ BOOL SegmentAABBOverlap(const Point& center, const Point& extents); - inline_ BOOL RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); - // Init methods - BOOL InitQuery(const Ray& world_ray, const Matrix4x4* world=null, udword* face_id=null); - }; - -#endif // __OPC_RAYCOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a ray collider. + * \file OPC_RayCollider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_RAYCOLLIDER_H__ +#define __OPC_RAYCOLLIDER_H__ + + class OPCODE_API CollisionFace + { + public: + //! Constructor + inline_ CollisionFace() {} + //! Destructor + inline_ ~CollisionFace() {} + + udword mFaceID; //!< Index of touched face + float mDistance; //!< Distance from collider to hitpoint + float mU, mV; //!< Impact barycentric coordinates + }; + + class OPCODE_API CollisionFaces : private Container + { + public: + //! Constructor + CollisionFaces() {} + //! Destructor + ~CollisionFaces() {} + + inline_ udword GetNbFaces() const { return GetNbEntries()>>2; } + inline_ const CollisionFace* GetFaces() const { return (const CollisionFace*)GetEntries(); } + + inline_ void Reset() { Container::Reset(); } + + inline_ void AddFace(const CollisionFace& face) { Add(face.mFaceID).Add(face.mDistance).Add(face.mU).Add(face.mV); } + }; + +#ifdef OPC_RAYHIT_CALLBACK + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called by OPCODE to record a hit. + * \param hit [in] current hit + * \param user_data [in] user-defined data from SetCallback() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef void (*HitCallback) (const CollisionFace& hit, void* user_data); +#endif + + class OPCODE_API RayCollider : public Collider + { + public: + // Constructor / Destructor + RayCollider(); + virtual ~RayCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic stabbing query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - in the user-provided destination array + * + * \param world_ray [in] stabbing ray in world space + * \param model [in] Opcode model to collide with + * \param world [in] model's world matrix, or null + * \param cache [in] a possibly cached face index, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world=null, udword* cache=null); + // + bool Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices); + // Settings + +#ifndef OPC_RAYHIT_CALLBACK + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: enable or disable "closest hit" mode. + * \param flag [in] true to report closest hit only + * \see SetCulling(bool flag) + * \see SetMaxDist(float max_dist) + * \see SetDestination(StabbedFaces* sf) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetClosestHit(bool flag) { mClosestHit = flag; } +#endif + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: enable or disable backface culling. + * \param flag [in] true to enable backface culling + * \see SetClosestHit(bool flag) + * \see SetMaxDist(float max_dist) + * \see SetDestination(StabbedFaces* sf) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetCulling(bool flag) { mCulling = flag; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: sets the higher distance bound. + * \param max_dist [in] higher distance bound. Default = maximal value, for ray queries (else segment) + * \see SetClosestHit(bool flag) + * \see SetCulling(bool flag) + * \see SetDestination(StabbedFaces* sf) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetMaxDist(float max_dist=MAX_FLOAT) { mMaxDist = max_dist; } + +#ifdef OPC_RAYHIT_CALLBACK + inline_ void SetHitCallback(HitCallback cb) { mHitCallback = cb; } + inline_ void SetUserData(void* user_data) { mUserData = user_data; } +#else + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: sets the destination array for stabbed faces. + * \param cf [in] destination array, filled during queries + * \see SetClosestHit(bool flag) + * \see SetCulling(bool flag) + * \see SetMaxDist(float max_dist) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetDestination(CollisionFaces* cf) { mStabbedFaces = cf; } +#endif + // Stats + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Ray-BV overlap tests after a collision query. + * \see GetNbRayPrimTests() + * \see GetNbIntersections() + * \return the number of Ray-BV tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbRayBVTests() const { return mNbRayBVTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Ray-Triangle overlap tests after a collision query. + * \see GetNbRayBVTests() + * \see GetNbIntersections() + * \return the number of Ray-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbRayPrimTests() const { return mNbRayPrimTests; } + + // In-out test + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of intersection found after a collision query. Can be used for in/out tests. + * \see GetNbRayBVTests() + * \see GetNbRayPrimTests() + * \return the number of valid intersections during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbIntersections() const { return mNbIntersections; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Ray in local space + Point mOrigin; //!< Ray origin + Point mDir; //!< Ray direction (normalized) + Point mFDir; //!< fabsf(mDir) + Point mData, mData2; + // Stabbed faces + CollisionFace mStabbedFace; //!< Current stabbed face +#ifdef OPC_RAYHIT_CALLBACK + HitCallback mHitCallback; //!< Callback used to record a hit + void* mUserData; //!< User-defined data +#else + CollisionFaces* mStabbedFaces; //!< List of stabbed faces +#endif + // Stats + udword mNbRayBVTests; //!< Number of Ray-BV tests + udword mNbRayPrimTests; //!< Number of Ray-Primitive tests + // In-out test + udword mNbIntersections; //!< Number of valid intersections + // Dequantization coeffs + Point mCenterCoeff; + Point mExtentsCoeff; + // Settings + float mMaxDist; //!< Valid segment on the ray +#ifndef OPC_RAYHIT_CALLBACK + bool mClosestHit; //!< Report closest hit only +#endif + bool mCulling; //!< Stab culled faces or not + // Internal methods + void _SegmentStab(const AABBCollisionNode* node); + void _SegmentStab(const AABBNoLeafNode* node); + void _SegmentStab(const AABBQuantizedNode* node); + void _SegmentStab(const AABBQuantizedNoLeafNode* node); + void _SegmentStab(const AABBTreeNode* node, Container& box_indices); + void _RayStab(const AABBCollisionNode* node); + void _RayStab(const AABBNoLeafNode* node); + void _RayStab(const AABBQuantizedNode* node); + void _RayStab(const AABBQuantizedNoLeafNode* node); + void _RayStab(const AABBTreeNode* node, Container& box_indices); + // Overlap tests + inline_ BOOL RayAABBOverlap(const Point& center, const Point& extents); + inline_ BOOL SegmentAABBOverlap(const Point& center, const Point& extents); + inline_ BOOL RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); + // Init methods + BOOL InitQuery(const Ray& world_ray, const Matrix4x4* world=null, udword* face_id=null); + }; + +#endif // __OPC_RAYCOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h b/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h index 47c7a2169..11f212142 100644 --- a/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h @@ -1,106 +1,106 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -#define LOCAL_EPSILON 0.000001f - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a ray-triangle intersection test. - * Original code from Tomas Möller's "Fast Minimum Storage Ray-Triangle Intersection". - * It's been optimized a bit with integer code, and modified to return a non-intersection if distance from - * ray origin to triangle is negative. - * - * \param vert0 [in] triangle vertex - * \param vert1 [in] triangle vertex - * \param vert2 [in] triangle vertex - * \return true on overlap. mStabbedFace is filled with relevant info. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) -{ - // Stats - mNbRayPrimTests++; - - // Find vectors for two edges sharing vert0 - Point edge1 = vert1 - vert0; - Point edge2 = vert2 - vert0; - - // Begin calculating determinant - also used to calculate U parameter - Point pvec = mDir^edge2; - - // If determinant is near zero, ray lies in plane of triangle - float det = edge1|pvec; - - if(mCulling) - { - if(det 0. So we can use integer cmp. - - // Calculate distance from vert0 to ray origin - Point tvec = mOrigin - vert0; - - // Calculate U parameter and test bounds - mStabbedFace.mU = tvec|pvec; -// if(IR(u)&0x80000000 || u>det) return FALSE; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IR(det)) return FALSE; - - // Prepare to test V parameter - Point qvec = tvec^edge1; - - // Calculate V parameter and test bounds - mStabbedFace.mV = mDir|qvec; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>det) return FALSE; - - // Calculate t, scale parameters, ray intersects triangle - mStabbedFace.mDistance = edge2|qvec; - // Det > 0 so we can early exit here - // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) - if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; - // Else go on - float OneOverDet = 1.0f / det; - mStabbedFace.mDistance *= OneOverDet; - mStabbedFace.mU *= OneOverDet; - mStabbedFace.mV *= OneOverDet; - } - else - { - // the non-culling branch - if(det>-LOCAL_EPSILON && det1.0f) return FALSE; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IEEE_1_0) return FALSE; - - // prepare to test V parameter - Point qvec = tvec^edge1; - - // Calculate V parameter and test bounds - mStabbedFace.mV = (mDir|qvec) * OneOverDet; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>1.0f) return FALSE; - - // Calculate t, ray intersects triangle - mStabbedFace.mDistance = (edge2|qvec) * OneOverDet; - // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) - if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; - } - return TRUE; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +#define LOCAL_EPSILON 0.000001f + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a ray-triangle intersection test. + * Original code from Tomas Möller's "Fast Minimum Storage Ray-Triangle Intersection". + * It's been optimized a bit with integer code, and modified to return a non-intersection if distance from + * ray origin to triangle is negative. + * + * \param vert0 [in] triangle vertex + * \param vert1 [in] triangle vertex + * \param vert2 [in] triangle vertex + * \return true on overlap. mStabbedFace is filled with relevant info. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL RayCollider::RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) +{ + // Stats + mNbRayPrimTests++; + + // Find vectors for two edges sharing vert0 + Point edge1 = vert1 - vert0; + Point edge2 = vert2 - vert0; + + // Begin calculating determinant - also used to calculate U parameter + Point pvec = mDir^edge2; + + // If determinant is near zero, ray lies in plane of triangle + float det = edge1|pvec; + + if(mCulling) + { + if(det 0. So we can use integer cmp. + + // Calculate distance from vert0 to ray origin + Point tvec = mOrigin - vert0; + + // Calculate U parameter and test bounds + mStabbedFace.mU = tvec|pvec; +// if(IR(u)&0x80000000 || u>det) return FALSE; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IR(det)) return FALSE; + + // Prepare to test V parameter + Point qvec = tvec^edge1; + + // Calculate V parameter and test bounds + mStabbedFace.mV = mDir|qvec; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>det) return FALSE; + + // Calculate t, scale parameters, ray intersects triangle + mStabbedFace.mDistance = edge2|qvec; + // Det > 0 so we can early exit here + // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) + if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; + // Else go on + float OneOverDet = 1.0f / det; + mStabbedFace.mDistance *= OneOverDet; + mStabbedFace.mU *= OneOverDet; + mStabbedFace.mV *= OneOverDet; + } + else + { + // the non-culling branch + if(det>-LOCAL_EPSILON && det1.0f) return FALSE; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IEEE_1_0) return FALSE; + + // prepare to test V parameter + Point qvec = tvec^edge1; + + // Calculate V parameter and test bounds + mStabbedFace.mV = (mDir|qvec) * OneOverDet; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>1.0f) return FALSE; + + // Calculate t, ray intersects triangle + mStabbedFace.mDistance = (edge2|qvec) * OneOverDet; + // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) + if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; + } + return TRUE; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_Settings.h b/Extras/CDTestFramework/Opcode/OPC_Settings.h index 4ef029148..1074a0dc7 100644 --- a/Extras/CDTestFramework/Opcode/OPC_Settings.h +++ b/Extras/CDTestFramework/Opcode/OPC_Settings.h @@ -1,58 +1,58 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains compilation flags. - * \file OPC_Settings.h - * \author Pierre Terdiman - * \date May, 12, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_SETTINGS_H__ -#define __OPC_SETTINGS_H__ - - //! Use CPU comparisons (comment that line to use standard FPU compares) - #define OPC_CPU_COMPARE - - //! Use FCOMI / FCMOV on Pentium-Pro based processors (comment that line to use plain C++) - #define OPC_USE_FCOMI - - //! Use epsilon value in tri-tri overlap test - #define OPC_TRITRI_EPSILON_TEST - - //! Use tree-coherence or not [not implemented yet] -// #define OPC_USE_TREE_COHERENCE - - //! Use callbacks or direct pointers. Using callbacks might be a bit slower (but probably not much) -// #define OPC_USE_CALLBACKS - - //! Support triangle and vertex strides or not. Using strides might be a bit slower (but probably not much) -// #define OPC_USE_STRIDE - - //! Discard negative pointer in vanilla trees - #define OPC_NO_NEG_VANILLA_TREE - - //! Use a callback in the ray collider - #define OPC_RAYHIT_CALLBACK - - // NB: no compilation flag to enable/disable stats since they're actually needed in the box/box overlap test - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains compilation flags. + * \file OPC_Settings.h + * \author Pierre Terdiman + * \date May, 12, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_SETTINGS_H__ +#define __OPC_SETTINGS_H__ + + //! Use CPU comparisons (comment that line to use standard FPU compares) + #define OPC_CPU_COMPARE + + //! Use FCOMI / FCMOV on Pentium-Pro based processors (comment that line to use plain C++) + #define OPC_USE_FCOMI + + //! Use epsilon value in tri-tri overlap test + #define OPC_TRITRI_EPSILON_TEST + + //! Use tree-coherence or not [not implemented yet] +// #define OPC_USE_TREE_COHERENCE + + //! Use callbacks or direct pointers. Using callbacks might be a bit slower (but probably not much) +// #define OPC_USE_CALLBACKS + + //! Support triangle and vertex strides or not. Using strides might be a bit slower (but probably not much) +// #define OPC_USE_STRIDE + + //! Discard negative pointer in vanilla trees + #define OPC_NO_NEG_VANILLA_TREE + + //! Use a callback in the ray collider + #define OPC_RAYHIT_CALLBACK + + // NB: no compilation flag to enable/disable stats since they're actually needed in the box/box overlap test + #endif //__OPC_SETTINGS_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h b/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h index 4d0b6245b..acc97abd7 100644 --- a/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h @@ -1,145 +1,145 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Sphere-AABB overlap test, based on Jim Arvo's code. - * \param center [in] box center - * \param extents [in] box extents - * \return TRUE on overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL SphereCollider::SphereAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbVolumeBVTests++; - - float d = 0.0f; - - //find the square of the distance - //from the sphere to the box -#ifdef OLDIES - for(udword i=0;i<3;i++) - { - float tmp = mCenter[i] - center[i]; - float s = tmp + extents[i]; - - if(s<0.0f) d += s*s; - else - { - s = tmp - extents[i]; - if(s>0.0f) d += s*s; - } - } -#endif - -//#ifdef NEW_TEST - -// float tmp = mCenter.x - center.x; -// float s = tmp + extents.x; - - float tmp,s; - - tmp = mCenter.x - center.x; - s = tmp + extents.x; - - if(s<0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - else - { - s = tmp - extents.x; - if(s>0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - } - - tmp = mCenter.y - center.y; - s = tmp + extents.y; - - if(s<0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - else - { - s = tmp - extents.y; - if(s>0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - } - - tmp = mCenter.z - center.z; - s = tmp + extents.z; - - if(s<0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - else - { - s = tmp - extents.z; - if(s>0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - } -//#endif - -#ifdef OLDIES -// Point Min = center - extents; -// Point Max = center + extents; - - float d = 0.0f; - - //find the square of the distance - //from the sphere to the box - for(udword i=0;i<3;i++) - { -float Min = center[i] - extents[i]; - -// if(mCenter[i]Max[i]) - if(mCenter[i]>Max) - { - float s = mCenter[i] - Max; - d += s*s; - } - } - } -#endif - return d <= mRadius2; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Sphere-AABB overlap test, based on Jim Arvo's code. + * \param center [in] box center + * \param extents [in] box extents + * \return TRUE on overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL SphereCollider::SphereAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbVolumeBVTests++; + + float d = 0.0f; + + //find the square of the distance + //from the sphere to the box +#ifdef OLDIES + for(udword i=0;i<3;i++) + { + float tmp = mCenter[i] - center[i]; + float s = tmp + extents[i]; + + if(s<0.0f) d += s*s; + else + { + s = tmp - extents[i]; + if(s>0.0f) d += s*s; + } + } +#endif + +//#ifdef NEW_TEST + +// float tmp = mCenter.x - center.x; +// float s = tmp + extents.x; + + float tmp,s; + + tmp = mCenter.x - center.x; + s = tmp + extents.x; + + if(s<0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + else + { + s = tmp - extents.x; + if(s>0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + } + + tmp = mCenter.y - center.y; + s = tmp + extents.y; + + if(s<0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + else + { + s = tmp - extents.y; + if(s>0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + } + + tmp = mCenter.z - center.z; + s = tmp + extents.z; + + if(s<0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + else + { + s = tmp - extents.z; + if(s>0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + } +//#endif + +#ifdef OLDIES +// Point Min = center - extents; +// Point Max = center + extents; + + float d = 0.0f; + + //find the square of the distance + //from the sphere to the box + for(udword i=0;i<3;i++) + { +float Min = center[i] - extents[i]; + +// if(mCenter[i]Max[i]) + if(mCenter[i]>Max) + { + float s = mCenter[i] - Max; + d += s*s; + } + } + } +#endif + return d <= mRadius2; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp b/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp index 76dfb8894..485bd00da 100644 --- a/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp @@ -1,735 +1,735 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a sphere collider. - * \file OPC_SphereCollider.cpp - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a sphere-vs-tree collider. - * This class performs a collision test between a sphere and an AABB tree. You can use this to do a standard player vs world collision, - * in a Nettle/Telemachos way. It doesn't suffer from all reported bugs in those two classic codes - the "new" one by Paul Nettle is a - * debuggued version I think. Collision response can be driven by reported collision data - it works extremely well for me. In sake of - * efficiency, all meshes (that is, all AABB trees) should of course also be kept in an extra hierarchical structure (octree, whatever). - * - * \class SphereCollider - * \author Pierre Terdiman - * \version 1.3 - * \date June, 2, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_SphereAABBOverlap.h" -#include "OPC_SphereTriOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - /* Set contact status */ \ - mFlags |= flag; \ - mTouchedPrimitives->Add(prim_index); - -//! Sphere-triangle overlap test -#define SPHERE_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - \ - /* Perform sphere-tri overlap test */ \ - if(SphereTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SphereCollider::SphereCollider() -{ - mCenter.Zero(); - mRadius2 = 0.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SphereCollider::~SphereCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a sphere cache - * \param sphere [in] collision sphere in local space - * \param model [in] Opcode model to collide with - * \param worlds [in] sphere's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, sphere, worlds, worldm)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - check temporal coherence - * - * \param cache [in/out] a sphere cache - * \param sphere [in] sphere in local space - * \param worlds [in] sphere's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL SphereCollider::InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute sphere in model space: - // - Precompute R^2 - mRadius2 = sphere.mRadius * sphere.mRadius; - // - Compute center position - mCenter = sphere.mCenter; - // -> to world space - if(worlds) mCenter *= *worlds; - // -> to model space - if(worldm) - { - // Invert model matrix - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - - mCenter *= InvWorldM; - } - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the sphere (and set contact status if needed) - SPHERE_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence : - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the sphere (and set contact status if needed) - SPHERE_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // We're interested in all contacts =>test the new real sphere N(ew) against the previous fat sphere P(revious): - float r = sqrtf(cache.FatRadius2) - sphere.mRadius; - if(IsCacheValid(cache) && cache.Center.SquareDistance(mCenter) < r*r) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat sphere so that coherence will work for subsequent frames - mRadius2 *= cache.FatCoeff; -// mRadius2 = (sphere.mRadius * cache.FatCoeff)*(sphere.mRadius * cache.FatCoeff); - - // Update cache with query data (signature for cached faces) - cache.Center = mCenter; - cache.FatRadius2 = mRadius2; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for vanilla AABB trees. - * \param cache [in/out] a sphere cache - * \param sphere [in] collision sphere in world space - * \param tree [in] AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree) -{ - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - if(InitQuery(cache, sphere)) return true; - - // Perform collision query - _Collide(tree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the sphere completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the sphere contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL SphereCollider::SphereContainsBox(const Point& bc, const Point& be) -{ - // I assume if all 8 box vertices are inside the sphere, so does the whole box. - // Sounds ok but maybe there's a better way? - Point p; - p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z+be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z-be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - - return TRUE; -} - -#define TEST_BOX_IN_SPHERE(center, extents) \ - if(SphereContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->IsLeaf()) - { - SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for vanilla AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBTreeNode* node) -{ - // Perform Sphere-AABB overlap test - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!SphereAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf() || SphereContainsBox(Center, Extents)) - { - mFlags |= OPC_CONTACT; - mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _Collide(node->GetPos()); - _Collide(node->GetNeg()); - } -} - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridSphereCollider::HybridSphereCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridSphereCollider::~HybridSphereCollider() -{ -} - -bool HybridSphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, sphere, worlds, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - SPHERE_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - SPHERE_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a sphere collider. + * \file OPC_SphereCollider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a sphere-vs-tree collider. + * This class performs a collision test between a sphere and an AABB tree. You can use this to do a standard player vs world collision, + * in a Nettle/Telemachos way. It doesn't suffer from all reported bugs in those two classic codes - the "new" one by Paul Nettle is a + * debuggued version I think. Collision response can be driven by reported collision data - it works extremely well for me. In sake of + * efficiency, all meshes (that is, all AABB trees) should of course also be kept in an extra hierarchical structure (octree, whatever). + * + * \class SphereCollider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_SphereAABBOverlap.h" +#include "OPC_SphereTriOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! Sphere-triangle overlap test +#define SPHERE_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + \ + /* Perform sphere-tri overlap test */ \ + if(SphereTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SphereCollider::SphereCollider() +{ + mCenter.Zero(); + mRadius2 = 0.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SphereCollider::~SphereCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a sphere cache + * \param sphere [in] collision sphere in local space + * \param model [in] Opcode model to collide with + * \param worlds [in] sphere's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, sphere, worlds, worldm)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * - check temporal coherence + * + * \param cache [in/out] a sphere cache + * \param sphere [in] sphere in local space + * \param worlds [in] sphere's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL SphereCollider::InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute sphere in model space: + // - Precompute R^2 + mRadius2 = sphere.mRadius * sphere.mRadius; + // - Compute center position + mCenter = sphere.mCenter; + // -> to world space + if(worlds) mCenter *= *worlds; + // -> to model space + if(worldm) + { + // Invert model matrix + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + + mCenter *= InvWorldM; + } + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the sphere (and set contact status if needed) + SPHERE_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence : + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the sphere (and set contact status if needed) + SPHERE_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // We're interested in all contacts =>test the new real sphere N(ew) against the previous fat sphere P(revious): + float r = sqrtf(cache.FatRadius2) - sphere.mRadius; + if(IsCacheValid(cache) && cache.Center.SquareDistance(mCenter) < r*r) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat sphere so that coherence will work for subsequent frames + mRadius2 *= cache.FatCoeff; +// mRadius2 = (sphere.mRadius * cache.FatCoeff)*(sphere.mRadius * cache.FatCoeff); + + // Update cache with query data (signature for cached faces) + cache.Center = mCenter; + cache.FatRadius2 = mRadius2; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for vanilla AABB trees. + * \param cache [in/out] a sphere cache + * \param sphere [in] collision sphere in world space + * \param tree [in] AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree) +{ + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + if(InitQuery(cache, sphere)) return true; + + // Perform collision query + _Collide(tree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the sphere completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the sphere contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL SphereCollider::SphereContainsBox(const Point& bc, const Point& be) +{ + // I assume if all 8 box vertices are inside the sphere, so does the whole box. + // Sounds ok but maybe there's a better way? + Point p; + p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z+be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z-be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + + return TRUE; +} + +#define TEST_BOX_IN_SPHERE(center, extents) \ + if(SphereContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->IsLeaf()) + { + SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for vanilla AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBTreeNode* node) +{ + // Perform Sphere-AABB overlap test + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!SphereAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf() || SphereContainsBox(Center, Extents)) + { + mFlags |= OPC_CONTACT; + mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _Collide(node->GetPos()); + _Collide(node->GetNeg()); + } +} + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridSphereCollider::HybridSphereCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridSphereCollider::~HybridSphereCollider() +{ +} + +bool HybridSphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, sphere, worlds, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + SPHERE_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + SPHERE_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h b/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h index c8eb7163e..d4aa861e7 100644 --- a/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h @@ -1,105 +1,105 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a sphere collider. - * \file OPC_SphereCollider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_SPHERECOLLIDER_H__ -#define __OPC_SPHERECOLLIDER_H__ - - struct OPCODE_API SphereCache : VolumeCache - { - SphereCache() : Center(0.0f,0.0f,0.0f), FatRadius2(0.0f), FatCoeff(1.1f) {} - ~SphereCache() {} - - // Cached faces signature - Point Center; //!< Sphere used when performing the query resulting in cached faces - float FatRadius2; //!< Sphere used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere - }; - - class OPCODE_API SphereCollider : public VolumeCollider - { - public: - // Constructor / Destructor - SphereCollider(); - virtual ~SphereCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a sphere cache - * \param sphere [in] collision sphere in local space - * \param model [in] Opcode model to collide with - * \param worlds [in] sphere's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); - - // - bool Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree); - protected: - // Sphere in model space - Point mCenter; //!< Sphere center - float mRadius2; //!< Sphere radius squared - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _Collide(const AABBTreeNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL SphereContainsBox(const Point& bc, const Point& be); - inline_ BOOL SphereAABBOverlap(const Point& center, const Point& extents); - BOOL SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); - // Init methods - BOOL InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); - }; - - class OPCODE_API HybridSphereCollider : public SphereCollider - { - public: - // Constructor / Destructor - HybridSphereCollider(); - virtual ~HybridSphereCollider(); - - bool Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_SPHERECOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a sphere collider. + * \file OPC_SphereCollider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_SPHERECOLLIDER_H__ +#define __OPC_SPHERECOLLIDER_H__ + + struct OPCODE_API SphereCache : VolumeCache + { + SphereCache() : Center(0.0f,0.0f,0.0f), FatRadius2(0.0f), FatCoeff(1.1f) {} + ~SphereCache() {} + + // Cached faces signature + Point Center; //!< Sphere used when performing the query resulting in cached faces + float FatRadius2; //!< Sphere used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere + }; + + class OPCODE_API SphereCollider : public VolumeCollider + { + public: + // Constructor / Destructor + SphereCollider(); + virtual ~SphereCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a sphere cache + * \param sphere [in] collision sphere in local space + * \param model [in] Opcode model to collide with + * \param worlds [in] sphere's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); + + // + bool Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree); + protected: + // Sphere in model space + Point mCenter; //!< Sphere center + float mRadius2; //!< Sphere radius squared + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _Collide(const AABBTreeNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL SphereContainsBox(const Point& bc, const Point& be); + inline_ BOOL SphereAABBOverlap(const Point& center, const Point& extents); + BOOL SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); + // Init methods + BOOL InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); + }; + + class OPCODE_API HybridSphereCollider : public SphereCollider + { + public: + // Constructor / Destructor + HybridSphereCollider(); + virtual ~HybridSphereCollider(); + + bool Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_SPHERECOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h b/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h index 5dfe89b03..4542e5118 100644 --- a/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h @@ -1,203 +1,203 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -// This is collision detection. If you do another distance test for collision *response*, -// if might be useful to simply *skip* the test below completely, and report a collision. -// - if sphere-triangle overlap, result is ok -// - if they don't, we'll discard them during collision response with a similar test anyway -// Overall this approach should run faster. - -// Original code by David Eberly in Magic. -BOOL SphereCollider::SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) -{ - // Stats - mNbVolumePrimTests++; - - // Early exit if one of the vertices is inside the sphere - Point kDiff = vert2 - mCenter; - float fC = kDiff.SquareMagnitude(); - if(fC <= mRadius2) return TRUE; - - kDiff = vert1 - mCenter; - fC = kDiff.SquareMagnitude(); - if(fC <= mRadius2) return TRUE; - - kDiff = vert0 - mCenter; - fC = kDiff.SquareMagnitude(); - if(fC <= mRadius2) return TRUE; - - // Else do the full distance test - Point TriEdge0 = vert1 - vert0; - Point TriEdge1 = vert2 - vert0; - -//Point kDiff = vert0 - mCenter; - float fA00 = TriEdge0.SquareMagnitude(); - float fA01 = TriEdge0 | TriEdge1; - float fA11 = TriEdge1.SquareMagnitude(); - float fB0 = kDiff | TriEdge0; - float fB1 = kDiff | TriEdge1; -//float fC = kDiff.SquareMagnitude(); - float fDet = fabsf(fA00*fA11 - fA01*fA01); - float u = fA01*fB1-fA11*fB0; - float v = fA01*fB0-fA00*fB1; - float SqrDist; - - if(u + v <= fDet) - { - if(u < 0.0f) - { - if(v < 0.0f) // region 4 - { - if(fB0 < 0.0f) - { -// v = 0.0f; - if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } - else { u = -fB0/fA00; SqrDist = fB0*u+fC; } - } - else - { -// u = 0.0f; - if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } - else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } - else { v = -fB1/fA11; SqrDist = fB1*v+fC; } - } - } - else // region 3 - { -// u = 0.0f; - if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } - else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } - else { v = -fB1/fA11; SqrDist = fB1*v+fC; } - } - } - else if(v < 0.0f) // region 5 - { -// v = 0.0f; - if(fB0>=0.0f) { /*u = 0.0f;*/ SqrDist = fC; } - else if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } - else { u = -fB0/fA00; SqrDist = fB0*u+fC; } - } - else // region 0 - { - // minimum at interior point - if(fDet==0.0f) - { -// u = 0.0f; -// v = 0.0f; - SqrDist = MAX_FLOAT; - } - else - { - float fInvDet = 1.0f/fDet; - u *= fInvDet; - v *= fInvDet; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - } - else - { - float fTmp0, fTmp1, fNumer, fDenom; - - if(u < 0.0f) // region 2 - { - fTmp0 = fA01 + fB0; - fTmp1 = fA11 + fB1; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { -// u = 1.0f; -// v = 0.0f; - SqrDist = fA00+2.0f*fB0+fC; - } - else - { - u = fNumer/fDenom; - v = 1.0f - u; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - else - { -// u = 0.0f; - if(fTmp1 <= 0.0f) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } - else if(fB1 >= 0.0f) { /*v = 0.0f;*/ SqrDist = fC; } - else { v = -fB1/fA11; SqrDist = fB1*v+fC; } - } - } - else if(v < 0.0f) // region 6 - { - fTmp0 = fA01 + fB1; - fTmp1 = fA00 + fB0; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { -// v = 1.0f; -// u = 0.0f; - SqrDist = fA11+2.0f*fB1+fC; - } - else - { - v = fNumer/fDenom; - u = 1.0f - v; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - else - { -// v = 0.0f; - if(fTmp1 <= 0.0f) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } - else if(fB0 >= 0.0f) { /*u = 0.0f;*/ SqrDist = fC; } - else { u = -fB0/fA00; SqrDist = fB0*u+fC; } - } - } - else // region 1 - { - fNumer = fA11 + fB1 - fA01 - fB0; - if(fNumer <= 0.0f) - { -// u = 0.0f; -// v = 1.0f; - SqrDist = fA11+2.0f*fB1+fC; - } - else - { - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { -// u = 1.0f; -// v = 0.0f; - SqrDist = fA00+2.0f*fB0+fC; - } - else - { - u = fNumer/fDenom; - v = 1.0f - u; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - } - } - - return fabsf(SqrDist) < mRadius2; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +// This is collision detection. If you do another distance test for collision *response*, +// if might be useful to simply *skip* the test below completely, and report a collision. +// - if sphere-triangle overlap, result is ok +// - if they don't, we'll discard them during collision response with a similar test anyway +// Overall this approach should run faster. + +// Original code by David Eberly in Magic. +BOOL SphereCollider::SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) +{ + // Stats + mNbVolumePrimTests++; + + // Early exit if one of the vertices is inside the sphere + Point kDiff = vert2 - mCenter; + float fC = kDiff.SquareMagnitude(); + if(fC <= mRadius2) return TRUE; + + kDiff = vert1 - mCenter; + fC = kDiff.SquareMagnitude(); + if(fC <= mRadius2) return TRUE; + + kDiff = vert0 - mCenter; + fC = kDiff.SquareMagnitude(); + if(fC <= mRadius2) return TRUE; + + // Else do the full distance test + Point TriEdge0 = vert1 - vert0; + Point TriEdge1 = vert2 - vert0; + +//Point kDiff = vert0 - mCenter; + float fA00 = TriEdge0.SquareMagnitude(); + float fA01 = TriEdge0 | TriEdge1; + float fA11 = TriEdge1.SquareMagnitude(); + float fB0 = kDiff | TriEdge0; + float fB1 = kDiff | TriEdge1; +//float fC = kDiff.SquareMagnitude(); + float fDet = fabsf(fA00*fA11 - fA01*fA01); + float u = fA01*fB1-fA11*fB0; + float v = fA01*fB0-fA00*fB1; + float SqrDist; + + if(u + v <= fDet) + { + if(u < 0.0f) + { + if(v < 0.0f) // region 4 + { + if(fB0 < 0.0f) + { +// v = 0.0f; + if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } + else { u = -fB0/fA00; SqrDist = fB0*u+fC; } + } + else + { +// u = 0.0f; + if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } + else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } + else { v = -fB1/fA11; SqrDist = fB1*v+fC; } + } + } + else // region 3 + { +// u = 0.0f; + if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } + else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } + else { v = -fB1/fA11; SqrDist = fB1*v+fC; } + } + } + else if(v < 0.0f) // region 5 + { +// v = 0.0f; + if(fB0>=0.0f) { /*u = 0.0f;*/ SqrDist = fC; } + else if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } + else { u = -fB0/fA00; SqrDist = fB0*u+fC; } + } + else // region 0 + { + // minimum at interior point + if(fDet==0.0f) + { +// u = 0.0f; +// v = 0.0f; + SqrDist = MAX_FLOAT; + } + else + { + float fInvDet = 1.0f/fDet; + u *= fInvDet; + v *= fInvDet; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + } + else + { + float fTmp0, fTmp1, fNumer, fDenom; + + if(u < 0.0f) // region 2 + { + fTmp0 = fA01 + fB0; + fTmp1 = fA11 + fB1; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { +// u = 1.0f; +// v = 0.0f; + SqrDist = fA00+2.0f*fB0+fC; + } + else + { + u = fNumer/fDenom; + v = 1.0f - u; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + else + { +// u = 0.0f; + if(fTmp1 <= 0.0f) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } + else if(fB1 >= 0.0f) { /*v = 0.0f;*/ SqrDist = fC; } + else { v = -fB1/fA11; SqrDist = fB1*v+fC; } + } + } + else if(v < 0.0f) // region 6 + { + fTmp0 = fA01 + fB1; + fTmp1 = fA00 + fB0; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { +// v = 1.0f; +// u = 0.0f; + SqrDist = fA11+2.0f*fB1+fC; + } + else + { + v = fNumer/fDenom; + u = 1.0f - v; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + else + { +// v = 0.0f; + if(fTmp1 <= 0.0f) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } + else if(fB0 >= 0.0f) { /*u = 0.0f;*/ SqrDist = fC; } + else { u = -fB0/fA00; SqrDist = fB0*u+fC; } + } + } + else // region 1 + { + fNumer = fA11 + fB1 - fA01 - fB0; + if(fNumer <= 0.0f) + { +// u = 0.0f; +// v = 1.0f; + SqrDist = fA11+2.0f*fB1+fC; + } + else + { + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { +// u = 1.0f; +// v = 0.0f; + SqrDist = fA00+2.0f*fB0+fC; + } + else + { + u = fNumer/fDenom; + v = 1.0f - u; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + } + } + + return fabsf(SqrDist) < mRadius2; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp b/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp index ff7302f1c..892807685 100644 --- a/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp @@ -1,673 +1,673 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) - * \file OPC_SweepAndPrune.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -inline_ void Sort(udword& id0, udword& id1) -{ - if(id0>id1) Swap(id0, id1); -} - - class Opcode::SAP_Element - { - public: - inline_ SAP_Element() {} - inline_ SAP_Element(udword id, SAP_Element* next) : mID(id), mNext(next) {} - inline_ ~SAP_Element() {} - - udword mID; - SAP_Element* mNext; - }; - - class Opcode::SAP_Box - { - public: - SAP_EndPoint* Min[3]; - SAP_EndPoint* Max[3]; - }; - - class Opcode::SAP_EndPoint - { - public: - float Value; // Min or Max value - SAP_EndPoint* Previous; // Previous EndPoint whose Value is smaller than ours (or null) - SAP_EndPoint* Next; // Next EndPoint whose Value is greater than ours (or null) - udword Data; // Parent box ID *2 | MinMax flag - - inline_ void SetData(udword box_id, BOOL is_max) { Data = (box_id<<1)|is_max; } - inline_ BOOL IsMax() const { return Data & 1; } - inline_ udword GetBoxID() const { return Data>>1; } - - inline_ void InsertAfter(SAP_EndPoint* element) - { - if(this!=element && this!=element->Next) - { - // Remove - if(Previous) Previous->Next = Next; - if(Next) Next->Previous = Previous; - - // Insert - Next = element->Next; - if(Next) Next->Previous = this; - - element->Next = this; - Previous = element; - } - } - - inline_ void InsertBefore(SAP_EndPoint* element) - { - if(this!=element && this!=element->Previous) - { - // Remove - if(Previous) Previous->Next = Next; - if(Next) Next->Previous = Previous; - - // Insert - Previous = element->Previous; - element->Previous = this; - - Next = element; - if(Previous) Previous->Next = this; - } - } - }; - - - - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SAP_PairData::SAP_PairData() : - mNbElements (0), - mNbUsedElements (0), - mElementPool (null), - mFirstFree (null), - mNbObjects (0), - mArray (null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SAP_PairData::~SAP_PairData() -{ - Release(); -} - -void SAP_PairData::Release() -{ - mNbElements = 0; - mNbUsedElements = 0; - mNbObjects = 0; - DELETEARRAY(mElementPool); - DELETEARRAY(mArray); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes. - * \param nb_objects [in] - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool SAP_PairData::Init(udword nb_objects) -{ - // Make sure everything has been released - Release(); - if(!nb_objects) return false; - - mArray = new SAP_Element*[nb_objects]; - CHECKALLOC(mArray); - ZeroMemory(mArray, nb_objects*sizeof(SAP_Element*)); - mNbObjects = nb_objects; - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Remaps a pointer when pool gets resized. - * \param element [in/out] remapped element - * \param delta [in] offset in bytes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void Remap(SAP_Element*& element, udword delta) -{ - if(element) element = (SAP_Element*)(udword(element) + delta); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets a free element in the pool. - * \param id [in] element id - * \param next [in] next element - * \param remap [out] possible remapping offset - * \return the new element - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SAP_Element* SAP_PairData::GetFreeElem(udword id, SAP_Element* next, udword* remap) -{ - if(remap) *remap = 0; - - SAP_Element* FreeElem; - if(mFirstFree) - { - // Recycle - FreeElem = mFirstFree; - mFirstFree = mFirstFree->mNext; // First free = next free (or null) - } - else - { - if(mNbUsedElements==mNbElements) - { - // Resize - mNbElements = mNbElements ? (mNbElements<<1) : 2; - - SAP_Element* NewElems = new SAP_Element[mNbElements]; - - if(mNbUsedElements) CopyMemory(NewElems, mElementPool, mNbUsedElements*sizeof(SAP_Element)); - - // Remap everything - { - udword Delta = udword(NewElems) - udword(mElementPool); - - for(udword i=0;imID = id; - FreeElem->mNext = next; - - return FreeElem; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Frees an element of the pool. - * \param elem [in] element to free/recycle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void SAP_PairData::FreeElem(SAP_Element* elem) -{ - elem->mNext = mFirstFree; // Next free - mFirstFree = elem; -} - -// Add a pair to the set. -void SAP_PairData::AddPair(udword id1, udword id2) -{ - // Order the ids - Sort(id1, id2); - - ASSERT(id1=mNbObjects) return; - - // Select the right list from "mArray". - SAP_Element* Current = mArray[id1]; - - if(!Current) - { - // Empty slot => create new element - mArray[id1] = GetFreeElem(id2, null); - } - else if(Current->mID>id2) - { - // The list is not empty but all elements are greater than id2 => insert id2 in the front. - mArray[id1] = GetFreeElem(id2, mArray[id1]); - } - else - { - // Else find the correct location in the sorted list (ascending order) and insert id2 there. - while(Current->mNext) - { - if(Current->mNext->mID > id2) break; - - Current = Current->mNext; - } - - if(Current->mID==id2) return; // The pair already exists - -// Current->mNext = GetFreeElem(id2, Current->mNext); - udword Delta; - SAP_Element* E = GetFreeElem(id2, Current->mNext, &Delta); - if(Delta) Remap(Current, Delta); - Current->mNext = E; - } -} - -// Delete a pair from the set. -void SAP_PairData::RemovePair(udword id1, udword id2) -{ - // Order the ids. - Sort(id1, id2); - - // Exit if the pair doesn't exist in the set - if(id1>=mNbObjects) return; - - // Otherwise, select the correct list. - SAP_Element* Current = mArray[id1]; - - // If this list is empty, the pair doesn't exist. - if(!Current) return; - - // Otherwise, if id2 is the first element, delete it. - if(Current->mID==id2) - { - mArray[id1] = Current->mNext; - FreeElem(Current); - } - else - { - // If id2 is not the first element, start traversing the sorted list. - while(Current->mNext) - { - // If we have moved too far away without hitting id2, then the pair doesn't exist - if(Current->mNext->mID > id2) return; - - // Otherwise, delete id2. - if(Current->mNext->mID == id2) - { - SAP_Element* Temp = Current->mNext; - Current->mNext = Temp->mNext; - FreeElem(Temp); - return; - } - Current = Current->mNext; - } - } -} - -void SAP_PairData::DumpPairs(Pairs& pairs) const -{ - // ### Ugly and slow - for(udword i=0;imIDmID); - Current = Current->mNext; - } - } -} - -void SAP_PairData::DumpPairs(PairCallback callback, void* user_data) const -{ - if(!callback) return; - - // ### Ugly and slow - for(udword i=0;imIDmID, user_data)) return; - Current = Current->mNext; - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SweepAndPrune::SweepAndPrune() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SweepAndPrune::~SweepAndPrune() -{ -} - -void SweepAndPrune::GetPairs(Pairs& pairs) const -{ - mPairs.DumpPairs(pairs); -} - -void SweepAndPrune::GetPairs(PairCallback callback, void* user_data) const -{ - mPairs.DumpPairs(callback, user_data); -} - -bool SweepAndPrune::Init(udword nb_objects, const AABB** boxes) -{ - // 1) Create sorted lists - mNbObjects = nb_objects; - - mBoxes = new SAP_Box[nb_objects]; -// for(udword i=0;iGetMin(Axis); - Data[i*2+1] = boxes[i]->GetMax(Axis); - } - RadixSort RS; - const udword* Sorted = RS.Sort(Data, nb_objects*2).GetRanks(); - - SAP_EndPoint* PreviousEndPoint = null; - - for(udword i=0;i>1; - - ASSERT(BoxIndexValue = SortedCoord; -// CurrentEndPoint->IsMax = SortedIndex&1; // ### could be implicit ? -// CurrentEndPoint->ID = BoxIndex; // ### could be implicit ? - CurrentEndPoint->SetData(BoxIndex, SortedIndex&1); // ### could be implicit ? - CurrentEndPoint->Previous = PreviousEndPoint; - CurrentEndPoint->Next = null; - if(PreviousEndPoint) PreviousEndPoint->Next = CurrentEndPoint; - - if(CurrentEndPoint->IsMax()) mBoxes[BoxIndex].Max[Axis] = CurrentEndPoint; - else mBoxes[BoxIndex].Min[Axis] = CurrentEndPoint; - - PreviousEndPoint = CurrentEndPoint; - } - } - - DELETEARRAY(Data); - - CheckListsIntegrity(); - - // 2) Quickly find starting pairs - - mPairs.Init(nb_objects); - - { - Pairs P; - CompleteBoxPruning(nb_objects, boxes, P, Axes(AXES_XZY)); - for(udword i=0;iid0; - udword id1 = PP->id1; - - if(id0!=id1 && boxes[id0]->Intersect(*boxes[id1])) - { - mPairs.AddPair(id0, id1); - } - else ASSERT(0); - } - } - - return true; -} - -bool SweepAndPrune::CheckListsIntegrity() -{ - for(udword Axis=0;Axis<3;Axis++) - { - // Find list head - SAP_EndPoint* Current = mList[Axis]; - while(Current->Previous) Current = Current->Previous; - - udword Nb = 0; - - SAP_EndPoint* Previous = null; - while(Current) - { - Nb++; - - if(Previous) - { - ASSERT(Previous->Value <= Current->Value); - if(Previous->Value > Current->Value) return false; - } - - ASSERT(Current->Previous==Previous); - if(Current->Previous!=Previous) return false; - - Previous = Current; - Current = Current->Next; - } - - ASSERT(Nb==mNbObjects*2); - } - return true; -} - -inline_ BOOL Intersect(const AABB& a, const SAP_Box& b) -{ - if(b.Max[0]->Value < a.GetMin(0) || a.GetMax(0) < b.Min[0]->Value - || b.Max[1]->Value < a.GetMin(1) || a.GetMax(1) < b.Min[1]->Value - || b.Max[2]->Value < a.GetMin(2) || a.GetMax(2) < b.Min[2]->Value) return FALSE; - - return TRUE; -} - - - -bool SweepAndPrune::UpdateObject(udword i, const AABB& box) -{ - for(udword Axis=0;Axis<3;Axis++) - { -// udword Base = (udword)&mList[Axis][0]; - - // Update min - { - SAP_EndPoint* const CurrentMin = mBoxes[i].Min[Axis]; - ASSERT(!CurrentMin->IsMax()); - - const float Limit = box.GetMin(Axis); - if(Limit == CurrentMin->Value) - { - } - else if(Limit < CurrentMin->Value) - { - CurrentMin->Value = Limit; - - // Min is moving left: - SAP_EndPoint* NewPos = CurrentMin; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Previous) && tmp->Value > Limit) - { - NewPos = tmp; - - if(NewPos->IsMax()) - { - // Our min passed a max => start overlap - //udword SortedIndex = (udword(CurrentMin) - Base)/sizeof(NS_EndPoint); - const udword id0 = CurrentMin->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); - } - } - - CurrentMin->InsertBefore(NewPos); - } - else// if(Limit > CurrentMin->Value) - { - CurrentMin->Value = Limit; - - // Min is moving right: - SAP_EndPoint* NewPos = CurrentMin; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Next) && tmp->Value < Limit) - { - NewPos = tmp; - - if(NewPos->IsMax()) - { - // Our min passed a max => stop overlap - const udword id0 = CurrentMin->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1) mPairs.RemovePair(id0, id1); - } - } - - CurrentMin->InsertAfter(NewPos); - } - } - - // Update max - { - SAP_EndPoint* const CurrentMax = mBoxes[i].Max[Axis]; - ASSERT(CurrentMax->IsMax()); - - const float Limit = box.GetMax(Axis); - if(Limit == CurrentMax->Value) - { - } - else if(Limit > CurrentMax->Value) - { - CurrentMax->Value = Limit; - - // Max is moving right: - SAP_EndPoint* NewPos = CurrentMax; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Next) && tmp->Value < Limit) - { - NewPos = tmp; - - if(!NewPos->IsMax()) - { - // Our max passed a min => start overlap - const udword id0 = CurrentMax->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); - } - } - - CurrentMax->InsertAfter(NewPos); - } - else// if(Limit < CurrentMax->Value) - { - CurrentMax->Value = Limit; - - // Max is moving left: - SAP_EndPoint* NewPos = CurrentMax; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Previous) && tmp->Value > Limit) - { - NewPos = tmp; - - if(!NewPos->IsMax()) - { - // Our max passed a min => stop overlap - const udword id0 = CurrentMax->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1) mPairs.RemovePair(id0, id1); - } - } - - CurrentMax->InsertBefore(NewPos); - } - } - } - - return true; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) + * \file OPC_SweepAndPrune.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +inline_ void Sort(udword& id0, udword& id1) +{ + if(id0>id1) Swap(id0, id1); +} + + class Opcode::SAP_Element + { + public: + inline_ SAP_Element() {} + inline_ SAP_Element(udword id, SAP_Element* next) : mID(id), mNext(next) {} + inline_ ~SAP_Element() {} + + udword mID; + SAP_Element* mNext; + }; + + class Opcode::SAP_Box + { + public: + SAP_EndPoint* Min[3]; + SAP_EndPoint* Max[3]; + }; + + class Opcode::SAP_EndPoint + { + public: + float Value; // Min or Max value + SAP_EndPoint* Previous; // Previous EndPoint whose Value is smaller than ours (or null) + SAP_EndPoint* Next; // Next EndPoint whose Value is greater than ours (or null) + udword Data; // Parent box ID *2 | MinMax flag + + inline_ void SetData(udword box_id, BOOL is_max) { Data = (box_id<<1)|is_max; } + inline_ BOOL IsMax() const { return Data & 1; } + inline_ udword GetBoxID() const { return Data>>1; } + + inline_ void InsertAfter(SAP_EndPoint* element) + { + if(this!=element && this!=element->Next) + { + // Remove + if(Previous) Previous->Next = Next; + if(Next) Next->Previous = Previous; + + // Insert + Next = element->Next; + if(Next) Next->Previous = this; + + element->Next = this; + Previous = element; + } + } + + inline_ void InsertBefore(SAP_EndPoint* element) + { + if(this!=element && this!=element->Previous) + { + // Remove + if(Previous) Previous->Next = Next; + if(Next) Next->Previous = Previous; + + // Insert + Previous = element->Previous; + element->Previous = this; + + Next = element; + if(Previous) Previous->Next = this; + } + } + }; + + + + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SAP_PairData::SAP_PairData() : + mNbElements (0), + mNbUsedElements (0), + mElementPool (null), + mFirstFree (null), + mNbObjects (0), + mArray (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SAP_PairData::~SAP_PairData() +{ + Release(); +} + +void SAP_PairData::Release() +{ + mNbElements = 0; + mNbUsedElements = 0; + mNbObjects = 0; + DELETEARRAY(mElementPool); + DELETEARRAY(mArray); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes. + * \param nb_objects [in] + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool SAP_PairData::Init(udword nb_objects) +{ + // Make sure everything has been released + Release(); + if(!nb_objects) return false; + + mArray = new SAP_Element*[nb_objects]; + CHECKALLOC(mArray); + ZeroMemory(mArray, nb_objects*sizeof(SAP_Element*)); + mNbObjects = nb_objects; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Remaps a pointer when pool gets resized. + * \param element [in/out] remapped element + * \param delta [in] offset in bytes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void Remap(SAP_Element*& element, udword delta) +{ + if(element) element = (SAP_Element*)(udword(element) + delta); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets a free element in the pool. + * \param id [in] element id + * \param next [in] next element + * \param remap [out] possible remapping offset + * \return the new element + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SAP_Element* SAP_PairData::GetFreeElem(udword id, SAP_Element* next, udword* remap) +{ + if(remap) *remap = 0; + + SAP_Element* FreeElem; + if(mFirstFree) + { + // Recycle + FreeElem = mFirstFree; + mFirstFree = mFirstFree->mNext; // First free = next free (or null) + } + else + { + if(mNbUsedElements==mNbElements) + { + // Resize + mNbElements = mNbElements ? (mNbElements<<1) : 2; + + SAP_Element* NewElems = new SAP_Element[mNbElements]; + + if(mNbUsedElements) CopyMemory(NewElems, mElementPool, mNbUsedElements*sizeof(SAP_Element)); + + // Remap everything + { + udword Delta = udword(NewElems) - udword(mElementPool); + + for(udword i=0;imID = id; + FreeElem->mNext = next; + + return FreeElem; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Frees an element of the pool. + * \param elem [in] element to free/recycle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void SAP_PairData::FreeElem(SAP_Element* elem) +{ + elem->mNext = mFirstFree; // Next free + mFirstFree = elem; +} + +// Add a pair to the set. +void SAP_PairData::AddPair(udword id1, udword id2) +{ + // Order the ids + Sort(id1, id2); + + ASSERT(id1=mNbObjects) return; + + // Select the right list from "mArray". + SAP_Element* Current = mArray[id1]; + + if(!Current) + { + // Empty slot => create new element + mArray[id1] = GetFreeElem(id2, null); + } + else if(Current->mID>id2) + { + // The list is not empty but all elements are greater than id2 => insert id2 in the front. + mArray[id1] = GetFreeElem(id2, mArray[id1]); + } + else + { + // Else find the correct location in the sorted list (ascending order) and insert id2 there. + while(Current->mNext) + { + if(Current->mNext->mID > id2) break; + + Current = Current->mNext; + } + + if(Current->mID==id2) return; // The pair already exists + +// Current->mNext = GetFreeElem(id2, Current->mNext); + udword Delta; + SAP_Element* E = GetFreeElem(id2, Current->mNext, &Delta); + if(Delta) Remap(Current, Delta); + Current->mNext = E; + } +} + +// Delete a pair from the set. +void SAP_PairData::RemovePair(udword id1, udword id2) +{ + // Order the ids. + Sort(id1, id2); + + // Exit if the pair doesn't exist in the set + if(id1>=mNbObjects) return; + + // Otherwise, select the correct list. + SAP_Element* Current = mArray[id1]; + + // If this list is empty, the pair doesn't exist. + if(!Current) return; + + // Otherwise, if id2 is the first element, delete it. + if(Current->mID==id2) + { + mArray[id1] = Current->mNext; + FreeElem(Current); + } + else + { + // If id2 is not the first element, start traversing the sorted list. + while(Current->mNext) + { + // If we have moved too far away without hitting id2, then the pair doesn't exist + if(Current->mNext->mID > id2) return; + + // Otherwise, delete id2. + if(Current->mNext->mID == id2) + { + SAP_Element* Temp = Current->mNext; + Current->mNext = Temp->mNext; + FreeElem(Temp); + return; + } + Current = Current->mNext; + } + } +} + +void SAP_PairData::DumpPairs(Pairs& pairs) const +{ + // ### Ugly and slow + for(udword i=0;imIDmID); + Current = Current->mNext; + } + } +} + +void SAP_PairData::DumpPairs(PairCallback callback, void* user_data) const +{ + if(!callback) return; + + // ### Ugly and slow + for(udword i=0;imIDmID, user_data)) return; + Current = Current->mNext; + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SweepAndPrune::SweepAndPrune() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SweepAndPrune::~SweepAndPrune() +{ +} + +void SweepAndPrune::GetPairs(Pairs& pairs) const +{ + mPairs.DumpPairs(pairs); +} + +void SweepAndPrune::GetPairs(PairCallback callback, void* user_data) const +{ + mPairs.DumpPairs(callback, user_data); +} + +bool SweepAndPrune::Init(udword nb_objects, const AABB** boxes) +{ + // 1) Create sorted lists + mNbObjects = nb_objects; + + mBoxes = new SAP_Box[nb_objects]; +// for(udword i=0;iGetMin(Axis); + Data[i*2+1] = boxes[i]->GetMax(Axis); + } + RadixSort RS; + const udword* Sorted = RS.Sort(Data, nb_objects*2).GetRanks(); + + SAP_EndPoint* PreviousEndPoint = null; + + for(udword i=0;i>1; + + ASSERT(BoxIndexValue = SortedCoord; +// CurrentEndPoint->IsMax = SortedIndex&1; // ### could be implicit ? +// CurrentEndPoint->ID = BoxIndex; // ### could be implicit ? + CurrentEndPoint->SetData(BoxIndex, SortedIndex&1); // ### could be implicit ? + CurrentEndPoint->Previous = PreviousEndPoint; + CurrentEndPoint->Next = null; + if(PreviousEndPoint) PreviousEndPoint->Next = CurrentEndPoint; + + if(CurrentEndPoint->IsMax()) mBoxes[BoxIndex].Max[Axis] = CurrentEndPoint; + else mBoxes[BoxIndex].Min[Axis] = CurrentEndPoint; + + PreviousEndPoint = CurrentEndPoint; + } + } + + DELETEARRAY(Data); + + CheckListsIntegrity(); + + // 2) Quickly find starting pairs + + mPairs.Init(nb_objects); + + { + Pairs P; + CompleteBoxPruning(nb_objects, boxes, P, Axes(AXES_XZY)); + for(udword i=0;iid0; + udword id1 = PP->id1; + + if(id0!=id1 && boxes[id0]->Intersect(*boxes[id1])) + { + mPairs.AddPair(id0, id1); + } + else ASSERT(0); + } + } + + return true; +} + +bool SweepAndPrune::CheckListsIntegrity() +{ + for(udword Axis=0;Axis<3;Axis++) + { + // Find list head + SAP_EndPoint* Current = mList[Axis]; + while(Current->Previous) Current = Current->Previous; + + udword Nb = 0; + + SAP_EndPoint* Previous = null; + while(Current) + { + Nb++; + + if(Previous) + { + ASSERT(Previous->Value <= Current->Value); + if(Previous->Value > Current->Value) return false; + } + + ASSERT(Current->Previous==Previous); + if(Current->Previous!=Previous) return false; + + Previous = Current; + Current = Current->Next; + } + + ASSERT(Nb==mNbObjects*2); + } + return true; +} + +inline_ BOOL Intersect(const AABB& a, const SAP_Box& b) +{ + if(b.Max[0]->Value < a.GetMin(0) || a.GetMax(0) < b.Min[0]->Value + || b.Max[1]->Value < a.GetMin(1) || a.GetMax(1) < b.Min[1]->Value + || b.Max[2]->Value < a.GetMin(2) || a.GetMax(2) < b.Min[2]->Value) return FALSE; + + return TRUE; +} + + + +bool SweepAndPrune::UpdateObject(udword i, const AABB& box) +{ + for(udword Axis=0;Axis<3;Axis++) + { +// udword Base = (udword)&mList[Axis][0]; + + // Update min + { + SAP_EndPoint* const CurrentMin = mBoxes[i].Min[Axis]; + ASSERT(!CurrentMin->IsMax()); + + const float Limit = box.GetMin(Axis); + if(Limit == CurrentMin->Value) + { + } + else if(Limit < CurrentMin->Value) + { + CurrentMin->Value = Limit; + + // Min is moving left: + SAP_EndPoint* NewPos = CurrentMin; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Previous) && tmp->Value > Limit) + { + NewPos = tmp; + + if(NewPos->IsMax()) + { + // Our min passed a max => start overlap + //udword SortedIndex = (udword(CurrentMin) - Base)/sizeof(NS_EndPoint); + const udword id0 = CurrentMin->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); + } + } + + CurrentMin->InsertBefore(NewPos); + } + else// if(Limit > CurrentMin->Value) + { + CurrentMin->Value = Limit; + + // Min is moving right: + SAP_EndPoint* NewPos = CurrentMin; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Next) && tmp->Value < Limit) + { + NewPos = tmp; + + if(NewPos->IsMax()) + { + // Our min passed a max => stop overlap + const udword id0 = CurrentMin->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1) mPairs.RemovePair(id0, id1); + } + } + + CurrentMin->InsertAfter(NewPos); + } + } + + // Update max + { + SAP_EndPoint* const CurrentMax = mBoxes[i].Max[Axis]; + ASSERT(CurrentMax->IsMax()); + + const float Limit = box.GetMax(Axis); + if(Limit == CurrentMax->Value) + { + } + else if(Limit > CurrentMax->Value) + { + CurrentMax->Value = Limit; + + // Max is moving right: + SAP_EndPoint* NewPos = CurrentMax; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Next) && tmp->Value < Limit) + { + NewPos = tmp; + + if(!NewPos->IsMax()) + { + // Our max passed a min => start overlap + const udword id0 = CurrentMax->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); + } + } + + CurrentMax->InsertAfter(NewPos); + } + else// if(Limit < CurrentMax->Value) + { + CurrentMax->Value = Limit; + + // Max is moving left: + SAP_EndPoint* NewPos = CurrentMax; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Previous) && tmp->Value > Limit) + { + NewPos = tmp; + + if(!NewPos->IsMax()) + { + // Our max passed a min => stop overlap + const udword id0 = CurrentMax->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1) mPairs.RemovePair(id0, id1); + } + } + + CurrentMax->InsertBefore(NewPos); + } + } + } + + return true; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h b/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h index f56f7d06f..0221d2867 100644 --- a/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h +++ b/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h @@ -1,95 +1,95 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) - * \file OPC_SweepAndPrune.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_SWEEPANDPRUNE_H__ -#define __OPC_SWEEPANDPRUNE_H__ - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called by OPCODE for each colliding pairs. - * \param id0 [in] id of colliding object - * \param id1 [in] id of colliding object - * \param user_data [in] user-defined data - * \return TRUE to continue enumeration - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef BOOL (*PairCallback) (udword id0, udword id1, void* user_data); - - class SAP_Element; - class SAP_EndPoint; - class SAP_Box; - - class OPCODE_API SAP_PairData - { - public: - SAP_PairData(); - ~SAP_PairData(); - - bool Init(udword nb_objects); - - void AddPair(udword id1, udword id2); - void RemovePair(udword id1, udword id2); - - void DumpPairs(Pairs& pairs) const; - void DumpPairs(PairCallback callback, void* user_data) const; - private: - udword mNbElements; //!< Total number of elements in the pool - udword mNbUsedElements; //!< Number of used elements - SAP_Element* mElementPool; //!< Array of mNbElements elements - SAP_Element* mFirstFree; //!< First free element in the pool - - udword mNbObjects; //!< Max number of objects we can handle - SAP_Element** mArray; //!< Pointers to pool - // Internal methods - SAP_Element* GetFreeElem(udword id, SAP_Element* next, udword* remap=null); - inline_ void FreeElem(SAP_Element* elem); - void Release(); - }; - - class OPCODE_API SweepAndPrune - { - public: - SweepAndPrune(); - ~SweepAndPrune(); - - bool Init(udword nb_objects, const AABB** boxes); - bool UpdateObject(udword i, const AABB& box); - - void GetPairs(Pairs& pairs) const; - void GetPairs(PairCallback callback, void* user_data) const; - private: - SAP_PairData mPairs; - - udword mNbObjects; - SAP_Box* mBoxes; - SAP_EndPoint* mList[3]; - // Internal methods - bool CheckListsIntegrity(); - }; - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) + * \file OPC_SweepAndPrune.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_SWEEPANDPRUNE_H__ +#define __OPC_SWEEPANDPRUNE_H__ + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called by OPCODE for each colliding pairs. + * \param id0 [in] id of colliding object + * \param id1 [in] id of colliding object + * \param user_data [in] user-defined data + * \return TRUE to continue enumeration + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef BOOL (*PairCallback) (udword id0, udword id1, void* user_data); + + class SAP_Element; + class SAP_EndPoint; + class SAP_Box; + + class OPCODE_API SAP_PairData + { + public: + SAP_PairData(); + ~SAP_PairData(); + + bool Init(udword nb_objects); + + void AddPair(udword id1, udword id2); + void RemovePair(udword id1, udword id2); + + void DumpPairs(Pairs& pairs) const; + void DumpPairs(PairCallback callback, void* user_data) const; + private: + udword mNbElements; //!< Total number of elements in the pool + udword mNbUsedElements; //!< Number of used elements + SAP_Element* mElementPool; //!< Array of mNbElements elements + SAP_Element* mFirstFree; //!< First free element in the pool + + udword mNbObjects; //!< Max number of objects we can handle + SAP_Element** mArray; //!< Pointers to pool + // Internal methods + SAP_Element* GetFreeElem(udword id, SAP_Element* next, udword* remap=null); + inline_ void FreeElem(SAP_Element* elem); + void Release(); + }; + + class OPCODE_API SweepAndPrune + { + public: + SweepAndPrune(); + ~SweepAndPrune(); + + bool Init(udword nb_objects, const AABB** boxes); + bool UpdateObject(udword i, const AABB& box); + + void GetPairs(Pairs& pairs) const; + void GetPairs(PairCallback callback, void* user_data) const; + private: + SAP_PairData mPairs; + + udword mNbObjects; + SAP_Box* mBoxes; + SAP_EndPoint* mList[3]; + // Internal methods + bool CheckListsIntegrity(); + }; + #endif //__OPC_SWEEPANDPRUNE_H__ \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp b/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp index d5bbb6348..7fbb4e3f7 100644 --- a/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp +++ b/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp @@ -1,264 +1,264 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for tree builders. - * \file OPC_TreeBuilders.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A builder for AABB-trees of vertices. - * - * \class AABBTreeOfVerticesBuilder - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A builder for AABB-trees of AABBs. - * - * \class AABBTreeOfAABBsBuilder - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A builder for AABB-trees of triangles. - * - * \class AABBTreeOfTrianglesBuilder - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the AABB of a set of primitives. - * \param primitives [in] list of indices of primitives - * \param nb_prims [in] number of indices - * \param global_box [out] global AABB enclosing the set of input primitives - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeOfAABBsBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const -{ - // Checkings - if(!primitives || !nb_prims) return false; - - // Initialize global box - global_box = mAABBArray[primitives[0]]; - - // Loop through boxes - for(udword i=1;iGetTriangle(VP, *primitives++); - // Update global box - Min.Min(*VP.Vertex[0]).Min(*VP.Vertex[1]).Min(*VP.Vertex[2]); - Max.Max(*VP.Vertex[0]).Max(*VP.Vertex[1]).Max(*VP.Vertex[2]); - } - global_box.SetMinMax(Min, Max); - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the splitting value along a given axis for a given primitive. - * \param index [in] index of the primitive to split - * \param axis [in] axis index (0,1,2) - * \return splitting value - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float AABBTreeOfTrianglesBuilder::GetSplittingValue(udword index, udword axis) const -{ -/* // Compute center of triangle - Point Center; - mTriList[index].Center(mVerts, Center); - // Return value - return Center[axis];*/ - - // Compute correct component from center of triangle -// return (mVerts[mTriList[index].mVRef[0]][axis] -// +mVerts[mTriList[index].mVRef[1]][axis] -// +mVerts[mTriList[index].mVRef[2]][axis])*INV3; - - VertexPointers VP; - mIMesh->GetTriangle(VP, index); - - // Compute correct component from center of triangle - return ((*VP.Vertex[0])[axis] - +(*VP.Vertex[1])[axis] - +(*VP.Vertex[2])[axis])*INV3; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the splitting value along a given axis for a given node. - * \param primitives [in] list of indices of primitives - * \param nb_prims [in] number of indices - * \param global_box [in] global AABB enclosing the set of input primitives - * \param axis [in] axis index (0,1,2) - * \return splitting value - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float AABBTreeOfTrianglesBuilder::GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const -{ - if(mSettings.mRules&SPLIT_GEOM_CENTER) - { - // Loop through triangles - float SplitValue = 0.0f; - VertexPointers VP; - for(udword i=0;iGetTriangle(VP, primitives[i]); - // Update split value - SplitValue += (*VP.Vertex[0])[axis]; - SplitValue += (*VP.Vertex[1])[axis]; - SplitValue += (*VP.Vertex[2])[axis]; - } - return SplitValue / float(nb_prims*3); - } - else return AABBTreeBuilder::GetSplittingValue(primitives, nb_prims, global_box, axis); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the AABB of a set of primitives. - * \param primitives [in] list of indices of primitives - * \param nb_prims [in] number of indices - * \param global_box [out] global AABB enclosing the set of input primitives - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeOfVerticesBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const -{ - // Checkings - if(!primitives || !nb_prims) return false; - - // Initialize global box - global_box.SetEmpty(); - - // Loop through vertices - for(udword i=0;iGetTriangle(VP, *primitives++); + // Update global box + Min.Min(*VP.Vertex[0]).Min(*VP.Vertex[1]).Min(*VP.Vertex[2]); + Max.Max(*VP.Vertex[0]).Max(*VP.Vertex[1]).Max(*VP.Vertex[2]); + } + global_box.SetMinMax(Min, Max); + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the splitting value along a given axis for a given primitive. + * \param index [in] index of the primitive to split + * \param axis [in] axis index (0,1,2) + * \return splitting value + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float AABBTreeOfTrianglesBuilder::GetSplittingValue(udword index, udword axis) const +{ +/* // Compute center of triangle + Point Center; + mTriList[index].Center(mVerts, Center); + // Return value + return Center[axis];*/ + + // Compute correct component from center of triangle +// return (mVerts[mTriList[index].mVRef[0]][axis] +// +mVerts[mTriList[index].mVRef[1]][axis] +// +mVerts[mTriList[index].mVRef[2]][axis])*INV3; + + VertexPointers VP; + mIMesh->GetTriangle(VP, index); + + // Compute correct component from center of triangle + return ((*VP.Vertex[0])[axis] + +(*VP.Vertex[1])[axis] + +(*VP.Vertex[2])[axis])*INV3; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the splitting value along a given axis for a given node. + * \param primitives [in] list of indices of primitives + * \param nb_prims [in] number of indices + * \param global_box [in] global AABB enclosing the set of input primitives + * \param axis [in] axis index (0,1,2) + * \return splitting value + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float AABBTreeOfTrianglesBuilder::GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const +{ + if(mSettings.mRules&SPLIT_GEOM_CENTER) + { + // Loop through triangles + float SplitValue = 0.0f; + VertexPointers VP; + for(udword i=0;iGetTriangle(VP, primitives[i]); + // Update split value + SplitValue += (*VP.Vertex[0])[axis]; + SplitValue += (*VP.Vertex[1])[axis]; + SplitValue += (*VP.Vertex[2])[axis]; + } + return SplitValue / float(nb_prims*3); + } + else return AABBTreeBuilder::GetSplittingValue(primitives, nb_prims, global_box, axis); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the AABB of a set of primitives. + * \param primitives [in] list of indices of primitives + * \param nb_prims [in] number of indices + * \param global_box [out] global AABB enclosing the set of input primitives + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeOfVerticesBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const +{ + // Checkings + if(!primitives || !nb_prims) return false; + + // Initialize global box + global_box.SetEmpty(); + + // Loop through vertices + for(udword i=0;iHasLeafNodes()!=cache.Model1->HasLeafNodes()) return false; - if(cache.Model0->IsQuantized()!=cache.Model1->IsQuantized()) return false; - - /* - - Rules: - - perform hull test - - when hulls collide, disable hull test - - if meshes overlap, reset countdown - - if countdown reaches 0, enable hull test - - */ - -#ifdef __MESHMERIZER_H__ - // Handle hulls - if(cache.HullTest) - { - if(cache.Model0->GetHull() && cache.Model1->GetHull()) - { - struct Local - { - static Point* SVCallback(const Point& sv, udword& previndex, udword user_data) - { - CollisionHull* Hull = (CollisionHull*)user_data; - previndex = Hull->ComputeSupportingVertex(sv, previndex); - return (Point*)&Hull->GetVerts()[previndex]; - } - }; - - bool Collide; - - if(0) - { - static GJKEngine GJK; - static bool GJKInitDone=false; - if(!GJKInitDone) - { - GJK.Enable(GJK_BACKUP_PROCEDURE); - GJK.Enable(GJK_DEGENERATE); - GJK.Enable(GJK_HILLCLIMBING); - GJKInitDone = true; - } - GJK.SetCallbackObj0(Local::SVCallback); - GJK.SetCallbackObj1(Local::SVCallback); - GJK.SetUserData0(udword(cache.Model0->GetHull())); - GJK.SetUserData1(udword(cache.Model1->GetHull())); - Collide = GJK.Collide(*world0, *world1, &cache.SepVector); - } - else - { - static SVEngine SVE; - SVE.SetCallbackObj0(Local::SVCallback); - SVE.SetCallbackObj1(Local::SVCallback); - SVE.SetUserData0(udword(cache.Model0->GetHull())); - SVE.SetUserData1(udword(cache.Model1->GetHull())); - Collide = SVE.Collide(*world0, *world1, &cache.SepVector); - } - - if(!Collide) - { - // Reset stats & contact status - mFlags &= ~OPC_CONTACT; - mNbBVBVTests = 0; - mNbPrimPrimTests = 0; - mNbBVPrimTests = 0; - mPairs.Reset(); - return true; - } - } - } - - // Here, hulls collide - cache.HullTest = false; -#endif // __MESHMERIZER_H__ - - // Checkings - if(!Setup(cache.Model0->GetMeshInterface(), cache.Model1->GetMeshInterface())) return false; - - // Simple double-dispatch - bool Status; - if(!cache.Model0->HasLeafNodes()) - { - if(cache.Model0->IsQuantized()) - { - const AABBQuantizedNoLeafTree* T0 = (const AABBQuantizedNoLeafTree*)cache.Model0->GetTree(); - const AABBQuantizedNoLeafTree* T1 = (const AABBQuantizedNoLeafTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - else - { - const AABBNoLeafTree* T0 = (const AABBNoLeafTree*)cache.Model0->GetTree(); - const AABBNoLeafTree* T1 = (const AABBNoLeafTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - } - else - { - if(cache.Model0->IsQuantized()) - { - const AABBQuantizedTree* T0 = (const AABBQuantizedTree*)cache.Model0->GetTree(); - const AABBQuantizedTree* T1 = (const AABBQuantizedTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - else - { - const AABBCollisionTree* T0 = (const AABBCollisionTree*)cache.Model0->GetTree(); - const AABBCollisionTree* T1 = (const AABBCollisionTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - } - -#ifdef __MESHMERIZER_H__ - if(Status) - { - // Reset counter as long as overlap occurs - if(GetContactStatus()) cache.ResetCountDown(); - - // Enable hull test again when counter reaches zero - cache.CountDown--; - if(!cache.CountDown) - { - cache.ResetCountDown(); - cache.HullTest = true; - } - } -#endif - return Status; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::InitQuery(const Matrix4x4* world0, const Matrix4x4* world1) -{ - // Reset stats & contact status - Collider::InitQuery(); - mNbBVBVTests = 0; - mNbPrimPrimTests = 0; - mNbBVPrimTests = 0; - mPairs.Reset(); - - // Setup matrices - Matrix4x4 InvWorld0, InvWorld1; - if(world0) InvertPRMatrix(InvWorld0, *world0); - else InvWorld0.Identity(); - - if(world1) InvertPRMatrix(InvWorld1, *world1); - else InvWorld1.Identity(); - - Matrix4x4 World0to1 = world0 ? (*world0 * InvWorld1) : InvWorld1; - Matrix4x4 World1to0 = world1 ? (*world1 * InvWorld0) : InvWorld0; - - mR0to1 = World0to1; World0to1.GetTrans(mT0to1); - mR1to0 = World1to0; World1to0.GetTrans(mT1to0); - - // Precompute absolute 1-to-0 rotation matrix - for(udword i=0;i<3;i++) - { - for(udword j=0;j<3;j++) - { - // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) - mAR.m[i][j] = 1e-6f + fabsf(mR1to0.m[i][j]); - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Takes advantage of temporal coherence. - * \param cache [in] cache for a pair of previously colliding primitives - * \return true if we can return immediately - * \warning only works for "First Contact" mode - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::CheckTemporalCoherence(Pair* cache) -{ - // Checkings - if(!cache) return false; - - // Test previously colliding primitives first - if(TemporalCoherenceEnabled() && FirstContactEnabled()) - { - PrimTest(cache->id0, cache->id1); - if(GetContactStatus()) return true; - } - return false; -} - -#define UPDATE_CACHE \ - if(cache && GetContactStatus()) \ - { \ - cache->id0 = mPairs.GetEntry(0); \ - cache->id1 = mPairs.GetEntry(1); \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for normal AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Perform collision query - _Collide(tree0->GetNodes(), tree1->GetNodes()); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for no-leaf AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Perform collision query - _Collide(tree0->GetNodes(), tree1->GetNodes()); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for quantized AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Setup dequantization coeffs - mCenterCoeff0 = tree0->mCenterCoeff; - mExtentsCoeff0 = tree0->mExtentsCoeff; - mCenterCoeff1 = tree1->mCenterCoeff; - mExtentsCoeff1 = tree1->mExtentsCoeff; - - // Dequantize box A - const AABBQuantizedNode* N0 = tree0->GetNodes(); - const Point a(float(N0->mAABB.mExtents[0]) * mExtentsCoeff0.x, float(N0->mAABB.mExtents[1]) * mExtentsCoeff0.y, float(N0->mAABB.mExtents[2]) * mExtentsCoeff0.z); - const Point Pa(float(N0->mAABB.mCenter[0]) * mCenterCoeff0.x, float(N0->mAABB.mCenter[1]) * mCenterCoeff0.y, float(N0->mAABB.mCenter[2]) * mCenterCoeff0.z); - // Dequantize box B - const AABBQuantizedNode* N1 = tree1->GetNodes(); - const Point b(float(N1->mAABB.mExtents[0]) * mExtentsCoeff1.x, float(N1->mAABB.mExtents[1]) * mExtentsCoeff1.y, float(N1->mAABB.mExtents[2]) * mExtentsCoeff1.z); - const Point Pb(float(N1->mAABB.mCenter[0]) * mCenterCoeff1.x, float(N1->mAABB.mCenter[1]) * mCenterCoeff1.y, float(N1->mAABB.mCenter[2]) * mCenterCoeff1.z); - - // Perform collision query - _Collide(N0, N1, a, Pa, b, Pb); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for quantized no-leaf AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Setup dequantization coeffs - mCenterCoeff0 = tree0->mCenterCoeff; - mExtentsCoeff0 = tree0->mExtentsCoeff; - mCenterCoeff1 = tree1->mCenterCoeff; - mExtentsCoeff1 = tree1->mExtentsCoeff; - - // Perform collision query - _Collide(tree0->GetNodes(), tree1->GetNodes()); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Standard trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// The normal AABB tree can use 2 different descent rules (with different performances) -//#define ORIGINAL_CODE //!< UNC-like descent rules -#define ALTERNATIVE_CODE //!< Alternative descent rules - -#ifdef ORIGINAL_CODE -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param b0 [in] collision node from first tree - * \param b1 [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) return; - - if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } - - if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) - { - _Collide(b0->GetNeg(), b1); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1); - } - else - { - _Collide(b0, b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0, b1->GetPos()); - } -} -#endif - -#ifdef ALTERNATIVE_CODE -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param b0 [in] collision node from first tree - * \param b1 [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) - { - return; - } - - if(b0->IsLeaf()) - { - if(b1->IsLeaf()) - { - PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); - } - else - { - _Collide(b0, b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0, b1->GetPos()); - } - } - else if(b1->IsLeaf()) - { - _Collide(b0->GetNeg(), b1); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1); - } - else - { - _Collide(b0->GetNeg(), b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0->GetNeg(), b1->GetPos()); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1->GetPos()); - } -} -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// No-leaf trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Leaf-leaf test for two primitive indices. - * \param id0 [in] index from first leaf-triangle - * \param id1 [in] index from second leaf-triangle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::PrimTest(udword id0, udword id1) -{ - // Request vertices from the app - VertexPointers VP0; - VertexPointers VP1; - mIMesh0->GetTriangle(VP0, id0); - mIMesh1->GetTriangle(VP1, id1); - - // Transform from space 1 to space 0 - Point u0,u1,u2; - TransformPoint(u0, *VP1.Vertex[0], mR1to0, mT1to0); - TransformPoint(u1, *VP1.Vertex[1], mR1to0, mT1to0); - TransformPoint(u2, *VP1.Vertex[2], mR1to0, mT1to0); - - // Perform triangle-triangle overlap test - if(TriTriOverlap(*VP0.Vertex[0], *VP0.Vertex[1], *VP0.Vertex[2], u0, u1, u2)) - { - // Keep track of colliding pairs - mPairs.Add(id0).Add(id1); - // Set contact status - mFlags |= OPC_CONTACT; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Leaf-leaf test for a previously fetched triangle from tree A (in B's space) and a new leaf from B. - * \param id1 [in] leaf-triangle index from tree B - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void AABBTreeCollider::PrimTestTriIndex(udword id1) -{ - // Request vertices from the app - VertexPointers VP; - mIMesh1->GetTriangle(VP, id1); - - // Perform triangle-triangle overlap test - if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) - { - // Keep track of colliding pairs - mPairs.Add(mLeafIndex).Add(id1); - // Set contact status - mFlags |= OPC_CONTACT; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Leaf-leaf test for a previously fetched triangle from tree B (in A's space) and a new leaf from A. - * \param id0 [in] leaf-triangle index from tree A - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void AABBTreeCollider::PrimTestIndexTri(udword id0) -{ - // Request vertices from the app - VertexPointers VP; - mIMesh0->GetTriangle(VP, id0); - - // Perform triangle-triangle overlap test - if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) - { - // Keep track of colliding pairs - mPairs.Add(id0).Add(mLeafIndex); - // Set contact status - mFlags |= OPC_CONTACT; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from A and a branch from B. - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideTriBox(const AABBNoLeafNode* b) -{ - // Perform triangle-box overlap test - if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; - - // Keep same triangle, deal with first child - if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - // Keep same triangle, deal with second child - if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from B and a branch from A. - * \param b [in] collision node from first tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideBoxTri(const AABBNoLeafNode* b) -{ - // Perform triangle-box overlap test - if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; - - // Keep same triangle, deal with first child - if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); - else _CollideBoxTri(b->GetPos()); - - if(ContactFound()) return; - - // Keep same triangle, deal with second child - if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); - else _CollideBoxTri(b->GetNeg()); -} - -//! Request triangle vertices from the app and transform them -#define FETCH_LEAF(prim_index, imesh, rot, trans) \ - mLeafIndex = prim_index; \ - /* Request vertices from the app */ \ - VertexPointers VP; imesh->GetTriangle(VP, prim_index); \ - /* Transform them in a common space */ \ - TransformPoint(mLeafVerts[0], *VP.Vertex[0], rot, trans); \ - TransformPoint(mLeafVerts[1], *VP.Vertex[1], rot, trans); \ - TransformPoint(mLeafVerts[2], *VP.Vertex[2], rot, trans); - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param a [in] collision node from first tree - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(a->mAABB.mExtents, a->mAABB.mCenter, b->mAABB.mExtents, b->mAABB.mCenter)) return; - - // Catch leaf status - BOOL BHasPosLeaf = b->HasPosLeaf(); - BOOL BHasNegLeaf = b->HasNegLeaf(); - - if(a->HasPosLeaf()) - { - FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetNeg()); - } - - if(ContactFound()) return; - - if(a->HasNegLeaf()) - { - FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Quantized trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param b0 [in] collision node from first tree - * \param b1 [in] collision node from second tree - * \param a [in] extent from box A - * \param Pa [in] center from box A - * \param b [in] extent from box B - * \param Pb [in] center from box B - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(a, Pa, b, Pb)) return; - - if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } - - if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) - { - // Dequantize box - const QuantizedAABB* Box = &b0->GetNeg()->mAABB; - const Point negPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); - const Point nega(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); - _Collide(b0->GetNeg(), b1, nega, negPa, b, Pb); - - if(ContactFound()) return; - - // Dequantize box - Box = &b0->GetPos()->mAABB; - const Point posPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); - const Point posa(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); - _Collide(b0->GetPos(), b1, posa, posPa, b, Pb); - } - else - { - // Dequantize box - const QuantizedAABB* Box = &b1->GetNeg()->mAABB; - const Point negPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); - const Point negb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); - _Collide(b0, b1->GetNeg(), a, Pa, negb, negPb); - - if(ContactFound()) return; - - // Dequantize box - Box = &b1->GetPos()->mAABB; - const Point posPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); - const Point posb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); - _Collide(b0, b1->GetPos(), a, Pa, posb, posPb); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Quantized no-leaf trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from A and a quantized branch from B. - * \param leaf [in] leaf triangle from first tree - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideTriBox(const AABBQuantizedNoLeafNode* b) -{ - // Dequantize box - const QuantizedAABB* bb = &b->mAABB; - const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); - const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); - - // Perform triangle-box overlap test - if(!TriBoxOverlap(Pb, eb)) return; - - if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from B and a quantized branch from A. - * \param b [in] collision node from first tree - * \param leaf [in] leaf triangle from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideBoxTri(const AABBQuantizedNoLeafNode* b) -{ - // Dequantize box - const QuantizedAABB* bb = &b->mAABB; - const Point Pa(float(bb->mCenter[0]) * mCenterCoeff0.x, float(bb->mCenter[1]) * mCenterCoeff0.y, float(bb->mCenter[2]) * mCenterCoeff0.z); - const Point ea(float(bb->mExtents[0]) * mExtentsCoeff0.x, float(bb->mExtents[1]) * mExtentsCoeff0.y, float(bb->mExtents[2]) * mExtentsCoeff0.z); - - // Perform triangle-box overlap test - if(!TriBoxOverlap(Pa, ea)) return; - - if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); - else _CollideBoxTri(b->GetPos()); - - if(ContactFound()) return; - - if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); - else _CollideBoxTri(b->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param a [in] collision node from first tree - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b) -{ - // Dequantize box A - const QuantizedAABB* ab = &a->mAABB; - const Point Pa(float(ab->mCenter[0]) * mCenterCoeff0.x, float(ab->mCenter[1]) * mCenterCoeff0.y, float(ab->mCenter[2]) * mCenterCoeff0.z); - const Point ea(float(ab->mExtents[0]) * mExtentsCoeff0.x, float(ab->mExtents[1]) * mExtentsCoeff0.y, float(ab->mExtents[2]) * mExtentsCoeff0.z); - // Dequantize box B - const QuantizedAABB* bb = &b->mAABB; - const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); - const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); - - // Perform BV-BV overlap test - if(!BoxBoxOverlap(ea, Pa, eb, Pb)) return; - - // Catch leaf status - BOOL BHasPosLeaf = b->HasPosLeaf(); - BOOL BHasNegLeaf = b->HasNegLeaf(); - - if(a->HasPosLeaf()) - { - FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetNeg()); - } - - if(ContactFound()) return; - - if(a->HasNegLeaf()) - { - FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetNeg()); - } -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a tree collider. + * \file OPC_TreeCollider.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an AABB tree collider. + * This class performs a collision test between two AABB trees. + * + * \class AABBTreeCollider + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_BoxBoxOverlap.h" +#include "OPC_TriBoxOverlap.h" +#include "OPC_TriTriOverlap.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTreeCollider::AABBTreeCollider() : + mNbBVBVTests (0), + mNbPrimPrimTests (0), + mNbBVPrimTests (0), + mFullBoxBoxTest (true), + mFullPrimBoxTest (true), + mIMesh0 (null), + mIMesh1 (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTreeCollider::~AABBTreeCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* AABBTreeCollider::ValidateSettings() +{ + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; + return null; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results with: + * - GetContactStatus() + * - GetNbPairs() + * - GetPairs() + * + * \param cache [in] collision cache for model pointers and a colliding pair of primitives + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(BVTCache& cache, const Matrix4x4* world0, const Matrix4x4* world1) +{ + // Checkings + if(!cache.Model0 || !cache.Model1) return false; + if(cache.Model0->HasLeafNodes()!=cache.Model1->HasLeafNodes()) return false; + if(cache.Model0->IsQuantized()!=cache.Model1->IsQuantized()) return false; + + /* + + Rules: + - perform hull test + - when hulls collide, disable hull test + - if meshes overlap, reset countdown + - if countdown reaches 0, enable hull test + + */ + +#ifdef __MESHMERIZER_H__ + // Handle hulls + if(cache.HullTest) + { + if(cache.Model0->GetHull() && cache.Model1->GetHull()) + { + struct Local + { + static Point* SVCallback(const Point& sv, udword& previndex, udword user_data) + { + CollisionHull* Hull = (CollisionHull*)user_data; + previndex = Hull->ComputeSupportingVertex(sv, previndex); + return (Point*)&Hull->GetVerts()[previndex]; + } + }; + + bool Collide; + + if(0) + { + static GJKEngine GJK; + static bool GJKInitDone=false; + if(!GJKInitDone) + { + GJK.Enable(GJK_BACKUP_PROCEDURE); + GJK.Enable(GJK_DEGENERATE); + GJK.Enable(GJK_HILLCLIMBING); + GJKInitDone = true; + } + GJK.SetCallbackObj0(Local::SVCallback); + GJK.SetCallbackObj1(Local::SVCallback); + GJK.SetUserData0(udword(cache.Model0->GetHull())); + GJK.SetUserData1(udword(cache.Model1->GetHull())); + Collide = GJK.Collide(*world0, *world1, &cache.SepVector); + } + else + { + static SVEngine SVE; + SVE.SetCallbackObj0(Local::SVCallback); + SVE.SetCallbackObj1(Local::SVCallback); + SVE.SetUserData0(udword(cache.Model0->GetHull())); + SVE.SetUserData1(udword(cache.Model1->GetHull())); + Collide = SVE.Collide(*world0, *world1, &cache.SepVector); + } + + if(!Collide) + { + // Reset stats & contact status + mFlags &= ~OPC_CONTACT; + mNbBVBVTests = 0; + mNbPrimPrimTests = 0; + mNbBVPrimTests = 0; + mPairs.Reset(); + return true; + } + } + } + + // Here, hulls collide + cache.HullTest = false; +#endif // __MESHMERIZER_H__ + + // Checkings + if(!Setup(cache.Model0->GetMeshInterface(), cache.Model1->GetMeshInterface())) return false; + + // Simple double-dispatch + bool Status; + if(!cache.Model0->HasLeafNodes()) + { + if(cache.Model0->IsQuantized()) + { + const AABBQuantizedNoLeafTree* T0 = (const AABBQuantizedNoLeafTree*)cache.Model0->GetTree(); + const AABBQuantizedNoLeafTree* T1 = (const AABBQuantizedNoLeafTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + else + { + const AABBNoLeafTree* T0 = (const AABBNoLeafTree*)cache.Model0->GetTree(); + const AABBNoLeafTree* T1 = (const AABBNoLeafTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + } + else + { + if(cache.Model0->IsQuantized()) + { + const AABBQuantizedTree* T0 = (const AABBQuantizedTree*)cache.Model0->GetTree(); + const AABBQuantizedTree* T1 = (const AABBQuantizedTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + else + { + const AABBCollisionTree* T0 = (const AABBCollisionTree*)cache.Model0->GetTree(); + const AABBCollisionTree* T1 = (const AABBCollisionTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + } + +#ifdef __MESHMERIZER_H__ + if(Status) + { + // Reset counter as long as overlap occurs + if(GetContactStatus()) cache.ResetCountDown(); + + // Enable hull test again when counter reaches zero + cache.CountDown--; + if(!cache.CountDown) + { + cache.ResetCountDown(); + cache.HullTest = true; + } + } +#endif + return Status; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::InitQuery(const Matrix4x4* world0, const Matrix4x4* world1) +{ + // Reset stats & contact status + Collider::InitQuery(); + mNbBVBVTests = 0; + mNbPrimPrimTests = 0; + mNbBVPrimTests = 0; + mPairs.Reset(); + + // Setup matrices + Matrix4x4 InvWorld0, InvWorld1; + if(world0) InvertPRMatrix(InvWorld0, *world0); + else InvWorld0.Identity(); + + if(world1) InvertPRMatrix(InvWorld1, *world1); + else InvWorld1.Identity(); + + Matrix4x4 World0to1 = world0 ? (*world0 * InvWorld1) : InvWorld1; + Matrix4x4 World1to0 = world1 ? (*world1 * InvWorld0) : InvWorld0; + + mR0to1 = World0to1; World0to1.GetTrans(mT0to1); + mR1to0 = World1to0; World1to0.GetTrans(mT1to0); + + // Precompute absolute 1-to-0 rotation matrix + for(udword i=0;i<3;i++) + { + for(udword j=0;j<3;j++) + { + // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) + mAR.m[i][j] = 1e-6f + fabsf(mR1to0.m[i][j]); + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Takes advantage of temporal coherence. + * \param cache [in] cache for a pair of previously colliding primitives + * \return true if we can return immediately + * \warning only works for "First Contact" mode + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::CheckTemporalCoherence(Pair* cache) +{ + // Checkings + if(!cache) return false; + + // Test previously colliding primitives first + if(TemporalCoherenceEnabled() && FirstContactEnabled()) + { + PrimTest(cache->id0, cache->id1); + if(GetContactStatus()) return true; + } + return false; +} + +#define UPDATE_CACHE \ + if(cache && GetContactStatus()) \ + { \ + cache->id0 = mPairs.GetEntry(0); \ + cache->id1 = mPairs.GetEntry(1); \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for normal AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Perform collision query + _Collide(tree0->GetNodes(), tree1->GetNodes()); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for no-leaf AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Perform collision query + _Collide(tree0->GetNodes(), tree1->GetNodes()); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for quantized AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Setup dequantization coeffs + mCenterCoeff0 = tree0->mCenterCoeff; + mExtentsCoeff0 = tree0->mExtentsCoeff; + mCenterCoeff1 = tree1->mCenterCoeff; + mExtentsCoeff1 = tree1->mExtentsCoeff; + + // Dequantize box A + const AABBQuantizedNode* N0 = tree0->GetNodes(); + const Point a(float(N0->mAABB.mExtents[0]) * mExtentsCoeff0.x, float(N0->mAABB.mExtents[1]) * mExtentsCoeff0.y, float(N0->mAABB.mExtents[2]) * mExtentsCoeff0.z); + const Point Pa(float(N0->mAABB.mCenter[0]) * mCenterCoeff0.x, float(N0->mAABB.mCenter[1]) * mCenterCoeff0.y, float(N0->mAABB.mCenter[2]) * mCenterCoeff0.z); + // Dequantize box B + const AABBQuantizedNode* N1 = tree1->GetNodes(); + const Point b(float(N1->mAABB.mExtents[0]) * mExtentsCoeff1.x, float(N1->mAABB.mExtents[1]) * mExtentsCoeff1.y, float(N1->mAABB.mExtents[2]) * mExtentsCoeff1.z); + const Point Pb(float(N1->mAABB.mCenter[0]) * mCenterCoeff1.x, float(N1->mAABB.mCenter[1]) * mCenterCoeff1.y, float(N1->mAABB.mCenter[2]) * mCenterCoeff1.z); + + // Perform collision query + _Collide(N0, N1, a, Pa, b, Pb); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for quantized no-leaf AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Setup dequantization coeffs + mCenterCoeff0 = tree0->mCenterCoeff; + mExtentsCoeff0 = tree0->mExtentsCoeff; + mCenterCoeff1 = tree1->mCenterCoeff; + mExtentsCoeff1 = tree1->mExtentsCoeff; + + // Perform collision query + _Collide(tree0->GetNodes(), tree1->GetNodes()); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Standard trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// The normal AABB tree can use 2 different descent rules (with different performances) +//#define ORIGINAL_CODE //!< UNC-like descent rules +#define ALTERNATIVE_CODE //!< Alternative descent rules + +#ifdef ORIGINAL_CODE +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param b0 [in] collision node from first tree + * \param b1 [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) return; + + if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } + + if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) + { + _Collide(b0->GetNeg(), b1); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1); + } + else + { + _Collide(b0, b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0, b1->GetPos()); + } +} +#endif + +#ifdef ALTERNATIVE_CODE +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param b0 [in] collision node from first tree + * \param b1 [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) + { + return; + } + + if(b0->IsLeaf()) + { + if(b1->IsLeaf()) + { + PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); + } + else + { + _Collide(b0, b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0, b1->GetPos()); + } + } + else if(b1->IsLeaf()) + { + _Collide(b0->GetNeg(), b1); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1); + } + else + { + _Collide(b0->GetNeg(), b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0->GetNeg(), b1->GetPos()); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1->GetPos()); + } +} +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// No-leaf trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Leaf-leaf test for two primitive indices. + * \param id0 [in] index from first leaf-triangle + * \param id1 [in] index from second leaf-triangle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::PrimTest(udword id0, udword id1) +{ + // Request vertices from the app + VertexPointers VP0; + VertexPointers VP1; + mIMesh0->GetTriangle(VP0, id0); + mIMesh1->GetTriangle(VP1, id1); + + // Transform from space 1 to space 0 + Point u0,u1,u2; + TransformPoint(u0, *VP1.Vertex[0], mR1to0, mT1to0); + TransformPoint(u1, *VP1.Vertex[1], mR1to0, mT1to0); + TransformPoint(u2, *VP1.Vertex[2], mR1to0, mT1to0); + + // Perform triangle-triangle overlap test + if(TriTriOverlap(*VP0.Vertex[0], *VP0.Vertex[1], *VP0.Vertex[2], u0, u1, u2)) + { + // Keep track of colliding pairs + mPairs.Add(id0).Add(id1); + // Set contact status + mFlags |= OPC_CONTACT; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Leaf-leaf test for a previously fetched triangle from tree A (in B's space) and a new leaf from B. + * \param id1 [in] leaf-triangle index from tree B + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void AABBTreeCollider::PrimTestTriIndex(udword id1) +{ + // Request vertices from the app + VertexPointers VP; + mIMesh1->GetTriangle(VP, id1); + + // Perform triangle-triangle overlap test + if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) + { + // Keep track of colliding pairs + mPairs.Add(mLeafIndex).Add(id1); + // Set contact status + mFlags |= OPC_CONTACT; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Leaf-leaf test for a previously fetched triangle from tree B (in A's space) and a new leaf from A. + * \param id0 [in] leaf-triangle index from tree A + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void AABBTreeCollider::PrimTestIndexTri(udword id0) +{ + // Request vertices from the app + VertexPointers VP; + mIMesh0->GetTriangle(VP, id0); + + // Perform triangle-triangle overlap test + if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) + { + // Keep track of colliding pairs + mPairs.Add(id0).Add(mLeafIndex); + // Set contact status + mFlags |= OPC_CONTACT; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from A and a branch from B. + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideTriBox(const AABBNoLeafNode* b) +{ + // Perform triangle-box overlap test + if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; + + // Keep same triangle, deal with first child + if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + // Keep same triangle, deal with second child + if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from B and a branch from A. + * \param b [in] collision node from first tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideBoxTri(const AABBNoLeafNode* b) +{ + // Perform triangle-box overlap test + if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; + + // Keep same triangle, deal with first child + if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); + else _CollideBoxTri(b->GetPos()); + + if(ContactFound()) return; + + // Keep same triangle, deal with second child + if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); + else _CollideBoxTri(b->GetNeg()); +} + +//! Request triangle vertices from the app and transform them +#define FETCH_LEAF(prim_index, imesh, rot, trans) \ + mLeafIndex = prim_index; \ + /* Request vertices from the app */ \ + VertexPointers VP; imesh->GetTriangle(VP, prim_index); \ + /* Transform them in a common space */ \ + TransformPoint(mLeafVerts[0], *VP.Vertex[0], rot, trans); \ + TransformPoint(mLeafVerts[1], *VP.Vertex[1], rot, trans); \ + TransformPoint(mLeafVerts[2], *VP.Vertex[2], rot, trans); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param a [in] collision node from first tree + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(a->mAABB.mExtents, a->mAABB.mCenter, b->mAABB.mExtents, b->mAABB.mCenter)) return; + + // Catch leaf status + BOOL BHasPosLeaf = b->HasPosLeaf(); + BOOL BHasNegLeaf = b->HasNegLeaf(); + + if(a->HasPosLeaf()) + { + FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetNeg()); + } + + if(ContactFound()) return; + + if(a->HasNegLeaf()) + { + FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantized trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param b0 [in] collision node from first tree + * \param b1 [in] collision node from second tree + * \param a [in] extent from box A + * \param Pa [in] center from box A + * \param b [in] extent from box B + * \param Pb [in] center from box B + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(a, Pa, b, Pb)) return; + + if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } + + if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) + { + // Dequantize box + const QuantizedAABB* Box = &b0->GetNeg()->mAABB; + const Point negPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); + const Point nega(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); + _Collide(b0->GetNeg(), b1, nega, negPa, b, Pb); + + if(ContactFound()) return; + + // Dequantize box + Box = &b0->GetPos()->mAABB; + const Point posPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); + const Point posa(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); + _Collide(b0->GetPos(), b1, posa, posPa, b, Pb); + } + else + { + // Dequantize box + const QuantizedAABB* Box = &b1->GetNeg()->mAABB; + const Point negPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); + const Point negb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); + _Collide(b0, b1->GetNeg(), a, Pa, negb, negPb); + + if(ContactFound()) return; + + // Dequantize box + Box = &b1->GetPos()->mAABB; + const Point posPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); + const Point posb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); + _Collide(b0, b1->GetPos(), a, Pa, posb, posPb); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantized no-leaf trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from A and a quantized branch from B. + * \param leaf [in] leaf triangle from first tree + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideTriBox(const AABBQuantizedNoLeafNode* b) +{ + // Dequantize box + const QuantizedAABB* bb = &b->mAABB; + const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); + const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); + + // Perform triangle-box overlap test + if(!TriBoxOverlap(Pb, eb)) return; + + if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from B and a quantized branch from A. + * \param b [in] collision node from first tree + * \param leaf [in] leaf triangle from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideBoxTri(const AABBQuantizedNoLeafNode* b) +{ + // Dequantize box + const QuantizedAABB* bb = &b->mAABB; + const Point Pa(float(bb->mCenter[0]) * mCenterCoeff0.x, float(bb->mCenter[1]) * mCenterCoeff0.y, float(bb->mCenter[2]) * mCenterCoeff0.z); + const Point ea(float(bb->mExtents[0]) * mExtentsCoeff0.x, float(bb->mExtents[1]) * mExtentsCoeff0.y, float(bb->mExtents[2]) * mExtentsCoeff0.z); + + // Perform triangle-box overlap test + if(!TriBoxOverlap(Pa, ea)) return; + + if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); + else _CollideBoxTri(b->GetPos()); + + if(ContactFound()) return; + + if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); + else _CollideBoxTri(b->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param a [in] collision node from first tree + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b) +{ + // Dequantize box A + const QuantizedAABB* ab = &a->mAABB; + const Point Pa(float(ab->mCenter[0]) * mCenterCoeff0.x, float(ab->mCenter[1]) * mCenterCoeff0.y, float(ab->mCenter[2]) * mCenterCoeff0.z); + const Point ea(float(ab->mExtents[0]) * mExtentsCoeff0.x, float(ab->mExtents[1]) * mExtentsCoeff0.y, float(ab->mExtents[2]) * mExtentsCoeff0.z); + // Dequantize box B + const QuantizedAABB* bb = &b->mAABB; + const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); + const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); + + // Perform BV-BV overlap test + if(!BoxBoxOverlap(ea, Pa, eb, Pb)) return; + + // Catch leaf status + BOOL BHasPosLeaf = b->HasPosLeaf(); + BOOL BHasNegLeaf = b->HasNegLeaf(); + + if(a->HasPosLeaf()) + { + FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetNeg()); + } + + if(ContactFound()) return; + + if(a->HasNegLeaf()) + { + FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetNeg()); + } +} diff --git a/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h b/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h index 0f6d1cb5c..f0d731d8c 100644 --- a/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h @@ -1,253 +1,253 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a tree collider. - * \file OPC_TreeCollider.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_TREECOLLIDER_H__ -#define __OPC_TREECOLLIDER_H__ - - //! This structure holds cached information used by the algorithm. - //! Two model pointers and two colliding primitives are cached. Model pointers are assigned - //! to their respective meshes, and the pair of colliding primitives is used for temporal - //! coherence. That is, in case temporal coherence is enabled, those two primitives are - //! tested for overlap before everything else. If they still collide, we're done before - //! even entering the recursive collision code. - struct OPCODE_API BVTCache : Pair - { - //! Constructor - inline_ BVTCache() - { - ResetCache(); - ResetCountDown(); - } - - void ResetCache() - { - Model0 = null; - Model1 = null; - id0 = 0; - id1 = 1; -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - HullTest = true; - SepVector.pid = 0; - SepVector.qid = 0; - SepVector.SV = Point(1.0f, 0.0f, 0.0f); -#endif // __MESHMERIZER_H__ - } - - inline_ void ResetCountDown() - { -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - CountDown = 50; -#endif // __MESHMERIZER_H__ - } - - const Model* Model0; //!< Model for first object - const Model* Model1; //!< Model for second object - -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - SVCache SepVector; - udword CountDown; - bool HullTest; -#endif // __MESHMERIZER_H__ - }; - - class OPCODE_API AABBTreeCollider : public Collider - { - public: - // Constructor / Destructor - AABBTreeCollider(); - virtual ~AABBTreeCollider(); - // Generic collision query - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results with: - * - GetContactStatus() - * - GetNbPairs() - * - GetPairs() - * - * \param cache [in] collision cache for model pointers and a colliding pair of primitives - * \param world0 [in] world matrix for first object, or null - * \param world1 [in] world matrix for second object, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(BVTCache& cache, const Matrix4x4* world0=null, const Matrix4x4* world1=null); - - // Collision queries - bool Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - bool Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - bool Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - bool Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: selects between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) - * \param flag [in] true for full tests, false for coarse tests - * \see SetFullPrimBoxTest(bool flag) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: selects between full triangle-box tests or "SAT-lite" tests (where Class III axes are discarded) - * \param flag [in] true for full tests, false for coarse tests - * \see SetFullBoxBoxTest(bool flag) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFullPrimBoxTest(bool flag) { mFullPrimBoxTest = flag; } - - // Stats - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of BV-BV overlap tests after a collision query. - * \see GetNbPrimPrimTests() - * \see GetNbBVPrimTests() - * \return the number of BV-BV tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbBVBVTests() const { return mNbBVBVTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Triangle-Triangle overlap tests after a collision query. - * \see GetNbBVBVTests() - * \see GetNbBVPrimTests() - * \return the number of Triangle-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbPrimPrimTests() const { return mNbPrimPrimTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of BV-Triangle overlap tests after a collision query. - * \see GetNbBVBVTests() - * \see GetNbPrimPrimTests() - * \return the number of BV-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbBVPrimTests() const { return mNbBVPrimTests; } - - // Data access - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of contacts after a collision query. - * \see GetContactStatus() - * \see GetPairs() - * \return the number of contacts / colliding pairs. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbPairs() const { return mPairs.GetNbEntries()>>1; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the pairs of colliding triangles after a collision query. - * \see GetContactStatus() - * \see GetNbPairs() - * \return the list of colliding pairs (triangle indices) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const Pair* GetPairs() const { return (const Pair*)mPairs.GetEntries(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Colliding pairs - Container mPairs; //!< Pairs of colliding primitives - // User mesh interfaces - const MeshInterface* mIMesh0; //!< User-defined mesh interface for object0 - const MeshInterface* mIMesh1; //!< User-defined mesh interface for object1 - // Stats - udword mNbBVBVTests; //!< Number of BV-BV tests - udword mNbPrimPrimTests; //!< Number of Primitive-Primitive tests - udword mNbBVPrimTests; //!< Number of BV-Primitive tests - // Precomputed data - Matrix3x3 mAR; //!< Absolute rotation matrix - Matrix3x3 mR0to1; //!< Rotation from object0 to object1 - Matrix3x3 mR1to0; //!< Rotation from object1 to object0 - Point mT0to1; //!< Translation from object0 to object1 - Point mT1to0; //!< Translation from object1 to object0 - // Dequantization coeffs - Point mCenterCoeff0; - Point mExtentsCoeff0; - Point mCenterCoeff1; - Point mExtentsCoeff1; - // Leaf description - Point mLeafVerts[3]; //!< Triangle vertices - udword mLeafIndex; //!< Triangle index - // Settings - bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) - bool mFullPrimBoxTest; //!< Perform full Primitive-BV tests (true) or SAT-lite tests (false) - // Internal methods - - // Standard AABB trees - void _Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1); - // Quantized AABB trees - void _Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb); - // No-leaf AABB trees - void _CollideTriBox(const AABBNoLeafNode* b); - void _CollideBoxTri(const AABBNoLeafNode* b); - void _Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b); - // Quantized no-leaf AABB trees - void _CollideTriBox(const AABBQuantizedNoLeafNode* b); - void _CollideBoxTri(const AABBQuantizedNoLeafNode* b); - void _Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b); - // Overlap tests - void PrimTest(udword id0, udword id1); - inline_ void PrimTestTriIndex(udword id1); - inline_ void PrimTestIndexTri(udword id0); - - inline_ BOOL BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb); - inline_ BOOL TriBoxOverlap(const Point& center, const Point& extents); - inline_ BOOL TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2); - // Init methods - void InitQuery(const Matrix4x4* world0=null, const Matrix4x4* world1=null); - bool CheckTemporalCoherence(Pair* cache); - - inline_ BOOL Setup(const MeshInterface* mi0, const MeshInterface* mi1) - { - mIMesh0 = mi0; - mIMesh1 = mi1; - - if(!mIMesh0 || !mIMesh1) return FALSE; - - return TRUE; - } - }; - -#endif // __OPC_TREECOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a tree collider. + * \file OPC_TreeCollider.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_TREECOLLIDER_H__ +#define __OPC_TREECOLLIDER_H__ + + //! This structure holds cached information used by the algorithm. + //! Two model pointers and two colliding primitives are cached. Model pointers are assigned + //! to their respective meshes, and the pair of colliding primitives is used for temporal + //! coherence. That is, in case temporal coherence is enabled, those two primitives are + //! tested for overlap before everything else. If they still collide, we're done before + //! even entering the recursive collision code. + struct OPCODE_API BVTCache : Pair + { + //! Constructor + inline_ BVTCache() + { + ResetCache(); + ResetCountDown(); + } + + void ResetCache() + { + Model0 = null; + Model1 = null; + id0 = 0; + id1 = 1; +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + HullTest = true; + SepVector.pid = 0; + SepVector.qid = 0; + SepVector.SV = Point(1.0f, 0.0f, 0.0f); +#endif // __MESHMERIZER_H__ + } + + inline_ void ResetCountDown() + { +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + CountDown = 50; +#endif // __MESHMERIZER_H__ + } + + const Model* Model0; //!< Model for first object + const Model* Model1; //!< Model for second object + +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + SVCache SepVector; + udword CountDown; + bool HullTest; +#endif // __MESHMERIZER_H__ + }; + + class OPCODE_API AABBTreeCollider : public Collider + { + public: + // Constructor / Destructor + AABBTreeCollider(); + virtual ~AABBTreeCollider(); + // Generic collision query + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results with: + * - GetContactStatus() + * - GetNbPairs() + * - GetPairs() + * + * \param cache [in] collision cache for model pointers and a colliding pair of primitives + * \param world0 [in] world matrix for first object, or null + * \param world1 [in] world matrix for second object, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(BVTCache& cache, const Matrix4x4* world0=null, const Matrix4x4* world1=null); + + // Collision queries + bool Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + bool Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + bool Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + bool Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: selects between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) + * \param flag [in] true for full tests, false for coarse tests + * \see SetFullPrimBoxTest(bool flag) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: selects between full triangle-box tests or "SAT-lite" tests (where Class III axes are discarded) + * \param flag [in] true for full tests, false for coarse tests + * \see SetFullBoxBoxTest(bool flag) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFullPrimBoxTest(bool flag) { mFullPrimBoxTest = flag; } + + // Stats + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of BV-BV overlap tests after a collision query. + * \see GetNbPrimPrimTests() + * \see GetNbBVPrimTests() + * \return the number of BV-BV tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbBVBVTests() const { return mNbBVBVTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Triangle-Triangle overlap tests after a collision query. + * \see GetNbBVBVTests() + * \see GetNbBVPrimTests() + * \return the number of Triangle-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbPrimPrimTests() const { return mNbPrimPrimTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of BV-Triangle overlap tests after a collision query. + * \see GetNbBVBVTests() + * \see GetNbPrimPrimTests() + * \return the number of BV-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbBVPrimTests() const { return mNbBVPrimTests; } + + // Data access + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of contacts after a collision query. + * \see GetContactStatus() + * \see GetPairs() + * \return the number of contacts / colliding pairs. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbPairs() const { return mPairs.GetNbEntries()>>1; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the pairs of colliding triangles after a collision query. + * \see GetContactStatus() + * \see GetNbPairs() + * \return the list of colliding pairs (triangle indices) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const Pair* GetPairs() const { return (const Pair*)mPairs.GetEntries(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Colliding pairs + Container mPairs; //!< Pairs of colliding primitives + // User mesh interfaces + const MeshInterface* mIMesh0; //!< User-defined mesh interface for object0 + const MeshInterface* mIMesh1; //!< User-defined mesh interface for object1 + // Stats + udword mNbBVBVTests; //!< Number of BV-BV tests + udword mNbPrimPrimTests; //!< Number of Primitive-Primitive tests + udword mNbBVPrimTests; //!< Number of BV-Primitive tests + // Precomputed data + Matrix3x3 mAR; //!< Absolute rotation matrix + Matrix3x3 mR0to1; //!< Rotation from object0 to object1 + Matrix3x3 mR1to0; //!< Rotation from object1 to object0 + Point mT0to1; //!< Translation from object0 to object1 + Point mT1to0; //!< Translation from object1 to object0 + // Dequantization coeffs + Point mCenterCoeff0; + Point mExtentsCoeff0; + Point mCenterCoeff1; + Point mExtentsCoeff1; + // Leaf description + Point mLeafVerts[3]; //!< Triangle vertices + udword mLeafIndex; //!< Triangle index + // Settings + bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) + bool mFullPrimBoxTest; //!< Perform full Primitive-BV tests (true) or SAT-lite tests (false) + // Internal methods + + // Standard AABB trees + void _Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1); + // Quantized AABB trees + void _Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb); + // No-leaf AABB trees + void _CollideTriBox(const AABBNoLeafNode* b); + void _CollideBoxTri(const AABBNoLeafNode* b); + void _Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b); + // Quantized no-leaf AABB trees + void _CollideTriBox(const AABBQuantizedNoLeafNode* b); + void _CollideBoxTri(const AABBQuantizedNoLeafNode* b); + void _Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b); + // Overlap tests + void PrimTest(udword id0, udword id1); + inline_ void PrimTestTriIndex(udword id1); + inline_ void PrimTestIndexTri(udword id0); + + inline_ BOOL BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb); + inline_ BOOL TriBoxOverlap(const Point& center, const Point& extents); + inline_ BOOL TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2); + // Init methods + void InitQuery(const Matrix4x4* world0=null, const Matrix4x4* world1=null); + bool CheckTemporalCoherence(Pair* cache); + + inline_ BOOL Setup(const MeshInterface* mi0, const MeshInterface* mi1) + { + mIMesh0 = mi0; + mIMesh1 = mi1; + + if(!mIMesh0 || !mIMesh1) return FALSE; + + return TRUE; + } + }; + +#endif // __OPC_TREECOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h b/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h index 95e948083..a9ac2be68 100644 --- a/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h @@ -1,356 +1,356 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - - -//! This macro quickly finds the min & max values among 3 variables -#define FINDMINMAX(x0, x1, x2, min, max) \ - min = max = x0; \ - if(x1max) max=x1; \ - if(x2max) max=x2; - -//! TO BE DOCUMENTED -inline_ BOOL planeBoxOverlap(const Point& normal, const float d, const Point& maxbox) -{ - Point vmin, vmax; - for(udword q=0;q<=2;q++) - { - if(normal[q]>0.0f) { vmin[q]=-maxbox[q]; vmax[q]=maxbox[q]; } - else { vmin[q]=maxbox[q]; vmax[q]=-maxbox[q]; } - } - if((normal|vmin)+d>0.0f) return FALSE; - if((normal|vmax)+d>=0.0f) return TRUE; - - return FALSE; -} - -//! TO BE DOCUMENTED -#define AXISTEST_X01(a, b, fa, fb) \ - min = a*v0.y - b*v0.z; \ - max = a*v2.y - b*v2.z; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.y + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_X2(a, b, fa, fb) \ - min = a*v0.y - b*v0.z; \ - max = a*v1.y - b*v1.z; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.y + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Y02(a, b, fa, fb) \ - min = b*v0.z - a*v0.x; \ - max = b*v2.z - a*v2.x; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Y1(a, b, fa, fb) \ - min = b*v0.z - a*v0.x; \ - max = b*v1.z - a*v1.x; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Z12(a, b, fa, fb) \ - min = a*v1.x - b*v1.y; \ - max = a*v2.x - b*v2.y; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.y; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Z0(a, b, fa, fb) \ - min = a*v0.x - b*v0.y; \ - max = a*v1.x - b*v1.y; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.y; \ - if(min>rad || max<-rad) return FALSE; - -// compute triangle edges -// - edges lazy evaluated to take advantage of early exits -// - fabs precomputed (half less work, possible since extents are always >0) -// - customized macros to take advantage of the null component -// - axis vector discarded, possibly saves useless movs -#define IMPLEMENT_CLASS3_TESTS \ - float rad; \ - float min, max; \ - \ - const float fey0 = fabsf(e0.y); \ - const float fez0 = fabsf(e0.z); \ - AXISTEST_X01(e0.z, e0.y, fez0, fey0); \ - const float fex0 = fabsf(e0.x); \ - AXISTEST_Y02(e0.z, e0.x, fez0, fex0); \ - AXISTEST_Z12(e0.y, e0.x, fey0, fex0); \ - \ - const float fey1 = fabsf(e1.y); \ - const float fez1 = fabsf(e1.z); \ - AXISTEST_X01(e1.z, e1.y, fez1, fey1); \ - const float fex1 = fabsf(e1.x); \ - AXISTEST_Y02(e1.z, e1.x, fez1, fex1); \ - AXISTEST_Z0(e1.y, e1.x, fey1, fex1); \ - \ - const Point e2 = mLeafVerts[0] - mLeafVerts[2]; \ - const float fey2 = fabsf(e2.y); \ - const float fez2 = fabsf(e2.z); \ - AXISTEST_X2(e2.z, e2.y, fez2, fey2); \ - const float fex2 = fabsf(e2.x); \ - AXISTEST_Y1(e2.z, e2.x, fez2, fex2); \ - AXISTEST_Z12(e2.y, e2.x, fey2, fex2); - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Triangle-Box overlap test using the separating axis theorem. - * This is the code from Tomas Möller, a bit optimized: - * - with some more lazy evaluation (faster path on PC) - * - with a tiny bit of assembly - * - with "SAT-lite" applied if needed - * - and perhaps with some more minor modifs... - * - * \param center [in] box center - * \param extents [in] box extents - * \return true if triangle & box overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBTreeCollider::TriBoxOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbBVPrimTests++; - - // use separating axis theorem to test overlap between triangle and box - // need to test for overlap in these directions: - // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle - // we do not even need to test these) - // 2) normal of the triangle - // 3) crossproduct(edge from tri, {x,y,z}-directin) - // this gives 3x3=9 more tests - - // move everything so that the boxcenter is in (0,0,0) - Point v0, v1, v2; - v0.x = mLeafVerts[0].x - center.x; - v1.x = mLeafVerts[1].x - center.x; - v2.x = mLeafVerts[2].x - center.x; - - // First, test overlap in the {x,y,z}-directions -#ifdef OPC_USE_FCOMI - // find min, max of the triangle in x-direction, and test for overlap in X - if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; - if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; - - // same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; - if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; - - // same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; - if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; -#else - float min,max; - // Find min, max of the triangle in x-direction, and test for overlap in X - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if(min>extents.x || max<-extents.x) return FALSE; - - // Same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if(min>extents.y || max<-extents.y) return FALSE; - - // Same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if(min>extents.z || max<-extents.z) return FALSE; -#endif - // 2) Test if the box intersects the plane of the triangle - // compute plane equation of triangle: normal*x+d=0 - // ### could be precomputed since we use the same leaf triangle several times - const Point e0 = v1 - v0; - const Point e1 = v2 - v1; - const Point normal = e0 ^ e1; - const float d = -normal|v0; - if(!planeBoxOverlap(normal, d, extents)) return FALSE; - - // 3) "Class III" tests - if(mFullPrimBoxTest) - { - IMPLEMENT_CLASS3_TESTS - } - return TRUE; -} - -//! A dedicated version where the box is constant -inline_ BOOL OBBCollider::TriBoxOverlap() -{ - // Stats - mNbVolumePrimTests++; - - // Hook - const Point& extents = mBoxExtents; - const Point& v0 = mLeafVerts[0]; - const Point& v1 = mLeafVerts[1]; - const Point& v2 = mLeafVerts[2]; - - // use separating axis theorem to test overlap between triangle and box - // need to test for overlap in these directions: - // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle - // we do not even need to test these) - // 2) normal of the triangle - // 3) crossproduct(edge from tri, {x,y,z}-directin) - // this gives 3x3=9 more tests - - // Box center is already in (0,0,0) - - // First, test overlap in the {x,y,z}-directions -#ifdef OPC_USE_FCOMI - // find min, max of the triangle in x-direction, and test for overlap in X - if(FCMin3(v0.x, v1.x, v2.x)>mBoxExtents.x) return FALSE; - if(FCMax3(v0.x, v1.x, v2.x)<-mBoxExtents.x) return FALSE; - - if(FCMin3(v0.y, v1.y, v2.y)>mBoxExtents.y) return FALSE; - if(FCMax3(v0.y, v1.y, v2.y)<-mBoxExtents.y) return FALSE; - - if(FCMin3(v0.z, v1.z, v2.z)>mBoxExtents.z) return FALSE; - if(FCMax3(v0.z, v1.z, v2.z)<-mBoxExtents.z) return FALSE; -#else - float min,max; - // Find min, max of the triangle in x-direction, and test for overlap in X - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if(min>mBoxExtents.x || max<-mBoxExtents.x) return FALSE; - - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if(min>mBoxExtents.y || max<-mBoxExtents.y) return FALSE; - - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if(min>mBoxExtents.z || max<-mBoxExtents.z) return FALSE; -#endif - // 2) Test if the box intersects the plane of the triangle - // compute plane equation of triangle: normal*x+d=0 - // ### could be precomputed since we use the same leaf triangle several times - const Point e0 = v1 - v0; - const Point e1 = v2 - v1; - const Point normal = e0 ^ e1; - const float d = -normal|v0; - if(!planeBoxOverlap(normal, d, mBoxExtents)) return FALSE; - - // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) - { - IMPLEMENT_CLASS3_TESTS - } - return TRUE; -} - -//! ...and another one, jeez -inline_ BOOL AABBCollider::TriBoxOverlap() -{ - // Stats - mNbVolumePrimTests++; - - // Hook - const Point& center = mBox.mCenter; - const Point& extents = mBox.mExtents; - - // use separating axis theorem to test overlap between triangle and box - // need to test for overlap in these directions: - // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle - // we do not even need to test these) - // 2) normal of the triangle - // 3) crossproduct(edge from tri, {x,y,z}-directin) - // this gives 3x3=9 more tests - - // move everything so that the boxcenter is in (0,0,0) - Point v0, v1, v2; - v0.x = mLeafVerts[0].x - center.x; - v1.x = mLeafVerts[1].x - center.x; - v2.x = mLeafVerts[2].x - center.x; - - // First, test overlap in the {x,y,z}-directions -#ifdef OPC_USE_FCOMI - // find min, max of the triangle in x-direction, and test for overlap in X - if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; - if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; - - // same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; - if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; - - // same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; - if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; -#else - float min,max; - // Find min, max of the triangle in x-direction, and test for overlap in X - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if(min>extents.x || max<-extents.x) return FALSE; - - // Same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if(min>extents.y || max<-extents.y) return FALSE; - - // Same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if(min>extents.z || max<-extents.z) return FALSE; -#endif - // 2) Test if the box intersects the plane of the triangle - // compute plane equation of triangle: normal*x+d=0 - // ### could be precomputed since we use the same leaf triangle several times - const Point e0 = v1 - v0; - const Point e1 = v2 - v1; - const Point normal = e0 ^ e1; - const float d = -normal|v0; - if(!planeBoxOverlap(normal, d, extents)) return FALSE; - - // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) - { - IMPLEMENT_CLASS3_TESTS - } - return TRUE; -} +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + + +//! This macro quickly finds the min & max values among 3 variables +#define FINDMINMAX(x0, x1, x2, min, max) \ + min = max = x0; \ + if(x1max) max=x1; \ + if(x2max) max=x2; + +//! TO BE DOCUMENTED +inline_ BOOL planeBoxOverlap(const Point& normal, const float d, const Point& maxbox) +{ + Point vmin, vmax; + for(udword q=0;q<=2;q++) + { + if(normal[q]>0.0f) { vmin[q]=-maxbox[q]; vmax[q]=maxbox[q]; } + else { vmin[q]=maxbox[q]; vmax[q]=-maxbox[q]; } + } + if((normal|vmin)+d>0.0f) return FALSE; + if((normal|vmax)+d>=0.0f) return TRUE; + + return FALSE; +} + +//! TO BE DOCUMENTED +#define AXISTEST_X01(a, b, fa, fb) \ + min = a*v0.y - b*v0.z; \ + max = a*v2.y - b*v2.z; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.y + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_X2(a, b, fa, fb) \ + min = a*v0.y - b*v0.z; \ + max = a*v1.y - b*v1.z; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.y + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Y02(a, b, fa, fb) \ + min = b*v0.z - a*v0.x; \ + max = b*v2.z - a*v2.x; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Y1(a, b, fa, fb) \ + min = b*v0.z - a*v0.x; \ + max = b*v1.z - a*v1.x; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Z12(a, b, fa, fb) \ + min = a*v1.x - b*v1.y; \ + max = a*v2.x - b*v2.y; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.y; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Z0(a, b, fa, fb) \ + min = a*v0.x - b*v0.y; \ + max = a*v1.x - b*v1.y; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.y; \ + if(min>rad || max<-rad) return FALSE; + +// compute triangle edges +// - edges lazy evaluated to take advantage of early exits +// - fabs precomputed (half less work, possible since extents are always >0) +// - customized macros to take advantage of the null component +// - axis vector discarded, possibly saves useless movs +#define IMPLEMENT_CLASS3_TESTS \ + float rad; \ + float min, max; \ + \ + const float fey0 = fabsf(e0.y); \ + const float fez0 = fabsf(e0.z); \ + AXISTEST_X01(e0.z, e0.y, fez0, fey0); \ + const float fex0 = fabsf(e0.x); \ + AXISTEST_Y02(e0.z, e0.x, fez0, fex0); \ + AXISTEST_Z12(e0.y, e0.x, fey0, fex0); \ + \ + const float fey1 = fabsf(e1.y); \ + const float fez1 = fabsf(e1.z); \ + AXISTEST_X01(e1.z, e1.y, fez1, fey1); \ + const float fex1 = fabsf(e1.x); \ + AXISTEST_Y02(e1.z, e1.x, fez1, fex1); \ + AXISTEST_Z0(e1.y, e1.x, fey1, fex1); \ + \ + const Point e2 = mLeafVerts[0] - mLeafVerts[2]; \ + const float fey2 = fabsf(e2.y); \ + const float fez2 = fabsf(e2.z); \ + AXISTEST_X2(e2.z, e2.y, fez2, fey2); \ + const float fex2 = fabsf(e2.x); \ + AXISTEST_Y1(e2.z, e2.x, fez2, fex2); \ + AXISTEST_Z12(e2.y, e2.x, fey2, fex2); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Triangle-Box overlap test using the separating axis theorem. + * This is the code from Tomas Möller, a bit optimized: + * - with some more lazy evaluation (faster path on PC) + * - with a tiny bit of assembly + * - with "SAT-lite" applied if needed + * - and perhaps with some more minor modifs... + * + * \param center [in] box center + * \param extents [in] box extents + * \return true if triangle & box overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBTreeCollider::TriBoxOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbBVPrimTests++; + + // use separating axis theorem to test overlap between triangle and box + // need to test for overlap in these directions: + // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle + // we do not even need to test these) + // 2) normal of the triangle + // 3) crossproduct(edge from tri, {x,y,z}-directin) + // this gives 3x3=9 more tests + + // move everything so that the boxcenter is in (0,0,0) + Point v0, v1, v2; + v0.x = mLeafVerts[0].x - center.x; + v1.x = mLeafVerts[1].x - center.x; + v2.x = mLeafVerts[2].x - center.x; + + // First, test overlap in the {x,y,z}-directions +#ifdef OPC_USE_FCOMI + // find min, max of the triangle in x-direction, and test for overlap in X + if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; + if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; + + // same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; + if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; + + // same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; + if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; +#else + float min,max; + // Find min, max of the triangle in x-direction, and test for overlap in X + FINDMINMAX(v0.x, v1.x, v2.x, min, max); + if(min>extents.x || max<-extents.x) return FALSE; + + // Same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + FINDMINMAX(v0.y, v1.y, v2.y, min, max); + if(min>extents.y || max<-extents.y) return FALSE; + + // Same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + FINDMINMAX(v0.z, v1.z, v2.z, min, max); + if(min>extents.z || max<-extents.z) return FALSE; +#endif + // 2) Test if the box intersects the plane of the triangle + // compute plane equation of triangle: normal*x+d=0 + // ### could be precomputed since we use the same leaf triangle several times + const Point e0 = v1 - v0; + const Point e1 = v2 - v1; + const Point normal = e0 ^ e1; + const float d = -normal|v0; + if(!planeBoxOverlap(normal, d, extents)) return FALSE; + + // 3) "Class III" tests + if(mFullPrimBoxTest) + { + IMPLEMENT_CLASS3_TESTS + } + return TRUE; +} + +//! A dedicated version where the box is constant +inline_ BOOL OBBCollider::TriBoxOverlap() +{ + // Stats + mNbVolumePrimTests++; + + // Hook + const Point& extents = mBoxExtents; + const Point& v0 = mLeafVerts[0]; + const Point& v1 = mLeafVerts[1]; + const Point& v2 = mLeafVerts[2]; + + // use separating axis theorem to test overlap between triangle and box + // need to test for overlap in these directions: + // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle + // we do not even need to test these) + // 2) normal of the triangle + // 3) crossproduct(edge from tri, {x,y,z}-directin) + // this gives 3x3=9 more tests + + // Box center is already in (0,0,0) + + // First, test overlap in the {x,y,z}-directions +#ifdef OPC_USE_FCOMI + // find min, max of the triangle in x-direction, and test for overlap in X + if(FCMin3(v0.x, v1.x, v2.x)>mBoxExtents.x) return FALSE; + if(FCMax3(v0.x, v1.x, v2.x)<-mBoxExtents.x) return FALSE; + + if(FCMin3(v0.y, v1.y, v2.y)>mBoxExtents.y) return FALSE; + if(FCMax3(v0.y, v1.y, v2.y)<-mBoxExtents.y) return FALSE; + + if(FCMin3(v0.z, v1.z, v2.z)>mBoxExtents.z) return FALSE; + if(FCMax3(v0.z, v1.z, v2.z)<-mBoxExtents.z) return FALSE; +#else + float min,max; + // Find min, max of the triangle in x-direction, and test for overlap in X + FINDMINMAX(v0.x, v1.x, v2.x, min, max); + if(min>mBoxExtents.x || max<-mBoxExtents.x) return FALSE; + + FINDMINMAX(v0.y, v1.y, v2.y, min, max); + if(min>mBoxExtents.y || max<-mBoxExtents.y) return FALSE; + + FINDMINMAX(v0.z, v1.z, v2.z, min, max); + if(min>mBoxExtents.z || max<-mBoxExtents.z) return FALSE; +#endif + // 2) Test if the box intersects the plane of the triangle + // compute plane equation of triangle: normal*x+d=0 + // ### could be precomputed since we use the same leaf triangle several times + const Point e0 = v1 - v0; + const Point e1 = v2 - v1; + const Point normal = e0 ^ e1; + const float d = -normal|v0; + if(!planeBoxOverlap(normal, d, mBoxExtents)) return FALSE; + + // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) + { + IMPLEMENT_CLASS3_TESTS + } + return TRUE; +} + +//! ...and another one, jeez +inline_ BOOL AABBCollider::TriBoxOverlap() +{ + // Stats + mNbVolumePrimTests++; + + // Hook + const Point& center = mBox.mCenter; + const Point& extents = mBox.mExtents; + + // use separating axis theorem to test overlap between triangle and box + // need to test for overlap in these directions: + // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle + // we do not even need to test these) + // 2) normal of the triangle + // 3) crossproduct(edge from tri, {x,y,z}-directin) + // this gives 3x3=9 more tests + + // move everything so that the boxcenter is in (0,0,0) + Point v0, v1, v2; + v0.x = mLeafVerts[0].x - center.x; + v1.x = mLeafVerts[1].x - center.x; + v2.x = mLeafVerts[2].x - center.x; + + // First, test overlap in the {x,y,z}-directions +#ifdef OPC_USE_FCOMI + // find min, max of the triangle in x-direction, and test for overlap in X + if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; + if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; + + // same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; + if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; + + // same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; + if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; +#else + float min,max; + // Find min, max of the triangle in x-direction, and test for overlap in X + FINDMINMAX(v0.x, v1.x, v2.x, min, max); + if(min>extents.x || max<-extents.x) return FALSE; + + // Same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + FINDMINMAX(v0.y, v1.y, v2.y, min, max); + if(min>extents.y || max<-extents.y) return FALSE; + + // Same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + FINDMINMAX(v0.z, v1.z, v2.z, min, max); + if(min>extents.z || max<-extents.z) return FALSE; +#endif + // 2) Test if the box intersects the plane of the triangle + // compute plane equation of triangle: normal*x+d=0 + // ### could be precomputed since we use the same leaf triangle several times + const Point e0 = v1 - v0; + const Point e1 = v2 - v1; + const Point normal = e0 ^ e1; + const float d = -normal|v0; + if(!planeBoxOverlap(normal, d, extents)) return FALSE; + + // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) + { + IMPLEMENT_CLASS3_TESTS + } + return TRUE; +} diff --git a/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h b/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h index 45b32d3c7..d1968e540 100644 --- a/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h +++ b/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h @@ -1,295 +1,295 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -//! if OPC_TRITRI_EPSILON_TEST is true then we do a check (if |dv|b) \ - { \ - const float c=a; \ - a=b; \ - b=c; \ - } - -//! Edge to edge test based on Franlin Antonio's gem: "Faster Line Segment Intersection", in Graphics Gems III, pp. 199-202 -#define EDGE_EDGE_TEST(V0, U0, U1) \ - Bx = U0[i0] - U1[i0]; \ - By = U0[i1] - U1[i1]; \ - Cx = V0[i0] - U0[i0]; \ - Cy = V0[i1] - U0[i1]; \ - f = Ay*Bx - Ax*By; \ - d = By*Cx - Bx*Cy; \ - if((f>0.0f && d>=0.0f && d<=f) || (f<0.0f && d<=0.0f && d>=f)) \ - { \ - const float e=Ax*Cy - Ay*Cx; \ - if(f>0.0f) \ - { \ - if(e>=0.0f && e<=f) return TRUE; \ - } \ - else \ - { \ - if(e<=0.0f && e>=f) return TRUE; \ - } \ - } - -//! TO BE DOCUMENTED -#define EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2) \ -{ \ - float Bx,By,Cx,Cy,d,f; \ - const float Ax = V1[i0] - V0[i0]; \ - const float Ay = V1[i1] - V0[i1]; \ - /* test edge U0,U1 against V0,V1 */ \ - EDGE_EDGE_TEST(V0, U0, U1); \ - /* test edge U1,U2 against V0,V1 */ \ - EDGE_EDGE_TEST(V0, U1, U2); \ - /* test edge U2,U1 against V0,V1 */ \ - EDGE_EDGE_TEST(V0, U2, U0); \ -} - -//! TO BE DOCUMENTED -#define POINT_IN_TRI(V0, U0, U1, U2) \ -{ \ - /* is T1 completly inside T2? */ \ - /* check if V0 is inside tri(U0,U1,U2) */ \ - float a = U1[i1] - U0[i1]; \ - float b = -(U1[i0] - U0[i0]); \ - float c = -a*U0[i0] - b*U0[i1]; \ - float d0 = a*V0[i0] + b*V0[i1] + c; \ - \ - a = U2[i1] - U1[i1]; \ - b = -(U2[i0] - U1[i0]); \ - c = -a*U1[i0] - b*U1[i1]; \ - const float d1 = a*V0[i0] + b*V0[i1] + c; \ - \ - a = U0[i1] - U2[i1]; \ - b = -(U0[i0] - U2[i0]); \ - c = -a*U2[i0] - b*U2[i1]; \ - const float d2 = a*V0[i0] + b*V0[i1] + c; \ - if(d0*d1>0.0f) \ - { \ - if(d0*d2>0.0f) return TRUE; \ - } \ -} - -//! TO BE DOCUMENTED -BOOL CoplanarTriTri(const Point& n, const Point& v0, const Point& v1, const Point& v2, const Point& u0, const Point& u1, const Point& u2) -{ - float A[3]; - short i0,i1; - /* first project onto an axis-aligned plane, that maximizes the area */ - /* of the triangles, compute indices: i0,i1. */ - A[0] = fabsf(n[0]); - A[1] = fabsf(n[1]); - A[2] = fabsf(n[2]); - if(A[0]>A[1]) - { - if(A[0]>A[2]) - { - i0=1; /* A[0] is greatest */ - i1=2; - } - else - { - i0=0; /* A[2] is greatest */ - i1=1; - } - } - else /* A[0]<=A[1] */ - { - if(A[2]>A[1]) - { - i0=0; /* A[2] is greatest */ - i1=1; - } - else - { - i0=0; /* A[1] is greatest */ - i1=2; - } - } - - /* test all edges of triangle 1 against the edges of triangle 2 */ - EDGE_AGAINST_TRI_EDGES(v0, v1, u0, u1, u2); - EDGE_AGAINST_TRI_EDGES(v1, v2, u0, u1, u2); - EDGE_AGAINST_TRI_EDGES(v2, v0, u0, u1, u2); - - /* finally, test if tri1 is totally contained in tri2 or vice versa */ - POINT_IN_TRI(v0, u0, u1, u2); - POINT_IN_TRI(u0, v0, v1, v2); - - return FALSE; -} - -//! TO BE DOCUMENTED -#define NEWCOMPUTE_INTERVALS(VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, A, B, C, X0, X1) \ -{ \ - if(D0D1>0.0f) \ - { \ - /* here we know that D0D2<=0.0 */ \ - /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ - A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ - } \ - else if(D0D2>0.0f) \ - { \ - /* here we know that d0d1<=0.0 */ \ - A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ - } \ - else if(D1*D2>0.0f || D0!=0.0f) \ - { \ - /* here we know that d0d1<=0.0 or that D0!=0.0 */ \ - A=VV0; B=(VV1 - VV0)*D0; C=(VV2 - VV0)*D0; X0=D0 - D1; X1=D0 - D2; \ - } \ - else if(D1!=0.0f) \ - { \ - A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ - } \ - else if(D2!=0.0f) \ - { \ - A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ - } \ - else \ - { \ - /* triangles are coplanar */ \ - return CoplanarTriTri(N1, V0, V1, V2, U0, U1, U2); \ - } \ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Triangle/triangle intersection test routine, - * by Tomas Moller, 1997. - * See article "A Fast Triangle-Triangle Intersection Test", - * Journal of Graphics Tools, 2(2), 1997 - * - * Updated June 1999: removed the divisions -- a little faster now! - * Updated October 1999: added {} to CROSS and SUB macros - * - * int NoDivTriTriIsect(float V0[3],float V1[3],float V2[3], - * float U0[3],float U1[3],float U2[3]) - * - * \param V0 [in] triangle 0, vertex 0 - * \param V1 [in] triangle 0, vertex 1 - * \param V2 [in] triangle 0, vertex 2 - * \param U0 [in] triangle 1, vertex 0 - * \param U1 [in] triangle 1, vertex 1 - * \param U2 [in] triangle 1, vertex 2 - * \return true if triangles overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBTreeCollider::TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2) -{ - // Stats - mNbPrimPrimTests++; - - // Compute plane equation of triangle(V0,V1,V2) - Point E1 = V1 - V0; - Point E2 = V2 - V0; - const Point N1 = E1 ^ E2; - const float d1 =-N1 | V0; - // Plane equation 1: N1.X+d1=0 - - // Put U0,U1,U2 into plane equation 1 to compute signed distances to the plane - float du0 = (N1|U0) + d1; - float du1 = (N1|U1) + d1; - float du2 = (N1|U2) + d1; - - // Coplanarity robustness check -#ifdef OPC_TRITRI_EPSILON_TEST - if(fabsf(du0)0.0f && du0du2>0.0f) // same sign on all of them + not equal 0 ? - return FALSE; // no intersection occurs - - // Compute plane of triangle (U0,U1,U2) - E1 = U1 - U0; - E2 = U2 - U0; - const Point N2 = E1 ^ E2; - const float d2=-N2 | U0; - // plane equation 2: N2.X+d2=0 - - // put V0,V1,V2 into plane equation 2 - float dv0 = (N2|V0) + d2; - float dv1 = (N2|V1) + d2; - float dv2 = (N2|V2) + d2; - -#ifdef OPC_TRITRI_EPSILON_TEST - if(fabsf(dv0)0.0f && dv0dv2>0.0f) // same sign on all of them + not equal 0 ? - return FALSE; // no intersection occurs - - // Compute direction of intersection line - const Point D = N1^N2; - - // Compute and index to the largest component of D - float max=fabsf(D[0]); - short index=0; - float bb=fabsf(D[1]); - float cc=fabsf(D[2]); - if(bb>max) max=bb,index=1; - if(cc>max) max=cc,index=2; - - // This is the simplified projection onto L - const float vp0 = V0[index]; - const float vp1 = V1[index]; - const float vp2 = V2[index]; - - const float up0 = U0[index]; - const float up1 = U1[index]; - const float up2 = U2[index]; - - // Compute interval for triangle 1 - float a,b,c,x0,x1; - NEWCOMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,a,b,c,x0,x1); - - // Compute interval for triangle 2 - float d,e,f,y0,y1; - NEWCOMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,d,e,f,y0,y1); - - const float xx=x0*x1; - const float yy=y0*y1; - const float xxyy=xx*yy; - - float isect1[2], isect2[2]; - - float tmp=a*xxyy; - isect1[0]=tmp+b*x1*yy; - isect1[1]=tmp+c*x0*yy; - - tmp=d*xxyy; - isect2[0]=tmp+e*xx*y1; - isect2[1]=tmp+f*xx*y0; - - SORT(isect1[0],isect1[1]); - SORT(isect2[0],isect2[1]); - - if(isect1[1]b) \ + { \ + const float c=a; \ + a=b; \ + b=c; \ + } + +//! Edge to edge test based on Franlin Antonio's gem: "Faster Line Segment Intersection", in Graphics Gems III, pp. 199-202 +#define EDGE_EDGE_TEST(V0, U0, U1) \ + Bx = U0[i0] - U1[i0]; \ + By = U0[i1] - U1[i1]; \ + Cx = V0[i0] - U0[i0]; \ + Cy = V0[i1] - U0[i1]; \ + f = Ay*Bx - Ax*By; \ + d = By*Cx - Bx*Cy; \ + if((f>0.0f && d>=0.0f && d<=f) || (f<0.0f && d<=0.0f && d>=f)) \ + { \ + const float e=Ax*Cy - Ay*Cx; \ + if(f>0.0f) \ + { \ + if(e>=0.0f && e<=f) return TRUE; \ + } \ + else \ + { \ + if(e<=0.0f && e>=f) return TRUE; \ + } \ + } + +//! TO BE DOCUMENTED +#define EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2) \ +{ \ + float Bx,By,Cx,Cy,d,f; \ + const float Ax = V1[i0] - V0[i0]; \ + const float Ay = V1[i1] - V0[i1]; \ + /* test edge U0,U1 against V0,V1 */ \ + EDGE_EDGE_TEST(V0, U0, U1); \ + /* test edge U1,U2 against V0,V1 */ \ + EDGE_EDGE_TEST(V0, U1, U2); \ + /* test edge U2,U1 against V0,V1 */ \ + EDGE_EDGE_TEST(V0, U2, U0); \ +} + +//! TO BE DOCUMENTED +#define POINT_IN_TRI(V0, U0, U1, U2) \ +{ \ + /* is T1 completly inside T2? */ \ + /* check if V0 is inside tri(U0,U1,U2) */ \ + float a = U1[i1] - U0[i1]; \ + float b = -(U1[i0] - U0[i0]); \ + float c = -a*U0[i0] - b*U0[i1]; \ + float d0 = a*V0[i0] + b*V0[i1] + c; \ + \ + a = U2[i1] - U1[i1]; \ + b = -(U2[i0] - U1[i0]); \ + c = -a*U1[i0] - b*U1[i1]; \ + const float d1 = a*V0[i0] + b*V0[i1] + c; \ + \ + a = U0[i1] - U2[i1]; \ + b = -(U0[i0] - U2[i0]); \ + c = -a*U2[i0] - b*U2[i1]; \ + const float d2 = a*V0[i0] + b*V0[i1] + c; \ + if(d0*d1>0.0f) \ + { \ + if(d0*d2>0.0f) return TRUE; \ + } \ +} + +//! TO BE DOCUMENTED +BOOL CoplanarTriTri(const Point& n, const Point& v0, const Point& v1, const Point& v2, const Point& u0, const Point& u1, const Point& u2) +{ + float A[3]; + short i0,i1; + /* first project onto an axis-aligned plane, that maximizes the area */ + /* of the triangles, compute indices: i0,i1. */ + A[0] = fabsf(n[0]); + A[1] = fabsf(n[1]); + A[2] = fabsf(n[2]); + if(A[0]>A[1]) + { + if(A[0]>A[2]) + { + i0=1; /* A[0] is greatest */ + i1=2; + } + else + { + i0=0; /* A[2] is greatest */ + i1=1; + } + } + else /* A[0]<=A[1] */ + { + if(A[2]>A[1]) + { + i0=0; /* A[2] is greatest */ + i1=1; + } + else + { + i0=0; /* A[1] is greatest */ + i1=2; + } + } + + /* test all edges of triangle 1 against the edges of triangle 2 */ + EDGE_AGAINST_TRI_EDGES(v0, v1, u0, u1, u2); + EDGE_AGAINST_TRI_EDGES(v1, v2, u0, u1, u2); + EDGE_AGAINST_TRI_EDGES(v2, v0, u0, u1, u2); + + /* finally, test if tri1 is totally contained in tri2 or vice versa */ + POINT_IN_TRI(v0, u0, u1, u2); + POINT_IN_TRI(u0, v0, v1, v2); + + return FALSE; +} + +//! TO BE DOCUMENTED +#define NEWCOMPUTE_INTERVALS(VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, A, B, C, X0, X1) \ +{ \ + if(D0D1>0.0f) \ + { \ + /* here we know that D0D2<=0.0 */ \ + /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ + A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ + } \ + else if(D0D2>0.0f) \ + { \ + /* here we know that d0d1<=0.0 */ \ + A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ + } \ + else if(D1*D2>0.0f || D0!=0.0f) \ + { \ + /* here we know that d0d1<=0.0 or that D0!=0.0 */ \ + A=VV0; B=(VV1 - VV0)*D0; C=(VV2 - VV0)*D0; X0=D0 - D1; X1=D0 - D2; \ + } \ + else if(D1!=0.0f) \ + { \ + A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ + } \ + else if(D2!=0.0f) \ + { \ + A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ + } \ + else \ + { \ + /* triangles are coplanar */ \ + return CoplanarTriTri(N1, V0, V1, V2, U0, U1, U2); \ + } \ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Triangle/triangle intersection test routine, + * by Tomas Moller, 1997. + * See article "A Fast Triangle-Triangle Intersection Test", + * Journal of Graphics Tools, 2(2), 1997 + * + * Updated June 1999: removed the divisions -- a little faster now! + * Updated October 1999: added {} to CROSS and SUB macros + * + * int NoDivTriTriIsect(float V0[3],float V1[3],float V2[3], + * float U0[3],float U1[3],float U2[3]) + * + * \param V0 [in] triangle 0, vertex 0 + * \param V1 [in] triangle 0, vertex 1 + * \param V2 [in] triangle 0, vertex 2 + * \param U0 [in] triangle 1, vertex 0 + * \param U1 [in] triangle 1, vertex 1 + * \param U2 [in] triangle 1, vertex 2 + * \return true if triangles overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBTreeCollider::TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2) +{ + // Stats + mNbPrimPrimTests++; + + // Compute plane equation of triangle(V0,V1,V2) + Point E1 = V1 - V0; + Point E2 = V2 - V0; + const Point N1 = E1 ^ E2; + const float d1 =-N1 | V0; + // Plane equation 1: N1.X+d1=0 + + // Put U0,U1,U2 into plane equation 1 to compute signed distances to the plane + float du0 = (N1|U0) + d1; + float du1 = (N1|U1) + d1; + float du2 = (N1|U2) + d1; + + // Coplanarity robustness check +#ifdef OPC_TRITRI_EPSILON_TEST + if(fabsf(du0)0.0f && du0du2>0.0f) // same sign on all of them + not equal 0 ? + return FALSE; // no intersection occurs + + // Compute plane of triangle (U0,U1,U2) + E1 = U1 - U0; + E2 = U2 - U0; + const Point N2 = E1 ^ E2; + const float d2=-N2 | U0; + // plane equation 2: N2.X+d2=0 + + // put V0,V1,V2 into plane equation 2 + float dv0 = (N2|V0) + d2; + float dv1 = (N2|V1) + d2; + float dv2 = (N2|V2) + d2; + +#ifdef OPC_TRITRI_EPSILON_TEST + if(fabsf(dv0)0.0f && dv0dv2>0.0f) // same sign on all of them + not equal 0 ? + return FALSE; // no intersection occurs + + // Compute direction of intersection line + const Point D = N1^N2; + + // Compute and index to the largest component of D + float max=fabsf(D[0]); + short index=0; + float bb=fabsf(D[1]); + float cc=fabsf(D[2]); + if(bb>max) max=bb,index=1; + if(cc>max) max=cc,index=2; + + // This is the simplified projection onto L + const float vp0 = V0[index]; + const float vp1 = V1[index]; + const float vp2 = V2[index]; + + const float up0 = U0[index]; + const float up1 = U1[index]; + const float up2 = U2[index]; + + // Compute interval for triangle 1 + float a,b,c,x0,x1; + NEWCOMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,a,b,c,x0,x1); + + // Compute interval for triangle 2 + float d,e,f,y0,y1; + NEWCOMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,d,e,f,y0,y1); + + const float xx=x0*x1; + const float yy=y0*y1; + const float xxyy=xx*yy; + + float isect1[2], isect2[2]; + + float tmp=a*xxyy; + isect1[0]=tmp+b*x1*yy; + isect1[1]=tmp+c*x0*yy; + + tmp=d*xxyy; + isect2[0]=tmp+e*xx*y1; + isect2[1]=tmp+f*xx*y0; + + SORT(isect1[0],isect1[1]); + SORT(isect2[0],isect2[1]); + + if(isect1[1]HasPosLeaf()) mTouchedPrimitives->Add(node->GetPosPrimitive()); \ - else _Dump(node->GetPos()); \ - \ - if(ContactFound()) return; \ - \ - if(node->HasNegLeaf()) mTouchedPrimitives->Add(node->GetNegPrimitive()); \ - else _Dump(node->GetNeg()); \ -} - -#define IMPLEMENT_LEAFDUMP(type) \ -void VolumeCollider::_Dump(const type* node) \ -{ \ - if(node->IsLeaf()) \ - { \ - mTouchedPrimitives->Add(node->GetPrimitive()); \ - } \ - else \ - { \ - _Dump(node->GetPos()); \ - \ - if(ContactFound()) return; \ - \ - _Dump(node->GetNeg()); \ - } \ -} - -IMPLEMENT_NOLEAFDUMP(AABBNoLeafNode) -IMPLEMENT_NOLEAFDUMP(AABBQuantizedNoLeafNode) - -IMPLEMENT_LEAFDUMP(AABBCollisionNode) -IMPLEMENT_LEAFDUMP(AABBQuantizedNode) +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base volume collider class. + * \file OPC_VolumeCollider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains the abstract class for volume colliders. + * + * \class VolumeCollider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +VolumeCollider::VolumeCollider() : + mTouchedPrimitives (null), + mNbVolumeBVTests (0), + mNbVolumePrimTests (0) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +VolumeCollider::~VolumeCollider() +{ + mTouchedPrimitives = null; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* VolumeCollider::ValidateSettings() +{ + return null; +} + +// Pretty dumb way to dump - to do better - one day... + +#define IMPLEMENT_NOLEAFDUMP(type) \ +void VolumeCollider::_Dump(const type* node) \ +{ \ + if(node->HasPosLeaf()) mTouchedPrimitives->Add(node->GetPosPrimitive()); \ + else _Dump(node->GetPos()); \ + \ + if(ContactFound()) return; \ + \ + if(node->HasNegLeaf()) mTouchedPrimitives->Add(node->GetNegPrimitive()); \ + else _Dump(node->GetNeg()); \ +} + +#define IMPLEMENT_LEAFDUMP(type) \ +void VolumeCollider::_Dump(const type* node) \ +{ \ + if(node->IsLeaf()) \ + { \ + mTouchedPrimitives->Add(node->GetPrimitive()); \ + } \ + else \ + { \ + _Dump(node->GetPos()); \ + \ + if(ContactFound()) return; \ + \ + _Dump(node->GetNeg()); \ + } \ +} + +IMPLEMENT_NOLEAFDUMP(AABBNoLeafNode) +IMPLEMENT_NOLEAFDUMP(AABBQuantizedNoLeafNode) + +IMPLEMENT_LEAFDUMP(AABBCollisionNode) +IMPLEMENT_LEAFDUMP(AABBQuantizedNode) diff --git a/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h b/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h index 0306c35f9..e0eb6267a 100644 --- a/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h +++ b/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h @@ -1,147 +1,147 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base volume collider class. - * \file OPC_VolumeCollider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_VOLUMECOLLIDER_H__ -#define __OPC_VOLUMECOLLIDER_H__ - - struct OPCODE_API VolumeCache - { - VolumeCache() : Model(null) {} - ~VolumeCache() {} - - Container TouchedPrimitives; //!< Indices of touched primitives - const BaseModel* Model; //!< Owner - }; - - class OPCODE_API VolumeCollider : public Collider - { - public: - // Constructor / Destructor - VolumeCollider(); - virtual ~VolumeCollider() = 0; - - // Collision report - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of touched primitives after a collision query. - * \see GetContactStatus() - * \see GetTouchedPrimitives() - * \return the number of touched primitives - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetNbEntries() : 0; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the list of touched primitives after a collision query. - * \see GetContactStatus() - * \see GetNbTouchedPrimitives() - * \return the list of touched primitives (primitive indices) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const udword* GetTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetEntries() : null; } - - // Stats - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Volume-BV overlap tests after a collision query. - * \see GetNbVolumePrimTests() - * \return the number of Volume-BV tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbVolumeBVTests() const { return mNbVolumeBVTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Volume-Triangle overlap tests after a collision query. - * \see GetNbVolumeBVTests() - * \return the number of Volume-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbVolumePrimTests() const { return mNbVolumePrimTests; } - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Touched primitives - Container* mTouchedPrimitives; //!< List of touched primitives - - // Dequantization coeffs - Point mCenterCoeff; - Point mExtentsCoeff; - // Stats - udword mNbVolumeBVTests; //!< Number of Volume-BV tests - udword mNbVolumePrimTests; //!< Number of Volume-Primitive tests - // Internal methods - void _Dump(const AABBCollisionNode* node); - void _Dump(const AABBNoLeafNode* node); - void _Dump(const AABBQuantizedNode* node); - void _Dump(const AABBQuantizedNoLeafNode* node); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Initializes a query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) inline_ void InitQuery() - { - // Reset stats & contact status - mNbVolumeBVTests = 0; - mNbVolumePrimTests = 0; - Collider::InitQuery(); - } - - inline_ BOOL IsCacheValid(VolumeCache& cache) - { - // We're going to do a volume-vs-model query. - if(cache.Model!=mCurrentModel) - { - // Cached list was for another model so we can't keep it - // Keep track of new owner and reset cache - cache.Model = mCurrentModel; - return FALSE; - } - else - { - // Same models, no problem - return TRUE; - } - } - }; - -#endif // __OPC_VOLUMECOLLIDER_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base volume collider class. + * \file OPC_VolumeCollider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_VOLUMECOLLIDER_H__ +#define __OPC_VOLUMECOLLIDER_H__ + + struct OPCODE_API VolumeCache + { + VolumeCache() : Model(null) {} + ~VolumeCache() {} + + Container TouchedPrimitives; //!< Indices of touched primitives + const BaseModel* Model; //!< Owner + }; + + class OPCODE_API VolumeCollider : public Collider + { + public: + // Constructor / Destructor + VolumeCollider(); + virtual ~VolumeCollider() = 0; + + // Collision report + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of touched primitives after a collision query. + * \see GetContactStatus() + * \see GetTouchedPrimitives() + * \return the number of touched primitives + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetNbEntries() : 0; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the list of touched primitives after a collision query. + * \see GetContactStatus() + * \see GetNbTouchedPrimitives() + * \return the list of touched primitives (primitive indices) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const udword* GetTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetEntries() : null; } + + // Stats + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Volume-BV overlap tests after a collision query. + * \see GetNbVolumePrimTests() + * \return the number of Volume-BV tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbVolumeBVTests() const { return mNbVolumeBVTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Volume-Triangle overlap tests after a collision query. + * \see GetNbVolumeBVTests() + * \return the number of Volume-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbVolumePrimTests() const { return mNbVolumePrimTests; } + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Touched primitives + Container* mTouchedPrimitives; //!< List of touched primitives + + // Dequantization coeffs + Point mCenterCoeff; + Point mExtentsCoeff; + // Stats + udword mNbVolumeBVTests; //!< Number of Volume-BV tests + udword mNbVolumePrimTests; //!< Number of Volume-Primitive tests + // Internal methods + void _Dump(const AABBCollisionNode* node); + void _Dump(const AABBNoLeafNode* node); + void _Dump(const AABBQuantizedNode* node); + void _Dump(const AABBQuantizedNoLeafNode* node); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Initializes a query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) inline_ void InitQuery() + { + // Reset stats & contact status + mNbVolumeBVTests = 0; + mNbVolumePrimTests = 0; + Collider::InitQuery(); + } + + inline_ BOOL IsCacheValid(VolumeCache& cache) + { + // We're going to do a volume-vs-model query. + if(cache.Model!=mCurrentModel) + { + // Cached list was for another model so we can't keep it + // Keep track of new owner and reset cache + cache.Model = mCurrentModel; + return FALSE; + } + else + { + // Same models, no problem + return TRUE; + } + } + }; + +#endif // __OPC_VOLUMECOLLIDER_H__ diff --git a/Extras/CDTestFramework/Opcode/Opcode.cpp b/Extras/CDTestFramework/Opcode/Opcode.cpp index eed527e75..68511a63c 100644 --- a/Extras/CDTestFramework/Opcode/Opcode.cpp +++ b/Extras/CDTestFramework/Opcode/Opcode.cpp @@ -1,74 +1,74 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main file for Opcode.dll. - * \file Opcode.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* - Finding a good name is difficult! - Here's the draft for this lib.... Spooky, uh? - - VOID? Very Optimized Interference Detection - ZOID? Zappy's Optimized Interference Detection - CID? Custom/Clever Interference Detection - AID / ACID! Accurate Interference Detection - QUID? Quick Interference Detection - RIDE? Realtime Interference DEtection - WIDE? Wicked Interference DEtection (....) - GUID! - KID ! k-dop interference detection :) - OPCODE! OPtimized COllision DEtection -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -bool Opcode::InitOpcode() -{ - Log("// Initializing OPCODE\n\n"); -// LogAPIInfo(); - return true; -} - -void ReleasePruningSorters(); -bool Opcode::CloseOpcode() -{ - Log("// Closing OPCODE\n\n"); - - ReleasePruningSorters(); - - return true; -} - -#ifdef ICE_MAIN - -void ModuleAttach(HINSTANCE hinstance) -{ -} - -void ModuleDetach() -{ -} - +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main file for Opcode.dll. + * \file Opcode.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* + Finding a good name is difficult! + Here's the draft for this lib.... Spooky, uh? + + VOID? Very Optimized Interference Detection + ZOID? Zappy's Optimized Interference Detection + CID? Custom/Clever Interference Detection + AID / ACID! Accurate Interference Detection + QUID? Quick Interference Detection + RIDE? Realtime Interference DEtection + WIDE? Wicked Interference DEtection (....) + GUID! + KID ! k-dop interference detection :) + OPCODE! OPtimized COllision DEtection +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +bool Opcode::InitOpcode() +{ + Log("// Initializing OPCODE\n\n"); +// LogAPIInfo(); + return true; +} + +void ReleasePruningSorters(); +bool Opcode::CloseOpcode() +{ + Log("// Closing OPCODE\n\n"); + + ReleasePruningSorters(); + + return true; +} + +#ifdef ICE_MAIN + +void ModuleAttach(HINSTANCE hinstance) +{ +} + +void ModuleDetach() +{ +} + #endif \ No newline at end of file diff --git a/Extras/CDTestFramework/Opcode/Opcode.dsp b/Extras/CDTestFramework/Opcode/Opcode.dsp index 74d3b658d..ddadef620 100644 --- a/Extras/CDTestFramework/Opcode/Opcode.dsp +++ b/Extras/CDTestFramework/Opcode/Opcode.dsp @@ -1,517 +1,517 @@ -# Microsoft Developer Studio Project File - Name="Opcode" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=Opcode - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "Opcode.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "Opcode.mak" CFG="Opcode - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Opcode - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "Opcode - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Opcode - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /QIfist /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 /nologo /dll /machine:I386 -# SUBTRACT LINK32 /debug - -!ELSEIF "$(CFG)" == "Opcode - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /QIfist /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug\Opcode_D.dll" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "Opcode - Win32 Release" -# Name "Opcode - Win32 Debug" -# Begin Group "API" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\OPC_BaseModel.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_BaseModel.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_HybridModel.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_HybridModel.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_IceHook.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Model.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Model.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Settings.h -# End Source File -# Begin Source File - -SOURCE=.\Opcode.cpp -# End Source File -# Begin Source File - -SOURCE=.\Opcode.h -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.cpp -# ADD CPP /Yc"stdafx.h" -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Group -# Begin Group "Trees" - -# PROP Default_Filter "" -# Begin Group "Collision queries" - -# PROP Default_Filter "" -# Begin Group "Base colliders" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\OPC_Collider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Collider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_VolumeCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_VolumeCollider.h -# End Source File -# End Group -# Begin Group "Standard colliders" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\OPC_AABBCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_AABBCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_OBBCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_OBBCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeCollider.h -# End Source File -# End Group -# End Group -# Begin Source File - -SOURCE=.\OPC_AABBTree.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_AABBTree.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Common.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Common.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_MeshInterface.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_MeshInterface.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_OptimizedTree.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_OptimizedTree.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeBuilders.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeBuilders.h -# End Source File -# End Group -# Begin Group "Overlap tests" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\OPC_BoxBoxOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TriBoxOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TriTriOverlap.h -# End Source File -# End Group -# Begin Group "SweepAndPrune" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\OPC_BoxPruning.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_BoxPruning.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SweepAndPrune.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_SweepAndPrune.h -# End Source File -# End Group -# Begin Group "Usages" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\OPC_Picking.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Picking.h -# End Source File -# End Group -# Begin Group "Ice" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\Ice\IceAABB.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceAABB.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceAxes.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceBoundingSphere.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceContainer.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceContainer.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceFPU.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceHPoint.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceHPoint.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceIndexedTriangle.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceIndexedTriangle.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceLSS.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix3x3.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix3x3.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix4x4.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix4x4.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMemoryMacros.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceOBB.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceOBB.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePairs.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePlane.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePlane.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePoint.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePoint.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePreprocessor.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRandom.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRandom.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRay.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRay.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRevisitedRadix.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRevisitedRadix.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceSegment.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceSegment.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTriangle.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTriangle.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTrilist.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTypes.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceUtils.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceUtils.h -# End Source File -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="Opcode" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=Opcode - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Opcode.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Opcode.mak" CFG="Opcode - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Opcode - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "Opcode - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Opcode - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /QIfist /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40c /d "NDEBUG" +# ADD RSC /l 0x40c /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 /nologo /dll /machine:I386 +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "Opcode - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /QIfist /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40c /d "_DEBUG" +# ADD RSC /l 0x40c /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug\Opcode_D.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Opcode - Win32 Release" +# Name "Opcode - Win32 Debug" +# Begin Group "API" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_BaseModel.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_BaseModel.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_HybridModel.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_HybridModel.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_IceHook.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_Model.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Model.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_Settings.h +# End Source File +# Begin Source File + +SOURCE=.\Opcode.cpp +# End Source File +# Begin Source File + +SOURCE=.\Opcode.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Trees" + +# PROP Default_Filter "" +# Begin Group "Collision queries" + +# PROP Default_Filter "" +# Begin Group "Base colliders" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_Collider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Collider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_VolumeCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_VolumeCollider.h +# End Source File +# End Group +# Begin Group "Standard colliders" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_AABBCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_AABBCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_OBBCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_OBBCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeCollider.h +# End Source File +# End Group +# End Group +# Begin Source File + +SOURCE=.\OPC_AABBTree.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_AABBTree.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_Common.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Common.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_MeshInterface.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_MeshInterface.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_OptimizedTree.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_OptimizedTree.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeBuilders.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeBuilders.h +# End Source File +# End Group +# Begin Group "Overlap tests" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_BoxBoxOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TriBoxOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TriTriOverlap.h +# End Source File +# End Group +# Begin Group "SweepAndPrune" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_BoxPruning.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_BoxPruning.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SweepAndPrune.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_SweepAndPrune.h +# End Source File +# End Group +# Begin Group "Usages" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_Picking.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Picking.h +# End Source File +# End Group +# Begin Group "Ice" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\Ice\IceAABB.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceAABB.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceAxes.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceBoundingSphere.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceContainer.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceContainer.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceFPU.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceHPoint.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceHPoint.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceIndexedTriangle.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceIndexedTriangle.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceLSS.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix3x3.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix3x3.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix4x4.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix4x4.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMemoryMacros.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceOBB.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceOBB.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePairs.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePlane.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePlane.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePoint.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePoint.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePreprocessor.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRandom.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRandom.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRay.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRay.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRevisitedRadix.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRevisitedRadix.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceSegment.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceSegment.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTriangle.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTriangle.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTrilist.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTypes.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceUtils.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceUtils.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/Extras/CDTestFramework/Opcode/Opcode.dsw b/Extras/CDTestFramework/Opcode/Opcode.dsw index 6d8d33f9c..bc37a2ceb 100644 --- a/Extras/CDTestFramework/Opcode/Opcode.dsw +++ b/Extras/CDTestFramework/Opcode/Opcode.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "Opcode"=.\Opcode.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Opcode"=.\Opcode.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Extras/CDTestFramework/Opcode/Opcode.h b/Extras/CDTestFramework/Opcode/Opcode.h index c0cd1c53f..094b57945 100644 --- a/Extras/CDTestFramework/Opcode/Opcode.h +++ b/Extras/CDTestFramework/Opcode/Opcode.h @@ -1,99 +1,99 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main file for Opcode.dll. - * \file Opcode.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPCODE_H__ -#define __OPCODE_H__ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compilation messages -#if defined(OPCODE_EXPORTS) - #pragma message("Compiling OPCODE") -#elif !defined(OPCODE_EXPORTS) - #pragma message("Using OPCODE") - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Automatic linking - #ifndef BAN_OPCODE_AUTOLINK - #ifdef _DEBUG - #pragma comment(lib, "Opcode_D.lib") - #else - #pragma comment(lib, "Opcode.lib") - #endif - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Preprocessor -#ifndef ICE_NO_DLL - #ifdef OPCODE_EXPORTS - #define OPCODE_API __declspec(dllexport) - #else - #define OPCODE_API __declspec(dllimport) - #endif -#else - #define OPCODE_API -#endif - - #include "OPC_IceHook.h" - - namespace Opcode - { - // Bulk-of-the-work - #include "OPC_Settings.h" - #include "OPC_Common.h" - #include "OPC_MeshInterface.h" - // Builders - #include "OPC_TreeBuilders.h" - // Trees - #include "OPC_AABBTree.h" - #include "OPC_OptimizedTree.h" - // Models - #include "OPC_BaseModel.h" - #include "OPC_Model.h" - #include "OPC_HybridModel.h" - // Colliders - #include "OPC_Collider.h" - #include "OPC_VolumeCollider.h" - #include "OPC_TreeCollider.h" - #include "OPC_RayCollider.h" - #include "OPC_SphereCollider.h" - #include "OPC_OBBCollider.h" - #include "OPC_AABBCollider.h" - #include "OPC_LSSCollider.h" - #include "OPC_PlanesCollider.h" - // Usages - #include "OPC_Picking.h" - // Sweep-and-prune - #include "OPC_BoxPruning.h" - #include "OPC_SweepAndPrune.h" - #include "OPC_ArraySAP.h" - - FUNCTION OPCODE_API bool InitOpcode(); - FUNCTION OPCODE_API bool CloseOpcode(); - } - -#endif // __OPCODE_H__ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main file for Opcode.dll. + * \file Opcode.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPCODE_H__ +#define __OPCODE_H__ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compilation messages +#if defined(OPCODE_EXPORTS) + #pragma message("Compiling OPCODE") +#elif !defined(OPCODE_EXPORTS) + #pragma message("Using OPCODE") + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Automatic linking + #ifndef BAN_OPCODE_AUTOLINK + #ifdef _DEBUG + #pragma comment(lib, "Opcode_D.lib") + #else + #pragma comment(lib, "Opcode.lib") + #endif + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Preprocessor +#ifndef ICE_NO_DLL + #ifdef OPCODE_EXPORTS + #define OPCODE_API __declspec(dllexport) + #else + #define OPCODE_API __declspec(dllimport) + #endif +#else + #define OPCODE_API +#endif + + #include "OPC_IceHook.h" + + namespace Opcode + { + // Bulk-of-the-work + #include "OPC_Settings.h" + #include "OPC_Common.h" + #include "OPC_MeshInterface.h" + // Builders + #include "OPC_TreeBuilders.h" + // Trees + #include "OPC_AABBTree.h" + #include "OPC_OptimizedTree.h" + // Models + #include "OPC_BaseModel.h" + #include "OPC_Model.h" + #include "OPC_HybridModel.h" + // Colliders + #include "OPC_Collider.h" + #include "OPC_VolumeCollider.h" + #include "OPC_TreeCollider.h" + #include "OPC_RayCollider.h" + #include "OPC_SphereCollider.h" + #include "OPC_OBBCollider.h" + #include "OPC_AABBCollider.h" + #include "OPC_LSSCollider.h" + #include "OPC_PlanesCollider.h" + // Usages + #include "OPC_Picking.h" + // Sweep-and-prune + #include "OPC_BoxPruning.h" + #include "OPC_SweepAndPrune.h" + #include "OPC_ArraySAP.h" + + FUNCTION OPCODE_API bool InitOpcode(); + FUNCTION OPCODE_API bool CloseOpcode(); + } + +#endif // __OPCODE_H__ diff --git a/Extras/CDTestFramework/Opcode/Opcode.sln b/Extras/CDTestFramework/Opcode/Opcode.sln index 4fb8db495..269cc7db8 100644 --- a/Extras/CDTestFramework/Opcode/Opcode.sln +++ b/Extras/CDTestFramework/Opcode/Opcode.sln @@ -1,21 +1,21 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Opcode", "Opcode.vcproj", "{4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Debug.ActiveCfg = Debug|Win32 - {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Debug.Build.0 = Debug|Win32 - {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Release.ActiveCfg = Release|Win32 - {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Opcode", "Opcode.vcproj", "{4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Debug.ActiveCfg = Debug|Win32 + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Debug.Build.0 = Debug|Win32 + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Release.ActiveCfg = Release|Win32 + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/Extras/CDTestFramework/Opcode/Opcode.vcproj b/Extras/CDTestFramework/Opcode/Opcode.vcproj index 04838f37f..892cf8396 100644 --- a/Extras/CDTestFramework/Opcode/Opcode.vcproj +++ b/Extras/CDTestFramework/Opcode/Opcode.vcproj @@ -1,1416 +1,1416 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CDTestFramework/Opcode/ReadMe.txt b/Extras/CDTestFramework/Opcode/ReadMe.txt index 138f06cdc..01ad45bd0 100644 --- a/Extras/CDTestFramework/Opcode/ReadMe.txt +++ b/Extras/CDTestFramework/Opcode/ReadMe.txt @@ -1,188 +1,188 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - - - OPCODE distribution 1.3 (june 2003) - ----------------------- - - New in Opcode 1.3: - - fixed the divide by 0 bug that was happening when all centers where located on a coordinate axis (thanks to Jorrit T) - - linearized "complete" vanilla AABB trees - - ANSI-compliant "for" loops (for the ones porting it to Linux...) - - callbacks & pointers moved to mesh interface - - support for triangle & vertex strides - - optimized the sphere-triangle overlap code a bit - - dynamic trees (refit) - - more builders - - ValidateSubdivision in builders - - LSS collider - - primitive-bv tests can now be skipped in most volume queries - - temporal coherence now also works for airborne objects - - temporal coherence completed for boxes / all contacts, LSS, etc - - ray-collider now uses a callback - - some common "usages" have been introduced (only picking for now) - - SPLIT_COMPLETE removed (now implicitely using mLimit = 1) - - hybrid collision models - - sweep-and-prune code added, moved from my old Z-Collide lib - - it now works with meshes made of only 1 triangle (except in mesh-mesh case!) - - Disclaimer: - - - I forced myself to actually *do* the release today no matter what. Else it would never have been done. That's - why the code may not be very polished. I also removed a *lot* of things (more usages, distance queries, etc...) - that weren't ready for prime-time (or that were linked to too many of my supporting libs) - - - Some comments may also be obsolete here and there. The old User Manual for Opcode 1.2 may not fit version 1.3 - either, since there's a new "mesh interface" to support strides, etc. - - - Everything in the "Ice" directory has been hacked out of my engine and edited until everything compiled. Don't - expect anything out there to be cute or something. In particular, some CPP files are not even included when not - needed, so you can expect some linker errors if you try messing around with them... - - Otherwise, it should be just like previous version, only better. In particular, hybrid models can be very - memory-friendly (sometimes using like 10 times less ram than the best trees from version 1.2). The possible - speed hit is often invisible (if it even exists), especially using temporal coherence in "all contacts" mode. - (Admittedly, this depends on your particular usage pattern / what you do on collided triangles). - - The sweep-and-prune code is similar to the "vanilla" version found in V-Collide (but that one's better IMHO...) - The simple "radix" version is often just as good, see for yourself. - - OPCODE distribution 1.2 (august 2002) - ----------------------- - - New in Opcode 1.2: - - new VolumeCollider base class - - simplified callback setup - - you can now use callbacks or pointers (setup at compile time) - - destination array not needed anymore in the RayCollider (faster in-out tests) - - renamed classes: AABBRayCollider => RayCollider, AABBSphereCollider => SphereCollider - - the sphere query now only returns a list of faces (extra info discarded). On the other hand it's a lot faster. - - OBB, AABB and planes queries. Original OBB and AABB queries contributed by Erwin de Vries. - - cosmetic changes in OPC_BoxBoxOverlap.h contributed by Gottfried Chen - - some inlining problems fixed - - faster ray-mesh tests using the separating axis theorem - - new split value in AABB tree construction (contributed by Igor Kravtchenko). Provides faster queries most of the time. - - improved temporal coherence for sphere & AABB queries (works in "All contacts" mode) - - Notes: - - - Everything in the "Ice code" directory (in VC++) is basically copy-pasted from my engine, with a lot - of code removed until there was no link error anymore. Don't expect those files to be cute or anything, - they've never been meant to be released and they're often updated/modified/messy. - - Some experimental features have been removed as well. Else I would never have released the 1.2... - - Not as polished/optimal as I would like it to be, but that's life. I promised myself to release it - before october 2002 (one YEAR later ?!).... That's the only reason why it's there. - - Some people reported ColDet was faster. Uh, come on. They were using Opcode in - "All contacts" mode whereas ColDet was doing "first contact"... - - OPCODE distribution 1.1 (october 2001) - ----------------------- - - New in Opcode 1.1: - - stabbing queries - - sphere queries - - abtract base class for colliders - - settings validation methods - - compilation flags now grouped in OPC_Settings.h - - smaller files, new VC++ virtual dirs (cleaner) - - Notes: - - - "override(baseclass)" is a personal cosmetic thing. It's the same as "virtual", but provides more info. - - I code in 1600*1200, so some lines may look a bit long.. - - This version is not as polished as the previous one due to lack of time. The stabbing & sphere queries - can still be optimized: for example by trying other atomic overlap tests. I'm using my first ray-AABB - code, but the newer one seems better. Tim Schröder's one is good as well. See: www.codercorner.com/RayAABB.cpp - - The trees can easily be compressed even more, I save this for later (lack of time, lack of time!) - - I removed various tests before releasing this one: - - a separation line, a.k.a. "front" in QuickCD, because gains were unclear - - distance queries in a PQP style, because it was way too slow - - support for deformable models, too slow as well - - You can easily use Opcode to do your player-vs-world collision detection, in a Nettle/Telemachos way. - If someone out there wants to donate some art / level for the cause, I'd be glad to release a demo. (current - demo uses copyrighted art I'm not allowed to spread) - - Sorry for the lack of real docs and/or solid examples. I just don't have enough time. - - OPCODE distribution 1.0 (march 2001) - ----------------------- - - - First release - - =============================================================================== - - WHAT ? - - OPCODE means OPtimized COllision DEtection. - So this is a collision detection package similar to RAPID. Here's a - quick list of features: - - - C++ interface, developed for Windows systems using VC++ 6.0 - - Works on arbitrary meshes (convex or non-convex), even polygon soups - - Current implementation uses AABB-trees - - Introduces Primitive-BV overlap tests during recursive collision queries (whereas - standard libraries only rely on Primitive-Primitive and BV-BV tests) - - Introduces no-leaf trees, i.e. collision trees whose leaf nodes have been removed - - Supports collision queries on quantized trees (decompressed on-the-fly) - - Supports "first contact" or "all contacts" modes (à la RAPID) - - Uses temporal coherence for "first contact" mode (~10 to 20 times faster, useful - in rigid body simulation during bisection) - - Memory footprint is 7.2 times smaller than RAPID's one, which is ideal for console - games with limited ram (actually, if you use the unmodified RAPID code using double - precision, it's more like 13 times smaller...) - - And yet it often runs faster than RAPID (according to RDTSC, sometimes more than 5 - times faster when objects are deeply overlapping) - - Performance is usually close to RAPID's one in close-proximity situations - - Stabbing, planes & volume queries (sphere, AABB, OBB, LSS) - - Sweep-and-prune - - Now works with deformable meshes - - Hybrid trees - - - What it can be used for: - - standard mesh-mesh collision detection (similar to RAPID, SOLID, QuickCD, PQP, ColDet...) - - N-body collisions (similar to V-Collide) - - camera-vs-world collisions (similar to Telemachos/Paul Nettle/Stan Melax articles) - - shadow feelers to speed up lightmap computations - - in-out tests to speed up voxelization processes - - picking - - rigid body simulation - - view frustum culling - - etc - - WHY ? - - - Because RAPID uses too many bytes. - - Because the idea was nice... - - WHEN ? - - It's been coded in march 2001 following a thread on the GD-Algorithms list. - - GDAlgorithms-list mailing list - GDAlgorithms-list@lists.sourceforge.net - http://lists.sourceforge.net/lists/listinfo/gdalgorithms-list - - WHO ? - - Pierre Terdiman - June, 1, 2003 - - p.terdiman@wanadoo.fr - p.terdiman@codercorner.com - - http://www.codercorner.com - http://www.codercorner.com/Opcode.htm +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + + + OPCODE distribution 1.3 (june 2003) + ----------------------- + + New in Opcode 1.3: + - fixed the divide by 0 bug that was happening when all centers where located on a coordinate axis (thanks to Jorrit T) + - linearized "complete" vanilla AABB trees + - ANSI-compliant "for" loops (for the ones porting it to Linux...) + - callbacks & pointers moved to mesh interface + - support for triangle & vertex strides + - optimized the sphere-triangle overlap code a bit + - dynamic trees (refit) + - more builders + - ValidateSubdivision in builders + - LSS collider + - primitive-bv tests can now be skipped in most volume queries + - temporal coherence now also works for airborne objects + - temporal coherence completed for boxes / all contacts, LSS, etc + - ray-collider now uses a callback + - some common "usages" have been introduced (only picking for now) + - SPLIT_COMPLETE removed (now implicitely using mLimit = 1) + - hybrid collision models + - sweep-and-prune code added, moved from my old Z-Collide lib + - it now works with meshes made of only 1 triangle (except in mesh-mesh case!) + + Disclaimer: + + - I forced myself to actually *do* the release today no matter what. Else it would never have been done. That's + why the code may not be very polished. I also removed a *lot* of things (more usages, distance queries, etc...) + that weren't ready for prime-time (or that were linked to too many of my supporting libs) + + - Some comments may also be obsolete here and there. The old User Manual for Opcode 1.2 may not fit version 1.3 + either, since there's a new "mesh interface" to support strides, etc. + + - Everything in the "Ice" directory has been hacked out of my engine and edited until everything compiled. Don't + expect anything out there to be cute or something. In particular, some CPP files are not even included when not + needed, so you can expect some linker errors if you try messing around with them... + + Otherwise, it should be just like previous version, only better. In particular, hybrid models can be very + memory-friendly (sometimes using like 10 times less ram than the best trees from version 1.2). The possible + speed hit is often invisible (if it even exists), especially using temporal coherence in "all contacts" mode. + (Admittedly, this depends on your particular usage pattern / what you do on collided triangles). + + The sweep-and-prune code is similar to the "vanilla" version found in V-Collide (but that one's better IMHO...) + The simple "radix" version is often just as good, see for yourself. + + OPCODE distribution 1.2 (august 2002) + ----------------------- + + New in Opcode 1.2: + - new VolumeCollider base class + - simplified callback setup + - you can now use callbacks or pointers (setup at compile time) + - destination array not needed anymore in the RayCollider (faster in-out tests) + - renamed classes: AABBRayCollider => RayCollider, AABBSphereCollider => SphereCollider + - the sphere query now only returns a list of faces (extra info discarded). On the other hand it's a lot faster. + - OBB, AABB and planes queries. Original OBB and AABB queries contributed by Erwin de Vries. + - cosmetic changes in OPC_BoxBoxOverlap.h contributed by Gottfried Chen + - some inlining problems fixed + - faster ray-mesh tests using the separating axis theorem + - new split value in AABB tree construction (contributed by Igor Kravtchenko). Provides faster queries most of the time. + - improved temporal coherence for sphere & AABB queries (works in "All contacts" mode) + + Notes: + + - Everything in the "Ice code" directory (in VC++) is basically copy-pasted from my engine, with a lot + of code removed until there was no link error anymore. Don't expect those files to be cute or anything, + they've never been meant to be released and they're often updated/modified/messy. + - Some experimental features have been removed as well. Else I would never have released the 1.2... + - Not as polished/optimal as I would like it to be, but that's life. I promised myself to release it + before october 2002 (one YEAR later ?!).... That's the only reason why it's there. + - Some people reported ColDet was faster. Uh, come on. They were using Opcode in + "All contacts" mode whereas ColDet was doing "first contact"... + + OPCODE distribution 1.1 (october 2001) + ----------------------- + + New in Opcode 1.1: + - stabbing queries + - sphere queries + - abtract base class for colliders + - settings validation methods + - compilation flags now grouped in OPC_Settings.h + - smaller files, new VC++ virtual dirs (cleaner) + + Notes: + + - "override(baseclass)" is a personal cosmetic thing. It's the same as "virtual", but provides more info. + - I code in 1600*1200, so some lines may look a bit long.. + - This version is not as polished as the previous one due to lack of time. The stabbing & sphere queries + can still be optimized: for example by trying other atomic overlap tests. I'm using my first ray-AABB + code, but the newer one seems better. Tim Schröder's one is good as well. See: www.codercorner.com/RayAABB.cpp + - The trees can easily be compressed even more, I save this for later (lack of time, lack of time!) + - I removed various tests before releasing this one: + - a separation line, a.k.a. "front" in QuickCD, because gains were unclear + - distance queries in a PQP style, because it was way too slow + - support for deformable models, too slow as well + - You can easily use Opcode to do your player-vs-world collision detection, in a Nettle/Telemachos way. + If someone out there wants to donate some art / level for the cause, I'd be glad to release a demo. (current + demo uses copyrighted art I'm not allowed to spread) + - Sorry for the lack of real docs and/or solid examples. I just don't have enough time. + + OPCODE distribution 1.0 (march 2001) + ----------------------- + + - First release + + =============================================================================== + + WHAT ? + + OPCODE means OPtimized COllision DEtection. + So this is a collision detection package similar to RAPID. Here's a + quick list of features: + + - C++ interface, developed for Windows systems using VC++ 6.0 + - Works on arbitrary meshes (convex or non-convex), even polygon soups + - Current implementation uses AABB-trees + - Introduces Primitive-BV overlap tests during recursive collision queries (whereas + standard libraries only rely on Primitive-Primitive and BV-BV tests) + - Introduces no-leaf trees, i.e. collision trees whose leaf nodes have been removed + - Supports collision queries on quantized trees (decompressed on-the-fly) + - Supports "first contact" or "all contacts" modes (à la RAPID) + - Uses temporal coherence for "first contact" mode (~10 to 20 times faster, useful + in rigid body simulation during bisection) + - Memory footprint is 7.2 times smaller than RAPID's one, which is ideal for console + games with limited ram (actually, if you use the unmodified RAPID code using double + precision, it's more like 13 times smaller...) + - And yet it often runs faster than RAPID (according to RDTSC, sometimes more than 5 + times faster when objects are deeply overlapping) + - Performance is usually close to RAPID's one in close-proximity situations + - Stabbing, planes & volume queries (sphere, AABB, OBB, LSS) + - Sweep-and-prune + - Now works with deformable meshes + - Hybrid trees + + + What it can be used for: + - standard mesh-mesh collision detection (similar to RAPID, SOLID, QuickCD, PQP, ColDet...) + - N-body collisions (similar to V-Collide) + - camera-vs-world collisions (similar to Telemachos/Paul Nettle/Stan Melax articles) + - shadow feelers to speed up lightmap computations + - in-out tests to speed up voxelization processes + - picking + - rigid body simulation + - view frustum culling + - etc + + WHY ? + + - Because RAPID uses too many bytes. + - Because the idea was nice... + + WHEN ? + + It's been coded in march 2001 following a thread on the GD-Algorithms list. + + GDAlgorithms-list mailing list + GDAlgorithms-list@lists.sourceforge.net + http://lists.sourceforge.net/lists/listinfo/gdalgorithms-list + + WHO ? + + Pierre Terdiman + June, 1, 2003 + + p.terdiman@wanadoo.fr + p.terdiman@codercorner.com + + http://www.codercorner.com + http://www.codercorner.com/Opcode.htm diff --git a/Extras/CDTestFramework/Opcode/StdAfx.cpp b/Extras/CDTestFramework/Opcode/StdAfx.cpp index dd779197d..632a74057 100644 --- a/Extras/CDTestFramework/Opcode/StdAfx.cpp +++ b/Extras/CDTestFramework/Opcode/StdAfx.cpp @@ -1,19 +1,19 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -//#define ICE_MAIN -#include "Stdafx.h" +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +//#define ICE_MAIN +#include "Stdafx.h" diff --git a/Extras/CDTestFramework/Opcode/StdAfx.h b/Extras/CDTestFramework/Opcode/StdAfx.h index 28bf0cacb..4b30a04cc 100644 --- a/Extras/CDTestFramework/Opcode/StdAfx.h +++ b/Extras/CDTestFramework/Opcode/StdAfx.h @@ -1,33 +1,33 @@ -/* - * OPCODE - Optimized Collision Detection - * http://www.codercorner.com/Opcode.htm - * - * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -#if !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) -#define AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -// Insert your headers here -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include "Opcode.h" - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +#if !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) +#define AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +// Insert your headers here +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include "Opcode.h" + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) diff --git a/Extras/CDTestFramework/OpcodeArraySAPTest.cpp b/Extras/CDTestFramework/OpcodeArraySAPTest.cpp index 2491e7e98..bfea3280d 100644 --- a/Extras/CDTestFramework/OpcodeArraySAPTest.cpp +++ b/Extras/CDTestFramework/OpcodeArraySAPTest.cpp @@ -1,215 +1,215 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "OpcodeArraySAPTest.h" -#include "RenderingHelpers.h" -#include "GLFontRenderer.h" - -static udword gNbCreatedPairs; -static udword gNbDeletedPairs; -static udword gTotalNbPairs; - -static void* CBData = (void*)0x12345678; -static void* PairUserData = (void*)0xDeadDead; - -static void* CreatePairCB(const void* object0, const void* object1, void* user_data) -{ - assert(user_data==CBData); - - gNbCreatedPairs++; - return PairUserData; -} - -static void DeletePairCB(const void* object0, const void* object1, void* user_data, void* pair_user_data) -{ - assert(user_data==CBData); - assert(pair_user_data==PairUserData); - - gNbDeletedPairs++; -} - -OpcodeArraySAPTest::OpcodeArraySAPTest(int numBoxes) : - mBar (null), - mNbBoxes (numBoxes), - mBoxes (null), - mHandles (null), - mBoxTime (null), - mAmplitude (100.0f) -{ -} - -OpcodeArraySAPTest::~OpcodeArraySAPTest() -{ - Release(); -} - -void OpcodeArraySAPTest::Init() -{ - m_firstTime = true; - - SRand(0); - mBoxes = new AABB[mNbBoxes]; - mBoxTime = new float[mNbBoxes]; - mHandles = new void*[mNbBoxes]; - for(udword i=0;i -#include "GL/glut.h" - -#include "RenderingHelpers.h" - -//////////////////////// - -void DrawLine(const Point& p0, const Point& p1, const Point& color, float line_width) -{ - glDisable(GL_LIGHTING); - glLineWidth(line_width); - glColor4f(color.x, color.y, color.z, 1.0f); - Point tmp[] = {p0, p1}; - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, sizeof(Point), &tmp[0].x); - glDrawArrays(GL_LINES, 0, 2); - glDisableClientState(GL_VERTEX_ARRAY); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glEnable(GL_LIGHTING); -} - -void DrawTriangle(const Point& p0, const Point& p1, const Point& p2, const Point& color) -{ -// glDisable(GL_LIGHTING); - glColor4f(color.x, color.y, color.z, 1.0f); - Point tmp[] = {p0, p1, p2}; - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, sizeof(Point), &tmp[0].x); - glDrawArrays(GL_TRIANGLES, 0, 3); - glDisableClientState(GL_VERTEX_ARRAY); -// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); -// glEnable(GL_LIGHTING); -} - - -//////////////////////// - -static void SetupGLMatrix(const Point& pos) -{ - float glmat[16]; //4x4 column major matrix for OpenGL. - glmat[0] = 1.0f; - glmat[1] = 0.0f; - glmat[2] = 0.0f; - glmat[3] = 0.0f; - - glmat[4] = 0.0f; - glmat[5] = 1.0f; - glmat[6] = 0.0f; - glmat[7] = 0.0f; - - glmat[8] = 0.0f; - glmat[9] = 0.0f; - glmat[10] = 1.0f; - glmat[11] = 0.0f; - - glmat[12] = pos.x; - glmat[13] = pos.y; - glmat[14] = pos.z; - glmat[15] = 1.0f; - - glMultMatrixf(glmat); -} - -void SetupGLMatrix(const Point& pos, const Matrix3x3& rot) -{ - float glmat[16]; //4x4 column major matrix for OpenGL. - glmat[0] = rot.m[0][0]; - glmat[1] = rot.m[0][1]; - glmat[2] = rot.m[0][2]; - glmat[3] = 0.0f; - - glmat[4] = rot.m[1][0]; - glmat[5] = rot.m[1][1]; - glmat[6] = rot.m[1][2]; - glmat[7] = 0.0f; - - glmat[8] = rot.m[2][0]; - glmat[9] = rot.m[2][1]; - glmat[10] = rot.m[2][2]; - glmat[11] = 0.0f; - - glmat[12] = pos.x; - glmat[13] = pos.y; - glmat[14] = pos.z; - glmat[15] = 1.0f; - - glMultMatrixf(glmat); -} - -void SetupGLMatrix(const Matrix4x4& world) -{ - SetupGLMatrix(world.GetTrans(), world); -} - -//////////////////////// - -static void RenderSphere(float radius) -{ - glutSolidSphere(radius, 12, 12); // Radius / slices / stacks -} - -void DrawSphere(const Sphere& sphere) -{ - glPushMatrix(); - SetupGLMatrix(sphere.mCenter); - RenderSphere(sphere.mRadius); - glPopMatrix(); -} - -//////////////////////// - -static void RenderBox(int size) -{ - glutSolidCube(size); -} - -void DrawOBB(const OBB& obb) -{ - glPushMatrix(); - SetupGLMatrix(obb.mCenter, obb.mRot); - glScalef(obb.mExtents.x, obb.mExtents.y, obb.mExtents.z); - RenderBox(2); - glPopMatrix(); -} - -//////////////////////// - -static float gCylinderData[]={ - 1.0f,0.0f,1.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f, - 0.866025f,0.500000f,1.0f,0.866025f,0.500000f,1.0f,0.866025f,0.500000f,0.0f,0.866025f,0.500000f,0.0f, - 0.500000f,0.866025f,1.0f,0.500000f,0.866025f,1.0f,0.500000f,0.866025f,0.0f,0.500000f,0.866025f,0.0f, - -0.0f,1.0f,1.0f,-0.0f,1.0f,1.0f,-0.0f,1.0f,0.0f,-0.0f,1.0f,0.0f, - -0.500000f,0.866025f,1.0f,-0.500000f,0.866025f,1.0f,-0.500000f,0.866025f,0.0f,-0.500000f,0.866025f,0.0f, - -0.866025f,0.500000f,1.0f,-0.866025f,0.500000f,1.0f,-0.866025f,0.500000f,0.0f,-0.866025f,0.500000f,0.0f, - -1.0f,-0.0f,1.0f,-1.0f,-0.0f,1.0f,-1.0f,-0.0f,0.0f,-1.0f,-0.0f,0.0f, - -0.866025f,-0.500000f,1.0f,-0.866025f,-0.500000f,1.0f,-0.866025f,-0.500000f,0.0f,-0.866025f,-0.500000f,0.0f, - -0.500000f,-0.866025f,1.0f,-0.500000f,-0.866025f,1.0f,-0.500000f,-0.866025f,0.0f,-0.500000f,-0.866025f,0.0f, - 0.0f,-1.0f,1.0f,0.0f,-1.0f,1.0f,0.0f,-1.0f,0.0f,0.0f,-1.0f,0.0f, - 0.500000f,-0.866025f,1.0f,0.500000f,-0.866025f,1.0f,0.500000f,-0.866025f,0.0f,0.500000f,-0.866025f,0.0f, - 0.866026f,-0.500000f,1.0f,0.866026f,-0.500000f,1.0f,0.866026f,-0.500000f,0.0f,0.866026f,-0.500000f,0.0f, - 1.0f,0.0f,1.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f -}; - -static float gCylinderDataCapsTop[]={ - 0.866026f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,-1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,-1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.866025f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.866025f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -1.000000f,-0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -1.000000f,-0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - -0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 1.000000f,0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 1.000000f,0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, - 0.866026f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, -}; - -static float gCylinderDataCapsBottom[]={ - 1.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.000000f,1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.000000f,1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -1.000000f,-0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -1.000000f,-0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.866025f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.866025f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - -0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,-1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,-1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.866026f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.866026f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, - 1.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, -}; - -static void RenderCylinder() -{ - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderData); - glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderData+3); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 13*2); - - glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsTop); - glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsTop+3); - glDrawArrays(GL_TRIANGLES, 0, 36); - - glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsBottom); - glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsBottom+3); - glDrawArrays(GL_TRIANGLES, 0, 36); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); -} - -void DrawCapsule(const Matrix4x4& world, const Point& p0, const Point& p1, float r) -{ - const float h = p0.Distance(p1); - - glPushMatrix(); - SetupGLMatrix(world); - - glPushMatrix(); - glTranslatef(0.0f, h*0.5f, 0.0f); - RenderSphere(r); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(0.0f,-h*0.5f, 0.0f); - RenderSphere(r); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(0.0f,h*0.5f, 0.0f); - glScalef(r,h,r); - glRotatef(90.0f,1.0f,0.0f,0.0f); - RenderCylinder(); - glPopMatrix(); - - glPopMatrix(); -} - - - -#ifdef TOSEE -#include "NxPhysics.h" -#include "DrawObjects.h" - -#include - -static float gPlaneData[]={ - -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, - 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, - 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f -}; - - -static void RenderPlane() -{ - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gPlaneData); - glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gPlaneData+3); - glDrawArrays(GL_TRIANGLES, 0, 6); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); -} - -void SetupGLMatrix(const NxVec3& pos, const NxMat33& orient) -{ - float glmat[16]; //4x4 column major matrix for OpenGL. - orient.getColumnMajorStride4(&(glmat[0])); - pos.get(&(glmat[12])); - - //clear the elements we don't need: - glmat[3] = glmat[7] = glmat[11] = 0.0f; - glmat[15] = 1.0f; - - glMultMatrixf(&(glmat[0])); -} - -void DrawLine(const NxVec3& p0, const NxVec3& p1, const NxVec3& color, float lineWidth) -{ - glDisable(GL_LIGHTING); - glLineWidth(lineWidth); - glColor4f(color.x, color.y, color.z, 1.0f); - NxVec3 av3LineEndpoints[] = {p0, p1}; - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &av3LineEndpoints[0].x); - glDrawArrays(GL_LINES, 0, 2); - glDisableClientState(GL_VERTEX_ARRAY); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glEnable(GL_LIGHTING); -} - -void DrawTriangle(const NxVec3& p0, const NxVec3& p1, const NxVec3& p2, const NxVec3& color) -{ - glDisable(GL_LIGHTING); - glColor4f(color.x, color.y, color.z, 1.0f); - NxVec3 av3LineEndpoints[] = {p0, p1, p2}; - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &av3LineEndpoints[0].x); - glDrawArrays(GL_TRIANGLES, 0, 3); - glDisableClientState(GL_VERTEX_ARRAY); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glEnable(GL_LIGHTING); -} - -void DrawCircle(NxU32 nbSegments, const NxMat34& matrix, const NxVec3& color, const NxF32 radius, const bool semicircle) -{ - NxF32 step = NxTwoPiF32/NxF32(nbSegments); - NxU32 segs = nbSegments; - if(semicircle) - { - segs /= 2; - } - - for(NxU32 i=0;igetGlobalPose(); - NxPlaneShape* planeShape = plane->isPlane(); - NxPlane p = planeShape->getPlane(); - pose.t.x += p.d; - pose.t.y += p.d; - pose.t.z += p.d; - - glPushMatrix(); - glDisable(GL_LIGHTING); - glColor4f(0.1f, 0.2f, 0.3f, 1.0f); - pose.t.y -= 0.1f; - SetupGLMatrix(pose.t, pose.M); - glScalef(1024,0,1024); - RenderPlane(); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glEnable(GL_LIGHTING); - glPopMatrix(); -} - -void DrawWireBox(const NxBox& obb, const NxVec3& color, float lineWidth) -{ - // Compute obb vertices - NxVec3 pp[8]; - NxComputeBoxPoints(obb, pp); - - // Draw all lines - const NxU32* Indices = NxGetBoxEdges(); - for(NxU32 i=0;i<12;i++) - { - NxU32 VRef0 = *Indices++; - NxU32 VRef1 = *Indices++; - DrawLine(pp[VRef0], pp[VRef1], color, lineWidth); - } -} - -void DrawWireBox(NxShape* box, const NxVec3& color, float lineWidth) -{ - NxBox obb; - box->isBox()->getWorldOBB(obb); - - DrawWireBox(obb, color, lineWidth); -} - - -void DrawWireSphere(NxShape* sphere, const NxVec3& color) -{ - NxMat34 pose = sphere->getGlobalPose(); - - glPushMatrix(); - NxReal r = sphere->isSphere()->getRadius(); - - NxVec3 c0; pose.M.getColumn(0, c0); - NxVec3 c1; pose.M.getColumn(1, c1); - NxVec3 c2; pose.M.getColumn(2, c2); - DrawCircle(20, pose, color, r); - - pose.M.setColumn(0, c1); - pose.M.setColumn(1, c2); - pose.M.setColumn(2, c0); - DrawCircle(20, pose, color, r); - - pose.M.setColumn(0, c2); - pose.M.setColumn(1, c0); - pose.M.setColumn(2, c1); - DrawCircle(20, pose, color, r); - - glPopMatrix(); -} - -void DrawSphere(NxShape* sphere) -{ - NxMat34 pose = sphere->getGlobalPose(); - - glPushMatrix(); - SetupGLMatrix(pose.t, pose.M); - NxReal r = sphere->isSphere()->getRadius(); - glScalef(r,r,r); - RenderSphere(); - glPopMatrix(); -} - -void DrawWireCapsule(NxShape* capsule, const NxVec3& color) -{ - NxMat34 pose = capsule->getGlobalPose(); - - NxReal r = capsule->isCapsule()->getRadius(); - NxReal h = capsule->isCapsule()->getHeight(); - - NxSegment SG; - pose.M.getColumn(1, SG.p1); - SG.p1 *= 0.5f*h; - SG.p0 = -SG.p1; - SG.p0 += pose.t; - SG.p1 += pose.t; - - NxVec3 c0; pose.M.getColumn(0, c0); - NxVec3 c1; pose.M.getColumn(1, c1); - NxVec3 c2; pose.M.getColumn(2, c2); - DrawLine(SG.p0 + c0*r, SG.p1 + c0*r, color); - DrawLine(SG.p0 - c0*r, SG.p1 - c0*r, color); - DrawLine(SG.p0 + c2*r, SG.p1 + c2*r, color); - DrawLine(SG.p0 - c2*r, SG.p1 - c2*r, color); - - pose.M.setColumn(0, -c1); - pose.M.setColumn(1, -c0); - pose.M.setColumn(2, c2); - pose.t = SG.p0; - DrawCircle(20, pose, color, r, true); //halfcircle -- flipped - - pose.M.setColumn(0, c1); - pose.M.setColumn(1, -c0); - pose.M.setColumn(2, c2); - pose.t = SG.p1; - DrawCircle(20, pose, color, r, true); - - pose.M.setColumn(0, -c1); - pose.M.setColumn(1, c2); - pose.M.setColumn(2, c0); - pose.t = SG.p0; - DrawCircle(20, pose, color, r, true);//halfcircle -- good - - pose.M.setColumn(0, c1); - pose.M.setColumn(1, c2); - pose.M.setColumn(2, c0); - pose.t = SG.p1; - DrawCircle(20, pose, color, r, true); - - pose.M.setColumn(0, c2); - pose.M.setColumn(1, c0); - pose.M.setColumn(2, c1); - pose.t = SG.p0; - DrawCircle(20, pose, color, r); //full circle - pose.t = SG.p1; - DrawCircle(20, pose, color, r); -} - -static void computeBasis(const NxVec3& dir, NxVec3& right, NxVec3& up) -{ - // Derive two remaining vectors - if(fabsf(dir.y)>0.9999f) right = NxVec3(1.0f, 0.0f, 0.0f); - else right = (NxVec3(0.0f, 1.0f, 0.0f) ^ dir); - right.normalize(); - up = dir ^ right; -} - -void DrawWireCapsule(const NxCapsule& capsule, const NxVec3& color) -{ - NxReal r = capsule.radius; - NxVec3 dir = capsule.p0 - capsule.p1; - NxReal h = dir.magnitude(); - NxMat34 pose; - pose.t = (capsule.p0 + capsule.p1)*0.5f; - - if(h!=0.0f) - { - dir/=h; - NxVec3 right, up; - computeBasis(dir, right, up); - pose.M.setColumn(0, right); - pose.M.setColumn(1, dir); - pose.M.setColumn(2, up); - } - else - { - pose.M.id(); - } - -// NxMat34 pose = capsule->getGlobalPose(); -// const NxReal & r = capsule->isCapsule()->getRadius(); -// const NxReal & h = capsule->isCapsule()->getHeight(); - - - - NxSegment SG; - pose.M.getColumn(1, SG.p1); - SG.p1 *= 0.5f*h; - SG.p0 = -SG.p1; - SG.p0 += pose.t; - SG.p1 += pose.t; - - NxVec3 c0; pose.M.getColumn(0, c0); - NxVec3 c1; pose.M.getColumn(1, c1); - NxVec3 c2; pose.M.getColumn(2, c2); - DrawLine(SG.p0 + c0*r, SG.p1 + c0*r, color); - DrawLine(SG.p0 - c0*r, SG.p1 - c0*r, color); - DrawLine(SG.p0 + c2*r, SG.p1 + c2*r, color); - DrawLine(SG.p0 - c2*r, SG.p1 - c2*r, color); - - pose.M.setColumn(0, -c1); - pose.M.setColumn(1, -c0); - pose.M.setColumn(2, c2); - pose.t = SG.p0; - DrawCircle(20, pose, color, r, true); //halfcircle -- flipped - - pose.M.setColumn(0, c1); - pose.M.setColumn(1, -c0); - pose.M.setColumn(2, c2); - pose.t = SG.p1; - DrawCircle(20, pose, color, r, true); - - pose.M.setColumn(0, -c1); - pose.M.setColumn(1, c2); - pose.M.setColumn(2, c0); - pose.t = SG.p0; - DrawCircle(20, pose, color, r, true);//halfcircle -- good - - pose.M.setColumn(0, c1); - pose.M.setColumn(1, c2); - pose.M.setColumn(2, c0); - pose.t = SG.p1; - DrawCircle(20, pose, color, r, true); - - pose.M.setColumn(0, c2); - pose.M.setColumn(1, c0); - pose.M.setColumn(2, c1); - pose.t = SG.p0; - DrawCircle(20, pose, color, r); //full circle - pose.t = SG.p1; - DrawCircle(20, pose, color, r); -} - -void DrawCapsule(const NxVec3& color, NxF32 r, NxF32 h) -{ - glColor4f(color.x, color.y, color.z, 1.0f); - - glPushMatrix(); - glTranslatef(0.0f, h*0.5f, 0.0f); - glScalef(r,r,r); - RenderSphere(); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(0.0f,-h*0.5f, 0.0f); - glScalef(r,r,r); - RenderSphere(); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(0.0f,h*0.5f, 0.0f); - glScalef(r,h,r); - glRotatef(90.0f,1.0f,0.0f,0.0f); - RenderCylinder(); - glPopMatrix(); -} - -typedef NxVec3 Point; -typedef struct _Triangle { NxU32 p0; NxU32 p1; NxU32 p2; } Triangle; - -void DrawWireConvex(NxShape* mesh, const NxVec3& color) -{ - if(mesh->userData == NULL) return; - - NxMat34 pose = mesh->getGlobalPose(); - - NxConvexMeshDesc meshDesc = *((NxConvexMeshDesc*)(mesh->userData)); -// mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); - - NxU32 nbVerts = meshDesc.numVertices; - NxU32 nbTriangles = meshDesc.numTriangles; - - Point* points = (Point *)meshDesc.points; - Triangle* triangles = (Triangle *)meshDesc.triangles; - - glPushMatrix(); - - float glmat[16]; //4x4 column major matrix for OpenGL. - pose.M.getColumnMajorStride4(&(glmat[0])); - pose.t.get(&(glmat[12])); - - //clear the elements we don't need: - glmat[3] = glmat[7] = glmat[11] = 0.0f; - glmat[15] = 1.0f; - - glMultMatrixf(&(glmat[0])); - - while(nbTriangles--) - { - DrawLine(points[triangles->p0], points[triangles->p1], color); - DrawLine(points[triangles->p1], points[triangles->p2], color); - DrawLine(points[triangles->p2], points[triangles->p0], color); - triangles++; - } - - glPopMatrix(); -} - -void DrawTriangleList(int iTriangleCount, Triangle *pTriangles, Point *pPoints) -{ - static int iBufferSize=0; - static float *pfVertexBuffer=NULL; - static float *pfNormalBuffer=NULL; - - if(iBufferSize < iTriangleCount*3) - { - iBufferSize=3*iTriangleCount; - - delete[] pfVertexBuffer; - pfVertexBuffer = new float[iBufferSize*3]; - - delete[] pfNormalBuffer; - pfNormalBuffer = new float[iBufferSize*3]; - } - - float *pfDestinationVertex=pfVertexBuffer; - float *pfDestinationNormal=pfNormalBuffer; - - for(int iTriangle=0; iTrianglep0].x; - *pfDestinationVertex++=pPoints[pTriangles->p0].y; - *pfDestinationVertex++=pPoints[pTriangles->p0].z; - *pfDestinationVertex++=pPoints[pTriangles->p1].x; - *pfDestinationVertex++=pPoints[pTriangles->p1].y; - *pfDestinationVertex++=pPoints[pTriangles->p1].z; - *pfDestinationVertex++=pPoints[pTriangles->p2].x; - *pfDestinationVertex++=pPoints[pTriangles->p2].y; - *pfDestinationVertex++=pPoints[pTriangles->p2].z; - - NxVec3 edge1 = pPoints[pTriangles->p1] - pPoints[pTriangles->p0]; - NxVec3 edge2 = pPoints[pTriangles->p2] - pPoints[pTriangles->p0]; - NxVec3 normal = edge1.cross(edge2); - normal.normalize(); - - *pfDestinationNormal++=normal.x; - *pfDestinationNormal++=normal.y; - *pfDestinationNormal++=normal.z; - *pfDestinationNormal++=normal.x; - *pfDestinationNormal++=normal.y; - *pfDestinationNormal++=normal.z; - *pfDestinationNormal++=normal.x; - *pfDestinationNormal++=normal.y; - *pfDestinationNormal++=normal.z; - - pTriangles++; - } - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, pfVertexBuffer); - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, 0, pfNormalBuffer); - - glDrawArrays(GL_TRIANGLES, 0, 3*iTriangleCount); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - -} - -void DrawConvex(NxShape* mesh) -{ - NxConvexMeshDesc meshDesc; - - // SRM : Please note that I looked into a crash issue posed by - // one of our customers, and this code (i.e. reinterpreting the - // NxShape's userData as an NxConvexMeshDesc * was crashing because - // in the SampleRaycastCar demo, it sets that pointer equal to the - // NxWheel because that is used in NxVehicle::handleContactPair(). Thus - // in order to allow this code not to crash on the PS3, we should - // simply force the shape to save its description here. - mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); - /** - if(mesh->userData != NULL) - { - meshDesc = *((NxConvexMeshDesc*)(mesh->userData)); - } else { - mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); - } - **/ - - NxMat34 pose = mesh->getGlobalPose(); - - NxU32 nbVerts = meshDesc.numVertices; - NxU32 nbTriangles = meshDesc.numTriangles; - - Point* points = (Point *)meshDesc.points; - Triangle* triangles = (Triangle *)meshDesc.triangles; - - glPushMatrix(); - - float glmat[16]; //4x4 column major matrix for OpenGL. - pose.M.getColumnMajorStride4(&(glmat[0])); - pose.t.get(&(glmat[12])); - - //clear the elements we don't need: - glmat[3] = glmat[7] = glmat[11] = 0.0f; - glmat[15] = 1.0f; - - glMultMatrixf(&(glmat[0])); - - DrawTriangleList(nbTriangles, triangles, points); - - glPopMatrix(); -} - -void DrawWireMesh(NxShape* mesh, const NxVec3& color) -{ - if(mesh->userData == NULL) return; - - NxMat34 pose = mesh->getGlobalPose(); - - NxTriangleMeshDesc meshDesc = *((NxTriangleMeshDesc*)(mesh->userData)); -// mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); - - NxU32 nbVerts = meshDesc.numVertices; - NxU32 nbTriangles = meshDesc.numTriangles; - - Point* points = (Point *)meshDesc.points; - Triangle* triangles = (Triangle *)meshDesc.triangles; - - glPushMatrix(); - - float glmat[16]; //4x4 column major matrix for OpenGL. - pose.M.getColumnMajorStride4(&(glmat[0])); - pose.t.get(&(glmat[12])); - - //clear the elements we don't need: - glmat[3] = glmat[7] = glmat[11] = 0.0f; - glmat[15] = 1.0f; - - glMultMatrixf(&(glmat[0])); - - while(nbTriangles--) - { - DrawLine(points[triangles->p0], points[triangles->p1], color); - DrawLine(points[triangles->p1], points[triangles->p2], color); - DrawLine(points[triangles->p2], points[triangles->p0], color); - triangles++; - } - - glPopMatrix(); -} - -void DrawMesh(NxShape* mesh) -{ - if(mesh->userData == NULL) return; - - NxMat34 pose = mesh->getGlobalPose(); - - NxTriangleMeshDesc meshDesc = *((NxTriangleMeshDesc*)(mesh->userData)); -// mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); - - NxU32 nbVerts = meshDesc.numVertices; - NxU32 nbTriangles = meshDesc.numTriangles; - - Point* points = (Point *)meshDesc.points; - Triangle* triangles = (Triangle *)meshDesc.triangles; - - glPushMatrix(); - - float glmat[16]; //4x4 column major matrix for OpenGL. - pose.M.getColumnMajorStride4(&(glmat[0])); - pose.t.get(&(glmat[12])); - - //clear the elements we don't need: - glmat[3] = glmat[7] = glmat[11] = 0.0f; - glmat[15] = 1.0f; - - glMultMatrixf(&(glmat[0])); - - if(meshDesc.heightFieldVerticalAxis != NX_NOT_HEIGHTFIELD) - { - glDisable(GL_LIGHT0); - glEnable(GL_LIGHT1); - } - - DrawTriangleList(nbTriangles, triangles, points); - - if(meshDesc.heightFieldVerticalAxis != NX_NOT_HEIGHTFIELD) - { - glDisable(GL_LIGHT1); - glEnable(GL_LIGHT0); - } - - glPopMatrix(); -} - -void DrawWheelShape(NxShape* wheel) -{ - if(wheel->is(NX_SHAPE_WHEEL) != NULL) - { - NxWheelShape* wheelShape = (NxWheelShape*)wheel; - glPushMatrix(); - - float glmat[16]; - wheel->getGlobalPose().getColumnMajor44(glmat); - - NxWheelShapeDesc wheelShapeDesc; - - float r = wheelShape->getRadius(); - float a = wheelShape->getSteerAngle(); - - glMultMatrixf(&(glmat[0])); - glTranslatef(-r/2,0,0); - glRotatef(90,0,1,0); - glRotatef(NxMath::radToDeg(a),0,1,0); - - glScalef(r, r, r); - RenderCylinder(); - glPopMatrix(); - } -} - -void DrawArrow(const NxVec3& posA, const NxVec3& posB, const NxVec3& color) -{ - NxVec3 vec = posB - posA; - NxVec3 t0, t1, t2; - NxNormalToTangents(vec, t1, t2); - - t0 = posB - posA; - t0.normalize(); - - NxVec3 lobe1 = posB - t0*0.15 + t1 * 0.15; - NxVec3 lobe2 = posB - t0*0.15 - t1 * 0.15; - NxVec3 lobe3 = posB - t0*0.15 + t2 * 0.15; - NxVec3 lobe4 = posB - t0*0.15 - t2 * 0.15; - - NxVec3 v3ArrowShape[] = { - NxVec3(posA), NxVec3(posB), - NxVec3(posB), NxVec3(lobe1), - NxVec3(posB), NxVec3(lobe2), - NxVec3(posB), NxVec3(lobe3), - NxVec3(posB), NxVec3(lobe4), - }; - - glDisable(GL_LIGHTING); - glLineWidth(3.0f); - glColor4f(color.x,color.y,color.z,1.0f); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &v3ArrowShape[0].x); - glDrawArrays(GL_LINES, 0, sizeof(v3ArrowShape)/sizeof(NxVec3)); - glDisableClientState(GL_VERTEX_ARRAY); - glColor4f(1.0f,1.0f,1.0f,1.0f); -} - -void DrawContactPoint(const NxVec3& pos, const NxReal radius, const NxVec3& color) -{ - NxMat34 pose; - pose.t = pos; - - NxVec3 c0; pose.M.getColumn(0, c0); - NxVec3 c1; pose.M.getColumn(1, c1); - NxVec3 c2; pose.M.getColumn(2, c2); - DrawCircle(20, pose, color, radius); - - pose.M.setColumn(0, c1); - pose.M.setColumn(1, c2); - pose.M.setColumn(2, c0); - DrawCircle(20, pose, color, radius); - - pose.M.setColumn(0, c2); - pose.M.setColumn(1, c0); - pose.M.setColumn(2, c1); - DrawCircle(20, pose, color, radius); -} - -void DrawWireShape(NxShape *shape, const NxVec3& color) -{ - switch(shape->getType()) - { - case NX_SHAPE_PLANE: - DrawWirePlane(shape, color); - break; - case NX_SHAPE_BOX: - DrawWireBox(shape, color); - break; - case NX_SHAPE_SPHERE: - DrawWireSphere(shape, color); - break; - case NX_SHAPE_CAPSULE: - DrawWireCapsule(shape, color); - break; - case NX_SHAPE_CONVEX: - DrawWireConvex(shape, color); - break; - case NX_SHAPE_MESH: - DrawWireMesh(shape, color); - break; - } -} - -void DrawShape(NxShape* shape) -{ - switch(shape->getType()) - { - case NX_SHAPE_PLANE: - DrawPlane(shape); - break; - case NX_SHAPE_BOX: - DrawBox(shape); - break; - case NX_SHAPE_SPHERE: - DrawSphere(shape); - break; - case NX_SHAPE_CAPSULE: - DrawCapsule(shape); - break; - case NX_SHAPE_CONVEX: - DrawConvex(shape); - break; - case NX_SHAPE_MESH: - DrawMesh(shape); - break; - case NX_SHAPE_WHEEL: - DrawWheelShape(shape); - break; - } -} - -void DrawActor(NxActor* actor, NxActor* gSelectedActor) -{ - NxShape*const* shapes = actor->getShapes(); - NxU32 nShapes = actor->getNbShapes(); - if (actor == gSelectedActor) - { - while (nShapes--) - { - DrawWireShape(shapes[nShapes], NxVec3(1,1,1)); - } - } - nShapes = actor->getNbShapes(); - while (nShapes--) - { - DrawShape(shapes[nShapes]); - } -} - -void DrawWireActor(NxActor* actor) -{ - NxShape*const* shapes = actor->getShapes(); - NxU32 nShapes = actor->getNbShapes(); - nShapes = actor->getNbShapes(); - while (nShapes--) - { - DrawWireShape(shapes[nShapes], NxVec3(1,1,1)); - } -} - -static void DrawActorShadow(NxActor* actor, const float* ShadowMat) -{ - glPushMatrix(); - glMultMatrixf(ShadowMat); - - glDisable(GL_LIGHTING); - glColor4f(0.05f, 0.1f, 0.15f, 1.0f); - - NxShape*const* shapes = actor->getShapes(); - NxU32 nShapes = actor->getNbShapes(); - while (nShapes--) - { - switch(shapes[nShapes]->getType()) - { - case NX_SHAPE_BOX: - DrawBox(shapes[nShapes]); - break; - case NX_SHAPE_SPHERE: - DrawSphere(shapes[nShapes]); - break; - case NX_SHAPE_CAPSULE: - DrawCapsule(shapes[nShapes]); - break; - case NX_SHAPE_CONVEX: - DrawConvex(shapes[nShapes]); - break; - } - } - - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glEnable(GL_LIGHTING); - - glPopMatrix(); -} - - -void DrawActorShadow(NxActor* actor) -{ - const static float ShadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 }; - DrawActorShadow(actor, ShadowMat); -} - -void DrawActorShadow2(NxActor* actor) -{ - const static float ShadowMat[]={ 1,0,0,0, 1,0,-0.2,0, 0,0,1,0, 0,0,0,1 }; - DrawActorShadow(actor, ShadowMat); -} - -void DrawActorShadowZUp(NxActor* actor) -{ - const static float ShadowMat[]={ 1,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,1 }; - DrawActorShadow(actor, ShadowMat); -} - -void DrawCloth(NxCloth *cloth, bool shadows) -{ - NxMeshData meshData = cloth->getMeshData(); - - NxU32 numVertices = *meshData.numVerticesPtr; - NxU32 numTriangles = *meshData.numIndicesPtr / 3; - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, meshData.verticesPosBegin); - glNormalPointer(GL_FLOAT, 0, meshData.verticesNormalBegin); - -#ifdef __CELLOS_LV2__ - glDrawRangeElements(GL_TRIANGLES, 0, numVertices-1, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); -#else - glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); -#endif - - if (shadows) { - const static float ShadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 }; - glPushMatrix(); - glMultMatrixf(ShadowMat); - glDisable(GL_LIGHTING); - glColor4f(0.05f, 0.1f, 0.15f,1.0f); - -#ifdef __CELLOS_LV2__ - glDrawRangeElements(GL_TRIANGLES, 0, numVertices-1, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); -#else - glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); -#endif - - glColor4f(1.0f, 1.0f, 1.0f,1.0f); - glEnable(GL_LIGHTING); - glPopMatrix(); - } - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); -} - -#ifdef WIN32 -#include -typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int ); -PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0; -int vsyncState = 1; -#endif - -void toggleVSync() -{ -#ifdef WIN32 - if (wglSwapIntervalEXT == NULL) - { - const char* extensions = (const char*)glGetString(GL_EXTENSIONS); - if (strstr(extensions, "WGL_EXT_swap_control") != 0) - { - wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress( "wglSwapIntervalEXT" ); - } - } - if (wglSwapIntervalEXT != NULL) - { - vsyncState = 1 - vsyncState; - wglSwapIntervalEXT(vsyncState); - } -#endif -} -#endif +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" + +#include +#include "GL/glut.h" + +#include "RenderingHelpers.h" + +//////////////////////// + +void DrawLine(const Point& p0, const Point& p1, const Point& color, float line_width) +{ + glDisable(GL_LIGHTING); + glLineWidth(line_width); + glColor4f(color.x, color.y, color.z, 1.0f); + Point tmp[] = {p0, p1}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(Point), &tmp[0].x); + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawTriangle(const Point& p0, const Point& p1, const Point& p2, const Point& color) +{ +// glDisable(GL_LIGHTING); + glColor4f(color.x, color.y, color.z, 1.0f); + Point tmp[] = {p0, p1, p2}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(Point), &tmp[0].x); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); +// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +// glEnable(GL_LIGHTING); +} + + +//////////////////////// + +static void SetupGLMatrix(const Point& pos) +{ + float glmat[16]; //4x4 column major matrix for OpenGL. + glmat[0] = 1.0f; + glmat[1] = 0.0f; + glmat[2] = 0.0f; + glmat[3] = 0.0f; + + glmat[4] = 0.0f; + glmat[5] = 1.0f; + glmat[6] = 0.0f; + glmat[7] = 0.0f; + + glmat[8] = 0.0f; + glmat[9] = 0.0f; + glmat[10] = 1.0f; + glmat[11] = 0.0f; + + glmat[12] = pos.x; + glmat[13] = pos.y; + glmat[14] = pos.z; + glmat[15] = 1.0f; + + glMultMatrixf(glmat); +} + +void SetupGLMatrix(const Point& pos, const Matrix3x3& rot) +{ + float glmat[16]; //4x4 column major matrix for OpenGL. + glmat[0] = rot.m[0][0]; + glmat[1] = rot.m[0][1]; + glmat[2] = rot.m[0][2]; + glmat[3] = 0.0f; + + glmat[4] = rot.m[1][0]; + glmat[5] = rot.m[1][1]; + glmat[6] = rot.m[1][2]; + glmat[7] = 0.0f; + + glmat[8] = rot.m[2][0]; + glmat[9] = rot.m[2][1]; + glmat[10] = rot.m[2][2]; + glmat[11] = 0.0f; + + glmat[12] = pos.x; + glmat[13] = pos.y; + glmat[14] = pos.z; + glmat[15] = 1.0f; + + glMultMatrixf(glmat); +} + +void SetupGLMatrix(const Matrix4x4& world) +{ + SetupGLMatrix(world.GetTrans(), world); +} + +//////////////////////// + +static void RenderSphere(float radius) +{ + glutSolidSphere(radius, 12, 12); // Radius / slices / stacks +} + +void DrawSphere(const Sphere& sphere) +{ + glPushMatrix(); + SetupGLMatrix(sphere.mCenter); + RenderSphere(sphere.mRadius); + glPopMatrix(); +} + +//////////////////////// + +static void RenderBox(int size) +{ + glutSolidCube(size); +} + +void DrawOBB(const OBB& obb) +{ + glPushMatrix(); + SetupGLMatrix(obb.mCenter, obb.mRot); + glScalef(obb.mExtents.x, obb.mExtents.y, obb.mExtents.z); + RenderBox(2); + glPopMatrix(); +} + +//////////////////////// + +static float gCylinderData[]={ + 1.0f,0.0f,1.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f, + 0.866025f,0.500000f,1.0f,0.866025f,0.500000f,1.0f,0.866025f,0.500000f,0.0f,0.866025f,0.500000f,0.0f, + 0.500000f,0.866025f,1.0f,0.500000f,0.866025f,1.0f,0.500000f,0.866025f,0.0f,0.500000f,0.866025f,0.0f, + -0.0f,1.0f,1.0f,-0.0f,1.0f,1.0f,-0.0f,1.0f,0.0f,-0.0f,1.0f,0.0f, + -0.500000f,0.866025f,1.0f,-0.500000f,0.866025f,1.0f,-0.500000f,0.866025f,0.0f,-0.500000f,0.866025f,0.0f, + -0.866025f,0.500000f,1.0f,-0.866025f,0.500000f,1.0f,-0.866025f,0.500000f,0.0f,-0.866025f,0.500000f,0.0f, + -1.0f,-0.0f,1.0f,-1.0f,-0.0f,1.0f,-1.0f,-0.0f,0.0f,-1.0f,-0.0f,0.0f, + -0.866025f,-0.500000f,1.0f,-0.866025f,-0.500000f,1.0f,-0.866025f,-0.500000f,0.0f,-0.866025f,-0.500000f,0.0f, + -0.500000f,-0.866025f,1.0f,-0.500000f,-0.866025f,1.0f,-0.500000f,-0.866025f,0.0f,-0.500000f,-0.866025f,0.0f, + 0.0f,-1.0f,1.0f,0.0f,-1.0f,1.0f,0.0f,-1.0f,0.0f,0.0f,-1.0f,0.0f, + 0.500000f,-0.866025f,1.0f,0.500000f,-0.866025f,1.0f,0.500000f,-0.866025f,0.0f,0.500000f,-0.866025f,0.0f, + 0.866026f,-0.500000f,1.0f,0.866026f,-0.500000f,1.0f,0.866026f,-0.500000f,0.0f,0.866026f,-0.500000f,0.0f, + 1.0f,0.0f,1.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f +}; + +static float gCylinderDataCapsTop[]={ + 0.866026f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,-1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,-1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -1.000000f,-0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -1.000000f,-0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 1.000000f,0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 1.000000f,0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.866026f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, +}; + +static float gCylinderDataCapsBottom[]={ + 1.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.000000f,1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.000000f,1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -1.000000f,-0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -1.000000f,-0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,-1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,-1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866026f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866026f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 1.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, +}; + +static void RenderCylinder() +{ + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderData); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderData+3); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 13*2); + + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsTop); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsTop+3); + glDrawArrays(GL_TRIANGLES, 0, 36); + + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsBottom); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsBottom+3); + glDrawArrays(GL_TRIANGLES, 0, 36); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); +} + +void DrawCapsule(const Matrix4x4& world, const Point& p0, const Point& p1, float r) +{ + const float h = p0.Distance(p1); + + glPushMatrix(); + SetupGLMatrix(world); + + glPushMatrix(); + glTranslatef(0.0f, h*0.5f, 0.0f); + RenderSphere(r); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,-h*0.5f, 0.0f); + RenderSphere(r); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,h*0.5f, 0.0f); + glScalef(r,h,r); + glRotatef(90.0f,1.0f,0.0f,0.0f); + RenderCylinder(); + glPopMatrix(); + + glPopMatrix(); +} + + + +#ifdef TOSEE +#include "NxPhysics.h" +#include "DrawObjects.h" + +#include + +static float gPlaneData[]={ + -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f +}; + + +static void RenderPlane() +{ + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gPlaneData); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gPlaneData+3); + glDrawArrays(GL_TRIANGLES, 0, 6); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); +} + +void SetupGLMatrix(const NxVec3& pos, const NxMat33& orient) +{ + float glmat[16]; //4x4 column major matrix for OpenGL. + orient.getColumnMajorStride4(&(glmat[0])); + pos.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); +} + +void DrawLine(const NxVec3& p0, const NxVec3& p1, const NxVec3& color, float lineWidth) +{ + glDisable(GL_LIGHTING); + glLineWidth(lineWidth); + glColor4f(color.x, color.y, color.z, 1.0f); + NxVec3 av3LineEndpoints[] = {p0, p1}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &av3LineEndpoints[0].x); + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawTriangle(const NxVec3& p0, const NxVec3& p1, const NxVec3& p2, const NxVec3& color) +{ + glDisable(GL_LIGHTING); + glColor4f(color.x, color.y, color.z, 1.0f); + NxVec3 av3LineEndpoints[] = {p0, p1, p2}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &av3LineEndpoints[0].x); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawCircle(NxU32 nbSegments, const NxMat34& matrix, const NxVec3& color, const NxF32 radius, const bool semicircle) +{ + NxF32 step = NxTwoPiF32/NxF32(nbSegments); + NxU32 segs = nbSegments; + if(semicircle) + { + segs /= 2; + } + + for(NxU32 i=0;igetGlobalPose(); + NxPlaneShape* planeShape = plane->isPlane(); + NxPlane p = planeShape->getPlane(); + pose.t.x += p.d; + pose.t.y += p.d; + pose.t.z += p.d; + + glPushMatrix(); + glDisable(GL_LIGHTING); + glColor4f(0.1f, 0.2f, 0.3f, 1.0f); + pose.t.y -= 0.1f; + SetupGLMatrix(pose.t, pose.M); + glScalef(1024,0,1024); + RenderPlane(); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); + glPopMatrix(); +} + +void DrawWireBox(const NxBox& obb, const NxVec3& color, float lineWidth) +{ + // Compute obb vertices + NxVec3 pp[8]; + NxComputeBoxPoints(obb, pp); + + // Draw all lines + const NxU32* Indices = NxGetBoxEdges(); + for(NxU32 i=0;i<12;i++) + { + NxU32 VRef0 = *Indices++; + NxU32 VRef1 = *Indices++; + DrawLine(pp[VRef0], pp[VRef1], color, lineWidth); + } +} + +void DrawWireBox(NxShape* box, const NxVec3& color, float lineWidth) +{ + NxBox obb; + box->isBox()->getWorldOBB(obb); + + DrawWireBox(obb, color, lineWidth); +} + + +void DrawWireSphere(NxShape* sphere, const NxVec3& color) +{ + NxMat34 pose = sphere->getGlobalPose(); + + glPushMatrix(); + NxReal r = sphere->isSphere()->getRadius(); + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawCircle(20, pose, color, r); + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + DrawCircle(20, pose, color, r); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + DrawCircle(20, pose, color, r); + + glPopMatrix(); +} + +void DrawSphere(NxShape* sphere) +{ + NxMat34 pose = sphere->getGlobalPose(); + + glPushMatrix(); + SetupGLMatrix(pose.t, pose.M); + NxReal r = sphere->isSphere()->getRadius(); + glScalef(r,r,r); + RenderSphere(); + glPopMatrix(); +} + +void DrawWireCapsule(NxShape* capsule, const NxVec3& color) +{ + NxMat34 pose = capsule->getGlobalPose(); + + NxReal r = capsule->isCapsule()->getRadius(); + NxReal h = capsule->isCapsule()->getHeight(); + + NxSegment SG; + pose.M.getColumn(1, SG.p1); + SG.p1 *= 0.5f*h; + SG.p0 = -SG.p1; + SG.p0 += pose.t; + SG.p1 += pose.t; + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawLine(SG.p0 + c0*r, SG.p1 + c0*r, color); + DrawLine(SG.p0 - c0*r, SG.p1 - c0*r, color); + DrawLine(SG.p0 + c2*r, SG.p1 + c2*r, color); + DrawLine(SG.p0 - c2*r, SG.p1 - c2*r, color); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true); //halfcircle -- flipped + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true);//halfcircle -- good + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + pose.t = SG.p0; + DrawCircle(20, pose, color, r); //full circle + pose.t = SG.p1; + DrawCircle(20, pose, color, r); +} + +static void computeBasis(const NxVec3& dir, NxVec3& right, NxVec3& up) +{ + // Derive two remaining vectors + if(fabsf(dir.y)>0.9999f) right = NxVec3(1.0f, 0.0f, 0.0f); + else right = (NxVec3(0.0f, 1.0f, 0.0f) ^ dir); + right.normalize(); + up = dir ^ right; +} + +void DrawWireCapsule(const NxCapsule& capsule, const NxVec3& color) +{ + NxReal r = capsule.radius; + NxVec3 dir = capsule.p0 - capsule.p1; + NxReal h = dir.magnitude(); + NxMat34 pose; + pose.t = (capsule.p0 + capsule.p1)*0.5f; + + if(h!=0.0f) + { + dir/=h; + NxVec3 right, up; + computeBasis(dir, right, up); + pose.M.setColumn(0, right); + pose.M.setColumn(1, dir); + pose.M.setColumn(2, up); + } + else + { + pose.M.id(); + } + +// NxMat34 pose = capsule->getGlobalPose(); +// const NxReal & r = capsule->isCapsule()->getRadius(); +// const NxReal & h = capsule->isCapsule()->getHeight(); + + + + NxSegment SG; + pose.M.getColumn(1, SG.p1); + SG.p1 *= 0.5f*h; + SG.p0 = -SG.p1; + SG.p0 += pose.t; + SG.p1 += pose.t; + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawLine(SG.p0 + c0*r, SG.p1 + c0*r, color); + DrawLine(SG.p0 - c0*r, SG.p1 - c0*r, color); + DrawLine(SG.p0 + c2*r, SG.p1 + c2*r, color); + DrawLine(SG.p0 - c2*r, SG.p1 - c2*r, color); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true); //halfcircle -- flipped + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true);//halfcircle -- good + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + pose.t = SG.p0; + DrawCircle(20, pose, color, r); //full circle + pose.t = SG.p1; + DrawCircle(20, pose, color, r); +} + +void DrawCapsule(const NxVec3& color, NxF32 r, NxF32 h) +{ + glColor4f(color.x, color.y, color.z, 1.0f); + + glPushMatrix(); + glTranslatef(0.0f, h*0.5f, 0.0f); + glScalef(r,r,r); + RenderSphere(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,-h*0.5f, 0.0f); + glScalef(r,r,r); + RenderSphere(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,h*0.5f, 0.0f); + glScalef(r,h,r); + glRotatef(90.0f,1.0f,0.0f,0.0f); + RenderCylinder(); + glPopMatrix(); +} + +typedef NxVec3 Point; +typedef struct _Triangle { NxU32 p0; NxU32 p1; NxU32 p2; } Triangle; + +void DrawWireConvex(NxShape* mesh, const NxVec3& color) +{ + if(mesh->userData == NULL) return; + + NxMat34 pose = mesh->getGlobalPose(); + + NxConvexMeshDesc meshDesc = *((NxConvexMeshDesc*)(mesh->userData)); +// mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + while(nbTriangles--) + { + DrawLine(points[triangles->p0], points[triangles->p1], color); + DrawLine(points[triangles->p1], points[triangles->p2], color); + DrawLine(points[triangles->p2], points[triangles->p0], color); + triangles++; + } + + glPopMatrix(); +} + +void DrawTriangleList(int iTriangleCount, Triangle *pTriangles, Point *pPoints) +{ + static int iBufferSize=0; + static float *pfVertexBuffer=NULL; + static float *pfNormalBuffer=NULL; + + if(iBufferSize < iTriangleCount*3) + { + iBufferSize=3*iTriangleCount; + + delete[] pfVertexBuffer; + pfVertexBuffer = new float[iBufferSize*3]; + + delete[] pfNormalBuffer; + pfNormalBuffer = new float[iBufferSize*3]; + } + + float *pfDestinationVertex=pfVertexBuffer; + float *pfDestinationNormal=pfNormalBuffer; + + for(int iTriangle=0; iTrianglep0].x; + *pfDestinationVertex++=pPoints[pTriangles->p0].y; + *pfDestinationVertex++=pPoints[pTriangles->p0].z; + *pfDestinationVertex++=pPoints[pTriangles->p1].x; + *pfDestinationVertex++=pPoints[pTriangles->p1].y; + *pfDestinationVertex++=pPoints[pTriangles->p1].z; + *pfDestinationVertex++=pPoints[pTriangles->p2].x; + *pfDestinationVertex++=pPoints[pTriangles->p2].y; + *pfDestinationVertex++=pPoints[pTriangles->p2].z; + + NxVec3 edge1 = pPoints[pTriangles->p1] - pPoints[pTriangles->p0]; + NxVec3 edge2 = pPoints[pTriangles->p2] - pPoints[pTriangles->p0]; + NxVec3 normal = edge1.cross(edge2); + normal.normalize(); + + *pfDestinationNormal++=normal.x; + *pfDestinationNormal++=normal.y; + *pfDestinationNormal++=normal.z; + *pfDestinationNormal++=normal.x; + *pfDestinationNormal++=normal.y; + *pfDestinationNormal++=normal.z; + *pfDestinationNormal++=normal.x; + *pfDestinationNormal++=normal.y; + *pfDestinationNormal++=normal.z; + + pTriangles++; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, pfVertexBuffer); + glEnableClientState(GL_NORMAL_ARRAY); + glNormalPointer(GL_FLOAT, 0, pfNormalBuffer); + + glDrawArrays(GL_TRIANGLES, 0, 3*iTriangleCount); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + +} + +void DrawConvex(NxShape* mesh) +{ + NxConvexMeshDesc meshDesc; + + // SRM : Please note that I looked into a crash issue posed by + // one of our customers, and this code (i.e. reinterpreting the + // NxShape's userData as an NxConvexMeshDesc * was crashing because + // in the SampleRaycastCar demo, it sets that pointer equal to the + // NxWheel because that is used in NxVehicle::handleContactPair(). Thus + // in order to allow this code not to crash on the PS3, we should + // simply force the shape to save its description here. + mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); + /** + if(mesh->userData != NULL) + { + meshDesc = *((NxConvexMeshDesc*)(mesh->userData)); + } else { + mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); + } + **/ + + NxMat34 pose = mesh->getGlobalPose(); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + DrawTriangleList(nbTriangles, triangles, points); + + glPopMatrix(); +} + +void DrawWireMesh(NxShape* mesh, const NxVec3& color) +{ + if(mesh->userData == NULL) return; + + NxMat34 pose = mesh->getGlobalPose(); + + NxTriangleMeshDesc meshDesc = *((NxTriangleMeshDesc*)(mesh->userData)); +// mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + while(nbTriangles--) + { + DrawLine(points[triangles->p0], points[triangles->p1], color); + DrawLine(points[triangles->p1], points[triangles->p2], color); + DrawLine(points[triangles->p2], points[triangles->p0], color); + triangles++; + } + + glPopMatrix(); +} + +void DrawMesh(NxShape* mesh) +{ + if(mesh->userData == NULL) return; + + NxMat34 pose = mesh->getGlobalPose(); + + NxTriangleMeshDesc meshDesc = *((NxTriangleMeshDesc*)(mesh->userData)); +// mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + if(meshDesc.heightFieldVerticalAxis != NX_NOT_HEIGHTFIELD) + { + glDisable(GL_LIGHT0); + glEnable(GL_LIGHT1); + } + + DrawTriangleList(nbTriangles, triangles, points); + + if(meshDesc.heightFieldVerticalAxis != NX_NOT_HEIGHTFIELD) + { + glDisable(GL_LIGHT1); + glEnable(GL_LIGHT0); + } + + glPopMatrix(); +} + +void DrawWheelShape(NxShape* wheel) +{ + if(wheel->is(NX_SHAPE_WHEEL) != NULL) + { + NxWheelShape* wheelShape = (NxWheelShape*)wheel; + glPushMatrix(); + + float glmat[16]; + wheel->getGlobalPose().getColumnMajor44(glmat); + + NxWheelShapeDesc wheelShapeDesc; + + float r = wheelShape->getRadius(); + float a = wheelShape->getSteerAngle(); + + glMultMatrixf(&(glmat[0])); + glTranslatef(-r/2,0,0); + glRotatef(90,0,1,0); + glRotatef(NxMath::radToDeg(a),0,1,0); + + glScalef(r, r, r); + RenderCylinder(); + glPopMatrix(); + } +} + +void DrawArrow(const NxVec3& posA, const NxVec3& posB, const NxVec3& color) +{ + NxVec3 vec = posB - posA; + NxVec3 t0, t1, t2; + NxNormalToTangents(vec, t1, t2); + + t0 = posB - posA; + t0.normalize(); + + NxVec3 lobe1 = posB - t0*0.15 + t1 * 0.15; + NxVec3 lobe2 = posB - t0*0.15 - t1 * 0.15; + NxVec3 lobe3 = posB - t0*0.15 + t2 * 0.15; + NxVec3 lobe4 = posB - t0*0.15 - t2 * 0.15; + + NxVec3 v3ArrowShape[] = { + NxVec3(posA), NxVec3(posB), + NxVec3(posB), NxVec3(lobe1), + NxVec3(posB), NxVec3(lobe2), + NxVec3(posB), NxVec3(lobe3), + NxVec3(posB), NxVec3(lobe4), + }; + + glDisable(GL_LIGHTING); + glLineWidth(3.0f); + glColor4f(color.x,color.y,color.z,1.0f); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &v3ArrowShape[0].x); + glDrawArrays(GL_LINES, 0, sizeof(v3ArrowShape)/sizeof(NxVec3)); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f,1.0f,1.0f,1.0f); +} + +void DrawContactPoint(const NxVec3& pos, const NxReal radius, const NxVec3& color) +{ + NxMat34 pose; + pose.t = pos; + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawCircle(20, pose, color, radius); + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + DrawCircle(20, pose, color, radius); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + DrawCircle(20, pose, color, radius); +} + +void DrawWireShape(NxShape *shape, const NxVec3& color) +{ + switch(shape->getType()) + { + case NX_SHAPE_PLANE: + DrawWirePlane(shape, color); + break; + case NX_SHAPE_BOX: + DrawWireBox(shape, color); + break; + case NX_SHAPE_SPHERE: + DrawWireSphere(shape, color); + break; + case NX_SHAPE_CAPSULE: + DrawWireCapsule(shape, color); + break; + case NX_SHAPE_CONVEX: + DrawWireConvex(shape, color); + break; + case NX_SHAPE_MESH: + DrawWireMesh(shape, color); + break; + } +} + +void DrawShape(NxShape* shape) +{ + switch(shape->getType()) + { + case NX_SHAPE_PLANE: + DrawPlane(shape); + break; + case NX_SHAPE_BOX: + DrawBox(shape); + break; + case NX_SHAPE_SPHERE: + DrawSphere(shape); + break; + case NX_SHAPE_CAPSULE: + DrawCapsule(shape); + break; + case NX_SHAPE_CONVEX: + DrawConvex(shape); + break; + case NX_SHAPE_MESH: + DrawMesh(shape); + break; + case NX_SHAPE_WHEEL: + DrawWheelShape(shape); + break; + } +} + +void DrawActor(NxActor* actor, NxActor* gSelectedActor) +{ + NxShape*const* shapes = actor->getShapes(); + NxU32 nShapes = actor->getNbShapes(); + if (actor == gSelectedActor) + { + while (nShapes--) + { + DrawWireShape(shapes[nShapes], NxVec3(1,1,1)); + } + } + nShapes = actor->getNbShapes(); + while (nShapes--) + { + DrawShape(shapes[nShapes]); + } +} + +void DrawWireActor(NxActor* actor) +{ + NxShape*const* shapes = actor->getShapes(); + NxU32 nShapes = actor->getNbShapes(); + nShapes = actor->getNbShapes(); + while (nShapes--) + { + DrawWireShape(shapes[nShapes], NxVec3(1,1,1)); + } +} + +static void DrawActorShadow(NxActor* actor, const float* ShadowMat) +{ + glPushMatrix(); + glMultMatrixf(ShadowMat); + + glDisable(GL_LIGHTING); + glColor4f(0.05f, 0.1f, 0.15f, 1.0f); + + NxShape*const* shapes = actor->getShapes(); + NxU32 nShapes = actor->getNbShapes(); + while (nShapes--) + { + switch(shapes[nShapes]->getType()) + { + case NX_SHAPE_BOX: + DrawBox(shapes[nShapes]); + break; + case NX_SHAPE_SPHERE: + DrawSphere(shapes[nShapes]); + break; + case NX_SHAPE_CAPSULE: + DrawCapsule(shapes[nShapes]); + break; + case NX_SHAPE_CONVEX: + DrawConvex(shapes[nShapes]); + break; + } + } + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); + + glPopMatrix(); +} + + +void DrawActorShadow(NxActor* actor) +{ + const static float ShadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 }; + DrawActorShadow(actor, ShadowMat); +} + +void DrawActorShadow2(NxActor* actor) +{ + const static float ShadowMat[]={ 1,0,0,0, 1,0,-0.2,0, 0,0,1,0, 0,0,0,1 }; + DrawActorShadow(actor, ShadowMat); +} + +void DrawActorShadowZUp(NxActor* actor) +{ + const static float ShadowMat[]={ 1,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,1 }; + DrawActorShadow(actor, ShadowMat); +} + +void DrawCloth(NxCloth *cloth, bool shadows) +{ + NxMeshData meshData = cloth->getMeshData(); + + NxU32 numVertices = *meshData.numVerticesPtr; + NxU32 numTriangles = *meshData.numIndicesPtr / 3; + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, meshData.verticesPosBegin); + glNormalPointer(GL_FLOAT, 0, meshData.verticesNormalBegin); + +#ifdef __CELLOS_LV2__ + glDrawRangeElements(GL_TRIANGLES, 0, numVertices-1, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#else + glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#endif + + if (shadows) { + const static float ShadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 }; + glPushMatrix(); + glMultMatrixf(ShadowMat); + glDisable(GL_LIGHTING); + glColor4f(0.05f, 0.1f, 0.15f,1.0f); + +#ifdef __CELLOS_LV2__ + glDrawRangeElements(GL_TRIANGLES, 0, numVertices-1, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#else + glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#endif + + glColor4f(1.0f, 1.0f, 1.0f,1.0f); + glEnable(GL_LIGHTING); + glPopMatrix(); + } + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); +} + +#ifdef WIN32 +#include +typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int ); +PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0; +int vsyncState = 1; +#endif + +void toggleVSync() +{ +#ifdef WIN32 + if (wglSwapIntervalEXT == NULL) + { + const char* extensions = (const char*)glGetString(GL_EXTENSIONS); + if (strstr(extensions, "WGL_EXT_swap_control") != 0) + { + wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress( "wglSwapIntervalEXT" ); + } + } + if (wglSwapIntervalEXT != NULL) + { + vsyncState = 1 - vsyncState; + wglSwapIntervalEXT(vsyncState); + } +#endif +} +#endif diff --git a/Extras/CDTestFramework/RenderingHelpers.h b/Extras/CDTestFramework/RenderingHelpers.h index 9e207840a..24dcfb7a8 100644 --- a/Extras/CDTestFramework/RenderingHelpers.h +++ b/Extras/CDTestFramework/RenderingHelpers.h @@ -1,26 +1,26 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 RENDERINGHELPERS_H -#define RENDERINGHELPERS_H - -#include "Opcode.h" - - void DrawLine(const Point& p0, const Point& p1, const Point& color, float line_width); - void DrawTriangle(const Point& p0, const Point& p1, const Point& p2, const Point& color); - void DrawSphere(const Sphere& sphere); - void DrawOBB(const OBB& obb); - void DrawCapsule(const Matrix4x4& world, const Point& p0, const Point& p1, float r); - -#endif // RENDERINGHELPERS_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 RENDERINGHELPERS_H +#define RENDERINGHELPERS_H + +#include "Opcode.h" + + void DrawLine(const Point& p0, const Point& p1, const Point& color, float line_width); + void DrawTriangle(const Point& p0, const Point& p1, const Point& p2, const Point& color); + void DrawSphere(const Sphere& sphere); + void DrawOBB(const OBB& obb); + void DrawCapsule(const Matrix4x4& world, const Point& p0, const Point& p1, float r); + +#endif // RENDERINGHELPERS_H diff --git a/Extras/CDTestFramework/SphereMeshQuery.cpp b/Extras/CDTestFramework/SphereMeshQuery.cpp index 09f1dc93c..e78eadb09 100644 --- a/Extras/CDTestFramework/SphereMeshQuery.cpp +++ b/Extras/CDTestFramework/SphereMeshQuery.cpp @@ -1,141 +1,141 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "RenderingHelpers.h" -#include "IceHelpers.h" -#include "SphereMeshQuery.h" -#include "Terrain.h" -#include "Profiling.h" -#include "Camera.h" -#include "GLFontRenderer.h" - -SphereMeshQuery::SphereMeshQuery() : - mBar (null), - mDist (0.0f), - mValidHit (false) -{ -} - -SphereMeshQuery::~SphereMeshQuery() -{ -} - -void SphereMeshQuery::Init() -{ - mSphere.mCenter = Point(0.0f, 0.0f, 0.0f); - mSphere.mRadius = 1.0f; -} - -void SphereMeshQuery::Release() -{ - Deselect(); -} - -void SphereMeshQuery::Select() -{ - // Create a tweak bar - { - mBar = TwNewBar("SphereMeshQuery"); - TwAddVarRW(mBar, "Radius", TW_TYPE_FLOAT, &mSphere.mRadius, " min=0.01 max=200.0 step=0.05"); - - mSettings.AddToTweakBar(mBar); -// mProfiler.AddToTweakBar(mBar); - } -} - -void SphereMeshQuery::Deselect() -{ - if(mBar) - { - TwDeleteBar(mBar); - mBar = null; - } -} - -void SphereMeshQuery::PerformTest() -{ - RenderTerrain(); - - DrawSphere(mSphere); - - // OPCODE query - const Model* TM = GetTerrainModel(); - if(TM) - { - SphereCollider Collider; - mSettings.SetupCollider(Collider); - - mProfiler.Start(); - bool Status = Collider.Collide(mCache, mSphere, *TM, null, null); - mProfiler.End(); - mProfiler.Accum(); - - if(Status) - { - if(Collider.GetContactStatus()) - { - udword NbTris = Collider.GetNbTouchedPrimitives(); - const udword* Indices = Collider.GetTouchedPrimitives(); - - RenderTerrainTriangles(NbTris, Indices); - } - } - } - - // Raycast hit - if(mValidHit) - { - Point wp = mLocalHit + mSphere.mCenter; - DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); - DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); - DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); - } - - char Buffer[4096]; - sprintf(Buffer, "Sphere-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); - GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); -} - -void SphereMeshQuery::KeyboardCallback(unsigned char key, int x, int y) -{ -} - -void SphereMeshQuery::MouseCallback(int button, int state, int x, int y) -{ - mValidHit = false; - if(!button && !state) - { - Point Dir = ComputeWorldRay(x, y); - - float d; - Point hit; - if(SegmentSphere(GetCameraPos(), Dir, 10000.0f, mSphere.mCenter, mSphere.mRadius, d, hit)) - { - mValidHit = true; - mDist = d; - mLocalHit = hit - mSphere.mCenter; - } - } -} - -void SphereMeshQuery::MotionCallback(int x, int y) -{ - if(mValidHit) - { - Point Dir = ComputeWorldRay(x, y); - mSphere.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; - } -} +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "RenderingHelpers.h" +#include "IceHelpers.h" +#include "SphereMeshQuery.h" +#include "Terrain.h" +#include "Profiling.h" +#include "Camera.h" +#include "GLFontRenderer.h" + +SphereMeshQuery::SphereMeshQuery() : + mBar (null), + mDist (0.0f), + mValidHit (false) +{ +} + +SphereMeshQuery::~SphereMeshQuery() +{ +} + +void SphereMeshQuery::Init() +{ + mSphere.mCenter = Point(0.0f, 0.0f, 0.0f); + mSphere.mRadius = 1.0f; +} + +void SphereMeshQuery::Release() +{ + Deselect(); +} + +void SphereMeshQuery::Select() +{ + // Create a tweak bar + { + mBar = TwNewBar("SphereMeshQuery"); + TwAddVarRW(mBar, "Radius", TW_TYPE_FLOAT, &mSphere.mRadius, " min=0.01 max=200.0 step=0.05"); + + mSettings.AddToTweakBar(mBar); +// mProfiler.AddToTweakBar(mBar); + } +} + +void SphereMeshQuery::Deselect() +{ + if(mBar) + { + TwDeleteBar(mBar); + mBar = null; + } +} + +void SphereMeshQuery::PerformTest() +{ + RenderTerrain(); + + DrawSphere(mSphere); + + // OPCODE query + const Model* TM = GetTerrainModel(); + if(TM) + { + SphereCollider Collider; + mSettings.SetupCollider(Collider); + + mProfiler.Start(); + bool Status = Collider.Collide(mCache, mSphere, *TM, null, null); + mProfiler.End(); + mProfiler.Accum(); + + if(Status) + { + if(Collider.GetContactStatus()) + { + udword NbTris = Collider.GetNbTouchedPrimitives(); + const udword* Indices = Collider.GetTouchedPrimitives(); + + RenderTerrainTriangles(NbTris, Indices); + } + } + } + + // Raycast hit + if(mValidHit) + { + Point wp = mLocalHit + mSphere.mCenter; + DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); + } + + char Buffer[4096]; + sprintf(Buffer, "Sphere-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +void SphereMeshQuery::KeyboardCallback(unsigned char key, int x, int y) +{ +} + +void SphereMeshQuery::MouseCallback(int button, int state, int x, int y) +{ + mValidHit = false; + if(!button && !state) + { + Point Dir = ComputeWorldRay(x, y); + + float d; + Point hit; + if(SegmentSphere(GetCameraPos(), Dir, 10000.0f, mSphere.mCenter, mSphere.mRadius, d, hit)) + { + mValidHit = true; + mDist = d; + mLocalHit = hit - mSphere.mCenter; + } + } +} + +void SphereMeshQuery::MotionCallback(int x, int y) +{ + if(mValidHit) + { + Point Dir = ComputeWorldRay(x, y); + mSphere.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; + } +} diff --git a/Extras/CDTestFramework/SphereMeshQuery.h b/Extras/CDTestFramework/SphereMeshQuery.h index 9d74aa161..e03eee7cb 100644 --- a/Extras/CDTestFramework/SphereMeshQuery.h +++ b/Extras/CDTestFramework/SphereMeshQuery.h @@ -1,48 +1,48 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 SPHEREMESHQUERY_H -#define SPHEREMESHQUERY_H - -#include "CollisionTest.h" -#include "Profiling.h" - - class SphereMeshQuery : public CollisionTest - { - public: - SphereMeshQuery(); - virtual ~SphereMeshQuery(); - - virtual void Init(); - virtual void Release(); - virtual void PerformTest(); - virtual void Select(); - virtual void Deselect(); - virtual void KeyboardCallback(unsigned char key, int x, int y); - virtual void MouseCallback(int button, int state, int x, int y); - virtual void MotionCallback(int x, int y); - - TwBar* mBar; //!< AntTweakBar - Sphere mSphere; - - SphereCache mCache; - OpcodeSettings mSettings; - Profiler mProfiler; - - float mDist; - Point mLocalHit; - bool mValidHit; - }; - -#endif // SPHEREMESHQUERY_H +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 SPHEREMESHQUERY_H +#define SPHEREMESHQUERY_H + +#include "CollisionTest.h" +#include "Profiling.h" + + class SphereMeshQuery : public CollisionTest + { + public: + SphereMeshQuery(); + virtual ~SphereMeshQuery(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + virtual void Select(); + virtual void Deselect(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + Sphere mSphere; + + SphereCache mCache; + OpcodeSettings mSettings; + Profiler mProfiler; + + float mDist; + Point mLocalHit; + bool mValidHit; + }; + +#endif // SPHEREMESHQUERY_H diff --git a/Extras/CDTestFramework/Terrain.cpp b/Extras/CDTestFramework/Terrain.cpp index ce97051f7..c849ce3f5 100644 --- a/Extras/CDTestFramework/Terrain.cpp +++ b/Extras/CDTestFramework/Terrain.cpp @@ -1,470 +1,470 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 "stdafx.h" -#include "Terrain.h" - -inline float NxAngle(const Point& v0, const Point& v1) - { - float cos = v0|v1; // |v0|*|v1|*Cos(Angle) - float sin = (v0^v1).Magnitude(); // |v0|*|v1|*Sin(Angle) - return ::atan2(sin, cos); - } - -static float computeAngle(const Point* verts, const udword* refs, udword vref) -{ - udword e0=0,e2=0; - if(vref==refs[0]) - { - e0 = 2; - e2 = 1; - } - else if(vref==refs[1]) - { - e0 = 2; - e2 = 0; - } - else if(vref==refs[2]) - { - e0 = 0; - e2 = 1; - } - else - { - assert(0); - } - Point edge0 = verts[refs[e0]] - verts[vref]; - Point edge1 = verts[refs[e2]] - verts[vref]; - - return NxAngle(edge0, edge1); -} -static bool buildSmoothNormals( - udword nbTris, udword nbVerts, - const Point* verts, - const udword* dFaces, const uword* wFaces, - Point* normals, - bool flip) - { - // Checkings - if(!verts || !normals || !nbTris || !nbVerts) return false; - - // Get correct destination buffers - // - if available, write directly to user-provided buffers - // - else get some ram and keep track of it - Point* FNormals = new Point[nbTris]; - if(!FNormals) return false; - - // Compute face normals - udword c = (flip!=0); - for(udword i=0;i>=1; - if(!currentSize) return; - - // Compute new heights - float v0 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); - float v1 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); - float v2 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); - float v3 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); - float v4 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); - - udword x1 = (x0+currentSize) % initSize; - udword x2 = (x0+currentSize+currentSize) % initSize; - udword y1 = (y0+currentSize) % initSize; - udword y2 = (y0+currentSize+currentSize) % initSize; - - if(!done[x1 + y0*initSize]) field[x1 + y0*initSize].y = v0 + 0.5f * (field[x0 + y0*initSize].y + field[x2 + y0*initSize].y); - if(!done[x0 + y1*initSize]) field[x0 + y1*initSize].y = v1 + 0.5f * (field[x0 + y0*initSize].y + field[x0 + y2*initSize].y); - if(!done[x2 + y1*initSize]) field[x2 + y1*initSize].y = v2 + 0.5f * (field[x2 + y0*initSize].y + field[x2 + y2*initSize].y); - if(!done[x1 + y2*initSize]) field[x1 + y2*initSize].y = v3 + 0.5f * (field[x0 + y2*initSize].y + field[x2 + y2*initSize].y); - if(!done[x1 + y1*initSize]) field[x1 + y1*initSize].y = v4 + 0.5f * (field[x0 + y1*initSize].y + field[x2 + y1*initSize].y); - - done[x1 + y0*initSize] = true; - done[x0 + y1*initSize] = true; - done[x2 + y1*initSize] = true; - done[x1 + y2*initSize] = true; - done[x1 + y1*initSize] = true; - - // Recurse through 4 corners - value *= 0.5f; - _Compute(done, field, x0, y0, currentSize, value, initSize); - _Compute(done, field, x0, y1, currentSize, value, initSize); - _Compute(done, field, x1, y0, currentSize, value, initSize); - _Compute(done, field, x1, y1, currentSize, value, initSize); - } - }; - - // Fractalize - srand(42); - bool* done = new bool[nbVerts]; - memset(done,0,nbVerts*sizeof(bool)); - verts[0].y = 10.0f; - verts[size-1].y = 10.0f; - verts[size*(size-1)].y = 10.0f; - verts[nbVerts-1].y = 10.0f; - Local::_Compute(done, verts, 0, 0, size, chaos, size); - for(udword i=0;iinit(TERRAIN_SIZE, TERRAIN_OFFSET, TERRAIN_WIDTH, TERRAIN_CHAOS); - - // Build OPCODE model - - gMeshInterface.SetNbTriangles(gTerrainData->nbFaces); - gMeshInterface.SetNbVertices(gTerrainData->nbVerts); - gMeshInterface.SetPointers((const IndexedTriangle*)gTerrainData->faces, gTerrainData->verts); - - OPCODECREATE Create; - Create.mIMesh = &gMeshInterface; - Create.mSettings.mLimit = 1; - Create.mSettings.mRules = SPLIT_SPLATTER_POINTS|SPLIT_GEOM_CENTER; - Create.mNoLeaf = true; - Create.mQuantized = true; - Create.mKeepOriginal = false; - Create.mCanRemap = false; - - gOpcodeModel = new Model; - if(!gOpcodeModel->Build(Create)) - { - } -} - -void RenderTerrain() -{ - if(gTerrainData) - renderTerrain(*gTerrainData, true); -} - -void RenderTerrainTriangles(udword nbTriangles, const udword* indices) -{ - if(gTerrainData) - renderTerrainTriangles(*gTerrainData, nbTriangles, indices); -} +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 "stdafx.h" +#include "Terrain.h" + +inline float NxAngle(const Point& v0, const Point& v1) + { + float cos = v0|v1; // |v0|*|v1|*Cos(Angle) + float sin = (v0^v1).Magnitude(); // |v0|*|v1|*Sin(Angle) + return ::atan2(sin, cos); + } + +static float computeAngle(const Point* verts, const udword* refs, udword vref) +{ + udword e0=0,e2=0; + if(vref==refs[0]) + { + e0 = 2; + e2 = 1; + } + else if(vref==refs[1]) + { + e0 = 2; + e2 = 0; + } + else if(vref==refs[2]) + { + e0 = 0; + e2 = 1; + } + else + { + assert(0); + } + Point edge0 = verts[refs[e0]] - verts[vref]; + Point edge1 = verts[refs[e2]] - verts[vref]; + + return NxAngle(edge0, edge1); +} +static bool buildSmoothNormals( + udword nbTris, udword nbVerts, + const Point* verts, + const udword* dFaces, const uword* wFaces, + Point* normals, + bool flip) + { + // Checkings + if(!verts || !normals || !nbTris || !nbVerts) return false; + + // Get correct destination buffers + // - if available, write directly to user-provided buffers + // - else get some ram and keep track of it + Point* FNormals = new Point[nbTris]; + if(!FNormals) return false; + + // Compute face normals + udword c = (flip!=0); + for(udword i=0;i>=1; + if(!currentSize) return; + + // Compute new heights + float v0 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v1 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v2 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v3 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v4 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + + udword x1 = (x0+currentSize) % initSize; + udword x2 = (x0+currentSize+currentSize) % initSize; + udword y1 = (y0+currentSize) % initSize; + udword y2 = (y0+currentSize+currentSize) % initSize; + + if(!done[x1 + y0*initSize]) field[x1 + y0*initSize].y = v0 + 0.5f * (field[x0 + y0*initSize].y + field[x2 + y0*initSize].y); + if(!done[x0 + y1*initSize]) field[x0 + y1*initSize].y = v1 + 0.5f * (field[x0 + y0*initSize].y + field[x0 + y2*initSize].y); + if(!done[x2 + y1*initSize]) field[x2 + y1*initSize].y = v2 + 0.5f * (field[x2 + y0*initSize].y + field[x2 + y2*initSize].y); + if(!done[x1 + y2*initSize]) field[x1 + y2*initSize].y = v3 + 0.5f * (field[x0 + y2*initSize].y + field[x2 + y2*initSize].y); + if(!done[x1 + y1*initSize]) field[x1 + y1*initSize].y = v4 + 0.5f * (field[x0 + y1*initSize].y + field[x2 + y1*initSize].y); + + done[x1 + y0*initSize] = true; + done[x0 + y1*initSize] = true; + done[x2 + y1*initSize] = true; + done[x1 + y2*initSize] = true; + done[x1 + y1*initSize] = true; + + // Recurse through 4 corners + value *= 0.5f; + _Compute(done, field, x0, y0, currentSize, value, initSize); + _Compute(done, field, x0, y1, currentSize, value, initSize); + _Compute(done, field, x1, y0, currentSize, value, initSize); + _Compute(done, field, x1, y1, currentSize, value, initSize); + } + }; + + // Fractalize + srand(42); + bool* done = new bool[nbVerts]; + memset(done,0,nbVerts*sizeof(bool)); + verts[0].y = 10.0f; + verts[size-1].y = 10.0f; + verts[size*(size-1)].y = 10.0f; + verts[nbVerts-1].y = 10.0f; + Local::_Compute(done, verts, 0, 0, size, chaos, size); + for(udword i=0;iinit(TERRAIN_SIZE, TERRAIN_OFFSET, TERRAIN_WIDTH, TERRAIN_CHAOS); + + // Build OPCODE model + + gMeshInterface.SetNbTriangles(gTerrainData->nbFaces); + gMeshInterface.SetNbVertices(gTerrainData->nbVerts); + gMeshInterface.SetPointers((const IndexedTriangle*)gTerrainData->faces, gTerrainData->verts); + + OPCODECREATE Create; + Create.mIMesh = &gMeshInterface; + Create.mSettings.mLimit = 1; + Create.mSettings.mRules = SPLIT_SPLATTER_POINTS|SPLIT_GEOM_CENTER; + Create.mNoLeaf = true; + Create.mQuantized = true; + Create.mKeepOriginal = false; + Create.mCanRemap = false; + + gOpcodeModel = new Model; + if(!gOpcodeModel->Build(Create)) + { + } +} + +void RenderTerrain() +{ + if(gTerrainData) + renderTerrain(*gTerrainData, true); +} + +void RenderTerrainTriangles(udword nbTriangles, const udword* indices) +{ + if(gTerrainData) + renderTerrainTriangles(*gTerrainData, nbTriangles, indices); +} diff --git a/Extras/CDTestFramework/Terrain.h b/Extras/CDTestFramework/Terrain.h index 3bfaeb001..3f5f6f23b 100644 --- a/Extras/CDTestFramework/Terrain.h +++ b/Extras/CDTestFramework/Terrain.h @@ -1,47 +1,47 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 TERRAIN_H -#define TERRAIN_H - - class TerrainData - { - public: - TerrainData(); - ~TerrainData(); - - void init(udword size, float offset, float width, float chaos, bool flat=false, const Point* pos=NULL); - void release(); - - udword size; - udword nbVerts; - udword nbFaces; - float offset; - float width; - float chaos; - Point* verts; - Point* colors; - Point* normals; - udword* faces; - }; - - void CreateTerrain(); - void ReleaseTerrain(); - - void RenderTerrain(); - void RenderTerrainTriangles(udword nbTriangles, const udword* indices); - - const Model* GetTerrainModel(); - -#endif +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 TERRAIN_H +#define TERRAIN_H + + class TerrainData + { + public: + TerrainData(); + ~TerrainData(); + + void init(udword size, float offset, float width, float chaos, bool flat=false, const Point* pos=NULL); + void release(); + + udword size; + udword nbVerts; + udword nbFaces; + float offset; + float width; + float chaos; + Point* verts; + Point* colors; + Point* normals; + udword* faces; + }; + + void CreateTerrain(); + void ReleaseTerrain(); + + void RenderTerrain(); + void RenderTerrainTriangles(udword nbTriangles, const udword* indices); + + const Model* GetTerrainModel(); + +#endif diff --git a/Extras/CDTestFramework/stdafx.cpp b/Extras/CDTestFramework/stdafx.cpp index 48d975060..b4e1e25c8 100644 --- a/Extras/CDTestFramework/stdafx.cpp +++ b/Extras/CDTestFramework/stdafx.cpp @@ -1,23 +1,23 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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. -*/ - -// stdafx.cpp : source file that includes just the standard includes -// CDTestFramework.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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. +*/ + +// stdafx.cpp : source file that includes just the standard includes +// CDTestFramework.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Extras/CDTestFramework/stdafx.h b/Extras/CDTestFramework/stdafx.h index 878a934e8..64535de0e 100644 --- a/Extras/CDTestFramework/stdafx.h +++ b/Extras/CDTestFramework/stdafx.h @@ -1,23 +1,23 @@ -/* -CDTestFramework http://codercorner.com -Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com - -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 // For _alloca -#include -#include "GL/glut.h" -#include "AntTweakBar.h" - -#include "Opcode.h" -using namespace Opcode; +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +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 // For _alloca +#include +#include "GL/glut.h" +#include "AntTweakBar.h" + +#include "Opcode.h" +using namespace Opcode; diff --git a/Extras/CUDA/btCudaBroadphase.cpp b/Extras/CUDA/btCudaBroadphase.cpp index 007c1ae4c..3f835d1eb 100644 --- a/Extras/CUDA/btCudaBroadphase.cpp +++ b/Extras/CUDA/btCudaBroadphase.cpp @@ -1,207 +1,207 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "LinearMath/btAlignedAllocator.h" -#include "LinearMath/btQuickprof.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" - -#include "btCudaBroadphase.h" -#include "radixsort.cuh" - - - -#define BT_GPU_PREF(func) btCuda_##func -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h" -#undef BT_GPU_PREF - -extern "C" void btCuda_setParameters(bt3DGridBroadphaseParams* hostParams); - - - -#include - - - - -btCudaBroadphase::btCudaBroadphase( btOverlappingPairCache* overlappingPairCache, - const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerSmallProxy, - int maxSmallProxiesPerCell) : - btGpu3DGridBroadphase(overlappingPairCache, worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, maxSmallProxies, maxLargeProxies, maxPairsPerSmallProxy, maxSmallProxiesPerCell) -{ - _initialize(); -} - - - -btCudaBroadphase::~btCudaBroadphase() -{ - //btSimpleBroadphase will free memory of btSortedOverlappingPairCache, because m_ownsPairCache - assert(m_bInitialized); - _finalize(); -} - - - -void btCudaBroadphase::_initialize() -{ - // allocate GPU data - btCuda_allocateArray((void**)&m_dBodiesHash[0], m_maxHandles * 2 * sizeof(unsigned int)); - btCuda_allocateArray((void**)&m_dBodiesHash[1], m_maxHandles * 2 * sizeof(unsigned int)); - - btCuda_allocateArray((void**)&m_dCellStart, m_params.m_numCells * sizeof(unsigned int)); - - btCuda_allocateArray((void**)&m_dPairBuff, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); - btCuda_copyArrayToDevice(m_dPairBuff, m_hPairBuff, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); // needed? - - btCuda_allocateArray((void**)&m_dPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); - btCuda_copyArrayToDevice(m_dPairBuffStartCurr, m_hPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); - - unsigned int numAABB = m_maxHandles + m_maxLargeHandles; - btCuda_allocateArray((void**)&m_dAABB, numAABB * sizeof(bt3DGrid3F1U) * 2); - - btCuda_allocateArray((void**)&m_dPairScan, (m_maxHandles + 1) * sizeof(unsigned int)); - - btCuda_allocateArray((void**)&m_dPairOut, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); -} - - - -void btCudaBroadphase::_finalize() -{ - assert(m_bInitialized); - btCuda_freeArray(m_dBodiesHash[0]); - btCuda_freeArray(m_dBodiesHash[1]); - btCuda_freeArray(m_dCellStart); - btCuda_freeArray(m_dPairBuffStartCurr); - btCuda_freeArray(m_dAABB); - btCuda_freeArray(m_dPairBuff); - btCuda_freeArray(m_dPairScan); - btCuda_freeArray(m_dPairOut); -} - - - -// -// overrides for CUDA version -// - - - -void btCudaBroadphase::prepareAABB() -{ - btGpu3DGridBroadphase::prepareAABB(); - btCuda_copyArrayToDevice(m_dAABB, m_hAABB, sizeof(bt3DGrid3F1U) * 2 * (m_numHandles + m_numLargeHandles)); - return; -} - - - -void btCudaBroadphase::setParameters(bt3DGridBroadphaseParams* hostParams) -{ - btCuda_setParameters(hostParams); - return; -} - - - -void btCudaBroadphase::calcHashAABB() -{ - BT_PROFILE("btCuda_calcHashAABB"); - btCuda_calcHashAABB(m_dAABB, m_dBodiesHash[0], m_numHandles); -// btCuda_copyArrayFromDevice((void*)m_hBodiesHash, (void*)m_dBodiesHash[0], sizeof(unsigned int) * 2 * m_numHandles); - return; -} - - - -void btCudaBroadphase::sortHash() -{ - BT_PROFILE("RadixSort-- CUDA"); - RadixSort((KeyValuePair*)m_dBodiesHash[0], (KeyValuePair*)m_dBodiesHash[1], m_numHandles, 32); - return; -} - - - -void btCudaBroadphase::findCellStart() -{ - BT_PROFILE("btCuda_findCellStart"); - btCuda_findCellStart(m_dBodiesHash[0], m_dCellStart, m_numHandles, m_params.m_numCells); -// btCuda_copyArrayFromDevice((void*)m_hBodiesHash, (void*)m_dBodiesHash[0], sizeof(unsigned int) * 2 * m_numHandles); -// btCuda_copyArrayFromDevice((void*)m_hCellStart, (void*)m_dCellStart, sizeof(unsigned int) * m_params.m_numCells); - return; -} - - - -void btCudaBroadphase::findOverlappingPairs() -{ - BT_PROFILE("btCuda_findOverlappingPairs"); - btCuda_findOverlappingPairs(m_dAABB, m_dBodiesHash[0], m_dCellStart, m_dPairBuff, m_dPairBuffStartCurr, m_numHandles); - return; -} - - - -void btCudaBroadphase::findPairsLarge() -{ - BT_PROFILE("btCuda_findPairsLarge"); - btCuda_findPairsLarge(m_dAABB, m_dBodiesHash[0], m_dCellStart, m_dPairBuff, m_dPairBuffStartCurr, m_numHandles, m_numLargeHandles); - return; -} - - - -void btCudaBroadphase::computePairCacheChanges() -{ - BT_PROFILE("btCuda_computePairCacheChanges"); - btCuda_computePairCacheChanges(m_dPairBuff, m_dPairBuffStartCurr, m_dPairScan, m_dAABB, m_numHandles); - return; -} - - - -void btCudaBroadphase::scanOverlappingPairBuff() -{ - btCuda_copyArrayFromDevice(m_hPairScan, m_dPairScan, sizeof(unsigned int)*(m_numHandles + 1)); - btGpu3DGridBroadphase::scanOverlappingPairBuff(); - btCuda_copyArrayToDevice(m_dPairScan, m_hPairScan, sizeof(unsigned int)*(m_numHandles + 1)); - return; -} - - - -void btCudaBroadphase::squeezeOverlappingPairBuff() -{ - BT_PROFILE("btCuda_squeezeOverlappingPairBuff"); - btCuda_squeezeOverlappingPairBuff(m_dPairBuff, m_dPairBuffStartCurr, m_dPairScan, m_dPairOut, m_dAABB, m_numHandles); - btCuda_copyArrayFromDevice(m_hPairOut, m_dPairOut, sizeof(unsigned int) * m_hPairScan[m_numHandles]); - return; -} - - - -void btCudaBroadphase::resetPool(btDispatcher* dispatcher) -{ - btGpu3DGridBroadphase::resetPool(dispatcher); - btCuda_copyArrayToDevice(m_dPairBuffStartCurr, m_hPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); -} - - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "LinearMath/btAlignedAllocator.h" +#include "LinearMath/btQuickprof.h" +#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" + +#include "btCudaBroadphase.h" +#include "radixsort.cuh" + + + +#define BT_GPU_PREF(func) btCuda_##func +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h" +#undef BT_GPU_PREF + +extern "C" void btCuda_setParameters(bt3DGridBroadphaseParams* hostParams); + + + +#include + + + + +btCudaBroadphase::btCudaBroadphase( btOverlappingPairCache* overlappingPairCache, + const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerSmallProxy, + int maxSmallProxiesPerCell) : + btGpu3DGridBroadphase(overlappingPairCache, worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, maxSmallProxies, maxLargeProxies, maxPairsPerSmallProxy, maxSmallProxiesPerCell) +{ + _initialize(); +} + + + +btCudaBroadphase::~btCudaBroadphase() +{ + //btSimpleBroadphase will free memory of btSortedOverlappingPairCache, because m_ownsPairCache + assert(m_bInitialized); + _finalize(); +} + + + +void btCudaBroadphase::_initialize() +{ + // allocate GPU data + btCuda_allocateArray((void**)&m_dBodiesHash[0], m_maxHandles * 2 * sizeof(unsigned int)); + btCuda_allocateArray((void**)&m_dBodiesHash[1], m_maxHandles * 2 * sizeof(unsigned int)); + + btCuda_allocateArray((void**)&m_dCellStart, m_params.m_numCells * sizeof(unsigned int)); + + btCuda_allocateArray((void**)&m_dPairBuff, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); + btCuda_copyArrayToDevice(m_dPairBuff, m_hPairBuff, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); // needed? + + btCuda_allocateArray((void**)&m_dPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); + btCuda_copyArrayToDevice(m_dPairBuffStartCurr, m_hPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); + + unsigned int numAABB = m_maxHandles + m_maxLargeHandles; + btCuda_allocateArray((void**)&m_dAABB, numAABB * sizeof(bt3DGrid3F1U) * 2); + + btCuda_allocateArray((void**)&m_dPairScan, (m_maxHandles + 1) * sizeof(unsigned int)); + + btCuda_allocateArray((void**)&m_dPairOut, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); +} + + + +void btCudaBroadphase::_finalize() +{ + assert(m_bInitialized); + btCuda_freeArray(m_dBodiesHash[0]); + btCuda_freeArray(m_dBodiesHash[1]); + btCuda_freeArray(m_dCellStart); + btCuda_freeArray(m_dPairBuffStartCurr); + btCuda_freeArray(m_dAABB); + btCuda_freeArray(m_dPairBuff); + btCuda_freeArray(m_dPairScan); + btCuda_freeArray(m_dPairOut); +} + + + +// +// overrides for CUDA version +// + + + +void btCudaBroadphase::prepareAABB() +{ + btGpu3DGridBroadphase::prepareAABB(); + btCuda_copyArrayToDevice(m_dAABB, m_hAABB, sizeof(bt3DGrid3F1U) * 2 * (m_numHandles + m_numLargeHandles)); + return; +} + + + +void btCudaBroadphase::setParameters(bt3DGridBroadphaseParams* hostParams) +{ + btCuda_setParameters(hostParams); + return; +} + + + +void btCudaBroadphase::calcHashAABB() +{ + BT_PROFILE("btCuda_calcHashAABB"); + btCuda_calcHashAABB(m_dAABB, m_dBodiesHash[0], m_numHandles); +// btCuda_copyArrayFromDevice((void*)m_hBodiesHash, (void*)m_dBodiesHash[0], sizeof(unsigned int) * 2 * m_numHandles); + return; +} + + + +void btCudaBroadphase::sortHash() +{ + BT_PROFILE("RadixSort-- CUDA"); + RadixSort((KeyValuePair*)m_dBodiesHash[0], (KeyValuePair*)m_dBodiesHash[1], m_numHandles, 32); + return; +} + + + +void btCudaBroadphase::findCellStart() +{ + BT_PROFILE("btCuda_findCellStart"); + btCuda_findCellStart(m_dBodiesHash[0], m_dCellStart, m_numHandles, m_params.m_numCells); +// btCuda_copyArrayFromDevice((void*)m_hBodiesHash, (void*)m_dBodiesHash[0], sizeof(unsigned int) * 2 * m_numHandles); +// btCuda_copyArrayFromDevice((void*)m_hCellStart, (void*)m_dCellStart, sizeof(unsigned int) * m_params.m_numCells); + return; +} + + + +void btCudaBroadphase::findOverlappingPairs() +{ + BT_PROFILE("btCuda_findOverlappingPairs"); + btCuda_findOverlappingPairs(m_dAABB, m_dBodiesHash[0], m_dCellStart, m_dPairBuff, m_dPairBuffStartCurr, m_numHandles); + return; +} + + + +void btCudaBroadphase::findPairsLarge() +{ + BT_PROFILE("btCuda_findPairsLarge"); + btCuda_findPairsLarge(m_dAABB, m_dBodiesHash[0], m_dCellStart, m_dPairBuff, m_dPairBuffStartCurr, m_numHandles, m_numLargeHandles); + return; +} + + + +void btCudaBroadphase::computePairCacheChanges() +{ + BT_PROFILE("btCuda_computePairCacheChanges"); + btCuda_computePairCacheChanges(m_dPairBuff, m_dPairBuffStartCurr, m_dPairScan, m_dAABB, m_numHandles); + return; +} + + + +void btCudaBroadphase::scanOverlappingPairBuff() +{ + btCuda_copyArrayFromDevice(m_hPairScan, m_dPairScan, sizeof(unsigned int)*(m_numHandles + 1)); + btGpu3DGridBroadphase::scanOverlappingPairBuff(); + btCuda_copyArrayToDevice(m_dPairScan, m_hPairScan, sizeof(unsigned int)*(m_numHandles + 1)); + return; +} + + + +void btCudaBroadphase::squeezeOverlappingPairBuff() +{ + BT_PROFILE("btCuda_squeezeOverlappingPairBuff"); + btCuda_squeezeOverlappingPairBuff(m_dPairBuff, m_dPairBuffStartCurr, m_dPairScan, m_dPairOut, m_dAABB, m_numHandles); + btCuda_copyArrayFromDevice(m_hPairOut, m_dPairOut, sizeof(unsigned int) * m_hPairScan[m_numHandles]); + return; +} + + + +void btCudaBroadphase::resetPool(btDispatcher* dispatcher) +{ + btGpu3DGridBroadphase::resetPool(dispatcher); + btCuda_copyArrayToDevice(m_dPairBuffStartCurr, m_hPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); +} + + diff --git a/Extras/CUDA/btCudaBroadphase.cu b/Extras/CUDA/btCudaBroadphase.cu index 954395e59..41e4c9426 100644 --- a/Extras/CUDA/btCudaBroadphase.cu +++ b/Extras/CUDA/btCudaBroadphase.cu @@ -1,74 +1,74 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 -#include - -#include "cutil_math.h" -#include "math_constants.h" - - -#include - - - -#include "btCudaDefines.h" - - - -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h" - - - -__device__ inline bt3DGrid3F1U tex_fetch3F1U(float4 a) { return *((bt3DGrid3F1U*)(&a)); } - - - -void btCuda_exit(int val); - - - -texture particleHashTex; -texture cellStartTex; -texture pAABBTex; - - - -__constant__ bt3DGridBroadphaseParams params; - - - -extern "C" -{ - - - -void btCuda_setParameters(bt3DGridBroadphaseParams* hostParams) -{ - // copy parameters to constant memory - BT_GPU_SAFE_CALL(cudaMemcpyToSymbol(params, hostParams, sizeof(bt3DGridBroadphaseParams))); -} - - - -} // extern "C" - - - -#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedCode.h" - - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 +#include + +#include "cutil_math.h" +#include "math_constants.h" + + +#include + + + +#include "btCudaDefines.h" + + + +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h" + + + +__device__ inline bt3DGrid3F1U tex_fetch3F1U(float4 a) { return *((bt3DGrid3F1U*)(&a)); } + + + +void btCuda_exit(int val); + + + +texture particleHashTex; +texture cellStartTex; +texture pAABBTex; + + + +__constant__ bt3DGridBroadphaseParams params; + + + +extern "C" +{ + + + +void btCuda_setParameters(bt3DGridBroadphaseParams* hostParams) +{ + // copy parameters to constant memory + BT_GPU_SAFE_CALL(cudaMemcpyToSymbol(params, hostParams, sizeof(bt3DGridBroadphaseParams))); +} + + + +} // extern "C" + + + +#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedCode.h" + + diff --git a/Extras/CUDA/btCudaBroadphase.h b/Extras/CUDA/btCudaBroadphase.h index 9e3955f9f..8e24e229a 100644 --- a/Extras/CUDA/btCudaBroadphase.h +++ b/Extras/CUDA/btCudaBroadphase.h @@ -1,69 +1,69 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 CUDA_BROADPHASE_H -#define CUDA_BROADPHASE_H - - - -#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" - -#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedTypes.h" -#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphase.h" - - - -///The btCudaBroadphase uses CUDA-capable GPU to compute overlapping pairs - -class btCudaBroadphase : public btGpu3DGridBroadphase -{ -protected: - // GPU data - unsigned int* m_dBodiesHash[2]; - unsigned int* m_dCellStart; - unsigned int* m_dPairBuff; - unsigned int* m_dPairBuffStartCurr; - bt3DGrid3F1U* m_dAABB; - unsigned int* m_dPairScan; - unsigned int* m_dPairOut; -public: - btCudaBroadphase( btOverlappingPairCache* overlappingPairCache, - const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerSmallProxies, - int maxSmallProxiesPerCell = 8); - virtual ~btCudaBroadphase(); -protected: - void _initialize(); - void _finalize(); - void allocateArray(void** devPtr, unsigned int size); - void freeArray(void* devPtr); -// overrides for CUDA version - virtual void setParameters(bt3DGridBroadphaseParams* hostParams); - virtual void prepareAABB(); - virtual void calcHashAABB(); - virtual void sortHash(); - virtual void findCellStart(); - virtual void findOverlappingPairs(); - virtual void findPairsLarge(); - virtual void computePairCacheChanges(); - virtual void scanOverlappingPairBuff(); - virtual void squeezeOverlappingPairBuff(); - virtual void resetPool(btDispatcher* dispatcher); -}; - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 CUDA_BROADPHASE_H +#define CUDA_BROADPHASE_H + + + +#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" + +#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedTypes.h" +#include "../../src/BulletMultiThreaded/btGpu3DGridBroadphase.h" + + + +///The btCudaBroadphase uses CUDA-capable GPU to compute overlapping pairs + +class btCudaBroadphase : public btGpu3DGridBroadphase +{ +protected: + // GPU data + unsigned int* m_dBodiesHash[2]; + unsigned int* m_dCellStart; + unsigned int* m_dPairBuff; + unsigned int* m_dPairBuffStartCurr; + bt3DGrid3F1U* m_dAABB; + unsigned int* m_dPairScan; + unsigned int* m_dPairOut; +public: + btCudaBroadphase( btOverlappingPairCache* overlappingPairCache, + const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerSmallProxies, + int maxSmallProxiesPerCell = 8); + virtual ~btCudaBroadphase(); +protected: + void _initialize(); + void _finalize(); + void allocateArray(void** devPtr, unsigned int size); + void freeArray(void* devPtr); +// overrides for CUDA version + virtual void setParameters(bt3DGridBroadphaseParams* hostParams); + virtual void prepareAABB(); + virtual void calcHashAABB(); + virtual void sortHash(); + virtual void findCellStart(); + virtual void findOverlappingPairs(); + virtual void findPairsLarge(); + virtual void computePairCacheChanges(); + virtual void scanOverlappingPairBuff(); + virtual void squeezeOverlappingPairBuff(); + virtual void resetPool(btDispatcher* dispatcher); +}; + #endif //CUDA_BROADPHASE_H \ No newline at end of file diff --git a/Extras/CUDA/btCudaDefines.h b/Extras/CUDA/btCudaDefines.h index 5af101c50..aae852291 100644 --- a/Extras/CUDA/btCudaDefines.h +++ b/Extras/CUDA/btCudaDefines.h @@ -1,138 +1,138 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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. -*/ - - - -// Common preprocessor definitions for CUDA compiler - - - -#ifndef BTCUDADEFINES_H -#define BTCUDADEFINES_H - - - -#ifdef __DEVICE_EMULATION__ - #define B_CUDA_USE_TEX 0 -#else - #define B_CUDA_USE_TEX 1 -#endif - - -#if B_CUDA_USE_TEX - #define BT_GPU_FETCH(t, i) tex_fetch3F1U(tex1Dfetch(t##Tex, i)) - #define BT_GPU_FETCH4(t, i) tex1Dfetch(t##Tex, i) -#else - #define BT_GPU_FETCH(t, i) t[i] - #define BT_GPU_FETCH4(t, i) t[i] -#endif - - - -#define BT_GPU___device__ __device__ -#define BT_GPU___devdata__ __device__ -#define BT_GPU___constant__ __constant__ -#define BT_GPU_max(a, b) max(a, b) -#define BT_GPU_min(a, b) min(a, b) -#define BT_GPU_params params -#define BT_GPU___mul24(a, b) __mul24(a, b) -#define BT_GPU___global__ __global__ -#define BT_GPU___shared__ __shared__ -#define BT_GPU___syncthreads() __syncthreads() -#define BT_GPU_make_uint2(x, y) make_uint2(x, y) -#define BT_GPU_make_int3(x, y, z) make_int3(x, y, z) -#define BT_GPU_make_float3(x, y, z) make_float3(x, y, z) -#define BT_GPU_make_float34(x) make_float3(x) -#define BT_GPU_make_float31(x) make_float3(x) -#define BT_GPU_make_float42(a, b) make_float4(a, b) -#define BT_GPU_make_float44(a, b, c, d) make_float4(a, b, c, d) -#define BT_GPU_PREF(func) btCuda_##func -#define BT_GPU_Memset cudaMemset -#define BT_GPU_MemcpyToSymbol(a, b, c) cudaMemcpyToSymbol(a, b, c) -#define BT_GPU_blockIdx blockIdx -#define BT_GPU_blockDim blockDim -#define BT_GPU_threadIdx threadIdx -#define BT_GPU_dot(a, b) dot(a, b) -#define BT_GPU_dot4(a, b) dot(a, b) -#define BT_GPU_cross(a, b) cross(a, b) -#define BT_GPU_BindTexture(a, b, c, d) cudaBindTexture(a, b, c, d) -#define BT_GPU_UnbindTexture(a) cudaUnbindTexture(a) -#define BT_GPU_EXECKERNEL(numb, numt, kfunc, args) kfunc<<>>args - - - -//! Check for CUDA error -#define BT_GPU_CHECK_ERROR(errorMessage) \ - do \ - { \ - cudaError_t err = cudaGetLastError(); \ - if(err != cudaSuccess) \ - { \ - fprintf(stderr,"Cuda error: %s in file '%s' in line %i : %s.\n",\ - errorMessage, __FILE__, __LINE__, cudaGetErrorString( err));\ - btCuda_exit(EXIT_FAILURE); \ - } \ - err = cudaThreadSynchronize(); \ - if(err != cudaSuccess) \ - { \ - fprintf(stderr,"Cuda error: %s in file '%s' in line %i : %s.\n",\ - errorMessage, __FILE__, __LINE__, cudaGetErrorString( err));\ - btCuda_exit(EXIT_FAILURE); \ - } \ - } \ - while(0) - - - -#define BT_GPU_SAFE_CALL_NO_SYNC(call) \ - do \ - { \ - cudaError err = call; \ - if(err != cudaSuccess) \ - { \ - fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", \ - __FILE__, __LINE__, cudaGetErrorString( err) ); \ - btCuda_exit(EXIT_FAILURE); \ - } \ - } \ - while(0) - - - -#define BT_GPU_SAFE_CALL(call) \ - do \ - { \ - BT_GPU_SAFE_CALL_NO_SYNC(call); \ - cudaError err = cudaThreadSynchronize(); \ - if(err != cudaSuccess) \ - { \ - fprintf(stderr,"Cuda errorSync in file '%s' in line %i : %s.\n",\ - __FILE__, __LINE__, cudaGetErrorString( err) ); \ - btCuda_exit(EXIT_FAILURE); \ - } \ - } while (0) - - - -extern "C" void btCuda_exit(int val); - - - -#endif // BTCUDADEFINES_H - - - - - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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. +*/ + + + +// Common preprocessor definitions for CUDA compiler + + + +#ifndef BTCUDADEFINES_H +#define BTCUDADEFINES_H + + + +#ifdef __DEVICE_EMULATION__ + #define B_CUDA_USE_TEX 0 +#else + #define B_CUDA_USE_TEX 1 +#endif + + +#if B_CUDA_USE_TEX + #define BT_GPU_FETCH(t, i) tex_fetch3F1U(tex1Dfetch(t##Tex, i)) + #define BT_GPU_FETCH4(t, i) tex1Dfetch(t##Tex, i) +#else + #define BT_GPU_FETCH(t, i) t[i] + #define BT_GPU_FETCH4(t, i) t[i] +#endif + + + +#define BT_GPU___device__ __device__ +#define BT_GPU___devdata__ __device__ +#define BT_GPU___constant__ __constant__ +#define BT_GPU_max(a, b) max(a, b) +#define BT_GPU_min(a, b) min(a, b) +#define BT_GPU_params params +#define BT_GPU___mul24(a, b) __mul24(a, b) +#define BT_GPU___global__ __global__ +#define BT_GPU___shared__ __shared__ +#define BT_GPU___syncthreads() __syncthreads() +#define BT_GPU_make_uint2(x, y) make_uint2(x, y) +#define BT_GPU_make_int3(x, y, z) make_int3(x, y, z) +#define BT_GPU_make_float3(x, y, z) make_float3(x, y, z) +#define BT_GPU_make_float34(x) make_float3(x) +#define BT_GPU_make_float31(x) make_float3(x) +#define BT_GPU_make_float42(a, b) make_float4(a, b) +#define BT_GPU_make_float44(a, b, c, d) make_float4(a, b, c, d) +#define BT_GPU_PREF(func) btCuda_##func +#define BT_GPU_Memset cudaMemset +#define BT_GPU_MemcpyToSymbol(a, b, c) cudaMemcpyToSymbol(a, b, c) +#define BT_GPU_blockIdx blockIdx +#define BT_GPU_blockDim blockDim +#define BT_GPU_threadIdx threadIdx +#define BT_GPU_dot(a, b) dot(a, b) +#define BT_GPU_dot4(a, b) dot(a, b) +#define BT_GPU_cross(a, b) cross(a, b) +#define BT_GPU_BindTexture(a, b, c, d) cudaBindTexture(a, b, c, d) +#define BT_GPU_UnbindTexture(a) cudaUnbindTexture(a) +#define BT_GPU_EXECKERNEL(numb, numt, kfunc, args) kfunc<<>>args + + + +//! Check for CUDA error +#define BT_GPU_CHECK_ERROR(errorMessage) \ + do \ + { \ + cudaError_t err = cudaGetLastError(); \ + if(err != cudaSuccess) \ + { \ + fprintf(stderr,"Cuda error: %s in file '%s' in line %i : %s.\n",\ + errorMessage, __FILE__, __LINE__, cudaGetErrorString( err));\ + btCuda_exit(EXIT_FAILURE); \ + } \ + err = cudaThreadSynchronize(); \ + if(err != cudaSuccess) \ + { \ + fprintf(stderr,"Cuda error: %s in file '%s' in line %i : %s.\n",\ + errorMessage, __FILE__, __LINE__, cudaGetErrorString( err));\ + btCuda_exit(EXIT_FAILURE); \ + } \ + } \ + while(0) + + + +#define BT_GPU_SAFE_CALL_NO_SYNC(call) \ + do \ + { \ + cudaError err = call; \ + if(err != cudaSuccess) \ + { \ + fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", \ + __FILE__, __LINE__, cudaGetErrorString( err) ); \ + btCuda_exit(EXIT_FAILURE); \ + } \ + } \ + while(0) + + + +#define BT_GPU_SAFE_CALL(call) \ + do \ + { \ + BT_GPU_SAFE_CALL_NO_SYNC(call); \ + cudaError err = cudaThreadSynchronize(); \ + if(err != cudaSuccess) \ + { \ + fprintf(stderr,"Cuda errorSync in file '%s' in line %i : %s.\n",\ + __FILE__, __LINE__, cudaGetErrorString( err) ); \ + btCuda_exit(EXIT_FAILURE); \ + } \ + } while (0) + + + +extern "C" void btCuda_exit(int val); + + + +#endif // BTCUDADEFINES_H + + + + + diff --git a/Extras/CUDA/btCudaUtils.cu b/Extras/CUDA/btCudaUtils.cu index 4f6282115..cdea10b64 100644 --- a/Extras/CUDA/btCudaUtils.cu +++ b/Extras/CUDA/btCudaUtils.cu @@ -1,84 +1,84 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 -#include - -#include -#include - -#include "cutil_math.h" -#include "math_constants.h" - -#include - - - - -#include "btCudaDefines.h" -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" - - -void btCuda_exit(int val) -{ - fprintf(stderr, "Press ENTER key to terminate the program\n"); - getchar(); - exit(val); -} - -void btCuda_allocateArray(void** devPtr, unsigned int size) -{ - BT_GPU_SAFE_CALL(cudaMalloc(devPtr, size)); -} - -void btCuda_freeArray(void* devPtr) -{ - BT_GPU_SAFE_CALL(cudaFree(devPtr)); -} - -void btCuda_copyArrayFromDevice(void* host, const void* device, unsigned int size) -{ - BT_GPU_SAFE_CALL(cudaMemcpy(host, device, size, cudaMemcpyDeviceToHost)); -} - -void btCuda_copyArrayToDevice(void* device, const void* host, unsigned int size) -{ - BT_GPU_SAFE_CALL(cudaMemcpy((char*)device, host, size, cudaMemcpyHostToDevice)); -} - - -void btCuda_registerGLBufferObject(unsigned int vbo) -{ - BT_GPU_SAFE_CALL(cudaGLRegisterBufferObject(vbo)); -} - -void* btCuda_mapGLBufferObject(unsigned int vbo) -{ - void *ptr; - BT_GPU_SAFE_CALL(cudaGLMapBufferObject(&ptr, vbo)); - return ptr; -} - -void btCuda_unmapGLBufferObject(unsigned int vbo) -{ - BT_GPU_SAFE_CALL(cudaGLUnmapBufferObject(vbo)); -} - - - -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedCode.h" - - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 +#include + +#include +#include + +#include "cutil_math.h" +#include "math_constants.h" + +#include + + + + +#include "btCudaDefines.h" +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" + + +void btCuda_exit(int val) +{ + fprintf(stderr, "Press ENTER key to terminate the program\n"); + getchar(); + exit(val); +} + +void btCuda_allocateArray(void** devPtr, unsigned int size) +{ + BT_GPU_SAFE_CALL(cudaMalloc(devPtr, size)); +} + +void btCuda_freeArray(void* devPtr) +{ + BT_GPU_SAFE_CALL(cudaFree(devPtr)); +} + +void btCuda_copyArrayFromDevice(void* host, const void* device, unsigned int size) +{ + BT_GPU_SAFE_CALL(cudaMemcpy(host, device, size, cudaMemcpyDeviceToHost)); +} + +void btCuda_copyArrayToDevice(void* device, const void* host, unsigned int size) +{ + BT_GPU_SAFE_CALL(cudaMemcpy((char*)device, host, size, cudaMemcpyHostToDevice)); +} + + +void btCuda_registerGLBufferObject(unsigned int vbo) +{ + BT_GPU_SAFE_CALL(cudaGLRegisterBufferObject(vbo)); +} + +void* btCuda_mapGLBufferObject(unsigned int vbo) +{ + void *ptr; + BT_GPU_SAFE_CALL(cudaGLMapBufferObject(&ptr, vbo)); + return ptr; +} + +void btCuda_unmapGLBufferObject(unsigned int vbo) +{ + BT_GPU_SAFE_CALL(cudaGLUnmapBufferObject(vbo)); +} + + + +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedCode.h" + + diff --git a/Extras/CUDA/btGpuDemo2dCudaFunc.cu b/Extras/CUDA/btGpuDemo2dCudaFunc.cu index 620602ec5..aae708a13 100644 --- a/Extras/CUDA/btGpuDemo2dCudaFunc.cu +++ b/Extras/CUDA/btGpuDemo2dCudaFunc.cu @@ -1,42 +1,42 @@ -/* -Impulse based Rigid body simulation using CUDA -Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html - -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 -#include - -#include "cutil_math.h" -#include "math_constants.h" - -#include - - - -#include "btCudaDefines.h" - - - -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "../../Demos/Gpu2dDemo/btGpuDemo2dSharedTypes.h" -#include "../../Demos/Gpu2dDemo/btGpuDemo2dSharedDefs.h" - - - -texture posTex; - - - -#include "../../Demos/Gpu2dDemo/btGpuDemo2dSharedCode.h" - +/* +Impulse based Rigid body simulation using CUDA +Copyright (c) 2007 Takahiro Harada http://www.iii.u-tokyo.ac.jp/~takahiroharada/projects/impulseCUDA.html + +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 +#include + +#include "cutil_math.h" +#include "math_constants.h" + +#include + + + +#include "btCudaDefines.h" + + + +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "../../Demos/Gpu2dDemo/btGpuDemo2dSharedTypes.h" +#include "../../Demos/Gpu2dDemo/btGpuDemo2dSharedDefs.h" + + + +texture posTex; + + + +#include "../../Demos/Gpu2dDemo/btGpuDemo2dSharedCode.h" + diff --git a/Extras/CUDA/btGpuDemo3dCudaFunc.cu b/Extras/CUDA/btGpuDemo3dCudaFunc.cu index 7aec906a0..2ce7006eb 100644 --- a/Extras/CUDA/btGpuDemo3dCudaFunc.cu +++ b/Extras/CUDA/btGpuDemo3dCudaFunc.cu @@ -1,46 +1,46 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 -#include - -#include "../../Extras/CUDA/cutil_math.h" -#include "math_constants.h" - -#include - -//---------------------------------------------------------------------------------------- - -#include "../../Extras/CUDA/btCudaDefines.h" - -//---------------------------------------------------------------------------------------- - -#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "../../Demos/Gpu3dDemo/btGpuDemo3dSharedTypes.h" -#include "../../Demos/Gpu3dDemo/btGpuDemo3dSharedDefs.h" - -//---------------------------------------------------------------------------------------- - -texture posTex; - -//---------------------------------------------------------------------------------------- - -#include "../../Demos/Gpu3dDemo/btGpuDemo3dSharedCode.h" - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 +#include + +#include "../../Extras/CUDA/cutil_math.h" +#include "math_constants.h" + +#include + +//---------------------------------------------------------------------------------------- + +#include "../../Extras/CUDA/btCudaDefines.h" + +//---------------------------------------------------------------------------------------- + +#include "../../src/BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "../../Demos/Gpu3dDemo/btGpuDemo3dSharedTypes.h" +#include "../../Demos/Gpu3dDemo/btGpuDemo3dSharedDefs.h" + +//---------------------------------------------------------------------------------------- + +texture posTex; + +//---------------------------------------------------------------------------------------- + +#include "../../Demos/Gpu3dDemo/btGpuDemo3dSharedCode.h" + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + diff --git a/Extras/CUDA/cutil_gl_error.h b/Extras/CUDA/cutil_gl_error.h index 8f879ebc7..3d1a5adf2 100644 --- a/Extras/CUDA/cutil_gl_error.h +++ b/Extras/CUDA/cutil_gl_error.h @@ -1,86 +1,86 @@ -/* -* Copyright 1993-2006 NVIDIA Corporation. All rights reserved. -* -* NOTICE TO USER: -* -* This source code is subject to NVIDIA ownership rights under U.S. and -* international Copyright laws. -* -* NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE -* CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR -* IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH -* REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF -* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. -* IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, -* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE -* OR PERFORMANCE OF THIS SOURCE CODE. -* -* U.S. Government End Users. This source code is a "commercial item" as -* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of -* "commercial computer software" and "commercial computer software -* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) -* and is provided to the U.S. Government only as a commercial end item. -* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through -* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the -* source code with only those rights set forth herein. -*/ - -#ifndef CUTIL_GL_ERROR -#define CUTIL_GL_ERROR - -/* CUda UTility Library */ - -// includes, system -#ifdef _WIN32 -# define WINDOWS_LEAN_AND_MEAN -# include -# include -# undef min -# undef max -#endif - -// includes, graphics -#if defined (__APPLE__) || defined(MACOSX) -#include -#include -#else -#include -#include -#endif - -//////////////////////////////////////////////////////////////////////////// -//! Check for OpenGL error -//! @return CUTTrue if no GL error has been encountered, otherwise 0 -//! @param file __FILE__ macro -//! @param line __LINE__ macro -//! @note The GL error is listed on stderr -//! @note This function should be used via the CHECK_ERROR_GL() macro -//////////////////////////////////////////////////////////////////////////// -CUTBoolean CUTIL_API -cutCheckErrorGL( const char* file, const int line) -{ - CUTBoolean ret_val = CUTTrue; - - // check for error - GLenum gl_error = glGetError(); - if (gl_error != GL_NO_ERROR) - { - fprintf(stderr, "GL Error in file '%s' in line %d :\n", file, line); - fprintf(stderr, "%s\n", gluErrorString(gl_error)); - ret_val = CUTFalse; - } - return ret_val; -} - -#ifdef _DEBUG - -#define CUT_CHECK_ERROR_GL() \ - if( CUTFalse == cutCheckErrorGL( __FILE__, __LINE__)) { \ - exit(EXIT_FAILURE); \ - } - -#endif // _DEBUG - -#endif // CUTIL_GL_ERROR +/* +* Copyright 1993-2006 NVIDIA Corporation. All rights reserved. +* +* NOTICE TO USER: +* +* This source code is subject to NVIDIA ownership rights under U.S. and +* international Copyright laws. +* +* NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE +* CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR +* IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH +* REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. +* IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, +* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +* OR PERFORMANCE OF THIS SOURCE CODE. +* +* U.S. Government End Users. This source code is a "commercial item" as +* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of +* "commercial computer software" and "commercial computer software +* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) +* and is provided to the U.S. Government only as a commercial end item. +* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through +* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the +* source code with only those rights set forth herein. +*/ + +#ifndef CUTIL_GL_ERROR +#define CUTIL_GL_ERROR + +/* CUda UTility Library */ + +// includes, system +#ifdef _WIN32 +# define WINDOWS_LEAN_AND_MEAN +# include +# include +# undef min +# undef max +#endif + +// includes, graphics +#if defined (__APPLE__) || defined(MACOSX) +#include +#include +#else +#include +#include +#endif + +//////////////////////////////////////////////////////////////////////////// +//! Check for OpenGL error +//! @return CUTTrue if no GL error has been encountered, otherwise 0 +//! @param file __FILE__ macro +//! @param line __LINE__ macro +//! @note The GL error is listed on stderr +//! @note This function should be used via the CHECK_ERROR_GL() macro +//////////////////////////////////////////////////////////////////////////// +CUTBoolean CUTIL_API +cutCheckErrorGL( const char* file, const int line) +{ + CUTBoolean ret_val = CUTTrue; + + // check for error + GLenum gl_error = glGetError(); + if (gl_error != GL_NO_ERROR) + { + fprintf(stderr, "GL Error in file '%s' in line %d :\n", file, line); + fprintf(stderr, "%s\n", gluErrorString(gl_error)); + ret_val = CUTFalse; + } + return ret_val; +} + +#ifdef _DEBUG + +#define CUT_CHECK_ERROR_GL() \ + if( CUTFalse == cutCheckErrorGL( __FILE__, __LINE__)) { \ + exit(EXIT_FAILURE); \ + } + +#endif // _DEBUG + +#endif // CUTIL_GL_ERROR diff --git a/Extras/CUDA/cutil_math.h b/Extras/CUDA/cutil_math.h index de5158d17..55d655d89 100644 --- a/Extras/CUDA/cutil_math.h +++ b/Extras/CUDA/cutil_math.h @@ -1,767 +1,767 @@ - /* - * Copyright 1993-2007 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. Users and possessors of this source code - * are hereby granted a nonexclusive, royalty-free license to use this code - * in individual and commercial software. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - * - * Any use of this source code in individual and commercial software must - * include, in the user documentation and internal comments to the code, - * the above Disclaimer and U.S. Government End Users Notice. - */ - -/* - This file implements common mathematical operations on vector types - (float3, float4 etc.) since these are not provided as standard by CUDA. - - The syntax is modelled on the Cg standard library. -*/ - -#ifndef CUTIL_MATH_H -#define CUTIL_MATH_H - -#include "cuda_runtime.h" - -//////////////////////////////////////////////////////////////////////////////// -typedef unsigned int uint; -typedef unsigned short ushort; - -#ifndef __CUDACC__ -#include - -inline float fminf(float a, float b) -{ - return a < b ? a : b; -} - -inline float fmaxf(float a, float b) -{ - return a < b ? a : b; -} - -inline int max(int a, int b) -{ - return a > b ? a : b; -} - -inline int min(int a, int b) -{ - return a < b ? a : b; -} -#endif - -// float functions -//////////////////////////////////////////////////////////////////////////////// - -// lerp -inline __device__ __host__ float lerp(float a, float b, float t) -{ - return a + t*(b-a); -} - -// clamp -inline __device__ __host__ float clamp(float f, float a, float b) -{ - return fmaxf(a, fminf(f, b)); -} - -// int2 functions -//////////////////////////////////////////////////////////////////////////////// - -// negate -inline __host__ __device__ int2 operator-(int2 &a) -{ - return make_int2(-a.x, -a.y); -} - -// addition -inline __host__ __device__ int2 operator+(int2 a, int2 b) -{ - return make_int2(a.x + b.x, a.y + b.y); -} -inline __host__ __device__ void operator+=(int2 &a, int2 b) -{ - a.x += b.x; a.y += b.y; -} - -// subtract -inline __host__ __device__ int2 operator-(int2 a, int2 b) -{ - return make_int2(a.x - b.x, a.y - b.y); -} -inline __host__ __device__ void operator-=(int2 &a, int2 b) -{ - a.x -= b.x; a.y -= b.y; -} - -// multiply -inline __host__ __device__ int2 operator*(int2 a, int2 b) -{ - return make_int2(a.x * b.x, a.y * b.y); -} -inline __host__ __device__ int2 operator*(int2 a, int s) -{ - return make_int2(a.x * s, a.y * s); -} -inline __host__ __device__ int2 operator*(int s, int2 a) -{ - return make_int2(a.x * s, a.y * s); -} -inline __host__ __device__ void operator*=(int2 &a, int s) -{ - a.x *= s; a.y *= s; -} - -// float2 functions -//////////////////////////////////////////////////////////////////////////////// - -// additional constructors -inline __host__ __device__ float2 make_float2(float s) -{ - return make_float2(s, s); -} -inline __host__ __device__ float2 make_float2(int2 a) -{ - return make_float2(float(a.x), float(a.y)); -} - -// negate -inline __host__ __device__ float2 operator-(float2 &a) -{ - return make_float2(-a.x, -a.y); -} - -// addition -inline __host__ __device__ float2 operator+(float2 a, float2 b) -{ - return make_float2(a.x + b.x, a.y + b.y); -} -inline __host__ __device__ void operator+=(float2 &a, float2 b) -{ - a.x += b.x; a.y += b.y; -} - -// subtract -inline __host__ __device__ float2 operator-(float2 a, float2 b) -{ - return make_float2(a.x - b.x, a.y - b.y); -} -inline __host__ __device__ void operator-=(float2 &a, float2 b) -{ - a.x -= b.x; a.y -= b.y; -} - -// multiply -inline __host__ __device__ float2 operator*(float2 a, float2 b) -{ - return make_float2(a.x * b.x, a.y * b.y); -} -inline __host__ __device__ float2 operator*(float2 a, float s) -{ - return make_float2(a.x * s, a.y * s); -} -inline __host__ __device__ float2 operator*(float s, float2 a) -{ - return make_float2(a.x * s, a.y * s); -} -inline __host__ __device__ void operator*=(float2 &a, float s) -{ - a.x *= s; a.y *= s; -} - -// divide -inline __host__ __device__ float2 operator/(float2 a, float2 b) -{ - return make_float2(a.x / b.x, a.y / b.y); -} -inline __host__ __device__ float2 operator/(float2 a, float s) -{ - float inv = 1.0f / s; - return a * inv; -} -inline __host__ __device__ float2 operator/(float s, float2 a) -{ - float inv = 1.0f / s; - return a * inv; -} -inline __host__ __device__ void operator/=(float2 &a, float s) -{ - float inv = 1.0f / s; - a *= inv; -} - -// lerp -inline __device__ __host__ float2 lerp(float2 a, float2 b, float t) -{ - return a + t*(b-a); -} - -// clamp -inline __device__ __host__ float2 clamp(float2 v, float a, float b) -{ - return make_float2(clamp(v.x, a, b), clamp(v.y, a, b)); -} - -inline __device__ __host__ float2 clamp(float2 v, float2 a, float2 b) -{ - return make_float2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y)); -} - -// dot product -inline __host__ __device__ float dot(float2 a, float2 b) -{ - return a.x * b.x + a.y * b.y; -} - -// length -inline __host__ __device__ float length(float2 v) -{ - return sqrtf(dot(v, v)); -} - -// normalize -inline __host__ __device__ float2 normalize(float2 v) -{ - float invLen = 1.0f / sqrtf(dot(v, v)); - return v * invLen; -} - -// floor -inline __host__ __device__ float2 floor(const float2 v) -{ - return make_float2(floor(v.x), floor(v.y)); -} - -// reflect -inline __host__ __device__ float2 reflect(float2 i, float2 n) -{ - return i - 2.0f * n * dot(n,i); -} - -// float3 functions -//////////////////////////////////////////////////////////////////////////////// - -// additional constructors -inline __host__ __device__ float3 make_float3(float s) -{ - return make_float3(s, s, s); -} -inline __host__ __device__ float3 make_float3(float2 a) -{ - return make_float3(a.x, a.y, 0.0f); -} -inline __host__ __device__ float3 make_float3(float2 a, float s) -{ - return make_float3(a.x, a.y, s); -} -inline __host__ __device__ float3 make_float3(float4 a) -{ - return make_float3(a.x, a.y, a.z); // discards w -} -inline __host__ __device__ float3 make_float3(int3 a) -{ - return make_float3(float(a.x), float(a.y), float(a.z)); -} - -// negate -inline __host__ __device__ float3 operator-(float3 &a) -{ - return make_float3(-a.x, -a.y, -a.z); -} - -// min -static __inline__ __host__ __device__ float3 fminf(float3 a, float3 b) -{ - return make_float3(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z)); -} - -// max -static __inline__ __host__ __device__ float3 fmaxf(float3 a, float3 b) -{ - return make_float3(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z)); -} - -// addition -inline __host__ __device__ float3 operator+(float3 a, float3 b) -{ - return make_float3(a.x + b.x, a.y + b.y, a.z + b.z); -} -inline __host__ __device__ float3 operator+(float3 a, float b) -{ - return make_float3(a.x + b, a.y + b, a.z + b); -} -inline __host__ __device__ void operator+=(float3 &a, float3 b) -{ - a.x += b.x; a.y += b.y; a.z += b.z; -} - -// subtract -inline __host__ __device__ float3 operator-(float3 a, float3 b) -{ - return make_float3(a.x - b.x, a.y - b.y, a.z - b.z); -} -inline __host__ __device__ float3 operator-(float3 a, float b) -{ - return make_float3(a.x - b, a.y - b, a.z - b); -} -inline __host__ __device__ void operator-=(float3 &a, float3 b) -{ - a.x -= b.x; a.y -= b.y; a.z -= b.z; -} - -// multiply -inline __host__ __device__ float3 operator*(float3 a, float3 b) -{ - return make_float3(a.x * b.x, a.y * b.y, a.z * b.z); -} -inline __host__ __device__ float3 operator*(float3 a, float s) -{ - return make_float3(a.x * s, a.y * s, a.z * s); -} -inline __host__ __device__ float3 operator*(float s, float3 a) -{ - return make_float3(a.x * s, a.y * s, a.z * s); -} -inline __host__ __device__ void operator*=(float3 &a, float s) -{ - a.x *= s; a.y *= s; a.z *= s; -} - -// divide -inline __host__ __device__ float3 operator/(float3 a, float3 b) -{ - return make_float3(a.x / b.x, a.y / b.y, a.z / b.z); -} -inline __host__ __device__ float3 operator/(float3 a, float s) -{ - float inv = 1.0f / s; - return a * inv; -} -inline __host__ __device__ float3 operator/(float s, float3 a) -{ - float inv = 1.0f / s; - return a * inv; -} -inline __host__ __device__ void operator/=(float3 &a, float s) -{ - float inv = 1.0f / s; - a *= inv; -} - -// lerp -inline __device__ __host__ float3 lerp(float3 a, float3 b, float t) -{ - return a + t*(b-a); -} - -// clamp -inline __device__ __host__ float3 clamp(float3 v, float a, float b) -{ - return make_float3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); -} - -inline __device__ __host__ float3 clamp(float3 v, float3 a, float3 b) -{ - return make_float3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); -} - -// dot product -inline __host__ __device__ float dot(float3 a, float3 b) -{ - return a.x * b.x + a.y * b.y + a.z * b.z; -} - -// cross product -inline __host__ __device__ float3 cross(float3 a, float3 b) -{ - return make_float3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); -} - -// length -inline __host__ __device__ float length(float3 v) -{ - return sqrtf(dot(v, v)); -} - -// normalize -inline __host__ __device__ float3 normalize(float3 v) -{ - float invLen = 1.0f / sqrtf(dot(v, v)); - return v * invLen; -} - -// floor -inline __host__ __device__ float3 floor(const float3 v) -{ - return make_float3(floor(v.x), floor(v.y), floor(v.z)); -} - -// reflect -inline __host__ __device__ float3 reflect(float3 i, float3 n) -{ - return i - 2.0f * n * dot(n,i); -} - -// float4 functions -//////////////////////////////////////////////////////////////////////////////// - -// additional constructors -inline __host__ __device__ float4 make_float4(float s) -{ - return make_float4(s, s, s, s); -} -inline __host__ __device__ float4 make_float4(float3 a) -{ - return make_float4(a.x, a.y, a.z, 0.0f); -} -inline __host__ __device__ float4 make_float4(float3 a, float w) -{ - return make_float4(a.x, a.y, a.z, w); -} -inline __host__ __device__ float4 make_float4(int4 a) -{ - return make_float4(float(a.x), float(a.y), float(a.z), float(a.w)); -} - -// negate -inline __host__ __device__ float4 operator-(float4 &a) -{ - return make_float4(-a.x, -a.y, -a.z, -a.w); -} - -// min -static __inline__ __host__ __device__ float4 fminf(float4 a, float4 b) -{ - return make_float4(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z), fminf(a.w,b.w)); -} - -// max -static __inline__ __host__ __device__ float4 fmaxf(float4 a, float4 b) -{ - return make_float4(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z), fmaxf(a.w,b.w)); -} - -// addition -inline __host__ __device__ float4 operator+(float4 a, float4 b) -{ - return make_float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); -} -inline __host__ __device__ void operator+=(float4 &a, float4 b) -{ - a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w; -} - -// subtract -inline __host__ __device__ float4 operator-(float4 a, float4 b) -{ - return make_float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); -} -inline __host__ __device__ void operator-=(float4 &a, float4 b) -{ - a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w; -} - -// multiply -inline __host__ __device__ float4 operator*(float4 a, float s) -{ - return make_float4(a.x * s, a.y * s, a.z * s, a.w * s); -} -inline __host__ __device__ float4 operator*(float s, float4 a) -{ - return make_float4(a.x * s, a.y * s, a.z * s, a.w * s); -} -inline __host__ __device__ void operator*=(float4 &a, float s) -{ - a.x *= s; a.y *= s; a.z *= s; a.w *= s; -} - -// divide -inline __host__ __device__ float4 operator/(float4 a, float4 b) -{ - return make_float4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); -} -inline __host__ __device__ float4 operator/(float4 a, float s) -{ - float inv = 1.0f / s; - return a * inv; -} -inline __host__ __device__ float4 operator/(float s, float4 a) -{ - float inv = 1.0f / s; - return a * inv; -} -inline __host__ __device__ void operator/=(float4 &a, float s) -{ - float inv = 1.0f / s; - a *= inv; -} - -// lerp -inline __device__ __host__ float4 lerp(float4 a, float4 b, float t) -{ - return a + t*(b-a); -} - -// clamp -inline __device__ __host__ float4 clamp(float4 v, float a, float b) -{ - return make_float4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b)); -} - -inline __device__ __host__ float4 clamp(float4 v, float4 a, float4 b) -{ - return make_float4(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z), clamp(v.w, a.w, b.w)); -} - -// dot product -inline __host__ __device__ float dot(float4 a, float4 b) -{ - return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; -} - -// length -inline __host__ __device__ float length(float4 r) -{ - return sqrtf(dot(r, r)); -} - -// normalize -inline __host__ __device__ float4 normalize(float4 v) -{ - float invLen = 1.0f / sqrtf(dot(v, v)); - return v * invLen; -} - -// floor -inline __host__ __device__ float4 floor(const float4 v) -{ - return make_float4(floor(v.x), floor(v.y), floor(v.z), floor(v.w)); -} - -// int3 functions -//////////////////////////////////////////////////////////////////////////////// - -// additional constructors -inline __host__ __device__ int3 make_int3(int s) -{ - return make_int3(s, s, s); -} -inline __host__ __device__ int3 make_int3(float3 a) -{ - return make_int3(int(a.x), int(a.y), int(a.z)); -} - -// negate -inline __host__ __device__ int3 operator-(int3 &a) -{ - return make_int3(-a.x, -a.y, -a.z); -} - -// min -inline __host__ __device__ int3 min(int3 a, int3 b) -{ - return make_int3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z)); -} - -// max -inline __host__ __device__ int3 max(int3 a, int3 b) -{ - return make_int3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z)); -} - -// addition -inline __host__ __device__ int3 operator+(int3 a, int3 b) -{ - return make_int3(a.x + b.x, a.y + b.y, a.z + b.z); -} -inline __host__ __device__ void operator+=(int3 &a, int3 b) -{ - a.x += b.x; a.y += b.y; a.z += b.z; -} - -// subtract -inline __host__ __device__ int3 operator-(int3 a, int3 b) -{ - return make_int3(a.x - b.x, a.y - b.y, a.z - b.z); -} - -inline __host__ __device__ void operator-=(int3 &a, int3 b) -{ - a.x -= b.x; a.y -= b.y; a.z -= b.z; -} - -// multiply -inline __host__ __device__ int3 operator*(int3 a, int3 b) -{ - return make_int3(a.x * b.x, a.y * b.y, a.z * b.z); -} -inline __host__ __device__ int3 operator*(int3 a, int s) -{ - return make_int3(a.x * s, a.y * s, a.z * s); -} -inline __host__ __device__ int3 operator*(int s, int3 a) -{ - return make_int3(a.x * s, a.y * s, a.z * s); -} -inline __host__ __device__ void operator*=(int3 &a, int s) -{ - a.x *= s; a.y *= s; a.z *= s; -} - -// divide -inline __host__ __device__ int3 operator/(int3 a, int3 b) -{ - return make_int3(a.x / b.x, a.y / b.y, a.z / b.z); -} -inline __host__ __device__ int3 operator/(int3 a, int s) -{ - return make_int3(a.x / s, a.y / s, a.z / s); -} -inline __host__ __device__ int3 operator/(int s, int3 a) -{ - return make_int3(a.x / s, a.y / s, a.z / s); -} -inline __host__ __device__ void operator/=(int3 &a, int s) -{ - a.x /= s; a.y /= s; a.z /= s; -} - -// clamp -inline __device__ __host__ int clamp(int f, int a, int b) -{ - return max(a, min(f, b)); -} - -inline __device__ __host__ int3 clamp(int3 v, int a, int b) -{ - return make_int3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); -} - -inline __device__ __host__ int3 clamp(int3 v, int3 a, int3 b) -{ - return make_int3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); -} - - -// uint3 functions -//////////////////////////////////////////////////////////////////////////////// - -// additional constructors -inline __host__ __device__ uint3 make_uint3(uint s) -{ - return make_uint3(s, s, s); -} -inline __host__ __device__ uint3 make_uint3(float3 a) -{ - return make_uint3(uint(a.x), uint(a.y), uint(a.z)); -} - -// min -inline __host__ __device__ uint3 min(uint3 a, uint3 b) -{ - return make_uint3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z)); -} - -// max -inline __host__ __device__ uint3 max(uint3 a, uint3 b) -{ - return make_uint3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z)); -} - -// addition -inline __host__ __device__ uint3 operator+(uint3 a, uint3 b) -{ - return make_uint3(a.x + b.x, a.y + b.y, a.z + b.z); -} -inline __host__ __device__ void operator+=(uint3 &a, uint3 b) -{ - a.x += b.x; a.y += b.y; a.z += b.z; -} - -// subtract -inline __host__ __device__ uint3 operator-(uint3 a, uint3 b) -{ - return make_uint3(a.x - b.x, a.y - b.y, a.z - b.z); -} - -inline __host__ __device__ void operator-=(uint3 &a, uint3 b) -{ - a.x -= b.x; a.y -= b.y; a.z -= b.z; -} - -// multiply -inline __host__ __device__ uint3 operator*(uint3 a, uint3 b) -{ - return make_uint3(a.x * b.x, a.y * b.y, a.z * b.z); -} -inline __host__ __device__ uint3 operator*(uint3 a, uint s) -{ - return make_uint3(a.x * s, a.y * s, a.z * s); -} -inline __host__ __device__ uint3 operator*(uint s, uint3 a) -{ - return make_uint3(a.x * s, a.y * s, a.z * s); -} -inline __host__ __device__ void operator*=(uint3 &a, uint s) -{ - a.x *= s; a.y *= s; a.z *= s; -} - -// divide -inline __host__ __device__ uint3 operator/(uint3 a, uint3 b) -{ - return make_uint3(a.x / b.x, a.y / b.y, a.z / b.z); -} -inline __host__ __device__ uint3 operator/(uint3 a, uint s) -{ - return make_uint3(a.x / s, a.y / s, a.z / s); -} -inline __host__ __device__ uint3 operator/(uint s, uint3 a) -{ - return make_uint3(a.x / s, a.y / s, a.z / s); -} -inline __host__ __device__ void operator/=(uint3 &a, uint s) -{ - a.x /= s; a.y /= s; a.z /= s; -} - -// clamp -inline __device__ __host__ uint clamp(uint f, uint a, uint b) -{ - return max(a, min(f, b)); -} - -inline __device__ __host__ uint3 clamp(uint3 v, uint a, uint b) -{ - return make_uint3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); -} - -inline __device__ __host__ uint3 clamp(uint3 v, uint3 a, uint3 b) -{ - return make_uint3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); -} - -#endif + /* + * Copyright 1993-2007 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. Users and possessors of this source code + * are hereby granted a nonexclusive, royalty-free license to use this code + * in individual and commercial software. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + * + * Any use of this source code in individual and commercial software must + * include, in the user documentation and internal comments to the code, + * the above Disclaimer and U.S. Government End Users Notice. + */ + +/* + This file implements common mathematical operations on vector types + (float3, float4 etc.) since these are not provided as standard by CUDA. + + The syntax is modelled on the Cg standard library. +*/ + +#ifndef CUTIL_MATH_H +#define CUTIL_MATH_H + +#include "cuda_runtime.h" + +//////////////////////////////////////////////////////////////////////////////// +typedef unsigned int uint; +typedef unsigned short ushort; + +#ifndef __CUDACC__ +#include + +inline float fminf(float a, float b) +{ + return a < b ? a : b; +} + +inline float fmaxf(float a, float b) +{ + return a < b ? a : b; +} + +inline int max(int a, int b) +{ + return a > b ? a : b; +} + +inline int min(int a, int b) +{ + return a < b ? a : b; +} +#endif + +// float functions +//////////////////////////////////////////////////////////////////////////////// + +// lerp +inline __device__ __host__ float lerp(float a, float b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float clamp(float f, float a, float b) +{ + return fmaxf(a, fminf(f, b)); +} + +// int2 functions +//////////////////////////////////////////////////////////////////////////////// + +// negate +inline __host__ __device__ int2 operator-(int2 &a) +{ + return make_int2(-a.x, -a.y); +} + +// addition +inline __host__ __device__ int2 operator+(int2 a, int2 b) +{ + return make_int2(a.x + b.x, a.y + b.y); +} +inline __host__ __device__ void operator+=(int2 &a, int2 b) +{ + a.x += b.x; a.y += b.y; +} + +// subtract +inline __host__ __device__ int2 operator-(int2 a, int2 b) +{ + return make_int2(a.x - b.x, a.y - b.y); +} +inline __host__ __device__ void operator-=(int2 &a, int2 b) +{ + a.x -= b.x; a.y -= b.y; +} + +// multiply +inline __host__ __device__ int2 operator*(int2 a, int2 b) +{ + return make_int2(a.x * b.x, a.y * b.y); +} +inline __host__ __device__ int2 operator*(int2 a, int s) +{ + return make_int2(a.x * s, a.y * s); +} +inline __host__ __device__ int2 operator*(int s, int2 a) +{ + return make_int2(a.x * s, a.y * s); +} +inline __host__ __device__ void operator*=(int2 &a, int s) +{ + a.x *= s; a.y *= s; +} + +// float2 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ float2 make_float2(float s) +{ + return make_float2(s, s); +} +inline __host__ __device__ float2 make_float2(int2 a) +{ + return make_float2(float(a.x), float(a.y)); +} + +// negate +inline __host__ __device__ float2 operator-(float2 &a) +{ + return make_float2(-a.x, -a.y); +} + +// addition +inline __host__ __device__ float2 operator+(float2 a, float2 b) +{ + return make_float2(a.x + b.x, a.y + b.y); +} +inline __host__ __device__ void operator+=(float2 &a, float2 b) +{ + a.x += b.x; a.y += b.y; +} + +// subtract +inline __host__ __device__ float2 operator-(float2 a, float2 b) +{ + return make_float2(a.x - b.x, a.y - b.y); +} +inline __host__ __device__ void operator-=(float2 &a, float2 b) +{ + a.x -= b.x; a.y -= b.y; +} + +// multiply +inline __host__ __device__ float2 operator*(float2 a, float2 b) +{ + return make_float2(a.x * b.x, a.y * b.y); +} +inline __host__ __device__ float2 operator*(float2 a, float s) +{ + return make_float2(a.x * s, a.y * s); +} +inline __host__ __device__ float2 operator*(float s, float2 a) +{ + return make_float2(a.x * s, a.y * s); +} +inline __host__ __device__ void operator*=(float2 &a, float s) +{ + a.x *= s; a.y *= s; +} + +// divide +inline __host__ __device__ float2 operator/(float2 a, float2 b) +{ + return make_float2(a.x / b.x, a.y / b.y); +} +inline __host__ __device__ float2 operator/(float2 a, float s) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ float2 operator/(float s, float2 a) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ void operator/=(float2 &a, float s) +{ + float inv = 1.0f / s; + a *= inv; +} + +// lerp +inline __device__ __host__ float2 lerp(float2 a, float2 b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float2 clamp(float2 v, float a, float b) +{ + return make_float2(clamp(v.x, a, b), clamp(v.y, a, b)); +} + +inline __device__ __host__ float2 clamp(float2 v, float2 a, float2 b) +{ + return make_float2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y)); +} + +// dot product +inline __host__ __device__ float dot(float2 a, float2 b) +{ + return a.x * b.x + a.y * b.y; +} + +// length +inline __host__ __device__ float length(float2 v) +{ + return sqrtf(dot(v, v)); +} + +// normalize +inline __host__ __device__ float2 normalize(float2 v) +{ + float invLen = 1.0f / sqrtf(dot(v, v)); + return v * invLen; +} + +// floor +inline __host__ __device__ float2 floor(const float2 v) +{ + return make_float2(floor(v.x), floor(v.y)); +} + +// reflect +inline __host__ __device__ float2 reflect(float2 i, float2 n) +{ + return i - 2.0f * n * dot(n,i); +} + +// float3 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ float3 make_float3(float s) +{ + return make_float3(s, s, s); +} +inline __host__ __device__ float3 make_float3(float2 a) +{ + return make_float3(a.x, a.y, 0.0f); +} +inline __host__ __device__ float3 make_float3(float2 a, float s) +{ + return make_float3(a.x, a.y, s); +} +inline __host__ __device__ float3 make_float3(float4 a) +{ + return make_float3(a.x, a.y, a.z); // discards w +} +inline __host__ __device__ float3 make_float3(int3 a) +{ + return make_float3(float(a.x), float(a.y), float(a.z)); +} + +// negate +inline __host__ __device__ float3 operator-(float3 &a) +{ + return make_float3(-a.x, -a.y, -a.z); +} + +// min +static __inline__ __host__ __device__ float3 fminf(float3 a, float3 b) +{ + return make_float3(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z)); +} + +// max +static __inline__ __host__ __device__ float3 fmaxf(float3 a, float3 b) +{ + return make_float3(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z)); +} + +// addition +inline __host__ __device__ float3 operator+(float3 a, float3 b) +{ + return make_float3(a.x + b.x, a.y + b.y, a.z + b.z); +} +inline __host__ __device__ float3 operator+(float3 a, float b) +{ + return make_float3(a.x + b, a.y + b, a.z + b); +} +inline __host__ __device__ void operator+=(float3 &a, float3 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; +} + +// subtract +inline __host__ __device__ float3 operator-(float3 a, float3 b) +{ + return make_float3(a.x - b.x, a.y - b.y, a.z - b.z); +} +inline __host__ __device__ float3 operator-(float3 a, float b) +{ + return make_float3(a.x - b, a.y - b, a.z - b); +} +inline __host__ __device__ void operator-=(float3 &a, float3 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; +} + +// multiply +inline __host__ __device__ float3 operator*(float3 a, float3 b) +{ + return make_float3(a.x * b.x, a.y * b.y, a.z * b.z); +} +inline __host__ __device__ float3 operator*(float3 a, float s) +{ + return make_float3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ float3 operator*(float s, float3 a) +{ + return make_float3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ void operator*=(float3 &a, float s) +{ + a.x *= s; a.y *= s; a.z *= s; +} + +// divide +inline __host__ __device__ float3 operator/(float3 a, float3 b) +{ + return make_float3(a.x / b.x, a.y / b.y, a.z / b.z); +} +inline __host__ __device__ float3 operator/(float3 a, float s) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ float3 operator/(float s, float3 a) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ void operator/=(float3 &a, float s) +{ + float inv = 1.0f / s; + a *= inv; +} + +// lerp +inline __device__ __host__ float3 lerp(float3 a, float3 b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float3 clamp(float3 v, float a, float b) +{ + return make_float3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); +} + +inline __device__ __host__ float3 clamp(float3 v, float3 a, float3 b) +{ + return make_float3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); +} + +// dot product +inline __host__ __device__ float dot(float3 a, float3 b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z; +} + +// cross product +inline __host__ __device__ float3 cross(float3 a, float3 b) +{ + return make_float3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); +} + +// length +inline __host__ __device__ float length(float3 v) +{ + return sqrtf(dot(v, v)); +} + +// normalize +inline __host__ __device__ float3 normalize(float3 v) +{ + float invLen = 1.0f / sqrtf(dot(v, v)); + return v * invLen; +} + +// floor +inline __host__ __device__ float3 floor(const float3 v) +{ + return make_float3(floor(v.x), floor(v.y), floor(v.z)); +} + +// reflect +inline __host__ __device__ float3 reflect(float3 i, float3 n) +{ + return i - 2.0f * n * dot(n,i); +} + +// float4 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ float4 make_float4(float s) +{ + return make_float4(s, s, s, s); +} +inline __host__ __device__ float4 make_float4(float3 a) +{ + return make_float4(a.x, a.y, a.z, 0.0f); +} +inline __host__ __device__ float4 make_float4(float3 a, float w) +{ + return make_float4(a.x, a.y, a.z, w); +} +inline __host__ __device__ float4 make_float4(int4 a) +{ + return make_float4(float(a.x), float(a.y), float(a.z), float(a.w)); +} + +// negate +inline __host__ __device__ float4 operator-(float4 &a) +{ + return make_float4(-a.x, -a.y, -a.z, -a.w); +} + +// min +static __inline__ __host__ __device__ float4 fminf(float4 a, float4 b) +{ + return make_float4(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z), fminf(a.w,b.w)); +} + +// max +static __inline__ __host__ __device__ float4 fmaxf(float4 a, float4 b) +{ + return make_float4(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z), fmaxf(a.w,b.w)); +} + +// addition +inline __host__ __device__ float4 operator+(float4 a, float4 b) +{ + return make_float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); +} +inline __host__ __device__ void operator+=(float4 &a, float4 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w; +} + +// subtract +inline __host__ __device__ float4 operator-(float4 a, float4 b) +{ + return make_float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); +} +inline __host__ __device__ void operator-=(float4 &a, float4 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w; +} + +// multiply +inline __host__ __device__ float4 operator*(float4 a, float s) +{ + return make_float4(a.x * s, a.y * s, a.z * s, a.w * s); +} +inline __host__ __device__ float4 operator*(float s, float4 a) +{ + return make_float4(a.x * s, a.y * s, a.z * s, a.w * s); +} +inline __host__ __device__ void operator*=(float4 &a, float s) +{ + a.x *= s; a.y *= s; a.z *= s; a.w *= s; +} + +// divide +inline __host__ __device__ float4 operator/(float4 a, float4 b) +{ + return make_float4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); +} +inline __host__ __device__ float4 operator/(float4 a, float s) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ float4 operator/(float s, float4 a) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ void operator/=(float4 &a, float s) +{ + float inv = 1.0f / s; + a *= inv; +} + +// lerp +inline __device__ __host__ float4 lerp(float4 a, float4 b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float4 clamp(float4 v, float a, float b) +{ + return make_float4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b)); +} + +inline __device__ __host__ float4 clamp(float4 v, float4 a, float4 b) +{ + return make_float4(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z), clamp(v.w, a.w, b.w)); +} + +// dot product +inline __host__ __device__ float dot(float4 a, float4 b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; +} + +// length +inline __host__ __device__ float length(float4 r) +{ + return sqrtf(dot(r, r)); +} + +// normalize +inline __host__ __device__ float4 normalize(float4 v) +{ + float invLen = 1.0f / sqrtf(dot(v, v)); + return v * invLen; +} + +// floor +inline __host__ __device__ float4 floor(const float4 v) +{ + return make_float4(floor(v.x), floor(v.y), floor(v.z), floor(v.w)); +} + +// int3 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ int3 make_int3(int s) +{ + return make_int3(s, s, s); +} +inline __host__ __device__ int3 make_int3(float3 a) +{ + return make_int3(int(a.x), int(a.y), int(a.z)); +} + +// negate +inline __host__ __device__ int3 operator-(int3 &a) +{ + return make_int3(-a.x, -a.y, -a.z); +} + +// min +inline __host__ __device__ int3 min(int3 a, int3 b) +{ + return make_int3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z)); +} + +// max +inline __host__ __device__ int3 max(int3 a, int3 b) +{ + return make_int3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z)); +} + +// addition +inline __host__ __device__ int3 operator+(int3 a, int3 b) +{ + return make_int3(a.x + b.x, a.y + b.y, a.z + b.z); +} +inline __host__ __device__ void operator+=(int3 &a, int3 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; +} + +// subtract +inline __host__ __device__ int3 operator-(int3 a, int3 b) +{ + return make_int3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +inline __host__ __device__ void operator-=(int3 &a, int3 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; +} + +// multiply +inline __host__ __device__ int3 operator*(int3 a, int3 b) +{ + return make_int3(a.x * b.x, a.y * b.y, a.z * b.z); +} +inline __host__ __device__ int3 operator*(int3 a, int s) +{ + return make_int3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ int3 operator*(int s, int3 a) +{ + return make_int3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ void operator*=(int3 &a, int s) +{ + a.x *= s; a.y *= s; a.z *= s; +} + +// divide +inline __host__ __device__ int3 operator/(int3 a, int3 b) +{ + return make_int3(a.x / b.x, a.y / b.y, a.z / b.z); +} +inline __host__ __device__ int3 operator/(int3 a, int s) +{ + return make_int3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ int3 operator/(int s, int3 a) +{ + return make_int3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ void operator/=(int3 &a, int s) +{ + a.x /= s; a.y /= s; a.z /= s; +} + +// clamp +inline __device__ __host__ int clamp(int f, int a, int b) +{ + return max(a, min(f, b)); +} + +inline __device__ __host__ int3 clamp(int3 v, int a, int b) +{ + return make_int3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); +} + +inline __device__ __host__ int3 clamp(int3 v, int3 a, int3 b) +{ + return make_int3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); +} + + +// uint3 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ uint3 make_uint3(uint s) +{ + return make_uint3(s, s, s); +} +inline __host__ __device__ uint3 make_uint3(float3 a) +{ + return make_uint3(uint(a.x), uint(a.y), uint(a.z)); +} + +// min +inline __host__ __device__ uint3 min(uint3 a, uint3 b) +{ + return make_uint3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z)); +} + +// max +inline __host__ __device__ uint3 max(uint3 a, uint3 b) +{ + return make_uint3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z)); +} + +// addition +inline __host__ __device__ uint3 operator+(uint3 a, uint3 b) +{ + return make_uint3(a.x + b.x, a.y + b.y, a.z + b.z); +} +inline __host__ __device__ void operator+=(uint3 &a, uint3 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; +} + +// subtract +inline __host__ __device__ uint3 operator-(uint3 a, uint3 b) +{ + return make_uint3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +inline __host__ __device__ void operator-=(uint3 &a, uint3 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; +} + +// multiply +inline __host__ __device__ uint3 operator*(uint3 a, uint3 b) +{ + return make_uint3(a.x * b.x, a.y * b.y, a.z * b.z); +} +inline __host__ __device__ uint3 operator*(uint3 a, uint s) +{ + return make_uint3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ uint3 operator*(uint s, uint3 a) +{ + return make_uint3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ void operator*=(uint3 &a, uint s) +{ + a.x *= s; a.y *= s; a.z *= s; +} + +// divide +inline __host__ __device__ uint3 operator/(uint3 a, uint3 b) +{ + return make_uint3(a.x / b.x, a.y / b.y, a.z / b.z); +} +inline __host__ __device__ uint3 operator/(uint3 a, uint s) +{ + return make_uint3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ uint3 operator/(uint s, uint3 a) +{ + return make_uint3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ void operator/=(uint3 &a, uint s) +{ + a.x /= s; a.y /= s; a.z /= s; +} + +// clamp +inline __device__ __host__ uint clamp(uint f, uint a, uint b) +{ + return max(a, min(f, b)); +} + +inline __device__ __host__ uint3 clamp(uint3 v, uint a, uint b) +{ + return make_uint3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); +} + +inline __device__ __host__ uint3 clamp(uint3 v, uint3 a, uint3 b) +{ + return make_uint3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); +} + +#endif diff --git a/Extras/CUDA/libbulletcuda.vcproj b/Extras/CUDA/libbulletcuda.vcproj index 69bd35bef..7e0a3dde0 100644 --- a/Extras/CUDA/libbulletcuda.vcproj +++ b/Extras/CUDA/libbulletcuda.vcproj @@ -1,665 +1,665 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/CUDA/radixsort.cu b/Extras/CUDA/radixsort.cu index 7e7bbcf7e..24c85c653 100644 --- a/Extras/CUDA/radixsort.cu +++ b/Extras/CUDA/radixsort.cu @@ -1,79 +1,79 @@ -/* - * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - */ - -/* Radixsort project with key/value and arbitrary datset size support - * which demonstrates the use of CUDA in a multi phase sorting - * computation. - * Host code. - */ - -#include "radixsort.cuh" -#include "radixsort_kernel.cu" - -extern "C" -{ - -//////////////////////////////////////////////////////////////////////////////// -//! Perform a radix sort -//! Sorting performed in place on passed arrays. -//! -//! @param pData0 input and output array - data will be sorted -//! @param pData1 additional array to allow ping pong computation -//! @param elements number of elements to sort -//////////////////////////////////////////////////////////////////////////////// -void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits) -{ - // Round element count to total number of threads for efficiency - uint elements_rounded_to_3072; - int modval = elements % 3072; - if( modval == 0 ) - elements_rounded_to_3072 = elements; - else - elements_rounded_to_3072 = elements + (3072 - (modval)); - - // Iterate over n bytes of y bit word, using each byte to sort the list in turn - for (uint shift = 0; shift < bits; shift += RADIX) - { - // Perform one round of radix sorting - - // Generate per radix group sums radix counts across a radix group - RadixSum<<>>(pData0, elements, elements_rounded_to_3072, shift); - // Prefix sum in radix groups, and then between groups throughout a block - RadixPrefixSum<<>>(); - // Sum the block offsets and then shuffle data into bins - RadixAddOffsetsAndShuffle<<>>(pData0, pData1, elements, elements_rounded_to_3072, shift); - - // Exchange data pointers - KeyValuePair* pTemp = pData0; - pData0 = pData1; - pData1 = pTemp; - } -} - -} +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project with key/value and arbitrary datset size support + * which demonstrates the use of CUDA in a multi phase sorting + * computation. + * Host code. + */ + +#include "radixsort.cuh" +#include "radixsort_kernel.cu" + +extern "C" +{ + +//////////////////////////////////////////////////////////////////////////////// +//! Perform a radix sort +//! Sorting performed in place on passed arrays. +//! +//! @param pData0 input and output array - data will be sorted +//! @param pData1 additional array to allow ping pong computation +//! @param elements number of elements to sort +//////////////////////////////////////////////////////////////////////////////// +void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits) +{ + // Round element count to total number of threads for efficiency + uint elements_rounded_to_3072; + int modval = elements % 3072; + if( modval == 0 ) + elements_rounded_to_3072 = elements; + else + elements_rounded_to_3072 = elements + (3072 - (modval)); + + // Iterate over n bytes of y bit word, using each byte to sort the list in turn + for (uint shift = 0; shift < bits; shift += RADIX) + { + // Perform one round of radix sorting + + // Generate per radix group sums radix counts across a radix group + RadixSum<<>>(pData0, elements, elements_rounded_to_3072, shift); + // Prefix sum in radix groups, and then between groups throughout a block + RadixPrefixSum<<>>(); + // Sum the block offsets and then shuffle data into bins + RadixAddOffsetsAndShuffle<<>>(pData0, pData1, elements, elements_rounded_to_3072, shift); + + // Exchange data pointers + KeyValuePair* pTemp = pData0; + pData0 = pData1; + pData1 = pTemp; + } +} + +} diff --git a/Extras/CUDA/radixsort.cuh b/Extras/CUDA/radixsort.cuh index f0e038d35..538bb11f0 100644 --- a/Extras/CUDA/radixsort.cuh +++ b/Extras/CUDA/radixsort.cuh @@ -1,63 +1,63 @@ -/* - * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - */ - -/* Radixsort project which demonstrates the use of CUDA in a multi phase - * sorting computation. - * Type definitions. - */ - -#ifndef _RADIXSORT_H_ -#define _RADIXSORT_H_ - -#include - -#define SYNCIT __syncthreads() - -// Use 16 bit keys/values -#define SIXTEEN 0 - -typedef unsigned int uint; -typedef unsigned short ushort; - -#if SIXTEEN -typedef struct __align__(4) { - ushort key; - ushort value; -#else -typedef struct __align__(8) { - uint key; - uint value; -#endif -} KeyValuePair; - -extern "C" { - void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits); -} - -#endif // #ifndef _RADIXSORT_H_ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project which demonstrates the use of CUDA in a multi phase + * sorting computation. + * Type definitions. + */ + +#ifndef _RADIXSORT_H_ +#define _RADIXSORT_H_ + +#include + +#define SYNCIT __syncthreads() + +// Use 16 bit keys/values +#define SIXTEEN 0 + +typedef unsigned int uint; +typedef unsigned short ushort; + +#if SIXTEEN +typedef struct __align__(4) { + ushort key; + ushort value; +#else +typedef struct __align__(8) { + uint key; + uint value; +#endif +} KeyValuePair; + +extern "C" { + void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits); +} + +#endif // #ifndef _RADIXSORT_H_ diff --git a/Extras/CUDA/radixsort_kernel.cu b/Extras/CUDA/radixsort_kernel.cu index e12dca2a0..202584136 100644 --- a/Extras/CUDA/radixsort_kernel.cu +++ b/Extras/CUDA/radixsort_kernel.cu @@ -1,577 +1,577 @@ -/* - * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - */ - -/* Radixsort project with key/value and arbitrary datset size support - * which demonstrates the use of CUDA in a multi phase sorting - * computation. - * Device code. - */ - -#ifndef _RADIXSORT_KERNEL_H_ -#define _RADIXSORT_KERNEL_H_ - -#include -#include "radixsort.cuh" - -#define SYNCIT __syncthreads() - -static const int NUM_SMS = 16; -static const int NUM_THREADS_PER_SM = 192; -static const int NUM_THREADS_PER_BLOCK = 64; -//static const int NUM_THREADS = NUM_THREADS_PER_SM * NUM_SMS; -static const int NUM_BLOCKS = (NUM_THREADS_PER_SM / NUM_THREADS_PER_BLOCK) * NUM_SMS; -static const int RADIX = 8; // Number of bits per radix sort pass -static const int RADICES = 1 << RADIX; // Number of radices -static const int RADIXMASK = RADICES - 1; // Mask for each radix sort pass -#if SIXTEEN -static const int RADIXBITS = 16; // Number of bits to sort over -#else -static const int RADIXBITS = 32; // Number of bits to sort over -#endif -static const int RADIXTHREADS = 16; // Number of threads sharing each radix counter -static const int RADIXGROUPS = NUM_THREADS_PER_BLOCK / RADIXTHREADS; // Number of radix groups per CTA -static const int TOTALRADIXGROUPS = NUM_BLOCKS * RADIXGROUPS; // Number of radix groups for each radix -static const int SORTRADIXGROUPS = TOTALRADIXGROUPS * RADICES; // Total radix count -static const int GRFELEMENTS = (NUM_THREADS_PER_BLOCK / RADIXTHREADS) * RADICES; -static const int GRFSIZE = GRFELEMENTS * sizeof(uint); - -// Prefix sum variables -static const int PREFIX_NUM_THREADS_PER_SM = NUM_THREADS_PER_SM; -static const int PREFIX_NUM_THREADS_PER_BLOCK = PREFIX_NUM_THREADS_PER_SM; -static const int PREFIX_NUM_BLOCKS = (PREFIX_NUM_THREADS_PER_SM / PREFIX_NUM_THREADS_PER_BLOCK) * NUM_SMS; -static const int PREFIX_BLOCKSIZE = SORTRADIXGROUPS / PREFIX_NUM_BLOCKS; -static const int PREFIX_GRFELEMENTS = PREFIX_BLOCKSIZE + 2 * PREFIX_NUM_THREADS_PER_BLOCK; -static const int PREFIX_GRFSIZE = PREFIX_GRFELEMENTS * sizeof(uint); - -// Shuffle variables -static const int SHUFFLE_GRFOFFSET = RADIXGROUPS * RADICES; -static const int SHUFFLE_GRFELEMENTS = SHUFFLE_GRFOFFSET + PREFIX_NUM_BLOCKS; -static const int SHUFFLE_GRFSIZE = SHUFFLE_GRFELEMENTS * sizeof(uint); - - -#define SDATA( index) CUT_BANK_CHECKER(sdata, index) - -// Prefix sum data -uint gRadixSum[TOTALRADIXGROUPS * RADICES]; -__device__ uint dRadixSum[TOTALRADIXGROUPS * RADICES]; -uint gRadixBlockSum[PREFIX_NUM_BLOCKS]; -__device__ uint dRadixBlockSum[PREFIX_NUM_BLOCKS]; - -extern __shared__ uint sRadixSum[]; - - - -//////////////////////////////////////////////////////////////////////////////// -//! Perform a radix sum on the list to be sorted. Each SM holds a set of -//! radix counters for each group of RADIXGROUPS thread in the GRF. -//! -//! @param pData input data -//! @param elements total number of elements -//! @param elements_rounded_to_3072 total number of elements rounded up to the -//! nearest multiple of 3072 -//! @param shift the shift (0 to 24) that we are using to obtain the correct -//! byte -//////////////////////////////////////////////////////////////////////////////// -__global__ void RadixSum(KeyValuePair *pData, uint elements, uint elements_rounded_to_3072, uint shift) -{ - uint pos = threadIdx.x; - - // Zero radix counts - while (pos < GRFELEMENTS) - { - sRadixSum[pos] = 0; - pos += NUM_THREADS_PER_BLOCK; - } - - // Sum up data - // Source addresses computed so that each thread is reading from a block of - // consecutive addresses so there are no conflicts between threads - // They then loop over their combined region and the next batch works elsewhere. - // So threads 0 to 16 work on memory 0 to 320. - // First reading 0,1,2,3...15 then 16,17,18,19...31 and so on - // optimising parallel access to shared memory by a thread accessing 16*threadID - // The next radix group runs from 320 to 640 and the same applies in that region - uint tmod = threadIdx.x % RADIXTHREADS; - uint tpos = threadIdx.x / RADIXTHREADS; - - // Take the rounded element list size so that all threads have a certain size dataset to work with - // and no zero size datasets confusing the issue - // By using a multiple of 3072 we ensure that all threads have elements - // to work with until the last phase, at which point we individually test - uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; - - // Generate range - // Note that it is possible for both pos and end to be past the end of the element set - // which will be caught later. - pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; - uint end = pos + element_fraction; - pos += tmod; - //printf("pos: %d\n", pos); - __syncthreads(); - - while (pos < end ) - { - uint key = 0; - - // Read first data element if we are in the set of elements - //if( pos < elements ) - //key = pData[pos].key; - KeyValuePair kvp; - // Read first data element, both items at once as the memory will want to coalesce like that anyway - if (pos < elements) - kvp = pData[pos]; - else - kvp.key = 0; - key = kvp.key; - - - // Calculate position of radix counter to increment - // There are RADICES radices in each pass (256) - // and hence this many counters for bin grouping - // Multiply by RADIXGROUPS (4) to spread through memory - // and into 4 radix groups - uint p = ((key >> shift) & RADIXMASK) * RADIXGROUPS; - - // Increment radix counters - // Each radix group has its own set of counters - // so we add the thread position [0-3], ie the group index. - // We slow down here and take at least 16 cycles to write to the summation boxes - // but other groups will only conflict with themselves and so can also be writing - // 16 cycles here at least avoids retries. - uint ppos = p + tpos; - - // If we are past the last element we don't want to do anything - // We do have to check each time, however, to ensure that all - // threads sync on each sync here. - if (tmod == 0 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 1 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 2 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 3 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 4 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 5 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 6 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 7 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 8 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 9 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 10 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 11 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 12 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 13 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 14 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 15 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - - pos += RADIXTHREADS; - - } - - __syncthreads(); - - __syncthreads(); - - // Output radix sums into separate memory regions for each radix group - // So this memory then is layed out: - // 0...... 192..... 384 ................ 192*256 - // ie all 256 bins for each radix group - // in there: - // 0.............192 - // 0 4 8 12... - block idx * 4 - // And in the block boxes we see the 4 radix groups for that block - // So 0-192 should contain bin 0 for each radix group, and so on - uint offset = blockIdx.x * RADIXGROUPS; - uint row = threadIdx.x / RADIXGROUPS; - uint column = threadIdx.x % RADIXGROUPS; - while (row < RADICES) - { - dRadixSum[offset + row * TOTALRADIXGROUPS + column] = sRadixSum[row * RADIXGROUPS + column]; - row += NUM_THREADS_PER_BLOCK / RADIXGROUPS; - } -} - -//////////////////////////////////////////////////////////////////////////////// -//! Performs first part of parallel prefix sum - individual sums of each radix -//! count. By the end of this we have prefix sums on a block level in dRadixSum -//! and totals for blocks in dRadixBlockSum. -//////////////////////////////////////////////////////////////////////////////// -__global__ void RadixPrefixSum() -{ - // Read radix groups in offset by one in the GRF so a zero can be inserted at the beginning - // and the final sum of all radix counts summed here is tacked onto the end for reading by - // the next stage - // Each block in this case is the full number of threads per SM (and hence the total number - // of radix groups), 192. We should then have the total set of offsets for an entire radix - // group by the end of this stage - // Device mem addressing - - uint brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); - uint drow = threadIdx.x / TOTALRADIXGROUPS; // In default parameterisation this is always 0 - uint dcolumn = threadIdx.x % TOTALRADIXGROUPS; // And similarly this is always the same as threadIdx.x - uint dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn; - uint end = ((blockIdx.x + 1) * (RADICES / PREFIX_NUM_BLOCKS)) * TOTALRADIXGROUPS; - // Shared mem addressing - uint srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - uint scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - uint spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; - - // Read (RADICES / PREFIX_NUM_BLOCKS) radix counts into the GRF alongside each other - while (dpos < end) - { - sRadixSum[spos] = dRadixSum[dpos]; - spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * - (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; - } - __syncthreads(); - - // Perform preliminary sum on each thread's stretch of data - // Each thread having a block of 16, with spacers between 0...16 18...33 and so on - int pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - uint sum = 0; - while (pos < end) - { - sum += sRadixSum[pos]; - sRadixSum[pos] = sum; - pos++; - } - __syncthreads(); - - - // Calculate internal offsets by performing a more traditional parallel - // prefix sum of the topmost member of each thread's work data. Right now, - // these are stored between the work data for each thread, allowing us to - // eliminate GRF conflicts as well as hold the offsets needed to complete the sum - // In other words we have: - // 0....15 16 17....32 33 34.... - // Where this first stage updates the intermediate values (so 16=15, 33=32 etc) - int m = (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + - (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - sRadixSum[pos] = sRadixSum[pos - 1]; - __syncthreads(); - // This stage then performs a parallel prefix sum (ie use powers of 2 to propagate in log n stages) - // to update 17, 34 etc with the totals to that point (so 34 becomes [34] + [17]) and so on. - while (m < PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1)) - { - int p = pos - m; - uint t = ((p > 0) ? sRadixSum[p] : 0); - __syncthreads(); - sRadixSum[pos] += t; - __syncthreads(); - m *= 2; - } - __syncthreads(); - - - - // Add internal offsets to each thread's work data. - // So now we take 17 and add it to all values 18 to 33 so all offsets for that block - // are updated. - pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - int p = pos - 1; - sum = ((p > 0) ? sRadixSum[p] : 0); - while (pos < end) - { - sRadixSum[pos] += sum; - pos++; - } - __syncthreads(); - - // Write summed data back out to global memory in the same way as we read it in - // We now have prefix sum values internal to groups - brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); - drow = threadIdx.x / TOTALRADIXGROUPS; - dcolumn = threadIdx.x % TOTALRADIXGROUPS; - srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn + 1; - spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; - end = ((blockIdx.x + 1) * RADICES / PREFIX_NUM_BLOCKS) * TOTALRADIXGROUPS; - while (dpos < end) - { - dRadixSum[dpos] = sRadixSum[spos]; - dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; - spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * - (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - } - - // Write last element to summation - // Storing block sums in a separate array - if (threadIdx.x == 0) { - dRadixBlockSum[blockIdx.x] = sRadixSum[PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) - 1]; - dRadixSum[blockIdx.x * PREFIX_BLOCKSIZE] = 0; - } -} - - -//////////////////////////////////////////////////////////////////////////////// -//! Initially perform prefix sum of block totals to obtain final set of offsets. -//! Then make use of radix sums to perform a shuffling of the data into the -//! correct bins. -//! -//! @param pSrc input data -//! @param pDst output data -//! @param elements total number of elements -//! @param shift the shift (0 to 24) that we are using to obtain the correct -//! byte -//////////////////////////////////////////////////////////////////////////////// -__global__ void RadixAddOffsetsAndShuffle(KeyValuePair* pSrc, KeyValuePair* pDst, uint elements, uint elements_rounded_to_3072, int shift) -{ - // Read offsets from previous blocks - if (threadIdx.x == 0) - sRadixSum[SHUFFLE_GRFOFFSET] = 0; - - if (threadIdx.x < PREFIX_NUM_BLOCKS - 1) - sRadixSum[SHUFFLE_GRFOFFSET + threadIdx.x + 1] = dRadixBlockSum[threadIdx.x]; - __syncthreads(); - - // Parallel prefix sum over block sums - int pos = threadIdx.x; - int n = 1; - while (n < PREFIX_NUM_BLOCKS) - { - int ppos = pos - n; - uint t0 = ((pos < PREFIX_NUM_BLOCKS) && (ppos >= 0)) ? sRadixSum[SHUFFLE_GRFOFFSET + ppos] : 0; - __syncthreads(); - if (pos < PREFIX_NUM_BLOCKS) - sRadixSum[SHUFFLE_GRFOFFSET + pos] += t0; - __syncthreads(); - n *= 2; - } - - // Read radix count data and add appropriate block offset - // for each radix at the memory location for this thread - // (where the other threads in the block will be reading - // as well, hence the large stride). - // There is one counter box per radix group per radix - // per block (4*256*3) - // We use 64 threads to read the 4 radix groups set of radices - // for the block. - int row = threadIdx.x / RADIXGROUPS; - int column = threadIdx.x % RADIXGROUPS; - int spos = row * RADIXGROUPS + column; - int dpos = row * TOTALRADIXGROUPS + column + blockIdx.x * RADIXGROUPS; - while (spos < SHUFFLE_GRFOFFSET) - { - sRadixSum[spos] = dRadixSum[dpos] + sRadixSum[SHUFFLE_GRFOFFSET + dpos / (TOTALRADIXGROUPS * RADICES / PREFIX_NUM_BLOCKS)]; - spos += NUM_THREADS_PER_BLOCK; - dpos += (NUM_THREADS_PER_BLOCK / RADIXGROUPS) * TOTALRADIXGROUPS; - } - __syncthreads(); - - //int pos; - // Shuffle data - // Each of the subbins for a block should be filled via the counters, properly interleaved - // Then, as we now iterate over each data value, we increment the subbins (each thread in the - // radix group in turn to avoid miss writes due to conflicts) and set locations correctly. - uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; - int tmod = threadIdx.x % RADIXTHREADS; - int tpos = threadIdx.x / RADIXTHREADS; - - pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; - uint end = pos + element_fraction; //(blockIdx.x * RADIXGROUPS + tpos + 1) * element_fraction; - pos += tmod; - - __syncthreads(); - - while (pos < end ) - { - KeyValuePair kvp; -#if 1 // old load - // Read first data element, both items at once as the memory will want to coalesce like that anyway - if (pos < elements) - { - kvp = pSrc[pos]; - } - else - kvp.key = 0; - -#else // casting to float2 to get it to combine loads - int2 kvpf2; - - // Read first data element, both items at once as the memory will want to coalesce like that anyway - if (pos < elements) - { - // kvp = pSrc[pos]; - kvpf2 = ((int2*)pSrc)[pos]; - // printf("kvp: %f %f kvpf2: %f %f\n", kvp.key, kvp.value, kvpf2.x, kvpf2.y); - } - else - //kvp.key = 0; - kvpf2.x = 0; - - kvp.key = kvpf2.x; - kvp.value = kvpf2.y; -#endif - - uint index; - - // Calculate position of radix counter to increment - uint p = ((kvp.key >> shift) & RADIXMASK) * RADIXGROUPS; - - // Move data, keeping counts updated. - // Increment radix counters, relying on hexadecathread - // warp to prevent this code from stepping all over itself. - uint ppos = p + tpos; - if (tmod == 0 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 1 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 2 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 3 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 4 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 5 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 6 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 7 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 8 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 9 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 10 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 11 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 12 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 13 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 14 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 15 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - - pos += RADIXTHREADS; - } - - __syncthreads(); -} - -#endif // #ifndef _RADIXSORT_KERNEL_H_ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project with key/value and arbitrary datset size support + * which demonstrates the use of CUDA in a multi phase sorting + * computation. + * Device code. + */ + +#ifndef _RADIXSORT_KERNEL_H_ +#define _RADIXSORT_KERNEL_H_ + +#include +#include "radixsort.cuh" + +#define SYNCIT __syncthreads() + +static const int NUM_SMS = 16; +static const int NUM_THREADS_PER_SM = 192; +static const int NUM_THREADS_PER_BLOCK = 64; +//static const int NUM_THREADS = NUM_THREADS_PER_SM * NUM_SMS; +static const int NUM_BLOCKS = (NUM_THREADS_PER_SM / NUM_THREADS_PER_BLOCK) * NUM_SMS; +static const int RADIX = 8; // Number of bits per radix sort pass +static const int RADICES = 1 << RADIX; // Number of radices +static const int RADIXMASK = RADICES - 1; // Mask for each radix sort pass +#if SIXTEEN +static const int RADIXBITS = 16; // Number of bits to sort over +#else +static const int RADIXBITS = 32; // Number of bits to sort over +#endif +static const int RADIXTHREADS = 16; // Number of threads sharing each radix counter +static const int RADIXGROUPS = NUM_THREADS_PER_BLOCK / RADIXTHREADS; // Number of radix groups per CTA +static const int TOTALRADIXGROUPS = NUM_BLOCKS * RADIXGROUPS; // Number of radix groups for each radix +static const int SORTRADIXGROUPS = TOTALRADIXGROUPS * RADICES; // Total radix count +static const int GRFELEMENTS = (NUM_THREADS_PER_BLOCK / RADIXTHREADS) * RADICES; +static const int GRFSIZE = GRFELEMENTS * sizeof(uint); + +// Prefix sum variables +static const int PREFIX_NUM_THREADS_PER_SM = NUM_THREADS_PER_SM; +static const int PREFIX_NUM_THREADS_PER_BLOCK = PREFIX_NUM_THREADS_PER_SM; +static const int PREFIX_NUM_BLOCKS = (PREFIX_NUM_THREADS_PER_SM / PREFIX_NUM_THREADS_PER_BLOCK) * NUM_SMS; +static const int PREFIX_BLOCKSIZE = SORTRADIXGROUPS / PREFIX_NUM_BLOCKS; +static const int PREFIX_GRFELEMENTS = PREFIX_BLOCKSIZE + 2 * PREFIX_NUM_THREADS_PER_BLOCK; +static const int PREFIX_GRFSIZE = PREFIX_GRFELEMENTS * sizeof(uint); + +// Shuffle variables +static const int SHUFFLE_GRFOFFSET = RADIXGROUPS * RADICES; +static const int SHUFFLE_GRFELEMENTS = SHUFFLE_GRFOFFSET + PREFIX_NUM_BLOCKS; +static const int SHUFFLE_GRFSIZE = SHUFFLE_GRFELEMENTS * sizeof(uint); + + +#define SDATA( index) CUT_BANK_CHECKER(sdata, index) + +// Prefix sum data +uint gRadixSum[TOTALRADIXGROUPS * RADICES]; +__device__ uint dRadixSum[TOTALRADIXGROUPS * RADICES]; +uint gRadixBlockSum[PREFIX_NUM_BLOCKS]; +__device__ uint dRadixBlockSum[PREFIX_NUM_BLOCKS]; + +extern __shared__ uint sRadixSum[]; + + + +//////////////////////////////////////////////////////////////////////////////// +//! Perform a radix sum on the list to be sorted. Each SM holds a set of +//! radix counters for each group of RADIXGROUPS thread in the GRF. +//! +//! @param pData input data +//! @param elements total number of elements +//! @param elements_rounded_to_3072 total number of elements rounded up to the +//! nearest multiple of 3072 +//! @param shift the shift (0 to 24) that we are using to obtain the correct +//! byte +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixSum(KeyValuePair *pData, uint elements, uint elements_rounded_to_3072, uint shift) +{ + uint pos = threadIdx.x; + + // Zero radix counts + while (pos < GRFELEMENTS) + { + sRadixSum[pos] = 0; + pos += NUM_THREADS_PER_BLOCK; + } + + // Sum up data + // Source addresses computed so that each thread is reading from a block of + // consecutive addresses so there are no conflicts between threads + // They then loop over their combined region and the next batch works elsewhere. + // So threads 0 to 16 work on memory 0 to 320. + // First reading 0,1,2,3...15 then 16,17,18,19...31 and so on + // optimising parallel access to shared memory by a thread accessing 16*threadID + // The next radix group runs from 320 to 640 and the same applies in that region + uint tmod = threadIdx.x % RADIXTHREADS; + uint tpos = threadIdx.x / RADIXTHREADS; + + // Take the rounded element list size so that all threads have a certain size dataset to work with + // and no zero size datasets confusing the issue + // By using a multiple of 3072 we ensure that all threads have elements + // to work with until the last phase, at which point we individually test + uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; + + // Generate range + // Note that it is possible for both pos and end to be past the end of the element set + // which will be caught later. + pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; + uint end = pos + element_fraction; + pos += tmod; + //printf("pos: %d\n", pos); + __syncthreads(); + + while (pos < end ) + { + uint key = 0; + + // Read first data element if we are in the set of elements + //if( pos < elements ) + //key = pData[pos].key; + KeyValuePair kvp; + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + kvp = pData[pos]; + else + kvp.key = 0; + key = kvp.key; + + + // Calculate position of radix counter to increment + // There are RADICES radices in each pass (256) + // and hence this many counters for bin grouping + // Multiply by RADIXGROUPS (4) to spread through memory + // and into 4 radix groups + uint p = ((key >> shift) & RADIXMASK) * RADIXGROUPS; + + // Increment radix counters + // Each radix group has its own set of counters + // so we add the thread position [0-3], ie the group index. + // We slow down here and take at least 16 cycles to write to the summation boxes + // but other groups will only conflict with themselves and so can also be writing + // 16 cycles here at least avoids retries. + uint ppos = p + tpos; + + // If we are past the last element we don't want to do anything + // We do have to check each time, however, to ensure that all + // threads sync on each sync here. + if (tmod == 0 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 1 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 2 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 3 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 4 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 5 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 6 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 7 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 8 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 9 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 10 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 11 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 12 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 13 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 14 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 15 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + + pos += RADIXTHREADS; + + } + + __syncthreads(); + + __syncthreads(); + + // Output radix sums into separate memory regions for each radix group + // So this memory then is layed out: + // 0...... 192..... 384 ................ 192*256 + // ie all 256 bins for each radix group + // in there: + // 0.............192 + // 0 4 8 12... - block idx * 4 + // And in the block boxes we see the 4 radix groups for that block + // So 0-192 should contain bin 0 for each radix group, and so on + uint offset = blockIdx.x * RADIXGROUPS; + uint row = threadIdx.x / RADIXGROUPS; + uint column = threadIdx.x % RADIXGROUPS; + while (row < RADICES) + { + dRadixSum[offset + row * TOTALRADIXGROUPS + column] = sRadixSum[row * RADIXGROUPS + column]; + row += NUM_THREADS_PER_BLOCK / RADIXGROUPS; + } +} + +//////////////////////////////////////////////////////////////////////////////// +//! Performs first part of parallel prefix sum - individual sums of each radix +//! count. By the end of this we have prefix sums on a block level in dRadixSum +//! and totals for blocks in dRadixBlockSum. +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixPrefixSum() +{ + // Read radix groups in offset by one in the GRF so a zero can be inserted at the beginning + // and the final sum of all radix counts summed here is tacked onto the end for reading by + // the next stage + // Each block in this case is the full number of threads per SM (and hence the total number + // of radix groups), 192. We should then have the total set of offsets for an entire radix + // group by the end of this stage + // Device mem addressing + + uint brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); + uint drow = threadIdx.x / TOTALRADIXGROUPS; // In default parameterisation this is always 0 + uint dcolumn = threadIdx.x % TOTALRADIXGROUPS; // And similarly this is always the same as threadIdx.x + uint dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn; + uint end = ((blockIdx.x + 1) * (RADICES / PREFIX_NUM_BLOCKS)) * TOTALRADIXGROUPS; + // Shared mem addressing + uint srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; + + // Read (RADICES / PREFIX_NUM_BLOCKS) radix counts into the GRF alongside each other + while (dpos < end) + { + sRadixSum[spos] = dRadixSum[dpos]; + spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; + } + __syncthreads(); + + // Perform preliminary sum on each thread's stretch of data + // Each thread having a block of 16, with spacers between 0...16 18...33 and so on + int pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint sum = 0; + while (pos < end) + { + sum += sRadixSum[pos]; + sRadixSum[pos] = sum; + pos++; + } + __syncthreads(); + + + // Calculate internal offsets by performing a more traditional parallel + // prefix sum of the topmost member of each thread's work data. Right now, + // these are stored between the work data for each thread, allowing us to + // eliminate GRF conflicts as well as hold the offsets needed to complete the sum + // In other words we have: + // 0....15 16 17....32 33 34.... + // Where this first stage updates the intermediate values (so 16=15, 33=32 etc) + int m = (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + sRadixSum[pos] = sRadixSum[pos - 1]; + __syncthreads(); + // This stage then performs a parallel prefix sum (ie use powers of 2 to propagate in log n stages) + // to update 17, 34 etc with the totals to that point (so 34 becomes [34] + [17]) and so on. + while (m < PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1)) + { + int p = pos - m; + uint t = ((p > 0) ? sRadixSum[p] : 0); + __syncthreads(); + sRadixSum[pos] += t; + __syncthreads(); + m *= 2; + } + __syncthreads(); + + + + // Add internal offsets to each thread's work data. + // So now we take 17 and add it to all values 18 to 33 so all offsets for that block + // are updated. + pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + int p = pos - 1; + sum = ((p > 0) ? sRadixSum[p] : 0); + while (pos < end) + { + sRadixSum[pos] += sum; + pos++; + } + __syncthreads(); + + // Write summed data back out to global memory in the same way as we read it in + // We now have prefix sum values internal to groups + brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); + drow = threadIdx.x / TOTALRADIXGROUPS; + dcolumn = threadIdx.x % TOTALRADIXGROUPS; + srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn + 1; + spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; + end = ((blockIdx.x + 1) * RADICES / PREFIX_NUM_BLOCKS) * TOTALRADIXGROUPS; + while (dpos < end) + { + dRadixSum[dpos] = sRadixSum[spos]; + dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; + spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + } + + // Write last element to summation + // Storing block sums in a separate array + if (threadIdx.x == 0) { + dRadixBlockSum[blockIdx.x] = sRadixSum[PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) - 1]; + dRadixSum[blockIdx.x * PREFIX_BLOCKSIZE] = 0; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +//! Initially perform prefix sum of block totals to obtain final set of offsets. +//! Then make use of radix sums to perform a shuffling of the data into the +//! correct bins. +//! +//! @param pSrc input data +//! @param pDst output data +//! @param elements total number of elements +//! @param shift the shift (0 to 24) that we are using to obtain the correct +//! byte +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixAddOffsetsAndShuffle(KeyValuePair* pSrc, KeyValuePair* pDst, uint elements, uint elements_rounded_to_3072, int shift) +{ + // Read offsets from previous blocks + if (threadIdx.x == 0) + sRadixSum[SHUFFLE_GRFOFFSET] = 0; + + if (threadIdx.x < PREFIX_NUM_BLOCKS - 1) + sRadixSum[SHUFFLE_GRFOFFSET + threadIdx.x + 1] = dRadixBlockSum[threadIdx.x]; + __syncthreads(); + + // Parallel prefix sum over block sums + int pos = threadIdx.x; + int n = 1; + while (n < PREFIX_NUM_BLOCKS) + { + int ppos = pos - n; + uint t0 = ((pos < PREFIX_NUM_BLOCKS) && (ppos >= 0)) ? sRadixSum[SHUFFLE_GRFOFFSET + ppos] : 0; + __syncthreads(); + if (pos < PREFIX_NUM_BLOCKS) + sRadixSum[SHUFFLE_GRFOFFSET + pos] += t0; + __syncthreads(); + n *= 2; + } + + // Read radix count data and add appropriate block offset + // for each radix at the memory location for this thread + // (where the other threads in the block will be reading + // as well, hence the large stride). + // There is one counter box per radix group per radix + // per block (4*256*3) + // We use 64 threads to read the 4 radix groups set of radices + // for the block. + int row = threadIdx.x / RADIXGROUPS; + int column = threadIdx.x % RADIXGROUPS; + int spos = row * RADIXGROUPS + column; + int dpos = row * TOTALRADIXGROUPS + column + blockIdx.x * RADIXGROUPS; + while (spos < SHUFFLE_GRFOFFSET) + { + sRadixSum[spos] = dRadixSum[dpos] + sRadixSum[SHUFFLE_GRFOFFSET + dpos / (TOTALRADIXGROUPS * RADICES / PREFIX_NUM_BLOCKS)]; + spos += NUM_THREADS_PER_BLOCK; + dpos += (NUM_THREADS_PER_BLOCK / RADIXGROUPS) * TOTALRADIXGROUPS; + } + __syncthreads(); + + //int pos; + // Shuffle data + // Each of the subbins for a block should be filled via the counters, properly interleaved + // Then, as we now iterate over each data value, we increment the subbins (each thread in the + // radix group in turn to avoid miss writes due to conflicts) and set locations correctly. + uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; + int tmod = threadIdx.x % RADIXTHREADS; + int tpos = threadIdx.x / RADIXTHREADS; + + pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; + uint end = pos + element_fraction; //(blockIdx.x * RADIXGROUPS + tpos + 1) * element_fraction; + pos += tmod; + + __syncthreads(); + + while (pos < end ) + { + KeyValuePair kvp; +#if 1 // old load + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + { + kvp = pSrc[pos]; + } + else + kvp.key = 0; + +#else // casting to float2 to get it to combine loads + int2 kvpf2; + + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + { + // kvp = pSrc[pos]; + kvpf2 = ((int2*)pSrc)[pos]; + // printf("kvp: %f %f kvpf2: %f %f\n", kvp.key, kvp.value, kvpf2.x, kvpf2.y); + } + else + //kvp.key = 0; + kvpf2.x = 0; + + kvp.key = kvpf2.x; + kvp.value = kvpf2.y; +#endif + + uint index; + + // Calculate position of radix counter to increment + uint p = ((kvp.key >> shift) & RADIXMASK) * RADIXGROUPS; + + // Move data, keeping counts updated. + // Increment radix counters, relying on hexadecathread + // warp to prevent this code from stepping all over itself. + uint ppos = p + tpos; + if (tmod == 0 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 1 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 2 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 3 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 4 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 5 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 6 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 7 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 8 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 9 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 10 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 11 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 12 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 13 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 14 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 15 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + + pos += RADIXTHREADS; + } + + __syncthreads(); +} + +#endif // #ifndef _RADIXSORT_KERNEL_H_ diff --git a/Extras/ConvexDecomposition/ConvexBuilder.h b/Extras/ConvexDecomposition/ConvexBuilder.h index fa974374e..b1d98cb67 100644 --- a/Extras/ConvexDecomposition/ConvexBuilder.h +++ b/Extras/ConvexDecomposition/ConvexBuilder.h @@ -1,112 +1,112 @@ -#ifndef CONVEX_BUILDER_H -#define CONVEX_BUILDER_H - -/*---------------------------------------------------------------------- -Copyright (c) 2004 Open Dynamics Framework Group -www.physicstools.org -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided -that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions -and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -Neither the name of the Open Dynamics Framework Group nor the names of its contributors may -be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -#include "ConvexDecomposition.h" -#include "vlookup.h" -#include "LinearMath/btAlignedObjectArray.h" - -using namespace ConvexDecomposition; - - -class CHull -{ -public: - CHull(const ConvexResult &result); - - ~CHull(void); - - bool overlap(const CHull &h) const; - - float mMin[3]; - float mMax[3]; - float mVolume; - float mDiagonal; // long edge.. - ConvexResult *mResult; -}; - -// Usage: std::sort( list.begin(), list.end(), StringSortRef() ); -class CHullSort -{ -public: - - inline bool operator()(const CHull *a,const CHull *b) const - { - return a->mVolume < b->mVolume; - } -}; - - -typedef btAlignedObjectArray< CHull * > CHullVector; - - - -class ConvexBuilder : public ConvexDecompInterface -{ -public: - ConvexBuilder(ConvexDecompInterface *callback); - - virtual ~ConvexBuilder(void); - - bool isDuplicate(unsigned int i1,unsigned int i2,unsigned int i3, - unsigned int ci1,unsigned int ci2,unsigned int ci3); - - void getMesh(const ConvexResult &cr,VertexLookup vc,UintVector &indices); - - CHull * canMerge(CHull *a,CHull *b); - - bool combineHulls(void); - - unsigned int process(const DecompDesc &desc); - - virtual void ConvexDebugTri(const float *p1,const float *p2,const float *p3,unsigned int color); - - virtual void ConvexDebugOBB(const float *sides, const float *matrix,unsigned int color); - virtual void ConvexDebugPoint(const float *p,float dist,unsigned int color); - - virtual void ConvexDebugBound(const float *bmin,const float *bmax,unsigned int color); - - virtual void ConvexDecompResult(ConvexResult &result); - - void sortChulls(CHullVector &hulls); - - CHullVector mChulls; - ConvexDecompInterface *mCallback; -}; - -#endif //CONVEX_BUILDER_H - +#ifndef CONVEX_BUILDER_H +#define CONVEX_BUILDER_H + +/*---------------------------------------------------------------------- +Copyright (c) 2004 Open Dynamics Framework Group +www.physicstools.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided +that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions +and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +Neither the name of the Open Dynamics Framework Group nor the names of its contributors may +be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +#include "ConvexDecomposition.h" +#include "vlookup.h" +#include "LinearMath/btAlignedObjectArray.h" + +using namespace ConvexDecomposition; + + +class CHull +{ +public: + CHull(const ConvexResult &result); + + ~CHull(void); + + bool overlap(const CHull &h) const; + + float mMin[3]; + float mMax[3]; + float mVolume; + float mDiagonal; // long edge.. + ConvexResult *mResult; +}; + +// Usage: std::sort( list.begin(), list.end(), StringSortRef() ); +class CHullSort +{ +public: + + inline bool operator()(const CHull *a,const CHull *b) const + { + return a->mVolume < b->mVolume; + } +}; + + +typedef btAlignedObjectArray< CHull * > CHullVector; + + + +class ConvexBuilder : public ConvexDecompInterface +{ +public: + ConvexBuilder(ConvexDecompInterface *callback); + + virtual ~ConvexBuilder(void); + + bool isDuplicate(unsigned int i1,unsigned int i2,unsigned int i3, + unsigned int ci1,unsigned int ci2,unsigned int ci3); + + void getMesh(const ConvexResult &cr,VertexLookup vc,UintVector &indices); + + CHull * canMerge(CHull *a,CHull *b); + + bool combineHulls(void); + + unsigned int process(const DecompDesc &desc); + + virtual void ConvexDebugTri(const float *p1,const float *p2,const float *p3,unsigned int color); + + virtual void ConvexDebugOBB(const float *sides, const float *matrix,unsigned int color); + virtual void ConvexDebugPoint(const float *p,float dist,unsigned int color); + + virtual void ConvexDebugBound(const float *bmin,const float *bmax,unsigned int color); + + virtual void ConvexDecompResult(ConvexResult &result); + + void sortChulls(CHullVector &hulls); + + CHullVector mChulls; + ConvexDecompInterface *mCallback; +}; + +#endif //CONVEX_BUILDER_H + diff --git a/Extras/ConvexDecomposition/ConvexDecomposition.cpp b/Extras/ConvexDecomposition/ConvexDecomposition.cpp index a0b5f0efe..572d25f5b 100644 --- a/Extras/ConvexDecomposition/ConvexDecomposition.cpp +++ b/Extras/ConvexDecomposition/ConvexDecomposition.cpp @@ -1,375 +1,375 @@ -#include "float_math.h" - -#include -#include -#include -#include - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -#include "ConvexDecomposition.h" -#include "cd_vector.h" -#include "cd_hull.h" -#include "bestfit.h" -#include "planetri.h" -#include "vlookup.h" -#include "splitplane.h" -#include "meshvolume.h" -#include "concavity.h" -#include "bestfitobb.h" -#include "float_math.h" -#include "fitsphere.h" - -#define SHOW_MESH 0 -#define MAKE_MESH 1 - - -using namespace ConvexDecomposition; - - - -namespace ConvexDecomposition -{ - -class FaceTri -{ -public: - FaceTri(void) { }; - FaceTri(const float *vertices,unsigned int i1,unsigned int i2,unsigned int i3) - { - mP1.Set( &vertices[i1*3] ); - mP2.Set( &vertices[i2*3] ); - mP3.Set( &vertices[i3*3] ); - } - - Vector3d mP1; - Vector3d mP2; - Vector3d mP3; - Vector3d mNormal; - -}; - - -void addTri(VertexLookup vl,UintVector &list,const Vector3d &p1,const Vector3d &p2,const Vector3d &p3) -{ - unsigned int i1 = Vl_getIndex(vl, p1.Ptr() ); - unsigned int i2 = Vl_getIndex(vl, p2.Ptr() ); - unsigned int i3 = Vl_getIndex(vl, p3.Ptr() ); - - // do *not* process degenerate triangles! - - if ( i1 != i2 && i1 != i3 && i2 != i3 ) - { - list.push_back(i1); - list.push_back(i2); - list.push_back(i3); - } -} - - -void calcConvexDecomposition(unsigned int vcount, - const float *vertices, - unsigned int tcount, - const unsigned int *indices, - ConvexDecompInterface *callback, - float masterVolume, - unsigned int depth) - -{ - - float plane[4]; - - bool split = false; - - - if ( depth < MAXDEPTH ) - { - - float volume; - float c = computeConcavity( vcount, vertices, tcount, indices, callback, plane, volume ); - - if ( depth == 0 ) - { - masterVolume = volume; - } - - float percent = (c*100.0f)/masterVolume; - - if ( percent > CONCAVE_PERCENT ) // if great than 5% of the total volume is concave, go ahead and keep splitting. - { - split = true; - } - - } - - if ( depth >= MAXDEPTH || !split ) - { - -#if 1 - - HullResult result; - HullLibrary hl; - HullDesc desc; - - desc.SetHullFlag(QF_TRIANGLES); - - desc.mVcount = vcount; - desc.mVertices = vertices; - desc.mVertexStride = sizeof(float)*3; - - HullError ret = hl.CreateConvexHull(desc,result); - - if ( ret == QE_OK ) - { - - ConvexResult r(result.mNumOutputVertices, result.mOutputVertices, result.mNumFaces, result.mIndices); - - - callback->ConvexDecompResult(r); - } - - -#else - - static unsigned int colors[8] = - { - 0xFF0000, - 0x00FF00, - 0x0000FF, - 0xFFFF00, - 0x00FFFF, - 0xFF00FF, - 0xFFFFFF, - 0xFF8040 - }; - - static int count = 0; - - count++; - - if ( count == 8 ) count = 0; - - assert( count >= 0 && count < 8 ); - - unsigned int color = colors[count]; - - const unsigned int *source = indices; - - for (unsigned int i=0; iConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(), t.mP3.Ptr(), color ); - - } -#endif - - hl.ReleaseResult (result); - return; - - } - - UintVector ifront; - UintVector iback; - - VertexLookup vfront = Vl_createVertexLookup(); - VertexLookup vback = Vl_createVertexLookup(); - - - bool showmesh = false; - #if SHOW_MESH - showmesh = true; - #endif - - if ( 0 ) - { - showmesh = true; - for (float x=-1; x<1; x+=0.10f) - { - for (float y=0; y<1; y+=0.10f) - { - for (float z=-1; z<1; z+=0.04f) - { - float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; - Vector3d p(x,y,z); - if ( d >= 0 ) - callback->ConvexDebugPoint(p.Ptr(), 0.02f, 0x00FF00); - else - callback->ConvexDebugPoint(p.Ptr(), 0.02f, 0xFF0000); - } - } - } - } - - if ( 1 ) - { - // ok..now we are going to 'split' all of the input triangles against this plane! - const unsigned int *source = indices; - for (unsigned int i=0; i 4 || bcount > 4 ) - { - result = planeTriIntersection(plane,t.mP1.Ptr(),sizeof(Vector3d),0.00001f,front[0].Ptr(),fcount,back[0].Ptr(),bcount ); - } - - switch ( result ) - { - case PTR_FRONT: - - assert( fcount == 3 ); - - if ( showmesh ) - callback->ConvexDebugTri( front[0].Ptr(), front[1].Ptr(), front[2].Ptr(), 0x00FF00 ); - - #if MAKE_MESH - - addTri( vfront, ifront, front[0], front[1], front[2] ); - - - #endif - - break; - case PTR_BACK: - assert( bcount == 3 ); - - if ( showmesh ) - callback->ConvexDebugTri( back[0].Ptr(), back[1].Ptr(), back[2].Ptr(), 0xFFFF00 ); - - #if MAKE_MESH - - addTri( vback, iback, back[0], back[1], back[2] ); - - #endif - - break; - case PTR_SPLIT: - - assert( fcount >= 3 && fcount <= 4); - assert( bcount >= 3 && bcount <= 4); - - #if MAKE_MESH - - addTri( vfront, ifront, front[0], front[1], front[2] ); - addTri( vback, iback, back[0], back[1], back[2] ); - - - if ( fcount == 4 ) - { - addTri( vfront, ifront, front[0], front[2], front[3] ); - } - - if ( bcount == 4 ) - { - addTri( vback, iback, back[0], back[2], back[3] ); - } - - #endif - - if ( showmesh ) - { - callback->ConvexDebugTri( front[0].Ptr(), front[1].Ptr(), front[2].Ptr(), 0x00D000 ); - callback->ConvexDebugTri( back[0].Ptr(), back[1].Ptr(), back[2].Ptr(), 0xD0D000 ); - - if ( fcount == 4 ) - { - callback->ConvexDebugTri( front[0].Ptr(), front[2].Ptr(), front[3].Ptr(), 0x00D000 ); - } - if ( bcount == 4 ) - { - callback->ConvexDebugTri( back[0].Ptr(), back[2].Ptr(), back[3].Ptr(), 0xD0D000 ); - } - } - - break; - } - } - - // ok... here we recursively call - if ( ifront.size() ) - { - unsigned int vcount = Vl_getVcount(vfront); - const float *vertices = Vl_getVertices(vfront); - unsigned int tcount = ifront.size()/3; - - calcConvexDecomposition(vcount, vertices, tcount, &ifront[0], callback, masterVolume, depth+1); - - } - - ifront.clear(); - - Vl_releaseVertexLookup(vfront); - - if ( iback.size() ) - { - unsigned int vcount = Vl_getVcount(vback); - const float *vertices = Vl_getVertices(vback); - unsigned int tcount = iback.size()/3; - - calcConvexDecomposition(vcount, vertices, tcount, &iback[0], callback, masterVolume, depth+1); - - } - - iback.clear(); - Vl_releaseVertexLookup(vback); - - } -} - - - - -} +#include "float_math.h" + +#include +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "ConvexDecomposition.h" +#include "cd_vector.h" +#include "cd_hull.h" +#include "bestfit.h" +#include "planetri.h" +#include "vlookup.h" +#include "splitplane.h" +#include "meshvolume.h" +#include "concavity.h" +#include "bestfitobb.h" +#include "float_math.h" +#include "fitsphere.h" + +#define SHOW_MESH 0 +#define MAKE_MESH 1 + + +using namespace ConvexDecomposition; + + + +namespace ConvexDecomposition +{ + +class FaceTri +{ +public: + FaceTri(void) { }; + FaceTri(const float *vertices,unsigned int i1,unsigned int i2,unsigned int i3) + { + mP1.Set( &vertices[i1*3] ); + mP2.Set( &vertices[i2*3] ); + mP3.Set( &vertices[i3*3] ); + } + + Vector3d mP1; + Vector3d mP2; + Vector3d mP3; + Vector3d mNormal; + +}; + + +void addTri(VertexLookup vl,UintVector &list,const Vector3d &p1,const Vector3d &p2,const Vector3d &p3) +{ + unsigned int i1 = Vl_getIndex(vl, p1.Ptr() ); + unsigned int i2 = Vl_getIndex(vl, p2.Ptr() ); + unsigned int i3 = Vl_getIndex(vl, p3.Ptr() ); + + // do *not* process degenerate triangles! + + if ( i1 != i2 && i1 != i3 && i2 != i3 ) + { + list.push_back(i1); + list.push_back(i2); + list.push_back(i3); + } +} + + +void calcConvexDecomposition(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float masterVolume, + unsigned int depth) + +{ + + float plane[4]; + + bool split = false; + + + if ( depth < MAXDEPTH ) + { + + float volume; + float c = computeConcavity( vcount, vertices, tcount, indices, callback, plane, volume ); + + if ( depth == 0 ) + { + masterVolume = volume; + } + + float percent = (c*100.0f)/masterVolume; + + if ( percent > CONCAVE_PERCENT ) // if great than 5% of the total volume is concave, go ahead and keep splitting. + { + split = true; + } + + } + + if ( depth >= MAXDEPTH || !split ) + { + +#if 1 + + HullResult result; + HullLibrary hl; + HullDesc desc; + + desc.SetHullFlag(QF_TRIANGLES); + + desc.mVcount = vcount; + desc.mVertices = vertices; + desc.mVertexStride = sizeof(float)*3; + + HullError ret = hl.CreateConvexHull(desc,result); + + if ( ret == QE_OK ) + { + + ConvexResult r(result.mNumOutputVertices, result.mOutputVertices, result.mNumFaces, result.mIndices); + + + callback->ConvexDecompResult(r); + } + + +#else + + static unsigned int colors[8] = + { + 0xFF0000, + 0x00FF00, + 0x0000FF, + 0xFFFF00, + 0x00FFFF, + 0xFF00FF, + 0xFFFFFF, + 0xFF8040 + }; + + static int count = 0; + + count++; + + if ( count == 8 ) count = 0; + + assert( count >= 0 && count < 8 ); + + unsigned int color = colors[count]; + + const unsigned int *source = indices; + + for (unsigned int i=0; iConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(), t.mP3.Ptr(), color ); + + } +#endif + + hl.ReleaseResult (result); + return; + + } + + UintVector ifront; + UintVector iback; + + VertexLookup vfront = Vl_createVertexLookup(); + VertexLookup vback = Vl_createVertexLookup(); + + + bool showmesh = false; + #if SHOW_MESH + showmesh = true; + #endif + + if ( 0 ) + { + showmesh = true; + for (float x=-1; x<1; x+=0.10f) + { + for (float y=0; y<1; y+=0.10f) + { + for (float z=-1; z<1; z+=0.04f) + { + float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; + Vector3d p(x,y,z); + if ( d >= 0 ) + callback->ConvexDebugPoint(p.Ptr(), 0.02f, 0x00FF00); + else + callback->ConvexDebugPoint(p.Ptr(), 0.02f, 0xFF0000); + } + } + } + } + + if ( 1 ) + { + // ok..now we are going to 'split' all of the input triangles against this plane! + const unsigned int *source = indices; + for (unsigned int i=0; i 4 || bcount > 4 ) + { + result = planeTriIntersection(plane,t.mP1.Ptr(),sizeof(Vector3d),0.00001f,front[0].Ptr(),fcount,back[0].Ptr(),bcount ); + } + + switch ( result ) + { + case PTR_FRONT: + + assert( fcount == 3 ); + + if ( showmesh ) + callback->ConvexDebugTri( front[0].Ptr(), front[1].Ptr(), front[2].Ptr(), 0x00FF00 ); + + #if MAKE_MESH + + addTri( vfront, ifront, front[0], front[1], front[2] ); + + + #endif + + break; + case PTR_BACK: + assert( bcount == 3 ); + + if ( showmesh ) + callback->ConvexDebugTri( back[0].Ptr(), back[1].Ptr(), back[2].Ptr(), 0xFFFF00 ); + + #if MAKE_MESH + + addTri( vback, iback, back[0], back[1], back[2] ); + + #endif + + break; + case PTR_SPLIT: + + assert( fcount >= 3 && fcount <= 4); + assert( bcount >= 3 && bcount <= 4); + + #if MAKE_MESH + + addTri( vfront, ifront, front[0], front[1], front[2] ); + addTri( vback, iback, back[0], back[1], back[2] ); + + + if ( fcount == 4 ) + { + addTri( vfront, ifront, front[0], front[2], front[3] ); + } + + if ( bcount == 4 ) + { + addTri( vback, iback, back[0], back[2], back[3] ); + } + + #endif + + if ( showmesh ) + { + callback->ConvexDebugTri( front[0].Ptr(), front[1].Ptr(), front[2].Ptr(), 0x00D000 ); + callback->ConvexDebugTri( back[0].Ptr(), back[1].Ptr(), back[2].Ptr(), 0xD0D000 ); + + if ( fcount == 4 ) + { + callback->ConvexDebugTri( front[0].Ptr(), front[2].Ptr(), front[3].Ptr(), 0x00D000 ); + } + if ( bcount == 4 ) + { + callback->ConvexDebugTri( back[0].Ptr(), back[2].Ptr(), back[3].Ptr(), 0xD0D000 ); + } + } + + break; + } + } + + // ok... here we recursively call + if ( ifront.size() ) + { + unsigned int vcount = Vl_getVcount(vfront); + const float *vertices = Vl_getVertices(vfront); + unsigned int tcount = ifront.size()/3; + + calcConvexDecomposition(vcount, vertices, tcount, &ifront[0], callback, masterVolume, depth+1); + + } + + ifront.clear(); + + Vl_releaseVertexLookup(vfront); + + if ( iback.size() ) + { + unsigned int vcount = Vl_getVcount(vback); + const float *vertices = Vl_getVertices(vback); + unsigned int tcount = iback.size()/3; + + calcConvexDecomposition(vcount, vertices, tcount, &iback[0], callback, masterVolume, depth+1); + + } + + iback.clear(); + Vl_releaseVertexLookup(vback); + + } +} + + + + +} diff --git a/Extras/ConvexDecomposition/bestfit.cpp b/Extras/ConvexDecomposition/bestfit.cpp index 8c70cd19d..e6469f6fb 100644 --- a/Extras/ConvexDecomposition/bestfit.cpp +++ b/Extras/ConvexDecomposition/bestfit.cpp @@ -1,466 +1,466 @@ -#include "float_math.h" -#include -#include -#include -#include -#include - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// -// Geometric Tools, Inc. -// http://www.geometrictools.com -// Copyright (c) 1998-2006. All Rights Reserved -// -// The Wild Magic Library (WM3) source code is supplied under the terms of -// the license agreement -// http://www.geometrictools.com/License/WildMagic3License.pdf -// and may not be copied or disclosed except in accordance with the terms -// of that agreement. - -#include "bestfit.h" - -namespace BestFit -{ - -class Vec3 -{ -public: - Vec3(void) { }; - Vec3(float _x,float _y,float _z) { x = _x; y = _y; z = _z; }; - - - float dot(const Vec3 &v) - { - return x*v.x + y*v.y + z*v.z; // the dot product - } - - float x; - float y; - float z; -}; - - -class Eigen -{ -public: - - - void DecrSortEigenStuff(void) - { - Tridiagonal(); //diagonalize the matrix. - QLAlgorithm(); // - DecreasingSort(); - GuaranteeRotation(); - } - - void Tridiagonal(void) - { - float fM00 = mElement[0][0]; - float fM01 = mElement[0][1]; - float fM02 = mElement[0][2]; - float fM11 = mElement[1][1]; - float fM12 = mElement[1][2]; - float fM22 = mElement[2][2]; - - m_afDiag[0] = fM00; - m_afSubd[2] = 0; - if (fM02 != (float)0.0) - { - float fLength = sqrtf(fM01*fM01+fM02*fM02); - float fInvLength = ((float)1.0)/fLength; - fM01 *= fInvLength; - fM02 *= fInvLength; - float fQ = ((float)2.0)*fM01*fM12+fM02*(fM22-fM11); - m_afDiag[1] = fM11+fM02*fQ; - m_afDiag[2] = fM22-fM02*fQ; - m_afSubd[0] = fLength; - m_afSubd[1] = fM12-fM01*fQ; - mElement[0][0] = (float)1.0; - mElement[0][1] = (float)0.0; - mElement[0][2] = (float)0.0; - mElement[1][0] = (float)0.0; - mElement[1][1] = fM01; - mElement[1][2] = fM02; - mElement[2][0] = (float)0.0; - mElement[2][1] = fM02; - mElement[2][2] = -fM01; - m_bIsRotation = false; - } - else - { - m_afDiag[1] = fM11; - m_afDiag[2] = fM22; - m_afSubd[0] = fM01; - m_afSubd[1] = fM12; - mElement[0][0] = (float)1.0; - mElement[0][1] = (float)0.0; - mElement[0][2] = (float)0.0; - mElement[1][0] = (float)0.0; - mElement[1][1] = (float)1.0; - mElement[1][2] = (float)0.0; - mElement[2][0] = (float)0.0; - mElement[2][1] = (float)0.0; - mElement[2][2] = (float)1.0; - m_bIsRotation = true; - } - } - - bool QLAlgorithm(void) - { - const int iMaxIter = 32; - - for (int i0 = 0; i0 <3; i0++) - { - int i1; - for (i1 = 0; i1 < iMaxIter; i1++) - { - int i2; - for (i2 = i0; i2 <= (3-2); i2++) - { - float fTmp = fabsf(m_afDiag[i2]) + fabsf(m_afDiag[i2+1]); - if ( fabsf(m_afSubd[i2]) + fTmp == fTmp ) - break; - } - if (i2 == i0) - { - break; - } - - float fG = (m_afDiag[i0+1] - m_afDiag[i0])/(((float)2.0) * m_afSubd[i0]); - float fR = sqrtf(fG*fG+(float)1.0); - if (fG < (float)0.0) - { - fG = m_afDiag[i2]-m_afDiag[i0]+m_afSubd[i0]/(fG-fR); - } - else - { - fG = m_afDiag[i2]-m_afDiag[i0]+m_afSubd[i0]/(fG+fR); - } - float fSin = (float)1.0, fCos = (float)1.0, fP = (float)0.0; - for (int i3 = i2-1; i3 >= i0; i3--) - { - float fF = fSin*m_afSubd[i3]; - float fB = fCos*m_afSubd[i3]; - if (fabsf(fF) >= fabsf(fG)) - { - fCos = fG/fF; - fR = sqrtf(fCos*fCos+(float)1.0); - m_afSubd[i3+1] = fF*fR; - fSin = ((float)1.0)/fR; - fCos *= fSin; - } - else - { - fSin = fF/fG; - fR = sqrtf(fSin*fSin+(float)1.0); - m_afSubd[i3+1] = fG*fR; - fCos = ((float)1.0)/fR; - fSin *= fCos; - } - fG = m_afDiag[i3+1]-fP; - fR = (m_afDiag[i3]-fG)*fSin+((float)2.0)*fB*fCos; - fP = fSin*fR; - m_afDiag[i3+1] = fG+fP; - fG = fCos*fR-fB; - for (int i4 = 0; i4 < 3; i4++) - { - fF = mElement[i4][i3+1]; - mElement[i4][i3+1] = fSin*mElement[i4][i3]+fCos*fF; - mElement[i4][i3] = fCos*mElement[i4][i3]-fSin*fF; - } - } - m_afDiag[i0] -= fP; - m_afSubd[i0] = fG; - m_afSubd[i2] = (float)0.0; - } - if (i1 == iMaxIter) - { - return false; - } - } - return true; - } - - void DecreasingSort(void) - { - //sort eigenvalues in decreasing order, e[0] >= ... >= e[iSize-1] - for (int i0 = 0, i1; i0 <= 3-2; i0++) - { - // locate maximum eigenvalue - i1 = i0; - float fMax = m_afDiag[i1]; - int i2; - for (i2 = i0+1; i2 < 3; i2++) - { - if (m_afDiag[i2] > fMax) - { - i1 = i2; - fMax = m_afDiag[i1]; - } - } - - if (i1 != i0) - { - // swap eigenvalues - m_afDiag[i1] = m_afDiag[i0]; - m_afDiag[i0] = fMax; - // swap eigenvectors - for (i2 = 0; i2 < 3; i2++) - { - float fTmp = mElement[i2][i0]; - mElement[i2][i0] = mElement[i2][i1]; - mElement[i2][i1] = fTmp; - m_bIsRotation = !m_bIsRotation; - } - } - } - } - - - void GuaranteeRotation(void) - { - if (!m_bIsRotation) - { - // change sign on the first column - for (int iRow = 0; iRow <3; iRow++) - { - mElement[iRow][0] = -mElement[iRow][0]; - } - } - } - - float mElement[3][3]; - float m_afDiag[3]; - float m_afSubd[3]; - bool m_bIsRotation; -}; - -} - - -using namespace BestFit; - - -bool getBestFitPlane(unsigned int vcount, - const float *points, - unsigned int vstride, - const float *weights, - unsigned int wstride, - float *plane) -{ - bool ret = false; - - Vec3 kOrigin(0,0,0); - - float wtotal = 0; - - if ( 1 ) - { - const char *source = (const char *) points; - const char *wsource = (const char *) weights; - - for (unsigned int i=0; i bmax[0] ) bmax[0] = p[0]; - if ( p[1] > bmax[1] ) bmax[1] = p[1]; - if ( p[2] > bmax[2] ) bmax[2] = p[2]; - - } - - float dx = bmax[0] - bmin[0]; - float dy = bmax[1] - bmin[1]; - float dz = bmax[2] - bmin[2]; - - return sqrtf( dx*dx + dy*dy + dz*dz ); - -} - - -bool overlapAABB(const float *bmin1,const float *bmax1,const float *bmin2,const float *bmax2) // return true if the two AABB's overlap. -{ - if ( bmax2[0] < bmin1[0] ) return false; // if the maximum is less than our minimum on any axis - if ( bmax2[1] < bmin1[1] ) return false; - if ( bmax2[2] < bmin1[2] ) return false; - - if ( bmin2[0] > bmax1[0] ) return false; // if the minimum is greater than our maximum on any axis - if ( bmin2[1] > bmax1[1] ) return false; // if the minimum is greater than our maximum on any axis - if ( bmin2[2] > bmax1[2] ) return false; // if the minimum is greater than our maximum on any axis - - - return true; // the extents overlap -} - - +#include "float_math.h" +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// +// Geometric Tools, Inc. +// http://www.geometrictools.com +// Copyright (c) 1998-2006. All Rights Reserved +// +// The Wild Magic Library (WM3) source code is supplied under the terms of +// the license agreement +// http://www.geometrictools.com/License/WildMagic3License.pdf +// and may not be copied or disclosed except in accordance with the terms +// of that agreement. + +#include "bestfit.h" + +namespace BestFit +{ + +class Vec3 +{ +public: + Vec3(void) { }; + Vec3(float _x,float _y,float _z) { x = _x; y = _y; z = _z; }; + + + float dot(const Vec3 &v) + { + return x*v.x + y*v.y + z*v.z; // the dot product + } + + float x; + float y; + float z; +}; + + +class Eigen +{ +public: + + + void DecrSortEigenStuff(void) + { + Tridiagonal(); //diagonalize the matrix. + QLAlgorithm(); // + DecreasingSort(); + GuaranteeRotation(); + } + + void Tridiagonal(void) + { + float fM00 = mElement[0][0]; + float fM01 = mElement[0][1]; + float fM02 = mElement[0][2]; + float fM11 = mElement[1][1]; + float fM12 = mElement[1][2]; + float fM22 = mElement[2][2]; + + m_afDiag[0] = fM00; + m_afSubd[2] = 0; + if (fM02 != (float)0.0) + { + float fLength = sqrtf(fM01*fM01+fM02*fM02); + float fInvLength = ((float)1.0)/fLength; + fM01 *= fInvLength; + fM02 *= fInvLength; + float fQ = ((float)2.0)*fM01*fM12+fM02*(fM22-fM11); + m_afDiag[1] = fM11+fM02*fQ; + m_afDiag[2] = fM22-fM02*fQ; + m_afSubd[0] = fLength; + m_afSubd[1] = fM12-fM01*fQ; + mElement[0][0] = (float)1.0; + mElement[0][1] = (float)0.0; + mElement[0][2] = (float)0.0; + mElement[1][0] = (float)0.0; + mElement[1][1] = fM01; + mElement[1][2] = fM02; + mElement[2][0] = (float)0.0; + mElement[2][1] = fM02; + mElement[2][2] = -fM01; + m_bIsRotation = false; + } + else + { + m_afDiag[1] = fM11; + m_afDiag[2] = fM22; + m_afSubd[0] = fM01; + m_afSubd[1] = fM12; + mElement[0][0] = (float)1.0; + mElement[0][1] = (float)0.0; + mElement[0][2] = (float)0.0; + mElement[1][0] = (float)0.0; + mElement[1][1] = (float)1.0; + mElement[1][2] = (float)0.0; + mElement[2][0] = (float)0.0; + mElement[2][1] = (float)0.0; + mElement[2][2] = (float)1.0; + m_bIsRotation = true; + } + } + + bool QLAlgorithm(void) + { + const int iMaxIter = 32; + + for (int i0 = 0; i0 <3; i0++) + { + int i1; + for (i1 = 0; i1 < iMaxIter; i1++) + { + int i2; + for (i2 = i0; i2 <= (3-2); i2++) + { + float fTmp = fabsf(m_afDiag[i2]) + fabsf(m_afDiag[i2+1]); + if ( fabsf(m_afSubd[i2]) + fTmp == fTmp ) + break; + } + if (i2 == i0) + { + break; + } + + float fG = (m_afDiag[i0+1] - m_afDiag[i0])/(((float)2.0) * m_afSubd[i0]); + float fR = sqrtf(fG*fG+(float)1.0); + if (fG < (float)0.0) + { + fG = m_afDiag[i2]-m_afDiag[i0]+m_afSubd[i0]/(fG-fR); + } + else + { + fG = m_afDiag[i2]-m_afDiag[i0]+m_afSubd[i0]/(fG+fR); + } + float fSin = (float)1.0, fCos = (float)1.0, fP = (float)0.0; + for (int i3 = i2-1; i3 >= i0; i3--) + { + float fF = fSin*m_afSubd[i3]; + float fB = fCos*m_afSubd[i3]; + if (fabsf(fF) >= fabsf(fG)) + { + fCos = fG/fF; + fR = sqrtf(fCos*fCos+(float)1.0); + m_afSubd[i3+1] = fF*fR; + fSin = ((float)1.0)/fR; + fCos *= fSin; + } + else + { + fSin = fF/fG; + fR = sqrtf(fSin*fSin+(float)1.0); + m_afSubd[i3+1] = fG*fR; + fCos = ((float)1.0)/fR; + fSin *= fCos; + } + fG = m_afDiag[i3+1]-fP; + fR = (m_afDiag[i3]-fG)*fSin+((float)2.0)*fB*fCos; + fP = fSin*fR; + m_afDiag[i3+1] = fG+fP; + fG = fCos*fR-fB; + for (int i4 = 0; i4 < 3; i4++) + { + fF = mElement[i4][i3+1]; + mElement[i4][i3+1] = fSin*mElement[i4][i3]+fCos*fF; + mElement[i4][i3] = fCos*mElement[i4][i3]-fSin*fF; + } + } + m_afDiag[i0] -= fP; + m_afSubd[i0] = fG; + m_afSubd[i2] = (float)0.0; + } + if (i1 == iMaxIter) + { + return false; + } + } + return true; + } + + void DecreasingSort(void) + { + //sort eigenvalues in decreasing order, e[0] >= ... >= e[iSize-1] + for (int i0 = 0, i1; i0 <= 3-2; i0++) + { + // locate maximum eigenvalue + i1 = i0; + float fMax = m_afDiag[i1]; + int i2; + for (i2 = i0+1; i2 < 3; i2++) + { + if (m_afDiag[i2] > fMax) + { + i1 = i2; + fMax = m_afDiag[i1]; + } + } + + if (i1 != i0) + { + // swap eigenvalues + m_afDiag[i1] = m_afDiag[i0]; + m_afDiag[i0] = fMax; + // swap eigenvectors + for (i2 = 0; i2 < 3; i2++) + { + float fTmp = mElement[i2][i0]; + mElement[i2][i0] = mElement[i2][i1]; + mElement[i2][i1] = fTmp; + m_bIsRotation = !m_bIsRotation; + } + } + } + } + + + void GuaranteeRotation(void) + { + if (!m_bIsRotation) + { + // change sign on the first column + for (int iRow = 0; iRow <3; iRow++) + { + mElement[iRow][0] = -mElement[iRow][0]; + } + } + } + + float mElement[3][3]; + float m_afDiag[3]; + float m_afSubd[3]; + bool m_bIsRotation; +}; + +} + + +using namespace BestFit; + + +bool getBestFitPlane(unsigned int vcount, + const float *points, + unsigned int vstride, + const float *weights, + unsigned int wstride, + float *plane) +{ + bool ret = false; + + Vec3 kOrigin(0,0,0); + + float wtotal = 0; + + if ( 1 ) + { + const char *source = (const char *) points; + const char *wsource = (const char *) weights; + + for (unsigned int i=0; i bmax[0] ) bmax[0] = p[0]; + if ( p[1] > bmax[1] ) bmax[1] = p[1]; + if ( p[2] > bmax[2] ) bmax[2] = p[2]; + + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + return sqrtf( dx*dx + dy*dy + dz*dz ); + +} + + +bool overlapAABB(const float *bmin1,const float *bmax1,const float *bmin2,const float *bmax2) // return true if the two AABB's overlap. +{ + if ( bmax2[0] < bmin1[0] ) return false; // if the maximum is less than our minimum on any axis + if ( bmax2[1] < bmin1[1] ) return false; + if ( bmax2[2] < bmin1[2] ) return false; + + if ( bmin2[0] > bmax1[0] ) return false; // if the minimum is greater than our maximum on any axis + if ( bmin2[1] > bmax1[1] ) return false; // if the minimum is greater than our maximum on any axis + if ( bmin2[2] > bmax1[2] ) return false; // if the minimum is greater than our maximum on any axis + + + return true; // the extents overlap +} + + diff --git a/Extras/ConvexDecomposition/bestfit.h b/Extras/ConvexDecomposition/bestfit.h index 1597a968b..f2e78e5a6 100644 --- a/Extras/ConvexDecomposition/bestfit.h +++ b/Extras/ConvexDecomposition/bestfit.h @@ -1,65 +1,65 @@ -#ifndef BEST_FIT_H - -#define BEST_FIT_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -// This routine was released in 'snippet' form -// by John W. Ratcliff mailto:jratcliff@infiniplex.net -// on March 22, 2006. -// -// This routine computes the 'best fit' plane equation to -// a set of input data points with an optional per vertex -// weighting component. -// -// The implementation for this was lifted directly from -// David Eberly's Magic Software implementation. - -// computes the best fit plane to a collection of data points. -// returns the plane equation as A,B,C,D format. (Ax+By+Cz+D) - -bool getBestFitPlane(unsigned int vcount, // number of input data points - const float *points, // starting address of points array. - unsigned int vstride, // stride between input points. - const float *weights, // *optional point weighting values. - unsigned int wstride, // weight stride for each vertex. - float *plane); - - -float getBoundingRegion(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax); // returns the diagonal distance -bool overlapAABB(const float *bmin1,const float *bmax1,const float *bmin2,const float *bmax2); // return true if the two AABB's overlap. - -#endif +#ifndef BEST_FIT_H + +#define BEST_FIT_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +// This routine was released in 'snippet' form +// by John W. Ratcliff mailto:jratcliff@infiniplex.net +// on March 22, 2006. +// +// This routine computes the 'best fit' plane equation to +// a set of input data points with an optional per vertex +// weighting component. +// +// The implementation for this was lifted directly from +// David Eberly's Magic Software implementation. + +// computes the best fit plane to a collection of data points. +// returns the plane equation as A,B,C,D format. (Ax+By+Cz+D) + +bool getBestFitPlane(unsigned int vcount, // number of input data points + const float *points, // starting address of points array. + unsigned int vstride, // stride between input points. + const float *weights, // *optional point weighting values. + unsigned int wstride, // weight stride for each vertex. + float *plane); + + +float getBoundingRegion(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax); // returns the diagonal distance +bool overlapAABB(const float *bmin1,const float *bmax1,const float *bmin2,const float *bmax2); // return true if the two AABB's overlap. + +#endif diff --git a/Extras/ConvexDecomposition/bestfitobb.cpp b/Extras/ConvexDecomposition/bestfitobb.cpp index 6b31d1d40..2d60fd045 100644 --- a/Extras/ConvexDecomposition/bestfitobb.cpp +++ b/Extras/ConvexDecomposition/bestfitobb.cpp @@ -1,173 +1,173 @@ -#include "float_math.h" - -#include -#include -#include -#include -#include - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -#include "bestfitobb.h" -#include "float_math.h" - -// computes the OBB for this set of points relative to this transform matrix. -void computeOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,const float *matrix) -{ - const char *src = (const char *) points; - - float bmin[3] = { 1e9, 1e9, 1e9 }; - float bmax[3] = { -1e9, -1e9, -1e9 }; - - for (unsigned int i=0; i bmax[0] ) bmax[0] = t[0]; - if ( t[1] > bmax[1] ) bmax[1] = t[1]; - if ( t[2] > bmax[2] ) bmax[2] = t[2]; - - src+=pstride; - } - - - sides[0] = bmax[0]; - sides[1] = bmax[1]; - sides[2] = bmax[2]; - - if ( fabsf(bmin[0]) > sides[0] ) sides[0] = fabsf(bmin[0]); - if ( fabsf(bmin[1]) > sides[1] ) sides[1] = fabsf(bmin[1]); - if ( fabsf(bmin[2]) > sides[2] ) sides[2] = fabsf(bmin[2]); - - sides[0]*=2.0f; - sides[1]*=2.0f; - sides[2]*=2.0f; - -} - -void computeBestFitOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,float *matrix) -{ - - float bmin[3]; - float bmax[3]; - - fm_getAABB(vcount,points,pstride,bmin,bmax); - - float center[3]; - - center[0] = (bmax[0]-bmin[0])*0.5f + bmin[0]; - center[1] = (bmax[1]-bmin[1])*0.5f + bmin[1]; - center[2] = (bmax[2]-bmin[2])*0.5f + bmin[2]; - - float ax = 0; - float ay = 0; - float az = 0; - - float sweep = 45.0f; // 180 degree sweep on all three axes. - float steps = 8.0f; // 16 steps on each axis. - - float bestVolume = 1e9; - float angle[3]={0.f,0.f,0.f}; - - while ( sweep >= 1 ) - { - - bool found = false; - - float stepsize = sweep / steps; - - for (float x=ax-sweep; x<=ax+sweep; x+=stepsize) - { - for (float y=ay-sweep; y<=ay+sweep; y+=stepsize) - { - for (float z=az-sweep; z<=az+sweep; z+=stepsize) - { - float pmatrix[16]; - - fm_eulerMatrix( x*FM_DEG_TO_RAD, y*FM_DEG_TO_RAD, z*FM_DEG_TO_RAD, pmatrix ); - - pmatrix[3*4+0] = center[0]; - pmatrix[3*4+1] = center[1]; - pmatrix[3*4+2] = center[2]; - - float psides[3]; - - computeOBB( vcount, points, pstride, psides, pmatrix ); - - float volume = psides[0]*psides[1]*psides[2]; // the volume of the cube - - if ( volume <= bestVolume ) - { - bestVolume = volume; - - sides[0] = psides[0]; - sides[1] = psides[1]; - sides[2] = psides[2]; - - angle[0] = ax; - angle[1] = ay; - angle[2] = az; - - memcpy(matrix,pmatrix,sizeof(float)*16); - found = true; // yes, we found an improvement. - } - } - } - } - - if ( found ) - { - - ax = angle[0]; - ay = angle[1]; - az = angle[2]; - - sweep*=0.5f; // sweep 1/2 the distance as the last time. - } - else - { - break; // no improvement, so just - } - - } - -} +#include "float_math.h" + +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "bestfitobb.h" +#include "float_math.h" + +// computes the OBB for this set of points relative to this transform matrix. +void computeOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,const float *matrix) +{ + const char *src = (const char *) points; + + float bmin[3] = { 1e9, 1e9, 1e9 }; + float bmax[3] = { -1e9, -1e9, -1e9 }; + + for (unsigned int i=0; i bmax[0] ) bmax[0] = t[0]; + if ( t[1] > bmax[1] ) bmax[1] = t[1]; + if ( t[2] > bmax[2] ) bmax[2] = t[2]; + + src+=pstride; + } + + + sides[0] = bmax[0]; + sides[1] = bmax[1]; + sides[2] = bmax[2]; + + if ( fabsf(bmin[0]) > sides[0] ) sides[0] = fabsf(bmin[0]); + if ( fabsf(bmin[1]) > sides[1] ) sides[1] = fabsf(bmin[1]); + if ( fabsf(bmin[2]) > sides[2] ) sides[2] = fabsf(bmin[2]); + + sides[0]*=2.0f; + sides[1]*=2.0f; + sides[2]*=2.0f; + +} + +void computeBestFitOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,float *matrix) +{ + + float bmin[3]; + float bmax[3]; + + fm_getAABB(vcount,points,pstride,bmin,bmax); + + float center[3]; + + center[0] = (bmax[0]-bmin[0])*0.5f + bmin[0]; + center[1] = (bmax[1]-bmin[1])*0.5f + bmin[1]; + center[2] = (bmax[2]-bmin[2])*0.5f + bmin[2]; + + float ax = 0; + float ay = 0; + float az = 0; + + float sweep = 45.0f; // 180 degree sweep on all three axes. + float steps = 8.0f; // 16 steps on each axis. + + float bestVolume = 1e9; + float angle[3]={0.f,0.f,0.f}; + + while ( sweep >= 1 ) + { + + bool found = false; + + float stepsize = sweep / steps; + + for (float x=ax-sweep; x<=ax+sweep; x+=stepsize) + { + for (float y=ay-sweep; y<=ay+sweep; y+=stepsize) + { + for (float z=az-sweep; z<=az+sweep; z+=stepsize) + { + float pmatrix[16]; + + fm_eulerMatrix( x*FM_DEG_TO_RAD, y*FM_DEG_TO_RAD, z*FM_DEG_TO_RAD, pmatrix ); + + pmatrix[3*4+0] = center[0]; + pmatrix[3*4+1] = center[1]; + pmatrix[3*4+2] = center[2]; + + float psides[3]; + + computeOBB( vcount, points, pstride, psides, pmatrix ); + + float volume = psides[0]*psides[1]*psides[2]; // the volume of the cube + + if ( volume <= bestVolume ) + { + bestVolume = volume; + + sides[0] = psides[0]; + sides[1] = psides[1]; + sides[2] = psides[2]; + + angle[0] = ax; + angle[1] = ay; + angle[2] = az; + + memcpy(matrix,pmatrix,sizeof(float)*16); + found = true; // yes, we found an improvement. + } + } + } + } + + if ( found ) + { + + ax = angle[0]; + ay = angle[1]; + az = angle[2]; + + sweep*=0.5f; // sweep 1/2 the distance as the last time. + } + else + { + break; // no improvement, so just + } + + } + +} diff --git a/Extras/ConvexDecomposition/bestfitobb.h b/Extras/ConvexDecomposition/bestfitobb.h index 5516718ad..3141f5874 100644 --- a/Extras/ConvexDecomposition/bestfitobb.h +++ b/Extras/ConvexDecomposition/bestfitobb.h @@ -1,43 +1,43 @@ -#ifndef BEST_FIT_OBB_H - -#define BEST_FIT_OBB_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - - -void computeBestFitOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,float *matrix); - -#endif +#ifndef BEST_FIT_OBB_H + +#define BEST_FIT_OBB_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +void computeBestFitOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,float *matrix); + +#endif diff --git a/Extras/ConvexDecomposition/cd_hull.cpp b/Extras/ConvexDecomposition/cd_hull.cpp index 7f1ac971b..b2f6d8b24 100644 --- a/Extras/ConvexDecomposition/cd_hull.cpp +++ b/Extras/ConvexDecomposition/cd_hull.cpp @@ -1,3257 +1,3257 @@ -#include "float_math.h" - -#include -#include -#include -#include -#include -#include - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -#include "cd_hull.h" - -using namespace ConvexDecomposition; - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -#define PI 3.14159264f - -//***************************************************** -//***************************************************** -//********* Stan Melax's vector math template needed -//********* to use his hull building code. -//***************************************************** -//***************************************************** - -#define DEG2RAD (PI / 180.0f) -#define RAD2DEG (180.0f / PI) -#define SQRT_OF_2 (1.4142135f) -#define OFFSET(Class,Member) (((char*) (&(((Class*)NULL)-> Member )))- ((char*)NULL)) - -namespace ConvexDecomposition -{ - - -int argmin(float a[],int n); -float sqr(float a); -float clampf(float a) ; -float Round(float a,float precision); -float Interpolate(const float &f0,const float &f1,float alpha) ; - -template -void Swap(T &a,T &b) -{ - T tmp = a; - a=b; - b=tmp; -} - - - -template -T Max(const T &a,const T &b) -{ - return (a>b)?a:b; -} - -template -T Min(const T &a,const T &b) -{ - return (a=0&&i<2);return ((float*)this)[i];} - const float& operator[](int i) const {assert(i>=0&&i<2);return ((float*)this)[i];} -}; -inline float2 operator-( const float2& a, const float2& b ){return float2(a.x-b.x,a.y-b.y);} -inline float2 operator+( const float2& a, const float2& b ){return float2(a.x+b.x,a.y+b.y);} - -//--------- 3D --------- - -class float3 // 3D -{ - public: - float x,y,z; - float3(){x=0;y=0;z=0;}; - float3(float _x,float _y,float _z){x=_x;y=_y;z=_z;}; - //operator float *() { return &x;}; - float& operator[](int i) {assert(i>=0&&i<3);return ((float*)this)[i];} - const float& operator[](int i) const {assert(i>=0&&i<3);return ((float*)this)[i];} -# ifdef PLUGIN_3DSMAX - float3(const Point3 &p):x(p.x),y(p.y),z(p.z){} - operator Point3(){return *((Point3*)this);} -# endif -}; - - -float3& operator+=( float3 &a, const float3& b ); -float3& operator-=( float3 &a ,const float3& b ); -float3& operator*=( float3 &v ,const float s ); -float3& operator/=( float3 &v, const float s ); - -float magnitude( const float3& v ); -float3 normalize( const float3& v ); -float3 safenormalize(const float3 &v); -float3 vabs(const float3 &v); -float3 operator+( const float3& a, const float3& b ); -float3 operator-( const float3& a, const float3& b ); -float3 operator-( const float3& v ); -float3 operator*( const float3& v, const float s ); -float3 operator*( const float s, const float3& v ); -float3 operator/( const float3& v, const float s ); -inline int operator==( const float3 &a, const float3 &b ) { return (a.x==b.x && a.y==b.y && a.z==b.z); } -inline int operator!=( const float3 &a, const float3 &b ) { return (a.x!=b.x || a.y!=b.y || a.z!=b.z); } -// due to ambiguity and inconsistent standards ther are no overloaded operators for mult such as va*vb. -float dot( const float3& a, const float3& b ); -float3 cmul( const float3 &a, const float3 &b); -float3 cross( const float3& a, const float3& b ); -float3 Interpolate(const float3 &v0,const float3 &v1,float alpha); -float3 Round(const float3& a,float precision); -float3 VectorMax(const float3 &a, const float3 &b); -float3 VectorMin(const float3 &a, const float3 &b); - - - -class float3x3 -{ - public: - float3 x,y,z; // the 3 rows of the Matrix - float3x3(){} - float3x3(float xx,float xy,float xz,float yx,float yy,float yz,float zx,float zy,float zz):x(xx,xy,xz),y(yx,yy,yz),z(zx,zy,zz){} - float3x3(float3 _x,float3 _y,float3 _z):x(_x),y(_y),z(_z){} - float3& operator[](int i) {assert(i>=0&&i<3);return (&x)[i];} - const float3& operator[](int i) const {assert(i>=0&&i<3);return (&x)[i];} - float& operator()(int r, int c) {assert(r>=0&&r<3&&c>=0&&c<3);return ((&x)[r])[c];} - const float& operator()(int r, int c) const {assert(r>=0&&r<3&&c>=0&&c<3);return ((&x)[r])[c];} -}; -float3x3 Transpose( const float3x3& m ); -float3 operator*( const float3& v , const float3x3& m ); -float3 operator*( const float3x3& m , const float3& v ); -float3x3 operator*( const float3x3& m , const float& s ); -float3x3 operator*( const float3x3& ma, const float3x3& mb ); -float3x3 operator/( const float3x3& a, const float& s ) ; -float3x3 operator+( const float3x3& a, const float3x3& b ); -float3x3 operator-( const float3x3& a, const float3x3& b ); -float3x3 &operator+=( float3x3& a, const float3x3& b ); -float3x3 &operator-=( float3x3& a, const float3x3& b ); -float3x3 &operator*=( float3x3& a, const float& s ); -float Determinant(const float3x3& m ); -float3x3 Inverse(const float3x3& a); // its just 3x3 so we simply do that cofactor method - - -//-------- 4D Math -------- - -class float4 -{ -public: - float x,y,z,w; - float4(){x=0;y=0;z=0;w=0;}; - float4(float _x,float _y,float _z,float _w){x=_x;y=_y;z=_z;w=_w;} - float4(const float3 &v,float _w){x=v.x;y=v.y;z=v.z;w=_w;} - //operator float *() { return &x;}; - float& operator[](int i) {assert(i>=0&&i<4);return ((float*)this)[i];} - const float& operator[](int i) const {assert(i>=0&&i<4);return ((float*)this)[i];} - const float3& xyz() const { return *((float3*)this);} - float3& xyz() { return *((float3*)this);} -}; - - -struct D3DXMATRIX; - -class float4x4 -{ - public: - float4 x,y,z,w; // the 4 rows - float4x4(){} - float4x4(const float4 &_x, const float4 &_y, const float4 &_z, const float4 &_w):x(_x),y(_y),z(_z),w(_w){} - float4x4(float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33 ) - :x(m00,m01,m02,m03),y(m10,m11,m12,m13),z(m20,m21,m22,m23),w(m30,m31,m32,m33){} - float& operator()(int r, int c) {assert(r>=0&&r<4&&c>=0&&c<4);return ((&x)[r])[c];} - const float& operator()(int r, int c) const {assert(r>=0&&r<4&&c>=0&&c<4);return ((&x)[r])[c];} - operator float* () {return &x.x;} - operator const float* () const {return &x.x;} - operator struct D3DXMATRIX* () { return (struct D3DXMATRIX*) this;} - operator const struct D3DXMATRIX* () const { return (struct D3DXMATRIX*) this;} -}; - - -int operator==( const float4 &a, const float4 &b ); -float4 Homogenize(const float3 &v3,const float &w=1.0f); // Turns a 3D float3 4D vector4 by appending w -float4 cmul( const float4 &a, const float4 &b); -float4 operator*( const float4 &v, float s); -float4 operator*( float s, const float4 &v); -float4 operator+( const float4 &a, const float4 &b); -float4 operator-( const float4 &a, const float4 &b); -float4x4 operator*( const float4x4& a, const float4x4& b ); -float4 operator*( const float4& v, const float4x4& m ); -float4x4 Inverse(const float4x4 &m); -float4x4 MatrixRigidInverse(const float4x4 &m); -float4x4 MatrixTranspose(const float4x4 &m); -float4x4 MatrixPerspectiveFov(float fovy, float Aspect, float zn, float zf ); -float4x4 MatrixTranslation(const float3 &t); -float4x4 MatrixRotationZ(const float angle_radians); -float4x4 MatrixLookAt(const float3& eye, const float3& at, const float3& up); -int operator==( const float4x4 &a, const float4x4 &b ); - - -//-------- Quaternion ------------ - -class Quaternion :public float4 -{ - public: - Quaternion() { x = y = z = 0.0f; w = 1.0f; } - Quaternion( float3 v, float t ) { v = normalize(v); w = cosf(t/2.0f); v = v*sinf(t/2.0f); x = v.x; y = v.y; z = v.z; } - Quaternion(float _x, float _y, float _z, float _w){x=_x;y=_y;z=_z;w=_w;} - float angle() const { return acosf(w)*2.0f; } - float3 axis() const { float3 a(x,y,z); if(fabsf(angle())<0.0000001f) return float3(1,0,0); return a*(1/sinf(angle()/2.0f)); } - float3 xdir() const { return float3( 1-2*(y*y+z*z), 2*(x*y+w*z), 2*(x*z-w*y) ); } - float3 ydir() const { return float3( 2*(x*y-w*z),1-2*(x*x+z*z), 2*(y*z+w*x) ); } - float3 zdir() const { return float3( 2*(x*z+w*y), 2*(y*z-w*x),1-2*(x*x+y*y) ); } - float3x3 getmatrix() const { return float3x3( xdir(), ydir(), zdir() ); } - operator float3x3() { return getmatrix(); } - void Normalize(); -}; - -Quaternion& operator*=(Quaternion& a, float s ); -Quaternion operator*( const Quaternion& a, float s ); -Quaternion operator*( const Quaternion& a, const Quaternion& b); -Quaternion operator+( const Quaternion& a, const Quaternion& b ); -Quaternion normalize( Quaternion a ); -float dot( const Quaternion &a, const Quaternion &b ); -float3 operator*( const Quaternion& q, const float3& v ); -float3 operator*( const float3& v, const Quaternion& q ); -Quaternion slerp( Quaternion a, const Quaternion& b, float interp ); -Quaternion Interpolate(const Quaternion &q0,const Quaternion &q1,float alpha); -Quaternion RotationArc(float3 v0, float3 v1 ); // returns quat q where q*v0=v1 -Quaternion Inverse(const Quaternion &q); -float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v); - - -//------ Euler Angle ----- - -Quaternion YawPitchRoll( float yaw, float pitch, float roll ); -float Yaw( const Quaternion& q ); -float Pitch( const Quaternion& q ); -float Roll( Quaternion q ); -float Yaw( const float3& v ); -float Pitch( const float3& v ); - - -//------- Plane ---------- - -class Plane -{ - public: - float3 normal; - float dist; // distance below origin - the D from plane equasion Ax+By+Cz+D=0 - Plane(const float3 &n,float d):normal(n),dist(d){} - Plane():normal(),dist(0){} - void Transform(const float3 &position, const Quaternion &orientation); -}; - -inline Plane PlaneFlip(const Plane &plane){return Plane(-plane.normal,-plane.dist);} -inline int operator==( const Plane &a, const Plane &b ) { return (a.normal==b.normal && a.dist==b.dist); } -inline int coplanar( const Plane &a, const Plane &b ) { return (a==b || a==PlaneFlip(b)); } - - -//--------- Utility Functions ------ - -float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1); -float3 PlaneProject(const Plane &plane, const float3 &point); -float3 LineProject(const float3 &p0, const float3 &p1, const float3 &a); // projects a onto infinite line p0p1 -float LineProjectTime(const float3 &p0, const float3 &p1, const float3 &a); -float3 ThreePlaneIntersection(const Plane &p0,const Plane &p1, const Plane &p2); -int PolyHit(const float3 *vert,const int n,const float3 &v0, const float3 &v1, float3 *impact=NULL, float3 *normal=NULL); -int BoxInside(const float3 &p,const float3 &bmin, const float3 &bmax) ; -int BoxIntersect(const float3 &v0, const float3 &v1, const float3 &bmin, const float3 &bmax, float3 *impact); -float DistanceBetweenLines(const float3 &ustart, const float3 &udir, const float3 &vstart, const float3 &vdir, float3 *upoint=NULL, float3 *vpoint=NULL); -float3 TriNormal(const float3 &v0, const float3 &v1, const float3 &v2); -float3 NormalOf(const float3 *vert, const int n); -Quaternion VirtualTrackBall(const float3 &cop, const float3 &cor, const float3 &dir0, const float3 &dir1); - - -float sqr(float a) {return a*a;} -float clampf(float a) {return Min(1.0f,Max(0.0f,a));} - - -float Round(float a,float precision) -{ - return floorf(0.5f+a/precision)*precision; -} - - -float Interpolate(const float &f0,const float &f1,float alpha) -{ - return f0*(1-alpha) + f1*alpha; -} - - -int argmin(float a[],int n) -{ - int r=0; - for(int i=1;i=1.0) { - return a; - } - float theta = acosf(d); - if(theta==0.0f) { return(a);} - return a*(sinf(theta-interp*theta)/sinf(theta)) + b*(sinf(interp*theta)/sinf(theta)); -} - - -Quaternion Interpolate(const Quaternion &q0,const Quaternion &q1,float alpha) { - return slerp(q0,q1,alpha); -} - - -Quaternion YawPitchRoll( float yaw, float pitch, float roll ) -{ - roll *= DEG2RAD; - yaw *= DEG2RAD; - pitch *= DEG2RAD; - return Quaternion(float3(0.0f,0.0f,1.0f),yaw)*Quaternion(float3(1.0f,0.0f,0.0f),pitch)*Quaternion(float3(0.0f,1.0f,0.0f),roll); -} - -float Yaw( const Quaternion& q ) -{ - static float3 v; - v=q.ydir(); - return (v.y==0.0&&v.x==0.0) ? 0.0f: atan2f(-v.x,v.y)*RAD2DEG; -} - -float Pitch( const Quaternion& q ) -{ - static float3 v; - v=q.ydir(); - return atan2f(v.z,sqrtf(sqr(v.x)+sqr(v.y)))*RAD2DEG; -} - -float Roll( Quaternion q ) -{ - q = Quaternion(float3(0.0f,0.0f,1.0f),-Yaw(q)*DEG2RAD) *q; - q = Quaternion(float3(1.0f,0.0f,0.0f),-Pitch(q)*DEG2RAD) *q; - return atan2f(-q.xdir().z,q.xdir().x)*RAD2DEG; -} - -float Yaw( const float3& v ) -{ - return (v.y==0.0&&v.x==0.0) ? 0.0f: atan2f(-v.x,v.y)*RAD2DEG; -} - -float Pitch( const float3& v ) -{ - return atan2f(v.z,sqrtf(sqr(v.x)+sqr(v.y)))*RAD2DEG; -} - - -//------------- Plane -------------- - - -void Plane::Transform(const float3 &position, const Quaternion &orientation) { - // Transforms the plane to the space defined by the - // given position/orientation. - static float3 newnormal; - static float3 origin; - - newnormal = Inverse(orientation)*normal; - origin = Inverse(orientation)*(-normal*dist - position); - - normal = newnormal; - dist = -dot(newnormal, origin); -} - - - - -//--------- utility functions ------------- - -// RotationArc() -// Given two vectors v0 and v1 this function -// returns quaternion q where q*v0==v1. -// Routine taken from game programming gems. -Quaternion RotationArc(float3 v0,float3 v1){ - static Quaternion q; - v0 = normalize(v0); // Comment these two lines out if you know its not needed. - v1 = normalize(v1); // If vector is already unit length then why do it again? - float3 c = cross(v0,v1); - float d = dot(v0,v1); - if(d<=-1.0f) { return Quaternion(1,0,0,0);} // 180 about x axis - float s = sqrtf((1+d)*2); - q.x = c.x / s; - q.y = c.y / s; - q.z = c.z / s; - q.w = s /2.0f; - return q; -} - - -float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v) -{ - // builds a 4x4 transformation matrix based on orientation q and translation v - float qx2 = q.x*q.x; - float qy2 = q.y*q.y; - float qz2 = q.z*q.z; - - float qxqy = q.x*q.y; - float qxqz = q.x*q.z; - float qxqw = q.x*q.w; - float qyqz = q.y*q.z; - float qyqw = q.y*q.w; - float qzqw = q.z*q.w; - - return float4x4( - 1-2*(qy2+qz2), - 2*(qxqy+qzqw), - 2*(qxqz-qyqw), - 0 , - 2*(qxqy-qzqw), - 1-2*(qx2+qz2), - 2*(qyqz+qxqw), - 0 , - 2*(qxqz+qyqw), - 2*(qyqz-qxqw), - 1-2*(qx2+qy2), - 0 , - v.x , - v.y , - v.z , - 1.0f ); -} - - -float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1) -{ - // returns the point where the line p0-p1 intersects the plane n&d - static float3 dif; - dif = p1-p0; - float dn= dot(plane.normal,dif); - float t = -(plane.dist+dot(plane.normal,p0) )/dn; - return p0 + (dif*t); -} - -float3 PlaneProject(const Plane &plane, const float3 &point) -{ - return point - plane.normal * (dot(point,plane.normal)+plane.dist); -} - -float3 LineProject(const float3 &p0, const float3 &p1, const float3 &a) -{ - float3 w; - w = p1-p0; - float t= dot(w,(a-p0)) / (sqr(w.x)+sqr(w.y)+sqr(w.z)); - return p0+ w*t; -} - - -float LineProjectTime(const float3 &p0, const float3 &p1, const float3 &a) -{ - float3 w; - w = p1-p0; - float t= dot(w,(a-p0)) / (sqr(w.x)+sqr(w.y)+sqr(w.z)); - return t; -} - - - -float3 TriNormal(const float3 &v0, const float3 &v1, const float3 &v2) -{ - // return the normal of the triangle - // inscribed by v0, v1, and v2 - float3 cp=cross(v1-v0,v2-v1); - float m=magnitude(cp); - if(m==0) return float3(1,0,0); - return cp*(1.0f/m); -} - - - -int BoxInside(const float3 &p, const float3 &bmin, const float3 &bmax) -{ - return (p.x >= bmin.x && p.x <=bmax.x && - p.y >= bmin.y && p.y <=bmax.y && - p.z >= bmin.z && p.z <=bmax.z ); -} - - -int BoxIntersect(const float3 &v0, const float3 &v1, const float3 &bmin, const float3 &bmax,float3 *impact) -{ - if(BoxInside(v0,bmin,bmax)) - { - *impact=v0; - return 1; - } - if(v0.x<=bmin.x && v1.x>=bmin.x) - { - float a = (bmin.x-v0.x)/(v1.x-v0.x); - //v.x = bmin.x; - float vy = (1-a) *v0.y + a*v1.y; - float vz = (1-a) *v0.z + a*v1.z; - if(vy>=bmin.y && vy<=bmax.y && vz>=bmin.z && vz<=bmax.z) - { - impact->x = bmin.x; - impact->y = vy; - impact->z = vz; - return 1; - } - } - else if(v0.x >= bmax.x && v1.x <= bmax.x) - { - float a = (bmax.x-v0.x)/(v1.x-v0.x); - //v.x = bmax.x; - float vy = (1-a) *v0.y + a*v1.y; - float vz = (1-a) *v0.z + a*v1.z; - if(vy>=bmin.y && vy<=bmax.y && vz>=bmin.z && vz<=bmax.z) - { - impact->x = bmax.x; - impact->y = vy; - impact->z = vz; - return 1; - } - } - if(v0.y<=bmin.y && v1.y>=bmin.y) - { - float a = (bmin.y-v0.y)/(v1.y-v0.y); - float vx = (1-a) *v0.x + a*v1.x; - //v.y = bmin.y; - float vz = (1-a) *v0.z + a*v1.z; - if(vx>=bmin.x && vx<=bmax.x && vz>=bmin.z && vz<=bmax.z) - { - impact->x = vx; - impact->y = bmin.y; - impact->z = vz; - return 1; - } - } - else if(v0.y >= bmax.y && v1.y <= bmax.y) - { - float a = (bmax.y-v0.y)/(v1.y-v0.y); - float vx = (1-a) *v0.x + a*v1.x; - // vy = bmax.y; - float vz = (1-a) *v0.z + a*v1.z; - if(vx>=bmin.x && vx<=bmax.x && vz>=bmin.z && vz<=bmax.z) - { - impact->x = vx; - impact->y = bmax.y; - impact->z = vz; - return 1; - } - } - if(v0.z<=bmin.z && v1.z>=bmin.z) - { - float a = (bmin.z-v0.z)/(v1.z-v0.z); - float vx = (1-a) *v0.x + a*v1.x; - float vy = (1-a) *v0.y + a*v1.y; - // v.z = bmin.z; - if(vy>=bmin.y && vy<=bmax.y && vx>=bmin.x && vx<=bmax.x) - { - impact->x = vx; - impact->y = vy; - impact->z = bmin.z; - return 1; - } - } - else if(v0.z >= bmax.z && v1.z <= bmax.z) - { - float a = (bmax.z-v0.z)/(v1.z-v0.z); - float vx = (1-a) *v0.x + a*v1.x; - float vy = (1-a) *v0.y + a*v1.y; - // v.z = bmax.z; - if(vy>=bmin.y && vy<=bmax.y && vx>=bmin.x && vx<=bmax.x) - { - impact->x = vx; - impact->y = vy; - impact->z = bmax.z; - return 1; - } - } - return 0; -} - - -float DistanceBetweenLines(const float3 &ustart, const float3 &udir, const float3 &vstart, const float3 &vdir, float3 *upoint, float3 *vpoint) -{ - static float3 cp; - cp = normalize(cross(udir,vdir)); - - float distu = -dot(cp,ustart); - float distv = -dot(cp,vstart); - float dist = (float)fabs(distu-distv); - if(upoint) - { - Plane plane; - plane.normal = normalize(cross(vdir,cp)); - plane.dist = -dot(plane.normal,vstart); - *upoint = PlaneLineIntersection(plane,ustart,ustart+udir); - } - if(vpoint) - { - Plane plane; - plane.normal = normalize(cross(udir,cp)); - plane.dist = -dot(plane.normal,ustart); - *vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir); - } - return dist; -} - - -Quaternion VirtualTrackBall(const float3 &cop, const float3 &cor, const float3 &dir1, const float3 &dir2) -{ - // routine taken from game programming gems. - // Implement track ball functionality to spin stuf on the screen - // cop center of projection - // cor center of rotation - // dir1 old mouse direction - // dir2 new mouse direction - // pretend there is a sphere around cor. Then find the points - // where dir1 and dir2 intersect that sphere. Find the - // rotation that takes the first point to the second. - float m; - // compute plane - float3 nrml = cor - cop; - float fudgefactor = 1.0f/(magnitude(nrml) * 0.25f); // since trackball proportional to distance from cop - nrml = normalize(nrml); - float dist = -dot(nrml,cor); - float3 u= PlaneLineIntersection(Plane(nrml,dist),cop,cop+dir1); - u=u-cor; - u=u*fudgefactor; - m= magnitude(u); - if(m>1) - { - u/=m; - } - else - { - u=u - (nrml * sqrtf(1-m*m)); - } - float3 v= PlaneLineIntersection(Plane(nrml,dist),cop,cop+dir2); - v=v-cor; - v=v*fudgefactor; - m= magnitude(v); - if(m>1) - { - v/=m; - } - else - { - v=v - (nrml * sqrtf(1-m*m)); - } - return RotationArc(u,v); -} - - -int countpolyhit=0; -int PolyHit(const float3 *vert, const int n, const float3 &v0, const float3 &v1, float3 *impact, float3 *normal) -{ - countpolyhit++; - int i; - float3 nrml(0,0,0); - for(i=0;i0) - { - return 0; - } - - static float3 the_point; - // By using the cached plane distances d0 and d1 - // we can optimize the following: - // the_point = planelineintersection(nrml,dist,v0,v1); - float a = d0/(d0-d1); - the_point = v0*(1-a) + v1*a; - - - int inside=1; - for(int j=0;inside && j= 0.0); - } - if(inside) - { - if(normal){*normal=nrml;} - if(impact){*impact=the_point;} - } - return inside; -} - -//************************************************************************** -//************************************************************************** -//*** Stan Melax's array template, needed to compile his hull generation code -//************************************************************************** -//************************************************************************** - -template class ArrayRet; -template class Array { - public: - Array(int s=0); - Array(Array &array); - Array(ArrayRet &array); - ~Array(); - void allocate(int s); - void SetSize(int s); - void Pack(); - Type& Add(Type); - void AddUnique(Type); - int Contains(Type); - void Insert(Type,int); - int IndexOf(Type); - void Remove(Type); - void DelIndex(int i); - Type * element; - int count; - int array_size; - const Type &operator[](int i) const { assert(i>=0 && i=0 && i &operator=(Array &array); - Array &operator=(ArrayRet &array); - // operator ArrayRet &() { return *(ArrayRet *)this;} // this worked but i suspect could be dangerous -}; - -template class ArrayRet:public Array -{ -}; - -template Array::Array(int s) -{ - count=0; - array_size = 0; - element = NULL; - if(s) - { - allocate(s); - } -} - - -template Array::Array(Array &array) -{ - count=0; - array_size = 0; - element = NULL; - for(int i=0;i Array::Array(ArrayRet &array) -{ - *this = array; -} -template Array &Array::operator=(ArrayRet &array) -{ - count=array.count; - array_size = array.array_size; - element = array.element; - array.element=NULL; - array.count=0; - array.array_size=0; - return *this; -} - - -template Array &Array::operator=(Array &array) -{ - count=0; - for(int i=0;i Array::~Array() -{ - if (element != NULL) - { - free(element); - } - count=0;array_size=0;element=NULL; -} - -template void Array::allocate(int s) -{ - assert(s>0); - assert(s>=count); - Type *old = element; - array_size =s; - element = (Type *) malloc( sizeof(Type)*array_size); - assert(element); - for(int i=0;i void Array::SetSize(int s) -{ - if(s==0) - { - if(element) - { - free(element); - element = NULL; - } - array_size = s; - } - else - { - allocate(s); - } - count=s; -} - -template void Array::Pack() -{ - allocate(count); -} - -template Type& Array::Add(Type t) -{ - assert(count<=array_size); - if(count==array_size) - { - allocate((array_size)?array_size *2:16); - } - element[count++] = t; - return element[count-1]; -} - -template int Array::Contains(Type t) -{ - int i; - int found=0; - for(i=0;i void Array::AddUnique(Type t) -{ - if(!Contains(t)) Add(t); -} - - -template void Array::DelIndex(int i) -{ - assert(i void Array::Remove(Type t) -{ - int i; - for(i=0;i void Array::Insert(Type t,int k) -{ - int i=count; - Add(t); // to allocate space - while(i>k) - { - element[i]=element[i-1]; - i--; - } - assert(i==k); - element[k]=t; -} - - -template int Array::IndexOf(Type t) -{ - int i; - for(i=0;i vertices; - Array edges; - Array facets; - ConvexH(int vertices_size,int edges_size,int facets_size); -}; - -typedef ConvexH::HalfEdge HalfEdge; - -ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size) - :vertices(vertices_size) - ,edges(edges_size) - ,facets(facets_size) -{ - vertices.count=vertices_size; - edges.count = edges_size; - facets.count = facets_size; -} - -ConvexH *ConvexHDup(ConvexH *src) { - ConvexH *dst = new ConvexH(src->vertices.count,src->edges.count,src->facets.count); - memcpy(dst->vertices.element,src->vertices.element,sizeof(float3)*src->vertices.count); - memcpy(dst->edges.element,src->edges.element,sizeof(HalfEdge)*src->edges.count); - memcpy(dst->facets.element,src->facets.element,sizeof(Plane)*src->facets.count); - return dst; -} - - -int PlaneTest(const Plane &p, const REAL3 &v) { - REAL a = dot(v,p.normal)+p.dist; - int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR); - return flag; -} - -int SplitTest(ConvexH &convex,const Plane &plane) { - int flag=0; - for(int i=0;i= convex.edges.count || convex.edges[inext].p != convex.edges[i].p) { - inext = estart; - } - assert(convex.edges[inext].p == convex.edges[i].p); - int nb = convex.edges[i].ea; - assert(nb!=255); - if(nb==255 || nb==-1) return 0; - assert(nb!=-1); - assert(i== convex.edges[nb].ea); - } - for(i=0;i= convex.edges.count || convex.edges[i1].p != convex.edges[i].p) { - i1 = estart; - } - int i2 = i1+1; - if(i2>= convex.edges.count || convex.edges[i2].p != convex.edges[i].p) { - i2 = estart; - } - if(i==i2) continue; // i sliced tangent to an edge and created 2 meaningless edges - REAL3 localnormal = TriNormal(convex.vertices[convex.edges[i ].v], - convex.vertices[convex.edges[i1].v], - convex.vertices[convex.edges[i2].v]); - assert(dot(localnormal,convex.facets[convex.edges[i].p].normal)>0); - if(dot(localnormal,convex.facets[convex.edges[i].p].normal)<=0)return 0; - } - return 1; -} - -// back to back quads -ConvexH *test_btbq() { - ConvexH *convex = new ConvexH(4,8,2); - convex->vertices[0] = REAL3(0,0,0); - convex->vertices[1] = REAL3(1,0,0); - convex->vertices[2] = REAL3(1,1,0); - convex->vertices[3] = REAL3(0,1,0); - convex->facets[0] = Plane(REAL3(0,0,1),0); - convex->facets[1] = Plane(REAL3(0,0,-1),0); - convex->edges[0] = HalfEdge(7,0,0); - convex->edges[1] = HalfEdge(6,1,0); - convex->edges[2] = HalfEdge(5,2,0); - convex->edges[3] = HalfEdge(4,3,0); - - convex->edges[4] = HalfEdge(3,0,1); - convex->edges[5] = HalfEdge(2,3,1); - convex->edges[6] = HalfEdge(1,2,1); - convex->edges[7] = HalfEdge(0,1,1); - AssertIntact(*convex); - return convex; -} -ConvexH *test_cube() { - ConvexH *convex = new ConvexH(8,24,6); - convex->vertices[0] = REAL3(0,0,0); - convex->vertices[1] = REAL3(0,0,1); - convex->vertices[2] = REAL3(0,1,0); - convex->vertices[3] = REAL3(0,1,1); - convex->vertices[4] = REAL3(1,0,0); - convex->vertices[5] = REAL3(1,0,1); - convex->vertices[6] = REAL3(1,1,0); - convex->vertices[7] = REAL3(1,1,1); - - convex->facets[0] = Plane(REAL3(-1,0,0),0); - convex->facets[1] = Plane(REAL3(1,0,0),-1); - convex->facets[2] = Plane(REAL3(0,-1,0),0); - convex->facets[3] = Plane(REAL3(0,1,0),-1); - convex->facets[4] = Plane(REAL3(0,0,-1),0); - convex->facets[5] = Plane(REAL3(0,0,1),-1); - - convex->edges[0 ] = HalfEdge(11,0,0); - convex->edges[1 ] = HalfEdge(23,1,0); - convex->edges[2 ] = HalfEdge(15,3,0); - convex->edges[3 ] = HalfEdge(16,2,0); - - convex->edges[4 ] = HalfEdge(13,6,1); - convex->edges[5 ] = HalfEdge(21,7,1); - convex->edges[6 ] = HalfEdge( 9,5,1); - convex->edges[7 ] = HalfEdge(18,4,1); - - convex->edges[8 ] = HalfEdge(19,0,2); - convex->edges[9 ] = HalfEdge( 6,4,2); - convex->edges[10] = HalfEdge(20,5,2); - convex->edges[11] = HalfEdge( 0,1,2); - - convex->edges[12] = HalfEdge(22,3,3); - convex->edges[13] = HalfEdge( 4,7,3); - convex->edges[14] = HalfEdge(17,6,3); - convex->edges[15] = HalfEdge( 2,2,3); - - convex->edges[16] = HalfEdge( 3,0,4); - convex->edges[17] = HalfEdge(14,2,4); - convex->edges[18] = HalfEdge( 7,6,4); - convex->edges[19] = HalfEdge( 8,4,4); - - convex->edges[20] = HalfEdge(10,1,5); - convex->edges[21] = HalfEdge( 5,5,5); - convex->edges[22] = HalfEdge(12,7,5); - convex->edges[23] = HalfEdge( 1,3,5); - - - return convex; -} -ConvexH *ConvexHMakeCube(const REAL3 &bmin, const REAL3 &bmax) { - ConvexH *convex = test_cube(); - convex->vertices[0] = REAL3(bmin.x,bmin.y,bmin.z); - convex->vertices[1] = REAL3(bmin.x,bmin.y,bmax.z); - convex->vertices[2] = REAL3(bmin.x,bmax.y,bmin.z); - convex->vertices[3] = REAL3(bmin.x,bmax.y,bmax.z); - convex->vertices[4] = REAL3(bmax.x,bmin.y,bmin.z); - convex->vertices[5] = REAL3(bmax.x,bmin.y,bmax.z); - convex->vertices[6] = REAL3(bmax.x,bmax.y,bmin.z); - convex->vertices[7] = REAL3(bmax.x,bmax.y,bmax.z); - - convex->facets[0] = Plane(REAL3(-1,0,0), bmin.x); - convex->facets[1] = Plane(REAL3(1,0,0), -bmax.x); - convex->facets[2] = Plane(REAL3(0,-1,0), bmin.y); - convex->facets[3] = Plane(REAL3(0,1,0), -bmax.y); - convex->facets[4] = Plane(REAL3(0,0,-1), bmin.z); - convex->facets[5] = Plane(REAL3(0,0,1), -bmax.z); - return convex; -} -ConvexH *ConvexHCrop(ConvexH &convex,const Plane &slice) -{ - int i; - int vertcountunder=0; - int vertcountover =0; - static Array vertscoplanar; // existing vertex members of convex that are coplanar - vertscoplanar.count=0; - static Array edgesplit; // existing edges that members of convex that cross the splitplane - edgesplit.count=0; - - assert(convex.edges.count<480); - - EdgeFlag edgeflag[512]; - VertFlag vertflag[256]; - PlaneFlag planeflag[128]; - HalfEdge tmpunderedges[512]; - Plane tmpunderplanes[128]; - Coplanar coplanaredges[512]; - int coplanaredges_num=0; - - Array createdverts; - // do the side-of-plane tests - for(i=0;i= convex.edges.count || convex.edges[e1].p!=currentplane) { - enextface = e1; - e1=estart; - } - HalfEdge &edge0 = convex.edges[e0]; - HalfEdge &edge1 = convex.edges[e1]; - HalfEdge &edgea = convex.edges[edge0.ea]; - - - planeside |= vertflag[edge0.v].planetest; - //if((vertflag[edge0.v].planetest & vertflag[edge1.v].planetest) == COPLANAR) { - // assert(ecop==-1); - // ecop=e; - //} - - - if(vertflag[edge0.v].planetest == OVER && vertflag[edge1.v].planetest == OVER){ - // both endpoints over plane - edgeflag[e0].undermap = -1; - } - else if((vertflag[edge0.v].planetest | vertflag[edge1.v].planetest) == UNDER) { - // at least one endpoint under, the other coplanar or under - - edgeflag[e0].undermap = under_edge_count; - tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; - tmpunderedges[under_edge_count].p = underplanescount; - if(edge0.ea < e0) { - // connect the neighbors - assert(edgeflag[edge0.ea].undermap !=-1); - tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; - tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; - } - under_edge_count++; - } - else if((vertflag[edge0.v].planetest | vertflag[edge1.v].planetest) == COPLANAR) { - // both endpoints coplanar - // must check a 3rd point to see if UNDER - int e2 = e1+1; - if(e2>=convex.edges.count || convex.edges[e2].p!=currentplane) { - e2 = estart; - } - assert(convex.edges[e2].p==currentplane); - HalfEdge &edge2 = convex.edges[e2]; - if(vertflag[edge2.v].planetest==UNDER) { - - edgeflag[e0].undermap = under_edge_count; - tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; - tmpunderedges[under_edge_count].p = underplanescount; - tmpunderedges[under_edge_count].ea = -1; - // make sure this edge is added to the "coplanar" list - coplanaredge = under_edge_count; - vout = vertflag[edge0.v].undermap; - vin = vertflag[edge1.v].undermap; - under_edge_count++; - } - else { - edgeflag[e0].undermap = -1; - } - } - else if(vertflag[edge0.v].planetest == UNDER && vertflag[edge1.v].planetest == OVER) { - // first is under 2nd is over - - edgeflag[e0].undermap = under_edge_count; - tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; - tmpunderedges[under_edge_count].p = underplanescount; - if(edge0.ea < e0) { - assert(edgeflag[edge0.ea].undermap !=-1); - // connect the neighbors - tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; - tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; - vout = tmpunderedges[edgeflag[edge0.ea].undermap].v; - } - else { - Plane &p0 = convex.facets[edge0.p]; - Plane &pa = convex.facets[edgea.p]; - createdverts.Add(ThreePlaneIntersection(p0,pa,slice)); - //createdverts.Add(PlaneProject(slice,PlaneLineIntersection(slice,convex.vertices[edge0.v],convex.vertices[edgea.v]))); - //createdverts.Add(PlaneLineIntersection(slice,convex.vertices[edge0.v],convex.vertices[edgea.v])); - vout = vertcountunder++; - } - under_edge_count++; - /// hmmm something to think about: i might be able to output this edge regarless of - // wheter or not we know v-in yet. ok i;ll try this now: - tmpunderedges[under_edge_count].v = vout; - tmpunderedges[under_edge_count].p = underplanescount; - tmpunderedges[under_edge_count].ea = -1; - coplanaredge = under_edge_count; - under_edge_count++; - - if(vin!=-1) { - // we previously processed an edge where we came under - // now we know about vout as well - - // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! - } - - } - else if(vertflag[edge0.v].planetest == COPLANAR && vertflag[edge1.v].planetest == OVER) { - // first is coplanar 2nd is over - - edgeflag[e0].undermap = -1; - vout = vertflag[edge0.v].undermap; - // I hate this but i have to make sure part of this face is UNDER before ouputting this vert - int k=estart; - assert(edge0.p == currentplane); - while(!(planeside&UNDER) && k= vertcountunderold); // for debugging only - } - if(vout!=-1) { - // we previously processed an edge where we went over - // now we know vin too - // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! - } - // output edge - tmpunderedges[under_edge_count].v = vin; - tmpunderedges[under_edge_count].p = underplanescount; - edgeflag[e0].undermap = under_edge_count; - if(e0>edge0.ea) { - assert(edgeflag[edge0.ea].undermap !=-1); - // connect the neighbors - tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; - tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; - } - assert(edgeflag[e0].undermap == under_edge_count); - under_edge_count++; - } - else if(vertflag[edge0.v].planetest == OVER && vertflag[edge1.v].planetest == COPLANAR) { - // first is over next is coplanar - - edgeflag[e0].undermap = -1; - vin = vertflag[edge1.v].undermap; - assert(vin!=-1); - if(vout!=-1) { - // we previously processed an edge where we came under - // now we know both endpoints - // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! - } - - } - else { - assert(0); - } - - - e0=e1; - e1++; // do the modulo at the beginning of the loop - - } while(e0!=estart) ; - e0 = enextface; - if(planeside&UNDER) { - planeflag[currentplane].undermap = underplanescount; - tmpunderplanes[underplanescount] = convex.facets[currentplane]; - underplanescount++; - } - else { - planeflag[currentplane].undermap = 0; - } - if(vout>=0 && (planeside&UNDER)) { - assert(vin>=0); - assert(coplanaredge>=0); - assert(coplanaredge!=511); - coplanaredges[coplanaredges_num].ea = coplanaredge; - coplanaredges[coplanaredges_num].v0 = vin; - coplanaredges[coplanaredges_num].v1 = vout; - coplanaredges_num++; - } - } - - // add the new plane to the mix: - if(coplanaredges_num>0) { - tmpunderplanes[underplanescount++]=slice; - } - for(i=0;i=coplanaredges_num) - { - assert(jvertices.count;j++) - { - d = Max(d,dot(convex->vertices[j],planes[i].normal)+planes[i].dist); - } - if(i==0 || d>md) - { - p=i; - md=d; - } - } - return (md>epsilon)?p:-1; -} - -template -inline int maxdir(const T *p,int count,const T &dir) -{ - assert(count); - int m=0; - float currDotm = dot(p[0], dir); - for(int i=1;i currDotm) - { - currDotm = currDoti; - m=i; - } - } - return m; -} - - -template -int maxdirfiltered(const T *p,int count,const T &dir,Array &allow) -{ - assert(count); - int m=-1; - float currDotm = dot(p[0], dir); - for(int i=0;icurrDotm) - { - currDotm = currDoti; - m=i; - } - } - } - } - assert(m!=-1); - return m; -} - -float3 orth(const float3 &v) -{ - float3 a=cross(v,float3(0,0,1)); - float3 b=cross(v,float3(0,1,0)); - return normalize((magnitude(a)>magnitude(b))?a:b); -} - - -template -int maxdirsterid(const T *p,int count,const T &dir,Array &allow) -{ - int m=-1; - while(m==-1) - { - m = maxdirfiltered(p,count,dir,allow); - if(allow[m]==3) return m; - T u = orth(dir); - T v = cross(u,dir); - int ma=-1; - for(float x = 0.0f ; x<= 360.0f ; x+= 45.0f) - { - float s = sinf(DEG2RAD*(x)); - float c = cosf(DEG2RAD*(x)); - int mb = maxdirfiltered(p,count,dir+(u*s+v*c)*0.025f,allow); - if(ma==m && mb==m) - { - allow[m]=3; - return m; - } - if(ma!=-1 && ma!=mb) // Yuck - this is really ugly - { - int mc = ma; - for(float xx = x-40.0f ; xx <= x ; xx+= 5.0f) - { - float s = sinf(DEG2RAD*(xx)); - float c = cosf(DEG2RAD*(xx)); - int md = maxdirfiltered(p,count,dir+(u*s+v*c)*0.025f,allow); - if(mc==m && md==m) - { - allow[m]=3; - return m; - } - mc=md; - } - } - ma=mb; - } - allow[m]=0; - m=-1; - } - assert(0); - return m; -} - - - - -int operator ==(const int3 &a,const int3 &b) -{ - for(int i=0;i<3;i++) - { - if(a[i]!=b[i]) return 0; - } - return 1; -} - -int3 roll3(int3 a) -{ - int tmp=a[0]; - a[0]=a[1]; - a[1]=a[2]; - a[2]=tmp; - return a; -} -int isa(const int3 &a,const int3 &b) -{ - return ( a==b || roll3(a)==b || a==roll3(b) ); -} -int b2b(const int3 &a,const int3 &b) -{ - return isa(a,int3(b[2],b[1],b[0])); -} -int above(float3* vertices,const int3& t, const float3 &p, float epsilon) -{ - float3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]); - return (dot(n,p-vertices[t[0]]) > epsilon); // EPSILON??? -} -int hasedge(const int3 &t, int a,int b) -{ - for(int i=0;i<3;i++) - { - int i1= (i+1)%3; - if(t[i]==a && t[i1]==b) return 1; - } - return 0; -} -int hasvert(const int3 &t, int v) -{ - return (t[0]==v || t[1]==v || t[2]==v) ; -} -int shareedge(const int3 &a,const int3 &b) -{ - int i; - for(i=0;i<3;i++) - { - int i1= (i+1)%3; - if(hasedge(a,b[i1],b[i])) return 1; - } - return 0; -} - -class btHullTriangle; - -Array tris; - -class btHullTriangle : public int3 -{ -public: - int3 n; - int id; - int vmax; - float rise; - btHullTriangle(int a,int b,int c):int3(a,b,c),n(-1,-1,-1) - { - id = tris.count; - tris.Add(this); - vmax=-1; - rise = 0.0f; - } - ~btHullTriangle() - { - assert(tris[id]==this); - tris[id]=NULL; - } - int &neib(int a,int b); -}; - - -int &btHullTriangle::neib(int a,int b) -{ - static int er=-1; - int i; - for(i=0;i<3;i++) - { - int i1=(i+1)%3; - int i2=(i+2)%3; - if((*this)[i]==a && (*this)[i1]==b) return n[i2]; - if((*this)[i]==b && (*this)[i1]==a) return n[i2]; - } - assert(0); - return er; -} -void b2bfix(btHullTriangle* s,btHullTriangle*t) -{ - int i; - for(i=0;i<3;i++) - { - int i1=(i+1)%3; - int i2=(i+2)%3; - int a = (*s)[i1]; - int b = (*s)[i2]; - assert(tris[s->neib(a,b)]->neib(b,a) == s->id); - assert(tris[t->neib(a,b)]->neib(b,a) == t->id); - tris[s->neib(a,b)]->neib(b,a) = t->neib(b,a); - tris[t->neib(b,a)]->neib(a,b) = s->neib(a,b); - } -} - -void removeb2b(btHullTriangle* s,btHullTriangle*t) -{ - b2bfix(s,t); - delete s; - delete t; -} - -void checkit(btHullTriangle *t) -{ - int i; - assert(tris[t->id]==t); - for(i=0;i<3;i++) - { - int i1=(i+1)%3; - int i2=(i+2)%3; - int a = (*t)[i1]; - int b = (*t)[i2]; - assert(a!=b); - assert( tris[t->n[i]]->neib(b,a) == t->id); - } -} -void extrude(btHullTriangle *t0,int v) -{ - int3 t= *t0; - int n = tris.count; - btHullTriangle* ta = new btHullTriangle(v,t[1],t[2]); - ta->n = int3(t0->n[0],n+1,n+2); - tris[t0->n[0]]->neib(t[1],t[2]) = n+0; - btHullTriangle* tb = new btHullTriangle(v,t[2],t[0]); - tb->n = int3(t0->n[1],n+2,n+0); - tris[t0->n[1]]->neib(t[2],t[0]) = n+1; - btHullTriangle* tc = new btHullTriangle(v,t[0],t[1]); - tc->n = int3(t0->n[2],n+0,n+1); - tris[t0->n[2]]->neib(t[0],t[1]) = n+2; - checkit(ta); - checkit(tb); - checkit(tc); - if(hasvert(*tris[ta->n[0]],v)) removeb2b(ta,tris[ta->n[0]]); - if(hasvert(*tris[tb->n[0]],v)) removeb2b(tb,tris[tb->n[0]]); - if(hasvert(*tris[tc->n[0]],v)) removeb2b(tc,tris[tc->n[0]]); - delete t0; - -} - -btHullTriangle *extrudable(float epsilon) -{ - int i; - btHullTriangle *t=NULL; - for(i=0;iriserise)) - { - t = tris[i]; - } - } - return (t->rise >epsilon)?t:NULL ; -} - -class int4 -{ -public: - int x,y,z,w; - int4(){}; - int4(int _x,int _y, int _z,int _w){x=_x;y=_y;z=_z;w=_w;} - const int& operator[](int i) const {return (&x)[i];} - int& operator[](int i) {return (&x)[i];} -}; - - - -int4 FindSimplex(float3 *verts,int verts_count,Array &allow) -{ - float3 basis[3]; - basis[0] = float3( 0.01f, 0.02f, 1.0f ); - int p0 = maxdirsterid(verts,verts_count, basis[0],allow); - int p1 = maxdirsterid(verts,verts_count,-basis[0],allow); - basis[0] = verts[p0]-verts[p1]; - if(p0==p1 || basis[0]==float3(0,0,0)) - return int4(-1,-1,-1,-1); - basis[1] = cross(float3( 1, 0.02f, 0),basis[0]); - basis[2] = cross(float3(-0.02f, 1, 0),basis[0]); - basis[1] = normalize( (magnitude(basis[1])>magnitude(basis[2])) ? basis[1]:basis[2]); - int p2 = maxdirsterid(verts,verts_count,basis[1],allow); - if(p2 == p0 || p2 == p1) - { - p2 = maxdirsterid(verts,verts_count,-basis[1],allow); - } - if(p2 == p0 || p2 == p1) - return int4(-1,-1,-1,-1); - basis[1] = verts[p2] - verts[p0]; - basis[2] = normalize(cross(basis[1],basis[0])); - int p3 = maxdirsterid(verts,verts_count,basis[2],allow); - if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow); - if(p3==p0||p3==p1||p3==p2) - return int4(-1,-1,-1,-1); - assert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3)); - if(dot(verts[p3]-verts[p0],cross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);} - return int4(p0,p1,p2,p3); -} - -int calchullgen(float3 *verts,int verts_count, int vlimit) -{ - if(verts_count <4) return 0; - if(vlimit==0) vlimit=1000000000; - int j; - float3 bmin(*verts),bmax(*verts); - Array isextreme(verts_count); - Array allow(verts_count); - for(j=0;jn=int3(2,3,1); - btHullTriangle *t1 = new btHullTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0); - btHullTriangle *t2 = new btHullTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3); - btHullTriangle *t3 = new btHullTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2); - isextreme[p[0]]=isextreme[p[1]]=isextreme[p[2]]=isextreme[p[3]]=1; - checkit(t0);checkit(t1);checkit(t2);checkit(t3); - - for(j=0;jvmax<0); - float3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); - t->vmax = maxdirsterid(verts,verts_count,n,allow); - t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]); - } - btHullTriangle *te; - vlimit-=4; - while(vlimit >0 && (te=extrudable(epsilon))) - { - int3 ti=*te; - int v=te->vmax; - assert(!isextreme[v]); // wtf we've already done this vertex - isextreme[v]=1; - //if(v==p0 || v==p1 || v==p2 || v==p3) continue; // done these already - j=tris.count; - while(j--) { - if(!tris[j]) continue; - int3 t=*tris[j]; - if(above(verts,t,verts[v],0.01f*epsilon)) - { - extrude(tris[j],v); - } - } - // now check for those degenerate cases where we have a flipped triangle or a really skinny triangle - j=tris.count; - while(j--) - { - if(!tris[j]) continue; - if(!hasvert(*tris[j],v)) break; - int3 nt=*tris[j]; - if(above(verts,nt,center,0.01f*epsilon) || magnitude(cross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]))< epsilon*epsilon*0.1f ) - { - btHullTriangle *nb = tris[tris[j]->n[0]]; - assert(nb);assert(!hasvert(*nb,v));assert(nb->idvmax>=0) break; - float3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); - t->vmax = maxdirsterid(verts,verts_count,n,allow); - if(isextreme[t->vmax]) - { - t->vmax=-1; // already done that vertex - algorithm needs to be able to terminate. - } - else - { - t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]); - } - } - vlimit --; - } - return 1; -} - -int calchull(float3 *verts,int verts_count, int *&tris_out, int &tris_count,int vlimit) -{ - int rc=calchullgen(verts,verts_count, vlimit) ; - if(!rc) return 0; - Array ts; - for(int i=0;i &planes,float bevangle) -{ - int i,j; - planes.count=0; - int rc = calchullgen(verts,verts_count,vlimit); - if(!rc) return 0; - for(i=0;in[j]id) continue; - btHullTriangle *s = tris[t->n[j]]; - REAL3 snormal = TriNormal(verts[(*s)[0]],verts[(*s)[1]],verts[(*s)[2]]); - if(dot(snormal,p.normal)>=cos(bevangle*DEG2RAD)) continue; - REAL3 n = normalize(snormal+p.normal); - planes.Add(Plane(n,-dot(n,verts[maxdir(verts,verts_count,n)]))); - } - } - - for(i=0;i=0) - { - ConvexH *tmp = c; - c = ConvexHCrop(*tmp,planes[k]); - if(c==NULL) {c=tmp; break;} // might want to debug this case better!!! - if(!AssertIntact(*c)) {c=tmp; break;} // might want to debug this case better too!!! - delete tmp; - } - - assert(AssertIntact(*c)); - //return c; - faces_out = (int*)malloc(sizeof(int)*(1+c->facets.count+c->edges.count)); // new int[1+c->facets.count+c->edges.count]; - faces_count_out=0; - i=0; - faces_out[faces_count_out++]=-1; - k=0; - while(iedges.count) - { - j=1; - while(j+iedges.count && c->edges[i].p==c->edges[i+j].p) { j++; } - faces_out[faces_count_out++]=j; - while(j--) - { - faces_out[faces_count_out++] = c->edges[i].v; - i++; - } - k++; - } - faces_out[0]=k; // number of faces. - assert(k==c->facets.count); - assert(faces_count_out == 1+c->facets.count+c->edges.count); - verts_out = c->vertices.element; // new float3[c->vertices.count]; - verts_count_out = c->vertices.count; - for(i=0;ivertices.count;i++) - { - verts_out[i] = float3(c->vertices[i]); - } - c->vertices.count=c->vertices.array_size=0; c->vertices.element=NULL; - delete c; - return 1; -} - -int overhullv(float3 *verts, int verts_count,int maxplanes, - float3 *&verts_out, int &verts_count_out, int *&faces_out, int &faces_count_out ,float inflate,float bevangle,int vlimit) -{ - if(!verts_count) return 0; - extern int calchullpbev(float3 *verts,int verts_count,int vlimit, Array &planes,float bevangle) ; - Array planes; - int rc=calchullpbev(verts,verts_count,vlimit,planes,bevangle) ; - if(!rc) return 0; - return overhull(planes.element,planes.count,verts,verts_count,maxplanes,verts_out,verts_count_out,faces_out,faces_count_out,inflate); -} - - -bool ComputeHull(unsigned int vcount,const float *vertices,PHullResult &result,unsigned int vlimit,float inflate) -{ - - int index_count; - int *faces; - float3 *verts_out; - int verts_count_out; - - if(inflate==0.0f) - { - int *tris_out; - int tris_count; - int ret = calchull( (float3 *) vertices, (int) vcount, tris_out, tris_count, vlimit ); - if(!ret) return false; - result.mIndexCount = (unsigned int) (tris_count*3); - result.mFaceCount = (unsigned int) tris_count; - result.mVertices = (float*) vertices; - result.mVcount = (unsigned int) vcount; - result.mIndices = (unsigned int *) tris_out; - return true; - } - - int ret = overhullv((float3*)vertices,vcount,35,verts_out,verts_count_out,faces,index_count,inflate,120.0f,vlimit); - if(!ret) return false; - - Array tris; - int n=faces[0]; - int k=1; - for(int i=0;i bmax[j] ) bmax[j] = p[j]; - } - } - } - - float dx = bmax[0] - bmin[0]; - float dy = bmax[1] - bmin[1]; - float dz = bmax[2] - bmin[2]; - - float center[3]; - - center[0] = dx*0.5f + bmin[0]; - center[1] = dy*0.5f + bmin[1]; - center[2] = dz*0.5f + bmin[2]; - - if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || svcount < 3 ) - { - - float len = FLT_MAX; - - if ( dx > EPSILON && dx < len ) len = dx; - if ( dy > EPSILON && dy < len ) len = dy; - if ( dz > EPSILON && dz < len ) len = dz; - - if ( len == FLT_MAX ) - { - dx = dy = dz = 0.01f; // one centimeter - } - else - { - if ( dx < EPSILON ) dx = len * 0.05f; // 1/5th the shortest non-zero edge. - if ( dy < EPSILON ) dy = len * 0.05f; - if ( dz < EPSILON ) dz = len * 0.05f; - } - - float x1 = center[0] - dx; - float x2 = center[0] + dx; - - float y1 = center[1] - dy; - float y2 = center[1] + dy; - - float z1 = center[2] - dz; - float z2 = center[2] + dz; - - addPoint(vcount,vertices,x1,y1,z1); - addPoint(vcount,vertices,x2,y1,z1); - addPoint(vcount,vertices,x2,y2,z1); - addPoint(vcount,vertices,x1,y2,z1); - addPoint(vcount,vertices,x1,y1,z2); - addPoint(vcount,vertices,x2,y1,z2); - addPoint(vcount,vertices,x2,y2,z2); - addPoint(vcount,vertices,x1,y2,z2); - - return true; // return cube - - - } - else - { - if ( scale ) - { - scale[0] = dx; - scale[1] = dy; - scale[2] = dz; - - recip[0] = 1 / dx; - recip[1] = 1 / dy; - recip[2] = 1 / dz; - - center[0]*=recip[0]; - center[1]*=recip[1]; - center[2]*=recip[2]; - - } - - } - - - - vtx = (const char *) svertices; - - for (unsigned int i=0; i dist2 ) - { - v[0] = px; - v[1] = py; - v[2] = pz; - } - - break; - } - } - - if ( j == vcount ) - { - float *dest = &vertices[vcount*3]; - dest[0] = px; - dest[1] = py; - dest[2] = pz; - vcount++; - } - } - } - - // ok..now make sure we didn't prune so many vertices it is now invalid. - if ( 1 ) - { - float bmin[3] = { FLT_MAX, FLT_MAX, FLT_MAX }; - float bmax[3] = { -FLT_MAX, -FLT_MAX, -FLT_MAX }; - - for (unsigned int i=0; i bmax[j] ) bmax[j] = p[j]; - } - } - - float dx = bmax[0] - bmin[0]; - float dy = bmax[1] - bmin[1]; - float dz = bmax[2] - bmin[2]; - - if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || vcount < 3) - { - float cx = dx*0.5f + bmin[0]; - float cy = dy*0.5f + bmin[1]; - float cz = dz*0.5f + bmin[2]; - - float len = FLT_MAX; - - if ( dx >= EPSILON && dx < len ) len = dx; - if ( dy >= EPSILON && dy < len ) len = dy; - if ( dz >= EPSILON && dz < len ) len = dz; - - if ( len == FLT_MAX ) - { - dx = dy = dz = 0.01f; // one centimeter - } - else - { - if ( dx < EPSILON ) dx = len * 0.05f; // 1/5th the shortest non-zero edge. - if ( dy < EPSILON ) dy = len * 0.05f; - if ( dz < EPSILON ) dz = len * 0.05f; - } - - float x1 = cx - dx; - float x2 = cx + dx; - - float y1 = cy - dy; - float y2 = cy + dy; - - float z1 = cz - dz; - float z2 = cz + dz; - - vcount = 0; // add box - - addPoint(vcount,vertices,x1,y1,z1); - addPoint(vcount,vertices,x2,y1,z1); - addPoint(vcount,vertices,x2,y2,z1); - addPoint(vcount,vertices,x1,y2,z1); - addPoint(vcount,vertices,x1,y1,z2); - addPoint(vcount,vertices,x2,y1,z2); - addPoint(vcount,vertices,x2,y2,z2); - addPoint(vcount,vertices,x1,y2,z2); - - return true; - } - } - - return true; -} - -void HullLibrary::BringOutYourDead(const float *verts,unsigned int vcount, float *overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount) -{ - unsigned int *used = (unsigned int *)malloc(sizeof(unsigned int)*vcount); - memset(used,0,sizeof(unsigned int)*vcount); - - ocount = 0; - - for (unsigned int i=0; i= 0 && v < vcount ); - - if ( used[v] ) // if already remapped - { - indices[i] = used[v]-1; // index to new array - } - else - { - - indices[i] = ocount; // new index mapping - - overts[ocount*3+0] = verts[v*3+0]; // copy old vert to new vert array - overts[ocount*3+1] = verts[v*3+1]; - overts[ocount*3+2] = verts[v*3+2]; - - ocount++; // increment output vert count - - assert( ocount >=0 && ocount <= vcount ); - - used[v] = ocount; // assign new index remapping - } - } - - free(used); -} - -} +#include "float_math.h" + +#include +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "cd_hull.h" + +using namespace ConvexDecomposition; + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +#define PI 3.14159264f + +//***************************************************** +//***************************************************** +//********* Stan Melax's vector math template needed +//********* to use his hull building code. +//***************************************************** +//***************************************************** + +#define DEG2RAD (PI / 180.0f) +#define RAD2DEG (180.0f / PI) +#define SQRT_OF_2 (1.4142135f) +#define OFFSET(Class,Member) (((char*) (&(((Class*)NULL)-> Member )))- ((char*)NULL)) + +namespace ConvexDecomposition +{ + + +int argmin(float a[],int n); +float sqr(float a); +float clampf(float a) ; +float Round(float a,float precision); +float Interpolate(const float &f0,const float &f1,float alpha) ; + +template +void Swap(T &a,T &b) +{ + T tmp = a; + a=b; + b=tmp; +} + + + +template +T Max(const T &a,const T &b) +{ + return (a>b)?a:b; +} + +template +T Min(const T &a,const T &b) +{ + return (a=0&&i<2);return ((float*)this)[i];} + const float& operator[](int i) const {assert(i>=0&&i<2);return ((float*)this)[i];} +}; +inline float2 operator-( const float2& a, const float2& b ){return float2(a.x-b.x,a.y-b.y);} +inline float2 operator+( const float2& a, const float2& b ){return float2(a.x+b.x,a.y+b.y);} + +//--------- 3D --------- + +class float3 // 3D +{ + public: + float x,y,z; + float3(){x=0;y=0;z=0;}; + float3(float _x,float _y,float _z){x=_x;y=_y;z=_z;}; + //operator float *() { return &x;}; + float& operator[](int i) {assert(i>=0&&i<3);return ((float*)this)[i];} + const float& operator[](int i) const {assert(i>=0&&i<3);return ((float*)this)[i];} +# ifdef PLUGIN_3DSMAX + float3(const Point3 &p):x(p.x),y(p.y),z(p.z){} + operator Point3(){return *((Point3*)this);} +# endif +}; + + +float3& operator+=( float3 &a, const float3& b ); +float3& operator-=( float3 &a ,const float3& b ); +float3& operator*=( float3 &v ,const float s ); +float3& operator/=( float3 &v, const float s ); + +float magnitude( const float3& v ); +float3 normalize( const float3& v ); +float3 safenormalize(const float3 &v); +float3 vabs(const float3 &v); +float3 operator+( const float3& a, const float3& b ); +float3 operator-( const float3& a, const float3& b ); +float3 operator-( const float3& v ); +float3 operator*( const float3& v, const float s ); +float3 operator*( const float s, const float3& v ); +float3 operator/( const float3& v, const float s ); +inline int operator==( const float3 &a, const float3 &b ) { return (a.x==b.x && a.y==b.y && a.z==b.z); } +inline int operator!=( const float3 &a, const float3 &b ) { return (a.x!=b.x || a.y!=b.y || a.z!=b.z); } +// due to ambiguity and inconsistent standards ther are no overloaded operators for mult such as va*vb. +float dot( const float3& a, const float3& b ); +float3 cmul( const float3 &a, const float3 &b); +float3 cross( const float3& a, const float3& b ); +float3 Interpolate(const float3 &v0,const float3 &v1,float alpha); +float3 Round(const float3& a,float precision); +float3 VectorMax(const float3 &a, const float3 &b); +float3 VectorMin(const float3 &a, const float3 &b); + + + +class float3x3 +{ + public: + float3 x,y,z; // the 3 rows of the Matrix + float3x3(){} + float3x3(float xx,float xy,float xz,float yx,float yy,float yz,float zx,float zy,float zz):x(xx,xy,xz),y(yx,yy,yz),z(zx,zy,zz){} + float3x3(float3 _x,float3 _y,float3 _z):x(_x),y(_y),z(_z){} + float3& operator[](int i) {assert(i>=0&&i<3);return (&x)[i];} + const float3& operator[](int i) const {assert(i>=0&&i<3);return (&x)[i];} + float& operator()(int r, int c) {assert(r>=0&&r<3&&c>=0&&c<3);return ((&x)[r])[c];} + const float& operator()(int r, int c) const {assert(r>=0&&r<3&&c>=0&&c<3);return ((&x)[r])[c];} +}; +float3x3 Transpose( const float3x3& m ); +float3 operator*( const float3& v , const float3x3& m ); +float3 operator*( const float3x3& m , const float3& v ); +float3x3 operator*( const float3x3& m , const float& s ); +float3x3 operator*( const float3x3& ma, const float3x3& mb ); +float3x3 operator/( const float3x3& a, const float& s ) ; +float3x3 operator+( const float3x3& a, const float3x3& b ); +float3x3 operator-( const float3x3& a, const float3x3& b ); +float3x3 &operator+=( float3x3& a, const float3x3& b ); +float3x3 &operator-=( float3x3& a, const float3x3& b ); +float3x3 &operator*=( float3x3& a, const float& s ); +float Determinant(const float3x3& m ); +float3x3 Inverse(const float3x3& a); // its just 3x3 so we simply do that cofactor method + + +//-------- 4D Math -------- + +class float4 +{ +public: + float x,y,z,w; + float4(){x=0;y=0;z=0;w=0;}; + float4(float _x,float _y,float _z,float _w){x=_x;y=_y;z=_z;w=_w;} + float4(const float3 &v,float _w){x=v.x;y=v.y;z=v.z;w=_w;} + //operator float *() { return &x;}; + float& operator[](int i) {assert(i>=0&&i<4);return ((float*)this)[i];} + const float& operator[](int i) const {assert(i>=0&&i<4);return ((float*)this)[i];} + const float3& xyz() const { return *((float3*)this);} + float3& xyz() { return *((float3*)this);} +}; + + +struct D3DXMATRIX; + +class float4x4 +{ + public: + float4 x,y,z,w; // the 4 rows + float4x4(){} + float4x4(const float4 &_x, const float4 &_y, const float4 &_z, const float4 &_w):x(_x),y(_y),z(_z),w(_w){} + float4x4(float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 ) + :x(m00,m01,m02,m03),y(m10,m11,m12,m13),z(m20,m21,m22,m23),w(m30,m31,m32,m33){} + float& operator()(int r, int c) {assert(r>=0&&r<4&&c>=0&&c<4);return ((&x)[r])[c];} + const float& operator()(int r, int c) const {assert(r>=0&&r<4&&c>=0&&c<4);return ((&x)[r])[c];} + operator float* () {return &x.x;} + operator const float* () const {return &x.x;} + operator struct D3DXMATRIX* () { return (struct D3DXMATRIX*) this;} + operator const struct D3DXMATRIX* () const { return (struct D3DXMATRIX*) this;} +}; + + +int operator==( const float4 &a, const float4 &b ); +float4 Homogenize(const float3 &v3,const float &w=1.0f); // Turns a 3D float3 4D vector4 by appending w +float4 cmul( const float4 &a, const float4 &b); +float4 operator*( const float4 &v, float s); +float4 operator*( float s, const float4 &v); +float4 operator+( const float4 &a, const float4 &b); +float4 operator-( const float4 &a, const float4 &b); +float4x4 operator*( const float4x4& a, const float4x4& b ); +float4 operator*( const float4& v, const float4x4& m ); +float4x4 Inverse(const float4x4 &m); +float4x4 MatrixRigidInverse(const float4x4 &m); +float4x4 MatrixTranspose(const float4x4 &m); +float4x4 MatrixPerspectiveFov(float fovy, float Aspect, float zn, float zf ); +float4x4 MatrixTranslation(const float3 &t); +float4x4 MatrixRotationZ(const float angle_radians); +float4x4 MatrixLookAt(const float3& eye, const float3& at, const float3& up); +int operator==( const float4x4 &a, const float4x4 &b ); + + +//-------- Quaternion ------------ + +class Quaternion :public float4 +{ + public: + Quaternion() { x = y = z = 0.0f; w = 1.0f; } + Quaternion( float3 v, float t ) { v = normalize(v); w = cosf(t/2.0f); v = v*sinf(t/2.0f); x = v.x; y = v.y; z = v.z; } + Quaternion(float _x, float _y, float _z, float _w){x=_x;y=_y;z=_z;w=_w;} + float angle() const { return acosf(w)*2.0f; } + float3 axis() const { float3 a(x,y,z); if(fabsf(angle())<0.0000001f) return float3(1,0,0); return a*(1/sinf(angle()/2.0f)); } + float3 xdir() const { return float3( 1-2*(y*y+z*z), 2*(x*y+w*z), 2*(x*z-w*y) ); } + float3 ydir() const { return float3( 2*(x*y-w*z),1-2*(x*x+z*z), 2*(y*z+w*x) ); } + float3 zdir() const { return float3( 2*(x*z+w*y), 2*(y*z-w*x),1-2*(x*x+y*y) ); } + float3x3 getmatrix() const { return float3x3( xdir(), ydir(), zdir() ); } + operator float3x3() { return getmatrix(); } + void Normalize(); +}; + +Quaternion& operator*=(Quaternion& a, float s ); +Quaternion operator*( const Quaternion& a, float s ); +Quaternion operator*( const Quaternion& a, const Quaternion& b); +Quaternion operator+( const Quaternion& a, const Quaternion& b ); +Quaternion normalize( Quaternion a ); +float dot( const Quaternion &a, const Quaternion &b ); +float3 operator*( const Quaternion& q, const float3& v ); +float3 operator*( const float3& v, const Quaternion& q ); +Quaternion slerp( Quaternion a, const Quaternion& b, float interp ); +Quaternion Interpolate(const Quaternion &q0,const Quaternion &q1,float alpha); +Quaternion RotationArc(float3 v0, float3 v1 ); // returns quat q where q*v0=v1 +Quaternion Inverse(const Quaternion &q); +float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v); + + +//------ Euler Angle ----- + +Quaternion YawPitchRoll( float yaw, float pitch, float roll ); +float Yaw( const Quaternion& q ); +float Pitch( const Quaternion& q ); +float Roll( Quaternion q ); +float Yaw( const float3& v ); +float Pitch( const float3& v ); + + +//------- Plane ---------- + +class Plane +{ + public: + float3 normal; + float dist; // distance below origin - the D from plane equasion Ax+By+Cz+D=0 + Plane(const float3 &n,float d):normal(n),dist(d){} + Plane():normal(),dist(0){} + void Transform(const float3 &position, const Quaternion &orientation); +}; + +inline Plane PlaneFlip(const Plane &plane){return Plane(-plane.normal,-plane.dist);} +inline int operator==( const Plane &a, const Plane &b ) { return (a.normal==b.normal && a.dist==b.dist); } +inline int coplanar( const Plane &a, const Plane &b ) { return (a==b || a==PlaneFlip(b)); } + + +//--------- Utility Functions ------ + +float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1); +float3 PlaneProject(const Plane &plane, const float3 &point); +float3 LineProject(const float3 &p0, const float3 &p1, const float3 &a); // projects a onto infinite line p0p1 +float LineProjectTime(const float3 &p0, const float3 &p1, const float3 &a); +float3 ThreePlaneIntersection(const Plane &p0,const Plane &p1, const Plane &p2); +int PolyHit(const float3 *vert,const int n,const float3 &v0, const float3 &v1, float3 *impact=NULL, float3 *normal=NULL); +int BoxInside(const float3 &p,const float3 &bmin, const float3 &bmax) ; +int BoxIntersect(const float3 &v0, const float3 &v1, const float3 &bmin, const float3 &bmax, float3 *impact); +float DistanceBetweenLines(const float3 &ustart, const float3 &udir, const float3 &vstart, const float3 &vdir, float3 *upoint=NULL, float3 *vpoint=NULL); +float3 TriNormal(const float3 &v0, const float3 &v1, const float3 &v2); +float3 NormalOf(const float3 *vert, const int n); +Quaternion VirtualTrackBall(const float3 &cop, const float3 &cor, const float3 &dir0, const float3 &dir1); + + +float sqr(float a) {return a*a;} +float clampf(float a) {return Min(1.0f,Max(0.0f,a));} + + +float Round(float a,float precision) +{ + return floorf(0.5f+a/precision)*precision; +} + + +float Interpolate(const float &f0,const float &f1,float alpha) +{ + return f0*(1-alpha) + f1*alpha; +} + + +int argmin(float a[],int n) +{ + int r=0; + for(int i=1;i=1.0) { + return a; + } + float theta = acosf(d); + if(theta==0.0f) { return(a);} + return a*(sinf(theta-interp*theta)/sinf(theta)) + b*(sinf(interp*theta)/sinf(theta)); +} + + +Quaternion Interpolate(const Quaternion &q0,const Quaternion &q1,float alpha) { + return slerp(q0,q1,alpha); +} + + +Quaternion YawPitchRoll( float yaw, float pitch, float roll ) +{ + roll *= DEG2RAD; + yaw *= DEG2RAD; + pitch *= DEG2RAD; + return Quaternion(float3(0.0f,0.0f,1.0f),yaw)*Quaternion(float3(1.0f,0.0f,0.0f),pitch)*Quaternion(float3(0.0f,1.0f,0.0f),roll); +} + +float Yaw( const Quaternion& q ) +{ + static float3 v; + v=q.ydir(); + return (v.y==0.0&&v.x==0.0) ? 0.0f: atan2f(-v.x,v.y)*RAD2DEG; +} + +float Pitch( const Quaternion& q ) +{ + static float3 v; + v=q.ydir(); + return atan2f(v.z,sqrtf(sqr(v.x)+sqr(v.y)))*RAD2DEG; +} + +float Roll( Quaternion q ) +{ + q = Quaternion(float3(0.0f,0.0f,1.0f),-Yaw(q)*DEG2RAD) *q; + q = Quaternion(float3(1.0f,0.0f,0.0f),-Pitch(q)*DEG2RAD) *q; + return atan2f(-q.xdir().z,q.xdir().x)*RAD2DEG; +} + +float Yaw( const float3& v ) +{ + return (v.y==0.0&&v.x==0.0) ? 0.0f: atan2f(-v.x,v.y)*RAD2DEG; +} + +float Pitch( const float3& v ) +{ + return atan2f(v.z,sqrtf(sqr(v.x)+sqr(v.y)))*RAD2DEG; +} + + +//------------- Plane -------------- + + +void Plane::Transform(const float3 &position, const Quaternion &orientation) { + // Transforms the plane to the space defined by the + // given position/orientation. + static float3 newnormal; + static float3 origin; + + newnormal = Inverse(orientation)*normal; + origin = Inverse(orientation)*(-normal*dist - position); + + normal = newnormal; + dist = -dot(newnormal, origin); +} + + + + +//--------- utility functions ------------- + +// RotationArc() +// Given two vectors v0 and v1 this function +// returns quaternion q where q*v0==v1. +// Routine taken from game programming gems. +Quaternion RotationArc(float3 v0,float3 v1){ + static Quaternion q; + v0 = normalize(v0); // Comment these two lines out if you know its not needed. + v1 = normalize(v1); // If vector is already unit length then why do it again? + float3 c = cross(v0,v1); + float d = dot(v0,v1); + if(d<=-1.0f) { return Quaternion(1,0,0,0);} // 180 about x axis + float s = sqrtf((1+d)*2); + q.x = c.x / s; + q.y = c.y / s; + q.z = c.z / s; + q.w = s /2.0f; + return q; +} + + +float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v) +{ + // builds a 4x4 transformation matrix based on orientation q and translation v + float qx2 = q.x*q.x; + float qy2 = q.y*q.y; + float qz2 = q.z*q.z; + + float qxqy = q.x*q.y; + float qxqz = q.x*q.z; + float qxqw = q.x*q.w; + float qyqz = q.y*q.z; + float qyqw = q.y*q.w; + float qzqw = q.z*q.w; + + return float4x4( + 1-2*(qy2+qz2), + 2*(qxqy+qzqw), + 2*(qxqz-qyqw), + 0 , + 2*(qxqy-qzqw), + 1-2*(qx2+qz2), + 2*(qyqz+qxqw), + 0 , + 2*(qxqz+qyqw), + 2*(qyqz-qxqw), + 1-2*(qx2+qy2), + 0 , + v.x , + v.y , + v.z , + 1.0f ); +} + + +float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1) +{ + // returns the point where the line p0-p1 intersects the plane n&d + static float3 dif; + dif = p1-p0; + float dn= dot(plane.normal,dif); + float t = -(plane.dist+dot(plane.normal,p0) )/dn; + return p0 + (dif*t); +} + +float3 PlaneProject(const Plane &plane, const float3 &point) +{ + return point - plane.normal * (dot(point,plane.normal)+plane.dist); +} + +float3 LineProject(const float3 &p0, const float3 &p1, const float3 &a) +{ + float3 w; + w = p1-p0; + float t= dot(w,(a-p0)) / (sqr(w.x)+sqr(w.y)+sqr(w.z)); + return p0+ w*t; +} + + +float LineProjectTime(const float3 &p0, const float3 &p1, const float3 &a) +{ + float3 w; + w = p1-p0; + float t= dot(w,(a-p0)) / (sqr(w.x)+sqr(w.y)+sqr(w.z)); + return t; +} + + + +float3 TriNormal(const float3 &v0, const float3 &v1, const float3 &v2) +{ + // return the normal of the triangle + // inscribed by v0, v1, and v2 + float3 cp=cross(v1-v0,v2-v1); + float m=magnitude(cp); + if(m==0) return float3(1,0,0); + return cp*(1.0f/m); +} + + + +int BoxInside(const float3 &p, const float3 &bmin, const float3 &bmax) +{ + return (p.x >= bmin.x && p.x <=bmax.x && + p.y >= bmin.y && p.y <=bmax.y && + p.z >= bmin.z && p.z <=bmax.z ); +} + + +int BoxIntersect(const float3 &v0, const float3 &v1, const float3 &bmin, const float3 &bmax,float3 *impact) +{ + if(BoxInside(v0,bmin,bmax)) + { + *impact=v0; + return 1; + } + if(v0.x<=bmin.x && v1.x>=bmin.x) + { + float a = (bmin.x-v0.x)/(v1.x-v0.x); + //v.x = bmin.x; + float vy = (1-a) *v0.y + a*v1.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vy>=bmin.y && vy<=bmax.y && vz>=bmin.z && vz<=bmax.z) + { + impact->x = bmin.x; + impact->y = vy; + impact->z = vz; + return 1; + } + } + else if(v0.x >= bmax.x && v1.x <= bmax.x) + { + float a = (bmax.x-v0.x)/(v1.x-v0.x); + //v.x = bmax.x; + float vy = (1-a) *v0.y + a*v1.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vy>=bmin.y && vy<=bmax.y && vz>=bmin.z && vz<=bmax.z) + { + impact->x = bmax.x; + impact->y = vy; + impact->z = vz; + return 1; + } + } + if(v0.y<=bmin.y && v1.y>=bmin.y) + { + float a = (bmin.y-v0.y)/(v1.y-v0.y); + float vx = (1-a) *v0.x + a*v1.x; + //v.y = bmin.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vx>=bmin.x && vx<=bmax.x && vz>=bmin.z && vz<=bmax.z) + { + impact->x = vx; + impact->y = bmin.y; + impact->z = vz; + return 1; + } + } + else if(v0.y >= bmax.y && v1.y <= bmax.y) + { + float a = (bmax.y-v0.y)/(v1.y-v0.y); + float vx = (1-a) *v0.x + a*v1.x; + // vy = bmax.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vx>=bmin.x && vx<=bmax.x && vz>=bmin.z && vz<=bmax.z) + { + impact->x = vx; + impact->y = bmax.y; + impact->z = vz; + return 1; + } + } + if(v0.z<=bmin.z && v1.z>=bmin.z) + { + float a = (bmin.z-v0.z)/(v1.z-v0.z); + float vx = (1-a) *v0.x + a*v1.x; + float vy = (1-a) *v0.y + a*v1.y; + // v.z = bmin.z; + if(vy>=bmin.y && vy<=bmax.y && vx>=bmin.x && vx<=bmax.x) + { + impact->x = vx; + impact->y = vy; + impact->z = bmin.z; + return 1; + } + } + else if(v0.z >= bmax.z && v1.z <= bmax.z) + { + float a = (bmax.z-v0.z)/(v1.z-v0.z); + float vx = (1-a) *v0.x + a*v1.x; + float vy = (1-a) *v0.y + a*v1.y; + // v.z = bmax.z; + if(vy>=bmin.y && vy<=bmax.y && vx>=bmin.x && vx<=bmax.x) + { + impact->x = vx; + impact->y = vy; + impact->z = bmax.z; + return 1; + } + } + return 0; +} + + +float DistanceBetweenLines(const float3 &ustart, const float3 &udir, const float3 &vstart, const float3 &vdir, float3 *upoint, float3 *vpoint) +{ + static float3 cp; + cp = normalize(cross(udir,vdir)); + + float distu = -dot(cp,ustart); + float distv = -dot(cp,vstart); + float dist = (float)fabs(distu-distv); + if(upoint) + { + Plane plane; + plane.normal = normalize(cross(vdir,cp)); + plane.dist = -dot(plane.normal,vstart); + *upoint = PlaneLineIntersection(plane,ustart,ustart+udir); + } + if(vpoint) + { + Plane plane; + plane.normal = normalize(cross(udir,cp)); + plane.dist = -dot(plane.normal,ustart); + *vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir); + } + return dist; +} + + +Quaternion VirtualTrackBall(const float3 &cop, const float3 &cor, const float3 &dir1, const float3 &dir2) +{ + // routine taken from game programming gems. + // Implement track ball functionality to spin stuf on the screen + // cop center of projection + // cor center of rotation + // dir1 old mouse direction + // dir2 new mouse direction + // pretend there is a sphere around cor. Then find the points + // where dir1 and dir2 intersect that sphere. Find the + // rotation that takes the first point to the second. + float m; + // compute plane + float3 nrml = cor - cop; + float fudgefactor = 1.0f/(magnitude(nrml) * 0.25f); // since trackball proportional to distance from cop + nrml = normalize(nrml); + float dist = -dot(nrml,cor); + float3 u= PlaneLineIntersection(Plane(nrml,dist),cop,cop+dir1); + u=u-cor; + u=u*fudgefactor; + m= magnitude(u); + if(m>1) + { + u/=m; + } + else + { + u=u - (nrml * sqrtf(1-m*m)); + } + float3 v= PlaneLineIntersection(Plane(nrml,dist),cop,cop+dir2); + v=v-cor; + v=v*fudgefactor; + m= magnitude(v); + if(m>1) + { + v/=m; + } + else + { + v=v - (nrml * sqrtf(1-m*m)); + } + return RotationArc(u,v); +} + + +int countpolyhit=0; +int PolyHit(const float3 *vert, const int n, const float3 &v0, const float3 &v1, float3 *impact, float3 *normal) +{ + countpolyhit++; + int i; + float3 nrml(0,0,0); + for(i=0;i0) + { + return 0; + } + + static float3 the_point; + // By using the cached plane distances d0 and d1 + // we can optimize the following: + // the_point = planelineintersection(nrml,dist,v0,v1); + float a = d0/(d0-d1); + the_point = v0*(1-a) + v1*a; + + + int inside=1; + for(int j=0;inside && j= 0.0); + } + if(inside) + { + if(normal){*normal=nrml;} + if(impact){*impact=the_point;} + } + return inside; +} + +//************************************************************************** +//************************************************************************** +//*** Stan Melax's array template, needed to compile his hull generation code +//************************************************************************** +//************************************************************************** + +template class ArrayRet; +template class Array { + public: + Array(int s=0); + Array(Array &array); + Array(ArrayRet &array); + ~Array(); + void allocate(int s); + void SetSize(int s); + void Pack(); + Type& Add(Type); + void AddUnique(Type); + int Contains(Type); + void Insert(Type,int); + int IndexOf(Type); + void Remove(Type); + void DelIndex(int i); + Type * element; + int count; + int array_size; + const Type &operator[](int i) const { assert(i>=0 && i=0 && i &operator=(Array &array); + Array &operator=(ArrayRet &array); + // operator ArrayRet &() { return *(ArrayRet *)this;} // this worked but i suspect could be dangerous +}; + +template class ArrayRet:public Array +{ +}; + +template Array::Array(int s) +{ + count=0; + array_size = 0; + element = NULL; + if(s) + { + allocate(s); + } +} + + +template Array::Array(Array &array) +{ + count=0; + array_size = 0; + element = NULL; + for(int i=0;i Array::Array(ArrayRet &array) +{ + *this = array; +} +template Array &Array::operator=(ArrayRet &array) +{ + count=array.count; + array_size = array.array_size; + element = array.element; + array.element=NULL; + array.count=0; + array.array_size=0; + return *this; +} + + +template Array &Array::operator=(Array &array) +{ + count=0; + for(int i=0;i Array::~Array() +{ + if (element != NULL) + { + free(element); + } + count=0;array_size=0;element=NULL; +} + +template void Array::allocate(int s) +{ + assert(s>0); + assert(s>=count); + Type *old = element; + array_size =s; + element = (Type *) malloc( sizeof(Type)*array_size); + assert(element); + for(int i=0;i void Array::SetSize(int s) +{ + if(s==0) + { + if(element) + { + free(element); + element = NULL; + } + array_size = s; + } + else + { + allocate(s); + } + count=s; +} + +template void Array::Pack() +{ + allocate(count); +} + +template Type& Array::Add(Type t) +{ + assert(count<=array_size); + if(count==array_size) + { + allocate((array_size)?array_size *2:16); + } + element[count++] = t; + return element[count-1]; +} + +template int Array::Contains(Type t) +{ + int i; + int found=0; + for(i=0;i void Array::AddUnique(Type t) +{ + if(!Contains(t)) Add(t); +} + + +template void Array::DelIndex(int i) +{ + assert(i void Array::Remove(Type t) +{ + int i; + for(i=0;i void Array::Insert(Type t,int k) +{ + int i=count; + Add(t); // to allocate space + while(i>k) + { + element[i]=element[i-1]; + i--; + } + assert(i==k); + element[k]=t; +} + + +template int Array::IndexOf(Type t) +{ + int i; + for(i=0;i vertices; + Array edges; + Array facets; + ConvexH(int vertices_size,int edges_size,int facets_size); +}; + +typedef ConvexH::HalfEdge HalfEdge; + +ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size) + :vertices(vertices_size) + ,edges(edges_size) + ,facets(facets_size) +{ + vertices.count=vertices_size; + edges.count = edges_size; + facets.count = facets_size; +} + +ConvexH *ConvexHDup(ConvexH *src) { + ConvexH *dst = new ConvexH(src->vertices.count,src->edges.count,src->facets.count); + memcpy(dst->vertices.element,src->vertices.element,sizeof(float3)*src->vertices.count); + memcpy(dst->edges.element,src->edges.element,sizeof(HalfEdge)*src->edges.count); + memcpy(dst->facets.element,src->facets.element,sizeof(Plane)*src->facets.count); + return dst; +} + + +int PlaneTest(const Plane &p, const REAL3 &v) { + REAL a = dot(v,p.normal)+p.dist; + int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR); + return flag; +} + +int SplitTest(ConvexH &convex,const Plane &plane) { + int flag=0; + for(int i=0;i= convex.edges.count || convex.edges[inext].p != convex.edges[i].p) { + inext = estart; + } + assert(convex.edges[inext].p == convex.edges[i].p); + int nb = convex.edges[i].ea; + assert(nb!=255); + if(nb==255 || nb==-1) return 0; + assert(nb!=-1); + assert(i== convex.edges[nb].ea); + } + for(i=0;i= convex.edges.count || convex.edges[i1].p != convex.edges[i].p) { + i1 = estart; + } + int i2 = i1+1; + if(i2>= convex.edges.count || convex.edges[i2].p != convex.edges[i].p) { + i2 = estart; + } + if(i==i2) continue; // i sliced tangent to an edge and created 2 meaningless edges + REAL3 localnormal = TriNormal(convex.vertices[convex.edges[i ].v], + convex.vertices[convex.edges[i1].v], + convex.vertices[convex.edges[i2].v]); + assert(dot(localnormal,convex.facets[convex.edges[i].p].normal)>0); + if(dot(localnormal,convex.facets[convex.edges[i].p].normal)<=0)return 0; + } + return 1; +} + +// back to back quads +ConvexH *test_btbq() { + ConvexH *convex = new ConvexH(4,8,2); + convex->vertices[0] = REAL3(0,0,0); + convex->vertices[1] = REAL3(1,0,0); + convex->vertices[2] = REAL3(1,1,0); + convex->vertices[3] = REAL3(0,1,0); + convex->facets[0] = Plane(REAL3(0,0,1),0); + convex->facets[1] = Plane(REAL3(0,0,-1),0); + convex->edges[0] = HalfEdge(7,0,0); + convex->edges[1] = HalfEdge(6,1,0); + convex->edges[2] = HalfEdge(5,2,0); + convex->edges[3] = HalfEdge(4,3,0); + + convex->edges[4] = HalfEdge(3,0,1); + convex->edges[5] = HalfEdge(2,3,1); + convex->edges[6] = HalfEdge(1,2,1); + convex->edges[7] = HalfEdge(0,1,1); + AssertIntact(*convex); + return convex; +} +ConvexH *test_cube() { + ConvexH *convex = new ConvexH(8,24,6); + convex->vertices[0] = REAL3(0,0,0); + convex->vertices[1] = REAL3(0,0,1); + convex->vertices[2] = REAL3(0,1,0); + convex->vertices[3] = REAL3(0,1,1); + convex->vertices[4] = REAL3(1,0,0); + convex->vertices[5] = REAL3(1,0,1); + convex->vertices[6] = REAL3(1,1,0); + convex->vertices[7] = REAL3(1,1,1); + + convex->facets[0] = Plane(REAL3(-1,0,0),0); + convex->facets[1] = Plane(REAL3(1,0,0),-1); + convex->facets[2] = Plane(REAL3(0,-1,0),0); + convex->facets[3] = Plane(REAL3(0,1,0),-1); + convex->facets[4] = Plane(REAL3(0,0,-1),0); + convex->facets[5] = Plane(REAL3(0,0,1),-1); + + convex->edges[0 ] = HalfEdge(11,0,0); + convex->edges[1 ] = HalfEdge(23,1,0); + convex->edges[2 ] = HalfEdge(15,3,0); + convex->edges[3 ] = HalfEdge(16,2,0); + + convex->edges[4 ] = HalfEdge(13,6,1); + convex->edges[5 ] = HalfEdge(21,7,1); + convex->edges[6 ] = HalfEdge( 9,5,1); + convex->edges[7 ] = HalfEdge(18,4,1); + + convex->edges[8 ] = HalfEdge(19,0,2); + convex->edges[9 ] = HalfEdge( 6,4,2); + convex->edges[10] = HalfEdge(20,5,2); + convex->edges[11] = HalfEdge( 0,1,2); + + convex->edges[12] = HalfEdge(22,3,3); + convex->edges[13] = HalfEdge( 4,7,3); + convex->edges[14] = HalfEdge(17,6,3); + convex->edges[15] = HalfEdge( 2,2,3); + + convex->edges[16] = HalfEdge( 3,0,4); + convex->edges[17] = HalfEdge(14,2,4); + convex->edges[18] = HalfEdge( 7,6,4); + convex->edges[19] = HalfEdge( 8,4,4); + + convex->edges[20] = HalfEdge(10,1,5); + convex->edges[21] = HalfEdge( 5,5,5); + convex->edges[22] = HalfEdge(12,7,5); + convex->edges[23] = HalfEdge( 1,3,5); + + + return convex; +} +ConvexH *ConvexHMakeCube(const REAL3 &bmin, const REAL3 &bmax) { + ConvexH *convex = test_cube(); + convex->vertices[0] = REAL3(bmin.x,bmin.y,bmin.z); + convex->vertices[1] = REAL3(bmin.x,bmin.y,bmax.z); + convex->vertices[2] = REAL3(bmin.x,bmax.y,bmin.z); + convex->vertices[3] = REAL3(bmin.x,bmax.y,bmax.z); + convex->vertices[4] = REAL3(bmax.x,bmin.y,bmin.z); + convex->vertices[5] = REAL3(bmax.x,bmin.y,bmax.z); + convex->vertices[6] = REAL3(bmax.x,bmax.y,bmin.z); + convex->vertices[7] = REAL3(bmax.x,bmax.y,bmax.z); + + convex->facets[0] = Plane(REAL3(-1,0,0), bmin.x); + convex->facets[1] = Plane(REAL3(1,0,0), -bmax.x); + convex->facets[2] = Plane(REAL3(0,-1,0), bmin.y); + convex->facets[3] = Plane(REAL3(0,1,0), -bmax.y); + convex->facets[4] = Plane(REAL3(0,0,-1), bmin.z); + convex->facets[5] = Plane(REAL3(0,0,1), -bmax.z); + return convex; +} +ConvexH *ConvexHCrop(ConvexH &convex,const Plane &slice) +{ + int i; + int vertcountunder=0; + int vertcountover =0; + static Array vertscoplanar; // existing vertex members of convex that are coplanar + vertscoplanar.count=0; + static Array edgesplit; // existing edges that members of convex that cross the splitplane + edgesplit.count=0; + + assert(convex.edges.count<480); + + EdgeFlag edgeflag[512]; + VertFlag vertflag[256]; + PlaneFlag planeflag[128]; + HalfEdge tmpunderedges[512]; + Plane tmpunderplanes[128]; + Coplanar coplanaredges[512]; + int coplanaredges_num=0; + + Array createdverts; + // do the side-of-plane tests + for(i=0;i= convex.edges.count || convex.edges[e1].p!=currentplane) { + enextface = e1; + e1=estart; + } + HalfEdge &edge0 = convex.edges[e0]; + HalfEdge &edge1 = convex.edges[e1]; + HalfEdge &edgea = convex.edges[edge0.ea]; + + + planeside |= vertflag[edge0.v].planetest; + //if((vertflag[edge0.v].planetest & vertflag[edge1.v].planetest) == COPLANAR) { + // assert(ecop==-1); + // ecop=e; + //} + + + if(vertflag[edge0.v].planetest == OVER && vertflag[edge1.v].planetest == OVER){ + // both endpoints over plane + edgeflag[e0].undermap = -1; + } + else if((vertflag[edge0.v].planetest | vertflag[edge1.v].planetest) == UNDER) { + // at least one endpoint under, the other coplanar or under + + edgeflag[e0].undermap = under_edge_count; + tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; + tmpunderedges[under_edge_count].p = underplanescount; + if(edge0.ea < e0) { + // connect the neighbors + assert(edgeflag[edge0.ea].undermap !=-1); + tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; + tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; + } + under_edge_count++; + } + else if((vertflag[edge0.v].planetest | vertflag[edge1.v].planetest) == COPLANAR) { + // both endpoints coplanar + // must check a 3rd point to see if UNDER + int e2 = e1+1; + if(e2>=convex.edges.count || convex.edges[e2].p!=currentplane) { + e2 = estart; + } + assert(convex.edges[e2].p==currentplane); + HalfEdge &edge2 = convex.edges[e2]; + if(vertflag[edge2.v].planetest==UNDER) { + + edgeflag[e0].undermap = under_edge_count; + tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; + tmpunderedges[under_edge_count].p = underplanescount; + tmpunderedges[under_edge_count].ea = -1; + // make sure this edge is added to the "coplanar" list + coplanaredge = under_edge_count; + vout = vertflag[edge0.v].undermap; + vin = vertflag[edge1.v].undermap; + under_edge_count++; + } + else { + edgeflag[e0].undermap = -1; + } + } + else if(vertflag[edge0.v].planetest == UNDER && vertflag[edge1.v].planetest == OVER) { + // first is under 2nd is over + + edgeflag[e0].undermap = under_edge_count; + tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; + tmpunderedges[under_edge_count].p = underplanescount; + if(edge0.ea < e0) { + assert(edgeflag[edge0.ea].undermap !=-1); + // connect the neighbors + tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; + tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; + vout = tmpunderedges[edgeflag[edge0.ea].undermap].v; + } + else { + Plane &p0 = convex.facets[edge0.p]; + Plane &pa = convex.facets[edgea.p]; + createdverts.Add(ThreePlaneIntersection(p0,pa,slice)); + //createdverts.Add(PlaneProject(slice,PlaneLineIntersection(slice,convex.vertices[edge0.v],convex.vertices[edgea.v]))); + //createdverts.Add(PlaneLineIntersection(slice,convex.vertices[edge0.v],convex.vertices[edgea.v])); + vout = vertcountunder++; + } + under_edge_count++; + /// hmmm something to think about: i might be able to output this edge regarless of + // wheter or not we know v-in yet. ok i;ll try this now: + tmpunderedges[under_edge_count].v = vout; + tmpunderedges[under_edge_count].p = underplanescount; + tmpunderedges[under_edge_count].ea = -1; + coplanaredge = under_edge_count; + under_edge_count++; + + if(vin!=-1) { + // we previously processed an edge where we came under + // now we know about vout as well + + // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! + } + + } + else if(vertflag[edge0.v].planetest == COPLANAR && vertflag[edge1.v].planetest == OVER) { + // first is coplanar 2nd is over + + edgeflag[e0].undermap = -1; + vout = vertflag[edge0.v].undermap; + // I hate this but i have to make sure part of this face is UNDER before ouputting this vert + int k=estart; + assert(edge0.p == currentplane); + while(!(planeside&UNDER) && k= vertcountunderold); // for debugging only + } + if(vout!=-1) { + // we previously processed an edge where we went over + // now we know vin too + // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! + } + // output edge + tmpunderedges[under_edge_count].v = vin; + tmpunderedges[under_edge_count].p = underplanescount; + edgeflag[e0].undermap = under_edge_count; + if(e0>edge0.ea) { + assert(edgeflag[edge0.ea].undermap !=-1); + // connect the neighbors + tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; + tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; + } + assert(edgeflag[e0].undermap == under_edge_count); + under_edge_count++; + } + else if(vertflag[edge0.v].planetest == OVER && vertflag[edge1.v].planetest == COPLANAR) { + // first is over next is coplanar + + edgeflag[e0].undermap = -1; + vin = vertflag[edge1.v].undermap; + assert(vin!=-1); + if(vout!=-1) { + // we previously processed an edge where we came under + // now we know both endpoints + // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! + } + + } + else { + assert(0); + } + + + e0=e1; + e1++; // do the modulo at the beginning of the loop + + } while(e0!=estart) ; + e0 = enextface; + if(planeside&UNDER) { + planeflag[currentplane].undermap = underplanescount; + tmpunderplanes[underplanescount] = convex.facets[currentplane]; + underplanescount++; + } + else { + planeflag[currentplane].undermap = 0; + } + if(vout>=0 && (planeside&UNDER)) { + assert(vin>=0); + assert(coplanaredge>=0); + assert(coplanaredge!=511); + coplanaredges[coplanaredges_num].ea = coplanaredge; + coplanaredges[coplanaredges_num].v0 = vin; + coplanaredges[coplanaredges_num].v1 = vout; + coplanaredges_num++; + } + } + + // add the new plane to the mix: + if(coplanaredges_num>0) { + tmpunderplanes[underplanescount++]=slice; + } + for(i=0;i=coplanaredges_num) + { + assert(jvertices.count;j++) + { + d = Max(d,dot(convex->vertices[j],planes[i].normal)+planes[i].dist); + } + if(i==0 || d>md) + { + p=i; + md=d; + } + } + return (md>epsilon)?p:-1; +} + +template +inline int maxdir(const T *p,int count,const T &dir) +{ + assert(count); + int m=0; + float currDotm = dot(p[0], dir); + for(int i=1;i currDotm) + { + currDotm = currDoti; + m=i; + } + } + return m; +} + + +template +int maxdirfiltered(const T *p,int count,const T &dir,Array &allow) +{ + assert(count); + int m=-1; + float currDotm = dot(p[0], dir); + for(int i=0;icurrDotm) + { + currDotm = currDoti; + m=i; + } + } + } + } + assert(m!=-1); + return m; +} + +float3 orth(const float3 &v) +{ + float3 a=cross(v,float3(0,0,1)); + float3 b=cross(v,float3(0,1,0)); + return normalize((magnitude(a)>magnitude(b))?a:b); +} + + +template +int maxdirsterid(const T *p,int count,const T &dir,Array &allow) +{ + int m=-1; + while(m==-1) + { + m = maxdirfiltered(p,count,dir,allow); + if(allow[m]==3) return m; + T u = orth(dir); + T v = cross(u,dir); + int ma=-1; + for(float x = 0.0f ; x<= 360.0f ; x+= 45.0f) + { + float s = sinf(DEG2RAD*(x)); + float c = cosf(DEG2RAD*(x)); + int mb = maxdirfiltered(p,count,dir+(u*s+v*c)*0.025f,allow); + if(ma==m && mb==m) + { + allow[m]=3; + return m; + } + if(ma!=-1 && ma!=mb) // Yuck - this is really ugly + { + int mc = ma; + for(float xx = x-40.0f ; xx <= x ; xx+= 5.0f) + { + float s = sinf(DEG2RAD*(xx)); + float c = cosf(DEG2RAD*(xx)); + int md = maxdirfiltered(p,count,dir+(u*s+v*c)*0.025f,allow); + if(mc==m && md==m) + { + allow[m]=3; + return m; + } + mc=md; + } + } + ma=mb; + } + allow[m]=0; + m=-1; + } + assert(0); + return m; +} + + + + +int operator ==(const int3 &a,const int3 &b) +{ + for(int i=0;i<3;i++) + { + if(a[i]!=b[i]) return 0; + } + return 1; +} + +int3 roll3(int3 a) +{ + int tmp=a[0]; + a[0]=a[1]; + a[1]=a[2]; + a[2]=tmp; + return a; +} +int isa(const int3 &a,const int3 &b) +{ + return ( a==b || roll3(a)==b || a==roll3(b) ); +} +int b2b(const int3 &a,const int3 &b) +{ + return isa(a,int3(b[2],b[1],b[0])); +} +int above(float3* vertices,const int3& t, const float3 &p, float epsilon) +{ + float3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]); + return (dot(n,p-vertices[t[0]]) > epsilon); // EPSILON??? +} +int hasedge(const int3 &t, int a,int b) +{ + for(int i=0;i<3;i++) + { + int i1= (i+1)%3; + if(t[i]==a && t[i1]==b) return 1; + } + return 0; +} +int hasvert(const int3 &t, int v) +{ + return (t[0]==v || t[1]==v || t[2]==v) ; +} +int shareedge(const int3 &a,const int3 &b) +{ + int i; + for(i=0;i<3;i++) + { + int i1= (i+1)%3; + if(hasedge(a,b[i1],b[i])) return 1; + } + return 0; +} + +class btHullTriangle; + +Array tris; + +class btHullTriangle : public int3 +{ +public: + int3 n; + int id; + int vmax; + float rise; + btHullTriangle(int a,int b,int c):int3(a,b,c),n(-1,-1,-1) + { + id = tris.count; + tris.Add(this); + vmax=-1; + rise = 0.0f; + } + ~btHullTriangle() + { + assert(tris[id]==this); + tris[id]=NULL; + } + int &neib(int a,int b); +}; + + +int &btHullTriangle::neib(int a,int b) +{ + static int er=-1; + int i; + for(i=0;i<3;i++) + { + int i1=(i+1)%3; + int i2=(i+2)%3; + if((*this)[i]==a && (*this)[i1]==b) return n[i2]; + if((*this)[i]==b && (*this)[i1]==a) return n[i2]; + } + assert(0); + return er; +} +void b2bfix(btHullTriangle* s,btHullTriangle*t) +{ + int i; + for(i=0;i<3;i++) + { + int i1=(i+1)%3; + int i2=(i+2)%3; + int a = (*s)[i1]; + int b = (*s)[i2]; + assert(tris[s->neib(a,b)]->neib(b,a) == s->id); + assert(tris[t->neib(a,b)]->neib(b,a) == t->id); + tris[s->neib(a,b)]->neib(b,a) = t->neib(b,a); + tris[t->neib(b,a)]->neib(a,b) = s->neib(a,b); + } +} + +void removeb2b(btHullTriangle* s,btHullTriangle*t) +{ + b2bfix(s,t); + delete s; + delete t; +} + +void checkit(btHullTriangle *t) +{ + int i; + assert(tris[t->id]==t); + for(i=0;i<3;i++) + { + int i1=(i+1)%3; + int i2=(i+2)%3; + int a = (*t)[i1]; + int b = (*t)[i2]; + assert(a!=b); + assert( tris[t->n[i]]->neib(b,a) == t->id); + } +} +void extrude(btHullTriangle *t0,int v) +{ + int3 t= *t0; + int n = tris.count; + btHullTriangle* ta = new btHullTriangle(v,t[1],t[2]); + ta->n = int3(t0->n[0],n+1,n+2); + tris[t0->n[0]]->neib(t[1],t[2]) = n+0; + btHullTriangle* tb = new btHullTriangle(v,t[2],t[0]); + tb->n = int3(t0->n[1],n+2,n+0); + tris[t0->n[1]]->neib(t[2],t[0]) = n+1; + btHullTriangle* tc = new btHullTriangle(v,t[0],t[1]); + tc->n = int3(t0->n[2],n+0,n+1); + tris[t0->n[2]]->neib(t[0],t[1]) = n+2; + checkit(ta); + checkit(tb); + checkit(tc); + if(hasvert(*tris[ta->n[0]],v)) removeb2b(ta,tris[ta->n[0]]); + if(hasvert(*tris[tb->n[0]],v)) removeb2b(tb,tris[tb->n[0]]); + if(hasvert(*tris[tc->n[0]],v)) removeb2b(tc,tris[tc->n[0]]); + delete t0; + +} + +btHullTriangle *extrudable(float epsilon) +{ + int i; + btHullTriangle *t=NULL; + for(i=0;iriserise)) + { + t = tris[i]; + } + } + return (t->rise >epsilon)?t:NULL ; +} + +class int4 +{ +public: + int x,y,z,w; + int4(){}; + int4(int _x,int _y, int _z,int _w){x=_x;y=_y;z=_z;w=_w;} + const int& operator[](int i) const {return (&x)[i];} + int& operator[](int i) {return (&x)[i];} +}; + + + +int4 FindSimplex(float3 *verts,int verts_count,Array &allow) +{ + float3 basis[3]; + basis[0] = float3( 0.01f, 0.02f, 1.0f ); + int p0 = maxdirsterid(verts,verts_count, basis[0],allow); + int p1 = maxdirsterid(verts,verts_count,-basis[0],allow); + basis[0] = verts[p0]-verts[p1]; + if(p0==p1 || basis[0]==float3(0,0,0)) + return int4(-1,-1,-1,-1); + basis[1] = cross(float3( 1, 0.02f, 0),basis[0]); + basis[2] = cross(float3(-0.02f, 1, 0),basis[0]); + basis[1] = normalize( (magnitude(basis[1])>magnitude(basis[2])) ? basis[1]:basis[2]); + int p2 = maxdirsterid(verts,verts_count,basis[1],allow); + if(p2 == p0 || p2 == p1) + { + p2 = maxdirsterid(verts,verts_count,-basis[1],allow); + } + if(p2 == p0 || p2 == p1) + return int4(-1,-1,-1,-1); + basis[1] = verts[p2] - verts[p0]; + basis[2] = normalize(cross(basis[1],basis[0])); + int p3 = maxdirsterid(verts,verts_count,basis[2],allow); + if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow); + if(p3==p0||p3==p1||p3==p2) + return int4(-1,-1,-1,-1); + assert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3)); + if(dot(verts[p3]-verts[p0],cross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);} + return int4(p0,p1,p2,p3); +} + +int calchullgen(float3 *verts,int verts_count, int vlimit) +{ + if(verts_count <4) return 0; + if(vlimit==0) vlimit=1000000000; + int j; + float3 bmin(*verts),bmax(*verts); + Array isextreme(verts_count); + Array allow(verts_count); + for(j=0;jn=int3(2,3,1); + btHullTriangle *t1 = new btHullTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0); + btHullTriangle *t2 = new btHullTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3); + btHullTriangle *t3 = new btHullTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2); + isextreme[p[0]]=isextreme[p[1]]=isextreme[p[2]]=isextreme[p[3]]=1; + checkit(t0);checkit(t1);checkit(t2);checkit(t3); + + for(j=0;jvmax<0); + float3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); + t->vmax = maxdirsterid(verts,verts_count,n,allow); + t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]); + } + btHullTriangle *te; + vlimit-=4; + while(vlimit >0 && (te=extrudable(epsilon))) + { + int3 ti=*te; + int v=te->vmax; + assert(!isextreme[v]); // wtf we've already done this vertex + isextreme[v]=1; + //if(v==p0 || v==p1 || v==p2 || v==p3) continue; // done these already + j=tris.count; + while(j--) { + if(!tris[j]) continue; + int3 t=*tris[j]; + if(above(verts,t,verts[v],0.01f*epsilon)) + { + extrude(tris[j],v); + } + } + // now check for those degenerate cases where we have a flipped triangle or a really skinny triangle + j=tris.count; + while(j--) + { + if(!tris[j]) continue; + if(!hasvert(*tris[j],v)) break; + int3 nt=*tris[j]; + if(above(verts,nt,center,0.01f*epsilon) || magnitude(cross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]))< epsilon*epsilon*0.1f ) + { + btHullTriangle *nb = tris[tris[j]->n[0]]; + assert(nb);assert(!hasvert(*nb,v));assert(nb->idvmax>=0) break; + float3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); + t->vmax = maxdirsterid(verts,verts_count,n,allow); + if(isextreme[t->vmax]) + { + t->vmax=-1; // already done that vertex - algorithm needs to be able to terminate. + } + else + { + t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]); + } + } + vlimit --; + } + return 1; +} + +int calchull(float3 *verts,int verts_count, int *&tris_out, int &tris_count,int vlimit) +{ + int rc=calchullgen(verts,verts_count, vlimit) ; + if(!rc) return 0; + Array ts; + for(int i=0;i &planes,float bevangle) +{ + int i,j; + planes.count=0; + int rc = calchullgen(verts,verts_count,vlimit); + if(!rc) return 0; + for(i=0;in[j]id) continue; + btHullTriangle *s = tris[t->n[j]]; + REAL3 snormal = TriNormal(verts[(*s)[0]],verts[(*s)[1]],verts[(*s)[2]]); + if(dot(snormal,p.normal)>=cos(bevangle*DEG2RAD)) continue; + REAL3 n = normalize(snormal+p.normal); + planes.Add(Plane(n,-dot(n,verts[maxdir(verts,verts_count,n)]))); + } + } + + for(i=0;i=0) + { + ConvexH *tmp = c; + c = ConvexHCrop(*tmp,planes[k]); + if(c==NULL) {c=tmp; break;} // might want to debug this case better!!! + if(!AssertIntact(*c)) {c=tmp; break;} // might want to debug this case better too!!! + delete tmp; + } + + assert(AssertIntact(*c)); + //return c; + faces_out = (int*)malloc(sizeof(int)*(1+c->facets.count+c->edges.count)); // new int[1+c->facets.count+c->edges.count]; + faces_count_out=0; + i=0; + faces_out[faces_count_out++]=-1; + k=0; + while(iedges.count) + { + j=1; + while(j+iedges.count && c->edges[i].p==c->edges[i+j].p) { j++; } + faces_out[faces_count_out++]=j; + while(j--) + { + faces_out[faces_count_out++] = c->edges[i].v; + i++; + } + k++; + } + faces_out[0]=k; // number of faces. + assert(k==c->facets.count); + assert(faces_count_out == 1+c->facets.count+c->edges.count); + verts_out = c->vertices.element; // new float3[c->vertices.count]; + verts_count_out = c->vertices.count; + for(i=0;ivertices.count;i++) + { + verts_out[i] = float3(c->vertices[i]); + } + c->vertices.count=c->vertices.array_size=0; c->vertices.element=NULL; + delete c; + return 1; +} + +int overhullv(float3 *verts, int verts_count,int maxplanes, + float3 *&verts_out, int &verts_count_out, int *&faces_out, int &faces_count_out ,float inflate,float bevangle,int vlimit) +{ + if(!verts_count) return 0; + extern int calchullpbev(float3 *verts,int verts_count,int vlimit, Array &planes,float bevangle) ; + Array planes; + int rc=calchullpbev(verts,verts_count,vlimit,planes,bevangle) ; + if(!rc) return 0; + return overhull(planes.element,planes.count,verts,verts_count,maxplanes,verts_out,verts_count_out,faces_out,faces_count_out,inflate); +} + + +bool ComputeHull(unsigned int vcount,const float *vertices,PHullResult &result,unsigned int vlimit,float inflate) +{ + + int index_count; + int *faces; + float3 *verts_out; + int verts_count_out; + + if(inflate==0.0f) + { + int *tris_out; + int tris_count; + int ret = calchull( (float3 *) vertices, (int) vcount, tris_out, tris_count, vlimit ); + if(!ret) return false; + result.mIndexCount = (unsigned int) (tris_count*3); + result.mFaceCount = (unsigned int) tris_count; + result.mVertices = (float*) vertices; + result.mVcount = (unsigned int) vcount; + result.mIndices = (unsigned int *) tris_out; + return true; + } + + int ret = overhullv((float3*)vertices,vcount,35,verts_out,verts_count_out,faces,index_count,inflate,120.0f,vlimit); + if(!ret) return false; + + Array tris; + int n=faces[0]; + int k=1; + for(int i=0;i bmax[j] ) bmax[j] = p[j]; + } + } + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + float center[3]; + + center[0] = dx*0.5f + bmin[0]; + center[1] = dy*0.5f + bmin[1]; + center[2] = dz*0.5f + bmin[2]; + + if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || svcount < 3 ) + { + + float len = FLT_MAX; + + if ( dx > EPSILON && dx < len ) len = dx; + if ( dy > EPSILON && dy < len ) len = dy; + if ( dz > EPSILON && dz < len ) len = dz; + + if ( len == FLT_MAX ) + { + dx = dy = dz = 0.01f; // one centimeter + } + else + { + if ( dx < EPSILON ) dx = len * 0.05f; // 1/5th the shortest non-zero edge. + if ( dy < EPSILON ) dy = len * 0.05f; + if ( dz < EPSILON ) dz = len * 0.05f; + } + + float x1 = center[0] - dx; + float x2 = center[0] + dx; + + float y1 = center[1] - dy; + float y2 = center[1] + dy; + + float z1 = center[2] - dz; + float z2 = center[2] + dz; + + addPoint(vcount,vertices,x1,y1,z1); + addPoint(vcount,vertices,x2,y1,z1); + addPoint(vcount,vertices,x2,y2,z1); + addPoint(vcount,vertices,x1,y2,z1); + addPoint(vcount,vertices,x1,y1,z2); + addPoint(vcount,vertices,x2,y1,z2); + addPoint(vcount,vertices,x2,y2,z2); + addPoint(vcount,vertices,x1,y2,z2); + + return true; // return cube + + + } + else + { + if ( scale ) + { + scale[0] = dx; + scale[1] = dy; + scale[2] = dz; + + recip[0] = 1 / dx; + recip[1] = 1 / dy; + recip[2] = 1 / dz; + + center[0]*=recip[0]; + center[1]*=recip[1]; + center[2]*=recip[2]; + + } + + } + + + + vtx = (const char *) svertices; + + for (unsigned int i=0; i dist2 ) + { + v[0] = px; + v[1] = py; + v[2] = pz; + } + + break; + } + } + + if ( j == vcount ) + { + float *dest = &vertices[vcount*3]; + dest[0] = px; + dest[1] = py; + dest[2] = pz; + vcount++; + } + } + } + + // ok..now make sure we didn't prune so many vertices it is now invalid. + if ( 1 ) + { + float bmin[3] = { FLT_MAX, FLT_MAX, FLT_MAX }; + float bmax[3] = { -FLT_MAX, -FLT_MAX, -FLT_MAX }; + + for (unsigned int i=0; i bmax[j] ) bmax[j] = p[j]; + } + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || vcount < 3) + { + float cx = dx*0.5f + bmin[0]; + float cy = dy*0.5f + bmin[1]; + float cz = dz*0.5f + bmin[2]; + + float len = FLT_MAX; + + if ( dx >= EPSILON && dx < len ) len = dx; + if ( dy >= EPSILON && dy < len ) len = dy; + if ( dz >= EPSILON && dz < len ) len = dz; + + if ( len == FLT_MAX ) + { + dx = dy = dz = 0.01f; // one centimeter + } + else + { + if ( dx < EPSILON ) dx = len * 0.05f; // 1/5th the shortest non-zero edge. + if ( dy < EPSILON ) dy = len * 0.05f; + if ( dz < EPSILON ) dz = len * 0.05f; + } + + float x1 = cx - dx; + float x2 = cx + dx; + + float y1 = cy - dy; + float y2 = cy + dy; + + float z1 = cz - dz; + float z2 = cz + dz; + + vcount = 0; // add box + + addPoint(vcount,vertices,x1,y1,z1); + addPoint(vcount,vertices,x2,y1,z1); + addPoint(vcount,vertices,x2,y2,z1); + addPoint(vcount,vertices,x1,y2,z1); + addPoint(vcount,vertices,x1,y1,z2); + addPoint(vcount,vertices,x2,y1,z2); + addPoint(vcount,vertices,x2,y2,z2); + addPoint(vcount,vertices,x1,y2,z2); + + return true; + } + } + + return true; +} + +void HullLibrary::BringOutYourDead(const float *verts,unsigned int vcount, float *overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount) +{ + unsigned int *used = (unsigned int *)malloc(sizeof(unsigned int)*vcount); + memset(used,0,sizeof(unsigned int)*vcount); + + ocount = 0; + + for (unsigned int i=0; i= 0 && v < vcount ); + + if ( used[v] ) // if already remapped + { + indices[i] = used[v]-1; // index to new array + } + else + { + + indices[i] = ocount; // new index mapping + + overts[ocount*3+0] = verts[v*3+0]; // copy old vert to new vert array + overts[ocount*3+1] = verts[v*3+1]; + overts[ocount*3+2] = verts[v*3+2]; + + ocount++; // increment output vert count + + assert( ocount >=0 && ocount <= vcount ); + + used[v] = ocount; // assign new index remapping + } + } + + free(used); +} + +} diff --git a/Extras/ConvexDecomposition/cd_hull.h b/Extras/ConvexDecomposition/cd_hull.h index c69fd619d..420e241b2 100644 --- a/Extras/ConvexDecomposition/cd_hull.h +++ b/Extras/ConvexDecomposition/cd_hull.h @@ -1,153 +1,153 @@ -#ifndef CD_HULL_H - -#define CD_HULL_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -namespace ConvexDecomposition -{ - -class HullResult -{ -public: - HullResult(void) - { - mPolygons = true; - mNumOutputVertices = 0; - mOutputVertices = 0; - mNumFaces = 0; - mNumIndices = 0; - mIndices = 0; - } - bool mPolygons; // true if indices represents polygons, false indices are triangles - unsigned int mNumOutputVertices; // number of vertices in the output hull - float *mOutputVertices; // array of vertices, 3 floats each x,y,z - unsigned int mNumFaces; // the number of faces produced - unsigned int mNumIndices; // the total number of indices - unsigned int *mIndices; // pointer to indices. - -// If triangles, then indices are array indexes into the vertex list. -// If polygons, indices are in the form (number of points in face) (p1, p2, p3, ..) etc.. -}; - -enum HullFlag -{ - QF_TRIANGLES = (1<<0), // report results as triangles, not polygons. - QF_REVERSE_ORDER = (1<<1), // reverse order of the triangle indices. - QF_SKIN_WIDTH = (1<<2), // extrude hull based on this skin width - QF_DEFAULT = 0 -}; - - -class HullDesc -{ -public: - HullDesc(void) - { - mFlags = QF_DEFAULT; - mVcount = 0; - mVertices = 0; - mVertexStride = sizeof(float)*3; - mNormalEpsilon = 0.001f; - mMaxVertices = 4096; // maximum number of points to be considered for a convex hull. - mMaxFaces = 4096; - mSkinWidth = 0.01f; // default is one centimeter - }; - - HullDesc(HullFlag flag, - unsigned int vcount, - const float *vertices, - unsigned int stride) - { - mFlags = flag; - mVcount = vcount; - mVertices = vertices; - mVertexStride = stride; - mNormalEpsilon = 0.001f; - mMaxVertices = 4096; - mSkinWidth = 0.01f; // default is one centimeter - } - - bool HasHullFlag(HullFlag flag) const - { - if ( mFlags & flag ) return true; - return false; - } - - void SetHullFlag(HullFlag flag) - { - mFlags|=flag; - } - - void ClearHullFlag(HullFlag flag) - { - mFlags&=~flag; - } - - unsigned int mFlags; // flags to use when generating the convex hull. - unsigned int mVcount; // number of vertices in the input point cloud - const float *mVertices; // the array of vertices. - unsigned int mVertexStride; // the stride of each vertex, in bytes. - float mNormalEpsilon; // the epsilon for removing duplicates. This is a normalized value, if normalized bit is on. - float mSkinWidth; - unsigned int mMaxVertices; // maximum number of vertices to be considered for the hull! - unsigned int mMaxFaces; -}; - -enum HullError -{ - QE_OK, // success! - QE_FAIL // failed. -}; - -class HullLibrary -{ -public: - - HullError CreateConvexHull(const HullDesc &desc, // describes the input request - HullResult &result); // contains the resulst - - HullError ReleaseResult(HullResult &result); // release memory allocated for this result, we are done with it. - -private: - - void BringOutYourDead(const float *verts,unsigned int vcount, float *overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount); - - bool CleanupVertices(unsigned int svcount, - const float *svertices, - unsigned int stride, - unsigned int &vcount, // output number of vertices - float *vertices, // location to store the results. - float normalepsilon, - float *scale); -}; - -} - -#endif - +#ifndef CD_HULL_H + +#define CD_HULL_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +namespace ConvexDecomposition +{ + +class HullResult +{ +public: + HullResult(void) + { + mPolygons = true; + mNumOutputVertices = 0; + mOutputVertices = 0; + mNumFaces = 0; + mNumIndices = 0; + mIndices = 0; + } + bool mPolygons; // true if indices represents polygons, false indices are triangles + unsigned int mNumOutputVertices; // number of vertices in the output hull + float *mOutputVertices; // array of vertices, 3 floats each x,y,z + unsigned int mNumFaces; // the number of faces produced + unsigned int mNumIndices; // the total number of indices + unsigned int *mIndices; // pointer to indices. + +// If triangles, then indices are array indexes into the vertex list. +// If polygons, indices are in the form (number of points in face) (p1, p2, p3, ..) etc.. +}; + +enum HullFlag +{ + QF_TRIANGLES = (1<<0), // report results as triangles, not polygons. + QF_REVERSE_ORDER = (1<<1), // reverse order of the triangle indices. + QF_SKIN_WIDTH = (1<<2), // extrude hull based on this skin width + QF_DEFAULT = 0 +}; + + +class HullDesc +{ +public: + HullDesc(void) + { + mFlags = QF_DEFAULT; + mVcount = 0; + mVertices = 0; + mVertexStride = sizeof(float)*3; + mNormalEpsilon = 0.001f; + mMaxVertices = 4096; // maximum number of points to be considered for a convex hull. + mMaxFaces = 4096; + mSkinWidth = 0.01f; // default is one centimeter + }; + + HullDesc(HullFlag flag, + unsigned int vcount, + const float *vertices, + unsigned int stride) + { + mFlags = flag; + mVcount = vcount; + mVertices = vertices; + mVertexStride = stride; + mNormalEpsilon = 0.001f; + mMaxVertices = 4096; + mSkinWidth = 0.01f; // default is one centimeter + } + + bool HasHullFlag(HullFlag flag) const + { + if ( mFlags & flag ) return true; + return false; + } + + void SetHullFlag(HullFlag flag) + { + mFlags|=flag; + } + + void ClearHullFlag(HullFlag flag) + { + mFlags&=~flag; + } + + unsigned int mFlags; // flags to use when generating the convex hull. + unsigned int mVcount; // number of vertices in the input point cloud + const float *mVertices; // the array of vertices. + unsigned int mVertexStride; // the stride of each vertex, in bytes. + float mNormalEpsilon; // the epsilon for removing duplicates. This is a normalized value, if normalized bit is on. + float mSkinWidth; + unsigned int mMaxVertices; // maximum number of vertices to be considered for the hull! + unsigned int mMaxFaces; +}; + +enum HullError +{ + QE_OK, // success! + QE_FAIL // failed. +}; + +class HullLibrary +{ +public: + + HullError CreateConvexHull(const HullDesc &desc, // describes the input request + HullResult &result); // contains the resulst + + HullError ReleaseResult(HullResult &result); // release memory allocated for this result, we are done with it. + +private: + + void BringOutYourDead(const float *verts,unsigned int vcount, float *overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount); + + bool CleanupVertices(unsigned int svcount, + const float *svertices, + unsigned int stride, + unsigned int &vcount, // output number of vertices + float *vertices, // location to store the results. + float normalepsilon, + float *scale); +}; + +} + +#endif + diff --git a/Extras/ConvexDecomposition/cd_vector.h b/Extras/ConvexDecomposition/cd_vector.h index 52c1f085a..382ba7534 100644 --- a/Extras/ConvexDecomposition/cd_vector.h +++ b/Extras/ConvexDecomposition/cd_vector.h @@ -1,1185 +1,1185 @@ -#ifndef CD_VECTOR_H - -#define CD_VECTOR_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -#pragma warning(disable:4786) - -#include -#include -#include - -namespace ConvexDecomposition -{ - - -const float DEG_TO_RAD = ((2.0f * 3.14152654f) / 360.0f); -const float RAD_TO_DEG = (360.0f / (2.0f * 3.141592654f)); - -class Vector3d -{ -public: - Vector3d(void) { }; // null constructor, does not inialize point. - - Vector3d(const Vector3d &a) // constructor copies existing vector. - { - x = a.x; - y = a.y; - z = a.z; - }; - - Vector3d(float a,float b,float c) // construct with initial point. - { - x = a; - y = b; - z = c; - }; - - Vector3d(const float *t) - { - x = t[0]; - y = t[1]; - z = t[2]; - }; - - Vector3d(const int *t) - { - x = t[0]; - y = t[1]; - z = t[2]; - }; - - bool operator==(const Vector3d &a) const - { - return( a.x == x && a.y == y && a.z == z ); - }; - - bool operator!=(const Vector3d &a) const - { - return( a.x != x || a.y != y || a.z != z ); - }; - -// Operators - Vector3d& operator = (const Vector3d& A) // ASSIGNMENT (=) - { x=A.x; y=A.y; z=A.z; - return(*this); }; - - Vector3d operator + (const Vector3d& A) const // ADDITION (+) - { Vector3d Sum(x+A.x, y+A.y, z+A.z); - return(Sum); }; - - Vector3d operator - (const Vector3d& A) const // SUBTRACTION (-) - { Vector3d Diff(x-A.x, y-A.y, z-A.z); - return(Diff); }; - - Vector3d operator * (const float s) const // MULTIPLY BY SCALAR (*) - { Vector3d Scaled(x*s, y*s, z*s); - return(Scaled); }; - - - Vector3d operator + (const float s) const // ADD CONSTANT TO ALL 3 COMPONENTS (*) - { Vector3d Scaled(x+s, y+s, z+s); - return(Scaled); }; - - - - - Vector3d operator / (const float s) const // DIVIDE BY SCALAR (/) - { - float r = 1.0f / s; - Vector3d Scaled(x*r, y*r, z*r); - return(Scaled); - }; - - void operator /= (float A) // ACCUMULATED VECTOR ADDITION (/=) - { x/=A; y/=A; z/=A; }; - - void operator += (const Vector3d A) // ACCUMULATED VECTOR ADDITION (+=) - { x+=A.x; y+=A.y; z+=A.z; }; - void operator -= (const Vector3d A) // ACCUMULATED VECTOR SUBTRACTION (+=) - { x-=A.x; y-=A.y; z-=A.z; }; - void operator *= (const float s) // ACCUMULATED SCALAR MULTIPLICATION (*=) (bpc 4/24/2000) - {x*=s; y*=s; z*=s;} - - void operator += (const float A) // ACCUMULATED VECTOR ADDITION (+=) - { x+=A; y+=A; z+=A; }; - - - Vector3d operator - (void) const // NEGATION (-) - { Vector3d Negated(-x, -y, -z); - return(Negated); }; - - float operator [] (const int i) const // ALLOWS VECTOR ACCESS AS AN ARRAY. - { return( (i==0)?x:((i==1)?y:z) ); }; - float & operator [] (const int i) - { return( (i==0)?x:((i==1)?y:z) ); }; -// - - // accessor methods. - float GetX(void) const { return x; }; - float GetY(void) const { return y; }; - float GetZ(void) const { return z; }; - - float X(void) const { return x; }; - float Y(void) const { return y; }; - float Z(void) const { return z; }; - - void SetX(float t) { x = t; }; - void SetY(float t) { y = t; }; - void SetZ(float t) { z = t; }; - - bool IsSame(const Vector3d &v,float epsilon) const - { - float dx = fabsf( x - v.x ); - if ( dx > epsilon ) return false; - float dy = fabsf( y - v.y ); - if ( dy > epsilon ) return false; - float dz = fabsf( z - v.z ); - if ( dz > epsilon ) return false; - return true; - } - - - float ComputeNormal(const Vector3d &A, - const Vector3d &B, - const Vector3d &C) - { - float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag; - - vx = (B.x - C.x); - vy = (B.y - C.y); - vz = (B.z - C.z); - - wx = (A.x - B.x); - wy = (A.y - B.y); - wz = (A.z - B.z); - - vw_x = vy * wz - vz * wy; - vw_y = vz * wx - vx * wz; - vw_z = vx * wy - vy * wx; - - mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); - - if ( mag < 0.000001f ) - { - mag = 0; - } - else - { - mag = 1.0f/mag; - } - - x = vw_x * mag; - y = vw_y * mag; - z = vw_z * mag; - - return mag; - } - - - void ScaleSumScale(float c0,float c1,const Vector3d &pos) - { - x = (x*c0) + (pos.x*c1); - y = (y*c0) + (pos.y*c1); - z = (z*c0) + (pos.z*c1); - } - - void SwapYZ(void) - { - float t = y; - y = z; - z = t; - }; - - void Get(float *v) const - { - v[0] = x; - v[1] = y; - v[2] = z; - }; - - void Set(const int *p) - { - x = (float) p[0]; - y = (float) p[1]; - z = (float) p[2]; - } - - void Set(const float *p) - { - x = (float) p[0]; - y = (float) p[1]; - z = (float) p[2]; - } - - - void Set(float a,float b,float c) - { - x = a; - y = b; - z = c; - }; - - void Zero(void) - { - x = y = z = 0; - }; - - const float* Ptr() const { return &x; } - float* Ptr() { return &x; } - - -// return -(*this). - Vector3d negative(void) const - { - Vector3d result; - result.x = -x; - result.y = -y; - result.z = -z; - return result; - } - - float Magnitude(void) const - { - return float(sqrt(x * x + y * y + z * z)); - }; - - float FastMagnitude(void) const - { - return float(sqrtf(x * x + y * y + z * z)); - }; - - float FasterMagnitude(void) const - { - return float(sqrtf(x * x + y * y + z * z)); - }; - - void Lerp(const Vector3d& from,const Vector3d& to,float slerp) - { - x = ((to.x - from.x) * slerp) + from.x; - y = ((to.y - from.y) * slerp) + from.y; - z = ((to.z - from.z) * slerp) + from.z; - }; - - // Highly specialized interpolate routine. Will compute the interpolated position - // shifted forward or backwards along the ray defined between (from) and (to). - // Reason for existance is so that when a bullet collides with a wall, for - // example, you can generate a graphic effect slightly *before* it hit the - // wall so that the effect doesn't sort into the wall itself. - void Interpolate(const Vector3d &from,const Vector3d &to,float offset) - { - x = to.x-from.x; - y = to.y-from.y; - z = to.z-from.z; - float d = sqrtf( x*x + y*y + z*z ); - float recip = 1.0f / d; - x*=recip; - y*=recip; - z*=recip; // normalize vector - d+=offset; // shift along ray - x = x*d + from.x; - y = y*d + from.y; - z = z*d + from.z; - }; - - bool BinaryEqual(const Vector3d &p) const - { - const int *source = (const int *) &x; - const int *dest = (const int *) &p.x; - - if ( source[0] == dest[0] && - source[1] == dest[1] && - source[2] == dest[2] ) return true; - - return false; - }; - - /*bool BinaryEqual(const Vector3d &p) const - { - if ( x == p.x && y == p.y && z == p.z ) return true; - return false; - } - */ - - - -/** Computes the reflection vector between two vectors.*/ - void Reflection(const Vector3d &a,const Vector3d &b)// compute reflection vector. - { - Vector3d c; - Vector3d d; - - float dot = a.Dot(b) * 2.0f; - - c = b * dot; - - d = c - a; - - x = -d.x; - y = -d.y; - z = -d.z; - }; - - void AngleAxis(float angle,const Vector3d& axis) - { - x = axis.x*angle; - y = axis.y*angle; - z = axis.z*angle; - }; - - float Length(void) const // length of vector. - { - return float(sqrt( x*x + y*y + z*z )); - }; - - - float ComputePlane(const Vector3d &A, - const Vector3d &B, - const Vector3d &C) - { - float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag; - - vx = (B.x - C.x); - vy = (B.y - C.y); - vz = (B.z - C.z); - - wx = (A.x - B.x); - wy = (A.y - B.y); - wz = (A.z - B.z); - - vw_x = vy * wz - vz * wy; - vw_y = vz * wx - vx * wz; - vw_z = vx * wy - vy * wx; - - mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); - - if ( mag < 0.000001f ) - { - mag = 0; - } - else - { - mag = 1.0f/mag; - } - - x = vw_x * mag; - y = vw_y * mag; - z = vw_z * mag; - - - float D = 0.0f - ((x*A.x)+(y*A.y)+(z*A.z)); - - return D; - } - - - float FastLength(void) const // length of vector. - { - return float(sqrtf( x*x + y*y + z*z )); - }; - - - float FasterLength(void) const // length of vector. - { - return float(sqrtf( x*x + y*y + z*z )); - }; - - float Length2(void) const // squared distance, prior to square root. - { - float l2 = x*x+y*y+z*z; - return l2; - }; - - float Distance(const Vector3d &a) const // distance between two points. - { - Vector3d d(a.x-x,a.y-y,a.z-z); - return d.Length(); - } - - float FastDistance(const Vector3d &a) const // distance between two points. - { - Vector3d d(a.x-x,a.y-y,a.z-z); - return d.FastLength(); - } - - float FasterDistance(const Vector3d &a) const // distance between two points. - { - Vector3d d(a.x-x,a.y-y,a.z-z); - return d.FasterLength(); - } - - - float DistanceXY(const Vector3d &a) const - { - float dx = a.x - x; - float dy = a.y - y; - float dist = dx*dx + dy*dy; - return dist; - } - - float Distance2(const Vector3d &a) const // squared distance. - { - float dx = a.x - x; - float dy = a.y - y; - float dz = a.z - z; - return dx*dx + dy*dy + dz*dz; - }; - - float Partial(const Vector3d &p) const - { - return (x*p.y) - (p.x*y); - } - - float Area(const Vector3d &p1,const Vector3d &p2) const - { - float A = Partial(p1); - A+= p1.Partial(p2); - A+= p2.Partial(*this); - return A*0.5f; - } - - inline float Normalize(void) // normalize to a unit vector, returns distance. - { - float d = sqrtf( static_cast< float >( x*x + y*y + z*z ) ); - if ( d > 0 ) - { - float r = 1.0f / d; - x *= r; - y *= r; - z *= r; - } - else - { - x = y = z = 1; - } - return d; - }; - - inline float FastNormalize(void) // normalize to a unit vector, returns distance. - { - float d = sqrt( static_cast< float >( x*x + y*y + z*z ) ); - if ( d > 0 ) - { - float r = 1.0f / d; - x *= r; - y *= r; - z *= r; - } - else - { - x = y = z = 1; - } - return d; - }; - - inline float FasterNormalize(void) // normalize to a unit vector, returns distance. - { - float d = sqrtf( static_cast< float >( x*x + y*y + z*z ) ); - if ( d > 0 ) - { - float r = 1.0f / d; - x *= r; - y *= r; - z *= r; - } - else - { - x = y = z = 1; - } - return d; - }; - - - - - float Dot(const Vector3d &a) const // computes dot product. - { - return (x * a.x + y * a.y + z * a.z ); - }; - - - Vector3d Cross( const Vector3d& other ) const - { - Vector3d result( y*other.z - z*other.y, z*other.x - x*other.z, x*other.y - y*other.x ); - - return result; - } - - void Cross(const Vector3d &a,const Vector3d &b) // cross two vectors result in this one. - { - x = a.y*b.z - a.z*b.y; - y = a.z*b.x - a.x*b.z; - z = a.x*b.y - a.y*b.x; - }; - - /******************************************/ - // Check if next edge (b to c) turns inward - // - // Edge from a to b is already in face - // Edge from b to c is being considered for addition to face - /******************************************/ - bool Concave(const Vector3d& a,const Vector3d& b) - { - float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag,nx,ny,nz,mag_a,mag_b; - - wx = b.x - a.x; - wy = b.y - a.y; - wz = b.z - a.z; - - mag_a = (float) sqrtf((wx * wx) + (wy * wy) + (wz * wz)); - - vx = x - b.x; - vy = y - b.y; - vz = z - b.z; - - mag_b = (float) sqrtf((vx * vx) + (vy * vy) + (vz * vz)); - - vw_x = (vy * wz) - (vz * wy); - vw_y = (vz * wx) - (vx * wz); - vw_z = (vx * wy) - (vy * wx); - - mag = (float) sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); - - // Check magnitude of cross product, which is a sine function - // i.e., mag (a x b) = mag (a) * mag (b) * sin (theta); - // If sin (theta) small, then angle between edges is very close to - // 180, which we may want to call a concavity. Setting the - // CONCAVITY_TOLERANCE value greater than about 0.01 MAY cause - // face consolidation to get stuck on particular face. Most meshes - // convert properly with a value of 0.0 - - if (mag/(mag_a*mag_b) <= 0.0f ) return true; - - mag = 1.0f / mag; - - nx = vw_x * mag; - ny = vw_y * mag; - nz = vw_z * mag; - - // Dot product of tri normal with cross product result will - // yield positive number if edges are convex (+1.0 if two tris - // are coplanar), negative number if edges are concave (-1.0 if - // two tris are coplanar.) - - mag = ( x * nx) + ( y * ny) + ( z * nz); - - if (mag > 0.0f ) return false; - - return(true); - }; - - bool PointTestXY(const Vector3d &i,const Vector3d &j) const - { - if (((( i.y <= y ) && ( y < j.y )) || - (( j.y <= y ) && ( y < i.y ))) && - ( x < (j.x - i.x) * (y - i.y) / (j.y - i.y) + i.x)) return true; - return false; - } - - // test to see if this point is inside the triangle specified by - // these three points on the X/Y plane. - bool PointInTriXY(const Vector3d &p1, - const Vector3d &p2, - const Vector3d &p3) const - { - float ax = p3.x - p2.x; - float ay = p3.y - p2.y; - float bx = p1.x - p3.x; - float by = p1.y - p3.y; - float cx = p2.x - p1.x; - float cy = p2.y - p1.y; - float apx = x - p1.x; - float apy = y - p1.y; - float bpx = x - p2.x; - float bpy = y - p2.y; - float cpx = x - p3.x; - float cpy = y - p3.y; - - float aCROSSbp = ax*bpy - ay*bpx; - float cCROSSap = cx*apy - cy*apx; - float bCROSScp = bx*cpy - by*cpx; - - return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); - }; - - // test to see if this point is inside the triangle specified by - // these three points on the X/Y plane. - bool PointInTriYZ(const Vector3d &p1, - const Vector3d &p2, - const Vector3d &p3) const - { - float ay = p3.y - p2.y; - float az = p3.z - p2.z; - float by = p1.y - p3.y; - float bz = p1.z - p3.z; - float cy = p2.y - p1.y; - float cz = p2.z - p1.z; - float apy = y - p1.y; - float apz = z - p1.z; - float bpy = y - p2.y; - float bpz = z - p2.z; - float cpy = y - p3.y; - float cpz = z - p3.z; - - float aCROSSbp = ay*bpz - az*bpy; - float cCROSSap = cy*apz - cz*apy; - float bCROSScp = by*cpz - bz*cpy; - - return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); - }; - - - // test to see if this point is inside the triangle specified by - // these three points on the X/Y plane. - bool PointInTriXZ(const Vector3d &p1, - const Vector3d &p2, - const Vector3d &p3) const - { - float az = p3.z - p2.z; - float ax = p3.x - p2.x; - float bz = p1.z - p3.z; - float bx = p1.x - p3.x; - float cz = p2.z - p1.z; - float cx = p2.x - p1.x; - float apz = z - p1.z; - float apx = x - p1.x; - float bpz = z - p2.z; - float bpx = x - p2.x; - float cpz = z - p3.z; - float cpx = x - p3.x; - - float aCROSSbp = az*bpx - ax*bpz; - float cCROSSap = cz*apx - cx*apz; - float bCROSScp = bz*cpx - bx*cpz; - - return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); - }; - - // Given a point and a line (defined by two points), compute the closest point - // in the line. (The line is treated as infinitely long.) - void NearestPointInLine(const Vector3d &point, - const Vector3d &line0, - const Vector3d &line1) - { - Vector3d &nearestPoint = *this; - Vector3d lineDelta = line1 - line0; - - // Handle degenerate lines - if ( lineDelta == Vector3d(0, 0, 0) ) - { - nearestPoint = line0; - } - else - { - float delta = (point-line0).Dot(lineDelta) / (lineDelta).Dot(lineDelta); - nearestPoint = line0 + lineDelta*delta; - } - } - - // Given a point and a line segment (defined by two points), compute the closest point - // in the line. Cap the point at the endpoints of the line segment. - void NearestPointInLineSegment(const Vector3d &point, - const Vector3d &line0, - const Vector3d &line1) - { - Vector3d &nearestPoint = *this; - Vector3d lineDelta = line1 - line0; - - // Handle degenerate lines - if ( lineDelta == Vector3d(0, 0, 0) ) - { - nearestPoint = line0; - } - else - { - float delta = (point-line0).Dot(lineDelta) / (lineDelta).Dot(lineDelta); - - // Clamp the point to conform to the segment's endpoints - if ( delta < 0 ) - delta = 0; - else if ( delta > 1 ) - delta = 1; - - nearestPoint = line0 + lineDelta*delta; - } - } - - // Given a point and a plane (defined by three points), compute the closest point - // in the plane. (The plane is unbounded.) - void NearestPointInPlane(const Vector3d &point, - const Vector3d &triangle0, - const Vector3d &triangle1, - const Vector3d &triangle2) - { - Vector3d &nearestPoint = *this; - Vector3d lineDelta0 = triangle1 - triangle0; - Vector3d lineDelta1 = triangle2 - triangle0; - Vector3d pointDelta = point - triangle0; - Vector3d normal; - - // Get the normal of the polygon (doesn't have to be a unit vector) - normal.Cross(lineDelta0, lineDelta1); - - float delta = normal.Dot(pointDelta) / normal.Dot(normal); - nearestPoint = point - normal*delta; - } - - // Given a point and a plane (defined by a coplanar point and a normal), compute the closest point - // in the plane. (The plane is unbounded.) - void NearestPointInPlane(const Vector3d &point, - const Vector3d &planePoint, - const Vector3d &planeNormal) - { - Vector3d &nearestPoint = *this; - Vector3d pointDelta = point - planePoint; - - float delta = planeNormal.Dot(pointDelta) / planeNormal.Dot(planeNormal); - nearestPoint = point - planeNormal*delta; - } - - // Given a point and a triangle (defined by three points), compute the closest point - // in the triangle. Clamp the point so it's confined to the area of the triangle. - void NearestPointInTriangle(const Vector3d &point, - const Vector3d &triangle0, - const Vector3d &triangle1, - const Vector3d &triangle2) - { - static const Vector3d zeroVector(0, 0, 0); - - Vector3d &nearestPoint = *this; - - Vector3d lineDelta0 = triangle1 - triangle0; - Vector3d lineDelta1 = triangle2 - triangle0; - - // Handle degenerate triangles - if ( (lineDelta0 == zeroVector) || (lineDelta1 == zeroVector) ) - { - nearestPoint.NearestPointInLineSegment(point, triangle1, triangle2); - } - else if ( lineDelta0 == lineDelta1 ) - { - nearestPoint.NearestPointInLineSegment(point, triangle0, triangle1); - } - - else - { - static Vector3d axis[3]; - axis[0].NearestPointInLine(triangle0, triangle1, triangle2); - axis[1].NearestPointInLine(triangle1, triangle0, triangle2); - axis[2].NearestPointInLine(triangle2, triangle0, triangle1); - - float axisDot[3]; - axisDot[0] = (triangle0-axis[0]).Dot(point-axis[0]); - axisDot[1] = (triangle1-axis[1]).Dot(point-axis[1]); - axisDot[2] = (triangle2-axis[2]).Dot(point-axis[2]); - - bool bForce = true; - float bestMagnitude2 = 0; - float closeMagnitude2; - Vector3d closePoint; - - if ( axisDot[0] < 0 ) - { - closePoint.NearestPointInLineSegment(point, triangle1, triangle2); - closeMagnitude2 = point.Distance2(closePoint); - if ( bForce || (bestMagnitude2 > closeMagnitude2) ) - { - bForce = false; - bestMagnitude2 = closeMagnitude2; - nearestPoint = closePoint; - } - } - if ( axisDot[1] < 0 ) - { - closePoint.NearestPointInLineSegment(point, triangle0, triangle2); - closeMagnitude2 = point.Distance2(closePoint); - if ( bForce || (bestMagnitude2 > closeMagnitude2) ) - { - bForce = false; - bestMagnitude2 = closeMagnitude2; - nearestPoint = closePoint; - } - } - if ( axisDot[2] < 0 ) - { - closePoint.NearestPointInLineSegment(point, triangle0, triangle1); - closeMagnitude2 = point.Distance2(closePoint); - if ( bForce || (bestMagnitude2 > closeMagnitude2) ) - { - bForce = false; - bestMagnitude2 = closeMagnitude2; - nearestPoint = closePoint; - } - } - - // If bForce is true at this point, it means the nearest point lies - // inside the triangle; use the nearest-point-on-a-plane equation - if ( bForce ) - { - Vector3d normal; - - // Get the normal of the polygon (doesn't have to be a unit vector) - normal.Cross(lineDelta0, lineDelta1); - - Vector3d pointDelta = point - triangle0; - float delta = normal.Dot(pointDelta) / normal.Dot(normal); - - nearestPoint = point - normal*delta; - } - } - } - - -//private: - - float x; - float y; - float z; -}; - - -class Vector2d -{ -public: - Vector2d(void) { }; // null constructor, does not inialize point. - - Vector2d(const Vector2d &a) // constructor copies existing vector. - { - x = a.x; - y = a.y; - }; - - Vector2d(const float *t) - { - x = t[0]; - y = t[1]; - }; - - - Vector2d(float a,float b) // construct with initial point. - { - x = a; - y = b; - }; - - const float* Ptr() const { return &x; } - float* Ptr() { return &x; } - - Vector2d & operator+=(const Vector2d &a) // += operator. - { - x+=a.x; - y+=a.y; - return *this; - }; - - Vector2d & operator-=(const Vector2d &a) - { - x-=a.x; - y-=a.y; - return *this; - }; - - Vector2d & operator*=(const Vector2d &a) - { - x*=a.x; - y*=a.y; - return *this; - }; - - Vector2d & operator/=(const Vector2d &a) - { - x/=a.x; - y/=a.y; - return *this; - }; - - bool operator==(const Vector2d &a) const - { - if ( a.x == x && a.y == y ) return true; - return false; - }; - - bool operator!=(const Vector2d &a) const - { - if ( a.x != x || a.y != y ) return true; - return false; - }; - - Vector2d operator+(Vector2d a) const - { - a.x+=x; - a.y+=y; - return a; - }; - - Vector2d operator-(Vector2d a) const - { - a.x = x-a.x; - a.y = y-a.y; - return a; - }; - - Vector2d operator - (void) const - { - return negative(); - }; - - Vector2d operator*(Vector2d a) const - { - a.x*=x; - a.y*=y; - return a; - }; - - Vector2d operator*(float c) const - { - Vector2d a; - - a.x = x * c; - a.y = y * c; - - return a; - }; - - Vector2d operator/(Vector2d a) const - { - a.x = x/a.x; - a.y = y/a.y; - return a; - }; - - - float Dot(const Vector2d &a) const // computes dot product. - { - return (x * a.x + y * a.y ); - }; - - float GetX(void) const { return x; }; - float GetY(void) const { return y; }; - - void SetX(float t) { x = t; }; - void SetY(float t) { y = t; }; - - void Set(float a,float b) - { - x = a; - y = b; - }; - - void Zero(void) - { - x = y = 0; - }; - - Vector2d negative(void) const - { - Vector2d result; - result.x = -x; - result.y = -y; - return result; - } - - float magnitude(void) const - { - return (float) sqrtf(x * x + y * y ); - } - - float fastmagnitude(void) const - { - return (float) sqrtf(x * x + y * y ); - } - - float fastermagnitude(void) const - { - return (float) sqrtf( x * x + y * y ); - } - - void Reflection(Vector2d &a,Vector2d &b); // compute reflection vector. - - float Length(void) const // length of vector. - { - return float(sqrtf( x*x + y*y )); - }; - - float FastLength(void) const // length of vector. - { - return float(sqrtf( x*x + y*y )); - }; - - float FasterLength(void) const // length of vector. - { - return float(sqrtf( x*x + y*y )); - }; - - float Length2(void) // squared distance, prior to square root. - { - return x*x+y*y; - } - - float Distance(const Vector2d &a) const // distance between two points. - { - float dx = a.x - x; - float dy = a.y - y; - float d = dx*dx+dy*dy; - return sqrtf(d); - }; - - float FastDistance(const Vector2d &a) const // distance between two points. - { - float dx = a.x - x; - float dy = a.y - y; - float d = dx*dx+dy*dy; - return sqrtf(d); - }; - - float FasterDistance(const Vector2d &a) const // distance between two points. - { - float dx = a.x - x; - float dy = a.y - y; - float d = dx*dx+dy*dy; - return sqrtf(d); - }; - - float Distance2(Vector2d &a) // squared distance. - { - float dx = a.x - x; - float dy = a.y - y; - return dx*dx + dy *dy; - }; - - void Lerp(const Vector2d& from,const Vector2d& to,float slerp) - { - x = ((to.x - from.x)*slerp) + from.x; - y = ((to.y - from.y)*slerp) + from.y; - }; - - - void Cross(const Vector2d &a,const Vector2d &b) // cross two vectors result in this one. - { - x = a.y*b.x - a.x*b.y; - y = a.x*b.x - a.x*b.x; - }; - - float Normalize(void) // normalize to a unit vector, returns distance. - { - float l = Length(); - if ( l != 0 ) - { - l = float( 1 ) / l; - x*=l; - y*=l; - } - else - { - x = y = 0; - } - return l; - }; - - float FastNormalize(void) // normalize to a unit vector, returns distance. - { - float l = FastLength(); - if ( l != 0 ) - { - l = float( 1 ) / l; - x*=l; - y*=l; - } - else - { - x = y = 0; - } - return l; - }; - - float FasterNormalize(void) // normalize to a unit vector, returns distance. - { - float l = FasterLength(); - if ( l != 0 ) - { - l = float( 1 ) / l; - x*=l; - y*=l; - } - else - { - x = y = 0; - } - return l; - }; - - - float x; - float y; -}; - -class Line -{ -public: - Line(const Vector3d &from,const Vector3d &to) - { - mP1 = from; - mP2 = to; - }; - // JWR Test for the intersection of two lines. - - bool Intersect(const Line& src,Vector3d §); -private: - Vector3d mP1; - Vector3d mP2; - -}; - - -typedef std::vector< Vector3d > Vector3dVector; -typedef std::vector< Vector2d > Vector2dVector; - -inline Vector3d operator * (float s, const Vector3d &v ) -{ - Vector3d Scaled(v.x*s, v.y*s, v.z*s); - return(Scaled); -} - -inline Vector2d operator * (float s, const Vector2d &v ) - { - Vector2d Scaled(v.x*s, v.y*s); - return(Scaled); - } - -} - -#endif +#ifndef CD_VECTOR_H + +#define CD_VECTOR_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +#pragma warning(disable:4786) + +#include +#include +#include + +namespace ConvexDecomposition +{ + + +const float DEG_TO_RAD = ((2.0f * 3.14152654f) / 360.0f); +const float RAD_TO_DEG = (360.0f / (2.0f * 3.141592654f)); + +class Vector3d +{ +public: + Vector3d(void) { }; // null constructor, does not inialize point. + + Vector3d(const Vector3d &a) // constructor copies existing vector. + { + x = a.x; + y = a.y; + z = a.z; + }; + + Vector3d(float a,float b,float c) // construct with initial point. + { + x = a; + y = b; + z = c; + }; + + Vector3d(const float *t) + { + x = t[0]; + y = t[1]; + z = t[2]; + }; + + Vector3d(const int *t) + { + x = t[0]; + y = t[1]; + z = t[2]; + }; + + bool operator==(const Vector3d &a) const + { + return( a.x == x && a.y == y && a.z == z ); + }; + + bool operator!=(const Vector3d &a) const + { + return( a.x != x || a.y != y || a.z != z ); + }; + +// Operators + Vector3d& operator = (const Vector3d& A) // ASSIGNMENT (=) + { x=A.x; y=A.y; z=A.z; + return(*this); }; + + Vector3d operator + (const Vector3d& A) const // ADDITION (+) + { Vector3d Sum(x+A.x, y+A.y, z+A.z); + return(Sum); }; + + Vector3d operator - (const Vector3d& A) const // SUBTRACTION (-) + { Vector3d Diff(x-A.x, y-A.y, z-A.z); + return(Diff); }; + + Vector3d operator * (const float s) const // MULTIPLY BY SCALAR (*) + { Vector3d Scaled(x*s, y*s, z*s); + return(Scaled); }; + + + Vector3d operator + (const float s) const // ADD CONSTANT TO ALL 3 COMPONENTS (*) + { Vector3d Scaled(x+s, y+s, z+s); + return(Scaled); }; + + + + + Vector3d operator / (const float s) const // DIVIDE BY SCALAR (/) + { + float r = 1.0f / s; + Vector3d Scaled(x*r, y*r, z*r); + return(Scaled); + }; + + void operator /= (float A) // ACCUMULATED VECTOR ADDITION (/=) + { x/=A; y/=A; z/=A; }; + + void operator += (const Vector3d A) // ACCUMULATED VECTOR ADDITION (+=) + { x+=A.x; y+=A.y; z+=A.z; }; + void operator -= (const Vector3d A) // ACCUMULATED VECTOR SUBTRACTION (+=) + { x-=A.x; y-=A.y; z-=A.z; }; + void operator *= (const float s) // ACCUMULATED SCALAR MULTIPLICATION (*=) (bpc 4/24/2000) + {x*=s; y*=s; z*=s;} + + void operator += (const float A) // ACCUMULATED VECTOR ADDITION (+=) + { x+=A; y+=A; z+=A; }; + + + Vector3d operator - (void) const // NEGATION (-) + { Vector3d Negated(-x, -y, -z); + return(Negated); }; + + float operator [] (const int i) const // ALLOWS VECTOR ACCESS AS AN ARRAY. + { return( (i==0)?x:((i==1)?y:z) ); }; + float & operator [] (const int i) + { return( (i==0)?x:((i==1)?y:z) ); }; +// + + // accessor methods. + float GetX(void) const { return x; }; + float GetY(void) const { return y; }; + float GetZ(void) const { return z; }; + + float X(void) const { return x; }; + float Y(void) const { return y; }; + float Z(void) const { return z; }; + + void SetX(float t) { x = t; }; + void SetY(float t) { y = t; }; + void SetZ(float t) { z = t; }; + + bool IsSame(const Vector3d &v,float epsilon) const + { + float dx = fabsf( x - v.x ); + if ( dx > epsilon ) return false; + float dy = fabsf( y - v.y ); + if ( dy > epsilon ) return false; + float dz = fabsf( z - v.z ); + if ( dz > epsilon ) return false; + return true; + } + + + float ComputeNormal(const Vector3d &A, + const Vector3d &B, + const Vector3d &C) + { + float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag; + + vx = (B.x - C.x); + vy = (B.y - C.y); + vz = (B.z - C.z); + + wx = (A.x - B.x); + wy = (A.y - B.y); + wz = (A.z - B.z); + + vw_x = vy * wz - vz * wy; + vw_y = vz * wx - vx * wz; + vw_z = vx * wy - vy * wx; + + mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + if ( mag < 0.000001f ) + { + mag = 0; + } + else + { + mag = 1.0f/mag; + } + + x = vw_x * mag; + y = vw_y * mag; + z = vw_z * mag; + + return mag; + } + + + void ScaleSumScale(float c0,float c1,const Vector3d &pos) + { + x = (x*c0) + (pos.x*c1); + y = (y*c0) + (pos.y*c1); + z = (z*c0) + (pos.z*c1); + } + + void SwapYZ(void) + { + float t = y; + y = z; + z = t; + }; + + void Get(float *v) const + { + v[0] = x; + v[1] = y; + v[2] = z; + }; + + void Set(const int *p) + { + x = (float) p[0]; + y = (float) p[1]; + z = (float) p[2]; + } + + void Set(const float *p) + { + x = (float) p[0]; + y = (float) p[1]; + z = (float) p[2]; + } + + + void Set(float a,float b,float c) + { + x = a; + y = b; + z = c; + }; + + void Zero(void) + { + x = y = z = 0; + }; + + const float* Ptr() const { return &x; } + float* Ptr() { return &x; } + + +// return -(*this). + Vector3d negative(void) const + { + Vector3d result; + result.x = -x; + result.y = -y; + result.z = -z; + return result; + } + + float Magnitude(void) const + { + return float(sqrt(x * x + y * y + z * z)); + }; + + float FastMagnitude(void) const + { + return float(sqrtf(x * x + y * y + z * z)); + }; + + float FasterMagnitude(void) const + { + return float(sqrtf(x * x + y * y + z * z)); + }; + + void Lerp(const Vector3d& from,const Vector3d& to,float slerp) + { + x = ((to.x - from.x) * slerp) + from.x; + y = ((to.y - from.y) * slerp) + from.y; + z = ((to.z - from.z) * slerp) + from.z; + }; + + // Highly specialized interpolate routine. Will compute the interpolated position + // shifted forward or backwards along the ray defined between (from) and (to). + // Reason for existance is so that when a bullet collides with a wall, for + // example, you can generate a graphic effect slightly *before* it hit the + // wall so that the effect doesn't sort into the wall itself. + void Interpolate(const Vector3d &from,const Vector3d &to,float offset) + { + x = to.x-from.x; + y = to.y-from.y; + z = to.z-from.z; + float d = sqrtf( x*x + y*y + z*z ); + float recip = 1.0f / d; + x*=recip; + y*=recip; + z*=recip; // normalize vector + d+=offset; // shift along ray + x = x*d + from.x; + y = y*d + from.y; + z = z*d + from.z; + }; + + bool BinaryEqual(const Vector3d &p) const + { + const int *source = (const int *) &x; + const int *dest = (const int *) &p.x; + + if ( source[0] == dest[0] && + source[1] == dest[1] && + source[2] == dest[2] ) return true; + + return false; + }; + + /*bool BinaryEqual(const Vector3d &p) const + { + if ( x == p.x && y == p.y && z == p.z ) return true; + return false; + } + */ + + + +/** Computes the reflection vector between two vectors.*/ + void Reflection(const Vector3d &a,const Vector3d &b)// compute reflection vector. + { + Vector3d c; + Vector3d d; + + float dot = a.Dot(b) * 2.0f; + + c = b * dot; + + d = c - a; + + x = -d.x; + y = -d.y; + z = -d.z; + }; + + void AngleAxis(float angle,const Vector3d& axis) + { + x = axis.x*angle; + y = axis.y*angle; + z = axis.z*angle; + }; + + float Length(void) const // length of vector. + { + return float(sqrt( x*x + y*y + z*z )); + }; + + + float ComputePlane(const Vector3d &A, + const Vector3d &B, + const Vector3d &C) + { + float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag; + + vx = (B.x - C.x); + vy = (B.y - C.y); + vz = (B.z - C.z); + + wx = (A.x - B.x); + wy = (A.y - B.y); + wz = (A.z - B.z); + + vw_x = vy * wz - vz * wy; + vw_y = vz * wx - vx * wz; + vw_z = vx * wy - vy * wx; + + mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + if ( mag < 0.000001f ) + { + mag = 0; + } + else + { + mag = 1.0f/mag; + } + + x = vw_x * mag; + y = vw_y * mag; + z = vw_z * mag; + + + float D = 0.0f - ((x*A.x)+(y*A.y)+(z*A.z)); + + return D; + } + + + float FastLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y + z*z )); + }; + + + float FasterLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y + z*z )); + }; + + float Length2(void) const // squared distance, prior to square root. + { + float l2 = x*x+y*y+z*z; + return l2; + }; + + float Distance(const Vector3d &a) const // distance between two points. + { + Vector3d d(a.x-x,a.y-y,a.z-z); + return d.Length(); + } + + float FastDistance(const Vector3d &a) const // distance between two points. + { + Vector3d d(a.x-x,a.y-y,a.z-z); + return d.FastLength(); + } + + float FasterDistance(const Vector3d &a) const // distance between two points. + { + Vector3d d(a.x-x,a.y-y,a.z-z); + return d.FasterLength(); + } + + + float DistanceXY(const Vector3d &a) const + { + float dx = a.x - x; + float dy = a.y - y; + float dist = dx*dx + dy*dy; + return dist; + } + + float Distance2(const Vector3d &a) const // squared distance. + { + float dx = a.x - x; + float dy = a.y - y; + float dz = a.z - z; + return dx*dx + dy*dy + dz*dz; + }; + + float Partial(const Vector3d &p) const + { + return (x*p.y) - (p.x*y); + } + + float Area(const Vector3d &p1,const Vector3d &p2) const + { + float A = Partial(p1); + A+= p1.Partial(p2); + A+= p2.Partial(*this); + return A*0.5f; + } + + inline float Normalize(void) // normalize to a unit vector, returns distance. + { + float d = sqrtf( static_cast< float >( x*x + y*y + z*z ) ); + if ( d > 0 ) + { + float r = 1.0f / d; + x *= r; + y *= r; + z *= r; + } + else + { + x = y = z = 1; + } + return d; + }; + + inline float FastNormalize(void) // normalize to a unit vector, returns distance. + { + float d = sqrt( static_cast< float >( x*x + y*y + z*z ) ); + if ( d > 0 ) + { + float r = 1.0f / d; + x *= r; + y *= r; + z *= r; + } + else + { + x = y = z = 1; + } + return d; + }; + + inline float FasterNormalize(void) // normalize to a unit vector, returns distance. + { + float d = sqrtf( static_cast< float >( x*x + y*y + z*z ) ); + if ( d > 0 ) + { + float r = 1.0f / d; + x *= r; + y *= r; + z *= r; + } + else + { + x = y = z = 1; + } + return d; + }; + + + + + float Dot(const Vector3d &a) const // computes dot product. + { + return (x * a.x + y * a.y + z * a.z ); + }; + + + Vector3d Cross( const Vector3d& other ) const + { + Vector3d result( y*other.z - z*other.y, z*other.x - x*other.z, x*other.y - y*other.x ); + + return result; + } + + void Cross(const Vector3d &a,const Vector3d &b) // cross two vectors result in this one. + { + x = a.y*b.z - a.z*b.y; + y = a.z*b.x - a.x*b.z; + z = a.x*b.y - a.y*b.x; + }; + + /******************************************/ + // Check if next edge (b to c) turns inward + // + // Edge from a to b is already in face + // Edge from b to c is being considered for addition to face + /******************************************/ + bool Concave(const Vector3d& a,const Vector3d& b) + { + float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag,nx,ny,nz,mag_a,mag_b; + + wx = b.x - a.x; + wy = b.y - a.y; + wz = b.z - a.z; + + mag_a = (float) sqrtf((wx * wx) + (wy * wy) + (wz * wz)); + + vx = x - b.x; + vy = y - b.y; + vz = z - b.z; + + mag_b = (float) sqrtf((vx * vx) + (vy * vy) + (vz * vz)); + + vw_x = (vy * wz) - (vz * wy); + vw_y = (vz * wx) - (vx * wz); + vw_z = (vx * wy) - (vy * wx); + + mag = (float) sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + // Check magnitude of cross product, which is a sine function + // i.e., mag (a x b) = mag (a) * mag (b) * sin (theta); + // If sin (theta) small, then angle between edges is very close to + // 180, which we may want to call a concavity. Setting the + // CONCAVITY_TOLERANCE value greater than about 0.01 MAY cause + // face consolidation to get stuck on particular face. Most meshes + // convert properly with a value of 0.0 + + if (mag/(mag_a*mag_b) <= 0.0f ) return true; + + mag = 1.0f / mag; + + nx = vw_x * mag; + ny = vw_y * mag; + nz = vw_z * mag; + + // Dot product of tri normal with cross product result will + // yield positive number if edges are convex (+1.0 if two tris + // are coplanar), negative number if edges are concave (-1.0 if + // two tris are coplanar.) + + mag = ( x * nx) + ( y * ny) + ( z * nz); + + if (mag > 0.0f ) return false; + + return(true); + }; + + bool PointTestXY(const Vector3d &i,const Vector3d &j) const + { + if (((( i.y <= y ) && ( y < j.y )) || + (( j.y <= y ) && ( y < i.y ))) && + ( x < (j.x - i.x) * (y - i.y) / (j.y - i.y) + i.x)) return true; + return false; + } + + // test to see if this point is inside the triangle specified by + // these three points on the X/Y plane. + bool PointInTriXY(const Vector3d &p1, + const Vector3d &p2, + const Vector3d &p3) const + { + float ax = p3.x - p2.x; + float ay = p3.y - p2.y; + float bx = p1.x - p3.x; + float by = p1.y - p3.y; + float cx = p2.x - p1.x; + float cy = p2.y - p1.y; + float apx = x - p1.x; + float apy = y - p1.y; + float bpx = x - p2.x; + float bpy = y - p2.y; + float cpx = x - p3.x; + float cpy = y - p3.y; + + float aCROSSbp = ax*bpy - ay*bpx; + float cCROSSap = cx*apy - cy*apx; + float bCROSScp = bx*cpy - by*cpx; + + return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); + }; + + // test to see if this point is inside the triangle specified by + // these three points on the X/Y plane. + bool PointInTriYZ(const Vector3d &p1, + const Vector3d &p2, + const Vector3d &p3) const + { + float ay = p3.y - p2.y; + float az = p3.z - p2.z; + float by = p1.y - p3.y; + float bz = p1.z - p3.z; + float cy = p2.y - p1.y; + float cz = p2.z - p1.z; + float apy = y - p1.y; + float apz = z - p1.z; + float bpy = y - p2.y; + float bpz = z - p2.z; + float cpy = y - p3.y; + float cpz = z - p3.z; + + float aCROSSbp = ay*bpz - az*bpy; + float cCROSSap = cy*apz - cz*apy; + float bCROSScp = by*cpz - bz*cpy; + + return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); + }; + + + // test to see if this point is inside the triangle specified by + // these three points on the X/Y plane. + bool PointInTriXZ(const Vector3d &p1, + const Vector3d &p2, + const Vector3d &p3) const + { + float az = p3.z - p2.z; + float ax = p3.x - p2.x; + float bz = p1.z - p3.z; + float bx = p1.x - p3.x; + float cz = p2.z - p1.z; + float cx = p2.x - p1.x; + float apz = z - p1.z; + float apx = x - p1.x; + float bpz = z - p2.z; + float bpx = x - p2.x; + float cpz = z - p3.z; + float cpx = x - p3.x; + + float aCROSSbp = az*bpx - ax*bpz; + float cCROSSap = cz*apx - cx*apz; + float bCROSScp = bz*cpx - bx*cpz; + + return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); + }; + + // Given a point and a line (defined by two points), compute the closest point + // in the line. (The line is treated as infinitely long.) + void NearestPointInLine(const Vector3d &point, + const Vector3d &line0, + const Vector3d &line1) + { + Vector3d &nearestPoint = *this; + Vector3d lineDelta = line1 - line0; + + // Handle degenerate lines + if ( lineDelta == Vector3d(0, 0, 0) ) + { + nearestPoint = line0; + } + else + { + float delta = (point-line0).Dot(lineDelta) / (lineDelta).Dot(lineDelta); + nearestPoint = line0 + lineDelta*delta; + } + } + + // Given a point and a line segment (defined by two points), compute the closest point + // in the line. Cap the point at the endpoints of the line segment. + void NearestPointInLineSegment(const Vector3d &point, + const Vector3d &line0, + const Vector3d &line1) + { + Vector3d &nearestPoint = *this; + Vector3d lineDelta = line1 - line0; + + // Handle degenerate lines + if ( lineDelta == Vector3d(0, 0, 0) ) + { + nearestPoint = line0; + } + else + { + float delta = (point-line0).Dot(lineDelta) / (lineDelta).Dot(lineDelta); + + // Clamp the point to conform to the segment's endpoints + if ( delta < 0 ) + delta = 0; + else if ( delta > 1 ) + delta = 1; + + nearestPoint = line0 + lineDelta*delta; + } + } + + // Given a point and a plane (defined by three points), compute the closest point + // in the plane. (The plane is unbounded.) + void NearestPointInPlane(const Vector3d &point, + const Vector3d &triangle0, + const Vector3d &triangle1, + const Vector3d &triangle2) + { + Vector3d &nearestPoint = *this; + Vector3d lineDelta0 = triangle1 - triangle0; + Vector3d lineDelta1 = triangle2 - triangle0; + Vector3d pointDelta = point - triangle0; + Vector3d normal; + + // Get the normal of the polygon (doesn't have to be a unit vector) + normal.Cross(lineDelta0, lineDelta1); + + float delta = normal.Dot(pointDelta) / normal.Dot(normal); + nearestPoint = point - normal*delta; + } + + // Given a point and a plane (defined by a coplanar point and a normal), compute the closest point + // in the plane. (The plane is unbounded.) + void NearestPointInPlane(const Vector3d &point, + const Vector3d &planePoint, + const Vector3d &planeNormal) + { + Vector3d &nearestPoint = *this; + Vector3d pointDelta = point - planePoint; + + float delta = planeNormal.Dot(pointDelta) / planeNormal.Dot(planeNormal); + nearestPoint = point - planeNormal*delta; + } + + // Given a point and a triangle (defined by three points), compute the closest point + // in the triangle. Clamp the point so it's confined to the area of the triangle. + void NearestPointInTriangle(const Vector3d &point, + const Vector3d &triangle0, + const Vector3d &triangle1, + const Vector3d &triangle2) + { + static const Vector3d zeroVector(0, 0, 0); + + Vector3d &nearestPoint = *this; + + Vector3d lineDelta0 = triangle1 - triangle0; + Vector3d lineDelta1 = triangle2 - triangle0; + + // Handle degenerate triangles + if ( (lineDelta0 == zeroVector) || (lineDelta1 == zeroVector) ) + { + nearestPoint.NearestPointInLineSegment(point, triangle1, triangle2); + } + else if ( lineDelta0 == lineDelta1 ) + { + nearestPoint.NearestPointInLineSegment(point, triangle0, triangle1); + } + + else + { + static Vector3d axis[3]; + axis[0].NearestPointInLine(triangle0, triangle1, triangle2); + axis[1].NearestPointInLine(triangle1, triangle0, triangle2); + axis[2].NearestPointInLine(triangle2, triangle0, triangle1); + + float axisDot[3]; + axisDot[0] = (triangle0-axis[0]).Dot(point-axis[0]); + axisDot[1] = (triangle1-axis[1]).Dot(point-axis[1]); + axisDot[2] = (triangle2-axis[2]).Dot(point-axis[2]); + + bool bForce = true; + float bestMagnitude2 = 0; + float closeMagnitude2; + Vector3d closePoint; + + if ( axisDot[0] < 0 ) + { + closePoint.NearestPointInLineSegment(point, triangle1, triangle2); + closeMagnitude2 = point.Distance2(closePoint); + if ( bForce || (bestMagnitude2 > closeMagnitude2) ) + { + bForce = false; + bestMagnitude2 = closeMagnitude2; + nearestPoint = closePoint; + } + } + if ( axisDot[1] < 0 ) + { + closePoint.NearestPointInLineSegment(point, triangle0, triangle2); + closeMagnitude2 = point.Distance2(closePoint); + if ( bForce || (bestMagnitude2 > closeMagnitude2) ) + { + bForce = false; + bestMagnitude2 = closeMagnitude2; + nearestPoint = closePoint; + } + } + if ( axisDot[2] < 0 ) + { + closePoint.NearestPointInLineSegment(point, triangle0, triangle1); + closeMagnitude2 = point.Distance2(closePoint); + if ( bForce || (bestMagnitude2 > closeMagnitude2) ) + { + bForce = false; + bestMagnitude2 = closeMagnitude2; + nearestPoint = closePoint; + } + } + + // If bForce is true at this point, it means the nearest point lies + // inside the triangle; use the nearest-point-on-a-plane equation + if ( bForce ) + { + Vector3d normal; + + // Get the normal of the polygon (doesn't have to be a unit vector) + normal.Cross(lineDelta0, lineDelta1); + + Vector3d pointDelta = point - triangle0; + float delta = normal.Dot(pointDelta) / normal.Dot(normal); + + nearestPoint = point - normal*delta; + } + } + } + + +//private: + + float x; + float y; + float z; +}; + + +class Vector2d +{ +public: + Vector2d(void) { }; // null constructor, does not inialize point. + + Vector2d(const Vector2d &a) // constructor copies existing vector. + { + x = a.x; + y = a.y; + }; + + Vector2d(const float *t) + { + x = t[0]; + y = t[1]; + }; + + + Vector2d(float a,float b) // construct with initial point. + { + x = a; + y = b; + }; + + const float* Ptr() const { return &x; } + float* Ptr() { return &x; } + + Vector2d & operator+=(const Vector2d &a) // += operator. + { + x+=a.x; + y+=a.y; + return *this; + }; + + Vector2d & operator-=(const Vector2d &a) + { + x-=a.x; + y-=a.y; + return *this; + }; + + Vector2d & operator*=(const Vector2d &a) + { + x*=a.x; + y*=a.y; + return *this; + }; + + Vector2d & operator/=(const Vector2d &a) + { + x/=a.x; + y/=a.y; + return *this; + }; + + bool operator==(const Vector2d &a) const + { + if ( a.x == x && a.y == y ) return true; + return false; + }; + + bool operator!=(const Vector2d &a) const + { + if ( a.x != x || a.y != y ) return true; + return false; + }; + + Vector2d operator+(Vector2d a) const + { + a.x+=x; + a.y+=y; + return a; + }; + + Vector2d operator-(Vector2d a) const + { + a.x = x-a.x; + a.y = y-a.y; + return a; + }; + + Vector2d operator - (void) const + { + return negative(); + }; + + Vector2d operator*(Vector2d a) const + { + a.x*=x; + a.y*=y; + return a; + }; + + Vector2d operator*(float c) const + { + Vector2d a; + + a.x = x * c; + a.y = y * c; + + return a; + }; + + Vector2d operator/(Vector2d a) const + { + a.x = x/a.x; + a.y = y/a.y; + return a; + }; + + + float Dot(const Vector2d &a) const // computes dot product. + { + return (x * a.x + y * a.y ); + }; + + float GetX(void) const { return x; }; + float GetY(void) const { return y; }; + + void SetX(float t) { x = t; }; + void SetY(float t) { y = t; }; + + void Set(float a,float b) + { + x = a; + y = b; + }; + + void Zero(void) + { + x = y = 0; + }; + + Vector2d negative(void) const + { + Vector2d result; + result.x = -x; + result.y = -y; + return result; + } + + float magnitude(void) const + { + return (float) sqrtf(x * x + y * y ); + } + + float fastmagnitude(void) const + { + return (float) sqrtf(x * x + y * y ); + } + + float fastermagnitude(void) const + { + return (float) sqrtf( x * x + y * y ); + } + + void Reflection(Vector2d &a,Vector2d &b); // compute reflection vector. + + float Length(void) const // length of vector. + { + return float(sqrtf( x*x + y*y )); + }; + + float FastLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y )); + }; + + float FasterLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y )); + }; + + float Length2(void) // squared distance, prior to square root. + { + return x*x+y*y; + } + + float Distance(const Vector2d &a) const // distance between two points. + { + float dx = a.x - x; + float dy = a.y - y; + float d = dx*dx+dy*dy; + return sqrtf(d); + }; + + float FastDistance(const Vector2d &a) const // distance between two points. + { + float dx = a.x - x; + float dy = a.y - y; + float d = dx*dx+dy*dy; + return sqrtf(d); + }; + + float FasterDistance(const Vector2d &a) const // distance between two points. + { + float dx = a.x - x; + float dy = a.y - y; + float d = dx*dx+dy*dy; + return sqrtf(d); + }; + + float Distance2(Vector2d &a) // squared distance. + { + float dx = a.x - x; + float dy = a.y - y; + return dx*dx + dy *dy; + }; + + void Lerp(const Vector2d& from,const Vector2d& to,float slerp) + { + x = ((to.x - from.x)*slerp) + from.x; + y = ((to.y - from.y)*slerp) + from.y; + }; + + + void Cross(const Vector2d &a,const Vector2d &b) // cross two vectors result in this one. + { + x = a.y*b.x - a.x*b.y; + y = a.x*b.x - a.x*b.x; + }; + + float Normalize(void) // normalize to a unit vector, returns distance. + { + float l = Length(); + if ( l != 0 ) + { + l = float( 1 ) / l; + x*=l; + y*=l; + } + else + { + x = y = 0; + } + return l; + }; + + float FastNormalize(void) // normalize to a unit vector, returns distance. + { + float l = FastLength(); + if ( l != 0 ) + { + l = float( 1 ) / l; + x*=l; + y*=l; + } + else + { + x = y = 0; + } + return l; + }; + + float FasterNormalize(void) // normalize to a unit vector, returns distance. + { + float l = FasterLength(); + if ( l != 0 ) + { + l = float( 1 ) / l; + x*=l; + y*=l; + } + else + { + x = y = 0; + } + return l; + }; + + + float x; + float y; +}; + +class Line +{ +public: + Line(const Vector3d &from,const Vector3d &to) + { + mP1 = from; + mP2 = to; + }; + // JWR Test for the intersection of two lines. + + bool Intersect(const Line& src,Vector3d §); +private: + Vector3d mP1; + Vector3d mP2; + +}; + + +typedef std::vector< Vector3d > Vector3dVector; +typedef std::vector< Vector2d > Vector2dVector; + +inline Vector3d operator * (float s, const Vector3d &v ) +{ + Vector3d Scaled(v.x*s, v.y*s, v.z*s); + return(Scaled); +} + +inline Vector2d operator * (float s, const Vector2d &v ) + { + Vector2d Scaled(v.x*s, v.y*s); + return(Scaled); + } + +} + +#endif diff --git a/Extras/ConvexDecomposition/cd_wavefront.cpp b/Extras/ConvexDecomposition/cd_wavefront.cpp index fdd5f9884..98d2bd25c 100644 --- a/Extras/ConvexDecomposition/cd_wavefront.cpp +++ b/Extras/ConvexDecomposition/cd_wavefront.cpp @@ -1,860 +1,860 @@ -#include -#include -#include -#include -#include - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// -#include "float_math.h" - -#include "cd_wavefront.h" - - -using namespace ConvexDecomposition; - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -#include - -namespace ConvexDecomposition -{ - -typedef std::vector< int > IntVector; -typedef std::vector< float > FloatVector; - -#if defined(__APPLE__) || defined(__CELLOS_LV2__) -#define stricmp(a, b) strcasecmp((a), (b)) -#endif - -/*******************************************************************/ -/******************** InParser.h ********************************/ -/*******************************************************************/ -class InPlaceParserInterface -{ -public: - virtual ~InPlaceParserInterface () {} ; - - virtual int ParseLine(int lineno,int argc,const char **argv) =0; // return TRUE to continue parsing, return FALSE to abort parsing process -}; - -enum SeparatorType -{ - ST_DATA, // is data - ST_HARD, // is a hard separator - ST_SOFT, // is a soft separator - ST_EOS // is a comment symbol, and everything past this character should be ignored -}; - -class InPlaceParser -{ -public: - InPlaceParser(void) - { - Init(); - } - - InPlaceParser(char *data,int len) - { - Init(); - SetSourceData(data,len); - } - - InPlaceParser(const char *fname) - { - Init(); - SetFile(fname); - } - - ~InPlaceParser(void); - - void Init(void) - { - mQuoteChar = 34; - mData = 0; - mLen = 0; - mMyAlloc = false; - for (int i=0; i<256; i++) - { - mHard[i] = ST_DATA; - mHardString[i*2] = i; - mHardString[i*2+1] = 0; - } - mHard[0] = ST_EOS; - mHard[32] = ST_SOFT; - mHard[9] = ST_SOFT; - mHard[13] = ST_SOFT; - mHard[10] = ST_SOFT; - } - - void SetFile(const char *fname); // use this file as source data to parse. - - void SetSourceData(char *data,int len) - { - mData = data; - mLen = len; - mMyAlloc = false; - }; - - int Parse(InPlaceParserInterface *callback); // returns true if entire file was parsed, false if it aborted for some reason - - int ProcessLine(int lineno,char *line,InPlaceParserInterface *callback); - - const char ** GetArglist(char *source,int &count); // convert source string into an arg list, this is a destructive parse. - - void SetHardSeparator(char c) // add a hard separator - { - mHard[(int)c] = ST_HARD; - } - - void SetHard(char c) // add a hard separator - { - mHard[(int)c] = ST_HARD; - } - - - void SetCommentSymbol(char c) // comment character, treated as 'end of string' - { - mHard[(int)c] = ST_EOS; - } - - void ClearHardSeparator(char c) - { - mHard[(int)c] = ST_DATA; - } - - - void DefaultSymbols(void); // set up default symbols for hard seperator and comment symbol of the '#' character. - - bool EOS(char c) - { - if ( mHard[(int)c] == ST_EOS ) - { - return true; - } - return false; - } - - void SetQuoteChar(char c) - { - mQuoteChar = c; - } - -private: - - - inline char * AddHard(int &argc,const char **argv,char *foo); - inline bool IsHard(char c); - inline char * SkipSpaces(char *foo); - inline bool IsWhiteSpace(char c); - inline bool IsNonSeparator(char c); // non seperator,neither hard nor soft - - bool mMyAlloc; // whether or not *I* allocated the buffer and am responsible for deleting it. - char *mData; // ascii data to parse. - int mLen; // length of data - SeparatorType mHard[256]; - char mHardString[256*2]; - char mQuoteChar; -}; - -/*******************************************************************/ -/******************** InParser.cpp ********************************/ -/*******************************************************************/ -void InPlaceParser::SetFile(const char *fname) -{ - if ( mMyAlloc ) - { - free(mData); - } - mData = 0; - mLen = 0; - mMyAlloc = false; - - - FILE *fph = fopen(fname,"rb"); - if ( fph ) - { - fseek(fph,0L,SEEK_END); - mLen = ftell(fph); - fseek(fph,0L,SEEK_SET); - if ( mLen ) - { - mData = (char *) malloc(sizeof(char)*(mLen+1)); - int ok = fread(mData, mLen, 1, fph); - if ( !ok ) - { - free(mData); - mData = 0; - } - else - { - mData[mLen] = 0; // zero byte terminate end of file marker. - mMyAlloc = true; - } - } - fclose(fph); - } -} - -InPlaceParser::~InPlaceParser(void) -{ - if ( mMyAlloc ) - { - free(mData); - } -} - -#define MAXARGS 512 - -bool InPlaceParser::IsHard(char c) -{ - return mHard[(int)c] == ST_HARD; -} - -char * InPlaceParser::AddHard(int &argc,const char **argv,char *foo) -{ - while ( IsHard(*foo) ) - { - const char *hard = &mHardString[*foo*2]; - if ( argc < MAXARGS ) - { - argv[argc++] = hard; - } - foo++; - } - return foo; -} - -bool InPlaceParser::IsWhiteSpace(char c) -{ - return mHard[(int)c] == ST_SOFT; -} - -char * InPlaceParser::SkipSpaces(char *foo) -{ - while ( !EOS(*foo) && IsWhiteSpace(*foo) ) foo++; - return foo; -} - -bool InPlaceParser::IsNonSeparator(char c) -{ - if ( !IsHard(c) && !IsWhiteSpace(c) && c != 0 ) return true; - return false; -} - - -int InPlaceParser::ProcessLine(int lineno,char *line,InPlaceParserInterface *callback) -{ - int ret = 0; - - const char *argv[MAXARGS]; - int argc = 0; - - char *foo = line; - - while ( !EOS(*foo) && argc < MAXARGS ) - { - - foo = SkipSpaces(foo); // skip any leading spaces - - if ( EOS(*foo) ) break; - - if ( *foo == mQuoteChar ) // if it is an open quote - { - foo++; - if ( argc < MAXARGS ) - { - argv[argc++] = foo; - } - while ( !EOS(*foo) && *foo != mQuoteChar ) foo++; - if ( !EOS(*foo) ) - { - *foo = 0; // replace close quote with zero byte EOS - foo++; - } - } - else - { - - foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces - - if ( IsNonSeparator(*foo) ) // add non-hard argument. - { - bool quote = false; - if ( *foo == mQuoteChar ) - { - foo++; - quote = true; - } - - if ( argc < MAXARGS ) - { - argv[argc++] = foo; - } - - if ( quote ) - { - while (*foo && *foo != mQuoteChar ) foo++; - if ( *foo ) *foo = 32; - } - - // continue..until we hit an eos .. - while ( !EOS(*foo) ) // until we hit EOS - { - if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit - { - *foo = 0; - foo++; - break; - } - else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument - { - const char *hard = &mHardString[*foo*2]; - *foo = 0; - if ( argc < MAXARGS ) - { - argv[argc++] = hard; - } - foo++; - break; - } - foo++; - } // end of while loop... - } - } - } - - if ( argc ) - { - ret = callback->ParseLine(lineno, argc, argv ); - } - - return ret; -} - -int InPlaceParser::Parse(InPlaceParserInterface *callback) // returns true if entire file was parsed, false if it aborted for some reason -{ - assert( callback ); - if ( !mData ) return 0; - - int ret = 0; - - int lineno = 0; - - char *foo = mData; - char *begin = foo; - - - while ( *foo ) - { - if ( *foo == 10 || *foo == 13 ) - { - lineno++; - *foo = 0; - - if ( *begin ) // if there is any data to parse at all... - { - int v = ProcessLine(lineno,begin,callback); - if ( v ) ret = v; - } - - foo++; - if ( *foo == 10 ) foo++; // skip line feed, if it is in the carraige-return line-feed format... - begin = foo; - } - else - { - foo++; - } - } - - lineno++; // lasst line. - - int v = ProcessLine(lineno,begin,callback); - if ( v ) ret = v; - return ret; -} - - -void InPlaceParser::DefaultSymbols(void) -{ - SetHardSeparator(','); - SetHardSeparator('('); - SetHardSeparator(')'); - SetHardSeparator('='); - SetHardSeparator('['); - SetHardSeparator(']'); - SetHardSeparator('{'); - SetHardSeparator('}'); - SetCommentSymbol('#'); -} - - -const char ** InPlaceParser::GetArglist(char *line,int &count) // convert source string into an arg list, this is a destructive parse. -{ - const char **ret = 0; - - static const char *argv[MAXARGS]; - int argc = 0; - - char *foo = line; - - while ( !EOS(*foo) && argc < MAXARGS ) - { - - foo = SkipSpaces(foo); // skip any leading spaces - - if ( EOS(*foo) ) break; - - if ( *foo == mQuoteChar ) // if it is an open quote - { - foo++; - if ( argc < MAXARGS ) - { - argv[argc++] = foo; - } - while ( !EOS(*foo) && *foo != mQuoteChar ) foo++; - if ( !EOS(*foo) ) - { - *foo = 0; // replace close quote with zero byte EOS - foo++; - } - } - else - { - - foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces - - if ( IsNonSeparator(*foo) ) // add non-hard argument. - { - bool quote = false; - if ( *foo == mQuoteChar ) - { - foo++; - quote = true; - } - - if ( argc < MAXARGS ) - { - argv[argc++] = foo; - } - - if ( quote ) - { - while (*foo && *foo != mQuoteChar ) foo++; - if ( *foo ) *foo = 32; - } - - // continue..until we hit an eos .. - while ( !EOS(*foo) ) // until we hit EOS - { - if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit - { - *foo = 0; - foo++; - break; - } - else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument - { - const char *hard = &mHardString[*foo*2]; - *foo = 0; - if ( argc < MAXARGS ) - { - argv[argc++] = hard; - } - foo++; - break; - } - foo++; - } // end of while loop... - } - } - } - - count = argc; - if ( argc ) - { - ret = argv; - } - - return ret; -} - -/*******************************************************************/ -/******************** Geometry.h ********************************/ -/*******************************************************************/ - -class GeometryVertex -{ -public: - float mPos[3]; - float mNormal[3]; - float mTexel[2]; -}; - - -class GeometryInterface -{ -public: - - virtual void NodeTriangle(const GeometryVertex *v1,const GeometryVertex *v2,const GeometryVertex *v3) {} - - virtual ~GeometryInterface () {} -}; - - -/*******************************************************************/ -/******************** Obj.h ********************************/ -/*******************************************************************/ - - -class OBJ : public InPlaceParserInterface -{ -public: - int LoadMesh(const char *fname,GeometryInterface *callback); - int ParseLine(int lineno,int argc,const char **argv); // return TRUE to continue parsing, return FALSE to abort parsing process -private: - - void getVertex(GeometryVertex &v,const char *face) const; - - FloatVector mVerts; - FloatVector mTexels; - FloatVector mNormals; - - GeometryInterface *mCallback; -}; - - -/*******************************************************************/ -/******************** Obj.cpp ********************************/ -/*******************************************************************/ - -int OBJ::LoadMesh(const char *fname,GeometryInterface *iface) -{ - int ret = 0; - - mVerts.clear(); - mTexels.clear(); - mNormals.clear(); - - mCallback = iface; - - InPlaceParser ipp(fname); - - ipp.Parse(this); - - - return ret; -} - -//static const char * GetArg(const char **argv,int i,int argc) -//{ - // const char * ret = 0; - // if ( i < argc ) ret = argv[i]; - // return ret; -//} - -void OBJ::getVertex(GeometryVertex &v,const char *face) const -{ - v.mPos[0] = 0; - v.mPos[1] = 0; - v.mPos[2] = 0; - - v.mTexel[0] = 0; - v.mTexel[1] = 0; - - v.mNormal[0] = 0; - v.mNormal[1] = 1; - v.mNormal[2] = 0; - - int index = atoi( face )-1; - - const char *texel = strstr(face,"/"); - - if ( texel ) - { - int tindex = atoi( texel+1) - 1; - - if ( tindex >=0 && tindex < (int)(mTexels.size()/2) ) - { - const float *t = &mTexels[tindex*2]; - - v.mTexel[0] = t[0]; - v.mTexel[1] = t[1]; - - } - - const char *normal = strstr(texel+1,"/"); - if ( normal ) - { - int nindex = atoi( normal+1 ) - 1; - - if (nindex >= 0 && nindex < (int)(mNormals.size()/3) ) - { - const float *n = &mNormals[nindex*3]; - - v.mNormal[0] = n[0]; - v.mNormal[1] = n[1]; - v.mNormal[2] = n[2]; - } - } - } - - if ( index >= 0 && index < (int)(mVerts.size()/3) ) - { - - const float *p = &mVerts[index*3]; - - v.mPos[0] = p[0]; - v.mPos[1] = p[1]; - v.mPos[2] = p[2]; - } - -} - -int OBJ::ParseLine(int lineno,int argc,const char **argv) // return TRUE to continue parsing, return FALSE to abort parsing process -{ - int ret = 0; - - if ( argc >= 1 ) - { - const char *foo = argv[0]; - if ( *foo != '#' ) - { - if ( strcmp(argv[0],"v") == 0 && argc == 4 ) - - //if ( stricmp(argv[0],"v") == 0 && argc == 4 ) - { - float vx = (float) atof( argv[1] ); - float vy = (float) atof( argv[2] ); - float vz = (float) atof( argv[3] ); - mVerts.push_back(vx); - mVerts.push_back(vy); - mVerts.push_back(vz); - } - else if ( strcmp(argv[0],"vt") == 0 && argc == 3 ) - - // else if ( stricmp(argv[0],"vt") == 0 && argc == 3 ) - { - float tx = (float) atof( argv[1] ); - float ty = (float) atof( argv[2] ); - mTexels.push_back(tx); - mTexels.push_back(ty); - } - // else if ( stricmp(argv[0],"vn") == 0 && argc == 4 ) - - else if ( strcmp(argv[0],"vn") == 0 && argc == 4 ) - { - float normalx = (float) atof(argv[1]); - float normaly = (float) atof(argv[2]); - float normalz = (float) atof(argv[3]); - mNormals.push_back(normalx); - mNormals.push_back(normaly); - mNormals.push_back(normalz); - } -// else if ( stricmp(argv[0],"f") == 0 && argc >= 4 ) - - else if ( strcmp(argv[0],"f") == 0 && argc >= 4 ) - { - GeometryVertex v[32]; - - int vcount = argc-1; - - for (int i=1; i p1( v[0].mPos ); - Vector3d p2( v[1].mPos ); - Vector3d p3( v[2].mPos ); - - Vector3d n; - n.ComputeNormal(p3,p2,p1); - - for (int i=0; iNodeTriangle(&v[0],&v[1],&v[2]); - - if ( vcount >=3 ) // do the fan - { - for (int i=2; i<(vcount-1); i++) - { - mCallback->NodeTriangle(&v[0],&v[i],&v[i+1]); - } - } - - } - } - } - - return ret; -} - - - - -class BuildMesh : public GeometryInterface -{ -public: - - int getIndex(const float *p) - { - - int vcount = mVertices.size()/3; - - if(vcount>0) - { - //New MS STL library checks indices in debug build, so zero causes an assert if it is empty. - const float *v = &mVertices[0]; - - for (int i=0; imPos) ); - mIndices.push_back( getIndex(v2->mPos) ); - mIndices.push_back( getIndex(v3->mPos) ); - } - - const FloatVector& GetVertices(void) const { return mVertices; }; - const IntVector& GetIndices(void) const { return mIndices; }; - -private: - FloatVector mVertices; - IntVector mIndices; -}; - - -WavefrontObj::WavefrontObj(void) -{ - mVertexCount = 0; - mTriCount = 0; - mIndices = 0; - mVertices = 0; -} - -WavefrontObj::~WavefrontObj(void) -{ - delete [] mIndices; - delete [] mVertices; -} - -unsigned int WavefrontObj::loadObj(const char *fname) // load a wavefront obj returns number of triangles that were loaded. Data is persists until the class is destructed. -{ - - unsigned int ret = 0; - - delete [] mVertices; - mVertices = 0; - delete [] mIndices; - mIndices = 0; - mVertexCount = 0; - mTriCount = 0; - - - BuildMesh bm; - - OBJ obj; - - obj.LoadMesh(fname,&bm); - - - const FloatVector &vlist = bm.GetVertices(); - const IntVector &indices = bm.GetIndices(); - if ( vlist.size() ) - { - mVertexCount = vlist.size()/3; - mVertices = new float[mVertexCount*3]; - memcpy( mVertices, &vlist[0], sizeof(float)*mVertexCount*3 ); - mTriCount = indices.size()/3; - mIndices = new int[mTriCount*3*sizeof(int)]; - memcpy(mIndices, &indices[0], sizeof(int)*mTriCount*3); - ret = mTriCount; - } - - - return ret; -} - -} +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// +#include "float_math.h" + +#include "cd_wavefront.h" + + +using namespace ConvexDecomposition; + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +#include + +namespace ConvexDecomposition +{ + +typedef std::vector< int > IntVector; +typedef std::vector< float > FloatVector; + +#if defined(__APPLE__) || defined(__CELLOS_LV2__) +#define stricmp(a, b) strcasecmp((a), (b)) +#endif + +/*******************************************************************/ +/******************** InParser.h ********************************/ +/*******************************************************************/ +class InPlaceParserInterface +{ +public: + virtual ~InPlaceParserInterface () {} ; + + virtual int ParseLine(int lineno,int argc,const char **argv) =0; // return TRUE to continue parsing, return FALSE to abort parsing process +}; + +enum SeparatorType +{ + ST_DATA, // is data + ST_HARD, // is a hard separator + ST_SOFT, // is a soft separator + ST_EOS // is a comment symbol, and everything past this character should be ignored +}; + +class InPlaceParser +{ +public: + InPlaceParser(void) + { + Init(); + } + + InPlaceParser(char *data,int len) + { + Init(); + SetSourceData(data,len); + } + + InPlaceParser(const char *fname) + { + Init(); + SetFile(fname); + } + + ~InPlaceParser(void); + + void Init(void) + { + mQuoteChar = 34; + mData = 0; + mLen = 0; + mMyAlloc = false; + for (int i=0; i<256; i++) + { + mHard[i] = ST_DATA; + mHardString[i*2] = i; + mHardString[i*2+1] = 0; + } + mHard[0] = ST_EOS; + mHard[32] = ST_SOFT; + mHard[9] = ST_SOFT; + mHard[13] = ST_SOFT; + mHard[10] = ST_SOFT; + } + + void SetFile(const char *fname); // use this file as source data to parse. + + void SetSourceData(char *data,int len) + { + mData = data; + mLen = len; + mMyAlloc = false; + }; + + int Parse(InPlaceParserInterface *callback); // returns true if entire file was parsed, false if it aborted for some reason + + int ProcessLine(int lineno,char *line,InPlaceParserInterface *callback); + + const char ** GetArglist(char *source,int &count); // convert source string into an arg list, this is a destructive parse. + + void SetHardSeparator(char c) // add a hard separator + { + mHard[(int)c] = ST_HARD; + } + + void SetHard(char c) // add a hard separator + { + mHard[(int)c] = ST_HARD; + } + + + void SetCommentSymbol(char c) // comment character, treated as 'end of string' + { + mHard[(int)c] = ST_EOS; + } + + void ClearHardSeparator(char c) + { + mHard[(int)c] = ST_DATA; + } + + + void DefaultSymbols(void); // set up default symbols for hard seperator and comment symbol of the '#' character. + + bool EOS(char c) + { + if ( mHard[(int)c] == ST_EOS ) + { + return true; + } + return false; + } + + void SetQuoteChar(char c) + { + mQuoteChar = c; + } + +private: + + + inline char * AddHard(int &argc,const char **argv,char *foo); + inline bool IsHard(char c); + inline char * SkipSpaces(char *foo); + inline bool IsWhiteSpace(char c); + inline bool IsNonSeparator(char c); // non seperator,neither hard nor soft + + bool mMyAlloc; // whether or not *I* allocated the buffer and am responsible for deleting it. + char *mData; // ascii data to parse. + int mLen; // length of data + SeparatorType mHard[256]; + char mHardString[256*2]; + char mQuoteChar; +}; + +/*******************************************************************/ +/******************** InParser.cpp ********************************/ +/*******************************************************************/ +void InPlaceParser::SetFile(const char *fname) +{ + if ( mMyAlloc ) + { + free(mData); + } + mData = 0; + mLen = 0; + mMyAlloc = false; + + + FILE *fph = fopen(fname,"rb"); + if ( fph ) + { + fseek(fph,0L,SEEK_END); + mLen = ftell(fph); + fseek(fph,0L,SEEK_SET); + if ( mLen ) + { + mData = (char *) malloc(sizeof(char)*(mLen+1)); + int ok = fread(mData, mLen, 1, fph); + if ( !ok ) + { + free(mData); + mData = 0; + } + else + { + mData[mLen] = 0; // zero byte terminate end of file marker. + mMyAlloc = true; + } + } + fclose(fph); + } +} + +InPlaceParser::~InPlaceParser(void) +{ + if ( mMyAlloc ) + { + free(mData); + } +} + +#define MAXARGS 512 + +bool InPlaceParser::IsHard(char c) +{ + return mHard[(int)c] == ST_HARD; +} + +char * InPlaceParser::AddHard(int &argc,const char **argv,char *foo) +{ + while ( IsHard(*foo) ) + { + const char *hard = &mHardString[*foo*2]; + if ( argc < MAXARGS ) + { + argv[argc++] = hard; + } + foo++; + } + return foo; +} + +bool InPlaceParser::IsWhiteSpace(char c) +{ + return mHard[(int)c] == ST_SOFT; +} + +char * InPlaceParser::SkipSpaces(char *foo) +{ + while ( !EOS(*foo) && IsWhiteSpace(*foo) ) foo++; + return foo; +} + +bool InPlaceParser::IsNonSeparator(char c) +{ + if ( !IsHard(c) && !IsWhiteSpace(c) && c != 0 ) return true; + return false; +} + + +int InPlaceParser::ProcessLine(int lineno,char *line,InPlaceParserInterface *callback) +{ + int ret = 0; + + const char *argv[MAXARGS]; + int argc = 0; + + char *foo = line; + + while ( !EOS(*foo) && argc < MAXARGS ) + { + + foo = SkipSpaces(foo); // skip any leading spaces + + if ( EOS(*foo) ) break; + + if ( *foo == mQuoteChar ) // if it is an open quote + { + foo++; + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + while ( !EOS(*foo) && *foo != mQuoteChar ) foo++; + if ( !EOS(*foo) ) + { + *foo = 0; // replace close quote with zero byte EOS + foo++; + } + } + else + { + + foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces + + if ( IsNonSeparator(*foo) ) // add non-hard argument. + { + bool quote = false; + if ( *foo == mQuoteChar ) + { + foo++; + quote = true; + } + + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + + if ( quote ) + { + while (*foo && *foo != mQuoteChar ) foo++; + if ( *foo ) *foo = 32; + } + + // continue..until we hit an eos .. + while ( !EOS(*foo) ) // until we hit EOS + { + if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit + { + *foo = 0; + foo++; + break; + } + else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument + { + const char *hard = &mHardString[*foo*2]; + *foo = 0; + if ( argc < MAXARGS ) + { + argv[argc++] = hard; + } + foo++; + break; + } + foo++; + } // end of while loop... + } + } + } + + if ( argc ) + { + ret = callback->ParseLine(lineno, argc, argv ); + } + + return ret; +} + +int InPlaceParser::Parse(InPlaceParserInterface *callback) // returns true if entire file was parsed, false if it aborted for some reason +{ + assert( callback ); + if ( !mData ) return 0; + + int ret = 0; + + int lineno = 0; + + char *foo = mData; + char *begin = foo; + + + while ( *foo ) + { + if ( *foo == 10 || *foo == 13 ) + { + lineno++; + *foo = 0; + + if ( *begin ) // if there is any data to parse at all... + { + int v = ProcessLine(lineno,begin,callback); + if ( v ) ret = v; + } + + foo++; + if ( *foo == 10 ) foo++; // skip line feed, if it is in the carraige-return line-feed format... + begin = foo; + } + else + { + foo++; + } + } + + lineno++; // lasst line. + + int v = ProcessLine(lineno,begin,callback); + if ( v ) ret = v; + return ret; +} + + +void InPlaceParser::DefaultSymbols(void) +{ + SetHardSeparator(','); + SetHardSeparator('('); + SetHardSeparator(')'); + SetHardSeparator('='); + SetHardSeparator('['); + SetHardSeparator(']'); + SetHardSeparator('{'); + SetHardSeparator('}'); + SetCommentSymbol('#'); +} + + +const char ** InPlaceParser::GetArglist(char *line,int &count) // convert source string into an arg list, this is a destructive parse. +{ + const char **ret = 0; + + static const char *argv[MAXARGS]; + int argc = 0; + + char *foo = line; + + while ( !EOS(*foo) && argc < MAXARGS ) + { + + foo = SkipSpaces(foo); // skip any leading spaces + + if ( EOS(*foo) ) break; + + if ( *foo == mQuoteChar ) // if it is an open quote + { + foo++; + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + while ( !EOS(*foo) && *foo != mQuoteChar ) foo++; + if ( !EOS(*foo) ) + { + *foo = 0; // replace close quote with zero byte EOS + foo++; + } + } + else + { + + foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces + + if ( IsNonSeparator(*foo) ) // add non-hard argument. + { + bool quote = false; + if ( *foo == mQuoteChar ) + { + foo++; + quote = true; + } + + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + + if ( quote ) + { + while (*foo && *foo != mQuoteChar ) foo++; + if ( *foo ) *foo = 32; + } + + // continue..until we hit an eos .. + while ( !EOS(*foo) ) // until we hit EOS + { + if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit + { + *foo = 0; + foo++; + break; + } + else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument + { + const char *hard = &mHardString[*foo*2]; + *foo = 0; + if ( argc < MAXARGS ) + { + argv[argc++] = hard; + } + foo++; + break; + } + foo++; + } // end of while loop... + } + } + } + + count = argc; + if ( argc ) + { + ret = argv; + } + + return ret; +} + +/*******************************************************************/ +/******************** Geometry.h ********************************/ +/*******************************************************************/ + +class GeometryVertex +{ +public: + float mPos[3]; + float mNormal[3]; + float mTexel[2]; +}; + + +class GeometryInterface +{ +public: + + virtual void NodeTriangle(const GeometryVertex *v1,const GeometryVertex *v2,const GeometryVertex *v3) {} + + virtual ~GeometryInterface () {} +}; + + +/*******************************************************************/ +/******************** Obj.h ********************************/ +/*******************************************************************/ + + +class OBJ : public InPlaceParserInterface +{ +public: + int LoadMesh(const char *fname,GeometryInterface *callback); + int ParseLine(int lineno,int argc,const char **argv); // return TRUE to continue parsing, return FALSE to abort parsing process +private: + + void getVertex(GeometryVertex &v,const char *face) const; + + FloatVector mVerts; + FloatVector mTexels; + FloatVector mNormals; + + GeometryInterface *mCallback; +}; + + +/*******************************************************************/ +/******************** Obj.cpp ********************************/ +/*******************************************************************/ + +int OBJ::LoadMesh(const char *fname,GeometryInterface *iface) +{ + int ret = 0; + + mVerts.clear(); + mTexels.clear(); + mNormals.clear(); + + mCallback = iface; + + InPlaceParser ipp(fname); + + ipp.Parse(this); + + + return ret; +} + +//static const char * GetArg(const char **argv,int i,int argc) +//{ + // const char * ret = 0; + // if ( i < argc ) ret = argv[i]; + // return ret; +//} + +void OBJ::getVertex(GeometryVertex &v,const char *face) const +{ + v.mPos[0] = 0; + v.mPos[1] = 0; + v.mPos[2] = 0; + + v.mTexel[0] = 0; + v.mTexel[1] = 0; + + v.mNormal[0] = 0; + v.mNormal[1] = 1; + v.mNormal[2] = 0; + + int index = atoi( face )-1; + + const char *texel = strstr(face,"/"); + + if ( texel ) + { + int tindex = atoi( texel+1) - 1; + + if ( tindex >=0 && tindex < (int)(mTexels.size()/2) ) + { + const float *t = &mTexels[tindex*2]; + + v.mTexel[0] = t[0]; + v.mTexel[1] = t[1]; + + } + + const char *normal = strstr(texel+1,"/"); + if ( normal ) + { + int nindex = atoi( normal+1 ) - 1; + + if (nindex >= 0 && nindex < (int)(mNormals.size()/3) ) + { + const float *n = &mNormals[nindex*3]; + + v.mNormal[0] = n[0]; + v.mNormal[1] = n[1]; + v.mNormal[2] = n[2]; + } + } + } + + if ( index >= 0 && index < (int)(mVerts.size()/3) ) + { + + const float *p = &mVerts[index*3]; + + v.mPos[0] = p[0]; + v.mPos[1] = p[1]; + v.mPos[2] = p[2]; + } + +} + +int OBJ::ParseLine(int lineno,int argc,const char **argv) // return TRUE to continue parsing, return FALSE to abort parsing process +{ + int ret = 0; + + if ( argc >= 1 ) + { + const char *foo = argv[0]; + if ( *foo != '#' ) + { + if ( strcmp(argv[0],"v") == 0 && argc == 4 ) + + //if ( stricmp(argv[0],"v") == 0 && argc == 4 ) + { + float vx = (float) atof( argv[1] ); + float vy = (float) atof( argv[2] ); + float vz = (float) atof( argv[3] ); + mVerts.push_back(vx); + mVerts.push_back(vy); + mVerts.push_back(vz); + } + else if ( strcmp(argv[0],"vt") == 0 && argc == 3 ) + + // else if ( stricmp(argv[0],"vt") == 0 && argc == 3 ) + { + float tx = (float) atof( argv[1] ); + float ty = (float) atof( argv[2] ); + mTexels.push_back(tx); + mTexels.push_back(ty); + } + // else if ( stricmp(argv[0],"vn") == 0 && argc == 4 ) + + else if ( strcmp(argv[0],"vn") == 0 && argc == 4 ) + { + float normalx = (float) atof(argv[1]); + float normaly = (float) atof(argv[2]); + float normalz = (float) atof(argv[3]); + mNormals.push_back(normalx); + mNormals.push_back(normaly); + mNormals.push_back(normalz); + } +// else if ( stricmp(argv[0],"f") == 0 && argc >= 4 ) + + else if ( strcmp(argv[0],"f") == 0 && argc >= 4 ) + { + GeometryVertex v[32]; + + int vcount = argc-1; + + for (int i=1; i p1( v[0].mPos ); + Vector3d p2( v[1].mPos ); + Vector3d p3( v[2].mPos ); + + Vector3d n; + n.ComputeNormal(p3,p2,p1); + + for (int i=0; iNodeTriangle(&v[0],&v[1],&v[2]); + + if ( vcount >=3 ) // do the fan + { + for (int i=2; i<(vcount-1); i++) + { + mCallback->NodeTriangle(&v[0],&v[i],&v[i+1]); + } + } + + } + } + } + + return ret; +} + + + + +class BuildMesh : public GeometryInterface +{ +public: + + int getIndex(const float *p) + { + + int vcount = mVertices.size()/3; + + if(vcount>0) + { + //New MS STL library checks indices in debug build, so zero causes an assert if it is empty. + const float *v = &mVertices[0]; + + for (int i=0; imPos) ); + mIndices.push_back( getIndex(v2->mPos) ); + mIndices.push_back( getIndex(v3->mPos) ); + } + + const FloatVector& GetVertices(void) const { return mVertices; }; + const IntVector& GetIndices(void) const { return mIndices; }; + +private: + FloatVector mVertices; + IntVector mIndices; +}; + + +WavefrontObj::WavefrontObj(void) +{ + mVertexCount = 0; + mTriCount = 0; + mIndices = 0; + mVertices = 0; +} + +WavefrontObj::~WavefrontObj(void) +{ + delete [] mIndices; + delete [] mVertices; +} + +unsigned int WavefrontObj::loadObj(const char *fname) // load a wavefront obj returns number of triangles that were loaded. Data is persists until the class is destructed. +{ + + unsigned int ret = 0; + + delete [] mVertices; + mVertices = 0; + delete [] mIndices; + mIndices = 0; + mVertexCount = 0; + mTriCount = 0; + + + BuildMesh bm; + + OBJ obj; + + obj.LoadMesh(fname,&bm); + + + const FloatVector &vlist = bm.GetVertices(); + const IntVector &indices = bm.GetIndices(); + if ( vlist.size() ) + { + mVertexCount = vlist.size()/3; + mVertices = new float[mVertexCount*3]; + memcpy( mVertices, &vlist[0], sizeof(float)*mVertexCount*3 ); + mTriCount = indices.size()/3; + mIndices = new int[mTriCount*3*sizeof(int)]; + memcpy(mIndices, &indices[0], sizeof(int)*mTriCount*3); + ret = mTriCount; + } + + + return ret; +} + +} diff --git a/Extras/ConvexDecomposition/cd_wavefront.h b/Extras/ConvexDecomposition/cd_wavefront.h index 4c2980bb2..ba5f90bd5 100644 --- a/Extras/ConvexDecomposition/cd_wavefront.h +++ b/Extras/ConvexDecomposition/cd_wavefront.h @@ -1,62 +1,62 @@ -#ifndef CD_WAVEFRONT_OBJ_H - - -#define CD_WAVEFRONT_OBJ_H - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -namespace ConvexDecomposition -{ - -class WavefrontObj -{ -public: - - WavefrontObj(void); - ~WavefrontObj(void); - - unsigned int loadObj(const char *fname); // load a wavefront obj returns number of triangles that were loaded. Data is persists until the class is destructed. - - int mVertexCount; - int mTriCount; - int *mIndices; - float *mVertices; -}; - -} - -#endif +#ifndef CD_WAVEFRONT_OBJ_H + + +#define CD_WAVEFRONT_OBJ_H + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +namespace ConvexDecomposition +{ + +class WavefrontObj +{ +public: + + WavefrontObj(void); + ~WavefrontObj(void); + + unsigned int loadObj(const char *fname); // load a wavefront obj returns number of triangles that were loaded. Data is persists until the class is destructed. + + int mVertexCount; + int mTriCount; + int *mIndices; + float *mVertices; +}; + +} + +#endif diff --git a/Extras/ConvexDecomposition/concavity.cpp b/Extras/ConvexDecomposition/concavity.cpp index fc2489cab..f1a466001 100644 --- a/Extras/ConvexDecomposition/concavity.cpp +++ b/Extras/ConvexDecomposition/concavity.cpp @@ -1,795 +1,795 @@ -#include "float_math.h" -#include -#include -#include -#include - -#include - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -#include "concavity.h" -#include "raytri.h" -#include "bestfit.h" -#include "cd_hull.h" -#include "meshvolume.h" -#include "cd_vector.h" -#include "splitplane.h" -#include "ConvexDecomposition.h" - - -#define WSCALE 4 -#define CONCAVE_THRESH 0.05f - -namespace ConvexDecomposition -{ - -unsigned int getDebugColor(void) -{ - static unsigned int colors[8] = - { - 0xFF0000, - 0x00FF00, - 0x0000FF, - 0xFFFF00, - 0x00FFFF, - 0xFF00FF, - 0xFFFFFF, - 0xFF8040 - }; - - static int count = 0; - - count++; - - if ( count == 8 ) count = 0; - - assert( count >= 0 && count < 8 ); - - unsigned int color = colors[count]; - - return color; - -} - -class Wpoint -{ -public: - Wpoint(const Vector3d &p,float w) - { - mPoint = p; - mWeight = w; - } - - Vector3d mPoint; - float mWeight; -}; - -typedef std::vector< Wpoint > WpointVector; - - -static inline float DistToPt(const float *p,const float *plane) -{ - float x = p[0]; - float y = p[1]; - float z = p[2]; - float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; - return d; -} - - -static void intersect(const float *p1,const float *p2,float *split,const float *plane) -{ - - float dp1 = DistToPt(p1,plane); - - float dir[3]; - - dir[0] = p2[0] - p1[0]; - dir[1] = p2[1] - p1[1]; - dir[2] = p2[2] - p1[2]; - - float dot1 = dir[0]*plane[0] + dir[1]*plane[1] + dir[2]*plane[2]; - float dot2 = dp1 - plane[3]; - - float t = -(plane[3] + dot2 ) / dot1; - - split[0] = (dir[0]*t)+p1[0]; - split[1] = (dir[1]*t)+p1[1]; - split[2] = (dir[2]*t)+p1[2]; -} - - -class CTri -{ -public: - CTri(void) { }; - - CTri(const float *p1,const float *p2,const float *p3,unsigned int i1,unsigned int i2,unsigned int i3) - { - mProcessed = 0; - mI1 = i1; - mI2 = i2; - mI3 = i3; - - mP1.Set(p1); - mP2.Set(p2); - mP3.Set(p3); - - mPlaneD = mNormal.ComputePlane(mP1,mP2,mP3); - } - - float Facing(const CTri &t) - { - float d = mNormal.Dot(t.mNormal); - return d; - } - - // clip this line segment against this triangle. - bool clip(const Vector3d &start,Vector3d &end) const - { - Vector3d sect; - - bool hit = lineIntersectsTriangle(start.Ptr(), end.Ptr(), mP1.Ptr(), mP2.Ptr(), mP3.Ptr(), sect.Ptr() ); - - if ( hit ) - { - end = sect; - } - return hit; - } - - bool Concave(const Vector3d &p,float &distance,Vector3d &n) const - { - n.NearestPointInTriangle(p,mP1,mP2,mP3); - distance = p.Distance(n); - return true; - } - - void addTri(unsigned int *indices,unsigned int i1,unsigned int i2,unsigned int i3,unsigned int &tcount) const - { - indices[tcount*3+0] = i1; - indices[tcount*3+1] = i2; - indices[tcount*3+2] = i3; - tcount++; - } - - float getVolume(ConvexDecompInterface *callback) const - { - unsigned int indices[8*3]; - - - unsigned int tcount = 0; - - addTri(indices,0,1,2,tcount); - addTri(indices,3,4,5,tcount); - - addTri(indices,0,3,4,tcount); - addTri(indices,0,4,1,tcount); - - addTri(indices,1,4,5,tcount); - addTri(indices,1,5,2,tcount); - - addTri(indices,0,3,5,tcount); - addTri(indices,0,5,2,tcount); - - const float *vertices = mP1.Ptr(); - - if ( callback ) - { - unsigned int color = getDebugColor(); - -#if 0 - Vector3d d1 = mNear1; - Vector3d d2 = mNear2; - Vector3d d3 = mNear3; - - callback->ConvexDebugPoint(mP1.Ptr(),0.01f,0x00FF00); - callback->ConvexDebugPoint(mP2.Ptr(),0.01f,0x00FF00); - callback->ConvexDebugPoint(mP3.Ptr(),0.01f,0x00FF00); - callback->ConvexDebugPoint(d1.Ptr(),0.01f,0xFF0000); - callback->ConvexDebugPoint(d2.Ptr(),0.01f,0xFF0000); - callback->ConvexDebugPoint(d3.Ptr(),0.01f,0xFF0000); - - callback->ConvexDebugTri(mP1.Ptr(), d1.Ptr(), d1.Ptr(),0x00FF00); - callback->ConvexDebugTri(mP2.Ptr(), d2.Ptr(), d2.Ptr(),0x00FF00); - callback->ConvexDebugTri(mP3.Ptr(), d3.Ptr(), d3.Ptr(),0x00FF00); - -#else - for (unsigned int i=0; iConvexDebugTri(p1,p2,p3,color); - - } -#endif - } - - float v = computeMeshVolume(mP1.Ptr(), tcount, indices ); - - return v; - - } - - float raySect(const Vector3d &p,const Vector3d &dir,Vector3d §) const - { - float plane[4]; - - plane[0] = mNormal.x; - plane[1] = mNormal.y; - plane[2] = mNormal.z; - plane[3] = mPlaneD; - - Vector3d dest = p+dir*100000; - - intersect( p.Ptr(), dest.Ptr(), sect.Ptr(), plane ); - - return sect.Distance(p); // return the intersection distance. - - } - - float planeDistance(const Vector3d &p) const - { - float plane[4]; - - plane[0] = mNormal.x; - plane[1] = mNormal.y; - plane[2] = mNormal.z; - plane[3] = mPlaneD; - - return DistToPt( p.Ptr(), plane ); - - } - - bool samePlane(const CTri &t) const - { - const float THRESH = 0.001f; - float dd = fabsf( t.mPlaneD - mPlaneD ); - if ( dd > THRESH ) return false; - dd = fabsf( t.mNormal.x - mNormal.x ); - if ( dd > THRESH ) return false; - dd = fabsf( t.mNormal.y - mNormal.y ); - if ( dd > THRESH ) return false; - dd = fabsf( t.mNormal.z - mNormal.z ); - if ( dd > THRESH ) return false; - return true; - } - - bool hasIndex(unsigned int i) const - { - if ( i == mI1 || i == mI2 || i == mI3 ) return true; - return false; - } - - bool sharesEdge(const CTri &t) const - { - bool ret = false; - unsigned int count = 0; - - if ( t.hasIndex(mI1) ) count++; - if ( t.hasIndex(mI2) ) count++; - if ( t.hasIndex(mI3) ) count++; - - if ( count >= 2 ) ret = true; - - return ret; - } - - void debug(unsigned int color,ConvexDecompInterface *callback) - { - callback->ConvexDebugTri( mP1.Ptr(), mP2.Ptr(), mP3.Ptr(), color ); - callback->ConvexDebugTri( mP1.Ptr(), mP1.Ptr(), mNear1.Ptr(), 0xFF0000 ); - callback->ConvexDebugTri( mP2.Ptr(), mP2.Ptr(), mNear2.Ptr(), 0xFF0000 ); - callback->ConvexDebugTri( mP2.Ptr(), mP3.Ptr(), mNear3.Ptr(), 0xFF0000 ); - callback->ConvexDebugPoint( mNear1.Ptr(), 0.01f, 0xFF0000 ); - callback->ConvexDebugPoint( mNear2.Ptr(), 0.01f, 0xFF0000 ); - callback->ConvexDebugPoint( mNear3.Ptr(), 0.01f, 0xFF0000 ); - } - - float area(void) - { - float a = mConcavity*mP1.Area(mP2,mP3); - return a; - } - - void addWeighted(WpointVector &list,ConvexDecompInterface *callback) - { - - Wpoint p1(mP1,mC1); - Wpoint p2(mP2,mC2); - Wpoint p3(mP3,mC3); - - Vector3d d1 = mNear1 - mP1; - Vector3d d2 = mNear2 - mP2; - Vector3d d3 = mNear3 - mP3; - - d1*=WSCALE; - d2*=WSCALE; - d3*=WSCALE; - - d1 = d1 + mP1; - d2 = d2 + mP2; - d3 = d3 + mP3; - - Wpoint p4(d1,mC1); - Wpoint p5(d2,mC2); - Wpoint p6(d3,mC3); - - list.push_back(p1); - list.push_back(p2); - list.push_back(p3); - - list.push_back(p4); - list.push_back(p5); - list.push_back(p6); - -#if 0 - callback->ConvexDebugPoint(mP1.Ptr(),0.01f,0x00FF00); - callback->ConvexDebugPoint(mP2.Ptr(),0.01f,0x00FF00); - callback->ConvexDebugPoint(mP3.Ptr(),0.01f,0x00FF00); - callback->ConvexDebugPoint(d1.Ptr(),0.01f,0xFF0000); - callback->ConvexDebugPoint(d2.Ptr(),0.01f,0xFF0000); - callback->ConvexDebugPoint(d3.Ptr(),0.01f,0xFF0000); - - callback->ConvexDebugTri(mP1.Ptr(), d1.Ptr(), d1.Ptr(),0x00FF00); - callback->ConvexDebugTri(mP2.Ptr(), d2.Ptr(), d2.Ptr(),0x00FF00); - callback->ConvexDebugTri(mP3.Ptr(), d3.Ptr(), d3.Ptr(),0x00FF00); - - Vector3d np1 = mP1 + mNormal*0.05f; - Vector3d np2 = mP2 + mNormal*0.05f; - Vector3d np3 = mP3 + mNormal*0.05f; - - callback->ConvexDebugTri(mP1.Ptr(), np1.Ptr(), np1.Ptr(), 0xFF00FF ); - callback->ConvexDebugTri(mP2.Ptr(), np2.Ptr(), np2.Ptr(), 0xFF00FF ); - callback->ConvexDebugTri(mP3.Ptr(), np3.Ptr(), np3.Ptr(), 0xFF00FF ); - - callback->ConvexDebugPoint( np1.Ptr(), 0.01F, 0XFF00FF ); - callback->ConvexDebugPoint( np2.Ptr(), 0.01F, 0XFF00FF ); - callback->ConvexDebugPoint( np3.Ptr(), 0.01F, 0XFF00FF ); - -#endif - - - - } - - Vector3d mP1; - Vector3d mP2; - Vector3d mP3; - Vector3d mNear1; - Vector3d mNear2; - Vector3d mNear3; - Vector3d mNormal; - float mPlaneD; - float mConcavity; - float mC1; - float mC2; - float mC3; - unsigned int mI1; - unsigned int mI2; - unsigned int mI3; - int mProcessed; // already been added... -}; - -typedef std::vector< CTri > CTriVector; - -bool featureMatch(CTri &m,const CTriVector &tris,ConvexDecompInterface *callback,const CTriVector &input_mesh) -{ - - bool ret = false; - - float neardot = 0.707f; - - m.mConcavity = 0; - - //gLog->Display("*********** FEATURE MATCH *************\r\n"); - //gLog->Display("Plane: %0.4f,%0.4f,%0.4f %0.4f\r\n", m.mNormal.x, m.mNormal.y, m.mNormal.z, m.mPlaneD ); - //gLog->Display("*********************************************\r\n"); - - CTriVector::const_iterator i; - - CTri nearest; - - - for (i=tris.begin(); i!=tris.end(); ++i) - { - const CTri &t = (*i); - - - //gLog->Display(" HullPlane: %0.4f,%0.4f,%0.4f %0.4f\r\n", t.mNormal.x, t.mNormal.y, t.mNormal.z, t.mPlaneD ); - - if ( t.samePlane(m) ) - { - //gLog->Display("*** PLANE MATCH!!!\r\n"); - ret = false; - break; - } - - float dot = t.mNormal.Dot(m.mNormal); - - if ( dot > neardot ) - { - - float d1 = t.planeDistance( m.mP1 ); - float d2 = t.planeDistance( m.mP2 ); - float d3 = t.planeDistance( m.mP3 ); - - if ( d1 > 0.001f || d2 > 0.001f || d3 > 0.001f ) // can't be near coplaner! - { - - neardot = dot; - - Vector3d n1,n2,n3; - - t.raySect( m.mP1, m.mNormal, m.mNear1 ); - t.raySect( m.mP2, m.mNormal, m.mNear2 ); - t.raySect( m.mP3, m.mNormal, m.mNear3 ); - - nearest = t; - - ret = true; - } - - } - } - - if ( ret ) - { - if ( 0 ) - { - CTriVector::const_iterator i; - for (i=input_mesh.begin(); i!=input_mesh.end(); ++i) - { - const CTri &c = (*i); - if ( c.mI1 != m.mI1 && c.mI2 != m.mI2 && c.mI3 != m.mI3 ) - { - c.clip( m.mP1, m.mNear1 ); - c.clip( m.mP2, m.mNear2 ); - c.clip( m.mP3, m.mNear3 ); - } - } - } - - //gLog->Display("*********************************************\r\n"); - //gLog->Display(" HullPlaneNearest: %0.4f,%0.4f,%0.4f %0.4f\r\n", nearest.mNormal.x, nearest.mNormal.y, nearest.mNormal.z, nearest.mPlaneD ); - - m.mC1 = m.mP1.Distance( m.mNear1 ); - m.mC2 = m.mP2.Distance( m.mNear2 ); - m.mC3 = m.mP3.Distance( m.mNear3 ); - - m.mConcavity = m.mC1; - - if ( m.mC2 > m.mConcavity ) m.mConcavity = m.mC2; - if ( m.mC3 > m.mConcavity ) m.mConcavity = m.mC3; - - #if 0 - callback->ConvexDebugTri( m.mP1.Ptr(), m.mP2.Ptr(), m.mP3.Ptr(), 0x00FF00 ); - callback->ConvexDebugTri( m.mNear1.Ptr(), m.mNear2.Ptr(), m.mNear3.Ptr(), 0xFF0000 ); - - callback->ConvexDebugTri( m.mP1.Ptr(), m.mP1.Ptr(), m.mNear1.Ptr(), 0xFFFF00 ); - callback->ConvexDebugTri( m.mP2.Ptr(), m.mP2.Ptr(), m.mNear2.Ptr(), 0xFFFF00 ); - callback->ConvexDebugTri( m.mP3.Ptr(), m.mP3.Ptr(), m.mNear3.Ptr(), 0xFFFF00 ); - #endif - - } - else - { - //gLog->Display("No match\r\n"); - } - - //gLog->Display("*********************************************\r\n"); - return ret; -} - -bool isFeatureTri(CTri &t,CTriVector &flist,float fc,ConvexDecompInterface *callback,unsigned int color) -{ - bool ret = false; - - if ( t.mProcessed == 0 ) // if not already processed - { - - float c = t.mConcavity / fc; // must be within 80% of the concavity of the parent. - - if ( c > 0.85f ) - { - // see if this triangle is a 'feature' triangle. Meaning it shares an - // edge with any existing feature triangle and is within roughly the same - // concavity of the parent. - if ( flist.size() ) - { - CTriVector::iterator i; - for (i=flist.begin(); i!=flist.end(); ++i) - { - CTri &ftri = (*i); - if ( ftri.sharesEdge(t) ) - { - t.mProcessed = 2; // it is now part of a feature. - flist.push_back(t); // add it to the feature list. -// callback->ConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(),t.mP3.Ptr(), color ); - ret = true; - break; - } - } - } - else - { - t.mProcessed = 2; - flist.push_back(t); // add it to the feature list. -// callback->ConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(),t.mP3.Ptr(), color ); - ret = true; - } - } - else - { - t.mProcessed = 1; // eliminated for this feature, but might be valid for the next one.. - } - - } - return ret; -} - -float computeConcavity(unsigned int vcount, - const float *vertices, - unsigned int tcount, - const unsigned int *indices, - ConvexDecompInterface *callback, - float *plane, // plane equation to split on - float &volume) -{ - - - float cret = 0; - volume = 1; - - HullResult result; - HullLibrary hl; - HullDesc desc; - - desc.mMaxFaces = 256; - desc.mMaxVertices = 256; - desc.SetHullFlag(QF_TRIANGLES); - - - desc.mVcount = vcount; - desc.mVertices = vertices; - desc.mVertexStride = sizeof(float)*3; - - HullError ret = hl.CreateConvexHull(desc,result); - - if ( ret == QE_OK ) - { -#if 0 - float bmin[3]; - float bmax[3]; - - float dx = bmax[0] - bmin[0]; - float dy = bmax[1] - bmin[1]; - float dz = bmax[2] - bmin[2]; - - Vector3d center; - - center.x = bmin[0] + dx*0.5f; - center.y = bmin[1] + dy*0.5f; - center.z = bmin[2] + dz*0.5f; -#endif - - volume = computeMeshVolume2( result.mOutputVertices, result.mNumFaces, result.mIndices ); - -#if 1 - // ok..now..for each triangle on the original mesh.. - // we extrude the points to the nearest point on the hull. - const unsigned int *source = result.mIndices; - - CTriVector tris; - - for (unsigned int i=0; iConvexDebugTri(p1,p2,p3,0xFFFFFF); - - CTri t(p1,p2,p3,i1,i2,i3); // - tris.push_back(t); - } - - // we have not pre-computed the plane equation for each triangle in the convex hull.. - - float totalVolume = 0; - - CTriVector ftris; // 'feature' triangles. - - const unsigned int *src = indices; - - - float maxc=0; - - - if ( 1 ) - { - CTriVector input_mesh; - if ( 1 ) - { - const unsigned int *src = indices; - for (unsigned int i=0; i CONCAVE_THRESH ) - { - - if ( t.mConcavity > maxc ) - { - maxc = t.mConcavity; - maxctri = t; - } - - float v = t.getVolume(0); - totalVolume+=v; - ftris.push_back(t); - } - - } - } - - if ( ftris.size() && 0 ) - { - - // ok..now we extract the triangles which form the maximum concavity. - CTriVector major_feature; - float maxarea = 0; - - while ( maxc > CONCAVE_THRESH ) - { - - unsigned int color = getDebugColor(); // - - CTriVector flist; - - bool found; - - float totalarea = 0; - - do - { - found = false; - CTriVector::iterator i; - for (i=ftris.begin(); i!=ftris.end(); ++i) - { - CTri &t = (*i); - if ( isFeatureTri(t,flist,maxc,callback,color) ) - { - found = true; - totalarea+=t.area(); - } - } - } while ( found ); - - - if ( totalarea > maxarea ) - { - major_feature = flist; - maxarea = totalarea; - } - - maxc = 0; - - for (unsigned int i=0; i maxc ) - { - maxc = t.mConcavity; - } - } - } - } - - unsigned int color = getDebugColor(); - - WpointVector list; - for (unsigned int i=0; i +#include +#include +#include + +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "concavity.h" +#include "raytri.h" +#include "bestfit.h" +#include "cd_hull.h" +#include "meshvolume.h" +#include "cd_vector.h" +#include "splitplane.h" +#include "ConvexDecomposition.h" + + +#define WSCALE 4 +#define CONCAVE_THRESH 0.05f + +namespace ConvexDecomposition +{ + +unsigned int getDebugColor(void) +{ + static unsigned int colors[8] = + { + 0xFF0000, + 0x00FF00, + 0x0000FF, + 0xFFFF00, + 0x00FFFF, + 0xFF00FF, + 0xFFFFFF, + 0xFF8040 + }; + + static int count = 0; + + count++; + + if ( count == 8 ) count = 0; + + assert( count >= 0 && count < 8 ); + + unsigned int color = colors[count]; + + return color; + +} + +class Wpoint +{ +public: + Wpoint(const Vector3d &p,float w) + { + mPoint = p; + mWeight = w; + } + + Vector3d mPoint; + float mWeight; +}; + +typedef std::vector< Wpoint > WpointVector; + + +static inline float DistToPt(const float *p,const float *plane) +{ + float x = p[0]; + float y = p[1]; + float z = p[2]; + float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; + return d; +} + + +static void intersect(const float *p1,const float *p2,float *split,const float *plane) +{ + + float dp1 = DistToPt(p1,plane); + + float dir[3]; + + dir[0] = p2[0] - p1[0]; + dir[1] = p2[1] - p1[1]; + dir[2] = p2[2] - p1[2]; + + float dot1 = dir[0]*plane[0] + dir[1]*plane[1] + dir[2]*plane[2]; + float dot2 = dp1 - plane[3]; + + float t = -(plane[3] + dot2 ) / dot1; + + split[0] = (dir[0]*t)+p1[0]; + split[1] = (dir[1]*t)+p1[1]; + split[2] = (dir[2]*t)+p1[2]; +} + + +class CTri +{ +public: + CTri(void) { }; + + CTri(const float *p1,const float *p2,const float *p3,unsigned int i1,unsigned int i2,unsigned int i3) + { + mProcessed = 0; + mI1 = i1; + mI2 = i2; + mI3 = i3; + + mP1.Set(p1); + mP2.Set(p2); + mP3.Set(p3); + + mPlaneD = mNormal.ComputePlane(mP1,mP2,mP3); + } + + float Facing(const CTri &t) + { + float d = mNormal.Dot(t.mNormal); + return d; + } + + // clip this line segment against this triangle. + bool clip(const Vector3d &start,Vector3d &end) const + { + Vector3d sect; + + bool hit = lineIntersectsTriangle(start.Ptr(), end.Ptr(), mP1.Ptr(), mP2.Ptr(), mP3.Ptr(), sect.Ptr() ); + + if ( hit ) + { + end = sect; + } + return hit; + } + + bool Concave(const Vector3d &p,float &distance,Vector3d &n) const + { + n.NearestPointInTriangle(p,mP1,mP2,mP3); + distance = p.Distance(n); + return true; + } + + void addTri(unsigned int *indices,unsigned int i1,unsigned int i2,unsigned int i3,unsigned int &tcount) const + { + indices[tcount*3+0] = i1; + indices[tcount*3+1] = i2; + indices[tcount*3+2] = i3; + tcount++; + } + + float getVolume(ConvexDecompInterface *callback) const + { + unsigned int indices[8*3]; + + + unsigned int tcount = 0; + + addTri(indices,0,1,2,tcount); + addTri(indices,3,4,5,tcount); + + addTri(indices,0,3,4,tcount); + addTri(indices,0,4,1,tcount); + + addTri(indices,1,4,5,tcount); + addTri(indices,1,5,2,tcount); + + addTri(indices,0,3,5,tcount); + addTri(indices,0,5,2,tcount); + + const float *vertices = mP1.Ptr(); + + if ( callback ) + { + unsigned int color = getDebugColor(); + +#if 0 + Vector3d d1 = mNear1; + Vector3d d2 = mNear2; + Vector3d d3 = mNear3; + + callback->ConvexDebugPoint(mP1.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP2.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP3.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(d1.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d2.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d3.Ptr(),0.01f,0xFF0000); + + callback->ConvexDebugTri(mP1.Ptr(), d1.Ptr(), d1.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP2.Ptr(), d2.Ptr(), d2.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP3.Ptr(), d3.Ptr(), d3.Ptr(),0x00FF00); + +#else + for (unsigned int i=0; iConvexDebugTri(p1,p2,p3,color); + + } +#endif + } + + float v = computeMeshVolume(mP1.Ptr(), tcount, indices ); + + return v; + + } + + float raySect(const Vector3d &p,const Vector3d &dir,Vector3d §) const + { + float plane[4]; + + plane[0] = mNormal.x; + plane[1] = mNormal.y; + plane[2] = mNormal.z; + plane[3] = mPlaneD; + + Vector3d dest = p+dir*100000; + + intersect( p.Ptr(), dest.Ptr(), sect.Ptr(), plane ); + + return sect.Distance(p); // return the intersection distance. + + } + + float planeDistance(const Vector3d &p) const + { + float plane[4]; + + plane[0] = mNormal.x; + plane[1] = mNormal.y; + plane[2] = mNormal.z; + plane[3] = mPlaneD; + + return DistToPt( p.Ptr(), plane ); + + } + + bool samePlane(const CTri &t) const + { + const float THRESH = 0.001f; + float dd = fabsf( t.mPlaneD - mPlaneD ); + if ( dd > THRESH ) return false; + dd = fabsf( t.mNormal.x - mNormal.x ); + if ( dd > THRESH ) return false; + dd = fabsf( t.mNormal.y - mNormal.y ); + if ( dd > THRESH ) return false; + dd = fabsf( t.mNormal.z - mNormal.z ); + if ( dd > THRESH ) return false; + return true; + } + + bool hasIndex(unsigned int i) const + { + if ( i == mI1 || i == mI2 || i == mI3 ) return true; + return false; + } + + bool sharesEdge(const CTri &t) const + { + bool ret = false; + unsigned int count = 0; + + if ( t.hasIndex(mI1) ) count++; + if ( t.hasIndex(mI2) ) count++; + if ( t.hasIndex(mI3) ) count++; + + if ( count >= 2 ) ret = true; + + return ret; + } + + void debug(unsigned int color,ConvexDecompInterface *callback) + { + callback->ConvexDebugTri( mP1.Ptr(), mP2.Ptr(), mP3.Ptr(), color ); + callback->ConvexDebugTri( mP1.Ptr(), mP1.Ptr(), mNear1.Ptr(), 0xFF0000 ); + callback->ConvexDebugTri( mP2.Ptr(), mP2.Ptr(), mNear2.Ptr(), 0xFF0000 ); + callback->ConvexDebugTri( mP2.Ptr(), mP3.Ptr(), mNear3.Ptr(), 0xFF0000 ); + callback->ConvexDebugPoint( mNear1.Ptr(), 0.01f, 0xFF0000 ); + callback->ConvexDebugPoint( mNear2.Ptr(), 0.01f, 0xFF0000 ); + callback->ConvexDebugPoint( mNear3.Ptr(), 0.01f, 0xFF0000 ); + } + + float area(void) + { + float a = mConcavity*mP1.Area(mP2,mP3); + return a; + } + + void addWeighted(WpointVector &list,ConvexDecompInterface *callback) + { + + Wpoint p1(mP1,mC1); + Wpoint p2(mP2,mC2); + Wpoint p3(mP3,mC3); + + Vector3d d1 = mNear1 - mP1; + Vector3d d2 = mNear2 - mP2; + Vector3d d3 = mNear3 - mP3; + + d1*=WSCALE; + d2*=WSCALE; + d3*=WSCALE; + + d1 = d1 + mP1; + d2 = d2 + mP2; + d3 = d3 + mP3; + + Wpoint p4(d1,mC1); + Wpoint p5(d2,mC2); + Wpoint p6(d3,mC3); + + list.push_back(p1); + list.push_back(p2); + list.push_back(p3); + + list.push_back(p4); + list.push_back(p5); + list.push_back(p6); + +#if 0 + callback->ConvexDebugPoint(mP1.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP2.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP3.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(d1.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d2.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d3.Ptr(),0.01f,0xFF0000); + + callback->ConvexDebugTri(mP1.Ptr(), d1.Ptr(), d1.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP2.Ptr(), d2.Ptr(), d2.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP3.Ptr(), d3.Ptr(), d3.Ptr(),0x00FF00); + + Vector3d np1 = mP1 + mNormal*0.05f; + Vector3d np2 = mP2 + mNormal*0.05f; + Vector3d np3 = mP3 + mNormal*0.05f; + + callback->ConvexDebugTri(mP1.Ptr(), np1.Ptr(), np1.Ptr(), 0xFF00FF ); + callback->ConvexDebugTri(mP2.Ptr(), np2.Ptr(), np2.Ptr(), 0xFF00FF ); + callback->ConvexDebugTri(mP3.Ptr(), np3.Ptr(), np3.Ptr(), 0xFF00FF ); + + callback->ConvexDebugPoint( np1.Ptr(), 0.01F, 0XFF00FF ); + callback->ConvexDebugPoint( np2.Ptr(), 0.01F, 0XFF00FF ); + callback->ConvexDebugPoint( np3.Ptr(), 0.01F, 0XFF00FF ); + +#endif + + + + } + + Vector3d mP1; + Vector3d mP2; + Vector3d mP3; + Vector3d mNear1; + Vector3d mNear2; + Vector3d mNear3; + Vector3d mNormal; + float mPlaneD; + float mConcavity; + float mC1; + float mC2; + float mC3; + unsigned int mI1; + unsigned int mI2; + unsigned int mI3; + int mProcessed; // already been added... +}; + +typedef std::vector< CTri > CTriVector; + +bool featureMatch(CTri &m,const CTriVector &tris,ConvexDecompInterface *callback,const CTriVector &input_mesh) +{ + + bool ret = false; + + float neardot = 0.707f; + + m.mConcavity = 0; + + //gLog->Display("*********** FEATURE MATCH *************\r\n"); + //gLog->Display("Plane: %0.4f,%0.4f,%0.4f %0.4f\r\n", m.mNormal.x, m.mNormal.y, m.mNormal.z, m.mPlaneD ); + //gLog->Display("*********************************************\r\n"); + + CTriVector::const_iterator i; + + CTri nearest; + + + for (i=tris.begin(); i!=tris.end(); ++i) + { + const CTri &t = (*i); + + + //gLog->Display(" HullPlane: %0.4f,%0.4f,%0.4f %0.4f\r\n", t.mNormal.x, t.mNormal.y, t.mNormal.z, t.mPlaneD ); + + if ( t.samePlane(m) ) + { + //gLog->Display("*** PLANE MATCH!!!\r\n"); + ret = false; + break; + } + + float dot = t.mNormal.Dot(m.mNormal); + + if ( dot > neardot ) + { + + float d1 = t.planeDistance( m.mP1 ); + float d2 = t.planeDistance( m.mP2 ); + float d3 = t.planeDistance( m.mP3 ); + + if ( d1 > 0.001f || d2 > 0.001f || d3 > 0.001f ) // can't be near coplaner! + { + + neardot = dot; + + Vector3d n1,n2,n3; + + t.raySect( m.mP1, m.mNormal, m.mNear1 ); + t.raySect( m.mP2, m.mNormal, m.mNear2 ); + t.raySect( m.mP3, m.mNormal, m.mNear3 ); + + nearest = t; + + ret = true; + } + + } + } + + if ( ret ) + { + if ( 0 ) + { + CTriVector::const_iterator i; + for (i=input_mesh.begin(); i!=input_mesh.end(); ++i) + { + const CTri &c = (*i); + if ( c.mI1 != m.mI1 && c.mI2 != m.mI2 && c.mI3 != m.mI3 ) + { + c.clip( m.mP1, m.mNear1 ); + c.clip( m.mP2, m.mNear2 ); + c.clip( m.mP3, m.mNear3 ); + } + } + } + + //gLog->Display("*********************************************\r\n"); + //gLog->Display(" HullPlaneNearest: %0.4f,%0.4f,%0.4f %0.4f\r\n", nearest.mNormal.x, nearest.mNormal.y, nearest.mNormal.z, nearest.mPlaneD ); + + m.mC1 = m.mP1.Distance( m.mNear1 ); + m.mC2 = m.mP2.Distance( m.mNear2 ); + m.mC3 = m.mP3.Distance( m.mNear3 ); + + m.mConcavity = m.mC1; + + if ( m.mC2 > m.mConcavity ) m.mConcavity = m.mC2; + if ( m.mC3 > m.mConcavity ) m.mConcavity = m.mC3; + + #if 0 + callback->ConvexDebugTri( m.mP1.Ptr(), m.mP2.Ptr(), m.mP3.Ptr(), 0x00FF00 ); + callback->ConvexDebugTri( m.mNear1.Ptr(), m.mNear2.Ptr(), m.mNear3.Ptr(), 0xFF0000 ); + + callback->ConvexDebugTri( m.mP1.Ptr(), m.mP1.Ptr(), m.mNear1.Ptr(), 0xFFFF00 ); + callback->ConvexDebugTri( m.mP2.Ptr(), m.mP2.Ptr(), m.mNear2.Ptr(), 0xFFFF00 ); + callback->ConvexDebugTri( m.mP3.Ptr(), m.mP3.Ptr(), m.mNear3.Ptr(), 0xFFFF00 ); + #endif + + } + else + { + //gLog->Display("No match\r\n"); + } + + //gLog->Display("*********************************************\r\n"); + return ret; +} + +bool isFeatureTri(CTri &t,CTriVector &flist,float fc,ConvexDecompInterface *callback,unsigned int color) +{ + bool ret = false; + + if ( t.mProcessed == 0 ) // if not already processed + { + + float c = t.mConcavity / fc; // must be within 80% of the concavity of the parent. + + if ( c > 0.85f ) + { + // see if this triangle is a 'feature' triangle. Meaning it shares an + // edge with any existing feature triangle and is within roughly the same + // concavity of the parent. + if ( flist.size() ) + { + CTriVector::iterator i; + for (i=flist.begin(); i!=flist.end(); ++i) + { + CTri &ftri = (*i); + if ( ftri.sharesEdge(t) ) + { + t.mProcessed = 2; // it is now part of a feature. + flist.push_back(t); // add it to the feature list. +// callback->ConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(),t.mP3.Ptr(), color ); + ret = true; + break; + } + } + } + else + { + t.mProcessed = 2; + flist.push_back(t); // add it to the feature list. +// callback->ConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(),t.mP3.Ptr(), color ); + ret = true; + } + } + else + { + t.mProcessed = 1; // eliminated for this feature, but might be valid for the next one.. + } + + } + return ret; +} + +float computeConcavity(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float *plane, // plane equation to split on + float &volume) +{ + + + float cret = 0; + volume = 1; + + HullResult result; + HullLibrary hl; + HullDesc desc; + + desc.mMaxFaces = 256; + desc.mMaxVertices = 256; + desc.SetHullFlag(QF_TRIANGLES); + + + desc.mVcount = vcount; + desc.mVertices = vertices; + desc.mVertexStride = sizeof(float)*3; + + HullError ret = hl.CreateConvexHull(desc,result); + + if ( ret == QE_OK ) + { +#if 0 + float bmin[3]; + float bmax[3]; + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + Vector3d center; + + center.x = bmin[0] + dx*0.5f; + center.y = bmin[1] + dy*0.5f; + center.z = bmin[2] + dz*0.5f; +#endif + + volume = computeMeshVolume2( result.mOutputVertices, result.mNumFaces, result.mIndices ); + +#if 1 + // ok..now..for each triangle on the original mesh.. + // we extrude the points to the nearest point on the hull. + const unsigned int *source = result.mIndices; + + CTriVector tris; + + for (unsigned int i=0; iConvexDebugTri(p1,p2,p3,0xFFFFFF); + + CTri t(p1,p2,p3,i1,i2,i3); // + tris.push_back(t); + } + + // we have not pre-computed the plane equation for each triangle in the convex hull.. + + float totalVolume = 0; + + CTriVector ftris; // 'feature' triangles. + + const unsigned int *src = indices; + + + float maxc=0; + + + if ( 1 ) + { + CTriVector input_mesh; + if ( 1 ) + { + const unsigned int *src = indices; + for (unsigned int i=0; i CONCAVE_THRESH ) + { + + if ( t.mConcavity > maxc ) + { + maxc = t.mConcavity; + maxctri = t; + } + + float v = t.getVolume(0); + totalVolume+=v; + ftris.push_back(t); + } + + } + } + + if ( ftris.size() && 0 ) + { + + // ok..now we extract the triangles which form the maximum concavity. + CTriVector major_feature; + float maxarea = 0; + + while ( maxc > CONCAVE_THRESH ) + { + + unsigned int color = getDebugColor(); // + + CTriVector flist; + + bool found; + + float totalarea = 0; + + do + { + found = false; + CTriVector::iterator i; + for (i=ftris.begin(); i!=ftris.end(); ++i) + { + CTri &t = (*i); + if ( isFeatureTri(t,flist,maxc,callback,color) ) + { + found = true; + totalarea+=t.area(); + } + } + } while ( found ); + + + if ( totalarea > maxarea ) + { + major_feature = flist; + maxarea = totalarea; + } + + maxc = 0; + + for (unsigned int i=0; i maxc ) + { + maxc = t.mConcavity; + } + } + } + } + + unsigned int color = getDebugColor(); + + WpointVector list; + for (unsigned int i=0; i -#include -#include -#include -#include - -#include "fitsphere.h" - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// -/* -An Efficient Bounding Sphere -by Jack Ritter -from "Graphics Gems", Academic Press, 1990 -*/ - -/* Routine to calculate tight bounding sphere over */ -/* a set of points in 3D */ -/* This contains the routine find_bounding_sphere(), */ -/* the struct definition, and the globals used for parameters. */ -/* The abs() of all coordinates must be < BIGNUMBER */ -/* Code written by Jack Ritter and Lyle Rains. */ - -#define BIGNUMBER 100000000.0 /* hundred million */ - -static inline void Set(float *n,float x,float y,float z) -{ - n[0] = x; - n[1] = y; - n[2] = z; -} - -static inline void Copy(float *dest,const float *source) -{ - dest[0] = source[0]; - dest[1] = source[1]; - dest[2] = source[2]; -} - -float computeBoundingSphere(unsigned int vcount,const float *points,float *center) -{ - - float mRadius; - float mRadius2; - - float xmin[3]; - float xmax[3]; - float ymin[3]; - float ymax[3]; - float zmin[3]; - float zmax[3]; - float dia1[3]; - float dia2[3]; - - /* FIRST PASS: find 6 minima/maxima points */ - Set(xmin,BIGNUMBER,BIGNUMBER,BIGNUMBER); - Set(xmax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); - Set(ymin,BIGNUMBER,BIGNUMBER,BIGNUMBER); - Set(ymax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); - Set(zmin,BIGNUMBER,BIGNUMBER,BIGNUMBER); - Set(zmax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); - - for (unsigned i=0; ixmax[0]) - Copy(xmax,caller_p); - if (caller_p[1]ymax[1]) - Copy(ymax,caller_p); - if (caller_p[2]zmax[2]) - Copy(zmax,caller_p); - } - - /* Set xspan = distance between the 2 points xmin & xmax (squared) */ - float dx = xmax[0] - xmin[0]; - float dy = xmax[1] - xmin[1]; - float dz = xmax[2] - xmin[2]; - float xspan = dx*dx + dy*dy + dz*dz; - - /* Same for y & z spans */ - dx = ymax[0] - ymin[0]; - dy = ymax[1] - ymin[1]; - dz = ymax[2] - ymin[2]; - float yspan = dx*dx + dy*dy + dz*dz; - - dx = zmax[0] - zmin[0]; - dy = zmax[1] - zmin[1]; - dz = zmax[2] - zmin[2]; - float zspan = dx*dx + dy*dy + dz*dz; - - /* Set points dia1 & dia2 to the maximally separated pair */ - Copy(dia1,xmin); - Copy(dia2,xmax); /* assume xspan biggest */ - float maxspan = xspan; - - if (yspan>maxspan) - { - maxspan = yspan; - Copy(dia1,ymin); - Copy(dia2,ymax); - } - - if (zspan>maxspan) - { - Copy(dia1,zmin); - Copy(dia2,zmax); - } - - - /* dia1,dia2 is a diameter of initial sphere */ - /* calc initial center */ - center[0] = (dia1[0]+dia2[0])*0.5f; - center[1] = (dia1[1]+dia2[1])*0.5f; - center[2] = (dia1[2]+dia2[2])*0.5f; - - /* calculate initial radius**2 and radius */ - - dx = dia2[0]-center[0]; /* x component of radius vector */ - dy = dia2[1]-center[1]; /* y component of radius vector */ - dz = dia2[2]-center[2]; /* z component of radius vector */ - - mRadius2 = dx*dx + dy*dy + dz*dz; - mRadius = float(sqrt(mRadius2)); - - /* SECOND PASS: increment current sphere */ - - if ( 1 ) - { - for (unsigned i=0; i mRadius2) /* do r**2 test first */ - { /* this point is outside of current sphere */ - float old_to_p = float(sqrt(old_to_p_sq)); - /* calc radius of new sphere */ - mRadius = (mRadius + old_to_p) * 0.5f; - mRadius2 = mRadius*mRadius; /* for next r**2 compare */ - float old_to_new = old_to_p - mRadius; - - /* calc center of new sphere */ - - float recip = 1.0f /old_to_p; - - float cx = (mRadius*center[0] + old_to_new*caller_p[0]) * recip; - float cy = (mRadius*center[1] + old_to_new*caller_p[1]) * recip; - float cz = (mRadius*center[2] + old_to_new*caller_p[2]) * recip; - - Set(center,cx,cy,cz); - } - } - } - - return mRadius; -} - - +#include +#include +#include +#include +#include + +#include "fitsphere.h" + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// +/* +An Efficient Bounding Sphere +by Jack Ritter +from "Graphics Gems", Academic Press, 1990 +*/ + +/* Routine to calculate tight bounding sphere over */ +/* a set of points in 3D */ +/* This contains the routine find_bounding_sphere(), */ +/* the struct definition, and the globals used for parameters. */ +/* The abs() of all coordinates must be < BIGNUMBER */ +/* Code written by Jack Ritter and Lyle Rains. */ + +#define BIGNUMBER 100000000.0 /* hundred million */ + +static inline void Set(float *n,float x,float y,float z) +{ + n[0] = x; + n[1] = y; + n[2] = z; +} + +static inline void Copy(float *dest,const float *source) +{ + dest[0] = source[0]; + dest[1] = source[1]; + dest[2] = source[2]; +} + +float computeBoundingSphere(unsigned int vcount,const float *points,float *center) +{ + + float mRadius; + float mRadius2; + + float xmin[3]; + float xmax[3]; + float ymin[3]; + float ymax[3]; + float zmin[3]; + float zmax[3]; + float dia1[3]; + float dia2[3]; + + /* FIRST PASS: find 6 minima/maxima points */ + Set(xmin,BIGNUMBER,BIGNUMBER,BIGNUMBER); + Set(xmax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); + Set(ymin,BIGNUMBER,BIGNUMBER,BIGNUMBER); + Set(ymax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); + Set(zmin,BIGNUMBER,BIGNUMBER,BIGNUMBER); + Set(zmax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); + + for (unsigned i=0; ixmax[0]) + Copy(xmax,caller_p); + if (caller_p[1]ymax[1]) + Copy(ymax,caller_p); + if (caller_p[2]zmax[2]) + Copy(zmax,caller_p); + } + + /* Set xspan = distance between the 2 points xmin & xmax (squared) */ + float dx = xmax[0] - xmin[0]; + float dy = xmax[1] - xmin[1]; + float dz = xmax[2] - xmin[2]; + float xspan = dx*dx + dy*dy + dz*dz; + + /* Same for y & z spans */ + dx = ymax[0] - ymin[0]; + dy = ymax[1] - ymin[1]; + dz = ymax[2] - ymin[2]; + float yspan = dx*dx + dy*dy + dz*dz; + + dx = zmax[0] - zmin[0]; + dy = zmax[1] - zmin[1]; + dz = zmax[2] - zmin[2]; + float zspan = dx*dx + dy*dy + dz*dz; + + /* Set points dia1 & dia2 to the maximally separated pair */ + Copy(dia1,xmin); + Copy(dia2,xmax); /* assume xspan biggest */ + float maxspan = xspan; + + if (yspan>maxspan) + { + maxspan = yspan; + Copy(dia1,ymin); + Copy(dia2,ymax); + } + + if (zspan>maxspan) + { + Copy(dia1,zmin); + Copy(dia2,zmax); + } + + + /* dia1,dia2 is a diameter of initial sphere */ + /* calc initial center */ + center[0] = (dia1[0]+dia2[0])*0.5f; + center[1] = (dia1[1]+dia2[1])*0.5f; + center[2] = (dia1[2]+dia2[2])*0.5f; + + /* calculate initial radius**2 and radius */ + + dx = dia2[0]-center[0]; /* x component of radius vector */ + dy = dia2[1]-center[1]; /* y component of radius vector */ + dz = dia2[2]-center[2]; /* z component of radius vector */ + + mRadius2 = dx*dx + dy*dy + dz*dz; + mRadius = float(sqrt(mRadius2)); + + /* SECOND PASS: increment current sphere */ + + if ( 1 ) + { + for (unsigned i=0; i mRadius2) /* do r**2 test first */ + { /* this point is outside of current sphere */ + float old_to_p = float(sqrt(old_to_p_sq)); + /* calc radius of new sphere */ + mRadius = (mRadius + old_to_p) * 0.5f; + mRadius2 = mRadius*mRadius; /* for next r**2 compare */ + float old_to_new = old_to_p - mRadius; + + /* calc center of new sphere */ + + float recip = 1.0f /old_to_p; + + float cx = (mRadius*center[0] + old_to_new*caller_p[0]) * recip; + float cy = (mRadius*center[1] + old_to_new*caller_p[1]) * recip; + float cz = (mRadius*center[2] + old_to_new*caller_p[2]) * recip; + + Set(center,cx,cy,cz); + } + } + } + + return mRadius; +} + + diff --git a/Extras/ConvexDecomposition/fitsphere.h b/Extras/ConvexDecomposition/fitsphere.h index 6d42c224a..cd4a565c5 100644 --- a/Extras/ConvexDecomposition/fitsphere.h +++ b/Extras/ConvexDecomposition/fitsphere.h @@ -1,43 +1,43 @@ -#ifndef FIT_SPHERE_H - -#define FIT_SPHERE_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - - -float computeBoundingSphere(unsigned int vcount,const float *points,float *center); - -#endif +#ifndef FIT_SPHERE_H + +#define FIT_SPHERE_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +float computeBoundingSphere(unsigned int vcount,const float *points,float *center); + +#endif diff --git a/Extras/ConvexDecomposition/float_math.cpp b/Extras/ConvexDecomposition/float_math.cpp index a0a3e0023..38c699b59 100644 --- a/Extras/ConvexDecomposition/float_math.cpp +++ b/Extras/ConvexDecomposition/float_math.cpp @@ -1,257 +1,257 @@ -#include "float_math.h" - -#include -#include -#include -#include -#include - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -void fm_inverseRT(const float *matrix,const float *pos,float *t) // inverse rotate translate the point. -{ - - float _x = pos[0] - matrix[3*4+0]; - float _y = pos[1] - matrix[3*4+1]; - float _z = pos[2] - matrix[3*4+2]; - - // Multiply inverse-translated source vector by inverted rotation transform - - t[0] = (matrix[0*4+0] * _x) + (matrix[0*4+1] * _y) + (matrix[0*4+2] * _z); - t[1] = (matrix[1*4+0] * _x) + (matrix[1*4+1] * _y) + (matrix[1*4+2] * _z); - t[2] = (matrix[2*4+0] * _x) + (matrix[2*4+1] * _y) + (matrix[2*4+2] * _z); - -} - - -void fm_identity(float *matrix) // set 4x4 matrix to identity. -{ - matrix[0*4+0] = 1; - matrix[1*4+1] = 1; - matrix[2*4+2] = 1; - matrix[3*4+3] = 1; - - matrix[1*4+0] = 0; - matrix[2*4+0] = 0; - matrix[3*4+0] = 0; - - matrix[0*4+1] = 0; - matrix[2*4+1] = 0; - matrix[3*4+1] = 0; - - matrix[0*4+2] = 0; - matrix[1*4+2] = 0; - matrix[3*4+2] = 0; - - matrix[0*4+3] = 0; - matrix[1*4+3] = 0; - matrix[2*4+3] = 0; - -} - -void fm_eulerMatrix(float ax,float ay,float az,float *matrix) // convert euler (in radians) to a dest 4x4 matrix (translation set to zero) -{ - float quat[4]; - fm_eulerToQuat(ax,ay,az,quat); - fm_quatToMatrix(quat,matrix); -} - -void fm_getAABB(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax) -{ - - const unsigned char *source = (const unsigned char *) points; - - bmin[0] = points[0]; - bmin[1] = points[1]; - bmin[2] = points[2]; - - bmax[0] = points[0]; - bmax[1] = points[1]; - bmax[2] = points[2]; - - - for (unsigned int i=1; i bmax[0] ) bmax[0] = p[0]; - if ( p[1] > bmax[1] ) bmax[1] = p[1]; - if ( p[2] > bmax[2] ) bmax[2] = p[2]; - - } -} - - -void fm_eulerToQuat(float roll,float pitch,float yaw,float *quat) // convert euler angles to quaternion. -{ - roll *= 0.5f; - pitch *= 0.5f; - yaw *= 0.5f; - - float cr = cosf(roll); - float cp = cosf(pitch); - float cy = cosf(yaw); - - float sr = sinf(roll); - float sp = sinf(pitch); - float sy = sinf(yaw); - - float cpcy = cp * cy; - float spsy = sp * sy; - float spcy = sp * cy; - float cpsy = cp * sy; - - quat[0] = ( sr * cpcy - cr * spsy); - quat[1] = ( cr * spcy + sr * cpsy); - quat[2] = ( cr * cpsy - sr * spcy); - quat[3] = cr * cpcy + sr * spsy; -} - -void fm_quatToMatrix(const float *quat,float *matrix) // convert quaterinion rotation to matrix, zeros out the translation component. -{ - - float xx = quat[0]*quat[0]; - float yy = quat[1]*quat[1]; - float zz = quat[2]*quat[2]; - float xy = quat[0]*quat[1]; - float xz = quat[0]*quat[2]; - float yz = quat[1]*quat[2]; - float wx = quat[3]*quat[0]; - float wy = quat[3]*quat[1]; - float wz = quat[3]*quat[2]; - - matrix[0*4+0] = 1 - 2 * ( yy + zz ); - matrix[1*4+0] = 2 * ( xy - wz ); - matrix[2*4+0] = 2 * ( xz + wy ); - - matrix[0*4+1] = 2 * ( xy + wz ); - matrix[1*4+1] = 1 - 2 * ( xx + zz ); - matrix[2*4+1] = 2 * ( yz - wx ); - - matrix[0*4+2] = 2 * ( xz - wy ); - matrix[1*4+2] = 2 * ( yz + wx ); - matrix[2*4+2] = 1 - 2 * ( xx + yy ); - - matrix[3*4+0] = matrix[3*4+1] = matrix[3*4+2] = 0.0f; - matrix[0*4+3] = matrix[1*4+3] = matrix[2*4+3] = 0.0f; - matrix[3*4+3] = 1.0f; - -} - - -void fm_quatRotate(const float *quat,const float *v,float *r) // rotate a vector directly by a quaternion. -{ - float left[4]; - - left[0] = quat[3]*v[0] + quat[1]*v[2] - v[1]*quat[2]; - left[1] = quat[3]*v[1] + quat[2]*v[0] - v[2]*quat[0]; - left[2] = quat[3]*v[2] + quat[0]*v[1] - v[0]*quat[1]; - left[3] = - quat[0]*v[0] - quat[1]*v[1] - quat[2]*v[2]; - - r[0] = (left[3]*-quat[0]) + (quat[3]*left[0]) + (left[1]*-quat[2]) - (-quat[1]*left[2]); - r[1] = (left[3]*-quat[1]) + (quat[3]*left[1]) + (left[2]*-quat[0]) - (-quat[2]*left[0]); - r[2] = (left[3]*-quat[2]) + (quat[3]*left[2]) + (left[0]*-quat[1]) - (-quat[0]*left[1]); - -} - - -void fm_getTranslation(const float *matrix,float *t) -{ - t[0] = matrix[3*4+0]; - t[1] = matrix[3*4+1]; - t[2] = matrix[3*4+2]; -} - -void fm_matrixToQuat(const float *matrix,float *quat) // convert the 3x3 portion of a 4x4 matrix into a quaterion as x,y,z,w -{ - - float tr = matrix[0*4+0] + matrix[1*4+1] + matrix[2*4+2]; - - // check the diagonal - - if (tr > 0.0f ) - { - float s = (float) sqrt ( (double) (tr + 1.0f) ); - quat[3] = s * 0.5f; - s = 0.5f / s; - quat[0] = (matrix[1*4+2] - matrix[2*4+1]) * s; - quat[1] = (matrix[2*4+0] - matrix[0*4+2]) * s; - quat[2] = (matrix[0*4+1] - matrix[1*4+0]) * s; - - } - else - { - // diagonal is negative - int nxt[3] = {1, 2, 0}; - float qa[4]; - - int i = 0; - - if (matrix[1*4+1] > matrix[0*4+0]) i = 1; - if (matrix[2*4+2] > matrix[i*4+i]) i = 2; - - int j = nxt[i]; - int k = nxt[j]; - - float s = sqrtf ( ((matrix[i*4+i] - (matrix[j*4+j] + matrix[k*4+k])) + 1.0f) ); - - qa[i] = s * 0.5f; - - if (s != 0.0f ) s = 0.5f / s; - - qa[3] = (matrix[j*4+k] - matrix[k*4+j]) * s; - qa[j] = (matrix[i*4+j] + matrix[j*4+i]) * s; - qa[k] = (matrix[i*4+k] + matrix[k*4+i]) * s; - - quat[0] = qa[0]; - quat[1] = qa[1]; - quat[2] = qa[2]; - quat[3] = qa[3]; - } - - -} - - -float fm_sphereVolume(float radius) // return's the volume of a sphere of this radius (4/3 PI * R cubed ) -{ - return (4.0f / 3.0f ) * FM_PI * radius * radius * radius; -} +#include "float_math.h" + +#include +#include +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +void fm_inverseRT(const float *matrix,const float *pos,float *t) // inverse rotate translate the point. +{ + + float _x = pos[0] - matrix[3*4+0]; + float _y = pos[1] - matrix[3*4+1]; + float _z = pos[2] - matrix[3*4+2]; + + // Multiply inverse-translated source vector by inverted rotation transform + + t[0] = (matrix[0*4+0] * _x) + (matrix[0*4+1] * _y) + (matrix[0*4+2] * _z); + t[1] = (matrix[1*4+0] * _x) + (matrix[1*4+1] * _y) + (matrix[1*4+2] * _z); + t[2] = (matrix[2*4+0] * _x) + (matrix[2*4+1] * _y) + (matrix[2*4+2] * _z); + +} + + +void fm_identity(float *matrix) // set 4x4 matrix to identity. +{ + matrix[0*4+0] = 1; + matrix[1*4+1] = 1; + matrix[2*4+2] = 1; + matrix[3*4+3] = 1; + + matrix[1*4+0] = 0; + matrix[2*4+0] = 0; + matrix[3*4+0] = 0; + + matrix[0*4+1] = 0; + matrix[2*4+1] = 0; + matrix[3*4+1] = 0; + + matrix[0*4+2] = 0; + matrix[1*4+2] = 0; + matrix[3*4+2] = 0; + + matrix[0*4+3] = 0; + matrix[1*4+3] = 0; + matrix[2*4+3] = 0; + +} + +void fm_eulerMatrix(float ax,float ay,float az,float *matrix) // convert euler (in radians) to a dest 4x4 matrix (translation set to zero) +{ + float quat[4]; + fm_eulerToQuat(ax,ay,az,quat); + fm_quatToMatrix(quat,matrix); +} + +void fm_getAABB(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax) +{ + + const unsigned char *source = (const unsigned char *) points; + + bmin[0] = points[0]; + bmin[1] = points[1]; + bmin[2] = points[2]; + + bmax[0] = points[0]; + bmax[1] = points[1]; + bmax[2] = points[2]; + + + for (unsigned int i=1; i bmax[0] ) bmax[0] = p[0]; + if ( p[1] > bmax[1] ) bmax[1] = p[1]; + if ( p[2] > bmax[2] ) bmax[2] = p[2]; + + } +} + + +void fm_eulerToQuat(float roll,float pitch,float yaw,float *quat) // convert euler angles to quaternion. +{ + roll *= 0.5f; + pitch *= 0.5f; + yaw *= 0.5f; + + float cr = cosf(roll); + float cp = cosf(pitch); + float cy = cosf(yaw); + + float sr = sinf(roll); + float sp = sinf(pitch); + float sy = sinf(yaw); + + float cpcy = cp * cy; + float spsy = sp * sy; + float spcy = sp * cy; + float cpsy = cp * sy; + + quat[0] = ( sr * cpcy - cr * spsy); + quat[1] = ( cr * spcy + sr * cpsy); + quat[2] = ( cr * cpsy - sr * spcy); + quat[3] = cr * cpcy + sr * spsy; +} + +void fm_quatToMatrix(const float *quat,float *matrix) // convert quaterinion rotation to matrix, zeros out the translation component. +{ + + float xx = quat[0]*quat[0]; + float yy = quat[1]*quat[1]; + float zz = quat[2]*quat[2]; + float xy = quat[0]*quat[1]; + float xz = quat[0]*quat[2]; + float yz = quat[1]*quat[2]; + float wx = quat[3]*quat[0]; + float wy = quat[3]*quat[1]; + float wz = quat[3]*quat[2]; + + matrix[0*4+0] = 1 - 2 * ( yy + zz ); + matrix[1*4+0] = 2 * ( xy - wz ); + matrix[2*4+0] = 2 * ( xz + wy ); + + matrix[0*4+1] = 2 * ( xy + wz ); + matrix[1*4+1] = 1 - 2 * ( xx + zz ); + matrix[2*4+1] = 2 * ( yz - wx ); + + matrix[0*4+2] = 2 * ( xz - wy ); + matrix[1*4+2] = 2 * ( yz + wx ); + matrix[2*4+2] = 1 - 2 * ( xx + yy ); + + matrix[3*4+0] = matrix[3*4+1] = matrix[3*4+2] = 0.0f; + matrix[0*4+3] = matrix[1*4+3] = matrix[2*4+3] = 0.0f; + matrix[3*4+3] = 1.0f; + +} + + +void fm_quatRotate(const float *quat,const float *v,float *r) // rotate a vector directly by a quaternion. +{ + float left[4]; + + left[0] = quat[3]*v[0] + quat[1]*v[2] - v[1]*quat[2]; + left[1] = quat[3]*v[1] + quat[2]*v[0] - v[2]*quat[0]; + left[2] = quat[3]*v[2] + quat[0]*v[1] - v[0]*quat[1]; + left[3] = - quat[0]*v[0] - quat[1]*v[1] - quat[2]*v[2]; + + r[0] = (left[3]*-quat[0]) + (quat[3]*left[0]) + (left[1]*-quat[2]) - (-quat[1]*left[2]); + r[1] = (left[3]*-quat[1]) + (quat[3]*left[1]) + (left[2]*-quat[0]) - (-quat[2]*left[0]); + r[2] = (left[3]*-quat[2]) + (quat[3]*left[2]) + (left[0]*-quat[1]) - (-quat[0]*left[1]); + +} + + +void fm_getTranslation(const float *matrix,float *t) +{ + t[0] = matrix[3*4+0]; + t[1] = matrix[3*4+1]; + t[2] = matrix[3*4+2]; +} + +void fm_matrixToQuat(const float *matrix,float *quat) // convert the 3x3 portion of a 4x4 matrix into a quaterion as x,y,z,w +{ + + float tr = matrix[0*4+0] + matrix[1*4+1] + matrix[2*4+2]; + + // check the diagonal + + if (tr > 0.0f ) + { + float s = (float) sqrt ( (double) (tr + 1.0f) ); + quat[3] = s * 0.5f; + s = 0.5f / s; + quat[0] = (matrix[1*4+2] - matrix[2*4+1]) * s; + quat[1] = (matrix[2*4+0] - matrix[0*4+2]) * s; + quat[2] = (matrix[0*4+1] - matrix[1*4+0]) * s; + + } + else + { + // diagonal is negative + int nxt[3] = {1, 2, 0}; + float qa[4]; + + int i = 0; + + if (matrix[1*4+1] > matrix[0*4+0]) i = 1; + if (matrix[2*4+2] > matrix[i*4+i]) i = 2; + + int j = nxt[i]; + int k = nxt[j]; + + float s = sqrtf ( ((matrix[i*4+i] - (matrix[j*4+j] + matrix[k*4+k])) + 1.0f) ); + + qa[i] = s * 0.5f; + + if (s != 0.0f ) s = 0.5f / s; + + qa[3] = (matrix[j*4+k] - matrix[k*4+j]) * s; + qa[j] = (matrix[i*4+j] + matrix[j*4+i]) * s; + qa[k] = (matrix[i*4+k] + matrix[k*4+i]) * s; + + quat[0] = qa[0]; + quat[1] = qa[1]; + quat[2] = qa[2]; + quat[3] = qa[3]; + } + + +} + + +float fm_sphereVolume(float radius) // return's the volume of a sphere of this radius (4/3 PI * R cubed ) +{ + return (4.0f / 3.0f ) * FM_PI * radius * radius * radius; +} diff --git a/Extras/ConvexDecomposition/float_math.h b/Extras/ConvexDecomposition/float_math.h index f91b5ba48..d6046d3b0 100644 --- a/Extras/ConvexDecomposition/float_math.h +++ b/Extras/ConvexDecomposition/float_math.h @@ -1,72 +1,72 @@ -#ifndef FLOAT_MATH_H - -#define FLOAT_MATH_H - -#ifdef _WIN32 - #pragma warning(disable : 4324) // disable padding warning - #pragma warning(disable : 4244) // disable padding warning - #pragma warning(disable : 4267) // possible loss of data - #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. - #pragma warning(disable:4996) //Turn off warnings about deprecated C routines - #pragma warning(disable:4786) // Disable the "debug name too long" warning -#endif - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -// a set of routines that last you do common 3d math -// operations without any vector, matrix, or quaternion -// classes or templates. -// -// a vector (or point) is a 'float *' to 3 floating point numbers. -// a matrix is a 'float *' to an array of 16 floating point numbers representing a 4x4 transformation matrix compatible with D3D or OGL -// a quaternion is a 'float *' to 4 floats representing a quaternion x,y,z,w - -const float FM_PI = 3.141592654f; -const float FM_DEG_TO_RAD = ((2.0f * FM_PI) / 360.0f); -const float FM_RAD_TO_DEG = (360.0f / (2.0f * FM_PI)); - -void fm_identity(float *matrix); // set 4x4 matrix to identity. -void fm_inverseRT(const float *matrix,const float *pos,float *t); // inverse rotate translate the point. -void fm_eulerMatrix(float ax,float ay,float az,float *matrix); // convert euler (in radians) to a dest 4x4 matrix (translation set to zero) -void fm_getAABB(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax); -void fm_eulerToQuat(float roll,float pitch,float yaw,float *quat); // convert euler angles to quaternion. -void fm_quatToMatrix(const float *quat,float *matrix); // convert quaterinion rotation to matrix, translation set to zero. -void fm_quatRotate(const float *quat,const float *v,float *r); // rotate a vector directly by a quaternion. -void fm_getTranslation(const float *matrix,float *t); -void fm_matrixToQuat(const float *matrix,float *quat); // convert the 3x3 portion of a 4x4 matrix into a quaterion as x,y,z,w -float fm_sphereVolume(float radius); // return's the volume of a sphere of this radius (4/3 PI * R cubed ) - -#endif +#ifndef FLOAT_MATH_H + +#define FLOAT_MATH_H + +#ifdef _WIN32 + #pragma warning(disable : 4324) // disable padding warning + #pragma warning(disable : 4244) // disable padding warning + #pragma warning(disable : 4267) // possible loss of data + #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. + #pragma warning(disable:4996) //Turn off warnings about deprecated C routines + #pragma warning(disable:4786) // Disable the "debug name too long" warning +#endif + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +// a set of routines that last you do common 3d math +// operations without any vector, matrix, or quaternion +// classes or templates. +// +// a vector (or point) is a 'float *' to 3 floating point numbers. +// a matrix is a 'float *' to an array of 16 floating point numbers representing a 4x4 transformation matrix compatible with D3D or OGL +// a quaternion is a 'float *' to 4 floats representing a quaternion x,y,z,w + +const float FM_PI = 3.141592654f; +const float FM_DEG_TO_RAD = ((2.0f * FM_PI) / 360.0f); +const float FM_RAD_TO_DEG = (360.0f / (2.0f * FM_PI)); + +void fm_identity(float *matrix); // set 4x4 matrix to identity. +void fm_inverseRT(const float *matrix,const float *pos,float *t); // inverse rotate translate the point. +void fm_eulerMatrix(float ax,float ay,float az,float *matrix); // convert euler (in radians) to a dest 4x4 matrix (translation set to zero) +void fm_getAABB(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax); +void fm_eulerToQuat(float roll,float pitch,float yaw,float *quat); // convert euler angles to quaternion. +void fm_quatToMatrix(const float *quat,float *matrix); // convert quaterinion rotation to matrix, translation set to zero. +void fm_quatRotate(const float *quat,const float *v,float *r); // rotate a vector directly by a quaternion. +void fm_getTranslation(const float *matrix,float *t); +void fm_matrixToQuat(const float *matrix,float *quat); // convert the 3x3 portion of a 4x4 matrix into a quaterion as x,y,z,w +float fm_sphereVolume(float radius); // return's the volume of a sphere of this radius (4/3 PI * R cubed ) + +#endif diff --git a/Extras/ConvexDecomposition/meshvolume.cpp b/Extras/ConvexDecomposition/meshvolume.cpp index 42fae458a..b9dfa174d 100644 --- a/Extras/ConvexDecomposition/meshvolume.cpp +++ b/Extras/ConvexDecomposition/meshvolume.cpp @@ -1,128 +1,128 @@ -#include "float_math.h" -#include "meshvolume.h" - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -inline float det(const float *p1,const float *p2,const float *p3) -{ - return p1[0]*p2[1]*p3[2] + p2[0]*p3[1]*p1[2] + p3[0]*p1[1]*p2[2] -p1[0]*p3[1]*p2[2] - p2[0]*p1[1]*p3[2] - p3[0]*p2[1]*p1[2]; -} - -float computeMeshVolume(const float *vertices,unsigned int tcount,const unsigned int *indices) -{ - float volume = 0; - - for (unsigned int i=0; i -#include -#include -#include - -#include "planetri.h" - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -static inline float DistToPt(const float *p,const float *plane) -{ - float x = p[0]; - float y = p[1]; - float z = p[2]; - float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; - return d; -} - - -static PlaneTriResult getSidePlane(const float *p,const float *plane,float epsilon) -{ - - float d = DistToPt(p,plane); - - if ( (d+epsilon) > 0 ) - return PTR_FRONT; // it is 'in front' within the provided epsilon value. - - return PTR_BACK; -} - -static void add(const float *p,float *dest,unsigned int tstride,unsigned int &pcount) -{ - char *d = (char *) dest; - d = d + pcount*tstride; - dest = (float *) d; - dest[0] = p[0]; - dest[1] = p[1]; - dest[2] = p[2]; - pcount++; - assert( pcount <= 4 ); -} - - -// assumes that the points are on opposite sides of the plane! -static void intersect(const float *p1,const float *p2,float *split,const float *plane) -{ - - float dp1 = DistToPt(p1,plane); - - float dir[3]; - - dir[0] = p2[0] - p1[0]; - dir[1] = p2[1] - p1[1]; - dir[2] = p2[2] - p1[2]; - - float dot1 = dir[0]*plane[0] + dir[1]*plane[1] + dir[2]*plane[2]; - float dot2 = dp1 - plane[3]; - - float t = -(plane[3] + dot2 ) / dot1; - - split[0] = (dir[0]*t)+p1[0]; - split[1] = (dir[1]*t)+p1[1]; - split[2] = (dir[2]*t)+p1[2]; - -} - -PlaneTriResult planeTriIntersection(const float *plane, // the plane equation in Ax+By+Cz+D format - const float *triangle, // the source triangle. - unsigned int tstride, // stride in bytes of the input and output triangles - float epsilon, // the co-planer epsilon value. - float *front, // the triangle in front of the - unsigned int &fcount, // number of vertices in the 'front' triangle - float *back, // the triangle in back of the plane - unsigned int &bcount) // the number of vertices in the 'back' triangle. -{ - fcount = 0; - bcount = 0; - - const char *tsource = (const char *) triangle; - - // get the three vertices of the triangle. - const float *p1 = (const float *) (tsource); - const float *p2 = (const float *) (tsource+tstride); - const float *p3 = (const float *) (tsource+tstride*2); - - - PlaneTriResult r1 = getSidePlane(p1,plane,epsilon); // compute the side of the plane each vertex is on - PlaneTriResult r2 = getSidePlane(p2,plane,epsilon); - PlaneTriResult r3 = getSidePlane(p3,plane,epsilon); - - if ( r1 == r2 && r1 == r3 ) // if all three vertices are on the same side of the plane. - { - if ( r1 == PTR_FRONT ) // if all three are in front of the plane, then copy to the 'front' output triangle. - { - add(p1,front,tstride,fcount); - add(p2,front,tstride,fcount); - add(p3,front,tstride,fcount); - } - else - { - add(p1,back,tstride,bcount); // if all three are in 'abck' then copy to the 'back' output triangle. - add(p2,back,tstride,bcount); - add(p3,back,tstride,bcount); - } - return r1; // if all three points are on the same side of the plane return result - } - - // ok.. we need to split the triangle at the plane. - - // First test ray segment P1 to P2 - if ( r1 == r2 ) // if these are both on the same side... - { - if ( r1 == PTR_FRONT ) - { - add( p1, front, tstride, fcount ); - add( p2, front, tstride, fcount ); - } - else - { - add( p1, back, tstride, bcount ); - add( p2, back, tstride, bcount ); - } - } - else - { - float split[3]; // split the point - intersect(p1,p2,split,plane); - - if ( r1 == PTR_FRONT ) - { - - add(p1, front, tstride, fcount ); - add(split, front, tstride, fcount ); - - add(split, back, tstride, bcount ); - add(p2, back, tstride, bcount ); - - } - else - { - add(p1, back, tstride, bcount ); - add(split, back, tstride, bcount ); - - add(split, front, tstride, fcount ); - add(p2, front, tstride, fcount ); - } - - } - - // Next test ray segment P2 to P3 - if ( r2 == r3 ) // if these are both on the same side... - { - if ( r3 == PTR_FRONT ) - { - add( p3, front, tstride, fcount ); - } - else - { - add( p3, back, tstride, bcount ); - } - } - else - { - float split[3]; // split the point - intersect(p2,p3,split,plane); - - if ( r3 == PTR_FRONT ) - { - add(split, front, tstride, fcount ); - add(split, back, tstride, bcount ); - - add(p3, front, tstride, fcount ); - } - else - { - add(split, front, tstride, fcount ); - add(split, back, tstride, bcount ); - - add(p3, back, tstride, bcount ); - } - } - - // Next test ray segment P3 to P1 - if ( r3 != r1 ) // if these are both on the same side... - { - float split[3]; // split the point - - intersect(p3,p1,split,plane); - - if ( r1 == PTR_FRONT ) - { - add(split, front, tstride, fcount ); - add(split, back, tstride, bcount ); - } - else - { - add(split, front, tstride, fcount ); - add(split, back, tstride, bcount ); - } - } - - - - return PTR_SPLIT; -} +#include "float_math.h" +#include +#include +#include +#include + +#include "planetri.h" + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +static inline float DistToPt(const float *p,const float *plane) +{ + float x = p[0]; + float y = p[1]; + float z = p[2]; + float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; + return d; +} + + +static PlaneTriResult getSidePlane(const float *p,const float *plane,float epsilon) +{ + + float d = DistToPt(p,plane); + + if ( (d+epsilon) > 0 ) + return PTR_FRONT; // it is 'in front' within the provided epsilon value. + + return PTR_BACK; +} + +static void add(const float *p,float *dest,unsigned int tstride,unsigned int &pcount) +{ + char *d = (char *) dest; + d = d + pcount*tstride; + dest = (float *) d; + dest[0] = p[0]; + dest[1] = p[1]; + dest[2] = p[2]; + pcount++; + assert( pcount <= 4 ); +} + + +// assumes that the points are on opposite sides of the plane! +static void intersect(const float *p1,const float *p2,float *split,const float *plane) +{ + + float dp1 = DistToPt(p1,plane); + + float dir[3]; + + dir[0] = p2[0] - p1[0]; + dir[1] = p2[1] - p1[1]; + dir[2] = p2[2] - p1[2]; + + float dot1 = dir[0]*plane[0] + dir[1]*plane[1] + dir[2]*plane[2]; + float dot2 = dp1 - plane[3]; + + float t = -(plane[3] + dot2 ) / dot1; + + split[0] = (dir[0]*t)+p1[0]; + split[1] = (dir[1]*t)+p1[1]; + split[2] = (dir[2]*t)+p1[2]; + +} + +PlaneTriResult planeTriIntersection(const float *plane, // the plane equation in Ax+By+Cz+D format + const float *triangle, // the source triangle. + unsigned int tstride, // stride in bytes of the input and output triangles + float epsilon, // the co-planer epsilon value. + float *front, // the triangle in front of the + unsigned int &fcount, // number of vertices in the 'front' triangle + float *back, // the triangle in back of the plane + unsigned int &bcount) // the number of vertices in the 'back' triangle. +{ + fcount = 0; + bcount = 0; + + const char *tsource = (const char *) triangle; + + // get the three vertices of the triangle. + const float *p1 = (const float *) (tsource); + const float *p2 = (const float *) (tsource+tstride); + const float *p3 = (const float *) (tsource+tstride*2); + + + PlaneTriResult r1 = getSidePlane(p1,plane,epsilon); // compute the side of the plane each vertex is on + PlaneTriResult r2 = getSidePlane(p2,plane,epsilon); + PlaneTriResult r3 = getSidePlane(p3,plane,epsilon); + + if ( r1 == r2 && r1 == r3 ) // if all three vertices are on the same side of the plane. + { + if ( r1 == PTR_FRONT ) // if all three are in front of the plane, then copy to the 'front' output triangle. + { + add(p1,front,tstride,fcount); + add(p2,front,tstride,fcount); + add(p3,front,tstride,fcount); + } + else + { + add(p1,back,tstride,bcount); // if all three are in 'abck' then copy to the 'back' output triangle. + add(p2,back,tstride,bcount); + add(p3,back,tstride,bcount); + } + return r1; // if all three points are on the same side of the plane return result + } + + // ok.. we need to split the triangle at the plane. + + // First test ray segment P1 to P2 + if ( r1 == r2 ) // if these are both on the same side... + { + if ( r1 == PTR_FRONT ) + { + add( p1, front, tstride, fcount ); + add( p2, front, tstride, fcount ); + } + else + { + add( p1, back, tstride, bcount ); + add( p2, back, tstride, bcount ); + } + } + else + { + float split[3]; // split the point + intersect(p1,p2,split,plane); + + if ( r1 == PTR_FRONT ) + { + + add(p1, front, tstride, fcount ); + add(split, front, tstride, fcount ); + + add(split, back, tstride, bcount ); + add(p2, back, tstride, bcount ); + + } + else + { + add(p1, back, tstride, bcount ); + add(split, back, tstride, bcount ); + + add(split, front, tstride, fcount ); + add(p2, front, tstride, fcount ); + } + + } + + // Next test ray segment P2 to P3 + if ( r2 == r3 ) // if these are both on the same side... + { + if ( r3 == PTR_FRONT ) + { + add( p3, front, tstride, fcount ); + } + else + { + add( p3, back, tstride, bcount ); + } + } + else + { + float split[3]; // split the point + intersect(p2,p3,split,plane); + + if ( r3 == PTR_FRONT ) + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + + add(p3, front, tstride, fcount ); + } + else + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + + add(p3, back, tstride, bcount ); + } + } + + // Next test ray segment P3 to P1 + if ( r3 != r1 ) // if these are both on the same side... + { + float split[3]; // split the point + + intersect(p3,p1,split,plane); + + if ( r1 == PTR_FRONT ) + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + } + else + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + } + } + + + + return PTR_SPLIT; +} diff --git a/Extras/ConvexDecomposition/planetri.h b/Extras/ConvexDecomposition/planetri.h index acc185a9c..780ac854a 100644 --- a/Extras/ConvexDecomposition/planetri.h +++ b/Extras/ConvexDecomposition/planetri.h @@ -1,58 +1,58 @@ -#ifndef PLANE_TRI_H - -#define PLANE_TRI_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - - -enum PlaneTriResult -{ - PTR_FRONT, - PTR_BACK, - PTR_SPLIT -}; - -PlaneTriResult planeTriIntersection(const float *plane, // the plane equation in Ax+By+Cz+D format - const float *triangle, // the source position triangle. - unsigned int tstride, // stride in bytes between vertices of the triangle. - float epsilon, // the co-planer epsilon value. - float *front, // the triangle in front of the - unsigned int &fcount, // number of vertices in the 'front' triangle. - float *back, // the triangle in back of the plane - unsigned int &bcount); // the number of vertices in the 'back' triangle. - - -#endif +#ifndef PLANE_TRI_H + +#define PLANE_TRI_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +enum PlaneTriResult +{ + PTR_FRONT, + PTR_BACK, + PTR_SPLIT +}; + +PlaneTriResult planeTriIntersection(const float *plane, // the plane equation in Ax+By+Cz+D format + const float *triangle, // the source position triangle. + unsigned int tstride, // stride in bytes between vertices of the triangle. + float epsilon, // the co-planer epsilon value. + float *front, // the triangle in front of the + unsigned int &fcount, // number of vertices in the 'front' triangle. + float *back, // the triangle in back of the plane + unsigned int &bcount); // the number of vertices in the 'back' triangle. + + +#endif diff --git a/Extras/ConvexDecomposition/raytri.cpp b/Extras/ConvexDecomposition/raytri.cpp index 6655d3143..83b076a20 100644 --- a/Extras/ConvexDecomposition/raytri.cpp +++ b/Extras/ConvexDecomposition/raytri.cpp @@ -1,134 +1,134 @@ -#include "float_math.h" -#include -#include -#include -#include -#include - -#include "raytri.h" - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -/* a = b - c */ -#define vector(a,b,c) \ - (a)[0] = (b)[0] - (c)[0]; \ - (a)[1] = (b)[1] - (c)[1]; \ - (a)[2] = (b)[2] - (c)[2]; - - - -#define innerProduct(v,q) \ - ((v)[0] * (q)[0] + \ - (v)[1] * (q)[1] + \ - (v)[2] * (q)[2]) - -#define crossProduct(a,b,c) \ - (a)[0] = (b)[1] * (c)[2] - (c)[1] * (b)[2]; \ - (a)[1] = (b)[2] * (c)[0] - (c)[2] * (b)[0]; \ - (a)[2] = (b)[0] * (c)[1] - (c)[0] * (b)[1]; - -bool rayIntersectsTriangle(const float *p,const float *d,const float *v0,const float *v1,const float *v2,float &t) -{ - - float e1[3],e2[3],h[3],s[3],q[3]; - float a,f,u,v; - - vector(e1,v1,v0); - vector(e2,v2,v0); - crossProduct(h,d,e2); - a = innerProduct(e1,h); - - if (a > -0.00001 && a < 0.00001) - return(false); - - f = 1/a; - vector(s,p,v0); - u = f * (innerProduct(s,h)); - - if (u < 0.0 || u > 1.0) - return(false); - - crossProduct(q,s,e1); - v = f * innerProduct(d,q); - if (v < 0.0 || u + v > 1.0) - return(false); - // at this stage we can compute t to find out where - // the intersection point is on the line - t = f * innerProduct(e2,q); - if (t > 0) // ray intersection - return(true); - else // this means that there is a line intersection - // but not a ray intersection - return (false); -} - - -bool lineIntersectsTriangle(const float *rayStart,const float *rayEnd,const float *p1,const float *p2,const float *p3,float *sect) -{ - float dir[3]; - - dir[0] = rayEnd[0] - rayStart[0]; - dir[1] = rayEnd[1] - rayStart[1]; - dir[2] = rayEnd[2] - rayStart[2]; - - float d = sqrtf(dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]); - float r = 1.0f / d; - - dir[0]*=r; - dir[1]*=r; - dir[2]*=r; - - - float t; - - bool ret = rayIntersectsTriangle(rayStart, dir, p1, p2, p3, t ); - - if ( ret ) - { - if ( t > d ) - { - sect[0] = rayStart[0] + dir[0]*t; - sect[1] = rayStart[1] + dir[1]*t; - sect[2] = rayStart[2] + dir[2]*t; - } - else - { - ret = false; - } - } - - return ret; -} +#include "float_math.h" +#include +#include +#include +#include +#include + +#include "raytri.h" + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +/* a = b - c */ +#define vector(a,b,c) \ + (a)[0] = (b)[0] - (c)[0]; \ + (a)[1] = (b)[1] - (c)[1]; \ + (a)[2] = (b)[2] - (c)[2]; + + + +#define innerProduct(v,q) \ + ((v)[0] * (q)[0] + \ + (v)[1] * (q)[1] + \ + (v)[2] * (q)[2]) + +#define crossProduct(a,b,c) \ + (a)[0] = (b)[1] * (c)[2] - (c)[1] * (b)[2]; \ + (a)[1] = (b)[2] * (c)[0] - (c)[2] * (b)[0]; \ + (a)[2] = (b)[0] * (c)[1] - (c)[0] * (b)[1]; + +bool rayIntersectsTriangle(const float *p,const float *d,const float *v0,const float *v1,const float *v2,float &t) +{ + + float e1[3],e2[3],h[3],s[3],q[3]; + float a,f,u,v; + + vector(e1,v1,v0); + vector(e2,v2,v0); + crossProduct(h,d,e2); + a = innerProduct(e1,h); + + if (a > -0.00001 && a < 0.00001) + return(false); + + f = 1/a; + vector(s,p,v0); + u = f * (innerProduct(s,h)); + + if (u < 0.0 || u > 1.0) + return(false); + + crossProduct(q,s,e1); + v = f * innerProduct(d,q); + if (v < 0.0 || u + v > 1.0) + return(false); + // at this stage we can compute t to find out where + // the intersection point is on the line + t = f * innerProduct(e2,q); + if (t > 0) // ray intersection + return(true); + else // this means that there is a line intersection + // but not a ray intersection + return (false); +} + + +bool lineIntersectsTriangle(const float *rayStart,const float *rayEnd,const float *p1,const float *p2,const float *p3,float *sect) +{ + float dir[3]; + + dir[0] = rayEnd[0] - rayStart[0]; + dir[1] = rayEnd[1] - rayStart[1]; + dir[2] = rayEnd[2] - rayStart[2]; + + float d = sqrtf(dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]); + float r = 1.0f / d; + + dir[0]*=r; + dir[1]*=r; + dir[2]*=r; + + + float t; + + bool ret = rayIntersectsTriangle(rayStart, dir, p1, p2, p3, t ); + + if ( ret ) + { + if ( t > d ) + { + sect[0] = rayStart[0] + dir[0]*t; + sect[1] = rayStart[1] + dir[1]*t; + sect[2] = rayStart[2] + dir[2]*t; + } + else + { + ret = false; + } + } + + return ret; +} diff --git a/Extras/ConvexDecomposition/raytri.h b/Extras/ConvexDecomposition/raytri.h index 899dd0627..76370c6d7 100644 --- a/Extras/ConvexDecomposition/raytri.h +++ b/Extras/ConvexDecomposition/raytri.h @@ -1,45 +1,45 @@ -#ifndef RAY_TRI_H - -#define RAY_TRI_H - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - - -// returns true if the ray intersects the triangle. -bool lineIntersectsTriangle(const float *rayStart,const float *rayEnd,const float *p1,const float *p2,const float *p3,float *sect); -bool rayIntersectsTriangle(const float *p,const float *d,const float *v0,const float *v1,const float *v2,float &t); - -#endif +#ifndef RAY_TRI_H + +#define RAY_TRI_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +// returns true if the ray intersects the triangle. +bool lineIntersectsTriangle(const float *rayStart,const float *rayEnd,const float *p1,const float *p2,const float *p3,float *sect); +bool rayIntersectsTriangle(const float *p,const float *d,const float *v0,const float *v1,const float *v2,float &t); + +#endif diff --git a/Extras/ConvexDecomposition/splitplane.cpp b/Extras/ConvexDecomposition/splitplane.cpp index c552d3cbd..2ae408e60 100644 --- a/Extras/ConvexDecomposition/splitplane.cpp +++ b/Extras/ConvexDecomposition/splitplane.cpp @@ -1,306 +1,306 @@ -#include "float_math.h" -#include -#include -#include -#include -#include -#include - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -#include "splitplane.h" -#include "ConvexDecomposition.h" -#include "cd_vector.h" -#include "cd_hull.h" -#include "cd_wavefront.h" -#include "bestfit.h" -#include "planetri.h" -#include "vlookup.h" -#include "meshvolume.h" - -namespace ConvexDecomposition -{ - -static void computePlane(const float *A,const float *B,const float *C,float *plane) -{ - - float vx = (B[0] - C[0]); - float vy = (B[1] - C[1]); - float vz = (B[2] - C[2]); - - float wx = (A[0] - B[0]); - float wy = (A[1] - B[1]); - float wz = (A[2] - B[2]); - - float vw_x = vy * wz - vz * wy; - float vw_y = vz * wx - vx * wz; - float vw_z = vx * wy - vy * wx; - - float mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); - - if ( mag < 0.000001f ) - { - mag = 0; - } - else - { - mag = 1.0f/mag; - } - - float x = vw_x * mag; - float y = vw_y * mag; - float z = vw_z * mag; - - - float D = 0.0f - ((x*A[0])+(y*A[1])+(z*A[2])); - - plane[0] = x; - plane[1] = y; - plane[2] = z; - plane[3] = D; - -} - -class Rect3d -{ -public: - Rect3d(void) { }; - - Rect3d(const float *bmin,const float *bmax) - { - - mMin[0] = bmin[0]; - mMin[1] = bmin[1]; - mMin[2] = bmin[2]; - - mMax[0] = bmax[0]; - mMax[1] = bmax[1]; - mMax[2] = bmax[2]; - - } - - void SetMin(const float *bmin) - { - mMin[0] = bmin[0]; - mMin[1] = bmin[1]; - mMin[2] = bmin[2]; - } - - void SetMax(const float *bmax) - { - mMax[0] = bmax[0]; - mMax[1] = bmax[1]; - mMax[2] = bmax[2]; - } - - void SetMin(float x,float y,float z) - { - mMin[0] = x; - mMin[1] = y; - mMin[2] = z; - } - - void SetMax(float x,float y,float z) - { - mMax[0] = x; - mMax[1] = y; - mMax[2] = z; - } - - float mMin[3]; - float mMax[3]; -}; - -void splitRect(unsigned int axis, - const Rect3d &source, - Rect3d &b1, - Rect3d &b2, - const float *midpoint) -{ - switch ( axis ) - { - case 0: - b1.SetMin(source.mMin); - b1.SetMax( midpoint[0], source.mMax[1], source.mMax[2] ); - - b2.SetMin( midpoint[0], source.mMin[1], source.mMin[2] ); - b2.SetMax(source.mMax); - - break; - case 1: - b1.SetMin(source.mMin); - b1.SetMax( source.mMax[0], midpoint[1], source.mMax[2] ); - - b2.SetMin( source.mMin[0], midpoint[1], source.mMin[2] ); - b2.SetMax(source.mMax); - - break; - case 2: - b1.SetMin(source.mMin); - b1.SetMax( source.mMax[0], source.mMax[1], midpoint[2] ); - - b2.SetMin( source.mMin[0], source.mMin[1], midpoint[2] ); - b2.SetMax(source.mMax); - - break; - } -} - -bool computeSplitPlane(unsigned int vcount, - const float *vertices, - unsigned int tcount, - const unsigned int *indices, - ConvexDecompInterface *callback, - float *plane) -{ - float bmin[3] = { 1e9, 1e9, 1e9 }; - float bmax[3] = { -1e9, -1e9, -1e9 }; - - for (unsigned int i=0; i bmax[0] ) bmax[0] = p[0]; - if ( p[1] > bmax[1] ) bmax[1] = p[1]; - if ( p[2] > bmax[2] ) bmax[2] = p[2]; - - } - - float dx = bmax[0] - bmin[0]; - float dy = bmax[1] - bmin[1]; - float dz = bmax[2] - bmin[2]; - - - float laxis = dx; - - unsigned int axis = 0; - - if ( dy > dx ) - { - axis = 1; - laxis = dy; - } - - if ( dz > dx && dz > dy ) - { - axis = 2; - laxis = dz; - } - - float p1[3]; - float p2[3]; - float p3[3]; - - p3[0] = p2[0] = p1[0] = bmin[0] + dx*0.5f; - p3[1] = p2[1] = p1[1] = bmin[1] + dy*0.5f; - p3[2] = p2[2] = p1[2] = bmin[2] + dz*0.5f; - - Rect3d b(bmin,bmax); - - Rect3d b1,b2; - - splitRect(axis,b,b1,b2,p1); - - -// callback->ConvexDebugBound(b1.mMin,b1.mMax,0x00FF00); -// callback->ConvexDebugBound(b2.mMin,b2.mMax,0xFFFF00); - - switch ( axis ) - { - case 0: - p2[1] = bmin[1]; - p2[2] = bmin[2]; - - if ( dz > dy ) - { - p3[1] = bmax[1]; - p3[2] = bmin[2]; - } - else - { - p3[1] = bmin[1]; - p3[2] = bmax[2]; - } - - break; - case 1: - p2[0] = bmin[0]; - p2[2] = bmin[2]; - - if ( dx > dz ) - { - p3[0] = bmax[0]; - p3[2] = bmin[2]; - } - else - { - p3[0] = bmin[0]; - p3[2] = bmax[2]; - } - - break; - case 2: - p2[0] = bmin[0]; - p2[1] = bmin[1]; - - if ( dx > dy ) - { - p3[0] = bmax[0]; - p3[1] = bmin[1]; - } - else - { - p3[0] = bmin[0]; - p3[1] = bmax[1]; - } - - break; - } - -// callback->ConvexDebugTri(p1,p2,p3,0xFF0000); - - computePlane(p1,p2,p3,plane); - - return true; - -} - - -} +#include "float_math.h" +#include +#include +#include +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "splitplane.h" +#include "ConvexDecomposition.h" +#include "cd_vector.h" +#include "cd_hull.h" +#include "cd_wavefront.h" +#include "bestfit.h" +#include "planetri.h" +#include "vlookup.h" +#include "meshvolume.h" + +namespace ConvexDecomposition +{ + +static void computePlane(const float *A,const float *B,const float *C,float *plane) +{ + + float vx = (B[0] - C[0]); + float vy = (B[1] - C[1]); + float vz = (B[2] - C[2]); + + float wx = (A[0] - B[0]); + float wy = (A[1] - B[1]); + float wz = (A[2] - B[2]); + + float vw_x = vy * wz - vz * wy; + float vw_y = vz * wx - vx * wz; + float vw_z = vx * wy - vy * wx; + + float mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + if ( mag < 0.000001f ) + { + mag = 0; + } + else + { + mag = 1.0f/mag; + } + + float x = vw_x * mag; + float y = vw_y * mag; + float z = vw_z * mag; + + + float D = 0.0f - ((x*A[0])+(y*A[1])+(z*A[2])); + + plane[0] = x; + plane[1] = y; + plane[2] = z; + plane[3] = D; + +} + +class Rect3d +{ +public: + Rect3d(void) { }; + + Rect3d(const float *bmin,const float *bmax) + { + + mMin[0] = bmin[0]; + mMin[1] = bmin[1]; + mMin[2] = bmin[2]; + + mMax[0] = bmax[0]; + mMax[1] = bmax[1]; + mMax[2] = bmax[2]; + + } + + void SetMin(const float *bmin) + { + mMin[0] = bmin[0]; + mMin[1] = bmin[1]; + mMin[2] = bmin[2]; + } + + void SetMax(const float *bmax) + { + mMax[0] = bmax[0]; + mMax[1] = bmax[1]; + mMax[2] = bmax[2]; + } + + void SetMin(float x,float y,float z) + { + mMin[0] = x; + mMin[1] = y; + mMin[2] = z; + } + + void SetMax(float x,float y,float z) + { + mMax[0] = x; + mMax[1] = y; + mMax[2] = z; + } + + float mMin[3]; + float mMax[3]; +}; + +void splitRect(unsigned int axis, + const Rect3d &source, + Rect3d &b1, + Rect3d &b2, + const float *midpoint) +{ + switch ( axis ) + { + case 0: + b1.SetMin(source.mMin); + b1.SetMax( midpoint[0], source.mMax[1], source.mMax[2] ); + + b2.SetMin( midpoint[0], source.mMin[1], source.mMin[2] ); + b2.SetMax(source.mMax); + + break; + case 1: + b1.SetMin(source.mMin); + b1.SetMax( source.mMax[0], midpoint[1], source.mMax[2] ); + + b2.SetMin( source.mMin[0], midpoint[1], source.mMin[2] ); + b2.SetMax(source.mMax); + + break; + case 2: + b1.SetMin(source.mMin); + b1.SetMax( source.mMax[0], source.mMax[1], midpoint[2] ); + + b2.SetMin( source.mMin[0], source.mMin[1], midpoint[2] ); + b2.SetMax(source.mMax); + + break; + } +} + +bool computeSplitPlane(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float *plane) +{ + float bmin[3] = { 1e9, 1e9, 1e9 }; + float bmax[3] = { -1e9, -1e9, -1e9 }; + + for (unsigned int i=0; i bmax[0] ) bmax[0] = p[0]; + if ( p[1] > bmax[1] ) bmax[1] = p[1]; + if ( p[2] > bmax[2] ) bmax[2] = p[2]; + + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + + float laxis = dx; + + unsigned int axis = 0; + + if ( dy > dx ) + { + axis = 1; + laxis = dy; + } + + if ( dz > dx && dz > dy ) + { + axis = 2; + laxis = dz; + } + + float p1[3]; + float p2[3]; + float p3[3]; + + p3[0] = p2[0] = p1[0] = bmin[0] + dx*0.5f; + p3[1] = p2[1] = p1[1] = bmin[1] + dy*0.5f; + p3[2] = p2[2] = p1[2] = bmin[2] + dz*0.5f; + + Rect3d b(bmin,bmax); + + Rect3d b1,b2; + + splitRect(axis,b,b1,b2,p1); + + +// callback->ConvexDebugBound(b1.mMin,b1.mMax,0x00FF00); +// callback->ConvexDebugBound(b2.mMin,b2.mMax,0xFFFF00); + + switch ( axis ) + { + case 0: + p2[1] = bmin[1]; + p2[2] = bmin[2]; + + if ( dz > dy ) + { + p3[1] = bmax[1]; + p3[2] = bmin[2]; + } + else + { + p3[1] = bmin[1]; + p3[2] = bmax[2]; + } + + break; + case 1: + p2[0] = bmin[0]; + p2[2] = bmin[2]; + + if ( dx > dz ) + { + p3[0] = bmax[0]; + p3[2] = bmin[2]; + } + else + { + p3[0] = bmin[0]; + p3[2] = bmax[2]; + } + + break; + case 2: + p2[0] = bmin[0]; + p2[1] = bmin[1]; + + if ( dx > dy ) + { + p3[0] = bmax[0]; + p3[1] = bmin[1]; + } + else + { + p3[0] = bmin[0]; + p3[1] = bmax[1]; + } + + break; + } + +// callback->ConvexDebugTri(p1,p2,p3,0xFF0000); + + computePlane(p1,p2,p3,plane); + + return true; + +} + + +} diff --git a/Extras/ConvexDecomposition/splitplane.h b/Extras/ConvexDecomposition/splitplane.h index 5260fd561..26fe2e33e 100644 --- a/Extras/ConvexDecomposition/splitplane.h +++ b/Extras/ConvexDecomposition/splitplane.h @@ -1,59 +1,59 @@ -#ifndef SPLIT_PLANE_H - -#define SPLIT_PLANE_H - -//** Computes an 'optimal' split plane for the supplied mesh. -//** needs much improvement since it currently just splits along -//** the longest side of the AABB. -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - - -namespace ConvexDecomposition -{ - -class ConvexDecompInterface; - -bool computeSplitPlane(unsigned int vcount, - const float *vertices, - unsigned int tcount, - const unsigned int *indices, - ConvexDecompInterface *callback, - float *plane); - - -} - -#endif +#ifndef SPLIT_PLANE_H + +#define SPLIT_PLANE_H + +//** Computes an 'optimal' split plane for the supplied mesh. +//** needs much improvement since it currently just splits along +//** the longest side of the AABB. +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +namespace ConvexDecomposition +{ + +class ConvexDecompInterface; + +bool computeSplitPlane(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float *plane); + + +} + +#endif diff --git a/Extras/ConvexDecomposition/vlookup.cpp b/Extras/ConvexDecomposition/vlookup.cpp index e2b8c4233..8ce4e452e 100644 --- a/Extras/ConvexDecomposition/vlookup.cpp +++ b/Extras/ConvexDecomposition/vlookup.cpp @@ -1,307 +1,307 @@ -#include "float_math.h" -#include -#include -#include -#include - -#pragma warning(disable:4786) - -#include -#include -#include - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - -// CodeSnippet provided by John W. Ratcliff -// on March 23, 2006. -// -// mailto: jratcliff@infiniplex.net -// -// Personal website: http://jratcliffscarab.blogspot.com -// Coding Website: http://codesuppository.blogspot.com -// FundRaising Blog: http://amillionpixels.blogspot.com -// Fundraising site: http://www.amillionpixels.us -// New Temple Site: http://newtemple.blogspot.com -// -// This snippet shows how to 'hide' the complexity of -// the STL by wrapping some useful piece of functionality -// around a handful of discrete API calls. -// -// This API allows you to create an indexed triangle list -// from a collection of raw input triangles. Internally -// it uses an STL set to build the lookup table very rapidly. -// -// Here is how you would use it to build an indexed triangle -// list from a raw list of triangles. -// -// (1) create a 'VertexLookup' interface by calling -// -// VertexLook vl = Vl_createVertexLookup(); -// -// (2) For each vertice in each triangle call: -// -// unsigned int i1 = Vl_getIndex(vl,p1); -// unsigned int i2 = Vl_getIndex(vl,p2); -// unsigned int i3 = Vl_getIndex(vl,p3); -// -// save the 3 indices into your triangle list array. -// -// (3) Get the vertex array by calling: -// -// const float *vertices = Vl_getVertices(vl); -// -// (4) Get the number of vertices so you can copy them into -// your own buffer. -// unsigned int vcount = Vl_getVcount(vl); -// -// (5) Release the VertexLookup interface when you are done with it. -// Vl_releaseVertexLookup(vl); -// -// Teaches the following lessons: -// -// How to wrap the complexity of STL and C++ classes around a -// simple API interface. -// -// How to use an STL set and custom comparator operator for -// a complex data type. -// -// How to create a template class. -// -// How to achieve significant performance improvements by -// taking advantage of built in STL containers in just -// a few lines of code. -// -// You could easily modify this code to support other vertex -// formats with any number of interpolants. - - - - -#include "vlookup.h" - -namespace Vlookup -{ - -class VertexPosition -{ -public: - VertexPosition(void) { }; - VertexPosition(const float *p) - { - mPos[0] = p[0]; - mPos[1] = p[1]; - mPos[2] = p[2]; - }; - - void Set(int index,const float *pos) - { - const float * p = &pos[index*3]; - - mPos[0] = p[0]; - mPos[1] = p[1]; - mPos[2] = p[2]; - - }; - - float GetX(void) const { return mPos[0]; }; - float GetY(void) const { return mPos[1]; }; - float GetZ(void) const { return mPos[2]; }; - - float mPos[3]; -}; - - -class VertexLess -{ -public: - typedef std::vector< VertexPosition > VertexVector; - - bool operator()(int v1,int v2) const; - - static void SetSearch(const VertexPosition& match,VertexVector *list) - { - mFind = match; - mList = list; - }; - -private: - const VertexPosition& Get(int index) const - { - if ( index == -1 ) return mFind; - VertexVector &vlist = *mList; - return vlist[index]; - } - static VertexPosition mFind; // vertice to locate. - static VertexVector *mList; -}; - -template class VertexPool -{ -public: - typedef std::set VertexSet; - typedef std::vector< Type > VertexVector; - - int getVertex(const Type& vtx) - { - VertexLess::SetSearch(vtx,&mVtxs); - VertexSet::iterator found; - found = mVertSet.find( -1 ); - if ( found != mVertSet.end() ) - { - return *found; - } - int idx = (int)mVtxs.size(); - mVtxs.push_back( vtx ); - mVertSet.insert( idx ); - return idx; - }; - - - const float * GetPos(int idx) const - { - return mVtxs[idx].mPos; - } - - const Type& Get(int idx) const - { - return mVtxs[idx]; - }; - - unsigned int GetSize(void) const - { - return mVtxs.size(); - }; - - void Clear(int reservesize) // clear the vertice pool. - { - mVertSet.clear(); - mVtxs.clear(); - mVtxs.reserve(reservesize); - }; - - const VertexVector& GetVertexList(void) const { return mVtxs; }; - - void Set(const Type& vtx) - { - mVtxs.push_back(vtx); - } - - unsigned int GetVertexCount(void) const - { - return mVtxs.size(); - }; - - - Type * getBuffer(void) - { - return &mVtxs[0]; - }; - -private: - VertexSet mVertSet; // ordered list. - VertexVector mVtxs; // set of vertices. -}; - - -VertexPosition VertexLess::mFind; -std::vector *VertexLess::mList=0; - -bool VertexLess::operator()(int v1,int v2) const -{ - - const VertexPosition& a = Get(v1); - const VertexPosition& b = Get(v2); - - int ixA = (int) (a.GetX()*10000.0f); - int ixB = (int) (b.GetX()*10000.0f); - - if ( ixA < ixB ) return true; - if ( ixA > ixB ) return false; - - int iyA = (int) (a.GetY()*10000.0f); - int iyB = (int) (b.GetY()*10000.0f); - - if ( iyA < iyB ) return true; - if ( iyA > iyB ) return false; - - int izA = (int) (a.GetZ()*10000.0f); - int izB = (int) (b.GetZ()*10000.0f); - - if ( izA < izB ) return true; - if ( izA > izB ) return false; - - - return false; -} - - - - -} - -using namespace Vlookup; - -VertexLookup Vl_createVertexLookup(void) -{ - VertexLookup ret = new VertexPool< VertexPosition >; - return ret; -} - -void Vl_releaseVertexLookup(VertexLookup vlook) -{ - VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; - delete vp; -} - -unsigned int Vl_getIndex(VertexLookup vlook,const float *pos) // get index. -{ - VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; - VertexPosition p(pos); - return vp->getVertex(p); -} - -const float * Vl_getVertices(VertexLookup vlook) -{ - VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; - return vp->GetPos(0); -} - - -unsigned int Vl_getVcount(VertexLookup vlook) -{ - VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; - return vp->GetVertexCount(); -} +#include "float_math.h" +#include +#include +#include +#include + +#pragma warning(disable:4786) + +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +// CodeSnippet provided by John W. Ratcliff +// on March 23, 2006. +// +// mailto: jratcliff@infiniplex.net +// +// Personal website: http://jratcliffscarab.blogspot.com +// Coding Website: http://codesuppository.blogspot.com +// FundRaising Blog: http://amillionpixels.blogspot.com +// Fundraising site: http://www.amillionpixels.us +// New Temple Site: http://newtemple.blogspot.com +// +// This snippet shows how to 'hide' the complexity of +// the STL by wrapping some useful piece of functionality +// around a handful of discrete API calls. +// +// This API allows you to create an indexed triangle list +// from a collection of raw input triangles. Internally +// it uses an STL set to build the lookup table very rapidly. +// +// Here is how you would use it to build an indexed triangle +// list from a raw list of triangles. +// +// (1) create a 'VertexLookup' interface by calling +// +// VertexLook vl = Vl_createVertexLookup(); +// +// (2) For each vertice in each triangle call: +// +// unsigned int i1 = Vl_getIndex(vl,p1); +// unsigned int i2 = Vl_getIndex(vl,p2); +// unsigned int i3 = Vl_getIndex(vl,p3); +// +// save the 3 indices into your triangle list array. +// +// (3) Get the vertex array by calling: +// +// const float *vertices = Vl_getVertices(vl); +// +// (4) Get the number of vertices so you can copy them into +// your own buffer. +// unsigned int vcount = Vl_getVcount(vl); +// +// (5) Release the VertexLookup interface when you are done with it. +// Vl_releaseVertexLookup(vl); +// +// Teaches the following lessons: +// +// How to wrap the complexity of STL and C++ classes around a +// simple API interface. +// +// How to use an STL set and custom comparator operator for +// a complex data type. +// +// How to create a template class. +// +// How to achieve significant performance improvements by +// taking advantage of built in STL containers in just +// a few lines of code. +// +// You could easily modify this code to support other vertex +// formats with any number of interpolants. + + + + +#include "vlookup.h" + +namespace Vlookup +{ + +class VertexPosition +{ +public: + VertexPosition(void) { }; + VertexPosition(const float *p) + { + mPos[0] = p[0]; + mPos[1] = p[1]; + mPos[2] = p[2]; + }; + + void Set(int index,const float *pos) + { + const float * p = &pos[index*3]; + + mPos[0] = p[0]; + mPos[1] = p[1]; + mPos[2] = p[2]; + + }; + + float GetX(void) const { return mPos[0]; }; + float GetY(void) const { return mPos[1]; }; + float GetZ(void) const { return mPos[2]; }; + + float mPos[3]; +}; + + +class VertexLess +{ +public: + typedef std::vector< VertexPosition > VertexVector; + + bool operator()(int v1,int v2) const; + + static void SetSearch(const VertexPosition& match,VertexVector *list) + { + mFind = match; + mList = list; + }; + +private: + const VertexPosition& Get(int index) const + { + if ( index == -1 ) return mFind; + VertexVector &vlist = *mList; + return vlist[index]; + } + static VertexPosition mFind; // vertice to locate. + static VertexVector *mList; +}; + +template class VertexPool +{ +public: + typedef std::set VertexSet; + typedef std::vector< Type > VertexVector; + + int getVertex(const Type& vtx) + { + VertexLess::SetSearch(vtx,&mVtxs); + VertexSet::iterator found; + found = mVertSet.find( -1 ); + if ( found != mVertSet.end() ) + { + return *found; + } + int idx = (int)mVtxs.size(); + mVtxs.push_back( vtx ); + mVertSet.insert( idx ); + return idx; + }; + + + const float * GetPos(int idx) const + { + return mVtxs[idx].mPos; + } + + const Type& Get(int idx) const + { + return mVtxs[idx]; + }; + + unsigned int GetSize(void) const + { + return mVtxs.size(); + }; + + void Clear(int reservesize) // clear the vertice pool. + { + mVertSet.clear(); + mVtxs.clear(); + mVtxs.reserve(reservesize); + }; + + const VertexVector& GetVertexList(void) const { return mVtxs; }; + + void Set(const Type& vtx) + { + mVtxs.push_back(vtx); + } + + unsigned int GetVertexCount(void) const + { + return mVtxs.size(); + }; + + + Type * getBuffer(void) + { + return &mVtxs[0]; + }; + +private: + VertexSet mVertSet; // ordered list. + VertexVector mVtxs; // set of vertices. +}; + + +VertexPosition VertexLess::mFind; +std::vector *VertexLess::mList=0; + +bool VertexLess::operator()(int v1,int v2) const +{ + + const VertexPosition& a = Get(v1); + const VertexPosition& b = Get(v2); + + int ixA = (int) (a.GetX()*10000.0f); + int ixB = (int) (b.GetX()*10000.0f); + + if ( ixA < ixB ) return true; + if ( ixA > ixB ) return false; + + int iyA = (int) (a.GetY()*10000.0f); + int iyB = (int) (b.GetY()*10000.0f); + + if ( iyA < iyB ) return true; + if ( iyA > iyB ) return false; + + int izA = (int) (a.GetZ()*10000.0f); + int izB = (int) (b.GetZ()*10000.0f); + + if ( izA < izB ) return true; + if ( izA > izB ) return false; + + + return false; +} + + + + +} + +using namespace Vlookup; + +VertexLookup Vl_createVertexLookup(void) +{ + VertexLookup ret = new VertexPool< VertexPosition >; + return ret; +} + +void Vl_releaseVertexLookup(VertexLookup vlook) +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + delete vp; +} + +unsigned int Vl_getIndex(VertexLookup vlook,const float *pos) // get index. +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + VertexPosition p(pos); + return vp->getVertex(p); +} + +const float * Vl_getVertices(VertexLookup vlook) +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + return vp->GetPos(0); +} + + +unsigned int Vl_getVcount(VertexLookup vlook) +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + return vp->GetVertexCount(); +} diff --git a/Extras/ConvexDecomposition/vlookup.h b/Extras/ConvexDecomposition/vlookup.h index 8e1286078..1a6e0a9e2 100644 --- a/Extras/ConvexDecomposition/vlookup.h +++ b/Extras/ConvexDecomposition/vlookup.h @@ -1,119 +1,119 @@ -#ifndef VLOOKUP_H - -#define VLOOKUP_H - - -/*---------------------------------------------------------------------- - Copyright (c) 2004 Open Dynamics Framework Group - www.physicstools.org - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided - that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - Neither the name of the Open Dynamics Framework Group nor the names of its contributors may - be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------*/ - -// http://codesuppository.blogspot.com -// -// mailto: jratcliff@infiniplex.net -// -// http://www.amillionpixels.us -// - - -// CodeSnippet provided by John W. Ratcliff -// on March 23, 2006. -// -// mailto: jratcliff@infiniplex.net -// -// Personal website: http://jratcliffscarab.blogspot.com -// Coding Website: http://codesuppository.blogspot.com -// FundRaising Blog: http://amillionpixels.blogspot.com -// Fundraising site: http://www.amillionpixels.us -// New Temple Site: http://newtemple.blogspot.com -// -// This snippet shows how to 'hide' the complexity of -// the STL by wrapping some useful piece of functionality -// around a handful of discrete API calls. -// -// This API allows you to create an indexed triangle list -// from a collection of raw input triangles. Internally -// it uses an STL set to build the lookup table very rapidly. -// -// Here is how you would use it to build an indexed triangle -// list from a raw list of triangles. -// -// (1) create a 'VertexLookup' interface by calling -// -// VertexLook vl = Vl_createVertexLookup(); -// -// (2) For each vertice in each triangle call: -// -// unsigned int i1 = Vl_getIndex(vl,p1); -// unsigned int i2 = Vl_getIndex(vl,p2); -// unsigned int i3 = Vl_getIndex(vl,p3); -// -// save the 3 indices into your triangle list array. -// -// (3) Get the vertex array by calling: -// -// const float *vertices = Vl_getVertices(vl); -// -// (4) Get the number of vertices so you can copy them into -// your own buffer. -// unsigned int vcount = Vl_getVcount(vl); -// -// (5) Release the VertexLookup interface when you are done with it. -// Vl_releaseVertexLookup(vl); -// -// Teaches the following lessons: -// -// How to wrap the complexity of STL and C++ classes around a -// simple API interface. -// -// How to use an STL set and custom comparator operator for -// a complex data type. -// -// How to create a template class. -// -// How to achieve significant performance improvements by -// taking advantage of built in STL containers in just -// a few lines of code. -// -// You could easily modify this code to support other vertex -// formats with any number of interpolants. -// -// Hide C++ classes from the rest of your application by -// keeping them in the CPP and wrapping them in a namespace -// Uses an STL set to create an index table for a bunch of vertex positions -// used typically to re-index a collection of raw triangle data. - - -typedef void * VertexLookup; - -VertexLookup Vl_createVertexLookup(void); -void Vl_releaseVertexLookup(VertexLookup vlook); - -unsigned int Vl_getIndex(VertexLookup vlook,const float *pos); // get index. -const float * Vl_getVertices(VertexLookup vlook); -unsigned int Vl_getVcount(VertexLookup vlook); - - -#endif +#ifndef VLOOKUP_H + +#define VLOOKUP_H + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +// CodeSnippet provided by John W. Ratcliff +// on March 23, 2006. +// +// mailto: jratcliff@infiniplex.net +// +// Personal website: http://jratcliffscarab.blogspot.com +// Coding Website: http://codesuppository.blogspot.com +// FundRaising Blog: http://amillionpixels.blogspot.com +// Fundraising site: http://www.amillionpixels.us +// New Temple Site: http://newtemple.blogspot.com +// +// This snippet shows how to 'hide' the complexity of +// the STL by wrapping some useful piece of functionality +// around a handful of discrete API calls. +// +// This API allows you to create an indexed triangle list +// from a collection of raw input triangles. Internally +// it uses an STL set to build the lookup table very rapidly. +// +// Here is how you would use it to build an indexed triangle +// list from a raw list of triangles. +// +// (1) create a 'VertexLookup' interface by calling +// +// VertexLook vl = Vl_createVertexLookup(); +// +// (2) For each vertice in each triangle call: +// +// unsigned int i1 = Vl_getIndex(vl,p1); +// unsigned int i2 = Vl_getIndex(vl,p2); +// unsigned int i3 = Vl_getIndex(vl,p3); +// +// save the 3 indices into your triangle list array. +// +// (3) Get the vertex array by calling: +// +// const float *vertices = Vl_getVertices(vl); +// +// (4) Get the number of vertices so you can copy them into +// your own buffer. +// unsigned int vcount = Vl_getVcount(vl); +// +// (5) Release the VertexLookup interface when you are done with it. +// Vl_releaseVertexLookup(vl); +// +// Teaches the following lessons: +// +// How to wrap the complexity of STL and C++ classes around a +// simple API interface. +// +// How to use an STL set and custom comparator operator for +// a complex data type. +// +// How to create a template class. +// +// How to achieve significant performance improvements by +// taking advantage of built in STL containers in just +// a few lines of code. +// +// You could easily modify this code to support other vertex +// formats with any number of interpolants. +// +// Hide C++ classes from the rest of your application by +// keeping them in the CPP and wrapping them in a namespace +// Uses an STL set to create an index table for a bunch of vertex positions +// used typically to re-index a collection of raw triangle data. + + +typedef void * VertexLookup; + +VertexLookup Vl_createVertexLookup(void); +void Vl_releaseVertexLookup(VertexLookup vlook); + +unsigned int Vl_getIndex(VertexLookup vlook,const float *pos); // get index. +const float * Vl_getVertices(VertexLookup vlook); +unsigned int Vl_getVcount(VertexLookup vlook); + + +#endif diff --git a/Extras/MayaPlugin/BulletMayaPlugin.sln b/Extras/MayaPlugin/BulletMayaPlugin.sln index 4ac9ee3cb..0814b7ada 100644 --- a/Extras/MayaPlugin/BulletMayaPlugin.sln +++ b/Extras/MayaPlugin/BulletMayaPlugin.sln @@ -1,80 +1,80 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletMayaPlugin", "BulletMayaPlugin.vcproj", "{681412B0-F197-4A2F-9263-DEA2E8690146}" - ProjectSection(WebsiteProperties) = preProject - Debug.AspNetCompiler.Debug = "True" - Release.AspNetCompiler.Debug = "False" - EndProjectSection - ProjectSection(ProjectDependencies) = postProject - {A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF} - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142} - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" - ProjectSection(WebsiteProperties) = preProject - Debug.AspNetCompiler.Debug = "True" - Release.AspNetCompiler.Debug = "False" - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletdynamics", "..\..\msvc\8\libbulletdynamics.vcproj", "{61BD1097-CF2E-B296-DAA9-73A6FE135319}" - ProjectSection(WebsiteProperties) = preProject - Debug.AspNetCompiler.Debug = "True" - Release.AspNetCompiler.Debug = "False" - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" - ProjectSection(WebsiteProperties) = preProject - Debug.AspNetCompiler.Debug = "True" - Release.AspNetCompiler.Debug = "False" - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libGIMPACTUtils", "..\..\msvc\8\libGIMPACTUtils.vcproj", "{B1B5F775-54A9-2437-E4AC-7E817E492142}" - ProjectSection(WebsiteProperties) = preProject - Debug.AspNetCompiler.Debug = "True" - Release.AspNetCompiler.Debug = "False" - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "..\..\msvc\8\liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}" - ProjectSection(WebsiteProperties) = preProject - Debug.AspNetCompiler.Debug = "True" - Release.AspNetCompiler.Debug = "False" - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - DebugDll|Win32 = DebugDll|Win32 - ReleaseDll|Win32 = ReleaseDll|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {681412B0-F197-4A2F-9263-DEA2E8690146}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 - {681412B0-F197-4A2F-9263-DEA2E8690146}.DebugDll|Win32.Build.0 = DebugDll|Win32 - {681412B0-F197-4A2F-9263-DEA2E8690146}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 - {681412B0-F197-4A2F-9263-DEA2E8690146}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletMayaPlugin", "BulletMayaPlugin.vcproj", "{681412B0-F197-4A2F-9263-DEA2E8690146}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection + ProjectSection(ProjectDependencies) = postProject + {A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142} + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletdynamics", "..\..\msvc\8\libbulletdynamics.vcproj", "{61BD1097-CF2E-B296-DAA9-73A6FE135319}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libGIMPACTUtils", "..\..\msvc\8\libGIMPACTUtils.vcproj", "{B1B5F775-54A9-2437-E4AC-7E817E492142}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "..\..\msvc\8\liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DebugDll|Win32 = DebugDll|Win32 + ReleaseDll|Win32 = ReleaseDll|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {681412B0-F197-4A2F-9263-DEA2E8690146}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {681412B0-F197-4A2F-9263-DEA2E8690146}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {681412B0-F197-4A2F-9263-DEA2E8690146}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {681412B0-F197-4A2F-9263-DEA2E8690146}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.Build.0 = ReleaseDll|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}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Extras/MayaPlugin/BulletMayaPlugin.vcproj b/Extras/MayaPlugin/BulletMayaPlugin.vcproj index d8d9e7ca3..1a5b7e7e6 100644 --- a/Extras/MayaPlugin/BulletMayaPlugin.vcproj +++ b/Extras/MayaPlugin/BulletMayaPlugin.vcproj @@ -1,1083 +1,1083 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/MayaPlugin/CMakeLists.txt b/Extras/MayaPlugin/CMakeLists.txt index ceb715389..0d6ce765a 100644 --- a/Extras/MayaPlugin/CMakeLists.txt +++ b/Extras/MayaPlugin/CMakeLists.txt @@ -1,96 +1,96 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.4) - -#PROJECT(MayaPlugin) -if(COMMAND cmake_policy) - cmake_policy(SET CMP0003 NEW) -endif(COMMAND cmake_policy) - - -IF ( UNIX AND NOT APPLE ) - ADD_DEFINITIONS(-DLINUX) -ENDIF() - -SET(CMAKE_CXX_WARNING_LEVEL 4) - -#SET (CMAKE_VERBOSE_MAKEFILE TRUE) -FIND_PATH(MAYA_BASE_DIR include/maya/MFn.h PATH - /usr/autodesk/maya2009-x64 - /usr/autodesk/maya2008-x64 - /usr/autodesk/maya - "C:/Program Files/Autodesk/Maya2008" - "C:/Program Files/Autodesk/Maya2009" - "C:/Program Files/Autodesk/Maya8.5" - "C:/Program Files (x86)/Autodesk/Maya2010" - ) - -IF (MAYA_BASE_DIR) - message ("Maya found at location " ${MAYA_BASE_DIR}) - - SET(MAYA_INC_DIR ${MAYA_BASE_DIR}/include) - SET(MAYA_LIB_DIR ${MAYA_BASE_DIR}/lib) - - INCLUDE_DIRECTORIES(${MAYA_INC_DIR} ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/MayaPlugin ) - LINK_DIRECTORIES(${MAYA_LIB_DIR}) - - ADD_DEFINITIONS(-D_BOOL) - ADD_DEFINITIONS(-DREQUIRE_IOSTREAM) - - SET(TARGET_H - box_shape.h bt_sphere_shape.h dSolverNode.h rigid_body_impl.h - box_shape_impl.h collision_shape.h mathUtils.h rigidBodyNode.h - bt_box_shape.h collision_shape_impl.h mayaUtils.h solver.h - bt_collision_shape.h collisionShapeNode.h mesh_shape.h solver_impl.h - bt_convex_hull_shape.h convex_hull_shape.h mesh_shape_impl.h sphere_shape.h - bt_mesh_shape.h convex_hull_shape_impl.h plane_shape.h sphere_shape_impl.h - bt_plane_shape.h dRigidBodyArrayCmd.h plane_shape_impl.h - bt_rigid_body.h dRigidBodyCmd.h rigidBodyArrayNode.h - bt_solver.h dSolverCmd.h rigid_body.h pdbIO.h - shared_ptr.h drawUtils.h - ) - - SET(TARGET_SRC - pluginMain.cpp bulletExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp - solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp - pdbIO.cpp drawUtils.cpp constraint/dHingeConstraintCmd.cpp constraint/dSliderConstraintCmd.cpp - constraint/hingeConstraintNode.cpp constraint/sixdofConstraintNode.cpp constraint/dNailConstraintCmd.cpp - constraint/dsixdofConstraintCmd.cpp constraint/nailConstraintNode.cpp constraint/sliderConstraintNode.cpp - ) - - ADD_LIBRARY(BulletMayaPlugin SHARED ${TARGET_H} ${TARGET_SRC}) - - - - IF (WIN32) - SET(MAYA_LIBS OpenMaya Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) - IF (CMAKE_CL_64) - SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X64") - ELSE (CMAKE_CL_64) - SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X86") - ENDIF (CMAKE_CL_64) - SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES SUFFIX ".mll") - - LINK_DIRECTORIES(${MAYA_LIB_DIR}) - TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) - SET(CMAKE_SHARED_LINKER_FLAGS "/export:initializePlugin /export:uninitializePlugin") - ELSE (WIN32) - SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) - LINK_DIRECTORIES(${MAYA_LIB_DIR}) - TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) - ENDIF(WIN32) - - #OPTION(BUILD_STANDALONE "Build a standalone exporter program") - # - #IF (BUILD_STANDALONE) - # IF (WIN32) - # - # ELSE (WIN32) - # SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim) - # ADD_EXECUTABLE(me ${TARGET_H} ${TARGET_SRC} standalone.cpp) - # LINK_DIRECTORIES(${MAYA_LIB_DIR}) - # TARGET_LINK_LIBRARIES(me ${MAYA_LIBS} pthread m imf) - # ENDIF (WIN32) - #ENDIF (BUILD_STANDALONE) - -ELSE() - MESSAGE("Maya not found, try adding your Maya path in Bullet/Extras/MayaPlugin/CMakeListst.txt under FIND_PATH(MAYA_BASE_DIR ...") +CMAKE_MINIMUM_REQUIRED(VERSION 2.4) + +#PROJECT(MayaPlugin) +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + + +IF ( UNIX AND NOT APPLE ) + ADD_DEFINITIONS(-DLINUX) +ENDIF() + +SET(CMAKE_CXX_WARNING_LEVEL 4) + +#SET (CMAKE_VERBOSE_MAKEFILE TRUE) +FIND_PATH(MAYA_BASE_DIR include/maya/MFn.h PATH + /usr/autodesk/maya2009-x64 + /usr/autodesk/maya2008-x64 + /usr/autodesk/maya + "C:/Program Files/Autodesk/Maya2008" + "C:/Program Files/Autodesk/Maya2009" + "C:/Program Files/Autodesk/Maya8.5" + "C:/Program Files (x86)/Autodesk/Maya2010" + ) + +IF (MAYA_BASE_DIR) + message ("Maya found at location " ${MAYA_BASE_DIR}) + + SET(MAYA_INC_DIR ${MAYA_BASE_DIR}/include) + SET(MAYA_LIB_DIR ${MAYA_BASE_DIR}/lib) + + INCLUDE_DIRECTORIES(${MAYA_INC_DIR} ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/MayaPlugin ) + LINK_DIRECTORIES(${MAYA_LIB_DIR}) + + ADD_DEFINITIONS(-D_BOOL) + ADD_DEFINITIONS(-DREQUIRE_IOSTREAM) + + SET(TARGET_H + box_shape.h bt_sphere_shape.h dSolverNode.h rigid_body_impl.h + box_shape_impl.h collision_shape.h mathUtils.h rigidBodyNode.h + bt_box_shape.h collision_shape_impl.h mayaUtils.h solver.h + bt_collision_shape.h collisionShapeNode.h mesh_shape.h solver_impl.h + bt_convex_hull_shape.h convex_hull_shape.h mesh_shape_impl.h sphere_shape.h + bt_mesh_shape.h convex_hull_shape_impl.h plane_shape.h sphere_shape_impl.h + bt_plane_shape.h dRigidBodyArrayCmd.h plane_shape_impl.h + bt_rigid_body.h dRigidBodyCmd.h rigidBodyArrayNode.h + bt_solver.h dSolverCmd.h rigid_body.h pdbIO.h + shared_ptr.h drawUtils.h + ) + + SET(TARGET_SRC + pluginMain.cpp bulletExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp + solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp + pdbIO.cpp drawUtils.cpp constraint/dHingeConstraintCmd.cpp constraint/dSliderConstraintCmd.cpp + constraint/hingeConstraintNode.cpp constraint/sixdofConstraintNode.cpp constraint/dNailConstraintCmd.cpp + constraint/dsixdofConstraintCmd.cpp constraint/nailConstraintNode.cpp constraint/sliderConstraintNode.cpp + ) + + ADD_LIBRARY(BulletMayaPlugin SHARED ${TARGET_H} ${TARGET_SRC}) + + + + IF (WIN32) + SET(MAYA_LIBS OpenMaya Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) + IF (CMAKE_CL_64) + SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X64") + ELSE (CMAKE_CL_64) + SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X86") + ENDIF (CMAKE_CL_64) + SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES SUFFIX ".mll") + + LINK_DIRECTORIES(${MAYA_LIB_DIR}) + TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + SET(CMAKE_SHARED_LINKER_FLAGS "/export:initializePlugin /export:uninitializePlugin") + ELSE (WIN32) + SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) + LINK_DIRECTORIES(${MAYA_LIB_DIR}) + TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + ENDIF(WIN32) + + #OPTION(BUILD_STANDALONE "Build a standalone exporter program") + # + #IF (BUILD_STANDALONE) + # IF (WIN32) + # + # ELSE (WIN32) + # SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim) + # ADD_EXECUTABLE(me ${TARGET_H} ${TARGET_SRC} standalone.cpp) + # LINK_DIRECTORIES(${MAYA_LIB_DIR}) + # TARGET_LINK_LIBRARIES(me ${MAYA_LIBS} pthread m imf) + # ENDIF (WIN32) + #ENDIF (BUILD_STANDALONE) + +ELSE() + MESSAGE("Maya not found, try adding your Maya path in Bullet/Extras/MayaPlugin/CMakeListst.txt under FIND_PATH(MAYA_BASE_DIR ...") ENDIF() \ No newline at end of file diff --git a/Extras/MayaPlugin/bullet.nsi b/Extras/MayaPlugin/bullet.nsi index 2a77b5c89..2edede7da 100644 --- a/Extras/MayaPlugin/bullet.nsi +++ b/Extras/MayaPlugin/bullet.nsi @@ -1,81 +1,81 @@ -; example1.nsi -; -; This script is perhaps one of the simplest NSIs you can make. All of the -; optional settings are left to their default settings. The installer simply -; prompts the user asking them where to install, and drops a copy of "MyProg.exe" -; there. - -;-------------------------------- - -; The name of the installer -Name "Dynamica Bullet 2.76 physics plugin for Maya 2009" - -; The file to write -OutFile "DynamicaForMaya2009_64bit.exe" - - -; The default installation directory -InstallDir $PROGRAMFILES\DynamicaBullet2.76\ - -UninstPage uninstConfirm -UninstPage instfiles - -; The text to prompt the user to enter a directory -DirText "This will install Dynamica Bullet For Maya. Choose destination directory" - -;-------------------------------- - -; The stuff to install -Section "" ;No components page, name is not important -;Create Dynamica directories -;CreateDirectory "$INSTDIR\dll" -CreateDirectory "$INSTDIR\doc" -CreateDirectory "$INSTDIR\scenes\" -CreateDirectory "$INSTDIR\icons" -CreateDirectory "$INSTDIR\plug-ins" -CreateDirectory "$INSTDIR\scripts" - -;SetOutPath "$INSTDIR\dll" -;File "dll\*.dll" -SetOutPath "$INSTDIR\doc" -File "doc\*.*" -SetOutPath "$INSTDIR\scenes" -File "scenes\*.*" -SetOutPath "$INSTDIR\icons" -File "icons\*.*" -SetOutPath "$INSTDIR\plug-ins" -File "BulletMayaPlugin.mll" -;File "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcp80.dll" -;File "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcr80.dll" - -File "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\msvcp90.dll" -File "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\msvcr90.dll" - -SetOutPath "$INSTDIR\scripts" -File "scripts\*.*" -SetOutPath "$DOCUMENTS\maya\modules\" -File "BulletDynamica.6_module" - -FileOpen $0 $DOCUMENTS\maya\modules\BulletDynamica.6_module a -FileSeek $0 0 END -FileWrite $0 "$INSTDIR$\n" -FileClose $0 - -CreateDirectory "$SMPROGRAMS\Dynamica Bullet" -CreateShortCut "$SMPROGRAMS\Dynamica Bullet\Documentation.lnk" "$INSTDIR\doc\index.html" -CreateShortCut "$SMPROGRAMS\Dynamica Bullet\Examples.lnk" "$INSTDIR\scenes\" -CreateShortCut "$SMPROGRAMS\Dynamica Bullet\Uninstall.lnk" "$INSTDIR\Uninstall.exe" -ExecShell "open" "$INSTDIR\doc\index.html" - -WriteUninstaller $INSTDIR\Uninstall.exe -SectionEnd ; end the section - -Section "Uninstall" - ClearErrors - MessageBox MB_YESNO "Uninstall Bullet for MAYA?" IDNO end - - Delete "$DOCUMENTS\maya\modules\DynamicaBullet.6_module" - RMDir /r "$SMPROGRAMS\Dynamica Bullet\" - RMDir /r "$INSTDIR" - end: +; example1.nsi +; +; This script is perhaps one of the simplest NSIs you can make. All of the +; optional settings are left to their default settings. The installer simply +; prompts the user asking them where to install, and drops a copy of "MyProg.exe" +; there. + +;-------------------------------- + +; The name of the installer +Name "Dynamica Bullet 2.76 physics plugin for Maya 2009" + +; The file to write +OutFile "DynamicaForMaya2009_64bit.exe" + + +; The default installation directory +InstallDir $PROGRAMFILES\DynamicaBullet2.76\ + +UninstPage uninstConfirm +UninstPage instfiles + +; The text to prompt the user to enter a directory +DirText "This will install Dynamica Bullet For Maya. Choose destination directory" + +;-------------------------------- + +; The stuff to install +Section "" ;No components page, name is not important +;Create Dynamica directories +;CreateDirectory "$INSTDIR\dll" +CreateDirectory "$INSTDIR\doc" +CreateDirectory "$INSTDIR\scenes\" +CreateDirectory "$INSTDIR\icons" +CreateDirectory "$INSTDIR\plug-ins" +CreateDirectory "$INSTDIR\scripts" + +;SetOutPath "$INSTDIR\dll" +;File "dll\*.dll" +SetOutPath "$INSTDIR\doc" +File "doc\*.*" +SetOutPath "$INSTDIR\scenes" +File "scenes\*.*" +SetOutPath "$INSTDIR\icons" +File "icons\*.*" +SetOutPath "$INSTDIR\plug-ins" +File "BulletMayaPlugin.mll" +;File "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcp80.dll" +;File "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcr80.dll" + +File "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\msvcp90.dll" +File "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\msvcr90.dll" + +SetOutPath "$INSTDIR\scripts" +File "scripts\*.*" +SetOutPath "$DOCUMENTS\maya\modules\" +File "BulletDynamica.6_module" + +FileOpen $0 $DOCUMENTS\maya\modules\BulletDynamica.6_module a +FileSeek $0 0 END +FileWrite $0 "$INSTDIR$\n" +FileClose $0 + +CreateDirectory "$SMPROGRAMS\Dynamica Bullet" +CreateShortCut "$SMPROGRAMS\Dynamica Bullet\Documentation.lnk" "$INSTDIR\doc\index.html" +CreateShortCut "$SMPROGRAMS\Dynamica Bullet\Examples.lnk" "$INSTDIR\scenes\" +CreateShortCut "$SMPROGRAMS\Dynamica Bullet\Uninstall.lnk" "$INSTDIR\Uninstall.exe" +ExecShell "open" "$INSTDIR\doc\index.html" + +WriteUninstaller $INSTDIR\Uninstall.exe +SectionEnd ; end the section + +Section "Uninstall" + ClearErrors + MessageBox MB_YESNO "Uninstall Bullet for MAYA?" IDNO end + + Delete "$DOCUMENTS\maya\modules\DynamicaBullet.6_module" + RMDir /r "$SMPROGRAMS\Dynamica Bullet\" + RMDir /r "$INSTDIR" + end: SectionEnd \ No newline at end of file diff --git a/Extras/MayaPlugin/bulletExport.cpp b/Extras/MayaPlugin/bulletExport.cpp index d9f509eb3..128c1eda1 100644 --- a/Extras/MayaPlugin/bulletExport.cpp +++ b/Extras/MayaPlugin/bulletExport.cpp @@ -1,160 +1,160 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Modified by Roman Ponomarev -01/27/2010 : Replaced COLLADA export with Bullet binary export -*/ - -#include "bulletExport.h" -#include "solver.h" -#include "solver_impl.h" - -#if defined (_WIN32) -#define strcasecmp stricmp -#elif defined (OSMac_) -extern "C" int strcasecmp (const char *, const char *); - -#endif - -#define NO_SMOOTHING_GROUP -1 -#define INITIALIZE_SMOOTHING -2 -#define INVALID_ID -1 - -////////////////////////////////////////////////////////////// - -MString ObjTranslator::fExtension = "bullet"; - -////////////////////////////////////////////////////////////// - -void* ObjTranslator::creator() -{ - return new ObjTranslator(); -} - -////////////////////////////////////////////////////////////// - -MStatus ObjTranslator::reader ( const MFileObject& file, - const MString& options, - FileAccessMode mode) -{ - fprintf(stderr, "Bullet Physics import is not available yet\n"); - return MS::kFailure; -} - - - -MStatus ObjTranslator::writer ( const MFileObject& file, - const MString& options, - FileAccessMode mode ) - -{ - MStatus status; - - MString mname = file.fullName(), unitName; - -//just pass in the filename - -#if defined (OSMac_) - char fname[256];//MAXPATHLEN]; - strcpy (fname, file.fullName().asChar()); -// fp = fopen(fname,"wb");//MAYAMACTODO -#else - const char *fname = mname.asChar(); - // fp = fopen(fname,"w"); -#endif - -shared_ptr solv = solver_t::get_solver(); - -solv->export_bullet_file(fname); - -return status; - -} -////////////////////////////////////////////////////////////// - -bool ObjTranslator::haveReadMethod () const -{ - return true; -} -////////////////////////////////////////////////////////////// - -bool ObjTranslator::haveWriteMethod () const -{ - return true; -} -////////////////////////////////////////////////////////////// - -MString ObjTranslator::defaultExtension () const -{ -// return MString("bullet"); - return fExtension; -} - -MString ObjTranslator::filter() const -{ - //return "*.bullet;*.dae"; - return "*.bullet"; -} - -////////////////////////////////////////////////////////////// - -MPxFileTranslator::MFileKind ObjTranslator::identifyFile ( - const MFileObject& fileName, - const char* buffer, - short size) const -{ - const char * name = fileName.name().asChar(); - int nameLength = strlen(name); - - if ((nameLength > 7) && !strcasecmp(name+nameLength-7, ".bullet")) - return kCouldBeMyFileType; - else - return kNotMyFileType; -} -////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////// -MStatus ObjTranslator::exportSelected( ) -{ - MStatus status; - MString filename; - - - // Create an iterator for the active selection list - // - MSelectionList slist; - MGlobal::getActiveSelectionList( slist ); - MItSelectionList iter( slist ); - - if (iter.isDone()) { - fprintf(stderr,"Error: Nothing is selected.\n"); - return MS::kFailure; - } - - - return status; -} - -////////////////////////////////////////////////////////////// - -MStatus ObjTranslator::exportAll( ) -{ - MStatus status = MS::kSuccess; - - return status; -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Modified by Roman Ponomarev +01/27/2010 : Replaced COLLADA export with Bullet binary export +*/ + +#include "bulletExport.h" +#include "solver.h" +#include "solver_impl.h" + +#if defined (_WIN32) +#define strcasecmp stricmp +#elif defined (OSMac_) +extern "C" int strcasecmp (const char *, const char *); + +#endif + +#define NO_SMOOTHING_GROUP -1 +#define INITIALIZE_SMOOTHING -2 +#define INVALID_ID -1 + +////////////////////////////////////////////////////////////// + +MString ObjTranslator::fExtension = "bullet"; + +////////////////////////////////////////////////////////////// + +void* ObjTranslator::creator() +{ + return new ObjTranslator(); +} + +////////////////////////////////////////////////////////////// + +MStatus ObjTranslator::reader ( const MFileObject& file, + const MString& options, + FileAccessMode mode) +{ + fprintf(stderr, "Bullet Physics import is not available yet\n"); + return MS::kFailure; +} + + + +MStatus ObjTranslator::writer ( const MFileObject& file, + const MString& options, + FileAccessMode mode ) + +{ + MStatus status; + + MString mname = file.fullName(), unitName; + +//just pass in the filename + +#if defined (OSMac_) + char fname[256];//MAXPATHLEN]; + strcpy (fname, file.fullName().asChar()); +// fp = fopen(fname,"wb");//MAYAMACTODO +#else + const char *fname = mname.asChar(); + // fp = fopen(fname,"w"); +#endif + +shared_ptr solv = solver_t::get_solver(); + +solv->export_bullet_file(fname); + +return status; + +} +////////////////////////////////////////////////////////////// + +bool ObjTranslator::haveReadMethod () const +{ + return true; +} +////////////////////////////////////////////////////////////// + +bool ObjTranslator::haveWriteMethod () const +{ + return true; +} +////////////////////////////////////////////////////////////// + +MString ObjTranslator::defaultExtension () const +{ +// return MString("bullet"); + return fExtension; +} + +MString ObjTranslator::filter() const +{ + //return "*.bullet;*.dae"; + return "*.bullet"; +} + +////////////////////////////////////////////////////////////// + +MPxFileTranslator::MFileKind ObjTranslator::identifyFile ( + const MFileObject& fileName, + const char* buffer, + short size) const +{ + const char * name = fileName.name().asChar(); + int nameLength = strlen(name); + + if ((nameLength > 7) && !strcasecmp(name+nameLength-7, ".bullet")) + return kCouldBeMyFileType; + else + return kNotMyFileType; +} +////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////// +MStatus ObjTranslator::exportSelected( ) +{ + MStatus status; + MString filename; + + + // Create an iterator for the active selection list + // + MSelectionList slist; + MGlobal::getActiveSelectionList( slist ); + MItSelectionList iter( slist ); + + if (iter.isDone()) { + fprintf(stderr,"Error: Nothing is selected.\n"); + return MS::kFailure; + } + + + return status; +} + +////////////////////////////////////////////////////////////// + +MStatus ObjTranslator::exportAll( ) +{ + MStatus status = MS::kSuccess; + + return status; +} diff --git a/Extras/MayaPlugin/bulletExport.h b/Extras/MayaPlugin/bulletExport.h index e5b8cbc0c..4d02f1053 100644 --- a/Extras/MayaPlugin/bulletExport.h +++ b/Extras/MayaPlugin/bulletExport.h @@ -1,97 +1,97 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Modified by Roman Ponomarev -01/27/2010 : Replaced COLLADA export with Bullet binary export -*/ - - -#ifndef BULLET_EXPORT_H -#define BULLET_EXPORT_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -////////////////////////////////////////////////////////////// -class ObjTranslator : public MPxFileTranslator { -public: - ObjTranslator () {}; - virtual ~ObjTranslator () {}; - static void* creator(); - - MStatus reader ( const MFileObject& file, - const MString& optionsString, - FileAccessMode mode); - - MStatus writer ( const MFileObject& file, - const MString& optionsString, - FileAccessMode mode ); - bool haveReadMethod () const; - bool haveWriteMethod () const; - MString defaultExtension () const; - - MString filter() const; - - MFileKind identifyFile ( const MFileObject& fileName, - const char* buffer, - short size) const; -protected: - static MString fExtension; - -private: - MStatus exportSelected(); - MStatus exportAll(); - -private: - -}; - - -#endif //BULLET_EXPORT_H - +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Modified by Roman Ponomarev +01/27/2010 : Replaced COLLADA export with Bullet binary export +*/ + + +#ifndef BULLET_EXPORT_H +#define BULLET_EXPORT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include + + +////////////////////////////////////////////////////////////// +class ObjTranslator : public MPxFileTranslator { +public: + ObjTranslator () {}; + virtual ~ObjTranslator () {}; + static void* creator(); + + MStatus reader ( const MFileObject& file, + const MString& optionsString, + FileAccessMode mode); + + MStatus writer ( const MFileObject& file, + const MString& optionsString, + FileAccessMode mode ); + bool haveReadMethod () const; + bool haveWriteMethod () const; + MString defaultExtension () const; + + MString filter() const; + + MFileKind identifyFile ( const MFileObject& fileName, + const char* buffer, + short size) const; +protected: + static MString fExtension; + +private: + MStatus exportSelected(); + MStatus exportAll(); + +private: + +}; + + +#endif //BULLET_EXPORT_H + diff --git a/Extras/MayaPlugin/constraint/dHingeConstraintCmd.cpp b/Extras/MayaPlugin/constraint/dHingeConstraintCmd.cpp index 5883f2952..fd5579517 100644 --- a/Extras/MayaPlugin/constraint/dHingeConstraintCmd.cpp +++ b/Extras/MayaPlugin/constraint/dHingeConstraintCmd.cpp @@ -1,133 +1,133 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law -*/ - -//dHingeConstraintCmd.cpp - -#include -#include -#include - -#include "hingeConstraintNode.h" -#include "dHingeConstraintCmd.h" - - -MString dHingeConstraintCmd::typeName("dHingeConstraint"); - -dHingeConstraintCmd::dHingeConstraintCmd() - : m_argDatabase(0), - m_dagModifier(0) -{ -} - - -dHingeConstraintCmd::~dHingeConstraintCmd() -{ - if (m_argDatabase) { - delete m_argDatabase; - } - - if (m_dagModifier) { - delete m_dagModifier; - } -} - - -void * -dHingeConstraintCmd::creator() -{ - return new dHingeConstraintCmd; -} - - -MSyntax -dHingeConstraintCmd::syntax() -{ - MSyntax syntax; - syntax.enableQuery(false); - syntax.enableEdit(false); - - syntax.addFlag("-n", "-name", MSyntax::kString); - // syntax.addFlag("-fn", "-filename", MSyntax::kString); - // syntax.addFlag("-col", "-color", MSyntax::kString); - // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); - - return syntax; -} - - -MStatus -dHingeConstraintCmd::doIt(const MArgList &args) -{ - MStatus stat; - m_argDatabase = new MArgDatabase(syntax(), args, &stat); - if (stat == MS::kFailure) { - return stat; - } - return redoIt(); -} - - -MStatus -dHingeConstraintCmd::undoIt() -{ - MGlobal::setActiveSelectionList(m_undoSelectionList); - - if (m_dagModifier) { - m_dagModifier->undoIt(); - delete m_dagModifier; - m_dagModifier = 0; - } - - return MS::kSuccess; -} - - -MStatus -dHingeConstraintCmd::redoIt() -{ - MGlobal::getActiveSelectionList(m_undoSelectionList); - - MString name; - if (m_argDatabase->isFlagSet("-name")) { - m_argDatabase->getFlagArgument("-name", 0, name); - } - if (!name.length()) { - name = "dHingeConstraint"; - } - - m_dagModifier = new MDagModifier; - - MObject parentObj = m_dagModifier->createNode("transform"); - m_dagModifier->renameNode(parentObj, name + "#"); - m_dagModifier->doIt(); - - MObject dConstraintObj = m_dagModifier->createNode(hingeConstraintNode::typeId, parentObj); - std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); - std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); - dConstraintName.insert(pos + 1, "Shape"); - m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); - m_dagModifier->doIt(); - - setResult(MFnDependencyNode(dConstraintObj).name()); - - return MS::kSuccess; -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law +*/ + +//dHingeConstraintCmd.cpp + +#include +#include +#include + +#include "hingeConstraintNode.h" +#include "dHingeConstraintCmd.h" + + +MString dHingeConstraintCmd::typeName("dHingeConstraint"); + +dHingeConstraintCmd::dHingeConstraintCmd() + : m_argDatabase(0), + m_dagModifier(0) +{ +} + + +dHingeConstraintCmd::~dHingeConstraintCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dagModifier) { + delete m_dagModifier; + } +} + + +void * +dHingeConstraintCmd::creator() +{ + return new dHingeConstraintCmd; +} + + +MSyntax +dHingeConstraintCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + syntax.addFlag("-n", "-name", MSyntax::kString); + // syntax.addFlag("-fn", "-filename", MSyntax::kString); + // syntax.addFlag("-col", "-color", MSyntax::kString); + // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); + + return syntax; +} + + +MStatus +dHingeConstraintCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dHingeConstraintCmd::undoIt() +{ + MGlobal::setActiveSelectionList(m_undoSelectionList); + + if (m_dagModifier) { + m_dagModifier->undoIt(); + delete m_dagModifier; + m_dagModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dHingeConstraintCmd::redoIt() +{ + MGlobal::getActiveSelectionList(m_undoSelectionList); + + MString name; + if (m_argDatabase->isFlagSet("-name")) { + m_argDatabase->getFlagArgument("-name", 0, name); + } + if (!name.length()) { + name = "dHingeConstraint"; + } + + m_dagModifier = new MDagModifier; + + MObject parentObj = m_dagModifier->createNode("transform"); + m_dagModifier->renameNode(parentObj, name + "#"); + m_dagModifier->doIt(); + + MObject dConstraintObj = m_dagModifier->createNode(hingeConstraintNode::typeId, parentObj); + std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); + std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); + dConstraintName.insert(pos + 1, "Shape"); + m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); + m_dagModifier->doIt(); + + setResult(MFnDependencyNode(dConstraintObj).name()); + + return MS::kSuccess; +} diff --git a/Extras/MayaPlugin/constraint/dHingeConstraintCmd.h b/Extras/MayaPlugin/constraint/dHingeConstraintCmd.h index f16c7d4cc..a7924683e 100644 --- a/Extras/MayaPlugin/constraint/dHingeConstraintCmd.h +++ b/Extras/MayaPlugin/constraint/dHingeConstraintCmd.h @@ -1,58 +1,58 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law -*/ - -//dHingeConstraintCmd.h - -#ifndef DYN_HINGE_CONSTRAINT_CMD_H -#define DYN_HINGE_CONSTRAINT_CMD_H - -#include -#include -#include - -#include - -class dHingeConstraintCmd : public MPxCommand -{ -public: - dHingeConstraintCmd(); - virtual ~dHingeConstraintCmd(); - - static void *creator(); - static MSyntax syntax(); - - MStatus doIt(const MArgList &i_mArgList); - MStatus redoIt(); - MStatus undoIt(); - bool isUndoable() const { return true; } - bool hasSyntax() const { return true; } - - static MString typeName; - -protected: - MArgDatabase *m_argDatabase; - MDagModifier *m_dagModifier; - - MSelectionList m_undoSelectionList; -}; - -#endif //DYN_HINGE_CONSTRAINT_CMD_H +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law +*/ + +//dHingeConstraintCmd.h + +#ifndef DYN_HINGE_CONSTRAINT_CMD_H +#define DYN_HINGE_CONSTRAINT_CMD_H + +#include +#include +#include + +#include + +class dHingeConstraintCmd : public MPxCommand +{ +public: + dHingeConstraintCmd(); + virtual ~dHingeConstraintCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDagModifier *m_dagModifier; + + MSelectionList m_undoSelectionList; +}; + +#endif //DYN_HINGE_CONSTRAINT_CMD_H diff --git a/Extras/MayaPlugin/constraint/dNailConstraintCmd.cpp b/Extras/MayaPlugin/constraint/dNailConstraintCmd.cpp index 9acc1d9f5..04d7778d9 100644 --- a/Extras/MayaPlugin/constraint/dNailConstraintCmd.cpp +++ b/Extras/MayaPlugin/constraint/dNailConstraintCmd.cpp @@ -1,133 +1,133 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//dNailConstraintCmd.cpp - -#include -#include -#include - -#include "nailConstraintNode.h" -#include "dNailConstraintCmd.h" - - -MString dNailConstraintCmd::typeName("dNailConstraint"); - -dNailConstraintCmd::dNailConstraintCmd() - : m_argDatabase(0), - m_dagModifier(0) -{ -} - - -dNailConstraintCmd::~dNailConstraintCmd() -{ - if (m_argDatabase) { - delete m_argDatabase; - } - - if (m_dagModifier) { - delete m_dagModifier; - } -} - - -void * -dNailConstraintCmd::creator() -{ - return new dNailConstraintCmd; -} - - -MSyntax -dNailConstraintCmd::syntax() -{ - MSyntax syntax; - syntax.enableQuery(false); - syntax.enableEdit(false); - - syntax.addFlag("-n", "-name", MSyntax::kString); - // syntax.addFlag("-fn", "-filename", MSyntax::kString); - // syntax.addFlag("-col", "-color", MSyntax::kString); - // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); - - return syntax; -} - - -MStatus -dNailConstraintCmd::doIt(const MArgList &args) -{ - MStatus stat; - m_argDatabase = new MArgDatabase(syntax(), args, &stat); - if (stat == MS::kFailure) { - return stat; - } - return redoIt(); -} - - -MStatus -dNailConstraintCmd::undoIt() -{ - MGlobal::setActiveSelectionList(m_undoSelectionList); - - if (m_dagModifier) { - m_dagModifier->undoIt(); - delete m_dagModifier; - m_dagModifier = 0; - } - - return MS::kSuccess; -} - - -MStatus -dNailConstraintCmd::redoIt() -{ - MGlobal::getActiveSelectionList(m_undoSelectionList); - - MString name; - if (m_argDatabase->isFlagSet("-name")) { - m_argDatabase->getFlagArgument("-name", 0, name); - } - if (!name.length()) { - name = "dNailConstraint"; - } - - m_dagModifier = new MDagModifier; - - MObject parentObj = m_dagModifier->createNode("transform"); - m_dagModifier->renameNode(parentObj, name + "#"); - m_dagModifier->doIt(); - - MObject dConstraintObj = m_dagModifier->createNode(nailConstraintNode::typeId, parentObj); - std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); - std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); - dConstraintName.insert(pos + 1, "Shape"); - m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); - m_dagModifier->doIt(); - - setResult(MFnDependencyNode(dConstraintObj).name()); - - return MS::kSuccess; -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//dNailConstraintCmd.cpp + +#include +#include +#include + +#include "nailConstraintNode.h" +#include "dNailConstraintCmd.h" + + +MString dNailConstraintCmd::typeName("dNailConstraint"); + +dNailConstraintCmd::dNailConstraintCmd() + : m_argDatabase(0), + m_dagModifier(0) +{ +} + + +dNailConstraintCmd::~dNailConstraintCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dagModifier) { + delete m_dagModifier; + } +} + + +void * +dNailConstraintCmd::creator() +{ + return new dNailConstraintCmd; +} + + +MSyntax +dNailConstraintCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + syntax.addFlag("-n", "-name", MSyntax::kString); + // syntax.addFlag("-fn", "-filename", MSyntax::kString); + // syntax.addFlag("-col", "-color", MSyntax::kString); + // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); + + return syntax; +} + + +MStatus +dNailConstraintCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dNailConstraintCmd::undoIt() +{ + MGlobal::setActiveSelectionList(m_undoSelectionList); + + if (m_dagModifier) { + m_dagModifier->undoIt(); + delete m_dagModifier; + m_dagModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dNailConstraintCmd::redoIt() +{ + MGlobal::getActiveSelectionList(m_undoSelectionList); + + MString name; + if (m_argDatabase->isFlagSet("-name")) { + m_argDatabase->getFlagArgument("-name", 0, name); + } + if (!name.length()) { + name = "dNailConstraint"; + } + + m_dagModifier = new MDagModifier; + + MObject parentObj = m_dagModifier->createNode("transform"); + m_dagModifier->renameNode(parentObj, name + "#"); + m_dagModifier->doIt(); + + MObject dConstraintObj = m_dagModifier->createNode(nailConstraintNode::typeId, parentObj); + std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); + std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); + dConstraintName.insert(pos + 1, "Shape"); + m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); + m_dagModifier->doIt(); + + setResult(MFnDependencyNode(dConstraintObj).name()); + + return MS::kSuccess; +} diff --git a/Extras/MayaPlugin/constraint/dNailConstraintCmd.h b/Extras/MayaPlugin/constraint/dNailConstraintCmd.h index 6baf287a9..d09a092bc 100644 --- a/Extras/MayaPlugin/constraint/dNailConstraintCmd.h +++ b/Extras/MayaPlugin/constraint/dNailConstraintCmd.h @@ -1,58 +1,58 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//dNailConstraintCmd.h - -#ifndef DYN_NAIL_CONSTRAINT_CMD_H -#define DYN_NAIL_CONSTRAINT_CMD_H - -#include -#include -#include - -#include - -class dNailConstraintCmd : public MPxCommand -{ -public: - dNailConstraintCmd(); - virtual ~dNailConstraintCmd(); - - static void *creator(); - static MSyntax syntax(); - - MStatus doIt(const MArgList &i_mArgList); - MStatus redoIt(); - MStatus undoIt(); - bool isUndoable() const { return true; } - bool hasSyntax() const { return true; } - - static MString typeName; - -protected: - MArgDatabase *m_argDatabase; - MDagModifier *m_dagModifier; - - MSelectionList m_undoSelectionList; -}; - -#endif +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//dNailConstraintCmd.h + +#ifndef DYN_NAIL_CONSTRAINT_CMD_H +#define DYN_NAIL_CONSTRAINT_CMD_H + +#include +#include +#include + +#include + +class dNailConstraintCmd : public MPxCommand +{ +public: + dNailConstraintCmd(); + virtual ~dNailConstraintCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDagModifier *m_dagModifier; + + MSelectionList m_undoSelectionList; +}; + +#endif diff --git a/Extras/MayaPlugin/constraint/dSliderConstraintCmd.cpp b/Extras/MayaPlugin/constraint/dSliderConstraintCmd.cpp index e0ace3695..c6058389c 100644 --- a/Extras/MayaPlugin/constraint/dSliderConstraintCmd.cpp +++ b/Extras/MayaPlugin/constraint/dSliderConstraintCmd.cpp @@ -1,133 +1,133 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law -*/ - -//dSliderConstraintCmd.cpp - -#include -#include -#include - -#include "sliderConstraintNode.h" -#include "dSliderConstraintCmd.h" - - -MString dSliderConstraintCmd::typeName("dSliderConstraint"); - -dSliderConstraintCmd::dSliderConstraintCmd() - : m_argDatabase(0), - m_dagModifier(0) -{ -} - - -dSliderConstraintCmd::~dSliderConstraintCmd() -{ - if (m_argDatabase) { - delete m_argDatabase; - } - - if (m_dagModifier) { - delete m_dagModifier; - } -} - - -void * -dSliderConstraintCmd::creator() -{ - return new dSliderConstraintCmd; -} - - -MSyntax -dSliderConstraintCmd::syntax() -{ - MSyntax syntax; - syntax.enableQuery(false); - syntax.enableEdit(false); - - syntax.addFlag("-n", "-name", MSyntax::kString); - // syntax.addFlag("-fn", "-filename", MSyntax::kString); - // syntax.addFlag("-col", "-color", MSyntax::kString); - // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); - - return syntax; -} - - -MStatus -dSliderConstraintCmd::doIt(const MArgList &args) -{ - MStatus stat; - m_argDatabase = new MArgDatabase(syntax(), args, &stat); - if (stat == MS::kFailure) { - return stat; - } - return redoIt(); -} - - -MStatus -dSliderConstraintCmd::undoIt() -{ - MGlobal::setActiveSelectionList(m_undoSelectionList); - - if (m_dagModifier) { - m_dagModifier->undoIt(); - delete m_dagModifier; - m_dagModifier = 0; - } - - return MS::kSuccess; -} - - -MStatus -dSliderConstraintCmd::redoIt() -{ - MGlobal::getActiveSelectionList(m_undoSelectionList); - - MString name; - if (m_argDatabase->isFlagSet("-name")) { - m_argDatabase->getFlagArgument("-name", 0, name); - } - if (!name.length()) { - name = "dSliderConstraint"; - } - - m_dagModifier = new MDagModifier; - - MObject parentObj = m_dagModifier->createNode("transform"); - m_dagModifier->renameNode(parentObj, name + "#"); - m_dagModifier->doIt(); - - MObject dConstraintObj = m_dagModifier->createNode(sliderConstraintNode::typeId, parentObj); - std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); - std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); - dConstraintName.insert(pos + 1, "Shape"); - m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); - m_dagModifier->doIt(); - - setResult(MFnDependencyNode(dConstraintObj).name()); - - return MS::kSuccess; -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law +*/ + +//dSliderConstraintCmd.cpp + +#include +#include +#include + +#include "sliderConstraintNode.h" +#include "dSliderConstraintCmd.h" + + +MString dSliderConstraintCmd::typeName("dSliderConstraint"); + +dSliderConstraintCmd::dSliderConstraintCmd() + : m_argDatabase(0), + m_dagModifier(0) +{ +} + + +dSliderConstraintCmd::~dSliderConstraintCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dagModifier) { + delete m_dagModifier; + } +} + + +void * +dSliderConstraintCmd::creator() +{ + return new dSliderConstraintCmd; +} + + +MSyntax +dSliderConstraintCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + syntax.addFlag("-n", "-name", MSyntax::kString); + // syntax.addFlag("-fn", "-filename", MSyntax::kString); + // syntax.addFlag("-col", "-color", MSyntax::kString); + // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); + + return syntax; +} + + +MStatus +dSliderConstraintCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dSliderConstraintCmd::undoIt() +{ + MGlobal::setActiveSelectionList(m_undoSelectionList); + + if (m_dagModifier) { + m_dagModifier->undoIt(); + delete m_dagModifier; + m_dagModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dSliderConstraintCmd::redoIt() +{ + MGlobal::getActiveSelectionList(m_undoSelectionList); + + MString name; + if (m_argDatabase->isFlagSet("-name")) { + m_argDatabase->getFlagArgument("-name", 0, name); + } + if (!name.length()) { + name = "dSliderConstraint"; + } + + m_dagModifier = new MDagModifier; + + MObject parentObj = m_dagModifier->createNode("transform"); + m_dagModifier->renameNode(parentObj, name + "#"); + m_dagModifier->doIt(); + + MObject dConstraintObj = m_dagModifier->createNode(sliderConstraintNode::typeId, parentObj); + std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); + std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); + dConstraintName.insert(pos + 1, "Shape"); + m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); + m_dagModifier->doIt(); + + setResult(MFnDependencyNode(dConstraintObj).name()); + + return MS::kSuccess; +} diff --git a/Extras/MayaPlugin/constraint/dSliderConstraintCmd.h b/Extras/MayaPlugin/constraint/dSliderConstraintCmd.h index 6a130aad6..675bea713 100644 --- a/Extras/MayaPlugin/constraint/dSliderConstraintCmd.h +++ b/Extras/MayaPlugin/constraint/dSliderConstraintCmd.h @@ -1,58 +1,58 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law -*/ - -//dSliderConstraintCmd.h - -#ifndef DYN_SLIDER_CONSTRAINT_CMD_H -#define DYN_SLIDER_CONSTRAINT_CMD_H - -#include -#include -#include - -#include - -class dSliderConstraintCmd : public MPxCommand -{ -public: - dSliderConstraintCmd(); - virtual ~dSliderConstraintCmd(); - - static void *creator(); - static MSyntax syntax(); - - MStatus doIt(const MArgList &i_mArgList); - MStatus redoIt(); - MStatus undoIt(); - bool isUndoable() const { return true; } - bool hasSyntax() const { return true; } - - static MString typeName; - -protected: - MArgDatabase *m_argDatabase; - MDagModifier *m_dagModifier; - - MSelectionList m_undoSelectionList; -}; - -#endif //DYN_SLIDER_CONSTRAINT_CMD_H +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law +*/ + +//dSliderConstraintCmd.h + +#ifndef DYN_SLIDER_CONSTRAINT_CMD_H +#define DYN_SLIDER_CONSTRAINT_CMD_H + +#include +#include +#include + +#include + +class dSliderConstraintCmd : public MPxCommand +{ +public: + dSliderConstraintCmd(); + virtual ~dSliderConstraintCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDagModifier *m_dagModifier; + + MSelectionList m_undoSelectionList; +}; + +#endif //DYN_SLIDER_CONSTRAINT_CMD_H diff --git a/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.cpp b/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.cpp index 66bff8d00..ea628f671 100644 --- a/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.cpp +++ b/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.cpp @@ -1,133 +1,133 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law -*/ - -//dSixdofConstraintCmd.cpp - -#include -#include -#include - -#include "sixdofConstraintNode.h" -#include "dsixdofConstraintCmd.h" - - -MString dSixdofConstraintCmd::typeName("dSixdofConstraint"); - -dSixdofConstraintCmd::dSixdofConstraintCmd() - : m_argDatabase(0), - m_dagModifier(0) -{ -} - - -dSixdofConstraintCmd::~dSixdofConstraintCmd() -{ - if (m_argDatabase) { - delete m_argDatabase; - } - - if (m_dagModifier) { - delete m_dagModifier; - } -} - - -void * -dSixdofConstraintCmd::creator() -{ - return new dSixdofConstraintCmd; -} - - -MSyntax -dSixdofConstraintCmd::syntax() -{ - MSyntax syntax; - syntax.enableQuery(false); - syntax.enableEdit(false); - - syntax.addFlag("-n", "-name", MSyntax::kString); - // syntax.addFlag("-fn", "-filename", MSyntax::kString); - // syntax.addFlag("-col", "-color", MSyntax::kString); - // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); - - return syntax; -} - - -MStatus -dSixdofConstraintCmd::doIt(const MArgList &args) -{ - MStatus stat; - m_argDatabase = new MArgDatabase(syntax(), args, &stat); - if (stat == MS::kFailure) { - return stat; - } - return redoIt(); -} - - -MStatus -dSixdofConstraintCmd::undoIt() -{ - MGlobal::setActiveSelectionList(m_undoSelectionList); - - if (m_dagModifier) { - m_dagModifier->undoIt(); - delete m_dagModifier; - m_dagModifier = 0; - } - - return MS::kSuccess; -} - - -MStatus -dSixdofConstraintCmd::redoIt() -{ - MGlobal::getActiveSelectionList(m_undoSelectionList); - - MString name; - if (m_argDatabase->isFlagSet("-name")) { - m_argDatabase->getFlagArgument("-name", 0, name); - } - if (!name.length()) { - name = "dSixdofConstraint"; - } - - m_dagModifier = new MDagModifier; - - MObject parentObj = m_dagModifier->createNode("transform"); - m_dagModifier->renameNode(parentObj, name + "#"); - m_dagModifier->doIt(); - - MObject dConstraintObj = m_dagModifier->createNode(sixdofConstraintNode::typeId, parentObj); - std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); - std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); - dConstraintName.insert(pos + 1, "Shape"); - m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); - m_dagModifier->doIt(); - - setResult(MFnDependencyNode(dConstraintObj).name()); - - return MS::kSuccess; -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law +*/ + +//dSixdofConstraintCmd.cpp + +#include +#include +#include + +#include "sixdofConstraintNode.h" +#include "dsixdofConstraintCmd.h" + + +MString dSixdofConstraintCmd::typeName("dSixdofConstraint"); + +dSixdofConstraintCmd::dSixdofConstraintCmd() + : m_argDatabase(0), + m_dagModifier(0) +{ +} + + +dSixdofConstraintCmd::~dSixdofConstraintCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dagModifier) { + delete m_dagModifier; + } +} + + +void * +dSixdofConstraintCmd::creator() +{ + return new dSixdofConstraintCmd; +} + + +MSyntax +dSixdofConstraintCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + syntax.addFlag("-n", "-name", MSyntax::kString); + // syntax.addFlag("-fn", "-filename", MSyntax::kString); + // syntax.addFlag("-col", "-color", MSyntax::kString); + // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); + + return syntax; +} + + +MStatus +dSixdofConstraintCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dSixdofConstraintCmd::undoIt() +{ + MGlobal::setActiveSelectionList(m_undoSelectionList); + + if (m_dagModifier) { + m_dagModifier->undoIt(); + delete m_dagModifier; + m_dagModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dSixdofConstraintCmd::redoIt() +{ + MGlobal::getActiveSelectionList(m_undoSelectionList); + + MString name; + if (m_argDatabase->isFlagSet("-name")) { + m_argDatabase->getFlagArgument("-name", 0, name); + } + if (!name.length()) { + name = "dSixdofConstraint"; + } + + m_dagModifier = new MDagModifier; + + MObject parentObj = m_dagModifier->createNode("transform"); + m_dagModifier->renameNode(parentObj, name + "#"); + m_dagModifier->doIt(); + + MObject dConstraintObj = m_dagModifier->createNode(sixdofConstraintNode::typeId, parentObj); + std::string dConstraintName = MFnDependencyNode(parentObj).name().asChar(); + std::string::size_type pos = dConstraintName.find_last_not_of("0123456789"); + dConstraintName.insert(pos + 1, "Shape"); + m_dagModifier->renameNode(dConstraintObj, dConstraintName.c_str()); + m_dagModifier->doIt(); + + setResult(MFnDependencyNode(dConstraintObj).name()); + + return MS::kSuccess; +} diff --git a/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.h b/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.h index dac3a517e..4e8725e20 100644 --- a/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.h +++ b/Extras/MayaPlugin/constraint/dsixdofConstraintCmd.h @@ -1,58 +1,58 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law -*/ - -//dSixdofConstraintCmd.h - -#ifndef DYN_SIXDOF_CONSTRAINT_CMD_H -#define DYN_SIXDOF_CONSTRAINT_CMD_H - -#include -#include -#include - -#include - -class dSixdofConstraintCmd : public MPxCommand -{ -public: - dSixdofConstraintCmd(); - virtual ~dSixdofConstraintCmd(); - - static void *creator(); - static MSyntax syntax(); - - MStatus doIt(const MArgList &i_mArgList); - MStatus redoIt(); - MStatus undoIt(); - bool isUndoable() const { return true; } - bool hasSyntax() const { return true; } - - static MString typeName; - -protected: - MArgDatabase *m_argDatabase; - MDagModifier *m_dagModifier; - - MSelectionList m_undoSelectionList; -}; - -#endif //DYN_SIXDOF_CONSTRAINT_CMD_H +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law +*/ + +//dSixdofConstraintCmd.h + +#ifndef DYN_SIXDOF_CONSTRAINT_CMD_H +#define DYN_SIXDOF_CONSTRAINT_CMD_H + +#include +#include +#include + +#include + +class dSixdofConstraintCmd : public MPxCommand +{ +public: + dSixdofConstraintCmd(); + virtual ~dSixdofConstraintCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDagModifier *m_dagModifier; + + MSelectionList m_undoSelectionList; +}; + +#endif //DYN_SIXDOF_CONSTRAINT_CMD_H diff --git a/Extras/MayaPlugin/constraint/hingeConstraintNode.cpp b/Extras/MayaPlugin/constraint/hingeConstraintNode.cpp index 43d4b5174..a2c8bbf5a 100644 --- a/Extras/MayaPlugin/constraint/hingeConstraintNode.cpp +++ b/Extras/MayaPlugin/constraint/hingeConstraintNode.cpp @@ -1,685 +1,685 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law - -Modified by Roman Ponomarev -01/22/2010 : Constraints reworked -*/ - -//hingeConstraintNode.cpp - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rigidBodyNode.h" -#include "hingeConstraintNode.h" -#include "mayaUtils.h" - -#include "solver.h" -#include "dSolverNode.h" -#include "constraint/bt_hinge_constraint.h" - -MTypeId hingeConstraintNode::typeId(0x10033B); -MString hingeConstraintNode::typeName("dHingeConstraint"); - -MObject hingeConstraintNode::ia_rigidBodyA; -MObject hingeConstraintNode::ia_rigidBodyB; -MObject hingeConstraintNode::ia_damping; -MObject hingeConstraintNode::ia_lowerLimit; -MObject hingeConstraintNode::ia_upperLimit; -MObject hingeConstraintNode::ia_limitSoftness; -MObject hingeConstraintNode::ia_biasFactor; -MObject hingeConstraintNode::ia_relaxationFactor; -MObject hingeConstraintNode::ia_rotationInA; -MObject hingeConstraintNode::ia_rotationInB; - -MObject hingeConstraintNode::ia_pivotInA; -MObject hingeConstraintNode::ia_pivotInB; - -MObject hingeConstraintNode::ia_enableAngularMotor; -MObject hingeConstraintNode::ia_motorTargetVelocity; -MObject hingeConstraintNode::ia_maxMotorImpulse; - -MObject hingeConstraintNode::ca_constraint; -MObject hingeConstraintNode::ca_constraintParam; - -MStatus hingeConstraintNode::initialize() -{ - MStatus status; - MFnMessageAttribute fnMsgAttr; - MFnNumericAttribute fnNumericAttr; - MFnMatrixAttribute fnMatrixAttr; - - ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrba", &status); - MCHECKSTATUS(status, "creating inRigidBodyA attribute") - status = addAttribute(ia_rigidBodyA); - MCHECKSTATUS(status, "adding inRigidBodyA attribute") - - ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbb", &status); - MCHECKSTATUS(status, "creating inRigidBodyB attribute") - status = addAttribute(ia_rigidBodyB); - MCHECKSTATUS(status, "adding inRigidBodyB attribute") - - ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); - MCHECKSTATUS(status, "creating damping attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_damping); - MCHECKSTATUS(status, "adding damping attribute") - - ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, 1.0, &status); - MCHECKSTATUS(status, "creating lower limit attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_lowerLimit); - MCHECKSTATUS(status, "adding lower limit attribute") - - ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, -1.0, &status); - MCHECKSTATUS(status, "creating upper limit attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_upperLimit); - MCHECKSTATUS(status, "adding upper limit attribute") - - ia_limitSoftness = fnNumericAttr.create("limitSoftness", "lmSo", MFnNumericData::kDouble, 0.9, &status); - MCHECKSTATUS(status, "creating limitSoftness attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_limitSoftness); - MCHECKSTATUS(status, "adding limitSoftness attribute") - - ia_biasFactor = fnNumericAttr.create("biasFactor", "biFa", MFnNumericData::kDouble, 0.3, &status); - MCHECKSTATUS(status, "creating biasFactor attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_biasFactor); - MCHECKSTATUS(status, "adding biasFactor attribute") - - ia_relaxationFactor = fnNumericAttr.create("relaxationFactor", "reFa", MFnNumericData::kDouble, 1.0, &status); - MCHECKSTATUS(status, "creating relaxationFactor attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_relaxationFactor); - MCHECKSTATUS(status, "adding relaxationFactor attribute") - - ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating rotationInA attribute") - status = addAttribute(ia_rotationInA); - MCHECKSTATUS(status, "adding rotationInA attribute") - - ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating rotationInB attribute") - status = addAttribute(ia_rotationInB); - MCHECKSTATUS(status, "adding rotationInB attribute") - - ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating pivotInA attribute") - status = addAttribute(ia_pivotInA); - MCHECKSTATUS(status, "adding pivotInA attribute") - - ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating pivotInB attribute") - status = addAttribute(ia_pivotInB); - MCHECKSTATUS(status, "adding pivotInB attribute") - - - //------------------------------------------------------------------------------ - - ia_enableAngularMotor = fnNumericAttr.create("enableAngularMotor", "enAM", MFnNumericData::kBoolean, false, &status); - MCHECKSTATUS(status, "creating enableAngularMotor attribute") - status = addAttribute(ia_enableAngularMotor); - MCHECKSTATUS(status, "adding enableAngularMotor attribute") - - ia_motorTargetVelocity = fnNumericAttr.create("motorTargetVelocity", "mTV", MFnNumericData::kDouble, 1, &status); - MCHECKSTATUS(status, "creating motorTargetVelocity attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_motorTargetVelocity); - MCHECKSTATUS(status, "adding motorTargetVelocity attribute") - - ia_maxMotorImpulse = fnNumericAttr.create("maxMotorImpulse", "mMI", MFnNumericData::kDouble, 1, &status); - MCHECKSTATUS(status, "creating maxMotorImpulse attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_maxMotorImpulse); - MCHECKSTATUS(status, "adding maxMotorImpulse attribute") - - //------------------------------------------------------------------------------ - - ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); - MCHECKSTATUS(status, "creating ca_constraint attribute") - fnNumericAttr.setConnectable(false); - fnNumericAttr.setHidden(true); - fnNumericAttr.setStorable(false); - fnNumericAttr.setKeyable(false); - status = addAttribute(ca_constraint); - MCHECKSTATUS(status, "adding ca_constraint attribute") - - ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); - MCHECKSTATUS(status, "creating ca_constraintParam attribute") - fnNumericAttr.setConnectable(false); - fnNumericAttr.setHidden(true); - fnNumericAttr.setStorable(false); - fnNumericAttr.setKeyable(false); - status = addAttribute(ca_constraintParam); - MCHECKSTATUS(status, "adding ca_constraintParam attribute") - - - status = attributeAffects(ia_rigidBodyA, ca_constraint); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") - - status = attributeAffects(ia_rigidBodyA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") - - status = attributeAffects(ia_rigidBodyB, ca_constraint); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") - - status = attributeAffects(ia_rigidBodyB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") - - status = attributeAffects(ia_damping, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") - - status = attributeAffects(ia_lowerLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLimit, ca_constraintParam)") - - status = attributeAffects(ia_upperLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_upperLimit, ca_constraintParam)") - - status = attributeAffects(ia_limitSoftness, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_limitSoftness, ca_constraintParam)") - status = attributeAffects(ia_biasFactor, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_biasFactor, ca_constraintParam)") - status = attributeAffects(ia_relaxationFactor, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_relaxationFactor, ca_constraintParam)") - - status = attributeAffects(ia_rotationInA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") - status = attributeAffects(ia_rotationInB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") - - status = attributeAffects(ia_pivotInA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") - status = attributeAffects(ia_pivotInB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") - - - status = attributeAffects(ia_enableAngularMotor, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_enableAngularMotor, ca_constraintParam)") - status = attributeAffects(ia_motorTargetVelocity, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_motorTargetVelocity, ca_constraintParam)") - status = attributeAffects(ia_maxMotorImpulse, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_maxMotorImpulse, ca_constraintParam)") - - return MS::kSuccess; -} - -hingeConstraintNode::hingeConstraintNode() -{ - // std::cout << "hingeConstraintNode::hingeConstraintNode" << std::endl; -} - -hingeConstraintNode::~hingeConstraintNode() -{ - // std::cout << "hingeConstraintNode::~hingeConstraintNode" << std::endl; -} - -void hingeConstraintNode::nodeRemoved(MObject& node, void *clientData) -{ - // std::cout << "hingeConstraintNode::nodeRemoved" << std::endl; - MFnDependencyNode fnNode(node); - hingeConstraintNode *pNode = static_cast(fnNode.userNode()); - if (pNode->m_constraint) - { - bt_hinge_constraint_t* hinge_impl = dynamic_cast(pNode->m_constraint->pubImpl()); - rigid_body_t::pointer rigid_bodyA = pNode->m_constraint->rigid_bodyA(); - if(rigid_bodyA) - { - rigid_bodyA->remove_constraint(hinge_impl); - } - rigid_body_t::pointer rigid_bodyB = pNode->m_constraint->rigid_bodyB(); - if(rigid_bodyB) - { - rigid_bodyB->remove_constraint(hinge_impl); - } - } - constraint_t::pointer constraint = static_cast(pNode->m_constraint); - solver_t::remove_constraint(constraint); -} - -void* hingeConstraintNode::creator() -{ - return new hingeConstraintNode(); -} - - -bool hingeConstraintNode::setInternalValueInContext ( const MPlug & plug, - const MDataHandle & dataHandle, - MDGContext & ctx) -{ - /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { - m_framesDirty = true; - } else if(plug == textureFiles) { - gpufx::m_renderer.setColorTextureDirty(); - }*/ - return false; //setInternalValueInContext(plug,dataHandle,ctx); -} - -MStatus hingeConstraintNode::compute(const MPlug& plug, MDataBlock& data) -{ - //std::cout << "hingeConstraintNode::compute: " << plug.name() << std::endl; - //MTime time = data.inputValue( hingeConstraintNode::inTime ).asTime(); - if(plug == ca_constraint) { - computeConstraint(plug, data); - } else if(plug == ca_constraintParam) { - computeConstraintParam(plug, data); - } else if(plug.isElement()) { - if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { - computeWorldMatrix(plug, data); - } else { - return MStatus::kUnknownParameter; - } - } else { - return MStatus::kUnknownParameter; - } - return MStatus::kSuccess; -} - -void hingeConstraintNode::draw( M3dView & view, const MDagPath &path, - M3dView::DisplayStyle style, - M3dView::DisplayStatus status ) -{ - // std::cout << "hingeConstraintNode::draw" << std::endl; - - update(); - - view.beginGL(); - glPushAttrib( GL_ALL_ATTRIB_BITS ); - - glDisable(GL_LIGHTING); - - if( !(status == M3dView::kActive || - status == M3dView::kLead || - status == M3dView::kHilite || - ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) { - glColor3f(1.0, 1.0, 0.0); - } - - vec3f posA, posB, pivB; - rigid_body_t::pointer rigid_bodyB = NULL; - if (m_constraint) - { - vec3f pos; - quatf rot; - m_constraint->rigid_bodyA()->get_transform(pos, rot); - m_constraint->worldToA(pos, posA); - rigid_bodyB = m_constraint->rigid_bodyB(); - if(rigid_bodyB) - { - rigid_bodyB->get_transform(pos, rot); - m_constraint->worldToA(pos, posB); - } - vec3f zeroVec(0.f,0.f,0.f); - m_constraint->worldFromB(zeroVec, pos); - m_constraint->worldToA(pos, pivB); - } - - glBegin(GL_LINES); - glVertex3f(0.0, 0.0, 0.0); - glVertex3f(posA[0], posA[1], posA[2]); - - glVertex3f(0.0, 0.0, 0.0); - glVertex3f(pivB[0], pivB[1], pivB[2]); - - if(rigid_bodyB) - { - glVertex3f(pivB[0], pivB[1], pivB[2]); - glVertex3f(posB[0], posB[1], posB[2]); - } - - - glVertex3f(-1.0, 0.0, 0.0); - glVertex3f(1.0, 0.0, 0.0); - - glVertex3f(0.0, -1.0, 0.0); - glVertex3f(0.0, 1.0, 0.0); - - glVertex3f(0.0, 0.0, -1.0); - glVertex3f(0.0, 0.0, 1.0); - - vec3f posT, posP, posM; - - vec3f minusXVec(-1.f,0.f,0.f); - vec3f posXVec(1.f,0.f,0.f); - vec3f minusYVec (0.f,-1.f,0.f); - vec3f posYVec (0.f,1.f,0.f); - vec3f minusZVec (0.f,0.f,-1.f); - vec3f posZVec (0.f,0.f,1.f); - - - m_constraint->worldFromB(minusXVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posXVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - m_constraint->worldFromB(minusYVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posYVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - m_constraint->worldFromB(minusZVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posZVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - - - glEnd(); - - glPopAttrib(); - view.endGL(); -} - -bool hingeConstraintNode::isBounded() const -{ - //return true; - return false; -} - -MBoundingBox hingeConstraintNode::boundingBox() const -{ - // std::cout << "hingeConstraintNode::boundingBox()" << std::endl; - //load the pdbs - MObject node = thisMObject(); - - MPoint corner1(-1, -1, -1); - MPoint corner2(1, 1, 1); - return MBoundingBox(corner1, corner2); -} - -//standard attributes -void hingeConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data) -{ - // std::cout << "hingeConstraintNode::computeConstraint" << std::endl; - - MObject thisObject(thisMObject()); - MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); - MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); - MObject update; - //force evaluation of the rigidBody - plgRigidBodyA.getValue(update); - plgRigidBodyB.getValue(update); - - rigid_body_t::pointer rigid_bodyA; - if(plgRigidBodyA.isConnected()) { - MPlugArray connections; - plgRigidBodyA.connectedTo(connections, true, true); - if(connections.length() != 0) { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) { - rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); - rigid_bodyA = pRigidBodyNodeA->rigid_body(); - } else { - std::cout << "hingeConstraintNode connected to a non-rigidbody node A!" << std::endl; - } - } - } - rigid_body_t::pointer rigid_bodyB; - if(plgRigidBodyB.isConnected()) { - MPlugArray connections; - plgRigidBodyB.connectedTo(connections, true, true); - if(connections.length() != 0) { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) { - rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); - rigid_bodyB = pRigidBodyNodeB->rigid_body(); - } else { - std::cout << "hingeConstraintNode connected to a non-rigidbody node B!" << std::endl; - } - } - } - - vec3f pivInA, pivInB; - - if((rigid_bodyA != NULL) && (rigid_bodyB != NULL)) - { - constraint_t::pointer constraint = static_cast(m_constraint); - solver_t::remove_constraint(constraint); - float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); - float3& mPivInB = data.inputValue(ia_pivotInB).asFloat3(); - for(int i = 0; i < 3; i++) - { - pivInA[i] = (float)mPivInA[i]; - pivInB[i] = (float)mPivInB[i]; - } - float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); - MEulerRotation meulerA(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); - MQuaternion mquatA = meulerA.asQuaternion(); - quatf rotA((float)mquatA.w, (float)mquatA.x, (float)mquatA.y, (float)mquatA.z); - float3& mRotInB = data.inputValue(ia_rotationInB).asFloat3(); - MEulerRotation meulerB(deg2rad(mRotInB[0]), deg2rad(mRotInB[1]), deg2rad(mRotInB[2])); - MQuaternion mquatB = meulerB.asQuaternion(); - quatf rotB((float)mquatB.w, (float)mquatB.x, (float)mquatB.y, (float)mquatB.z); - m_constraint = solver_t::create_hinge_constraint(rigid_bodyA, pivInA, rotA, rigid_bodyB, pivInB, rotB); - constraint = static_cast(m_constraint); - solver_t::add_constraint(constraint); - } - else if(rigid_bodyA != NULL) - { - //not connected to a rigid body, put a default one - constraint_t::pointer constraint = static_cast(m_constraint); - solver_t::remove_constraint(constraint); - float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); - for(int i = 0; i < 3; i++) - { - pivInA[i] = (float)mPivInA[i]; - } - float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); - MEulerRotation meuler(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); - MQuaternion mquat = meuler.asQuaternion(); - quatf rotA((float)mquat.w, (float)mquat.x, (float)mquat.y, (float)mquat.z); - m_constraint = solver_t::create_hinge_constraint(rigid_bodyA, pivInA, rotA); - constraint = static_cast(m_constraint); - solver_t::add_constraint(constraint); - } - - data.outputValue(ca_constraint).set(true); - data.setClean(plug); -} - -void hingeConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) -{ - MObject thisObject(thisMObject()); - MFnDagNode fnDagNode(thisObject); - - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - - MStatus status; - MFnTransform fnParentTransform(fnDagNode.parent(0, &status)); - double fixScale[3] = { 1., 1., 1. }; // lock scale - fnParentTransform.setScale(fixScale); - MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform, &status); - - if(dSolverNode::isStartTime) - { // allow to edit pivots - MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); - MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); - MObject update; - //force evaluation of the rigidBody - plgRigidBodyA.getValue(update); - if(plgRigidBodyA.isConnected()) - { - MPlugArray connections; - plgRigidBodyA.connectedTo(connections, true, true); - if(connections.length() != 0) - { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) - { - MObject rbAObj = fnNode.object(); - rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); - MPlug(rbAObj, pRigidBodyNodeA->worldMatrix).elementByLogicalIndex(0).getValue(update); - } - } - } - plgRigidBodyB.getValue(update); - if(plgRigidBodyB.isConnected()) - { - MPlugArray connections; - plgRigidBodyB.connectedTo(connections, true, true); - if(connections.length() != 0) - { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) - { - MObject rbBObj = fnNode.object(); - rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); - MPlug(rbBObj, pRigidBodyNodeB->worldMatrix).elementByLogicalIndex(0).getValue(update); - } - } - } - if(m_constraint) - { - MQuaternion mrotation; - fnParentTransform.getRotation(mrotation, MSpace::kTransform); - bool doUpdatePivot = m_constraint->getPivotChanged(); - if(!doUpdatePivot) - { - vec3f worldP; - quatf worldR; - m_constraint->get_world(worldP, worldR); - float deltaPX = worldP[0] - float(mtranslation.x); - float deltaPY = worldP[1] - float(mtranslation.y); - float deltaPZ = worldP[2] - float(mtranslation.z); - float deltaRX = (float)mrotation.x - worldR[1]; - float deltaRY = (float)mrotation.y - worldR[2]; - float deltaRZ = (float)mrotation.z - worldR[3]; - float deltaRW = (float)mrotation.w - worldR[0]; - float deltaSq = deltaPX * deltaPX + deltaPY * deltaPY + deltaPZ * deltaPZ - + deltaRX * deltaRX + deltaRY * deltaRY + deltaRZ * deltaRZ + deltaRW * deltaRW; - doUpdatePivot = (deltaSq > FLT_EPSILON); - } - if(doUpdatePivot) - { - m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]), - quatf((float)mrotation.w, (float)mrotation.x, (float)mrotation.y, (float)mrotation.z)); - vec3f pivInA, pivInB; - quatf rotInA, rotInB; - m_constraint->get_frameA(pivInA, rotInA); - m_constraint->get_frameB(pivInB, rotInB); - MDataHandle hPivInA = data.outputValue(ia_pivotInA); - float3 &ihPivInA = hPivInA.asFloat3(); - MDataHandle hPivInB = data.outputValue(ia_pivotInB); - float3 &ihPivInB = hPivInB.asFloat3(); - for(int i = 0; i < 3; i++) - { - ihPivInA[i] = pivInA[i]; - ihPivInB[i] = pivInB[i]; - } - MDataHandle hRotInA = data.outputValue(ia_rotationInA); - float3 &hrotInA = hRotInA.asFloat3(); - MQuaternion mrotA(rotInA[1], rotInA[2], rotInA[3], rotInA[0]); - MEulerRotation newrotA(mrotA.asEulerRotation()); - hrotInA[0] = rad2deg((float)newrotA.x); - hrotInA[1] = rad2deg((float)newrotA.y); - hrotInA[2] = rad2deg((float)newrotA.z); - MDataHandle hRotInB = data.outputValue(ia_rotationInB); - float3 &hrotInB = hRotInB.asFloat3(); - MQuaternion mrotB(rotInB[1], rotInB[2], rotInB[3], rotInB[0]); - MEulerRotation newrotB(mrotB.asEulerRotation()); - hrotInB[0] = rad2deg((float)newrotB.x); - hrotInB[1] = rad2deg((float)newrotB.y); - hrotInB[2] = rad2deg((float)newrotB.z); - m_constraint->setPivotChanged(false); - } - } - } - else - { // if not start time, lock position and rotation - if(m_constraint) - { - vec3f worldP; - quatf worldR; - m_constraint->get_world(worldP, worldR); - fnParentTransform.setTranslation(MVector(worldP[0], worldP[1], worldP[2]), MSpace::kTransform); - fnParentTransform.setRotation(MQuaternion(worldR[1], worldR[2], worldR[3], worldR[0])); - } - } - data.setClean(plug); -} - -void hingeConstraintNode::computeConstraintParam(const MPlug& plug, MDataBlock& data) -{ - //std::cout << "hingeConstraintNode::computeRigidBodyParam data.className=" << std::endl; - - MObject thisObject(thisMObject()); - MObject update; - - MPlug(thisObject, ca_constraint).getValue(update); - if(m_constraint) { - float damping = (float) data.inputValue(ia_damping).asDouble(); - m_constraint->set_damping(damping); - float lower = (float) data.inputValue(ia_lowerLimit).asDouble(); - float upper = (float) data.inputValue(ia_upperLimit).asDouble(); - float limit_softness = (float) data.inputValue(ia_limitSoftness).asDouble(); - float bias_factor = (float) data.inputValue(ia_biasFactor).asDouble(); - float relaxation_factor = (float) data.inputValue(ia_relaxationFactor).asDouble(); - m_constraint->set_limit(deg2rad(lower), deg2rad(upper), limit_softness, bias_factor, relaxation_factor); - bool enable_motor = data.inputValue(ia_enableAngularMotor).asBool(); - float motorTargetVelocity = (float) data.inputValue(ia_motorTargetVelocity).asDouble(); - float maxMotorImpulse = (float) data.inputValue(ia_maxMotorImpulse).asDouble(); - m_constraint->enable_motor(enable_motor, motorTargetVelocity, maxMotorImpulse); - } - - data.outputValue(ca_constraintParam).set(true); - data.setClean(plug); -} - -hinge_constraint_t::pointer hingeConstraintNode::constraint() -{ - // std::cout << "hingeConstraintNode::rigid_body" << std::endl; - - MObject thisObject(thisMObject()); - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - - return m_constraint; -} - -void hingeConstraintNode::update() -{ - MObject thisObject(thisMObject()); - - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law + +Modified by Roman Ponomarev +01/22/2010 : Constraints reworked +*/ + +//hingeConstraintNode.cpp + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rigidBodyNode.h" +#include "hingeConstraintNode.h" +#include "mayaUtils.h" + +#include "solver.h" +#include "dSolverNode.h" +#include "constraint/bt_hinge_constraint.h" + +MTypeId hingeConstraintNode::typeId(0x10033B); +MString hingeConstraintNode::typeName("dHingeConstraint"); + +MObject hingeConstraintNode::ia_rigidBodyA; +MObject hingeConstraintNode::ia_rigidBodyB; +MObject hingeConstraintNode::ia_damping; +MObject hingeConstraintNode::ia_lowerLimit; +MObject hingeConstraintNode::ia_upperLimit; +MObject hingeConstraintNode::ia_limitSoftness; +MObject hingeConstraintNode::ia_biasFactor; +MObject hingeConstraintNode::ia_relaxationFactor; +MObject hingeConstraintNode::ia_rotationInA; +MObject hingeConstraintNode::ia_rotationInB; + +MObject hingeConstraintNode::ia_pivotInA; +MObject hingeConstraintNode::ia_pivotInB; + +MObject hingeConstraintNode::ia_enableAngularMotor; +MObject hingeConstraintNode::ia_motorTargetVelocity; +MObject hingeConstraintNode::ia_maxMotorImpulse; + +MObject hingeConstraintNode::ca_constraint; +MObject hingeConstraintNode::ca_constraintParam; + +MStatus hingeConstraintNode::initialize() +{ + MStatus status; + MFnMessageAttribute fnMsgAttr; + MFnNumericAttribute fnNumericAttr; + MFnMatrixAttribute fnMatrixAttr; + + ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrba", &status); + MCHECKSTATUS(status, "creating inRigidBodyA attribute") + status = addAttribute(ia_rigidBodyA); + MCHECKSTATUS(status, "adding inRigidBodyA attribute") + + ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbb", &status); + MCHECKSTATUS(status, "creating inRigidBodyB attribute") + status = addAttribute(ia_rigidBodyB); + MCHECKSTATUS(status, "adding inRigidBodyB attribute") + + ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating damping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_damping); + MCHECKSTATUS(status, "adding damping attribute") + + ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating lower limit attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_lowerLimit); + MCHECKSTATUS(status, "adding lower limit attribute") + + ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, -1.0, &status); + MCHECKSTATUS(status, "creating upper limit attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_upperLimit); + MCHECKSTATUS(status, "adding upper limit attribute") + + ia_limitSoftness = fnNumericAttr.create("limitSoftness", "lmSo", MFnNumericData::kDouble, 0.9, &status); + MCHECKSTATUS(status, "creating limitSoftness attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_limitSoftness); + MCHECKSTATUS(status, "adding limitSoftness attribute") + + ia_biasFactor = fnNumericAttr.create("biasFactor", "biFa", MFnNumericData::kDouble, 0.3, &status); + MCHECKSTATUS(status, "creating biasFactor attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_biasFactor); + MCHECKSTATUS(status, "adding biasFactor attribute") + + ia_relaxationFactor = fnNumericAttr.create("relaxationFactor", "reFa", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating relaxationFactor attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_relaxationFactor); + MCHECKSTATUS(status, "adding relaxationFactor attribute") + + ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating rotationInA attribute") + status = addAttribute(ia_rotationInA); + MCHECKSTATUS(status, "adding rotationInA attribute") + + ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating rotationInB attribute") + status = addAttribute(ia_rotationInB); + MCHECKSTATUS(status, "adding rotationInB attribute") + + ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating pivotInA attribute") + status = addAttribute(ia_pivotInA); + MCHECKSTATUS(status, "adding pivotInA attribute") + + ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating pivotInB attribute") + status = addAttribute(ia_pivotInB); + MCHECKSTATUS(status, "adding pivotInB attribute") + + + //------------------------------------------------------------------------------ + + ia_enableAngularMotor = fnNumericAttr.create("enableAngularMotor", "enAM", MFnNumericData::kBoolean, false, &status); + MCHECKSTATUS(status, "creating enableAngularMotor attribute") + status = addAttribute(ia_enableAngularMotor); + MCHECKSTATUS(status, "adding enableAngularMotor attribute") + + ia_motorTargetVelocity = fnNumericAttr.create("motorTargetVelocity", "mTV", MFnNumericData::kDouble, 1, &status); + MCHECKSTATUS(status, "creating motorTargetVelocity attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_motorTargetVelocity); + MCHECKSTATUS(status, "adding motorTargetVelocity attribute") + + ia_maxMotorImpulse = fnNumericAttr.create("maxMotorImpulse", "mMI", MFnNumericData::kDouble, 1, &status); + MCHECKSTATUS(status, "creating maxMotorImpulse attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_maxMotorImpulse); + MCHECKSTATUS(status, "adding maxMotorImpulse attribute") + + //------------------------------------------------------------------------------ + + ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_constraint attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_constraint); + MCHECKSTATUS(status, "adding ca_constraint attribute") + + ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_constraintParam attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_constraintParam); + MCHECKSTATUS(status, "adding ca_constraintParam attribute") + + + status = attributeAffects(ia_rigidBodyA, ca_constraint); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") + + status = attributeAffects(ia_rigidBodyA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") + + status = attributeAffects(ia_rigidBodyB, ca_constraint); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") + + status = attributeAffects(ia_rigidBodyB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") + + status = attributeAffects(ia_damping, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") + + status = attributeAffects(ia_lowerLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLimit, ca_constraintParam)") + + status = attributeAffects(ia_upperLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_upperLimit, ca_constraintParam)") + + status = attributeAffects(ia_limitSoftness, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_limitSoftness, ca_constraintParam)") + status = attributeAffects(ia_biasFactor, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_biasFactor, ca_constraintParam)") + status = attributeAffects(ia_relaxationFactor, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_relaxationFactor, ca_constraintParam)") + + status = attributeAffects(ia_rotationInA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") + status = attributeAffects(ia_rotationInB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") + + status = attributeAffects(ia_pivotInA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") + status = attributeAffects(ia_pivotInB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") + + + status = attributeAffects(ia_enableAngularMotor, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_enableAngularMotor, ca_constraintParam)") + status = attributeAffects(ia_motorTargetVelocity, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_motorTargetVelocity, ca_constraintParam)") + status = attributeAffects(ia_maxMotorImpulse, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_maxMotorImpulse, ca_constraintParam)") + + return MS::kSuccess; +} + +hingeConstraintNode::hingeConstraintNode() +{ + // std::cout << "hingeConstraintNode::hingeConstraintNode" << std::endl; +} + +hingeConstraintNode::~hingeConstraintNode() +{ + // std::cout << "hingeConstraintNode::~hingeConstraintNode" << std::endl; +} + +void hingeConstraintNode::nodeRemoved(MObject& node, void *clientData) +{ + // std::cout << "hingeConstraintNode::nodeRemoved" << std::endl; + MFnDependencyNode fnNode(node); + hingeConstraintNode *pNode = static_cast(fnNode.userNode()); + if (pNode->m_constraint) + { + bt_hinge_constraint_t* hinge_impl = dynamic_cast(pNode->m_constraint->pubImpl()); + rigid_body_t::pointer rigid_bodyA = pNode->m_constraint->rigid_bodyA(); + if(rigid_bodyA) + { + rigid_bodyA->remove_constraint(hinge_impl); + } + rigid_body_t::pointer rigid_bodyB = pNode->m_constraint->rigid_bodyB(); + if(rigid_bodyB) + { + rigid_bodyB->remove_constraint(hinge_impl); + } + } + constraint_t::pointer constraint = static_cast(pNode->m_constraint); + solver_t::remove_constraint(constraint); +} + +void* hingeConstraintNode::creator() +{ + return new hingeConstraintNode(); +} + + +bool hingeConstraintNode::setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx) +{ + /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { + m_framesDirty = true; + } else if(plug == textureFiles) { + gpufx::m_renderer.setColorTextureDirty(); + }*/ + return false; //setInternalValueInContext(plug,dataHandle,ctx); +} + +MStatus hingeConstraintNode::compute(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "hingeConstraintNode::compute: " << plug.name() << std::endl; + //MTime time = data.inputValue( hingeConstraintNode::inTime ).asTime(); + if(plug == ca_constraint) { + computeConstraint(plug, data); + } else if(plug == ca_constraintParam) { + computeConstraintParam(plug, data); + } else if(plug.isElement()) { + if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { + computeWorldMatrix(plug, data); + } else { + return MStatus::kUnknownParameter; + } + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +void hingeConstraintNode::draw( M3dView & view, const MDagPath &path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ) +{ + // std::cout << "hingeConstraintNode::draw" << std::endl; + + update(); + + view.beginGL(); + glPushAttrib( GL_ALL_ATTRIB_BITS ); + + glDisable(GL_LIGHTING); + + if( !(status == M3dView::kActive || + status == M3dView::kLead || + status == M3dView::kHilite || + ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) { + glColor3f(1.0, 1.0, 0.0); + } + + vec3f posA, posB, pivB; + rigid_body_t::pointer rigid_bodyB = NULL; + if (m_constraint) + { + vec3f pos; + quatf rot; + m_constraint->rigid_bodyA()->get_transform(pos, rot); + m_constraint->worldToA(pos, posA); + rigid_bodyB = m_constraint->rigid_bodyB(); + if(rigid_bodyB) + { + rigid_bodyB->get_transform(pos, rot); + m_constraint->worldToA(pos, posB); + } + vec3f zeroVec(0.f,0.f,0.f); + m_constraint->worldFromB(zeroVec, pos); + m_constraint->worldToA(pos, pivB); + } + + glBegin(GL_LINES); + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(posA[0], posA[1], posA[2]); + + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(pivB[0], pivB[1], pivB[2]); + + if(rigid_bodyB) + { + glVertex3f(pivB[0], pivB[1], pivB[2]); + glVertex3f(posB[0], posB[1], posB[2]); + } + + + glVertex3f(-1.0, 0.0, 0.0); + glVertex3f(1.0, 0.0, 0.0); + + glVertex3f(0.0, -1.0, 0.0); + glVertex3f(0.0, 1.0, 0.0); + + glVertex3f(0.0, 0.0, -1.0); + glVertex3f(0.0, 0.0, 1.0); + + vec3f posT, posP, posM; + + vec3f minusXVec(-1.f,0.f,0.f); + vec3f posXVec(1.f,0.f,0.f); + vec3f minusYVec (0.f,-1.f,0.f); + vec3f posYVec (0.f,1.f,0.f); + vec3f minusZVec (0.f,0.f,-1.f); + vec3f posZVec (0.f,0.f,1.f); + + + m_constraint->worldFromB(minusXVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posXVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + m_constraint->worldFromB(minusYVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posYVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + m_constraint->worldFromB(minusZVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posZVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + + + glEnd(); + + glPopAttrib(); + view.endGL(); +} + +bool hingeConstraintNode::isBounded() const +{ + //return true; + return false; +} + +MBoundingBox hingeConstraintNode::boundingBox() const +{ + // std::cout << "hingeConstraintNode::boundingBox()" << std::endl; + //load the pdbs + MObject node = thisMObject(); + + MPoint corner1(-1, -1, -1); + MPoint corner2(1, 1, 1); + return MBoundingBox(corner1, corner2); +} + +//standard attributes +void hingeConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "hingeConstraintNode::computeConstraint" << std::endl; + + MObject thisObject(thisMObject()); + MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); + MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); + MObject update; + //force evaluation of the rigidBody + plgRigidBodyA.getValue(update); + plgRigidBodyB.getValue(update); + + rigid_body_t::pointer rigid_bodyA; + if(plgRigidBodyA.isConnected()) { + MPlugArray connections; + plgRigidBodyA.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); + rigid_bodyA = pRigidBodyNodeA->rigid_body(); + } else { + std::cout << "hingeConstraintNode connected to a non-rigidbody node A!" << std::endl; + } + } + } + rigid_body_t::pointer rigid_bodyB; + if(plgRigidBodyB.isConnected()) { + MPlugArray connections; + plgRigidBodyB.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); + rigid_bodyB = pRigidBodyNodeB->rigid_body(); + } else { + std::cout << "hingeConstraintNode connected to a non-rigidbody node B!" << std::endl; + } + } + } + + vec3f pivInA, pivInB; + + if((rigid_bodyA != NULL) && (rigid_bodyB != NULL)) + { + constraint_t::pointer constraint = static_cast(m_constraint); + solver_t::remove_constraint(constraint); + float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); + float3& mPivInB = data.inputValue(ia_pivotInB).asFloat3(); + for(int i = 0; i < 3; i++) + { + pivInA[i] = (float)mPivInA[i]; + pivInB[i] = (float)mPivInB[i]; + } + float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); + MEulerRotation meulerA(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); + MQuaternion mquatA = meulerA.asQuaternion(); + quatf rotA((float)mquatA.w, (float)mquatA.x, (float)mquatA.y, (float)mquatA.z); + float3& mRotInB = data.inputValue(ia_rotationInB).asFloat3(); + MEulerRotation meulerB(deg2rad(mRotInB[0]), deg2rad(mRotInB[1]), deg2rad(mRotInB[2])); + MQuaternion mquatB = meulerB.asQuaternion(); + quatf rotB((float)mquatB.w, (float)mquatB.x, (float)mquatB.y, (float)mquatB.z); + m_constraint = solver_t::create_hinge_constraint(rigid_bodyA, pivInA, rotA, rigid_bodyB, pivInB, rotB); + constraint = static_cast(m_constraint); + solver_t::add_constraint(constraint); + } + else if(rigid_bodyA != NULL) + { + //not connected to a rigid body, put a default one + constraint_t::pointer constraint = static_cast(m_constraint); + solver_t::remove_constraint(constraint); + float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); + for(int i = 0; i < 3; i++) + { + pivInA[i] = (float)mPivInA[i]; + } + float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); + MEulerRotation meuler(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); + MQuaternion mquat = meuler.asQuaternion(); + quatf rotA((float)mquat.w, (float)mquat.x, (float)mquat.y, (float)mquat.z); + m_constraint = solver_t::create_hinge_constraint(rigid_bodyA, pivInA, rotA); + constraint = static_cast(m_constraint); + solver_t::add_constraint(constraint); + } + + data.outputValue(ca_constraint).set(true); + data.setClean(plug); +} + +void hingeConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) +{ + MObject thisObject(thisMObject()); + MFnDagNode fnDagNode(thisObject); + + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + + MStatus status; + MFnTransform fnParentTransform(fnDagNode.parent(0, &status)); + double fixScale[3] = { 1., 1., 1. }; // lock scale + fnParentTransform.setScale(fixScale); + MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform, &status); + + if(dSolverNode::isStartTime) + { // allow to edit pivots + MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); + MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); + MObject update; + //force evaluation of the rigidBody + plgRigidBodyA.getValue(update); + if(plgRigidBodyA.isConnected()) + { + MPlugArray connections; + plgRigidBodyA.connectedTo(connections, true, true); + if(connections.length() != 0) + { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) + { + MObject rbAObj = fnNode.object(); + rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); + MPlug(rbAObj, pRigidBodyNodeA->worldMatrix).elementByLogicalIndex(0).getValue(update); + } + } + } + plgRigidBodyB.getValue(update); + if(plgRigidBodyB.isConnected()) + { + MPlugArray connections; + plgRigidBodyB.connectedTo(connections, true, true); + if(connections.length() != 0) + { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) + { + MObject rbBObj = fnNode.object(); + rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); + MPlug(rbBObj, pRigidBodyNodeB->worldMatrix).elementByLogicalIndex(0).getValue(update); + } + } + } + if(m_constraint) + { + MQuaternion mrotation; + fnParentTransform.getRotation(mrotation, MSpace::kTransform); + bool doUpdatePivot = m_constraint->getPivotChanged(); + if(!doUpdatePivot) + { + vec3f worldP; + quatf worldR; + m_constraint->get_world(worldP, worldR); + float deltaPX = worldP[0] - float(mtranslation.x); + float deltaPY = worldP[1] - float(mtranslation.y); + float deltaPZ = worldP[2] - float(mtranslation.z); + float deltaRX = (float)mrotation.x - worldR[1]; + float deltaRY = (float)mrotation.y - worldR[2]; + float deltaRZ = (float)mrotation.z - worldR[3]; + float deltaRW = (float)mrotation.w - worldR[0]; + float deltaSq = deltaPX * deltaPX + deltaPY * deltaPY + deltaPZ * deltaPZ + + deltaRX * deltaRX + deltaRY * deltaRY + deltaRZ * deltaRZ + deltaRW * deltaRW; + doUpdatePivot = (deltaSq > FLT_EPSILON); + } + if(doUpdatePivot) + { + m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]), + quatf((float)mrotation.w, (float)mrotation.x, (float)mrotation.y, (float)mrotation.z)); + vec3f pivInA, pivInB; + quatf rotInA, rotInB; + m_constraint->get_frameA(pivInA, rotInA); + m_constraint->get_frameB(pivInB, rotInB); + MDataHandle hPivInA = data.outputValue(ia_pivotInA); + float3 &ihPivInA = hPivInA.asFloat3(); + MDataHandle hPivInB = data.outputValue(ia_pivotInB); + float3 &ihPivInB = hPivInB.asFloat3(); + for(int i = 0; i < 3; i++) + { + ihPivInA[i] = pivInA[i]; + ihPivInB[i] = pivInB[i]; + } + MDataHandle hRotInA = data.outputValue(ia_rotationInA); + float3 &hrotInA = hRotInA.asFloat3(); + MQuaternion mrotA(rotInA[1], rotInA[2], rotInA[3], rotInA[0]); + MEulerRotation newrotA(mrotA.asEulerRotation()); + hrotInA[0] = rad2deg((float)newrotA.x); + hrotInA[1] = rad2deg((float)newrotA.y); + hrotInA[2] = rad2deg((float)newrotA.z); + MDataHandle hRotInB = data.outputValue(ia_rotationInB); + float3 &hrotInB = hRotInB.asFloat3(); + MQuaternion mrotB(rotInB[1], rotInB[2], rotInB[3], rotInB[0]); + MEulerRotation newrotB(mrotB.asEulerRotation()); + hrotInB[0] = rad2deg((float)newrotB.x); + hrotInB[1] = rad2deg((float)newrotB.y); + hrotInB[2] = rad2deg((float)newrotB.z); + m_constraint->setPivotChanged(false); + } + } + } + else + { // if not start time, lock position and rotation + if(m_constraint) + { + vec3f worldP; + quatf worldR; + m_constraint->get_world(worldP, worldR); + fnParentTransform.setTranslation(MVector(worldP[0], worldP[1], worldP[2]), MSpace::kTransform); + fnParentTransform.setRotation(MQuaternion(worldR[1], worldR[2], worldR[3], worldR[0])); + } + } + data.setClean(plug); +} + +void hingeConstraintNode::computeConstraintParam(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "hingeConstraintNode::computeRigidBodyParam data.className=" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + + MPlug(thisObject, ca_constraint).getValue(update); + if(m_constraint) { + float damping = (float) data.inputValue(ia_damping).asDouble(); + m_constraint->set_damping(damping); + float lower = (float) data.inputValue(ia_lowerLimit).asDouble(); + float upper = (float) data.inputValue(ia_upperLimit).asDouble(); + float limit_softness = (float) data.inputValue(ia_limitSoftness).asDouble(); + float bias_factor = (float) data.inputValue(ia_biasFactor).asDouble(); + float relaxation_factor = (float) data.inputValue(ia_relaxationFactor).asDouble(); + m_constraint->set_limit(deg2rad(lower), deg2rad(upper), limit_softness, bias_factor, relaxation_factor); + bool enable_motor = data.inputValue(ia_enableAngularMotor).asBool(); + float motorTargetVelocity = (float) data.inputValue(ia_motorTargetVelocity).asDouble(); + float maxMotorImpulse = (float) data.inputValue(ia_maxMotorImpulse).asDouble(); + m_constraint->enable_motor(enable_motor, motorTargetVelocity, maxMotorImpulse); + } + + data.outputValue(ca_constraintParam).set(true); + data.setClean(plug); +} + +hinge_constraint_t::pointer hingeConstraintNode::constraint() +{ + // std::cout << "hingeConstraintNode::rigid_body" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + + return m_constraint; +} + +void hingeConstraintNode::update() +{ + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); +} diff --git a/Extras/MayaPlugin/constraint/sixdofConstraintNode.cpp b/Extras/MayaPlugin/constraint/sixdofConstraintNode.cpp index ae8b386a3..ea5b9272d 100644 --- a/Extras/MayaPlugin/constraint/sixdofConstraintNode.cpp +++ b/Extras/MayaPlugin/constraint/sixdofConstraintNode.cpp @@ -1,648 +1,648 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law - -Modified by Roman Ponomarev -01/22/2010 : Constraints reworked -*/ - -//sixdofConstraintNode.cpp - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rigidBodyNode.h" -#include "sixdofConstraintNode.h" -#include "mayaUtils.h" - -#include "solver.h" -#include "dSolverNode.h" -#include "constraint/bt_sixdof_constraint.h" - -MTypeId sixdofConstraintNode::typeId(0x100384); -MString sixdofConstraintNode::typeName("dSixdofConstraint"); - -MObject sixdofConstraintNode::ia_rigidBodyA; -MObject sixdofConstraintNode::ia_rigidBodyB; -MObject sixdofConstraintNode::ia_damping; -MObject sixdofConstraintNode::ca_constraint; -MObject sixdofConstraintNode::ca_constraintParam; -MObject sixdofConstraintNode::ia_lowerLinLimit; -MObject sixdofConstraintNode::ia_upperLinLimit; -MObject sixdofConstraintNode::ia_lowerAngLimit; -MObject sixdofConstraintNode::ia_upperAngLimit; -MObject sixdofConstraintNode::ia_rotationInA; -MObject sixdofConstraintNode::ia_rotationInB; -MObject sixdofConstraintNode::ia_pivotInA; -MObject sixdofConstraintNode::ia_pivotInB; - -MStatus sixdofConstraintNode::initialize() -{ - MStatus status; - MFnMessageAttribute fnMsgAttr; - MFnNumericAttribute fnNumericAttr; - MFnMatrixAttribute fnMatrixAttr; - - ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status); - MCHECKSTATUS(status, "creating inRigidBodyA attribute") - status = addAttribute(ia_rigidBodyA); - MCHECKSTATUS(status, "adding inRigidBody attribute") - - ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status); - MCHECKSTATUS(status, "creating inRigidBodyB attribute") - status = addAttribute(ia_rigidBodyB); - MCHECKSTATUS(status, "adding inRigidBodyB attribute") - - ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); - MCHECKSTATUS(status, "creating damping attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_damping); - MCHECKSTATUS(status, "adding damping attribute") - - ia_lowerLinLimit = fnNumericAttr.createPoint("lowerLinLimit", "lllt", &status); - MCHECKSTATUS(status, "creating lower linear limit attribute") - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_lowerLinLimit); - MCHECKSTATUS(status, "adding lower linear limit attribute") - - ia_upperLinLimit = fnNumericAttr.createPoint("upperLinLimit", "ullt", &status); - MCHECKSTATUS(status, "creating upper linear limit attribute") - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_upperLinLimit); - MCHECKSTATUS(status, "adding upper linear limit attribute") - - ia_lowerAngLimit = fnNumericAttr.createPoint("lowerAngLimit", "lalt", &status); - MCHECKSTATUS(status, "creating lower angular limit attribute") - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_lowerAngLimit); - MCHECKSTATUS(status, "adding lower angular limit attribute") - - ia_upperAngLimit = fnNumericAttr.createPoint("upperAngLimit", "ualt", &status); - MCHECKSTATUS(status, "creating upper angular limit attribute") - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_upperAngLimit); - MCHECKSTATUS(status, "adding upper angular limit attribute") - - ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); - MCHECKSTATUS(status, "creating ca_constraint attribute") - fnNumericAttr.setConnectable(false); - fnNumericAttr.setHidden(true); - fnNumericAttr.setStorable(false); - fnNumericAttr.setKeyable(false); - status = addAttribute(ca_constraint); - MCHECKSTATUS(status, "adding ca_constraint attribute") - - - ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); - MCHECKSTATUS(status, "creating ca_constraintParam attribute") - fnNumericAttr.setConnectable(false); - fnNumericAttr.setHidden(true); - fnNumericAttr.setStorable(false); - fnNumericAttr.setKeyable(false); - status = addAttribute(ca_constraintParam); - MCHECKSTATUS(status, "adding ca_constraintParam attribute") - - ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating rotationInA attribute") - status = addAttribute(ia_rotationInA); - MCHECKSTATUS(status, "adding rotationInA attribute") - - ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating rotationInB attribute") - status = addAttribute(ia_rotationInB); - MCHECKSTATUS(status, "adding rotationInB attribute") - - ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating pivotInA attribute") - status = addAttribute(ia_pivotInA); - MCHECKSTATUS(status, "adding pivotInA attribute") - - ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating pivotInB attribute") - status = addAttribute(ia_pivotInB); - MCHECKSTATUS(status, "adding pivotInB attribute") - - - status = attributeAffects(ia_rigidBodyA, ca_constraint); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") - - status = attributeAffects(ia_rigidBodyA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") - - status = attributeAffects(ia_rigidBodyB, ca_constraint); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") - - status = attributeAffects(ia_rigidBodyB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") - - status = attributeAffects(ia_damping, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") - - status = attributeAffects(ia_lowerLinLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLinLimit, ca_constraintParam)") - - status = attributeAffects(ia_upperLinLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_upperLinLimit, ca_constraintParam)") - - status = attributeAffects(ia_lowerAngLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_lowerAngLimit, ca_constraintParam)") - - status = attributeAffects(ia_upperAngLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_upperAngLimit, ca_constraintParam)") - - status = attributeAffects(ia_rotationInA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") - status = attributeAffects(ia_rotationInB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") - - status = attributeAffects(ia_pivotInA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") - status = attributeAffects(ia_pivotInB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") - - - return MS::kSuccess; -} - -sixdofConstraintNode::sixdofConstraintNode() -{ - // std::cout << "sixdofConstraintNode::sixdofConstraintNode" << std::endl; -} - -sixdofConstraintNode::~sixdofConstraintNode() -{ - // std::cout << "sixdofConstraintNode::~sixdofConstraintNode" << std::endl; -} - -void sixdofConstraintNode::nodeRemoved(MObject& node, void *clientData) -{ - // std::cout << "sixdofConstraintNode::nodeRemoved" << std::endl; - MFnDependencyNode fnNode(node); - sixdofConstraintNode *pNode = static_cast(fnNode.userNode()); - if (pNode->m_constraint) - { - bt_sixdof_constraint_t* hinge_impl = dynamic_cast(pNode->m_constraint->pubImpl()); - rigid_body_t::pointer rigid_bodyA = pNode->m_constraint->rigid_bodyA(); - if(rigid_bodyA) - { - rigid_bodyA->remove_constraint(hinge_impl); - } - rigid_body_t::pointer rigid_bodyB = pNode->m_constraint->rigid_bodyB(); - if(rigid_bodyB) - { - rigid_bodyB->remove_constraint(hinge_impl); - } - } - constraint_t::pointer constraint = static_cast(pNode->m_constraint); - solver_t::remove_constraint(constraint); -} - -void* sixdofConstraintNode::creator() -{ - return new sixdofConstraintNode(); -} - - -bool sixdofConstraintNode::setInternalValueInContext ( const MPlug & plug, - const MDataHandle & dataHandle, - MDGContext & ctx) -{ - /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { - m_framesDirty = true; - } else if(plug == textureFiles) { - gpufx::m_renderer.setColorTextureDirty(); - }*/ - return false; //setInternalValueInContext(plug,dataHandle,ctx); -} - -MStatus sixdofConstraintNode::compute(const MPlug& plug, MDataBlock& data) -{ - //std::cout << "sixdofConstraintNode::compute: " << plug.name() << std::endl; - //MTime time = data.inputValue( sixdofConstraintNode::inTime ).asTime(); - if(plug == ca_constraint) { - computeConstraint(plug, data); - } else if(plug == ca_constraintParam) { - computeConstraintParam(plug, data); - } else if(plug.isElement()) { - if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { - computeWorldMatrix(plug, data); - } else { - return MStatus::kUnknownParameter; - } - } else { - return MStatus::kUnknownParameter; - } - return MStatus::kSuccess; -} - -void sixdofConstraintNode::draw( M3dView & view, const MDagPath &path, - M3dView::DisplayStyle style, - M3dView::DisplayStatus status ) -{ - update(); - vec3f zeroVec(0.f,0.f,0.f); - vec3f minusXVec(-1.f,0.f,0.f); - vec3f posXVec(1.f,0.f,0.f); - vec3f minusYVec (0.f,-1.f,0.f); - vec3f posYVec (0.f,1.f,0.f); - vec3f minusZVec (0.f,0.f,-1.f); - vec3f posZVec (0.f,0.f,1.f); - - view.beginGL(); - glPushAttrib( GL_ALL_ATTRIB_BITS ); - - glDisable(GL_LIGHTING); - - if( !(status == M3dView::kActive || - status == M3dView::kLead || - status == M3dView::kHilite || - ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) { - glColor3f(1.0, 1.0, 0.0); - } - - vec3f posA, posB, pivB; - rigid_body_t::pointer rigid_bodyB = NULL; - if (m_constraint) - { - vec3f pos; - quatf rot; - m_constraint->rigid_bodyA()->get_transform(pos, rot); - m_constraint->worldToA(pos, posA); - rigid_bodyB = m_constraint->rigid_bodyB(); - if(rigid_bodyB) - { - rigid_bodyB->get_transform(pos, rot); - m_constraint->worldToA(pos, posB); - } - m_constraint->worldFromB(zeroVec, pos); - m_constraint->worldToA(pos, pivB); - } - - glBegin(GL_LINES); - glVertex3f(0.0, 0.0, 0.0); - glVertex3f(posA[0], posA[1], posA[2]); - - glVertex3f(0.0, 0.0, 0.0); - glVertex3f(pivB[0], pivB[1], pivB[2]); - - if(rigid_bodyB) - { - glVertex3f(pivB[0], pivB[1], pivB[2]); - glVertex3f(posB[0], posB[1], posB[2]); - } - - - glVertex3f(-1.0, 0.0, 0.0); - glVertex3f(1.0, 0.0, 0.0); - - glVertex3f(0.0, -1.0, 0.0); - glVertex3f(0.0, 1.0, 0.0); - - glVertex3f(0.0, 0.0, -1.0); - glVertex3f(0.0, 0.0, 1.0); - - vec3f posT, posP, posM; - - m_constraint->worldFromB(minusXVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posXVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - m_constraint->worldFromB(minusYVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posYVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - m_constraint->worldFromB(minusZVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posZVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - - - glEnd(); - - glPopAttrib(); - view.endGL(); -} - -bool sixdofConstraintNode::isBounded() const -{ - //return true; - return false; -} - -MBoundingBox sixdofConstraintNode::boundingBox() const -{ - // std::cout << "sixdofConstraintNode::boundingBox()" << std::endl; - //load the pdbs - MObject node = thisMObject(); - - MPoint corner1(-1, -1, -1); - MPoint corner2(1, 1, 1); - return MBoundingBox(corner1, corner2); -} - -//standard attributes -void sixdofConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data) -{ - // std::cout << "sixdofConstraintNode::computeConstraint" << std::endl; - - MObject thisObject(thisMObject()); - MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); - MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); - MObject update; - //force evaluation of the rigidBody - plgRigidBodyA.getValue(update); - plgRigidBodyB.getValue(update); - - rigid_body_t::pointer rigid_bodyA; - if(plgRigidBodyA.isConnected()) { - MPlugArray connections; - plgRigidBodyA.connectedTo(connections, true, true); - if(connections.length() != 0) { - MFnDependencyNode fnNodeA(connections[0].node()); - if(fnNodeA.typeId() == rigidBodyNode::typeId) { - rigidBodyNode *pRigidBodyNodeA = static_cast(fnNodeA.userNode()); - rigid_bodyA = pRigidBodyNodeA->rigid_body(); - } else { - std::cout << "sixdofConstraintNode connected to a non-rigidbody node!" << std::endl; - } - } - } - - rigid_body_t::pointer rigid_bodyB; - if(plgRigidBodyB.isConnected()) { - MPlugArray connections; - plgRigidBodyB.connectedTo(connections, true, true); - if(connections.length() != 0) { - MFnDependencyNode fnNodeB(connections[0].node()); - if(fnNodeB.typeId() == rigidBodyNode::typeId) { - rigidBodyNode *pRigidBodyNodeB = static_cast(fnNodeB.userNode()); - rigid_bodyB = pRigidBodyNodeB->rigid_body(); - } else { - std::cout << "sixdofConstraintNode connected to a non-rigidbody node!" << std::endl; - } - } - } - - vec3f pivInA, pivInB; - - if((rigid_bodyA != NULL) && (rigid_bodyB != NULL)) - { - constraint_t::pointer constraint = static_cast(m_constraint); - solver_t::remove_constraint(constraint); - float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); - float3& mPivInB = data.inputValue(ia_pivotInB).asFloat3(); - for(int i = 0; i < 3; i++) - { - pivInA[i] = (float)mPivInA[i]; - pivInB[i] = (float)mPivInB[i]; - } - float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); - MEulerRotation meulerA(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); - MQuaternion mquatA = meulerA.asQuaternion(); - quatf rotA((float)mquatA.w, (float)mquatA.x, (float)mquatA.y, (float)mquatA.z); - float3& mRotInB = data.inputValue(ia_rotationInB).asFloat3(); - MEulerRotation meulerB(deg2rad(mRotInB[0]), deg2rad(mRotInB[1]), deg2rad(mRotInB[2])); - MQuaternion mquatB = meulerB.asQuaternion(); - quatf rotB((float)mquatB.w, (float)mquatB.x, (float)mquatB.y, (float)mquatB.z); - m_constraint = solver_t::create_sixdof_constraint(rigid_bodyA, pivInA, rotA, rigid_bodyB, pivInB, rotB); - constraint = static_cast(m_constraint); - solver_t::add_constraint(constraint); - } - else if(rigid_bodyA != NULL) - { - //not connected to a rigid body, put a default one - constraint_t::pointer constraint = static_cast(m_constraint); - solver_t::remove_constraint(constraint); - float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); - for(int i = 0; i < 3; i++) - { - pivInA[i] = (float)mPivInA[i]; - } - float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); - MEulerRotation meuler(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); - MQuaternion mquat = meuler.asQuaternion(); - quatf rotA((float)mquat.w, (float)mquat.x, (float)mquat.y, (float)mquat.z); - m_constraint = solver_t::create_sixdof_constraint(rigid_bodyA, pivInA, rotA); - constraint = static_cast(m_constraint); - solver_t::add_constraint(constraint); - } - - data.outputValue(ca_constraint).set(true); - data.setClean(plug); -} - - -void sixdofConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) -{ - MObject thisObject(thisMObject()); - MFnDagNode fnDagNode(thisObject); - - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - - MStatus status; - MFnTransform fnParentTransform(fnDagNode.parent(0, &status)); - double fixScale[3] = { 1., 1., 1. }; // lock scale - fnParentTransform.setScale(fixScale); - MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform, &status); - - if(dSolverNode::isStartTime) - { // allow to edit pivots - MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); - MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); - MObject update; - //force evaluation of the rigidBody - plgRigidBodyA.getValue(update); - if(plgRigidBodyA.isConnected()) - { - MPlugArray connections; - plgRigidBodyA.connectedTo(connections, true, true); - if(connections.length() != 0) - { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) - { - MObject rbAObj = fnNode.object(); - rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); - MPlug(rbAObj, pRigidBodyNodeA->worldMatrix).elementByLogicalIndex(0).getValue(update); - } - } - } - plgRigidBodyB.getValue(update); - if(plgRigidBodyB.isConnected()) - { - MPlugArray connections; - plgRigidBodyB.connectedTo(connections, true, true); - if(connections.length() != 0) - { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) - { - MObject rbBObj = fnNode.object(); - rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); - MPlug(rbBObj, pRigidBodyNodeB->worldMatrix).elementByLogicalIndex(0).getValue(update); - } - } - } - if(m_constraint) - { - MQuaternion mrotation; - fnParentTransform.getRotation(mrotation, MSpace::kTransform); - bool doUpdatePivot = m_constraint->getPivotChanged(); - if(!doUpdatePivot) - { - vec3f worldP; - quatf worldR; - m_constraint->get_world(worldP, worldR); - float deltaPX = worldP[0] - float(mtranslation.x); - float deltaPY = worldP[1] - float(mtranslation.y); - float deltaPZ = worldP[2] - float(mtranslation.z); - float deltaRX = (float)mrotation.x - worldR[1]; - float deltaRY = (float)mrotation.y - worldR[2]; - float deltaRZ = (float)mrotation.z - worldR[3]; - float deltaRW = (float)mrotation.w - worldR[0]; - float deltaSq = deltaPX * deltaPX + deltaPY * deltaPY + deltaPZ * deltaPZ - + deltaRX * deltaRX + deltaRY * deltaRY + deltaRZ * deltaRZ + deltaRW * deltaRW; - doUpdatePivot = (deltaSq > FLT_EPSILON); - } - if(doUpdatePivot) - { - m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]), - quatf((float)mrotation.w, (float)mrotation.x, (float)mrotation.y, (float)mrotation.z)); - vec3f pivInA, pivInB; - quatf rotInA, rotInB; - m_constraint->get_frameA(pivInA, rotInA); - m_constraint->get_frameB(pivInB, rotInB); - MDataHandle hPivInA = data.outputValue(ia_pivotInA); - float3 &ihPivInA = hPivInA.asFloat3(); - MDataHandle hPivInB = data.outputValue(ia_pivotInB); - float3 &ihPivInB = hPivInB.asFloat3(); - for(int i = 0; i < 3; i++) - { - ihPivInA[i] = pivInA[i]; - ihPivInB[i] = pivInB[i]; - } - MDataHandle hRotInA = data.outputValue(ia_rotationInA); - float3 &hrotInA = hRotInA.asFloat3(); - MQuaternion mrotA(rotInA[1], rotInA[2], rotInA[3], rotInA[0]); - MEulerRotation newrotA(mrotA.asEulerRotation()); - hrotInA[0] = rad2deg((float)newrotA.x); - hrotInA[1] = rad2deg((float)newrotA.y); - hrotInA[2] = rad2deg((float)newrotA.z); - MDataHandle hRotInB = data.outputValue(ia_rotationInB); - float3 &hrotInB = hRotInB.asFloat3(); - MQuaternion mrotB(rotInB[1], rotInB[2], rotInB[3], rotInB[0]); - MEulerRotation newrotB(mrotB.asEulerRotation()); - hrotInB[0] = rad2deg((float)newrotB.x); - hrotInB[1] = rad2deg((float)newrotB.y); - hrotInB[2] = rad2deg((float)newrotB.z); - m_constraint->setPivotChanged(false); - } - } - } - else - { // if not start time, lock position and rotation - if(m_constraint) - { - vec3f worldP; - quatf worldR; - m_constraint->get_world(worldP, worldR); - fnParentTransform.setTranslation(MVector(worldP[0], worldP[1], worldP[2]), MSpace::kTransform); - fnParentTransform.setRotation(MQuaternion(worldR[1], worldR[2], worldR[3], worldR[0])); - } - } - data.setClean(plug); -} - -void sixdofConstraintNode::computeConstraintParam(const MPlug& plug, MDataBlock& data) -{ - // std::cout << "sixdofConstraintNode::computeRigidBodyParam" << std::endl; - - MObject thisObject(thisMObject()); - MObject update; - - MPlug(thisObject, ca_constraint).getValue(update); - if(m_constraint) { - m_constraint->set_damping((float) data.inputValue(ia_damping).asDouble()); - vec3f lowLin, uppLin, lowAng, uppAng; - float3& mLowLin = data.inputValue(ia_lowerLinLimit).asFloat3(); - float3& mUppLin = data.inputValue(ia_upperLinLimit).asFloat3(); - float3& mLowAng = data.inputValue(ia_lowerAngLimit).asFloat3(); - float3& mUppAng = data.inputValue(ia_upperAngLimit).asFloat3(); - for(int j = 0; j < 3; j++) - { - lowLin[j] = mLowLin[j]; - uppLin[j] = mUppLin[j]; - lowAng[j] = deg2rad(mLowAng[j]); - uppAng[j] = deg2rad(mUppAng[j]); - } - m_constraint->set_LinLimit(lowLin, uppLin); - m_constraint->set_AngLimit(lowAng, uppAng); - } - - data.outputValue(ca_constraintParam).set(true); - data.setClean(plug); -} - -sixdof_constraint_t::pointer sixdofConstraintNode::constraint() -{ - // std::cout << "sixdofConstraintNode::rigid_body" << std::endl; - - MObject thisObject(thisMObject()); - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - - return m_constraint; -} - -void sixdofConstraintNode::update() -{ - MObject thisObject(thisMObject()); - - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law + +Modified by Roman Ponomarev +01/22/2010 : Constraints reworked +*/ + +//sixdofConstraintNode.cpp + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rigidBodyNode.h" +#include "sixdofConstraintNode.h" +#include "mayaUtils.h" + +#include "solver.h" +#include "dSolverNode.h" +#include "constraint/bt_sixdof_constraint.h" + +MTypeId sixdofConstraintNode::typeId(0x100384); +MString sixdofConstraintNode::typeName("dSixdofConstraint"); + +MObject sixdofConstraintNode::ia_rigidBodyA; +MObject sixdofConstraintNode::ia_rigidBodyB; +MObject sixdofConstraintNode::ia_damping; +MObject sixdofConstraintNode::ca_constraint; +MObject sixdofConstraintNode::ca_constraintParam; +MObject sixdofConstraintNode::ia_lowerLinLimit; +MObject sixdofConstraintNode::ia_upperLinLimit; +MObject sixdofConstraintNode::ia_lowerAngLimit; +MObject sixdofConstraintNode::ia_upperAngLimit; +MObject sixdofConstraintNode::ia_rotationInA; +MObject sixdofConstraintNode::ia_rotationInB; +MObject sixdofConstraintNode::ia_pivotInA; +MObject sixdofConstraintNode::ia_pivotInB; + +MStatus sixdofConstraintNode::initialize() +{ + MStatus status; + MFnMessageAttribute fnMsgAttr; + MFnNumericAttribute fnNumericAttr; + MFnMatrixAttribute fnMatrixAttr; + + ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status); + MCHECKSTATUS(status, "creating inRigidBodyA attribute") + status = addAttribute(ia_rigidBodyA); + MCHECKSTATUS(status, "adding inRigidBody attribute") + + ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status); + MCHECKSTATUS(status, "creating inRigidBodyB attribute") + status = addAttribute(ia_rigidBodyB); + MCHECKSTATUS(status, "adding inRigidBodyB attribute") + + ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating damping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_damping); + MCHECKSTATUS(status, "adding damping attribute") + + ia_lowerLinLimit = fnNumericAttr.createPoint("lowerLinLimit", "lllt", &status); + MCHECKSTATUS(status, "creating lower linear limit attribute") + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_lowerLinLimit); + MCHECKSTATUS(status, "adding lower linear limit attribute") + + ia_upperLinLimit = fnNumericAttr.createPoint("upperLinLimit", "ullt", &status); + MCHECKSTATUS(status, "creating upper linear limit attribute") + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_upperLinLimit); + MCHECKSTATUS(status, "adding upper linear limit attribute") + + ia_lowerAngLimit = fnNumericAttr.createPoint("lowerAngLimit", "lalt", &status); + MCHECKSTATUS(status, "creating lower angular limit attribute") + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_lowerAngLimit); + MCHECKSTATUS(status, "adding lower angular limit attribute") + + ia_upperAngLimit = fnNumericAttr.createPoint("upperAngLimit", "ualt", &status); + MCHECKSTATUS(status, "creating upper angular limit attribute") + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_upperAngLimit); + MCHECKSTATUS(status, "adding upper angular limit attribute") + + ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_constraint attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_constraint); + MCHECKSTATUS(status, "adding ca_constraint attribute") + + + ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_constraintParam attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_constraintParam); + MCHECKSTATUS(status, "adding ca_constraintParam attribute") + + ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating rotationInA attribute") + status = addAttribute(ia_rotationInA); + MCHECKSTATUS(status, "adding rotationInA attribute") + + ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating rotationInB attribute") + status = addAttribute(ia_rotationInB); + MCHECKSTATUS(status, "adding rotationInB attribute") + + ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating pivotInA attribute") + status = addAttribute(ia_pivotInA); + MCHECKSTATUS(status, "adding pivotInA attribute") + + ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating pivotInB attribute") + status = addAttribute(ia_pivotInB); + MCHECKSTATUS(status, "adding pivotInB attribute") + + + status = attributeAffects(ia_rigidBodyA, ca_constraint); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") + + status = attributeAffects(ia_rigidBodyA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") + + status = attributeAffects(ia_rigidBodyB, ca_constraint); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") + + status = attributeAffects(ia_rigidBodyB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") + + status = attributeAffects(ia_damping, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") + + status = attributeAffects(ia_lowerLinLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLinLimit, ca_constraintParam)") + + status = attributeAffects(ia_upperLinLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_upperLinLimit, ca_constraintParam)") + + status = attributeAffects(ia_lowerAngLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_lowerAngLimit, ca_constraintParam)") + + status = attributeAffects(ia_upperAngLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_upperAngLimit, ca_constraintParam)") + + status = attributeAffects(ia_rotationInA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") + status = attributeAffects(ia_rotationInB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") + + status = attributeAffects(ia_pivotInA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") + status = attributeAffects(ia_pivotInB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") + + + return MS::kSuccess; +} + +sixdofConstraintNode::sixdofConstraintNode() +{ + // std::cout << "sixdofConstraintNode::sixdofConstraintNode" << std::endl; +} + +sixdofConstraintNode::~sixdofConstraintNode() +{ + // std::cout << "sixdofConstraintNode::~sixdofConstraintNode" << std::endl; +} + +void sixdofConstraintNode::nodeRemoved(MObject& node, void *clientData) +{ + // std::cout << "sixdofConstraintNode::nodeRemoved" << std::endl; + MFnDependencyNode fnNode(node); + sixdofConstraintNode *pNode = static_cast(fnNode.userNode()); + if (pNode->m_constraint) + { + bt_sixdof_constraint_t* hinge_impl = dynamic_cast(pNode->m_constraint->pubImpl()); + rigid_body_t::pointer rigid_bodyA = pNode->m_constraint->rigid_bodyA(); + if(rigid_bodyA) + { + rigid_bodyA->remove_constraint(hinge_impl); + } + rigid_body_t::pointer rigid_bodyB = pNode->m_constraint->rigid_bodyB(); + if(rigid_bodyB) + { + rigid_bodyB->remove_constraint(hinge_impl); + } + } + constraint_t::pointer constraint = static_cast(pNode->m_constraint); + solver_t::remove_constraint(constraint); +} + +void* sixdofConstraintNode::creator() +{ + return new sixdofConstraintNode(); +} + + +bool sixdofConstraintNode::setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx) +{ + /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { + m_framesDirty = true; + } else if(plug == textureFiles) { + gpufx::m_renderer.setColorTextureDirty(); + }*/ + return false; //setInternalValueInContext(plug,dataHandle,ctx); +} + +MStatus sixdofConstraintNode::compute(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "sixdofConstraintNode::compute: " << plug.name() << std::endl; + //MTime time = data.inputValue( sixdofConstraintNode::inTime ).asTime(); + if(plug == ca_constraint) { + computeConstraint(plug, data); + } else if(plug == ca_constraintParam) { + computeConstraintParam(plug, data); + } else if(plug.isElement()) { + if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { + computeWorldMatrix(plug, data); + } else { + return MStatus::kUnknownParameter; + } + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +void sixdofConstraintNode::draw( M3dView & view, const MDagPath &path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ) +{ + update(); + vec3f zeroVec(0.f,0.f,0.f); + vec3f minusXVec(-1.f,0.f,0.f); + vec3f posXVec(1.f,0.f,0.f); + vec3f minusYVec (0.f,-1.f,0.f); + vec3f posYVec (0.f,1.f,0.f); + vec3f minusZVec (0.f,0.f,-1.f); + vec3f posZVec (0.f,0.f,1.f); + + view.beginGL(); + glPushAttrib( GL_ALL_ATTRIB_BITS ); + + glDisable(GL_LIGHTING); + + if( !(status == M3dView::kActive || + status == M3dView::kLead || + status == M3dView::kHilite || + ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) { + glColor3f(1.0, 1.0, 0.0); + } + + vec3f posA, posB, pivB; + rigid_body_t::pointer rigid_bodyB = NULL; + if (m_constraint) + { + vec3f pos; + quatf rot; + m_constraint->rigid_bodyA()->get_transform(pos, rot); + m_constraint->worldToA(pos, posA); + rigid_bodyB = m_constraint->rigid_bodyB(); + if(rigid_bodyB) + { + rigid_bodyB->get_transform(pos, rot); + m_constraint->worldToA(pos, posB); + } + m_constraint->worldFromB(zeroVec, pos); + m_constraint->worldToA(pos, pivB); + } + + glBegin(GL_LINES); + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(posA[0], posA[1], posA[2]); + + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(pivB[0], pivB[1], pivB[2]); + + if(rigid_bodyB) + { + glVertex3f(pivB[0], pivB[1], pivB[2]); + glVertex3f(posB[0], posB[1], posB[2]); + } + + + glVertex3f(-1.0, 0.0, 0.0); + glVertex3f(1.0, 0.0, 0.0); + + glVertex3f(0.0, -1.0, 0.0); + glVertex3f(0.0, 1.0, 0.0); + + glVertex3f(0.0, 0.0, -1.0); + glVertex3f(0.0, 0.0, 1.0); + + vec3f posT, posP, posM; + + m_constraint->worldFromB(minusXVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posXVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + m_constraint->worldFromB(minusYVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posYVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + m_constraint->worldFromB(minusZVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posZVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + + + glEnd(); + + glPopAttrib(); + view.endGL(); +} + +bool sixdofConstraintNode::isBounded() const +{ + //return true; + return false; +} + +MBoundingBox sixdofConstraintNode::boundingBox() const +{ + // std::cout << "sixdofConstraintNode::boundingBox()" << std::endl; + //load the pdbs + MObject node = thisMObject(); + + MPoint corner1(-1, -1, -1); + MPoint corner2(1, 1, 1); + return MBoundingBox(corner1, corner2); +} + +//standard attributes +void sixdofConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "sixdofConstraintNode::computeConstraint" << std::endl; + + MObject thisObject(thisMObject()); + MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); + MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); + MObject update; + //force evaluation of the rigidBody + plgRigidBodyA.getValue(update); + plgRigidBodyB.getValue(update); + + rigid_body_t::pointer rigid_bodyA; + if(plgRigidBodyA.isConnected()) { + MPlugArray connections; + plgRigidBodyA.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNodeA(connections[0].node()); + if(fnNodeA.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *pRigidBodyNodeA = static_cast(fnNodeA.userNode()); + rigid_bodyA = pRigidBodyNodeA->rigid_body(); + } else { + std::cout << "sixdofConstraintNode connected to a non-rigidbody node!" << std::endl; + } + } + } + + rigid_body_t::pointer rigid_bodyB; + if(plgRigidBodyB.isConnected()) { + MPlugArray connections; + plgRigidBodyB.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNodeB(connections[0].node()); + if(fnNodeB.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *pRigidBodyNodeB = static_cast(fnNodeB.userNode()); + rigid_bodyB = pRigidBodyNodeB->rigid_body(); + } else { + std::cout << "sixdofConstraintNode connected to a non-rigidbody node!" << std::endl; + } + } + } + + vec3f pivInA, pivInB; + + if((rigid_bodyA != NULL) && (rigid_bodyB != NULL)) + { + constraint_t::pointer constraint = static_cast(m_constraint); + solver_t::remove_constraint(constraint); + float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); + float3& mPivInB = data.inputValue(ia_pivotInB).asFloat3(); + for(int i = 0; i < 3; i++) + { + pivInA[i] = (float)mPivInA[i]; + pivInB[i] = (float)mPivInB[i]; + } + float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); + MEulerRotation meulerA(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); + MQuaternion mquatA = meulerA.asQuaternion(); + quatf rotA((float)mquatA.w, (float)mquatA.x, (float)mquatA.y, (float)mquatA.z); + float3& mRotInB = data.inputValue(ia_rotationInB).asFloat3(); + MEulerRotation meulerB(deg2rad(mRotInB[0]), deg2rad(mRotInB[1]), deg2rad(mRotInB[2])); + MQuaternion mquatB = meulerB.asQuaternion(); + quatf rotB((float)mquatB.w, (float)mquatB.x, (float)mquatB.y, (float)mquatB.z); + m_constraint = solver_t::create_sixdof_constraint(rigid_bodyA, pivInA, rotA, rigid_bodyB, pivInB, rotB); + constraint = static_cast(m_constraint); + solver_t::add_constraint(constraint); + } + else if(rigid_bodyA != NULL) + { + //not connected to a rigid body, put a default one + constraint_t::pointer constraint = static_cast(m_constraint); + solver_t::remove_constraint(constraint); + float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); + for(int i = 0; i < 3; i++) + { + pivInA[i] = (float)mPivInA[i]; + } + float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); + MEulerRotation meuler(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); + MQuaternion mquat = meuler.asQuaternion(); + quatf rotA((float)mquat.w, (float)mquat.x, (float)mquat.y, (float)mquat.z); + m_constraint = solver_t::create_sixdof_constraint(rigid_bodyA, pivInA, rotA); + constraint = static_cast(m_constraint); + solver_t::add_constraint(constraint); + } + + data.outputValue(ca_constraint).set(true); + data.setClean(plug); +} + + +void sixdofConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) +{ + MObject thisObject(thisMObject()); + MFnDagNode fnDagNode(thisObject); + + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + + MStatus status; + MFnTransform fnParentTransform(fnDagNode.parent(0, &status)); + double fixScale[3] = { 1., 1., 1. }; // lock scale + fnParentTransform.setScale(fixScale); + MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform, &status); + + if(dSolverNode::isStartTime) + { // allow to edit pivots + MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); + MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); + MObject update; + //force evaluation of the rigidBody + plgRigidBodyA.getValue(update); + if(plgRigidBodyA.isConnected()) + { + MPlugArray connections; + plgRigidBodyA.connectedTo(connections, true, true); + if(connections.length() != 0) + { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) + { + MObject rbAObj = fnNode.object(); + rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); + MPlug(rbAObj, pRigidBodyNodeA->worldMatrix).elementByLogicalIndex(0).getValue(update); + } + } + } + plgRigidBodyB.getValue(update); + if(plgRigidBodyB.isConnected()) + { + MPlugArray connections; + plgRigidBodyB.connectedTo(connections, true, true); + if(connections.length() != 0) + { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) + { + MObject rbBObj = fnNode.object(); + rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); + MPlug(rbBObj, pRigidBodyNodeB->worldMatrix).elementByLogicalIndex(0).getValue(update); + } + } + } + if(m_constraint) + { + MQuaternion mrotation; + fnParentTransform.getRotation(mrotation, MSpace::kTransform); + bool doUpdatePivot = m_constraint->getPivotChanged(); + if(!doUpdatePivot) + { + vec3f worldP; + quatf worldR; + m_constraint->get_world(worldP, worldR); + float deltaPX = worldP[0] - float(mtranslation.x); + float deltaPY = worldP[1] - float(mtranslation.y); + float deltaPZ = worldP[2] - float(mtranslation.z); + float deltaRX = (float)mrotation.x - worldR[1]; + float deltaRY = (float)mrotation.y - worldR[2]; + float deltaRZ = (float)mrotation.z - worldR[3]; + float deltaRW = (float)mrotation.w - worldR[0]; + float deltaSq = deltaPX * deltaPX + deltaPY * deltaPY + deltaPZ * deltaPZ + + deltaRX * deltaRX + deltaRY * deltaRY + deltaRZ * deltaRZ + deltaRW * deltaRW; + doUpdatePivot = (deltaSq > FLT_EPSILON); + } + if(doUpdatePivot) + { + m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]), + quatf((float)mrotation.w, (float)mrotation.x, (float)mrotation.y, (float)mrotation.z)); + vec3f pivInA, pivInB; + quatf rotInA, rotInB; + m_constraint->get_frameA(pivInA, rotInA); + m_constraint->get_frameB(pivInB, rotInB); + MDataHandle hPivInA = data.outputValue(ia_pivotInA); + float3 &ihPivInA = hPivInA.asFloat3(); + MDataHandle hPivInB = data.outputValue(ia_pivotInB); + float3 &ihPivInB = hPivInB.asFloat3(); + for(int i = 0; i < 3; i++) + { + ihPivInA[i] = pivInA[i]; + ihPivInB[i] = pivInB[i]; + } + MDataHandle hRotInA = data.outputValue(ia_rotationInA); + float3 &hrotInA = hRotInA.asFloat3(); + MQuaternion mrotA(rotInA[1], rotInA[2], rotInA[3], rotInA[0]); + MEulerRotation newrotA(mrotA.asEulerRotation()); + hrotInA[0] = rad2deg((float)newrotA.x); + hrotInA[1] = rad2deg((float)newrotA.y); + hrotInA[2] = rad2deg((float)newrotA.z); + MDataHandle hRotInB = data.outputValue(ia_rotationInB); + float3 &hrotInB = hRotInB.asFloat3(); + MQuaternion mrotB(rotInB[1], rotInB[2], rotInB[3], rotInB[0]); + MEulerRotation newrotB(mrotB.asEulerRotation()); + hrotInB[0] = rad2deg((float)newrotB.x); + hrotInB[1] = rad2deg((float)newrotB.y); + hrotInB[2] = rad2deg((float)newrotB.z); + m_constraint->setPivotChanged(false); + } + } + } + else + { // if not start time, lock position and rotation + if(m_constraint) + { + vec3f worldP; + quatf worldR; + m_constraint->get_world(worldP, worldR); + fnParentTransform.setTranslation(MVector(worldP[0], worldP[1], worldP[2]), MSpace::kTransform); + fnParentTransform.setRotation(MQuaternion(worldR[1], worldR[2], worldR[3], worldR[0])); + } + } + data.setClean(plug); +} + +void sixdofConstraintNode::computeConstraintParam(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "sixdofConstraintNode::computeRigidBodyParam" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + + MPlug(thisObject, ca_constraint).getValue(update); + if(m_constraint) { + m_constraint->set_damping((float) data.inputValue(ia_damping).asDouble()); + vec3f lowLin, uppLin, lowAng, uppAng; + float3& mLowLin = data.inputValue(ia_lowerLinLimit).asFloat3(); + float3& mUppLin = data.inputValue(ia_upperLinLimit).asFloat3(); + float3& mLowAng = data.inputValue(ia_lowerAngLimit).asFloat3(); + float3& mUppAng = data.inputValue(ia_upperAngLimit).asFloat3(); + for(int j = 0; j < 3; j++) + { + lowLin[j] = mLowLin[j]; + uppLin[j] = mUppLin[j]; + lowAng[j] = deg2rad(mLowAng[j]); + uppAng[j] = deg2rad(mUppAng[j]); + } + m_constraint->set_LinLimit(lowLin, uppLin); + m_constraint->set_AngLimit(lowAng, uppAng); + } + + data.outputValue(ca_constraintParam).set(true); + data.setClean(plug); +} + +sixdof_constraint_t::pointer sixdofConstraintNode::constraint() +{ + // std::cout << "sixdofConstraintNode::rigid_body" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + + return m_constraint; +} + +void sixdofConstraintNode::update() +{ + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); +} diff --git a/Extras/MayaPlugin/constraint/sliderConstraintNode.cpp b/Extras/MayaPlugin/constraint/sliderConstraintNode.cpp index 671d5c44d..40bbc6006 100644 --- a/Extras/MayaPlugin/constraint/sliderConstraintNode.cpp +++ b/Extras/MayaPlugin/constraint/sliderConstraintNode.cpp @@ -1,635 +1,635 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Herbert Law - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Herbert Law - -Modified by Roman Ponomarev -01/22/2010 : Constraints reworked -*/ - -//sliderConstraintNode.cpp - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rigidBodyNode.h" -#include "sliderConstraintNode.h" -#include "mayaUtils.h" - -#include "solver.h" -#include "dSolverNode.h" -#include "constraint/bt_slider_constraint.h" - -MTypeId sliderConstraintNode::typeId(0x100385); -MString sliderConstraintNode::typeName("dSliderConstraint"); - -MObject sliderConstraintNode::ia_rigidBodyA; -MObject sliderConstraintNode::ia_rigidBodyB; -MObject sliderConstraintNode::ia_damping; -MObject sliderConstraintNode::ca_constraint; -MObject sliderConstraintNode::ca_constraintParam; -MObject sliderConstraintNode::ia_lowerLinLimit; -MObject sliderConstraintNode::ia_upperLinLimit; -MObject sliderConstraintNode::ia_lowerAngLimit; -MObject sliderConstraintNode::ia_upperAngLimit; -MObject sliderConstraintNode::ia_rotationInA; -MObject sliderConstraintNode::ia_rotationInB; -MObject sliderConstraintNode::ia_pivotInA; -MObject sliderConstraintNode::ia_pivotInB; - -MStatus sliderConstraintNode::initialize() -{ - MStatus status; - MFnMessageAttribute fnMsgAttr; - MFnNumericAttribute fnNumericAttr; - MFnMatrixAttribute fnMatrixAttr; - - ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status); - MCHECKSTATUS(status, "creating inRigidBodyA attribute") - status = addAttribute(ia_rigidBodyA); - MCHECKSTATUS(status, "adding inRigidBody attribute") - - ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status); - MCHECKSTATUS(status, "creating inRigidBodyB attribute") - status = addAttribute(ia_rigidBodyB); - MCHECKSTATUS(status, "adding inRigidBodyB attribute") - - ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); - MCHECKSTATUS(status, "creating damping attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_damping); - MCHECKSTATUS(status, "adding damping attribute") - - ia_lowerLinLimit = fnNumericAttr.create("lowerLinLimit", "lllt", MFnNumericData::kDouble, 1, &status); - MCHECKSTATUS(status, "creating lower linear limit attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_lowerLinLimit); - MCHECKSTATUS(status, "adding lower linear limit attribute") - - ia_upperLinLimit = fnNumericAttr.create("upperLinLimit", "ullt", MFnNumericData::kDouble, -1, &status); - MCHECKSTATUS(status, "creating upper linear limit attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_upperLinLimit); - MCHECKSTATUS(status, "adding upper linear limit attribute") - - ia_lowerAngLimit = fnNumericAttr.create("lowerAngLimit", "lalt", MFnNumericData::kDouble, 0, &status); - MCHECKSTATUS(status, "creating lower angular limit attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_lowerAngLimit); - MCHECKSTATUS(status, "adding lower angular limit attribute") - - ia_upperAngLimit = fnNumericAttr.create("upperAngLimit", "ualt", MFnNumericData::kDouble, 0, &status); - MCHECKSTATUS(status, "creating upper angular limit attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_upperAngLimit); - MCHECKSTATUS(status, "adding upper angular limit attribute") - - ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); - MCHECKSTATUS(status, "creating ca_constraint attribute") - fnNumericAttr.setConnectable(false); - fnNumericAttr.setHidden(true); - fnNumericAttr.setStorable(false); - fnNumericAttr.setKeyable(false); - status = addAttribute(ca_constraint); - MCHECKSTATUS(status, "adding ca_constraint attribute") - - ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); - MCHECKSTATUS(status, "creating ca_constraintParam attribute") - fnNumericAttr.setConnectable(false); - fnNumericAttr.setHidden(true); - fnNumericAttr.setStorable(false); - fnNumericAttr.setKeyable(false); - status = addAttribute(ca_constraintParam); - MCHECKSTATUS(status, "adding ca_constraintParam attribute") - - - ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating rotationInA attribute") - status = addAttribute(ia_rotationInA); - MCHECKSTATUS(status, "adding rotationInA attribute") - - ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating rotationInB attribute") - status = addAttribute(ia_rotationInB); - MCHECKSTATUS(status, "adding rotationInB attribute") - - ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating pivotInA attribute") - status = addAttribute(ia_pivotInA); - MCHECKSTATUS(status, "adding pivotInA attribute") - - ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); - status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); - MCHECKSTATUS(status, "creating pivotInB attribute") - status = addAttribute(ia_pivotInB); - MCHECKSTATUS(status, "adding pivotInB attribute") - - - status = attributeAffects(ia_rigidBodyA, ca_constraint); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") - - status = attributeAffects(ia_rigidBodyA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") - - status = attributeAffects(ia_rigidBodyB, ca_constraint); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") - - status = attributeAffects(ia_rigidBodyB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") - - status = attributeAffects(ia_damping, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") - - status = attributeAffects(ia_lowerLinLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLinLimit, ca_constraintParam)") - - status = attributeAffects(ia_upperLinLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_upperLinLimit, ca_constraintParam)") - - status = attributeAffects(ia_lowerAngLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_lowerAngLimit, ca_constraintParam)") - - status = attributeAffects(ia_upperAngLimit, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_upperAngLimit, ca_constraintParam)") - - status = attributeAffects(ia_rotationInA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") - status = attributeAffects(ia_rotationInB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") - - status = attributeAffects(ia_pivotInA, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") - status = attributeAffects(ia_pivotInB, ca_constraintParam); - MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") - - - return MS::kSuccess; -} - -sliderConstraintNode::sliderConstraintNode() -{ - // std::cout << "sliderConstraintNode::sliderConstraintNode" << std::endl; -} - -sliderConstraintNode::~sliderConstraintNode() -{ - // std::cout << "sliderConstraintNode::~sliderConstraintNode" << std::endl; -} - -void sliderConstraintNode::nodeRemoved(MObject& node, void *clientData) -{ - // std::cout << "sliderConstraintNode::nodeRemoved" << std::endl; - MFnDependencyNode fnNode(node); - sliderConstraintNode *pNode = static_cast(fnNode.userNode()); - if (pNode->m_constraint) - { - bt_slider_constraint_t* hinge_impl = dynamic_cast(pNode->m_constraint->pubImpl()); - rigid_body_t::pointer rigid_bodyA = pNode->m_constraint->rigid_bodyA(); - if(rigid_bodyA) - { - rigid_bodyA->remove_constraint(hinge_impl); - } - rigid_body_t::pointer rigid_bodyB = pNode->m_constraint->rigid_bodyB(); - if(rigid_bodyB) - { - rigid_bodyB->remove_constraint(hinge_impl); - } - } - constraint_t::pointer constraint = static_cast(pNode->m_constraint); - solver_t::remove_constraint(constraint); -} - -void* sliderConstraintNode::creator() -{ - return new sliderConstraintNode(); -} - - -bool sliderConstraintNode::setInternalValueInContext ( const MPlug & plug, - const MDataHandle & dataHandle, - MDGContext & ctx) -{ - /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { - m_framesDirty = true; - } else if(plug == textureFiles) { - gpufx::m_renderer.setColorTextureDirty(); - }*/ - return false; //setInternalValueInContext(plug,dataHandle,ctx); -} - -MStatus sliderConstraintNode::compute(const MPlug& plug, MDataBlock& data) -{ - //std::cout << "sliderConstraintNode::compute: " << plug.name() << std::endl; - //MTime time = data.inputValue( sliderConstraintNode::inTime ).asTime(); - if(plug == ca_constraint) { - computeConstraint(plug, data); - } else if(plug == ca_constraintParam) { - computeConstraintParam(plug, data); - } else if(plug.isElement()) { - if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { - computeWorldMatrix(plug, data); - } else { - return MStatus::kUnknownParameter; - } - } else { - return MStatus::kUnknownParameter; - } - return MStatus::kSuccess; -} - -void sliderConstraintNode::draw( M3dView & view, const MDagPath &path, - M3dView::DisplayStyle style, - M3dView::DisplayStatus status ) -{ - update(); - vec3f zeroVec(0.f,0.f,0.f); - vec3f minusXVec(-1.f,0.f,0.f); - vec3f posXVec(1.f,0.f,0.f); - vec3f minusYVec (0.f,-1.f,0.f); - vec3f posYVec (0.f,1.f,0.f); - vec3f minusZVec (0.f,0.f,-1.f); - vec3f posZVec (0.f,0.f,1.f); - - view.beginGL(); - glPushAttrib( GL_ALL_ATTRIB_BITS ); - - glDisable(GL_LIGHTING); - - if( !(status == M3dView::kActive || - status == M3dView::kLead || - status == M3dView::kHilite || - ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) { - glColor3f(1.0, 1.0, 0.0); - } - - vec3f posA, posB, pivB; - rigid_body_t::pointer rigid_bodyB = NULL; - if (m_constraint) - { - vec3f pos; - quatf rot; - m_constraint->rigid_bodyA()->get_transform(pos, rot); - m_constraint->worldToA(pos, posA); - rigid_bodyB = m_constraint->rigid_bodyB(); - if(rigid_bodyB) - { - rigid_bodyB->get_transform(pos, rot); - m_constraint->worldToA(pos, posB); - } - m_constraint->worldFromB(zeroVec, pos); - m_constraint->worldToA(pos, pivB); - } - - glBegin(GL_LINES); - glVertex3f(0.0, 0.0, 0.0); - glVertex3f(posA[0], posA[1], posA[2]); - - glVertex3f(0.0, 0.0, 0.0); - glVertex3f(pivB[0], pivB[1], pivB[2]); - - if(rigid_bodyB) - { - glVertex3f(pivB[0], pivB[1], pivB[2]); - glVertex3f(posB[0], posB[1], posB[2]); - } - - - glVertex3f(-1.0, 0.0, 0.0); - glVertex3f(1.0, 0.0, 0.0); - - glVertex3f(0.0, -1.0, 0.0); - glVertex3f(0.0, 1.0, 0.0); - - glVertex3f(0.0, 0.0, -1.0); - glVertex3f(0.0, 0.0, 1.0); - - vec3f posT, posP, posM; - - m_constraint->worldFromB(minusXVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posXVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - m_constraint->worldFromB(minusYVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posYVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - m_constraint->worldFromB(minusZVec, posT); - m_constraint->worldToA(posT, posM); - m_constraint->worldFromB(posZVec, posT); - m_constraint->worldToA(posT, posP); - glVertex3f(posM[0], posM[1], posM[2]); - glVertex3f(posP[0], posP[1], posP[2]); - - - glEnd(); - - glPopAttrib(); - view.endGL(); -} - -bool sliderConstraintNode::isBounded() const -{ - //return true; - return false; -} - -MBoundingBox sliderConstraintNode::boundingBox() const -{ - // std::cout << "sliderConstraintNode::boundingBox()" << std::endl; - //load the pdbs - MObject node = thisMObject(); - - MPoint corner1(-1, -1, -1); - MPoint corner2(1, 1, 1); - return MBoundingBox(corner1, corner2); -} - -//standard attributes -void sliderConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data) -{ - // std::cout << "sliderConstraintNode::computeConstraint" << std::endl; - - MObject thisObject(thisMObject()); - MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); - MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); - MObject update; - //force evaluation of the rigidBody - plgRigidBodyA.getValue(update); - plgRigidBodyB.getValue(update); - - rigid_body_t::pointer rigid_bodyA; - if(plgRigidBodyA.isConnected()) { - MPlugArray connections; - plgRigidBodyA.connectedTo(connections, true, true); - if(connections.length() != 0) { - MFnDependencyNode fnNodeA(connections[0].node()); - if(fnNodeA.typeId() == rigidBodyNode::typeId) { - rigidBodyNode *pRigidBodyNodeA = static_cast(fnNodeA.userNode()); - rigid_bodyA = pRigidBodyNodeA->rigid_body(); - } else { - std::cout << "sliderConstraintNode connected to a non-rigidbody node!" << std::endl; - } - } - } - - rigid_body_t::pointer rigid_bodyB; - if(plgRigidBodyB.isConnected()) { - MPlugArray connections; - plgRigidBodyB.connectedTo(connections, true, true); - if(connections.length() != 0) { - MFnDependencyNode fnNodeB(connections[0].node()); - if(fnNodeB.typeId() == rigidBodyNode::typeId) { - rigidBodyNode *pRigidBodyNodeB = static_cast(fnNodeB.userNode()); - rigid_bodyB = pRigidBodyNodeB->rigid_body(); - } else { - std::cout << "sliderConstraintNode connected to a non-rigidbody node!" << std::endl; - } - } - } - - vec3f pivInA, pivInB; - - if((rigid_bodyA != NULL) && (rigid_bodyB != NULL)) - { - constraint_t::pointer constraint = static_cast(m_constraint); - solver_t::remove_constraint(constraint); - float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); - float3& mPivInB = data.inputValue(ia_pivotInB).asFloat3(); - for(int i = 0; i < 3; i++) - { - pivInA[i] = (float)mPivInA[i]; - pivInB[i] = (float)mPivInB[i]; - } - float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); - MEulerRotation meulerA(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); - MQuaternion mquatA = meulerA.asQuaternion(); - quatf rotA((float)mquatA.w, (float)mquatA.x, (float)mquatA.y, (float)mquatA.z); - float3& mRotInB = data.inputValue(ia_rotationInB).asFloat3(); - MEulerRotation meulerB(deg2rad(mRotInB[0]), deg2rad(mRotInB[1]), deg2rad(mRotInB[2])); - MQuaternion mquatB = meulerB.asQuaternion(); - quatf rotB((float)mquatB.w, (float)mquatB.x, (float)mquatB.y, (float)mquatB.z); - m_constraint = solver_t::create_slider_constraint(rigid_bodyA, pivInA, rotA, rigid_bodyB, pivInB, rotB); - constraint = static_cast(m_constraint); - solver_t::add_constraint(constraint); - } - else if(rigid_bodyA != NULL) - { - //not connected to a rigid body, put a default one - constraint_t::pointer constraint = static_cast(m_constraint); - solver_t::remove_constraint(constraint); - float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); - for(int i = 0; i < 3; i++) - { - pivInA[i] = (float)mPivInA[i]; - } - float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); - MEulerRotation meuler(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); - MQuaternion mquat = meuler.asQuaternion(); - quatf rotA((float)mquat.w, (float)mquat.x, (float)mquat.y, (float)mquat.z); - m_constraint = solver_t::create_slider_constraint(rigid_bodyA, pivInA, rotA); - constraint = static_cast(m_constraint); - solver_t::add_constraint(constraint); - } - data.outputValue(ca_constraint).set(true); - data.setClean(plug); -} - - -void sliderConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) -{ - MObject thisObject(thisMObject()); - MFnDagNode fnDagNode(thisObject); - - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - - MStatus status; - MFnTransform fnParentTransform(fnDagNode.parent(0, &status)); - double fixScale[3] = { 1., 1., 1. }; // lock scale - fnParentTransform.setScale(fixScale); - MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform, &status); - - if(dSolverNode::isStartTime) - { // allow to edit pivots - MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); - MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); - MObject update; - //force evaluation of the rigidBody - plgRigidBodyA.getValue(update); - if(plgRigidBodyA.isConnected()) - { - MPlugArray connections; - plgRigidBodyA.connectedTo(connections, true, true); - if(connections.length() != 0) - { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) - { - MObject rbAObj = fnNode.object(); - rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); - MPlug(rbAObj, pRigidBodyNodeA->worldMatrix).elementByLogicalIndex(0).getValue(update); - } - } - } - plgRigidBodyB.getValue(update); - if(plgRigidBodyB.isConnected()) - { - MPlugArray connections; - plgRigidBodyB.connectedTo(connections, true, true); - if(connections.length() != 0) - { - MFnDependencyNode fnNode(connections[0].node()); - if(fnNode.typeId() == rigidBodyNode::typeId) - { - MObject rbBObj = fnNode.object(); - rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); - MPlug(rbBObj, pRigidBodyNodeB->worldMatrix).elementByLogicalIndex(0).getValue(update); - } - } - } - if(m_constraint) - { - MQuaternion mrotation; - fnParentTransform.getRotation(mrotation, MSpace::kTransform); - bool doUpdatePivot = m_constraint->getPivotChanged(); - if(!doUpdatePivot) - { - vec3f worldP; - quatf worldR; - m_constraint->get_world(worldP, worldR); - float deltaPX = worldP[0] - float(mtranslation.x); - float deltaPY = worldP[1] - float(mtranslation.y); - float deltaPZ = worldP[2] - float(mtranslation.z); - float deltaRX = (float)mrotation.x - worldR[1]; - float deltaRY = (float)mrotation.y - worldR[2]; - float deltaRZ = (float)mrotation.z - worldR[3]; - float deltaRW = (float)mrotation.w - worldR[0]; - float deltaSq = deltaPX * deltaPX + deltaPY * deltaPY + deltaPZ * deltaPZ - + deltaRX * deltaRX + deltaRY * deltaRY + deltaRZ * deltaRZ + deltaRW * deltaRW; - doUpdatePivot = (deltaSq > FLT_EPSILON); - } - if(doUpdatePivot) - { - m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]), - quatf((float)mrotation.w, (float)mrotation.x, (float)mrotation.y, (float)mrotation.z)); - vec3f pivInA, pivInB; - quatf rotInA, rotInB; - m_constraint->get_frameA(pivInA, rotInA); - m_constraint->get_frameB(pivInB, rotInB); - MDataHandle hPivInA = data.outputValue(ia_pivotInA); - float3 &ihPivInA = hPivInA.asFloat3(); - MDataHandle hPivInB = data.outputValue(ia_pivotInB); - float3 &ihPivInB = hPivInB.asFloat3(); - for(int i = 0; i < 3; i++) - { - ihPivInA[i] = pivInA[i]; - ihPivInB[i] = pivInB[i]; - } - MDataHandle hRotInA = data.outputValue(ia_rotationInA); - float3 &hrotInA = hRotInA.asFloat3(); - MQuaternion mrotA(rotInA[1], rotInA[2], rotInA[3], rotInA[0]); - MEulerRotation newrotA(mrotA.asEulerRotation()); - hrotInA[0] = rad2deg((float)newrotA.x); - hrotInA[1] = rad2deg((float)newrotA.y); - hrotInA[2] = rad2deg((float)newrotA.z); - MDataHandle hRotInB = data.outputValue(ia_rotationInB); - float3 &hrotInB = hRotInB.asFloat3(); - MQuaternion mrotB(rotInB[1], rotInB[2], rotInB[3], rotInB[0]); - MEulerRotation newrotB(mrotB.asEulerRotation()); - hrotInB[0] = rad2deg((float)newrotB.x); - hrotInB[1] = rad2deg((float)newrotB.y); - hrotInB[2] = rad2deg((float)newrotB.z); - m_constraint->setPivotChanged(false); - } - } - } - else - { // if not start time, lock position and rotation - if(m_constraint) - { - vec3f worldP; - quatf worldR; - m_constraint->get_world(worldP, worldR); - fnParentTransform.setTranslation(MVector(worldP[0], worldP[1], worldP[2]), MSpace::kTransform); - fnParentTransform.setRotation(MQuaternion(worldR[1], worldR[2], worldR[3], worldR[0])); - } - } - data.setClean(plug); -} - -void sliderConstraintNode::computeConstraintParam(const MPlug& plug, MDataBlock& data) -{ - // std::cout << "sliderConstraintNode::computeRigidBodyParam" << std::endl; - - MObject thisObject(thisMObject()); - MObject update; - - MPlug(thisObject, ca_constraint).getValue(update); - if(m_constraint) { - m_constraint->set_damping((float) data.inputValue(ia_damping).asDouble()); - float lin_lower = (float) data.inputValue(ia_lowerLinLimit).asDouble(); - float lin_upper = (float) data.inputValue(ia_upperLinLimit).asDouble(); - m_constraint->set_LinLimit(lin_lower, lin_upper); - float ang_lower = (float) data.inputValue(ia_lowerAngLimit).asDouble(); - float ang_upper = (float) data.inputValue(ia_upperAngLimit).asDouble(); - m_constraint->set_AngLimit(deg2rad(ang_lower), deg2rad(ang_upper)); - } - - data.outputValue(ca_constraintParam).set(true); - data.setClean(plug); -} - -slider_constraint_t::pointer sliderConstraintNode::constraint() -{ - // std::cout << "sliderConstraintNode::rigid_body" << std::endl; - - MObject thisObject(thisMObject()); - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - - return m_constraint; -} - -void sliderConstraintNode::update() -{ - MObject thisObject(thisMObject()); - - MObject update; - MPlug(thisObject, ca_constraint).getValue(update); - MPlug(thisObject, ca_constraintParam).getValue(update); - MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); -} +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Herbert Law + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Herbert Law + +Modified by Roman Ponomarev +01/22/2010 : Constraints reworked +*/ + +//sliderConstraintNode.cpp + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rigidBodyNode.h" +#include "sliderConstraintNode.h" +#include "mayaUtils.h" + +#include "solver.h" +#include "dSolverNode.h" +#include "constraint/bt_slider_constraint.h" + +MTypeId sliderConstraintNode::typeId(0x100385); +MString sliderConstraintNode::typeName("dSliderConstraint"); + +MObject sliderConstraintNode::ia_rigidBodyA; +MObject sliderConstraintNode::ia_rigidBodyB; +MObject sliderConstraintNode::ia_damping; +MObject sliderConstraintNode::ca_constraint; +MObject sliderConstraintNode::ca_constraintParam; +MObject sliderConstraintNode::ia_lowerLinLimit; +MObject sliderConstraintNode::ia_upperLinLimit; +MObject sliderConstraintNode::ia_lowerAngLimit; +MObject sliderConstraintNode::ia_upperAngLimit; +MObject sliderConstraintNode::ia_rotationInA; +MObject sliderConstraintNode::ia_rotationInB; +MObject sliderConstraintNode::ia_pivotInA; +MObject sliderConstraintNode::ia_pivotInB; + +MStatus sliderConstraintNode::initialize() +{ + MStatus status; + MFnMessageAttribute fnMsgAttr; + MFnNumericAttribute fnNumericAttr; + MFnMatrixAttribute fnMatrixAttr; + + ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status); + MCHECKSTATUS(status, "creating inRigidBodyA attribute") + status = addAttribute(ia_rigidBodyA); + MCHECKSTATUS(status, "adding inRigidBody attribute") + + ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status); + MCHECKSTATUS(status, "creating inRigidBodyB attribute") + status = addAttribute(ia_rigidBodyB); + MCHECKSTATUS(status, "adding inRigidBodyB attribute") + + ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating damping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_damping); + MCHECKSTATUS(status, "adding damping attribute") + + ia_lowerLinLimit = fnNumericAttr.create("lowerLinLimit", "lllt", MFnNumericData::kDouble, 1, &status); + MCHECKSTATUS(status, "creating lower linear limit attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_lowerLinLimit); + MCHECKSTATUS(status, "adding lower linear limit attribute") + + ia_upperLinLimit = fnNumericAttr.create("upperLinLimit", "ullt", MFnNumericData::kDouble, -1, &status); + MCHECKSTATUS(status, "creating upper linear limit attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_upperLinLimit); + MCHECKSTATUS(status, "adding upper linear limit attribute") + + ia_lowerAngLimit = fnNumericAttr.create("lowerAngLimit", "lalt", MFnNumericData::kDouble, 0, &status); + MCHECKSTATUS(status, "creating lower angular limit attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_lowerAngLimit); + MCHECKSTATUS(status, "adding lower angular limit attribute") + + ia_upperAngLimit = fnNumericAttr.create("upperAngLimit", "ualt", MFnNumericData::kDouble, 0, &status); + MCHECKSTATUS(status, "creating upper angular limit attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_upperAngLimit); + MCHECKSTATUS(status, "adding upper angular limit attribute") + + ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_constraint attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_constraint); + MCHECKSTATUS(status, "adding ca_constraint attribute") + + ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_constraintParam attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_constraintParam); + MCHECKSTATUS(status, "adding ca_constraintParam attribute") + + + ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating rotationInA attribute") + status = addAttribute(ia_rotationInA); + MCHECKSTATUS(status, "adding rotationInA attribute") + + ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating rotationInB attribute") + status = addAttribute(ia_rotationInB); + MCHECKSTATUS(status, "adding rotationInB attribute") + + ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating pivotInA attribute") + status = addAttribute(ia_pivotInA); + MCHECKSTATUS(status, "adding pivotInA attribute") + + ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); + status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); + MCHECKSTATUS(status, "creating pivotInB attribute") + status = addAttribute(ia_pivotInB); + MCHECKSTATUS(status, "adding pivotInB attribute") + + + status = attributeAffects(ia_rigidBodyA, ca_constraint); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") + + status = attributeAffects(ia_rigidBodyA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") + + status = attributeAffects(ia_rigidBodyB, ca_constraint); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") + + status = attributeAffects(ia_rigidBodyB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") + + status = attributeAffects(ia_damping, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") + + status = attributeAffects(ia_lowerLinLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLinLimit, ca_constraintParam)") + + status = attributeAffects(ia_upperLinLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_upperLinLimit, ca_constraintParam)") + + status = attributeAffects(ia_lowerAngLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_lowerAngLimit, ca_constraintParam)") + + status = attributeAffects(ia_upperAngLimit, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_upperAngLimit, ca_constraintParam)") + + status = attributeAffects(ia_rotationInA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") + status = attributeAffects(ia_rotationInB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") + + status = attributeAffects(ia_pivotInA, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") + status = attributeAffects(ia_pivotInB, ca_constraintParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") + + + return MS::kSuccess; +} + +sliderConstraintNode::sliderConstraintNode() +{ + // std::cout << "sliderConstraintNode::sliderConstraintNode" << std::endl; +} + +sliderConstraintNode::~sliderConstraintNode() +{ + // std::cout << "sliderConstraintNode::~sliderConstraintNode" << std::endl; +} + +void sliderConstraintNode::nodeRemoved(MObject& node, void *clientData) +{ + // std::cout << "sliderConstraintNode::nodeRemoved" << std::endl; + MFnDependencyNode fnNode(node); + sliderConstraintNode *pNode = static_cast(fnNode.userNode()); + if (pNode->m_constraint) + { + bt_slider_constraint_t* hinge_impl = dynamic_cast(pNode->m_constraint->pubImpl()); + rigid_body_t::pointer rigid_bodyA = pNode->m_constraint->rigid_bodyA(); + if(rigid_bodyA) + { + rigid_bodyA->remove_constraint(hinge_impl); + } + rigid_body_t::pointer rigid_bodyB = pNode->m_constraint->rigid_bodyB(); + if(rigid_bodyB) + { + rigid_bodyB->remove_constraint(hinge_impl); + } + } + constraint_t::pointer constraint = static_cast(pNode->m_constraint); + solver_t::remove_constraint(constraint); +} + +void* sliderConstraintNode::creator() +{ + return new sliderConstraintNode(); +} + + +bool sliderConstraintNode::setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx) +{ + /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { + m_framesDirty = true; + } else if(plug == textureFiles) { + gpufx::m_renderer.setColorTextureDirty(); + }*/ + return false; //setInternalValueInContext(plug,dataHandle,ctx); +} + +MStatus sliderConstraintNode::compute(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "sliderConstraintNode::compute: " << plug.name() << std::endl; + //MTime time = data.inputValue( sliderConstraintNode::inTime ).asTime(); + if(plug == ca_constraint) { + computeConstraint(plug, data); + } else if(plug == ca_constraintParam) { + computeConstraintParam(plug, data); + } else if(plug.isElement()) { + if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { + computeWorldMatrix(plug, data); + } else { + return MStatus::kUnknownParameter; + } + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +void sliderConstraintNode::draw( M3dView & view, const MDagPath &path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ) +{ + update(); + vec3f zeroVec(0.f,0.f,0.f); + vec3f minusXVec(-1.f,0.f,0.f); + vec3f posXVec(1.f,0.f,0.f); + vec3f minusYVec (0.f,-1.f,0.f); + vec3f posYVec (0.f,1.f,0.f); + vec3f minusZVec (0.f,0.f,-1.f); + vec3f posZVec (0.f,0.f,1.f); + + view.beginGL(); + glPushAttrib( GL_ALL_ATTRIB_BITS ); + + glDisable(GL_LIGHTING); + + if( !(status == M3dView::kActive || + status == M3dView::kLead || + status == M3dView::kHilite || + ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) { + glColor3f(1.0, 1.0, 0.0); + } + + vec3f posA, posB, pivB; + rigid_body_t::pointer rigid_bodyB = NULL; + if (m_constraint) + { + vec3f pos; + quatf rot; + m_constraint->rigid_bodyA()->get_transform(pos, rot); + m_constraint->worldToA(pos, posA); + rigid_bodyB = m_constraint->rigid_bodyB(); + if(rigid_bodyB) + { + rigid_bodyB->get_transform(pos, rot); + m_constraint->worldToA(pos, posB); + } + m_constraint->worldFromB(zeroVec, pos); + m_constraint->worldToA(pos, pivB); + } + + glBegin(GL_LINES); + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(posA[0], posA[1], posA[2]); + + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(pivB[0], pivB[1], pivB[2]); + + if(rigid_bodyB) + { + glVertex3f(pivB[0], pivB[1], pivB[2]); + glVertex3f(posB[0], posB[1], posB[2]); + } + + + glVertex3f(-1.0, 0.0, 0.0); + glVertex3f(1.0, 0.0, 0.0); + + glVertex3f(0.0, -1.0, 0.0); + glVertex3f(0.0, 1.0, 0.0); + + glVertex3f(0.0, 0.0, -1.0); + glVertex3f(0.0, 0.0, 1.0); + + vec3f posT, posP, posM; + + m_constraint->worldFromB(minusXVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posXVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + m_constraint->worldFromB(minusYVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posYVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + m_constraint->worldFromB(minusZVec, posT); + m_constraint->worldToA(posT, posM); + m_constraint->worldFromB(posZVec, posT); + m_constraint->worldToA(posT, posP); + glVertex3f(posM[0], posM[1], posM[2]); + glVertex3f(posP[0], posP[1], posP[2]); + + + glEnd(); + + glPopAttrib(); + view.endGL(); +} + +bool sliderConstraintNode::isBounded() const +{ + //return true; + return false; +} + +MBoundingBox sliderConstraintNode::boundingBox() const +{ + // std::cout << "sliderConstraintNode::boundingBox()" << std::endl; + //load the pdbs + MObject node = thisMObject(); + + MPoint corner1(-1, -1, -1); + MPoint corner2(1, 1, 1); + return MBoundingBox(corner1, corner2); +} + +//standard attributes +void sliderConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "sliderConstraintNode::computeConstraint" << std::endl; + + MObject thisObject(thisMObject()); + MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); + MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); + MObject update; + //force evaluation of the rigidBody + plgRigidBodyA.getValue(update); + plgRigidBodyB.getValue(update); + + rigid_body_t::pointer rigid_bodyA; + if(plgRigidBodyA.isConnected()) { + MPlugArray connections; + plgRigidBodyA.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNodeA(connections[0].node()); + if(fnNodeA.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *pRigidBodyNodeA = static_cast(fnNodeA.userNode()); + rigid_bodyA = pRigidBodyNodeA->rigid_body(); + } else { + std::cout << "sliderConstraintNode connected to a non-rigidbody node!" << std::endl; + } + } + } + + rigid_body_t::pointer rigid_bodyB; + if(plgRigidBodyB.isConnected()) { + MPlugArray connections; + plgRigidBodyB.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNodeB(connections[0].node()); + if(fnNodeB.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *pRigidBodyNodeB = static_cast(fnNodeB.userNode()); + rigid_bodyB = pRigidBodyNodeB->rigid_body(); + } else { + std::cout << "sliderConstraintNode connected to a non-rigidbody node!" << std::endl; + } + } + } + + vec3f pivInA, pivInB; + + if((rigid_bodyA != NULL) && (rigid_bodyB != NULL)) + { + constraint_t::pointer constraint = static_cast(m_constraint); + solver_t::remove_constraint(constraint); + float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); + float3& mPivInB = data.inputValue(ia_pivotInB).asFloat3(); + for(int i = 0; i < 3; i++) + { + pivInA[i] = (float)mPivInA[i]; + pivInB[i] = (float)mPivInB[i]; + } + float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); + MEulerRotation meulerA(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); + MQuaternion mquatA = meulerA.asQuaternion(); + quatf rotA((float)mquatA.w, (float)mquatA.x, (float)mquatA.y, (float)mquatA.z); + float3& mRotInB = data.inputValue(ia_rotationInB).asFloat3(); + MEulerRotation meulerB(deg2rad(mRotInB[0]), deg2rad(mRotInB[1]), deg2rad(mRotInB[2])); + MQuaternion mquatB = meulerB.asQuaternion(); + quatf rotB((float)mquatB.w, (float)mquatB.x, (float)mquatB.y, (float)mquatB.z); + m_constraint = solver_t::create_slider_constraint(rigid_bodyA, pivInA, rotA, rigid_bodyB, pivInB, rotB); + constraint = static_cast(m_constraint); + solver_t::add_constraint(constraint); + } + else if(rigid_bodyA != NULL) + { + //not connected to a rigid body, put a default one + constraint_t::pointer constraint = static_cast(m_constraint); + solver_t::remove_constraint(constraint); + float3& mPivInA = data.inputValue(ia_pivotInA).asFloat3(); + for(int i = 0; i < 3; i++) + { + pivInA[i] = (float)mPivInA[i]; + } + float3& mRotInA = data.inputValue(ia_rotationInA).asFloat3(); + MEulerRotation meuler(deg2rad(mRotInA[0]), deg2rad(mRotInA[1]), deg2rad(mRotInA[2])); + MQuaternion mquat = meuler.asQuaternion(); + quatf rotA((float)mquat.w, (float)mquat.x, (float)mquat.y, (float)mquat.z); + m_constraint = solver_t::create_slider_constraint(rigid_bodyA, pivInA, rotA); + constraint = static_cast(m_constraint); + solver_t::add_constraint(constraint); + } + data.outputValue(ca_constraint).set(true); + data.setClean(plug); +} + + +void sliderConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) +{ + MObject thisObject(thisMObject()); + MFnDagNode fnDagNode(thisObject); + + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + + MStatus status; + MFnTransform fnParentTransform(fnDagNode.parent(0, &status)); + double fixScale[3] = { 1., 1., 1. }; // lock scale + fnParentTransform.setScale(fixScale); + MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform, &status); + + if(dSolverNode::isStartTime) + { // allow to edit pivots + MPlug plgRigidBodyA(thisObject, ia_rigidBodyA); + MPlug plgRigidBodyB(thisObject, ia_rigidBodyB); + MObject update; + //force evaluation of the rigidBody + plgRigidBodyA.getValue(update); + if(plgRigidBodyA.isConnected()) + { + MPlugArray connections; + plgRigidBodyA.connectedTo(connections, true, true); + if(connections.length() != 0) + { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) + { + MObject rbAObj = fnNode.object(); + rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode()); + MPlug(rbAObj, pRigidBodyNodeA->worldMatrix).elementByLogicalIndex(0).getValue(update); + } + } + } + plgRigidBodyB.getValue(update); + if(plgRigidBodyB.isConnected()) + { + MPlugArray connections; + plgRigidBodyB.connectedTo(connections, true, true); + if(connections.length() != 0) + { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == rigidBodyNode::typeId) + { + MObject rbBObj = fnNode.object(); + rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode()); + MPlug(rbBObj, pRigidBodyNodeB->worldMatrix).elementByLogicalIndex(0).getValue(update); + } + } + } + if(m_constraint) + { + MQuaternion mrotation; + fnParentTransform.getRotation(mrotation, MSpace::kTransform); + bool doUpdatePivot = m_constraint->getPivotChanged(); + if(!doUpdatePivot) + { + vec3f worldP; + quatf worldR; + m_constraint->get_world(worldP, worldR); + float deltaPX = worldP[0] - float(mtranslation.x); + float deltaPY = worldP[1] - float(mtranslation.y); + float deltaPZ = worldP[2] - float(mtranslation.z); + float deltaRX = (float)mrotation.x - worldR[1]; + float deltaRY = (float)mrotation.y - worldR[2]; + float deltaRZ = (float)mrotation.z - worldR[3]; + float deltaRW = (float)mrotation.w - worldR[0]; + float deltaSq = deltaPX * deltaPX + deltaPY * deltaPY + deltaPZ * deltaPZ + + deltaRX * deltaRX + deltaRY * deltaRY + deltaRZ * deltaRZ + deltaRW * deltaRW; + doUpdatePivot = (deltaSq > FLT_EPSILON); + } + if(doUpdatePivot) + { + m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]), + quatf((float)mrotation.w, (float)mrotation.x, (float)mrotation.y, (float)mrotation.z)); + vec3f pivInA, pivInB; + quatf rotInA, rotInB; + m_constraint->get_frameA(pivInA, rotInA); + m_constraint->get_frameB(pivInB, rotInB); + MDataHandle hPivInA = data.outputValue(ia_pivotInA); + float3 &ihPivInA = hPivInA.asFloat3(); + MDataHandle hPivInB = data.outputValue(ia_pivotInB); + float3 &ihPivInB = hPivInB.asFloat3(); + for(int i = 0; i < 3; i++) + { + ihPivInA[i] = pivInA[i]; + ihPivInB[i] = pivInB[i]; + } + MDataHandle hRotInA = data.outputValue(ia_rotationInA); + float3 &hrotInA = hRotInA.asFloat3(); + MQuaternion mrotA(rotInA[1], rotInA[2], rotInA[3], rotInA[0]); + MEulerRotation newrotA(mrotA.asEulerRotation()); + hrotInA[0] = rad2deg((float)newrotA.x); + hrotInA[1] = rad2deg((float)newrotA.y); + hrotInA[2] = rad2deg((float)newrotA.z); + MDataHandle hRotInB = data.outputValue(ia_rotationInB); + float3 &hrotInB = hRotInB.asFloat3(); + MQuaternion mrotB(rotInB[1], rotInB[2], rotInB[3], rotInB[0]); + MEulerRotation newrotB(mrotB.asEulerRotation()); + hrotInB[0] = rad2deg((float)newrotB.x); + hrotInB[1] = rad2deg((float)newrotB.y); + hrotInB[2] = rad2deg((float)newrotB.z); + m_constraint->setPivotChanged(false); + } + } + } + else + { // if not start time, lock position and rotation + if(m_constraint) + { + vec3f worldP; + quatf worldR; + m_constraint->get_world(worldP, worldR); + fnParentTransform.setTranslation(MVector(worldP[0], worldP[1], worldP[2]), MSpace::kTransform); + fnParentTransform.setRotation(MQuaternion(worldR[1], worldR[2], worldR[3], worldR[0])); + } + } + data.setClean(plug); +} + +void sliderConstraintNode::computeConstraintParam(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "sliderConstraintNode::computeRigidBodyParam" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + + MPlug(thisObject, ca_constraint).getValue(update); + if(m_constraint) { + m_constraint->set_damping((float) data.inputValue(ia_damping).asDouble()); + float lin_lower = (float) data.inputValue(ia_lowerLinLimit).asDouble(); + float lin_upper = (float) data.inputValue(ia_upperLinLimit).asDouble(); + m_constraint->set_LinLimit(lin_lower, lin_upper); + float ang_lower = (float) data.inputValue(ia_lowerAngLimit).asDouble(); + float ang_upper = (float) data.inputValue(ia_upperAngLimit).asDouble(); + m_constraint->set_AngLimit(deg2rad(ang_lower), deg2rad(ang_upper)); + } + + data.outputValue(ca_constraintParam).set(true); + data.setClean(plug); +} + +slider_constraint_t::pointer sliderConstraintNode::constraint() +{ + // std::cout << "sliderConstraintNode::rigid_body" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + + return m_constraint; +} + +void sliderConstraintNode::update() +{ + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ca_constraint).getValue(update); + MPlug(thisObject, ca_constraintParam).getValue(update); + MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); +} diff --git a/Extras/MayaPlugin/icons/dynamicaCreate6DofConstraint.xpm b/Extras/MayaPlugin/icons/dynamicaCreate6DofConstraint.xpm index cf5b30224..ad9592063 100644 --- a/Extras/MayaPlugin/icons/dynamicaCreate6DofConstraint.xpm +++ b/Extras/MayaPlugin/icons/dynamicaCreate6DofConstraint.xpm @@ -1,213 +1,213 @@ -/* XPM */ -static char * dynamicaCreatePinConstraint_xpm[] = { -"32 32 178 2", -" c #B1B1B1", -". c #A8A8A8", -"+ c #A5A5A5", -"@ c #718172", -"# c #6D866F", -"$ c #999999", -"% c #9B9B9B", -"& c #7B9B7E", -"* c #77CF80", -"= c #69846C", -"- c #8F8F8F", -"; c #989898", -"> c #82A185", -", c #88EC91", -"' c #57DD63", -") c #529C59", -"! c #878787", -"~ c #A2A2A2", -"{ c #949494", -"] c #88AA8B", -"^ c #8EED97", -"/ c #58E465", -"( c #23DC34", -"_ c #30B33C", -": c #667A68", -"< c #959595", -"[ c #9E9E9E", -"} c #757C76", -"| c #9BD9A1", -"1 c #87EC90", -"2 c #4BE259", -"3 c #17DA29", -"4 c #04D718", -"5 c #13C624", -"6 c #528C57", -"7 c #8B8B8B", -"8 c #A9A9A9", -"9 c #A6A6A6", -"0 c #717371", -"a c #99CB9E", -"b c #9BEFA3", -"c c #6FE87A", -"d c #30DE40", -"e c #09D71C", -"f c #00D614", -"g c #33A73E", -"h c #8E8E8E", -"i c #93BB97", -"j c #A3F0AA", -"k c #82EB8C", -"l c #49E257", -"m c #15D927", -"n c #01D615", -"o c #28B235", -"p c #419B49", -"q c #508D56", -"r c #9F9F9F", -"s c #89A68C", -"t c #A6F1AD", -"u c #8DED96", -"v c #59E466", -"w c #21DB32", -"x c #24B532", -"y c #858585", -"z c #969696", -"A c #929292", -"B c #809281", -"C c #A7EBAD", -"D c #94EE9C", -"E c #67E773", -"F c #2DDD3D", -"G c #06D119", -"H c #5E8061", -"I c #A0A0A0", -"J c #919191", -"K c #8A8A8A", -"L c #778278", -"M c #A0E2A6", -"N c #99EFA1", -"O c #73E87E", -"P c #3BDF4A", -"Q c #10D923", -"R c #36A441", -"S c #BE0000", -"T c #A20000", -"U c #7C1D14", -"V c #88744E", -"W c #877D52", -"X c #8B8F5F", -"Y c #95CA89", -"Z c #77E982", -"` c #46E155", -" . c #03D617", -".. c #13C424", -"+. c #69766B", -"@. c #AAAAAA", -"#. c #747D74", -"$. c #94D79B", -"%. c #86EC8F", -"&. c #7EEA88", -"*. c #6DE878", -"=. c #47E155", -"-. c #1CDB2E", -";. c #4C9053", -">. c #75C27C", -",. c #7AEA84", -"'. c #74E97F", -"). c #68E774", -"!. c #5AE467", -"~. c #4CE25A", -"{. c #38DF48", -"]. c #1DDB2F", -"^. c #07D71A", -"/. c #23B631", -"(. c #848484", -"_. c #66896A", -":. c #49C955", -"<. c #35DF45", -"[. c #2BDD3C", -"}. c #22DB33", -"|. c #1ADA2C", -"1. c #11D924", -"2. c #09CE1C", -"3. c #5D8160", -"4. c #69786A", -"5. c #32B03E", -"6. c #02D616", -"7. c #2BAF37", -"8. c #898989", -"9. c #A4A4A4", -"0. c #7F7F7F", -"a. c #399141", -"b. c #06D019", -"c. c #24B631", -"d. c #A7A7A7", -"e. c #AFAFAF", -"f. c #BDBDBD", -"g. c #528156", -"h. c #12C223", -"i. c #14C424", -"j. c #6C746C", -"k. c #AEAEAE", -"l. c #EBEBEB", -"m. c #F4F4F4", -"n. c #C2C2C2", -"o. c #697A6A", -"p. c #26AE33", -"q. c #09CE1B", -"r. c #627D64", -"s. c #A3A3A3", -"t. c #C7C7C7", -"u. c #FCFCFC", -"v. c #E6E6E6", -"w. c #DFDFDF", -"x. c #409C48", -"y. c #04D217", -"z. c #6E726F", -"A. c #B0B0B0", -"B. c #F8F8F8", -"C. c #8D8D8D", -"D. c #528B57", -"E. c #1BA610", -"F. c #5B835F", -"G. c #DDDDDD", -"H. c #EAEAEA", -"I. c #880000", -"J. c #B5B5B5", -"K. c #DEDEDE", -"L. c #E9E9E9", -"M. c #A1A1A1", -"N. c #CACACA", -"O. c #DCDCDC", -"P. c #ACACAC", -"Q. c #D8D8D8", -"R. c #C6C6C6", -"S. c #ADADAD", -"T. c #BA0000", -"U. c #BB0000", -" ", -" . + ", -" . @ # $ ", -" % & * = - ", -" ; > , ' ) ! ~ ", -" { ] ^ / ( _ : < ", -" [ } | 1 2 3 4 5 6 7 8 ", -" 9 0 a b c d e f f f g h ", -" 7 i j k l m n f o p q r ", -" h s t u v w 4 f x y z r ", -" A B C D E F e f G H I ", -" 8 J - K L M N O P Q n f R h ", -" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", -" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", -" S y >.,.'.).!.~.{.].^.f f /.(. ", -" S I _.:.<.[.}.|.1.^.n f 2.3.r ", -" S ; 4.5.^.4 4 6.n f f 7.8. ", -" S 9.0.a.b.f f f f f c.y ", -" S d.e.f.g.h.f f f f i.j.k. ", -" S e.; l.m.n.o.p.f f f q.r.8 ", -" S s.t.u.v.w.; (.x.y.f /.z.A. ", -" S @.~ B.v.w.9 9.A.C.D.E.F.r ", -" S r G.H.w.9.9. $ I.$ ", -" S + J.m.K.s.9. S ", -" S k.$ L.G.M.9. S ", -" S s.N.O.I + S ", -" S P.+ Q.r + S ", -" S ~ R.r 9 S ", -" S S.s.[ P. S ", -" S S S S T.U.S S S S S S S S S S S S ", -" ", -" "}; +/* XPM */ +static char * dynamicaCreatePinConstraint_xpm[] = { +"32 32 178 2", +" c #B1B1B1", +". c #A8A8A8", +"+ c #A5A5A5", +"@ c #718172", +"# c #6D866F", +"$ c #999999", +"% c #9B9B9B", +"& c #7B9B7E", +"* c #77CF80", +"= c #69846C", +"- c #8F8F8F", +"; c #989898", +"> c #82A185", +", c #88EC91", +"' c #57DD63", +") c #529C59", +"! c #878787", +"~ c #A2A2A2", +"{ c #949494", +"] c #88AA8B", +"^ c #8EED97", +"/ c #58E465", +"( c #23DC34", +"_ c #30B33C", +": c #667A68", +"< c #959595", +"[ c #9E9E9E", +"} c #757C76", +"| c #9BD9A1", +"1 c #87EC90", +"2 c #4BE259", +"3 c #17DA29", +"4 c #04D718", +"5 c #13C624", +"6 c #528C57", +"7 c #8B8B8B", +"8 c #A9A9A9", +"9 c #A6A6A6", +"0 c #717371", +"a c #99CB9E", +"b c #9BEFA3", +"c c #6FE87A", +"d c #30DE40", +"e c #09D71C", +"f c #00D614", +"g c #33A73E", +"h c #8E8E8E", +"i c #93BB97", +"j c #A3F0AA", +"k c #82EB8C", +"l c #49E257", +"m c #15D927", +"n c #01D615", +"o c #28B235", +"p c #419B49", +"q c #508D56", +"r c #9F9F9F", +"s c #89A68C", +"t c #A6F1AD", +"u c #8DED96", +"v c #59E466", +"w c #21DB32", +"x c #24B532", +"y c #858585", +"z c #969696", +"A c #929292", +"B c #809281", +"C c #A7EBAD", +"D c #94EE9C", +"E c #67E773", +"F c #2DDD3D", +"G c #06D119", +"H c #5E8061", +"I c #A0A0A0", +"J c #919191", +"K c #8A8A8A", +"L c #778278", +"M c #A0E2A6", +"N c #99EFA1", +"O c #73E87E", +"P c #3BDF4A", +"Q c #10D923", +"R c #36A441", +"S c #BE0000", +"T c #A20000", +"U c #7C1D14", +"V c #88744E", +"W c #877D52", +"X c #8B8F5F", +"Y c #95CA89", +"Z c #77E982", +"` c #46E155", +" . c #03D617", +".. c #13C424", +"+. c #69766B", +"@. c #AAAAAA", +"#. c #747D74", +"$. c #94D79B", +"%. c #86EC8F", +"&. c #7EEA88", +"*. c #6DE878", +"=. c #47E155", +"-. c #1CDB2E", +";. c #4C9053", +">. c #75C27C", +",. c #7AEA84", +"'. c #74E97F", +"). c #68E774", +"!. c #5AE467", +"~. c #4CE25A", +"{. c #38DF48", +"]. c #1DDB2F", +"^. c #07D71A", +"/. c #23B631", +"(. c #848484", +"_. c #66896A", +":. c #49C955", +"<. c #35DF45", +"[. c #2BDD3C", +"}. c #22DB33", +"|. c #1ADA2C", +"1. c #11D924", +"2. c #09CE1C", +"3. c #5D8160", +"4. c #69786A", +"5. c #32B03E", +"6. c #02D616", +"7. c #2BAF37", +"8. c #898989", +"9. c #A4A4A4", +"0. c #7F7F7F", +"a. c #399141", +"b. c #06D019", +"c. c #24B631", +"d. c #A7A7A7", +"e. c #AFAFAF", +"f. c #BDBDBD", +"g. c #528156", +"h. c #12C223", +"i. c #14C424", +"j. c #6C746C", +"k. c #AEAEAE", +"l. c #EBEBEB", +"m. c #F4F4F4", +"n. c #C2C2C2", +"o. c #697A6A", +"p. c #26AE33", +"q. c #09CE1B", +"r. c #627D64", +"s. c #A3A3A3", +"t. c #C7C7C7", +"u. c #FCFCFC", +"v. c #E6E6E6", +"w. c #DFDFDF", +"x. c #409C48", +"y. c #04D217", +"z. c #6E726F", +"A. c #B0B0B0", +"B. c #F8F8F8", +"C. c #8D8D8D", +"D. c #528B57", +"E. c #1BA610", +"F. c #5B835F", +"G. c #DDDDDD", +"H. c #EAEAEA", +"I. c #880000", +"J. c #B5B5B5", +"K. c #DEDEDE", +"L. c #E9E9E9", +"M. c #A1A1A1", +"N. c #CACACA", +"O. c #DCDCDC", +"P. c #ACACAC", +"Q. c #D8D8D8", +"R. c #C6C6C6", +"S. c #ADADAD", +"T. c #BA0000", +"U. c #BB0000", +" ", +" . + ", +" . @ # $ ", +" % & * = - ", +" ; > , ' ) ! ~ ", +" { ] ^ / ( _ : < ", +" [ } | 1 2 3 4 5 6 7 8 ", +" 9 0 a b c d e f f f g h ", +" 7 i j k l m n f o p q r ", +" h s t u v w 4 f x y z r ", +" A B C D E F e f G H I ", +" 8 J - K L M N O P Q n f R h ", +" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", +" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", +" S y >.,.'.).!.~.{.].^.f f /.(. ", +" S I _.:.<.[.}.|.1.^.n f 2.3.r ", +" S ; 4.5.^.4 4 6.n f f 7.8. ", +" S 9.0.a.b.f f f f f c.y ", +" S d.e.f.g.h.f f f f i.j.k. ", +" S e.; l.m.n.o.p.f f f q.r.8 ", +" S s.t.u.v.w.; (.x.y.f /.z.A. ", +" S @.~ B.v.w.9 9.A.C.D.E.F.r ", +" S r G.H.w.9.9. $ I.$ ", +" S + J.m.K.s.9. S ", +" S k.$ L.G.M.9. S ", +" S s.N.O.I + S ", +" S P.+ Q.r + S ", +" S ~ R.r 9 S ", +" S S.s.[ P. S ", +" S S S S T.U.S S S S S S S S S S S S ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateConeTwistConstraint.xpm b/Extras/MayaPlugin/icons/dynamicaCreateConeTwistConstraint.xpm index cf5b30224..ad9592063 100644 --- a/Extras/MayaPlugin/icons/dynamicaCreateConeTwistConstraint.xpm +++ b/Extras/MayaPlugin/icons/dynamicaCreateConeTwistConstraint.xpm @@ -1,213 +1,213 @@ -/* XPM */ -static char * dynamicaCreatePinConstraint_xpm[] = { -"32 32 178 2", -" c #B1B1B1", -". c #A8A8A8", -"+ c #A5A5A5", -"@ c #718172", -"# c #6D866F", -"$ c #999999", -"% c #9B9B9B", -"& c #7B9B7E", -"* c #77CF80", -"= c #69846C", -"- c #8F8F8F", -"; c #989898", -"> c #82A185", -", c #88EC91", -"' c #57DD63", -") c #529C59", -"! c #878787", -"~ c #A2A2A2", -"{ c #949494", -"] c #88AA8B", -"^ c #8EED97", -"/ c #58E465", -"( c #23DC34", -"_ c #30B33C", -": c #667A68", -"< c #959595", -"[ c #9E9E9E", -"} c #757C76", -"| c #9BD9A1", -"1 c #87EC90", -"2 c #4BE259", -"3 c #17DA29", -"4 c #04D718", -"5 c #13C624", -"6 c #528C57", -"7 c #8B8B8B", -"8 c #A9A9A9", -"9 c #A6A6A6", -"0 c #717371", -"a c #99CB9E", -"b c #9BEFA3", -"c c #6FE87A", -"d c #30DE40", -"e c #09D71C", -"f c #00D614", -"g c #33A73E", -"h c #8E8E8E", -"i c #93BB97", -"j c #A3F0AA", -"k c #82EB8C", -"l c #49E257", -"m c #15D927", -"n c #01D615", -"o c #28B235", -"p c #419B49", -"q c #508D56", -"r c #9F9F9F", -"s c #89A68C", -"t c #A6F1AD", -"u c #8DED96", -"v c #59E466", -"w c #21DB32", -"x c #24B532", -"y c #858585", -"z c #969696", -"A c #929292", -"B c #809281", -"C c #A7EBAD", -"D c #94EE9C", -"E c #67E773", -"F c #2DDD3D", -"G c #06D119", -"H c #5E8061", -"I c #A0A0A0", -"J c #919191", -"K c #8A8A8A", -"L c #778278", -"M c #A0E2A6", -"N c #99EFA1", -"O c #73E87E", -"P c #3BDF4A", -"Q c #10D923", -"R c #36A441", -"S c #BE0000", -"T c #A20000", -"U c #7C1D14", -"V c #88744E", -"W c #877D52", -"X c #8B8F5F", -"Y c #95CA89", -"Z c #77E982", -"` c #46E155", -" . c #03D617", -".. c #13C424", -"+. c #69766B", -"@. c #AAAAAA", -"#. c #747D74", -"$. c #94D79B", -"%. c #86EC8F", -"&. c #7EEA88", -"*. c #6DE878", -"=. c #47E155", -"-. c #1CDB2E", -";. c #4C9053", -">. c #75C27C", -",. c #7AEA84", -"'. c #74E97F", -"). c #68E774", -"!. c #5AE467", -"~. c #4CE25A", -"{. c #38DF48", -"]. c #1DDB2F", -"^. c #07D71A", -"/. c #23B631", -"(. c #848484", -"_. c #66896A", -":. c #49C955", -"<. c #35DF45", -"[. c #2BDD3C", -"}. c #22DB33", -"|. c #1ADA2C", -"1. c #11D924", -"2. c #09CE1C", -"3. c #5D8160", -"4. c #69786A", -"5. c #32B03E", -"6. c #02D616", -"7. c #2BAF37", -"8. c #898989", -"9. c #A4A4A4", -"0. c #7F7F7F", -"a. c #399141", -"b. c #06D019", -"c. c #24B631", -"d. c #A7A7A7", -"e. c #AFAFAF", -"f. c #BDBDBD", -"g. c #528156", -"h. c #12C223", -"i. c #14C424", -"j. c #6C746C", -"k. c #AEAEAE", -"l. c #EBEBEB", -"m. c #F4F4F4", -"n. c #C2C2C2", -"o. c #697A6A", -"p. c #26AE33", -"q. c #09CE1B", -"r. c #627D64", -"s. c #A3A3A3", -"t. c #C7C7C7", -"u. c #FCFCFC", -"v. c #E6E6E6", -"w. c #DFDFDF", -"x. c #409C48", -"y. c #04D217", -"z. c #6E726F", -"A. c #B0B0B0", -"B. c #F8F8F8", -"C. c #8D8D8D", -"D. c #528B57", -"E. c #1BA610", -"F. c #5B835F", -"G. c #DDDDDD", -"H. c #EAEAEA", -"I. c #880000", -"J. c #B5B5B5", -"K. c #DEDEDE", -"L. c #E9E9E9", -"M. c #A1A1A1", -"N. c #CACACA", -"O. c #DCDCDC", -"P. c #ACACAC", -"Q. c #D8D8D8", -"R. c #C6C6C6", -"S. c #ADADAD", -"T. c #BA0000", -"U. c #BB0000", -" ", -" . + ", -" . @ # $ ", -" % & * = - ", -" ; > , ' ) ! ~ ", -" { ] ^ / ( _ : < ", -" [ } | 1 2 3 4 5 6 7 8 ", -" 9 0 a b c d e f f f g h ", -" 7 i j k l m n f o p q r ", -" h s t u v w 4 f x y z r ", -" A B C D E F e f G H I ", -" 8 J - K L M N O P Q n f R h ", -" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", -" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", -" S y >.,.'.).!.~.{.].^.f f /.(. ", -" S I _.:.<.[.}.|.1.^.n f 2.3.r ", -" S ; 4.5.^.4 4 6.n f f 7.8. ", -" S 9.0.a.b.f f f f f c.y ", -" S d.e.f.g.h.f f f f i.j.k. ", -" S e.; l.m.n.o.p.f f f q.r.8 ", -" S s.t.u.v.w.; (.x.y.f /.z.A. ", -" S @.~ B.v.w.9 9.A.C.D.E.F.r ", -" S r G.H.w.9.9. $ I.$ ", -" S + J.m.K.s.9. S ", -" S k.$ L.G.M.9. S ", -" S s.N.O.I + S ", -" S P.+ Q.r + S ", -" S ~ R.r 9 S ", -" S S.s.[ P. S ", -" S S S S T.U.S S S S S S S S S S S S ", -" ", -" "}; +/* XPM */ +static char * dynamicaCreatePinConstraint_xpm[] = { +"32 32 178 2", +" c #B1B1B1", +". c #A8A8A8", +"+ c #A5A5A5", +"@ c #718172", +"# c #6D866F", +"$ c #999999", +"% c #9B9B9B", +"& c #7B9B7E", +"* c #77CF80", +"= c #69846C", +"- c #8F8F8F", +"; c #989898", +"> c #82A185", +", c #88EC91", +"' c #57DD63", +") c #529C59", +"! c #878787", +"~ c #A2A2A2", +"{ c #949494", +"] c #88AA8B", +"^ c #8EED97", +"/ c #58E465", +"( c #23DC34", +"_ c #30B33C", +": c #667A68", +"< c #959595", +"[ c #9E9E9E", +"} c #757C76", +"| c #9BD9A1", +"1 c #87EC90", +"2 c #4BE259", +"3 c #17DA29", +"4 c #04D718", +"5 c #13C624", +"6 c #528C57", +"7 c #8B8B8B", +"8 c #A9A9A9", +"9 c #A6A6A6", +"0 c #717371", +"a c #99CB9E", +"b c #9BEFA3", +"c c #6FE87A", +"d c #30DE40", +"e c #09D71C", +"f c #00D614", +"g c #33A73E", +"h c #8E8E8E", +"i c #93BB97", +"j c #A3F0AA", +"k c #82EB8C", +"l c #49E257", +"m c #15D927", +"n c #01D615", +"o c #28B235", +"p c #419B49", +"q c #508D56", +"r c #9F9F9F", +"s c #89A68C", +"t c #A6F1AD", +"u c #8DED96", +"v c #59E466", +"w c #21DB32", +"x c #24B532", +"y c #858585", +"z c #969696", +"A c #929292", +"B c #809281", +"C c #A7EBAD", +"D c #94EE9C", +"E c #67E773", +"F c #2DDD3D", +"G c #06D119", +"H c #5E8061", +"I c #A0A0A0", +"J c #919191", +"K c #8A8A8A", +"L c #778278", +"M c #A0E2A6", +"N c #99EFA1", +"O c #73E87E", +"P c #3BDF4A", +"Q c #10D923", +"R c #36A441", +"S c #BE0000", +"T c #A20000", +"U c #7C1D14", +"V c #88744E", +"W c #877D52", +"X c #8B8F5F", +"Y c #95CA89", +"Z c #77E982", +"` c #46E155", +" . c #03D617", +".. c #13C424", +"+. c #69766B", +"@. c #AAAAAA", +"#. c #747D74", +"$. c #94D79B", +"%. c #86EC8F", +"&. c #7EEA88", +"*. c #6DE878", +"=. c #47E155", +"-. c #1CDB2E", +";. c #4C9053", +">. c #75C27C", +",. c #7AEA84", +"'. c #74E97F", +"). c #68E774", +"!. c #5AE467", +"~. c #4CE25A", +"{. c #38DF48", +"]. c #1DDB2F", +"^. c #07D71A", +"/. c #23B631", +"(. c #848484", +"_. c #66896A", +":. c #49C955", +"<. c #35DF45", +"[. c #2BDD3C", +"}. c #22DB33", +"|. c #1ADA2C", +"1. c #11D924", +"2. c #09CE1C", +"3. c #5D8160", +"4. c #69786A", +"5. c #32B03E", +"6. c #02D616", +"7. c #2BAF37", +"8. c #898989", +"9. c #A4A4A4", +"0. c #7F7F7F", +"a. c #399141", +"b. c #06D019", +"c. c #24B631", +"d. c #A7A7A7", +"e. c #AFAFAF", +"f. c #BDBDBD", +"g. c #528156", +"h. c #12C223", +"i. c #14C424", +"j. c #6C746C", +"k. c #AEAEAE", +"l. c #EBEBEB", +"m. c #F4F4F4", +"n. c #C2C2C2", +"o. c #697A6A", +"p. c #26AE33", +"q. c #09CE1B", +"r. c #627D64", +"s. c #A3A3A3", +"t. c #C7C7C7", +"u. c #FCFCFC", +"v. c #E6E6E6", +"w. c #DFDFDF", +"x. c #409C48", +"y. c #04D217", +"z. c #6E726F", +"A. c #B0B0B0", +"B. c #F8F8F8", +"C. c #8D8D8D", +"D. c #528B57", +"E. c #1BA610", +"F. c #5B835F", +"G. c #DDDDDD", +"H. c #EAEAEA", +"I. c #880000", +"J. c #B5B5B5", +"K. c #DEDEDE", +"L. c #E9E9E9", +"M. c #A1A1A1", +"N. c #CACACA", +"O. c #DCDCDC", +"P. c #ACACAC", +"Q. c #D8D8D8", +"R. c #C6C6C6", +"S. c #ADADAD", +"T. c #BA0000", +"U. c #BB0000", +" ", +" . + ", +" . @ # $ ", +" % & * = - ", +" ; > , ' ) ! ~ ", +" { ] ^ / ( _ : < ", +" [ } | 1 2 3 4 5 6 7 8 ", +" 9 0 a b c d e f f f g h ", +" 7 i j k l m n f o p q r ", +" h s t u v w 4 f x y z r ", +" A B C D E F e f G H I ", +" 8 J - K L M N O P Q n f R h ", +" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", +" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", +" S y >.,.'.).!.~.{.].^.f f /.(. ", +" S I _.:.<.[.}.|.1.^.n f 2.3.r ", +" S ; 4.5.^.4 4 6.n f f 7.8. ", +" S 9.0.a.b.f f f f f c.y ", +" S d.e.f.g.h.f f f f i.j.k. ", +" S e.; l.m.n.o.p.f f f q.r.8 ", +" S s.t.u.v.w.; (.x.y.f /.z.A. ", +" S @.~ B.v.w.9 9.A.C.D.E.F.r ", +" S r G.H.w.9.9. $ I.$ ", +" S + J.m.K.s.9. S ", +" S k.$ L.G.M.9. S ", +" S s.N.O.I + S ", +" S P.+ Q.r + S ", +" S ~ R.r 9 S ", +" S S.s.[ P. S ", +" S S S S T.U.S S S S S S S S S S S S ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateHingeConstraint.xpm b/Extras/MayaPlugin/icons/dynamicaCreateHingeConstraint.xpm index cf5b30224..ad9592063 100644 --- a/Extras/MayaPlugin/icons/dynamicaCreateHingeConstraint.xpm +++ b/Extras/MayaPlugin/icons/dynamicaCreateHingeConstraint.xpm @@ -1,213 +1,213 @@ -/* XPM */ -static char * dynamicaCreatePinConstraint_xpm[] = { -"32 32 178 2", -" c #B1B1B1", -". c #A8A8A8", -"+ c #A5A5A5", -"@ c #718172", -"# c #6D866F", -"$ c #999999", -"% c #9B9B9B", -"& c #7B9B7E", -"* c #77CF80", -"= c #69846C", -"- c #8F8F8F", -"; c #989898", -"> c #82A185", -", c #88EC91", -"' c #57DD63", -") c #529C59", -"! c #878787", -"~ c #A2A2A2", -"{ c #949494", -"] c #88AA8B", -"^ c #8EED97", -"/ c #58E465", -"( c #23DC34", -"_ c #30B33C", -": c #667A68", -"< c #959595", -"[ c #9E9E9E", -"} c #757C76", -"| c #9BD9A1", -"1 c #87EC90", -"2 c #4BE259", -"3 c #17DA29", -"4 c #04D718", -"5 c #13C624", -"6 c #528C57", -"7 c #8B8B8B", -"8 c #A9A9A9", -"9 c #A6A6A6", -"0 c #717371", -"a c #99CB9E", -"b c #9BEFA3", -"c c #6FE87A", -"d c #30DE40", -"e c #09D71C", -"f c #00D614", -"g c #33A73E", -"h c #8E8E8E", -"i c #93BB97", -"j c #A3F0AA", -"k c #82EB8C", -"l c #49E257", -"m c #15D927", -"n c #01D615", -"o c #28B235", -"p c #419B49", -"q c #508D56", -"r c #9F9F9F", -"s c #89A68C", -"t c #A6F1AD", -"u c #8DED96", -"v c #59E466", -"w c #21DB32", -"x c #24B532", -"y c #858585", -"z c #969696", -"A c #929292", -"B c #809281", -"C c #A7EBAD", -"D c #94EE9C", -"E c #67E773", -"F c #2DDD3D", -"G c #06D119", -"H c #5E8061", -"I c #A0A0A0", -"J c #919191", -"K c #8A8A8A", -"L c #778278", -"M c #A0E2A6", -"N c #99EFA1", -"O c #73E87E", -"P c #3BDF4A", -"Q c #10D923", -"R c #36A441", -"S c #BE0000", -"T c #A20000", -"U c #7C1D14", -"V c #88744E", -"W c #877D52", -"X c #8B8F5F", -"Y c #95CA89", -"Z c #77E982", -"` c #46E155", -" . c #03D617", -".. c #13C424", -"+. c #69766B", -"@. c #AAAAAA", -"#. c #747D74", -"$. c #94D79B", -"%. c #86EC8F", -"&. c #7EEA88", -"*. c #6DE878", -"=. c #47E155", -"-. c #1CDB2E", -";. c #4C9053", -">. c #75C27C", -",. c #7AEA84", -"'. c #74E97F", -"). c #68E774", -"!. c #5AE467", -"~. c #4CE25A", -"{. c #38DF48", -"]. c #1DDB2F", -"^. c #07D71A", -"/. c #23B631", -"(. c #848484", -"_. c #66896A", -":. c #49C955", -"<. c #35DF45", -"[. c #2BDD3C", -"}. c #22DB33", -"|. c #1ADA2C", -"1. c #11D924", -"2. c #09CE1C", -"3. c #5D8160", -"4. c #69786A", -"5. c #32B03E", -"6. c #02D616", -"7. c #2BAF37", -"8. c #898989", -"9. c #A4A4A4", -"0. c #7F7F7F", -"a. c #399141", -"b. c #06D019", -"c. c #24B631", -"d. c #A7A7A7", -"e. c #AFAFAF", -"f. c #BDBDBD", -"g. c #528156", -"h. c #12C223", -"i. c #14C424", -"j. c #6C746C", -"k. c #AEAEAE", -"l. c #EBEBEB", -"m. c #F4F4F4", -"n. c #C2C2C2", -"o. c #697A6A", -"p. c #26AE33", -"q. c #09CE1B", -"r. c #627D64", -"s. c #A3A3A3", -"t. c #C7C7C7", -"u. c #FCFCFC", -"v. c #E6E6E6", -"w. c #DFDFDF", -"x. c #409C48", -"y. c #04D217", -"z. c #6E726F", -"A. c #B0B0B0", -"B. c #F8F8F8", -"C. c #8D8D8D", -"D. c #528B57", -"E. c #1BA610", -"F. c #5B835F", -"G. c #DDDDDD", -"H. c #EAEAEA", -"I. c #880000", -"J. c #B5B5B5", -"K. c #DEDEDE", -"L. c #E9E9E9", -"M. c #A1A1A1", -"N. c #CACACA", -"O. c #DCDCDC", -"P. c #ACACAC", -"Q. c #D8D8D8", -"R. c #C6C6C6", -"S. c #ADADAD", -"T. c #BA0000", -"U. c #BB0000", -" ", -" . + ", -" . @ # $ ", -" % & * = - ", -" ; > , ' ) ! ~ ", -" { ] ^ / ( _ : < ", -" [ } | 1 2 3 4 5 6 7 8 ", -" 9 0 a b c d e f f f g h ", -" 7 i j k l m n f o p q r ", -" h s t u v w 4 f x y z r ", -" A B C D E F e f G H I ", -" 8 J - K L M N O P Q n f R h ", -" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", -" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", -" S y >.,.'.).!.~.{.].^.f f /.(. ", -" S I _.:.<.[.}.|.1.^.n f 2.3.r ", -" S ; 4.5.^.4 4 6.n f f 7.8. ", -" S 9.0.a.b.f f f f f c.y ", -" S d.e.f.g.h.f f f f i.j.k. ", -" S e.; l.m.n.o.p.f f f q.r.8 ", -" S s.t.u.v.w.; (.x.y.f /.z.A. ", -" S @.~ B.v.w.9 9.A.C.D.E.F.r ", -" S r G.H.w.9.9. $ I.$ ", -" S + J.m.K.s.9. S ", -" S k.$ L.G.M.9. S ", -" S s.N.O.I + S ", -" S P.+ Q.r + S ", -" S ~ R.r 9 S ", -" S S.s.[ P. S ", -" S S S S T.U.S S S S S S S S S S S S ", -" ", -" "}; +/* XPM */ +static char * dynamicaCreatePinConstraint_xpm[] = { +"32 32 178 2", +" c #B1B1B1", +". c #A8A8A8", +"+ c #A5A5A5", +"@ c #718172", +"# c #6D866F", +"$ c #999999", +"% c #9B9B9B", +"& c #7B9B7E", +"* c #77CF80", +"= c #69846C", +"- c #8F8F8F", +"; c #989898", +"> c #82A185", +", c #88EC91", +"' c #57DD63", +") c #529C59", +"! c #878787", +"~ c #A2A2A2", +"{ c #949494", +"] c #88AA8B", +"^ c #8EED97", +"/ c #58E465", +"( c #23DC34", +"_ c #30B33C", +": c #667A68", +"< c #959595", +"[ c #9E9E9E", +"} c #757C76", +"| c #9BD9A1", +"1 c #87EC90", +"2 c #4BE259", +"3 c #17DA29", +"4 c #04D718", +"5 c #13C624", +"6 c #528C57", +"7 c #8B8B8B", +"8 c #A9A9A9", +"9 c #A6A6A6", +"0 c #717371", +"a c #99CB9E", +"b c #9BEFA3", +"c c #6FE87A", +"d c #30DE40", +"e c #09D71C", +"f c #00D614", +"g c #33A73E", +"h c #8E8E8E", +"i c #93BB97", +"j c #A3F0AA", +"k c #82EB8C", +"l c #49E257", +"m c #15D927", +"n c #01D615", +"o c #28B235", +"p c #419B49", +"q c #508D56", +"r c #9F9F9F", +"s c #89A68C", +"t c #A6F1AD", +"u c #8DED96", +"v c #59E466", +"w c #21DB32", +"x c #24B532", +"y c #858585", +"z c #969696", +"A c #929292", +"B c #809281", +"C c #A7EBAD", +"D c #94EE9C", +"E c #67E773", +"F c #2DDD3D", +"G c #06D119", +"H c #5E8061", +"I c #A0A0A0", +"J c #919191", +"K c #8A8A8A", +"L c #778278", +"M c #A0E2A6", +"N c #99EFA1", +"O c #73E87E", +"P c #3BDF4A", +"Q c #10D923", +"R c #36A441", +"S c #BE0000", +"T c #A20000", +"U c #7C1D14", +"V c #88744E", +"W c #877D52", +"X c #8B8F5F", +"Y c #95CA89", +"Z c #77E982", +"` c #46E155", +" . c #03D617", +".. c #13C424", +"+. c #69766B", +"@. c #AAAAAA", +"#. c #747D74", +"$. c #94D79B", +"%. c #86EC8F", +"&. c #7EEA88", +"*. c #6DE878", +"=. c #47E155", +"-. c #1CDB2E", +";. c #4C9053", +">. c #75C27C", +",. c #7AEA84", +"'. c #74E97F", +"). c #68E774", +"!. c #5AE467", +"~. c #4CE25A", +"{. c #38DF48", +"]. c #1DDB2F", +"^. c #07D71A", +"/. c #23B631", +"(. c #848484", +"_. c #66896A", +":. c #49C955", +"<. c #35DF45", +"[. c #2BDD3C", +"}. c #22DB33", +"|. c #1ADA2C", +"1. c #11D924", +"2. c #09CE1C", +"3. c #5D8160", +"4. c #69786A", +"5. c #32B03E", +"6. c #02D616", +"7. c #2BAF37", +"8. c #898989", +"9. c #A4A4A4", +"0. c #7F7F7F", +"a. c #399141", +"b. c #06D019", +"c. c #24B631", +"d. c #A7A7A7", +"e. c #AFAFAF", +"f. c #BDBDBD", +"g. c #528156", +"h. c #12C223", +"i. c #14C424", +"j. c #6C746C", +"k. c #AEAEAE", +"l. c #EBEBEB", +"m. c #F4F4F4", +"n. c #C2C2C2", +"o. c #697A6A", +"p. c #26AE33", +"q. c #09CE1B", +"r. c #627D64", +"s. c #A3A3A3", +"t. c #C7C7C7", +"u. c #FCFCFC", +"v. c #E6E6E6", +"w. c #DFDFDF", +"x. c #409C48", +"y. c #04D217", +"z. c #6E726F", +"A. c #B0B0B0", +"B. c #F8F8F8", +"C. c #8D8D8D", +"D. c #528B57", +"E. c #1BA610", +"F. c #5B835F", +"G. c #DDDDDD", +"H. c #EAEAEA", +"I. c #880000", +"J. c #B5B5B5", +"K. c #DEDEDE", +"L. c #E9E9E9", +"M. c #A1A1A1", +"N. c #CACACA", +"O. c #DCDCDC", +"P. c #ACACAC", +"Q. c #D8D8D8", +"R. c #C6C6C6", +"S. c #ADADAD", +"T. c #BA0000", +"U. c #BB0000", +" ", +" . + ", +" . @ # $ ", +" % & * = - ", +" ; > , ' ) ! ~ ", +" { ] ^ / ( _ : < ", +" [ } | 1 2 3 4 5 6 7 8 ", +" 9 0 a b c d e f f f g h ", +" 7 i j k l m n f o p q r ", +" h s t u v w 4 f x y z r ", +" A B C D E F e f G H I ", +" 8 J - K L M N O P Q n f R h ", +" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", +" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", +" S y >.,.'.).!.~.{.].^.f f /.(. ", +" S I _.:.<.[.}.|.1.^.n f 2.3.r ", +" S ; 4.5.^.4 4 6.n f f 7.8. ", +" S 9.0.a.b.f f f f f c.y ", +" S d.e.f.g.h.f f f f i.j.k. ", +" S e.; l.m.n.o.p.f f f q.r.8 ", +" S s.t.u.v.w.; (.x.y.f /.z.A. ", +" S @.~ B.v.w.9 9.A.C.D.E.F.r ", +" S r G.H.w.9.9. $ I.$ ", +" S + J.m.K.s.9. S ", +" S k.$ L.G.M.9. S ", +" S s.N.O.I + S ", +" S P.+ Q.r + S ", +" S ~ R.r 9 S ", +" S S.s.[ P. S ", +" S S S S T.U.S S S S S S S S S S S S ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateSliderConstraint.xpm b/Extras/MayaPlugin/icons/dynamicaCreateSliderConstraint.xpm index cf5b30224..ad9592063 100644 --- a/Extras/MayaPlugin/icons/dynamicaCreateSliderConstraint.xpm +++ b/Extras/MayaPlugin/icons/dynamicaCreateSliderConstraint.xpm @@ -1,213 +1,213 @@ -/* XPM */ -static char * dynamicaCreatePinConstraint_xpm[] = { -"32 32 178 2", -" c #B1B1B1", -". c #A8A8A8", -"+ c #A5A5A5", -"@ c #718172", -"# c #6D866F", -"$ c #999999", -"% c #9B9B9B", -"& c #7B9B7E", -"* c #77CF80", -"= c #69846C", -"- c #8F8F8F", -"; c #989898", -"> c #82A185", -", c #88EC91", -"' c #57DD63", -") c #529C59", -"! c #878787", -"~ c #A2A2A2", -"{ c #949494", -"] c #88AA8B", -"^ c #8EED97", -"/ c #58E465", -"( c #23DC34", -"_ c #30B33C", -": c #667A68", -"< c #959595", -"[ c #9E9E9E", -"} c #757C76", -"| c #9BD9A1", -"1 c #87EC90", -"2 c #4BE259", -"3 c #17DA29", -"4 c #04D718", -"5 c #13C624", -"6 c #528C57", -"7 c #8B8B8B", -"8 c #A9A9A9", -"9 c #A6A6A6", -"0 c #717371", -"a c #99CB9E", -"b c #9BEFA3", -"c c #6FE87A", -"d c #30DE40", -"e c #09D71C", -"f c #00D614", -"g c #33A73E", -"h c #8E8E8E", -"i c #93BB97", -"j c #A3F0AA", -"k c #82EB8C", -"l c #49E257", -"m c #15D927", -"n c #01D615", -"o c #28B235", -"p c #419B49", -"q c #508D56", -"r c #9F9F9F", -"s c #89A68C", -"t c #A6F1AD", -"u c #8DED96", -"v c #59E466", -"w c #21DB32", -"x c #24B532", -"y c #858585", -"z c #969696", -"A c #929292", -"B c #809281", -"C c #A7EBAD", -"D c #94EE9C", -"E c #67E773", -"F c #2DDD3D", -"G c #06D119", -"H c #5E8061", -"I c #A0A0A0", -"J c #919191", -"K c #8A8A8A", -"L c #778278", -"M c #A0E2A6", -"N c #99EFA1", -"O c #73E87E", -"P c #3BDF4A", -"Q c #10D923", -"R c #36A441", -"S c #BE0000", -"T c #A20000", -"U c #7C1D14", -"V c #88744E", -"W c #877D52", -"X c #8B8F5F", -"Y c #95CA89", -"Z c #77E982", -"` c #46E155", -" . c #03D617", -".. c #13C424", -"+. c #69766B", -"@. c #AAAAAA", -"#. c #747D74", -"$. c #94D79B", -"%. c #86EC8F", -"&. c #7EEA88", -"*. c #6DE878", -"=. c #47E155", -"-. c #1CDB2E", -";. c #4C9053", -">. c #75C27C", -",. c #7AEA84", -"'. c #74E97F", -"). c #68E774", -"!. c #5AE467", -"~. c #4CE25A", -"{. c #38DF48", -"]. c #1DDB2F", -"^. c #07D71A", -"/. c #23B631", -"(. c #848484", -"_. c #66896A", -":. c #49C955", -"<. c #35DF45", -"[. c #2BDD3C", -"}. c #22DB33", -"|. c #1ADA2C", -"1. c #11D924", -"2. c #09CE1C", -"3. c #5D8160", -"4. c #69786A", -"5. c #32B03E", -"6. c #02D616", -"7. c #2BAF37", -"8. c #898989", -"9. c #A4A4A4", -"0. c #7F7F7F", -"a. c #399141", -"b. c #06D019", -"c. c #24B631", -"d. c #A7A7A7", -"e. c #AFAFAF", -"f. c #BDBDBD", -"g. c #528156", -"h. c #12C223", -"i. c #14C424", -"j. c #6C746C", -"k. c #AEAEAE", -"l. c #EBEBEB", -"m. c #F4F4F4", -"n. c #C2C2C2", -"o. c #697A6A", -"p. c #26AE33", -"q. c #09CE1B", -"r. c #627D64", -"s. c #A3A3A3", -"t. c #C7C7C7", -"u. c #FCFCFC", -"v. c #E6E6E6", -"w. c #DFDFDF", -"x. c #409C48", -"y. c #04D217", -"z. c #6E726F", -"A. c #B0B0B0", -"B. c #F8F8F8", -"C. c #8D8D8D", -"D. c #528B57", -"E. c #1BA610", -"F. c #5B835F", -"G. c #DDDDDD", -"H. c #EAEAEA", -"I. c #880000", -"J. c #B5B5B5", -"K. c #DEDEDE", -"L. c #E9E9E9", -"M. c #A1A1A1", -"N. c #CACACA", -"O. c #DCDCDC", -"P. c #ACACAC", -"Q. c #D8D8D8", -"R. c #C6C6C6", -"S. c #ADADAD", -"T. c #BA0000", -"U. c #BB0000", -" ", -" . + ", -" . @ # $ ", -" % & * = - ", -" ; > , ' ) ! ~ ", -" { ] ^ / ( _ : < ", -" [ } | 1 2 3 4 5 6 7 8 ", -" 9 0 a b c d e f f f g h ", -" 7 i j k l m n f o p q r ", -" h s t u v w 4 f x y z r ", -" A B C D E F e f G H I ", -" 8 J - K L M N O P Q n f R h ", -" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", -" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", -" S y >.,.'.).!.~.{.].^.f f /.(. ", -" S I _.:.<.[.}.|.1.^.n f 2.3.r ", -" S ; 4.5.^.4 4 6.n f f 7.8. ", -" S 9.0.a.b.f f f f f c.y ", -" S d.e.f.g.h.f f f f i.j.k. ", -" S e.; l.m.n.o.p.f f f q.r.8 ", -" S s.t.u.v.w.; (.x.y.f /.z.A. ", -" S @.~ B.v.w.9 9.A.C.D.E.F.r ", -" S r G.H.w.9.9. $ I.$ ", -" S + J.m.K.s.9. S ", -" S k.$ L.G.M.9. S ", -" S s.N.O.I + S ", -" S P.+ Q.r + S ", -" S ~ R.r 9 S ", -" S S.s.[ P. S ", -" S S S S T.U.S S S S S S S S S S S S ", -" ", -" "}; +/* XPM */ +static char * dynamicaCreatePinConstraint_xpm[] = { +"32 32 178 2", +" c #B1B1B1", +". c #A8A8A8", +"+ c #A5A5A5", +"@ c #718172", +"# c #6D866F", +"$ c #999999", +"% c #9B9B9B", +"& c #7B9B7E", +"* c #77CF80", +"= c #69846C", +"- c #8F8F8F", +"; c #989898", +"> c #82A185", +", c #88EC91", +"' c #57DD63", +") c #529C59", +"! c #878787", +"~ c #A2A2A2", +"{ c #949494", +"] c #88AA8B", +"^ c #8EED97", +"/ c #58E465", +"( c #23DC34", +"_ c #30B33C", +": c #667A68", +"< c #959595", +"[ c #9E9E9E", +"} c #757C76", +"| c #9BD9A1", +"1 c #87EC90", +"2 c #4BE259", +"3 c #17DA29", +"4 c #04D718", +"5 c #13C624", +"6 c #528C57", +"7 c #8B8B8B", +"8 c #A9A9A9", +"9 c #A6A6A6", +"0 c #717371", +"a c #99CB9E", +"b c #9BEFA3", +"c c #6FE87A", +"d c #30DE40", +"e c #09D71C", +"f c #00D614", +"g c #33A73E", +"h c #8E8E8E", +"i c #93BB97", +"j c #A3F0AA", +"k c #82EB8C", +"l c #49E257", +"m c #15D927", +"n c #01D615", +"o c #28B235", +"p c #419B49", +"q c #508D56", +"r c #9F9F9F", +"s c #89A68C", +"t c #A6F1AD", +"u c #8DED96", +"v c #59E466", +"w c #21DB32", +"x c #24B532", +"y c #858585", +"z c #969696", +"A c #929292", +"B c #809281", +"C c #A7EBAD", +"D c #94EE9C", +"E c #67E773", +"F c #2DDD3D", +"G c #06D119", +"H c #5E8061", +"I c #A0A0A0", +"J c #919191", +"K c #8A8A8A", +"L c #778278", +"M c #A0E2A6", +"N c #99EFA1", +"O c #73E87E", +"P c #3BDF4A", +"Q c #10D923", +"R c #36A441", +"S c #BE0000", +"T c #A20000", +"U c #7C1D14", +"V c #88744E", +"W c #877D52", +"X c #8B8F5F", +"Y c #95CA89", +"Z c #77E982", +"` c #46E155", +" . c #03D617", +".. c #13C424", +"+. c #69766B", +"@. c #AAAAAA", +"#. c #747D74", +"$. c #94D79B", +"%. c #86EC8F", +"&. c #7EEA88", +"*. c #6DE878", +"=. c #47E155", +"-. c #1CDB2E", +";. c #4C9053", +">. c #75C27C", +",. c #7AEA84", +"'. c #74E97F", +"). c #68E774", +"!. c #5AE467", +"~. c #4CE25A", +"{. c #38DF48", +"]. c #1DDB2F", +"^. c #07D71A", +"/. c #23B631", +"(. c #848484", +"_. c #66896A", +":. c #49C955", +"<. c #35DF45", +"[. c #2BDD3C", +"}. c #22DB33", +"|. c #1ADA2C", +"1. c #11D924", +"2. c #09CE1C", +"3. c #5D8160", +"4. c #69786A", +"5. c #32B03E", +"6. c #02D616", +"7. c #2BAF37", +"8. c #898989", +"9. c #A4A4A4", +"0. c #7F7F7F", +"a. c #399141", +"b. c #06D019", +"c. c #24B631", +"d. c #A7A7A7", +"e. c #AFAFAF", +"f. c #BDBDBD", +"g. c #528156", +"h. c #12C223", +"i. c #14C424", +"j. c #6C746C", +"k. c #AEAEAE", +"l. c #EBEBEB", +"m. c #F4F4F4", +"n. c #C2C2C2", +"o. c #697A6A", +"p. c #26AE33", +"q. c #09CE1B", +"r. c #627D64", +"s. c #A3A3A3", +"t. c #C7C7C7", +"u. c #FCFCFC", +"v. c #E6E6E6", +"w. c #DFDFDF", +"x. c #409C48", +"y. c #04D217", +"z. c #6E726F", +"A. c #B0B0B0", +"B. c #F8F8F8", +"C. c #8D8D8D", +"D. c #528B57", +"E. c #1BA610", +"F. c #5B835F", +"G. c #DDDDDD", +"H. c #EAEAEA", +"I. c #880000", +"J. c #B5B5B5", +"K. c #DEDEDE", +"L. c #E9E9E9", +"M. c #A1A1A1", +"N. c #CACACA", +"O. c #DCDCDC", +"P. c #ACACAC", +"Q. c #D8D8D8", +"R. c #C6C6C6", +"S. c #ADADAD", +"T. c #BA0000", +"U. c #BB0000", +" ", +" . + ", +" . @ # $ ", +" % & * = - ", +" ; > , ' ) ! ~ ", +" { ] ^ / ( _ : < ", +" [ } | 1 2 3 4 5 6 7 8 ", +" 9 0 a b c d e f f f g h ", +" 7 i j k l m n f o p q r ", +" h s t u v w 4 f x y z r ", +" A B C D E F e f G H I ", +" 8 J - K L M N O P Q n f R h ", +" S S S S S S S S T U V W X Y D Z ` 3 .f ..+.@. ", +" S I #.$.N ^ %.&.*.=.-.4 f f ;.z ", +" S y >.,.'.).!.~.{.].^.f f /.(. ", +" S I _.:.<.[.}.|.1.^.n f 2.3.r ", +" S ; 4.5.^.4 4 6.n f f 7.8. ", +" S 9.0.a.b.f f f f f c.y ", +" S d.e.f.g.h.f f f f i.j.k. ", +" S e.; l.m.n.o.p.f f f q.r.8 ", +" S s.t.u.v.w.; (.x.y.f /.z.A. ", +" S @.~ B.v.w.9 9.A.C.D.E.F.r ", +" S r G.H.w.9.9. $ I.$ ", +" S + J.m.K.s.9. S ", +" S k.$ L.G.M.9. S ", +" S s.N.O.I + S ", +" S P.+ Q.r + S ", +" S ~ R.r 9 S ", +" S S.s.[ P. S ", +" S S S S T.U.S S S S S S S S S S S S ", +" ", +" "}; diff --git a/Extras/MayaPlugin/install.bat b/Extras/MayaPlugin/install.bat index e5b634b0e..8ae077548 100644 --- a/Extras/MayaPlugin/install.bat +++ b/Extras/MayaPlugin/install.bat @@ -1,3 +1,3 @@ -xcopy /S /Y /C /I /h icons\*.xpm "C:\Program Files\Autodesk\Maya8.5\icons" -xcopy /S /Y /C /I /h scripts\*.mel "C:\Program Files\Autodesk\Maya8.5\scripts" -xcopy /S /Y /C /I /h BulletMayaPluginDebug.mll "C:\Program Files\Autodesk\Maya8.5\bin\plug-ins" +xcopy /S /Y /C /I /h icons\*.xpm "C:\Program Files\Autodesk\Maya8.5\icons" +xcopy /S /Y /C /I /h scripts\*.mel "C:\Program Files\Autodesk\Maya8.5\scripts" +xcopy /S /Y /C /I /h BulletMayaPluginDebug.mll "C:\Program Files\Autodesk\Maya8.5\bin\plug-ins" diff --git a/Extras/MayaPlugin/mvl/base.h b/Extras/MayaPlugin/mvl/base.h index ac7c618e0..f0d181cc7 100644 --- a/Extras/MayaPlugin/mvl/base.h +++ b/Extras/MayaPlugin/mvl/base.h @@ -1,35 +1,35 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//base.h - -#ifndef MVL_BASE_H -#define MVL_BASE_H - -namespace mvl { - - - -} //namespace mvl - -#endif - +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//base.h + +#ifndef MVL_BASE_H +#define MVL_BASE_H + +namespace mvl { + + + +} //namespace mvl + +#endif + diff --git a/Extras/MayaPlugin/mvl/mat.h b/Extras/MayaPlugin/mvl/mat.h index 008894c68..0d327b4a0 100644 --- a/Extras/MayaPlugin/mvl/mat.h +++ b/Extras/MayaPlugin/mvl/mat.h @@ -1,399 +1,399 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//mat.h - -#ifndef MVL_MAT_H -#define MVL_MAT_H - -#include -#include "base.h" -#include "traits.h" - -namespace mvl { - -template -class mat -{ -public: - typedef T value_type; - typedef T& reference; - typedef T const& const_reference; - typedef T* iterator; - typedef T const* const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - -public: - enum { - Rows = R, - Cols = C, - Size = Rows * Cols, - }; - -public: - //constructors - explicit mat() {} - - template - mat(mat const& m) - { - *this = m; - } - - explicit mat(value_type val) - { - for(int i = 0; i < Size; ++i){ - m_data[i] = val; - } - } - - explicit mat(value_type m00, value_type m01, - value_type m10, value_type m11) - { - operator()(0, 0) = m00; operator()(0, 1) = m01; - operator()(1, 0) = m10; operator()(1, 1) = m11; - } - - explicit mat(value_type m00, value_type m01, value_type m02, - value_type m10, value_type m11, value_type m12, - value_type m20, value_type m21, value_type m22) - { - operator()(0, 0) = m00; operator()(0, 1) = m01; operator()(0, 2) = m02; - operator()(1, 0) = m10; operator()(1, 1) = m11; operator()(1, 2) = m12; - operator()(2, 0) = m20; operator()(2, 1) = m21; operator()(2, 2) = m22; - } - - explicit mat(value_type m00, value_type m01, value_type m02, value_type m03, - value_type m10, value_type m11, value_type m12, value_type m13, - value_type m20, value_type m21, value_type m22, value_type m23, - value_type m30, value_type m31, value_type m32, value_type m33) - { - operator()(0, 0) = m00; operator()(0, 1) = m01; operator()(0, 2) = m02; operator()(0, 3) = m03; - operator()(1, 0) = m10; operator()(1, 1) = m11; operator()(1, 2) = m12; operator()(1, 3) = m13; - operator()(2, 0) = m20; operator()(2, 1) = m21; operator()(2, 2) = m22; operator()(2, 3) = m23; - operator()(3, 0) = m30; operator()(3, 1) = m31; operator()(3, 2) = m32; operator()(3, 3) = m33; - } - -public: - //data access - value_type operator()(std::size_t i, std::size_t j) const { return m_data[j * Rows + i]; } - reference operator()(std::size_t i, std::size_t j) { return m_data[j * Rows + i]; } - -public: - //stl - static std::size_t size() { return Size; } - static std::size_t max_size() { return Size; } - static bool empty() { return false; } - - iterator begin() { return m_data; } - iterator end() { return m_data + Size; } - const_iterator begin() const { return m_data; } - const_iterator end() const { return m_data + Size; } - reverse_iterator rbegin() { return reverse_iterator(end()); } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } - const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } - - value_type front() { return m_data[0]; } - value_type back() { return m_data[Size - 1]; } - const_reference front() const { return m_data[0]; } - const_reference back() const { return m_data[Size - 1]; } - - friend std::ostream& operator << (std::ostream& out, mat const& m) { - out << "("; - for(size_t i = 0; i < Rows - 1; i++) { - for(size_t j = 0; j < Cols; j++) { - out << m(i, j) << ", "; - } - out << std::endl; - } - for(size_t j = 0; j < Cols - 1; j++) { - out << m(Rows - 1, j) << ", "; - } - out << m(Rows - 1, Cols - 1) << ")"; - return out; - } - -public: - // - mat& operator=(mat const& rhs) { - std::copy(rhs.begin(),rhs.end(), begin()); - return *this; - } - - template - mat& operator=(mat const& rhs) { - std::copy(rhs.begin(),rhs.end(), begin()); - return *this; - } - -private: - //data is stored in column major order, so the matrix can passed directly to the graphics APIs - T m_data[Size]; -}; - -//assignment operators -// OP(mat, mat) -// OP(mat, T) - -#define MAT_IMPLEMENT_MACRO(OP) \ -template \ -inline \ -mat& \ -operator OP(mat& lhs, mat const& rhs) { \ - for(int i = 0; i < C * R; ++i) { \ - lhs[i] OP rhs[i]; \ - } \ - return lhs; \ -} \ - \ -template \ -inline \ -mat& \ -operator OP(mat& lhs, typename mat::value_type const& rhs) { \ - for(int i = 0; i < C * R; ++i) { \ - lhs[i] OP rhs[i]; \ - } \ - return lhs; \ -} \ - -MAT_IMPLEMENT_MACRO(+=) -MAT_IMPLEMENT_MACRO(-=) -MAT_IMPLEMENT_MACRO(*=) -MAT_IMPLEMENT_MACRO(/=) - -#undef MAT_IMPLEMENT_MACRO - -//operator + (mat, mat) -template -inline -mat::value_type, R, C> -operator + (mat const& lhs, mat const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs(i, j) + rhs(i, j); - } - } - return res; -} - -//operator - (mat, mat) -template -inline -mat::value_type, R, C> -operator - (mat const& lhs, mat const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs(i, j) - rhs(i, j); - } - } - return res; -} - -//operator * (mat, POD) -template -inline -mat::value_type, R, C> -operator * (mat const& lhs, T2 const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs(i, j) * rhs; - } - } - return res; -} - -//operator * (POD, mat) -template -inline -mat::value_type, R, C> -operator * (T1 const& lhs, mat const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs * rhs(i, j); - } - } - return res; -} - -//operator / (mat, POD) -template -inline -mat::value_type, R, C> -operator / (mat const& lhs, T2 const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs(i, j) / rhs; - } - } - return res; -} - -//element_prod(mat, mat) -template -inline -mat::value_type, R, C> -element_prod(mat const& lhs, mat const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs(i, j) * rhs(i, j); - } - } - return res; -} - -//element_div(mat, mat) -template -inline -mat::value_type, R, C> -element_div(mat const& lhs, mat const& rhs) { - mat::value_type, R, C> res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = lhs(i, j) / rhs(i, j); - } - } - return res; -} - -//unary operator -(mat) -template -inline -mat -operator -(mat const& rhs) { - mat res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = -rhs(i, j); - } - } - return res; -} - -//matrix transpose -template -inline -mat -trans(mat const& rhs) { - mat res; - for(int i = 0; i < R ; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = rhs(j, i); - } - } - return res; -} - -//identity matrix -template -inline -mat -identity() { - mat res; - for(int i = 0; i < Sz ; ++i) { - for(int j = 0; j < Sz; ++j) { - res(i, j) = i == j ? 1 : 0; - } - } - return res; -} - -//matrix diagonal as vector (for square matrices) -template -inline -vec -diag(mat const& rhs) { - vec res; - for(int i = 0; i < N; ++i) { - res[i] = rhs(i, i); - } - return res; -} - -//matrix row as vector -template -inline -vec -row(mat const& rhs, std::size_t r) { - vec res; - for(int i = 0; i < C; ++i) { - res[i] = rhs(r, i); - } - return res; -} - -//matrix column as vector -template -inline -vec -col(mat const& rhs, std::size_t c) { - vec res; - for(int i = 0; i < R; ++i) { - res[i] = rhs(i, c); - } - return res; -} - - -//matrix-matrix product -template -inline -mat::value_type, R1, C2> -prod(mat const& lhs, mat const& rhs) { - mat::value_type, R1, C2> res; - for(int i = 0; i < R1; ++i) { - for(int j = 0; j < C2; ++j) { - res(i, j) = 0; - for(int k = 0; k < C1; ++k) { - res(i, j) += lhs(i, k) * rhs(k, j); - } - } - } - return res; -} - -//matrix - column vector product -template -inline -vec::value_type, R> -prod(mat const& lhs, vec const& rhs) { - vec::value_type, R> res; - for(int i = 0; i < R; ++i) { - res(i) = 0; - for(int j = 0; j < C; ++j) { - res(i) += lhs(i, j) * rhs(j); - } - } - return res; -} - - -} // namespace mvl - -#endif +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//mat.h + +#ifndef MVL_MAT_H +#define MVL_MAT_H + +#include +#include "base.h" +#include "traits.h" + +namespace mvl { + +template +class mat +{ +public: + typedef T value_type; + typedef T& reference; + typedef T const& const_reference; + typedef T* iterator; + typedef T const* const_iterator; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + +public: + enum { + Rows = R, + Cols = C, + Size = Rows * Cols, + }; + +public: + //constructors + explicit mat() {} + + template + mat(mat const& m) + { + *this = m; + } + + explicit mat(value_type val) + { + for(int i = 0; i < Size; ++i){ + m_data[i] = val; + } + } + + explicit mat(value_type m00, value_type m01, + value_type m10, value_type m11) + { + operator()(0, 0) = m00; operator()(0, 1) = m01; + operator()(1, 0) = m10; operator()(1, 1) = m11; + } + + explicit mat(value_type m00, value_type m01, value_type m02, + value_type m10, value_type m11, value_type m12, + value_type m20, value_type m21, value_type m22) + { + operator()(0, 0) = m00; operator()(0, 1) = m01; operator()(0, 2) = m02; + operator()(1, 0) = m10; operator()(1, 1) = m11; operator()(1, 2) = m12; + operator()(2, 0) = m20; operator()(2, 1) = m21; operator()(2, 2) = m22; + } + + explicit mat(value_type m00, value_type m01, value_type m02, value_type m03, + value_type m10, value_type m11, value_type m12, value_type m13, + value_type m20, value_type m21, value_type m22, value_type m23, + value_type m30, value_type m31, value_type m32, value_type m33) + { + operator()(0, 0) = m00; operator()(0, 1) = m01; operator()(0, 2) = m02; operator()(0, 3) = m03; + operator()(1, 0) = m10; operator()(1, 1) = m11; operator()(1, 2) = m12; operator()(1, 3) = m13; + operator()(2, 0) = m20; operator()(2, 1) = m21; operator()(2, 2) = m22; operator()(2, 3) = m23; + operator()(3, 0) = m30; operator()(3, 1) = m31; operator()(3, 2) = m32; operator()(3, 3) = m33; + } + +public: + //data access + value_type operator()(std::size_t i, std::size_t j) const { return m_data[j * Rows + i]; } + reference operator()(std::size_t i, std::size_t j) { return m_data[j * Rows + i]; } + +public: + //stl + static std::size_t size() { return Size; } + static std::size_t max_size() { return Size; } + static bool empty() { return false; } + + iterator begin() { return m_data; } + iterator end() { return m_data + Size; } + const_iterator begin() const { return m_data; } + const_iterator end() const { return m_data + Size; } + reverse_iterator rbegin() { return reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + value_type front() { return m_data[0]; } + value_type back() { return m_data[Size - 1]; } + const_reference front() const { return m_data[0]; } + const_reference back() const { return m_data[Size - 1]; } + + friend std::ostream& operator << (std::ostream& out, mat const& m) { + out << "("; + for(size_t i = 0; i < Rows - 1; i++) { + for(size_t j = 0; j < Cols; j++) { + out << m(i, j) << ", "; + } + out << std::endl; + } + for(size_t j = 0; j < Cols - 1; j++) { + out << m(Rows - 1, j) << ", "; + } + out << m(Rows - 1, Cols - 1) << ")"; + return out; + } + +public: + // + mat& operator=(mat const& rhs) { + std::copy(rhs.begin(),rhs.end(), begin()); + return *this; + } + + template + mat& operator=(mat const& rhs) { + std::copy(rhs.begin(),rhs.end(), begin()); + return *this; + } + +private: + //data is stored in column major order, so the matrix can passed directly to the graphics APIs + T m_data[Size]; +}; + +//assignment operators +// OP(mat, mat) +// OP(mat, T) + +#define MAT_IMPLEMENT_MACRO(OP) \ +template \ +inline \ +mat& \ +operator OP(mat& lhs, mat const& rhs) { \ + for(int i = 0; i < C * R; ++i) { \ + lhs[i] OP rhs[i]; \ + } \ + return lhs; \ +} \ + \ +template \ +inline \ +mat& \ +operator OP(mat& lhs, typename mat::value_type const& rhs) { \ + for(int i = 0; i < C * R; ++i) { \ + lhs[i] OP rhs[i]; \ + } \ + return lhs; \ +} \ + +MAT_IMPLEMENT_MACRO(+=) +MAT_IMPLEMENT_MACRO(-=) +MAT_IMPLEMENT_MACRO(*=) +MAT_IMPLEMENT_MACRO(/=) + +#undef MAT_IMPLEMENT_MACRO + +//operator + (mat, mat) +template +inline +mat::value_type, R, C> +operator + (mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) + rhs(i, j); + } + } + return res; +} + +//operator - (mat, mat) +template +inline +mat::value_type, R, C> +operator - (mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) - rhs(i, j); + } + } + return res; +} + +//operator * (mat, POD) +template +inline +mat::value_type, R, C> +operator * (mat const& lhs, T2 const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) * rhs; + } + } + return res; +} + +//operator * (POD, mat) +template +inline +mat::value_type, R, C> +operator * (T1 const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs * rhs(i, j); + } + } + return res; +} + +//operator / (mat, POD) +template +inline +mat::value_type, R, C> +operator / (mat const& lhs, T2 const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) / rhs; + } + } + return res; +} + +//element_prod(mat, mat) +template +inline +mat::value_type, R, C> +element_prod(mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) * rhs(i, j); + } + } + return res; +} + +//element_div(mat, mat) +template +inline +mat::value_type, R, C> +element_div(mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) / rhs(i, j); + } + } + return res; +} + +//unary operator -(mat) +template +inline +mat +operator -(mat const& rhs) { + mat res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = -rhs(i, j); + } + } + return res; +} + +//matrix transpose +template +inline +mat +trans(mat const& rhs) { + mat res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = rhs(j, i); + } + } + return res; +} + +//identity matrix +template +inline +mat +identity() { + mat res; + for(int i = 0; i < Sz ; ++i) { + for(int j = 0; j < Sz; ++j) { + res(i, j) = i == j ? 1 : 0; + } + } + return res; +} + +//matrix diagonal as vector (for square matrices) +template +inline +vec +diag(mat const& rhs) { + vec res; + for(int i = 0; i < N; ++i) { + res[i] = rhs(i, i); + } + return res; +} + +//matrix row as vector +template +inline +vec +row(mat const& rhs, std::size_t r) { + vec res; + for(int i = 0; i < C; ++i) { + res[i] = rhs(r, i); + } + return res; +} + +//matrix column as vector +template +inline +vec +col(mat const& rhs, std::size_t c) { + vec res; + for(int i = 0; i < R; ++i) { + res[i] = rhs(i, c); + } + return res; +} + + +//matrix-matrix product +template +inline +mat::value_type, R1, C2> +prod(mat const& lhs, mat const& rhs) { + mat::value_type, R1, C2> res; + for(int i = 0; i < R1; ++i) { + for(int j = 0; j < C2; ++j) { + res(i, j) = 0; + for(int k = 0; k < C1; ++k) { + res(i, j) += lhs(i, k) * rhs(k, j); + } + } + } + return res; +} + +//matrix - column vector product +template +inline +vec::value_type, R> +prod(mat const& lhs, vec const& rhs) { + vec::value_type, R> res; + for(int i = 0; i < R; ++i) { + res(i) = 0; + for(int j = 0; j < C; ++j) { + res(i) += lhs(i, j) * rhs(j); + } + } + return res; +} + + +} // namespace mvl + +#endif diff --git a/Extras/MayaPlugin/mvl/quat.h b/Extras/MayaPlugin/mvl/quat.h index bc241d74b..02c7c2d57 100644 --- a/Extras/MayaPlugin/mvl/quat.h +++ b/Extras/MayaPlugin/mvl/quat.h @@ -1,279 +1,279 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//quat.h - -#ifndef MVL_QUAT_H -#define MVL_QUAT_H - -#include - -#include "vec.h" -#include "mat.h" - -//quaternions are vectors of size 4 -// it's assumed that the layout is in the form (w, (x, y, z)), -// so that the identity quaternion is (1, 0, 0, 0) - -namespace mvl { - -//quaternion conjugate -template -inline vec -qconj(vec const& rhs) { - return vec(-rhs[0], rhs[1], rhs[2], rhs[3]); -} - -//quaternion identity -template -inline -vec -qidentity() { - return vec(1, 0, 0, 0); -} - -//quaternion - quaternion product -template -inline -vec::value_type, 4> -qprod(vec const& lhs, vec const& rhs) { - typedef typename promote_traits::value_type value_type; - return vec((lhs(0)*rhs(0)) - (lhs(1)*rhs(1)) - (lhs(2)*rhs(2)) - (lhs(3)*rhs(3)), - (lhs(0)*rhs(1)) + (lhs(1)*rhs(0)) + (lhs(2)*rhs(3)) - (lhs(3)*rhs(2)), - (lhs(0)*rhs(2)) - (lhs(1)*rhs(3)) + (lhs(2)*rhs(0)) + (lhs(3)*rhs(1)), - (lhs(0)*rhs(3)) + (lhs(1)*rhs(2)) - (lhs(2)*rhs(1)) + (lhs(3)*rhs(0))); -} - -//quanternion - vector product (rotation) -template -inline -vec::value_type, 3> -qprod(vec const& q, vec const& v) { - typedef typename promote_traits::value_type value_type; - vec tmp = qprod(qprod(q, vec(0, v[0], v[1], v[2])), qconj(q)); - return vec(tmp[0], tmp[1], tmp[2]); -} - -//spherical interpolation between q0 and q1 -template -inline -vec::value_type, 4> -qslerp(vec const& q1, vec const& q2, T3 t) { - typedef typename promote_traits::value_type value_type; - value_type omega, cosom, sinom, scale0, scale1; - vec tmp; - - cosom = dot(q1, q2); - - if (cosom < static_cast(0.0)) { - cosom = -cosom; - tmp = -q2; - } else { - tmp = q2; - } - - if ((static_cast(1.0) - cosom) > std::numeric_limits::epsilon()) { - omega = (value_type) acos(cosom); - sinom = sin(omega); - scale0 = sin((static_cast(1.0) - t) * omega) / sinom; - scale1 = sin(t * omega) / sinom; - } else { - scale0 = static_cast(1.0) - t; - scale1 = t; - } - - return scale0 * q1 + scale1 * tmp; -} - -//init quaternion from axis-angle -template -inline -vec::value_type, 4> -q_from_axis_angle(vec const& axis, T2 theta) { - typedef typename promote_traits::value_type value_type; - value_type sin_theta = sin(static_cast(static_cast(0.5)) * theta); - return vec(cos(static_cast(static_cast(0.5)) * theta), - sin_theta * axis[0], - sin_theta * axis[1], - sin_theta * axis[2]); -} - -//get the axis/angle from quaternion -template -inline -void -q_to_axis_angle(vec const& q, vec& axis, T3& theta) -{ - T3 half_theta= acos(q[0]); - - if(half_theta > 10 * std::numeric_limits::epsilon()) { - T3 oost = 1 / sin(half_theta); - - axis[0] = oost * q[1]; - axis[1] = oost * q[2]; - axis[2] = oost * q[3]; - theta = 2 * half_theta; - } else { - axis[0] = axis[1] = axis[2] = 0; - theta = 0; - } -} - -//init quaternion from rotation matrix -template -inline -vec -q_from_mat(mat const& m) { - T1 trace, s, hos; - trace = m(0, 0) + m(1, 1) + m(2, 2); - if (trace > static_cast(0.0)) { - s = sqrt(trace + static_cast(1.0)); - hos = static_cast(0.5) / s; - return vec(s * static_cast(0.5), (m(2, 1) - m(1, 2)) * hos, (m(0, 2) - m(2, 0)) * hos, (m(1, 0) - m(0, 1)) * hos); - } else { - int biggest; - enum {A,T,I}; - if (m(0, 0) > m(1, 1)) { - if (m(2, 2) > m(0, 0)) biggest = I; - else biggest = A; - } else { - if (m(2, 2) > m(0, 0)) biggest = I; - else biggest = T; - } - switch (biggest) { - case A: - s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); - } - // I - s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); - } - // T - s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); - } - break; - case T: - s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); - } - // I - s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); - } - // A - s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); - } - break; - case I: - s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); - } - // A - s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); - } - // T - s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); - if (s > (100 * std::numeric_limits::epsilon())) { - hos = static_cast(0.5) / s; - return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); - } - break; - } - } -} - -//get rotation matrix from quaternion -template -inline -void -q_to_mat(vec const& q, mat& m) { - T X2,Y2,Z2; //2*QX, 2*QY, 2*QZ - T XX2,YY2,ZZ2; //2*QX*QX, 2*QY*QY, 2*QZ*QZ - T XY2,XZ2,XW2; //2*QX*QY, 2*QX*QZ, 2*QX*QW - T YZ2,YW2,ZW2; // ... - - X2 = 2 * q[1]; - XX2 = X2 * q[1]; - XY2 = X2 * q[2]; - XZ2 = X2 * q[3]; - XW2 = X2 * q[0]; - - Y2 = 2 * q[2]; - YY2 = Y2 * q[2]; - YZ2 = Y2 * q[3]; - YW2 = Y2 * q[0]; - - Z2 = 2 * q[3]; - ZZ2 = Z2 * q[3]; - ZW2 = Z2 * q[0]; - - m(0, 0) = 1 - YY2 - ZZ2; - m(0, 1) = XY2 - ZW2; - m(0, 2) = XZ2 + YW2; - - m(1, 0) = XY2 + ZW2; - m(1, 1) = 1 - XX2 - ZZ2; - m(1, 2) = YZ2 - XW2; - - m(2, 0) = XZ2 - YW2; - m(2, 1) = YZ2 + XW2; - m(2, 2) = 1 - XX2 - YY2; - -} - -template -mat -cmat(T const* m) -{ - mat res; - for(int i = 0; i < R; ++i) { - for(int j = 0; j < C; ++j) { - res(i, j) = m[i * C + j]; - } - } - return res; -} - -} //namespace mvl - - -#endif +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//quat.h + +#ifndef MVL_QUAT_H +#define MVL_QUAT_H + +#include + +#include "vec.h" +#include "mat.h" + +//quaternions are vectors of size 4 +// it's assumed that the layout is in the form (w, (x, y, z)), +// so that the identity quaternion is (1, 0, 0, 0) + +namespace mvl { + +//quaternion conjugate +template +inline vec +qconj(vec const& rhs) { + return vec(-rhs[0], rhs[1], rhs[2], rhs[3]); +} + +//quaternion identity +template +inline +vec +qidentity() { + return vec(1, 0, 0, 0); +} + +//quaternion - quaternion product +template +inline +vec::value_type, 4> +qprod(vec const& lhs, vec const& rhs) { + typedef typename promote_traits::value_type value_type; + return vec((lhs(0)*rhs(0)) - (lhs(1)*rhs(1)) - (lhs(2)*rhs(2)) - (lhs(3)*rhs(3)), + (lhs(0)*rhs(1)) + (lhs(1)*rhs(0)) + (lhs(2)*rhs(3)) - (lhs(3)*rhs(2)), + (lhs(0)*rhs(2)) - (lhs(1)*rhs(3)) + (lhs(2)*rhs(0)) + (lhs(3)*rhs(1)), + (lhs(0)*rhs(3)) + (lhs(1)*rhs(2)) - (lhs(2)*rhs(1)) + (lhs(3)*rhs(0))); +} + +//quanternion - vector product (rotation) +template +inline +vec::value_type, 3> +qprod(vec const& q, vec const& v) { + typedef typename promote_traits::value_type value_type; + vec tmp = qprod(qprod(q, vec(0, v[0], v[1], v[2])), qconj(q)); + return vec(tmp[0], tmp[1], tmp[2]); +} + +//spherical interpolation between q0 and q1 +template +inline +vec::value_type, 4> +qslerp(vec const& q1, vec const& q2, T3 t) { + typedef typename promote_traits::value_type value_type; + value_type omega, cosom, sinom, scale0, scale1; + vec tmp; + + cosom = dot(q1, q2); + + if (cosom < static_cast(0.0)) { + cosom = -cosom; + tmp = -q2; + } else { + tmp = q2; + } + + if ((static_cast(1.0) - cosom) > std::numeric_limits::epsilon()) { + omega = (value_type) acos(cosom); + sinom = sin(omega); + scale0 = sin((static_cast(1.0) - t) * omega) / sinom; + scale1 = sin(t * omega) / sinom; + } else { + scale0 = static_cast(1.0) - t; + scale1 = t; + } + + return scale0 * q1 + scale1 * tmp; +} + +//init quaternion from axis-angle +template +inline +vec::value_type, 4> +q_from_axis_angle(vec const& axis, T2 theta) { + typedef typename promote_traits::value_type value_type; + value_type sin_theta = sin(static_cast(static_cast(0.5)) * theta); + return vec(cos(static_cast(static_cast(0.5)) * theta), + sin_theta * axis[0], + sin_theta * axis[1], + sin_theta * axis[2]); +} + +//get the axis/angle from quaternion +template +inline +void +q_to_axis_angle(vec const& q, vec& axis, T3& theta) +{ + T3 half_theta= acos(q[0]); + + if(half_theta > 10 * std::numeric_limits::epsilon()) { + T3 oost = 1 / sin(half_theta); + + axis[0] = oost * q[1]; + axis[1] = oost * q[2]; + axis[2] = oost * q[3]; + theta = 2 * half_theta; + } else { + axis[0] = axis[1] = axis[2] = 0; + theta = 0; + } +} + +//init quaternion from rotation matrix +template +inline +vec +q_from_mat(mat const& m) { + T1 trace, s, hos; + trace = m(0, 0) + m(1, 1) + m(2, 2); + if (trace > static_cast(0.0)) { + s = sqrt(trace + static_cast(1.0)); + hos = static_cast(0.5) / s; + return vec(s * static_cast(0.5), (m(2, 1) - m(1, 2)) * hos, (m(0, 2) - m(2, 0)) * hos, (m(1, 0) - m(0, 1)) * hos); + } else { + int biggest; + enum {A,T,I}; + if (m(0, 0) > m(1, 1)) { + if (m(2, 2) > m(0, 0)) biggest = I; + else biggest = A; + } else { + if (m(2, 2) > m(0, 0)) biggest = I; + else biggest = T; + } + switch (biggest) { + case A: + s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); + } + // I + s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); + } + // T + s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); + } + break; + case T: + s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); + } + // I + s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); + } + // A + s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); + } + break; + case I: + s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); + } + // A + s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); + } + // T + s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); + } + break; + } + } +} + +//get rotation matrix from quaternion +template +inline +void +q_to_mat(vec const& q, mat& m) { + T X2,Y2,Z2; //2*QX, 2*QY, 2*QZ + T XX2,YY2,ZZ2; //2*QX*QX, 2*QY*QY, 2*QZ*QZ + T XY2,XZ2,XW2; //2*QX*QY, 2*QX*QZ, 2*QX*QW + T YZ2,YW2,ZW2; // ... + + X2 = 2 * q[1]; + XX2 = X2 * q[1]; + XY2 = X2 * q[2]; + XZ2 = X2 * q[3]; + XW2 = X2 * q[0]; + + Y2 = 2 * q[2]; + YY2 = Y2 * q[2]; + YZ2 = Y2 * q[3]; + YW2 = Y2 * q[0]; + + Z2 = 2 * q[3]; + ZZ2 = Z2 * q[3]; + ZW2 = Z2 * q[0]; + + m(0, 0) = 1 - YY2 - ZZ2; + m(0, 1) = XY2 - ZW2; + m(0, 2) = XZ2 + YW2; + + m(1, 0) = XY2 + ZW2; + m(1, 1) = 1 - XX2 - ZZ2; + m(1, 2) = YZ2 - XW2; + + m(2, 0) = XZ2 - YW2; + m(2, 1) = YZ2 + XW2; + m(2, 2) = 1 - XX2 - YY2; + +} + +template +mat +cmat(T const* m) +{ + mat res; + for(int i = 0; i < R; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = m[i * C + j]; + } + } + return res; +} + +} //namespace mvl + + +#endif diff --git a/Extras/MayaPlugin/mvl/traits.h b/Extras/MayaPlugin/mvl/traits.h index 65e6b01e6..824840ae1 100644 --- a/Extras/MayaPlugin/mvl/traits.h +++ b/Extras/MayaPlugin/mvl/traits.h @@ -1,85 +1,85 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//traits.h - -#ifndef MVL_TRAITS_H -#define MVL_TRAITS_H - -namespace mvl { - -//simple promotion for now - -//check if a type is a POD -template -struct isPOD { enum { value = false }; }; -template<> struct isPOD { enum { value = true }; }; -template<> struct isPOD { enum { value = true }; }; -template<> struct isPOD { enum { value = true }; }; -template<> struct isPOD { enum { value = true }; }; -template<> struct isPOD { enum { value = true }; }; -template<> struct isPOD { enum { value = true }; }; - -// -template struct ifThenElse { typedef T2 value_type; }; -template struct ifThenElse { typedef T1 value_type; }; - -template -struct promote_traits -{ - typedef typename ifThenElse::value, T2, T1>::value_type value_type; -}; - -template -struct promote_traits -{ - typedef T value_type; -}; - -#define TRAITS_DEFINE_MACRO(T1, T2, TP) \ -template<> \ -struct promote_traits \ -{ \ - typedef TP value_type; \ -}; \ -template<> \ -struct promote_traits \ -{ \ - typedef TP value_type; \ -}; - -TRAITS_DEFINE_MACRO(int, float, float) -TRAITS_DEFINE_MACRO(int, double, double) -TRAITS_DEFINE_MACRO(int, long double, long double) - -TRAITS_DEFINE_MACRO(float, double, double) -TRAITS_DEFINE_MACRO(float, long double, long double) - -TRAITS_DEFINE_MACRO(double, long double, long double) - -#undef TRAITS_DEFINE_MACRO - - -} // namespace mvl - -#endif - +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//traits.h + +#ifndef MVL_TRAITS_H +#define MVL_TRAITS_H + +namespace mvl { + +//simple promotion for now + +//check if a type is a POD +template +struct isPOD { enum { value = false }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; + +// +template struct ifThenElse { typedef T2 value_type; }; +template struct ifThenElse { typedef T1 value_type; }; + +template +struct promote_traits +{ + typedef typename ifThenElse::value, T2, T1>::value_type value_type; +}; + +template +struct promote_traits +{ + typedef T value_type; +}; + +#define TRAITS_DEFINE_MACRO(T1, T2, TP) \ +template<> \ +struct promote_traits \ +{ \ + typedef TP value_type; \ +}; \ +template<> \ +struct promote_traits \ +{ \ + typedef TP value_type; \ +}; + +TRAITS_DEFINE_MACRO(int, float, float) +TRAITS_DEFINE_MACRO(int, double, double) +TRAITS_DEFINE_MACRO(int, long double, long double) + +TRAITS_DEFINE_MACRO(float, double, double) +TRAITS_DEFINE_MACRO(float, long double, long double) + +TRAITS_DEFINE_MACRO(double, long double, long double) + +#undef TRAITS_DEFINE_MACRO + + +} // namespace mvl + +#endif + diff --git a/Extras/MayaPlugin/mvl/util.h b/Extras/MayaPlugin/mvl/util.h index bf86bb0b2..59651d94e 100644 --- a/Extras/MayaPlugin/mvl/util.h +++ b/Extras/MayaPlugin/mvl/util.h @@ -1,61 +1,61 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//util.h - -#ifndef MVL_UTIL_H -#define MVL_UTIL_H - -#include -#include "base.h" -#include "traits.h" -#include "vec.h" - -namespace mvl { - -//translation -template -inline -mat translation(vec const& v) -{ - return mat(1, 0, 0, v(0), - 0, 1, 0, v(1), - 0, 0, 1, v(2), - 0, 0, 0, 1); -} - -//scale -template -inline -mat scale(vec const& v) -{ - return mat (v(0), 0, 0, 0, - 0, v(1), 0, 0, - 0, 0, v(2), 0, - 0, 0, 0, 1); -} - -} // namespace mvl - - - -#endif +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//util.h + +#ifndef MVL_UTIL_H +#define MVL_UTIL_H + +#include +#include "base.h" +#include "traits.h" +#include "vec.h" + +namespace mvl { + +//translation +template +inline +mat translation(vec const& v) +{ + return mat(1, 0, 0, v(0), + 0, 1, 0, v(1), + 0, 0, 1, v(2), + 0, 0, 0, 1); +} + +//scale +template +inline +mat scale(vec const& v) +{ + return mat (v(0), 0, 0, 0, + 0, v(1), 0, 0, + 0, 0, v(2), 0, + 0, 0, 0, 1); +} + +} // namespace mvl + + + +#endif diff --git a/Extras/MayaPlugin/mvl/vec.h b/Extras/MayaPlugin/mvl/vec.h index a289efbda..26190f328 100644 --- a/Extras/MayaPlugin/mvl/vec.h +++ b/Extras/MayaPlugin/mvl/vec.h @@ -1,347 +1,347 @@ -/* -Bullet Continuous Collision Detection and Physics Library Maya Plugin -Copyright (c) 2008 Walt Disney Studios - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising -from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must -not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Written by: Nicola Candussi -*/ - -//vec.h - -#ifndef MVL_VEC_H -#define MVL_VEC_H - -#include -#include -#include "base.h" -#include "traits.h" - -namespace mvl { - -template -class vec -{ -public: - typedef T value_type; - typedef T& reference; - typedef T const& const_reference; - typedef T* iterator; - typedef T const* const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - -public: - enum { - Size = Sz, - }; - -public: - //constructors - explicit vec() {} - - template - vec(vec const& v) - { - *this = v; - } - - explicit vec(value_type val) - { - for(int i = 0; i < Size; ++i) { - m_data[i] = val; - } - } - - explicit vec(value_type x0, value_type x1) - { - m_data[0] = x0; m_data[1] = x1; - } - - explicit vec(value_type x0, value_type x1, value_type x2) - { - m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; - } - - explicit vec(value_type x0, value_type x1, value_type x2, value_type x3) - { - m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; - } - - explicit vec(value_type x0, value_type x1, value_type x2, value_type x3, value_type x4) - { - m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; - } - - explicit vec(value_type x0, value_type x1, value_type x2, value_type x3, value_type x4, value_type x5) - { - m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; m_data[5] = x5; - } - -public: - //data access - value_type operator[](std::size_t i) const { return m_data[i]; } - reference operator[](std::size_t i) { return m_data[i]; } - - value_type operator()(std::size_t i) const { return m_data[i]; } - reference operator()(std::size_t i) { return m_data[i]; } - -public: - //stl - static std::size_t size() { return Size; } - static std::size_t max_size() { return Size; } - static bool empty() { return false; } - - iterator begin() { return m_data; } - iterator end() { return m_data + Size; } - const_iterator begin() const { return m_data; } - const_iterator end() const { return m_data + Size; } - reverse_iterator rbegin() { return reverse_iterator(end()); } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } - const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } - - value_type front() { return m_data[0]; } - value_type back() { return m_data[Size - 1]; } - const_reference front() const { return m_data[0]; } - const_reference back() const { return m_data[Size - 1]; } - - friend std::ostream& operator << (std::ostream& out, vec const& v) { - out << "("; - for(size_t i = 0; i < Size - 1; i++) { - out << v(i) << ", "; - } - out << v(Size - 1) << ")"; - return out; - } - -public: - //assignment - vec& operator=(vec const& rhs) { - for(int i = 0; i < Size; ++i) { - m_data[i] = rhs[i]; - } - return *this; - } - - template - vec& operator=(vec const& rhs) { - for(int i = 0; i < Size; ++i) { - m_data[i] = rhs[i]; - } - return *this; - } - -private: - T m_data[Size]; -}; - - -//assignment operators -// OP(vec, vec) -// OP(vec, T) - -#define VEC_IMPLEMENT_MACRO(OP) \ -template \ -inline \ -vec& \ -operator OP(vec& lhs, vec const& rhs) { \ - for(int i = 0; i < Sz; ++i) { \ - lhs[i] OP rhs[i]; \ - } \ - return lhs; \ -} \ - \ -template \ -inline \ -vec& \ -operator OP(vec& lhs, T const& rhs) { \ - for(int i = 0; i < Sz; ++i) { \ - lhs[i] OP rhs; \ - } \ - return lhs; \ -} \ - -VEC_IMPLEMENT_MACRO(+=) -VEC_IMPLEMENT_MACRO(-=) -VEC_IMPLEMENT_MACRO(*=) -VEC_IMPLEMENT_MACRO(/=) - -#undef VEC_IMPLEMENT_MACRO - -//operator + (vec, vec) -template -inline -vec::value_type, Sz> -operator + (vec const& lhs, vec const& rhs) -{ - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs[i] + rhs[i]; - } - return res; -} - -//operator - (vec, vec) -template -inline -vec::value_type, Sz> -operator - (vec const& lhs, vec const& rhs) -{ - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs[i] - rhs[i]; - } - return res; -} - -//operator * (vec, POD) -template -inline -vec::value_type, Sz> -operator * (vec const& lhs, T2 const& rhs) { - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs[i] * rhs; - } - return res; -} - -//operator * (POD, vec) -template -inline -vec::value_type, Sz> -operator * (T1 const& lhs, vec const& rhs) { - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs * rhs[i]; - } - return res; -} - -//operator / (vec, POD) -template -inline -vec::value_type, Sz> -operator / (vec const& lhs, T2 const& rhs) { - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs[i] / rhs; - } - return res; -} - -//element_prod(vec, vec) -template -inline -vec::value_type, Sz> -element_prod(vec const& lhs, vec const& rhs) { - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs[i] * rhs[i]; - } - return res; -} - -//element_div(vec, vec) -template -inline -vec::value_type, Sz> -element_div(vec const& lhs, vec const& rhs) { - vec::value_type, Sz> res; - for(int i = 0; i < Sz; ++i) { - res[i] = lhs[i] / rhs[i]; - } - return res; -} - -//unary operator -(expr_vec) -template -inline -vec -operator -(vec const& rhs) { - vec res; - for(int i = 0; i < Sz; ++i) { - res[i] = -rhs[i]; - } - return res; -} - -//dot product -template -inline -typename promote_traits::value_type -dot(vec const& lhs, vec const& rhs) -{ - typename promote_traits::value_type res(0); - for(int i = 0; i < Sz; ++i) { - res += rhs[i] * lhs[i]; - } - return res; -} - - -//cross product -template -inline -vec::value_type, 3> -cross(vec const& lhs, vec const& rhs) { - typedef typename promote_traits::value_type value_type; - return vec(lhs(1)*rhs(2) - rhs(1)*lhs(2), - rhs(0)*lhs(2) - lhs(0)*rhs(2), - lhs(0)*rhs(1) - rhs(0)*lhs(1)); -} - -//length of the vector -template -inline T -norm2(vec const& rhs) -{ - return static_cast(sqrt(dot(rhs, rhs))); -} - -//length of the vector squared -template -inline T -norm_squared(vec const& rhs) -{ - return dot(rhs, rhs); -} - -//normalize the vector -template -inline -vec -normalize(vec const& v) { - typedef T value_type; - T tmp = norm2(v); - if(tmp == value_type(0)) { - tmp = value_type(0); - } else { - tmp = value_type(1) / tmp; - } - vec res; - for(int i = 0; i < Sz; ++i) { - res[i] = v[i] * tmp; - } - return res; -} - - -} //namespace mvl - -#endif - +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Nicola Candussi +*/ + +//vec.h + +#ifndef MVL_VEC_H +#define MVL_VEC_H + +#include +#include +#include "base.h" +#include "traits.h" + +namespace mvl { + +template +class vec +{ +public: + typedef T value_type; + typedef T& reference; + typedef T const& const_reference; + typedef T* iterator; + typedef T const* const_iterator; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + +public: + enum { + Size = Sz, + }; + +public: + //constructors + explicit vec() {} + + template + vec(vec const& v) + { + *this = v; + } + + explicit vec(value_type val) + { + for(int i = 0; i < Size; ++i) { + m_data[i] = val; + } + } + + explicit vec(value_type x0, value_type x1) + { + m_data[0] = x0; m_data[1] = x1; + } + + explicit vec(value_type x0, value_type x1, value_type x2) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; + } + + explicit vec(value_type x0, value_type x1, value_type x2, value_type x3) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; + } + + explicit vec(value_type x0, value_type x1, value_type x2, value_type x3, value_type x4) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; + } + + explicit vec(value_type x0, value_type x1, value_type x2, value_type x3, value_type x4, value_type x5) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; m_data[5] = x5; + } + +public: + //data access + value_type operator[](std::size_t i) const { return m_data[i]; } + reference operator[](std::size_t i) { return m_data[i]; } + + value_type operator()(std::size_t i) const { return m_data[i]; } + reference operator()(std::size_t i) { return m_data[i]; } + +public: + //stl + static std::size_t size() { return Size; } + static std::size_t max_size() { return Size; } + static bool empty() { return false; } + + iterator begin() { return m_data; } + iterator end() { return m_data + Size; } + const_iterator begin() const { return m_data; } + const_iterator end() const { return m_data + Size; } + reverse_iterator rbegin() { return reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + value_type front() { return m_data[0]; } + value_type back() { return m_data[Size - 1]; } + const_reference front() const { return m_data[0]; } + const_reference back() const { return m_data[Size - 1]; } + + friend std::ostream& operator << (std::ostream& out, vec const& v) { + out << "("; + for(size_t i = 0; i < Size - 1; i++) { + out << v(i) << ", "; + } + out << v(Size - 1) << ")"; + return out; + } + +public: + //assignment + vec& operator=(vec const& rhs) { + for(int i = 0; i < Size; ++i) { + m_data[i] = rhs[i]; + } + return *this; + } + + template + vec& operator=(vec const& rhs) { + for(int i = 0; i < Size; ++i) { + m_data[i] = rhs[i]; + } + return *this; + } + +private: + T m_data[Size]; +}; + + +//assignment operators +// OP(vec, vec) +// OP(vec, T) + +#define VEC_IMPLEMENT_MACRO(OP) \ +template \ +inline \ +vec& \ +operator OP(vec& lhs, vec const& rhs) { \ + for(int i = 0; i < Sz; ++i) { \ + lhs[i] OP rhs[i]; \ + } \ + return lhs; \ +} \ + \ +template \ +inline \ +vec& \ +operator OP(vec& lhs, T const& rhs) { \ + for(int i = 0; i < Sz; ++i) { \ + lhs[i] OP rhs; \ + } \ + return lhs; \ +} \ + +VEC_IMPLEMENT_MACRO(+=) +VEC_IMPLEMENT_MACRO(-=) +VEC_IMPLEMENT_MACRO(*=) +VEC_IMPLEMENT_MACRO(/=) + +#undef VEC_IMPLEMENT_MACRO + +//operator + (vec, vec) +template +inline +vec::value_type, Sz> +operator + (vec const& lhs, vec const& rhs) +{ + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] + rhs[i]; + } + return res; +} + +//operator - (vec, vec) +template +inline +vec::value_type, Sz> +operator - (vec const& lhs, vec const& rhs) +{ + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] - rhs[i]; + } + return res; +} + +//operator * (vec, POD) +template +inline +vec::value_type, Sz> +operator * (vec const& lhs, T2 const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] * rhs; + } + return res; +} + +//operator * (POD, vec) +template +inline +vec::value_type, Sz> +operator * (T1 const& lhs, vec const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs * rhs[i]; + } + return res; +} + +//operator / (vec, POD) +template +inline +vec::value_type, Sz> +operator / (vec const& lhs, T2 const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] / rhs; + } + return res; +} + +//element_prod(vec, vec) +template +inline +vec::value_type, Sz> +element_prod(vec const& lhs, vec const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] * rhs[i]; + } + return res; +} + +//element_div(vec, vec) +template +inline +vec::value_type, Sz> +element_div(vec const& lhs, vec const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] / rhs[i]; + } + return res; +} + +//unary operator -(expr_vec) +template +inline +vec +operator -(vec const& rhs) { + vec res; + for(int i = 0; i < Sz; ++i) { + res[i] = -rhs[i]; + } + return res; +} + +//dot product +template +inline +typename promote_traits::value_type +dot(vec const& lhs, vec const& rhs) +{ + typename promote_traits::value_type res(0); + for(int i = 0; i < Sz; ++i) { + res += rhs[i] * lhs[i]; + } + return res; +} + + +//cross product +template +inline +vec::value_type, 3> +cross(vec const& lhs, vec const& rhs) { + typedef typename promote_traits::value_type value_type; + return vec(lhs(1)*rhs(2) - rhs(1)*lhs(2), + rhs(0)*lhs(2) - lhs(0)*rhs(2), + lhs(0)*rhs(1) - rhs(0)*lhs(1)); +} + +//length of the vector +template +inline T +norm2(vec const& rhs) +{ + return static_cast(sqrt(dot(rhs, rhs))); +} + +//length of the vector squared +template +inline T +norm_squared(vec const& rhs) +{ + return dot(rhs, rhs); +} + +//normalize the vector +template +inline +vec +normalize(vec const& v) { + typedef T value_type; + T tmp = norm2(v); + if(tmp == value_type(0)) { + tmp = value_type(0); + } else { + tmp = value_type(1) / tmp; + } + vec res; + for(int i = 0; i < Sz; ++i) { + res[i] = v[i] * tmp; + } + return res; +} + + +} //namespace mvl + +#endif + diff --git a/Extras/Serialize/BlenderSerialize/CMakeLists.txt b/Extras/Serialize/BlenderSerialize/CMakeLists.txt index 601e9ece9..5b74d7447 100644 --- a/Extras/Serialize/BlenderSerialize/CMakeLists.txt +++ b/Extras/Serialize/BlenderSerialize/CMakeLists.txt @@ -1,7 +1,7 @@ -INCLUDE_DIRECTORIES( ${BULLET_PHYSICS_SOURCE_DIR}/src -${BULLET_PHYSICS_SOURCE_DIR}/src -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BlenderSerialize -) - -ADD_LIBRARY(BlenderSerialize dna249.cpp dna249-64bit.cpp bBlenderFile.cpp bBlenderFile.h bMain.cpp bMain.h ) +INCLUDE_DIRECTORIES( ${BULLET_PHYSICS_SOURCE_DIR}/src +${BULLET_PHYSICS_SOURCE_DIR}/src +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader +${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BlenderSerialize +) + +ADD_LIBRARY(BlenderSerialize dna249.cpp dna249-64bit.cpp bBlenderFile.cpp bBlenderFile.h bMain.cpp bMain.h ) diff --git a/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp b/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp index 37a332fba..975fac794 100644 --- a/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp +++ b/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp @@ -1,224 +1,224 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 "bBlenderFile.h" -#include "bMain.h" -#include "bDefines.h" -#include "bDNA.h" -#include -#include - -// 32 && 64 bit versions -extern unsigned char DNAstr[]; -extern int DNAlen; - -extern unsigned char DNAstr64[]; -extern int DNAlen64; - - -using namespace bParse; - -bBlenderFile::bBlenderFile(const char* fileName) -:bFile(fileName, "BLENDER") -{ - mMain= new bMain(this, fileName, mVersion); -} - - - -bBlenderFile::bBlenderFile(char *memoryBuffer, int len) -:bFile(memoryBuffer,len, "BLENDER"), -mMain(0) -{ - mMain= new bMain(this, "memoryBuf", mVersion); -} - - -bBlenderFile::~bBlenderFile() -{ - delete mMain; -} - - -bMain* bBlenderFile::getMain() -{ - return mMain; -} - -// ----------------------------------------------------- // -void bBlenderFile::parseData() -{ - printf ("Building datablocks\n"); - printf ("Chunk size = %d\n",CHUNK_HEADER_LEN); - printf ("File chunk size = %d\n", ChunkUtils::getOffset(mFlags)); - - const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0; - - - - char *dataPtr = mFileBuffer+mDataStart; - - bChunkInd dataChunk; - dataChunk.code = 0; - - - //dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags); - int seek = getNextBlock(&dataChunk, dataPtr, mFlags); - //dataPtr += ChunkUtils::getOffset(mFlags); - char *dataPtrHead = 0; - - while (dataChunk.code != DNA1) - { - - - - - // one behind - if (dataChunk.code == SDNA) break; - //if (dataChunk.code == DNA1) break; - - // same as (BHEAD+DATA dependency) - dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags); - char *id = readStruct(dataPtrHead, dataChunk); - - // lookup maps - if (id) - { - mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); - - m_chunks.push_back(dataChunk); - // block it - bListBasePtr *listID = mMain->getListBasePtr(dataChunk.code); - if (listID) - listID->push_back((bStructHandle*)id); - } - - if (dataChunk.code == GLOB) - { - m_glob = (bStructHandle*) id; - } - - // next please! - dataPtr += seek; - - seek = getNextBlock(&dataChunk, dataPtr, mFlags); - if (seek < 0) - break; - } - -} - -void bBlenderFile::addDataBlock(char* dataBlock) -{ - mMain->addDatablock(dataBlock); -} - - - - - -// 32 && 64 bit versions -extern unsigned char DNAstr[]; -extern int DNAlen; - -//unsigned char DNAstr[]={0}; -//int DNAlen=0; - - -extern unsigned char DNAstr64[]; -extern int DNAlen64; - - -void bBlenderFile::writeDNA(FILE* fp) -{ - - bChunkInd dataChunk; - dataChunk.code = DNA1; - dataChunk.dna_nr = 0; - dataChunk.nr = 1; - - if (VOID_IS_8) - { - dataChunk.len = DNAlen64; - dataChunk.oldPtr = DNAstr64; - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - fwrite(DNAstr64, DNAlen64,1,fp); - } - else - { - dataChunk.len = DNAlen; - dataChunk.oldPtr = DNAstr; - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - fwrite(DNAstr, DNAlen,1,fp); - } -} - -void bBlenderFile::parse(bool verboseDumpAllTypes) -{ - if (VOID_IS_8) - { - parseInternal(verboseDumpAllTypes,(char*)DNAstr64,DNAlen64); - } - else - { - parseInternal(verboseDumpAllTypes,(char*)DNAstr,DNAlen); - } -} - -// experimental -int bBlenderFile::write(const char* fileName, bool fixupPointers) -{ - FILE *fp = fopen(fileName, "wb"); - if (fp) - { - char header[SIZEOFBLENDERHEADER] ; - memcpy(header, m_headerString, 7); - int endian= 1; - endian= ((char*)&endian)[0]; - - if (endian) - { - header[7] = '_'; - } else - { - header[7] = '-'; - } - if (VOID_IS_8) - { - header[8]='V'; - } else - { - header[8]='v'; - } - - header[9] = '2'; - header[10] = '4'; - header[11] = '9'; - - fwrite(header,SIZEOFBLENDERHEADER,1,fp); - - writeChunks(fp, fixupPointers); - - writeDNA(fp); - - fclose(fp); - - } else - { - printf("Error: cannot open file %s for writing\n",fileName); - return 0; - } - return 1; +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 "bBlenderFile.h" +#include "bMain.h" +#include "bDefines.h" +#include "bDNA.h" +#include +#include + +// 32 && 64 bit versions +extern unsigned char DNAstr[]; +extern int DNAlen; + +extern unsigned char DNAstr64[]; +extern int DNAlen64; + + +using namespace bParse; + +bBlenderFile::bBlenderFile(const char* fileName) +:bFile(fileName, "BLENDER") +{ + mMain= new bMain(this, fileName, mVersion); +} + + + +bBlenderFile::bBlenderFile(char *memoryBuffer, int len) +:bFile(memoryBuffer,len, "BLENDER"), +mMain(0) +{ + mMain= new bMain(this, "memoryBuf", mVersion); +} + + +bBlenderFile::~bBlenderFile() +{ + delete mMain; +} + + +bMain* bBlenderFile::getMain() +{ + return mMain; +} + +// ----------------------------------------------------- // +void bBlenderFile::parseData() +{ + printf ("Building datablocks\n"); + printf ("Chunk size = %d\n",CHUNK_HEADER_LEN); + printf ("File chunk size = %d\n", ChunkUtils::getOffset(mFlags)); + + const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0; + + + + char *dataPtr = mFileBuffer+mDataStart; + + bChunkInd dataChunk; + dataChunk.code = 0; + + + //dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags); + int seek = getNextBlock(&dataChunk, dataPtr, mFlags); + //dataPtr += ChunkUtils::getOffset(mFlags); + char *dataPtrHead = 0; + + while (dataChunk.code != DNA1) + { + + + + + // one behind + if (dataChunk.code == SDNA) break; + //if (dataChunk.code == DNA1) break; + + // same as (BHEAD+DATA dependency) + dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags); + char *id = readStruct(dataPtrHead, dataChunk); + + // lookup maps + if (id) + { + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); + + m_chunks.push_back(dataChunk); + // block it + bListBasePtr *listID = mMain->getListBasePtr(dataChunk.code); + if (listID) + listID->push_back((bStructHandle*)id); + } + + if (dataChunk.code == GLOB) + { + m_glob = (bStructHandle*) id; + } + + // next please! + dataPtr += seek; + + seek = getNextBlock(&dataChunk, dataPtr, mFlags); + if (seek < 0) + break; + } + +} + +void bBlenderFile::addDataBlock(char* dataBlock) +{ + mMain->addDatablock(dataBlock); +} + + + + + +// 32 && 64 bit versions +extern unsigned char DNAstr[]; +extern int DNAlen; + +//unsigned char DNAstr[]={0}; +//int DNAlen=0; + + +extern unsigned char DNAstr64[]; +extern int DNAlen64; + + +void bBlenderFile::writeDNA(FILE* fp) +{ + + bChunkInd dataChunk; + dataChunk.code = DNA1; + dataChunk.dna_nr = 0; + dataChunk.nr = 1; + + if (VOID_IS_8) + { + dataChunk.len = DNAlen64; + dataChunk.oldPtr = DNAstr64; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(DNAstr64, DNAlen64,1,fp); + } + else + { + dataChunk.len = DNAlen; + dataChunk.oldPtr = DNAstr; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(DNAstr, DNAlen,1,fp); + } +} + +void bBlenderFile::parse(bool verboseDumpAllTypes) +{ + if (VOID_IS_8) + { + parseInternal(verboseDumpAllTypes,(char*)DNAstr64,DNAlen64); + } + else + { + parseInternal(verboseDumpAllTypes,(char*)DNAstr,DNAlen); + } +} + +// experimental +int bBlenderFile::write(const char* fileName, bool fixupPointers) +{ + FILE *fp = fopen(fileName, "wb"); + if (fp) + { + char header[SIZEOFBLENDERHEADER] ; + memcpy(header, m_headerString, 7); + int endian= 1; + endian= ((char*)&endian)[0]; + + if (endian) + { + header[7] = '_'; + } else + { + header[7] = '-'; + } + if (VOID_IS_8) + { + header[8]='V'; + } else + { + header[8]='v'; + } + + header[9] = '2'; + header[10] = '4'; + header[11] = '9'; + + fwrite(header,SIZEOFBLENDERHEADER,1,fp); + + writeChunks(fp, fixupPointers); + + writeDNA(fp); + + fclose(fp); + + } else + { + printf("Error: cannot open file %s for writing\n",fileName); + return 0; + } + return 1; } \ No newline at end of file diff --git a/Extras/Serialize/BlenderSerialize/bBlenderFile.h b/Extras/Serialize/BlenderSerialize/bBlenderFile.h index 9ae9198ec..04107501d 100644 --- a/Extras/Serialize/BlenderSerialize/bBlenderFile.h +++ b/Extras/Serialize/BlenderSerialize/bBlenderFile.h @@ -1,63 +1,63 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 B_BLENDER_FILE_H -#define B_BLENDER_FILE_H - - -#include "bFile.h" - -namespace bParse { - - // ----------------------------------------------------- // - class bBlenderFile : public bFile - { - - protected: - bMain* mMain; - - bStructHandle* m_glob; - - - public: - - bBlenderFile(const char* fileName); - - bBlenderFile(char *memoryBuffer, int len); - - virtual ~bBlenderFile(); - - bMain* getMain(); - - virtual void addDataBlock(char* dataBlock); - - bStructHandle* getFileGlobal() - { - return m_glob; - } - - // experimental - virtual int write(const char* fileName, bool fixupPointers = false); - - virtual void parse(bool verboseDumpAllTypes); - - virtual void parseData(); - - virtual void writeDNA(FILE* fp); - - }; -}; - -#endif //B_BLENDER_FILE_H +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 B_BLENDER_FILE_H +#define B_BLENDER_FILE_H + + +#include "bFile.h" + +namespace bParse { + + // ----------------------------------------------------- // + class bBlenderFile : public bFile + { + + protected: + bMain* mMain; + + bStructHandle* m_glob; + + + public: + + bBlenderFile(const char* fileName); + + bBlenderFile(char *memoryBuffer, int len); + + virtual ~bBlenderFile(); + + bMain* getMain(); + + virtual void addDataBlock(char* dataBlock); + + bStructHandle* getFileGlobal() + { + return m_glob; + } + + // experimental + virtual int write(const char* fileName, bool fixupPointers = false); + + virtual void parse(bool verboseDumpAllTypes); + + virtual void parseData(); + + virtual void writeDNA(FILE* fp); + + }; +}; + +#endif //B_BLENDER_FILE_H diff --git a/Extras/Serialize/BlenderSerialize/bMain.cpp b/Extras/Serialize/BlenderSerialize/bMain.cpp index 01b210c5a..fa672fbb8 100644 --- a/Extras/Serialize/BlenderSerialize/bMain.cpp +++ b/Extras/Serialize/BlenderSerialize/bMain.cpp @@ -1,392 +1,392 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 "bMain.h" -#include "bBlenderFile.h" -#include "bDefines.h" -#include "bChunk.h" -#include "bDNA.h" - -using namespace bParse; - - -// ----------------------------------------------------- // -bMain::bMain(bBlenderFile *filePtr, const char *baseName, int fileVersion) - : mFP(filePtr), - mVersion(fileVersion), - mName(baseName) -{ - mData.insert(ID_SCE,bListBasePtr()); - mData.insert(ID_LI,bListBasePtr()); - mData.insert(ID_OB,bListBasePtr()); - mData.insert(ID_ME,bListBasePtr()); - mData.insert(ID_CU,bListBasePtr()); - mData.insert(ID_MB,bListBasePtr()); - mData.insert(ID_MA,bListBasePtr()); - mData.insert(ID_TE,bListBasePtr()); - mData.insert(ID_IM,bListBasePtr()); - mData.insert(ID_WV,bListBasePtr()); - mData.insert(ID_LT,bListBasePtr()); - mData.insert(ID_LA,bListBasePtr()); - mData.insert(ID_CA,bListBasePtr()); - mData.insert(ID_IP,bListBasePtr()); - mData.insert(ID_KE,bListBasePtr()); - mData.insert(ID_WO,bListBasePtr()); - mData.insert(ID_SCR,bListBasePtr()); - mData.insert(ID_VF,bListBasePtr()); - mData.insert(ID_TXT,bListBasePtr()); - mData.insert(ID_SO,bListBasePtr()); - mData.insert(ID_GR,bListBasePtr()); - mData.insert(ID_AR,bListBasePtr()); - mData.insert(ID_AC,bListBasePtr()); - mData.insert(ID_NT,bListBasePtr()); - mData.insert(ID_BR,bListBasePtr()); - mData.insert(ID_SCRIPT, bListBasePtr()); -} - - -// ----------------------------------------------------- // -bMain::~bMain() -{ - // allocated data blocks! - - int sz = mPool.size(); - for (int i=0;ifirst) - return; - - base->first = mFP->findLibPointer(base->first); - if (!base->first) - { - base->last = 0; - return; - } - - void *prev = 0; - Link *l = (Link*)base->first; - while (l) - { - l->next = mFP->findLibPointer(l->next); - l->prev = l->next; - prev = l->next; - l = (Link*)l->next; - } -} - -// ------------------------------------------------------------// -bListBasePtr* bMain::getListBasePtr(int listBaseCode) -{ - bListBasePtr *ptr = _findCode(listBaseCode); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::_findCode(int code) -{ - - bListBasePtr* lbPtr = mData.find(code); - return lbPtr; -} - - -// ------------------------------------------------------------// -bListBasePtr *bMain::getScene() -{ - bListBasePtr *ptr = _findCode(ID_SCE); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getLibrary() -{ - bListBasePtr *ptr = _findCode(ID_LI); - if (!ptr) - return 0; - return ptr; -} -// ------------------------------------------------------------// -bListBasePtr *bMain::getObject() -{ - bListBasePtr *ptr = _findCode(ID_OB); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getMesh() -{ - bListBasePtr *ptr = _findCode(ID_ME); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getCurve() -{ - bListBasePtr *ptr = _findCode(ID_CU); - if (!ptr) - return 0; - return ptr; -} - - - -// ------------------------------------------------------------// -bListBasePtr *bMain::getMball() -{ - bListBasePtr *ptr = _findCode(ID_MB); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getMat() -{ - bListBasePtr *ptr = _findCode(ID_MA); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getTex() -{ - bListBasePtr *ptr = _findCode(ID_TE); - if (!ptr) - return 0; - return ptr; -} - - -// ------------------------------------------------------------// -bListBasePtr *bMain::getImage() -{ - bListBasePtr *ptr = _findCode(ID_IM); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getWave() -{ - bListBasePtr *ptr = _findCode(ID_WV); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getLatt() -{ - bListBasePtr *ptr = _findCode(ID_LT); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getLamp() -{ - bListBasePtr *ptr = _findCode(ID_LA); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getCamera() -{ - bListBasePtr *ptr = _findCode(ID_CA); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getIpo() -{ - bListBasePtr *ptr = _findCode(ID_IP); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getKey() -{ - bListBasePtr *ptr = _findCode(ID_KE); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getWorld() -{ - bListBasePtr *ptr = _findCode(ID_WO); - if (!ptr) - return 0; - return ptr; -} - - -// ------------------------------------------------------------// -bListBasePtr *bMain::getScreen() -{ - bListBasePtr *ptr = _findCode(ID_SCR); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getScript() -{ - bListBasePtr *ptr = _findCode(ID_SCRIPT); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getVfont() -{ - bListBasePtr *ptr = _findCode(ID_VF); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getText() -{ - bListBasePtr *ptr = _findCode(ID_TXT); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getSound() -{ - bListBasePtr *ptr = _findCode(ID_SO); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getGroup() -{ - bListBasePtr *ptr = _findCode(ID_GR); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getArmature() -{ - bListBasePtr *ptr = _findCode(ID_AR); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getAction() -{ - bListBasePtr *ptr = _findCode(ID_AC); - if (!ptr) - return 0; - return ptr; -} - - -// ------------------------------------------------------------// -bListBasePtr *bMain::getNodetree() -{ - bListBasePtr *ptr = _findCode(ID_NT); - if (!ptr) - return 0; - return ptr; -} - -// ------------------------------------------------------------// -bListBasePtr *bMain::getBrush() -{ - bListBasePtr *ptr = _findCode(ID_BR); - if (!ptr) - return 0; - return ptr; -} - - - -//eof +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 "bMain.h" +#include "bBlenderFile.h" +#include "bDefines.h" +#include "bChunk.h" +#include "bDNA.h" + +using namespace bParse; + + +// ----------------------------------------------------- // +bMain::bMain(bBlenderFile *filePtr, const char *baseName, int fileVersion) + : mFP(filePtr), + mVersion(fileVersion), + mName(baseName) +{ + mData.insert(ID_SCE,bListBasePtr()); + mData.insert(ID_LI,bListBasePtr()); + mData.insert(ID_OB,bListBasePtr()); + mData.insert(ID_ME,bListBasePtr()); + mData.insert(ID_CU,bListBasePtr()); + mData.insert(ID_MB,bListBasePtr()); + mData.insert(ID_MA,bListBasePtr()); + mData.insert(ID_TE,bListBasePtr()); + mData.insert(ID_IM,bListBasePtr()); + mData.insert(ID_WV,bListBasePtr()); + mData.insert(ID_LT,bListBasePtr()); + mData.insert(ID_LA,bListBasePtr()); + mData.insert(ID_CA,bListBasePtr()); + mData.insert(ID_IP,bListBasePtr()); + mData.insert(ID_KE,bListBasePtr()); + mData.insert(ID_WO,bListBasePtr()); + mData.insert(ID_SCR,bListBasePtr()); + mData.insert(ID_VF,bListBasePtr()); + mData.insert(ID_TXT,bListBasePtr()); + mData.insert(ID_SO,bListBasePtr()); + mData.insert(ID_GR,bListBasePtr()); + mData.insert(ID_AR,bListBasePtr()); + mData.insert(ID_AC,bListBasePtr()); + mData.insert(ID_NT,bListBasePtr()); + mData.insert(ID_BR,bListBasePtr()); + mData.insert(ID_SCRIPT, bListBasePtr()); +} + + +// ----------------------------------------------------- // +bMain::~bMain() +{ + // allocated data blocks! + + int sz = mPool.size(); + for (int i=0;ifirst) + return; + + base->first = mFP->findLibPointer(base->first); + if (!base->first) + { + base->last = 0; + return; + } + + void *prev = 0; + Link *l = (Link*)base->first; + while (l) + { + l->next = mFP->findLibPointer(l->next); + l->prev = l->next; + prev = l->next; + l = (Link*)l->next; + } +} + +// ------------------------------------------------------------// +bListBasePtr* bMain::getListBasePtr(int listBaseCode) +{ + bListBasePtr *ptr = _findCode(listBaseCode); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::_findCode(int code) +{ + + bListBasePtr* lbPtr = mData.find(code); + return lbPtr; +} + + +// ------------------------------------------------------------// +bListBasePtr *bMain::getScene() +{ + bListBasePtr *ptr = _findCode(ID_SCE); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getLibrary() +{ + bListBasePtr *ptr = _findCode(ID_LI); + if (!ptr) + return 0; + return ptr; +} +// ------------------------------------------------------------// +bListBasePtr *bMain::getObject() +{ + bListBasePtr *ptr = _findCode(ID_OB); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getMesh() +{ + bListBasePtr *ptr = _findCode(ID_ME); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getCurve() +{ + bListBasePtr *ptr = _findCode(ID_CU); + if (!ptr) + return 0; + return ptr; +} + + + +// ------------------------------------------------------------// +bListBasePtr *bMain::getMball() +{ + bListBasePtr *ptr = _findCode(ID_MB); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getMat() +{ + bListBasePtr *ptr = _findCode(ID_MA); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getTex() +{ + bListBasePtr *ptr = _findCode(ID_TE); + if (!ptr) + return 0; + return ptr; +} + + +// ------------------------------------------------------------// +bListBasePtr *bMain::getImage() +{ + bListBasePtr *ptr = _findCode(ID_IM); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getWave() +{ + bListBasePtr *ptr = _findCode(ID_WV); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getLatt() +{ + bListBasePtr *ptr = _findCode(ID_LT); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getLamp() +{ + bListBasePtr *ptr = _findCode(ID_LA); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getCamera() +{ + bListBasePtr *ptr = _findCode(ID_CA); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getIpo() +{ + bListBasePtr *ptr = _findCode(ID_IP); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getKey() +{ + bListBasePtr *ptr = _findCode(ID_KE); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getWorld() +{ + bListBasePtr *ptr = _findCode(ID_WO); + if (!ptr) + return 0; + return ptr; +} + + +// ------------------------------------------------------------// +bListBasePtr *bMain::getScreen() +{ + bListBasePtr *ptr = _findCode(ID_SCR); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getScript() +{ + bListBasePtr *ptr = _findCode(ID_SCRIPT); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getVfont() +{ + bListBasePtr *ptr = _findCode(ID_VF); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getText() +{ + bListBasePtr *ptr = _findCode(ID_TXT); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getSound() +{ + bListBasePtr *ptr = _findCode(ID_SO); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getGroup() +{ + bListBasePtr *ptr = _findCode(ID_GR); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getArmature() +{ + bListBasePtr *ptr = _findCode(ID_AR); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getAction() +{ + bListBasePtr *ptr = _findCode(ID_AC); + if (!ptr) + return 0; + return ptr; +} + + +// ------------------------------------------------------------// +bListBasePtr *bMain::getNodetree() +{ + bListBasePtr *ptr = _findCode(ID_NT); + if (!ptr) + return 0; + return ptr; +} + +// ------------------------------------------------------------// +bListBasePtr *bMain::getBrush() +{ + bListBasePtr *ptr = _findCode(ID_BR); + if (!ptr) + return 0; + return ptr; +} + + + +//eof diff --git a/Extras/Serialize/BlenderSerialize/bMain.h b/Extras/Serialize/BlenderSerialize/bMain.h index e313b9975..f8e9afc5b 100644 --- a/Extras/Serialize/BlenderSerialize/bMain.h +++ b/Extras/Serialize/BlenderSerialize/bMain.h @@ -1,110 +1,110 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 __BMAIN_H__ -#define __BMAIN_H__ - -#include "bCommon.h" -#include "bChunk.h" -#include "LinearMath/btHashMap.h" - - -namespace bParse -{ - class bDNA; - - class bBlenderFile; -}; - - - -namespace bParse { - - - // ----------------------------------------------------- // - - typedef btHashMap bMainDataMap; - - - - // ----------------------------------------------------- // - class bMain - { - //private: - public: - bBlenderFile* mFP; - bListBasePtr mPool; - - int mVersion; - const char* mName; - - bMainDataMap mData; - - - - - bListBasePtr *_findCode(int code); - - public: - bMain(bBlenderFile *filePtr, const char *baseName, int fileVersion); - ~bMain(); - - int getVersion(); - const char *getName(); - - bListBasePtr *getListBasePtr(int listBaseCode); - - - bListBasePtr *getScene(); - bListBasePtr *getLibrary(); - bListBasePtr *getObject(); - bListBasePtr *getMesh(); - bListBasePtr *getCurve(); - bListBasePtr *getMball(); - bListBasePtr *getMat(); - bListBasePtr *getTex(); - bListBasePtr *getImage(); - bListBasePtr *getWave(); - bListBasePtr *getLatt(); - bListBasePtr *getLamp(); - bListBasePtr *getCamera(); - bListBasePtr *getIpo(); - bListBasePtr *getKey(); - bListBasePtr *getWorld(); - bListBasePtr *getScreen(); - bListBasePtr *getScript(); - bListBasePtr *getVfont(); - bListBasePtr *getText(); - bListBasePtr *getSound(); - bListBasePtr *getGroup(); - bListBasePtr *getArmature(); - bListBasePtr *getAction(); - bListBasePtr *getNodetree(); - bListBasePtr *getBrush(); - - - - // tracking allocated memory - void addDatablock(void *allocated); - - - // -- - - void linkList(void *listBasePtr); - }; -} - - -#endif//__BMAIN_H__ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 __BMAIN_H__ +#define __BMAIN_H__ + +#include "bCommon.h" +#include "bChunk.h" +#include "LinearMath/btHashMap.h" + + +namespace bParse +{ + class bDNA; + + class bBlenderFile; +}; + + + +namespace bParse { + + + // ----------------------------------------------------- // + + typedef btHashMap bMainDataMap; + + + + // ----------------------------------------------------- // + class bMain + { + //private: + public: + bBlenderFile* mFP; + bListBasePtr mPool; + + int mVersion; + const char* mName; + + bMainDataMap mData; + + + + + bListBasePtr *_findCode(int code); + + public: + bMain(bBlenderFile *filePtr, const char *baseName, int fileVersion); + ~bMain(); + + int getVersion(); + const char *getName(); + + bListBasePtr *getListBasePtr(int listBaseCode); + + + bListBasePtr *getScene(); + bListBasePtr *getLibrary(); + bListBasePtr *getObject(); + bListBasePtr *getMesh(); + bListBasePtr *getCurve(); + bListBasePtr *getMball(); + bListBasePtr *getMat(); + bListBasePtr *getTex(); + bListBasePtr *getImage(); + bListBasePtr *getWave(); + bListBasePtr *getLatt(); + bListBasePtr *getLamp(); + bListBasePtr *getCamera(); + bListBasePtr *getIpo(); + bListBasePtr *getKey(); + bListBasePtr *getWorld(); + bListBasePtr *getScreen(); + bListBasePtr *getScript(); + bListBasePtr *getVfont(); + bListBasePtr *getText(); + bListBasePtr *getSound(); + bListBasePtr *getGroup(); + bListBasePtr *getArmature(); + bListBasePtr *getAction(); + bListBasePtr *getNodetree(); + bListBasePtr *getBrush(); + + + + // tracking allocated memory + void addDatablock(void *allocated); + + + // -- + + void linkList(void *listBasePtr); + }; +} + + +#endif//__BMAIN_H__ diff --git a/Extras/Serialize/BlenderSerialize/dna249-64bit.cpp b/Extras/Serialize/BlenderSerialize/dna249-64bit.cpp index 2c430f47e..7c56c2c47 100644 --- a/Extras/Serialize/BlenderSerialize/dna249-64bit.cpp +++ b/Extras/Serialize/BlenderSerialize/dna249-64bit.cpp @@ -1,1411 +1,1411 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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. -*/ -unsigned char DNAstr64[]= { -83,68,78,65,78,65,77,69,119,9,0,0,42,110,101,120,116,0,42,112,114,101,118,0,42,100,97,116,97,0,42,102,105, -114,115,116,0,42,108,97,115,116,0,120,0,121,0,122,0,119,0,120,109,105,110,0,120,109,97,120,0,121,109,105,110, -0,121,109,97,120,0,42,112,111,105,110,116,101,114,0,103,114,111,117,112,0,118,97,108,0,118,97,108,50,0,110,97, -109,101,91,51,50,93,0,116,121,112,101,0,115,117,98,116,121,112,101,0,102,108,97,103,0,115,97,118,101,100,0,100, -97,116,97,0,108,101,110,0,116,111,116,97,108,108,101,110,0,42,110,101,119,105,100,0,42,108,105,98,0,110,97,109, -101,91,50,52,93,0,117,115,0,105,99,111,110,95,105,100,0,42,112,114,111,112,101,114,116,105,101,115,0,105,100,0, -42,105,100,98,108,111,99,107,0,42,102,105,108,101,100,97,116,97,0,110,97,109,101,91,50,52,48,93,0,102,105,108, -101,110,97,109,101,91,50,52,48,93,0,116,111,116,0,112,97,100,0,42,112,97,114,101,110,116,0,119,91,50,93,0, -104,91,50,93,0,99,104,97,110,103,101,100,91,50,93,0,112,97,100,48,0,112,97,100,49,0,42,114,101,99,116,91, -50,93,0,42,111,98,0,98,108,111,99,107,116,121,112,101,0,97,100,114,99,111,100,101,0,110,97,109,101,91,49,50, -56,93,0,42,98,112,0,42,98,101,122,116,0,109,97,120,114,99,116,0,116,111,116,114,99,116,0,118,97,114,116,121, -112,101,0,116,111,116,118,101,114,116,0,105,112,111,0,101,120,116,114,97,112,0,114,116,0,98,105,116,109,97,115,107, -0,115,108,105,100,101,95,109,105,110,0,115,108,105,100,101,95,109,97,120,0,99,117,114,118,97,108,0,42,100,114,105, -118,101,114,0,99,117,114,118,101,0,99,117,114,0,115,104,111,119,107,101,121,0,109,117,116,101,105,112,111,0,112,111, -115,0,114,101,108,97,116,105,118,101,0,116,111,116,101,108,101,109,0,112,97,100,50,0,42,119,101,105,103,104,116,115, -0,118,103,114,111,117,112,91,51,50,93,0,115,108,105,100,101,114,109,105,110,0,115,108,105,100,101,114,109,97,120,0, -42,114,101,102,107,101,121,0,101,108,101,109,115,116,114,91,51,50,93,0,101,108,101,109,115,105,122,101,0,98,108,111, -99,107,0,42,105,112,111,0,42,102,114,111,109,0,116,111,116,107,101,121,0,115,108,117,114,112,104,0,42,42,115,99, -114,105,112,116,115,0,42,102,108,97,103,0,97,99,116,115,99,114,105,112,116,0,116,111,116,115,99,114,105,112,116,0, -42,108,105,110,101,0,42,102,111,114,109,97,116,0,98,108,101,110,0,108,105,110,101,110,111,0,115,116,97,114,116,0, -101,110,100,0,102,108,97,103,115,0,99,111,108,111,114,91,52,93,0,112,97,100,91,52,93,0,42,110,97,109,101,0, -110,108,105,110,101,115,0,108,105,110,101,115,0,42,99,117,114,108,0,42,115,101,108,108,0,99,117,114,99,0,115,101, -108,99,0,109,97,114,107,101,114,115,0,42,117,110,100,111,95,98,117,102,0,117,110,100,111,95,112,111,115,0,117,110, -100,111,95,108,101,110,0,42,99,111,109,112,105,108,101,100,0,109,116,105,109,101,0,115,105,122,101,0,115,101,101,107, -0,112,97,115,115,101,112,97,114,116,97,108,112,104,97,0,97,110,103,108,101,0,99,108,105,112,115,116,97,0,99,108, -105,112,101,110,100,0,108,101,110,115,0,111,114,116,104,111,95,115,99,97,108,101,0,100,114,97,119,115,105,122,101,0, -115,104,105,102,116,120,0,115,104,105,102,116,121,0,89,70,95,100,111,102,100,105,115,116,0,89,70,95,97,112,101,114, -116,117,114,101,0,89,70,95,98,107,104,116,121,112,101,0,89,70,95,98,107,104,98,105,97,115,0,89,70,95,98,107, -104,114,111,116,0,115,99,114,105,112,116,108,105,110,107,0,42,100,111,102,95,111,98,0,102,114,97,109,101,110,114,0, -102,114,97,109,101,115,0,111,102,102,115,101,116,0,115,102,114,97,0,102,105,101,95,105,109,97,0,99,121,99,108,0, -111,107,0,109,117,108,116,105,95,105,110,100,101,120,0,108,97,121,101,114,0,112,97,115,115,0,109,101,110,117,110,114, -0,105,98,117,102,115,0,42,103,112,117,116,101,120,116,117,114,101,0,42,97,110,105,109,0,42,114,114,0,115,111,117, -114,99,101,0,108,97,115,116,102,114,97,109,101,0,116,112,97,103,101,102,108,97,103,0,116,111,116,98,105,110,100,0, -120,114,101,112,0,121,114,101,112,0,116,119,115,116,97,0,116,119,101,110,100,0,98,105,110,100,99,111,100,101,0,42, -114,101,112,98,105,110,100,0,42,112,97,99,107,101,100,102,105,108,101,0,42,112,114,101,118,105,101,119,0,108,97,115, -116,117,112,100,97,116,101,0,108,97,115,116,117,115,101,100,0,97,110,105,109,115,112,101,101,100,0,103,101,110,95,120, -0,103,101,110,95,121,0,103,101,110,95,116,121,112,101,0,97,115,112,120,0,97,115,112,121,0,42,118,110,111,100,101, -0,116,101,120,99,111,0,109,97,112,116,111,0,109,97,112,116,111,110,101,103,0,98,108,101,110,100,116,121,112,101,0, -42,111,98,106,101,99,116,0,42,116,101,120,0,117,118,110,97,109,101,91,51,50,93,0,112,114,111,106,120,0,112,114, -111,106,121,0,112,114,111,106,122,0,109,97,112,112,105,110,103,0,111,102,115,91,51,93,0,115,105,122,101,91,51,93, -0,116,101,120,102,108,97,103,0,99,111,108,111,114,109,111,100,101,108,0,112,109,97,112,116,111,0,112,109,97,112,116, -111,110,101,103,0,110,111,114,109,97,112,115,112,97,99,101,0,119,104,105,99,104,95,111,117,116,112,117,116,0,112,97, -100,91,50,93,0,114,0,103,0,98,0,107,0,100,101,102,95,118,97,114,0,99,111,108,102,97,99,0,110,111,114,102, -97,99,0,118,97,114,102,97,99,0,100,105,115,112,102,97,99,0,119,97,114,112,102,97,99,0,110,97,109,101,91,49, -54,48,93,0,42,104,97,110,100,108,101,0,42,112,110,97,109,101,0,42,115,116,110,97,109,101,115,0,115,116,121,112, -101,115,0,118,97,114,115,0,42,118,97,114,115,116,114,0,42,114,101,115,117,108,116,0,42,99,102,114,97,0,100,97, -116,97,91,51,50,93,0,40,42,100,111,105,116,41,40,41,0,40,42,105,110,115,116,97,110,99,101,95,105,110,105,116, -41,40,41,0,40,42,99,97,108,108,98,97,99,107,41,40,41,0,118,101,114,115,105,111,110,0,97,0,105,112,111,116, -121,112,101,0,42,105,109,97,0,42,99,117,98,101,91,54,93,0,105,109,97,116,91,52,93,91,52,93,0,111,98,105, -109,97,116,91,51,93,91,51,93,0,115,116,121,112,101,0,118,105,101,119,115,99,97,108,101,0,110,111,116,108,97,121, -0,99,117,98,101,114,101,115,0,100,101,112,116,104,0,114,101,99,97,108,99,0,108,97,115,116,115,105,122,101,0,110, -111,105,115,101,115,105,122,101,0,116,117,114,98,117,108,0,98,114,105,103,104,116,0,99,111,110,116,114,97,115,116,0, -114,102,97,99,0,103,102,97,99,0,98,102,97,99,0,102,105,108,116,101,114,115,105,122,101,0,109,103,95,72,0,109, -103,95,108,97,99,117,110,97,114,105,116,121,0,109,103,95,111,99,116,97,118,101,115,0,109,103,95,111,102,102,115,101, -116,0,109,103,95,103,97,105,110,0,100,105,115,116,95,97,109,111,117,110,116,0,110,115,95,111,117,116,115,99,97,108, -101,0,118,110,95,119,49,0,118,110,95,119,50,0,118,110,95,119,51,0,118,110,95,119,52,0,118,110,95,109,101,120, -112,0,118,110,95,100,105,115,116,109,0,118,110,95,99,111,108,116,121,112,101,0,110,111,105,115,101,100,101,112,116,104, -0,110,111,105,115,101,116,121,112,101,0,110,111,105,115,101,98,97,115,105,115,0,110,111,105,115,101,98,97,115,105,115, -50,0,105,109,97,102,108,97,103,0,99,114,111,112,120,109,105,110,0,99,114,111,112,121,109,105,110,0,99,114,111,112, -120,109,97,120,0,99,114,111,112,121,109,97,120,0,120,114,101,112,101,97,116,0,121,114,101,112,101,97,116,0,101,120, -116,101,110,100,0,99,104,101,99,107,101,114,100,105,115,116,0,110,97,98,108,97,0,105,117,115,101,114,0,42,110,111, -100,101,116,114,101,101,0,42,112,108,117,103,105,110,0,42,99,111,98,97,0,42,101,110,118,0,117,115,101,95,110,111, -100,101,115,0,112,97,100,91,55,93,0,108,111,99,91,51,93,0,114,111,116,91,51,93,0,109,97,116,91,52,93,91, -52,93,0,109,105,110,91,51,93,0,109,97,120,91,51,93,0,112,97,100,51,0,109,111,100,101,0,116,111,116,101,120, -0,115,104,100,119,114,0,115,104,100,119,103,0,115,104,100,119,98,0,115,104,100,119,112,97,100,0,101,110,101,114,103, -121,0,100,105,115,116,0,115,112,111,116,115,105,122,101,0,115,112,111,116,98,108,101,110,100,0,104,97,105,110,116,0, -97,116,116,49,0,97,116,116,50,0,42,99,117,114,102,97,108,108,111,102,102,0,102,97,108,108,111,102,102,95,116,121, -112,101,0,115,104,97,100,115,112,111,116,115,105,122,101,0,98,105,97,115,0,115,111,102,116,0,98,117,102,115,105,122, -101,0,115,97,109,112,0,98,117,102,102,101,114,115,0,102,105,108,116,101,114,116,121,112,101,0,98,117,102,102,108,97, -103,0,98,117,102,116,121,112,101,0,114,97,121,95,115,97,109,112,0,114,97,121,95,115,97,109,112,121,0,114,97,121, -95,115,97,109,112,122,0,114,97,121,95,115,97,109,112,95,116,121,112,101,0,97,114,101,97,95,115,104,97,112,101,0, -97,114,101,97,95,115,105,122,101,0,97,114,101,97,95,115,105,122,101,121,0,97,114,101,97,95,115,105,122,101,122,0, -97,100,97,112,116,95,116,104,114,101,115,104,0,114,97,121,95,115,97,109,112,95,109,101,116,104,111,100,0,116,101,120, -97,99,116,0,115,104,97,100,104,97,108,111,115,116,101,112,0,115,117,110,95,101,102,102,101,99,116,95,116,121,112,101, -0,115,107,121,98,108,101,110,100,116,121,112,101,0,104,111,114,105,122,111,110,95,98,114,105,103,104,116,110,101,115,115, -0,115,112,114,101,97,100,0,115,117,110,95,98,114,105,103,104,116,110,101,115,115,0,115,117,110,95,115,105,122,101,0, -98,97,99,107,115,99,97,116,116,101,114,101,100,95,108,105,103,104,116,0,115,117,110,95,105,110,116,101,110,115,105,116, -121,0,97,116,109,95,116,117,114,98,105,100,105,116,121,0,97,116,109,95,105,110,115,99,97,116,116,101,114,105,110,103, -95,102,97,99,116,111,114,0,97,116,109,95,101,120,116,105,110,99,116,105,111,110,95,102,97,99,116,111,114,0,97,116, -109,95,100,105,115,116,97,110,99,101,95,102,97,99,116,111,114,0,115,107,121,98,108,101,110,100,102,97,99,0,115,107, -121,95,101,120,112,111,115,117,114,101,0,115,107,121,95,99,111,108,111,114,115,112,97,99,101,0,112,97,100,52,0,89, -70,95,110,117,109,112,104,111,116,111,110,115,0,89,70,95,110,117,109,115,101,97,114,99,104,0,89,70,95,112,104,100, -101,112,116,104,0,89,70,95,117,115,101,113,109,99,0,89,70,95,98,117,102,115,105,122,101,0,89,70,95,112,97,100, -0,89,70,95,99,97,117,115,116,105,99,98,108,117,114,0,89,70,95,108,116,114,97,100,105,117,115,0,89,70,95,103, -108,111,119,105,110,116,0,89,70,95,103,108,111,119,111,102,115,0,89,70,95,103,108,111,119,116,121,112,101,0,89,70, -95,112,97,100,50,0,42,109,116,101,120,91,49,56,93,0,115,112,101,99,114,0,115,112,101,99,103,0,115,112,101,99, -98,0,109,105,114,114,0,109,105,114,103,0,109,105,114,98,0,97,109,98,114,0,97,109,98,98,0,97,109,98,103,0, -97,109,98,0,101,109,105,116,0,97,110,103,0,115,112,101,99,116,114,97,0,114,97,121,95,109,105,114,114,111,114,0, -97,108,112,104,97,0,114,101,102,0,115,112,101,99,0,122,111,102,102,115,0,97,100,100,0,116,114,97,110,115,108,117, -99,101,110,99,121,0,102,114,101,115,110,101,108,95,109,105,114,0,102,114,101,115,110,101,108,95,109,105,114,95,105,0, -102,114,101,115,110,101,108,95,116,114,97,0,102,114,101,115,110,101,108,95,116,114,97,95,105,0,102,105,108,116,101,114, -0,116,120,95,108,105,109,105,116,0,116,120,95,102,97,108,108,111,102,102,0,114,97,121,95,100,101,112,116,104,0,114, -97,121,95,100,101,112,116,104,95,116,114,97,0,104,97,114,0,115,101,101,100,49,0,115,101,101,100,50,0,103,108,111, -115,115,95,109,105,114,0,103,108,111,115,115,95,116,114,97,0,115,97,109,112,95,103,108,111,115,115,95,109,105,114,0, -115,97,109,112,95,103,108,111,115,115,95,116,114,97,0,97,100,97,112,116,95,116,104,114,101,115,104,95,109,105,114,0, -97,100,97,112,116,95,116,104,114,101,115,104,95,116,114,97,0,97,110,105,115,111,95,103,108,111,115,115,95,109,105,114, -0,100,105,115,116,95,109,105,114,0,102,97,100,101,116,111,95,109,105,114,0,115,104,97,100,101,95,102,108,97,103,0, -109,111,100,101,95,108,0,102,108,97,114,101,99,0,115,116,97,114,99,0,108,105,110,101,99,0,114,105,110,103,99,0, -104,97,115,105,122,101,0,102,108,97,114,101,115,105,122,101,0,115,117,98,115,105,122,101,0,102,108,97,114,101,98,111, -111,115,116,0,115,116,114,97,110,100,95,115,116,97,0,115,116,114,97,110,100,95,101,110,100,0,115,116,114,97,110,100, -95,101,97,115,101,0,115,116,114,97,110,100,95,115,117,114,102,110,111,114,0,115,116,114,97,110,100,95,109,105,110,0, -115,116,114,97,110,100,95,119,105,100,116,104,102,97,100,101,0,115,116,114,97,110,100,95,117,118,110,97,109,101,91,51, -50,93,0,115,98,105,97,115,0,108,98,105,97,115,0,115,104,97,100,95,97,108,112,104,97,0,115,101,112,116,101,120, -0,114,103,98,115,101,108,0,112,114,95,116,121,112,101,0,112,114,95,98,97,99,107,0,112,114,95,108,97,109,112,0, -109,108,95,102,108,97,103,0,100,105,102,102,95,115,104,97,100,101,114,0,115,112,101,99,95,115,104,97,100,101,114,0, -114,111,117,103,104,110,101,115,115,0,114,101,102,114,97,99,0,112,97,114,97,109,91,52,93,0,114,109,115,0,100,97, -114,107,110,101,115,115,0,42,114,97,109,112,95,99,111,108,0,42,114,97,109,112,95,115,112,101,99,0,114,97,109,112, -105,110,95,99,111,108,0,114,97,109,112,105,110,95,115,112,101,99,0,114,97,109,112,98,108,101,110,100,95,99,111,108, -0,114,97,109,112,98,108,101,110,100,95,115,112,101,99,0,114,97,109,112,95,115,104,111,119,0,114,97,109,112,102,97, -99,95,99,111,108,0,114,97,109,112,102,97,99,95,115,112,101,99,0,42,103,114,111,117,112,0,102,114,105,99,116,105, -111,110,0,102,104,0,114,101,102,108,101,99,116,0,102,104,100,105,115,116,0,120,121,102,114,105,99,116,0,100,121,110, -97,109,111,100,101,0,115,115,115,95,114,97,100,105,117,115,91,51,93,0,115,115,115,95,99,111,108,91,51,93,0,115, -115,115,95,101,114,114,111,114,0,115,115,115,95,115,99,97,108,101,0,115,115,115,95,105,111,114,0,115,115,115,95,99, -111,108,102,97,99,0,115,115,115,95,116,101,120,102,97,99,0,115,115,115,95,102,114,111,110,116,0,115,115,115,95,98, -97,99,107,0,115,115,115,95,102,108,97,103,0,115,115,115,95,112,114,101,115,101,116,0,89,70,95,97,114,0,89,70, -95,97,103,0,89,70,95,97,98,0,89,70,95,100,115,99,97,108,101,0,89,70,95,100,112,119,114,0,89,70,95,100, -115,109,112,0,89,70,95,112,114,101,115,101,116,0,89,70,95,100,106,105,116,0,103,112,117,109,97,116,101,114,105,97, -108,0,110,97,109,101,91,50,53,54,93,0,115,99,97,108,101,0,42,98,98,0,105,49,0,106,49,0,107,49,0,105, -50,0,106,50,0,107,50,0,115,101,108,99,111,108,49,0,115,101,108,99,111,108,50,0,113,117,97,116,91,52,93,0, -101,120,112,120,0,101,120,112,121,0,101,120,112,122,0,114,97,100,0,114,97,100,50,0,115,0,42,109,97,116,0,42, -105,109,97,116,0,101,108,101,109,115,0,100,105,115,112,0,42,42,109,97,116,0,116,111,116,99,111,108,0,119,105,114, -101,115,105,122,101,0,114,101,110,100,101,114,115,105,122,101,0,116,104,114,101,115,104,0,118,101,99,91,51,93,91,51, -93,0,97,108,102,97,0,119,101,105,103,104,116,0,114,97,100,105,117,115,0,104,49,0,104,50,0,102,49,0,102,50, -0,102,51,0,104,105,100,101,0,118,101,99,91,52,93,0,109,97,116,95,110,114,0,112,110,116,115,117,0,112,110,116, -115,118,0,114,101,115,111,108,117,0,114,101,115,111,108,118,0,111,114,100,101,114,117,0,111,114,100,101,114,118,0,102, -108,97,103,117,0,102,108,97,103,118,0,42,107,110,111,116,115,117,0,42,107,110,111,116,115,118,0,116,105,108,116,95, -105,110,116,101,114,112,0,114,97,100,105,117,115,95,105,110,116,101,114,112,0,99,104,97,114,105,100,120,0,107,101,114, -110,0,104,0,110,117,114,98,0,42,98,101,118,111,98,106,0,42,116,97,112,101,114,111,98,106,0,42,116,101,120,116, -111,110,99,117,114,118,101,0,42,112,97,116,104,0,42,107,101,121,0,98,101,118,0,112,97,116,104,108,101,110,0,98, -101,118,114,101,115,111,108,0,119,105,100,116,104,0,101,120,116,49,0,101,120,116,50,0,114,101,115,111,108,117,95,114, -101,110,0,114,101,115,111,108,118,95,114,101,110,0,115,112,97,99,101,109,111,100,101,0,115,112,97,99,105,110,103,0, -108,105,110,101,100,105,115,116,0,115,104,101,97,114,0,102,115,105,122,101,0,119,111,114,100,115,112,97,99,101,0,117, -108,112,111,115,0,117,108,104,101,105,103,104,116,0,120,111,102,0,121,111,102,0,108,105,110,101,119,105,100,116,104,0, -42,115,116,114,0,102,97,109,105,108,121,91,50,52,93,0,42,118,102,111,110,116,0,42,118,102,111,110,116,98,0,42, -118,102,111,110,116,105,0,42,118,102,111,110,116,98,105,0,115,101,112,99,104,97,114,0,116,111,116,98,111,120,0,97, -99,116,98,111,120,0,42,116,98,0,115,101,108,115,116,97,114,116,0,115,101,108,101,110,100,0,42,115,116,114,105,110, -102,111,0,99,117,114,105,110,102,111,0,101,102,102,101,99,116,0,42,109,102,97,99,101,0,42,109,116,102,97,99,101, -0,42,116,102,97,99,101,0,42,109,118,101,114,116,0,42,109,101,100,103,101,0,42,100,118,101,114,116,0,42,109,99, -111,108,0,42,109,115,116,105,99,107,121,0,42,116,101,120,99,111,109,101,115,104,0,42,109,115,101,108,101,99,116,0, -118,100,97,116,97,0,101,100,97,116,97,0,102,100,97,116,97,0,116,111,116,101,100,103,101,0,116,111,116,102,97,99, -101,0,116,111,116,115,101,108,101,99,116,0,97,99,116,95,102,97,99,101,0,99,117,98,101,109,97,112,115,105,122,101, -0,115,109,111,111,116,104,114,101,115,104,0,115,117,98,100,105,118,0,115,117,98,100,105,118,114,0,115,117,98,115,117, -114,102,116,121,112,101,0,42,109,114,0,42,112,118,0,42,116,112,97,103,101,0,117,118,91,52,93,91,50,93,0,99, -111,108,91,52,93,0,116,114,97,110,115,112,0,116,105,108,101,0,117,110,119,114,97,112,0,118,49,0,118,50,0,118, -51,0,118,52,0,101,100,99,111,100,101,0,99,114,101,97,115,101,0,98,119,101,105,103,104,116,0,100,101,102,95,110, -114,0,42,100,119,0,116,111,116,119,101,105,103,104,116,0,99,111,91,51,93,0,110,111,91,51,93,0,112,97,100,91, -51,93,0,117,118,91,50,93,0,99,111,91,50,93,0,105,110,100,101,120,0,102,0,105,0,115,91,50,53,54,93,0, -118,91,52,93,0,109,105,100,0,118,91,50,93,0,42,102,97,99,101,115,0,42,99,111,108,102,97,99,101,115,0,42, -101,100,103,101,115,0,42,101,100,103,101,95,98,111,117,110,100,97,114,121,95,115,116,97,116,101,115,0,42,118,101,114, -116,95,101,100,103,101,95,109,97,112,0,42,118,101,114,116,95,102,97,99,101,95,109,97,112,0,42,109,97,112,95,109, -101,109,0,42,118,101,114,116,115,0,108,101,118,101,108,115,0,108,101,118,101,108,95,99,111,117,110,116,0,99,117,114, -114,101,110,116,0,110,101,119,108,118,108,0,101,100,103,101,108,118,108,0,112,105,110,108,118,108,0,114,101,110,100,101, -114,108,118,108,0,117,115,101,95,99,111,108,0,42,101,100,103,101,95,102,108,97,103,115,0,42,101,100,103,101,95,99, -114,101,97,115,101,115,0,42,118,101,114,116,95,109,97,112,0,42,101,100,103,101,95,109,97,112,0,42,111,108,100,95, -102,97,99,101,115,0,42,111,108,100,95,101,100,103,101,115,0,42,101,114,114,111,114,0,109,111,100,105,102,105,101,114, -0,115,117,98,100,105,118,84,121,112,101,0,114,101,110,100,101,114,76,101,118,101,108,115,0,42,101,109,67,97,99,104, -101,0,42,109,67,97,99,104,101,0,100,101,102,97,120,105,115,0,112,97,100,91,54,93,0,108,101,110,103,116,104,0, -114,97,110,100,111,109,105,122,101,0,115,101,101,100,0,42,111,98,95,97,114,109,0,42,115,116,97,114,116,95,99,97, -112,0,42,101,110,100,95,99,97,112,0,42,99,117,114,118,101,95,111,98,0,42,111,102,102,115,101,116,95,111,98,0, -111,102,102,115,101,116,91,51,93,0,115,99,97,108,101,91,51,93,0,109,101,114,103,101,95,100,105,115,116,0,102,105, -116,95,116,121,112,101,0,111,102,102,115,101,116,95,116,121,112,101,0,99,111,117,110,116,0,97,120,105,115,0,116,111, -108,101,114,97,110,99,101,0,42,109,105,114,114,111,114,95,111,98,0,115,112,108,105,116,95,97,110,103,108,101,0,118, -97,108,117,101,0,114,101,115,0,118,97,108,95,102,108,97,103,115,0,108,105,109,95,102,108,97,103,115,0,101,95,102, -108,97,103,115,0,98,101,118,101,108,95,97,110,103,108,101,0,100,101,102,103,114,112,95,110,97,109,101,91,51,50,93, -0,42,116,101,120,116,117,114,101,0,115,116,114,101,110,103,116,104,0,100,105,114,101,99,116,105,111,110,0,109,105,100, -108,101,118,101,108,0,116,101,120,109,97,112,112,105,110,103,0,42,109,97,112,95,111,98,106,101,99,116,0,117,118,108, -97,121,101,114,95,110,97,109,101,91,51,50,93,0,117,118,108,97,121,101,114,95,116,109,112,0,42,112,114,111,106,101, -99,116,111,114,115,91,49,48,93,0,42,105,109,97,103,101,0,110,117,109,95,112,114,111,106,101,99,116,111,114,115,0, -97,115,112,101,99,116,120,0,97,115,112,101,99,116,121,0,112,101,114,99,101,110,116,0,102,97,99,101,67,111,117,110, -116,0,102,97,99,0,114,101,112,101,97,116,0,42,111,98,106,101,99,116,99,101,110,116,101,114,0,115,116,97,114,116, -120,0,115,116,97,114,116,121,0,104,101,105,103,104,116,0,110,97,114,114,111,119,0,115,112,101,101,100,0,100,97,109, -112,0,102,97,108,108,111,102,102,0,116,105,109,101,111,102,102,115,0,108,105,102,101,116,105,109,101,0,100,101,102,111, -114,109,102,108,97,103,0,109,117,108,116,105,0,42,112,114,101,118,67,111,115,0,112,97,114,101,110,116,105,110,118,91, -52,93,91,52,93,0,99,101,110,116,91,51,93,0,42,105,110,100,101,120,97,114,0,116,111,116,105,110,100,101,120,0, -102,111,114,99,101,0,42,99,108,111,116,104,79,98,106,101,99,116,0,42,115,105,109,95,112,97,114,109,115,0,42,99, -111,108,108,95,112,97,114,109,115,0,42,112,111,105,110,116,95,99,97,99,104,101,0,42,120,0,42,120,110,101,119,0, -42,120,111,108,100,0,42,99,117,114,114,101,110,116,95,120,110,101,119,0,42,99,117,114,114,101,110,116,95,120,0,42, -99,117,114,114,101,110,116,95,118,0,42,109,102,97,99,101,115,0,110,117,109,118,101,114,116,115,0,110,117,109,102,97, -99,101,115,0,97,98,115,111,114,112,116,105,111,110,0,116,105,109,101,0,42,98,118,104,116,114,101,101,0,42,100,109, -0,111,112,101,114,97,116,105,111,110,0,118,101,114,116,101,120,0,116,111,116,105,110,102,108,117,101,110,99,101,0,103, -114,105,100,115,105,122,101,0,110,101,101,100,98,105,110,100,0,42,98,105,110,100,119,101,105,103,104,116,115,0,42,98, -105,110,100,99,111,115,0,116,111,116,99,97,103,101,118,101,114,116,0,42,100,121,110,103,114,105,100,0,42,100,121,110, -105,110,102,108,117,101,110,99,101,115,0,42,100,121,110,118,101,114,116,115,0,42,112,97,100,50,0,100,121,110,103,114, -105,100,115,105,122,101,0,100,121,110,99,101,108,108,109,105,110,91,51,93,0,100,121,110,99,101,108,108,119,105,100,116, -104,0,98,105,110,100,109,97,116,91,52,93,91,52,93,0,42,112,115,121,115,0,116,111,116,100,109,118,101,114,116,0, -116,111,116,100,109,101,100,103,101,0,116,111,116,100,109,102,97,99,101,0,112,115,121,115,0,114,116,91,50,93,0,42, -102,97,99,101,112,97,0,118,103,114,111,117,112,0,112,114,111,116,101,99,116,0,42,102,115,115,0,42,116,97,114,103, -101,116,0,42,97,117,120,84,97,114,103,101,116,0,118,103,114,111,117,112,95,110,97,109,101,91,51,50,93,0,107,101, -101,112,68,105,115,116,0,115,104,114,105,110,107,84,121,112,101,0,115,104,114,105,110,107,79,112,116,115,0,112,114,111, -106,65,120,105,115,0,115,117,98,115,117,114,102,76,101,118,101,108,115,0,42,111,114,105,103,105,110,0,102,97,99,116, -111,114,0,108,105,109,105,116,91,50,93,0,111,114,105,103,105,110,79,112,116,115,0,112,110,116,115,119,0,111,112,110, -116,115,117,0,111,112,110,116,115,118,0,111,112,110,116,115,119,0,116,121,112,101,117,0,116,121,112,101,118,0,116,121, -112,101,119,0,102,117,0,102,118,0,102,119,0,100,117,0,100,118,0,100,119,0,42,100,101,102,0,118,101,99,91,56, -93,91,51,93,0,112,97,114,116,121,112,101,0,112,97,114,49,0,112,97,114,50,0,112,97,114,51,0,112,97,114,115, -117,98,115,116,114,91,51,50,93,0,42,116,114,97,99,107,0,42,112,114,111,120,121,0,42,112,114,111,120,121,95,103, -114,111,117,112,0,42,112,114,111,120,121,95,102,114,111,109,0,42,97,99,116,105,111,110,0,42,112,111,115,101,108,105, -98,0,42,112,111,115,101,0,99,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,115,0,100,101,102,98,97, -115,101,0,109,111,100,105,102,105,101,114,115,0,100,108,111,99,91,51,93,0,111,114,105,103,91,51,93,0,100,115,105, -122,101,91,51,93,0,100,114,111,116,91,51,93,0,111,98,109,97,116,91,52,93,91,52,93,0,99,111,110,115,116,105, -110,118,91,52,93,91,52,93,0,108,97,121,0,99,111,108,98,105,116,115,0,116,114,97,110,115,102,108,97,103,0,105, -112,111,102,108,97,103,0,116,114,97,99,107,102,108,97,103,0,117,112,102,108,97,103,0,110,108,97,102,108,97,103,0, -112,114,111,116,101,99,116,102,108,97,103,0,105,112,111,119,105,110,0,115,99,97,102,108,97,103,0,115,99,97,118,105, -115,102,108,97,103,0,98,111,117,110,100,116,121,112,101,0,100,117,112,111,110,0,100,117,112,111,102,102,0,100,117,112, -115,116,97,0,100,117,112,101,110,100,0,115,102,0,99,116,105,109,101,0,109,97,115,115,0,100,97,109,112,105,110,103, -0,105,110,101,114,116,105,97,0,102,111,114,109,102,97,99,116,111,114,0,114,100,97,109,112,105,110,103,0,115,105,122, -101,102,97,99,0,109,97,114,103,105,110,0,109,97,120,95,118,101,108,0,109,105,110,95,118,101,108,0,109,95,99,111, -110,116,97,99,116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,100,116,0,100,116,120,0, -97,99,116,99,111,108,0,101,109,112,116,121,95,100,114,97,119,116,121,112,101,0,112,97,100,49,91,51,93,0,101,109, -112,116,121,95,100,114,97,119,115,105,122,101,0,100,117,112,102,97,99,101,115,99,97,0,112,114,111,112,0,115,101,110, -115,111,114,115,0,99,111,110,116,114,111,108,108,101,114,115,0,97,99,116,117,97,116,111,114,115,0,98,98,115,105,122, -101,91,51,93,0,97,99,116,100,101,102,0,103,97,109,101,102,108,97,103,0,103,97,109,101,102,108,97,103,50,0,42, -98,115,111,102,116,0,115,111,102,116,102,108,97,103,0,97,110,105,115,111,116,114,111,112,105,99,70,114,105,99,116,105, -111,110,91,51,93,0,99,111,110,115,116,114,97,105,110,116,115,0,110,108,97,115,116,114,105,112,115,0,104,111,111,107, -115,0,112,97,114,116,105,99,108,101,115,121,115,116,101,109,0,42,112,100,0,42,115,111,102,116,0,42,100,117,112,95, -103,114,111,117,112,0,102,108,117,105,100,115,105,109,70,108,97,103,0,114,101,115,116,114,105,99,116,102,108,97,103,0, -115,104,97,112,101,110,114,0,115,104,97,112,101,102,108,97,103,0,114,101,99,97,108,99,111,0,98,111,100,121,95,116, -121,112,101,0,42,102,108,117,105,100,115,105,109,83,101,116,116,105,110,103,115,0,42,100,101,114,105,118,101,100,68,101, -102,111,114,109,0,42,100,101,114,105,118,101,100,70,105,110,97,108,0,108,97,115,116,68,97,116,97,77,97,115,107,0, -115,116,97,116,101,0,105,110,105,116,95,115,116,97,116,101,0,103,112,117,108,97,109,112,0,99,117,114,105,110,100,101, -120,0,97,99,116,105,118,101,0,100,101,102,108,101,99,116,0,102,111,114,99,101,102,105,101,108,100,0,112,100,101,102, -95,100,97,109,112,0,112,100,101,102,95,114,100,97,109,112,0,112,100,101,102,95,112,101,114,109,0,112,100,101,102,95, -102,114,105,99,116,0,112,100,101,102,95,114,102,114,105,99,116,0,102,95,115,116,114,101,110,103,116,104,0,102,95,112, -111,119,101,114,0,102,95,100,105,115,116,0,102,95,100,97,109,112,0,109,97,120,100,105,115,116,0,109,105,110,100,105, -115,116,0,109,97,120,114,97,100,0,109,105,110,114,97,100,0,102,95,112,111,119,101,114,95,114,0,112,100,101,102,95, -115,98,100,97,109,112,0,112,100,101,102,95,115,98,105,102,116,0,112,100,101,102,95,115,98,111,102,116,0,99,108,117, -109,112,95,102,97,99,0,99,108,117,109,112,95,112,111,119,0,107,105,110,107,95,102,114,101,113,0,107,105,110,107,95, -115,104,97,112,101,0,107,105,110,107,95,97,109,112,0,102,114,101,101,95,101,110,100,0,116,101,120,95,110,97,98,108, -97,0,116,101,120,95,109,111,100,101,0,107,105,110,107,0,107,105,110,107,95,97,120,105,115,0,114,116,50,0,42,114, -110,103,0,102,95,110,111,105,115,101,0,115,105,109,102,114,97,109,101,0,115,116,97,114,116,102,114,97,109,101,0,101, -110,100,102,114,97,109,101,0,101,100,105,116,102,114,97,109,101,0,108,105,110,83,116,105,102,102,0,97,110,103,83,116, -105,102,102,0,118,111,108,117,109,101,0,118,105,116,101,114,97,116,105,111,110,115,0,112,105,116,101,114,97,116,105,111, -110,115,0,100,105,116,101,114,97,116,105,111,110,115,0,99,105,116,101,114,97,116,105,111,110,115,0,107,83,82,72,82, -95,67,76,0,107,83,75,72,82,95,67,76,0,107,83,83,72,82,95,67,76,0,107,83,82,95,83,80,76,84,95,67, -76,0,107,83,75,95,83,80,76,84,95,67,76,0,107,83,83,95,83,80,76,84,95,67,76,0,107,86,67,70,0,107, -68,80,0,107,68,71,0,107,76,70,0,107,80,82,0,107,86,67,0,107,68,70,0,107,77,84,0,107,67,72,82,0, -107,75,72,82,0,107,83,72,82,0,107,65,72,82,0,99,111,108,108,105,115,105,111,110,102,108,97,103,115,0,110,117, -109,99,108,117,115,116,101,114,105,116,101,114,97,116,105,111,110,115,0,119,101,108,100,105,110,103,0,42,112,97,114,116, -105,99,108,101,115,0,116,111,116,112,111,105,110,116,0,116,111,116,115,112,114,105,110,103,0,42,98,112,111,105,110,116, -0,42,98,115,112,114,105,110,103,0,109,115,103,95,108,111,99,107,0,109,115,103,95,118,97,108,117,101,0,110,111,100, -101,109,97,115,115,0,110,97,109,101,100,86,71,95,77,97,115,115,91,51,50,93,0,103,114,97,118,0,109,101,100,105, -97,102,114,105,99,116,0,114,107,108,105,109,105,116,0,112,104,121,115,105,99,115,95,115,112,101,101,100,0,103,111,97, -108,115,112,114,105,110,103,0,103,111,97,108,102,114,105,99,116,0,109,105,110,103,111,97,108,0,109,97,120,103,111,97, -108,0,100,101,102,103,111,97,108,0,118,101,114,116,103,114,111,117,112,0,110,97,109,101,100,86,71,95,83,111,102,116, -103,111,97,108,91,51,50,93,0,102,117,122,122,121,110,101,115,115,0,105,110,115,112,114,105,110,103,0,105,110,102,114, -105,99,116,0,110,97,109,101,100,86,71,95,83,112,114,105,110,103,95,75,91,51,50,93,0,101,102,114,97,0,105,110, -116,101,114,118,97,108,0,108,111,99,97,108,0,115,111,108,118,101,114,102,108,97,103,115,0,42,42,107,101,121,115,0, -116,111,116,112,111,105,110,116,107,101,121,0,115,101,99,111,110,100,115,112,114,105,110,103,0,99,111,108,98,97,108,108, -0,98,97,108,108,100,97,109,112,0,98,97,108,108,115,116,105,102,102,0,115,98,99,95,109,111,100,101,0,97,101,114, -111,101,100,103,101,0,109,105,110,108,111,111,112,115,0,109,97,120,108,111,111,112,115,0,99,104,111,107,101,0,115,111, -108,118,101,114,95,73,68,0,112,108,97,115,116,105,99,0,115,112,114,105,110,103,112,114,101,108,111,97,100,0,42,115, -99,114,97,116,99,104,0,115,104,101,97,114,115,116,105,102,102,0,105,110,112,117,115,104,0,42,112,111,105,110,116,99, -97,99,104,101,0,115,104,111,119,95,97,100,118,97,110,99,101,100,111,112,116,105,111,110,115,0,114,101,115,111,108,117, -116,105,111,110,120,121,122,0,112,114,101,118,105,101,119,114,101,115,120,121,122,0,114,101,97,108,115,105,122,101,0,103, -117,105,68,105,115,112,108,97,121,77,111,100,101,0,114,101,110,100,101,114,68,105,115,112,108,97,121,77,111,100,101,0, -118,105,115,99,111,115,105,116,121,86,97,108,117,101,0,118,105,115,99,111,115,105,116,121,77,111,100,101,0,118,105,115, -99,111,115,105,116,121,69,120,112,111,110,101,110,116,0,103,114,97,118,120,0,103,114,97,118,121,0,103,114,97,118,122, -0,97,110,105,109,83,116,97,114,116,0,97,110,105,109,69,110,100,0,103,115,116,97,114,0,109,97,120,82,101,102,105, -110,101,0,105,110,105,86,101,108,120,0,105,110,105,86,101,108,121,0,105,110,105,86,101,108,122,0,42,111,114,103,77, -101,115,104,0,42,109,101,115,104,83,117,114,102,97,99,101,0,42,109,101,115,104,66,66,0,115,117,114,102,100,97,116, -97,80,97,116,104,91,50,52,48,93,0,98,98,83,116,97,114,116,91,51,93,0,98,98,83,105,122,101,91,51,93,0, -116,121,112,101,70,108,97,103,115,0,100,111,109,97,105,110,78,111,118,101,99,103,101,110,0,118,111,108,117,109,101,73, -110,105,116,84,121,112,101,0,112,97,114,116,83,108,105,112,86,97,108,117,101,0,103,101,110,101,114,97,116,101,84,114, -97,99,101,114,115,0,103,101,110,101,114,97,116,101,80,97,114,116,105,99,108,101,115,0,115,117,114,102,97,99,101,83, -109,111,111,116,104,105,110,103,0,115,117,114,102,97,99,101,83,117,98,100,105,118,115,0,112,97,114,116,105,99,108,101, -73,110,102,83,105,122,101,0,112,97,114,116,105,99,108,101,73,110,102,65,108,112,104,97,0,102,97,114,70,105,101,108, -100,83,105,122,101,0,42,109,101,115,104,83,117,114,102,78,111,114,109,97,108,115,0,99,112,115,84,105,109,101,83,116, -97,114,116,0,99,112,115,84,105,109,101,69,110,100,0,99,112,115,81,117,97,108,105,116,121,0,97,116,116,114,97,99, -116,102,111,114,99,101,83,116,114,101,110,103,116,104,0,97,116,116,114,97,99,116,102,111,114,99,101,82,97,100,105,117, -115,0,118,101,108,111,99,105,116,121,102,111,114,99,101,83,116,114,101,110,103,116,104,0,118,101,108,111,99,105,116,121, -102,111,114,99,101,82,97,100,105,117,115,0,108,97,115,116,103,111,111,100,102,114,97,109,101,0,109,105,115,116,121,112, -101,0,104,111,114,114,0,104,111,114,103,0,104,111,114,98,0,104,111,114,107,0,122,101,110,114,0,122,101,110,103,0, -122,101,110,98,0,122,101,110,107,0,97,109,98,107,0,102,97,115,116,99,111,108,0,101,120,112,111,115,117,114,101,0, -101,120,112,0,114,97,110,103,101,0,108,105,110,102,97,99,0,108,111,103,102,97,99,0,103,114,97,118,105,116,121,0, -97,99,116,105,118,105,116,121,66,111,120,82,97,100,105,117,115,0,115,107,121,116,121,112,101,0,111,99,99,108,117,115, -105,111,110,82,101,115,0,112,104,121,115,105,99,115,69,110,103,105,110,101,0,116,105,99,114,97,116,101,0,109,97,120, -108,111,103,105,99,115,116,101,112,0,112,104,121,115,117,98,115,116,101,112,0,109,97,120,112,104,121,115,116,101,112,0, -109,105,115,105,0,109,105,115,116,115,116,97,0,109,105,115,116,100,105,115,116,0,109,105,115,116,104,105,0,115,116,97, -114,114,0,115,116,97,114,103,0,115,116,97,114,98,0,115,116,97,114,107,0,115,116,97,114,115,105,122,101,0,115,116, -97,114,109,105,110,100,105,115,116,0,115,116,97,114,100,105,115,116,0,115,116,97,114,99,111,108,110,111,105,115,101,0, -100,111,102,115,116,97,0,100,111,102,101,110,100,0,100,111,102,109,105,110,0,100,111,102,109,97,120,0,97,111,100,105, -115,116,0,97,111,100,105,115,116,102,97,99,0,97,111,101,110,101,114,103,121,0,97,111,98,105,97,115,0,97,111,109, -111,100,101,0,97,111,115,97,109,112,0,97,111,109,105,120,0,97,111,99,111,108,111,114,0,97,111,95,97,100,97,112, -116,95,116,104,114,101,115,104,0,97,111,95,97,100,97,112,116,95,115,112,101,101,100,95,102,97,99,0,97,111,95,97, -112,112,114,111,120,95,101,114,114,111,114,0,97,111,95,97,112,112,114,111,120,95,99,111,114,114,101,99,116,105,111,110, -0,97,111,95,115,97,109,112,95,109,101,116,104,111,100,0,97,111,95,103,97,116,104,101,114,95,109,101,116,104,111,100, -0,97,111,95,97,112,112,114,111,120,95,112,97,115,115,101,115,0,42,97,111,115,112,104,101,114,101,0,42,97,111,116, -97,98,108,101,115,0,104,101,109,105,114,101,115,0,109,97,120,105,116,101,114,0,100,114,97,119,116,121,112,101,0,115, -117,98,115,104,111,111,116,112,0,115,117,98,115,104,111,111,116,101,0,110,111,100,101,108,105,109,0,109,97,120,115,117, -98,108,97,109,112,0,112,97,109,97,0,112,97,109,105,0,101,108,109,97,0,101,108,109,105,0,109,97,120,110,111,100, -101,0,99,111,110,118,101,114,103,101,110,99,101,0,114,97,100,102,97,99,0,103,97,109,109,97,0,115,101,108,99,111, -108,0,115,120,0,115,121,0,42,108,112,70,111,114,109,97,116,0,42,108,112,80,97,114,109,115,0,99,98,70,111,114, -109,97,116,0,99,98,80,97,114,109,115,0,102,99,99,84,121,112,101,0,102,99,99,72,97,110,100,108,101,114,0,100, -119,75,101,121,70,114,97,109,101,69,118,101,114,121,0,100,119,81,117,97,108,105,116,121,0,100,119,66,121,116,101,115, -80,101,114,83,101,99,111,110,100,0,100,119,70,108,97,103,115,0,100,119,73,110,116,101,114,108,101,97,118,101,69,118, -101,114,121,0,97,118,105,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,42,99,100,80,97,114,109,115,0,42, -112,97,100,0,99,100,83,105,122,101,0,113,116,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,99,111,100,101, -99,0,97,117,100,105,111,95,99,111,100,101,99,0,118,105,100,101,111,95,98,105,116,114,97,116,101,0,97,117,100,105, -111,95,98,105,116,114,97,116,101,0,103,111,112,95,115,105,122,101,0,114,99,95,109,105,110,95,114,97,116,101,0,114, -99,95,109,97,120,95,114,97,116,101,0,114,99,95,98,117,102,102,101,114,95,115,105,122,101,0,109,117,120,95,112,97, -99,107,101,116,95,115,105,122,101,0,109,117,120,95,114,97,116,101,0,109,105,120,114,97,116,101,0,109,97,105,110,0, -42,109,97,116,95,111,118,101,114,114,105,100,101,0,42,108,105,103,104,116,95,111,118,101,114,114,105,100,101,0,108,97, -121,95,122,109,97,115,107,0,108,97,121,102,108,97,103,0,112,97,115,115,102,108,97,103,0,112,97,115,115,95,120,111, -114,0,42,97,118,105,99,111,100,101,99,100,97,116,97,0,42,113,116,99,111,100,101,99,100,97,116,97,0,102,102,99, -111,100,101,99,100,97,116,97,0,99,102,114,97,0,112,115,102,114,97,0,112,101,102,114,97,0,105,109,97,103,101,115, -0,102,114,97,109,97,112,116,111,0,116,104,114,101,97,100,115,0,102,114,97,109,101,108,101,110,0,98,108,117,114,102, -97,99,0,101,100,103,101,82,0,101,100,103,101,71,0,101,100,103,101,66,0,102,117,108,108,115,99,114,101,101,110,0, -120,112,108,97,121,0,121,112,108,97,121,0,102,114,101,113,112,108,97,121,0,97,116,116,114,105,98,0,114,116,49,0, -115,116,101,114,101,111,109,111,100,101,0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116,0,109,97,120,105, -109,115,105,122,101,0,120,115,99,104,0,121,115,99,104,0,120,112,97,114,116,115,0,121,112,97,114,116,115,0,119,105, -110,112,111,115,0,112,108,97,110,101,115,0,105,109,116,121,112,101,0,115,117,98,105,109,116,121,112,101,0,113,117,97, -108,105,116,121,0,114,112,97,100,0,114,112,97,100,49,0,114,112,97,100,50,0,115,99,101,109,111,100,101,0,114,101, -110,100,101,114,101,114,0,111,99,114,101,115,0,97,108,112,104,97,109,111,100,101,0,111,115,97,0,102,114,115,95,115, -101,99,0,101,100,103,101,105,110,116,0,115,97,102,101,116,121,0,98,111,114,100,101,114,0,100,105,115,112,114,101,99, -116,0,108,97,121,101,114,115,0,97,99,116,108,97,121,0,120,97,115,112,0,121,97,115,112,0,102,114,115,95,115,101, -99,95,98,97,115,101,0,103,97,117,115,115,0,112,111,115,116,109,117,108,0,112,111,115,116,103,97,109,109,97,0,112, -111,115,116,104,117,101,0,112,111,115,116,115,97,116,0,100,105,116,104,101,114,95,105,110,116,101,110,115,105,116,121,0, -98,97,107,101,95,111,115,97,0,98,97,107,101,95,102,105,108,116,101,114,0,98,97,107,101,95,109,111,100,101,0,98, -97,107,101,95,102,108,97,103,0,98,97,107,101,95,110,111,114,109,97,108,95,115,112,97,99,101,0,98,97,107,101,95, -113,117,97,100,95,115,112,108,105,116,0,98,97,107,101,95,109,97,120,100,105,115,116,0,98,97,107,101,95,98,105,97, -115,100,105,115,116,0,98,97,107,101,95,112,97,100,0,71,73,113,117,97,108,105,116,121,0,71,73,99,97,99,104,101, -0,71,73,109,101,116,104,111,100,0,71,73,112,104,111,116,111,110,115,0,71,73,100,105,114,101,99,116,0,89,70,95, -65,65,0,89,70,101,120,112,111,114,116,120,109,108,0,89,70,95,110,111,98,117,109,112,0,89,70,95,99,108,97,109, -112,114,103,98,0,121,102,112,97,100,49,0,71,73,100,101,112,116,104,0,71,73,99,97,117,115,100,101,112,116,104,0, -71,73,112,105,120,101,108,115,112,101,114,115,97,109,112,108,101,0,71,73,112,104,111,116,111,110,99,111,117,110,116,0, -71,73,109,105,120,112,104,111,116,111,110,115,0,71,73,112,104,111,116,111,110,114,97,100,105,117,115,0,89,70,95,114, -97,121,100,101,112,116,104,0,89,70,95,65,65,112,97,115,115,101,115,0,89,70,95,65,65,115,97,109,112,108,101,115, -0,121,102,112,97,100,50,0,71,73,115,104,97,100,111,119,113,117,97,108,105,116,121,0,71,73,114,101,102,105,110,101, -109,101,110,116,0,71,73,112,111,119,101,114,0,71,73,105,110,100,105,114,112,111,119,101,114,0,89,70,95,103,97,109, -109,97,0,89,70,95,101,120,112,111,115,117,114,101,0,89,70,95,114,97,121,98,105,97,115,0,89,70,95,65,65,112, -105,120,101,108,115,105,122,101,0,89,70,95,65,65,116,104,114,101,115,104,111,108,100,0,98,97,99,107,98,117,102,91, -49,54,48,93,0,112,105,99,91,49,54,48,93,0,115,116,97,109,112,0,115,116,97,109,112,95,102,111,110,116,95,105, -100,0,115,116,97,109,112,95,117,100,97,116,97,91,49,54,48,93,0,102,103,95,115,116,97,109,112,91,52,93,0,98, -103,95,115,116,97,109,112,91,52,93,0,115,105,109,112,108,105,102,121,95,115,117,98,115,117,114,102,0,115,105,109,112, -108,105,102,121,95,115,104,97,100,111,119,115,97,109,112,108,101,115,0,115,105,109,112,108,105,102,121,95,112,97,114,116, -105,99,108,101,115,0,115,105,109,112,108,105,102,121,95,97,111,115,115,115,0,99,105,110,101,111,110,119,104,105,116,101, -0,99,105,110,101,111,110,98,108,97,99,107,0,99,105,110,101,111,110,103,97,109,109,97,0,106,112,50,95,112,114,101, -115,101,116,0,106,112,50,95,100,101,112,116,104,0,114,112,97,100,51,0,100,111,109,101,114,101,115,0,100,111,109,101, -109,111,100,101,0,100,111,109,101,97,110,103,108,101,0,100,111,109,101,116,105,108,116,0,100,111,109,101,114,101,115,98, -117,102,0,42,100,111,109,101,116,101,120,116,0,112,97,114,116,105,99,108,101,95,112,101,114,99,0,115,117,98,115,117, -114,102,95,109,97,120,0,115,104,97,100,98,117,102,115,97,109,112,108,101,95,109,97,120,0,97,111,95,101,114,114,111, -114,0,99,111,108,91,51,93,0,102,114,97,109,101,0,110,97,109,101,91,54,52,93,0,42,98,114,117,115,104,0,116, -111,111,108,0,115,101,97,109,95,98,108,101,101,100,0,110,111,114,109,97,108,95,97,110,103,108,101,0,115,116,101,112, -0,105,110,118,101,114,116,0,116,111,116,114,101,107,101,121,0,116,111,116,97,100,100,107,101,121,0,98,114,117,115,104, -116,121,112,101,0,98,114,117,115,104,91,55,93,0,101,109,105,116,116,101,114,100,105,115,116,0,100,114,97,119,95,116, -105,109,101,100,0,110,97,109,101,91,51,54,93,0,109,97,116,91,51,93,91,51,93,0,99,111,114,110,101,114,116,121, -112,101,0,101,100,105,116,98,117,116,102,108,97,103,0,106,111,105,110,116,114,105,108,105,109,105,116,0,100,101,103,114, -0,116,117,114,110,0,101,120,116,114,95,111,102,102,115,0,100,111,117,98,108,105,109,105,116,0,115,101,103,109,101,110, -116,115,0,114,105,110,103,115,0,118,101,114,116,105,99,101,115,0,117,110,119,114,97,112,112,101,114,0,117,118,99,97, -108,99,95,114,97,100,105,117,115,0,117,118,99,97,108,99,95,99,117,98,101,115,105,122,101,0,117,118,99,97,108,99, -95,109,97,114,103,105,110,0,117,118,99,97,108,99,95,109,97,112,100,105,114,0,117,118,99,97,108,99,95,109,97,112, -97,108,105,103,110,0,117,118,99,97,108,99,95,102,108,97,103,0,97,117,116,111,105,107,95,99,104,97,105,110,108,101, -110,0,105,109,97,112,97,105,110,116,0,112,97,114,116,105,99,108,101,0,115,101,108,101,99,116,95,116,104,114,101,115, -104,0,99,108,101,97,110,95,116,104,114,101,115,104,0,114,101,116,111,112,111,95,109,111,100,101,0,114,101,116,111,112, -111,95,112,97,105,110,116,95,116,111,111,108,0,108,105,110,101,95,100,105,118,0,101,108,108,105,112,115,101,95,100,105, -118,0,114,101,116,111,112,111,95,104,111,116,115,112,111,116,0,109,117,108,116,105,114,101,115,95,115,117,98,100,105,118, -95,116,121,112,101,0,115,107,103,101,110,95,114,101,115,111,108,117,116,105,111,110,0,115,107,103,101,110,95,116,104,114, -101,115,104,111,108,100,95,105,110,116,101,114,110,97,108,0,115,107,103,101,110,95,116,104,114,101,115,104,111,108,100,95, -101,120,116,101,114,110,97,108,0,115,107,103,101,110,95,108,101,110,103,116,104,95,114,97,116,105,111,0,115,107,103,101, -110,95,108,101,110,103,116,104,95,108,105,109,105,116,0,115,107,103,101,110,95,97,110,103,108,101,95,108,105,109,105,116, -0,115,107,103,101,110,95,99,111,114,114,101,108,97,116,105,111,110,95,108,105,109,105,116,0,115,107,103,101,110,95,115, -121,109,109,101,116,114,121,95,108,105,109,105,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,97,110,103, -108,101,95,119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,108,101,110,103,116,104,95, -119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,100,105,115,116,97,110,99,101,95,119, -101,105,103,104,116,0,115,107,103,101,110,95,111,112,116,105,111,110,115,0,115,107,103,101,110,95,112,111,115,116,112,114, -111,0,115,107,103,101,110,95,112,111,115,116,112,114,111,95,112,97,115,115,101,115,0,115,107,103,101,110,95,115,117,98, -100,105,118,105,115,105,111,110,115,91,51,93,0,115,107,103,101,110,95,109,117,108,116,105,95,108,101,118,101,108,0,42, -115,107,103,101,110,95,116,101,109,112,108,97,116,101,0,98,111,110,101,95,115,107,101,116,99,104,105,110,103,0,98,111, -110,101,95,115,107,101,116,99,104,105,110,103,95,99,111,110,118,101,114,116,0,115,107,103,101,110,95,115,117,98,100,105, -118,105,115,105,111,110,95,110,117,109,98,101,114,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,111,112,116, -105,111,110,115,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,114,111,108,108,0,115,107,103,101,110,95,115, -105,100,101,95,115,116,114,105,110,103,91,56,93,0,115,107,103,101,110,95,110,117,109,95,115,116,114,105,110,103,91,56, -93,0,101,100,103,101,95,109,111,100,101,0,112,97,100,51,91,50,93,0,100,105,114,0,118,105,101,119,0,42,115,101, -115,115,105,111,110,0,42,99,117,109,97,112,0,100,114,97,119,98,114,117,115,104,0,115,109,111,111,116,104,98,114,117, -115,104,0,112,105,110,99,104,98,114,117,115,104,0,105,110,102,108,97,116,101,98,114,117,115,104,0,103,114,97,98,98, -114,117,115,104,0,108,97,121,101,114,98,114,117,115,104,0,102,108,97,116,116,101,110,98,114,117,115,104,0,112,105,118, -111,116,91,51,93,0,98,114,117,115,104,95,116,121,112,101,0,116,101,120,110,114,0,116,101,120,114,101,112,116,0,116, -101,120,102,97,100,101,0,116,101,120,115,101,112,0,97,118,101,114,97,103,105,110,103,0,116,97,98,108,101,116,95,115, -105,122,101,0,116,97,98,108,101,116,95,115,116,114,101,110,103,116,104,0,115,121,109,109,0,114,97,107,101,0,97,120, -105,115,108,111,99,107,0,42,99,97,109,101,114,97,0,42,119,111,114,108,100,0,42,115,101,116,0,98,97,115,101,0, -42,98,97,115,97,99,116,0,99,117,114,115,111,114,91,51,93,0,116,119,99,101,110,116,91,51,93,0,116,119,109,105, -110,91,51,93,0,116,119,109,97,120,91,51,93,0,101,100,105,116,98,117,116,115,105,122,101,0,115,101,108,101,99,116, -109,111,100,101,0,112,114,111,112,111,114,116,105,111,110,97,108,0,112,114,111,112,95,109,111,100,101,0,97,117,116,111, -109,101,114,103,101,0,112,97,100,53,0,112,97,100,54,0,97,117,116,111,107,101,121,95,109,111,100,101,0,42,101,100, -0,42,114,97,100,105,111,0,102,114,97,109,105,110,103,0,42,116,111,111,108,115,101,116,116,105,110,103,115,0,97,117, -100,105,111,0,116,114,97,110,115,102,111,114,109,95,115,112,97,99,101,115,0,106,117,109,112,102,114,97,109,101,0,115, -110,97,112,95,109,111,100,101,0,115,110,97,112,95,102,108,97,103,0,115,110,97,112,95,116,97,114,103,101,116,0,42, -116,104,101,68,97,103,0,100,97,103,105,115,118,97,108,105,100,0,100,97,103,102,108,97,103,115,0,115,99,117,108,112, -116,100,97,116,97,0,102,114,97,109,101,95,115,116,101,112,0,122,111,111,109,0,98,108,101,110,100,0,120,105,109,0, -121,105,109,0,115,112,97,99,101,116,121,112,101,0,98,108,111,99,107,115,99,97,108,101,0,42,97,114,101,97,0,98, -108,111,99,107,104,97,110,100,108,101,114,91,56,93,0,118,105,101,119,109,97,116,91,52,93,91,52,93,0,118,105,101, -119,105,110,118,91,52,93,91,52,93,0,112,101,114,115,109,97,116,91,52,93,91,52,93,0,112,101,114,115,105,110,118, -91,52,93,91,52,93,0,119,105,110,109,97,116,49,91,52,93,91,52,93,0,118,105,101,119,109,97,116,49,91,52,93, -91,52,93,0,118,105,101,119,113,117,97,116,91,52,93,0,122,102,97,99,0,108,97,121,95,117,115,101,100,0,112,101, -114,115,112,0,42,111,98,95,99,101,110,116,114,101,0,42,98,103,112,105,99,0,42,108,111,99,97,108,118,100,0,42, -114,105,0,42,114,101,116,111,112,111,95,118,105,101,119,95,100,97,116,97,0,42,100,101,112,116,104,115,0,111,98,95, -99,101,110,116,114,101,95,98,111,110,101,91,51,50,93,0,108,111,99,97,108,118,105,101,119,0,108,97,121,97,99,116, -0,115,99,101,110,101,108,111,99,107,0,97,114,111,117,110,100,0,99,97,109,122,111,111,109,0,112,105,118,111,116,95, -108,97,115,116,0,103,114,105,100,0,103,114,105,100,118,105,101,119,0,112,105,120,115,105,122,101,0,110,101,97,114,0, -102,97,114,0,99,97,109,100,120,0,99,97,109,100,121,0,103,114,105,100,108,105,110,101,115,0,118,105,101,119,98,117, -116,0,103,114,105,100,102,108,97,103,0,109,111,100,101,115,101,108,101,99,116,0,116,119,116,121,112,101,0,116,119,109, -111,100,101,0,116,119,102,108,97,103,0,116,119,100,114,97,119,102,108,97,103,0,116,119,109,97,116,91,52,93,91,52, -93,0,99,108,105,112,91,52,93,91,52,93,0,42,99,108,105,112,98,98,0,97,102,116,101,114,100,114,97,119,0,122, -98,117,102,0,120,114,97,121,0,102,108,97,103,50,0,103,114,105,100,115,117,98,100,105,118,0,107,101,121,102,108,97, -103,115,0,110,100,111,102,109,111,100,101,0,110,100,111,102,102,105,108,116,101,114,0,42,112,114,111,112,101,114,116,105, -101,115,95,115,116,111,114,97,103,101,0,42,103,112,100,0,108,118,105,101,119,113,117,97,116,91,52,93,0,108,112,101, -114,115,112,0,108,118,105,101,119,0,118,101,114,116,0,104,111,114,0,109,97,115,107,0,109,105,110,91,50,93,0,109, -97,120,91,50,93,0,109,105,110,122,111,111,109,0,109,97,120,122,111,111,109,0,115,99,114,111,108,108,0,107,101,101, -112,116,111,116,0,107,101,101,112,97,115,112,101,99,116,0,107,101,101,112,122,111,111,109,0,111,108,100,119,105,110,120, -0,111,108,100,119,105,110,121,0,99,117,114,115,111,114,91,50,93,0,114,111,119,98,117,116,0,118,50,100,0,42,101, -100,105,116,105,112,111,0,105,112,111,107,101,121,0,97,99,116,110,97,109,101,91,51,50,93,0,99,111,110,115,116,110, -97,109,101,91,51,50,93,0,98,111,110,101,110,97,109,101,91,51,50,93,0,116,111,116,105,112,111,0,112,105,110,0, -98,117,116,111,102,115,0,99,104,97,110,110,101,108,0,108,111,99,107,0,109,101,100,105,97,110,91,51,93,0,99,117, -114,115,101,110,115,0,99,117,114,97,99,116,0,97,108,105,103,110,0,116,97,98,111,0,109,97,105,110,98,0,109,97, -105,110,98,111,0,42,108,111,99,107,112,111,105,110,0,116,101,120,102,114,111,109,0,115,104,111,119,103,114,111,117,112, -0,109,111,100,101,108,116,121,112,101,0,115,99,114,105,112,116,98,108,111,99,107,0,114,101,95,97,108,105,103,110,0, -111,108,100,107,101,121,112,114,101,115,115,0,116,97,98,91,55,93,0,114,101,110,100,101,114,95,115,105,122,101,0,99, -104,97,110,115,104,111,119,110,0,122,101,98,114,97,0,42,102,105,108,101,108,105,115,116,0,116,111,116,102,105,108,101, -0,116,105,116,108,101,91,50,52,93,0,100,105,114,91,50,52,48,93,0,102,105,108,101,91,56,48,93,0,111,102,115, -0,115,111,114,116,0,109,97,120,110,97,109,101,108,101,110,0,99,111,108,108,117,109,115,0,102,95,102,112,0,102,112, -95,115,116,114,91,56,93,0,42,108,105,98,102,105,108,101,100,97,116,97,0,114,101,116,118,97,108,0,109,101,110,117, -0,97,99,116,0,40,42,114,101,116,117,114,110,102,117,110,99,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110, -99,95,101,118,101,110,116,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110,99,95,97,114,103,115,41,40,41,0, -42,97,114,103,49,0,42,97,114,103,50,0,42,109,101,110,117,112,0,42,112,117,112,109,101,110,117,0,111,111,112,115, -0,118,105,115,105,102,108,97,103,0,116,114,101,101,0,42,116,114,101,101,115,116,111,114,101,0,115,101,97,114,99,104, -95,115,116,114,105,110,103,91,51,50,93,0,115,101,97,114,99,104,95,116,115,101,0,115,101,97,114,99,104,95,102,108, -97,103,115,0,100,111,95,0,111,117,116,108,105,110,101,118,105,115,0,115,116,111,114,101,102,108,97,103,0,100,101,112, -115,95,102,108,97,103,115,0,105,109,97,110,114,0,99,117,114,116,105,108,101,0,105,109,116,121,112,101,110,114,0,100, -116,95,117,118,0,115,116,105,99,107,121,0,100,116,95,117,118,115,116,114,101,116,99,104,0,112,97,100,91,53,93,0, -99,101,110,116,120,0,99,101,110,116,121,0,97,117,116,111,115,110,97,112,0,42,116,101,120,116,0,116,111,112,0,118, -105,101,119,108,105,110,101,115,0,102,111,110,116,95,105,100,0,108,104,101,105,103,104,116,0,108,101,102,116,0,115,104, -111,119,108,105,110,101,110,114,115,0,116,97,98,110,117,109,98,101,114,0,99,117,114,114,116,97,98,95,115,101,116,0, -115,104,111,119,115,121,110,116,97,120,0,111,118,101,114,119,114,105,116,101,0,112,105,120,95,112,101,114,95,108,105,110, -101,0,116,120,116,115,99,114,111,108,108,0,116,120,116,98,97,114,0,119,111,114,100,119,114,97,112,0,100,111,112,108, -117,103,105,110,115,0,42,112,121,95,100,114,97,119,0,42,112,121,95,101,118,101,110,116,0,42,112,121,95,98,117,116, -116,111,110,0,42,112,121,95,98,114,111,119,115,101,114,99,97,108,108,98,97,99,107,0,42,112,121,95,103,108,111,98, -97,108,100,105,99,116,0,108,97,115,116,115,112,97,99,101,0,115,99,114,105,112,116,110,97,109,101,91,50,53,54,93, -0,115,99,114,105,112,116,97,114,103,91,50,53,54,93,0,42,115,99,114,105,112,116,0,42,98,117,116,95,114,101,102, -115,0,114,101,100,114,97,119,115,0,42,105,100,0,97,115,112,101,99,116,0,42,99,117,114,102,111,110,116,0,42,101, -100,105,116,116,114,101,101,0,116,114,101,101,116,121,112,101,0,42,102,105,108,101,115,0,97,99,116,105,118,101,95,102, -105,108,101,0,110,117,109,116,105,108,101,115,120,0,110,117,109,116,105,108,101,115,121,0,115,101,108,115,116,97,116,101, -0,118,105,101,119,114,101,99,116,0,98,111,111,107,109,97,114,107,114,101,99,116,0,115,99,114,111,108,108,112,111,115, -0,115,99,114,111,108,108,104,101,105,103,104,116,0,115,99,114,111,108,108,97,114,101,97,0,97,99,116,105,118,101,95, -98,111,111,107,109,97,114,107,0,112,114,118,95,119,0,112,114,118,95,104,0,42,105,109,103,0,111,117,116,108,105,110, -101,91,52,93,0,110,101,117,116,114,97,108,91,52,93,0,97,99,116,105,111,110,91,52,93,0,115,101,116,116,105,110, -103,91,52,93,0,115,101,116,116,105,110,103,49,91,52,93,0,115,101,116,116,105,110,103,50,91,52,93,0,110,117,109, -91,52,93,0,116,101,120,116,102,105,101,108,100,91,52,93,0,116,101,120,116,102,105,101,108,100,95,104,105,91,52,93, -0,112,111,112,117,112,91,52,93,0,116,101,120,116,91,52,93,0,116,101,120,116,95,104,105,91,52,93,0,109,101,110, -117,95,98,97,99,107,91,52,93,0,109,101,110,117,95,105,116,101,109,91,52,93,0,109,101,110,117,95,104,105,108,105, -116,101,91,52,93,0,109,101,110,117,95,116,101,120,116,91,52,93,0,109,101,110,117,95,116,101,120,116,95,104,105,91, -52,93,0,98,117,116,95,100,114,97,119,116,121,112,101,0,105,99,111,110,102,105,108,101,91,56,48,93,0,98,97,99, -107,91,52,93,0,104,101,97,100,101,114,91,52,93,0,112,97,110,101,108,91,52,93,0,115,104,97,100,101,49,91,52, -93,0,115,104,97,100,101,50,91,52,93,0,104,105,108,105,116,101,91,52,93,0,103,114,105,100,91,52,93,0,119,105, -114,101,91,52,93,0,115,101,108,101,99,116,91,52,93,0,108,97,109,112,91,52,93,0,97,99,116,105,118,101,91,52, -93,0,103,114,111,117,112,91,52,93,0,103,114,111,117,112,95,97,99,116,105,118,101,91,52,93,0,116,114,97,110,115, -102,111,114,109,91,52,93,0,118,101,114,116,101,120,91,52,93,0,118,101,114,116,101,120,95,115,101,108,101,99,116,91, -52,93,0,101,100,103,101,91,52,93,0,101,100,103,101,95,115,101,108,101,99,116,91,52,93,0,101,100,103,101,95,115, -101,97,109,91,52,93,0,101,100,103,101,95,115,104,97,114,112,91,52,93,0,101,100,103,101,95,102,97,99,101,115,101, -108,91,52,93,0,102,97,99,101,91,52,93,0,102,97,99,101,95,115,101,108,101,99,116,91,52,93,0,102,97,99,101, -95,100,111,116,91,52,93,0,110,111,114,109,97,108,91,52,93,0,98,111,110,101,95,115,111,108,105,100,91,52,93,0, -98,111,110,101,95,112,111,115,101,91,52,93,0,115,116,114,105,112,91,52,93,0,115,116,114,105,112,95,115,101,108,101, -99,116,91,52,93,0,99,102,114,97,109,101,91,52,93,0,118,101,114,116,101,120,95,115,105,122,101,0,102,97,99,101, -100,111,116,95,115,105,122,101,0,98,112,97,100,91,50,93,0,115,121,110,116,97,120,108,91,52,93,0,115,121,110,116, -97,120,110,91,52,93,0,115,121,110,116,97,120,98,91,52,93,0,115,121,110,116,97,120,118,91,52,93,0,115,121,110, -116,97,120,99,91,52,93,0,109,111,118,105,101,91,52,93,0,105,109,97,103,101,91,52,93,0,115,99,101,110,101,91, -52,93,0,97,117,100,105,111,91,52,93,0,101,102,102,101,99,116,91,52,93,0,112,108,117,103,105,110,91,52,93,0, -116,114,97,110,115,105,116,105,111,110,91,52,93,0,109,101,116,97,91,52,93,0,101,100,105,116,109,101,115,104,95,97, -99,116,105,118,101,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,91,52,93,0,104,97,110,100,108,101, -95,118,101,114,116,101,120,95,115,101,108,101,99,116,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,95, -115,105,122,101,0,104,112,97,100,91,55,93,0,115,111,108,105,100,91,52,93,0,116,117,105,0,116,98,117,116,115,0, -116,118,51,100,0,116,102,105,108,101,0,116,105,112,111,0,116,105,110,102,111,0,116,115,110,100,0,116,97,99,116,0, -116,110,108,97,0,116,115,101,113,0,116,105,109,97,0,116,105,109,97,115,101,108,0,116,101,120,116,0,116,111,111,112, -115,0,116,116,105,109,101,0,116,110,111,100,101,0,116,97,114,109,91,50,48,93,0,98,112,97,100,91,52,93,0,98, -112,97,100,49,91,52,93,0,115,112,101,99,91,52,93,0,100,117,112,102,108,97,103,0,115,97,118,101,116,105,109,101, -0,116,101,109,112,100,105,114,91,49,54,48,93,0,102,111,110,116,100,105,114,91,49,54,48,93,0,114,101,110,100,101, -114,100,105,114,91,49,54,48,93,0,116,101,120,116,117,100,105,114,91,49,54,48,93,0,112,108,117,103,116,101,120,100, -105,114,91,49,54,48,93,0,112,108,117,103,115,101,113,100,105,114,91,49,54,48,93,0,112,121,116,104,111,110,100,105, -114,91,49,54,48,93,0,115,111,117,110,100,100,105,114,91,49,54,48,93,0,121,102,101,120,112,111,114,116,100,105,114, -91,49,54,48,93,0,118,101,114,115,105,111,110,115,0,118,114,109,108,102,108,97,103,0,103,97,109,101,102,108,97,103, -115,0,119,104,101,101,108,108,105,110,101,115,99,114,111,108,108,0,117,105,102,108,97,103,0,108,97,110,103,117,97,103, -101,0,117,115,101,114,112,114,101,102,0,118,105,101,119,122,111,111,109,0,99,111,110,115,111,108,101,95,98,117,102,102, -101,114,0,99,111,110,115,111,108,101,95,111,117,116,0,109,105,120,98,117,102,115,105,122,101,0,102,111,110,116,115,105, -122,101,0,101,110,99,111,100,105,110,103,0,116,114,97,110,115,111,112,116,115,0,109,101,110,117,116,104,114,101,115,104, -111,108,100,49,0,109,101,110,117,116,104,114,101,115,104,111,108,100,50,0,102,111,110,116,110,97,109,101,91,50,53,54, -93,0,116,104,101,109,101,115,0,117,110,100,111,115,116,101,112,115,0,117,110,100,111,109,101,109,111,114,121,0,103,112, -95,109,97,110,104,97,116,116,101,110,100,105,115,116,0,103,112,95,101,117,99,108,105,100,101,97,110,100,105,115,116,0, -103,112,95,101,114,97,115,101,114,0,103,112,95,115,101,116,116,105,110,103,115,0,116,98,95,108,101,102,116,109,111,117, -115,101,0,116,98,95,114,105,103,104,116,109,111,117,115,101,0,108,105,103,104,116,91,51,93,0,116,119,95,104,111,116, -115,112,111,116,0,116,119,95,102,108,97,103,0,116,119,95,104,97,110,100,108,101,115,105,122,101,0,116,119,95,115,105, -122,101,0,116,101,120,116,105,109,101,111,117,116,0,116,101,120,99,111,108,108,101,99,116,114,97,116,101,0,109,101,109, -99,97,99,104,101,108,105,109,105,116,0,112,114,101,102,101,116,99,104,102,114,97,109,101,115,0,102,114,97,109,101,115, -101,114,118,101,114,112,111,114,116,0,112,97,100,95,114,111,116,95,97,110,103,108,101,0,111,98,99,101,110,116,101,114, -95,100,105,97,0,114,118,105,115,105,122,101,0,114,118,105,98,114,105,103,104,116,0,114,101,99,101,110,116,95,102,105, -108,101,115,0,115,109,111,111,116,104,95,118,105,101,119,116,120,0,103,108,114,101,115,108,105,109,105,116,0,110,100,111, -102,95,112,97,110,0,110,100,111,102,95,114,111,116,97,116,101,0,99,117,114,115,115,105,122,101,0,112,97,100,91,56, -93,0,118,101,114,115,101,109,97,115,116,101,114,91,49,54,48,93,0,118,101,114,115,101,117,115,101,114,91,49,54,48, -93,0,103,108,97,108,112,104,97,99,108,105,112,0,97,117,116,111,107,101,121,95,102,108,97,103,0,99,111,98,97,95, -119,101,105,103,104,116,0,118,101,114,116,98,97,115,101,0,101,100,103,101,98,97,115,101,0,97,114,101,97,98,97,115, -101,0,42,115,99,101,110,101,0,101,110,100,120,0,101,110,100,121,0,115,105,122,101,120,0,115,105,122,101,121,0,115, -99,101,110,101,110,114,0,115,99,114,101,101,110,110,114,0,102,117,108,108,0,109,97,105,110,119,105,110,0,119,105,110, -97,107,116,0,104,97,110,100,108,101,114,91,56,93,0,42,110,101,119,118,0,118,101,99,0,42,118,49,0,42,118,50, -0,112,97,110,101,108,110,97,109,101,91,54,52,93,0,116,97,98,110,97,109,101,91,54,52,93,0,100,114,97,119,110, -97,109,101,91,54,52,93,0,111,102,115,120,0,111,102,115,121,0,99,111,110,116,114,111,108,0,115,110,97,112,0,111, -108,100,95,111,102,115,120,0,111,108,100,95,111,102,115,121,0,115,111,114,116,99,111,117,110,116,101,114,0,42,112,97, -110,101,108,116,97,98,0,42,118,51,0,42,118,52,0,42,102,117,108,108,0,119,105,110,109,97,116,91,52,93,91,52, -93,0,104,101,97,100,114,99,116,0,119,105,110,114,99,116,0,104,101,97,100,119,105,110,0,119,105,110,0,104,101,97, -100,101,114,116,121,112,101,0,98,117,116,115,112,97,99,101,116,121,112,101,0,119,105,110,120,0,119,105,110,121,0,104, -101,97,100,95,115,119,97,112,0,104,101,97,100,95,101,113,117,97,108,0,119,105,110,95,115,119,97,112,0,119,105,110, -95,101,113,117,97,108,0,104,101,97,100,98,117,116,108,101,110,0,104,101,97,100,98,117,116,111,102,115,0,99,117,114, -115,111,114,0,115,112,97,99,101,100,97,116,97,0,117,105,98,108,111,99,107,115,0,112,97,110,101,108,115,0,115,117, -98,118,115,116,114,91,52,93,0,115,117,98,118,101,114,115,105,111,110,0,112,97,100,115,0,109,105,110,118,101,114,115, -105,111,110,0,109,105,110,115,117,98,118,101,114,115,105,111,110,0,100,105,115,112,108,97,121,109,111,100,101,0,42,99, -117,114,115,99,114,101,101,110,0,42,99,117,114,115,99,101,110,101,0,102,105,108,101,102,108,97,103,115,0,103,108,111, -98,97,108,102,0,110,97,109,101,91,56,48,93,0,42,105,98,117,102,0,42,105,98,117,102,95,99,111,109,112,0,42, -115,101,49,0,42,115,101,50,0,42,115,101,51,0,110,114,0,98,111,116,116,111,109,0,114,105,103,104,116,0,120,111, -102,115,0,121,111,102,115,0,108,105,102,116,91,51,93,0,103,97,109,109,97,91,51,93,0,103,97,105,110,91,51,93, -0,115,97,116,117,114,97,116,105,111,110,0,42,103,117,105,0,100,105,114,91,49,54,48,93,0,100,111,110,101,0,115, -116,97,114,116,115,116,105,108,108,0,101,110,100,115,116,105,108,108,0,42,115,116,114,105,112,100,97,116,97,0,111,114, -120,0,111,114,121,0,42,99,114,111,112,0,42,116,114,97,110,115,102,111,114,109,0,42,99,111,108,111,114,95,98,97, -108,97,110,99,101,0,42,116,115,116,114,105,112,100,97,116,97,0,42,116,115,116,114,105,112,100,97,116,97,95,115,116, -97,114,116,115,116,105,108,108,0,42,116,115,116,114,105,112,100,97,116,97,95,101,110,100,115,116,105,108,108,0,42,105, -98,117,102,95,115,116,97,114,116,115,116,105,108,108,0,42,105,98,117,102,95,101,110,100,115,116,105,108,108,0,42,105, -110,115,116,97,110,99,101,95,112,114,105,118,97,116,101,95,100,97,116,97,0,42,42,99,117,114,114,101,110,116,95,112, -114,105,118,97,116,101,95,100,97,116,97,0,42,116,109,112,0,115,116,97,114,116,111,102,115,0,101,110,100,111,102,115, -0,109,97,99,104,105,110,101,0,115,116,97,114,116,100,105,115,112,0,101,110,100,100,105,115,112,0,109,117,108,0,104, -97,110,100,115,105,122,101,0,97,110,105,109,95,112,114,101,115,101,101,107,0,42,115,116,114,105,112,0,102,97,99,102, -48,0,102,97,99,102,49,0,42,115,101,113,49,0,42,115,101,113,50,0,42,115,101,113,51,0,115,101,113,98,97,115, -101,0,42,115,111,117,110,100,0,42,104,100,97,117,100,105,111,0,108,101,118,101,108,0,112,97,110,0,115,116,114,111, -98,101,0,42,101,102,102,101,99,116,100,97,116,97,0,97,110,105,109,95,115,116,97,114,116,111,102,115,0,97,110,105, -109,95,101,110,100,111,102,115,0,98,108,101,110,100,95,109,111,100,101,0,98,108,101,110,100,95,111,112,97,99,105,116, -121,0,42,111,108,100,98,97,115,101,112,0,42,112,97,114,115,101,113,0,42,115,101,113,98,97,115,101,112,0,109,101, -116,97,115,116,97,99,107,0,101,100,103,101,87,105,100,116,104,0,102,111,114,119,97,114,100,0,119,105,112,101,116,121, -112,101,0,102,77,105,110,105,0,102,67,108,97,109,112,0,102,66,111,111,115,116,0,100,68,105,115,116,0,100,81,117, -97,108,105,116,121,0,98,78,111,67,111,109,112,0,83,99,97,108,101,120,73,110,105,0,83,99,97,108,101,121,73,110, -105,0,83,99,97,108,101,120,70,105,110,0,83,99,97,108,101,121,70,105,110,0,120,73,110,105,0,120,70,105,110,0, -121,73,110,105,0,121,70,105,110,0,114,111,116,73,110,105,0,114,111,116,70,105,110,0,105,110,116,101,114,112,111,108, -97,116,105,111,110,0,42,102,114,97,109,101,77,97,112,0,103,108,111,98,97,108,83,112,101,101,100,0,108,97,115,116, -86,97,108,105,100,70,114,97,109,101,0,98,108,101,110,100,70,114,97,109,101,115,0,98,117,116,116,121,112,101,0,117, -115,101,114,106,105,116,0,115,116,97,0,116,111,116,112,97,114,116,0,110,111,114,109,102,97,99,0,111,98,102,97,99, -0,114,97,110,100,102,97,99,0,116,101,120,102,97,99,0,114,97,110,100,108,105,102,101,0,102,111,114,99,101,91,51, -93,0,118,101,99,116,115,105,122,101,0,109,97,120,108,101,110,0,100,101,102,118,101,99,91,51,93,0,109,117,108,116, -91,52,93,0,108,105,102,101,91,52,93,0,99,104,105,108,100,91,52,93,0,109,97,116,91,52,93,0,116,101,120,109, -97,112,0,99,117,114,109,117,108,116,0,115,116,97,116,105,99,115,116,101,112,0,111,109,97,116,0,116,105,109,101,116, -101,120,0,115,112,101,101,100,116,101,120,0,102,108,97,103,50,110,101,103,0,118,101,114,116,103,114,111,117,112,95,118, -0,118,103,114,111,117,112,110,97,109,101,91,51,50,93,0,118,103,114,111,117,112,110,97,109,101,95,118,91,51,50,93, -0,42,107,101,121,115,0,109,105,110,102,97,99,0,117,115,101,100,0,117,115,101,100,101,108,101,109,0,100,120,0,100, -121,0,108,105,110,107,0,111,116,121,112,101,0,111,108,100,0,42,112,111,105,110,0,42,111,108,100,112,111,105,110,0, -114,101,115,101,116,100,105,115,116,0,108,97,115,116,118,97,108,0,42,109,97,0,107,101,121,0,113,117,97,108,0,113, -117,97,108,50,0,116,97,114,103,101,116,78,97,109,101,91,51,50,93,0,116,111,103,103,108,101,78,97,109,101,91,51, -50,93,0,118,97,108,117,101,91,51,50,93,0,109,97,120,118,97,108,117,101,91,51,50,93,0,100,101,108,97,121,0, -100,117,114,97,116,105,111,110,0,109,97,116,101,114,105,97,108,78,97,109,101,91,51,50,93,0,100,97,109,112,116,105, -109,101,114,0,112,114,111,112,110,97,109,101,91,51,50,93,0,109,97,116,110,97,109,101,91,51,50,93,0,97,120,105, -115,102,108,97,103,0,42,102,114,111,109,79,98,106,101,99,116,0,115,117,98,106,101,99,116,91,51,50,93,0,98,111, -100,121,91,51,50,93,0,112,117,108,115,101,0,102,114,101,113,0,116,111,116,108,105,110,107,115,0,42,42,108,105,110, -107,115,0,116,97,112,0,106,111,121,105,110,100,101,120,0,97,120,105,115,95,115,105,110,103,108,101,0,97,120,105,115, -102,0,98,117,116,116,111,110,0,104,97,116,0,104,97,116,102,0,112,114,101,99,105,115,105,111,110,0,115,116,114,91, -49,50,56,93,0,109,111,100,117,108,101,91,54,52,93,0,42,109,121,110,101,119,0,105,110,112,117,116,115,0,116,111, -116,115,108,105,110,107,115,0,42,42,115,108,105,110,107,115,0,118,97,108,111,0,115,116,97,116,101,95,109,97,115,107, -0,42,97,99,116,0,102,114,97,109,101,80,114,111,112,91,51,50,93,0,98,108,101,110,100,105,110,0,112,114,105,111, -114,105,116,121,0,101,110,100,95,114,101,115,101,116,0,115,116,114,105,100,101,97,120,105,115,0,115,116,114,105,100,101, -108,101,110,103,116,104,0,115,110,100,110,114,0,112,97,100,49,91,50,93,0,109,97,107,101,99,111,112,121,0,99,111, -112,121,109,97,100,101,0,112,97,100,50,91,49,93,0,116,114,97,99,107,0,42,109,101,0,108,105,110,86,101,108,111, -99,105,116,121,91,51,93,0,97,110,103,86,101,108,111,99,105,116,121,91,51,93,0,108,111,99,97,108,102,108,97,103, -0,100,121,110,95,111,112,101,114,97,116,105,111,110,0,102,111,114,99,101,108,111,99,91,51,93,0,102,111,114,99,101, -114,111,116,91,51,93,0,108,105,110,101,97,114,118,101,108,111,99,105,116,121,91,51,93,0,97,110,103,117,108,97,114, -118,101,108,111,99,105,116,121,91,51,93,0,42,114,101,102,101,114,101,110,99,101,0,98,117,116,115,116,97,0,98,117, -116,101,110,100,0,109,105,110,0,109,97,120,0,118,105,115,105,102,97,99,0,114,111,116,100,97,109,112,0,109,105,110, -108,111,99,91,51,93,0,109,97,120,108,111,99,91,51,93,0,109,105,110,114,111,116,91,51,93,0,109,97,120,114,111, -116,91,51,93,0,109,97,116,112,114,111,112,91,51,50,93,0,100,105,115,116,114,105,98,117,116,105,111,110,0,105,110, -116,95,97,114,103,95,49,0,105,110,116,95,97,114,103,95,50,0,102,108,111,97,116,95,97,114,103,95,49,0,102,108, -111,97,116,95,97,114,103,95,50,0,116,111,80,114,111,112,78,97,109,101,91,51,50,93,0,42,116,111,79,98,106,101, -99,116,0,98,111,100,121,84,121,112,101,0,102,105,108,101,110,97,109,101,91,54,52,93,0,108,111,97,100,97,110,105, -110,97,109,101,91,54,52,93,0,105,110,116,95,97,114,103,0,102,108,111,97,116,95,97,114,103,0,103,111,0,97,99, -99,101,108,108,101,114,97,116,105,111,110,0,109,97,120,115,112,101,101,100,0,109,97,120,114,111,116,115,112,101,101,100, -0,109,97,120,116,105,108,116,115,112,101,101,100,0,116,105,108,116,100,97,109,112,0,115,112,101,101,100,100,97,109,112, -0,42,115,97,109,112,108,101,0,42,115,116,114,101,97,109,0,42,110,101,119,112,97,99,107,101,100,102,105,108,101,0, -42,115,110,100,95,115,111,117,110,100,0,112,97,110,110,105,110,103,0,97,116,116,101,110,117,97,116,105,111,110,0,112, -105,116,99,104,0,109,105,110,95,103,97,105,110,0,109,97,120,95,103,97,105,110,0,100,105,115,116,97,110,99,101,0, -115,116,114,101,97,109,108,101,110,0,99,104,97,110,110,101,108,115,0,104,105,103,104,112,114,105,111,0,112,97,100,91, -49,48,93,0,103,97,105,110,0,100,111,112,112,108,101,114,102,97,99,116,111,114,0,100,111,112,112,108,101,114,118,101, -108,111,99,105,116,121,0,110,117,109,115,111,117,110,100,115,98,108,101,110,100,101,114,0,110,117,109,115,111,117,110,100, -115,103,97,109,101,101,110,103,105,110,101,0,42,108,97,109,112,114,101,110,0,103,111,98,106,101,99,116,0,100,117,112, -108,105,95,111,102,115,91,51,93,0,99,104,105,108,100,98,97,115,101,0,114,111,108,108,0,104,101,97,100,91,51,93, -0,116,97,105,108,91,51,93,0,98,111,110,101,95,109,97,116,91,51,93,91,51,93,0,97,114,109,95,104,101,97,100, -91,51,93,0,97,114,109,95,116,97,105,108,91,51,93,0,97,114,109,95,109,97,116,91,52,93,91,52,93,0,120,119, -105,100,116,104,0,122,119,105,100,116,104,0,101,97,115,101,49,0,101,97,115,101,50,0,114,97,100,95,104,101,97,100, -0,114,97,100,95,116,97,105,108,0,98,111,110,101,98,97,115,101,0,99,104,97,105,110,98,97,115,101,0,112,97,116, -104,102,108,97,103,0,108,97,121,101,114,95,112,114,111,116,101,99,116,101,100,0,103,104,111,115,116,101,112,0,103,104, -111,115,116,115,105,122,101,0,103,104,111,115,116,116,121,112,101,0,112,97,116,104,115,105,122,101,0,103,104,111,115,116, -115,102,0,103,104,111,115,116,101,102,0,112,97,116,104,115,102,0,112,97,116,104,101,102,0,112,97,116,104,98,99,0, -112,97,116,104,97,99,0,99,111,110,115,116,102,108,97,103,0,105,107,102,108,97,103,0,115,101,108,101,99,116,102,108, -97,103,0,97,103,114,112,95,105,110,100,101,120,0,42,98,111,110,101,0,42,99,104,105,108,100,0,105,107,116,114,101, -101,0,42,98,95,98,111,110,101,95,109,97,116,115,0,42,100,117,97,108,95,113,117,97,116,0,42,98,95,98,111,110, -101,95,100,117,97,108,95,113,117,97,116,115,0,99,104,97,110,95,109,97,116,91,52,93,91,52,93,0,112,111,115,101, -95,109,97,116,91,52,93,91,52,93,0,112,111,115,101,95,104,101,97,100,91,51,93,0,112,111,115,101,95,116,97,105, -108,91,51,93,0,108,105,109,105,116,109,105,110,91,51,93,0,108,105,109,105,116,109,97,120,91,51,93,0,115,116,105, -102,102,110,101,115,115,91,51,93,0,105,107,115,116,114,101,116,99,104,0,42,99,117,115,116,111,109,0,99,104,97,110, -98,97,115,101,0,112,114,111,120,121,95,108,97,121,101,114,0,115,116,114,105,100,101,95,111,102,102,115,101,116,91,51, -93,0,99,121,99,108,105,99,95,111,102,102,115,101,116,91,51,93,0,97,103,114,111,117,112,115,0,97,99,116,105,118, -101,95,103,114,111,117,112,0,99,117,115,116,111,109,67,111,108,0,99,115,0,42,103,114,112,0,114,101,115,101,114,118, -101,100,49,0,103,114,111,117,112,115,0,97,99,116,105,118,101,95,109,97,114,107,101,114,0,97,99,116,110,114,0,97, -99,116,119,105,100,116,104,0,116,105,109,101,115,108,105,100,101,0,110,97,109,101,91,51,48,93,0,111,119,110,115,112, -97,99,101,0,116,97,114,115,112,97,99,101,0,101,110,102,111,114,99,101,0,104,101,97,100,116,97,105,108,0,42,116, -97,114,0,115,117,98,116,97,114,103,101,116,91,51,50,93,0,109,97,116,114,105,120,91,52,93,91,52,93,0,115,112, -97,99,101,0,42,112,114,111,112,0,116,97,114,110,117,109,0,116,97,114,103,101,116,115,0,105,116,101,114,97,116,105, -111,110,115,0,114,111,111,116,98,111,110,101,0,109,97,120,95,114,111,111,116,98,111,110,101,0,42,112,111,108,101,116, -97,114,0,112,111,108,101,115,117,98,116,97,114,103,101,116,91,51,50,93,0,112,111,108,101,97,110,103,108,101,0,111, -114,105,101,110,116,119,101,105,103,104,116,0,103,114,97,98,116,97,114,103,101,116,91,51,93,0,114,101,115,101,114,118, -101,100,50,0,109,105,110,109,97,120,102,108,97,103,0,115,116,117,99,107,0,99,97,99,104,101,91,51,93,0,108,111, -99,107,102,108,97,103,0,102,111,108,108,111,119,102,108,97,103,0,118,111,108,109,111,100,101,0,112,108,97,110,101,0, -111,114,103,108,101,110,103,116,104,0,98,117,108,103,101,0,112,105,118,88,0,112,105,118,89,0,112,105,118,90,0,97, -120,88,0,97,120,89,0,97,120,90,0,109,105,110,76,105,109,105,116,91,54,93,0,109,97,120,76,105,109,105,116,91, -54,93,0,101,120,116,114,97,70,122,0,105,110,118,109,97,116,91,52,93,91,52,93,0,102,114,111,109,0,116,111,0, -109,97,112,91,51,93,0,101,120,112,111,0,102,114,111,109,95,109,105,110,91,51,93,0,102,114,111,109,95,109,97,120, -91,51,93,0,116,111,95,109,105,110,91,51,93,0,116,111,95,109,97,120,91,51,93,0,122,109,105,110,0,122,109,97, -120,0,112,97,100,91,57,93,0,99,104,97,110,110,101,108,91,51,50,93,0,110,111,95,114,111,116,95,97,120,105,115, -0,115,116,114,105,100,101,95,97,120,105,115,0,99,117,114,109,111,100,0,97,99,116,115,116,97,114,116,0,97,99,116, -101,110,100,0,97,99,116,111,102,102,115,0,115,116,114,105,100,101,108,101,110,0,98,108,101,110,100,111,117,116,0,115, -116,114,105,100,101,99,104,97,110,110,101,108,91,51,50,93,0,111,102,102,115,95,98,111,110,101,91,51,50,93,0,104, -97,115,105,110,112,117,116,0,104,97,115,111,117,116,112,117,116,0,100,97,116,97,116,121,112,101,0,115,111,99,107,101, -116,116,121,112,101,0,42,110,101,119,95,115,111,99,107,0,110,115,0,108,105,109,105,116,0,115,116,97,99,107,95,105, -110,100,101,120,0,105,110,116,101,114,110,0,115,116,97,99,107,95,105,110,100,101,120,95,101,120,116,0,108,111,99,120, -0,108,111,99,121,0,111,119,110,95,105,110,100,101,120,0,116,111,95,105,110,100,101,120,0,42,116,111,115,111,99,107, -0,42,108,105,110,107,0,42,110,101,119,95,110,111,100,101,0,117,115,101,114,110,97,109,101,91,51,50,93,0,108,97, -115,116,121,0,111,117,116,112,117,116,115,0,42,115,116,111,114,97,103,101,0,109,105,110,105,119,105,100,116,104,0,99, -117,115,116,111,109,49,0,99,117,115,116,111,109,50,0,99,117,115,116,111,109,51,0,99,117,115,116,111,109,52,0,110, -101,101,100,95,101,120,101,99,0,101,120,101,99,0,116,111,116,114,0,98,117,116,114,0,112,114,118,114,0,42,116,121, -112,101,105,110,102,111,0,42,102,114,111,109,110,111,100,101,0,42,116,111,110,111,100,101,0,42,102,114,111,109,115,111, -99,107,0,110,111,100,101,115,0,108,105,110,107,115,0,42,115,116,97,99,107,0,42,116,104,114,101,97,100,115,116,97, -99,107,0,105,110,105,116,0,115,116,97,99,107,115,105,122,101,0,99,117,114,95,105,110,100,101,120,0,97,108,108,116, -121,112,101,115,0,42,111,119,110,116,121,112,101,0,42,115,101,108,105,110,0,42,115,101,108,111,117,116,0,40,42,116, -105,109,101,99,117,114,115,111,114,41,40,41,0,40,42,115,116,97,116,115,95,100,114,97,119,41,40,41,0,40,42,116, -101,115,116,95,98,114,101,97,107,41,40,41,0,99,121,99,108,105,99,0,109,111,118,105,101,0,115,97,109,112,108,101, -115,0,109,105,110,115,112,101,101,100,0,112,101,114,99,101,110,116,120,0,112,101,114,99,101,110,116,121,0,98,111,107, -101,104,0,99,117,114,118,101,100,0,105,109,97,103,101,95,105,110,95,119,105,100,116,104,0,105,109,97,103,101,95,105, -110,95,104,101,105,103,104,116,0,99,101,110,116,101,114,95,120,0,99,101,110,116,101,114,95,121,0,115,112,105,110,0, -105,116,101,114,0,119,114,97,112,0,115,105,103,109,97,95,99,111,108,111,114,0,115,105,103,109,97,95,115,112,97,99, -101,0,104,117,101,0,115,97,116,0,116,49,0,116,50,0,116,51,0,102,115,116,114,101,110,103,116,104,0,102,97,108, -112,104,97,0,107,101,121,91,52,93,0,120,49,0,120,50,0,121,49,0,121,50,0,99,111,108,110,97,109,101,91,51, -50,93,0,98,107,116,121,112,101,0,114,111,116,97,116,105,111,110,0,112,114,101,118,105,101,119,0,103,97,109,99,111, -0,110,111,95,122,98,117,102,0,102,115,116,111,112,0,109,97,120,98,108,117,114,0,98,116,104,114,101,115,104,0,42, -100,105,99,116,0,42,110,111,100,101,0,97,110,103,108,101,95,111,102,115,0,99,111,108,109,111,100,0,109,105,120,0, -116,104,114,101,115,104,111,108,100,0,102,97,100,101,0,109,0,99,0,106,105,116,0,112,114,111,106,0,102,105,116,0, -115,104,111,114,116,121,0,109,105,110,116,97,98,108,101,0,109,97,120,116,97,98,108,101,0,101,120,116,95,105,110,91, -50,93,0,101,120,116,95,111,117,116,91,50,93,0,42,99,117,114,118,101,0,42,116,97,98,108,101,0,42,112,114,101, -109,117,108,116,97,98,108,101,0,99,117,114,114,0,99,108,105,112,114,0,99,109,91,52,93,0,98,108,97,99,107,91, -51,93,0,119,104,105,116,101,91,51,93,0,98,119,109,117,108,91,51,93,0,115,97,109,112,108,101,91,51,93,0,111, -102,102,115,101,116,91,50,93,0,105,110,110,101,114,114,97,100,105,117,115,0,114,97,116,101,0,114,103,98,91,51,93, -0,99,108,111,110,101,0,97,99,116,105,118,101,95,114,110,100,0,97,99,116,105,118,101,95,99,108,111,110,101,0,97, -99,116,105,118,101,95,109,97,115,107,0,42,108,97,121,101,114,115,0,116,111,116,108,97,121,101,114,0,109,97,120,108, -97,121,101,114,0,116,111,116,115,105,122,101,0,42,112,111,111,108,0,101,100,105,116,102,108,97,103,0,118,101,108,91, -51,93,0,114,111,116,91,52,93,0,97,118,101,91,51,93,0,110,117,109,0,112,97,114,101,110,116,0,112,97,91,52, -93,0,119,91,52,93,0,102,117,118,91,52,93,0,102,111,102,102,115,101,116,0,114,97,110,100,91,51,93,0,42,115, -116,105,99,107,95,111,98,0,112,114,101,118,95,115,116,97,116,101,0,42,104,97,105,114,0,105,95,114,111,116,91,52, -93,0,114,95,114,111,116,91,52,93,0,114,95,97,118,101,91,51,93,0,114,95,118,101,91,51,93,0,100,105,101,116, -105,109,101,0,98,97,110,107,0,115,105,122,101,109,117,108,0,110,117,109,95,100,109,99,97,99,104,101,0,98,112,105, -0,97,108,105,118,101,0,108,111,111,112,0,100,105,115,116,114,0,112,104,121,115,116,121,112,101,0,114,111,116,109,111, -100,101,0,97,118,101,109,111,100,101,0,114,101,97,99,116,101,118,101,110,116,0,100,114,97,119,0,100,114,97,119,95, -97,115,0,100,114,97,119,95,115,105,122,101,0,99,104,105,108,100,116,121,112,101,0,100,114,97,119,95,115,116,101,112, -0,114,101,110,95,115,116,101,112,0,104,97,105,114,95,115,116,101,112,0,107,101,121,115,95,115,116,101,112,0,97,100, -97,112,116,95,97,110,103,108,101,0,97,100,97,112,116,95,112,105,120,0,114,111,116,102,114,111,109,0,105,110,116,101, -103,114,97,116,111,114,0,110,98,101,116,119,101,101,110,0,98,111,105,100,110,101,105,103,104,98,111,117,114,115,0,98, -98,95,97,108,105,103,110,0,98,98,95,117,118,95,115,112,108,105,116,0,98,98,95,97,110,105,109,0,98,98,95,115, -112,108,105,116,95,111,102,102,115,101,116,0,98,98,95,116,105,108,116,0,98,98,95,114,97,110,100,95,116,105,108,116, -0,98,98,95,111,102,102,115,101,116,91,50,93,0,115,105,109,112,108,105,102,121,95,102,108,97,103,0,115,105,109,112, -108,105,102,121,95,114,101,102,115,105,122,101,0,115,105,109,112,108,105,102,121,95,114,97,116,101,0,115,105,109,112,108, -105,102,121,95,116,114,97,110,115,105,116,105,111,110,0,115,105,109,112,108,105,102,121,95,118,105,101,119,112,111,114,116, -0,116,105,109,101,116,119,101,97,107,0,106,105,116,102,97,99,0,107,101,121,101,100,95,116,105,109,101,0,101,102,102, -95,104,97,105,114,0,103,114,105,100,95,114,101,115,0,112,97,114,116,102,97,99,0,116,97,110,102,97,99,0,116,97, -110,112,104,97,115,101,0,114,101,97,99,116,102,97,99,0,97,118,101,102,97,99,0,112,104,97,115,101,102,97,99,0, -114,97,110,100,114,111,116,102,97,99,0,114,97,110,100,112,104,97,115,101,102,97,99,0,114,97,110,100,115,105,122,101, -0,114,101,97,99,116,115,104,97,112,101,0,97,99,99,91,51,93,0,100,114,97,103,102,97,99,0,98,114,111,119,110, -102,97,99,0,100,97,109,112,102,97,99,0,97,98,115,108,101,110,103,116,104,0,114,97,110,100,108,101,110,103,116,104, -0,99,104,105,108,100,95,110,98,114,0,114,101,110,95,99,104,105,108,100,95,110,98,114,0,112,97,114,101,110,116,115, -0,99,104,105,108,100,115,105,122,101,0,99,104,105,108,100,114,97,110,100,115,105,122,101,0,99,104,105,108,100,114,97, -100,0,99,104,105,108,100,102,108,97,116,0,99,104,105,108,100,115,112,114,101,97,100,0,99,108,117,109,112,102,97,99, -0,99,108,117,109,112,112,111,119,0,114,111,117,103,104,49,0,114,111,117,103,104,49,95,115,105,122,101,0,114,111,117, -103,104,50,0,114,111,117,103,104,50,95,115,105,122,101,0,114,111,117,103,104,50,95,116,104,114,101,115,0,114,111,117, -103,104,95,101,110,100,0,114,111,117,103,104,95,101,110,100,95,115,104,97,112,101,0,98,114,97,110,99,104,95,116,104, -114,101,115,0,100,114,97,119,95,108,105,110,101,91,50,93,0,109,97,120,95,108,97,116,95,97,99,99,0,109,97,120, -95,116,97,110,95,97,99,99,0,97,118,101,114,97,103,101,95,118,101,108,0,98,97,110,107,105,110,103,0,109,97,120, -95,98,97,110,107,0,103,114,111,117,110,100,122,0,98,111,105,100,102,97,99,91,56,93,0,98,111,105,100,114,117,108, -101,91,56,93,0,42,101,102,102,95,103,114,111,117,112,0,42,100,117,112,95,111,98,0,42,98,98,95,111,98,0,42, -112,100,50,0,42,112,97,114,116,0,42,101,100,105,116,0,42,42,112,97,116,104,99,97,99,104,101,0,42,42,99,104, -105,108,100,99,97,99,104,101,0,112,97,116,104,99,97,99,104,101,98,117,102,115,0,99,104,105,108,100,99,97,99,104, -101,98,117,102,115,0,42,116,97,114,103,101,116,95,111,98,0,42,107,101,121,101,100,95,111,98,0,42,108,97,116,116, -105,99,101,0,101,102,102,101,99,116,111,114,115,0,114,101,97,99,116,101,118,101,110,116,115,0,116,111,116,99,104,105, -108,100,0,116,111,116,99,97,99,104,101,100,0,116,111,116,99,104,105,108,100,99,97,99,104,101,0,116,97,114,103,101, -116,95,112,115,121,115,0,107,101,121,101,100,95,112,115,121,115,0,116,111,116,107,101,121,101,100,0,98,97,107,101,115, -112,97,99,101,0,98,98,95,117,118,110,97,109,101,91,51,93,91,51,50,93,0,118,103,114,111,117,112,91,49,50,93, -0,118,103,95,110,101,103,0,114,116,51,0,42,114,101,110,100,101,114,100,97,116,97,0,42,99,97,99,104,101,0,67, -100,105,115,0,67,118,105,0,91,51,93,0,115,116,114,117,99,116,117,114,97,108,0,98,101,110,100,105,110,103,0,109, -97,120,95,98,101,110,100,0,109,97,120,95,115,116,114,117,99,116,0,109,97,120,95,115,104,101,97,114,0,97,118,103, -95,115,112,114,105,110,103,95,108,101,110,0,116,105,109,101,115,99,97,108,101,0,101,102,102,95,102,111,114,99,101,95, -115,99,97,108,101,0,101,102,102,95,119,105,110,100,95,115,99,97,108,101,0,115,105,109,95,116,105,109,101,95,111,108, -100,0,115,116,101,112,115,80,101,114,70,114,97,109,101,0,112,114,101,114,111,108,108,0,109,97,120,115,112,114,105,110, -103,108,101,110,0,115,111,108,118,101,114,95,116,121,112,101,0,118,103,114,111,117,112,95,98,101,110,100,0,118,103,114, -111,117,112,95,109,97,115,115,0,118,103,114,111,117,112,95,115,116,114,117,99,116,0,112,114,101,115,101,116,115,0,42, -99,111,108,108,105,115,105,111,110,95,108,105,115,116,0,101,112,115,105,108,111,110,0,115,101,108,102,95,102,114,105,99, -116,105,111,110,0,115,101,108,102,101,112,115,105,108,111,110,0,115,101,108,102,95,108,111,111,112,95,99,111,117,110,116, -0,108,111,111,112,95,99,111,117,110,116,0,112,114,101,115,115,117,114,101,0,42,112,111,105,110,116,115,0,116,111,116, -112,111,105,110,116,115,0,116,104,105,99,107,110,101,115,115,0,115,116,114,111,107,101,115,0,102,114,97,109,101,110,117, -109,0,42,97,99,116,102,114,97,109,101,0,103,115,116,101,112,0,105,110,102,111,91,49,50,56,93,0,115,98,117,102, -102,101,114,95,115,105,122,101,0,115,98,117,102,102,101,114,95,115,102,108,97,103,0,42,115,98,117,102,102,101,114,0, -0,0,0,84,89,80,69,100,1,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104,111, -114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118, -111,105,100,0,76,105,110,107,0,76,105,110,107,68,97,116,97,0,76,105,115,116,66,97,115,101,0,118,101,99,50,115, -0,118,101,99,50,105,0,118,101,99,50,102,0,118,101,99,50,100,0,118,101,99,51,105,0,118,101,99,51,102,0,118, -101,99,51,100,0,118,101,99,52,105,0,118,101,99,52,102,0,118,101,99,52,100,0,114,99,116,105,0,114,99,116,102, -0,73,68,80,114,111,112,101,114,116,121,68,97,116,97,0,73,68,80,114,111,112,101,114,116,121,0,73,68,0,76,105, -98,114,97,114,121,0,70,105,108,101,68,97,116,97,0,80,114,101,118,105,101,119,73,109,97,103,101,0,73,112,111,68, -114,105,118,101,114,0,79,98,106,101,99,116,0,73,112,111,67,117,114,118,101,0,66,80,111,105,110,116,0,66,101,122, -84,114,105,112,108,101,0,73,112,111,0,75,101,121,66,108,111,99,107,0,75,101,121,0,83,99,114,105,112,116,76,105, -110,107,0,84,101,120,116,76,105,110,101,0,84,101,120,116,77,97,114,107,101,114,0,84,101,120,116,0,80,97,99,107, -101,100,70,105,108,101,0,67,97,109,101,114,97,0,73,109,97,103,101,85,115,101,114,0,73,109,97,103,101,0,71,80, -85,84,101,120,116,117,114,101,0,97,110,105,109,0,82,101,110,100,101,114,82,101,115,117,108,116,0,77,84,101,120,0, -84,101,120,0,80,108,117,103,105,110,84,101,120,0,67,66,68,97,116,97,0,67,111,108,111,114,66,97,110,100,0,69, -110,118,77,97,112,0,73,109,66,117,102,0,98,78,111,100,101,84,114,101,101,0,84,101,120,77,97,112,112,105,110,103, -0,76,97,109,112,0,67,117,114,118,101,77,97,112,112,105,110,103,0,87,97,118,101,0,77,97,116,101,114,105,97,108, -0,71,114,111,117,112,0,86,70,111,110,116,0,86,70,111,110,116,68,97,116,97,0,77,101,116,97,69,108,101,109,0, -66,111,117,110,100,66,111,120,0,77,101,116,97,66,97,108,108,0,78,117,114,98,0,67,104,97,114,73,110,102,111,0, -84,101,120,116,66,111,120,0,67,117,114,118,101,0,80,97,116,104,0,77,101,115,104,0,77,70,97,99,101,0,77,84, -70,97,99,101,0,84,70,97,99,101,0,77,86,101,114,116,0,77,69,100,103,101,0,77,68,101,102,111,114,109,86,101, -114,116,0,77,67,111,108,0,77,83,116,105,99,107,121,0,77,83,101,108,101,99,116,0,67,117,115,116,111,109,68,97, -116,97,0,77,117,108,116,105,114,101,115,0,80,97,114,116,105,97,108,86,105,115,105,98,105,108,105,116,121,0,77,68, -101,102,111,114,109,87,101,105,103,104,116,0,77,84,101,120,80,111,108,121,0,77,76,111,111,112,85,86,0,77,76,111, -111,112,67,111,108,0,77,70,108,111,97,116,80,114,111,112,101,114,116,121,0,77,73,110,116,80,114,111,112,101,114,116, -121,0,77,83,116,114,105,110,103,80,114,111,112,101,114,116,121,0,79,114,105,103,83,112,97,99,101,70,97,99,101,0, -77,117,108,116,105,114,101,115,67,111,108,0,77,117,108,116,105,114,101,115,67,111,108,70,97,99,101,0,77,117,108,116, -105,114,101,115,70,97,99,101,0,77,117,108,116,105,114,101,115,69,100,103,101,0,77,117,108,116,105,114,101,115,76,101, -118,101,108,0,77,117,108,116,105,114,101,115,77,97,112,78,111,100,101,0,77,111,100,105,102,105,101,114,68,97,116,97, -0,83,117,98,115,117,114,102,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,77,111,100,105, -102,105,101,114,68,97,116,97,0,67,117,114,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,66,117,105,108,100, -77,111,100,105,102,105,101,114,68,97,116,97,0,77,97,115,107,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114, -114,97,121,77,111,100,105,102,105,101,114,68,97,116,97,0,77,105,114,114,111,114,77,111,100,105,102,105,101,114,68,97, -116,97,0,69,100,103,101,83,112,108,105,116,77,111,100,105,102,105,101,114,68,97,116,97,0,66,101,118,101,108,77,111, -100,105,102,105,101,114,68,97,116,97,0,66,77,101,115,104,77,111,100,105,102,105,101,114,68,97,116,97,0,68,105,115, -112,108,97,99,101,77,111,100,105,102,105,101,114,68,97,116,97,0,85,86,80,114,111,106,101,99,116,77,111,100,105,102, -105,101,114,68,97,116,97,0,68,101,99,105,109,97,116,101,77,111,100,105,102,105,101,114,68,97,116,97,0,83,109,111, -111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67,97,115,116,77,111,100,105,102,105,101,114,68,97,116,97, -0,87,97,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114,109,97,116,117,114,101,77,111,100,105,102,105, -101,114,68,97,116,97,0,72,111,111,107,77,111,100,105,102,105,101,114,68,97,116,97,0,83,111,102,116,98,111,100,121, -77,111,100,105,102,105,101,114,68,97,116,97,0,67,108,111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67, -108,111,116,104,0,67,108,111,116,104,83,105,109,83,101,116,116,105,110,103,115,0,67,108,111,116,104,67,111,108,108,83, -101,116,116,105,110,103,115,0,80,111,105,110,116,67,97,99,104,101,0,67,111,108,108,105,115,105,111,110,77,111,100,105, -102,105,101,114,68,97,116,97,0,66,86,72,84,114,101,101,0,83,117,114,102,97,99,101,77,111,100,105,102,105,101,114, -68,97,116,97,0,68,101,114,105,118,101,100,77,101,115,104,0,66,86,72,84,114,101,101,70,114,111,109,77,101,115,104, -0,66,111,111,108,101,97,110,77,111,100,105,102,105,101,114,68,97,116,97,0,77,68,101,102,73,110,102,108,117,101,110, -99,101,0,77,68,101,102,67,101,108,108,0,77,101,115,104,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97, -116,97,0,80,97,114,116,105,99,108,101,83,121,115,116,101,109,77,111,100,105,102,105,101,114,68,97,116,97,0,80,97, -114,116,105,99,108,101,83,121,115,116,101,109,0,80,97,114,116,105,99,108,101,73,110,115,116,97,110,99,101,77,111,100, -105,102,105,101,114,68,97,116,97,0,69,120,112,108,111,100,101,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108, -117,105,100,115,105,109,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108,117,105,100,115,105,109,83,101,116,116,105, -110,103,115,0,83,104,114,105,110,107,119,114,97,112,77,111,100,105,102,105,101,114,68,97,116,97,0,83,105,109,112,108, -101,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,0,98,68,101,102, -111,114,109,71,114,111,117,112,0,98,65,99,116,105,111,110,0,98,80,111,115,101,0,66,117,108,108,101,116,83,111,102, -116,66,111,100,121,0,80,97,114,116,68,101,102,108,101,99,116,0,83,111,102,116,66,111,100,121,0,79,98,72,111,111, -107,0,82,78,71,0,83,66,86,101,114,116,101,120,0,66,111,100,121,80,111,105,110,116,0,66,111,100,121,83,112,114, -105,110,103,0,83,66,83,99,114,97,116,99,104,0,87,111,114,108,100,0,82,97,100,105,111,0,66,97,115,101,0,65, -118,105,67,111,100,101,99,68,97,116,97,0,81,117,105,99,107,116,105,109,101,67,111,100,101,99,68,97,116,97,0,70, -70,77,112,101,103,67,111,100,101,99,68,97,116,97,0,65,117,100,105,111,68,97,116,97,0,83,99,101,110,101,82,101, -110,100,101,114,76,97,121,101,114,0,82,101,110,100,101,114,68,97,116,97,0,82,101,110,100,101,114,80,114,111,102,105, -108,101,0,71,97,109,101,70,114,97,109,105,110,103,0,84,105,109,101,77,97,114,107,101,114,0,73,109,97,103,101,80, -97,105,110,116,83,101,116,116,105,110,103,115,0,66,114,117,115,104,0,80,97,114,116,105,99,108,101,66,114,117,115,104, -68,97,116,97,0,80,97,114,116,105,99,108,101,69,100,105,116,83,101,116,116,105,110,103,115,0,84,114,97,110,115,102, -111,114,109,79,114,105,101,110,116,97,116,105,111,110,0,84,111,111,108,83,101,116,116,105,110,103,115,0,66,114,117,115, -104,68,97,116,97,0,83,99,117,108,112,116,68,97,116,97,0,83,99,117,108,112,116,83,101,115,115,105,111,110,0,83, -99,101,110,101,0,68,97,103,70,111,114,101,115,116,0,66,71,112,105,99,0,86,105,101,119,51,68,0,83,112,97,99, -101,76,105,110,107,0,83,99,114,65,114,101,97,0,82,101,110,100,101,114,73,110,102,111,0,82,101,116,111,112,111,86, -105,101,119,68,97,116,97,0,86,105,101,119,68,101,112,116,104,115,0,98,71,80,100,97,116,97,0,86,105,101,119,50, -68,0,83,112,97,99,101,73,110,102,111,0,83,112,97,99,101,73,112,111,0,83,112,97,99,101,66,117,116,115,0,83, -112,97,99,101,83,101,113,0,83,112,97,99,101,70,105,108,101,0,100,105,114,101,110,116,114,121,0,66,108,101,110,100, -72,97,110,100,108,101,0,83,112,97,99,101,79,111,112,115,0,84,114,101,101,83,116,111,114,101,0,84,114,101,101,83, -116,111,114,101,69,108,101,109,0,83,112,97,99,101,73,109,97,103,101,0,83,112,97,99,101,78,108,97,0,83,112,97, -99,101,84,101,120,116,0,83,99,114,105,112,116,0,83,112,97,99,101,83,99,114,105,112,116,0,83,112,97,99,101,84, -105,109,101,0,83,112,97,99,101,78,111,100,101,0,83,112,97,99,101,73,109,97,83,101,108,0,70,105,108,101,76,105, -115,116,0,84,104,101,109,101,85,73,0,84,104,101,109,101,83,112,97,99,101,0,84,104,101,109,101,87,105,114,101,67, -111,108,111,114,0,98,84,104,101,109,101,0,83,111,108,105,100,76,105,103,104,116,0,85,115,101,114,68,101,102,0,98, -83,99,114,101,101,110,0,83,99,114,86,101,114,116,0,83,99,114,69,100,103,101,0,80,97,110,101,108,0,70,105,108, -101,71,108,111,98,97,108,0,83,116,114,105,112,69,108,101,109,0,84,83,116,114,105,112,69,108,101,109,0,83,116,114, -105,112,67,114,111,112,0,83,116,114,105,112,84,114,97,110,115,102,111,114,109,0,83,116,114,105,112,67,111,108,111,114, -66,97,108,97,110,99,101,0,83,116,114,105,112,67,111,108,111,114,66,97,108,97,110,99,101,71,85,73,72,101,108,112, -101,114,0,83,116,114,105,112,80,114,111,120,121,0,83,116,114,105,112,0,80,108,117,103,105,110,83,101,113,0,83,101, -113,117,101,110,99,101,0,98,83,111,117,110,100,0,104,100,97,117,100,105,111,0,77,101,116,97,83,116,97,99,107,0, -69,100,105,116,105,110,103,0,87,105,112,101,86,97,114,115,0,71,108,111,119,86,97,114,115,0,84,114,97,110,115,102, -111,114,109,86,97,114,115,0,83,111,108,105,100,67,111,108,111,114,86,97,114,115,0,83,112,101,101,100,67,111,110,116, -114,111,108,86,97,114,115,0,69,102,102,101,99,116,0,66,117,105,108,100,69,102,102,0,80,97,114,116,69,102,102,0, -80,97,114,116,105,99,108,101,0,87,97,118,101,69,102,102,0,79,111,112,115,0,98,80,114,111,112,101,114,116,121,0, -98,78,101,97,114,83,101,110,115,111,114,0,98,77,111,117,115,101,83,101,110,115,111,114,0,98,84,111,117,99,104,83, -101,110,115,111,114,0,98,75,101,121,98,111,97,114,100,83,101,110,115,111,114,0,98,80,114,111,112,101,114,116,121,83, -101,110,115,111,114,0,98,65,99,116,117,97,116,111,114,83,101,110,115,111,114,0,98,68,101,108,97,121,83,101,110,115, -111,114,0,98,67,111,108,108,105,115,105,111,110,83,101,110,115,111,114,0,98,82,97,100,97,114,83,101,110,115,111,114, -0,98,82,97,110,100,111,109,83,101,110,115,111,114,0,98,82,97,121,83,101,110,115,111,114,0,98,77,101,115,115,97, -103,101,83,101,110,115,111,114,0,98,83,101,110,115,111,114,0,98,67,111,110,116,114,111,108,108,101,114,0,98,74,111, -121,115,116,105,99,107,83,101,110,115,111,114,0,98,69,120,112,114,101,115,115,105,111,110,67,111,110,116,0,98,80,121, -116,104,111,110,67,111,110,116,0,98,65,99,116,117,97,116,111,114,0,98,65,100,100,79,98,106,101,99,116,65,99,116, -117,97,116,111,114,0,98,65,99,116,105,111,110,65,99,116,117,97,116,111,114,0,98,83,111,117,110,100,65,99,116,117, -97,116,111,114,0,98,67,68,65,99,116,117,97,116,111,114,0,98,69,100,105,116,79,98,106,101,99,116,65,99,116,117, -97,116,111,114,0,98,83,99,101,110,101,65,99,116,117,97,116,111,114,0,98,80,114,111,112,101,114,116,121,65,99,116, -117,97,116,111,114,0,98,79,98,106,101,99,116,65,99,116,117,97,116,111,114,0,98,73,112,111,65,99,116,117,97,116, -111,114,0,98,67,97,109,101,114,97,65,99,116,117,97,116,111,114,0,98,67,111,110,115,116,114,97,105,110,116,65,99, -116,117,97,116,111,114,0,98,71,114,111,117,112,65,99,116,117,97,116,111,114,0,98,82,97,110,100,111,109,65,99,116, -117,97,116,111,114,0,98,77,101,115,115,97,103,101,65,99,116,117,97,116,111,114,0,98,71,97,109,101,65,99,116,117, -97,116,111,114,0,98,86,105,115,105,98,105,108,105,116,121,65,99,116,117,97,116,111,114,0,98,84,119,111,68,70,105, -108,116,101,114,65,99,116,117,97,116,111,114,0,98,80,97,114,101,110,116,65,99,116,117,97,116,111,114,0,98,83,116, -97,116,101,65,99,116,117,97,116,111,114,0,70,114,101,101,67,97,109,101,114,97,0,98,83,97,109,112,108,101,0,98, -83,111,117,110,100,76,105,115,116,101,110,101,114,0,83,112,97,99,101,83,111,117,110,100,0,71,114,111,117,112,79,98, -106,101,99,116,0,66,111,110,101,0,98,65,114,109,97,116,117,114,101,0,98,80,111,115,101,67,104,97,110,110,101,108, -0,98,65,99,116,105,111,110,71,114,111,117,112,0,98,65,99,116,105,111,110,67,104,97,110,110,101,108,0,83,112,97, -99,101,65,99,116,105,111,110,0,98,67,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,0,98,67,111,110, -115,116,114,97,105,110,116,0,98,67,111,110,115,116,114,97,105,110,116,84,97,114,103,101,116,0,98,80,121,116,104,111, -110,67,111,110,115,116,114,97,105,110,116,0,98,75,105,110,101,109,97,116,105,99,67,111,110,115,116,114,97,105,110,116, -0,98,84,114,97,99,107,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,111,116,97,116,101,76,105,107,101,67, -111,110,115,116,114,97,105,110,116,0,98,76,111,99,97,116,101,76,105,107,101,67,111,110,115,116,114,97,105,110,116,0, -98,77,105,110,77,97,120,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,107,101,67,111,110,115,116, -114,97,105,110,116,0,98,65,99,116,105,111,110,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,107,84,114,97, -99,107,67,111,110,115,116,114,97,105,110,116,0,98,70,111,108,108,111,119,80,97,116,104,67,111,110,115,116,114,97,105, -110,116,0,98,83,116,114,101,116,99,104,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,105,103,105,100,66,111, -100,121,74,111,105,110,116,67,111,110,115,116,114,97,105,110,116,0,98,67,108,97,109,112,84,111,67,111,110,115,116,114, -97,105,110,116,0,98,67,104,105,108,100,79,102,67,111,110,115,116,114,97,105,110,116,0,98,84,114,97,110,115,102,111, -114,109,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116, -0,98,82,111,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,109,105,116,67, -111,110,115,116,114,97,105,110,116,0,98,68,105,115,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98, -83,104,114,105,110,107,119,114,97,112,67,111,110,115,116,114,97,105,110,116,0,98,65,99,116,105,111,110,77,111,100,105, -102,105,101,114,0,98,65,99,116,105,111,110,83,116,114,105,112,0,98,78,111,100,101,83,116,97,99,107,0,98,78,111, -100,101,83,111,99,107,101,116,0,98,78,111,100,101,76,105,110,107,0,98,78,111,100,101,0,98,78,111,100,101,80,114, -101,118,105,101,119,0,98,78,111,100,101,84,121,112,101,0,78,111,100,101,73,109,97,103,101,65,110,105,109,0,78,111, -100,101,66,108,117,114,68,97,116,97,0,78,111,100,101,68,66,108,117,114,68,97,116,97,0,78,111,100,101,66,105,108, -97,116,101,114,97,108,66,108,117,114,68,97,116,97,0,78,111,100,101,72,117,101,83,97,116,0,78,111,100,101,73,109, -97,103,101,70,105,108,101,0,78,111,100,101,67,104,114,111,109,97,0,78,111,100,101,84,119,111,88,89,115,0,78,111, -100,101,84,119,111,70,108,111,97,116,115,0,78,111,100,101,71,101,111,109,101,116,114,121,0,78,111,100,101,86,101,114, -116,101,120,67,111,108,0,78,111,100,101,68,101,102,111,99,117,115,0,78,111,100,101,83,99,114,105,112,116,68,105,99, -116,0,78,111,100,101,71,108,97,114,101,0,78,111,100,101,84,111,110,101,109,97,112,0,78,111,100,101,76,101,110,115, -68,105,115,116,0,84,101,120,78,111,100,101,79,117,116,112,117,116,0,67,117,114,118,101,77,97,112,80,111,105,110,116, -0,67,117,114,118,101,77,97,112,0,66,114,117,115,104,67,108,111,110,101,0,67,117,115,116,111,109,68,97,116,97,76, -97,121,101,114,0,72,97,105,114,75,101,121,0,80,97,114,116,105,99,108,101,75,101,121,0,67,104,105,108,100,80,97, -114,116,105,99,108,101,0,80,97,114,116,105,99,108,101,68,97,116,97,0,80,97,114,116,105,99,108,101,83,101,116,116, -105,110,103,115,0,80,97,114,116,105,99,108,101,69,100,105,116,0,80,97,114,116,105,99,108,101,67,97,99,104,101,75, -101,121,0,76,105,110,107,78,111,100,101,0,98,71,80,68,115,112,111,105,110,116,0,98,71,80,68,115,116,114,111,107, -101,0,98,71,80,68,102,114,97,109,101,0,98,71,80,68,108,97,121,101,114,0,0,84,76,69,78,1,0,1,0,2, -0,2,0,4,0,4,0,4,0,4,0,8,0,0,0,16,0,24,0,16,0,4,0,8,0,8,0,16,0,12,0,12, -0,24,0,16,0,16,0,32,0,16,0,16,0,32,0,96,0,72,0,72,2,0,0,40,0,-112,0,48,4,112,0,36, -0,56,0,112,0,-128,0,-96,0,24,0,40,0,48,0,-80,0,24,0,-88,0,32,0,-72,1,0,0,0,0,0,0,-112, -0,64,1,120,1,24,0,8,3,-56,0,0,0,-56,0,-120,0,-16,1,56,1,80,0,-16,2,104,0,96,1,0,0,-128, -0,104,0,-72,0,80,0,8,0,16,0,-96,1,0,0,-112,1,20,0,48,0,64,0,24,0,12,0,16,0,4,0,8, -0,8,0,32,0,112,0,48,0,8,0,16,0,8,0,8,0,4,0,4,0,0,1,32,0,16,0,64,0,24,0,12, -0,96,0,0,0,64,0,88,0,104,0,112,0,80,0,112,0,-112,0,80,0,72,0,120,0,72,0,-88,0,-48,0,72, -0,104,0,120,0,-48,0,120,0,-56,0,64,0,96,0,0,0,-120,0,32,0,20,0,-112,0,0,0,80,0,0,0,0, -0,80,0,8,0,8,0,0,1,96,0,-104,1,80,0,80,0,80,0,-72,1,-128,0,120,0,-104,0,48,0,-128,0,72, -0,120,0,-120,0,16,1,-32,0,0,0,16,0,0,0,0,0,0,0,-32,1,40,0,40,0,-72,0,-104,0,56,0,16, -0,88,0,-24,3,64,0,16,0,88,0,16,0,24,1,8,0,72,0,88,0,-16,0,8,0,-8,0,0,0,64,6,0, -0,64,0,88,3,48,0,8,1,0,0,0,0,0,0,32,0,-120,0,48,0,120,1,-16,0,-40,0,-8,1,0,0,0, -0,48,1,16,0,16,0,32,1,-64,0,-112,0,120,2,56,0,-80,0,0,1,-72,2,0,0,-104,0,-48,0,16,0,64, -14,56,0,40,12,-88,0,32,0,40,0,-16,0,40,0,80,0,48,0,16,0,8,0,64,0,0,0,0,1,32,1,-56, -1,8,1,72,1,0,0,32,0,48,0,12,0,24,0,48,0,16,0,32,0,24,0,32,0,72,1,0,0,64,0,64, -0,80,0,48,0,8,0,48,0,72,0,104,0,40,0,8,0,72,0,44,0,40,0,108,0,72,0,96,0,104,0,60, -0,-128,0,80,0,80,0,16,0,96,0,32,0,20,0,88,0,24,0,80,0,112,0,84,0,32,0,96,0,64,0,56, -0,112,0,-116,0,4,0,24,0,16,0,8,0,40,0,0,0,88,0,-64,0,40,0,24,1,-104,0,-48,1,88,0,88, -0,-48,0,56,0,80,0,-128,0,80,0,112,0,56,0,48,0,48,0,72,0,48,0,72,0,48,0,24,0,56,0,104, -0,16,0,112,0,96,0,28,0,28,0,28,0,56,0,24,0,72,0,-88,0,40,0,-112,0,48,0,-8,0,0,0,0, -0,16,0,40,0,28,0,12,0,12,0,16,1,40,0,8,0,8,0,64,0,32,0,24,0,16,0,24,0,32,0,8, -0,32,0,12,0,56,0,24,0,72,0,24,0,56,0,72,0,8,1,16,2,0,0,0,0,0,0,16,0,32,0,40, -0,-64,0,83,84,82,67,57,1,0,0,10,0,2,0,10,0,0,0,10,0,1,0,11,0,3,0,11,0,0,0,11, -0,1,0,9,0,2,0,12,0,2,0,9,0,3,0,9,0,4,0,13,0,2,0,2,0,5,0,2,0,6,0,14, -0,2,0,4,0,5,0,4,0,6,0,15,0,2,0,7,0,5,0,7,0,6,0,16,0,2,0,8,0,5,0,8, -0,6,0,17,0,3,0,4,0,5,0,4,0,6,0,4,0,7,0,18,0,3,0,7,0,5,0,7,0,6,0,7, -0,7,0,19,0,3,0,8,0,5,0,8,0,6,0,8,0,7,0,20,0,4,0,4,0,5,0,4,0,6,0,4, -0,7,0,4,0,8,0,21,0,4,0,7,0,5,0,7,0,6,0,7,0,7,0,7,0,8,0,22,0,4,0,8, -0,5,0,8,0,6,0,8,0,7,0,8,0,8,0,23,0,4,0,4,0,9,0,4,0,10,0,4,0,11,0,4, -0,12,0,24,0,4,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,25,0,4,0,9,0,13,0,12, -0,14,0,4,0,15,0,4,0,16,0,26,0,10,0,26,0,0,0,26,0,1,0,0,0,17,0,0,0,18,0,0, -0,19,0,2,0,20,0,4,0,21,0,25,0,22,0,4,0,23,0,4,0,24,0,27,0,9,0,9,0,0,0,9, -0,1,0,27,0,25,0,28,0,26,0,0,0,27,0,2,0,28,0,2,0,20,0,4,0,29,0,26,0,30,0,28, -0,8,0,27,0,31,0,27,0,32,0,29,0,33,0,0,0,34,0,0,0,35,0,4,0,36,0,4,0,37,0,28, -0,38,0,30,0,6,0,4,0,39,0,4,0,40,0,2,0,41,0,2,0,42,0,2,0,43,0,4,0,44,0,31, -0,6,0,32,0,45,0,2,0,46,0,2,0,47,0,2,0,18,0,2,0,20,0,0,0,48,0,33,0,21,0,33, -0,0,0,33,0,1,0,34,0,49,0,35,0,50,0,24,0,51,0,24,0,52,0,2,0,46,0,2,0,47,0,2, -0,53,0,2,0,54,0,2,0,55,0,2,0,56,0,2,0,20,0,2,0,57,0,7,0,11,0,7,0,12,0,4, -0,58,0,7,0,59,0,7,0,60,0,7,0,61,0,31,0,62,0,36,0,7,0,27,0,31,0,12,0,63,0,24, -0,64,0,2,0,46,0,2,0,65,0,2,0,66,0,2,0,37,0,37,0,16,0,37,0,0,0,37,0,1,0,7, -0,67,0,7,0,61,0,2,0,18,0,2,0,47,0,2,0,68,0,2,0,20,0,4,0,69,0,4,0,70,0,9, -0,2,0,7,0,71,0,0,0,17,0,0,0,72,0,7,0,73,0,7,0,74,0,38,0,12,0,27,0,31,0,37, -0,75,0,0,0,76,0,4,0,77,0,7,0,61,0,12,0,78,0,36,0,79,0,27,0,80,0,2,0,18,0,2, -0,81,0,2,0,82,0,2,0,20,0,39,0,5,0,27,0,83,0,2,0,84,0,2,0,85,0,2,0,86,0,4, -0,37,0,40,0,6,0,40,0,0,0,40,0,1,0,0,0,87,0,0,0,88,0,4,0,23,0,4,0,89,0,41, -0,10,0,41,0,0,0,41,0,1,0,4,0,90,0,4,0,91,0,4,0,92,0,4,0,43,0,4,0,14,0,4, -0,93,0,0,0,94,0,0,0,95,0,42,0,15,0,27,0,31,0,0,0,96,0,4,0,93,0,4,0,97,0,12, -0,98,0,40,0,99,0,40,0,100,0,4,0,101,0,4,0,102,0,12,0,103,0,0,0,104,0,4,0,105,0,4, -0,106,0,9,0,107,0,8,0,108,0,43,0,5,0,4,0,109,0,4,0,110,0,4,0,93,0,4,0,37,0,9, -0,2,0,44,0,20,0,27,0,31,0,2,0,18,0,2,0,20,0,7,0,111,0,7,0,112,0,7,0,113,0,7, -0,114,0,7,0,115,0,7,0,116,0,7,0,117,0,7,0,118,0,7,0,119,0,7,0,120,0,7,0,121,0,2, -0,122,0,2,0,123,0,7,0,124,0,36,0,79,0,39,0,125,0,32,0,126,0,45,0,12,0,4,0,127,0,4, -0,-128,0,4,0,-127,0,4,0,-126,0,2,0,-125,0,2,0,-124,0,2,0,20,0,2,0,-123,0,2,0,-122,0,2, -0,-121,0,2,0,-120,0,2,0,-119,0,46,0,32,0,27,0,31,0,0,0,34,0,12,0,-118,0,47,0,-117,0,48, -0,-116,0,49,0,-115,0,2,0,-123,0,2,0,20,0,2,0,-114,0,2,0,18,0,2,0,37,0,2,0,43,0,4, -0,-113,0,2,0,-112,0,2,0,-111,0,2,0,-110,0,2,0,-109,0,2,0,-108,0,2,0,-107,0,4,0,-106,0,4, -0,-105,0,43,0,-104,0,30,0,-103,0,7,0,-102,0,4,0,-101,0,2,0,-100,0,2,0,-99,0,2,0,-98,0,2, -0,-97,0,7,0,-96,0,7,0,-95,0,9,0,-94,0,50,0,31,0,2,0,-93,0,2,0,-92,0,2,0,-91,0,2, -0,-90,0,32,0,-89,0,51,0,-88,0,0,0,-87,0,0,0,-86,0,0,0,-85,0,0,0,-84,0,0,0,-83,0,7, -0,-82,0,7,0,-81,0,2,0,-80,0,2,0,-79,0,2,0,-78,0,2,0,-77,0,2,0,-76,0,2,0,-75,0,2, -0,-74,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7,0,-69,0,7,0,57,0,7,0,-68,0,7, -0,-67,0,7,0,-66,0,7,0,-65,0,7,0,-64,0,52,0,15,0,0,0,-63,0,9,0,-62,0,0,0,-61,0,0, -0,-60,0,4,0,-59,0,4,0,-58,0,9,0,-57,0,7,0,-56,0,7,0,-55,0,7,0,-54,0,4,0,-53,0,9, -0,-52,0,9,0,-51,0,4,0,-50,0,4,0,37,0,53,0,6,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, -0,-49,0,7,0,67,0,4,0,64,0,54,0,5,0,2,0,20,0,2,0,36,0,2,0,64,0,2,0,-48,0,53, -0,-54,0,55,0,17,0,32,0,-89,0,46,0,-47,0,56,0,-46,0,7,0,-45,0,7,0,-44,0,2,0,18,0,2, -0,-43,0,7,0,113,0,7,0,114,0,7,0,-42,0,4,0,-41,0,2,0,-40,0,2,0,-39,0,4,0,-123,0,4, -0,-113,0,2,0,-38,0,2,0,-37,0,51,0,56,0,27,0,31,0,7,0,-36,0,7,0,-35,0,7,0,-34,0,7, -0,-33,0,7,0,-32,0,7,0,-31,0,7,0,-30,0,7,0,-29,0,7,0,-28,0,7,0,-27,0,7,0,-26,0,7, -0,-25,0,7,0,-24,0,7,0,-23,0,7,0,-22,0,7,0,-21,0,7,0,-20,0,7,0,-19,0,7,0,-18,0,7, -0,-17,0,2,0,-16,0,2,0,-15,0,2,0,-14,0,2,0,-13,0,2,0,-12,0,2,0,-11,0,2,0,-10,0,2, -0,20,0,2,0,18,0,2,0,-43,0,7,0,-9,0,7,0,-8,0,7,0,-7,0,7,0,-6,0,2,0,-5,0,2, -0,-4,0,2,0,-3,0,2,0,-125,0,4,0,23,0,4,0,-128,0,4,0,-127,0,4,0,-126,0,7,0,-2,0,7, -0,-1,0,7,0,-67,0,45,0,0,1,57,0,1,1,36,0,79,0,46,0,-47,0,52,0,2,1,54,0,3,1,55, -0,4,1,30,0,-103,0,0,0,5,1,0,0,6,1,58,0,8,0,7,0,7,1,7,0,8,1,7,0,-81,0,4, -0,20,0,7,0,9,1,7,0,10,1,7,0,11,1,32,0,45,0,59,0,80,0,27,0,31,0,2,0,18,0,2, -0,12,1,4,0,13,1,2,0,-79,0,2,0,14,1,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7, -0,15,1,7,0,16,1,7,0,17,1,7,0,18,1,7,0,19,1,7,0,20,1,7,0,21,1,7,0,22,1,7, -0,23,1,7,0,24,1,7,0,25,1,60,0,26,1,2,0,27,1,2,0,70,0,7,0,113,0,7,0,114,0,7, -0,28,1,7,0,29,1,7,0,30,1,2,0,31,1,2,0,32,1,2,0,33,1,2,0,34,1,0,0,35,1,0, -0,36,1,2,0,37,1,2,0,38,1,2,0,39,1,2,0,40,1,2,0,41,1,7,0,42,1,7,0,43,1,7, -0,44,1,7,0,45,1,2,0,46,1,2,0,43,0,2,0,47,1,2,0,48,1,2,0,49,1,2,0,50,1,7, -0,51,1,7,0,52,1,7,0,53,1,7,0,54,1,7,0,55,1,7,0,56,1,7,0,57,1,7,0,58,1,7, -0,59,1,7,0,60,1,7,0,61,1,7,0,62,1,2,0,63,1,2,0,64,1,4,0,65,1,4,0,66,1,2, -0,67,1,2,0,68,1,2,0,69,1,2,0,70,1,7,0,71,1,7,0,72,1,7,0,73,1,7,0,74,1,2, -0,75,1,2,0,76,1,50,0,77,1,36,0,79,0,30,0,-103,0,39,0,125,0,61,0,2,0,27,0,31,0,36, -0,79,0,62,0,-127,0,27,0,31,0,2,0,-79,0,2,0,20,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, -0,78,1,7,0,79,1,7,0,80,1,7,0,81,1,7,0,82,1,7,0,83,1,7,0,84,1,7,0,85,1,7, -0,86,1,7,0,87,1,7,0,88,1,7,0,89,1,7,0,90,1,7,0,91,1,7,0,92,1,7,0,93,1,7, -0,94,1,7,0,95,1,7,0,96,1,7,0,97,1,7,0,98,1,7,0,99,1,7,0,100,1,7,0,101,1,7, -0,102,1,7,0,103,1,7,0,104,1,2,0,105,1,2,0,106,1,2,0,107,1,0,0,108,1,0,0,109,1,7, -0,110,1,7,0,111,1,2,0,112,1,2,0,113,1,7,0,114,1,7,0,115,1,7,0,116,1,7,0,117,1,2, -0,118,1,2,0,119,1,4,0,13,1,4,0,120,1,2,0,121,1,2,0,122,1,2,0,123,1,2,0,124,1,7, -0,125,1,7,0,126,1,7,0,127,1,7,0,-128,1,7,0,-127,1,7,0,-126,1,7,0,-125,1,7,0,-124,1,7, -0,-123,1,7,0,-122,1,0,0,-121,1,7,0,-120,1,7,0,-119,1,7,0,-118,1,4,0,-117,1,0,0,-116,1,0, -0,47,1,0,0,-115,1,0,0,5,1,2,0,-114,1,2,0,-113,1,2,0,64,1,2,0,-112,1,2,0,-111,1,2, -0,-110,1,7,0,-109,1,7,0,-108,1,7,0,-107,1,7,0,-106,1,7,0,-105,1,2,0,-93,0,2,0,-92,0,54, -0,-104,1,54,0,-103,1,0,0,-102,1,0,0,-101,1,0,0,-100,1,0,0,-99,1,2,0,-98,1,2,0,12,1,7, -0,-97,1,7,0,-96,1,50,0,77,1,57,0,1,1,36,0,79,0,63,0,-95,1,30,0,-103,0,7,0,-94,1,7, -0,-93,1,7,0,-92,1,7,0,-91,1,7,0,-90,1,2,0,-89,1,2,0,70,0,7,0,-88,1,7,0,-87,1,7, -0,-86,1,7,0,-85,1,7,0,-84,1,7,0,-83,1,7,0,-82,1,7,0,-81,1,7,0,-80,1,2,0,-79,1,2, -0,-78,1,7,0,-77,1,7,0,-76,1,7,0,-75,1,7,0,-74,1,7,0,-73,1,4,0,-72,1,4,0,-71,1,4, -0,-70,1,39,0,125,0,12,0,-69,1,64,0,6,0,27,0,31,0,0,0,-68,1,7,0,-67,1,7,0,37,0,65, -0,2,0,43,0,-104,0,66,0,26,0,66,0,0,0,66,0,1,0,67,0,-66,1,4,0,-65,1,4,0,-64,1,4, -0,-63,1,4,0,-62,1,4,0,-61,1,4,0,-60,1,2,0,18,0,2,0,20,0,2,0,-59,1,2,0,-58,1,7, -0,5,0,7,0,6,0,7,0,7,0,7,0,-57,1,7,0,-56,1,7,0,-55,1,7,0,-54,1,7,0,-53,1,7, -0,-52,1,7,0,-51,1,7,0,23,0,7,0,-50,1,7,0,-49,1,68,0,15,0,27,0,31,0,67,0,-66,1,12, -0,-48,1,12,0,-47,1,36,0,79,0,62,0,-46,1,2,0,20,0,2,0,-45,1,4,0,-80,0,7,0,7,1,7, -0,-81,0,7,0,8,1,7,0,-44,1,7,0,-43,1,7,0,-42,1,35,0,10,0,7,0,-41,1,7,0,-40,1,7, -0,-39,1,7,0,-38,1,2,0,-37,1,2,0,-36,1,0,0,-35,1,0,0,-34,1,0,0,-33,1,0,0,-32,1,34, -0,7,0,7,0,-31,1,7,0,-40,1,7,0,-39,1,2,0,-35,1,2,0,-32,1,7,0,-38,1,7,0,37,0,69, -0,21,0,69,0,0,0,69,0,1,0,2,0,18,0,2,0,-30,1,2,0,-32,1,2,0,20,0,2,0,-29,1,2, -0,-28,1,2,0,-27,1,2,0,-26,1,2,0,-25,1,2,0,-24,1,2,0,-23,1,2,0,-22,1,7,0,-21,1,7, -0,-20,1,34,0,49,0,35,0,50,0,2,0,-19,1,2,0,-18,1,4,0,-17,1,70,0,5,0,2,0,-16,1,2, -0,-30,1,0,0,20,0,0,0,37,0,2,0,70,0,71,0,4,0,7,0,5,0,7,0,6,0,7,0,8,0,7, -0,-15,1,72,0,57,0,27,0,31,0,67,0,-66,1,12,0,-14,1,12,0,-47,1,32,0,-13,1,32,0,-12,1,32, -0,-11,1,36,0,79,0,73,0,-10,1,38,0,-9,1,62,0,-46,1,12,0,-8,1,7,0,7,1,7,0,-81,0,7, -0,8,1,4,0,-80,0,2,0,-7,1,2,0,-45,1,2,0,20,0,2,0,-6,1,7,0,-5,1,7,0,-4,1,7, -0,-3,1,2,0,-27,1,2,0,-26,1,2,0,-2,1,2,0,-1,1,4,0,70,0,2,0,23,0,2,0,98,0,2, -0,67,0,2,0,0,2,7,0,1,2,7,0,2,2,7,0,3,2,7,0,4,2,7,0,5,2,7,0,6,2,7, -0,7,2,7,0,8,2,7,0,9,2,7,0,10,2,0,0,11,2,0,0,12,2,64,0,13,2,64,0,14,2,64, -0,15,2,64,0,16,2,4,0,17,2,4,0,18,2,4,0,19,2,4,0,37,0,71,0,20,2,4,0,21,2,4, -0,22,2,70,0,23,2,70,0,24,2,74,0,39,0,27,0,31,0,67,0,-66,1,12,0,25,2,36,0,79,0,38, -0,-9,1,62,0,-46,1,75,0,26,2,76,0,27,2,77,0,28,2,78,0,29,2,79,0,30,2,80,0,31,2,81, -0,32,2,82,0,33,2,74,0,34,2,83,0,35,2,84,0,36,2,84,0,37,2,84,0,38,2,4,0,54,0,4, -0,39,2,4,0,40,2,4,0,41,2,4,0,42,2,4,0,-80,0,7,0,7,1,7,0,-81,0,7,0,8,1,7, -0,43,2,7,0,37,0,2,0,44,2,2,0,20,0,2,0,45,2,2,0,46,2,2,0,-45,1,2,0,47,2,85, -0,48,2,86,0,49,2,9,0,-94,0,77,0,8,0,9,0,50,2,7,0,51,2,4,0,52,2,0,0,20,0,0, -0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,75,0,8,0,4,0,56,2,4,0,57,2,4,0,58,2,4, -0,59,2,0,0,37,0,0,0,-30,1,0,0,60,2,0,0,20,0,79,0,5,0,4,0,56,2,4,0,57,2,0, -0,61,2,0,0,62,2,2,0,20,0,87,0,2,0,4,0,63,2,7,0,-39,1,80,0,3,0,87,0,64,2,4, -0,65,2,4,0,20,0,78,0,6,0,7,0,66,2,2,0,67,2,0,0,20,0,0,0,-30,1,0,0,62,2,0, -0,68,2,81,0,4,0,0,0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,88,0,6,0,46,0,50,2,0, -0,20,0,0,0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,89,0,1,0,7,0,69,2,90,0,5,0,0, -0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,4,0,37,0,82,0,1,0,7,0,70,2,83,0,2,0,4, -0,71,2,4,0,18,0,76,0,7,0,7,0,51,2,46,0,50,2,0,0,20,0,0,0,53,2,2,0,13,1,2, -0,54,2,2,0,55,2,91,0,1,0,7,0,72,2,92,0,1,0,4,0,73,2,93,0,1,0,0,0,74,2,94, -0,1,0,7,0,51,2,95,0,4,0,7,0,-49,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,96,0,1,0,95, -0,52,2,97,0,5,0,4,0,75,2,4,0,76,2,0,0,20,0,0,0,-30,1,0,0,-74,0,98,0,2,0,4, -0,77,2,4,0,76,2,99,0,14,0,99,0,0,0,99,0,1,0,97,0,78,2,96,0,79,2,98,0,80,2,0, -0,81,2,12,0,82,2,12,0,83,2,100,0,84,2,4,0,54,0,4,0,40,2,4,0,39,2,4,0,37,0,78, -0,85,2,85,0,14,0,12,0,86,2,78,0,85,2,0,0,87,2,0,0,88,2,0,0,89,2,0,0,90,2,0, -0,91,2,0,0,92,2,0,0,93,2,0,0,20,0,84,0,36,2,84,0,38,2,2,0,94,2,0,0,95,2,86, -0,8,0,4,0,96,2,4,0,97,2,75,0,98,2,79,0,99,2,4,0,40,2,4,0,39,2,4,0,54,0,4, -0,37,0,101,0,6,0,101,0,0,0,101,0,1,0,4,0,18,0,4,0,13,1,0,0,17,0,0,0,100,2,102, -0,7,0,101,0,101,2,2,0,102,2,2,0,86,2,2,0,103,2,2,0,93,0,9,0,104,2,9,0,105,2,103, -0,3,0,101,0,101,2,32,0,-89,0,0,0,17,0,104,0,5,0,101,0,101,2,32,0,-89,0,0,0,17,0,2, -0,106,2,0,0,107,2,105,0,5,0,101,0,101,2,7,0,91,0,7,0,108,2,4,0,109,2,4,0,110,2,106, -0,5,0,101,0,101,2,32,0,111,2,0,0,72,0,4,0,13,1,4,0,20,0,107,0,13,0,101,0,101,2,32, -0,112,2,32,0,113,2,32,0,114,2,32,0,115,2,7,0,116,2,7,0,117,2,7,0,108,2,7,0,118,2,4, -0,119,2,4,0,120,2,4,0,93,0,4,0,121,2,108,0,5,0,101,0,101,2,2,0,122,2,2,0,20,0,7, -0,123,2,32,0,124,2,109,0,3,0,101,0,101,2,7,0,125,2,4,0,93,0,110,0,10,0,101,0,101,2,7, -0,126,2,4,0,127,2,4,0,37,0,2,0,93,0,2,0,-128,2,2,0,-127,2,2,0,-126,2,7,0,-125,2,0, -0,-124,2,111,0,3,0,101,0,101,2,7,0,37,0,4,0,18,0,112,0,11,0,101,0,101,2,51,0,-123,2,7, -0,-122,2,4,0,-121,2,0,0,-124,2,7,0,-120,2,4,0,-119,2,32,0,-118,2,0,0,-117,2,4,0,-116,2,4, -0,37,0,113,0,10,0,101,0,101,2,32,0,-115,2,46,0,-114,2,4,0,93,0,4,0,-113,2,7,0,-112,2,7, -0,-111,2,0,0,-117,2,4,0,-116,2,4,0,37,0,114,0,3,0,101,0,101,2,7,0,-110,2,4,0,-109,2,115, -0,5,0,101,0,101,2,7,0,-108,2,0,0,-124,2,2,0,20,0,2,0,-107,2,116,0,8,0,101,0,101,2,32, -0,-89,0,7,0,-108,2,7,0,-38,1,7,0,109,0,0,0,-124,2,2,0,20,0,2,0,18,0,117,0,21,0,101, -0,101,2,32,0,-106,2,0,0,-124,2,51,0,-123,2,32,0,-118,2,2,0,20,0,2,0,37,0,7,0,-105,2,7, -0,-104,2,7,0,-103,2,7,0,-5,1,7,0,-102,2,7,0,-101,2,7,0,-100,2,7,0,-99,2,4,0,-119,2,4, -0,-116,2,0,0,-117,2,7,0,-98,2,7,0,-97,2,7,0,43,0,118,0,7,0,101,0,101,2,2,0,-96,2,2, -0,-95,2,4,0,70,0,32,0,-89,0,7,0,-94,2,0,0,-124,2,119,0,9,0,101,0,101,2,32,0,-89,0,7, -0,-93,2,7,0,-92,2,7,0,-99,2,4,0,-91,2,4,0,-90,2,7,0,-89,2,0,0,17,0,120,0,1,0,101, -0,101,2,121,0,5,0,101,0,101,2,122,0,-88,2,123,0,-87,2,124,0,-86,2,125,0,-85,2,126,0,14,0,101, -0,101,2,78,0,-84,2,78,0,-83,2,78,0,-82,2,78,0,-81,2,78,0,-80,2,78,0,-79,2,75,0,-78,2,4, -0,-77,2,4,0,-76,2,2,0,-75,2,2,0,37,0,7,0,-74,2,127,0,-73,2,-128,0,3,0,101,0,101,2,-127, -0,-72,2,-126,0,-73,2,-125,0,4,0,101,0,101,2,32,0,-89,0,4,0,-71,2,4,0,37,0,-124,0,2,0,4, -0,-70,2,7,0,-39,1,-123,0,2,0,4,0,-127,0,4,0,-69,2,-122,0,20,0,101,0,101,2,32,0,-89,0,0, -0,-124,2,2,0,-68,2,2,0,-67,2,2,0,20,0,2,0,37,0,7,0,-66,2,7,0,-65,2,4,0,54,0,4, -0,-64,2,-123,0,-63,2,-124,0,-62,2,4,0,-61,2,4,0,-60,2,4,0,-59,2,4,0,-69,2,7,0,-58,2,7, -0,-57,2,7,0,-56,2,-121,0,8,0,101,0,101,2,-120,0,-55,2,-127,0,-72,2,4,0,-54,2,4,0,-53,2,4, -0,-52,2,2,0,20,0,2,0,57,0,-119,0,5,0,101,0,101,2,32,0,45,0,2,0,-51,2,2,0,20,0,2, -0,-50,2,-118,0,5,0,101,0,101,2,4,0,-49,2,2,0,20,0,2,0,-48,2,7,0,-47,2,-117,0,3,0,101, -0,101,2,-116,0,-46,2,125,0,-85,2,-115,0,10,0,101,0,101,2,32,0,-45,2,32,0,-44,2,0,0,-43,2,7, -0,-42,2,2,0,-41,2,2,0,-40,2,0,0,-39,2,0,0,-38,2,0,0,107,2,-114,0,9,0,101,0,101,2,32, -0,-37,2,0,0,-43,2,7,0,-36,2,7,0,-35,2,0,0,13,1,0,0,122,2,0,0,-34,2,0,0,37,0,-113, -0,24,0,27,0,31,0,2,0,-29,1,2,0,-28,1,2,0,-33,2,2,0,20,0,2,0,-32,2,2,0,-31,2,2, -0,-30,2,2,0,70,0,0,0,-29,2,0,0,-28,2,0,0,-27,2,0,0,18,0,4,0,37,0,7,0,-26,2,7, -0,-25,2,7,0,-24,2,7,0,-23,2,7,0,-22,2,7,0,-21,2,34,0,-20,2,36,0,79,0,38,0,-9,1,80, -0,31,2,-112,0,3,0,-112,0,0,0,-112,0,1,0,0,0,17,0,67,0,3,0,7,0,-19,2,4,0,20,0,4, -0,37,0,32,0,111,0,27,0,31,0,2,0,18,0,2,0,-18,2,4,0,-17,2,4,0,-16,2,4,0,-15,2,0, -0,-14,2,32,0,38,0,32,0,-13,2,32,0,-12,2,32,0,-11,2,32,0,-10,2,36,0,79,0,73,0,-10,1,67, -0,-66,1,-111,0,-9,2,-111,0,-8,2,-110,0,-7,2,9,0,2,0,12,0,-6,2,12,0,25,2,12,0,-47,1,12, -0,-5,2,12,0,-4,2,62,0,-46,1,7,0,7,1,7,0,-3,2,7,0,-2,2,7,0,-81,0,7,0,-1,2,7, -0,8,1,7,0,0,3,7,0,1,3,7,0,-93,2,7,0,2,3,7,0,-45,0,4,0,3,3,2,0,20,0,2, -0,4,3,2,0,5,3,2,0,6,3,2,0,7,3,2,0,8,3,2,0,9,3,2,0,10,3,2,0,11,3,2, -0,12,3,2,0,13,3,2,0,14,3,4,0,15,3,4,0,16,3,4,0,17,3,4,0,18,3,7,0,19,3,7, -0,20,3,7,0,21,3,7,0,22,3,7,0,23,3,7,0,24,3,7,0,25,3,7,0,26,3,7,0,27,3,7, -0,28,3,7,0,29,3,7,0,30,3,0,0,31,3,0,0,32,3,0,0,-45,1,0,0,33,3,0,0,34,3,0, -0,35,3,7,0,36,3,7,0,37,3,39,0,125,0,12,0,38,3,12,0,39,3,12,0,40,3,12,0,41,3,7, -0,42,3,2,0,71,2,2,0,43,3,7,0,52,2,4,0,44,3,4,0,45,3,-109,0,46,3,2,0,47,3,2, -0,-38,0,7,0,48,3,12,0,49,3,12,0,50,3,12,0,51,3,12,0,52,3,-108,0,53,3,-107,0,54,3,63, -0,55,3,2,0,56,3,2,0,57,3,2,0,58,3,2,0,59,3,7,0,44,2,2,0,60,3,2,0,61,3,-116, -0,62,3,-127,0,63,3,-127,0,64,3,4,0,65,3,4,0,66,3,4,0,67,3,4,0,70,0,9,0,-94,0,12, -0,68,3,-106,0,14,0,-106,0,0,0,-106,0,1,0,32,0,38,0,7,0,-93,2,7,0,9,1,7,0,-92,2,7, -0,-99,2,0,0,17,0,4,0,-91,2,4,0,-90,2,4,0,69,3,2,0,18,0,2,0,70,3,7,0,-89,2,-108, -0,36,0,2,0,71,3,2,0,72,3,2,0,20,0,2,0,-99,2,7,0,73,3,7,0,74,3,7,0,75,3,7, -0,76,3,7,0,77,3,7,0,78,3,7,0,79,3,7,0,80,3,7,0,81,3,7,0,82,3,7,0,83,3,7, -0,84,3,7,0,85,3,7,0,86,3,7,0,87,3,7,0,88,3,7,0,89,3,7,0,90,3,7,0,91,3,7, -0,92,3,7,0,93,3,7,0,94,3,7,0,95,3,7,0,96,3,2,0,97,3,2,0,98,3,2,0,99,3,2, -0,100,3,51,0,-88,0,-105,0,101,3,7,0,102,3,4,0,110,2,125,0,5,0,4,0,20,0,4,0,103,3,4, -0,104,3,4,0,105,3,4,0,106,3,-104,0,1,0,7,0,-31,1,-109,0,30,0,4,0,20,0,7,0,107,3,7, -0,108,3,7,0,109,3,4,0,110,3,4,0,111,3,4,0,112,3,4,0,113,3,7,0,114,3,7,0,115,3,7, -0,116,3,7,0,117,3,7,0,118,3,7,0,119,3,7,0,120,3,7,0,121,3,7,0,122,3,7,0,123,3,7, -0,124,3,7,0,125,3,7,0,126,3,7,0,127,3,7,0,-128,3,7,0,-127,3,7,0,-126,3,7,0,-125,3,4, -0,-124,3,4,0,-123,3,7,0,-122,3,7,0,27,3,-107,0,49,0,-120,0,-121,3,4,0,-120,3,4,0,-119,3,-103, -0,-118,3,-102,0,-117,3,0,0,37,0,0,0,-116,3,2,0,-115,3,7,0,-114,3,0,0,-113,3,7,0,-112,3,7, -0,-111,3,7,0,-110,3,7,0,-109,3,7,0,-108,3,7,0,-107,3,7,0,-106,3,7,0,-105,3,7,0,-104,3,2, -0,-103,3,0,0,-102,3,2,0,-101,3,7,0,-100,3,7,0,-99,3,0,0,-98,3,4,0,-126,0,4,0,-97,3,4, -0,-96,3,2,0,-95,3,2,0,-94,3,-104,0,-93,3,4,0,-92,3,4,0,81,0,7,0,-91,3,7,0,-90,3,7, -0,-89,3,7,0,-88,3,2,0,-87,3,2,0,-86,3,2,0,-85,3,2,0,-84,3,2,0,-83,3,2,0,-82,3,2, -0,-81,3,2,0,-80,3,-101,0,-79,3,7,0,-78,3,7,0,-77,3,125,0,-76,3,-116,0,48,0,2,0,18,0,2, -0,-75,3,2,0,-74,3,2,0,-73,3,7,0,-72,3,2,0,-71,3,2,0,-70,3,7,0,-69,3,2,0,-68,3,2, -0,-67,3,7,0,-66,3,7,0,-65,3,7,0,-64,3,7,0,-63,3,7,0,-62,3,7,0,-61,3,4,0,-60,3,7, -0,-59,3,7,0,-58,3,7,0,-57,3,74,0,-56,3,74,0,-55,3,74,0,-54,3,0,0,-53,3,7,0,-52,3,7, -0,-51,3,36,0,79,0,2,0,-50,3,0,0,-49,3,0,0,-48,3,7,0,-47,3,4,0,-46,3,7,0,-45,3,7, -0,-44,3,4,0,-43,3,4,0,20,0,7,0,-42,3,7,0,-41,3,7,0,-40,3,78,0,-39,3,7,0,-38,3,7, -0,-37,3,7,0,-36,3,7,0,-35,3,7,0,-34,3,7,0,-33,3,7,0,-32,3,4,0,-31,3,-100,0,71,0,27, -0,31,0,2,0,-79,0,2,0,14,1,2,0,47,1,2,0,-30,3,7,0,-29,3,7,0,-28,3,7,0,-27,3,7, -0,-26,3,7,0,-25,3,7,0,-24,3,7,0,-23,3,7,0,-22,3,7,0,84,1,7,0,86,1,7,0,85,1,7, -0,-21,3,4,0,-20,3,7,0,-19,3,7,0,-18,3,7,0,-17,3,7,0,-16,3,7,0,-15,3,7,0,-14,3,7, -0,-13,3,2,0,-12,3,2,0,13,1,2,0,-11,3,2,0,-10,3,2,0,-9,3,2,0,-8,3,2,0,-7,3,2, -0,-6,3,7,0,-5,3,7,0,-4,3,7,0,-3,3,7,0,-2,3,7,0,-1,3,7,0,0,4,7,0,1,4,7, -0,2,4,7,0,3,4,7,0,4,4,7,0,5,4,7,0,6,4,2,0,7,4,2,0,8,4,2,0,9,4,2, -0,10,4,7,0,11,4,7,0,12,4,7,0,13,4,7,0,14,4,2,0,15,4,2,0,16,4,2,0,17,4,2, -0,18,4,7,0,19,4,7,0,20,4,7,0,21,4,7,0,22,4,2,0,23,4,2,0,24,4,2,0,25,4,2, -0,43,0,7,0,26,4,7,0,27,4,36,0,79,0,50,0,77,1,30,0,-103,0,39,0,125,0,-99,0,16,0,2, -0,28,4,2,0,29,4,2,0,30,4,2,0,20,0,2,0,31,4,2,0,32,4,2,0,33,4,2,0,34,4,2, -0,35,4,2,0,36,4,2,0,37,4,2,0,38,4,4,0,39,4,7,0,40,4,7,0,41,4,7,0,42,4,-98, -0,8,0,-98,0,0,0,-98,0,1,0,4,0,3,3,4,0,43,4,4,0,20,0,2,0,44,4,2,0,45,4,32, -0,-89,0,-97,0,13,0,9,0,46,4,9,0,47,4,4,0,48,4,4,0,49,4,4,0,50,4,4,0,51,4,4, -0,52,4,4,0,53,4,4,0,54,4,4,0,55,4,4,0,56,4,4,0,37,0,0,0,57,4,-96,0,5,0,9, -0,58,4,9,0,59,4,4,0,60,4,4,0,70,0,0,0,61,4,-95,0,13,0,4,0,18,0,4,0,62,4,4, -0,63,4,4,0,64,4,4,0,65,4,4,0,66,4,4,0,93,0,4,0,67,4,4,0,68,4,4,0,69,4,4, -0,70,4,4,0,71,4,26,0,30,0,-94,0,4,0,4,0,72,4,7,0,73,4,2,0,20,0,2,0,68,2,-93, -0,11,0,-93,0,0,0,-93,0,1,0,0,0,17,0,62,0,74,4,63,0,75,4,4,0,3,3,4,0,76,4,4, -0,77,4,4,0,37,0,4,0,78,4,4,0,79,4,-92,0,-126,0,-97,0,80,4,-96,0,81,4,-95,0,82,4,4, -0,83,4,4,0,-126,0,4,0,-97,3,4,0,84,4,4,0,85,4,4,0,86,4,4,0,87,4,2,0,20,0,2, -0,88,4,7,0,20,3,7,0,89,4,7,0,90,4,7,0,91,4,7,0,92,4,7,0,93,4,2,0,94,4,2, -0,95,4,2,0,96,4,2,0,97,4,2,0,-39,0,2,0,98,4,2,0,99,4,2,0,100,3,2,0,100,4,2, -0,101,4,2,0,34,1,2,0,109,0,2,0,102,4,2,0,103,4,2,0,104,4,2,0,105,4,2,0,106,4,2, -0,107,4,2,0,108,4,2,0,109,4,2,0,110,4,2,0,35,1,2,0,111,4,2,0,112,4,2,0,113,4,2, -0,114,4,4,0,115,4,4,0,13,1,2,0,116,4,2,0,117,4,2,0,118,4,2,0,119,4,2,0,120,4,2, -0,121,4,24,0,122,4,24,0,123,4,23,0,124,4,12,0,125,4,2,0,126,4,2,0,37,0,7,0,127,4,7, -0,-128,4,7,0,-127,4,7,0,-126,4,7,0,-125,4,7,0,-124,4,7,0,-123,4,7,0,-122,4,7,0,-121,4,2, -0,-120,4,2,0,-119,4,2,0,-118,4,2,0,-117,4,2,0,-116,4,2,0,-115,4,7,0,-114,4,7,0,-113,4,7, -0,-112,4,2,0,-111,4,2,0,-110,4,2,0,-109,4,2,0,-108,4,2,0,-107,4,2,0,-106,4,2,0,-105,4,2, -0,-104,4,2,0,-103,4,2,0,-102,4,4,0,-101,4,4,0,-100,4,4,0,-99,4,4,0,-98,4,4,0,-97,4,7, -0,-96,4,4,0,-95,4,4,0,-94,4,4,0,-93,4,4,0,-92,4,7,0,-91,4,7,0,-90,4,7,0,-89,4,7, -0,-88,4,7,0,-87,4,7,0,-86,4,7,0,-85,4,7,0,-84,4,7,0,-83,4,0,0,-82,4,0,0,-81,4,4, -0,-80,4,2,0,-79,4,2,0,12,1,0,0,-78,4,7,0,-77,4,7,0,-76,4,4,0,-75,4,4,0,-74,4,7, -0,-73,4,7,0,-72,4,2,0,-71,4,2,0,-70,4,7,0,-69,4,2,0,-68,4,2,0,-67,4,4,0,-66,4,2, -0,-65,4,2,0,-64,4,2,0,-63,4,2,0,-62,4,7,0,-61,4,7,0,70,0,42,0,-60,4,-91,0,9,0,-91, -0,0,0,-91,0,1,0,0,0,17,0,2,0,-59,4,2,0,-58,4,2,0,-57,4,2,0,43,0,7,0,-56,4,7, -0,70,0,-90,0,5,0,7,0,-55,4,0,0,18,0,0,0,43,0,0,0,70,0,0,0,12,1,-89,0,5,0,-89, -0,0,0,-89,0,1,0,4,0,-54,4,0,0,-53,4,4,0,20,0,-88,0,5,0,-87,0,-52,4,2,0,20,0,2, -0,-51,4,2,0,-50,4,2,0,-49,4,-86,0,4,0,2,0,109,0,2,0,-122,2,2,0,-48,4,2,0,-47,4,-85, -0,7,0,2,0,20,0,2,0,-46,4,2,0,-45,4,2,0,-44,4,-86,0,-43,4,7,0,-42,4,4,0,-41,4,-84, -0,4,0,-84,0,0,0,-84,0,1,0,0,0,-40,4,7,0,-39,4,-83,0,56,0,2,0,-38,4,2,0,-37,4,7, -0,-36,4,7,0,-35,4,2,0,-48,4,2,0,-34,4,7,0,-33,4,7,0,-32,4,2,0,-31,4,2,0,-30,4,2, -0,-29,4,2,0,-28,4,7,0,-27,4,7,0,-26,4,7,0,-25,4,7,0,37,0,2,0,-24,4,2,0,-23,4,2, -0,-22,4,2,0,-21,4,-88,0,-20,4,-85,0,-19,4,7,0,-18,4,7,0,-17,4,0,0,-16,4,0,0,-15,4,0, -0,-14,4,0,0,-13,4,0,0,-12,4,0,0,-11,4,2,0,-10,4,7,0,-9,4,7,0,-8,4,7,0,-7,4,7, -0,-6,4,7,0,-5,4,7,0,-4,4,7,0,-3,4,7,0,-2,4,7,0,-1,4,7,0,0,5,2,0,1,5,0, -0,2,5,0,0,3,5,0,0,4,5,0,0,5,5,32,0,6,5,0,0,7,5,0,0,8,5,0,0,9,5,0, -0,10,5,0,0,11,5,0,0,12,5,0,0,13,5,0,0,14,5,0,0,15,5,-82,0,6,0,2,0,109,0,0, -0,-122,2,0,0,16,5,0,0,17,5,0,0,20,0,0,0,-74,0,-81,0,26,0,-80,0,18,5,50,0,77,1,60, -0,19,5,-82,0,20,5,-82,0,21,5,-82,0,22,5,-82,0,23,5,-82,0,24,5,-82,0,25,5,-82,0,26,5,7, -0,27,5,2,0,28,5,2,0,47,1,2,0,29,5,2,0,1,2,0,0,30,5,0,0,31,5,0,0,32,5,0, -0,33,5,0,0,93,0,0,0,34,5,0,0,35,5,0,0,36,5,0,0,37,5,0,0,38,5,0,0,-74,0,-79, -0,43,0,27,0,31,0,32,0,39,5,-100,0,40,5,-79,0,41,5,46,0,-47,0,12,0,42,5,-98,0,43,5,7, -0,44,5,7,0,45,5,7,0,46,5,7,0,47,5,4,0,3,3,7,0,48,5,2,0,49,5,2,0,50,5,2, -0,51,5,2,0,52,5,2,0,53,5,2,0,54,5,2,0,55,5,2,0,5,1,57,0,1,1,9,0,56,5,-99, -0,57,5,-90,0,58,5,-83,0,59,5,-92,0,-73,0,-94,0,60,5,39,0,125,0,12,0,103,0,12,0,61,5,2, -0,62,5,2,0,63,5,2,0,64,5,2,0,65,5,-78,0,66,5,2,0,67,5,2,0,68,5,2,0,64,1,2, -0,-38,0,-81,0,69,5,4,0,70,5,4,0,37,0,-77,0,9,0,46,0,-47,0,45,0,0,1,7,0,8,2,7, -0,9,2,7,0,109,0,7,0,71,5,7,0,72,5,2,0,73,5,2,0,74,5,-76,0,75,0,-75,0,0,0,-75, -0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,7,0,79,5,7,0,80,5,7,0,81,5,7, -0,82,5,7,0,83,5,7,0,84,5,7,0,85,5,7,0,20,1,7,0,86,5,4,0,87,5,2,0,88,5,2, -0,17,5,32,0,39,5,32,0,89,5,-77,0,90,5,-76,0,91,5,-73,0,92,5,-72,0,93,5,-71,0,94,5,0, -0,95,5,2,0,30,4,2,0,96,5,4,0,3,3,4,0,97,5,2,0,98,5,2,0,99,5,2,0,100,5,0, -0,101,5,0,0,43,0,7,0,115,0,7,0,102,5,7,0,103,5,7,0,104,5,7,0,105,5,7,0,106,5,7, -0,107,5,7,0,108,5,7,0,-82,0,7,0,44,5,2,0,109,5,2,0,110,5,2,0,111,5,2,0,112,5,2, -0,-119,0,2,0,29,5,2,0,113,5,2,0,114,5,2,0,115,5,2,0,116,5,7,0,117,5,7,0,118,5,67, -0,119,5,12,0,120,5,2,0,121,5,2,0,53,2,2,0,122,5,2,0,20,0,2,0,123,5,2,0,124,5,2, -0,125,5,0,0,126,5,0,0,127,5,9,0,-128,5,-70,0,-127,5,7,0,-126,5,2,0,-125,5,2,0,-124,5,2, -0,53,5,2,0,54,5,-69,0,19,0,24,0,36,0,24,0,64,0,23,0,-123,5,23,0,-122,5,23,0,-121,5,7, -0,-120,5,7,0,-119,5,7,0,-118,5,7,0,-117,5,2,0,-116,5,2,0,-115,5,2,0,-114,5,2,0,-113,5,2, -0,-112,5,2,0,-111,5,4,0,20,0,7,0,-110,5,2,0,99,5,0,0,107,2,-75,0,6,0,-75,0,0,0,-75, -0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-68,0,6,0,-75,0,0,0,-75,0,1,0,4, -0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-67,0,27,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7, -0,76,5,-74,0,77,5,2,0,78,5,4,0,-109,5,4,0,70,0,-69,0,-108,5,9,0,-107,5,12,0,-106,5,36, -0,79,0,27,0,80,0,0,0,-105,5,0,0,-104,5,0,0,-103,5,2,0,-102,5,2,0,-101,5,2,0,-100,5,2, -0,-99,5,2,0,65,0,2,0,46,0,2,0,-119,0,2,0,-98,5,4,0,20,0,7,0,-97,5,24,0,36,0,-66, -0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-73,0,92,5,2,0,78,5,2, -0,-96,5,2,0,-95,5,2,0,-94,5,2,0,-93,5,-69,0,-108,5,2,0,-92,5,2,0,-119,0,2,0,-101,5,2, -0,-91,5,9,0,-90,5,2,0,29,5,0,0,-89,5,0,0,-88,5,2,0,-87,5,2,0,-86,5,2,0,12,3,2, -0,-85,5,2,0,-84,5,0,0,37,0,0,0,20,0,0,0,47,1,0,0,-83,5,-65,0,16,0,-75,0,0,0,-75, -0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69,0,-108,5,7,0,8,2,7,0,9,2,2, -0,-92,5,2,0,-82,5,2,0,-81,5,2,0,-80,5,4,0,20,0,7,0,71,5,-70,0,-127,5,-64,0,33,0,-75, -0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-63,0,-79,5,4,0,-78,5,0, -0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-74,5,2,0,20,0,2,0,-73,5,2,0,-72,5,2, -0,-71,5,2,0,-70,5,2,0,43,0,4,0,70,0,0,0,-69,5,-62,0,-68,5,2,0,-67,5,2,0,-66,5,2, -0,-65,5,2,0,-48,0,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9,0,-60,5,2,0,-59,5,0, -0,-58,5,-61,0,23,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, -0,-108,5,12,0,-57,5,2,0,-101,5,2,0,-56,5,2,0,20,0,2,0,57,0,9,0,-90,5,12,0,-55,5,-60, -0,-54,5,0,0,-53,5,-59,0,-52,5,4,0,-51,5,4,0,-50,5,2,0,18,0,2,0,-49,5,2,0,-48,5,2, -0,-47,5,-58,0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, -0,-108,5,46,0,-114,2,45,0,0,1,60,0,19,5,2,0,13,1,2,0,-119,0,2,0,-46,5,2,0,-45,5,4, -0,20,0,2,0,49,5,2,0,-44,5,2,0,-98,5,2,0,-101,5,7,0,71,5,0,0,-43,5,0,0,-42,5,0, -0,-41,5,0,0,-40,5,7,0,8,2,7,0,9,2,7,0,-39,5,7,0,-38,5,-70,0,-127,5,-57,0,11,0,-75, -0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,2,0,-119,0,2,0,-98,5,2, -0,-37,5,2,0,20,0,-69,0,-108,5,-56,0,24,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, -0,77,5,2,0,78,5,42,0,-36,5,4,0,-35,5,4,0,-34,5,2,0,93,0,2,0,-119,0,4,0,-33,5,4, -0,-32,5,4,0,-31,5,4,0,-30,5,4,0,-29,5,4,0,-28,5,4,0,-27,5,4,0,-26,5,7,0,-25,5,23, -0,-24,5,23,0,-23,5,4,0,-22,5,4,0,-21,5,-55,0,10,0,27,0,31,0,9,0,-20,5,9,0,-19,5,9, -0,-18,5,9,0,-17,5,9,0,-16,5,4,0,93,0,4,0,-15,5,0,0,-14,5,0,0,-13,5,-54,0,10,0,-75, -0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-55,0,-12,5,2,0,93,0,2,0,-119,0,4, -0,43,0,9,0,-11,5,-53,0,8,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-69, -0,-108,5,4,0,20,0,4,0,-10,5,-52,0,21,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, -0,77,5,2,0,78,5,-69,0,-108,5,27,0,-9,5,27,0,80,0,2,0,20,0,2,0,-119,0,7,0,-8,5,9, -0,-7,5,7,0,8,2,7,0,9,2,57,0,1,1,57,0,-6,5,4,0,-5,5,2,0,-89,5,2,0,37,0,-70, -0,-127,5,-51,0,42,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, -0,-108,5,-50,0,-4,5,0,0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-66,5,2,0,20,0,2, -0,-73,5,9,0,-7,5,4,0,-3,5,4,0,-2,5,4,0,-1,5,4,0,0,6,23,0,1,6,23,0,2,6,7, -0,3,6,7,0,4,6,7,0,5,6,7,0,-8,5,2,0,-67,5,2,0,-48,0,2,0,102,1,2,0,6,6,2, -0,37,0,2,0,43,0,2,0,7,6,2,0,8,6,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9, -0,-60,5,2,0,-59,5,0,0,-58,5,56,0,9,6,-49,0,20,0,0,0,10,6,0,0,11,6,0,0,12,6,0, -0,13,6,0,0,14,6,0,0,15,6,0,0,16,6,0,0,17,6,0,0,18,6,0,0,19,6,0,0,20,6,0, -0,21,6,0,0,22,6,0,0,23,6,0,0,24,6,0,0,25,6,0,0,26,6,0,0,27,6,0,0,68,2,0, -0,28,6,-48,0,54,0,0,0,29,6,0,0,20,6,0,0,21,6,0,0,30,6,0,0,31,6,0,0,32,6,0, -0,33,6,0,0,34,6,0,0,35,6,0,0,36,6,0,0,37,6,0,0,38,6,0,0,39,6,0,0,40,6,0, -0,41,6,0,0,42,6,0,0,43,6,0,0,44,6,0,0,45,6,0,0,46,6,0,0,47,6,0,0,48,6,0, -0,49,6,0,0,50,6,0,0,51,6,0,0,52,6,0,0,53,6,0,0,54,6,0,0,55,6,0,0,56,6,0, -0,57,6,0,0,58,6,0,0,95,0,0,0,59,6,0,0,60,6,0,0,61,6,0,0,62,6,0,0,63,6,0, -0,64,6,0,0,65,6,0,0,66,6,0,0,67,6,0,0,68,6,0,0,69,6,0,0,70,6,0,0,71,6,0, -0,72,6,0,0,73,6,0,0,74,6,0,0,75,6,0,0,76,6,0,0,77,6,0,0,78,6,0,0,79,6,-47, -0,5,0,0,0,80,6,0,0,37,6,0,0,39,6,2,0,20,0,2,0,37,0,-46,0,22,0,-46,0,0,0,-46, -0,1,0,0,0,17,0,-49,0,81,6,-48,0,82,6,-48,0,83,6,-48,0,84,6,-48,0,85,6,-48,0,86,6,-48, -0,87,6,-48,0,88,6,-48,0,89,6,-48,0,90,6,-48,0,91,6,-48,0,92,6,-48,0,93,6,-48,0,94,6,-48, -0,95,6,-48,0,96,6,-47,0,97,6,0,0,98,6,0,0,99,6,-45,0,5,0,4,0,20,0,4,0,37,0,7, -0,52,2,7,0,100,6,7,0,-31,1,-44,0,66,0,4,0,20,0,4,0,101,6,4,0,102,6,0,0,103,6,0, -0,104,6,0,0,105,6,0,0,106,6,0,0,107,6,0,0,108,6,0,0,109,6,0,0,110,6,0,0,111,6,2, -0,112,6,2,0,113,6,4,0,114,6,4,0,115,6,4,0,116,6,4,0,117,6,2,0,118,6,2,0,119,6,2, -0,120,6,2,0,121,6,4,0,122,6,4,0,123,6,2,0,124,6,2,0,125,6,2,0,126,6,2,0,127,6,0, -0,-128,6,12,0,-127,6,2,0,-126,6,2,0,-125,6,2,0,-124,6,2,0,-123,6,2,0,-122,6,2,0,-121,6,2, -0,-120,6,2,0,-119,6,-45,0,-118,6,2,0,-117,6,2,0,-116,6,2,0,-115,6,2,0,-114,6,4,0,-113,6,4, -0,-112,6,4,0,-111,6,4,0,-110,6,2,0,-109,6,2,0,-108,6,2,0,-107,6,2,0,-106,6,2,0,-105,6,2, -0,-104,6,2,0,-103,6,2,0,-102,6,2,0,-101,6,2,0,-100,6,2,0,-99,6,2,0,37,0,0,0,-98,6,0, -0,-97,6,0,0,-96,6,7,0,-95,6,2,0,55,5,2,0,-94,6,54,0,-93,6,-43,0,18,0,27,0,31,0,12, -0,-92,6,12,0,-91,6,12,0,-90,6,-79,0,-89,6,2,0,-105,2,2,0,-88,6,2,0,-104,2,2,0,-87,6,2, -0,-86,6,2,0,-85,6,2,0,-84,6,2,0,-83,6,2,0,-82,6,2,0,37,0,2,0,-81,6,2,0,-80,6,2, -0,-79,6,-42,0,5,0,-42,0,0,0,-42,0,1,0,-42,0,-78,6,13,0,-77,6,4,0,20,0,-41,0,7,0,-41, -0,0,0,-41,0,1,0,-42,0,-76,6,-42,0,-75,6,2,0,123,4,2,0,20,0,4,0,37,0,-40,0,17,0,-40, -0,0,0,-40,0,1,0,0,0,-74,6,0,0,-73,6,0,0,-72,6,2,0,-71,6,2,0,-70,6,2,0,-86,6,2, -0,-85,6,2,0,20,0,2,0,70,3,2,0,-69,6,2,0,-68,6,2,0,-67,6,2,0,-66,6,4,0,-65,6,-40, -0,-64,6,-74,0,30,0,-74,0,0,0,-74,0,1,0,-42,0,-76,6,-42,0,-75,6,-42,0,-63,6,-42,0,-62,6,-43, -0,-61,6,7,0,-60,6,23,0,52,0,23,0,-59,6,23,0,-58,6,2,0,-57,6,2,0,-56,6,2,0,-55,6,0, -0,75,5,0,0,-54,6,2,0,-53,6,2,0,-52,6,0,0,-51,6,0,0,-50,6,0,0,-49,6,0,0,-48,6,2, -0,-47,6,2,0,-46,6,2,0,-45,6,2,0,20,0,39,0,125,0,12,0,-44,6,12,0,-43,6,12,0,-42,6,-39, -0,11,0,0,0,-41,6,2,0,-40,6,2,0,-39,6,2,0,-38,6,2,0,-37,6,2,0,-36,6,2,0,107,4,9, -0,-35,6,9,0,-34,6,4,0,-33,6,4,0,-32,6,-38,0,1,0,0,0,-31,6,-37,0,8,0,56,0,-30,6,56, -0,-29,6,-37,0,-28,6,-37,0,-27,6,-37,0,-26,6,2,0,-123,0,2,0,20,0,4,0,-25,6,-36,0,4,0,4, -0,-35,5,4,0,-24,6,4,0,-31,5,4,0,-23,6,-35,0,2,0,4,0,-22,6,4,0,-21,6,-34,0,9,0,7, -0,-20,6,7,0,-19,6,7,0,-18,6,4,0,20,0,4,0,13,1,7,0,-19,3,7,0,-17,6,4,0,37,0,-33, -0,-16,6,-32,0,6,0,0,0,-15,6,0,0,-75,5,48,0,-116,0,2,0,109,0,2,0,111,4,4,0,37,0,-31, -0,21,0,-31,0,0,0,-31,0,1,0,4,0,57,0,4,0,23,0,4,0,28,0,4,0,-14,6,4,0,-13,6,4, -0,-12,6,-38,0,-11,6,0,0,-15,6,4,0,-10,6,4,0,-9,6,-32,0,-12,2,-36,0,-8,6,-35,0,-7,6,-34, -0,-6,6,-37,0,-5,6,-37,0,-4,6,-37,0,-3,6,56,0,-2,6,56,0,-1,6,-30,0,12,0,0,0,-68,1,9, -0,-62,0,0,0,-61,0,4,0,-58,0,4,0,-50,0,9,0,-57,0,7,0,-55,0,7,0,-54,0,9,0,0,7,9, -0,1,7,9,0,-53,0,9,0,-51,0,-29,0,43,0,-29,0,0,0,-29,0,1,0,9,0,2,7,9,0,26,0,0, -0,27,0,4,0,20,0,4,0,18,0,4,0,23,0,4,0,91,0,4,0,3,7,4,0,4,7,4,0,-13,6,4, -0,-12,6,4,0,5,7,4,0,-39,0,4,0,6,7,4,0,7,7,7,0,8,7,7,0,9,7,4,0,-126,0,4, -0,10,7,-31,0,11,7,36,0,79,0,-79,0,-89,6,48,0,-116,0,7,0,12,7,7,0,13,7,-30,0,2,1,-29, -0,14,7,-29,0,15,7,-29,0,16,7,12,0,17,7,-28,0,18,7,-27,0,19,7,7,0,20,7,7,0,21,7,4, -0,-84,6,7,0,22,7,9,0,23,7,4,0,24,7,4,0,25,7,4,0,26,7,7,0,27,7,-26,0,4,0,-26, -0,0,0,-26,0,1,0,12,0,28,7,-29,0,29,7,-25,0,6,0,12,0,30,7,12,0,17,7,12,0,31,7,2, -0,20,0,2,0,37,0,4,0,57,0,-24,0,4,0,7,0,32,7,7,0,112,0,2,0,33,7,2,0,34,7,-23, -0,6,0,7,0,35,7,7,0,36,7,7,0,37,7,7,0,38,7,4,0,39,7,4,0,40,7,-22,0,12,0,7, -0,41,7,7,0,42,7,7,0,43,7,7,0,44,7,7,0,45,7,7,0,46,7,7,0,47,7,7,0,48,7,7, -0,49,7,7,0,50,7,4,0,-110,2,4,0,51,7,-21,0,2,0,7,0,-55,4,7,0,37,0,-20,0,7,0,7, -0,52,7,7,0,53,7,4,0,93,0,4,0,108,2,4,0,54,7,4,0,55,7,4,0,37,0,-19,0,6,0,-19, -0,0,0,-19,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,-18,0,8,0,-18,0,0,0,-18, -0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,7,0,23,0,7,0,-126,0,-17,0,45,0,-17, -0,0,0,-17,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,2,0,-103,3,2,0,57,7,7, -0,58,7,7,0,92,0,7,0,-97,2,4,0,59,7,4,0,81,0,4,0,110,2,7,0,60,7,7,0,61,7,7, -0,62,7,7,0,63,7,7,0,64,7,7,0,65,7,7,0,-100,2,7,0,-1,0,7,0,66,7,7,0,67,7,7, -0,37,0,7,0,68,7,7,0,69,7,7,0,70,7,2,0,71,7,2,0,72,7,2,0,73,7,2,0,74,7,2, -0,75,7,2,0,76,7,2,0,77,7,2,0,78,7,2,0,123,5,2,0,79,7,2,0,-47,1,2,0,80,7,0, -0,81,7,0,0,82,7,7,0,-45,0,-16,0,83,7,63,0,-95,1,-15,0,16,0,-15,0,0,0,-15,0,1,0,2, -0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,7,0,-105,2,7,0,-104,2,7,0,-103,2,7,0,-5,1,7, -0,-102,2,7,0,-101,2,7,0,84,7,7,0,-100,2,7,0,-98,2,7,0,-97,2,-59,0,5,0,2,0,18,0,2, -0,-25,6,2,0,20,0,2,0,85,7,27,0,-9,5,-60,0,3,0,4,0,69,0,4,0,86,7,-59,0,2,0,-14, -0,12,0,-14,0,0,0,-14,0,1,0,2,0,18,0,2,0,20,0,2,0,31,3,2,0,-32,1,7,0,5,0,7, -0,6,0,7,0,87,7,7,0,88,7,27,0,-9,5,12,0,89,7,-13,0,11,0,-13,0,0,0,-13,0,1,0,0, -0,17,0,2,0,18,0,2,0,90,7,4,0,22,0,4,0,91,7,2,0,20,0,2,0,37,0,9,0,92,7,9, -0,93,7,-12,0,5,0,0,0,17,0,7,0,20,1,7,0,94,7,4,0,95,7,4,0,37,0,-11,0,4,0,2, -0,18,0,2,0,20,0,2,0,43,0,2,0,70,0,-10,0,4,0,0,0,17,0,62,0,96,7,7,0,20,1,7, -0,37,0,-9,0,6,0,2,0,97,7,2,0,98,7,2,0,18,0,2,0,99,7,0,0,100,7,0,0,101,7,-8, -0,5,0,4,0,18,0,4,0,37,0,0,0,17,0,0,0,102,7,0,0,103,7,-7,0,3,0,4,0,18,0,4, -0,37,0,0,0,17,0,-6,0,4,0,2,0,104,7,2,0,105,7,2,0,20,0,2,0,37,0,-5,0,6,0,0, -0,17,0,0,0,106,7,2,0,107,7,2,0,-100,2,2,0,13,1,2,0,70,0,-4,0,5,0,0,0,17,0,7, -0,112,0,7,0,-17,3,2,0,20,0,2,0,122,2,-3,0,3,0,0,0,17,0,4,0,110,2,4,0,104,7,-2, -0,7,0,0,0,17,0,7,0,-17,3,0,0,108,7,0,0,109,7,2,0,13,1,2,0,43,0,4,0,110,7,-1, -0,3,0,32,0,111,7,0,0,112,7,0,0,113,7,0,1,18,0,0,1,0,0,0,1,1,0,2,0,18,0,2, -0,90,7,2,0,20,0,2,0,114,7,2,0,115,7,2,0,116,7,2,0,43,0,2,0,70,0,0,0,17,0,9, -0,2,0,1,1,117,7,32,0,45,0,2,0,-47,4,2,0,20,7,2,0,118,7,2,0,37,0,2,1,11,0,0, -0,17,0,0,0,18,0,0,0,119,7,2,0,20,0,2,0,122,2,2,0,120,7,4,0,121,7,4,0,122,7,4, -0,123,7,4,0,124,7,4,0,125,7,3,1,1,0,0,0,126,7,4,1,4,0,42,0,-36,5,0,0,127,7,4, -0,13,1,4,0,20,0,1,1,18,0,1,1,0,0,1,1,1,0,1,1,-128,7,2,0,18,0,2,0,20,0,2, -0,-127,7,2,0,116,7,2,0,90,7,2,0,-126,7,2,0,70,0,2,0,12,1,0,0,17,0,9,0,2,0,5, -1,117,7,0,1,-125,7,2,0,15,0,2,0,-124,7,4,0,-123,7,6,1,3,0,4,0,-74,2,4,0,37,0,32, -0,45,0,7,1,12,0,-111,0,-122,7,2,0,18,0,2,0,20,0,4,0,58,7,4,0,92,0,0,0,17,0,0, -0,-121,7,2,0,-120,7,2,0,-119,7,2,0,-118,7,2,0,-117,7,7,0,-116,7,8,1,10,0,2,0,20,0,2, -0,-115,7,4,0,58,7,4,0,92,0,2,0,-114,7,-28,0,18,7,2,0,18,0,2,0,-113,7,2,0,-112,7,2, -0,-111,7,9,1,7,0,2,0,20,0,2,0,-115,7,4,0,58,7,4,0,92,0,2,0,18,0,2,0,-110,7,7, -0,109,3,10,1,11,0,4,0,-74,2,2,0,18,0,2,0,20,0,32,0,45,0,74,0,-109,7,0,0,17,0,7, -0,-108,7,7,0,-107,7,7,0,21,3,2,0,-106,7,2,0,-105,7,11,1,5,0,2,0,18,0,2,0,20,0,4, -0,37,0,-79,0,-89,6,32,0,39,5,12,1,5,0,4,0,20,0,4,0,18,0,0,0,17,0,0,0,102,7,32, -0,45,0,13,1,13,0,2,0,20,0,2,0,18,0,2,0,90,7,2,0,22,3,7,0,-104,7,7,0,-103,7,7, -0,7,1,7,0,8,1,7,0,-3,2,7,0,0,3,7,0,-102,7,7,0,-101,7,32,0,-100,7,14,1,10,0,2, -0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,0,0,-121,7,2,0,43,0,2,0,64,0,2, -0,-99,7,2,0,-98,7,15,1,8,0,32,0,45,0,7,0,-103,2,7,0,-97,7,7,0,-96,7,7,0,-108,2,2, -0,20,0,2,0,122,2,7,0,-95,7,16,1,12,0,2,0,18,0,2,0,13,1,2,0,20,0,2,0,-100,2,2, -0,-74,2,2,0,-94,7,4,0,37,0,7,0,-93,7,7,0,-92,7,7,0,-91,7,7,0,-90,7,0,0,-89,7,17, -1,10,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,2,0,68,2,2,0,64,0,2, -0,-99,7,2,0,-98,7,63,0,-95,1,18,1,7,0,4,0,110,2,4,0,-88,7,4,0,-87,7,4,0,-86,7,7, -0,-85,7,7,0,-84,7,0,0,108,7,19,1,7,0,0,0,-83,7,32,0,-82,7,0,0,112,7,2,0,-81,7,2, -0,43,0,4,0,70,0,0,0,113,7,20,1,6,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0, -0,-80,7,0,0,-79,7,21,1,1,0,4,0,20,0,22,1,6,0,0,0,95,0,2,0,18,0,2,0,20,0,4, -0,-78,7,7,0,-77,7,42,0,-36,5,23,1,4,0,0,0,-74,0,2,0,20,0,4,0,18,0,32,0,45,0,24, -1,2,0,4,0,18,0,4,0,-121,5,5,1,10,0,5,1,0,0,5,1,1,0,5,1,-128,7,2,0,18,0,2, -0,20,0,2,0,90,7,2,0,-76,7,0,0,17,0,9,0,2,0,32,0,45,0,25,1,10,0,7,0,21,3,7, -0,-75,7,7,0,-74,7,7,0,-73,7,7,0,-72,7,4,0,20,0,7,0,-94,7,7,0,-71,7,7,0,-70,7,7, -0,37,0,-28,0,20,0,27,0,31,0,0,0,-63,0,26,1,-69,7,9,0,-68,7,43,0,-104,0,43,0,-67,7,9, -0,-66,7,36,0,79,0,7,0,109,3,7,0,-65,7,7,0,-64,7,7,0,-63,7,7,0,-62,7,7,0,-61,7,7, -0,-60,7,4,0,93,0,4,0,-59,7,0,0,-58,7,0,0,-57,7,0,0,-56,7,27,1,6,0,27,0,31,0,7, -0,-55,7,7,0,-54,7,7,0,-53,7,2,0,-52,7,2,0,-51,7,28,1,14,0,-75,0,0,0,-75,0,1,0,4, -0,75,5,7,0,76,5,-74,0,77,5,-69,0,-108,5,-28,0,18,7,2,0,13,1,2,0,-115,7,2,0,8,2,2, -0,9,2,2,0,20,0,2,0,-98,5,4,0,70,0,29,1,6,0,29,1,0,0,29,1,1,0,32,0,45,0,9, -0,-50,7,4,0,-38,0,4,0,37,0,63,0,4,0,27,0,31,0,12,0,-49,7,4,0,-121,0,7,0,-48,7,30, -1,25,0,30,1,0,0,30,1,1,0,30,1,38,0,12,0,-47,7,0,0,17,0,7,0,-46,7,7,0,-45,7,7, -0,-44,7,7,0,-43,7,4,0,20,0,7,0,-42,7,7,0,-41,7,7,0,-40,7,7,0,20,1,7,0,-39,1,7, -0,-39,7,7,0,108,2,7,0,-38,7,7,0,-37,7,7,0,-36,7,7,0,-35,7,7,0,-34,7,7,0,-81,0,2, -0,-121,0,2,0,-31,4,31,1,19,0,27,0,31,0,12,0,-33,7,12,0,-32,7,4,0,20,0,4,0,30,4,2, -0,-96,2,2,0,-31,7,2,0,-121,0,2,0,-30,7,2,0,-29,7,2,0,-28,7,2,0,-27,7,2,0,-26,7,4, -0,-25,7,4,0,-24,7,4,0,-23,7,4,0,-22,7,4,0,-21,7,4,0,-20,7,32,1,34,0,32,1,0,0,32, -1,1,0,12,0,49,3,0,0,17,0,2,0,20,0,2,0,-19,7,2,0,-18,7,2,0,-17,7,2,0,10,3,2, -0,-16,7,4,0,-7,1,4,0,-23,7,4,0,-22,7,30,1,-15,7,32,1,38,0,32,1,-14,7,12,0,-13,7,9, -0,-12,7,9,0,-11,7,9,0,-10,7,7,0,7,1,7,0,-81,0,7,0,-57,1,7,0,-9,7,7,0,-8,7,7, -0,2,3,7,0,-7,7,7,0,-6,7,7,0,-5,7,7,0,-4,7,7,0,-3,7,7,0,-2,7,7,0,-10,1,32, -0,-1,7,-110,0,9,0,12,0,0,8,2,0,20,0,2,0,1,8,7,0,20,3,7,0,2,8,7,0,3,8,12, -0,4,8,4,0,5,8,4,0,37,0,33,1,7,0,33,1,0,0,33,1,1,0,12,0,-58,7,4,0,20,0,4, -0,6,8,0,0,17,0,-47,0,7,8,34,1,8,0,34,1,0,0,34,1,1,0,33,1,8,8,36,0,79,0,12, -0,-6,2,4,0,20,0,0,0,17,0,4,0,9,8,-111,0,6,0,27,0,31,0,12,0,0,8,12,0,10,8,12, -0,103,0,4,0,11,8,4,0,37,0,35,1,16,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, -0,77,5,2,0,78,5,-69,0,-108,5,-111,0,-9,2,0,0,13,1,0,0,-37,5,2,0,20,0,2,0,12,8,2, -0,-101,5,2,0,-98,5,2,0,13,8,7,0,14,8,36,1,5,0,36,1,0,0,36,1,1,0,36,0,79,0,2, -0,20,0,0,0,15,8,37,1,12,0,37,1,0,0,37,1,1,0,9,0,2,0,2,0,18,0,2,0,20,0,0, -0,16,8,0,0,17,8,0,0,15,8,7,0,18,8,7,0,19,8,4,0,37,0,36,0,79,0,38,1,9,0,38, -1,0,0,38,1,1,0,32,0,20,8,0,0,21,8,7,0,22,8,2,0,23,8,2,0,20,0,2,0,18,0,2, -0,37,0,39,1,7,0,42,0,-36,5,26,0,24,8,4,0,20,0,4,0,25,8,12,0,26,8,32,0,20,8,0, -0,21,8,40,1,12,0,32,0,20,8,2,0,27,8,2,0,20,0,2,0,28,8,2,0,29,8,0,0,21,8,32, -0,30,8,0,0,31,8,7,0,32,8,7,0,-39,1,7,0,33,8,7,0,34,8,41,1,6,0,32,0,20,8,4, -0,9,8,4,0,35,8,4,0,93,0,4,0,37,0,0,0,21,8,42,1,4,0,32,0,20,8,4,0,20,0,4, -0,9,8,0,0,21,8,43,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,44,1,10,0,32, -0,20,8,4,0,36,8,7,0,-127,0,4,0,20,0,2,0,-42,5,2,0,37,8,2,0,43,0,2,0,70,0,7, -0,38,8,0,0,21,8,45,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,46,1,10,0,32, -0,20,8,2,0,18,0,2,0,-95,3,4,0,91,0,4,0,92,0,7,0,-97,7,7,0,-96,7,4,0,37,0,-111, -0,-122,7,0,0,21,8,47,1,4,0,32,0,20,8,4,0,7,3,4,0,39,8,0,0,21,8,48,1,5,0,32, -0,20,8,7,0,-127,0,4,0,40,8,4,0,7,3,4,0,8,3,49,1,6,0,32,0,20,8,4,0,41,8,4, -0,42,8,7,0,43,8,7,0,44,8,0,0,21,8,50,1,16,0,32,0,20,8,32,0,-14,7,4,0,18,0,7, -0,45,8,7,0,46,8,7,0,47,8,7,0,48,8,7,0,49,8,7,0,50,8,7,0,51,8,7,0,52,8,7, -0,53,8,2,0,20,0,2,0,37,0,2,0,43,0,2,0,70,0,51,1,3,0,32,0,20,8,4,0,20,0,4, -0,123,5,52,1,5,0,32,0,20,8,4,0,20,0,4,0,37,0,7,0,54,8,0,0,21,8,53,1,10,0,32, -0,20,8,0,0,21,8,2,0,55,8,2,0,56,8,0,0,57,8,0,0,58,8,7,0,59,8,7,0,60,8,7, -0,61,8,7,0,62,8,54,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7,0,63,8,7, -0,64,8,2,0,20,0,2,0,123,5,55,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7, -0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,56,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7, -0,12,0,7,0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,57,1,7,0,32,0,20,8,0,0,21,8,7, -0,20,1,7,0,30,1,2,0,20,0,2,0,13,1,4,0,37,0,58,1,5,0,32,0,-45,2,7,0,20,1,2, -0,-41,2,0,0,-39,2,0,0,65,8,59,1,10,0,59,1,0,0,59,1,1,0,2,0,18,0,2,0,20,0,0, -0,66,8,7,0,-36,0,7,0,-35,0,2,0,-58,7,2,0,67,8,32,0,45,0,60,1,22,0,60,1,0,0,60, -1,1,0,2,0,20,0,2,0,13,1,2,0,68,8,2,0,69,8,36,0,79,0,-111,0,-122,7,32,0,-89,0,7, -0,91,0,7,0,92,0,7,0,70,8,7,0,71,8,7,0,72,8,7,0,73,8,7,0,-107,2,7,0,-67,1,7, -0,-120,7,7,0,74,8,0,0,75,8,0,0,76,8,12,0,-4,2,61,1,8,0,7,0,-31,1,7,0,-97,7,7, -0,-96,7,9,0,2,0,2,0,77,8,2,0,78,8,2,0,79,8,2,0,80,8,62,1,18,0,62,1,0,0,62, -1,1,0,62,1,81,8,0,0,17,0,61,1,82,8,2,0,18,0,2,0,20,0,2,0,83,8,2,0,84,8,2, -0,85,8,2,0,86,8,4,0,43,0,7,0,87,8,7,0,88,8,4,0,89,8,4,0,90,8,62,1,91,8,63, -1,92,8,64,1,32,0,64,1,0,0,64,1,1,0,64,1,93,8,0,0,17,0,0,0,94,8,2,0,18,0,2, -0,20,0,2,0,-14,6,2,0,20,7,2,0,95,8,2,0,-119,0,2,0,84,8,2,0,-25,6,12,0,-127,7,12, -0,96,8,27,0,-9,5,9,0,97,8,7,0,87,8,7,0,88,8,7,0,-5,1,7,0,98,8,2,0,99,8,2, -0,100,8,7,0,101,8,7,0,102,8,2,0,103,8,2,0,104,8,24,0,105,8,24,0,106,8,24,0,107,8,65, -1,-103,0,66,1,108,8,63,1,6,0,63,1,0,0,63,1,1,0,64,1,109,8,64,1,110,8,62,1,111,8,62, -1,91,8,57,0,16,0,27,0,31,0,12,0,112,8,12,0,113,8,61,1,114,8,12,0,115,8,4,0,18,0,4, -0,116,8,4,0,117,8,4,0,118,8,12,0,119,8,66,1,120,8,62,1,121,8,62,1,122,8,9,0,123,8,9, -0,124,8,4,0,125,8,67,1,6,0,4,0,-128,0,4,0,-126,0,4,0,-25,6,0,0,126,8,0,0,127,8,2, -0,37,0,68,1,16,0,2,0,-86,6,2,0,-85,6,2,0,-128,8,2,0,-74,7,2,0,-127,8,2,0,68,0,7, -0,-108,2,7,0,-126,8,7,0,-125,8,2,0,34,1,0,0,-124,8,0,0,42,4,2,0,-123,8,2,0,37,0,4, -0,-122,8,4,0,-121,8,69,1,9,0,7,0,-120,8,7,0,-119,8,7,0,-60,7,7,0,112,0,7,0,-118,8,7, -0,71,5,2,0,-117,8,0,0,-116,8,0,0,37,0,70,1,4,0,7,0,-115,8,7,0,-114,8,2,0,-117,8,2, -0,37,0,71,1,3,0,7,0,-113,8,7,0,-112,8,7,0,15,0,72,1,7,0,0,0,-68,1,2,0,109,4,2, -0,110,4,2,0,111,4,2,0,62,4,4,0,-126,0,4,0,-97,3,73,1,7,0,7,0,-111,8,7,0,-110,8,7, -0,-109,8,7,0,4,2,7,0,-108,8,7,0,-107,8,7,0,-106,8,74,1,4,0,2,0,-105,8,2,0,-104,8,2, -0,-103,8,2,0,-102,8,75,1,2,0,7,0,5,0,7,0,6,0,76,1,2,0,0,0,-87,0,0,0,-101,8,77, -1,1,0,0,0,17,0,78,1,10,0,0,0,-100,8,0,0,-99,8,0,0,-98,8,0,0,-97,8,2,0,-128,8,2, -0,-96,8,7,0,-95,8,7,0,-94,8,7,0,-93,8,7,0,-67,1,79,1,2,0,9,0,-92,8,9,0,-91,8,80, -1,11,0,0,0,111,4,0,0,18,0,0,0,-117,8,0,0,112,0,0,0,-90,8,0,0,109,0,0,0,-74,0,7, -0,-89,8,7,0,-88,8,7,0,-87,8,7,0,-86,8,81,1,8,0,7,0,97,7,7,0,-127,0,7,0,42,4,7, -0,72,2,7,0,-85,8,7,0,-49,0,7,0,-84,8,4,0,18,0,82,1,4,0,2,0,-83,8,2,0,-82,8,2, -0,-81,8,2,0,37,0,83,1,1,0,0,0,17,0,84,1,4,0,7,0,5,0,7,0,6,0,2,0,20,0,2, -0,-80,8,85,1,10,0,2,0,-120,3,2,0,20,0,7,0,-17,3,7,0,-79,8,7,0,-78,8,7,0,-77,8,7, -0,-76,8,84,1,-75,8,84,1,-74,8,84,1,-73,8,60,0,9,0,4,0,20,0,4,0,64,0,24,0,-72,8,24, -0,-71,8,85,1,-70,8,7,0,-69,8,7,0,-68,8,7,0,-67,8,7,0,-66,8,86,1,4,0,46,0,-114,2,7, -0,-65,8,7,0,92,1,7,0,37,0,-87,0,13,0,27,0,31,0,2,0,20,0,2,0,72,5,4,0,109,0,7, -0,-64,8,7,0,1,2,7,0,-63,8,7,0,-62,8,7,0,92,1,2,0,47,1,2,0,37,0,50,0,77,1,86, -1,-61,8,87,1,10,0,4,0,18,0,4,0,-127,0,4,0,20,0,4,0,70,3,4,0,-60,8,4,0,-59,8,4, -0,-58,8,0,0,95,0,0,0,17,0,9,0,2,0,84,0,6,0,87,1,-57,8,4,0,-56,8,4,0,-55,8,4, -0,-54,8,4,0,37,0,9,0,-53,8,88,1,5,0,7,0,66,2,7,0,-74,2,7,0,-39,1,2,0,-52,8,2, -0,37,0,89,1,5,0,7,0,66,2,7,0,-51,8,7,0,-50,8,7,0,-49,8,7,0,-74,2,90,1,7,0,4, -0,-48,8,4,0,-47,8,4,0,-46,8,7,0,-45,8,7,0,-44,8,7,0,-43,8,7,0,-42,8,91,1,26,0,32, -0,-41,8,89,1,66,3,89,1,-40,8,88,1,-39,8,89,1,83,7,7,0,-38,8,7,0,-37,8,7,0,-36,8,7, -0,-35,8,7,0,-44,8,7,0,-43,8,7,0,-74,2,7,0,-97,2,7,0,-34,8,7,0,-33,8,7,0,109,0,7, -0,-32,8,4,0,-48,8,4,0,-31,8,4,0,37,0,4,0,81,0,4,0,-30,8,2,0,20,0,2,0,-29,8,2, -0,-28,8,2,0,100,3,92,1,112,0,27,0,31,0,4,0,20,0,2,0,18,0,2,0,55,8,2,0,-27,8,2, -0,-26,8,2,0,-25,8,2,0,-24,8,2,0,-23,8,2,0,-22,8,2,0,-21,8,2,0,-20,8,2,0,-19,8,2, -0,-18,8,2,0,-17,8,2,0,-16,8,2,0,-15,8,2,0,-14,8,2,0,-13,8,2,0,-47,1,2,0,76,7,2, -0,51,7,2,0,-12,8,2,0,-11,8,2,0,98,3,2,0,99,3,2,0,-10,8,2,0,-9,8,2,0,-8,8,2, -0,-7,8,2,0,-6,8,2,0,-5,8,7,0,-4,8,7,0,-3,8,7,0,-2,8,2,0,-1,8,2,0,0,9,7, -0,1,9,7,0,2,9,7,0,3,9,7,0,58,7,7,0,92,0,7,0,-97,2,7,0,64,7,7,0,4,9,7, -0,5,9,7,0,6,9,7,0,7,9,7,0,57,0,4,0,59,7,4,0,57,7,4,0,8,9,7,0,60,7,7, -0,61,7,7,0,62,7,7,0,9,9,7,0,10,9,7,0,11,9,7,0,12,9,7,0,13,9,7,0,14,9,7, -0,15,9,7,0,16,9,7,0,21,3,7,0,109,0,7,0,17,9,7,0,18,9,7,0,19,9,7,0,20,9,7, -0,21,9,7,0,22,9,7,0,108,2,7,0,23,9,7,0,24,9,4,0,25,9,4,0,26,9,7,0,27,9,7, -0,28,9,7,0,29,9,7,0,30,9,7,0,31,9,7,0,32,9,7,0,33,9,7,0,34,9,7,0,94,3,7, -0,92,3,7,0,93,3,7,0,35,9,7,0,36,9,7,0,37,9,7,0,38,9,7,0,39,9,7,0,40,9,7, -0,41,9,7,0,42,9,7,0,43,9,7,0,28,3,7,0,44,9,7,0,45,9,7,0,46,9,7,0,47,9,7, -0,48,9,7,0,49,9,7,0,50,9,0,0,51,9,63,0,55,3,63,0,52,9,32,0,53,9,32,0,54,9,36, -0,79,0,-108,0,53,3,-108,0,55,9,-120,0,37,0,-120,0,0,0,-120,0,1,0,92,1,56,9,91,1,-121,3,90, -1,-14,7,93,1,57,9,94,1,58,9,94,1,59,9,12,0,60,9,12,0,61,9,-107,0,54,3,32,0,62,9,32, -0,63,9,32,0,64,9,12,0,65,9,12,0,66,9,7,0,-45,0,7,0,83,4,4,0,110,2,4,0,20,0,4, -0,59,7,4,0,67,9,4,0,68,9,4,0,69,9,4,0,57,0,2,0,-38,0,2,0,70,9,2,0,71,9,2, -0,72,9,2,0,47,3,2,0,73,9,0,0,74,9,2,0,75,9,2,0,76,9,2,0,77,9,9,0,78,9,125, -0,-76,3,123,0,34,0,95,1,79,9,7,0,-106,3,7,0,80,9,7,0,81,9,7,0,-14,3,7,0,82,9,7, -0,31,3,7,0,21,3,7,0,83,9,7,0,3,2,7,0,84,9,7,0,85,9,7,0,86,9,7,0,87,9,7, -0,88,9,7,0,89,9,7,0,-105,3,7,0,90,9,7,0,91,9,7,0,92,9,7,0,-104,3,7,0,-108,3,7, -0,-107,3,4,0,93,9,4,0,93,0,4,0,94,9,4,0,95,9,2,0,96,9,2,0,97,9,2,0,98,9,2, -0,99,9,2,0,100,9,2,0,37,0,4,0,70,0,124,0,8,0,95,1,101,9,7,0,102,9,7,0,103,9,7, -0,-94,1,7,0,104,9,4,0,93,0,2,0,105,9,2,0,106,9,96,1,4,0,7,0,5,0,7,0,6,0,7, -0,7,0,7,0,107,9,97,1,6,0,97,1,0,0,97,1,1,0,96,1,108,9,4,0,109,9,2,0,110,9,2, -0,20,0,98,1,5,0,98,1,0,0,98,1,1,0,12,0,111,9,4,0,112,9,4,0,20,0,99,1,9,0,99, -1,0,0,99,1,1,0,12,0,-128,0,98,1,113,9,4,0,20,0,2,0,110,9,2,0,114,9,7,0,94,0,0, -0,115,9,-70,0,5,0,12,0,125,4,4,0,20,0,2,0,116,9,2,0,117,9,9,0,118,9,69,78,68,66,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; -int DNAlen64= sizeof(DNAstr64); +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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. +*/ +unsigned char DNAstr64[]= { +83,68,78,65,78,65,77,69,119,9,0,0,42,110,101,120,116,0,42,112,114,101,118,0,42,100,97,116,97,0,42,102,105, +114,115,116,0,42,108,97,115,116,0,120,0,121,0,122,0,119,0,120,109,105,110,0,120,109,97,120,0,121,109,105,110, +0,121,109,97,120,0,42,112,111,105,110,116,101,114,0,103,114,111,117,112,0,118,97,108,0,118,97,108,50,0,110,97, +109,101,91,51,50,93,0,116,121,112,101,0,115,117,98,116,121,112,101,0,102,108,97,103,0,115,97,118,101,100,0,100, +97,116,97,0,108,101,110,0,116,111,116,97,108,108,101,110,0,42,110,101,119,105,100,0,42,108,105,98,0,110,97,109, +101,91,50,52,93,0,117,115,0,105,99,111,110,95,105,100,0,42,112,114,111,112,101,114,116,105,101,115,0,105,100,0, +42,105,100,98,108,111,99,107,0,42,102,105,108,101,100,97,116,97,0,110,97,109,101,91,50,52,48,93,0,102,105,108, +101,110,97,109,101,91,50,52,48,93,0,116,111,116,0,112,97,100,0,42,112,97,114,101,110,116,0,119,91,50,93,0, +104,91,50,93,0,99,104,97,110,103,101,100,91,50,93,0,112,97,100,48,0,112,97,100,49,0,42,114,101,99,116,91, +50,93,0,42,111,98,0,98,108,111,99,107,116,121,112,101,0,97,100,114,99,111,100,101,0,110,97,109,101,91,49,50, +56,93,0,42,98,112,0,42,98,101,122,116,0,109,97,120,114,99,116,0,116,111,116,114,99,116,0,118,97,114,116,121, +112,101,0,116,111,116,118,101,114,116,0,105,112,111,0,101,120,116,114,97,112,0,114,116,0,98,105,116,109,97,115,107, +0,115,108,105,100,101,95,109,105,110,0,115,108,105,100,101,95,109,97,120,0,99,117,114,118,97,108,0,42,100,114,105, +118,101,114,0,99,117,114,118,101,0,99,117,114,0,115,104,111,119,107,101,121,0,109,117,116,101,105,112,111,0,112,111, +115,0,114,101,108,97,116,105,118,101,0,116,111,116,101,108,101,109,0,112,97,100,50,0,42,119,101,105,103,104,116,115, +0,118,103,114,111,117,112,91,51,50,93,0,115,108,105,100,101,114,109,105,110,0,115,108,105,100,101,114,109,97,120,0, +42,114,101,102,107,101,121,0,101,108,101,109,115,116,114,91,51,50,93,0,101,108,101,109,115,105,122,101,0,98,108,111, +99,107,0,42,105,112,111,0,42,102,114,111,109,0,116,111,116,107,101,121,0,115,108,117,114,112,104,0,42,42,115,99, +114,105,112,116,115,0,42,102,108,97,103,0,97,99,116,115,99,114,105,112,116,0,116,111,116,115,99,114,105,112,116,0, +42,108,105,110,101,0,42,102,111,114,109,97,116,0,98,108,101,110,0,108,105,110,101,110,111,0,115,116,97,114,116,0, +101,110,100,0,102,108,97,103,115,0,99,111,108,111,114,91,52,93,0,112,97,100,91,52,93,0,42,110,97,109,101,0, +110,108,105,110,101,115,0,108,105,110,101,115,0,42,99,117,114,108,0,42,115,101,108,108,0,99,117,114,99,0,115,101, +108,99,0,109,97,114,107,101,114,115,0,42,117,110,100,111,95,98,117,102,0,117,110,100,111,95,112,111,115,0,117,110, +100,111,95,108,101,110,0,42,99,111,109,112,105,108,101,100,0,109,116,105,109,101,0,115,105,122,101,0,115,101,101,107, +0,112,97,115,115,101,112,97,114,116,97,108,112,104,97,0,97,110,103,108,101,0,99,108,105,112,115,116,97,0,99,108, +105,112,101,110,100,0,108,101,110,115,0,111,114,116,104,111,95,115,99,97,108,101,0,100,114,97,119,115,105,122,101,0, +115,104,105,102,116,120,0,115,104,105,102,116,121,0,89,70,95,100,111,102,100,105,115,116,0,89,70,95,97,112,101,114, +116,117,114,101,0,89,70,95,98,107,104,116,121,112,101,0,89,70,95,98,107,104,98,105,97,115,0,89,70,95,98,107, +104,114,111,116,0,115,99,114,105,112,116,108,105,110,107,0,42,100,111,102,95,111,98,0,102,114,97,109,101,110,114,0, +102,114,97,109,101,115,0,111,102,102,115,101,116,0,115,102,114,97,0,102,105,101,95,105,109,97,0,99,121,99,108,0, +111,107,0,109,117,108,116,105,95,105,110,100,101,120,0,108,97,121,101,114,0,112,97,115,115,0,109,101,110,117,110,114, +0,105,98,117,102,115,0,42,103,112,117,116,101,120,116,117,114,101,0,42,97,110,105,109,0,42,114,114,0,115,111,117, +114,99,101,0,108,97,115,116,102,114,97,109,101,0,116,112,97,103,101,102,108,97,103,0,116,111,116,98,105,110,100,0, +120,114,101,112,0,121,114,101,112,0,116,119,115,116,97,0,116,119,101,110,100,0,98,105,110,100,99,111,100,101,0,42, +114,101,112,98,105,110,100,0,42,112,97,99,107,101,100,102,105,108,101,0,42,112,114,101,118,105,101,119,0,108,97,115, +116,117,112,100,97,116,101,0,108,97,115,116,117,115,101,100,0,97,110,105,109,115,112,101,101,100,0,103,101,110,95,120, +0,103,101,110,95,121,0,103,101,110,95,116,121,112,101,0,97,115,112,120,0,97,115,112,121,0,42,118,110,111,100,101, +0,116,101,120,99,111,0,109,97,112,116,111,0,109,97,112,116,111,110,101,103,0,98,108,101,110,100,116,121,112,101,0, +42,111,98,106,101,99,116,0,42,116,101,120,0,117,118,110,97,109,101,91,51,50,93,0,112,114,111,106,120,0,112,114, +111,106,121,0,112,114,111,106,122,0,109,97,112,112,105,110,103,0,111,102,115,91,51,93,0,115,105,122,101,91,51,93, +0,116,101,120,102,108,97,103,0,99,111,108,111,114,109,111,100,101,108,0,112,109,97,112,116,111,0,112,109,97,112,116, +111,110,101,103,0,110,111,114,109,97,112,115,112,97,99,101,0,119,104,105,99,104,95,111,117,116,112,117,116,0,112,97, +100,91,50,93,0,114,0,103,0,98,0,107,0,100,101,102,95,118,97,114,0,99,111,108,102,97,99,0,110,111,114,102, +97,99,0,118,97,114,102,97,99,0,100,105,115,112,102,97,99,0,119,97,114,112,102,97,99,0,110,97,109,101,91,49, +54,48,93,0,42,104,97,110,100,108,101,0,42,112,110,97,109,101,0,42,115,116,110,97,109,101,115,0,115,116,121,112, +101,115,0,118,97,114,115,0,42,118,97,114,115,116,114,0,42,114,101,115,117,108,116,0,42,99,102,114,97,0,100,97, +116,97,91,51,50,93,0,40,42,100,111,105,116,41,40,41,0,40,42,105,110,115,116,97,110,99,101,95,105,110,105,116, +41,40,41,0,40,42,99,97,108,108,98,97,99,107,41,40,41,0,118,101,114,115,105,111,110,0,97,0,105,112,111,116, +121,112,101,0,42,105,109,97,0,42,99,117,98,101,91,54,93,0,105,109,97,116,91,52,93,91,52,93,0,111,98,105, +109,97,116,91,51,93,91,51,93,0,115,116,121,112,101,0,118,105,101,119,115,99,97,108,101,0,110,111,116,108,97,121, +0,99,117,98,101,114,101,115,0,100,101,112,116,104,0,114,101,99,97,108,99,0,108,97,115,116,115,105,122,101,0,110, +111,105,115,101,115,105,122,101,0,116,117,114,98,117,108,0,98,114,105,103,104,116,0,99,111,110,116,114,97,115,116,0, +114,102,97,99,0,103,102,97,99,0,98,102,97,99,0,102,105,108,116,101,114,115,105,122,101,0,109,103,95,72,0,109, +103,95,108,97,99,117,110,97,114,105,116,121,0,109,103,95,111,99,116,97,118,101,115,0,109,103,95,111,102,102,115,101, +116,0,109,103,95,103,97,105,110,0,100,105,115,116,95,97,109,111,117,110,116,0,110,115,95,111,117,116,115,99,97,108, +101,0,118,110,95,119,49,0,118,110,95,119,50,0,118,110,95,119,51,0,118,110,95,119,52,0,118,110,95,109,101,120, +112,0,118,110,95,100,105,115,116,109,0,118,110,95,99,111,108,116,121,112,101,0,110,111,105,115,101,100,101,112,116,104, +0,110,111,105,115,101,116,121,112,101,0,110,111,105,115,101,98,97,115,105,115,0,110,111,105,115,101,98,97,115,105,115, +50,0,105,109,97,102,108,97,103,0,99,114,111,112,120,109,105,110,0,99,114,111,112,121,109,105,110,0,99,114,111,112, +120,109,97,120,0,99,114,111,112,121,109,97,120,0,120,114,101,112,101,97,116,0,121,114,101,112,101,97,116,0,101,120, +116,101,110,100,0,99,104,101,99,107,101,114,100,105,115,116,0,110,97,98,108,97,0,105,117,115,101,114,0,42,110,111, +100,101,116,114,101,101,0,42,112,108,117,103,105,110,0,42,99,111,98,97,0,42,101,110,118,0,117,115,101,95,110,111, +100,101,115,0,112,97,100,91,55,93,0,108,111,99,91,51,93,0,114,111,116,91,51,93,0,109,97,116,91,52,93,91, +52,93,0,109,105,110,91,51,93,0,109,97,120,91,51,93,0,112,97,100,51,0,109,111,100,101,0,116,111,116,101,120, +0,115,104,100,119,114,0,115,104,100,119,103,0,115,104,100,119,98,0,115,104,100,119,112,97,100,0,101,110,101,114,103, +121,0,100,105,115,116,0,115,112,111,116,115,105,122,101,0,115,112,111,116,98,108,101,110,100,0,104,97,105,110,116,0, +97,116,116,49,0,97,116,116,50,0,42,99,117,114,102,97,108,108,111,102,102,0,102,97,108,108,111,102,102,95,116,121, +112,101,0,115,104,97,100,115,112,111,116,115,105,122,101,0,98,105,97,115,0,115,111,102,116,0,98,117,102,115,105,122, +101,0,115,97,109,112,0,98,117,102,102,101,114,115,0,102,105,108,116,101,114,116,121,112,101,0,98,117,102,102,108,97, +103,0,98,117,102,116,121,112,101,0,114,97,121,95,115,97,109,112,0,114,97,121,95,115,97,109,112,121,0,114,97,121, +95,115,97,109,112,122,0,114,97,121,95,115,97,109,112,95,116,121,112,101,0,97,114,101,97,95,115,104,97,112,101,0, +97,114,101,97,95,115,105,122,101,0,97,114,101,97,95,115,105,122,101,121,0,97,114,101,97,95,115,105,122,101,122,0, +97,100,97,112,116,95,116,104,114,101,115,104,0,114,97,121,95,115,97,109,112,95,109,101,116,104,111,100,0,116,101,120, +97,99,116,0,115,104,97,100,104,97,108,111,115,116,101,112,0,115,117,110,95,101,102,102,101,99,116,95,116,121,112,101, +0,115,107,121,98,108,101,110,100,116,121,112,101,0,104,111,114,105,122,111,110,95,98,114,105,103,104,116,110,101,115,115, +0,115,112,114,101,97,100,0,115,117,110,95,98,114,105,103,104,116,110,101,115,115,0,115,117,110,95,115,105,122,101,0, +98,97,99,107,115,99,97,116,116,101,114,101,100,95,108,105,103,104,116,0,115,117,110,95,105,110,116,101,110,115,105,116, +121,0,97,116,109,95,116,117,114,98,105,100,105,116,121,0,97,116,109,95,105,110,115,99,97,116,116,101,114,105,110,103, +95,102,97,99,116,111,114,0,97,116,109,95,101,120,116,105,110,99,116,105,111,110,95,102,97,99,116,111,114,0,97,116, +109,95,100,105,115,116,97,110,99,101,95,102,97,99,116,111,114,0,115,107,121,98,108,101,110,100,102,97,99,0,115,107, +121,95,101,120,112,111,115,117,114,101,0,115,107,121,95,99,111,108,111,114,115,112,97,99,101,0,112,97,100,52,0,89, +70,95,110,117,109,112,104,111,116,111,110,115,0,89,70,95,110,117,109,115,101,97,114,99,104,0,89,70,95,112,104,100, +101,112,116,104,0,89,70,95,117,115,101,113,109,99,0,89,70,95,98,117,102,115,105,122,101,0,89,70,95,112,97,100, +0,89,70,95,99,97,117,115,116,105,99,98,108,117,114,0,89,70,95,108,116,114,97,100,105,117,115,0,89,70,95,103, +108,111,119,105,110,116,0,89,70,95,103,108,111,119,111,102,115,0,89,70,95,103,108,111,119,116,121,112,101,0,89,70, +95,112,97,100,50,0,42,109,116,101,120,91,49,56,93,0,115,112,101,99,114,0,115,112,101,99,103,0,115,112,101,99, +98,0,109,105,114,114,0,109,105,114,103,0,109,105,114,98,0,97,109,98,114,0,97,109,98,98,0,97,109,98,103,0, +97,109,98,0,101,109,105,116,0,97,110,103,0,115,112,101,99,116,114,97,0,114,97,121,95,109,105,114,114,111,114,0, +97,108,112,104,97,0,114,101,102,0,115,112,101,99,0,122,111,102,102,115,0,97,100,100,0,116,114,97,110,115,108,117, +99,101,110,99,121,0,102,114,101,115,110,101,108,95,109,105,114,0,102,114,101,115,110,101,108,95,109,105,114,95,105,0, +102,114,101,115,110,101,108,95,116,114,97,0,102,114,101,115,110,101,108,95,116,114,97,95,105,0,102,105,108,116,101,114, +0,116,120,95,108,105,109,105,116,0,116,120,95,102,97,108,108,111,102,102,0,114,97,121,95,100,101,112,116,104,0,114, +97,121,95,100,101,112,116,104,95,116,114,97,0,104,97,114,0,115,101,101,100,49,0,115,101,101,100,50,0,103,108,111, +115,115,95,109,105,114,0,103,108,111,115,115,95,116,114,97,0,115,97,109,112,95,103,108,111,115,115,95,109,105,114,0, +115,97,109,112,95,103,108,111,115,115,95,116,114,97,0,97,100,97,112,116,95,116,104,114,101,115,104,95,109,105,114,0, +97,100,97,112,116,95,116,104,114,101,115,104,95,116,114,97,0,97,110,105,115,111,95,103,108,111,115,115,95,109,105,114, +0,100,105,115,116,95,109,105,114,0,102,97,100,101,116,111,95,109,105,114,0,115,104,97,100,101,95,102,108,97,103,0, +109,111,100,101,95,108,0,102,108,97,114,101,99,0,115,116,97,114,99,0,108,105,110,101,99,0,114,105,110,103,99,0, +104,97,115,105,122,101,0,102,108,97,114,101,115,105,122,101,0,115,117,98,115,105,122,101,0,102,108,97,114,101,98,111, +111,115,116,0,115,116,114,97,110,100,95,115,116,97,0,115,116,114,97,110,100,95,101,110,100,0,115,116,114,97,110,100, +95,101,97,115,101,0,115,116,114,97,110,100,95,115,117,114,102,110,111,114,0,115,116,114,97,110,100,95,109,105,110,0, +115,116,114,97,110,100,95,119,105,100,116,104,102,97,100,101,0,115,116,114,97,110,100,95,117,118,110,97,109,101,91,51, +50,93,0,115,98,105,97,115,0,108,98,105,97,115,0,115,104,97,100,95,97,108,112,104,97,0,115,101,112,116,101,120, +0,114,103,98,115,101,108,0,112,114,95,116,121,112,101,0,112,114,95,98,97,99,107,0,112,114,95,108,97,109,112,0, +109,108,95,102,108,97,103,0,100,105,102,102,95,115,104,97,100,101,114,0,115,112,101,99,95,115,104,97,100,101,114,0, +114,111,117,103,104,110,101,115,115,0,114,101,102,114,97,99,0,112,97,114,97,109,91,52,93,0,114,109,115,0,100,97, +114,107,110,101,115,115,0,42,114,97,109,112,95,99,111,108,0,42,114,97,109,112,95,115,112,101,99,0,114,97,109,112, +105,110,95,99,111,108,0,114,97,109,112,105,110,95,115,112,101,99,0,114,97,109,112,98,108,101,110,100,95,99,111,108, +0,114,97,109,112,98,108,101,110,100,95,115,112,101,99,0,114,97,109,112,95,115,104,111,119,0,114,97,109,112,102,97, +99,95,99,111,108,0,114,97,109,112,102,97,99,95,115,112,101,99,0,42,103,114,111,117,112,0,102,114,105,99,116,105, +111,110,0,102,104,0,114,101,102,108,101,99,116,0,102,104,100,105,115,116,0,120,121,102,114,105,99,116,0,100,121,110, +97,109,111,100,101,0,115,115,115,95,114,97,100,105,117,115,91,51,93,0,115,115,115,95,99,111,108,91,51,93,0,115, +115,115,95,101,114,114,111,114,0,115,115,115,95,115,99,97,108,101,0,115,115,115,95,105,111,114,0,115,115,115,95,99, +111,108,102,97,99,0,115,115,115,95,116,101,120,102,97,99,0,115,115,115,95,102,114,111,110,116,0,115,115,115,95,98, +97,99,107,0,115,115,115,95,102,108,97,103,0,115,115,115,95,112,114,101,115,101,116,0,89,70,95,97,114,0,89,70, +95,97,103,0,89,70,95,97,98,0,89,70,95,100,115,99,97,108,101,0,89,70,95,100,112,119,114,0,89,70,95,100, +115,109,112,0,89,70,95,112,114,101,115,101,116,0,89,70,95,100,106,105,116,0,103,112,117,109,97,116,101,114,105,97, +108,0,110,97,109,101,91,50,53,54,93,0,115,99,97,108,101,0,42,98,98,0,105,49,0,106,49,0,107,49,0,105, +50,0,106,50,0,107,50,0,115,101,108,99,111,108,49,0,115,101,108,99,111,108,50,0,113,117,97,116,91,52,93,0, +101,120,112,120,0,101,120,112,121,0,101,120,112,122,0,114,97,100,0,114,97,100,50,0,115,0,42,109,97,116,0,42, +105,109,97,116,0,101,108,101,109,115,0,100,105,115,112,0,42,42,109,97,116,0,116,111,116,99,111,108,0,119,105,114, +101,115,105,122,101,0,114,101,110,100,101,114,115,105,122,101,0,116,104,114,101,115,104,0,118,101,99,91,51,93,91,51, +93,0,97,108,102,97,0,119,101,105,103,104,116,0,114,97,100,105,117,115,0,104,49,0,104,50,0,102,49,0,102,50, +0,102,51,0,104,105,100,101,0,118,101,99,91,52,93,0,109,97,116,95,110,114,0,112,110,116,115,117,0,112,110,116, +115,118,0,114,101,115,111,108,117,0,114,101,115,111,108,118,0,111,114,100,101,114,117,0,111,114,100,101,114,118,0,102, +108,97,103,117,0,102,108,97,103,118,0,42,107,110,111,116,115,117,0,42,107,110,111,116,115,118,0,116,105,108,116,95, +105,110,116,101,114,112,0,114,97,100,105,117,115,95,105,110,116,101,114,112,0,99,104,97,114,105,100,120,0,107,101,114, +110,0,104,0,110,117,114,98,0,42,98,101,118,111,98,106,0,42,116,97,112,101,114,111,98,106,0,42,116,101,120,116, +111,110,99,117,114,118,101,0,42,112,97,116,104,0,42,107,101,121,0,98,101,118,0,112,97,116,104,108,101,110,0,98, +101,118,114,101,115,111,108,0,119,105,100,116,104,0,101,120,116,49,0,101,120,116,50,0,114,101,115,111,108,117,95,114, +101,110,0,114,101,115,111,108,118,95,114,101,110,0,115,112,97,99,101,109,111,100,101,0,115,112,97,99,105,110,103,0, +108,105,110,101,100,105,115,116,0,115,104,101,97,114,0,102,115,105,122,101,0,119,111,114,100,115,112,97,99,101,0,117, +108,112,111,115,0,117,108,104,101,105,103,104,116,0,120,111,102,0,121,111,102,0,108,105,110,101,119,105,100,116,104,0, +42,115,116,114,0,102,97,109,105,108,121,91,50,52,93,0,42,118,102,111,110,116,0,42,118,102,111,110,116,98,0,42, +118,102,111,110,116,105,0,42,118,102,111,110,116,98,105,0,115,101,112,99,104,97,114,0,116,111,116,98,111,120,0,97, +99,116,98,111,120,0,42,116,98,0,115,101,108,115,116,97,114,116,0,115,101,108,101,110,100,0,42,115,116,114,105,110, +102,111,0,99,117,114,105,110,102,111,0,101,102,102,101,99,116,0,42,109,102,97,99,101,0,42,109,116,102,97,99,101, +0,42,116,102,97,99,101,0,42,109,118,101,114,116,0,42,109,101,100,103,101,0,42,100,118,101,114,116,0,42,109,99, +111,108,0,42,109,115,116,105,99,107,121,0,42,116,101,120,99,111,109,101,115,104,0,42,109,115,101,108,101,99,116,0, +118,100,97,116,97,0,101,100,97,116,97,0,102,100,97,116,97,0,116,111,116,101,100,103,101,0,116,111,116,102,97,99, +101,0,116,111,116,115,101,108,101,99,116,0,97,99,116,95,102,97,99,101,0,99,117,98,101,109,97,112,115,105,122,101, +0,115,109,111,111,116,104,114,101,115,104,0,115,117,98,100,105,118,0,115,117,98,100,105,118,114,0,115,117,98,115,117, +114,102,116,121,112,101,0,42,109,114,0,42,112,118,0,42,116,112,97,103,101,0,117,118,91,52,93,91,50,93,0,99, +111,108,91,52,93,0,116,114,97,110,115,112,0,116,105,108,101,0,117,110,119,114,97,112,0,118,49,0,118,50,0,118, +51,0,118,52,0,101,100,99,111,100,101,0,99,114,101,97,115,101,0,98,119,101,105,103,104,116,0,100,101,102,95,110, +114,0,42,100,119,0,116,111,116,119,101,105,103,104,116,0,99,111,91,51,93,0,110,111,91,51,93,0,112,97,100,91, +51,93,0,117,118,91,50,93,0,99,111,91,50,93,0,105,110,100,101,120,0,102,0,105,0,115,91,50,53,54,93,0, +118,91,52,93,0,109,105,100,0,118,91,50,93,0,42,102,97,99,101,115,0,42,99,111,108,102,97,99,101,115,0,42, +101,100,103,101,115,0,42,101,100,103,101,95,98,111,117,110,100,97,114,121,95,115,116,97,116,101,115,0,42,118,101,114, +116,95,101,100,103,101,95,109,97,112,0,42,118,101,114,116,95,102,97,99,101,95,109,97,112,0,42,109,97,112,95,109, +101,109,0,42,118,101,114,116,115,0,108,101,118,101,108,115,0,108,101,118,101,108,95,99,111,117,110,116,0,99,117,114, +114,101,110,116,0,110,101,119,108,118,108,0,101,100,103,101,108,118,108,0,112,105,110,108,118,108,0,114,101,110,100,101, +114,108,118,108,0,117,115,101,95,99,111,108,0,42,101,100,103,101,95,102,108,97,103,115,0,42,101,100,103,101,95,99, +114,101,97,115,101,115,0,42,118,101,114,116,95,109,97,112,0,42,101,100,103,101,95,109,97,112,0,42,111,108,100,95, +102,97,99,101,115,0,42,111,108,100,95,101,100,103,101,115,0,42,101,114,114,111,114,0,109,111,100,105,102,105,101,114, +0,115,117,98,100,105,118,84,121,112,101,0,114,101,110,100,101,114,76,101,118,101,108,115,0,42,101,109,67,97,99,104, +101,0,42,109,67,97,99,104,101,0,100,101,102,97,120,105,115,0,112,97,100,91,54,93,0,108,101,110,103,116,104,0, +114,97,110,100,111,109,105,122,101,0,115,101,101,100,0,42,111,98,95,97,114,109,0,42,115,116,97,114,116,95,99,97, +112,0,42,101,110,100,95,99,97,112,0,42,99,117,114,118,101,95,111,98,0,42,111,102,102,115,101,116,95,111,98,0, +111,102,102,115,101,116,91,51,93,0,115,99,97,108,101,91,51,93,0,109,101,114,103,101,95,100,105,115,116,0,102,105, +116,95,116,121,112,101,0,111,102,102,115,101,116,95,116,121,112,101,0,99,111,117,110,116,0,97,120,105,115,0,116,111, +108,101,114,97,110,99,101,0,42,109,105,114,114,111,114,95,111,98,0,115,112,108,105,116,95,97,110,103,108,101,0,118, +97,108,117,101,0,114,101,115,0,118,97,108,95,102,108,97,103,115,0,108,105,109,95,102,108,97,103,115,0,101,95,102, +108,97,103,115,0,98,101,118,101,108,95,97,110,103,108,101,0,100,101,102,103,114,112,95,110,97,109,101,91,51,50,93, +0,42,116,101,120,116,117,114,101,0,115,116,114,101,110,103,116,104,0,100,105,114,101,99,116,105,111,110,0,109,105,100, +108,101,118,101,108,0,116,101,120,109,97,112,112,105,110,103,0,42,109,97,112,95,111,98,106,101,99,116,0,117,118,108, +97,121,101,114,95,110,97,109,101,91,51,50,93,0,117,118,108,97,121,101,114,95,116,109,112,0,42,112,114,111,106,101, +99,116,111,114,115,91,49,48,93,0,42,105,109,97,103,101,0,110,117,109,95,112,114,111,106,101,99,116,111,114,115,0, +97,115,112,101,99,116,120,0,97,115,112,101,99,116,121,0,112,101,114,99,101,110,116,0,102,97,99,101,67,111,117,110, +116,0,102,97,99,0,114,101,112,101,97,116,0,42,111,98,106,101,99,116,99,101,110,116,101,114,0,115,116,97,114,116, +120,0,115,116,97,114,116,121,0,104,101,105,103,104,116,0,110,97,114,114,111,119,0,115,112,101,101,100,0,100,97,109, +112,0,102,97,108,108,111,102,102,0,116,105,109,101,111,102,102,115,0,108,105,102,101,116,105,109,101,0,100,101,102,111, +114,109,102,108,97,103,0,109,117,108,116,105,0,42,112,114,101,118,67,111,115,0,112,97,114,101,110,116,105,110,118,91, +52,93,91,52,93,0,99,101,110,116,91,51,93,0,42,105,110,100,101,120,97,114,0,116,111,116,105,110,100,101,120,0, +102,111,114,99,101,0,42,99,108,111,116,104,79,98,106,101,99,116,0,42,115,105,109,95,112,97,114,109,115,0,42,99, +111,108,108,95,112,97,114,109,115,0,42,112,111,105,110,116,95,99,97,99,104,101,0,42,120,0,42,120,110,101,119,0, +42,120,111,108,100,0,42,99,117,114,114,101,110,116,95,120,110,101,119,0,42,99,117,114,114,101,110,116,95,120,0,42, +99,117,114,114,101,110,116,95,118,0,42,109,102,97,99,101,115,0,110,117,109,118,101,114,116,115,0,110,117,109,102,97, +99,101,115,0,97,98,115,111,114,112,116,105,111,110,0,116,105,109,101,0,42,98,118,104,116,114,101,101,0,42,100,109, +0,111,112,101,114,97,116,105,111,110,0,118,101,114,116,101,120,0,116,111,116,105,110,102,108,117,101,110,99,101,0,103, +114,105,100,115,105,122,101,0,110,101,101,100,98,105,110,100,0,42,98,105,110,100,119,101,105,103,104,116,115,0,42,98, +105,110,100,99,111,115,0,116,111,116,99,97,103,101,118,101,114,116,0,42,100,121,110,103,114,105,100,0,42,100,121,110, +105,110,102,108,117,101,110,99,101,115,0,42,100,121,110,118,101,114,116,115,0,42,112,97,100,50,0,100,121,110,103,114, +105,100,115,105,122,101,0,100,121,110,99,101,108,108,109,105,110,91,51,93,0,100,121,110,99,101,108,108,119,105,100,116, +104,0,98,105,110,100,109,97,116,91,52,93,91,52,93,0,42,112,115,121,115,0,116,111,116,100,109,118,101,114,116,0, +116,111,116,100,109,101,100,103,101,0,116,111,116,100,109,102,97,99,101,0,112,115,121,115,0,114,116,91,50,93,0,42, +102,97,99,101,112,97,0,118,103,114,111,117,112,0,112,114,111,116,101,99,116,0,42,102,115,115,0,42,116,97,114,103, +101,116,0,42,97,117,120,84,97,114,103,101,116,0,118,103,114,111,117,112,95,110,97,109,101,91,51,50,93,0,107,101, +101,112,68,105,115,116,0,115,104,114,105,110,107,84,121,112,101,0,115,104,114,105,110,107,79,112,116,115,0,112,114,111, +106,65,120,105,115,0,115,117,98,115,117,114,102,76,101,118,101,108,115,0,42,111,114,105,103,105,110,0,102,97,99,116, +111,114,0,108,105,109,105,116,91,50,93,0,111,114,105,103,105,110,79,112,116,115,0,112,110,116,115,119,0,111,112,110, +116,115,117,0,111,112,110,116,115,118,0,111,112,110,116,115,119,0,116,121,112,101,117,0,116,121,112,101,118,0,116,121, +112,101,119,0,102,117,0,102,118,0,102,119,0,100,117,0,100,118,0,100,119,0,42,100,101,102,0,118,101,99,91,56, +93,91,51,93,0,112,97,114,116,121,112,101,0,112,97,114,49,0,112,97,114,50,0,112,97,114,51,0,112,97,114,115, +117,98,115,116,114,91,51,50,93,0,42,116,114,97,99,107,0,42,112,114,111,120,121,0,42,112,114,111,120,121,95,103, +114,111,117,112,0,42,112,114,111,120,121,95,102,114,111,109,0,42,97,99,116,105,111,110,0,42,112,111,115,101,108,105, +98,0,42,112,111,115,101,0,99,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,115,0,100,101,102,98,97, +115,101,0,109,111,100,105,102,105,101,114,115,0,100,108,111,99,91,51,93,0,111,114,105,103,91,51,93,0,100,115,105, +122,101,91,51,93,0,100,114,111,116,91,51,93,0,111,98,109,97,116,91,52,93,91,52,93,0,99,111,110,115,116,105, +110,118,91,52,93,91,52,93,0,108,97,121,0,99,111,108,98,105,116,115,0,116,114,97,110,115,102,108,97,103,0,105, +112,111,102,108,97,103,0,116,114,97,99,107,102,108,97,103,0,117,112,102,108,97,103,0,110,108,97,102,108,97,103,0, +112,114,111,116,101,99,116,102,108,97,103,0,105,112,111,119,105,110,0,115,99,97,102,108,97,103,0,115,99,97,118,105, +115,102,108,97,103,0,98,111,117,110,100,116,121,112,101,0,100,117,112,111,110,0,100,117,112,111,102,102,0,100,117,112, +115,116,97,0,100,117,112,101,110,100,0,115,102,0,99,116,105,109,101,0,109,97,115,115,0,100,97,109,112,105,110,103, +0,105,110,101,114,116,105,97,0,102,111,114,109,102,97,99,116,111,114,0,114,100,97,109,112,105,110,103,0,115,105,122, +101,102,97,99,0,109,97,114,103,105,110,0,109,97,120,95,118,101,108,0,109,105,110,95,118,101,108,0,109,95,99,111, +110,116,97,99,116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,100,116,0,100,116,120,0, +97,99,116,99,111,108,0,101,109,112,116,121,95,100,114,97,119,116,121,112,101,0,112,97,100,49,91,51,93,0,101,109, +112,116,121,95,100,114,97,119,115,105,122,101,0,100,117,112,102,97,99,101,115,99,97,0,112,114,111,112,0,115,101,110, +115,111,114,115,0,99,111,110,116,114,111,108,108,101,114,115,0,97,99,116,117,97,116,111,114,115,0,98,98,115,105,122, +101,91,51,93,0,97,99,116,100,101,102,0,103,97,109,101,102,108,97,103,0,103,97,109,101,102,108,97,103,50,0,42, +98,115,111,102,116,0,115,111,102,116,102,108,97,103,0,97,110,105,115,111,116,114,111,112,105,99,70,114,105,99,116,105, +111,110,91,51,93,0,99,111,110,115,116,114,97,105,110,116,115,0,110,108,97,115,116,114,105,112,115,0,104,111,111,107, +115,0,112,97,114,116,105,99,108,101,115,121,115,116,101,109,0,42,112,100,0,42,115,111,102,116,0,42,100,117,112,95, +103,114,111,117,112,0,102,108,117,105,100,115,105,109,70,108,97,103,0,114,101,115,116,114,105,99,116,102,108,97,103,0, +115,104,97,112,101,110,114,0,115,104,97,112,101,102,108,97,103,0,114,101,99,97,108,99,111,0,98,111,100,121,95,116, +121,112,101,0,42,102,108,117,105,100,115,105,109,83,101,116,116,105,110,103,115,0,42,100,101,114,105,118,101,100,68,101, +102,111,114,109,0,42,100,101,114,105,118,101,100,70,105,110,97,108,0,108,97,115,116,68,97,116,97,77,97,115,107,0, +115,116,97,116,101,0,105,110,105,116,95,115,116,97,116,101,0,103,112,117,108,97,109,112,0,99,117,114,105,110,100,101, +120,0,97,99,116,105,118,101,0,100,101,102,108,101,99,116,0,102,111,114,99,101,102,105,101,108,100,0,112,100,101,102, +95,100,97,109,112,0,112,100,101,102,95,114,100,97,109,112,0,112,100,101,102,95,112,101,114,109,0,112,100,101,102,95, +102,114,105,99,116,0,112,100,101,102,95,114,102,114,105,99,116,0,102,95,115,116,114,101,110,103,116,104,0,102,95,112, +111,119,101,114,0,102,95,100,105,115,116,0,102,95,100,97,109,112,0,109,97,120,100,105,115,116,0,109,105,110,100,105, +115,116,0,109,97,120,114,97,100,0,109,105,110,114,97,100,0,102,95,112,111,119,101,114,95,114,0,112,100,101,102,95, +115,98,100,97,109,112,0,112,100,101,102,95,115,98,105,102,116,0,112,100,101,102,95,115,98,111,102,116,0,99,108,117, +109,112,95,102,97,99,0,99,108,117,109,112,95,112,111,119,0,107,105,110,107,95,102,114,101,113,0,107,105,110,107,95, +115,104,97,112,101,0,107,105,110,107,95,97,109,112,0,102,114,101,101,95,101,110,100,0,116,101,120,95,110,97,98,108, +97,0,116,101,120,95,109,111,100,101,0,107,105,110,107,0,107,105,110,107,95,97,120,105,115,0,114,116,50,0,42,114, +110,103,0,102,95,110,111,105,115,101,0,115,105,109,102,114,97,109,101,0,115,116,97,114,116,102,114,97,109,101,0,101, +110,100,102,114,97,109,101,0,101,100,105,116,102,114,97,109,101,0,108,105,110,83,116,105,102,102,0,97,110,103,83,116, +105,102,102,0,118,111,108,117,109,101,0,118,105,116,101,114,97,116,105,111,110,115,0,112,105,116,101,114,97,116,105,111, +110,115,0,100,105,116,101,114,97,116,105,111,110,115,0,99,105,116,101,114,97,116,105,111,110,115,0,107,83,82,72,82, +95,67,76,0,107,83,75,72,82,95,67,76,0,107,83,83,72,82,95,67,76,0,107,83,82,95,83,80,76,84,95,67, +76,0,107,83,75,95,83,80,76,84,95,67,76,0,107,83,83,95,83,80,76,84,95,67,76,0,107,86,67,70,0,107, +68,80,0,107,68,71,0,107,76,70,0,107,80,82,0,107,86,67,0,107,68,70,0,107,77,84,0,107,67,72,82,0, +107,75,72,82,0,107,83,72,82,0,107,65,72,82,0,99,111,108,108,105,115,105,111,110,102,108,97,103,115,0,110,117, +109,99,108,117,115,116,101,114,105,116,101,114,97,116,105,111,110,115,0,119,101,108,100,105,110,103,0,42,112,97,114,116, +105,99,108,101,115,0,116,111,116,112,111,105,110,116,0,116,111,116,115,112,114,105,110,103,0,42,98,112,111,105,110,116, +0,42,98,115,112,114,105,110,103,0,109,115,103,95,108,111,99,107,0,109,115,103,95,118,97,108,117,101,0,110,111,100, +101,109,97,115,115,0,110,97,109,101,100,86,71,95,77,97,115,115,91,51,50,93,0,103,114,97,118,0,109,101,100,105, +97,102,114,105,99,116,0,114,107,108,105,109,105,116,0,112,104,121,115,105,99,115,95,115,112,101,101,100,0,103,111,97, +108,115,112,114,105,110,103,0,103,111,97,108,102,114,105,99,116,0,109,105,110,103,111,97,108,0,109,97,120,103,111,97, +108,0,100,101,102,103,111,97,108,0,118,101,114,116,103,114,111,117,112,0,110,97,109,101,100,86,71,95,83,111,102,116, +103,111,97,108,91,51,50,93,0,102,117,122,122,121,110,101,115,115,0,105,110,115,112,114,105,110,103,0,105,110,102,114, +105,99,116,0,110,97,109,101,100,86,71,95,83,112,114,105,110,103,95,75,91,51,50,93,0,101,102,114,97,0,105,110, +116,101,114,118,97,108,0,108,111,99,97,108,0,115,111,108,118,101,114,102,108,97,103,115,0,42,42,107,101,121,115,0, +116,111,116,112,111,105,110,116,107,101,121,0,115,101,99,111,110,100,115,112,114,105,110,103,0,99,111,108,98,97,108,108, +0,98,97,108,108,100,97,109,112,0,98,97,108,108,115,116,105,102,102,0,115,98,99,95,109,111,100,101,0,97,101,114, +111,101,100,103,101,0,109,105,110,108,111,111,112,115,0,109,97,120,108,111,111,112,115,0,99,104,111,107,101,0,115,111, +108,118,101,114,95,73,68,0,112,108,97,115,116,105,99,0,115,112,114,105,110,103,112,114,101,108,111,97,100,0,42,115, +99,114,97,116,99,104,0,115,104,101,97,114,115,116,105,102,102,0,105,110,112,117,115,104,0,42,112,111,105,110,116,99, +97,99,104,101,0,115,104,111,119,95,97,100,118,97,110,99,101,100,111,112,116,105,111,110,115,0,114,101,115,111,108,117, +116,105,111,110,120,121,122,0,112,114,101,118,105,101,119,114,101,115,120,121,122,0,114,101,97,108,115,105,122,101,0,103, +117,105,68,105,115,112,108,97,121,77,111,100,101,0,114,101,110,100,101,114,68,105,115,112,108,97,121,77,111,100,101,0, +118,105,115,99,111,115,105,116,121,86,97,108,117,101,0,118,105,115,99,111,115,105,116,121,77,111,100,101,0,118,105,115, +99,111,115,105,116,121,69,120,112,111,110,101,110,116,0,103,114,97,118,120,0,103,114,97,118,121,0,103,114,97,118,122, +0,97,110,105,109,83,116,97,114,116,0,97,110,105,109,69,110,100,0,103,115,116,97,114,0,109,97,120,82,101,102,105, +110,101,0,105,110,105,86,101,108,120,0,105,110,105,86,101,108,121,0,105,110,105,86,101,108,122,0,42,111,114,103,77, +101,115,104,0,42,109,101,115,104,83,117,114,102,97,99,101,0,42,109,101,115,104,66,66,0,115,117,114,102,100,97,116, +97,80,97,116,104,91,50,52,48,93,0,98,98,83,116,97,114,116,91,51,93,0,98,98,83,105,122,101,91,51,93,0, +116,121,112,101,70,108,97,103,115,0,100,111,109,97,105,110,78,111,118,101,99,103,101,110,0,118,111,108,117,109,101,73, +110,105,116,84,121,112,101,0,112,97,114,116,83,108,105,112,86,97,108,117,101,0,103,101,110,101,114,97,116,101,84,114, +97,99,101,114,115,0,103,101,110,101,114,97,116,101,80,97,114,116,105,99,108,101,115,0,115,117,114,102,97,99,101,83, +109,111,111,116,104,105,110,103,0,115,117,114,102,97,99,101,83,117,98,100,105,118,115,0,112,97,114,116,105,99,108,101, +73,110,102,83,105,122,101,0,112,97,114,116,105,99,108,101,73,110,102,65,108,112,104,97,0,102,97,114,70,105,101,108, +100,83,105,122,101,0,42,109,101,115,104,83,117,114,102,78,111,114,109,97,108,115,0,99,112,115,84,105,109,101,83,116, +97,114,116,0,99,112,115,84,105,109,101,69,110,100,0,99,112,115,81,117,97,108,105,116,121,0,97,116,116,114,97,99, +116,102,111,114,99,101,83,116,114,101,110,103,116,104,0,97,116,116,114,97,99,116,102,111,114,99,101,82,97,100,105,117, +115,0,118,101,108,111,99,105,116,121,102,111,114,99,101,83,116,114,101,110,103,116,104,0,118,101,108,111,99,105,116,121, +102,111,114,99,101,82,97,100,105,117,115,0,108,97,115,116,103,111,111,100,102,114,97,109,101,0,109,105,115,116,121,112, +101,0,104,111,114,114,0,104,111,114,103,0,104,111,114,98,0,104,111,114,107,0,122,101,110,114,0,122,101,110,103,0, +122,101,110,98,0,122,101,110,107,0,97,109,98,107,0,102,97,115,116,99,111,108,0,101,120,112,111,115,117,114,101,0, +101,120,112,0,114,97,110,103,101,0,108,105,110,102,97,99,0,108,111,103,102,97,99,0,103,114,97,118,105,116,121,0, +97,99,116,105,118,105,116,121,66,111,120,82,97,100,105,117,115,0,115,107,121,116,121,112,101,0,111,99,99,108,117,115, +105,111,110,82,101,115,0,112,104,121,115,105,99,115,69,110,103,105,110,101,0,116,105,99,114,97,116,101,0,109,97,120, +108,111,103,105,99,115,116,101,112,0,112,104,121,115,117,98,115,116,101,112,0,109,97,120,112,104,121,115,116,101,112,0, +109,105,115,105,0,109,105,115,116,115,116,97,0,109,105,115,116,100,105,115,116,0,109,105,115,116,104,105,0,115,116,97, +114,114,0,115,116,97,114,103,0,115,116,97,114,98,0,115,116,97,114,107,0,115,116,97,114,115,105,122,101,0,115,116, +97,114,109,105,110,100,105,115,116,0,115,116,97,114,100,105,115,116,0,115,116,97,114,99,111,108,110,111,105,115,101,0, +100,111,102,115,116,97,0,100,111,102,101,110,100,0,100,111,102,109,105,110,0,100,111,102,109,97,120,0,97,111,100,105, +115,116,0,97,111,100,105,115,116,102,97,99,0,97,111,101,110,101,114,103,121,0,97,111,98,105,97,115,0,97,111,109, +111,100,101,0,97,111,115,97,109,112,0,97,111,109,105,120,0,97,111,99,111,108,111,114,0,97,111,95,97,100,97,112, +116,95,116,104,114,101,115,104,0,97,111,95,97,100,97,112,116,95,115,112,101,101,100,95,102,97,99,0,97,111,95,97, +112,112,114,111,120,95,101,114,114,111,114,0,97,111,95,97,112,112,114,111,120,95,99,111,114,114,101,99,116,105,111,110, +0,97,111,95,115,97,109,112,95,109,101,116,104,111,100,0,97,111,95,103,97,116,104,101,114,95,109,101,116,104,111,100, +0,97,111,95,97,112,112,114,111,120,95,112,97,115,115,101,115,0,42,97,111,115,112,104,101,114,101,0,42,97,111,116, +97,98,108,101,115,0,104,101,109,105,114,101,115,0,109,97,120,105,116,101,114,0,100,114,97,119,116,121,112,101,0,115, +117,98,115,104,111,111,116,112,0,115,117,98,115,104,111,111,116,101,0,110,111,100,101,108,105,109,0,109,97,120,115,117, +98,108,97,109,112,0,112,97,109,97,0,112,97,109,105,0,101,108,109,97,0,101,108,109,105,0,109,97,120,110,111,100, +101,0,99,111,110,118,101,114,103,101,110,99,101,0,114,97,100,102,97,99,0,103,97,109,109,97,0,115,101,108,99,111, +108,0,115,120,0,115,121,0,42,108,112,70,111,114,109,97,116,0,42,108,112,80,97,114,109,115,0,99,98,70,111,114, +109,97,116,0,99,98,80,97,114,109,115,0,102,99,99,84,121,112,101,0,102,99,99,72,97,110,100,108,101,114,0,100, +119,75,101,121,70,114,97,109,101,69,118,101,114,121,0,100,119,81,117,97,108,105,116,121,0,100,119,66,121,116,101,115, +80,101,114,83,101,99,111,110,100,0,100,119,70,108,97,103,115,0,100,119,73,110,116,101,114,108,101,97,118,101,69,118, +101,114,121,0,97,118,105,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,42,99,100,80,97,114,109,115,0,42, +112,97,100,0,99,100,83,105,122,101,0,113,116,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,99,111,100,101, +99,0,97,117,100,105,111,95,99,111,100,101,99,0,118,105,100,101,111,95,98,105,116,114,97,116,101,0,97,117,100,105, +111,95,98,105,116,114,97,116,101,0,103,111,112,95,115,105,122,101,0,114,99,95,109,105,110,95,114,97,116,101,0,114, +99,95,109,97,120,95,114,97,116,101,0,114,99,95,98,117,102,102,101,114,95,115,105,122,101,0,109,117,120,95,112,97, +99,107,101,116,95,115,105,122,101,0,109,117,120,95,114,97,116,101,0,109,105,120,114,97,116,101,0,109,97,105,110,0, +42,109,97,116,95,111,118,101,114,114,105,100,101,0,42,108,105,103,104,116,95,111,118,101,114,114,105,100,101,0,108,97, +121,95,122,109,97,115,107,0,108,97,121,102,108,97,103,0,112,97,115,115,102,108,97,103,0,112,97,115,115,95,120,111, +114,0,42,97,118,105,99,111,100,101,99,100,97,116,97,0,42,113,116,99,111,100,101,99,100,97,116,97,0,102,102,99, +111,100,101,99,100,97,116,97,0,99,102,114,97,0,112,115,102,114,97,0,112,101,102,114,97,0,105,109,97,103,101,115, +0,102,114,97,109,97,112,116,111,0,116,104,114,101,97,100,115,0,102,114,97,109,101,108,101,110,0,98,108,117,114,102, +97,99,0,101,100,103,101,82,0,101,100,103,101,71,0,101,100,103,101,66,0,102,117,108,108,115,99,114,101,101,110,0, +120,112,108,97,121,0,121,112,108,97,121,0,102,114,101,113,112,108,97,121,0,97,116,116,114,105,98,0,114,116,49,0, +115,116,101,114,101,111,109,111,100,101,0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116,0,109,97,120,105, +109,115,105,122,101,0,120,115,99,104,0,121,115,99,104,0,120,112,97,114,116,115,0,121,112,97,114,116,115,0,119,105, +110,112,111,115,0,112,108,97,110,101,115,0,105,109,116,121,112,101,0,115,117,98,105,109,116,121,112,101,0,113,117,97, +108,105,116,121,0,114,112,97,100,0,114,112,97,100,49,0,114,112,97,100,50,0,115,99,101,109,111,100,101,0,114,101, +110,100,101,114,101,114,0,111,99,114,101,115,0,97,108,112,104,97,109,111,100,101,0,111,115,97,0,102,114,115,95,115, +101,99,0,101,100,103,101,105,110,116,0,115,97,102,101,116,121,0,98,111,114,100,101,114,0,100,105,115,112,114,101,99, +116,0,108,97,121,101,114,115,0,97,99,116,108,97,121,0,120,97,115,112,0,121,97,115,112,0,102,114,115,95,115,101, +99,95,98,97,115,101,0,103,97,117,115,115,0,112,111,115,116,109,117,108,0,112,111,115,116,103,97,109,109,97,0,112, +111,115,116,104,117,101,0,112,111,115,116,115,97,116,0,100,105,116,104,101,114,95,105,110,116,101,110,115,105,116,121,0, +98,97,107,101,95,111,115,97,0,98,97,107,101,95,102,105,108,116,101,114,0,98,97,107,101,95,109,111,100,101,0,98, +97,107,101,95,102,108,97,103,0,98,97,107,101,95,110,111,114,109,97,108,95,115,112,97,99,101,0,98,97,107,101,95, +113,117,97,100,95,115,112,108,105,116,0,98,97,107,101,95,109,97,120,100,105,115,116,0,98,97,107,101,95,98,105,97, +115,100,105,115,116,0,98,97,107,101,95,112,97,100,0,71,73,113,117,97,108,105,116,121,0,71,73,99,97,99,104,101, +0,71,73,109,101,116,104,111,100,0,71,73,112,104,111,116,111,110,115,0,71,73,100,105,114,101,99,116,0,89,70,95, +65,65,0,89,70,101,120,112,111,114,116,120,109,108,0,89,70,95,110,111,98,117,109,112,0,89,70,95,99,108,97,109, +112,114,103,98,0,121,102,112,97,100,49,0,71,73,100,101,112,116,104,0,71,73,99,97,117,115,100,101,112,116,104,0, +71,73,112,105,120,101,108,115,112,101,114,115,97,109,112,108,101,0,71,73,112,104,111,116,111,110,99,111,117,110,116,0, +71,73,109,105,120,112,104,111,116,111,110,115,0,71,73,112,104,111,116,111,110,114,97,100,105,117,115,0,89,70,95,114, +97,121,100,101,112,116,104,0,89,70,95,65,65,112,97,115,115,101,115,0,89,70,95,65,65,115,97,109,112,108,101,115, +0,121,102,112,97,100,50,0,71,73,115,104,97,100,111,119,113,117,97,108,105,116,121,0,71,73,114,101,102,105,110,101, +109,101,110,116,0,71,73,112,111,119,101,114,0,71,73,105,110,100,105,114,112,111,119,101,114,0,89,70,95,103,97,109, +109,97,0,89,70,95,101,120,112,111,115,117,114,101,0,89,70,95,114,97,121,98,105,97,115,0,89,70,95,65,65,112, +105,120,101,108,115,105,122,101,0,89,70,95,65,65,116,104,114,101,115,104,111,108,100,0,98,97,99,107,98,117,102,91, +49,54,48,93,0,112,105,99,91,49,54,48,93,0,115,116,97,109,112,0,115,116,97,109,112,95,102,111,110,116,95,105, +100,0,115,116,97,109,112,95,117,100,97,116,97,91,49,54,48,93,0,102,103,95,115,116,97,109,112,91,52,93,0,98, +103,95,115,116,97,109,112,91,52,93,0,115,105,109,112,108,105,102,121,95,115,117,98,115,117,114,102,0,115,105,109,112, +108,105,102,121,95,115,104,97,100,111,119,115,97,109,112,108,101,115,0,115,105,109,112,108,105,102,121,95,112,97,114,116, +105,99,108,101,115,0,115,105,109,112,108,105,102,121,95,97,111,115,115,115,0,99,105,110,101,111,110,119,104,105,116,101, +0,99,105,110,101,111,110,98,108,97,99,107,0,99,105,110,101,111,110,103,97,109,109,97,0,106,112,50,95,112,114,101, +115,101,116,0,106,112,50,95,100,101,112,116,104,0,114,112,97,100,51,0,100,111,109,101,114,101,115,0,100,111,109,101, +109,111,100,101,0,100,111,109,101,97,110,103,108,101,0,100,111,109,101,116,105,108,116,0,100,111,109,101,114,101,115,98, +117,102,0,42,100,111,109,101,116,101,120,116,0,112,97,114,116,105,99,108,101,95,112,101,114,99,0,115,117,98,115,117, +114,102,95,109,97,120,0,115,104,97,100,98,117,102,115,97,109,112,108,101,95,109,97,120,0,97,111,95,101,114,114,111, +114,0,99,111,108,91,51,93,0,102,114,97,109,101,0,110,97,109,101,91,54,52,93,0,42,98,114,117,115,104,0,116, +111,111,108,0,115,101,97,109,95,98,108,101,101,100,0,110,111,114,109,97,108,95,97,110,103,108,101,0,115,116,101,112, +0,105,110,118,101,114,116,0,116,111,116,114,101,107,101,121,0,116,111,116,97,100,100,107,101,121,0,98,114,117,115,104, +116,121,112,101,0,98,114,117,115,104,91,55,93,0,101,109,105,116,116,101,114,100,105,115,116,0,100,114,97,119,95,116, +105,109,101,100,0,110,97,109,101,91,51,54,93,0,109,97,116,91,51,93,91,51,93,0,99,111,114,110,101,114,116,121, +112,101,0,101,100,105,116,98,117,116,102,108,97,103,0,106,111,105,110,116,114,105,108,105,109,105,116,0,100,101,103,114, +0,116,117,114,110,0,101,120,116,114,95,111,102,102,115,0,100,111,117,98,108,105,109,105,116,0,115,101,103,109,101,110, +116,115,0,114,105,110,103,115,0,118,101,114,116,105,99,101,115,0,117,110,119,114,97,112,112,101,114,0,117,118,99,97, +108,99,95,114,97,100,105,117,115,0,117,118,99,97,108,99,95,99,117,98,101,115,105,122,101,0,117,118,99,97,108,99, +95,109,97,114,103,105,110,0,117,118,99,97,108,99,95,109,97,112,100,105,114,0,117,118,99,97,108,99,95,109,97,112, +97,108,105,103,110,0,117,118,99,97,108,99,95,102,108,97,103,0,97,117,116,111,105,107,95,99,104,97,105,110,108,101, +110,0,105,109,97,112,97,105,110,116,0,112,97,114,116,105,99,108,101,0,115,101,108,101,99,116,95,116,104,114,101,115, +104,0,99,108,101,97,110,95,116,104,114,101,115,104,0,114,101,116,111,112,111,95,109,111,100,101,0,114,101,116,111,112, +111,95,112,97,105,110,116,95,116,111,111,108,0,108,105,110,101,95,100,105,118,0,101,108,108,105,112,115,101,95,100,105, +118,0,114,101,116,111,112,111,95,104,111,116,115,112,111,116,0,109,117,108,116,105,114,101,115,95,115,117,98,100,105,118, +95,116,121,112,101,0,115,107,103,101,110,95,114,101,115,111,108,117,116,105,111,110,0,115,107,103,101,110,95,116,104,114, +101,115,104,111,108,100,95,105,110,116,101,114,110,97,108,0,115,107,103,101,110,95,116,104,114,101,115,104,111,108,100,95, +101,120,116,101,114,110,97,108,0,115,107,103,101,110,95,108,101,110,103,116,104,95,114,97,116,105,111,0,115,107,103,101, +110,95,108,101,110,103,116,104,95,108,105,109,105,116,0,115,107,103,101,110,95,97,110,103,108,101,95,108,105,109,105,116, +0,115,107,103,101,110,95,99,111,114,114,101,108,97,116,105,111,110,95,108,105,109,105,116,0,115,107,103,101,110,95,115, +121,109,109,101,116,114,121,95,108,105,109,105,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,97,110,103, +108,101,95,119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,108,101,110,103,116,104,95, +119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,100,105,115,116,97,110,99,101,95,119, +101,105,103,104,116,0,115,107,103,101,110,95,111,112,116,105,111,110,115,0,115,107,103,101,110,95,112,111,115,116,112,114, +111,0,115,107,103,101,110,95,112,111,115,116,112,114,111,95,112,97,115,115,101,115,0,115,107,103,101,110,95,115,117,98, +100,105,118,105,115,105,111,110,115,91,51,93,0,115,107,103,101,110,95,109,117,108,116,105,95,108,101,118,101,108,0,42, +115,107,103,101,110,95,116,101,109,112,108,97,116,101,0,98,111,110,101,95,115,107,101,116,99,104,105,110,103,0,98,111, +110,101,95,115,107,101,116,99,104,105,110,103,95,99,111,110,118,101,114,116,0,115,107,103,101,110,95,115,117,98,100,105, +118,105,115,105,111,110,95,110,117,109,98,101,114,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,111,112,116, +105,111,110,115,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,114,111,108,108,0,115,107,103,101,110,95,115, +105,100,101,95,115,116,114,105,110,103,91,56,93,0,115,107,103,101,110,95,110,117,109,95,115,116,114,105,110,103,91,56, +93,0,101,100,103,101,95,109,111,100,101,0,112,97,100,51,91,50,93,0,100,105,114,0,118,105,101,119,0,42,115,101, +115,115,105,111,110,0,42,99,117,109,97,112,0,100,114,97,119,98,114,117,115,104,0,115,109,111,111,116,104,98,114,117, +115,104,0,112,105,110,99,104,98,114,117,115,104,0,105,110,102,108,97,116,101,98,114,117,115,104,0,103,114,97,98,98, +114,117,115,104,0,108,97,121,101,114,98,114,117,115,104,0,102,108,97,116,116,101,110,98,114,117,115,104,0,112,105,118, +111,116,91,51,93,0,98,114,117,115,104,95,116,121,112,101,0,116,101,120,110,114,0,116,101,120,114,101,112,116,0,116, +101,120,102,97,100,101,0,116,101,120,115,101,112,0,97,118,101,114,97,103,105,110,103,0,116,97,98,108,101,116,95,115, +105,122,101,0,116,97,98,108,101,116,95,115,116,114,101,110,103,116,104,0,115,121,109,109,0,114,97,107,101,0,97,120, +105,115,108,111,99,107,0,42,99,97,109,101,114,97,0,42,119,111,114,108,100,0,42,115,101,116,0,98,97,115,101,0, +42,98,97,115,97,99,116,0,99,117,114,115,111,114,91,51,93,0,116,119,99,101,110,116,91,51,93,0,116,119,109,105, +110,91,51,93,0,116,119,109,97,120,91,51,93,0,101,100,105,116,98,117,116,115,105,122,101,0,115,101,108,101,99,116, +109,111,100,101,0,112,114,111,112,111,114,116,105,111,110,97,108,0,112,114,111,112,95,109,111,100,101,0,97,117,116,111, +109,101,114,103,101,0,112,97,100,53,0,112,97,100,54,0,97,117,116,111,107,101,121,95,109,111,100,101,0,42,101,100, +0,42,114,97,100,105,111,0,102,114,97,109,105,110,103,0,42,116,111,111,108,115,101,116,116,105,110,103,115,0,97,117, +100,105,111,0,116,114,97,110,115,102,111,114,109,95,115,112,97,99,101,115,0,106,117,109,112,102,114,97,109,101,0,115, +110,97,112,95,109,111,100,101,0,115,110,97,112,95,102,108,97,103,0,115,110,97,112,95,116,97,114,103,101,116,0,42, +116,104,101,68,97,103,0,100,97,103,105,115,118,97,108,105,100,0,100,97,103,102,108,97,103,115,0,115,99,117,108,112, +116,100,97,116,97,0,102,114,97,109,101,95,115,116,101,112,0,122,111,111,109,0,98,108,101,110,100,0,120,105,109,0, +121,105,109,0,115,112,97,99,101,116,121,112,101,0,98,108,111,99,107,115,99,97,108,101,0,42,97,114,101,97,0,98, +108,111,99,107,104,97,110,100,108,101,114,91,56,93,0,118,105,101,119,109,97,116,91,52,93,91,52,93,0,118,105,101, +119,105,110,118,91,52,93,91,52,93,0,112,101,114,115,109,97,116,91,52,93,91,52,93,0,112,101,114,115,105,110,118, +91,52,93,91,52,93,0,119,105,110,109,97,116,49,91,52,93,91,52,93,0,118,105,101,119,109,97,116,49,91,52,93, +91,52,93,0,118,105,101,119,113,117,97,116,91,52,93,0,122,102,97,99,0,108,97,121,95,117,115,101,100,0,112,101, +114,115,112,0,42,111,98,95,99,101,110,116,114,101,0,42,98,103,112,105,99,0,42,108,111,99,97,108,118,100,0,42, +114,105,0,42,114,101,116,111,112,111,95,118,105,101,119,95,100,97,116,97,0,42,100,101,112,116,104,115,0,111,98,95, +99,101,110,116,114,101,95,98,111,110,101,91,51,50,93,0,108,111,99,97,108,118,105,101,119,0,108,97,121,97,99,116, +0,115,99,101,110,101,108,111,99,107,0,97,114,111,117,110,100,0,99,97,109,122,111,111,109,0,112,105,118,111,116,95, +108,97,115,116,0,103,114,105,100,0,103,114,105,100,118,105,101,119,0,112,105,120,115,105,122,101,0,110,101,97,114,0, +102,97,114,0,99,97,109,100,120,0,99,97,109,100,121,0,103,114,105,100,108,105,110,101,115,0,118,105,101,119,98,117, +116,0,103,114,105,100,102,108,97,103,0,109,111,100,101,115,101,108,101,99,116,0,116,119,116,121,112,101,0,116,119,109, +111,100,101,0,116,119,102,108,97,103,0,116,119,100,114,97,119,102,108,97,103,0,116,119,109,97,116,91,52,93,91,52, +93,0,99,108,105,112,91,52,93,91,52,93,0,42,99,108,105,112,98,98,0,97,102,116,101,114,100,114,97,119,0,122, +98,117,102,0,120,114,97,121,0,102,108,97,103,50,0,103,114,105,100,115,117,98,100,105,118,0,107,101,121,102,108,97, +103,115,0,110,100,111,102,109,111,100,101,0,110,100,111,102,102,105,108,116,101,114,0,42,112,114,111,112,101,114,116,105, +101,115,95,115,116,111,114,97,103,101,0,42,103,112,100,0,108,118,105,101,119,113,117,97,116,91,52,93,0,108,112,101, +114,115,112,0,108,118,105,101,119,0,118,101,114,116,0,104,111,114,0,109,97,115,107,0,109,105,110,91,50,93,0,109, +97,120,91,50,93,0,109,105,110,122,111,111,109,0,109,97,120,122,111,111,109,0,115,99,114,111,108,108,0,107,101,101, +112,116,111,116,0,107,101,101,112,97,115,112,101,99,116,0,107,101,101,112,122,111,111,109,0,111,108,100,119,105,110,120, +0,111,108,100,119,105,110,121,0,99,117,114,115,111,114,91,50,93,0,114,111,119,98,117,116,0,118,50,100,0,42,101, +100,105,116,105,112,111,0,105,112,111,107,101,121,0,97,99,116,110,97,109,101,91,51,50,93,0,99,111,110,115,116,110, +97,109,101,91,51,50,93,0,98,111,110,101,110,97,109,101,91,51,50,93,0,116,111,116,105,112,111,0,112,105,110,0, +98,117,116,111,102,115,0,99,104,97,110,110,101,108,0,108,111,99,107,0,109,101,100,105,97,110,91,51,93,0,99,117, +114,115,101,110,115,0,99,117,114,97,99,116,0,97,108,105,103,110,0,116,97,98,111,0,109,97,105,110,98,0,109,97, +105,110,98,111,0,42,108,111,99,107,112,111,105,110,0,116,101,120,102,114,111,109,0,115,104,111,119,103,114,111,117,112, +0,109,111,100,101,108,116,121,112,101,0,115,99,114,105,112,116,98,108,111,99,107,0,114,101,95,97,108,105,103,110,0, +111,108,100,107,101,121,112,114,101,115,115,0,116,97,98,91,55,93,0,114,101,110,100,101,114,95,115,105,122,101,0,99, +104,97,110,115,104,111,119,110,0,122,101,98,114,97,0,42,102,105,108,101,108,105,115,116,0,116,111,116,102,105,108,101, +0,116,105,116,108,101,91,50,52,93,0,100,105,114,91,50,52,48,93,0,102,105,108,101,91,56,48,93,0,111,102,115, +0,115,111,114,116,0,109,97,120,110,97,109,101,108,101,110,0,99,111,108,108,117,109,115,0,102,95,102,112,0,102,112, +95,115,116,114,91,56,93,0,42,108,105,98,102,105,108,101,100,97,116,97,0,114,101,116,118,97,108,0,109,101,110,117, +0,97,99,116,0,40,42,114,101,116,117,114,110,102,117,110,99,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110, +99,95,101,118,101,110,116,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110,99,95,97,114,103,115,41,40,41,0, +42,97,114,103,49,0,42,97,114,103,50,0,42,109,101,110,117,112,0,42,112,117,112,109,101,110,117,0,111,111,112,115, +0,118,105,115,105,102,108,97,103,0,116,114,101,101,0,42,116,114,101,101,115,116,111,114,101,0,115,101,97,114,99,104, +95,115,116,114,105,110,103,91,51,50,93,0,115,101,97,114,99,104,95,116,115,101,0,115,101,97,114,99,104,95,102,108, +97,103,115,0,100,111,95,0,111,117,116,108,105,110,101,118,105,115,0,115,116,111,114,101,102,108,97,103,0,100,101,112, +115,95,102,108,97,103,115,0,105,109,97,110,114,0,99,117,114,116,105,108,101,0,105,109,116,121,112,101,110,114,0,100, +116,95,117,118,0,115,116,105,99,107,121,0,100,116,95,117,118,115,116,114,101,116,99,104,0,112,97,100,91,53,93,0, +99,101,110,116,120,0,99,101,110,116,121,0,97,117,116,111,115,110,97,112,0,42,116,101,120,116,0,116,111,112,0,118, +105,101,119,108,105,110,101,115,0,102,111,110,116,95,105,100,0,108,104,101,105,103,104,116,0,108,101,102,116,0,115,104, +111,119,108,105,110,101,110,114,115,0,116,97,98,110,117,109,98,101,114,0,99,117,114,114,116,97,98,95,115,101,116,0, +115,104,111,119,115,121,110,116,97,120,0,111,118,101,114,119,114,105,116,101,0,112,105,120,95,112,101,114,95,108,105,110, +101,0,116,120,116,115,99,114,111,108,108,0,116,120,116,98,97,114,0,119,111,114,100,119,114,97,112,0,100,111,112,108, +117,103,105,110,115,0,42,112,121,95,100,114,97,119,0,42,112,121,95,101,118,101,110,116,0,42,112,121,95,98,117,116, +116,111,110,0,42,112,121,95,98,114,111,119,115,101,114,99,97,108,108,98,97,99,107,0,42,112,121,95,103,108,111,98, +97,108,100,105,99,116,0,108,97,115,116,115,112,97,99,101,0,115,99,114,105,112,116,110,97,109,101,91,50,53,54,93, +0,115,99,114,105,112,116,97,114,103,91,50,53,54,93,0,42,115,99,114,105,112,116,0,42,98,117,116,95,114,101,102, +115,0,114,101,100,114,97,119,115,0,42,105,100,0,97,115,112,101,99,116,0,42,99,117,114,102,111,110,116,0,42,101, +100,105,116,116,114,101,101,0,116,114,101,101,116,121,112,101,0,42,102,105,108,101,115,0,97,99,116,105,118,101,95,102, +105,108,101,0,110,117,109,116,105,108,101,115,120,0,110,117,109,116,105,108,101,115,121,0,115,101,108,115,116,97,116,101, +0,118,105,101,119,114,101,99,116,0,98,111,111,107,109,97,114,107,114,101,99,116,0,115,99,114,111,108,108,112,111,115, +0,115,99,114,111,108,108,104,101,105,103,104,116,0,115,99,114,111,108,108,97,114,101,97,0,97,99,116,105,118,101,95, +98,111,111,107,109,97,114,107,0,112,114,118,95,119,0,112,114,118,95,104,0,42,105,109,103,0,111,117,116,108,105,110, +101,91,52,93,0,110,101,117,116,114,97,108,91,52,93,0,97,99,116,105,111,110,91,52,93,0,115,101,116,116,105,110, +103,91,52,93,0,115,101,116,116,105,110,103,49,91,52,93,0,115,101,116,116,105,110,103,50,91,52,93,0,110,117,109, +91,52,93,0,116,101,120,116,102,105,101,108,100,91,52,93,0,116,101,120,116,102,105,101,108,100,95,104,105,91,52,93, +0,112,111,112,117,112,91,52,93,0,116,101,120,116,91,52,93,0,116,101,120,116,95,104,105,91,52,93,0,109,101,110, +117,95,98,97,99,107,91,52,93,0,109,101,110,117,95,105,116,101,109,91,52,93,0,109,101,110,117,95,104,105,108,105, +116,101,91,52,93,0,109,101,110,117,95,116,101,120,116,91,52,93,0,109,101,110,117,95,116,101,120,116,95,104,105,91, +52,93,0,98,117,116,95,100,114,97,119,116,121,112,101,0,105,99,111,110,102,105,108,101,91,56,48,93,0,98,97,99, +107,91,52,93,0,104,101,97,100,101,114,91,52,93,0,112,97,110,101,108,91,52,93,0,115,104,97,100,101,49,91,52, +93,0,115,104,97,100,101,50,91,52,93,0,104,105,108,105,116,101,91,52,93,0,103,114,105,100,91,52,93,0,119,105, +114,101,91,52,93,0,115,101,108,101,99,116,91,52,93,0,108,97,109,112,91,52,93,0,97,99,116,105,118,101,91,52, +93,0,103,114,111,117,112,91,52,93,0,103,114,111,117,112,95,97,99,116,105,118,101,91,52,93,0,116,114,97,110,115, +102,111,114,109,91,52,93,0,118,101,114,116,101,120,91,52,93,0,118,101,114,116,101,120,95,115,101,108,101,99,116,91, +52,93,0,101,100,103,101,91,52,93,0,101,100,103,101,95,115,101,108,101,99,116,91,52,93,0,101,100,103,101,95,115, +101,97,109,91,52,93,0,101,100,103,101,95,115,104,97,114,112,91,52,93,0,101,100,103,101,95,102,97,99,101,115,101, +108,91,52,93,0,102,97,99,101,91,52,93,0,102,97,99,101,95,115,101,108,101,99,116,91,52,93,0,102,97,99,101, +95,100,111,116,91,52,93,0,110,111,114,109,97,108,91,52,93,0,98,111,110,101,95,115,111,108,105,100,91,52,93,0, +98,111,110,101,95,112,111,115,101,91,52,93,0,115,116,114,105,112,91,52,93,0,115,116,114,105,112,95,115,101,108,101, +99,116,91,52,93,0,99,102,114,97,109,101,91,52,93,0,118,101,114,116,101,120,95,115,105,122,101,0,102,97,99,101, +100,111,116,95,115,105,122,101,0,98,112,97,100,91,50,93,0,115,121,110,116,97,120,108,91,52,93,0,115,121,110,116, +97,120,110,91,52,93,0,115,121,110,116,97,120,98,91,52,93,0,115,121,110,116,97,120,118,91,52,93,0,115,121,110, +116,97,120,99,91,52,93,0,109,111,118,105,101,91,52,93,0,105,109,97,103,101,91,52,93,0,115,99,101,110,101,91, +52,93,0,97,117,100,105,111,91,52,93,0,101,102,102,101,99,116,91,52,93,0,112,108,117,103,105,110,91,52,93,0, +116,114,97,110,115,105,116,105,111,110,91,52,93,0,109,101,116,97,91,52,93,0,101,100,105,116,109,101,115,104,95,97, +99,116,105,118,101,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,91,52,93,0,104,97,110,100,108,101, +95,118,101,114,116,101,120,95,115,101,108,101,99,116,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,95, +115,105,122,101,0,104,112,97,100,91,55,93,0,115,111,108,105,100,91,52,93,0,116,117,105,0,116,98,117,116,115,0, +116,118,51,100,0,116,102,105,108,101,0,116,105,112,111,0,116,105,110,102,111,0,116,115,110,100,0,116,97,99,116,0, +116,110,108,97,0,116,115,101,113,0,116,105,109,97,0,116,105,109,97,115,101,108,0,116,101,120,116,0,116,111,111,112, +115,0,116,116,105,109,101,0,116,110,111,100,101,0,116,97,114,109,91,50,48,93,0,98,112,97,100,91,52,93,0,98, +112,97,100,49,91,52,93,0,115,112,101,99,91,52,93,0,100,117,112,102,108,97,103,0,115,97,118,101,116,105,109,101, +0,116,101,109,112,100,105,114,91,49,54,48,93,0,102,111,110,116,100,105,114,91,49,54,48,93,0,114,101,110,100,101, +114,100,105,114,91,49,54,48,93,0,116,101,120,116,117,100,105,114,91,49,54,48,93,0,112,108,117,103,116,101,120,100, +105,114,91,49,54,48,93,0,112,108,117,103,115,101,113,100,105,114,91,49,54,48,93,0,112,121,116,104,111,110,100,105, +114,91,49,54,48,93,0,115,111,117,110,100,100,105,114,91,49,54,48,93,0,121,102,101,120,112,111,114,116,100,105,114, +91,49,54,48,93,0,118,101,114,115,105,111,110,115,0,118,114,109,108,102,108,97,103,0,103,97,109,101,102,108,97,103, +115,0,119,104,101,101,108,108,105,110,101,115,99,114,111,108,108,0,117,105,102,108,97,103,0,108,97,110,103,117,97,103, +101,0,117,115,101,114,112,114,101,102,0,118,105,101,119,122,111,111,109,0,99,111,110,115,111,108,101,95,98,117,102,102, +101,114,0,99,111,110,115,111,108,101,95,111,117,116,0,109,105,120,98,117,102,115,105,122,101,0,102,111,110,116,115,105, +122,101,0,101,110,99,111,100,105,110,103,0,116,114,97,110,115,111,112,116,115,0,109,101,110,117,116,104,114,101,115,104, +111,108,100,49,0,109,101,110,117,116,104,114,101,115,104,111,108,100,50,0,102,111,110,116,110,97,109,101,91,50,53,54, +93,0,116,104,101,109,101,115,0,117,110,100,111,115,116,101,112,115,0,117,110,100,111,109,101,109,111,114,121,0,103,112, +95,109,97,110,104,97,116,116,101,110,100,105,115,116,0,103,112,95,101,117,99,108,105,100,101,97,110,100,105,115,116,0, +103,112,95,101,114,97,115,101,114,0,103,112,95,115,101,116,116,105,110,103,115,0,116,98,95,108,101,102,116,109,111,117, +115,101,0,116,98,95,114,105,103,104,116,109,111,117,115,101,0,108,105,103,104,116,91,51,93,0,116,119,95,104,111,116, +115,112,111,116,0,116,119,95,102,108,97,103,0,116,119,95,104,97,110,100,108,101,115,105,122,101,0,116,119,95,115,105, +122,101,0,116,101,120,116,105,109,101,111,117,116,0,116,101,120,99,111,108,108,101,99,116,114,97,116,101,0,109,101,109, +99,97,99,104,101,108,105,109,105,116,0,112,114,101,102,101,116,99,104,102,114,97,109,101,115,0,102,114,97,109,101,115, +101,114,118,101,114,112,111,114,116,0,112,97,100,95,114,111,116,95,97,110,103,108,101,0,111,98,99,101,110,116,101,114, +95,100,105,97,0,114,118,105,115,105,122,101,0,114,118,105,98,114,105,103,104,116,0,114,101,99,101,110,116,95,102,105, +108,101,115,0,115,109,111,111,116,104,95,118,105,101,119,116,120,0,103,108,114,101,115,108,105,109,105,116,0,110,100,111, +102,95,112,97,110,0,110,100,111,102,95,114,111,116,97,116,101,0,99,117,114,115,115,105,122,101,0,112,97,100,91,56, +93,0,118,101,114,115,101,109,97,115,116,101,114,91,49,54,48,93,0,118,101,114,115,101,117,115,101,114,91,49,54,48, +93,0,103,108,97,108,112,104,97,99,108,105,112,0,97,117,116,111,107,101,121,95,102,108,97,103,0,99,111,98,97,95, +119,101,105,103,104,116,0,118,101,114,116,98,97,115,101,0,101,100,103,101,98,97,115,101,0,97,114,101,97,98,97,115, +101,0,42,115,99,101,110,101,0,101,110,100,120,0,101,110,100,121,0,115,105,122,101,120,0,115,105,122,101,121,0,115, +99,101,110,101,110,114,0,115,99,114,101,101,110,110,114,0,102,117,108,108,0,109,97,105,110,119,105,110,0,119,105,110, +97,107,116,0,104,97,110,100,108,101,114,91,56,93,0,42,110,101,119,118,0,118,101,99,0,42,118,49,0,42,118,50, +0,112,97,110,101,108,110,97,109,101,91,54,52,93,0,116,97,98,110,97,109,101,91,54,52,93,0,100,114,97,119,110, +97,109,101,91,54,52,93,0,111,102,115,120,0,111,102,115,121,0,99,111,110,116,114,111,108,0,115,110,97,112,0,111, +108,100,95,111,102,115,120,0,111,108,100,95,111,102,115,121,0,115,111,114,116,99,111,117,110,116,101,114,0,42,112,97, +110,101,108,116,97,98,0,42,118,51,0,42,118,52,0,42,102,117,108,108,0,119,105,110,109,97,116,91,52,93,91,52, +93,0,104,101,97,100,114,99,116,0,119,105,110,114,99,116,0,104,101,97,100,119,105,110,0,119,105,110,0,104,101,97, +100,101,114,116,121,112,101,0,98,117,116,115,112,97,99,101,116,121,112,101,0,119,105,110,120,0,119,105,110,121,0,104, +101,97,100,95,115,119,97,112,0,104,101,97,100,95,101,113,117,97,108,0,119,105,110,95,115,119,97,112,0,119,105,110, +95,101,113,117,97,108,0,104,101,97,100,98,117,116,108,101,110,0,104,101,97,100,98,117,116,111,102,115,0,99,117,114, +115,111,114,0,115,112,97,99,101,100,97,116,97,0,117,105,98,108,111,99,107,115,0,112,97,110,101,108,115,0,115,117, +98,118,115,116,114,91,52,93,0,115,117,98,118,101,114,115,105,111,110,0,112,97,100,115,0,109,105,110,118,101,114,115, +105,111,110,0,109,105,110,115,117,98,118,101,114,115,105,111,110,0,100,105,115,112,108,97,121,109,111,100,101,0,42,99, +117,114,115,99,114,101,101,110,0,42,99,117,114,115,99,101,110,101,0,102,105,108,101,102,108,97,103,115,0,103,108,111, +98,97,108,102,0,110,97,109,101,91,56,48,93,0,42,105,98,117,102,0,42,105,98,117,102,95,99,111,109,112,0,42, +115,101,49,0,42,115,101,50,0,42,115,101,51,0,110,114,0,98,111,116,116,111,109,0,114,105,103,104,116,0,120,111, +102,115,0,121,111,102,115,0,108,105,102,116,91,51,93,0,103,97,109,109,97,91,51,93,0,103,97,105,110,91,51,93, +0,115,97,116,117,114,97,116,105,111,110,0,42,103,117,105,0,100,105,114,91,49,54,48,93,0,100,111,110,101,0,115, +116,97,114,116,115,116,105,108,108,0,101,110,100,115,116,105,108,108,0,42,115,116,114,105,112,100,97,116,97,0,111,114, +120,0,111,114,121,0,42,99,114,111,112,0,42,116,114,97,110,115,102,111,114,109,0,42,99,111,108,111,114,95,98,97, +108,97,110,99,101,0,42,116,115,116,114,105,112,100,97,116,97,0,42,116,115,116,114,105,112,100,97,116,97,95,115,116, +97,114,116,115,116,105,108,108,0,42,116,115,116,114,105,112,100,97,116,97,95,101,110,100,115,116,105,108,108,0,42,105, +98,117,102,95,115,116,97,114,116,115,116,105,108,108,0,42,105,98,117,102,95,101,110,100,115,116,105,108,108,0,42,105, +110,115,116,97,110,99,101,95,112,114,105,118,97,116,101,95,100,97,116,97,0,42,42,99,117,114,114,101,110,116,95,112, +114,105,118,97,116,101,95,100,97,116,97,0,42,116,109,112,0,115,116,97,114,116,111,102,115,0,101,110,100,111,102,115, +0,109,97,99,104,105,110,101,0,115,116,97,114,116,100,105,115,112,0,101,110,100,100,105,115,112,0,109,117,108,0,104, +97,110,100,115,105,122,101,0,97,110,105,109,95,112,114,101,115,101,101,107,0,42,115,116,114,105,112,0,102,97,99,102, +48,0,102,97,99,102,49,0,42,115,101,113,49,0,42,115,101,113,50,0,42,115,101,113,51,0,115,101,113,98,97,115, +101,0,42,115,111,117,110,100,0,42,104,100,97,117,100,105,111,0,108,101,118,101,108,0,112,97,110,0,115,116,114,111, +98,101,0,42,101,102,102,101,99,116,100,97,116,97,0,97,110,105,109,95,115,116,97,114,116,111,102,115,0,97,110,105, +109,95,101,110,100,111,102,115,0,98,108,101,110,100,95,109,111,100,101,0,98,108,101,110,100,95,111,112,97,99,105,116, +121,0,42,111,108,100,98,97,115,101,112,0,42,112,97,114,115,101,113,0,42,115,101,113,98,97,115,101,112,0,109,101, +116,97,115,116,97,99,107,0,101,100,103,101,87,105,100,116,104,0,102,111,114,119,97,114,100,0,119,105,112,101,116,121, +112,101,0,102,77,105,110,105,0,102,67,108,97,109,112,0,102,66,111,111,115,116,0,100,68,105,115,116,0,100,81,117, +97,108,105,116,121,0,98,78,111,67,111,109,112,0,83,99,97,108,101,120,73,110,105,0,83,99,97,108,101,121,73,110, +105,0,83,99,97,108,101,120,70,105,110,0,83,99,97,108,101,121,70,105,110,0,120,73,110,105,0,120,70,105,110,0, +121,73,110,105,0,121,70,105,110,0,114,111,116,73,110,105,0,114,111,116,70,105,110,0,105,110,116,101,114,112,111,108, +97,116,105,111,110,0,42,102,114,97,109,101,77,97,112,0,103,108,111,98,97,108,83,112,101,101,100,0,108,97,115,116, +86,97,108,105,100,70,114,97,109,101,0,98,108,101,110,100,70,114,97,109,101,115,0,98,117,116,116,121,112,101,0,117, +115,101,114,106,105,116,0,115,116,97,0,116,111,116,112,97,114,116,0,110,111,114,109,102,97,99,0,111,98,102,97,99, +0,114,97,110,100,102,97,99,0,116,101,120,102,97,99,0,114,97,110,100,108,105,102,101,0,102,111,114,99,101,91,51, +93,0,118,101,99,116,115,105,122,101,0,109,97,120,108,101,110,0,100,101,102,118,101,99,91,51,93,0,109,117,108,116, +91,52,93,0,108,105,102,101,91,52,93,0,99,104,105,108,100,91,52,93,0,109,97,116,91,52,93,0,116,101,120,109, +97,112,0,99,117,114,109,117,108,116,0,115,116,97,116,105,99,115,116,101,112,0,111,109,97,116,0,116,105,109,101,116, +101,120,0,115,112,101,101,100,116,101,120,0,102,108,97,103,50,110,101,103,0,118,101,114,116,103,114,111,117,112,95,118, +0,118,103,114,111,117,112,110,97,109,101,91,51,50,93,0,118,103,114,111,117,112,110,97,109,101,95,118,91,51,50,93, +0,42,107,101,121,115,0,109,105,110,102,97,99,0,117,115,101,100,0,117,115,101,100,101,108,101,109,0,100,120,0,100, +121,0,108,105,110,107,0,111,116,121,112,101,0,111,108,100,0,42,112,111,105,110,0,42,111,108,100,112,111,105,110,0, +114,101,115,101,116,100,105,115,116,0,108,97,115,116,118,97,108,0,42,109,97,0,107,101,121,0,113,117,97,108,0,113, +117,97,108,50,0,116,97,114,103,101,116,78,97,109,101,91,51,50,93,0,116,111,103,103,108,101,78,97,109,101,91,51, +50,93,0,118,97,108,117,101,91,51,50,93,0,109,97,120,118,97,108,117,101,91,51,50,93,0,100,101,108,97,121,0, +100,117,114,97,116,105,111,110,0,109,97,116,101,114,105,97,108,78,97,109,101,91,51,50,93,0,100,97,109,112,116,105, +109,101,114,0,112,114,111,112,110,97,109,101,91,51,50,93,0,109,97,116,110,97,109,101,91,51,50,93,0,97,120,105, +115,102,108,97,103,0,42,102,114,111,109,79,98,106,101,99,116,0,115,117,98,106,101,99,116,91,51,50,93,0,98,111, +100,121,91,51,50,93,0,112,117,108,115,101,0,102,114,101,113,0,116,111,116,108,105,110,107,115,0,42,42,108,105,110, +107,115,0,116,97,112,0,106,111,121,105,110,100,101,120,0,97,120,105,115,95,115,105,110,103,108,101,0,97,120,105,115, +102,0,98,117,116,116,111,110,0,104,97,116,0,104,97,116,102,0,112,114,101,99,105,115,105,111,110,0,115,116,114,91, +49,50,56,93,0,109,111,100,117,108,101,91,54,52,93,0,42,109,121,110,101,119,0,105,110,112,117,116,115,0,116,111, +116,115,108,105,110,107,115,0,42,42,115,108,105,110,107,115,0,118,97,108,111,0,115,116,97,116,101,95,109,97,115,107, +0,42,97,99,116,0,102,114,97,109,101,80,114,111,112,91,51,50,93,0,98,108,101,110,100,105,110,0,112,114,105,111, +114,105,116,121,0,101,110,100,95,114,101,115,101,116,0,115,116,114,105,100,101,97,120,105,115,0,115,116,114,105,100,101, +108,101,110,103,116,104,0,115,110,100,110,114,0,112,97,100,49,91,50,93,0,109,97,107,101,99,111,112,121,0,99,111, +112,121,109,97,100,101,0,112,97,100,50,91,49,93,0,116,114,97,99,107,0,42,109,101,0,108,105,110,86,101,108,111, +99,105,116,121,91,51,93,0,97,110,103,86,101,108,111,99,105,116,121,91,51,93,0,108,111,99,97,108,102,108,97,103, +0,100,121,110,95,111,112,101,114,97,116,105,111,110,0,102,111,114,99,101,108,111,99,91,51,93,0,102,111,114,99,101, +114,111,116,91,51,93,0,108,105,110,101,97,114,118,101,108,111,99,105,116,121,91,51,93,0,97,110,103,117,108,97,114, +118,101,108,111,99,105,116,121,91,51,93,0,42,114,101,102,101,114,101,110,99,101,0,98,117,116,115,116,97,0,98,117, +116,101,110,100,0,109,105,110,0,109,97,120,0,118,105,115,105,102,97,99,0,114,111,116,100,97,109,112,0,109,105,110, +108,111,99,91,51,93,0,109,97,120,108,111,99,91,51,93,0,109,105,110,114,111,116,91,51,93,0,109,97,120,114,111, +116,91,51,93,0,109,97,116,112,114,111,112,91,51,50,93,0,100,105,115,116,114,105,98,117,116,105,111,110,0,105,110, +116,95,97,114,103,95,49,0,105,110,116,95,97,114,103,95,50,0,102,108,111,97,116,95,97,114,103,95,49,0,102,108, +111,97,116,95,97,114,103,95,50,0,116,111,80,114,111,112,78,97,109,101,91,51,50,93,0,42,116,111,79,98,106,101, +99,116,0,98,111,100,121,84,121,112,101,0,102,105,108,101,110,97,109,101,91,54,52,93,0,108,111,97,100,97,110,105, +110,97,109,101,91,54,52,93,0,105,110,116,95,97,114,103,0,102,108,111,97,116,95,97,114,103,0,103,111,0,97,99, +99,101,108,108,101,114,97,116,105,111,110,0,109,97,120,115,112,101,101,100,0,109,97,120,114,111,116,115,112,101,101,100, +0,109,97,120,116,105,108,116,115,112,101,101,100,0,116,105,108,116,100,97,109,112,0,115,112,101,101,100,100,97,109,112, +0,42,115,97,109,112,108,101,0,42,115,116,114,101,97,109,0,42,110,101,119,112,97,99,107,101,100,102,105,108,101,0, +42,115,110,100,95,115,111,117,110,100,0,112,97,110,110,105,110,103,0,97,116,116,101,110,117,97,116,105,111,110,0,112, +105,116,99,104,0,109,105,110,95,103,97,105,110,0,109,97,120,95,103,97,105,110,0,100,105,115,116,97,110,99,101,0, +115,116,114,101,97,109,108,101,110,0,99,104,97,110,110,101,108,115,0,104,105,103,104,112,114,105,111,0,112,97,100,91, +49,48,93,0,103,97,105,110,0,100,111,112,112,108,101,114,102,97,99,116,111,114,0,100,111,112,112,108,101,114,118,101, +108,111,99,105,116,121,0,110,117,109,115,111,117,110,100,115,98,108,101,110,100,101,114,0,110,117,109,115,111,117,110,100, +115,103,97,109,101,101,110,103,105,110,101,0,42,108,97,109,112,114,101,110,0,103,111,98,106,101,99,116,0,100,117,112, +108,105,95,111,102,115,91,51,93,0,99,104,105,108,100,98,97,115,101,0,114,111,108,108,0,104,101,97,100,91,51,93, +0,116,97,105,108,91,51,93,0,98,111,110,101,95,109,97,116,91,51,93,91,51,93,0,97,114,109,95,104,101,97,100, +91,51,93,0,97,114,109,95,116,97,105,108,91,51,93,0,97,114,109,95,109,97,116,91,52,93,91,52,93,0,120,119, +105,100,116,104,0,122,119,105,100,116,104,0,101,97,115,101,49,0,101,97,115,101,50,0,114,97,100,95,104,101,97,100, +0,114,97,100,95,116,97,105,108,0,98,111,110,101,98,97,115,101,0,99,104,97,105,110,98,97,115,101,0,112,97,116, +104,102,108,97,103,0,108,97,121,101,114,95,112,114,111,116,101,99,116,101,100,0,103,104,111,115,116,101,112,0,103,104, +111,115,116,115,105,122,101,0,103,104,111,115,116,116,121,112,101,0,112,97,116,104,115,105,122,101,0,103,104,111,115,116, +115,102,0,103,104,111,115,116,101,102,0,112,97,116,104,115,102,0,112,97,116,104,101,102,0,112,97,116,104,98,99,0, +112,97,116,104,97,99,0,99,111,110,115,116,102,108,97,103,0,105,107,102,108,97,103,0,115,101,108,101,99,116,102,108, +97,103,0,97,103,114,112,95,105,110,100,101,120,0,42,98,111,110,101,0,42,99,104,105,108,100,0,105,107,116,114,101, +101,0,42,98,95,98,111,110,101,95,109,97,116,115,0,42,100,117,97,108,95,113,117,97,116,0,42,98,95,98,111,110, +101,95,100,117,97,108,95,113,117,97,116,115,0,99,104,97,110,95,109,97,116,91,52,93,91,52,93,0,112,111,115,101, +95,109,97,116,91,52,93,91,52,93,0,112,111,115,101,95,104,101,97,100,91,51,93,0,112,111,115,101,95,116,97,105, +108,91,51,93,0,108,105,109,105,116,109,105,110,91,51,93,0,108,105,109,105,116,109,97,120,91,51,93,0,115,116,105, +102,102,110,101,115,115,91,51,93,0,105,107,115,116,114,101,116,99,104,0,42,99,117,115,116,111,109,0,99,104,97,110, +98,97,115,101,0,112,114,111,120,121,95,108,97,121,101,114,0,115,116,114,105,100,101,95,111,102,102,115,101,116,91,51, +93,0,99,121,99,108,105,99,95,111,102,102,115,101,116,91,51,93,0,97,103,114,111,117,112,115,0,97,99,116,105,118, +101,95,103,114,111,117,112,0,99,117,115,116,111,109,67,111,108,0,99,115,0,42,103,114,112,0,114,101,115,101,114,118, +101,100,49,0,103,114,111,117,112,115,0,97,99,116,105,118,101,95,109,97,114,107,101,114,0,97,99,116,110,114,0,97, +99,116,119,105,100,116,104,0,116,105,109,101,115,108,105,100,101,0,110,97,109,101,91,51,48,93,0,111,119,110,115,112, +97,99,101,0,116,97,114,115,112,97,99,101,0,101,110,102,111,114,99,101,0,104,101,97,100,116,97,105,108,0,42,116, +97,114,0,115,117,98,116,97,114,103,101,116,91,51,50,93,0,109,97,116,114,105,120,91,52,93,91,52,93,0,115,112, +97,99,101,0,42,112,114,111,112,0,116,97,114,110,117,109,0,116,97,114,103,101,116,115,0,105,116,101,114,97,116,105, +111,110,115,0,114,111,111,116,98,111,110,101,0,109,97,120,95,114,111,111,116,98,111,110,101,0,42,112,111,108,101,116, +97,114,0,112,111,108,101,115,117,98,116,97,114,103,101,116,91,51,50,93,0,112,111,108,101,97,110,103,108,101,0,111, +114,105,101,110,116,119,101,105,103,104,116,0,103,114,97,98,116,97,114,103,101,116,91,51,93,0,114,101,115,101,114,118, +101,100,50,0,109,105,110,109,97,120,102,108,97,103,0,115,116,117,99,107,0,99,97,99,104,101,91,51,93,0,108,111, +99,107,102,108,97,103,0,102,111,108,108,111,119,102,108,97,103,0,118,111,108,109,111,100,101,0,112,108,97,110,101,0, +111,114,103,108,101,110,103,116,104,0,98,117,108,103,101,0,112,105,118,88,0,112,105,118,89,0,112,105,118,90,0,97, +120,88,0,97,120,89,0,97,120,90,0,109,105,110,76,105,109,105,116,91,54,93,0,109,97,120,76,105,109,105,116,91, +54,93,0,101,120,116,114,97,70,122,0,105,110,118,109,97,116,91,52,93,91,52,93,0,102,114,111,109,0,116,111,0, +109,97,112,91,51,93,0,101,120,112,111,0,102,114,111,109,95,109,105,110,91,51,93,0,102,114,111,109,95,109,97,120, +91,51,93,0,116,111,95,109,105,110,91,51,93,0,116,111,95,109,97,120,91,51,93,0,122,109,105,110,0,122,109,97, +120,0,112,97,100,91,57,93,0,99,104,97,110,110,101,108,91,51,50,93,0,110,111,95,114,111,116,95,97,120,105,115, +0,115,116,114,105,100,101,95,97,120,105,115,0,99,117,114,109,111,100,0,97,99,116,115,116,97,114,116,0,97,99,116, +101,110,100,0,97,99,116,111,102,102,115,0,115,116,114,105,100,101,108,101,110,0,98,108,101,110,100,111,117,116,0,115, +116,114,105,100,101,99,104,97,110,110,101,108,91,51,50,93,0,111,102,102,115,95,98,111,110,101,91,51,50,93,0,104, +97,115,105,110,112,117,116,0,104,97,115,111,117,116,112,117,116,0,100,97,116,97,116,121,112,101,0,115,111,99,107,101, +116,116,121,112,101,0,42,110,101,119,95,115,111,99,107,0,110,115,0,108,105,109,105,116,0,115,116,97,99,107,95,105, +110,100,101,120,0,105,110,116,101,114,110,0,115,116,97,99,107,95,105,110,100,101,120,95,101,120,116,0,108,111,99,120, +0,108,111,99,121,0,111,119,110,95,105,110,100,101,120,0,116,111,95,105,110,100,101,120,0,42,116,111,115,111,99,107, +0,42,108,105,110,107,0,42,110,101,119,95,110,111,100,101,0,117,115,101,114,110,97,109,101,91,51,50,93,0,108,97, +115,116,121,0,111,117,116,112,117,116,115,0,42,115,116,111,114,97,103,101,0,109,105,110,105,119,105,100,116,104,0,99, +117,115,116,111,109,49,0,99,117,115,116,111,109,50,0,99,117,115,116,111,109,51,0,99,117,115,116,111,109,52,0,110, +101,101,100,95,101,120,101,99,0,101,120,101,99,0,116,111,116,114,0,98,117,116,114,0,112,114,118,114,0,42,116,121, +112,101,105,110,102,111,0,42,102,114,111,109,110,111,100,101,0,42,116,111,110,111,100,101,0,42,102,114,111,109,115,111, +99,107,0,110,111,100,101,115,0,108,105,110,107,115,0,42,115,116,97,99,107,0,42,116,104,114,101,97,100,115,116,97, +99,107,0,105,110,105,116,0,115,116,97,99,107,115,105,122,101,0,99,117,114,95,105,110,100,101,120,0,97,108,108,116, +121,112,101,115,0,42,111,119,110,116,121,112,101,0,42,115,101,108,105,110,0,42,115,101,108,111,117,116,0,40,42,116, +105,109,101,99,117,114,115,111,114,41,40,41,0,40,42,115,116,97,116,115,95,100,114,97,119,41,40,41,0,40,42,116, +101,115,116,95,98,114,101,97,107,41,40,41,0,99,121,99,108,105,99,0,109,111,118,105,101,0,115,97,109,112,108,101, +115,0,109,105,110,115,112,101,101,100,0,112,101,114,99,101,110,116,120,0,112,101,114,99,101,110,116,121,0,98,111,107, +101,104,0,99,117,114,118,101,100,0,105,109,97,103,101,95,105,110,95,119,105,100,116,104,0,105,109,97,103,101,95,105, +110,95,104,101,105,103,104,116,0,99,101,110,116,101,114,95,120,0,99,101,110,116,101,114,95,121,0,115,112,105,110,0, +105,116,101,114,0,119,114,97,112,0,115,105,103,109,97,95,99,111,108,111,114,0,115,105,103,109,97,95,115,112,97,99, +101,0,104,117,101,0,115,97,116,0,116,49,0,116,50,0,116,51,0,102,115,116,114,101,110,103,116,104,0,102,97,108, +112,104,97,0,107,101,121,91,52,93,0,120,49,0,120,50,0,121,49,0,121,50,0,99,111,108,110,97,109,101,91,51, +50,93,0,98,107,116,121,112,101,0,114,111,116,97,116,105,111,110,0,112,114,101,118,105,101,119,0,103,97,109,99,111, +0,110,111,95,122,98,117,102,0,102,115,116,111,112,0,109,97,120,98,108,117,114,0,98,116,104,114,101,115,104,0,42, +100,105,99,116,0,42,110,111,100,101,0,97,110,103,108,101,95,111,102,115,0,99,111,108,109,111,100,0,109,105,120,0, +116,104,114,101,115,104,111,108,100,0,102,97,100,101,0,109,0,99,0,106,105,116,0,112,114,111,106,0,102,105,116,0, +115,104,111,114,116,121,0,109,105,110,116,97,98,108,101,0,109,97,120,116,97,98,108,101,0,101,120,116,95,105,110,91, +50,93,0,101,120,116,95,111,117,116,91,50,93,0,42,99,117,114,118,101,0,42,116,97,98,108,101,0,42,112,114,101, +109,117,108,116,97,98,108,101,0,99,117,114,114,0,99,108,105,112,114,0,99,109,91,52,93,0,98,108,97,99,107,91, +51,93,0,119,104,105,116,101,91,51,93,0,98,119,109,117,108,91,51,93,0,115,97,109,112,108,101,91,51,93,0,111, +102,102,115,101,116,91,50,93,0,105,110,110,101,114,114,97,100,105,117,115,0,114,97,116,101,0,114,103,98,91,51,93, +0,99,108,111,110,101,0,97,99,116,105,118,101,95,114,110,100,0,97,99,116,105,118,101,95,99,108,111,110,101,0,97, +99,116,105,118,101,95,109,97,115,107,0,42,108,97,121,101,114,115,0,116,111,116,108,97,121,101,114,0,109,97,120,108, +97,121,101,114,0,116,111,116,115,105,122,101,0,42,112,111,111,108,0,101,100,105,116,102,108,97,103,0,118,101,108,91, +51,93,0,114,111,116,91,52,93,0,97,118,101,91,51,93,0,110,117,109,0,112,97,114,101,110,116,0,112,97,91,52, +93,0,119,91,52,93,0,102,117,118,91,52,93,0,102,111,102,102,115,101,116,0,114,97,110,100,91,51,93,0,42,115, +116,105,99,107,95,111,98,0,112,114,101,118,95,115,116,97,116,101,0,42,104,97,105,114,0,105,95,114,111,116,91,52, +93,0,114,95,114,111,116,91,52,93,0,114,95,97,118,101,91,51,93,0,114,95,118,101,91,51,93,0,100,105,101,116, +105,109,101,0,98,97,110,107,0,115,105,122,101,109,117,108,0,110,117,109,95,100,109,99,97,99,104,101,0,98,112,105, +0,97,108,105,118,101,0,108,111,111,112,0,100,105,115,116,114,0,112,104,121,115,116,121,112,101,0,114,111,116,109,111, +100,101,0,97,118,101,109,111,100,101,0,114,101,97,99,116,101,118,101,110,116,0,100,114,97,119,0,100,114,97,119,95, +97,115,0,100,114,97,119,95,115,105,122,101,0,99,104,105,108,100,116,121,112,101,0,100,114,97,119,95,115,116,101,112, +0,114,101,110,95,115,116,101,112,0,104,97,105,114,95,115,116,101,112,0,107,101,121,115,95,115,116,101,112,0,97,100, +97,112,116,95,97,110,103,108,101,0,97,100,97,112,116,95,112,105,120,0,114,111,116,102,114,111,109,0,105,110,116,101, +103,114,97,116,111,114,0,110,98,101,116,119,101,101,110,0,98,111,105,100,110,101,105,103,104,98,111,117,114,115,0,98, +98,95,97,108,105,103,110,0,98,98,95,117,118,95,115,112,108,105,116,0,98,98,95,97,110,105,109,0,98,98,95,115, +112,108,105,116,95,111,102,102,115,101,116,0,98,98,95,116,105,108,116,0,98,98,95,114,97,110,100,95,116,105,108,116, +0,98,98,95,111,102,102,115,101,116,91,50,93,0,115,105,109,112,108,105,102,121,95,102,108,97,103,0,115,105,109,112, +108,105,102,121,95,114,101,102,115,105,122,101,0,115,105,109,112,108,105,102,121,95,114,97,116,101,0,115,105,109,112,108, +105,102,121,95,116,114,97,110,115,105,116,105,111,110,0,115,105,109,112,108,105,102,121,95,118,105,101,119,112,111,114,116, +0,116,105,109,101,116,119,101,97,107,0,106,105,116,102,97,99,0,107,101,121,101,100,95,116,105,109,101,0,101,102,102, +95,104,97,105,114,0,103,114,105,100,95,114,101,115,0,112,97,114,116,102,97,99,0,116,97,110,102,97,99,0,116,97, +110,112,104,97,115,101,0,114,101,97,99,116,102,97,99,0,97,118,101,102,97,99,0,112,104,97,115,101,102,97,99,0, +114,97,110,100,114,111,116,102,97,99,0,114,97,110,100,112,104,97,115,101,102,97,99,0,114,97,110,100,115,105,122,101, +0,114,101,97,99,116,115,104,97,112,101,0,97,99,99,91,51,93,0,100,114,97,103,102,97,99,0,98,114,111,119,110, +102,97,99,0,100,97,109,112,102,97,99,0,97,98,115,108,101,110,103,116,104,0,114,97,110,100,108,101,110,103,116,104, +0,99,104,105,108,100,95,110,98,114,0,114,101,110,95,99,104,105,108,100,95,110,98,114,0,112,97,114,101,110,116,115, +0,99,104,105,108,100,115,105,122,101,0,99,104,105,108,100,114,97,110,100,115,105,122,101,0,99,104,105,108,100,114,97, +100,0,99,104,105,108,100,102,108,97,116,0,99,104,105,108,100,115,112,114,101,97,100,0,99,108,117,109,112,102,97,99, +0,99,108,117,109,112,112,111,119,0,114,111,117,103,104,49,0,114,111,117,103,104,49,95,115,105,122,101,0,114,111,117, +103,104,50,0,114,111,117,103,104,50,95,115,105,122,101,0,114,111,117,103,104,50,95,116,104,114,101,115,0,114,111,117, +103,104,95,101,110,100,0,114,111,117,103,104,95,101,110,100,95,115,104,97,112,101,0,98,114,97,110,99,104,95,116,104, +114,101,115,0,100,114,97,119,95,108,105,110,101,91,50,93,0,109,97,120,95,108,97,116,95,97,99,99,0,109,97,120, +95,116,97,110,95,97,99,99,0,97,118,101,114,97,103,101,95,118,101,108,0,98,97,110,107,105,110,103,0,109,97,120, +95,98,97,110,107,0,103,114,111,117,110,100,122,0,98,111,105,100,102,97,99,91,56,93,0,98,111,105,100,114,117,108, +101,91,56,93,0,42,101,102,102,95,103,114,111,117,112,0,42,100,117,112,95,111,98,0,42,98,98,95,111,98,0,42, +112,100,50,0,42,112,97,114,116,0,42,101,100,105,116,0,42,42,112,97,116,104,99,97,99,104,101,0,42,42,99,104, +105,108,100,99,97,99,104,101,0,112,97,116,104,99,97,99,104,101,98,117,102,115,0,99,104,105,108,100,99,97,99,104, +101,98,117,102,115,0,42,116,97,114,103,101,116,95,111,98,0,42,107,101,121,101,100,95,111,98,0,42,108,97,116,116, +105,99,101,0,101,102,102,101,99,116,111,114,115,0,114,101,97,99,116,101,118,101,110,116,115,0,116,111,116,99,104,105, +108,100,0,116,111,116,99,97,99,104,101,100,0,116,111,116,99,104,105,108,100,99,97,99,104,101,0,116,97,114,103,101, +116,95,112,115,121,115,0,107,101,121,101,100,95,112,115,121,115,0,116,111,116,107,101,121,101,100,0,98,97,107,101,115, +112,97,99,101,0,98,98,95,117,118,110,97,109,101,91,51,93,91,51,50,93,0,118,103,114,111,117,112,91,49,50,93, +0,118,103,95,110,101,103,0,114,116,51,0,42,114,101,110,100,101,114,100,97,116,97,0,42,99,97,99,104,101,0,67, +100,105,115,0,67,118,105,0,91,51,93,0,115,116,114,117,99,116,117,114,97,108,0,98,101,110,100,105,110,103,0,109, +97,120,95,98,101,110,100,0,109,97,120,95,115,116,114,117,99,116,0,109,97,120,95,115,104,101,97,114,0,97,118,103, +95,115,112,114,105,110,103,95,108,101,110,0,116,105,109,101,115,99,97,108,101,0,101,102,102,95,102,111,114,99,101,95, +115,99,97,108,101,0,101,102,102,95,119,105,110,100,95,115,99,97,108,101,0,115,105,109,95,116,105,109,101,95,111,108, +100,0,115,116,101,112,115,80,101,114,70,114,97,109,101,0,112,114,101,114,111,108,108,0,109,97,120,115,112,114,105,110, +103,108,101,110,0,115,111,108,118,101,114,95,116,121,112,101,0,118,103,114,111,117,112,95,98,101,110,100,0,118,103,114, +111,117,112,95,109,97,115,115,0,118,103,114,111,117,112,95,115,116,114,117,99,116,0,112,114,101,115,101,116,115,0,42, +99,111,108,108,105,115,105,111,110,95,108,105,115,116,0,101,112,115,105,108,111,110,0,115,101,108,102,95,102,114,105,99, +116,105,111,110,0,115,101,108,102,101,112,115,105,108,111,110,0,115,101,108,102,95,108,111,111,112,95,99,111,117,110,116, +0,108,111,111,112,95,99,111,117,110,116,0,112,114,101,115,115,117,114,101,0,42,112,111,105,110,116,115,0,116,111,116, +112,111,105,110,116,115,0,116,104,105,99,107,110,101,115,115,0,115,116,114,111,107,101,115,0,102,114,97,109,101,110,117, +109,0,42,97,99,116,102,114,97,109,101,0,103,115,116,101,112,0,105,110,102,111,91,49,50,56,93,0,115,98,117,102, +102,101,114,95,115,105,122,101,0,115,98,117,102,102,101,114,95,115,102,108,97,103,0,42,115,98,117,102,102,101,114,0, +0,0,0,84,89,80,69,100,1,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104,111, +114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118, +111,105,100,0,76,105,110,107,0,76,105,110,107,68,97,116,97,0,76,105,115,116,66,97,115,101,0,118,101,99,50,115, +0,118,101,99,50,105,0,118,101,99,50,102,0,118,101,99,50,100,0,118,101,99,51,105,0,118,101,99,51,102,0,118, +101,99,51,100,0,118,101,99,52,105,0,118,101,99,52,102,0,118,101,99,52,100,0,114,99,116,105,0,114,99,116,102, +0,73,68,80,114,111,112,101,114,116,121,68,97,116,97,0,73,68,80,114,111,112,101,114,116,121,0,73,68,0,76,105, +98,114,97,114,121,0,70,105,108,101,68,97,116,97,0,80,114,101,118,105,101,119,73,109,97,103,101,0,73,112,111,68, +114,105,118,101,114,0,79,98,106,101,99,116,0,73,112,111,67,117,114,118,101,0,66,80,111,105,110,116,0,66,101,122, +84,114,105,112,108,101,0,73,112,111,0,75,101,121,66,108,111,99,107,0,75,101,121,0,83,99,114,105,112,116,76,105, +110,107,0,84,101,120,116,76,105,110,101,0,84,101,120,116,77,97,114,107,101,114,0,84,101,120,116,0,80,97,99,107, +101,100,70,105,108,101,0,67,97,109,101,114,97,0,73,109,97,103,101,85,115,101,114,0,73,109,97,103,101,0,71,80, +85,84,101,120,116,117,114,101,0,97,110,105,109,0,82,101,110,100,101,114,82,101,115,117,108,116,0,77,84,101,120,0, +84,101,120,0,80,108,117,103,105,110,84,101,120,0,67,66,68,97,116,97,0,67,111,108,111,114,66,97,110,100,0,69, +110,118,77,97,112,0,73,109,66,117,102,0,98,78,111,100,101,84,114,101,101,0,84,101,120,77,97,112,112,105,110,103, +0,76,97,109,112,0,67,117,114,118,101,77,97,112,112,105,110,103,0,87,97,118,101,0,77,97,116,101,114,105,97,108, +0,71,114,111,117,112,0,86,70,111,110,116,0,86,70,111,110,116,68,97,116,97,0,77,101,116,97,69,108,101,109,0, +66,111,117,110,100,66,111,120,0,77,101,116,97,66,97,108,108,0,78,117,114,98,0,67,104,97,114,73,110,102,111,0, +84,101,120,116,66,111,120,0,67,117,114,118,101,0,80,97,116,104,0,77,101,115,104,0,77,70,97,99,101,0,77,84, +70,97,99,101,0,84,70,97,99,101,0,77,86,101,114,116,0,77,69,100,103,101,0,77,68,101,102,111,114,109,86,101, +114,116,0,77,67,111,108,0,77,83,116,105,99,107,121,0,77,83,101,108,101,99,116,0,67,117,115,116,111,109,68,97, +116,97,0,77,117,108,116,105,114,101,115,0,80,97,114,116,105,97,108,86,105,115,105,98,105,108,105,116,121,0,77,68, +101,102,111,114,109,87,101,105,103,104,116,0,77,84,101,120,80,111,108,121,0,77,76,111,111,112,85,86,0,77,76,111, +111,112,67,111,108,0,77,70,108,111,97,116,80,114,111,112,101,114,116,121,0,77,73,110,116,80,114,111,112,101,114,116, +121,0,77,83,116,114,105,110,103,80,114,111,112,101,114,116,121,0,79,114,105,103,83,112,97,99,101,70,97,99,101,0, +77,117,108,116,105,114,101,115,67,111,108,0,77,117,108,116,105,114,101,115,67,111,108,70,97,99,101,0,77,117,108,116, +105,114,101,115,70,97,99,101,0,77,117,108,116,105,114,101,115,69,100,103,101,0,77,117,108,116,105,114,101,115,76,101, +118,101,108,0,77,117,108,116,105,114,101,115,77,97,112,78,111,100,101,0,77,111,100,105,102,105,101,114,68,97,116,97, +0,83,117,98,115,117,114,102,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,77,111,100,105, +102,105,101,114,68,97,116,97,0,67,117,114,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,66,117,105,108,100, +77,111,100,105,102,105,101,114,68,97,116,97,0,77,97,115,107,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114, +114,97,121,77,111,100,105,102,105,101,114,68,97,116,97,0,77,105,114,114,111,114,77,111,100,105,102,105,101,114,68,97, +116,97,0,69,100,103,101,83,112,108,105,116,77,111,100,105,102,105,101,114,68,97,116,97,0,66,101,118,101,108,77,111, +100,105,102,105,101,114,68,97,116,97,0,66,77,101,115,104,77,111,100,105,102,105,101,114,68,97,116,97,0,68,105,115, +112,108,97,99,101,77,111,100,105,102,105,101,114,68,97,116,97,0,85,86,80,114,111,106,101,99,116,77,111,100,105,102, +105,101,114,68,97,116,97,0,68,101,99,105,109,97,116,101,77,111,100,105,102,105,101,114,68,97,116,97,0,83,109,111, +111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67,97,115,116,77,111,100,105,102,105,101,114,68,97,116,97, +0,87,97,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114,109,97,116,117,114,101,77,111,100,105,102,105, +101,114,68,97,116,97,0,72,111,111,107,77,111,100,105,102,105,101,114,68,97,116,97,0,83,111,102,116,98,111,100,121, +77,111,100,105,102,105,101,114,68,97,116,97,0,67,108,111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67, +108,111,116,104,0,67,108,111,116,104,83,105,109,83,101,116,116,105,110,103,115,0,67,108,111,116,104,67,111,108,108,83, +101,116,116,105,110,103,115,0,80,111,105,110,116,67,97,99,104,101,0,67,111,108,108,105,115,105,111,110,77,111,100,105, +102,105,101,114,68,97,116,97,0,66,86,72,84,114,101,101,0,83,117,114,102,97,99,101,77,111,100,105,102,105,101,114, +68,97,116,97,0,68,101,114,105,118,101,100,77,101,115,104,0,66,86,72,84,114,101,101,70,114,111,109,77,101,115,104, +0,66,111,111,108,101,97,110,77,111,100,105,102,105,101,114,68,97,116,97,0,77,68,101,102,73,110,102,108,117,101,110, +99,101,0,77,68,101,102,67,101,108,108,0,77,101,115,104,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97, +116,97,0,80,97,114,116,105,99,108,101,83,121,115,116,101,109,77,111,100,105,102,105,101,114,68,97,116,97,0,80,97, +114,116,105,99,108,101,83,121,115,116,101,109,0,80,97,114,116,105,99,108,101,73,110,115,116,97,110,99,101,77,111,100, +105,102,105,101,114,68,97,116,97,0,69,120,112,108,111,100,101,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108, +117,105,100,115,105,109,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108,117,105,100,115,105,109,83,101,116,116,105, +110,103,115,0,83,104,114,105,110,107,119,114,97,112,77,111,100,105,102,105,101,114,68,97,116,97,0,83,105,109,112,108, +101,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,0,98,68,101,102, +111,114,109,71,114,111,117,112,0,98,65,99,116,105,111,110,0,98,80,111,115,101,0,66,117,108,108,101,116,83,111,102, +116,66,111,100,121,0,80,97,114,116,68,101,102,108,101,99,116,0,83,111,102,116,66,111,100,121,0,79,98,72,111,111, +107,0,82,78,71,0,83,66,86,101,114,116,101,120,0,66,111,100,121,80,111,105,110,116,0,66,111,100,121,83,112,114, +105,110,103,0,83,66,83,99,114,97,116,99,104,0,87,111,114,108,100,0,82,97,100,105,111,0,66,97,115,101,0,65, +118,105,67,111,100,101,99,68,97,116,97,0,81,117,105,99,107,116,105,109,101,67,111,100,101,99,68,97,116,97,0,70, +70,77,112,101,103,67,111,100,101,99,68,97,116,97,0,65,117,100,105,111,68,97,116,97,0,83,99,101,110,101,82,101, +110,100,101,114,76,97,121,101,114,0,82,101,110,100,101,114,68,97,116,97,0,82,101,110,100,101,114,80,114,111,102,105, +108,101,0,71,97,109,101,70,114,97,109,105,110,103,0,84,105,109,101,77,97,114,107,101,114,0,73,109,97,103,101,80, +97,105,110,116,83,101,116,116,105,110,103,115,0,66,114,117,115,104,0,80,97,114,116,105,99,108,101,66,114,117,115,104, +68,97,116,97,0,80,97,114,116,105,99,108,101,69,100,105,116,83,101,116,116,105,110,103,115,0,84,114,97,110,115,102, +111,114,109,79,114,105,101,110,116,97,116,105,111,110,0,84,111,111,108,83,101,116,116,105,110,103,115,0,66,114,117,115, +104,68,97,116,97,0,83,99,117,108,112,116,68,97,116,97,0,83,99,117,108,112,116,83,101,115,115,105,111,110,0,83, +99,101,110,101,0,68,97,103,70,111,114,101,115,116,0,66,71,112,105,99,0,86,105,101,119,51,68,0,83,112,97,99, +101,76,105,110,107,0,83,99,114,65,114,101,97,0,82,101,110,100,101,114,73,110,102,111,0,82,101,116,111,112,111,86, +105,101,119,68,97,116,97,0,86,105,101,119,68,101,112,116,104,115,0,98,71,80,100,97,116,97,0,86,105,101,119,50, +68,0,83,112,97,99,101,73,110,102,111,0,83,112,97,99,101,73,112,111,0,83,112,97,99,101,66,117,116,115,0,83, +112,97,99,101,83,101,113,0,83,112,97,99,101,70,105,108,101,0,100,105,114,101,110,116,114,121,0,66,108,101,110,100, +72,97,110,100,108,101,0,83,112,97,99,101,79,111,112,115,0,84,114,101,101,83,116,111,114,101,0,84,114,101,101,83, +116,111,114,101,69,108,101,109,0,83,112,97,99,101,73,109,97,103,101,0,83,112,97,99,101,78,108,97,0,83,112,97, +99,101,84,101,120,116,0,83,99,114,105,112,116,0,83,112,97,99,101,83,99,114,105,112,116,0,83,112,97,99,101,84, +105,109,101,0,83,112,97,99,101,78,111,100,101,0,83,112,97,99,101,73,109,97,83,101,108,0,70,105,108,101,76,105, +115,116,0,84,104,101,109,101,85,73,0,84,104,101,109,101,83,112,97,99,101,0,84,104,101,109,101,87,105,114,101,67, +111,108,111,114,0,98,84,104,101,109,101,0,83,111,108,105,100,76,105,103,104,116,0,85,115,101,114,68,101,102,0,98, +83,99,114,101,101,110,0,83,99,114,86,101,114,116,0,83,99,114,69,100,103,101,0,80,97,110,101,108,0,70,105,108, +101,71,108,111,98,97,108,0,83,116,114,105,112,69,108,101,109,0,84,83,116,114,105,112,69,108,101,109,0,83,116,114, +105,112,67,114,111,112,0,83,116,114,105,112,84,114,97,110,115,102,111,114,109,0,83,116,114,105,112,67,111,108,111,114, +66,97,108,97,110,99,101,0,83,116,114,105,112,67,111,108,111,114,66,97,108,97,110,99,101,71,85,73,72,101,108,112, +101,114,0,83,116,114,105,112,80,114,111,120,121,0,83,116,114,105,112,0,80,108,117,103,105,110,83,101,113,0,83,101, +113,117,101,110,99,101,0,98,83,111,117,110,100,0,104,100,97,117,100,105,111,0,77,101,116,97,83,116,97,99,107,0, +69,100,105,116,105,110,103,0,87,105,112,101,86,97,114,115,0,71,108,111,119,86,97,114,115,0,84,114,97,110,115,102, +111,114,109,86,97,114,115,0,83,111,108,105,100,67,111,108,111,114,86,97,114,115,0,83,112,101,101,100,67,111,110,116, +114,111,108,86,97,114,115,0,69,102,102,101,99,116,0,66,117,105,108,100,69,102,102,0,80,97,114,116,69,102,102,0, +80,97,114,116,105,99,108,101,0,87,97,118,101,69,102,102,0,79,111,112,115,0,98,80,114,111,112,101,114,116,121,0, +98,78,101,97,114,83,101,110,115,111,114,0,98,77,111,117,115,101,83,101,110,115,111,114,0,98,84,111,117,99,104,83, +101,110,115,111,114,0,98,75,101,121,98,111,97,114,100,83,101,110,115,111,114,0,98,80,114,111,112,101,114,116,121,83, +101,110,115,111,114,0,98,65,99,116,117,97,116,111,114,83,101,110,115,111,114,0,98,68,101,108,97,121,83,101,110,115, +111,114,0,98,67,111,108,108,105,115,105,111,110,83,101,110,115,111,114,0,98,82,97,100,97,114,83,101,110,115,111,114, +0,98,82,97,110,100,111,109,83,101,110,115,111,114,0,98,82,97,121,83,101,110,115,111,114,0,98,77,101,115,115,97, +103,101,83,101,110,115,111,114,0,98,83,101,110,115,111,114,0,98,67,111,110,116,114,111,108,108,101,114,0,98,74,111, +121,115,116,105,99,107,83,101,110,115,111,114,0,98,69,120,112,114,101,115,115,105,111,110,67,111,110,116,0,98,80,121, +116,104,111,110,67,111,110,116,0,98,65,99,116,117,97,116,111,114,0,98,65,100,100,79,98,106,101,99,116,65,99,116, +117,97,116,111,114,0,98,65,99,116,105,111,110,65,99,116,117,97,116,111,114,0,98,83,111,117,110,100,65,99,116,117, +97,116,111,114,0,98,67,68,65,99,116,117,97,116,111,114,0,98,69,100,105,116,79,98,106,101,99,116,65,99,116,117, +97,116,111,114,0,98,83,99,101,110,101,65,99,116,117,97,116,111,114,0,98,80,114,111,112,101,114,116,121,65,99,116, +117,97,116,111,114,0,98,79,98,106,101,99,116,65,99,116,117,97,116,111,114,0,98,73,112,111,65,99,116,117,97,116, +111,114,0,98,67,97,109,101,114,97,65,99,116,117,97,116,111,114,0,98,67,111,110,115,116,114,97,105,110,116,65,99, +116,117,97,116,111,114,0,98,71,114,111,117,112,65,99,116,117,97,116,111,114,0,98,82,97,110,100,111,109,65,99,116, +117,97,116,111,114,0,98,77,101,115,115,97,103,101,65,99,116,117,97,116,111,114,0,98,71,97,109,101,65,99,116,117, +97,116,111,114,0,98,86,105,115,105,98,105,108,105,116,121,65,99,116,117,97,116,111,114,0,98,84,119,111,68,70,105, +108,116,101,114,65,99,116,117,97,116,111,114,0,98,80,97,114,101,110,116,65,99,116,117,97,116,111,114,0,98,83,116, +97,116,101,65,99,116,117,97,116,111,114,0,70,114,101,101,67,97,109,101,114,97,0,98,83,97,109,112,108,101,0,98, +83,111,117,110,100,76,105,115,116,101,110,101,114,0,83,112,97,99,101,83,111,117,110,100,0,71,114,111,117,112,79,98, +106,101,99,116,0,66,111,110,101,0,98,65,114,109,97,116,117,114,101,0,98,80,111,115,101,67,104,97,110,110,101,108, +0,98,65,99,116,105,111,110,71,114,111,117,112,0,98,65,99,116,105,111,110,67,104,97,110,110,101,108,0,83,112,97, +99,101,65,99,116,105,111,110,0,98,67,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,0,98,67,111,110, +115,116,114,97,105,110,116,0,98,67,111,110,115,116,114,97,105,110,116,84,97,114,103,101,116,0,98,80,121,116,104,111, +110,67,111,110,115,116,114,97,105,110,116,0,98,75,105,110,101,109,97,116,105,99,67,111,110,115,116,114,97,105,110,116, +0,98,84,114,97,99,107,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,111,116,97,116,101,76,105,107,101,67, +111,110,115,116,114,97,105,110,116,0,98,76,111,99,97,116,101,76,105,107,101,67,111,110,115,116,114,97,105,110,116,0, +98,77,105,110,77,97,120,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,107,101,67,111,110,115,116, +114,97,105,110,116,0,98,65,99,116,105,111,110,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,107,84,114,97, +99,107,67,111,110,115,116,114,97,105,110,116,0,98,70,111,108,108,111,119,80,97,116,104,67,111,110,115,116,114,97,105, +110,116,0,98,83,116,114,101,116,99,104,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,105,103,105,100,66,111, +100,121,74,111,105,110,116,67,111,110,115,116,114,97,105,110,116,0,98,67,108,97,109,112,84,111,67,111,110,115,116,114, +97,105,110,116,0,98,67,104,105,108,100,79,102,67,111,110,115,116,114,97,105,110,116,0,98,84,114,97,110,115,102,111, +114,109,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116, +0,98,82,111,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,109,105,116,67, +111,110,115,116,114,97,105,110,116,0,98,68,105,115,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98, +83,104,114,105,110,107,119,114,97,112,67,111,110,115,116,114,97,105,110,116,0,98,65,99,116,105,111,110,77,111,100,105, +102,105,101,114,0,98,65,99,116,105,111,110,83,116,114,105,112,0,98,78,111,100,101,83,116,97,99,107,0,98,78,111, +100,101,83,111,99,107,101,116,0,98,78,111,100,101,76,105,110,107,0,98,78,111,100,101,0,98,78,111,100,101,80,114, +101,118,105,101,119,0,98,78,111,100,101,84,121,112,101,0,78,111,100,101,73,109,97,103,101,65,110,105,109,0,78,111, +100,101,66,108,117,114,68,97,116,97,0,78,111,100,101,68,66,108,117,114,68,97,116,97,0,78,111,100,101,66,105,108, +97,116,101,114,97,108,66,108,117,114,68,97,116,97,0,78,111,100,101,72,117,101,83,97,116,0,78,111,100,101,73,109, +97,103,101,70,105,108,101,0,78,111,100,101,67,104,114,111,109,97,0,78,111,100,101,84,119,111,88,89,115,0,78,111, +100,101,84,119,111,70,108,111,97,116,115,0,78,111,100,101,71,101,111,109,101,116,114,121,0,78,111,100,101,86,101,114, +116,101,120,67,111,108,0,78,111,100,101,68,101,102,111,99,117,115,0,78,111,100,101,83,99,114,105,112,116,68,105,99, +116,0,78,111,100,101,71,108,97,114,101,0,78,111,100,101,84,111,110,101,109,97,112,0,78,111,100,101,76,101,110,115, +68,105,115,116,0,84,101,120,78,111,100,101,79,117,116,112,117,116,0,67,117,114,118,101,77,97,112,80,111,105,110,116, +0,67,117,114,118,101,77,97,112,0,66,114,117,115,104,67,108,111,110,101,0,67,117,115,116,111,109,68,97,116,97,76, +97,121,101,114,0,72,97,105,114,75,101,121,0,80,97,114,116,105,99,108,101,75,101,121,0,67,104,105,108,100,80,97, +114,116,105,99,108,101,0,80,97,114,116,105,99,108,101,68,97,116,97,0,80,97,114,116,105,99,108,101,83,101,116,116, +105,110,103,115,0,80,97,114,116,105,99,108,101,69,100,105,116,0,80,97,114,116,105,99,108,101,67,97,99,104,101,75, +101,121,0,76,105,110,107,78,111,100,101,0,98,71,80,68,115,112,111,105,110,116,0,98,71,80,68,115,116,114,111,107, +101,0,98,71,80,68,102,114,97,109,101,0,98,71,80,68,108,97,121,101,114,0,0,84,76,69,78,1,0,1,0,2, +0,2,0,4,0,4,0,4,0,4,0,8,0,0,0,16,0,24,0,16,0,4,0,8,0,8,0,16,0,12,0,12, +0,24,0,16,0,16,0,32,0,16,0,16,0,32,0,96,0,72,0,72,2,0,0,40,0,-112,0,48,4,112,0,36, +0,56,0,112,0,-128,0,-96,0,24,0,40,0,48,0,-80,0,24,0,-88,0,32,0,-72,1,0,0,0,0,0,0,-112, +0,64,1,120,1,24,0,8,3,-56,0,0,0,-56,0,-120,0,-16,1,56,1,80,0,-16,2,104,0,96,1,0,0,-128, +0,104,0,-72,0,80,0,8,0,16,0,-96,1,0,0,-112,1,20,0,48,0,64,0,24,0,12,0,16,0,4,0,8, +0,8,0,32,0,112,0,48,0,8,0,16,0,8,0,8,0,4,0,4,0,0,1,32,0,16,0,64,0,24,0,12, +0,96,0,0,0,64,0,88,0,104,0,112,0,80,0,112,0,-112,0,80,0,72,0,120,0,72,0,-88,0,-48,0,72, +0,104,0,120,0,-48,0,120,0,-56,0,64,0,96,0,0,0,-120,0,32,0,20,0,-112,0,0,0,80,0,0,0,0, +0,80,0,8,0,8,0,0,1,96,0,-104,1,80,0,80,0,80,0,-72,1,-128,0,120,0,-104,0,48,0,-128,0,72, +0,120,0,-120,0,16,1,-32,0,0,0,16,0,0,0,0,0,0,0,-32,1,40,0,40,0,-72,0,-104,0,56,0,16, +0,88,0,-24,3,64,0,16,0,88,0,16,0,24,1,8,0,72,0,88,0,-16,0,8,0,-8,0,0,0,64,6,0, +0,64,0,88,3,48,0,8,1,0,0,0,0,0,0,32,0,-120,0,48,0,120,1,-16,0,-40,0,-8,1,0,0,0, +0,48,1,16,0,16,0,32,1,-64,0,-112,0,120,2,56,0,-80,0,0,1,-72,2,0,0,-104,0,-48,0,16,0,64, +14,56,0,40,12,-88,0,32,0,40,0,-16,0,40,0,80,0,48,0,16,0,8,0,64,0,0,0,0,1,32,1,-56, +1,8,1,72,1,0,0,32,0,48,0,12,0,24,0,48,0,16,0,32,0,24,0,32,0,72,1,0,0,64,0,64, +0,80,0,48,0,8,0,48,0,72,0,104,0,40,0,8,0,72,0,44,0,40,0,108,0,72,0,96,0,104,0,60, +0,-128,0,80,0,80,0,16,0,96,0,32,0,20,0,88,0,24,0,80,0,112,0,84,0,32,0,96,0,64,0,56, +0,112,0,-116,0,4,0,24,0,16,0,8,0,40,0,0,0,88,0,-64,0,40,0,24,1,-104,0,-48,1,88,0,88, +0,-48,0,56,0,80,0,-128,0,80,0,112,0,56,0,48,0,48,0,72,0,48,0,72,0,48,0,24,0,56,0,104, +0,16,0,112,0,96,0,28,0,28,0,28,0,56,0,24,0,72,0,-88,0,40,0,-112,0,48,0,-8,0,0,0,0, +0,16,0,40,0,28,0,12,0,12,0,16,1,40,0,8,0,8,0,64,0,32,0,24,0,16,0,24,0,32,0,8, +0,32,0,12,0,56,0,24,0,72,0,24,0,56,0,72,0,8,1,16,2,0,0,0,0,0,0,16,0,32,0,40, +0,-64,0,83,84,82,67,57,1,0,0,10,0,2,0,10,0,0,0,10,0,1,0,11,0,3,0,11,0,0,0,11, +0,1,0,9,0,2,0,12,0,2,0,9,0,3,0,9,0,4,0,13,0,2,0,2,0,5,0,2,0,6,0,14, +0,2,0,4,0,5,0,4,0,6,0,15,0,2,0,7,0,5,0,7,0,6,0,16,0,2,0,8,0,5,0,8, +0,6,0,17,0,3,0,4,0,5,0,4,0,6,0,4,0,7,0,18,0,3,0,7,0,5,0,7,0,6,0,7, +0,7,0,19,0,3,0,8,0,5,0,8,0,6,0,8,0,7,0,20,0,4,0,4,0,5,0,4,0,6,0,4, +0,7,0,4,0,8,0,21,0,4,0,7,0,5,0,7,0,6,0,7,0,7,0,7,0,8,0,22,0,4,0,8, +0,5,0,8,0,6,0,8,0,7,0,8,0,8,0,23,0,4,0,4,0,9,0,4,0,10,0,4,0,11,0,4, +0,12,0,24,0,4,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,25,0,4,0,9,0,13,0,12, +0,14,0,4,0,15,0,4,0,16,0,26,0,10,0,26,0,0,0,26,0,1,0,0,0,17,0,0,0,18,0,0, +0,19,0,2,0,20,0,4,0,21,0,25,0,22,0,4,0,23,0,4,0,24,0,27,0,9,0,9,0,0,0,9, +0,1,0,27,0,25,0,28,0,26,0,0,0,27,0,2,0,28,0,2,0,20,0,4,0,29,0,26,0,30,0,28, +0,8,0,27,0,31,0,27,0,32,0,29,0,33,0,0,0,34,0,0,0,35,0,4,0,36,0,4,0,37,0,28, +0,38,0,30,0,6,0,4,0,39,0,4,0,40,0,2,0,41,0,2,0,42,0,2,0,43,0,4,0,44,0,31, +0,6,0,32,0,45,0,2,0,46,0,2,0,47,0,2,0,18,0,2,0,20,0,0,0,48,0,33,0,21,0,33, +0,0,0,33,0,1,0,34,0,49,0,35,0,50,0,24,0,51,0,24,0,52,0,2,0,46,0,2,0,47,0,2, +0,53,0,2,0,54,0,2,0,55,0,2,0,56,0,2,0,20,0,2,0,57,0,7,0,11,0,7,0,12,0,4, +0,58,0,7,0,59,0,7,0,60,0,7,0,61,0,31,0,62,0,36,0,7,0,27,0,31,0,12,0,63,0,24, +0,64,0,2,0,46,0,2,0,65,0,2,0,66,0,2,0,37,0,37,0,16,0,37,0,0,0,37,0,1,0,7, +0,67,0,7,0,61,0,2,0,18,0,2,0,47,0,2,0,68,0,2,0,20,0,4,0,69,0,4,0,70,0,9, +0,2,0,7,0,71,0,0,0,17,0,0,0,72,0,7,0,73,0,7,0,74,0,38,0,12,0,27,0,31,0,37, +0,75,0,0,0,76,0,4,0,77,0,7,0,61,0,12,0,78,0,36,0,79,0,27,0,80,0,2,0,18,0,2, +0,81,0,2,0,82,0,2,0,20,0,39,0,5,0,27,0,83,0,2,0,84,0,2,0,85,0,2,0,86,0,4, +0,37,0,40,0,6,0,40,0,0,0,40,0,1,0,0,0,87,0,0,0,88,0,4,0,23,0,4,0,89,0,41, +0,10,0,41,0,0,0,41,0,1,0,4,0,90,0,4,0,91,0,4,0,92,0,4,0,43,0,4,0,14,0,4, +0,93,0,0,0,94,0,0,0,95,0,42,0,15,0,27,0,31,0,0,0,96,0,4,0,93,0,4,0,97,0,12, +0,98,0,40,0,99,0,40,0,100,0,4,0,101,0,4,0,102,0,12,0,103,0,0,0,104,0,4,0,105,0,4, +0,106,0,9,0,107,0,8,0,108,0,43,0,5,0,4,0,109,0,4,0,110,0,4,0,93,0,4,0,37,0,9, +0,2,0,44,0,20,0,27,0,31,0,2,0,18,0,2,0,20,0,7,0,111,0,7,0,112,0,7,0,113,0,7, +0,114,0,7,0,115,0,7,0,116,0,7,0,117,0,7,0,118,0,7,0,119,0,7,0,120,0,7,0,121,0,2, +0,122,0,2,0,123,0,7,0,124,0,36,0,79,0,39,0,125,0,32,0,126,0,45,0,12,0,4,0,127,0,4, +0,-128,0,4,0,-127,0,4,0,-126,0,2,0,-125,0,2,0,-124,0,2,0,20,0,2,0,-123,0,2,0,-122,0,2, +0,-121,0,2,0,-120,0,2,0,-119,0,46,0,32,0,27,0,31,0,0,0,34,0,12,0,-118,0,47,0,-117,0,48, +0,-116,0,49,0,-115,0,2,0,-123,0,2,0,20,0,2,0,-114,0,2,0,18,0,2,0,37,0,2,0,43,0,4, +0,-113,0,2,0,-112,0,2,0,-111,0,2,0,-110,0,2,0,-109,0,2,0,-108,0,2,0,-107,0,4,0,-106,0,4, +0,-105,0,43,0,-104,0,30,0,-103,0,7,0,-102,0,4,0,-101,0,2,0,-100,0,2,0,-99,0,2,0,-98,0,2, +0,-97,0,7,0,-96,0,7,0,-95,0,9,0,-94,0,50,0,31,0,2,0,-93,0,2,0,-92,0,2,0,-91,0,2, +0,-90,0,32,0,-89,0,51,0,-88,0,0,0,-87,0,0,0,-86,0,0,0,-85,0,0,0,-84,0,0,0,-83,0,7, +0,-82,0,7,0,-81,0,2,0,-80,0,2,0,-79,0,2,0,-78,0,2,0,-77,0,2,0,-76,0,2,0,-75,0,2, +0,-74,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7,0,-69,0,7,0,57,0,7,0,-68,0,7, +0,-67,0,7,0,-66,0,7,0,-65,0,7,0,-64,0,52,0,15,0,0,0,-63,0,9,0,-62,0,0,0,-61,0,0, +0,-60,0,4,0,-59,0,4,0,-58,0,9,0,-57,0,7,0,-56,0,7,0,-55,0,7,0,-54,0,4,0,-53,0,9, +0,-52,0,9,0,-51,0,4,0,-50,0,4,0,37,0,53,0,6,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, +0,-49,0,7,0,67,0,4,0,64,0,54,0,5,0,2,0,20,0,2,0,36,0,2,0,64,0,2,0,-48,0,53, +0,-54,0,55,0,17,0,32,0,-89,0,46,0,-47,0,56,0,-46,0,7,0,-45,0,7,0,-44,0,2,0,18,0,2, +0,-43,0,7,0,113,0,7,0,114,0,7,0,-42,0,4,0,-41,0,2,0,-40,0,2,0,-39,0,4,0,-123,0,4, +0,-113,0,2,0,-38,0,2,0,-37,0,51,0,56,0,27,0,31,0,7,0,-36,0,7,0,-35,0,7,0,-34,0,7, +0,-33,0,7,0,-32,0,7,0,-31,0,7,0,-30,0,7,0,-29,0,7,0,-28,0,7,0,-27,0,7,0,-26,0,7, +0,-25,0,7,0,-24,0,7,0,-23,0,7,0,-22,0,7,0,-21,0,7,0,-20,0,7,0,-19,0,7,0,-18,0,7, +0,-17,0,2,0,-16,0,2,0,-15,0,2,0,-14,0,2,0,-13,0,2,0,-12,0,2,0,-11,0,2,0,-10,0,2, +0,20,0,2,0,18,0,2,0,-43,0,7,0,-9,0,7,0,-8,0,7,0,-7,0,7,0,-6,0,2,0,-5,0,2, +0,-4,0,2,0,-3,0,2,0,-125,0,4,0,23,0,4,0,-128,0,4,0,-127,0,4,0,-126,0,7,0,-2,0,7, +0,-1,0,7,0,-67,0,45,0,0,1,57,0,1,1,36,0,79,0,46,0,-47,0,52,0,2,1,54,0,3,1,55, +0,4,1,30,0,-103,0,0,0,5,1,0,0,6,1,58,0,8,0,7,0,7,1,7,0,8,1,7,0,-81,0,4, +0,20,0,7,0,9,1,7,0,10,1,7,0,11,1,32,0,45,0,59,0,80,0,27,0,31,0,2,0,18,0,2, +0,12,1,4,0,13,1,2,0,-79,0,2,0,14,1,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7, +0,15,1,7,0,16,1,7,0,17,1,7,0,18,1,7,0,19,1,7,0,20,1,7,0,21,1,7,0,22,1,7, +0,23,1,7,0,24,1,7,0,25,1,60,0,26,1,2,0,27,1,2,0,70,0,7,0,113,0,7,0,114,0,7, +0,28,1,7,0,29,1,7,0,30,1,2,0,31,1,2,0,32,1,2,0,33,1,2,0,34,1,0,0,35,1,0, +0,36,1,2,0,37,1,2,0,38,1,2,0,39,1,2,0,40,1,2,0,41,1,7,0,42,1,7,0,43,1,7, +0,44,1,7,0,45,1,2,0,46,1,2,0,43,0,2,0,47,1,2,0,48,1,2,0,49,1,2,0,50,1,7, +0,51,1,7,0,52,1,7,0,53,1,7,0,54,1,7,0,55,1,7,0,56,1,7,0,57,1,7,0,58,1,7, +0,59,1,7,0,60,1,7,0,61,1,7,0,62,1,2,0,63,1,2,0,64,1,4,0,65,1,4,0,66,1,2, +0,67,1,2,0,68,1,2,0,69,1,2,0,70,1,7,0,71,1,7,0,72,1,7,0,73,1,7,0,74,1,2, +0,75,1,2,0,76,1,50,0,77,1,36,0,79,0,30,0,-103,0,39,0,125,0,61,0,2,0,27,0,31,0,36, +0,79,0,62,0,-127,0,27,0,31,0,2,0,-79,0,2,0,20,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, +0,78,1,7,0,79,1,7,0,80,1,7,0,81,1,7,0,82,1,7,0,83,1,7,0,84,1,7,0,85,1,7, +0,86,1,7,0,87,1,7,0,88,1,7,0,89,1,7,0,90,1,7,0,91,1,7,0,92,1,7,0,93,1,7, +0,94,1,7,0,95,1,7,0,96,1,7,0,97,1,7,0,98,1,7,0,99,1,7,0,100,1,7,0,101,1,7, +0,102,1,7,0,103,1,7,0,104,1,2,0,105,1,2,0,106,1,2,0,107,1,0,0,108,1,0,0,109,1,7, +0,110,1,7,0,111,1,2,0,112,1,2,0,113,1,7,0,114,1,7,0,115,1,7,0,116,1,7,0,117,1,2, +0,118,1,2,0,119,1,4,0,13,1,4,0,120,1,2,0,121,1,2,0,122,1,2,0,123,1,2,0,124,1,7, +0,125,1,7,0,126,1,7,0,127,1,7,0,-128,1,7,0,-127,1,7,0,-126,1,7,0,-125,1,7,0,-124,1,7, +0,-123,1,7,0,-122,1,0,0,-121,1,7,0,-120,1,7,0,-119,1,7,0,-118,1,4,0,-117,1,0,0,-116,1,0, +0,47,1,0,0,-115,1,0,0,5,1,2,0,-114,1,2,0,-113,1,2,0,64,1,2,0,-112,1,2,0,-111,1,2, +0,-110,1,7,0,-109,1,7,0,-108,1,7,0,-107,1,7,0,-106,1,7,0,-105,1,2,0,-93,0,2,0,-92,0,54, +0,-104,1,54,0,-103,1,0,0,-102,1,0,0,-101,1,0,0,-100,1,0,0,-99,1,2,0,-98,1,2,0,12,1,7, +0,-97,1,7,0,-96,1,50,0,77,1,57,0,1,1,36,0,79,0,63,0,-95,1,30,0,-103,0,7,0,-94,1,7, +0,-93,1,7,0,-92,1,7,0,-91,1,7,0,-90,1,2,0,-89,1,2,0,70,0,7,0,-88,1,7,0,-87,1,7, +0,-86,1,7,0,-85,1,7,0,-84,1,7,0,-83,1,7,0,-82,1,7,0,-81,1,7,0,-80,1,2,0,-79,1,2, +0,-78,1,7,0,-77,1,7,0,-76,1,7,0,-75,1,7,0,-74,1,7,0,-73,1,4,0,-72,1,4,0,-71,1,4, +0,-70,1,39,0,125,0,12,0,-69,1,64,0,6,0,27,0,31,0,0,0,-68,1,7,0,-67,1,7,0,37,0,65, +0,2,0,43,0,-104,0,66,0,26,0,66,0,0,0,66,0,1,0,67,0,-66,1,4,0,-65,1,4,0,-64,1,4, +0,-63,1,4,0,-62,1,4,0,-61,1,4,0,-60,1,2,0,18,0,2,0,20,0,2,0,-59,1,2,0,-58,1,7, +0,5,0,7,0,6,0,7,0,7,0,7,0,-57,1,7,0,-56,1,7,0,-55,1,7,0,-54,1,7,0,-53,1,7, +0,-52,1,7,0,-51,1,7,0,23,0,7,0,-50,1,7,0,-49,1,68,0,15,0,27,0,31,0,67,0,-66,1,12, +0,-48,1,12,0,-47,1,36,0,79,0,62,0,-46,1,2,0,20,0,2,0,-45,1,4,0,-80,0,7,0,7,1,7, +0,-81,0,7,0,8,1,7,0,-44,1,7,0,-43,1,7,0,-42,1,35,0,10,0,7,0,-41,1,7,0,-40,1,7, +0,-39,1,7,0,-38,1,2,0,-37,1,2,0,-36,1,0,0,-35,1,0,0,-34,1,0,0,-33,1,0,0,-32,1,34, +0,7,0,7,0,-31,1,7,0,-40,1,7,0,-39,1,2,0,-35,1,2,0,-32,1,7,0,-38,1,7,0,37,0,69, +0,21,0,69,0,0,0,69,0,1,0,2,0,18,0,2,0,-30,1,2,0,-32,1,2,0,20,0,2,0,-29,1,2, +0,-28,1,2,0,-27,1,2,0,-26,1,2,0,-25,1,2,0,-24,1,2,0,-23,1,2,0,-22,1,7,0,-21,1,7, +0,-20,1,34,0,49,0,35,0,50,0,2,0,-19,1,2,0,-18,1,4,0,-17,1,70,0,5,0,2,0,-16,1,2, +0,-30,1,0,0,20,0,0,0,37,0,2,0,70,0,71,0,4,0,7,0,5,0,7,0,6,0,7,0,8,0,7, +0,-15,1,72,0,57,0,27,0,31,0,67,0,-66,1,12,0,-14,1,12,0,-47,1,32,0,-13,1,32,0,-12,1,32, +0,-11,1,36,0,79,0,73,0,-10,1,38,0,-9,1,62,0,-46,1,12,0,-8,1,7,0,7,1,7,0,-81,0,7, +0,8,1,4,0,-80,0,2,0,-7,1,2,0,-45,1,2,0,20,0,2,0,-6,1,7,0,-5,1,7,0,-4,1,7, +0,-3,1,2,0,-27,1,2,0,-26,1,2,0,-2,1,2,0,-1,1,4,0,70,0,2,0,23,0,2,0,98,0,2, +0,67,0,2,0,0,2,7,0,1,2,7,0,2,2,7,0,3,2,7,0,4,2,7,0,5,2,7,0,6,2,7, +0,7,2,7,0,8,2,7,0,9,2,7,0,10,2,0,0,11,2,0,0,12,2,64,0,13,2,64,0,14,2,64, +0,15,2,64,0,16,2,4,0,17,2,4,0,18,2,4,0,19,2,4,0,37,0,71,0,20,2,4,0,21,2,4, +0,22,2,70,0,23,2,70,0,24,2,74,0,39,0,27,0,31,0,67,0,-66,1,12,0,25,2,36,0,79,0,38, +0,-9,1,62,0,-46,1,75,0,26,2,76,0,27,2,77,0,28,2,78,0,29,2,79,0,30,2,80,0,31,2,81, +0,32,2,82,0,33,2,74,0,34,2,83,0,35,2,84,0,36,2,84,0,37,2,84,0,38,2,4,0,54,0,4, +0,39,2,4,0,40,2,4,0,41,2,4,0,42,2,4,0,-80,0,7,0,7,1,7,0,-81,0,7,0,8,1,7, +0,43,2,7,0,37,0,2,0,44,2,2,0,20,0,2,0,45,2,2,0,46,2,2,0,-45,1,2,0,47,2,85, +0,48,2,86,0,49,2,9,0,-94,0,77,0,8,0,9,0,50,2,7,0,51,2,4,0,52,2,0,0,20,0,0, +0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,75,0,8,0,4,0,56,2,4,0,57,2,4,0,58,2,4, +0,59,2,0,0,37,0,0,0,-30,1,0,0,60,2,0,0,20,0,79,0,5,0,4,0,56,2,4,0,57,2,0, +0,61,2,0,0,62,2,2,0,20,0,87,0,2,0,4,0,63,2,7,0,-39,1,80,0,3,0,87,0,64,2,4, +0,65,2,4,0,20,0,78,0,6,0,7,0,66,2,2,0,67,2,0,0,20,0,0,0,-30,1,0,0,62,2,0, +0,68,2,81,0,4,0,0,0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,88,0,6,0,46,0,50,2,0, +0,20,0,0,0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,89,0,1,0,7,0,69,2,90,0,5,0,0, +0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,4,0,37,0,82,0,1,0,7,0,70,2,83,0,2,0,4, +0,71,2,4,0,18,0,76,0,7,0,7,0,51,2,46,0,50,2,0,0,20,0,0,0,53,2,2,0,13,1,2, +0,54,2,2,0,55,2,91,0,1,0,7,0,72,2,92,0,1,0,4,0,73,2,93,0,1,0,0,0,74,2,94, +0,1,0,7,0,51,2,95,0,4,0,7,0,-49,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,96,0,1,0,95, +0,52,2,97,0,5,0,4,0,75,2,4,0,76,2,0,0,20,0,0,0,-30,1,0,0,-74,0,98,0,2,0,4, +0,77,2,4,0,76,2,99,0,14,0,99,0,0,0,99,0,1,0,97,0,78,2,96,0,79,2,98,0,80,2,0, +0,81,2,12,0,82,2,12,0,83,2,100,0,84,2,4,0,54,0,4,0,40,2,4,0,39,2,4,0,37,0,78, +0,85,2,85,0,14,0,12,0,86,2,78,0,85,2,0,0,87,2,0,0,88,2,0,0,89,2,0,0,90,2,0, +0,91,2,0,0,92,2,0,0,93,2,0,0,20,0,84,0,36,2,84,0,38,2,2,0,94,2,0,0,95,2,86, +0,8,0,4,0,96,2,4,0,97,2,75,0,98,2,79,0,99,2,4,0,40,2,4,0,39,2,4,0,54,0,4, +0,37,0,101,0,6,0,101,0,0,0,101,0,1,0,4,0,18,0,4,0,13,1,0,0,17,0,0,0,100,2,102, +0,7,0,101,0,101,2,2,0,102,2,2,0,86,2,2,0,103,2,2,0,93,0,9,0,104,2,9,0,105,2,103, +0,3,0,101,0,101,2,32,0,-89,0,0,0,17,0,104,0,5,0,101,0,101,2,32,0,-89,0,0,0,17,0,2, +0,106,2,0,0,107,2,105,0,5,0,101,0,101,2,7,0,91,0,7,0,108,2,4,0,109,2,4,0,110,2,106, +0,5,0,101,0,101,2,32,0,111,2,0,0,72,0,4,0,13,1,4,0,20,0,107,0,13,0,101,0,101,2,32, +0,112,2,32,0,113,2,32,0,114,2,32,0,115,2,7,0,116,2,7,0,117,2,7,0,108,2,7,0,118,2,4, +0,119,2,4,0,120,2,4,0,93,0,4,0,121,2,108,0,5,0,101,0,101,2,2,0,122,2,2,0,20,0,7, +0,123,2,32,0,124,2,109,0,3,0,101,0,101,2,7,0,125,2,4,0,93,0,110,0,10,0,101,0,101,2,7, +0,126,2,4,0,127,2,4,0,37,0,2,0,93,0,2,0,-128,2,2,0,-127,2,2,0,-126,2,7,0,-125,2,0, +0,-124,2,111,0,3,0,101,0,101,2,7,0,37,0,4,0,18,0,112,0,11,0,101,0,101,2,51,0,-123,2,7, +0,-122,2,4,0,-121,2,0,0,-124,2,7,0,-120,2,4,0,-119,2,32,0,-118,2,0,0,-117,2,4,0,-116,2,4, +0,37,0,113,0,10,0,101,0,101,2,32,0,-115,2,46,0,-114,2,4,0,93,0,4,0,-113,2,7,0,-112,2,7, +0,-111,2,0,0,-117,2,4,0,-116,2,4,0,37,0,114,0,3,0,101,0,101,2,7,0,-110,2,4,0,-109,2,115, +0,5,0,101,0,101,2,7,0,-108,2,0,0,-124,2,2,0,20,0,2,0,-107,2,116,0,8,0,101,0,101,2,32, +0,-89,0,7,0,-108,2,7,0,-38,1,7,0,109,0,0,0,-124,2,2,0,20,0,2,0,18,0,117,0,21,0,101, +0,101,2,32,0,-106,2,0,0,-124,2,51,0,-123,2,32,0,-118,2,2,0,20,0,2,0,37,0,7,0,-105,2,7, +0,-104,2,7,0,-103,2,7,0,-5,1,7,0,-102,2,7,0,-101,2,7,0,-100,2,7,0,-99,2,4,0,-119,2,4, +0,-116,2,0,0,-117,2,7,0,-98,2,7,0,-97,2,7,0,43,0,118,0,7,0,101,0,101,2,2,0,-96,2,2, +0,-95,2,4,0,70,0,32,0,-89,0,7,0,-94,2,0,0,-124,2,119,0,9,0,101,0,101,2,32,0,-89,0,7, +0,-93,2,7,0,-92,2,7,0,-99,2,4,0,-91,2,4,0,-90,2,7,0,-89,2,0,0,17,0,120,0,1,0,101, +0,101,2,121,0,5,0,101,0,101,2,122,0,-88,2,123,0,-87,2,124,0,-86,2,125,0,-85,2,126,0,14,0,101, +0,101,2,78,0,-84,2,78,0,-83,2,78,0,-82,2,78,0,-81,2,78,0,-80,2,78,0,-79,2,75,0,-78,2,4, +0,-77,2,4,0,-76,2,2,0,-75,2,2,0,37,0,7,0,-74,2,127,0,-73,2,-128,0,3,0,101,0,101,2,-127, +0,-72,2,-126,0,-73,2,-125,0,4,0,101,0,101,2,32,0,-89,0,4,0,-71,2,4,0,37,0,-124,0,2,0,4, +0,-70,2,7,0,-39,1,-123,0,2,0,4,0,-127,0,4,0,-69,2,-122,0,20,0,101,0,101,2,32,0,-89,0,0, +0,-124,2,2,0,-68,2,2,0,-67,2,2,0,20,0,2,0,37,0,7,0,-66,2,7,0,-65,2,4,0,54,0,4, +0,-64,2,-123,0,-63,2,-124,0,-62,2,4,0,-61,2,4,0,-60,2,4,0,-59,2,4,0,-69,2,7,0,-58,2,7, +0,-57,2,7,0,-56,2,-121,0,8,0,101,0,101,2,-120,0,-55,2,-127,0,-72,2,4,0,-54,2,4,0,-53,2,4, +0,-52,2,2,0,20,0,2,0,57,0,-119,0,5,0,101,0,101,2,32,0,45,0,2,0,-51,2,2,0,20,0,2, +0,-50,2,-118,0,5,0,101,0,101,2,4,0,-49,2,2,0,20,0,2,0,-48,2,7,0,-47,2,-117,0,3,0,101, +0,101,2,-116,0,-46,2,125,0,-85,2,-115,0,10,0,101,0,101,2,32,0,-45,2,32,0,-44,2,0,0,-43,2,7, +0,-42,2,2,0,-41,2,2,0,-40,2,0,0,-39,2,0,0,-38,2,0,0,107,2,-114,0,9,0,101,0,101,2,32, +0,-37,2,0,0,-43,2,7,0,-36,2,7,0,-35,2,0,0,13,1,0,0,122,2,0,0,-34,2,0,0,37,0,-113, +0,24,0,27,0,31,0,2,0,-29,1,2,0,-28,1,2,0,-33,2,2,0,20,0,2,0,-32,2,2,0,-31,2,2, +0,-30,2,2,0,70,0,0,0,-29,2,0,0,-28,2,0,0,-27,2,0,0,18,0,4,0,37,0,7,0,-26,2,7, +0,-25,2,7,0,-24,2,7,0,-23,2,7,0,-22,2,7,0,-21,2,34,0,-20,2,36,0,79,0,38,0,-9,1,80, +0,31,2,-112,0,3,0,-112,0,0,0,-112,0,1,0,0,0,17,0,67,0,3,0,7,0,-19,2,4,0,20,0,4, +0,37,0,32,0,111,0,27,0,31,0,2,0,18,0,2,0,-18,2,4,0,-17,2,4,0,-16,2,4,0,-15,2,0, +0,-14,2,32,0,38,0,32,0,-13,2,32,0,-12,2,32,0,-11,2,32,0,-10,2,36,0,79,0,73,0,-10,1,67, +0,-66,1,-111,0,-9,2,-111,0,-8,2,-110,0,-7,2,9,0,2,0,12,0,-6,2,12,0,25,2,12,0,-47,1,12, +0,-5,2,12,0,-4,2,62,0,-46,1,7,0,7,1,7,0,-3,2,7,0,-2,2,7,0,-81,0,7,0,-1,2,7, +0,8,1,7,0,0,3,7,0,1,3,7,0,-93,2,7,0,2,3,7,0,-45,0,4,0,3,3,2,0,20,0,2, +0,4,3,2,0,5,3,2,0,6,3,2,0,7,3,2,0,8,3,2,0,9,3,2,0,10,3,2,0,11,3,2, +0,12,3,2,0,13,3,2,0,14,3,4,0,15,3,4,0,16,3,4,0,17,3,4,0,18,3,7,0,19,3,7, +0,20,3,7,0,21,3,7,0,22,3,7,0,23,3,7,0,24,3,7,0,25,3,7,0,26,3,7,0,27,3,7, +0,28,3,7,0,29,3,7,0,30,3,0,0,31,3,0,0,32,3,0,0,-45,1,0,0,33,3,0,0,34,3,0, +0,35,3,7,0,36,3,7,0,37,3,39,0,125,0,12,0,38,3,12,0,39,3,12,0,40,3,12,0,41,3,7, +0,42,3,2,0,71,2,2,0,43,3,7,0,52,2,4,0,44,3,4,0,45,3,-109,0,46,3,2,0,47,3,2, +0,-38,0,7,0,48,3,12,0,49,3,12,0,50,3,12,0,51,3,12,0,52,3,-108,0,53,3,-107,0,54,3,63, +0,55,3,2,0,56,3,2,0,57,3,2,0,58,3,2,0,59,3,7,0,44,2,2,0,60,3,2,0,61,3,-116, +0,62,3,-127,0,63,3,-127,0,64,3,4,0,65,3,4,0,66,3,4,0,67,3,4,0,70,0,9,0,-94,0,12, +0,68,3,-106,0,14,0,-106,0,0,0,-106,0,1,0,32,0,38,0,7,0,-93,2,7,0,9,1,7,0,-92,2,7, +0,-99,2,0,0,17,0,4,0,-91,2,4,0,-90,2,4,0,69,3,2,0,18,0,2,0,70,3,7,0,-89,2,-108, +0,36,0,2,0,71,3,2,0,72,3,2,0,20,0,2,0,-99,2,7,0,73,3,7,0,74,3,7,0,75,3,7, +0,76,3,7,0,77,3,7,0,78,3,7,0,79,3,7,0,80,3,7,0,81,3,7,0,82,3,7,0,83,3,7, +0,84,3,7,0,85,3,7,0,86,3,7,0,87,3,7,0,88,3,7,0,89,3,7,0,90,3,7,0,91,3,7, +0,92,3,7,0,93,3,7,0,94,3,7,0,95,3,7,0,96,3,2,0,97,3,2,0,98,3,2,0,99,3,2, +0,100,3,51,0,-88,0,-105,0,101,3,7,0,102,3,4,0,110,2,125,0,5,0,4,0,20,0,4,0,103,3,4, +0,104,3,4,0,105,3,4,0,106,3,-104,0,1,0,7,0,-31,1,-109,0,30,0,4,0,20,0,7,0,107,3,7, +0,108,3,7,0,109,3,4,0,110,3,4,0,111,3,4,0,112,3,4,0,113,3,7,0,114,3,7,0,115,3,7, +0,116,3,7,0,117,3,7,0,118,3,7,0,119,3,7,0,120,3,7,0,121,3,7,0,122,3,7,0,123,3,7, +0,124,3,7,0,125,3,7,0,126,3,7,0,127,3,7,0,-128,3,7,0,-127,3,7,0,-126,3,7,0,-125,3,4, +0,-124,3,4,0,-123,3,7,0,-122,3,7,0,27,3,-107,0,49,0,-120,0,-121,3,4,0,-120,3,4,0,-119,3,-103, +0,-118,3,-102,0,-117,3,0,0,37,0,0,0,-116,3,2,0,-115,3,7,0,-114,3,0,0,-113,3,7,0,-112,3,7, +0,-111,3,7,0,-110,3,7,0,-109,3,7,0,-108,3,7,0,-107,3,7,0,-106,3,7,0,-105,3,7,0,-104,3,2, +0,-103,3,0,0,-102,3,2,0,-101,3,7,0,-100,3,7,0,-99,3,0,0,-98,3,4,0,-126,0,4,0,-97,3,4, +0,-96,3,2,0,-95,3,2,0,-94,3,-104,0,-93,3,4,0,-92,3,4,0,81,0,7,0,-91,3,7,0,-90,3,7, +0,-89,3,7,0,-88,3,2,0,-87,3,2,0,-86,3,2,0,-85,3,2,0,-84,3,2,0,-83,3,2,0,-82,3,2, +0,-81,3,2,0,-80,3,-101,0,-79,3,7,0,-78,3,7,0,-77,3,125,0,-76,3,-116,0,48,0,2,0,18,0,2, +0,-75,3,2,0,-74,3,2,0,-73,3,7,0,-72,3,2,0,-71,3,2,0,-70,3,7,0,-69,3,2,0,-68,3,2, +0,-67,3,7,0,-66,3,7,0,-65,3,7,0,-64,3,7,0,-63,3,7,0,-62,3,7,0,-61,3,4,0,-60,3,7, +0,-59,3,7,0,-58,3,7,0,-57,3,74,0,-56,3,74,0,-55,3,74,0,-54,3,0,0,-53,3,7,0,-52,3,7, +0,-51,3,36,0,79,0,2,0,-50,3,0,0,-49,3,0,0,-48,3,7,0,-47,3,4,0,-46,3,7,0,-45,3,7, +0,-44,3,4,0,-43,3,4,0,20,0,7,0,-42,3,7,0,-41,3,7,0,-40,3,78,0,-39,3,7,0,-38,3,7, +0,-37,3,7,0,-36,3,7,0,-35,3,7,0,-34,3,7,0,-33,3,7,0,-32,3,4,0,-31,3,-100,0,71,0,27, +0,31,0,2,0,-79,0,2,0,14,1,2,0,47,1,2,0,-30,3,7,0,-29,3,7,0,-28,3,7,0,-27,3,7, +0,-26,3,7,0,-25,3,7,0,-24,3,7,0,-23,3,7,0,-22,3,7,0,84,1,7,0,86,1,7,0,85,1,7, +0,-21,3,4,0,-20,3,7,0,-19,3,7,0,-18,3,7,0,-17,3,7,0,-16,3,7,0,-15,3,7,0,-14,3,7, +0,-13,3,2,0,-12,3,2,0,13,1,2,0,-11,3,2,0,-10,3,2,0,-9,3,2,0,-8,3,2,0,-7,3,2, +0,-6,3,7,0,-5,3,7,0,-4,3,7,0,-3,3,7,0,-2,3,7,0,-1,3,7,0,0,4,7,0,1,4,7, +0,2,4,7,0,3,4,7,0,4,4,7,0,5,4,7,0,6,4,2,0,7,4,2,0,8,4,2,0,9,4,2, +0,10,4,7,0,11,4,7,0,12,4,7,0,13,4,7,0,14,4,2,0,15,4,2,0,16,4,2,0,17,4,2, +0,18,4,7,0,19,4,7,0,20,4,7,0,21,4,7,0,22,4,2,0,23,4,2,0,24,4,2,0,25,4,2, +0,43,0,7,0,26,4,7,0,27,4,36,0,79,0,50,0,77,1,30,0,-103,0,39,0,125,0,-99,0,16,0,2, +0,28,4,2,0,29,4,2,0,30,4,2,0,20,0,2,0,31,4,2,0,32,4,2,0,33,4,2,0,34,4,2, +0,35,4,2,0,36,4,2,0,37,4,2,0,38,4,4,0,39,4,7,0,40,4,7,0,41,4,7,0,42,4,-98, +0,8,0,-98,0,0,0,-98,0,1,0,4,0,3,3,4,0,43,4,4,0,20,0,2,0,44,4,2,0,45,4,32, +0,-89,0,-97,0,13,0,9,0,46,4,9,0,47,4,4,0,48,4,4,0,49,4,4,0,50,4,4,0,51,4,4, +0,52,4,4,0,53,4,4,0,54,4,4,0,55,4,4,0,56,4,4,0,37,0,0,0,57,4,-96,0,5,0,9, +0,58,4,9,0,59,4,4,0,60,4,4,0,70,0,0,0,61,4,-95,0,13,0,4,0,18,0,4,0,62,4,4, +0,63,4,4,0,64,4,4,0,65,4,4,0,66,4,4,0,93,0,4,0,67,4,4,0,68,4,4,0,69,4,4, +0,70,4,4,0,71,4,26,0,30,0,-94,0,4,0,4,0,72,4,7,0,73,4,2,0,20,0,2,0,68,2,-93, +0,11,0,-93,0,0,0,-93,0,1,0,0,0,17,0,62,0,74,4,63,0,75,4,4,0,3,3,4,0,76,4,4, +0,77,4,4,0,37,0,4,0,78,4,4,0,79,4,-92,0,-126,0,-97,0,80,4,-96,0,81,4,-95,0,82,4,4, +0,83,4,4,0,-126,0,4,0,-97,3,4,0,84,4,4,0,85,4,4,0,86,4,4,0,87,4,2,0,20,0,2, +0,88,4,7,0,20,3,7,0,89,4,7,0,90,4,7,0,91,4,7,0,92,4,7,0,93,4,2,0,94,4,2, +0,95,4,2,0,96,4,2,0,97,4,2,0,-39,0,2,0,98,4,2,0,99,4,2,0,100,3,2,0,100,4,2, +0,101,4,2,0,34,1,2,0,109,0,2,0,102,4,2,0,103,4,2,0,104,4,2,0,105,4,2,0,106,4,2, +0,107,4,2,0,108,4,2,0,109,4,2,0,110,4,2,0,35,1,2,0,111,4,2,0,112,4,2,0,113,4,2, +0,114,4,4,0,115,4,4,0,13,1,2,0,116,4,2,0,117,4,2,0,118,4,2,0,119,4,2,0,120,4,2, +0,121,4,24,0,122,4,24,0,123,4,23,0,124,4,12,0,125,4,2,0,126,4,2,0,37,0,7,0,127,4,7, +0,-128,4,7,0,-127,4,7,0,-126,4,7,0,-125,4,7,0,-124,4,7,0,-123,4,7,0,-122,4,7,0,-121,4,2, +0,-120,4,2,0,-119,4,2,0,-118,4,2,0,-117,4,2,0,-116,4,2,0,-115,4,7,0,-114,4,7,0,-113,4,7, +0,-112,4,2,0,-111,4,2,0,-110,4,2,0,-109,4,2,0,-108,4,2,0,-107,4,2,0,-106,4,2,0,-105,4,2, +0,-104,4,2,0,-103,4,2,0,-102,4,4,0,-101,4,4,0,-100,4,4,0,-99,4,4,0,-98,4,4,0,-97,4,7, +0,-96,4,4,0,-95,4,4,0,-94,4,4,0,-93,4,4,0,-92,4,7,0,-91,4,7,0,-90,4,7,0,-89,4,7, +0,-88,4,7,0,-87,4,7,0,-86,4,7,0,-85,4,7,0,-84,4,7,0,-83,4,0,0,-82,4,0,0,-81,4,4, +0,-80,4,2,0,-79,4,2,0,12,1,0,0,-78,4,7,0,-77,4,7,0,-76,4,4,0,-75,4,4,0,-74,4,7, +0,-73,4,7,0,-72,4,2,0,-71,4,2,0,-70,4,7,0,-69,4,2,0,-68,4,2,0,-67,4,4,0,-66,4,2, +0,-65,4,2,0,-64,4,2,0,-63,4,2,0,-62,4,7,0,-61,4,7,0,70,0,42,0,-60,4,-91,0,9,0,-91, +0,0,0,-91,0,1,0,0,0,17,0,2,0,-59,4,2,0,-58,4,2,0,-57,4,2,0,43,0,7,0,-56,4,7, +0,70,0,-90,0,5,0,7,0,-55,4,0,0,18,0,0,0,43,0,0,0,70,0,0,0,12,1,-89,0,5,0,-89, +0,0,0,-89,0,1,0,4,0,-54,4,0,0,-53,4,4,0,20,0,-88,0,5,0,-87,0,-52,4,2,0,20,0,2, +0,-51,4,2,0,-50,4,2,0,-49,4,-86,0,4,0,2,0,109,0,2,0,-122,2,2,0,-48,4,2,0,-47,4,-85, +0,7,0,2,0,20,0,2,0,-46,4,2,0,-45,4,2,0,-44,4,-86,0,-43,4,7,0,-42,4,4,0,-41,4,-84, +0,4,0,-84,0,0,0,-84,0,1,0,0,0,-40,4,7,0,-39,4,-83,0,56,0,2,0,-38,4,2,0,-37,4,7, +0,-36,4,7,0,-35,4,2,0,-48,4,2,0,-34,4,7,0,-33,4,7,0,-32,4,2,0,-31,4,2,0,-30,4,2, +0,-29,4,2,0,-28,4,7,0,-27,4,7,0,-26,4,7,0,-25,4,7,0,37,0,2,0,-24,4,2,0,-23,4,2, +0,-22,4,2,0,-21,4,-88,0,-20,4,-85,0,-19,4,7,0,-18,4,7,0,-17,4,0,0,-16,4,0,0,-15,4,0, +0,-14,4,0,0,-13,4,0,0,-12,4,0,0,-11,4,2,0,-10,4,7,0,-9,4,7,0,-8,4,7,0,-7,4,7, +0,-6,4,7,0,-5,4,7,0,-4,4,7,0,-3,4,7,0,-2,4,7,0,-1,4,7,0,0,5,2,0,1,5,0, +0,2,5,0,0,3,5,0,0,4,5,0,0,5,5,32,0,6,5,0,0,7,5,0,0,8,5,0,0,9,5,0, +0,10,5,0,0,11,5,0,0,12,5,0,0,13,5,0,0,14,5,0,0,15,5,-82,0,6,0,2,0,109,0,0, +0,-122,2,0,0,16,5,0,0,17,5,0,0,20,0,0,0,-74,0,-81,0,26,0,-80,0,18,5,50,0,77,1,60, +0,19,5,-82,0,20,5,-82,0,21,5,-82,0,22,5,-82,0,23,5,-82,0,24,5,-82,0,25,5,-82,0,26,5,7, +0,27,5,2,0,28,5,2,0,47,1,2,0,29,5,2,0,1,2,0,0,30,5,0,0,31,5,0,0,32,5,0, +0,33,5,0,0,93,0,0,0,34,5,0,0,35,5,0,0,36,5,0,0,37,5,0,0,38,5,0,0,-74,0,-79, +0,43,0,27,0,31,0,32,0,39,5,-100,0,40,5,-79,0,41,5,46,0,-47,0,12,0,42,5,-98,0,43,5,7, +0,44,5,7,0,45,5,7,0,46,5,7,0,47,5,4,0,3,3,7,0,48,5,2,0,49,5,2,0,50,5,2, +0,51,5,2,0,52,5,2,0,53,5,2,0,54,5,2,0,55,5,2,0,5,1,57,0,1,1,9,0,56,5,-99, +0,57,5,-90,0,58,5,-83,0,59,5,-92,0,-73,0,-94,0,60,5,39,0,125,0,12,0,103,0,12,0,61,5,2, +0,62,5,2,0,63,5,2,0,64,5,2,0,65,5,-78,0,66,5,2,0,67,5,2,0,68,5,2,0,64,1,2, +0,-38,0,-81,0,69,5,4,0,70,5,4,0,37,0,-77,0,9,0,46,0,-47,0,45,0,0,1,7,0,8,2,7, +0,9,2,7,0,109,0,7,0,71,5,7,0,72,5,2,0,73,5,2,0,74,5,-76,0,75,0,-75,0,0,0,-75, +0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,7,0,79,5,7,0,80,5,7,0,81,5,7, +0,82,5,7,0,83,5,7,0,84,5,7,0,85,5,7,0,20,1,7,0,86,5,4,0,87,5,2,0,88,5,2, +0,17,5,32,0,39,5,32,0,89,5,-77,0,90,5,-76,0,91,5,-73,0,92,5,-72,0,93,5,-71,0,94,5,0, +0,95,5,2,0,30,4,2,0,96,5,4,0,3,3,4,0,97,5,2,0,98,5,2,0,99,5,2,0,100,5,0, +0,101,5,0,0,43,0,7,0,115,0,7,0,102,5,7,0,103,5,7,0,104,5,7,0,105,5,7,0,106,5,7, +0,107,5,7,0,108,5,7,0,-82,0,7,0,44,5,2,0,109,5,2,0,110,5,2,0,111,5,2,0,112,5,2, +0,-119,0,2,0,29,5,2,0,113,5,2,0,114,5,2,0,115,5,2,0,116,5,7,0,117,5,7,0,118,5,67, +0,119,5,12,0,120,5,2,0,121,5,2,0,53,2,2,0,122,5,2,0,20,0,2,0,123,5,2,0,124,5,2, +0,125,5,0,0,126,5,0,0,127,5,9,0,-128,5,-70,0,-127,5,7,0,-126,5,2,0,-125,5,2,0,-124,5,2, +0,53,5,2,0,54,5,-69,0,19,0,24,0,36,0,24,0,64,0,23,0,-123,5,23,0,-122,5,23,0,-121,5,7, +0,-120,5,7,0,-119,5,7,0,-118,5,7,0,-117,5,2,0,-116,5,2,0,-115,5,2,0,-114,5,2,0,-113,5,2, +0,-112,5,2,0,-111,5,4,0,20,0,7,0,-110,5,2,0,99,5,0,0,107,2,-75,0,6,0,-75,0,0,0,-75, +0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-68,0,6,0,-75,0,0,0,-75,0,1,0,4, +0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-67,0,27,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7, +0,76,5,-74,0,77,5,2,0,78,5,4,0,-109,5,4,0,70,0,-69,0,-108,5,9,0,-107,5,12,0,-106,5,36, +0,79,0,27,0,80,0,0,0,-105,5,0,0,-104,5,0,0,-103,5,2,0,-102,5,2,0,-101,5,2,0,-100,5,2, +0,-99,5,2,0,65,0,2,0,46,0,2,0,-119,0,2,0,-98,5,4,0,20,0,7,0,-97,5,24,0,36,0,-66, +0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-73,0,92,5,2,0,78,5,2, +0,-96,5,2,0,-95,5,2,0,-94,5,2,0,-93,5,-69,0,-108,5,2,0,-92,5,2,0,-119,0,2,0,-101,5,2, +0,-91,5,9,0,-90,5,2,0,29,5,0,0,-89,5,0,0,-88,5,2,0,-87,5,2,0,-86,5,2,0,12,3,2, +0,-85,5,2,0,-84,5,0,0,37,0,0,0,20,0,0,0,47,1,0,0,-83,5,-65,0,16,0,-75,0,0,0,-75, +0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69,0,-108,5,7,0,8,2,7,0,9,2,2, +0,-92,5,2,0,-82,5,2,0,-81,5,2,0,-80,5,4,0,20,0,7,0,71,5,-70,0,-127,5,-64,0,33,0,-75, +0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-63,0,-79,5,4,0,-78,5,0, +0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-74,5,2,0,20,0,2,0,-73,5,2,0,-72,5,2, +0,-71,5,2,0,-70,5,2,0,43,0,4,0,70,0,0,0,-69,5,-62,0,-68,5,2,0,-67,5,2,0,-66,5,2, +0,-65,5,2,0,-48,0,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9,0,-60,5,2,0,-59,5,0, +0,-58,5,-61,0,23,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, +0,-108,5,12,0,-57,5,2,0,-101,5,2,0,-56,5,2,0,20,0,2,0,57,0,9,0,-90,5,12,0,-55,5,-60, +0,-54,5,0,0,-53,5,-59,0,-52,5,4,0,-51,5,4,0,-50,5,2,0,18,0,2,0,-49,5,2,0,-48,5,2, +0,-47,5,-58,0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, +0,-108,5,46,0,-114,2,45,0,0,1,60,0,19,5,2,0,13,1,2,0,-119,0,2,0,-46,5,2,0,-45,5,4, +0,20,0,2,0,49,5,2,0,-44,5,2,0,-98,5,2,0,-101,5,7,0,71,5,0,0,-43,5,0,0,-42,5,0, +0,-41,5,0,0,-40,5,7,0,8,2,7,0,9,2,7,0,-39,5,7,0,-38,5,-70,0,-127,5,-57,0,11,0,-75, +0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,2,0,-119,0,2,0,-98,5,2, +0,-37,5,2,0,20,0,-69,0,-108,5,-56,0,24,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, +0,77,5,2,0,78,5,42,0,-36,5,4,0,-35,5,4,0,-34,5,2,0,93,0,2,0,-119,0,4,0,-33,5,4, +0,-32,5,4,0,-31,5,4,0,-30,5,4,0,-29,5,4,0,-28,5,4,0,-27,5,4,0,-26,5,7,0,-25,5,23, +0,-24,5,23,0,-23,5,4,0,-22,5,4,0,-21,5,-55,0,10,0,27,0,31,0,9,0,-20,5,9,0,-19,5,9, +0,-18,5,9,0,-17,5,9,0,-16,5,4,0,93,0,4,0,-15,5,0,0,-14,5,0,0,-13,5,-54,0,10,0,-75, +0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-55,0,-12,5,2,0,93,0,2,0,-119,0,4, +0,43,0,9,0,-11,5,-53,0,8,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-69, +0,-108,5,4,0,20,0,4,0,-10,5,-52,0,21,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, +0,77,5,2,0,78,5,-69,0,-108,5,27,0,-9,5,27,0,80,0,2,0,20,0,2,0,-119,0,7,0,-8,5,9, +0,-7,5,7,0,8,2,7,0,9,2,57,0,1,1,57,0,-6,5,4,0,-5,5,2,0,-89,5,2,0,37,0,-70, +0,-127,5,-51,0,42,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, +0,-108,5,-50,0,-4,5,0,0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-66,5,2,0,20,0,2, +0,-73,5,9,0,-7,5,4,0,-3,5,4,0,-2,5,4,0,-1,5,4,0,0,6,23,0,1,6,23,0,2,6,7, +0,3,6,7,0,4,6,7,0,5,6,7,0,-8,5,2,0,-67,5,2,0,-48,0,2,0,102,1,2,0,6,6,2, +0,37,0,2,0,43,0,2,0,7,6,2,0,8,6,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9, +0,-60,5,2,0,-59,5,0,0,-58,5,56,0,9,6,-49,0,20,0,0,0,10,6,0,0,11,6,0,0,12,6,0, +0,13,6,0,0,14,6,0,0,15,6,0,0,16,6,0,0,17,6,0,0,18,6,0,0,19,6,0,0,20,6,0, +0,21,6,0,0,22,6,0,0,23,6,0,0,24,6,0,0,25,6,0,0,26,6,0,0,27,6,0,0,68,2,0, +0,28,6,-48,0,54,0,0,0,29,6,0,0,20,6,0,0,21,6,0,0,30,6,0,0,31,6,0,0,32,6,0, +0,33,6,0,0,34,6,0,0,35,6,0,0,36,6,0,0,37,6,0,0,38,6,0,0,39,6,0,0,40,6,0, +0,41,6,0,0,42,6,0,0,43,6,0,0,44,6,0,0,45,6,0,0,46,6,0,0,47,6,0,0,48,6,0, +0,49,6,0,0,50,6,0,0,51,6,0,0,52,6,0,0,53,6,0,0,54,6,0,0,55,6,0,0,56,6,0, +0,57,6,0,0,58,6,0,0,95,0,0,0,59,6,0,0,60,6,0,0,61,6,0,0,62,6,0,0,63,6,0, +0,64,6,0,0,65,6,0,0,66,6,0,0,67,6,0,0,68,6,0,0,69,6,0,0,70,6,0,0,71,6,0, +0,72,6,0,0,73,6,0,0,74,6,0,0,75,6,0,0,76,6,0,0,77,6,0,0,78,6,0,0,79,6,-47, +0,5,0,0,0,80,6,0,0,37,6,0,0,39,6,2,0,20,0,2,0,37,0,-46,0,22,0,-46,0,0,0,-46, +0,1,0,0,0,17,0,-49,0,81,6,-48,0,82,6,-48,0,83,6,-48,0,84,6,-48,0,85,6,-48,0,86,6,-48, +0,87,6,-48,0,88,6,-48,0,89,6,-48,0,90,6,-48,0,91,6,-48,0,92,6,-48,0,93,6,-48,0,94,6,-48, +0,95,6,-48,0,96,6,-47,0,97,6,0,0,98,6,0,0,99,6,-45,0,5,0,4,0,20,0,4,0,37,0,7, +0,52,2,7,0,100,6,7,0,-31,1,-44,0,66,0,4,0,20,0,4,0,101,6,4,0,102,6,0,0,103,6,0, +0,104,6,0,0,105,6,0,0,106,6,0,0,107,6,0,0,108,6,0,0,109,6,0,0,110,6,0,0,111,6,2, +0,112,6,2,0,113,6,4,0,114,6,4,0,115,6,4,0,116,6,4,0,117,6,2,0,118,6,2,0,119,6,2, +0,120,6,2,0,121,6,4,0,122,6,4,0,123,6,2,0,124,6,2,0,125,6,2,0,126,6,2,0,127,6,0, +0,-128,6,12,0,-127,6,2,0,-126,6,2,0,-125,6,2,0,-124,6,2,0,-123,6,2,0,-122,6,2,0,-121,6,2, +0,-120,6,2,0,-119,6,-45,0,-118,6,2,0,-117,6,2,0,-116,6,2,0,-115,6,2,0,-114,6,4,0,-113,6,4, +0,-112,6,4,0,-111,6,4,0,-110,6,2,0,-109,6,2,0,-108,6,2,0,-107,6,2,0,-106,6,2,0,-105,6,2, +0,-104,6,2,0,-103,6,2,0,-102,6,2,0,-101,6,2,0,-100,6,2,0,-99,6,2,0,37,0,0,0,-98,6,0, +0,-97,6,0,0,-96,6,7,0,-95,6,2,0,55,5,2,0,-94,6,54,0,-93,6,-43,0,18,0,27,0,31,0,12, +0,-92,6,12,0,-91,6,12,0,-90,6,-79,0,-89,6,2,0,-105,2,2,0,-88,6,2,0,-104,2,2,0,-87,6,2, +0,-86,6,2,0,-85,6,2,0,-84,6,2,0,-83,6,2,0,-82,6,2,0,37,0,2,0,-81,6,2,0,-80,6,2, +0,-79,6,-42,0,5,0,-42,0,0,0,-42,0,1,0,-42,0,-78,6,13,0,-77,6,4,0,20,0,-41,0,7,0,-41, +0,0,0,-41,0,1,0,-42,0,-76,6,-42,0,-75,6,2,0,123,4,2,0,20,0,4,0,37,0,-40,0,17,0,-40, +0,0,0,-40,0,1,0,0,0,-74,6,0,0,-73,6,0,0,-72,6,2,0,-71,6,2,0,-70,6,2,0,-86,6,2, +0,-85,6,2,0,20,0,2,0,70,3,2,0,-69,6,2,0,-68,6,2,0,-67,6,2,0,-66,6,4,0,-65,6,-40, +0,-64,6,-74,0,30,0,-74,0,0,0,-74,0,1,0,-42,0,-76,6,-42,0,-75,6,-42,0,-63,6,-42,0,-62,6,-43, +0,-61,6,7,0,-60,6,23,0,52,0,23,0,-59,6,23,0,-58,6,2,0,-57,6,2,0,-56,6,2,0,-55,6,0, +0,75,5,0,0,-54,6,2,0,-53,6,2,0,-52,6,0,0,-51,6,0,0,-50,6,0,0,-49,6,0,0,-48,6,2, +0,-47,6,2,0,-46,6,2,0,-45,6,2,0,20,0,39,0,125,0,12,0,-44,6,12,0,-43,6,12,0,-42,6,-39, +0,11,0,0,0,-41,6,2,0,-40,6,2,0,-39,6,2,0,-38,6,2,0,-37,6,2,0,-36,6,2,0,107,4,9, +0,-35,6,9,0,-34,6,4,0,-33,6,4,0,-32,6,-38,0,1,0,0,0,-31,6,-37,0,8,0,56,0,-30,6,56, +0,-29,6,-37,0,-28,6,-37,0,-27,6,-37,0,-26,6,2,0,-123,0,2,0,20,0,4,0,-25,6,-36,0,4,0,4, +0,-35,5,4,0,-24,6,4,0,-31,5,4,0,-23,6,-35,0,2,0,4,0,-22,6,4,0,-21,6,-34,0,9,0,7, +0,-20,6,7,0,-19,6,7,0,-18,6,4,0,20,0,4,0,13,1,7,0,-19,3,7,0,-17,6,4,0,37,0,-33, +0,-16,6,-32,0,6,0,0,0,-15,6,0,0,-75,5,48,0,-116,0,2,0,109,0,2,0,111,4,4,0,37,0,-31, +0,21,0,-31,0,0,0,-31,0,1,0,4,0,57,0,4,0,23,0,4,0,28,0,4,0,-14,6,4,0,-13,6,4, +0,-12,6,-38,0,-11,6,0,0,-15,6,4,0,-10,6,4,0,-9,6,-32,0,-12,2,-36,0,-8,6,-35,0,-7,6,-34, +0,-6,6,-37,0,-5,6,-37,0,-4,6,-37,0,-3,6,56,0,-2,6,56,0,-1,6,-30,0,12,0,0,0,-68,1,9, +0,-62,0,0,0,-61,0,4,0,-58,0,4,0,-50,0,9,0,-57,0,7,0,-55,0,7,0,-54,0,9,0,0,7,9, +0,1,7,9,0,-53,0,9,0,-51,0,-29,0,43,0,-29,0,0,0,-29,0,1,0,9,0,2,7,9,0,26,0,0, +0,27,0,4,0,20,0,4,0,18,0,4,0,23,0,4,0,91,0,4,0,3,7,4,0,4,7,4,0,-13,6,4, +0,-12,6,4,0,5,7,4,0,-39,0,4,0,6,7,4,0,7,7,7,0,8,7,7,0,9,7,4,0,-126,0,4, +0,10,7,-31,0,11,7,36,0,79,0,-79,0,-89,6,48,0,-116,0,7,0,12,7,7,0,13,7,-30,0,2,1,-29, +0,14,7,-29,0,15,7,-29,0,16,7,12,0,17,7,-28,0,18,7,-27,0,19,7,7,0,20,7,7,0,21,7,4, +0,-84,6,7,0,22,7,9,0,23,7,4,0,24,7,4,0,25,7,4,0,26,7,7,0,27,7,-26,0,4,0,-26, +0,0,0,-26,0,1,0,12,0,28,7,-29,0,29,7,-25,0,6,0,12,0,30,7,12,0,17,7,12,0,31,7,2, +0,20,0,2,0,37,0,4,0,57,0,-24,0,4,0,7,0,32,7,7,0,112,0,2,0,33,7,2,0,34,7,-23, +0,6,0,7,0,35,7,7,0,36,7,7,0,37,7,7,0,38,7,4,0,39,7,4,0,40,7,-22,0,12,0,7, +0,41,7,7,0,42,7,7,0,43,7,7,0,44,7,7,0,45,7,7,0,46,7,7,0,47,7,7,0,48,7,7, +0,49,7,7,0,50,7,4,0,-110,2,4,0,51,7,-21,0,2,0,7,0,-55,4,7,0,37,0,-20,0,7,0,7, +0,52,7,7,0,53,7,4,0,93,0,4,0,108,2,4,0,54,7,4,0,55,7,4,0,37,0,-19,0,6,0,-19, +0,0,0,-19,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,-18,0,8,0,-18,0,0,0,-18, +0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,7,0,23,0,7,0,-126,0,-17,0,45,0,-17, +0,0,0,-17,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,2,0,-103,3,2,0,57,7,7, +0,58,7,7,0,92,0,7,0,-97,2,4,0,59,7,4,0,81,0,4,0,110,2,7,0,60,7,7,0,61,7,7, +0,62,7,7,0,63,7,7,0,64,7,7,0,65,7,7,0,-100,2,7,0,-1,0,7,0,66,7,7,0,67,7,7, +0,37,0,7,0,68,7,7,0,69,7,7,0,70,7,2,0,71,7,2,0,72,7,2,0,73,7,2,0,74,7,2, +0,75,7,2,0,76,7,2,0,77,7,2,0,78,7,2,0,123,5,2,0,79,7,2,0,-47,1,2,0,80,7,0, +0,81,7,0,0,82,7,7,0,-45,0,-16,0,83,7,63,0,-95,1,-15,0,16,0,-15,0,0,0,-15,0,1,0,2, +0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,7,0,-105,2,7,0,-104,2,7,0,-103,2,7,0,-5,1,7, +0,-102,2,7,0,-101,2,7,0,84,7,7,0,-100,2,7,0,-98,2,7,0,-97,2,-59,0,5,0,2,0,18,0,2, +0,-25,6,2,0,20,0,2,0,85,7,27,0,-9,5,-60,0,3,0,4,0,69,0,4,0,86,7,-59,0,2,0,-14, +0,12,0,-14,0,0,0,-14,0,1,0,2,0,18,0,2,0,20,0,2,0,31,3,2,0,-32,1,7,0,5,0,7, +0,6,0,7,0,87,7,7,0,88,7,27,0,-9,5,12,0,89,7,-13,0,11,0,-13,0,0,0,-13,0,1,0,0, +0,17,0,2,0,18,0,2,0,90,7,4,0,22,0,4,0,91,7,2,0,20,0,2,0,37,0,9,0,92,7,9, +0,93,7,-12,0,5,0,0,0,17,0,7,0,20,1,7,0,94,7,4,0,95,7,4,0,37,0,-11,0,4,0,2, +0,18,0,2,0,20,0,2,0,43,0,2,0,70,0,-10,0,4,0,0,0,17,0,62,0,96,7,7,0,20,1,7, +0,37,0,-9,0,6,0,2,0,97,7,2,0,98,7,2,0,18,0,2,0,99,7,0,0,100,7,0,0,101,7,-8, +0,5,0,4,0,18,0,4,0,37,0,0,0,17,0,0,0,102,7,0,0,103,7,-7,0,3,0,4,0,18,0,4, +0,37,0,0,0,17,0,-6,0,4,0,2,0,104,7,2,0,105,7,2,0,20,0,2,0,37,0,-5,0,6,0,0, +0,17,0,0,0,106,7,2,0,107,7,2,0,-100,2,2,0,13,1,2,0,70,0,-4,0,5,0,0,0,17,0,7, +0,112,0,7,0,-17,3,2,0,20,0,2,0,122,2,-3,0,3,0,0,0,17,0,4,0,110,2,4,0,104,7,-2, +0,7,0,0,0,17,0,7,0,-17,3,0,0,108,7,0,0,109,7,2,0,13,1,2,0,43,0,4,0,110,7,-1, +0,3,0,32,0,111,7,0,0,112,7,0,0,113,7,0,1,18,0,0,1,0,0,0,1,1,0,2,0,18,0,2, +0,90,7,2,0,20,0,2,0,114,7,2,0,115,7,2,0,116,7,2,0,43,0,2,0,70,0,0,0,17,0,9, +0,2,0,1,1,117,7,32,0,45,0,2,0,-47,4,2,0,20,7,2,0,118,7,2,0,37,0,2,1,11,0,0, +0,17,0,0,0,18,0,0,0,119,7,2,0,20,0,2,0,122,2,2,0,120,7,4,0,121,7,4,0,122,7,4, +0,123,7,4,0,124,7,4,0,125,7,3,1,1,0,0,0,126,7,4,1,4,0,42,0,-36,5,0,0,127,7,4, +0,13,1,4,0,20,0,1,1,18,0,1,1,0,0,1,1,1,0,1,1,-128,7,2,0,18,0,2,0,20,0,2, +0,-127,7,2,0,116,7,2,0,90,7,2,0,-126,7,2,0,70,0,2,0,12,1,0,0,17,0,9,0,2,0,5, +1,117,7,0,1,-125,7,2,0,15,0,2,0,-124,7,4,0,-123,7,6,1,3,0,4,0,-74,2,4,0,37,0,32, +0,45,0,7,1,12,0,-111,0,-122,7,2,0,18,0,2,0,20,0,4,0,58,7,4,0,92,0,0,0,17,0,0, +0,-121,7,2,0,-120,7,2,0,-119,7,2,0,-118,7,2,0,-117,7,7,0,-116,7,8,1,10,0,2,0,20,0,2, +0,-115,7,4,0,58,7,4,0,92,0,2,0,-114,7,-28,0,18,7,2,0,18,0,2,0,-113,7,2,0,-112,7,2, +0,-111,7,9,1,7,0,2,0,20,0,2,0,-115,7,4,0,58,7,4,0,92,0,2,0,18,0,2,0,-110,7,7, +0,109,3,10,1,11,0,4,0,-74,2,2,0,18,0,2,0,20,0,32,0,45,0,74,0,-109,7,0,0,17,0,7, +0,-108,7,7,0,-107,7,7,0,21,3,2,0,-106,7,2,0,-105,7,11,1,5,0,2,0,18,0,2,0,20,0,4, +0,37,0,-79,0,-89,6,32,0,39,5,12,1,5,0,4,0,20,0,4,0,18,0,0,0,17,0,0,0,102,7,32, +0,45,0,13,1,13,0,2,0,20,0,2,0,18,0,2,0,90,7,2,0,22,3,7,0,-104,7,7,0,-103,7,7, +0,7,1,7,0,8,1,7,0,-3,2,7,0,0,3,7,0,-102,7,7,0,-101,7,32,0,-100,7,14,1,10,0,2, +0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,0,0,-121,7,2,0,43,0,2,0,64,0,2, +0,-99,7,2,0,-98,7,15,1,8,0,32,0,45,0,7,0,-103,2,7,0,-97,7,7,0,-96,7,7,0,-108,2,2, +0,20,0,2,0,122,2,7,0,-95,7,16,1,12,0,2,0,18,0,2,0,13,1,2,0,20,0,2,0,-100,2,2, +0,-74,2,2,0,-94,7,4,0,37,0,7,0,-93,7,7,0,-92,7,7,0,-91,7,7,0,-90,7,0,0,-89,7,17, +1,10,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,2,0,68,2,2,0,64,0,2, +0,-99,7,2,0,-98,7,63,0,-95,1,18,1,7,0,4,0,110,2,4,0,-88,7,4,0,-87,7,4,0,-86,7,7, +0,-85,7,7,0,-84,7,0,0,108,7,19,1,7,0,0,0,-83,7,32,0,-82,7,0,0,112,7,2,0,-81,7,2, +0,43,0,4,0,70,0,0,0,113,7,20,1,6,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0, +0,-80,7,0,0,-79,7,21,1,1,0,4,0,20,0,22,1,6,0,0,0,95,0,2,0,18,0,2,0,20,0,4, +0,-78,7,7,0,-77,7,42,0,-36,5,23,1,4,0,0,0,-74,0,2,0,20,0,4,0,18,0,32,0,45,0,24, +1,2,0,4,0,18,0,4,0,-121,5,5,1,10,0,5,1,0,0,5,1,1,0,5,1,-128,7,2,0,18,0,2, +0,20,0,2,0,90,7,2,0,-76,7,0,0,17,0,9,0,2,0,32,0,45,0,25,1,10,0,7,0,21,3,7, +0,-75,7,7,0,-74,7,7,0,-73,7,7,0,-72,7,4,0,20,0,7,0,-94,7,7,0,-71,7,7,0,-70,7,7, +0,37,0,-28,0,20,0,27,0,31,0,0,0,-63,0,26,1,-69,7,9,0,-68,7,43,0,-104,0,43,0,-67,7,9, +0,-66,7,36,0,79,0,7,0,109,3,7,0,-65,7,7,0,-64,7,7,0,-63,7,7,0,-62,7,7,0,-61,7,7, +0,-60,7,4,0,93,0,4,0,-59,7,0,0,-58,7,0,0,-57,7,0,0,-56,7,27,1,6,0,27,0,31,0,7, +0,-55,7,7,0,-54,7,7,0,-53,7,2,0,-52,7,2,0,-51,7,28,1,14,0,-75,0,0,0,-75,0,1,0,4, +0,75,5,7,0,76,5,-74,0,77,5,-69,0,-108,5,-28,0,18,7,2,0,13,1,2,0,-115,7,2,0,8,2,2, +0,9,2,2,0,20,0,2,0,-98,5,4,0,70,0,29,1,6,0,29,1,0,0,29,1,1,0,32,0,45,0,9, +0,-50,7,4,0,-38,0,4,0,37,0,63,0,4,0,27,0,31,0,12,0,-49,7,4,0,-121,0,7,0,-48,7,30, +1,25,0,30,1,0,0,30,1,1,0,30,1,38,0,12,0,-47,7,0,0,17,0,7,0,-46,7,7,0,-45,7,7, +0,-44,7,7,0,-43,7,4,0,20,0,7,0,-42,7,7,0,-41,7,7,0,-40,7,7,0,20,1,7,0,-39,1,7, +0,-39,7,7,0,108,2,7,0,-38,7,7,0,-37,7,7,0,-36,7,7,0,-35,7,7,0,-34,7,7,0,-81,0,2, +0,-121,0,2,0,-31,4,31,1,19,0,27,0,31,0,12,0,-33,7,12,0,-32,7,4,0,20,0,4,0,30,4,2, +0,-96,2,2,0,-31,7,2,0,-121,0,2,0,-30,7,2,0,-29,7,2,0,-28,7,2,0,-27,7,2,0,-26,7,4, +0,-25,7,4,0,-24,7,4,0,-23,7,4,0,-22,7,4,0,-21,7,4,0,-20,7,32,1,34,0,32,1,0,0,32, +1,1,0,12,0,49,3,0,0,17,0,2,0,20,0,2,0,-19,7,2,0,-18,7,2,0,-17,7,2,0,10,3,2, +0,-16,7,4,0,-7,1,4,0,-23,7,4,0,-22,7,30,1,-15,7,32,1,38,0,32,1,-14,7,12,0,-13,7,9, +0,-12,7,9,0,-11,7,9,0,-10,7,7,0,7,1,7,0,-81,0,7,0,-57,1,7,0,-9,7,7,0,-8,7,7, +0,2,3,7,0,-7,7,7,0,-6,7,7,0,-5,7,7,0,-4,7,7,0,-3,7,7,0,-2,7,7,0,-10,1,32, +0,-1,7,-110,0,9,0,12,0,0,8,2,0,20,0,2,0,1,8,7,0,20,3,7,0,2,8,7,0,3,8,12, +0,4,8,4,0,5,8,4,0,37,0,33,1,7,0,33,1,0,0,33,1,1,0,12,0,-58,7,4,0,20,0,4, +0,6,8,0,0,17,0,-47,0,7,8,34,1,8,0,34,1,0,0,34,1,1,0,33,1,8,8,36,0,79,0,12, +0,-6,2,4,0,20,0,0,0,17,0,4,0,9,8,-111,0,6,0,27,0,31,0,12,0,0,8,12,0,10,8,12, +0,103,0,4,0,11,8,4,0,37,0,35,1,16,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, +0,77,5,2,0,78,5,-69,0,-108,5,-111,0,-9,2,0,0,13,1,0,0,-37,5,2,0,20,0,2,0,12,8,2, +0,-101,5,2,0,-98,5,2,0,13,8,7,0,14,8,36,1,5,0,36,1,0,0,36,1,1,0,36,0,79,0,2, +0,20,0,0,0,15,8,37,1,12,0,37,1,0,0,37,1,1,0,9,0,2,0,2,0,18,0,2,0,20,0,0, +0,16,8,0,0,17,8,0,0,15,8,7,0,18,8,7,0,19,8,4,0,37,0,36,0,79,0,38,1,9,0,38, +1,0,0,38,1,1,0,32,0,20,8,0,0,21,8,7,0,22,8,2,0,23,8,2,0,20,0,2,0,18,0,2, +0,37,0,39,1,7,0,42,0,-36,5,26,0,24,8,4,0,20,0,4,0,25,8,12,0,26,8,32,0,20,8,0, +0,21,8,40,1,12,0,32,0,20,8,2,0,27,8,2,0,20,0,2,0,28,8,2,0,29,8,0,0,21,8,32, +0,30,8,0,0,31,8,7,0,32,8,7,0,-39,1,7,0,33,8,7,0,34,8,41,1,6,0,32,0,20,8,4, +0,9,8,4,0,35,8,4,0,93,0,4,0,37,0,0,0,21,8,42,1,4,0,32,0,20,8,4,0,20,0,4, +0,9,8,0,0,21,8,43,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,44,1,10,0,32, +0,20,8,4,0,36,8,7,0,-127,0,4,0,20,0,2,0,-42,5,2,0,37,8,2,0,43,0,2,0,70,0,7, +0,38,8,0,0,21,8,45,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,46,1,10,0,32, +0,20,8,2,0,18,0,2,0,-95,3,4,0,91,0,4,0,92,0,7,0,-97,7,7,0,-96,7,4,0,37,0,-111, +0,-122,7,0,0,21,8,47,1,4,0,32,0,20,8,4,0,7,3,4,0,39,8,0,0,21,8,48,1,5,0,32, +0,20,8,7,0,-127,0,4,0,40,8,4,0,7,3,4,0,8,3,49,1,6,0,32,0,20,8,4,0,41,8,4, +0,42,8,7,0,43,8,7,0,44,8,0,0,21,8,50,1,16,0,32,0,20,8,32,0,-14,7,4,0,18,0,7, +0,45,8,7,0,46,8,7,0,47,8,7,0,48,8,7,0,49,8,7,0,50,8,7,0,51,8,7,0,52,8,7, +0,53,8,2,0,20,0,2,0,37,0,2,0,43,0,2,0,70,0,51,1,3,0,32,0,20,8,4,0,20,0,4, +0,123,5,52,1,5,0,32,0,20,8,4,0,20,0,4,0,37,0,7,0,54,8,0,0,21,8,53,1,10,0,32, +0,20,8,0,0,21,8,2,0,55,8,2,0,56,8,0,0,57,8,0,0,58,8,7,0,59,8,7,0,60,8,7, +0,61,8,7,0,62,8,54,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7,0,63,8,7, +0,64,8,2,0,20,0,2,0,123,5,55,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7, +0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,56,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7, +0,12,0,7,0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,57,1,7,0,32,0,20,8,0,0,21,8,7, +0,20,1,7,0,30,1,2,0,20,0,2,0,13,1,4,0,37,0,58,1,5,0,32,0,-45,2,7,0,20,1,2, +0,-41,2,0,0,-39,2,0,0,65,8,59,1,10,0,59,1,0,0,59,1,1,0,2,0,18,0,2,0,20,0,0, +0,66,8,7,0,-36,0,7,0,-35,0,2,0,-58,7,2,0,67,8,32,0,45,0,60,1,22,0,60,1,0,0,60, +1,1,0,2,0,20,0,2,0,13,1,2,0,68,8,2,0,69,8,36,0,79,0,-111,0,-122,7,32,0,-89,0,7, +0,91,0,7,0,92,0,7,0,70,8,7,0,71,8,7,0,72,8,7,0,73,8,7,0,-107,2,7,0,-67,1,7, +0,-120,7,7,0,74,8,0,0,75,8,0,0,76,8,12,0,-4,2,61,1,8,0,7,0,-31,1,7,0,-97,7,7, +0,-96,7,9,0,2,0,2,0,77,8,2,0,78,8,2,0,79,8,2,0,80,8,62,1,18,0,62,1,0,0,62, +1,1,0,62,1,81,8,0,0,17,0,61,1,82,8,2,0,18,0,2,0,20,0,2,0,83,8,2,0,84,8,2, +0,85,8,2,0,86,8,4,0,43,0,7,0,87,8,7,0,88,8,4,0,89,8,4,0,90,8,62,1,91,8,63, +1,92,8,64,1,32,0,64,1,0,0,64,1,1,0,64,1,93,8,0,0,17,0,0,0,94,8,2,0,18,0,2, +0,20,0,2,0,-14,6,2,0,20,7,2,0,95,8,2,0,-119,0,2,0,84,8,2,0,-25,6,12,0,-127,7,12, +0,96,8,27,0,-9,5,9,0,97,8,7,0,87,8,7,0,88,8,7,0,-5,1,7,0,98,8,2,0,99,8,2, +0,100,8,7,0,101,8,7,0,102,8,2,0,103,8,2,0,104,8,24,0,105,8,24,0,106,8,24,0,107,8,65, +1,-103,0,66,1,108,8,63,1,6,0,63,1,0,0,63,1,1,0,64,1,109,8,64,1,110,8,62,1,111,8,62, +1,91,8,57,0,16,0,27,0,31,0,12,0,112,8,12,0,113,8,61,1,114,8,12,0,115,8,4,0,18,0,4, +0,116,8,4,0,117,8,4,0,118,8,12,0,119,8,66,1,120,8,62,1,121,8,62,1,122,8,9,0,123,8,9, +0,124,8,4,0,125,8,67,1,6,0,4,0,-128,0,4,0,-126,0,4,0,-25,6,0,0,126,8,0,0,127,8,2, +0,37,0,68,1,16,0,2,0,-86,6,2,0,-85,6,2,0,-128,8,2,0,-74,7,2,0,-127,8,2,0,68,0,7, +0,-108,2,7,0,-126,8,7,0,-125,8,2,0,34,1,0,0,-124,8,0,0,42,4,2,0,-123,8,2,0,37,0,4, +0,-122,8,4,0,-121,8,69,1,9,0,7,0,-120,8,7,0,-119,8,7,0,-60,7,7,0,112,0,7,0,-118,8,7, +0,71,5,2,0,-117,8,0,0,-116,8,0,0,37,0,70,1,4,0,7,0,-115,8,7,0,-114,8,2,0,-117,8,2, +0,37,0,71,1,3,0,7,0,-113,8,7,0,-112,8,7,0,15,0,72,1,7,0,0,0,-68,1,2,0,109,4,2, +0,110,4,2,0,111,4,2,0,62,4,4,0,-126,0,4,0,-97,3,73,1,7,0,7,0,-111,8,7,0,-110,8,7, +0,-109,8,7,0,4,2,7,0,-108,8,7,0,-107,8,7,0,-106,8,74,1,4,0,2,0,-105,8,2,0,-104,8,2, +0,-103,8,2,0,-102,8,75,1,2,0,7,0,5,0,7,0,6,0,76,1,2,0,0,0,-87,0,0,0,-101,8,77, +1,1,0,0,0,17,0,78,1,10,0,0,0,-100,8,0,0,-99,8,0,0,-98,8,0,0,-97,8,2,0,-128,8,2, +0,-96,8,7,0,-95,8,7,0,-94,8,7,0,-93,8,7,0,-67,1,79,1,2,0,9,0,-92,8,9,0,-91,8,80, +1,11,0,0,0,111,4,0,0,18,0,0,0,-117,8,0,0,112,0,0,0,-90,8,0,0,109,0,0,0,-74,0,7, +0,-89,8,7,0,-88,8,7,0,-87,8,7,0,-86,8,81,1,8,0,7,0,97,7,7,0,-127,0,7,0,42,4,7, +0,72,2,7,0,-85,8,7,0,-49,0,7,0,-84,8,4,0,18,0,82,1,4,0,2,0,-83,8,2,0,-82,8,2, +0,-81,8,2,0,37,0,83,1,1,0,0,0,17,0,84,1,4,0,7,0,5,0,7,0,6,0,2,0,20,0,2, +0,-80,8,85,1,10,0,2,0,-120,3,2,0,20,0,7,0,-17,3,7,0,-79,8,7,0,-78,8,7,0,-77,8,7, +0,-76,8,84,1,-75,8,84,1,-74,8,84,1,-73,8,60,0,9,0,4,0,20,0,4,0,64,0,24,0,-72,8,24, +0,-71,8,85,1,-70,8,7,0,-69,8,7,0,-68,8,7,0,-67,8,7,0,-66,8,86,1,4,0,46,0,-114,2,7, +0,-65,8,7,0,92,1,7,0,37,0,-87,0,13,0,27,0,31,0,2,0,20,0,2,0,72,5,4,0,109,0,7, +0,-64,8,7,0,1,2,7,0,-63,8,7,0,-62,8,7,0,92,1,2,0,47,1,2,0,37,0,50,0,77,1,86, +1,-61,8,87,1,10,0,4,0,18,0,4,0,-127,0,4,0,20,0,4,0,70,3,4,0,-60,8,4,0,-59,8,4, +0,-58,8,0,0,95,0,0,0,17,0,9,0,2,0,84,0,6,0,87,1,-57,8,4,0,-56,8,4,0,-55,8,4, +0,-54,8,4,0,37,0,9,0,-53,8,88,1,5,0,7,0,66,2,7,0,-74,2,7,0,-39,1,2,0,-52,8,2, +0,37,0,89,1,5,0,7,0,66,2,7,0,-51,8,7,0,-50,8,7,0,-49,8,7,0,-74,2,90,1,7,0,4, +0,-48,8,4,0,-47,8,4,0,-46,8,7,0,-45,8,7,0,-44,8,7,0,-43,8,7,0,-42,8,91,1,26,0,32, +0,-41,8,89,1,66,3,89,1,-40,8,88,1,-39,8,89,1,83,7,7,0,-38,8,7,0,-37,8,7,0,-36,8,7, +0,-35,8,7,0,-44,8,7,0,-43,8,7,0,-74,2,7,0,-97,2,7,0,-34,8,7,0,-33,8,7,0,109,0,7, +0,-32,8,4,0,-48,8,4,0,-31,8,4,0,37,0,4,0,81,0,4,0,-30,8,2,0,20,0,2,0,-29,8,2, +0,-28,8,2,0,100,3,92,1,112,0,27,0,31,0,4,0,20,0,2,0,18,0,2,0,55,8,2,0,-27,8,2, +0,-26,8,2,0,-25,8,2,0,-24,8,2,0,-23,8,2,0,-22,8,2,0,-21,8,2,0,-20,8,2,0,-19,8,2, +0,-18,8,2,0,-17,8,2,0,-16,8,2,0,-15,8,2,0,-14,8,2,0,-13,8,2,0,-47,1,2,0,76,7,2, +0,51,7,2,0,-12,8,2,0,-11,8,2,0,98,3,2,0,99,3,2,0,-10,8,2,0,-9,8,2,0,-8,8,2, +0,-7,8,2,0,-6,8,2,0,-5,8,7,0,-4,8,7,0,-3,8,7,0,-2,8,2,0,-1,8,2,0,0,9,7, +0,1,9,7,0,2,9,7,0,3,9,7,0,58,7,7,0,92,0,7,0,-97,2,7,0,64,7,7,0,4,9,7, +0,5,9,7,0,6,9,7,0,7,9,7,0,57,0,4,0,59,7,4,0,57,7,4,0,8,9,7,0,60,7,7, +0,61,7,7,0,62,7,7,0,9,9,7,0,10,9,7,0,11,9,7,0,12,9,7,0,13,9,7,0,14,9,7, +0,15,9,7,0,16,9,7,0,21,3,7,0,109,0,7,0,17,9,7,0,18,9,7,0,19,9,7,0,20,9,7, +0,21,9,7,0,22,9,7,0,108,2,7,0,23,9,7,0,24,9,4,0,25,9,4,0,26,9,7,0,27,9,7, +0,28,9,7,0,29,9,7,0,30,9,7,0,31,9,7,0,32,9,7,0,33,9,7,0,34,9,7,0,94,3,7, +0,92,3,7,0,93,3,7,0,35,9,7,0,36,9,7,0,37,9,7,0,38,9,7,0,39,9,7,0,40,9,7, +0,41,9,7,0,42,9,7,0,43,9,7,0,28,3,7,0,44,9,7,0,45,9,7,0,46,9,7,0,47,9,7, +0,48,9,7,0,49,9,7,0,50,9,0,0,51,9,63,0,55,3,63,0,52,9,32,0,53,9,32,0,54,9,36, +0,79,0,-108,0,53,3,-108,0,55,9,-120,0,37,0,-120,0,0,0,-120,0,1,0,92,1,56,9,91,1,-121,3,90, +1,-14,7,93,1,57,9,94,1,58,9,94,1,59,9,12,0,60,9,12,0,61,9,-107,0,54,3,32,0,62,9,32, +0,63,9,32,0,64,9,12,0,65,9,12,0,66,9,7,0,-45,0,7,0,83,4,4,0,110,2,4,0,20,0,4, +0,59,7,4,0,67,9,4,0,68,9,4,0,69,9,4,0,57,0,2,0,-38,0,2,0,70,9,2,0,71,9,2, +0,72,9,2,0,47,3,2,0,73,9,0,0,74,9,2,0,75,9,2,0,76,9,2,0,77,9,9,0,78,9,125, +0,-76,3,123,0,34,0,95,1,79,9,7,0,-106,3,7,0,80,9,7,0,81,9,7,0,-14,3,7,0,82,9,7, +0,31,3,7,0,21,3,7,0,83,9,7,0,3,2,7,0,84,9,7,0,85,9,7,0,86,9,7,0,87,9,7, +0,88,9,7,0,89,9,7,0,-105,3,7,0,90,9,7,0,91,9,7,0,92,9,7,0,-104,3,7,0,-108,3,7, +0,-107,3,4,0,93,9,4,0,93,0,4,0,94,9,4,0,95,9,2,0,96,9,2,0,97,9,2,0,98,9,2, +0,99,9,2,0,100,9,2,0,37,0,4,0,70,0,124,0,8,0,95,1,101,9,7,0,102,9,7,0,103,9,7, +0,-94,1,7,0,104,9,4,0,93,0,2,0,105,9,2,0,106,9,96,1,4,0,7,0,5,0,7,0,6,0,7, +0,7,0,7,0,107,9,97,1,6,0,97,1,0,0,97,1,1,0,96,1,108,9,4,0,109,9,2,0,110,9,2, +0,20,0,98,1,5,0,98,1,0,0,98,1,1,0,12,0,111,9,4,0,112,9,4,0,20,0,99,1,9,0,99, +1,0,0,99,1,1,0,12,0,-128,0,98,1,113,9,4,0,20,0,2,0,110,9,2,0,114,9,7,0,94,0,0, +0,115,9,-70,0,5,0,12,0,125,4,4,0,20,0,2,0,116,9,2,0,117,9,9,0,118,9,69,78,68,66,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; +int DNAlen64= sizeof(DNAstr64); diff --git a/Extras/Serialize/BlenderSerialize/dna249.cpp b/Extras/Serialize/BlenderSerialize/dna249.cpp index 6a178205a..97881b4f7 100644 --- a/Extras/Serialize/BlenderSerialize/dna249.cpp +++ b/Extras/Serialize/BlenderSerialize/dna249.cpp @@ -1,1411 +1,1411 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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. -*/ -unsigned char DNAstr[]= { -83,68,78,65,78,65,77,69,119,9,0,0,42,110,101,120,116,0,42,112,114,101,118,0,42,100,97,116,97,0,42,102,105, -114,115,116,0,42,108,97,115,116,0,120,0,121,0,122,0,119,0,120,109,105,110,0,120,109,97,120,0,121,109,105,110, -0,121,109,97,120,0,42,112,111,105,110,116,101,114,0,103,114,111,117,112,0,118,97,108,0,118,97,108,50,0,110,97, -109,101,91,51,50,93,0,116,121,112,101,0,115,117,98,116,121,112,101,0,102,108,97,103,0,115,97,118,101,100,0,100, -97,116,97,0,108,101,110,0,116,111,116,97,108,108,101,110,0,42,110,101,119,105,100,0,42,108,105,98,0,110,97,109, -101,91,50,52,93,0,117,115,0,105,99,111,110,95,105,100,0,42,112,114,111,112,101,114,116,105,101,115,0,105,100,0, -42,105,100,98,108,111,99,107,0,42,102,105,108,101,100,97,116,97,0,110,97,109,101,91,50,52,48,93,0,102,105,108, -101,110,97,109,101,91,50,52,48,93,0,116,111,116,0,112,97,100,0,42,112,97,114,101,110,116,0,119,91,50,93,0, -104,91,50,93,0,99,104,97,110,103,101,100,91,50,93,0,112,97,100,48,0,112,97,100,49,0,42,114,101,99,116,91, -50,93,0,42,111,98,0,98,108,111,99,107,116,121,112,101,0,97,100,114,99,111,100,101,0,110,97,109,101,91,49,50, -56,93,0,42,98,112,0,42,98,101,122,116,0,109,97,120,114,99,116,0,116,111,116,114,99,116,0,118,97,114,116,121, -112,101,0,116,111,116,118,101,114,116,0,105,112,111,0,101,120,116,114,97,112,0,114,116,0,98,105,116,109,97,115,107, -0,115,108,105,100,101,95,109,105,110,0,115,108,105,100,101,95,109,97,120,0,99,117,114,118,97,108,0,42,100,114,105, -118,101,114,0,99,117,114,118,101,0,99,117,114,0,115,104,111,119,107,101,121,0,109,117,116,101,105,112,111,0,112,111, -115,0,114,101,108,97,116,105,118,101,0,116,111,116,101,108,101,109,0,112,97,100,50,0,42,119,101,105,103,104,116,115, -0,118,103,114,111,117,112,91,51,50,93,0,115,108,105,100,101,114,109,105,110,0,115,108,105,100,101,114,109,97,120,0, -42,114,101,102,107,101,121,0,101,108,101,109,115,116,114,91,51,50,93,0,101,108,101,109,115,105,122,101,0,98,108,111, -99,107,0,42,105,112,111,0,42,102,114,111,109,0,116,111,116,107,101,121,0,115,108,117,114,112,104,0,42,42,115,99, -114,105,112,116,115,0,42,102,108,97,103,0,97,99,116,115,99,114,105,112,116,0,116,111,116,115,99,114,105,112,116,0, -42,108,105,110,101,0,42,102,111,114,109,97,116,0,98,108,101,110,0,108,105,110,101,110,111,0,115,116,97,114,116,0, -101,110,100,0,102,108,97,103,115,0,99,111,108,111,114,91,52,93,0,112,97,100,91,52,93,0,42,110,97,109,101,0, -110,108,105,110,101,115,0,108,105,110,101,115,0,42,99,117,114,108,0,42,115,101,108,108,0,99,117,114,99,0,115,101, -108,99,0,109,97,114,107,101,114,115,0,42,117,110,100,111,95,98,117,102,0,117,110,100,111,95,112,111,115,0,117,110, -100,111,95,108,101,110,0,42,99,111,109,112,105,108,101,100,0,109,116,105,109,101,0,115,105,122,101,0,115,101,101,107, -0,112,97,115,115,101,112,97,114,116,97,108,112,104,97,0,97,110,103,108,101,0,99,108,105,112,115,116,97,0,99,108, -105,112,101,110,100,0,108,101,110,115,0,111,114,116,104,111,95,115,99,97,108,101,0,100,114,97,119,115,105,122,101,0, -115,104,105,102,116,120,0,115,104,105,102,116,121,0,89,70,95,100,111,102,100,105,115,116,0,89,70,95,97,112,101,114, -116,117,114,101,0,89,70,95,98,107,104,116,121,112,101,0,89,70,95,98,107,104,98,105,97,115,0,89,70,95,98,107, -104,114,111,116,0,115,99,114,105,112,116,108,105,110,107,0,42,100,111,102,95,111,98,0,102,114,97,109,101,110,114,0, -102,114,97,109,101,115,0,111,102,102,115,101,116,0,115,102,114,97,0,102,105,101,95,105,109,97,0,99,121,99,108,0, -111,107,0,109,117,108,116,105,95,105,110,100,101,120,0,108,97,121,101,114,0,112,97,115,115,0,109,101,110,117,110,114, -0,105,98,117,102,115,0,42,103,112,117,116,101,120,116,117,114,101,0,42,97,110,105,109,0,42,114,114,0,115,111,117, -114,99,101,0,108,97,115,116,102,114,97,109,101,0,116,112,97,103,101,102,108,97,103,0,116,111,116,98,105,110,100,0, -120,114,101,112,0,121,114,101,112,0,116,119,115,116,97,0,116,119,101,110,100,0,98,105,110,100,99,111,100,101,0,42, -114,101,112,98,105,110,100,0,42,112,97,99,107,101,100,102,105,108,101,0,42,112,114,101,118,105,101,119,0,108,97,115, -116,117,112,100,97,116,101,0,108,97,115,116,117,115,101,100,0,97,110,105,109,115,112,101,101,100,0,103,101,110,95,120, -0,103,101,110,95,121,0,103,101,110,95,116,121,112,101,0,97,115,112,120,0,97,115,112,121,0,42,118,110,111,100,101, -0,116,101,120,99,111,0,109,97,112,116,111,0,109,97,112,116,111,110,101,103,0,98,108,101,110,100,116,121,112,101,0, -42,111,98,106,101,99,116,0,42,116,101,120,0,117,118,110,97,109,101,91,51,50,93,0,112,114,111,106,120,0,112,114, -111,106,121,0,112,114,111,106,122,0,109,97,112,112,105,110,103,0,111,102,115,91,51,93,0,115,105,122,101,91,51,93, -0,116,101,120,102,108,97,103,0,99,111,108,111,114,109,111,100,101,108,0,112,109,97,112,116,111,0,112,109,97,112,116, -111,110,101,103,0,110,111,114,109,97,112,115,112,97,99,101,0,119,104,105,99,104,95,111,117,116,112,117,116,0,112,97, -100,91,50,93,0,114,0,103,0,98,0,107,0,100,101,102,95,118,97,114,0,99,111,108,102,97,99,0,110,111,114,102, -97,99,0,118,97,114,102,97,99,0,100,105,115,112,102,97,99,0,119,97,114,112,102,97,99,0,110,97,109,101,91,49, -54,48,93,0,42,104,97,110,100,108,101,0,42,112,110,97,109,101,0,42,115,116,110,97,109,101,115,0,115,116,121,112, -101,115,0,118,97,114,115,0,42,118,97,114,115,116,114,0,42,114,101,115,117,108,116,0,42,99,102,114,97,0,100,97, -116,97,91,51,50,93,0,40,42,100,111,105,116,41,40,41,0,40,42,105,110,115,116,97,110,99,101,95,105,110,105,116, -41,40,41,0,40,42,99,97,108,108,98,97,99,107,41,40,41,0,118,101,114,115,105,111,110,0,97,0,105,112,111,116, -121,112,101,0,42,105,109,97,0,42,99,117,98,101,91,54,93,0,105,109,97,116,91,52,93,91,52,93,0,111,98,105, -109,97,116,91,51,93,91,51,93,0,115,116,121,112,101,0,118,105,101,119,115,99,97,108,101,0,110,111,116,108,97,121, -0,99,117,98,101,114,101,115,0,100,101,112,116,104,0,114,101,99,97,108,99,0,108,97,115,116,115,105,122,101,0,110, -111,105,115,101,115,105,122,101,0,116,117,114,98,117,108,0,98,114,105,103,104,116,0,99,111,110,116,114,97,115,116,0, -114,102,97,99,0,103,102,97,99,0,98,102,97,99,0,102,105,108,116,101,114,115,105,122,101,0,109,103,95,72,0,109, -103,95,108,97,99,117,110,97,114,105,116,121,0,109,103,95,111,99,116,97,118,101,115,0,109,103,95,111,102,102,115,101, -116,0,109,103,95,103,97,105,110,0,100,105,115,116,95,97,109,111,117,110,116,0,110,115,95,111,117,116,115,99,97,108, -101,0,118,110,95,119,49,0,118,110,95,119,50,0,118,110,95,119,51,0,118,110,95,119,52,0,118,110,95,109,101,120, -112,0,118,110,95,100,105,115,116,109,0,118,110,95,99,111,108,116,121,112,101,0,110,111,105,115,101,100,101,112,116,104, -0,110,111,105,115,101,116,121,112,101,0,110,111,105,115,101,98,97,115,105,115,0,110,111,105,115,101,98,97,115,105,115, -50,0,105,109,97,102,108,97,103,0,99,114,111,112,120,109,105,110,0,99,114,111,112,121,109,105,110,0,99,114,111,112, -120,109,97,120,0,99,114,111,112,121,109,97,120,0,120,114,101,112,101,97,116,0,121,114,101,112,101,97,116,0,101,120, -116,101,110,100,0,99,104,101,99,107,101,114,100,105,115,116,0,110,97,98,108,97,0,105,117,115,101,114,0,42,110,111, -100,101,116,114,101,101,0,42,112,108,117,103,105,110,0,42,99,111,98,97,0,42,101,110,118,0,117,115,101,95,110,111, -100,101,115,0,112,97,100,91,55,93,0,108,111,99,91,51,93,0,114,111,116,91,51,93,0,109,97,116,91,52,93,91, -52,93,0,109,105,110,91,51,93,0,109,97,120,91,51,93,0,112,97,100,51,0,109,111,100,101,0,116,111,116,101,120, -0,115,104,100,119,114,0,115,104,100,119,103,0,115,104,100,119,98,0,115,104,100,119,112,97,100,0,101,110,101,114,103, -121,0,100,105,115,116,0,115,112,111,116,115,105,122,101,0,115,112,111,116,98,108,101,110,100,0,104,97,105,110,116,0, -97,116,116,49,0,97,116,116,50,0,42,99,117,114,102,97,108,108,111,102,102,0,102,97,108,108,111,102,102,95,116,121, -112,101,0,115,104,97,100,115,112,111,116,115,105,122,101,0,98,105,97,115,0,115,111,102,116,0,98,117,102,115,105,122, -101,0,115,97,109,112,0,98,117,102,102,101,114,115,0,102,105,108,116,101,114,116,121,112,101,0,98,117,102,102,108,97, -103,0,98,117,102,116,121,112,101,0,114,97,121,95,115,97,109,112,0,114,97,121,95,115,97,109,112,121,0,114,97,121, -95,115,97,109,112,122,0,114,97,121,95,115,97,109,112,95,116,121,112,101,0,97,114,101,97,95,115,104,97,112,101,0, -97,114,101,97,95,115,105,122,101,0,97,114,101,97,95,115,105,122,101,121,0,97,114,101,97,95,115,105,122,101,122,0, -97,100,97,112,116,95,116,104,114,101,115,104,0,114,97,121,95,115,97,109,112,95,109,101,116,104,111,100,0,116,101,120, -97,99,116,0,115,104,97,100,104,97,108,111,115,116,101,112,0,115,117,110,95,101,102,102,101,99,116,95,116,121,112,101, -0,115,107,121,98,108,101,110,100,116,121,112,101,0,104,111,114,105,122,111,110,95,98,114,105,103,104,116,110,101,115,115, -0,115,112,114,101,97,100,0,115,117,110,95,98,114,105,103,104,116,110,101,115,115,0,115,117,110,95,115,105,122,101,0, -98,97,99,107,115,99,97,116,116,101,114,101,100,95,108,105,103,104,116,0,115,117,110,95,105,110,116,101,110,115,105,116, -121,0,97,116,109,95,116,117,114,98,105,100,105,116,121,0,97,116,109,95,105,110,115,99,97,116,116,101,114,105,110,103, -95,102,97,99,116,111,114,0,97,116,109,95,101,120,116,105,110,99,116,105,111,110,95,102,97,99,116,111,114,0,97,116, -109,95,100,105,115,116,97,110,99,101,95,102,97,99,116,111,114,0,115,107,121,98,108,101,110,100,102,97,99,0,115,107, -121,95,101,120,112,111,115,117,114,101,0,115,107,121,95,99,111,108,111,114,115,112,97,99,101,0,112,97,100,52,0,89, -70,95,110,117,109,112,104,111,116,111,110,115,0,89,70,95,110,117,109,115,101,97,114,99,104,0,89,70,95,112,104,100, -101,112,116,104,0,89,70,95,117,115,101,113,109,99,0,89,70,95,98,117,102,115,105,122,101,0,89,70,95,112,97,100, -0,89,70,95,99,97,117,115,116,105,99,98,108,117,114,0,89,70,95,108,116,114,97,100,105,117,115,0,89,70,95,103, -108,111,119,105,110,116,0,89,70,95,103,108,111,119,111,102,115,0,89,70,95,103,108,111,119,116,121,112,101,0,89,70, -95,112,97,100,50,0,42,109,116,101,120,91,49,56,93,0,115,112,101,99,114,0,115,112,101,99,103,0,115,112,101,99, -98,0,109,105,114,114,0,109,105,114,103,0,109,105,114,98,0,97,109,98,114,0,97,109,98,98,0,97,109,98,103,0, -97,109,98,0,101,109,105,116,0,97,110,103,0,115,112,101,99,116,114,97,0,114,97,121,95,109,105,114,114,111,114,0, -97,108,112,104,97,0,114,101,102,0,115,112,101,99,0,122,111,102,102,115,0,97,100,100,0,116,114,97,110,115,108,117, -99,101,110,99,121,0,102,114,101,115,110,101,108,95,109,105,114,0,102,114,101,115,110,101,108,95,109,105,114,95,105,0, -102,114,101,115,110,101,108,95,116,114,97,0,102,114,101,115,110,101,108,95,116,114,97,95,105,0,102,105,108,116,101,114, -0,116,120,95,108,105,109,105,116,0,116,120,95,102,97,108,108,111,102,102,0,114,97,121,95,100,101,112,116,104,0,114, -97,121,95,100,101,112,116,104,95,116,114,97,0,104,97,114,0,115,101,101,100,49,0,115,101,101,100,50,0,103,108,111, -115,115,95,109,105,114,0,103,108,111,115,115,95,116,114,97,0,115,97,109,112,95,103,108,111,115,115,95,109,105,114,0, -115,97,109,112,95,103,108,111,115,115,95,116,114,97,0,97,100,97,112,116,95,116,104,114,101,115,104,95,109,105,114,0, -97,100,97,112,116,95,116,104,114,101,115,104,95,116,114,97,0,97,110,105,115,111,95,103,108,111,115,115,95,109,105,114, -0,100,105,115,116,95,109,105,114,0,102,97,100,101,116,111,95,109,105,114,0,115,104,97,100,101,95,102,108,97,103,0, -109,111,100,101,95,108,0,102,108,97,114,101,99,0,115,116,97,114,99,0,108,105,110,101,99,0,114,105,110,103,99,0, -104,97,115,105,122,101,0,102,108,97,114,101,115,105,122,101,0,115,117,98,115,105,122,101,0,102,108,97,114,101,98,111, -111,115,116,0,115,116,114,97,110,100,95,115,116,97,0,115,116,114,97,110,100,95,101,110,100,0,115,116,114,97,110,100, -95,101,97,115,101,0,115,116,114,97,110,100,95,115,117,114,102,110,111,114,0,115,116,114,97,110,100,95,109,105,110,0, -115,116,114,97,110,100,95,119,105,100,116,104,102,97,100,101,0,115,116,114,97,110,100,95,117,118,110,97,109,101,91,51, -50,93,0,115,98,105,97,115,0,108,98,105,97,115,0,115,104,97,100,95,97,108,112,104,97,0,115,101,112,116,101,120, -0,114,103,98,115,101,108,0,112,114,95,116,121,112,101,0,112,114,95,98,97,99,107,0,112,114,95,108,97,109,112,0, -109,108,95,102,108,97,103,0,100,105,102,102,95,115,104,97,100,101,114,0,115,112,101,99,95,115,104,97,100,101,114,0, -114,111,117,103,104,110,101,115,115,0,114,101,102,114,97,99,0,112,97,114,97,109,91,52,93,0,114,109,115,0,100,97, -114,107,110,101,115,115,0,42,114,97,109,112,95,99,111,108,0,42,114,97,109,112,95,115,112,101,99,0,114,97,109,112, -105,110,95,99,111,108,0,114,97,109,112,105,110,95,115,112,101,99,0,114,97,109,112,98,108,101,110,100,95,99,111,108, -0,114,97,109,112,98,108,101,110,100,95,115,112,101,99,0,114,97,109,112,95,115,104,111,119,0,114,97,109,112,102,97, -99,95,99,111,108,0,114,97,109,112,102,97,99,95,115,112,101,99,0,42,103,114,111,117,112,0,102,114,105,99,116,105, -111,110,0,102,104,0,114,101,102,108,101,99,116,0,102,104,100,105,115,116,0,120,121,102,114,105,99,116,0,100,121,110, -97,109,111,100,101,0,115,115,115,95,114,97,100,105,117,115,91,51,93,0,115,115,115,95,99,111,108,91,51,93,0,115, -115,115,95,101,114,114,111,114,0,115,115,115,95,115,99,97,108,101,0,115,115,115,95,105,111,114,0,115,115,115,95,99, -111,108,102,97,99,0,115,115,115,95,116,101,120,102,97,99,0,115,115,115,95,102,114,111,110,116,0,115,115,115,95,98, -97,99,107,0,115,115,115,95,102,108,97,103,0,115,115,115,95,112,114,101,115,101,116,0,89,70,95,97,114,0,89,70, -95,97,103,0,89,70,95,97,98,0,89,70,95,100,115,99,97,108,101,0,89,70,95,100,112,119,114,0,89,70,95,100, -115,109,112,0,89,70,95,112,114,101,115,101,116,0,89,70,95,100,106,105,116,0,103,112,117,109,97,116,101,114,105,97, -108,0,110,97,109,101,91,50,53,54,93,0,115,99,97,108,101,0,42,98,98,0,105,49,0,106,49,0,107,49,0,105, -50,0,106,50,0,107,50,0,115,101,108,99,111,108,49,0,115,101,108,99,111,108,50,0,113,117,97,116,91,52,93,0, -101,120,112,120,0,101,120,112,121,0,101,120,112,122,0,114,97,100,0,114,97,100,50,0,115,0,42,109,97,116,0,42, -105,109,97,116,0,101,108,101,109,115,0,100,105,115,112,0,42,42,109,97,116,0,116,111,116,99,111,108,0,119,105,114, -101,115,105,122,101,0,114,101,110,100,101,114,115,105,122,101,0,116,104,114,101,115,104,0,118,101,99,91,51,93,91,51, -93,0,97,108,102,97,0,119,101,105,103,104,116,0,114,97,100,105,117,115,0,104,49,0,104,50,0,102,49,0,102,50, -0,102,51,0,104,105,100,101,0,118,101,99,91,52,93,0,109,97,116,95,110,114,0,112,110,116,115,117,0,112,110,116, -115,118,0,114,101,115,111,108,117,0,114,101,115,111,108,118,0,111,114,100,101,114,117,0,111,114,100,101,114,118,0,102, -108,97,103,117,0,102,108,97,103,118,0,42,107,110,111,116,115,117,0,42,107,110,111,116,115,118,0,116,105,108,116,95, -105,110,116,101,114,112,0,114,97,100,105,117,115,95,105,110,116,101,114,112,0,99,104,97,114,105,100,120,0,107,101,114, -110,0,104,0,110,117,114,98,0,42,98,101,118,111,98,106,0,42,116,97,112,101,114,111,98,106,0,42,116,101,120,116, -111,110,99,117,114,118,101,0,42,112,97,116,104,0,42,107,101,121,0,98,101,118,0,112,97,116,104,108,101,110,0,98, -101,118,114,101,115,111,108,0,119,105,100,116,104,0,101,120,116,49,0,101,120,116,50,0,114,101,115,111,108,117,95,114, -101,110,0,114,101,115,111,108,118,95,114,101,110,0,115,112,97,99,101,109,111,100,101,0,115,112,97,99,105,110,103,0, -108,105,110,101,100,105,115,116,0,115,104,101,97,114,0,102,115,105,122,101,0,119,111,114,100,115,112,97,99,101,0,117, -108,112,111,115,0,117,108,104,101,105,103,104,116,0,120,111,102,0,121,111,102,0,108,105,110,101,119,105,100,116,104,0, -42,115,116,114,0,102,97,109,105,108,121,91,50,52,93,0,42,118,102,111,110,116,0,42,118,102,111,110,116,98,0,42, -118,102,111,110,116,105,0,42,118,102,111,110,116,98,105,0,115,101,112,99,104,97,114,0,116,111,116,98,111,120,0,97, -99,116,98,111,120,0,42,116,98,0,115,101,108,115,116,97,114,116,0,115,101,108,101,110,100,0,42,115,116,114,105,110, -102,111,0,99,117,114,105,110,102,111,0,101,102,102,101,99,116,0,42,109,102,97,99,101,0,42,109,116,102,97,99,101, -0,42,116,102,97,99,101,0,42,109,118,101,114,116,0,42,109,101,100,103,101,0,42,100,118,101,114,116,0,42,109,99, -111,108,0,42,109,115,116,105,99,107,121,0,42,116,101,120,99,111,109,101,115,104,0,42,109,115,101,108,101,99,116,0, -118,100,97,116,97,0,101,100,97,116,97,0,102,100,97,116,97,0,116,111,116,101,100,103,101,0,116,111,116,102,97,99, -101,0,116,111,116,115,101,108,101,99,116,0,97,99,116,95,102,97,99,101,0,99,117,98,101,109,97,112,115,105,122,101, -0,115,109,111,111,116,104,114,101,115,104,0,115,117,98,100,105,118,0,115,117,98,100,105,118,114,0,115,117,98,115,117, -114,102,116,121,112,101,0,42,109,114,0,42,112,118,0,42,116,112,97,103,101,0,117,118,91,52,93,91,50,93,0,99, -111,108,91,52,93,0,116,114,97,110,115,112,0,116,105,108,101,0,117,110,119,114,97,112,0,118,49,0,118,50,0,118, -51,0,118,52,0,101,100,99,111,100,101,0,99,114,101,97,115,101,0,98,119,101,105,103,104,116,0,100,101,102,95,110, -114,0,42,100,119,0,116,111,116,119,101,105,103,104,116,0,99,111,91,51,93,0,110,111,91,51,93,0,112,97,100,91, -51,93,0,117,118,91,50,93,0,99,111,91,50,93,0,105,110,100,101,120,0,102,0,105,0,115,91,50,53,54,93,0, -118,91,52,93,0,109,105,100,0,118,91,50,93,0,42,102,97,99,101,115,0,42,99,111,108,102,97,99,101,115,0,42, -101,100,103,101,115,0,42,101,100,103,101,95,98,111,117,110,100,97,114,121,95,115,116,97,116,101,115,0,42,118,101,114, -116,95,101,100,103,101,95,109,97,112,0,42,118,101,114,116,95,102,97,99,101,95,109,97,112,0,42,109,97,112,95,109, -101,109,0,42,118,101,114,116,115,0,108,101,118,101,108,115,0,108,101,118,101,108,95,99,111,117,110,116,0,99,117,114, -114,101,110,116,0,110,101,119,108,118,108,0,101,100,103,101,108,118,108,0,112,105,110,108,118,108,0,114,101,110,100,101, -114,108,118,108,0,117,115,101,95,99,111,108,0,42,101,100,103,101,95,102,108,97,103,115,0,42,101,100,103,101,95,99, -114,101,97,115,101,115,0,42,118,101,114,116,95,109,97,112,0,42,101,100,103,101,95,109,97,112,0,42,111,108,100,95, -102,97,99,101,115,0,42,111,108,100,95,101,100,103,101,115,0,42,101,114,114,111,114,0,109,111,100,105,102,105,101,114, -0,115,117,98,100,105,118,84,121,112,101,0,114,101,110,100,101,114,76,101,118,101,108,115,0,42,101,109,67,97,99,104, -101,0,42,109,67,97,99,104,101,0,100,101,102,97,120,105,115,0,112,97,100,91,54,93,0,108,101,110,103,116,104,0, -114,97,110,100,111,109,105,122,101,0,115,101,101,100,0,42,111,98,95,97,114,109,0,42,115,116,97,114,116,95,99,97, -112,0,42,101,110,100,95,99,97,112,0,42,99,117,114,118,101,95,111,98,0,42,111,102,102,115,101,116,95,111,98,0, -111,102,102,115,101,116,91,51,93,0,115,99,97,108,101,91,51,93,0,109,101,114,103,101,95,100,105,115,116,0,102,105, -116,95,116,121,112,101,0,111,102,102,115,101,116,95,116,121,112,101,0,99,111,117,110,116,0,97,120,105,115,0,116,111, -108,101,114,97,110,99,101,0,42,109,105,114,114,111,114,95,111,98,0,115,112,108,105,116,95,97,110,103,108,101,0,118, -97,108,117,101,0,114,101,115,0,118,97,108,95,102,108,97,103,115,0,108,105,109,95,102,108,97,103,115,0,101,95,102, -108,97,103,115,0,98,101,118,101,108,95,97,110,103,108,101,0,100,101,102,103,114,112,95,110,97,109,101,91,51,50,93, -0,42,116,101,120,116,117,114,101,0,115,116,114,101,110,103,116,104,0,100,105,114,101,99,116,105,111,110,0,109,105,100, -108,101,118,101,108,0,116,101,120,109,97,112,112,105,110,103,0,42,109,97,112,95,111,98,106,101,99,116,0,117,118,108, -97,121,101,114,95,110,97,109,101,91,51,50,93,0,117,118,108,97,121,101,114,95,116,109,112,0,42,112,114,111,106,101, -99,116,111,114,115,91,49,48,93,0,42,105,109,97,103,101,0,110,117,109,95,112,114,111,106,101,99,116,111,114,115,0, -97,115,112,101,99,116,120,0,97,115,112,101,99,116,121,0,112,101,114,99,101,110,116,0,102,97,99,101,67,111,117,110, -116,0,102,97,99,0,114,101,112,101,97,116,0,42,111,98,106,101,99,116,99,101,110,116,101,114,0,115,116,97,114,116, -120,0,115,116,97,114,116,121,0,104,101,105,103,104,116,0,110,97,114,114,111,119,0,115,112,101,101,100,0,100,97,109, -112,0,102,97,108,108,111,102,102,0,116,105,109,101,111,102,102,115,0,108,105,102,101,116,105,109,101,0,100,101,102,111, -114,109,102,108,97,103,0,109,117,108,116,105,0,42,112,114,101,118,67,111,115,0,112,97,114,101,110,116,105,110,118,91, -52,93,91,52,93,0,99,101,110,116,91,51,93,0,42,105,110,100,101,120,97,114,0,116,111,116,105,110,100,101,120,0, -102,111,114,99,101,0,42,99,108,111,116,104,79,98,106,101,99,116,0,42,115,105,109,95,112,97,114,109,115,0,42,99, -111,108,108,95,112,97,114,109,115,0,42,112,111,105,110,116,95,99,97,99,104,101,0,42,120,0,42,120,110,101,119,0, -42,120,111,108,100,0,42,99,117,114,114,101,110,116,95,120,110,101,119,0,42,99,117,114,114,101,110,116,95,120,0,42, -99,117,114,114,101,110,116,95,118,0,42,109,102,97,99,101,115,0,110,117,109,118,101,114,116,115,0,110,117,109,102,97, -99,101,115,0,97,98,115,111,114,112,116,105,111,110,0,116,105,109,101,0,42,98,118,104,116,114,101,101,0,42,100,109, -0,111,112,101,114,97,116,105,111,110,0,118,101,114,116,101,120,0,116,111,116,105,110,102,108,117,101,110,99,101,0,103, -114,105,100,115,105,122,101,0,110,101,101,100,98,105,110,100,0,42,98,105,110,100,119,101,105,103,104,116,115,0,42,98, -105,110,100,99,111,115,0,116,111,116,99,97,103,101,118,101,114,116,0,42,100,121,110,103,114,105,100,0,42,100,121,110, -105,110,102,108,117,101,110,99,101,115,0,42,100,121,110,118,101,114,116,115,0,42,112,97,100,50,0,100,121,110,103,114, -105,100,115,105,122,101,0,100,121,110,99,101,108,108,109,105,110,91,51,93,0,100,121,110,99,101,108,108,119,105,100,116, -104,0,98,105,110,100,109,97,116,91,52,93,91,52,93,0,42,112,115,121,115,0,116,111,116,100,109,118,101,114,116,0, -116,111,116,100,109,101,100,103,101,0,116,111,116,100,109,102,97,99,101,0,112,115,121,115,0,114,116,91,50,93,0,42, -102,97,99,101,112,97,0,118,103,114,111,117,112,0,112,114,111,116,101,99,116,0,42,102,115,115,0,42,116,97,114,103, -101,116,0,42,97,117,120,84,97,114,103,101,116,0,118,103,114,111,117,112,95,110,97,109,101,91,51,50,93,0,107,101, -101,112,68,105,115,116,0,115,104,114,105,110,107,84,121,112,101,0,115,104,114,105,110,107,79,112,116,115,0,112,114,111, -106,65,120,105,115,0,115,117,98,115,117,114,102,76,101,118,101,108,115,0,42,111,114,105,103,105,110,0,102,97,99,116, -111,114,0,108,105,109,105,116,91,50,93,0,111,114,105,103,105,110,79,112,116,115,0,112,110,116,115,119,0,111,112,110, -116,115,117,0,111,112,110,116,115,118,0,111,112,110,116,115,119,0,116,121,112,101,117,0,116,121,112,101,118,0,116,121, -112,101,119,0,102,117,0,102,118,0,102,119,0,100,117,0,100,118,0,100,119,0,42,100,101,102,0,118,101,99,91,56, -93,91,51,93,0,112,97,114,116,121,112,101,0,112,97,114,49,0,112,97,114,50,0,112,97,114,51,0,112,97,114,115, -117,98,115,116,114,91,51,50,93,0,42,116,114,97,99,107,0,42,112,114,111,120,121,0,42,112,114,111,120,121,95,103, -114,111,117,112,0,42,112,114,111,120,121,95,102,114,111,109,0,42,97,99,116,105,111,110,0,42,112,111,115,101,108,105, -98,0,42,112,111,115,101,0,99,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,115,0,100,101,102,98,97, -115,101,0,109,111,100,105,102,105,101,114,115,0,100,108,111,99,91,51,93,0,111,114,105,103,91,51,93,0,100,115,105, -122,101,91,51,93,0,100,114,111,116,91,51,93,0,111,98,109,97,116,91,52,93,91,52,93,0,99,111,110,115,116,105, -110,118,91,52,93,91,52,93,0,108,97,121,0,99,111,108,98,105,116,115,0,116,114,97,110,115,102,108,97,103,0,105, -112,111,102,108,97,103,0,116,114,97,99,107,102,108,97,103,0,117,112,102,108,97,103,0,110,108,97,102,108,97,103,0, -112,114,111,116,101,99,116,102,108,97,103,0,105,112,111,119,105,110,0,115,99,97,102,108,97,103,0,115,99,97,118,105, -115,102,108,97,103,0,98,111,117,110,100,116,121,112,101,0,100,117,112,111,110,0,100,117,112,111,102,102,0,100,117,112, -115,116,97,0,100,117,112,101,110,100,0,115,102,0,99,116,105,109,101,0,109,97,115,115,0,100,97,109,112,105,110,103, -0,105,110,101,114,116,105,97,0,102,111,114,109,102,97,99,116,111,114,0,114,100,97,109,112,105,110,103,0,115,105,122, -101,102,97,99,0,109,97,114,103,105,110,0,109,97,120,95,118,101,108,0,109,105,110,95,118,101,108,0,109,95,99,111, -110,116,97,99,116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,100,116,0,100,116,120,0, -97,99,116,99,111,108,0,101,109,112,116,121,95,100,114,97,119,116,121,112,101,0,112,97,100,49,91,51,93,0,101,109, -112,116,121,95,100,114,97,119,115,105,122,101,0,100,117,112,102,97,99,101,115,99,97,0,112,114,111,112,0,115,101,110, -115,111,114,115,0,99,111,110,116,114,111,108,108,101,114,115,0,97,99,116,117,97,116,111,114,115,0,98,98,115,105,122, -101,91,51,93,0,97,99,116,100,101,102,0,103,97,109,101,102,108,97,103,0,103,97,109,101,102,108,97,103,50,0,42, -98,115,111,102,116,0,115,111,102,116,102,108,97,103,0,97,110,105,115,111,116,114,111,112,105,99,70,114,105,99,116,105, -111,110,91,51,93,0,99,111,110,115,116,114,97,105,110,116,115,0,110,108,97,115,116,114,105,112,115,0,104,111,111,107, -115,0,112,97,114,116,105,99,108,101,115,121,115,116,101,109,0,42,112,100,0,42,115,111,102,116,0,42,100,117,112,95, -103,114,111,117,112,0,102,108,117,105,100,115,105,109,70,108,97,103,0,114,101,115,116,114,105,99,116,102,108,97,103,0, -115,104,97,112,101,110,114,0,115,104,97,112,101,102,108,97,103,0,114,101,99,97,108,99,111,0,98,111,100,121,95,116, -121,112,101,0,42,102,108,117,105,100,115,105,109,83,101,116,116,105,110,103,115,0,42,100,101,114,105,118,101,100,68,101, -102,111,114,109,0,42,100,101,114,105,118,101,100,70,105,110,97,108,0,108,97,115,116,68,97,116,97,77,97,115,107,0, -115,116,97,116,101,0,105,110,105,116,95,115,116,97,116,101,0,103,112,117,108,97,109,112,0,99,117,114,105,110,100,101, -120,0,97,99,116,105,118,101,0,100,101,102,108,101,99,116,0,102,111,114,99,101,102,105,101,108,100,0,112,100,101,102, -95,100,97,109,112,0,112,100,101,102,95,114,100,97,109,112,0,112,100,101,102,95,112,101,114,109,0,112,100,101,102,95, -102,114,105,99,116,0,112,100,101,102,95,114,102,114,105,99,116,0,102,95,115,116,114,101,110,103,116,104,0,102,95,112, -111,119,101,114,0,102,95,100,105,115,116,0,102,95,100,97,109,112,0,109,97,120,100,105,115,116,0,109,105,110,100,105, -115,116,0,109,97,120,114,97,100,0,109,105,110,114,97,100,0,102,95,112,111,119,101,114,95,114,0,112,100,101,102,95, -115,98,100,97,109,112,0,112,100,101,102,95,115,98,105,102,116,0,112,100,101,102,95,115,98,111,102,116,0,99,108,117, -109,112,95,102,97,99,0,99,108,117,109,112,95,112,111,119,0,107,105,110,107,95,102,114,101,113,0,107,105,110,107,95, -115,104,97,112,101,0,107,105,110,107,95,97,109,112,0,102,114,101,101,95,101,110,100,0,116,101,120,95,110,97,98,108, -97,0,116,101,120,95,109,111,100,101,0,107,105,110,107,0,107,105,110,107,95,97,120,105,115,0,114,116,50,0,42,114, -110,103,0,102,95,110,111,105,115,101,0,115,105,109,102,114,97,109,101,0,115,116,97,114,116,102,114,97,109,101,0,101, -110,100,102,114,97,109,101,0,101,100,105,116,102,114,97,109,101,0,108,105,110,83,116,105,102,102,0,97,110,103,83,116, -105,102,102,0,118,111,108,117,109,101,0,118,105,116,101,114,97,116,105,111,110,115,0,112,105,116,101,114,97,116,105,111, -110,115,0,100,105,116,101,114,97,116,105,111,110,115,0,99,105,116,101,114,97,116,105,111,110,115,0,107,83,82,72,82, -95,67,76,0,107,83,75,72,82,95,67,76,0,107,83,83,72,82,95,67,76,0,107,83,82,95,83,80,76,84,95,67, -76,0,107,83,75,95,83,80,76,84,95,67,76,0,107,83,83,95,83,80,76,84,95,67,76,0,107,86,67,70,0,107, -68,80,0,107,68,71,0,107,76,70,0,107,80,82,0,107,86,67,0,107,68,70,0,107,77,84,0,107,67,72,82,0, -107,75,72,82,0,107,83,72,82,0,107,65,72,82,0,99,111,108,108,105,115,105,111,110,102,108,97,103,115,0,110,117, -109,99,108,117,115,116,101,114,105,116,101,114,97,116,105,111,110,115,0,119,101,108,100,105,110,103,0,42,112,97,114,116, -105,99,108,101,115,0,116,111,116,112,111,105,110,116,0,116,111,116,115,112,114,105,110,103,0,42,98,112,111,105,110,116, -0,42,98,115,112,114,105,110,103,0,109,115,103,95,108,111,99,107,0,109,115,103,95,118,97,108,117,101,0,110,111,100, -101,109,97,115,115,0,110,97,109,101,100,86,71,95,77,97,115,115,91,51,50,93,0,103,114,97,118,0,109,101,100,105, -97,102,114,105,99,116,0,114,107,108,105,109,105,116,0,112,104,121,115,105,99,115,95,115,112,101,101,100,0,103,111,97, -108,115,112,114,105,110,103,0,103,111,97,108,102,114,105,99,116,0,109,105,110,103,111,97,108,0,109,97,120,103,111,97, -108,0,100,101,102,103,111,97,108,0,118,101,114,116,103,114,111,117,112,0,110,97,109,101,100,86,71,95,83,111,102,116, -103,111,97,108,91,51,50,93,0,102,117,122,122,121,110,101,115,115,0,105,110,115,112,114,105,110,103,0,105,110,102,114, -105,99,116,0,110,97,109,101,100,86,71,95,83,112,114,105,110,103,95,75,91,51,50,93,0,101,102,114,97,0,105,110, -116,101,114,118,97,108,0,108,111,99,97,108,0,115,111,108,118,101,114,102,108,97,103,115,0,42,42,107,101,121,115,0, -116,111,116,112,111,105,110,116,107,101,121,0,115,101,99,111,110,100,115,112,114,105,110,103,0,99,111,108,98,97,108,108, -0,98,97,108,108,100,97,109,112,0,98,97,108,108,115,116,105,102,102,0,115,98,99,95,109,111,100,101,0,97,101,114, -111,101,100,103,101,0,109,105,110,108,111,111,112,115,0,109,97,120,108,111,111,112,115,0,99,104,111,107,101,0,115,111, -108,118,101,114,95,73,68,0,112,108,97,115,116,105,99,0,115,112,114,105,110,103,112,114,101,108,111,97,100,0,42,115, -99,114,97,116,99,104,0,115,104,101,97,114,115,116,105,102,102,0,105,110,112,117,115,104,0,42,112,111,105,110,116,99, -97,99,104,101,0,115,104,111,119,95,97,100,118,97,110,99,101,100,111,112,116,105,111,110,115,0,114,101,115,111,108,117, -116,105,111,110,120,121,122,0,112,114,101,118,105,101,119,114,101,115,120,121,122,0,114,101,97,108,115,105,122,101,0,103, -117,105,68,105,115,112,108,97,121,77,111,100,101,0,114,101,110,100,101,114,68,105,115,112,108,97,121,77,111,100,101,0, -118,105,115,99,111,115,105,116,121,86,97,108,117,101,0,118,105,115,99,111,115,105,116,121,77,111,100,101,0,118,105,115, -99,111,115,105,116,121,69,120,112,111,110,101,110,116,0,103,114,97,118,120,0,103,114,97,118,121,0,103,114,97,118,122, -0,97,110,105,109,83,116,97,114,116,0,97,110,105,109,69,110,100,0,103,115,116,97,114,0,109,97,120,82,101,102,105, -110,101,0,105,110,105,86,101,108,120,0,105,110,105,86,101,108,121,0,105,110,105,86,101,108,122,0,42,111,114,103,77, -101,115,104,0,42,109,101,115,104,83,117,114,102,97,99,101,0,42,109,101,115,104,66,66,0,115,117,114,102,100,97,116, -97,80,97,116,104,91,50,52,48,93,0,98,98,83,116,97,114,116,91,51,93,0,98,98,83,105,122,101,91,51,93,0, -116,121,112,101,70,108,97,103,115,0,100,111,109,97,105,110,78,111,118,101,99,103,101,110,0,118,111,108,117,109,101,73, -110,105,116,84,121,112,101,0,112,97,114,116,83,108,105,112,86,97,108,117,101,0,103,101,110,101,114,97,116,101,84,114, -97,99,101,114,115,0,103,101,110,101,114,97,116,101,80,97,114,116,105,99,108,101,115,0,115,117,114,102,97,99,101,83, -109,111,111,116,104,105,110,103,0,115,117,114,102,97,99,101,83,117,98,100,105,118,115,0,112,97,114,116,105,99,108,101, -73,110,102,83,105,122,101,0,112,97,114,116,105,99,108,101,73,110,102,65,108,112,104,97,0,102,97,114,70,105,101,108, -100,83,105,122,101,0,42,109,101,115,104,83,117,114,102,78,111,114,109,97,108,115,0,99,112,115,84,105,109,101,83,116, -97,114,116,0,99,112,115,84,105,109,101,69,110,100,0,99,112,115,81,117,97,108,105,116,121,0,97,116,116,114,97,99, -116,102,111,114,99,101,83,116,114,101,110,103,116,104,0,97,116,116,114,97,99,116,102,111,114,99,101,82,97,100,105,117, -115,0,118,101,108,111,99,105,116,121,102,111,114,99,101,83,116,114,101,110,103,116,104,0,118,101,108,111,99,105,116,121, -102,111,114,99,101,82,97,100,105,117,115,0,108,97,115,116,103,111,111,100,102,114,97,109,101,0,109,105,115,116,121,112, -101,0,104,111,114,114,0,104,111,114,103,0,104,111,114,98,0,104,111,114,107,0,122,101,110,114,0,122,101,110,103,0, -122,101,110,98,0,122,101,110,107,0,97,109,98,107,0,102,97,115,116,99,111,108,0,101,120,112,111,115,117,114,101,0, -101,120,112,0,114,97,110,103,101,0,108,105,110,102,97,99,0,108,111,103,102,97,99,0,103,114,97,118,105,116,121,0, -97,99,116,105,118,105,116,121,66,111,120,82,97,100,105,117,115,0,115,107,121,116,121,112,101,0,111,99,99,108,117,115, -105,111,110,82,101,115,0,112,104,121,115,105,99,115,69,110,103,105,110,101,0,116,105,99,114,97,116,101,0,109,97,120, -108,111,103,105,99,115,116,101,112,0,112,104,121,115,117,98,115,116,101,112,0,109,97,120,112,104,121,115,116,101,112,0, -109,105,115,105,0,109,105,115,116,115,116,97,0,109,105,115,116,100,105,115,116,0,109,105,115,116,104,105,0,115,116,97, -114,114,0,115,116,97,114,103,0,115,116,97,114,98,0,115,116,97,114,107,0,115,116,97,114,115,105,122,101,0,115,116, -97,114,109,105,110,100,105,115,116,0,115,116,97,114,100,105,115,116,0,115,116,97,114,99,111,108,110,111,105,115,101,0, -100,111,102,115,116,97,0,100,111,102,101,110,100,0,100,111,102,109,105,110,0,100,111,102,109,97,120,0,97,111,100,105, -115,116,0,97,111,100,105,115,116,102,97,99,0,97,111,101,110,101,114,103,121,0,97,111,98,105,97,115,0,97,111,109, -111,100,101,0,97,111,115,97,109,112,0,97,111,109,105,120,0,97,111,99,111,108,111,114,0,97,111,95,97,100,97,112, -116,95,116,104,114,101,115,104,0,97,111,95,97,100,97,112,116,95,115,112,101,101,100,95,102,97,99,0,97,111,95,97, -112,112,114,111,120,95,101,114,114,111,114,0,97,111,95,97,112,112,114,111,120,95,99,111,114,114,101,99,116,105,111,110, -0,97,111,95,115,97,109,112,95,109,101,116,104,111,100,0,97,111,95,103,97,116,104,101,114,95,109,101,116,104,111,100, -0,97,111,95,97,112,112,114,111,120,95,112,97,115,115,101,115,0,42,97,111,115,112,104,101,114,101,0,42,97,111,116, -97,98,108,101,115,0,104,101,109,105,114,101,115,0,109,97,120,105,116,101,114,0,100,114,97,119,116,121,112,101,0,115, -117,98,115,104,111,111,116,112,0,115,117,98,115,104,111,111,116,101,0,110,111,100,101,108,105,109,0,109,97,120,115,117, -98,108,97,109,112,0,112,97,109,97,0,112,97,109,105,0,101,108,109,97,0,101,108,109,105,0,109,97,120,110,111,100, -101,0,99,111,110,118,101,114,103,101,110,99,101,0,114,97,100,102,97,99,0,103,97,109,109,97,0,115,101,108,99,111, -108,0,115,120,0,115,121,0,42,108,112,70,111,114,109,97,116,0,42,108,112,80,97,114,109,115,0,99,98,70,111,114, -109,97,116,0,99,98,80,97,114,109,115,0,102,99,99,84,121,112,101,0,102,99,99,72,97,110,100,108,101,114,0,100, -119,75,101,121,70,114,97,109,101,69,118,101,114,121,0,100,119,81,117,97,108,105,116,121,0,100,119,66,121,116,101,115, -80,101,114,83,101,99,111,110,100,0,100,119,70,108,97,103,115,0,100,119,73,110,116,101,114,108,101,97,118,101,69,118, -101,114,121,0,97,118,105,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,42,99,100,80,97,114,109,115,0,42, -112,97,100,0,99,100,83,105,122,101,0,113,116,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,99,111,100,101, -99,0,97,117,100,105,111,95,99,111,100,101,99,0,118,105,100,101,111,95,98,105,116,114,97,116,101,0,97,117,100,105, -111,95,98,105,116,114,97,116,101,0,103,111,112,95,115,105,122,101,0,114,99,95,109,105,110,95,114,97,116,101,0,114, -99,95,109,97,120,95,114,97,116,101,0,114,99,95,98,117,102,102,101,114,95,115,105,122,101,0,109,117,120,95,112,97, -99,107,101,116,95,115,105,122,101,0,109,117,120,95,114,97,116,101,0,109,105,120,114,97,116,101,0,109,97,105,110,0, -42,109,97,116,95,111,118,101,114,114,105,100,101,0,42,108,105,103,104,116,95,111,118,101,114,114,105,100,101,0,108,97, -121,95,122,109,97,115,107,0,108,97,121,102,108,97,103,0,112,97,115,115,102,108,97,103,0,112,97,115,115,95,120,111, -114,0,42,97,118,105,99,111,100,101,99,100,97,116,97,0,42,113,116,99,111,100,101,99,100,97,116,97,0,102,102,99, -111,100,101,99,100,97,116,97,0,99,102,114,97,0,112,115,102,114,97,0,112,101,102,114,97,0,105,109,97,103,101,115, -0,102,114,97,109,97,112,116,111,0,116,104,114,101,97,100,115,0,102,114,97,109,101,108,101,110,0,98,108,117,114,102, -97,99,0,101,100,103,101,82,0,101,100,103,101,71,0,101,100,103,101,66,0,102,117,108,108,115,99,114,101,101,110,0, -120,112,108,97,121,0,121,112,108,97,121,0,102,114,101,113,112,108,97,121,0,97,116,116,114,105,98,0,114,116,49,0, -115,116,101,114,101,111,109,111,100,101,0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116,0,109,97,120,105, -109,115,105,122,101,0,120,115,99,104,0,121,115,99,104,0,120,112,97,114,116,115,0,121,112,97,114,116,115,0,119,105, -110,112,111,115,0,112,108,97,110,101,115,0,105,109,116,121,112,101,0,115,117,98,105,109,116,121,112,101,0,113,117,97, -108,105,116,121,0,114,112,97,100,0,114,112,97,100,49,0,114,112,97,100,50,0,115,99,101,109,111,100,101,0,114,101, -110,100,101,114,101,114,0,111,99,114,101,115,0,97,108,112,104,97,109,111,100,101,0,111,115,97,0,102,114,115,95,115, -101,99,0,101,100,103,101,105,110,116,0,115,97,102,101,116,121,0,98,111,114,100,101,114,0,100,105,115,112,114,101,99, -116,0,108,97,121,101,114,115,0,97,99,116,108,97,121,0,120,97,115,112,0,121,97,115,112,0,102,114,115,95,115,101, -99,95,98,97,115,101,0,103,97,117,115,115,0,112,111,115,116,109,117,108,0,112,111,115,116,103,97,109,109,97,0,112, -111,115,116,104,117,101,0,112,111,115,116,115,97,116,0,100,105,116,104,101,114,95,105,110,116,101,110,115,105,116,121,0, -98,97,107,101,95,111,115,97,0,98,97,107,101,95,102,105,108,116,101,114,0,98,97,107,101,95,109,111,100,101,0,98, -97,107,101,95,102,108,97,103,0,98,97,107,101,95,110,111,114,109,97,108,95,115,112,97,99,101,0,98,97,107,101,95, -113,117,97,100,95,115,112,108,105,116,0,98,97,107,101,95,109,97,120,100,105,115,116,0,98,97,107,101,95,98,105,97, -115,100,105,115,116,0,98,97,107,101,95,112,97,100,0,71,73,113,117,97,108,105,116,121,0,71,73,99,97,99,104,101, -0,71,73,109,101,116,104,111,100,0,71,73,112,104,111,116,111,110,115,0,71,73,100,105,114,101,99,116,0,89,70,95, -65,65,0,89,70,101,120,112,111,114,116,120,109,108,0,89,70,95,110,111,98,117,109,112,0,89,70,95,99,108,97,109, -112,114,103,98,0,121,102,112,97,100,49,0,71,73,100,101,112,116,104,0,71,73,99,97,117,115,100,101,112,116,104,0, -71,73,112,105,120,101,108,115,112,101,114,115,97,109,112,108,101,0,71,73,112,104,111,116,111,110,99,111,117,110,116,0, -71,73,109,105,120,112,104,111,116,111,110,115,0,71,73,112,104,111,116,111,110,114,97,100,105,117,115,0,89,70,95,114, -97,121,100,101,112,116,104,0,89,70,95,65,65,112,97,115,115,101,115,0,89,70,95,65,65,115,97,109,112,108,101,115, -0,121,102,112,97,100,50,0,71,73,115,104,97,100,111,119,113,117,97,108,105,116,121,0,71,73,114,101,102,105,110,101, -109,101,110,116,0,71,73,112,111,119,101,114,0,71,73,105,110,100,105,114,112,111,119,101,114,0,89,70,95,103,97,109, -109,97,0,89,70,95,101,120,112,111,115,117,114,101,0,89,70,95,114,97,121,98,105,97,115,0,89,70,95,65,65,112, -105,120,101,108,115,105,122,101,0,89,70,95,65,65,116,104,114,101,115,104,111,108,100,0,98,97,99,107,98,117,102,91, -49,54,48,93,0,112,105,99,91,49,54,48,93,0,115,116,97,109,112,0,115,116,97,109,112,95,102,111,110,116,95,105, -100,0,115,116,97,109,112,95,117,100,97,116,97,91,49,54,48,93,0,102,103,95,115,116,97,109,112,91,52,93,0,98, -103,95,115,116,97,109,112,91,52,93,0,115,105,109,112,108,105,102,121,95,115,117,98,115,117,114,102,0,115,105,109,112, -108,105,102,121,95,115,104,97,100,111,119,115,97,109,112,108,101,115,0,115,105,109,112,108,105,102,121,95,112,97,114,116, -105,99,108,101,115,0,115,105,109,112,108,105,102,121,95,97,111,115,115,115,0,99,105,110,101,111,110,119,104,105,116,101, -0,99,105,110,101,111,110,98,108,97,99,107,0,99,105,110,101,111,110,103,97,109,109,97,0,106,112,50,95,112,114,101, -115,101,116,0,106,112,50,95,100,101,112,116,104,0,114,112,97,100,51,0,100,111,109,101,114,101,115,0,100,111,109,101, -109,111,100,101,0,100,111,109,101,97,110,103,108,101,0,100,111,109,101,116,105,108,116,0,100,111,109,101,114,101,115,98, -117,102,0,42,100,111,109,101,116,101,120,116,0,112,97,114,116,105,99,108,101,95,112,101,114,99,0,115,117,98,115,117, -114,102,95,109,97,120,0,115,104,97,100,98,117,102,115,97,109,112,108,101,95,109,97,120,0,97,111,95,101,114,114,111, -114,0,99,111,108,91,51,93,0,102,114,97,109,101,0,110,97,109,101,91,54,52,93,0,42,98,114,117,115,104,0,116, -111,111,108,0,115,101,97,109,95,98,108,101,101,100,0,110,111,114,109,97,108,95,97,110,103,108,101,0,115,116,101,112, -0,105,110,118,101,114,116,0,116,111,116,114,101,107,101,121,0,116,111,116,97,100,100,107,101,121,0,98,114,117,115,104, -116,121,112,101,0,98,114,117,115,104,91,55,93,0,101,109,105,116,116,101,114,100,105,115,116,0,100,114,97,119,95,116, -105,109,101,100,0,110,97,109,101,91,51,54,93,0,109,97,116,91,51,93,91,51,93,0,99,111,114,110,101,114,116,121, -112,101,0,101,100,105,116,98,117,116,102,108,97,103,0,106,111,105,110,116,114,105,108,105,109,105,116,0,100,101,103,114, -0,116,117,114,110,0,101,120,116,114,95,111,102,102,115,0,100,111,117,98,108,105,109,105,116,0,115,101,103,109,101,110, -116,115,0,114,105,110,103,115,0,118,101,114,116,105,99,101,115,0,117,110,119,114,97,112,112,101,114,0,117,118,99,97, -108,99,95,114,97,100,105,117,115,0,117,118,99,97,108,99,95,99,117,98,101,115,105,122,101,0,117,118,99,97,108,99, -95,109,97,114,103,105,110,0,117,118,99,97,108,99,95,109,97,112,100,105,114,0,117,118,99,97,108,99,95,109,97,112, -97,108,105,103,110,0,117,118,99,97,108,99,95,102,108,97,103,0,97,117,116,111,105,107,95,99,104,97,105,110,108,101, -110,0,105,109,97,112,97,105,110,116,0,112,97,114,116,105,99,108,101,0,115,101,108,101,99,116,95,116,104,114,101,115, -104,0,99,108,101,97,110,95,116,104,114,101,115,104,0,114,101,116,111,112,111,95,109,111,100,101,0,114,101,116,111,112, -111,95,112,97,105,110,116,95,116,111,111,108,0,108,105,110,101,95,100,105,118,0,101,108,108,105,112,115,101,95,100,105, -118,0,114,101,116,111,112,111,95,104,111,116,115,112,111,116,0,109,117,108,116,105,114,101,115,95,115,117,98,100,105,118, -95,116,121,112,101,0,115,107,103,101,110,95,114,101,115,111,108,117,116,105,111,110,0,115,107,103,101,110,95,116,104,114, -101,115,104,111,108,100,95,105,110,116,101,114,110,97,108,0,115,107,103,101,110,95,116,104,114,101,115,104,111,108,100,95, -101,120,116,101,114,110,97,108,0,115,107,103,101,110,95,108,101,110,103,116,104,95,114,97,116,105,111,0,115,107,103,101, -110,95,108,101,110,103,116,104,95,108,105,109,105,116,0,115,107,103,101,110,95,97,110,103,108,101,95,108,105,109,105,116, -0,115,107,103,101,110,95,99,111,114,114,101,108,97,116,105,111,110,95,108,105,109,105,116,0,115,107,103,101,110,95,115, -121,109,109,101,116,114,121,95,108,105,109,105,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,97,110,103, -108,101,95,119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,108,101,110,103,116,104,95, -119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,100,105,115,116,97,110,99,101,95,119, -101,105,103,104,116,0,115,107,103,101,110,95,111,112,116,105,111,110,115,0,115,107,103,101,110,95,112,111,115,116,112,114, -111,0,115,107,103,101,110,95,112,111,115,116,112,114,111,95,112,97,115,115,101,115,0,115,107,103,101,110,95,115,117,98, -100,105,118,105,115,105,111,110,115,91,51,93,0,115,107,103,101,110,95,109,117,108,116,105,95,108,101,118,101,108,0,42, -115,107,103,101,110,95,116,101,109,112,108,97,116,101,0,98,111,110,101,95,115,107,101,116,99,104,105,110,103,0,98,111, -110,101,95,115,107,101,116,99,104,105,110,103,95,99,111,110,118,101,114,116,0,115,107,103,101,110,95,115,117,98,100,105, -118,105,115,105,111,110,95,110,117,109,98,101,114,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,111,112,116, -105,111,110,115,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,114,111,108,108,0,115,107,103,101,110,95,115, -105,100,101,95,115,116,114,105,110,103,91,56,93,0,115,107,103,101,110,95,110,117,109,95,115,116,114,105,110,103,91,56, -93,0,101,100,103,101,95,109,111,100,101,0,112,97,100,51,91,50,93,0,100,105,114,0,118,105,101,119,0,42,115,101, -115,115,105,111,110,0,42,99,117,109,97,112,0,100,114,97,119,98,114,117,115,104,0,115,109,111,111,116,104,98,114,117, -115,104,0,112,105,110,99,104,98,114,117,115,104,0,105,110,102,108,97,116,101,98,114,117,115,104,0,103,114,97,98,98, -114,117,115,104,0,108,97,121,101,114,98,114,117,115,104,0,102,108,97,116,116,101,110,98,114,117,115,104,0,112,105,118, -111,116,91,51,93,0,98,114,117,115,104,95,116,121,112,101,0,116,101,120,110,114,0,116,101,120,114,101,112,116,0,116, -101,120,102,97,100,101,0,116,101,120,115,101,112,0,97,118,101,114,97,103,105,110,103,0,116,97,98,108,101,116,95,115, -105,122,101,0,116,97,98,108,101,116,95,115,116,114,101,110,103,116,104,0,115,121,109,109,0,114,97,107,101,0,97,120, -105,115,108,111,99,107,0,42,99,97,109,101,114,97,0,42,119,111,114,108,100,0,42,115,101,116,0,98,97,115,101,0, -42,98,97,115,97,99,116,0,99,117,114,115,111,114,91,51,93,0,116,119,99,101,110,116,91,51,93,0,116,119,109,105, -110,91,51,93,0,116,119,109,97,120,91,51,93,0,101,100,105,116,98,117,116,115,105,122,101,0,115,101,108,101,99,116, -109,111,100,101,0,112,114,111,112,111,114,116,105,111,110,97,108,0,112,114,111,112,95,109,111,100,101,0,97,117,116,111, -109,101,114,103,101,0,112,97,100,53,0,112,97,100,54,0,97,117,116,111,107,101,121,95,109,111,100,101,0,42,101,100, -0,42,114,97,100,105,111,0,102,114,97,109,105,110,103,0,42,116,111,111,108,115,101,116,116,105,110,103,115,0,97,117, -100,105,111,0,116,114,97,110,115,102,111,114,109,95,115,112,97,99,101,115,0,106,117,109,112,102,114,97,109,101,0,115, -110,97,112,95,109,111,100,101,0,115,110,97,112,95,102,108,97,103,0,115,110,97,112,95,116,97,114,103,101,116,0,42, -116,104,101,68,97,103,0,100,97,103,105,115,118,97,108,105,100,0,100,97,103,102,108,97,103,115,0,115,99,117,108,112, -116,100,97,116,97,0,102,114,97,109,101,95,115,116,101,112,0,122,111,111,109,0,98,108,101,110,100,0,120,105,109,0, -121,105,109,0,115,112,97,99,101,116,121,112,101,0,98,108,111,99,107,115,99,97,108,101,0,42,97,114,101,97,0,98, -108,111,99,107,104,97,110,100,108,101,114,91,56,93,0,118,105,101,119,109,97,116,91,52,93,91,52,93,0,118,105,101, -119,105,110,118,91,52,93,91,52,93,0,112,101,114,115,109,97,116,91,52,93,91,52,93,0,112,101,114,115,105,110,118, -91,52,93,91,52,93,0,119,105,110,109,97,116,49,91,52,93,91,52,93,0,118,105,101,119,109,97,116,49,91,52,93, -91,52,93,0,118,105,101,119,113,117,97,116,91,52,93,0,122,102,97,99,0,108,97,121,95,117,115,101,100,0,112,101, -114,115,112,0,42,111,98,95,99,101,110,116,114,101,0,42,98,103,112,105,99,0,42,108,111,99,97,108,118,100,0,42, -114,105,0,42,114,101,116,111,112,111,95,118,105,101,119,95,100,97,116,97,0,42,100,101,112,116,104,115,0,111,98,95, -99,101,110,116,114,101,95,98,111,110,101,91,51,50,93,0,108,111,99,97,108,118,105,101,119,0,108,97,121,97,99,116, -0,115,99,101,110,101,108,111,99,107,0,97,114,111,117,110,100,0,99,97,109,122,111,111,109,0,112,105,118,111,116,95, -108,97,115,116,0,103,114,105,100,0,103,114,105,100,118,105,101,119,0,112,105,120,115,105,122,101,0,110,101,97,114,0, -102,97,114,0,99,97,109,100,120,0,99,97,109,100,121,0,103,114,105,100,108,105,110,101,115,0,118,105,101,119,98,117, -116,0,103,114,105,100,102,108,97,103,0,109,111,100,101,115,101,108,101,99,116,0,116,119,116,121,112,101,0,116,119,109, -111,100,101,0,116,119,102,108,97,103,0,116,119,100,114,97,119,102,108,97,103,0,116,119,109,97,116,91,52,93,91,52, -93,0,99,108,105,112,91,52,93,91,52,93,0,42,99,108,105,112,98,98,0,97,102,116,101,114,100,114,97,119,0,122, -98,117,102,0,120,114,97,121,0,102,108,97,103,50,0,103,114,105,100,115,117,98,100,105,118,0,107,101,121,102,108,97, -103,115,0,110,100,111,102,109,111,100,101,0,110,100,111,102,102,105,108,116,101,114,0,42,112,114,111,112,101,114,116,105, -101,115,95,115,116,111,114,97,103,101,0,42,103,112,100,0,108,118,105,101,119,113,117,97,116,91,52,93,0,108,112,101, -114,115,112,0,108,118,105,101,119,0,118,101,114,116,0,104,111,114,0,109,97,115,107,0,109,105,110,91,50,93,0,109, -97,120,91,50,93,0,109,105,110,122,111,111,109,0,109,97,120,122,111,111,109,0,115,99,114,111,108,108,0,107,101,101, -112,116,111,116,0,107,101,101,112,97,115,112,101,99,116,0,107,101,101,112,122,111,111,109,0,111,108,100,119,105,110,120, -0,111,108,100,119,105,110,121,0,99,117,114,115,111,114,91,50,93,0,114,111,119,98,117,116,0,118,50,100,0,42,101, -100,105,116,105,112,111,0,105,112,111,107,101,121,0,97,99,116,110,97,109,101,91,51,50,93,0,99,111,110,115,116,110, -97,109,101,91,51,50,93,0,98,111,110,101,110,97,109,101,91,51,50,93,0,116,111,116,105,112,111,0,112,105,110,0, -98,117,116,111,102,115,0,99,104,97,110,110,101,108,0,108,111,99,107,0,109,101,100,105,97,110,91,51,93,0,99,117, -114,115,101,110,115,0,99,117,114,97,99,116,0,97,108,105,103,110,0,116,97,98,111,0,109,97,105,110,98,0,109,97, -105,110,98,111,0,42,108,111,99,107,112,111,105,110,0,116,101,120,102,114,111,109,0,115,104,111,119,103,114,111,117,112, -0,109,111,100,101,108,116,121,112,101,0,115,99,114,105,112,116,98,108,111,99,107,0,114,101,95,97,108,105,103,110,0, -111,108,100,107,101,121,112,114,101,115,115,0,116,97,98,91,55,93,0,114,101,110,100,101,114,95,115,105,122,101,0,99, -104,97,110,115,104,111,119,110,0,122,101,98,114,97,0,42,102,105,108,101,108,105,115,116,0,116,111,116,102,105,108,101, -0,116,105,116,108,101,91,50,52,93,0,100,105,114,91,50,52,48,93,0,102,105,108,101,91,56,48,93,0,111,102,115, -0,115,111,114,116,0,109,97,120,110,97,109,101,108,101,110,0,99,111,108,108,117,109,115,0,102,95,102,112,0,102,112, -95,115,116,114,91,56,93,0,42,108,105,98,102,105,108,101,100,97,116,97,0,114,101,116,118,97,108,0,109,101,110,117, -0,97,99,116,0,40,42,114,101,116,117,114,110,102,117,110,99,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110, -99,95,101,118,101,110,116,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110,99,95,97,114,103,115,41,40,41,0, -42,97,114,103,49,0,42,97,114,103,50,0,42,109,101,110,117,112,0,42,112,117,112,109,101,110,117,0,111,111,112,115, -0,118,105,115,105,102,108,97,103,0,116,114,101,101,0,42,116,114,101,101,115,116,111,114,101,0,115,101,97,114,99,104, -95,115,116,114,105,110,103,91,51,50,93,0,115,101,97,114,99,104,95,116,115,101,0,115,101,97,114,99,104,95,102,108, -97,103,115,0,100,111,95,0,111,117,116,108,105,110,101,118,105,115,0,115,116,111,114,101,102,108,97,103,0,100,101,112, -115,95,102,108,97,103,115,0,105,109,97,110,114,0,99,117,114,116,105,108,101,0,105,109,116,121,112,101,110,114,0,100, -116,95,117,118,0,115,116,105,99,107,121,0,100,116,95,117,118,115,116,114,101,116,99,104,0,112,97,100,91,53,93,0, -99,101,110,116,120,0,99,101,110,116,121,0,97,117,116,111,115,110,97,112,0,42,116,101,120,116,0,116,111,112,0,118, -105,101,119,108,105,110,101,115,0,102,111,110,116,95,105,100,0,108,104,101,105,103,104,116,0,108,101,102,116,0,115,104, -111,119,108,105,110,101,110,114,115,0,116,97,98,110,117,109,98,101,114,0,99,117,114,114,116,97,98,95,115,101,116,0, -115,104,111,119,115,121,110,116,97,120,0,111,118,101,114,119,114,105,116,101,0,112,105,120,95,112,101,114,95,108,105,110, -101,0,116,120,116,115,99,114,111,108,108,0,116,120,116,98,97,114,0,119,111,114,100,119,114,97,112,0,100,111,112,108, -117,103,105,110,115,0,42,112,121,95,100,114,97,119,0,42,112,121,95,101,118,101,110,116,0,42,112,121,95,98,117,116, -116,111,110,0,42,112,121,95,98,114,111,119,115,101,114,99,97,108,108,98,97,99,107,0,42,112,121,95,103,108,111,98, -97,108,100,105,99,116,0,108,97,115,116,115,112,97,99,101,0,115,99,114,105,112,116,110,97,109,101,91,50,53,54,93, -0,115,99,114,105,112,116,97,114,103,91,50,53,54,93,0,42,115,99,114,105,112,116,0,42,98,117,116,95,114,101,102, -115,0,114,101,100,114,97,119,115,0,42,105,100,0,97,115,112,101,99,116,0,42,99,117,114,102,111,110,116,0,42,101, -100,105,116,116,114,101,101,0,116,114,101,101,116,121,112,101,0,42,102,105,108,101,115,0,97,99,116,105,118,101,95,102, -105,108,101,0,110,117,109,116,105,108,101,115,120,0,110,117,109,116,105,108,101,115,121,0,115,101,108,115,116,97,116,101, -0,118,105,101,119,114,101,99,116,0,98,111,111,107,109,97,114,107,114,101,99,116,0,115,99,114,111,108,108,112,111,115, -0,115,99,114,111,108,108,104,101,105,103,104,116,0,115,99,114,111,108,108,97,114,101,97,0,97,99,116,105,118,101,95, -98,111,111,107,109,97,114,107,0,112,114,118,95,119,0,112,114,118,95,104,0,42,105,109,103,0,111,117,116,108,105,110, -101,91,52,93,0,110,101,117,116,114,97,108,91,52,93,0,97,99,116,105,111,110,91,52,93,0,115,101,116,116,105,110, -103,91,52,93,0,115,101,116,116,105,110,103,49,91,52,93,0,115,101,116,116,105,110,103,50,91,52,93,0,110,117,109, -91,52,93,0,116,101,120,116,102,105,101,108,100,91,52,93,0,116,101,120,116,102,105,101,108,100,95,104,105,91,52,93, -0,112,111,112,117,112,91,52,93,0,116,101,120,116,91,52,93,0,116,101,120,116,95,104,105,91,52,93,0,109,101,110, -117,95,98,97,99,107,91,52,93,0,109,101,110,117,95,105,116,101,109,91,52,93,0,109,101,110,117,95,104,105,108,105, -116,101,91,52,93,0,109,101,110,117,95,116,101,120,116,91,52,93,0,109,101,110,117,95,116,101,120,116,95,104,105,91, -52,93,0,98,117,116,95,100,114,97,119,116,121,112,101,0,105,99,111,110,102,105,108,101,91,56,48,93,0,98,97,99, -107,91,52,93,0,104,101,97,100,101,114,91,52,93,0,112,97,110,101,108,91,52,93,0,115,104,97,100,101,49,91,52, -93,0,115,104,97,100,101,50,91,52,93,0,104,105,108,105,116,101,91,52,93,0,103,114,105,100,91,52,93,0,119,105, -114,101,91,52,93,0,115,101,108,101,99,116,91,52,93,0,108,97,109,112,91,52,93,0,97,99,116,105,118,101,91,52, -93,0,103,114,111,117,112,91,52,93,0,103,114,111,117,112,95,97,99,116,105,118,101,91,52,93,0,116,114,97,110,115, -102,111,114,109,91,52,93,0,118,101,114,116,101,120,91,52,93,0,118,101,114,116,101,120,95,115,101,108,101,99,116,91, -52,93,0,101,100,103,101,91,52,93,0,101,100,103,101,95,115,101,108,101,99,116,91,52,93,0,101,100,103,101,95,115, -101,97,109,91,52,93,0,101,100,103,101,95,115,104,97,114,112,91,52,93,0,101,100,103,101,95,102,97,99,101,115,101, -108,91,52,93,0,102,97,99,101,91,52,93,0,102,97,99,101,95,115,101,108,101,99,116,91,52,93,0,102,97,99,101, -95,100,111,116,91,52,93,0,110,111,114,109,97,108,91,52,93,0,98,111,110,101,95,115,111,108,105,100,91,52,93,0, -98,111,110,101,95,112,111,115,101,91,52,93,0,115,116,114,105,112,91,52,93,0,115,116,114,105,112,95,115,101,108,101, -99,116,91,52,93,0,99,102,114,97,109,101,91,52,93,0,118,101,114,116,101,120,95,115,105,122,101,0,102,97,99,101, -100,111,116,95,115,105,122,101,0,98,112,97,100,91,50,93,0,115,121,110,116,97,120,108,91,52,93,0,115,121,110,116, -97,120,110,91,52,93,0,115,121,110,116,97,120,98,91,52,93,0,115,121,110,116,97,120,118,91,52,93,0,115,121,110, -116,97,120,99,91,52,93,0,109,111,118,105,101,91,52,93,0,105,109,97,103,101,91,52,93,0,115,99,101,110,101,91, -52,93,0,97,117,100,105,111,91,52,93,0,101,102,102,101,99,116,91,52,93,0,112,108,117,103,105,110,91,52,93,0, -116,114,97,110,115,105,116,105,111,110,91,52,93,0,109,101,116,97,91,52,93,0,101,100,105,116,109,101,115,104,95,97, -99,116,105,118,101,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,91,52,93,0,104,97,110,100,108,101, -95,118,101,114,116,101,120,95,115,101,108,101,99,116,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,95, -115,105,122,101,0,104,112,97,100,91,55,93,0,115,111,108,105,100,91,52,93,0,116,117,105,0,116,98,117,116,115,0, -116,118,51,100,0,116,102,105,108,101,0,116,105,112,111,0,116,105,110,102,111,0,116,115,110,100,0,116,97,99,116,0, -116,110,108,97,0,116,115,101,113,0,116,105,109,97,0,116,105,109,97,115,101,108,0,116,101,120,116,0,116,111,111,112, -115,0,116,116,105,109,101,0,116,110,111,100,101,0,116,97,114,109,91,50,48,93,0,98,112,97,100,91,52,93,0,98, -112,97,100,49,91,52,93,0,115,112,101,99,91,52,93,0,100,117,112,102,108,97,103,0,115,97,118,101,116,105,109,101, -0,116,101,109,112,100,105,114,91,49,54,48,93,0,102,111,110,116,100,105,114,91,49,54,48,93,0,114,101,110,100,101, -114,100,105,114,91,49,54,48,93,0,116,101,120,116,117,100,105,114,91,49,54,48,93,0,112,108,117,103,116,101,120,100, -105,114,91,49,54,48,93,0,112,108,117,103,115,101,113,100,105,114,91,49,54,48,93,0,112,121,116,104,111,110,100,105, -114,91,49,54,48,93,0,115,111,117,110,100,100,105,114,91,49,54,48,93,0,121,102,101,120,112,111,114,116,100,105,114, -91,49,54,48,93,0,118,101,114,115,105,111,110,115,0,118,114,109,108,102,108,97,103,0,103,97,109,101,102,108,97,103, -115,0,119,104,101,101,108,108,105,110,101,115,99,114,111,108,108,0,117,105,102,108,97,103,0,108,97,110,103,117,97,103, -101,0,117,115,101,114,112,114,101,102,0,118,105,101,119,122,111,111,109,0,99,111,110,115,111,108,101,95,98,117,102,102, -101,114,0,99,111,110,115,111,108,101,95,111,117,116,0,109,105,120,98,117,102,115,105,122,101,0,102,111,110,116,115,105, -122,101,0,101,110,99,111,100,105,110,103,0,116,114,97,110,115,111,112,116,115,0,109,101,110,117,116,104,114,101,115,104, -111,108,100,49,0,109,101,110,117,116,104,114,101,115,104,111,108,100,50,0,102,111,110,116,110,97,109,101,91,50,53,54, -93,0,116,104,101,109,101,115,0,117,110,100,111,115,116,101,112,115,0,117,110,100,111,109,101,109,111,114,121,0,103,112, -95,109,97,110,104,97,116,116,101,110,100,105,115,116,0,103,112,95,101,117,99,108,105,100,101,97,110,100,105,115,116,0, -103,112,95,101,114,97,115,101,114,0,103,112,95,115,101,116,116,105,110,103,115,0,116,98,95,108,101,102,116,109,111,117, -115,101,0,116,98,95,114,105,103,104,116,109,111,117,115,101,0,108,105,103,104,116,91,51,93,0,116,119,95,104,111,116, -115,112,111,116,0,116,119,95,102,108,97,103,0,116,119,95,104,97,110,100,108,101,115,105,122,101,0,116,119,95,115,105, -122,101,0,116,101,120,116,105,109,101,111,117,116,0,116,101,120,99,111,108,108,101,99,116,114,97,116,101,0,109,101,109, -99,97,99,104,101,108,105,109,105,116,0,112,114,101,102,101,116,99,104,102,114,97,109,101,115,0,102,114,97,109,101,115, -101,114,118,101,114,112,111,114,116,0,112,97,100,95,114,111,116,95,97,110,103,108,101,0,111,98,99,101,110,116,101,114, -95,100,105,97,0,114,118,105,115,105,122,101,0,114,118,105,98,114,105,103,104,116,0,114,101,99,101,110,116,95,102,105, -108,101,115,0,115,109,111,111,116,104,95,118,105,101,119,116,120,0,103,108,114,101,115,108,105,109,105,116,0,110,100,111, -102,95,112,97,110,0,110,100,111,102,95,114,111,116,97,116,101,0,99,117,114,115,115,105,122,101,0,112,97,100,91,56, -93,0,118,101,114,115,101,109,97,115,116,101,114,91,49,54,48,93,0,118,101,114,115,101,117,115,101,114,91,49,54,48, -93,0,103,108,97,108,112,104,97,99,108,105,112,0,97,117,116,111,107,101,121,95,102,108,97,103,0,99,111,98,97,95, -119,101,105,103,104,116,0,118,101,114,116,98,97,115,101,0,101,100,103,101,98,97,115,101,0,97,114,101,97,98,97,115, -101,0,42,115,99,101,110,101,0,101,110,100,120,0,101,110,100,121,0,115,105,122,101,120,0,115,105,122,101,121,0,115, -99,101,110,101,110,114,0,115,99,114,101,101,110,110,114,0,102,117,108,108,0,109,97,105,110,119,105,110,0,119,105,110, -97,107,116,0,104,97,110,100,108,101,114,91,56,93,0,42,110,101,119,118,0,118,101,99,0,42,118,49,0,42,118,50, -0,112,97,110,101,108,110,97,109,101,91,54,52,93,0,116,97,98,110,97,109,101,91,54,52,93,0,100,114,97,119,110, -97,109,101,91,54,52,93,0,111,102,115,120,0,111,102,115,121,0,99,111,110,116,114,111,108,0,115,110,97,112,0,111, -108,100,95,111,102,115,120,0,111,108,100,95,111,102,115,121,0,115,111,114,116,99,111,117,110,116,101,114,0,42,112,97, -110,101,108,116,97,98,0,42,118,51,0,42,118,52,0,42,102,117,108,108,0,119,105,110,109,97,116,91,52,93,91,52, -93,0,104,101,97,100,114,99,116,0,119,105,110,114,99,116,0,104,101,97,100,119,105,110,0,119,105,110,0,104,101,97, -100,101,114,116,121,112,101,0,98,117,116,115,112,97,99,101,116,121,112,101,0,119,105,110,120,0,119,105,110,121,0,104, -101,97,100,95,115,119,97,112,0,104,101,97,100,95,101,113,117,97,108,0,119,105,110,95,115,119,97,112,0,119,105,110, -95,101,113,117,97,108,0,104,101,97,100,98,117,116,108,101,110,0,104,101,97,100,98,117,116,111,102,115,0,99,117,114, -115,111,114,0,115,112,97,99,101,100,97,116,97,0,117,105,98,108,111,99,107,115,0,112,97,110,101,108,115,0,115,117, -98,118,115,116,114,91,52,93,0,115,117,98,118,101,114,115,105,111,110,0,112,97,100,115,0,109,105,110,118,101,114,115, -105,111,110,0,109,105,110,115,117,98,118,101,114,115,105,111,110,0,100,105,115,112,108,97,121,109,111,100,101,0,42,99, -117,114,115,99,114,101,101,110,0,42,99,117,114,115,99,101,110,101,0,102,105,108,101,102,108,97,103,115,0,103,108,111, -98,97,108,102,0,110,97,109,101,91,56,48,93,0,42,105,98,117,102,0,42,105,98,117,102,95,99,111,109,112,0,42, -115,101,49,0,42,115,101,50,0,42,115,101,51,0,110,114,0,98,111,116,116,111,109,0,114,105,103,104,116,0,120,111, -102,115,0,121,111,102,115,0,108,105,102,116,91,51,93,0,103,97,109,109,97,91,51,93,0,103,97,105,110,91,51,93, -0,115,97,116,117,114,97,116,105,111,110,0,42,103,117,105,0,100,105,114,91,49,54,48,93,0,100,111,110,101,0,115, -116,97,114,116,115,116,105,108,108,0,101,110,100,115,116,105,108,108,0,42,115,116,114,105,112,100,97,116,97,0,111,114, -120,0,111,114,121,0,42,99,114,111,112,0,42,116,114,97,110,115,102,111,114,109,0,42,99,111,108,111,114,95,98,97, -108,97,110,99,101,0,42,116,115,116,114,105,112,100,97,116,97,0,42,116,115,116,114,105,112,100,97,116,97,95,115,116, -97,114,116,115,116,105,108,108,0,42,116,115,116,114,105,112,100,97,116,97,95,101,110,100,115,116,105,108,108,0,42,105, -98,117,102,95,115,116,97,114,116,115,116,105,108,108,0,42,105,98,117,102,95,101,110,100,115,116,105,108,108,0,42,105, -110,115,116,97,110,99,101,95,112,114,105,118,97,116,101,95,100,97,116,97,0,42,42,99,117,114,114,101,110,116,95,112, -114,105,118,97,116,101,95,100,97,116,97,0,42,116,109,112,0,115,116,97,114,116,111,102,115,0,101,110,100,111,102,115, -0,109,97,99,104,105,110,101,0,115,116,97,114,116,100,105,115,112,0,101,110,100,100,105,115,112,0,109,117,108,0,104, -97,110,100,115,105,122,101,0,97,110,105,109,95,112,114,101,115,101,101,107,0,42,115,116,114,105,112,0,102,97,99,102, -48,0,102,97,99,102,49,0,42,115,101,113,49,0,42,115,101,113,50,0,42,115,101,113,51,0,115,101,113,98,97,115, -101,0,42,115,111,117,110,100,0,42,104,100,97,117,100,105,111,0,108,101,118,101,108,0,112,97,110,0,115,116,114,111, -98,101,0,42,101,102,102,101,99,116,100,97,116,97,0,97,110,105,109,95,115,116,97,114,116,111,102,115,0,97,110,105, -109,95,101,110,100,111,102,115,0,98,108,101,110,100,95,109,111,100,101,0,98,108,101,110,100,95,111,112,97,99,105,116, -121,0,42,111,108,100,98,97,115,101,112,0,42,112,97,114,115,101,113,0,42,115,101,113,98,97,115,101,112,0,109,101, -116,97,115,116,97,99,107,0,101,100,103,101,87,105,100,116,104,0,102,111,114,119,97,114,100,0,119,105,112,101,116,121, -112,101,0,102,77,105,110,105,0,102,67,108,97,109,112,0,102,66,111,111,115,116,0,100,68,105,115,116,0,100,81,117, -97,108,105,116,121,0,98,78,111,67,111,109,112,0,83,99,97,108,101,120,73,110,105,0,83,99,97,108,101,121,73,110, -105,0,83,99,97,108,101,120,70,105,110,0,83,99,97,108,101,121,70,105,110,0,120,73,110,105,0,120,70,105,110,0, -121,73,110,105,0,121,70,105,110,0,114,111,116,73,110,105,0,114,111,116,70,105,110,0,105,110,116,101,114,112,111,108, -97,116,105,111,110,0,42,102,114,97,109,101,77,97,112,0,103,108,111,98,97,108,83,112,101,101,100,0,108,97,115,116, -86,97,108,105,100,70,114,97,109,101,0,98,108,101,110,100,70,114,97,109,101,115,0,98,117,116,116,121,112,101,0,117, -115,101,114,106,105,116,0,115,116,97,0,116,111,116,112,97,114,116,0,110,111,114,109,102,97,99,0,111,98,102,97,99, -0,114,97,110,100,102,97,99,0,116,101,120,102,97,99,0,114,97,110,100,108,105,102,101,0,102,111,114,99,101,91,51, -93,0,118,101,99,116,115,105,122,101,0,109,97,120,108,101,110,0,100,101,102,118,101,99,91,51,93,0,109,117,108,116, -91,52,93,0,108,105,102,101,91,52,93,0,99,104,105,108,100,91,52,93,0,109,97,116,91,52,93,0,116,101,120,109, -97,112,0,99,117,114,109,117,108,116,0,115,116,97,116,105,99,115,116,101,112,0,111,109,97,116,0,116,105,109,101,116, -101,120,0,115,112,101,101,100,116,101,120,0,102,108,97,103,50,110,101,103,0,118,101,114,116,103,114,111,117,112,95,118, -0,118,103,114,111,117,112,110,97,109,101,91,51,50,93,0,118,103,114,111,117,112,110,97,109,101,95,118,91,51,50,93, -0,42,107,101,121,115,0,109,105,110,102,97,99,0,117,115,101,100,0,117,115,101,100,101,108,101,109,0,100,120,0,100, -121,0,108,105,110,107,0,111,116,121,112,101,0,111,108,100,0,42,112,111,105,110,0,42,111,108,100,112,111,105,110,0, -114,101,115,101,116,100,105,115,116,0,108,97,115,116,118,97,108,0,42,109,97,0,107,101,121,0,113,117,97,108,0,113, -117,97,108,50,0,116,97,114,103,101,116,78,97,109,101,91,51,50,93,0,116,111,103,103,108,101,78,97,109,101,91,51, -50,93,0,118,97,108,117,101,91,51,50,93,0,109,97,120,118,97,108,117,101,91,51,50,93,0,100,101,108,97,121,0, -100,117,114,97,116,105,111,110,0,109,97,116,101,114,105,97,108,78,97,109,101,91,51,50,93,0,100,97,109,112,116,105, -109,101,114,0,112,114,111,112,110,97,109,101,91,51,50,93,0,109,97,116,110,97,109,101,91,51,50,93,0,97,120,105, -115,102,108,97,103,0,42,102,114,111,109,79,98,106,101,99,116,0,115,117,98,106,101,99,116,91,51,50,93,0,98,111, -100,121,91,51,50,93,0,112,117,108,115,101,0,102,114,101,113,0,116,111,116,108,105,110,107,115,0,42,42,108,105,110, -107,115,0,116,97,112,0,106,111,121,105,110,100,101,120,0,97,120,105,115,95,115,105,110,103,108,101,0,97,120,105,115, -102,0,98,117,116,116,111,110,0,104,97,116,0,104,97,116,102,0,112,114,101,99,105,115,105,111,110,0,115,116,114,91, -49,50,56,93,0,109,111,100,117,108,101,91,54,52,93,0,42,109,121,110,101,119,0,105,110,112,117,116,115,0,116,111, -116,115,108,105,110,107,115,0,42,42,115,108,105,110,107,115,0,118,97,108,111,0,115,116,97,116,101,95,109,97,115,107, -0,42,97,99,116,0,102,114,97,109,101,80,114,111,112,91,51,50,93,0,98,108,101,110,100,105,110,0,112,114,105,111, -114,105,116,121,0,101,110,100,95,114,101,115,101,116,0,115,116,114,105,100,101,97,120,105,115,0,115,116,114,105,100,101, -108,101,110,103,116,104,0,115,110,100,110,114,0,112,97,100,49,91,50,93,0,109,97,107,101,99,111,112,121,0,99,111, -112,121,109,97,100,101,0,112,97,100,50,91,49,93,0,116,114,97,99,107,0,42,109,101,0,108,105,110,86,101,108,111, -99,105,116,121,91,51,93,0,97,110,103,86,101,108,111,99,105,116,121,91,51,93,0,108,111,99,97,108,102,108,97,103, -0,100,121,110,95,111,112,101,114,97,116,105,111,110,0,102,111,114,99,101,108,111,99,91,51,93,0,102,111,114,99,101, -114,111,116,91,51,93,0,108,105,110,101,97,114,118,101,108,111,99,105,116,121,91,51,93,0,97,110,103,117,108,97,114, -118,101,108,111,99,105,116,121,91,51,93,0,42,114,101,102,101,114,101,110,99,101,0,98,117,116,115,116,97,0,98,117, -116,101,110,100,0,109,105,110,0,109,97,120,0,118,105,115,105,102,97,99,0,114,111,116,100,97,109,112,0,109,105,110, -108,111,99,91,51,93,0,109,97,120,108,111,99,91,51,93,0,109,105,110,114,111,116,91,51,93,0,109,97,120,114,111, -116,91,51,93,0,109,97,116,112,114,111,112,91,51,50,93,0,100,105,115,116,114,105,98,117,116,105,111,110,0,105,110, -116,95,97,114,103,95,49,0,105,110,116,95,97,114,103,95,50,0,102,108,111,97,116,95,97,114,103,95,49,0,102,108, -111,97,116,95,97,114,103,95,50,0,116,111,80,114,111,112,78,97,109,101,91,51,50,93,0,42,116,111,79,98,106,101, -99,116,0,98,111,100,121,84,121,112,101,0,102,105,108,101,110,97,109,101,91,54,52,93,0,108,111,97,100,97,110,105, -110,97,109,101,91,54,52,93,0,105,110,116,95,97,114,103,0,102,108,111,97,116,95,97,114,103,0,103,111,0,97,99, -99,101,108,108,101,114,97,116,105,111,110,0,109,97,120,115,112,101,101,100,0,109,97,120,114,111,116,115,112,101,101,100, -0,109,97,120,116,105,108,116,115,112,101,101,100,0,116,105,108,116,100,97,109,112,0,115,112,101,101,100,100,97,109,112, -0,42,115,97,109,112,108,101,0,42,115,116,114,101,97,109,0,42,110,101,119,112,97,99,107,101,100,102,105,108,101,0, -42,115,110,100,95,115,111,117,110,100,0,112,97,110,110,105,110,103,0,97,116,116,101,110,117,97,116,105,111,110,0,112, -105,116,99,104,0,109,105,110,95,103,97,105,110,0,109,97,120,95,103,97,105,110,0,100,105,115,116,97,110,99,101,0, -115,116,114,101,97,109,108,101,110,0,99,104,97,110,110,101,108,115,0,104,105,103,104,112,114,105,111,0,112,97,100,91, -49,48,93,0,103,97,105,110,0,100,111,112,112,108,101,114,102,97,99,116,111,114,0,100,111,112,112,108,101,114,118,101, -108,111,99,105,116,121,0,110,117,109,115,111,117,110,100,115,98,108,101,110,100,101,114,0,110,117,109,115,111,117,110,100, -115,103,97,109,101,101,110,103,105,110,101,0,42,108,97,109,112,114,101,110,0,103,111,98,106,101,99,116,0,100,117,112, -108,105,95,111,102,115,91,51,93,0,99,104,105,108,100,98,97,115,101,0,114,111,108,108,0,104,101,97,100,91,51,93, -0,116,97,105,108,91,51,93,0,98,111,110,101,95,109,97,116,91,51,93,91,51,93,0,97,114,109,95,104,101,97,100, -91,51,93,0,97,114,109,95,116,97,105,108,91,51,93,0,97,114,109,95,109,97,116,91,52,93,91,52,93,0,120,119, -105,100,116,104,0,122,119,105,100,116,104,0,101,97,115,101,49,0,101,97,115,101,50,0,114,97,100,95,104,101,97,100, -0,114,97,100,95,116,97,105,108,0,98,111,110,101,98,97,115,101,0,99,104,97,105,110,98,97,115,101,0,112,97,116, -104,102,108,97,103,0,108,97,121,101,114,95,112,114,111,116,101,99,116,101,100,0,103,104,111,115,116,101,112,0,103,104, -111,115,116,115,105,122,101,0,103,104,111,115,116,116,121,112,101,0,112,97,116,104,115,105,122,101,0,103,104,111,115,116, -115,102,0,103,104,111,115,116,101,102,0,112,97,116,104,115,102,0,112,97,116,104,101,102,0,112,97,116,104,98,99,0, -112,97,116,104,97,99,0,99,111,110,115,116,102,108,97,103,0,105,107,102,108,97,103,0,115,101,108,101,99,116,102,108, -97,103,0,97,103,114,112,95,105,110,100,101,120,0,42,98,111,110,101,0,42,99,104,105,108,100,0,105,107,116,114,101, -101,0,42,98,95,98,111,110,101,95,109,97,116,115,0,42,100,117,97,108,95,113,117,97,116,0,42,98,95,98,111,110, -101,95,100,117,97,108,95,113,117,97,116,115,0,99,104,97,110,95,109,97,116,91,52,93,91,52,93,0,112,111,115,101, -95,109,97,116,91,52,93,91,52,93,0,112,111,115,101,95,104,101,97,100,91,51,93,0,112,111,115,101,95,116,97,105, -108,91,51,93,0,108,105,109,105,116,109,105,110,91,51,93,0,108,105,109,105,116,109,97,120,91,51,93,0,115,116,105, -102,102,110,101,115,115,91,51,93,0,105,107,115,116,114,101,116,99,104,0,42,99,117,115,116,111,109,0,99,104,97,110, -98,97,115,101,0,112,114,111,120,121,95,108,97,121,101,114,0,115,116,114,105,100,101,95,111,102,102,115,101,116,91,51, -93,0,99,121,99,108,105,99,95,111,102,102,115,101,116,91,51,93,0,97,103,114,111,117,112,115,0,97,99,116,105,118, -101,95,103,114,111,117,112,0,99,117,115,116,111,109,67,111,108,0,99,115,0,42,103,114,112,0,114,101,115,101,114,118, -101,100,49,0,103,114,111,117,112,115,0,97,99,116,105,118,101,95,109,97,114,107,101,114,0,97,99,116,110,114,0,97, -99,116,119,105,100,116,104,0,116,105,109,101,115,108,105,100,101,0,110,97,109,101,91,51,48,93,0,111,119,110,115,112, -97,99,101,0,116,97,114,115,112,97,99,101,0,101,110,102,111,114,99,101,0,104,101,97,100,116,97,105,108,0,42,116, -97,114,0,115,117,98,116,97,114,103,101,116,91,51,50,93,0,109,97,116,114,105,120,91,52,93,91,52,93,0,115,112, -97,99,101,0,42,112,114,111,112,0,116,97,114,110,117,109,0,116,97,114,103,101,116,115,0,105,116,101,114,97,116,105, -111,110,115,0,114,111,111,116,98,111,110,101,0,109,97,120,95,114,111,111,116,98,111,110,101,0,42,112,111,108,101,116, -97,114,0,112,111,108,101,115,117,98,116,97,114,103,101,116,91,51,50,93,0,112,111,108,101,97,110,103,108,101,0,111, -114,105,101,110,116,119,101,105,103,104,116,0,103,114,97,98,116,97,114,103,101,116,91,51,93,0,114,101,115,101,114,118, -101,100,50,0,109,105,110,109,97,120,102,108,97,103,0,115,116,117,99,107,0,99,97,99,104,101,91,51,93,0,108,111, -99,107,102,108,97,103,0,102,111,108,108,111,119,102,108,97,103,0,118,111,108,109,111,100,101,0,112,108,97,110,101,0, -111,114,103,108,101,110,103,116,104,0,98,117,108,103,101,0,112,105,118,88,0,112,105,118,89,0,112,105,118,90,0,97, -120,88,0,97,120,89,0,97,120,90,0,109,105,110,76,105,109,105,116,91,54,93,0,109,97,120,76,105,109,105,116,91, -54,93,0,101,120,116,114,97,70,122,0,105,110,118,109,97,116,91,52,93,91,52,93,0,102,114,111,109,0,116,111,0, -109,97,112,91,51,93,0,101,120,112,111,0,102,114,111,109,95,109,105,110,91,51,93,0,102,114,111,109,95,109,97,120, -91,51,93,0,116,111,95,109,105,110,91,51,93,0,116,111,95,109,97,120,91,51,93,0,122,109,105,110,0,122,109,97, -120,0,112,97,100,91,57,93,0,99,104,97,110,110,101,108,91,51,50,93,0,110,111,95,114,111,116,95,97,120,105,115, -0,115,116,114,105,100,101,95,97,120,105,115,0,99,117,114,109,111,100,0,97,99,116,115,116,97,114,116,0,97,99,116, -101,110,100,0,97,99,116,111,102,102,115,0,115,116,114,105,100,101,108,101,110,0,98,108,101,110,100,111,117,116,0,115, -116,114,105,100,101,99,104,97,110,110,101,108,91,51,50,93,0,111,102,102,115,95,98,111,110,101,91,51,50,93,0,104, -97,115,105,110,112,117,116,0,104,97,115,111,117,116,112,117,116,0,100,97,116,97,116,121,112,101,0,115,111,99,107,101, -116,116,121,112,101,0,42,110,101,119,95,115,111,99,107,0,110,115,0,108,105,109,105,116,0,115,116,97,99,107,95,105, -110,100,101,120,0,105,110,116,101,114,110,0,115,116,97,99,107,95,105,110,100,101,120,95,101,120,116,0,108,111,99,120, -0,108,111,99,121,0,111,119,110,95,105,110,100,101,120,0,116,111,95,105,110,100,101,120,0,42,116,111,115,111,99,107, -0,42,108,105,110,107,0,42,110,101,119,95,110,111,100,101,0,117,115,101,114,110,97,109,101,91,51,50,93,0,108,97, -115,116,121,0,111,117,116,112,117,116,115,0,42,115,116,111,114,97,103,101,0,109,105,110,105,119,105,100,116,104,0,99, -117,115,116,111,109,49,0,99,117,115,116,111,109,50,0,99,117,115,116,111,109,51,0,99,117,115,116,111,109,52,0,110, -101,101,100,95,101,120,101,99,0,101,120,101,99,0,116,111,116,114,0,98,117,116,114,0,112,114,118,114,0,42,116,121, -112,101,105,110,102,111,0,42,102,114,111,109,110,111,100,101,0,42,116,111,110,111,100,101,0,42,102,114,111,109,115,111, -99,107,0,110,111,100,101,115,0,108,105,110,107,115,0,42,115,116,97,99,107,0,42,116,104,114,101,97,100,115,116,97, -99,107,0,105,110,105,116,0,115,116,97,99,107,115,105,122,101,0,99,117,114,95,105,110,100,101,120,0,97,108,108,116, -121,112,101,115,0,42,111,119,110,116,121,112,101,0,42,115,101,108,105,110,0,42,115,101,108,111,117,116,0,40,42,116, -105,109,101,99,117,114,115,111,114,41,40,41,0,40,42,115,116,97,116,115,95,100,114,97,119,41,40,41,0,40,42,116, -101,115,116,95,98,114,101,97,107,41,40,41,0,99,121,99,108,105,99,0,109,111,118,105,101,0,115,97,109,112,108,101, -115,0,109,105,110,115,112,101,101,100,0,112,101,114,99,101,110,116,120,0,112,101,114,99,101,110,116,121,0,98,111,107, -101,104,0,99,117,114,118,101,100,0,105,109,97,103,101,95,105,110,95,119,105,100,116,104,0,105,109,97,103,101,95,105, -110,95,104,101,105,103,104,116,0,99,101,110,116,101,114,95,120,0,99,101,110,116,101,114,95,121,0,115,112,105,110,0, -105,116,101,114,0,119,114,97,112,0,115,105,103,109,97,95,99,111,108,111,114,0,115,105,103,109,97,95,115,112,97,99, -101,0,104,117,101,0,115,97,116,0,116,49,0,116,50,0,116,51,0,102,115,116,114,101,110,103,116,104,0,102,97,108, -112,104,97,0,107,101,121,91,52,93,0,120,49,0,120,50,0,121,49,0,121,50,0,99,111,108,110,97,109,101,91,51, -50,93,0,98,107,116,121,112,101,0,114,111,116,97,116,105,111,110,0,112,114,101,118,105,101,119,0,103,97,109,99,111, -0,110,111,95,122,98,117,102,0,102,115,116,111,112,0,109,97,120,98,108,117,114,0,98,116,104,114,101,115,104,0,42, -100,105,99,116,0,42,110,111,100,101,0,97,110,103,108,101,95,111,102,115,0,99,111,108,109,111,100,0,109,105,120,0, -116,104,114,101,115,104,111,108,100,0,102,97,100,101,0,109,0,99,0,106,105,116,0,112,114,111,106,0,102,105,116,0, -115,104,111,114,116,121,0,109,105,110,116,97,98,108,101,0,109,97,120,116,97,98,108,101,0,101,120,116,95,105,110,91, -50,93,0,101,120,116,95,111,117,116,91,50,93,0,42,99,117,114,118,101,0,42,116,97,98,108,101,0,42,112,114,101, -109,117,108,116,97,98,108,101,0,99,117,114,114,0,99,108,105,112,114,0,99,109,91,52,93,0,98,108,97,99,107,91, -51,93,0,119,104,105,116,101,91,51,93,0,98,119,109,117,108,91,51,93,0,115,97,109,112,108,101,91,51,93,0,111, -102,102,115,101,116,91,50,93,0,105,110,110,101,114,114,97,100,105,117,115,0,114,97,116,101,0,114,103,98,91,51,93, -0,99,108,111,110,101,0,97,99,116,105,118,101,95,114,110,100,0,97,99,116,105,118,101,95,99,108,111,110,101,0,97, -99,116,105,118,101,95,109,97,115,107,0,42,108,97,121,101,114,115,0,116,111,116,108,97,121,101,114,0,109,97,120,108, -97,121,101,114,0,116,111,116,115,105,122,101,0,42,112,111,111,108,0,101,100,105,116,102,108,97,103,0,118,101,108,91, -51,93,0,114,111,116,91,52,93,0,97,118,101,91,51,93,0,110,117,109,0,112,97,114,101,110,116,0,112,97,91,52, -93,0,119,91,52,93,0,102,117,118,91,52,93,0,102,111,102,102,115,101,116,0,114,97,110,100,91,51,93,0,42,115, -116,105,99,107,95,111,98,0,112,114,101,118,95,115,116,97,116,101,0,42,104,97,105,114,0,105,95,114,111,116,91,52, -93,0,114,95,114,111,116,91,52,93,0,114,95,97,118,101,91,51,93,0,114,95,118,101,91,51,93,0,100,105,101,116, -105,109,101,0,98,97,110,107,0,115,105,122,101,109,117,108,0,110,117,109,95,100,109,99,97,99,104,101,0,98,112,105, -0,97,108,105,118,101,0,108,111,111,112,0,100,105,115,116,114,0,112,104,121,115,116,121,112,101,0,114,111,116,109,111, -100,101,0,97,118,101,109,111,100,101,0,114,101,97,99,116,101,118,101,110,116,0,100,114,97,119,0,100,114,97,119,95, -97,115,0,100,114,97,119,95,115,105,122,101,0,99,104,105,108,100,116,121,112,101,0,100,114,97,119,95,115,116,101,112, -0,114,101,110,95,115,116,101,112,0,104,97,105,114,95,115,116,101,112,0,107,101,121,115,95,115,116,101,112,0,97,100, -97,112,116,95,97,110,103,108,101,0,97,100,97,112,116,95,112,105,120,0,114,111,116,102,114,111,109,0,105,110,116,101, -103,114,97,116,111,114,0,110,98,101,116,119,101,101,110,0,98,111,105,100,110,101,105,103,104,98,111,117,114,115,0,98, -98,95,97,108,105,103,110,0,98,98,95,117,118,95,115,112,108,105,116,0,98,98,95,97,110,105,109,0,98,98,95,115, -112,108,105,116,95,111,102,102,115,101,116,0,98,98,95,116,105,108,116,0,98,98,95,114,97,110,100,95,116,105,108,116, -0,98,98,95,111,102,102,115,101,116,91,50,93,0,115,105,109,112,108,105,102,121,95,102,108,97,103,0,115,105,109,112, -108,105,102,121,95,114,101,102,115,105,122,101,0,115,105,109,112,108,105,102,121,95,114,97,116,101,0,115,105,109,112,108, -105,102,121,95,116,114,97,110,115,105,116,105,111,110,0,115,105,109,112,108,105,102,121,95,118,105,101,119,112,111,114,116, -0,116,105,109,101,116,119,101,97,107,0,106,105,116,102,97,99,0,107,101,121,101,100,95,116,105,109,101,0,101,102,102, -95,104,97,105,114,0,103,114,105,100,95,114,101,115,0,112,97,114,116,102,97,99,0,116,97,110,102,97,99,0,116,97, -110,112,104,97,115,101,0,114,101,97,99,116,102,97,99,0,97,118,101,102,97,99,0,112,104,97,115,101,102,97,99,0, -114,97,110,100,114,111,116,102,97,99,0,114,97,110,100,112,104,97,115,101,102,97,99,0,114,97,110,100,115,105,122,101, -0,114,101,97,99,116,115,104,97,112,101,0,97,99,99,91,51,93,0,100,114,97,103,102,97,99,0,98,114,111,119,110, -102,97,99,0,100,97,109,112,102,97,99,0,97,98,115,108,101,110,103,116,104,0,114,97,110,100,108,101,110,103,116,104, -0,99,104,105,108,100,95,110,98,114,0,114,101,110,95,99,104,105,108,100,95,110,98,114,0,112,97,114,101,110,116,115, -0,99,104,105,108,100,115,105,122,101,0,99,104,105,108,100,114,97,110,100,115,105,122,101,0,99,104,105,108,100,114,97, -100,0,99,104,105,108,100,102,108,97,116,0,99,104,105,108,100,115,112,114,101,97,100,0,99,108,117,109,112,102,97,99, -0,99,108,117,109,112,112,111,119,0,114,111,117,103,104,49,0,114,111,117,103,104,49,95,115,105,122,101,0,114,111,117, -103,104,50,0,114,111,117,103,104,50,95,115,105,122,101,0,114,111,117,103,104,50,95,116,104,114,101,115,0,114,111,117, -103,104,95,101,110,100,0,114,111,117,103,104,95,101,110,100,95,115,104,97,112,101,0,98,114,97,110,99,104,95,116,104, -114,101,115,0,100,114,97,119,95,108,105,110,101,91,50,93,0,109,97,120,95,108,97,116,95,97,99,99,0,109,97,120, -95,116,97,110,95,97,99,99,0,97,118,101,114,97,103,101,95,118,101,108,0,98,97,110,107,105,110,103,0,109,97,120, -95,98,97,110,107,0,103,114,111,117,110,100,122,0,98,111,105,100,102,97,99,91,56,93,0,98,111,105,100,114,117,108, -101,91,56,93,0,42,101,102,102,95,103,114,111,117,112,0,42,100,117,112,95,111,98,0,42,98,98,95,111,98,0,42, -112,100,50,0,42,112,97,114,116,0,42,101,100,105,116,0,42,42,112,97,116,104,99,97,99,104,101,0,42,42,99,104, -105,108,100,99,97,99,104,101,0,112,97,116,104,99,97,99,104,101,98,117,102,115,0,99,104,105,108,100,99,97,99,104, -101,98,117,102,115,0,42,116,97,114,103,101,116,95,111,98,0,42,107,101,121,101,100,95,111,98,0,42,108,97,116,116, -105,99,101,0,101,102,102,101,99,116,111,114,115,0,114,101,97,99,116,101,118,101,110,116,115,0,116,111,116,99,104,105, -108,100,0,116,111,116,99,97,99,104,101,100,0,116,111,116,99,104,105,108,100,99,97,99,104,101,0,116,97,114,103,101, -116,95,112,115,121,115,0,107,101,121,101,100,95,112,115,121,115,0,116,111,116,107,101,121,101,100,0,98,97,107,101,115, -112,97,99,101,0,98,98,95,117,118,110,97,109,101,91,51,93,91,51,50,93,0,118,103,114,111,117,112,91,49,50,93, -0,118,103,95,110,101,103,0,114,116,51,0,42,114,101,110,100,101,114,100,97,116,97,0,42,99,97,99,104,101,0,67, -100,105,115,0,67,118,105,0,91,51,93,0,115,116,114,117,99,116,117,114,97,108,0,98,101,110,100,105,110,103,0,109, -97,120,95,98,101,110,100,0,109,97,120,95,115,116,114,117,99,116,0,109,97,120,95,115,104,101,97,114,0,97,118,103, -95,115,112,114,105,110,103,95,108,101,110,0,116,105,109,101,115,99,97,108,101,0,101,102,102,95,102,111,114,99,101,95, -115,99,97,108,101,0,101,102,102,95,119,105,110,100,95,115,99,97,108,101,0,115,105,109,95,116,105,109,101,95,111,108, -100,0,115,116,101,112,115,80,101,114,70,114,97,109,101,0,112,114,101,114,111,108,108,0,109,97,120,115,112,114,105,110, -103,108,101,110,0,115,111,108,118,101,114,95,116,121,112,101,0,118,103,114,111,117,112,95,98,101,110,100,0,118,103,114, -111,117,112,95,109,97,115,115,0,118,103,114,111,117,112,95,115,116,114,117,99,116,0,112,114,101,115,101,116,115,0,42, -99,111,108,108,105,115,105,111,110,95,108,105,115,116,0,101,112,115,105,108,111,110,0,115,101,108,102,95,102,114,105,99, -116,105,111,110,0,115,101,108,102,101,112,115,105,108,111,110,0,115,101,108,102,95,108,111,111,112,95,99,111,117,110,116, -0,108,111,111,112,95,99,111,117,110,116,0,112,114,101,115,115,117,114,101,0,42,112,111,105,110,116,115,0,116,111,116, -112,111,105,110,116,115,0,116,104,105,99,107,110,101,115,115,0,115,116,114,111,107,101,115,0,102,114,97,109,101,110,117, -109,0,42,97,99,116,102,114,97,109,101,0,103,115,116,101,112,0,105,110,102,111,91,49,50,56,93,0,115,98,117,102, -102,101,114,95,115,105,122,101,0,115,98,117,102,102,101,114,95,115,102,108,97,103,0,42,115,98,117,102,102,101,114,0, -0,0,0,84,89,80,69,100,1,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104,111, -114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118, -111,105,100,0,76,105,110,107,0,76,105,110,107,68,97,116,97,0,76,105,115,116,66,97,115,101,0,118,101,99,50,115, -0,118,101,99,50,105,0,118,101,99,50,102,0,118,101,99,50,100,0,118,101,99,51,105,0,118,101,99,51,102,0,118, -101,99,51,100,0,118,101,99,52,105,0,118,101,99,52,102,0,118,101,99,52,100,0,114,99,116,105,0,114,99,116,102, -0,73,68,80,114,111,112,101,114,116,121,68,97,116,97,0,73,68,80,114,111,112,101,114,116,121,0,73,68,0,76,105, -98,114,97,114,121,0,70,105,108,101,68,97,116,97,0,80,114,101,118,105,101,119,73,109,97,103,101,0,73,112,111,68, -114,105,118,101,114,0,79,98,106,101,99,116,0,73,112,111,67,117,114,118,101,0,66,80,111,105,110,116,0,66,101,122, -84,114,105,112,108,101,0,73,112,111,0,75,101,121,66,108,111,99,107,0,75,101,121,0,83,99,114,105,112,116,76,105, -110,107,0,84,101,120,116,76,105,110,101,0,84,101,120,116,77,97,114,107,101,114,0,84,101,120,116,0,80,97,99,107, -101,100,70,105,108,101,0,67,97,109,101,114,97,0,73,109,97,103,101,85,115,101,114,0,73,109,97,103,101,0,71,80, -85,84,101,120,116,117,114,101,0,97,110,105,109,0,82,101,110,100,101,114,82,101,115,117,108,116,0,77,84,101,120,0, -84,101,120,0,80,108,117,103,105,110,84,101,120,0,67,66,68,97,116,97,0,67,111,108,111,114,66,97,110,100,0,69, -110,118,77,97,112,0,73,109,66,117,102,0,98,78,111,100,101,84,114,101,101,0,84,101,120,77,97,112,112,105,110,103, -0,76,97,109,112,0,67,117,114,118,101,77,97,112,112,105,110,103,0,87,97,118,101,0,77,97,116,101,114,105,97,108, -0,71,114,111,117,112,0,86,70,111,110,116,0,86,70,111,110,116,68,97,116,97,0,77,101,116,97,69,108,101,109,0, -66,111,117,110,100,66,111,120,0,77,101,116,97,66,97,108,108,0,78,117,114,98,0,67,104,97,114,73,110,102,111,0, -84,101,120,116,66,111,120,0,67,117,114,118,101,0,80,97,116,104,0,77,101,115,104,0,77,70,97,99,101,0,77,84, -70,97,99,101,0,84,70,97,99,101,0,77,86,101,114,116,0,77,69,100,103,101,0,77,68,101,102,111,114,109,86,101, -114,116,0,77,67,111,108,0,77,83,116,105,99,107,121,0,77,83,101,108,101,99,116,0,67,117,115,116,111,109,68,97, -116,97,0,77,117,108,116,105,114,101,115,0,80,97,114,116,105,97,108,86,105,115,105,98,105,108,105,116,121,0,77,68, -101,102,111,114,109,87,101,105,103,104,116,0,77,84,101,120,80,111,108,121,0,77,76,111,111,112,85,86,0,77,76,111, -111,112,67,111,108,0,77,70,108,111,97,116,80,114,111,112,101,114,116,121,0,77,73,110,116,80,114,111,112,101,114,116, -121,0,77,83,116,114,105,110,103,80,114,111,112,101,114,116,121,0,79,114,105,103,83,112,97,99,101,70,97,99,101,0, -77,117,108,116,105,114,101,115,67,111,108,0,77,117,108,116,105,114,101,115,67,111,108,70,97,99,101,0,77,117,108,116, -105,114,101,115,70,97,99,101,0,77,117,108,116,105,114,101,115,69,100,103,101,0,77,117,108,116,105,114,101,115,76,101, -118,101,108,0,77,117,108,116,105,114,101,115,77,97,112,78,111,100,101,0,77,111,100,105,102,105,101,114,68,97,116,97, -0,83,117,98,115,117,114,102,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,77,111,100,105, -102,105,101,114,68,97,116,97,0,67,117,114,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,66,117,105,108,100, -77,111,100,105,102,105,101,114,68,97,116,97,0,77,97,115,107,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114, -114,97,121,77,111,100,105,102,105,101,114,68,97,116,97,0,77,105,114,114,111,114,77,111,100,105,102,105,101,114,68,97, -116,97,0,69,100,103,101,83,112,108,105,116,77,111,100,105,102,105,101,114,68,97,116,97,0,66,101,118,101,108,77,111, -100,105,102,105,101,114,68,97,116,97,0,66,77,101,115,104,77,111,100,105,102,105,101,114,68,97,116,97,0,68,105,115, -112,108,97,99,101,77,111,100,105,102,105,101,114,68,97,116,97,0,85,86,80,114,111,106,101,99,116,77,111,100,105,102, -105,101,114,68,97,116,97,0,68,101,99,105,109,97,116,101,77,111,100,105,102,105,101,114,68,97,116,97,0,83,109,111, -111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67,97,115,116,77,111,100,105,102,105,101,114,68,97,116,97, -0,87,97,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114,109,97,116,117,114,101,77,111,100,105,102,105, -101,114,68,97,116,97,0,72,111,111,107,77,111,100,105,102,105,101,114,68,97,116,97,0,83,111,102,116,98,111,100,121, -77,111,100,105,102,105,101,114,68,97,116,97,0,67,108,111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67, -108,111,116,104,0,67,108,111,116,104,83,105,109,83,101,116,116,105,110,103,115,0,67,108,111,116,104,67,111,108,108,83, -101,116,116,105,110,103,115,0,80,111,105,110,116,67,97,99,104,101,0,67,111,108,108,105,115,105,111,110,77,111,100,105, -102,105,101,114,68,97,116,97,0,66,86,72,84,114,101,101,0,83,117,114,102,97,99,101,77,111,100,105,102,105,101,114, -68,97,116,97,0,68,101,114,105,118,101,100,77,101,115,104,0,66,86,72,84,114,101,101,70,114,111,109,77,101,115,104, -0,66,111,111,108,101,97,110,77,111,100,105,102,105,101,114,68,97,116,97,0,77,68,101,102,73,110,102,108,117,101,110, -99,101,0,77,68,101,102,67,101,108,108,0,77,101,115,104,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97, -116,97,0,80,97,114,116,105,99,108,101,83,121,115,116,101,109,77,111,100,105,102,105,101,114,68,97,116,97,0,80,97, -114,116,105,99,108,101,83,121,115,116,101,109,0,80,97,114,116,105,99,108,101,73,110,115,116,97,110,99,101,77,111,100, -105,102,105,101,114,68,97,116,97,0,69,120,112,108,111,100,101,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108, -117,105,100,115,105,109,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108,117,105,100,115,105,109,83,101,116,116,105, -110,103,115,0,83,104,114,105,110,107,119,114,97,112,77,111,100,105,102,105,101,114,68,97,116,97,0,83,105,109,112,108, -101,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,0,98,68,101,102, -111,114,109,71,114,111,117,112,0,98,65,99,116,105,111,110,0,98,80,111,115,101,0,66,117,108,108,101,116,83,111,102, -116,66,111,100,121,0,80,97,114,116,68,101,102,108,101,99,116,0,83,111,102,116,66,111,100,121,0,79,98,72,111,111, -107,0,82,78,71,0,83,66,86,101,114,116,101,120,0,66,111,100,121,80,111,105,110,116,0,66,111,100,121,83,112,114, -105,110,103,0,83,66,83,99,114,97,116,99,104,0,87,111,114,108,100,0,82,97,100,105,111,0,66,97,115,101,0,65, -118,105,67,111,100,101,99,68,97,116,97,0,81,117,105,99,107,116,105,109,101,67,111,100,101,99,68,97,116,97,0,70, -70,77,112,101,103,67,111,100,101,99,68,97,116,97,0,65,117,100,105,111,68,97,116,97,0,83,99,101,110,101,82,101, -110,100,101,114,76,97,121,101,114,0,82,101,110,100,101,114,68,97,116,97,0,82,101,110,100,101,114,80,114,111,102,105, -108,101,0,71,97,109,101,70,114,97,109,105,110,103,0,84,105,109,101,77,97,114,107,101,114,0,73,109,97,103,101,80, -97,105,110,116,83,101,116,116,105,110,103,115,0,66,114,117,115,104,0,80,97,114,116,105,99,108,101,66,114,117,115,104, -68,97,116,97,0,80,97,114,116,105,99,108,101,69,100,105,116,83,101,116,116,105,110,103,115,0,84,114,97,110,115,102, -111,114,109,79,114,105,101,110,116,97,116,105,111,110,0,84,111,111,108,83,101,116,116,105,110,103,115,0,66,114,117,115, -104,68,97,116,97,0,83,99,117,108,112,116,68,97,116,97,0,83,99,117,108,112,116,83,101,115,115,105,111,110,0,83, -99,101,110,101,0,68,97,103,70,111,114,101,115,116,0,66,71,112,105,99,0,86,105,101,119,51,68,0,83,112,97,99, -101,76,105,110,107,0,83,99,114,65,114,101,97,0,82,101,110,100,101,114,73,110,102,111,0,82,101,116,111,112,111,86, -105,101,119,68,97,116,97,0,86,105,101,119,68,101,112,116,104,115,0,98,71,80,100,97,116,97,0,86,105,101,119,50, -68,0,83,112,97,99,101,73,110,102,111,0,83,112,97,99,101,73,112,111,0,83,112,97,99,101,66,117,116,115,0,83, -112,97,99,101,83,101,113,0,83,112,97,99,101,70,105,108,101,0,100,105,114,101,110,116,114,121,0,66,108,101,110,100, -72,97,110,100,108,101,0,83,112,97,99,101,79,111,112,115,0,84,114,101,101,83,116,111,114,101,0,84,114,101,101,83, -116,111,114,101,69,108,101,109,0,83,112,97,99,101,73,109,97,103,101,0,83,112,97,99,101,78,108,97,0,83,112,97, -99,101,84,101,120,116,0,83,99,114,105,112,116,0,83,112,97,99,101,83,99,114,105,112,116,0,83,112,97,99,101,84, -105,109,101,0,83,112,97,99,101,78,111,100,101,0,83,112,97,99,101,73,109,97,83,101,108,0,70,105,108,101,76,105, -115,116,0,84,104,101,109,101,85,73,0,84,104,101,109,101,83,112,97,99,101,0,84,104,101,109,101,87,105,114,101,67, -111,108,111,114,0,98,84,104,101,109,101,0,83,111,108,105,100,76,105,103,104,116,0,85,115,101,114,68,101,102,0,98, -83,99,114,101,101,110,0,83,99,114,86,101,114,116,0,83,99,114,69,100,103,101,0,80,97,110,101,108,0,70,105,108, -101,71,108,111,98,97,108,0,83,116,114,105,112,69,108,101,109,0,84,83,116,114,105,112,69,108,101,109,0,83,116,114, -105,112,67,114,111,112,0,83,116,114,105,112,84,114,97,110,115,102,111,114,109,0,83,116,114,105,112,67,111,108,111,114, -66,97,108,97,110,99,101,0,83,116,114,105,112,67,111,108,111,114,66,97,108,97,110,99,101,71,85,73,72,101,108,112, -101,114,0,83,116,114,105,112,80,114,111,120,121,0,83,116,114,105,112,0,80,108,117,103,105,110,83,101,113,0,83,101, -113,117,101,110,99,101,0,98,83,111,117,110,100,0,104,100,97,117,100,105,111,0,77,101,116,97,83,116,97,99,107,0, -69,100,105,116,105,110,103,0,87,105,112,101,86,97,114,115,0,71,108,111,119,86,97,114,115,0,84,114,97,110,115,102, -111,114,109,86,97,114,115,0,83,111,108,105,100,67,111,108,111,114,86,97,114,115,0,83,112,101,101,100,67,111,110,116, -114,111,108,86,97,114,115,0,69,102,102,101,99,116,0,66,117,105,108,100,69,102,102,0,80,97,114,116,69,102,102,0, -80,97,114,116,105,99,108,101,0,87,97,118,101,69,102,102,0,79,111,112,115,0,98,80,114,111,112,101,114,116,121,0, -98,78,101,97,114,83,101,110,115,111,114,0,98,77,111,117,115,101,83,101,110,115,111,114,0,98,84,111,117,99,104,83, -101,110,115,111,114,0,98,75,101,121,98,111,97,114,100,83,101,110,115,111,114,0,98,80,114,111,112,101,114,116,121,83, -101,110,115,111,114,0,98,65,99,116,117,97,116,111,114,83,101,110,115,111,114,0,98,68,101,108,97,121,83,101,110,115, -111,114,0,98,67,111,108,108,105,115,105,111,110,83,101,110,115,111,114,0,98,82,97,100,97,114,83,101,110,115,111,114, -0,98,82,97,110,100,111,109,83,101,110,115,111,114,0,98,82,97,121,83,101,110,115,111,114,0,98,77,101,115,115,97, -103,101,83,101,110,115,111,114,0,98,83,101,110,115,111,114,0,98,67,111,110,116,114,111,108,108,101,114,0,98,74,111, -121,115,116,105,99,107,83,101,110,115,111,114,0,98,69,120,112,114,101,115,115,105,111,110,67,111,110,116,0,98,80,121, -116,104,111,110,67,111,110,116,0,98,65,99,116,117,97,116,111,114,0,98,65,100,100,79,98,106,101,99,116,65,99,116, -117,97,116,111,114,0,98,65,99,116,105,111,110,65,99,116,117,97,116,111,114,0,98,83,111,117,110,100,65,99,116,117, -97,116,111,114,0,98,67,68,65,99,116,117,97,116,111,114,0,98,69,100,105,116,79,98,106,101,99,116,65,99,116,117, -97,116,111,114,0,98,83,99,101,110,101,65,99,116,117,97,116,111,114,0,98,80,114,111,112,101,114,116,121,65,99,116, -117,97,116,111,114,0,98,79,98,106,101,99,116,65,99,116,117,97,116,111,114,0,98,73,112,111,65,99,116,117,97,116, -111,114,0,98,67,97,109,101,114,97,65,99,116,117,97,116,111,114,0,98,67,111,110,115,116,114,97,105,110,116,65,99, -116,117,97,116,111,114,0,98,71,114,111,117,112,65,99,116,117,97,116,111,114,0,98,82,97,110,100,111,109,65,99,116, -117,97,116,111,114,0,98,77,101,115,115,97,103,101,65,99,116,117,97,116,111,114,0,98,71,97,109,101,65,99,116,117, -97,116,111,114,0,98,86,105,115,105,98,105,108,105,116,121,65,99,116,117,97,116,111,114,0,98,84,119,111,68,70,105, -108,116,101,114,65,99,116,117,97,116,111,114,0,98,80,97,114,101,110,116,65,99,116,117,97,116,111,114,0,98,83,116, -97,116,101,65,99,116,117,97,116,111,114,0,70,114,101,101,67,97,109,101,114,97,0,98,83,97,109,112,108,101,0,98, -83,111,117,110,100,76,105,115,116,101,110,101,114,0,83,112,97,99,101,83,111,117,110,100,0,71,114,111,117,112,79,98, -106,101,99,116,0,66,111,110,101,0,98,65,114,109,97,116,117,114,101,0,98,80,111,115,101,67,104,97,110,110,101,108, -0,98,65,99,116,105,111,110,71,114,111,117,112,0,98,65,99,116,105,111,110,67,104,97,110,110,101,108,0,83,112,97, -99,101,65,99,116,105,111,110,0,98,67,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,0,98,67,111,110, -115,116,114,97,105,110,116,0,98,67,111,110,115,116,114,97,105,110,116,84,97,114,103,101,116,0,98,80,121,116,104,111, -110,67,111,110,115,116,114,97,105,110,116,0,98,75,105,110,101,109,97,116,105,99,67,111,110,115,116,114,97,105,110,116, -0,98,84,114,97,99,107,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,111,116,97,116,101,76,105,107,101,67, -111,110,115,116,114,97,105,110,116,0,98,76,111,99,97,116,101,76,105,107,101,67,111,110,115,116,114,97,105,110,116,0, -98,77,105,110,77,97,120,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,107,101,67,111,110,115,116, -114,97,105,110,116,0,98,65,99,116,105,111,110,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,107,84,114,97, -99,107,67,111,110,115,116,114,97,105,110,116,0,98,70,111,108,108,111,119,80,97,116,104,67,111,110,115,116,114,97,105, -110,116,0,98,83,116,114,101,116,99,104,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,105,103,105,100,66,111, -100,121,74,111,105,110,116,67,111,110,115,116,114,97,105,110,116,0,98,67,108,97,109,112,84,111,67,111,110,115,116,114, -97,105,110,116,0,98,67,104,105,108,100,79,102,67,111,110,115,116,114,97,105,110,116,0,98,84,114,97,110,115,102,111, -114,109,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116, -0,98,82,111,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,109,105,116,67, -111,110,115,116,114,97,105,110,116,0,98,68,105,115,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98, -83,104,114,105,110,107,119,114,97,112,67,111,110,115,116,114,97,105,110,116,0,98,65,99,116,105,111,110,77,111,100,105, -102,105,101,114,0,98,65,99,116,105,111,110,83,116,114,105,112,0,98,78,111,100,101,83,116,97,99,107,0,98,78,111, -100,101,83,111,99,107,101,116,0,98,78,111,100,101,76,105,110,107,0,98,78,111,100,101,0,98,78,111,100,101,80,114, -101,118,105,101,119,0,98,78,111,100,101,84,121,112,101,0,78,111,100,101,73,109,97,103,101,65,110,105,109,0,78,111, -100,101,66,108,117,114,68,97,116,97,0,78,111,100,101,68,66,108,117,114,68,97,116,97,0,78,111,100,101,66,105,108, -97,116,101,114,97,108,66,108,117,114,68,97,116,97,0,78,111,100,101,72,117,101,83,97,116,0,78,111,100,101,73,109, -97,103,101,70,105,108,101,0,78,111,100,101,67,104,114,111,109,97,0,78,111,100,101,84,119,111,88,89,115,0,78,111, -100,101,84,119,111,70,108,111,97,116,115,0,78,111,100,101,71,101,111,109,101,116,114,121,0,78,111,100,101,86,101,114, -116,101,120,67,111,108,0,78,111,100,101,68,101,102,111,99,117,115,0,78,111,100,101,83,99,114,105,112,116,68,105,99, -116,0,78,111,100,101,71,108,97,114,101,0,78,111,100,101,84,111,110,101,109,97,112,0,78,111,100,101,76,101,110,115, -68,105,115,116,0,84,101,120,78,111,100,101,79,117,116,112,117,116,0,67,117,114,118,101,77,97,112,80,111,105,110,116, -0,67,117,114,118,101,77,97,112,0,66,114,117,115,104,67,108,111,110,101,0,67,117,115,116,111,109,68,97,116,97,76, -97,121,101,114,0,72,97,105,114,75,101,121,0,80,97,114,116,105,99,108,101,75,101,121,0,67,104,105,108,100,80,97, -114,116,105,99,108,101,0,80,97,114,116,105,99,108,101,68,97,116,97,0,80,97,114,116,105,99,108,101,83,101,116,116, -105,110,103,115,0,80,97,114,116,105,99,108,101,69,100,105,116,0,80,97,114,116,105,99,108,101,67,97,99,104,101,75, -101,121,0,76,105,110,107,78,111,100,101,0,98,71,80,68,115,112,111,105,110,116,0,98,71,80,68,115,116,114,111,107, -101,0,98,71,80,68,102,114,97,109,101,0,98,71,80,68,108,97,121,101,114,0,0,84,76,69,78,1,0,1,0,2, -0,2,0,4,0,4,0,4,0,4,0,8,0,0,0,8,0,12,0,8,0,4,0,8,0,8,0,16,0,12,0,12, -0,24,0,16,0,16,0,32,0,16,0,16,0,20,0,76,0,52,0,40,2,0,0,32,0,-116,0,80,3,92,0,36, -0,56,0,84,0,112,0,120,0,16,0,24,0,40,0,120,0,20,0,-124,0,32,0,-128,1,0,0,0,0,0,0,-120, -0,16,1,84,1,24,0,8,3,-88,0,0,0,124,0,-124,0,-128,1,8,1,56,0,108,2,76,0,68,1,0,0,108, -0,104,0,-120,0,56,0,8,0,16,0,56,1,0,0,24,1,20,0,44,0,60,0,24,0,12,0,12,0,4,0,8, -0,8,0,24,0,76,0,32,0,8,0,12,0,8,0,8,0,4,0,4,0,0,1,32,0,16,0,64,0,24,0,12, -0,56,0,0,0,52,0,68,0,88,0,96,0,68,0,96,0,116,0,64,0,60,0,108,0,60,0,-108,0,-104,0,60, -0,92,0,104,0,-72,0,100,0,-76,0,52,0,68,0,0,0,-124,0,28,0,20,0,100,0,0,0,60,0,0,0,0, -0,64,0,8,0,8,0,-40,0,76,0,64,1,64,0,64,0,60,0,-92,1,108,0,104,0,116,0,40,0,84,0,56, -0,120,0,-128,0,-8,0,-48,0,0,0,16,0,0,0,0,0,0,0,108,1,40,0,28,0,-80,0,-112,0,52,0,16, -0,72,0,-48,3,56,0,16,0,80,0,12,0,-72,0,8,0,72,0,80,0,-24,0,8,0,-88,0,0,0,124,5,0, -0,60,0,28,3,36,0,-52,0,0,0,0,0,0,0,20,0,-120,0,36,0,88,1,-36,0,-56,0,-56,1,0,0,0, -0,8,1,12,0,12,0,8,1,-76,0,-128,0,80,2,36,0,-92,0,-36,0,-124,2,0,0,-104,0,-48,0,16,0,56, -14,56,0,32,12,120,0,20,0,24,0,-28,0,32,0,80,0,28,0,16,0,8,0,60,0,0,0,-4,0,-16,0,-88, -1,-60,0,28,1,0,0,16,0,28,0,12,0,24,0,48,0,16,0,28,0,16,0,24,0,56,1,0,0,56,0,44, -0,64,0,48,0,8,0,44,0,72,0,104,0,40,0,8,0,72,0,44,0,40,0,108,0,68,0,76,0,80,0,60, -0,-128,0,76,0,60,0,12,0,92,0,28,0,20,0,80,0,16,0,76,0,108,0,84,0,28,0,96,0,60,0,56, -0,108,0,-116,0,4,0,20,0,12,0,8,0,40,0,0,0,68,0,-80,0,24,0,4,1,116,0,-104,1,72,0,64, -0,-64,0,44,0,64,0,116,0,60,0,104,0,52,0,44,0,44,0,68,0,44,0,64,0,44,0,20,0,52,0,96, -0,12,0,108,0,92,0,28,0,28,0,28,0,52,0,20,0,60,0,-116,0,36,0,120,0,24,0,-52,0,0,0,0, -0,16,0,40,0,28,0,12,0,12,0,16,1,40,0,8,0,8,0,64,0,32,0,24,0,8,0,24,0,32,0,8, -0,32,0,12,0,44,0,20,0,68,0,24,0,56,0,72,0,-4,0,-32,1,0,0,0,0,0,0,16,0,20,0,24, -0,-84,0,83,84,82,67,57,1,0,0,10,0,2,0,10,0,0,0,10,0,1,0,11,0,3,0,11,0,0,0,11, -0,1,0,9,0,2,0,12,0,2,0,9,0,3,0,9,0,4,0,13,0,2,0,2,0,5,0,2,0,6,0,14, -0,2,0,4,0,5,0,4,0,6,0,15,0,2,0,7,0,5,0,7,0,6,0,16,0,2,0,8,0,5,0,8, -0,6,0,17,0,3,0,4,0,5,0,4,0,6,0,4,0,7,0,18,0,3,0,7,0,5,0,7,0,6,0,7, -0,7,0,19,0,3,0,8,0,5,0,8,0,6,0,8,0,7,0,20,0,4,0,4,0,5,0,4,0,6,0,4, -0,7,0,4,0,8,0,21,0,4,0,7,0,5,0,7,0,6,0,7,0,7,0,7,0,8,0,22,0,4,0,8, -0,5,0,8,0,6,0,8,0,7,0,8,0,8,0,23,0,4,0,4,0,9,0,4,0,10,0,4,0,11,0,4, -0,12,0,24,0,4,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,25,0,4,0,9,0,13,0,12, -0,14,0,4,0,15,0,4,0,16,0,26,0,10,0,26,0,0,0,26,0,1,0,0,0,17,0,0,0,18,0,0, -0,19,0,2,0,20,0,4,0,21,0,25,0,22,0,4,0,23,0,4,0,24,0,27,0,9,0,9,0,0,0,9, -0,1,0,27,0,25,0,28,0,26,0,0,0,27,0,2,0,28,0,2,0,20,0,4,0,29,0,26,0,30,0,28, -0,8,0,27,0,31,0,27,0,32,0,29,0,33,0,0,0,34,0,0,0,35,0,4,0,36,0,4,0,37,0,28, -0,38,0,30,0,6,0,4,0,39,0,4,0,40,0,2,0,41,0,2,0,42,0,2,0,43,0,4,0,44,0,31, -0,6,0,32,0,45,0,2,0,46,0,2,0,47,0,2,0,18,0,2,0,20,0,0,0,48,0,33,0,21,0,33, -0,0,0,33,0,1,0,34,0,49,0,35,0,50,0,24,0,51,0,24,0,52,0,2,0,46,0,2,0,47,0,2, -0,53,0,2,0,54,0,2,0,55,0,2,0,56,0,2,0,20,0,2,0,57,0,7,0,11,0,7,0,12,0,4, -0,58,0,7,0,59,0,7,0,60,0,7,0,61,0,31,0,62,0,36,0,7,0,27,0,31,0,12,0,63,0,24, -0,64,0,2,0,46,0,2,0,65,0,2,0,66,0,2,0,37,0,37,0,16,0,37,0,0,0,37,0,1,0,7, -0,67,0,7,0,61,0,2,0,18,0,2,0,47,0,2,0,68,0,2,0,20,0,4,0,69,0,4,0,70,0,9, -0,2,0,7,0,71,0,0,0,17,0,0,0,72,0,7,0,73,0,7,0,74,0,38,0,12,0,27,0,31,0,37, -0,75,0,0,0,76,0,4,0,77,0,7,0,61,0,12,0,78,0,36,0,79,0,27,0,80,0,2,0,18,0,2, -0,81,0,2,0,82,0,2,0,20,0,39,0,5,0,27,0,83,0,2,0,84,0,2,0,85,0,2,0,86,0,4, -0,37,0,40,0,6,0,40,0,0,0,40,0,1,0,0,0,87,0,0,0,88,0,4,0,23,0,4,0,89,0,41, -0,10,0,41,0,0,0,41,0,1,0,4,0,90,0,4,0,91,0,4,0,92,0,4,0,43,0,4,0,14,0,4, -0,93,0,0,0,94,0,0,0,95,0,42,0,15,0,27,0,31,0,0,0,96,0,4,0,93,0,4,0,97,0,12, -0,98,0,40,0,99,0,40,0,100,0,4,0,101,0,4,0,102,0,12,0,103,0,0,0,104,0,4,0,105,0,4, -0,106,0,9,0,107,0,8,0,108,0,43,0,5,0,4,0,109,0,4,0,110,0,4,0,93,0,4,0,37,0,9, -0,2,0,44,0,20,0,27,0,31,0,2,0,18,0,2,0,20,0,7,0,111,0,7,0,112,0,7,0,113,0,7, -0,114,0,7,0,115,0,7,0,116,0,7,0,117,0,7,0,118,0,7,0,119,0,7,0,120,0,7,0,121,0,2, -0,122,0,2,0,123,0,7,0,124,0,36,0,79,0,39,0,125,0,32,0,126,0,45,0,12,0,4,0,127,0,4, -0,-128,0,4,0,-127,0,4,0,-126,0,2,0,-125,0,2,0,-124,0,2,0,20,0,2,0,-123,0,2,0,-122,0,2, -0,-121,0,2,0,-120,0,2,0,-119,0,46,0,32,0,27,0,31,0,0,0,34,0,12,0,-118,0,47,0,-117,0,48, -0,-116,0,49,0,-115,0,2,0,-123,0,2,0,20,0,2,0,-114,0,2,0,18,0,2,0,37,0,2,0,43,0,4, -0,-113,0,2,0,-112,0,2,0,-111,0,2,0,-110,0,2,0,-109,0,2,0,-108,0,2,0,-107,0,4,0,-106,0,4, -0,-105,0,43,0,-104,0,30,0,-103,0,7,0,-102,0,4,0,-101,0,2,0,-100,0,2,0,-99,0,2,0,-98,0,2, -0,-97,0,7,0,-96,0,7,0,-95,0,9,0,-94,0,50,0,31,0,2,0,-93,0,2,0,-92,0,2,0,-91,0,2, -0,-90,0,32,0,-89,0,51,0,-88,0,0,0,-87,0,0,0,-86,0,0,0,-85,0,0,0,-84,0,0,0,-83,0,7, -0,-82,0,7,0,-81,0,2,0,-80,0,2,0,-79,0,2,0,-78,0,2,0,-77,0,2,0,-76,0,2,0,-75,0,2, -0,-74,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7,0,-69,0,7,0,57,0,7,0,-68,0,7, -0,-67,0,7,0,-66,0,7,0,-65,0,7,0,-64,0,52,0,15,0,0,0,-63,0,9,0,-62,0,0,0,-61,0,0, -0,-60,0,4,0,-59,0,4,0,-58,0,9,0,-57,0,7,0,-56,0,7,0,-55,0,7,0,-54,0,4,0,-53,0,9, -0,-52,0,9,0,-51,0,4,0,-50,0,4,0,37,0,53,0,6,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, -0,-49,0,7,0,67,0,4,0,64,0,54,0,5,0,2,0,20,0,2,0,36,0,2,0,64,0,2,0,-48,0,53, -0,-54,0,55,0,17,0,32,0,-89,0,46,0,-47,0,56,0,-46,0,7,0,-45,0,7,0,-44,0,2,0,18,0,2, -0,-43,0,7,0,113,0,7,0,114,0,7,0,-42,0,4,0,-41,0,2,0,-40,0,2,0,-39,0,4,0,-123,0,4, -0,-113,0,2,0,-38,0,2,0,-37,0,51,0,56,0,27,0,31,0,7,0,-36,0,7,0,-35,0,7,0,-34,0,7, -0,-33,0,7,0,-32,0,7,0,-31,0,7,0,-30,0,7,0,-29,0,7,0,-28,0,7,0,-27,0,7,0,-26,0,7, -0,-25,0,7,0,-24,0,7,0,-23,0,7,0,-22,0,7,0,-21,0,7,0,-20,0,7,0,-19,0,7,0,-18,0,7, -0,-17,0,2,0,-16,0,2,0,-15,0,2,0,-14,0,2,0,-13,0,2,0,-12,0,2,0,-11,0,2,0,-10,0,2, -0,20,0,2,0,18,0,2,0,-43,0,7,0,-9,0,7,0,-8,0,7,0,-7,0,7,0,-6,0,2,0,-5,0,2, -0,-4,0,2,0,-3,0,2,0,-125,0,4,0,23,0,4,0,-128,0,4,0,-127,0,4,0,-126,0,7,0,-2,0,7, -0,-1,0,7,0,-67,0,45,0,0,1,57,0,1,1,36,0,79,0,46,0,-47,0,52,0,2,1,54,0,3,1,55, -0,4,1,30,0,-103,0,0,0,5,1,0,0,6,1,58,0,8,0,7,0,7,1,7,0,8,1,7,0,-81,0,4, -0,20,0,7,0,9,1,7,0,10,1,7,0,11,1,32,0,45,0,59,0,80,0,27,0,31,0,2,0,18,0,2, -0,12,1,4,0,13,1,2,0,-79,0,2,0,14,1,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7, -0,15,1,7,0,16,1,7,0,17,1,7,0,18,1,7,0,19,1,7,0,20,1,7,0,21,1,7,0,22,1,7, -0,23,1,7,0,24,1,7,0,25,1,60,0,26,1,2,0,27,1,2,0,70,0,7,0,113,0,7,0,114,0,7, -0,28,1,7,0,29,1,7,0,30,1,2,0,31,1,2,0,32,1,2,0,33,1,2,0,34,1,0,0,35,1,0, -0,36,1,2,0,37,1,2,0,38,1,2,0,39,1,2,0,40,1,2,0,41,1,7,0,42,1,7,0,43,1,7, -0,44,1,7,0,45,1,2,0,46,1,2,0,43,0,2,0,47,1,2,0,48,1,2,0,49,1,2,0,50,1,7, -0,51,1,7,0,52,1,7,0,53,1,7,0,54,1,7,0,55,1,7,0,56,1,7,0,57,1,7,0,58,1,7, -0,59,1,7,0,60,1,7,0,61,1,7,0,62,1,2,0,63,1,2,0,64,1,4,0,65,1,4,0,66,1,2, -0,67,1,2,0,68,1,2,0,69,1,2,0,70,1,7,0,71,1,7,0,72,1,7,0,73,1,7,0,74,1,2, -0,75,1,2,0,76,1,50,0,77,1,36,0,79,0,30,0,-103,0,39,0,125,0,61,0,2,0,27,0,31,0,36, -0,79,0,62,0,-127,0,27,0,31,0,2,0,-79,0,2,0,20,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, -0,78,1,7,0,79,1,7,0,80,1,7,0,81,1,7,0,82,1,7,0,83,1,7,0,84,1,7,0,85,1,7, -0,86,1,7,0,87,1,7,0,88,1,7,0,89,1,7,0,90,1,7,0,91,1,7,0,92,1,7,0,93,1,7, -0,94,1,7,0,95,1,7,0,96,1,7,0,97,1,7,0,98,1,7,0,99,1,7,0,100,1,7,0,101,1,7, -0,102,1,7,0,103,1,7,0,104,1,2,0,105,1,2,0,106,1,2,0,107,1,0,0,108,1,0,0,109,1,7, -0,110,1,7,0,111,1,2,0,112,1,2,0,113,1,7,0,114,1,7,0,115,1,7,0,116,1,7,0,117,1,2, -0,118,1,2,0,119,1,4,0,13,1,4,0,120,1,2,0,121,1,2,0,122,1,2,0,123,1,2,0,124,1,7, -0,125,1,7,0,126,1,7,0,127,1,7,0,-128,1,7,0,-127,1,7,0,-126,1,7,0,-125,1,7,0,-124,1,7, -0,-123,1,7,0,-122,1,0,0,-121,1,7,0,-120,1,7,0,-119,1,7,0,-118,1,4,0,-117,1,0,0,-116,1,0, -0,47,1,0,0,-115,1,0,0,5,1,2,0,-114,1,2,0,-113,1,2,0,64,1,2,0,-112,1,2,0,-111,1,2, -0,-110,1,7,0,-109,1,7,0,-108,1,7,0,-107,1,7,0,-106,1,7,0,-105,1,2,0,-93,0,2,0,-92,0,54, -0,-104,1,54,0,-103,1,0,0,-102,1,0,0,-101,1,0,0,-100,1,0,0,-99,1,2,0,-98,1,2,0,12,1,7, -0,-97,1,7,0,-96,1,50,0,77,1,57,0,1,1,36,0,79,0,63,0,-95,1,30,0,-103,0,7,0,-94,1,7, -0,-93,1,7,0,-92,1,7,0,-91,1,7,0,-90,1,2,0,-89,1,2,0,70,0,7,0,-88,1,7,0,-87,1,7, -0,-86,1,7,0,-85,1,7,0,-84,1,7,0,-83,1,7,0,-82,1,7,0,-81,1,7,0,-80,1,2,0,-79,1,2, -0,-78,1,7,0,-77,1,7,0,-76,1,7,0,-75,1,7,0,-74,1,7,0,-73,1,4,0,-72,1,4,0,-71,1,4, -0,-70,1,39,0,125,0,12,0,-69,1,64,0,6,0,27,0,31,0,0,0,-68,1,7,0,-67,1,7,0,37,0,65, -0,2,0,43,0,-104,0,66,0,26,0,66,0,0,0,66,0,1,0,67,0,-66,1,4,0,-65,1,4,0,-64,1,4, -0,-63,1,4,0,-62,1,4,0,-61,1,4,0,-60,1,2,0,18,0,2,0,20,0,2,0,-59,1,2,0,-58,1,7, -0,5,0,7,0,6,0,7,0,7,0,7,0,-57,1,7,0,-56,1,7,0,-55,1,7,0,-54,1,7,0,-53,1,7, -0,-52,1,7,0,-51,1,7,0,23,0,7,0,-50,1,7,0,-49,1,68,0,15,0,27,0,31,0,67,0,-66,1,12, -0,-48,1,12,0,-47,1,36,0,79,0,62,0,-46,1,2,0,20,0,2,0,-45,1,4,0,-80,0,7,0,7,1,7, -0,-81,0,7,0,8,1,7,0,-44,1,7,0,-43,1,7,0,-42,1,35,0,10,0,7,0,-41,1,7,0,-40,1,7, -0,-39,1,7,0,-38,1,2,0,-37,1,2,0,-36,1,0,0,-35,1,0,0,-34,1,0,0,-33,1,0,0,-32,1,34, -0,7,0,7,0,-31,1,7,0,-40,1,7,0,-39,1,2,0,-35,1,2,0,-32,1,7,0,-38,1,7,0,37,0,69, -0,21,0,69,0,0,0,69,0,1,0,2,0,18,0,2,0,-30,1,2,0,-32,1,2,0,20,0,2,0,-29,1,2, -0,-28,1,2,0,-27,1,2,0,-26,1,2,0,-25,1,2,0,-24,1,2,0,-23,1,2,0,-22,1,7,0,-21,1,7, -0,-20,1,34,0,49,0,35,0,50,0,2,0,-19,1,2,0,-18,1,4,0,-17,1,70,0,5,0,2,0,-16,1,2, -0,-30,1,0,0,20,0,0,0,37,0,2,0,70,0,71,0,4,0,7,0,5,0,7,0,6,0,7,0,8,0,7, -0,-15,1,72,0,57,0,27,0,31,0,67,0,-66,1,12,0,-14,1,12,0,-47,1,32,0,-13,1,32,0,-12,1,32, -0,-11,1,36,0,79,0,73,0,-10,1,38,0,-9,1,62,0,-46,1,12,0,-8,1,7,0,7,1,7,0,-81,0,7, -0,8,1,4,0,-80,0,2,0,-7,1,2,0,-45,1,2,0,20,0,2,0,-6,1,7,0,-5,1,7,0,-4,1,7, -0,-3,1,2,0,-27,1,2,0,-26,1,2,0,-2,1,2,0,-1,1,4,0,70,0,2,0,23,0,2,0,98,0,2, -0,67,0,2,0,0,2,7,0,1,2,7,0,2,2,7,0,3,2,7,0,4,2,7,0,5,2,7,0,6,2,7, -0,7,2,7,0,8,2,7,0,9,2,7,0,10,2,0,0,11,2,0,0,12,2,64,0,13,2,64,0,14,2,64, -0,15,2,64,0,16,2,4,0,17,2,4,0,18,2,4,0,19,2,4,0,37,0,71,0,20,2,4,0,21,2,4, -0,22,2,70,0,23,2,70,0,24,2,74,0,39,0,27,0,31,0,67,0,-66,1,12,0,25,2,36,0,79,0,38, -0,-9,1,62,0,-46,1,75,0,26,2,76,0,27,2,77,0,28,2,78,0,29,2,79,0,30,2,80,0,31,2,81, -0,32,2,82,0,33,2,74,0,34,2,83,0,35,2,84,0,36,2,84,0,37,2,84,0,38,2,4,0,54,0,4, -0,39,2,4,0,40,2,4,0,41,2,4,0,42,2,4,0,-80,0,7,0,7,1,7,0,-81,0,7,0,8,1,7, -0,43,2,7,0,37,0,2,0,44,2,2,0,20,0,2,0,45,2,2,0,46,2,2,0,-45,1,2,0,47,2,85, -0,48,2,86,0,49,2,9,0,-94,0,77,0,8,0,9,0,50,2,7,0,51,2,4,0,52,2,0,0,20,0,0, -0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,75,0,8,0,4,0,56,2,4,0,57,2,4,0,58,2,4, -0,59,2,0,0,37,0,0,0,-30,1,0,0,60,2,0,0,20,0,79,0,5,0,4,0,56,2,4,0,57,2,0, -0,61,2,0,0,62,2,2,0,20,0,87,0,2,0,4,0,63,2,7,0,-39,1,80,0,3,0,87,0,64,2,4, -0,65,2,4,0,20,0,78,0,6,0,7,0,66,2,2,0,67,2,0,0,20,0,0,0,-30,1,0,0,62,2,0, -0,68,2,81,0,4,0,0,0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,88,0,6,0,46,0,50,2,0, -0,20,0,0,0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,89,0,1,0,7,0,69,2,90,0,5,0,0, -0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,4,0,37,0,82,0,1,0,7,0,70,2,83,0,2,0,4, -0,71,2,4,0,18,0,76,0,7,0,7,0,51,2,46,0,50,2,0,0,20,0,0,0,53,2,2,0,13,1,2, -0,54,2,2,0,55,2,91,0,1,0,7,0,72,2,92,0,1,0,4,0,73,2,93,0,1,0,0,0,74,2,94, -0,1,0,7,0,51,2,95,0,4,0,7,0,-49,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,96,0,1,0,95, -0,52,2,97,0,5,0,4,0,75,2,4,0,76,2,0,0,20,0,0,0,-30,1,0,0,-74,0,98,0,2,0,4, -0,77,2,4,0,76,2,99,0,14,0,99,0,0,0,99,0,1,0,97,0,78,2,96,0,79,2,98,0,80,2,0, -0,81,2,12,0,82,2,12,0,83,2,100,0,84,2,4,0,54,0,4,0,40,2,4,0,39,2,4,0,37,0,78, -0,85,2,85,0,14,0,12,0,86,2,78,0,85,2,0,0,87,2,0,0,88,2,0,0,89,2,0,0,90,2,0, -0,91,2,0,0,92,2,0,0,93,2,0,0,20,0,84,0,36,2,84,0,38,2,2,0,94,2,0,0,95,2,86, -0,8,0,4,0,96,2,4,0,97,2,75,0,98,2,79,0,99,2,4,0,40,2,4,0,39,2,4,0,54,0,4, -0,37,0,101,0,6,0,101,0,0,0,101,0,1,0,4,0,18,0,4,0,13,1,0,0,17,0,0,0,100,2,102, -0,7,0,101,0,101,2,2,0,102,2,2,0,86,2,2,0,103,2,2,0,93,0,9,0,104,2,9,0,105,2,103, -0,3,0,101,0,101,2,32,0,-89,0,0,0,17,0,104,0,5,0,101,0,101,2,32,0,-89,0,0,0,17,0,2, -0,106,2,0,0,107,2,105,0,5,0,101,0,101,2,7,0,91,0,7,0,108,2,4,0,109,2,4,0,110,2,106, -0,5,0,101,0,101,2,32,0,111,2,0,0,72,0,4,0,13,1,4,0,20,0,107,0,13,0,101,0,101,2,32, -0,112,2,32,0,113,2,32,0,114,2,32,0,115,2,7,0,116,2,7,0,117,2,7,0,108,2,7,0,118,2,4, -0,119,2,4,0,120,2,4,0,93,0,4,0,121,2,108,0,5,0,101,0,101,2,2,0,122,2,2,0,20,0,7, -0,123,2,32,0,124,2,109,0,3,0,101,0,101,2,7,0,125,2,4,0,93,0,110,0,10,0,101,0,101,2,7, -0,126,2,4,0,127,2,4,0,37,0,2,0,93,0,2,0,-128,2,2,0,-127,2,2,0,-126,2,7,0,-125,2,0, -0,-124,2,111,0,3,0,101,0,101,2,7,0,37,0,4,0,18,0,112,0,11,0,101,0,101,2,51,0,-123,2,7, -0,-122,2,4,0,-121,2,0,0,-124,2,7,0,-120,2,4,0,-119,2,32,0,-118,2,0,0,-117,2,4,0,-116,2,4, -0,37,0,113,0,10,0,101,0,101,2,32,0,-115,2,46,0,-114,2,4,0,93,0,4,0,-113,2,7,0,-112,2,7, -0,-111,2,0,0,-117,2,4,0,-116,2,4,0,37,0,114,0,3,0,101,0,101,2,7,0,-110,2,4,0,-109,2,115, -0,5,0,101,0,101,2,7,0,-108,2,0,0,-124,2,2,0,20,0,2,0,-107,2,116,0,8,0,101,0,101,2,32, -0,-89,0,7,0,-108,2,7,0,-38,1,7,0,109,0,0,0,-124,2,2,0,20,0,2,0,18,0,117,0,21,0,101, -0,101,2,32,0,-106,2,0,0,-124,2,51,0,-123,2,32,0,-118,2,2,0,20,0,2,0,37,0,7,0,-105,2,7, -0,-104,2,7,0,-103,2,7,0,-5,1,7,0,-102,2,7,0,-101,2,7,0,-100,2,7,0,-99,2,4,0,-119,2,4, -0,-116,2,0,0,-117,2,7,0,-98,2,7,0,-97,2,7,0,43,0,118,0,7,0,101,0,101,2,2,0,-96,2,2, -0,-95,2,4,0,70,0,32,0,-89,0,7,0,-94,2,0,0,-124,2,119,0,9,0,101,0,101,2,32,0,-89,0,7, -0,-93,2,7,0,-92,2,7,0,-99,2,4,0,-91,2,4,0,-90,2,7,0,-89,2,0,0,17,0,120,0,1,0,101, -0,101,2,121,0,5,0,101,0,101,2,122,0,-88,2,123,0,-87,2,124,0,-86,2,125,0,-85,2,126,0,14,0,101, -0,101,2,78,0,-84,2,78,0,-83,2,78,0,-82,2,78,0,-81,2,78,0,-80,2,78,0,-79,2,75,0,-78,2,4, -0,-77,2,4,0,-76,2,2,0,-75,2,2,0,37,0,7,0,-74,2,127,0,-73,2,-128,0,3,0,101,0,101,2,-127, -0,-72,2,-126,0,-73,2,-125,0,4,0,101,0,101,2,32,0,-89,0,4,0,-71,2,4,0,37,0,-124,0,2,0,4, -0,-70,2,7,0,-39,1,-123,0,2,0,4,0,-127,0,4,0,-69,2,-122,0,20,0,101,0,101,2,32,0,-89,0,0, -0,-124,2,2,0,-68,2,2,0,-67,2,2,0,20,0,2,0,37,0,7,0,-66,2,7,0,-65,2,4,0,54,0,4, -0,-64,2,-123,0,-63,2,-124,0,-62,2,4,0,-61,2,4,0,-60,2,4,0,-59,2,4,0,-69,2,7,0,-58,2,7, -0,-57,2,7,0,-56,2,-121,0,8,0,101,0,101,2,-120,0,-55,2,-127,0,-72,2,4,0,-54,2,4,0,-53,2,4, -0,-52,2,2,0,20,0,2,0,57,0,-119,0,5,0,101,0,101,2,32,0,45,0,2,0,-51,2,2,0,20,0,2, -0,-50,2,-118,0,5,0,101,0,101,2,4,0,-49,2,2,0,20,0,2,0,-48,2,7,0,-47,2,-117,0,3,0,101, -0,101,2,-116,0,-46,2,125,0,-85,2,-115,0,10,0,101,0,101,2,32,0,-45,2,32,0,-44,2,0,0,-43,2,7, -0,-42,2,2,0,-41,2,2,0,-40,2,0,0,-39,2,0,0,-38,2,0,0,107,2,-114,0,9,0,101,0,101,2,32, -0,-37,2,0,0,-43,2,7,0,-36,2,7,0,-35,2,0,0,13,1,0,0,122,2,0,0,-34,2,0,0,37,0,-113, -0,24,0,27,0,31,0,2,0,-29,1,2,0,-28,1,2,0,-33,2,2,0,20,0,2,0,-32,2,2,0,-31,2,2, -0,-30,2,2,0,70,0,0,0,-29,2,0,0,-28,2,0,0,-27,2,0,0,18,0,4,0,37,0,7,0,-26,2,7, -0,-25,2,7,0,-24,2,7,0,-23,2,7,0,-22,2,7,0,-21,2,34,0,-20,2,36,0,79,0,38,0,-9,1,80, -0,31,2,-112,0,3,0,-112,0,0,0,-112,0,1,0,0,0,17,0,67,0,3,0,7,0,-19,2,4,0,20,0,4, -0,37,0,32,0,111,0,27,0,31,0,2,0,18,0,2,0,-18,2,4,0,-17,2,4,0,-16,2,4,0,-15,2,0, -0,-14,2,32,0,38,0,32,0,-13,2,32,0,-12,2,32,0,-11,2,32,0,-10,2,36,0,79,0,73,0,-10,1,67, -0,-66,1,-111,0,-9,2,-111,0,-8,2,-110,0,-7,2,9,0,2,0,12,0,-6,2,12,0,25,2,12,0,-47,1,12, -0,-5,2,12,0,-4,2,62,0,-46,1,7,0,7,1,7,0,-3,2,7,0,-2,2,7,0,-81,0,7,0,-1,2,7, -0,8,1,7,0,0,3,7,0,1,3,7,0,-93,2,7,0,2,3,7,0,-45,0,4,0,3,3,2,0,20,0,2, -0,4,3,2,0,5,3,2,0,6,3,2,0,7,3,2,0,8,3,2,0,9,3,2,0,10,3,2,0,11,3,2, -0,12,3,2,0,13,3,2,0,14,3,4,0,15,3,4,0,16,3,4,0,17,3,4,0,18,3,7,0,19,3,7, -0,20,3,7,0,21,3,7,0,22,3,7,0,23,3,7,0,24,3,7,0,25,3,7,0,26,3,7,0,27,3,7, -0,28,3,7,0,29,3,7,0,30,3,0,0,31,3,0,0,32,3,0,0,-45,1,0,0,33,3,0,0,34,3,0, -0,35,3,7,0,36,3,7,0,37,3,39,0,125,0,12,0,38,3,12,0,39,3,12,0,40,3,12,0,41,3,7, -0,42,3,2,0,71,2,2,0,43,3,7,0,52,2,4,0,44,3,4,0,45,3,-109,0,46,3,2,0,47,3,2, -0,-38,0,7,0,48,3,12,0,49,3,12,0,50,3,12,0,51,3,12,0,52,3,-108,0,53,3,-107,0,54,3,63, -0,55,3,2,0,56,3,2,0,57,3,2,0,58,3,2,0,59,3,7,0,44,2,2,0,60,3,2,0,61,3,-116, -0,62,3,-127,0,63,3,-127,0,64,3,4,0,65,3,4,0,66,3,4,0,67,3,4,0,70,0,9,0,-94,0,12, -0,68,3,-106,0,14,0,-106,0,0,0,-106,0,1,0,32,0,38,0,7,0,-93,2,7,0,9,1,7,0,-92,2,7, -0,-99,2,0,0,17,0,4,0,-91,2,4,0,-90,2,4,0,69,3,2,0,18,0,2,0,70,3,7,0,-89,2,-108, -0,36,0,2,0,71,3,2,0,72,3,2,0,20,0,2,0,-99,2,7,0,73,3,7,0,74,3,7,0,75,3,7, -0,76,3,7,0,77,3,7,0,78,3,7,0,79,3,7,0,80,3,7,0,81,3,7,0,82,3,7,0,83,3,7, -0,84,3,7,0,85,3,7,0,86,3,7,0,87,3,7,0,88,3,7,0,89,3,7,0,90,3,7,0,91,3,7, -0,92,3,7,0,93,3,7,0,94,3,7,0,95,3,7,0,96,3,2,0,97,3,2,0,98,3,2,0,99,3,2, -0,100,3,51,0,-88,0,-105,0,101,3,7,0,102,3,4,0,110,2,125,0,5,0,4,0,20,0,4,0,103,3,4, -0,104,3,4,0,105,3,4,0,106,3,-104,0,1,0,7,0,-31,1,-109,0,30,0,4,0,20,0,7,0,107,3,7, -0,108,3,7,0,109,3,4,0,110,3,4,0,111,3,4,0,112,3,4,0,113,3,7,0,114,3,7,0,115,3,7, -0,116,3,7,0,117,3,7,0,118,3,7,0,119,3,7,0,120,3,7,0,121,3,7,0,122,3,7,0,123,3,7, -0,124,3,7,0,125,3,7,0,126,3,7,0,127,3,7,0,-128,3,7,0,-127,3,7,0,-126,3,7,0,-125,3,4, -0,-124,3,4,0,-123,3,7,0,-122,3,7,0,27,3,-107,0,49,0,-120,0,-121,3,4,0,-120,3,4,0,-119,3,-103, -0,-118,3,-102,0,-117,3,0,0,37,0,0,0,-116,3,2,0,-115,3,7,0,-114,3,0,0,-113,3,7,0,-112,3,7, -0,-111,3,7,0,-110,3,7,0,-109,3,7,0,-108,3,7,0,-107,3,7,0,-106,3,7,0,-105,3,7,0,-104,3,2, -0,-103,3,0,0,-102,3,2,0,-101,3,7,0,-100,3,7,0,-99,3,0,0,-98,3,4,0,-126,0,4,0,-97,3,4, -0,-96,3,2,0,-95,3,2,0,-94,3,-104,0,-93,3,4,0,-92,3,4,0,81,0,7,0,-91,3,7,0,-90,3,7, -0,-89,3,7,0,-88,3,2,0,-87,3,2,0,-86,3,2,0,-85,3,2,0,-84,3,2,0,-83,3,2,0,-82,3,2, -0,-81,3,2,0,-80,3,-101,0,-79,3,7,0,-78,3,7,0,-77,3,125,0,-76,3,-116,0,48,0,2,0,18,0,2, -0,-75,3,2,0,-74,3,2,0,-73,3,7,0,-72,3,2,0,-71,3,2,0,-70,3,7,0,-69,3,2,0,-68,3,2, -0,-67,3,7,0,-66,3,7,0,-65,3,7,0,-64,3,7,0,-63,3,7,0,-62,3,7,0,-61,3,4,0,-60,3,7, -0,-59,3,7,0,-58,3,7,0,-57,3,74,0,-56,3,74,0,-55,3,74,0,-54,3,0,0,-53,3,7,0,-52,3,7, -0,-51,3,36,0,79,0,2,0,-50,3,0,0,-49,3,0,0,-48,3,7,0,-47,3,4,0,-46,3,7,0,-45,3,7, -0,-44,3,4,0,-43,3,4,0,20,0,7,0,-42,3,7,0,-41,3,7,0,-40,3,78,0,-39,3,7,0,-38,3,7, -0,-37,3,7,0,-36,3,7,0,-35,3,7,0,-34,3,7,0,-33,3,7,0,-32,3,4,0,-31,3,-100,0,71,0,27, -0,31,0,2,0,-79,0,2,0,14,1,2,0,47,1,2,0,-30,3,7,0,-29,3,7,0,-28,3,7,0,-27,3,7, -0,-26,3,7,0,-25,3,7,0,-24,3,7,0,-23,3,7,0,-22,3,7,0,84,1,7,0,86,1,7,0,85,1,7, -0,-21,3,4,0,-20,3,7,0,-19,3,7,0,-18,3,7,0,-17,3,7,0,-16,3,7,0,-15,3,7,0,-14,3,7, -0,-13,3,2,0,-12,3,2,0,13,1,2,0,-11,3,2,0,-10,3,2,0,-9,3,2,0,-8,3,2,0,-7,3,2, -0,-6,3,7,0,-5,3,7,0,-4,3,7,0,-3,3,7,0,-2,3,7,0,-1,3,7,0,0,4,7,0,1,4,7, -0,2,4,7,0,3,4,7,0,4,4,7,0,5,4,7,0,6,4,2,0,7,4,2,0,8,4,2,0,9,4,2, -0,10,4,7,0,11,4,7,0,12,4,7,0,13,4,7,0,14,4,2,0,15,4,2,0,16,4,2,0,17,4,2, -0,18,4,7,0,19,4,7,0,20,4,7,0,21,4,7,0,22,4,2,0,23,4,2,0,24,4,2,0,25,4,2, -0,43,0,7,0,26,4,7,0,27,4,36,0,79,0,50,0,77,1,30,0,-103,0,39,0,125,0,-99,0,16,0,2, -0,28,4,2,0,29,4,2,0,30,4,2,0,20,0,2,0,31,4,2,0,32,4,2,0,33,4,2,0,34,4,2, -0,35,4,2,0,36,4,2,0,37,4,2,0,38,4,4,0,39,4,7,0,40,4,7,0,41,4,7,0,42,4,-98, -0,8,0,-98,0,0,0,-98,0,1,0,4,0,3,3,4,0,43,4,4,0,20,0,2,0,44,4,2,0,45,4,32, -0,-89,0,-97,0,13,0,9,0,46,4,9,0,47,4,4,0,48,4,4,0,49,4,4,0,50,4,4,0,51,4,4, -0,52,4,4,0,53,4,4,0,54,4,4,0,55,4,4,0,56,4,4,0,37,0,0,0,57,4,-96,0,5,0,9, -0,58,4,9,0,59,4,4,0,60,4,4,0,70,0,0,0,61,4,-95,0,13,0,4,0,18,0,4,0,62,4,4, -0,63,4,4,0,64,4,4,0,65,4,4,0,66,4,4,0,93,0,4,0,67,4,4,0,68,4,4,0,69,4,4, -0,70,4,4,0,71,4,26,0,30,0,-94,0,4,0,4,0,72,4,7,0,73,4,2,0,20,0,2,0,68,2,-93, -0,11,0,-93,0,0,0,-93,0,1,0,0,0,17,0,62,0,74,4,63,0,75,4,4,0,3,3,4,0,76,4,4, -0,77,4,4,0,37,0,4,0,78,4,4,0,79,4,-92,0,-126,0,-97,0,80,4,-96,0,81,4,-95,0,82,4,4, -0,83,4,4,0,-126,0,4,0,-97,3,4,0,84,4,4,0,85,4,4,0,86,4,4,0,87,4,2,0,20,0,2, -0,88,4,7,0,20,3,7,0,89,4,7,0,90,4,7,0,91,4,7,0,92,4,7,0,93,4,2,0,94,4,2, -0,95,4,2,0,96,4,2,0,97,4,2,0,-39,0,2,0,98,4,2,0,99,4,2,0,100,3,2,0,100,4,2, -0,101,4,2,0,34,1,2,0,109,0,2,0,102,4,2,0,103,4,2,0,104,4,2,0,105,4,2,0,106,4,2, -0,107,4,2,0,108,4,2,0,109,4,2,0,110,4,2,0,35,1,2,0,111,4,2,0,112,4,2,0,113,4,2, -0,114,4,4,0,115,4,4,0,13,1,2,0,116,4,2,0,117,4,2,0,118,4,2,0,119,4,2,0,120,4,2, -0,121,4,24,0,122,4,24,0,123,4,23,0,124,4,12,0,125,4,2,0,126,4,2,0,37,0,7,0,127,4,7, -0,-128,4,7,0,-127,4,7,0,-126,4,7,0,-125,4,7,0,-124,4,7,0,-123,4,7,0,-122,4,7,0,-121,4,2, -0,-120,4,2,0,-119,4,2,0,-118,4,2,0,-117,4,2,0,-116,4,2,0,-115,4,7,0,-114,4,7,0,-113,4,7, -0,-112,4,2,0,-111,4,2,0,-110,4,2,0,-109,4,2,0,-108,4,2,0,-107,4,2,0,-106,4,2,0,-105,4,2, -0,-104,4,2,0,-103,4,2,0,-102,4,4,0,-101,4,4,0,-100,4,4,0,-99,4,4,0,-98,4,4,0,-97,4,7, -0,-96,4,4,0,-95,4,4,0,-94,4,4,0,-93,4,4,0,-92,4,7,0,-91,4,7,0,-90,4,7,0,-89,4,7, -0,-88,4,7,0,-87,4,7,0,-86,4,7,0,-85,4,7,0,-84,4,7,0,-83,4,0,0,-82,4,0,0,-81,4,4, -0,-80,4,2,0,-79,4,2,0,12,1,0,0,-78,4,7,0,-77,4,7,0,-76,4,4,0,-75,4,4,0,-74,4,7, -0,-73,4,7,0,-72,4,2,0,-71,4,2,0,-70,4,7,0,-69,4,2,0,-68,4,2,0,-67,4,4,0,-66,4,2, -0,-65,4,2,0,-64,4,2,0,-63,4,2,0,-62,4,7,0,-61,4,7,0,70,0,42,0,-60,4,-91,0,9,0,-91, -0,0,0,-91,0,1,0,0,0,17,0,2,0,-59,4,2,0,-58,4,2,0,-57,4,2,0,43,0,7,0,-56,4,7, -0,70,0,-90,0,5,0,7,0,-55,4,0,0,18,0,0,0,43,0,0,0,70,0,0,0,12,1,-89,0,5,0,-89, -0,0,0,-89,0,1,0,4,0,-54,4,0,0,-53,4,4,0,20,0,-88,0,5,0,-87,0,-52,4,2,0,20,0,2, -0,-51,4,2,0,-50,4,2,0,-49,4,-86,0,4,0,2,0,109,0,2,0,-122,2,2,0,-48,4,2,0,-47,4,-85, -0,7,0,2,0,20,0,2,0,-46,4,2,0,-45,4,2,0,-44,4,-86,0,-43,4,7,0,-42,4,4,0,-41,4,-84, -0,4,0,-84,0,0,0,-84,0,1,0,0,0,-40,4,7,0,-39,4,-83,0,56,0,2,0,-38,4,2,0,-37,4,7, -0,-36,4,7,0,-35,4,2,0,-48,4,2,0,-34,4,7,0,-33,4,7,0,-32,4,2,0,-31,4,2,0,-30,4,2, -0,-29,4,2,0,-28,4,7,0,-27,4,7,0,-26,4,7,0,-25,4,7,0,37,0,2,0,-24,4,2,0,-23,4,2, -0,-22,4,2,0,-21,4,-88,0,-20,4,-85,0,-19,4,7,0,-18,4,7,0,-17,4,0,0,-16,4,0,0,-15,4,0, -0,-14,4,0,0,-13,4,0,0,-12,4,0,0,-11,4,2,0,-10,4,7,0,-9,4,7,0,-8,4,7,0,-7,4,7, -0,-6,4,7,0,-5,4,7,0,-4,4,7,0,-3,4,7,0,-2,4,7,0,-1,4,7,0,0,5,2,0,1,5,0, -0,2,5,0,0,3,5,0,0,4,5,0,0,5,5,32,0,6,5,0,0,7,5,0,0,8,5,0,0,9,5,0, -0,10,5,0,0,11,5,0,0,12,5,0,0,13,5,0,0,14,5,0,0,15,5,-82,0,6,0,2,0,109,0,0, -0,-122,2,0,0,16,5,0,0,17,5,0,0,20,0,0,0,-74,0,-81,0,26,0,-80,0,18,5,50,0,77,1,60, -0,19,5,-82,0,20,5,-82,0,21,5,-82,0,22,5,-82,0,23,5,-82,0,24,5,-82,0,25,5,-82,0,26,5,7, -0,27,5,2,0,28,5,2,0,47,1,2,0,29,5,2,0,1,2,0,0,30,5,0,0,31,5,0,0,32,5,0, -0,33,5,0,0,93,0,0,0,34,5,0,0,35,5,0,0,36,5,0,0,37,5,0,0,38,5,0,0,-74,0,-79, -0,43,0,27,0,31,0,32,0,39,5,-100,0,40,5,-79,0,41,5,46,0,-47,0,12,0,42,5,-98,0,43,5,7, -0,44,5,7,0,45,5,7,0,46,5,7,0,47,5,4,0,3,3,7,0,48,5,2,0,49,5,2,0,50,5,2, -0,51,5,2,0,52,5,2,0,53,5,2,0,54,5,2,0,55,5,2,0,5,1,57,0,1,1,9,0,56,5,-99, -0,57,5,-90,0,58,5,-83,0,59,5,-92,0,-73,0,-94,0,60,5,39,0,125,0,12,0,103,0,12,0,61,5,2, -0,62,5,2,0,63,5,2,0,64,5,2,0,65,5,-78,0,66,5,2,0,67,5,2,0,68,5,2,0,64,1,2, -0,-38,0,-81,0,69,5,4,0,70,5,4,0,37,0,-77,0,9,0,46,0,-47,0,45,0,0,1,7,0,8,2,7, -0,9,2,7,0,109,0,7,0,71,5,7,0,72,5,2,0,73,5,2,0,74,5,-76,0,75,0,-75,0,0,0,-75, -0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,7,0,79,5,7,0,80,5,7,0,81,5,7, -0,82,5,7,0,83,5,7,0,84,5,7,0,85,5,7,0,20,1,7,0,86,5,4,0,87,5,2,0,88,5,2, -0,17,5,32,0,39,5,32,0,89,5,-77,0,90,5,-76,0,91,5,-73,0,92,5,-72,0,93,5,-71,0,94,5,0, -0,95,5,2,0,30,4,2,0,96,5,4,0,3,3,4,0,97,5,2,0,98,5,2,0,99,5,2,0,100,5,0, -0,101,5,0,0,43,0,7,0,115,0,7,0,102,5,7,0,103,5,7,0,104,5,7,0,105,5,7,0,106,5,7, -0,107,5,7,0,108,5,7,0,-82,0,7,0,44,5,2,0,109,5,2,0,110,5,2,0,111,5,2,0,112,5,2, -0,-119,0,2,0,29,5,2,0,113,5,2,0,114,5,2,0,115,5,2,0,116,5,7,0,117,5,7,0,118,5,67, -0,119,5,12,0,120,5,2,0,121,5,2,0,53,2,2,0,122,5,2,0,20,0,2,0,123,5,2,0,124,5,2, -0,125,5,0,0,126,5,0,0,127,5,9,0,-128,5,-70,0,-127,5,7,0,-126,5,2,0,-125,5,2,0,-124,5,2, -0,53,5,2,0,54,5,-69,0,19,0,24,0,36,0,24,0,64,0,23,0,-123,5,23,0,-122,5,23,0,-121,5,7, -0,-120,5,7,0,-119,5,7,0,-118,5,7,0,-117,5,2,0,-116,5,2,0,-115,5,2,0,-114,5,2,0,-113,5,2, -0,-112,5,2,0,-111,5,4,0,20,0,7,0,-110,5,2,0,99,5,0,0,107,2,-75,0,6,0,-75,0,0,0,-75, -0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-68,0,6,0,-75,0,0,0,-75,0,1,0,4, -0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-67,0,27,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7, -0,76,5,-74,0,77,5,2,0,78,5,4,0,-109,5,4,0,70,0,-69,0,-108,5,9,0,-107,5,12,0,-106,5,36, -0,79,0,27,0,80,0,0,0,-105,5,0,0,-104,5,0,0,-103,5,2,0,-102,5,2,0,-101,5,2,0,-100,5,2, -0,-99,5,2,0,65,0,2,0,46,0,2,0,-119,0,2,0,-98,5,4,0,20,0,7,0,-97,5,24,0,36,0,-66, -0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-73,0,92,5,2,0,78,5,2, -0,-96,5,2,0,-95,5,2,0,-94,5,2,0,-93,5,-69,0,-108,5,2,0,-92,5,2,0,-119,0,2,0,-101,5,2, -0,-91,5,9,0,-90,5,2,0,29,5,0,0,-89,5,0,0,-88,5,2,0,-87,5,2,0,-86,5,2,0,12,3,2, -0,-85,5,2,0,-84,5,0,0,37,0,0,0,20,0,0,0,47,1,0,0,-83,5,-65,0,16,0,-75,0,0,0,-75, -0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69,0,-108,5,7,0,8,2,7,0,9,2,2, -0,-92,5,2,0,-82,5,2,0,-81,5,2,0,-80,5,4,0,20,0,7,0,71,5,-70,0,-127,5,-64,0,33,0,-75, -0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-63,0,-79,5,4,0,-78,5,0, -0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-74,5,2,0,20,0,2,0,-73,5,2,0,-72,5,2, -0,-71,5,2,0,-70,5,2,0,43,0,4,0,70,0,0,0,-69,5,-62,0,-68,5,2,0,-67,5,2,0,-66,5,2, -0,-65,5,2,0,-48,0,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9,0,-60,5,2,0,-59,5,0, -0,-58,5,-61,0,23,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, -0,-108,5,12,0,-57,5,2,0,-101,5,2,0,-56,5,2,0,20,0,2,0,57,0,9,0,-90,5,12,0,-55,5,-60, -0,-54,5,0,0,-53,5,-59,0,-52,5,4,0,-51,5,4,0,-50,5,2,0,18,0,2,0,-49,5,2,0,-48,5,2, -0,-47,5,-58,0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, -0,-108,5,46,0,-114,2,45,0,0,1,60,0,19,5,2,0,13,1,2,0,-119,0,2,0,-46,5,2,0,-45,5,4, -0,20,0,2,0,49,5,2,0,-44,5,2,0,-98,5,2,0,-101,5,7,0,71,5,0,0,-43,5,0,0,-42,5,0, -0,-41,5,0,0,-40,5,7,0,8,2,7,0,9,2,7,0,-39,5,7,0,-38,5,-70,0,-127,5,-57,0,11,0,-75, -0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,2,0,-119,0,2,0,-98,5,2, -0,-37,5,2,0,20,0,-69,0,-108,5,-56,0,24,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, -0,77,5,2,0,78,5,42,0,-36,5,4,0,-35,5,4,0,-34,5,2,0,93,0,2,0,-119,0,4,0,-33,5,4, -0,-32,5,4,0,-31,5,4,0,-30,5,4,0,-29,5,4,0,-28,5,4,0,-27,5,4,0,-26,5,7,0,-25,5,23, -0,-24,5,23,0,-23,5,4,0,-22,5,4,0,-21,5,-55,0,10,0,27,0,31,0,9,0,-20,5,9,0,-19,5,9, -0,-18,5,9,0,-17,5,9,0,-16,5,4,0,93,0,4,0,-15,5,0,0,-14,5,0,0,-13,5,-54,0,10,0,-75, -0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-55,0,-12,5,2,0,93,0,2,0,-119,0,4, -0,43,0,9,0,-11,5,-53,0,8,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-69, -0,-108,5,4,0,20,0,4,0,-10,5,-52,0,21,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, -0,77,5,2,0,78,5,-69,0,-108,5,27,0,-9,5,27,0,80,0,2,0,20,0,2,0,-119,0,7,0,-8,5,9, -0,-7,5,7,0,8,2,7,0,9,2,57,0,1,1,57,0,-6,5,4,0,-5,5,2,0,-89,5,2,0,37,0,-70, -0,-127,5,-51,0,42,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, -0,-108,5,-50,0,-4,5,0,0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-66,5,2,0,20,0,2, -0,-73,5,9,0,-7,5,4,0,-3,5,4,0,-2,5,4,0,-1,5,4,0,0,6,23,0,1,6,23,0,2,6,7, -0,3,6,7,0,4,6,7,0,5,6,7,0,-8,5,2,0,-67,5,2,0,-48,0,2,0,102,1,2,0,6,6,2, -0,37,0,2,0,43,0,2,0,7,6,2,0,8,6,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9, -0,-60,5,2,0,-59,5,0,0,-58,5,56,0,9,6,-49,0,20,0,0,0,10,6,0,0,11,6,0,0,12,6,0, -0,13,6,0,0,14,6,0,0,15,6,0,0,16,6,0,0,17,6,0,0,18,6,0,0,19,6,0,0,20,6,0, -0,21,6,0,0,22,6,0,0,23,6,0,0,24,6,0,0,25,6,0,0,26,6,0,0,27,6,0,0,68,2,0, -0,28,6,-48,0,54,0,0,0,29,6,0,0,20,6,0,0,21,6,0,0,30,6,0,0,31,6,0,0,32,6,0, -0,33,6,0,0,34,6,0,0,35,6,0,0,36,6,0,0,37,6,0,0,38,6,0,0,39,6,0,0,40,6,0, -0,41,6,0,0,42,6,0,0,43,6,0,0,44,6,0,0,45,6,0,0,46,6,0,0,47,6,0,0,48,6,0, -0,49,6,0,0,50,6,0,0,51,6,0,0,52,6,0,0,53,6,0,0,54,6,0,0,55,6,0,0,56,6,0, -0,57,6,0,0,58,6,0,0,95,0,0,0,59,6,0,0,60,6,0,0,61,6,0,0,62,6,0,0,63,6,0, -0,64,6,0,0,65,6,0,0,66,6,0,0,67,6,0,0,68,6,0,0,69,6,0,0,70,6,0,0,71,6,0, -0,72,6,0,0,73,6,0,0,74,6,0,0,75,6,0,0,76,6,0,0,77,6,0,0,78,6,0,0,79,6,-47, -0,5,0,0,0,80,6,0,0,37,6,0,0,39,6,2,0,20,0,2,0,37,0,-46,0,22,0,-46,0,0,0,-46, -0,1,0,0,0,17,0,-49,0,81,6,-48,0,82,6,-48,0,83,6,-48,0,84,6,-48,0,85,6,-48,0,86,6,-48, -0,87,6,-48,0,88,6,-48,0,89,6,-48,0,90,6,-48,0,91,6,-48,0,92,6,-48,0,93,6,-48,0,94,6,-48, -0,95,6,-48,0,96,6,-47,0,97,6,0,0,98,6,0,0,99,6,-45,0,5,0,4,0,20,0,4,0,37,0,7, -0,52,2,7,0,100,6,7,0,-31,1,-44,0,66,0,4,0,20,0,4,0,101,6,4,0,102,6,0,0,103,6,0, -0,104,6,0,0,105,6,0,0,106,6,0,0,107,6,0,0,108,6,0,0,109,6,0,0,110,6,0,0,111,6,2, -0,112,6,2,0,113,6,4,0,114,6,4,0,115,6,4,0,116,6,4,0,117,6,2,0,118,6,2,0,119,6,2, -0,120,6,2,0,121,6,4,0,122,6,4,0,123,6,2,0,124,6,2,0,125,6,2,0,126,6,2,0,127,6,0, -0,-128,6,12,0,-127,6,2,0,-126,6,2,0,-125,6,2,0,-124,6,2,0,-123,6,2,0,-122,6,2,0,-121,6,2, -0,-120,6,2,0,-119,6,-45,0,-118,6,2,0,-117,6,2,0,-116,6,2,0,-115,6,2,0,-114,6,4,0,-113,6,4, -0,-112,6,4,0,-111,6,4,0,-110,6,2,0,-109,6,2,0,-108,6,2,0,-107,6,2,0,-106,6,2,0,-105,6,2, -0,-104,6,2,0,-103,6,2,0,-102,6,2,0,-101,6,2,0,-100,6,2,0,-99,6,2,0,37,0,0,0,-98,6,0, -0,-97,6,0,0,-96,6,7,0,-95,6,2,0,55,5,2,0,-94,6,54,0,-93,6,-43,0,18,0,27,0,31,0,12, -0,-92,6,12,0,-91,6,12,0,-90,6,-79,0,-89,6,2,0,-105,2,2,0,-88,6,2,0,-104,2,2,0,-87,6,2, -0,-86,6,2,0,-85,6,2,0,-84,6,2,0,-83,6,2,0,-82,6,2,0,37,0,2,0,-81,6,2,0,-80,6,2, -0,-79,6,-42,0,5,0,-42,0,0,0,-42,0,1,0,-42,0,-78,6,13,0,-77,6,4,0,20,0,-41,0,7,0,-41, -0,0,0,-41,0,1,0,-42,0,-76,6,-42,0,-75,6,2,0,123,4,2,0,20,0,4,0,37,0,-40,0,17,0,-40, -0,0,0,-40,0,1,0,0,0,-74,6,0,0,-73,6,0,0,-72,6,2,0,-71,6,2,0,-70,6,2,0,-86,6,2, -0,-85,6,2,0,20,0,2,0,70,3,2,0,-69,6,2,0,-68,6,2,0,-67,6,2,0,-66,6,4,0,-65,6,-40, -0,-64,6,-74,0,30,0,-74,0,0,0,-74,0,1,0,-42,0,-76,6,-42,0,-75,6,-42,0,-63,6,-42,0,-62,6,-43, -0,-61,6,7,0,-60,6,23,0,52,0,23,0,-59,6,23,0,-58,6,2,0,-57,6,2,0,-56,6,2,0,-55,6,0, -0,75,5,0,0,-54,6,2,0,-53,6,2,0,-52,6,0,0,-51,6,0,0,-50,6,0,0,-49,6,0,0,-48,6,2, -0,-47,6,2,0,-46,6,2,0,-45,6,2,0,20,0,39,0,125,0,12,0,-44,6,12,0,-43,6,12,0,-42,6,-39, -0,11,0,0,0,-41,6,2,0,-40,6,2,0,-39,6,2,0,-38,6,2,0,-37,6,2,0,-36,6,2,0,107,4,9, -0,-35,6,9,0,-34,6,4,0,-33,6,4,0,-32,6,-38,0,1,0,0,0,-31,6,-37,0,8,0,56,0,-30,6,56, -0,-29,6,-37,0,-28,6,-37,0,-27,6,-37,0,-26,6,2,0,-123,0,2,0,20,0,4,0,-25,6,-36,0,4,0,4, -0,-35,5,4,0,-24,6,4,0,-31,5,4,0,-23,6,-35,0,2,0,4,0,-22,6,4,0,-21,6,-34,0,9,0,7, -0,-20,6,7,0,-19,6,7,0,-18,6,4,0,20,0,4,0,13,1,7,0,-19,3,7,0,-17,6,4,0,37,0,-33, -0,-16,6,-32,0,6,0,0,0,-15,6,0,0,-75,5,48,0,-116,0,2,0,109,0,2,0,111,4,4,0,37,0,-31, -0,21,0,-31,0,0,0,-31,0,1,0,4,0,57,0,4,0,23,0,4,0,28,0,4,0,-14,6,4,0,-13,6,4, -0,-12,6,-38,0,-11,6,0,0,-15,6,4,0,-10,6,4,0,-9,6,-32,0,-12,2,-36,0,-8,6,-35,0,-7,6,-34, -0,-6,6,-37,0,-5,6,-37,0,-4,6,-37,0,-3,6,56,0,-2,6,56,0,-1,6,-30,0,12,0,0,0,-68,1,9, -0,-62,0,0,0,-61,0,4,0,-58,0,4,0,-50,0,9,0,-57,0,7,0,-55,0,7,0,-54,0,9,0,0,7,9, -0,1,7,9,0,-53,0,9,0,-51,0,-29,0,43,0,-29,0,0,0,-29,0,1,0,9,0,2,7,9,0,26,0,0, -0,27,0,4,0,20,0,4,0,18,0,4,0,23,0,4,0,91,0,4,0,3,7,4,0,4,7,4,0,-13,6,4, -0,-12,6,4,0,5,7,4,0,-39,0,4,0,6,7,4,0,7,7,7,0,8,7,7,0,9,7,4,0,-126,0,4, -0,10,7,-31,0,11,7,36,0,79,0,-79,0,-89,6,48,0,-116,0,7,0,12,7,7,0,13,7,-30,0,2,1,-29, -0,14,7,-29,0,15,7,-29,0,16,7,12,0,17,7,-28,0,18,7,-27,0,19,7,7,0,20,7,7,0,21,7,4, -0,-84,6,7,0,22,7,9,0,23,7,4,0,24,7,4,0,25,7,4,0,26,7,7,0,27,7,-26,0,4,0,-26, -0,0,0,-26,0,1,0,12,0,28,7,-29,0,29,7,-25,0,6,0,12,0,30,7,12,0,17,7,12,0,31,7,2, -0,20,0,2,0,37,0,4,0,57,0,-24,0,4,0,7,0,32,7,7,0,112,0,2,0,33,7,2,0,34,7,-23, -0,6,0,7,0,35,7,7,0,36,7,7,0,37,7,7,0,38,7,4,0,39,7,4,0,40,7,-22,0,12,0,7, -0,41,7,7,0,42,7,7,0,43,7,7,0,44,7,7,0,45,7,7,0,46,7,7,0,47,7,7,0,48,7,7, -0,49,7,7,0,50,7,4,0,-110,2,4,0,51,7,-21,0,2,0,7,0,-55,4,7,0,37,0,-20,0,7,0,7, -0,52,7,7,0,53,7,4,0,93,0,4,0,108,2,4,0,54,7,4,0,55,7,4,0,37,0,-19,0,6,0,-19, -0,0,0,-19,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,-18,0,8,0,-18,0,0,0,-18, -0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,7,0,23,0,7,0,-126,0,-17,0,45,0,-17, -0,0,0,-17,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,2,0,-103,3,2,0,57,7,7, -0,58,7,7,0,92,0,7,0,-97,2,4,0,59,7,4,0,81,0,4,0,110,2,7,0,60,7,7,0,61,7,7, -0,62,7,7,0,63,7,7,0,64,7,7,0,65,7,7,0,-100,2,7,0,-1,0,7,0,66,7,7,0,67,7,7, -0,37,0,7,0,68,7,7,0,69,7,7,0,70,7,2,0,71,7,2,0,72,7,2,0,73,7,2,0,74,7,2, -0,75,7,2,0,76,7,2,0,77,7,2,0,78,7,2,0,123,5,2,0,79,7,2,0,-47,1,2,0,80,7,0, -0,81,7,0,0,82,7,7,0,-45,0,-16,0,83,7,63,0,-95,1,-15,0,16,0,-15,0,0,0,-15,0,1,0,2, -0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,7,0,-105,2,7,0,-104,2,7,0,-103,2,7,0,-5,1,7, -0,-102,2,7,0,-101,2,7,0,84,7,7,0,-100,2,7,0,-98,2,7,0,-97,2,-59,0,5,0,2,0,18,0,2, -0,-25,6,2,0,20,0,2,0,85,7,27,0,-9,5,-60,0,3,0,4,0,69,0,4,0,86,7,-59,0,2,0,-14, -0,12,0,-14,0,0,0,-14,0,1,0,2,0,18,0,2,0,20,0,2,0,31,3,2,0,-32,1,7,0,5,0,7, -0,6,0,7,0,87,7,7,0,88,7,27,0,-9,5,12,0,89,7,-13,0,11,0,-13,0,0,0,-13,0,1,0,0, -0,17,0,2,0,18,0,2,0,90,7,4,0,22,0,4,0,91,7,2,0,20,0,2,0,37,0,9,0,92,7,9, -0,93,7,-12,0,5,0,0,0,17,0,7,0,20,1,7,0,94,7,4,0,95,7,4,0,37,0,-11,0,4,0,2, -0,18,0,2,0,20,0,2,0,43,0,2,0,70,0,-10,0,4,0,0,0,17,0,62,0,96,7,7,0,20,1,7, -0,37,0,-9,0,6,0,2,0,97,7,2,0,98,7,2,0,18,0,2,0,99,7,0,0,100,7,0,0,101,7,-8, -0,5,0,4,0,18,0,4,0,37,0,0,0,17,0,0,0,102,7,0,0,103,7,-7,0,3,0,4,0,18,0,4, -0,37,0,0,0,17,0,-6,0,4,0,2,0,104,7,2,0,105,7,2,0,20,0,2,0,37,0,-5,0,6,0,0, -0,17,0,0,0,106,7,2,0,107,7,2,0,-100,2,2,0,13,1,2,0,70,0,-4,0,5,0,0,0,17,0,7, -0,112,0,7,0,-17,3,2,0,20,0,2,0,122,2,-3,0,3,0,0,0,17,0,4,0,110,2,4,0,104,7,-2, -0,7,0,0,0,17,0,7,0,-17,3,0,0,108,7,0,0,109,7,2,0,13,1,2,0,43,0,4,0,110,7,-1, -0,3,0,32,0,111,7,0,0,112,7,0,0,113,7,0,1,18,0,0,1,0,0,0,1,1,0,2,0,18,0,2, -0,90,7,2,0,20,0,2,0,114,7,2,0,115,7,2,0,116,7,2,0,43,0,2,0,70,0,0,0,17,0,9, -0,2,0,1,1,117,7,32,0,45,0,2,0,-47,4,2,0,20,7,2,0,118,7,2,0,37,0,2,1,11,0,0, -0,17,0,0,0,18,0,0,0,119,7,2,0,20,0,2,0,122,2,2,0,120,7,4,0,121,7,4,0,122,7,4, -0,123,7,4,0,124,7,4,0,125,7,3,1,1,0,0,0,126,7,4,1,4,0,42,0,-36,5,0,0,127,7,4, -0,13,1,4,0,20,0,1,1,18,0,1,1,0,0,1,1,1,0,1,1,-128,7,2,0,18,0,2,0,20,0,2, -0,-127,7,2,0,116,7,2,0,90,7,2,0,-126,7,2,0,70,0,2,0,12,1,0,0,17,0,9,0,2,0,5, -1,117,7,0,1,-125,7,2,0,15,0,2,0,-124,7,4,0,-123,7,6,1,3,0,4,0,-74,2,4,0,37,0,32, -0,45,0,7,1,12,0,-111,0,-122,7,2,0,18,0,2,0,20,0,4,0,58,7,4,0,92,0,0,0,17,0,0, -0,-121,7,2,0,-120,7,2,0,-119,7,2,0,-118,7,2,0,-117,7,7,0,-116,7,8,1,10,0,2,0,20,0,2, -0,-115,7,4,0,58,7,4,0,92,0,2,0,-114,7,-28,0,18,7,2,0,18,0,2,0,-113,7,2,0,-112,7,2, -0,-111,7,9,1,7,0,2,0,20,0,2,0,-115,7,4,0,58,7,4,0,92,0,2,0,18,0,2,0,-110,7,7, -0,109,3,10,1,11,0,4,0,-74,2,2,0,18,0,2,0,20,0,32,0,45,0,74,0,-109,7,0,0,17,0,7, -0,-108,7,7,0,-107,7,7,0,21,3,2,0,-106,7,2,0,-105,7,11,1,5,0,2,0,18,0,2,0,20,0,4, -0,37,0,-79,0,-89,6,32,0,39,5,12,1,5,0,4,0,20,0,4,0,18,0,0,0,17,0,0,0,102,7,32, -0,45,0,13,1,13,0,2,0,20,0,2,0,18,0,2,0,90,7,2,0,22,3,7,0,-104,7,7,0,-103,7,7, -0,7,1,7,0,8,1,7,0,-3,2,7,0,0,3,7,0,-102,7,7,0,-101,7,32,0,-100,7,14,1,10,0,2, -0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,0,0,-121,7,2,0,43,0,2,0,64,0,2, -0,-99,7,2,0,-98,7,15,1,8,0,32,0,45,0,7,0,-103,2,7,0,-97,7,7,0,-96,7,7,0,-108,2,2, -0,20,0,2,0,122,2,7,0,-95,7,16,1,12,0,2,0,18,0,2,0,13,1,2,0,20,0,2,0,-100,2,2, -0,-74,2,2,0,-94,7,4,0,37,0,7,0,-93,7,7,0,-92,7,7,0,-91,7,7,0,-90,7,0,0,-89,7,17, -1,10,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,2,0,68,2,2,0,64,0,2, -0,-99,7,2,0,-98,7,63,0,-95,1,18,1,7,0,4,0,110,2,4,0,-88,7,4,0,-87,7,4,0,-86,7,7, -0,-85,7,7,0,-84,7,0,0,108,7,19,1,7,0,0,0,-83,7,32,0,-82,7,0,0,112,7,2,0,-81,7,2, -0,43,0,4,0,70,0,0,0,113,7,20,1,6,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0, -0,-80,7,0,0,-79,7,21,1,1,0,4,0,20,0,22,1,6,0,0,0,95,0,2,0,18,0,2,0,20,0,4, -0,-78,7,7,0,-77,7,42,0,-36,5,23,1,4,0,0,0,-74,0,2,0,20,0,4,0,18,0,32,0,45,0,24, -1,2,0,4,0,18,0,4,0,-121,5,5,1,10,0,5,1,0,0,5,1,1,0,5,1,-128,7,2,0,18,0,2, -0,20,0,2,0,90,7,2,0,-76,7,0,0,17,0,9,0,2,0,32,0,45,0,25,1,10,0,7,0,21,3,7, -0,-75,7,7,0,-74,7,7,0,-73,7,7,0,-72,7,4,0,20,0,7,0,-94,7,7,0,-71,7,7,0,-70,7,7, -0,37,0,-28,0,20,0,27,0,31,0,0,0,-63,0,26,1,-69,7,9,0,-68,7,43,0,-104,0,43,0,-67,7,9, -0,-66,7,36,0,79,0,7,0,109,3,7,0,-65,7,7,0,-64,7,7,0,-63,7,7,0,-62,7,7,0,-61,7,7, -0,-60,7,4,0,93,0,4,0,-59,7,0,0,-58,7,0,0,-57,7,0,0,-56,7,27,1,6,0,27,0,31,0,7, -0,-55,7,7,0,-54,7,7,0,-53,7,2,0,-52,7,2,0,-51,7,28,1,14,0,-75,0,0,0,-75,0,1,0,4, -0,75,5,7,0,76,5,-74,0,77,5,-69,0,-108,5,-28,0,18,7,2,0,13,1,2,0,-115,7,2,0,8,2,2, -0,9,2,2,0,20,0,2,0,-98,5,4,0,70,0,29,1,6,0,29,1,0,0,29,1,1,0,32,0,45,0,9, -0,-50,7,4,0,-38,0,4,0,37,0,63,0,4,0,27,0,31,0,12,0,-49,7,4,0,-121,0,7,0,-48,7,30, -1,25,0,30,1,0,0,30,1,1,0,30,1,38,0,12,0,-47,7,0,0,17,0,7,0,-46,7,7,0,-45,7,7, -0,-44,7,7,0,-43,7,4,0,20,0,7,0,-42,7,7,0,-41,7,7,0,-40,7,7,0,20,1,7,0,-39,1,7, -0,-39,7,7,0,108,2,7,0,-38,7,7,0,-37,7,7,0,-36,7,7,0,-35,7,7,0,-34,7,7,0,-81,0,2, -0,-121,0,2,0,-31,4,31,1,19,0,27,0,31,0,12,0,-33,7,12,0,-32,7,4,0,20,0,4,0,30,4,2, -0,-96,2,2,0,-31,7,2,0,-121,0,2,0,-30,7,2,0,-29,7,2,0,-28,7,2,0,-27,7,2,0,-26,7,4, -0,-25,7,4,0,-24,7,4,0,-23,7,4,0,-22,7,4,0,-21,7,4,0,-20,7,32,1,34,0,32,1,0,0,32, -1,1,0,12,0,49,3,0,0,17,0,2,0,20,0,2,0,-19,7,2,0,-18,7,2,0,-17,7,2,0,10,3,2, -0,-16,7,4,0,-7,1,4,0,-23,7,4,0,-22,7,30,1,-15,7,32,1,38,0,32,1,-14,7,12,0,-13,7,9, -0,-12,7,9,0,-11,7,9,0,-10,7,7,0,7,1,7,0,-81,0,7,0,-57,1,7,0,-9,7,7,0,-8,7,7, -0,2,3,7,0,-7,7,7,0,-6,7,7,0,-5,7,7,0,-4,7,7,0,-3,7,7,0,-2,7,7,0,-10,1,32, -0,-1,7,-110,0,9,0,12,0,0,8,2,0,20,0,2,0,1,8,7,0,20,3,7,0,2,8,7,0,3,8,12, -0,4,8,4,0,5,8,4,0,37,0,33,1,7,0,33,1,0,0,33,1,1,0,12,0,-58,7,4,0,20,0,4, -0,6,8,0,0,17,0,-47,0,7,8,34,1,8,0,34,1,0,0,34,1,1,0,33,1,8,8,36,0,79,0,12, -0,-6,2,4,0,20,0,0,0,17,0,4,0,9,8,-111,0,6,0,27,0,31,0,12,0,0,8,12,0,10,8,12, -0,103,0,4,0,11,8,4,0,37,0,35,1,16,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, -0,77,5,2,0,78,5,-69,0,-108,5,-111,0,-9,2,0,0,13,1,0,0,-37,5,2,0,20,0,2,0,12,8,2, -0,-101,5,2,0,-98,5,2,0,13,8,7,0,14,8,36,1,5,0,36,1,0,0,36,1,1,0,36,0,79,0,2, -0,20,0,0,0,15,8,37,1,12,0,37,1,0,0,37,1,1,0,9,0,2,0,2,0,18,0,2,0,20,0,0, -0,16,8,0,0,17,8,0,0,15,8,7,0,18,8,7,0,19,8,4,0,37,0,36,0,79,0,38,1,9,0,38, -1,0,0,38,1,1,0,32,0,20,8,0,0,21,8,7,0,22,8,2,0,23,8,2,0,20,0,2,0,18,0,2, -0,37,0,39,1,7,0,42,0,-36,5,26,0,24,8,4,0,20,0,4,0,25,8,12,0,26,8,32,0,20,8,0, -0,21,8,40,1,12,0,32,0,20,8,2,0,27,8,2,0,20,0,2,0,28,8,2,0,29,8,0,0,21,8,32, -0,30,8,0,0,31,8,7,0,32,8,7,0,-39,1,7,0,33,8,7,0,34,8,41,1,6,0,32,0,20,8,4, -0,9,8,4,0,35,8,4,0,93,0,4,0,37,0,0,0,21,8,42,1,4,0,32,0,20,8,4,0,20,0,4, -0,9,8,0,0,21,8,43,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,44,1,10,0,32, -0,20,8,4,0,36,8,7,0,-127,0,4,0,20,0,2,0,-42,5,2,0,37,8,2,0,43,0,2,0,70,0,7, -0,38,8,0,0,21,8,45,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,46,1,10,0,32, -0,20,8,2,0,18,0,2,0,-95,3,4,0,91,0,4,0,92,0,7,0,-97,7,7,0,-96,7,4,0,37,0,-111, -0,-122,7,0,0,21,8,47,1,4,0,32,0,20,8,4,0,7,3,4,0,39,8,0,0,21,8,48,1,5,0,32, -0,20,8,7,0,-127,0,4,0,40,8,4,0,7,3,4,0,8,3,49,1,6,0,32,0,20,8,4,0,41,8,4, -0,42,8,7,0,43,8,7,0,44,8,0,0,21,8,50,1,16,0,32,0,20,8,32,0,-14,7,4,0,18,0,7, -0,45,8,7,0,46,8,7,0,47,8,7,0,48,8,7,0,49,8,7,0,50,8,7,0,51,8,7,0,52,8,7, -0,53,8,2,0,20,0,2,0,37,0,2,0,43,0,2,0,70,0,51,1,3,0,32,0,20,8,4,0,20,0,4, -0,123,5,52,1,5,0,32,0,20,8,4,0,20,0,4,0,37,0,7,0,54,8,0,0,21,8,53,1,10,0,32, -0,20,8,0,0,21,8,2,0,55,8,2,0,56,8,0,0,57,8,0,0,58,8,7,0,59,8,7,0,60,8,7, -0,61,8,7,0,62,8,54,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7,0,63,8,7, -0,64,8,2,0,20,0,2,0,123,5,55,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7, -0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,56,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7, -0,12,0,7,0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,57,1,7,0,32,0,20,8,0,0,21,8,7, -0,20,1,7,0,30,1,2,0,20,0,2,0,13,1,4,0,37,0,58,1,5,0,32,0,-45,2,7,0,20,1,2, -0,-41,2,0,0,-39,2,0,0,65,8,59,1,10,0,59,1,0,0,59,1,1,0,2,0,18,0,2,0,20,0,0, -0,66,8,7,0,-36,0,7,0,-35,0,2,0,-58,7,2,0,67,8,32,0,45,0,60,1,22,0,60,1,0,0,60, -1,1,0,2,0,20,0,2,0,13,1,2,0,68,8,2,0,69,8,36,0,79,0,-111,0,-122,7,32,0,-89,0,7, -0,91,0,7,0,92,0,7,0,70,8,7,0,71,8,7,0,72,8,7,0,73,8,7,0,-107,2,7,0,-67,1,7, -0,-120,7,7,0,74,8,0,0,75,8,0,0,76,8,12,0,-4,2,61,1,8,0,7,0,-31,1,7,0,-97,7,7, -0,-96,7,9,0,2,0,2,0,77,8,2,0,78,8,2,0,79,8,2,0,80,8,62,1,18,0,62,1,0,0,62, -1,1,0,62,1,81,8,0,0,17,0,61,1,82,8,2,0,18,0,2,0,20,0,2,0,83,8,2,0,84,8,2, -0,85,8,2,0,86,8,4,0,43,0,7,0,87,8,7,0,88,8,4,0,89,8,4,0,90,8,62,1,91,8,63, -1,92,8,64,1,32,0,64,1,0,0,64,1,1,0,64,1,93,8,0,0,17,0,0,0,94,8,2,0,18,0,2, -0,20,0,2,0,-14,6,2,0,20,7,2,0,95,8,2,0,-119,0,2,0,84,8,2,0,-25,6,12,0,-127,7,12, -0,96,8,27,0,-9,5,9,0,97,8,7,0,87,8,7,0,88,8,7,0,-5,1,7,0,98,8,2,0,99,8,2, -0,100,8,7,0,101,8,7,0,102,8,2,0,103,8,2,0,104,8,24,0,105,8,24,0,106,8,24,0,107,8,65, -1,-103,0,66,1,108,8,63,1,6,0,63,1,0,0,63,1,1,0,64,1,109,8,64,1,110,8,62,1,111,8,62, -1,91,8,57,0,16,0,27,0,31,0,12,0,112,8,12,0,113,8,61,1,114,8,12,0,115,8,4,0,18,0,4, -0,116,8,4,0,117,8,4,0,118,8,12,0,119,8,66,1,120,8,62,1,121,8,62,1,122,8,9,0,123,8,9, -0,124,8,4,0,125,8,67,1,6,0,4,0,-128,0,4,0,-126,0,4,0,-25,6,0,0,126,8,0,0,127,8,2, -0,37,0,68,1,16,0,2,0,-86,6,2,0,-85,6,2,0,-128,8,2,0,-74,7,2,0,-127,8,2,0,68,0,7, -0,-108,2,7,0,-126,8,7,0,-125,8,2,0,34,1,0,0,-124,8,0,0,42,4,2,0,-123,8,2,0,37,0,4, -0,-122,8,4,0,-121,8,69,1,9,0,7,0,-120,8,7,0,-119,8,7,0,-60,7,7,0,112,0,7,0,-118,8,7, -0,71,5,2,0,-117,8,0,0,-116,8,0,0,37,0,70,1,4,0,7,0,-115,8,7,0,-114,8,2,0,-117,8,2, -0,37,0,71,1,3,0,7,0,-113,8,7,0,-112,8,7,0,15,0,72,1,7,0,0,0,-68,1,2,0,109,4,2, -0,110,4,2,0,111,4,2,0,62,4,4,0,-126,0,4,0,-97,3,73,1,7,0,7,0,-111,8,7,0,-110,8,7, -0,-109,8,7,0,4,2,7,0,-108,8,7,0,-107,8,7,0,-106,8,74,1,4,0,2,0,-105,8,2,0,-104,8,2, -0,-103,8,2,0,-102,8,75,1,2,0,7,0,5,0,7,0,6,0,76,1,2,0,0,0,-87,0,0,0,-101,8,77, -1,1,0,0,0,17,0,78,1,10,0,0,0,-100,8,0,0,-99,8,0,0,-98,8,0,0,-97,8,2,0,-128,8,2, -0,-96,8,7,0,-95,8,7,0,-94,8,7,0,-93,8,7,0,-67,1,79,1,2,0,9,0,-92,8,9,0,-91,8,80, -1,11,0,0,0,111,4,0,0,18,0,0,0,-117,8,0,0,112,0,0,0,-90,8,0,0,109,0,0,0,-74,0,7, -0,-89,8,7,0,-88,8,7,0,-87,8,7,0,-86,8,81,1,8,0,7,0,97,7,7,0,-127,0,7,0,42,4,7, -0,72,2,7,0,-85,8,7,0,-49,0,7,0,-84,8,4,0,18,0,82,1,4,0,2,0,-83,8,2,0,-82,8,2, -0,-81,8,2,0,37,0,83,1,1,0,0,0,17,0,84,1,4,0,7,0,5,0,7,0,6,0,2,0,20,0,2, -0,-80,8,85,1,10,0,2,0,-120,3,2,0,20,0,7,0,-17,3,7,0,-79,8,7,0,-78,8,7,0,-77,8,7, -0,-76,8,84,1,-75,8,84,1,-74,8,84,1,-73,8,60,0,9,0,4,0,20,0,4,0,64,0,24,0,-72,8,24, -0,-71,8,85,1,-70,8,7,0,-69,8,7,0,-68,8,7,0,-67,8,7,0,-66,8,86,1,4,0,46,0,-114,2,7, -0,-65,8,7,0,92,1,7,0,37,0,-87,0,13,0,27,0,31,0,2,0,20,0,2,0,72,5,4,0,109,0,7, -0,-64,8,7,0,1,2,7,0,-63,8,7,0,-62,8,7,0,92,1,2,0,47,1,2,0,37,0,50,0,77,1,86, -1,-61,8,87,1,10,0,4,0,18,0,4,0,-127,0,4,0,20,0,4,0,70,3,4,0,-60,8,4,0,-59,8,4, -0,-58,8,0,0,95,0,0,0,17,0,9,0,2,0,84,0,6,0,87,1,-57,8,4,0,-56,8,4,0,-55,8,4, -0,-54,8,4,0,37,0,9,0,-53,8,88,1,5,0,7,0,66,2,7,0,-74,2,7,0,-39,1,2,0,-52,8,2, -0,37,0,89,1,5,0,7,0,66,2,7,0,-51,8,7,0,-50,8,7,0,-49,8,7,0,-74,2,90,1,7,0,4, -0,-48,8,4,0,-47,8,4,0,-46,8,7,0,-45,8,7,0,-44,8,7,0,-43,8,7,0,-42,8,91,1,26,0,32, -0,-41,8,89,1,66,3,89,1,-40,8,88,1,-39,8,89,1,83,7,7,0,-38,8,7,0,-37,8,7,0,-36,8,7, -0,-35,8,7,0,-44,8,7,0,-43,8,7,0,-74,2,7,0,-97,2,7,0,-34,8,7,0,-33,8,7,0,109,0,7, -0,-32,8,4,0,-48,8,4,0,-31,8,4,0,37,0,4,0,81,0,4,0,-30,8,2,0,20,0,2,0,-29,8,2, -0,-28,8,2,0,100,3,92,1,112,0,27,0,31,0,4,0,20,0,2,0,18,0,2,0,55,8,2,0,-27,8,2, -0,-26,8,2,0,-25,8,2,0,-24,8,2,0,-23,8,2,0,-22,8,2,0,-21,8,2,0,-20,8,2,0,-19,8,2, -0,-18,8,2,0,-17,8,2,0,-16,8,2,0,-15,8,2,0,-14,8,2,0,-13,8,2,0,-47,1,2,0,76,7,2, -0,51,7,2,0,-12,8,2,0,-11,8,2,0,98,3,2,0,99,3,2,0,-10,8,2,0,-9,8,2,0,-8,8,2, -0,-7,8,2,0,-6,8,2,0,-5,8,7,0,-4,8,7,0,-3,8,7,0,-2,8,2,0,-1,8,2,0,0,9,7, -0,1,9,7,0,2,9,7,0,3,9,7,0,58,7,7,0,92,0,7,0,-97,2,7,0,64,7,7,0,4,9,7, -0,5,9,7,0,6,9,7,0,7,9,7,0,57,0,4,0,59,7,4,0,57,7,4,0,8,9,7,0,60,7,7, -0,61,7,7,0,62,7,7,0,9,9,7,0,10,9,7,0,11,9,7,0,12,9,7,0,13,9,7,0,14,9,7, -0,15,9,7,0,16,9,7,0,21,3,7,0,109,0,7,0,17,9,7,0,18,9,7,0,19,9,7,0,20,9,7, -0,21,9,7,0,22,9,7,0,108,2,7,0,23,9,7,0,24,9,4,0,25,9,4,0,26,9,7,0,27,9,7, -0,28,9,7,0,29,9,7,0,30,9,7,0,31,9,7,0,32,9,7,0,33,9,7,0,34,9,7,0,94,3,7, -0,92,3,7,0,93,3,7,0,35,9,7,0,36,9,7,0,37,9,7,0,38,9,7,0,39,9,7,0,40,9,7, -0,41,9,7,0,42,9,7,0,43,9,7,0,28,3,7,0,44,9,7,0,45,9,7,0,46,9,7,0,47,9,7, -0,48,9,7,0,49,9,7,0,50,9,0,0,51,9,63,0,55,3,63,0,52,9,32,0,53,9,32,0,54,9,36, -0,79,0,-108,0,53,3,-108,0,55,9,-120,0,37,0,-120,0,0,0,-120,0,1,0,92,1,56,9,91,1,-121,3,90, -1,-14,7,93,1,57,9,94,1,58,9,94,1,59,9,12,0,60,9,12,0,61,9,-107,0,54,3,32,0,62,9,32, -0,63,9,32,0,64,9,12,0,65,9,12,0,66,9,7,0,-45,0,7,0,83,4,4,0,110,2,4,0,20,0,4, -0,59,7,4,0,67,9,4,0,68,9,4,0,69,9,4,0,57,0,2,0,-38,0,2,0,70,9,2,0,71,9,2, -0,72,9,2,0,47,3,2,0,73,9,0,0,74,9,2,0,75,9,2,0,76,9,2,0,77,9,9,0,78,9,125, -0,-76,3,123,0,34,0,95,1,79,9,7,0,-106,3,7,0,80,9,7,0,81,9,7,0,-14,3,7,0,82,9,7, -0,31,3,7,0,21,3,7,0,83,9,7,0,3,2,7,0,84,9,7,0,85,9,7,0,86,9,7,0,87,9,7, -0,88,9,7,0,89,9,7,0,-105,3,7,0,90,9,7,0,91,9,7,0,92,9,7,0,-104,3,7,0,-108,3,7, -0,-107,3,4,0,93,9,4,0,93,0,4,0,94,9,4,0,95,9,2,0,96,9,2,0,97,9,2,0,98,9,2, -0,99,9,2,0,100,9,2,0,37,0,4,0,70,0,124,0,8,0,95,1,101,9,7,0,102,9,7,0,103,9,7, -0,-94,1,7,0,104,9,4,0,93,0,2,0,105,9,2,0,106,9,96,1,4,0,7,0,5,0,7,0,6,0,7, -0,7,0,7,0,107,9,97,1,6,0,97,1,0,0,97,1,1,0,96,1,108,9,4,0,109,9,2,0,110,9,2, -0,20,0,98,1,5,0,98,1,0,0,98,1,1,0,12,0,111,9,4,0,112,9,4,0,20,0,99,1,9,0,99, -1,0,0,99,1,1,0,12,0,-128,0,98,1,113,9,4,0,20,0,2,0,110,9,2,0,114,9,7,0,94,0,0, -0,115,9,-70,0,5,0,12,0,125,4,4,0,20,0,2,0,116,9,2,0,117,9,9,0,118,9,69,78,68,66,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; -int DNAlen= sizeof(DNAstr); +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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. +*/ +unsigned char DNAstr[]= { +83,68,78,65,78,65,77,69,119,9,0,0,42,110,101,120,116,0,42,112,114,101,118,0,42,100,97,116,97,0,42,102,105, +114,115,116,0,42,108,97,115,116,0,120,0,121,0,122,0,119,0,120,109,105,110,0,120,109,97,120,0,121,109,105,110, +0,121,109,97,120,0,42,112,111,105,110,116,101,114,0,103,114,111,117,112,0,118,97,108,0,118,97,108,50,0,110,97, +109,101,91,51,50,93,0,116,121,112,101,0,115,117,98,116,121,112,101,0,102,108,97,103,0,115,97,118,101,100,0,100, +97,116,97,0,108,101,110,0,116,111,116,97,108,108,101,110,0,42,110,101,119,105,100,0,42,108,105,98,0,110,97,109, +101,91,50,52,93,0,117,115,0,105,99,111,110,95,105,100,0,42,112,114,111,112,101,114,116,105,101,115,0,105,100,0, +42,105,100,98,108,111,99,107,0,42,102,105,108,101,100,97,116,97,0,110,97,109,101,91,50,52,48,93,0,102,105,108, +101,110,97,109,101,91,50,52,48,93,0,116,111,116,0,112,97,100,0,42,112,97,114,101,110,116,0,119,91,50,93,0, +104,91,50,93,0,99,104,97,110,103,101,100,91,50,93,0,112,97,100,48,0,112,97,100,49,0,42,114,101,99,116,91, +50,93,0,42,111,98,0,98,108,111,99,107,116,121,112,101,0,97,100,114,99,111,100,101,0,110,97,109,101,91,49,50, +56,93,0,42,98,112,0,42,98,101,122,116,0,109,97,120,114,99,116,0,116,111,116,114,99,116,0,118,97,114,116,121, +112,101,0,116,111,116,118,101,114,116,0,105,112,111,0,101,120,116,114,97,112,0,114,116,0,98,105,116,109,97,115,107, +0,115,108,105,100,101,95,109,105,110,0,115,108,105,100,101,95,109,97,120,0,99,117,114,118,97,108,0,42,100,114,105, +118,101,114,0,99,117,114,118,101,0,99,117,114,0,115,104,111,119,107,101,121,0,109,117,116,101,105,112,111,0,112,111, +115,0,114,101,108,97,116,105,118,101,0,116,111,116,101,108,101,109,0,112,97,100,50,0,42,119,101,105,103,104,116,115, +0,118,103,114,111,117,112,91,51,50,93,0,115,108,105,100,101,114,109,105,110,0,115,108,105,100,101,114,109,97,120,0, +42,114,101,102,107,101,121,0,101,108,101,109,115,116,114,91,51,50,93,0,101,108,101,109,115,105,122,101,0,98,108,111, +99,107,0,42,105,112,111,0,42,102,114,111,109,0,116,111,116,107,101,121,0,115,108,117,114,112,104,0,42,42,115,99, +114,105,112,116,115,0,42,102,108,97,103,0,97,99,116,115,99,114,105,112,116,0,116,111,116,115,99,114,105,112,116,0, +42,108,105,110,101,0,42,102,111,114,109,97,116,0,98,108,101,110,0,108,105,110,101,110,111,0,115,116,97,114,116,0, +101,110,100,0,102,108,97,103,115,0,99,111,108,111,114,91,52,93,0,112,97,100,91,52,93,0,42,110,97,109,101,0, +110,108,105,110,101,115,0,108,105,110,101,115,0,42,99,117,114,108,0,42,115,101,108,108,0,99,117,114,99,0,115,101, +108,99,0,109,97,114,107,101,114,115,0,42,117,110,100,111,95,98,117,102,0,117,110,100,111,95,112,111,115,0,117,110, +100,111,95,108,101,110,0,42,99,111,109,112,105,108,101,100,0,109,116,105,109,101,0,115,105,122,101,0,115,101,101,107, +0,112,97,115,115,101,112,97,114,116,97,108,112,104,97,0,97,110,103,108,101,0,99,108,105,112,115,116,97,0,99,108, +105,112,101,110,100,0,108,101,110,115,0,111,114,116,104,111,95,115,99,97,108,101,0,100,114,97,119,115,105,122,101,0, +115,104,105,102,116,120,0,115,104,105,102,116,121,0,89,70,95,100,111,102,100,105,115,116,0,89,70,95,97,112,101,114, +116,117,114,101,0,89,70,95,98,107,104,116,121,112,101,0,89,70,95,98,107,104,98,105,97,115,0,89,70,95,98,107, +104,114,111,116,0,115,99,114,105,112,116,108,105,110,107,0,42,100,111,102,95,111,98,0,102,114,97,109,101,110,114,0, +102,114,97,109,101,115,0,111,102,102,115,101,116,0,115,102,114,97,0,102,105,101,95,105,109,97,0,99,121,99,108,0, +111,107,0,109,117,108,116,105,95,105,110,100,101,120,0,108,97,121,101,114,0,112,97,115,115,0,109,101,110,117,110,114, +0,105,98,117,102,115,0,42,103,112,117,116,101,120,116,117,114,101,0,42,97,110,105,109,0,42,114,114,0,115,111,117, +114,99,101,0,108,97,115,116,102,114,97,109,101,0,116,112,97,103,101,102,108,97,103,0,116,111,116,98,105,110,100,0, +120,114,101,112,0,121,114,101,112,0,116,119,115,116,97,0,116,119,101,110,100,0,98,105,110,100,99,111,100,101,0,42, +114,101,112,98,105,110,100,0,42,112,97,99,107,101,100,102,105,108,101,0,42,112,114,101,118,105,101,119,0,108,97,115, +116,117,112,100,97,116,101,0,108,97,115,116,117,115,101,100,0,97,110,105,109,115,112,101,101,100,0,103,101,110,95,120, +0,103,101,110,95,121,0,103,101,110,95,116,121,112,101,0,97,115,112,120,0,97,115,112,121,0,42,118,110,111,100,101, +0,116,101,120,99,111,0,109,97,112,116,111,0,109,97,112,116,111,110,101,103,0,98,108,101,110,100,116,121,112,101,0, +42,111,98,106,101,99,116,0,42,116,101,120,0,117,118,110,97,109,101,91,51,50,93,0,112,114,111,106,120,0,112,114, +111,106,121,0,112,114,111,106,122,0,109,97,112,112,105,110,103,0,111,102,115,91,51,93,0,115,105,122,101,91,51,93, +0,116,101,120,102,108,97,103,0,99,111,108,111,114,109,111,100,101,108,0,112,109,97,112,116,111,0,112,109,97,112,116, +111,110,101,103,0,110,111,114,109,97,112,115,112,97,99,101,0,119,104,105,99,104,95,111,117,116,112,117,116,0,112,97, +100,91,50,93,0,114,0,103,0,98,0,107,0,100,101,102,95,118,97,114,0,99,111,108,102,97,99,0,110,111,114,102, +97,99,0,118,97,114,102,97,99,0,100,105,115,112,102,97,99,0,119,97,114,112,102,97,99,0,110,97,109,101,91,49, +54,48,93,0,42,104,97,110,100,108,101,0,42,112,110,97,109,101,0,42,115,116,110,97,109,101,115,0,115,116,121,112, +101,115,0,118,97,114,115,0,42,118,97,114,115,116,114,0,42,114,101,115,117,108,116,0,42,99,102,114,97,0,100,97, +116,97,91,51,50,93,0,40,42,100,111,105,116,41,40,41,0,40,42,105,110,115,116,97,110,99,101,95,105,110,105,116, +41,40,41,0,40,42,99,97,108,108,98,97,99,107,41,40,41,0,118,101,114,115,105,111,110,0,97,0,105,112,111,116, +121,112,101,0,42,105,109,97,0,42,99,117,98,101,91,54,93,0,105,109,97,116,91,52,93,91,52,93,0,111,98,105, +109,97,116,91,51,93,91,51,93,0,115,116,121,112,101,0,118,105,101,119,115,99,97,108,101,0,110,111,116,108,97,121, +0,99,117,98,101,114,101,115,0,100,101,112,116,104,0,114,101,99,97,108,99,0,108,97,115,116,115,105,122,101,0,110, +111,105,115,101,115,105,122,101,0,116,117,114,98,117,108,0,98,114,105,103,104,116,0,99,111,110,116,114,97,115,116,0, +114,102,97,99,0,103,102,97,99,0,98,102,97,99,0,102,105,108,116,101,114,115,105,122,101,0,109,103,95,72,0,109, +103,95,108,97,99,117,110,97,114,105,116,121,0,109,103,95,111,99,116,97,118,101,115,0,109,103,95,111,102,102,115,101, +116,0,109,103,95,103,97,105,110,0,100,105,115,116,95,97,109,111,117,110,116,0,110,115,95,111,117,116,115,99,97,108, +101,0,118,110,95,119,49,0,118,110,95,119,50,0,118,110,95,119,51,0,118,110,95,119,52,0,118,110,95,109,101,120, +112,0,118,110,95,100,105,115,116,109,0,118,110,95,99,111,108,116,121,112,101,0,110,111,105,115,101,100,101,112,116,104, +0,110,111,105,115,101,116,121,112,101,0,110,111,105,115,101,98,97,115,105,115,0,110,111,105,115,101,98,97,115,105,115, +50,0,105,109,97,102,108,97,103,0,99,114,111,112,120,109,105,110,0,99,114,111,112,121,109,105,110,0,99,114,111,112, +120,109,97,120,0,99,114,111,112,121,109,97,120,0,120,114,101,112,101,97,116,0,121,114,101,112,101,97,116,0,101,120, +116,101,110,100,0,99,104,101,99,107,101,114,100,105,115,116,0,110,97,98,108,97,0,105,117,115,101,114,0,42,110,111, +100,101,116,114,101,101,0,42,112,108,117,103,105,110,0,42,99,111,98,97,0,42,101,110,118,0,117,115,101,95,110,111, +100,101,115,0,112,97,100,91,55,93,0,108,111,99,91,51,93,0,114,111,116,91,51,93,0,109,97,116,91,52,93,91, +52,93,0,109,105,110,91,51,93,0,109,97,120,91,51,93,0,112,97,100,51,0,109,111,100,101,0,116,111,116,101,120, +0,115,104,100,119,114,0,115,104,100,119,103,0,115,104,100,119,98,0,115,104,100,119,112,97,100,0,101,110,101,114,103, +121,0,100,105,115,116,0,115,112,111,116,115,105,122,101,0,115,112,111,116,98,108,101,110,100,0,104,97,105,110,116,0, +97,116,116,49,0,97,116,116,50,0,42,99,117,114,102,97,108,108,111,102,102,0,102,97,108,108,111,102,102,95,116,121, +112,101,0,115,104,97,100,115,112,111,116,115,105,122,101,0,98,105,97,115,0,115,111,102,116,0,98,117,102,115,105,122, +101,0,115,97,109,112,0,98,117,102,102,101,114,115,0,102,105,108,116,101,114,116,121,112,101,0,98,117,102,102,108,97, +103,0,98,117,102,116,121,112,101,0,114,97,121,95,115,97,109,112,0,114,97,121,95,115,97,109,112,121,0,114,97,121, +95,115,97,109,112,122,0,114,97,121,95,115,97,109,112,95,116,121,112,101,0,97,114,101,97,95,115,104,97,112,101,0, +97,114,101,97,95,115,105,122,101,0,97,114,101,97,95,115,105,122,101,121,0,97,114,101,97,95,115,105,122,101,122,0, +97,100,97,112,116,95,116,104,114,101,115,104,0,114,97,121,95,115,97,109,112,95,109,101,116,104,111,100,0,116,101,120, +97,99,116,0,115,104,97,100,104,97,108,111,115,116,101,112,0,115,117,110,95,101,102,102,101,99,116,95,116,121,112,101, +0,115,107,121,98,108,101,110,100,116,121,112,101,0,104,111,114,105,122,111,110,95,98,114,105,103,104,116,110,101,115,115, +0,115,112,114,101,97,100,0,115,117,110,95,98,114,105,103,104,116,110,101,115,115,0,115,117,110,95,115,105,122,101,0, +98,97,99,107,115,99,97,116,116,101,114,101,100,95,108,105,103,104,116,0,115,117,110,95,105,110,116,101,110,115,105,116, +121,0,97,116,109,95,116,117,114,98,105,100,105,116,121,0,97,116,109,95,105,110,115,99,97,116,116,101,114,105,110,103, +95,102,97,99,116,111,114,0,97,116,109,95,101,120,116,105,110,99,116,105,111,110,95,102,97,99,116,111,114,0,97,116, +109,95,100,105,115,116,97,110,99,101,95,102,97,99,116,111,114,0,115,107,121,98,108,101,110,100,102,97,99,0,115,107, +121,95,101,120,112,111,115,117,114,101,0,115,107,121,95,99,111,108,111,114,115,112,97,99,101,0,112,97,100,52,0,89, +70,95,110,117,109,112,104,111,116,111,110,115,0,89,70,95,110,117,109,115,101,97,114,99,104,0,89,70,95,112,104,100, +101,112,116,104,0,89,70,95,117,115,101,113,109,99,0,89,70,95,98,117,102,115,105,122,101,0,89,70,95,112,97,100, +0,89,70,95,99,97,117,115,116,105,99,98,108,117,114,0,89,70,95,108,116,114,97,100,105,117,115,0,89,70,95,103, +108,111,119,105,110,116,0,89,70,95,103,108,111,119,111,102,115,0,89,70,95,103,108,111,119,116,121,112,101,0,89,70, +95,112,97,100,50,0,42,109,116,101,120,91,49,56,93,0,115,112,101,99,114,0,115,112,101,99,103,0,115,112,101,99, +98,0,109,105,114,114,0,109,105,114,103,0,109,105,114,98,0,97,109,98,114,0,97,109,98,98,0,97,109,98,103,0, +97,109,98,0,101,109,105,116,0,97,110,103,0,115,112,101,99,116,114,97,0,114,97,121,95,109,105,114,114,111,114,0, +97,108,112,104,97,0,114,101,102,0,115,112,101,99,0,122,111,102,102,115,0,97,100,100,0,116,114,97,110,115,108,117, +99,101,110,99,121,0,102,114,101,115,110,101,108,95,109,105,114,0,102,114,101,115,110,101,108,95,109,105,114,95,105,0, +102,114,101,115,110,101,108,95,116,114,97,0,102,114,101,115,110,101,108,95,116,114,97,95,105,0,102,105,108,116,101,114, +0,116,120,95,108,105,109,105,116,0,116,120,95,102,97,108,108,111,102,102,0,114,97,121,95,100,101,112,116,104,0,114, +97,121,95,100,101,112,116,104,95,116,114,97,0,104,97,114,0,115,101,101,100,49,0,115,101,101,100,50,0,103,108,111, +115,115,95,109,105,114,0,103,108,111,115,115,95,116,114,97,0,115,97,109,112,95,103,108,111,115,115,95,109,105,114,0, +115,97,109,112,95,103,108,111,115,115,95,116,114,97,0,97,100,97,112,116,95,116,104,114,101,115,104,95,109,105,114,0, +97,100,97,112,116,95,116,104,114,101,115,104,95,116,114,97,0,97,110,105,115,111,95,103,108,111,115,115,95,109,105,114, +0,100,105,115,116,95,109,105,114,0,102,97,100,101,116,111,95,109,105,114,0,115,104,97,100,101,95,102,108,97,103,0, +109,111,100,101,95,108,0,102,108,97,114,101,99,0,115,116,97,114,99,0,108,105,110,101,99,0,114,105,110,103,99,0, +104,97,115,105,122,101,0,102,108,97,114,101,115,105,122,101,0,115,117,98,115,105,122,101,0,102,108,97,114,101,98,111, +111,115,116,0,115,116,114,97,110,100,95,115,116,97,0,115,116,114,97,110,100,95,101,110,100,0,115,116,114,97,110,100, +95,101,97,115,101,0,115,116,114,97,110,100,95,115,117,114,102,110,111,114,0,115,116,114,97,110,100,95,109,105,110,0, +115,116,114,97,110,100,95,119,105,100,116,104,102,97,100,101,0,115,116,114,97,110,100,95,117,118,110,97,109,101,91,51, +50,93,0,115,98,105,97,115,0,108,98,105,97,115,0,115,104,97,100,95,97,108,112,104,97,0,115,101,112,116,101,120, +0,114,103,98,115,101,108,0,112,114,95,116,121,112,101,0,112,114,95,98,97,99,107,0,112,114,95,108,97,109,112,0, +109,108,95,102,108,97,103,0,100,105,102,102,95,115,104,97,100,101,114,0,115,112,101,99,95,115,104,97,100,101,114,0, +114,111,117,103,104,110,101,115,115,0,114,101,102,114,97,99,0,112,97,114,97,109,91,52,93,0,114,109,115,0,100,97, +114,107,110,101,115,115,0,42,114,97,109,112,95,99,111,108,0,42,114,97,109,112,95,115,112,101,99,0,114,97,109,112, +105,110,95,99,111,108,0,114,97,109,112,105,110,95,115,112,101,99,0,114,97,109,112,98,108,101,110,100,95,99,111,108, +0,114,97,109,112,98,108,101,110,100,95,115,112,101,99,0,114,97,109,112,95,115,104,111,119,0,114,97,109,112,102,97, +99,95,99,111,108,0,114,97,109,112,102,97,99,95,115,112,101,99,0,42,103,114,111,117,112,0,102,114,105,99,116,105, +111,110,0,102,104,0,114,101,102,108,101,99,116,0,102,104,100,105,115,116,0,120,121,102,114,105,99,116,0,100,121,110, +97,109,111,100,101,0,115,115,115,95,114,97,100,105,117,115,91,51,93,0,115,115,115,95,99,111,108,91,51,93,0,115, +115,115,95,101,114,114,111,114,0,115,115,115,95,115,99,97,108,101,0,115,115,115,95,105,111,114,0,115,115,115,95,99, +111,108,102,97,99,0,115,115,115,95,116,101,120,102,97,99,0,115,115,115,95,102,114,111,110,116,0,115,115,115,95,98, +97,99,107,0,115,115,115,95,102,108,97,103,0,115,115,115,95,112,114,101,115,101,116,0,89,70,95,97,114,0,89,70, +95,97,103,0,89,70,95,97,98,0,89,70,95,100,115,99,97,108,101,0,89,70,95,100,112,119,114,0,89,70,95,100, +115,109,112,0,89,70,95,112,114,101,115,101,116,0,89,70,95,100,106,105,116,0,103,112,117,109,97,116,101,114,105,97, +108,0,110,97,109,101,91,50,53,54,93,0,115,99,97,108,101,0,42,98,98,0,105,49,0,106,49,0,107,49,0,105, +50,0,106,50,0,107,50,0,115,101,108,99,111,108,49,0,115,101,108,99,111,108,50,0,113,117,97,116,91,52,93,0, +101,120,112,120,0,101,120,112,121,0,101,120,112,122,0,114,97,100,0,114,97,100,50,0,115,0,42,109,97,116,0,42, +105,109,97,116,0,101,108,101,109,115,0,100,105,115,112,0,42,42,109,97,116,0,116,111,116,99,111,108,0,119,105,114, +101,115,105,122,101,0,114,101,110,100,101,114,115,105,122,101,0,116,104,114,101,115,104,0,118,101,99,91,51,93,91,51, +93,0,97,108,102,97,0,119,101,105,103,104,116,0,114,97,100,105,117,115,0,104,49,0,104,50,0,102,49,0,102,50, +0,102,51,0,104,105,100,101,0,118,101,99,91,52,93,0,109,97,116,95,110,114,0,112,110,116,115,117,0,112,110,116, +115,118,0,114,101,115,111,108,117,0,114,101,115,111,108,118,0,111,114,100,101,114,117,0,111,114,100,101,114,118,0,102, +108,97,103,117,0,102,108,97,103,118,0,42,107,110,111,116,115,117,0,42,107,110,111,116,115,118,0,116,105,108,116,95, +105,110,116,101,114,112,0,114,97,100,105,117,115,95,105,110,116,101,114,112,0,99,104,97,114,105,100,120,0,107,101,114, +110,0,104,0,110,117,114,98,0,42,98,101,118,111,98,106,0,42,116,97,112,101,114,111,98,106,0,42,116,101,120,116, +111,110,99,117,114,118,101,0,42,112,97,116,104,0,42,107,101,121,0,98,101,118,0,112,97,116,104,108,101,110,0,98, +101,118,114,101,115,111,108,0,119,105,100,116,104,0,101,120,116,49,0,101,120,116,50,0,114,101,115,111,108,117,95,114, +101,110,0,114,101,115,111,108,118,95,114,101,110,0,115,112,97,99,101,109,111,100,101,0,115,112,97,99,105,110,103,0, +108,105,110,101,100,105,115,116,0,115,104,101,97,114,0,102,115,105,122,101,0,119,111,114,100,115,112,97,99,101,0,117, +108,112,111,115,0,117,108,104,101,105,103,104,116,0,120,111,102,0,121,111,102,0,108,105,110,101,119,105,100,116,104,0, +42,115,116,114,0,102,97,109,105,108,121,91,50,52,93,0,42,118,102,111,110,116,0,42,118,102,111,110,116,98,0,42, +118,102,111,110,116,105,0,42,118,102,111,110,116,98,105,0,115,101,112,99,104,97,114,0,116,111,116,98,111,120,0,97, +99,116,98,111,120,0,42,116,98,0,115,101,108,115,116,97,114,116,0,115,101,108,101,110,100,0,42,115,116,114,105,110, +102,111,0,99,117,114,105,110,102,111,0,101,102,102,101,99,116,0,42,109,102,97,99,101,0,42,109,116,102,97,99,101, +0,42,116,102,97,99,101,0,42,109,118,101,114,116,0,42,109,101,100,103,101,0,42,100,118,101,114,116,0,42,109,99, +111,108,0,42,109,115,116,105,99,107,121,0,42,116,101,120,99,111,109,101,115,104,0,42,109,115,101,108,101,99,116,0, +118,100,97,116,97,0,101,100,97,116,97,0,102,100,97,116,97,0,116,111,116,101,100,103,101,0,116,111,116,102,97,99, +101,0,116,111,116,115,101,108,101,99,116,0,97,99,116,95,102,97,99,101,0,99,117,98,101,109,97,112,115,105,122,101, +0,115,109,111,111,116,104,114,101,115,104,0,115,117,98,100,105,118,0,115,117,98,100,105,118,114,0,115,117,98,115,117, +114,102,116,121,112,101,0,42,109,114,0,42,112,118,0,42,116,112,97,103,101,0,117,118,91,52,93,91,50,93,0,99, +111,108,91,52,93,0,116,114,97,110,115,112,0,116,105,108,101,0,117,110,119,114,97,112,0,118,49,0,118,50,0,118, +51,0,118,52,0,101,100,99,111,100,101,0,99,114,101,97,115,101,0,98,119,101,105,103,104,116,0,100,101,102,95,110, +114,0,42,100,119,0,116,111,116,119,101,105,103,104,116,0,99,111,91,51,93,0,110,111,91,51,93,0,112,97,100,91, +51,93,0,117,118,91,50,93,0,99,111,91,50,93,0,105,110,100,101,120,0,102,0,105,0,115,91,50,53,54,93,0, +118,91,52,93,0,109,105,100,0,118,91,50,93,0,42,102,97,99,101,115,0,42,99,111,108,102,97,99,101,115,0,42, +101,100,103,101,115,0,42,101,100,103,101,95,98,111,117,110,100,97,114,121,95,115,116,97,116,101,115,0,42,118,101,114, +116,95,101,100,103,101,95,109,97,112,0,42,118,101,114,116,95,102,97,99,101,95,109,97,112,0,42,109,97,112,95,109, +101,109,0,42,118,101,114,116,115,0,108,101,118,101,108,115,0,108,101,118,101,108,95,99,111,117,110,116,0,99,117,114, +114,101,110,116,0,110,101,119,108,118,108,0,101,100,103,101,108,118,108,0,112,105,110,108,118,108,0,114,101,110,100,101, +114,108,118,108,0,117,115,101,95,99,111,108,0,42,101,100,103,101,95,102,108,97,103,115,0,42,101,100,103,101,95,99, +114,101,97,115,101,115,0,42,118,101,114,116,95,109,97,112,0,42,101,100,103,101,95,109,97,112,0,42,111,108,100,95, +102,97,99,101,115,0,42,111,108,100,95,101,100,103,101,115,0,42,101,114,114,111,114,0,109,111,100,105,102,105,101,114, +0,115,117,98,100,105,118,84,121,112,101,0,114,101,110,100,101,114,76,101,118,101,108,115,0,42,101,109,67,97,99,104, +101,0,42,109,67,97,99,104,101,0,100,101,102,97,120,105,115,0,112,97,100,91,54,93,0,108,101,110,103,116,104,0, +114,97,110,100,111,109,105,122,101,0,115,101,101,100,0,42,111,98,95,97,114,109,0,42,115,116,97,114,116,95,99,97, +112,0,42,101,110,100,95,99,97,112,0,42,99,117,114,118,101,95,111,98,0,42,111,102,102,115,101,116,95,111,98,0, +111,102,102,115,101,116,91,51,93,0,115,99,97,108,101,91,51,93,0,109,101,114,103,101,95,100,105,115,116,0,102,105, +116,95,116,121,112,101,0,111,102,102,115,101,116,95,116,121,112,101,0,99,111,117,110,116,0,97,120,105,115,0,116,111, +108,101,114,97,110,99,101,0,42,109,105,114,114,111,114,95,111,98,0,115,112,108,105,116,95,97,110,103,108,101,0,118, +97,108,117,101,0,114,101,115,0,118,97,108,95,102,108,97,103,115,0,108,105,109,95,102,108,97,103,115,0,101,95,102, +108,97,103,115,0,98,101,118,101,108,95,97,110,103,108,101,0,100,101,102,103,114,112,95,110,97,109,101,91,51,50,93, +0,42,116,101,120,116,117,114,101,0,115,116,114,101,110,103,116,104,0,100,105,114,101,99,116,105,111,110,0,109,105,100, +108,101,118,101,108,0,116,101,120,109,97,112,112,105,110,103,0,42,109,97,112,95,111,98,106,101,99,116,0,117,118,108, +97,121,101,114,95,110,97,109,101,91,51,50,93,0,117,118,108,97,121,101,114,95,116,109,112,0,42,112,114,111,106,101, +99,116,111,114,115,91,49,48,93,0,42,105,109,97,103,101,0,110,117,109,95,112,114,111,106,101,99,116,111,114,115,0, +97,115,112,101,99,116,120,0,97,115,112,101,99,116,121,0,112,101,114,99,101,110,116,0,102,97,99,101,67,111,117,110, +116,0,102,97,99,0,114,101,112,101,97,116,0,42,111,98,106,101,99,116,99,101,110,116,101,114,0,115,116,97,114,116, +120,0,115,116,97,114,116,121,0,104,101,105,103,104,116,0,110,97,114,114,111,119,0,115,112,101,101,100,0,100,97,109, +112,0,102,97,108,108,111,102,102,0,116,105,109,101,111,102,102,115,0,108,105,102,101,116,105,109,101,0,100,101,102,111, +114,109,102,108,97,103,0,109,117,108,116,105,0,42,112,114,101,118,67,111,115,0,112,97,114,101,110,116,105,110,118,91, +52,93,91,52,93,0,99,101,110,116,91,51,93,0,42,105,110,100,101,120,97,114,0,116,111,116,105,110,100,101,120,0, +102,111,114,99,101,0,42,99,108,111,116,104,79,98,106,101,99,116,0,42,115,105,109,95,112,97,114,109,115,0,42,99, +111,108,108,95,112,97,114,109,115,0,42,112,111,105,110,116,95,99,97,99,104,101,0,42,120,0,42,120,110,101,119,0, +42,120,111,108,100,0,42,99,117,114,114,101,110,116,95,120,110,101,119,0,42,99,117,114,114,101,110,116,95,120,0,42, +99,117,114,114,101,110,116,95,118,0,42,109,102,97,99,101,115,0,110,117,109,118,101,114,116,115,0,110,117,109,102,97, +99,101,115,0,97,98,115,111,114,112,116,105,111,110,0,116,105,109,101,0,42,98,118,104,116,114,101,101,0,42,100,109, +0,111,112,101,114,97,116,105,111,110,0,118,101,114,116,101,120,0,116,111,116,105,110,102,108,117,101,110,99,101,0,103, +114,105,100,115,105,122,101,0,110,101,101,100,98,105,110,100,0,42,98,105,110,100,119,101,105,103,104,116,115,0,42,98, +105,110,100,99,111,115,0,116,111,116,99,97,103,101,118,101,114,116,0,42,100,121,110,103,114,105,100,0,42,100,121,110, +105,110,102,108,117,101,110,99,101,115,0,42,100,121,110,118,101,114,116,115,0,42,112,97,100,50,0,100,121,110,103,114, +105,100,115,105,122,101,0,100,121,110,99,101,108,108,109,105,110,91,51,93,0,100,121,110,99,101,108,108,119,105,100,116, +104,0,98,105,110,100,109,97,116,91,52,93,91,52,93,0,42,112,115,121,115,0,116,111,116,100,109,118,101,114,116,0, +116,111,116,100,109,101,100,103,101,0,116,111,116,100,109,102,97,99,101,0,112,115,121,115,0,114,116,91,50,93,0,42, +102,97,99,101,112,97,0,118,103,114,111,117,112,0,112,114,111,116,101,99,116,0,42,102,115,115,0,42,116,97,114,103, +101,116,0,42,97,117,120,84,97,114,103,101,116,0,118,103,114,111,117,112,95,110,97,109,101,91,51,50,93,0,107,101, +101,112,68,105,115,116,0,115,104,114,105,110,107,84,121,112,101,0,115,104,114,105,110,107,79,112,116,115,0,112,114,111, +106,65,120,105,115,0,115,117,98,115,117,114,102,76,101,118,101,108,115,0,42,111,114,105,103,105,110,0,102,97,99,116, +111,114,0,108,105,109,105,116,91,50,93,0,111,114,105,103,105,110,79,112,116,115,0,112,110,116,115,119,0,111,112,110, +116,115,117,0,111,112,110,116,115,118,0,111,112,110,116,115,119,0,116,121,112,101,117,0,116,121,112,101,118,0,116,121, +112,101,119,0,102,117,0,102,118,0,102,119,0,100,117,0,100,118,0,100,119,0,42,100,101,102,0,118,101,99,91,56, +93,91,51,93,0,112,97,114,116,121,112,101,0,112,97,114,49,0,112,97,114,50,0,112,97,114,51,0,112,97,114,115, +117,98,115,116,114,91,51,50,93,0,42,116,114,97,99,107,0,42,112,114,111,120,121,0,42,112,114,111,120,121,95,103, +114,111,117,112,0,42,112,114,111,120,121,95,102,114,111,109,0,42,97,99,116,105,111,110,0,42,112,111,115,101,108,105, +98,0,42,112,111,115,101,0,99,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,115,0,100,101,102,98,97, +115,101,0,109,111,100,105,102,105,101,114,115,0,100,108,111,99,91,51,93,0,111,114,105,103,91,51,93,0,100,115,105, +122,101,91,51,93,0,100,114,111,116,91,51,93,0,111,98,109,97,116,91,52,93,91,52,93,0,99,111,110,115,116,105, +110,118,91,52,93,91,52,93,0,108,97,121,0,99,111,108,98,105,116,115,0,116,114,97,110,115,102,108,97,103,0,105, +112,111,102,108,97,103,0,116,114,97,99,107,102,108,97,103,0,117,112,102,108,97,103,0,110,108,97,102,108,97,103,0, +112,114,111,116,101,99,116,102,108,97,103,0,105,112,111,119,105,110,0,115,99,97,102,108,97,103,0,115,99,97,118,105, +115,102,108,97,103,0,98,111,117,110,100,116,121,112,101,0,100,117,112,111,110,0,100,117,112,111,102,102,0,100,117,112, +115,116,97,0,100,117,112,101,110,100,0,115,102,0,99,116,105,109,101,0,109,97,115,115,0,100,97,109,112,105,110,103, +0,105,110,101,114,116,105,97,0,102,111,114,109,102,97,99,116,111,114,0,114,100,97,109,112,105,110,103,0,115,105,122, +101,102,97,99,0,109,97,114,103,105,110,0,109,97,120,95,118,101,108,0,109,105,110,95,118,101,108,0,109,95,99,111, +110,116,97,99,116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,100,116,0,100,116,120,0, +97,99,116,99,111,108,0,101,109,112,116,121,95,100,114,97,119,116,121,112,101,0,112,97,100,49,91,51,93,0,101,109, +112,116,121,95,100,114,97,119,115,105,122,101,0,100,117,112,102,97,99,101,115,99,97,0,112,114,111,112,0,115,101,110, +115,111,114,115,0,99,111,110,116,114,111,108,108,101,114,115,0,97,99,116,117,97,116,111,114,115,0,98,98,115,105,122, +101,91,51,93,0,97,99,116,100,101,102,0,103,97,109,101,102,108,97,103,0,103,97,109,101,102,108,97,103,50,0,42, +98,115,111,102,116,0,115,111,102,116,102,108,97,103,0,97,110,105,115,111,116,114,111,112,105,99,70,114,105,99,116,105, +111,110,91,51,93,0,99,111,110,115,116,114,97,105,110,116,115,0,110,108,97,115,116,114,105,112,115,0,104,111,111,107, +115,0,112,97,114,116,105,99,108,101,115,121,115,116,101,109,0,42,112,100,0,42,115,111,102,116,0,42,100,117,112,95, +103,114,111,117,112,0,102,108,117,105,100,115,105,109,70,108,97,103,0,114,101,115,116,114,105,99,116,102,108,97,103,0, +115,104,97,112,101,110,114,0,115,104,97,112,101,102,108,97,103,0,114,101,99,97,108,99,111,0,98,111,100,121,95,116, +121,112,101,0,42,102,108,117,105,100,115,105,109,83,101,116,116,105,110,103,115,0,42,100,101,114,105,118,101,100,68,101, +102,111,114,109,0,42,100,101,114,105,118,101,100,70,105,110,97,108,0,108,97,115,116,68,97,116,97,77,97,115,107,0, +115,116,97,116,101,0,105,110,105,116,95,115,116,97,116,101,0,103,112,117,108,97,109,112,0,99,117,114,105,110,100,101, +120,0,97,99,116,105,118,101,0,100,101,102,108,101,99,116,0,102,111,114,99,101,102,105,101,108,100,0,112,100,101,102, +95,100,97,109,112,0,112,100,101,102,95,114,100,97,109,112,0,112,100,101,102,95,112,101,114,109,0,112,100,101,102,95, +102,114,105,99,116,0,112,100,101,102,95,114,102,114,105,99,116,0,102,95,115,116,114,101,110,103,116,104,0,102,95,112, +111,119,101,114,0,102,95,100,105,115,116,0,102,95,100,97,109,112,0,109,97,120,100,105,115,116,0,109,105,110,100,105, +115,116,0,109,97,120,114,97,100,0,109,105,110,114,97,100,0,102,95,112,111,119,101,114,95,114,0,112,100,101,102,95, +115,98,100,97,109,112,0,112,100,101,102,95,115,98,105,102,116,0,112,100,101,102,95,115,98,111,102,116,0,99,108,117, +109,112,95,102,97,99,0,99,108,117,109,112,95,112,111,119,0,107,105,110,107,95,102,114,101,113,0,107,105,110,107,95, +115,104,97,112,101,0,107,105,110,107,95,97,109,112,0,102,114,101,101,95,101,110,100,0,116,101,120,95,110,97,98,108, +97,0,116,101,120,95,109,111,100,101,0,107,105,110,107,0,107,105,110,107,95,97,120,105,115,0,114,116,50,0,42,114, +110,103,0,102,95,110,111,105,115,101,0,115,105,109,102,114,97,109,101,0,115,116,97,114,116,102,114,97,109,101,0,101, +110,100,102,114,97,109,101,0,101,100,105,116,102,114,97,109,101,0,108,105,110,83,116,105,102,102,0,97,110,103,83,116, +105,102,102,0,118,111,108,117,109,101,0,118,105,116,101,114,97,116,105,111,110,115,0,112,105,116,101,114,97,116,105,111, +110,115,0,100,105,116,101,114,97,116,105,111,110,115,0,99,105,116,101,114,97,116,105,111,110,115,0,107,83,82,72,82, +95,67,76,0,107,83,75,72,82,95,67,76,0,107,83,83,72,82,95,67,76,0,107,83,82,95,83,80,76,84,95,67, +76,0,107,83,75,95,83,80,76,84,95,67,76,0,107,83,83,95,83,80,76,84,95,67,76,0,107,86,67,70,0,107, +68,80,0,107,68,71,0,107,76,70,0,107,80,82,0,107,86,67,0,107,68,70,0,107,77,84,0,107,67,72,82,0, +107,75,72,82,0,107,83,72,82,0,107,65,72,82,0,99,111,108,108,105,115,105,111,110,102,108,97,103,115,0,110,117, +109,99,108,117,115,116,101,114,105,116,101,114,97,116,105,111,110,115,0,119,101,108,100,105,110,103,0,42,112,97,114,116, +105,99,108,101,115,0,116,111,116,112,111,105,110,116,0,116,111,116,115,112,114,105,110,103,0,42,98,112,111,105,110,116, +0,42,98,115,112,114,105,110,103,0,109,115,103,95,108,111,99,107,0,109,115,103,95,118,97,108,117,101,0,110,111,100, +101,109,97,115,115,0,110,97,109,101,100,86,71,95,77,97,115,115,91,51,50,93,0,103,114,97,118,0,109,101,100,105, +97,102,114,105,99,116,0,114,107,108,105,109,105,116,0,112,104,121,115,105,99,115,95,115,112,101,101,100,0,103,111,97, +108,115,112,114,105,110,103,0,103,111,97,108,102,114,105,99,116,0,109,105,110,103,111,97,108,0,109,97,120,103,111,97, +108,0,100,101,102,103,111,97,108,0,118,101,114,116,103,114,111,117,112,0,110,97,109,101,100,86,71,95,83,111,102,116, +103,111,97,108,91,51,50,93,0,102,117,122,122,121,110,101,115,115,0,105,110,115,112,114,105,110,103,0,105,110,102,114, +105,99,116,0,110,97,109,101,100,86,71,95,83,112,114,105,110,103,95,75,91,51,50,93,0,101,102,114,97,0,105,110, +116,101,114,118,97,108,0,108,111,99,97,108,0,115,111,108,118,101,114,102,108,97,103,115,0,42,42,107,101,121,115,0, +116,111,116,112,111,105,110,116,107,101,121,0,115,101,99,111,110,100,115,112,114,105,110,103,0,99,111,108,98,97,108,108, +0,98,97,108,108,100,97,109,112,0,98,97,108,108,115,116,105,102,102,0,115,98,99,95,109,111,100,101,0,97,101,114, +111,101,100,103,101,0,109,105,110,108,111,111,112,115,0,109,97,120,108,111,111,112,115,0,99,104,111,107,101,0,115,111, +108,118,101,114,95,73,68,0,112,108,97,115,116,105,99,0,115,112,114,105,110,103,112,114,101,108,111,97,100,0,42,115, +99,114,97,116,99,104,0,115,104,101,97,114,115,116,105,102,102,0,105,110,112,117,115,104,0,42,112,111,105,110,116,99, +97,99,104,101,0,115,104,111,119,95,97,100,118,97,110,99,101,100,111,112,116,105,111,110,115,0,114,101,115,111,108,117, +116,105,111,110,120,121,122,0,112,114,101,118,105,101,119,114,101,115,120,121,122,0,114,101,97,108,115,105,122,101,0,103, +117,105,68,105,115,112,108,97,121,77,111,100,101,0,114,101,110,100,101,114,68,105,115,112,108,97,121,77,111,100,101,0, +118,105,115,99,111,115,105,116,121,86,97,108,117,101,0,118,105,115,99,111,115,105,116,121,77,111,100,101,0,118,105,115, +99,111,115,105,116,121,69,120,112,111,110,101,110,116,0,103,114,97,118,120,0,103,114,97,118,121,0,103,114,97,118,122, +0,97,110,105,109,83,116,97,114,116,0,97,110,105,109,69,110,100,0,103,115,116,97,114,0,109,97,120,82,101,102,105, +110,101,0,105,110,105,86,101,108,120,0,105,110,105,86,101,108,121,0,105,110,105,86,101,108,122,0,42,111,114,103,77, +101,115,104,0,42,109,101,115,104,83,117,114,102,97,99,101,0,42,109,101,115,104,66,66,0,115,117,114,102,100,97,116, +97,80,97,116,104,91,50,52,48,93,0,98,98,83,116,97,114,116,91,51,93,0,98,98,83,105,122,101,91,51,93,0, +116,121,112,101,70,108,97,103,115,0,100,111,109,97,105,110,78,111,118,101,99,103,101,110,0,118,111,108,117,109,101,73, +110,105,116,84,121,112,101,0,112,97,114,116,83,108,105,112,86,97,108,117,101,0,103,101,110,101,114,97,116,101,84,114, +97,99,101,114,115,0,103,101,110,101,114,97,116,101,80,97,114,116,105,99,108,101,115,0,115,117,114,102,97,99,101,83, +109,111,111,116,104,105,110,103,0,115,117,114,102,97,99,101,83,117,98,100,105,118,115,0,112,97,114,116,105,99,108,101, +73,110,102,83,105,122,101,0,112,97,114,116,105,99,108,101,73,110,102,65,108,112,104,97,0,102,97,114,70,105,101,108, +100,83,105,122,101,0,42,109,101,115,104,83,117,114,102,78,111,114,109,97,108,115,0,99,112,115,84,105,109,101,83,116, +97,114,116,0,99,112,115,84,105,109,101,69,110,100,0,99,112,115,81,117,97,108,105,116,121,0,97,116,116,114,97,99, +116,102,111,114,99,101,83,116,114,101,110,103,116,104,0,97,116,116,114,97,99,116,102,111,114,99,101,82,97,100,105,117, +115,0,118,101,108,111,99,105,116,121,102,111,114,99,101,83,116,114,101,110,103,116,104,0,118,101,108,111,99,105,116,121, +102,111,114,99,101,82,97,100,105,117,115,0,108,97,115,116,103,111,111,100,102,114,97,109,101,0,109,105,115,116,121,112, +101,0,104,111,114,114,0,104,111,114,103,0,104,111,114,98,0,104,111,114,107,0,122,101,110,114,0,122,101,110,103,0, +122,101,110,98,0,122,101,110,107,0,97,109,98,107,0,102,97,115,116,99,111,108,0,101,120,112,111,115,117,114,101,0, +101,120,112,0,114,97,110,103,101,0,108,105,110,102,97,99,0,108,111,103,102,97,99,0,103,114,97,118,105,116,121,0, +97,99,116,105,118,105,116,121,66,111,120,82,97,100,105,117,115,0,115,107,121,116,121,112,101,0,111,99,99,108,117,115, +105,111,110,82,101,115,0,112,104,121,115,105,99,115,69,110,103,105,110,101,0,116,105,99,114,97,116,101,0,109,97,120, +108,111,103,105,99,115,116,101,112,0,112,104,121,115,117,98,115,116,101,112,0,109,97,120,112,104,121,115,116,101,112,0, +109,105,115,105,0,109,105,115,116,115,116,97,0,109,105,115,116,100,105,115,116,0,109,105,115,116,104,105,0,115,116,97, +114,114,0,115,116,97,114,103,0,115,116,97,114,98,0,115,116,97,114,107,0,115,116,97,114,115,105,122,101,0,115,116, +97,114,109,105,110,100,105,115,116,0,115,116,97,114,100,105,115,116,0,115,116,97,114,99,111,108,110,111,105,115,101,0, +100,111,102,115,116,97,0,100,111,102,101,110,100,0,100,111,102,109,105,110,0,100,111,102,109,97,120,0,97,111,100,105, +115,116,0,97,111,100,105,115,116,102,97,99,0,97,111,101,110,101,114,103,121,0,97,111,98,105,97,115,0,97,111,109, +111,100,101,0,97,111,115,97,109,112,0,97,111,109,105,120,0,97,111,99,111,108,111,114,0,97,111,95,97,100,97,112, +116,95,116,104,114,101,115,104,0,97,111,95,97,100,97,112,116,95,115,112,101,101,100,95,102,97,99,0,97,111,95,97, +112,112,114,111,120,95,101,114,114,111,114,0,97,111,95,97,112,112,114,111,120,95,99,111,114,114,101,99,116,105,111,110, +0,97,111,95,115,97,109,112,95,109,101,116,104,111,100,0,97,111,95,103,97,116,104,101,114,95,109,101,116,104,111,100, +0,97,111,95,97,112,112,114,111,120,95,112,97,115,115,101,115,0,42,97,111,115,112,104,101,114,101,0,42,97,111,116, +97,98,108,101,115,0,104,101,109,105,114,101,115,0,109,97,120,105,116,101,114,0,100,114,97,119,116,121,112,101,0,115, +117,98,115,104,111,111,116,112,0,115,117,98,115,104,111,111,116,101,0,110,111,100,101,108,105,109,0,109,97,120,115,117, +98,108,97,109,112,0,112,97,109,97,0,112,97,109,105,0,101,108,109,97,0,101,108,109,105,0,109,97,120,110,111,100, +101,0,99,111,110,118,101,114,103,101,110,99,101,0,114,97,100,102,97,99,0,103,97,109,109,97,0,115,101,108,99,111, +108,0,115,120,0,115,121,0,42,108,112,70,111,114,109,97,116,0,42,108,112,80,97,114,109,115,0,99,98,70,111,114, +109,97,116,0,99,98,80,97,114,109,115,0,102,99,99,84,121,112,101,0,102,99,99,72,97,110,100,108,101,114,0,100, +119,75,101,121,70,114,97,109,101,69,118,101,114,121,0,100,119,81,117,97,108,105,116,121,0,100,119,66,121,116,101,115, +80,101,114,83,101,99,111,110,100,0,100,119,70,108,97,103,115,0,100,119,73,110,116,101,114,108,101,97,118,101,69,118, +101,114,121,0,97,118,105,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,42,99,100,80,97,114,109,115,0,42, +112,97,100,0,99,100,83,105,122,101,0,113,116,99,111,100,101,99,110,97,109,101,91,49,50,56,93,0,99,111,100,101, +99,0,97,117,100,105,111,95,99,111,100,101,99,0,118,105,100,101,111,95,98,105,116,114,97,116,101,0,97,117,100,105, +111,95,98,105,116,114,97,116,101,0,103,111,112,95,115,105,122,101,0,114,99,95,109,105,110,95,114,97,116,101,0,114, +99,95,109,97,120,95,114,97,116,101,0,114,99,95,98,117,102,102,101,114,95,115,105,122,101,0,109,117,120,95,112,97, +99,107,101,116,95,115,105,122,101,0,109,117,120,95,114,97,116,101,0,109,105,120,114,97,116,101,0,109,97,105,110,0, +42,109,97,116,95,111,118,101,114,114,105,100,101,0,42,108,105,103,104,116,95,111,118,101,114,114,105,100,101,0,108,97, +121,95,122,109,97,115,107,0,108,97,121,102,108,97,103,0,112,97,115,115,102,108,97,103,0,112,97,115,115,95,120,111, +114,0,42,97,118,105,99,111,100,101,99,100,97,116,97,0,42,113,116,99,111,100,101,99,100,97,116,97,0,102,102,99, +111,100,101,99,100,97,116,97,0,99,102,114,97,0,112,115,102,114,97,0,112,101,102,114,97,0,105,109,97,103,101,115, +0,102,114,97,109,97,112,116,111,0,116,104,114,101,97,100,115,0,102,114,97,109,101,108,101,110,0,98,108,117,114,102, +97,99,0,101,100,103,101,82,0,101,100,103,101,71,0,101,100,103,101,66,0,102,117,108,108,115,99,114,101,101,110,0, +120,112,108,97,121,0,121,112,108,97,121,0,102,114,101,113,112,108,97,121,0,97,116,116,114,105,98,0,114,116,49,0, +115,116,101,114,101,111,109,111,100,101,0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116,0,109,97,120,105, +109,115,105,122,101,0,120,115,99,104,0,121,115,99,104,0,120,112,97,114,116,115,0,121,112,97,114,116,115,0,119,105, +110,112,111,115,0,112,108,97,110,101,115,0,105,109,116,121,112,101,0,115,117,98,105,109,116,121,112,101,0,113,117,97, +108,105,116,121,0,114,112,97,100,0,114,112,97,100,49,0,114,112,97,100,50,0,115,99,101,109,111,100,101,0,114,101, +110,100,101,114,101,114,0,111,99,114,101,115,0,97,108,112,104,97,109,111,100,101,0,111,115,97,0,102,114,115,95,115, +101,99,0,101,100,103,101,105,110,116,0,115,97,102,101,116,121,0,98,111,114,100,101,114,0,100,105,115,112,114,101,99, +116,0,108,97,121,101,114,115,0,97,99,116,108,97,121,0,120,97,115,112,0,121,97,115,112,0,102,114,115,95,115,101, +99,95,98,97,115,101,0,103,97,117,115,115,0,112,111,115,116,109,117,108,0,112,111,115,116,103,97,109,109,97,0,112, +111,115,116,104,117,101,0,112,111,115,116,115,97,116,0,100,105,116,104,101,114,95,105,110,116,101,110,115,105,116,121,0, +98,97,107,101,95,111,115,97,0,98,97,107,101,95,102,105,108,116,101,114,0,98,97,107,101,95,109,111,100,101,0,98, +97,107,101,95,102,108,97,103,0,98,97,107,101,95,110,111,114,109,97,108,95,115,112,97,99,101,0,98,97,107,101,95, +113,117,97,100,95,115,112,108,105,116,0,98,97,107,101,95,109,97,120,100,105,115,116,0,98,97,107,101,95,98,105,97, +115,100,105,115,116,0,98,97,107,101,95,112,97,100,0,71,73,113,117,97,108,105,116,121,0,71,73,99,97,99,104,101, +0,71,73,109,101,116,104,111,100,0,71,73,112,104,111,116,111,110,115,0,71,73,100,105,114,101,99,116,0,89,70,95, +65,65,0,89,70,101,120,112,111,114,116,120,109,108,0,89,70,95,110,111,98,117,109,112,0,89,70,95,99,108,97,109, +112,114,103,98,0,121,102,112,97,100,49,0,71,73,100,101,112,116,104,0,71,73,99,97,117,115,100,101,112,116,104,0, +71,73,112,105,120,101,108,115,112,101,114,115,97,109,112,108,101,0,71,73,112,104,111,116,111,110,99,111,117,110,116,0, +71,73,109,105,120,112,104,111,116,111,110,115,0,71,73,112,104,111,116,111,110,114,97,100,105,117,115,0,89,70,95,114, +97,121,100,101,112,116,104,0,89,70,95,65,65,112,97,115,115,101,115,0,89,70,95,65,65,115,97,109,112,108,101,115, +0,121,102,112,97,100,50,0,71,73,115,104,97,100,111,119,113,117,97,108,105,116,121,0,71,73,114,101,102,105,110,101, +109,101,110,116,0,71,73,112,111,119,101,114,0,71,73,105,110,100,105,114,112,111,119,101,114,0,89,70,95,103,97,109, +109,97,0,89,70,95,101,120,112,111,115,117,114,101,0,89,70,95,114,97,121,98,105,97,115,0,89,70,95,65,65,112, +105,120,101,108,115,105,122,101,0,89,70,95,65,65,116,104,114,101,115,104,111,108,100,0,98,97,99,107,98,117,102,91, +49,54,48,93,0,112,105,99,91,49,54,48,93,0,115,116,97,109,112,0,115,116,97,109,112,95,102,111,110,116,95,105, +100,0,115,116,97,109,112,95,117,100,97,116,97,91,49,54,48,93,0,102,103,95,115,116,97,109,112,91,52,93,0,98, +103,95,115,116,97,109,112,91,52,93,0,115,105,109,112,108,105,102,121,95,115,117,98,115,117,114,102,0,115,105,109,112, +108,105,102,121,95,115,104,97,100,111,119,115,97,109,112,108,101,115,0,115,105,109,112,108,105,102,121,95,112,97,114,116, +105,99,108,101,115,0,115,105,109,112,108,105,102,121,95,97,111,115,115,115,0,99,105,110,101,111,110,119,104,105,116,101, +0,99,105,110,101,111,110,98,108,97,99,107,0,99,105,110,101,111,110,103,97,109,109,97,0,106,112,50,95,112,114,101, +115,101,116,0,106,112,50,95,100,101,112,116,104,0,114,112,97,100,51,0,100,111,109,101,114,101,115,0,100,111,109,101, +109,111,100,101,0,100,111,109,101,97,110,103,108,101,0,100,111,109,101,116,105,108,116,0,100,111,109,101,114,101,115,98, +117,102,0,42,100,111,109,101,116,101,120,116,0,112,97,114,116,105,99,108,101,95,112,101,114,99,0,115,117,98,115,117, +114,102,95,109,97,120,0,115,104,97,100,98,117,102,115,97,109,112,108,101,95,109,97,120,0,97,111,95,101,114,114,111, +114,0,99,111,108,91,51,93,0,102,114,97,109,101,0,110,97,109,101,91,54,52,93,0,42,98,114,117,115,104,0,116, +111,111,108,0,115,101,97,109,95,98,108,101,101,100,0,110,111,114,109,97,108,95,97,110,103,108,101,0,115,116,101,112, +0,105,110,118,101,114,116,0,116,111,116,114,101,107,101,121,0,116,111,116,97,100,100,107,101,121,0,98,114,117,115,104, +116,121,112,101,0,98,114,117,115,104,91,55,93,0,101,109,105,116,116,101,114,100,105,115,116,0,100,114,97,119,95,116, +105,109,101,100,0,110,97,109,101,91,51,54,93,0,109,97,116,91,51,93,91,51,93,0,99,111,114,110,101,114,116,121, +112,101,0,101,100,105,116,98,117,116,102,108,97,103,0,106,111,105,110,116,114,105,108,105,109,105,116,0,100,101,103,114, +0,116,117,114,110,0,101,120,116,114,95,111,102,102,115,0,100,111,117,98,108,105,109,105,116,0,115,101,103,109,101,110, +116,115,0,114,105,110,103,115,0,118,101,114,116,105,99,101,115,0,117,110,119,114,97,112,112,101,114,0,117,118,99,97, +108,99,95,114,97,100,105,117,115,0,117,118,99,97,108,99,95,99,117,98,101,115,105,122,101,0,117,118,99,97,108,99, +95,109,97,114,103,105,110,0,117,118,99,97,108,99,95,109,97,112,100,105,114,0,117,118,99,97,108,99,95,109,97,112, +97,108,105,103,110,0,117,118,99,97,108,99,95,102,108,97,103,0,97,117,116,111,105,107,95,99,104,97,105,110,108,101, +110,0,105,109,97,112,97,105,110,116,0,112,97,114,116,105,99,108,101,0,115,101,108,101,99,116,95,116,104,114,101,115, +104,0,99,108,101,97,110,95,116,104,114,101,115,104,0,114,101,116,111,112,111,95,109,111,100,101,0,114,101,116,111,112, +111,95,112,97,105,110,116,95,116,111,111,108,0,108,105,110,101,95,100,105,118,0,101,108,108,105,112,115,101,95,100,105, +118,0,114,101,116,111,112,111,95,104,111,116,115,112,111,116,0,109,117,108,116,105,114,101,115,95,115,117,98,100,105,118, +95,116,121,112,101,0,115,107,103,101,110,95,114,101,115,111,108,117,116,105,111,110,0,115,107,103,101,110,95,116,104,114, +101,115,104,111,108,100,95,105,110,116,101,114,110,97,108,0,115,107,103,101,110,95,116,104,114,101,115,104,111,108,100,95, +101,120,116,101,114,110,97,108,0,115,107,103,101,110,95,108,101,110,103,116,104,95,114,97,116,105,111,0,115,107,103,101, +110,95,108,101,110,103,116,104,95,108,105,109,105,116,0,115,107,103,101,110,95,97,110,103,108,101,95,108,105,109,105,116, +0,115,107,103,101,110,95,99,111,114,114,101,108,97,116,105,111,110,95,108,105,109,105,116,0,115,107,103,101,110,95,115, +121,109,109,101,116,114,121,95,108,105,109,105,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,97,110,103, +108,101,95,119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,108,101,110,103,116,104,95, +119,101,105,103,104,116,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,100,105,115,116,97,110,99,101,95,119, +101,105,103,104,116,0,115,107,103,101,110,95,111,112,116,105,111,110,115,0,115,107,103,101,110,95,112,111,115,116,112,114, +111,0,115,107,103,101,110,95,112,111,115,116,112,114,111,95,112,97,115,115,101,115,0,115,107,103,101,110,95,115,117,98, +100,105,118,105,115,105,111,110,115,91,51,93,0,115,107,103,101,110,95,109,117,108,116,105,95,108,101,118,101,108,0,42, +115,107,103,101,110,95,116,101,109,112,108,97,116,101,0,98,111,110,101,95,115,107,101,116,99,104,105,110,103,0,98,111, +110,101,95,115,107,101,116,99,104,105,110,103,95,99,111,110,118,101,114,116,0,115,107,103,101,110,95,115,117,98,100,105, +118,105,115,105,111,110,95,110,117,109,98,101,114,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,111,112,116, +105,111,110,115,0,115,107,103,101,110,95,114,101,116,97,114,103,101,116,95,114,111,108,108,0,115,107,103,101,110,95,115, +105,100,101,95,115,116,114,105,110,103,91,56,93,0,115,107,103,101,110,95,110,117,109,95,115,116,114,105,110,103,91,56, +93,0,101,100,103,101,95,109,111,100,101,0,112,97,100,51,91,50,93,0,100,105,114,0,118,105,101,119,0,42,115,101, +115,115,105,111,110,0,42,99,117,109,97,112,0,100,114,97,119,98,114,117,115,104,0,115,109,111,111,116,104,98,114,117, +115,104,0,112,105,110,99,104,98,114,117,115,104,0,105,110,102,108,97,116,101,98,114,117,115,104,0,103,114,97,98,98, +114,117,115,104,0,108,97,121,101,114,98,114,117,115,104,0,102,108,97,116,116,101,110,98,114,117,115,104,0,112,105,118, +111,116,91,51,93,0,98,114,117,115,104,95,116,121,112,101,0,116,101,120,110,114,0,116,101,120,114,101,112,116,0,116, +101,120,102,97,100,101,0,116,101,120,115,101,112,0,97,118,101,114,97,103,105,110,103,0,116,97,98,108,101,116,95,115, +105,122,101,0,116,97,98,108,101,116,95,115,116,114,101,110,103,116,104,0,115,121,109,109,0,114,97,107,101,0,97,120, +105,115,108,111,99,107,0,42,99,97,109,101,114,97,0,42,119,111,114,108,100,0,42,115,101,116,0,98,97,115,101,0, +42,98,97,115,97,99,116,0,99,117,114,115,111,114,91,51,93,0,116,119,99,101,110,116,91,51,93,0,116,119,109,105, +110,91,51,93,0,116,119,109,97,120,91,51,93,0,101,100,105,116,98,117,116,115,105,122,101,0,115,101,108,101,99,116, +109,111,100,101,0,112,114,111,112,111,114,116,105,111,110,97,108,0,112,114,111,112,95,109,111,100,101,0,97,117,116,111, +109,101,114,103,101,0,112,97,100,53,0,112,97,100,54,0,97,117,116,111,107,101,121,95,109,111,100,101,0,42,101,100, +0,42,114,97,100,105,111,0,102,114,97,109,105,110,103,0,42,116,111,111,108,115,101,116,116,105,110,103,115,0,97,117, +100,105,111,0,116,114,97,110,115,102,111,114,109,95,115,112,97,99,101,115,0,106,117,109,112,102,114,97,109,101,0,115, +110,97,112,95,109,111,100,101,0,115,110,97,112,95,102,108,97,103,0,115,110,97,112,95,116,97,114,103,101,116,0,42, +116,104,101,68,97,103,0,100,97,103,105,115,118,97,108,105,100,0,100,97,103,102,108,97,103,115,0,115,99,117,108,112, +116,100,97,116,97,0,102,114,97,109,101,95,115,116,101,112,0,122,111,111,109,0,98,108,101,110,100,0,120,105,109,0, +121,105,109,0,115,112,97,99,101,116,121,112,101,0,98,108,111,99,107,115,99,97,108,101,0,42,97,114,101,97,0,98, +108,111,99,107,104,97,110,100,108,101,114,91,56,93,0,118,105,101,119,109,97,116,91,52,93,91,52,93,0,118,105,101, +119,105,110,118,91,52,93,91,52,93,0,112,101,114,115,109,97,116,91,52,93,91,52,93,0,112,101,114,115,105,110,118, +91,52,93,91,52,93,0,119,105,110,109,97,116,49,91,52,93,91,52,93,0,118,105,101,119,109,97,116,49,91,52,93, +91,52,93,0,118,105,101,119,113,117,97,116,91,52,93,0,122,102,97,99,0,108,97,121,95,117,115,101,100,0,112,101, +114,115,112,0,42,111,98,95,99,101,110,116,114,101,0,42,98,103,112,105,99,0,42,108,111,99,97,108,118,100,0,42, +114,105,0,42,114,101,116,111,112,111,95,118,105,101,119,95,100,97,116,97,0,42,100,101,112,116,104,115,0,111,98,95, +99,101,110,116,114,101,95,98,111,110,101,91,51,50,93,0,108,111,99,97,108,118,105,101,119,0,108,97,121,97,99,116, +0,115,99,101,110,101,108,111,99,107,0,97,114,111,117,110,100,0,99,97,109,122,111,111,109,0,112,105,118,111,116,95, +108,97,115,116,0,103,114,105,100,0,103,114,105,100,118,105,101,119,0,112,105,120,115,105,122,101,0,110,101,97,114,0, +102,97,114,0,99,97,109,100,120,0,99,97,109,100,121,0,103,114,105,100,108,105,110,101,115,0,118,105,101,119,98,117, +116,0,103,114,105,100,102,108,97,103,0,109,111,100,101,115,101,108,101,99,116,0,116,119,116,121,112,101,0,116,119,109, +111,100,101,0,116,119,102,108,97,103,0,116,119,100,114,97,119,102,108,97,103,0,116,119,109,97,116,91,52,93,91,52, +93,0,99,108,105,112,91,52,93,91,52,93,0,42,99,108,105,112,98,98,0,97,102,116,101,114,100,114,97,119,0,122, +98,117,102,0,120,114,97,121,0,102,108,97,103,50,0,103,114,105,100,115,117,98,100,105,118,0,107,101,121,102,108,97, +103,115,0,110,100,111,102,109,111,100,101,0,110,100,111,102,102,105,108,116,101,114,0,42,112,114,111,112,101,114,116,105, +101,115,95,115,116,111,114,97,103,101,0,42,103,112,100,0,108,118,105,101,119,113,117,97,116,91,52,93,0,108,112,101, +114,115,112,0,108,118,105,101,119,0,118,101,114,116,0,104,111,114,0,109,97,115,107,0,109,105,110,91,50,93,0,109, +97,120,91,50,93,0,109,105,110,122,111,111,109,0,109,97,120,122,111,111,109,0,115,99,114,111,108,108,0,107,101,101, +112,116,111,116,0,107,101,101,112,97,115,112,101,99,116,0,107,101,101,112,122,111,111,109,0,111,108,100,119,105,110,120, +0,111,108,100,119,105,110,121,0,99,117,114,115,111,114,91,50,93,0,114,111,119,98,117,116,0,118,50,100,0,42,101, +100,105,116,105,112,111,0,105,112,111,107,101,121,0,97,99,116,110,97,109,101,91,51,50,93,0,99,111,110,115,116,110, +97,109,101,91,51,50,93,0,98,111,110,101,110,97,109,101,91,51,50,93,0,116,111,116,105,112,111,0,112,105,110,0, +98,117,116,111,102,115,0,99,104,97,110,110,101,108,0,108,111,99,107,0,109,101,100,105,97,110,91,51,93,0,99,117, +114,115,101,110,115,0,99,117,114,97,99,116,0,97,108,105,103,110,0,116,97,98,111,0,109,97,105,110,98,0,109,97, +105,110,98,111,0,42,108,111,99,107,112,111,105,110,0,116,101,120,102,114,111,109,0,115,104,111,119,103,114,111,117,112, +0,109,111,100,101,108,116,121,112,101,0,115,99,114,105,112,116,98,108,111,99,107,0,114,101,95,97,108,105,103,110,0, +111,108,100,107,101,121,112,114,101,115,115,0,116,97,98,91,55,93,0,114,101,110,100,101,114,95,115,105,122,101,0,99, +104,97,110,115,104,111,119,110,0,122,101,98,114,97,0,42,102,105,108,101,108,105,115,116,0,116,111,116,102,105,108,101, +0,116,105,116,108,101,91,50,52,93,0,100,105,114,91,50,52,48,93,0,102,105,108,101,91,56,48,93,0,111,102,115, +0,115,111,114,116,0,109,97,120,110,97,109,101,108,101,110,0,99,111,108,108,117,109,115,0,102,95,102,112,0,102,112, +95,115,116,114,91,56,93,0,42,108,105,98,102,105,108,101,100,97,116,97,0,114,101,116,118,97,108,0,109,101,110,117, +0,97,99,116,0,40,42,114,101,116,117,114,110,102,117,110,99,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110, +99,95,101,118,101,110,116,41,40,41,0,40,42,114,101,116,117,114,110,102,117,110,99,95,97,114,103,115,41,40,41,0, +42,97,114,103,49,0,42,97,114,103,50,0,42,109,101,110,117,112,0,42,112,117,112,109,101,110,117,0,111,111,112,115, +0,118,105,115,105,102,108,97,103,0,116,114,101,101,0,42,116,114,101,101,115,116,111,114,101,0,115,101,97,114,99,104, +95,115,116,114,105,110,103,91,51,50,93,0,115,101,97,114,99,104,95,116,115,101,0,115,101,97,114,99,104,95,102,108, +97,103,115,0,100,111,95,0,111,117,116,108,105,110,101,118,105,115,0,115,116,111,114,101,102,108,97,103,0,100,101,112, +115,95,102,108,97,103,115,0,105,109,97,110,114,0,99,117,114,116,105,108,101,0,105,109,116,121,112,101,110,114,0,100, +116,95,117,118,0,115,116,105,99,107,121,0,100,116,95,117,118,115,116,114,101,116,99,104,0,112,97,100,91,53,93,0, +99,101,110,116,120,0,99,101,110,116,121,0,97,117,116,111,115,110,97,112,0,42,116,101,120,116,0,116,111,112,0,118, +105,101,119,108,105,110,101,115,0,102,111,110,116,95,105,100,0,108,104,101,105,103,104,116,0,108,101,102,116,0,115,104, +111,119,108,105,110,101,110,114,115,0,116,97,98,110,117,109,98,101,114,0,99,117,114,114,116,97,98,95,115,101,116,0, +115,104,111,119,115,121,110,116,97,120,0,111,118,101,114,119,114,105,116,101,0,112,105,120,95,112,101,114,95,108,105,110, +101,0,116,120,116,115,99,114,111,108,108,0,116,120,116,98,97,114,0,119,111,114,100,119,114,97,112,0,100,111,112,108, +117,103,105,110,115,0,42,112,121,95,100,114,97,119,0,42,112,121,95,101,118,101,110,116,0,42,112,121,95,98,117,116, +116,111,110,0,42,112,121,95,98,114,111,119,115,101,114,99,97,108,108,98,97,99,107,0,42,112,121,95,103,108,111,98, +97,108,100,105,99,116,0,108,97,115,116,115,112,97,99,101,0,115,99,114,105,112,116,110,97,109,101,91,50,53,54,93, +0,115,99,114,105,112,116,97,114,103,91,50,53,54,93,0,42,115,99,114,105,112,116,0,42,98,117,116,95,114,101,102, +115,0,114,101,100,114,97,119,115,0,42,105,100,0,97,115,112,101,99,116,0,42,99,117,114,102,111,110,116,0,42,101, +100,105,116,116,114,101,101,0,116,114,101,101,116,121,112,101,0,42,102,105,108,101,115,0,97,99,116,105,118,101,95,102, +105,108,101,0,110,117,109,116,105,108,101,115,120,0,110,117,109,116,105,108,101,115,121,0,115,101,108,115,116,97,116,101, +0,118,105,101,119,114,101,99,116,0,98,111,111,107,109,97,114,107,114,101,99,116,0,115,99,114,111,108,108,112,111,115, +0,115,99,114,111,108,108,104,101,105,103,104,116,0,115,99,114,111,108,108,97,114,101,97,0,97,99,116,105,118,101,95, +98,111,111,107,109,97,114,107,0,112,114,118,95,119,0,112,114,118,95,104,0,42,105,109,103,0,111,117,116,108,105,110, +101,91,52,93,0,110,101,117,116,114,97,108,91,52,93,0,97,99,116,105,111,110,91,52,93,0,115,101,116,116,105,110, +103,91,52,93,0,115,101,116,116,105,110,103,49,91,52,93,0,115,101,116,116,105,110,103,50,91,52,93,0,110,117,109, +91,52,93,0,116,101,120,116,102,105,101,108,100,91,52,93,0,116,101,120,116,102,105,101,108,100,95,104,105,91,52,93, +0,112,111,112,117,112,91,52,93,0,116,101,120,116,91,52,93,0,116,101,120,116,95,104,105,91,52,93,0,109,101,110, +117,95,98,97,99,107,91,52,93,0,109,101,110,117,95,105,116,101,109,91,52,93,0,109,101,110,117,95,104,105,108,105, +116,101,91,52,93,0,109,101,110,117,95,116,101,120,116,91,52,93,0,109,101,110,117,95,116,101,120,116,95,104,105,91, +52,93,0,98,117,116,95,100,114,97,119,116,121,112,101,0,105,99,111,110,102,105,108,101,91,56,48,93,0,98,97,99, +107,91,52,93,0,104,101,97,100,101,114,91,52,93,0,112,97,110,101,108,91,52,93,0,115,104,97,100,101,49,91,52, +93,0,115,104,97,100,101,50,91,52,93,0,104,105,108,105,116,101,91,52,93,0,103,114,105,100,91,52,93,0,119,105, +114,101,91,52,93,0,115,101,108,101,99,116,91,52,93,0,108,97,109,112,91,52,93,0,97,99,116,105,118,101,91,52, +93,0,103,114,111,117,112,91,52,93,0,103,114,111,117,112,95,97,99,116,105,118,101,91,52,93,0,116,114,97,110,115, +102,111,114,109,91,52,93,0,118,101,114,116,101,120,91,52,93,0,118,101,114,116,101,120,95,115,101,108,101,99,116,91, +52,93,0,101,100,103,101,91,52,93,0,101,100,103,101,95,115,101,108,101,99,116,91,52,93,0,101,100,103,101,95,115, +101,97,109,91,52,93,0,101,100,103,101,95,115,104,97,114,112,91,52,93,0,101,100,103,101,95,102,97,99,101,115,101, +108,91,52,93,0,102,97,99,101,91,52,93,0,102,97,99,101,95,115,101,108,101,99,116,91,52,93,0,102,97,99,101, +95,100,111,116,91,52,93,0,110,111,114,109,97,108,91,52,93,0,98,111,110,101,95,115,111,108,105,100,91,52,93,0, +98,111,110,101,95,112,111,115,101,91,52,93,0,115,116,114,105,112,91,52,93,0,115,116,114,105,112,95,115,101,108,101, +99,116,91,52,93,0,99,102,114,97,109,101,91,52,93,0,118,101,114,116,101,120,95,115,105,122,101,0,102,97,99,101, +100,111,116,95,115,105,122,101,0,98,112,97,100,91,50,93,0,115,121,110,116,97,120,108,91,52,93,0,115,121,110,116, +97,120,110,91,52,93,0,115,121,110,116,97,120,98,91,52,93,0,115,121,110,116,97,120,118,91,52,93,0,115,121,110, +116,97,120,99,91,52,93,0,109,111,118,105,101,91,52,93,0,105,109,97,103,101,91,52,93,0,115,99,101,110,101,91, +52,93,0,97,117,100,105,111,91,52,93,0,101,102,102,101,99,116,91,52,93,0,112,108,117,103,105,110,91,52,93,0, +116,114,97,110,115,105,116,105,111,110,91,52,93,0,109,101,116,97,91,52,93,0,101,100,105,116,109,101,115,104,95,97, +99,116,105,118,101,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,91,52,93,0,104,97,110,100,108,101, +95,118,101,114,116,101,120,95,115,101,108,101,99,116,91,52,93,0,104,97,110,100,108,101,95,118,101,114,116,101,120,95, +115,105,122,101,0,104,112,97,100,91,55,93,0,115,111,108,105,100,91,52,93,0,116,117,105,0,116,98,117,116,115,0, +116,118,51,100,0,116,102,105,108,101,0,116,105,112,111,0,116,105,110,102,111,0,116,115,110,100,0,116,97,99,116,0, +116,110,108,97,0,116,115,101,113,0,116,105,109,97,0,116,105,109,97,115,101,108,0,116,101,120,116,0,116,111,111,112, +115,0,116,116,105,109,101,0,116,110,111,100,101,0,116,97,114,109,91,50,48,93,0,98,112,97,100,91,52,93,0,98, +112,97,100,49,91,52,93,0,115,112,101,99,91,52,93,0,100,117,112,102,108,97,103,0,115,97,118,101,116,105,109,101, +0,116,101,109,112,100,105,114,91,49,54,48,93,0,102,111,110,116,100,105,114,91,49,54,48,93,0,114,101,110,100,101, +114,100,105,114,91,49,54,48,93,0,116,101,120,116,117,100,105,114,91,49,54,48,93,0,112,108,117,103,116,101,120,100, +105,114,91,49,54,48,93,0,112,108,117,103,115,101,113,100,105,114,91,49,54,48,93,0,112,121,116,104,111,110,100,105, +114,91,49,54,48,93,0,115,111,117,110,100,100,105,114,91,49,54,48,93,0,121,102,101,120,112,111,114,116,100,105,114, +91,49,54,48,93,0,118,101,114,115,105,111,110,115,0,118,114,109,108,102,108,97,103,0,103,97,109,101,102,108,97,103, +115,0,119,104,101,101,108,108,105,110,101,115,99,114,111,108,108,0,117,105,102,108,97,103,0,108,97,110,103,117,97,103, +101,0,117,115,101,114,112,114,101,102,0,118,105,101,119,122,111,111,109,0,99,111,110,115,111,108,101,95,98,117,102,102, +101,114,0,99,111,110,115,111,108,101,95,111,117,116,0,109,105,120,98,117,102,115,105,122,101,0,102,111,110,116,115,105, +122,101,0,101,110,99,111,100,105,110,103,0,116,114,97,110,115,111,112,116,115,0,109,101,110,117,116,104,114,101,115,104, +111,108,100,49,0,109,101,110,117,116,104,114,101,115,104,111,108,100,50,0,102,111,110,116,110,97,109,101,91,50,53,54, +93,0,116,104,101,109,101,115,0,117,110,100,111,115,116,101,112,115,0,117,110,100,111,109,101,109,111,114,121,0,103,112, +95,109,97,110,104,97,116,116,101,110,100,105,115,116,0,103,112,95,101,117,99,108,105,100,101,97,110,100,105,115,116,0, +103,112,95,101,114,97,115,101,114,0,103,112,95,115,101,116,116,105,110,103,115,0,116,98,95,108,101,102,116,109,111,117, +115,101,0,116,98,95,114,105,103,104,116,109,111,117,115,101,0,108,105,103,104,116,91,51,93,0,116,119,95,104,111,116, +115,112,111,116,0,116,119,95,102,108,97,103,0,116,119,95,104,97,110,100,108,101,115,105,122,101,0,116,119,95,115,105, +122,101,0,116,101,120,116,105,109,101,111,117,116,0,116,101,120,99,111,108,108,101,99,116,114,97,116,101,0,109,101,109, +99,97,99,104,101,108,105,109,105,116,0,112,114,101,102,101,116,99,104,102,114,97,109,101,115,0,102,114,97,109,101,115, +101,114,118,101,114,112,111,114,116,0,112,97,100,95,114,111,116,95,97,110,103,108,101,0,111,98,99,101,110,116,101,114, +95,100,105,97,0,114,118,105,115,105,122,101,0,114,118,105,98,114,105,103,104,116,0,114,101,99,101,110,116,95,102,105, +108,101,115,0,115,109,111,111,116,104,95,118,105,101,119,116,120,0,103,108,114,101,115,108,105,109,105,116,0,110,100,111, +102,95,112,97,110,0,110,100,111,102,95,114,111,116,97,116,101,0,99,117,114,115,115,105,122,101,0,112,97,100,91,56, +93,0,118,101,114,115,101,109,97,115,116,101,114,91,49,54,48,93,0,118,101,114,115,101,117,115,101,114,91,49,54,48, +93,0,103,108,97,108,112,104,97,99,108,105,112,0,97,117,116,111,107,101,121,95,102,108,97,103,0,99,111,98,97,95, +119,101,105,103,104,116,0,118,101,114,116,98,97,115,101,0,101,100,103,101,98,97,115,101,0,97,114,101,97,98,97,115, +101,0,42,115,99,101,110,101,0,101,110,100,120,0,101,110,100,121,0,115,105,122,101,120,0,115,105,122,101,121,0,115, +99,101,110,101,110,114,0,115,99,114,101,101,110,110,114,0,102,117,108,108,0,109,97,105,110,119,105,110,0,119,105,110, +97,107,116,0,104,97,110,100,108,101,114,91,56,93,0,42,110,101,119,118,0,118,101,99,0,42,118,49,0,42,118,50, +0,112,97,110,101,108,110,97,109,101,91,54,52,93,0,116,97,98,110,97,109,101,91,54,52,93,0,100,114,97,119,110, +97,109,101,91,54,52,93,0,111,102,115,120,0,111,102,115,121,0,99,111,110,116,114,111,108,0,115,110,97,112,0,111, +108,100,95,111,102,115,120,0,111,108,100,95,111,102,115,121,0,115,111,114,116,99,111,117,110,116,101,114,0,42,112,97, +110,101,108,116,97,98,0,42,118,51,0,42,118,52,0,42,102,117,108,108,0,119,105,110,109,97,116,91,52,93,91,52, +93,0,104,101,97,100,114,99,116,0,119,105,110,114,99,116,0,104,101,97,100,119,105,110,0,119,105,110,0,104,101,97, +100,101,114,116,121,112,101,0,98,117,116,115,112,97,99,101,116,121,112,101,0,119,105,110,120,0,119,105,110,121,0,104, +101,97,100,95,115,119,97,112,0,104,101,97,100,95,101,113,117,97,108,0,119,105,110,95,115,119,97,112,0,119,105,110, +95,101,113,117,97,108,0,104,101,97,100,98,117,116,108,101,110,0,104,101,97,100,98,117,116,111,102,115,0,99,117,114, +115,111,114,0,115,112,97,99,101,100,97,116,97,0,117,105,98,108,111,99,107,115,0,112,97,110,101,108,115,0,115,117, +98,118,115,116,114,91,52,93,0,115,117,98,118,101,114,115,105,111,110,0,112,97,100,115,0,109,105,110,118,101,114,115, +105,111,110,0,109,105,110,115,117,98,118,101,114,115,105,111,110,0,100,105,115,112,108,97,121,109,111,100,101,0,42,99, +117,114,115,99,114,101,101,110,0,42,99,117,114,115,99,101,110,101,0,102,105,108,101,102,108,97,103,115,0,103,108,111, +98,97,108,102,0,110,97,109,101,91,56,48,93,0,42,105,98,117,102,0,42,105,98,117,102,95,99,111,109,112,0,42, +115,101,49,0,42,115,101,50,0,42,115,101,51,0,110,114,0,98,111,116,116,111,109,0,114,105,103,104,116,0,120,111, +102,115,0,121,111,102,115,0,108,105,102,116,91,51,93,0,103,97,109,109,97,91,51,93,0,103,97,105,110,91,51,93, +0,115,97,116,117,114,97,116,105,111,110,0,42,103,117,105,0,100,105,114,91,49,54,48,93,0,100,111,110,101,0,115, +116,97,114,116,115,116,105,108,108,0,101,110,100,115,116,105,108,108,0,42,115,116,114,105,112,100,97,116,97,0,111,114, +120,0,111,114,121,0,42,99,114,111,112,0,42,116,114,97,110,115,102,111,114,109,0,42,99,111,108,111,114,95,98,97, +108,97,110,99,101,0,42,116,115,116,114,105,112,100,97,116,97,0,42,116,115,116,114,105,112,100,97,116,97,95,115,116, +97,114,116,115,116,105,108,108,0,42,116,115,116,114,105,112,100,97,116,97,95,101,110,100,115,116,105,108,108,0,42,105, +98,117,102,95,115,116,97,114,116,115,116,105,108,108,0,42,105,98,117,102,95,101,110,100,115,116,105,108,108,0,42,105, +110,115,116,97,110,99,101,95,112,114,105,118,97,116,101,95,100,97,116,97,0,42,42,99,117,114,114,101,110,116,95,112, +114,105,118,97,116,101,95,100,97,116,97,0,42,116,109,112,0,115,116,97,114,116,111,102,115,0,101,110,100,111,102,115, +0,109,97,99,104,105,110,101,0,115,116,97,114,116,100,105,115,112,0,101,110,100,100,105,115,112,0,109,117,108,0,104, +97,110,100,115,105,122,101,0,97,110,105,109,95,112,114,101,115,101,101,107,0,42,115,116,114,105,112,0,102,97,99,102, +48,0,102,97,99,102,49,0,42,115,101,113,49,0,42,115,101,113,50,0,42,115,101,113,51,0,115,101,113,98,97,115, +101,0,42,115,111,117,110,100,0,42,104,100,97,117,100,105,111,0,108,101,118,101,108,0,112,97,110,0,115,116,114,111, +98,101,0,42,101,102,102,101,99,116,100,97,116,97,0,97,110,105,109,95,115,116,97,114,116,111,102,115,0,97,110,105, +109,95,101,110,100,111,102,115,0,98,108,101,110,100,95,109,111,100,101,0,98,108,101,110,100,95,111,112,97,99,105,116, +121,0,42,111,108,100,98,97,115,101,112,0,42,112,97,114,115,101,113,0,42,115,101,113,98,97,115,101,112,0,109,101, +116,97,115,116,97,99,107,0,101,100,103,101,87,105,100,116,104,0,102,111,114,119,97,114,100,0,119,105,112,101,116,121, +112,101,0,102,77,105,110,105,0,102,67,108,97,109,112,0,102,66,111,111,115,116,0,100,68,105,115,116,0,100,81,117, +97,108,105,116,121,0,98,78,111,67,111,109,112,0,83,99,97,108,101,120,73,110,105,0,83,99,97,108,101,121,73,110, +105,0,83,99,97,108,101,120,70,105,110,0,83,99,97,108,101,121,70,105,110,0,120,73,110,105,0,120,70,105,110,0, +121,73,110,105,0,121,70,105,110,0,114,111,116,73,110,105,0,114,111,116,70,105,110,0,105,110,116,101,114,112,111,108, +97,116,105,111,110,0,42,102,114,97,109,101,77,97,112,0,103,108,111,98,97,108,83,112,101,101,100,0,108,97,115,116, +86,97,108,105,100,70,114,97,109,101,0,98,108,101,110,100,70,114,97,109,101,115,0,98,117,116,116,121,112,101,0,117, +115,101,114,106,105,116,0,115,116,97,0,116,111,116,112,97,114,116,0,110,111,114,109,102,97,99,0,111,98,102,97,99, +0,114,97,110,100,102,97,99,0,116,101,120,102,97,99,0,114,97,110,100,108,105,102,101,0,102,111,114,99,101,91,51, +93,0,118,101,99,116,115,105,122,101,0,109,97,120,108,101,110,0,100,101,102,118,101,99,91,51,93,0,109,117,108,116, +91,52,93,0,108,105,102,101,91,52,93,0,99,104,105,108,100,91,52,93,0,109,97,116,91,52,93,0,116,101,120,109, +97,112,0,99,117,114,109,117,108,116,0,115,116,97,116,105,99,115,116,101,112,0,111,109,97,116,0,116,105,109,101,116, +101,120,0,115,112,101,101,100,116,101,120,0,102,108,97,103,50,110,101,103,0,118,101,114,116,103,114,111,117,112,95,118, +0,118,103,114,111,117,112,110,97,109,101,91,51,50,93,0,118,103,114,111,117,112,110,97,109,101,95,118,91,51,50,93, +0,42,107,101,121,115,0,109,105,110,102,97,99,0,117,115,101,100,0,117,115,101,100,101,108,101,109,0,100,120,0,100, +121,0,108,105,110,107,0,111,116,121,112,101,0,111,108,100,0,42,112,111,105,110,0,42,111,108,100,112,111,105,110,0, +114,101,115,101,116,100,105,115,116,0,108,97,115,116,118,97,108,0,42,109,97,0,107,101,121,0,113,117,97,108,0,113, +117,97,108,50,0,116,97,114,103,101,116,78,97,109,101,91,51,50,93,0,116,111,103,103,108,101,78,97,109,101,91,51, +50,93,0,118,97,108,117,101,91,51,50,93,0,109,97,120,118,97,108,117,101,91,51,50,93,0,100,101,108,97,121,0, +100,117,114,97,116,105,111,110,0,109,97,116,101,114,105,97,108,78,97,109,101,91,51,50,93,0,100,97,109,112,116,105, +109,101,114,0,112,114,111,112,110,97,109,101,91,51,50,93,0,109,97,116,110,97,109,101,91,51,50,93,0,97,120,105, +115,102,108,97,103,0,42,102,114,111,109,79,98,106,101,99,116,0,115,117,98,106,101,99,116,91,51,50,93,0,98,111, +100,121,91,51,50,93,0,112,117,108,115,101,0,102,114,101,113,0,116,111,116,108,105,110,107,115,0,42,42,108,105,110, +107,115,0,116,97,112,0,106,111,121,105,110,100,101,120,0,97,120,105,115,95,115,105,110,103,108,101,0,97,120,105,115, +102,0,98,117,116,116,111,110,0,104,97,116,0,104,97,116,102,0,112,114,101,99,105,115,105,111,110,0,115,116,114,91, +49,50,56,93,0,109,111,100,117,108,101,91,54,52,93,0,42,109,121,110,101,119,0,105,110,112,117,116,115,0,116,111, +116,115,108,105,110,107,115,0,42,42,115,108,105,110,107,115,0,118,97,108,111,0,115,116,97,116,101,95,109,97,115,107, +0,42,97,99,116,0,102,114,97,109,101,80,114,111,112,91,51,50,93,0,98,108,101,110,100,105,110,0,112,114,105,111, +114,105,116,121,0,101,110,100,95,114,101,115,101,116,0,115,116,114,105,100,101,97,120,105,115,0,115,116,114,105,100,101, +108,101,110,103,116,104,0,115,110,100,110,114,0,112,97,100,49,91,50,93,0,109,97,107,101,99,111,112,121,0,99,111, +112,121,109,97,100,101,0,112,97,100,50,91,49,93,0,116,114,97,99,107,0,42,109,101,0,108,105,110,86,101,108,111, +99,105,116,121,91,51,93,0,97,110,103,86,101,108,111,99,105,116,121,91,51,93,0,108,111,99,97,108,102,108,97,103, +0,100,121,110,95,111,112,101,114,97,116,105,111,110,0,102,111,114,99,101,108,111,99,91,51,93,0,102,111,114,99,101, +114,111,116,91,51,93,0,108,105,110,101,97,114,118,101,108,111,99,105,116,121,91,51,93,0,97,110,103,117,108,97,114, +118,101,108,111,99,105,116,121,91,51,93,0,42,114,101,102,101,114,101,110,99,101,0,98,117,116,115,116,97,0,98,117, +116,101,110,100,0,109,105,110,0,109,97,120,0,118,105,115,105,102,97,99,0,114,111,116,100,97,109,112,0,109,105,110, +108,111,99,91,51,93,0,109,97,120,108,111,99,91,51,93,0,109,105,110,114,111,116,91,51,93,0,109,97,120,114,111, +116,91,51,93,0,109,97,116,112,114,111,112,91,51,50,93,0,100,105,115,116,114,105,98,117,116,105,111,110,0,105,110, +116,95,97,114,103,95,49,0,105,110,116,95,97,114,103,95,50,0,102,108,111,97,116,95,97,114,103,95,49,0,102,108, +111,97,116,95,97,114,103,95,50,0,116,111,80,114,111,112,78,97,109,101,91,51,50,93,0,42,116,111,79,98,106,101, +99,116,0,98,111,100,121,84,121,112,101,0,102,105,108,101,110,97,109,101,91,54,52,93,0,108,111,97,100,97,110,105, +110,97,109,101,91,54,52,93,0,105,110,116,95,97,114,103,0,102,108,111,97,116,95,97,114,103,0,103,111,0,97,99, +99,101,108,108,101,114,97,116,105,111,110,0,109,97,120,115,112,101,101,100,0,109,97,120,114,111,116,115,112,101,101,100, +0,109,97,120,116,105,108,116,115,112,101,101,100,0,116,105,108,116,100,97,109,112,0,115,112,101,101,100,100,97,109,112, +0,42,115,97,109,112,108,101,0,42,115,116,114,101,97,109,0,42,110,101,119,112,97,99,107,101,100,102,105,108,101,0, +42,115,110,100,95,115,111,117,110,100,0,112,97,110,110,105,110,103,0,97,116,116,101,110,117,97,116,105,111,110,0,112, +105,116,99,104,0,109,105,110,95,103,97,105,110,0,109,97,120,95,103,97,105,110,0,100,105,115,116,97,110,99,101,0, +115,116,114,101,97,109,108,101,110,0,99,104,97,110,110,101,108,115,0,104,105,103,104,112,114,105,111,0,112,97,100,91, +49,48,93,0,103,97,105,110,0,100,111,112,112,108,101,114,102,97,99,116,111,114,0,100,111,112,112,108,101,114,118,101, +108,111,99,105,116,121,0,110,117,109,115,111,117,110,100,115,98,108,101,110,100,101,114,0,110,117,109,115,111,117,110,100, +115,103,97,109,101,101,110,103,105,110,101,0,42,108,97,109,112,114,101,110,0,103,111,98,106,101,99,116,0,100,117,112, +108,105,95,111,102,115,91,51,93,0,99,104,105,108,100,98,97,115,101,0,114,111,108,108,0,104,101,97,100,91,51,93, +0,116,97,105,108,91,51,93,0,98,111,110,101,95,109,97,116,91,51,93,91,51,93,0,97,114,109,95,104,101,97,100, +91,51,93,0,97,114,109,95,116,97,105,108,91,51,93,0,97,114,109,95,109,97,116,91,52,93,91,52,93,0,120,119, +105,100,116,104,0,122,119,105,100,116,104,0,101,97,115,101,49,0,101,97,115,101,50,0,114,97,100,95,104,101,97,100, +0,114,97,100,95,116,97,105,108,0,98,111,110,101,98,97,115,101,0,99,104,97,105,110,98,97,115,101,0,112,97,116, +104,102,108,97,103,0,108,97,121,101,114,95,112,114,111,116,101,99,116,101,100,0,103,104,111,115,116,101,112,0,103,104, +111,115,116,115,105,122,101,0,103,104,111,115,116,116,121,112,101,0,112,97,116,104,115,105,122,101,0,103,104,111,115,116, +115,102,0,103,104,111,115,116,101,102,0,112,97,116,104,115,102,0,112,97,116,104,101,102,0,112,97,116,104,98,99,0, +112,97,116,104,97,99,0,99,111,110,115,116,102,108,97,103,0,105,107,102,108,97,103,0,115,101,108,101,99,116,102,108, +97,103,0,97,103,114,112,95,105,110,100,101,120,0,42,98,111,110,101,0,42,99,104,105,108,100,0,105,107,116,114,101, +101,0,42,98,95,98,111,110,101,95,109,97,116,115,0,42,100,117,97,108,95,113,117,97,116,0,42,98,95,98,111,110, +101,95,100,117,97,108,95,113,117,97,116,115,0,99,104,97,110,95,109,97,116,91,52,93,91,52,93,0,112,111,115,101, +95,109,97,116,91,52,93,91,52,93,0,112,111,115,101,95,104,101,97,100,91,51,93,0,112,111,115,101,95,116,97,105, +108,91,51,93,0,108,105,109,105,116,109,105,110,91,51,93,0,108,105,109,105,116,109,97,120,91,51,93,0,115,116,105, +102,102,110,101,115,115,91,51,93,0,105,107,115,116,114,101,116,99,104,0,42,99,117,115,116,111,109,0,99,104,97,110, +98,97,115,101,0,112,114,111,120,121,95,108,97,121,101,114,0,115,116,114,105,100,101,95,111,102,102,115,101,116,91,51, +93,0,99,121,99,108,105,99,95,111,102,102,115,101,116,91,51,93,0,97,103,114,111,117,112,115,0,97,99,116,105,118, +101,95,103,114,111,117,112,0,99,117,115,116,111,109,67,111,108,0,99,115,0,42,103,114,112,0,114,101,115,101,114,118, +101,100,49,0,103,114,111,117,112,115,0,97,99,116,105,118,101,95,109,97,114,107,101,114,0,97,99,116,110,114,0,97, +99,116,119,105,100,116,104,0,116,105,109,101,115,108,105,100,101,0,110,97,109,101,91,51,48,93,0,111,119,110,115,112, +97,99,101,0,116,97,114,115,112,97,99,101,0,101,110,102,111,114,99,101,0,104,101,97,100,116,97,105,108,0,42,116, +97,114,0,115,117,98,116,97,114,103,101,116,91,51,50,93,0,109,97,116,114,105,120,91,52,93,91,52,93,0,115,112, +97,99,101,0,42,112,114,111,112,0,116,97,114,110,117,109,0,116,97,114,103,101,116,115,0,105,116,101,114,97,116,105, +111,110,115,0,114,111,111,116,98,111,110,101,0,109,97,120,95,114,111,111,116,98,111,110,101,0,42,112,111,108,101,116, +97,114,0,112,111,108,101,115,117,98,116,97,114,103,101,116,91,51,50,93,0,112,111,108,101,97,110,103,108,101,0,111, +114,105,101,110,116,119,101,105,103,104,116,0,103,114,97,98,116,97,114,103,101,116,91,51,93,0,114,101,115,101,114,118, +101,100,50,0,109,105,110,109,97,120,102,108,97,103,0,115,116,117,99,107,0,99,97,99,104,101,91,51,93,0,108,111, +99,107,102,108,97,103,0,102,111,108,108,111,119,102,108,97,103,0,118,111,108,109,111,100,101,0,112,108,97,110,101,0, +111,114,103,108,101,110,103,116,104,0,98,117,108,103,101,0,112,105,118,88,0,112,105,118,89,0,112,105,118,90,0,97, +120,88,0,97,120,89,0,97,120,90,0,109,105,110,76,105,109,105,116,91,54,93,0,109,97,120,76,105,109,105,116,91, +54,93,0,101,120,116,114,97,70,122,0,105,110,118,109,97,116,91,52,93,91,52,93,0,102,114,111,109,0,116,111,0, +109,97,112,91,51,93,0,101,120,112,111,0,102,114,111,109,95,109,105,110,91,51,93,0,102,114,111,109,95,109,97,120, +91,51,93,0,116,111,95,109,105,110,91,51,93,0,116,111,95,109,97,120,91,51,93,0,122,109,105,110,0,122,109,97, +120,0,112,97,100,91,57,93,0,99,104,97,110,110,101,108,91,51,50,93,0,110,111,95,114,111,116,95,97,120,105,115, +0,115,116,114,105,100,101,95,97,120,105,115,0,99,117,114,109,111,100,0,97,99,116,115,116,97,114,116,0,97,99,116, +101,110,100,0,97,99,116,111,102,102,115,0,115,116,114,105,100,101,108,101,110,0,98,108,101,110,100,111,117,116,0,115, +116,114,105,100,101,99,104,97,110,110,101,108,91,51,50,93,0,111,102,102,115,95,98,111,110,101,91,51,50,93,0,104, +97,115,105,110,112,117,116,0,104,97,115,111,117,116,112,117,116,0,100,97,116,97,116,121,112,101,0,115,111,99,107,101, +116,116,121,112,101,0,42,110,101,119,95,115,111,99,107,0,110,115,0,108,105,109,105,116,0,115,116,97,99,107,95,105, +110,100,101,120,0,105,110,116,101,114,110,0,115,116,97,99,107,95,105,110,100,101,120,95,101,120,116,0,108,111,99,120, +0,108,111,99,121,0,111,119,110,95,105,110,100,101,120,0,116,111,95,105,110,100,101,120,0,42,116,111,115,111,99,107, +0,42,108,105,110,107,0,42,110,101,119,95,110,111,100,101,0,117,115,101,114,110,97,109,101,91,51,50,93,0,108,97, +115,116,121,0,111,117,116,112,117,116,115,0,42,115,116,111,114,97,103,101,0,109,105,110,105,119,105,100,116,104,0,99, +117,115,116,111,109,49,0,99,117,115,116,111,109,50,0,99,117,115,116,111,109,51,0,99,117,115,116,111,109,52,0,110, +101,101,100,95,101,120,101,99,0,101,120,101,99,0,116,111,116,114,0,98,117,116,114,0,112,114,118,114,0,42,116,121, +112,101,105,110,102,111,0,42,102,114,111,109,110,111,100,101,0,42,116,111,110,111,100,101,0,42,102,114,111,109,115,111, +99,107,0,110,111,100,101,115,0,108,105,110,107,115,0,42,115,116,97,99,107,0,42,116,104,114,101,97,100,115,116,97, +99,107,0,105,110,105,116,0,115,116,97,99,107,115,105,122,101,0,99,117,114,95,105,110,100,101,120,0,97,108,108,116, +121,112,101,115,0,42,111,119,110,116,121,112,101,0,42,115,101,108,105,110,0,42,115,101,108,111,117,116,0,40,42,116, +105,109,101,99,117,114,115,111,114,41,40,41,0,40,42,115,116,97,116,115,95,100,114,97,119,41,40,41,0,40,42,116, +101,115,116,95,98,114,101,97,107,41,40,41,0,99,121,99,108,105,99,0,109,111,118,105,101,0,115,97,109,112,108,101, +115,0,109,105,110,115,112,101,101,100,0,112,101,114,99,101,110,116,120,0,112,101,114,99,101,110,116,121,0,98,111,107, +101,104,0,99,117,114,118,101,100,0,105,109,97,103,101,95,105,110,95,119,105,100,116,104,0,105,109,97,103,101,95,105, +110,95,104,101,105,103,104,116,0,99,101,110,116,101,114,95,120,0,99,101,110,116,101,114,95,121,0,115,112,105,110,0, +105,116,101,114,0,119,114,97,112,0,115,105,103,109,97,95,99,111,108,111,114,0,115,105,103,109,97,95,115,112,97,99, +101,0,104,117,101,0,115,97,116,0,116,49,0,116,50,0,116,51,0,102,115,116,114,101,110,103,116,104,0,102,97,108, +112,104,97,0,107,101,121,91,52,93,0,120,49,0,120,50,0,121,49,0,121,50,0,99,111,108,110,97,109,101,91,51, +50,93,0,98,107,116,121,112,101,0,114,111,116,97,116,105,111,110,0,112,114,101,118,105,101,119,0,103,97,109,99,111, +0,110,111,95,122,98,117,102,0,102,115,116,111,112,0,109,97,120,98,108,117,114,0,98,116,104,114,101,115,104,0,42, +100,105,99,116,0,42,110,111,100,101,0,97,110,103,108,101,95,111,102,115,0,99,111,108,109,111,100,0,109,105,120,0, +116,104,114,101,115,104,111,108,100,0,102,97,100,101,0,109,0,99,0,106,105,116,0,112,114,111,106,0,102,105,116,0, +115,104,111,114,116,121,0,109,105,110,116,97,98,108,101,0,109,97,120,116,97,98,108,101,0,101,120,116,95,105,110,91, +50,93,0,101,120,116,95,111,117,116,91,50,93,0,42,99,117,114,118,101,0,42,116,97,98,108,101,0,42,112,114,101, +109,117,108,116,97,98,108,101,0,99,117,114,114,0,99,108,105,112,114,0,99,109,91,52,93,0,98,108,97,99,107,91, +51,93,0,119,104,105,116,101,91,51,93,0,98,119,109,117,108,91,51,93,0,115,97,109,112,108,101,91,51,93,0,111, +102,102,115,101,116,91,50,93,0,105,110,110,101,114,114,97,100,105,117,115,0,114,97,116,101,0,114,103,98,91,51,93, +0,99,108,111,110,101,0,97,99,116,105,118,101,95,114,110,100,0,97,99,116,105,118,101,95,99,108,111,110,101,0,97, +99,116,105,118,101,95,109,97,115,107,0,42,108,97,121,101,114,115,0,116,111,116,108,97,121,101,114,0,109,97,120,108, +97,121,101,114,0,116,111,116,115,105,122,101,0,42,112,111,111,108,0,101,100,105,116,102,108,97,103,0,118,101,108,91, +51,93,0,114,111,116,91,52,93,0,97,118,101,91,51,93,0,110,117,109,0,112,97,114,101,110,116,0,112,97,91,52, +93,0,119,91,52,93,0,102,117,118,91,52,93,0,102,111,102,102,115,101,116,0,114,97,110,100,91,51,93,0,42,115, +116,105,99,107,95,111,98,0,112,114,101,118,95,115,116,97,116,101,0,42,104,97,105,114,0,105,95,114,111,116,91,52, +93,0,114,95,114,111,116,91,52,93,0,114,95,97,118,101,91,51,93,0,114,95,118,101,91,51,93,0,100,105,101,116, +105,109,101,0,98,97,110,107,0,115,105,122,101,109,117,108,0,110,117,109,95,100,109,99,97,99,104,101,0,98,112,105, +0,97,108,105,118,101,0,108,111,111,112,0,100,105,115,116,114,0,112,104,121,115,116,121,112,101,0,114,111,116,109,111, +100,101,0,97,118,101,109,111,100,101,0,114,101,97,99,116,101,118,101,110,116,0,100,114,97,119,0,100,114,97,119,95, +97,115,0,100,114,97,119,95,115,105,122,101,0,99,104,105,108,100,116,121,112,101,0,100,114,97,119,95,115,116,101,112, +0,114,101,110,95,115,116,101,112,0,104,97,105,114,95,115,116,101,112,0,107,101,121,115,95,115,116,101,112,0,97,100, +97,112,116,95,97,110,103,108,101,0,97,100,97,112,116,95,112,105,120,0,114,111,116,102,114,111,109,0,105,110,116,101, +103,114,97,116,111,114,0,110,98,101,116,119,101,101,110,0,98,111,105,100,110,101,105,103,104,98,111,117,114,115,0,98, +98,95,97,108,105,103,110,0,98,98,95,117,118,95,115,112,108,105,116,0,98,98,95,97,110,105,109,0,98,98,95,115, +112,108,105,116,95,111,102,102,115,101,116,0,98,98,95,116,105,108,116,0,98,98,95,114,97,110,100,95,116,105,108,116, +0,98,98,95,111,102,102,115,101,116,91,50,93,0,115,105,109,112,108,105,102,121,95,102,108,97,103,0,115,105,109,112, +108,105,102,121,95,114,101,102,115,105,122,101,0,115,105,109,112,108,105,102,121,95,114,97,116,101,0,115,105,109,112,108, +105,102,121,95,116,114,97,110,115,105,116,105,111,110,0,115,105,109,112,108,105,102,121,95,118,105,101,119,112,111,114,116, +0,116,105,109,101,116,119,101,97,107,0,106,105,116,102,97,99,0,107,101,121,101,100,95,116,105,109,101,0,101,102,102, +95,104,97,105,114,0,103,114,105,100,95,114,101,115,0,112,97,114,116,102,97,99,0,116,97,110,102,97,99,0,116,97, +110,112,104,97,115,101,0,114,101,97,99,116,102,97,99,0,97,118,101,102,97,99,0,112,104,97,115,101,102,97,99,0, +114,97,110,100,114,111,116,102,97,99,0,114,97,110,100,112,104,97,115,101,102,97,99,0,114,97,110,100,115,105,122,101, +0,114,101,97,99,116,115,104,97,112,101,0,97,99,99,91,51,93,0,100,114,97,103,102,97,99,0,98,114,111,119,110, +102,97,99,0,100,97,109,112,102,97,99,0,97,98,115,108,101,110,103,116,104,0,114,97,110,100,108,101,110,103,116,104, +0,99,104,105,108,100,95,110,98,114,0,114,101,110,95,99,104,105,108,100,95,110,98,114,0,112,97,114,101,110,116,115, +0,99,104,105,108,100,115,105,122,101,0,99,104,105,108,100,114,97,110,100,115,105,122,101,0,99,104,105,108,100,114,97, +100,0,99,104,105,108,100,102,108,97,116,0,99,104,105,108,100,115,112,114,101,97,100,0,99,108,117,109,112,102,97,99, +0,99,108,117,109,112,112,111,119,0,114,111,117,103,104,49,0,114,111,117,103,104,49,95,115,105,122,101,0,114,111,117, +103,104,50,0,114,111,117,103,104,50,95,115,105,122,101,0,114,111,117,103,104,50,95,116,104,114,101,115,0,114,111,117, +103,104,95,101,110,100,0,114,111,117,103,104,95,101,110,100,95,115,104,97,112,101,0,98,114,97,110,99,104,95,116,104, +114,101,115,0,100,114,97,119,95,108,105,110,101,91,50,93,0,109,97,120,95,108,97,116,95,97,99,99,0,109,97,120, +95,116,97,110,95,97,99,99,0,97,118,101,114,97,103,101,95,118,101,108,0,98,97,110,107,105,110,103,0,109,97,120, +95,98,97,110,107,0,103,114,111,117,110,100,122,0,98,111,105,100,102,97,99,91,56,93,0,98,111,105,100,114,117,108, +101,91,56,93,0,42,101,102,102,95,103,114,111,117,112,0,42,100,117,112,95,111,98,0,42,98,98,95,111,98,0,42, +112,100,50,0,42,112,97,114,116,0,42,101,100,105,116,0,42,42,112,97,116,104,99,97,99,104,101,0,42,42,99,104, +105,108,100,99,97,99,104,101,0,112,97,116,104,99,97,99,104,101,98,117,102,115,0,99,104,105,108,100,99,97,99,104, +101,98,117,102,115,0,42,116,97,114,103,101,116,95,111,98,0,42,107,101,121,101,100,95,111,98,0,42,108,97,116,116, +105,99,101,0,101,102,102,101,99,116,111,114,115,0,114,101,97,99,116,101,118,101,110,116,115,0,116,111,116,99,104,105, +108,100,0,116,111,116,99,97,99,104,101,100,0,116,111,116,99,104,105,108,100,99,97,99,104,101,0,116,97,114,103,101, +116,95,112,115,121,115,0,107,101,121,101,100,95,112,115,121,115,0,116,111,116,107,101,121,101,100,0,98,97,107,101,115, +112,97,99,101,0,98,98,95,117,118,110,97,109,101,91,51,93,91,51,50,93,0,118,103,114,111,117,112,91,49,50,93, +0,118,103,95,110,101,103,0,114,116,51,0,42,114,101,110,100,101,114,100,97,116,97,0,42,99,97,99,104,101,0,67, +100,105,115,0,67,118,105,0,91,51,93,0,115,116,114,117,99,116,117,114,97,108,0,98,101,110,100,105,110,103,0,109, +97,120,95,98,101,110,100,0,109,97,120,95,115,116,114,117,99,116,0,109,97,120,95,115,104,101,97,114,0,97,118,103, +95,115,112,114,105,110,103,95,108,101,110,0,116,105,109,101,115,99,97,108,101,0,101,102,102,95,102,111,114,99,101,95, +115,99,97,108,101,0,101,102,102,95,119,105,110,100,95,115,99,97,108,101,0,115,105,109,95,116,105,109,101,95,111,108, +100,0,115,116,101,112,115,80,101,114,70,114,97,109,101,0,112,114,101,114,111,108,108,0,109,97,120,115,112,114,105,110, +103,108,101,110,0,115,111,108,118,101,114,95,116,121,112,101,0,118,103,114,111,117,112,95,98,101,110,100,0,118,103,114, +111,117,112,95,109,97,115,115,0,118,103,114,111,117,112,95,115,116,114,117,99,116,0,112,114,101,115,101,116,115,0,42, +99,111,108,108,105,115,105,111,110,95,108,105,115,116,0,101,112,115,105,108,111,110,0,115,101,108,102,95,102,114,105,99, +116,105,111,110,0,115,101,108,102,101,112,115,105,108,111,110,0,115,101,108,102,95,108,111,111,112,95,99,111,117,110,116, +0,108,111,111,112,95,99,111,117,110,116,0,112,114,101,115,115,117,114,101,0,42,112,111,105,110,116,115,0,116,111,116, +112,111,105,110,116,115,0,116,104,105,99,107,110,101,115,115,0,115,116,114,111,107,101,115,0,102,114,97,109,101,110,117, +109,0,42,97,99,116,102,114,97,109,101,0,103,115,116,101,112,0,105,110,102,111,91,49,50,56,93,0,115,98,117,102, +102,101,114,95,115,105,122,101,0,115,98,117,102,102,101,114,95,115,102,108,97,103,0,42,115,98,117,102,102,101,114,0, +0,0,0,84,89,80,69,100,1,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104,111, +114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118, +111,105,100,0,76,105,110,107,0,76,105,110,107,68,97,116,97,0,76,105,115,116,66,97,115,101,0,118,101,99,50,115, +0,118,101,99,50,105,0,118,101,99,50,102,0,118,101,99,50,100,0,118,101,99,51,105,0,118,101,99,51,102,0,118, +101,99,51,100,0,118,101,99,52,105,0,118,101,99,52,102,0,118,101,99,52,100,0,114,99,116,105,0,114,99,116,102, +0,73,68,80,114,111,112,101,114,116,121,68,97,116,97,0,73,68,80,114,111,112,101,114,116,121,0,73,68,0,76,105, +98,114,97,114,121,0,70,105,108,101,68,97,116,97,0,80,114,101,118,105,101,119,73,109,97,103,101,0,73,112,111,68, +114,105,118,101,114,0,79,98,106,101,99,116,0,73,112,111,67,117,114,118,101,0,66,80,111,105,110,116,0,66,101,122, +84,114,105,112,108,101,0,73,112,111,0,75,101,121,66,108,111,99,107,0,75,101,121,0,83,99,114,105,112,116,76,105, +110,107,0,84,101,120,116,76,105,110,101,0,84,101,120,116,77,97,114,107,101,114,0,84,101,120,116,0,80,97,99,107, +101,100,70,105,108,101,0,67,97,109,101,114,97,0,73,109,97,103,101,85,115,101,114,0,73,109,97,103,101,0,71,80, +85,84,101,120,116,117,114,101,0,97,110,105,109,0,82,101,110,100,101,114,82,101,115,117,108,116,0,77,84,101,120,0, +84,101,120,0,80,108,117,103,105,110,84,101,120,0,67,66,68,97,116,97,0,67,111,108,111,114,66,97,110,100,0,69, +110,118,77,97,112,0,73,109,66,117,102,0,98,78,111,100,101,84,114,101,101,0,84,101,120,77,97,112,112,105,110,103, +0,76,97,109,112,0,67,117,114,118,101,77,97,112,112,105,110,103,0,87,97,118,101,0,77,97,116,101,114,105,97,108, +0,71,114,111,117,112,0,86,70,111,110,116,0,86,70,111,110,116,68,97,116,97,0,77,101,116,97,69,108,101,109,0, +66,111,117,110,100,66,111,120,0,77,101,116,97,66,97,108,108,0,78,117,114,98,0,67,104,97,114,73,110,102,111,0, +84,101,120,116,66,111,120,0,67,117,114,118,101,0,80,97,116,104,0,77,101,115,104,0,77,70,97,99,101,0,77,84, +70,97,99,101,0,84,70,97,99,101,0,77,86,101,114,116,0,77,69,100,103,101,0,77,68,101,102,111,114,109,86,101, +114,116,0,77,67,111,108,0,77,83,116,105,99,107,121,0,77,83,101,108,101,99,116,0,67,117,115,116,111,109,68,97, +116,97,0,77,117,108,116,105,114,101,115,0,80,97,114,116,105,97,108,86,105,115,105,98,105,108,105,116,121,0,77,68, +101,102,111,114,109,87,101,105,103,104,116,0,77,84,101,120,80,111,108,121,0,77,76,111,111,112,85,86,0,77,76,111, +111,112,67,111,108,0,77,70,108,111,97,116,80,114,111,112,101,114,116,121,0,77,73,110,116,80,114,111,112,101,114,116, +121,0,77,83,116,114,105,110,103,80,114,111,112,101,114,116,121,0,79,114,105,103,83,112,97,99,101,70,97,99,101,0, +77,117,108,116,105,114,101,115,67,111,108,0,77,117,108,116,105,114,101,115,67,111,108,70,97,99,101,0,77,117,108,116, +105,114,101,115,70,97,99,101,0,77,117,108,116,105,114,101,115,69,100,103,101,0,77,117,108,116,105,114,101,115,76,101, +118,101,108,0,77,117,108,116,105,114,101,115,77,97,112,78,111,100,101,0,77,111,100,105,102,105,101,114,68,97,116,97, +0,83,117,98,115,117,114,102,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,77,111,100,105, +102,105,101,114,68,97,116,97,0,67,117,114,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,66,117,105,108,100, +77,111,100,105,102,105,101,114,68,97,116,97,0,77,97,115,107,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114, +114,97,121,77,111,100,105,102,105,101,114,68,97,116,97,0,77,105,114,114,111,114,77,111,100,105,102,105,101,114,68,97, +116,97,0,69,100,103,101,83,112,108,105,116,77,111,100,105,102,105,101,114,68,97,116,97,0,66,101,118,101,108,77,111, +100,105,102,105,101,114,68,97,116,97,0,66,77,101,115,104,77,111,100,105,102,105,101,114,68,97,116,97,0,68,105,115, +112,108,97,99,101,77,111,100,105,102,105,101,114,68,97,116,97,0,85,86,80,114,111,106,101,99,116,77,111,100,105,102, +105,101,114,68,97,116,97,0,68,101,99,105,109,97,116,101,77,111,100,105,102,105,101,114,68,97,116,97,0,83,109,111, +111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67,97,115,116,77,111,100,105,102,105,101,114,68,97,116,97, +0,87,97,118,101,77,111,100,105,102,105,101,114,68,97,116,97,0,65,114,109,97,116,117,114,101,77,111,100,105,102,105, +101,114,68,97,116,97,0,72,111,111,107,77,111,100,105,102,105,101,114,68,97,116,97,0,83,111,102,116,98,111,100,121, +77,111,100,105,102,105,101,114,68,97,116,97,0,67,108,111,116,104,77,111,100,105,102,105,101,114,68,97,116,97,0,67, +108,111,116,104,0,67,108,111,116,104,83,105,109,83,101,116,116,105,110,103,115,0,67,108,111,116,104,67,111,108,108,83, +101,116,116,105,110,103,115,0,80,111,105,110,116,67,97,99,104,101,0,67,111,108,108,105,115,105,111,110,77,111,100,105, +102,105,101,114,68,97,116,97,0,66,86,72,84,114,101,101,0,83,117,114,102,97,99,101,77,111,100,105,102,105,101,114, +68,97,116,97,0,68,101,114,105,118,101,100,77,101,115,104,0,66,86,72,84,114,101,101,70,114,111,109,77,101,115,104, +0,66,111,111,108,101,97,110,77,111,100,105,102,105,101,114,68,97,116,97,0,77,68,101,102,73,110,102,108,117,101,110, +99,101,0,77,68,101,102,67,101,108,108,0,77,101,115,104,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97, +116,97,0,80,97,114,116,105,99,108,101,83,121,115,116,101,109,77,111,100,105,102,105,101,114,68,97,116,97,0,80,97, +114,116,105,99,108,101,83,121,115,116,101,109,0,80,97,114,116,105,99,108,101,73,110,115,116,97,110,99,101,77,111,100, +105,102,105,101,114,68,97,116,97,0,69,120,112,108,111,100,101,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108, +117,105,100,115,105,109,77,111,100,105,102,105,101,114,68,97,116,97,0,70,108,117,105,100,115,105,109,83,101,116,116,105, +110,103,115,0,83,104,114,105,110,107,119,114,97,112,77,111,100,105,102,105,101,114,68,97,116,97,0,83,105,109,112,108, +101,68,101,102,111,114,109,77,111,100,105,102,105,101,114,68,97,116,97,0,76,97,116,116,105,99,101,0,98,68,101,102, +111,114,109,71,114,111,117,112,0,98,65,99,116,105,111,110,0,98,80,111,115,101,0,66,117,108,108,101,116,83,111,102, +116,66,111,100,121,0,80,97,114,116,68,101,102,108,101,99,116,0,83,111,102,116,66,111,100,121,0,79,98,72,111,111, +107,0,82,78,71,0,83,66,86,101,114,116,101,120,0,66,111,100,121,80,111,105,110,116,0,66,111,100,121,83,112,114, +105,110,103,0,83,66,83,99,114,97,116,99,104,0,87,111,114,108,100,0,82,97,100,105,111,0,66,97,115,101,0,65, +118,105,67,111,100,101,99,68,97,116,97,0,81,117,105,99,107,116,105,109,101,67,111,100,101,99,68,97,116,97,0,70, +70,77,112,101,103,67,111,100,101,99,68,97,116,97,0,65,117,100,105,111,68,97,116,97,0,83,99,101,110,101,82,101, +110,100,101,114,76,97,121,101,114,0,82,101,110,100,101,114,68,97,116,97,0,82,101,110,100,101,114,80,114,111,102,105, +108,101,0,71,97,109,101,70,114,97,109,105,110,103,0,84,105,109,101,77,97,114,107,101,114,0,73,109,97,103,101,80, +97,105,110,116,83,101,116,116,105,110,103,115,0,66,114,117,115,104,0,80,97,114,116,105,99,108,101,66,114,117,115,104, +68,97,116,97,0,80,97,114,116,105,99,108,101,69,100,105,116,83,101,116,116,105,110,103,115,0,84,114,97,110,115,102, +111,114,109,79,114,105,101,110,116,97,116,105,111,110,0,84,111,111,108,83,101,116,116,105,110,103,115,0,66,114,117,115, +104,68,97,116,97,0,83,99,117,108,112,116,68,97,116,97,0,83,99,117,108,112,116,83,101,115,115,105,111,110,0,83, +99,101,110,101,0,68,97,103,70,111,114,101,115,116,0,66,71,112,105,99,0,86,105,101,119,51,68,0,83,112,97,99, +101,76,105,110,107,0,83,99,114,65,114,101,97,0,82,101,110,100,101,114,73,110,102,111,0,82,101,116,111,112,111,86, +105,101,119,68,97,116,97,0,86,105,101,119,68,101,112,116,104,115,0,98,71,80,100,97,116,97,0,86,105,101,119,50, +68,0,83,112,97,99,101,73,110,102,111,0,83,112,97,99,101,73,112,111,0,83,112,97,99,101,66,117,116,115,0,83, +112,97,99,101,83,101,113,0,83,112,97,99,101,70,105,108,101,0,100,105,114,101,110,116,114,121,0,66,108,101,110,100, +72,97,110,100,108,101,0,83,112,97,99,101,79,111,112,115,0,84,114,101,101,83,116,111,114,101,0,84,114,101,101,83, +116,111,114,101,69,108,101,109,0,83,112,97,99,101,73,109,97,103,101,0,83,112,97,99,101,78,108,97,0,83,112,97, +99,101,84,101,120,116,0,83,99,114,105,112,116,0,83,112,97,99,101,83,99,114,105,112,116,0,83,112,97,99,101,84, +105,109,101,0,83,112,97,99,101,78,111,100,101,0,83,112,97,99,101,73,109,97,83,101,108,0,70,105,108,101,76,105, +115,116,0,84,104,101,109,101,85,73,0,84,104,101,109,101,83,112,97,99,101,0,84,104,101,109,101,87,105,114,101,67, +111,108,111,114,0,98,84,104,101,109,101,0,83,111,108,105,100,76,105,103,104,116,0,85,115,101,114,68,101,102,0,98, +83,99,114,101,101,110,0,83,99,114,86,101,114,116,0,83,99,114,69,100,103,101,0,80,97,110,101,108,0,70,105,108, +101,71,108,111,98,97,108,0,83,116,114,105,112,69,108,101,109,0,84,83,116,114,105,112,69,108,101,109,0,83,116,114, +105,112,67,114,111,112,0,83,116,114,105,112,84,114,97,110,115,102,111,114,109,0,83,116,114,105,112,67,111,108,111,114, +66,97,108,97,110,99,101,0,83,116,114,105,112,67,111,108,111,114,66,97,108,97,110,99,101,71,85,73,72,101,108,112, +101,114,0,83,116,114,105,112,80,114,111,120,121,0,83,116,114,105,112,0,80,108,117,103,105,110,83,101,113,0,83,101, +113,117,101,110,99,101,0,98,83,111,117,110,100,0,104,100,97,117,100,105,111,0,77,101,116,97,83,116,97,99,107,0, +69,100,105,116,105,110,103,0,87,105,112,101,86,97,114,115,0,71,108,111,119,86,97,114,115,0,84,114,97,110,115,102, +111,114,109,86,97,114,115,0,83,111,108,105,100,67,111,108,111,114,86,97,114,115,0,83,112,101,101,100,67,111,110,116, +114,111,108,86,97,114,115,0,69,102,102,101,99,116,0,66,117,105,108,100,69,102,102,0,80,97,114,116,69,102,102,0, +80,97,114,116,105,99,108,101,0,87,97,118,101,69,102,102,0,79,111,112,115,0,98,80,114,111,112,101,114,116,121,0, +98,78,101,97,114,83,101,110,115,111,114,0,98,77,111,117,115,101,83,101,110,115,111,114,0,98,84,111,117,99,104,83, +101,110,115,111,114,0,98,75,101,121,98,111,97,114,100,83,101,110,115,111,114,0,98,80,114,111,112,101,114,116,121,83, +101,110,115,111,114,0,98,65,99,116,117,97,116,111,114,83,101,110,115,111,114,0,98,68,101,108,97,121,83,101,110,115, +111,114,0,98,67,111,108,108,105,115,105,111,110,83,101,110,115,111,114,0,98,82,97,100,97,114,83,101,110,115,111,114, +0,98,82,97,110,100,111,109,83,101,110,115,111,114,0,98,82,97,121,83,101,110,115,111,114,0,98,77,101,115,115,97, +103,101,83,101,110,115,111,114,0,98,83,101,110,115,111,114,0,98,67,111,110,116,114,111,108,108,101,114,0,98,74,111, +121,115,116,105,99,107,83,101,110,115,111,114,0,98,69,120,112,114,101,115,115,105,111,110,67,111,110,116,0,98,80,121, +116,104,111,110,67,111,110,116,0,98,65,99,116,117,97,116,111,114,0,98,65,100,100,79,98,106,101,99,116,65,99,116, +117,97,116,111,114,0,98,65,99,116,105,111,110,65,99,116,117,97,116,111,114,0,98,83,111,117,110,100,65,99,116,117, +97,116,111,114,0,98,67,68,65,99,116,117,97,116,111,114,0,98,69,100,105,116,79,98,106,101,99,116,65,99,116,117, +97,116,111,114,0,98,83,99,101,110,101,65,99,116,117,97,116,111,114,0,98,80,114,111,112,101,114,116,121,65,99,116, +117,97,116,111,114,0,98,79,98,106,101,99,116,65,99,116,117,97,116,111,114,0,98,73,112,111,65,99,116,117,97,116, +111,114,0,98,67,97,109,101,114,97,65,99,116,117,97,116,111,114,0,98,67,111,110,115,116,114,97,105,110,116,65,99, +116,117,97,116,111,114,0,98,71,114,111,117,112,65,99,116,117,97,116,111,114,0,98,82,97,110,100,111,109,65,99,116, +117,97,116,111,114,0,98,77,101,115,115,97,103,101,65,99,116,117,97,116,111,114,0,98,71,97,109,101,65,99,116,117, +97,116,111,114,0,98,86,105,115,105,98,105,108,105,116,121,65,99,116,117,97,116,111,114,0,98,84,119,111,68,70,105, +108,116,101,114,65,99,116,117,97,116,111,114,0,98,80,97,114,101,110,116,65,99,116,117,97,116,111,114,0,98,83,116, +97,116,101,65,99,116,117,97,116,111,114,0,70,114,101,101,67,97,109,101,114,97,0,98,83,97,109,112,108,101,0,98, +83,111,117,110,100,76,105,115,116,101,110,101,114,0,83,112,97,99,101,83,111,117,110,100,0,71,114,111,117,112,79,98, +106,101,99,116,0,66,111,110,101,0,98,65,114,109,97,116,117,114,101,0,98,80,111,115,101,67,104,97,110,110,101,108, +0,98,65,99,116,105,111,110,71,114,111,117,112,0,98,65,99,116,105,111,110,67,104,97,110,110,101,108,0,83,112,97, +99,101,65,99,116,105,111,110,0,98,67,111,110,115,116,114,97,105,110,116,67,104,97,110,110,101,108,0,98,67,111,110, +115,116,114,97,105,110,116,0,98,67,111,110,115,116,114,97,105,110,116,84,97,114,103,101,116,0,98,80,121,116,104,111, +110,67,111,110,115,116,114,97,105,110,116,0,98,75,105,110,101,109,97,116,105,99,67,111,110,115,116,114,97,105,110,116, +0,98,84,114,97,99,107,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,111,116,97,116,101,76,105,107,101,67, +111,110,115,116,114,97,105,110,116,0,98,76,111,99,97,116,101,76,105,107,101,67,111,110,115,116,114,97,105,110,116,0, +98,77,105,110,77,97,120,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,107,101,67,111,110,115,116, +114,97,105,110,116,0,98,65,99,116,105,111,110,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,107,84,114,97, +99,107,67,111,110,115,116,114,97,105,110,116,0,98,70,111,108,108,111,119,80,97,116,104,67,111,110,115,116,114,97,105, +110,116,0,98,83,116,114,101,116,99,104,84,111,67,111,110,115,116,114,97,105,110,116,0,98,82,105,103,105,100,66,111, +100,121,74,111,105,110,116,67,111,110,115,116,114,97,105,110,116,0,98,67,108,97,109,112,84,111,67,111,110,115,116,114, +97,105,110,116,0,98,67,104,105,108,100,79,102,67,111,110,115,116,114,97,105,110,116,0,98,84,114,97,110,115,102,111, +114,109,67,111,110,115,116,114,97,105,110,116,0,98,76,111,99,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116, +0,98,82,111,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98,83,105,122,101,76,105,109,105,116,67, +111,110,115,116,114,97,105,110,116,0,98,68,105,115,116,76,105,109,105,116,67,111,110,115,116,114,97,105,110,116,0,98, +83,104,114,105,110,107,119,114,97,112,67,111,110,115,116,114,97,105,110,116,0,98,65,99,116,105,111,110,77,111,100,105, +102,105,101,114,0,98,65,99,116,105,111,110,83,116,114,105,112,0,98,78,111,100,101,83,116,97,99,107,0,98,78,111, +100,101,83,111,99,107,101,116,0,98,78,111,100,101,76,105,110,107,0,98,78,111,100,101,0,98,78,111,100,101,80,114, +101,118,105,101,119,0,98,78,111,100,101,84,121,112,101,0,78,111,100,101,73,109,97,103,101,65,110,105,109,0,78,111, +100,101,66,108,117,114,68,97,116,97,0,78,111,100,101,68,66,108,117,114,68,97,116,97,0,78,111,100,101,66,105,108, +97,116,101,114,97,108,66,108,117,114,68,97,116,97,0,78,111,100,101,72,117,101,83,97,116,0,78,111,100,101,73,109, +97,103,101,70,105,108,101,0,78,111,100,101,67,104,114,111,109,97,0,78,111,100,101,84,119,111,88,89,115,0,78,111, +100,101,84,119,111,70,108,111,97,116,115,0,78,111,100,101,71,101,111,109,101,116,114,121,0,78,111,100,101,86,101,114, +116,101,120,67,111,108,0,78,111,100,101,68,101,102,111,99,117,115,0,78,111,100,101,83,99,114,105,112,116,68,105,99, +116,0,78,111,100,101,71,108,97,114,101,0,78,111,100,101,84,111,110,101,109,97,112,0,78,111,100,101,76,101,110,115, +68,105,115,116,0,84,101,120,78,111,100,101,79,117,116,112,117,116,0,67,117,114,118,101,77,97,112,80,111,105,110,116, +0,67,117,114,118,101,77,97,112,0,66,114,117,115,104,67,108,111,110,101,0,67,117,115,116,111,109,68,97,116,97,76, +97,121,101,114,0,72,97,105,114,75,101,121,0,80,97,114,116,105,99,108,101,75,101,121,0,67,104,105,108,100,80,97, +114,116,105,99,108,101,0,80,97,114,116,105,99,108,101,68,97,116,97,0,80,97,114,116,105,99,108,101,83,101,116,116, +105,110,103,115,0,80,97,114,116,105,99,108,101,69,100,105,116,0,80,97,114,116,105,99,108,101,67,97,99,104,101,75, +101,121,0,76,105,110,107,78,111,100,101,0,98,71,80,68,115,112,111,105,110,116,0,98,71,80,68,115,116,114,111,107, +101,0,98,71,80,68,102,114,97,109,101,0,98,71,80,68,108,97,121,101,114,0,0,84,76,69,78,1,0,1,0,2, +0,2,0,4,0,4,0,4,0,4,0,8,0,0,0,8,0,12,0,8,0,4,0,8,0,8,0,16,0,12,0,12, +0,24,0,16,0,16,0,32,0,16,0,16,0,20,0,76,0,52,0,40,2,0,0,32,0,-116,0,80,3,92,0,36, +0,56,0,84,0,112,0,120,0,16,0,24,0,40,0,120,0,20,0,-124,0,32,0,-128,1,0,0,0,0,0,0,-120, +0,16,1,84,1,24,0,8,3,-88,0,0,0,124,0,-124,0,-128,1,8,1,56,0,108,2,76,0,68,1,0,0,108, +0,104,0,-120,0,56,0,8,0,16,0,56,1,0,0,24,1,20,0,44,0,60,0,24,0,12,0,12,0,4,0,8, +0,8,0,24,0,76,0,32,0,8,0,12,0,8,0,8,0,4,0,4,0,0,1,32,0,16,0,64,0,24,0,12, +0,56,0,0,0,52,0,68,0,88,0,96,0,68,0,96,0,116,0,64,0,60,0,108,0,60,0,-108,0,-104,0,60, +0,92,0,104,0,-72,0,100,0,-76,0,52,0,68,0,0,0,-124,0,28,0,20,0,100,0,0,0,60,0,0,0,0, +0,64,0,8,0,8,0,-40,0,76,0,64,1,64,0,64,0,60,0,-92,1,108,0,104,0,116,0,40,0,84,0,56, +0,120,0,-128,0,-8,0,-48,0,0,0,16,0,0,0,0,0,0,0,108,1,40,0,28,0,-80,0,-112,0,52,0,16, +0,72,0,-48,3,56,0,16,0,80,0,12,0,-72,0,8,0,72,0,80,0,-24,0,8,0,-88,0,0,0,124,5,0, +0,60,0,28,3,36,0,-52,0,0,0,0,0,0,0,20,0,-120,0,36,0,88,1,-36,0,-56,0,-56,1,0,0,0, +0,8,1,12,0,12,0,8,1,-76,0,-128,0,80,2,36,0,-92,0,-36,0,-124,2,0,0,-104,0,-48,0,16,0,56, +14,56,0,32,12,120,0,20,0,24,0,-28,0,32,0,80,0,28,0,16,0,8,0,60,0,0,0,-4,0,-16,0,-88, +1,-60,0,28,1,0,0,16,0,28,0,12,0,24,0,48,0,16,0,28,0,16,0,24,0,56,1,0,0,56,0,44, +0,64,0,48,0,8,0,44,0,72,0,104,0,40,0,8,0,72,0,44,0,40,0,108,0,68,0,76,0,80,0,60, +0,-128,0,76,0,60,0,12,0,92,0,28,0,20,0,80,0,16,0,76,0,108,0,84,0,28,0,96,0,60,0,56, +0,108,0,-116,0,4,0,20,0,12,0,8,0,40,0,0,0,68,0,-80,0,24,0,4,1,116,0,-104,1,72,0,64, +0,-64,0,44,0,64,0,116,0,60,0,104,0,52,0,44,0,44,0,68,0,44,0,64,0,44,0,20,0,52,0,96, +0,12,0,108,0,92,0,28,0,28,0,28,0,52,0,20,0,60,0,-116,0,36,0,120,0,24,0,-52,0,0,0,0, +0,16,0,40,0,28,0,12,0,12,0,16,1,40,0,8,0,8,0,64,0,32,0,24,0,8,0,24,0,32,0,8, +0,32,0,12,0,44,0,20,0,68,0,24,0,56,0,72,0,-4,0,-32,1,0,0,0,0,0,0,16,0,20,0,24, +0,-84,0,83,84,82,67,57,1,0,0,10,0,2,0,10,0,0,0,10,0,1,0,11,0,3,0,11,0,0,0,11, +0,1,0,9,0,2,0,12,0,2,0,9,0,3,0,9,0,4,0,13,0,2,0,2,0,5,0,2,0,6,0,14, +0,2,0,4,0,5,0,4,0,6,0,15,0,2,0,7,0,5,0,7,0,6,0,16,0,2,0,8,0,5,0,8, +0,6,0,17,0,3,0,4,0,5,0,4,0,6,0,4,0,7,0,18,0,3,0,7,0,5,0,7,0,6,0,7, +0,7,0,19,0,3,0,8,0,5,0,8,0,6,0,8,0,7,0,20,0,4,0,4,0,5,0,4,0,6,0,4, +0,7,0,4,0,8,0,21,0,4,0,7,0,5,0,7,0,6,0,7,0,7,0,7,0,8,0,22,0,4,0,8, +0,5,0,8,0,6,0,8,0,7,0,8,0,8,0,23,0,4,0,4,0,9,0,4,0,10,0,4,0,11,0,4, +0,12,0,24,0,4,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,25,0,4,0,9,0,13,0,12, +0,14,0,4,0,15,0,4,0,16,0,26,0,10,0,26,0,0,0,26,0,1,0,0,0,17,0,0,0,18,0,0, +0,19,0,2,0,20,0,4,0,21,0,25,0,22,0,4,0,23,0,4,0,24,0,27,0,9,0,9,0,0,0,9, +0,1,0,27,0,25,0,28,0,26,0,0,0,27,0,2,0,28,0,2,0,20,0,4,0,29,0,26,0,30,0,28, +0,8,0,27,0,31,0,27,0,32,0,29,0,33,0,0,0,34,0,0,0,35,0,4,0,36,0,4,0,37,0,28, +0,38,0,30,0,6,0,4,0,39,0,4,0,40,0,2,0,41,0,2,0,42,0,2,0,43,0,4,0,44,0,31, +0,6,0,32,0,45,0,2,0,46,0,2,0,47,0,2,0,18,0,2,0,20,0,0,0,48,0,33,0,21,0,33, +0,0,0,33,0,1,0,34,0,49,0,35,0,50,0,24,0,51,0,24,0,52,0,2,0,46,0,2,0,47,0,2, +0,53,0,2,0,54,0,2,0,55,0,2,0,56,0,2,0,20,0,2,0,57,0,7,0,11,0,7,0,12,0,4, +0,58,0,7,0,59,0,7,0,60,0,7,0,61,0,31,0,62,0,36,0,7,0,27,0,31,0,12,0,63,0,24, +0,64,0,2,0,46,0,2,0,65,0,2,0,66,0,2,0,37,0,37,0,16,0,37,0,0,0,37,0,1,0,7, +0,67,0,7,0,61,0,2,0,18,0,2,0,47,0,2,0,68,0,2,0,20,0,4,0,69,0,4,0,70,0,9, +0,2,0,7,0,71,0,0,0,17,0,0,0,72,0,7,0,73,0,7,0,74,0,38,0,12,0,27,0,31,0,37, +0,75,0,0,0,76,0,4,0,77,0,7,0,61,0,12,0,78,0,36,0,79,0,27,0,80,0,2,0,18,0,2, +0,81,0,2,0,82,0,2,0,20,0,39,0,5,0,27,0,83,0,2,0,84,0,2,0,85,0,2,0,86,0,4, +0,37,0,40,0,6,0,40,0,0,0,40,0,1,0,0,0,87,0,0,0,88,0,4,0,23,0,4,0,89,0,41, +0,10,0,41,0,0,0,41,0,1,0,4,0,90,0,4,0,91,0,4,0,92,0,4,0,43,0,4,0,14,0,4, +0,93,0,0,0,94,0,0,0,95,0,42,0,15,0,27,0,31,0,0,0,96,0,4,0,93,0,4,0,97,0,12, +0,98,0,40,0,99,0,40,0,100,0,4,0,101,0,4,0,102,0,12,0,103,0,0,0,104,0,4,0,105,0,4, +0,106,0,9,0,107,0,8,0,108,0,43,0,5,0,4,0,109,0,4,0,110,0,4,0,93,0,4,0,37,0,9, +0,2,0,44,0,20,0,27,0,31,0,2,0,18,0,2,0,20,0,7,0,111,0,7,0,112,0,7,0,113,0,7, +0,114,0,7,0,115,0,7,0,116,0,7,0,117,0,7,0,118,0,7,0,119,0,7,0,120,0,7,0,121,0,2, +0,122,0,2,0,123,0,7,0,124,0,36,0,79,0,39,0,125,0,32,0,126,0,45,0,12,0,4,0,127,0,4, +0,-128,0,4,0,-127,0,4,0,-126,0,2,0,-125,0,2,0,-124,0,2,0,20,0,2,0,-123,0,2,0,-122,0,2, +0,-121,0,2,0,-120,0,2,0,-119,0,46,0,32,0,27,0,31,0,0,0,34,0,12,0,-118,0,47,0,-117,0,48, +0,-116,0,49,0,-115,0,2,0,-123,0,2,0,20,0,2,0,-114,0,2,0,18,0,2,0,37,0,2,0,43,0,4, +0,-113,0,2,0,-112,0,2,0,-111,0,2,0,-110,0,2,0,-109,0,2,0,-108,0,2,0,-107,0,4,0,-106,0,4, +0,-105,0,43,0,-104,0,30,0,-103,0,7,0,-102,0,4,0,-101,0,2,0,-100,0,2,0,-99,0,2,0,-98,0,2, +0,-97,0,7,0,-96,0,7,0,-95,0,9,0,-94,0,50,0,31,0,2,0,-93,0,2,0,-92,0,2,0,-91,0,2, +0,-90,0,32,0,-89,0,51,0,-88,0,0,0,-87,0,0,0,-86,0,0,0,-85,0,0,0,-84,0,0,0,-83,0,7, +0,-82,0,7,0,-81,0,2,0,-80,0,2,0,-79,0,2,0,-78,0,2,0,-77,0,2,0,-76,0,2,0,-75,0,2, +0,-74,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7,0,-69,0,7,0,57,0,7,0,-68,0,7, +0,-67,0,7,0,-66,0,7,0,-65,0,7,0,-64,0,52,0,15,0,0,0,-63,0,9,0,-62,0,0,0,-61,0,0, +0,-60,0,4,0,-59,0,4,0,-58,0,9,0,-57,0,7,0,-56,0,7,0,-55,0,7,0,-54,0,4,0,-53,0,9, +0,-52,0,9,0,-51,0,4,0,-50,0,4,0,37,0,53,0,6,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, +0,-49,0,7,0,67,0,4,0,64,0,54,0,5,0,2,0,20,0,2,0,36,0,2,0,64,0,2,0,-48,0,53, +0,-54,0,55,0,17,0,32,0,-89,0,46,0,-47,0,56,0,-46,0,7,0,-45,0,7,0,-44,0,2,0,18,0,2, +0,-43,0,7,0,113,0,7,0,114,0,7,0,-42,0,4,0,-41,0,2,0,-40,0,2,0,-39,0,4,0,-123,0,4, +0,-113,0,2,0,-38,0,2,0,-37,0,51,0,56,0,27,0,31,0,7,0,-36,0,7,0,-35,0,7,0,-34,0,7, +0,-33,0,7,0,-32,0,7,0,-31,0,7,0,-30,0,7,0,-29,0,7,0,-28,0,7,0,-27,0,7,0,-26,0,7, +0,-25,0,7,0,-24,0,7,0,-23,0,7,0,-22,0,7,0,-21,0,7,0,-20,0,7,0,-19,0,7,0,-18,0,7, +0,-17,0,2,0,-16,0,2,0,-15,0,2,0,-14,0,2,0,-13,0,2,0,-12,0,2,0,-11,0,2,0,-10,0,2, +0,20,0,2,0,18,0,2,0,-43,0,7,0,-9,0,7,0,-8,0,7,0,-7,0,7,0,-6,0,2,0,-5,0,2, +0,-4,0,2,0,-3,0,2,0,-125,0,4,0,23,0,4,0,-128,0,4,0,-127,0,4,0,-126,0,7,0,-2,0,7, +0,-1,0,7,0,-67,0,45,0,0,1,57,0,1,1,36,0,79,0,46,0,-47,0,52,0,2,1,54,0,3,1,55, +0,4,1,30,0,-103,0,0,0,5,1,0,0,6,1,58,0,8,0,7,0,7,1,7,0,8,1,7,0,-81,0,4, +0,20,0,7,0,9,1,7,0,10,1,7,0,11,1,32,0,45,0,59,0,80,0,27,0,31,0,2,0,18,0,2, +0,12,1,4,0,13,1,2,0,-79,0,2,0,14,1,7,0,-73,0,7,0,-72,0,7,0,-71,0,7,0,-70,0,7, +0,15,1,7,0,16,1,7,0,17,1,7,0,18,1,7,0,19,1,7,0,20,1,7,0,21,1,7,0,22,1,7, +0,23,1,7,0,24,1,7,0,25,1,60,0,26,1,2,0,27,1,2,0,70,0,7,0,113,0,7,0,114,0,7, +0,28,1,7,0,29,1,7,0,30,1,2,0,31,1,2,0,32,1,2,0,33,1,2,0,34,1,0,0,35,1,0, +0,36,1,2,0,37,1,2,0,38,1,2,0,39,1,2,0,40,1,2,0,41,1,7,0,42,1,7,0,43,1,7, +0,44,1,7,0,45,1,2,0,46,1,2,0,43,0,2,0,47,1,2,0,48,1,2,0,49,1,2,0,50,1,7, +0,51,1,7,0,52,1,7,0,53,1,7,0,54,1,7,0,55,1,7,0,56,1,7,0,57,1,7,0,58,1,7, +0,59,1,7,0,60,1,7,0,61,1,7,0,62,1,2,0,63,1,2,0,64,1,4,0,65,1,4,0,66,1,2, +0,67,1,2,0,68,1,2,0,69,1,2,0,70,1,7,0,71,1,7,0,72,1,7,0,73,1,7,0,74,1,2, +0,75,1,2,0,76,1,50,0,77,1,36,0,79,0,30,0,-103,0,39,0,125,0,61,0,2,0,27,0,31,0,36, +0,79,0,62,0,-127,0,27,0,31,0,2,0,-79,0,2,0,20,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,7, +0,78,1,7,0,79,1,7,0,80,1,7,0,81,1,7,0,82,1,7,0,83,1,7,0,84,1,7,0,85,1,7, +0,86,1,7,0,87,1,7,0,88,1,7,0,89,1,7,0,90,1,7,0,91,1,7,0,92,1,7,0,93,1,7, +0,94,1,7,0,95,1,7,0,96,1,7,0,97,1,7,0,98,1,7,0,99,1,7,0,100,1,7,0,101,1,7, +0,102,1,7,0,103,1,7,0,104,1,2,0,105,1,2,0,106,1,2,0,107,1,0,0,108,1,0,0,109,1,7, +0,110,1,7,0,111,1,2,0,112,1,2,0,113,1,7,0,114,1,7,0,115,1,7,0,116,1,7,0,117,1,2, +0,118,1,2,0,119,1,4,0,13,1,4,0,120,1,2,0,121,1,2,0,122,1,2,0,123,1,2,0,124,1,7, +0,125,1,7,0,126,1,7,0,127,1,7,0,-128,1,7,0,-127,1,7,0,-126,1,7,0,-125,1,7,0,-124,1,7, +0,-123,1,7,0,-122,1,0,0,-121,1,7,0,-120,1,7,0,-119,1,7,0,-118,1,4,0,-117,1,0,0,-116,1,0, +0,47,1,0,0,-115,1,0,0,5,1,2,0,-114,1,2,0,-113,1,2,0,64,1,2,0,-112,1,2,0,-111,1,2, +0,-110,1,7,0,-109,1,7,0,-108,1,7,0,-107,1,7,0,-106,1,7,0,-105,1,2,0,-93,0,2,0,-92,0,54, +0,-104,1,54,0,-103,1,0,0,-102,1,0,0,-101,1,0,0,-100,1,0,0,-99,1,2,0,-98,1,2,0,12,1,7, +0,-97,1,7,0,-96,1,50,0,77,1,57,0,1,1,36,0,79,0,63,0,-95,1,30,0,-103,0,7,0,-94,1,7, +0,-93,1,7,0,-92,1,7,0,-91,1,7,0,-90,1,2,0,-89,1,2,0,70,0,7,0,-88,1,7,0,-87,1,7, +0,-86,1,7,0,-85,1,7,0,-84,1,7,0,-83,1,7,0,-82,1,7,0,-81,1,7,0,-80,1,2,0,-79,1,2, +0,-78,1,7,0,-77,1,7,0,-76,1,7,0,-75,1,7,0,-74,1,7,0,-73,1,4,0,-72,1,4,0,-71,1,4, +0,-70,1,39,0,125,0,12,0,-69,1,64,0,6,0,27,0,31,0,0,0,-68,1,7,0,-67,1,7,0,37,0,65, +0,2,0,43,0,-104,0,66,0,26,0,66,0,0,0,66,0,1,0,67,0,-66,1,4,0,-65,1,4,0,-64,1,4, +0,-63,1,4,0,-62,1,4,0,-61,1,4,0,-60,1,2,0,18,0,2,0,20,0,2,0,-59,1,2,0,-58,1,7, +0,5,0,7,0,6,0,7,0,7,0,7,0,-57,1,7,0,-56,1,7,0,-55,1,7,0,-54,1,7,0,-53,1,7, +0,-52,1,7,0,-51,1,7,0,23,0,7,0,-50,1,7,0,-49,1,68,0,15,0,27,0,31,0,67,0,-66,1,12, +0,-48,1,12,0,-47,1,36,0,79,0,62,0,-46,1,2,0,20,0,2,0,-45,1,4,0,-80,0,7,0,7,1,7, +0,-81,0,7,0,8,1,7,0,-44,1,7,0,-43,1,7,0,-42,1,35,0,10,0,7,0,-41,1,7,0,-40,1,7, +0,-39,1,7,0,-38,1,2,0,-37,1,2,0,-36,1,0,0,-35,1,0,0,-34,1,0,0,-33,1,0,0,-32,1,34, +0,7,0,7,0,-31,1,7,0,-40,1,7,0,-39,1,2,0,-35,1,2,0,-32,1,7,0,-38,1,7,0,37,0,69, +0,21,0,69,0,0,0,69,0,1,0,2,0,18,0,2,0,-30,1,2,0,-32,1,2,0,20,0,2,0,-29,1,2, +0,-28,1,2,0,-27,1,2,0,-26,1,2,0,-25,1,2,0,-24,1,2,0,-23,1,2,0,-22,1,7,0,-21,1,7, +0,-20,1,34,0,49,0,35,0,50,0,2,0,-19,1,2,0,-18,1,4,0,-17,1,70,0,5,0,2,0,-16,1,2, +0,-30,1,0,0,20,0,0,0,37,0,2,0,70,0,71,0,4,0,7,0,5,0,7,0,6,0,7,0,8,0,7, +0,-15,1,72,0,57,0,27,0,31,0,67,0,-66,1,12,0,-14,1,12,0,-47,1,32,0,-13,1,32,0,-12,1,32, +0,-11,1,36,0,79,0,73,0,-10,1,38,0,-9,1,62,0,-46,1,12,0,-8,1,7,0,7,1,7,0,-81,0,7, +0,8,1,4,0,-80,0,2,0,-7,1,2,0,-45,1,2,0,20,0,2,0,-6,1,7,0,-5,1,7,0,-4,1,7, +0,-3,1,2,0,-27,1,2,0,-26,1,2,0,-2,1,2,0,-1,1,4,0,70,0,2,0,23,0,2,0,98,0,2, +0,67,0,2,0,0,2,7,0,1,2,7,0,2,2,7,0,3,2,7,0,4,2,7,0,5,2,7,0,6,2,7, +0,7,2,7,0,8,2,7,0,9,2,7,0,10,2,0,0,11,2,0,0,12,2,64,0,13,2,64,0,14,2,64, +0,15,2,64,0,16,2,4,0,17,2,4,0,18,2,4,0,19,2,4,0,37,0,71,0,20,2,4,0,21,2,4, +0,22,2,70,0,23,2,70,0,24,2,74,0,39,0,27,0,31,0,67,0,-66,1,12,0,25,2,36,0,79,0,38, +0,-9,1,62,0,-46,1,75,0,26,2,76,0,27,2,77,0,28,2,78,0,29,2,79,0,30,2,80,0,31,2,81, +0,32,2,82,0,33,2,74,0,34,2,83,0,35,2,84,0,36,2,84,0,37,2,84,0,38,2,4,0,54,0,4, +0,39,2,4,0,40,2,4,0,41,2,4,0,42,2,4,0,-80,0,7,0,7,1,7,0,-81,0,7,0,8,1,7, +0,43,2,7,0,37,0,2,0,44,2,2,0,20,0,2,0,45,2,2,0,46,2,2,0,-45,1,2,0,47,2,85, +0,48,2,86,0,49,2,9,0,-94,0,77,0,8,0,9,0,50,2,7,0,51,2,4,0,52,2,0,0,20,0,0, +0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,75,0,8,0,4,0,56,2,4,0,57,2,4,0,58,2,4, +0,59,2,0,0,37,0,0,0,-30,1,0,0,60,2,0,0,20,0,79,0,5,0,4,0,56,2,4,0,57,2,0, +0,61,2,0,0,62,2,2,0,20,0,87,0,2,0,4,0,63,2,7,0,-39,1,80,0,3,0,87,0,64,2,4, +0,65,2,4,0,20,0,78,0,6,0,7,0,66,2,2,0,67,2,0,0,20,0,0,0,-30,1,0,0,62,2,0, +0,68,2,81,0,4,0,0,0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,88,0,6,0,46,0,50,2,0, +0,20,0,0,0,53,2,2,0,13,1,2,0,54,2,2,0,55,2,89,0,1,0,7,0,69,2,90,0,5,0,0, +0,-49,0,0,0,-73,0,0,0,-72,0,0,0,-71,0,4,0,37,0,82,0,1,0,7,0,70,2,83,0,2,0,4, +0,71,2,4,0,18,0,76,0,7,0,7,0,51,2,46,0,50,2,0,0,20,0,0,0,53,2,2,0,13,1,2, +0,54,2,2,0,55,2,91,0,1,0,7,0,72,2,92,0,1,0,4,0,73,2,93,0,1,0,0,0,74,2,94, +0,1,0,7,0,51,2,95,0,4,0,7,0,-49,0,7,0,-73,0,7,0,-72,0,7,0,-71,0,96,0,1,0,95, +0,52,2,97,0,5,0,4,0,75,2,4,0,76,2,0,0,20,0,0,0,-30,1,0,0,-74,0,98,0,2,0,4, +0,77,2,4,0,76,2,99,0,14,0,99,0,0,0,99,0,1,0,97,0,78,2,96,0,79,2,98,0,80,2,0, +0,81,2,12,0,82,2,12,0,83,2,100,0,84,2,4,0,54,0,4,0,40,2,4,0,39,2,4,0,37,0,78, +0,85,2,85,0,14,0,12,0,86,2,78,0,85,2,0,0,87,2,0,0,88,2,0,0,89,2,0,0,90,2,0, +0,91,2,0,0,92,2,0,0,93,2,0,0,20,0,84,0,36,2,84,0,38,2,2,0,94,2,0,0,95,2,86, +0,8,0,4,0,96,2,4,0,97,2,75,0,98,2,79,0,99,2,4,0,40,2,4,0,39,2,4,0,54,0,4, +0,37,0,101,0,6,0,101,0,0,0,101,0,1,0,4,0,18,0,4,0,13,1,0,0,17,0,0,0,100,2,102, +0,7,0,101,0,101,2,2,0,102,2,2,0,86,2,2,0,103,2,2,0,93,0,9,0,104,2,9,0,105,2,103, +0,3,0,101,0,101,2,32,0,-89,0,0,0,17,0,104,0,5,0,101,0,101,2,32,0,-89,0,0,0,17,0,2, +0,106,2,0,0,107,2,105,0,5,0,101,0,101,2,7,0,91,0,7,0,108,2,4,0,109,2,4,0,110,2,106, +0,5,0,101,0,101,2,32,0,111,2,0,0,72,0,4,0,13,1,4,0,20,0,107,0,13,0,101,0,101,2,32, +0,112,2,32,0,113,2,32,0,114,2,32,0,115,2,7,0,116,2,7,0,117,2,7,0,108,2,7,0,118,2,4, +0,119,2,4,0,120,2,4,0,93,0,4,0,121,2,108,0,5,0,101,0,101,2,2,0,122,2,2,0,20,0,7, +0,123,2,32,0,124,2,109,0,3,0,101,0,101,2,7,0,125,2,4,0,93,0,110,0,10,0,101,0,101,2,7, +0,126,2,4,0,127,2,4,0,37,0,2,0,93,0,2,0,-128,2,2,0,-127,2,2,0,-126,2,7,0,-125,2,0, +0,-124,2,111,0,3,0,101,0,101,2,7,0,37,0,4,0,18,0,112,0,11,0,101,0,101,2,51,0,-123,2,7, +0,-122,2,4,0,-121,2,0,0,-124,2,7,0,-120,2,4,0,-119,2,32,0,-118,2,0,0,-117,2,4,0,-116,2,4, +0,37,0,113,0,10,0,101,0,101,2,32,0,-115,2,46,0,-114,2,4,0,93,0,4,0,-113,2,7,0,-112,2,7, +0,-111,2,0,0,-117,2,4,0,-116,2,4,0,37,0,114,0,3,0,101,0,101,2,7,0,-110,2,4,0,-109,2,115, +0,5,0,101,0,101,2,7,0,-108,2,0,0,-124,2,2,0,20,0,2,0,-107,2,116,0,8,0,101,0,101,2,32, +0,-89,0,7,0,-108,2,7,0,-38,1,7,0,109,0,0,0,-124,2,2,0,20,0,2,0,18,0,117,0,21,0,101, +0,101,2,32,0,-106,2,0,0,-124,2,51,0,-123,2,32,0,-118,2,2,0,20,0,2,0,37,0,7,0,-105,2,7, +0,-104,2,7,0,-103,2,7,0,-5,1,7,0,-102,2,7,0,-101,2,7,0,-100,2,7,0,-99,2,4,0,-119,2,4, +0,-116,2,0,0,-117,2,7,0,-98,2,7,0,-97,2,7,0,43,0,118,0,7,0,101,0,101,2,2,0,-96,2,2, +0,-95,2,4,0,70,0,32,0,-89,0,7,0,-94,2,0,0,-124,2,119,0,9,0,101,0,101,2,32,0,-89,0,7, +0,-93,2,7,0,-92,2,7,0,-99,2,4,0,-91,2,4,0,-90,2,7,0,-89,2,0,0,17,0,120,0,1,0,101, +0,101,2,121,0,5,0,101,0,101,2,122,0,-88,2,123,0,-87,2,124,0,-86,2,125,0,-85,2,126,0,14,0,101, +0,101,2,78,0,-84,2,78,0,-83,2,78,0,-82,2,78,0,-81,2,78,0,-80,2,78,0,-79,2,75,0,-78,2,4, +0,-77,2,4,0,-76,2,2,0,-75,2,2,0,37,0,7,0,-74,2,127,0,-73,2,-128,0,3,0,101,0,101,2,-127, +0,-72,2,-126,0,-73,2,-125,0,4,0,101,0,101,2,32,0,-89,0,4,0,-71,2,4,0,37,0,-124,0,2,0,4, +0,-70,2,7,0,-39,1,-123,0,2,0,4,0,-127,0,4,0,-69,2,-122,0,20,0,101,0,101,2,32,0,-89,0,0, +0,-124,2,2,0,-68,2,2,0,-67,2,2,0,20,0,2,0,37,0,7,0,-66,2,7,0,-65,2,4,0,54,0,4, +0,-64,2,-123,0,-63,2,-124,0,-62,2,4,0,-61,2,4,0,-60,2,4,0,-59,2,4,0,-69,2,7,0,-58,2,7, +0,-57,2,7,0,-56,2,-121,0,8,0,101,0,101,2,-120,0,-55,2,-127,0,-72,2,4,0,-54,2,4,0,-53,2,4, +0,-52,2,2,0,20,0,2,0,57,0,-119,0,5,0,101,0,101,2,32,0,45,0,2,0,-51,2,2,0,20,0,2, +0,-50,2,-118,0,5,0,101,0,101,2,4,0,-49,2,2,0,20,0,2,0,-48,2,7,0,-47,2,-117,0,3,0,101, +0,101,2,-116,0,-46,2,125,0,-85,2,-115,0,10,0,101,0,101,2,32,0,-45,2,32,0,-44,2,0,0,-43,2,7, +0,-42,2,2,0,-41,2,2,0,-40,2,0,0,-39,2,0,0,-38,2,0,0,107,2,-114,0,9,0,101,0,101,2,32, +0,-37,2,0,0,-43,2,7,0,-36,2,7,0,-35,2,0,0,13,1,0,0,122,2,0,0,-34,2,0,0,37,0,-113, +0,24,0,27,0,31,0,2,0,-29,1,2,0,-28,1,2,0,-33,2,2,0,20,0,2,0,-32,2,2,0,-31,2,2, +0,-30,2,2,0,70,0,0,0,-29,2,0,0,-28,2,0,0,-27,2,0,0,18,0,4,0,37,0,7,0,-26,2,7, +0,-25,2,7,0,-24,2,7,0,-23,2,7,0,-22,2,7,0,-21,2,34,0,-20,2,36,0,79,0,38,0,-9,1,80, +0,31,2,-112,0,3,0,-112,0,0,0,-112,0,1,0,0,0,17,0,67,0,3,0,7,0,-19,2,4,0,20,0,4, +0,37,0,32,0,111,0,27,0,31,0,2,0,18,0,2,0,-18,2,4,0,-17,2,4,0,-16,2,4,0,-15,2,0, +0,-14,2,32,0,38,0,32,0,-13,2,32,0,-12,2,32,0,-11,2,32,0,-10,2,36,0,79,0,73,0,-10,1,67, +0,-66,1,-111,0,-9,2,-111,0,-8,2,-110,0,-7,2,9,0,2,0,12,0,-6,2,12,0,25,2,12,0,-47,1,12, +0,-5,2,12,0,-4,2,62,0,-46,1,7,0,7,1,7,0,-3,2,7,0,-2,2,7,0,-81,0,7,0,-1,2,7, +0,8,1,7,0,0,3,7,0,1,3,7,0,-93,2,7,0,2,3,7,0,-45,0,4,0,3,3,2,0,20,0,2, +0,4,3,2,0,5,3,2,0,6,3,2,0,7,3,2,0,8,3,2,0,9,3,2,0,10,3,2,0,11,3,2, +0,12,3,2,0,13,3,2,0,14,3,4,0,15,3,4,0,16,3,4,0,17,3,4,0,18,3,7,0,19,3,7, +0,20,3,7,0,21,3,7,0,22,3,7,0,23,3,7,0,24,3,7,0,25,3,7,0,26,3,7,0,27,3,7, +0,28,3,7,0,29,3,7,0,30,3,0,0,31,3,0,0,32,3,0,0,-45,1,0,0,33,3,0,0,34,3,0, +0,35,3,7,0,36,3,7,0,37,3,39,0,125,0,12,0,38,3,12,0,39,3,12,0,40,3,12,0,41,3,7, +0,42,3,2,0,71,2,2,0,43,3,7,0,52,2,4,0,44,3,4,0,45,3,-109,0,46,3,2,0,47,3,2, +0,-38,0,7,0,48,3,12,0,49,3,12,0,50,3,12,0,51,3,12,0,52,3,-108,0,53,3,-107,0,54,3,63, +0,55,3,2,0,56,3,2,0,57,3,2,0,58,3,2,0,59,3,7,0,44,2,2,0,60,3,2,0,61,3,-116, +0,62,3,-127,0,63,3,-127,0,64,3,4,0,65,3,4,0,66,3,4,0,67,3,4,0,70,0,9,0,-94,0,12, +0,68,3,-106,0,14,0,-106,0,0,0,-106,0,1,0,32,0,38,0,7,0,-93,2,7,0,9,1,7,0,-92,2,7, +0,-99,2,0,0,17,0,4,0,-91,2,4,0,-90,2,4,0,69,3,2,0,18,0,2,0,70,3,7,0,-89,2,-108, +0,36,0,2,0,71,3,2,0,72,3,2,0,20,0,2,0,-99,2,7,0,73,3,7,0,74,3,7,0,75,3,7, +0,76,3,7,0,77,3,7,0,78,3,7,0,79,3,7,0,80,3,7,0,81,3,7,0,82,3,7,0,83,3,7, +0,84,3,7,0,85,3,7,0,86,3,7,0,87,3,7,0,88,3,7,0,89,3,7,0,90,3,7,0,91,3,7, +0,92,3,7,0,93,3,7,0,94,3,7,0,95,3,7,0,96,3,2,0,97,3,2,0,98,3,2,0,99,3,2, +0,100,3,51,0,-88,0,-105,0,101,3,7,0,102,3,4,0,110,2,125,0,5,0,4,0,20,0,4,0,103,3,4, +0,104,3,4,0,105,3,4,0,106,3,-104,0,1,0,7,0,-31,1,-109,0,30,0,4,0,20,0,7,0,107,3,7, +0,108,3,7,0,109,3,4,0,110,3,4,0,111,3,4,0,112,3,4,0,113,3,7,0,114,3,7,0,115,3,7, +0,116,3,7,0,117,3,7,0,118,3,7,0,119,3,7,0,120,3,7,0,121,3,7,0,122,3,7,0,123,3,7, +0,124,3,7,0,125,3,7,0,126,3,7,0,127,3,7,0,-128,3,7,0,-127,3,7,0,-126,3,7,0,-125,3,4, +0,-124,3,4,0,-123,3,7,0,-122,3,7,0,27,3,-107,0,49,0,-120,0,-121,3,4,0,-120,3,4,0,-119,3,-103, +0,-118,3,-102,0,-117,3,0,0,37,0,0,0,-116,3,2,0,-115,3,7,0,-114,3,0,0,-113,3,7,0,-112,3,7, +0,-111,3,7,0,-110,3,7,0,-109,3,7,0,-108,3,7,0,-107,3,7,0,-106,3,7,0,-105,3,7,0,-104,3,2, +0,-103,3,0,0,-102,3,2,0,-101,3,7,0,-100,3,7,0,-99,3,0,0,-98,3,4,0,-126,0,4,0,-97,3,4, +0,-96,3,2,0,-95,3,2,0,-94,3,-104,0,-93,3,4,0,-92,3,4,0,81,0,7,0,-91,3,7,0,-90,3,7, +0,-89,3,7,0,-88,3,2,0,-87,3,2,0,-86,3,2,0,-85,3,2,0,-84,3,2,0,-83,3,2,0,-82,3,2, +0,-81,3,2,0,-80,3,-101,0,-79,3,7,0,-78,3,7,0,-77,3,125,0,-76,3,-116,0,48,0,2,0,18,0,2, +0,-75,3,2,0,-74,3,2,0,-73,3,7,0,-72,3,2,0,-71,3,2,0,-70,3,7,0,-69,3,2,0,-68,3,2, +0,-67,3,7,0,-66,3,7,0,-65,3,7,0,-64,3,7,0,-63,3,7,0,-62,3,7,0,-61,3,4,0,-60,3,7, +0,-59,3,7,0,-58,3,7,0,-57,3,74,0,-56,3,74,0,-55,3,74,0,-54,3,0,0,-53,3,7,0,-52,3,7, +0,-51,3,36,0,79,0,2,0,-50,3,0,0,-49,3,0,0,-48,3,7,0,-47,3,4,0,-46,3,7,0,-45,3,7, +0,-44,3,4,0,-43,3,4,0,20,0,7,0,-42,3,7,0,-41,3,7,0,-40,3,78,0,-39,3,7,0,-38,3,7, +0,-37,3,7,0,-36,3,7,0,-35,3,7,0,-34,3,7,0,-33,3,7,0,-32,3,4,0,-31,3,-100,0,71,0,27, +0,31,0,2,0,-79,0,2,0,14,1,2,0,47,1,2,0,-30,3,7,0,-29,3,7,0,-28,3,7,0,-27,3,7, +0,-26,3,7,0,-25,3,7,0,-24,3,7,0,-23,3,7,0,-22,3,7,0,84,1,7,0,86,1,7,0,85,1,7, +0,-21,3,4,0,-20,3,7,0,-19,3,7,0,-18,3,7,0,-17,3,7,0,-16,3,7,0,-15,3,7,0,-14,3,7, +0,-13,3,2,0,-12,3,2,0,13,1,2,0,-11,3,2,0,-10,3,2,0,-9,3,2,0,-8,3,2,0,-7,3,2, +0,-6,3,7,0,-5,3,7,0,-4,3,7,0,-3,3,7,0,-2,3,7,0,-1,3,7,0,0,4,7,0,1,4,7, +0,2,4,7,0,3,4,7,0,4,4,7,0,5,4,7,0,6,4,2,0,7,4,2,0,8,4,2,0,9,4,2, +0,10,4,7,0,11,4,7,0,12,4,7,0,13,4,7,0,14,4,2,0,15,4,2,0,16,4,2,0,17,4,2, +0,18,4,7,0,19,4,7,0,20,4,7,0,21,4,7,0,22,4,2,0,23,4,2,0,24,4,2,0,25,4,2, +0,43,0,7,0,26,4,7,0,27,4,36,0,79,0,50,0,77,1,30,0,-103,0,39,0,125,0,-99,0,16,0,2, +0,28,4,2,0,29,4,2,0,30,4,2,0,20,0,2,0,31,4,2,0,32,4,2,0,33,4,2,0,34,4,2, +0,35,4,2,0,36,4,2,0,37,4,2,0,38,4,4,0,39,4,7,0,40,4,7,0,41,4,7,0,42,4,-98, +0,8,0,-98,0,0,0,-98,0,1,0,4,0,3,3,4,0,43,4,4,0,20,0,2,0,44,4,2,0,45,4,32, +0,-89,0,-97,0,13,0,9,0,46,4,9,0,47,4,4,0,48,4,4,0,49,4,4,0,50,4,4,0,51,4,4, +0,52,4,4,0,53,4,4,0,54,4,4,0,55,4,4,0,56,4,4,0,37,0,0,0,57,4,-96,0,5,0,9, +0,58,4,9,0,59,4,4,0,60,4,4,0,70,0,0,0,61,4,-95,0,13,0,4,0,18,0,4,0,62,4,4, +0,63,4,4,0,64,4,4,0,65,4,4,0,66,4,4,0,93,0,4,0,67,4,4,0,68,4,4,0,69,4,4, +0,70,4,4,0,71,4,26,0,30,0,-94,0,4,0,4,0,72,4,7,0,73,4,2,0,20,0,2,0,68,2,-93, +0,11,0,-93,0,0,0,-93,0,1,0,0,0,17,0,62,0,74,4,63,0,75,4,4,0,3,3,4,0,76,4,4, +0,77,4,4,0,37,0,4,0,78,4,4,0,79,4,-92,0,-126,0,-97,0,80,4,-96,0,81,4,-95,0,82,4,4, +0,83,4,4,0,-126,0,4,0,-97,3,4,0,84,4,4,0,85,4,4,0,86,4,4,0,87,4,2,0,20,0,2, +0,88,4,7,0,20,3,7,0,89,4,7,0,90,4,7,0,91,4,7,0,92,4,7,0,93,4,2,0,94,4,2, +0,95,4,2,0,96,4,2,0,97,4,2,0,-39,0,2,0,98,4,2,0,99,4,2,0,100,3,2,0,100,4,2, +0,101,4,2,0,34,1,2,0,109,0,2,0,102,4,2,0,103,4,2,0,104,4,2,0,105,4,2,0,106,4,2, +0,107,4,2,0,108,4,2,0,109,4,2,0,110,4,2,0,35,1,2,0,111,4,2,0,112,4,2,0,113,4,2, +0,114,4,4,0,115,4,4,0,13,1,2,0,116,4,2,0,117,4,2,0,118,4,2,0,119,4,2,0,120,4,2, +0,121,4,24,0,122,4,24,0,123,4,23,0,124,4,12,0,125,4,2,0,126,4,2,0,37,0,7,0,127,4,7, +0,-128,4,7,0,-127,4,7,0,-126,4,7,0,-125,4,7,0,-124,4,7,0,-123,4,7,0,-122,4,7,0,-121,4,2, +0,-120,4,2,0,-119,4,2,0,-118,4,2,0,-117,4,2,0,-116,4,2,0,-115,4,7,0,-114,4,7,0,-113,4,7, +0,-112,4,2,0,-111,4,2,0,-110,4,2,0,-109,4,2,0,-108,4,2,0,-107,4,2,0,-106,4,2,0,-105,4,2, +0,-104,4,2,0,-103,4,2,0,-102,4,4,0,-101,4,4,0,-100,4,4,0,-99,4,4,0,-98,4,4,0,-97,4,7, +0,-96,4,4,0,-95,4,4,0,-94,4,4,0,-93,4,4,0,-92,4,7,0,-91,4,7,0,-90,4,7,0,-89,4,7, +0,-88,4,7,0,-87,4,7,0,-86,4,7,0,-85,4,7,0,-84,4,7,0,-83,4,0,0,-82,4,0,0,-81,4,4, +0,-80,4,2,0,-79,4,2,0,12,1,0,0,-78,4,7,0,-77,4,7,0,-76,4,4,0,-75,4,4,0,-74,4,7, +0,-73,4,7,0,-72,4,2,0,-71,4,2,0,-70,4,7,0,-69,4,2,0,-68,4,2,0,-67,4,4,0,-66,4,2, +0,-65,4,2,0,-64,4,2,0,-63,4,2,0,-62,4,7,0,-61,4,7,0,70,0,42,0,-60,4,-91,0,9,0,-91, +0,0,0,-91,0,1,0,0,0,17,0,2,0,-59,4,2,0,-58,4,2,0,-57,4,2,0,43,0,7,0,-56,4,7, +0,70,0,-90,0,5,0,7,0,-55,4,0,0,18,0,0,0,43,0,0,0,70,0,0,0,12,1,-89,0,5,0,-89, +0,0,0,-89,0,1,0,4,0,-54,4,0,0,-53,4,4,0,20,0,-88,0,5,0,-87,0,-52,4,2,0,20,0,2, +0,-51,4,2,0,-50,4,2,0,-49,4,-86,0,4,0,2,0,109,0,2,0,-122,2,2,0,-48,4,2,0,-47,4,-85, +0,7,0,2,0,20,0,2,0,-46,4,2,0,-45,4,2,0,-44,4,-86,0,-43,4,7,0,-42,4,4,0,-41,4,-84, +0,4,0,-84,0,0,0,-84,0,1,0,0,0,-40,4,7,0,-39,4,-83,0,56,0,2,0,-38,4,2,0,-37,4,7, +0,-36,4,7,0,-35,4,2,0,-48,4,2,0,-34,4,7,0,-33,4,7,0,-32,4,2,0,-31,4,2,0,-30,4,2, +0,-29,4,2,0,-28,4,7,0,-27,4,7,0,-26,4,7,0,-25,4,7,0,37,0,2,0,-24,4,2,0,-23,4,2, +0,-22,4,2,0,-21,4,-88,0,-20,4,-85,0,-19,4,7,0,-18,4,7,0,-17,4,0,0,-16,4,0,0,-15,4,0, +0,-14,4,0,0,-13,4,0,0,-12,4,0,0,-11,4,2,0,-10,4,7,0,-9,4,7,0,-8,4,7,0,-7,4,7, +0,-6,4,7,0,-5,4,7,0,-4,4,7,0,-3,4,7,0,-2,4,7,0,-1,4,7,0,0,5,2,0,1,5,0, +0,2,5,0,0,3,5,0,0,4,5,0,0,5,5,32,0,6,5,0,0,7,5,0,0,8,5,0,0,9,5,0, +0,10,5,0,0,11,5,0,0,12,5,0,0,13,5,0,0,14,5,0,0,15,5,-82,0,6,0,2,0,109,0,0, +0,-122,2,0,0,16,5,0,0,17,5,0,0,20,0,0,0,-74,0,-81,0,26,0,-80,0,18,5,50,0,77,1,60, +0,19,5,-82,0,20,5,-82,0,21,5,-82,0,22,5,-82,0,23,5,-82,0,24,5,-82,0,25,5,-82,0,26,5,7, +0,27,5,2,0,28,5,2,0,47,1,2,0,29,5,2,0,1,2,0,0,30,5,0,0,31,5,0,0,32,5,0, +0,33,5,0,0,93,0,0,0,34,5,0,0,35,5,0,0,36,5,0,0,37,5,0,0,38,5,0,0,-74,0,-79, +0,43,0,27,0,31,0,32,0,39,5,-100,0,40,5,-79,0,41,5,46,0,-47,0,12,0,42,5,-98,0,43,5,7, +0,44,5,7,0,45,5,7,0,46,5,7,0,47,5,4,0,3,3,7,0,48,5,2,0,49,5,2,0,50,5,2, +0,51,5,2,0,52,5,2,0,53,5,2,0,54,5,2,0,55,5,2,0,5,1,57,0,1,1,9,0,56,5,-99, +0,57,5,-90,0,58,5,-83,0,59,5,-92,0,-73,0,-94,0,60,5,39,0,125,0,12,0,103,0,12,0,61,5,2, +0,62,5,2,0,63,5,2,0,64,5,2,0,65,5,-78,0,66,5,2,0,67,5,2,0,68,5,2,0,64,1,2, +0,-38,0,-81,0,69,5,4,0,70,5,4,0,37,0,-77,0,9,0,46,0,-47,0,45,0,0,1,7,0,8,2,7, +0,9,2,7,0,109,0,7,0,71,5,7,0,72,5,2,0,73,5,2,0,74,5,-76,0,75,0,-75,0,0,0,-75, +0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,7,0,79,5,7,0,80,5,7,0,81,5,7, +0,82,5,7,0,83,5,7,0,84,5,7,0,85,5,7,0,20,1,7,0,86,5,4,0,87,5,2,0,88,5,2, +0,17,5,32,0,39,5,32,0,89,5,-77,0,90,5,-76,0,91,5,-73,0,92,5,-72,0,93,5,-71,0,94,5,0, +0,95,5,2,0,30,4,2,0,96,5,4,0,3,3,4,0,97,5,2,0,98,5,2,0,99,5,2,0,100,5,0, +0,101,5,0,0,43,0,7,0,115,0,7,0,102,5,7,0,103,5,7,0,104,5,7,0,105,5,7,0,106,5,7, +0,107,5,7,0,108,5,7,0,-82,0,7,0,44,5,2,0,109,5,2,0,110,5,2,0,111,5,2,0,112,5,2, +0,-119,0,2,0,29,5,2,0,113,5,2,0,114,5,2,0,115,5,2,0,116,5,7,0,117,5,7,0,118,5,67, +0,119,5,12,0,120,5,2,0,121,5,2,0,53,2,2,0,122,5,2,0,20,0,2,0,123,5,2,0,124,5,2, +0,125,5,0,0,126,5,0,0,127,5,9,0,-128,5,-70,0,-127,5,7,0,-126,5,2,0,-125,5,2,0,-124,5,2, +0,53,5,2,0,54,5,-69,0,19,0,24,0,36,0,24,0,64,0,23,0,-123,5,23,0,-122,5,23,0,-121,5,7, +0,-120,5,7,0,-119,5,7,0,-118,5,7,0,-117,5,2,0,-116,5,2,0,-115,5,2,0,-114,5,2,0,-113,5,2, +0,-112,5,2,0,-111,5,4,0,20,0,7,0,-110,5,2,0,99,5,0,0,107,2,-75,0,6,0,-75,0,0,0,-75, +0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-68,0,6,0,-75,0,0,0,-75,0,1,0,4, +0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-67,0,27,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7, +0,76,5,-74,0,77,5,2,0,78,5,4,0,-109,5,4,0,70,0,-69,0,-108,5,9,0,-107,5,12,0,-106,5,36, +0,79,0,27,0,80,0,0,0,-105,5,0,0,-104,5,0,0,-103,5,2,0,-102,5,2,0,-101,5,2,0,-100,5,2, +0,-99,5,2,0,65,0,2,0,46,0,2,0,-119,0,2,0,-98,5,4,0,20,0,7,0,-97,5,24,0,36,0,-66, +0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-73,0,92,5,2,0,78,5,2, +0,-96,5,2,0,-95,5,2,0,-94,5,2,0,-93,5,-69,0,-108,5,2,0,-92,5,2,0,-119,0,2,0,-101,5,2, +0,-91,5,9,0,-90,5,2,0,29,5,0,0,-89,5,0,0,-88,5,2,0,-87,5,2,0,-86,5,2,0,12,3,2, +0,-85,5,2,0,-84,5,0,0,37,0,0,0,20,0,0,0,47,1,0,0,-83,5,-65,0,16,0,-75,0,0,0,-75, +0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69,0,-108,5,7,0,8,2,7,0,9,2,2, +0,-92,5,2,0,-82,5,2,0,-81,5,2,0,-80,5,4,0,20,0,7,0,71,5,-70,0,-127,5,-64,0,33,0,-75, +0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-63,0,-79,5,4,0,-78,5,0, +0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-74,5,2,0,20,0,2,0,-73,5,2,0,-72,5,2, +0,-71,5,2,0,-70,5,2,0,43,0,4,0,70,0,0,0,-69,5,-62,0,-68,5,2,0,-67,5,2,0,-66,5,2, +0,-65,5,2,0,-48,0,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9,0,-60,5,2,0,-59,5,0, +0,-58,5,-61,0,23,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, +0,-108,5,12,0,-57,5,2,0,-101,5,2,0,-56,5,2,0,20,0,2,0,57,0,9,0,-90,5,12,0,-55,5,-60, +0,-54,5,0,0,-53,5,-59,0,-52,5,4,0,-51,5,4,0,-50,5,2,0,18,0,2,0,-49,5,2,0,-48,5,2, +0,-47,5,-58,0,29,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, +0,-108,5,46,0,-114,2,45,0,0,1,60,0,19,5,2,0,13,1,2,0,-119,0,2,0,-46,5,2,0,-45,5,4, +0,20,0,2,0,49,5,2,0,-44,5,2,0,-98,5,2,0,-101,5,7,0,71,5,0,0,-43,5,0,0,-42,5,0, +0,-41,5,0,0,-40,5,7,0,8,2,7,0,9,2,7,0,-39,5,7,0,-38,5,-70,0,-127,5,-57,0,11,0,-75, +0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,2,0,-119,0,2,0,-98,5,2, +0,-37,5,2,0,20,0,-69,0,-108,5,-56,0,24,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, +0,77,5,2,0,78,5,42,0,-36,5,4,0,-35,5,4,0,-34,5,2,0,93,0,2,0,-119,0,4,0,-33,5,4, +0,-32,5,4,0,-31,5,4,0,-30,5,4,0,-29,5,4,0,-28,5,4,0,-27,5,4,0,-26,5,7,0,-25,5,23, +0,-24,5,23,0,-23,5,4,0,-22,5,4,0,-21,5,-55,0,10,0,27,0,31,0,9,0,-20,5,9,0,-19,5,9, +0,-18,5,9,0,-17,5,9,0,-16,5,4,0,93,0,4,0,-15,5,0,0,-14,5,0,0,-13,5,-54,0,10,0,-75, +0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-55,0,-12,5,2,0,93,0,2,0,-119,0,4, +0,43,0,9,0,-11,5,-53,0,8,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,-69, +0,-108,5,4,0,20,0,4,0,-10,5,-52,0,21,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, +0,77,5,2,0,78,5,-69,0,-108,5,27,0,-9,5,27,0,80,0,2,0,20,0,2,0,-119,0,7,0,-8,5,9, +0,-7,5,7,0,8,2,7,0,9,2,57,0,1,1,57,0,-6,5,4,0,-5,5,2,0,-89,5,2,0,37,0,-70, +0,-127,5,-51,0,42,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74,0,77,5,2,0,78,5,-69, +0,-108,5,-50,0,-4,5,0,0,-77,5,0,0,-76,5,0,0,-75,5,2,0,18,0,2,0,-66,5,2,0,20,0,2, +0,-73,5,9,0,-7,5,4,0,-3,5,4,0,-2,5,4,0,-1,5,4,0,0,6,23,0,1,6,23,0,2,6,7, +0,3,6,7,0,4,6,7,0,5,6,7,0,-8,5,2,0,-67,5,2,0,-48,0,2,0,102,1,2,0,6,6,2, +0,37,0,2,0,43,0,2,0,7,6,2,0,8,6,9,0,-64,5,9,0,-63,5,9,0,-62,5,9,0,-61,5,9, +0,-60,5,2,0,-59,5,0,0,-58,5,56,0,9,6,-49,0,20,0,0,0,10,6,0,0,11,6,0,0,12,6,0, +0,13,6,0,0,14,6,0,0,15,6,0,0,16,6,0,0,17,6,0,0,18,6,0,0,19,6,0,0,20,6,0, +0,21,6,0,0,22,6,0,0,23,6,0,0,24,6,0,0,25,6,0,0,26,6,0,0,27,6,0,0,68,2,0, +0,28,6,-48,0,54,0,0,0,29,6,0,0,20,6,0,0,21,6,0,0,30,6,0,0,31,6,0,0,32,6,0, +0,33,6,0,0,34,6,0,0,35,6,0,0,36,6,0,0,37,6,0,0,38,6,0,0,39,6,0,0,40,6,0, +0,41,6,0,0,42,6,0,0,43,6,0,0,44,6,0,0,45,6,0,0,46,6,0,0,47,6,0,0,48,6,0, +0,49,6,0,0,50,6,0,0,51,6,0,0,52,6,0,0,53,6,0,0,54,6,0,0,55,6,0,0,56,6,0, +0,57,6,0,0,58,6,0,0,95,0,0,0,59,6,0,0,60,6,0,0,61,6,0,0,62,6,0,0,63,6,0, +0,64,6,0,0,65,6,0,0,66,6,0,0,67,6,0,0,68,6,0,0,69,6,0,0,70,6,0,0,71,6,0, +0,72,6,0,0,73,6,0,0,74,6,0,0,75,6,0,0,76,6,0,0,77,6,0,0,78,6,0,0,79,6,-47, +0,5,0,0,0,80,6,0,0,37,6,0,0,39,6,2,0,20,0,2,0,37,0,-46,0,22,0,-46,0,0,0,-46, +0,1,0,0,0,17,0,-49,0,81,6,-48,0,82,6,-48,0,83,6,-48,0,84,6,-48,0,85,6,-48,0,86,6,-48, +0,87,6,-48,0,88,6,-48,0,89,6,-48,0,90,6,-48,0,91,6,-48,0,92,6,-48,0,93,6,-48,0,94,6,-48, +0,95,6,-48,0,96,6,-47,0,97,6,0,0,98,6,0,0,99,6,-45,0,5,0,4,0,20,0,4,0,37,0,7, +0,52,2,7,0,100,6,7,0,-31,1,-44,0,66,0,4,0,20,0,4,0,101,6,4,0,102,6,0,0,103,6,0, +0,104,6,0,0,105,6,0,0,106,6,0,0,107,6,0,0,108,6,0,0,109,6,0,0,110,6,0,0,111,6,2, +0,112,6,2,0,113,6,4,0,114,6,4,0,115,6,4,0,116,6,4,0,117,6,2,0,118,6,2,0,119,6,2, +0,120,6,2,0,121,6,4,0,122,6,4,0,123,6,2,0,124,6,2,0,125,6,2,0,126,6,2,0,127,6,0, +0,-128,6,12,0,-127,6,2,0,-126,6,2,0,-125,6,2,0,-124,6,2,0,-123,6,2,0,-122,6,2,0,-121,6,2, +0,-120,6,2,0,-119,6,-45,0,-118,6,2,0,-117,6,2,0,-116,6,2,0,-115,6,2,0,-114,6,4,0,-113,6,4, +0,-112,6,4,0,-111,6,4,0,-110,6,2,0,-109,6,2,0,-108,6,2,0,-107,6,2,0,-106,6,2,0,-105,6,2, +0,-104,6,2,0,-103,6,2,0,-102,6,2,0,-101,6,2,0,-100,6,2,0,-99,6,2,0,37,0,0,0,-98,6,0, +0,-97,6,0,0,-96,6,7,0,-95,6,2,0,55,5,2,0,-94,6,54,0,-93,6,-43,0,18,0,27,0,31,0,12, +0,-92,6,12,0,-91,6,12,0,-90,6,-79,0,-89,6,2,0,-105,2,2,0,-88,6,2,0,-104,2,2,0,-87,6,2, +0,-86,6,2,0,-85,6,2,0,-84,6,2,0,-83,6,2,0,-82,6,2,0,37,0,2,0,-81,6,2,0,-80,6,2, +0,-79,6,-42,0,5,0,-42,0,0,0,-42,0,1,0,-42,0,-78,6,13,0,-77,6,4,0,20,0,-41,0,7,0,-41, +0,0,0,-41,0,1,0,-42,0,-76,6,-42,0,-75,6,2,0,123,4,2,0,20,0,4,0,37,0,-40,0,17,0,-40, +0,0,0,-40,0,1,0,0,0,-74,6,0,0,-73,6,0,0,-72,6,2,0,-71,6,2,0,-70,6,2,0,-86,6,2, +0,-85,6,2,0,20,0,2,0,70,3,2,0,-69,6,2,0,-68,6,2,0,-67,6,2,0,-66,6,4,0,-65,6,-40, +0,-64,6,-74,0,30,0,-74,0,0,0,-74,0,1,0,-42,0,-76,6,-42,0,-75,6,-42,0,-63,6,-42,0,-62,6,-43, +0,-61,6,7,0,-60,6,23,0,52,0,23,0,-59,6,23,0,-58,6,2,0,-57,6,2,0,-56,6,2,0,-55,6,0, +0,75,5,0,0,-54,6,2,0,-53,6,2,0,-52,6,0,0,-51,6,0,0,-50,6,0,0,-49,6,0,0,-48,6,2, +0,-47,6,2,0,-46,6,2,0,-45,6,2,0,20,0,39,0,125,0,12,0,-44,6,12,0,-43,6,12,0,-42,6,-39, +0,11,0,0,0,-41,6,2,0,-40,6,2,0,-39,6,2,0,-38,6,2,0,-37,6,2,0,-36,6,2,0,107,4,9, +0,-35,6,9,0,-34,6,4,0,-33,6,4,0,-32,6,-38,0,1,0,0,0,-31,6,-37,0,8,0,56,0,-30,6,56, +0,-29,6,-37,0,-28,6,-37,0,-27,6,-37,0,-26,6,2,0,-123,0,2,0,20,0,4,0,-25,6,-36,0,4,0,4, +0,-35,5,4,0,-24,6,4,0,-31,5,4,0,-23,6,-35,0,2,0,4,0,-22,6,4,0,-21,6,-34,0,9,0,7, +0,-20,6,7,0,-19,6,7,0,-18,6,4,0,20,0,4,0,13,1,7,0,-19,3,7,0,-17,6,4,0,37,0,-33, +0,-16,6,-32,0,6,0,0,0,-15,6,0,0,-75,5,48,0,-116,0,2,0,109,0,2,0,111,4,4,0,37,0,-31, +0,21,0,-31,0,0,0,-31,0,1,0,4,0,57,0,4,0,23,0,4,0,28,0,4,0,-14,6,4,0,-13,6,4, +0,-12,6,-38,0,-11,6,0,0,-15,6,4,0,-10,6,4,0,-9,6,-32,0,-12,2,-36,0,-8,6,-35,0,-7,6,-34, +0,-6,6,-37,0,-5,6,-37,0,-4,6,-37,0,-3,6,56,0,-2,6,56,0,-1,6,-30,0,12,0,0,0,-68,1,9, +0,-62,0,0,0,-61,0,4,0,-58,0,4,0,-50,0,9,0,-57,0,7,0,-55,0,7,0,-54,0,9,0,0,7,9, +0,1,7,9,0,-53,0,9,0,-51,0,-29,0,43,0,-29,0,0,0,-29,0,1,0,9,0,2,7,9,0,26,0,0, +0,27,0,4,0,20,0,4,0,18,0,4,0,23,0,4,0,91,0,4,0,3,7,4,0,4,7,4,0,-13,6,4, +0,-12,6,4,0,5,7,4,0,-39,0,4,0,6,7,4,0,7,7,7,0,8,7,7,0,9,7,4,0,-126,0,4, +0,10,7,-31,0,11,7,36,0,79,0,-79,0,-89,6,48,0,-116,0,7,0,12,7,7,0,13,7,-30,0,2,1,-29, +0,14,7,-29,0,15,7,-29,0,16,7,12,0,17,7,-28,0,18,7,-27,0,19,7,7,0,20,7,7,0,21,7,4, +0,-84,6,7,0,22,7,9,0,23,7,4,0,24,7,4,0,25,7,4,0,26,7,7,0,27,7,-26,0,4,0,-26, +0,0,0,-26,0,1,0,12,0,28,7,-29,0,29,7,-25,0,6,0,12,0,30,7,12,0,17,7,12,0,31,7,2, +0,20,0,2,0,37,0,4,0,57,0,-24,0,4,0,7,0,32,7,7,0,112,0,2,0,33,7,2,0,34,7,-23, +0,6,0,7,0,35,7,7,0,36,7,7,0,37,7,7,0,38,7,4,0,39,7,4,0,40,7,-22,0,12,0,7, +0,41,7,7,0,42,7,7,0,43,7,7,0,44,7,7,0,45,7,7,0,46,7,7,0,47,7,7,0,48,7,7, +0,49,7,7,0,50,7,4,0,-110,2,4,0,51,7,-21,0,2,0,7,0,-55,4,7,0,37,0,-20,0,7,0,7, +0,52,7,7,0,53,7,4,0,93,0,4,0,108,2,4,0,54,7,4,0,55,7,4,0,37,0,-19,0,6,0,-19, +0,0,0,-19,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,-18,0,8,0,-18,0,0,0,-18, +0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,57,0,7,0,23,0,7,0,-126,0,-17,0,45,0,-17, +0,0,0,-17,0,1,0,2,0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,2,0,-103,3,2,0,57,7,7, +0,58,7,7,0,92,0,7,0,-97,2,4,0,59,7,4,0,81,0,4,0,110,2,7,0,60,7,7,0,61,7,7, +0,62,7,7,0,63,7,7,0,64,7,7,0,65,7,7,0,-100,2,7,0,-1,0,7,0,66,7,7,0,67,7,7, +0,37,0,7,0,68,7,7,0,69,7,7,0,70,7,2,0,71,7,2,0,72,7,2,0,73,7,2,0,74,7,2, +0,75,7,2,0,76,7,2,0,77,7,2,0,78,7,2,0,123,5,2,0,79,7,2,0,-47,1,2,0,80,7,0, +0,81,7,0,0,82,7,7,0,-45,0,-16,0,83,7,63,0,-95,1,-15,0,16,0,-15,0,0,0,-15,0,1,0,2, +0,18,0,2,0,20,0,2,0,56,7,2,0,-43,0,7,0,-105,2,7,0,-104,2,7,0,-103,2,7,0,-5,1,7, +0,-102,2,7,0,-101,2,7,0,84,7,7,0,-100,2,7,0,-98,2,7,0,-97,2,-59,0,5,0,2,0,18,0,2, +0,-25,6,2,0,20,0,2,0,85,7,27,0,-9,5,-60,0,3,0,4,0,69,0,4,0,86,7,-59,0,2,0,-14, +0,12,0,-14,0,0,0,-14,0,1,0,2,0,18,0,2,0,20,0,2,0,31,3,2,0,-32,1,7,0,5,0,7, +0,6,0,7,0,87,7,7,0,88,7,27,0,-9,5,12,0,89,7,-13,0,11,0,-13,0,0,0,-13,0,1,0,0, +0,17,0,2,0,18,0,2,0,90,7,4,0,22,0,4,0,91,7,2,0,20,0,2,0,37,0,9,0,92,7,9, +0,93,7,-12,0,5,0,0,0,17,0,7,0,20,1,7,0,94,7,4,0,95,7,4,0,37,0,-11,0,4,0,2, +0,18,0,2,0,20,0,2,0,43,0,2,0,70,0,-10,0,4,0,0,0,17,0,62,0,96,7,7,0,20,1,7, +0,37,0,-9,0,6,0,2,0,97,7,2,0,98,7,2,0,18,0,2,0,99,7,0,0,100,7,0,0,101,7,-8, +0,5,0,4,0,18,0,4,0,37,0,0,0,17,0,0,0,102,7,0,0,103,7,-7,0,3,0,4,0,18,0,4, +0,37,0,0,0,17,0,-6,0,4,0,2,0,104,7,2,0,105,7,2,0,20,0,2,0,37,0,-5,0,6,0,0, +0,17,0,0,0,106,7,2,0,107,7,2,0,-100,2,2,0,13,1,2,0,70,0,-4,0,5,0,0,0,17,0,7, +0,112,0,7,0,-17,3,2,0,20,0,2,0,122,2,-3,0,3,0,0,0,17,0,4,0,110,2,4,0,104,7,-2, +0,7,0,0,0,17,0,7,0,-17,3,0,0,108,7,0,0,109,7,2,0,13,1,2,0,43,0,4,0,110,7,-1, +0,3,0,32,0,111,7,0,0,112,7,0,0,113,7,0,1,18,0,0,1,0,0,0,1,1,0,2,0,18,0,2, +0,90,7,2,0,20,0,2,0,114,7,2,0,115,7,2,0,116,7,2,0,43,0,2,0,70,0,0,0,17,0,9, +0,2,0,1,1,117,7,32,0,45,0,2,0,-47,4,2,0,20,7,2,0,118,7,2,0,37,0,2,1,11,0,0, +0,17,0,0,0,18,0,0,0,119,7,2,0,20,0,2,0,122,2,2,0,120,7,4,0,121,7,4,0,122,7,4, +0,123,7,4,0,124,7,4,0,125,7,3,1,1,0,0,0,126,7,4,1,4,0,42,0,-36,5,0,0,127,7,4, +0,13,1,4,0,20,0,1,1,18,0,1,1,0,0,1,1,1,0,1,1,-128,7,2,0,18,0,2,0,20,0,2, +0,-127,7,2,0,116,7,2,0,90,7,2,0,-126,7,2,0,70,0,2,0,12,1,0,0,17,0,9,0,2,0,5, +1,117,7,0,1,-125,7,2,0,15,0,2,0,-124,7,4,0,-123,7,6,1,3,0,4,0,-74,2,4,0,37,0,32, +0,45,0,7,1,12,0,-111,0,-122,7,2,0,18,0,2,0,20,0,4,0,58,7,4,0,92,0,0,0,17,0,0, +0,-121,7,2,0,-120,7,2,0,-119,7,2,0,-118,7,2,0,-117,7,7,0,-116,7,8,1,10,0,2,0,20,0,2, +0,-115,7,4,0,58,7,4,0,92,0,2,0,-114,7,-28,0,18,7,2,0,18,0,2,0,-113,7,2,0,-112,7,2, +0,-111,7,9,1,7,0,2,0,20,0,2,0,-115,7,4,0,58,7,4,0,92,0,2,0,18,0,2,0,-110,7,7, +0,109,3,10,1,11,0,4,0,-74,2,2,0,18,0,2,0,20,0,32,0,45,0,74,0,-109,7,0,0,17,0,7, +0,-108,7,7,0,-107,7,7,0,21,3,2,0,-106,7,2,0,-105,7,11,1,5,0,2,0,18,0,2,0,20,0,4, +0,37,0,-79,0,-89,6,32,0,39,5,12,1,5,0,4,0,20,0,4,0,18,0,0,0,17,0,0,0,102,7,32, +0,45,0,13,1,13,0,2,0,20,0,2,0,18,0,2,0,90,7,2,0,22,3,7,0,-104,7,7,0,-103,7,7, +0,7,1,7,0,8,1,7,0,-3,2,7,0,0,3,7,0,-102,7,7,0,-101,7,32,0,-100,7,14,1,10,0,2, +0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,0,0,-121,7,2,0,43,0,2,0,64,0,2, +0,-99,7,2,0,-98,7,15,1,8,0,32,0,45,0,7,0,-103,2,7,0,-97,7,7,0,-96,7,7,0,-108,2,2, +0,20,0,2,0,122,2,7,0,-95,7,16,1,12,0,2,0,18,0,2,0,13,1,2,0,20,0,2,0,-100,2,2, +0,-74,2,2,0,-94,7,4,0,37,0,7,0,-93,7,7,0,-92,7,7,0,-91,7,7,0,-90,7,0,0,-89,7,17, +1,10,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0,0,17,0,2,0,68,2,2,0,64,0,2, +0,-99,7,2,0,-98,7,63,0,-95,1,18,1,7,0,4,0,110,2,4,0,-88,7,4,0,-87,7,4,0,-86,7,7, +0,-85,7,7,0,-84,7,0,0,108,7,19,1,7,0,0,0,-83,7,32,0,-82,7,0,0,112,7,2,0,-81,7,2, +0,43,0,4,0,70,0,0,0,113,7,20,1,6,0,2,0,20,0,2,0,18,0,4,0,58,7,4,0,92,0,0, +0,-80,7,0,0,-79,7,21,1,1,0,4,0,20,0,22,1,6,0,0,0,95,0,2,0,18,0,2,0,20,0,4, +0,-78,7,7,0,-77,7,42,0,-36,5,23,1,4,0,0,0,-74,0,2,0,20,0,4,0,18,0,32,0,45,0,24, +1,2,0,4,0,18,0,4,0,-121,5,5,1,10,0,5,1,0,0,5,1,1,0,5,1,-128,7,2,0,18,0,2, +0,20,0,2,0,90,7,2,0,-76,7,0,0,17,0,9,0,2,0,32,0,45,0,25,1,10,0,7,0,21,3,7, +0,-75,7,7,0,-74,7,7,0,-73,7,7,0,-72,7,4,0,20,0,7,0,-94,7,7,0,-71,7,7,0,-70,7,7, +0,37,0,-28,0,20,0,27,0,31,0,0,0,-63,0,26,1,-69,7,9,0,-68,7,43,0,-104,0,43,0,-67,7,9, +0,-66,7,36,0,79,0,7,0,109,3,7,0,-65,7,7,0,-64,7,7,0,-63,7,7,0,-62,7,7,0,-61,7,7, +0,-60,7,4,0,93,0,4,0,-59,7,0,0,-58,7,0,0,-57,7,0,0,-56,7,27,1,6,0,27,0,31,0,7, +0,-55,7,7,0,-54,7,7,0,-53,7,2,0,-52,7,2,0,-51,7,28,1,14,0,-75,0,0,0,-75,0,1,0,4, +0,75,5,7,0,76,5,-74,0,77,5,-69,0,-108,5,-28,0,18,7,2,0,13,1,2,0,-115,7,2,0,8,2,2, +0,9,2,2,0,20,0,2,0,-98,5,4,0,70,0,29,1,6,0,29,1,0,0,29,1,1,0,32,0,45,0,9, +0,-50,7,4,0,-38,0,4,0,37,0,63,0,4,0,27,0,31,0,12,0,-49,7,4,0,-121,0,7,0,-48,7,30, +1,25,0,30,1,0,0,30,1,1,0,30,1,38,0,12,0,-47,7,0,0,17,0,7,0,-46,7,7,0,-45,7,7, +0,-44,7,7,0,-43,7,4,0,20,0,7,0,-42,7,7,0,-41,7,7,0,-40,7,7,0,20,1,7,0,-39,1,7, +0,-39,7,7,0,108,2,7,0,-38,7,7,0,-37,7,7,0,-36,7,7,0,-35,7,7,0,-34,7,7,0,-81,0,2, +0,-121,0,2,0,-31,4,31,1,19,0,27,0,31,0,12,0,-33,7,12,0,-32,7,4,0,20,0,4,0,30,4,2, +0,-96,2,2,0,-31,7,2,0,-121,0,2,0,-30,7,2,0,-29,7,2,0,-28,7,2,0,-27,7,2,0,-26,7,4, +0,-25,7,4,0,-24,7,4,0,-23,7,4,0,-22,7,4,0,-21,7,4,0,-20,7,32,1,34,0,32,1,0,0,32, +1,1,0,12,0,49,3,0,0,17,0,2,0,20,0,2,0,-19,7,2,0,-18,7,2,0,-17,7,2,0,10,3,2, +0,-16,7,4,0,-7,1,4,0,-23,7,4,0,-22,7,30,1,-15,7,32,1,38,0,32,1,-14,7,12,0,-13,7,9, +0,-12,7,9,0,-11,7,9,0,-10,7,7,0,7,1,7,0,-81,0,7,0,-57,1,7,0,-9,7,7,0,-8,7,7, +0,2,3,7,0,-7,7,7,0,-6,7,7,0,-5,7,7,0,-4,7,7,0,-3,7,7,0,-2,7,7,0,-10,1,32, +0,-1,7,-110,0,9,0,12,0,0,8,2,0,20,0,2,0,1,8,7,0,20,3,7,0,2,8,7,0,3,8,12, +0,4,8,4,0,5,8,4,0,37,0,33,1,7,0,33,1,0,0,33,1,1,0,12,0,-58,7,4,0,20,0,4, +0,6,8,0,0,17,0,-47,0,7,8,34,1,8,0,34,1,0,0,34,1,1,0,33,1,8,8,36,0,79,0,12, +0,-6,2,4,0,20,0,0,0,17,0,4,0,9,8,-111,0,6,0,27,0,31,0,12,0,0,8,12,0,10,8,12, +0,103,0,4,0,11,8,4,0,37,0,35,1,16,0,-75,0,0,0,-75,0,1,0,4,0,75,5,7,0,76,5,-74, +0,77,5,2,0,78,5,-69,0,-108,5,-111,0,-9,2,0,0,13,1,0,0,-37,5,2,0,20,0,2,0,12,8,2, +0,-101,5,2,0,-98,5,2,0,13,8,7,0,14,8,36,1,5,0,36,1,0,0,36,1,1,0,36,0,79,0,2, +0,20,0,0,0,15,8,37,1,12,0,37,1,0,0,37,1,1,0,9,0,2,0,2,0,18,0,2,0,20,0,0, +0,16,8,0,0,17,8,0,0,15,8,7,0,18,8,7,0,19,8,4,0,37,0,36,0,79,0,38,1,9,0,38, +1,0,0,38,1,1,0,32,0,20,8,0,0,21,8,7,0,22,8,2,0,23,8,2,0,20,0,2,0,18,0,2, +0,37,0,39,1,7,0,42,0,-36,5,26,0,24,8,4,0,20,0,4,0,25,8,12,0,26,8,32,0,20,8,0, +0,21,8,40,1,12,0,32,0,20,8,2,0,27,8,2,0,20,0,2,0,28,8,2,0,29,8,0,0,21,8,32, +0,30,8,0,0,31,8,7,0,32,8,7,0,-39,1,7,0,33,8,7,0,34,8,41,1,6,0,32,0,20,8,4, +0,9,8,4,0,35,8,4,0,93,0,4,0,37,0,0,0,21,8,42,1,4,0,32,0,20,8,4,0,20,0,4, +0,9,8,0,0,21,8,43,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,44,1,10,0,32, +0,20,8,4,0,36,8,7,0,-127,0,4,0,20,0,2,0,-42,5,2,0,37,8,2,0,43,0,2,0,70,0,7, +0,38,8,0,0,21,8,45,1,4,0,32,0,20,8,4,0,20,0,4,0,9,8,0,0,21,8,46,1,10,0,32, +0,20,8,2,0,18,0,2,0,-95,3,4,0,91,0,4,0,92,0,7,0,-97,7,7,0,-96,7,4,0,37,0,-111, +0,-122,7,0,0,21,8,47,1,4,0,32,0,20,8,4,0,7,3,4,0,39,8,0,0,21,8,48,1,5,0,32, +0,20,8,7,0,-127,0,4,0,40,8,4,0,7,3,4,0,8,3,49,1,6,0,32,0,20,8,4,0,41,8,4, +0,42,8,7,0,43,8,7,0,44,8,0,0,21,8,50,1,16,0,32,0,20,8,32,0,-14,7,4,0,18,0,7, +0,45,8,7,0,46,8,7,0,47,8,7,0,48,8,7,0,49,8,7,0,50,8,7,0,51,8,7,0,52,8,7, +0,53,8,2,0,20,0,2,0,37,0,2,0,43,0,2,0,70,0,51,1,3,0,32,0,20,8,4,0,20,0,4, +0,123,5,52,1,5,0,32,0,20,8,4,0,20,0,4,0,37,0,7,0,54,8,0,0,21,8,53,1,10,0,32, +0,20,8,0,0,21,8,2,0,55,8,2,0,56,8,0,0,57,8,0,0,58,8,7,0,59,8,7,0,60,8,7, +0,61,8,7,0,62,8,54,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7,0,63,8,7, +0,64,8,2,0,20,0,2,0,123,5,55,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7,0,12,0,7, +0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,56,1,8,0,7,0,9,0,7,0,10,0,7,0,11,0,7, +0,12,0,7,0,63,8,7,0,64,8,2,0,20,0,2,0,123,5,57,1,7,0,32,0,20,8,0,0,21,8,7, +0,20,1,7,0,30,1,2,0,20,0,2,0,13,1,4,0,37,0,58,1,5,0,32,0,-45,2,7,0,20,1,2, +0,-41,2,0,0,-39,2,0,0,65,8,59,1,10,0,59,1,0,0,59,1,1,0,2,0,18,0,2,0,20,0,0, +0,66,8,7,0,-36,0,7,0,-35,0,2,0,-58,7,2,0,67,8,32,0,45,0,60,1,22,0,60,1,0,0,60, +1,1,0,2,0,20,0,2,0,13,1,2,0,68,8,2,0,69,8,36,0,79,0,-111,0,-122,7,32,0,-89,0,7, +0,91,0,7,0,92,0,7,0,70,8,7,0,71,8,7,0,72,8,7,0,73,8,7,0,-107,2,7,0,-67,1,7, +0,-120,7,7,0,74,8,0,0,75,8,0,0,76,8,12,0,-4,2,61,1,8,0,7,0,-31,1,7,0,-97,7,7, +0,-96,7,9,0,2,0,2,0,77,8,2,0,78,8,2,0,79,8,2,0,80,8,62,1,18,0,62,1,0,0,62, +1,1,0,62,1,81,8,0,0,17,0,61,1,82,8,2,0,18,0,2,0,20,0,2,0,83,8,2,0,84,8,2, +0,85,8,2,0,86,8,4,0,43,0,7,0,87,8,7,0,88,8,4,0,89,8,4,0,90,8,62,1,91,8,63, +1,92,8,64,1,32,0,64,1,0,0,64,1,1,0,64,1,93,8,0,0,17,0,0,0,94,8,2,0,18,0,2, +0,20,0,2,0,-14,6,2,0,20,7,2,0,95,8,2,0,-119,0,2,0,84,8,2,0,-25,6,12,0,-127,7,12, +0,96,8,27,0,-9,5,9,0,97,8,7,0,87,8,7,0,88,8,7,0,-5,1,7,0,98,8,2,0,99,8,2, +0,100,8,7,0,101,8,7,0,102,8,2,0,103,8,2,0,104,8,24,0,105,8,24,0,106,8,24,0,107,8,65, +1,-103,0,66,1,108,8,63,1,6,0,63,1,0,0,63,1,1,0,64,1,109,8,64,1,110,8,62,1,111,8,62, +1,91,8,57,0,16,0,27,0,31,0,12,0,112,8,12,0,113,8,61,1,114,8,12,0,115,8,4,0,18,0,4, +0,116,8,4,0,117,8,4,0,118,8,12,0,119,8,66,1,120,8,62,1,121,8,62,1,122,8,9,0,123,8,9, +0,124,8,4,0,125,8,67,1,6,0,4,0,-128,0,4,0,-126,0,4,0,-25,6,0,0,126,8,0,0,127,8,2, +0,37,0,68,1,16,0,2,0,-86,6,2,0,-85,6,2,0,-128,8,2,0,-74,7,2,0,-127,8,2,0,68,0,7, +0,-108,2,7,0,-126,8,7,0,-125,8,2,0,34,1,0,0,-124,8,0,0,42,4,2,0,-123,8,2,0,37,0,4, +0,-122,8,4,0,-121,8,69,1,9,0,7,0,-120,8,7,0,-119,8,7,0,-60,7,7,0,112,0,7,0,-118,8,7, +0,71,5,2,0,-117,8,0,0,-116,8,0,0,37,0,70,1,4,0,7,0,-115,8,7,0,-114,8,2,0,-117,8,2, +0,37,0,71,1,3,0,7,0,-113,8,7,0,-112,8,7,0,15,0,72,1,7,0,0,0,-68,1,2,0,109,4,2, +0,110,4,2,0,111,4,2,0,62,4,4,0,-126,0,4,0,-97,3,73,1,7,0,7,0,-111,8,7,0,-110,8,7, +0,-109,8,7,0,4,2,7,0,-108,8,7,0,-107,8,7,0,-106,8,74,1,4,0,2,0,-105,8,2,0,-104,8,2, +0,-103,8,2,0,-102,8,75,1,2,0,7,0,5,0,7,0,6,0,76,1,2,0,0,0,-87,0,0,0,-101,8,77, +1,1,0,0,0,17,0,78,1,10,0,0,0,-100,8,0,0,-99,8,0,0,-98,8,0,0,-97,8,2,0,-128,8,2, +0,-96,8,7,0,-95,8,7,0,-94,8,7,0,-93,8,7,0,-67,1,79,1,2,0,9,0,-92,8,9,0,-91,8,80, +1,11,0,0,0,111,4,0,0,18,0,0,0,-117,8,0,0,112,0,0,0,-90,8,0,0,109,0,0,0,-74,0,7, +0,-89,8,7,0,-88,8,7,0,-87,8,7,0,-86,8,81,1,8,0,7,0,97,7,7,0,-127,0,7,0,42,4,7, +0,72,2,7,0,-85,8,7,0,-49,0,7,0,-84,8,4,0,18,0,82,1,4,0,2,0,-83,8,2,0,-82,8,2, +0,-81,8,2,0,37,0,83,1,1,0,0,0,17,0,84,1,4,0,7,0,5,0,7,0,6,0,2,0,20,0,2, +0,-80,8,85,1,10,0,2,0,-120,3,2,0,20,0,7,0,-17,3,7,0,-79,8,7,0,-78,8,7,0,-77,8,7, +0,-76,8,84,1,-75,8,84,1,-74,8,84,1,-73,8,60,0,9,0,4,0,20,0,4,0,64,0,24,0,-72,8,24, +0,-71,8,85,1,-70,8,7,0,-69,8,7,0,-68,8,7,0,-67,8,7,0,-66,8,86,1,4,0,46,0,-114,2,7, +0,-65,8,7,0,92,1,7,0,37,0,-87,0,13,0,27,0,31,0,2,0,20,0,2,0,72,5,4,0,109,0,7, +0,-64,8,7,0,1,2,7,0,-63,8,7,0,-62,8,7,0,92,1,2,0,47,1,2,0,37,0,50,0,77,1,86, +1,-61,8,87,1,10,0,4,0,18,0,4,0,-127,0,4,0,20,0,4,0,70,3,4,0,-60,8,4,0,-59,8,4, +0,-58,8,0,0,95,0,0,0,17,0,9,0,2,0,84,0,6,0,87,1,-57,8,4,0,-56,8,4,0,-55,8,4, +0,-54,8,4,0,37,0,9,0,-53,8,88,1,5,0,7,0,66,2,7,0,-74,2,7,0,-39,1,2,0,-52,8,2, +0,37,0,89,1,5,0,7,0,66,2,7,0,-51,8,7,0,-50,8,7,0,-49,8,7,0,-74,2,90,1,7,0,4, +0,-48,8,4,0,-47,8,4,0,-46,8,7,0,-45,8,7,0,-44,8,7,0,-43,8,7,0,-42,8,91,1,26,0,32, +0,-41,8,89,1,66,3,89,1,-40,8,88,1,-39,8,89,1,83,7,7,0,-38,8,7,0,-37,8,7,0,-36,8,7, +0,-35,8,7,0,-44,8,7,0,-43,8,7,0,-74,2,7,0,-97,2,7,0,-34,8,7,0,-33,8,7,0,109,0,7, +0,-32,8,4,0,-48,8,4,0,-31,8,4,0,37,0,4,0,81,0,4,0,-30,8,2,0,20,0,2,0,-29,8,2, +0,-28,8,2,0,100,3,92,1,112,0,27,0,31,0,4,0,20,0,2,0,18,0,2,0,55,8,2,0,-27,8,2, +0,-26,8,2,0,-25,8,2,0,-24,8,2,0,-23,8,2,0,-22,8,2,0,-21,8,2,0,-20,8,2,0,-19,8,2, +0,-18,8,2,0,-17,8,2,0,-16,8,2,0,-15,8,2,0,-14,8,2,0,-13,8,2,0,-47,1,2,0,76,7,2, +0,51,7,2,0,-12,8,2,0,-11,8,2,0,98,3,2,0,99,3,2,0,-10,8,2,0,-9,8,2,0,-8,8,2, +0,-7,8,2,0,-6,8,2,0,-5,8,7,0,-4,8,7,0,-3,8,7,0,-2,8,2,0,-1,8,2,0,0,9,7, +0,1,9,7,0,2,9,7,0,3,9,7,0,58,7,7,0,92,0,7,0,-97,2,7,0,64,7,7,0,4,9,7, +0,5,9,7,0,6,9,7,0,7,9,7,0,57,0,4,0,59,7,4,0,57,7,4,0,8,9,7,0,60,7,7, +0,61,7,7,0,62,7,7,0,9,9,7,0,10,9,7,0,11,9,7,0,12,9,7,0,13,9,7,0,14,9,7, +0,15,9,7,0,16,9,7,0,21,3,7,0,109,0,7,0,17,9,7,0,18,9,7,0,19,9,7,0,20,9,7, +0,21,9,7,0,22,9,7,0,108,2,7,0,23,9,7,0,24,9,4,0,25,9,4,0,26,9,7,0,27,9,7, +0,28,9,7,0,29,9,7,0,30,9,7,0,31,9,7,0,32,9,7,0,33,9,7,0,34,9,7,0,94,3,7, +0,92,3,7,0,93,3,7,0,35,9,7,0,36,9,7,0,37,9,7,0,38,9,7,0,39,9,7,0,40,9,7, +0,41,9,7,0,42,9,7,0,43,9,7,0,28,3,7,0,44,9,7,0,45,9,7,0,46,9,7,0,47,9,7, +0,48,9,7,0,49,9,7,0,50,9,0,0,51,9,63,0,55,3,63,0,52,9,32,0,53,9,32,0,54,9,36, +0,79,0,-108,0,53,3,-108,0,55,9,-120,0,37,0,-120,0,0,0,-120,0,1,0,92,1,56,9,91,1,-121,3,90, +1,-14,7,93,1,57,9,94,1,58,9,94,1,59,9,12,0,60,9,12,0,61,9,-107,0,54,3,32,0,62,9,32, +0,63,9,32,0,64,9,12,0,65,9,12,0,66,9,7,0,-45,0,7,0,83,4,4,0,110,2,4,0,20,0,4, +0,59,7,4,0,67,9,4,0,68,9,4,0,69,9,4,0,57,0,2,0,-38,0,2,0,70,9,2,0,71,9,2, +0,72,9,2,0,47,3,2,0,73,9,0,0,74,9,2,0,75,9,2,0,76,9,2,0,77,9,9,0,78,9,125, +0,-76,3,123,0,34,0,95,1,79,9,7,0,-106,3,7,0,80,9,7,0,81,9,7,0,-14,3,7,0,82,9,7, +0,31,3,7,0,21,3,7,0,83,9,7,0,3,2,7,0,84,9,7,0,85,9,7,0,86,9,7,0,87,9,7, +0,88,9,7,0,89,9,7,0,-105,3,7,0,90,9,7,0,91,9,7,0,92,9,7,0,-104,3,7,0,-108,3,7, +0,-107,3,4,0,93,9,4,0,93,0,4,0,94,9,4,0,95,9,2,0,96,9,2,0,97,9,2,0,98,9,2, +0,99,9,2,0,100,9,2,0,37,0,4,0,70,0,124,0,8,0,95,1,101,9,7,0,102,9,7,0,103,9,7, +0,-94,1,7,0,104,9,4,0,93,0,2,0,105,9,2,0,106,9,96,1,4,0,7,0,5,0,7,0,6,0,7, +0,7,0,7,0,107,9,97,1,6,0,97,1,0,0,97,1,1,0,96,1,108,9,4,0,109,9,2,0,110,9,2, +0,20,0,98,1,5,0,98,1,0,0,98,1,1,0,12,0,111,9,4,0,112,9,4,0,20,0,99,1,9,0,99, +1,0,0,99,1,1,0,12,0,-128,0,98,1,113,9,4,0,20,0,2,0,110,9,2,0,114,9,7,0,94,0,0, +0,115,9,-70,0,5,0,12,0,125,4,4,0,20,0,2,0,116,9,2,0,117,9,9,0,118,9,69,78,68,66,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; +int DNAlen= sizeof(DNAstr); diff --git a/Extras/Serialize/BulletFileLoader/CMakeLists.txt b/Extras/Serialize/BulletFileLoader/CMakeLists.txt index fefe62f92..59f163875 100644 --- a/Extras/Serialize/BulletFileLoader/CMakeLists.txt +++ b/Extras/Serialize/BulletFileLoader/CMakeLists.txt @@ -1,17 +1,17 @@ -INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src -) - -ADD_LIBRARY( -BulletFileLoader -bChunk.cpp -bChunk.h -bCommon.h -bDefines.h -bDNA.cpp -bDNA.h -bFile.cpp -bFile.h -btBulletFile.cpp -btBulletFile.h -) +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src +) + +ADD_LIBRARY( +BulletFileLoader +bChunk.cpp +bChunk.h +bCommon.h +bDefines.h +bDNA.cpp +bDNA.h +bFile.cpp +bFile.h +btBulletFile.cpp +btBulletFile.h +) diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet.h index e2588d1d4..3937927a9 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet.h @@ -1,69 +1,69 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_H__ -#define __BULLET_H__ -#include "bullet_PointerArray.h" -#include "bullet_btPhysicsSystem.h" -#include "bullet_ListBase.h" -#include "bullet_btVector3FloatData.h" -#include "bullet_btVector3DoubleData.h" -#include "bullet_btMatrix3x3FloatData.h" -#include "bullet_btMatrix3x3DoubleData.h" -#include "bullet_btTransformFloatData.h" -#include "bullet_btTransformDoubleData.h" -#include "bullet_btBvhSubtreeInfoData.h" -#include "bullet_btOptimizedBvhNodeFloatData.h" -#include "bullet_btOptimizedBvhNodeDoubleData.h" -#include "bullet_btQuantizedBvhNodeData.h" -#include "bullet_btQuantizedBvhFloatData.h" -#include "bullet_btQuantizedBvhDoubleData.h" -#include "bullet_btCollisionShapeData.h" -#include "bullet_btStaticPlaneShapeData.h" -#include "bullet_btConvexInternalShapeData.h" -#include "bullet_btPositionAndRadius.h" -#include "bullet_btMultiSphereShapeData.h" -#include "bullet_btIntIndexData.h" -#include "bullet_btShortIntIndexData.h" -#include "bullet_btShortIntIndexTripletData.h" -#include "bullet_btMeshPartData.h" -#include "bullet_btStridingMeshInterfaceData.h" -#include "bullet_btTriangleMeshShapeData.h" -#include "bullet_btCompoundShapeChildData.h" -#include "bullet_btCompoundShapeData.h" -#include "bullet_btCylinderShapeData.h" -#include "bullet_btCapsuleShapeData.h" -#include "bullet_btTriangleInfoData.h" -#include "bullet_btTriangleInfoMapData.h" -#include "bullet_btGImpactMeshShapeData.h" -#include "bullet_btConvexHullShapeData.h" -#include "bullet_btCollisionObjectDoubleData.h" -#include "bullet_btCollisionObjectFloatData.h" -#include "bullet_btRigidBodyFloatData.h" -#include "bullet_btRigidBodyDoubleData.h" -#include "bullet_btConstraintInfo1.h" -#include "bullet_btTypedConstraintData.h" -#include "bullet_btPoint2PointConstraintFloatData.h" -#include "bullet_btPoint2PointConstraintDoubleData.h" -#include "bullet_btHingeConstraintDoubleData.h" -#include "bullet_btHingeConstraintFloatData.h" -#include "bullet_btConeTwistConstraintData.h" -#include "bullet_btGeneric6DofConstraintData.h" -#include "bullet_btSliderConstraintData.h" +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_H__ +#define __BULLET_H__ +#include "bullet_PointerArray.h" +#include "bullet_btPhysicsSystem.h" +#include "bullet_ListBase.h" +#include "bullet_btVector3FloatData.h" +#include "bullet_btVector3DoubleData.h" +#include "bullet_btMatrix3x3FloatData.h" +#include "bullet_btMatrix3x3DoubleData.h" +#include "bullet_btTransformFloatData.h" +#include "bullet_btTransformDoubleData.h" +#include "bullet_btBvhSubtreeInfoData.h" +#include "bullet_btOptimizedBvhNodeFloatData.h" +#include "bullet_btOptimizedBvhNodeDoubleData.h" +#include "bullet_btQuantizedBvhNodeData.h" +#include "bullet_btQuantizedBvhFloatData.h" +#include "bullet_btQuantizedBvhDoubleData.h" +#include "bullet_btCollisionShapeData.h" +#include "bullet_btStaticPlaneShapeData.h" +#include "bullet_btConvexInternalShapeData.h" +#include "bullet_btPositionAndRadius.h" +#include "bullet_btMultiSphereShapeData.h" +#include "bullet_btIntIndexData.h" +#include "bullet_btShortIntIndexData.h" +#include "bullet_btShortIntIndexTripletData.h" +#include "bullet_btMeshPartData.h" +#include "bullet_btStridingMeshInterfaceData.h" +#include "bullet_btTriangleMeshShapeData.h" +#include "bullet_btCompoundShapeChildData.h" +#include "bullet_btCompoundShapeData.h" +#include "bullet_btCylinderShapeData.h" +#include "bullet_btCapsuleShapeData.h" +#include "bullet_btTriangleInfoData.h" +#include "bullet_btTriangleInfoMapData.h" +#include "bullet_btGImpactMeshShapeData.h" +#include "bullet_btConvexHullShapeData.h" +#include "bullet_btCollisionObjectDoubleData.h" +#include "bullet_btCollisionObjectFloatData.h" +#include "bullet_btRigidBodyFloatData.h" +#include "bullet_btRigidBodyDoubleData.h" +#include "bullet_btConstraintInfo1.h" +#include "bullet_btTypedConstraintData.h" +#include "bullet_btPoint2PointConstraintFloatData.h" +#include "bullet_btPoint2PointConstraintDoubleData.h" +#include "bullet_btHingeConstraintDoubleData.h" +#include "bullet_btHingeConstraintFloatData.h" +#include "bullet_btConeTwistConstraintData.h" +#include "bullet_btGeneric6DofConstraintData.h" +#include "bullet_btSliderConstraintData.h" #endif//__BULLET_H__ \ No newline at end of file diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_Common.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_Common.h index 6bc25573d..641b4e41b 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_Common.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_Common.h @@ -1,77 +1,77 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLETCOMMON_H__ -#define __BULLETCOMMON_H__ - -// put an empty struct in the case -typedef struct bInvalidHandle { - int unused; -}bInvalidHandle; - -namespace Bullet { - class PointerArray; - class btPhysicsSystem; - class ListBase; - class btVector3FloatData; - class btVector3DoubleData; - class btMatrix3x3FloatData; - class btMatrix3x3DoubleData; - class btTransformFloatData; - class btTransformDoubleData; - class btBvhSubtreeInfoData; - class btOptimizedBvhNodeFloatData; - class btOptimizedBvhNodeDoubleData; - class btQuantizedBvhNodeData; - class btQuantizedBvhFloatData; - class btQuantizedBvhDoubleData; - class btCollisionShapeData; - class btStaticPlaneShapeData; - class btConvexInternalShapeData; - class btPositionAndRadius; - class btMultiSphereShapeData; - class btIntIndexData; - class btShortIntIndexData; - class btShortIntIndexTripletData; - class btMeshPartData; - class btStridingMeshInterfaceData; - class btTriangleMeshShapeData; - class btCompoundShapeChildData; - class btCompoundShapeData; - class btCylinderShapeData; - class btCapsuleShapeData; - class btTriangleInfoData; - class btTriangleInfoMapData; - class btGImpactMeshShapeData; - class btConvexHullShapeData; - class btCollisionObjectDoubleData; - class btCollisionObjectFloatData; - class btRigidBodyFloatData; - class btRigidBodyDoubleData; - class btConstraintInfo1; - class btTypedConstraintData; - class btPoint2PointConstraintFloatData; - class btPoint2PointConstraintDoubleData; - class btHingeConstraintDoubleData; - class btHingeConstraintFloatData; - class btConeTwistConstraintData; - class btGeneric6DofConstraintData; - class btSliderConstraintData; -} +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLETCOMMON_H__ +#define __BULLETCOMMON_H__ + +// put an empty struct in the case +typedef struct bInvalidHandle { + int unused; +}bInvalidHandle; + +namespace Bullet { + class PointerArray; + class btPhysicsSystem; + class ListBase; + class btVector3FloatData; + class btVector3DoubleData; + class btMatrix3x3FloatData; + class btMatrix3x3DoubleData; + class btTransformFloatData; + class btTransformDoubleData; + class btBvhSubtreeInfoData; + class btOptimizedBvhNodeFloatData; + class btOptimizedBvhNodeDoubleData; + class btQuantizedBvhNodeData; + class btQuantizedBvhFloatData; + class btQuantizedBvhDoubleData; + class btCollisionShapeData; + class btStaticPlaneShapeData; + class btConvexInternalShapeData; + class btPositionAndRadius; + class btMultiSphereShapeData; + class btIntIndexData; + class btShortIntIndexData; + class btShortIntIndexTripletData; + class btMeshPartData; + class btStridingMeshInterfaceData; + class btTriangleMeshShapeData; + class btCompoundShapeChildData; + class btCompoundShapeData; + class btCylinderShapeData; + class btCapsuleShapeData; + class btTriangleInfoData; + class btTriangleInfoMapData; + class btGImpactMeshShapeData; + class btConvexHullShapeData; + class btCollisionObjectDoubleData; + class btCollisionObjectFloatData; + class btRigidBodyFloatData; + class btRigidBodyDoubleData; + class btConstraintInfo1; + class btTypedConstraintData; + class btPoint2PointConstraintFloatData; + class btPoint2PointConstraintDoubleData; + class btHingeConstraintDoubleData; + class btHingeConstraintFloatData; + class btConeTwistConstraintData; + class btGeneric6DofConstraintData; + class btSliderConstraintData; +} #endif//__BULLETCOMMON_H__ \ No newline at end of file diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_ListBase.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_ListBase.h index ef4568488..00b5cfec5 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_ListBase.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_ListBase.h @@ -1,40 +1,40 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_LISTBASE__H__ -#define __BULLET_LISTBASE__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class ListBase - { - public: - void *first; - void *last; - }; -} - - -#endif//__BULLET_LISTBASE__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_LISTBASE__H__ +#define __BULLET_LISTBASE__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class ListBase + { + public: + void *first; + void *last; + }; +} + + +#endif//__BULLET_LISTBASE__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_PointerArray.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_PointerArray.h index 21d70b723..c30f19bc3 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_PointerArray.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_PointerArray.h @@ -1,41 +1,41 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_POINTERARRAY__H__ -#define __BULLET_POINTERARRAY__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class PointerArray - { - public: - int m_size; - int m_capacity; - void *m_data; - }; -} - - -#endif//__BULLET_POINTERARRAY__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_POINTERARRAY__H__ +#define __BULLET_POINTERARRAY__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class PointerArray + { + public: + int m_size; + int m_capacity; + void *m_data; + }; +} + + +#endif//__BULLET_POINTERARRAY__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btBvhSubtreeInfoData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btBvhSubtreeInfoData.h index f3ec8a7ad..f6b2fa41d 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btBvhSubtreeInfoData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btBvhSubtreeInfoData.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTBVHSUBTREEINFODATA__H__ -#define __BULLET_BTBVHSUBTREEINFODATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btBvhSubtreeInfoData - { - public: - int m_rootNodeIndex; - int m_subtreeSize; - short m_quantizedAabbMin[3]; - short m_quantizedAabbMax[3]; - }; -} - - -#endif//__BULLET_BTBVHSUBTREEINFODATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTBVHSUBTREEINFODATA__H__ +#define __BULLET_BTBVHSUBTREEINFODATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btBvhSubtreeInfoData + { + public: + int m_rootNodeIndex; + int m_subtreeSize; + short m_quantizedAabbMin[3]; + short m_quantizedAabbMax[3]; + }; +} + + +#endif//__BULLET_BTBVHSUBTREEINFODATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCapsuleShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCapsuleShapeData.h index f2ef2f682..663f8fb0d 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCapsuleShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCapsuleShapeData.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCAPSULESHAPEDATA__H__ -#define __BULLET_BTCAPSULESHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btConvexInternalShapeData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCapsuleShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - int m_upAxis; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTCAPSULESHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCAPSULESHAPEDATA__H__ +#define __BULLET_BTCAPSULESHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btConvexInternalShapeData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCapsuleShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + int m_upAxis; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTCAPSULESHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectDoubleData.h index dc916d281..c7ce3f583 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectDoubleData.h @@ -1,64 +1,64 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCOLLISIONOBJECTDOUBLEDATA__H__ -#define __BULLET_BTCOLLISIONOBJECTDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformDoubleData.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCollisionObjectDoubleData - { - public: - void *m_broadphaseHandle; - void *m_collisionShape; - btCollisionShapeData *m_rootCollisionShape; - char *m_name; - btTransformDoubleData m_worldTransform; - btTransformDoubleData m_interpolationWorldTransform; - btVector3DoubleData m_interpolationLinearVelocity; - btVector3DoubleData m_interpolationAngularVelocity; - btVector3DoubleData m_anisotropicFriction; - double m_contactProcessingThreshold; - double m_deactivationTime; - double m_friction; - double m_restitution; - double m_hitFraction; - double m_ccdSweptSphereRadius; - double m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTCOLLISIONOBJECTDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCOLLISIONOBJECTDOUBLEDATA__H__ +#define __BULLET_BTCOLLISIONOBJECTDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformDoubleData.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCollisionObjectDoubleData + { + public: + void *m_broadphaseHandle; + void *m_collisionShape; + btCollisionShapeData *m_rootCollisionShape; + char *m_name; + btTransformDoubleData m_worldTransform; + btTransformDoubleData m_interpolationWorldTransform; + btVector3DoubleData m_interpolationLinearVelocity; + btVector3DoubleData m_interpolationAngularVelocity; + btVector3DoubleData m_anisotropicFriction; + double m_contactProcessingThreshold; + double m_deactivationTime; + double m_friction; + double m_restitution; + double m_hitFraction; + double m_ccdSweptSphereRadius; + double m_ccdMotionThreshold; + int m_hasAnisotropicFriction; + int m_collisionFlags; + int m_islandTag1; + int m_companionId; + int m_activationState1; + int m_internalType; + int m_checkCollideWith; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTCOLLISIONOBJECTDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectFloatData.h index fb068050d..09f4fbba8 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectFloatData.h @@ -1,63 +1,63 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCOLLISIONOBJECTFLOATDATA__H__ -#define __BULLET_BTCOLLISIONOBJECTFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformFloatData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCollisionObjectFloatData - { - public: - void *m_broadphaseHandle; - void *m_collisionShape; - btCollisionShapeData *m_rootCollisionShape; - char *m_name; - btTransformFloatData m_worldTransform; - btTransformFloatData m_interpolationWorldTransform; - btVector3FloatData m_interpolationLinearVelocity; - btVector3FloatData m_interpolationAngularVelocity; - btVector3FloatData m_anisotropicFriction; - float m_contactProcessingThreshold; - float m_deactivationTime; - float m_friction; - float m_restitution; - float m_hitFraction; - float m_ccdSweptSphereRadius; - float m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - }; -} - - -#endif//__BULLET_BTCOLLISIONOBJECTFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCOLLISIONOBJECTFLOATDATA__H__ +#define __BULLET_BTCOLLISIONOBJECTFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformFloatData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCollisionObjectFloatData + { + public: + void *m_broadphaseHandle; + void *m_collisionShape; + btCollisionShapeData *m_rootCollisionShape; + char *m_name; + btTransformFloatData m_worldTransform; + btTransformFloatData m_interpolationWorldTransform; + btVector3FloatData m_interpolationLinearVelocity; + btVector3FloatData m_interpolationAngularVelocity; + btVector3FloatData m_anisotropicFriction; + float m_contactProcessingThreshold; + float m_deactivationTime; + float m_friction; + float m_restitution; + float m_hitFraction; + float m_ccdSweptSphereRadius; + float m_ccdMotionThreshold; + int m_hasAnisotropicFriction; + int m_collisionFlags; + int m_islandTag1; + int m_companionId; + int m_activationState1; + int m_internalType; + int m_checkCollideWith; + }; +} + + +#endif//__BULLET_BTCOLLISIONOBJECTFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionShapeData.h index 8a1efeff0..7900b89f3 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionShapeData.h @@ -1,41 +1,41 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCOLLISIONSHAPEDATA__H__ -#define __BULLET_BTCOLLISIONSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCollisionShapeData - { - public: - char *m_name; - int m_shapeType; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTCOLLISIONSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCOLLISIONSHAPEDATA__H__ +#define __BULLET_BTCOLLISIONSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCollisionShapeData + { + public: + char *m_name; + int m_shapeType; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTCOLLISIONSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeChildData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeChildData.h index 2a678c75d..ecd7fad68 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeChildData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeChildData.h @@ -1,43 +1,43 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCOMPOUNDSHAPECHILDDATA__H__ -#define __BULLET_BTCOMPOUNDSHAPECHILDDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformFloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCompoundShapeChildData - { - public: - btTransformFloatData m_transform; - btCollisionShapeData *m_childShape; - int m_childShapeType; - float m_childMargin; - }; -} - - -#endif//__BULLET_BTCOMPOUNDSHAPECHILDDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCOMPOUNDSHAPECHILDDATA__H__ +#define __BULLET_BTCOMPOUNDSHAPECHILDDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformFloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCompoundShapeChildData + { + public: + btTransformFloatData m_transform; + btCollisionShapeData *m_childShape; + int m_childShapeType; + float m_childMargin; + }; +} + + +#endif//__BULLET_BTCOMPOUNDSHAPECHILDDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeData.h index dc8af53a0..27a9789ec 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCompoundShapeData.h @@ -1,43 +1,43 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCOMPOUNDSHAPEDATA__H__ -#define __BULLET_BTCOMPOUNDSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionShapeData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCompoundShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btCompoundShapeChildData *m_childShapePtr; - int m_numChildShapes; - float m_collisionMargin; - }; -} - - -#endif//__BULLET_BTCOMPOUNDSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCOMPOUNDSHAPEDATA__H__ +#define __BULLET_BTCOMPOUNDSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionShapeData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCompoundShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btCompoundShapeChildData *m_childShapePtr; + int m_numChildShapes; + float m_collisionMargin; + }; +} + + +#endif//__BULLET_BTCOMPOUNDSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConeTwistConstraintData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConeTwistConstraintData.h index eb68e34e6..76006c840 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConeTwistConstraintData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConeTwistConstraintData.h @@ -1,51 +1,51 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCONETWISTCONSTRAINTDATA__H__ -#define __BULLET_BTCONETWISTCONSTRAINTDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformFloatData.h" -#include "bullet_btTypedConstraintData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btConeTwistConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - float m_swingSpan1; - float m_swingSpan2; - float m_twistSpan; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - float m_damping; - char m_pad[4]; - }; -} - - -#endif//__BULLET_BTCONETWISTCONSTRAINTDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCONETWISTCONSTRAINTDATA__H__ +#define __BULLET_BTCONETWISTCONSTRAINTDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformFloatData.h" +#include "bullet_btTypedConstraintData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btConeTwistConstraintData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + float m_swingSpan1; + float m_swingSpan2; + float m_twistSpan; + float m_limitSoftness; + float m_biasFactor; + float m_relaxationFactor; + float m_damping; + char m_pad[4]; + }; +} + + +#endif//__BULLET_BTCONETWISTCONSTRAINTDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConstraintInfo1.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConstraintInfo1.h index bff46b275..0958e893a 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConstraintInfo1.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConstraintInfo1.h @@ -1,40 +1,40 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCONSTRAINTINFO1__H__ -#define __BULLET_BTCONSTRAINTINFO1__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btConstraintInfo1 - { - public: - int m_numConstraintRows; - int nub; - }; -} - - -#endif//__BULLET_BTCONSTRAINTINFO1__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCONSTRAINTINFO1__H__ +#define __BULLET_BTCONSTRAINTINFO1__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btConstraintInfo1 + { + public: + int m_numConstraintRows; + int nub; + }; +} + + +#endif//__BULLET_BTCONSTRAINTINFO1__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexHullShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexHullShapeData.h index 8fb91c5e6..daad9dd69 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexHullShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexHullShapeData.h @@ -1,44 +1,44 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCONVEXHULLSHAPEDATA__H__ -#define __BULLET_BTCONVEXHULLSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btConvexInternalShapeData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btConvexHullShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - btVector3FloatData *m_unscaledPointsFloatPtr; - btVector3DoubleData *m_unscaledPointsDoublePtr; - int m_numUnscaledPoints; - char m_padding3[4]; - }; -} - - -#endif//__BULLET_BTCONVEXHULLSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCONVEXHULLSHAPEDATA__H__ +#define __BULLET_BTCONVEXHULLSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btConvexInternalShapeData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btConvexHullShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + btVector3FloatData *m_unscaledPointsFloatPtr; + btVector3DoubleData *m_unscaledPointsDoublePtr; + int m_numUnscaledPoints; + char m_padding3[4]; + }; +} + + +#endif//__BULLET_BTCONVEXHULLSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexInternalShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexInternalShapeData.h index 2a7536d69..427137e86 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexInternalShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btConvexInternalShapeData.h @@ -1,45 +1,45 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCONVEXINTERNALSHAPEDATA__H__ -#define __BULLET_BTCONVEXINTERNALSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionShapeData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btConvexInternalShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btVector3FloatData m_localScaling; - btVector3FloatData m_implicitShapeDimensions; - float m_collisionMargin; - int m_padding; - }; -} - - -#endif//__BULLET_BTCONVEXINTERNALSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCONVEXINTERNALSHAPEDATA__H__ +#define __BULLET_BTCONVEXINTERNALSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionShapeData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btConvexInternalShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btVector3FloatData m_localScaling; + btVector3FloatData m_implicitShapeDimensions; + float m_collisionMargin; + int m_padding; + }; +} + + +#endif//__BULLET_BTCONVEXINTERNALSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCylinderShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCylinderShapeData.h index 4b92272b2..9702fd814 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCylinderShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCylinderShapeData.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTCYLINDERSHAPEDATA__H__ -#define __BULLET_BTCYLINDERSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btConvexInternalShapeData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btCylinderShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - int m_upAxis; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTCYLINDERSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTCYLINDERSHAPEDATA__H__ +#define __BULLET_BTCYLINDERSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btConvexInternalShapeData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btCylinderShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + int m_upAxis; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTCYLINDERSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGImpactMeshShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGImpactMeshShapeData.h index 76a185dec..236cdd9a3 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGImpactMeshShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGImpactMeshShapeData.h @@ -1,46 +1,46 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTGIMPACTMESHSHAPEDATA__H__ -#define __BULLET_BTGIMPACTMESHSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionShapeData.h" -#include "bullet_btStridingMeshInterfaceData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btGImpactMeshShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btStridingMeshInterfaceData m_meshInterface; - btVector3FloatData m_localScaling; - float m_collisionMargin; - int m_gimpactSubType; - }; -} - - -#endif//__BULLET_BTGIMPACTMESHSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTGIMPACTMESHSHAPEDATA__H__ +#define __BULLET_BTGIMPACTMESHSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionShapeData.h" +#include "bullet_btStridingMeshInterfaceData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btGImpactMeshShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btStridingMeshInterfaceData m_meshInterface; + btVector3FloatData m_localScaling; + float m_collisionMargin; + int m_gimpactSubType; + }; +} + + +#endif//__BULLET_BTGIMPACTMESHSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGeneric6DofConstraintData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGeneric6DofConstraintData.h index e66043d8f..fd5748ef6 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGeneric6DofConstraintData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btGeneric6DofConstraintData.h @@ -1,50 +1,50 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTGENERIC6DOFCONSTRAINTDATA__H__ -#define __BULLET_BTGENERIC6DOFCONSTRAINTDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformFloatData.h" -#include "bullet_btTypedConstraintData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btGeneric6DofConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - btVector3FloatData m_linearUpperLimit; - btVector3FloatData m_linearLowerLimit; - btVector3FloatData m_angularUpperLimit; - btVector3FloatData m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; - }; -} - - -#endif//__BULLET_BTGENERIC6DOFCONSTRAINTDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTGENERIC6DOFCONSTRAINTDATA__H__ +#define __BULLET_BTGENERIC6DOFCONSTRAINTDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformFloatData.h" +#include "bullet_btTypedConstraintData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btGeneric6DofConstraintData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + btVector3FloatData m_linearUpperLimit; + btVector3FloatData m_linearLowerLimit; + btVector3FloatData m_angularUpperLimit; + btVector3FloatData m_angularLowerLimit; + int m_useLinearReferenceFrameA; + int m_useOffsetForConstraintFrame; + }; +} + + +#endif//__BULLET_BTGENERIC6DOFCONSTRAINTDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintDoubleData.h index 05c249a39..a7f769bc1 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintDoubleData.h @@ -1,53 +1,53 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTHINGECONSTRAINTDOUBLEDATA__H__ -#define __BULLET_BTHINGECONSTRAINTDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformDoubleData.h" -#include "bullet_btTypedConstraintData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btHingeConstraintDoubleData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - }; -} - - -#endif//__BULLET_BTHINGECONSTRAINTDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTHINGECONSTRAINTDOUBLEDATA__H__ +#define __BULLET_BTHINGECONSTRAINTDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformDoubleData.h" +#include "bullet_btTypedConstraintData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btHingeConstraintDoubleData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformDoubleData m_rbAFrame; + btTransformDoubleData m_rbBFrame; + int m_useReferenceFrameA; + int m_angularOnly; + int m_enableAngularMotor; + float m_motorTargetVelocity; + float m_maxMotorImpulse; + float m_lowerLimit; + float m_upperLimit; + float m_limitSoftness; + float m_biasFactor; + float m_relaxationFactor; + }; +} + + +#endif//__BULLET_BTHINGECONSTRAINTDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintFloatData.h index c2d516f30..ec4591d19 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btHingeConstraintFloatData.h @@ -1,53 +1,53 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTHINGECONSTRAINTFLOATDATA__H__ -#define __BULLET_BTHINGECONSTRAINTFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformFloatData.h" -#include "bullet_btTypedConstraintData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btHingeConstraintFloatData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - }; -} - - -#endif//__BULLET_BTHINGECONSTRAINTFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTHINGECONSTRAINTFLOATDATA__H__ +#define __BULLET_BTHINGECONSTRAINTFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformFloatData.h" +#include "bullet_btTypedConstraintData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btHingeConstraintFloatData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + int m_useReferenceFrameA; + int m_angularOnly; + int m_enableAngularMotor; + float m_motorTargetVelocity; + float m_maxMotorImpulse; + float m_lowerLimit; + float m_upperLimit; + float m_limitSoftness; + float m_biasFactor; + float m_relaxationFactor; + }; +} + + +#endif//__BULLET_BTHINGECONSTRAINTFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btIntIndexData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btIntIndexData.h index d89b0cd8f..d24ea4ef7 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btIntIndexData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btIntIndexData.h @@ -1,39 +1,39 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTINTINDEXDATA__H__ -#define __BULLET_BTINTINDEXDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btIntIndexData - { - public: - int m_value; - }; -} - - -#endif//__BULLET_BTINTINDEXDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTINTINDEXDATA__H__ +#define __BULLET_BTINTINDEXDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btIntIndexData + { + public: + int m_value; + }; +} + + +#endif//__BULLET_BTINTINDEXDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3DoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3DoubleData.h index 5ec1d2215..a46ee55f0 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3DoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3DoubleData.h @@ -1,40 +1,40 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTMATRIX3X3DOUBLEDATA__H__ -#define __BULLET_BTMATRIX3X3DOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btMatrix3x3DoubleData - { - public: - btVector3DoubleData m_el[3]; - }; -} - - -#endif//__BULLET_BTMATRIX3X3DOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTMATRIX3X3DOUBLEDATA__H__ +#define __BULLET_BTMATRIX3X3DOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btMatrix3x3DoubleData + { + public: + btVector3DoubleData m_el[3]; + }; +} + + +#endif//__BULLET_BTMATRIX3X3DOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3FloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3FloatData.h index 5b4521b05..68559ec69 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3FloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3FloatData.h @@ -1,40 +1,40 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTMATRIX3X3FLOATDATA__H__ -#define __BULLET_BTMATRIX3X3FLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btMatrix3x3FloatData - { - public: - btVector3FloatData m_el[3]; - }; -} - - -#endif//__BULLET_BTMATRIX3X3FLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTMATRIX3X3FLOATDATA__H__ +#define __BULLET_BTMATRIX3X3FLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btMatrix3x3FloatData + { + public: + btVector3FloatData m_el[3]; + }; +} + + +#endif//__BULLET_BTMATRIX3X3FLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMeshPartData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMeshPartData.h index add1f5710..6918f859e 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMeshPartData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMeshPartData.h @@ -1,45 +1,45 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTMESHPARTDATA__H__ -#define __BULLET_BTMESHPARTDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btMeshPartData - { - public: - btVector3FloatData *m_vertices3f; - btVector3DoubleData *m_vertices3d; - btIntIndexData *m_indices32; - btShortIntIndexTripletData *m_3indices16; - btShortIntIndexData *m_indices16; - int m_numTriangles; - int m_numVertices; - }; -} - - -#endif//__BULLET_BTMESHPARTDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTMESHPARTDATA__H__ +#define __BULLET_BTMESHPARTDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btMeshPartData + { + public: + btVector3FloatData *m_vertices3f; + btVector3DoubleData *m_vertices3d; + btIntIndexData *m_indices32; + btShortIntIndexTripletData *m_3indices16; + btShortIntIndexData *m_indices16; + int m_numTriangles; + int m_numVertices; + }; +} + + +#endif//__BULLET_BTMESHPARTDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMultiSphereShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMultiSphereShapeData.h index 8aaf49443..c453ad5ee 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMultiSphereShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMultiSphereShapeData.h @@ -1,43 +1,43 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTMULTISPHERESHAPEDATA__H__ -#define __BULLET_BTMULTISPHERESHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btConvexInternalShapeData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btMultiSphereShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - btPositionAndRadius *m_localPositionArrayPtr; - int m_localPositionArraySize; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTMULTISPHERESHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTMULTISPHERESHAPEDATA__H__ +#define __BULLET_BTMULTISPHERESHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btConvexInternalShapeData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btMultiSphereShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + btPositionAndRadius *m_localPositionArrayPtr; + int m_localPositionArraySize; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTMULTISPHERESHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeDoubleData.h index ca98e8d2e..e309d8a6c 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeDoubleData.h @@ -1,45 +1,45 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTOPTIMIZEDBVHNODEDOUBLEDATA__H__ -#define __BULLET_BTOPTIMIZEDBVHNODEDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btOptimizedBvhNodeDoubleData - { - public: - btVector3DoubleData m_aabbMinOrg; - btVector3DoubleData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; - }; -} - - -#endif//__BULLET_BTOPTIMIZEDBVHNODEDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTOPTIMIZEDBVHNODEDOUBLEDATA__H__ +#define __BULLET_BTOPTIMIZEDBVHNODEDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btOptimizedBvhNodeDoubleData + { + public: + btVector3DoubleData m_aabbMinOrg; + btVector3DoubleData m_aabbMaxOrg; + int m_escapeIndex; + int m_subPart; + int m_triangleIndex; + char m_pad[4]; + }; +} + + +#endif//__BULLET_BTOPTIMIZEDBVHNODEDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeFloatData.h index 42c0b4d66..249ac27fb 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btOptimizedBvhNodeFloatData.h @@ -1,45 +1,45 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTOPTIMIZEDBVHNODEFLOATDATA__H__ -#define __BULLET_BTOPTIMIZEDBVHNODEFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btOptimizedBvhNodeFloatData - { - public: - btVector3FloatData m_aabbMinOrg; - btVector3FloatData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; - }; -} - - -#endif//__BULLET_BTOPTIMIZEDBVHNODEFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTOPTIMIZEDBVHNODEFLOATDATA__H__ +#define __BULLET_BTOPTIMIZEDBVHNODEFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btOptimizedBvhNodeFloatData + { + public: + btVector3FloatData m_aabbMinOrg; + btVector3FloatData m_aabbMaxOrg; + int m_escapeIndex; + int m_subPart; + int m_triangleIndex; + char m_pad[4]; + }; +} + + +#endif//__BULLET_BTOPTIMIZEDBVHNODEFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPhysicsSystem.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPhysicsSystem.h index 50956fc02..221cc12bf 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPhysicsSystem.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPhysicsSystem.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTPHYSICSSYSTEM__H__ -#define __BULLET_BTPHYSICSSYSTEM__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_PointerArray.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btPhysicsSystem - { - public: - PointerArray m_collisionShapes; - PointerArray m_collisionObjects; - PointerArray m_constraints; - }; -} - - -#endif//__BULLET_BTPHYSICSSYSTEM__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTPHYSICSSYSTEM__H__ +#define __BULLET_BTPHYSICSSYSTEM__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_PointerArray.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btPhysicsSystem + { + public: + PointerArray m_collisionShapes; + PointerArray m_collisionObjects; + PointerArray m_constraints; + }; +} + + +#endif//__BULLET_BTPHYSICSSYSTEM__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintDoubleData.h index 0ee9267d5..3e4dfe7c0 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintDoubleData.h @@ -1,43 +1,43 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTPOINT2POINTCONSTRAINTDOUBLEDATA__H__ -#define __BULLET_BTPOINT2POINTCONSTRAINTDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTypedConstraintData.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btPoint2PointConstraintDoubleData - { - public: - btTypedConstraintData m_typeConstraintData; - btVector3DoubleData m_pivotInA; - btVector3DoubleData m_pivotInB; - }; -} - - -#endif//__BULLET_BTPOINT2POINTCONSTRAINTDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTPOINT2POINTCONSTRAINTDOUBLEDATA__H__ +#define __BULLET_BTPOINT2POINTCONSTRAINTDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTypedConstraintData.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btPoint2PointConstraintDoubleData + { + public: + btTypedConstraintData m_typeConstraintData; + btVector3DoubleData m_pivotInA; + btVector3DoubleData m_pivotInB; + }; +} + + +#endif//__BULLET_BTPOINT2POINTCONSTRAINTDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintFloatData.h index 746dafdba..36a80102b 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPoint2PointConstraintFloatData.h @@ -1,43 +1,43 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTPOINT2POINTCONSTRAINTFLOATDATA__H__ -#define __BULLET_BTPOINT2POINTCONSTRAINTFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTypedConstraintData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btPoint2PointConstraintFloatData - { - public: - btTypedConstraintData m_typeConstraintData; - btVector3FloatData m_pivotInA; - btVector3FloatData m_pivotInB; - }; -} - - -#endif//__BULLET_BTPOINT2POINTCONSTRAINTFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTPOINT2POINTCONSTRAINTFLOATDATA__H__ +#define __BULLET_BTPOINT2POINTCONSTRAINTFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTypedConstraintData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btPoint2PointConstraintFloatData + { + public: + btTypedConstraintData m_typeConstraintData; + btVector3FloatData m_pivotInA; + btVector3FloatData m_pivotInB; + }; +} + + +#endif//__BULLET_BTPOINT2POINTCONSTRAINTFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPositionAndRadius.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPositionAndRadius.h index e65656e0f..d5fc2e9b8 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPositionAndRadius.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btPositionAndRadius.h @@ -1,41 +1,41 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTPOSITIONANDRADIUS__H__ -#define __BULLET_BTPOSITIONANDRADIUS__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btPositionAndRadius - { - public: - btVector3FloatData m_pos; - float m_radius; - }; -} - - -#endif//__BULLET_BTPOSITIONANDRADIUS__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTPOSITIONANDRADIUS__H__ +#define __BULLET_BTPOSITIONANDRADIUS__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btPositionAndRadius + { + public: + btVector3FloatData m_pos; + float m_radius; + }; +} + + +#endif//__BULLET_BTPOSITIONANDRADIUS__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhDoubleData.h index 67c8461fd..1509525d3 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhDoubleData.h @@ -1,51 +1,51 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTQUANTIZEDBVHDOUBLEDATA__H__ -#define __BULLET_BTQUANTIZEDBVHDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btQuantizedBvhDoubleData - { - public: - btVector3DoubleData m_bvhAabbMin; - btVector3DoubleData m_bvhAabbMax; - btVector3DoubleData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - btOptimizedBvhNodeDoubleData *m_contiguousNodesPtr; - btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - int m_traversalMode; - int m_numSubtreeHeaders; - btBvhSubtreeInfoData *m_subTreeInfoPtr; - }; -} - - -#endif//__BULLET_BTQUANTIZEDBVHDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTQUANTIZEDBVHDOUBLEDATA__H__ +#define __BULLET_BTQUANTIZEDBVHDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btQuantizedBvhDoubleData + { + public: + btVector3DoubleData m_bvhAabbMin; + btVector3DoubleData m_bvhAabbMax; + btVector3DoubleData m_bvhQuantization; + int m_curNodeIndex; + int m_useQuantization; + int m_numContiguousLeafNodes; + int m_numQuantizedContiguousNodes; + btOptimizedBvhNodeDoubleData *m_contiguousNodesPtr; + btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; + int m_traversalMode; + int m_numSubtreeHeaders; + btBvhSubtreeInfoData *m_subTreeInfoPtr; + }; +} + + +#endif//__BULLET_BTQUANTIZEDBVHDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhFloatData.h index 8f773235f..0fc6bf74d 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhFloatData.h @@ -1,51 +1,51 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTQUANTIZEDBVHFLOATDATA__H__ -#define __BULLET_BTQUANTIZEDBVHFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btQuantizedBvhFloatData - { - public: - btVector3FloatData m_bvhAabbMin; - btVector3FloatData m_bvhAabbMax; - btVector3FloatData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - btOptimizedBvhNodeFloatData *m_contiguousNodesPtr; - btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - btBvhSubtreeInfoData *m_subTreeInfoPtr; - int m_traversalMode; - int m_numSubtreeHeaders; - }; -} - - -#endif//__BULLET_BTQUANTIZEDBVHFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTQUANTIZEDBVHFLOATDATA__H__ +#define __BULLET_BTQUANTIZEDBVHFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btQuantizedBvhFloatData + { + public: + btVector3FloatData m_bvhAabbMin; + btVector3FloatData m_bvhAabbMax; + btVector3FloatData m_bvhQuantization; + int m_curNodeIndex; + int m_useQuantization; + int m_numContiguousLeafNodes; + int m_numQuantizedContiguousNodes; + btOptimizedBvhNodeFloatData *m_contiguousNodesPtr; + btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; + btBvhSubtreeInfoData *m_subTreeInfoPtr; + int m_traversalMode; + int m_numSubtreeHeaders; + }; +} + + +#endif//__BULLET_BTQUANTIZEDBVHFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhNodeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhNodeData.h index 453081b4c..47955a82b 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhNodeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btQuantizedBvhNodeData.h @@ -1,41 +1,41 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTQUANTIZEDBVHNODEDATA__H__ -#define __BULLET_BTQUANTIZEDBVHNODEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btQuantizedBvhNodeData - { - public: - short m_quantizedAabbMin[3]; - short m_quantizedAabbMax[3]; - int m_escapeIndexOrTriangleIndex; - }; -} - - -#endif//__BULLET_BTQUANTIZEDBVHNODEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTQUANTIZEDBVHNODEDATA__H__ +#define __BULLET_BTQUANTIZEDBVHNODEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btQuantizedBvhNodeData + { + public: + short m_quantizedAabbMin[3]; + short m_quantizedAabbMax[3]; + int m_escapeIndexOrTriangleIndex; + }; +} + + +#endif//__BULLET_BTQUANTIZEDBVHNODEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyDoubleData.h index 8f578b6fd..e1e73ffd0 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyDoubleData.h @@ -1,63 +1,63 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTRIGIDBODYDOUBLEDATA__H__ -#define __BULLET_BTRIGIDBODYDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionObjectDoubleData.h" -#include "bullet_btMatrix3x3DoubleData.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btRigidBodyDoubleData - { - public: - btCollisionObjectDoubleData m_collisionObjectData; - btMatrix3x3DoubleData m_invInertiaTensorWorld; - btVector3DoubleData m_linearVelocity; - btVector3DoubleData m_angularVelocity; - btVector3DoubleData m_angularFactor; - btVector3DoubleData m_linearFactor; - btVector3DoubleData m_gravity; - btVector3DoubleData m_gravity_acceleration; - btVector3DoubleData m_invInertiaLocal; - btVector3DoubleData m_totalForce; - btVector3DoubleData m_totalTorque; - double m_inverseMass; - double m_linearDamping; - double m_angularDamping; - double m_additionalDampingFactor; - double m_additionalLinearDampingThresholdSqr; - double m_additionalAngularDampingThresholdSqr; - double m_additionalAngularDampingFactor; - double m_linearSleepingThreshold; - double m_angularSleepingThreshold; - int m_additionalDamping; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTRIGIDBODYDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTRIGIDBODYDOUBLEDATA__H__ +#define __BULLET_BTRIGIDBODYDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionObjectDoubleData.h" +#include "bullet_btMatrix3x3DoubleData.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btRigidBodyDoubleData + { + public: + btCollisionObjectDoubleData m_collisionObjectData; + btMatrix3x3DoubleData m_invInertiaTensorWorld; + btVector3DoubleData m_linearVelocity; + btVector3DoubleData m_angularVelocity; + btVector3DoubleData m_angularFactor; + btVector3DoubleData m_linearFactor; + btVector3DoubleData m_gravity; + btVector3DoubleData m_gravity_acceleration; + btVector3DoubleData m_invInertiaLocal; + btVector3DoubleData m_totalForce; + btVector3DoubleData m_totalTorque; + double m_inverseMass; + double m_linearDamping; + double m_angularDamping; + double m_additionalDampingFactor; + double m_additionalLinearDampingThresholdSqr; + double m_additionalAngularDampingThresholdSqr; + double m_additionalAngularDampingFactor; + double m_linearSleepingThreshold; + double m_angularSleepingThreshold; + int m_additionalDamping; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTRIGIDBODYDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyFloatData.h index 9d8a936fe..63bb33102 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyFloatData.h @@ -1,62 +1,62 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTRIGIDBODYFLOATDATA__H__ -#define __BULLET_BTRIGIDBODYFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionObjectFloatData.h" -#include "bullet_btMatrix3x3FloatData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btRigidBodyFloatData - { - public: - btCollisionObjectFloatData m_collisionObjectData; - btMatrix3x3FloatData m_invInertiaTensorWorld; - btVector3FloatData m_linearVelocity; - btVector3FloatData m_angularVelocity; - btVector3FloatData m_angularFactor; - btVector3FloatData m_linearFactor; - btVector3FloatData m_gravity; - btVector3FloatData m_gravity_acceleration; - btVector3FloatData m_invInertiaLocal; - btVector3FloatData m_totalForce; - btVector3FloatData m_totalTorque; - float m_inverseMass; - float m_linearDamping; - float m_angularDamping; - float m_additionalDampingFactor; - float m_additionalLinearDampingThresholdSqr; - float m_additionalAngularDampingThresholdSqr; - float m_additionalAngularDampingFactor; - float m_linearSleepingThreshold; - float m_angularSleepingThreshold; - int m_additionalDamping; - }; -} - - -#endif//__BULLET_BTRIGIDBODYFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTRIGIDBODYFLOATDATA__H__ +#define __BULLET_BTRIGIDBODYFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionObjectFloatData.h" +#include "bullet_btMatrix3x3FloatData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btRigidBodyFloatData + { + public: + btCollisionObjectFloatData m_collisionObjectData; + btMatrix3x3FloatData m_invInertiaTensorWorld; + btVector3FloatData m_linearVelocity; + btVector3FloatData m_angularVelocity; + btVector3FloatData m_angularFactor; + btVector3FloatData m_linearFactor; + btVector3FloatData m_gravity; + btVector3FloatData m_gravity_acceleration; + btVector3FloatData m_invInertiaLocal; + btVector3FloatData m_totalForce; + btVector3FloatData m_totalTorque; + float m_inverseMass; + float m_linearDamping; + float m_angularDamping; + float m_additionalDampingFactor; + float m_additionalLinearDampingThresholdSqr; + float m_additionalAngularDampingThresholdSqr; + float m_additionalAngularDampingFactor; + float m_linearSleepingThreshold; + float m_angularSleepingThreshold; + int m_additionalDamping; + }; +} + + +#endif//__BULLET_BTRIGIDBODYFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexData.h index 7cf7cea3e..33c1a2272 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexData.h @@ -1,40 +1,40 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTSHORTINTINDEXDATA__H__ -#define __BULLET_BTSHORTINTINDEXDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btShortIntIndexData - { - public: - short m_value; - char m_pad[2]; - }; -} - - -#endif//__BULLET_BTSHORTINTINDEXDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTSHORTINTINDEXDATA__H__ +#define __BULLET_BTSHORTINTINDEXDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btShortIntIndexData + { + public: + short m_value; + char m_pad[2]; + }; +} + + +#endif//__BULLET_BTSHORTINTINDEXDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexTripletData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexTripletData.h index 3a5d3472a..8b8a6cecf 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexTripletData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btShortIntIndexTripletData.h @@ -1,40 +1,40 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTSHORTINTINDEXTRIPLETDATA__H__ -#define __BULLET_BTSHORTINTINDEXTRIPLETDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btShortIntIndexTripletData - { - public: - short m_values[3]; - char m_pad[2]; - }; -} - - -#endif//__BULLET_BTSHORTINTINDEXTRIPLETDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTSHORTINTINDEXTRIPLETDATA__H__ +#define __BULLET_BTSHORTINTINDEXTRIPLETDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btShortIntIndexTripletData + { + public: + short m_values[3]; + char m_pad[2]; + }; +} + + +#endif//__BULLET_BTSHORTINTINDEXTRIPLETDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btSliderConstraintData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btSliderConstraintData.h index 5d755cbdc..ff56fd564 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btSliderConstraintData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btSliderConstraintData.h @@ -1,49 +1,49 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTSLIDERCONSTRAINTDATA__H__ -#define __BULLET_BTSLIDERCONSTRAINTDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btTransformFloatData.h" -#include "bullet_btTypedConstraintData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btSliderConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - float m_linearUpperLimit; - float m_linearLowerLimit; - float m_angularUpperLimit; - float m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; - }; -} - - -#endif//__BULLET_BTSLIDERCONSTRAINTDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTSLIDERCONSTRAINTDATA__H__ +#define __BULLET_BTSLIDERCONSTRAINTDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btTransformFloatData.h" +#include "bullet_btTypedConstraintData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btSliderConstraintData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + float m_linearUpperLimit; + float m_linearLowerLimit; + float m_angularUpperLimit; + float m_angularLowerLimit; + int m_useLinearReferenceFrameA; + int m_useOffsetForConstraintFrame; + }; +} + + +#endif//__BULLET_BTSLIDERCONSTRAINTDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStaticPlaneShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStaticPlaneShapeData.h index 2eb7c57ac..9c98f0a65 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStaticPlaneShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStaticPlaneShapeData.h @@ -1,45 +1,45 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTSTATICPLANESHAPEDATA__H__ -#define __BULLET_BTSTATICPLANESHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionShapeData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btStaticPlaneShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btVector3FloatData m_localScaling; - btVector3FloatData m_planeNormal; - float m_planeConstant; - char m_pad[4]; - }; -} - - -#endif//__BULLET_BTSTATICPLANESHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTSTATICPLANESHAPEDATA__H__ +#define __BULLET_BTSTATICPLANESHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionShapeData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btStaticPlaneShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btVector3FloatData m_localScaling; + btVector3FloatData m_planeNormal; + float m_planeConstant; + char m_pad[4]; + }; +} + + +#endif//__BULLET_BTSTATICPLANESHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStridingMeshInterfaceData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStridingMeshInterfaceData.h index 0ce2aec6d..ad3bbdfe2 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStridingMeshInterfaceData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btStridingMeshInterfaceData.h @@ -1,43 +1,43 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTSTRIDINGMESHINTERFACEDATA__H__ -#define __BULLET_BTSTRIDINGMESHINTERFACEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btStridingMeshInterfaceData - { - public: - btMeshPartData *m_meshPartsPtr; - btVector3FloatData m_scaling; - int m_numMeshParts; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTSTRIDINGMESHINTERFACEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTSTRIDINGMESHINTERFACEDATA__H__ +#define __BULLET_BTSTRIDINGMESHINTERFACEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btStridingMeshInterfaceData + { + public: + btMeshPartData *m_meshPartsPtr; + btVector3FloatData m_scaling; + int m_numMeshParts; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTSTRIDINGMESHINTERFACEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformDoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformDoubleData.h index 11b8d4302..b3e6028e0 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformDoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformDoubleData.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTTRANSFORMDOUBLEDATA__H__ -#define __BULLET_BTTRANSFORMDOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btMatrix3x3DoubleData.h" -#include "bullet_btVector3DoubleData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btTransformDoubleData - { - public: - btMatrix3x3DoubleData m_basis; - btVector3DoubleData m_origin; - }; -} - - -#endif//__BULLET_BTTRANSFORMDOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTTRANSFORMDOUBLEDATA__H__ +#define __BULLET_BTTRANSFORMDOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btMatrix3x3DoubleData.h" +#include "bullet_btVector3DoubleData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btTransformDoubleData + { + public: + btMatrix3x3DoubleData m_basis; + btVector3DoubleData m_origin; + }; +} + + +#endif//__BULLET_BTTRANSFORMDOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformFloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformFloatData.h index 9d8f98a5d..4a264cee6 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformFloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformFloatData.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTTRANSFORMFLOATDATA__H__ -#define __BULLET_BTTRANSFORMFLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btMatrix3x3FloatData.h" -#include "bullet_btVector3FloatData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btTransformFloatData - { - public: - btMatrix3x3FloatData m_basis; - btVector3FloatData m_origin; - }; -} - - -#endif//__BULLET_BTTRANSFORMFLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTTRANSFORMFLOATDATA__H__ +#define __BULLET_BTTRANSFORMFLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btMatrix3x3FloatData.h" +#include "bullet_btVector3FloatData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btTransformFloatData + { + public: + btMatrix3x3FloatData m_basis; + btVector3FloatData m_origin; + }; +} + + +#endif//__BULLET_BTTRANSFORMFLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoData.h index 2b744da68..de0cd54e5 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoData.h @@ -1,42 +1,42 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTTRIANGLEINFODATA__H__ -#define __BULLET_BTTRIANGLEINFODATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btTriangleInfoData - { - public: - int m_flags; - float m_edgeV0V1Angle; - float m_edgeV1V2Angle; - float m_edgeV2V0Angle; - }; -} - - -#endif//__BULLET_BTTRIANGLEINFODATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTTRIANGLEINFODATA__H__ +#define __BULLET_BTTRIANGLEINFODATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btTriangleInfoData + { + public: + int m_flags; + float m_edgeV0V1Angle; + float m_edgeV1V2Angle; + float m_edgeV2V0Angle; + }; +} + + +#endif//__BULLET_BTTRIANGLEINFODATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoMapData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoMapData.h index 9d3baa8cd..cfa75b1e9 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoMapData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleInfoMapData.h @@ -1,52 +1,52 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTTRIANGLEINFOMAPDATA__H__ -#define __BULLET_BTTRIANGLEINFOMAPDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btTriangleInfoMapData - { - public: - int *m_hashTablePtr; - int *m_nextPtr; - btTriangleInfoData *m_valueArrayPtr; - int *m_keyArrayPtr; - float m_convexEpsilon; - float m_planarEpsilon; - float m_equalVertexThreshold; - float m_edgeDistanceThreshold; - float m_zeroAreaThreshold; - int m_nextSize; - int m_hashTableSize; - int m_numValues; - int m_numKeys; - char m_padding[4]; - }; -} - - -#endif//__BULLET_BTTRIANGLEINFOMAPDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTTRIANGLEINFOMAPDATA__H__ +#define __BULLET_BTTRIANGLEINFOMAPDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btTriangleInfoMapData + { + public: + int *m_hashTablePtr; + int *m_nextPtr; + btTriangleInfoData *m_valueArrayPtr; + int *m_keyArrayPtr; + float m_convexEpsilon; + float m_planarEpsilon; + float m_equalVertexThreshold; + float m_edgeDistanceThreshold; + float m_zeroAreaThreshold; + int m_nextSize; + int m_hashTableSize; + int m_numValues; + int m_numKeys; + char m_padding[4]; + }; +} + + +#endif//__BULLET_BTTRIANGLEINFOMAPDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleMeshShapeData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleMeshShapeData.h index 33b7cb333..261791275 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleMeshShapeData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTriangleMeshShapeData.h @@ -1,47 +1,47 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTTRIANGLEMESHSHAPEDATA__H__ -#define __BULLET_BTTRIANGLEMESHSHAPEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" -#include "bullet_btCollisionShapeData.h" -#include "bullet_btStridingMeshInterfaceData.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btTriangleMeshShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btStridingMeshInterfaceData m_meshInterface; - btQuantizedBvhFloatData *m_quantizedFloatBvh; - btQuantizedBvhDoubleData *m_quantizedDoubleBvh; - btTriangleInfoMapData *m_triangleInfoMap; - float m_collisionMargin; - char m_pad3[4]; - }; -} - - -#endif//__BULLET_BTTRIANGLEMESHSHAPEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTTRIANGLEMESHSHAPEDATA__H__ +#define __BULLET_BTTRIANGLEMESHSHAPEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" +#include "bullet_btCollisionShapeData.h" +#include "bullet_btStridingMeshInterfaceData.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btTriangleMeshShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btStridingMeshInterfaceData m_meshInterface; + btQuantizedBvhFloatData *m_quantizedFloatBvh; + btQuantizedBvhDoubleData *m_quantizedDoubleBvh; + btTriangleInfoMapData *m_triangleInfoMap; + float m_collisionMargin; + char m_pad3[4]; + }; +} + + +#endif//__BULLET_BTTRIANGLEMESHSHAPEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTypedConstraintData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTypedConstraintData.h index b05882e42..5a2b3ea9b 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTypedConstraintData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTypedConstraintData.h @@ -1,49 +1,49 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTTYPEDCONSTRAINTDATA__H__ -#define __BULLET_BTTYPEDCONSTRAINTDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btTypedConstraintData - { - public: - bInvalidHandle *m_rbA; - bInvalidHandle *m_rbB; - char *m_name; - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - float m_appliedImpulse; - float m_dbgDrawSize; - int m_disableCollisionsBetweenLinkedBodies; - char m_pad4[4]; - }; -} - - -#endif//__BULLET_BTTYPEDCONSTRAINTDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTTYPEDCONSTRAINTDATA__H__ +#define __BULLET_BTTYPEDCONSTRAINTDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btTypedConstraintData + { + public: + bInvalidHandle *m_rbA; + bInvalidHandle *m_rbB; + char *m_name; + int m_objectType; + int m_userConstraintType; + int m_userConstraintId; + int m_needsFeedback; + float m_appliedImpulse; + float m_dbgDrawSize; + int m_disableCollisionsBetweenLinkedBodies; + char m_pad4[4]; + }; +} + + +#endif//__BULLET_BTTYPEDCONSTRAINTDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3DoubleData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3DoubleData.h index 7fb2088fc..f69ad3dc9 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3DoubleData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3DoubleData.h @@ -1,39 +1,39 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTVECTOR3DOUBLEDATA__H__ -#define __BULLET_BTVECTOR3DOUBLEDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btVector3DoubleData - { - public: - double m_floats[4]; - }; -} - - -#endif//__BULLET_BTVECTOR3DOUBLEDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTVECTOR3DOUBLEDATA__H__ +#define __BULLET_BTVECTOR3DOUBLEDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btVector3DoubleData + { + public: + double m_floats[4]; + }; +} + + +#endif//__BULLET_BTVECTOR3DOUBLEDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3FloatData.h b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3FloatData.h index 9b0309c2a..ac0d31dde 100644 --- a/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3FloatData.h +++ b/Extras/Serialize/BulletFileLoader/autogenerated/bullet_btVector3FloatData.h @@ -1,39 +1,39 @@ -/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from makesdna dna.c -#ifndef __BULLET_BTVECTOR3FLOATDATA__H__ -#define __BULLET_BTVECTOR3FLOATDATA__H__ - - -// -------------------------------------------------- // -#include "bullet_Common.h" - -namespace Bullet { - - - // ---------------------------------------------- // - class btVector3FloatData - { - public: - float m_floats[4]; - }; -} - - -#endif//__BULLET_BTVECTOR3FLOATDATA__H__ +/* Copyright (C) 2006-2009 Erwin Coumans & Charlie C +* +* 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. +*/ +// Auto generated from makesdna dna.c +#ifndef __BULLET_BTVECTOR3FLOATDATA__H__ +#define __BULLET_BTVECTOR3FLOATDATA__H__ + + +// -------------------------------------------------- // +#include "bullet_Common.h" + +namespace Bullet { + + + // ---------------------------------------------- // + class btVector3FloatData + { + public: + float m_floats[4]; + }; +} + + +#endif//__BULLET_BTVECTOR3FLOATDATA__H__ diff --git a/Extras/Serialize/BulletFileLoader/bChunk.cpp b/Extras/Serialize/BulletFileLoader/bChunk.cpp index ac9125aec..564e5507e 100644 --- a/Extras/Serialize/BulletFileLoader/bChunk.cpp +++ b/Extras/Serialize/BulletFileLoader/bChunk.cpp @@ -1,75 +1,75 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 "bChunk.h" -#include "bDefines.h" -#include "bFile.h" - -#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include - - -using namespace bParse; - - -// ----------------------------------------------------- // -short ChunkUtils::swapShort(short sht) -{ - SWITCH_SHORT(sht); - return sht; -} - -// ----------------------------------------------------- // -int ChunkUtils::swapInt(int inte) -{ - SWITCH_INT(inte); - return inte; -} - -// ----------------------------------------------------- // -long64 ChunkUtils::swapLong64(long64 lng) -{ - SWITCH_LONGINT(lng); - return lng; -} - -// ----------------------------------------------------- // -int ChunkUtils::getOffset(int flags) -{ - // if the file is saved in a - // different format, get the - // file's chunk size - int res = CHUNK_HEADER_LEN; - - if (VOID_IS_8) - { - if (flags &FD_BITS_VARIES) - res = sizeof(bChunkPtr4); - } - else - { - if (flags &FD_BITS_VARIES) - res = sizeof(bChunkPtr8); - } - return res; -} - - - - - -//eof +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 "bChunk.h" +#include "bDefines.h" +#include "bFile.h" + +#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) +#include +#endif +#include + + +using namespace bParse; + + +// ----------------------------------------------------- // +short ChunkUtils::swapShort(short sht) +{ + SWITCH_SHORT(sht); + return sht; +} + +// ----------------------------------------------------- // +int ChunkUtils::swapInt(int inte) +{ + SWITCH_INT(inte); + return inte; +} + +// ----------------------------------------------------- // +long64 ChunkUtils::swapLong64(long64 lng) +{ + SWITCH_LONGINT(lng); + return lng; +} + +// ----------------------------------------------------- // +int ChunkUtils::getOffset(int flags) +{ + // if the file is saved in a + // different format, get the + // file's chunk size + int res = CHUNK_HEADER_LEN; + + if (VOID_IS_8) + { + if (flags &FD_BITS_VARIES) + res = sizeof(bChunkPtr4); + } + else + { + if (flags &FD_BITS_VARIES) + res = sizeof(bChunkPtr8); + } + return res; +} + + + + + +//eof diff --git a/Extras/Serialize/BulletFileLoader/bChunk.h b/Extras/Serialize/BulletFileLoader/bChunk.h index beadbfa6c..befb364af 100644 --- a/Extras/Serialize/BulletFileLoader/bChunk.h +++ b/Extras/Serialize/BulletFileLoader/bChunk.h @@ -1,90 +1,90 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 __BCHUNK_H__ -#define __BCHUNK_H__ - - -#if defined (_WIN32) && ! defined (__MINGW32__) - #define long64 __int64 -#else - #define long64 long long -#endif - - -namespace bParse { - - - // ----------------------------------------------------- // - class bChunkPtr4 - { - public: - bChunkPtr4(){} - int code; - int len; - union - { - int m_uniqueInt; - }; - int dna_nr; - int nr; - }; - - // ----------------------------------------------------- // - class bChunkPtr8 - { - public: - bChunkPtr8(){} - int code, len; - union - { - long64 oldPrev; - int m_uniqueInts[2]; - }; - int dna_nr, nr; - }; - - // ----------------------------------------------------- // - class bChunkInd - { - public: - bChunkInd(){} - int code, len; - void *oldPtr; - int dna_nr, nr; - }; - - - // ----------------------------------------------------- // - class ChunkUtils - { - public: - - // file chunk offset - static int getOffset(int flags); - - // endian utils - static short swapShort(short sht); - static int swapInt(int inte); - static long64 swapLong64(long64 lng); - - }; - - - const int CHUNK_HEADER_LEN = ((sizeof(bChunkInd))); - const bool VOID_IS_8 = ((sizeof(void*)==8)); -} - -#endif//__BCHUNK_H__ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 __BCHUNK_H__ +#define __BCHUNK_H__ + + +#if defined (_WIN32) && ! defined (__MINGW32__) + #define long64 __int64 +#else + #define long64 long long +#endif + + +namespace bParse { + + + // ----------------------------------------------------- // + class bChunkPtr4 + { + public: + bChunkPtr4(){} + int code; + int len; + union + { + int m_uniqueInt; + }; + int dna_nr; + int nr; + }; + + // ----------------------------------------------------- // + class bChunkPtr8 + { + public: + bChunkPtr8(){} + int code, len; + union + { + long64 oldPrev; + int m_uniqueInts[2]; + }; + int dna_nr, nr; + }; + + // ----------------------------------------------------- // + class bChunkInd + { + public: + bChunkInd(){} + int code, len; + void *oldPtr; + int dna_nr, nr; + }; + + + // ----------------------------------------------------- // + class ChunkUtils + { + public: + + // file chunk offset + static int getOffset(int flags); + + // endian utils + static short swapShort(short sht); + static int swapInt(int inte); + static long64 swapLong64(long64 lng); + + }; + + + const int CHUNK_HEADER_LEN = ((sizeof(bChunkInd))); + const bool VOID_IS_8 = ((sizeof(void*)==8)); +} + +#endif//__BCHUNK_H__ diff --git a/Extras/Serialize/BulletFileLoader/bCommon.h b/Extras/Serialize/BulletFileLoader/bCommon.h index 1a6ff816c..b01d2b899 100644 --- a/Extras/Serialize/BulletFileLoader/bCommon.h +++ b/Extras/Serialize/BulletFileLoader/bCommon.h @@ -1,39 +1,39 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 __BCOMMON_H__ -#define __BCOMMON_H__ - - -#include -//#include "bLog.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" - -namespace bParse { - - class bMain; - class bFileData; - class bFile; - class bDNA; - - // delete void* undefined - typedef struct bStructHandle {int unused;}bStructHandle; - typedef btAlignedObjectArray bListBasePtr; - typedef btHashMap bPtrMap; -} - - -#endif//__BCOMMON_H__ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 __BCOMMON_H__ +#define __BCOMMON_H__ + + +#include +//#include "bLog.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btHashMap.h" + +namespace bParse { + + class bMain; + class bFileData; + class bFile; + class bDNA; + + // delete void* undefined + typedef struct bStructHandle {int unused;}bStructHandle; + typedef btAlignedObjectArray bListBasePtr; + typedef btHashMap bPtrMap; +} + + +#endif//__BCOMMON_H__ diff --git a/Extras/Serialize/BulletFileLoader/bDNA.cpp b/Extras/Serialize/BulletFileLoader/bDNA.cpp index ef8ae362b..c72db234e 100644 --- a/Extras/Serialize/BulletFileLoader/bDNA.cpp +++ b/Extras/Serialize/BulletFileLoader/bDNA.cpp @@ -1,636 +1,636 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 "bDNA.h" -#include "bChunk.h" -#include -#include -#include - -//this define will force traversal of structures, to check backward (and forward) compatibility -//#define TEST_BACKWARD_FORWARD_COMPATIBILITY - - -using namespace bParse; - - -// ----------------------------------------------------- // -bDNA::bDNA() - : mPtrLen(0) -{ - // -- -} - -// ----------------------------------------------------- // -bDNA::~bDNA() -{ - // -- -} - -// ----------------------------------------------------- // -bool bDNA::lessThan(bDNA *file) -{ - return ( m_Names.size() < file->m_Names.size()); -} - -// ----------------------------------------------------- // -char *bDNA::getName(int ind) -{ - assert(ind <= (int)m_Names.size()); - return m_Names[ind].m_name; -} - - -// ----------------------------------------------------- // -char *bDNA::getType(int ind) -{ - assert(ind<= (int)mTypes.size()); - return mTypes[ind]; -} - - -// ----------------------------------------------------- // -short *bDNA::getStruct(int ind) -{ - assert(ind <= (int)mStructs.size()); - return mStructs[ind]; -} - - -// ----------------------------------------------------- // -short bDNA::getLength(int ind) -{ - assert(ind <= (int)mTlens.size()); - return mTlens[ind]; -} - - -// ----------------------------------------------------- // -int bDNA::getReverseType(short type) -{ - - int* intPtr = mStructReverse.find(type); - if (intPtr) - return *intPtr; - - return -1; -} - -// ----------------------------------------------------- // -int bDNA::getReverseType(const char *type) -{ - - btHashString key(type); - int* valuePtr = mTypeLookup.find(key); - if (valuePtr) - return *valuePtr; - - return -1; -} - -// ----------------------------------------------------- // -int bDNA::getNumStructs() -{ - return (int)mStructs.size(); -} - -// ----------------------------------------------------- // -bool bDNA::flagNotEqual(int dna_nr) -{ - assert(dna_nr <= (int)mCMPFlags.size()); - return mCMPFlags[dna_nr] == FDF_STRUCT_NEQU; -} - -// ----------------------------------------------------- // -bool bDNA::flagEqual(int dna_nr) -{ - assert(dna_nr <= (int)mCMPFlags.size()); - int flag = mCMPFlags[dna_nr]; - return flag == FDF_STRUCT_EQU; -} - -// ----------------------------------------------------- // -bool bDNA::flagNone(int dna_nr) -{ - assert(dna_nr <= (int)mCMPFlags.size()); - return mCMPFlags[dna_nr] == FDF_NONE; -} - -// ----------------------------------------------------- // -int bDNA::getPointerSize() -{ - return mPtrLen; -} - -// ----------------------------------------------------- // -void bDNA::initRecurseCmpFlags(int iter) -{ - // iter is FDF_STRUCT_NEQU - - short *oldStrc = mStructs[iter]; - short type = oldStrc[0]; - - for (int i=0; i<(int)mStructs.size(); i++) - { - if (i != iter && mCMPFlags[i] == FDF_STRUCT_EQU ) - { - short *curStruct = mStructs[i]; - int eleLen = curStruct[1]; - curStruct+=2; - - for (int j=0; jgetReverseType(typeName); - if (newLookup == -1) - { - mCMPFlags[i] = FDF_NONE; - continue; - } - short *curStruct = memDNA->mStructs[newLookup]; -#else - // memory for file - - if (oldLookup < memDNA->mStructs.size()) - { - short *curStruct = memDNA->mStructs[oldLookup]; -#endif - - - - // rebuild... - mCMPFlags[i] = FDF_STRUCT_NEQU; - -#ifndef TEST_BACKWARD_FORWARD_COMPATIBILITY - - if (curStruct[1] == oldStruct[1]) - { - // type len same ... - if (mTlens[oldStruct[0]] == memDNA->mTlens[curStruct[0]]) - { - bool isSame = true; - int elementLength = oldStruct[1]; - - - curStruct+=2; - oldStruct+=2; - - - for (int j=0; jmTypes[curStruct[0]])!=0) - { - isSame=false; - break; - } - - // name the same - if (strcmp(m_Names[oldStruct[1]].m_name, memDNA->m_Names[curStruct[1]].m_name)!=0) - { - isSame=false; - break; - } - } - // flag valid == - if (isSame) - mCMPFlags[i] = FDF_STRUCT_EQU; - } - } -#endif - } - } - - - - - - // recurse in - for ( i=0; i<(int)mStructs.size(); i++) - { - if (mCMPFlags[i] == FDF_STRUCT_NEQU) - initRecurseCmpFlags(i); - } -} - - - - -static int name_is_array(char* name, int* dim1, int* dim2) { - int len = strlen(name); - /*fprintf(stderr,"[%s]",name);*/ - /*if (len >= 1) { - if (name[len-1] != ']') - return 1; - } - return 0;*/ - char *bp; - int num; - if (dim1) { - *dim1 = 1; - } - if (dim2) { - *dim2 = 1; - } - bp = strchr(name, '['); - if (!bp) { - return 0; - } - num = 0; - while (++bp < name+len-1) { - const char c = *bp; - if (c == ']') { - break; - } - if (c <= '9' && c >= '0') { - num *= 10; - num += (c - '0'); - } else { - printf("array parse error.\n"); - return 0; - } - } - if (dim2) { - *dim2 = num; - } - - /* find second dim, if any. */ - bp = strchr(bp, '['); - if (!bp) { - return 1; /* at least we got the first dim. */ - } - num = 0; - while (++bp < name+len-1) { - const char c = *bp; - if (c == ']') { - break; - } - if (c <= '9' && c >= '0') { - num *= 10; - num += (c - '0'); - } else { - printf("array2 parse error.\n"); - return 1; - } - } - if (dim1) { - if (dim2) { - *dim1 = *dim2; - *dim2 = num; - } else { - *dim1 = num; - } - } - - return 1; -} - - -// ----------------------------------------------------- // -void bDNA::init(char *data, int len, bool swap) -{ - printf("swap = %d\n",swap); - int *intPtr=0;short *shtPtr=0; - char *cp = 0;int dataLen =0;long nr=0; - intPtr = (int*)data; - - /* - SDNA (4 bytes) (magic number) - NAME (4 bytes) - (4 bytes) amount of names (int) - - - */ - - if (strncmp(data, "SDNA", 4)==0) - { - // skip ++ NAME - intPtr++; intPtr++; - } - - - - // Parse names - if (swap) dataLen = ChunkUtils::swapInt(*intPtr); - else dataLen = *intPtr; - intPtr++; - - cp = (char*)intPtr; - int i; - for ( i=0; i amount of types (int) - - - */ - - intPtr = (int*)cp; - assert(strncmp(cp, "TYPE", 4)==0); intPtr++; - - if (swap) dataLen = ChunkUtils::swapInt(*intPtr); - else dataLen = *intPtr; - intPtr++; - - cp = (char*)intPtr; - for ( i=0; i (short) the lengths of types - - */ - - // Parse type lens - intPtr = (int*)cp; - assert(strncmp(cp, "TLEN", 4)==0); intPtr++; - - dataLen = (int)mTypes.size(); - - shtPtr = (short*)intPtr; - for ( i=0; i amount of structs (int) - - - - - - - */ - - intPtr = (int*)shtPtr; - cp = (char*)intPtr; - assert(strncmp(cp, "STRC", 4)==0); intPtr++; - - if (swap) dataLen = ChunkUtils::swapInt(*intPtr); - else dataLen = *intPtr; - intPtr++; - - - shtPtr = (short*)intPtr; - for ( i=0; itypes_count; ++i) { - /* if (!bf->types[i].is_struct)*/ - { - printf("%3d: sizeof(%s%s)=%d", - i, - bf->types[i].is_struct ? "struct " : "atomic ", - bf->types[i].name, bf->types[i].size); - if (bf->types[i].is_struct) { - int j; - printf(", %d fields: { ", bf->types[i].fieldtypes_count); - for (j=0; jtypes[i].fieldtypes_count; ++j) { - printf("%s %s", - bf->types[bf->types[i].fieldtypes[j]].name, - bf->names[bf->types[i].fieldnames[j]]); - if (j == bf->types[i].fieldtypes_count-1) { - printf(";}"); - } else { - printf("; "); - } - } - } - printf("\n\n"); - - } - } -#endif - -} - - - - -//eof - - +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 "bDNA.h" +#include "bChunk.h" +#include +#include +#include + +//this define will force traversal of structures, to check backward (and forward) compatibility +//#define TEST_BACKWARD_FORWARD_COMPATIBILITY + + +using namespace bParse; + + +// ----------------------------------------------------- // +bDNA::bDNA() + : mPtrLen(0) +{ + // -- +} + +// ----------------------------------------------------- // +bDNA::~bDNA() +{ + // -- +} + +// ----------------------------------------------------- // +bool bDNA::lessThan(bDNA *file) +{ + return ( m_Names.size() < file->m_Names.size()); +} + +// ----------------------------------------------------- // +char *bDNA::getName(int ind) +{ + assert(ind <= (int)m_Names.size()); + return m_Names[ind].m_name; +} + + +// ----------------------------------------------------- // +char *bDNA::getType(int ind) +{ + assert(ind<= (int)mTypes.size()); + return mTypes[ind]; +} + + +// ----------------------------------------------------- // +short *bDNA::getStruct(int ind) +{ + assert(ind <= (int)mStructs.size()); + return mStructs[ind]; +} + + +// ----------------------------------------------------- // +short bDNA::getLength(int ind) +{ + assert(ind <= (int)mTlens.size()); + return mTlens[ind]; +} + + +// ----------------------------------------------------- // +int bDNA::getReverseType(short type) +{ + + int* intPtr = mStructReverse.find(type); + if (intPtr) + return *intPtr; + + return -1; +} + +// ----------------------------------------------------- // +int bDNA::getReverseType(const char *type) +{ + + btHashString key(type); + int* valuePtr = mTypeLookup.find(key); + if (valuePtr) + return *valuePtr; + + return -1; +} + +// ----------------------------------------------------- // +int bDNA::getNumStructs() +{ + return (int)mStructs.size(); +} + +// ----------------------------------------------------- // +bool bDNA::flagNotEqual(int dna_nr) +{ + assert(dna_nr <= (int)mCMPFlags.size()); + return mCMPFlags[dna_nr] == FDF_STRUCT_NEQU; +} + +// ----------------------------------------------------- // +bool bDNA::flagEqual(int dna_nr) +{ + assert(dna_nr <= (int)mCMPFlags.size()); + int flag = mCMPFlags[dna_nr]; + return flag == FDF_STRUCT_EQU; +} + +// ----------------------------------------------------- // +bool bDNA::flagNone(int dna_nr) +{ + assert(dna_nr <= (int)mCMPFlags.size()); + return mCMPFlags[dna_nr] == FDF_NONE; +} + +// ----------------------------------------------------- // +int bDNA::getPointerSize() +{ + return mPtrLen; +} + +// ----------------------------------------------------- // +void bDNA::initRecurseCmpFlags(int iter) +{ + // iter is FDF_STRUCT_NEQU + + short *oldStrc = mStructs[iter]; + short type = oldStrc[0]; + + for (int i=0; i<(int)mStructs.size(); i++) + { + if (i != iter && mCMPFlags[i] == FDF_STRUCT_EQU ) + { + short *curStruct = mStructs[i]; + int eleLen = curStruct[1]; + curStruct+=2; + + for (int j=0; jgetReverseType(typeName); + if (newLookup == -1) + { + mCMPFlags[i] = FDF_NONE; + continue; + } + short *curStruct = memDNA->mStructs[newLookup]; +#else + // memory for file + + if (oldLookup < memDNA->mStructs.size()) + { + short *curStruct = memDNA->mStructs[oldLookup]; +#endif + + + + // rebuild... + mCMPFlags[i] = FDF_STRUCT_NEQU; + +#ifndef TEST_BACKWARD_FORWARD_COMPATIBILITY + + if (curStruct[1] == oldStruct[1]) + { + // type len same ... + if (mTlens[oldStruct[0]] == memDNA->mTlens[curStruct[0]]) + { + bool isSame = true; + int elementLength = oldStruct[1]; + + + curStruct+=2; + oldStruct+=2; + + + for (int j=0; jmTypes[curStruct[0]])!=0) + { + isSame=false; + break; + } + + // name the same + if (strcmp(m_Names[oldStruct[1]].m_name, memDNA->m_Names[curStruct[1]].m_name)!=0) + { + isSame=false; + break; + } + } + // flag valid == + if (isSame) + mCMPFlags[i] = FDF_STRUCT_EQU; + } + } +#endif + } + } + + + + + + // recurse in + for ( i=0; i<(int)mStructs.size(); i++) + { + if (mCMPFlags[i] == FDF_STRUCT_NEQU) + initRecurseCmpFlags(i); + } +} + + + + +static int name_is_array(char* name, int* dim1, int* dim2) { + int len = strlen(name); + /*fprintf(stderr,"[%s]",name);*/ + /*if (len >= 1) { + if (name[len-1] != ']') + return 1; + } + return 0;*/ + char *bp; + int num; + if (dim1) { + *dim1 = 1; + } + if (dim2) { + *dim2 = 1; + } + bp = strchr(name, '['); + if (!bp) { + return 0; + } + num = 0; + while (++bp < name+len-1) { + const char c = *bp; + if (c == ']') { + break; + } + if (c <= '9' && c >= '0') { + num *= 10; + num += (c - '0'); + } else { + printf("array parse error.\n"); + return 0; + } + } + if (dim2) { + *dim2 = num; + } + + /* find second dim, if any. */ + bp = strchr(bp, '['); + if (!bp) { + return 1; /* at least we got the first dim. */ + } + num = 0; + while (++bp < name+len-1) { + const char c = *bp; + if (c == ']') { + break; + } + if (c <= '9' && c >= '0') { + num *= 10; + num += (c - '0'); + } else { + printf("array2 parse error.\n"); + return 1; + } + } + if (dim1) { + if (dim2) { + *dim1 = *dim2; + *dim2 = num; + } else { + *dim1 = num; + } + } + + return 1; +} + + +// ----------------------------------------------------- // +void bDNA::init(char *data, int len, bool swap) +{ + printf("swap = %d\n",swap); + int *intPtr=0;short *shtPtr=0; + char *cp = 0;int dataLen =0;long nr=0; + intPtr = (int*)data; + + /* + SDNA (4 bytes) (magic number) + NAME (4 bytes) + (4 bytes) amount of names (int) + + + */ + + if (strncmp(data, "SDNA", 4)==0) + { + // skip ++ NAME + intPtr++; intPtr++; + } + + + + // Parse names + if (swap) dataLen = ChunkUtils::swapInt(*intPtr); + else dataLen = *intPtr; + intPtr++; + + cp = (char*)intPtr; + int i; + for ( i=0; i amount of types (int) + + + */ + + intPtr = (int*)cp; + assert(strncmp(cp, "TYPE", 4)==0); intPtr++; + + if (swap) dataLen = ChunkUtils::swapInt(*intPtr); + else dataLen = *intPtr; + intPtr++; + + cp = (char*)intPtr; + for ( i=0; i (short) the lengths of types + + */ + + // Parse type lens + intPtr = (int*)cp; + assert(strncmp(cp, "TLEN", 4)==0); intPtr++; + + dataLen = (int)mTypes.size(); + + shtPtr = (short*)intPtr; + for ( i=0; i amount of structs (int) + + + + + + + */ + + intPtr = (int*)shtPtr; + cp = (char*)intPtr; + assert(strncmp(cp, "STRC", 4)==0); intPtr++; + + if (swap) dataLen = ChunkUtils::swapInt(*intPtr); + else dataLen = *intPtr; + intPtr++; + + + shtPtr = (short*)intPtr; + for ( i=0; itypes_count; ++i) { + /* if (!bf->types[i].is_struct)*/ + { + printf("%3d: sizeof(%s%s)=%d", + i, + bf->types[i].is_struct ? "struct " : "atomic ", + bf->types[i].name, bf->types[i].size); + if (bf->types[i].is_struct) { + int j; + printf(", %d fields: { ", bf->types[i].fieldtypes_count); + for (j=0; jtypes[i].fieldtypes_count; ++j) { + printf("%s %s", + bf->types[bf->types[i].fieldtypes[j]].name, + bf->names[bf->types[i].fieldnames[j]]); + if (j == bf->types[i].fieldtypes_count-1) { + printf(";}"); + } else { + printf("; "); + } + } + } + printf("\n\n"); + + } + } +#endif + +} + + + + +//eof + + diff --git a/Extras/Serialize/BulletFileLoader/bDNA.h b/Extras/Serialize/BulletFileLoader/bDNA.h index db0df64eb..691080bf5 100644 --- a/Extras/Serialize/BulletFileLoader/bDNA.h +++ b/Extras/Serialize/BulletFileLoader/bDNA.h @@ -1,110 +1,110 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 __BDNA_H__ -#define __BDNA_H__ - - -#include "bCommon.h" - -namespace bParse { - - struct bNameInfo - { - char* m_name; - bool m_isPointer; - int m_dim0; - int m_dim1; - }; - - class bDNA - { - public: - bDNA(); - ~bDNA(); - - void init(char *data, int len, bool swap=false); - - int getArraySize(char* str); - int getArraySizeNew(short name) - { - const bNameInfo& nameInfo = m_Names[name]; - return nameInfo.m_dim0*nameInfo.m_dim1; - } - int getElementSize(short type, short name) - { - const bNameInfo& nameInfo = m_Names[name]; - int size = nameInfo.m_isPointer ? mPtrLen*nameInfo.m_dim0*nameInfo.m_dim1 : mTlens[type]*nameInfo.m_dim0*nameInfo.m_dim1; - return size; - } - - int getNumNames() const - { - return m_Names.size(); - } - - char *getName(int ind); - char *getType(int ind); - short *getStruct(int ind); - short getLength(int ind); - int getReverseType(short type); - int getReverseType(const char *type); - - - int getNumStructs(); - - // - bool lessThan(bDNA* other); - - void initCmpFlags(bDNA *memDNA); - bool flagNotEqual(int dna_nr); - bool flagEqual(int dna_nr); - bool flagNone(int dna_nr); - - - int getPointerSize(); - - void dumpTypeDefinitions(); - - - private: - enum FileDNAFlags - { - FDF_NONE=0, - FDF_STRUCT_NEQU, - FDF_STRUCT_EQU - }; - - void initRecurseCmpFlags(int i); - - btAlignedObjectArray mCMPFlags; - - btAlignedObjectArray m_Names; - btAlignedObjectArray mTypes; - btAlignedObjectArray mStructs; - btAlignedObjectArray mTlens; - btHashMap mStructReverse; - btHashMap mTypeLookup; - - int mPtrLen; - - - - - }; -} - - -#endif//__BDNA_H__ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 __BDNA_H__ +#define __BDNA_H__ + + +#include "bCommon.h" + +namespace bParse { + + struct bNameInfo + { + char* m_name; + bool m_isPointer; + int m_dim0; + int m_dim1; + }; + + class bDNA + { + public: + bDNA(); + ~bDNA(); + + void init(char *data, int len, bool swap=false); + + int getArraySize(char* str); + int getArraySizeNew(short name) + { + const bNameInfo& nameInfo = m_Names[name]; + return nameInfo.m_dim0*nameInfo.m_dim1; + } + int getElementSize(short type, short name) + { + const bNameInfo& nameInfo = m_Names[name]; + int size = nameInfo.m_isPointer ? mPtrLen*nameInfo.m_dim0*nameInfo.m_dim1 : mTlens[type]*nameInfo.m_dim0*nameInfo.m_dim1; + return size; + } + + int getNumNames() const + { + return m_Names.size(); + } + + char *getName(int ind); + char *getType(int ind); + short *getStruct(int ind); + short getLength(int ind); + int getReverseType(short type); + int getReverseType(const char *type); + + + int getNumStructs(); + + // + bool lessThan(bDNA* other); + + void initCmpFlags(bDNA *memDNA); + bool flagNotEqual(int dna_nr); + bool flagEqual(int dna_nr); + bool flagNone(int dna_nr); + + + int getPointerSize(); + + void dumpTypeDefinitions(); + + + private: + enum FileDNAFlags + { + FDF_NONE=0, + FDF_STRUCT_NEQU, + FDF_STRUCT_EQU + }; + + void initRecurseCmpFlags(int i); + + btAlignedObjectArray mCMPFlags; + + btAlignedObjectArray m_Names; + btAlignedObjectArray mTypes; + btAlignedObjectArray mStructs; + btAlignedObjectArray mTlens; + btHashMap mStructReverse; + btHashMap mTypeLookup; + + int mPtrLen; + + + + + }; +} + + +#endif//__BDNA_H__ diff --git a/Extras/Serialize/BulletFileLoader/bDefines.h b/Extras/Serialize/BulletFileLoader/bDefines.h index dc221ff9e..238df7d4b 100644 --- a/Extras/Serialize/BulletFileLoader/bDefines.h +++ b/Extras/Serialize/BulletFileLoader/bDefines.h @@ -1,140 +1,140 @@ -/* Copyright (C) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com -* -* 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 __B_DEFINES_H__ -#define __B_DEFINES_H__ - - -// MISC defines, see BKE_global.h, BKE_utildefines.h -#define SIZEOFBLENDERHEADER 12 - - -// ------------------------------------------------------------ -#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) -# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) -#else -# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) -#endif - - -// ------------------------------------------------------------ -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) -# define MAKE_ID2(c, d) ( (c)<<8 | (d) ) -# define MOST_SIG_BYTE 0 -# define BBIG_ENDIAN -#else -# define MAKE_ID2(c, d) ( (d)<<8 | (c) ) -# define MOST_SIG_BYTE 1 -# define BLITTLE_ENDIAN -#endif - -// ------------------------------------------------------------ -#define ID_SCE MAKE_ID2('S', 'C') -#define ID_LI MAKE_ID2('L', 'I') -#define ID_OB MAKE_ID2('O', 'B') -#define ID_ME MAKE_ID2('M', 'E') -#define ID_CU MAKE_ID2('C', 'U') -#define ID_MB MAKE_ID2('M', 'B') -#define ID_MA MAKE_ID2('M', 'A') -#define ID_TE MAKE_ID2('T', 'E') -#define ID_IM MAKE_ID2('I', 'M') -#define ID_IK MAKE_ID2('I', 'K') -#define ID_WV MAKE_ID2('W', 'V') -#define ID_LT MAKE_ID2('L', 'T') -#define ID_SE MAKE_ID2('S', 'E') -#define ID_LF MAKE_ID2('L', 'F') -#define ID_LA MAKE_ID2('L', 'A') -#define ID_CA MAKE_ID2('C', 'A') -#define ID_IP MAKE_ID2('I', 'P') -#define ID_KE MAKE_ID2('K', 'E') -#define ID_WO MAKE_ID2('W', 'O') -#define ID_SCR MAKE_ID2('S', 'R') -#define ID_VF MAKE_ID2('V', 'F') -#define ID_TXT MAKE_ID2('T', 'X') -#define ID_SO MAKE_ID2('S', 'O') -#define ID_SAMPLE MAKE_ID2('S', 'A') -#define ID_GR MAKE_ID2('G', 'R') -#define ID_ID MAKE_ID2('I', 'D') -#define ID_AR MAKE_ID2('A', 'R') -#define ID_AC MAKE_ID2('A', 'C') -#define ID_SCRIPT MAKE_ID2('P', 'Y') -#define ID_FLUIDSIM MAKE_ID2('F', 'S') -#define ID_NT MAKE_ID2('N', 'T') -#define ID_BR MAKE_ID2('B', 'R') - - -#define ID_SEQ MAKE_ID2('S', 'Q') -#define ID_CO MAKE_ID2('C', 'O') -#define ID_PO MAKE_ID2('A', 'C') -#define ID_NLA MAKE_ID2('N', 'L') - -#define ID_VS MAKE_ID2('V', 'S') -#define ID_VN MAKE_ID2('V', 'N') - - -// ------------------------------------------------------------ -#define FORM MAKE_ID('F','O','R','M') -#define DDG1 MAKE_ID('3','D','G','1') -#define DDG2 MAKE_ID('3','D','G','2') -#define DDG3 MAKE_ID('3','D','G','3') -#define DDG4 MAKE_ID('3','D','G','4') -#define GOUR MAKE_ID('G','O','U','R') -#define BLEN MAKE_ID('B','L','E','N') -#define DER_ MAKE_ID('D','E','R','_') -#define V100 MAKE_ID('V','1','0','0') -#define DATA MAKE_ID('D','A','T','A') -#define GLOB MAKE_ID('G','L','O','B') -#define IMAG MAKE_ID('I','M','A','G') -#define TEST MAKE_ID('T','E','S','T') -#define USER MAKE_ID('U','S','E','R') - - -// ------------------------------------------------------------ -#define DNA1 MAKE_ID('D','N','A','1') -#define REND MAKE_ID('R','E','N','D') -#define ENDB MAKE_ID('E','N','D','B') -#define NAME MAKE_ID('N','A','M','E') -#define SDNA MAKE_ID('S','D','N','A') -#define TYPE MAKE_ID('T','Y','P','E') -#define TLEN MAKE_ID('T','L','E','N') -#define STRC MAKE_ID('S','T','R','C') - - -// ------------------------------------------------------------ -#define SWITCH_INT(a) { \ - char s_i, *p_i; \ - p_i= (char *)&(a); \ - s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \ - s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; } - -// ------------------------------------------------------------ -#define SWITCH_SHORT(a) { \ - char s_i, *p_i; \ - p_i= (char *)&(a); \ - s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; } - -// ------------------------------------------------------------ -#define SWITCH_LONGINT(a) { \ - char s_i, *p_i; \ - p_i= (char *)&(a); \ - s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ - s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ - s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ - s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } - -#endif//__B_DEFINES_H__ +/* Copyright (C) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com +* +* 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 __B_DEFINES_H__ +#define __B_DEFINES_H__ + + +// MISC defines, see BKE_global.h, BKE_utildefines.h +#define SIZEOFBLENDERHEADER 12 + + +// ------------------------------------------------------------ +#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) +# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) +#else +# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) +#endif + + +// ------------------------------------------------------------ +#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) +# define MAKE_ID2(c, d) ( (c)<<8 | (d) ) +# define MOST_SIG_BYTE 0 +# define BBIG_ENDIAN +#else +# define MAKE_ID2(c, d) ( (d)<<8 | (c) ) +# define MOST_SIG_BYTE 1 +# define BLITTLE_ENDIAN +#endif + +// ------------------------------------------------------------ +#define ID_SCE MAKE_ID2('S', 'C') +#define ID_LI MAKE_ID2('L', 'I') +#define ID_OB MAKE_ID2('O', 'B') +#define ID_ME MAKE_ID2('M', 'E') +#define ID_CU MAKE_ID2('C', 'U') +#define ID_MB MAKE_ID2('M', 'B') +#define ID_MA MAKE_ID2('M', 'A') +#define ID_TE MAKE_ID2('T', 'E') +#define ID_IM MAKE_ID2('I', 'M') +#define ID_IK MAKE_ID2('I', 'K') +#define ID_WV MAKE_ID2('W', 'V') +#define ID_LT MAKE_ID2('L', 'T') +#define ID_SE MAKE_ID2('S', 'E') +#define ID_LF MAKE_ID2('L', 'F') +#define ID_LA MAKE_ID2('L', 'A') +#define ID_CA MAKE_ID2('C', 'A') +#define ID_IP MAKE_ID2('I', 'P') +#define ID_KE MAKE_ID2('K', 'E') +#define ID_WO MAKE_ID2('W', 'O') +#define ID_SCR MAKE_ID2('S', 'R') +#define ID_VF MAKE_ID2('V', 'F') +#define ID_TXT MAKE_ID2('T', 'X') +#define ID_SO MAKE_ID2('S', 'O') +#define ID_SAMPLE MAKE_ID2('S', 'A') +#define ID_GR MAKE_ID2('G', 'R') +#define ID_ID MAKE_ID2('I', 'D') +#define ID_AR MAKE_ID2('A', 'R') +#define ID_AC MAKE_ID2('A', 'C') +#define ID_SCRIPT MAKE_ID2('P', 'Y') +#define ID_FLUIDSIM MAKE_ID2('F', 'S') +#define ID_NT MAKE_ID2('N', 'T') +#define ID_BR MAKE_ID2('B', 'R') + + +#define ID_SEQ MAKE_ID2('S', 'Q') +#define ID_CO MAKE_ID2('C', 'O') +#define ID_PO MAKE_ID2('A', 'C') +#define ID_NLA MAKE_ID2('N', 'L') + +#define ID_VS MAKE_ID2('V', 'S') +#define ID_VN MAKE_ID2('V', 'N') + + +// ------------------------------------------------------------ +#define FORM MAKE_ID('F','O','R','M') +#define DDG1 MAKE_ID('3','D','G','1') +#define DDG2 MAKE_ID('3','D','G','2') +#define DDG3 MAKE_ID('3','D','G','3') +#define DDG4 MAKE_ID('3','D','G','4') +#define GOUR MAKE_ID('G','O','U','R') +#define BLEN MAKE_ID('B','L','E','N') +#define DER_ MAKE_ID('D','E','R','_') +#define V100 MAKE_ID('V','1','0','0') +#define DATA MAKE_ID('D','A','T','A') +#define GLOB MAKE_ID('G','L','O','B') +#define IMAG MAKE_ID('I','M','A','G') +#define TEST MAKE_ID('T','E','S','T') +#define USER MAKE_ID('U','S','E','R') + + +// ------------------------------------------------------------ +#define DNA1 MAKE_ID('D','N','A','1') +#define REND MAKE_ID('R','E','N','D') +#define ENDB MAKE_ID('E','N','D','B') +#define NAME MAKE_ID('N','A','M','E') +#define SDNA MAKE_ID('S','D','N','A') +#define TYPE MAKE_ID('T','Y','P','E') +#define TLEN MAKE_ID('T','L','E','N') +#define STRC MAKE_ID('S','T','R','C') + + +// ------------------------------------------------------------ +#define SWITCH_INT(a) { \ + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \ + s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; } + +// ------------------------------------------------------------ +#define SWITCH_SHORT(a) { \ + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; } + +// ------------------------------------------------------------ +#define SWITCH_LONGINT(a) { \ + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ + s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ + s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ + s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } + +#endif//__B_DEFINES_H__ diff --git a/Extras/Serialize/BulletFileLoader/bFile.cpp b/Extras/Serialize/BulletFileLoader/bFile.cpp index 7c603c018..4a819cab2 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.cpp +++ b/Extras/Serialize/BulletFileLoader/bFile.cpp @@ -1,1322 +1,1322 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 "bFile.h" -#include "bCommon.h" -#include "bChunk.h" -#include "bDNA.h" -#include -#include -#include -#include "bDefines.h" -#include "LinearMath/btSerializer.h" - -#define SIZEOFBLENDERHEADER 12 -#define MAX_ARRAY_LENGTH 512 -using namespace bParse; - - - -int numallocs = 0; - -// ----------------------------------------------------- // -bFile::bFile(const char *filename, const char headerString[7]) - : mOwnsBuffer(true), - mFileBuffer(0), - mFileLen(0), - mVersion(0), - mDataStart(0), - mFileDNA(0), - mMemoryDNA(0), - mFlags(FD_INVALID) -{ - for (int i=0;i<7;i++) - { - m_headerString[i] = headerString[i]; - } - - FILE *fp = fopen(filename, "rb"); - if (fp) - { - fseek(fp, 0L, SEEK_END); - mFileLen = ftell(fp); - fseek(fp, 0L, SEEK_SET); - - mFileBuffer = (char*)malloc(mFileLen+1); - fread(mFileBuffer, mFileLen, 1, fp); - - fclose(fp); - - // - parseHeader(); - - } -} - -// ----------------------------------------------------- // -bFile::bFile( char *memoryBuffer, int len, const char headerString[7]) -: mOwnsBuffer(false), - mFileBuffer(0), - mFileLen(0), - mVersion(0), - mDataStart(0), - mFileDNA(0), - mMemoryDNA(0), - mFlags(FD_INVALID) -{ - for (int i=0;i<7;i++) - { - m_headerString[i] = headerString[i]; - } - mFileBuffer = memoryBuffer; - mFileLen = len; - - parseHeader(); - -} - - -// ----------------------------------------------------- // -bFile::~bFile() -{ - if (mOwnsBuffer && mFileBuffer) - { - free(mFileBuffer); - mFileBuffer = 0; - } - - - delete mMemoryDNA; - delete mFileDNA; -} - - - - - -// ----------------------------------------------------- // -void bFile::parseHeader() -{ - char *blenderBuf = mFileBuffer; - char header[SIZEOFBLENDERHEADER+1] ; - memcpy(header, blenderBuf, SIZEOFBLENDERHEADER); - header[SIZEOFBLENDERHEADER]='\0'; - - if (strncmp(header, m_headerString, 6)!=0) - { - memcpy(header, m_headerString, SIZEOFBLENDERHEADER); - printf ("Invalid %s file...",header); - return; - } - - if (header[6] == 'd') - { - mFlags |= FD_DOUBLE_PRECISION; - } - - char *ver = header+9; - mVersion = atoi(ver); - if (mVersion <= 241) - printf ("Warning, %d not fully tested : <= 242\n", mVersion); - - - int littleEndian= 1; - littleEndian= ((char*)&littleEndian)[0]; - - // swap ptr sizes... - if (header[7]=='-') - { - mFlags |= FD_FILE_64; - if (!VOID_IS_8) - mFlags |= FD_BITS_VARIES; - } - else if (VOID_IS_8) mFlags |= FD_BITS_VARIES; - - // swap endian... - if (header[8]=='V') - { - if (littleEndian ==1) - mFlags |= FD_ENDIAN_SWAP; - } - else - if (littleEndian==0) - mFlags |= FD_ENDIAN_SWAP; - - - printf ("%s\n",header); - printf ("\nsizeof(void*) == %d\n",int(sizeof(void*))); - const char* endStr = ((mFlags & FD_ENDIAN_SWAP)!=0) ? "yes" : "no"; - printf ("Swapping endian? %s\n",endStr); - const char* bitStr = (mFlags &FD_FILE_64)!=0 ? "64 bit" : "32bit"; - printf ("File format is %s\n",bitStr); - const char* varStr = (mFlags & FD_BITS_VARIES)!=0 ? "yes" : "no"; - printf ("Varing pointer sizes? %s\n",varStr); - - - mFlags |= FD_OK; -} - -// ----------------------------------------------------- // -bool bFile::ok() -{ - return (mFlags &FD_OK)!=0; -} - -// ----------------------------------------------------- // -void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLength) -{ - if ( (mFlags &FD_OK) ==0) - return; - - char *blenderData = mFileBuffer; - int sdnaPos=0; - - char *tempBuffer = blenderData; - for (int i=0; iinit(blenderData+sdnaPos, mFileLen-sdnaPos, (mFlags & FD_ENDIAN_SWAP)!=0); - - if (mVersion==276) - { - int i; - for (i=0;igetNumNames();i++) - { - if (strcmp(mFileDNA->getName(i),"int")==0) - { - mFlags |= FD_BROKEN_DNA; - } - } - if ((mFlags&FD_BROKEN_DNA)!=0) - { - printf("warning: fixing some broken DNA version\n"); - } - } - - - - if (verboseDumpAllTypes) - { - mFileDNA->dumpTypeDefinitions(); - } - - mMemoryDNA = new bDNA(); - int littleEndian= 1; - littleEndian= ((char*)&littleEndian)[0]; - - mMemoryDNA->init(memDna,memDnaLength,littleEndian==0); - - - - - ///@todo we need a better version check, add version/sub version info from FileGlobal into memory DNA/header files - if (mMemoryDNA->getNumNames() != mFileDNA->getNumNames()) - { - mFlags |= FD_VERSION_VARIES; - printf ("Warning, file DNA is different than built in, performance is reduced. Best to re-export file with a matching version/platform"); - } - - // as long as it kept up to date it will be ok!! - if (mMemoryDNA->lessThan(mFileDNA)) - { - printf ("Warning, file DNA is newer than built in."); - } - - mFileDNA->initCmpFlags(mMemoryDNA); - - parseData(); - - resolvePointers(verboseDumpAllTypes);//verboseDumpAllBlocks); - - updateOldPointers(); - - printf("numAllocs = %d\n",numallocs); -} - - - -// ----------------------------------------------------- // -void bFile::swap(char *head, bChunkInd& dataChunk) -{ - char *data = head; - short *strc = mFileDNA->getStruct(dataChunk.dna_nr); - int len = mFileDNA->getLength(strc[0]); - - for (int i=0; iflagEqual(dataChunk.dna_nr)) - { - // Ouch! need to rebuild the struct - short *oldStruct,*curStruct; - char *oldType, *newType; - int oldLen, curLen, reverseOld; - - - oldStruct = mFileDNA->getStruct(dataChunk.dna_nr); - oldType = mFileDNA->getType(oldStruct[0]); - oldLen = mFileDNA->getLength(oldStruct[0]); - - if ((mFlags&FD_BROKEN_DNA)!=0) - { - if ((strcmp(oldType,"btQuantizedBvhNodeData")==0)&&oldLen==20) - { - return 0; - } - if ((strcmp(oldType,"btShortIntIndexData")==0)) - { - int allocLen = 2; - char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; - memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1); - short* dest = (short*) dataAlloc; - const short* src = (short*) head; - for (int i=0;igetReverseType(oldType); - - if ((reverseOld!=-1)) - { - // make sure it's here - //assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!"); - - // - curStruct = mMemoryDNA->getStruct(reverseOld); - newType = mMemoryDNA->getType(curStruct[0]); - curLen = mMemoryDNA->getLength(curStruct[0]); - - - - // make sure it's the same - assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!"); - - - numallocs++; - // numBlocks * length - int allocLen = curLen > oldLen ? curLen : oldLen; - char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; - memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1); - - // track allocated - addDataBlock(dataAlloc); - - char *cur = dataAlloc; - char *old = head; - for (int block=0; blockgetStruct(dataChunk.dna_nr); - oldType = mFileDNA->getType(oldStruct[0]); - printf("%s equal structure, just memcpy\n",oldType); -#endif // - } - - - char *dataAlloc = new char[(dataChunk.len)+1]; - memset(dataAlloc, 0, dataChunk.len+1); - - - // track allocated - addDataBlock(dataAlloc); - - memcpy(dataAlloc, head, dataChunk.len); - return dataAlloc; - -} - - -// ----------------------------------------------------- // -void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers) -{ - if (old_dna == -1) return; - if (new_dna == -1) return; - - //disable this, because we need to fixup pointers/ListBase - if (0)//mFileDNA->flagEqual(old_dna)) - { - short *strc = mFileDNA->getStruct(old_dna); - int len = mFileDNA->getLength(strc[0]); - - memcpy(strcPtr, dtPtr, len); - return; - } - - // Ok, now build the struct - char *memType, *memName, *cpc, *cpo; - short *fileStruct, *filePtrOld, *memoryStruct, *firstStruct; - int elementLength, size, revType, old_nr, new_nr, fpLen; - short firstStructType; - - - // File to memory lookup - memoryStruct = mMemoryDNA->getStruct(new_dna); - fileStruct = mFileDNA->getStruct(old_dna); - firstStruct = fileStruct; - - - filePtrOld = fileStruct; - firstStructType = mMemoryDNA->getStruct(0)[0]; - - // Get number of elements - elementLength = memoryStruct[1]; - memoryStruct+=2; - - cpc = strcPtr; cpo = 0; - for (int ele=0; elegetType(memoryStruct[0]); - memName = mMemoryDNA->getName(memoryStruct[1]); - - - size = mMemoryDNA->getElementSize(memoryStruct[0], memoryStruct[1]); - revType = mMemoryDNA->getReverseType(memoryStruct[0]); - - if (revType != -1 && memoryStruct[0]>=firstStructType && memName[0] != '*') - { - cpo = getFileElement(firstStruct, memName, memType, dtPtr, &filePtrOld); - if (cpo) - { - int arrayLen = mFileDNA->getArraySizeNew(filePtrOld[1]); - old_nr = mFileDNA->getReverseType(memType); - new_nr = revType; - fpLen = mFileDNA->getElementSize(filePtrOld[0], filePtrOld[1]); - if (arrayLen==1) - { - parseStruct(cpc, cpo, old_nr, new_nr,fixupPointers); - } else - { - char* tmpCpc = cpc; - char* tmpCpo = cpo; - - for (int i=0;i3 && type <8) - { - char c; - char *cp = data; - for (int i=0; igetPointerSize(); - int ptrMem = mMemoryDNA->getPointerSize(); - - if (!src && !dst) - return; - - - if (ptrFile == ptrMem) - { - memcpy(dst, src, ptrMem); - } - else if (ptrMem==4 && ptrFile==8) - { - btPointerUid* oldPtr = (btPointerUid*)src; - btPointerUid* newPtr = (btPointerUid*)dst; - - if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1]) - { - //Bullet stores the 32bit unique ID in both upper and lower part of 64bit pointers - //so it can be used to distinguish between .blend and .bullet - newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0]; - } else - { - //deal with pointers the Blender .blend style way, see - //readfile.c in the Blender source tree - long64 longValue = *((long64*)src); - //endian swap for 64bit pointer otherwise truncation will fail due to trailing zeros - if (mFlags & FD_ENDIAN_SWAP) - SWITCH_LONGINT(longValue); - *((int*)dst) = (int)(longValue>>3); - } - - } - else if (ptrMem==8 && ptrFile==4) - { - btPointerUid* oldPtr = (btPointerUid*)src; - btPointerUid* newPtr = (btPointerUid*)dst; - if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1]) - { - newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0]; - newPtr->m_uniqueIds[1] = 0; - } else - { - *((long64*)dst)= *((int*)src); - } - } - else - { - printf ("%d %d\n", ptrFile,ptrMem); - assert(0 && "Invalid pointer len"); - } - - -} - - -// ----------------------------------------------------- // -void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers) -{ - // find the matching memory dna data - // to the file being loaded. Fill the - // memory with the file data... - - int len = dna_addr[1]; - dna_addr+=2; - - for (int i=0; igetType(dna_addr[0]); - const char* name = mFileDNA->getName(dna_addr[1]); - - - - int eleLen = mFileDNA->getElementSize(dna_addr[0], dna_addr[1]); - - if ((mFlags&FD_BROKEN_DNA)!=0) - { - if ((strcmp(type,"short")==0)&&(strcmp(name,"int")==0)) - { - eleLen = 0; - } - } - - if (strcmp(lookupName, name)==0) - { - //int arrayLenold = mFileDNA->getArraySize((char*)name.c_str()); - int arrayLen = mFileDNA->getArraySizeNew(dna_addr[1]); - //assert(arrayLenold == arrayLen); - - if (name[0] == '*') - { - // cast pointers - int ptrFile = mFileDNA->getPointerSize(); - int ptrMem = mMemoryDNA->getPointerSize(); - safeSwapPtr(strcData,data); - - if (fixupPointers) - { - if (arrayLen > 1) - { - //void **sarray = (void**)strcData; - //void **darray = (void**)data; - - char *cpc, *cpo; - cpc = (char*)strcData; - cpo = (char*)data; - - for (int a=0; agetStruct(old_nr); - int elementLength = old[1]; - old+=2; - - for (int i=0; igetType(old[0]); - char* name = mFileDNA->getName(old[1]); - int len = mFileDNA->getElementSize(old[0], old[1]); - - if (strcmp(lookupName, name)==0) - { - if (strcmp(type, lookupType)==0) - { - if (foundPos) - *foundPos = old; - return data; - } - return 0; - } - data+=len; - } - return 0; -} - - -// ----------------------------------------------------- // -void bFile::swapStruct(int dna_nr, char *data) -{ - if (dna_nr == -1) return; - - short *strc = mFileDNA->getStruct(dna_nr); - //short *firstStrc = strc; - - int elementLen= strc[1]; - strc+=2; - - short first = mFileDNA->getStruct(0)[0]; - - char *buf = data; - for (int i=0; igetType(strc[0]); - char *name = mFileDNA->getName(strc[1]); - - int size = mFileDNA->getElementSize(strc[0], strc[1]); - if (strc[0] >= first && name[0]!='*') - { - int old_nr = mFileDNA->getReverseType(type); - int arrayLen = mFileDNA->getArraySizeNew(strc[1]); - if (arrayLen==1) - { - swapStruct(old_nr,buf); - } else - { - char* tmpBuf = buf; - for (int i=0;igetArraySize(name); - int arrayLen = mFileDNA->getArraySizeNew(strc[1]); - //assert(arrayLenOld == arrayLen); - swapData(buf, strc[0], arrayLen); - } - buf+=size; - } -} - - - -void bFile::resolvePointersMismatch() -{ -// printf("resolvePointersStructMismatch\n"); - - int i; - - for (i=0;i< m_pointerFixupArray.size();i++) - { - char* cur = m_pointerFixupArray.at(i); - void** ptrptr = (void**) cur; - void* ptr = *ptrptr; - ptr = findLibPointer(ptr); - if (ptr) - { - //printf("Fixup pointer!\n"); - *(ptrptr) = ptr; - } else - { -// printf("pointer not found: %x\n",cur); - } - } - for (i=0;i< m_pointerPtrFixupArray.size();i++) - { - char* cur= m_pointerPtrFixupArray.at(i); - void** ptrptr = (void**)cur; - void *ptr = findLibPointer(*ptrptr); - if (ptr) - { - (*ptrptr) = ptr; - - void **array= (void**)(*(ptrptr)); - //int ptrMem = mMemoryDNA->getPointerSize(); - int ptrFile = mFileDNA->getPointerSize(); - - int n=0; - void *lookup = array[n]; - - if (lookup) - { - char *oldPtr = (char*)array; - btAlignedObjectArray pointers; - - while(lookup) - { - btPointerUid dp = {0}; - safeSwapPtr((char*)dp.m_uniqueIds, (char*)(oldPtr + (n * ptrFile))); - - lookup = findLibPointer(dp.m_ptr); - if (!lookup) break; - - pointers.push_back(dp); - ++n; - } - - for (int j=0; jgetStruct(dataChunk.dna_nr); - short oldLen = fileDna->getLength(oldStruct[0]); - //char* structType = fileDna->getType(oldStruct[0]); - - char* cur = (char*)findLibPointer(dataChunk.oldPtr); - for (int block=0; blockgetStruct(0)[0]; - - - char* elemPtr= strcPtr; - - short int* oldStruct = fileDna->getStruct(dna_nr); - - int elementLength = oldStruct[1]; - oldStruct+=2; - - - for (int ele=0; elegetType(oldStruct[0]); - memName = fileDna->getName(oldStruct[1]); - - - - int arrayLen = fileDna->getArraySizeNew(oldStruct[1]); - if (memName[0] == '*') - { - if (arrayLen > 1) - { - void **array= (void**)elemPtr; - for (int a=0; agetReverseType(oldStruct[0]); - if (oldStruct[0]>=firstStructType) //revType != -1 && - { - if (verboseDumpAllBlocks) - { - for (int i=0;i\n",memName,memType); - } - resolvePointersStructRecursive(elemPtr,revType, verboseDumpAllBlocks,recursion+1); - if (verboseDumpAllBlocks) - { - for (int i=0;i\n",memName); - } - } else - { - //export a simple type - if (verboseDumpAllBlocks) - { - - if (arrayLen>MAX_ARRAY_LENGTH) - { - printf("too long\n"); - } else - { - //printf("%s %s\n",memType,memName); - - bool isIntegerType = (strcmp(memType,"char")==0) || (strcmp(memType,"int")==0) || (strcmp(memType,"short")==0); - - if (isIntegerType) - { - const char* newtype="int"; - int dbarray[MAX_ARRAY_LENGTH]; - int* dbPtr = 0; - char* tmp = elemPtr; - dbPtr = &dbarray[0]; - if (dbPtr) - { - int i; - getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); - for (i=0;i",memName,memType); - else - printf("<%s type=\"%s\" count=%d>",memName,memType,arrayLen); - for (i=0;i\n",memName); - } - } else - { - const char* newtype="double"; - double dbarray[MAX_ARRAY_LENGTH]; - double* dbPtr = 0; - char* tmp = elemPtr; - dbPtr = &dbarray[0]; - if (dbPtr) - { - int i; - getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); - for (i=0;i",memName,memType); - else - printf("<%s type=\"%s\" count=%d>",memName,memType,arrayLen); - for (i=0;i\n",memName); - } - } - } - - } - } - } - - int size = fileDna->getElementSize(oldStruct[0], oldStruct[1]); - elemPtr+=size; - - } -} - - -///Resolve pointers replaces the original pointers in structures, and linked lists by the new in-memory structures -void bFile::resolvePointers(bool verboseDumpAllBlocks) -{ - bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; - - printf("resolvePointers start\n"); - //char *dataPtr = mFileBuffer+mDataStart; - - if (1) //mFlags & (FD_BITS_VARIES | FD_VERSION_VARIES)) - { - resolvePointersMismatch(); - } - - { - for (int i=0;iflagEqual(dataChunk.dna_nr)) - { - //dataChunk.len - short int* oldStruct = fileDna->getStruct(dataChunk.dna_nr); - char* oldType = fileDna->getType(oldStruct[0]); - - if (verboseDumpAllBlocks) - printf("<%s>\n",oldType); - - resolvePointersChunk(dataChunk, verboseDumpAllBlocks); - - if (verboseDumpAllBlocks) - printf("\n",oldType); - } else - { - //printf("skipping mStruct\n"); - } - } - } - - printf("resolvePointers end\n"); -} - - -// ----------------------------------------------------- // -void* bFile::findLibPointer(void *ptr) -{ - - bStructHandle** ptrptr = getLibPointers().find(ptr); - if (ptrptr) - return *ptrptr; - return 0; -} - - -void bFile::updateOldPointers() -{ - int i; - - for (i=0;igetStruct(dataChunk.dna_nr); - char* typeName = dna->getType(newStruct[0]); - printf("%3d: %s ",i,typeName); - - printf("code=%s ",codestr); - - printf("ptr=%p ",dataChunk.oldPtr); - printf("len=%d ",dataChunk.len); - printf("nr=%d ",dataChunk.nr); - if (dataChunk.nr!=1) - { - printf("not 1\n"); - } - printf("\n"); - - - - - } - -#if 0 - IDFinderData ifd; - ifd.success = 0; - ifd.IDname = NULL; - ifd.just_print_it = 1; - for (i=0; im_blocks.size(); ++i) - { - BlendBlock* bb = bf->m_blocks[i]; - printf("tag='%s'\tptr=%p\ttype=%s\t[%4d]", bb->tag, bb,bf->types[bb->type_index].name,bb->m_array_entries_.size()); - block_ID_finder(bb, bf, &ifd); - printf("\n"); - } -#endif - -} - - -void bFile::writeChunks(FILE* fp, bool fixupPointers) -{ - bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; - - for (int i=0;igetStruct(dataChunk.dna_nr); - oldType = fileDna->getType(oldStruct[0]); - oldLen = fileDna->getLength(oldStruct[0]); - ///don't try to convert Link block data, just memcpy it. Other data can be converted. - reverseOld = mMemoryDNA->getReverseType(oldType); - - - if ((reverseOld!=-1)) - { - // make sure it's here - //assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!"); - // - curStruct = mMemoryDNA->getStruct(reverseOld); - newType = mMemoryDNA->getType(curStruct[0]); - // make sure it's the same - assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!"); - - - curLen = mMemoryDNA->getLength(curStruct[0]); - dataChunk.dna_nr = reverseOld; - if (strcmp("Link",oldType)!=0) - { - dataChunk.len = curLen * dataChunk.nr; - } else - { -// printf("keep length of link = %d\n",dataChunk.len); - } - - //write the structure header - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - - - - short int* curStruct1; - curStruct1 = mMemoryDNA->getStruct(dataChunk.dna_nr); - assert(curStruct1 == curStruct); - - char* cur = fixupPointers ? (char*)findLibPointer(dataChunk.oldPtr) : (char*)dataChunk.oldPtr; - - //write the actual contents of the structure(s) - fwrite(cur,dataChunk.len,1,fp); - } else - { - printf("serious error, struct mismatch: don't write\n"); - } - } - -} - -// ----------------------------------------------------- // -int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags) -{ - bool swap = false; - bool varies = false; - - if (flags &FD_ENDIAN_SWAP) swap = true; - if (flags &FD_BITS_VARIES) varies = true; - - if (VOID_IS_8) - { - if (varies) - { - bChunkPtr4 head; - memcpy(&head, dataPtr, sizeof(bChunkPtr4)); - - - bChunkPtr8 chunk; - - chunk.code = head.code; - chunk.len = head.len; - chunk.m_uniqueInts[0] = head.m_uniqueInt; - chunk.m_uniqueInts[1] = 0; - chunk.dna_nr = head.dna_nr; - chunk.nr = head.nr; - - if (swap) - { - if ((chunk.code & 0xFFFF)==0) - chunk.code >>=16; - - SWITCH_INT(chunk.len); - SWITCH_INT(chunk.dna_nr); - SWITCH_INT(chunk.nr); - } - - - memcpy(dataChunk, &chunk, sizeof(bChunkInd)); - } - else - { - bChunkPtr8 c; - memcpy(&c, dataPtr, sizeof(bChunkPtr8)); - - if (swap) - { - if ((c.code & 0xFFFF)==0) - c.code >>=16; - - SWITCH_INT(c.len); - SWITCH_INT(c.dna_nr); - SWITCH_INT(c.nr); - } - - memcpy(dataChunk, &c, sizeof(bChunkInd)); - } - } - else - { - if (varies) - { - bChunkPtr8 head; - memcpy(&head, dataPtr, sizeof(bChunkPtr8)); - - - bChunkPtr4 chunk; - chunk.code = head.code; - chunk.len = head.len; - - if (head.m_uniqueInts[0]==head.m_uniqueInts[1]) - { - chunk.m_uniqueInt = head.m_uniqueInts[0]; - } else - { - long64 oldPtr =0; - memcpy(&oldPtr, &head.m_uniqueInts[0], 8); - if (swap) - SWITCH_LONGINT(oldPtr); - chunk.m_uniqueInt = (int)(oldPtr >> 3); - } - - - chunk.dna_nr = head.dna_nr; - chunk.nr = head.nr; - - if (swap) - { - if ((chunk.code & 0xFFFF)==0) - chunk.code >>=16; - - SWITCH_INT(chunk.len); - SWITCH_INT(chunk.dna_nr); - SWITCH_INT(chunk.nr); - } - - memcpy(dataChunk, &chunk, sizeof(bChunkInd)); - } - else - { - bChunkPtr4 c; - memcpy(&c, dataPtr, sizeof(bChunkPtr4)); - - if (swap) - { - if ((c.code & 0xFFFF)==0) - c.code >>=16; - - SWITCH_INT(c.len); - SWITCH_INT(c.dna_nr); - SWITCH_INT(c.nr); - } - memcpy(dataChunk, &c, sizeof(bChunkInd)); - } - } - - if (dataChunk->len < 0) - return -1; - -#if 0 - print ("----------"); - print (dataChunk->code); - print (dataChunk->len); - print (dataChunk->old); - print (dataChunk->dna_nr); - print (dataChunk->nr); -#endif - return (dataChunk->len+ChunkUtils::getOffset(flags)); -} - - - -//eof - +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 "bFile.h" +#include "bCommon.h" +#include "bChunk.h" +#include "bDNA.h" +#include +#include +#include +#include "bDefines.h" +#include "LinearMath/btSerializer.h" + +#define SIZEOFBLENDERHEADER 12 +#define MAX_ARRAY_LENGTH 512 +using namespace bParse; + + + +int numallocs = 0; + +// ----------------------------------------------------- // +bFile::bFile(const char *filename, const char headerString[7]) + : mOwnsBuffer(true), + mFileBuffer(0), + mFileLen(0), + mVersion(0), + mDataStart(0), + mFileDNA(0), + mMemoryDNA(0), + mFlags(FD_INVALID) +{ + for (int i=0;i<7;i++) + { + m_headerString[i] = headerString[i]; + } + + FILE *fp = fopen(filename, "rb"); + if (fp) + { + fseek(fp, 0L, SEEK_END); + mFileLen = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + mFileBuffer = (char*)malloc(mFileLen+1); + fread(mFileBuffer, mFileLen, 1, fp); + + fclose(fp); + + // + parseHeader(); + + } +} + +// ----------------------------------------------------- // +bFile::bFile( char *memoryBuffer, int len, const char headerString[7]) +: mOwnsBuffer(false), + mFileBuffer(0), + mFileLen(0), + mVersion(0), + mDataStart(0), + mFileDNA(0), + mMemoryDNA(0), + mFlags(FD_INVALID) +{ + for (int i=0;i<7;i++) + { + m_headerString[i] = headerString[i]; + } + mFileBuffer = memoryBuffer; + mFileLen = len; + + parseHeader(); + +} + + +// ----------------------------------------------------- // +bFile::~bFile() +{ + if (mOwnsBuffer && mFileBuffer) + { + free(mFileBuffer); + mFileBuffer = 0; + } + + + delete mMemoryDNA; + delete mFileDNA; +} + + + + + +// ----------------------------------------------------- // +void bFile::parseHeader() +{ + char *blenderBuf = mFileBuffer; + char header[SIZEOFBLENDERHEADER+1] ; + memcpy(header, blenderBuf, SIZEOFBLENDERHEADER); + header[SIZEOFBLENDERHEADER]='\0'; + + if (strncmp(header, m_headerString, 6)!=0) + { + memcpy(header, m_headerString, SIZEOFBLENDERHEADER); + printf ("Invalid %s file...",header); + return; + } + + if (header[6] == 'd') + { + mFlags |= FD_DOUBLE_PRECISION; + } + + char *ver = header+9; + mVersion = atoi(ver); + if (mVersion <= 241) + printf ("Warning, %d not fully tested : <= 242\n", mVersion); + + + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; + + // swap ptr sizes... + if (header[7]=='-') + { + mFlags |= FD_FILE_64; + if (!VOID_IS_8) + mFlags |= FD_BITS_VARIES; + } + else if (VOID_IS_8) mFlags |= FD_BITS_VARIES; + + // swap endian... + if (header[8]=='V') + { + if (littleEndian ==1) + mFlags |= FD_ENDIAN_SWAP; + } + else + if (littleEndian==0) + mFlags |= FD_ENDIAN_SWAP; + + + printf ("%s\n",header); + printf ("\nsizeof(void*) == %d\n",int(sizeof(void*))); + const char* endStr = ((mFlags & FD_ENDIAN_SWAP)!=0) ? "yes" : "no"; + printf ("Swapping endian? %s\n",endStr); + const char* bitStr = (mFlags &FD_FILE_64)!=0 ? "64 bit" : "32bit"; + printf ("File format is %s\n",bitStr); + const char* varStr = (mFlags & FD_BITS_VARIES)!=0 ? "yes" : "no"; + printf ("Varing pointer sizes? %s\n",varStr); + + + mFlags |= FD_OK; +} + +// ----------------------------------------------------- // +bool bFile::ok() +{ + return (mFlags &FD_OK)!=0; +} + +// ----------------------------------------------------- // +void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLength) +{ + if ( (mFlags &FD_OK) ==0) + return; + + char *blenderData = mFileBuffer; + int sdnaPos=0; + + char *tempBuffer = blenderData; + for (int i=0; iinit(blenderData+sdnaPos, mFileLen-sdnaPos, (mFlags & FD_ENDIAN_SWAP)!=0); + + if (mVersion==276) + { + int i; + for (i=0;igetNumNames();i++) + { + if (strcmp(mFileDNA->getName(i),"int")==0) + { + mFlags |= FD_BROKEN_DNA; + } + } + if ((mFlags&FD_BROKEN_DNA)!=0) + { + printf("warning: fixing some broken DNA version\n"); + } + } + + + + if (verboseDumpAllTypes) + { + mFileDNA->dumpTypeDefinitions(); + } + + mMemoryDNA = new bDNA(); + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; + + mMemoryDNA->init(memDna,memDnaLength,littleEndian==0); + + + + + ///@todo we need a better version check, add version/sub version info from FileGlobal into memory DNA/header files + if (mMemoryDNA->getNumNames() != mFileDNA->getNumNames()) + { + mFlags |= FD_VERSION_VARIES; + printf ("Warning, file DNA is different than built in, performance is reduced. Best to re-export file with a matching version/platform"); + } + + // as long as it kept up to date it will be ok!! + if (mMemoryDNA->lessThan(mFileDNA)) + { + printf ("Warning, file DNA is newer than built in."); + } + + mFileDNA->initCmpFlags(mMemoryDNA); + + parseData(); + + resolvePointers(verboseDumpAllTypes);//verboseDumpAllBlocks); + + updateOldPointers(); + + printf("numAllocs = %d\n",numallocs); +} + + + +// ----------------------------------------------------- // +void bFile::swap(char *head, bChunkInd& dataChunk) +{ + char *data = head; + short *strc = mFileDNA->getStruct(dataChunk.dna_nr); + int len = mFileDNA->getLength(strc[0]); + + for (int i=0; iflagEqual(dataChunk.dna_nr)) + { + // Ouch! need to rebuild the struct + short *oldStruct,*curStruct; + char *oldType, *newType; + int oldLen, curLen, reverseOld; + + + oldStruct = mFileDNA->getStruct(dataChunk.dna_nr); + oldType = mFileDNA->getType(oldStruct[0]); + oldLen = mFileDNA->getLength(oldStruct[0]); + + if ((mFlags&FD_BROKEN_DNA)!=0) + { + if ((strcmp(oldType,"btQuantizedBvhNodeData")==0)&&oldLen==20) + { + return 0; + } + if ((strcmp(oldType,"btShortIntIndexData")==0)) + { + int allocLen = 2; + char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; + memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1); + short* dest = (short*) dataAlloc; + const short* src = (short*) head; + for (int i=0;igetReverseType(oldType); + + if ((reverseOld!=-1)) + { + // make sure it's here + //assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!"); + + // + curStruct = mMemoryDNA->getStruct(reverseOld); + newType = mMemoryDNA->getType(curStruct[0]); + curLen = mMemoryDNA->getLength(curStruct[0]); + + + + // make sure it's the same + assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!"); + + + numallocs++; + // numBlocks * length + int allocLen = curLen > oldLen ? curLen : oldLen; + char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; + memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1); + + // track allocated + addDataBlock(dataAlloc); + + char *cur = dataAlloc; + char *old = head; + for (int block=0; blockgetStruct(dataChunk.dna_nr); + oldType = mFileDNA->getType(oldStruct[0]); + printf("%s equal structure, just memcpy\n",oldType); +#endif // + } + + + char *dataAlloc = new char[(dataChunk.len)+1]; + memset(dataAlloc, 0, dataChunk.len+1); + + + // track allocated + addDataBlock(dataAlloc); + + memcpy(dataAlloc, head, dataChunk.len); + return dataAlloc; + +} + + +// ----------------------------------------------------- // +void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers) +{ + if (old_dna == -1) return; + if (new_dna == -1) return; + + //disable this, because we need to fixup pointers/ListBase + if (0)//mFileDNA->flagEqual(old_dna)) + { + short *strc = mFileDNA->getStruct(old_dna); + int len = mFileDNA->getLength(strc[0]); + + memcpy(strcPtr, dtPtr, len); + return; + } + + // Ok, now build the struct + char *memType, *memName, *cpc, *cpo; + short *fileStruct, *filePtrOld, *memoryStruct, *firstStruct; + int elementLength, size, revType, old_nr, new_nr, fpLen; + short firstStructType; + + + // File to memory lookup + memoryStruct = mMemoryDNA->getStruct(new_dna); + fileStruct = mFileDNA->getStruct(old_dna); + firstStruct = fileStruct; + + + filePtrOld = fileStruct; + firstStructType = mMemoryDNA->getStruct(0)[0]; + + // Get number of elements + elementLength = memoryStruct[1]; + memoryStruct+=2; + + cpc = strcPtr; cpo = 0; + for (int ele=0; elegetType(memoryStruct[0]); + memName = mMemoryDNA->getName(memoryStruct[1]); + + + size = mMemoryDNA->getElementSize(memoryStruct[0], memoryStruct[1]); + revType = mMemoryDNA->getReverseType(memoryStruct[0]); + + if (revType != -1 && memoryStruct[0]>=firstStructType && memName[0] != '*') + { + cpo = getFileElement(firstStruct, memName, memType, dtPtr, &filePtrOld); + if (cpo) + { + int arrayLen = mFileDNA->getArraySizeNew(filePtrOld[1]); + old_nr = mFileDNA->getReverseType(memType); + new_nr = revType; + fpLen = mFileDNA->getElementSize(filePtrOld[0], filePtrOld[1]); + if (arrayLen==1) + { + parseStruct(cpc, cpo, old_nr, new_nr,fixupPointers); + } else + { + char* tmpCpc = cpc; + char* tmpCpo = cpo; + + for (int i=0;i3 && type <8) + { + char c; + char *cp = data; + for (int i=0; igetPointerSize(); + int ptrMem = mMemoryDNA->getPointerSize(); + + if (!src && !dst) + return; + + + if (ptrFile == ptrMem) + { + memcpy(dst, src, ptrMem); + } + else if (ptrMem==4 && ptrFile==8) + { + btPointerUid* oldPtr = (btPointerUid*)src; + btPointerUid* newPtr = (btPointerUid*)dst; + + if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1]) + { + //Bullet stores the 32bit unique ID in both upper and lower part of 64bit pointers + //so it can be used to distinguish between .blend and .bullet + newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0]; + } else + { + //deal with pointers the Blender .blend style way, see + //readfile.c in the Blender source tree + long64 longValue = *((long64*)src); + //endian swap for 64bit pointer otherwise truncation will fail due to trailing zeros + if (mFlags & FD_ENDIAN_SWAP) + SWITCH_LONGINT(longValue); + *((int*)dst) = (int)(longValue>>3); + } + + } + else if (ptrMem==8 && ptrFile==4) + { + btPointerUid* oldPtr = (btPointerUid*)src; + btPointerUid* newPtr = (btPointerUid*)dst; + if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1]) + { + newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0]; + newPtr->m_uniqueIds[1] = 0; + } else + { + *((long64*)dst)= *((int*)src); + } + } + else + { + printf ("%d %d\n", ptrFile,ptrMem); + assert(0 && "Invalid pointer len"); + } + + +} + + +// ----------------------------------------------------- // +void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers) +{ + // find the matching memory dna data + // to the file being loaded. Fill the + // memory with the file data... + + int len = dna_addr[1]; + dna_addr+=2; + + for (int i=0; igetType(dna_addr[0]); + const char* name = mFileDNA->getName(dna_addr[1]); + + + + int eleLen = mFileDNA->getElementSize(dna_addr[0], dna_addr[1]); + + if ((mFlags&FD_BROKEN_DNA)!=0) + { + if ((strcmp(type,"short")==0)&&(strcmp(name,"int")==0)) + { + eleLen = 0; + } + } + + if (strcmp(lookupName, name)==0) + { + //int arrayLenold = mFileDNA->getArraySize((char*)name.c_str()); + int arrayLen = mFileDNA->getArraySizeNew(dna_addr[1]); + //assert(arrayLenold == arrayLen); + + if (name[0] == '*') + { + // cast pointers + int ptrFile = mFileDNA->getPointerSize(); + int ptrMem = mMemoryDNA->getPointerSize(); + safeSwapPtr(strcData,data); + + if (fixupPointers) + { + if (arrayLen > 1) + { + //void **sarray = (void**)strcData; + //void **darray = (void**)data; + + char *cpc, *cpo; + cpc = (char*)strcData; + cpo = (char*)data; + + for (int a=0; agetStruct(old_nr); + int elementLength = old[1]; + old+=2; + + for (int i=0; igetType(old[0]); + char* name = mFileDNA->getName(old[1]); + int len = mFileDNA->getElementSize(old[0], old[1]); + + if (strcmp(lookupName, name)==0) + { + if (strcmp(type, lookupType)==0) + { + if (foundPos) + *foundPos = old; + return data; + } + return 0; + } + data+=len; + } + return 0; +} + + +// ----------------------------------------------------- // +void bFile::swapStruct(int dna_nr, char *data) +{ + if (dna_nr == -1) return; + + short *strc = mFileDNA->getStruct(dna_nr); + //short *firstStrc = strc; + + int elementLen= strc[1]; + strc+=2; + + short first = mFileDNA->getStruct(0)[0]; + + char *buf = data; + for (int i=0; igetType(strc[0]); + char *name = mFileDNA->getName(strc[1]); + + int size = mFileDNA->getElementSize(strc[0], strc[1]); + if (strc[0] >= first && name[0]!='*') + { + int old_nr = mFileDNA->getReverseType(type); + int arrayLen = mFileDNA->getArraySizeNew(strc[1]); + if (arrayLen==1) + { + swapStruct(old_nr,buf); + } else + { + char* tmpBuf = buf; + for (int i=0;igetArraySize(name); + int arrayLen = mFileDNA->getArraySizeNew(strc[1]); + //assert(arrayLenOld == arrayLen); + swapData(buf, strc[0], arrayLen); + } + buf+=size; + } +} + + + +void bFile::resolvePointersMismatch() +{ +// printf("resolvePointersStructMismatch\n"); + + int i; + + for (i=0;i< m_pointerFixupArray.size();i++) + { + char* cur = m_pointerFixupArray.at(i); + void** ptrptr = (void**) cur; + void* ptr = *ptrptr; + ptr = findLibPointer(ptr); + if (ptr) + { + //printf("Fixup pointer!\n"); + *(ptrptr) = ptr; + } else + { +// printf("pointer not found: %x\n",cur); + } + } + for (i=0;i< m_pointerPtrFixupArray.size();i++) + { + char* cur= m_pointerPtrFixupArray.at(i); + void** ptrptr = (void**)cur; + void *ptr = findLibPointer(*ptrptr); + if (ptr) + { + (*ptrptr) = ptr; + + void **array= (void**)(*(ptrptr)); + //int ptrMem = mMemoryDNA->getPointerSize(); + int ptrFile = mFileDNA->getPointerSize(); + + int n=0; + void *lookup = array[n]; + + if (lookup) + { + char *oldPtr = (char*)array; + btAlignedObjectArray pointers; + + while(lookup) + { + btPointerUid dp = {0}; + safeSwapPtr((char*)dp.m_uniqueIds, (char*)(oldPtr + (n * ptrFile))); + + lookup = findLibPointer(dp.m_ptr); + if (!lookup) break; + + pointers.push_back(dp); + ++n; + } + + for (int j=0; jgetStruct(dataChunk.dna_nr); + short oldLen = fileDna->getLength(oldStruct[0]); + //char* structType = fileDna->getType(oldStruct[0]); + + char* cur = (char*)findLibPointer(dataChunk.oldPtr); + for (int block=0; blockgetStruct(0)[0]; + + + char* elemPtr= strcPtr; + + short int* oldStruct = fileDna->getStruct(dna_nr); + + int elementLength = oldStruct[1]; + oldStruct+=2; + + + for (int ele=0; elegetType(oldStruct[0]); + memName = fileDna->getName(oldStruct[1]); + + + + int arrayLen = fileDna->getArraySizeNew(oldStruct[1]); + if (memName[0] == '*') + { + if (arrayLen > 1) + { + void **array= (void**)elemPtr; + for (int a=0; agetReverseType(oldStruct[0]); + if (oldStruct[0]>=firstStructType) //revType != -1 && + { + if (verboseDumpAllBlocks) + { + for (int i=0;i\n",memName,memType); + } + resolvePointersStructRecursive(elemPtr,revType, verboseDumpAllBlocks,recursion+1); + if (verboseDumpAllBlocks) + { + for (int i=0;i\n",memName); + } + } else + { + //export a simple type + if (verboseDumpAllBlocks) + { + + if (arrayLen>MAX_ARRAY_LENGTH) + { + printf("too long\n"); + } else + { + //printf("%s %s\n",memType,memName); + + bool isIntegerType = (strcmp(memType,"char")==0) || (strcmp(memType,"int")==0) || (strcmp(memType,"short")==0); + + if (isIntegerType) + { + const char* newtype="int"; + int dbarray[MAX_ARRAY_LENGTH]; + int* dbPtr = 0; + char* tmp = elemPtr; + dbPtr = &dbarray[0]; + if (dbPtr) + { + int i; + getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); + for (i=0;i",memName,memType); + else + printf("<%s type=\"%s\" count=%d>",memName,memType,arrayLen); + for (i=0;i\n",memName); + } + } else + { + const char* newtype="double"; + double dbarray[MAX_ARRAY_LENGTH]; + double* dbPtr = 0; + char* tmp = elemPtr; + dbPtr = &dbarray[0]; + if (dbPtr) + { + int i; + getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); + for (i=0;i",memName,memType); + else + printf("<%s type=\"%s\" count=%d>",memName,memType,arrayLen); + for (i=0;i\n",memName); + } + } + } + + } + } + } + + int size = fileDna->getElementSize(oldStruct[0], oldStruct[1]); + elemPtr+=size; + + } +} + + +///Resolve pointers replaces the original pointers in structures, and linked lists by the new in-memory structures +void bFile::resolvePointers(bool verboseDumpAllBlocks) +{ + bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; + + printf("resolvePointers start\n"); + //char *dataPtr = mFileBuffer+mDataStart; + + if (1) //mFlags & (FD_BITS_VARIES | FD_VERSION_VARIES)) + { + resolvePointersMismatch(); + } + + { + for (int i=0;iflagEqual(dataChunk.dna_nr)) + { + //dataChunk.len + short int* oldStruct = fileDna->getStruct(dataChunk.dna_nr); + char* oldType = fileDna->getType(oldStruct[0]); + + if (verboseDumpAllBlocks) + printf("<%s>\n",oldType); + + resolvePointersChunk(dataChunk, verboseDumpAllBlocks); + + if (verboseDumpAllBlocks) + printf("\n",oldType); + } else + { + //printf("skipping mStruct\n"); + } + } + } + + printf("resolvePointers end\n"); +} + + +// ----------------------------------------------------- // +void* bFile::findLibPointer(void *ptr) +{ + + bStructHandle** ptrptr = getLibPointers().find(ptr); + if (ptrptr) + return *ptrptr; + return 0; +} + + +void bFile::updateOldPointers() +{ + int i; + + for (i=0;igetStruct(dataChunk.dna_nr); + char* typeName = dna->getType(newStruct[0]); + printf("%3d: %s ",i,typeName); + + printf("code=%s ",codestr); + + printf("ptr=%p ",dataChunk.oldPtr); + printf("len=%d ",dataChunk.len); + printf("nr=%d ",dataChunk.nr); + if (dataChunk.nr!=1) + { + printf("not 1\n"); + } + printf("\n"); + + + + + } + +#if 0 + IDFinderData ifd; + ifd.success = 0; + ifd.IDname = NULL; + ifd.just_print_it = 1; + for (i=0; im_blocks.size(); ++i) + { + BlendBlock* bb = bf->m_blocks[i]; + printf("tag='%s'\tptr=%p\ttype=%s\t[%4d]", bb->tag, bb,bf->types[bb->type_index].name,bb->m_array_entries_.size()); + block_ID_finder(bb, bf, &ifd); + printf("\n"); + } +#endif + +} + + +void bFile::writeChunks(FILE* fp, bool fixupPointers) +{ + bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; + + for (int i=0;igetStruct(dataChunk.dna_nr); + oldType = fileDna->getType(oldStruct[0]); + oldLen = fileDna->getLength(oldStruct[0]); + ///don't try to convert Link block data, just memcpy it. Other data can be converted. + reverseOld = mMemoryDNA->getReverseType(oldType); + + + if ((reverseOld!=-1)) + { + // make sure it's here + //assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!"); + // + curStruct = mMemoryDNA->getStruct(reverseOld); + newType = mMemoryDNA->getType(curStruct[0]); + // make sure it's the same + assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!"); + + + curLen = mMemoryDNA->getLength(curStruct[0]); + dataChunk.dna_nr = reverseOld; + if (strcmp("Link",oldType)!=0) + { + dataChunk.len = curLen * dataChunk.nr; + } else + { +// printf("keep length of link = %d\n",dataChunk.len); + } + + //write the structure header + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + + + + short int* curStruct1; + curStruct1 = mMemoryDNA->getStruct(dataChunk.dna_nr); + assert(curStruct1 == curStruct); + + char* cur = fixupPointers ? (char*)findLibPointer(dataChunk.oldPtr) : (char*)dataChunk.oldPtr; + + //write the actual contents of the structure(s) + fwrite(cur,dataChunk.len,1,fp); + } else + { + printf("serious error, struct mismatch: don't write\n"); + } + } + +} + +// ----------------------------------------------------- // +int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags) +{ + bool swap = false; + bool varies = false; + + if (flags &FD_ENDIAN_SWAP) swap = true; + if (flags &FD_BITS_VARIES) varies = true; + + if (VOID_IS_8) + { + if (varies) + { + bChunkPtr4 head; + memcpy(&head, dataPtr, sizeof(bChunkPtr4)); + + + bChunkPtr8 chunk; + + chunk.code = head.code; + chunk.len = head.len; + chunk.m_uniqueInts[0] = head.m_uniqueInt; + chunk.m_uniqueInts[1] = 0; + chunk.dna_nr = head.dna_nr; + chunk.nr = head.nr; + + if (swap) + { + if ((chunk.code & 0xFFFF)==0) + chunk.code >>=16; + + SWITCH_INT(chunk.len); + SWITCH_INT(chunk.dna_nr); + SWITCH_INT(chunk.nr); + } + + + memcpy(dataChunk, &chunk, sizeof(bChunkInd)); + } + else + { + bChunkPtr8 c; + memcpy(&c, dataPtr, sizeof(bChunkPtr8)); + + if (swap) + { + if ((c.code & 0xFFFF)==0) + c.code >>=16; + + SWITCH_INT(c.len); + SWITCH_INT(c.dna_nr); + SWITCH_INT(c.nr); + } + + memcpy(dataChunk, &c, sizeof(bChunkInd)); + } + } + else + { + if (varies) + { + bChunkPtr8 head; + memcpy(&head, dataPtr, sizeof(bChunkPtr8)); + + + bChunkPtr4 chunk; + chunk.code = head.code; + chunk.len = head.len; + + if (head.m_uniqueInts[0]==head.m_uniqueInts[1]) + { + chunk.m_uniqueInt = head.m_uniqueInts[0]; + } else + { + long64 oldPtr =0; + memcpy(&oldPtr, &head.m_uniqueInts[0], 8); + if (swap) + SWITCH_LONGINT(oldPtr); + chunk.m_uniqueInt = (int)(oldPtr >> 3); + } + + + chunk.dna_nr = head.dna_nr; + chunk.nr = head.nr; + + if (swap) + { + if ((chunk.code & 0xFFFF)==0) + chunk.code >>=16; + + SWITCH_INT(chunk.len); + SWITCH_INT(chunk.dna_nr); + SWITCH_INT(chunk.nr); + } + + memcpy(dataChunk, &chunk, sizeof(bChunkInd)); + } + else + { + bChunkPtr4 c; + memcpy(&c, dataPtr, sizeof(bChunkPtr4)); + + if (swap) + { + if ((c.code & 0xFFFF)==0) + c.code >>=16; + + SWITCH_INT(c.len); + SWITCH_INT(c.dna_nr); + SWITCH_INT(c.nr); + } + memcpy(dataChunk, &c, sizeof(bChunkInd)); + } + } + + if (dataChunk->len < 0) + return -1; + +#if 0 + print ("----------"); + print (dataChunk->code); + print (dataChunk->len); + print (dataChunk->old); + print (dataChunk->dna_nr); + print (dataChunk->nr); +#endif + return (dataChunk->len+ChunkUtils::getOffset(flags)); +} + + + +//eof + diff --git a/Extras/Serialize/BulletFileLoader/bFile.h b/Extras/Serialize/BulletFileLoader/bFile.h index 1033a4519..84c011dc7 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.h +++ b/Extras/Serialize/BulletFileLoader/bFile.h @@ -1,153 +1,153 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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 __BFILE_H__ -#define __BFILE_H__ - -#include "bCommon.h" -#include "bChunk.h" -#include - -namespace bParse { - - // ----------------------------------------------------- // - enum bFileFlags - { - FD_INVALID =0, - FD_OK =1, - FD_VOID_IS_8 =2, - FD_ENDIAN_SWAP =4, - FD_FILE_64 =8, - FD_BITS_VARIES =16, - FD_VERSION_VARIES = 32, - FD_DOUBLE_PRECISION =64, - FD_BROKEN_DNA = 128 - }; - - - // ----------------------------------------------------- // - class bFile - { - protected: - - char m_headerString[7]; - - bool mOwnsBuffer; - char* mFileBuffer; - int mFileLen; - int mVersion; - - - bPtrMap mLibPointers; - - int mDataStart; - bDNA* mFileDNA; - bDNA* mMemoryDNA; - - btAlignedObjectArray m_pointerFixupArray; - btAlignedObjectArray m_pointerPtrFixupArray; - - btAlignedObjectArray m_chunks; - - // - - bPtrMap mDataPointers; - - - int mFlags; - - // //////////////////////////////////////////////////////////////////////////// - - // buffer offset util - int getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags); - void safeSwapPtr(char *dst, const char *src); - - virtual void parseHeader(); - - virtual void parseData() = 0; - - void resolvePointersMismatch(); - void resolvePointersChunk(const bChunkInd& dataChunk, bool verboseDumpAllBlocks); - - void resolvePointersStructRecursive(char *strcPtr, int old_dna, bool verboseDumpAllBlocks, int recursion); - //void swapPtr(char *dst, char *src); - - void parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers); - void getMatchingFileDNA(short* old, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers); - char* getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos); - - - void swap(char *head, class bChunkInd& ch); - - void swapData(char *data, short type, int arraySize); - void swapStruct(int dna_nr, char *data); - - - - - char* readStruct(char *head, class bChunkInd& chunk); - char *getAsString(int code); - - void parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLength); - - public: - bFile(const char *filename, const char headerString[7]); - - //todo: make memoryBuffer const char - //bFile( const char *memoryBuffer, int len); - bFile( char *memoryBuffer, int len, const char headerString[7]); - virtual ~bFile(); - - bDNA* getFileDNA() - { - return mFileDNA; - } - - virtual void addDataBlock(char* dataBlock) = 0; - - int getFlags() const - { - return mFlags; - } - - bPtrMap& getLibPointers() - { - return mLibPointers; - } - - void* findLibPointer(void *ptr); - - bool ok(); - - virtual void parse(bool verboseDumpAllTypes) = 0; - - virtual int write(const char* fileName, bool fixupPointers=false) = 0; - - virtual void writeChunks(FILE* fp, bool fixupPointers ); - - virtual void writeDNA(FILE* fp) = 0; - - void updateOldPointers(); - void resolvePointers(bool verboseDumpAllBlocks); - - void dumpChunks(bDNA* dna); - - - - }; -} - - -#endif//__BFILE_H__ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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 __BFILE_H__ +#define __BFILE_H__ + +#include "bCommon.h" +#include "bChunk.h" +#include + +namespace bParse { + + // ----------------------------------------------------- // + enum bFileFlags + { + FD_INVALID =0, + FD_OK =1, + FD_VOID_IS_8 =2, + FD_ENDIAN_SWAP =4, + FD_FILE_64 =8, + FD_BITS_VARIES =16, + FD_VERSION_VARIES = 32, + FD_DOUBLE_PRECISION =64, + FD_BROKEN_DNA = 128 + }; + + + // ----------------------------------------------------- // + class bFile + { + protected: + + char m_headerString[7]; + + bool mOwnsBuffer; + char* mFileBuffer; + int mFileLen; + int mVersion; + + + bPtrMap mLibPointers; + + int mDataStart; + bDNA* mFileDNA; + bDNA* mMemoryDNA; + + btAlignedObjectArray m_pointerFixupArray; + btAlignedObjectArray m_pointerPtrFixupArray; + + btAlignedObjectArray m_chunks; + + // + + bPtrMap mDataPointers; + + + int mFlags; + + // //////////////////////////////////////////////////////////////////////////// + + // buffer offset util + int getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags); + void safeSwapPtr(char *dst, const char *src); + + virtual void parseHeader(); + + virtual void parseData() = 0; + + void resolvePointersMismatch(); + void resolvePointersChunk(const bChunkInd& dataChunk, bool verboseDumpAllBlocks); + + void resolvePointersStructRecursive(char *strcPtr, int old_dna, bool verboseDumpAllBlocks, int recursion); + //void swapPtr(char *dst, char *src); + + void parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers); + void getMatchingFileDNA(short* old, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers); + char* getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos); + + + void swap(char *head, class bChunkInd& ch); + + void swapData(char *data, short type, int arraySize); + void swapStruct(int dna_nr, char *data); + + + + + char* readStruct(char *head, class bChunkInd& chunk); + char *getAsString(int code); + + void parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLength); + + public: + bFile(const char *filename, const char headerString[7]); + + //todo: make memoryBuffer const char + //bFile( const char *memoryBuffer, int len); + bFile( char *memoryBuffer, int len, const char headerString[7]); + virtual ~bFile(); + + bDNA* getFileDNA() + { + return mFileDNA; + } + + virtual void addDataBlock(char* dataBlock) = 0; + + int getFlags() const + { + return mFlags; + } + + bPtrMap& getLibPointers() + { + return mLibPointers; + } + + void* findLibPointer(void *ptr); + + bool ok(); + + virtual void parse(bool verboseDumpAllTypes) = 0; + + virtual int write(const char* fileName, bool fixupPointers=false) = 0; + + virtual void writeChunks(FILE* fp, bool fixupPointers ); + + virtual void writeDNA(FILE* fp) = 0; + + void updateOldPointers(); + void resolvePointers(bool verboseDumpAllBlocks); + + void dumpChunks(bDNA* dna); + + + + }; +} + + +#endif//__BFILE_H__ diff --git a/Extras/Serialize/BulletFileLoader/btBulletFile.cpp b/Extras/Serialize/BulletFileLoader/btBulletFile.cpp index 4e8b4a388..1379229b9 100644 --- a/Extras/Serialize/BulletFileLoader/btBulletFile.cpp +++ b/Extras/Serialize/BulletFileLoader/btBulletFile.cpp @@ -1,384 +1,384 @@ -/* -bParse -Copyright (c) 2006-2010 Erwin Coumans http://gamekit.googlecode.com - -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 "btBulletFile.h" -#include "bDefines.h" -#include "bDNA.h" - -#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include - - -// 32 && 64 bit versions -#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES -#ifdef _WIN64 -extern unsigned char sBulletDNAstr64[]; -extern int sBulletDNAlen64; -#else -extern unsigned char sBulletDNAstr[]; -extern int sBulletDNAlen; -#endif //_WIN64 -#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - -extern unsigned char sBulletDNAstr64[]; -extern int sBulletDNAlen64; -extern unsigned char sBulletDNAstr[]; -extern int sBulletDNAlen; - -#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - -using namespace bParse; - -btBulletFile::btBulletFile() -:bFile("", "BULLET ") -{ - mMemoryDNA = new bDNA(); - m_DnaCopy = 0; - - -#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES -#ifdef _WIN64 - m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); - memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); - mMemoryDNA->init(m_DnaCopy,sBulletDNAlen64); -#else//_WIN64 - m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); - memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); - mMemoryDNA->init(m_DnaCopy,sBulletDNAlen); -#endif//_WIN64 -#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { - m_DnaCopy = (char*) btAlignedAlloc(sBulletDNAlen64,16); - memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); - mMemoryDNA->init(m_DnaCopy,sBulletDNAlen64); - } - else - { - m_DnaCopy =(char*) btAlignedAlloc(sBulletDNAlen,16); - memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); - mMemoryDNA->init(m_DnaCopy,sBulletDNAlen); - } -#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES -} - - - -btBulletFile::btBulletFile(const char* fileName) -:bFile(fileName, "BULLET ") -{ - m_DnaCopy = 0; -} - - - -btBulletFile::btBulletFile(char *memoryBuffer, int len) -:bFile(memoryBuffer,len, "BULLET ") -{ - m_DnaCopy = 0; -} - - -btBulletFile::~btBulletFile() -{ - if (m_DnaCopy) - btAlignedFree(m_DnaCopy); -} - - - -// ----------------------------------------------------- // -void btBulletFile::parseData() -{ - printf ("Building datablocks"); - printf ("Chunk size = %d",CHUNK_HEADER_LEN); - printf ("File chunk size = %d",ChunkUtils::getOffset(mFlags)); - - const bool brokenDNA = (mFlags&FD_BROKEN_DNA)!=0; - - //const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0; - - - mDataStart = 12; - - char *dataPtr = mFileBuffer+mDataStart; - - bChunkInd dataChunk; - dataChunk.code = 0; - - - //dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags); - int seek = getNextBlock(&dataChunk, dataPtr, mFlags); - //dataPtr += ChunkUtils::getOffset(mFlags); - char *dataPtrHead = 0; - - while (dataChunk.code != DNA1) - { - if (!brokenDNA || (dataChunk.code != BT_QUANTIZED_BVH_CODE) ) - { - - // one behind - if (dataChunk.code == SDNA) break; - //if (dataChunk.code == DNA1) break; - - // same as (BHEAD+DATA dependency) - dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags); - if (dataChunk.dna_nr>=0) - { - char *id = readStruct(dataPtrHead, dataChunk); - - // lookup maps - if (id) - { - mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); - - m_chunks.push_back(dataChunk); - // block it - //bListBasePtr *listID = mMain->getListBasePtr(dataChunk.code); - //if (listID) - // listID->push_back((bStructHandle*)id); - } - - if (dataChunk.code == BT_RIGIDBODY_CODE) - { - m_rigidBodies.push_back((bStructHandle*) id); - } - - if (dataChunk.code == BT_CONSTRAINT_CODE) - { - m_constraints.push_back((bStructHandle*) id); - } - - if (dataChunk.code == BT_QUANTIZED_BVH_CODE) - { - m_bvhs.push_back((bStructHandle*) id); - } - - if (dataChunk.code == BT_TRIANLGE_INFO_MAP) - { - m_triangleInfoMaps.push_back((bStructHandle*) id); - } - - if (dataChunk.code == BT_COLLISIONOBJECT_CODE) - { - m_collisionObjects.push_back((bStructHandle*) id); - } - - if (dataChunk.code == BT_SHAPE_CODE) - { - m_collisionShapes.push_back((bStructHandle*) id); - } - - // if (dataChunk.code == GLOB) - // { - // m_glob = (bStructHandle*) id; - // } - } else - { - printf("unknown chunk\n"); - - mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)dataPtrHead); - } - } else - { - printf("skipping BT_QUANTIZED_BVH_CODE due to broken DNA\n"); - } - - // next please! - dataPtr += seek; - - seek = getNextBlock(&dataChunk, dataPtr, mFlags); - if (seek < 0) - break; - } - -} - -void btBulletFile::addDataBlock(char* dataBlock) -{ - //mMain->addDatablock(dataBlock); -} - - - - -void btBulletFile::writeDNA(FILE* fp) -{ - - bChunkInd dataChunk; - dataChunk.code = DNA1; - dataChunk.dna_nr = 0; - dataChunk.nr = 1; -#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { -#ifdef _WIN64 - dataChunk.len = sBulletDNAlen64; - dataChunk.oldPtr = sBulletDNAstr64; - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); -#else - btAssert(0); -#endif - } - else - { -#ifndef _WIN64 - dataChunk.len = sBulletDNAlen; - dataChunk.oldPtr = sBulletDNAstr; - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); -#else//_WIN64 - btAssert(0); -#endif//_WIN64 - } -#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { - dataChunk.len = sBulletDNAlen64; - dataChunk.oldPtr = sBulletDNAstr64; - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); - } - else - { - dataChunk.len = sBulletDNAlen; - dataChunk.oldPtr = sBulletDNAstr; - fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); - } -#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES -} - - -void btBulletFile::parse(bool verboseDumpAllTypes) -{ -#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { -#ifdef _WIN64 - - if (m_DnaCopy) - delete m_DnaCopy; - m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); - memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); - parseInternal(verboseDumpAllTypes,(char*)sBulletDNAstr64,sBulletDNAlen64); -#else - btAssert(0); -#endif - } - else - { -#ifndef _WIN64 - - if (m_DnaCopy) - delete m_DnaCopy; - m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); - memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); - parseInternal(verboseDumpAllTypes,m_DnaCopy,sBulletDNAlen); -#else - btAssert(0); -#endif - } -#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { - if (m_DnaCopy) - delete m_DnaCopy; - m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); - memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); - parseInternal(verboseDumpAllTypes,m_DnaCopy,sBulletDNAlen64); - } - else - { - if (m_DnaCopy) - delete m_DnaCopy; - m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); - memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); - parseInternal(verboseDumpAllTypes,m_DnaCopy,sBulletDNAlen); - } -#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES -} - -// experimental -int btBulletFile::write(const char* fileName, bool fixupPointers) -{ - FILE *fp = fopen(fileName, "wb"); - if (fp) - { - char header[SIZEOFBLENDERHEADER] ; - memcpy(header, m_headerString, 7); - int endian= 1; - endian= ((char*)&endian)[0]; - - if (endian) - { - header[7] = '_'; - } else - { - header[7] = '-'; - } - if (VOID_IS_8) - { - header[8]='V'; - } else - { - header[8]='v'; - } - - header[9] = '2'; - header[10] = '7'; - header[11] = '5'; - - fwrite(header,SIZEOFBLENDERHEADER,1,fp); - - writeChunks(fp, fixupPointers); - - writeDNA(fp); - - fclose(fp); - - } else - { - printf("Error: cannot open file %s for writing\n",fileName); - return 0; - } - return 1; -} - - - -void btBulletFile::addStruct(const char* structType,void* data, int len, void* oldPtr, int code) -{ - - bParse::bChunkInd dataChunk; - dataChunk.code = code; - dataChunk.nr = 1; - dataChunk.len = len; - dataChunk.dna_nr = mMemoryDNA->getReverseType(structType); - dataChunk.oldPtr = oldPtr; - - ///Perform structure size validation - short* structInfo= mMemoryDNA->getStruct(dataChunk.dna_nr); - int elemBytes; - elemBytes= mMemoryDNA->getLength(structInfo[0]); -// int elemBytes = mMemoryDNA->getElementSize(structInfo[0],structInfo[1]); - assert(len==elemBytes); - - mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data); - m_chunks.push_back(dataChunk); +/* +bParse +Copyright (c) 2006-2010 Erwin Coumans http://gamekit.googlecode.com + +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 "btBulletFile.h" +#include "bDefines.h" +#include "bDNA.h" + +#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) +#include +#endif +#include + + +// 32 && 64 bit versions +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +#ifdef _WIN64 +extern unsigned char sBulletDNAstr64[]; +extern int sBulletDNAlen64; +#else +extern unsigned char sBulletDNAstr[]; +extern int sBulletDNAlen; +#endif //_WIN64 +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + +extern unsigned char sBulletDNAstr64[]; +extern int sBulletDNAlen64; +extern unsigned char sBulletDNAstr[]; +extern int sBulletDNAlen; + +#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + +using namespace bParse; + +btBulletFile::btBulletFile() +:bFile("", "BULLET ") +{ + mMemoryDNA = new bDNA(); + m_DnaCopy = 0; + + +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +#ifdef _WIN64 + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen64); +#else//_WIN64 + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen); +#endif//_WIN64 +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { + m_DnaCopy = (char*) btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen64); + } + else + { + m_DnaCopy =(char*) btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen); + } +#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +} + + + +btBulletFile::btBulletFile(const char* fileName) +:bFile(fileName, "BULLET ") +{ + m_DnaCopy = 0; +} + + + +btBulletFile::btBulletFile(char *memoryBuffer, int len) +:bFile(memoryBuffer,len, "BULLET ") +{ + m_DnaCopy = 0; +} + + +btBulletFile::~btBulletFile() +{ + if (m_DnaCopy) + btAlignedFree(m_DnaCopy); +} + + + +// ----------------------------------------------------- // +void btBulletFile::parseData() +{ + printf ("Building datablocks"); + printf ("Chunk size = %d",CHUNK_HEADER_LEN); + printf ("File chunk size = %d",ChunkUtils::getOffset(mFlags)); + + const bool brokenDNA = (mFlags&FD_BROKEN_DNA)!=0; + + //const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0; + + + mDataStart = 12; + + char *dataPtr = mFileBuffer+mDataStart; + + bChunkInd dataChunk; + dataChunk.code = 0; + + + //dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags); + int seek = getNextBlock(&dataChunk, dataPtr, mFlags); + //dataPtr += ChunkUtils::getOffset(mFlags); + char *dataPtrHead = 0; + + while (dataChunk.code != DNA1) + { + if (!brokenDNA || (dataChunk.code != BT_QUANTIZED_BVH_CODE) ) + { + + // one behind + if (dataChunk.code == SDNA) break; + //if (dataChunk.code == DNA1) break; + + // same as (BHEAD+DATA dependency) + dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags); + if (dataChunk.dna_nr>=0) + { + char *id = readStruct(dataPtrHead, dataChunk); + + // lookup maps + if (id) + { + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); + + m_chunks.push_back(dataChunk); + // block it + //bListBasePtr *listID = mMain->getListBasePtr(dataChunk.code); + //if (listID) + // listID->push_back((bStructHandle*)id); + } + + if (dataChunk.code == BT_RIGIDBODY_CODE) + { + m_rigidBodies.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_CONSTRAINT_CODE) + { + m_constraints.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_QUANTIZED_BVH_CODE) + { + m_bvhs.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_TRIANLGE_INFO_MAP) + { + m_triangleInfoMaps.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_COLLISIONOBJECT_CODE) + { + m_collisionObjects.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_SHAPE_CODE) + { + m_collisionShapes.push_back((bStructHandle*) id); + } + + // if (dataChunk.code == GLOB) + // { + // m_glob = (bStructHandle*) id; + // } + } else + { + printf("unknown chunk\n"); + + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)dataPtrHead); + } + } else + { + printf("skipping BT_QUANTIZED_BVH_CODE due to broken DNA\n"); + } + + // next please! + dataPtr += seek; + + seek = getNextBlock(&dataChunk, dataPtr, mFlags); + if (seek < 0) + break; + } + +} + +void btBulletFile::addDataBlock(char* dataBlock) +{ + //mMain->addDatablock(dataBlock); +} + + + + +void btBulletFile::writeDNA(FILE* fp) +{ + + bChunkInd dataChunk; + dataChunk.code = DNA1; + dataChunk.dna_nr = 0; + dataChunk.nr = 1; +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { +#ifdef _WIN64 + dataChunk.len = sBulletDNAlen64; + dataChunk.oldPtr = sBulletDNAstr64; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); +#else + btAssert(0); +#endif + } + else + { +#ifndef _WIN64 + dataChunk.len = sBulletDNAlen; + dataChunk.oldPtr = sBulletDNAstr; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); +#else//_WIN64 + btAssert(0); +#endif//_WIN64 + } +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { + dataChunk.len = sBulletDNAlen64; + dataChunk.oldPtr = sBulletDNAstr64; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); + } + else + { + dataChunk.len = sBulletDNAlen; + dataChunk.oldPtr = sBulletDNAstr; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); + } +#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +} + + +void btBulletFile::parse(bool verboseDumpAllTypes) +{ +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { +#ifdef _WIN64 + + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + parseInternal(verboseDumpAllTypes,(char*)sBulletDNAstr64,sBulletDNAlen64); +#else + btAssert(0); +#endif + } + else + { +#ifndef _WIN64 + + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + parseInternal(verboseDumpAllTypes,m_DnaCopy,sBulletDNAlen); +#else + btAssert(0); +#endif + } +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + parseInternal(verboseDumpAllTypes,m_DnaCopy,sBulletDNAlen64); + } + else + { + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + parseInternal(verboseDumpAllTypes,m_DnaCopy,sBulletDNAlen); + } +#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +} + +// experimental +int btBulletFile::write(const char* fileName, bool fixupPointers) +{ + FILE *fp = fopen(fileName, "wb"); + if (fp) + { + char header[SIZEOFBLENDERHEADER] ; + memcpy(header, m_headerString, 7); + int endian= 1; + endian= ((char*)&endian)[0]; + + if (endian) + { + header[7] = '_'; + } else + { + header[7] = '-'; + } + if (VOID_IS_8) + { + header[8]='V'; + } else + { + header[8]='v'; + } + + header[9] = '2'; + header[10] = '7'; + header[11] = '5'; + + fwrite(header,SIZEOFBLENDERHEADER,1,fp); + + writeChunks(fp, fixupPointers); + + writeDNA(fp); + + fclose(fp); + + } else + { + printf("Error: cannot open file %s for writing\n",fileName); + return 0; + } + return 1; +} + + + +void btBulletFile::addStruct(const char* structType,void* data, int len, void* oldPtr, int code) +{ + + bParse::bChunkInd dataChunk; + dataChunk.code = code; + dataChunk.nr = 1; + dataChunk.len = len; + dataChunk.dna_nr = mMemoryDNA->getReverseType(structType); + dataChunk.oldPtr = oldPtr; + + ///Perform structure size validation + short* structInfo= mMemoryDNA->getStruct(dataChunk.dna_nr); + int elemBytes; + elemBytes= mMemoryDNA->getLength(structInfo[0]); +// int elemBytes = mMemoryDNA->getElementSize(structInfo[0],structInfo[1]); + assert(len==elemBytes); + + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data); + m_chunks.push_back(dataChunk); } \ No newline at end of file diff --git a/Extras/Serialize/BulletFileLoader/btBulletFile.h b/Extras/Serialize/BulletFileLoader/btBulletFile.h index 482ee641c..eda4134ce 100644 --- a/Extras/Serialize/BulletFileLoader/btBulletFile.h +++ b/Extras/Serialize/BulletFileLoader/btBulletFile.h @@ -1,78 +1,78 @@ -/* -bParse -Copyright (c) 2006-2010 Charlie C & Erwin Coumans http://gamekit.googlecode.com - -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_BULLET_FILE_H -#define BT_BULLET_FILE_H - - -#include "bFile.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "bDefines.h" - -#include "LinearMath/btSerializer.h" - - - -namespace bParse { - - // ----------------------------------------------------- // - class btBulletFile : public bFile - { - - - protected: - - char* m_DnaCopy; - - public: - - btAlignedObjectArray m_rigidBodies; - - btAlignedObjectArray m_collisionObjects; - - btAlignedObjectArray m_collisionShapes; - - btAlignedObjectArray m_constraints; - - btAlignedObjectArray m_bvhs; - - btAlignedObjectArray m_triangleInfoMaps; - - btBulletFile(); - - btBulletFile(const char* fileName); - - btBulletFile(char *memoryBuffer, int len); - - virtual ~btBulletFile(); - - virtual void addDataBlock(char* dataBlock); - - - // experimental - virtual int write(const char* fileName, bool fixupPointers=false); - - virtual void parse(bool verboseDumpAllTypes); - - virtual void parseData(); - - virtual void writeDNA(FILE* fp); - - void addStruct(const char* structType,void* data, int len, void* oldPtr, int code); - - }; -}; - -#endif //BT_BULLET_FILE_H +/* +bParse +Copyright (c) 2006-2010 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +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_BULLET_FILE_H +#define BT_BULLET_FILE_H + + +#include "bFile.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "bDefines.h" + +#include "LinearMath/btSerializer.h" + + + +namespace bParse { + + // ----------------------------------------------------- // + class btBulletFile : public bFile + { + + + protected: + + char* m_DnaCopy; + + public: + + btAlignedObjectArray m_rigidBodies; + + btAlignedObjectArray m_collisionObjects; + + btAlignedObjectArray m_collisionShapes; + + btAlignedObjectArray m_constraints; + + btAlignedObjectArray m_bvhs; + + btAlignedObjectArray m_triangleInfoMaps; + + btBulletFile(); + + btBulletFile(const char* fileName); + + btBulletFile(char *memoryBuffer, int len); + + virtual ~btBulletFile(); + + virtual void addDataBlock(char* dataBlock); + + + // experimental + virtual int write(const char* fileName, bool fixupPointers=false); + + virtual void parse(bool verboseDumpAllTypes); + + virtual void parseData(); + + virtual void writeDNA(FILE* fp); + + void addStruct(const char* structType,void* data, int len, void* oldPtr, int code); + + }; +}; + +#endif //BT_BULLET_FILE_H diff --git a/Extras/Serialize/BulletWorldImporter/CMakeLists.txt b/Extras/Serialize/BulletWorldImporter/CMakeLists.txt index 29adf3395..382a39d79 100644 --- a/Extras/Serialize/BulletWorldImporter/CMakeLists.txt +++ b/Extras/Serialize/BulletWorldImporter/CMakeLists.txt @@ -1,10 +1,10 @@ -INCLUDE_DIRECTORIES( - ${BULLET_PHYSICS_SOURCE_DIR}/src - ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader -) - -ADD_LIBRARY( -BulletWorldImporter -btBulletWorldImporter.cpp -btBulletWorldImporter.h -) +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src + ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader +) + +ADD_LIBRARY( +BulletWorldImporter +btBulletWorldImporter.cpp +btBulletWorldImporter.h +) diff --git a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp index b7b825794..f2a02d700 100644 --- a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp +++ b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp @@ -1,1205 +1,1205 @@ - -#include "btBulletWorldImporter.h" -#include "btBulletFile.h" - -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/Gimpact/btGImpactShape.h" - - -//#define USE_INTERNAL_EDGE_UTILITY -#ifdef USE_INTERNAL_EDGE_UTILITY -#include "BulletCollision/CollisionDispatch/btInternalEdgeUtility.h" -#endif //USE_INTERNAL_EDGE_UTILITY - -btBulletWorldImporter::btBulletWorldImporter(btDynamicsWorld* world) -:m_dynamicsWorld(world), -m_verboseDumpAllTypes(false) -{ -} - -btBulletWorldImporter::~btBulletWorldImporter() -{ -} - -void btBulletWorldImporter::deleteAllData() -{ - int i; - for (i=0;iaddIndexedMesh(meshPart,meshPart.m_indexType); - } - } - - return meshInterface; -} - -#ifdef USE_INTERNAL_EDGE_UTILITY -extern ContactAddedCallback gContactAddedCallback; - -static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) -{ - - btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); - //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE); - //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED); - return true; -} -#endif //USE_INTERNAL_EDGE_UTILITY - -btCollisionShape* btBulletWorldImporter::convertCollisionShape( btCollisionShapeData* shapeData ) -{ - btCollisionShape* shape = 0; - - switch (shapeData->m_shapeType) - { - case STATIC_PLANE_PROXYTYPE: - { - btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData; - btVector3 planeNormal,localScaling; - planeNormal.deSerializeFloat(planeData->m_planeNormal); - localScaling.deSerializeFloat(planeData->m_localScaling); - shape = createPlaneShape(planeNormal,planeData->m_planeConstant); - shape->setLocalScaling(localScaling); - - break; - } - case GIMPACT_SHAPE_PROXYTYPE: - { - btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData; - if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE) - { - btTriangleIndexVertexArray* meshInterface = createMeshInterface(gimpactData->m_meshInterface); - btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface); - btVector3 localScaling; - localScaling.deSerializeFloat(gimpactData->m_localScaling); - gimpactShape->setLocalScaling(localScaling); - gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin)); - gimpactShape->updateBound(); - shape = gimpactShape; - } else - { - printf("unsupported gimpact sub type\n"); - } - break; - } - - case CYLINDER_SHAPE_PROXYTYPE: - case CAPSULE_SHAPE_PROXYTYPE: - case BOX_SHAPE_PROXYTYPE: - case SPHERE_SHAPE_PROXYTYPE: - case MULTI_SPHERE_SHAPE_PROXYTYPE: - case CONVEX_HULL_SHAPE_PROXYTYPE: - { - btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData; - btVector3 implicitShapeDimensions; - implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions); - btVector3 localScaling; - localScaling.deSerializeFloat(bsd->m_localScaling); - btVector3 margin(bsd->m_collisionMargin,bsd->m_collisionMargin,bsd->m_collisionMargin); - switch (shapeData->m_shapeType) - { - case BOX_SHAPE_PROXYTYPE: - { - shape = createBoxShape(implicitShapeDimensions/localScaling+margin); - break; - } - case SPHERE_SHAPE_PROXYTYPE: - { - shape = createSphereShape(implicitShapeDimensions.getX()); - break; - } - case CAPSULE_SHAPE_PROXYTYPE: - { - btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData; - switch (capData->m_upAxis) - { - case 0: - { - shape = createCapsuleShapeX(implicitShapeDimensions.getY(),2*implicitShapeDimensions.getX()); - break; - } - case 1: - { - shape = createCapsuleShapeY(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getY()); - break; - } - case 2: - { - shape = createCapsuleShapeZ(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getZ()); - break; - } - default: - { - printf("error: wrong up axis for btCapsuleShape\n"); - } - - }; - - break; - } - case CYLINDER_SHAPE_PROXYTYPE: - { - btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData; - btVector3 halfExtents = implicitShapeDimensions+margin; - switch (cylData->m_upAxis) - { - case 0: - { - shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX()); - break; - } - case 1: - { - shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY()); - break; - } - case 2: - { - shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ()); - break; - } - default: - { - printf("unknown Cylinder up axis\n"); - } - - }; - - - - break; - } - case MULTI_SPHERE_SHAPE_PROXYTYPE: - { - btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd; - int numSpheres = mss->m_localPositionArraySize; - - btAlignedObjectArray tmpPos; - btAlignedObjectArray radii; - radii.resize(numSpheres); - tmpPos.resize(numSpheres); - int i; - for ( i=0;im_localPositionArrayPtr[i].m_pos); - radii[i] = mss->m_localPositionArrayPtr[i].m_radius; - } - shape = new btMultiSphereShape(&tmpPos[0],&radii[0],numSpheres); - break; - } - case CONVEX_HULL_SHAPE_PROXYTYPE: - { - // int sz = sizeof(btConvexHullShapeData); - // int sz2 = sizeof(btConvexInternalShapeData); - // int sz3 = sizeof(btCollisionShapeData); - btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd; - int numPoints = convexData->m_numUnscaledPoints; - - btAlignedObjectArray tmpPoints; - tmpPoints.resize(numPoints); - int i; - for ( i=0;im_unscaledPointsDoublePtr) - tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]); - if (convexData->m_unscaledPointsFloatPtr) - tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]); -#else - if (convexData->m_unscaledPointsFloatPtr) - tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]); - if (convexData->m_unscaledPointsDoublePtr) - tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]); -#endif //BT_USE_DOUBLE_PRECISION - } - btConvexHullShape* hullShape = createConvexHullShape(); - for (i=0;iaddPoint(tmpPoints[i]); - } - shape = hullShape; - break; - } - default: - { - printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType); - } - } - - if (shape) - { - shape->setMargin(bsd->m_collisionMargin); - btVector3 localScaling; - localScaling.deSerializeFloat(bsd->m_localScaling); - shape->setLocalScaling(localScaling); - - } - break; - } - case TRIANGLE_MESH_SHAPE_PROXYTYPE: - { - btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData; - btTriangleIndexVertexArray* meshInterface = createMeshInterface(trimesh->m_meshInterface); - if (!meshInterface->getNumSubParts()) - { - return 0; - } - - btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling); - meshInterface->setScaling(scaling); - - - btOptimizedBvh* bvh = 0; -#if 0 - if (trimesh->m_quantizedFloatBvh) - { - btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedFloatBvh); - if (bvhPtr && *bvhPtr) - { - bvh = *bvhPtr; - } else - { - bvh = createOptimizedBvh(); - bvh->deSerializeFloat(*trimesh->m_quantizedFloatBvh); - } - } - if (trimesh->m_quantizedDoubleBvh) - { - btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedDoubleBvh); - if (bvhPtr && *bvhPtr) - { - bvh = *bvhPtr; - } else - { - bvh = createOptimizedBvh(); - bvh->deSerializeDouble(*trimesh->m_quantizedDoubleBvh); - } - } -#endif - - - btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh); - trimeshShape->setMargin(trimesh->m_collisionMargin); - shape = trimeshShape; - - if (trimesh->m_triangleInfoMap) - { - btTriangleInfoMap* map = createTriangleInfoMap(); - map->deSerialize(*trimesh->m_triangleInfoMap); - trimeshShape->setTriangleInfoMap(map); - -#ifdef USE_INTERNAL_EDGE_UTILITY - gContactAddedCallback = btAdjustInternalEdgeContactsCallback; -#endif //USE_INTERNAL_EDGE_UTILITY - - } - - //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin); - break; - } - case COMPOUND_SHAPE_PROXYTYPE: - { - btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData; - btCompoundShape* compoundShape = createCompoundShape(); - - - btAlignedObjectArray childShapes; - for (int i=0;im_numChildShapes;i++) - { - btCollisionShape* childShape = convertCollisionShape(compoundData->m_childShapePtr[i].m_childShape); - if (childShape) - { - btTransform localTransform; - localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform); - compoundShape->addChildShape(localTransform,childShape); - } else - { - printf("error: couldn't create childShape for compoundShape\n"); - } - - } - shape = compoundShape; - - break; - } - default: - { - printf("unsupported shape type (%d)\n",shapeData->m_shapeType); - } - } - - return shape; - -} - -char* btBulletWorldImporter::duplicateName(const char* name) -{ - if (name) - { - int l = strlen(name); - char* newName = new char[l+1]; - memcpy(newName,name,l); - newName[l] = 0; - m_allocatedNames.push_back(newName); - return newName; - } - return 0; -} - - -bool btBulletWorldImporter::loadFileFromMemory( bParse::btBulletFile* bulletFile2) -{ - - int i; - bool ok = (bulletFile2->getFlags()& bParse::FD_OK)!=0; - - if (ok) - bulletFile2->parse(m_verboseDumpAllTypes); - else - return false; - - if (m_verboseDumpAllTypes) - { - bulletFile2->dumpChunks(bulletFile2->getFileDNA()); - } - - for (i=0;im_bvhs.size();i++) - { - btOptimizedBvh* bvh = createOptimizedBvh(); - - if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) - { - btQuantizedBvhDoubleData* bvhData = (btQuantizedBvhDoubleData*)bulletFile2->m_bvhs[i]; - bvh->deSerializeDouble(*bvhData); - } else - { - btQuantizedBvhFloatData* bvhData = (btQuantizedBvhFloatData*)bulletFile2->m_bvhs[i]; - bvh->deSerializeFloat(*bvhData); - } - m_bvhMap.insert(bulletFile2->m_bvhs[i],bvh); - } - - - - btHashMap shapeMap; - - for (i=0;im_collisionShapes.size();i++) - { - btCollisionShapeData* shapeData = (btCollisionShapeData*)bulletFile2->m_collisionShapes[i]; - btCollisionShape* shape = convertCollisionShape(shapeData); - if (shape) - { - // printf("shapeMap.insert(%x,%x)\n",shapeData,shape); - shapeMap.insert(shapeData,shape); - } - - if (shape&& shapeData->m_name) - { - char* newname = duplicateName(shapeData->m_name); - m_objectNameMap.insert(shape,newname); - m_nameShapeMap.insert(newname,shape); - } - } - - btHashMap bodyMap; - - for (i=0;im_rigidBodies.size();i++) - { - if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) - { - btRigidBodyDoubleData* colObjData = (btRigidBodyDoubleData*)bulletFile2->m_rigidBodies[i]; - btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); - btVector3 localInertia; - localInertia.setZero(); - btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); - if (shapePtr && *shapePtr) - { - btTransform startTransform; - startTransform.deSerializeDouble(colObjData->m_collisionObjectData.m_worldTransform); - // startTransform.setBasis(btMatrix3x3::getIdentity()); - btCollisionShape* shape = (btCollisionShape*)*shapePtr; - if (shape->isNonMoving()) - { - mass = 0.f; - } - - if (mass) - { - shape->calculateLocalInertia(mass,localInertia); - } - bool isDynamic = mass!=0.f; - - btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name); -#ifdef USE_INTERNAL_EDGE_UTILITY - if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) - { - btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; - if (trimesh->getTriangleInfoMap()) - { - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - } - } -#endif //USE_INTERNAL_EDGE_UTILITY - bodyMap.insert(colObjData,body); - } else - { - printf("error: no shape found\n"); - } - - } else - { - btRigidBodyFloatData* colObjData = (btRigidBodyFloatData*)bulletFile2->m_rigidBodies[i]; - btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); - btVector3 localInertia; - localInertia.setZero(); - btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); - if (shapePtr && *shapePtr) - { - btTransform startTransform; - startTransform.deSerializeFloat(colObjData->m_collisionObjectData.m_worldTransform); - // startTransform.setBasis(btMatrix3x3::getIdentity()); - btCollisionShape* shape = (btCollisionShape*)*shapePtr; - if (shape->isNonMoving()) - { - mass = 0.f; - } - if (mass) - { - shape->calculateLocalInertia(mass,localInertia); - } - bool isDynamic = mass!=0.f; - btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name); -#ifdef USE_INTERNAL_EDGE_UTILITY - if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) - { - btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; - if (trimesh->getTriangleInfoMap()) - { - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - } - } -#endif //USE_INTERNAL_EDGE_UTILITY - bodyMap.insert(colObjData,body); - } else - { - printf("error: no shape found\n"); - } - } - } - - for (i=0;im_collisionObjects.size();i++) - { - if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) - { - btCollisionObjectDoubleData* colObjData = (btCollisionObjectDoubleData*)bulletFile2->m_collisionObjects[i]; - btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionShape); - if (shapePtr && *shapePtr) - { - btTransform startTransform; - startTransform.deSerializeDouble(colObjData->m_worldTransform); - btCollisionShape* shape = (btCollisionShape*)*shapePtr; - btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name); - -#ifdef USE_INTERNAL_EDGE_UTILITY - if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) - { - btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; - if (trimesh->getTriangleInfoMap()) - { - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - } - } -#endif //USE_INTERNAL_EDGE_UTILITY - bodyMap.insert(colObjData,body); - } else - { - printf("error: no shape found\n"); - } - - } else - { - btCollisionObjectFloatData* colObjData = (btCollisionObjectFloatData*)bulletFile2->m_collisionObjects[i]; - btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionShape); - if (shapePtr && *shapePtr) - { - btTransform startTransform; - startTransform.deSerializeFloat(colObjData->m_worldTransform); - btCollisionShape* shape = (btCollisionShape*)*shapePtr; - btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name); - -#ifdef USE_INTERNAL_EDGE_UTILITY - if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) - { - btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; - if (trimesh->getTriangleInfoMap()) - { - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - } - } -#endif //USE_INTERNAL_EDGE_UTILITY - bodyMap.insert(colObjData,body); - } else - { - printf("error: no shape found\n"); - } - } - - printf("bla"); - } - - - for (i=0;im_constraints.size();i++) - { - btTypedConstraintData* constraintData = (btTypedConstraintData*)bulletFile2->m_constraints[i]; - btCollisionObject** colAptr = bodyMap.find(constraintData->m_rbA); - btCollisionObject** colBptr = bodyMap.find(constraintData->m_rbB); - - btRigidBody* rbA = 0; - btRigidBody* rbB = 0; - - if (colAptr) - { - rbA = btRigidBody::upcast(*colAptr); - if (!rbA) - rbA = &getFixedBody(); - } - if (colBptr) - { - rbB = btRigidBody::upcast(*colBptr); - if (!rbB) - rbB = &getFixedBody(); - } - - btTypedConstraint* constraint = 0; - - switch (constraintData->m_objectType) - { - case POINT2POINT_CONSTRAINT_TYPE: - { - if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) - { - btPoint2PointConstraintDoubleData* p2pData = (btPoint2PointConstraintDoubleData*)constraintData; - if (rbA && rbB) - { - btVector3 pivotInA,pivotInB; - pivotInA.deSerializeDouble(p2pData->m_pivotInA); - pivotInB.deSerializeDouble(p2pData->m_pivotInB); - constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); - } else - { - btVector3 pivotInA; - pivotInA.deSerializeDouble(p2pData->m_pivotInA); - constraint = createPoint2PointConstraint(*rbA,pivotInA); - } - } else - { - btPoint2PointConstraintFloatData* p2pData = (btPoint2PointConstraintFloatData*)constraintData; - if (rbA&& rbB) - { - btVector3 pivotInA,pivotInB; - pivotInA.deSerializeFloat(p2pData->m_pivotInA); - pivotInB.deSerializeFloat(p2pData->m_pivotInB); - constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); - - } else - { - btVector3 pivotInA; - pivotInA.deSerializeFloat(p2pData->m_pivotInA); - constraint = createPoint2PointConstraint(*rbA,pivotInA); - } - - } - - break; - } - case HINGE_CONSTRAINT_TYPE: - { - btHingeConstraint* hinge = 0; - - if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) - { - btHingeConstraintDoubleData* hingeData = (btHingeConstraintDoubleData*)constraintData; - if (rbA&& rbB) - { - btTransform rbAFrame,rbBFrame; - rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); - rbBFrame.deSerializeDouble(hingeData->m_rbBFrame); - hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); - } else - { - btTransform rbAFrame; - rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); - hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); - } - if (hingeData->m_enableAngularMotor) - { - hinge->enableAngularMotor(true,hingeData->m_motorTargetVelocity,hingeData->m_maxMotorImpulse); - } - hinge->setAngularOnly(hingeData->m_angularOnly!=0); - hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); - } else - { - btHingeConstraintFloatData* hingeData = (btHingeConstraintFloatData*)constraintData; - if (rbA&& rbB) - { - btTransform rbAFrame,rbBFrame; - rbAFrame.deSerializeFloat(hingeData->m_rbAFrame); - rbBFrame.deSerializeFloat(hingeData->m_rbBFrame); - hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); - } else - { - btTransform rbAFrame; - rbAFrame.deSerializeFloat(hingeData->m_rbAFrame); - hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); - } - if (hingeData->m_enableAngularMotor) - { - hinge->enableAngularMotor(true,hingeData->m_motorTargetVelocity,hingeData->m_maxMotorImpulse); - } - hinge->setAngularOnly(hingeData->m_angularOnly!=0); - hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); - } - - constraint = hinge; - break; - - } - case CONETWIST_CONSTRAINT_TYPE: - { - btConeTwistConstraintData* coneData = (btConeTwistConstraintData*)constraintData; - btConeTwistConstraint* coneTwist = 0; - - if (rbA&& rbB) - { - btTransform rbAFrame,rbBFrame; - rbAFrame.deSerializeFloat(coneData->m_rbAFrame); - rbBFrame.deSerializeFloat(coneData->m_rbBFrame); - coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame); - } else - { - btTransform rbAFrame; - rbAFrame.deSerializeFloat(coneData->m_rbAFrame); - coneTwist = createConeTwistConstraint(*rbA,rbAFrame); - } - coneTwist->setLimit(coneData->m_swingSpan1,coneData->m_swingSpan2,coneData->m_twistSpan,coneData->m_limitSoftness,coneData->m_biasFactor,coneData->m_relaxationFactor); - coneTwist->setDamping(coneData->m_damping); - - constraint = coneTwist; - break; - } - - case D6_CONSTRAINT_TYPE: - { - btGeneric6DofConstraintData* dofData = (btGeneric6DofConstraintData*)constraintData; - btGeneric6DofConstraint* dof = 0; - - if (rbA&& rbB) - { - btTransform rbAFrame,rbBFrame; - rbAFrame.deSerializeFloat(dofData->m_rbAFrame); - rbBFrame.deSerializeFloat(dofData->m_rbBFrame); - dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); - } else - { - btTransform rbBFrame; - rbBFrame.deSerializeFloat(dofData->m_rbBFrame); - dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); - } - btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; - angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit); - angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit); - linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit); - linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit); - - dof->setAngularLowerLimit(angLowerLimit); - dof->setAngularUpperLimit(angUpperLimit); - dof->setLinearLowerLimit(linLowerLimit); - dof->setLinearUpperLimit(linUpperlimit); - - constraint = dof; - break; - } - case SLIDER_CONSTRAINT_TYPE: - { - btSliderConstraintData* sliderData = (btSliderConstraintData*)constraintData; - btSliderConstraint* slider = 0; - if (rbA&& rbB) - { - btTransform rbAFrame,rbBFrame; - rbAFrame.deSerializeFloat(sliderData->m_rbAFrame); - rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); - slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); - } else - { - btTransform rbBFrame; - rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); - slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); - } - slider->setLowerLinLimit(sliderData->m_linearLowerLimit); - slider->setUpperLinLimit(sliderData->m_linearUpperLimit); - slider->setLowerAngLimit(sliderData->m_angularLowerLimit); - slider->setUpperAngLimit(sliderData->m_angularUpperLimit); - slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0); - constraint = slider; - break; - } - - default: - { - printf("unknown constraint type\n"); - } - }; - - if (constraint) - { - constraint->setDbgDrawSize(constraintData->m_dbgDrawSize); - if (constraintData->m_name) - { - char* newname = duplicateName(constraintData->m_name); - m_nameConstraintMap.insert(newname,constraint); - m_objectNameMap.insert(constraint,newname); - } - if(m_dynamicsWorld) - m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0); - } - - } - - return true; -} - - - -btCollisionObject* btBulletWorldImporter::createCollisionObject(const btTransform& startTransform,btCollisionShape* shape, const char* bodyName) -{ - return createRigidBody(false,0,startTransform,shape,bodyName); -} - - - -btRigidBody* btBulletWorldImporter::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape,const char* bodyName) -{ - btVector3 localInertia; - localInertia.setZero(); - - if (mass) - shape->calculateLocalInertia(mass,localInertia); - - btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); - body->setWorldTransform(startTransform); - - if (m_dynamicsWorld) - m_dynamicsWorld->addRigidBody(body); - - if (bodyName) - { - char* newname = duplicateName(bodyName); - m_objectNameMap.insert(body,newname); - m_nameBodyMap.insert(newname,body); - } - m_allocatedRigidBodies.push_back(body); - return body; - -} - -btCollisionShape* btBulletWorldImporter::createPlaneShape(const btVector3& planeNormal,btScalar planeConstant) -{ - btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal,planeConstant); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} -btCollisionShape* btBulletWorldImporter::createBoxShape(const btVector3& halfExtents) -{ - btBoxShape* shape = new btBoxShape(halfExtents); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} -btCollisionShape* btBulletWorldImporter::createSphereShape(btScalar radius) -{ - btSphereShape* shape = new btSphereShape(radius); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - - -btCollisionShape* btBulletWorldImporter::createCapsuleShapeX(btScalar radius, btScalar height) -{ - btCapsuleShapeX* shape = new btCapsuleShapeX(radius,height); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btCollisionShape* btBulletWorldImporter::createCapsuleShapeY(btScalar radius, btScalar height) -{ - btCapsuleShape* shape = new btCapsuleShape(radius,height); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btCollisionShape* btBulletWorldImporter::createCapsuleShapeZ(btScalar radius, btScalar height) -{ - btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius,height); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btCollisionShape* btBulletWorldImporter::createCylinderShapeX(btScalar radius,btScalar height) -{ - btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height,radius,radius)); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btCollisionShape* btBulletWorldImporter::createCylinderShapeY(btScalar radius,btScalar height) -{ - btCylinderShape* shape = new btCylinderShape(btVector3(radius,height,radius)); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btCollisionShape* btBulletWorldImporter::createCylinderShapeZ(btScalar radius,btScalar height) -{ - btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius,radius,height)); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btTriangleIndexVertexArray* btBulletWorldImporter::createTriangleMeshContainer() -{ - btTriangleIndexVertexArray* in = new btTriangleIndexVertexArray(); - m_allocatedTriangleIndexArrays.push_back(in); - return in; -} - -btOptimizedBvh* btBulletWorldImporter::createOptimizedBvh() -{ - btOptimizedBvh* bvh = new btOptimizedBvh(); - m_allocatedBvhs.push_back(bvh); - return bvh; -} - - -btTriangleInfoMap* btBulletWorldImporter::createTriangleInfoMap() -{ - btTriangleInfoMap* tim = new btTriangleInfoMap(); - m_allocatedTriangleInfoMaps.push_back(tim); - return tim; -} - -btBvhTriangleMeshShape* btBulletWorldImporter::createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh) -{ - if (bvh) - { - btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh,bvh->isQuantized(), false); - bvhTriMesh->setOptimizedBvh(bvh); - m_allocatedCollisionShapes.push_back(bvhTriMesh); - return bvhTriMesh; - } - - btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh,true); - m_allocatedCollisionShapes.push_back(ts); - return ts; - -} -btCollisionShape* btBulletWorldImporter::createConvexTriangleMeshShape(btStridingMeshInterface* trimesh) -{ - return 0; -} -btGImpactMeshShape* btBulletWorldImporter::createGimpactShape(btStridingMeshInterface* trimesh) -{ - btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh); - m_allocatedCollisionShapes.push_back(shape); - return shape; - -} -btConvexHullShape* btBulletWorldImporter::createConvexHullShape() -{ - btConvexHullShape* shape = new btConvexHullShape(); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btCompoundShape* btBulletWorldImporter::createCompoundShape() -{ - btCompoundShape* shape = new btCompoundShape(); - m_allocatedCollisionShapes.push_back(shape); - return shape; -} - -btRigidBody& btBulletWorldImporter::getFixedBody() -{ - static btRigidBody s_fixed(0, 0,0); - s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.))); - return s_fixed; -} - -btPoint2PointConstraint* btBulletWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB) -{ - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,rbB,pivotInA,pivotInB); - m_allocatedConstraints.push_back(p2p); - return p2p; -} - -btPoint2PointConstraint* btBulletWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA) -{ - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,pivotInA); - m_allocatedConstraints.push_back(p2p); - return p2p; -} - - -btHingeConstraint* btBulletWorldImporter::createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA) -{ - btHingeConstraint* hinge = new btHingeConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA); - m_allocatedConstraints.push_back(hinge); - return hinge; -} - -btHingeConstraint* btBulletWorldImporter::createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA) -{ - btHingeConstraint* hinge = new btHingeConstraint(rbA,rbAFrame,useReferenceFrameA); - m_allocatedConstraints.push_back(hinge); - return hinge; -} - -btConeTwistConstraint* btBulletWorldImporter::createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame) -{ - btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbB,rbAFrame,rbBFrame); - m_allocatedConstraints.push_back(cone); - return cone; -} - -btConeTwistConstraint* btBulletWorldImporter::createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame) -{ - btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbAFrame); - m_allocatedConstraints.push_back(cone); - return cone; -} - - -btGeneric6DofConstraint* btBulletWorldImporter::createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) -{ - btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); - m_allocatedConstraints.push_back(dof); - return dof; -} - -btGeneric6DofConstraint* btBulletWorldImporter::createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB) -{ - btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbB,frameInB,useLinearReferenceFrameB); - m_allocatedConstraints.push_back(dof); - return dof; -} -btSliderConstraint* btBulletWorldImporter::createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) -{ - btSliderConstraint* slider = new btSliderConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); - m_allocatedConstraints.push_back(slider); - return slider; -} - -btSliderConstraint* btBulletWorldImporter::createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA) -{ - btSliderConstraint* slider = new btSliderConstraint(rbB,frameInB,useLinearReferenceFrameA); - m_allocatedConstraints.push_back(slider); - return slider; -} - - - // query for data -int btBulletWorldImporter::getNumCollisionShapes() const -{ - return m_allocatedCollisionShapes.size(); -} - -btCollisionShape* btBulletWorldImporter::getCollisionShapeByIndex(int index) -{ - return m_allocatedCollisionShapes[index]; -} - -btCollisionShape* btBulletWorldImporter::getCollisionShapeByName(const char* name) -{ - btCollisionShape** shapePtr = m_nameShapeMap.find(name); - if (shapePtr&& *shapePtr) - { - return *shapePtr; - } - return 0; -} - -btRigidBody* btBulletWorldImporter::getRigidBodyByName(const char* name) -{ - btRigidBody** bodyPtr = m_nameBodyMap.find(name); - if (bodyPtr && *bodyPtr) - { - return *bodyPtr; - } - return 0; -} - -btTypedConstraint* btBulletWorldImporter::getConstraintByName(const char* name) -{ - btTypedConstraint** constraintPtr = m_nameConstraintMap.find(name); - if (constraintPtr && *constraintPtr) - { - return *constraintPtr; - } - return 0; -} - -const char* btBulletWorldImporter::getNameForPointer(const void* ptr) const -{ - const char*const * namePtr = m_objectNameMap.find(ptr); - if (namePtr && *namePtr) - return *namePtr; - return 0; -} - - -int btBulletWorldImporter::getNumRigidBodies() const -{ - return m_allocatedRigidBodies.size(); -} - -btCollisionObject* btBulletWorldImporter::getRigidBodyByIndex(int index) const -{ - return m_allocatedRigidBodies[index]; -} -int btBulletWorldImporter::getNumConstraints() const -{ - return m_allocatedConstraints.size(); -} - -btTypedConstraint* btBulletWorldImporter::getConstraintByIndex(int index) const -{ - return m_allocatedConstraints[index]; -} - -int btBulletWorldImporter::getNumBvhs() const -{ - return m_allocatedBvhs.size(); -} - btOptimizedBvh* btBulletWorldImporter::getBvhByIndex(int index) const -{ - return m_allocatedBvhs[index]; -} - -int btBulletWorldImporter::getNumTriangleInfoMaps() const -{ - return m_allocatedTriangleInfoMaps.size(); -} - -btTriangleInfoMap* btBulletWorldImporter::getTriangleInfoMapByIndex(int index) const -{ - return m_allocatedTriangleInfoMaps[index]; -} - + +#include "btBulletWorldImporter.h" +#include "btBulletFile.h" + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" + + +//#define USE_INTERNAL_EDGE_UTILITY +#ifdef USE_INTERNAL_EDGE_UTILITY +#include "BulletCollision/CollisionDispatch/btInternalEdgeUtility.h" +#endif //USE_INTERNAL_EDGE_UTILITY + +btBulletWorldImporter::btBulletWorldImporter(btDynamicsWorld* world) +:m_dynamicsWorld(world), +m_verboseDumpAllTypes(false) +{ +} + +btBulletWorldImporter::~btBulletWorldImporter() +{ +} + +void btBulletWorldImporter::deleteAllData() +{ + int i; + for (i=0;iaddIndexedMesh(meshPart,meshPart.m_indexType); + } + } + + return meshInterface; +} + +#ifdef USE_INTERNAL_EDGE_UTILITY +extern ContactAddedCallback gContactAddedCallback; + +static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); + //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE); + //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED); + return true; +} +#endif //USE_INTERNAL_EDGE_UTILITY + +btCollisionShape* btBulletWorldImporter::convertCollisionShape( btCollisionShapeData* shapeData ) +{ + btCollisionShape* shape = 0; + + switch (shapeData->m_shapeType) + { + case STATIC_PLANE_PROXYTYPE: + { + btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData; + btVector3 planeNormal,localScaling; + planeNormal.deSerializeFloat(planeData->m_planeNormal); + localScaling.deSerializeFloat(planeData->m_localScaling); + shape = createPlaneShape(planeNormal,planeData->m_planeConstant); + shape->setLocalScaling(localScaling); + + break; + } + case GIMPACT_SHAPE_PROXYTYPE: + { + btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData; + if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE) + { + btTriangleIndexVertexArray* meshInterface = createMeshInterface(gimpactData->m_meshInterface); + btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface); + btVector3 localScaling; + localScaling.deSerializeFloat(gimpactData->m_localScaling); + gimpactShape->setLocalScaling(localScaling); + gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin)); + gimpactShape->updateBound(); + shape = gimpactShape; + } else + { + printf("unsupported gimpact sub type\n"); + } + break; + } + + case CYLINDER_SHAPE_PROXYTYPE: + case CAPSULE_SHAPE_PROXYTYPE: + case BOX_SHAPE_PROXYTYPE: + case SPHERE_SHAPE_PROXYTYPE: + case MULTI_SPHERE_SHAPE_PROXYTYPE: + case CONVEX_HULL_SHAPE_PROXYTYPE: + { + btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData; + btVector3 implicitShapeDimensions; + implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions); + btVector3 localScaling; + localScaling.deSerializeFloat(bsd->m_localScaling); + btVector3 margin(bsd->m_collisionMargin,bsd->m_collisionMargin,bsd->m_collisionMargin); + switch (shapeData->m_shapeType) + { + case BOX_SHAPE_PROXYTYPE: + { + shape = createBoxShape(implicitShapeDimensions/localScaling+margin); + break; + } + case SPHERE_SHAPE_PROXYTYPE: + { + shape = createSphereShape(implicitShapeDimensions.getX()); + break; + } + case CAPSULE_SHAPE_PROXYTYPE: + { + btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData; + switch (capData->m_upAxis) + { + case 0: + { + shape = createCapsuleShapeX(implicitShapeDimensions.getY(),2*implicitShapeDimensions.getX()); + break; + } + case 1: + { + shape = createCapsuleShapeY(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getY()); + break; + } + case 2: + { + shape = createCapsuleShapeZ(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getZ()); + break; + } + default: + { + printf("error: wrong up axis for btCapsuleShape\n"); + } + + }; + + break; + } + case CYLINDER_SHAPE_PROXYTYPE: + { + btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData; + btVector3 halfExtents = implicitShapeDimensions+margin; + switch (cylData->m_upAxis) + { + case 0: + { + shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX()); + break; + } + case 1: + { + shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY()); + break; + } + case 2: + { + shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ()); + break; + } + default: + { + printf("unknown Cylinder up axis\n"); + } + + }; + + + + break; + } + case MULTI_SPHERE_SHAPE_PROXYTYPE: + { + btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd; + int numSpheres = mss->m_localPositionArraySize; + + btAlignedObjectArray tmpPos; + btAlignedObjectArray radii; + radii.resize(numSpheres); + tmpPos.resize(numSpheres); + int i; + for ( i=0;im_localPositionArrayPtr[i].m_pos); + radii[i] = mss->m_localPositionArrayPtr[i].m_radius; + } + shape = new btMultiSphereShape(&tmpPos[0],&radii[0],numSpheres); + break; + } + case CONVEX_HULL_SHAPE_PROXYTYPE: + { + // int sz = sizeof(btConvexHullShapeData); + // int sz2 = sizeof(btConvexInternalShapeData); + // int sz3 = sizeof(btCollisionShapeData); + btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd; + int numPoints = convexData->m_numUnscaledPoints; + + btAlignedObjectArray tmpPoints; + tmpPoints.resize(numPoints); + int i; + for ( i=0;im_unscaledPointsDoublePtr) + tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]); + if (convexData->m_unscaledPointsFloatPtr) + tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]); +#else + if (convexData->m_unscaledPointsFloatPtr) + tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]); + if (convexData->m_unscaledPointsDoublePtr) + tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]); +#endif //BT_USE_DOUBLE_PRECISION + } + btConvexHullShape* hullShape = createConvexHullShape(); + for (i=0;iaddPoint(tmpPoints[i]); + } + shape = hullShape; + break; + } + default: + { + printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType); + } + } + + if (shape) + { + shape->setMargin(bsd->m_collisionMargin); + btVector3 localScaling; + localScaling.deSerializeFloat(bsd->m_localScaling); + shape->setLocalScaling(localScaling); + + } + break; + } + case TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData; + btTriangleIndexVertexArray* meshInterface = createMeshInterface(trimesh->m_meshInterface); + if (!meshInterface->getNumSubParts()) + { + return 0; + } + + btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling); + meshInterface->setScaling(scaling); + + + btOptimizedBvh* bvh = 0; +#if 0 + if (trimesh->m_quantizedFloatBvh) + { + btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedFloatBvh); + if (bvhPtr && *bvhPtr) + { + bvh = *bvhPtr; + } else + { + bvh = createOptimizedBvh(); + bvh->deSerializeFloat(*trimesh->m_quantizedFloatBvh); + } + } + if (trimesh->m_quantizedDoubleBvh) + { + btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedDoubleBvh); + if (bvhPtr && *bvhPtr) + { + bvh = *bvhPtr; + } else + { + bvh = createOptimizedBvh(); + bvh->deSerializeDouble(*trimesh->m_quantizedDoubleBvh); + } + } +#endif + + + btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh); + trimeshShape->setMargin(trimesh->m_collisionMargin); + shape = trimeshShape; + + if (trimesh->m_triangleInfoMap) + { + btTriangleInfoMap* map = createTriangleInfoMap(); + map->deSerialize(*trimesh->m_triangleInfoMap); + trimeshShape->setTriangleInfoMap(map); + +#ifdef USE_INTERNAL_EDGE_UTILITY + gContactAddedCallback = btAdjustInternalEdgeContactsCallback; +#endif //USE_INTERNAL_EDGE_UTILITY + + } + + //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin); + break; + } + case COMPOUND_SHAPE_PROXYTYPE: + { + btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData; + btCompoundShape* compoundShape = createCompoundShape(); + + + btAlignedObjectArray childShapes; + for (int i=0;im_numChildShapes;i++) + { + btCollisionShape* childShape = convertCollisionShape(compoundData->m_childShapePtr[i].m_childShape); + if (childShape) + { + btTransform localTransform; + localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform); + compoundShape->addChildShape(localTransform,childShape); + } else + { + printf("error: couldn't create childShape for compoundShape\n"); + } + + } + shape = compoundShape; + + break; + } + default: + { + printf("unsupported shape type (%d)\n",shapeData->m_shapeType); + } + } + + return shape; + +} + +char* btBulletWorldImporter::duplicateName(const char* name) +{ + if (name) + { + int l = strlen(name); + char* newName = new char[l+1]; + memcpy(newName,name,l); + newName[l] = 0; + m_allocatedNames.push_back(newName); + return newName; + } + return 0; +} + + +bool btBulletWorldImporter::loadFileFromMemory( bParse::btBulletFile* bulletFile2) +{ + + int i; + bool ok = (bulletFile2->getFlags()& bParse::FD_OK)!=0; + + if (ok) + bulletFile2->parse(m_verboseDumpAllTypes); + else + return false; + + if (m_verboseDumpAllTypes) + { + bulletFile2->dumpChunks(bulletFile2->getFileDNA()); + } + + for (i=0;im_bvhs.size();i++) + { + btOptimizedBvh* bvh = createOptimizedBvh(); + + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btQuantizedBvhDoubleData* bvhData = (btQuantizedBvhDoubleData*)bulletFile2->m_bvhs[i]; + bvh->deSerializeDouble(*bvhData); + } else + { + btQuantizedBvhFloatData* bvhData = (btQuantizedBvhFloatData*)bulletFile2->m_bvhs[i]; + bvh->deSerializeFloat(*bvhData); + } + m_bvhMap.insert(bulletFile2->m_bvhs[i],bvh); + } + + + + btHashMap shapeMap; + + for (i=0;im_collisionShapes.size();i++) + { + btCollisionShapeData* shapeData = (btCollisionShapeData*)bulletFile2->m_collisionShapes[i]; + btCollisionShape* shape = convertCollisionShape(shapeData); + if (shape) + { + // printf("shapeMap.insert(%x,%x)\n",shapeData,shape); + shapeMap.insert(shapeData,shape); + } + + if (shape&& shapeData->m_name) + { + char* newname = duplicateName(shapeData->m_name); + m_objectNameMap.insert(shape,newname); + m_nameShapeMap.insert(newname,shape); + } + } + + btHashMap bodyMap; + + for (i=0;im_rigidBodies.size();i++) + { + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btRigidBodyDoubleData* colObjData = (btRigidBodyDoubleData*)bulletFile2->m_rigidBodies[i]; + btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); + btVector3 localInertia; + localInertia.setZero(); + btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + startTransform.deSerializeDouble(colObjData->m_collisionObjectData.m_worldTransform); + // startTransform.setBasis(btMatrix3x3::getIdentity()); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + if (shape->isNonMoving()) + { + mass = 0.f; + } + + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + bool isDynamic = mass!=0.f; + + btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name); +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } + + } else + { + btRigidBodyFloatData* colObjData = (btRigidBodyFloatData*)bulletFile2->m_rigidBodies[i]; + btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); + btVector3 localInertia; + localInertia.setZero(); + btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + startTransform.deSerializeFloat(colObjData->m_collisionObjectData.m_worldTransform); + // startTransform.setBasis(btMatrix3x3::getIdentity()); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + if (shape->isNonMoving()) + { + mass = 0.f; + } + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + bool isDynamic = mass!=0.f; + btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name); +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } + } + } + + for (i=0;im_collisionObjects.size();i++) + { + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btCollisionObjectDoubleData* colObjData = (btCollisionObjectDoubleData*)bulletFile2->m_collisionObjects[i]; + btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + startTransform.deSerializeDouble(colObjData->m_worldTransform); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name); + +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } + + } else + { + btCollisionObjectFloatData* colObjData = (btCollisionObjectFloatData*)bulletFile2->m_collisionObjects[i]; + btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + startTransform.deSerializeFloat(colObjData->m_worldTransform); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name); + +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } + } + + printf("bla"); + } + + + for (i=0;im_constraints.size();i++) + { + btTypedConstraintData* constraintData = (btTypedConstraintData*)bulletFile2->m_constraints[i]; + btCollisionObject** colAptr = bodyMap.find(constraintData->m_rbA); + btCollisionObject** colBptr = bodyMap.find(constraintData->m_rbB); + + btRigidBody* rbA = 0; + btRigidBody* rbB = 0; + + if (colAptr) + { + rbA = btRigidBody::upcast(*colAptr); + if (!rbA) + rbA = &getFixedBody(); + } + if (colBptr) + { + rbB = btRigidBody::upcast(*colBptr); + if (!rbB) + rbB = &getFixedBody(); + } + + btTypedConstraint* constraint = 0; + + switch (constraintData->m_objectType) + { + case POINT2POINT_CONSTRAINT_TYPE: + { + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btPoint2PointConstraintDoubleData* p2pData = (btPoint2PointConstraintDoubleData*)constraintData; + if (rbA && rbB) + { + btVector3 pivotInA,pivotInB; + pivotInA.deSerializeDouble(p2pData->m_pivotInA); + pivotInB.deSerializeDouble(p2pData->m_pivotInB); + constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); + } else + { + btVector3 pivotInA; + pivotInA.deSerializeDouble(p2pData->m_pivotInA); + constraint = createPoint2PointConstraint(*rbA,pivotInA); + } + } else + { + btPoint2PointConstraintFloatData* p2pData = (btPoint2PointConstraintFloatData*)constraintData; + if (rbA&& rbB) + { + btVector3 pivotInA,pivotInB; + pivotInA.deSerializeFloat(p2pData->m_pivotInA); + pivotInB.deSerializeFloat(p2pData->m_pivotInB); + constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); + + } else + { + btVector3 pivotInA; + pivotInA.deSerializeFloat(p2pData->m_pivotInA); + constraint = createPoint2PointConstraint(*rbA,pivotInA); + } + + } + + break; + } + case HINGE_CONSTRAINT_TYPE: + { + btHingeConstraint* hinge = 0; + + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btHingeConstraintDoubleData* hingeData = (btHingeConstraintDoubleData*)constraintData; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); + rbBFrame.deSerializeDouble(hingeData->m_rbBFrame); + hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); + hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); + } + if (hingeData->m_enableAngularMotor) + { + hinge->enableAngularMotor(true,hingeData->m_motorTargetVelocity,hingeData->m_maxMotorImpulse); + } + hinge->setAngularOnly(hingeData->m_angularOnly!=0); + hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); + } else + { + btHingeConstraintFloatData* hingeData = (btHingeConstraintFloatData*)constraintData; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(hingeData->m_rbAFrame); + rbBFrame.deSerializeFloat(hingeData->m_rbBFrame); + hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeFloat(hingeData->m_rbAFrame); + hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); + } + if (hingeData->m_enableAngularMotor) + { + hinge->enableAngularMotor(true,hingeData->m_motorTargetVelocity,hingeData->m_maxMotorImpulse); + } + hinge->setAngularOnly(hingeData->m_angularOnly!=0); + hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); + } + + constraint = hinge; + break; + + } + case CONETWIST_CONSTRAINT_TYPE: + { + btConeTwistConstraintData* coneData = (btConeTwistConstraintData*)constraintData; + btConeTwistConstraint* coneTwist = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(coneData->m_rbAFrame); + rbBFrame.deSerializeFloat(coneData->m_rbBFrame); + coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeFloat(coneData->m_rbAFrame); + coneTwist = createConeTwistConstraint(*rbA,rbAFrame); + } + coneTwist->setLimit(coneData->m_swingSpan1,coneData->m_swingSpan2,coneData->m_twistSpan,coneData->m_limitSoftness,coneData->m_biasFactor,coneData->m_relaxationFactor); + coneTwist->setDamping(coneData->m_damping); + + constraint = coneTwist; + break; + } + + case D6_CONSTRAINT_TYPE: + { + btGeneric6DofConstraintData* dofData = (btGeneric6DofConstraintData*)constraintData; + btGeneric6DofConstraint* dof = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(dofData->m_rbAFrame); + rbBFrame.deSerializeFloat(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + btTransform rbBFrame; + rbBFrame.deSerializeFloat(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit); + angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit); + linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit); + linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit); + + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + + constraint = dof; + break; + } + case SLIDER_CONSTRAINT_TYPE: + { + btSliderConstraintData* sliderData = (btSliderConstraintData*)constraintData; + btSliderConstraint* slider = 0; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(sliderData->m_rbAFrame); + rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } else + { + btTransform rbBFrame; + rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } + slider->setLowerLinLimit(sliderData->m_linearLowerLimit); + slider->setUpperLinLimit(sliderData->m_linearUpperLimit); + slider->setLowerAngLimit(sliderData->m_angularLowerLimit); + slider->setUpperAngLimit(sliderData->m_angularUpperLimit); + slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0); + constraint = slider; + break; + } + + default: + { + printf("unknown constraint type\n"); + } + }; + + if (constraint) + { + constraint->setDbgDrawSize(constraintData->m_dbgDrawSize); + if (constraintData->m_name) + { + char* newname = duplicateName(constraintData->m_name); + m_nameConstraintMap.insert(newname,constraint); + m_objectNameMap.insert(constraint,newname); + } + if(m_dynamicsWorld) + m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0); + } + + } + + return true; +} + + + +btCollisionObject* btBulletWorldImporter::createCollisionObject(const btTransform& startTransform,btCollisionShape* shape, const char* bodyName) +{ + return createRigidBody(false,0,startTransform,shape,bodyName); +} + + + +btRigidBody* btBulletWorldImporter::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape,const char* bodyName) +{ + btVector3 localInertia; + localInertia.setZero(); + + if (mass) + shape->calculateLocalInertia(mass,localInertia); + + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + body->setWorldTransform(startTransform); + + if (m_dynamicsWorld) + m_dynamicsWorld->addRigidBody(body); + + if (bodyName) + { + char* newname = duplicateName(bodyName); + m_objectNameMap.insert(body,newname); + m_nameBodyMap.insert(newname,body); + } + m_allocatedRigidBodies.push_back(body); + return body; + +} + +btCollisionShape* btBulletWorldImporter::createPlaneShape(const btVector3& planeNormal,btScalar planeConstant) +{ + btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal,planeConstant); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} +btCollisionShape* btBulletWorldImporter::createBoxShape(const btVector3& halfExtents) +{ + btBoxShape* shape = new btBoxShape(halfExtents); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} +btCollisionShape* btBulletWorldImporter::createSphereShape(btScalar radius) +{ + btSphereShape* shape = new btSphereShape(radius); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + + +btCollisionShape* btBulletWorldImporter::createCapsuleShapeX(btScalar radius, btScalar height) +{ + btCapsuleShapeX* shape = new btCapsuleShapeX(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btBulletWorldImporter::createCapsuleShapeY(btScalar radius, btScalar height) +{ + btCapsuleShape* shape = new btCapsuleShape(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btBulletWorldImporter::createCapsuleShapeZ(btScalar radius, btScalar height) +{ + btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btBulletWorldImporter::createCylinderShapeX(btScalar radius,btScalar height) +{ + btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height,radius,radius)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btBulletWorldImporter::createCylinderShapeY(btScalar radius,btScalar height) +{ + btCylinderShape* shape = new btCylinderShape(btVector3(radius,height,radius)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btBulletWorldImporter::createCylinderShapeZ(btScalar radius,btScalar height) +{ + btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius,radius,height)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btTriangleIndexVertexArray* btBulletWorldImporter::createTriangleMeshContainer() +{ + btTriangleIndexVertexArray* in = new btTriangleIndexVertexArray(); + m_allocatedTriangleIndexArrays.push_back(in); + return in; +} + +btOptimizedBvh* btBulletWorldImporter::createOptimizedBvh() +{ + btOptimizedBvh* bvh = new btOptimizedBvh(); + m_allocatedBvhs.push_back(bvh); + return bvh; +} + + +btTriangleInfoMap* btBulletWorldImporter::createTriangleInfoMap() +{ + btTriangleInfoMap* tim = new btTriangleInfoMap(); + m_allocatedTriangleInfoMaps.push_back(tim); + return tim; +} + +btBvhTriangleMeshShape* btBulletWorldImporter::createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh) +{ + if (bvh) + { + btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh,bvh->isQuantized(), false); + bvhTriMesh->setOptimizedBvh(bvh); + m_allocatedCollisionShapes.push_back(bvhTriMesh); + return bvhTriMesh; + } + + btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh,true); + m_allocatedCollisionShapes.push_back(ts); + return ts; + +} +btCollisionShape* btBulletWorldImporter::createConvexTriangleMeshShape(btStridingMeshInterface* trimesh) +{ + return 0; +} +btGImpactMeshShape* btBulletWorldImporter::createGimpactShape(btStridingMeshInterface* trimesh) +{ + btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh); + m_allocatedCollisionShapes.push_back(shape); + return shape; + +} +btConvexHullShape* btBulletWorldImporter::createConvexHullShape() +{ + btConvexHullShape* shape = new btConvexHullShape(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCompoundShape* btBulletWorldImporter::createCompoundShape() +{ + btCompoundShape* shape = new btCompoundShape(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btRigidBody& btBulletWorldImporter::getFixedBody() +{ + static btRigidBody s_fixed(0, 0,0); + s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.))); + return s_fixed; +} + +btPoint2PointConstraint* btBulletWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB) +{ + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,rbB,pivotInA,pivotInB); + m_allocatedConstraints.push_back(p2p); + return p2p; +} + +btPoint2PointConstraint* btBulletWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA) +{ + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,pivotInA); + m_allocatedConstraints.push_back(p2p); + return p2p; +} + + +btHingeConstraint* btBulletWorldImporter::createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA) +{ + btHingeConstraint* hinge = new btHingeConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA); + m_allocatedConstraints.push_back(hinge); + return hinge; +} + +btHingeConstraint* btBulletWorldImporter::createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA) +{ + btHingeConstraint* hinge = new btHingeConstraint(rbA,rbAFrame,useReferenceFrameA); + m_allocatedConstraints.push_back(hinge); + return hinge; +} + +btConeTwistConstraint* btBulletWorldImporter::createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame) +{ + btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbB,rbAFrame,rbBFrame); + m_allocatedConstraints.push_back(cone); + return cone; +} + +btConeTwistConstraint* btBulletWorldImporter::createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame) +{ + btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbAFrame); + m_allocatedConstraints.push_back(cone); + return cone; +} + + +btGeneric6DofConstraint* btBulletWorldImporter::createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) +{ + btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(dof); + return dof; +} + +btGeneric6DofConstraint* btBulletWorldImporter::createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB) +{ + btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbB,frameInB,useLinearReferenceFrameB); + m_allocatedConstraints.push_back(dof); + return dof; +} +btSliderConstraint* btBulletWorldImporter::createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) +{ + btSliderConstraint* slider = new btSliderConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(slider); + return slider; +} + +btSliderConstraint* btBulletWorldImporter::createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA) +{ + btSliderConstraint* slider = new btSliderConstraint(rbB,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(slider); + return slider; +} + + + // query for data +int btBulletWorldImporter::getNumCollisionShapes() const +{ + return m_allocatedCollisionShapes.size(); +} + +btCollisionShape* btBulletWorldImporter::getCollisionShapeByIndex(int index) +{ + return m_allocatedCollisionShapes[index]; +} + +btCollisionShape* btBulletWorldImporter::getCollisionShapeByName(const char* name) +{ + btCollisionShape** shapePtr = m_nameShapeMap.find(name); + if (shapePtr&& *shapePtr) + { + return *shapePtr; + } + return 0; +} + +btRigidBody* btBulletWorldImporter::getRigidBodyByName(const char* name) +{ + btRigidBody** bodyPtr = m_nameBodyMap.find(name); + if (bodyPtr && *bodyPtr) + { + return *bodyPtr; + } + return 0; +} + +btTypedConstraint* btBulletWorldImporter::getConstraintByName(const char* name) +{ + btTypedConstraint** constraintPtr = m_nameConstraintMap.find(name); + if (constraintPtr && *constraintPtr) + { + return *constraintPtr; + } + return 0; +} + +const char* btBulletWorldImporter::getNameForPointer(const void* ptr) const +{ + const char*const * namePtr = m_objectNameMap.find(ptr); + if (namePtr && *namePtr) + return *namePtr; + return 0; +} + + +int btBulletWorldImporter::getNumRigidBodies() const +{ + return m_allocatedRigidBodies.size(); +} + +btCollisionObject* btBulletWorldImporter::getRigidBodyByIndex(int index) const +{ + return m_allocatedRigidBodies[index]; +} +int btBulletWorldImporter::getNumConstraints() const +{ + return m_allocatedConstraints.size(); +} + +btTypedConstraint* btBulletWorldImporter::getConstraintByIndex(int index) const +{ + return m_allocatedConstraints[index]; +} + +int btBulletWorldImporter::getNumBvhs() const +{ + return m_allocatedBvhs.size(); +} + btOptimizedBvh* btBulletWorldImporter::getBvhByIndex(int index) const +{ + return m_allocatedBvhs[index]; +} + +int btBulletWorldImporter::getNumTriangleInfoMaps() const +{ + return m_allocatedTriangleInfoMaps.size(); +} + +btTriangleInfoMap* btBulletWorldImporter::getTriangleInfoMapByIndex(int index) const +{ + return m_allocatedTriangleInfoMaps[index]; +} + diff --git a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h index 88535d266..6c0dbc1ef 100644 --- a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h +++ b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h @@ -1,180 +1,180 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 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 BULLET_WORLD_IMPORTER_H -#define BULLET_WORLD_IMPORTER_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" - - -class btBulletFile; -class btCollisionShape; -class btCollisionObject; -class btRigidBody; -class btTypedConstraint; -class btDynamicsWorld; -struct ConstraintInput; -class btRigidBodyColladaInfo; -struct btCollisionShapeData; -class btTriangleIndexVertexArray; -class btStridingMeshInterface; -struct btStridingMeshInterfaceData; -class btGImpactMeshShape; -class btOptimizedBvh; -struct btTriangleInfoMap; -class btBvhTriangleMeshShape; -class btPoint2PointConstraint; -class btHingeConstraint; -class btConeTwistConstraint; -class btGeneric6DofConstraint; -class btSliderConstraint; - - - -namespace bParse -{ - class btBulletFile; - -}; - - -class btBulletWorldImporter -{ -protected: - - btDynamicsWorld* m_dynamicsWorld; - - bool m_verboseDumpAllTypes; - - btCollisionShape* convertCollisionShape( btCollisionShapeData* shapeData ); - - btAlignedObjectArray m_allocatedCollisionShapes; - btAlignedObjectArray m_allocatedRigidBodies; - btAlignedObjectArray m_allocatedConstraints; - btAlignedObjectArray m_allocatedBvhs; - btAlignedObjectArray m_allocatedTriangleInfoMaps; - btAlignedObjectArray m_allocatedTriangleIndexArrays; - btAlignedObjectArray m_allocatedNames; - - btHashMap m_bvhMap; - btHashMap m_timMap; - - btHashMap m_nameShapeMap; - btHashMap m_nameBodyMap; - btHashMap m_nameConstraintMap; - btHashMap m_objectNameMap; - - //methods - - btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); - - static btRigidBody& getFixedBody(); - - char* duplicateName(const char* name); - -public: - - btBulletWorldImporter(btDynamicsWorld* world=0); - - virtual ~btBulletWorldImporter(); - - ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load. - ///make sure you don't use the dynamics world containing objects after you call this method - void deleteAllData(); - - bool loadFile(const char* fileName); - - ///the memoryBuffer might be modified (for example if endian swaps are necessary) - bool loadFileFromMemory(char *memoryBuffer, int len); - - bool loadFileFromMemory(bParse::btBulletFile* file); - - void setVerboseMode(bool verboseDumpAllTypes) - { - m_verboseDumpAllTypes = verboseDumpAllTypes; - } - - bool getVerboseMode() const - { - return m_verboseDumpAllTypes; - } - - // query for data - int getNumCollisionShapes() const; - btCollisionShape* getCollisionShapeByIndex(int index); - int getNumRigidBodies() const; - btCollisionObject* getRigidBodyByIndex(int index) const; - int getNumConstraints() const; - btTypedConstraint* getConstraintByIndex(int index) const; - int getNumBvhs() const; - btOptimizedBvh* getBvhByIndex(int index) const; - int getNumTriangleInfoMaps() const; - btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const; - - // queris involving named objects - btCollisionShape* getCollisionShapeByName(const char* name); - btRigidBody* getRigidBodyByName(const char* name); - btTypedConstraint* getConstraintByName(const char* name); - const char* getNameForPointer(const void* ptr) const; - - ///those virtuals are called by load and can be overridden by the user - - //bodies - virtual btRigidBody* createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform, btCollisionShape* shape,const char* bodyName); - virtual btCollisionObject* createCollisionObject( const btTransform& startTransform, btCollisionShape* shape,const char* bodyName); - - ///shapes - - virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant); - virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); - virtual btCollisionShape* createSphereShape(btScalar radius); - virtual btCollisionShape* createCapsuleShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createCapsuleShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createCapsuleShapeZ(btScalar radius, btScalar height); - - virtual btCollisionShape* createCylinderShapeX(btScalar radius,btScalar height); - virtual btCollisionShape* createCylinderShapeY(btScalar radius,btScalar height); - virtual btCollisionShape* createCylinderShapeZ(btScalar radius,btScalar height); - virtual class btTriangleIndexVertexArray* createTriangleMeshContainer(); - virtual btBvhTriangleMeshShape* createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh); - virtual btCollisionShape* createConvexTriangleMeshShape(btStridingMeshInterface* trimesh); - virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh); - virtual class btConvexHullShape* createConvexHullShape(); - virtual class btCompoundShape* createCompoundShape(); - - ///acceleration and connectivity structures - virtual btOptimizedBvh* createOptimizedBvh(); - virtual btTriangleInfoMap* createTriangleInfoMap(); - - ///constraints - virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB); - virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA); - virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA=false); - virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA=false); - virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame); - virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame); - virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); - virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB); - virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); - virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA); - -}; - -#endif //BULLET_WORLD_IMPORTER_H - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2010 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 BULLET_WORLD_IMPORTER_H +#define BULLET_WORLD_IMPORTER_H + +#include "LinearMath/btTransform.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btHashMap.h" + + +class btBulletFile; +class btCollisionShape; +class btCollisionObject; +class btRigidBody; +class btTypedConstraint; +class btDynamicsWorld; +struct ConstraintInput; +class btRigidBodyColladaInfo; +struct btCollisionShapeData; +class btTriangleIndexVertexArray; +class btStridingMeshInterface; +struct btStridingMeshInterfaceData; +class btGImpactMeshShape; +class btOptimizedBvh; +struct btTriangleInfoMap; +class btBvhTriangleMeshShape; +class btPoint2PointConstraint; +class btHingeConstraint; +class btConeTwistConstraint; +class btGeneric6DofConstraint; +class btSliderConstraint; + + + +namespace bParse +{ + class btBulletFile; + +}; + + +class btBulletWorldImporter +{ +protected: + + btDynamicsWorld* m_dynamicsWorld; + + bool m_verboseDumpAllTypes; + + btCollisionShape* convertCollisionShape( btCollisionShapeData* shapeData ); + + btAlignedObjectArray m_allocatedCollisionShapes; + btAlignedObjectArray m_allocatedRigidBodies; + btAlignedObjectArray m_allocatedConstraints; + btAlignedObjectArray m_allocatedBvhs; + btAlignedObjectArray m_allocatedTriangleInfoMaps; + btAlignedObjectArray m_allocatedTriangleIndexArrays; + btAlignedObjectArray m_allocatedNames; + + btHashMap m_bvhMap; + btHashMap m_timMap; + + btHashMap m_nameShapeMap; + btHashMap m_nameBodyMap; + btHashMap m_nameConstraintMap; + btHashMap m_objectNameMap; + + //methods + + btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); + + static btRigidBody& getFixedBody(); + + char* duplicateName(const char* name); + +public: + + btBulletWorldImporter(btDynamicsWorld* world=0); + + virtual ~btBulletWorldImporter(); + + ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load. + ///make sure you don't use the dynamics world containing objects after you call this method + void deleteAllData(); + + bool loadFile(const char* fileName); + + ///the memoryBuffer might be modified (for example if endian swaps are necessary) + bool loadFileFromMemory(char *memoryBuffer, int len); + + bool loadFileFromMemory(bParse::btBulletFile* file); + + void setVerboseMode(bool verboseDumpAllTypes) + { + m_verboseDumpAllTypes = verboseDumpAllTypes; + } + + bool getVerboseMode() const + { + return m_verboseDumpAllTypes; + } + + // query for data + int getNumCollisionShapes() const; + btCollisionShape* getCollisionShapeByIndex(int index); + int getNumRigidBodies() const; + btCollisionObject* getRigidBodyByIndex(int index) const; + int getNumConstraints() const; + btTypedConstraint* getConstraintByIndex(int index) const; + int getNumBvhs() const; + btOptimizedBvh* getBvhByIndex(int index) const; + int getNumTriangleInfoMaps() const; + btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const; + + // queris involving named objects + btCollisionShape* getCollisionShapeByName(const char* name); + btRigidBody* getRigidBodyByName(const char* name); + btTypedConstraint* getConstraintByName(const char* name); + const char* getNameForPointer(const void* ptr) const; + + ///those virtuals are called by load and can be overridden by the user + + //bodies + virtual btRigidBody* createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform, btCollisionShape* shape,const char* bodyName); + virtual btCollisionObject* createCollisionObject( const btTransform& startTransform, btCollisionShape* shape,const char* bodyName); + + ///shapes + + virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant); + virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); + virtual btCollisionShape* createSphereShape(btScalar radius); + virtual btCollisionShape* createCapsuleShapeX(btScalar radius, btScalar height); + virtual btCollisionShape* createCapsuleShapeY(btScalar radius, btScalar height); + virtual btCollisionShape* createCapsuleShapeZ(btScalar radius, btScalar height); + + virtual btCollisionShape* createCylinderShapeX(btScalar radius,btScalar height); + virtual btCollisionShape* createCylinderShapeY(btScalar radius,btScalar height); + virtual btCollisionShape* createCylinderShapeZ(btScalar radius,btScalar height); + virtual class btTriangleIndexVertexArray* createTriangleMeshContainer(); + virtual btBvhTriangleMeshShape* createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh); + virtual btCollisionShape* createConvexTriangleMeshShape(btStridingMeshInterface* trimesh); + virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh); + virtual class btConvexHullShape* createConvexHullShape(); + virtual class btCompoundShape* createCompoundShape(); + + ///acceleration and connectivity structures + virtual btOptimizedBvh* createOptimizedBvh(); + virtual btTriangleInfoMap* createTriangleInfoMap(); + + ///constraints + virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB); + virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA); + virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA=false); + virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA=false); + virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame); + virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame); + virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); + virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB); + virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); + virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA); + +}; + +#endif //BULLET_WORLD_IMPORTER_H + diff --git a/Extras/Serialize/CMakeLists.txt b/Extras/Serialize/CMakeLists.txt index acf8619ed..23a544c23 100644 --- a/Extras/Serialize/CMakeLists.txt +++ b/Extras/Serialize/CMakeLists.txt @@ -1,20 +1,20 @@ - -IF (BUILD_BLEND_DEMO OR INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) - SUBDIRS(BlenderSerialize ) -ENDIF() - - -IF(INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) - -# makesdna and HeaderGenerator are for advanced use only -# makesdna can re-generate the binary DNA representing the Bullet serialization structures -# Be very careful modifying any of this, otherwise the .bullet format becomes incompatible - - SUBDIRS ( BulletFileLoader BulletWorldImporter HeaderGenerator makesdna) - -ELSE(INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) - - SUBDIRS ( BulletFileLoader BulletWorldImporter ) - -ENDIF (INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) - + +IF (BUILD_BLEND_DEMO OR INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) + SUBDIRS(BlenderSerialize ) +ENDIF() + + +IF(INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) + +# makesdna and HeaderGenerator are for advanced use only +# makesdna can re-generate the binary DNA representing the Bullet serialization structures +# Be very careful modifying any of this, otherwise the .bullet format becomes incompatible + + SUBDIRS ( BulletFileLoader BulletWorldImporter HeaderGenerator makesdna) + +ELSE(INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) + + SUBDIRS ( BulletFileLoader BulletWorldImporter ) + +ENDIF (INTERNAL_UPDATE_SERIALIZATION_STRUCTURES) + diff --git a/Extras/Serialize/HeaderGenerator/apiGen.cpp b/Extras/Serialize/HeaderGenerator/apiGen.cpp index 1b23ed48e..7b7b08565 100644 --- a/Extras/Serialize/HeaderGenerator/apiGen.cpp +++ b/Extras/Serialize/HeaderGenerator/apiGen.cpp @@ -1,464 +1,464 @@ -/* Copyright (C) 2006 Charlie C -* -* 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 "bDNA.h" -#include "bBlenderFile.h" -#include "btBulletFile.h" -#include "bCommon.h" -#include -#include -#include - -bool isBulletFile = false; - -using namespace bParse; -typedef std::string bString; - -/////////////////////////////////////////////////////////////////////////////// -typedef std::map bStringMap; -typedef std::vector bVariableList; -typedef std::vector bStringList; - - -/////////////////////////////////////////////////////////////////////////////// -static FILE *dump = 0; -static bDNA *mDNA =0; -static bStringMap mStructs; - - -/////////////////////////////////////////////////////////////////////////////// -class bVariable -{ -public: - bVariable(); - ~bVariable(); - - - bString dataType; - bString variableName; - - - bString functionName; - bString classCtor; - - bString memberVariable; - bString memberDataType; - bString functionArgs; - - - void initialize(bString dataType, bString variable, bStringMap refDataTable); - - bool isPtr; - bool isFunctionPtr; - bool isPtrToPtr; - bool isArray; - bool isCharArray; - bool isListBase; - bool isPadding; - bool isCommentedOut; - bool isGeneratedType; - bool isbString; -}; - -/////////////////////////////////////////////////////////////////////////////// -bool dataTypeStandard(bString dataType) -{ - if (dataType == "char") - return true; - if (dataType == "short") - return true; - if (dataType == "int") - return true; - if (dataType == "long") - return true; - if (dataType == "float") - return true; - if (dataType == "double") - return true; - if (dataType == "void") - return true; - if (dataType == "btScalar") - return true; - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -void writeTemplate(short *structData) -{ - bString type = mDNA->getType(structData[0]); - bString className=type; - bString prefix = isBulletFile? "bullet_" : "blender_"; - - int thisLen = structData[1]; - structData+=2; - - bString fileName = prefix+type; - - bVariableList dataTypes; - bStringMap includeFiles; - - - for (int dataVal =0; dataValgetType(structData[0]); - bString dataName = mDNA->getName(structData[1]); - { - bString newDataType = ""; - bString newDataName = ""; - - bStringMap::iterator addB = mStructs.find(dataType); - if (addB != mStructs.end()) - { - newDataType = addB->second; - newDataName = dataName; - } - - else - { - if (dataTypeStandard(dataType)) - { - newDataType = dataType; - newDataName = dataName; - } - else - { - // Unresolved - // set it to an empty struct - // if it's not a ptr generate an error - newDataType = "bInvalidHandle"; - newDataName = dataName; - - if (dataName[0] != '*') - { - } - - } - } - - if (!newDataType.empty() && !newDataName.empty()) - { - bVariable var = bVariable(); - var.initialize(newDataType, newDataName, mStructs); - dataTypes.push_back(var); - } - } - - - bStringMap::iterator include = mStructs.find(dataType); - if (include != mStructs.end()) - { - if (dataName[0] != '*') - { - if (includeFiles.find(dataType)== includeFiles.end()) - { - includeFiles[dataType]=prefix+dataType; - } - } - } - } - - - fprintf(dump, "###############################################################\n"); - fprintf(dump, "%s = bStructClass()\n", fileName.c_str()); - fprintf(dump, "%s.name = '%s'\n", fileName.c_str(), className.c_str()); - fprintf(dump, "%s.filename = '%s'\n", fileName.c_str(), fileName.c_str()); - - bVariableList::iterator vars = dataTypes.begin(); - while (vars!= dataTypes.end()) - { - fprintf(dump, "%s.dataTypes.append('%s %s')\n", fileName.c_str(), vars->dataType.c_str(), vars->variableName.c_str()); - vars++; - } - - bStringMap::iterator inc = includeFiles.begin(); - while (inc != includeFiles.end()) - { - fprintf(dump, "%s.includes.append('%s.h')\n", fileName.c_str(), inc->second.c_str()); - inc++; - } - fprintf(dump, "DataTypeList.append(%s)\n", fileName.c_str()); -} - - -/////////////////////////////////////////////////////////////////////////////// -char data[]={ -"\n" -"class bStructClass:\n" -" def __init__(self):\n" -" self.name = \"\";\n" -" self.filename = \"\";\n" -" self.includes = []\n" -" self.dataTypes = []\n" -"\n\n" -"DataTypeList = []\n" -}; - - -/////////////////////////////////////////////////////////////////////////////// -int main(int argc,char** argv) -{ - using namespace bParse; - dump = fopen("dump.py", "w"); - - if (!dump) return 0; - fprintf(dump, "%s\n", data); - - - char* filename = "../../../Demos/SerializeDemo/testFile.bullet"; - - if (argc==2) - filename = argv[1]; - - bString fileStr(filename); - bString extension(".bullet"); - - int index2 = fileStr.find(extension); - if (index2>=0) - isBulletFile=true; - - - FILE* fp = fopen (filename,"rb"); - - if (!fp) - { - printf("error: file not found %s\n",filename); - exit(0); - } - - char* memBuf = 0; - int len = 0; - - long currentpos = ftell(fp); /* save current cursor position */ - long newpos; - int bytesRead; - - fseek(fp, 0, SEEK_END); /* seek to end */ - newpos = ftell(fp); /* find position of end -- this is the length */ - fseek(fp, currentpos, SEEK_SET); /* restore previous cursor position */ - - len = newpos; - - memBuf = (char*)malloc(len); - bytesRead = fread(memBuf,len,1,fp); - - bool swap = false; - - - if (isBulletFile) - { - btBulletFile f(memBuf,len); - swap = (f.getFlags() & FD_ENDIAN_SWAP)!=0; - } else - { - bBlenderFile f(memBuf,len); - swap = (f.getFlags() & FD_ENDIAN_SWAP)!=0; - } - - - - - - char *blenderData = memBuf; - int sdnaPos=0; - int mDataStart = 12; - - char *tempBuffer = blenderData; - for (int i=0; iinitMemory(); - - mDNA->init(memBuf+sdnaPos, len-sdnaPos, swap); - - - for (int i=0; igetNumStructs(); i++) - { - short *structData = mDNA->getStruct(i); - bString type = mDNA->getType(structData[0]); - - bString className = type; - mStructs[type]=className; - } - - - for (int i=0; igetNumStructs(); i++) - { - short *structData = mDNA->getStruct(i); - writeTemplate(structData); - } - - delete mDNA; - fclose(dump); - return 0; -} -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -int _getArraySize(char* str) -{ - int a, mul=1; - char stri[100], *cp=0; - int len = (int)strlen(str); - - memcpy(stri, str, len+1); - for (a=0; a +#include "bDNA.h" +#include "bBlenderFile.h" +#include "btBulletFile.h" +#include "bCommon.h" +#include +#include +#include + +bool isBulletFile = false; + +using namespace bParse; +typedef std::string bString; + +/////////////////////////////////////////////////////////////////////////////// +typedef std::map bStringMap; +typedef std::vector bVariableList; +typedef std::vector bStringList; + + +/////////////////////////////////////////////////////////////////////////////// +static FILE *dump = 0; +static bDNA *mDNA =0; +static bStringMap mStructs; + + +/////////////////////////////////////////////////////////////////////////////// +class bVariable +{ +public: + bVariable(); + ~bVariable(); + + + bString dataType; + bString variableName; + + + bString functionName; + bString classCtor; + + bString memberVariable; + bString memberDataType; + bString functionArgs; + + + void initialize(bString dataType, bString variable, bStringMap refDataTable); + + bool isPtr; + bool isFunctionPtr; + bool isPtrToPtr; + bool isArray; + bool isCharArray; + bool isListBase; + bool isPadding; + bool isCommentedOut; + bool isGeneratedType; + bool isbString; +}; + +/////////////////////////////////////////////////////////////////////////////// +bool dataTypeStandard(bString dataType) +{ + if (dataType == "char") + return true; + if (dataType == "short") + return true; + if (dataType == "int") + return true; + if (dataType == "long") + return true; + if (dataType == "float") + return true; + if (dataType == "double") + return true; + if (dataType == "void") + return true; + if (dataType == "btScalar") + return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////// +void writeTemplate(short *structData) +{ + bString type = mDNA->getType(structData[0]); + bString className=type; + bString prefix = isBulletFile? "bullet_" : "blender_"; + + int thisLen = structData[1]; + structData+=2; + + bString fileName = prefix+type; + + bVariableList dataTypes; + bStringMap includeFiles; + + + for (int dataVal =0; dataValgetType(structData[0]); + bString dataName = mDNA->getName(structData[1]); + { + bString newDataType = ""; + bString newDataName = ""; + + bStringMap::iterator addB = mStructs.find(dataType); + if (addB != mStructs.end()) + { + newDataType = addB->second; + newDataName = dataName; + } + + else + { + if (dataTypeStandard(dataType)) + { + newDataType = dataType; + newDataName = dataName; + } + else + { + // Unresolved + // set it to an empty struct + // if it's not a ptr generate an error + newDataType = "bInvalidHandle"; + newDataName = dataName; + + if (dataName[0] != '*') + { + } + + } + } + + if (!newDataType.empty() && !newDataName.empty()) + { + bVariable var = bVariable(); + var.initialize(newDataType, newDataName, mStructs); + dataTypes.push_back(var); + } + } + + + bStringMap::iterator include = mStructs.find(dataType); + if (include != mStructs.end()) + { + if (dataName[0] != '*') + { + if (includeFiles.find(dataType)== includeFiles.end()) + { + includeFiles[dataType]=prefix+dataType; + } + } + } + } + + + fprintf(dump, "###############################################################\n"); + fprintf(dump, "%s = bStructClass()\n", fileName.c_str()); + fprintf(dump, "%s.name = '%s'\n", fileName.c_str(), className.c_str()); + fprintf(dump, "%s.filename = '%s'\n", fileName.c_str(), fileName.c_str()); + + bVariableList::iterator vars = dataTypes.begin(); + while (vars!= dataTypes.end()) + { + fprintf(dump, "%s.dataTypes.append('%s %s')\n", fileName.c_str(), vars->dataType.c_str(), vars->variableName.c_str()); + vars++; + } + + bStringMap::iterator inc = includeFiles.begin(); + while (inc != includeFiles.end()) + { + fprintf(dump, "%s.includes.append('%s.h')\n", fileName.c_str(), inc->second.c_str()); + inc++; + } + fprintf(dump, "DataTypeList.append(%s)\n", fileName.c_str()); +} + + +/////////////////////////////////////////////////////////////////////////////// +char data[]={ +"\n" +"class bStructClass:\n" +" def __init__(self):\n" +" self.name = \"\";\n" +" self.filename = \"\";\n" +" self.includes = []\n" +" self.dataTypes = []\n" +"\n\n" +"DataTypeList = []\n" +}; + + +/////////////////////////////////////////////////////////////////////////////// +int main(int argc,char** argv) +{ + using namespace bParse; + dump = fopen("dump.py", "w"); + + if (!dump) return 0; + fprintf(dump, "%s\n", data); + + + char* filename = "../../../Demos/SerializeDemo/testFile.bullet"; + + if (argc==2) + filename = argv[1]; + + bString fileStr(filename); + bString extension(".bullet"); + + int index2 = fileStr.find(extension); + if (index2>=0) + isBulletFile=true; + + + FILE* fp = fopen (filename,"rb"); + + if (!fp) + { + printf("error: file not found %s\n",filename); + exit(0); + } + + char* memBuf = 0; + int len = 0; + + long currentpos = ftell(fp); /* save current cursor position */ + long newpos; + int bytesRead; + + fseek(fp, 0, SEEK_END); /* seek to end */ + newpos = ftell(fp); /* find position of end -- this is the length */ + fseek(fp, currentpos, SEEK_SET); /* restore previous cursor position */ + + len = newpos; + + memBuf = (char*)malloc(len); + bytesRead = fread(memBuf,len,1,fp); + + bool swap = false; + + + if (isBulletFile) + { + btBulletFile f(memBuf,len); + swap = (f.getFlags() & FD_ENDIAN_SWAP)!=0; + } else + { + bBlenderFile f(memBuf,len); + swap = (f.getFlags() & FD_ENDIAN_SWAP)!=0; + } + + + + + + char *blenderData = memBuf; + int sdnaPos=0; + int mDataStart = 12; + + char *tempBuffer = blenderData; + for (int i=0; iinitMemory(); + + mDNA->init(memBuf+sdnaPos, len-sdnaPos, swap); + + + for (int i=0; igetNumStructs(); i++) + { + short *structData = mDNA->getStruct(i); + bString type = mDNA->getType(structData[0]); + + bString className = type; + mStructs[type]=className; + } + + + for (int i=0; igetNumStructs(); i++) + { + short *structData = mDNA->getStruct(i); + writeTemplate(structData); + } + + delete mDNA; + fclose(dump); + return 0; +} +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +int _getArraySize(char* str) +{ + int a, mul=1; + char stri[100], *cp=0; + int len = (int)strlen(str); + + memcpy(stri, str, len+1); + for (a=0; a - -#elif defined (__APPLE__) - -#include - -#elif defined(FREE_WINDOWS) - -#include - -#else - - /* FreeBSD, Irix, Solaris */ -#include - -#endif /* ifdef platform for types */ - -#ifdef __cplusplus -} -#endif - - -#include -#include -#include - -//#include "DNA_sdna_types.h" -// include files for automatic dependancies -#include "DNA_rigidbody.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btTransform.h" -#include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" -#include "BulletCollision/CollisionShapes/btCollisionShape.h" -#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" -#include "BulletCollision/CollisionShapes/btConvexInternalShape.h" -#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" -#include "BulletCollision/CollisionShapes/btConvexHullShape.h" -#include "BulletCollision/CollisionShapes/btStridingMeshInterface.h" -#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "BulletCollision/CollisionShapes/btCylinderShape.h" -#include "BulletCollision/CollisionShapes/btCapsuleShape.h" -#include "BulletCollision/CollisionShapes/btTriangleInfoMap.h" -#include "BulletCollision/Gimpact/btGImpactShape.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" -#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" -#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" -#include "BulletDynamics/ConstraintSolver/btConeTwistConstraint.h" -#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h" -#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" - -#include "BulletDynamics/Dynamics/btRigidBody.h" - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#define SDNA_MAX_FILENAME_LENGTH 255 - -/* Included the path relative from /source/blender/ here, so we can move */ -/* headers around with more freedom. */ -char *includefiles[] = { - - // if you add files here, please add them at the end - // of makesdna.c (this file) as well - "../makesdna/DNA_rigidbody.h", - "../../../src/LinearMath/btVector3.h", - "../../../src/LinearMath/btMatrix3x3.h", - "../../../src/LinearMath/btTransform.h", - "../../../src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h", - "../../../src/BulletCollision/CollisionShapes/btCollisionShape.h", - "../../../src/BulletCollision/CollisionShapes/btStaticPlaneShape.h", - "../../../src/BulletCollision/CollisionShapes/btConvexInternalShape.h", - "../../../src/BulletCollision/CollisionShapes/btMultiSphereShape.h", - "../../../src/BulletCollision/CollisionShapes/btStridingMeshInterface.h", - "../../../src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h", - "../../../src/BulletCollision/CollisionShapes/btCompoundShape.h", - "../../../src/BulletCollision/CollisionShapes/btCylinderShape.h", - "../../../src/BulletCollision/CollisionShapes/btCapsuleShape.h", - "../../../src/BulletCollision/CollisionShapes/btTriangleInfoMap.h", - "../../../src/BulletCollision/Gimpact/btGImpactShape.h", - "../../../src/BulletCollision/CollisionShapes/btConvexHullShape.h", - "../../../src/BulletCollision/CollisionDispatch/btCollisionObject.h", - "../../../src/BulletDynamics/Dynamics/btRigidBody.h", - "../../../src/BulletDynamics/ConstraintSolver/btTypedConstraint.h", - "../../../src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h", - "../../../src/BulletDynamics/ConstraintSolver/btHingeConstraint.h", - "../../../src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h", - "../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h", - "../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h", - - // empty string to indicate end of includefiles - "" -}; - -void* malloc_and_setzero(int numbytes) -{ - char* buf = (char*)malloc(numbytes); - memset(buf,0,numbytes); - return buf; -} - -int maxdata= 500000, maxnr= 50000; -int nr_names=0; -int nr_types=0; -int nr_structs=0; -char **names, *namedata; /* at adress names[a] is string a */ -char **types, *typedata; /* at adress types[a] is string a */ -short *typelens; /* at typelens[a] is de length of type a */ -short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits) */ -short **structs, *structdata; /* at sp= structs[a] is the first adress of a struct definition - sp[0] is type number - sp[1] is amount of elements - sp[2] sp[3] is typenr, namenr (etc) */ -/* - * debugSDNA: - * - 0 = no output, except errors - * - 1 = detail actions - * - 2 = full trace, tell which names and types were found - * - 4 = full trace, plus all gritty details - */ -int debugSDNA = 0; -int additional_slen_offset; - -/* ************************************************************************** */ -/* Functions */ -/* ************************************************************************** */ - -/** - * Add type to struct indexed by , if it was not yet found. - */ -int add_type(char *str, int len); - -/** - * Add variable to - */ -int add_name(char *str); - -/** - * Search whether this structure type was already found, and if not, - * add it. - */ -short *add_struct(int namecode); - -/** - * Remove comments from this buffer. Assumes that the buffer refers to - * ascii-code text. - */ -int preprocess_include(char *maindata, int len); - -/** - * Scan this file for serializable types. - */ -int convert_include(char *filename); - -/** - * Determine how many bytes are needed for an array. - */ -int arraysize(char *astr, int len); - -/** - * Determine how many bytes are needed for each struct. - */ -static int calculate_structlens(int); - -/** - * Construct the DNA.c file - */ -void dna_write(FILE *file, void *pntr, int size); - -/** - * Report all structures found so far, and print their lenghts. - */ -void printStructLenghts(void); - - - -/* ************************************************************************** */ -/* Implementation */ -/* ************************************************************************** */ - -/* ************************* MAKEN DNA ********************** */ - -int add_type(char *str, int len) -{ - int nr; - char *cp; - - if(str[0]==0) return -1; - - /* search through type array */ - for(nr=0; nr=maxnr) { - printf("too many types\n"); - return nr_types-1;; - } - nr_types++; - - return nr_types-1; -} - -/** - * - * Because of the weird way of tokenizing, we have to 'cast' function - * pointers to ... (*f)(), whatever the original signature. In fact, - * we add name and type at the same time... There are two special - * cases, unfortunately. These are explicitly checked. - * - * */ -int add_name(char *str) -{ - int nr, i, j, k; - char *cp; - char buf[255]; /* stupid limit, change it :) */ - char *name; - - additional_slen_offset = 0; - - if((str[0]==0) /* || (str[1]==0) */) return -1; - - if (str[0] == '(' && str[1] == '*') { - if (debugSDNA > 3) printf("\t\t\t\t*** Function pointer found\n"); - /* functionpointer: transform the type (sometimes) */ - i = 0; - j = 0; - - while (str[i] != ')') { - buf[i] = str[i]; - i++; - } - - /* Another number we need is the extra slen offset. This extra - * offset is the overshoot after a space. If there is no - * space, no overshoot should be calculated. */ - j = i; /* j at first closing brace */ - - if (debugSDNA > 3) printf("first brace after offset %d\n", i); - - j++; /* j beyond closing brace ? */ - while ((str[j] != 0) && (str[j] != ')' )) { - if (debugSDNA > 3) printf("seen %c ( %d) \n", str[j], str[j]); - j++; - } - if (debugSDNA > 3) printf("seen %c ( %d) \n", str[j], str[j]); - if (debugSDNA > 3) printf("special after offset %d\n", j); - - if (str[j] == 0 ) { - if (debugSDNA > 3) printf("offsetting for space\n"); - /* get additional offset */ - k = 0; - while (str[j] != ')') { - j++; - k++; - } - if (debugSDNA > 3) printf("extra offset %d\n", k); - additional_slen_offset = k; - } else if (str[j] == ')' ) { - if (debugSDNA > 3) printf("offsetting for brace\n"); - ; /* don't get extra offset */ - } else { - printf("Error during tokening function pointer argument list\n"); - } - - /* - * Put )(void) at the end? Maybe )(). Should check this with - * old sdna. Actually, sometimes )(), sometimes )(void...) - * Alas.. such is the nature of braindamage :( - * - * Sorted it out: always do )(), except for headdraw and - * windraw, part of ScrArea. This is important, because some - * linkers will treat different fp's differently when called - * !!! This has to do with interference in byte-alignment and - * the way args are pushed on the stack. - * - * */ - buf[i] = 0; - if (debugSDNA > 3) printf("Name before chomping: %s\n", buf); - if ( (strncmp(buf,"(*headdraw", 10) == 0) - || (strncmp(buf,"(*windraw", 9) == 0) ) { - buf[i] = ')'; - buf[i+1] = '('; - buf[i+2] = 'v'; - buf[i+3] = 'o'; - buf[i+4] = 'i'; - buf[i+5] = 'd'; - buf[i+6] = ')'; - buf[i+7] = 0; - } else { - buf[i] = ')'; - buf[i+1] = '('; - buf[i+2] = ')'; - buf[i+3] = 0; - } - /* now precede with buf*/ - if (debugSDNA > 3) printf("\t\t\t\t\tProposing fp name %s\n", buf); - name = buf; - } else { - /* normal field: old code */ - name = str; - } - - /* search name array */ - for(nr=0; nr=maxnr) { - printf("too many names\n"); - return nr_names-1; - } - nr_names++; - - return nr_names-1; -} - -short *add_struct(int namecode) -{ - int len; - short *sp; - - if(nr_structs==0) { - structs[0]= structdata; - } - else { - sp= structs[nr_structs-1]; - len= sp[1]; - structs[nr_structs]= sp+ 2*len+2; - } - - sp= structs[nr_structs]; - sp[0]= namecode; - - if(nr_structs>=maxnr) { - printf("too many structs\n"); - return sp; - } - nr_structs++; - - return sp; -} - -int preprocess_include(char *maindata, int len) -{ - int a, newlen, comment = 0; - char *cp, *temp, *md; - - temp= (char*) malloc_and_setzero(len); - memcpy(temp, maindata, len); - - // remove all c++ comments - /* replace all enters/tabs/etc with spaces */ - cp= temp; - a= len; - comment = 0; - while(a--) { - if(cp[0]=='/' && cp[1]=='/') { - comment = 1; - } else if (*cp<32) { - comment = 0; - } - if (comment || *cp<32 || *cp>128 ) *cp= 32; - cp++; - } - - - /* data from temp copy to maindata, remove comments and double spaces */ - cp= temp; - md= maindata; - newlen= 0; - comment= 0; - a= len; - while(a--) { - - if(cp[0]=='/' && cp[1]=='*') { - comment= 1; - cp[0]=cp[1]= 32; - } - if(cp[0]=='*' && cp[1]=='/') { - comment= 0; - cp[0]=cp[1]= 32; - } - - /* do not copy when: */ - if(comment); - else if( cp[0]==' ' && cp[1]==' ' ); - else if( cp[-1]=='*' && cp[0]==' ' ); /* pointers with a space */ - else { - md[0]= cp[0]; - md++; - newlen++; - } - cp++; - } - - free(temp); - return newlen; -} - -static void *read_file_data(char *filename, int *len_r) -{ -#ifdef WIN32 - FILE *fp= fopen(filename, "rb"); -#else - FILE *fp= fopen(filename, "r"); -#endif - void *data; - - if (!fp) { - *len_r= -1; - return NULL; - } - - fseek(fp, 0L, SEEK_END); - *len_r= ftell(fp); - fseek(fp, 0L, SEEK_SET); - - data= malloc_and_setzero(*len_r); - if (!data) { - *len_r= -1; - fclose(fp); - return NULL; - } - - if (fread(data, *len_r, 1, fp)!=1) { - *len_r= -1; - free(data); - fclose(fp); - return NULL; - } - - fclose(fp); - return data; -} - - -const char* skipStructTypes[]= -{ - "btRigidBodyConstructionInfo", - "Euler", - "btConstraintInfo2", - "btConstraintSetting", - "btTriangleInfo", - "" -}; - -int skipStruct(const char* structType) -{ - int i=0; - while (strlen(skipStructTypes[i])) - { - if (strcmp(structType,skipStructTypes[i])==0) - { - return 1; - } - i++; - } - return 0; -} - -int convert_include(char *filename) -{ - /* read include file, skip structs with a '#' before it. - store all data in temporal arrays. - */ - int filelen, count, overslaan, slen, type, name, strct; - short *structpoin, *sp; - char *maindata, *mainend, *md, *md1; - - md= maindata= (char*)read_file_data(filename, &filelen); - if (filelen==-1) { - printf("Can't read file %s\n", filename); - return 1; - } - - filelen= preprocess_include(maindata, filelen); - mainend= maindata+filelen-1; - - /* we look for '{' and then back to 'struct' */ - count= 0; - overslaan= 0; - while(count 1) printf("\t|\t|-- detected struct %s\n", types[strct]); - - /* first lets make it all nice strings */ - md1= md+1; - while(*md1 != '}') { - if(md1>mainend) break; - - if(*md1==',' || *md1==' ') *md1= 0; - md1++; - } - - /* read types and names until first character that is not '}' */ - md1= md+1; - while( *md1 != '}' ) { - if(md1>mainend) break; - - /* skip when it says 'struct' or 'unsigned' or 'const' */ - if(*md1) { - if( strncmp(md1, "struct", 6)==0 ) md1+= 7; - if( strncmp(md1, "unsigned", 8)==0 ) md1+= 9; - if( strncmp(md1, "const", 5)==0 ) md1+= 6; - - /* we've got a type! */ - type= add_type(md1, 0); - - if (debugSDNA > 1) printf("\t|\t|\tfound type %s (", md1); - - md1+= strlen(md1); - - - /* read until ';' */ - while( *md1 != ';' ) { - if(md1>mainend) break; - - if(*md1) { - /* We've got a name. slen needs - * correction for function - * pointers! */ - slen= (int) strlen(md1); - if( md1[slen-1]==';' ) { - md1[slen-1]= 0; - - - name= add_name(md1); - slen += additional_slen_offset; - sp[0]= type; - sp[1]= name; - - if ((debugSDNA>1) && (names[name] != 0 )) printf("%s |", names[name]); - - structpoin[1]++; - sp+= 2; - - md1+= slen; - break; - } - - - name= add_name(md1); - slen += additional_slen_offset; - - sp[0]= type; - sp[1]= name; - if ((debugSDNA > 1) && (names[name] != 0 )) printf("%s ||", names[name]); - - structpoin[1]++; - sp+= 2; - - md1+= slen; - } - md1++; - } - - if (debugSDNA > 1) printf(")\n"); - - } - md1++; - } - } - } - } - } - count++; - md++; - } - - free(maindata); - - return 0; -} - -int arraysize(char *astr, int len) -{ - int a, mul=1; - char str[100], *cp=0; - - memcpy(str, astr, len+1); - - for(a=0; a= firststruct) { - if(sizeof(void *)==8 && (len % 8) ) { - printf("Align struct error: %s %s\n", types[structtype],cp); - dna_error = 1; - } - } - - /* 2-4 aligned/ */ - if(typelens[type]>3 && (len % 4) ) { - printf("Align 4 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len%4); - dna_error = 1; - } - else if(typelens[type]==2 && (len % 2) ) { - printf("Align 2 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len%2); - dna_error = 1; - } - - len += mul*typelens[type]; - alphalen += mul * alphalens[type]; - - } else { - len= 0; - alphalen = 0; - break; - } - } - - if (len==0) { - unknown++; - } else { - typelens[structtype]= len; - alphalens[structtype]= alphalen; - // two ways to detect if a struct contains a pointer: - // has_pointer is set or alphalen != len - if (has_pointer || alphalen != len) { - if (alphalen % 8) { - printf("alphalen = %d len = %d\n",alphalen,len); - printf("Sizeerror 8 in struct: %s (add %d bytes)\n", types[structtype], alphalen%8); - dna_error = 1; - } - } - - if(len % 4) { - printf("Sizeerror 4 in struct: %s (add %d bytes)\n", types[structtype], len%4); - dna_error = 1; - } - - } - } - } - - if(unknown==lastunknown) break; - } - - if(unknown) { - printf("ERROR: still %d structs unknown\n", unknown); - - if (debugSDNA) { - printf("*** Known structs : \n"); - - for(a=0; a= MAX_DNA_LINE_LENGTH) { - fprintf(file, "\n"); - linelength = 0; - } - } -} - -void printStructLenghts(void) -{ - int a, unknown= nr_structs, lastunknown, structtype; - short *structpoin; - printf("\n\n*** All detected structs:\n"); - - while(unknown) { - lastunknown= unknown; - unknown= 0; - - /* check all structs... */ - for(a=0; a -1) { - fflush(stdout); - printf("Running makesdna at debug level %d\n", debugSDNA); - - } - - /* the longest known struct is 50k, so we assume 100k is sufficent! */ - namedata= (char*)malloc_and_setzero(maxdata); - typedata= (char*)malloc_and_setzero(maxdata); - structdata= (short*)malloc_and_setzero(maxdata); - - /* a maximum of 5000 variables, must be sufficient? */ - names= (char**)malloc_and_setzero(sizeof(char *)*maxnr); - types= (char**)malloc_and_setzero(sizeof(char *)*maxnr); - typelens= (short*) malloc_and_setzero(sizeof(short)*maxnr); - alphalens= (short*)malloc_and_setzero(sizeof(short)*maxnr); - structs= (short**)malloc_and_setzero(sizeof(short)*maxnr); - - /* insertion of all known types */ - /* watch it: uint is not allowed! use in structs an unsigned int */ - add_type("char", 1); /* 0 */ - add_type("uchar", 1); /* 1 */ - add_type("short", 2); /* 2 */ - add_type("ushort", 2); /* 3 */ - add_type("int", 4); /* 4 */ - add_type("long", 4); /* 5 */ /* should it be 8 on 64 bits? */ - add_type("ulong", 4); /* 6 */ - add_type("float", 4); /* 7 */ - add_type("double", 8); /* 8 */ - add_type("void", 0); /* 9 */ - - // the defines above shouldn't be output in the padding file... - firststruct = nr_types; - - /* add all include files defined in the global array */ - /* Since the internal file+path name buffer has limited length, I do a */ - /* little test first... */ - /* Mind the breaking condition here! */ - if (debugSDNA) printf("\tStart of header scan:\n"); - for (i = 0; strlen(includefiles[i]); i++) { - sprintf(str, "%s%s", baseDirectory, includefiles[i]); - if (debugSDNA) printf("\t|-- Converting %s\n", str); - if (convert_include(str)) { - return (1); - } - } - if (debugSDNA) printf("\tFinished scanning %d headers.\n", i); - - if (calculate_structlens(firststruct)) { - // error - return(1); - } - - - /* FOR DEBUG */ - if (debugSDNA > 1) - { - int a,b; -/* short *elem; */ - short num_types; - - printf("nr_names %d nr_types %d nr_structs %d\n", nr_names, nr_types, nr_structs); - for(a=0; a -1) printf("Writing file ... "); - - if(nr_names==0 || nr_structs==0); - else { - strcpy(str, "SDNA"); - dna_write(file, str, 4); - - /* write names */ - strcpy(str, "NAME"); - dna_write(file, str, 4); - len= nr_names; - dna_write(file, &len, 4); - - /* calculate size of datablock with strings */ - cp= names[nr_names-1]; - cp+= strlen(names[nr_names-1]) + 1; /* +1: null-terminator */ - len= (intptr_t) (cp - (char*) names[0]); - len= (len+3) & ~3; - dna_write(file, names[0], len); - - /* write TYPES */ - strcpy(str, "TYPE"); - dna_write(file, str, 4); - len= nr_types; - dna_write(file, &len, 4); - - /* calculate datablock size */ - cp= types[nr_types-1]; - cp+= strlen(types[nr_types-1]) + 1; /* +1: null-terminator */ - len= (intptr_t) (cp - (char*) types[0]); - len= (len+3) & ~3; - - dna_write(file, types[0], len); - - /* WRITE TYPELENGTHS */ - strcpy(str, "TLEN"); - dna_write(file, str, 4); - - len= 2*nr_types; - if(nr_types & 1) len+= 2; - dna_write(file, typelens, len); - - /* WRITE STRUCTS */ - strcpy(str, "STRC"); - dna_write(file, str, 4); - len= nr_structs; - dna_write(file, &len, 4); - - /* calc datablock size */ - sp= structs[nr_structs-1]; - sp+= 2+ 2*( sp[1] ); - len= (intptr_t) ((char*) sp - (char*) structs[0]); - len= (len+3) & ~3; - - dna_write(file, structs[0], len); - - /* a simple dna padding test */ - if (0) { - FILE *fp; - int a; - - fp= fopen("padding.c", "w"); - if(fp==NULL); - else { - - // add all include files defined in the global array - for (i = 0; strlen(includefiles[i]); i++) { - fprintf(fp, "#include \"%s%s\"\n", baseDirectory, includefiles[i]); - } - - fprintf(fp, "main(){\n"); - sp = typelens; - sp += firststruct; - for(a=firststruct; a -1) printf("done.\n"); - - return(0); -} - -/* ************************* END MAKE DNA ********************** */ - -static void make_bad_file(char *file) -{ - FILE *fp= fopen(file, "w"); - fprintf(fp, "ERROR! Cannot make correct DNA.c file, STUPID!\n"); - fclose(fp); -} - -#ifndef BASE_HEADER -#define BASE_HEADER "../" -#endif - -int main(int argc, char ** argv) -{ -// printf("btCollisionObject=%d\n",sizeof(btCollisionObject)); -// printf("btCollisionObjectData=%d\n",sizeof(btCollisionObjectData)); -// printf("btTransform=%d\n",sizeof(btTransform)); -// printf("btTransformData=%d\n",sizeof(btTransformData)); -// -// btCollisionObject* bla = new btCollisionObject(); -// btCollisionObjectData* bla2 = new btCollisionObjectData(); - - //int offsetof(bla,m_hasAnisotropicFriction); -/* - btTransformData m_worldTransform; - btTransform m_interpolationWorldTransform; - btVector3 m_interpolationLinearVelocity; - btVector3 m_interpolationAngularVelocity; - btVector3 m_anisotropicFriction; - bool m_hasAnisotropicFriction; - btScalar m_contactProcessingThreshold; - btBroadphaseProxy *m_broadphaseHandle; - btCollisionShape *m_collisionShape; - btCollisionShape *m_rootCollisionShape; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - btScalar m_deactivationTime; - btScalar m_friction; - btScalar m_restitution; - void* m_userObjectPointer; - int m_internalType; - btScalar m_hitFraction; - btScalar m_ccdSweptSphereRadius; - btScalar m_ccdMotionThreshold; - bool m_checkCollideWith; - char m_pad[7]; -*/ - - FILE *file; - int return_status = 0; - - if (argc!=2 && argc!=3) { - printf("Usage: %s outfile.c [base directory]\n", argv[0]); - return_status = 1; - } else { - file = fopen(argv[1], "w"); - if (!file) { - printf ("Unable to open file: %s\n", argv[1]); - return_status = 1; - } else { - char baseDirectory[256]; - - if (argc==3) { - strcpy(baseDirectory, argv[2]); - } else { - strcpy(baseDirectory, BASE_HEADER); - } - - if (sizeof(void*)==8) - { - fprintf (file, "unsigned char sBulletDNAstr64[]= {\n"); - } else - { - fprintf (file, "unsigned char sBulletDNAstr[]= {\n"); - } - - if (make_structDNA(baseDirectory, file)) { - // error - fclose(file); - make_bad_file(argv[1]); - return_status = 1; - } else { - fprintf(file, "};\n"); - if (sizeof(void*)==8) - { - fprintf(file, "int sBulletDNAlen64= sizeof(sBulletDNAstr64);\n"); - } else - { - fprintf(file, "int sBulletDNAlen= sizeof(sBulletDNAstr);\n"); - } - - fclose(file); - } - } - } - - - return(return_status); -} - - -/* end of list */ +/// Current makesdna.cpp is a from Blender, but we will completely rewrite it in C++ under a ZLib license +/// The Original version is at https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/makesdna/intern/makesdna.c + +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + * Struct muncher for making SDNA + * + * Originally by Ton, some mods by Frank, and some cleaning and + * extension by Nzc. + * + * Makesdna creates a .c file with a long string of numbers that + * encode the Blender file format. It is fast, because it is basically + * a binary dump. There are some details to mind when reconstructing + * the file (endianness and byte-alignment). + * + * This little program scans all structs that need to be serialized, + * and determined the names and types of all members. It calculates + * how much memory (on disk or in ram) is needed to store that struct, + * and the offsets for reaching a particular one. + * + * There is a facility to get verbose output from sdna. Search for + * debugSDNA. This int can be set to 0 (no output) to some int. Higher + * numbers give more output. + * */ + + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) && !defined(FREE_WINDOWS) + +/* The __intXX are built-in types of the visual complier! So we don't + * need to include anything else here. */ + +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +typedef signed __int64 int64_t; + +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; + +#ifndef _INTPTR_T_DEFINED +#ifdef _WIN64 +typedef __int64 intptr_t; +#else +typedef long intptr_t; +#endif +#define _INTPTR_T_DEFINED +#endif + +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned long uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif + +#elif defined(__linux__) || defined(__NetBSD__) + + /* Linux-i386, Linux-Alpha, Linux-ppc */ +#include + +#elif defined (__APPLE__) + +#include + +#elif defined(FREE_WINDOWS) + +#include + +#else + + /* FreeBSD, Irix, Solaris */ +#include + +#endif /* ifdef platform for types */ + +#ifdef __cplusplus +} +#endif + + +#include +#include +#include + +//#include "DNA_sdna_types.h" +// include files for automatic dependancies +#include "DNA_rigidbody.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btMatrix3x3.h" +#include "LinearMath/btTransform.h" +#include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" +#include "BulletCollision/CollisionShapes/btConvexInternalShape.h" +#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" +#include "BulletCollision/CollisionShapes/btStridingMeshInterface.h" +#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "BulletCollision/CollisionShapes/btCylinderShape.h" +#include "BulletCollision/CollisionShapes/btCapsuleShape.h" +#include "BulletCollision/CollisionShapes/btTriangleInfoMap.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" +#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" +#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" +#include "BulletDynamics/ConstraintSolver/btConeTwistConstraint.h" +#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h" +#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" + +#include "BulletDynamics/Dynamics/btRigidBody.h" + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#define SDNA_MAX_FILENAME_LENGTH 255 + +/* Included the path relative from /source/blender/ here, so we can move */ +/* headers around with more freedom. */ +char *includefiles[] = { + + // if you add files here, please add them at the end + // of makesdna.c (this file) as well + "../makesdna/DNA_rigidbody.h", + "../../../src/LinearMath/btVector3.h", + "../../../src/LinearMath/btMatrix3x3.h", + "../../../src/LinearMath/btTransform.h", + "../../../src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h", + "../../../src/BulletCollision/CollisionShapes/btCollisionShape.h", + "../../../src/BulletCollision/CollisionShapes/btStaticPlaneShape.h", + "../../../src/BulletCollision/CollisionShapes/btConvexInternalShape.h", + "../../../src/BulletCollision/CollisionShapes/btMultiSphereShape.h", + "../../../src/BulletCollision/CollisionShapes/btStridingMeshInterface.h", + "../../../src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h", + "../../../src/BulletCollision/CollisionShapes/btCompoundShape.h", + "../../../src/BulletCollision/CollisionShapes/btCylinderShape.h", + "../../../src/BulletCollision/CollisionShapes/btCapsuleShape.h", + "../../../src/BulletCollision/CollisionShapes/btTriangleInfoMap.h", + "../../../src/BulletCollision/Gimpact/btGImpactShape.h", + "../../../src/BulletCollision/CollisionShapes/btConvexHullShape.h", + "../../../src/BulletCollision/CollisionDispatch/btCollisionObject.h", + "../../../src/BulletDynamics/Dynamics/btRigidBody.h", + "../../../src/BulletDynamics/ConstraintSolver/btTypedConstraint.h", + "../../../src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h", + "../../../src/BulletDynamics/ConstraintSolver/btHingeConstraint.h", + "../../../src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h", + "../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h", + "../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h", + + // empty string to indicate end of includefiles + "" +}; + +void* malloc_and_setzero(int numbytes) +{ + char* buf = (char*)malloc(numbytes); + memset(buf,0,numbytes); + return buf; +} + +int maxdata= 500000, maxnr= 50000; +int nr_names=0; +int nr_types=0; +int nr_structs=0; +char **names, *namedata; /* at adress names[a] is string a */ +char **types, *typedata; /* at adress types[a] is string a */ +short *typelens; /* at typelens[a] is de length of type a */ +short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits) */ +short **structs, *structdata; /* at sp= structs[a] is the first adress of a struct definition + sp[0] is type number + sp[1] is amount of elements + sp[2] sp[3] is typenr, namenr (etc) */ +/* + * debugSDNA: + * - 0 = no output, except errors + * - 1 = detail actions + * - 2 = full trace, tell which names and types were found + * - 4 = full trace, plus all gritty details + */ +int debugSDNA = 0; +int additional_slen_offset; + +/* ************************************************************************** */ +/* Functions */ +/* ************************************************************************** */ + +/** + * Add type to struct indexed by , if it was not yet found. + */ +int add_type(char *str, int len); + +/** + * Add variable to + */ +int add_name(char *str); + +/** + * Search whether this structure type was already found, and if not, + * add it. + */ +short *add_struct(int namecode); + +/** + * Remove comments from this buffer. Assumes that the buffer refers to + * ascii-code text. + */ +int preprocess_include(char *maindata, int len); + +/** + * Scan this file for serializable types. + */ +int convert_include(char *filename); + +/** + * Determine how many bytes are needed for an array. + */ +int arraysize(char *astr, int len); + +/** + * Determine how many bytes are needed for each struct. + */ +static int calculate_structlens(int); + +/** + * Construct the DNA.c file + */ +void dna_write(FILE *file, void *pntr, int size); + +/** + * Report all structures found so far, and print their lenghts. + */ +void printStructLenghts(void); + + + +/* ************************************************************************** */ +/* Implementation */ +/* ************************************************************************** */ + +/* ************************* MAKEN DNA ********************** */ + +int add_type(char *str, int len) +{ + int nr; + char *cp; + + if(str[0]==0) return -1; + + /* search through type array */ + for(nr=0; nr=maxnr) { + printf("too many types\n"); + return nr_types-1;; + } + nr_types++; + + return nr_types-1; +} + +/** + * + * Because of the weird way of tokenizing, we have to 'cast' function + * pointers to ... (*f)(), whatever the original signature. In fact, + * we add name and type at the same time... There are two special + * cases, unfortunately. These are explicitly checked. + * + * */ +int add_name(char *str) +{ + int nr, i, j, k; + char *cp; + char buf[255]; /* stupid limit, change it :) */ + char *name; + + additional_slen_offset = 0; + + if((str[0]==0) /* || (str[1]==0) */) return -1; + + if (str[0] == '(' && str[1] == '*') { + if (debugSDNA > 3) printf("\t\t\t\t*** Function pointer found\n"); + /* functionpointer: transform the type (sometimes) */ + i = 0; + j = 0; + + while (str[i] != ')') { + buf[i] = str[i]; + i++; + } + + /* Another number we need is the extra slen offset. This extra + * offset is the overshoot after a space. If there is no + * space, no overshoot should be calculated. */ + j = i; /* j at first closing brace */ + + if (debugSDNA > 3) printf("first brace after offset %d\n", i); + + j++; /* j beyond closing brace ? */ + while ((str[j] != 0) && (str[j] != ')' )) { + if (debugSDNA > 3) printf("seen %c ( %d) \n", str[j], str[j]); + j++; + } + if (debugSDNA > 3) printf("seen %c ( %d) \n", str[j], str[j]); + if (debugSDNA > 3) printf("special after offset %d\n", j); + + if (str[j] == 0 ) { + if (debugSDNA > 3) printf("offsetting for space\n"); + /* get additional offset */ + k = 0; + while (str[j] != ')') { + j++; + k++; + } + if (debugSDNA > 3) printf("extra offset %d\n", k); + additional_slen_offset = k; + } else if (str[j] == ')' ) { + if (debugSDNA > 3) printf("offsetting for brace\n"); + ; /* don't get extra offset */ + } else { + printf("Error during tokening function pointer argument list\n"); + } + + /* + * Put )(void) at the end? Maybe )(). Should check this with + * old sdna. Actually, sometimes )(), sometimes )(void...) + * Alas.. such is the nature of braindamage :( + * + * Sorted it out: always do )(), except for headdraw and + * windraw, part of ScrArea. This is important, because some + * linkers will treat different fp's differently when called + * !!! This has to do with interference in byte-alignment and + * the way args are pushed on the stack. + * + * */ + buf[i] = 0; + if (debugSDNA > 3) printf("Name before chomping: %s\n", buf); + if ( (strncmp(buf,"(*headdraw", 10) == 0) + || (strncmp(buf,"(*windraw", 9) == 0) ) { + buf[i] = ')'; + buf[i+1] = '('; + buf[i+2] = 'v'; + buf[i+3] = 'o'; + buf[i+4] = 'i'; + buf[i+5] = 'd'; + buf[i+6] = ')'; + buf[i+7] = 0; + } else { + buf[i] = ')'; + buf[i+1] = '('; + buf[i+2] = ')'; + buf[i+3] = 0; + } + /* now precede with buf*/ + if (debugSDNA > 3) printf("\t\t\t\t\tProposing fp name %s\n", buf); + name = buf; + } else { + /* normal field: old code */ + name = str; + } + + /* search name array */ + for(nr=0; nr=maxnr) { + printf("too many names\n"); + return nr_names-1; + } + nr_names++; + + return nr_names-1; +} + +short *add_struct(int namecode) +{ + int len; + short *sp; + + if(nr_structs==0) { + structs[0]= structdata; + } + else { + sp= structs[nr_structs-1]; + len= sp[1]; + structs[nr_structs]= sp+ 2*len+2; + } + + sp= structs[nr_structs]; + sp[0]= namecode; + + if(nr_structs>=maxnr) { + printf("too many structs\n"); + return sp; + } + nr_structs++; + + return sp; +} + +int preprocess_include(char *maindata, int len) +{ + int a, newlen, comment = 0; + char *cp, *temp, *md; + + temp= (char*) malloc_and_setzero(len); + memcpy(temp, maindata, len); + + // remove all c++ comments + /* replace all enters/tabs/etc with spaces */ + cp= temp; + a= len; + comment = 0; + while(a--) { + if(cp[0]=='/' && cp[1]=='/') { + comment = 1; + } else if (*cp<32) { + comment = 0; + } + if (comment || *cp<32 || *cp>128 ) *cp= 32; + cp++; + } + + + /* data from temp copy to maindata, remove comments and double spaces */ + cp= temp; + md= maindata; + newlen= 0; + comment= 0; + a= len; + while(a--) { + + if(cp[0]=='/' && cp[1]=='*') { + comment= 1; + cp[0]=cp[1]= 32; + } + if(cp[0]=='*' && cp[1]=='/') { + comment= 0; + cp[0]=cp[1]= 32; + } + + /* do not copy when: */ + if(comment); + else if( cp[0]==' ' && cp[1]==' ' ); + else if( cp[-1]=='*' && cp[0]==' ' ); /* pointers with a space */ + else { + md[0]= cp[0]; + md++; + newlen++; + } + cp++; + } + + free(temp); + return newlen; +} + +static void *read_file_data(char *filename, int *len_r) +{ +#ifdef WIN32 + FILE *fp= fopen(filename, "rb"); +#else + FILE *fp= fopen(filename, "r"); +#endif + void *data; + + if (!fp) { + *len_r= -1; + return NULL; + } + + fseek(fp, 0L, SEEK_END); + *len_r= ftell(fp); + fseek(fp, 0L, SEEK_SET); + + data= malloc_and_setzero(*len_r); + if (!data) { + *len_r= -1; + fclose(fp); + return NULL; + } + + if (fread(data, *len_r, 1, fp)!=1) { + *len_r= -1; + free(data); + fclose(fp); + return NULL; + } + + fclose(fp); + return data; +} + + +const char* skipStructTypes[]= +{ + "btRigidBodyConstructionInfo", + "Euler", + "btConstraintInfo2", + "btConstraintSetting", + "btTriangleInfo", + "" +}; + +int skipStruct(const char* structType) +{ + int i=0; + while (strlen(skipStructTypes[i])) + { + if (strcmp(structType,skipStructTypes[i])==0) + { + return 1; + } + i++; + } + return 0; +} + +int convert_include(char *filename) +{ + /* read include file, skip structs with a '#' before it. + store all data in temporal arrays. + */ + int filelen, count, overslaan, slen, type, name, strct; + short *structpoin, *sp; + char *maindata, *mainend, *md, *md1; + + md= maindata= (char*)read_file_data(filename, &filelen); + if (filelen==-1) { + printf("Can't read file %s\n", filename); + return 1; + } + + filelen= preprocess_include(maindata, filelen); + mainend= maindata+filelen-1; + + /* we look for '{' and then back to 'struct' */ + count= 0; + overslaan= 0; + while(count 1) printf("\t|\t|-- detected struct %s\n", types[strct]); + + /* first lets make it all nice strings */ + md1= md+1; + while(*md1 != '}') { + if(md1>mainend) break; + + if(*md1==',' || *md1==' ') *md1= 0; + md1++; + } + + /* read types and names until first character that is not '}' */ + md1= md+1; + while( *md1 != '}' ) { + if(md1>mainend) break; + + /* skip when it says 'struct' or 'unsigned' or 'const' */ + if(*md1) { + if( strncmp(md1, "struct", 6)==0 ) md1+= 7; + if( strncmp(md1, "unsigned", 8)==0 ) md1+= 9; + if( strncmp(md1, "const", 5)==0 ) md1+= 6; + + /* we've got a type! */ + type= add_type(md1, 0); + + if (debugSDNA > 1) printf("\t|\t|\tfound type %s (", md1); + + md1+= strlen(md1); + + + /* read until ';' */ + while( *md1 != ';' ) { + if(md1>mainend) break; + + if(*md1) { + /* We've got a name. slen needs + * correction for function + * pointers! */ + slen= (int) strlen(md1); + if( md1[slen-1]==';' ) { + md1[slen-1]= 0; + + + name= add_name(md1); + slen += additional_slen_offset; + sp[0]= type; + sp[1]= name; + + if ((debugSDNA>1) && (names[name] != 0 )) printf("%s |", names[name]); + + structpoin[1]++; + sp+= 2; + + md1+= slen; + break; + } + + + name= add_name(md1); + slen += additional_slen_offset; + + sp[0]= type; + sp[1]= name; + if ((debugSDNA > 1) && (names[name] != 0 )) printf("%s ||", names[name]); + + structpoin[1]++; + sp+= 2; + + md1+= slen; + } + md1++; + } + + if (debugSDNA > 1) printf(")\n"); + + } + md1++; + } + } + } + } + } + count++; + md++; + } + + free(maindata); + + return 0; +} + +int arraysize(char *astr, int len) +{ + int a, mul=1; + char str[100], *cp=0; + + memcpy(str, astr, len+1); + + for(a=0; a= firststruct) { + if(sizeof(void *)==8 && (len % 8) ) { + printf("Align struct error: %s %s\n", types[structtype],cp); + dna_error = 1; + } + } + + /* 2-4 aligned/ */ + if(typelens[type]>3 && (len % 4) ) { + printf("Align 4 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len%4); + dna_error = 1; + } + else if(typelens[type]==2 && (len % 2) ) { + printf("Align 2 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len%2); + dna_error = 1; + } + + len += mul*typelens[type]; + alphalen += mul * alphalens[type]; + + } else { + len= 0; + alphalen = 0; + break; + } + } + + if (len==0) { + unknown++; + } else { + typelens[structtype]= len; + alphalens[structtype]= alphalen; + // two ways to detect if a struct contains a pointer: + // has_pointer is set or alphalen != len + if (has_pointer || alphalen != len) { + if (alphalen % 8) { + printf("alphalen = %d len = %d\n",alphalen,len); + printf("Sizeerror 8 in struct: %s (add %d bytes)\n", types[structtype], alphalen%8); + dna_error = 1; + } + } + + if(len % 4) { + printf("Sizeerror 4 in struct: %s (add %d bytes)\n", types[structtype], len%4); + dna_error = 1; + } + + } + } + } + + if(unknown==lastunknown) break; + } + + if(unknown) { + printf("ERROR: still %d structs unknown\n", unknown); + + if (debugSDNA) { + printf("*** Known structs : \n"); + + for(a=0; a= MAX_DNA_LINE_LENGTH) { + fprintf(file, "\n"); + linelength = 0; + } + } +} + +void printStructLenghts(void) +{ + int a, unknown= nr_structs, lastunknown, structtype; + short *structpoin; + printf("\n\n*** All detected structs:\n"); + + while(unknown) { + lastunknown= unknown; + unknown= 0; + + /* check all structs... */ + for(a=0; a -1) { + fflush(stdout); + printf("Running makesdna at debug level %d\n", debugSDNA); + + } + + /* the longest known struct is 50k, so we assume 100k is sufficent! */ + namedata= (char*)malloc_and_setzero(maxdata); + typedata= (char*)malloc_and_setzero(maxdata); + structdata= (short*)malloc_and_setzero(maxdata); + + /* a maximum of 5000 variables, must be sufficient? */ + names= (char**)malloc_and_setzero(sizeof(char *)*maxnr); + types= (char**)malloc_and_setzero(sizeof(char *)*maxnr); + typelens= (short*) malloc_and_setzero(sizeof(short)*maxnr); + alphalens= (short*)malloc_and_setzero(sizeof(short)*maxnr); + structs= (short**)malloc_and_setzero(sizeof(short)*maxnr); + + /* insertion of all known types */ + /* watch it: uint is not allowed! use in structs an unsigned int */ + add_type("char", 1); /* 0 */ + add_type("uchar", 1); /* 1 */ + add_type("short", 2); /* 2 */ + add_type("ushort", 2); /* 3 */ + add_type("int", 4); /* 4 */ + add_type("long", 4); /* 5 */ /* should it be 8 on 64 bits? */ + add_type("ulong", 4); /* 6 */ + add_type("float", 4); /* 7 */ + add_type("double", 8); /* 8 */ + add_type("void", 0); /* 9 */ + + // the defines above shouldn't be output in the padding file... + firststruct = nr_types; + + /* add all include files defined in the global array */ + /* Since the internal file+path name buffer has limited length, I do a */ + /* little test first... */ + /* Mind the breaking condition here! */ + if (debugSDNA) printf("\tStart of header scan:\n"); + for (i = 0; strlen(includefiles[i]); i++) { + sprintf(str, "%s%s", baseDirectory, includefiles[i]); + if (debugSDNA) printf("\t|-- Converting %s\n", str); + if (convert_include(str)) { + return (1); + } + } + if (debugSDNA) printf("\tFinished scanning %d headers.\n", i); + + if (calculate_structlens(firststruct)) { + // error + return(1); + } + + + /* FOR DEBUG */ + if (debugSDNA > 1) + { + int a,b; +/* short *elem; */ + short num_types; + + printf("nr_names %d nr_types %d nr_structs %d\n", nr_names, nr_types, nr_structs); + for(a=0; a -1) printf("Writing file ... "); + + if(nr_names==0 || nr_structs==0); + else { + strcpy(str, "SDNA"); + dna_write(file, str, 4); + + /* write names */ + strcpy(str, "NAME"); + dna_write(file, str, 4); + len= nr_names; + dna_write(file, &len, 4); + + /* calculate size of datablock with strings */ + cp= names[nr_names-1]; + cp+= strlen(names[nr_names-1]) + 1; /* +1: null-terminator */ + len= (intptr_t) (cp - (char*) names[0]); + len= (len+3) & ~3; + dna_write(file, names[0], len); + + /* write TYPES */ + strcpy(str, "TYPE"); + dna_write(file, str, 4); + len= nr_types; + dna_write(file, &len, 4); + + /* calculate datablock size */ + cp= types[nr_types-1]; + cp+= strlen(types[nr_types-1]) + 1; /* +1: null-terminator */ + len= (intptr_t) (cp - (char*) types[0]); + len= (len+3) & ~3; + + dna_write(file, types[0], len); + + /* WRITE TYPELENGTHS */ + strcpy(str, "TLEN"); + dna_write(file, str, 4); + + len= 2*nr_types; + if(nr_types & 1) len+= 2; + dna_write(file, typelens, len); + + /* WRITE STRUCTS */ + strcpy(str, "STRC"); + dna_write(file, str, 4); + len= nr_structs; + dna_write(file, &len, 4); + + /* calc datablock size */ + sp= structs[nr_structs-1]; + sp+= 2+ 2*( sp[1] ); + len= (intptr_t) ((char*) sp - (char*) structs[0]); + len= (len+3) & ~3; + + dna_write(file, structs[0], len); + + /* a simple dna padding test */ + if (0) { + FILE *fp; + int a; + + fp= fopen("padding.c", "w"); + if(fp==NULL); + else { + + // add all include files defined in the global array + for (i = 0; strlen(includefiles[i]); i++) { + fprintf(fp, "#include \"%s%s\"\n", baseDirectory, includefiles[i]); + } + + fprintf(fp, "main(){\n"); + sp = typelens; + sp += firststruct; + for(a=firststruct; a -1) printf("done.\n"); + + return(0); +} + +/* ************************* END MAKE DNA ********************** */ + +static void make_bad_file(char *file) +{ + FILE *fp= fopen(file, "w"); + fprintf(fp, "ERROR! Cannot make correct DNA.c file, STUPID!\n"); + fclose(fp); +} + +#ifndef BASE_HEADER +#define BASE_HEADER "../" +#endif + +int main(int argc, char ** argv) +{ +// printf("btCollisionObject=%d\n",sizeof(btCollisionObject)); +// printf("btCollisionObjectData=%d\n",sizeof(btCollisionObjectData)); +// printf("btTransform=%d\n",sizeof(btTransform)); +// printf("btTransformData=%d\n",sizeof(btTransformData)); +// +// btCollisionObject* bla = new btCollisionObject(); +// btCollisionObjectData* bla2 = new btCollisionObjectData(); + + //int offsetof(bla,m_hasAnisotropicFriction); +/* + btTransformData m_worldTransform; + btTransform m_interpolationWorldTransform; + btVector3 m_interpolationLinearVelocity; + btVector3 m_interpolationAngularVelocity; + btVector3 m_anisotropicFriction; + bool m_hasAnisotropicFriction; + btScalar m_contactProcessingThreshold; + btBroadphaseProxy *m_broadphaseHandle; + btCollisionShape *m_collisionShape; + btCollisionShape *m_rootCollisionShape; + int m_collisionFlags; + int m_islandTag1; + int m_companionId; + int m_activationState1; + btScalar m_deactivationTime; + btScalar m_friction; + btScalar m_restitution; + void* m_userObjectPointer; + int m_internalType; + btScalar m_hitFraction; + btScalar m_ccdSweptSphereRadius; + btScalar m_ccdMotionThreshold; + bool m_checkCollideWith; + char m_pad[7]; +*/ + + FILE *file; + int return_status = 0; + + if (argc!=2 && argc!=3) { + printf("Usage: %s outfile.c [base directory]\n", argv[0]); + return_status = 1; + } else { + file = fopen(argv[1], "w"); + if (!file) { + printf ("Unable to open file: %s\n", argv[1]); + return_status = 1; + } else { + char baseDirectory[256]; + + if (argc==3) { + strcpy(baseDirectory, argv[2]); + } else { + strcpy(baseDirectory, BASE_HEADER); + } + + if (sizeof(void*)==8) + { + fprintf (file, "unsigned char sBulletDNAstr64[]= {\n"); + } else + { + fprintf (file, "unsigned char sBulletDNAstr[]= {\n"); + } + + if (make_structDNA(baseDirectory, file)) { + // error + fclose(file); + make_bad_file(argv[1]); + return_status = 1; + } else { + fprintf(file, "};\n"); + if (sizeof(void*)==8) + { + fprintf(file, "int sBulletDNAlen64= sizeof(sBulletDNAstr64);\n"); + } else + { + fprintf(file, "int sBulletDNAlen= sizeof(sBulletDNAstr);\n"); + } + + fclose(file); + } + } + } + + + return(return_status); +} + + +/* end of list */ diff --git a/Extras/glui/GL/glui.h b/Extras/glui/GL/glui.h index 8ace06a43..b2229415d 100644 --- a/Extras/glui/GL/glui.h +++ b/Extras/glui/GL/glui.h @@ -1,2723 +1,2723 @@ -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - ---------------------------------- - - glui.h - Main (and only) external header for - GLUI User Interface Toolkit - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#ifndef GLUI_GLUI_H -#define GLUI_GLUI_H - -#ifdef WIN32 - #pragma warning(disable : 4324) // disable padding warning - #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. - #pragma warning(disable:4996) //Turn off warnings about deprecated C routines - #pragma warning(disable:4786) // Disable the "debug name too long" warning -#endif - - -#ifdef WIN32//for glut.h -#include -#endif - -#if defined(GLUI_FREEGLUT) || defined(BT_USE_FREEGLUT) - - // FreeGLUT does not yet work perfectly with GLUI - // - use at your own risk. - #include - -#elif defined(GLUI_OPENGLUT) - - // OpenGLUT does not yet work properly with GLUI - // - use at your own risk. - - #include - -#else - -#if defined(__APPLE__) && !defined (VMDMESA) - #include - #include - #include -#else -// #include "../../freeglut/gl/glut.h" - #include - #endif - -#endif - -#include -#include -#include -#include -#include - -#define GLUI_VERSION 2.3f /********** Current version **********/ - -#if defined(_WIN32) -#if !defined(GLUI_NO_LIB_PRAGMA) -//#pragma comment(lib, "glui32.lib") // Link automatically with GLUI library -#endif -#endif - -/********** Do some basic defines *******/ - -#ifndef Byte -#define Byte unsigned char -#endif - -#ifndef _RGBC_ -class RGBc { -public: - Byte r, g, b; - - void set(Byte r,Byte g,Byte b) {this->r=r;this->g=g;this->b=b;} - - RGBc( void ) {} - RGBc( Byte r, Byte g, Byte b ) { set( r, g, b ); } -}; -#define _RGBC_ -#endif - -/********** List of GLUT callbacks ********/ - -enum GLUI_Glut_CB_Types -{ - GLUI_GLUT_RESHAPE, - GLUI_GLUT_KEYBOARD, - GLUI_GLUT_DISPLAY, - GLUI_GLUT_MOUSE, - GLUI_GLUT_MOTION, - GLUI_GLUT_SPECIAL, - GLUI_GLUT_SPECIAL_UP, - GLUI_GLUT_PASSIVE_MOTION, - GLUI_GLUT_ENTRY, - GLUI_GLUT_VISIBILITY -}; - -/********* Constants for window placement **********/ - -#define GLUI_XOFF 6 -#define GLUI_YOFF 6 -#define GLUI_ITEMSPACING 3 -#define GLUI_CHECKBOX_SIZE 13 -#define GLUI_RADIOBUTTON_SIZE 13 -#define GLUI_BUTTON_SIZE 20 -#define GLUI_STATICTEXT_SIZE 13 -#define GLUI_SEPARATOR_HEIGHT 8 -#define GLUI_DEFAULT_CONTROL_WIDTH 100 -#define GLUI_DEFAULT_CONTROL_HEIGHT 13 -#define GLUI_EDITTEXT_BOXINNERMARGINX 3 -#define GLUI_EDITTEXT_HEIGHT 20 -#define GLUI_EDITTEXT_WIDTH 130 -#define GLUI_EDITTEXT_MIN_INT_WIDTH 35 -#define GLUI_EDITTEXT_MIN_TEXT_WIDTH 50 -#define GLUI_PANEL_NAME_DROP 8 -#define GLUI_PANEL_EMBOSS_TOP 4 -/* #define GLUI_ROTATION_WIDTH 60 */ -/* #define GLUI_ROTATION_HEIGHT 78 */ -#define GLUI_ROTATION_WIDTH 50 -#define GLUI_ROTATION_HEIGHT (GLUI_ROTATION_WIDTH+18) -#define GLUI_MOUSE_INTERACTION_WIDTH 50 -#define GLUI_MOUSE_INTERACTION_HEIGHT (GLUI_MOUSE_INTERACTION_WIDTH)+18 - -/** Different panel control types **/ -#define GLUI_PANEL_NONE 0 -#define GLUI_PANEL_EMBOSSED 1 -#define GLUI_PANEL_RAISED 2 - -/** Max # of els in control's float_array **/ -#define GLUI_DEF_MAX_ARRAY 30 - -/********* The control's 'active' behavior *********/ -#define GLUI_CONTROL_ACTIVE_MOUSEDOWN 1 -#define GLUI_CONTROL_ACTIVE_PERMANENT 2 - -/********* Control alignment types **********/ -#define GLUI_ALIGN_CENTER 1 -#define GLUI_ALIGN_RIGHT 2 -#define GLUI_ALIGN_LEFT 3 - -/********** Limit types - how to limit spinner values *********/ -#define GLUI_LIMIT_NONE 0 -#define GLUI_LIMIT_CLAMP 1 -#define GLUI_LIMIT_WRAP 2 - -/********** Translation control types ********************/ -#define GLUI_TRANSLATION_XY 0 -#define GLUI_TRANSLATION_Z 1 -#define GLUI_TRANSLATION_X 2 -#define GLUI_TRANSLATION_Y 3 - -#define GLUI_TRANSLATION_LOCK_NONE 0 -#define GLUI_TRANSLATION_LOCK_X 1 -#define GLUI_TRANSLATION_LOCK_Y 2 - -/********** How was a control activated? *****************/ -#define GLUI_ACTIVATE_MOUSE 1 -#define GLUI_ACTIVATE_TAB 2 - -/********** What type of live variable does a control have? **********/ -#define GLUI_LIVE_NONE 0 -#define GLUI_LIVE_INT 1 -#define GLUI_LIVE_FLOAT 2 -#define GLUI_LIVE_TEXT 3 -#define GLUI_LIVE_STRING 6 -#define GLUI_LIVE_DOUBLE 4 -#define GLUI_LIVE_FLOAT_ARRAY 5 - -/************* Textbox and List Defaults - JVK ******************/ -#define GLUI_TEXTBOX_HEIGHT 130 -#define GLUI_TEXTBOX_WIDTH 130 -#define GLUI_LIST_HEIGHT 130 -#define GLUI_LIST_WIDTH 130 -#define GLUI_DOUBLE_CLICK 1 -#define GLUI_SINGLE_CLICK 0 -#define GLUI_TAB_WIDTH 50 /* In pixels */ -#define GLUI_TEXTBOX_BOXINNERMARGINX 3 -#define GLUI_TEXTBOX_MIN_TEXT_WIDTH 50 -#define GLUI_LIST_BOXINNERMARGINX 3 -#define GLUI_LIST_MIN_TEXT_WIDTH 50 - -/*********************** TreePanel Defaults - JVK *****************************/ -#define GLUI_TREEPANEL_DEFAULTS 0 // bar, standard bar color -#define GLUI_TREEPANEL_ALTERNATE_COLOR 1 // Alternate between 8 different bar colors -#define GLUI_TREEPANEL_ENABLE_BAR 2 // enable the bar -#define GLUI_TREEPANEL_DISABLE_BAR 4 // disable the bar -#define GLUI_TREEPANEL_DISABLE_DEEPEST_BAR 8 // disable only the deepest bar -#define GLUI_TREEPANEL_CONNECT_CHILDREN_ONLY 16 // disable only the bar of the last child of each root -#define GLUI_TREEPANEL_DISPLAY_HIERARCHY 32 // display some sort of hierachy in the tree node title -#define GLUI_TREEPANEL_HIERARCHY_NUMERICDOT 64 // display hierarchy in 1.3.2 (etc... ) format -#define GLUI_TREEPANEL_HIERARCHY_LEVEL_ONLY 128 // display hierarchy as only the level depth - -/******************* GLUI Scrollbar Defaults - JVK ***************************/ -#define GLUI_SCROLL_ARROW_WIDTH 16 -#define GLUI_SCROLL_ARROW_HEIGHT 16 -#define GLUI_SCROLL_BOX_MIN_HEIGHT 5 -#define GLUI_SCROLL_BOX_STD_HEIGHT 16 -#define GLUI_SCROLL_STATE_NONE 0 -#define GLUI_SCROLL_STATE_UP 1 -#define GLUI_SCROLL_STATE_DOWN 2 -#define GLUI_SCROLL_STATE_BOTH 3 -#define GLUI_SCROLL_STATE_SCROLL 4 -#define GLUI_SCROLL_DEFAULT_GROWTH_EXP 1.05f -#define GLUI_SCROLL_VERTICAL 0 -#define GLUI_SCROLL_HORIZONTAL 1 - - -/** Size of the character width hash table for faster lookups. - Make sure to keep this a power of two to avoid the slow divide. - This is also a speed/memory tradeoff; 128 is enough for low ASCII. -*/ -#define CHAR_WIDTH_HASH_SIZE 128 - -/********** Translation codes **********/ - -enum TranslationCodes -{ - GLUI_TRANSLATION_MOUSE_NONE = 0, - GLUI_TRANSLATION_MOUSE_UP, - GLUI_TRANSLATION_MOUSE_DOWN, - GLUI_TRANSLATION_MOUSE_LEFT, - GLUI_TRANSLATION_MOUSE_RIGHT, - GLUI_TRANSLATION_MOUSE_UP_LEFT, - GLUI_TRANSLATION_MOUSE_UP_RIGHT, - GLUI_TRANSLATION_MOUSE_DOWN_LEFT, - GLUI_TRANSLATION_MOUSE_DOWN_RIGHT -}; - -/************ A string type for us to use **********/ - -typedef std::string GLUI_String; -GLUI_String& glui_format_str(GLUI_String &str, const char* fmt, ...); - -/********* Pre-declare classes as needed *********/ - -class GLUI; -class GLUI_Control; -class GLUI_Listbox; -class GLUI_StaticText; -class GLUI_EditText; -class GLUI_Panel; -class GLUI_Spinner; -class GLUI_RadioButton; -class GLUI_RadioGroup; -class GLUI_Glut_Window; -class GLUI_TreePanel; -class GLUI_Scrollbar; -class GLUI_List; - -class Arcball; - -/*** Flags for GLUI class constructor ***/ -#define GLUI_SUBWINDOW ((long)(1<<1)) -#define GLUI_SUBWINDOW_TOP ((long)(1<<2)) -#define GLUI_SUBWINDOW_BOTTOM ((long)(1<<3)) -#define GLUI_SUBWINDOW_LEFT ((long)(1<<4)) -#define GLUI_SUBWINDOW_RIGHT ((long)(1<<5)) - -/*** Codes for different type of edittext boxes and spinners ***/ -#define GLUI_EDITTEXT_TEXT 1 -#define GLUI_EDITTEXT_INT 2 -#define GLUI_EDITTEXT_FLOAT 3 -#define GLUI_SPINNER_INT GLUI_EDITTEXT_INT -#define GLUI_SPINNER_FLOAT GLUI_EDITTEXT_FLOAT -#define GLUI_SCROLL_INT GLUI_EDITTEXT_INT -#define GLUI_SCROLL_FLOAT GLUI_EDITTEXT_FLOAT -// This is only for deprecated interface -#define GLUI_EDITTEXT_STRING 4 - -/*** Definition of callbacks ***/ -typedef void (*GLUI_Update_CB) (int id); -typedef void (*GLUI_Control_CB)(GLUI_Control *); -typedef void (*Int1_CB) (int); -typedef void (*Int2_CB) (int, int); -typedef void (*Int3_CB) (int, int, int); -typedef void (*Int4_CB) (int, int, int, int); - -/************************************************************/ -/** - Callback Adapter Class - Allows us to support different types of callbacks; - like a GLUI_Update_CB function pointer--which takes an int; - and a GLUI_Control_CB function pointer--which takes a GUI_Control object. -*/ -class GLUI_CB -{ -public: - GLUI_CB() : idCB(0),objCB(0) {} - GLUI_CB(GLUI_Update_CB cb) : idCB(cb),objCB(0) {} - GLUI_CB(GLUI_Control_CB cb) : idCB(0),objCB(cb) {} - // (Compiler generated copy constructor) - - /** This control just activated. Fire our callback.*/ - void operator()(GLUI_Control *ctrl) const; - bool operator!() const { return !idCB && !objCB; } - operator bool() const { return !(!(*this)); } -private: - GLUI_Update_CB idCB; - GLUI_Control_CB objCB; -}; - -/************************************************************/ -/* */ -/* Base class, for hierarchical relationships */ -/* */ -/************************************************************/ - -class GLUI_Control; -class GLUI_Column; -class GLUI_Panel; -class GLUI_FileBrowser; -class GLUI_Scrollbar; -class GLUI_Listbox; -class GLUI_List; -class GLUI_Rollout; -class GLUI_Tree; - - -/** - GLUI_Node is a node in a sort of tree of GLUI controls. - Each GLUI_Node has a list of siblings (in a circular list) - and a linked list of children. - - Everything onscreen is a GLUI_Node--windows, buttons, etc. - The nodes are traversed for event processing, sizing, redraws, etc. -*/ -class GLUI_Node -{ - friend class GLUI_Tree; /* JVK */ - friend class GLUI_Rollout; - friend class GLUI_Main; - -public: - GLUI_Node(); - virtual ~GLUI_Node() {} - - GLUI_Node *first_sibling(); - GLUI_Node *last_sibling(); - GLUI_Node *prev(); - GLUI_Node *next(); - - GLUI_Node *first_child() { return child_head; } - GLUI_Node *last_child() { return child_tail; } - GLUI_Node *parent() { return parent_node; } - - /** Link in a new child control */ - virtual int add_control( GLUI_Control *control ); - - void link_this_to_parent_last (GLUI_Node *parent ); - void link_this_to_parent_first(GLUI_Node *parent ); - void link_this_to_sibling_next(GLUI_Node *sibling ); - void link_this_to_sibling_prev(GLUI_Node *sibling ); - void unlink(); - - void dump( FILE *out, const char *name ); - - virtual GLUI_Panel* dynamicCastGLUI_Panel() - { - return 0; - } - - virtual GLUI_Column* dynamicCastGLUI_Column() - { - return 0; - } - virtual GLUI_EditText* dynamicCastGLUI_EditText() - { - return 0; - } - virtual GLUI_Rollout* dynamicCastGLUI_Rollout() - { - return 0; - } - - virtual GLUI_Tree* dynamicCastGLUI_Tree() - { - return 0; - } - - virtual GLUI_List* dynamicCastGLUI_List() - { - return 0; - } - - virtual GLUI_FileBrowser* dynamicCastGLUI_FileBrowser() - { - return 0; - } - - virtual GLUI_Scrollbar* dynamicCastGLUI_Scrollbar() - { - return 0; - } - - virtual GLUI_Listbox* dynamicCastGLUI_Listbox() - { - return 0; - } - - virtual GLUI_TreePanel* dynamicCastGLUI_TreePanel() - { - return 0; - } - - - -protected: - static void add_child_to_control(GLUI_Node *parent,GLUI_Control *child); - GLUI_Node *parent_node; - GLUI_Node *child_head; - GLUI_Node *child_tail; - GLUI_Node *next_sibling; - GLUI_Node *prev_sibling; -}; - - -/************************************************************/ -/* */ -/* Standard Bitmap stuff */ -/* */ -/************************************************************/ - -enum GLUI_StdBitmaps_Codes -{ - GLUI_STDBITMAP_CHECKBOX_OFF = 0, - GLUI_STDBITMAP_CHECKBOX_ON, - GLUI_STDBITMAP_RADIOBUTTON_OFF, - GLUI_STDBITMAP_RADIOBUTTON_ON, - GLUI_STDBITMAP_UP_ARROW, - GLUI_STDBITMAP_DOWN_ARROW, - GLUI_STDBITMAP_LEFT_ARROW, - GLUI_STDBITMAP_RIGHT_ARROW, - GLUI_STDBITMAP_SPINNER_UP_OFF, - GLUI_STDBITMAP_SPINNER_UP_ON, - GLUI_STDBITMAP_SPINNER_DOWN_OFF, - GLUI_STDBITMAP_SPINNER_DOWN_ON, - GLUI_STDBITMAP_CHECKBOX_OFF_DIS, /*** Disactivated control bitmaps ***/ - GLUI_STDBITMAP_CHECKBOX_ON_DIS, - GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, - GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, - GLUI_STDBITMAP_SPINNER_UP_DIS, - GLUI_STDBITMAP_SPINNER_DOWN_DIS, - GLUI_STDBITMAP_LISTBOX_UP, - GLUI_STDBITMAP_LISTBOX_DOWN, - GLUI_STDBITMAP_LISTBOX_UP_DIS, - GLUI_STDBITMAP_NUM_ITEMS -}; - -/************************************************************/ -/* */ -/* Class GLUI_Bitmap */ -/* */ -/************************************************************/ - -/** - GLUI_Bitmap is a simple 2D texture map. It's used - to represent small textures like checkboxes, arrows, etc. - via the GLUI_StdBitmaps class. -*/ -class GLUI_Bitmap -{ - friend class GLUI_StdBitmaps; - -public: - GLUI_Bitmap(); - ~GLUI_Bitmap(); - - /** Create bitmap from greyscale byte image */ - void init_grey(unsigned char *array); - - /** Create bitmap from color int image */ - void init(int *array); - -private: - /** RGB pixel data */ - unsigned char *pixels; - int w, h; -}; - - -/************************************************************/ -/* */ -/* Class GLUI_StdBitmap */ -/* */ -/************************************************************/ - -/** - Keeps an array of GLUI_Bitmap objects to represent all the - images used in the UI: checkboxes, arrows, etc. -*/ -class GLUI_StdBitmaps -{ -public: - GLUI_StdBitmaps(); - ~GLUI_StdBitmaps(); - - /** Return the width (in pixels) of the n'th standard bitmap. */ - int width (int n) const; - /** Return the height (in pixels) of the n'th standard bitmap. */ - int height(int n) const; - - /** Draw the n'th standard bitmap (one of the enums - listed in GLUI_StdBitmaps_Codes) at pixel corner (x,y). - */ - void draw(int n, int x, int y) const; - -private: - GLUI_Bitmap bitmaps[GLUI_STDBITMAP_NUM_ITEMS]; -}; - -/************************************************************/ -/* */ -/* Master GLUI Class */ -/* */ -/************************************************************/ - -/** - The master manages our interaction with GLUT. - There's only one GLUI_Master_Object. -*/ -class GLUI_Master_Object -{ - - friend void glui_idle_func(); - -public: - - GLUI_Master_Object(); - ~GLUI_Master_Object(); - - GLUI_Node gluis; - GLUI_Control *active_control, *curr_left_button_glut_menu; - GLUI *active_control_glui; - int glui_id_counter; - - GLUI_Glut_Window *find_glut_window( int window_id ); - - void set_glutIdleFunc(void (*f)(void)); - - /************** - void (*glut_keyboard_CB)(unsigned char, int, int); - void (*glut_reshape_CB)(int, int); - void (*glut_special_CB)(int, int, int); - void (*glut_mouse_CB)(int,int,int,int); - - void (*glut_passive_motion_CB)(int,int); - void (*glut_visibility_CB)(int); - void (*glut_motion_CB)(int,int); - void (*glut_display_CB)(void); - void (*glut_entry_CB)(int); - **********/ - - void set_left_button_glut_menu_control( GLUI_Control *control ); - - /********** GLUT callthroughs **********/ - /* These are the glut callbacks that we do not handle */ - - void set_glutReshapeFunc (void (*f)(int width, int height)); - void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); - void set_glutSpecialFunc (void (*f)(int key, int x, int y)); - void set_glutSpecialUpFunc(void (*f)(int key, int x, int y)); - - void set_glutMouseFunc (void (*f)(int, int, int, int )); - - void set_glutDisplayFunc(void (*f)(void)) {glutDisplayFunc(f);} - void set_glutTimerFunc(unsigned int millis, void (*f)(int value), int value) - { ::glutTimerFunc(millis,f,value);} - void set_glutOverlayDisplayFunc(void(*f)(void)){glutOverlayDisplayFunc(f);} - void set_glutSpaceballMotionFunc(Int3_CB f) {glutSpaceballMotionFunc(f);} - void set_glutSpaceballRotateFunc(Int3_CB f) {glutSpaceballRotateFunc(f);} - void set_glutSpaceballButtonFunc(Int2_CB f) {glutSpaceballButtonFunc(f);} - void set_glutTabletMotionFunc(Int2_CB f) {glutTabletMotionFunc(f);} - void set_glutTabletButtonFunc(Int4_CB f) {glutTabletButtonFunc(f);} - /* void set_glutWindowStatusFunc(Int1_CB f) {glutWindowStatusFunc(f);} */ - void set_glutMenuStatusFunc(Int3_CB f) {glutMenuStatusFunc(f);} - void set_glutMenuStateFunc(Int1_CB f) {glutMenuStateFunc(f);} - void set_glutButtonBoxFunc(Int2_CB f) {glutButtonBoxFunc(f);} - void set_glutDialsFunc(Int2_CB f) {glutDialsFunc(f);} - - - GLUI *create_glui( const char *name, long flags=0, int x=-1, int y=-1 ); - GLUI *create_glui_subwindow( int parent_window, long flags=0 ); - GLUI *find_glui_by_window_id( int window_id ); - void get_viewport_area( int *x, int *y, int *w, int *h ); - void auto_set_viewport(); - void close_all(); - void sync_live_all(); - - void reshape(); - - float get_version() { return GLUI_VERSION; } - - void glui_setIdleFuncIfNecessary(void); - -private: - GLUI_Node glut_windows; - void (*glut_idle_CB)(void); - - void add_cb_to_glut_window(int window,int cb_type,void *cb); -}; - -/** - This is the only GLUI_Master_Object in existence. -*/ -extern GLUI_Master_Object GLUI_Master; - -/************************************************************/ -/* */ -/* Class for managing a GLUT window */ -/* */ -/************************************************************/ - -/** - A top-level window. The GLUI_Master GLUT callback can route events - to the callbacks in this class, for arbitrary use by external users. - (see GLUI_Master_Object::set_glutKeyboardFunc). - - This entire approach seems to be superceded by the "subwindow" flavor - of GLUI. -*/ -class GLUI_Glut_Window : public GLUI_Node -{ -public: - GLUI_Glut_Window(); - - int glut_window_id; - - /*********** Pointers to GLUT callthrough functions *****/ - void (*glut_keyboard_CB)(unsigned char, int, int); - void (*glut_special_CB)(int, int, int); - void (*glut_special_up_CB)(int, int, int); - void (*glut_reshape_CB)(int, int); - void (*glut_passive_motion_CB)(int,int); - void (*glut_mouse_CB)(int,int,int,int); - void (*glut_visibility_CB)(int); - void (*glut_motion_CB)(int,int); - void (*glut_display_CB)(void); - void (*glut_entry_CB)(int); -}; - -/************************************************************/ -/* */ -/* Main Window GLUI class (not user-level) */ -/* */ -/************************************************************/ - -/** - A GLUI_Main handles GLUT events for one window, routing them to the - appropriate controls. The central user-visible "GLUI" class - inherits from this class; users should not allocate GLUT_Main objects. - - There's a separate GLUI_Main object for: - - Each top-level window with GUI stuff in it. - - Each "subwindow" of another top-level window. - - All the GLUI_Main objects are listed in GLUI_Master.gluis. - A better name for this class might be "GLUI_Environment"; - this class provides the window-level context for every control. -*/ -class GLUI_Main : public GLUI_Node -{ - /********** Friend classes *************/ - - friend class GLUI_Control; - friend class GLUI_Rotation; - friend class GLUI_Translation; - friend class GLUI; - friend class GLUI_Master_Object; - - /*********** Friend functions **********/ - - friend void glui_mouse_func(int button, int state, int x, int y); - friend void glui_keyboard_func(unsigned char key, int x, int y); - friend void glui_special_func(int key, int x, int y); - friend void glui_special_up_func(int key, int x, int y); - friend void glui_passive_motion_func(int x, int y); - friend void glui_reshape_func( int w, int h ); - friend void glui_visibility_func(int state); - friend void glui_motion_func(int x, int y); - friend void glui_entry_func(int state); - friend void glui_display_func( void ); - friend void glui_idle_func(void); - - friend void glui_parent_window_reshape_func( int w, int h ); - friend void glui_parent_window_keyboard_func( unsigned char, int, int ); - friend void glui_parent_window_special_func( int, int, int ); - friend void glui_parent_window_mouse_func( int, int, int, int ); - -protected: - /*** Variables ***/ - int main_gfx_window_id; - int mouse_button_down; - int glut_window_id; - int top_level_glut_window_id; - GLUI_Control *active_control; - GLUI_Control *mouse_over_control; - GLUI_Panel *main_panel; - enum buffer_mode_t { - buffer_front=1, ///< Draw updated controls directly to screen. - buffer_back=2 ///< Double buffering: postpone updates until next redraw. - }; - buffer_mode_t buffer_mode; ///< Current drawing mode - int curr_cursor; - int w, h; - long flags; - bool closing; - int parent_window; - int glui_id; - - /********** Misc functions *************/ - - GLUI_Control *find_control( int x, int y ); - GLUI_Control *find_next_control( GLUI_Control *control ); - GLUI_Control *find_next_control_rec( GLUI_Control *control ); - GLUI_Control *find_next_control_( GLUI_Control *control ); - GLUI_Control *find_prev_control( GLUI_Control *control ); - void create_standalone_window( const char *name, int x=-1, int y=-1 ); - void create_subwindow( int parent,int window_alignment ); - void setup_default_glut_callbacks( void ); - - void mouse(int button, int state, int x, int y); - void keyboard(unsigned char key, int x, int y); - void special(int key, int x, int y); - void special_up(int key, int x, int y); - void passive_motion(int x, int y); - void reshape( int w, int h ); - void visibility(int state); - void motion(int x, int y); - void entry(int state); - void display( void ); - void idle(void); - int needs_idle(void); - - void (*glut_mouse_CB)(int, int, int, int); - void (*glut_keyboard_CB)(unsigned char, int, int); - void (*glut_special_CB)(int, int, int); - void (*glut_reshape_CB)(int, int); - - - /*********** Controls ************/ - - virtual int add_control( GLUI_Node *parent, GLUI_Control *control ); - - - /********** Constructors and Destructors ***********/ - - GLUI_Main( void ); - -public: - GLUI_StdBitmaps std_bitmaps; - GLUI_String window_name; - RGBc bkgd_color; - float bkgd_color_f[3]; - - void *font; - int curr_modifiers; - - void adjust_glut_xy( int &x, int &y ) { (void)x; y = h-y; } - void activate_control( GLUI_Control *control, int how ); - void align_controls( GLUI_Control *control ); - void deactivate_current_control( void ); - - /** Draw a 3D-look pushed-out box around this rectangle */ - void draw_raised_box( int x, int y, int w, int h ); - /** Draw a 3D-look pushed-in box around this rectangle */ - void draw_lowered_box( int x, int y, int w, int h ); - - /** Return true if this control should redraw itself immediately (front buffer); - Or queue up a redraw and return false if it shouldn't (back buffer). - */ - bool should_redraw_now(GLUI_Control *ctl); - - int getMainWindowId() - { - return main_gfx_window_id; - } - /** Switch to the appropriate draw buffer now. Returns the old draw buffer. - This routine should probably only be called from inside the GLUI_DrawingSentinal, - in glui_internal_control.h - */ - int set_current_draw_buffer(); - /** Go back to using this draw buffer. Undoes set_current_draw_buffer. */ - void restore_draw_buffer( int buffer_state ); - - /** Pack, resize the window, and redraw all the controls. */ - void refresh(); - - /** Redraw the main graphics window */ - void post_update_main_gfx(); - - /** Recompute the sizes and positions of all controls */ - void pack_controls(); - - void close_internal(); - void check_subwindow_position(); - void set_ortho_projection(); - void set_viewport(); - int get_glut_window_id( void ) { return glut_window_id; } /* JVK */ -}; - -/************************************************************/ -/* */ -/* GLUI_Control: base class for all controls */ -/* */ -/************************************************************/ - -//get rid of the dynamic_cast/RTTI requirements, just do a virtual function - - -/** - All the GUI objects inherit from GLUI_Control: buttons, - checkboxes, labels, edit boxes, scrollbars, etc. - Most of the work of this class is in routing events, - like keystrokes, mouseclicks, redraws, and sizing events. - - Yes, this is a huge and hideous class. It needs to be - split up into simpler subobjects. None of the data members - should be directly accessed by users (they should be protected, - not public); only subclasses. -*/ -class GLUI_Control : public GLUI_Node -{ -public: - -/** Onscreen coordinates */ - int w, h; /* dimensions of control */ - int x_abs, y_abs; - int x_off, y_off_top, y_off_bot; /* INNER margins, by which child - controls are indented */ - int contain_x, contain_y; - int contain_w, contain_h; - /* if this is a container control (e.g., - radiogroup or panel) this indicated dimensions - of inner area in which controls reside */ - -/** "activation" for tabbing between controls. */ - int active_type; ///< "GLUI_CONTROL_ACTIVE_..." - bool active; ///< If true, we've got the focus - bool can_activate; ///< If false, remove from tab order. - bool spacebar_mouse_click; ///< Spacebar simulates click. - -/** Callbacks */ - long user_id; ///< Integer to pass to callback function. - GLUI_CB callback; ///< User callback function, or NULL. - -/** Variable value storage */ - float float_val; /**< Our float value */ - int int_val; /**< Our integer value */ - float float_array_val[GLUI_DEF_MAX_ARRAY]; - int float_array_size; - GLUI_String text; /**< The text inside this control */ - -/** "Live variable" updating */ - void *ptr_val; /**< A pointer to the user's live variable value */ - int live_type; - bool live_inited; - /* These variables store the last value that live variable was known to have. */ - int last_live_int; - float last_live_float; - GLUI_String last_live_text; - float last_live_float_array[GLUI_DEF_MAX_ARRAY]; - -/** Properties of our control */ - GLUI *glui; /**< Our containing event handler (NEVER NULL during event processing!) */ - bool is_container; /**< Is this a container class (e.g., panel) */ - int alignment; - bool enabled; /**< Is this control grayed out? */ - GLUI_String name; /**< The name of this control */ - void *font; /**< Our glutbitmap font */ - bool collapsible, is_open; - GLUI_Node collapsed_node; - bool hidden; /* Collapsed controls (and children) are hidden */ - int char_widths[CHAR_WIDTH_HASH_SIZE][2]; /* Character width hash table */ - -public: - /*** Get/Set values ***/ - virtual void set_name( const char *string ); - virtual void set_int_val( int new_int ) { int_val = new_int; output_live(true); } - virtual void set_float_val( float new_float ) { float_val = new_float; output_live(true); } - virtual void set_ptr_val( void *new_ptr ) { ptr_val = new_ptr; output_live(true); } - virtual void set_float_array_val( float *array_ptr ); - - virtual float get_float_val( void ) { return float_val; } - virtual int get_int_val( void ) { return int_val; } - virtual void get_float_array_val( float *array_ptr ); - virtual int get_id( void ) const { return user_id; } - virtual void set_id( int id ) { user_id=id; } - - virtual int mouse_down_handler( int local_x, int local_y ) { (void)local_x; (void)local_y; return false; } - virtual int mouse_up_handler( int local_x, int local_y, bool inside ) { (void)local_x; (void)local_y; (void)inside; return false; } - virtual int mouse_held_down_handler( int local_x, int local_y, bool inside) { (void)local_x; (void)local_y; (void)inside; return false; } - virtual int key_handler( unsigned char key, int modifiers ) { (void)key; (void)modifiers; return false; } - virtual int special_handler( int key,int modifiers ) { (void)key; (void)modifiers; return false; } - virtual int special_up_handler( int key,int modifiers ) { (void)key; (void)modifiers; return false; } - - virtual void update_size( void ) { } - virtual void idle( void ) { } - virtual int mouse_over( int state, int x, int y ) { (void)state; (void)x; (void)y; return false; } - - virtual void enable( void ); - virtual void disable( void ); - virtual void activate( int how ) { (void)how; active = true; } - virtual void deactivate( void ) { active = false; } - - /** Hide (shrink into a rollout) and unhide (expose from a rollout) */ - void hide_internal( int recurse ); - void unhide_internal( int recurse ); - - - /** Return true if it currently makes sense to draw this class. */ - int can_draw( void ) { return (glui != NULL && hidden == false); } - - /** Redraw this control. - In single-buffering mode (drawing to GL_FRONT), this is just - a call to translate_and_draw_front (after a can_draw() check). - In double-buffering mode (drawing to GL_BACK), this queues up - a redraw and returns false, since you shouldn't draw yet. - */ - void redraw(void); - - /** Redraw everybody in our window. */ - void redraw_window(void); - - virtual void align( void ); - void pack( int x, int y ); /* Recalculate positions and offsets */ - void pack_old( int x, int y ); - void draw_recursive( int x, int y ); - int set_to_glut_window( void ); - void restore_window( int orig ); - void translate_and_draw_front( void ); - void translate_to_origin( void ) - {glTranslatef((float)x_abs+.5f,(float)y_abs+.5f,0.0f);} - virtual void draw( int x, int y )=0; - void set_font( void *new_font ); - void *get_font( void ); - int string_width( const char *text ); - int string_width( const GLUI_String &str ) - { return string_width(str.c_str()); } - int char_width( char c ); - - void draw_name( int x, int y ); - void draw_box_inwards_outline( int x_min, int x_max, - int y_min, int y_max ); - void draw_box( int x_min, int x_max, int y_min, int y_max, - float r, float g, float b ); - void draw_bkgd_box( int x_min, int x_max, int y_min, int y_max ); - void draw_emboss_box( int x_min, int x_max,int y_min,int y_max); - void draw_string( const char *text ); - void draw_string( const GLUI_String &s ) - { draw_string(s.c_str()); } - void draw_char( char c ); - void draw_active_box( int x_min, int x_max, int y_min, int y_max ); - void set_to_bkgd_color( void ); - - void set_w( int new_w ); - void set_h( int new_w ); - void set_alignment( int new_align ); - void sync_live( int recurse, int draw ); /* Reads live variable */ - void init_live( void ); - void output_live( int update_main_gfx ); /** Writes live variable **/ - virtual void set_text( const char *t ) { (void)t; } - void execute_callback( void ); - void get_this_column_dims( int *col_x, int *col_y, - int *col_w, int *col_h, - int *col_x_off, int *col_y_off ); - virtual bool needs_idle( void ) const; - virtual bool wants_tabs() const { return false; } - - GLUI_Control(void) - { - x_off = GLUI_XOFF; - y_off_top = GLUI_YOFF; - y_off_bot = GLUI_YOFF; - x_abs = GLUI_XOFF; - y_abs = GLUI_YOFF; - active = false; - enabled = true; - int_val = 0; - last_live_int = 0; - float_array_size = 0; - glui_format_str(name, "Control: %p", this); - float_val = 0.0; - last_live_float = 0.0; - ptr_val = NULL; - glui = NULL; - w = GLUI_DEFAULT_CONTROL_WIDTH; - h = GLUI_DEFAULT_CONTROL_HEIGHT; - font = NULL; - active_type = GLUI_CONTROL_ACTIVE_MOUSEDOWN; - alignment = GLUI_ALIGN_LEFT; - is_container = false; - can_activate = true; /* By default, you can activate a control */ - spacebar_mouse_click = true; /* Does spacebar simulate a mouse click? */ - live_type = GLUI_LIVE_NONE; - text = ""; - last_live_text == ""; - live_inited = false; - collapsible = false; - is_open = true; - hidden = false; - memset(char_widths, -1, sizeof(char_widths)); /* JVK */ - int i; - for( i=0; iint_val = 1; set_color(red, green, blue); } } - void disable_bar() { if (column) { column->int_val = 0; } } - void set_child_number(int c) { child_number = c; } - void set_level_color(float r, float g, float b) { - lred = r; - lgreen = g; - lblue = b; - } - void set_color(float r, float g, float b) { - red = r; - green = g; - blue = b; - } - - virtual GLUI_Tree* dynamicCastGLUI_Tree() - { - return this; - } -protected: - void common_init() - { - currently_inside = false; - initially_inside = false; - can_activate = true; - is_container = true; - h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - w = GLUI_DEFAULT_CONTROL_WIDTH; - y_off_top = 21; - collapsible = true; - red = .5; - green = .5; - blue = .5; - lred = 0; - lgreen = 0; - lblue = 0; - column = NULL; - is_current = 0; - child_number = 0; - format = 0; - panel = NULL; - name = ""; - level_name = ""; - level = 0; - - }; -}; - - -/************************************************************/ -/* */ -/* TreePanel class (container) JVK */ -/* */ -/************************************************************/ - -/** - Manages, maintains, and formats a tree of GLUI_Tree objects. - These are shown in a heirarchical, collapsible display. - - FIXME: There's an infinite loop in the traversal code (OSL 2006/06) -*/ -class GLUI_TreePanel : public GLUI_Panel -{ -public: - GLUI_TreePanel(GLUI_Node *parent, const char *name, - bool open=false, int inset=0); - - int max_levels; - int next_id; - int format; - float red; - float green; - float blue; - float lred; - float lgreen; - float lblue; - int root_children; - /* These variables allow the tree panel to traverse the tree - using only two function calls. (Well, four, if you count - going in reverse */ - - GLUI_Tree *curr_branch; /* Current Branch */ - GLUI_Panel *curr_root; /* Current Root */ - -public: - void set_color(float r, float g, float b); - void set_level_color(float r, float g, float b); - void set_format(int f) { format = f; } - - /* Adds branch to curr_root */ - GLUI_Tree * ab(const char *name, GLUI_Tree *root = NULL); - /* Goes up one level, resets curr_root and curr_branch to parents*/ - void fb(GLUI_Tree *branch= NULL); - /* Deletes the curr_branch, goes up one level using fb */ - void db(GLUI_Tree *branch = NULL); - /* Finds the very last branch of curr_root, resets vars */ - void descendBranch(GLUI_Panel *root = NULL); - /* Resets curr_root and curr branch to TreePanel and lastChild */ - void resetToRoot(GLUI_Panel *new_root = NULL); - void next( void ); - void refresh( void ); - void expand_all( void ); - void collapse_all( void ); - void update_all( void ); - void initNode(GLUI_Tree *temp); - void formatNode(GLUI_Tree *temp); - virtual GLUI_TreePanel* dynamicCastGLUI_TreePanel() - { - return this; - } - -protected: - int uniqueID( void ) { next_id++; return next_id - 1; } - void common_init() - { - GLUI_Panel(); - next_id = 0; - curr_root = this; - curr_branch = NULL; - red = .5; - green = .5; - blue = .5; - root_children = 0; - } -}; - -/************************************************************/ -/* */ -/* User-Level GLUI class */ -/* */ -/************************************************************/ - -class GLUI_Rotation; -class GLUI_Translation; - -/** - The main user-visible interface object to GLUI. - -*/ -class GLUI : public GLUI_Main -{ -public: -/** DEPRECATED interface for creating new GLUI objects */ - int add_control( GLUI_Control *control ) { return main_panel->add_control(control); } - - void add_column( int draw_bar = true ); - void add_column_to_panel( GLUI_Panel *panel, int draw_bar = true ); - - void add_separator( void ); - void add_separator_to_panel( GLUI_Panel *panel ); - - GLUI_RadioGroup - *add_radiogroup( int *live_var=NULL, - int user_id=-1,GLUI_CB callback=GLUI_CB()); - - GLUI_RadioGroup - *add_radiogroup_to_panel( GLUI_Panel *panel, - int *live_var=NULL, - int user_id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_RadioButton - *add_radiobutton_to_group( GLUI_RadioGroup *group, - const char *name ); - - GLUI_Listbox *add_listbox( const char *name, int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Listbox *add_listbox_to_panel( GLUI_Panel *panel, - const char *name, int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - - GLUI_Rotation *add_rotation( const char *name, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Rotation *add_rotation_to_panel( GLUI_Panel *panel, - const char *name, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - - GLUI_Translation *add_translation( const char *name, - int trans_type, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Translation *add_translation_to_panel( - GLUI_Panel *panel, const char *name, - int trans_type, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - - GLUI_Checkbox *add_checkbox( const char *name, - int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - GLUI_Checkbox *add_checkbox_to_panel( GLUI_Panel *panel, const char *name, - int *live_var=NULL, int id=-1, - GLUI_CB callback=GLUI_CB()); - - GLUI_Button *add_button( const char *name, int id=-1, - GLUI_CB callback=GLUI_CB()); - GLUI_Button *add_button_to_panel( GLUI_Panel *panel, const char *name, - int id=-1, GLUI_CB callback=GLUI_CB() ); - - GLUI_StaticText *add_statictext( const char *name ); - GLUI_StaticText *add_statictext_to_panel( GLUI_Panel *panel, const char *name ); - - GLUI_EditText *add_edittext( const char *name, - int data_type=GLUI_EDITTEXT_TEXT, - void*live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_EditText *add_edittext_to_panel( GLUI_Panel *panel, - const char *name, - int data_type=GLUI_EDITTEXT_TEXT, - void *live_var=NULL, int id=-1, - GLUI_CB callback=GLUI_CB() ); - GLUI_EditText *add_edittext( const char *name, GLUI_String& live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_EditText *add_edittext_to_panel( GLUI_Panel *panel, const char *name, - GLUI_String& live_var, int id=-1, - GLUI_CB callback=GLUI_CB() ); - - GLUI_Spinner *add_spinner( const char *name, - int data_type=GLUI_SPINNER_INT, - void *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Spinner *add_spinner_to_panel( GLUI_Panel *panel, - const char *name, - int data_type=GLUI_SPINNER_INT, - void *live_var=NULL, - int id=-1, - GLUI_CB callback=GLUI_CB() ); - - GLUI_Panel *add_panel( const char *name, int type=GLUI_PANEL_EMBOSSED ); - GLUI_Panel *add_panel_to_panel( GLUI_Panel *panel, const char *name, - int type=GLUI_PANEL_EMBOSSED ); - - - GLUI_Rollout *add_rollout( const char *name, int open=true, - int type=GLUI_PANEL_EMBOSSED); - GLUI_Rollout *add_rollout_to_panel( GLUI_Panel *panel, const char *name, - int open=true, - int type=GLUI_PANEL_EMBOSSED); - - -/** Set the window where our widgets should be displayed. */ - void set_main_gfx_window( int window_id ); - int get_glut_window_id( void ) { return glut_window_id; } - - void enable( void ) { main_panel->enable(); } - void disable( void ); - - void sync_live( void ); - - void close( void ); - - void show( void ); - void hide( void ); - - /***** GLUT callback setup functions *****/ - /* - void set_glutDisplayFunc(void (*f)(void)); - void set_glutReshapeFunc(void (*f)(int width, int height)); - void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); - void set_glutSpecialFunc(void (*f)(int key, int x, int y)); - void set_glutMouseFunc(void (*f)(int button, int state, int x, int y)); - void set_glutMotionFunc(void (*f)(int x, int y)); - void set_glutPassiveMotionFunc(void (*f)(int x, int y)); - void set_glutEntryFunc(void (*f)(int state)); - void set_glutVisibilityFunc(void (*f)(int state)); - void set_glutInit( int *argcp, const char **argv ); - void set_glutInitWindowSize(int width, int height); - void set_glutInitWindowPosition(int x, int y); - void set_glutInitDisplayMode(unsigned int mode); - int set_glutCreateWindow(const char *name); - */ - - /***** Constructors and desctructors *****/ - - int init( const char *name, long flags, int x, int y, int parent_window ); -protected: - virtual int add_control( GLUI_Node *parent, GLUI_Control *control ) { - return GLUI_Main::add_control( parent, control ); - } -}; - -/************************************************************/ -/* */ -/* EditText class */ -/* */ -/************************************************************/ - -class GLUI_EditText : public GLUI_Control -{ -public: - int has_limits; - int data_type; - GLUI_String orig_text; - int insertion_pt; - int title_x_offset; - int text_x_offset; - int substring_start; /*substring that gets displayed in box*/ - int substring_end; - int sel_start, sel_end; /* current selection */ - int num_periods; - int last_insertion_pt; - float float_low, float_high; - int int_low, int_high; - GLUI_Spinner *spinner; - int debug; - int draw_text_only; - - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key, int modifiers ); - - void activate( int how ); - void deactivate( void ); - - void draw( int x, int y ); - - int mouse_over( int state, int x, int y ); - - int find_word_break( int start, int direction ); - int substring_width( int start, int end ); - void clear_substring( int start, int end ); - int find_insertion_pt( int x, int y ); - int update_substring_bounds( void ); - void update_and_draw_text( void ); - void draw_text( int x, int y ); - void draw_insertion_pt( void ); - void set_numeric_text( void ); - void update_x_offsets( void ); - void update_size( void ); - - void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); - void set_int_limits( int low, int high, int limit_type=GLUI_LIMIT_CLAMP ); - void set_float_val( float new_val ); - void set_int_val( int new_val ); - void set_text( const char *text ); - void set_text( const GLUI_String &s) { set_text(s.c_str()); } - const char *get_text() { return text.c_str(); } - - void dump( FILE *out, const char *text ); - - // Constructor, no live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - int text_type=GLUI_EDITTEXT_TEXT, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, int live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - int *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, float live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - float *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, char* live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - char *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, std::string live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - std::string &live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - - // Deprecated constructor, only called internally - GLUI_EditText( GLUI_Node *parent, const char *name, - int text_type, void *live_var, - int id, GLUI_CB callback ); - // Deprecated constructor, only called internally - GLUI_EditText( void ) { common_init(); } - - virtual GLUI_EditText* dynamicCastGLUI_EditText() - { - return this; - } - - -protected: - void common_init( void ) { - h = GLUI_EDITTEXT_HEIGHT; - w = GLUI_EDITTEXT_WIDTH; - title_x_offset = 0; - text_x_offset = 55; - insertion_pt = -1; - last_insertion_pt = -1; - name = ""; - substring_start = 0; - data_type = GLUI_EDITTEXT_TEXT; - substring_end = 2; - num_periods = 0; - has_limits = GLUI_LIMIT_NONE; - sel_start = 0; - sel_end = 0; - active_type = GLUI_CONTROL_ACTIVE_PERMANENT; - can_activate = true; - spacebar_mouse_click = false; - spinner = NULL; - debug = false; - draw_text_only = false; - } - void common_construct( GLUI_Node *parent, const char *name, - int data_type, int live_type, void *live_var, - int id, GLUI_CB callback ); -}; - -/************************************************************/ -/* */ -/* CommandLine class */ -/* */ -/************************************************************/ - -class GLUI_CommandLine : public GLUI_EditText -{ -public: - typedef GLUI_EditText Super; - - enum { HIST_SIZE = 100 }; - std::vector hist_list; - int curr_hist; - int oldest_hist; - int newest_hist; - bool commit_flag; - -public: - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - void deactivate( void ); - - virtual const char *get_history( int command_number ) const - { return hist_list[command_number - oldest_hist].c_str(); } - virtual GLUI_String& get_history_str( int command_number ) - { return hist_list[command_number - oldest_hist]; } - virtual const GLUI_String& get_history_str( int command_number ) const - { return hist_list[command_number - oldest_hist]; } - virtual void recall_history( int history_number ); - virtual void scroll_history( int direction ); - virtual void add_to_history( const char *text ); - virtual void reset_history( void ); - - void dump( FILE *out, const char *text ); - - - GLUI_CommandLine( GLUI_Node *parent, const char *name, void *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_CommandLine( void ) { common_init(); } -protected: - void common_init() { - hist_list.resize(HIST_SIZE); - curr_hist = 0; - oldest_hist = 0; - newest_hist = 0; - commit_flag = false; - } -}; - -/************************************************************/ -/* */ -/* RadioGroup class (container) */ -/* */ -/************************************************************/ - -class GLUI_RadioGroup : public GLUI_Control -{ -public: - int num_buttons; - - void draw( int x, int y ); - void set_name( const char *text ); - void set_int_val( int int_val ); - void set_selected( int int_val ); - - void draw_group( int translate ); - - GLUI_RadioGroup( GLUI_Node *parent, int *live_var=NULL, - int user_id=-1,GLUI_CB callback=GLUI_CB() ); - GLUI_RadioGroup( void ) { common_init(); } - -protected: - void common_init( void ) { - x_off = 0; - y_off_top = 0; - y_off_bot = 0; - is_container = true; - w = 300; - h = 300; - num_buttons = 0; - name = ""; - can_activate = false; - live_type = GLUI_LIVE_INT; - } -}; - -/************************************************************/ -/* */ -/* RadioButton class (container) */ -/* */ -/************************************************************/ - -class GLUI_RadioButton : public GLUI_Control -{ -public: - int orig_value; - bool currently_inside; - int text_x_offset; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - - void draw( int x, int y ); - void update_size( void ); - - void draw_active_area( void ); - void draw_checked( void ); - void draw_unchecked( void ); - void draw_O( void ); - - GLUI_RadioButton( GLUI_RadioGroup *group, const char *name ); - GLUI_RadioGroup *group; - -protected: - void common_init() - { - glui_format_str( name, "RadioButton: %p", (void *) this ); - h = GLUI_RADIOBUTTON_SIZE; - group = NULL; - orig_value = -1; - text_x_offset = 18; - can_activate = true; - } -}; - - -/************************************************************/ -/* */ -/* Separator class (container) */ -/* */ -/************************************************************/ - -class GLUI_Separator : public GLUI_Control -{ -public: - void draw( int x, int y ); - - GLUI_Separator( GLUI_Node *parent ); - GLUI_Separator( void ) { common_init(); } - -protected: - void common_init() { - w = 100; - h = GLUI_SEPARATOR_HEIGHT; - can_activate = false; - } -}; - -#define GLUI_SPINNER_ARROW_WIDTH 12 -#define GLUI_SPINNER_ARROW_HEIGHT 8 -#define GLUI_SPINNER_ARROW_Y 2 - -#define GLUI_SPINNER_STATE_NONE 0 -#define GLUI_SPINNER_STATE_UP 1 -#define GLUI_SPINNER_STATE_DOWN 2 -#define GLUI_SPINNER_STATE_BOTH 3 - -#define GLUI_SPINNER_DEFAULT_GROWTH_EXP 1.05f - -/************************************************************/ -/* */ -/* Spinner class (container) */ -/* */ -/************************************************************/ - -class GLUI_Spinner : public GLUI_Control -{ -public: - // Constructor, no live var - GLUI_Spinner( GLUI_Node* parent, const char *name, - int data_type=GLUI_SPINNER_INT, int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, int live var - GLUI_Spinner( GLUI_Node* parent, const char *name, - int *live_var, int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, float live var - GLUI_Spinner( GLUI_Node* parent, const char *name, - float *live_var, int id=-1, GLUI_CB callback=GLUI_CB() ); - // Deprecated constructor - GLUI_Spinner( GLUI_Node* parent, const char *name, - int data_type, - void *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Deprecated constructor - GLUI_Spinner( void ) { common_init(); } - - bool currently_inside; - int state; - float growth, growth_exp; - int last_x, last_y; - int data_type; - int callback_count; - int last_int_val; - float last_float_val; - int first_callback; - float user_speed; - - GLUI_EditText *edittext; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void draw( int x, int y ); - void draw_pressed( void ); - void draw_unpressed( void ); - void draw_text( int sunken ); - - void update_size( void ); - - void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); - void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); - int find_arrow( int local_x, int local_y ); - void do_drag( int x, int y ); - void do_callbacks( void ); - void do_click( void ); - void idle( void ); - bool needs_idle( void ) const; - - const char *get_text( void ); - - void set_float_val( float new_val ); - void set_int_val( int new_val ); - float get_float_val( void ); - int get_int_val( void ); - void increase_growth( void ); - void reset_growth( void ); - - void set_speed( float speed ) { user_speed = speed; } - -protected: - void common_init() { - glui_format_str( name, "Spinner: %p", this ); - h = GLUI_EDITTEXT_HEIGHT; - w = GLUI_EDITTEXT_WIDTH; - x_off = 0; - y_off_top = 0; - y_off_bot = 0; - can_activate = true; - state = GLUI_SPINNER_STATE_NONE; - edittext = NULL; - growth_exp = GLUI_SPINNER_DEFAULT_GROWTH_EXP; - callback_count = 0; - first_callback = true; - user_speed = 1.0; - } - void common_construct( GLUI_Node* parent, const char *name, - int data_type, void *live_var, - int id, GLUI_CB callback ); -}; - -/************************************************************/ -/* */ -/* StaticText class */ -/* */ -/************************************************************/ - -class GLUI_StaticText : public GLUI_Control -{ -public: - void set_text( const char *text ); - void draw( int x, int y ); - void draw_text( void ); - void update_size( void ); - void erase_text( void ); - - GLUI_StaticText(GLUI_Node *parent, const char *name); - GLUI_StaticText( void ) { common_init(); } - -protected: - void common_init() { - h = GLUI_STATICTEXT_SIZE; - name = ""; - can_activate = false; - } -}; - -/************************************************************/ -/* */ -/* TextBox class - JVK */ -/* */ -/************************************************************/ - -class GLUI_TextBox : public GLUI_Control -{ -public: - /* GLUI Textbox - JVK */ - GLUI_TextBox(GLUI_Node *parent, GLUI_String &live_var, - bool scroll = false, int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_TextBox( GLUI_Node *parent, - bool scroll = false, int id=-1, - GLUI_CB callback=GLUI_CB() ); - - GLUI_String orig_text; - int insertion_pt; - int substring_start; /*substring that gets displayed in box*/ - int substring_end; - int sel_start, sel_end; /* current selection */ - int last_insertion_pt; - int debug; - int draw_text_only; - int tab_width; - int start_line; - int num_lines; - int curr_line; - int visible_lines; - int insert_x; /* Similar to "insertion_pt", these variables keep */ - int insert_y; /* track of where the ptr is, but in pixels */ - int keygoal_x; /* where up down keys would like to put insertion pt*/ - GLUI_Scrollbar *scrollbar; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void activate( int how ); - void deactivate( void ); - - void enable( void ); - void disable( void ); - - void draw( int x, int y ); - - int mouse_over( int state, int x, int y ); - - int get_box_width(); - int find_word_break( int start, int direction ); - int substring_width( int start, int end, int initial_width=0 ); - void clear_substring( int start, int end ); - int find_insertion_pt( int x, int y ); - int update_substring_bounds( void ); - void update_and_draw_text( void ); - void draw_text( int x, int y ); - void draw_insertion_pt( void ); - void update_x_offsets( void ); - void update_size( void ); - - void set_text( const char *text ); - const char *get_text( void ) { return text.c_str(); } - - void dump( FILE *out, char *text ); - void set_tab_w(int w) { tab_width = w; } - void set_start_line(int l) { start_line = l; } - static void scrollbar_callback(GLUI_Control*); - - bool wants_tabs( void ) const { return true; } - -protected: - void common_init() - { - h = GLUI_TEXTBOX_HEIGHT; - w = GLUI_TEXTBOX_WIDTH; - tab_width = GLUI_TAB_WIDTH; - num_lines = 0; - visible_lines = 0; - start_line = 0; - curr_line = 0; - insert_y = -1; - insert_x = -1; - insertion_pt = -1; - last_insertion_pt = -1; - name[0] = '\0'; - substring_start = 0; - substring_end = 2; - sel_start = 0; - sel_end = 0; - active_type = GLUI_CONTROL_ACTIVE_PERMANENT; - can_activate = true; - spacebar_mouse_click = false; - scrollbar = NULL; - debug = false; - draw_text_only = false; - } - void common_construct( - GLUI_Node *parent, GLUI_String *live_var, - bool scroll, int id, GLUI_CB callback); -}; - -/************************************************************/ -/* */ -/* List class - JVK */ -/* */ -/************************************************************/ - -class GLUI_List_Item : public GLUI_Node -{ -public: - GLUI_String text; - int id; -}; - -/************************************************************/ -/* */ -/* List class - JVK */ -/* */ -/************************************************************/ - -class GLUI_List : public GLUI_Control -{ -public: - /* GLUI List - JVK */ - GLUI_List( GLUI_Node *parent, bool scroll = false, - int id=-1, GLUI_CB callback=GLUI_CB() ); - /*, GLUI_Control *object = NULL - ,GLUI_InterObject_CB obj_cb = NULL);*/ - - GLUI_List( GLUI_Node *parent, - GLUI_String& live_var, bool scroll = false, - int id=-1, - GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL */ - /*,GLUI_InterObject_CB obj_cb = NULL*/); - - - GLUI_String orig_text; - int debug; - int draw_text_only; - int start_line; - int num_lines; - int curr_line; - int visible_lines; - GLUI_Scrollbar *scrollbar; - GLUI_List_Item items_list; - GLUI_Control *associated_object; - GLUI_CB obj_cb; - int cb_click_type; - int last_line; - int last_click_time; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void activate( int how ); - void deactivate( void ); - - void draw( int x, int y ); - - int mouse_over( int state, int x, int y ); - - int get_box_width(); - int find_word_break( int start, int direction ); - int substring_width( const char *t, int start, int end ); - int find_line( int x, int y ); - void update_and_draw_text( void ); - void draw_text( const char *t, int selected, int x, int y ); - void update_size( void ); - - - int add_item( int id, const char *text ); - int delete_item( const char *text ); - int delete_item( int id ); - int delete_all(); - - GLUI_List_Item *get_item_ptr( const char *text ); - GLUI_List_Item *get_item_ptr( int id ); - - void dump( FILE *out, const char *text ); - void set_start_line(int l) { start_line = l; } - static void scrollbar_callback(GLUI_Control*); - int get_current_item() { return curr_line; } - void set_click_type(int d) { - cb_click_type = d; } - void set_object_callback(GLUI_CB cb=GLUI_CB(), GLUI_Control*obj=NULL) - { obj_cb=cb; associated_object=obj; } - - virtual GLUI_List* dynamicCastGLUI_List() - { - return this; - } - -protected: - void common_init() - { - h = GLUI_LIST_HEIGHT; - w = GLUI_LIST_WIDTH; - num_lines = 0; - visible_lines = 0; - start_line = 0; - curr_line = 0; - name[0] = '\0'; - active_type = GLUI_CONTROL_ACTIVE_PERMANENT; - can_activate = true; - spacebar_mouse_click = false; - scrollbar = NULL; - debug = false; - draw_text_only = false; - cb_click_type = GLUI_SINGLE_CLICK; - last_line = -1; - last_click_time = 0; - associated_object = NULL; - }; - void common_construct( - GLUI_Node *parent, - GLUI_String* live_var, bool scroll, - int id, - GLUI_CB callback - /*,GLUI_Control *object*/ - /*,GLUI_InterObject_CB obj_cb*/); -}; - -/************************************************************/ -/* */ -/* Scrollbar class - JVK */ -/* */ -/************************************************************/ - -class GLUI_Scrollbar : public GLUI_Control -{ -public: - // Constructor, no live var - GLUI_Scrollbar( GLUI_Node *parent, - const char *name, - int horz_vert=GLUI_SCROLL_HORIZONTAL, - int data_type=GLUI_SCROLL_INT, - int id=-1, GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL*/ - /*,GLUI_InterObject_CB obj_cb = NULL*/ - ); - - // Constructor, int live var - GLUI_Scrollbar( GLUI_Node *parent, const char *name, int horz_vert, - int *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL*/ - /*,GLUI_InterObject_CB obj_cb = NULL*/ - ); - - // Constructor, float live var - GLUI_Scrollbar( GLUI_Node *parent, const char *name, int horz_vert, - float *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL*/ - /*,GLUI_InterObject_CB obj_cb = NULL*/ - ); - - bool currently_inside; - int state; - float growth, growth_exp; - int last_x, last_y; - int data_type; - int callback_count; - int last_int_val; ///< Used to prevent repeated callbacks. - float last_float_val; - int first_callback; - float user_speed; - float float_min, float_max; - int int_min, int_max; - int horizontal; - double last_update_time; ///< GLUI_Time() we last advanced scrollbar. - double velocity_limit; ///< Maximum distance to advance per second. - int box_length; - int box_start_position; - int box_end_position; - int track_length; - - - /* Rather than directly access an Editbox or Textbox for - changing variables, a pointer to some object is defined - along with a static callback in the form func(void *, int) - - the int is the new value, the void * must be cast to that - particular object type before use. - */ - void * associated_object; /* Lets the Spinner manage it's own callbacks */ - GLUI_CB object_cb; /* function pointer to object call_back */ - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void draw( int x, int y ); - void draw_pressed( void ); - void draw_unpressed( void ); - void draw_text( int sunken ); - - void update_size( void ); - - void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); - void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); - int find_arrow( int local_x, int local_y ); - void do_drag( int x, int y ); - void do_callbacks( void ); - void draw_scroll( void ); - void do_click( void ); - void idle( void ); - bool needs_idle( void ) const; - void set_int_val( int new_val ); - void set_float_val( float new_val ); - void increase_growth( void ); - void reset_growth( void ); - - void set_speed( float speed ) { user_speed = speed; }; - void update_scroll_parameters(); - void set_object_callback(GLUI_CB cb=GLUI_CB(), GLUI_Control*obj=NULL) - { object_cb=cb; associated_object=obj; } - - virtual GLUI_Scrollbar* dynamicCastGLUI_Scrollbar() - { - return this; - } - -protected: - void common_init ( void ); - void common_construct( - GLUI_Node *parent, - const char *name, - int horz_vert, - int data_type, void* live_var, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ); - - virtual void draw_scroll_arrow(int arrowtype, int x, int y); - virtual void draw_scroll_box(int x, int y, int w, int h); -}; - -/************************************************************/ -/* */ -/* Listbox class */ -/* */ -/************************************************************/ - -class GLUI_Listbox_Item : public GLUI_Node -{ -public: - GLUI_String text; - int id; -}; - -class GLUI_Listbox : public GLUI_Control -{ -public: - GLUI_String curr_text; - GLUI_Listbox_Item items_list; - int depressed; - - int orig_value; - bool currently_inside; - int text_x_offset, title_x_offset; - int glut_menu_id; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void update_size( void ); - void draw( int x, int y ); - int mouse_over( int state, int x, int y ); - - void set_int_val( int new_val ); - void dump( FILE *output ); - - int add_item( int id, const char *text ); - int delete_item( const char *text ); - int delete_item( int id ); - int sort_items( void ); - - int do_selection( int item ); - - GLUI_Listbox_Item *get_item_ptr( const char *text ); - GLUI_Listbox_Item *get_item_ptr( int id ); - - - GLUI_Listbox( GLUI_Node *parent, - const char *name, int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Listbox( void ) { common_init(); } - - virtual GLUI_Listbox* dynamicCastGLUI_Listbox() - { - return this; - } - -protected: - /** Change w and return true if we need to be widened to fit the current item. */ - bool recalculate_item_width( void ); - void common_init() { - glui_format_str( name, "Listbox: %p", this ); - w = GLUI_EDITTEXT_WIDTH; - h = GLUI_EDITTEXT_HEIGHT; - orig_value = -1; - title_x_offset = 0; - text_x_offset = 55; - can_activate = true; - curr_text = ""; - live_type = GLUI_LIVE_INT; /* This has an integer live var */ - depressed = false; - glut_menu_id = -1; - } - - ~GLUI_Listbox(); -}; - -/************************************************************/ -/* */ -/* Mouse_Interaction class */ -/* */ -/************************************************************/ - -/** - This is the superclass of translation and rotation widgets. -*/ -class GLUI_Mouse_Interaction : public GLUI_Control -{ -public: - /*int get_main_area_size( void ) { return MIN( h-18, */ - int draw_active_area_only; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int special_handler( int key, int modifiers ); - void update_size( void ); - void draw( int x, int y ); - void draw_active_area( void ); - - /*** The following methods (starting with "iaction_") need to - be overloaded ***/ - virtual int iaction_mouse_down_handler( int local_x, int local_y ) = 0; - virtual int iaction_mouse_up_handler( int local_x, int local_y, bool inside )=0; - virtual int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside )=0; - virtual int iaction_special_handler( int key, int modifiers )=0; - virtual void iaction_draw_active_area_persp( void )=0; - virtual void iaction_draw_active_area_ortho( void )=0; - virtual void iaction_dump( FILE *output )=0; - virtual void iaction_init( void ) = 0; - - GLUI_Mouse_Interaction( void ) { - glui_format_str( name, "Mouse_Interaction: %p", this ); - w = GLUI_MOUSE_INTERACTION_WIDTH; - h = GLUI_MOUSE_INTERACTION_HEIGHT; - can_activate = true; - live_type = GLUI_LIVE_NONE; - alignment = GLUI_ALIGN_CENTER; - draw_active_area_only = false; - } -}; - -/************************************************************/ -/* */ -/* Rotation class */ -/* */ -/************************************************************/ - -/** - An onscreen rotation controller--allows the user to interact with - a 3D rotation via a spaceball-like interface. -*/ -class GLUI_Rotation : public GLUI_Mouse_Interaction -{ -public: - Arcball *ball; - GLUquadricObj *quadObj; - bool can_spin, spinning; - float damping; - - int iaction_mouse_down_handler( int local_x, int local_y ); - int iaction_mouse_up_handler( int local_x, int local_y, bool inside ); - int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside ); - int iaction_special_handler( int key, int modifiers ); - void iaction_init( void ) { init_ball(); } - void iaction_draw_active_area_persp( void ); - void iaction_draw_active_area_ortho( void ); - void iaction_dump( FILE *output ); - - /* void update_size( void ); */ - /* void draw( int x, int y ); */ - /* int mouse_over( int state, int x, int y ); */ - - void setup_texture( void ); - void setup_lights( void ); - void draw_ball( float radius ); - - void init_ball( void ); - - void reset( void ); - - bool needs_idle( void ) const; - void idle( void ); - - void copy_float_array_to_ball( void ); - void copy_ball_to_float_array( void ); - - void set_spin( float damp_factor ); - - GLUI_Rotation( GLUI_Node *parent, const char *name, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Rotation(void) { common_init(); } - -protected: - void common_init(); -}; - -/************************************************************/ -/* */ -/* Translation class */ -/* */ -/************************************************************/ - -/** - An onscreen translation controller--allows the user to interact with - a 3D translation. -*/ -class GLUI_Translation : public GLUI_Mouse_Interaction -{ -public: - int trans_type; /* Is this an XY or a Z controller? */ - int down_x, down_y; - float scale_factor; - GLUquadricObj *quadObj; - int trans_mouse_code; - float orig_x, orig_y, orig_z; - int locked; - - int iaction_mouse_down_handler( int local_x, int local_y ); - int iaction_mouse_up_handler( int local_x, int local_y, bool inside ); - int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside ); - int iaction_special_handler( int key, int modifiers ); - void iaction_init( void ) { } - void iaction_draw_active_area_persp( void ); - void iaction_draw_active_area_ortho( void ); - void iaction_dump( FILE *output ); - - void set_speed( float s ) { scale_factor = s; } - - void setup_texture( void ); - void setup_lights( void ); - void draw_2d_arrow( int radius, int filled, int orientation ); - void draw_2d_x_arrows( int radius ); - void draw_2d_y_arrows( int radius ); - void draw_2d_z_arrows( int radius ); - void draw_2d_xy_arrows( int radius ); - - int get_mouse_code( int x, int y ); - - /* Float array is either a single float (for single-axis controls), - or two floats for X and Y (if an XY controller) */ - - float get_z( void ) { return float_array_val[0]; } - float get_x( void ) { return float_array_val[0]; } - float get_y( void ) { - if ( trans_type == GLUI_TRANSLATION_XY ) return float_array_val[1]; - else return float_array_val[0]; - } - - void set_z( float val ); - void set_x( float val ); - void set_y( float val ); - void set_one_val( float val, int index ); - - GLUI_Translation( GLUI_Node *parent, const char *name, - int trans_type, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Translation( void ) { common_init(); } - -protected: - void common_init() { - locked = GLUI_TRANSLATION_LOCK_NONE; - glui_format_str( name, "Translation: %p", this ); - w = GLUI_MOUSE_INTERACTION_WIDTH; - h = GLUI_MOUSE_INTERACTION_HEIGHT; - can_activate = true; - live_type = GLUI_LIVE_FLOAT_ARRAY; - float_array_size = 0; - alignment = GLUI_ALIGN_CENTER; - trans_type = GLUI_TRANSLATION_XY; - scale_factor = 1.0; - quadObj = NULL; - trans_mouse_code = GLUI_TRANSLATION_MOUSE_NONE; - } -}; - -/********** Misc functions *********************/ -int _glutBitmapWidthString( void *font, const char *s ); -void _glutBitmapString( void *font, const char *s ); - -/********** Our own callbacks for glut *********/ -/* These are the callbacks that we pass to glut. They take - some action if necessary, then (possibly) call the user-level - glut callbacks. -*/ - -void glui_display_func( void ); -void glui_reshape_func( int w, int h ); -void glui_keyboard_func(unsigned char key, int x, int y); -void glui_special_func(int key, int x, int y); -void glui_mouse_func(int button, int state, int x, int y); -void glui_motion_func(int x, int y); -void glui_passive_motion_func(int x, int y); -void glui_entry_func(int state); -void glui_visibility_func(int state); -void glui_idle_func(void); - -void glui_parent_window_reshape_func( int w, int h ); -void glui_parent_window_keyboard_func(unsigned char key, int x, int y); -void glui_parent_window_mouse_func(int, int, int, int ); -void glui_parent_window_special_func(int key, int x, int y); - -#endif +/**************************************************************************** + + GLUI User Interface Toolkit (LGPL) + ---------------------------------- + + glui.h - Main (and only) external header for + GLUI User Interface Toolkit + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#ifndef GLUI_GLUI_H +#define GLUI_GLUI_H + +#ifdef WIN32 + #pragma warning(disable : 4324) // disable padding warning + #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. + #pragma warning(disable:4996) //Turn off warnings about deprecated C routines + #pragma warning(disable:4786) // Disable the "debug name too long" warning +#endif + + +#ifdef WIN32//for glut.h +#include +#endif + +#if defined(GLUI_FREEGLUT) || defined(BT_USE_FREEGLUT) + + // FreeGLUT does not yet work perfectly with GLUI + // - use at your own risk. + #include + +#elif defined(GLUI_OPENGLUT) + + // OpenGLUT does not yet work properly with GLUI + // - use at your own risk. + + #include + +#else + +#if defined(__APPLE__) && !defined (VMDMESA) + #include + #include + #include +#else +// #include "../../freeglut/gl/glut.h" + #include + #endif + +#endif + +#include +#include +#include +#include +#include + +#define GLUI_VERSION 2.3f /********** Current version **********/ + +#if defined(_WIN32) +#if !defined(GLUI_NO_LIB_PRAGMA) +//#pragma comment(lib, "glui32.lib") // Link automatically with GLUI library +#endif +#endif + +/********** Do some basic defines *******/ + +#ifndef Byte +#define Byte unsigned char +#endif + +#ifndef _RGBC_ +class RGBc { +public: + Byte r, g, b; + + void set(Byte r,Byte g,Byte b) {this->r=r;this->g=g;this->b=b;} + + RGBc( void ) {} + RGBc( Byte r, Byte g, Byte b ) { set( r, g, b ); } +}; +#define _RGBC_ +#endif + +/********** List of GLUT callbacks ********/ + +enum GLUI_Glut_CB_Types +{ + GLUI_GLUT_RESHAPE, + GLUI_GLUT_KEYBOARD, + GLUI_GLUT_DISPLAY, + GLUI_GLUT_MOUSE, + GLUI_GLUT_MOTION, + GLUI_GLUT_SPECIAL, + GLUI_GLUT_SPECIAL_UP, + GLUI_GLUT_PASSIVE_MOTION, + GLUI_GLUT_ENTRY, + GLUI_GLUT_VISIBILITY +}; + +/********* Constants for window placement **********/ + +#define GLUI_XOFF 6 +#define GLUI_YOFF 6 +#define GLUI_ITEMSPACING 3 +#define GLUI_CHECKBOX_SIZE 13 +#define GLUI_RADIOBUTTON_SIZE 13 +#define GLUI_BUTTON_SIZE 20 +#define GLUI_STATICTEXT_SIZE 13 +#define GLUI_SEPARATOR_HEIGHT 8 +#define GLUI_DEFAULT_CONTROL_WIDTH 100 +#define GLUI_DEFAULT_CONTROL_HEIGHT 13 +#define GLUI_EDITTEXT_BOXINNERMARGINX 3 +#define GLUI_EDITTEXT_HEIGHT 20 +#define GLUI_EDITTEXT_WIDTH 130 +#define GLUI_EDITTEXT_MIN_INT_WIDTH 35 +#define GLUI_EDITTEXT_MIN_TEXT_WIDTH 50 +#define GLUI_PANEL_NAME_DROP 8 +#define GLUI_PANEL_EMBOSS_TOP 4 +/* #define GLUI_ROTATION_WIDTH 60 */ +/* #define GLUI_ROTATION_HEIGHT 78 */ +#define GLUI_ROTATION_WIDTH 50 +#define GLUI_ROTATION_HEIGHT (GLUI_ROTATION_WIDTH+18) +#define GLUI_MOUSE_INTERACTION_WIDTH 50 +#define GLUI_MOUSE_INTERACTION_HEIGHT (GLUI_MOUSE_INTERACTION_WIDTH)+18 + +/** Different panel control types **/ +#define GLUI_PANEL_NONE 0 +#define GLUI_PANEL_EMBOSSED 1 +#define GLUI_PANEL_RAISED 2 + +/** Max # of els in control's float_array **/ +#define GLUI_DEF_MAX_ARRAY 30 + +/********* The control's 'active' behavior *********/ +#define GLUI_CONTROL_ACTIVE_MOUSEDOWN 1 +#define GLUI_CONTROL_ACTIVE_PERMANENT 2 + +/********* Control alignment types **********/ +#define GLUI_ALIGN_CENTER 1 +#define GLUI_ALIGN_RIGHT 2 +#define GLUI_ALIGN_LEFT 3 + +/********** Limit types - how to limit spinner values *********/ +#define GLUI_LIMIT_NONE 0 +#define GLUI_LIMIT_CLAMP 1 +#define GLUI_LIMIT_WRAP 2 + +/********** Translation control types ********************/ +#define GLUI_TRANSLATION_XY 0 +#define GLUI_TRANSLATION_Z 1 +#define GLUI_TRANSLATION_X 2 +#define GLUI_TRANSLATION_Y 3 + +#define GLUI_TRANSLATION_LOCK_NONE 0 +#define GLUI_TRANSLATION_LOCK_X 1 +#define GLUI_TRANSLATION_LOCK_Y 2 + +/********** How was a control activated? *****************/ +#define GLUI_ACTIVATE_MOUSE 1 +#define GLUI_ACTIVATE_TAB 2 + +/********** What type of live variable does a control have? **********/ +#define GLUI_LIVE_NONE 0 +#define GLUI_LIVE_INT 1 +#define GLUI_LIVE_FLOAT 2 +#define GLUI_LIVE_TEXT 3 +#define GLUI_LIVE_STRING 6 +#define GLUI_LIVE_DOUBLE 4 +#define GLUI_LIVE_FLOAT_ARRAY 5 + +/************* Textbox and List Defaults - JVK ******************/ +#define GLUI_TEXTBOX_HEIGHT 130 +#define GLUI_TEXTBOX_WIDTH 130 +#define GLUI_LIST_HEIGHT 130 +#define GLUI_LIST_WIDTH 130 +#define GLUI_DOUBLE_CLICK 1 +#define GLUI_SINGLE_CLICK 0 +#define GLUI_TAB_WIDTH 50 /* In pixels */ +#define GLUI_TEXTBOX_BOXINNERMARGINX 3 +#define GLUI_TEXTBOX_MIN_TEXT_WIDTH 50 +#define GLUI_LIST_BOXINNERMARGINX 3 +#define GLUI_LIST_MIN_TEXT_WIDTH 50 + +/*********************** TreePanel Defaults - JVK *****************************/ +#define GLUI_TREEPANEL_DEFAULTS 0 // bar, standard bar color +#define GLUI_TREEPANEL_ALTERNATE_COLOR 1 // Alternate between 8 different bar colors +#define GLUI_TREEPANEL_ENABLE_BAR 2 // enable the bar +#define GLUI_TREEPANEL_DISABLE_BAR 4 // disable the bar +#define GLUI_TREEPANEL_DISABLE_DEEPEST_BAR 8 // disable only the deepest bar +#define GLUI_TREEPANEL_CONNECT_CHILDREN_ONLY 16 // disable only the bar of the last child of each root +#define GLUI_TREEPANEL_DISPLAY_HIERARCHY 32 // display some sort of hierachy in the tree node title +#define GLUI_TREEPANEL_HIERARCHY_NUMERICDOT 64 // display hierarchy in 1.3.2 (etc... ) format +#define GLUI_TREEPANEL_HIERARCHY_LEVEL_ONLY 128 // display hierarchy as only the level depth + +/******************* GLUI Scrollbar Defaults - JVK ***************************/ +#define GLUI_SCROLL_ARROW_WIDTH 16 +#define GLUI_SCROLL_ARROW_HEIGHT 16 +#define GLUI_SCROLL_BOX_MIN_HEIGHT 5 +#define GLUI_SCROLL_BOX_STD_HEIGHT 16 +#define GLUI_SCROLL_STATE_NONE 0 +#define GLUI_SCROLL_STATE_UP 1 +#define GLUI_SCROLL_STATE_DOWN 2 +#define GLUI_SCROLL_STATE_BOTH 3 +#define GLUI_SCROLL_STATE_SCROLL 4 +#define GLUI_SCROLL_DEFAULT_GROWTH_EXP 1.05f +#define GLUI_SCROLL_VERTICAL 0 +#define GLUI_SCROLL_HORIZONTAL 1 + + +/** Size of the character width hash table for faster lookups. + Make sure to keep this a power of two to avoid the slow divide. + This is also a speed/memory tradeoff; 128 is enough for low ASCII. +*/ +#define CHAR_WIDTH_HASH_SIZE 128 + +/********** Translation codes **********/ + +enum TranslationCodes +{ + GLUI_TRANSLATION_MOUSE_NONE = 0, + GLUI_TRANSLATION_MOUSE_UP, + GLUI_TRANSLATION_MOUSE_DOWN, + GLUI_TRANSLATION_MOUSE_LEFT, + GLUI_TRANSLATION_MOUSE_RIGHT, + GLUI_TRANSLATION_MOUSE_UP_LEFT, + GLUI_TRANSLATION_MOUSE_UP_RIGHT, + GLUI_TRANSLATION_MOUSE_DOWN_LEFT, + GLUI_TRANSLATION_MOUSE_DOWN_RIGHT +}; + +/************ A string type for us to use **********/ + +typedef std::string GLUI_String; +GLUI_String& glui_format_str(GLUI_String &str, const char* fmt, ...); + +/********* Pre-declare classes as needed *********/ + +class GLUI; +class GLUI_Control; +class GLUI_Listbox; +class GLUI_StaticText; +class GLUI_EditText; +class GLUI_Panel; +class GLUI_Spinner; +class GLUI_RadioButton; +class GLUI_RadioGroup; +class GLUI_Glut_Window; +class GLUI_TreePanel; +class GLUI_Scrollbar; +class GLUI_List; + +class Arcball; + +/*** Flags for GLUI class constructor ***/ +#define GLUI_SUBWINDOW ((long)(1<<1)) +#define GLUI_SUBWINDOW_TOP ((long)(1<<2)) +#define GLUI_SUBWINDOW_BOTTOM ((long)(1<<3)) +#define GLUI_SUBWINDOW_LEFT ((long)(1<<4)) +#define GLUI_SUBWINDOW_RIGHT ((long)(1<<5)) + +/*** Codes for different type of edittext boxes and spinners ***/ +#define GLUI_EDITTEXT_TEXT 1 +#define GLUI_EDITTEXT_INT 2 +#define GLUI_EDITTEXT_FLOAT 3 +#define GLUI_SPINNER_INT GLUI_EDITTEXT_INT +#define GLUI_SPINNER_FLOAT GLUI_EDITTEXT_FLOAT +#define GLUI_SCROLL_INT GLUI_EDITTEXT_INT +#define GLUI_SCROLL_FLOAT GLUI_EDITTEXT_FLOAT +// This is only for deprecated interface +#define GLUI_EDITTEXT_STRING 4 + +/*** Definition of callbacks ***/ +typedef void (*GLUI_Update_CB) (int id); +typedef void (*GLUI_Control_CB)(GLUI_Control *); +typedef void (*Int1_CB) (int); +typedef void (*Int2_CB) (int, int); +typedef void (*Int3_CB) (int, int, int); +typedef void (*Int4_CB) (int, int, int, int); + +/************************************************************/ +/** + Callback Adapter Class + Allows us to support different types of callbacks; + like a GLUI_Update_CB function pointer--which takes an int; + and a GLUI_Control_CB function pointer--which takes a GUI_Control object. +*/ +class GLUI_CB +{ +public: + GLUI_CB() : idCB(0),objCB(0) {} + GLUI_CB(GLUI_Update_CB cb) : idCB(cb),objCB(0) {} + GLUI_CB(GLUI_Control_CB cb) : idCB(0),objCB(cb) {} + // (Compiler generated copy constructor) + + /** This control just activated. Fire our callback.*/ + void operator()(GLUI_Control *ctrl) const; + bool operator!() const { return !idCB && !objCB; } + operator bool() const { return !(!(*this)); } +private: + GLUI_Update_CB idCB; + GLUI_Control_CB objCB; +}; + +/************************************************************/ +/* */ +/* Base class, for hierarchical relationships */ +/* */ +/************************************************************/ + +class GLUI_Control; +class GLUI_Column; +class GLUI_Panel; +class GLUI_FileBrowser; +class GLUI_Scrollbar; +class GLUI_Listbox; +class GLUI_List; +class GLUI_Rollout; +class GLUI_Tree; + + +/** + GLUI_Node is a node in a sort of tree of GLUI controls. + Each GLUI_Node has a list of siblings (in a circular list) + and a linked list of children. + + Everything onscreen is a GLUI_Node--windows, buttons, etc. + The nodes are traversed for event processing, sizing, redraws, etc. +*/ +class GLUI_Node +{ + friend class GLUI_Tree; /* JVK */ + friend class GLUI_Rollout; + friend class GLUI_Main; + +public: + GLUI_Node(); + virtual ~GLUI_Node() {} + + GLUI_Node *first_sibling(); + GLUI_Node *last_sibling(); + GLUI_Node *prev(); + GLUI_Node *next(); + + GLUI_Node *first_child() { return child_head; } + GLUI_Node *last_child() { return child_tail; } + GLUI_Node *parent() { return parent_node; } + + /** Link in a new child control */ + virtual int add_control( GLUI_Control *control ); + + void link_this_to_parent_last (GLUI_Node *parent ); + void link_this_to_parent_first(GLUI_Node *parent ); + void link_this_to_sibling_next(GLUI_Node *sibling ); + void link_this_to_sibling_prev(GLUI_Node *sibling ); + void unlink(); + + void dump( FILE *out, const char *name ); + + virtual GLUI_Panel* dynamicCastGLUI_Panel() + { + return 0; + } + + virtual GLUI_Column* dynamicCastGLUI_Column() + { + return 0; + } + virtual GLUI_EditText* dynamicCastGLUI_EditText() + { + return 0; + } + virtual GLUI_Rollout* dynamicCastGLUI_Rollout() + { + return 0; + } + + virtual GLUI_Tree* dynamicCastGLUI_Tree() + { + return 0; + } + + virtual GLUI_List* dynamicCastGLUI_List() + { + return 0; + } + + virtual GLUI_FileBrowser* dynamicCastGLUI_FileBrowser() + { + return 0; + } + + virtual GLUI_Scrollbar* dynamicCastGLUI_Scrollbar() + { + return 0; + } + + virtual GLUI_Listbox* dynamicCastGLUI_Listbox() + { + return 0; + } + + virtual GLUI_TreePanel* dynamicCastGLUI_TreePanel() + { + return 0; + } + + + +protected: + static void add_child_to_control(GLUI_Node *parent,GLUI_Control *child); + GLUI_Node *parent_node; + GLUI_Node *child_head; + GLUI_Node *child_tail; + GLUI_Node *next_sibling; + GLUI_Node *prev_sibling; +}; + + +/************************************************************/ +/* */ +/* Standard Bitmap stuff */ +/* */ +/************************************************************/ + +enum GLUI_StdBitmaps_Codes +{ + GLUI_STDBITMAP_CHECKBOX_OFF = 0, + GLUI_STDBITMAP_CHECKBOX_ON, + GLUI_STDBITMAP_RADIOBUTTON_OFF, + GLUI_STDBITMAP_RADIOBUTTON_ON, + GLUI_STDBITMAP_UP_ARROW, + GLUI_STDBITMAP_DOWN_ARROW, + GLUI_STDBITMAP_LEFT_ARROW, + GLUI_STDBITMAP_RIGHT_ARROW, + GLUI_STDBITMAP_SPINNER_UP_OFF, + GLUI_STDBITMAP_SPINNER_UP_ON, + GLUI_STDBITMAP_SPINNER_DOWN_OFF, + GLUI_STDBITMAP_SPINNER_DOWN_ON, + GLUI_STDBITMAP_CHECKBOX_OFF_DIS, /*** Disactivated control bitmaps ***/ + GLUI_STDBITMAP_CHECKBOX_ON_DIS, + GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, + GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, + GLUI_STDBITMAP_SPINNER_UP_DIS, + GLUI_STDBITMAP_SPINNER_DOWN_DIS, + GLUI_STDBITMAP_LISTBOX_UP, + GLUI_STDBITMAP_LISTBOX_DOWN, + GLUI_STDBITMAP_LISTBOX_UP_DIS, + GLUI_STDBITMAP_NUM_ITEMS +}; + +/************************************************************/ +/* */ +/* Class GLUI_Bitmap */ +/* */ +/************************************************************/ + +/** + GLUI_Bitmap is a simple 2D texture map. It's used + to represent small textures like checkboxes, arrows, etc. + via the GLUI_StdBitmaps class. +*/ +class GLUI_Bitmap +{ + friend class GLUI_StdBitmaps; + +public: + GLUI_Bitmap(); + ~GLUI_Bitmap(); + + /** Create bitmap from greyscale byte image */ + void init_grey(unsigned char *array); + + /** Create bitmap from color int image */ + void init(int *array); + +private: + /** RGB pixel data */ + unsigned char *pixels; + int w, h; +}; + + +/************************************************************/ +/* */ +/* Class GLUI_StdBitmap */ +/* */ +/************************************************************/ + +/** + Keeps an array of GLUI_Bitmap objects to represent all the + images used in the UI: checkboxes, arrows, etc. +*/ +class GLUI_StdBitmaps +{ +public: + GLUI_StdBitmaps(); + ~GLUI_StdBitmaps(); + + /** Return the width (in pixels) of the n'th standard bitmap. */ + int width (int n) const; + /** Return the height (in pixels) of the n'th standard bitmap. */ + int height(int n) const; + + /** Draw the n'th standard bitmap (one of the enums + listed in GLUI_StdBitmaps_Codes) at pixel corner (x,y). + */ + void draw(int n, int x, int y) const; + +private: + GLUI_Bitmap bitmaps[GLUI_STDBITMAP_NUM_ITEMS]; +}; + +/************************************************************/ +/* */ +/* Master GLUI Class */ +/* */ +/************************************************************/ + +/** + The master manages our interaction with GLUT. + There's only one GLUI_Master_Object. +*/ +class GLUI_Master_Object +{ + + friend void glui_idle_func(); + +public: + + GLUI_Master_Object(); + ~GLUI_Master_Object(); + + GLUI_Node gluis; + GLUI_Control *active_control, *curr_left_button_glut_menu; + GLUI *active_control_glui; + int glui_id_counter; + + GLUI_Glut_Window *find_glut_window( int window_id ); + + void set_glutIdleFunc(void (*f)(void)); + + /************** + void (*glut_keyboard_CB)(unsigned char, int, int); + void (*glut_reshape_CB)(int, int); + void (*glut_special_CB)(int, int, int); + void (*glut_mouse_CB)(int,int,int,int); + + void (*glut_passive_motion_CB)(int,int); + void (*glut_visibility_CB)(int); + void (*glut_motion_CB)(int,int); + void (*glut_display_CB)(void); + void (*glut_entry_CB)(int); + **********/ + + void set_left_button_glut_menu_control( GLUI_Control *control ); + + /********** GLUT callthroughs **********/ + /* These are the glut callbacks that we do not handle */ + + void set_glutReshapeFunc (void (*f)(int width, int height)); + void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); + void set_glutSpecialFunc (void (*f)(int key, int x, int y)); + void set_glutSpecialUpFunc(void (*f)(int key, int x, int y)); + + void set_glutMouseFunc (void (*f)(int, int, int, int )); + + void set_glutDisplayFunc(void (*f)(void)) {glutDisplayFunc(f);} + void set_glutTimerFunc(unsigned int millis, void (*f)(int value), int value) + { ::glutTimerFunc(millis,f,value);} + void set_glutOverlayDisplayFunc(void(*f)(void)){glutOverlayDisplayFunc(f);} + void set_glutSpaceballMotionFunc(Int3_CB f) {glutSpaceballMotionFunc(f);} + void set_glutSpaceballRotateFunc(Int3_CB f) {glutSpaceballRotateFunc(f);} + void set_glutSpaceballButtonFunc(Int2_CB f) {glutSpaceballButtonFunc(f);} + void set_glutTabletMotionFunc(Int2_CB f) {glutTabletMotionFunc(f);} + void set_glutTabletButtonFunc(Int4_CB f) {glutTabletButtonFunc(f);} + /* void set_glutWindowStatusFunc(Int1_CB f) {glutWindowStatusFunc(f);} */ + void set_glutMenuStatusFunc(Int3_CB f) {glutMenuStatusFunc(f);} + void set_glutMenuStateFunc(Int1_CB f) {glutMenuStateFunc(f);} + void set_glutButtonBoxFunc(Int2_CB f) {glutButtonBoxFunc(f);} + void set_glutDialsFunc(Int2_CB f) {glutDialsFunc(f);} + + + GLUI *create_glui( const char *name, long flags=0, int x=-1, int y=-1 ); + GLUI *create_glui_subwindow( int parent_window, long flags=0 ); + GLUI *find_glui_by_window_id( int window_id ); + void get_viewport_area( int *x, int *y, int *w, int *h ); + void auto_set_viewport(); + void close_all(); + void sync_live_all(); + + void reshape(); + + float get_version() { return GLUI_VERSION; } + + void glui_setIdleFuncIfNecessary(void); + +private: + GLUI_Node glut_windows; + void (*glut_idle_CB)(void); + + void add_cb_to_glut_window(int window,int cb_type,void *cb); +}; + +/** + This is the only GLUI_Master_Object in existence. +*/ +extern GLUI_Master_Object GLUI_Master; + +/************************************************************/ +/* */ +/* Class for managing a GLUT window */ +/* */ +/************************************************************/ + +/** + A top-level window. The GLUI_Master GLUT callback can route events + to the callbacks in this class, for arbitrary use by external users. + (see GLUI_Master_Object::set_glutKeyboardFunc). + + This entire approach seems to be superceded by the "subwindow" flavor + of GLUI. +*/ +class GLUI_Glut_Window : public GLUI_Node +{ +public: + GLUI_Glut_Window(); + + int glut_window_id; + + /*********** Pointers to GLUT callthrough functions *****/ + void (*glut_keyboard_CB)(unsigned char, int, int); + void (*glut_special_CB)(int, int, int); + void (*glut_special_up_CB)(int, int, int); + void (*glut_reshape_CB)(int, int); + void (*glut_passive_motion_CB)(int,int); + void (*glut_mouse_CB)(int,int,int,int); + void (*glut_visibility_CB)(int); + void (*glut_motion_CB)(int,int); + void (*glut_display_CB)(void); + void (*glut_entry_CB)(int); +}; + +/************************************************************/ +/* */ +/* Main Window GLUI class (not user-level) */ +/* */ +/************************************************************/ + +/** + A GLUI_Main handles GLUT events for one window, routing them to the + appropriate controls. The central user-visible "GLUI" class + inherits from this class; users should not allocate GLUT_Main objects. + + There's a separate GLUI_Main object for: + - Each top-level window with GUI stuff in it. + - Each "subwindow" of another top-level window. + + All the GLUI_Main objects are listed in GLUI_Master.gluis. + A better name for this class might be "GLUI_Environment"; + this class provides the window-level context for every control. +*/ +class GLUI_Main : public GLUI_Node +{ + /********** Friend classes *************/ + + friend class GLUI_Control; + friend class GLUI_Rotation; + friend class GLUI_Translation; + friend class GLUI; + friend class GLUI_Master_Object; + + /*********** Friend functions **********/ + + friend void glui_mouse_func(int button, int state, int x, int y); + friend void glui_keyboard_func(unsigned char key, int x, int y); + friend void glui_special_func(int key, int x, int y); + friend void glui_special_up_func(int key, int x, int y); + friend void glui_passive_motion_func(int x, int y); + friend void glui_reshape_func( int w, int h ); + friend void glui_visibility_func(int state); + friend void glui_motion_func(int x, int y); + friend void glui_entry_func(int state); + friend void glui_display_func( void ); + friend void glui_idle_func(void); + + friend void glui_parent_window_reshape_func( int w, int h ); + friend void glui_parent_window_keyboard_func( unsigned char, int, int ); + friend void glui_parent_window_special_func( int, int, int ); + friend void glui_parent_window_mouse_func( int, int, int, int ); + +protected: + /*** Variables ***/ + int main_gfx_window_id; + int mouse_button_down; + int glut_window_id; + int top_level_glut_window_id; + GLUI_Control *active_control; + GLUI_Control *mouse_over_control; + GLUI_Panel *main_panel; + enum buffer_mode_t { + buffer_front=1, ///< Draw updated controls directly to screen. + buffer_back=2 ///< Double buffering: postpone updates until next redraw. + }; + buffer_mode_t buffer_mode; ///< Current drawing mode + int curr_cursor; + int w, h; + long flags; + bool closing; + int parent_window; + int glui_id; + + /********** Misc functions *************/ + + GLUI_Control *find_control( int x, int y ); + GLUI_Control *find_next_control( GLUI_Control *control ); + GLUI_Control *find_next_control_rec( GLUI_Control *control ); + GLUI_Control *find_next_control_( GLUI_Control *control ); + GLUI_Control *find_prev_control( GLUI_Control *control ); + void create_standalone_window( const char *name, int x=-1, int y=-1 ); + void create_subwindow( int parent,int window_alignment ); + void setup_default_glut_callbacks( void ); + + void mouse(int button, int state, int x, int y); + void keyboard(unsigned char key, int x, int y); + void special(int key, int x, int y); + void special_up(int key, int x, int y); + void passive_motion(int x, int y); + void reshape( int w, int h ); + void visibility(int state); + void motion(int x, int y); + void entry(int state); + void display( void ); + void idle(void); + int needs_idle(void); + + void (*glut_mouse_CB)(int, int, int, int); + void (*glut_keyboard_CB)(unsigned char, int, int); + void (*glut_special_CB)(int, int, int); + void (*glut_reshape_CB)(int, int); + + + /*********** Controls ************/ + + virtual int add_control( GLUI_Node *parent, GLUI_Control *control ); + + + /********** Constructors and Destructors ***********/ + + GLUI_Main( void ); + +public: + GLUI_StdBitmaps std_bitmaps; + GLUI_String window_name; + RGBc bkgd_color; + float bkgd_color_f[3]; + + void *font; + int curr_modifiers; + + void adjust_glut_xy( int &x, int &y ) { (void)x; y = h-y; } + void activate_control( GLUI_Control *control, int how ); + void align_controls( GLUI_Control *control ); + void deactivate_current_control( void ); + + /** Draw a 3D-look pushed-out box around this rectangle */ + void draw_raised_box( int x, int y, int w, int h ); + /** Draw a 3D-look pushed-in box around this rectangle */ + void draw_lowered_box( int x, int y, int w, int h ); + + /** Return true if this control should redraw itself immediately (front buffer); + Or queue up a redraw and return false if it shouldn't (back buffer). + */ + bool should_redraw_now(GLUI_Control *ctl); + + int getMainWindowId() + { + return main_gfx_window_id; + } + /** Switch to the appropriate draw buffer now. Returns the old draw buffer. + This routine should probably only be called from inside the GLUI_DrawingSentinal, + in glui_internal_control.h + */ + int set_current_draw_buffer(); + /** Go back to using this draw buffer. Undoes set_current_draw_buffer. */ + void restore_draw_buffer( int buffer_state ); + + /** Pack, resize the window, and redraw all the controls. */ + void refresh(); + + /** Redraw the main graphics window */ + void post_update_main_gfx(); + + /** Recompute the sizes and positions of all controls */ + void pack_controls(); + + void close_internal(); + void check_subwindow_position(); + void set_ortho_projection(); + void set_viewport(); + int get_glut_window_id( void ) { return glut_window_id; } /* JVK */ +}; + +/************************************************************/ +/* */ +/* GLUI_Control: base class for all controls */ +/* */ +/************************************************************/ + +//get rid of the dynamic_cast/RTTI requirements, just do a virtual function + + +/** + All the GUI objects inherit from GLUI_Control: buttons, + checkboxes, labels, edit boxes, scrollbars, etc. + Most of the work of this class is in routing events, + like keystrokes, mouseclicks, redraws, and sizing events. + + Yes, this is a huge and hideous class. It needs to be + split up into simpler subobjects. None of the data members + should be directly accessed by users (they should be protected, + not public); only subclasses. +*/ +class GLUI_Control : public GLUI_Node +{ +public: + +/** Onscreen coordinates */ + int w, h; /* dimensions of control */ + int x_abs, y_abs; + int x_off, y_off_top, y_off_bot; /* INNER margins, by which child + controls are indented */ + int contain_x, contain_y; + int contain_w, contain_h; + /* if this is a container control (e.g., + radiogroup or panel) this indicated dimensions + of inner area in which controls reside */ + +/** "activation" for tabbing between controls. */ + int active_type; ///< "GLUI_CONTROL_ACTIVE_..." + bool active; ///< If true, we've got the focus + bool can_activate; ///< If false, remove from tab order. + bool spacebar_mouse_click; ///< Spacebar simulates click. + +/** Callbacks */ + long user_id; ///< Integer to pass to callback function. + GLUI_CB callback; ///< User callback function, or NULL. + +/** Variable value storage */ + float float_val; /**< Our float value */ + int int_val; /**< Our integer value */ + float float_array_val[GLUI_DEF_MAX_ARRAY]; + int float_array_size; + GLUI_String text; /**< The text inside this control */ + +/** "Live variable" updating */ + void *ptr_val; /**< A pointer to the user's live variable value */ + int live_type; + bool live_inited; + /* These variables store the last value that live variable was known to have. */ + int last_live_int; + float last_live_float; + GLUI_String last_live_text; + float last_live_float_array[GLUI_DEF_MAX_ARRAY]; + +/** Properties of our control */ + GLUI *glui; /**< Our containing event handler (NEVER NULL during event processing!) */ + bool is_container; /**< Is this a container class (e.g., panel) */ + int alignment; + bool enabled; /**< Is this control grayed out? */ + GLUI_String name; /**< The name of this control */ + void *font; /**< Our glutbitmap font */ + bool collapsible, is_open; + GLUI_Node collapsed_node; + bool hidden; /* Collapsed controls (and children) are hidden */ + int char_widths[CHAR_WIDTH_HASH_SIZE][2]; /* Character width hash table */ + +public: + /*** Get/Set values ***/ + virtual void set_name( const char *string ); + virtual void set_int_val( int new_int ) { int_val = new_int; output_live(true); } + virtual void set_float_val( float new_float ) { float_val = new_float; output_live(true); } + virtual void set_ptr_val( void *new_ptr ) { ptr_val = new_ptr; output_live(true); } + virtual void set_float_array_val( float *array_ptr ); + + virtual float get_float_val( void ) { return float_val; } + virtual int get_int_val( void ) { return int_val; } + virtual void get_float_array_val( float *array_ptr ); + virtual int get_id( void ) const { return user_id; } + virtual void set_id( int id ) { user_id=id; } + + virtual int mouse_down_handler( int local_x, int local_y ) { (void)local_x; (void)local_y; return false; } + virtual int mouse_up_handler( int local_x, int local_y, bool inside ) { (void)local_x; (void)local_y; (void)inside; return false; } + virtual int mouse_held_down_handler( int local_x, int local_y, bool inside) { (void)local_x; (void)local_y; (void)inside; return false; } + virtual int key_handler( unsigned char key, int modifiers ) { (void)key; (void)modifiers; return false; } + virtual int special_handler( int key,int modifiers ) { (void)key; (void)modifiers; return false; } + virtual int special_up_handler( int key,int modifiers ) { (void)key; (void)modifiers; return false; } + + virtual void update_size( void ) { } + virtual void idle( void ) { } + virtual int mouse_over( int state, int x, int y ) { (void)state; (void)x; (void)y; return false; } + + virtual void enable( void ); + virtual void disable( void ); + virtual void activate( int how ) { (void)how; active = true; } + virtual void deactivate( void ) { active = false; } + + /** Hide (shrink into a rollout) and unhide (expose from a rollout) */ + void hide_internal( int recurse ); + void unhide_internal( int recurse ); + + + /** Return true if it currently makes sense to draw this class. */ + int can_draw( void ) { return (glui != NULL && hidden == false); } + + /** Redraw this control. + In single-buffering mode (drawing to GL_FRONT), this is just + a call to translate_and_draw_front (after a can_draw() check). + In double-buffering mode (drawing to GL_BACK), this queues up + a redraw and returns false, since you shouldn't draw yet. + */ + void redraw(void); + + /** Redraw everybody in our window. */ + void redraw_window(void); + + virtual void align( void ); + void pack( int x, int y ); /* Recalculate positions and offsets */ + void pack_old( int x, int y ); + void draw_recursive( int x, int y ); + int set_to_glut_window( void ); + void restore_window( int orig ); + void translate_and_draw_front( void ); + void translate_to_origin( void ) + {glTranslatef((float)x_abs+.5f,(float)y_abs+.5f,0.0f);} + virtual void draw( int x, int y )=0; + void set_font( void *new_font ); + void *get_font( void ); + int string_width( const char *text ); + int string_width( const GLUI_String &str ) + { return string_width(str.c_str()); } + int char_width( char c ); + + void draw_name( int x, int y ); + void draw_box_inwards_outline( int x_min, int x_max, + int y_min, int y_max ); + void draw_box( int x_min, int x_max, int y_min, int y_max, + float r, float g, float b ); + void draw_bkgd_box( int x_min, int x_max, int y_min, int y_max ); + void draw_emboss_box( int x_min, int x_max,int y_min,int y_max); + void draw_string( const char *text ); + void draw_string( const GLUI_String &s ) + { draw_string(s.c_str()); } + void draw_char( char c ); + void draw_active_box( int x_min, int x_max, int y_min, int y_max ); + void set_to_bkgd_color( void ); + + void set_w( int new_w ); + void set_h( int new_w ); + void set_alignment( int new_align ); + void sync_live( int recurse, int draw ); /* Reads live variable */ + void init_live( void ); + void output_live( int update_main_gfx ); /** Writes live variable **/ + virtual void set_text( const char *t ) { (void)t; } + void execute_callback( void ); + void get_this_column_dims( int *col_x, int *col_y, + int *col_w, int *col_h, + int *col_x_off, int *col_y_off ); + virtual bool needs_idle( void ) const; + virtual bool wants_tabs() const { return false; } + + GLUI_Control(void) + { + x_off = GLUI_XOFF; + y_off_top = GLUI_YOFF; + y_off_bot = GLUI_YOFF; + x_abs = GLUI_XOFF; + y_abs = GLUI_YOFF; + active = false; + enabled = true; + int_val = 0; + last_live_int = 0; + float_array_size = 0; + glui_format_str(name, "Control: %p", this); + float_val = 0.0; + last_live_float = 0.0; + ptr_val = NULL; + glui = NULL; + w = GLUI_DEFAULT_CONTROL_WIDTH; + h = GLUI_DEFAULT_CONTROL_HEIGHT; + font = NULL; + active_type = GLUI_CONTROL_ACTIVE_MOUSEDOWN; + alignment = GLUI_ALIGN_LEFT; + is_container = false; + can_activate = true; /* By default, you can activate a control */ + spacebar_mouse_click = true; /* Does spacebar simulate a mouse click? */ + live_type = GLUI_LIVE_NONE; + text = ""; + last_live_text == ""; + live_inited = false; + collapsible = false; + is_open = true; + hidden = false; + memset(char_widths, -1, sizeof(char_widths)); /* JVK */ + int i; + for( i=0; iint_val = 1; set_color(red, green, blue); } } + void disable_bar() { if (column) { column->int_val = 0; } } + void set_child_number(int c) { child_number = c; } + void set_level_color(float r, float g, float b) { + lred = r; + lgreen = g; + lblue = b; + } + void set_color(float r, float g, float b) { + red = r; + green = g; + blue = b; + } + + virtual GLUI_Tree* dynamicCastGLUI_Tree() + { + return this; + } +protected: + void common_init() + { + currently_inside = false; + initially_inside = false; + can_activate = true; + is_container = true; + h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; + w = GLUI_DEFAULT_CONTROL_WIDTH; + y_off_top = 21; + collapsible = true; + red = .5; + green = .5; + blue = .5; + lred = 0; + lgreen = 0; + lblue = 0; + column = NULL; + is_current = 0; + child_number = 0; + format = 0; + panel = NULL; + name = ""; + level_name = ""; + level = 0; + + }; +}; + + +/************************************************************/ +/* */ +/* TreePanel class (container) JVK */ +/* */ +/************************************************************/ + +/** + Manages, maintains, and formats a tree of GLUI_Tree objects. + These are shown in a heirarchical, collapsible display. + + FIXME: There's an infinite loop in the traversal code (OSL 2006/06) +*/ +class GLUI_TreePanel : public GLUI_Panel +{ +public: + GLUI_TreePanel(GLUI_Node *parent, const char *name, + bool open=false, int inset=0); + + int max_levels; + int next_id; + int format; + float red; + float green; + float blue; + float lred; + float lgreen; + float lblue; + int root_children; + /* These variables allow the tree panel to traverse the tree + using only two function calls. (Well, four, if you count + going in reverse */ + + GLUI_Tree *curr_branch; /* Current Branch */ + GLUI_Panel *curr_root; /* Current Root */ + +public: + void set_color(float r, float g, float b); + void set_level_color(float r, float g, float b); + void set_format(int f) { format = f; } + + /* Adds branch to curr_root */ + GLUI_Tree * ab(const char *name, GLUI_Tree *root = NULL); + /* Goes up one level, resets curr_root and curr_branch to parents*/ + void fb(GLUI_Tree *branch= NULL); + /* Deletes the curr_branch, goes up one level using fb */ + void db(GLUI_Tree *branch = NULL); + /* Finds the very last branch of curr_root, resets vars */ + void descendBranch(GLUI_Panel *root = NULL); + /* Resets curr_root and curr branch to TreePanel and lastChild */ + void resetToRoot(GLUI_Panel *new_root = NULL); + void next( void ); + void refresh( void ); + void expand_all( void ); + void collapse_all( void ); + void update_all( void ); + void initNode(GLUI_Tree *temp); + void formatNode(GLUI_Tree *temp); + virtual GLUI_TreePanel* dynamicCastGLUI_TreePanel() + { + return this; + } + +protected: + int uniqueID( void ) { next_id++; return next_id - 1; } + void common_init() + { + GLUI_Panel(); + next_id = 0; + curr_root = this; + curr_branch = NULL; + red = .5; + green = .5; + blue = .5; + root_children = 0; + } +}; + +/************************************************************/ +/* */ +/* User-Level GLUI class */ +/* */ +/************************************************************/ + +class GLUI_Rotation; +class GLUI_Translation; + +/** + The main user-visible interface object to GLUI. + +*/ +class GLUI : public GLUI_Main +{ +public: +/** DEPRECATED interface for creating new GLUI objects */ + int add_control( GLUI_Control *control ) { return main_panel->add_control(control); } + + void add_column( int draw_bar = true ); + void add_column_to_panel( GLUI_Panel *panel, int draw_bar = true ); + + void add_separator( void ); + void add_separator_to_panel( GLUI_Panel *panel ); + + GLUI_RadioGroup + *add_radiogroup( int *live_var=NULL, + int user_id=-1,GLUI_CB callback=GLUI_CB()); + + GLUI_RadioGroup + *add_radiogroup_to_panel( GLUI_Panel *panel, + int *live_var=NULL, + int user_id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_RadioButton + *add_radiobutton_to_group( GLUI_RadioGroup *group, + const char *name ); + + GLUI_Listbox *add_listbox( const char *name, int *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Listbox *add_listbox_to_panel( GLUI_Panel *panel, + const char *name, int *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB()); + + GLUI_Rotation *add_rotation( const char *name, float *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Rotation *add_rotation_to_panel( GLUI_Panel *panel, + const char *name, float *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB()); + + GLUI_Translation *add_translation( const char *name, + int trans_type, float *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Translation *add_translation_to_panel( + GLUI_Panel *panel, const char *name, + int trans_type, float *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB()); + + GLUI_Checkbox *add_checkbox( const char *name, + int *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB()); + GLUI_Checkbox *add_checkbox_to_panel( GLUI_Panel *panel, const char *name, + int *live_var=NULL, int id=-1, + GLUI_CB callback=GLUI_CB()); + + GLUI_Button *add_button( const char *name, int id=-1, + GLUI_CB callback=GLUI_CB()); + GLUI_Button *add_button_to_panel( GLUI_Panel *panel, const char *name, + int id=-1, GLUI_CB callback=GLUI_CB() ); + + GLUI_StaticText *add_statictext( const char *name ); + GLUI_StaticText *add_statictext_to_panel( GLUI_Panel *panel, const char *name ); + + GLUI_EditText *add_edittext( const char *name, + int data_type=GLUI_EDITTEXT_TEXT, + void*live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_EditText *add_edittext_to_panel( GLUI_Panel *panel, + const char *name, + int data_type=GLUI_EDITTEXT_TEXT, + void *live_var=NULL, int id=-1, + GLUI_CB callback=GLUI_CB() ); + GLUI_EditText *add_edittext( const char *name, GLUI_String& live_var, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_EditText *add_edittext_to_panel( GLUI_Panel *panel, const char *name, + GLUI_String& live_var, int id=-1, + GLUI_CB callback=GLUI_CB() ); + + GLUI_Spinner *add_spinner( const char *name, + int data_type=GLUI_SPINNER_INT, + void *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Spinner *add_spinner_to_panel( GLUI_Panel *panel, + const char *name, + int data_type=GLUI_SPINNER_INT, + void *live_var=NULL, + int id=-1, + GLUI_CB callback=GLUI_CB() ); + + GLUI_Panel *add_panel( const char *name, int type=GLUI_PANEL_EMBOSSED ); + GLUI_Panel *add_panel_to_panel( GLUI_Panel *panel, const char *name, + int type=GLUI_PANEL_EMBOSSED ); + + + GLUI_Rollout *add_rollout( const char *name, int open=true, + int type=GLUI_PANEL_EMBOSSED); + GLUI_Rollout *add_rollout_to_panel( GLUI_Panel *panel, const char *name, + int open=true, + int type=GLUI_PANEL_EMBOSSED); + + +/** Set the window where our widgets should be displayed. */ + void set_main_gfx_window( int window_id ); + int get_glut_window_id( void ) { return glut_window_id; } + + void enable( void ) { main_panel->enable(); } + void disable( void ); + + void sync_live( void ); + + void close( void ); + + void show( void ); + void hide( void ); + + /***** GLUT callback setup functions *****/ + /* + void set_glutDisplayFunc(void (*f)(void)); + void set_glutReshapeFunc(void (*f)(int width, int height)); + void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); + void set_glutSpecialFunc(void (*f)(int key, int x, int y)); + void set_glutMouseFunc(void (*f)(int button, int state, int x, int y)); + void set_glutMotionFunc(void (*f)(int x, int y)); + void set_glutPassiveMotionFunc(void (*f)(int x, int y)); + void set_glutEntryFunc(void (*f)(int state)); + void set_glutVisibilityFunc(void (*f)(int state)); + void set_glutInit( int *argcp, const char **argv ); + void set_glutInitWindowSize(int width, int height); + void set_glutInitWindowPosition(int x, int y); + void set_glutInitDisplayMode(unsigned int mode); + int set_glutCreateWindow(const char *name); + */ + + /***** Constructors and desctructors *****/ + + int init( const char *name, long flags, int x, int y, int parent_window ); +protected: + virtual int add_control( GLUI_Node *parent, GLUI_Control *control ) { + return GLUI_Main::add_control( parent, control ); + } +}; + +/************************************************************/ +/* */ +/* EditText class */ +/* */ +/************************************************************/ + +class GLUI_EditText : public GLUI_Control +{ +public: + int has_limits; + int data_type; + GLUI_String orig_text; + int insertion_pt; + int title_x_offset; + int text_x_offset; + int substring_start; /*substring that gets displayed in box*/ + int substring_end; + int sel_start, sel_end; /* current selection */ + int num_periods; + int last_insertion_pt; + float float_low, float_high; + int int_low, int_high; + GLUI_Spinner *spinner; + int debug; + int draw_text_only; + + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key, int modifiers ); + + void activate( int how ); + void deactivate( void ); + + void draw( int x, int y ); + + int mouse_over( int state, int x, int y ); + + int find_word_break( int start, int direction ); + int substring_width( int start, int end ); + void clear_substring( int start, int end ); + int find_insertion_pt( int x, int y ); + int update_substring_bounds( void ); + void update_and_draw_text( void ); + void draw_text( int x, int y ); + void draw_insertion_pt( void ); + void set_numeric_text( void ); + void update_x_offsets( void ); + void update_size( void ); + + void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); + void set_int_limits( int low, int high, int limit_type=GLUI_LIMIT_CLAMP ); + void set_float_val( float new_val ); + void set_int_val( int new_val ); + void set_text( const char *text ); + void set_text( const GLUI_String &s) { set_text(s.c_str()); } + const char *get_text() { return text.c_str(); } + + void dump( FILE *out, const char *text ); + + // Constructor, no live variable + GLUI_EditText( GLUI_Node *parent, const char *name, + int text_type=GLUI_EDITTEXT_TEXT, + int id=-1, GLUI_CB callback=GLUI_CB() ); + // Constructor, int live variable + GLUI_EditText( GLUI_Node *parent, const char *name, + int *live_var, + int id=-1, GLUI_CB callback=GLUI_CB() ); + // Constructor, float live variable + GLUI_EditText( GLUI_Node *parent, const char *name, + float *live_var, + int id=-1, GLUI_CB callback=GLUI_CB() ); + // Constructor, char* live variable + GLUI_EditText( GLUI_Node *parent, const char *name, + char *live_var, + int id=-1, GLUI_CB callback=GLUI_CB() ); + // Constructor, std::string live variable + GLUI_EditText( GLUI_Node *parent, const char *name, + std::string &live_var, + int id=-1, GLUI_CB callback=GLUI_CB() ); + + // Deprecated constructor, only called internally + GLUI_EditText( GLUI_Node *parent, const char *name, + int text_type, void *live_var, + int id, GLUI_CB callback ); + // Deprecated constructor, only called internally + GLUI_EditText( void ) { common_init(); } + + virtual GLUI_EditText* dynamicCastGLUI_EditText() + { + return this; + } + + +protected: + void common_init( void ) { + h = GLUI_EDITTEXT_HEIGHT; + w = GLUI_EDITTEXT_WIDTH; + title_x_offset = 0; + text_x_offset = 55; + insertion_pt = -1; + last_insertion_pt = -1; + name = ""; + substring_start = 0; + data_type = GLUI_EDITTEXT_TEXT; + substring_end = 2; + num_periods = 0; + has_limits = GLUI_LIMIT_NONE; + sel_start = 0; + sel_end = 0; + active_type = GLUI_CONTROL_ACTIVE_PERMANENT; + can_activate = true; + spacebar_mouse_click = false; + spinner = NULL; + debug = false; + draw_text_only = false; + } + void common_construct( GLUI_Node *parent, const char *name, + int data_type, int live_type, void *live_var, + int id, GLUI_CB callback ); +}; + +/************************************************************/ +/* */ +/* CommandLine class */ +/* */ +/************************************************************/ + +class GLUI_CommandLine : public GLUI_EditText +{ +public: + typedef GLUI_EditText Super; + + enum { HIST_SIZE = 100 }; + std::vector hist_list; + int curr_hist; + int oldest_hist; + int newest_hist; + bool commit_flag; + +public: + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key,int modifiers ); + void deactivate( void ); + + virtual const char *get_history( int command_number ) const + { return hist_list[command_number - oldest_hist].c_str(); } + virtual GLUI_String& get_history_str( int command_number ) + { return hist_list[command_number - oldest_hist]; } + virtual const GLUI_String& get_history_str( int command_number ) const + { return hist_list[command_number - oldest_hist]; } + virtual void recall_history( int history_number ); + virtual void scroll_history( int direction ); + virtual void add_to_history( const char *text ); + virtual void reset_history( void ); + + void dump( FILE *out, const char *text ); + + + GLUI_CommandLine( GLUI_Node *parent, const char *name, void *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_CommandLine( void ) { common_init(); } +protected: + void common_init() { + hist_list.resize(HIST_SIZE); + curr_hist = 0; + oldest_hist = 0; + newest_hist = 0; + commit_flag = false; + } +}; + +/************************************************************/ +/* */ +/* RadioGroup class (container) */ +/* */ +/************************************************************/ + +class GLUI_RadioGroup : public GLUI_Control +{ +public: + int num_buttons; + + void draw( int x, int y ); + void set_name( const char *text ); + void set_int_val( int int_val ); + void set_selected( int int_val ); + + void draw_group( int translate ); + + GLUI_RadioGroup( GLUI_Node *parent, int *live_var=NULL, + int user_id=-1,GLUI_CB callback=GLUI_CB() ); + GLUI_RadioGroup( void ) { common_init(); } + +protected: + void common_init( void ) { + x_off = 0; + y_off_top = 0; + y_off_bot = 0; + is_container = true; + w = 300; + h = 300; + num_buttons = 0; + name = ""; + can_activate = false; + live_type = GLUI_LIVE_INT; + } +}; + +/************************************************************/ +/* */ +/* RadioButton class (container) */ +/* */ +/************************************************************/ + +class GLUI_RadioButton : public GLUI_Control +{ +public: + int orig_value; + bool currently_inside; + int text_x_offset; + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + + void draw( int x, int y ); + void update_size( void ); + + void draw_active_area( void ); + void draw_checked( void ); + void draw_unchecked( void ); + void draw_O( void ); + + GLUI_RadioButton( GLUI_RadioGroup *group, const char *name ); + GLUI_RadioGroup *group; + +protected: + void common_init() + { + glui_format_str( name, "RadioButton: %p", (void *) this ); + h = GLUI_RADIOBUTTON_SIZE; + group = NULL; + orig_value = -1; + text_x_offset = 18; + can_activate = true; + } +}; + + +/************************************************************/ +/* */ +/* Separator class (container) */ +/* */ +/************************************************************/ + +class GLUI_Separator : public GLUI_Control +{ +public: + void draw( int x, int y ); + + GLUI_Separator( GLUI_Node *parent ); + GLUI_Separator( void ) { common_init(); } + +protected: + void common_init() { + w = 100; + h = GLUI_SEPARATOR_HEIGHT; + can_activate = false; + } +}; + +#define GLUI_SPINNER_ARROW_WIDTH 12 +#define GLUI_SPINNER_ARROW_HEIGHT 8 +#define GLUI_SPINNER_ARROW_Y 2 + +#define GLUI_SPINNER_STATE_NONE 0 +#define GLUI_SPINNER_STATE_UP 1 +#define GLUI_SPINNER_STATE_DOWN 2 +#define GLUI_SPINNER_STATE_BOTH 3 + +#define GLUI_SPINNER_DEFAULT_GROWTH_EXP 1.05f + +/************************************************************/ +/* */ +/* Spinner class (container) */ +/* */ +/************************************************************/ + +class GLUI_Spinner : public GLUI_Control +{ +public: + // Constructor, no live var + GLUI_Spinner( GLUI_Node* parent, const char *name, + int data_type=GLUI_SPINNER_INT, int id=-1, GLUI_CB callback=GLUI_CB() ); + // Constructor, int live var + GLUI_Spinner( GLUI_Node* parent, const char *name, + int *live_var, int id=-1, GLUI_CB callback=GLUI_CB() ); + // Constructor, float live var + GLUI_Spinner( GLUI_Node* parent, const char *name, + float *live_var, int id=-1, GLUI_CB callback=GLUI_CB() ); + // Deprecated constructor + GLUI_Spinner( GLUI_Node* parent, const char *name, + int data_type, + void *live_var, + int id=-1, GLUI_CB callback=GLUI_CB() ); + // Deprecated constructor + GLUI_Spinner( void ) { common_init(); } + + bool currently_inside; + int state; + float growth, growth_exp; + int last_x, last_y; + int data_type; + int callback_count; + int last_int_val; + float last_float_val; + int first_callback; + float user_speed; + + GLUI_EditText *edittext; + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key,int modifiers ); + + void draw( int x, int y ); + void draw_pressed( void ); + void draw_unpressed( void ); + void draw_text( int sunken ); + + void update_size( void ); + + void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); + void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); + int find_arrow( int local_x, int local_y ); + void do_drag( int x, int y ); + void do_callbacks( void ); + void do_click( void ); + void idle( void ); + bool needs_idle( void ) const; + + const char *get_text( void ); + + void set_float_val( float new_val ); + void set_int_val( int new_val ); + float get_float_val( void ); + int get_int_val( void ); + void increase_growth( void ); + void reset_growth( void ); + + void set_speed( float speed ) { user_speed = speed; } + +protected: + void common_init() { + glui_format_str( name, "Spinner: %p", this ); + h = GLUI_EDITTEXT_HEIGHT; + w = GLUI_EDITTEXT_WIDTH; + x_off = 0; + y_off_top = 0; + y_off_bot = 0; + can_activate = true; + state = GLUI_SPINNER_STATE_NONE; + edittext = NULL; + growth_exp = GLUI_SPINNER_DEFAULT_GROWTH_EXP; + callback_count = 0; + first_callback = true; + user_speed = 1.0; + } + void common_construct( GLUI_Node* parent, const char *name, + int data_type, void *live_var, + int id, GLUI_CB callback ); +}; + +/************************************************************/ +/* */ +/* StaticText class */ +/* */ +/************************************************************/ + +class GLUI_StaticText : public GLUI_Control +{ +public: + void set_text( const char *text ); + void draw( int x, int y ); + void draw_text( void ); + void update_size( void ); + void erase_text( void ); + + GLUI_StaticText(GLUI_Node *parent, const char *name); + GLUI_StaticText( void ) { common_init(); } + +protected: + void common_init() { + h = GLUI_STATICTEXT_SIZE; + name = ""; + can_activate = false; + } +}; + +/************************************************************/ +/* */ +/* TextBox class - JVK */ +/* */ +/************************************************************/ + +class GLUI_TextBox : public GLUI_Control +{ +public: + /* GLUI Textbox - JVK */ + GLUI_TextBox(GLUI_Node *parent, GLUI_String &live_var, + bool scroll = false, int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_TextBox( GLUI_Node *parent, + bool scroll = false, int id=-1, + GLUI_CB callback=GLUI_CB() ); + + GLUI_String orig_text; + int insertion_pt; + int substring_start; /*substring that gets displayed in box*/ + int substring_end; + int sel_start, sel_end; /* current selection */ + int last_insertion_pt; + int debug; + int draw_text_only; + int tab_width; + int start_line; + int num_lines; + int curr_line; + int visible_lines; + int insert_x; /* Similar to "insertion_pt", these variables keep */ + int insert_y; /* track of where the ptr is, but in pixels */ + int keygoal_x; /* where up down keys would like to put insertion pt*/ + GLUI_Scrollbar *scrollbar; + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key,int modifiers ); + + void activate( int how ); + void deactivate( void ); + + void enable( void ); + void disable( void ); + + void draw( int x, int y ); + + int mouse_over( int state, int x, int y ); + + int get_box_width(); + int find_word_break( int start, int direction ); + int substring_width( int start, int end, int initial_width=0 ); + void clear_substring( int start, int end ); + int find_insertion_pt( int x, int y ); + int update_substring_bounds( void ); + void update_and_draw_text( void ); + void draw_text( int x, int y ); + void draw_insertion_pt( void ); + void update_x_offsets( void ); + void update_size( void ); + + void set_text( const char *text ); + const char *get_text( void ) { return text.c_str(); } + + void dump( FILE *out, char *text ); + void set_tab_w(int w) { tab_width = w; } + void set_start_line(int l) { start_line = l; } + static void scrollbar_callback(GLUI_Control*); + + bool wants_tabs( void ) const { return true; } + +protected: + void common_init() + { + h = GLUI_TEXTBOX_HEIGHT; + w = GLUI_TEXTBOX_WIDTH; + tab_width = GLUI_TAB_WIDTH; + num_lines = 0; + visible_lines = 0; + start_line = 0; + curr_line = 0; + insert_y = -1; + insert_x = -1; + insertion_pt = -1; + last_insertion_pt = -1; + name[0] = '\0'; + substring_start = 0; + substring_end = 2; + sel_start = 0; + sel_end = 0; + active_type = GLUI_CONTROL_ACTIVE_PERMANENT; + can_activate = true; + spacebar_mouse_click = false; + scrollbar = NULL; + debug = false; + draw_text_only = false; + } + void common_construct( + GLUI_Node *parent, GLUI_String *live_var, + bool scroll, int id, GLUI_CB callback); +}; + +/************************************************************/ +/* */ +/* List class - JVK */ +/* */ +/************************************************************/ + +class GLUI_List_Item : public GLUI_Node +{ +public: + GLUI_String text; + int id; +}; + +/************************************************************/ +/* */ +/* List class - JVK */ +/* */ +/************************************************************/ + +class GLUI_List : public GLUI_Control +{ +public: + /* GLUI List - JVK */ + GLUI_List( GLUI_Node *parent, bool scroll = false, + int id=-1, GLUI_CB callback=GLUI_CB() ); + /*, GLUI_Control *object = NULL + ,GLUI_InterObject_CB obj_cb = NULL);*/ + + GLUI_List( GLUI_Node *parent, + GLUI_String& live_var, bool scroll = false, + int id=-1, + GLUI_CB callback=GLUI_CB() + /*,GLUI_Control *object = NULL */ + /*,GLUI_InterObject_CB obj_cb = NULL*/); + + + GLUI_String orig_text; + int debug; + int draw_text_only; + int start_line; + int num_lines; + int curr_line; + int visible_lines; + GLUI_Scrollbar *scrollbar; + GLUI_List_Item items_list; + GLUI_Control *associated_object; + GLUI_CB obj_cb; + int cb_click_type; + int last_line; + int last_click_time; + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key,int modifiers ); + + void activate( int how ); + void deactivate( void ); + + void draw( int x, int y ); + + int mouse_over( int state, int x, int y ); + + int get_box_width(); + int find_word_break( int start, int direction ); + int substring_width( const char *t, int start, int end ); + int find_line( int x, int y ); + void update_and_draw_text( void ); + void draw_text( const char *t, int selected, int x, int y ); + void update_size( void ); + + + int add_item( int id, const char *text ); + int delete_item( const char *text ); + int delete_item( int id ); + int delete_all(); + + GLUI_List_Item *get_item_ptr( const char *text ); + GLUI_List_Item *get_item_ptr( int id ); + + void dump( FILE *out, const char *text ); + void set_start_line(int l) { start_line = l; } + static void scrollbar_callback(GLUI_Control*); + int get_current_item() { return curr_line; } + void set_click_type(int d) { + cb_click_type = d; } + void set_object_callback(GLUI_CB cb=GLUI_CB(), GLUI_Control*obj=NULL) + { obj_cb=cb; associated_object=obj; } + + virtual GLUI_List* dynamicCastGLUI_List() + { + return this; + } + +protected: + void common_init() + { + h = GLUI_LIST_HEIGHT; + w = GLUI_LIST_WIDTH; + num_lines = 0; + visible_lines = 0; + start_line = 0; + curr_line = 0; + name[0] = '\0'; + active_type = GLUI_CONTROL_ACTIVE_PERMANENT; + can_activate = true; + spacebar_mouse_click = false; + scrollbar = NULL; + debug = false; + draw_text_only = false; + cb_click_type = GLUI_SINGLE_CLICK; + last_line = -1; + last_click_time = 0; + associated_object = NULL; + }; + void common_construct( + GLUI_Node *parent, + GLUI_String* live_var, bool scroll, + int id, + GLUI_CB callback + /*,GLUI_Control *object*/ + /*,GLUI_InterObject_CB obj_cb*/); +}; + +/************************************************************/ +/* */ +/* Scrollbar class - JVK */ +/* */ +/************************************************************/ + +class GLUI_Scrollbar : public GLUI_Control +{ +public: + // Constructor, no live var + GLUI_Scrollbar( GLUI_Node *parent, + const char *name, + int horz_vert=GLUI_SCROLL_HORIZONTAL, + int data_type=GLUI_SCROLL_INT, + int id=-1, GLUI_CB callback=GLUI_CB() + /*,GLUI_Control *object = NULL*/ + /*,GLUI_InterObject_CB obj_cb = NULL*/ + ); + + // Constructor, int live var + GLUI_Scrollbar( GLUI_Node *parent, const char *name, int horz_vert, + int *live_var, + int id=-1, GLUI_CB callback=GLUI_CB() + /*,GLUI_Control *object = NULL*/ + /*,GLUI_InterObject_CB obj_cb = NULL*/ + ); + + // Constructor, float live var + GLUI_Scrollbar( GLUI_Node *parent, const char *name, int horz_vert, + float *live_var, + int id=-1, GLUI_CB callback=GLUI_CB() + /*,GLUI_Control *object = NULL*/ + /*,GLUI_InterObject_CB obj_cb = NULL*/ + ); + + bool currently_inside; + int state; + float growth, growth_exp; + int last_x, last_y; + int data_type; + int callback_count; + int last_int_val; ///< Used to prevent repeated callbacks. + float last_float_val; + int first_callback; + float user_speed; + float float_min, float_max; + int int_min, int_max; + int horizontal; + double last_update_time; ///< GLUI_Time() we last advanced scrollbar. + double velocity_limit; ///< Maximum distance to advance per second. + int box_length; + int box_start_position; + int box_end_position; + int track_length; + + + /* Rather than directly access an Editbox or Textbox for + changing variables, a pointer to some object is defined + along with a static callback in the form func(void *, int) - + the int is the new value, the void * must be cast to that + particular object type before use. + */ + void * associated_object; /* Lets the Spinner manage it's own callbacks */ + GLUI_CB object_cb; /* function pointer to object call_back */ + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key,int modifiers ); + + void draw( int x, int y ); + void draw_pressed( void ); + void draw_unpressed( void ); + void draw_text( int sunken ); + + void update_size( void ); + + void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); + void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); + int find_arrow( int local_x, int local_y ); + void do_drag( int x, int y ); + void do_callbacks( void ); + void draw_scroll( void ); + void do_click( void ); + void idle( void ); + bool needs_idle( void ) const; + void set_int_val( int new_val ); + void set_float_val( float new_val ); + void increase_growth( void ); + void reset_growth( void ); + + void set_speed( float speed ) { user_speed = speed; }; + void update_scroll_parameters(); + void set_object_callback(GLUI_CB cb=GLUI_CB(), GLUI_Control*obj=NULL) + { object_cb=cb; associated_object=obj; } + + virtual GLUI_Scrollbar* dynamicCastGLUI_Scrollbar() + { + return this; + } + +protected: + void common_init ( void ); + void common_construct( + GLUI_Node *parent, + const char *name, + int horz_vert, + int data_type, void* live_var, + int id, GLUI_CB callback + /*,GLUI_Control *object + ,GLUI_InterObject_CB obj_cb*/ + ); + + virtual void draw_scroll_arrow(int arrowtype, int x, int y); + virtual void draw_scroll_box(int x, int y, int w, int h); +}; + +/************************************************************/ +/* */ +/* Listbox class */ +/* */ +/************************************************************/ + +class GLUI_Listbox_Item : public GLUI_Node +{ +public: + GLUI_String text; + int id; +}; + +class GLUI_Listbox : public GLUI_Control +{ +public: + GLUI_String curr_text; + GLUI_Listbox_Item items_list; + int depressed; + + int orig_value; + bool currently_inside; + int text_x_offset, title_x_offset; + int glut_menu_id; + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int key_handler( unsigned char key,int modifiers ); + int special_handler( int key,int modifiers ); + + void update_size( void ); + void draw( int x, int y ); + int mouse_over( int state, int x, int y ); + + void set_int_val( int new_val ); + void dump( FILE *output ); + + int add_item( int id, const char *text ); + int delete_item( const char *text ); + int delete_item( int id ); + int sort_items( void ); + + int do_selection( int item ); + + GLUI_Listbox_Item *get_item_ptr( const char *text ); + GLUI_Listbox_Item *get_item_ptr( int id ); + + + GLUI_Listbox( GLUI_Node *parent, + const char *name, int *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Listbox( void ) { common_init(); } + + virtual GLUI_Listbox* dynamicCastGLUI_Listbox() + { + return this; + } + +protected: + /** Change w and return true if we need to be widened to fit the current item. */ + bool recalculate_item_width( void ); + void common_init() { + glui_format_str( name, "Listbox: %p", this ); + w = GLUI_EDITTEXT_WIDTH; + h = GLUI_EDITTEXT_HEIGHT; + orig_value = -1; + title_x_offset = 0; + text_x_offset = 55; + can_activate = true; + curr_text = ""; + live_type = GLUI_LIVE_INT; /* This has an integer live var */ + depressed = false; + glut_menu_id = -1; + } + + ~GLUI_Listbox(); +}; + +/************************************************************/ +/* */ +/* Mouse_Interaction class */ +/* */ +/************************************************************/ + +/** + This is the superclass of translation and rotation widgets. +*/ +class GLUI_Mouse_Interaction : public GLUI_Control +{ +public: + /*int get_main_area_size( void ) { return MIN( h-18, */ + int draw_active_area_only; + + int mouse_down_handler( int local_x, int local_y ); + int mouse_up_handler( int local_x, int local_y, bool inside ); + int mouse_held_down_handler( int local_x, int local_y, bool inside ); + int special_handler( int key, int modifiers ); + void update_size( void ); + void draw( int x, int y ); + void draw_active_area( void ); + + /*** The following methods (starting with "iaction_") need to + be overloaded ***/ + virtual int iaction_mouse_down_handler( int local_x, int local_y ) = 0; + virtual int iaction_mouse_up_handler( int local_x, int local_y, bool inside )=0; + virtual int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside )=0; + virtual int iaction_special_handler( int key, int modifiers )=0; + virtual void iaction_draw_active_area_persp( void )=0; + virtual void iaction_draw_active_area_ortho( void )=0; + virtual void iaction_dump( FILE *output )=0; + virtual void iaction_init( void ) = 0; + + GLUI_Mouse_Interaction( void ) { + glui_format_str( name, "Mouse_Interaction: %p", this ); + w = GLUI_MOUSE_INTERACTION_WIDTH; + h = GLUI_MOUSE_INTERACTION_HEIGHT; + can_activate = true; + live_type = GLUI_LIVE_NONE; + alignment = GLUI_ALIGN_CENTER; + draw_active_area_only = false; + } +}; + +/************************************************************/ +/* */ +/* Rotation class */ +/* */ +/************************************************************/ + +/** + An onscreen rotation controller--allows the user to interact with + a 3D rotation via a spaceball-like interface. +*/ +class GLUI_Rotation : public GLUI_Mouse_Interaction +{ +public: + Arcball *ball; + GLUquadricObj *quadObj; + bool can_spin, spinning; + float damping; + + int iaction_mouse_down_handler( int local_x, int local_y ); + int iaction_mouse_up_handler( int local_x, int local_y, bool inside ); + int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside ); + int iaction_special_handler( int key, int modifiers ); + void iaction_init( void ) { init_ball(); } + void iaction_draw_active_area_persp( void ); + void iaction_draw_active_area_ortho( void ); + void iaction_dump( FILE *output ); + + /* void update_size( void ); */ + /* void draw( int x, int y ); */ + /* int mouse_over( int state, int x, int y ); */ + + void setup_texture( void ); + void setup_lights( void ); + void draw_ball( float radius ); + + void init_ball( void ); + + void reset( void ); + + bool needs_idle( void ) const; + void idle( void ); + + void copy_float_array_to_ball( void ); + void copy_ball_to_float_array( void ); + + void set_spin( float damp_factor ); + + GLUI_Rotation( GLUI_Node *parent, const char *name, float *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Rotation(void) { common_init(); } + +protected: + void common_init(); +}; + +/************************************************************/ +/* */ +/* Translation class */ +/* */ +/************************************************************/ + +/** + An onscreen translation controller--allows the user to interact with + a 3D translation. +*/ +class GLUI_Translation : public GLUI_Mouse_Interaction +{ +public: + int trans_type; /* Is this an XY or a Z controller? */ + int down_x, down_y; + float scale_factor; + GLUquadricObj *quadObj; + int trans_mouse_code; + float orig_x, orig_y, orig_z; + int locked; + + int iaction_mouse_down_handler( int local_x, int local_y ); + int iaction_mouse_up_handler( int local_x, int local_y, bool inside ); + int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside ); + int iaction_special_handler( int key, int modifiers ); + void iaction_init( void ) { } + void iaction_draw_active_area_persp( void ); + void iaction_draw_active_area_ortho( void ); + void iaction_dump( FILE *output ); + + void set_speed( float s ) { scale_factor = s; } + + void setup_texture( void ); + void setup_lights( void ); + void draw_2d_arrow( int radius, int filled, int orientation ); + void draw_2d_x_arrows( int radius ); + void draw_2d_y_arrows( int radius ); + void draw_2d_z_arrows( int radius ); + void draw_2d_xy_arrows( int radius ); + + int get_mouse_code( int x, int y ); + + /* Float array is either a single float (for single-axis controls), + or two floats for X and Y (if an XY controller) */ + + float get_z( void ) { return float_array_val[0]; } + float get_x( void ) { return float_array_val[0]; } + float get_y( void ) { + if ( trans_type == GLUI_TRANSLATION_XY ) return float_array_val[1]; + else return float_array_val[0]; + } + + void set_z( float val ); + void set_x( float val ); + void set_y( float val ); + void set_one_val( float val, int index ); + + GLUI_Translation( GLUI_Node *parent, const char *name, + int trans_type, float *live_var=NULL, + int id=-1, GLUI_CB callback=GLUI_CB() ); + GLUI_Translation( void ) { common_init(); } + +protected: + void common_init() { + locked = GLUI_TRANSLATION_LOCK_NONE; + glui_format_str( name, "Translation: %p", this ); + w = GLUI_MOUSE_INTERACTION_WIDTH; + h = GLUI_MOUSE_INTERACTION_HEIGHT; + can_activate = true; + live_type = GLUI_LIVE_FLOAT_ARRAY; + float_array_size = 0; + alignment = GLUI_ALIGN_CENTER; + trans_type = GLUI_TRANSLATION_XY; + scale_factor = 1.0; + quadObj = NULL; + trans_mouse_code = GLUI_TRANSLATION_MOUSE_NONE; + } +}; + +/********** Misc functions *********************/ +int _glutBitmapWidthString( void *font, const char *s ); +void _glutBitmapString( void *font, const char *s ); + +/********** Our own callbacks for glut *********/ +/* These are the callbacks that we pass to glut. They take + some action if necessary, then (possibly) call the user-level + glut callbacks. +*/ + +void glui_display_func( void ); +void glui_reshape_func( int w, int h ); +void glui_keyboard_func(unsigned char key, int x, int y); +void glui_special_func(int key, int x, int y); +void glui_mouse_func(int button, int state, int x, int y); +void glui_motion_func(int x, int y); +void glui_passive_motion_func(int x, int y); +void glui_entry_func(int state); +void glui_visibility_func(int state); +void glui_idle_func(void); + +void glui_parent_window_reshape_func( int w, int h ); +void glui_parent_window_keyboard_func(unsigned char key, int x, int y); +void glui_parent_window_mouse_func(int, int, int, int ); +void glui_parent_window_special_func(int key, int x, int y); + +#endif diff --git a/Extras/glui/algebra3.cpp b/Extras/glui/algebra3.cpp index ddc18f4f8..5101480e5 100644 --- a/Extras/glui/algebra3.cpp +++ b/Extras/glui/algebra3.cpp @@ -1,1609 +1,1609 @@ -/* - - algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -/************************************************************************** - - There are three vector classes and two matrix classes: vec2, vec3, - vec4, mat3, and mat4. - - All the standard arithmetic operations are defined, with '*' - for dot product of two vectors and multiplication of two matrices, - and '^' for cross product of two vectors. - - Additional functions include length(), normalize(), homogenize for - vectors, and print(), set(), apply() for all classes. - - There is a function transpose() for matrices, but note that it - does not actually change the matrix, - - When multiplied with a matrix, a vector is treated as a row vector - if it precedes the matrix (v*M), and as a column vector if it - follows the matrix (M*v). - - Matrices are stored in row-major form. - - A vector of one dimension (2d, 3d, or 4d) can be cast to a vector - of a higher or lower dimension. If casting to a higher dimension, - the new component is set by default to 1.0, unless a value is - specified: - vec3 a(1.0, 2.0, 3.0 ); - vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0}; - When casting to a lower dimension, the vector is homogenized in - the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the - resulting vector is {X/W, Y/W, Z/W}. It is up to the user to - insure the fourth component is not zero before casting. - - There are also the following function for building matrices: - identity2D(), translation2D(), rotation2D(), - scaling2D(), identity3D(), translation3D(), - rotation3D(), rotation3Drad(), scaling3D(), - perspective3D() - - - --------------------------------------------------------------------- - - Author: Jean-Francois DOUEg - Revised: Paul Rademacher - Version 3.2 - Feb 1998 - Revised: Nigel Stewart (GLUI Code Cleaning) - -**************************************************************************/ - -#include "algebra3.h" -#include "glui_internal.h" -#include - -#ifdef VEC_ERROR_FATAL -#ifndef VEC_ERROR -#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); exit(1); } -#endif -#else -#ifndef VEC_ERROR -#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); } -#endif -#endif - -/**************************************************************** - * * - * vec2 Member functions * - * * - ****************************************************************/ - -/******************** vec2 CONSTRUCTORS ********************/ - -vec2::vec2() -{ - n[VX] = n[VY] = 0.0; -} - -vec2::vec2(float x, float y) -{ - n[VX] = x; - n[VY] = y; -} - -vec2::vec2(const vec2 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; -} - -vec2::vec2(const vec3 &v) // it is up to caller to avoid divide-by-zero -{ - n[VX] = v.n[VX]/v.n[VZ]; - n[VY] = v.n[VY]/v.n[VZ]; -} - -vec2::vec2(const vec3 &v, int dropAxis) -{ - switch (dropAxis) - { - case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; break; - case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; break; - default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; break; - } -} - -/******************** vec2 ASSIGNMENT OPERATORS ******************/ - -vec2 & vec2::operator=(const vec2 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - return *this; -} - -vec2 & vec2::operator+=(const vec2 &v) -{ - n[VX] += v.n[VX]; - n[VY] += v.n[VY]; - return *this; -} - -vec2 & vec2::operator-=(const vec2 &v) -{ - n[VX] -= v.n[VX]; - n[VY] -= v.n[VY]; - return *this; -} - -vec2 &vec2::operator*=(float d) -{ - n[VX] *= d; - n[VY] *= d; - return *this; -} - -vec2 &vec2::operator/=(float d) -{ - float d_inv = 1.0f/d; - n[VX] *= d_inv; - n[VY] *= d_inv; - return *this; -} - -float &vec2::operator[](int i) -{ - if (i < VX || i > VY) - //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec2 [] operator: illegal access" ); - return n[i]; -} - -const float &vec2::operator[](int i) const -{ - if (i < VX || i > VY) - //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec2 [] operator: illegal access" ); - - return n[i]; -} - -/******************** vec2 SPECIAL FUNCTIONS ********************/ - -float vec2::length() const -{ - return (float) sqrt(length2()); -} - -float vec2::length2() const -{ - return n[VX]*n[VX] + n[VY]*n[VY]; -} - -vec2 &vec2::normalize() // it is up to caller to avoid divide-by-zero -{ - *this /= length(); - return *this; -} - -vec2 &vec2::apply(V_FCT_PTR fct) -{ - n[VX] = (*fct)(n[VX]); - n[VY] = (*fct)(n[VY]); - return *this; -} - -void vec2::set( float x, float y ) -{ - n[VX] = x; n[VY] = y; -} - -/******************** vec2 FRIENDS *****************************/ - -vec2 operator-(const vec2 &a) -{ - return vec2(-a.n[VX],-a.n[VY]); -} - -vec2 operator+(const vec2 &a, const vec2& b) -{ - return vec2(a.n[VX]+b.n[VX], a.n[VY]+b.n[VY]); -} - -vec2 operator-(const vec2 &a, const vec2& b) -{ - return vec2(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY]); -} - -vec2 operator*(const vec2 &a, float d) -{ - return vec2(d*a.n[VX], d*a.n[VY]); -} - -vec2 operator*(float d, const vec2 &a) -{ - return a*d; -} - -vec2 operator*(const mat3 &a, const vec2 &v) -{ - vec3 av; - - av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]; - av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]; - av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]; - - return av; -} - -vec2 operator*(const vec2 &v, const mat3 &a) -{ - return a.transpose() * v; -} - -vec3 operator*(const mat3 &a, const vec3 &v) -{ - vec3 av; - - av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]*v.n[VZ]; - av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]*v.n[VZ]; - av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]*v.n[VZ]; - - return av; -} - -vec3 operator*(const vec3 &v, const mat3 &a) -{ - return a.transpose() * v; -} - -float operator*(const vec2 &a, const vec2 &b) -{ - return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY]; -} - -vec2 operator/(const vec2 &a, float d) -{ - float d_inv = 1.0f/d; - return vec2(a.n[VX]*d_inv, a.n[VY]*d_inv); -} - -vec3 operator^(const vec2 &a, const vec2 &b) -{ - return vec3(0.0, 0.0, a.n[VX] * b.n[VY] - b.n[VX] * a.n[VY]); -} - -int operator==(const vec2 &a, const vec2 &b) -{ - return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]); -} - -int operator!=(const vec2 &a, const vec2 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, vec2& v) -{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << " |"; } -*/ - -/*istream& operator >> (istream& s, vec2& v) { - vec2 v_tmp; - char c = ' '; - - while (isspace(c)) - s >> c; - // The vectors can be formatted either as x y or | x y | - if (c == '|') { - s >> v_tmp[VX] >> v_tmp[VY]; - while (s >> c && isspace(c)) ; - if (c != '|') - ;//s.set(_bad); - } - else { - s.putback(c); - s >> v_tmp[VX] >> v_tmp[VY]; - } - if (s) - v = v_tmp; - return s; -} -*/ - -void swap(vec2 &a, vec2 &b) -{ - vec2 tmp(a); - a = b; - b = tmp; -} - -vec2 min_vec(const vec2 &a, const vec2 &b) -{ - return vec2(MIN(a.n[VX], b.n[VX]), MIN(a.n[VY], b.n[VY])); -} - -vec2 max_vec(const vec2 &a, const vec2 &b) -{ - return vec2(MAX(a.n[VX], b.n[VX]), MAX(a.n[VY], b.n[VY])); -} - -vec2 prod(const vec2 &a, const vec2 &b) -{ - return vec2(a.n[VX] * b.n[VX], a.n[VY] * b.n[VY]); -} - -/**************************************************************** - * * - * vec3 Member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -vec3::vec3() -{ - n[VX] = n[VY] = n[VZ] = 0.0; -} - -vec3::vec3(float x, float y, float z) -{ - n[VX] = x; - n[VY] = y; - n[VZ] = z; -} - -vec3::vec3(const vec3 &v) -{ - n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; -} - -vec3::vec3(const vec2 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = 1.0; -} - -vec3::vec3(const vec2 &v, float d) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = d; -} - -vec3::vec3(const vec4 &v) // it is up to caller to avoid divide-by-zero -{ - n[VX] = v.n[VX] / v.n[VW]; - n[VY] = v.n[VY] / v.n[VW]; - n[VZ] = v.n[VZ] / v.n[VW]; -} - -vec3::vec3(const vec4 &v, int dropAxis) -{ - switch (dropAxis) - { - case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break; - case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break; - case VZ: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VW]; break; - default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; break; - } -} - - -// ASSIGNMENT OPERATORS - -vec3 &vec3::operator=(const vec3 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - return *this; -} - -vec3 &vec3::operator+=(const vec3 &v) -{ - n[VX] += v.n[VX]; - n[VY] += v.n[VY]; - n[VZ] += v.n[VZ]; - return *this; -} - -vec3 &vec3::operator-=(const vec3& v) -{ - n[VX] -= v.n[VX]; - n[VY] -= v.n[VY]; - n[VZ] -= v.n[VZ]; - return *this; -} - -vec3 &vec3::operator*=(float d) -{ - n[VX] *= d; - n[VY] *= d; - n[VZ] *= d; - return *this; -} - -vec3 &vec3::operator/=(float d) -{ - float d_inv = 1.0f/d; - n[VX] *= d_inv; - n[VY] *= d_inv; - n[VZ] *= d_inv; - return *this; -} - -float &vec3::operator[](int i) -{ - if (i < VX || i > VZ) - //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec3 [] operator: illegal access" ); - - return n[i]; -} - -const float &vec3::operator[](int i) const -{ - if (i < VX || i > VZ) - //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec3 [] operator: illegal access" ); - - return n[i]; -} - -// SPECIAL FUNCTIONS - -float vec3::length() const -{ - return (float) sqrt(length2()); -} - -float vec3::length2() const -{ - return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ]; -} - -vec3 &vec3::normalize() // it is up to caller to avoid divide-by-zero -{ - *this /= length(); - return *this; -} - -vec3 &vec3::homogenize(void) // it is up to caller to avoid divide-by-zero -{ - n[VX] /= n[VZ]; - n[VY] /= n[VZ]; - n[VZ] = 1.0; - return *this; -} - -vec3 &vec3::apply(V_FCT_PTR fct) -{ - n[VX] = (*fct)(n[VX]); - n[VY] = (*fct)(n[VY]); - n[VZ] = (*fct)(n[VZ]); - return *this; -} - -void vec3::set(float x, float y, float z) // set vector -{ - n[VX] = x; - n[VY] = y; - n[VZ] = z; -} - -void vec3::print(FILE *file, const char *name) const // print vector to a file -{ - fprintf( file, "%s: <%f, %f, %f>\n", name, n[VX], n[VY], n[VZ] ); -} - -// FRIENDS - -vec3 operator-(const vec3 &a) -{ - return vec3(-a.n[VX],-a.n[VY],-a.n[VZ]); -} - -vec3 operator+(const vec3 &a, const vec3 &b) -{ - return vec3(a.n[VX]+ b.n[VX], a.n[VY] + b.n[VY], a.n[VZ] + b.n[VZ]); -} - -vec3 operator-(const vec3 &a, const vec3 &b) -{ - return vec3(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY], a.n[VZ]-b.n[VZ]); -} - -vec3 operator*(const vec3 &a, float d) -{ - return vec3(d*a.n[VX], d*a.n[VY], d*a.n[VZ]); -} - -vec3 operator*(float d, const vec3 &a) -{ - return a*d; -} - -vec3 operator*(const mat4 &a, const vec3 &v) -{ - return a*vec4(v); -} - -vec3 operator*(const vec3 &v, mat4 &a) -{ - return a.transpose()*v; -} - -float operator*(const vec3 &a, const vec3 &b) -{ - return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY] + a.n[VZ]*b.n[VZ]; -} - -vec3 operator/(const vec3 &a, float d) -{ - float d_inv = 1.0f/d; - return vec3(a.n[VX]*d_inv, a.n[VY]*d_inv, a.n[VZ]*d_inv); -} - -vec3 operator^(const vec3 &a, const vec3 &b) -{ - return - vec3(a.n[VY]*b.n[VZ] - a.n[VZ]*b.n[VY], - a.n[VZ]*b.n[VX] - a.n[VX]*b.n[VZ], - a.n[VX]*b.n[VY] - a.n[VY]*b.n[VX]); -} - -int operator==(const vec3 &a, const vec3 &b) -{ - return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]) && (a.n[VZ] == b.n[VZ]); -} - -int operator!=(const vec3 &a, const vec3 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, vec3& v) -{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << " |"; } - -istream& operator >> (istream& s, vec3& v) { - vec3 v_tmp; - char c = ' '; - - while (isspace(c)) - s >> c; - // The vectors can be formatted either as x y z or | x y z | - if (c == '|') { - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ]; - while (s >> c && isspace(c)) ; - if (c != '|') - ;//s.set(_bad); - } - else { - s.putback(c); - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ]; - } - if (s) - v = v_tmp; - return s; -} -*/ - -void swap(vec3 &a, vec3 &b) -{ - vec3 tmp(a); - a = b; - b = tmp; -} - -vec3 min_vec(const vec3 &a, const vec3 &b) -{ - return vec3( - MIN(a.n[VX], b.n[VX]), - MIN(a.n[VY], b.n[VY]), - MIN(a.n[VZ], b.n[VZ])); -} - -vec3 max_vec(const vec3 &a, const vec3 &b) -{ - return vec3( - MAX(a.n[VX], b.n[VX]), - MAX(a.n[VY], b.n[VY]), - MAX(a.n[VZ], b.n[VZ])); -} - -vec3 prod(const vec3 &a, const vec3 &b) -{ - return vec3(a.n[VX]*b.n[VX], a.n[VY]*b.n[VY], a.n[VZ]*b.n[VZ]); -} - -/**************************************************************** - * * - * vec4 Member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -vec4::vec4() -{ - n[VX] = n[VY] = n[VZ] = 0.0; - n[VW] = 1.0; -} - -vec4::vec4(float x, float y, float z, float w) -{ - n[VX] = x; - n[VY] = y; - n[VZ] = z; - n[VW] = w; -} - -vec4::vec4(const vec4 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = v.n[VW]; -} - -vec4::vec4(const vec3 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = 1.0; -} - -vec4::vec4(const vec3 &v, float d) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = d; -} - -// ASSIGNMENT OPERATORS - -vec4 &vec4::operator=(const vec4 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = v.n[VW]; - return *this; -} - -vec4 &vec4::operator+=(const vec4 &v) -{ - n[VX] += v.n[VX]; - n[VY] += v.n[VY]; - n[VZ] += v.n[VZ]; - n[VW] += v.n[VW]; - return *this; -} - -vec4 &vec4::operator-=(const vec4 &v) -{ - n[VX] -= v.n[VX]; - n[VY] -= v.n[VY]; - n[VZ] -= v.n[VZ]; - n[VW] -= v.n[VW]; - return *this; -} - -vec4 &vec4::operator*=(float d) -{ - n[VX] *= d; - n[VY] *= d; - n[VZ] *= d; - n[VW] *= d; - return *this; -} - -vec4 &vec4::operator/=(float d) -{ - float d_inv = 1.0f/d; - n[VX] *= d_inv; - n[VY] *= d_inv; - n[VZ] *= d_inv; - n[VW] *= d_inv; - return *this; -} - -float &vec4::operator[](int i) -{ - if (i < VX || i > VW) - //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec4 [] operator: illegal access" ); - - return n[i]; -} - -const float &vec4::operator[](int i) const -{ - if (i < VX || i > VW) - //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec4 [] operator: illegal access" ); - - return n[i]; -} - -// SPECIAL FUNCTIONS - -float vec4::length() const -{ - return (float) sqrt(length2()); -} - -float vec4::length2() const -{ - return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ] + n[VW]*n[VW]; -} - -vec4 &vec4::normalize() // it is up to caller to avoid divide-by-zero -{ - *this /= length(); - return *this; -} - -vec4 &vec4::homogenize() // it is up to caller to avoid divide-by-zero -{ - n[VX] /= n[VW]; - n[VY] /= n[VW]; - n[VZ] /= n[VW]; - n[VW] = 1.0; - return *this; -} - -vec4 &vec4::apply(V_FCT_PTR fct) -{ - n[VX] = (*fct)(n[VX]); - n[VY] = (*fct)(n[VY]); - n[VZ] = (*fct)(n[VZ]); - n[VW] = (*fct)(n[VW]); - return *this; -} - -void vec4::print(FILE *file, const char *name) const // print vector to a file -{ - fprintf( file, "%s: <%f, %f, %f, %f>\n", name, n[VX], n[VY], n[VZ], n[VW]); -} - -void vec4::set(float x, float y, float z, float a) -{ - n[0] = x; - n[1] = y; - n[2] = z; - n[3] = a; -} - - -// FRIENDS - -vec4 operator-(const vec4 &a) -{ - return vec4(-a.n[VX],-a.n[VY],-a.n[VZ],-a.n[VW]); -} - -vec4 operator+(const vec4 &a, const vec4 &b) -{ - return vec4( - a.n[VX] + b.n[VX], - a.n[VY] + b.n[VY], - a.n[VZ] + b.n[VZ], - a.n[VW] + b.n[VW]); -} - -vec4 operator-(const vec4 &a, const vec4 &b) -{ - return vec4( - a.n[VX] - b.n[VX], - a.n[VY] - b.n[VY], - a.n[VZ] - b.n[VZ], - a.n[VW] - b.n[VW]); -} - -vec4 operator*(const vec4 &a, float d) -{ - return vec4(d*a.n[VX], d*a.n[VY], d*a.n[VZ], d*a.n[VW]); -} - -vec4 operator*(float d, const vec4 &a) -{ - return a*d; -} - -vec4 operator*(const mat4 &a, const vec4 &v) -{ - #define ROWCOL(i) \ - a.v[i].n[0]*v.n[VX] + \ - a.v[i].n[1]*v.n[VY] + \ - a.v[i].n[2]*v.n[VZ] + \ - a.v[i].n[3]*v.n[VW] - - return vec4(ROWCOL(0), ROWCOL(1), ROWCOL(2), ROWCOL(3)); - - #undef ROWCOL -} - -vec4 operator*(const vec4 &v, const mat4 &a) -{ - return a.transpose()*v; -} - -float operator*(const vec4 &a, const vec4 &b) -{ - return - a.n[VX]*b.n[VX] + - a.n[VY]*b.n[VY] + - a.n[VZ]*b.n[VZ] + - a.n[VW]*b.n[VW]; -} - -vec4 operator/(const vec4 &a, float d) -{ - float d_inv = 1.0f/d; - return vec4( - a.n[VX]*d_inv, - a.n[VY]*d_inv, - a.n[VZ]*d_inv, - a.n[VW]*d_inv); -} - -int operator==(const vec4 &a, const vec4 &b) -{ - return - (a.n[VX] == b.n[VX]) && - (a.n[VY] == b.n[VY]) && - (a.n[VZ] == b.n[VZ]) && - (a.n[VW] == b.n[VW]); -} - -int operator!=(const vec4 &a, const vec4 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, vec4& v) -{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << ' ' - << v.n[VW] << " |"; } - -istream& operator >> (istream& s, vec4& v) { - vec4 v_tmp; - char c = ' '; - - while (isspace(c)) - s >> c; - // The vectors can be formatted either as x y z w or | x y z w | - if (c == '|') { - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW]; - while (s >> c && isspace(c)) ; - if (c != '|') - ;//s.set(_bad); - } - else { - s.putback(c); - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW]; - } - if (s) - v = v_tmp; - return s; -} -*/ - -void swap(vec4 &a, vec4 &b) -{ - vec4 tmp(a); - a = b; - b = tmp; -} - -vec4 min_vec(const vec4 &a, const vec4 &b) -{ - return vec4( - MIN(a.n[VX], b.n[VX]), - MIN(a.n[VY], b.n[VY]), - MIN(a.n[VZ], b.n[VZ]), - MIN(a.n[VW], b.n[VW])); -} - -vec4 max_vec(const vec4 &a, const vec4 &b) -{ - return vec4( - MAX(a.n[VX], b.n[VX]), - MAX(a.n[VY], b.n[VY]), - MAX(a.n[VZ], b.n[VZ]), - MAX(a.n[VW], b.n[VW])); -} - -vec4 prod(const vec4 &a, const vec4 &b) -{ - return vec4( - a.n[VX] * b.n[VX], - a.n[VY] * b.n[VY], - a.n[VZ] * b.n[VZ], - a.n[VW] * b.n[VW]); -} - -/**************************************************************** - * * - * mat3 member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -mat3::mat3() -{ - *this = identity2D(); -} - -mat3::mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2) -{ - set(v0, v1, v2); -} - -mat3::mat3(const mat3 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; -} - -// ASSIGNMENT OPERATORS - -mat3 &mat3::operator=(const mat3 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; - return *this; -} - -mat3 &mat3::operator+=(const mat3& m) -{ - v[0] += m.v[0]; - v[1] += m.v[1]; - v[2] += m.v[2]; - return *this; -} - -mat3 &mat3::operator-=(const mat3& m) -{ - v[0] -= m.v[0]; - v[1] -= m.v[1]; - v[2] -= m.v[2]; - return *this; -} - -mat3 &mat3::operator*=(float d) -{ - v[0] *= d; - v[1] *= d; - v[2] *= d; - return *this; -} - -mat3 &mat3::operator/=(float d) -{ - v[0] /= d; - v[1] /= d; - v[2] /= d; - return *this; -} - -vec3 &mat3::operator[](int i) -{ - if (i < VX || i > VZ) - //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat3 [] operator: illegal access" ); - - return v[i]; -} - -const vec3 &mat3::operator[](int i) const -{ - if (i < VX || i > VZ) - //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat3 [] operator: illegal access" ); - - return v[i]; -} - -void mat3::set(const vec3 &v0, const vec3 &v1, const vec3 &v2) -{ - v[0] = v0; - v[1] = v1; - v[2] = v2; -} - -// SPECIAL FUNCTIONS - -mat3 mat3::transpose() const -{ - return mat3( - vec3(v[0][0], v[1][0], v[2][0]), - vec3(v[0][1], v[1][1], v[2][1]), - vec3(v[0][2], v[1][2], v[2][2])); -} - -mat3 mat3::inverse() const // Gauss-Jordan elimination with partial pivoting -{ - mat3 a(*this); // As a evolves from original mat into identity - mat3 b(identity2D()); // b evolves from identity into inverse(a) - int i, j, i1; - - // Loop over cols of a from left to right, eliminating above and below diag - for (j=0; j<3; j++) // Find largest pivot in column j among rows j..2 - { - i1 = j; // Row with largest pivot candidate - for (i=j+1; i<3; i++) - if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j])) - i1 = i; - - // Swap rows i1 and j in a and b to put pivot on diagonal - swap(a.v[i1], a.v[j]); - swap(b.v[i1], b.v[j]); - - // Scale row j to have a unit diagonal - if (a.v[j].n[j]==0.) - VEC_ERROR("mat3::inverse: singular matrix; can't invert\n"); - - b.v[j] /= a.v[j].n[j]; - a.v[j] /= a.v[j].n[j]; - - // Eliminate off-diagonal elems in col j of a, doing identical ops to b - for (i=0; i<3; i++) - if (i!=j) - { - b.v[i] -= a.v[i].n[j]*b.v[j]; - a.v[i] -= a.v[i].n[j]*a.v[j]; - } - } - - return b; -} - -mat3 &mat3::apply(V_FCT_PTR fct) -{ - v[VX].apply(fct); - v[VY].apply(fct); - v[VZ].apply(fct); - return *this; -} - - -// FRIENDS - -mat3 operator-(const mat3 &a) -{ - return mat3(-a.v[0], -a.v[1], -a.v[2]); -} - -mat3 operator+(const mat3 &a, const mat3 &b) -{ - return mat3(a.v[0]+b.v[0], a.v[1]+b.v[1], a.v[2]+b.v[2]); -} - -mat3 operator-(const mat3 &a, const mat3 &b) -{ - return mat3(a.v[0]-b.v[0], a.v[1]-b.v[1], a.v[2]-b.v[2]); -} - -mat3 operator*(const mat3 &a, const mat3 &b) -{ - #define ROWCOL(i, j) \ - a.v[i].n[0]*b.v[0][j] + a.v[i].n[1]*b.v[1][j] + a.v[i].n[2]*b.v[2][j] - - return mat3( - vec3(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)), - vec3(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)), - vec3(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2))); - - #undef ROWCOL -} - -mat3 operator*(const mat3 &a, float d) -{ - return mat3(a.v[0]*d, a.v[1]*d, a.v[2]*d); -} - -mat3 operator*(float d, const mat3 &a) -{ - return a*d; -} - -mat3 operator/(const mat3 &a, float d) -{ - return mat3(a.v[0]/d, a.v[1]/d, a.v[2]/d); -} - -int operator==(const mat3 &a, const mat3 &b) -{ - return - (a.v[0] == b.v[0]) && - (a.v[1] == b.v[1]) && - (a.v[2] == b.v[2]); -} - -int operator!=(const mat3 &a, const mat3 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, mat3& m) -{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ]; } - -istream& operator >> (istream& s, mat3& m) { - mat3 m_tmp; - - s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ]; - if (s) - m = m_tmp; - return s; -} -*/ - -void swap(mat3 &a, mat3 &b) -{ - mat3 tmp(a); - a = b; - b = tmp; -} - -void mat3::print(FILE *file, const char *name) const -{ - int i, j; - - fprintf( stderr, "%s:\n", name ); - - for( i = 0; i < 3; i++ ) - { - fprintf( stderr, " " ); - for( j = 0; j < 3; j++ ) - { - fprintf( stderr, "%f ", v[i][j] ); - } - fprintf( stderr, "\n" ); - } -} - - - -/**************************************************************** - * * - * mat4 member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -mat4::mat4() -{ - *this = identity3D(); -} - -mat4::mat4(const vec4& v0, const vec4& v1, const vec4& v2, const vec4& v3) -{ - v[0] = v0; - v[1] = v1; - v[2] = v2; - v[3] = v3; -} - -mat4::mat4(const mat4 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; - v[3] = m.v[3]; -} - -mat4::mat4( - float a00, float a01, float a02, float a03, - float a10, float a11, float a12, float a13, - float a20, float a21, float a22, float a23, - float a30, float a31, float a32, float a33 ) -{ - v[0][0] = a00; v[0][1] = a01; v[0][2] = a02; v[0][3] = a03; - v[1][0] = a10; v[1][1] = a11; v[1][2] = a12; v[1][3] = a13; - v[2][0] = a20; v[2][1] = a21; v[2][2] = a22; v[2][3] = a23; - v[3][0] = a30; v[3][1] = a31; v[3][2] = a32; v[3][3] = a33; -} - -// ASSIGNMENT OPERATORS - -mat4 &mat4::operator=(const mat4 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; - v[3] = m.v[3]; - return *this; -} - -mat4 &mat4::operator+=(const mat4 &m) -{ - v[0] += m.v[0]; - v[1] += m.v[1]; - v[2] += m.v[2]; - v[3] += m.v[3]; - return *this; -} - -mat4 &mat4::operator-=(const mat4 &m) -{ - v[0] -= m.v[0]; - v[1] -= m.v[1]; - v[2] -= m.v[2]; - v[3] -= m.v[3]; - return *this; -} - -mat4 &mat4::operator*=(float d) -{ - v[0] *= d; - v[1] *= d; - v[2] *= d; - v[3] *= d; - return *this; -} - -mat4 &mat4::operator/=(float d) -{ - v[0] /= d; - v[1] /= d; - v[2] /= d; - v[3] /= d; - return *this; -} - -vec4 &mat4::operator[](int i) -{ - if (i < VX || i > VW) - //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat4 [] operator: illegal access" ); - return v[i]; -} - -const vec4 &mat4::operator[](int i) const -{ - if (i < VX || i > VW) - //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat4 [] operator: illegal access" ); - return v[i]; -} - -// SPECIAL FUNCTIONS; - -mat4 mat4::transpose() const -{ - return mat4( - vec4(v[0][0], v[1][0], v[2][0], v[3][0]), - vec4(v[0][1], v[1][1], v[2][1], v[3][1]), - vec4(v[0][2], v[1][2], v[2][2], v[3][2]), - vec4(v[0][3], v[1][3], v[2][3], v[3][3])); -} - -mat4 mat4::inverse() const // Gauss-Jordan elimination with partial pivoting -{ - mat4 a(*this); // As a evolves from original mat into identity - mat4 b(identity3D()); // b evolves from identity into inverse(a) - int i, j, i1; - - // Loop over cols of a from left to right, eliminating above and below diag - for (j=0; j<4; j++) // Find largest pivot in column j among rows j..3 - { - i1 = j; // Row with largest pivot candidate - for (i=j+1; i<4; i++) - if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j])) - i1 = i; - - // Swap rows i1 and j in a and b to put pivot on diagonal - swap(a.v[i1], a.v[j]); - swap(b.v[i1], b.v[j]); - - // Scale row j to have a unit diagonal - if (a.v[j].n[j]==0.) - VEC_ERROR("mat4::inverse: singular matrix; can't invert\n"); - - b.v[j] /= a.v[j].n[j]; - a.v[j] /= a.v[j].n[j]; - - // Eliminate off-diagonal elems in col j of a, doing identical ops to b - for (i=0; i<4; i++) - if (i!=j) - { - b.v[i] -= a.v[i].n[j]*b.v[j]; - a.v[i] -= a.v[i].n[j]*a.v[j]; - } - } - - return b; -} - -mat4 &mat4::apply(V_FCT_PTR fct) -{ - v[VX].apply(fct); - v[VY].apply(fct); - v[VZ].apply(fct); - v[VW].apply(fct); - return *this; -} - -void mat4::print(FILE *file, const char *name) const -{ - int i, j; - - fprintf( stderr, "%s:\n", name ); - - for( i = 0; i < 4; i++ ) - { - fprintf( stderr, " " ); - for( j = 0; j < 4; j++ ) - { - fprintf( stderr, "%f ", v[i][j] ); - } - fprintf( stderr, "\n" ); - } -} - -void mat4::swap_rows(int i, int j) -{ - vec4 t; - - t = v[i]; - v[i] = v[j]; - v[j] = t; -} - -void mat4::swap_cols(int i, int j) -{ - float t; - int k; - - for (k=0; k<4; k++) - { - t = v[k][i]; - v[k][i] = v[k][j]; - v[k][j] = t; - } -} - - -// FRIENDS - -mat4 operator-(const mat4 &a) -{ - return mat4(-a.v[0],-a.v[1],-a.v[2],-a.v[3]); -} - -mat4 operator+(const mat4 &a, const mat4 &b) -{ - return mat4( - a.v[0] + b.v[0], - a.v[1] + b.v[1], - a.v[2] + b.v[2], - a.v[3] + b.v[3]); -} - -mat4 operator-(const mat4 &a, const mat4 &b) -{ - return mat4( - a.v[0] - b.v[0], - a.v[1] - b.v[1], - a.v[2] - b.v[2], - a.v[3] - b.v[3]); -} - -mat4 operator*(const mat4 &a, const mat4 &b) -{ - #define ROWCOL(i, j) \ - a.v[i].n[0]*b.v[0][j] + \ - a.v[i].n[1]*b.v[1][j] + \ - a.v[i].n[2]*b.v[2][j] + \ - a.v[i].n[3]*b.v[3][j] - - return mat4( - vec4(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2), ROWCOL(0,3)), - vec4(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2), ROWCOL(1,3)), - vec4(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2), ROWCOL(2,3)), - vec4(ROWCOL(3,0), ROWCOL(3,1), ROWCOL(3,2), ROWCOL(3,3)) - ); - - #undef ROWCOL -} - -mat4 operator*(const mat4 &a, float d) -{ - return mat4(a.v[0]*d, a.v[1]*d, a.v[2]*d, a.v[3]*d); -} - -mat4 operator*(float d, const mat4 &a) -{ - return a*d; -} - -mat4 operator/(const mat4 &a, float d) -{ - return mat4(a.v[0]/d, a.v[1]/d, a.v[2]/d, a.v[3]/d); -} - -int operator==(const mat4 &a, const mat4 &b) -{ - return - (a.v[0] == b.v[0]) && - (a.v[1] == b.v[1]) && - (a.v[2] == b.v[2]) && - (a.v[3] == b.v[3]); -} - -int operator!=(const mat4 &a, const mat4 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, mat4& m) -{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ] << '\n' << m.v[VW]; } - -istream& operator >> (istream& s, mat4& m) -{ - mat4 m_tmp; - - s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ] >> m_tmp[VW]; - if (s) - m = m_tmp; - return s; -} -*/ - -void swap(mat4 &a, mat4 &b) -{ - mat4 tmp(a); - a = b; - b = tmp; -} - -/**************************************************************** - * * - * 2D functions and 3D functions * - * * - ****************************************************************/ - -mat3 identity2D() -{ - return mat3( - vec3(1.0, 0.0, 0.0), - vec3(0.0, 1.0, 0.0), - vec3(0.0, 0.0, 1.0)); -} - -mat3 translation2D(const vec2 &v) -{ - return mat3( - vec3(1.0, 0.0, v[VX]), - vec3(0.0, 1.0, v[VY]), - vec3(0.0, 0.0, 1.0)); -} - -mat3 rotation2D(const vec2 &Center, float angleDeg) -{ - float angleRad = (float) (angleDeg * M_PI / 180.0); - float c = (float) cos(angleRad); - float s = (float) sin(angleRad); - - return mat3( - vec3(c, -s, Center[VX] * (1.0f-c) + Center[VY] * s), - vec3(s, c, Center[VY] * (1.0f-c) - Center[VX] * s), - vec3(0.0, 0.0, 1.0)); -} - -mat3 scaling2D(const vec2 &scaleVector) -{ - return mat3( - vec3(scaleVector[VX], 0.0, 0.0), - vec3(0.0, scaleVector[VY], 0.0), - vec3(0.0, 0.0, 1.0)); -} - -mat4 identity3D() -{ - return mat4( - vec4(1.0, 0.0, 0.0, 0.0), - vec4(0.0, 1.0, 0.0, 0.0), - vec4(0.0, 0.0, 1.0, 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 translation3D(const vec3 &v) -{ - return mat4( - vec4(1.0, 0.0, 0.0, v[VX]), - vec4(0.0, 1.0, 0.0, v[VY]), - vec4(0.0, 0.0, 1.0, v[VZ]), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 rotation3D(const vec3 &Axis, float angleDeg) -{ - float angleRad = (float) (angleDeg * M_PI / 180.0); - float c = (float) cos(angleRad); - float s = (float) sin(angleRad); - float t = 1.0f - c; - - vec3 axis(Axis); - axis.normalize(); - - return mat4( - vec4(t * axis[VX] * axis[VX] + c, - t * axis[VX] * axis[VY] - s * axis[VZ], - t * axis[VX] * axis[VZ] + s * axis[VY], - 0.0), - vec4(t * axis[VX] * axis[VY] + s * axis[VZ], - t * axis[VY] * axis[VY] + c, - t * axis[VY] * axis[VZ] - s * axis[VX], - 0.0), - vec4(t * axis[VX] * axis[VZ] - s * axis[VY], - t * axis[VY] * axis[VZ] + s * axis[VX], - t * axis[VZ] * axis[VZ] + c, - 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 rotation3Drad(const vec3 &Axis, float angleRad) -{ - float c = (float) cos(angleRad); - float s = (float) sin(angleRad); - float t = 1.0f - c; - - vec3 axis(Axis); - axis.normalize(); - - return mat4( - vec4(t * axis[VX] * axis[VX] + c, - t * axis[VX] * axis[VY] - s * axis[VZ], - t * axis[VX] * axis[VZ] + s * axis[VY], - 0.0), - vec4(t * axis[VX] * axis[VY] + s * axis[VZ], - t * axis[VY] * axis[VY] + c, - t * axis[VY] * axis[VZ] - s * axis[VX], - 0.0), - vec4(t * axis[VX] * axis[VZ] - s * axis[VY], - t * axis[VY] * axis[VZ] + s * axis[VX], - t * axis[VZ] * axis[VZ] + c, - 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 scaling3D(const vec3 &scaleVector) -{ - return mat4( - vec4(scaleVector[VX], 0.0, 0.0, 0.0), - vec4(0.0, scaleVector[VY], 0.0, 0.0), - vec4(0.0, 0.0, scaleVector[VZ], 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 perspective3D(float d) -{ - return mat4( - vec4(1.0f, 0.0f, 0.0f, 0.0f), - vec4(0.0f, 1.0f, 0.0f, 0.0f), - vec4(0.0f, 0.0f, 1.0f, 0.0f), - vec4(0.0f, 0.0f, 1.0f/d, 0.0f)); -} +/* + + algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +/************************************************************************** + + There are three vector classes and two matrix classes: vec2, vec3, + vec4, mat3, and mat4. + + All the standard arithmetic operations are defined, with '*' + for dot product of two vectors and multiplication of two matrices, + and '^' for cross product of two vectors. + + Additional functions include length(), normalize(), homogenize for + vectors, and print(), set(), apply() for all classes. + + There is a function transpose() for matrices, but note that it + does not actually change the matrix, + + When multiplied with a matrix, a vector is treated as a row vector + if it precedes the matrix (v*M), and as a column vector if it + follows the matrix (M*v). + + Matrices are stored in row-major form. + + A vector of one dimension (2d, 3d, or 4d) can be cast to a vector + of a higher or lower dimension. If casting to a higher dimension, + the new component is set by default to 1.0, unless a value is + specified: + vec3 a(1.0, 2.0, 3.0 ); + vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0}; + When casting to a lower dimension, the vector is homogenized in + the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the + resulting vector is {X/W, Y/W, Z/W}. It is up to the user to + insure the fourth component is not zero before casting. + + There are also the following function for building matrices: + identity2D(), translation2D(), rotation2D(), + scaling2D(), identity3D(), translation3D(), + rotation3D(), rotation3Drad(), scaling3D(), + perspective3D() + + + --------------------------------------------------------------------- + + Author: Jean-Francois DOUEg + Revised: Paul Rademacher + Version 3.2 - Feb 1998 + Revised: Nigel Stewart (GLUI Code Cleaning) + +**************************************************************************/ + +#include "algebra3.h" +#include "glui_internal.h" +#include + +#ifdef VEC_ERROR_FATAL +#ifndef VEC_ERROR +#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); exit(1); } +#endif +#else +#ifndef VEC_ERROR +#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); } +#endif +#endif + +/**************************************************************** + * * + * vec2 Member functions * + * * + ****************************************************************/ + +/******************** vec2 CONSTRUCTORS ********************/ + +vec2::vec2() +{ + n[VX] = n[VY] = 0.0; +} + +vec2::vec2(float x, float y) +{ + n[VX] = x; + n[VY] = y; +} + +vec2::vec2(const vec2 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; +} + +vec2::vec2(const vec3 &v) // it is up to caller to avoid divide-by-zero +{ + n[VX] = v.n[VX]/v.n[VZ]; + n[VY] = v.n[VY]/v.n[VZ]; +} + +vec2::vec2(const vec3 &v, int dropAxis) +{ + switch (dropAxis) + { + case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; break; + case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; break; + default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; break; + } +} + +/******************** vec2 ASSIGNMENT OPERATORS ******************/ + +vec2 & vec2::operator=(const vec2 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + return *this; +} + +vec2 & vec2::operator+=(const vec2 &v) +{ + n[VX] += v.n[VX]; + n[VY] += v.n[VY]; + return *this; +} + +vec2 & vec2::operator-=(const vec2 &v) +{ + n[VX] -= v.n[VX]; + n[VY] -= v.n[VY]; + return *this; +} + +vec2 &vec2::operator*=(float d) +{ + n[VX] *= d; + n[VY] *= d; + return *this; +} + +vec2 &vec2::operator/=(float d) +{ + float d_inv = 1.0f/d; + n[VX] *= d_inv; + n[VY] *= d_inv; + return *this; +} + +float &vec2::operator[](int i) +{ + if (i < VX || i > VY) + //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("vec2 [] operator: illegal access" ); + return n[i]; +} + +const float &vec2::operator[](int i) const +{ + if (i < VX || i > VY) + //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("vec2 [] operator: illegal access" ); + + return n[i]; +} + +/******************** vec2 SPECIAL FUNCTIONS ********************/ + +float vec2::length() const +{ + return (float) sqrt(length2()); +} + +float vec2::length2() const +{ + return n[VX]*n[VX] + n[VY]*n[VY]; +} + +vec2 &vec2::normalize() // it is up to caller to avoid divide-by-zero +{ + *this /= length(); + return *this; +} + +vec2 &vec2::apply(V_FCT_PTR fct) +{ + n[VX] = (*fct)(n[VX]); + n[VY] = (*fct)(n[VY]); + return *this; +} + +void vec2::set( float x, float y ) +{ + n[VX] = x; n[VY] = y; +} + +/******************** vec2 FRIENDS *****************************/ + +vec2 operator-(const vec2 &a) +{ + return vec2(-a.n[VX],-a.n[VY]); +} + +vec2 operator+(const vec2 &a, const vec2& b) +{ + return vec2(a.n[VX]+b.n[VX], a.n[VY]+b.n[VY]); +} + +vec2 operator-(const vec2 &a, const vec2& b) +{ + return vec2(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY]); +} + +vec2 operator*(const vec2 &a, float d) +{ + return vec2(d*a.n[VX], d*a.n[VY]); +} + +vec2 operator*(float d, const vec2 &a) +{ + return a*d; +} + +vec2 operator*(const mat3 &a, const vec2 &v) +{ + vec3 av; + + av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]; + av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]; + av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]; + + return av; +} + +vec2 operator*(const vec2 &v, const mat3 &a) +{ + return a.transpose() * v; +} + +vec3 operator*(const mat3 &a, const vec3 &v) +{ + vec3 av; + + av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]*v.n[VZ]; + av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]*v.n[VZ]; + av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]*v.n[VZ]; + + return av; +} + +vec3 operator*(const vec3 &v, const mat3 &a) +{ + return a.transpose() * v; +} + +float operator*(const vec2 &a, const vec2 &b) +{ + return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY]; +} + +vec2 operator/(const vec2 &a, float d) +{ + float d_inv = 1.0f/d; + return vec2(a.n[VX]*d_inv, a.n[VY]*d_inv); +} + +vec3 operator^(const vec2 &a, const vec2 &b) +{ + return vec3(0.0, 0.0, a.n[VX] * b.n[VY] - b.n[VX] * a.n[VY]); +} + +int operator==(const vec2 &a, const vec2 &b) +{ + return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]); +} + +int operator!=(const vec2 &a, const vec2 &b) +{ + return !(a == b); +} + +/*ostream& operator << (ostream& s, vec2& v) +{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << " |"; } +*/ + +/*istream& operator >> (istream& s, vec2& v) { + vec2 v_tmp; + char c = ' '; + + while (isspace(c)) + s >> c; + // The vectors can be formatted either as x y or | x y | + if (c == '|') { + s >> v_tmp[VX] >> v_tmp[VY]; + while (s >> c && isspace(c)) ; + if (c != '|') + ;//s.set(_bad); + } + else { + s.putback(c); + s >> v_tmp[VX] >> v_tmp[VY]; + } + if (s) + v = v_tmp; + return s; +} +*/ + +void swap(vec2 &a, vec2 &b) +{ + vec2 tmp(a); + a = b; + b = tmp; +} + +vec2 min_vec(const vec2 &a, const vec2 &b) +{ + return vec2(MIN(a.n[VX], b.n[VX]), MIN(a.n[VY], b.n[VY])); +} + +vec2 max_vec(const vec2 &a, const vec2 &b) +{ + return vec2(MAX(a.n[VX], b.n[VX]), MAX(a.n[VY], b.n[VY])); +} + +vec2 prod(const vec2 &a, const vec2 &b) +{ + return vec2(a.n[VX] * b.n[VX], a.n[VY] * b.n[VY]); +} + +/**************************************************************** + * * + * vec3 Member functions * + * * + ****************************************************************/ + +// CONSTRUCTORS + +vec3::vec3() +{ + n[VX] = n[VY] = n[VZ] = 0.0; +} + +vec3::vec3(float x, float y, float z) +{ + n[VX] = x; + n[VY] = y; + n[VZ] = z; +} + +vec3::vec3(const vec3 &v) +{ + n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; +} + +vec3::vec3(const vec2 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = 1.0; +} + +vec3::vec3(const vec2 &v, float d) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = d; +} + +vec3::vec3(const vec4 &v) // it is up to caller to avoid divide-by-zero +{ + n[VX] = v.n[VX] / v.n[VW]; + n[VY] = v.n[VY] / v.n[VW]; + n[VZ] = v.n[VZ] / v.n[VW]; +} + +vec3::vec3(const vec4 &v, int dropAxis) +{ + switch (dropAxis) + { + case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break; + case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break; + case VZ: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VW]; break; + default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; break; + } +} + + +// ASSIGNMENT OPERATORS + +vec3 &vec3::operator=(const vec3 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = v.n[VZ]; + return *this; +} + +vec3 &vec3::operator+=(const vec3 &v) +{ + n[VX] += v.n[VX]; + n[VY] += v.n[VY]; + n[VZ] += v.n[VZ]; + return *this; +} + +vec3 &vec3::operator-=(const vec3& v) +{ + n[VX] -= v.n[VX]; + n[VY] -= v.n[VY]; + n[VZ] -= v.n[VZ]; + return *this; +} + +vec3 &vec3::operator*=(float d) +{ + n[VX] *= d; + n[VY] *= d; + n[VZ] *= d; + return *this; +} + +vec3 &vec3::operator/=(float d) +{ + float d_inv = 1.0f/d; + n[VX] *= d_inv; + n[VY] *= d_inv; + n[VZ] *= d_inv; + return *this; +} + +float &vec3::operator[](int i) +{ + if (i < VX || i > VZ) + //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("vec3 [] operator: illegal access" ); + + return n[i]; +} + +const float &vec3::operator[](int i) const +{ + if (i < VX || i > VZ) + //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("vec3 [] operator: illegal access" ); + + return n[i]; +} + +// SPECIAL FUNCTIONS + +float vec3::length() const +{ + return (float) sqrt(length2()); +} + +float vec3::length2() const +{ + return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ]; +} + +vec3 &vec3::normalize() // it is up to caller to avoid divide-by-zero +{ + *this /= length(); + return *this; +} + +vec3 &vec3::homogenize(void) // it is up to caller to avoid divide-by-zero +{ + n[VX] /= n[VZ]; + n[VY] /= n[VZ]; + n[VZ] = 1.0; + return *this; +} + +vec3 &vec3::apply(V_FCT_PTR fct) +{ + n[VX] = (*fct)(n[VX]); + n[VY] = (*fct)(n[VY]); + n[VZ] = (*fct)(n[VZ]); + return *this; +} + +void vec3::set(float x, float y, float z) // set vector +{ + n[VX] = x; + n[VY] = y; + n[VZ] = z; +} + +void vec3::print(FILE *file, const char *name) const // print vector to a file +{ + fprintf( file, "%s: <%f, %f, %f>\n", name, n[VX], n[VY], n[VZ] ); +} + +// FRIENDS + +vec3 operator-(const vec3 &a) +{ + return vec3(-a.n[VX],-a.n[VY],-a.n[VZ]); +} + +vec3 operator+(const vec3 &a, const vec3 &b) +{ + return vec3(a.n[VX]+ b.n[VX], a.n[VY] + b.n[VY], a.n[VZ] + b.n[VZ]); +} + +vec3 operator-(const vec3 &a, const vec3 &b) +{ + return vec3(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY], a.n[VZ]-b.n[VZ]); +} + +vec3 operator*(const vec3 &a, float d) +{ + return vec3(d*a.n[VX], d*a.n[VY], d*a.n[VZ]); +} + +vec3 operator*(float d, const vec3 &a) +{ + return a*d; +} + +vec3 operator*(const mat4 &a, const vec3 &v) +{ + return a*vec4(v); +} + +vec3 operator*(const vec3 &v, mat4 &a) +{ + return a.transpose()*v; +} + +float operator*(const vec3 &a, const vec3 &b) +{ + return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY] + a.n[VZ]*b.n[VZ]; +} + +vec3 operator/(const vec3 &a, float d) +{ + float d_inv = 1.0f/d; + return vec3(a.n[VX]*d_inv, a.n[VY]*d_inv, a.n[VZ]*d_inv); +} + +vec3 operator^(const vec3 &a, const vec3 &b) +{ + return + vec3(a.n[VY]*b.n[VZ] - a.n[VZ]*b.n[VY], + a.n[VZ]*b.n[VX] - a.n[VX]*b.n[VZ], + a.n[VX]*b.n[VY] - a.n[VY]*b.n[VX]); +} + +int operator==(const vec3 &a, const vec3 &b) +{ + return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]) && (a.n[VZ] == b.n[VZ]); +} + +int operator!=(const vec3 &a, const vec3 &b) +{ + return !(a == b); +} + +/*ostream& operator << (ostream& s, vec3& v) +{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << " |"; } + +istream& operator >> (istream& s, vec3& v) { + vec3 v_tmp; + char c = ' '; + + while (isspace(c)) + s >> c; + // The vectors can be formatted either as x y z or | x y z | + if (c == '|') { + s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ]; + while (s >> c && isspace(c)) ; + if (c != '|') + ;//s.set(_bad); + } + else { + s.putback(c); + s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ]; + } + if (s) + v = v_tmp; + return s; +} +*/ + +void swap(vec3 &a, vec3 &b) +{ + vec3 tmp(a); + a = b; + b = tmp; +} + +vec3 min_vec(const vec3 &a, const vec3 &b) +{ + return vec3( + MIN(a.n[VX], b.n[VX]), + MIN(a.n[VY], b.n[VY]), + MIN(a.n[VZ], b.n[VZ])); +} + +vec3 max_vec(const vec3 &a, const vec3 &b) +{ + return vec3( + MAX(a.n[VX], b.n[VX]), + MAX(a.n[VY], b.n[VY]), + MAX(a.n[VZ], b.n[VZ])); +} + +vec3 prod(const vec3 &a, const vec3 &b) +{ + return vec3(a.n[VX]*b.n[VX], a.n[VY]*b.n[VY], a.n[VZ]*b.n[VZ]); +} + +/**************************************************************** + * * + * vec4 Member functions * + * * + ****************************************************************/ + +// CONSTRUCTORS + +vec4::vec4() +{ + n[VX] = n[VY] = n[VZ] = 0.0; + n[VW] = 1.0; +} + +vec4::vec4(float x, float y, float z, float w) +{ + n[VX] = x; + n[VY] = y; + n[VZ] = z; + n[VW] = w; +} + +vec4::vec4(const vec4 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = v.n[VZ]; + n[VW] = v.n[VW]; +} + +vec4::vec4(const vec3 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = v.n[VZ]; + n[VW] = 1.0; +} + +vec4::vec4(const vec3 &v, float d) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = v.n[VZ]; + n[VW] = d; +} + +// ASSIGNMENT OPERATORS + +vec4 &vec4::operator=(const vec4 &v) +{ + n[VX] = v.n[VX]; + n[VY] = v.n[VY]; + n[VZ] = v.n[VZ]; + n[VW] = v.n[VW]; + return *this; +} + +vec4 &vec4::operator+=(const vec4 &v) +{ + n[VX] += v.n[VX]; + n[VY] += v.n[VY]; + n[VZ] += v.n[VZ]; + n[VW] += v.n[VW]; + return *this; +} + +vec4 &vec4::operator-=(const vec4 &v) +{ + n[VX] -= v.n[VX]; + n[VY] -= v.n[VY]; + n[VZ] -= v.n[VZ]; + n[VW] -= v.n[VW]; + return *this; +} + +vec4 &vec4::operator*=(float d) +{ + n[VX] *= d; + n[VY] *= d; + n[VZ] *= d; + n[VW] *= d; + return *this; +} + +vec4 &vec4::operator/=(float d) +{ + float d_inv = 1.0f/d; + n[VX] *= d_inv; + n[VY] *= d_inv; + n[VZ] *= d_inv; + n[VW] *= d_inv; + return *this; +} + +float &vec4::operator[](int i) +{ + if (i < VX || i > VW) + //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("vec4 [] operator: illegal access" ); + + return n[i]; +} + +const float &vec4::operator[](int i) const +{ + if (i < VX || i > VW) + //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("vec4 [] operator: illegal access" ); + + return n[i]; +} + +// SPECIAL FUNCTIONS + +float vec4::length() const +{ + return (float) sqrt(length2()); +} + +float vec4::length2() const +{ + return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ] + n[VW]*n[VW]; +} + +vec4 &vec4::normalize() // it is up to caller to avoid divide-by-zero +{ + *this /= length(); + return *this; +} + +vec4 &vec4::homogenize() // it is up to caller to avoid divide-by-zero +{ + n[VX] /= n[VW]; + n[VY] /= n[VW]; + n[VZ] /= n[VW]; + n[VW] = 1.0; + return *this; +} + +vec4 &vec4::apply(V_FCT_PTR fct) +{ + n[VX] = (*fct)(n[VX]); + n[VY] = (*fct)(n[VY]); + n[VZ] = (*fct)(n[VZ]); + n[VW] = (*fct)(n[VW]); + return *this; +} + +void vec4::print(FILE *file, const char *name) const // print vector to a file +{ + fprintf( file, "%s: <%f, %f, %f, %f>\n", name, n[VX], n[VY], n[VZ], n[VW]); +} + +void vec4::set(float x, float y, float z, float a) +{ + n[0] = x; + n[1] = y; + n[2] = z; + n[3] = a; +} + + +// FRIENDS + +vec4 operator-(const vec4 &a) +{ + return vec4(-a.n[VX],-a.n[VY],-a.n[VZ],-a.n[VW]); +} + +vec4 operator+(const vec4 &a, const vec4 &b) +{ + return vec4( + a.n[VX] + b.n[VX], + a.n[VY] + b.n[VY], + a.n[VZ] + b.n[VZ], + a.n[VW] + b.n[VW]); +} + +vec4 operator-(const vec4 &a, const vec4 &b) +{ + return vec4( + a.n[VX] - b.n[VX], + a.n[VY] - b.n[VY], + a.n[VZ] - b.n[VZ], + a.n[VW] - b.n[VW]); +} + +vec4 operator*(const vec4 &a, float d) +{ + return vec4(d*a.n[VX], d*a.n[VY], d*a.n[VZ], d*a.n[VW]); +} + +vec4 operator*(float d, const vec4 &a) +{ + return a*d; +} + +vec4 operator*(const mat4 &a, const vec4 &v) +{ + #define ROWCOL(i) \ + a.v[i].n[0]*v.n[VX] + \ + a.v[i].n[1]*v.n[VY] + \ + a.v[i].n[2]*v.n[VZ] + \ + a.v[i].n[3]*v.n[VW] + + return vec4(ROWCOL(0), ROWCOL(1), ROWCOL(2), ROWCOL(3)); + + #undef ROWCOL +} + +vec4 operator*(const vec4 &v, const mat4 &a) +{ + return a.transpose()*v; +} + +float operator*(const vec4 &a, const vec4 &b) +{ + return + a.n[VX]*b.n[VX] + + a.n[VY]*b.n[VY] + + a.n[VZ]*b.n[VZ] + + a.n[VW]*b.n[VW]; +} + +vec4 operator/(const vec4 &a, float d) +{ + float d_inv = 1.0f/d; + return vec4( + a.n[VX]*d_inv, + a.n[VY]*d_inv, + a.n[VZ]*d_inv, + a.n[VW]*d_inv); +} + +int operator==(const vec4 &a, const vec4 &b) +{ + return + (a.n[VX] == b.n[VX]) && + (a.n[VY] == b.n[VY]) && + (a.n[VZ] == b.n[VZ]) && + (a.n[VW] == b.n[VW]); +} + +int operator!=(const vec4 &a, const vec4 &b) +{ + return !(a == b); +} + +/*ostream& operator << (ostream& s, vec4& v) +{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << ' ' + << v.n[VW] << " |"; } + +istream& operator >> (istream& s, vec4& v) { + vec4 v_tmp; + char c = ' '; + + while (isspace(c)) + s >> c; + // The vectors can be formatted either as x y z w or | x y z w | + if (c == '|') { + s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW]; + while (s >> c && isspace(c)) ; + if (c != '|') + ;//s.set(_bad); + } + else { + s.putback(c); + s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW]; + } + if (s) + v = v_tmp; + return s; +} +*/ + +void swap(vec4 &a, vec4 &b) +{ + vec4 tmp(a); + a = b; + b = tmp; +} + +vec4 min_vec(const vec4 &a, const vec4 &b) +{ + return vec4( + MIN(a.n[VX], b.n[VX]), + MIN(a.n[VY], b.n[VY]), + MIN(a.n[VZ], b.n[VZ]), + MIN(a.n[VW], b.n[VW])); +} + +vec4 max_vec(const vec4 &a, const vec4 &b) +{ + return vec4( + MAX(a.n[VX], b.n[VX]), + MAX(a.n[VY], b.n[VY]), + MAX(a.n[VZ], b.n[VZ]), + MAX(a.n[VW], b.n[VW])); +} + +vec4 prod(const vec4 &a, const vec4 &b) +{ + return vec4( + a.n[VX] * b.n[VX], + a.n[VY] * b.n[VY], + a.n[VZ] * b.n[VZ], + a.n[VW] * b.n[VW]); +} + +/**************************************************************** + * * + * mat3 member functions * + * * + ****************************************************************/ + +// CONSTRUCTORS + +mat3::mat3() +{ + *this = identity2D(); +} + +mat3::mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2) +{ + set(v0, v1, v2); +} + +mat3::mat3(const mat3 &m) +{ + v[0] = m.v[0]; + v[1] = m.v[1]; + v[2] = m.v[2]; +} + +// ASSIGNMENT OPERATORS + +mat3 &mat3::operator=(const mat3 &m) +{ + v[0] = m.v[0]; + v[1] = m.v[1]; + v[2] = m.v[2]; + return *this; +} + +mat3 &mat3::operator+=(const mat3& m) +{ + v[0] += m.v[0]; + v[1] += m.v[1]; + v[2] += m.v[2]; + return *this; +} + +mat3 &mat3::operator-=(const mat3& m) +{ + v[0] -= m.v[0]; + v[1] -= m.v[1]; + v[2] -= m.v[2]; + return *this; +} + +mat3 &mat3::operator*=(float d) +{ + v[0] *= d; + v[1] *= d; + v[2] *= d; + return *this; +} + +mat3 &mat3::operator/=(float d) +{ + v[0] /= d; + v[1] /= d; + v[2] /= d; + return *this; +} + +vec3 &mat3::operator[](int i) +{ + if (i < VX || i > VZ) + //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("mat3 [] operator: illegal access" ); + + return v[i]; +} + +const vec3 &mat3::operator[](int i) const +{ + if (i < VX || i > VZ) + //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("mat3 [] operator: illegal access" ); + + return v[i]; +} + +void mat3::set(const vec3 &v0, const vec3 &v1, const vec3 &v2) +{ + v[0] = v0; + v[1] = v1; + v[2] = v2; +} + +// SPECIAL FUNCTIONS + +mat3 mat3::transpose() const +{ + return mat3( + vec3(v[0][0], v[1][0], v[2][0]), + vec3(v[0][1], v[1][1], v[2][1]), + vec3(v[0][2], v[1][2], v[2][2])); +} + +mat3 mat3::inverse() const // Gauss-Jordan elimination with partial pivoting +{ + mat3 a(*this); // As a evolves from original mat into identity + mat3 b(identity2D()); // b evolves from identity into inverse(a) + int i, j, i1; + + // Loop over cols of a from left to right, eliminating above and below diag + for (j=0; j<3; j++) // Find largest pivot in column j among rows j..2 + { + i1 = j; // Row with largest pivot candidate + for (i=j+1; i<3; i++) + if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j])) + i1 = i; + + // Swap rows i1 and j in a and b to put pivot on diagonal + swap(a.v[i1], a.v[j]); + swap(b.v[i1], b.v[j]); + + // Scale row j to have a unit diagonal + if (a.v[j].n[j]==0.) + VEC_ERROR("mat3::inverse: singular matrix; can't invert\n"); + + b.v[j] /= a.v[j].n[j]; + a.v[j] /= a.v[j].n[j]; + + // Eliminate off-diagonal elems in col j of a, doing identical ops to b + for (i=0; i<3; i++) + if (i!=j) + { + b.v[i] -= a.v[i].n[j]*b.v[j]; + a.v[i] -= a.v[i].n[j]*a.v[j]; + } + } + + return b; +} + +mat3 &mat3::apply(V_FCT_PTR fct) +{ + v[VX].apply(fct); + v[VY].apply(fct); + v[VZ].apply(fct); + return *this; +} + + +// FRIENDS + +mat3 operator-(const mat3 &a) +{ + return mat3(-a.v[0], -a.v[1], -a.v[2]); +} + +mat3 operator+(const mat3 &a, const mat3 &b) +{ + return mat3(a.v[0]+b.v[0], a.v[1]+b.v[1], a.v[2]+b.v[2]); +} + +mat3 operator-(const mat3 &a, const mat3 &b) +{ + return mat3(a.v[0]-b.v[0], a.v[1]-b.v[1], a.v[2]-b.v[2]); +} + +mat3 operator*(const mat3 &a, const mat3 &b) +{ + #define ROWCOL(i, j) \ + a.v[i].n[0]*b.v[0][j] + a.v[i].n[1]*b.v[1][j] + a.v[i].n[2]*b.v[2][j] + + return mat3( + vec3(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)), + vec3(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)), + vec3(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2))); + + #undef ROWCOL +} + +mat3 operator*(const mat3 &a, float d) +{ + return mat3(a.v[0]*d, a.v[1]*d, a.v[2]*d); +} + +mat3 operator*(float d, const mat3 &a) +{ + return a*d; +} + +mat3 operator/(const mat3 &a, float d) +{ + return mat3(a.v[0]/d, a.v[1]/d, a.v[2]/d); +} + +int operator==(const mat3 &a, const mat3 &b) +{ + return + (a.v[0] == b.v[0]) && + (a.v[1] == b.v[1]) && + (a.v[2] == b.v[2]); +} + +int operator!=(const mat3 &a, const mat3 &b) +{ + return !(a == b); +} + +/*ostream& operator << (ostream& s, mat3& m) +{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ]; } + +istream& operator >> (istream& s, mat3& m) { + mat3 m_tmp; + + s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ]; + if (s) + m = m_tmp; + return s; +} +*/ + +void swap(mat3 &a, mat3 &b) +{ + mat3 tmp(a); + a = b; + b = tmp; +} + +void mat3::print(FILE *file, const char *name) const +{ + int i, j; + + fprintf( stderr, "%s:\n", name ); + + for( i = 0; i < 3; i++ ) + { + fprintf( stderr, " " ); + for( j = 0; j < 3; j++ ) + { + fprintf( stderr, "%f ", v[i][j] ); + } + fprintf( stderr, "\n" ); + } +} + + + +/**************************************************************** + * * + * mat4 member functions * + * * + ****************************************************************/ + +// CONSTRUCTORS + +mat4::mat4() +{ + *this = identity3D(); +} + +mat4::mat4(const vec4& v0, const vec4& v1, const vec4& v2, const vec4& v3) +{ + v[0] = v0; + v[1] = v1; + v[2] = v2; + v[3] = v3; +} + +mat4::mat4(const mat4 &m) +{ + v[0] = m.v[0]; + v[1] = m.v[1]; + v[2] = m.v[2]; + v[3] = m.v[3]; +} + +mat4::mat4( + float a00, float a01, float a02, float a03, + float a10, float a11, float a12, float a13, + float a20, float a21, float a22, float a23, + float a30, float a31, float a32, float a33 ) +{ + v[0][0] = a00; v[0][1] = a01; v[0][2] = a02; v[0][3] = a03; + v[1][0] = a10; v[1][1] = a11; v[1][2] = a12; v[1][3] = a13; + v[2][0] = a20; v[2][1] = a21; v[2][2] = a22; v[2][3] = a23; + v[3][0] = a30; v[3][1] = a31; v[3][2] = a32; v[3][3] = a33; +} + +// ASSIGNMENT OPERATORS + +mat4 &mat4::operator=(const mat4 &m) +{ + v[0] = m.v[0]; + v[1] = m.v[1]; + v[2] = m.v[2]; + v[3] = m.v[3]; + return *this; +} + +mat4 &mat4::operator+=(const mat4 &m) +{ + v[0] += m.v[0]; + v[1] += m.v[1]; + v[2] += m.v[2]; + v[3] += m.v[3]; + return *this; +} + +mat4 &mat4::operator-=(const mat4 &m) +{ + v[0] -= m.v[0]; + v[1] -= m.v[1]; + v[2] -= m.v[2]; + v[3] -= m.v[3]; + return *this; +} + +mat4 &mat4::operator*=(float d) +{ + v[0] *= d; + v[1] *= d; + v[2] *= d; + v[3] *= d; + return *this; +} + +mat4 &mat4::operator/=(float d) +{ + v[0] /= d; + v[1] /= d; + v[2] /= d; + v[3] /= d; + return *this; +} + +vec4 &mat4::operator[](int i) +{ + if (i < VX || i > VW) + //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("mat4 [] operator: illegal access" ); + return v[i]; +} + +const vec4 &mat4::operator[](int i) const +{ + if (i < VX || i > VW) + //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n') + VEC_ERROR("mat4 [] operator: illegal access" ); + return v[i]; +} + +// SPECIAL FUNCTIONS; + +mat4 mat4::transpose() const +{ + return mat4( + vec4(v[0][0], v[1][0], v[2][0], v[3][0]), + vec4(v[0][1], v[1][1], v[2][1], v[3][1]), + vec4(v[0][2], v[1][2], v[2][2], v[3][2]), + vec4(v[0][3], v[1][3], v[2][3], v[3][3])); +} + +mat4 mat4::inverse() const // Gauss-Jordan elimination with partial pivoting +{ + mat4 a(*this); // As a evolves from original mat into identity + mat4 b(identity3D()); // b evolves from identity into inverse(a) + int i, j, i1; + + // Loop over cols of a from left to right, eliminating above and below diag + for (j=0; j<4; j++) // Find largest pivot in column j among rows j..3 + { + i1 = j; // Row with largest pivot candidate + for (i=j+1; i<4; i++) + if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j])) + i1 = i; + + // Swap rows i1 and j in a and b to put pivot on diagonal + swap(a.v[i1], a.v[j]); + swap(b.v[i1], b.v[j]); + + // Scale row j to have a unit diagonal + if (a.v[j].n[j]==0.) + VEC_ERROR("mat4::inverse: singular matrix; can't invert\n"); + + b.v[j] /= a.v[j].n[j]; + a.v[j] /= a.v[j].n[j]; + + // Eliminate off-diagonal elems in col j of a, doing identical ops to b + for (i=0; i<4; i++) + if (i!=j) + { + b.v[i] -= a.v[i].n[j]*b.v[j]; + a.v[i] -= a.v[i].n[j]*a.v[j]; + } + } + + return b; +} + +mat4 &mat4::apply(V_FCT_PTR fct) +{ + v[VX].apply(fct); + v[VY].apply(fct); + v[VZ].apply(fct); + v[VW].apply(fct); + return *this; +} + +void mat4::print(FILE *file, const char *name) const +{ + int i, j; + + fprintf( stderr, "%s:\n", name ); + + for( i = 0; i < 4; i++ ) + { + fprintf( stderr, " " ); + for( j = 0; j < 4; j++ ) + { + fprintf( stderr, "%f ", v[i][j] ); + } + fprintf( stderr, "\n" ); + } +} + +void mat4::swap_rows(int i, int j) +{ + vec4 t; + + t = v[i]; + v[i] = v[j]; + v[j] = t; +} + +void mat4::swap_cols(int i, int j) +{ + float t; + int k; + + for (k=0; k<4; k++) + { + t = v[k][i]; + v[k][i] = v[k][j]; + v[k][j] = t; + } +} + + +// FRIENDS + +mat4 operator-(const mat4 &a) +{ + return mat4(-a.v[0],-a.v[1],-a.v[2],-a.v[3]); +} + +mat4 operator+(const mat4 &a, const mat4 &b) +{ + return mat4( + a.v[0] + b.v[0], + a.v[1] + b.v[1], + a.v[2] + b.v[2], + a.v[3] + b.v[3]); +} + +mat4 operator-(const mat4 &a, const mat4 &b) +{ + return mat4( + a.v[0] - b.v[0], + a.v[1] - b.v[1], + a.v[2] - b.v[2], + a.v[3] - b.v[3]); +} + +mat4 operator*(const mat4 &a, const mat4 &b) +{ + #define ROWCOL(i, j) \ + a.v[i].n[0]*b.v[0][j] + \ + a.v[i].n[1]*b.v[1][j] + \ + a.v[i].n[2]*b.v[2][j] + \ + a.v[i].n[3]*b.v[3][j] + + return mat4( + vec4(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2), ROWCOL(0,3)), + vec4(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2), ROWCOL(1,3)), + vec4(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2), ROWCOL(2,3)), + vec4(ROWCOL(3,0), ROWCOL(3,1), ROWCOL(3,2), ROWCOL(3,3)) + ); + + #undef ROWCOL +} + +mat4 operator*(const mat4 &a, float d) +{ + return mat4(a.v[0]*d, a.v[1]*d, a.v[2]*d, a.v[3]*d); +} + +mat4 operator*(float d, const mat4 &a) +{ + return a*d; +} + +mat4 operator/(const mat4 &a, float d) +{ + return mat4(a.v[0]/d, a.v[1]/d, a.v[2]/d, a.v[3]/d); +} + +int operator==(const mat4 &a, const mat4 &b) +{ + return + (a.v[0] == b.v[0]) && + (a.v[1] == b.v[1]) && + (a.v[2] == b.v[2]) && + (a.v[3] == b.v[3]); +} + +int operator!=(const mat4 &a, const mat4 &b) +{ + return !(a == b); +} + +/*ostream& operator << (ostream& s, mat4& m) +{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ] << '\n' << m.v[VW]; } + +istream& operator >> (istream& s, mat4& m) +{ + mat4 m_tmp; + + s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ] >> m_tmp[VW]; + if (s) + m = m_tmp; + return s; +} +*/ + +void swap(mat4 &a, mat4 &b) +{ + mat4 tmp(a); + a = b; + b = tmp; +} + +/**************************************************************** + * * + * 2D functions and 3D functions * + * * + ****************************************************************/ + +mat3 identity2D() +{ + return mat3( + vec3(1.0, 0.0, 0.0), + vec3(0.0, 1.0, 0.0), + vec3(0.0, 0.0, 1.0)); +} + +mat3 translation2D(const vec2 &v) +{ + return mat3( + vec3(1.0, 0.0, v[VX]), + vec3(0.0, 1.0, v[VY]), + vec3(0.0, 0.0, 1.0)); +} + +mat3 rotation2D(const vec2 &Center, float angleDeg) +{ + float angleRad = (float) (angleDeg * M_PI / 180.0); + float c = (float) cos(angleRad); + float s = (float) sin(angleRad); + + return mat3( + vec3(c, -s, Center[VX] * (1.0f-c) + Center[VY] * s), + vec3(s, c, Center[VY] * (1.0f-c) - Center[VX] * s), + vec3(0.0, 0.0, 1.0)); +} + +mat3 scaling2D(const vec2 &scaleVector) +{ + return mat3( + vec3(scaleVector[VX], 0.0, 0.0), + vec3(0.0, scaleVector[VY], 0.0), + vec3(0.0, 0.0, 1.0)); +} + +mat4 identity3D() +{ + return mat4( + vec4(1.0, 0.0, 0.0, 0.0), + vec4(0.0, 1.0, 0.0, 0.0), + vec4(0.0, 0.0, 1.0, 0.0), + vec4(0.0, 0.0, 0.0, 1.0)); +} + +mat4 translation3D(const vec3 &v) +{ + return mat4( + vec4(1.0, 0.0, 0.0, v[VX]), + vec4(0.0, 1.0, 0.0, v[VY]), + vec4(0.0, 0.0, 1.0, v[VZ]), + vec4(0.0, 0.0, 0.0, 1.0)); +} + +mat4 rotation3D(const vec3 &Axis, float angleDeg) +{ + float angleRad = (float) (angleDeg * M_PI / 180.0); + float c = (float) cos(angleRad); + float s = (float) sin(angleRad); + float t = 1.0f - c; + + vec3 axis(Axis); + axis.normalize(); + + return mat4( + vec4(t * axis[VX] * axis[VX] + c, + t * axis[VX] * axis[VY] - s * axis[VZ], + t * axis[VX] * axis[VZ] + s * axis[VY], + 0.0), + vec4(t * axis[VX] * axis[VY] + s * axis[VZ], + t * axis[VY] * axis[VY] + c, + t * axis[VY] * axis[VZ] - s * axis[VX], + 0.0), + vec4(t * axis[VX] * axis[VZ] - s * axis[VY], + t * axis[VY] * axis[VZ] + s * axis[VX], + t * axis[VZ] * axis[VZ] + c, + 0.0), + vec4(0.0, 0.0, 0.0, 1.0)); +} + +mat4 rotation3Drad(const vec3 &Axis, float angleRad) +{ + float c = (float) cos(angleRad); + float s = (float) sin(angleRad); + float t = 1.0f - c; + + vec3 axis(Axis); + axis.normalize(); + + return mat4( + vec4(t * axis[VX] * axis[VX] + c, + t * axis[VX] * axis[VY] - s * axis[VZ], + t * axis[VX] * axis[VZ] + s * axis[VY], + 0.0), + vec4(t * axis[VX] * axis[VY] + s * axis[VZ], + t * axis[VY] * axis[VY] + c, + t * axis[VY] * axis[VZ] - s * axis[VX], + 0.0), + vec4(t * axis[VX] * axis[VZ] - s * axis[VY], + t * axis[VY] * axis[VZ] + s * axis[VX], + t * axis[VZ] * axis[VZ] + c, + 0.0), + vec4(0.0, 0.0, 0.0, 1.0)); +} + +mat4 scaling3D(const vec3 &scaleVector) +{ + return mat4( + vec4(scaleVector[VX], 0.0, 0.0, 0.0), + vec4(0.0, scaleVector[VY], 0.0, 0.0), + vec4(0.0, 0.0, scaleVector[VZ], 0.0), + vec4(0.0, 0.0, 0.0, 1.0)); +} + +mat4 perspective3D(float d) +{ + return mat4( + vec4(1.0f, 0.0f, 0.0f, 0.0f), + vec4(0.0f, 1.0f, 0.0f, 0.0f), + vec4(0.0f, 0.0f, 1.0f, 0.0f), + vec4(0.0f, 0.0f, 1.0f/d, 0.0f)); +} diff --git a/Extras/glui/algebra3.h b/Extras/glui/algebra3.h index 7849673df..9875b3a8c 100644 --- a/Extras/glui/algebra3.h +++ b/Extras/glui/algebra3.h @@ -1,475 +1,475 @@ -/* - - algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -/************************************************************************** - - There are three vector classes and two matrix classes: vec2, vec3, - vec4, mat3, and mat4. - - All the standard arithmetic operations are defined, with '*' - for dot product of two vectors and multiplication of two matrices, - and '^' for cross product of two vectors. - - Additional functions include length(), normalize(), homogenize for - vectors, and print(), set(), apply() for all classes. - - There is a function transpose() for matrices, but note that it - does not actually change the matrix, - - When multiplied with a matrix, a vector is treated as a row vector - if it precedes the matrix (v*M), and as a column vector if it - follows the matrix (M*v). - - Matrices are stored in row-major form. - - A vector of one dimension (2d, 3d, or 4d) can be cast to a vector - of a higher or lower dimension. If casting to a higher dimension, - the new component is set by default to 1.0, unless a value is - specified: - vec3 a(1.0, 2.0, 3.0 ); - vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0}; - When casting to a lower dimension, the vector is homogenized in - the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the - resulting vector is {X/W, Y/W, Z/W}. It is up to the user to - insure the fourth component is not zero before casting. - - There are also the following function for building matrices: - identity2D(), translation2D(), rotation2D(), - scaling2D(), identity3D(), translation3D(), - rotation3D(), rotation3Drad(), scaling3D(), - perspective3D() - - NOTE: When compiling for Windows, include this file first, to avoid - certain name conflicts - - --------------------------------------------------------------------- - - Author: Jean-Francois DOUEg - Revised: Paul Rademacher - Version 3.2 - Feb 1998 - Revised: Nigel Stewart (GLUI Code Cleaning) - -**************************************************************************/ - -#ifndef GLUI_ALGEBRA3_H -#define GLUI_ALGEBRA3_H - -#include -#include -#include - -// this line defines a new type: pointer to a function which returns a -// float and takes as argument a float -typedef float (*V_FCT_PTR)(float); - -class vec2; -class vec3; -class vec4; -class mat3; -class mat4; - -#ifndef M_PI -#define M_PI 3.141592654 -#endif - -enum {VX, VY, VZ, VW}; // axes -enum {PA, PB, PC, PD}; // planes -enum {RED, GREEN, BLUE, ALPHA}; // colors -enum {KA, KD, KS, ES}; // phong coefficients - -/**************************************************************** - * * - * 2D Vector * - * * - ****************************************************************/ - -class vec2 -{ - friend class vec3; - -protected: - - float n[2]; - -public: - - // Constructors - - vec2(); - vec2(float x, float y); - vec2(const vec2 &v); // copy constructor - vec2(const vec3 &v); // cast v3 to v2 - vec2(const vec3 &v, int dropAxis); // cast v3 to v2 - - // Assignment operators - - vec2 &operator = (const vec2 &v); // assignment of a vec2 - vec2 &operator += (const vec2 &v); // incrementation by a vec2 - vec2 &operator -= (const vec2 &v); // decrementation by a vec2 - vec2 &operator *= (float d); // multiplication by a constant - vec2 &operator /= (float d); // division by a constant - - // special functions - - float length() const; // length of a vec2 - float length2() const; // squared length of a vec2 - vec2 &normalize(); // normalize a vec2 - vec2 &apply(V_FCT_PTR fct); // apply a func. to each component - void set(float x, float y); // set vector - - float &operator [] (int i); // indexing - const float &operator [] (int i) const; // indexing - - // friends - - friend vec2 operator - (const vec2 &v); // -v1 - friend vec2 operator + (const vec2 &a, const vec2 &b); // v1 + v2 - friend vec2 operator - (const vec2 &a, const vec2 &b); // v1 - v2 - friend vec2 operator * (const vec2 &a, float d); // v1 * 3.0 - friend vec2 operator * (float d, const vec2 &a); // 3.0 * v1 - friend vec2 operator * (const mat3 &a, const vec2 &v); // M . v - friend vec2 operator * (const vec2 &v, const mat3 &a); // v . M - friend float operator * (const vec2 &a, const vec2 &b); // dot product - friend vec2 operator / (const vec2 &a, float d); // v1 / 3.0 - friend vec3 operator ^ (const vec2 &a, const vec2 &b); // cross product - friend int operator == (const vec2 &a, const vec2 &b); // v1 == v2 ? - friend int operator != (const vec2 &a, const vec2 &b); // v1 != v2 ? - //friend ostream& operator << (ostream& s, vec2& v); // output to stream - //friend istream& operator >> (istream& s, vec2& v); // input from strm. - friend void swap(vec2 &a, vec2 &b); // swap v1 & v2 - friend vec2 min_vec(const vec2 &a, const vec2 &b); // min(v1, v2) - friend vec2 max_vec(const vec2 &a, const vec2 &b); // max(v1, v2) - friend vec2 prod (const vec2 &a, const vec2 &b); // term by term * -}; - -/**************************************************************** - * * - * 3D Vector * - * * - ****************************************************************/ - -class vec3 -{ - friend class vec2; - friend class vec4; - friend class mat3; - -protected: - - float n[3]; - -public: - - // Constructors - - vec3(); - vec3(float x, float y, float z); - vec3(const vec3 &v); // copy constructor - vec3(const vec2 &v); // cast v2 to v3 - vec3(const vec2 &v, float d); // cast v2 to v3 - vec3(const vec4 &v); // cast v4 to v3 - vec3(const vec4 &v, int dropAxis); // cast v4 to v3 - - // Assignment operators - - vec3 &operator = (const vec3 &v); // assignment of a vec3 - vec3 &operator += (const vec3 &v); // incrementation by a vec3 - vec3 &operator -= (const vec3 &v); // decrementation by a vec3 - vec3 &operator *= (float d); // multiplication by a constant - vec3 &operator /= (float d); // division by a constant - - // special functions - - float length() const; // length of a vec3 - float length2() const; // squared length of a vec3 - vec3& normalize(); // normalize a vec3 - vec3& homogenize(); // homogenize (div by Z) - vec3& apply(V_FCT_PTR fct); // apply a func. to each component - void set(float x, float y, float z); // set vector - - void print(FILE *file, const char *name) const; // print vector to a file - - - float &operator [] (int i); // indexing - const float &operator [] (int i) const; // indexing - - // friends - - friend vec3 operator - (const vec3 &v); // -v1 - friend vec3 operator + (const vec3 &a, const vec3 &b); // v1 + v2 - friend vec3 operator - (const vec3 &a, const vec3 &b); // v1 - v2 - friend vec3 operator * (const vec3 &a, float d); // v1 * 3.0 - friend vec3 operator * (float d, const vec3 &a); // 3.0 * v1 - friend vec3 operator * (const mat4 &a, const vec3 &v); // M . v - friend vec3 operator * (const vec3 &v, const mat4 &a); // v . M - friend float operator * (const vec3 &a, const vec3 &b); // dot product - friend vec3 operator / (const vec3 &a, float d); // v1 / 3.0 - friend vec3 operator ^ (const vec3 &a, const vec3 &b); // cross product - friend int operator == (const vec3 &a, const vec3 &b); // v1 == v2 ? - friend int operator != (const vec3 &a, const vec3 &b); // v1 != v2 ? - //friend ostream& operator << (ostream& s, vec3& v); // output to stream - //friend istream& operator >> (istream& s, vec3& v); // input from strm. - friend void swap(vec3 &a, vec3 &b); // swap v1 & v2 - friend vec3 min_vec(const vec3 &a, const vec3 &b); // min(v1, v2) - friend vec3 max_vec(const vec3 &a, const vec3 &b); // max(v1, v2) - friend vec3 prod(const vec3 &a, const vec3 &b); // term by term * - - // necessary friend declarations - - friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform - friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform - friend mat3 operator * (const mat3 &a, const mat3 &b); // matrix 3 product -}; - -/**************************************************************** - * * - * 4D Vector * - * * - ****************************************************************/ - -class vec4 -{ - friend class vec3; - friend class mat4; - -protected: - - float n[4]; - -public: - - // Constructors - - vec4(); - vec4(float x, float y, float z, float w); - vec4(const vec4 &v); // copy constructor - vec4(const vec3 &v); // cast vec3 to vec4 - vec4(const vec3 &v, float d); // cast vec3 to vec4 - - // Assignment operators - - vec4 &operator = (const vec4 &v); // assignment of a vec4 - vec4 &operator += (const vec4 &v); // incrementation by a vec4 - vec4 &operator -= (const vec4 &v); // decrementation by a vec4 - vec4 &operator *= (float d); // multiplication by a constant - vec4 &operator /= (float d); // division by a constant - - // special functions - - float length() const; // length of a vec4 - float length2() const; // squared length of a vec4 - vec4 &normalize(); // normalize a vec4 - vec4 &apply(V_FCT_PTR fct); // apply a func. to each component - vec4 &homogenize(); - - void print(FILE *file, const char *name) const; // print vector to a file - - void set(float x, float y, float z, float a); - - float &operator [] (int i); // indexing - const float &operator [] (int i) const; // indexing - - // friends - - friend vec4 operator - (const vec4 &v); // -v1 - friend vec4 operator + (const vec4 &a, const vec4 &b); // v1 + v2 - friend vec4 operator - (const vec4 &a, const vec4 &b); // v1 - v2 - friend vec4 operator * (const vec4 &a, float d); // v1 * 3.0 - friend vec4 operator * (float d, const vec4 &a); // 3.0 * v1 - friend vec4 operator * (const mat4 &a, const vec4 &v); // M . v - friend vec4 operator * (const vec4 &v, const mat4 &a); // v . M - friend float operator * (const vec4 &a, const vec4 &b); // dot product - friend vec4 operator / (const vec4 &a, float d); // v1 / 3.0 - friend int operator == (const vec4 &a, const vec4 &b); // v1 == v2 ? - friend int operator != (const vec4 &a, const vec4 &b); // v1 != v2 ? - //friend ostream& operator << (ostream& s, vec4& v); // output to stream - //friend istream& operator >> (istream& s, vec4& v); // input from strm. - friend void swap(vec4 &a, vec4 &b); // swap v1 & v2 - friend vec4 min_vec(const vec4 &a, const vec4 &b); // min(v1, v2) - friend vec4 max_vec(const vec4 &a, const vec4 &b); // max(v1, v2) - friend vec4 prod (const vec4 &a, const vec4 &b); // term by term * - - // necessary friend declarations - - friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform - friend mat4 operator * (const mat4 &a, const mat4 &b); // matrix 4 product -}; - -/**************************************************************** - * * - * 3x3 Matrix * - * * - ****************************************************************/ - -class mat3 -{ -protected: - - vec3 v[3]; - -public: - - // Constructors - - mat3(); - mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2); - mat3(const mat3 &m); - - // Assignment operators - - mat3 &operator = (const mat3 &m); // assignment of a mat3 - mat3 &operator += (const mat3 &m); // incrementation by a mat3 - mat3 &operator -= (const mat3 &m); // decrementation by a mat3 - mat3 &operator *= (float d); // multiplication by a constant - mat3 &operator /= (float d); // division by a constant - - // special functions - - mat3 transpose() const; // transpose - mat3 inverse() const; // inverse - mat3 &apply(V_FCT_PTR fct); // apply a func. to each element - - void print(FILE *file, const char *name ) const; // print matrix to a file - - void set(const vec3 &v0, const vec3 &v1, const vec3 &v2); - - vec3 &operator [] (int i); // indexing - const vec3 &operator [] (int i) const; // indexing - - // friends - - friend mat3 operator - (const mat3 &a); // -m1 - friend mat3 operator + (const mat3 &a, const mat3 &b); // m1 + m2 - friend mat3 operator - (const mat3 &a, const mat3 &b); // m1 - m2 - friend mat3 operator * (const mat3 &a, const mat3 &b); // m1 * m2 - friend mat3 operator * (const mat3 &a, float d); // m1 * 3.0 - friend mat3 operator * (float d, const mat3 &a); // 3.0 * m1 - friend mat3 operator / (const mat3 &a, float d); // m1 / 3.0 - friend int operator == (const mat3 &a, const mat3 &b); // m1 == m2 ? - friend int operator != (const mat3 &a, const mat3 &b); // m1 != m2 ? - //friend ostream& operator << (ostream& s, mat3& m); // output to stream - //friend istream& operator >> (istream& s, mat3& m); // input from strm. - friend void swap(mat3 &a, mat3 &b); // swap m1 & m2 - - // necessary friend declarations - - friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform - friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform -}; - -/**************************************************************** - * * - * 4x4 Matrix * - * * - ****************************************************************/ - -class mat4 -{ -protected: - - vec4 v[4]; - -public: - - // Constructors - - mat4(); - mat4(const vec4 &v0, const vec4 &v1, const vec4 &v2, const vec4 &v3); - mat4(const mat4 &m); - mat4(float a00, float a01, float a02, float a03, - float a10, float a11, float a12, float a13, - float a20, float a21, float a22, float a23, - float a30, float a31, float a32, float a33 ); - - - // Assignment operators - - mat4 &operator = (const mat4 &m); // assignment of a mat4 - mat4 &operator += (const mat4 &m); // incrementation by a mat4 - mat4 &operator -= (const mat4 &m); // decrementation by a mat4 - mat4 &operator *= (float d); // multiplication by a constant - mat4 &operator /= (float d); // division by a constant - - // special functions - - mat4 transpose() const; // transpose - mat4 inverse() const; // inverse - mat4 &apply(V_FCT_PTR fct); // apply a func. to each element - - void print(FILE *file, const char *name) const; // print matrix to a file - - vec4 &operator [] (int i); // indexing - const vec4 &operator [] (int i) const; // indexing - - void swap_rows(int i, int j); // swap rows i and j - void swap_cols(int i, int j); // swap cols i and j - - // friends - - friend mat4 operator - (const mat4 &a); // -m1 - friend mat4 operator + (const mat4 &a, const mat4 &b); // m1 + m2 - friend mat4 operator - (const mat4 &a, const mat4 &b); // m1 - m2 - friend mat4 operator * (const mat4 &a, const mat4 &b); // m1 * m2 - friend mat4 operator * (const mat4 &a, float d); // m1 * 4.0 - friend mat4 operator * (float d, const mat4 &a); // 4.0 * m1 - friend mat4 operator / (const mat4 &a, float d); // m1 / 3.0 - friend int operator == (const mat4 &a, const mat4 &b); // m1 == m2 ? - friend int operator != (const mat4 &a, const mat4 &b); // m1 != m2 ? - //friend ostream& operator << (ostream& s, mat4& m); // output to stream - //friend istream& operator >> (istream& s, mat4& m); // input from strm. - friend void swap(mat4 &a, mat4 &b); // swap m1 & m2 - - // necessary friend declarations - - friend vec4 operator * (const mat4 &a, const vec4 &v); // linear transform - //friend vec4 operator * (const vec4& v, const mat4& a); // linear transform - friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform - friend vec3 operator * (const vec3 &v, const mat4 &a); // linear transform -}; - -/**************************************************************** - * * - * 2D functions and 3D functions * - * * - ****************************************************************/ - -mat3 identity2D (); // identity 2D -mat3 translation2D(const vec2 &v); // translation 2D -mat3 rotation2D (const vec2 &Center, float angleDeg); // rotation 2D -mat3 scaling2D (const vec2 &scaleVector); // scaling 2D -mat4 identity3D (); // identity 3D -mat4 translation3D(const vec3 &v); // translation 3D -mat4 rotation3D (const vec3 &Axis, float angleDeg); // rotation 3D -mat4 rotation3Drad(const vec3 &Axis, float angleRad); // rotation 3D -mat4 scaling3D (const vec3 &scaleVector); // scaling 3D -mat4 perspective3D(float d); // perspective 3D - -vec3 operator * (const vec3 &v, const mat3 &a); -vec2 operator * (const vec2 &v, const mat3 &a); -vec3 operator * (const vec3 &v, const mat4 &a); -vec4 operator * (const vec4 &v, const mat4 &a); - -#endif +/* + + algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +/************************************************************************** + + There are three vector classes and two matrix classes: vec2, vec3, + vec4, mat3, and mat4. + + All the standard arithmetic operations are defined, with '*' + for dot product of two vectors and multiplication of two matrices, + and '^' for cross product of two vectors. + + Additional functions include length(), normalize(), homogenize for + vectors, and print(), set(), apply() for all classes. + + There is a function transpose() for matrices, but note that it + does not actually change the matrix, + + When multiplied with a matrix, a vector is treated as a row vector + if it precedes the matrix (v*M), and as a column vector if it + follows the matrix (M*v). + + Matrices are stored in row-major form. + + A vector of one dimension (2d, 3d, or 4d) can be cast to a vector + of a higher or lower dimension. If casting to a higher dimension, + the new component is set by default to 1.0, unless a value is + specified: + vec3 a(1.0, 2.0, 3.0 ); + vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0}; + When casting to a lower dimension, the vector is homogenized in + the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the + resulting vector is {X/W, Y/W, Z/W}. It is up to the user to + insure the fourth component is not zero before casting. + + There are also the following function for building matrices: + identity2D(), translation2D(), rotation2D(), + scaling2D(), identity3D(), translation3D(), + rotation3D(), rotation3Drad(), scaling3D(), + perspective3D() + + NOTE: When compiling for Windows, include this file first, to avoid + certain name conflicts + + --------------------------------------------------------------------- + + Author: Jean-Francois DOUEg + Revised: Paul Rademacher + Version 3.2 - Feb 1998 + Revised: Nigel Stewart (GLUI Code Cleaning) + +**************************************************************************/ + +#ifndef GLUI_ALGEBRA3_H +#define GLUI_ALGEBRA3_H + +#include +#include +#include + +// this line defines a new type: pointer to a function which returns a +// float and takes as argument a float +typedef float (*V_FCT_PTR)(float); + +class vec2; +class vec3; +class vec4; +class mat3; +class mat4; + +#ifndef M_PI +#define M_PI 3.141592654 +#endif + +enum {VX, VY, VZ, VW}; // axes +enum {PA, PB, PC, PD}; // planes +enum {RED, GREEN, BLUE, ALPHA}; // colors +enum {KA, KD, KS, ES}; // phong coefficients + +/**************************************************************** + * * + * 2D Vector * + * * + ****************************************************************/ + +class vec2 +{ + friend class vec3; + +protected: + + float n[2]; + +public: + + // Constructors + + vec2(); + vec2(float x, float y); + vec2(const vec2 &v); // copy constructor + vec2(const vec3 &v); // cast v3 to v2 + vec2(const vec3 &v, int dropAxis); // cast v3 to v2 + + // Assignment operators + + vec2 &operator = (const vec2 &v); // assignment of a vec2 + vec2 &operator += (const vec2 &v); // incrementation by a vec2 + vec2 &operator -= (const vec2 &v); // decrementation by a vec2 + vec2 &operator *= (float d); // multiplication by a constant + vec2 &operator /= (float d); // division by a constant + + // special functions + + float length() const; // length of a vec2 + float length2() const; // squared length of a vec2 + vec2 &normalize(); // normalize a vec2 + vec2 &apply(V_FCT_PTR fct); // apply a func. to each component + void set(float x, float y); // set vector + + float &operator [] (int i); // indexing + const float &operator [] (int i) const; // indexing + + // friends + + friend vec2 operator - (const vec2 &v); // -v1 + friend vec2 operator + (const vec2 &a, const vec2 &b); // v1 + v2 + friend vec2 operator - (const vec2 &a, const vec2 &b); // v1 - v2 + friend vec2 operator * (const vec2 &a, float d); // v1 * 3.0 + friend vec2 operator * (float d, const vec2 &a); // 3.0 * v1 + friend vec2 operator * (const mat3 &a, const vec2 &v); // M . v + friend vec2 operator * (const vec2 &v, const mat3 &a); // v . M + friend float operator * (const vec2 &a, const vec2 &b); // dot product + friend vec2 operator / (const vec2 &a, float d); // v1 / 3.0 + friend vec3 operator ^ (const vec2 &a, const vec2 &b); // cross product + friend int operator == (const vec2 &a, const vec2 &b); // v1 == v2 ? + friend int operator != (const vec2 &a, const vec2 &b); // v1 != v2 ? + //friend ostream& operator << (ostream& s, vec2& v); // output to stream + //friend istream& operator >> (istream& s, vec2& v); // input from strm. + friend void swap(vec2 &a, vec2 &b); // swap v1 & v2 + friend vec2 min_vec(const vec2 &a, const vec2 &b); // min(v1, v2) + friend vec2 max_vec(const vec2 &a, const vec2 &b); // max(v1, v2) + friend vec2 prod (const vec2 &a, const vec2 &b); // term by term * +}; + +/**************************************************************** + * * + * 3D Vector * + * * + ****************************************************************/ + +class vec3 +{ + friend class vec2; + friend class vec4; + friend class mat3; + +protected: + + float n[3]; + +public: + + // Constructors + + vec3(); + vec3(float x, float y, float z); + vec3(const vec3 &v); // copy constructor + vec3(const vec2 &v); // cast v2 to v3 + vec3(const vec2 &v, float d); // cast v2 to v3 + vec3(const vec4 &v); // cast v4 to v3 + vec3(const vec4 &v, int dropAxis); // cast v4 to v3 + + // Assignment operators + + vec3 &operator = (const vec3 &v); // assignment of a vec3 + vec3 &operator += (const vec3 &v); // incrementation by a vec3 + vec3 &operator -= (const vec3 &v); // decrementation by a vec3 + vec3 &operator *= (float d); // multiplication by a constant + vec3 &operator /= (float d); // division by a constant + + // special functions + + float length() const; // length of a vec3 + float length2() const; // squared length of a vec3 + vec3& normalize(); // normalize a vec3 + vec3& homogenize(); // homogenize (div by Z) + vec3& apply(V_FCT_PTR fct); // apply a func. to each component + void set(float x, float y, float z); // set vector + + void print(FILE *file, const char *name) const; // print vector to a file + + + float &operator [] (int i); // indexing + const float &operator [] (int i) const; // indexing + + // friends + + friend vec3 operator - (const vec3 &v); // -v1 + friend vec3 operator + (const vec3 &a, const vec3 &b); // v1 + v2 + friend vec3 operator - (const vec3 &a, const vec3 &b); // v1 - v2 + friend vec3 operator * (const vec3 &a, float d); // v1 * 3.0 + friend vec3 operator * (float d, const vec3 &a); // 3.0 * v1 + friend vec3 operator * (const mat4 &a, const vec3 &v); // M . v + friend vec3 operator * (const vec3 &v, const mat4 &a); // v . M + friend float operator * (const vec3 &a, const vec3 &b); // dot product + friend vec3 operator / (const vec3 &a, float d); // v1 / 3.0 + friend vec3 operator ^ (const vec3 &a, const vec3 &b); // cross product + friend int operator == (const vec3 &a, const vec3 &b); // v1 == v2 ? + friend int operator != (const vec3 &a, const vec3 &b); // v1 != v2 ? + //friend ostream& operator << (ostream& s, vec3& v); // output to stream + //friend istream& operator >> (istream& s, vec3& v); // input from strm. + friend void swap(vec3 &a, vec3 &b); // swap v1 & v2 + friend vec3 min_vec(const vec3 &a, const vec3 &b); // min(v1, v2) + friend vec3 max_vec(const vec3 &a, const vec3 &b); // max(v1, v2) + friend vec3 prod(const vec3 &a, const vec3 &b); // term by term * + + // necessary friend declarations + + friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform + friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform + friend mat3 operator * (const mat3 &a, const mat3 &b); // matrix 3 product +}; + +/**************************************************************** + * * + * 4D Vector * + * * + ****************************************************************/ + +class vec4 +{ + friend class vec3; + friend class mat4; + +protected: + + float n[4]; + +public: + + // Constructors + + vec4(); + vec4(float x, float y, float z, float w); + vec4(const vec4 &v); // copy constructor + vec4(const vec3 &v); // cast vec3 to vec4 + vec4(const vec3 &v, float d); // cast vec3 to vec4 + + // Assignment operators + + vec4 &operator = (const vec4 &v); // assignment of a vec4 + vec4 &operator += (const vec4 &v); // incrementation by a vec4 + vec4 &operator -= (const vec4 &v); // decrementation by a vec4 + vec4 &operator *= (float d); // multiplication by a constant + vec4 &operator /= (float d); // division by a constant + + // special functions + + float length() const; // length of a vec4 + float length2() const; // squared length of a vec4 + vec4 &normalize(); // normalize a vec4 + vec4 &apply(V_FCT_PTR fct); // apply a func. to each component + vec4 &homogenize(); + + void print(FILE *file, const char *name) const; // print vector to a file + + void set(float x, float y, float z, float a); + + float &operator [] (int i); // indexing + const float &operator [] (int i) const; // indexing + + // friends + + friend vec4 operator - (const vec4 &v); // -v1 + friend vec4 operator + (const vec4 &a, const vec4 &b); // v1 + v2 + friend vec4 operator - (const vec4 &a, const vec4 &b); // v1 - v2 + friend vec4 operator * (const vec4 &a, float d); // v1 * 3.0 + friend vec4 operator * (float d, const vec4 &a); // 3.0 * v1 + friend vec4 operator * (const mat4 &a, const vec4 &v); // M . v + friend vec4 operator * (const vec4 &v, const mat4 &a); // v . M + friend float operator * (const vec4 &a, const vec4 &b); // dot product + friend vec4 operator / (const vec4 &a, float d); // v1 / 3.0 + friend int operator == (const vec4 &a, const vec4 &b); // v1 == v2 ? + friend int operator != (const vec4 &a, const vec4 &b); // v1 != v2 ? + //friend ostream& operator << (ostream& s, vec4& v); // output to stream + //friend istream& operator >> (istream& s, vec4& v); // input from strm. + friend void swap(vec4 &a, vec4 &b); // swap v1 & v2 + friend vec4 min_vec(const vec4 &a, const vec4 &b); // min(v1, v2) + friend vec4 max_vec(const vec4 &a, const vec4 &b); // max(v1, v2) + friend vec4 prod (const vec4 &a, const vec4 &b); // term by term * + + // necessary friend declarations + + friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform + friend mat4 operator * (const mat4 &a, const mat4 &b); // matrix 4 product +}; + +/**************************************************************** + * * + * 3x3 Matrix * + * * + ****************************************************************/ + +class mat3 +{ +protected: + + vec3 v[3]; + +public: + + // Constructors + + mat3(); + mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2); + mat3(const mat3 &m); + + // Assignment operators + + mat3 &operator = (const mat3 &m); // assignment of a mat3 + mat3 &operator += (const mat3 &m); // incrementation by a mat3 + mat3 &operator -= (const mat3 &m); // decrementation by a mat3 + mat3 &operator *= (float d); // multiplication by a constant + mat3 &operator /= (float d); // division by a constant + + // special functions + + mat3 transpose() const; // transpose + mat3 inverse() const; // inverse + mat3 &apply(V_FCT_PTR fct); // apply a func. to each element + + void print(FILE *file, const char *name ) const; // print matrix to a file + + void set(const vec3 &v0, const vec3 &v1, const vec3 &v2); + + vec3 &operator [] (int i); // indexing + const vec3 &operator [] (int i) const; // indexing + + // friends + + friend mat3 operator - (const mat3 &a); // -m1 + friend mat3 operator + (const mat3 &a, const mat3 &b); // m1 + m2 + friend mat3 operator - (const mat3 &a, const mat3 &b); // m1 - m2 + friend mat3 operator * (const mat3 &a, const mat3 &b); // m1 * m2 + friend mat3 operator * (const mat3 &a, float d); // m1 * 3.0 + friend mat3 operator * (float d, const mat3 &a); // 3.0 * m1 + friend mat3 operator / (const mat3 &a, float d); // m1 / 3.0 + friend int operator == (const mat3 &a, const mat3 &b); // m1 == m2 ? + friend int operator != (const mat3 &a, const mat3 &b); // m1 != m2 ? + //friend ostream& operator << (ostream& s, mat3& m); // output to stream + //friend istream& operator >> (istream& s, mat3& m); // input from strm. + friend void swap(mat3 &a, mat3 &b); // swap m1 & m2 + + // necessary friend declarations + + friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform + friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform +}; + +/**************************************************************** + * * + * 4x4 Matrix * + * * + ****************************************************************/ + +class mat4 +{ +protected: + + vec4 v[4]; + +public: + + // Constructors + + mat4(); + mat4(const vec4 &v0, const vec4 &v1, const vec4 &v2, const vec4 &v3); + mat4(const mat4 &m); + mat4(float a00, float a01, float a02, float a03, + float a10, float a11, float a12, float a13, + float a20, float a21, float a22, float a23, + float a30, float a31, float a32, float a33 ); + + + // Assignment operators + + mat4 &operator = (const mat4 &m); // assignment of a mat4 + mat4 &operator += (const mat4 &m); // incrementation by a mat4 + mat4 &operator -= (const mat4 &m); // decrementation by a mat4 + mat4 &operator *= (float d); // multiplication by a constant + mat4 &operator /= (float d); // division by a constant + + // special functions + + mat4 transpose() const; // transpose + mat4 inverse() const; // inverse + mat4 &apply(V_FCT_PTR fct); // apply a func. to each element + + void print(FILE *file, const char *name) const; // print matrix to a file + + vec4 &operator [] (int i); // indexing + const vec4 &operator [] (int i) const; // indexing + + void swap_rows(int i, int j); // swap rows i and j + void swap_cols(int i, int j); // swap cols i and j + + // friends + + friend mat4 operator - (const mat4 &a); // -m1 + friend mat4 operator + (const mat4 &a, const mat4 &b); // m1 + m2 + friend mat4 operator - (const mat4 &a, const mat4 &b); // m1 - m2 + friend mat4 operator * (const mat4 &a, const mat4 &b); // m1 * m2 + friend mat4 operator * (const mat4 &a, float d); // m1 * 4.0 + friend mat4 operator * (float d, const mat4 &a); // 4.0 * m1 + friend mat4 operator / (const mat4 &a, float d); // m1 / 3.0 + friend int operator == (const mat4 &a, const mat4 &b); // m1 == m2 ? + friend int operator != (const mat4 &a, const mat4 &b); // m1 != m2 ? + //friend ostream& operator << (ostream& s, mat4& m); // output to stream + //friend istream& operator >> (istream& s, mat4& m); // input from strm. + friend void swap(mat4 &a, mat4 &b); // swap m1 & m2 + + // necessary friend declarations + + friend vec4 operator * (const mat4 &a, const vec4 &v); // linear transform + //friend vec4 operator * (const vec4& v, const mat4& a); // linear transform + friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform + friend vec3 operator * (const vec3 &v, const mat4 &a); // linear transform +}; + +/**************************************************************** + * * + * 2D functions and 3D functions * + * * + ****************************************************************/ + +mat3 identity2D (); // identity 2D +mat3 translation2D(const vec2 &v); // translation 2D +mat3 rotation2D (const vec2 &Center, float angleDeg); // rotation 2D +mat3 scaling2D (const vec2 &scaleVector); // scaling 2D +mat4 identity3D (); // identity 3D +mat4 translation3D(const vec3 &v); // translation 3D +mat4 rotation3D (const vec3 &Axis, float angleDeg); // rotation 3D +mat4 rotation3Drad(const vec3 &Axis, float angleRad); // rotation 3D +mat4 scaling3D (const vec3 &scaleVector); // scaling 3D +mat4 perspective3D(float d); // perspective 3D + +vec3 operator * (const vec3 &v, const mat3 &a); +vec2 operator * (const vec2 &v, const mat3 &a); +vec3 operator * (const vec3 &v, const mat4 &a); +vec4 operator * (const vec4 &v, const mat4 &a); + +#endif diff --git a/Extras/glui/arcball.cpp b/Extras/glui/arcball.cpp index d233c7fc0..63c983e68 100644 --- a/Extras/glui/arcball.cpp +++ b/Extras/glui/arcball.cpp @@ -1,237 +1,237 @@ -/********************************************************************** - - arcball.cpp - - - -------------------------------------------------- - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - Feb 1998, Paul Rademacher (rademach@cs.unc.edu) - Oct 2003, Nigel Stewart - GLUI Code Cleaning - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -**********************************************************************/ - -#include "arcball.h" - -#include - - -/**************************************** Arcball::Arcball() ****/ -/* Default (void) constructor for Arcball */ - -Arcball::Arcball() -{ - rot_ptr = &rot; - init(); -} - -/**************************************** Arcball::Arcball() ****/ -/* Takes as argument a mat4 to use instead of the internal rot */ - -Arcball::Arcball(mat4 *mtx) -{ - rot_ptr = mtx; -} - - -/**************************************** Arcball::Arcball() ****/ -/* A constructor that accepts the screen center and arcball radius*/ - -Arcball::Arcball(const vec2 &_center, float _radius) -{ - rot_ptr = &rot; - init(); - set_params(_center, _radius); -} - - -/************************************** Arcball::set_params() ****/ - -void Arcball::set_params(const vec2 &_center, float _radius) -{ - center = _center; - radius = _radius; -} - -/*************************************** Arcball::init() **********/ - -void Arcball::init() -{ - center.set( 0.0, 0.0 ); - radius = 1.0; - q_now = quat_identity(); - *rot_ptr = identity3D(); - q_increment = quat_identity(); - rot_increment = identity3D(); - is_mouse_down = false; - is_spinning = false; - damp_factor = 0.0; - zero_increment = true; -} - -/*********************************** Arcball::mouse_to_sphere() ****/ - -vec3 Arcball::mouse_to_sphere(const vec2 &p) -{ - float mag; - vec2 v2 = (p - center) / radius; - vec3 v3( v2[0], v2[1], 0.0 ); - - mag = v2*v2; - - if ( mag > 1.0 ) - v3.normalize(); - else - v3[VZ] = (float) sqrt( 1.0 - mag ); - - /* Now we add constraints - X takes precedence over Y */ - if ( constraint_x ) - { - v3 = constrain_vector( v3, vec3( 1.0, 0.0, 0.0 )); - } - else if ( constraint_y ) - { - v3 = constrain_vector( v3, vec3( 0.0, 1.0, 0.0 )); - } - - return v3; -} - - -/************************************ Arcball::constrain_vector() ****/ - -vec3 Arcball::constrain_vector(const vec3 &vector, const vec3 &axis) -{ - return (vector-(vector*axis)*axis).normalize(); -} - -/************************************ Arcball::mouse_down() **********/ - -void Arcball::mouse_down(int x, int y) -{ - down_pt.set( (float)x, (float) y ); - is_mouse_down = true; - - q_increment = quat_identity(); - rot_increment = identity3D(); - zero_increment = true; -} - - -/************************************ Arcball::mouse_up() **********/ - -void Arcball::mouse_up() -{ - q_now = q_drag * q_now; - is_mouse_down = false; -} - - -/********************************** Arcball::mouse_motion() **********/ - -void Arcball::mouse_motion(int x, int y, int shift, int ctrl, int alt) -{ - /* Set the X constraint if CONTROL key is pressed, Y if ALT key */ - set_constraints( ctrl != 0, alt != 0 ); - - vec2 new_pt( (float)x, (float) y ); - vec3 v0 = mouse_to_sphere( down_pt ); - vec3 v1 = mouse_to_sphere( new_pt ); - - vec3 cross = v0^v1; - - q_drag.set( cross, v0 * v1 ); - - // *rot_ptr = (q_drag * q_now).to_mat4(); - mat4 temp = q_drag.to_mat4(); - *rot_ptr = *rot_ptr * temp; - - down_pt = new_pt; - - /* We keep a copy of the current incremental rotation (= q_drag) */ - q_increment = q_drag; - rot_increment = q_increment.to_mat4(); - - set_constraints(false, false); - - if ( q_increment.s < .999999 ) - { - is_spinning = true; - zero_increment = false; - } - else - { - is_spinning = false; - zero_increment = true; - } -} - - -/********************************** Arcball::mouse_motion() **********/ - -void Arcball::mouse_motion(int x, int y) -{ - mouse_motion(x, y, 0, 0, 0); -} - - -/***************************** Arcball::set_constraints() **********/ - -void Arcball::set_constraints(bool _constraint_x, bool _constraint_y) -{ - constraint_x = _constraint_x; - constraint_y = _constraint_y; -} - -/***************************** Arcball::idle() *********************/ - -void Arcball::idle() -{ - if (is_mouse_down) - { - is_spinning = false; - zero_increment = true; - } - - if (damp_factor < 1.0f) - q_increment.scale_angle(1.0f - damp_factor); - - rot_increment = q_increment.to_mat4(); - - if (q_increment.s >= .999999f) - { - is_spinning = false; - zero_increment = true; - } -} - - -/************************ Arcball::set_damping() *********************/ - -void Arcball::set_damping(float d) -{ - damp_factor = d; -} - - - - - +/********************************************************************** + + arcball.cpp + + + -------------------------------------------------- + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + Feb 1998, Paul Rademacher (rademach@cs.unc.edu) + Oct 2003, Nigel Stewart - GLUI Code Cleaning + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +**********************************************************************/ + +#include "arcball.h" + +#include + + +/**************************************** Arcball::Arcball() ****/ +/* Default (void) constructor for Arcball */ + +Arcball::Arcball() +{ + rot_ptr = &rot; + init(); +} + +/**************************************** Arcball::Arcball() ****/ +/* Takes as argument a mat4 to use instead of the internal rot */ + +Arcball::Arcball(mat4 *mtx) +{ + rot_ptr = mtx; +} + + +/**************************************** Arcball::Arcball() ****/ +/* A constructor that accepts the screen center and arcball radius*/ + +Arcball::Arcball(const vec2 &_center, float _radius) +{ + rot_ptr = &rot; + init(); + set_params(_center, _radius); +} + + +/************************************** Arcball::set_params() ****/ + +void Arcball::set_params(const vec2 &_center, float _radius) +{ + center = _center; + radius = _radius; +} + +/*************************************** Arcball::init() **********/ + +void Arcball::init() +{ + center.set( 0.0, 0.0 ); + radius = 1.0; + q_now = quat_identity(); + *rot_ptr = identity3D(); + q_increment = quat_identity(); + rot_increment = identity3D(); + is_mouse_down = false; + is_spinning = false; + damp_factor = 0.0; + zero_increment = true; +} + +/*********************************** Arcball::mouse_to_sphere() ****/ + +vec3 Arcball::mouse_to_sphere(const vec2 &p) +{ + float mag; + vec2 v2 = (p - center) / radius; + vec3 v3( v2[0], v2[1], 0.0 ); + + mag = v2*v2; + + if ( mag > 1.0 ) + v3.normalize(); + else + v3[VZ] = (float) sqrt( 1.0 - mag ); + + /* Now we add constraints - X takes precedence over Y */ + if ( constraint_x ) + { + v3 = constrain_vector( v3, vec3( 1.0, 0.0, 0.0 )); + } + else if ( constraint_y ) + { + v3 = constrain_vector( v3, vec3( 0.0, 1.0, 0.0 )); + } + + return v3; +} + + +/************************************ Arcball::constrain_vector() ****/ + +vec3 Arcball::constrain_vector(const vec3 &vector, const vec3 &axis) +{ + return (vector-(vector*axis)*axis).normalize(); +} + +/************************************ Arcball::mouse_down() **********/ + +void Arcball::mouse_down(int x, int y) +{ + down_pt.set( (float)x, (float) y ); + is_mouse_down = true; + + q_increment = quat_identity(); + rot_increment = identity3D(); + zero_increment = true; +} + + +/************************************ Arcball::mouse_up() **********/ + +void Arcball::mouse_up() +{ + q_now = q_drag * q_now; + is_mouse_down = false; +} + + +/********************************** Arcball::mouse_motion() **********/ + +void Arcball::mouse_motion(int x, int y, int shift, int ctrl, int alt) +{ + /* Set the X constraint if CONTROL key is pressed, Y if ALT key */ + set_constraints( ctrl != 0, alt != 0 ); + + vec2 new_pt( (float)x, (float) y ); + vec3 v0 = mouse_to_sphere( down_pt ); + vec3 v1 = mouse_to_sphere( new_pt ); + + vec3 cross = v0^v1; + + q_drag.set( cross, v0 * v1 ); + + // *rot_ptr = (q_drag * q_now).to_mat4(); + mat4 temp = q_drag.to_mat4(); + *rot_ptr = *rot_ptr * temp; + + down_pt = new_pt; + + /* We keep a copy of the current incremental rotation (= q_drag) */ + q_increment = q_drag; + rot_increment = q_increment.to_mat4(); + + set_constraints(false, false); + + if ( q_increment.s < .999999 ) + { + is_spinning = true; + zero_increment = false; + } + else + { + is_spinning = false; + zero_increment = true; + } +} + + +/********************************** Arcball::mouse_motion() **********/ + +void Arcball::mouse_motion(int x, int y) +{ + mouse_motion(x, y, 0, 0, 0); +} + + +/***************************** Arcball::set_constraints() **********/ + +void Arcball::set_constraints(bool _constraint_x, bool _constraint_y) +{ + constraint_x = _constraint_x; + constraint_y = _constraint_y; +} + +/***************************** Arcball::idle() *********************/ + +void Arcball::idle() +{ + if (is_mouse_down) + { + is_spinning = false; + zero_increment = true; + } + + if (damp_factor < 1.0f) + q_increment.scale_angle(1.0f - damp_factor); + + rot_increment = q_increment.to_mat4(); + + if (q_increment.s >= .999999f) + { + is_spinning = false; + zero_increment = true; + } +} + + +/************************ Arcball::set_damping() *********************/ + +void Arcball::set_damping(float d) +{ + damp_factor = d; +} + + + + + diff --git a/Extras/glui/arcball.h b/Extras/glui/arcball.h index ef69afc95..18edd0598 100644 --- a/Extras/glui/arcball.h +++ b/Extras/glui/arcball.h @@ -1,97 +1,97 @@ -/********************************************************************** - - arcball.h - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - Feb 1998, Paul Rademacher (rademach@cs.unc.edu) - Oct 2003, Nigel Stewart - GLUI Code Cleaning - - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - --------------------------------------------------------------------- - - A C++ class that implements the Arcball, as described by Ken - Shoemake in Graphics Gems IV. - This class takes as input mouse events (mouse down, mouse drag, - mouse up), and creates the appropriate quaternions and 4x4 matrices - to represent the rotation given by the mouse. - - This class is used as follows: - - initialize [either in the constructor or with set_params()], the - center position (x,y) of the arcball on the screen, and the radius - - on mouse down, call mouse_down(x,y) with the mouse position - - as the mouse is dragged, repeatedly call mouse_motion() with the - current x and y positions. One can optionally pass in the current - state of the SHIFT, ALT, and CONTROL keys (passing zero if keys - are not pressed, non-zero otherwise), which constrains - the rotation to certain axes (X for CONTROL, Y for ALT). - - when the mouse button is released, call mouse_up() - - Axis constraints can also be explicitly set with the - set_constraints() function. - - The current rotation is stored in the 4x4 float matrix 'rot'. - It is also stored in the quaternion 'q_now'. - -**********************************************************************/ - -#ifndef GLUI_ARCBALL_H -#define GLUI_ARCBALL_H - -#include "glui_internal.h" -#include "algebra3.h" -#include "quaternion.h" - -class Arcball -{ -public: - Arcball(); - Arcball(mat4 *mtx); - Arcball(const vec2 ¢er, float radius); - - void set_damping(float d); - void idle(); - void mouse_down(int x, int y); - void mouse_up(); - void mouse_motion(int x, int y, int shift, int ctrl, int alt); - void mouse_motion(int x, int y); - void set_constraints(bool constrain_x, bool constrain_y); - void set_params(const vec2 ¢er, float radius); - void reset_mouse(); - void init(); - - vec3 constrain_vector(const vec3 &vector, const vec3 &axis); - vec3 mouse_to_sphere(const vec2 &p); - - //public: - int is_mouse_down; /* true for down, false for up */ - int is_spinning; - quat q_now, q_down, q_drag, q_increment; - vec2 down_pt; - mat4 rot, rot_increment; - mat4 *rot_ptr; - - bool constraint_x, constraint_y; - vec2 center; - float radius, damp_factor; - int zero_increment; -}; - -#endif +/********************************************************************** + + arcball.h + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + Feb 1998, Paul Rademacher (rademach@cs.unc.edu) + Oct 2003, Nigel Stewart - GLUI Code Cleaning + + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + --------------------------------------------------------------------- + + A C++ class that implements the Arcball, as described by Ken + Shoemake in Graphics Gems IV. + This class takes as input mouse events (mouse down, mouse drag, + mouse up), and creates the appropriate quaternions and 4x4 matrices + to represent the rotation given by the mouse. + + This class is used as follows: + - initialize [either in the constructor or with set_params()], the + center position (x,y) of the arcball on the screen, and the radius + - on mouse down, call mouse_down(x,y) with the mouse position + - as the mouse is dragged, repeatedly call mouse_motion() with the + current x and y positions. One can optionally pass in the current + state of the SHIFT, ALT, and CONTROL keys (passing zero if keys + are not pressed, non-zero otherwise), which constrains + the rotation to certain axes (X for CONTROL, Y for ALT). + - when the mouse button is released, call mouse_up() + + Axis constraints can also be explicitly set with the + set_constraints() function. + + The current rotation is stored in the 4x4 float matrix 'rot'. + It is also stored in the quaternion 'q_now'. + +**********************************************************************/ + +#ifndef GLUI_ARCBALL_H +#define GLUI_ARCBALL_H + +#include "glui_internal.h" +#include "algebra3.h" +#include "quaternion.h" + +class Arcball +{ +public: + Arcball(); + Arcball(mat4 *mtx); + Arcball(const vec2 ¢er, float radius); + + void set_damping(float d); + void idle(); + void mouse_down(int x, int y); + void mouse_up(); + void mouse_motion(int x, int y, int shift, int ctrl, int alt); + void mouse_motion(int x, int y); + void set_constraints(bool constrain_x, bool constrain_y); + void set_params(const vec2 ¢er, float radius); + void reset_mouse(); + void init(); + + vec3 constrain_vector(const vec3 &vector, const vec3 &axis); + vec3 mouse_to_sphere(const vec2 &p); + + //public: + int is_mouse_down; /* true for down, false for up */ + int is_spinning; + quat q_now, q_down, q_drag, q_increment; + vec2 down_pt; + mat4 rot, rot_increment; + mat4 *rot_ptr; + + bool constraint_x, constraint_y; + vec2 center; + float radius, damp_factor; + int zero_increment; +}; + +#endif diff --git a/Extras/glui/glui.cpp b/Extras/glui/glui.cpp index ecf769d02..239b12f5a 100644 --- a/Extras/glui/glui.cpp +++ b/Extras/glui/glui.cpp @@ -1,2171 +1,2171 @@ -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - --------------------------- - - glui.cpp - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ -#include "glui_internal_control.h" - - -/** - Note: moving this routine here from glui_add_controls.cpp prevents the linker - from touching glui_add_controls.o in non-deprecated programs, which - descreases the linked size of small GLUI programs substantially (100K+). (OSL 2006/06) -*/ -void GLUI_Node::add_child_to_control(GLUI_Node *parent,GLUI_Control *child) -{ - GLUI_Control *parent_control; - - /*** Collapsible nodes have to be handled differently, b/c the first and - last children are swapped in and out ***/ - parent_control = ((GLUI_Control*)parent); - if ( parent_control->collapsible == true ) { - if ( NOT parent_control->is_open ) { - /** Swap in the original first and last children **/ - parent_control->child_head = parent_control->collapsed_node.child_head; - parent_control->child_tail = parent_control->collapsed_node.child_tail; - - /*** Link this control ***/ - child->link_this_to_parent_last( parent_control ); - - /** Swap the children back out ***/ - parent_control->collapsed_node.child_head = parent_control->child_head; - parent_control->collapsed_node.child_tail = parent_control->child_tail; - parent_control->child_head = NULL; - parent_control->child_tail = NULL; - } - else { - child->link_this_to_parent_last( parent_control ); - } - } - else { - child->link_this_to_parent_last( parent_control ); - } - child->glui = (GLUI*) parent_control->glui; - child->update_size(); - child->enabled = parent_control->enabled; - child->glui->refresh(); - - /** Now set the 'hidden' var based on the parent **/ - if ( parent_control->hidden OR - (parent_control->collapsible AND NOT parent_control->is_open ) ) - { - child->hidden = true; - } -} - - -/************************************ GLUI_Node::add_control() **************/ - -int GLUI_Node::add_control( GLUI_Control *child ) -{ - add_child_to_control(this,child); - return true; -} - -/************************************ GLUI_Main::add_control() **************/ - -int GLUI_Main::add_control( GLUI_Node *parent, GLUI_Control *control ) -{ - add_child_to_control(parent,control); - return true; -} - - - -/*** This object must be used to create a GLUI ***/ - -GLUI_Master_Object GLUI_Master; - -/************************************ finish_drawing() *********** - Probably a silly routine. Called after all event handling callbacks. -*/ - -static void finish_drawing(void) -{ - glFinish(); -} - -/************************************ GLUI_CB::operator()() ************/ -void GLUI_CB::operator()(GLUI_Control*ctrl) const -{ - if (idCB) idCB(ctrl->user_id); - if (objCB) objCB(ctrl); -} - - -/************************************************ GLUI::GLUI() **********/ - -int GLUI::init( const char *text, long flags, int x, int y, int parent_window ) -{ - int old_glut_window; - - this->flags = flags; - - window_name = text; - - buffer_mode = buffer_back; ///< New smooth way - //buffer_mode = buffer_front; ///< Old flickery way (a bit faster). - - /*** We copy over the current window callthroughs ***/ - /*** (I think this might actually only be needed for subwindows) ***/ - /* glut_keyboard_CB = GLUI_Master.glut_keyboard_CB; - glut_reshape_CB = GLUI_Master.glut_reshape_CB; - glut_special_CB = GLUI_Master.glut_special_CB; - glut_mouse_CB = GLUI_Master.glut_mouse_CB;*/ - - - if ( (flags & GLUI_SUBWINDOW) != GLUI_SUBWINDOW ) { /* not a subwindow, creating a new top-level window */ - old_glut_window = glutGetWindow(); - - create_standalone_window( window_name.c_str(), x, y ); - setup_default_glut_callbacks(); - - if ( old_glut_window > 0 ) - glutSetWindow( old_glut_window ); - - top_level_glut_window_id = glut_window_id; - } - else /* *is* a subwindow */ - { - old_glut_window = glutGetWindow(); - - create_subwindow( parent_window, flags ); - setup_default_glut_callbacks(); - - if ( old_glut_window > 0 ) - glutSetWindow( old_glut_window ); - - top_level_glut_window_id = parent_window; - - /* - glutReshapeFunc( glui_parent_window_reshape_func ); - glutSpecialFunc( glui_parent_window_special_func ); - glutKeyboardFunc( glui_parent_window_keyboard_func ); - glutMouseFunc( glui_parent_window_mouse_func ); - */ - - } - - return true; -} - - -/**************************** GLUI_Main::create_standalone_window() ********/ - -void GLUI_Main::create_standalone_window( const char *name, int x, int y ) -{ - glutInitWindowSize( 100, 100 ); - if ( x >= 0 OR y >= 0 ) - glutInitWindowPosition( x, y ); - glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); - glut_window_id = glutCreateWindow( name ); -} - - -/******************************** GLUI_Main::create_subwindow() **********/ - -void GLUI_Main::create_subwindow( int parent_window, int window_alignment ) -{ - glut_window_id = glutCreateSubWindow(parent_window, 0,0, 100, 100); - this->parent_window = parent_window; -} - - -/**************************** GLUI_Main::setup_default_glut_callbacks() *****/ - -void GLUI_Main::setup_default_glut_callbacks( void ) -{ - glutDisplayFunc( glui_display_func ); - glutReshapeFunc( glui_reshape_func ); - glutKeyboardFunc( glui_keyboard_func ); - glutSpecialFunc( glui_special_func ); - glutMouseFunc( glui_mouse_func ); - glutMotionFunc( glui_motion_func ); - glutPassiveMotionFunc( glui_passive_motion_func ); - glutEntryFunc( glui_entry_func ); - glutVisibilityFunc( glui_visibility_func ); - /* glutIdleFunc( glui_idle_func ); // FIXME! 100% CPU usage! */ -} - - -/********************************************** glui_display_func() ********/ - -void glui_display_func(void) -{ - GLUI *glui; - - /* printf( "display func\n" ); */ - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->display(); - /* - Do not do anything after the above line, b/c the GLUI - window might have just closed itself - */ - } -} - - -/********************************************** glui_reshape_func() ********/ - -void glui_reshape_func(int w,int h ) -{ - GLUI *glui; - GLUI_Glut_Window *glut_window; - int current_window; - - /*printf( "glui_reshape_func(): %d w/h: %d/%d\n", glutGetWindow(), w, h ); */ - - current_window = glutGetWindow(); - - /*** First check if this is main glut window ***/ - glut_window = GLUI_Master.find_glut_window( current_window ); - if ( glut_window ) { - if (glut_window->glut_reshape_CB) glut_window->glut_reshape_CB(w,h); - - /*** Now send reshape events to all subwindows ***/ - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while(glui) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) { - glutSetWindow( glui->get_glut_window_id()); - glui->reshape(w,h); - /* glui->check_subwindow_position(); */ - } - glui = (GLUI*) glui->next(); - } - } - else { - /*** A standalone GLUI window ***/ - - glui = GLUI_Master.find_glui_by_window_id( current_window ); - - if ( glui ) { - glui->reshape(w,h); - } - } -} - -/********************************************** glui_keyboard_func() ********/ - -void glui_keyboard_func(unsigned char key, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - /*printf( "key: %d\n", current_window ); */ - - if ( glut_window ) { /** Was event in a GLUT window? **/ - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->keyboard(key,x,y); - finish_drawing(); - - glutSetWindow( current_window ); - } - else { - if (glut_window->glut_keyboard_CB) - glut_window->glut_keyboard_CB( key, x, y ); - } - } - else { /*** Nope, event was in a standalone GLUI window **/ - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->keyboard(key,x,y); - finish_drawing(); - } - } -} - - - - -void glui_special_up_func(int key, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - if (glut_window) /** Was event in a GLUT window? **/ - { - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) - { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->special_up(key,x,y); - finish_drawing(); - - glutSetWindow( current_window ); - } - else - { - if (glut_window->glut_special_up_CB) - glut_window->glut_special_up_CB( key, x, y ); - } - } - else /*** Nope, event was in a standalone GLUI window **/ - { - glui = GLUI_Master.find_glui_by_window_id(glutGetWindow()); - - if ( glui ) - { - glui->special_up(key,x,y); - finish_drawing(); - } - } -} - - - -/************************************************ glui_special_func() ********/ - -void glui_special_func(int key, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - if (glut_window) /** Was event in a GLUT window? **/ - { - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) - { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->special(key,x,y); - finish_drawing(); - - glutSetWindow( current_window ); - } - else - { - if (glut_window->glut_special_CB) - glut_window->glut_special_CB( key, x, y ); - } - } - else /*** Nope, event was in a standalone GLUI window **/ - { - glui = GLUI_Master.find_glui_by_window_id(glutGetWindow()); - - if ( glui ) - { - glui->special(key,x,y); - finish_drawing(); - } - } -} - -/********************************************** glui_mouse_func() ********/ - -void glui_mouse_func(int button, int state, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - if ( glut_window ) { /** Was event in a GLUT window? **/ - if ( GLUI_Master.active_control_glui != NULL ) - GLUI_Master.active_control_glui->deactivate_current_control(); - - if (glut_window->glut_mouse_CB) - glut_window->glut_mouse_CB( button, state, x, y ); - finish_drawing(); - } - else { /** Nope - event was in a GLUI standalone window **/ - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - if ( glui ) { - glui->passive_motion( 0,0 ); - glui->mouse( button, state, x, y ); - finish_drawing(); - } - } -} - - -/********************************************** glui_motion_func() ********/ - -void glui_motion_func(int x, int y) -{ - GLUI *glui; - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->motion(x,y); - finish_drawing(); - } - -} - - -/**************************************** glui_passive_motion_func() ********/ - -void glui_passive_motion_func(int x, int y) -{ - GLUI *glui; - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->passive_motion(x,y); - finish_drawing(); - } -} - - -/********************************************** glui_entry_func() ********/ - -void glui_entry_func(int state) -{ - GLUI *glui; - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->entry(state); - } -} - - -/******************************************** glui_visibility_func() ********/ - -void glui_visibility_func(int state) -{ - GLUI *glui; - - /* printf( "IN GLUI VISIBILITY()\n" ); */ - /* fflush( stdout ); */ - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->visibility(state); - } -} - - -/********************************************** glui_idle_func() ********/ -/* Send idle event to each glui, then to the main window */ - -void glui_idle_func(void) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - glui->idle(); - finish_drawing(); - - glui = (GLUI*) glui->next(); - } - - if ( GLUI_Master.glut_idle_CB ) { - /*** We set the current glut window before calling the user's - idle function, even though glut explicitly says the window id is - undefined in an idle callback. ***/ - - /** Check what the current window is first ***/ - - /*** Arbitrarily set the window id to the main gfx window of the - first glui window ***/ - /* int current_window, new_window; */ - /* current_window = glutGetWindow(); */ - /* if (GLUI_Master.gluis.first_child() != NULL ) { */ - /* new_window = ((GLUI_Main*)GLUI_Master.gluis.first_child())-> */ - /* main_gfx_window_id; */ - /* if ( new_window > 0 AND new_window != old_window ) { */ - /* --- Window is changed only if its not already the current window ---*/ - /* glutSetWindow( new_window ); */ - /* } */ - /*} */ - - GLUI_Master.glut_idle_CB(); - } -} - -/*********************************** GLUI_Master_Object::GLUI_Master_Object() ******/ - -GLUI_Master_Object::GLUI_Master_Object() -: glui_id_counter(1), - glut_idle_CB(NULL) -{ -} - -GLUI_Master_Object::~GLUI_Master_Object() -{ -} - -/*********************************** GLUI_Master_Object::create_glui() ******/ - -GLUI *GLUI_Master_Object::create_glui( const char *name, long flags,int x,int y ) -{ - GLUI *new_glui = new GLUI; - new_glui->init( name, flags, x, y, -1 ); - new_glui->link_this_to_parent_last( &this->gluis ); - return new_glui; -} - - -/************************** GLUI_Master_Object::create_glui_subwindow() ******/ - -GLUI *GLUI_Master_Object::create_glui_subwindow( int parent_window, - long flags ) -{ - GLUI *new_glui = new GLUI; - GLUI_String new_name; - glui_format_str( new_name, "subwin_%p", this ); - - new_glui->init( new_name.c_str(), flags | GLUI_SUBWINDOW, 0,0, - parent_window ); - new_glui->main_panel->set_int_val( GLUI_PANEL_EMBOSSED ); - new_glui->link_this_to_parent_last( &this->gluis ); - return new_glui; -} - - -/********************** GLUI_Master_Object::find_glui_by_window_id() ********/ - -GLUI *GLUI_Master_Object::find_glui_by_window_id( int window_id ) -{ - GLUI_Node *node; - - node = gluis.first_child(); - while( node ) { - if ( ((GLUI*)node)->get_glut_window_id() == window_id ) - return (GLUI*) node; - - node = node->next(); - } - return NULL; -} - - -/******************************************** GLUI_Main::display() **********/ - -void GLUI_Main::display( void ) -{ - int win_w, win_h; - - /* SUBTLE: on freeGLUT, the correct window is always already set. - But older versions of GLUT need this call, or else subwindows - don't update properly when resizing or damage-painting. - */ - glutSetWindow( glut_window_id ); - - /* Set up OpenGL state for widget drawing */ - glDisable( GL_DEPTH_TEST ); - glCullFace( GL_BACK ); - glDisable( GL_CULL_FACE ); - glDisable( GL_LIGHTING ); - set_current_draw_buffer(); - - /**** This function is used as a special place to do 'safe' processing, - e.g., handling window close requests. - That is, we can't close the window directly in the callback, so - we set a flag, post a redisplay message (which eventually calls - this function), then close the window safely in here. ****/ - if ( closing ) { - close_internal(); - return; - } - - /* if ( TEST_AND( this->flags, GLUI_SUBWINDOW )) - check_subwindow_position(); - */ - - win_w = glutGet( GLUT_WINDOW_WIDTH ); - win_h = glutGet( GLUT_WINDOW_HEIGHT ); - - /*** Check here if the window needs resizing ***/ - if ( win_w != main_panel->w OR win_h != main_panel->h ) { - glutReshapeWindow( main_panel->w, main_panel->h ); - return; - } - - /******* Draw GLUI window ******/ - glClearColor( (float) bkgd_color.r / 255.0, - (float) bkgd_color.g / 255.0, - (float) bkgd_color.b / 255.0, - 1.0 ); - glClear( GL_COLOR_BUFFER_BIT ); /* | GL_DEPTH_BUFFER_BIT ); */ - - set_ortho_projection(); - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - /*** Rotate image so y increases downward. - In normal OpenGL, y increases upward. ***/ - glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); - - // Recursively draw the main panel - // main_panel->draw_bkgd_box( 0, 0, win_w, win_h ); - main_panel->draw_recursive( 0, 0 ); - - switch (buffer_mode) { - case buffer_front: /* Make sure drawing gets to screen */ - glFlush(); - break; - case buffer_back: /* Bring back buffer to front */ - glutSwapBuffers(); - break; - } -} - - - - -/*************************************** _glutBitmapWidthString() **********/ - -int _glutBitmapWidthString( void *font, const char *s ) -{ - const char *p = s; - int width = 0; - - while( *p != '\0' ) { - width += glutBitmapWidth( font, *p ); - p++; - } - - return width; -} - -/************************************ _glutBitmapString *********************/ -/* Displays the contents of a string using GLUT's bitmap character function */ -/* Does not handle newlines */ - -void _glutBitmapString( void *font, const char *s ) -{ - const char *p = s; - - while( *p != '\0' ) { - glutBitmapCharacter( font, *p ); - p++; - } -} - - - -/****************************** GLUI_Main::reshape() **************/ - -void GLUI_Main::reshape( int reshape_w, int reshape_h ) -{ - int new_w, new_h; - - pack_controls(); - - new_w = main_panel->w;/* + 1; */ - new_h = main_panel->h;/* + 1; */ - - if ( reshape_w != new_w OR reshape_h != new_h ) { - this->w = new_w; - this->h = new_h; - - glutReshapeWindow( new_w, new_h ); - } - else { - } - - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - check_subwindow_position(); - - /***** if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { - } - ****/ - } - - glViewport( 0, 0, new_w, new_h ); - - /* printf( "%d: %d\n", glutGetWindow(), this->flags ); */ - - glutPostRedisplay(); -} - - -/****************************** GLUI_Main::keyboard() **************/ - -void GLUI_Main::keyboard(unsigned char key, int x, int y) -{ - GLUI_Control *new_control; - - curr_modifiers = glutGetModifiers(); - - /*** If it's a tab or shift tab, we don't pass it on to the controls. - Instead, we use it to cycle through active controls ***/ - if ( key == '\t' AND !mouse_button_down AND - (!active_control || !active_control->wants_tabs())) { - if ( curr_modifiers & GLUT_ACTIVE_SHIFT ) { - new_control = find_prev_control( active_control ); - } - else { - new_control = find_next_control( active_control ); - } - - /* if ( new_control ) - printf( "new_control: %s\n", new_control->name ); - */ - - deactivate_current_control(); - activate_control( new_control, GLUI_ACTIVATE_TAB ); - } - else if ( key == ' ' AND active_control - AND active_control->spacebar_mouse_click ) { - /*** If the user presses the spacebar, and a non-edittext control - is active, we send it a mouse down event followed by a mouse up - event (simulated mouse-click) ***/ - - active_control->mouse_down_handler( 0, 0 ); - active_control->mouse_up_handler( 0, 0, true ); - } else { - /*** Pass the keystroke onto the active control, if any ***/ - if ( active_control != NULL ) - active_control->key_handler( key, curr_modifiers ); - } -} - - - -void GLUI_Main::special_up(int key, int x, int y) -{ - curr_modifiers = glutGetModifiers(); - - /*** Pass the keystroke onto the active control, if any ***/ - if ( active_control != NULL ) - active_control->special_up_handler( key, glutGetModifiers() ); -} - - -/****************************** GLUI_Main::special() **************/ - -void GLUI_Main::special(int key, int x, int y) -{ - curr_modifiers = glutGetModifiers(); - - /*** Pass the keystroke onto the active control, if any ***/ - if ( active_control != NULL ) - active_control->special_handler( key, glutGetModifiers() ); -} - - - -/****************************** GLUI_Main::mouse() **************/ - -void GLUI_Main::mouse(int button, int state, int x, int y) -{ - int callthrough; - GLUI_Control *control; - - /* printf( "MOUSE: %d %d\n", button, state ); */ - - callthrough = true; - - curr_modifiers = glutGetModifiers(); - - if ( button == GLUT_LEFT ) { - control = find_control( x, y ); - - /*if ( control ) printf( "control: %s\n", control->name.c_str() ); */ - - if ( mouse_button_down AND active_control != NULL AND - state == GLUT_UP ) - { - /** We just released the mouse, which was depressed at some control **/ - - callthrough = active_control-> - mouse_up_handler( x, y, control==active_control); - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - - if ( active_control AND - active_control->active_type == GLUI_CONTROL_ACTIVE_MOUSEDOWN AND 0) - { - /*** This is a control that needs to be deactivated when the - mouse button is released ****/ - deactivate_current_control(); - } - } - else { - if ( control ) { - if ( NOT mouse_button_down AND state == GLUT_DOWN ) { - /*** We just pressed the mouse down at some control ***/ - - if ( active_control != control ) { - if ( active_control != NULL ) { - /** There is an active control still - deactivate it ***/ - deactivate_current_control(); - } - } - - if ( control->enabled ) { - activate_control( control, GLUI_ACTIVATE_MOUSE ); - callthrough = control->mouse_down_handler( x, y ); - } - } - } - } - - if ( state == GLUT_DOWN ) - mouse_button_down = true; - else if ( state == GLUT_UP ) - mouse_button_down = false; - } - - /** - NO CALLTHROUGH NEEDED FOR MOUSE EVENTS - if ( callthrough AND glut_mouse_CB ) - glut_mouse_CB( button, state, x, y ); - **/ - - callthrough=callthrough; /* To get rid of compiler warnings */ -} - - -/****************************** GLUI_Main::motion() **************/ - -void GLUI_Main::motion(int x, int y) -{ - int callthrough; - GLUI_Control *control; - - /* printf( "MOTION: %d %d\n", x, y ); */ - - callthrough = true; - - control = find_control(x,y); - - if ( mouse_button_down AND active_control != NULL ) { - callthrough = - active_control->mouse_held_down_handler(x,y,control==active_control); - } - - /** - NO CALLTHROUGH NEEDED FOR MOUSE EVENTS - - if ( callthrough AND glut_motion_CB ) - glut_motion_CB(x,y); - **/ - - callthrough=callthrough; /* To get rid of compiler warnings */ -} - - -/*********************** GLUI_Main::passive_motion() **************/ - -void GLUI_Main::passive_motion(int x, int y) -{ - GLUI_Control *control; - - control = find_control( x, y ); - - /* printf( "%p %p\n", control, mouse_over_control ); */ - - if ( control != mouse_over_control ) { - if ( mouse_over_control ) { - mouse_over_control->mouse_over( false, x, y ); - } - - if ( control ) { - control->mouse_over( true, x, y ); - mouse_over_control = control; - } - } - - /* - if ( curr_cursor != GLUT_CURSOR_INHERIT ) { - curr_cursor = GLUT_CURSOR_INHERIT; - glutSetCursor( GLUT_CURSOR_INHERIT ); - }*/ - -} - - -/****************************** GLUI_Main::entry() **************/ - -void GLUI_Main::entry(int state) -{ - /*if ( NOT active_control OR ( active_control AND ( active_control->type == GLUI_CONTROL_EDITTEXT - OR active_control->type == GLUI_CONTROL_SPINNER) ) )*/ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); -} - - -/****************************** GLUI_Main::visibility() **************/ - -void GLUI_Main::visibility(int state) -{ -} - - -/****************************** GLUI_Main::idle() **************/ - -void GLUI_Main::idle(void) -{ - /*** Pass the idle event onto the active control, if any ***/ - - /* printf( "IDLE \t" ); */ - - if ( active_control != NULL ) { - /* First we check if the control actually needs the idle right now. - Otherwise, let's avoid wasting cycles and OpenGL context switching */ - - if ( active_control->needs_idle() ) { - /*** Set the current glut window to the glui window */ - /*** But don't change the window if we're already at that window ***/ - - if ( glut_window_id > 0 AND glutGetWindow() != glut_window_id ) { - glutSetWindow( glut_window_id ); - } - - active_control->idle(); - } - } -} - -int GLUI_Main::needs_idle( void ) -{ - return active_control != NULL && active_control->needs_idle(); -} - - -/******************************************* GLUI_Main::find_control() ******/ - -GLUI_Control *GLUI_Main::find_control( int x, int y ) -{ - GLUI_Control *node, *last_container; - - last_container = NULL; - - node = main_panel; - while( node != NULL ) { - if ( !node->dynamicCastGLUI_Column() AND - PT_IN_BOX( x, y, - node->x_abs, node->x_abs + node->w, - node->y_abs, node->y_abs + node->h ) - ) - { - /*** Point is inside current node ***/ - - if ( node->first_child() == NULL ) { - /*** SPECIAL CASE: for edittext boxes, we make sure click is - in box, and not on name string. This should be generalized - for all controls later... ***/ - if ( node->dynamicCastGLUI_EditText() ) { - if ( x < node->x_abs + ((GLUI_EditText*)node)->text_x_offset ) - return (GLUI_Control*) node->parent(); - } - - return node; /* point is inside this node, and node has no children, - so return this node as the selected node */ - } - else { - /*** This is a container class ***/ - last_container = node; - node = (GLUI_Control*) node->first_child(); /* Descend into child */ - } - - } - else { - node = (GLUI_Control*) node->next(); - } - } - - /** No leaf-level nodes found to accept the mouse click, so - return the last container control found which DOES accept the click **/ - - if ( last_container ) { - /* printf( "ctrl: '%s'\n", last_container->name ); */ - - return last_container; - } - else { - return NULL; - } -} - - -/************************************* GLUI_Main::pack_controls() ***********/ - -void GLUI_Main::pack_controls( void ) -{ - main_panel->pack(0,0); - - /**** Now align controls within their bounds ****/ - align_controls( main_panel ); - - /*** If this is a subwindow, expand panel to fit parent window ***/ - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - int parent_h, parent_w; - int orig_window; - - orig_window = glutGetWindow(); - glutSetWindow( this->top_level_glut_window_id ); - parent_h = glutGet( GLUT_WINDOW_HEIGHT ); - parent_w = glutGet( GLUT_WINDOW_WIDTH ); - - glutSetWindow( orig_window ); - - /* printf( "%d %d\n", parent_h, parent_w ); */ - - if ( 1 ) { - if ( TEST_AND(this->flags,GLUI_SUBWINDOW_TOP )) { - main_panel->w = MAX( main_panel->w, parent_w ); - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - main_panel->h = MAX( main_panel->h, parent_h ); - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_BOTTOM )) { - main_panel->w = MAX( main_panel->w, parent_w ); - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { - main_panel->h = MAX( main_panel->h, parent_h ); - } - } - } - - this->w = main_panel->w; - this->h = main_panel->h; -} - - -/************************************ GLUI_Main::align_controls() **********/ - -void GLUI_Main::align_controls( GLUI_Control *control ) -{ - GLUI_Control *child; - - control->align(); - - child = (GLUI_Control*) control->first_child(); - - while( child != NULL ) { - align_controls( child ); - - child = (GLUI_Control*)child->next(); - } -} - - - -/*********************************** GLUI::set_main_gfx_window() ************/ - -void GLUI::set_main_gfx_window( int window_id ) -{ - main_gfx_window_id = window_id; -} - - -/********************************* GLUI_Main::post_update_main_gfx() ********/ - -void GLUI_Main::post_update_main_gfx( void ) -{ - int old_window; - - if ( main_gfx_window_id > 0 ) { - old_window = glutGetWindow(); - glutSetWindow( main_gfx_window_id ); - glutPostRedisplay(); - if( old_window > 0 ) - glutSetWindow( old_window ); - } -} - -/********************************* GLUI_Main::should_redraw_now() ********/ -/** Return true if this control should redraw itself immediately (front buffer); - Or queue up a redraw and return false if it shouldn't (back buffer). - - Called from GLUI_Control::redraw. -*/ -bool GLUI_Main::should_redraw_now(GLUI_Control *ctl) -{ - switch (buffer_mode) { - case buffer_front: return true; /* always draw in front-buffer mode */ - case buffer_back: { - int orig = ctl->set_to_glut_window(); - glutPostRedisplay(); /* redraw soon */ - ctl->restore_window(orig); - return false; /* don't draw now. */ - } - } - return false; /* never executed */ -} - -/********************************* GLUI_Main::set_current_draw_buffer() ********/ - -int GLUI_Main::set_current_draw_buffer( void ) -{ - /* Save old buffer */ - GLint state; - glGetIntegerv( GL_DRAW_BUFFER, &state ); - /* Switch to new buffer */ - switch (buffer_mode) { - case buffer_front: glDrawBuffer(GL_FRONT); break; - case buffer_back: glDrawBuffer(GL_BACK); break; /* might not be needed... */ - } - return (int)state; -} - - -/********************************* GLUI_Main::restore_draw_buffer() **********/ - -void GLUI_Main::restore_draw_buffer( int buffer_state ) -{ - glDrawBuffer( buffer_state ); -} - - -/******************************************** GLUI_Main::GLUI_Main() ********/ - -GLUI_Main::GLUI_Main( void ) -{ - mouse_button_down = false; - w = 0; - h = 0; - active_control = NULL; - mouse_over_control = NULL; - main_gfx_window_id = -1; - glut_window_id = -1; - curr_modifiers = 0; - closing = false; - parent_window = -1; - glui_id = GLUI_Master.glui_id_counter; - GLUI_Master.glui_id_counter++; - - font = GLUT_BITMAP_HELVETICA_12; - curr_cursor = GLUT_CURSOR_LEFT_ARROW; - - int r=200, g=200, b=200; - bkgd_color.set( r,g,b ); - bkgd_color_f[0] = r / 255.0; - bkgd_color_f[1] = g / 255.0; - bkgd_color_f[2] = b / 255.0; - - /*** Create the main panel ***/ - main_panel = new GLUI_Panel; - main_panel->set_int_val( GLUI_PANEL_NONE ); - main_panel->glui = (GLUI*) this; - main_panel->name = "\0"; -} - -/************************************ GLUI_Main::draw_raised_box() **********/ - -void GLUI_Main::draw_raised_box( int x, int y, int w, int h ) -{ - w = w+x; - h = h+y; - - glColor3ub( bkgd_color.r, bkgd_color.g, bkgd_color.b ); - glBegin( GL_LINE_LOOP ); - glVertex2i( x+1, y+1 ); glVertex2i( w-1, y+1 ); - glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); - - glColor3d( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( x, h ); glVertex2i( x, y ); glVertex2i( w, y ); - glEnd(); - - glColor3d( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w, y ); glVertex2i( w, h ); glVertex2i( x, h ); - glEnd(); - - glColor3d( .5, .5, .5 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w-1, y+1 ); glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); -} - - -/************************************ GLUI_Main::draw_lowered_box() **********/ -/* Not quite perfect... **/ - -void GLUI_Main::draw_lowered_box( int x, int y, int w, int h ) -{ - w = w+x; - h = h+y; - - glColor3ub( bkgd_color.r, bkgd_color.g, bkgd_color.b ); - glBegin( GL_LINE_LOOP ); - glVertex2i( x+1, y+1 ); glVertex2i( w-1, y+1 ); - glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); - - glColor3d( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( x, h ); glVertex2i( x, y ); glVertex2i( w, y ); - glEnd(); - - glColor3d( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w, y ); glVertex2i( w, h ); glVertex2i( x, h ); - glEnd(); - - glColor3d( .5, .5, .5 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w-1, y+1 ); glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); -} - - -/************************************* GLUI_Main::activate_control() *********/ - -void GLUI_Main::activate_control( GLUI_Control *control, int how ) -{ - /** Are we not activating a control in the same window as the - previous active control? */ - if ( GLUI_Master.active_control_glui AND - this != (GLUI_Main*) GLUI_Master.active_control_glui ) { - GLUI_Master.active_control_glui->deactivate_current_control(); - } - - /******* Now activate it *****/ - if ( control != NULL AND control->can_activate AND control->enabled ) { - active_control = control; - - control->activate(how); - - /*if ( NOT active_control->is_container OR */ - /* active_control->type == GLUI_CONTROL_ROLLOUT) { */ - active_control->redraw(); - /*} */ - } - else { - active_control = NULL; - } - - /* printf( "activate: %d\n", glutGetWindow() ); */ - GLUI_Master.active_control = active_control; - GLUI_Master.active_control_glui = (GLUI*) this; -} - - -/************************* GLUI_Main::deactivate_current_control() **********/ - -void GLUI_Main::deactivate_current_control( void ) -{ - int orig; - - if ( active_control != NULL ) { - orig = active_control->set_to_glut_window(); - - active_control->deactivate(); - - /** If this isn't a container control, then redraw it in its - deactivated state. Container controls, such as panels, look - the same activated or not **/ - - /*if ( NOT active_control->is_container OR */ - /* active_control->type == GLUI_CONTROL_ROLLOUT ) { */ - active_control->redraw(); - /*} */ - - active_control->restore_window( orig ); - - active_control = NULL; - } - - /* printf( "deactivate: %d\n", glutGetWindow() ); */ - GLUI_Master.active_control = NULL; - GLUI_Master.active_control_glui = NULL; -} - - -/****************************** GLUI_Main::find_next_control() **************/ - -GLUI_Control *GLUI_Main::find_next_control_( GLUI_Control *control ) -{ - /*** THIS IS NOT find_next_control()! This is an unused older - version (look at the underscore at the end) ***/ - - if ( control == NULL ) - return find_next_control_rec( main_panel ); - else - return find_next_control_rec( control ); -} - -/****************************** GLUI_Main::find_next_control() **************/ - -GLUI_Control *GLUI_Main::find_next_control_rec( GLUI_Control *control ) -{ - GLUI_Control *child = NULL, *rec_control, *sibling; - - /*** Recursively investigate children ***/ - child = (GLUI_Control*) control->first_child(); - if ( child ) { - /*** If we can activate the first child, then do so ***/ - if ( child->can_activate AND child->enabled ) - return child; - else /*** Recurse into first child ***/ - rec_control = find_next_control_rec( child ); - - if ( rec_control ) - return rec_control; - } - - /*** At this point, either we don't have children, or the child cannot - be activated. So let's try the next sibling ***/ - - sibling = (GLUI_Control*) control->next(); - if ( sibling ) { - if ( sibling->can_activate AND sibling->enabled ) - return sibling; - else /*** Recurse into sibling ***/ - rec_control = find_next_control_rec( sibling ); - - if ( rec_control ) - return rec_control; - } - - return NULL; -} - - -/****************************** GLUI_Main::find_next_control() **************/ - -GLUI_Control *GLUI_Main::find_next_control( GLUI_Control *control ) -{ - GLUI_Control *tmp_control = NULL; - int back_up; - - if ( control == NULL ) - control = main_panel; - - while( control != NULL ) { - /** see if this control has a child **/ - tmp_control = (GLUI_Control*) control->first_child(); - - if ( tmp_control != NULL ) { - if ( tmp_control->can_activate AND tmp_control->enabled ) - return tmp_control; - - control = tmp_control; /* Descend into child */ - continue; - } - - /*** At this point, control has no children ***/ - - /** see if this control has a next sibling **/ - tmp_control = (GLUI_Control*) control->next(); - - if ( tmp_control != NULL ) { - if ( tmp_control->can_activate AND tmp_control->enabled ) - return tmp_control; - - control = tmp_control; - continue; - } - - /** back up until we find a sibling of an ancestor **/ - back_up = true; - while ( control->parent() AND back_up ) { - control = (GLUI_Control*) control->parent(); - - if ( control->next() ) { - control = (GLUI_Control*) control->next(); - if ( control->can_activate AND control->enabled ) - return control; - else - back_up = false; - - /*** if ( control->is_container ) { - tmp_control = control; - control = NULL; - break; - } - else { - back_up = false; - } - ***/ - } - } - - /** Check if we've cycled back to the top... if so, return NULL **/ - if ( control == main_panel ) { - return NULL; - } - } - /* - if ( tmp_control != NULL AND tmp_control->can_activate AND - tmp_control->enabled ) { - return tmp_control; - }*/ - - return NULL; -} - - -/****************************** GLUI_Main::find_prev_control() **************/ - -GLUI_Control *GLUI_Main::find_prev_control( GLUI_Control *control ) -{ - GLUI_Control *tmp_control, *next_control; - - if ( control == NULL ) { /* here we find the last valid control */ - next_control = main_panel; - - do { - tmp_control = next_control; - next_control = find_next_control( tmp_control ); - } while( next_control != NULL ); - - return tmp_control; - } - else { /* here we find the actual previous control */ - next_control = main_panel; - - do { - tmp_control = next_control; - next_control = find_next_control( tmp_control ); - } while( next_control != NULL AND next_control != control ); - - if ( next_control == NULL OR tmp_control == main_panel ) - return NULL; - else - return tmp_control; - } -} - -/************************* GLUI_Master_Object::set_glutIdleFunc() ***********/ - -void GLUI_Master_Object::set_glutIdleFunc(void (*f)(void)) -{ - glut_idle_CB = f; - GLUI_Master.glui_setIdleFuncIfNecessary(); -} - - -/**************************************** GLUI::disable() ********************/ - -void GLUI::disable( void ) -{ - deactivate_current_control(); - main_panel->disable(); -} - - -/******************************************** GLUI::sync_live() **************/ - -void GLUI::sync_live( void ) -{ - main_panel->sync_live(true, true); -} - - -/********************************* GLUI_Master_Object::sync_live_all() *****/ - -void GLUI_Master_Object::sync_live_all( void ) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - - glui->sync_live(); /** sync it **/ - - glui = (GLUI*) glui->next(); - } -} - - -/************************************* GLUI_Master_Object::close() **********/ - -void GLUI_Master_Object::close_all( void ) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - - glui->close(); /** Set flag to close **/ - - glui = (GLUI*) glui->next(); - } -} - - -/************************************* GLUI_Main::close_internal() **********/ - -void GLUI_Main::close_internal( void ) -{ - glutDestroyWindow(glutGetWindow()); /** Close this window **/ - - this->unlink(); - - if ( GLUI_Master.active_control_glui == this ) { - GLUI_Master.active_control = NULL; - GLUI_Master.active_control_glui = NULL; - } - - if ( parent_window != -1 ) { - glutSetWindow( parent_window ); - int win_w = glutGet( GLUT_WINDOW_WIDTH ); - int win_h = glutGet( GLUT_WINDOW_HEIGHT ); - glutReshapeWindow(win_w+1, win_h); - glutReshapeWindow(win_w-1, win_h); - } - - delete this->main_panel; - - delete this; -} - - -/************************************************** GLUI::close() **********/ - -void GLUI::close( void ) -{ - int old_glut_window; - - closing = true; - - old_glut_window = glutGetWindow(); - glutSetWindow( get_glut_window_id() ); - glutPostRedisplay(); - - glutSetWindow( old_glut_window ); -} - - -/************************** GLUI_Main::check_subwindow_position() **********/ - -void GLUI_Main::check_subwindow_position( void ) -{ - /*** Reposition this window if subwindow ***/ - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - - int parent_w, parent_h, new_x, new_y; - int old_window = glutGetWindow(); - - glutSetWindow( glut_window_id ); - - glutSetWindow( glutGet( GLUT_WINDOW_PARENT )); - parent_w = glutGet( GLUT_WINDOW_WIDTH ); - parent_h = glutGet( GLUT_WINDOW_HEIGHT ); - - glutSetWindow( glut_window_id ); - - if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { - new_x = parent_w - this->w; - new_y = 0; - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - new_x = 0; - new_y = 0; - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_BOTTOM )) { - new_x = 0; - new_y = parent_h - this->h; - } - else { /*** GLUI_SUBWINDOW_TOP ***/ - new_x = 0; - new_y = 0; - } - - /** Now make adjustments based on presence of other subwindows **/ - GLUI *curr_glui; - curr_glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( curr_glui ) { - if ( TEST_AND( curr_glui->flags, GLUI_SUBWINDOW) AND - curr_glui->parent_window == this->parent_window ) { - - if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) AND - ( TEST_AND( this->flags,GLUI_SUBWINDOW_LEFT ) OR - TEST_AND( this->flags,GLUI_SUBWINDOW_RIGHT ) ) ) { - /** If we are a RIGHT or LEFT subwindow, and there exists some - TOP subwindow, bump our position down **/ - - new_y += curr_glui->h; - } - - /** CHeck multiple subwins at same position **/ - /** We check the glui_id's: only the glui with the higher - ID number (meaning it was created later) gets bumped over **/ - if ( curr_glui != this AND this->glui_id > curr_glui->glui_id ) { - if ( TEST_AND( this->flags,GLUI_SUBWINDOW_LEFT ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { - new_x += curr_glui->w; - } - else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_TOP ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) ) { - new_y += curr_glui->h; - } - else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_BOTTOM ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { - new_y -= curr_glui->h; - } - else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_RIGHT ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { - new_x -= curr_glui->w; - } - - } - } - - curr_glui = (GLUI*) curr_glui->next(); - } - - - - CLAMP( new_x, 0, new_x ); - CLAMP( new_y, 0, new_y ); - - glutPositionWindow( new_x, new_y ); - /* glutPostRedisplay(); */ - - glutSetWindow( old_window ); - } -} - - -/********************************* GLUI_Master_Object::reshape() **********/ -/* This gets called by the user from a GLUT reshape callback. So we look */ -/* for subwindows that belong to the current window */ - -void GLUI_Master_Object::reshape( void ) -{ - GLUI *glui; - int current_window; - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) { - glutSetWindow( glui->get_glut_window_id()); - glui->check_subwindow_position(); - } - - glui = (GLUI*) glui->next(); - } - - glutSetWindow(current_window); -} - - -/**************************** GLUI_Master_Object::set_glutReshapeFunc() *****/ - -void GLUI_Master_Object::set_glutReshapeFunc(void (*f)(int width, int height)) -{ - glutReshapeFunc( glui_reshape_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_RESHAPE, (void*) f); -} - - -/**************************** GLUI_Master_Object::set_glutKeyboardFunc() ****/ - -void GLUI_Master_Object::set_glutKeyboardFunc(void (*f)(unsigned char key, - int x, int y)) -{ - glutKeyboardFunc( glui_keyboard_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_KEYBOARD, (void*) f); -} - - -/*********************** GLUI_Master_Object::set_glutSpecialFunc() **********/ - - - -void GLUI_Master_Object::set_glutSpecialUpFunc(void (*f)(int key, - int x, int y)) -{ - glutSpecialUpFunc( glui_special_up_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_SPECIAL_UP, (void*) f); -} - - -void GLUI_Master_Object::set_glutSpecialFunc(void (*f)(int key, - int x, int y)) -{ - glutSpecialFunc( glui_special_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_SPECIAL, (void*) f); -} - - -/*********************** GLUI_Master_Object::set_glutMouseFunc() **********/ - -void GLUI_Master_Object::set_glutMouseFunc(void (*f)(int button, int state, - int x, int y)) -{ - glutMouseFunc( glui_mouse_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_MOUSE, (void*) f); -} - - -/****************************** glui_parent_window_reshape_func() **********/ -/* This is the reshape callback for a window that contains subwindows */ - -void glui_parent_window_reshape_func( int w, int h ) -{ - int current_window; - GLUI *glui; - int first = true; - - /* printf( "glui_parent_window_reshape_func: %d\n", glutGetWindow() ); */ - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) { - glutSetWindow( glui->get_glut_window_id()); - glui->check_subwindow_position(); - glutSetWindow( current_window ); - - if ( first ) { - if (glui->glut_reshape_CB) glui->glut_reshape_CB( w, h ); - - first = false; - } - } - - glui = (GLUI*) glui->next(); - } -} - - -/****************************** glui_parent_window_keyboard_func() **********/ - -void glui_parent_window_keyboard_func(unsigned char key, int x, int y) -{ - /* printf( "glui_parent_window_keyboard_func: %d\n", glutGetWindow() ); */ - - int current_window; - GLUI *glui; - - current_window = glutGetWindow(); - - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->keyboard(key,x,y); - - glutSetWindow( current_window ); - } - else { - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window AND - glui->glut_keyboard_CB ) - { - glui->glut_keyboard_CB( key, x, y ); - break; - } - - glui = (GLUI*) glui->next(); - } - } -} - - -/****************************** glui_parent_window_special_func() **********/ - -void glui_parent_window_special_func(int key, int x, int y) -{ - /*printf( "glui_parent_window_special_func: %d\n", glutGetWindow() ); */ - - int current_window; - GLUI *glui; - - /** If clicking in the main area of a window w/subwindows, - deactivate any current control **/ - if ( GLUI_Master.active_control_glui != NULL ) - GLUI_Master.active_control_glui->deactivate_current_control(); - - /*** Now pass on the mouse event ***/ - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) - { - glutSetWindow( glui->get_glut_window_id()); - if (glui->glut_special_CB) glui->glut_special_CB( key, x, y ); - break; - } - - glui = (GLUI*) glui->next(); - } -} - - -/****************************** glui_parent_window_mouse_func() **********/ - -void glui_parent_window_mouse_func(int button, int state, int x, int y) -{ - int current_window; - GLUI *glui; - - /** If clicking in the main area of a window w/subwindows, - deactivate any current control **/ - if ( GLUI_Master.active_control_glui != NULL ) - GLUI_Master.active_control_glui->deactivate_current_control(); - - - /*** Now pass on the mouse event ***/ - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window AND - glui->glut_mouse_CB) - { - glutSetWindow( glui->get_glut_window_id()); - glui->glut_mouse_CB( button, state, x, y ); - break; - } - - glui = (GLUI*) glui->next(); - } -} - - -/************************** GLUI_Master_Object::find_glut_window() **********/ - -GLUI_Glut_Window *GLUI_Master_Object::find_glut_window( int window_id ) -{ - GLUI_Glut_Window *window; - - window = (GLUI_Glut_Window*) glut_windows.first_child(); - while( window ) { - if ( window->glut_window_id == window_id ) - return window; - - window = (GLUI_Glut_Window*) window->next(); - } - - /*** Window not found - return NULL ***/ - return NULL; -} - - -/******************** GLUI_Master_Object::add_cb_to_glut_window() **********/ - -void GLUI_Master_Object::add_cb_to_glut_window(int window_id, - int cb_type,void *cb) -{ - GLUI_Glut_Window *window; - - window = find_glut_window( window_id ); - if ( NOT window ) { - /*** Allocate new window structure ***/ - - window = new GLUI_Glut_Window; - window->glut_window_id = window_id; - window->link_this_to_parent_last( (GLUI_Node*) &this->glut_windows ); - } - - switch( cb_type ) { - case GLUI_GLUT_RESHAPE: - window->glut_reshape_CB = (void(*)(int,int)) cb; - break; - case GLUI_GLUT_DISPLAY: - window->glut_display_CB = (void(*)()) cb; - break; - case GLUI_GLUT_KEYBOARD: - window->glut_keyboard_CB = (void(*)(unsigned char,int,int)) cb; - break; - case GLUI_GLUT_SPECIAL: - window->glut_special_CB = (void(*)(int,int,int)) cb; - break; - case GLUI_GLUT_SPECIAL_UP: - window->glut_special_up_CB = (void(*)(int,int,int)) cb; - break; - case GLUI_GLUT_MOUSE: - window->glut_mouse_CB = (void(*)(int,int,int,int)) cb; - break; - case GLUI_GLUT_MOTION: - window->glut_motion_CB = (void(*)(int,int)) cb; - break; - case GLUI_GLUT_PASSIVE_MOTION: - window->glut_passive_motion_CB = (void(*)(int,int)) cb; - break; - case GLUI_GLUT_ENTRY: - window->glut_entry_CB = (void(*)(int)) cb; - break; - case GLUI_GLUT_VISIBILITY: - window->glut_visibility_CB= (void(*)(int)) cb; - break; - } -} - - -/************* GLUI_Master_Object::set_left_button_glut_menu_control() *****/ - -void GLUI_Master_Object::set_left_button_glut_menu_control( - GLUI_Control *control ) -{ - curr_left_button_glut_menu = control; -} - - -/******************************* GLUI_Main::set_ortho_projection() **********/ - -void GLUI_Main::set_ortho_projection( void ) -{ - int win_h, win_w; - - win_w = glutGet( GLUT_WINDOW_WIDTH ); - win_h = glutGet( GLUT_WINDOW_HEIGHT ); - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - /* gluOrtho2D( 0.0, (float) win_w, 0.0, (float) win_h ); */ - glOrtho( 0.0, (float)win_w, 0.0, (float) win_h, -1000.0, 1000.0 ); - - glMatrixMode( GL_MODELVIEW ); - - return; /****-----------------------------------------------***/ - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - /*** Rotate image so y increases upwards, contrary to OpenGL axes ***/ - glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); -} - - -/******************************* GLUI_Main::set_viewport() **********/ - -void GLUI_Main::set_viewport( void ) -{ - glViewport( 0, 0, main_panel->w, main_panel->h ); -} - - -/****************************** GLUI_Main::refresh() ****************/ - -void GLUI_Main::refresh( void ) -{ - int orig; - - /****** GLUI_Glut_Window *glut_window; - int current_window; - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - if ( glut_window ) { - glut_window->glut_reshape_CB(w,h); - ******/ - - orig = glutGetWindow(); - - pack_controls(); - - if ( glut_window_id > 0 ) - glutSetWindow( glut_window_id ); - - - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - /*** GLUI subwindow ***/ - - check_subwindow_position(); - } - else { - /*** Standalone GLUI window ***/ - - glutReshapeWindow( this->h, this->w ); - - } - - glutPostRedisplay(); - glutSetWindow( orig); -} - - - -/***************** GLUI_Master_Object::get_main_gfx_viewport() ***********/ - -void GLUI_Master_Object::get_viewport_area( int *x, int *y, - int *w, int *h ) -{ - GLUI *curr_glui; - int curr_x, curr_y, curr_w, curr_h; - int curr_window; - - curr_window = glutGetWindow(); - curr_x = 0; - curr_y = 0; - curr_w = glutGet( GLUT_WINDOW_WIDTH ); - curr_h = glutGet( GLUT_WINDOW_HEIGHT ); - - curr_glui = (GLUI*) gluis.first_child(); - while( curr_glui ) { - if ( TEST_AND( curr_glui->flags, GLUI_SUBWINDOW) AND - curr_glui->parent_window == curr_window ) { - - /* printf( "%s -> %d %d %d\n", curr_glui->window_name.c_str(), curr_glui->flags, - curr_glui->w, curr_glui->h );*/ - - if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { - curr_x += curr_glui->w; - curr_w -= curr_glui->w; - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { - curr_y += curr_glui->h; - curr_h -= curr_glui->h; - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { - curr_w -= curr_glui->w; - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) ) { - curr_h -= curr_glui->h; - } - } - - curr_glui = (GLUI*) curr_glui->next(); - } - - curr_x = MAX( 0, curr_x ); - curr_y = MAX( 0, curr_y ); - curr_w = MAX( 0, curr_w ); - curr_h = MAX( 0, curr_h ); - - *x = curr_x; - *y = curr_y; - *w = curr_w; - *h = curr_h; -} - - -/*****************GLUI_Master_Object::auto_set_main_gfx_viewport() **********/ - -void GLUI_Master_Object::auto_set_viewport( void ) -{ - int x, y, w, h; - - get_viewport_area( &x, &y, &w, &h ); - glViewport( MAX(x,0), MAX(y,0), MAX(w,0), MAX(h,0) ); -} - - - -/***************************************** GLUI::show() **********************/ - -void GLUI::show( void ) -{ - int orig_window; - - orig_window = main_panel->set_to_glut_window(); - - glutShowWindow(); - - main_panel->restore_window(orig_window); -} - - - -/***************************************** GLUI::hide() **********************/ - -void GLUI::hide( void ) -{ - int orig_window; - - this->deactivate_current_control(); - - orig_window = main_panel->set_to_glut_window(); - - glutHideWindow(); - - main_panel->restore_window(orig_window); -} - - -/**************** GLUI_DrawingSentinal **************/ -GLUI_DrawingSentinal::GLUI_DrawingSentinal(GLUI_Control *c_) - :c(c_) -{ - orig_win = c->set_to_glut_window(); - orig_buf = c->glui->set_current_draw_buffer(); -} -GLUI_DrawingSentinal::~GLUI_DrawingSentinal() { - c->glui->restore_draw_buffer(orig_buf); - c->restore_window(orig_win); -} - - -void GLUI_Master_Object::glui_setIdleFuncIfNecessary( void ) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - int necessary; - if (this->glut_idle_CB) - necessary = true; - else { - necessary = false; - while( glui ) { - if( glui->needs_idle() ) { - necessary = true; - break; - } - glui = (GLUI*) glui->next(); - } - } - if( necessary ) - glutIdleFunc( glui_idle_func ); - else - glutIdleFunc( NULL ); -} +/**************************************************************************** + + GLUI User Interface Toolkit (LGPL) + --------------------------- + + glui.cpp + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ +#include "glui_internal_control.h" + + +/** + Note: moving this routine here from glui_add_controls.cpp prevents the linker + from touching glui_add_controls.o in non-deprecated programs, which + descreases the linked size of small GLUI programs substantially (100K+). (OSL 2006/06) +*/ +void GLUI_Node::add_child_to_control(GLUI_Node *parent,GLUI_Control *child) +{ + GLUI_Control *parent_control; + + /*** Collapsible nodes have to be handled differently, b/c the first and + last children are swapped in and out ***/ + parent_control = ((GLUI_Control*)parent); + if ( parent_control->collapsible == true ) { + if ( NOT parent_control->is_open ) { + /** Swap in the original first and last children **/ + parent_control->child_head = parent_control->collapsed_node.child_head; + parent_control->child_tail = parent_control->collapsed_node.child_tail; + + /*** Link this control ***/ + child->link_this_to_parent_last( parent_control ); + + /** Swap the children back out ***/ + parent_control->collapsed_node.child_head = parent_control->child_head; + parent_control->collapsed_node.child_tail = parent_control->child_tail; + parent_control->child_head = NULL; + parent_control->child_tail = NULL; + } + else { + child->link_this_to_parent_last( parent_control ); + } + } + else { + child->link_this_to_parent_last( parent_control ); + } + child->glui = (GLUI*) parent_control->glui; + child->update_size(); + child->enabled = parent_control->enabled; + child->glui->refresh(); + + /** Now set the 'hidden' var based on the parent **/ + if ( parent_control->hidden OR + (parent_control->collapsible AND NOT parent_control->is_open ) ) + { + child->hidden = true; + } +} + + +/************************************ GLUI_Node::add_control() **************/ + +int GLUI_Node::add_control( GLUI_Control *child ) +{ + add_child_to_control(this,child); + return true; +} + +/************************************ GLUI_Main::add_control() **************/ + +int GLUI_Main::add_control( GLUI_Node *parent, GLUI_Control *control ) +{ + add_child_to_control(parent,control); + return true; +} + + + +/*** This object must be used to create a GLUI ***/ + +GLUI_Master_Object GLUI_Master; + +/************************************ finish_drawing() *********** + Probably a silly routine. Called after all event handling callbacks. +*/ + +static void finish_drawing(void) +{ + glFinish(); +} + +/************************************ GLUI_CB::operator()() ************/ +void GLUI_CB::operator()(GLUI_Control*ctrl) const +{ + if (idCB) idCB(ctrl->user_id); + if (objCB) objCB(ctrl); +} + + +/************************************************ GLUI::GLUI() **********/ + +int GLUI::init( const char *text, long flags, int x, int y, int parent_window ) +{ + int old_glut_window; + + this->flags = flags; + + window_name = text; + + buffer_mode = buffer_back; ///< New smooth way + //buffer_mode = buffer_front; ///< Old flickery way (a bit faster). + + /*** We copy over the current window callthroughs ***/ + /*** (I think this might actually only be needed for subwindows) ***/ + /* glut_keyboard_CB = GLUI_Master.glut_keyboard_CB; + glut_reshape_CB = GLUI_Master.glut_reshape_CB; + glut_special_CB = GLUI_Master.glut_special_CB; + glut_mouse_CB = GLUI_Master.glut_mouse_CB;*/ + + + if ( (flags & GLUI_SUBWINDOW) != GLUI_SUBWINDOW ) { /* not a subwindow, creating a new top-level window */ + old_glut_window = glutGetWindow(); + + create_standalone_window( window_name.c_str(), x, y ); + setup_default_glut_callbacks(); + + if ( old_glut_window > 0 ) + glutSetWindow( old_glut_window ); + + top_level_glut_window_id = glut_window_id; + } + else /* *is* a subwindow */ + { + old_glut_window = glutGetWindow(); + + create_subwindow( parent_window, flags ); + setup_default_glut_callbacks(); + + if ( old_glut_window > 0 ) + glutSetWindow( old_glut_window ); + + top_level_glut_window_id = parent_window; + + /* + glutReshapeFunc( glui_parent_window_reshape_func ); + glutSpecialFunc( glui_parent_window_special_func ); + glutKeyboardFunc( glui_parent_window_keyboard_func ); + glutMouseFunc( glui_parent_window_mouse_func ); + */ + + } + + return true; +} + + +/**************************** GLUI_Main::create_standalone_window() ********/ + +void GLUI_Main::create_standalone_window( const char *name, int x, int y ) +{ + glutInitWindowSize( 100, 100 ); + if ( x >= 0 OR y >= 0 ) + glutInitWindowPosition( x, y ); + glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); + glut_window_id = glutCreateWindow( name ); +} + + +/******************************** GLUI_Main::create_subwindow() **********/ + +void GLUI_Main::create_subwindow( int parent_window, int window_alignment ) +{ + glut_window_id = glutCreateSubWindow(parent_window, 0,0, 100, 100); + this->parent_window = parent_window; +} + + +/**************************** GLUI_Main::setup_default_glut_callbacks() *****/ + +void GLUI_Main::setup_default_glut_callbacks( void ) +{ + glutDisplayFunc( glui_display_func ); + glutReshapeFunc( glui_reshape_func ); + glutKeyboardFunc( glui_keyboard_func ); + glutSpecialFunc( glui_special_func ); + glutMouseFunc( glui_mouse_func ); + glutMotionFunc( glui_motion_func ); + glutPassiveMotionFunc( glui_passive_motion_func ); + glutEntryFunc( glui_entry_func ); + glutVisibilityFunc( glui_visibility_func ); + /* glutIdleFunc( glui_idle_func ); // FIXME! 100% CPU usage! */ +} + + +/********************************************** glui_display_func() ********/ + +void glui_display_func(void) +{ + GLUI *glui; + + /* printf( "display func\n" ); */ + + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + + if ( glui ) { + glui->display(); + /* + Do not do anything after the above line, b/c the GLUI + window might have just closed itself + */ + } +} + + +/********************************************** glui_reshape_func() ********/ + +void glui_reshape_func(int w,int h ) +{ + GLUI *glui; + GLUI_Glut_Window *glut_window; + int current_window; + + /*printf( "glui_reshape_func(): %d w/h: %d/%d\n", glutGetWindow(), w, h ); */ + + current_window = glutGetWindow(); + + /*** First check if this is main glut window ***/ + glut_window = GLUI_Master.find_glut_window( current_window ); + if ( glut_window ) { + if (glut_window->glut_reshape_CB) glut_window->glut_reshape_CB(w,h); + + /*** Now send reshape events to all subwindows ***/ + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while(glui) { + if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND + glui->parent_window == current_window ) { + glutSetWindow( glui->get_glut_window_id()); + glui->reshape(w,h); + /* glui->check_subwindow_position(); */ + } + glui = (GLUI*) glui->next(); + } + } + else { + /*** A standalone GLUI window ***/ + + glui = GLUI_Master.find_glui_by_window_id( current_window ); + + if ( glui ) { + glui->reshape(w,h); + } + } +} + +/********************************************** glui_keyboard_func() ********/ + +void glui_keyboard_func(unsigned char key, int x, int y) +{ + GLUI *glui; + int current_window; + GLUI_Glut_Window *glut_window; + + current_window = glutGetWindow(); + glut_window = GLUI_Master.find_glut_window( current_window ); + + /*printf( "key: %d\n", current_window ); */ + + if ( glut_window ) { /** Was event in a GLUT window? **/ + if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) { + glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); + + GLUI_Master.active_control_glui->keyboard(key,x,y); + finish_drawing(); + + glutSetWindow( current_window ); + } + else { + if (glut_window->glut_keyboard_CB) + glut_window->glut_keyboard_CB( key, x, y ); + } + } + else { /*** Nope, event was in a standalone GLUI window **/ + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + + if ( glui ) { + glui->keyboard(key,x,y); + finish_drawing(); + } + } +} + + + + +void glui_special_up_func(int key, int x, int y) +{ + GLUI *glui; + int current_window; + GLUI_Glut_Window *glut_window; + + current_window = glutGetWindow(); + glut_window = GLUI_Master.find_glut_window( current_window ); + + if (glut_window) /** Was event in a GLUT window? **/ + { + if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) + { + glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); + + GLUI_Master.active_control_glui->special_up(key,x,y); + finish_drawing(); + + glutSetWindow( current_window ); + } + else + { + if (glut_window->glut_special_up_CB) + glut_window->glut_special_up_CB( key, x, y ); + } + } + else /*** Nope, event was in a standalone GLUI window **/ + { + glui = GLUI_Master.find_glui_by_window_id(glutGetWindow()); + + if ( glui ) + { + glui->special_up(key,x,y); + finish_drawing(); + } + } +} + + + +/************************************************ glui_special_func() ********/ + +void glui_special_func(int key, int x, int y) +{ + GLUI *glui; + int current_window; + GLUI_Glut_Window *glut_window; + + current_window = glutGetWindow(); + glut_window = GLUI_Master.find_glut_window( current_window ); + + if (glut_window) /** Was event in a GLUT window? **/ + { + if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) + { + glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); + + GLUI_Master.active_control_glui->special(key,x,y); + finish_drawing(); + + glutSetWindow( current_window ); + } + else + { + if (glut_window->glut_special_CB) + glut_window->glut_special_CB( key, x, y ); + } + } + else /*** Nope, event was in a standalone GLUI window **/ + { + glui = GLUI_Master.find_glui_by_window_id(glutGetWindow()); + + if ( glui ) + { + glui->special(key,x,y); + finish_drawing(); + } + } +} + +/********************************************** glui_mouse_func() ********/ + +void glui_mouse_func(int button, int state, int x, int y) +{ + GLUI *glui; + int current_window; + GLUI_Glut_Window *glut_window; + + current_window = glutGetWindow(); + glut_window = GLUI_Master.find_glut_window( current_window ); + + if ( glut_window ) { /** Was event in a GLUT window? **/ + if ( GLUI_Master.active_control_glui != NULL ) + GLUI_Master.active_control_glui->deactivate_current_control(); + + if (glut_window->glut_mouse_CB) + glut_window->glut_mouse_CB( button, state, x, y ); + finish_drawing(); + } + else { /** Nope - event was in a GLUI standalone window **/ + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + if ( glui ) { + glui->passive_motion( 0,0 ); + glui->mouse( button, state, x, y ); + finish_drawing(); + } + } +} + + +/********************************************** glui_motion_func() ********/ + +void glui_motion_func(int x, int y) +{ + GLUI *glui; + + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + + if ( glui ) { + glui->motion(x,y); + finish_drawing(); + } + +} + + +/**************************************** glui_passive_motion_func() ********/ + +void glui_passive_motion_func(int x, int y) +{ + GLUI *glui; + + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + + if ( glui ) { + glui->passive_motion(x,y); + finish_drawing(); + } +} + + +/********************************************** glui_entry_func() ********/ + +void glui_entry_func(int state) +{ + GLUI *glui; + + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + + if ( glui ) { + glui->entry(state); + } +} + + +/******************************************** glui_visibility_func() ********/ + +void glui_visibility_func(int state) +{ + GLUI *glui; + + /* printf( "IN GLUI VISIBILITY()\n" ); */ + /* fflush( stdout ); */ + + glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); + + if ( glui ) { + glui->visibility(state); + } +} + + +/********************************************** glui_idle_func() ********/ +/* Send idle event to each glui, then to the main window */ + +void glui_idle_func(void) +{ + GLUI *glui; + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + glui->idle(); + finish_drawing(); + + glui = (GLUI*) glui->next(); + } + + if ( GLUI_Master.glut_idle_CB ) { + /*** We set the current glut window before calling the user's + idle function, even though glut explicitly says the window id is + undefined in an idle callback. ***/ + + /** Check what the current window is first ***/ + + /*** Arbitrarily set the window id to the main gfx window of the + first glui window ***/ + /* int current_window, new_window; */ + /* current_window = glutGetWindow(); */ + /* if (GLUI_Master.gluis.first_child() != NULL ) { */ + /* new_window = ((GLUI_Main*)GLUI_Master.gluis.first_child())-> */ + /* main_gfx_window_id; */ + /* if ( new_window > 0 AND new_window != old_window ) { */ + /* --- Window is changed only if its not already the current window ---*/ + /* glutSetWindow( new_window ); */ + /* } */ + /*} */ + + GLUI_Master.glut_idle_CB(); + } +} + +/*********************************** GLUI_Master_Object::GLUI_Master_Object() ******/ + +GLUI_Master_Object::GLUI_Master_Object() +: glui_id_counter(1), + glut_idle_CB(NULL) +{ +} + +GLUI_Master_Object::~GLUI_Master_Object() +{ +} + +/*********************************** GLUI_Master_Object::create_glui() ******/ + +GLUI *GLUI_Master_Object::create_glui( const char *name, long flags,int x,int y ) +{ + GLUI *new_glui = new GLUI; + new_glui->init( name, flags, x, y, -1 ); + new_glui->link_this_to_parent_last( &this->gluis ); + return new_glui; +} + + +/************************** GLUI_Master_Object::create_glui_subwindow() ******/ + +GLUI *GLUI_Master_Object::create_glui_subwindow( int parent_window, + long flags ) +{ + GLUI *new_glui = new GLUI; + GLUI_String new_name; + glui_format_str( new_name, "subwin_%p", this ); + + new_glui->init( new_name.c_str(), flags | GLUI_SUBWINDOW, 0,0, + parent_window ); + new_glui->main_panel->set_int_val( GLUI_PANEL_EMBOSSED ); + new_glui->link_this_to_parent_last( &this->gluis ); + return new_glui; +} + + +/********************** GLUI_Master_Object::find_glui_by_window_id() ********/ + +GLUI *GLUI_Master_Object::find_glui_by_window_id( int window_id ) +{ + GLUI_Node *node; + + node = gluis.first_child(); + while( node ) { + if ( ((GLUI*)node)->get_glut_window_id() == window_id ) + return (GLUI*) node; + + node = node->next(); + } + return NULL; +} + + +/******************************************** GLUI_Main::display() **********/ + +void GLUI_Main::display( void ) +{ + int win_w, win_h; + + /* SUBTLE: on freeGLUT, the correct window is always already set. + But older versions of GLUT need this call, or else subwindows + don't update properly when resizing or damage-painting. + */ + glutSetWindow( glut_window_id ); + + /* Set up OpenGL state for widget drawing */ + glDisable( GL_DEPTH_TEST ); + glCullFace( GL_BACK ); + glDisable( GL_CULL_FACE ); + glDisable( GL_LIGHTING ); + set_current_draw_buffer(); + + /**** This function is used as a special place to do 'safe' processing, + e.g., handling window close requests. + That is, we can't close the window directly in the callback, so + we set a flag, post a redisplay message (which eventually calls + this function), then close the window safely in here. ****/ + if ( closing ) { + close_internal(); + return; + } + + /* if ( TEST_AND( this->flags, GLUI_SUBWINDOW )) + check_subwindow_position(); + */ + + win_w = glutGet( GLUT_WINDOW_WIDTH ); + win_h = glutGet( GLUT_WINDOW_HEIGHT ); + + /*** Check here if the window needs resizing ***/ + if ( win_w != main_panel->w OR win_h != main_panel->h ) { + glutReshapeWindow( main_panel->w, main_panel->h ); + return; + } + + /******* Draw GLUI window ******/ + glClearColor( (float) bkgd_color.r / 255.0, + (float) bkgd_color.g / 255.0, + (float) bkgd_color.b / 255.0, + 1.0 ); + glClear( GL_COLOR_BUFFER_BIT ); /* | GL_DEPTH_BUFFER_BIT ); */ + + set_ortho_projection(); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + /*** Rotate image so y increases downward. + In normal OpenGL, y increases upward. ***/ + glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); + glRotatef( 180.0, 0.0, 1.0, 0.0 ); + glRotatef( 180.0, 0.0, 0.0, 1.0 ); + glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); + + // Recursively draw the main panel + // main_panel->draw_bkgd_box( 0, 0, win_w, win_h ); + main_panel->draw_recursive( 0, 0 ); + + switch (buffer_mode) { + case buffer_front: /* Make sure drawing gets to screen */ + glFlush(); + break; + case buffer_back: /* Bring back buffer to front */ + glutSwapBuffers(); + break; + } +} + + + + +/*************************************** _glutBitmapWidthString() **********/ + +int _glutBitmapWidthString( void *font, const char *s ) +{ + const char *p = s; + int width = 0; + + while( *p != '\0' ) { + width += glutBitmapWidth( font, *p ); + p++; + } + + return width; +} + +/************************************ _glutBitmapString *********************/ +/* Displays the contents of a string using GLUT's bitmap character function */ +/* Does not handle newlines */ + +void _glutBitmapString( void *font, const char *s ) +{ + const char *p = s; + + while( *p != '\0' ) { + glutBitmapCharacter( font, *p ); + p++; + } +} + + + +/****************************** GLUI_Main::reshape() **************/ + +void GLUI_Main::reshape( int reshape_w, int reshape_h ) +{ + int new_w, new_h; + + pack_controls(); + + new_w = main_panel->w;/* + 1; */ + new_h = main_panel->h;/* + 1; */ + + if ( reshape_w != new_w OR reshape_h != new_h ) { + this->w = new_w; + this->h = new_h; + + glutReshapeWindow( new_w, new_h ); + } + else { + } + + if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { + check_subwindow_position(); + + /***** if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { + } + ****/ + } + + glViewport( 0, 0, new_w, new_h ); + + /* printf( "%d: %d\n", glutGetWindow(), this->flags ); */ + + glutPostRedisplay(); +} + + +/****************************** GLUI_Main::keyboard() **************/ + +void GLUI_Main::keyboard(unsigned char key, int x, int y) +{ + GLUI_Control *new_control; + + curr_modifiers = glutGetModifiers(); + + /*** If it's a tab or shift tab, we don't pass it on to the controls. + Instead, we use it to cycle through active controls ***/ + if ( key == '\t' AND !mouse_button_down AND + (!active_control || !active_control->wants_tabs())) { + if ( curr_modifiers & GLUT_ACTIVE_SHIFT ) { + new_control = find_prev_control( active_control ); + } + else { + new_control = find_next_control( active_control ); + } + + /* if ( new_control ) + printf( "new_control: %s\n", new_control->name ); + */ + + deactivate_current_control(); + activate_control( new_control, GLUI_ACTIVATE_TAB ); + } + else if ( key == ' ' AND active_control + AND active_control->spacebar_mouse_click ) { + /*** If the user presses the spacebar, and a non-edittext control + is active, we send it a mouse down event followed by a mouse up + event (simulated mouse-click) ***/ + + active_control->mouse_down_handler( 0, 0 ); + active_control->mouse_up_handler( 0, 0, true ); + } else { + /*** Pass the keystroke onto the active control, if any ***/ + if ( active_control != NULL ) + active_control->key_handler( key, curr_modifiers ); + } +} + + + +void GLUI_Main::special_up(int key, int x, int y) +{ + curr_modifiers = glutGetModifiers(); + + /*** Pass the keystroke onto the active control, if any ***/ + if ( active_control != NULL ) + active_control->special_up_handler( key, glutGetModifiers() ); +} + + +/****************************** GLUI_Main::special() **************/ + +void GLUI_Main::special(int key, int x, int y) +{ + curr_modifiers = glutGetModifiers(); + + /*** Pass the keystroke onto the active control, if any ***/ + if ( active_control != NULL ) + active_control->special_handler( key, glutGetModifiers() ); +} + + + +/****************************** GLUI_Main::mouse() **************/ + +void GLUI_Main::mouse(int button, int state, int x, int y) +{ + int callthrough; + GLUI_Control *control; + + /* printf( "MOUSE: %d %d\n", button, state ); */ + + callthrough = true; + + curr_modifiers = glutGetModifiers(); + + if ( button == GLUT_LEFT ) { + control = find_control( x, y ); + + /*if ( control ) printf( "control: %s\n", control->name.c_str() ); */ + + if ( mouse_button_down AND active_control != NULL AND + state == GLUT_UP ) + { + /** We just released the mouse, which was depressed at some control **/ + + callthrough = active_control-> + mouse_up_handler( x, y, control==active_control); + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); + + if ( active_control AND + active_control->active_type == GLUI_CONTROL_ACTIVE_MOUSEDOWN AND 0) + { + /*** This is a control that needs to be deactivated when the + mouse button is released ****/ + deactivate_current_control(); + } + } + else { + if ( control ) { + if ( NOT mouse_button_down AND state == GLUT_DOWN ) { + /*** We just pressed the mouse down at some control ***/ + + if ( active_control != control ) { + if ( active_control != NULL ) { + /** There is an active control still - deactivate it ***/ + deactivate_current_control(); + } + } + + if ( control->enabled ) { + activate_control( control, GLUI_ACTIVATE_MOUSE ); + callthrough = control->mouse_down_handler( x, y ); + } + } + } + } + + if ( state == GLUT_DOWN ) + mouse_button_down = true; + else if ( state == GLUT_UP ) + mouse_button_down = false; + } + + /** + NO CALLTHROUGH NEEDED FOR MOUSE EVENTS + if ( callthrough AND glut_mouse_CB ) + glut_mouse_CB( button, state, x, y ); + **/ + + callthrough=callthrough; /* To get rid of compiler warnings */ +} + + +/****************************** GLUI_Main::motion() **************/ + +void GLUI_Main::motion(int x, int y) +{ + int callthrough; + GLUI_Control *control; + + /* printf( "MOTION: %d %d\n", x, y ); */ + + callthrough = true; + + control = find_control(x,y); + + if ( mouse_button_down AND active_control != NULL ) { + callthrough = + active_control->mouse_held_down_handler(x,y,control==active_control); + } + + /** + NO CALLTHROUGH NEEDED FOR MOUSE EVENTS + + if ( callthrough AND glut_motion_CB ) + glut_motion_CB(x,y); + **/ + + callthrough=callthrough; /* To get rid of compiler warnings */ +} + + +/*********************** GLUI_Main::passive_motion() **************/ + +void GLUI_Main::passive_motion(int x, int y) +{ + GLUI_Control *control; + + control = find_control( x, y ); + + /* printf( "%p %p\n", control, mouse_over_control ); */ + + if ( control != mouse_over_control ) { + if ( mouse_over_control ) { + mouse_over_control->mouse_over( false, x, y ); + } + + if ( control ) { + control->mouse_over( true, x, y ); + mouse_over_control = control; + } + } + + /* + if ( curr_cursor != GLUT_CURSOR_INHERIT ) { + curr_cursor = GLUT_CURSOR_INHERIT; + glutSetCursor( GLUT_CURSOR_INHERIT ); + }*/ + +} + + +/****************************** GLUI_Main::entry() **************/ + +void GLUI_Main::entry(int state) +{ + /*if ( NOT active_control OR ( active_control AND ( active_control->type == GLUI_CONTROL_EDITTEXT + OR active_control->type == GLUI_CONTROL_SPINNER) ) )*/ + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); +} + + +/****************************** GLUI_Main::visibility() **************/ + +void GLUI_Main::visibility(int state) +{ +} + + +/****************************** GLUI_Main::idle() **************/ + +void GLUI_Main::idle(void) +{ + /*** Pass the idle event onto the active control, if any ***/ + + /* printf( "IDLE \t" ); */ + + if ( active_control != NULL ) { + /* First we check if the control actually needs the idle right now. + Otherwise, let's avoid wasting cycles and OpenGL context switching */ + + if ( active_control->needs_idle() ) { + /*** Set the current glut window to the glui window */ + /*** But don't change the window if we're already at that window ***/ + + if ( glut_window_id > 0 AND glutGetWindow() != glut_window_id ) { + glutSetWindow( glut_window_id ); + } + + active_control->idle(); + } + } +} + +int GLUI_Main::needs_idle( void ) +{ + return active_control != NULL && active_control->needs_idle(); +} + + +/******************************************* GLUI_Main::find_control() ******/ + +GLUI_Control *GLUI_Main::find_control( int x, int y ) +{ + GLUI_Control *node, *last_container; + + last_container = NULL; + + node = main_panel; + while( node != NULL ) { + if ( !node->dynamicCastGLUI_Column() AND + PT_IN_BOX( x, y, + node->x_abs, node->x_abs + node->w, + node->y_abs, node->y_abs + node->h ) + ) + { + /*** Point is inside current node ***/ + + if ( node->first_child() == NULL ) { + /*** SPECIAL CASE: for edittext boxes, we make sure click is + in box, and not on name string. This should be generalized + for all controls later... ***/ + if ( node->dynamicCastGLUI_EditText() ) { + if ( x < node->x_abs + ((GLUI_EditText*)node)->text_x_offset ) + return (GLUI_Control*) node->parent(); + } + + return node; /* point is inside this node, and node has no children, + so return this node as the selected node */ + } + else { + /*** This is a container class ***/ + last_container = node; + node = (GLUI_Control*) node->first_child(); /* Descend into child */ + } + + } + else { + node = (GLUI_Control*) node->next(); + } + } + + /** No leaf-level nodes found to accept the mouse click, so + return the last container control found which DOES accept the click **/ + + if ( last_container ) { + /* printf( "ctrl: '%s'\n", last_container->name ); */ + + return last_container; + } + else { + return NULL; + } +} + + +/************************************* GLUI_Main::pack_controls() ***********/ + +void GLUI_Main::pack_controls( void ) +{ + main_panel->pack(0,0); + + /**** Now align controls within their bounds ****/ + align_controls( main_panel ); + + /*** If this is a subwindow, expand panel to fit parent window ***/ + if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { + int parent_h, parent_w; + int orig_window; + + orig_window = glutGetWindow(); + glutSetWindow( this->top_level_glut_window_id ); + parent_h = glutGet( GLUT_WINDOW_HEIGHT ); + parent_w = glutGet( GLUT_WINDOW_WIDTH ); + + glutSetWindow( orig_window ); + + /* printf( "%d %d\n", parent_h, parent_w ); */ + + if ( 1 ) { + if ( TEST_AND(this->flags,GLUI_SUBWINDOW_TOP )) { + main_panel->w = MAX( main_panel->w, parent_w ); + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { + main_panel->h = MAX( main_panel->h, parent_h ); + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_BOTTOM )) { + main_panel->w = MAX( main_panel->w, parent_w ); + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { + main_panel->h = MAX( main_panel->h, parent_h ); + } + } + } + + this->w = main_panel->w; + this->h = main_panel->h; +} + + +/************************************ GLUI_Main::align_controls() **********/ + +void GLUI_Main::align_controls( GLUI_Control *control ) +{ + GLUI_Control *child; + + control->align(); + + child = (GLUI_Control*) control->first_child(); + + while( child != NULL ) { + align_controls( child ); + + child = (GLUI_Control*)child->next(); + } +} + + + +/*********************************** GLUI::set_main_gfx_window() ************/ + +void GLUI::set_main_gfx_window( int window_id ) +{ + main_gfx_window_id = window_id; +} + + +/********************************* GLUI_Main::post_update_main_gfx() ********/ + +void GLUI_Main::post_update_main_gfx( void ) +{ + int old_window; + + if ( main_gfx_window_id > 0 ) { + old_window = glutGetWindow(); + glutSetWindow( main_gfx_window_id ); + glutPostRedisplay(); + if( old_window > 0 ) + glutSetWindow( old_window ); + } +} + +/********************************* GLUI_Main::should_redraw_now() ********/ +/** Return true if this control should redraw itself immediately (front buffer); + Or queue up a redraw and return false if it shouldn't (back buffer). + + Called from GLUI_Control::redraw. +*/ +bool GLUI_Main::should_redraw_now(GLUI_Control *ctl) +{ + switch (buffer_mode) { + case buffer_front: return true; /* always draw in front-buffer mode */ + case buffer_back: { + int orig = ctl->set_to_glut_window(); + glutPostRedisplay(); /* redraw soon */ + ctl->restore_window(orig); + return false; /* don't draw now. */ + } + } + return false; /* never executed */ +} + +/********************************* GLUI_Main::set_current_draw_buffer() ********/ + +int GLUI_Main::set_current_draw_buffer( void ) +{ + /* Save old buffer */ + GLint state; + glGetIntegerv( GL_DRAW_BUFFER, &state ); + /* Switch to new buffer */ + switch (buffer_mode) { + case buffer_front: glDrawBuffer(GL_FRONT); break; + case buffer_back: glDrawBuffer(GL_BACK); break; /* might not be needed... */ + } + return (int)state; +} + + +/********************************* GLUI_Main::restore_draw_buffer() **********/ + +void GLUI_Main::restore_draw_buffer( int buffer_state ) +{ + glDrawBuffer( buffer_state ); +} + + +/******************************************** GLUI_Main::GLUI_Main() ********/ + +GLUI_Main::GLUI_Main( void ) +{ + mouse_button_down = false; + w = 0; + h = 0; + active_control = NULL; + mouse_over_control = NULL; + main_gfx_window_id = -1; + glut_window_id = -1; + curr_modifiers = 0; + closing = false; + parent_window = -1; + glui_id = GLUI_Master.glui_id_counter; + GLUI_Master.glui_id_counter++; + + font = GLUT_BITMAP_HELVETICA_12; + curr_cursor = GLUT_CURSOR_LEFT_ARROW; + + int r=200, g=200, b=200; + bkgd_color.set( r,g,b ); + bkgd_color_f[0] = r / 255.0; + bkgd_color_f[1] = g / 255.0; + bkgd_color_f[2] = b / 255.0; + + /*** Create the main panel ***/ + main_panel = new GLUI_Panel; + main_panel->set_int_val( GLUI_PANEL_NONE ); + main_panel->glui = (GLUI*) this; + main_panel->name = "\0"; +} + +/************************************ GLUI_Main::draw_raised_box() **********/ + +void GLUI_Main::draw_raised_box( int x, int y, int w, int h ) +{ + w = w+x; + h = h+y; + + glColor3ub( bkgd_color.r, bkgd_color.g, bkgd_color.b ); + glBegin( GL_LINE_LOOP ); + glVertex2i( x+1, y+1 ); glVertex2i( w-1, y+1 ); + glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); + glEnd(); + + glColor3d( 1.0, 1.0, 1.0 ); + glBegin( GL_LINE_STRIP ); + glVertex2i( x, h ); glVertex2i( x, y ); glVertex2i( w, y ); + glEnd(); + + glColor3d( 0.0, 0.0, 0.0 ); + glBegin( GL_LINE_STRIP ); + glVertex2i( w, y ); glVertex2i( w, h ); glVertex2i( x, h ); + glEnd(); + + glColor3d( .5, .5, .5 ); + glBegin( GL_LINE_STRIP ); + glVertex2i( w-1, y+1 ); glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); + glEnd(); +} + + +/************************************ GLUI_Main::draw_lowered_box() **********/ +/* Not quite perfect... **/ + +void GLUI_Main::draw_lowered_box( int x, int y, int w, int h ) +{ + w = w+x; + h = h+y; + + glColor3ub( bkgd_color.r, bkgd_color.g, bkgd_color.b ); + glBegin( GL_LINE_LOOP ); + glVertex2i( x+1, y+1 ); glVertex2i( w-1, y+1 ); + glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); + glEnd(); + + glColor3d( 0.0, 0.0, 0.0 ); + glBegin( GL_LINE_STRIP ); + glVertex2i( x, h ); glVertex2i( x, y ); glVertex2i( w, y ); + glEnd(); + + glColor3d( 1.0, 1.0, 1.0 ); + glBegin( GL_LINE_STRIP ); + glVertex2i( w, y ); glVertex2i( w, h ); glVertex2i( x, h ); + glEnd(); + + glColor3d( .5, .5, .5 ); + glBegin( GL_LINE_STRIP ); + glVertex2i( w-1, y+1 ); glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); + glEnd(); +} + + +/************************************* GLUI_Main::activate_control() *********/ + +void GLUI_Main::activate_control( GLUI_Control *control, int how ) +{ + /** Are we not activating a control in the same window as the + previous active control? */ + if ( GLUI_Master.active_control_glui AND + this != (GLUI_Main*) GLUI_Master.active_control_glui ) { + GLUI_Master.active_control_glui->deactivate_current_control(); + } + + /******* Now activate it *****/ + if ( control != NULL AND control->can_activate AND control->enabled ) { + active_control = control; + + control->activate(how); + + /*if ( NOT active_control->is_container OR */ + /* active_control->type == GLUI_CONTROL_ROLLOUT) { */ + active_control->redraw(); + /*} */ + } + else { + active_control = NULL; + } + + /* printf( "activate: %d\n", glutGetWindow() ); */ + GLUI_Master.active_control = active_control; + GLUI_Master.active_control_glui = (GLUI*) this; +} + + +/************************* GLUI_Main::deactivate_current_control() **********/ + +void GLUI_Main::deactivate_current_control( void ) +{ + int orig; + + if ( active_control != NULL ) { + orig = active_control->set_to_glut_window(); + + active_control->deactivate(); + + /** If this isn't a container control, then redraw it in its + deactivated state. Container controls, such as panels, look + the same activated or not **/ + + /*if ( NOT active_control->is_container OR */ + /* active_control->type == GLUI_CONTROL_ROLLOUT ) { */ + active_control->redraw(); + /*} */ + + active_control->restore_window( orig ); + + active_control = NULL; + } + + /* printf( "deactivate: %d\n", glutGetWindow() ); */ + GLUI_Master.active_control = NULL; + GLUI_Master.active_control_glui = NULL; +} + + +/****************************** GLUI_Main::find_next_control() **************/ + +GLUI_Control *GLUI_Main::find_next_control_( GLUI_Control *control ) +{ + /*** THIS IS NOT find_next_control()! This is an unused older + version (look at the underscore at the end) ***/ + + if ( control == NULL ) + return find_next_control_rec( main_panel ); + else + return find_next_control_rec( control ); +} + +/****************************** GLUI_Main::find_next_control() **************/ + +GLUI_Control *GLUI_Main::find_next_control_rec( GLUI_Control *control ) +{ + GLUI_Control *child = NULL, *rec_control, *sibling; + + /*** Recursively investigate children ***/ + child = (GLUI_Control*) control->first_child(); + if ( child ) { + /*** If we can activate the first child, then do so ***/ + if ( child->can_activate AND child->enabled ) + return child; + else /*** Recurse into first child ***/ + rec_control = find_next_control_rec( child ); + + if ( rec_control ) + return rec_control; + } + + /*** At this point, either we don't have children, or the child cannot + be activated. So let's try the next sibling ***/ + + sibling = (GLUI_Control*) control->next(); + if ( sibling ) { + if ( sibling->can_activate AND sibling->enabled ) + return sibling; + else /*** Recurse into sibling ***/ + rec_control = find_next_control_rec( sibling ); + + if ( rec_control ) + return rec_control; + } + + return NULL; +} + + +/****************************** GLUI_Main::find_next_control() **************/ + +GLUI_Control *GLUI_Main::find_next_control( GLUI_Control *control ) +{ + GLUI_Control *tmp_control = NULL; + int back_up; + + if ( control == NULL ) + control = main_panel; + + while( control != NULL ) { + /** see if this control has a child **/ + tmp_control = (GLUI_Control*) control->first_child(); + + if ( tmp_control != NULL ) { + if ( tmp_control->can_activate AND tmp_control->enabled ) + return tmp_control; + + control = tmp_control; /* Descend into child */ + continue; + } + + /*** At this point, control has no children ***/ + + /** see if this control has a next sibling **/ + tmp_control = (GLUI_Control*) control->next(); + + if ( tmp_control != NULL ) { + if ( tmp_control->can_activate AND tmp_control->enabled ) + return tmp_control; + + control = tmp_control; + continue; + } + + /** back up until we find a sibling of an ancestor **/ + back_up = true; + while ( control->parent() AND back_up ) { + control = (GLUI_Control*) control->parent(); + + if ( control->next() ) { + control = (GLUI_Control*) control->next(); + if ( control->can_activate AND control->enabled ) + return control; + else + back_up = false; + + /*** if ( control->is_container ) { + tmp_control = control; + control = NULL; + break; + } + else { + back_up = false; + } + ***/ + } + } + + /** Check if we've cycled back to the top... if so, return NULL **/ + if ( control == main_panel ) { + return NULL; + } + } + /* + if ( tmp_control != NULL AND tmp_control->can_activate AND + tmp_control->enabled ) { + return tmp_control; + }*/ + + return NULL; +} + + +/****************************** GLUI_Main::find_prev_control() **************/ + +GLUI_Control *GLUI_Main::find_prev_control( GLUI_Control *control ) +{ + GLUI_Control *tmp_control, *next_control; + + if ( control == NULL ) { /* here we find the last valid control */ + next_control = main_panel; + + do { + tmp_control = next_control; + next_control = find_next_control( tmp_control ); + } while( next_control != NULL ); + + return tmp_control; + } + else { /* here we find the actual previous control */ + next_control = main_panel; + + do { + tmp_control = next_control; + next_control = find_next_control( tmp_control ); + } while( next_control != NULL AND next_control != control ); + + if ( next_control == NULL OR tmp_control == main_panel ) + return NULL; + else + return tmp_control; + } +} + +/************************* GLUI_Master_Object::set_glutIdleFunc() ***********/ + +void GLUI_Master_Object::set_glutIdleFunc(void (*f)(void)) +{ + glut_idle_CB = f; + GLUI_Master.glui_setIdleFuncIfNecessary(); +} + + +/**************************************** GLUI::disable() ********************/ + +void GLUI::disable( void ) +{ + deactivate_current_control(); + main_panel->disable(); +} + + +/******************************************** GLUI::sync_live() **************/ + +void GLUI::sync_live( void ) +{ + main_panel->sync_live(true, true); +} + + +/********************************* GLUI_Master_Object::sync_live_all() *****/ + +void GLUI_Master_Object::sync_live_all( void ) +{ + GLUI *glui; + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + + glui->sync_live(); /** sync it **/ + + glui = (GLUI*) glui->next(); + } +} + + +/************************************* GLUI_Master_Object::close() **********/ + +void GLUI_Master_Object::close_all( void ) +{ + GLUI *glui; + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + + glui->close(); /** Set flag to close **/ + + glui = (GLUI*) glui->next(); + } +} + + +/************************************* GLUI_Main::close_internal() **********/ + +void GLUI_Main::close_internal( void ) +{ + glutDestroyWindow(glutGetWindow()); /** Close this window **/ + + this->unlink(); + + if ( GLUI_Master.active_control_glui == this ) { + GLUI_Master.active_control = NULL; + GLUI_Master.active_control_glui = NULL; + } + + if ( parent_window != -1 ) { + glutSetWindow( parent_window ); + int win_w = glutGet( GLUT_WINDOW_WIDTH ); + int win_h = glutGet( GLUT_WINDOW_HEIGHT ); + glutReshapeWindow(win_w+1, win_h); + glutReshapeWindow(win_w-1, win_h); + } + + delete this->main_panel; + + delete this; +} + + +/************************************************** GLUI::close() **********/ + +void GLUI::close( void ) +{ + int old_glut_window; + + closing = true; + + old_glut_window = glutGetWindow(); + glutSetWindow( get_glut_window_id() ); + glutPostRedisplay(); + + glutSetWindow( old_glut_window ); +} + + +/************************** GLUI_Main::check_subwindow_position() **********/ + +void GLUI_Main::check_subwindow_position( void ) +{ + /*** Reposition this window if subwindow ***/ + if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { + + int parent_w, parent_h, new_x, new_y; + int old_window = glutGetWindow(); + + glutSetWindow( glut_window_id ); + + glutSetWindow( glutGet( GLUT_WINDOW_PARENT )); + parent_w = glutGet( GLUT_WINDOW_WIDTH ); + parent_h = glutGet( GLUT_WINDOW_HEIGHT ); + + glutSetWindow( glut_window_id ); + + if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { + new_x = parent_w - this->w; + new_y = 0; + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { + new_x = 0; + new_y = 0; + } + else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_BOTTOM )) { + new_x = 0; + new_y = parent_h - this->h; + } + else { /*** GLUI_SUBWINDOW_TOP ***/ + new_x = 0; + new_y = 0; + } + + /** Now make adjustments based on presence of other subwindows **/ + GLUI *curr_glui; + curr_glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( curr_glui ) { + if ( TEST_AND( curr_glui->flags, GLUI_SUBWINDOW) AND + curr_glui->parent_window == this->parent_window ) { + + if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { + } + else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { + } + else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { + } + else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) AND + ( TEST_AND( this->flags,GLUI_SUBWINDOW_LEFT ) OR + TEST_AND( this->flags,GLUI_SUBWINDOW_RIGHT ) ) ) { + /** If we are a RIGHT or LEFT subwindow, and there exists some + TOP subwindow, bump our position down **/ + + new_y += curr_glui->h; + } + + /** CHeck multiple subwins at same position **/ + /** We check the glui_id's: only the glui with the higher + ID number (meaning it was created later) gets bumped over **/ + if ( curr_glui != this AND this->glui_id > curr_glui->glui_id ) { + if ( TEST_AND( this->flags,GLUI_SUBWINDOW_LEFT ) AND + TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { + new_x += curr_glui->w; + } + else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_TOP ) AND + TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) ) { + new_y += curr_glui->h; + } + else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_BOTTOM ) AND + TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { + new_y -= curr_glui->h; + } + else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_RIGHT ) AND + TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { + new_x -= curr_glui->w; + } + + } + } + + curr_glui = (GLUI*) curr_glui->next(); + } + + + + CLAMP( new_x, 0, new_x ); + CLAMP( new_y, 0, new_y ); + + glutPositionWindow( new_x, new_y ); + /* glutPostRedisplay(); */ + + glutSetWindow( old_window ); + } +} + + +/********************************* GLUI_Master_Object::reshape() **********/ +/* This gets called by the user from a GLUT reshape callback. So we look */ +/* for subwindows that belong to the current window */ + +void GLUI_Master_Object::reshape( void ) +{ + GLUI *glui; + int current_window; + + current_window = glutGetWindow(); + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND + glui->parent_window == current_window ) { + glutSetWindow( glui->get_glut_window_id()); + glui->check_subwindow_position(); + } + + glui = (GLUI*) glui->next(); + } + + glutSetWindow(current_window); +} + + +/**************************** GLUI_Master_Object::set_glutReshapeFunc() *****/ + +void GLUI_Master_Object::set_glutReshapeFunc(void (*f)(int width, int height)) +{ + glutReshapeFunc( glui_reshape_func ); + add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_RESHAPE, (void*) f); +} + + +/**************************** GLUI_Master_Object::set_glutKeyboardFunc() ****/ + +void GLUI_Master_Object::set_glutKeyboardFunc(void (*f)(unsigned char key, + int x, int y)) +{ + glutKeyboardFunc( glui_keyboard_func ); + add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_KEYBOARD, (void*) f); +} + + +/*********************** GLUI_Master_Object::set_glutSpecialFunc() **********/ + + + +void GLUI_Master_Object::set_glutSpecialUpFunc(void (*f)(int key, + int x, int y)) +{ + glutSpecialUpFunc( glui_special_up_func ); + add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_SPECIAL_UP, (void*) f); +} + + +void GLUI_Master_Object::set_glutSpecialFunc(void (*f)(int key, + int x, int y)) +{ + glutSpecialFunc( glui_special_func ); + add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_SPECIAL, (void*) f); +} + + +/*********************** GLUI_Master_Object::set_glutMouseFunc() **********/ + +void GLUI_Master_Object::set_glutMouseFunc(void (*f)(int button, int state, + int x, int y)) +{ + glutMouseFunc( glui_mouse_func ); + add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_MOUSE, (void*) f); +} + + +/****************************** glui_parent_window_reshape_func() **********/ +/* This is the reshape callback for a window that contains subwindows */ + +void glui_parent_window_reshape_func( int w, int h ) +{ + int current_window; + GLUI *glui; + int first = true; + + /* printf( "glui_parent_window_reshape_func: %d\n", glutGetWindow() ); */ + + current_window = glutGetWindow(); + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND + glui->parent_window == current_window ) { + glutSetWindow( glui->get_glut_window_id()); + glui->check_subwindow_position(); + glutSetWindow( current_window ); + + if ( first ) { + if (glui->glut_reshape_CB) glui->glut_reshape_CB( w, h ); + + first = false; + } + } + + glui = (GLUI*) glui->next(); + } +} + + +/****************************** glui_parent_window_keyboard_func() **********/ + +void glui_parent_window_keyboard_func(unsigned char key, int x, int y) +{ + /* printf( "glui_parent_window_keyboard_func: %d\n", glutGetWindow() ); */ + + int current_window; + GLUI *glui; + + current_window = glutGetWindow(); + + if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) { + glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); + + GLUI_Master.active_control_glui->keyboard(key,x,y); + + glutSetWindow( current_window ); + } + else { + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND + glui->parent_window == current_window AND + glui->glut_keyboard_CB ) + { + glui->glut_keyboard_CB( key, x, y ); + break; + } + + glui = (GLUI*) glui->next(); + } + } +} + + +/****************************** glui_parent_window_special_func() **********/ + +void glui_parent_window_special_func(int key, int x, int y) +{ + /*printf( "glui_parent_window_special_func: %d\n", glutGetWindow() ); */ + + int current_window; + GLUI *glui; + + /** If clicking in the main area of a window w/subwindows, + deactivate any current control **/ + if ( GLUI_Master.active_control_glui != NULL ) + GLUI_Master.active_control_glui->deactivate_current_control(); + + /*** Now pass on the mouse event ***/ + + current_window = glutGetWindow(); + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND + glui->parent_window == current_window ) + { + glutSetWindow( glui->get_glut_window_id()); + if (glui->glut_special_CB) glui->glut_special_CB( key, x, y ); + break; + } + + glui = (GLUI*) glui->next(); + } +} + + +/****************************** glui_parent_window_mouse_func() **********/ + +void glui_parent_window_mouse_func(int button, int state, int x, int y) +{ + int current_window; + GLUI *glui; + + /** If clicking in the main area of a window w/subwindows, + deactivate any current control **/ + if ( GLUI_Master.active_control_glui != NULL ) + GLUI_Master.active_control_glui->deactivate_current_control(); + + + /*** Now pass on the mouse event ***/ + + current_window = glutGetWindow(); + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + while( glui ) { + if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND + glui->parent_window == current_window AND + glui->glut_mouse_CB) + { + glutSetWindow( glui->get_glut_window_id()); + glui->glut_mouse_CB( button, state, x, y ); + break; + } + + glui = (GLUI*) glui->next(); + } +} + + +/************************** GLUI_Master_Object::find_glut_window() **********/ + +GLUI_Glut_Window *GLUI_Master_Object::find_glut_window( int window_id ) +{ + GLUI_Glut_Window *window; + + window = (GLUI_Glut_Window*) glut_windows.first_child(); + while( window ) { + if ( window->glut_window_id == window_id ) + return window; + + window = (GLUI_Glut_Window*) window->next(); + } + + /*** Window not found - return NULL ***/ + return NULL; +} + + +/******************** GLUI_Master_Object::add_cb_to_glut_window() **********/ + +void GLUI_Master_Object::add_cb_to_glut_window(int window_id, + int cb_type,void *cb) +{ + GLUI_Glut_Window *window; + + window = find_glut_window( window_id ); + if ( NOT window ) { + /*** Allocate new window structure ***/ + + window = new GLUI_Glut_Window; + window->glut_window_id = window_id; + window->link_this_to_parent_last( (GLUI_Node*) &this->glut_windows ); + } + + switch( cb_type ) { + case GLUI_GLUT_RESHAPE: + window->glut_reshape_CB = (void(*)(int,int)) cb; + break; + case GLUI_GLUT_DISPLAY: + window->glut_display_CB = (void(*)()) cb; + break; + case GLUI_GLUT_KEYBOARD: + window->glut_keyboard_CB = (void(*)(unsigned char,int,int)) cb; + break; + case GLUI_GLUT_SPECIAL: + window->glut_special_CB = (void(*)(int,int,int)) cb; + break; + case GLUI_GLUT_SPECIAL_UP: + window->glut_special_up_CB = (void(*)(int,int,int)) cb; + break; + case GLUI_GLUT_MOUSE: + window->glut_mouse_CB = (void(*)(int,int,int,int)) cb; + break; + case GLUI_GLUT_MOTION: + window->glut_motion_CB = (void(*)(int,int)) cb; + break; + case GLUI_GLUT_PASSIVE_MOTION: + window->glut_passive_motion_CB = (void(*)(int,int)) cb; + break; + case GLUI_GLUT_ENTRY: + window->glut_entry_CB = (void(*)(int)) cb; + break; + case GLUI_GLUT_VISIBILITY: + window->glut_visibility_CB= (void(*)(int)) cb; + break; + } +} + + +/************* GLUI_Master_Object::set_left_button_glut_menu_control() *****/ + +void GLUI_Master_Object::set_left_button_glut_menu_control( + GLUI_Control *control ) +{ + curr_left_button_glut_menu = control; +} + + +/******************************* GLUI_Main::set_ortho_projection() **********/ + +void GLUI_Main::set_ortho_projection( void ) +{ + int win_h, win_w; + + win_w = glutGet( GLUT_WINDOW_WIDTH ); + win_h = glutGet( GLUT_WINDOW_HEIGHT ); + + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + /* gluOrtho2D( 0.0, (float) win_w, 0.0, (float) win_h ); */ + glOrtho( 0.0, (float)win_w, 0.0, (float) win_h, -1000.0, 1000.0 ); + + glMatrixMode( GL_MODELVIEW ); + + return; /****-----------------------------------------------***/ + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + /*** Rotate image so y increases upwards, contrary to OpenGL axes ***/ + glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); + glRotatef( 180.0, 0.0, 1.0, 0.0 ); + glRotatef( 180.0, 0.0, 0.0, 1.0 ); + glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); +} + + +/******************************* GLUI_Main::set_viewport() **********/ + +void GLUI_Main::set_viewport( void ) +{ + glViewport( 0, 0, main_panel->w, main_panel->h ); +} + + +/****************************** GLUI_Main::refresh() ****************/ + +void GLUI_Main::refresh( void ) +{ + int orig; + + /****** GLUI_Glut_Window *glut_window; + int current_window; + current_window = glutGetWindow(); + glut_window = GLUI_Master.find_glut_window( current_window ); + if ( glut_window ) { + glut_window->glut_reshape_CB(w,h); + ******/ + + orig = glutGetWindow(); + + pack_controls(); + + if ( glut_window_id > 0 ) + glutSetWindow( glut_window_id ); + + + if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { + /*** GLUI subwindow ***/ + + check_subwindow_position(); + } + else { + /*** Standalone GLUI window ***/ + + glutReshapeWindow( this->h, this->w ); + + } + + glutPostRedisplay(); + glutSetWindow( orig); +} + + + +/***************** GLUI_Master_Object::get_main_gfx_viewport() ***********/ + +void GLUI_Master_Object::get_viewport_area( int *x, int *y, + int *w, int *h ) +{ + GLUI *curr_glui; + int curr_x, curr_y, curr_w, curr_h; + int curr_window; + + curr_window = glutGetWindow(); + curr_x = 0; + curr_y = 0; + curr_w = glutGet( GLUT_WINDOW_WIDTH ); + curr_h = glutGet( GLUT_WINDOW_HEIGHT ); + + curr_glui = (GLUI*) gluis.first_child(); + while( curr_glui ) { + if ( TEST_AND( curr_glui->flags, GLUI_SUBWINDOW) AND + curr_glui->parent_window == curr_window ) { + + /* printf( "%s -> %d %d %d\n", curr_glui->window_name.c_str(), curr_glui->flags, + curr_glui->w, curr_glui->h );*/ + + if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { + curr_x += curr_glui->w; + curr_w -= curr_glui->w; + } + else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { + curr_y += curr_glui->h; + curr_h -= curr_glui->h; + } + else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { + curr_w -= curr_glui->w; + } + else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) ) { + curr_h -= curr_glui->h; + } + } + + curr_glui = (GLUI*) curr_glui->next(); + } + + curr_x = MAX( 0, curr_x ); + curr_y = MAX( 0, curr_y ); + curr_w = MAX( 0, curr_w ); + curr_h = MAX( 0, curr_h ); + + *x = curr_x; + *y = curr_y; + *w = curr_w; + *h = curr_h; +} + + +/*****************GLUI_Master_Object::auto_set_main_gfx_viewport() **********/ + +void GLUI_Master_Object::auto_set_viewport( void ) +{ + int x, y, w, h; + + get_viewport_area( &x, &y, &w, &h ); + glViewport( MAX(x,0), MAX(y,0), MAX(w,0), MAX(h,0) ); +} + + + +/***************************************** GLUI::show() **********************/ + +void GLUI::show( void ) +{ + int orig_window; + + orig_window = main_panel->set_to_glut_window(); + + glutShowWindow(); + + main_panel->restore_window(orig_window); +} + + + +/***************************************** GLUI::hide() **********************/ + +void GLUI::hide( void ) +{ + int orig_window; + + this->deactivate_current_control(); + + orig_window = main_panel->set_to_glut_window(); + + glutHideWindow(); + + main_panel->restore_window(orig_window); +} + + +/**************** GLUI_DrawingSentinal **************/ +GLUI_DrawingSentinal::GLUI_DrawingSentinal(GLUI_Control *c_) + :c(c_) +{ + orig_win = c->set_to_glut_window(); + orig_buf = c->glui->set_current_draw_buffer(); +} +GLUI_DrawingSentinal::~GLUI_DrawingSentinal() { + c->glui->restore_draw_buffer(orig_buf); + c->restore_window(orig_win); +} + + +void GLUI_Master_Object::glui_setIdleFuncIfNecessary( void ) +{ + GLUI *glui; + + glui = (GLUI*) GLUI_Master.gluis.first_child(); + int necessary; + if (this->glut_idle_CB) + necessary = true; + else { + necessary = false; + while( glui ) { + if( glui->needs_idle() ) { + necessary = true; + break; + } + glui = (GLUI*) glui->next(); + } + } + if( necessary ) + glutIdleFunc( glui_idle_func ); + else + glutIdleFunc( NULL ); +} diff --git a/Extras/glui/glui_add_controls.cpp b/Extras/glui/glui_add_controls.cpp index b1d52f431..20ed43d12 100644 --- a/Extras/glui/glui_add_controls.cpp +++ b/Extras/glui/glui_add_controls.cpp @@ -1,319 +1,319 @@ -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - --------------------------- - - glui_add_controls.cpp - Routines for adding controls to a GLUI window - -Note: these routines are all deprecated. Keeping them all here -prevents the linker from dragging in all the .o files, even for controls -that aren't used. - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" - - -/*********************************** GLUI:: add_checkbox() ************/ - -GLUI_Checkbox *GLUI:: add_checkbox( const char *name, int *value_ptr, - int id, GLUI_CB callback ) -{ - return add_checkbox_to_panel( main_panel, - name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_checkbox_to_panel() **********/ - -GLUI_Checkbox *GLUI::add_checkbox_to_panel( GLUI_Panel *panel, - const char *name, int *value_ptr, - int id, - GLUI_CB callback ) -{ - return new GLUI_Checkbox( panel, name, value_ptr, id, callback ); -} - -/********************************************* GLUI::add_panel() *************/ - -GLUI_Panel *GLUI::add_panel( const char *name, int type ) -{ - return add_panel_to_panel( main_panel, name, type ); -} - - -/**************************************** GLUI::add_panel_to_panel() *********/ - -GLUI_Panel *GLUI::add_panel_to_panel( GLUI_Panel *parent_panel, - const char *name, int type ) -{ - return new GLUI_Panel( parent_panel, name, type ); -} - - -/***************************** GLUI::add_radiogroup() ***************/ - -GLUI_RadioGroup *GLUI::add_radiogroup( int *value_ptr, - int user_id, GLUI_CB callback) -{ - return add_radiogroup_to_panel( main_panel, value_ptr, - user_id, callback ); -} - - -/***************************** GLUI::add_radiogroup_to_panel() ***************/ - -GLUI_RadioGroup *GLUI::add_radiogroup_to_panel( - GLUI_Panel *panel, int *value_ptr, - int user_id, GLUI_CB callback - ) -{ - return new GLUI_RadioGroup( panel, value_ptr, user_id, callback ); -} - - -/***************************** GLUI::add_radiobutton_to_group() *************/ - -GLUI_RadioButton *GLUI::add_radiobutton_to_group( GLUI_RadioGroup *group, - const char *name ) -{ - return new GLUI_RadioButton( group, name ); -} - - -/********************************** GLUI::add_statictext() ************/ - -GLUI_StaticText *GLUI::add_statictext( const char *name ) -{ - return add_statictext_to_panel( main_panel, name ); -} - - -/******************************* GLUI::add_statictext_to_panel() **********/ - -GLUI_StaticText *GLUI::add_statictext_to_panel( GLUI_Panel *panel, - const char *name ) -{ - return new GLUI_StaticText( panel, name ); -} - - -/***************************************** GLUI:: add_button() ************/ - -GLUI_Button *GLUI:: add_button( const char *name, - int id, GLUI_CB callback ) -{ - return add_button_to_panel( main_panel, - name, id, callback ); -} - -/*********************************** GLUI:: add_button_to_panel() **********/ - -GLUI_Button *GLUI::add_button_to_panel( GLUI_Panel *panel, - const char *name, - int id, - GLUI_CB callback ) -{ - return new GLUI_Button( panel, name, id, callback ); -} - -/********************************** GLUI::add_separator() ************/ - -void GLUI::add_separator( void ) -{ - add_separator_to_panel( main_panel ); -} - - -/******************************* GLUI::add_separator_to_panel() **********/ - -void GLUI::add_separator_to_panel( GLUI_Panel *panel ) -{ - new GLUI_Separator( panel ); -} - - -/********************************** GLUI::add_edittext() ************/ - -GLUI_EditText *GLUI::add_edittext( const char *name, - int data_type, void *data, - int id, GLUI_CB callback) -{ - return add_edittext_to_panel( main_panel, name, data_type, data, - id, callback ); -} - - -/******************************* GLUI::add_edittext_to_panel() **********/ - -GLUI_EditText *GLUI::add_edittext_to_panel( GLUI_Panel *panel, - const char *name, - int data_type, void *data, - int id, GLUI_CB callback) -{ - return new GLUI_EditText( panel, name, data_type, data, id, callback ); -} - -/********************************** GLUI::add_edittext() ************/ - -GLUI_EditText *GLUI::add_edittext( const char *name, - GLUI_String & data, - int id, GLUI_CB callback) -{ - return add_edittext_to_panel( main_panel, name, data, id, callback ); -} - - -/******************************* GLUI::add_edittext_to_panel() **********/ - -GLUI_EditText* -GLUI::add_edittext_to_panel( GLUI_Panel *panel, const char *name, - GLUI_String& data, - int id, GLUI_CB callback) -{ - return new GLUI_EditText( panel, name, GLUI_EDITTEXT_STRING, &data, id, callback ); -} - -/********************************** GLUI::add_spinner() ************/ - -GLUI_Spinner *GLUI::add_spinner( const char *name, - int data_type, void *data, - int id, GLUI_CB callback) -{ - return add_spinner_to_panel( main_panel, name, data_type, data, - id, callback ); -} - - -/******************************* GLUI::add_spinner_to_panel() **********/ - -GLUI_Spinner *GLUI::add_spinner_to_panel( - GLUI_Panel *panel, const char *name, - int data_type, void *data, - int id, GLUI_CB callback -) -{ - return new GLUI_Spinner( panel, name, data_type, data, id, callback ); -} - - -/********************************** GLUI::add_column() ************/ - -void GLUI::add_column( int draw_bar ) -{ - add_column_to_panel( main_panel, draw_bar ); -} - - -/******************************* GLUI::add_column_to_panel() **********/ - -void GLUI::add_column_to_panel( GLUI_Panel *panel, int draw_bar ) -{ - new GLUI_Column( panel, draw_bar ); -} - - -/*********************************** GLUI:: add_listbox() ************/ - -GLUI_Listbox *GLUI:: add_listbox( const char *name, int *value_ptr, - int id, GLUI_CB callback ) -{ - return add_listbox_to_panel( main_panel, - name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_listbox_to_panel() **********/ - -GLUI_Listbox *GLUI::add_listbox_to_panel( GLUI_Panel *panel, - const char *name, int *value_ptr, - int id, - GLUI_CB callback ) -{ - return new GLUI_Listbox( panel, name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_rotation() ************/ - -GLUI_Rotation *GLUI:: add_rotation( const char *name, float *value_ptr, - int id, GLUI_CB callback ) -{ - return add_rotation_to_panel( main_panel, name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_rotation_to_panel() **********/ - -GLUI_Rotation *GLUI::add_rotation_to_panel( GLUI_Panel *panel, - const char *name, float *value_ptr, - int id, - GLUI_CB callback ) -{ - return new GLUI_Rotation( panel, name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_translation() ************/ - -GLUI_Translation *GLUI:: add_translation( const char *name, int trans_type, - float *value_ptr, int id, - GLUI_CB callback ) -{ - return add_translation_to_panel( main_panel,name,trans_type, - value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_translation_to_panel() **********/ - -GLUI_Translation *GLUI::add_translation_to_panel( - GLUI_Panel *panel, const char *name, - int trans_type, float *value_ptr, - int id, GLUI_CB callback - ) -{ - return new GLUI_Translation(panel, name, trans_type, value_ptr, id, callback); -} - - -/********************************** GLUI::add_rollout() **************/ - -GLUI_Rollout *GLUI::add_rollout( const char *name, int open, int type) -{ - return add_rollout_to_panel( main_panel, name, open, type); -} - - -/****************************** GLUI::add_rollout_to_panel() *********/ - -GLUI_Rollout *GLUI::add_rollout_to_panel(GLUI_Panel *panel, const char *name, - int open, int type) -{ - return new GLUI_Rollout( panel, name, open, type ); -} - - - +/**************************************************************************** + + GLUI User Interface Toolkit (LGPL) + --------------------------- + + glui_add_controls.cpp - Routines for adding controls to a GLUI window + +Note: these routines are all deprecated. Keeping them all here +prevents the linker from dragging in all the .o files, even for controls +that aren't used. + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "GL/glui.h" +#include "glui_internal.h" + + +/*********************************** GLUI:: add_checkbox() ************/ + +GLUI_Checkbox *GLUI:: add_checkbox( const char *name, int *value_ptr, + int id, GLUI_CB callback ) +{ + return add_checkbox_to_panel( main_panel, + name, value_ptr, id, callback ); +} + + +/*********************************** GLUI:: add_checkbox_to_panel() **********/ + +GLUI_Checkbox *GLUI::add_checkbox_to_panel( GLUI_Panel *panel, + const char *name, int *value_ptr, + int id, + GLUI_CB callback ) +{ + return new GLUI_Checkbox( panel, name, value_ptr, id, callback ); +} + +/********************************************* GLUI::add_panel() *************/ + +GLUI_Panel *GLUI::add_panel( const char *name, int type ) +{ + return add_panel_to_panel( main_panel, name, type ); +} + + +/**************************************** GLUI::add_panel_to_panel() *********/ + +GLUI_Panel *GLUI::add_panel_to_panel( GLUI_Panel *parent_panel, + const char *name, int type ) +{ + return new GLUI_Panel( parent_panel, name, type ); +} + + +/***************************** GLUI::add_radiogroup() ***************/ + +GLUI_RadioGroup *GLUI::add_radiogroup( int *value_ptr, + int user_id, GLUI_CB callback) +{ + return add_radiogroup_to_panel( main_panel, value_ptr, + user_id, callback ); +} + + +/***************************** GLUI::add_radiogroup_to_panel() ***************/ + +GLUI_RadioGroup *GLUI::add_radiogroup_to_panel( + GLUI_Panel *panel, int *value_ptr, + int user_id, GLUI_CB callback + ) +{ + return new GLUI_RadioGroup( panel, value_ptr, user_id, callback ); +} + + +/***************************** GLUI::add_radiobutton_to_group() *************/ + +GLUI_RadioButton *GLUI::add_radiobutton_to_group( GLUI_RadioGroup *group, + const char *name ) +{ + return new GLUI_RadioButton( group, name ); +} + + +/********************************** GLUI::add_statictext() ************/ + +GLUI_StaticText *GLUI::add_statictext( const char *name ) +{ + return add_statictext_to_panel( main_panel, name ); +} + + +/******************************* GLUI::add_statictext_to_panel() **********/ + +GLUI_StaticText *GLUI::add_statictext_to_panel( GLUI_Panel *panel, + const char *name ) +{ + return new GLUI_StaticText( panel, name ); +} + + +/***************************************** GLUI:: add_button() ************/ + +GLUI_Button *GLUI:: add_button( const char *name, + int id, GLUI_CB callback ) +{ + return add_button_to_panel( main_panel, + name, id, callback ); +} + +/*********************************** GLUI:: add_button_to_panel() **********/ + +GLUI_Button *GLUI::add_button_to_panel( GLUI_Panel *panel, + const char *name, + int id, + GLUI_CB callback ) +{ + return new GLUI_Button( panel, name, id, callback ); +} + +/********************************** GLUI::add_separator() ************/ + +void GLUI::add_separator( void ) +{ + add_separator_to_panel( main_panel ); +} + + +/******************************* GLUI::add_separator_to_panel() **********/ + +void GLUI::add_separator_to_panel( GLUI_Panel *panel ) +{ + new GLUI_Separator( panel ); +} + + +/********************************** GLUI::add_edittext() ************/ + +GLUI_EditText *GLUI::add_edittext( const char *name, + int data_type, void *data, + int id, GLUI_CB callback) +{ + return add_edittext_to_panel( main_panel, name, data_type, data, + id, callback ); +} + + +/******************************* GLUI::add_edittext_to_panel() **********/ + +GLUI_EditText *GLUI::add_edittext_to_panel( GLUI_Panel *panel, + const char *name, + int data_type, void *data, + int id, GLUI_CB callback) +{ + return new GLUI_EditText( panel, name, data_type, data, id, callback ); +} + +/********************************** GLUI::add_edittext() ************/ + +GLUI_EditText *GLUI::add_edittext( const char *name, + GLUI_String & data, + int id, GLUI_CB callback) +{ + return add_edittext_to_panel( main_panel, name, data, id, callback ); +} + + +/******************************* GLUI::add_edittext_to_panel() **********/ + +GLUI_EditText* +GLUI::add_edittext_to_panel( GLUI_Panel *panel, const char *name, + GLUI_String& data, + int id, GLUI_CB callback) +{ + return new GLUI_EditText( panel, name, GLUI_EDITTEXT_STRING, &data, id, callback ); +} + +/********************************** GLUI::add_spinner() ************/ + +GLUI_Spinner *GLUI::add_spinner( const char *name, + int data_type, void *data, + int id, GLUI_CB callback) +{ + return add_spinner_to_panel( main_panel, name, data_type, data, + id, callback ); +} + + +/******************************* GLUI::add_spinner_to_panel() **********/ + +GLUI_Spinner *GLUI::add_spinner_to_panel( + GLUI_Panel *panel, const char *name, + int data_type, void *data, + int id, GLUI_CB callback +) +{ + return new GLUI_Spinner( panel, name, data_type, data, id, callback ); +} + + +/********************************** GLUI::add_column() ************/ + +void GLUI::add_column( int draw_bar ) +{ + add_column_to_panel( main_panel, draw_bar ); +} + + +/******************************* GLUI::add_column_to_panel() **********/ + +void GLUI::add_column_to_panel( GLUI_Panel *panel, int draw_bar ) +{ + new GLUI_Column( panel, draw_bar ); +} + + +/*********************************** GLUI:: add_listbox() ************/ + +GLUI_Listbox *GLUI:: add_listbox( const char *name, int *value_ptr, + int id, GLUI_CB callback ) +{ + return add_listbox_to_panel( main_panel, + name, value_ptr, id, callback ); +} + + +/*********************************** GLUI:: add_listbox_to_panel() **********/ + +GLUI_Listbox *GLUI::add_listbox_to_panel( GLUI_Panel *panel, + const char *name, int *value_ptr, + int id, + GLUI_CB callback ) +{ + return new GLUI_Listbox( panel, name, value_ptr, id, callback ); +} + + +/*********************************** GLUI:: add_rotation() ************/ + +GLUI_Rotation *GLUI:: add_rotation( const char *name, float *value_ptr, + int id, GLUI_CB callback ) +{ + return add_rotation_to_panel( main_panel, name, value_ptr, id, callback ); +} + + +/*********************************** GLUI:: add_rotation_to_panel() **********/ + +GLUI_Rotation *GLUI::add_rotation_to_panel( GLUI_Panel *panel, + const char *name, float *value_ptr, + int id, + GLUI_CB callback ) +{ + return new GLUI_Rotation( panel, name, value_ptr, id, callback ); +} + + +/*********************************** GLUI:: add_translation() ************/ + +GLUI_Translation *GLUI:: add_translation( const char *name, int trans_type, + float *value_ptr, int id, + GLUI_CB callback ) +{ + return add_translation_to_panel( main_panel,name,trans_type, + value_ptr, id, callback ); +} + + +/*********************************** GLUI:: add_translation_to_panel() **********/ + +GLUI_Translation *GLUI::add_translation_to_panel( + GLUI_Panel *panel, const char *name, + int trans_type, float *value_ptr, + int id, GLUI_CB callback + ) +{ + return new GLUI_Translation(panel, name, trans_type, value_ptr, id, callback); +} + + +/********************************** GLUI::add_rollout() **************/ + +GLUI_Rollout *GLUI::add_rollout( const char *name, int open, int type) +{ + return add_rollout_to_panel( main_panel, name, open, type); +} + + +/****************************** GLUI::add_rollout_to_panel() *********/ + +GLUI_Rollout *GLUI::add_rollout_to_panel(GLUI_Panel *panel, const char *name, + int open, int type) +{ + return new GLUI_Rollout( panel, name, open, type ); +} + + + diff --git a/Extras/glui/glui_bitmap_img_data.cpp b/Extras/glui/glui_bitmap_img_data.cpp index 6ec7e6df4..bfcef31fa 100644 --- a/Extras/glui/glui_bitmap_img_data.cpp +++ b/Extras/glui/glui_bitmap_img_data.cpp @@ -1,138 +1,138 @@ -/** - Bitmaps for all GLUI images. - - These were converted from original PPM images - (mostly lost) with the tools/ppm2array program. - - The images here are extracted in typical OpenGL - bottom-to-top fashion. - - FIXME: don't use greyscale brightness here--this prevents - people changing the background color. Instead, use a code - indicating the underlying purpose of the pixel: - 0 = shadows; outlines; UI elements (check boxes, arrows) - 64 = disabled shadows and UI elements - 128 = shadowing, disabled - 192 = disabled white; background - 255 = highlights; checkbox/radio background - - I'm thinking the way to do this would be to have an -enum { - BG = 0, // Background shines through-- totally alpha transparent - BS, // Background of scrollbar/spin box-- opaque gray - SB, // Shadowed-black element-- strong alpha blend to black - SD, // Shadowed-dark element-- weak alpha blend to black - HL, // Highlight-light-- weak alpha blend to white - HW, // Highlight-white-- strong alpha blend to white - UB, // User-interface black-- arrows, checkboxes, radio buttons - UW, // User-interface white-- backgrounds of checkboxes and radio buttons -}; - - Orion Sky Lawlor, olawlor@acm.org, 2006/05/04 (LGPL) -*/ - -/*----------------------- checkboxes --------------------------*/ -unsigned char glui_img_checkbox_0[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -unsigned char glui_img_checkbox_0_dis[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -unsigned char glui_img_checkbox_1[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 0, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 0, 0, 0, 255, 255, 255, 255, 192, 255, 128, 0, 255, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 128, 0, 255, 0, 0, 255, 0, 0, 0, 255, 255, 192, 255, 128, 0, 255, 0, 255, 255, 255, 0, 0, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 0, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -unsigned char glui_img_checkbox_1_dis[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 64, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 64, 64, 64, 192, 192, 192, 192, 192, 255, 128, 64, 192, 64, 64, 64, 64, 64, 192, 192, 192, 192, 255, 128, 64, 192, 64, 64, 192, 64, 64, 64, 192, 192, 192, 255, 128, 64, 192, 64, 192, 192, 192, 64, 64, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 64, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -/*------------------------------- arrows -------------------------------------*/ -unsigned char glui_img_downarrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 0, 0, 0, 0, 0, 0, 0, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - - -unsigned char glui_img_leftarrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - -unsigned char glui_img_rightarrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - -unsigned char glui_img_uparrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 0, 0, 0, 0, 0, 0, 0, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - -/*------------------ listboxes ---------------------*/ -unsigned char glui_img_listbox_down[] = { 11, 17, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 127, 191, 191, 191, 127, 0, 127, 191, 191, 191, 127, 127, 127, 191, 191, 127, 0, 127, 191, 191, 127, 127, 127, 127, 127, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, -}; - - -unsigned char glui_img_listbox_up[] = { 11, 17, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 0, 191, 191, 191, 127, 0, 191, 255, 191, 191, 0, 0, 0, 191, 191, 127, 0, 191, 255, 191, 0, 0, 0, 0, 0, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 0, -}; - -unsigned char glui_img_listbox_up_dis[] = { 11, 17, /* width, height */ -127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 254, 191, 191, 191, 127, 127, 191, 255, 191, 191, 127, 127, 254, 191, 191, 127, 127, 191, 255, 191, 127, 127, 127, 127, 254, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, -}; - -/*--------------------------- radio buttons -------------------------*/ -unsigned char glui_img_radiobutton_0[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 255, 255, 255, 255, 192, 192, 255, 192, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 192, 128, 0, 0, 255, 255, 255, 255, 0, 0, 255, 192, 192, 192, 192, 192, 128, 128, 0, 0, 0, 0, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - -unsigned char glui_img_radiobutton_0_dis[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 64, 192, 192, 192, 192, 64, 64, 255, 192, 192, 192, 192, 192, 128, 128, 64, 64, 64, 64, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - -unsigned char glui_img_radiobutton_1[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 255, 255, 255, 255, 192, 192, 255, 192, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 0, 0, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 0, 0, 0, 0, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 0, 0, 0, 0, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 0, 0, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 192, 128, 0, 0, 255, 255, 255, 255, 0, 0, 255, 192, 192, 192, 192, 192, 128, 128, 0, 0, 0, 0, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - -unsigned char glui_img_radiobutton_1_dis[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 64, 64, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 64, 64, 64, 64, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 64, 64, 64, 64, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 64, 64, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 64, 192, 192, 192, 192, 64, 64, 255, 192, 192, 192, 192, 192, 128, 128, 64, 64, 64, 64, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - - -/*----------------- spinners ----------------------------*/ -unsigned char glui_img_spindown_0[] = { 12, 8, /* width, height */ -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 0, 127, 191, 191, 191, 127, 0, 255, 191, 191, 191, 0, 0, 0, 127, 191, 191, 127, 0, 255, 191, 191, 0, 0, 0, 0, 0, 127, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, -}; - - -unsigned char glui_img_spindown_1[] = { 12, 8, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 127, 0, 191, 191, 191, 191, 255, 0, 127, 191, 191, 127, 0, 0, 0, 191, 191, 191, 255, 0, 127, 191, 127, 0, 0, 0, 0, 0, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, -}; - - -unsigned char glui_img_spindown_dis[] = { 12, 8, /* width, height */ -255, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 127, 255, 191, 191, 191, 127, 64, 255, 191, 191, 191, 127, 127, 127, 255, 191, 191, 127, 64, 255, 191, 191, 127, 127, 127, 127, 127, 255, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 64, -}; - - -unsigned char glui_img_spinup_0[] = { 12, 8, /* width, height */ -255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 0, 0, 0, 0, 0, 127, 191, 127, 0, 255, 191, 191, 191, 0, 0, 0, 127, 191, 191, 127, 0, 255, 191, 191, 191, 191, 0, 127, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - - -unsigned char glui_img_spinup_1[] = { 12, 8, /* width, height */ - 0, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 127, 0, 0, 0, 0, 0, 191, 191, 255, 0, 127, 191, 191, 127, 0, 0, 0, 191, 191, 191, 255, 0, 127, 191, 191, 191, 127, 0, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, -}; - - -unsigned char glui_img_spinup_dis[] = { 12, 8, /* width, height */ -255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 127, 127, 127, 127, 127, 255, 191, 127, 64, 255, 191, 191, 191, 127, 127, 127, 255, 191, 191, 127, 64, 255, 191, 191, 191, 191, 127, 255, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - +/** + Bitmaps for all GLUI images. + + These were converted from original PPM images + (mostly lost) with the tools/ppm2array program. + + The images here are extracted in typical OpenGL + bottom-to-top fashion. + + FIXME: don't use greyscale brightness here--this prevents + people changing the background color. Instead, use a code + indicating the underlying purpose of the pixel: + 0 = shadows; outlines; UI elements (check boxes, arrows) + 64 = disabled shadows and UI elements + 128 = shadowing, disabled + 192 = disabled white; background + 255 = highlights; checkbox/radio background + + I'm thinking the way to do this would be to have an +enum { + BG = 0, // Background shines through-- totally alpha transparent + BS, // Background of scrollbar/spin box-- opaque gray + SB, // Shadowed-black element-- strong alpha blend to black + SD, // Shadowed-dark element-- weak alpha blend to black + HL, // Highlight-light-- weak alpha blend to white + HW, // Highlight-white-- strong alpha blend to white + UB, // User-interface black-- arrows, checkboxes, radio buttons + UW, // User-interface white-- backgrounds of checkboxes and radio buttons +}; + + Orion Sky Lawlor, olawlor@acm.org, 2006/05/04 (LGPL) +*/ + +/*----------------------- checkboxes --------------------------*/ +unsigned char glui_img_checkbox_0[] = { 13, 13, /* width, height */ +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, +}; + + +unsigned char glui_img_checkbox_0_dis[] = { 13, 13, /* width, height */ +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, +}; + + +unsigned char glui_img_checkbox_1[] = { 13, 13, /* width, height */ +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 0, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 0, 0, 0, 255, 255, 255, 255, 192, 255, 128, 0, 255, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 128, 0, 255, 0, 0, 255, 0, 0, 0, 255, 255, 192, 255, 128, 0, 255, 0, 255, 255, 255, 0, 0, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 0, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, +}; + + +unsigned char glui_img_checkbox_1_dis[] = { 13, 13, /* width, height */ +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 64, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 64, 64, 64, 192, 192, 192, 192, 192, 255, 128, 64, 192, 64, 64, 64, 64, 64, 192, 192, 192, 192, 255, 128, 64, 192, 64, 64, 192, 64, 64, 64, 192, 192, 192, 255, 128, 64, 192, 64, 192, 192, 192, 64, 64, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 64, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, +}; + + +/*------------------------------- arrows -------------------------------------*/ +unsigned char glui_img_downarrow[] = { 16, 16, /* width, height */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 0, 0, 0, 0, 0, 0, 0, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, +}; + + +unsigned char glui_img_leftarrow[] = { 16, 16, /* width, height */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, +}; + +unsigned char glui_img_rightarrow[] = { 16, 16, /* width, height */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, +}; + +unsigned char glui_img_uparrow[] = { 16, 16, /* width, height */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 0, 0, 0, 0, 0, 0, 0, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, +}; + +/*------------------ listboxes ---------------------*/ +unsigned char glui_img_listbox_down[] = { 11, 17, /* width, height */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 127, 191, 191, 191, 127, 0, 127, 191, 191, 191, 127, 127, 127, 191, 191, 127, 0, 127, 191, 191, 127, 127, 127, 127, 127, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, +}; + + +unsigned char glui_img_listbox_up[] = { 11, 17, /* width, height */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 0, 191, 191, 191, 127, 0, 191, 255, 191, 191, 0, 0, 0, 191, 191, 127, 0, 191, 255, 191, 0, 0, 0, 0, 0, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 0, +}; + +unsigned char glui_img_listbox_up_dis[] = { 11, 17, /* width, height */ +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 254, 191, 191, 191, 127, 127, 191, 255, 191, 191, 127, 127, 254, 191, 191, 127, 127, 191, 255, 191, 127, 127, 127, 127, 254, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, +}; + +/*--------------------------- radio buttons -------------------------*/ +unsigned char glui_img_radiobutton_0[] = { 14, 14, /* width, height */ +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 255, 255, 255, 255, 192, 192, 255, 192, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 192, 128, 0, 0, 255, 255, 255, 255, 0, 0, 255, 192, 192, 192, 192, 192, 128, 128, 0, 0, 0, 0, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +}; + + +unsigned char glui_img_radiobutton_0_dis[] = { 14, 14, /* width, height */ +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 64, 192, 192, 192, 192, 64, 64, 255, 192, 192, 192, 192, 192, 128, 128, 64, 64, 64, 64, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +}; + + +unsigned char glui_img_radiobutton_1[] = { 14, 14, /* width, height */ +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 255, 255, 255, 255, 192, 192, 255, 192, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 0, 0, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 0, 0, 0, 0, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 0, 0, 0, 0, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 0, 0, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 192, 128, 0, 0, 255, 255, 255, 255, 0, 0, 255, 192, 192, 192, 192, 192, 128, 128, 0, 0, 0, 0, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +}; + + +unsigned char glui_img_radiobutton_1_dis[] = { 14, 14, /* width, height */ +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 64, 64, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 64, 64, 64, 64, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 64, 64, 64, 64, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 64, 64, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 64, 192, 192, 192, 192, 64, 64, 255, 192, 192, 192, 192, 192, 128, 128, 64, 64, 64, 64, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +}; + + + +/*----------------- spinners ----------------------------*/ +unsigned char glui_img_spindown_0[] = { 12, 8, /* width, height */ +255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 0, 127, 191, 191, 191, 127, 0, 255, 191, 191, 191, 0, 0, 0, 127, 191, 191, 127, 0, 255, 191, 191, 0, 0, 0, 0, 0, 127, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, +}; + + +unsigned char glui_img_spindown_1[] = { 12, 8, /* width, height */ +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 127, 0, 191, 191, 191, 191, 255, 0, 127, 191, 191, 127, 0, 0, 0, 191, 191, 191, 255, 0, 127, 191, 127, 0, 0, 0, 0, 0, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, +}; + + +unsigned char glui_img_spindown_dis[] = { 12, 8, /* width, height */ +255, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 127, 255, 191, 191, 191, 127, 64, 255, 191, 191, 191, 127, 127, 127, 255, 191, 191, 127, 64, 255, 191, 191, 127, 127, 127, 127, 127, 255, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 64, +}; + + +unsigned char glui_img_spinup_0[] = { 12, 8, /* width, height */ +255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 0, 0, 0, 0, 0, 127, 191, 127, 0, 255, 191, 191, 191, 0, 0, 0, 127, 191, 191, 127, 0, 255, 191, 191, 191, 191, 0, 127, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +}; + + +unsigned char glui_img_spinup_1[] = { 12, 8, /* width, height */ + 0, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 127, 0, 0, 0, 0, 0, 191, 191, 255, 0, 127, 191, 191, 127, 0, 0, 0, 191, 191, 191, 255, 0, 127, 191, 191, 191, 127, 0, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, +}; + + +unsigned char glui_img_spinup_dis[] = { 12, 8, /* width, height */ +255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 127, 127, 127, 127, 127, 255, 191, 127, 64, 255, 191, 191, 191, 127, 127, 127, 255, 191, 191, 127, 64, 255, 191, 191, 191, 191, 127, 255, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +}; + diff --git a/Extras/glui/glui_bitmaps.cpp b/Extras/glui/glui_bitmaps.cpp index 8bebf5d8f..35d338ec7 100644 --- a/Extras/glui/glui_bitmaps.cpp +++ b/Extras/glui/glui_bitmaps.cpp @@ -1,176 +1,176 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_bitmaps.cpp - -Draws the hardcoded images listed in glui_bitmap_img_data with OpenGL. - -FIXME: upload the images to a texture. This will allow them to be: - - Drawn with alpha blending - - Drawn at random sizes and angles onscreen - - Drawn much faster than with glDrawPixels - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" -#include - -/************ Image Bitmap arrays **********/ - -extern unsigned char glui_img_checkbox_0[]; -extern unsigned char glui_img_checkbox_1[]; -extern unsigned char glui_img_radiobutton_0[]; -extern unsigned char glui_img_radiobutton_1[]; -extern unsigned char glui_img_uparrow[]; -extern unsigned char glui_img_downarrow[]; -extern unsigned char glui_img_leftarrow[]; -extern unsigned char glui_img_rightarrow[]; -extern unsigned char glui_img_spinup_0[]; -extern unsigned char glui_img_spinup_1[]; -extern unsigned char glui_img_spindown_0[]; -extern unsigned char glui_img_spindown_1[]; -extern unsigned char glui_img_checkbox_0_dis[]; -extern unsigned char glui_img_checkbox_1_dis[]; -extern unsigned char glui_img_radiobutton_0_dis[]; -extern unsigned char glui_img_radiobutton_1_dis[]; -extern unsigned char glui_img_spinup_dis[]; -extern unsigned char glui_img_spindown_dis[]; -extern unsigned char glui_img_listbox_up[]; -extern unsigned char glui_img_listbox_down[]; -extern unsigned char glui_img_listbox_up_dis[]; - - -// These must be in the same order as the GLUI_STDBITMAP enums from glui.h! -unsigned char *bitmap_arrays[] = { - glui_img_checkbox_0, - glui_img_checkbox_1, - glui_img_radiobutton_0, - glui_img_radiobutton_1, - glui_img_uparrow, - glui_img_downarrow, - glui_img_leftarrow, - glui_img_rightarrow, - glui_img_spinup_0, - glui_img_spinup_1, - glui_img_spindown_0, - glui_img_spindown_1, - glui_img_checkbox_0_dis, - glui_img_checkbox_1_dis, - glui_img_radiobutton_0_dis, - glui_img_radiobutton_1_dis, - glui_img_spinup_dis, - glui_img_spindown_dis, - glui_img_listbox_up, - glui_img_listbox_down, - glui_img_listbox_up_dis, -}; - - -/************************************ GLUI_Bitmap::load_from_array() ********/ - -GLUI_Bitmap::GLUI_Bitmap() -: pixels(NULL), - w(0), - h(0) -{ -} - -GLUI_Bitmap::~GLUI_Bitmap() -{ - if (pixels) - { - free(pixels); - pixels = NULL; - } -} - -/* Create bitmap from greyscale byte array */ -void GLUI_Bitmap::init_grey(unsigned char *array) -{ - w = array[0]; h = array[1]; - pixels = (unsigned char *) malloc(w*h*3); - assert(pixels); - - for(int i = 0; i=0 && i=0 && i=0 && i + +/************ Image Bitmap arrays **********/ + +extern unsigned char glui_img_checkbox_0[]; +extern unsigned char glui_img_checkbox_1[]; +extern unsigned char glui_img_radiobutton_0[]; +extern unsigned char glui_img_radiobutton_1[]; +extern unsigned char glui_img_uparrow[]; +extern unsigned char glui_img_downarrow[]; +extern unsigned char glui_img_leftarrow[]; +extern unsigned char glui_img_rightarrow[]; +extern unsigned char glui_img_spinup_0[]; +extern unsigned char glui_img_spinup_1[]; +extern unsigned char glui_img_spindown_0[]; +extern unsigned char glui_img_spindown_1[]; +extern unsigned char glui_img_checkbox_0_dis[]; +extern unsigned char glui_img_checkbox_1_dis[]; +extern unsigned char glui_img_radiobutton_0_dis[]; +extern unsigned char glui_img_radiobutton_1_dis[]; +extern unsigned char glui_img_spinup_dis[]; +extern unsigned char glui_img_spindown_dis[]; +extern unsigned char glui_img_listbox_up[]; +extern unsigned char glui_img_listbox_down[]; +extern unsigned char glui_img_listbox_up_dis[]; + + +// These must be in the same order as the GLUI_STDBITMAP enums from glui.h! +unsigned char *bitmap_arrays[] = { + glui_img_checkbox_0, + glui_img_checkbox_1, + glui_img_radiobutton_0, + glui_img_radiobutton_1, + glui_img_uparrow, + glui_img_downarrow, + glui_img_leftarrow, + glui_img_rightarrow, + glui_img_spinup_0, + glui_img_spinup_1, + glui_img_spindown_0, + glui_img_spindown_1, + glui_img_checkbox_0_dis, + glui_img_checkbox_1_dis, + glui_img_radiobutton_0_dis, + glui_img_radiobutton_1_dis, + glui_img_spinup_dis, + glui_img_spindown_dis, + glui_img_listbox_up, + glui_img_listbox_down, + glui_img_listbox_up_dis, +}; + + +/************************************ GLUI_Bitmap::load_from_array() ********/ + +GLUI_Bitmap::GLUI_Bitmap() +: pixels(NULL), + w(0), + h(0) +{ +} + +GLUI_Bitmap::~GLUI_Bitmap() +{ + if (pixels) + { + free(pixels); + pixels = NULL; + } +} + +/* Create bitmap from greyscale byte array */ +void GLUI_Bitmap::init_grey(unsigned char *array) +{ + w = array[0]; h = array[1]; + pixels = (unsigned char *) malloc(w*h*3); + assert(pixels); + + for(int i = 0; i=0 && i=0 && i=0 && iadd_control( this ); -} - - -/****************************** GLUI_Button::mouse_down_handler() **********/ - -int GLUI_Button::mouse_down_handler( int local_x, int local_y ) -{ - int_val = 1; /** A button always in unpressed before here, so - now we invariably set it to 'depressed' **/ - - currently_inside = true; - redraw(); - - return false; -} - - -/****************************** GLUI_Button::mouse_up_handler() **********/ - -int GLUI_Button::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - set_int_val( 0 ); /** A button always turns off after you press it **/ - - currently_inside = false; - redraw(); - - if ( inside ) { - /*** Invoke the user's callback ***/ - execute_callback(); - } - - return false; -} - - -/****************************** GLUI_Button::mouse_held_down_handler() ******/ - -int GLUI_Button::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - if (new_inside != currently_inside) { - currently_inside = new_inside; - redraw(); - } - - return false; -} - - -/****************************** GLUI_Button::key_handler() **********/ - -int GLUI_Button::key_handler( unsigned char key,int modifiers ) -{ - return false; -} - -/********************************************** GLUI_Button::draw() **********/ - -void GLUI_Button::draw( int x, int y ) -{ - if (currently_inside) draw_pressed(); - else { - glui->draw_raised_box( 0, 0, w, h ); - draw_text( 0 ); - } -} - - -/************************************** GLUI_Button::draw_pressed() ******/ - -void GLUI_Button::draw_pressed( void ) -{ - glColor3f( 0.0, 0.0, 0.0 ); - - draw_text( 1 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( w, h ); glVertex2i( 0, h ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( w-1, h-1 ); glVertex2i( 1, h-1 ); - glEnd(); -} - - -/**************************************** GLUI_Button::draw_text() **********/ - -void GLUI_Button::draw_text( int sunken ) -{ - int string_width; - - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i( 2, h-2 ); - glEnd(); - - glColor3ub( 0,0,0 ); - - string_width = _glutBitmapWidthString( glui->font, - this->name.c_str() ); - if ( NOT sunken ) { - draw_name( MAX((w-string_width),0)/2, 13); - } - else { - draw_name( MAX((w-string_width),0)/2 + 1, 13 + 1); - } - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - - glColor3f( 0., 0., 0. ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( 3, 3 ); glVertex2i( w-3, 3 ); - glVertex2i( w-3, h-3 ); glVertex2i( 3, h-3 ); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); - } -} - - -/************************************** GLUI_Button::update_size() **********/ - -void GLUI_Button::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width( name ); - - if ( w < text_size + 16 ) - w = text_size + 16 ; -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_button.cpp - GLUI_Button control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ +#include "glui_internal_control.h" + +/****************************** GLUI_Button::GLUI_Button() **********/ + +GLUI_Button::GLUI_Button( GLUI_Node *parent, const char *name, + int id, GLUI_CB cb ) +{ + common_init(); + user_id = id; + callback = cb; + set_name( name ); + currently_inside = false; + + parent->add_control( this ); +} + + +/****************************** GLUI_Button::mouse_down_handler() **********/ + +int GLUI_Button::mouse_down_handler( int local_x, int local_y ) +{ + int_val = 1; /** A button always in unpressed before here, so + now we invariably set it to 'depressed' **/ + + currently_inside = true; + redraw(); + + return false; +} + + +/****************************** GLUI_Button::mouse_up_handler() **********/ + +int GLUI_Button::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + set_int_val( 0 ); /** A button always turns off after you press it **/ + + currently_inside = false; + redraw(); + + if ( inside ) { + /*** Invoke the user's callback ***/ + execute_callback(); + } + + return false; +} + + +/****************************** GLUI_Button::mouse_held_down_handler() ******/ + +int GLUI_Button::mouse_held_down_handler( int local_x, int local_y, + bool new_inside) +{ + if (new_inside != currently_inside) { + currently_inside = new_inside; + redraw(); + } + + return false; +} + + +/****************************** GLUI_Button::key_handler() **********/ + +int GLUI_Button::key_handler( unsigned char key,int modifiers ) +{ + return false; +} + +/********************************************** GLUI_Button::draw() **********/ + +void GLUI_Button::draw( int x, int y ) +{ + if (currently_inside) draw_pressed(); + else { + glui->draw_raised_box( 0, 0, w, h ); + draw_text( 0 ); + } +} + + +/************************************** GLUI_Button::draw_pressed() ******/ + +void GLUI_Button::draw_pressed( void ) +{ + glColor3f( 0.0, 0.0, 0.0 ); + + draw_text( 1 ); + + glBegin( GL_LINE_LOOP ); + glVertex2i( 0, 0 ); glVertex2i( w, 0 ); + glVertex2i( w, h ); glVertex2i( 0, h ); + glEnd(); + + glBegin( GL_LINE_LOOP ); + glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); + glVertex2i( w-1, h-1 ); glVertex2i( 1, h-1 ); + glEnd(); +} + + +/**************************************** GLUI_Button::draw_text() **********/ + +void GLUI_Button::draw_text( int sunken ) +{ + int string_width; + + glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); + glVertex2i( w-2, h-2 ); glVertex2i( 2, h-2 ); + glEnd(); + + glColor3ub( 0,0,0 ); + + string_width = _glutBitmapWidthString( glui->font, + this->name.c_str() ); + if ( NOT sunken ) { + draw_name( MAX((w-string_width),0)/2, 13); + } + else { + draw_name( MAX((w-string_width),0)/2 + 1, 13 + 1); + } + + if ( active ) { + glEnable( GL_LINE_STIPPLE ); + glLineStipple( 1, 0x5555 ); + + glColor3f( 0., 0., 0. ); + + glBegin( GL_LINE_LOOP ); + glVertex2i( 3, 3 ); glVertex2i( w-3, 3 ); + glVertex2i( w-3, h-3 ); glVertex2i( 3, h-3 ); + glEnd(); + + glDisable( GL_LINE_STIPPLE ); + } +} + + +/************************************** GLUI_Button::update_size() **********/ + +void GLUI_Button::update_size( void ) +{ + int text_size; + + if ( NOT glui ) + return; + + text_size = string_width( name ); + + if ( w < text_size + 16 ) + w = text_size + 16 ; +} diff --git a/Extras/glui/glui_checkbox.cpp b/Extras/glui/glui_checkbox.cpp index 3bf3984d3..ed77b3638 100644 --- a/Extras/glui/glui_checkbox.cpp +++ b/Extras/glui/glui_checkbox.cpp @@ -1,188 +1,188 @@ - -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - --------------------------- - - glui_checkbox - GLUI_Checkbox control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_Checkbox::GLUI_Checkbox() **********/ - -GLUI_Checkbox::GLUI_Checkbox( GLUI_Node *parent, - const char *name, int *value_ptr, - int id, - GLUI_CB cb ) -{ - common_init(); - - set_ptr_val( value_ptr ); - set_name( name ); - user_id = id; - callback = cb; - - parent->add_control( this ); - - init_live(); -} - -/****************************** GLUI_Checkbox::mouse_down_handler() **********/ - -int GLUI_Checkbox::mouse_down_handler( int local_x, int local_y ) -{ - orig_value = int_val; - int_val = !int_val; - - currently_inside = true; - redraw(); - - return false; -} - - -/****************************** GLUI_Checkbox::mouse_up_handler() **********/ - -int GLUI_Checkbox::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - if ( NOT inside ) { /* undo effect on value */ - int_val = orig_value; - } - else { - set_int_val( int_val ); - - /*** Invoke the callback ***/ - execute_callback(); - } - - return false; -} - - -/****************************** GLUI_Checkbox::mouse_held_down_handler() ******/ - -int GLUI_Checkbox::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - /********** Toggle checked and unchecked bitmap if we're entering or - leaving the checkbox area **********/ - if ( inside != currently_inside ) { - int_val = !int_val; - currently_inside = inside; - redraw(); - } - - return false; -} - - -/****************************** GLUI_Checkbox::key_handler() **********/ - -int GLUI_Checkbox::key_handler( unsigned char key,int modifiers ) -{ - return false; -} - - -/****************************** GLUI_Checkbox::draw() **********/ - -void GLUI_Checkbox::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( int_val != 0 ) { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_ON, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_ON_DIS, 0, 0 ); - } - else { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_OFF, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_OFF_DIS, 0, 0 ); - } - - draw_active_area(); - - draw_name( text_x_offset, 10); -} - -/**************************** GLUI_Checkbox::draw_active_area() **************/ - -void GLUI_Checkbox::draw_active_area( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_width, left, right; - - text_width = _glutBitmapWidthString( glui->font, name.c_str() ); - left = text_x_offset-3; - right = left + 7 + text_width; - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - } else { - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); - } - - glBegin( GL_LINE_LOOP ); - glVertex2i(left,0); glVertex2i( right,0); - glVertex2i(right,h+1); glVertex2i( left,h+1); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); -} - - -/************************************ GLUI_Checkbox::update_size() **********/ - -void GLUI_Checkbox::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = _glutBitmapWidthString( glui->font, name.c_str() ); - - /* if ( w < text_x_offset + text_size + 6 ) */ - w = text_x_offset + text_size + 6 ; -} - - -/********************************* GLUI_Checkbox::set_int_val() **************/ - -void GLUI_Checkbox::set_int_val( int new_val ) -{ - int_val = new_val; - - /*** Update the variable we're (possibly) pointing to ***/ - output_live(true); - redraw(); -} + +/**************************************************************************** + + GLUI User Interface Toolkit (LGPL) + --------------------------- + + glui_checkbox - GLUI_Checkbox control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +/****************************** GLUI_Checkbox::GLUI_Checkbox() **********/ + +GLUI_Checkbox::GLUI_Checkbox( GLUI_Node *parent, + const char *name, int *value_ptr, + int id, + GLUI_CB cb ) +{ + common_init(); + + set_ptr_val( value_ptr ); + set_name( name ); + user_id = id; + callback = cb; + + parent->add_control( this ); + + init_live(); +} + +/****************************** GLUI_Checkbox::mouse_down_handler() **********/ + +int GLUI_Checkbox::mouse_down_handler( int local_x, int local_y ) +{ + orig_value = int_val; + int_val = !int_val; + + currently_inside = true; + redraw(); + + return false; +} + + +/****************************** GLUI_Checkbox::mouse_up_handler() **********/ + +int GLUI_Checkbox::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + if ( NOT inside ) { /* undo effect on value */ + int_val = orig_value; + } + else { + set_int_val( int_val ); + + /*** Invoke the callback ***/ + execute_callback(); + } + + return false; +} + + +/****************************** GLUI_Checkbox::mouse_held_down_handler() ******/ + +int GLUI_Checkbox::mouse_held_down_handler( int local_x, int local_y, + bool inside) +{ + /********** Toggle checked and unchecked bitmap if we're entering or + leaving the checkbox area **********/ + if ( inside != currently_inside ) { + int_val = !int_val; + currently_inside = inside; + redraw(); + } + + return false; +} + + +/****************************** GLUI_Checkbox::key_handler() **********/ + +int GLUI_Checkbox::key_handler( unsigned char key,int modifiers ) +{ + return false; +} + + +/****************************** GLUI_Checkbox::draw() **********/ + +void GLUI_Checkbox::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + if ( int_val != 0 ) { + if ( enabled ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_ON, 0, 0 ); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_ON_DIS, 0, 0 ); + } + else { + if ( enabled ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_OFF, 0, 0 ); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_OFF_DIS, 0, 0 ); + } + + draw_active_area(); + + draw_name( text_x_offset, 10); +} + +/**************************** GLUI_Checkbox::draw_active_area() **************/ + +void GLUI_Checkbox::draw_active_area( void ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int text_width, left, right; + + text_width = _glutBitmapWidthString( glui->font, name.c_str() ); + left = text_x_offset-3; + right = left + 7 + text_width; + + if ( active ) { + glEnable( GL_LINE_STIPPLE ); + glLineStipple( 1, 0x5555 ); + glColor3f( 0., 0., 0. ); + } else { + glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); + } + + glBegin( GL_LINE_LOOP ); + glVertex2i(left,0); glVertex2i( right,0); + glVertex2i(right,h+1); glVertex2i( left,h+1); + glEnd(); + + glDisable( GL_LINE_STIPPLE ); +} + + +/************************************ GLUI_Checkbox::update_size() **********/ + +void GLUI_Checkbox::update_size( void ) +{ + int text_size; + + if ( NOT glui ) + return; + + text_size = _glutBitmapWidthString( glui->font, name.c_str() ); + + /* if ( w < text_x_offset + text_size + 6 ) */ + w = text_x_offset + text_size + 6 ; +} + + +/********************************* GLUI_Checkbox::set_int_val() **************/ + +void GLUI_Checkbox::set_int_val( int new_val ) +{ + int_val = new_val; + + /*** Update the variable we're (possibly) pointing to ***/ + output_live(true); + redraw(); +} diff --git a/Extras/glui/glui_column.cpp b/Extras/glui/glui_column.cpp index 172d3c1e6..29901bc3d 100644 --- a/Extras/glui/glui_column.cpp +++ b/Extras/glui/glui_column.cpp @@ -1,89 +1,89 @@ -/**************************************************************************** - GLUI User Interface Toolkit - --------------------------- - - glui_column.cpp - GLUI_Column control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/******************************** GLUI_Column::GLUI_Column() ************/ - -GLUI_Column::GLUI_Column( GLUI_Node *parent, int draw_bar ) -{ - common_init(); - int_val = draw_bar; /* Whether to draw vertical bar or not */ - - parent->add_control( this ); -} - -/**************************************** GLUI_Column::draw() ************/ - -void GLUI_Column::draw( int x, int y ) -{ - int panel_x, panel_y, panel_w, panel_h, panel_x_off, panel_y_off; - int y_diff; - - if ( int_val == 1 ) { /* Draw a vertical bar */ - GLUI_DRAWINGSENTINAL_IDIOM - if ( parent() != NULL ) { - get_this_column_dims(&panel_x, &panel_y, &panel_w, &panel_h, - &panel_x_off, &panel_y_off); - - y_diff = y_abs - panel_y; - - if ( 0 ) { - glLineWidth(1.0); - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( -GLUI_XOFF+1, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); - glVertex2i( -GLUI_XOFF+1, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i( -GLUI_XOFF+2, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); - glVertex2i( -GLUI_XOFF+2, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); - glEnd(); - } - else { - glLineWidth(1.0); - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( -2, 0 ); - glVertex2i( -2, h ); - /*glVertex2i( 0, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); */ - /*glVertex2i( 0, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); */ - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i( -1, 0 ); - glVertex2i( -1, h ); - /*glVertex2i( 1, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); */ - /*glVertex2i( 1, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); */ - glEnd(); - } - } - } -} - +/**************************************************************************** + GLUI User Interface Toolkit + --------------------------- + + glui_column.cpp - GLUI_Column control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +/******************************** GLUI_Column::GLUI_Column() ************/ + +GLUI_Column::GLUI_Column( GLUI_Node *parent, int draw_bar ) +{ + common_init(); + int_val = draw_bar; /* Whether to draw vertical bar or not */ + + parent->add_control( this ); +} + +/**************************************** GLUI_Column::draw() ************/ + +void GLUI_Column::draw( int x, int y ) +{ + int panel_x, panel_y, panel_w, panel_h, panel_x_off, panel_y_off; + int y_diff; + + if ( int_val == 1 ) { /* Draw a vertical bar */ + GLUI_DRAWINGSENTINAL_IDIOM + if ( parent() != NULL ) { + get_this_column_dims(&panel_x, &panel_y, &panel_w, &panel_h, + &panel_x_off, &panel_y_off); + + y_diff = y_abs - panel_y; + + if ( 0 ) { + glLineWidth(1.0); + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( -GLUI_XOFF+1, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); + glVertex2i( -GLUI_XOFF+1, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); + + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i( -GLUI_XOFF+2, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); + glVertex2i( -GLUI_XOFF+2, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); + glEnd(); + } + else { + glLineWidth(1.0); + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( -2, 0 ); + glVertex2i( -2, h ); + /*glVertex2i( 0, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); */ + /*glVertex2i( 0, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); */ + + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i( -1, 0 ); + glVertex2i( -1, h ); + /*glVertex2i( 1, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); */ + /*glVertex2i( 1, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); */ + glEnd(); + } + } + } +} + diff --git a/Extras/glui/glui_commandline.cpp b/Extras/glui/glui_commandline.cpp index 9f823d99f..758659825 100644 --- a/Extras/glui/glui_commandline.cpp +++ b/Extras/glui/glui_commandline.cpp @@ -1,197 +1,197 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_commandline.cpp - GLUI_CommandLine control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher, 2005 William Baxter - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA - - This program is -not- in the public domain. - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" - -/****************************** GLUI_CommandLine::GLUI_CommandLine() **********/ -GLUI_CommandLine::GLUI_CommandLine( GLUI_Node *parent, const char *name, - void *data, int id, GLUI_CB cb ) -{ - common_init(); - set_name( name ); - - data_type = GLUI_EDITTEXT_TEXT; - ptr_val = data; - user_id = id; - callback = cb; - - live_type = GLUI_LIVE_TEXT; - - parent->add_control( this ); - - init_live(); -} - -/****************************** GLUI_CommandLine::key_handler() **********/ - -int GLUI_CommandLine::key_handler( unsigned char key,int modifiers ) -{ - int ret; - - if ( NOT glui ) - return false; - - if ( debug ) - dump( stdout, "-> CMD_TEXT KEY HANDLER" ); - - if ( key == 13 ) { /* RETURN */ - commit_flag = true; - } - - ret = Super::key_handler( key, modifiers ); - - if ( debug ) - dump( stdout, "<- CMD_TEXT KEY HANDLER" ); - - return ret; -} - - -/****************************** GLUI_CommandLine::deactivate() **********/ - -void GLUI_CommandLine::deactivate( void ) -{ - // if the commit_flag is set, add the current command to - // history and call deactivate as normal - - // Trick deactivate into calling callback if and only if commit_flag set. - // A bit subtle, but deactivate checks that orig_text and text - // are the same to decide whether or not to call the callback. - // Force them to be different for commit, and the same for no commit. - if (commit_flag) { - add_to_history(text.c_str()); - orig_text = ""; - Super::deactivate( ); - set_text( "" ); - commit_flag = false; - } - else { - orig_text = text; - } -} - -/**************************** GLUI_CommandLine::special_handler() **********/ - -int GLUI_CommandLine::special_handler( int key,int modifiers ) -{ - if ( NOT glui ) - return false; - - if ( debug ) - printf( "CMD_TEXT SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", - key, modifiers, substring_start, substring_end,insertion_pt, - sel_start, sel_end ); - - if ( key == GLUT_KEY_UP ) // PREVIOUS HISTORY - { - scroll_history(-1); - } - else if ( key == GLUT_KEY_DOWN ) // NEXT HISTORY - { - scroll_history(+1); - } - else { - return Super::special_handler( key, modifiers ); - } - return false; -} - - - -/**************************** GLUI_CommandLine::scroll_history() ********/ - -void GLUI_CommandLine::scroll_history( int direction ) -{ - recall_history(curr_hist + direction); -} - -/**************************** GLUI_CommandLine::recall_history() ********/ - -void GLUI_CommandLine::recall_history( int hist_num ) -{ - if (hist_num < oldest_hist OR - hist_num > newest_hist OR - hist_num == curr_hist) - return; - - // Commit the current text first before we blow it away! - if (curr_hist == newest_hist) { - get_history_str(newest_hist) = text; - } - - curr_hist = hist_num; - set_text(get_history_str(curr_hist)); - sel_end = sel_start = insertion_pt = (int)text.length(); - update_and_draw_text(); -} - -/**************************** GLUI_CommandLine::add_to_history() ********/ - -void GLUI_CommandLine::add_to_history( const char *cmd ) -{ - if (cmd[0]=='\0') return; // don't add if it's empty - - curr_hist = newest_hist; - get_history_str(newest_hist) = text; - - newest_hist = ++curr_hist; - if ( newest_hist >= HIST_SIZE ) - { - // bump oldest off the list - hist_list.erase(hist_list.begin()); - hist_list.push_back(""); - - oldest_hist++; - } -} - -/**************************** GLUI_CommandLine::reset_history() ********/ - -void GLUI_CommandLine::reset_history( void ) -{ - oldest_hist = newest_hist = curr_hist = 0; -} - - - -/*************************************** GLUI_CommandLine::dump() **************/ - -void GLUI_CommandLine::dump( FILE *out, const char *name ) -{ - fprintf( out, - "%s (commandline@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", - name, this, - insertion_pt, substring_start, substring_end, sel_start, sel_end, - (int)text.length()); -} - - +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_commandline.cpp - GLUI_CommandLine control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher, 2005 William Baxter + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA + + This program is -not- in the public domain. + +*****************************************************************************/ + +#include "GL/glui.h" +#include "glui_internal.h" + +/****************************** GLUI_CommandLine::GLUI_CommandLine() **********/ +GLUI_CommandLine::GLUI_CommandLine( GLUI_Node *parent, const char *name, + void *data, int id, GLUI_CB cb ) +{ + common_init(); + set_name( name ); + + data_type = GLUI_EDITTEXT_TEXT; + ptr_val = data; + user_id = id; + callback = cb; + + live_type = GLUI_LIVE_TEXT; + + parent->add_control( this ); + + init_live(); +} + +/****************************** GLUI_CommandLine::key_handler() **********/ + +int GLUI_CommandLine::key_handler( unsigned char key,int modifiers ) +{ + int ret; + + if ( NOT glui ) + return false; + + if ( debug ) + dump( stdout, "-> CMD_TEXT KEY HANDLER" ); + + if ( key == 13 ) { /* RETURN */ + commit_flag = true; + } + + ret = Super::key_handler( key, modifiers ); + + if ( debug ) + dump( stdout, "<- CMD_TEXT KEY HANDLER" ); + + return ret; +} + + +/****************************** GLUI_CommandLine::deactivate() **********/ + +void GLUI_CommandLine::deactivate( void ) +{ + // if the commit_flag is set, add the current command to + // history and call deactivate as normal + + // Trick deactivate into calling callback if and only if commit_flag set. + // A bit subtle, but deactivate checks that orig_text and text + // are the same to decide whether or not to call the callback. + // Force them to be different for commit, and the same for no commit. + if (commit_flag) { + add_to_history(text.c_str()); + orig_text = ""; + Super::deactivate( ); + set_text( "" ); + commit_flag = false; + } + else { + orig_text = text; + } +} + +/**************************** GLUI_CommandLine::special_handler() **********/ + +int GLUI_CommandLine::special_handler( int key,int modifiers ) +{ + if ( NOT glui ) + return false; + + if ( debug ) + printf( "CMD_TEXT SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", + key, modifiers, substring_start, substring_end,insertion_pt, + sel_start, sel_end ); + + if ( key == GLUT_KEY_UP ) // PREVIOUS HISTORY + { + scroll_history(-1); + } + else if ( key == GLUT_KEY_DOWN ) // NEXT HISTORY + { + scroll_history(+1); + } + else { + return Super::special_handler( key, modifiers ); + } + return false; +} + + + +/**************************** GLUI_CommandLine::scroll_history() ********/ + +void GLUI_CommandLine::scroll_history( int direction ) +{ + recall_history(curr_hist + direction); +} + +/**************************** GLUI_CommandLine::recall_history() ********/ + +void GLUI_CommandLine::recall_history( int hist_num ) +{ + if (hist_num < oldest_hist OR + hist_num > newest_hist OR + hist_num == curr_hist) + return; + + // Commit the current text first before we blow it away! + if (curr_hist == newest_hist) { + get_history_str(newest_hist) = text; + } + + curr_hist = hist_num; + set_text(get_history_str(curr_hist)); + sel_end = sel_start = insertion_pt = (int)text.length(); + update_and_draw_text(); +} + +/**************************** GLUI_CommandLine::add_to_history() ********/ + +void GLUI_CommandLine::add_to_history( const char *cmd ) +{ + if (cmd[0]=='\0') return; // don't add if it's empty + + curr_hist = newest_hist; + get_history_str(newest_hist) = text; + + newest_hist = ++curr_hist; + if ( newest_hist >= HIST_SIZE ) + { + // bump oldest off the list + hist_list.erase(hist_list.begin()); + hist_list.push_back(""); + + oldest_hist++; + } +} + +/**************************** GLUI_CommandLine::reset_history() ********/ + +void GLUI_CommandLine::reset_history( void ) +{ + oldest_hist = newest_hist = curr_hist = 0; +} + + + +/*************************************** GLUI_CommandLine::dump() **************/ + +void GLUI_CommandLine::dump( FILE *out, const char *name ) +{ + fprintf( out, + "%s (commandline@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", + name, this, + insertion_pt, substring_start, substring_end, sel_start, sel_end, + (int)text.length()); +} + + diff --git a/Extras/glui/glui_control.cpp b/Extras/glui/glui_control.cpp index 9ea3d83ef..576a2a9dc 100644 --- a/Extras/glui/glui_control.cpp +++ b/Extras/glui/glui_control.cpp @@ -1,1203 +1,1203 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_control.cpp - top-level GLUI_Control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -int _glui_draw_border_only = 0; - -/*************************** Drawing Utility routines *********************/ - -/* Redraw this control. */ -void GLUI_Control::redraw(void) { - if (glui==NULL || hidden) return; - if (glui->should_redraw_now(this)) - translate_and_draw_front(); -} - -/** Redraw everybody in our window. */ -void GLUI_Control::redraw_window(void) { - if (glui==NULL || hidden) return; - if ( glui->get_glut_window_id() == -1 ) return; - int orig = set_to_glut_window(); - glutPostRedisplay(); - restore_window(orig); -} - - - -/* GLUI_Control::translate_and_draw_front() ********/ - -void GLUI_Control::translate_and_draw_front() -{ - GLUI_DRAWINGSENTINAL_IDIOM - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - translate_to_origin(); - draw(0,0); - glPopMatrix(); -} - - -/********** GLUI_Control::set_to_bkgd_color() ********/ - -void GLUI_Control::set_to_bkgd_color( void ) -{ - if ( NOT glui ) - return; - - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); -} - -/******** GLUI_Control::draw_box_inwards_outline() ********/ - -void GLUI_Control::draw_box_inwards_outline( int x_min, int x_max, int y_min, int y_max ) -{ - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_min, y_min ); glVertex2i( x_min, y_max ); - - glColor3f( 1., 1., 1. ); - glVertex2i( x_min, y_max ); glVertex2i( x_max, y_max ); - glVertex2i( x_max, y_max ); glVertex2i( x_max, y_min ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - - glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_max-1, y_min+1 ); - glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_min+1, y_max-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( x_min+1, y_max-1 ); glVertex2i( x_max-1, y_max-1 ); - glVertex2i( x_max-1, y_max-1 ); glVertex2i( x_max-1, y_min+1 ); - glEnd(); -} - - -/******* GLUI_Control::draw_box() **********/ - -void GLUI_Control::draw_box( int x_min, int x_max, int y_min, int y_max, float r, float g, float b) -{ - if ( r == 1.0 AND g == 1.0 AND b == 1.0 AND NOT enabled AND glui ) { - draw_bkgd_box( x_min, x_max, y_min, y_max ); - return; - } - - glColor3f( r, g, b ); - glBegin( GL_QUADS ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); - glEnd(); -} - - -/******* GLUI_Control::draw_bkgd_box() **********/ - -void GLUI_Control::draw_bkgd_box( int x_min, int x_max, int y_min, int y_max ) -{ - set_to_bkgd_color(); - - glBegin( GL_QUADS ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); - glEnd(); -} - - -/**** GLUI_Control::draw_active_area() ********/ - -void GLUI_Control::draw_active_box( int x_min, int x_max, int y_min, int y_max ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - } else { - set_to_bkgd_color(); - } - - glBegin( GL_LINE_LOOP ); - glVertex2i(x_min, y_min); glVertex2i( x_max, y_min ); - glVertex2i(x_max, y_max); glVertex2i( x_min, y_max ); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); -} - - -/**** GLUI_Control::draw_emboss_box() ********/ - -void GLUI_Control::draw_emboss_box(int x_min,int x_max,int y_min,int y_max) -{ - glLineWidth( 1.0 ); - glColor3f( 1.0, 1.0, 1.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_max-1, y_min+1 ); - glVertex2i( x_max-1, y_max-1 ); glVertex2i( x_min+1, y_max-1 ); - glEnd(); - - glColor3f( .5, .5, .5 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( x_min, y_min ); - glVertex2i( x_max-1, y_min ); - glVertex2i( x_max-1, y_max-1 ); - glVertex2i( x_min, y_max-1 ); - glEnd(); -} - - - -/******* GLUT_Control::draw_recursive() **********/ - -void GLUI_Control::draw_recursive( int x, int y ) -{ - GLUI_Control *node; - - /* printf( "%s %d\n", this->name.c_str(), this->hidden );*/ - if ( NOT can_draw() ) - return; - - /*if ( 1 ) { -- Debugging to check control width - glColor3f( 1.0, 0.0, 0.0 ); - glBegin( GL_LINES ); - glVertex2i( x_abs, y_abs );00 - glVertex2i( x_abs+w, y_abs ); - - glEnd(); - }*/ - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - - glTranslatef( (float) this->x_abs + .5, - (float) this->y_abs + .5, - 0.0 ); - - if ( NOT _glui_draw_border_only ) { - if ( NOT strcmp( name.c_str(), "Rollout" ) ) { - } - - this->draw( this->x_off, this->y_off_top ); - } - else - { - if ( this->dynamicCastGLUI_Column() ) { - /* printf( "%s w/h: %d/%d\n", (char*) name, w, h ); */ - /*w = 2; */ - } - - /* The following draws the area of each control */ - glColor3f( 1.0, 0.0, 0.0 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( w, h ); glVertex2i( 0, h ); - glEnd(); - } - glPopMatrix(); - - node = (GLUI_Control*) first_child(); - while( node ) { - node->draw_recursive( node->x_abs, node->y_abs ); - node = (GLUI_Control*) node->next(); - } -} - - -/****** GLUI_Control::set_to_glut_window() *********/ -/* Sets the current window to the glut window associated with this control */ - -int GLUI_Control::set_to_glut_window() -{ - int orig_window; - - if ( NOT glui) - return 1; - - orig_window = glutGetWindow(); - - glutSetWindow( glui->get_glut_window_id()); - - return orig_window; -} - - -/********** GLUI_Control::restore_window() *********/ - -void GLUI_Control::restore_window(int orig) -{ - if ( orig > 0 ) - glutSetWindow( orig ); -} - - - -/****************************** Text ***************************/ - -/*************** GLUI_Control::set_font() **********/ - -void GLUI_Control::set_font(void *new_font) -{ - font = new_font; - redraw(); -} - - -/********** GLUI_Control::draw_string() ************/ - -void GLUI_Control::draw_string( const char *text ) -{ - _glutBitmapString( get_font(), text ); -} - - -/**************** GLUI_Control::draw_char() ********/ - -void GLUI_Control::draw_char(char c) -{ - glutBitmapCharacter( get_font(), c ); -} - - -/*********** GLUI_Control::string_width() **********/ - -int GLUI_Control::string_width(const char *text) -{ - return _glutBitmapWidthString( get_font(), text ); -} - - -/************* GLUI_Control::char_width() **********/ - -int GLUI_Control::char_width(char c) -{ /* Hash table for faster character width lookups - JVK - Speeds up the textbox a little bit. - */ - int hash_index = c % CHAR_WIDTH_HASH_SIZE; - if (char_widths[hash_index][0] != c) { - char_widths[hash_index][0] = c; - char_widths[hash_index][1] = glutBitmapWidth( get_font(), c ); - } - return char_widths[hash_index][1]; -} - - -/*************** GLUI_Control::get_font() **********/ - -void *GLUI_Control::get_font( void ) -{ - /*** Does this control have its own font? ***/ - if ( this->font != NULL ) - return this->font; - - /*** Does the parent glui have a font? ***/ - if ( glui ) - return glui->font; - - /*** Return the default font ***/ - return GLUT_BITMAP_HELVETICA_12; -} - - -/************* GLUI_Control::draw_name() ***********/ -/* This draws the name of the control as either black (if enabled), or */ -/* embossed if disabled. */ - -void GLUI_Control::draw_name(int x, int y) -{ - if ( NOT can_draw() ) - return; - - if ( enabled ) - { - set_to_bkgd_color(); - glRasterPos2i(x+1, y+1); - draw_string(name); - glColor3b( 0, 0, 0 ); - glRasterPos2i(x, y); - draw_string(name); - } - else - { /* Control is disabled - emboss the string */ - glColor3f( 1.0f, 1.0f, 1.0f ); - glRasterPos2i(x+1, y+1); - draw_string(name); - glColor3f( .4f, .4f, .4f ); - glRasterPos2i(x, y); - draw_string(name); - } -} - - -/**************************** Layout and Packing *********************/ - -/****** GLUI_Control::align() **************/ - -void GLUI_Control::align() -{ - int col_x, col_y, col_w, col_h, col_x_off, col_y_off; - int orig_x_abs; - - orig_x_abs = x_abs; - - /* Fix alignment bug relating to columns */ - /*return; */ - - if ( NOT parent() ) - return; /* Clearly this shouldn't happen, though */ - - get_this_column_dims(&col_x, &col_y, &col_w, &col_h, - &col_x_off, &col_y_off); - - if ( this->dynamicCastGLUI_Column() ) { - /* if ( this->prev() != NULL ) { - ((GLUI_Control*)prev())->get_this_column_dims(&col_x, &col_y, &col_w, &col_h, - &col_x_off, &col_y_off); - - x_abs = col_x + col_w; - } - else { - x_abs = ((GLUI_Control*)parent())->x_abs; - } - */ - return; - } - - if ( alignment == GLUI_ALIGN_LEFT ) { - x_abs = col_x + col_x_off; - } - else if ( alignment == GLUI_ALIGN_RIGHT ) { - x_abs = col_x + col_w - col_x_off - this->w; - } - else if ( alignment == GLUI_ALIGN_CENTER ) { - x_abs = col_x + (col_w - this->w) / 2; - } - - if ( this->is_container ) { - /*** Shift all child columns ***/ - int delta = x_abs - orig_x_abs; - - GLUI_Control *node; - - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( node->dynamicCastGLUI_Column() ) { - node->x_abs += delta; - } - - node = (GLUI_Control*) node->next(); - } - } - -} - - -/************** GLUI_Control::pack() ************/ -/* Recalculate positions and offsets */ - -void GLUI_Control::pack_old(int x, int y) -{ - GLUI_Control *node; - int max_w, curr_y, curr_x, max_y; - int x_in = x, y_in =y; - int x_margin, y_margin_top, y_margin_bot; - int y_top_column; - int column_x; - GLUI_Column *curr_column = NULL; - this->update_size(); - x_margin = this->x_off; - y_margin_top = this->y_off_top; - y_margin_bot = this->y_off_bot; - this->x_abs = x_in; - this->y_abs = y_in; - max_w = -1; - max_y = -1; - curr_x = this->x_abs + x_margin; - curr_y = this->y_abs + y_margin_top; - /*** Record start of this set of columns ***/ - y_top_column = curr_y; - column_x = 0; - if ( this == glui->main_panel ) { - x=x; - } - /*** Iterate over children, packing them first ***/ - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( node->dynamicCastGLUI_Panel() && !node->collapsible) { - /* Pad some space above fixed size panels */ - curr_y += GLUI_ITEMSPACING; - } - else if ( node->dynamicCastGLUI_Column()) { - curr_column = (GLUI_Column*) node; - if ( 1 ) { - column_x += max_w + 2 * x_margin; - curr_x += max_w + 2 * x_margin; - } - else { - column_x += max_w + 0 * x_margin; - curr_x += max_w + 0 * x_margin; - } - /*node->pack( curr_x, curr_y ); */ - node->x_abs = curr_x; - node->y_abs = y_top_column; - node->w = 2; - node->h = curr_y - y_top_column; - curr_x += x_margin * 3 + 40; - curr_y = y_top_column; - max_w = 0; - node = (GLUI_Control*) node->next(); - continue; - } - node->pack( curr_x, curr_y ); - if ( node->dynamicCastGLUI_Panel() && !node->collapsible) - /* Pad some space below fixed size panels */ - curr_y += GLUI_ITEMSPACING; - curr_y += node->h; - if ( node->w > max_w ) { - max_w = node->w; - if ( curr_column != NULL ) - curr_column->w = max_w; - } - node = (GLUI_Control*) node->next(); - if ( node ) { - curr_y += GLUI_ITEMSPACING; - } - if ( curr_y > max_y ) - max_y = curr_y; - } - if ( this->is_container ) { - max_y += y_margin_bot; /*** Add bottom border inside box */ - if ( this->first_child() ) { - if ( this->dynamicCastGLUI_Rollout() ) { - /** We don't want the rollout to shrink in width when it's - closed **/ - this->w = MAX(this->w, column_x + max_w + 2 * x_margin ); - } - else { - this->w = column_x + max_w + 2 * x_margin; - } - this->h = (max_y - y_in); - } - else { /* An empty container, so just assign default w & h */ - this->w = GLUI_DEFAULT_CONTROL_WIDTH; - this->h = GLUI_DEFAULT_CONTROL_HEIGHT; - } - /** Expand panel if necessary (e.g., to include all the text in - a panel label) **/ - this->update_size(); - } -} - -/*** GLUI_Control::get_this_column_dims() **********/ -/* Gets the x,y,w,h,and x/y offsets of the column to which a control belongs */ - -void GLUI_Control::get_this_column_dims( int *col_x, int *col_y, - int *col_w, int *col_h, - int *col_x_off, int *col_y_off ) -{ - GLUI_Control *node, *parent_ptr; - int parent_h, parent_y_abs; - - parent_ptr = (GLUI_Control*) parent(); - - if ( parent_ptr==NULL ) - return; - - parent_h = parent_ptr->h; - parent_y_abs = parent_ptr->y_abs; - - if ( parent_ptr->dynamicCastGLUI_Panel() AND - parent_ptr->int_val == GLUI_PANEL_EMBOSSED AND - parent_ptr->name != "" ) { - parent_h -= GLUI_PANEL_EMBOSS_TOP; - parent_y_abs += GLUI_PANEL_EMBOSS_TOP; - } - - if ( 0 ) { - GLUI_Node *first, *last, *curr; - - /** Look for first control in this column **/ - first = this; - while (first->prev() AND !(first->prev())->dynamicCastGLUI_Column() ) - first = first->prev(); - - /** Look for last control in this column **/ - last = this; - while ( last->next() AND !(first->next())->dynamicCastGLUI_Column() ) - last = last->next(); - - curr = first; - int max_w = -1; - do { - if ( ((GLUI_Control*)curr)->w > max_w ) - max_w = ((GLUI_Control*)curr)->w; - - if ( curr == last ) - break; - - curr = curr->next(); - } while( curr != NULL ); - - *col_x = ((GLUI_Control*)first)->x_abs; - *col_y = ((GLUI_Control*)first)->y_abs; - *col_w = max_w; - if ( parent() ) { - *col_h = ((GLUI_Control*)parent())->h; - *col_x_off = ((GLUI_Control*)parent())->x_off; - } - else { - *col_h = 10; - *col_x_off = 0; - } - *col_y_off = 0; - - return; - } - - if ( 1 ) { /* IS THIS WRONG? */ - /*** Look for preceding column ***/ - node = (GLUI_Control*) this->prev(); - while( node ) { - if ( node->dynamicCastGLUI_Column() ) { - *col_x = node->x_abs; - *col_y = parent_y_abs; - *col_w = node->w; - *col_h = parent_h; - *col_x_off = node->x_off; - *col_y_off = 0; - - return; - } - - node = (GLUI_Control*) node->prev(); - } - - /*** Nope, Look for next column ***/ - node = (GLUI_Control*) this->next(); - while( node ) { - if ( node->dynamicCastGLUI_Column() ) { - *col_x = parent_ptr->x_abs; - *col_y = parent_y_abs; - *col_w = node->x_abs - parent_ptr->x_abs; - *col_h = parent_h; - *col_x_off = node->x_off; - *col_y_off = 0; - - return; - } - - node = (GLUI_Control*) node->next(); - } - - /*** This is single-column panel, so return panel dims ***/ - *col_x = parent_ptr->x_abs; - *col_y = parent_y_abs; - *col_w = parent_ptr->w; - *col_h = parent_h; - *col_x_off = parent_ptr->x_off; - *col_y_off = 0; - } -} - - -void GLUI_Control::pack( int x, int y ) -{ - GLUI_Control *node; - int max_w, curr_y, curr_x, max_y; - int x_in = x, y_in =y; - int x_margin, y_margin_top, y_margin_bot; - int y_top_column; - int column_x; - GLUI_Column *curr_column = NULL; - - this->update_size(); - - x_margin = this->x_off; - y_margin_top = this->y_off_top; - y_margin_bot = this->y_off_bot; - - this->x_abs = x_in; - this->y_abs = y_in; - - max_w = 0; - max_y = 0; - curr_x = this->x_abs + x_margin; - curr_y = this->y_abs + y_margin_top; - - /*** Record start of this set of columns ***/ - - y_top_column = curr_y; - column_x = curr_x; - - /*** Iterate over children, packing them first ***/ - - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( node->dynamicCastGLUI_Panel() && !node->collapsible) { - /* Pad some space above fixed-size panels */ - curr_y += GLUI_ITEMSPACING; - } - else if ( node->dynamicCastGLUI_Column() ) { - curr_column = (GLUI_Column*) node; - curr_x += max_w + 1 * x_margin; - column_x = curr_x; - - node->x_abs = curr_x; - node->y_abs = y_top_column; - node->w = 2; - node->h = curr_y - y_top_column; - - curr_x += x_margin * 1; - curr_y = y_top_column; - max_w = 0; - - node = (GLUI_Control*) node->next(); - continue; - } - - node->pack( curr_x, curr_y ); - - if ( node->dynamicCastGLUI_Panel() && !node->collapsible) - /* Pad some space below fixed-size panels */ - curr_y += GLUI_ITEMSPACING; - - curr_y += node->h; - - if ( node->w > max_w ) { - max_w = node->w; - if ( curr_column != NULL ) - curr_column->w = max_w + x_margin; - } - - if ( curr_y > max_y ) { - max_y = curr_y; - if ( curr_column != NULL ) - curr_column->h = max_y - y_top_column; - } - - node = (GLUI_Control*) node->next(); - - if ( node ) { - curr_y += GLUI_ITEMSPACING; - } - - } - - if ( this->is_container ) { - max_y += y_margin_bot; /*** Add bottom border inside box */ - - if ( this->first_child() ) { - this->w = column_x + max_w + 2 * x_margin - x_in; - this->h = (max_y - y_in); - } - else { /* An empty container, so just assign default w & h */ - if ( !this->dynamicCastGLUI_Rollout() && - !this->dynamicCastGLUI_Tree() ) { - this->w = GLUI_DEFAULT_CONTROL_WIDTH; - this->h = GLUI_DEFAULT_CONTROL_HEIGHT; - } - } - - /** Expand panel if necessary (e.g., to include all the text in - a panel label) **/ - this->update_size(); - - - /*** Now we step through the GLUI_Columns, setting the 'h' ***/ - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( node->dynamicCastGLUI_Column() ) { - node->h = this->h - y_margin_bot - y_margin_top; - } - - node = (GLUI_Control*) node->next(); - } - } -} - - - -/******************************** Live Variables **************************/ -/*********** GLUI_Control::sync_live() ************/ -/* Reads live variable and sets control to its current value */ -/* This function is recursive, and operates on control's children */ - -void GLUI_Control::sync_live(int recurse, int draw_it) -{ - GLUI_Node *node; - int sync_it=true; - int i; - float *fp; - bool changed = false; - - /*** If this is currently active control, and mouse button is down, - don't sync ***/ - if ( glui ) - { - if ( this == glui->active_control AND glui->mouse_button_down ) - sync_it = false; - - /*** Actually, just disable syncing if button is down ***/ - /*** Nope, go ahead and sync if mouse is down - this allows syncing in - callbacks ***/ - if ( 0 ) { /* THIS CODE BELOW SHOULD NOT BE EXECUTED */ - if ( glui->mouse_button_down ) { - /* printf( "Can't sync\n" ); */ - return; - } - } - } - - /*** If this control has a live variable, we check its current value - against the stored value in the control ***/ - - if ( ptr_val != NULL ) { - if ( live_type == GLUI_LIVE_NONE OR NOT sync_it ) { - } - else if ( live_type == GLUI_LIVE_INT ) { - if ( *((int*)ptr_val) != last_live_int ) { - set_int_val( *((int*)ptr_val) ); - last_live_int = *((int*)ptr_val); - changed = true; - } - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - if ( *((float*)ptr_val) != last_live_float ) { - set_float_val( *((float*)ptr_val) ); - last_live_float = *((float*)ptr_val); - changed = true; - } - } - else if ( live_type == GLUI_LIVE_TEXT ) { - if ( last_live_text.compare((const char*)ptr_val) != 0 ) { - set_text( (char*) ptr_val ); - last_live_text = (const char*)ptr_val; - changed = true; - } - } - else if ( live_type == GLUI_LIVE_STRING ) { - if ( last_live_text.compare(((std::string*) ptr_val)->c_str()) != 0 ) { - set_text( ((std::string*) ptr_val)->c_str()); - last_live_text = *((std::string*) ptr_val); - changed = true; - } - } - else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { - /*** Step through the arrays, and see if they're the same ***/ - - fp = (float*) ptr_val; - for ( i=0; ifirst_child(); - while( node ) { - ((GLUI_Control*) node)->sync_live(true, true); - node = node->next(); - } - - if ( collapsible == true AND is_open == false ) { - /** Here we have a collapsed control (e.g., a rollout that is closed **/ - /** We need to go in and sync all the collapsed controls inside **/ - - node = this->collapsed_node.first_child(); - while( node ) { - ((GLUI_Control*) node)->sync_live(true, false); - node = node->next(); - } - } - } -} - - -/********** GLUI_Control::output_live() ************/ -/* Writes current value of control to live variable. */ - -void GLUI_Control::output_live(int update_main_gfx) -{ - int i; - float *fp; - - if ( ptr_val == NULL ) - return; - - if ( NOT live_inited ) - return; - - if ( live_type == GLUI_LIVE_NONE ) { - } - else if ( live_type == GLUI_LIVE_INT ) { - *((int*)ptr_val) = int_val; - last_live_int = int_val; - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - *((float*)ptr_val) = float_val; - last_live_float = float_val; - } - else if ( live_type == GLUI_LIVE_TEXT ) { - strncpy( (char*) ptr_val, text.c_str(), text.length()+1); - last_live_text = text; - } - else if ( live_type == GLUI_LIVE_STRING ) { - (*(std::string*)ptr_val)= text.c_str(); - last_live_text = text; - } - else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { - fp = (float*) ptr_val; - - for( i=0; iglui != NULL ) { - this->glui->post_update_main_gfx(); - } -} - - -/****** GLUI_Control::execute_callback() **********/ - -void GLUI_Control::execute_callback() -{ - int old_window; - - old_window = glutGetWindow(); - - if ( glui AND glui->main_gfx_window_id != -1 ) - glutSetWindow( glui->main_gfx_window_id ); - - this->callback( this ); -// if ( this->callback ) -// this->callback( this->user_id ); - - glutSetWindow( old_window ); -} - - -/************** GLUI_Control::init_live() **********/ -/* Reads in value of a live variable. Called once, when ctrl is created */ - -void GLUI_Control::init_live() -{ - int i; - float *fp; - - if ( ptr_val == NULL ) - return; - - if ( live_type == GLUI_LIVE_NONE ) { - } - else if ( live_type == GLUI_LIVE_INT ) { - set_int_val( *((int*)ptr_val) ); - last_live_int = *((int*)ptr_val); - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - set_float_val( *((float*)ptr_val) ); - last_live_float = *((float*)ptr_val); - } - else if ( live_type == GLUI_LIVE_TEXT ) { - set_text( (const char*) ptr_val ); - last_live_text = (const char*) ptr_val; - } - else if ( live_type == GLUI_LIVE_STRING ) { - set_text( ((std::string*) ptr_val)->c_str() ); - last_live_text = ((std::string*) ptr_val)->c_str(); - } - else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { - set_float_array_val( (float*) ptr_val ); - - fp = (float*) ptr_val; - - for( i=0; ienable(); - node = (GLUI_Control*) node->next(); - } -} - - -/***** GLUI_Control::disable() ****************/ - -void GLUI_Control::disable() -{ - GLUI_Control *node; - - enabled = false; - - if ( NOT glui ) - return; - - if ( glui->active_control == this ) - glui->deactivate_current_control(); - redraw(); - - /*** Now recursively disable all buttons below it ***/ - node = (GLUI_Control*) first_child(); - while(node) { - node->disable(); - node = (GLUI_Control*) node->next(); - } -} - -/******* GLUI_Control::set_w() **************/ - -void GLUI_Control::set_w(int new_w) -{ - w = new_w; - update_size(); /* Make sure control is big enough to fit text */ - if (glui) glui->refresh(); -} - - -/**** GLUI_Control::set_h() **************/ - -void GLUI_Control::set_h(int new_h) -{ - h = new_h; - update_size(); /* Make sure control is big enough to fit text */ - if (glui) glui->refresh(); -} - - -/***** GLUI_Control::set_alignment() ******/ - -void GLUI_Control::set_alignment(int new_align) -{ - alignment = new_align; - - if ( glui ) - { - glui->align_controls(this); - redraw_window(); - } -} - - -/***** GLUI_Control::needs_idle() *********/ -/* This method gets overloaded by specific classes, e.g. Spinner. */ -/* It returns whether or not a control needs to receive an idle event or not */ -/* For example, a spinner only needs idle events when the user is holding */ -/* the mouse down in one of the arrows. Otherwise, don't waste cycles */ -/* and OpenGL context switching by calling its idle. */ - -bool GLUI_Control::needs_idle() const -{ - return false; -} - - -/********* GLUI_Control::~GLUI_Control() **********/ - -GLUI_Control::~GLUI_Control() -{ - GLUI_Control *item = (GLUI_Control*) this->first_child(); - - while (item) - { - GLUI_Control *tmp = item; - item = (GLUI_Control*) item->next(); - delete tmp; - } -} - -/********* GLUI_Control::hide_internal() ********/ -/** Sets hidden==true for this control and all its siblings. */ -/** If recurse is true, we go to children as well */ - -void GLUI_Control::hide_internal( int recurse ) -{ - GLUI_Node *node; - - node = (GLUI_Node *) this; - while( node != NULL ) { - ((GLUI_Control*)node)->hidden = true; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->hide_internal(true); - - node = node->next(); - } - - node = this->collapsed_node.first_child(); - while( node != NULL ) { - ((GLUI_Control*)node)->hidden = true; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->hide_internal(true); - - node = node->next(); - } -} - - -/********* GLUI_Control::unhide_internal() ********/ -/** Sets hidden==false for this control and all its siblings. */ -/** If recurse is true, we go to children as well */ - -void GLUI_Control::unhide_internal( int recurse ) -{ - GLUI_Node *node; - - node = (GLUI_Node *) this; - while( node != NULL ) { - /* printf( "unhide: %s [%d]\n", ((GLUI_Control*)node)->name.c_str(), - ((GLUI_Control*)node)->hidden );*/ - ((GLUI_Control*)node)->hidden = false; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->unhide_internal(true); - - node = node->next(); - } - - node = this->collapsed_node.first_child(); - while( node != NULL ) { - ((GLUI_Control*)node)->hidden = false; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->unhide_internal(true); - - node = node->next(); - } -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_control.cpp - top-level GLUI_Control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +int _glui_draw_border_only = 0; + +/*************************** Drawing Utility routines *********************/ + +/* Redraw this control. */ +void GLUI_Control::redraw(void) { + if (glui==NULL || hidden) return; + if (glui->should_redraw_now(this)) + translate_and_draw_front(); +} + +/** Redraw everybody in our window. */ +void GLUI_Control::redraw_window(void) { + if (glui==NULL || hidden) return; + if ( glui->get_glut_window_id() == -1 ) return; + int orig = set_to_glut_window(); + glutPostRedisplay(); + restore_window(orig); +} + + + +/* GLUI_Control::translate_and_draw_front() ********/ + +void GLUI_Control::translate_and_draw_front() +{ + GLUI_DRAWINGSENTINAL_IDIOM + + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + translate_to_origin(); + draw(0,0); + glPopMatrix(); +} + + +/********** GLUI_Control::set_to_bkgd_color() ********/ + +void GLUI_Control::set_to_bkgd_color( void ) +{ + if ( NOT glui ) + return; + + glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); +} + +/******** GLUI_Control::draw_box_inwards_outline() ********/ + +void GLUI_Control::draw_box_inwards_outline( int x_min, int x_max, int y_min, int y_max ) +{ + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); + glVertex2i( x_min, y_min ); glVertex2i( x_min, y_max ); + + glColor3f( 1., 1., 1. ); + glVertex2i( x_min, y_max ); glVertex2i( x_max, y_max ); + glVertex2i( x_max, y_max ); glVertex2i( x_max, y_min ); + + if ( enabled ) + glColor3f( 0., 0., 0. ); + else + glColor3f( .25, .25, .25 ); + + glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_max-1, y_min+1 ); + glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_min+1, y_max-1 ); + + glColor3f( .75, .75, .75 ); + glVertex2i( x_min+1, y_max-1 ); glVertex2i( x_max-1, y_max-1 ); + glVertex2i( x_max-1, y_max-1 ); glVertex2i( x_max-1, y_min+1 ); + glEnd(); +} + + +/******* GLUI_Control::draw_box() **********/ + +void GLUI_Control::draw_box( int x_min, int x_max, int y_min, int y_max, float r, float g, float b) +{ + if ( r == 1.0 AND g == 1.0 AND b == 1.0 AND NOT enabled AND glui ) { + draw_bkgd_box( x_min, x_max, y_min, y_max ); + return; + } + + glColor3f( r, g, b ); + glBegin( GL_QUADS ); + glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); + glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); + glEnd(); +} + + +/******* GLUI_Control::draw_bkgd_box() **********/ + +void GLUI_Control::draw_bkgd_box( int x_min, int x_max, int y_min, int y_max ) +{ + set_to_bkgd_color(); + + glBegin( GL_QUADS ); + glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); + glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); + glEnd(); +} + + +/**** GLUI_Control::draw_active_area() ********/ + +void GLUI_Control::draw_active_box( int x_min, int x_max, int y_min, int y_max ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + if ( active ) { + glEnable( GL_LINE_STIPPLE ); + glLineStipple( 1, 0x5555 ); + glColor3f( 0., 0., 0. ); + } else { + set_to_bkgd_color(); + } + + glBegin( GL_LINE_LOOP ); + glVertex2i(x_min, y_min); glVertex2i( x_max, y_min ); + glVertex2i(x_max, y_max); glVertex2i( x_min, y_max ); + glEnd(); + + glDisable( GL_LINE_STIPPLE ); +} + + +/**** GLUI_Control::draw_emboss_box() ********/ + +void GLUI_Control::draw_emboss_box(int x_min,int x_max,int y_min,int y_max) +{ + glLineWidth( 1.0 ); + glColor3f( 1.0, 1.0, 1.0 ); + + glBegin( GL_LINE_LOOP ); + glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); + glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); + glEnd(); + + glBegin( GL_LINE_LOOP ); + glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_max-1, y_min+1 ); + glVertex2i( x_max-1, y_max-1 ); glVertex2i( x_min+1, y_max-1 ); + glEnd(); + + glColor3f( .5, .5, .5 ); + glBegin( GL_LINE_LOOP ); + glVertex2i( x_min, y_min ); + glVertex2i( x_max-1, y_min ); + glVertex2i( x_max-1, y_max-1 ); + glVertex2i( x_min, y_max-1 ); + glEnd(); +} + + + +/******* GLUT_Control::draw_recursive() **********/ + +void GLUI_Control::draw_recursive( int x, int y ) +{ + GLUI_Control *node; + + /* printf( "%s %d\n", this->name.c_str(), this->hidden );*/ + if ( NOT can_draw() ) + return; + + /*if ( 1 ) { -- Debugging to check control width + glColor3f( 1.0, 0.0, 0.0 ); + glBegin( GL_LINES ); + glVertex2i( x_abs, y_abs );00 + glVertex2i( x_abs+w, y_abs ); + + glEnd(); + }*/ + + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + + glTranslatef( (float) this->x_abs + .5, + (float) this->y_abs + .5, + 0.0 ); + + if ( NOT _glui_draw_border_only ) { + if ( NOT strcmp( name.c_str(), "Rollout" ) ) { + } + + this->draw( this->x_off, this->y_off_top ); + } + else + { + if ( this->dynamicCastGLUI_Column() ) { + /* printf( "%s w/h: %d/%d\n", (char*) name, w, h ); */ + /*w = 2; */ + } + + /* The following draws the area of each control */ + glColor3f( 1.0, 0.0, 0.0 ); + glBegin( GL_LINE_LOOP ); + glVertex2i( 0, 0 ); glVertex2i( w, 0 ); + glVertex2i( w, h ); glVertex2i( 0, h ); + glEnd(); + } + glPopMatrix(); + + node = (GLUI_Control*) first_child(); + while( node ) { + node->draw_recursive( node->x_abs, node->y_abs ); + node = (GLUI_Control*) node->next(); + } +} + + +/****** GLUI_Control::set_to_glut_window() *********/ +/* Sets the current window to the glut window associated with this control */ + +int GLUI_Control::set_to_glut_window() +{ + int orig_window; + + if ( NOT glui) + return 1; + + orig_window = glutGetWindow(); + + glutSetWindow( glui->get_glut_window_id()); + + return orig_window; +} + + +/********** GLUI_Control::restore_window() *********/ + +void GLUI_Control::restore_window(int orig) +{ + if ( orig > 0 ) + glutSetWindow( orig ); +} + + + +/****************************** Text ***************************/ + +/*************** GLUI_Control::set_font() **********/ + +void GLUI_Control::set_font(void *new_font) +{ + font = new_font; + redraw(); +} + + +/********** GLUI_Control::draw_string() ************/ + +void GLUI_Control::draw_string( const char *text ) +{ + _glutBitmapString( get_font(), text ); +} + + +/**************** GLUI_Control::draw_char() ********/ + +void GLUI_Control::draw_char(char c) +{ + glutBitmapCharacter( get_font(), c ); +} + + +/*********** GLUI_Control::string_width() **********/ + +int GLUI_Control::string_width(const char *text) +{ + return _glutBitmapWidthString( get_font(), text ); +} + + +/************* GLUI_Control::char_width() **********/ + +int GLUI_Control::char_width(char c) +{ /* Hash table for faster character width lookups - JVK + Speeds up the textbox a little bit. + */ + int hash_index = c % CHAR_WIDTH_HASH_SIZE; + if (char_widths[hash_index][0] != c) { + char_widths[hash_index][0] = c; + char_widths[hash_index][1] = glutBitmapWidth( get_font(), c ); + } + return char_widths[hash_index][1]; +} + + +/*************** GLUI_Control::get_font() **********/ + +void *GLUI_Control::get_font( void ) +{ + /*** Does this control have its own font? ***/ + if ( this->font != NULL ) + return this->font; + + /*** Does the parent glui have a font? ***/ + if ( glui ) + return glui->font; + + /*** Return the default font ***/ + return GLUT_BITMAP_HELVETICA_12; +} + + +/************* GLUI_Control::draw_name() ***********/ +/* This draws the name of the control as either black (if enabled), or */ +/* embossed if disabled. */ + +void GLUI_Control::draw_name(int x, int y) +{ + if ( NOT can_draw() ) + return; + + if ( enabled ) + { + set_to_bkgd_color(); + glRasterPos2i(x+1, y+1); + draw_string(name); + glColor3b( 0, 0, 0 ); + glRasterPos2i(x, y); + draw_string(name); + } + else + { /* Control is disabled - emboss the string */ + glColor3f( 1.0f, 1.0f, 1.0f ); + glRasterPos2i(x+1, y+1); + draw_string(name); + glColor3f( .4f, .4f, .4f ); + glRasterPos2i(x, y); + draw_string(name); + } +} + + +/**************************** Layout and Packing *********************/ + +/****** GLUI_Control::align() **************/ + +void GLUI_Control::align() +{ + int col_x, col_y, col_w, col_h, col_x_off, col_y_off; + int orig_x_abs; + + orig_x_abs = x_abs; + + /* Fix alignment bug relating to columns */ + /*return; */ + + if ( NOT parent() ) + return; /* Clearly this shouldn't happen, though */ + + get_this_column_dims(&col_x, &col_y, &col_w, &col_h, + &col_x_off, &col_y_off); + + if ( this->dynamicCastGLUI_Column() ) { + /* if ( this->prev() != NULL ) { + ((GLUI_Control*)prev())->get_this_column_dims(&col_x, &col_y, &col_w, &col_h, + &col_x_off, &col_y_off); + + x_abs = col_x + col_w; + } + else { + x_abs = ((GLUI_Control*)parent())->x_abs; + } + */ + return; + } + + if ( alignment == GLUI_ALIGN_LEFT ) { + x_abs = col_x + col_x_off; + } + else if ( alignment == GLUI_ALIGN_RIGHT ) { + x_abs = col_x + col_w - col_x_off - this->w; + } + else if ( alignment == GLUI_ALIGN_CENTER ) { + x_abs = col_x + (col_w - this->w) / 2; + } + + if ( this->is_container ) { + /*** Shift all child columns ***/ + int delta = x_abs - orig_x_abs; + + GLUI_Control *node; + + node = (GLUI_Control*) this->first_child(); + while( node != NULL ) { + if ( node->dynamicCastGLUI_Column() ) { + node->x_abs += delta; + } + + node = (GLUI_Control*) node->next(); + } + } + +} + + +/************** GLUI_Control::pack() ************/ +/* Recalculate positions and offsets */ + +void GLUI_Control::pack_old(int x, int y) +{ + GLUI_Control *node; + int max_w, curr_y, curr_x, max_y; + int x_in = x, y_in =y; + int x_margin, y_margin_top, y_margin_bot; + int y_top_column; + int column_x; + GLUI_Column *curr_column = NULL; + this->update_size(); + x_margin = this->x_off; + y_margin_top = this->y_off_top; + y_margin_bot = this->y_off_bot; + this->x_abs = x_in; + this->y_abs = y_in; + max_w = -1; + max_y = -1; + curr_x = this->x_abs + x_margin; + curr_y = this->y_abs + y_margin_top; + /*** Record start of this set of columns ***/ + y_top_column = curr_y; + column_x = 0; + if ( this == glui->main_panel ) { + x=x; + } + /*** Iterate over children, packing them first ***/ + node = (GLUI_Control*) this->first_child(); + while( node != NULL ) { + if ( node->dynamicCastGLUI_Panel() && !node->collapsible) { + /* Pad some space above fixed size panels */ + curr_y += GLUI_ITEMSPACING; + } + else if ( node->dynamicCastGLUI_Column()) { + curr_column = (GLUI_Column*) node; + if ( 1 ) { + column_x += max_w + 2 * x_margin; + curr_x += max_w + 2 * x_margin; + } + else { + column_x += max_w + 0 * x_margin; + curr_x += max_w + 0 * x_margin; + } + /*node->pack( curr_x, curr_y ); */ + node->x_abs = curr_x; + node->y_abs = y_top_column; + node->w = 2; + node->h = curr_y - y_top_column; + curr_x += x_margin * 3 + 40; + curr_y = y_top_column; + max_w = 0; + node = (GLUI_Control*) node->next(); + continue; + } + node->pack( curr_x, curr_y ); + if ( node->dynamicCastGLUI_Panel() && !node->collapsible) + /* Pad some space below fixed size panels */ + curr_y += GLUI_ITEMSPACING; + curr_y += node->h; + if ( node->w > max_w ) { + max_w = node->w; + if ( curr_column != NULL ) + curr_column->w = max_w; + } + node = (GLUI_Control*) node->next(); + if ( node ) { + curr_y += GLUI_ITEMSPACING; + } + if ( curr_y > max_y ) + max_y = curr_y; + } + if ( this->is_container ) { + max_y += y_margin_bot; /*** Add bottom border inside box */ + if ( this->first_child() ) { + if ( this->dynamicCastGLUI_Rollout() ) { + /** We don't want the rollout to shrink in width when it's + closed **/ + this->w = MAX(this->w, column_x + max_w + 2 * x_margin ); + } + else { + this->w = column_x + max_w + 2 * x_margin; + } + this->h = (max_y - y_in); + } + else { /* An empty container, so just assign default w & h */ + this->w = GLUI_DEFAULT_CONTROL_WIDTH; + this->h = GLUI_DEFAULT_CONTROL_HEIGHT; + } + /** Expand panel if necessary (e.g., to include all the text in + a panel label) **/ + this->update_size(); + } +} + +/*** GLUI_Control::get_this_column_dims() **********/ +/* Gets the x,y,w,h,and x/y offsets of the column to which a control belongs */ + +void GLUI_Control::get_this_column_dims( int *col_x, int *col_y, + int *col_w, int *col_h, + int *col_x_off, int *col_y_off ) +{ + GLUI_Control *node, *parent_ptr; + int parent_h, parent_y_abs; + + parent_ptr = (GLUI_Control*) parent(); + + if ( parent_ptr==NULL ) + return; + + parent_h = parent_ptr->h; + parent_y_abs = parent_ptr->y_abs; + + if ( parent_ptr->dynamicCastGLUI_Panel() AND + parent_ptr->int_val == GLUI_PANEL_EMBOSSED AND + parent_ptr->name != "" ) { + parent_h -= GLUI_PANEL_EMBOSS_TOP; + parent_y_abs += GLUI_PANEL_EMBOSS_TOP; + } + + if ( 0 ) { + GLUI_Node *first, *last, *curr; + + /** Look for first control in this column **/ + first = this; + while (first->prev() AND !(first->prev())->dynamicCastGLUI_Column() ) + first = first->prev(); + + /** Look for last control in this column **/ + last = this; + while ( last->next() AND !(first->next())->dynamicCastGLUI_Column() ) + last = last->next(); + + curr = first; + int max_w = -1; + do { + if ( ((GLUI_Control*)curr)->w > max_w ) + max_w = ((GLUI_Control*)curr)->w; + + if ( curr == last ) + break; + + curr = curr->next(); + } while( curr != NULL ); + + *col_x = ((GLUI_Control*)first)->x_abs; + *col_y = ((GLUI_Control*)first)->y_abs; + *col_w = max_w; + if ( parent() ) { + *col_h = ((GLUI_Control*)parent())->h; + *col_x_off = ((GLUI_Control*)parent())->x_off; + } + else { + *col_h = 10; + *col_x_off = 0; + } + *col_y_off = 0; + + return; + } + + if ( 1 ) { /* IS THIS WRONG? */ + /*** Look for preceding column ***/ + node = (GLUI_Control*) this->prev(); + while( node ) { + if ( node->dynamicCastGLUI_Column() ) { + *col_x = node->x_abs; + *col_y = parent_y_abs; + *col_w = node->w; + *col_h = parent_h; + *col_x_off = node->x_off; + *col_y_off = 0; + + return; + } + + node = (GLUI_Control*) node->prev(); + } + + /*** Nope, Look for next column ***/ + node = (GLUI_Control*) this->next(); + while( node ) { + if ( node->dynamicCastGLUI_Column() ) { + *col_x = parent_ptr->x_abs; + *col_y = parent_y_abs; + *col_w = node->x_abs - parent_ptr->x_abs; + *col_h = parent_h; + *col_x_off = node->x_off; + *col_y_off = 0; + + return; + } + + node = (GLUI_Control*) node->next(); + } + + /*** This is single-column panel, so return panel dims ***/ + *col_x = parent_ptr->x_abs; + *col_y = parent_y_abs; + *col_w = parent_ptr->w; + *col_h = parent_h; + *col_x_off = parent_ptr->x_off; + *col_y_off = 0; + } +} + + +void GLUI_Control::pack( int x, int y ) +{ + GLUI_Control *node; + int max_w, curr_y, curr_x, max_y; + int x_in = x, y_in =y; + int x_margin, y_margin_top, y_margin_bot; + int y_top_column; + int column_x; + GLUI_Column *curr_column = NULL; + + this->update_size(); + + x_margin = this->x_off; + y_margin_top = this->y_off_top; + y_margin_bot = this->y_off_bot; + + this->x_abs = x_in; + this->y_abs = y_in; + + max_w = 0; + max_y = 0; + curr_x = this->x_abs + x_margin; + curr_y = this->y_abs + y_margin_top; + + /*** Record start of this set of columns ***/ + + y_top_column = curr_y; + column_x = curr_x; + + /*** Iterate over children, packing them first ***/ + + node = (GLUI_Control*) this->first_child(); + while( node != NULL ) { + if ( node->dynamicCastGLUI_Panel() && !node->collapsible) { + /* Pad some space above fixed-size panels */ + curr_y += GLUI_ITEMSPACING; + } + else if ( node->dynamicCastGLUI_Column() ) { + curr_column = (GLUI_Column*) node; + curr_x += max_w + 1 * x_margin; + column_x = curr_x; + + node->x_abs = curr_x; + node->y_abs = y_top_column; + node->w = 2; + node->h = curr_y - y_top_column; + + curr_x += x_margin * 1; + curr_y = y_top_column; + max_w = 0; + + node = (GLUI_Control*) node->next(); + continue; + } + + node->pack( curr_x, curr_y ); + + if ( node->dynamicCastGLUI_Panel() && !node->collapsible) + /* Pad some space below fixed-size panels */ + curr_y += GLUI_ITEMSPACING; + + curr_y += node->h; + + if ( node->w > max_w ) { + max_w = node->w; + if ( curr_column != NULL ) + curr_column->w = max_w + x_margin; + } + + if ( curr_y > max_y ) { + max_y = curr_y; + if ( curr_column != NULL ) + curr_column->h = max_y - y_top_column; + } + + node = (GLUI_Control*) node->next(); + + if ( node ) { + curr_y += GLUI_ITEMSPACING; + } + + } + + if ( this->is_container ) { + max_y += y_margin_bot; /*** Add bottom border inside box */ + + if ( this->first_child() ) { + this->w = column_x + max_w + 2 * x_margin - x_in; + this->h = (max_y - y_in); + } + else { /* An empty container, so just assign default w & h */ + if ( !this->dynamicCastGLUI_Rollout() && + !this->dynamicCastGLUI_Tree() ) { + this->w = GLUI_DEFAULT_CONTROL_WIDTH; + this->h = GLUI_DEFAULT_CONTROL_HEIGHT; + } + } + + /** Expand panel if necessary (e.g., to include all the text in + a panel label) **/ + this->update_size(); + + + /*** Now we step through the GLUI_Columns, setting the 'h' ***/ + node = (GLUI_Control*) this->first_child(); + while( node != NULL ) { + if ( node->dynamicCastGLUI_Column() ) { + node->h = this->h - y_margin_bot - y_margin_top; + } + + node = (GLUI_Control*) node->next(); + } + } +} + + + +/******************************** Live Variables **************************/ +/*********** GLUI_Control::sync_live() ************/ +/* Reads live variable and sets control to its current value */ +/* This function is recursive, and operates on control's children */ + +void GLUI_Control::sync_live(int recurse, int draw_it) +{ + GLUI_Node *node; + int sync_it=true; + int i; + float *fp; + bool changed = false; + + /*** If this is currently active control, and mouse button is down, + don't sync ***/ + if ( glui ) + { + if ( this == glui->active_control AND glui->mouse_button_down ) + sync_it = false; + + /*** Actually, just disable syncing if button is down ***/ + /*** Nope, go ahead and sync if mouse is down - this allows syncing in + callbacks ***/ + if ( 0 ) { /* THIS CODE BELOW SHOULD NOT BE EXECUTED */ + if ( glui->mouse_button_down ) { + /* printf( "Can't sync\n" ); */ + return; + } + } + } + + /*** If this control has a live variable, we check its current value + against the stored value in the control ***/ + + if ( ptr_val != NULL ) { + if ( live_type == GLUI_LIVE_NONE OR NOT sync_it ) { + } + else if ( live_type == GLUI_LIVE_INT ) { + if ( *((int*)ptr_val) != last_live_int ) { + set_int_val( *((int*)ptr_val) ); + last_live_int = *((int*)ptr_val); + changed = true; + } + } + else if ( live_type == GLUI_LIVE_FLOAT ) { + if ( *((float*)ptr_val) != last_live_float ) { + set_float_val( *((float*)ptr_val) ); + last_live_float = *((float*)ptr_val); + changed = true; + } + } + else if ( live_type == GLUI_LIVE_TEXT ) { + if ( last_live_text.compare((const char*)ptr_val) != 0 ) { + set_text( (char*) ptr_val ); + last_live_text = (const char*)ptr_val; + changed = true; + } + } + else if ( live_type == GLUI_LIVE_STRING ) { + if ( last_live_text.compare(((std::string*) ptr_val)->c_str()) != 0 ) { + set_text( ((std::string*) ptr_val)->c_str()); + last_live_text = *((std::string*) ptr_val); + changed = true; + } + } + else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { + /*** Step through the arrays, and see if they're the same ***/ + + fp = (float*) ptr_val; + for ( i=0; ifirst_child(); + while( node ) { + ((GLUI_Control*) node)->sync_live(true, true); + node = node->next(); + } + + if ( collapsible == true AND is_open == false ) { + /** Here we have a collapsed control (e.g., a rollout that is closed **/ + /** We need to go in and sync all the collapsed controls inside **/ + + node = this->collapsed_node.first_child(); + while( node ) { + ((GLUI_Control*) node)->sync_live(true, false); + node = node->next(); + } + } + } +} + + +/********** GLUI_Control::output_live() ************/ +/* Writes current value of control to live variable. */ + +void GLUI_Control::output_live(int update_main_gfx) +{ + int i; + float *fp; + + if ( ptr_val == NULL ) + return; + + if ( NOT live_inited ) + return; + + if ( live_type == GLUI_LIVE_NONE ) { + } + else if ( live_type == GLUI_LIVE_INT ) { + *((int*)ptr_val) = int_val; + last_live_int = int_val; + } + else if ( live_type == GLUI_LIVE_FLOAT ) { + *((float*)ptr_val) = float_val; + last_live_float = float_val; + } + else if ( live_type == GLUI_LIVE_TEXT ) { + strncpy( (char*) ptr_val, text.c_str(), text.length()+1); + last_live_text = text; + } + else if ( live_type == GLUI_LIVE_STRING ) { + (*(std::string*)ptr_val)= text.c_str(); + last_live_text = text; + } + else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { + fp = (float*) ptr_val; + + for( i=0; iglui != NULL ) { + this->glui->post_update_main_gfx(); + } +} + + +/****** GLUI_Control::execute_callback() **********/ + +void GLUI_Control::execute_callback() +{ + int old_window; + + old_window = glutGetWindow(); + + if ( glui AND glui->main_gfx_window_id != -1 ) + glutSetWindow( glui->main_gfx_window_id ); + + this->callback( this ); +// if ( this->callback ) +// this->callback( this->user_id ); + + glutSetWindow( old_window ); +} + + +/************** GLUI_Control::init_live() **********/ +/* Reads in value of a live variable. Called once, when ctrl is created */ + +void GLUI_Control::init_live() +{ + int i; + float *fp; + + if ( ptr_val == NULL ) + return; + + if ( live_type == GLUI_LIVE_NONE ) { + } + else if ( live_type == GLUI_LIVE_INT ) { + set_int_val( *((int*)ptr_val) ); + last_live_int = *((int*)ptr_val); + } + else if ( live_type == GLUI_LIVE_FLOAT ) { + set_float_val( *((float*)ptr_val) ); + last_live_float = *((float*)ptr_val); + } + else if ( live_type == GLUI_LIVE_TEXT ) { + set_text( (const char*) ptr_val ); + last_live_text = (const char*) ptr_val; + } + else if ( live_type == GLUI_LIVE_STRING ) { + set_text( ((std::string*) ptr_val)->c_str() ); + last_live_text = ((std::string*) ptr_val)->c_str(); + } + else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { + set_float_array_val( (float*) ptr_val ); + + fp = (float*) ptr_val; + + for( i=0; ienable(); + node = (GLUI_Control*) node->next(); + } +} + + +/***** GLUI_Control::disable() ****************/ + +void GLUI_Control::disable() +{ + GLUI_Control *node; + + enabled = false; + + if ( NOT glui ) + return; + + if ( glui->active_control == this ) + glui->deactivate_current_control(); + redraw(); + + /*** Now recursively disable all buttons below it ***/ + node = (GLUI_Control*) first_child(); + while(node) { + node->disable(); + node = (GLUI_Control*) node->next(); + } +} + +/******* GLUI_Control::set_w() **************/ + +void GLUI_Control::set_w(int new_w) +{ + w = new_w; + update_size(); /* Make sure control is big enough to fit text */ + if (glui) glui->refresh(); +} + + +/**** GLUI_Control::set_h() **************/ + +void GLUI_Control::set_h(int new_h) +{ + h = new_h; + update_size(); /* Make sure control is big enough to fit text */ + if (glui) glui->refresh(); +} + + +/***** GLUI_Control::set_alignment() ******/ + +void GLUI_Control::set_alignment(int new_align) +{ + alignment = new_align; + + if ( glui ) + { + glui->align_controls(this); + redraw_window(); + } +} + + +/***** GLUI_Control::needs_idle() *********/ +/* This method gets overloaded by specific classes, e.g. Spinner. */ +/* It returns whether or not a control needs to receive an idle event or not */ +/* For example, a spinner only needs idle events when the user is holding */ +/* the mouse down in one of the arrows. Otherwise, don't waste cycles */ +/* and OpenGL context switching by calling its idle. */ + +bool GLUI_Control::needs_idle() const +{ + return false; +} + + +/********* GLUI_Control::~GLUI_Control() **********/ + +GLUI_Control::~GLUI_Control() +{ + GLUI_Control *item = (GLUI_Control*) this->first_child(); + + while (item) + { + GLUI_Control *tmp = item; + item = (GLUI_Control*) item->next(); + delete tmp; + } +} + +/********* GLUI_Control::hide_internal() ********/ +/** Sets hidden==true for this control and all its siblings. */ +/** If recurse is true, we go to children as well */ + +void GLUI_Control::hide_internal( int recurse ) +{ + GLUI_Node *node; + + node = (GLUI_Node *) this; + while( node != NULL ) { + ((GLUI_Control*)node)->hidden = true; + + if ( recurse AND node->first_child() != NULL ) + ((GLUI_Control*) node->first_child())->hide_internal(true); + + node = node->next(); + } + + node = this->collapsed_node.first_child(); + while( node != NULL ) { + ((GLUI_Control*)node)->hidden = true; + + if ( recurse AND node->first_child() != NULL ) + ((GLUI_Control*) node->first_child())->hide_internal(true); + + node = node->next(); + } +} + + +/********* GLUI_Control::unhide_internal() ********/ +/** Sets hidden==false for this control and all its siblings. */ +/** If recurse is true, we go to children as well */ + +void GLUI_Control::unhide_internal( int recurse ) +{ + GLUI_Node *node; + + node = (GLUI_Node *) this; + while( node != NULL ) { + /* printf( "unhide: %s [%d]\n", ((GLUI_Control*)node)->name.c_str(), + ((GLUI_Control*)node)->hidden );*/ + ((GLUI_Control*)node)->hidden = false; + + if ( recurse AND node->first_child() != NULL ) + ((GLUI_Control*) node->first_child())->unhide_internal(true); + + node = node->next(); + } + + node = this->collapsed_node.first_child(); + while( node != NULL ) { + ((GLUI_Control*)node)->hidden = false; + + if ( recurse AND node->first_child() != NULL ) + ((GLUI_Control*) node->first_child())->unhide_internal(true); + + node = node->next(); + } +} diff --git a/Extras/glui/glui_edittext.cpp b/Extras/glui/glui_edittext.cpp index 5f2a1d845..1241033e0 100644 --- a/Extras/glui/glui_edittext.cpp +++ b/Extras/glui/glui_edittext.cpp @@ -1,1198 +1,1198 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_edittext.cpp - GLUI_EditText control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - int data_type, void *live_var, - int id, GLUI_CB callback ) -{ - if (data_type == GLUI_EDITTEXT_TEXT) { - live_type = GLUI_LIVE_TEXT; - } - else if (data_type == GLUI_EDITTEXT_STRING) { - data_type = GLUI_EDITTEXT_TEXT; // EDITTEXT_STRING doesn't really exist. - // Except as a signal to make a string. - // It's a backwards-compat hack. - live_type = GLUI_LIVE_STRING; - } - else if (data_type == GLUI_EDITTEXT_INT) { - live_type = GLUI_LIVE_INT; - } - else if (data_type == GLUI_EDITTEXT_FLOAT) { - live_type = GLUI_LIVE_FLOAT; - } - common_construct( parent, name, data_type, live_type, live_var, id, callback ); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - int text_type, int id, GLUI_CB callback ) -{ - common_construct( parent, name, text_type, GLUI_LIVE_NONE, 0, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - int *live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_INT, GLUI_LIVE_INT, live_var, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - float *live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_FLOAT, GLUI_LIVE_FLOAT, live_var, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - char *live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_TEXT, GLUI_LIVE_TEXT, live_var, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - std::string &live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_TEXT, GLUI_LIVE_STRING, &live_var, id, callback); -} - -/****************************** GLUI_EditText::common_construct() **********/ - -void GLUI_EditText::common_construct( GLUI_Node *parent, const char *name, - int data_t, int live_t, void *data, int id, - GLUI_CB cb ) -{ - common_init(); - set_name( name ); - - live_type = live_t; - data_type = data_t; - ptr_val = data; - user_id = id; - callback = cb; - - - if ( live_type == GLUI_LIVE_INT) { - if ( data == NULL ) - set_int_val(int_val); /** Set to some default, in case of no live var **/ - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - num_periods = 1; - if ( data == NULL ) - set_float_val(float_val); /** Set to some default, in case of no live var **/ - } - - parent->add_control( this ); - - init_live(); -} - -/****************************** GLUI_EditText::mouse_down_handler() **********/ - -int GLUI_EditText::mouse_down_handler( int local_x, int local_y ) -{ - int tmp_insertion_pt; - - if ( debug ) dump( stdout, "-> MOUSE DOWN" ); - - tmp_insertion_pt = find_insertion_pt( local_x, local_y ); - if ( tmp_insertion_pt == -1 ) { - if ( glui ) - glui->deactivate_current_control( ); - return false; - } - - insertion_pt = tmp_insertion_pt; - - sel_start = sel_end = insertion_pt; - - if ( can_draw()) - update_and_draw_text(); - - if ( debug ) dump( stdout, "<- MOUSE UP" ); - - return true; -} - - -/******************************** GLUI_EditText::mouse_up_handler() **********/ - -int GLUI_EditText::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - return false; -} - - -/***************************** GLUI_EditText::mouse_held_down_handler() ******/ - -int GLUI_EditText::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int tmp_pt; - - if ( NOT new_inside ) - return false; - - if ( debug ) dump( stdout, "-> HELD DOWN" ); - - tmp_pt = find_insertion_pt( local_x, local_y ); - - if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ - special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { - /* moved mouse past right edge */ - special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { - sel_end = insertion_pt = tmp_pt; - - update_and_draw_text(); - } - - if ( debug ) - dump( stdout, "<- HELD DOWN" ); - - return false; -} - - -/****************************** GLUI_EditText::key_handler() **********/ - -int GLUI_EditText::key_handler( unsigned char key,int modifiers ) -{ - int i, regular_key; - /* int has_selection; */ - - if ( NOT glui ) - return false; - - if ( debug ) - dump( stdout, "-> KEY HANDLER" ); - - regular_key = false; - bool ctrl_down = (modifiers & GLUT_ACTIVE_CTRL)!=0; - /* has_selection = (sel_start != sel_end); */ - - if ( key == CTRL('m') ) { /* RETURN */ - /* glui->deactivate_current_control(); */ - deactivate(); /** Force callbacks, etc **/ - activate(GLUI_ACTIVATE_TAB); /** Reselect all text **/ - redraw(); - return true; - } - else if ( key == CTRL('[')) { /* ESCAPE */ - glui->deactivate_current_control(); - return true; - } - else if ( (key == 127 AND !ctrl_down) OR /* FORWARD DELETE */ - ( key == CTRL('d') AND modifiers == GLUT_ACTIVE_CTRL) ) - { - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt < (int)text.length() ) { - /*** See if we're deleting a period in a float data-type box ***/ - if ( data_type == GLUI_EDITTEXT_FLOAT AND text[insertion_pt]=='.' ) - num_periods--; - - /*** Shift over string first ***/ - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( ((key == 127) AND ctrl_down) OR // Delete word forward - ((key == 'd') AND (modifiers == GLUT_ACTIVE_ALT)) ) - { - if ( sel_start == sel_end ) { /* no selection */ - sel_start = insertion_pt; - sel_end = find_word_break( insertion_pt, +1 ); - } - - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - else if ( key == CTRL('h') ) { /* BACKSPACE */ - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt > 0 ) { - /*** See if we're deleting a period in a float data-type box ***/ - if ( data_type == GLUI_EDITTEXT_FLOAT AND text[insertion_pt-1]=='.' ) - num_periods--; - - /*** Shift over string first ***/ - insertion_pt--; - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( modifiers == GLUT_ACTIVE_CTRL ) /* CTRL ONLY */ - { - /* Ctrl-key bindings */ - if ( key == CTRL('a') ) { - return special_handler( GLUT_KEY_HOME, 0 ); - } - else if ( key == CTRL('e') ) { - return special_handler( GLUT_KEY_END, 0 ); - } - else if ( key == CTRL('b') ) { - return special_handler( GLUT_KEY_LEFT, 0 ); - } - else if ( key == CTRL('f') ) { - return special_handler( GLUT_KEY_RIGHT, 0 ); - } - else if ( key == CTRL('p') ) { - return special_handler( GLUT_KEY_UP, 0 ); - } - else if ( key == CTRL('n') ) { - return special_handler( GLUT_KEY_DOWN, 0 ); - } - else if ( key == CTRL('u') ) { /* ERASE LINE */ - insertion_pt = 0; - text.erase(0,text.length()); - sel_start = sel_end = 0; - } - else if ( key == CTRL('k') ) { /* KILL TO END OF LINE */ - sel_start = sel_end = insertion_pt; - text.erase(insertion_pt,GLUI_String::npos); - } - } - else if ( modifiers == GLUT_ACTIVE_ALT ) /* ALT ONLY */ - { - if ( key == 'b' ) { // Backward word - return special_handler ( GLUT_KEY_LEFT, GLUT_ACTIVE_CTRL ); - } - if ( key == 'f' ) { // Forward word - return special_handler ( GLUT_KEY_RIGHT, GLUT_ACTIVE_CTRL ); - } - } - else if ( (modifiers & GLUT_ACTIVE_CTRL) OR - (modifiers & GLUT_ACTIVE_ALT) ) - { - /** ignore other keys with modifiers */ - return true; - } - else { /* Regular key */ - regular_key = true; - - /** Check if we only accept numbers **/ - if (data_type == GLUI_EDITTEXT_FLOAT ) { - if ( (key < '0' OR key > '9') AND key != '.' AND key != '-' ) - return true; - - if ( key == '-' ) { /* User typed a '-' */ - - /* If user has first character selected, then '-' is allowed */ - if ( NOT ( MIN(sel_start,sel_end) == 0 AND - MAX(sel_start,sel_end) > 0 ) ) { - - /* User does not have 1st char selected */ - if (insertion_pt != 0 OR text[0] == '-' ) { - return true; /* Can only place negative at beginning of text, - and only one of them */ - } - } - } - - if ( key == '.' ) { - /*printf( "PERIOD: %d\n", num_periods ); */ - - if ( num_periods > 0 ) { - /** We're trying to type a period, but the text already contains - a period. Check whether the period is contained within - is current selection (thus it will be safely replaced) **/ - - int period_found = false; - if ( sel_start != sel_end ) { - for( i=MIN(sel_end,sel_start); i '9') AND key != '-' ) - return true; - - if ( key == '-' ) { /* User typed a '-' */ - - /* If user has first character selected, then '-' is allowed */ - if ( NOT ( MIN(sel_start,sel_end) == 0 AND - MAX(sel_start,sel_end) > 0 ) ) { - - /* User does not have 1st char selected */ - if (insertion_pt != 0 OR text[0] == '-' ) { - return true; /* Can only place negative at beginning of text, - and only one of them */ - } - } - } - } - - /** This is just to get rid of warnings - the flag regular_key is - set if the key was not a backspace, return, whatever. But I - believe if we're here, we know it was a regular key anyway */ - if ( regular_key ) { - } - - /**** If there's a current selection, erase it ******/ - if ( sel_start != sel_end ) { - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - - /******** We insert the character into the string ***/ - - text.insert(insertion_pt,1,key); - - /******** Move the insertion point and substring_end one over ******/ - insertion_pt++; - substring_end++; - - sel_start = sel_end = insertion_pt; - } - - /******** Now redraw text ***********/ - /* Hack to prevent text box from being cleared first **/ - /** int substring_change = update_substring_bounds(); - draw_text_only = - (NOT substring_change AND NOT has_selection AND regular_key ); - */ - - draw_text_only = false; /** Well, hack is not yet working **/ - update_and_draw_text(); - draw_text_only = false; - - - if ( debug ) - dump( stdout, "<- KEY HANDLER" ); - - /*** Now look to see if this string has a period ***/ - num_periods = 0; - for( i=0; i<(int)text.length(); i++ ) - if ( text[i] == '.' ) - num_periods++; - - return true; -} - - -/****************************** GLUI_EditText::activate() **********/ - -void GLUI_EditText::activate( int how ) -{ - if ( debug ) - dump( stdout, "-> ACTIVATE" ); - - active = true; - - if ( how == GLUI_ACTIVATE_MOUSE ) - return; /* Don't select everything if activated with mouse */ - - orig_text = text; - - sel_start = 0; - sel_end = (int)text.length(); - insertion_pt = 0; - - if ( debug ) - dump( stdout, "<- ACTIVATE" ); -} - - -/****************************** GLUI_EditText::deactivate() **********/ - -void GLUI_EditText::deactivate( void ) -{ - int new_int_val; - float new_float_val; - - active = false; - - if ( NOT glui ) - return; - - if ( debug ) - dump( stdout, "-> DISACTIVATE" ); - - sel_start = sel_end = insertion_pt = -1; - - /***** Retrieve the current value from the text *****/ - /***** The live variable will be updated by set_text() ****/ - if ( data_type == GLUI_EDITTEXT_FLOAT ) { - if ( text.length() == 0 ) /* zero-length string - make it "0.0" */ - text = "0.0"; - - new_float_val = atof( text.c_str() ); - - set_float_val( new_float_val ); - } - else if ( data_type == GLUI_EDITTEXT_INT ) { - if ( text.length() == 0 ) /* zero-length string - make it "0" */ - text = "0"; - - new_int_val = atoi( text.c_str() ); - - set_int_val( new_int_val ); - } - else - if ( data_type == GLUI_EDITTEXT_TEXT ) { - set_text(text); /* This will force callbacks and gfx refresh */ - } - - update_substring_bounds(); - - /******** redraw text without insertion point ***********/ - redraw(); - - /***** Now do callbacks if value changed ******/ - if ( orig_text != text ) { - this->execute_callback(); - - if ( 0 ) { - /* THE CODE BELOW IS FROM WHEN SPINNER ALSO MAINTAINED CALLBACKS */ - if ( spinner == NULL ) { /** Are we independent of a spinner? **/ - if ( callback ) { - callback( this ); - } - } - else { /* We're attached to a spinner */ - spinner->do_callbacks(); /* Let the spinner do the callback stuff */ - } - } - } - - if ( debug ) - dump( stdout, "<- DISACTIVATE" ); -} - -/****************************** GLUI_EditText::draw() **********/ - -void GLUI_EditText::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int name_x; - - name_x = MAX(text_x_offset - string_width(this->name) - 3,0); - draw_name( name_x , 13); - - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( text_x_offset, 0 ); glVertex2i( w, 0 ); - glVertex2i( text_x_offset, 0 ); glVertex2i( text_x_offset, h ); - - glColor3f( 1., 1., 1. ); - glVertex2i( text_x_offset, h ); glVertex2i( w, h ); - glVertex2i( w, h ); glVertex2i( w, 0 ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - glVertex2i( text_x_offset+1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( text_x_offset+1, 1 ); glVertex2i( text_x_offset+1, h-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( text_x_offset+1, h-1 ); glVertex2i( w-1, h-1 ); - glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); - glEnd(); - - /** Find where to draw the text **/ - update_substring_bounds(); - draw_text(0,0); - - draw_insertion_pt(); -} - - - -/************************** GLUI_EditText::update_substring_bounds() *********/ - -int GLUI_EditText::update_substring_bounds( void ) -{ - int box_width; - int text_len = (int)text.length(); - int old_start, old_end; - - old_start = substring_start; - old_end = substring_end; - - /*** Calculate the width of the usable area of the edit box ***/ - box_width = MAX( this->w - this->text_x_offset - - 4 /* 2 * the two-line box border */ - - 2 * GLUI_EDITTEXT_BOXINNERMARGINX, 0 ); - - CLAMP( substring_end, 0, MAX(text_len-1,0) ); - CLAMP( substring_start, 0, MAX(text_len-1,0) ); - - if ( debug ) dump( stdout, "-> UPDATE SS" ); - - if ( insertion_pt >= 0 AND - insertion_pt < substring_start ) { /* cursor moved left */ - substring_start = insertion_pt; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - } - else if ( insertion_pt > substring_end ) { /* cursor moved right */ - substring_end = insertion_pt-1; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_start++; - } - else { /* cursor is within old substring bounds */ - if ( last_insertion_pt > insertion_pt ) { /* cursor moved left */ - } - else { - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - while(substring_end < text_len-1 - AND substring_width( substring_start, substring_end ) <= box_width) - substring_end++; - } - } - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - last_insertion_pt = insertion_pt; - - /*** No selection if not enabled ***/ - if ( NOT enabled ) { - sel_start = sel_end = 0; - } - - if ( debug ) dump( stdout, "<- UPDATE SS" ); - - if ( substring_start == old_start AND substring_end == old_end ) - return false; /*** bounds did not change ***/ - else - return true; /*** bounds did change ***/ -} - - -/********************************* GLUI_EditText::update_x_offsets() *********/ - -void GLUI_EditText::update_x_offsets( void ) -{ -} - - -/********************************* GLUI_EditText::draw_text() ****************/ - -void GLUI_EditText::draw_text( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_x, i, sel_lo, sel_hi; - - if ( debug ) dump( stdout, "-> DRAW_TEXT" ); - - if ( NOT draw_text_only ) { - if ( enabled ) - glColor3f( 1., 1., 1. ); - else - set_to_bkgd_color(); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( text_x_offset+2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i( text_x_offset+2, h-2 ); - glEnd(); - } - - /** Find where to draw the text **/ - - text_x = text_x_offset + 2 + GLUI_EDITTEXT_BOXINNERMARGINX; - - /*printf( "text_x: %d substr_width: %d start/end: %d/%d\n", - text_x, substring_width( substring_start, substring_end ), - substring_start, substring_end ); - */ - /** Find lower and upper selection bounds **/ - sel_lo = MIN(sel_start, sel_end ); - sel_hi = MAX(sel_start, sel_end ); - - int sel_x_start, sel_x_end, delta; - - /** Draw selection area dark **/ - if ( sel_start != sel_end ) { - sel_x_start = text_x; - sel_x_end = text_x; - for( i=substring_start; i<=substring_end; i++ ) { - delta = char_width( text[i] ); - - if ( i < sel_lo ) { - sel_x_start += delta; - sel_x_end += delta; - } - else if ( i < sel_hi ) { - sel_x_end += delta; - } - } - - glColor3f( 0.0f, 0.0f, .6f ); - glBegin( GL_QUADS ); - glVertex2i( sel_x_start, 2 ); glVertex2i( sel_x_end, 2 ); - glVertex2i( sel_x_end, h-2 ); glVertex2i( sel_x_start, h-2 ); - glEnd(); - } - - - if ( sel_start == sel_end ) { /* No current selection */ - if ( enabled ) - glColor3b( 0, 0, 0 ); - else - glColor3b( 32, 32, 32 ); - - glRasterPos2i( text_x, 13); - for( i=substring_start; i<=substring_end; i++ ) { - glutBitmapCharacter( get_font(), this->text[i] ); - } - } - else { /* There is a selection */ - int x = text_x; - for( i=substring_start; i<=substring_end; i++ ) { - if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { /* This character is selected */ - glColor3f( 1., 1., 1. ); - glRasterPos2i( x, 13); - glutBitmapCharacter( get_font(), this->text[i] ); - } - else { - glColor3f( 0., 0., 0. ); - glRasterPos2i( x, 13); - glutBitmapCharacter( get_font(), this->text[i] ); - } - - x += char_width( text[i] ); - } - } - - if ( debug ) dump( stdout, "<- DRAW_TEXT" ); -} - - -/******************************** GLUI_EditText::find_insertion_pt() *********/ -/* This function returns the character numer *before which* the insertion */ -/* point goes */ - -int GLUI_EditText::find_insertion_pt( int x, int y ) -{ - int curr_x, i; - - /*** See if we clicked outside box ***/ - if ( x < this->x_abs + text_x_offset ) - return -1; - - /* We move from right to left, looking to see if the mouse was clicked - to the right of the ith character */ - - curr_x = this->x_abs + text_x_offset - + substring_width( substring_start, substring_end ) - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_EDITTEXT_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ - - /*** See if we clicked in an empty box ***/ - if ( (int) text.length() == 0 ) - return 0; - - /** find mouse click in text **/ - for( i=substring_end; i>=substring_start; i-- ) { - curr_x -= char_width( text[i] ); - - if ( x > curr_x ) { - /* printf( "-> %d\n", i ); */ - - return i+1; - } - } - - return 0; - - /* Well, the mouse wasn't after any of the characters...see if it's - before the beginning of the substring */ - if ( 0 ) { - if ( x > (x_abs + text_x_offset + 2 ) ) - return substring_start; - - return -1; /* Nothing found */ - } -} - - -/******************************** GLUI_EditText::draw_insertion_pt() *********/ - -void GLUI_EditText::draw_insertion_pt( void ) -{ - int curr_x, i; - - if ( NOT can_draw() ) - return; - - /*** Don't draw insertion pt if control is disabled ***/ - if ( NOT enabled ) - return; - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); - - if ( sel_start != sel_end OR insertion_pt < 0 ) { - return; /* Don't draw insertion point if there is a current selection */ - } - - /* printf( "insertion pt: %d\n", insertion_pt ); */ - - curr_x = this->x_abs + text_x_offset - + substring_width( substring_start, substring_end ) - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_EDITTEXT_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ - - for( i=substring_end; i>=insertion_pt; i-- ) { - curr_x -= char_width( text[i] ); - } - - glColor3f( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_LOOP ); - /*** - glVertex2i( curr_x, y_abs + 4 ); - glVertex2i( curr_x, y_abs + 4 ); - glVertex2i( curr_x, y_abs + h - 3 ); - glVertex2i( curr_x, y_abs + h - 3 ); - ***/ - curr_x -= x_abs; - glVertex2i( curr_x, 0 + 4 ); - glVertex2i( curr_x, 0 + 4 ); - glVertex2i( curr_x, 0 + h - 3 ); - glVertex2i( curr_x, 0 + h - 3 ); - glEnd(); - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); -} - - - -/******************************** GLUI_EditText::substring_width() *********/ - -int GLUI_EditText::substring_width( int start, int end ) -{ - int i, width; - - width = 0; - - for( i=start; i<=end; i++ ) - width += char_width( text[i] ); - - return width; -} - - -/***************************** GLUI_EditText::update_and_draw_text() ********/ - -void GLUI_EditText::update_and_draw_text( void ) -{ - if ( NOT can_draw() ) - return; - - update_substring_bounds(); - /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ - - redraw(); -} - - -/********************************* GLUI_EditText::special_handler() **********/ - -int GLUI_EditText::special_handler( int key,int modifiers ) -{ - if ( NOT glui ) - return false; - - if ( debug ) - printf( "SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", - key, modifiers, substring_start, substring_end,insertion_pt, - sel_start, sel_end ); - - if ( key == GLUT_KEY_LEFT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, -1 ); - } - else { - insertion_pt--; - } - } - else if ( key == GLUT_KEY_RIGHT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, +1 ); - } - else { - insertion_pt++; - } - } - else if ( key == GLUT_KEY_HOME ) { - insertion_pt = 0; - } - else if ( key == GLUT_KEY_END ) { - insertion_pt = (int) text.length(); - } - - /*** Update selection if shift key is down ***/ - if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) - sel_end = insertion_pt; - else - sel_start = sel_end = insertion_pt; - - - CLAMP( insertion_pt, 0, (int) text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_start, 0, (int) text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_end, 0, (int) text.length()); /* Make sure insertion_pt - is in bounds */ - - /******** Now redraw text ***********/ - if ( can_draw()) - update_and_draw_text(); - - return true; -} - - -/****************************** GLUI_EditText::find_word_break() **********/ -/* It looks either left or right (depending on value of 'direction' */ -/* for the beginning of the next 'word', where word are characters */ -/* separated by one of the following tokens: " :-.," */ -/* If there is no next word in the specified direction, this returns */ -/* the beginning of 'text', or the very end. */ - -int GLUI_EditText::find_word_break( int start, int direction ) -{ - int i, j; - char *breaks = " :-.,"; - int num_break_chars = (int)strlen(breaks), text_len = (int)text.length(); - int new_pt; - - /** If we're moving left, we have to start two back, in case we're either - already at the beginning of a word, or on a separating token. - Otherwise, this function would just return the word we're already at **/ - if ( direction == -1 ) { - start -= 2; - } - - /***** Iterate over text in the specified direction *****/ - for ( i=start; i >= 0 AND i < text_len; i += direction ) { - - /** For each character in text, iterate over list of separating tokens **/ - for( j=0; j 0 ) /* Return the end of string */ - return text_len; - else /* Return the beginning of the text */ - return 0; -} - - -/********************************** GLUI_EditText::clear_substring() ********/ - -void GLUI_EditText::clear_substring( int start, int end ) -{ - int i; - - /* - printf( "clearing: %d-%d '", start,end); - for(i=start;ifloat_val = this->float_val; - spinner->int_val = this->int_val; - } - - /*** Now update the live variable ***/ - output_live(true); -} - - -/******************************* GLUI_EditText::set_float_val() ************/ - -void GLUI_EditText::set_float_val( float new_val ) -{ - if ( has_limits == GLUI_LIMIT_CLAMP ) { - /*** Clamp the new value to the existing limits ***/ - - CLAMP( new_val, float_low, float_high ); - } - else if ( has_limits == GLUI_LIMIT_WRAP ) { - /*** Clamp the value cyclically to the limits - that is, if the - value exceeds the max, set it the the minimum, and conversely ***/ - - if ( new_val < float_low ) - new_val = float_high; - if ( new_val > float_high ) - new_val = float_low; - } - - float_val = new_val; - int_val = (int) new_val; /* Mirror the value as an int, too */ - - set_numeric_text(); -} - - -/********************************** GLUI_EditText::set_int_val() ************/ - -void GLUI_EditText::set_int_val( int new_val ) -{ - if ( has_limits == GLUI_LIMIT_CLAMP ) { - /*** Clamp the new value to the existing limits ***/ - - CLAMP( new_val, int_low, int_high ); - } - else if ( has_limits == GLUI_LIMIT_WRAP ) { - /*** Clamp the value cyclically to the limits - that is, if the - value exceeds the max, set it the the minimum, and conversely ***/ - - if ( new_val < int_low ) - new_val = int_high; - if ( new_val > int_high ) - new_val = int_low; - } - - int_val = new_val; - float_val = (float) new_val; /* We mirror the value as a float, too */ - - set_numeric_text(); -} - - -/********************************* GLUI_EditText::set_float_limits() *********/ - -void GLUI_EditText::set_float_limits( float low, float high, int limit_type ) -{ - has_limits = limit_type; - float_low = low; - float_high = high; - - if ( NOT IN_BOUNDS( float_val, float_low, float_high )) - set_float_val( float_low ); - - int_low = (int) float_low; - int_high = (int) float_high; -} - - -/*********************************** GLUI_EditText::set_int_limits() *********/ - -void GLUI_EditText::set_int_limits( int low, int high, int limit_type ) -{ - has_limits = limit_type; - int_low = low; - int_high = high; - - if ( NOT IN_BOUNDS( int_val, int_low, int_high )) - set_int_val( int_low ); - - float_low = (float) int_low; - float_high = (float) int_high; -} - - -/************************************ GLUI_EditText::set_numeric_text() ******/ - -void GLUI_EditText::set_numeric_text( void ) -{ - char buf_num[200]; - int i, text_len; - - if ( data_type == GLUI_EDITTEXT_FLOAT ) { - sprintf( buf_num, "%#g", float_val ); - - num_periods = 0; - text_len = (int) strlen(buf_num); - for ( i=0; i 0 ) { - text_len = (int) strlen(buf_num); - for ( i=text_len-1; i>0; i-- ) { - if ( buf_num[i] == '0' AND buf_num[i-1] != '.' ) - buf_num[i] = '\0'; - else - break; - } - } - set_text( buf_num ); - } - else { - sprintf( buf_num, "%d", int_val ); - set_text( buf_num ); - } - -} - - -/*************************************** GLUI_EditText::dump() **************/ - -void GLUI_EditText::dump( FILE *out, const char *name ) -{ - fprintf( out, - "%s (edittext@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", - name, this, - insertion_pt, - substring_start, - substring_end, - sel_start, - sel_end, - (int) text.length()); -} - - -/**************************************** GLUI_EditText::mouse_over() ********/ - -int GLUI_EditText::mouse_over( int state, int x, int y ) -{ - if ( state ) { - /* curr_cursor = GLUT_CURSOR_TEXT; */ - glutSetCursor( GLUT_CURSOR_TEXT ); - } - else { - /* printf( "OUT\n" ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - } - - return true; -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_edittext.cpp - GLUI_EditText control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" +#include + +/****************************** GLUI_EditText::GLUI_EditText() **********/ + +GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, + int data_type, void *live_var, + int id, GLUI_CB callback ) +{ + if (data_type == GLUI_EDITTEXT_TEXT) { + live_type = GLUI_LIVE_TEXT; + } + else if (data_type == GLUI_EDITTEXT_STRING) { + data_type = GLUI_EDITTEXT_TEXT; // EDITTEXT_STRING doesn't really exist. + // Except as a signal to make a string. + // It's a backwards-compat hack. + live_type = GLUI_LIVE_STRING; + } + else if (data_type == GLUI_EDITTEXT_INT) { + live_type = GLUI_LIVE_INT; + } + else if (data_type == GLUI_EDITTEXT_FLOAT) { + live_type = GLUI_LIVE_FLOAT; + } + common_construct( parent, name, data_type, live_type, live_var, id, callback ); +} + +/****************************** GLUI_EditText::GLUI_EditText() **********/ + +GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, + int text_type, int id, GLUI_CB callback ) +{ + common_construct( parent, name, text_type, GLUI_LIVE_NONE, 0, id, callback); +} + +/****************************** GLUI_EditText::GLUI_EditText() **********/ + +GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, + int *live_var, + int id, GLUI_CB callback ) +{ + common_construct( parent, name, GLUI_EDITTEXT_INT, GLUI_LIVE_INT, live_var, id, callback); +} + +/****************************** GLUI_EditText::GLUI_EditText() **********/ + +GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, + float *live_var, + int id, GLUI_CB callback ) +{ + common_construct( parent, name, GLUI_EDITTEXT_FLOAT, GLUI_LIVE_FLOAT, live_var, id, callback); +} + +/****************************** GLUI_EditText::GLUI_EditText() **********/ + +GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, + char *live_var, + int id, GLUI_CB callback ) +{ + common_construct( parent, name, GLUI_EDITTEXT_TEXT, GLUI_LIVE_TEXT, live_var, id, callback); +} + +/****************************** GLUI_EditText::GLUI_EditText() **********/ + +GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, + std::string &live_var, + int id, GLUI_CB callback ) +{ + common_construct( parent, name, GLUI_EDITTEXT_TEXT, GLUI_LIVE_STRING, &live_var, id, callback); +} + +/****************************** GLUI_EditText::common_construct() **********/ + +void GLUI_EditText::common_construct( GLUI_Node *parent, const char *name, + int data_t, int live_t, void *data, int id, + GLUI_CB cb ) +{ + common_init(); + set_name( name ); + + live_type = live_t; + data_type = data_t; + ptr_val = data; + user_id = id; + callback = cb; + + + if ( live_type == GLUI_LIVE_INT) { + if ( data == NULL ) + set_int_val(int_val); /** Set to some default, in case of no live var **/ + } + else if ( live_type == GLUI_LIVE_FLOAT ) { + num_periods = 1; + if ( data == NULL ) + set_float_val(float_val); /** Set to some default, in case of no live var **/ + } + + parent->add_control( this ); + + init_live(); +} + +/****************************** GLUI_EditText::mouse_down_handler() **********/ + +int GLUI_EditText::mouse_down_handler( int local_x, int local_y ) +{ + int tmp_insertion_pt; + + if ( debug ) dump( stdout, "-> MOUSE DOWN" ); + + tmp_insertion_pt = find_insertion_pt( local_x, local_y ); + if ( tmp_insertion_pt == -1 ) { + if ( glui ) + glui->deactivate_current_control( ); + return false; + } + + insertion_pt = tmp_insertion_pt; + + sel_start = sel_end = insertion_pt; + + if ( can_draw()) + update_and_draw_text(); + + if ( debug ) dump( stdout, "<- MOUSE UP" ); + + return true; +} + + +/******************************** GLUI_EditText::mouse_up_handler() **********/ + +int GLUI_EditText::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + return false; +} + + +/***************************** GLUI_EditText::mouse_held_down_handler() ******/ + +int GLUI_EditText::mouse_held_down_handler( int local_x, int local_y, + bool new_inside) +{ + int tmp_pt; + + if ( NOT new_inside ) + return false; + + if ( debug ) dump( stdout, "-> HELD DOWN" ); + + tmp_pt = find_insertion_pt( local_x, local_y ); + + if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ + special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); + } + else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { + /* moved mouse past right edge */ + special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); + } + else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { + sel_end = insertion_pt = tmp_pt; + + update_and_draw_text(); + } + + if ( debug ) + dump( stdout, "<- HELD DOWN" ); + + return false; +} + + +/****************************** GLUI_EditText::key_handler() **********/ + +int GLUI_EditText::key_handler( unsigned char key,int modifiers ) +{ + int i, regular_key; + /* int has_selection; */ + + if ( NOT glui ) + return false; + + if ( debug ) + dump( stdout, "-> KEY HANDLER" ); + + regular_key = false; + bool ctrl_down = (modifiers & GLUT_ACTIVE_CTRL)!=0; + /* has_selection = (sel_start != sel_end); */ + + if ( key == CTRL('m') ) { /* RETURN */ + /* glui->deactivate_current_control(); */ + deactivate(); /** Force callbacks, etc **/ + activate(GLUI_ACTIVATE_TAB); /** Reselect all text **/ + redraw(); + return true; + } + else if ( key == CTRL('[')) { /* ESCAPE */ + glui->deactivate_current_control(); + return true; + } + else if ( (key == 127 AND !ctrl_down) OR /* FORWARD DELETE */ + ( key == CTRL('d') AND modifiers == GLUT_ACTIVE_CTRL) ) + { + if ( sel_start == sel_end ) { /* no selection */ + if ( insertion_pt < (int)text.length() ) { + /*** See if we're deleting a period in a float data-type box ***/ + if ( data_type == GLUI_EDITTEXT_FLOAT AND text[insertion_pt]=='.' ) + num_periods--; + + /*** Shift over string first ***/ + text.erase(insertion_pt,1); + } + } + else { /* There is a selection */ + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + } + else if ( ((key == 127) AND ctrl_down) OR // Delete word forward + ((key == 'd') AND (modifiers == GLUT_ACTIVE_ALT)) ) + { + if ( sel_start == sel_end ) { /* no selection */ + sel_start = insertion_pt; + sel_end = find_word_break( insertion_pt, +1 ); + } + + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + else if ( key == CTRL('h') ) { /* BACKSPACE */ + if ( sel_start == sel_end ) { /* no selection */ + if ( insertion_pt > 0 ) { + /*** See if we're deleting a period in a float data-type box ***/ + if ( data_type == GLUI_EDITTEXT_FLOAT AND text[insertion_pt-1]=='.' ) + num_periods--; + + /*** Shift over string first ***/ + insertion_pt--; + text.erase(insertion_pt,1); + } + } + else { /* There is a selection */ + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + } + else if ( modifiers == GLUT_ACTIVE_CTRL ) /* CTRL ONLY */ + { + /* Ctrl-key bindings */ + if ( key == CTRL('a') ) { + return special_handler( GLUT_KEY_HOME, 0 ); + } + else if ( key == CTRL('e') ) { + return special_handler( GLUT_KEY_END, 0 ); + } + else if ( key == CTRL('b') ) { + return special_handler( GLUT_KEY_LEFT, 0 ); + } + else if ( key == CTRL('f') ) { + return special_handler( GLUT_KEY_RIGHT, 0 ); + } + else if ( key == CTRL('p') ) { + return special_handler( GLUT_KEY_UP, 0 ); + } + else if ( key == CTRL('n') ) { + return special_handler( GLUT_KEY_DOWN, 0 ); + } + else if ( key == CTRL('u') ) { /* ERASE LINE */ + insertion_pt = 0; + text.erase(0,text.length()); + sel_start = sel_end = 0; + } + else if ( key == CTRL('k') ) { /* KILL TO END OF LINE */ + sel_start = sel_end = insertion_pt; + text.erase(insertion_pt,GLUI_String::npos); + } + } + else if ( modifiers == GLUT_ACTIVE_ALT ) /* ALT ONLY */ + { + if ( key == 'b' ) { // Backward word + return special_handler ( GLUT_KEY_LEFT, GLUT_ACTIVE_CTRL ); + } + if ( key == 'f' ) { // Forward word + return special_handler ( GLUT_KEY_RIGHT, GLUT_ACTIVE_CTRL ); + } + } + else if ( (modifiers & GLUT_ACTIVE_CTRL) OR + (modifiers & GLUT_ACTIVE_ALT) ) + { + /** ignore other keys with modifiers */ + return true; + } + else { /* Regular key */ + regular_key = true; + + /** Check if we only accept numbers **/ + if (data_type == GLUI_EDITTEXT_FLOAT ) { + if ( (key < '0' OR key > '9') AND key != '.' AND key != '-' ) + return true; + + if ( key == '-' ) { /* User typed a '-' */ + + /* If user has first character selected, then '-' is allowed */ + if ( NOT ( MIN(sel_start,sel_end) == 0 AND + MAX(sel_start,sel_end) > 0 ) ) { + + /* User does not have 1st char selected */ + if (insertion_pt != 0 OR text[0] == '-' ) { + return true; /* Can only place negative at beginning of text, + and only one of them */ + } + } + } + + if ( key == '.' ) { + /*printf( "PERIOD: %d\n", num_periods ); */ + + if ( num_periods > 0 ) { + /** We're trying to type a period, but the text already contains + a period. Check whether the period is contained within + is current selection (thus it will be safely replaced) **/ + + int period_found = false; + if ( sel_start != sel_end ) { + for( i=MIN(sel_end,sel_start); i '9') AND key != '-' ) + return true; + + if ( key == '-' ) { /* User typed a '-' */ + + /* If user has first character selected, then '-' is allowed */ + if ( NOT ( MIN(sel_start,sel_end) == 0 AND + MAX(sel_start,sel_end) > 0 ) ) { + + /* User does not have 1st char selected */ + if (insertion_pt != 0 OR text[0] == '-' ) { + return true; /* Can only place negative at beginning of text, + and only one of them */ + } + } + } + } + + /** This is just to get rid of warnings - the flag regular_key is + set if the key was not a backspace, return, whatever. But I + believe if we're here, we know it was a regular key anyway */ + if ( regular_key ) { + } + + /**** If there's a current selection, erase it ******/ + if ( sel_start != sel_end ) { + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + + /******** We insert the character into the string ***/ + + text.insert(insertion_pt,1,key); + + /******** Move the insertion point and substring_end one over ******/ + insertion_pt++; + substring_end++; + + sel_start = sel_end = insertion_pt; + } + + /******** Now redraw text ***********/ + /* Hack to prevent text box from being cleared first **/ + /** int substring_change = update_substring_bounds(); + draw_text_only = + (NOT substring_change AND NOT has_selection AND regular_key ); + */ + + draw_text_only = false; /** Well, hack is not yet working **/ + update_and_draw_text(); + draw_text_only = false; + + + if ( debug ) + dump( stdout, "<- KEY HANDLER" ); + + /*** Now look to see if this string has a period ***/ + num_periods = 0; + for( i=0; i<(int)text.length(); i++ ) + if ( text[i] == '.' ) + num_periods++; + + return true; +} + + +/****************************** GLUI_EditText::activate() **********/ + +void GLUI_EditText::activate( int how ) +{ + if ( debug ) + dump( stdout, "-> ACTIVATE" ); + + active = true; + + if ( how == GLUI_ACTIVATE_MOUSE ) + return; /* Don't select everything if activated with mouse */ + + orig_text = text; + + sel_start = 0; + sel_end = (int)text.length(); + insertion_pt = 0; + + if ( debug ) + dump( stdout, "<- ACTIVATE" ); +} + + +/****************************** GLUI_EditText::deactivate() **********/ + +void GLUI_EditText::deactivate( void ) +{ + int new_int_val; + float new_float_val; + + active = false; + + if ( NOT glui ) + return; + + if ( debug ) + dump( stdout, "-> DISACTIVATE" ); + + sel_start = sel_end = insertion_pt = -1; + + /***** Retrieve the current value from the text *****/ + /***** The live variable will be updated by set_text() ****/ + if ( data_type == GLUI_EDITTEXT_FLOAT ) { + if ( text.length() == 0 ) /* zero-length string - make it "0.0" */ + text = "0.0"; + + new_float_val = atof( text.c_str() ); + + set_float_val( new_float_val ); + } + else if ( data_type == GLUI_EDITTEXT_INT ) { + if ( text.length() == 0 ) /* zero-length string - make it "0" */ + text = "0"; + + new_int_val = atoi( text.c_str() ); + + set_int_val( new_int_val ); + } + else + if ( data_type == GLUI_EDITTEXT_TEXT ) { + set_text(text); /* This will force callbacks and gfx refresh */ + } + + update_substring_bounds(); + + /******** redraw text without insertion point ***********/ + redraw(); + + /***** Now do callbacks if value changed ******/ + if ( orig_text != text ) { + this->execute_callback(); + + if ( 0 ) { + /* THE CODE BELOW IS FROM WHEN SPINNER ALSO MAINTAINED CALLBACKS */ + if ( spinner == NULL ) { /** Are we independent of a spinner? **/ + if ( callback ) { + callback( this ); + } + } + else { /* We're attached to a spinner */ + spinner->do_callbacks(); /* Let the spinner do the callback stuff */ + } + } + } + + if ( debug ) + dump( stdout, "<- DISACTIVATE" ); +} + +/****************************** GLUI_EditText::draw() **********/ + +void GLUI_EditText::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int name_x; + + name_x = MAX(text_x_offset - string_width(this->name) - 3,0); + draw_name( name_x , 13); + + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( text_x_offset, 0 ); glVertex2i( w, 0 ); + glVertex2i( text_x_offset, 0 ); glVertex2i( text_x_offset, h ); + + glColor3f( 1., 1., 1. ); + glVertex2i( text_x_offset, h ); glVertex2i( w, h ); + glVertex2i( w, h ); glVertex2i( w, 0 ); + + if ( enabled ) + glColor3f( 0., 0., 0. ); + else + glColor3f( .25, .25, .25 ); + glVertex2i( text_x_offset+1, 1 ); glVertex2i( w-1, 1 ); + glVertex2i( text_x_offset+1, 1 ); glVertex2i( text_x_offset+1, h-1 ); + + glColor3f( .75, .75, .75 ); + glVertex2i( text_x_offset+1, h-1 ); glVertex2i( w-1, h-1 ); + glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); + glEnd(); + + /** Find where to draw the text **/ + update_substring_bounds(); + draw_text(0,0); + + draw_insertion_pt(); +} + + + +/************************** GLUI_EditText::update_substring_bounds() *********/ + +int GLUI_EditText::update_substring_bounds( void ) +{ + int box_width; + int text_len = (int)text.length(); + int old_start, old_end; + + old_start = substring_start; + old_end = substring_end; + + /*** Calculate the width of the usable area of the edit box ***/ + box_width = MAX( this->w - this->text_x_offset + - 4 /* 2 * the two-line box border */ + - 2 * GLUI_EDITTEXT_BOXINNERMARGINX, 0 ); + + CLAMP( substring_end, 0, MAX(text_len-1,0) ); + CLAMP( substring_start, 0, MAX(text_len-1,0) ); + + if ( debug ) dump( stdout, "-> UPDATE SS" ); + + if ( insertion_pt >= 0 AND + insertion_pt < substring_start ) { /* cursor moved left */ + substring_start = insertion_pt; + + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_end--; + } + else if ( insertion_pt > substring_end ) { /* cursor moved right */ + substring_end = insertion_pt-1; + + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_start++; + } + else { /* cursor is within old substring bounds */ + if ( last_insertion_pt > insertion_pt ) { /* cursor moved left */ + } + else { + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_end--; + + while(substring_end < text_len-1 + AND substring_width( substring_start, substring_end ) <= box_width) + substring_end++; + } + } + + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_end--; + + last_insertion_pt = insertion_pt; + + /*** No selection if not enabled ***/ + if ( NOT enabled ) { + sel_start = sel_end = 0; + } + + if ( debug ) dump( stdout, "<- UPDATE SS" ); + + if ( substring_start == old_start AND substring_end == old_end ) + return false; /*** bounds did not change ***/ + else + return true; /*** bounds did change ***/ +} + + +/********************************* GLUI_EditText::update_x_offsets() *********/ + +void GLUI_EditText::update_x_offsets( void ) +{ +} + + +/********************************* GLUI_EditText::draw_text() ****************/ + +void GLUI_EditText::draw_text( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int text_x, i, sel_lo, sel_hi; + + if ( debug ) dump( stdout, "-> DRAW_TEXT" ); + + if ( NOT draw_text_only ) { + if ( enabled ) + glColor3f( 1., 1., 1. ); + else + set_to_bkgd_color(); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( text_x_offset+2, 2 ); glVertex2i( w-2, 2 ); + glVertex2i( w-2, h-2 ); glVertex2i( text_x_offset+2, h-2 ); + glEnd(); + } + + /** Find where to draw the text **/ + + text_x = text_x_offset + 2 + GLUI_EDITTEXT_BOXINNERMARGINX; + + /*printf( "text_x: %d substr_width: %d start/end: %d/%d\n", + text_x, substring_width( substring_start, substring_end ), + substring_start, substring_end ); + */ + /** Find lower and upper selection bounds **/ + sel_lo = MIN(sel_start, sel_end ); + sel_hi = MAX(sel_start, sel_end ); + + int sel_x_start, sel_x_end, delta; + + /** Draw selection area dark **/ + if ( sel_start != sel_end ) { + sel_x_start = text_x; + sel_x_end = text_x; + for( i=substring_start; i<=substring_end; i++ ) { + delta = char_width( text[i] ); + + if ( i < sel_lo ) { + sel_x_start += delta; + sel_x_end += delta; + } + else if ( i < sel_hi ) { + sel_x_end += delta; + } + } + + glColor3f( 0.0f, 0.0f, .6f ); + glBegin( GL_QUADS ); + glVertex2i( sel_x_start, 2 ); glVertex2i( sel_x_end, 2 ); + glVertex2i( sel_x_end, h-2 ); glVertex2i( sel_x_start, h-2 ); + glEnd(); + } + + + if ( sel_start == sel_end ) { /* No current selection */ + if ( enabled ) + glColor3b( 0, 0, 0 ); + else + glColor3b( 32, 32, 32 ); + + glRasterPos2i( text_x, 13); + for( i=substring_start; i<=substring_end; i++ ) { + glutBitmapCharacter( get_font(), this->text[i] ); + } + } + else { /* There is a selection */ + int x = text_x; + for( i=substring_start; i<=substring_end; i++ ) { + if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { /* This character is selected */ + glColor3f( 1., 1., 1. ); + glRasterPos2i( x, 13); + glutBitmapCharacter( get_font(), this->text[i] ); + } + else { + glColor3f( 0., 0., 0. ); + glRasterPos2i( x, 13); + glutBitmapCharacter( get_font(), this->text[i] ); + } + + x += char_width( text[i] ); + } + } + + if ( debug ) dump( stdout, "<- DRAW_TEXT" ); +} + + +/******************************** GLUI_EditText::find_insertion_pt() *********/ +/* This function returns the character numer *before which* the insertion */ +/* point goes */ + +int GLUI_EditText::find_insertion_pt( int x, int y ) +{ + int curr_x, i; + + /*** See if we clicked outside box ***/ + if ( x < this->x_abs + text_x_offset ) + return -1; + + /* We move from right to left, looking to see if the mouse was clicked + to the right of the ith character */ + + curr_x = this->x_abs + text_x_offset + + substring_width( substring_start, substring_end ) + + 2 /* The edittext box has a 2-pixel margin */ + + GLUI_EDITTEXT_BOXINNERMARGINX; /** plus this many pixels blank space + between the text and the box **/ + + /*** See if we clicked in an empty box ***/ + if ( (int) text.length() == 0 ) + return 0; + + /** find mouse click in text **/ + for( i=substring_end; i>=substring_start; i-- ) { + curr_x -= char_width( text[i] ); + + if ( x > curr_x ) { + /* printf( "-> %d\n", i ); */ + + return i+1; + } + } + + return 0; + + /* Well, the mouse wasn't after any of the characters...see if it's + before the beginning of the substring */ + if ( 0 ) { + if ( x > (x_abs + text_x_offset + 2 ) ) + return substring_start; + + return -1; /* Nothing found */ + } +} + + +/******************************** GLUI_EditText::draw_insertion_pt() *********/ + +void GLUI_EditText::draw_insertion_pt( void ) +{ + int curr_x, i; + + if ( NOT can_draw() ) + return; + + /*** Don't draw insertion pt if control is disabled ***/ + if ( NOT enabled ) + return; + + if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); + + if ( sel_start != sel_end OR insertion_pt < 0 ) { + return; /* Don't draw insertion point if there is a current selection */ + } + + /* printf( "insertion pt: %d\n", insertion_pt ); */ + + curr_x = this->x_abs + text_x_offset + + substring_width( substring_start, substring_end ) + + 2 /* The edittext box has a 2-pixel margin */ + + GLUI_EDITTEXT_BOXINNERMARGINX; /** plus this many pixels blank space + between the text and the box **/ + + for( i=substring_end; i>=insertion_pt; i-- ) { + curr_x -= char_width( text[i] ); + } + + glColor3f( 0.0, 0.0, 0.0 ); + glBegin( GL_LINE_LOOP ); + /*** + glVertex2i( curr_x, y_abs + 4 ); + glVertex2i( curr_x, y_abs + 4 ); + glVertex2i( curr_x, y_abs + h - 3 ); + glVertex2i( curr_x, y_abs + h - 3 ); + ***/ + curr_x -= x_abs; + glVertex2i( curr_x, 0 + 4 ); + glVertex2i( curr_x, 0 + 4 ); + glVertex2i( curr_x, 0 + h - 3 ); + glVertex2i( curr_x, 0 + h - 3 ); + glEnd(); + + if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); +} + + + +/******************************** GLUI_EditText::substring_width() *********/ + +int GLUI_EditText::substring_width( int start, int end ) +{ + int i, width; + + width = 0; + + for( i=start; i<=end; i++ ) + width += char_width( text[i] ); + + return width; +} + + +/***************************** GLUI_EditText::update_and_draw_text() ********/ + +void GLUI_EditText::update_and_draw_text( void ) +{ + if ( NOT can_draw() ) + return; + + update_substring_bounds(); + /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ + + redraw(); +} + + +/********************************* GLUI_EditText::special_handler() **********/ + +int GLUI_EditText::special_handler( int key,int modifiers ) +{ + if ( NOT glui ) + return false; + + if ( debug ) + printf( "SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", + key, modifiers, substring_start, substring_end,insertion_pt, + sel_start, sel_end ); + + if ( key == GLUT_KEY_LEFT ) { + if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { + insertion_pt = find_word_break( insertion_pt, -1 ); + } + else { + insertion_pt--; + } + } + else if ( key == GLUT_KEY_RIGHT ) { + if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { + insertion_pt = find_word_break( insertion_pt, +1 ); + } + else { + insertion_pt++; + } + } + else if ( key == GLUT_KEY_HOME ) { + insertion_pt = 0; + } + else if ( key == GLUT_KEY_END ) { + insertion_pt = (int) text.length(); + } + + /*** Update selection if shift key is down ***/ + if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) + sel_end = insertion_pt; + else + sel_start = sel_end = insertion_pt; + + + CLAMP( insertion_pt, 0, (int) text.length()); /* Make sure insertion_pt + is in bounds */ + CLAMP( sel_start, 0, (int) text.length()); /* Make sure insertion_pt + is in bounds */ + CLAMP( sel_end, 0, (int) text.length()); /* Make sure insertion_pt + is in bounds */ + + /******** Now redraw text ***********/ + if ( can_draw()) + update_and_draw_text(); + + return true; +} + + +/****************************** GLUI_EditText::find_word_break() **********/ +/* It looks either left or right (depending on value of 'direction' */ +/* for the beginning of the next 'word', where word are characters */ +/* separated by one of the following tokens: " :-.," */ +/* If there is no next word in the specified direction, this returns */ +/* the beginning of 'text', or the very end. */ + +int GLUI_EditText::find_word_break( int start, int direction ) +{ + int i, j; + char *breaks = " :-.,"; + int num_break_chars = (int)strlen(breaks), text_len = (int)text.length(); + int new_pt; + + /** If we're moving left, we have to start two back, in case we're either + already at the beginning of a word, or on a separating token. + Otherwise, this function would just return the word we're already at **/ + if ( direction == -1 ) { + start -= 2; + } + + /***** Iterate over text in the specified direction *****/ + for ( i=start; i >= 0 AND i < text_len; i += direction ) { + + /** For each character in text, iterate over list of separating tokens **/ + for( j=0; j 0 ) /* Return the end of string */ + return text_len; + else /* Return the beginning of the text */ + return 0; +} + + +/********************************** GLUI_EditText::clear_substring() ********/ + +void GLUI_EditText::clear_substring( int start, int end ) +{ + int i; + + /* + printf( "clearing: %d-%d '", start,end); + for(i=start;ifloat_val = this->float_val; + spinner->int_val = this->int_val; + } + + /*** Now update the live variable ***/ + output_live(true); +} + + +/******************************* GLUI_EditText::set_float_val() ************/ + +void GLUI_EditText::set_float_val( float new_val ) +{ + if ( has_limits == GLUI_LIMIT_CLAMP ) { + /*** Clamp the new value to the existing limits ***/ + + CLAMP( new_val, float_low, float_high ); + } + else if ( has_limits == GLUI_LIMIT_WRAP ) { + /*** Clamp the value cyclically to the limits - that is, if the + value exceeds the max, set it the the minimum, and conversely ***/ + + if ( new_val < float_low ) + new_val = float_high; + if ( new_val > float_high ) + new_val = float_low; + } + + float_val = new_val; + int_val = (int) new_val; /* Mirror the value as an int, too */ + + set_numeric_text(); +} + + +/********************************** GLUI_EditText::set_int_val() ************/ + +void GLUI_EditText::set_int_val( int new_val ) +{ + if ( has_limits == GLUI_LIMIT_CLAMP ) { + /*** Clamp the new value to the existing limits ***/ + + CLAMP( new_val, int_low, int_high ); + } + else if ( has_limits == GLUI_LIMIT_WRAP ) { + /*** Clamp the value cyclically to the limits - that is, if the + value exceeds the max, set it the the minimum, and conversely ***/ + + if ( new_val < int_low ) + new_val = int_high; + if ( new_val > int_high ) + new_val = int_low; + } + + int_val = new_val; + float_val = (float) new_val; /* We mirror the value as a float, too */ + + set_numeric_text(); +} + + +/********************************* GLUI_EditText::set_float_limits() *********/ + +void GLUI_EditText::set_float_limits( float low, float high, int limit_type ) +{ + has_limits = limit_type; + float_low = low; + float_high = high; + + if ( NOT IN_BOUNDS( float_val, float_low, float_high )) + set_float_val( float_low ); + + int_low = (int) float_low; + int_high = (int) float_high; +} + + +/*********************************** GLUI_EditText::set_int_limits() *********/ + +void GLUI_EditText::set_int_limits( int low, int high, int limit_type ) +{ + has_limits = limit_type; + int_low = low; + int_high = high; + + if ( NOT IN_BOUNDS( int_val, int_low, int_high )) + set_int_val( int_low ); + + float_low = (float) int_low; + float_high = (float) int_high; +} + + +/************************************ GLUI_EditText::set_numeric_text() ******/ + +void GLUI_EditText::set_numeric_text( void ) +{ + char buf_num[200]; + int i, text_len; + + if ( data_type == GLUI_EDITTEXT_FLOAT ) { + sprintf( buf_num, "%#g", float_val ); + + num_periods = 0; + text_len = (int) strlen(buf_num); + for ( i=0; i 0 ) { + text_len = (int) strlen(buf_num); + for ( i=text_len-1; i>0; i-- ) { + if ( buf_num[i] == '0' AND buf_num[i-1] != '.' ) + buf_num[i] = '\0'; + else + break; + } + } + set_text( buf_num ); + } + else { + sprintf( buf_num, "%d", int_val ); + set_text( buf_num ); + } + +} + + +/*************************************** GLUI_EditText::dump() **************/ + +void GLUI_EditText::dump( FILE *out, const char *name ) +{ + fprintf( out, + "%s (edittext@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", + name, this, + insertion_pt, + substring_start, + substring_end, + sel_start, + sel_end, + (int) text.length()); +} + + +/**************************************** GLUI_EditText::mouse_over() ********/ + +int GLUI_EditText::mouse_over( int state, int x, int y ) +{ + if ( state ) { + /* curr_cursor = GLUT_CURSOR_TEXT; */ + glutSetCursor( GLUT_CURSOR_TEXT ); + } + else { + /* printf( "OUT\n" ); */ + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); + } + + return true; +} diff --git a/Extras/glui/glui_filebrowser.cpp b/Extras/glui/glui_filebrowser.cpp index f8ae16815..81361cb60 100644 --- a/Extras/glui/glui_filebrowser.cpp +++ b/Extras/glui/glui_filebrowser.cpp @@ -1,165 +1,165 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_filebrowser.cpp - GLUI_FileBrowser control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" -#include - -#ifdef __GNUC__ -#include -#include -#endif - -#ifdef _WIN32 -#include -#endif - -#include - -GLUI_FileBrowser::GLUI_FileBrowser( GLUI_Node *parent, - const char *name, - int type, - int id, - GLUI_CB cb) -{ - common_init(); - - set_name( name ); - user_id = id; - int_val = type; - callback = cb; - - parent->add_control( this ); - list = new GLUI_List(this, true, 1); - list->set_object_callback( GLUI_FileBrowser::dir_list_callback, this ); - list->set_click_type(GLUI_DOUBLE_CLICK); - this->fbreaddir(this->current_dir.c_str()); -} - -/****************************** GLUI_FileBrowser::draw() **********/ - -void GLUI_FileBrowser::dir_list_callback(GLUI_Control *glui_object) { - GLUI_List *list = glui_object->dynamicCastGLUI_List(); - if (!list) - return; - GLUI_FileBrowser* me = list->associated_object->dynamicCastGLUI_FileBrowser(); - if (!me) - return; - int this_item; - const char *selected; - this_item = list->get_current_item(); - if (this_item > 0) { /* file or directory selected */ - selected = list->get_item_ptr( this_item )->text.c_str(); - if (selected[0] == '/' || selected[0] == '\\') { - if (me->allow_change_dir) { -#ifdef __GNUC__ - chdir(selected+1); -#endif -#ifdef _WIN32 - SetCurrentDirectory(selected+1); -#endif - me->fbreaddir("."); - } - } else { - me->file = selected; - me->execute_callback(); - } - } -} - - - -void GLUI_FileBrowser::fbreaddir(const char *d) { - GLUI_String item; - int i = 0; - - if (!d) - return; - -#ifdef _WIN32 - - WIN32_FIND_DATA FN; - HANDLE hFind; - //char search_arg[MAX_PATH], new_file_path[MAX_PATH]; - //sprintf(search_arg, "%s\\*.*", path_name); - - hFind = FindFirstFile("*.*", &FN); - if (list) { - list->delete_all(); - if (hFind != INVALID_HANDLE_VALUE) { - do { - int len = int(strlen(FN.cFileName)); - if (FN.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - item = '\\'; - item += FN.cFileName; - } else { - item = FN.cFileName; - } - list->add_item(i,item.c_str()); - i++; - } while (FindNextFile(hFind, &FN) != 0); - - if (GetLastError() == ERROR_NO_MORE_FILES) - FindClose(&FN); - else - perror("fbreaddir"); - } - } - -#elif defined(__GNUC__) - - DIR *dir; - struct dirent *dirp; - struct stat dr; - - if (list) { - list->delete_all(); - if ((dir = opendir(d)) == NULL) - perror("fbreaddir:"); - else { - while ((dirp = readdir(dir)) != NULL) /* open directory */ - { - if (!lstat(dirp->d_name,&dr) && S_ISDIR(dr.st_mode)) /* dir is directory */ - item = dirp->d_name + GLUI_String("/"); - else - item = dirp->d_name; - - list->add_item(i,item.c_str()); - i++; - } - closedir(dir); - } - } -#endif -} - -void ProcessFiles(const char *path_name) -{ - -} - - -void GLUI_FileBrowser::set_w(int w) -{ - if (list) list->set_w(w); -} - -void GLUI_FileBrowser::set_h(int h) -{ - if (list) list->set_h(h); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_filebrowser.cpp - GLUI_FileBrowser control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. + +*****************************************************************************/ + +#include "GL/glui.h" +#include "glui_internal.h" +#include + +#ifdef __GNUC__ +#include +#include +#endif + +#ifdef _WIN32 +#include +#endif + +#include + +GLUI_FileBrowser::GLUI_FileBrowser( GLUI_Node *parent, + const char *name, + int type, + int id, + GLUI_CB cb) +{ + common_init(); + + set_name( name ); + user_id = id; + int_val = type; + callback = cb; + + parent->add_control( this ); + list = new GLUI_List(this, true, 1); + list->set_object_callback( GLUI_FileBrowser::dir_list_callback, this ); + list->set_click_type(GLUI_DOUBLE_CLICK); + this->fbreaddir(this->current_dir.c_str()); +} + +/****************************** GLUI_FileBrowser::draw() **********/ + +void GLUI_FileBrowser::dir_list_callback(GLUI_Control *glui_object) { + GLUI_List *list = glui_object->dynamicCastGLUI_List(); + if (!list) + return; + GLUI_FileBrowser* me = list->associated_object->dynamicCastGLUI_FileBrowser(); + if (!me) + return; + int this_item; + const char *selected; + this_item = list->get_current_item(); + if (this_item > 0) { /* file or directory selected */ + selected = list->get_item_ptr( this_item )->text.c_str(); + if (selected[0] == '/' || selected[0] == '\\') { + if (me->allow_change_dir) { +#ifdef __GNUC__ + chdir(selected+1); +#endif +#ifdef _WIN32 + SetCurrentDirectory(selected+1); +#endif + me->fbreaddir("."); + } + } else { + me->file = selected; + me->execute_callback(); + } + } +} + + + +void GLUI_FileBrowser::fbreaddir(const char *d) { + GLUI_String item; + int i = 0; + + if (!d) + return; + +#ifdef _WIN32 + + WIN32_FIND_DATA FN; + HANDLE hFind; + //char search_arg[MAX_PATH], new_file_path[MAX_PATH]; + //sprintf(search_arg, "%s\\*.*", path_name); + + hFind = FindFirstFile("*.*", &FN); + if (list) { + list->delete_all(); + if (hFind != INVALID_HANDLE_VALUE) { + do { + int len = int(strlen(FN.cFileName)); + if (FN.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + item = '\\'; + item += FN.cFileName; + } else { + item = FN.cFileName; + } + list->add_item(i,item.c_str()); + i++; + } while (FindNextFile(hFind, &FN) != 0); + + if (GetLastError() == ERROR_NO_MORE_FILES) + FindClose(&FN); + else + perror("fbreaddir"); + } + } + +#elif defined(__GNUC__) + + DIR *dir; + struct dirent *dirp; + struct stat dr; + + if (list) { + list->delete_all(); + if ((dir = opendir(d)) == NULL) + perror("fbreaddir:"); + else { + while ((dirp = readdir(dir)) != NULL) /* open directory */ + { + if (!lstat(dirp->d_name,&dr) && S_ISDIR(dr.st_mode)) /* dir is directory */ + item = dirp->d_name + GLUI_String("/"); + else + item = dirp->d_name; + + list->add_item(i,item.c_str()); + i++; + } + closedir(dir); + } + } +#endif +} + +void ProcessFiles(const char *path_name) +{ + +} + + +void GLUI_FileBrowser::set_w(int w) +{ + if (list) list->set_w(w); +} + +void GLUI_FileBrowser::set_h(int h) +{ + if (list) list->set_h(h); +} diff --git a/Extras/glui/glui_internal.h b/Extras/glui/glui_internal.h index 183d9364e..147b65c2b 100644 --- a/Extras/glui/glui_internal.h +++ b/Extras/glui/glui_internal.h @@ -1,107 +1,107 @@ -#ifndef GLUI_INTERNAL_H -#define GLUI_INTERNAL_H - -#include -#include - - - -#ifndef AND -#define AND && -#define OR || -#define NOT ! -#endif - -#ifndef MAX -#define MAX(a,b) ((a)>(b) ? (a) : (b)) -#define MIN(a,b) ((a)<(b) ? (a) : (b)) -#endif - -#ifndef ABS -#define ABS(a) ((a)>=0 ? (a) : (-(a))) -#endif - -/******************** bit comparisons and operations ***************/ -#ifndef TEST_BIT -#define TEST_BIT( x, b ) (((x) & (1<<(b))) != 0 ) -#define SET_BIT( x, b ) ((x) |= (1 << (b))) -#define CLEAR_BIT( x, b ) ((x) &= ~(1 << (b))) -#define TOGGLE_BIT( x, b ) ((TEST_BIT(x,b)) ?(CLEAR_BIT(x,b)):(SET_BIT(x,b))) -#endif - -#ifndef TEST_AND -#define TEST_AND( a, b ) ((a&b)==b) -#endif - - -#ifndef M_PI -#define M_PI 3.141592654 -#endif - -/*********** flush the stdout and stderr output streams *************/ -#ifndef flushout -#define flushout fflush(stdout) -#define flusherr fflush(stderr) -#endif - -/********** Debugging functions *************************************/ -#ifndef error_return -#define error_return( c ); {fprintf(stderr,c);return;} -#endif - -/************************* floating-point random ********************/ -#ifndef randf -#define randf() ((float) rand() / (float)RAND_MAX ) -#endif - -#ifndef SIGN -#define SIGN(x) ((x)>=0 ? 1 : -1) -#endif - -/****************** conversion between degrees and radians **********/ -#ifndef DEG2RAD -#define DEG2RAD(x) ((x)/180.0*M_PI) -#define RAD2DEG(x) ((x)/M_PI*180.0) -#endif - -/***************** clamp a value to some fixed interval *************/ -#ifndef CLAMP -#define CLAMP(x,lo,hi) {if ((x) < (lo)) {(x)=(lo);} else if((x) > (hi)) {(x)=(hi);}} -#endif - -/************ check if a value lies within a closed interval *********/ -#ifndef IN_BOUNDS -#define IN_BOUNDS( x, lo, hi ) ( (x) >= (lo) AND (x) <= (hi) ) -#endif - -/************ check if a 2D point lies within a 2D box ***************/ -#ifndef PT_IN_BOX -#define PT_IN_BOX( x, y, lo_x, hi_x, lo_y, hi_y ) \ -( IN_BOUNDS(x,lo_x,hi_x) AND IN_BOUNDS(y,lo_y,hi_y) ) -#endif - -/****** check if value lies on proper side of another value *****/ -/*** if side is positive => proper side is positive, else negative **/ -#ifndef CHECK_PROPER_SIDE -#define CHECK_PROPER_SIDE(x,val,side) ((side) > 0 ? (x) > (val) : (x) < (val)) -#endif - - -/***** Small value when we want to do a comparison to 'close to zero' *****/ -#ifndef FUDGE -#define FUDGE .00001 -#endif - - -/******************* swap two values, using a temp variable *********/ -#ifndef SWAP2 -#define SWAP2(a,b,t) {t=a;a=b;b=t;} -#endif - -#define VEC3_TO_ARRAY(v,a) a[0]=v[0], a[1]=v[1], a[2]=v[2] - -/**** Return the ASCII control code given the non-control ASCII character */ -#define CTRL(c) ( (c>=('a'-1)) ? (c-'a'+1) : (c-'A'+1) ) - - -#endif /* GLUI_INTERNAL_H */ +#ifndef GLUI_INTERNAL_H +#define GLUI_INTERNAL_H + +#include +#include + + + +#ifndef AND +#define AND && +#define OR || +#define NOT ! +#endif + +#ifndef MAX +#define MAX(a,b) ((a)>(b) ? (a) : (b)) +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#endif + +#ifndef ABS +#define ABS(a) ((a)>=0 ? (a) : (-(a))) +#endif + +/******************** bit comparisons and operations ***************/ +#ifndef TEST_BIT +#define TEST_BIT( x, b ) (((x) & (1<<(b))) != 0 ) +#define SET_BIT( x, b ) ((x) |= (1 << (b))) +#define CLEAR_BIT( x, b ) ((x) &= ~(1 << (b))) +#define TOGGLE_BIT( x, b ) ((TEST_BIT(x,b)) ?(CLEAR_BIT(x,b)):(SET_BIT(x,b))) +#endif + +#ifndef TEST_AND +#define TEST_AND( a, b ) ((a&b)==b) +#endif + + +#ifndef M_PI +#define M_PI 3.141592654 +#endif + +/*********** flush the stdout and stderr output streams *************/ +#ifndef flushout +#define flushout fflush(stdout) +#define flusherr fflush(stderr) +#endif + +/********** Debugging functions *************************************/ +#ifndef error_return +#define error_return( c ); {fprintf(stderr,c);return;} +#endif + +/************************* floating-point random ********************/ +#ifndef randf +#define randf() ((float) rand() / (float)RAND_MAX ) +#endif + +#ifndef SIGN +#define SIGN(x) ((x)>=0 ? 1 : -1) +#endif + +/****************** conversion between degrees and radians **********/ +#ifndef DEG2RAD +#define DEG2RAD(x) ((x)/180.0*M_PI) +#define RAD2DEG(x) ((x)/M_PI*180.0) +#endif + +/***************** clamp a value to some fixed interval *************/ +#ifndef CLAMP +#define CLAMP(x,lo,hi) {if ((x) < (lo)) {(x)=(lo);} else if((x) > (hi)) {(x)=(hi);}} +#endif + +/************ check if a value lies within a closed interval *********/ +#ifndef IN_BOUNDS +#define IN_BOUNDS( x, lo, hi ) ( (x) >= (lo) AND (x) <= (hi) ) +#endif + +/************ check if a 2D point lies within a 2D box ***************/ +#ifndef PT_IN_BOX +#define PT_IN_BOX( x, y, lo_x, hi_x, lo_y, hi_y ) \ +( IN_BOUNDS(x,lo_x,hi_x) AND IN_BOUNDS(y,lo_y,hi_y) ) +#endif + +/****** check if value lies on proper side of another value *****/ +/*** if side is positive => proper side is positive, else negative **/ +#ifndef CHECK_PROPER_SIDE +#define CHECK_PROPER_SIDE(x,val,side) ((side) > 0 ? (x) > (val) : (x) < (val)) +#endif + + +/***** Small value when we want to do a comparison to 'close to zero' *****/ +#ifndef FUDGE +#define FUDGE .00001 +#endif + + +/******************* swap two values, using a temp variable *********/ +#ifndef SWAP2 +#define SWAP2(a,b,t) {t=a;a=b;b=t;} +#endif + +#define VEC3_TO_ARRAY(v,a) a[0]=v[0], a[1]=v[1], a[2]=v[2] + +/**** Return the ASCII control code given the non-control ASCII character */ +#define CTRL(c) ( (c>=('a'-1)) ? (c-'a'+1) : (c-'A'+1) ) + + +#endif /* GLUI_INTERNAL_H */ diff --git a/Extras/glui/glui_internal_control.h b/Extras/glui/glui_internal_control.h index e6f973556..7e363aab1 100644 --- a/Extras/glui/glui_internal_control.h +++ b/Extras/glui/glui_internal_control.h @@ -1,45 +1,45 @@ -/* - Header file for use by GLUI controls. - Everything you need is right here. - - -*/ -#ifndef __GLUI_INTERNAL_CONTROL_H -#define __GLUI_INTERNAL_CONTROL_H - -/* This is the main GLUI external header */ -#include "GL/glui.h" - -/* Here's some utility routines */ -#include "glui_internal.h" - - -/** - A GLUI_Control-drawing sentinal object. - On creation, saves the current draw buffer and window. - On destruction, restores draw buffer and window. - This is way nicer than calling save/restore manually. -*/ -class GLUI_DrawingSentinal { - int orig_buf, orig_win; - GLUI_Control *c; -public: - /** The constructor sets up the drawing system */ - GLUI_DrawingSentinal(GLUI_Control *c_); - /** The destructor cleans up drawing back how it was */ - ~GLUI_DrawingSentinal(); - - // Do-nothing routine to avoid compiler warning about unused variable - inline void avoid_warning(void) {} -}; -/** Just drop a GLUI_DRAWINGSENTINAL_IDIOM at the start of your draw methods, -and they'll return if we can't be drawn, and -automatically save and restore all needed state. -*/ -#define GLUI_DRAWINGSENTINAL_IDIOM if (NOT can_draw()) return; GLUI_DrawingSentinal drawSentinal(this); drawSentinal.avoid_warning(); - - -/** Return the time, in seconds. */ -inline double GLUI_Time(void) {return 0.001*glutGet(GLUT_ELAPSED_TIME);} - -#endif +/* + Header file for use by GLUI controls. + Everything you need is right here. + + +*/ +#ifndef __GLUI_INTERNAL_CONTROL_H +#define __GLUI_INTERNAL_CONTROL_H + +/* This is the main GLUI external header */ +#include "GL/glui.h" + +/* Here's some utility routines */ +#include "glui_internal.h" + + +/** + A GLUI_Control-drawing sentinal object. + On creation, saves the current draw buffer and window. + On destruction, restores draw buffer and window. + This is way nicer than calling save/restore manually. +*/ +class GLUI_DrawingSentinal { + int orig_buf, orig_win; + GLUI_Control *c; +public: + /** The constructor sets up the drawing system */ + GLUI_DrawingSentinal(GLUI_Control *c_); + /** The destructor cleans up drawing back how it was */ + ~GLUI_DrawingSentinal(); + + // Do-nothing routine to avoid compiler warning about unused variable + inline void avoid_warning(void) {} +}; +/** Just drop a GLUI_DRAWINGSENTINAL_IDIOM at the start of your draw methods, +and they'll return if we can't be drawn, and +automatically save and restore all needed state. +*/ +#define GLUI_DRAWINGSENTINAL_IDIOM if (NOT can_draw()) return; GLUI_DrawingSentinal drawSentinal(this); drawSentinal.avoid_warning(); + + +/** Return the time, in seconds. */ +inline double GLUI_Time(void) {return 0.001*glutGet(GLUT_ELAPSED_TIME);} + +#endif diff --git a/Extras/glui/glui_list.cpp b/Extras/glui/glui_list.cpp index 2b61152ed..f0ffd475e 100644 --- a/Extras/glui/glui_list.cpp +++ b/Extras/glui/glui_list.cpp @@ -1,542 +1,542 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_list.cpp - GLUI_List control class - - - -------------------------------------------------- - - Copyright (c) 2004 John Kew - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - - - -#include "glui_internal_control.h" -#include -#include - -/****************************** GLUI_List::GLUI_List() **********/ - -GLUI_List::GLUI_List( GLUI_Node *parent, bool scroll, - int id, GLUI_CB callback - /*,GLUI_Control *object - GLUI_InterObject_CB obj_cb*/) -{ - common_construct(parent, NULL, scroll, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_List::GLUI_List() **********/ - -GLUI_List::GLUI_List( GLUI_Node *parent, - GLUI_String& live_var, bool scroll, - int id, - GLUI_CB callback - /* ,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ ) -{ - common_construct(parent, &live_var, scroll, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_List::common_construct() **********/ - -void GLUI_List::common_construct( - GLUI_Node *parent, - GLUI_String* data, bool scroll, - int id, - GLUI_CB callback - /*,GLUI_Control *object - , GLUI_InterObject_CB obj_cb*/) -{ - common_init(); - GLUI_Node *list_panel = parent; - - if (scroll) { - GLUI_Panel *p = new GLUI_Panel(parent,"",GLUI_PANEL_NONE); - p->x_off = 1; - list_panel = p; - } - this->ptr_val = data; - if (data) { - this->live_type = GLUI_LIVE_STRING; - } - this->user_id = id; - this->callback = callback; - this->name = "list"; - list_panel->add_control( this ); - if (scroll) - { - new GLUI_Column(list_panel, false); - scrollbar = - new GLUI_Scrollbar(list_panel, - "scrollbar", - GLUI_SCROLL_VERTICAL, - GLUI_SCROLL_INT); - scrollbar->set_object_callback(GLUI_List::scrollbar_callback, this); - scrollbar->set_alignment(GLUI_ALIGN_LEFT); - // scrollbar->can_activate = false; //kills ability to mouse drag too - } - init_live(); -} - -/****************************** GLUI_List::mouse_down_handler() **********/ -int GLUI_List::mouse_down_handler( int local_x, int local_y ) -{ - int tmp_line; - unsigned long int ms; - timeb time; - ftime(&time); - ms = time.millitm + (time.time)*1000; - - tmp_line = find_line( local_x-x_abs, local_y-y_abs-5 ); - if ( tmp_line == -1 ) { - if ( glui ) - glui->deactivate_current_control( ); - return false; - } - - if (tmp_line < num_lines) { - curr_line = tmp_line; - if (scrollbar) - scrollbar->set_int_val(curr_line); - this->execute_callback(); - if (associated_object != NULL) - if (cb_click_type == GLUI_SINGLE_CLICK) { - if (obj_cb) { - // obj_cb(associated_object, user_id); - obj_cb(this); - } - } else { - if (last_line == curr_line && (ms - last_click_time) < 300) { - //obj_cb(associated_object, user_id); - obj_cb(this); - } else { - last_click_time = ms; - last_line = curr_line; - } - } - if ( can_draw()) - update_and_draw_text(); - } - - return true; -} - - - - -/******************************** GLUI_List::mouse_up_handler() **********/ - -int GLUI_List::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - return false; -} - - -/***************************** GLUI_List::mouse_held_down_handler() ******/ - -int GLUI_List::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - return false; -} - - -/****************************** GLUI_List::key_handler() **********/ - -int GLUI_List::key_handler( unsigned char key,int modifiers ) -{ - - - draw_text_only = false; /** Well, hack is not yet working **/ - update_and_draw_text(); - draw_text_only = false; - - return true; -} - - -/****************************** GLUI_List::activate() **********/ - -void GLUI_List::activate( int how ) -{ -// if ( debug ) -// dump( stdout, "-> ACTIVATE" ); - active = true; - - if ( how == GLUI_ACTIVATE_MOUSE ) - return; /* Don't select everything if activated with mouse */ - -} - - -/****************************** GLUI_List::deactivate() **********/ - -void GLUI_List::deactivate( void ) -{ - active = false; - redraw(); -} - -/****************************** GLUI_List::draw() **********/ - -void GLUI_List::draw( int x, int y ) -{ - int line = 0; - int box_width; - GLUI_List_Item *item; - - GLUI_DRAWINGSENTINAL_IDIOM - - /* Bevelled Border */ - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( 0, 0 ); glVertex2i( 0, h ); - - glColor3f( 1., 1., 1. ); - glVertex2i( 0, h ); glVertex2i( w, h ); - glVertex2i( w, h ); glVertex2i( w, 0 ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( 1, 1 ); glVertex2i( 1, h-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); - glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); - glEnd(); - - /* Draw Background if enabled*/ - if (enabled) { - glColor3f( 1., 1., 1. ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } else { - glColor3f( .8, .8, .8 ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } - - /* Figure out how wide the box is */ - box_width = get_box_width(); - - /* Figure out which lines are visible*/ - - visible_lines = (int)(h-20)/15; - - item = (GLUI_List_Item *) items_list.first_child(); - - line = 0; - while (item) { - if (line < start_line) { - line++; - item = (GLUI_List_Item *) item->next(); - continue; - } - if (line >= start_line && line <= (start_line+visible_lines)) { - if (curr_line == line) - draw_text(item->text.c_str(),1,0,(line - start_line)*15); - else - draw_text(item->text.c_str(),0,0,(line - start_line)*15); - } - line++; - item = (GLUI_List_Item *) item->next(); - } - - if (scrollbar) { - scrollbar->set_int_limits(MAX(0,num_lines-visible_lines), 0); - glPushMatrix(); - glTranslatef(scrollbar->x_abs-x_abs, scrollbar->y_abs-y_abs,0.0); - scrollbar->draw_scroll(); - glPopMatrix(); - } -} - -/********************************* GLUI_List::draw_text() ****************/ - -void GLUI_List::draw_text(const char *t, int selected, int x, int y ) -{ - int text_x, i, x_pos; - int box_width; - - GLUI_DRAWINGSENTINAL_IDIOM - - /** Find where to draw the text **/ - - text_x = 2 + GLUI_LIST_BOXINNERMARGINX; - - /** Draw selection area dark **/ - if ( enabled && selected ) { - glColor3f( 0.0f, 0.0f, .6f ); - glBegin( GL_QUADS ); - glVertex2i(text_x, y+5 ); glVertex2i( w-text_x, y+5 ); - glVertex2i(w-text_x, y+19 ); glVertex2i(text_x, y+19 ); - glEnd(); - } - box_width = get_box_width(); - - if ( !selected || !enabled ) { /* No current selection */ - x_pos = text_x; /* or control disabled */ - if ( enabled ) - glColor3b( 0, 0, 0 ); - else - glColor3b( 32, 32, 32 ); - - glRasterPos2i( text_x, y+15); - i = 0; - while( t[i] != '\0' && substring_width(t,0,i) < box_width) { - glutBitmapCharacter( get_font(), t[i] ); - x_pos += char_width( t[i] ); - i++; - } - } - else { /* There is a selection */ - i = 0; - x_pos = text_x; - glColor3f( 1., 1., 1. ); - glRasterPos2i( text_x, y+15); - while( t[i] != '\0' && substring_width(t,0,i) < box_width) { - glutBitmapCharacter( get_font(), t[i] ); - x_pos += char_width( t[i] ); - i++; - } - } -} - - -int GLUI_List::find_line(int x, int y) { - return start_line + ((int)(y/15)); -} - -int GLUI_List::get_box_width() { - return MAX( this->w - - 6 /* 2 * the two-line box border */ - - 2 * GLUI_LIST_BOXINNERMARGINX, 0 ); - -} - -/******************************** GLUI_List::substring_width() *********/ -int GLUI_List::substring_width( const char *t, int start, int end ) -{ - int i, width; - - width = 0; - - for( i=start; i<=end; i++ ) - width += char_width( t[i] ); - - return width; -} - - -/***************************** GLUI_List::update_and_draw_text() ********/ - -void GLUI_List::update_and_draw_text( void ) -{ - if ( NOT can_draw() ) - return; - - //update_substring_bounds(); - /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ - - redraw(); -} - - -/********************************* GLUI_List::special_handler() **********/ - -int GLUI_List::special_handler( int key,int modifiers ) -{ - if ( NOT glui ) - return false; - - if ( key == GLUT_KEY_DOWN ) { - if (curr_line < num_lines) { - curr_line++; - if (curr_line > start_line+visible_lines) - start_line++; - } - } else if ( key == GLUT_KEY_UP ) { - if (curr_line > 0) { - curr_line--; - if (curr_line < start_line) - start_line--; - } - } - - if (scrollbar) - scrollbar->set_int_val(curr_line); - redraw(); - return true; -} - - -/************************************ GLUI_List::update_size() **********/ - -void GLUI_List::update_size( void ) -{ - if ( NOT glui ) - return; - - if ( w < GLUI_LIST_MIN_TEXT_WIDTH ) - w = GLUI_LIST_MIN_TEXT_WIDTH; -} - -/**************************************** GLUI_Listbox::add_item() **********/ - -int GLUI_List::add_item( int id, const char *new_text ) -{ - GLUI_List_Item *new_node = new GLUI_List_Item; - GLUI_List_Item *head; - - new_node->text = new_text; - new_node->id = id; - - head = (GLUI_List_Item*) items_list.first_child(); - new_node->link_this_to_parent_last( &items_list ); - - if ( head == NULL ) { - /*** This is first item added ***/ - - int_val = id+1; /** Different than id **/ - // do_selection( id ); - last_live_int = id; - - if( glui ) - glui->post_update_main_gfx(); - } - num_lines++; - if (scrollbar) - scrollbar->set_int_limits(MAX(num_lines-visible_lines,0), 0); - - return true; -} - -/************************************** GLUI_Listbox::delete_() **********/ - -int GLUI_List::delete_all() -{ - GLUI_List_Item *item; - - item = (GLUI_List_Item *) items_list.first_child(); - while( item ) { - item->unlink(); - delete item; - item = (GLUI_List_Item *) items_list.first_child(); - } - - num_lines = 0; - curr_line = 0; - - return true; -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_List::delete_item( const char *text ) -{ - GLUI_List_Item *node = get_item_ptr( text ); - - if ( node ) { - node->unlink(); - delete node; - num_lines--; - return true; - } - else { - return false; - } -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_List::delete_item( int id ) -{ - GLUI_List_Item *node = get_item_ptr( id ); - - if ( node ) { - node->unlink(); - delete node; - num_lines--; - return true; - } - else { - return false; - } -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_List_Item *GLUI_List::get_item_ptr( const char *text ) -{ - GLUI_List_Item *item; - - item = (GLUI_List_Item *) items_list.first_child(); - while( item ) { - if ( item->text == text ) - return item; - - item = (GLUI_List_Item *) item->next(); - } - - return NULL; -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_List_Item *GLUI_List::get_item_ptr( int id ) -{ - GLUI_List_Item *item; - - item = (GLUI_List_Item *) items_list.first_child(); - while( item ) { - if ( item->id == id ) - return item; - - item = (GLUI_List_Item *) item->next(); - } - - return NULL; -} - -/**************************************** GLUI_List::mouse_over() ********/ - -int GLUI_List::mouse_over( int state, int x, int y ) -{ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - - return true; -} - -void GLUI_List::scrollbar_callback(GLUI_Control *my_scrollbar) { - GLUI_Scrollbar *sb = my_scrollbar->dynamicCastGLUI_Scrollbar(); - if (!sb) return; - GLUI_List* me = (GLUI_List*) sb->associated_object; - if (me->scrollbar == NULL) - return; - int new_start_line = sb->get_int_val(); // TODO!! - me->start_line = new_start_line; - - if ( me->can_draw() ) - me->update_and_draw_text(); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_list.cpp - GLUI_List control class + + + -------------------------------------------------- + + Copyright (c) 2004 John Kew + + This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. + +*****************************************************************************/ + + + +#include "glui_internal_control.h" +#include +#include + +/****************************** GLUI_List::GLUI_List() **********/ + +GLUI_List::GLUI_List( GLUI_Node *parent, bool scroll, + int id, GLUI_CB callback + /*,GLUI_Control *object + GLUI_InterObject_CB obj_cb*/) +{ + common_construct(parent, NULL, scroll, id, callback/*, object, obj_cb*/); +} + +/****************************** GLUI_List::GLUI_List() **********/ + +GLUI_List::GLUI_List( GLUI_Node *parent, + GLUI_String& live_var, bool scroll, + int id, + GLUI_CB callback + /* ,GLUI_Control *object + ,GLUI_InterObject_CB obj_cb*/ ) +{ + common_construct(parent, &live_var, scroll, id, callback/*, object, obj_cb*/); +} + +/****************************** GLUI_List::common_construct() **********/ + +void GLUI_List::common_construct( + GLUI_Node *parent, + GLUI_String* data, bool scroll, + int id, + GLUI_CB callback + /*,GLUI_Control *object + , GLUI_InterObject_CB obj_cb*/) +{ + common_init(); + GLUI_Node *list_panel = parent; + + if (scroll) { + GLUI_Panel *p = new GLUI_Panel(parent,"",GLUI_PANEL_NONE); + p->x_off = 1; + list_panel = p; + } + this->ptr_val = data; + if (data) { + this->live_type = GLUI_LIVE_STRING; + } + this->user_id = id; + this->callback = callback; + this->name = "list"; + list_panel->add_control( this ); + if (scroll) + { + new GLUI_Column(list_panel, false); + scrollbar = + new GLUI_Scrollbar(list_panel, + "scrollbar", + GLUI_SCROLL_VERTICAL, + GLUI_SCROLL_INT); + scrollbar->set_object_callback(GLUI_List::scrollbar_callback, this); + scrollbar->set_alignment(GLUI_ALIGN_LEFT); + // scrollbar->can_activate = false; //kills ability to mouse drag too + } + init_live(); +} + +/****************************** GLUI_List::mouse_down_handler() **********/ +int GLUI_List::mouse_down_handler( int local_x, int local_y ) +{ + int tmp_line; + unsigned long int ms; + timeb time; + ftime(&time); + ms = time.millitm + (time.time)*1000; + + tmp_line = find_line( local_x-x_abs, local_y-y_abs-5 ); + if ( tmp_line == -1 ) { + if ( glui ) + glui->deactivate_current_control( ); + return false; + } + + if (tmp_line < num_lines) { + curr_line = tmp_line; + if (scrollbar) + scrollbar->set_int_val(curr_line); + this->execute_callback(); + if (associated_object != NULL) + if (cb_click_type == GLUI_SINGLE_CLICK) { + if (obj_cb) { + // obj_cb(associated_object, user_id); + obj_cb(this); + } + } else { + if (last_line == curr_line && (ms - last_click_time) < 300) { + //obj_cb(associated_object, user_id); + obj_cb(this); + } else { + last_click_time = ms; + last_line = curr_line; + } + } + if ( can_draw()) + update_and_draw_text(); + } + + return true; +} + + + + +/******************************** GLUI_List::mouse_up_handler() **********/ + +int GLUI_List::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + return false; +} + + +/***************************** GLUI_List::mouse_held_down_handler() ******/ + +int GLUI_List::mouse_held_down_handler( int local_x, int local_y, + bool new_inside) +{ + return false; +} + + +/****************************** GLUI_List::key_handler() **********/ + +int GLUI_List::key_handler( unsigned char key,int modifiers ) +{ + + + draw_text_only = false; /** Well, hack is not yet working **/ + update_and_draw_text(); + draw_text_only = false; + + return true; +} + + +/****************************** GLUI_List::activate() **********/ + +void GLUI_List::activate( int how ) +{ +// if ( debug ) +// dump( stdout, "-> ACTIVATE" ); + active = true; + + if ( how == GLUI_ACTIVATE_MOUSE ) + return; /* Don't select everything if activated with mouse */ + +} + + +/****************************** GLUI_List::deactivate() **********/ + +void GLUI_List::deactivate( void ) +{ + active = false; + redraw(); +} + +/****************************** GLUI_List::draw() **********/ + +void GLUI_List::draw( int x, int y ) +{ + int line = 0; + int box_width; + GLUI_List_Item *item; + + GLUI_DRAWINGSENTINAL_IDIOM + + /* Bevelled Border */ + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( 0, 0 ); glVertex2i( w, 0 ); + glVertex2i( 0, 0 ); glVertex2i( 0, h ); + + glColor3f( 1., 1., 1. ); + glVertex2i( 0, h ); glVertex2i( w, h ); + glVertex2i( w, h ); glVertex2i( w, 0 ); + + if ( enabled ) + glColor3f( 0., 0., 0. ); + else + glColor3f( .25, .25, .25 ); + glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); + glVertex2i( 1, 1 ); glVertex2i( 1, h-1 ); + + glColor3f( .75, .75, .75 ); + glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); + glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); + glEnd(); + + /* Draw Background if enabled*/ + if (enabled) { + glColor3f( 1., 1., 1. ); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); + glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); + glEnd(); + } else { + glColor3f( .8, .8, .8 ); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); + glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); + glEnd(); + } + + /* Figure out how wide the box is */ + box_width = get_box_width(); + + /* Figure out which lines are visible*/ + + visible_lines = (int)(h-20)/15; + + item = (GLUI_List_Item *) items_list.first_child(); + + line = 0; + while (item) { + if (line < start_line) { + line++; + item = (GLUI_List_Item *) item->next(); + continue; + } + if (line >= start_line && line <= (start_line+visible_lines)) { + if (curr_line == line) + draw_text(item->text.c_str(),1,0,(line - start_line)*15); + else + draw_text(item->text.c_str(),0,0,(line - start_line)*15); + } + line++; + item = (GLUI_List_Item *) item->next(); + } + + if (scrollbar) { + scrollbar->set_int_limits(MAX(0,num_lines-visible_lines), 0); + glPushMatrix(); + glTranslatef(scrollbar->x_abs-x_abs, scrollbar->y_abs-y_abs,0.0); + scrollbar->draw_scroll(); + glPopMatrix(); + } +} + +/********************************* GLUI_List::draw_text() ****************/ + +void GLUI_List::draw_text(const char *t, int selected, int x, int y ) +{ + int text_x, i, x_pos; + int box_width; + + GLUI_DRAWINGSENTINAL_IDIOM + + /** Find where to draw the text **/ + + text_x = 2 + GLUI_LIST_BOXINNERMARGINX; + + /** Draw selection area dark **/ + if ( enabled && selected ) { + glColor3f( 0.0f, 0.0f, .6f ); + glBegin( GL_QUADS ); + glVertex2i(text_x, y+5 ); glVertex2i( w-text_x, y+5 ); + glVertex2i(w-text_x, y+19 ); glVertex2i(text_x, y+19 ); + glEnd(); + } + box_width = get_box_width(); + + if ( !selected || !enabled ) { /* No current selection */ + x_pos = text_x; /* or control disabled */ + if ( enabled ) + glColor3b( 0, 0, 0 ); + else + glColor3b( 32, 32, 32 ); + + glRasterPos2i( text_x, y+15); + i = 0; + while( t[i] != '\0' && substring_width(t,0,i) < box_width) { + glutBitmapCharacter( get_font(), t[i] ); + x_pos += char_width( t[i] ); + i++; + } + } + else { /* There is a selection */ + i = 0; + x_pos = text_x; + glColor3f( 1., 1., 1. ); + glRasterPos2i( text_x, y+15); + while( t[i] != '\0' && substring_width(t,0,i) < box_width) { + glutBitmapCharacter( get_font(), t[i] ); + x_pos += char_width( t[i] ); + i++; + } + } +} + + +int GLUI_List::find_line(int x, int y) { + return start_line + ((int)(y/15)); +} + +int GLUI_List::get_box_width() { + return MAX( this->w + - 6 /* 2 * the two-line box border */ + - 2 * GLUI_LIST_BOXINNERMARGINX, 0 ); + +} + +/******************************** GLUI_List::substring_width() *********/ +int GLUI_List::substring_width( const char *t, int start, int end ) +{ + int i, width; + + width = 0; + + for( i=start; i<=end; i++ ) + width += char_width( t[i] ); + + return width; +} + + +/***************************** GLUI_List::update_and_draw_text() ********/ + +void GLUI_List::update_and_draw_text( void ) +{ + if ( NOT can_draw() ) + return; + + //update_substring_bounds(); + /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ + + redraw(); +} + + +/********************************* GLUI_List::special_handler() **********/ + +int GLUI_List::special_handler( int key,int modifiers ) +{ + if ( NOT glui ) + return false; + + if ( key == GLUT_KEY_DOWN ) { + if (curr_line < num_lines) { + curr_line++; + if (curr_line > start_line+visible_lines) + start_line++; + } + } else if ( key == GLUT_KEY_UP ) { + if (curr_line > 0) { + curr_line--; + if (curr_line < start_line) + start_line--; + } + } + + if (scrollbar) + scrollbar->set_int_val(curr_line); + redraw(); + return true; +} + + +/************************************ GLUI_List::update_size() **********/ + +void GLUI_List::update_size( void ) +{ + if ( NOT glui ) + return; + + if ( w < GLUI_LIST_MIN_TEXT_WIDTH ) + w = GLUI_LIST_MIN_TEXT_WIDTH; +} + +/**************************************** GLUI_Listbox::add_item() **********/ + +int GLUI_List::add_item( int id, const char *new_text ) +{ + GLUI_List_Item *new_node = new GLUI_List_Item; + GLUI_List_Item *head; + + new_node->text = new_text; + new_node->id = id; + + head = (GLUI_List_Item*) items_list.first_child(); + new_node->link_this_to_parent_last( &items_list ); + + if ( head == NULL ) { + /*** This is first item added ***/ + + int_val = id+1; /** Different than id **/ + // do_selection( id ); + last_live_int = id; + + if( glui ) + glui->post_update_main_gfx(); + } + num_lines++; + if (scrollbar) + scrollbar->set_int_limits(MAX(num_lines-visible_lines,0), 0); + + return true; +} + +/************************************** GLUI_Listbox::delete_() **********/ + +int GLUI_List::delete_all() +{ + GLUI_List_Item *item; + + item = (GLUI_List_Item *) items_list.first_child(); + while( item ) { + item->unlink(); + delete item; + item = (GLUI_List_Item *) items_list.first_child(); + } + + num_lines = 0; + curr_line = 0; + + return true; +} + + +/************************************** GLUI_Listbox::delete_item() **********/ + +int GLUI_List::delete_item( const char *text ) +{ + GLUI_List_Item *node = get_item_ptr( text ); + + if ( node ) { + node->unlink(); + delete node; + num_lines--; + return true; + } + else { + return false; + } +} + + +/************************************** GLUI_Listbox::delete_item() **********/ + +int GLUI_List::delete_item( int id ) +{ + GLUI_List_Item *node = get_item_ptr( id ); + + if ( node ) { + node->unlink(); + delete node; + num_lines--; + return true; + } + else { + return false; + } +} + + +/************************************ GLUI_Listbox::get_item_ptr() **********/ + +GLUI_List_Item *GLUI_List::get_item_ptr( const char *text ) +{ + GLUI_List_Item *item; + + item = (GLUI_List_Item *) items_list.first_child(); + while( item ) { + if ( item->text == text ) + return item; + + item = (GLUI_List_Item *) item->next(); + } + + return NULL; +} + + +/************************************ GLUI_Listbox::get_item_ptr() **********/ + +GLUI_List_Item *GLUI_List::get_item_ptr( int id ) +{ + GLUI_List_Item *item; + + item = (GLUI_List_Item *) items_list.first_child(); + while( item ) { + if ( item->id == id ) + return item; + + item = (GLUI_List_Item *) item->next(); + } + + return NULL; +} + +/**************************************** GLUI_List::mouse_over() ********/ + +int GLUI_List::mouse_over( int state, int x, int y ) +{ + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); + + return true; +} + +void GLUI_List::scrollbar_callback(GLUI_Control *my_scrollbar) { + GLUI_Scrollbar *sb = my_scrollbar->dynamicCastGLUI_Scrollbar(); + if (!sb) return; + GLUI_List* me = (GLUI_List*) sb->associated_object; + if (me->scrollbar == NULL) + return; + int new_start_line = sb->get_int_val(); // TODO!! + me->start_line = new_start_line; + + if ( me->can_draw() ) + me->update_and_draw_text(); +} diff --git a/Extras/glui/glui_listbox.cpp b/Extras/glui/glui_listbox.cpp index 5de81c9e8..1bf12762a 100644 --- a/Extras/glui/glui_listbox.cpp +++ b/Extras/glui/glui_listbox.cpp @@ -1,448 +1,448 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_listbox - GLUI_ListBox control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_Listbox::GLUI_Listbox() **********/ -GLUI_Listbox::GLUI_Listbox( GLUI_Node *parent, - const char *name, int *value_ptr, - int id, - GLUI_CB cb) -{ - common_init(); - set_ptr_val( value_ptr ); - user_id = id; - set_name( name ); - callback = cb; - - parent->add_control( this ); - - init_live(); -} - - -/****************************** GLUI_Listbox::mouse_down_handler() **********/ - -int GLUI_Listbox::mouse_down_handler( int local_x, int local_y ) -{ - return false; -} - - -/****************************** GLUI_Listbox::mouse_up_handler() **********/ - -int GLUI_Listbox::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - - return false; -} - - -/****************************** GLUI_Listbox::mouse_held_down_handler() ******/ - -int GLUI_Listbox::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - - return false; -} - - -/****************************** GLUI_Listbox::key_handler() **********/ - -int GLUI_Listbox::key_handler( unsigned char key,int modifiers ) -{ - return false; -} - - -/****************************** GLUI_Listbox::draw() **********/ - -void GLUI_Listbox::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int name_x; - - /* draw_active_area(); */ - - name_x = MAX(text_x_offset - string_width(this->name) - 3,0); - draw_name( name_x , 13); - draw_box_inwards_outline( text_x_offset, w, - 0, h ); - - if ( NOT active ) { - draw_box( text_x_offset+3, w-2, 2, h-2, 1.0, 1.0, 1.0 ); - if ( NOT enabled ) - glColor3b( 32, 32, 32 ); - else - glColor3f( 0.0, 0.0, 0.0 ); - glRasterPos2i( text_x_offset+5, 13 ); - draw_string( curr_text ); - } - else { - draw_box( text_x_offset+3, w-2, 2, h-2, .0, .0, .6 ); - glColor3f( 1.0, 1.0, 1.0 ); - glRasterPos2i( text_x_offset+5, 13 ); - draw_string( curr_text ); - } - - - if ( enabled ) { - glui->std_bitmaps. - draw(GLUI_STDBITMAP_LISTBOX_UP, - w-glui->std_bitmaps.width(GLUI_STDBITMAP_LISTBOX_UP)-1, - 2 ); - } - else { - glui->std_bitmaps. - draw(GLUI_STDBITMAP_LISTBOX_UP_DIS, - w-glui->std_bitmaps.width(GLUI_STDBITMAP_LISTBOX_UP)-1, - 2 ); - } -} - - -/************************************ GLUI_Listbox::update_si() **********/ -void GLUI_Listbox::update_size( void ) -{ - recalculate_item_width(); -} - -/********************************* GLUI_Listbox::set_int_val() **************/ - -void GLUI_Listbox::set_int_val( int new_val ) -{ - /* int_val = new_val; */ - - do_selection( new_val ); - - /*** Update the variable we're (possibly) pointing to, and update the main gfx ***/ - output_live(true); -} - -/**************************************** GLUI_Listbox::add_item() **********/ - -int GLUI_Listbox::add_item( int id, const char *new_text ) -{ - GLUI_Listbox_Item *new_node = new GLUI_Listbox_Item; - GLUI_Listbox_Item *head; - - new_node->text = new_text; - new_node->id = id; - - head = (GLUI_Listbox_Item*) items_list.first_child(); - new_node->link_this_to_parent_last( &items_list ); - - if ( head == NULL ) { - /*** This is first item added ***/ - - int_val = id+1; /** Different than id **/ - do_selection( id ); - last_live_int = id; - - if( glui ) - glui->post_update_main_gfx(); - } - if (recalculate_item_width()) glui->refresh(); - - return true; -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_Listbox::delete_item( const char *text ) -{ - GLUI_Listbox_Item *node = get_item_ptr(text); - - if (node) - { - node->unlink(); - delete node; - return true; - } - if (recalculate_item_width()) glui->refresh(); - - return false; -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_Listbox::delete_item(int id) -{ - GLUI_Listbox_Item *node = get_item_ptr(id); - - if (node) - { - node->unlink(); - delete node; - return true; - } - if (recalculate_item_width()) glui->refresh(); - - return false; -} - - -/************************************** GLUI_Listbox::sort_items() **********/ - -int GLUI_Listbox::sort_items( void ) -{ - return false; -} - - -/********************************************* GLUI_Listbox::dump() **********/ - -void GLUI_Listbox::dump( FILE *output ) -{ - GLUI_Listbox_Item *item; - - /* printf( "%p\n", (char*) name ); */ - - fprintf( output, "Listbox: %s\n", name.c_str() ); - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - fprintf( output, " %3d : %s\n", item->id, item->text.c_str() ); - - item = (GLUI_Listbox_Item *) item->next(); - } -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_Listbox_Item *GLUI_Listbox::get_item_ptr( const char *text ) -{ - GLUI_Listbox_Item *item; - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - if ( item->text == text ) - return item; - - item = (GLUI_Listbox_Item *) item->next(); - } - - return NULL; -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_Listbox_Item *GLUI_Listbox::get_item_ptr( int id ) -{ - GLUI_Listbox_Item *item; - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - if ( item->id == id ) - return item; - - item = (GLUI_Listbox_Item *) item->next(); - } - - return NULL; -} - - -/************************************ GLUI_Listbox::mouse_over() **********/ - -static void listbox_callback( int i ) -{ - int old_val; - - if ( NOT GLUI_Master.curr_left_button_glut_menu OR - !GLUI_Master.curr_left_button_glut_menu->dynamicCastGLUI_Listbox() ) - return; - - old_val = ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->int_val; - ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->set_int_val(i); - - /**** If value changed, execute callback ****/ - if ( old_val != - ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->int_val ) { - ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->execute_callback(); - } -} - - -/*************************************** GLUI_Listbox::mouse_over() **********/ - -int GLUI_Listbox::mouse_over( int state, int x, int y ) -{ - GLUI_Listbox_Item *item; - - /* printf( "x/y: %d/%d\n", x, y ); */ - - if ( state AND enabled AND x > x_abs + text_x_offset) { - /**** Build a GLUT menu for this listbox ***/ - - /* printf( "%d %d\n", x, y ); */ - - glut_menu_id = glutCreateMenu(listbox_callback); - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - glutAddMenuEntry( item->text.c_str(), item->id ); - item = (GLUI_Listbox_Item *) item->next(); - } - - glutAttachMenu( GLUT_LEFT_BUTTON); - - GLUI_Master.set_left_button_glut_menu_control( this ); - } - else if ( glut_menu_id != -1 ) { - /* printf( "OUT\n" ); */ - glutDetachMenu( GLUT_LEFT_BUTTON ); - glutDestroyMenu( glut_menu_id ); - glut_menu_id = -1; - } - - return true; -} - - -/************************************ GLUI_Listbox::do_selection() **********/ - -int GLUI_Listbox::do_selection( int item_num ) -{ - GLUI_Listbox_Item *item, *sel_item; - - /*** Is this item already selected? ***/ - if ( item_num == int_val ) - return false; - - sel_item = NULL; - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - if ( item->id == item_num ) { - sel_item = item; - break; - } - - item = (GLUI_Listbox_Item *) item->next(); - } - - if ( NOT sel_item ) - return false; - - /* printf( "-> %s\n", (char*) sel_item->text ); */ - - int_val = item_num; - curr_text = sel_item->text; - redraw(); - - return true; -} - - -/*********************************** GLUI_Listbox::~GLUI_Listbox() **********/ - -GLUI_Listbox::~GLUI_Listbox() -{ - GLUI_Listbox_Item *item = (GLUI_Listbox_Item *) items_list.first_child(); - - while (item) - { - GLUI_Listbox_Item *tmp = item; - item = (GLUI_Listbox_Item *) item->next(); - delete tmp; - } -} - -/****************************** GLUI_Listbox::special_handler() **********/ - -int GLUI_Listbox::special_handler( int key,int modifiers ) -{ - GLUI_Listbox_Item *node, *new_node; - - node = get_item_ptr( int_val ); - new_node = NULL; - - if ( key == GLUT_KEY_DOWN ) { - new_node = (GLUI_Listbox_Item*) node->next(); - } - else if ( key == GLUT_KEY_UP ) { - new_node = (GLUI_Listbox_Item*) node->prev(); - } - else if ( key == GLUT_KEY_HOME ) { - new_node = (GLUI_Listbox_Item*) items_list.first_child(); - } - else if ( key == GLUT_KEY_END ) { - new_node = (GLUI_Listbox_Item*) items_list.last_child(); - } - - if ( new_node != NULL AND new_node != node ) { - node = new_node; - set_int_val( node->id ); - execute_callback(); - return true; - } - else { - return false; - } -} - - -/************************* GLUI_Listbox::recalculate_item_width( void ) ***********/ -/** Change w and return true if we need to be widened to fit the current items. */ -bool GLUI_Listbox::recalculate_item_width( void ) -{ - int item_text_size; - - if ( NOT glui ) - return false; - - /* Find the title size */ - text_x_offset = string_width( name ); - - /* Find the longest item string ***/ - item_text_size = 0; - - GLUI_Listbox_Item *item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - item_text_size = MAX(item_text_size,string_width(item->text)); - item = (GLUI_Listbox_Item *) item->next(); - } - - /* Sum up our layout: name, item, and drop-down marker */ - int new_wid=text_x_offset+MAX(GLUI_EDITTEXT_MIN_TEXT_WIDTH,item_text_size)+20; - if ( w != new_wid) { - w = new_wid; - return true; /* we gotta be shortened or widened */ - } - else { - return false; /* our current width is OK */ - } -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_listbox - GLUI_ListBox control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +/****************************** GLUI_Listbox::GLUI_Listbox() **********/ +GLUI_Listbox::GLUI_Listbox( GLUI_Node *parent, + const char *name, int *value_ptr, + int id, + GLUI_CB cb) +{ + common_init(); + set_ptr_val( value_ptr ); + user_id = id; + set_name( name ); + callback = cb; + + parent->add_control( this ); + + init_live(); +} + + +/****************************** GLUI_Listbox::mouse_down_handler() **********/ + +int GLUI_Listbox::mouse_down_handler( int local_x, int local_y ) +{ + return false; +} + + +/****************************** GLUI_Listbox::mouse_up_handler() **********/ + +int GLUI_Listbox::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + + return false; +} + + +/****************************** GLUI_Listbox::mouse_held_down_handler() ******/ + +int GLUI_Listbox::mouse_held_down_handler( int local_x, int local_y, + bool inside) +{ + + return false; +} + + +/****************************** GLUI_Listbox::key_handler() **********/ + +int GLUI_Listbox::key_handler( unsigned char key,int modifiers ) +{ + return false; +} + + +/****************************** GLUI_Listbox::draw() **********/ + +void GLUI_Listbox::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int name_x; + + /* draw_active_area(); */ + + name_x = MAX(text_x_offset - string_width(this->name) - 3,0); + draw_name( name_x , 13); + draw_box_inwards_outline( text_x_offset, w, + 0, h ); + + if ( NOT active ) { + draw_box( text_x_offset+3, w-2, 2, h-2, 1.0, 1.0, 1.0 ); + if ( NOT enabled ) + glColor3b( 32, 32, 32 ); + else + glColor3f( 0.0, 0.0, 0.0 ); + glRasterPos2i( text_x_offset+5, 13 ); + draw_string( curr_text ); + } + else { + draw_box( text_x_offset+3, w-2, 2, h-2, .0, .0, .6 ); + glColor3f( 1.0, 1.0, 1.0 ); + glRasterPos2i( text_x_offset+5, 13 ); + draw_string( curr_text ); + } + + + if ( enabled ) { + glui->std_bitmaps. + draw(GLUI_STDBITMAP_LISTBOX_UP, + w-glui->std_bitmaps.width(GLUI_STDBITMAP_LISTBOX_UP)-1, + 2 ); + } + else { + glui->std_bitmaps. + draw(GLUI_STDBITMAP_LISTBOX_UP_DIS, + w-glui->std_bitmaps.width(GLUI_STDBITMAP_LISTBOX_UP)-1, + 2 ); + } +} + + +/************************************ GLUI_Listbox::update_si() **********/ +void GLUI_Listbox::update_size( void ) +{ + recalculate_item_width(); +} + +/********************************* GLUI_Listbox::set_int_val() **************/ + +void GLUI_Listbox::set_int_val( int new_val ) +{ + /* int_val = new_val; */ + + do_selection( new_val ); + + /*** Update the variable we're (possibly) pointing to, and update the main gfx ***/ + output_live(true); +} + +/**************************************** GLUI_Listbox::add_item() **********/ + +int GLUI_Listbox::add_item( int id, const char *new_text ) +{ + GLUI_Listbox_Item *new_node = new GLUI_Listbox_Item; + GLUI_Listbox_Item *head; + + new_node->text = new_text; + new_node->id = id; + + head = (GLUI_Listbox_Item*) items_list.first_child(); + new_node->link_this_to_parent_last( &items_list ); + + if ( head == NULL ) { + /*** This is first item added ***/ + + int_val = id+1; /** Different than id **/ + do_selection( id ); + last_live_int = id; + + if( glui ) + glui->post_update_main_gfx(); + } + if (recalculate_item_width()) glui->refresh(); + + return true; +} + + +/************************************** GLUI_Listbox::delete_item() **********/ + +int GLUI_Listbox::delete_item( const char *text ) +{ + GLUI_Listbox_Item *node = get_item_ptr(text); + + if (node) + { + node->unlink(); + delete node; + return true; + } + if (recalculate_item_width()) glui->refresh(); + + return false; +} + + +/************************************** GLUI_Listbox::delete_item() **********/ + +int GLUI_Listbox::delete_item(int id) +{ + GLUI_Listbox_Item *node = get_item_ptr(id); + + if (node) + { + node->unlink(); + delete node; + return true; + } + if (recalculate_item_width()) glui->refresh(); + + return false; +} + + +/************************************** GLUI_Listbox::sort_items() **********/ + +int GLUI_Listbox::sort_items( void ) +{ + return false; +} + + +/********************************************* GLUI_Listbox::dump() **********/ + +void GLUI_Listbox::dump( FILE *output ) +{ + GLUI_Listbox_Item *item; + + /* printf( "%p\n", (char*) name ); */ + + fprintf( output, "Listbox: %s\n", name.c_str() ); + + item = (GLUI_Listbox_Item *) items_list.first_child(); + while( item ) { + fprintf( output, " %3d : %s\n", item->id, item->text.c_str() ); + + item = (GLUI_Listbox_Item *) item->next(); + } +} + + +/************************************ GLUI_Listbox::get_item_ptr() **********/ + +GLUI_Listbox_Item *GLUI_Listbox::get_item_ptr( const char *text ) +{ + GLUI_Listbox_Item *item; + + item = (GLUI_Listbox_Item *) items_list.first_child(); + while( item ) { + if ( item->text == text ) + return item; + + item = (GLUI_Listbox_Item *) item->next(); + } + + return NULL; +} + + +/************************************ GLUI_Listbox::get_item_ptr() **********/ + +GLUI_Listbox_Item *GLUI_Listbox::get_item_ptr( int id ) +{ + GLUI_Listbox_Item *item; + + item = (GLUI_Listbox_Item *) items_list.first_child(); + while( item ) { + if ( item->id == id ) + return item; + + item = (GLUI_Listbox_Item *) item->next(); + } + + return NULL; +} + + +/************************************ GLUI_Listbox::mouse_over() **********/ + +static void listbox_callback( int i ) +{ + int old_val; + + if ( NOT GLUI_Master.curr_left_button_glut_menu OR + !GLUI_Master.curr_left_button_glut_menu->dynamicCastGLUI_Listbox() ) + return; + + old_val = ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->int_val; + ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->set_int_val(i); + + /**** If value changed, execute callback ****/ + if ( old_val != + ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->int_val ) { + ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->execute_callback(); + } +} + + +/*************************************** GLUI_Listbox::mouse_over() **********/ + +int GLUI_Listbox::mouse_over( int state, int x, int y ) +{ + GLUI_Listbox_Item *item; + + /* printf( "x/y: %d/%d\n", x, y ); */ + + if ( state AND enabled AND x > x_abs + text_x_offset) { + /**** Build a GLUT menu for this listbox ***/ + + /* printf( "%d %d\n", x, y ); */ + + glut_menu_id = glutCreateMenu(listbox_callback); + + item = (GLUI_Listbox_Item *) items_list.first_child(); + while( item ) { + glutAddMenuEntry( item->text.c_str(), item->id ); + item = (GLUI_Listbox_Item *) item->next(); + } + + glutAttachMenu( GLUT_LEFT_BUTTON); + + GLUI_Master.set_left_button_glut_menu_control( this ); + } + else if ( glut_menu_id != -1 ) { + /* printf( "OUT\n" ); */ + glutDetachMenu( GLUT_LEFT_BUTTON ); + glutDestroyMenu( glut_menu_id ); + glut_menu_id = -1; + } + + return true; +} + + +/************************************ GLUI_Listbox::do_selection() **********/ + +int GLUI_Listbox::do_selection( int item_num ) +{ + GLUI_Listbox_Item *item, *sel_item; + + /*** Is this item already selected? ***/ + if ( item_num == int_val ) + return false; + + sel_item = NULL; + item = (GLUI_Listbox_Item *) items_list.first_child(); + while( item ) { + if ( item->id == item_num ) { + sel_item = item; + break; + } + + item = (GLUI_Listbox_Item *) item->next(); + } + + if ( NOT sel_item ) + return false; + + /* printf( "-> %s\n", (char*) sel_item->text ); */ + + int_val = item_num; + curr_text = sel_item->text; + redraw(); + + return true; +} + + +/*********************************** GLUI_Listbox::~GLUI_Listbox() **********/ + +GLUI_Listbox::~GLUI_Listbox() +{ + GLUI_Listbox_Item *item = (GLUI_Listbox_Item *) items_list.first_child(); + + while (item) + { + GLUI_Listbox_Item *tmp = item; + item = (GLUI_Listbox_Item *) item->next(); + delete tmp; + } +} + +/****************************** GLUI_Listbox::special_handler() **********/ + +int GLUI_Listbox::special_handler( int key,int modifiers ) +{ + GLUI_Listbox_Item *node, *new_node; + + node = get_item_ptr( int_val ); + new_node = NULL; + + if ( key == GLUT_KEY_DOWN ) { + new_node = (GLUI_Listbox_Item*) node->next(); + } + else if ( key == GLUT_KEY_UP ) { + new_node = (GLUI_Listbox_Item*) node->prev(); + } + else if ( key == GLUT_KEY_HOME ) { + new_node = (GLUI_Listbox_Item*) items_list.first_child(); + } + else if ( key == GLUT_KEY_END ) { + new_node = (GLUI_Listbox_Item*) items_list.last_child(); + } + + if ( new_node != NULL AND new_node != node ) { + node = new_node; + set_int_val( node->id ); + execute_callback(); + return true; + } + else { + return false; + } +} + + +/************************* GLUI_Listbox::recalculate_item_width( void ) ***********/ +/** Change w and return true if we need to be widened to fit the current items. */ +bool GLUI_Listbox::recalculate_item_width( void ) +{ + int item_text_size; + + if ( NOT glui ) + return false; + + /* Find the title size */ + text_x_offset = string_width( name ); + + /* Find the longest item string ***/ + item_text_size = 0; + + GLUI_Listbox_Item *item = (GLUI_Listbox_Item *) items_list.first_child(); + while( item ) { + item_text_size = MAX(item_text_size,string_width(item->text)); + item = (GLUI_Listbox_Item *) item->next(); + } + + /* Sum up our layout: name, item, and drop-down marker */ + int new_wid=text_x_offset+MAX(GLUI_EDITTEXT_MIN_TEXT_WIDTH,item_text_size)+20; + if ( w != new_wid) { + w = new_wid; + return true; /* we gotta be shortened or widened */ + } + else { + return false; /* our current width is OK */ + } +} diff --git a/Extras/glui/glui_mouse_iaction.cpp b/Extras/glui/glui_mouse_iaction.cpp index bc9f0610d..0acd69f7a 100644 --- a/Extras/glui/glui_mouse_iaction.cpp +++ b/Extras/glui/glui_mouse_iaction.cpp @@ -1,210 +1,210 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_mouse_iaction - GLUI Mouse Interaction control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/********************** GLUI_Mouse_Interaction::mouse_down_handler() ******/ - -int GLUI_Mouse_Interaction::mouse_down_handler( int local_x, int local_y ) -{ - /* int win_h = glutGet( GLUT_WINDOW_HEIGHT ); */ - - /* iaction_mouse_down_handler( local_x, local_y ); */ - iaction_mouse_down_handler( local_x-x_abs, local_y-y_abs ); - /*local_x-x_abs, ((glui->h-local_y)-y_abs) ); */ - redraw(); - - return false; -} - - -/**************************** GLUI_Mouse_Interaction::mouse_up_handler() */ - -int GLUI_Mouse_Interaction::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - iaction_mouse_up_handler( local_x-x_abs, local_y-y_abs, inside ); - return false; -} - - -/****************************** GLUI_Mouse_Interaction::mouse_held_down_handler() ******/ - -int GLUI_Mouse_Interaction::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - iaction_mouse_held_down_handler( local_x-x_abs, local_y-y_abs , inside ); - - redraw(); - - /** Tell the main graphics window to update iteself **/ - if( glui ) - glui->post_update_main_gfx(); - - execute_callback(); - - return false; -} - - - -/****************************** GLUI_Mouse_Interaction::draw() **********/ - -void GLUI_Mouse_Interaction::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_width = string_width( this->name ); - int x_left = this->w/2 - text_width/2; - - if ( NOT draw_active_area_only ) { - draw_name( x_left, h-4 ); - draw_active_box( x_left-4, x_left+string_width( name )+4, - h, h-14 ); - } - - draw_active_area(); -} - - -/************************************ GLUI_Mouse_Interaction::update_size() **********/ - -void GLUI_Mouse_Interaction::update_size( void ) -{ - if ( NOT glui ) - return; - - int text_width = string_width( this->name ); - - if ( w < text_width+6 ) - w = text_width+6; - - if ( h - 18 > w ) - w = h - 18; - - iaction_init(); -} - - -/****************************** GLUI_Mouse_Interaction::special_handler() **********/ - -int GLUI_Mouse_Interaction::special_handler( int key,int modifiers ) -{ - int center_x, center_y; - int drag_x, drag_y; - - center_x = w/2; - center_y = (h-18)/2; - drag_x = 0; - drag_y = 0; - - if ( key == GLUT_KEY_LEFT ) - drag_x = -6; - else if ( key == GLUT_KEY_RIGHT ) - drag_x = 6; - else if ( key == GLUT_KEY_UP ) - drag_y = -6; - else if ( key == GLUT_KEY_DOWN ) - drag_y = 6; - - if ( drag_x != 0 OR drag_y != 0 ) { - mouse_down_handler( center_x, center_y ); - mouse_held_down_handler( center_x + drag_x, center_y + drag_y,true ); - mouse_up_handler( center_x + drag_x, center_y + drag_y, true ); - } - - return false; -} - - -/****************************** GLUI_Mouse_Interaction::draw_active_area() **********/ - -void GLUI_Mouse_Interaction::draw_active_area( void ) -{ - int win_h = glutGet( GLUT_WINDOW_HEIGHT ), win_w = glutGet(GLUT_WINDOW_WIDTH); - - int text_height = 18; /* what a kludge */ - - int viewport_size = h-text_height; /*MIN(w,h); */ - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); - - glTranslatef( (float) this->x_abs + .5, (float) this->y_abs + .5, 0.0 ); - - glTranslatef( (float)this->w/2.0, (float)viewport_size/2.0 + 2.0 , 0.0 ); - - /*** Draw the interaction control's orthographic elements ***/ - iaction_draw_active_area_ortho(); - - /*** Setup and draw the interaction control's perspective elements ***/ - - /*** Set the viewport to just the square of the drawing area ***/ - /* glViewport( this->x_abs , glui->main_panel->h - this->y_abs - this->h,*/ - /*glViewport( this->x_abs+1+(this->w/2-viewport_size/2), - this->h-this->y_abs-viewport_size-1, - viewport_size, viewport_size );*/ - - viewport_size -= 4; - int offset = 0; - if ( ((this->w-viewport_size) % 2) == 1 ) - offset = 1; - - glViewport( this->x_abs + (this->w-viewport_size)/2 + offset, - win_h - this->y_abs - this->h + text_height, - viewport_size, viewport_size ); - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - double xy=1.00,zc=50.0; /* X-Y size, and Z origin */ - glFrustum( -1.0*xy, 1.0*xy, -xy, xy, zc*0.7, zc*1.3 ); - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - glTranslatef( 0.0, 0.0, -zc ); - glScalef(xy,xy,1.0); // xy); - - /* glutSolidTeapot( 1.0 ); */ - iaction_draw_active_area_persp(); - - glMatrixMode( GL_MODELVIEW ); - glPopMatrix(); - - glui->set_viewport(); - glui->set_ortho_projection(); - - glMatrixMode( GL_MODELVIEW ); - glPopMatrix(); -} - +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_mouse_iaction - GLUI Mouse Interaction control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +/********************** GLUI_Mouse_Interaction::mouse_down_handler() ******/ + +int GLUI_Mouse_Interaction::mouse_down_handler( int local_x, int local_y ) +{ + /* int win_h = glutGet( GLUT_WINDOW_HEIGHT ); */ + + /* iaction_mouse_down_handler( local_x, local_y ); */ + iaction_mouse_down_handler( local_x-x_abs, local_y-y_abs ); + /*local_x-x_abs, ((glui->h-local_y)-y_abs) ); */ + redraw(); + + return false; +} + + +/**************************** GLUI_Mouse_Interaction::mouse_up_handler() */ + +int GLUI_Mouse_Interaction::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + iaction_mouse_up_handler( local_x-x_abs, local_y-y_abs, inside ); + return false; +} + + +/****************************** GLUI_Mouse_Interaction::mouse_held_down_handler() ******/ + +int GLUI_Mouse_Interaction::mouse_held_down_handler( int local_x, int local_y, + bool inside) +{ + iaction_mouse_held_down_handler( local_x-x_abs, local_y-y_abs , inside ); + + redraw(); + + /** Tell the main graphics window to update iteself **/ + if( glui ) + glui->post_update_main_gfx(); + + execute_callback(); + + return false; +} + + + +/****************************** GLUI_Mouse_Interaction::draw() **********/ + +void GLUI_Mouse_Interaction::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int text_width = string_width( this->name ); + int x_left = this->w/2 - text_width/2; + + if ( NOT draw_active_area_only ) { + draw_name( x_left, h-4 ); + draw_active_box( x_left-4, x_left+string_width( name )+4, + h, h-14 ); + } + + draw_active_area(); +} + + +/************************************ GLUI_Mouse_Interaction::update_size() **********/ + +void GLUI_Mouse_Interaction::update_size( void ) +{ + if ( NOT glui ) + return; + + int text_width = string_width( this->name ); + + if ( w < text_width+6 ) + w = text_width+6; + + if ( h - 18 > w ) + w = h - 18; + + iaction_init(); +} + + +/****************************** GLUI_Mouse_Interaction::special_handler() **********/ + +int GLUI_Mouse_Interaction::special_handler( int key,int modifiers ) +{ + int center_x, center_y; + int drag_x, drag_y; + + center_x = w/2; + center_y = (h-18)/2; + drag_x = 0; + drag_y = 0; + + if ( key == GLUT_KEY_LEFT ) + drag_x = -6; + else if ( key == GLUT_KEY_RIGHT ) + drag_x = 6; + else if ( key == GLUT_KEY_UP ) + drag_y = -6; + else if ( key == GLUT_KEY_DOWN ) + drag_y = 6; + + if ( drag_x != 0 OR drag_y != 0 ) { + mouse_down_handler( center_x, center_y ); + mouse_held_down_handler( center_x + drag_x, center_y + drag_y,true ); + mouse_up_handler( center_x + drag_x, center_y + drag_y, true ); + } + + return false; +} + + +/****************************** GLUI_Mouse_Interaction::draw_active_area() **********/ + +void GLUI_Mouse_Interaction::draw_active_area( void ) +{ + int win_h = glutGet( GLUT_WINDOW_HEIGHT ), win_w = glutGet(GLUT_WINDOW_WIDTH); + + int text_height = 18; /* what a kludge */ + + int viewport_size = h-text_height; /*MIN(w,h); */ + + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); + glRotatef( 180.0, 0.0, 1.0, 0.0 ); + glRotatef( 180.0, 0.0, 0.0, 1.0 ); + glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); + + glTranslatef( (float) this->x_abs + .5, (float) this->y_abs + .5, 0.0 ); + + glTranslatef( (float)this->w/2.0, (float)viewport_size/2.0 + 2.0 , 0.0 ); + + /*** Draw the interaction control's orthographic elements ***/ + iaction_draw_active_area_ortho(); + + /*** Setup and draw the interaction control's perspective elements ***/ + + /*** Set the viewport to just the square of the drawing area ***/ + /* glViewport( this->x_abs , glui->main_panel->h - this->y_abs - this->h,*/ + /*glViewport( this->x_abs+1+(this->w/2-viewport_size/2), + this->h-this->y_abs-viewport_size-1, + viewport_size, viewport_size );*/ + + viewport_size -= 4; + int offset = 0; + if ( ((this->w-viewport_size) % 2) == 1 ) + offset = 1; + + glViewport( this->x_abs + (this->w-viewport_size)/2 + offset, + win_h - this->y_abs - this->h + text_height, + viewport_size, viewport_size ); + + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + double xy=1.00,zc=50.0; /* X-Y size, and Z origin */ + glFrustum( -1.0*xy, 1.0*xy, -xy, xy, zc*0.7, zc*1.3 ); + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -zc ); + glScalef(xy,xy,1.0); // xy); + + /* glutSolidTeapot( 1.0 ); */ + iaction_draw_active_area_persp(); + + glMatrixMode( GL_MODELVIEW ); + glPopMatrix(); + + glui->set_viewport(); + glui->set_ortho_projection(); + + glMatrixMode( GL_MODELVIEW ); + glPopMatrix(); +} + diff --git a/Extras/glui/glui_node.cpp b/Extras/glui/glui_node.cpp index 4cfd71df7..a943332f4 100644 --- a/Extras/glui/glui_node.cpp +++ b/Extras/glui/glui_node.cpp @@ -1,212 +1,212 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_node.cpp - linked-list tree structure - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" - -/********************************************* GLUI_Node::GLUI_Node() *******/ - -GLUI_Node::GLUI_Node() -: - parent_node(NULL), - child_head(NULL), - child_tail(NULL), - next_sibling(NULL), - prev_sibling(NULL) -{ -} - -/********************************************* GLUI_Node::first() *******/ -/* Returns first sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::first_sibling( void ) -{ - if ( parent_node == NULL ) - return this; /* root node has no siblings */ - else - return parent_node->child_head; -} - - -/******************************************** GLUI_Node::next() ********/ -/* Returns next sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::next( void ) -{ - return next_sibling; -} - - -/******************************************** GLUI_Node::prev() ********/ -/* Returns prev sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::prev( void ) -{ - return prev_sibling; -} - - -/********************************************* GLUI_Node::last() *******/ -/* Returns last sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::last_sibling( void ) -{ - if ( parent_node == NULL ) - return this; /* root node has no siblings */ - else - return parent_node->child_tail; -} - - -/*************************** GLUI_Node::link_this_to_parent_last() *******/ -/* Links as last child of parent */ - -void GLUI_Node::link_this_to_parent_last( GLUI_Node *new_parent ) -{ - if ( new_parent->child_tail == NULL ) { /* parent has no children */ - new_parent->child_head = this; - new_parent->child_tail = this; - this->parent_node = new_parent; - } - else { /* parent has children */ - new_parent->child_tail->next_sibling = this; - this->prev_sibling = new_parent->child_tail; - new_parent->child_tail = this; - this->parent_node = new_parent; - } -} - - -/*************************** GLUI_Node::link_this_to_parent_first() *******/ -/* Links as first child of parent */ - -void GLUI_Node::link_this_to_parent_first( GLUI_Node *new_parent ) -{ - if ( new_parent->child_head == NULL ) { /* parent has no children */ - new_parent->child_head = this; - new_parent->child_tail = this; - this->parent_node = new_parent; - } - else { /* parent has children */ - new_parent->child_head->prev_sibling = this; - this->next_sibling = new_parent->child_head; - new_parent->child_head = this; - this->parent_node = new_parent; - } -} - -/**************************** GLUI_Node::link_this_to_sibling_next() *****/ - -void GLUI_Node::link_this_to_sibling_next( GLUI_Node *sibling ) -{ - if ( sibling->next_sibling == NULL ) { /* node has no next sibling */ - sibling->next_sibling = this; - this->prev_sibling = sibling; - - /* This was the parent's last child, so update that as well */ - if ( sibling->parent_node != NULL ) { - sibling->parent_node->child_tail = this; - } - } - else { /* node already has a next sibling */ - sibling->next_sibling->prev_sibling = this; - this->next_sibling = sibling->next_sibling; - sibling->next_sibling = this; - this->prev_sibling = sibling; - } - - this->parent_node = sibling->parent_node; -} - - -/**************************** GLUI_Node::link_this_to_sibling_prev() *****/ - -void GLUI_Node::link_this_to_sibling_prev( GLUI_Node *sibling ) -{ - if ( sibling->prev_sibling == NULL ) { /* node has no prev sibling */ - sibling->prev_sibling = this; - this->next_sibling = sibling; - - /* This was the parent's first child, so update that as well */ - if ( sibling->parent_node != NULL ) { - sibling->parent_node->child_head = this; - } - } - else { /* node already has a prev sibling */ - sibling->prev_sibling->next_sibling = this; - this->prev_sibling = sibling->prev_sibling; - sibling->prev_sibling = this; - this->next_sibling = sibling; - } - - this->parent_node = sibling->parent_node; -} - -/**************************************** GLUI_Node::unlink() **************/ - -void GLUI_Node::unlink( void ) -{ - /* Unlink from prev sibling */ - if ( this->prev_sibling != NULL ) { - this->prev_sibling->next_sibling = this->next_sibling; - } - else { /* No prev sibling: this was parent's first child */ - this->parent_node->child_head = this->next_sibling; - } - - /* Unlink from next sibling */ - if ( this->next_sibling != NULL ) { - this->next_sibling->prev_sibling = this->prev_sibling; - } - else { /* No next sibling: this was parent's last child */ - this->parent_node->child_tail = this->prev_sibling; - } - - this->parent_node = NULL; - this->next_sibling = NULL; - this->prev_sibling = NULL; - this->child_head = NULL; - this->child_tail = NULL; -} - -/**************************************** GLUI_Node::dump() **************/ - -void GLUI_Node::dump( FILE *out, const char *name ) -{ - fprintf( out, "GLUI_node: %s\n", name ); - fprintf( out, " parent: %p child_head: %p child_tail: %p\n", - (void *) parent_node, - (void *) child_head, - (void *) child_tail ); - fprintf( out, " next: %p prev: %p\n", - (void *) next_sibling, - (void *) prev_sibling ); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_node.cpp - linked-list tree structure + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "GL/glui.h" +#include "glui_internal.h" + +/********************************************* GLUI_Node::GLUI_Node() *******/ + +GLUI_Node::GLUI_Node() +: + parent_node(NULL), + child_head(NULL), + child_tail(NULL), + next_sibling(NULL), + prev_sibling(NULL) +{ +} + +/********************************************* GLUI_Node::first() *******/ +/* Returns first sibling in 'this' node's sibling list */ + +GLUI_Node *GLUI_Node::first_sibling( void ) +{ + if ( parent_node == NULL ) + return this; /* root node has no siblings */ + else + return parent_node->child_head; +} + + +/******************************************** GLUI_Node::next() ********/ +/* Returns next sibling in 'this' node's sibling list */ + +GLUI_Node *GLUI_Node::next( void ) +{ + return next_sibling; +} + + +/******************************************** GLUI_Node::prev() ********/ +/* Returns prev sibling in 'this' node's sibling list */ + +GLUI_Node *GLUI_Node::prev( void ) +{ + return prev_sibling; +} + + +/********************************************* GLUI_Node::last() *******/ +/* Returns last sibling in 'this' node's sibling list */ + +GLUI_Node *GLUI_Node::last_sibling( void ) +{ + if ( parent_node == NULL ) + return this; /* root node has no siblings */ + else + return parent_node->child_tail; +} + + +/*************************** GLUI_Node::link_this_to_parent_last() *******/ +/* Links as last child of parent */ + +void GLUI_Node::link_this_to_parent_last( GLUI_Node *new_parent ) +{ + if ( new_parent->child_tail == NULL ) { /* parent has no children */ + new_parent->child_head = this; + new_parent->child_tail = this; + this->parent_node = new_parent; + } + else { /* parent has children */ + new_parent->child_tail->next_sibling = this; + this->prev_sibling = new_parent->child_tail; + new_parent->child_tail = this; + this->parent_node = new_parent; + } +} + + +/*************************** GLUI_Node::link_this_to_parent_first() *******/ +/* Links as first child of parent */ + +void GLUI_Node::link_this_to_parent_first( GLUI_Node *new_parent ) +{ + if ( new_parent->child_head == NULL ) { /* parent has no children */ + new_parent->child_head = this; + new_parent->child_tail = this; + this->parent_node = new_parent; + } + else { /* parent has children */ + new_parent->child_head->prev_sibling = this; + this->next_sibling = new_parent->child_head; + new_parent->child_head = this; + this->parent_node = new_parent; + } +} + +/**************************** GLUI_Node::link_this_to_sibling_next() *****/ + +void GLUI_Node::link_this_to_sibling_next( GLUI_Node *sibling ) +{ + if ( sibling->next_sibling == NULL ) { /* node has no next sibling */ + sibling->next_sibling = this; + this->prev_sibling = sibling; + + /* This was the parent's last child, so update that as well */ + if ( sibling->parent_node != NULL ) { + sibling->parent_node->child_tail = this; + } + } + else { /* node already has a next sibling */ + sibling->next_sibling->prev_sibling = this; + this->next_sibling = sibling->next_sibling; + sibling->next_sibling = this; + this->prev_sibling = sibling; + } + + this->parent_node = sibling->parent_node; +} + + +/**************************** GLUI_Node::link_this_to_sibling_prev() *****/ + +void GLUI_Node::link_this_to_sibling_prev( GLUI_Node *sibling ) +{ + if ( sibling->prev_sibling == NULL ) { /* node has no prev sibling */ + sibling->prev_sibling = this; + this->next_sibling = sibling; + + /* This was the parent's first child, so update that as well */ + if ( sibling->parent_node != NULL ) { + sibling->parent_node->child_head = this; + } + } + else { /* node already has a prev sibling */ + sibling->prev_sibling->next_sibling = this; + this->prev_sibling = sibling->prev_sibling; + sibling->prev_sibling = this; + this->next_sibling = sibling; + } + + this->parent_node = sibling->parent_node; +} + +/**************************************** GLUI_Node::unlink() **************/ + +void GLUI_Node::unlink( void ) +{ + /* Unlink from prev sibling */ + if ( this->prev_sibling != NULL ) { + this->prev_sibling->next_sibling = this->next_sibling; + } + else { /* No prev sibling: this was parent's first child */ + this->parent_node->child_head = this->next_sibling; + } + + /* Unlink from next sibling */ + if ( this->next_sibling != NULL ) { + this->next_sibling->prev_sibling = this->prev_sibling; + } + else { /* No next sibling: this was parent's last child */ + this->parent_node->child_tail = this->prev_sibling; + } + + this->parent_node = NULL; + this->next_sibling = NULL; + this->prev_sibling = NULL; + this->child_head = NULL; + this->child_tail = NULL; +} + +/**************************************** GLUI_Node::dump() **************/ + +void GLUI_Node::dump( FILE *out, const char *name ) +{ + fprintf( out, "GLUI_node: %s\n", name ); + fprintf( out, " parent: %p child_head: %p child_tail: %p\n", + (void *) parent_node, + (void *) child_head, + (void *) child_tail ); + fprintf( out, " next: %p prev: %p\n", + (void *) next_sibling, + (void *) prev_sibling ); +} diff --git a/Extras/glui/glui_panel.cpp b/Extras/glui/glui_panel.cpp index 687b77971..3aa61ae8c 100644 --- a/Extras/glui/glui_panel.cpp +++ b/Extras/glui/glui_panel.cpp @@ -1,186 +1,186 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_panel.cpp - GLUI_Panel control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -GLUI_Panel::GLUI_Panel( GLUI_Node *parent, const char *name, int type ) -{ - common_init(); - set_name( name ); - user_id = -1; - int_val = type; - - parent->add_control( this ); -} - -/****************************** GLUI_Panel::draw() **********/ - -void GLUI_Panel::draw( int x, int y ) -{ - int top; - GLUI_DRAWINGSENTINAL_IDIOM - - if ( int_val == GLUI_PANEL_RAISED ) { - top = 0; - glLineWidth( 1.0 ); - glColor3f( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, top ); glVertex2i( w, top ); - glVertex2i( 0, top ); glVertex2i( 0, h ); - glEnd(); - - glColor3f( .5, .5, .5 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( w, top ); - glVertex2i( w, h ); - glVertex2i( 0, h ); - glVertex2i( w, h ); - glEnd(); - - /** ORIGINAL RAISED PANEL METHOD - A LITTLE TOO HIGH ** - glLineWidth(1.0); - glBegin( GL_LINES ); - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i( 1, 1 ); glVertex2i( w-2, 1 ); - glVertex2i( 1, 1 ); glVertex2i( 1, h-2 ); - - glColor3f( .5, .5, .5 ); - glVertex2i( w-1, 1 ); glVertex2i( w-1, h-1 ); - glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); - - glColor3f( 0.0, 0.0, 0.0 ); - glVertex2i( 0, h ); glVertex2i( w, h ); - glVertex2i( w, 0 ); glVertex2i( w, h ); - glEnd(); - - -- Touch up the lines a bit (needed in some opengl implementations - glBegin( GL_POINTS ); - glColor3f( .5, .5, .5 ); - glVertex2i( w-1, h-1 ); - glColor3f( 0.0, 0.0, 0.0 ); - glVertex2i( w, h ); - glEnd(); - **/ - } - else if ( int_val == GLUI_PANEL_EMBOSSED ) { - if ( parent_node == NULL || name == "" ) { - top = 0; - } - else { - top = GLUI_PANEL_EMBOSS_TOP; - } - - glLineWidth( 1.0 ); - glColor3f( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, top ); glVertex2i( w, top ); - glVertex2i( w, h ); glVertex2i( 0, h ); - - glVertex2i( 1, top+1 ); glVertex2i( w-1, top+1 ); - glVertex2i( w-1, h-1 ); glVertex2i( 1, h-1 ); - glEnd(); - - glColor3f( .5, .5, .5 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, top ); - glVertex2i( w-1, top ); - glVertex2i( w-1, h-1 ); - glVertex2i( 0, h-1 ); - glEnd(); - - /**** Only display text in embossed panel ****/ - if ( parent_node != NULL && name != "" ) { /* Only draw non-null strings */ - int left = 7, height=GLUI_PANEL_NAME_DROP+1; - int str_width; - - str_width = string_width(name); - - if ( glui ) - glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( left-3, 0 ); glVertex2i( left+str_width+3, 0 ); - glVertex2i( left+str_width+3, height ); glVertex2i( left-3, height ); - glEnd(); - - draw_name( left, GLUI_PANEL_NAME_DROP ); - } - } - - glLineWidth( 1.0 ); -} - -/****************************** GLUI_Panel::set_name() **********/ - -void GLUI_Panel::set_name( const char *new_name ) -{ - name = new_name ? new_name : ""; - - update_size(); - - if ( glui ) - glui->refresh(); -} - - -/****************************** GLUI_Panel::set_type() **********/ - -void GLUI_Panel::set_type( int new_type ) -{ - if ( new_type != int_val ) { - int_val = new_type; - update_size(); - redraw(); - } -} - - -/************************************** GLUI_Panel::update_size() **********/ - -void GLUI_Panel::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width(name); - - if ( w < text_size + 16 ) - w = text_size + 16 ; - - if ( name != "" AND int_val == GLUI_PANEL_EMBOSSED ) { - this->y_off_top = GLUI_YOFF + 8; - } - else { - this->y_off_top = GLUI_YOFF; - } -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_panel.cpp - GLUI_Panel control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +GLUI_Panel::GLUI_Panel( GLUI_Node *parent, const char *name, int type ) +{ + common_init(); + set_name( name ); + user_id = -1; + int_val = type; + + parent->add_control( this ); +} + +/****************************** GLUI_Panel::draw() **********/ + +void GLUI_Panel::draw( int x, int y ) +{ + int top; + GLUI_DRAWINGSENTINAL_IDIOM + + if ( int_val == GLUI_PANEL_RAISED ) { + top = 0; + glLineWidth( 1.0 ); + glColor3f( 1.0, 1.0, 1.0 ); + glBegin( GL_LINE_LOOP ); + glVertex2i( 0, top ); glVertex2i( w, top ); + glVertex2i( 0, top ); glVertex2i( 0, h ); + glEnd(); + + glColor3f( .5, .5, .5 ); + glBegin( GL_LINE_LOOP ); + glVertex2i( w, top ); + glVertex2i( w, h ); + glVertex2i( 0, h ); + glVertex2i( w, h ); + glEnd(); + + /** ORIGINAL RAISED PANEL METHOD - A LITTLE TOO HIGH ** + glLineWidth(1.0); + glBegin( GL_LINES ); + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i( 1, 1 ); glVertex2i( w-2, 1 ); + glVertex2i( 1, 1 ); glVertex2i( 1, h-2 ); + + glColor3f( .5, .5, .5 ); + glVertex2i( w-1, 1 ); glVertex2i( w-1, h-1 ); + glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); + + glColor3f( 0.0, 0.0, 0.0 ); + glVertex2i( 0, h ); glVertex2i( w, h ); + glVertex2i( w, 0 ); glVertex2i( w, h ); + glEnd(); + + -- Touch up the lines a bit (needed in some opengl implementations + glBegin( GL_POINTS ); + glColor3f( .5, .5, .5 ); + glVertex2i( w-1, h-1 ); + glColor3f( 0.0, 0.0, 0.0 ); + glVertex2i( w, h ); + glEnd(); + **/ + } + else if ( int_val == GLUI_PANEL_EMBOSSED ) { + if ( parent_node == NULL || name == "" ) { + top = 0; + } + else { + top = GLUI_PANEL_EMBOSS_TOP; + } + + glLineWidth( 1.0 ); + glColor3f( 1.0, 1.0, 1.0 ); + glBegin( GL_LINE_LOOP ); + glVertex2i( 0, top ); glVertex2i( w, top ); + glVertex2i( w, h ); glVertex2i( 0, h ); + + glVertex2i( 1, top+1 ); glVertex2i( w-1, top+1 ); + glVertex2i( w-1, h-1 ); glVertex2i( 1, h-1 ); + glEnd(); + + glColor3f( .5, .5, .5 ); + glBegin( GL_LINE_LOOP ); + glVertex2i( 0, top ); + glVertex2i( w-1, top ); + glVertex2i( w-1, h-1 ); + glVertex2i( 0, h-1 ); + glEnd(); + + /**** Only display text in embossed panel ****/ + if ( parent_node != NULL && name != "" ) { /* Only draw non-null strings */ + int left = 7, height=GLUI_PANEL_NAME_DROP+1; + int str_width; + + str_width = string_width(name); + + if ( glui ) + glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( left-3, 0 ); glVertex2i( left+str_width+3, 0 ); + glVertex2i( left+str_width+3, height ); glVertex2i( left-3, height ); + glEnd(); + + draw_name( left, GLUI_PANEL_NAME_DROP ); + } + } + + glLineWidth( 1.0 ); +} + +/****************************** GLUI_Panel::set_name() **********/ + +void GLUI_Panel::set_name( const char *new_name ) +{ + name = new_name ? new_name : ""; + + update_size(); + + if ( glui ) + glui->refresh(); +} + + +/****************************** GLUI_Panel::set_type() **********/ + +void GLUI_Panel::set_type( int new_type ) +{ + if ( new_type != int_val ) { + int_val = new_type; + update_size(); + redraw(); + } +} + + +/************************************** GLUI_Panel::update_size() **********/ + +void GLUI_Panel::update_size( void ) +{ + int text_size; + + if ( NOT glui ) + return; + + text_size = string_width(name); + + if ( w < text_size + 16 ) + w = text_size + 16 ; + + if ( name != "" AND int_val == GLUI_PANEL_EMBOSSED ) { + this->y_off_top = GLUI_YOFF + 8; + } + else { + this->y_off_top = GLUI_YOFF; + } +} diff --git a/Extras/glui/glui_radio.cpp b/Extras/glui/glui_radio.cpp index 157d18e84..aef166859 100644 --- a/Extras/glui/glui_radio.cpp +++ b/Extras/glui/glui_radio.cpp @@ -1,362 +1,362 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_radio.cpp - GLUI_RadioGroup and GLUI_RadioButton control classes - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include - -/****************************** GLUI_RadioGroup::GLUI_RadioGroup() **********/ - -GLUI_RadioGroup::GLUI_RadioGroup(GLUI_Node *parent, - int *value_ptr, - int id, GLUI_CB cb) -{ - common_init(); - GLUI_String buf; - - set_ptr_val( value_ptr ); - if ( value_ptr ) { - int_val = *value_ptr; /** Can't call set_int_val(), b/c that - function will try to call the - callback, etc */ - /** Actually, maybe not **/ - last_live_int = *value_ptr; - } - - user_id = id; - glui_format_str( buf, "RadioGroup: %p", this ); - set_name( buf.c_str() ); - callback = cb; - - parent->add_control( this ); - - init_live(); -} - - -/****************************** GLUI_RadioGroup::draw() **********/ - -void GLUI_RadioGroup::draw( int x, int y ) -{ - if ( NOT can_draw() ) - return; - - draw_group(false); -} - - -/********************* GLUI_RadioGroup::draw_group(int translate) **********/ - -void GLUI_RadioGroup::draw_group( int translate ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - GLUI_RadioButton *button; - this->int_val = int_val; - - glMatrixMode(GL_MODELVIEW ); - - button = (GLUI_RadioButton*) first_child(); - while( button != NULL ) { - glPushMatrix(); - if (translate) { - button->translate_to_origin(); - } - else { - glTranslatef(button->x_abs-x_abs, - button->y_abs-y_abs,0.0); - } - - if ( button->int_val ) - button->draw_checked(); - else - button->draw_unchecked(); - - glPopMatrix(); - - button = (GLUI_RadioButton*) button->next(); - } -} - - -/****************************** GLUI_RadioGroup::set_name() **********/ - -void GLUI_RadioGroup::set_name( const char *text ) -{ - name = text; - - if ( glui ) - glui->refresh(); -} - - -/********************************* GLUI_RadioGroup::set_selected() **********/ - -void GLUI_RadioGroup::set_selected( int int_val ) -{ - GLUI_RadioButton *button; - - this->int_val = int_val; - - button = (GLUI_RadioButton*) first_child(); - while( button != NULL ) { - if ( int_val == -1 ) { /*** All buttons in group are deselected ***/ - button->set_int_val(0); - } - else if ( int_val == button->user_id ) { /*** This is selected button ***/ - button->set_int_val(1); - } - else { /*** This is NOT selected button ***/ - button->set_int_val(0); - - } - button = (GLUI_RadioButton*) button->next(); - } - redraw(); -} - - -/************************ GLUI_RadioButton::GLUI_RadioButton() **********/ - -GLUI_RadioButton::GLUI_RadioButton( GLUI_RadioGroup *grp, const char *name ) -{ - common_init(); - - set_int_val( 0 ); - - /** A radio button's user id is always its ordinal number (zero-indexed) - within the group */ - user_id = grp->num_buttons; - set_name( name ); - group = grp; - - group->num_buttons++; /* Increments radiogroup's button count */ - group->add_control( this ); - - /*** Now update button states ***/ - group->set_int_val( group->int_val ); /* This tells the group to - reset itself to its - current value, thereby - updating all its buttons */ -} - - -/************************ GLUI_RadioButton::mouse_down_handler() **********/ - -int GLUI_RadioButton::mouse_down_handler( int local_x, int local_y ) -{ - if ( NOT group ) - return false; - - orig_value = group->int_val; - - currently_inside = true; - - group->set_selected( this->user_id ); - redraw(); - - return false; -} - -/********************** GLUI_RadioButton::mouse_held_down_handler() ******/ - -int GLUI_RadioButton::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - if (inside != currently_inside) { - if (inside) group->set_selected( this->user_id ); - else group->set_selected( orig_value ); - currently_inside = inside; - redraw(); - } - - return false; -} - - -/*************************** GLUI_RadioButton::mouse_up_handler() **********/ - -int GLUI_RadioButton::mouse_up_handler( int local_x, int local_y, - bool inside ) -{ - if ( NOT group ) - return false; - - if ( NOT inside ) { - group->set_selected( orig_value ); - redraw(); - } - else { - /** Now we update the radio button group. We tell the group - handler to set the currently-selected item to this button, which - is reference by its user_id/ordinal number within group **/ - - group->set_selected( this->user_id ); - redraw(); - - /*** Now update the linked variable, and call the callback, - but ONLY if the value of the radio group actually changed ***/ - if ( group->int_val != orig_value ) { - group->output_live(true); /** Output live and update gfx ***/ - - group->execute_callback(); - } - } - - return false; -} - -/****************************** GLUI_RadioButton::draw() **********/ - -void GLUI_RadioButton::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( NOT group OR NOT can_draw() ) - return; - - /*** See if we're the currently-selected button. If so, draw ***/ - if ( group->int_val == this->user_id ) { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, 0, 0 ); - } - else { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, 0, 0 ); - } - - draw_active_area(); - - draw_name( text_x_offset, 10 ); -} - - -/************************************ GLUI_RadioButton::draw_checked() ******/ - -void GLUI_RadioButton::draw_checked( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, 0, 0 ); - draw_active_area(); -} - - -/*********************************** GLUI_RadioButton::draw_unchecked() ******/ - -void GLUI_RadioButton::draw_unchecked( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, 0, 0 ); - draw_active_area(); -} - - -/**************************************** GLUI_RadioButton::draw_O() ********/ - -void GLUI_RadioButton::draw_O( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int i, j; - - glBegin( GL_POINTS ); - for(i=3; i<=GLUI_RADIOBUTTON_SIZE-3; i++ ) - for(j=3; j<=GLUI_RADIOBUTTON_SIZE-3; j++ ) - glVertex2i(i,j); - glEnd(); -} - - -/******************************** GLUI_RadioButton::update_size() **********/ - -void GLUI_RadioButton::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = _glutBitmapWidthString( glui->font, name.c_str() ); - - /* if ( w < text_x_offset + text_size + 6 ) */ - w = text_x_offset + text_size + 6 ; -} - - -/************************* GLUI_RadioButton::draw_active_area() **************/ - -void GLUI_RadioButton::draw_active_area( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_width, left, right; - - text_width = _glutBitmapWidthString( glui->font, name.c_str() ); - left = text_x_offset-3; - right = left + 7 + text_width; - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - } else { - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); - } - - glBegin( GL_LINE_LOOP ); - glVertex2i(left,0); glVertex2i( right,0); - glVertex2i(right,h+1); glVertex2i( left,h+1); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); -} - - -/********************************* GLUI_RadioGroup::set_int_val() **********/ - -void GLUI_RadioGroup::set_int_val( int new_val ) -{ - if ( new_val == int_val ) - return; - - set_selected( new_val ); - redraw(); - - output_live(true); - -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_radio.cpp - GLUI_RadioGroup and GLUI_RadioButton control classes + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" +#include + +/****************************** GLUI_RadioGroup::GLUI_RadioGroup() **********/ + +GLUI_RadioGroup::GLUI_RadioGroup(GLUI_Node *parent, + int *value_ptr, + int id, GLUI_CB cb) +{ + common_init(); + GLUI_String buf; + + set_ptr_val( value_ptr ); + if ( value_ptr ) { + int_val = *value_ptr; /** Can't call set_int_val(), b/c that + function will try to call the + callback, etc */ + /** Actually, maybe not **/ + last_live_int = *value_ptr; + } + + user_id = id; + glui_format_str( buf, "RadioGroup: %p", this ); + set_name( buf.c_str() ); + callback = cb; + + parent->add_control( this ); + + init_live(); +} + + +/****************************** GLUI_RadioGroup::draw() **********/ + +void GLUI_RadioGroup::draw( int x, int y ) +{ + if ( NOT can_draw() ) + return; + + draw_group(false); +} + + +/********************* GLUI_RadioGroup::draw_group(int translate) **********/ + +void GLUI_RadioGroup::draw_group( int translate ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + GLUI_RadioButton *button; + this->int_val = int_val; + + glMatrixMode(GL_MODELVIEW ); + + button = (GLUI_RadioButton*) first_child(); + while( button != NULL ) { + glPushMatrix(); + if (translate) { + button->translate_to_origin(); + } + else { + glTranslatef(button->x_abs-x_abs, + button->y_abs-y_abs,0.0); + } + + if ( button->int_val ) + button->draw_checked(); + else + button->draw_unchecked(); + + glPopMatrix(); + + button = (GLUI_RadioButton*) button->next(); + } +} + + +/****************************** GLUI_RadioGroup::set_name() **********/ + +void GLUI_RadioGroup::set_name( const char *text ) +{ + name = text; + + if ( glui ) + glui->refresh(); +} + + +/********************************* GLUI_RadioGroup::set_selected() **********/ + +void GLUI_RadioGroup::set_selected( int int_val ) +{ + GLUI_RadioButton *button; + + this->int_val = int_val; + + button = (GLUI_RadioButton*) first_child(); + while( button != NULL ) { + if ( int_val == -1 ) { /*** All buttons in group are deselected ***/ + button->set_int_val(0); + } + else if ( int_val == button->user_id ) { /*** This is selected button ***/ + button->set_int_val(1); + } + else { /*** This is NOT selected button ***/ + button->set_int_val(0); + + } + button = (GLUI_RadioButton*) button->next(); + } + redraw(); +} + + +/************************ GLUI_RadioButton::GLUI_RadioButton() **********/ + +GLUI_RadioButton::GLUI_RadioButton( GLUI_RadioGroup *grp, const char *name ) +{ + common_init(); + + set_int_val( 0 ); + + /** A radio button's user id is always its ordinal number (zero-indexed) + within the group */ + user_id = grp->num_buttons; + set_name( name ); + group = grp; + + group->num_buttons++; /* Increments radiogroup's button count */ + group->add_control( this ); + + /*** Now update button states ***/ + group->set_int_val( group->int_val ); /* This tells the group to + reset itself to its + current value, thereby + updating all its buttons */ +} + + +/************************ GLUI_RadioButton::mouse_down_handler() **********/ + +int GLUI_RadioButton::mouse_down_handler( int local_x, int local_y ) +{ + if ( NOT group ) + return false; + + orig_value = group->int_val; + + currently_inside = true; + + group->set_selected( this->user_id ); + redraw(); + + return false; +} + +/********************** GLUI_RadioButton::mouse_held_down_handler() ******/ + +int GLUI_RadioButton::mouse_held_down_handler( int local_x, int local_y, + bool inside) +{ + if (inside != currently_inside) { + if (inside) group->set_selected( this->user_id ); + else group->set_selected( orig_value ); + currently_inside = inside; + redraw(); + } + + return false; +} + + +/*************************** GLUI_RadioButton::mouse_up_handler() **********/ + +int GLUI_RadioButton::mouse_up_handler( int local_x, int local_y, + bool inside ) +{ + if ( NOT group ) + return false; + + if ( NOT inside ) { + group->set_selected( orig_value ); + redraw(); + } + else { + /** Now we update the radio button group. We tell the group + handler to set the currently-selected item to this button, which + is reference by its user_id/ordinal number within group **/ + + group->set_selected( this->user_id ); + redraw(); + + /*** Now update the linked variable, and call the callback, + but ONLY if the value of the radio group actually changed ***/ + if ( group->int_val != orig_value ) { + group->output_live(true); /** Output live and update gfx ***/ + + group->execute_callback(); + } + } + + return false; +} + +/****************************** GLUI_RadioButton::draw() **********/ + +void GLUI_RadioButton::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + if ( NOT group OR NOT can_draw() ) + return; + + /*** See if we're the currently-selected button. If so, draw ***/ + if ( group->int_val == this->user_id ) { + if ( enabled ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON, 0, 0 ); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, 0, 0 ); + } + else { + if ( enabled ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF, 0, 0 ); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, 0, 0 ); + } + + draw_active_area(); + + draw_name( text_x_offset, 10 ); +} + + +/************************************ GLUI_RadioButton::draw_checked() ******/ + +void GLUI_RadioButton::draw_checked( void ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + if ( enabled ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON, 0, 0 ); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, 0, 0 ); + draw_active_area(); +} + + +/*********************************** GLUI_RadioButton::draw_unchecked() ******/ + +void GLUI_RadioButton::draw_unchecked( void ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + if ( enabled ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF, 0, 0 ); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, 0, 0 ); + draw_active_area(); +} + + +/**************************************** GLUI_RadioButton::draw_O() ********/ + +void GLUI_RadioButton::draw_O( void ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int i, j; + + glBegin( GL_POINTS ); + for(i=3; i<=GLUI_RADIOBUTTON_SIZE-3; i++ ) + for(j=3; j<=GLUI_RADIOBUTTON_SIZE-3; j++ ) + glVertex2i(i,j); + glEnd(); +} + + +/******************************** GLUI_RadioButton::update_size() **********/ + +void GLUI_RadioButton::update_size( void ) +{ + int text_size; + + if ( NOT glui ) + return; + + text_size = _glutBitmapWidthString( glui->font, name.c_str() ); + + /* if ( w < text_x_offset + text_size + 6 ) */ + w = text_x_offset + text_size + 6 ; +} + + +/************************* GLUI_RadioButton::draw_active_area() **************/ + +void GLUI_RadioButton::draw_active_area( void ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int text_width, left, right; + + text_width = _glutBitmapWidthString( glui->font, name.c_str() ); + left = text_x_offset-3; + right = left + 7 + text_width; + + if ( active ) { + glEnable( GL_LINE_STIPPLE ); + glLineStipple( 1, 0x5555 ); + glColor3f( 0., 0., 0. ); + } else { + glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); + } + + glBegin( GL_LINE_LOOP ); + glVertex2i(left,0); glVertex2i( right,0); + glVertex2i(right,h+1); glVertex2i( left,h+1); + glEnd(); + + glDisable( GL_LINE_STIPPLE ); +} + + +/********************************* GLUI_RadioGroup::set_int_val() **********/ + +void GLUI_RadioGroup::set_int_val( int new_val ) +{ + if ( new_val == int_val ) + return; + + set_selected( new_val ); + redraw(); + + output_live(true); + +} diff --git a/Extras/glui/glui_rollout.cpp b/Extras/glui/glui_rollout.cpp index f0aa7fc4e..d29e00641 100644 --- a/Extras/glui/glui_rollout.cpp +++ b/Extras/glui/glui_rollout.cpp @@ -1,275 +1,275 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_panel.cpp - GLUI_Panel control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -enum {rollout_height_pixels=GLUI_DEFAULT_CONTROL_HEIGHT + 7}; - -/****************************** GLUI_Rollout::GLUI_Rollout() **********/ - -GLUI_Rollout::GLUI_Rollout( GLUI_Node *parent, const char *name, - int open, int type ) -{ - common_init(); - set_name( name ); - user_id = -1; - int_val = type; - - if ( NOT open ) { - is_open = false; - h = rollout_height_pixels; - } - - parent->add_control( this ); -} - -/****************************** GLUI_Rollout::open() **********/ - -void GLUI_Rollout::open( void ) -{ - if ( NOT glui ) - return; - - if ( is_open ) - return; - is_open = true; - - GLUI_DRAWINGSENTINAL_IDIOM - - /* Copy hidden children into our private list "collapsed_node" */ - child_head = collapsed_node.child_head; - child_tail = collapsed_node.child_tail; - collapsed_node.child_head = NULL; - collapsed_node.child_tail = NULL; - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->unhide_internal( true ); - } - - glui->refresh(); -} - - -/****************************** GLUI_Rollout::close() **********/ - -void GLUI_Rollout::close( void ) -{ - if ( NOT glui ) - return; - - if ( NOT is_open ) - return; - is_open = false; - - GLUI_DRAWINGSENTINAL_IDIOM - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->hide_internal( true ); - } - - /* Move all children into a private list of hidden children */ - collapsed_node.child_head = first_child(); - collapsed_node.child_tail = last_child(); - child_head = NULL; - child_tail = NULL; - - this->h = rollout_height_pixels; - - glui->refresh(); -} - - -/**************************** GLUI_Rollout::mouse_down_handler() **********/ - - -int GLUI_Rollout::mouse_down_handler( int local_x, int local_y ) -{ - if ( local_y - y_abs > rollout_height_pixels ) { - initially_inside = currently_inside = false; - return false; - } - - currently_inside = true; - initially_inside = true; - redraw(); - - return false; -} - - -/**************************** GLUI_Rollout::mouse_held_down_handler() ****/ - -int GLUI_Rollout::mouse_held_down_handler( - int local_x, int local_y, - bool new_inside ) -{ - if ( NOT initially_inside ) - return false; - - if ( local_y - y_abs> rollout_height_pixels ) - new_inside = false; - - if (new_inside != currently_inside) { - currently_inside = new_inside; - redraw(); - } - - return false; -} - - -/**************************** GLUI_Rollout::mouse_down_handler() **********/ - -int GLUI_Rollout::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - if ( currently_inside ) { - if ( is_open ) - close(); - else - open(); - } - - currently_inside = false; - initially_inside = false; - redraw(); - - return false; -} - - -/********************************* GLUI_Rollout::draw() ***********/ - -void GLUI_Rollout::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - int left, right, top, bottom; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - - if ( is_open ) - draw_emboss_box( 0, w, top+3, h ); - else - draw_emboss_box( 0, w, top+3, h-7 ); - - glui->draw_raised_box( left, top, w-left*2, 16 ); - - if ( glui ) - glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+1, bottom-1 ); - glEnd(); - - draw_name( left+8, top+11 ); - - if ( active ) - /*draw_active_box( left+4, left+string_width( name.c_str() )+12, */ - draw_active_box( left+4, right-17, - top+2, bottom-2 ); - - - /** Draw '+' or '-' **/ - - glBegin( GL_LINES ); - if ( is_open ) { - if ( enabled ) glColor3f( 0.0, 0.0, 0.0 ); - else glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(right-14,(top+bottom)/2); glVertex2i(right-5,(top+bottom)/2); - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(right-14,1+(top+bottom)/2);glVertex2i(right-5,1+(top+bottom)/2); - } - else - { - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(right-9,top+3); glVertex2i(right-9,bottom-4); - glVertex2i(right-14,(top+bottom)/2); glVertex2i(right-5,(top+bottom)/2); - - if ( enabled ) glColor3f( 0.0, 0.0, 0.0 ); - else glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(right-14,-1+(top+bottom)/2); - glVertex2i(right-5,-1+(top+bottom)/2); - glVertex2i(right-10,top+3); - glVertex2i(right-10,bottom-4); - } - glEnd(); - - glLineWidth( 1.0 ); - - if (currently_inside) {draw_pressed(); /* heavy black outline when pressed */ } -} - - -/***************************** GLUI_Rollout::update_size() **********/ - -void GLUI_Rollout::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width(name); - - if ( w < text_size + 36 ) - w = text_size + 36; -} - - -/**************************** GLUI_Rollout::draw_pressed() ***********/ - -void GLUI_Rollout::draw_pressed( void ) -{ - int left, right, top, bottom; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - - - glColor3f( 0.0, 0.0, 0.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left, top ); glVertex2i( right, top ); - glVertex2i( right, bottom ); glVertex2i( left,bottom ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+1,bottom-1 ); - glEnd(); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_panel.cpp - GLUI_Panel control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +enum {rollout_height_pixels=GLUI_DEFAULT_CONTROL_HEIGHT + 7}; + +/****************************** GLUI_Rollout::GLUI_Rollout() **********/ + +GLUI_Rollout::GLUI_Rollout( GLUI_Node *parent, const char *name, + int open, int type ) +{ + common_init(); + set_name( name ); + user_id = -1; + int_val = type; + + if ( NOT open ) { + is_open = false; + h = rollout_height_pixels; + } + + parent->add_control( this ); +} + +/****************************** GLUI_Rollout::open() **********/ + +void GLUI_Rollout::open( void ) +{ + if ( NOT glui ) + return; + + if ( is_open ) + return; + is_open = true; + + GLUI_DRAWINGSENTINAL_IDIOM + + /* Copy hidden children into our private list "collapsed_node" */ + child_head = collapsed_node.child_head; + child_tail = collapsed_node.child_tail; + collapsed_node.child_head = NULL; + collapsed_node.child_tail = NULL; + + if ( child_head != NULL ) { + ((GLUI_Control*) child_head)->unhide_internal( true ); + } + + glui->refresh(); +} + + +/****************************** GLUI_Rollout::close() **********/ + +void GLUI_Rollout::close( void ) +{ + if ( NOT glui ) + return; + + if ( NOT is_open ) + return; + is_open = false; + + GLUI_DRAWINGSENTINAL_IDIOM + + if ( child_head != NULL ) { + ((GLUI_Control*) child_head)->hide_internal( true ); + } + + /* Move all children into a private list of hidden children */ + collapsed_node.child_head = first_child(); + collapsed_node.child_tail = last_child(); + child_head = NULL; + child_tail = NULL; + + this->h = rollout_height_pixels; + + glui->refresh(); +} + + +/**************************** GLUI_Rollout::mouse_down_handler() **********/ + + +int GLUI_Rollout::mouse_down_handler( int local_x, int local_y ) +{ + if ( local_y - y_abs > rollout_height_pixels ) { + initially_inside = currently_inside = false; + return false; + } + + currently_inside = true; + initially_inside = true; + redraw(); + + return false; +} + + +/**************************** GLUI_Rollout::mouse_held_down_handler() ****/ + +int GLUI_Rollout::mouse_held_down_handler( + int local_x, int local_y, + bool new_inside ) +{ + if ( NOT initially_inside ) + return false; + + if ( local_y - y_abs> rollout_height_pixels ) + new_inside = false; + + if (new_inside != currently_inside) { + currently_inside = new_inside; + redraw(); + } + + return false; +} + + +/**************************** GLUI_Rollout::mouse_down_handler() **********/ + +int GLUI_Rollout::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + if ( currently_inside ) { + if ( is_open ) + close(); + else + open(); + } + + currently_inside = false; + initially_inside = false; + redraw(); + + return false; +} + + +/********************************* GLUI_Rollout::draw() ***********/ + +void GLUI_Rollout::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + int left, right, top, bottom; + + left = 5; + right = w-left; + top = 3; + bottom = 3+16; + + if ( is_open ) + draw_emboss_box( 0, w, top+3, h ); + else + draw_emboss_box( 0, w, top+3, h-7 ); + + glui->draw_raised_box( left, top, w-left*2, 16 ); + + if ( glui ) + glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); + glVertex2i( right-1, bottom-1 ); glVertex2i( left+1, bottom-1 ); + glEnd(); + + draw_name( left+8, top+11 ); + + if ( active ) + /*draw_active_box( left+4, left+string_width( name.c_str() )+12, */ + draw_active_box( left+4, right-17, + top+2, bottom-2 ); + + + /** Draw '+' or '-' **/ + + glBegin( GL_LINES ); + if ( is_open ) { + if ( enabled ) glColor3f( 0.0, 0.0, 0.0 ); + else glColor3f( 0.5, 0.5, 0.5 ); + glVertex2i(right-14,(top+bottom)/2); glVertex2i(right-5,(top+bottom)/2); + + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i(right-14,1+(top+bottom)/2);glVertex2i(right-5,1+(top+bottom)/2); + } + else + { + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i(right-9,top+3); glVertex2i(right-9,bottom-4); + glVertex2i(right-14,(top+bottom)/2); glVertex2i(right-5,(top+bottom)/2); + + if ( enabled ) glColor3f( 0.0, 0.0, 0.0 ); + else glColor3f( 0.5, 0.5, 0.5 ); + glVertex2i(right-14,-1+(top+bottom)/2); + glVertex2i(right-5,-1+(top+bottom)/2); + glVertex2i(right-10,top+3); + glVertex2i(right-10,bottom-4); + } + glEnd(); + + glLineWidth( 1.0 ); + + if (currently_inside) {draw_pressed(); /* heavy black outline when pressed */ } +} + + +/***************************** GLUI_Rollout::update_size() **********/ + +void GLUI_Rollout::update_size( void ) +{ + int text_size; + + if ( NOT glui ) + return; + + text_size = string_width(name); + + if ( w < text_size + 36 ) + w = text_size + 36; +} + + +/**************************** GLUI_Rollout::draw_pressed() ***********/ + +void GLUI_Rollout::draw_pressed( void ) +{ + int left, right, top, bottom; + + left = 5; + right = w-left; + top = 3; + bottom = 3+16; + + + glColor3f( 0.0, 0.0, 0.0 ); + + glBegin( GL_LINE_LOOP ); + glVertex2i( left, top ); glVertex2i( right, top ); + glVertex2i( right, bottom ); glVertex2i( left,bottom ); + glEnd(); + + glBegin( GL_LINE_LOOP ); + glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); + glVertex2i( right-1, bottom-1 ); glVertex2i( left+1,bottom-1 ); + glEnd(); +} diff --git a/Extras/glui/glui_rotation.cpp b/Extras/glui/glui_rotation.cpp index 156543763..b02d74355 100644 --- a/Extras/glui/glui_rotation.cpp +++ b/Extras/glui/glui_rotation.cpp @@ -1,473 +1,473 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_rotation - GLUI_Rotation control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "arcball.h" -#include "algebra3.h" - -/*************************** GLUI_Rotation::iaction_mouse_down_handler() ***/ - -int GLUI_Rotation::iaction_mouse_down_handler( int local_x, int local_y ) -{ - copy_float_array_to_ball(); - - init_ball(); - - local_y = (int) floor(2.0 * ball->center[1] - local_y); - - ball->mouse_down( local_x, local_y ); - - /* printf( "%d %d - %f %f\n", local_x, local_y, ball->center[0], ball->center[1] ); */ - - copy_ball_to_float_array(); - - spinning = false; - - return false; -} - - -/*********************** GLUI_Rotation::iaction_mouse_up_handler() **********/ - -int GLUI_Rotation::iaction_mouse_up_handler( int local_x, int local_y, - bool inside ) -{ - copy_float_array_to_ball(); - - ball->mouse_up(); - - return false; -} - - -/******************* GLUI_Rotation::iaction_mouse_held_down_handler() ******/ - -int GLUI_Rotation::iaction_mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - if ( NOT glui ) - return 0; - - copy_float_array_to_ball(); - - local_y = (int) floor(2.0 * ball->center[1] - local_y); - - /* printf( "%d %d\n", local_x, local_y ); */ - - ball->mouse_motion( local_x, local_y, 0, - (glui->curr_modifiers & GLUT_ACTIVE_ALT) != 0, - (glui->curr_modifiers & GLUT_ACTIVE_CTRL) != 0 ); - - copy_ball_to_float_array(); - - if ( can_spin ) - spinning = true; - - return false; -} - - -/******************** GLUI_Rotation::iaction_draw_active_area_persp() **************/ - -void GLUI_Rotation::iaction_draw_active_area_persp( void ) -{ - /********** arcball *******/ - copy_float_array_to_ball(); - - setup_texture(); - setup_lights(); - - glEnable(GL_CULL_FACE ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - - mat4 tmp_rot = *ball->rot_ptr; - glMultMatrixf( (float*) &tmp_rot[0][0] ); - - /*** Draw the checkered box ***/ - /*glDisable( GL_TEXTURE_2D ); */ - draw_ball(1.35); // 1.96 ); - - glPopMatrix(); - - glBindTexture(GL_TEXTURE_2D,0); /* unhook our checkerboard texture */ - glDisable( GL_TEXTURE_2D ); - glDisable( GL_LIGHTING ); - glDisable( GL_CULL_FACE ); -} - - -/******************** GLUI_Rotation::iaction_draw_active_area_ortho() **********/ - -void GLUI_Rotation::iaction_draw_active_area_ortho( void ) -{ - float radius; - radius = (float)(h-22)/2.0; /*MIN((float)w/2.0, (float)h/2.0); */ - - /********* Draw emboss circles around arcball control *********/ - int k; - glLineWidth( 1.0 ); - glBegin( GL_LINE_LOOP); - for( k=0; k<60; k++ ) { - float phi = 2*M_PI*(float)k/60.0; - vec2 p( cos(phi) * (2.0 + radius), sin(phi) * (2.0 + radius)); - if ( p[1] < -p[0] ) glColor3ub( 128,128,128 ); - else glColor3ub( 255,255,255 ); - glVertex2fv((float*)&p[0]); - } - glEnd(); - - glBegin( GL_LINE_LOOP); - for( k=0; k<60; k++ ) { - float phi = 2*M_PI*(float)k/60.0; - vec2 p( cos(phi) * (1.0 + radius), sin(phi) * (1.0 + radius)); - if ( enabled ) { - if ( p[1] < -p[0] ) glColor3ub( 0,0,0); - else glColor3ub( 192,192,192); - } - else - { - if ( p[1] < -p[0] ) glColor3ub( 180,180,180); - else glColor3ub( 192,192,192); - } - glVertex2fv((float*)&p[0]); - } - glEnd(); -} - - -/******************************** GLUI_Rotation::iaction_dump() **********/ - -void GLUI_Rotation::iaction_dump( FILE *output ) -{ -} - - -/******************** GLUI_Rotation::iaction_special_handler() **********/ - -int GLUI_Rotation::iaction_special_handler( int key,int modifiers ) -{ - - return false; -} - -/********************************** GLUI_Rotation::init_ball() **********/ - -void GLUI_Rotation::init_ball( void ) -{ - /*printf( "%f %f %f", float( MIN(w/2,h/2)), (float) w/2, (float) h/2 ); */ - - ball->set_params( vec2( (float)(w/2), (float)((h-18)/2)), - (float) 2.0*(h-18) ); - /*ball->set_damping( .05 ); */ - /*float( MIN(w/2,h/2))*2.0 ); */ - /* ball->reset_mouse(); */ -} - - -/****************************** GLUI_Rotation::setup_texture() *********/ - -void GLUI_Rotation::setup_texture( void ) -{ - static GLuint tex=0u; - GLenum t=GL_TEXTURE_2D; - glEnable(t); - glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glColor3f( 1.0, 1.0, 1.0 ); - if (tex!=0u) { - /* (OSL 2006/06) Just use glBindTexture to avoid having to re-upload the whole checkerboard every frame. */ - glBindTexture(t,tex); - return; - } /* Else need to make a new checkerboard texture */ - glGenTextures(1,&tex); - glBindTexture(t,tex); - glEnable(t); - - unsigned int i, j; - int dark, light; /*** Dark and light colors for ball checkerboard ***/ - -/* Note: you can change the number of checkers across there sphere in draw_ball */ -#define CHECKBOARD_SIZE 64 /* pixels across whole texture */ -#define CHECKBOARD_REPEAT 32u /* pixels across one black/white sector */ - unsigned char texture_image[CHECKBOARD_SIZE] [CHECKBOARD_SIZE] [3]; - unsigned char c; - for( i=0; iinit(); /** reset quaternion, etc. **/ - ball->set_params( vec2( (float)(w/2), (float)((h-18)/2)), - (float) 2.0*(h-18) ); - - set_spin( this->damping ); - - copy_ball_to_float_array(); - - translate_and_draw_front(); - - output_live(true); /*** Output live and draw main grx window ***/ -} - - -/****************************** GLUI_Rotation::needs_idle() *********/ - -bool GLUI_Rotation::needs_idle( void ) const -{ - return can_spin; -} - - -/****************************** GLUI_Rotation::idle() ***************/ - -void GLUI_Rotation::idle( void ) -{ - spinning = ball->is_spinning?true:false; - - if ( can_spin AND spinning ) { - copy_float_array_to_ball(); - ball->idle(); - - *ball->rot_ptr = *ball->rot_ptr * ball->rot_increment; - - mat4 tmp_rot; - tmp_rot = *ball->rot_ptr; - - copy_ball_to_float_array(); - - draw_active_area_only = true; - translate_and_draw_front(); - draw_active_area_only = false; - - output_live(true); /** output live and update gfx **/ - } - else { - } -} - - -/********************** GLUI_Rotation::copy_float_array_to_ball() *********/ - -void GLUI_Rotation::copy_float_array_to_ball( void ) -{ - int i; - float *fp_src, *fp_dst; - - fp_src = &float_array_val[0]; - fp_dst = &((*ball->rot_ptr)[0][0]); - - for( i=0; i<16; i++ ) { - *fp_dst = *fp_src; - - fp_src++; - fp_dst++; - } -} - - -/********************** GLUI_Rotation::copy_ball_to_float_array() *********/ - -void GLUI_Rotation::copy_ball_to_float_array( void ) -{ - mat4 tmp_rot; - tmp_rot = *ball->rot_ptr; - - set_float_array_val( (float*) &tmp_rot[0][0] ); -} - - -/************************ GLUI_Rotation::set_spin() **********************/ - -void GLUI_Rotation::set_spin( float damp_factor ) -{ - if ( damp_factor == 0.0 ) - can_spin = false; - else - can_spin = true; - - ball->set_damping( 1.0 - damp_factor ); - - this->damping = damp_factor; -} - - -/************** GLUI_Rotation::GLUI_Rotation() ********************/ - -GLUI_Rotation::GLUI_Rotation( GLUI_Node *parent, - const char *name, float *value_ptr, - int id, - GLUI_CB cb ) -{ - common_init(); - set_ptr_val( value_ptr ); - user_id = id; - set_name( name ); - callback = cb; - parent->add_control( this ); - init_live(); - - /*** Init the live 4x4 matrix. This is different than the standard - live variable behavior, since the original value of the 4x4 matrix - is ignored and reset to Identity ***/ -/* -NO! WVB - if ( value_ptr != NULL ) { - int i, j, index; - for( i=0; i<4; i++ ) { - for( j=0; j<4; j++ ) { - index = i*4+j; - if ( i==j ) - value_ptr[index] = 1.0; - else - value_ptr[index] = 0.0; - } - } - } -*/ - /*init_ball(); */ - - -} - - -/************** GLUI_Rotation::common_init() ********************/ - -void GLUI_Rotation::common_init( void ) -{ - glui_format_str( name, "Rotation: %p", this ); -// type = GLUI_CONTROL_ROTATION; - w = GLUI_ROTATION_WIDTH; - h = GLUI_ROTATION_HEIGHT; - can_activate = true; - live_type = GLUI_LIVE_FLOAT_ARRAY; - float_array_size = 16; - quadObj = NULL; - alignment = GLUI_ALIGN_CENTER; - can_spin = false; - spinning = false; - damping = 0.0; - ball = new Arcball; - - reset(); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_rotation - GLUI_Rotation control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "GL/glui.h" +#include "arcball.h" +#include "algebra3.h" + +/*************************** GLUI_Rotation::iaction_mouse_down_handler() ***/ + +int GLUI_Rotation::iaction_mouse_down_handler( int local_x, int local_y ) +{ + copy_float_array_to_ball(); + + init_ball(); + + local_y = (int) floor(2.0 * ball->center[1] - local_y); + + ball->mouse_down( local_x, local_y ); + + /* printf( "%d %d - %f %f\n", local_x, local_y, ball->center[0], ball->center[1] ); */ + + copy_ball_to_float_array(); + + spinning = false; + + return false; +} + + +/*********************** GLUI_Rotation::iaction_mouse_up_handler() **********/ + +int GLUI_Rotation::iaction_mouse_up_handler( int local_x, int local_y, + bool inside ) +{ + copy_float_array_to_ball(); + + ball->mouse_up(); + + return false; +} + + +/******************* GLUI_Rotation::iaction_mouse_held_down_handler() ******/ + +int GLUI_Rotation::iaction_mouse_held_down_handler( int local_x, int local_y, + bool inside) +{ + if ( NOT glui ) + return 0; + + copy_float_array_to_ball(); + + local_y = (int) floor(2.0 * ball->center[1] - local_y); + + /* printf( "%d %d\n", local_x, local_y ); */ + + ball->mouse_motion( local_x, local_y, 0, + (glui->curr_modifiers & GLUT_ACTIVE_ALT) != 0, + (glui->curr_modifiers & GLUT_ACTIVE_CTRL) != 0 ); + + copy_ball_to_float_array(); + + if ( can_spin ) + spinning = true; + + return false; +} + + +/******************** GLUI_Rotation::iaction_draw_active_area_persp() **************/ + +void GLUI_Rotation::iaction_draw_active_area_persp( void ) +{ + /********** arcball *******/ + copy_float_array_to_ball(); + + setup_texture(); + setup_lights(); + + glEnable(GL_CULL_FACE ); + + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + + mat4 tmp_rot = *ball->rot_ptr; + glMultMatrixf( (float*) &tmp_rot[0][0] ); + + /*** Draw the checkered box ***/ + /*glDisable( GL_TEXTURE_2D ); */ + draw_ball(1.35); // 1.96 ); + + glPopMatrix(); + + glBindTexture(GL_TEXTURE_2D,0); /* unhook our checkerboard texture */ + glDisable( GL_TEXTURE_2D ); + glDisable( GL_LIGHTING ); + glDisable( GL_CULL_FACE ); +} + + +/******************** GLUI_Rotation::iaction_draw_active_area_ortho() **********/ + +void GLUI_Rotation::iaction_draw_active_area_ortho( void ) +{ + float radius; + radius = (float)(h-22)/2.0; /*MIN((float)w/2.0, (float)h/2.0); */ + + /********* Draw emboss circles around arcball control *********/ + int k; + glLineWidth( 1.0 ); + glBegin( GL_LINE_LOOP); + for( k=0; k<60; k++ ) { + float phi = 2*M_PI*(float)k/60.0; + vec2 p( cos(phi) * (2.0 + radius), sin(phi) * (2.0 + radius)); + if ( p[1] < -p[0] ) glColor3ub( 128,128,128 ); + else glColor3ub( 255,255,255 ); + glVertex2fv((float*)&p[0]); + } + glEnd(); + + glBegin( GL_LINE_LOOP); + for( k=0; k<60; k++ ) { + float phi = 2*M_PI*(float)k/60.0; + vec2 p( cos(phi) * (1.0 + radius), sin(phi) * (1.0 + radius)); + if ( enabled ) { + if ( p[1] < -p[0] ) glColor3ub( 0,0,0); + else glColor3ub( 192,192,192); + } + else + { + if ( p[1] < -p[0] ) glColor3ub( 180,180,180); + else glColor3ub( 192,192,192); + } + glVertex2fv((float*)&p[0]); + } + glEnd(); +} + + +/******************************** GLUI_Rotation::iaction_dump() **********/ + +void GLUI_Rotation::iaction_dump( FILE *output ) +{ +} + + +/******************** GLUI_Rotation::iaction_special_handler() **********/ + +int GLUI_Rotation::iaction_special_handler( int key,int modifiers ) +{ + + return false; +} + +/********************************** GLUI_Rotation::init_ball() **********/ + +void GLUI_Rotation::init_ball( void ) +{ + /*printf( "%f %f %f", float( MIN(w/2,h/2)), (float) w/2, (float) h/2 ); */ + + ball->set_params( vec2( (float)(w/2), (float)((h-18)/2)), + (float) 2.0*(h-18) ); + /*ball->set_damping( .05 ); */ + /*float( MIN(w/2,h/2))*2.0 ); */ + /* ball->reset_mouse(); */ +} + + +/****************************** GLUI_Rotation::setup_texture() *********/ + +void GLUI_Rotation::setup_texture( void ) +{ + static GLuint tex=0u; + GLenum t=GL_TEXTURE_2D; + glEnable(t); + glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + glColor3f( 1.0, 1.0, 1.0 ); + if (tex!=0u) { + /* (OSL 2006/06) Just use glBindTexture to avoid having to re-upload the whole checkerboard every frame. */ + glBindTexture(t,tex); + return; + } /* Else need to make a new checkerboard texture */ + glGenTextures(1,&tex); + glBindTexture(t,tex); + glEnable(t); + + unsigned int i, j; + int dark, light; /*** Dark and light colors for ball checkerboard ***/ + +/* Note: you can change the number of checkers across there sphere in draw_ball */ +#define CHECKBOARD_SIZE 64 /* pixels across whole texture */ +#define CHECKBOARD_REPEAT 32u /* pixels across one black/white sector */ + unsigned char texture_image[CHECKBOARD_SIZE] [CHECKBOARD_SIZE] [3]; + unsigned char c; + for( i=0; iinit(); /** reset quaternion, etc. **/ + ball->set_params( vec2( (float)(w/2), (float)((h-18)/2)), + (float) 2.0*(h-18) ); + + set_spin( this->damping ); + + copy_ball_to_float_array(); + + translate_and_draw_front(); + + output_live(true); /*** Output live and draw main grx window ***/ +} + + +/****************************** GLUI_Rotation::needs_idle() *********/ + +bool GLUI_Rotation::needs_idle( void ) const +{ + return can_spin; +} + + +/****************************** GLUI_Rotation::idle() ***************/ + +void GLUI_Rotation::idle( void ) +{ + spinning = ball->is_spinning?true:false; + + if ( can_spin AND spinning ) { + copy_float_array_to_ball(); + ball->idle(); + + *ball->rot_ptr = *ball->rot_ptr * ball->rot_increment; + + mat4 tmp_rot; + tmp_rot = *ball->rot_ptr; + + copy_ball_to_float_array(); + + draw_active_area_only = true; + translate_and_draw_front(); + draw_active_area_only = false; + + output_live(true); /** output live and update gfx **/ + } + else { + } +} + + +/********************** GLUI_Rotation::copy_float_array_to_ball() *********/ + +void GLUI_Rotation::copy_float_array_to_ball( void ) +{ + int i; + float *fp_src, *fp_dst; + + fp_src = &float_array_val[0]; + fp_dst = &((*ball->rot_ptr)[0][0]); + + for( i=0; i<16; i++ ) { + *fp_dst = *fp_src; + + fp_src++; + fp_dst++; + } +} + + +/********************** GLUI_Rotation::copy_ball_to_float_array() *********/ + +void GLUI_Rotation::copy_ball_to_float_array( void ) +{ + mat4 tmp_rot; + tmp_rot = *ball->rot_ptr; + + set_float_array_val( (float*) &tmp_rot[0][0] ); +} + + +/************************ GLUI_Rotation::set_spin() **********************/ + +void GLUI_Rotation::set_spin( float damp_factor ) +{ + if ( damp_factor == 0.0 ) + can_spin = false; + else + can_spin = true; + + ball->set_damping( 1.0 - damp_factor ); + + this->damping = damp_factor; +} + + +/************** GLUI_Rotation::GLUI_Rotation() ********************/ + +GLUI_Rotation::GLUI_Rotation( GLUI_Node *parent, + const char *name, float *value_ptr, + int id, + GLUI_CB cb ) +{ + common_init(); + set_ptr_val( value_ptr ); + user_id = id; + set_name( name ); + callback = cb; + parent->add_control( this ); + init_live(); + + /*** Init the live 4x4 matrix. This is different than the standard + live variable behavior, since the original value of the 4x4 matrix + is ignored and reset to Identity ***/ +/* +NO! WVB + if ( value_ptr != NULL ) { + int i, j, index; + for( i=0; i<4; i++ ) { + for( j=0; j<4; j++ ) { + index = i*4+j; + if ( i==j ) + value_ptr[index] = 1.0; + else + value_ptr[index] = 0.0; + } + } + } +*/ + /*init_ball(); */ + + +} + + +/************** GLUI_Rotation::common_init() ********************/ + +void GLUI_Rotation::common_init( void ) +{ + glui_format_str( name, "Rotation: %p", this ); +// type = GLUI_CONTROL_ROTATION; + w = GLUI_ROTATION_WIDTH; + h = GLUI_ROTATION_HEIGHT; + can_activate = true; + live_type = GLUI_LIVE_FLOAT_ARRAY; + float_array_size = 16; + quadObj = NULL; + alignment = GLUI_ALIGN_CENTER; + can_spin = false; + spinning = false; + damping = 0.0; + ball = new Arcball; + + reset(); +} diff --git a/Extras/glui/glui_scrollbar.cpp b/Extras/glui/glui_scrollbar.cpp index 9540d4079..f0fb13702 100644 --- a/Extras/glui/glui_scrollbar.cpp +++ b/Extras/glui/glui_scrollbar.cpp @@ -1,832 +1,832 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_scrollbar.cpp - GLUI_Scrollbar class - - -------------------------------------------------- - - Copyright (c) 2004 John Kew, 1998 Paul Rademacher - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include -#include - -/*static int __debug=0; */ - -#define GLUI_SCROLL_GROWTH_STEPS 800 -#define GLUI_SCROLL_MIN_GROWTH_STEPS 100 -#define GLUI_SCROLL_CALLBACK_INTERVAL 1 /* Execute the user's callback every this many clicks */ - -enum { - GLUI_SCROLL_ARROW_UP, - GLUI_SCROLL_ARROW_DOWN, - GLUI_SCROLL_ARROW_LEFT, - GLUI_SCROLL_ARROW_RIGHT -}; - - -/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ -// Constructor, no live var -GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, - const char *name, - int horz_vert, - int data_type, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ) -{ - common_construct(parent, name, horz_vert, data_type, NULL, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ -// Constructor, int live var -GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, const char *name, - int horz_vert, - int *live_var, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ) -{ - common_construct(parent, name, horz_vert, GLUI_SCROLL_INT, live_var, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ -// Constructor, float live var -GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, const char *name, - int horz_vert, - float *live_var, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ) -{ - common_construct(parent, name, horz_vert, GLUI_SCROLL_FLOAT, live_var, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_Scrollbar::common_init() **********/ -void GLUI_Scrollbar::common_init(void) -{ - horizontal = true; - h = GLUI_SCROLL_ARROW_HEIGHT; - w = GLUI_TEXTBOX_WIDTH; - alignment = GLUI_ALIGN_CENTER; - x_off = 0; - y_off_top = 0; - y_off_bot = 0; - can_activate = true; - state = GLUI_SCROLL_STATE_NONE; - growth_exp = GLUI_SCROLL_DEFAULT_GROWTH_EXP; - callback_count = 0; - first_callback = true; - user_speed = 1.0; - float_min = 0.0; - float_max = 0.0; - int_min = 0; - int_max = 0; - associated_object = NULL; - last_update_time=0; - velocity_limit=50.0; /* Change value by at most 50 per second */ - box_length = 0; - box_start_position = 0; - box_end_position = 0; - track_length = 0; -} - -/****************************** GLUI_Scrollbar::common_construct() **********/ -void GLUI_Scrollbar::common_construct( - GLUI_Node *parent, - const char *name, - int horz_vert, - int data_type, - void *data, - int id, GLUI_CB callback - /*,GLUI_Control *object, - GLUI_InterObject_CB obj_cb*/ - ) -{ - common_init(); - - // make sure limits are wide enough to hold live value - if (data_type==GLUI_SCROLL_FLOAT) { - float lo = 0.0f, hi=1.0f; - if (data) { - float d = *(float*)(data); - lo = MIN(lo, d); - hi = MAX(hi, d); - } - this->set_float_limits(lo,hi); - this->set_float_val(lo); - this->live_type = GLUI_LIVE_FLOAT; - } else { - int lo = 0, hi=100; - if (data) { - int d = *(int*)(data); - lo = MIN(lo, d); - hi = MAX(hi, d); - } - this->set_int_limits(lo,hi); - this->set_int_val(0); - this->live_type = GLUI_LIVE_INT; - } - this->data_type = data_type; - this->set_ptr_val( data ); - this->set_name(name); - this->user_id = id; - this->callback = callback; - //this->associated_object = object; - //this->object_cb = obj_cb; - this->horizontal=(horz_vert==GLUI_SCROLL_HORIZONTAL); - if (this->horizontal) { - this->h = GLUI_SCROLL_ARROW_HEIGHT; - this->w = GLUI_TEXTBOX_WIDTH; - } else { - this->h = GLUI_TEXTBOX_HEIGHT; - this->w = GLUI_SCROLL_ARROW_WIDTH; - } - parent->add_control( this ); - this->init_live(); -} - -/****************************** GLUI_Scrollbar::mouse_down_handler() **********/ - -int GLUI_Scrollbar::mouse_down_handler( int local_x, int local_y ) -{ - last_update_time=GLUI_Time()-1.0; - this->state = find_arrow( local_x, local_y ); - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf( "spinner: mouse down : %d/%d arrow:%d\n", local_x, local_y, - find_arrow( local_x, local_y )); - */ - - if ( state != GLUI_SCROLL_STATE_UP AND state != GLUI_SCROLL_STATE_DOWN) - return true; - - reset_growth(); - - /*** ints and floats behave a bit differently. When you click on - an int spinner, you expect the value to immediately go up by 1, whereas - for a float it'll go up only by a fractional amount. Therefore, we - go ahead and increment by one for int spinners ***/ -#if 1 - if ( data_type == GLUI_SCROLL_INT ) { - // Allow for possibility of reversed limits - int lo = MIN(int_min,int_max); - int hi = MAX(int_min,int_max); - int increase = int_min < int_max ? 1 : -1; - int new_val = int_val; - if ( state == GLUI_SCROLL_STATE_UP ) { - new_val += increase; - } else if ( state == GLUI_SCROLL_STATE_DOWN ) { - new_val -= increase; - } - if (new_val >= lo && new_val <= hi && new_val!=int_val) { - set_int_val(new_val); - do_callbacks(); - } - } -#endif - do_click(); - redraw(); - - return false; -} - - -/******************************** GLUI_Scrollbar::mouse_up_handler() **********/ - -int GLUI_Scrollbar::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - state = GLUI_SCROLL_STATE_NONE; - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf("spinner: mouse up : %d/%d inside: %d\n",local_x,local_y,inside); */ - - /*glutSetCursor( GLUT_CURSOR_INHERIT ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - - redraw(); - - /* do_callbacks(); --- stub */ - /* if ( callback ) */ - /* callback( this->user_id ); */ - - return false; -} - - -/***************************** GLUI_Scrollbar::mouse_held_down_handler() ******/ - -int GLUI_Scrollbar::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int new_state; - if ( state == GLUI_SCROLL_STATE_NONE ) - return false; - - /* printf("spinner: mouse held: %d/%d inside: %d\n",local_x,local_y, - new_inside); - */ - - if ( state == GLUI_SCROLL_STATE_SCROLL) { /* dragging? */ - do_drag( local_x-x_abs, local_y-y_abs ); - } - else { /* not dragging */ - new_state = find_arrow( local_x, local_y ); - - if ( new_state == state ) { - /** Still in same arrow **/ - do_click(); - } - } - redraw(); - - return false; -} - - -/****************************** GLUI_Scrollbar::key_handler() **********/ - -int GLUI_Scrollbar::key_handler( unsigned char key,int modifiers ) -{ - return true; -} - - -/****************************** GLUI_Scrollbar::draw() **********/ - -void GLUI_Scrollbar::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( horizontal ) { - draw_scroll_arrow(GLUI_SCROLL_ARROW_LEFT, 0, 0); - draw_scroll_arrow(GLUI_SCROLL_ARROW_RIGHT, w-GLUI_SCROLL_ARROW_WIDTH, 0); - } else { - draw_scroll_arrow(GLUI_SCROLL_ARROW_UP, 0, 0); - draw_scroll_arrow(GLUI_SCROLL_ARROW_DOWN, 0, h-GLUI_SCROLL_ARROW_HEIGHT); - } - draw_scroll(); -} - - -/****************************** GLUI_Scrollbar::draw_scroll_arrow() **********/ - -void GLUI_Scrollbar::draw_scroll_arrow(int arrowtype, int x, int y) -{ - float offset=0; - float L=3.5f,HC=7.f,R=10.5f; - float T=4.5f,VC=8.f,B=11.5; - const float verts[][6]={ - { L,10.5f, R, 10.5f, HC, 6.5f }, // up arrow - { L,6.5f, R, 6.5f, HC,10.5f }, // down arrow - { R-2,T, R-2, B, L+1, VC }, // left arrow - { L+2,T, L+2, B, R-1, VC } // right arrow - }; - - const float *tri = NULL; - - switch (arrowtype) - { - case GLUI_SCROLL_ARROW_UP: - tri = verts[0]; - if (state & GLUI_SCROLL_STATE_UP) offset = 1; - break; - - case GLUI_SCROLL_ARROW_DOWN: - tri = verts[1]; - if (state & GLUI_SCROLL_STATE_DOWN) offset = 1; - break; - - case GLUI_SCROLL_ARROW_LEFT: - tri = verts[2]; - if (state & GLUI_SCROLL_STATE_DOWN) offset = 1; - break; - - case GLUI_SCROLL_ARROW_RIGHT: - tri = verts[3]; - if (state & GLUI_SCROLL_STATE_UP) offset = 1; - break; - - default: - return; /* tri is NULL */ - } - - glColor3ubv(&glui->bkgd_color.r); - glRecti(x,y,x+GLUI_SCROLL_ARROW_WIDTH,y+GLUI_SCROLL_ARROW_HEIGHT); - if (!offset) { - glui->draw_raised_box(x,y+1,GLUI_SCROLL_ARROW_WIDTH-1,GLUI_SCROLL_ARROW_HEIGHT-1); - } else { - glColor3ub(128,128,128); - glBegin(GL_LINE_LOOP); - int x2=x+GLUI_SCROLL_ARROW_WIDTH, y2=y+GLUI_SCROLL_ARROW_HEIGHT; - glVertex2i(x ,y); - glVertex2i(x2,y); - glVertex2i(x2,y2); - glVertex2i(x ,y2); - glEnd(); - } - - GLubyte black[]={0,0,0}; - GLubyte white[]={255,255,255}; - GLubyte gray[]={128,128,128}; - GLubyte *color=black; - if (!enabled) { - offset = 1; - color = white; - } - glTranslatef(x+offset,y+offset,0); - glColor3ubv(color); - glBegin(GL_TRIANGLES); - glVertex2fv(tri); glVertex2fv(tri+2), glVertex2fv(tri+4); - glEnd(); - glTranslatef(-(x+offset),-(y+offset),0); - - if (!enabled) { // once more! - glTranslatef(x,y,0); - glColor3ubv(gray); - glBegin(GL_TRIANGLES); - glVertex2fv(tri); glVertex2fv(tri+2), glVertex2fv(tri+4); - glEnd(); - glTranslatef(-x,-y,0); - } -} - - -void GLUI_Scrollbar::draw_scroll() { - update_scroll_parameters(); - - // Draw track using a checkerboard background - const unsigned char scroll_bg[] = { - 0xD4, 0xD0, 0xC8, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xD4, 0xD0, 0xC8 - }; - glColor3f( 1.0, 1.0, 1.0 ); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - glEnable( GL_TEXTURE_2D); - glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, - scroll_bg); - - float y0 = horizontal? 0 : GLUI_SCROLL_ARROW_HEIGHT; - float y1 = horizontal? h : h-GLUI_SCROLL_ARROW_HEIGHT; - float x0 = horizontal? GLUI_SCROLL_ARROW_WIDTH : 0; - float x1 = horizontal? w-GLUI_SCROLL_ARROW_WIDTH : w; - x0-=0.5; y0+=0.5; - x1-=0.5; y1+=0.5; - float dy = y1-y0; - float dx = x1-x0; - glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex2f(x0,y0); - glTexCoord2f(dx*0.5f,0); glVertex2f(x1,y0); - glTexCoord2f(dx*0.5f,dy*0.5f); glVertex2f(x1,y1); - glTexCoord2f(0, dy*0.5f); glVertex2f(x0,y1); - glEnd(); - glDisable(GL_TEXTURE_2D); - - // Draw scroll box - int box = box_start_position; - if (horizontal) { - box += GLUI_SCROLL_ARROW_WIDTH; - draw_scroll_box(box,1,box_length,h); - } else { - box += GLUI_SCROLL_ARROW_HEIGHT+1; - draw_scroll_box(0,box,w,box_length); - } -} - -/****************************** GLUI_Scrollbar::draw_scroll_box() **********/ - -void GLUI_Scrollbar::draw_scroll_box(int x, int y, int w, int h) -{ - if (!enabled) return; - glColor3ubv(&glui->bkgd_color.r); - glRecti(x,y,x+w,y+h); - glui->draw_raised_box(x,y, w-1, h-1); - - if (active) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - glBegin(GL_LINE_LOOP); - int x1 = x+2, y1 = y+2, x2 = x+w-4, y2 = y+h-4; - glVertex2i(x1,y1); - glVertex2i(x2,y1); - glVertex2i(x2,y2); - glVertex2i(x1,y2); - glEnd(); - glDisable( GL_LINE_STIPPLE ); - } -} - - - -/**************************** update_scroll_parameters ***********/ - -void GLUI_Scrollbar::update_scroll_parameters() { - track_length = horizontal? - this->w-GLUI_SCROLL_ARROW_WIDTH*2 : - this->h-GLUI_SCROLL_ARROW_HEIGHT*2; - if (data_type==GLUI_SCROLL_INT) - { - if (int_max==int_min) - box_length=track_length; - else { - const int MIN_TAB = GLUI_SCROLL_BOX_STD_HEIGHT; - //box_length = int(track_length/float(visible_range)); - //if (box_length < MIN_TAB) - box_length = MIN_TAB; - } - float pixels_per_unit = (track_length-box_length)/float(int_max-int_min); - if (horizontal) - box_start_position = int((int_val-int_min)*pixels_per_unit); - else - box_start_position = int((int_max-int_val)*pixels_per_unit); - box_end_position = box_start_position+box_length; - } - else if (data_type==GLUI_SCROLL_FLOAT) - { - if (float_max==float_min) - box_length=track_length; - else { - box_length = GLUI_SCROLL_BOX_STD_HEIGHT; - } - float pixels_per_unit = (track_length-box_length)/float(float_max-float_min); - if (horizontal) - box_start_position = int((float_val-float_min)*pixels_per_unit); - else - box_start_position = int((float_max-float_val)*pixels_per_unit); - box_end_position = box_start_position+box_length; - } -} - - -/********************************* GLUI_Scrollbar::special_handler() **********/ - -int GLUI_Scrollbar::special_handler( int key,int modifiers ) -{ - if ( !horizontal && key == GLUT_KEY_UP ) { - mouse_down_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs + 1 ); - mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs + 1, true ); - } - else if ( !horizontal && key == GLUT_KEY_DOWN ) { - mouse_down_handler(x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1+GLUI_SCROLL_ARROW_HEIGHT); - mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1 +GLUI_SCROLL_ARROW_HEIGHT, - true ); - } - if ( horizontal && key == GLUT_KEY_LEFT ) { - mouse_down_handler( x_abs + 1,y_abs + 1 ); - mouse_up_handler( x_abs + 1, y_abs + 1, true ); - } - else if ( horizontal && key == GLUT_KEY_RIGHT ) { - mouse_down_handler(x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1); - mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1, - true ); - } - else if ( key == GLUT_KEY_HOME ) { /** Set value to limit top - - or increment by 10 **/ - } - else if ( key == GLUT_KEY_END ) { - } - - return true; -} - - -/************************************ GLUI_Scrollbar::update_size() **********/ - -void GLUI_Scrollbar::update_size( void ) -{ - if (horizontal) { - h = GLUI_SCROLL_ARROW_HEIGHT; - if (associated_object) { - this->w = ((GLUI_Control *)associated_object)->w; - } - } - else { - w = GLUI_SCROLL_ARROW_WIDTH; - if (associated_object) { - this->h = ((GLUI_Control *)associated_object)->h; - } - } -} - - -/************************************ GLUI_Scrollbar::find_arrow() ************/ - -int GLUI_Scrollbar::find_arrow( int local_x, int local_y ) -{ - - local_x = local_x-x_abs; - local_y = local_y-y_abs; - - if (horizontal) - { - if ( local_y >= h-GLUI_SCROLL_ARROW_HEIGHT-3 && local_y <= h) - { - update_scroll_parameters(); - if ( local_x >= 0 AND local_x <= (GLUI_SCROLL_ARROW_WIDTH+box_start_position) ) - { - return GLUI_SCROLL_STATE_DOWN; - } - if ( local_x >= (GLUI_SCROLL_ARROW_WIDTH+box_end_position) - AND local_x <= (w+GLUI_SCROLL_ARROW_WIDTH) ) - { - return GLUI_SCROLL_STATE_UP; - } - return GLUI_SCROLL_STATE_SCROLL; - } - } - else - { - if ( local_x >= w-GLUI_SCROLL_ARROW_WIDTH-3 && local_x <= w) - { - update_scroll_parameters(); - if ( local_y >= 0 AND local_y <= (GLUI_SCROLL_ARROW_HEIGHT+box_start_position) ) - { - return GLUI_SCROLL_STATE_UP; - } - if ( local_y >= (GLUI_SCROLL_ARROW_HEIGHT+box_end_position) - AND local_y <= (h+GLUI_SCROLL_ARROW_HEIGHT) ) - { - return GLUI_SCROLL_STATE_DOWN; - } - return GLUI_SCROLL_STATE_SCROLL; - } - } - - return GLUI_SCROLL_STATE_NONE; -} - -/***************************************** GLUI_Scrollbar::do_click() **********/ - -void GLUI_Scrollbar::do_click( void ) -{ - int direction = 0; - - if ( state == GLUI_SCROLL_STATE_UP ) - direction = +1; - else if ( state == GLUI_SCROLL_STATE_DOWN ) - direction = -1; - - if (data_type==GLUI_SCROLL_INT&&int_min>int_max) direction*=-1; - if (data_type==GLUI_SCROLL_FLOAT&&float_min>float_max) direction*=-1; - - increase_growth(); - - float modifier_factor = 1.0; - float incr = growth * modifier_factor * user_speed ; - - double frame_time=GLUI_Time()-last_update_time; - double frame_limit=velocity_limit*frame_time; - if (incr>frame_limit) incr=frame_limit; /* don't scroll faster than limit */ - last_update_time=GLUI_Time(); - - float new_val = float_val; - - new_val += direction * incr; - if (1 || data_type==GLUI_SCROLL_FLOAT) set_float_val(new_val); - if (0 && data_type==GLUI_SCROLL_INT) set_int_val((int)new_val); - //printf("do_click: incr %f val=%f float_val=%f\n",incr,new_val,float_val); - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SCROLL_CALLBACK_INTERVAL ****/ - callback_count++; - if ( (callback_count % GLUI_SCROLL_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); - -} - - -/***************************************** GLUI_Scrollbar::do_drag() **********/ - -void GLUI_Scrollbar::do_drag( int x, int y ) -{ - int direction = 0; - float incr, modifier_factor; - /* int delta_x; */ - int new_int_val = int_val; - float new_float_val = float_val; - - int free_len = track_length-box_length; - if (free_len == 0) return; - - modifier_factor = 1.0; - if ( state == GLUI_SCROLL_STATE_SCROLL) { - update_scroll_parameters(); - - int hbox = box_length/2; - if (horizontal) { - int track_v = x-GLUI_SCROLL_ARROW_WIDTH; - new_int_val = int_min + (track_v-hbox)*(int_max-int_min)/free_len; - new_float_val = float_min + (track_v-hbox)*(float_max-float_min)/float(free_len); - } else { - int track_v = y-GLUI_SCROLL_ARROW_HEIGHT; - new_int_val = int_max - (track_v-hbox)*(int_max-int_min)/free_len; - new_float_val = float_max - (track_v-hbox)*(float_max-float_min)/float(free_len); - } - } - else { - if ( state == GLUI_SCROLL_STATE_UP ) - direction = +1; - else if ( state == GLUI_SCROLL_STATE_DOWN ) - direction = -1; - incr = growth * direction * modifier_factor * user_speed; - new_int_val += direction; - new_float_val += direction * (float_max-float_min)/free_len; - } - last_y = y; - last_x = x; - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SCROLL_CALLBACK_INTERVAL ****/ - if(data_type==GLUI_SCROLL_INT) - set_int_val(new_int_val); - else if (data_type==GLUI_SCROLL_FLOAT) - set_float_val(new_float_val); - - callback_count++; - if ( (callback_count % GLUI_SCROLL_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); -} - - -/***************************************** GLUI_Scrollbar::needs_idle() ******/ - -bool GLUI_Scrollbar::needs_idle( void ) const -{ - if (state == GLUI_SCROLL_STATE_UP OR state == GLUI_SCROLL_STATE_DOWN ) { - return true; - } - else { - return false; - } -} - -/***************************************** GLUI_Scrollbar::idle() **********/ - -void GLUI_Scrollbar::idle( void ) -{ - if ( NOT needs_idle() ) - return; - else - do_click(); -} - - -/************************************ GLUI_Scrollbar::do_callbacks() **********/ - -void GLUI_Scrollbar::do_callbacks( void ) -{ - - /* *******************************************/ - - if ( NOT first_callback ) { - if ( data_type == GLUI_SCROLL_INT AND int_val == last_int_val ) { - return; - } - if ( data_type == GLUI_SPINNER_FLOAT AND float_val == last_float_val ) { - return; - } - } - - if (associated_object == NULL) { - this->execute_callback(); - } - else { // Use internal Callbacks - if (object_cb) { - //object_cb(associated_object, int_val); - object_cb(this); - } - } - last_int_val = int_val; - last_float_val = float_val; - first_callback = false; -} - - -/********************************** GLUI_Scrollbar::set_float_val() ************/ - -void GLUI_Scrollbar::set_float_val( float new_val ) -{ - // Allow for the possibility that the limits are reversed - float hi = MAX(float_min,float_max); - float lo = MIN(float_min,float_max); - if (new_val > hi) - new_val = hi; - if (new_val < lo) - new_val = lo; - last_float_val = float_val; - float_val = new_val; - int_val = (int)new_val; - - redraw(); - - /*** Now update the live variable ***/ - output_live(true); -} - - -/********************************** GLUI_Scrollbar::set_int_val() ************/ - -void GLUI_Scrollbar::set_int_val( int new_val ) -{ - // Allow for the possibility that the limits are reversed - int hi = MAX(int_min,int_max); - int lo = MIN(int_min,int_max); - if (new_val > hi) - new_val = hi; - if (new_val < lo) - new_val = lo; - last_int_val = int_val; - float_val = int_val = new_val; - - redraw(); - - /*** Now update the live variable ***/ - output_live(true); -} - -/*********************************** GLUI_Scrollbar::set_float_limits() *********/ - -void GLUI_Scrollbar::set_float_limits( float low, float high, int limit_type ) -{ - if (limit_type != GLUI_LIMIT_CLAMP) { - // error! - } - float_min = low; - float_max = high; - // Allow for possiblitly of reversed limits - float lo = MIN(low,high); - float hi = MAX(low,high); - if (float_valhi) set_float_val(hi); -} - - -/*********************************** GLUI_Scrollbar::set_int_limits() *********/ - -void GLUI_Scrollbar::set_int_limits( int low, int high, int limit_type ) -{ - if (limit_type != GLUI_LIMIT_CLAMP) { - // error! - } - int_min = low; - int_max = high; - // Allow for possiblitly of reversed limits - int lo = MIN(low,high); - int hi = MAX(low,high); - if (int_valhi) set_int_val(hi); - float_min = low; - float_max = high; -} - - -/*********************************** GLUI_Scrollbar::reset_growth() *************/ - -void GLUI_Scrollbar::reset_growth( void ) -{ - growth = fabs(float_max - float_min) / float(GLUI_SCROLL_GROWTH_STEPS); - if (data_type == GLUI_SCROLL_INT && growth<1) growth=1; -} - - -/******************************* GLUI_Scrollbar::increase_growth() *************/ - -void GLUI_Scrollbar::increase_growth( void ) -{ - float range=0; - if (data_type==GLUI_SCROLL_FLOAT) - range = fabs(float_max-float_min); - else - range = fabs(float(int_max-int_min)); - if ( growth < (range / float(GLUI_SCROLL_MIN_GROWTH_STEPS)) ) - growth *= growth_exp; - return; -} - - - +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_scrollbar.cpp - GLUI_Scrollbar class + + -------------------------------------------------- + + Copyright (c) 2004 John Kew, 1998 Paul Rademacher + + This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. + +*****************************************************************************/ + +#include "glui_internal_control.h" +#include +#include + +/*static int __debug=0; */ + +#define GLUI_SCROLL_GROWTH_STEPS 800 +#define GLUI_SCROLL_MIN_GROWTH_STEPS 100 +#define GLUI_SCROLL_CALLBACK_INTERVAL 1 /* Execute the user's callback every this many clicks */ + +enum { + GLUI_SCROLL_ARROW_UP, + GLUI_SCROLL_ARROW_DOWN, + GLUI_SCROLL_ARROW_LEFT, + GLUI_SCROLL_ARROW_RIGHT +}; + + +/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ +// Constructor, no live var +GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, + const char *name, + int horz_vert, + int data_type, + int id, GLUI_CB callback + /*,GLUI_Control *object + ,GLUI_InterObject_CB obj_cb*/ + ) +{ + common_construct(parent, name, horz_vert, data_type, NULL, id, callback/*, object, obj_cb*/); +} + +/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ +// Constructor, int live var +GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, const char *name, + int horz_vert, + int *live_var, + int id, GLUI_CB callback + /*,GLUI_Control *object + ,GLUI_InterObject_CB obj_cb*/ + ) +{ + common_construct(parent, name, horz_vert, GLUI_SCROLL_INT, live_var, id, callback/*, object, obj_cb*/); +} + +/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ +// Constructor, float live var +GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, const char *name, + int horz_vert, + float *live_var, + int id, GLUI_CB callback + /*,GLUI_Control *object + ,GLUI_InterObject_CB obj_cb*/ + ) +{ + common_construct(parent, name, horz_vert, GLUI_SCROLL_FLOAT, live_var, id, callback/*, object, obj_cb*/); +} + +/****************************** GLUI_Scrollbar::common_init() **********/ +void GLUI_Scrollbar::common_init(void) +{ + horizontal = true; + h = GLUI_SCROLL_ARROW_HEIGHT; + w = GLUI_TEXTBOX_WIDTH; + alignment = GLUI_ALIGN_CENTER; + x_off = 0; + y_off_top = 0; + y_off_bot = 0; + can_activate = true; + state = GLUI_SCROLL_STATE_NONE; + growth_exp = GLUI_SCROLL_DEFAULT_GROWTH_EXP; + callback_count = 0; + first_callback = true; + user_speed = 1.0; + float_min = 0.0; + float_max = 0.0; + int_min = 0; + int_max = 0; + associated_object = NULL; + last_update_time=0; + velocity_limit=50.0; /* Change value by at most 50 per second */ + box_length = 0; + box_start_position = 0; + box_end_position = 0; + track_length = 0; +} + +/****************************** GLUI_Scrollbar::common_construct() **********/ +void GLUI_Scrollbar::common_construct( + GLUI_Node *parent, + const char *name, + int horz_vert, + int data_type, + void *data, + int id, GLUI_CB callback + /*,GLUI_Control *object, + GLUI_InterObject_CB obj_cb*/ + ) +{ + common_init(); + + // make sure limits are wide enough to hold live value + if (data_type==GLUI_SCROLL_FLOAT) { + float lo = 0.0f, hi=1.0f; + if (data) { + float d = *(float*)(data); + lo = MIN(lo, d); + hi = MAX(hi, d); + } + this->set_float_limits(lo,hi); + this->set_float_val(lo); + this->live_type = GLUI_LIVE_FLOAT; + } else { + int lo = 0, hi=100; + if (data) { + int d = *(int*)(data); + lo = MIN(lo, d); + hi = MAX(hi, d); + } + this->set_int_limits(lo,hi); + this->set_int_val(0); + this->live_type = GLUI_LIVE_INT; + } + this->data_type = data_type; + this->set_ptr_val( data ); + this->set_name(name); + this->user_id = id; + this->callback = callback; + //this->associated_object = object; + //this->object_cb = obj_cb; + this->horizontal=(horz_vert==GLUI_SCROLL_HORIZONTAL); + if (this->horizontal) { + this->h = GLUI_SCROLL_ARROW_HEIGHT; + this->w = GLUI_TEXTBOX_WIDTH; + } else { + this->h = GLUI_TEXTBOX_HEIGHT; + this->w = GLUI_SCROLL_ARROW_WIDTH; + } + parent->add_control( this ); + this->init_live(); +} + +/****************************** GLUI_Scrollbar::mouse_down_handler() **********/ + +int GLUI_Scrollbar::mouse_down_handler( int local_x, int local_y ) +{ + last_update_time=GLUI_Time()-1.0; + this->state = find_arrow( local_x, local_y ); + GLUI_Master.glui_setIdleFuncIfNecessary(); + + /* printf( "spinner: mouse down : %d/%d arrow:%d\n", local_x, local_y, + find_arrow( local_x, local_y )); + */ + + if ( state != GLUI_SCROLL_STATE_UP AND state != GLUI_SCROLL_STATE_DOWN) + return true; + + reset_growth(); + + /*** ints and floats behave a bit differently. When you click on + an int spinner, you expect the value to immediately go up by 1, whereas + for a float it'll go up only by a fractional amount. Therefore, we + go ahead and increment by one for int spinners ***/ +#if 1 + if ( data_type == GLUI_SCROLL_INT ) { + // Allow for possibility of reversed limits + int lo = MIN(int_min,int_max); + int hi = MAX(int_min,int_max); + int increase = int_min < int_max ? 1 : -1; + int new_val = int_val; + if ( state == GLUI_SCROLL_STATE_UP ) { + new_val += increase; + } else if ( state == GLUI_SCROLL_STATE_DOWN ) { + new_val -= increase; + } + if (new_val >= lo && new_val <= hi && new_val!=int_val) { + set_int_val(new_val); + do_callbacks(); + } + } +#endif + do_click(); + redraw(); + + return false; +} + + +/******************************** GLUI_Scrollbar::mouse_up_handler() **********/ + +int GLUI_Scrollbar::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + state = GLUI_SCROLL_STATE_NONE; + GLUI_Master.glui_setIdleFuncIfNecessary(); + + /* printf("spinner: mouse up : %d/%d inside: %d\n",local_x,local_y,inside); */ + + /*glutSetCursor( GLUT_CURSOR_INHERIT ); */ + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); + + redraw(); + + /* do_callbacks(); --- stub */ + /* if ( callback ) */ + /* callback( this->user_id ); */ + + return false; +} + + +/***************************** GLUI_Scrollbar::mouse_held_down_handler() ******/ + +int GLUI_Scrollbar::mouse_held_down_handler( int local_x, int local_y, + bool new_inside) +{ + int new_state; + if ( state == GLUI_SCROLL_STATE_NONE ) + return false; + + /* printf("spinner: mouse held: %d/%d inside: %d\n",local_x,local_y, + new_inside); + */ + + if ( state == GLUI_SCROLL_STATE_SCROLL) { /* dragging? */ + do_drag( local_x-x_abs, local_y-y_abs ); + } + else { /* not dragging */ + new_state = find_arrow( local_x, local_y ); + + if ( new_state == state ) { + /** Still in same arrow **/ + do_click(); + } + } + redraw(); + + return false; +} + + +/****************************** GLUI_Scrollbar::key_handler() **********/ + +int GLUI_Scrollbar::key_handler( unsigned char key,int modifiers ) +{ + return true; +} + + +/****************************** GLUI_Scrollbar::draw() **********/ + +void GLUI_Scrollbar::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + if ( horizontal ) { + draw_scroll_arrow(GLUI_SCROLL_ARROW_LEFT, 0, 0); + draw_scroll_arrow(GLUI_SCROLL_ARROW_RIGHT, w-GLUI_SCROLL_ARROW_WIDTH, 0); + } else { + draw_scroll_arrow(GLUI_SCROLL_ARROW_UP, 0, 0); + draw_scroll_arrow(GLUI_SCROLL_ARROW_DOWN, 0, h-GLUI_SCROLL_ARROW_HEIGHT); + } + draw_scroll(); +} + + +/****************************** GLUI_Scrollbar::draw_scroll_arrow() **********/ + +void GLUI_Scrollbar::draw_scroll_arrow(int arrowtype, int x, int y) +{ + float offset=0; + float L=3.5f,HC=7.f,R=10.5f; + float T=4.5f,VC=8.f,B=11.5; + const float verts[][6]={ + { L,10.5f, R, 10.5f, HC, 6.5f }, // up arrow + { L,6.5f, R, 6.5f, HC,10.5f }, // down arrow + { R-2,T, R-2, B, L+1, VC }, // left arrow + { L+2,T, L+2, B, R-1, VC } // right arrow + }; + + const float *tri = NULL; + + switch (arrowtype) + { + case GLUI_SCROLL_ARROW_UP: + tri = verts[0]; + if (state & GLUI_SCROLL_STATE_UP) offset = 1; + break; + + case GLUI_SCROLL_ARROW_DOWN: + tri = verts[1]; + if (state & GLUI_SCROLL_STATE_DOWN) offset = 1; + break; + + case GLUI_SCROLL_ARROW_LEFT: + tri = verts[2]; + if (state & GLUI_SCROLL_STATE_DOWN) offset = 1; + break; + + case GLUI_SCROLL_ARROW_RIGHT: + tri = verts[3]; + if (state & GLUI_SCROLL_STATE_UP) offset = 1; + break; + + default: + return; /* tri is NULL */ + } + + glColor3ubv(&glui->bkgd_color.r); + glRecti(x,y,x+GLUI_SCROLL_ARROW_WIDTH,y+GLUI_SCROLL_ARROW_HEIGHT); + if (!offset) { + glui->draw_raised_box(x,y+1,GLUI_SCROLL_ARROW_WIDTH-1,GLUI_SCROLL_ARROW_HEIGHT-1); + } else { + glColor3ub(128,128,128); + glBegin(GL_LINE_LOOP); + int x2=x+GLUI_SCROLL_ARROW_WIDTH, y2=y+GLUI_SCROLL_ARROW_HEIGHT; + glVertex2i(x ,y); + glVertex2i(x2,y); + glVertex2i(x2,y2); + glVertex2i(x ,y2); + glEnd(); + } + + GLubyte black[]={0,0,0}; + GLubyte white[]={255,255,255}; + GLubyte gray[]={128,128,128}; + GLubyte *color=black; + if (!enabled) { + offset = 1; + color = white; + } + glTranslatef(x+offset,y+offset,0); + glColor3ubv(color); + glBegin(GL_TRIANGLES); + glVertex2fv(tri); glVertex2fv(tri+2), glVertex2fv(tri+4); + glEnd(); + glTranslatef(-(x+offset),-(y+offset),0); + + if (!enabled) { // once more! + glTranslatef(x,y,0); + glColor3ubv(gray); + glBegin(GL_TRIANGLES); + glVertex2fv(tri); glVertex2fv(tri+2), glVertex2fv(tri+4); + glEnd(); + glTranslatef(-x,-y,0); + } +} + + +void GLUI_Scrollbar::draw_scroll() { + update_scroll_parameters(); + + // Draw track using a checkerboard background + const unsigned char scroll_bg[] = { + 0xD4, 0xD0, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xD4, 0xD0, 0xC8 + }; + glColor3f( 1.0, 1.0, 1.0 ); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + glEnable( GL_TEXTURE_2D); + glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, + scroll_bg); + + float y0 = horizontal? 0 : GLUI_SCROLL_ARROW_HEIGHT; + float y1 = horizontal? h : h-GLUI_SCROLL_ARROW_HEIGHT; + float x0 = horizontal? GLUI_SCROLL_ARROW_WIDTH : 0; + float x1 = horizontal? w-GLUI_SCROLL_ARROW_WIDTH : w; + x0-=0.5; y0+=0.5; + x1-=0.5; y1+=0.5; + float dy = y1-y0; + float dx = x1-x0; + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2f(x0,y0); + glTexCoord2f(dx*0.5f,0); glVertex2f(x1,y0); + glTexCoord2f(dx*0.5f,dy*0.5f); glVertex2f(x1,y1); + glTexCoord2f(0, dy*0.5f); glVertex2f(x0,y1); + glEnd(); + glDisable(GL_TEXTURE_2D); + + // Draw scroll box + int box = box_start_position; + if (horizontal) { + box += GLUI_SCROLL_ARROW_WIDTH; + draw_scroll_box(box,1,box_length,h); + } else { + box += GLUI_SCROLL_ARROW_HEIGHT+1; + draw_scroll_box(0,box,w,box_length); + } +} + +/****************************** GLUI_Scrollbar::draw_scroll_box() **********/ + +void GLUI_Scrollbar::draw_scroll_box(int x, int y, int w, int h) +{ + if (!enabled) return; + glColor3ubv(&glui->bkgd_color.r); + glRecti(x,y,x+w,y+h); + glui->draw_raised_box(x,y, w-1, h-1); + + if (active) { + glEnable( GL_LINE_STIPPLE ); + glLineStipple( 1, 0x5555 ); + glColor3f( 0., 0., 0. ); + glBegin(GL_LINE_LOOP); + int x1 = x+2, y1 = y+2, x2 = x+w-4, y2 = y+h-4; + glVertex2i(x1,y1); + glVertex2i(x2,y1); + glVertex2i(x2,y2); + glVertex2i(x1,y2); + glEnd(); + glDisable( GL_LINE_STIPPLE ); + } +} + + + +/**************************** update_scroll_parameters ***********/ + +void GLUI_Scrollbar::update_scroll_parameters() { + track_length = horizontal? + this->w-GLUI_SCROLL_ARROW_WIDTH*2 : + this->h-GLUI_SCROLL_ARROW_HEIGHT*2; + if (data_type==GLUI_SCROLL_INT) + { + if (int_max==int_min) + box_length=track_length; + else { + const int MIN_TAB = GLUI_SCROLL_BOX_STD_HEIGHT; + //box_length = int(track_length/float(visible_range)); + //if (box_length < MIN_TAB) + box_length = MIN_TAB; + } + float pixels_per_unit = (track_length-box_length)/float(int_max-int_min); + if (horizontal) + box_start_position = int((int_val-int_min)*pixels_per_unit); + else + box_start_position = int((int_max-int_val)*pixels_per_unit); + box_end_position = box_start_position+box_length; + } + else if (data_type==GLUI_SCROLL_FLOAT) + { + if (float_max==float_min) + box_length=track_length; + else { + box_length = GLUI_SCROLL_BOX_STD_HEIGHT; + } + float pixels_per_unit = (track_length-box_length)/float(float_max-float_min); + if (horizontal) + box_start_position = int((float_val-float_min)*pixels_per_unit); + else + box_start_position = int((float_max-float_val)*pixels_per_unit); + box_end_position = box_start_position+box_length; + } +} + + +/********************************* GLUI_Scrollbar::special_handler() **********/ + +int GLUI_Scrollbar::special_handler( int key,int modifiers ) +{ + if ( !horizontal && key == GLUT_KEY_UP ) { + mouse_down_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, + y_abs + 1 ); + mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, + y_abs + 1, true ); + } + else if ( !horizontal && key == GLUT_KEY_DOWN ) { + mouse_down_handler(x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, + y_abs+1+GLUI_SCROLL_ARROW_HEIGHT); + mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, + y_abs+1 +GLUI_SCROLL_ARROW_HEIGHT, + true ); + } + if ( horizontal && key == GLUT_KEY_LEFT ) { + mouse_down_handler( x_abs + 1,y_abs + 1 ); + mouse_up_handler( x_abs + 1, y_abs + 1, true ); + } + else if ( horizontal && key == GLUT_KEY_RIGHT ) { + mouse_down_handler(x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, + y_abs+1); + mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, + y_abs+1, + true ); + } + else if ( key == GLUT_KEY_HOME ) { /** Set value to limit top - + or increment by 10 **/ + } + else if ( key == GLUT_KEY_END ) { + } + + return true; +} + + +/************************************ GLUI_Scrollbar::update_size() **********/ + +void GLUI_Scrollbar::update_size( void ) +{ + if (horizontal) { + h = GLUI_SCROLL_ARROW_HEIGHT; + if (associated_object) { + this->w = ((GLUI_Control *)associated_object)->w; + } + } + else { + w = GLUI_SCROLL_ARROW_WIDTH; + if (associated_object) { + this->h = ((GLUI_Control *)associated_object)->h; + } + } +} + + +/************************************ GLUI_Scrollbar::find_arrow() ************/ + +int GLUI_Scrollbar::find_arrow( int local_x, int local_y ) +{ + + local_x = local_x-x_abs; + local_y = local_y-y_abs; + + if (horizontal) + { + if ( local_y >= h-GLUI_SCROLL_ARROW_HEIGHT-3 && local_y <= h) + { + update_scroll_parameters(); + if ( local_x >= 0 AND local_x <= (GLUI_SCROLL_ARROW_WIDTH+box_start_position) ) + { + return GLUI_SCROLL_STATE_DOWN; + } + if ( local_x >= (GLUI_SCROLL_ARROW_WIDTH+box_end_position) + AND local_x <= (w+GLUI_SCROLL_ARROW_WIDTH) ) + { + return GLUI_SCROLL_STATE_UP; + } + return GLUI_SCROLL_STATE_SCROLL; + } + } + else + { + if ( local_x >= w-GLUI_SCROLL_ARROW_WIDTH-3 && local_x <= w) + { + update_scroll_parameters(); + if ( local_y >= 0 AND local_y <= (GLUI_SCROLL_ARROW_HEIGHT+box_start_position) ) + { + return GLUI_SCROLL_STATE_UP; + } + if ( local_y >= (GLUI_SCROLL_ARROW_HEIGHT+box_end_position) + AND local_y <= (h+GLUI_SCROLL_ARROW_HEIGHT) ) + { + return GLUI_SCROLL_STATE_DOWN; + } + return GLUI_SCROLL_STATE_SCROLL; + } + } + + return GLUI_SCROLL_STATE_NONE; +} + +/***************************************** GLUI_Scrollbar::do_click() **********/ + +void GLUI_Scrollbar::do_click( void ) +{ + int direction = 0; + + if ( state == GLUI_SCROLL_STATE_UP ) + direction = +1; + else if ( state == GLUI_SCROLL_STATE_DOWN ) + direction = -1; + + if (data_type==GLUI_SCROLL_INT&&int_min>int_max) direction*=-1; + if (data_type==GLUI_SCROLL_FLOAT&&float_min>float_max) direction*=-1; + + increase_growth(); + + float modifier_factor = 1.0; + float incr = growth * modifier_factor * user_speed ; + + double frame_time=GLUI_Time()-last_update_time; + double frame_limit=velocity_limit*frame_time; + if (incr>frame_limit) incr=frame_limit; /* don't scroll faster than limit */ + last_update_time=GLUI_Time(); + + float new_val = float_val; + + new_val += direction * incr; + if (1 || data_type==GLUI_SCROLL_FLOAT) set_float_val(new_val); + if (0 && data_type==GLUI_SCROLL_INT) set_int_val((int)new_val); + //printf("do_click: incr %f val=%f float_val=%f\n",incr,new_val,float_val); + + /*** Now update live variable and do callback. We don't want + to do the callback on each iteration of this function, just on every + i^th iteration, where i is given by GLUI_SCROLL_CALLBACK_INTERVAL ****/ + callback_count++; + if ( (callback_count % GLUI_SCROLL_CALLBACK_INTERVAL ) == 0 ) + do_callbacks(); + +} + + +/***************************************** GLUI_Scrollbar::do_drag() **********/ + +void GLUI_Scrollbar::do_drag( int x, int y ) +{ + int direction = 0; + float incr, modifier_factor; + /* int delta_x; */ + int new_int_val = int_val; + float new_float_val = float_val; + + int free_len = track_length-box_length; + if (free_len == 0) return; + + modifier_factor = 1.0; + if ( state == GLUI_SCROLL_STATE_SCROLL) { + update_scroll_parameters(); + + int hbox = box_length/2; + if (horizontal) { + int track_v = x-GLUI_SCROLL_ARROW_WIDTH; + new_int_val = int_min + (track_v-hbox)*(int_max-int_min)/free_len; + new_float_val = float_min + (track_v-hbox)*(float_max-float_min)/float(free_len); + } else { + int track_v = y-GLUI_SCROLL_ARROW_HEIGHT; + new_int_val = int_max - (track_v-hbox)*(int_max-int_min)/free_len; + new_float_val = float_max - (track_v-hbox)*(float_max-float_min)/float(free_len); + } + } + else { + if ( state == GLUI_SCROLL_STATE_UP ) + direction = +1; + else if ( state == GLUI_SCROLL_STATE_DOWN ) + direction = -1; + incr = growth * direction * modifier_factor * user_speed; + new_int_val += direction; + new_float_val += direction * (float_max-float_min)/free_len; + } + last_y = y; + last_x = x; + + /*** Now update live variable and do callback. We don't want + to do the callback on each iteration of this function, just on every + i^th iteration, where i is given by GLUI_SCROLL_CALLBACK_INTERVAL ****/ + if(data_type==GLUI_SCROLL_INT) + set_int_val(new_int_val); + else if (data_type==GLUI_SCROLL_FLOAT) + set_float_val(new_float_val); + + callback_count++; + if ( (callback_count % GLUI_SCROLL_CALLBACK_INTERVAL ) == 0 ) + do_callbacks(); +} + + +/***************************************** GLUI_Scrollbar::needs_idle() ******/ + +bool GLUI_Scrollbar::needs_idle( void ) const +{ + if (state == GLUI_SCROLL_STATE_UP OR state == GLUI_SCROLL_STATE_DOWN ) { + return true; + } + else { + return false; + } +} + +/***************************************** GLUI_Scrollbar::idle() **********/ + +void GLUI_Scrollbar::idle( void ) +{ + if ( NOT needs_idle() ) + return; + else + do_click(); +} + + +/************************************ GLUI_Scrollbar::do_callbacks() **********/ + +void GLUI_Scrollbar::do_callbacks( void ) +{ + + /* *******************************************/ + + if ( NOT first_callback ) { + if ( data_type == GLUI_SCROLL_INT AND int_val == last_int_val ) { + return; + } + if ( data_type == GLUI_SPINNER_FLOAT AND float_val == last_float_val ) { + return; + } + } + + if (associated_object == NULL) { + this->execute_callback(); + } + else { // Use internal Callbacks + if (object_cb) { + //object_cb(associated_object, int_val); + object_cb(this); + } + } + last_int_val = int_val; + last_float_val = float_val; + first_callback = false; +} + + +/********************************** GLUI_Scrollbar::set_float_val() ************/ + +void GLUI_Scrollbar::set_float_val( float new_val ) +{ + // Allow for the possibility that the limits are reversed + float hi = MAX(float_min,float_max); + float lo = MIN(float_min,float_max); + if (new_val > hi) + new_val = hi; + if (new_val < lo) + new_val = lo; + last_float_val = float_val; + float_val = new_val; + int_val = (int)new_val; + + redraw(); + + /*** Now update the live variable ***/ + output_live(true); +} + + +/********************************** GLUI_Scrollbar::set_int_val() ************/ + +void GLUI_Scrollbar::set_int_val( int new_val ) +{ + // Allow for the possibility that the limits are reversed + int hi = MAX(int_min,int_max); + int lo = MIN(int_min,int_max); + if (new_val > hi) + new_val = hi; + if (new_val < lo) + new_val = lo; + last_int_val = int_val; + float_val = int_val = new_val; + + redraw(); + + /*** Now update the live variable ***/ + output_live(true); +} + +/*********************************** GLUI_Scrollbar::set_float_limits() *********/ + +void GLUI_Scrollbar::set_float_limits( float low, float high, int limit_type ) +{ + if (limit_type != GLUI_LIMIT_CLAMP) { + // error! + } + float_min = low; + float_max = high; + // Allow for possiblitly of reversed limits + float lo = MIN(low,high); + float hi = MAX(low,high); + if (float_valhi) set_float_val(hi); +} + + +/*********************************** GLUI_Scrollbar::set_int_limits() *********/ + +void GLUI_Scrollbar::set_int_limits( int low, int high, int limit_type ) +{ + if (limit_type != GLUI_LIMIT_CLAMP) { + // error! + } + int_min = low; + int_max = high; + // Allow for possiblitly of reversed limits + int lo = MIN(low,high); + int hi = MAX(low,high); + if (int_valhi) set_int_val(hi); + float_min = low; + float_max = high; +} + + +/*********************************** GLUI_Scrollbar::reset_growth() *************/ + +void GLUI_Scrollbar::reset_growth( void ) +{ + growth = fabs(float_max - float_min) / float(GLUI_SCROLL_GROWTH_STEPS); + if (data_type == GLUI_SCROLL_INT && growth<1) growth=1; +} + + +/******************************* GLUI_Scrollbar::increase_growth() *************/ + +void GLUI_Scrollbar::increase_growth( void ) +{ + float range=0; + if (data_type==GLUI_SCROLL_FLOAT) + range = fabs(float_max-float_min); + else + range = fabs(float(int_max-int_min)); + if ( growth < (range / float(GLUI_SCROLL_MIN_GROWTH_STEPS)) ) + growth *= growth_exp; + return; +} + + + diff --git a/Extras/glui/glui_separator.cpp b/Extras/glui/glui_separator.cpp index b10cf361f..87907d8a3 100644 --- a/Extras/glui/glui_separator.cpp +++ b/Extras/glui/glui_separator.cpp @@ -1,75 +1,75 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_separator.cpp - GLUI_Separator control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_Separator::GLUI_Separator() **********/ - -GLUI_Separator::GLUI_Separator( GLUI_Node *parent ) -{ - common_init(); - parent->add_control( this ); -} - -/****************************** GLUI_Separator::draw() **********/ - -void GLUI_Separator::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - int width, indent; - int cont_x, cont_y, cont_w, cont_h, cont_x_off, cont_y_off; - - if ( parent() != NULL ) { - get_this_column_dims(&cont_x, &cont_y, &cont_w, &cont_h, - &cont_x_off, &cont_y_off); - - width = cont_w - cont_x_off*2; - } - else { - width = this->w; - } - - indent = (int) floor(width * .05); - - glLineWidth( 1.0 ); - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( indent, GLUI_SEPARATOR_HEIGHT/2-1 ); - glVertex2i( width-indent, GLUI_SEPARATOR_HEIGHT/2-1 ); - - glColor3f( 1., 1., 1. ); - glVertex2i( indent, GLUI_SEPARATOR_HEIGHT/2 ); - glVertex2i( width-indent, GLUI_SEPARATOR_HEIGHT/2 ); - glEnd(); -} - - +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_separator.cpp - GLUI_Separator control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +/****************************** GLUI_Separator::GLUI_Separator() **********/ + +GLUI_Separator::GLUI_Separator( GLUI_Node *parent ) +{ + common_init(); + parent->add_control( this ); +} + +/****************************** GLUI_Separator::draw() **********/ + +void GLUI_Separator::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + int width, indent; + int cont_x, cont_y, cont_w, cont_h, cont_x_off, cont_y_off; + + if ( parent() != NULL ) { + get_this_column_dims(&cont_x, &cont_y, &cont_w, &cont_h, + &cont_x_off, &cont_y_off); + + width = cont_w - cont_x_off*2; + } + else { + width = this->w; + } + + indent = (int) floor(width * .05); + + glLineWidth( 1.0 ); + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( indent, GLUI_SEPARATOR_HEIGHT/2-1 ); + glVertex2i( width-indent, GLUI_SEPARATOR_HEIGHT/2-1 ); + + glColor3f( 1., 1., 1. ); + glVertex2i( indent, GLUI_SEPARATOR_HEIGHT/2 ); + glVertex2i( width-indent, GLUI_SEPARATOR_HEIGHT/2 ); + glEnd(); +} + + diff --git a/Extras/glui/glui_spinner.cpp b/Extras/glui/glui_spinner.cpp index 6dac8be75..98677391e 100644 --- a/Extras/glui/glui_spinner.cpp +++ b/Extras/glui/glui_spinner.cpp @@ -1,630 +1,630 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_spinner.cpp - GLUI_Spinner class - - - notes: - spinner does not explicitly keep track of the current value - this is all - handled by the underlying edittext control - -> thus, spinner->sync_live() has no meaning, nor spinner->output_live - -> BUT, edittext will alter this spinner's float_val and int_val, - so that spinner->get/set will work - - -FIXME: there's a heck of a lot of duplication between this and glui_scrollbar.cpp. - (OSL, 2006/06) - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include -#include - -/*static int __debug=0; */ - -#define GLUI_SPINNER_GROWTH_STEPS 800 -#define GLUI_SPINNER_MIN_GROWTH_STEPS 100 -#define GLUI_SPINNER_CALLBACK_INTERVAL 1 - - - - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, - int data_type, int id, GLUI_CB callback ) -{ - common_construct(parent, name, data_type, NULL, id, callback); -} - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, - int *live_var, int id, GLUI_CB callback ) -{ - common_construct(parent, name, GLUI_SPINNER_INT, live_var, id, callback); -} - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, - float *live_var, int id, GLUI_CB callback ) -{ - common_construct(parent, name, GLUI_SPINNER_FLOAT, live_var, id, callback); -} - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node *parent, const char *name, - int data_t, void *live_var, - int id, GLUI_CB callback ) -{ - common_construct(parent, name, data_t, live_var, id, callback); -} - -/****************************** GLUI_Spinner::common_construct() ************/ - -void GLUI_Spinner::common_construct( GLUI_Node* parent, const char *name, - int data_t, void *data, - int id, GLUI_CB cb ) -{ - common_init(); - - if ( NOT strcmp( name, "Spinner Test" )) - id=id; - - int text_type; - if ( data_t == GLUI_SPINNER_INT ) { - text_type = GLUI_EDITTEXT_INT; - } - else if ( data_t == GLUI_SPINNER_FLOAT ) { - text_type = GLUI_EDITTEXT_FLOAT; - } - else { - assert(0); /* Did not pass in a valid data type */ - } - - user_id = id; - data_type = data_t; - callback = cb; - set_name( name ); - //glui = parent->get_glui(); - - parent->add_control( this ); - - GLUI_EditText *txt = - new GLUI_EditText( this, name, text_type, data, id, cb); - - edittext = txt; /* Link the edittext to the spinner */ - /* control->ptr_val = data; */ - - edittext->spinner = this; /* Link the spinner to the edittext */ - -} - -/****************************** GLUI_Spinner::mouse_down_handler() **********/ - -int GLUI_Spinner::mouse_down_handler( int local_x, int local_y ) -{ - this->state = find_arrow( local_x, local_y ); - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf( "spinner: mouse down : %d/%d arrow:%d\n", local_x, local_y, - find_arrow( local_x, local_y )); - */ - - if ( state != GLUI_SPINNER_STATE_UP AND state != GLUI_SPINNER_STATE_DOWN ) - return true; - - reset_growth(); - redraw(); - - /*** ints and floats behave a bit differently. When you click on - an int spinner, you expect the value to immediately go up by 1, whereas - for a float it'll go up only by a fractional amount. Therefore, we - go ahead and increment by one for int spinners ***/ - if ( data_type == GLUI_SPINNER_INT ) { - if ( state == GLUI_SPINNER_STATE_UP ) - edittext->set_float_val( edittext->float_val + 1.0 ); - else if ( state == GLUI_SPINNER_STATE_DOWN ) - edittext->set_float_val( edittext->float_val - .9 ); - } - - do_click(); - - return false; -} - - -/******************************** GLUI_Spinner::mouse_up_handler() **********/ - -int GLUI_Spinner::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - state = GLUI_SPINNER_STATE_NONE; - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf("spinner: mouse up : %d/%d inside: %d\n",local_x,local_y,inside); */ - - /*glutSetCursor( GLUT_CURSOR_INHERIT ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - redraw(); - - /* do_callbacks(); --- stub */ - /* if ( callback ) */ - /* callback( this->user_id ); */ - - return false; -} - - -/***************************** GLUI_Spinner::mouse_held_down_handler() ******/ - -int GLUI_Spinner::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int new_state; - - if ( state == GLUI_SPINNER_STATE_NONE ) - return false; - - /* printf("spinner: mouse held: %d/%d inside: %d\n",local_x,local_y, - new_inside); - */ - - if ( state == GLUI_SPINNER_STATE_BOTH ) { /* dragging? */ - do_drag( local_x, local_y ); - } - else { /* not dragging */ - new_state = find_arrow( local_x, local_y ); - - if ( new_state == state ) { - /** Still in same arrow **/ - do_click(); - } - else { - if ( new_inside OR 1) { - /** The state changed, but we're still inside - that - means we moved off the arrow: begin dragging **/ - state = GLUI_SPINNER_STATE_BOTH; - } - else { - /*** Here check y of mouse position to determine whether to - drag ***/ - - /* ... */ - } - } - - /*** We switched to up/down dragging ***/ - if ( state == GLUI_SPINNER_STATE_BOTH ) { - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - last_x = local_x; - last_y = local_y; - - /** If the spinner has limits, we reset the growth value, since - reset_growth() will compute a new growth value for dragging - vs. clicking. If the spinner has no limits, then we just let the - growth remain at whatever the user has incremented it up to **/ - if ( edittext->has_limits != GLUI_LIMIT_NONE ) - reset_growth(); - } - - redraw(); - } - - return false; -} - - -/****************************** GLUI_Spinner::key_handler() **********/ - -int GLUI_Spinner::key_handler( unsigned char key,int modifiers ) -{ - - - return true; -} - - -/****************************** GLUI_Spinner::draw() **********/ - -void GLUI_Spinner::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( enabled ) { - /*** Draw the up arrow either pressed or unrpessed ***/ - if ( state == GLUI_SPINNER_STATE_UP OR state == GLUI_SPINNER_STATE_BOTH ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_ON, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_Y); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_OFF, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_Y); - - /*** Draw the down arrow either pressed or unrpessed ***/ - if (state == GLUI_SPINNER_STATE_DOWN OR state == GLUI_SPINNER_STATE_BOTH) - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_ON, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_OFF, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); - } - else { /**** The spinner is disabled ****/ - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_DIS, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_Y); - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_DIS, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); - } - - if ( active ) { - glColor3ub( 0, 0, 0 ); - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - } - else { - glColor3ub( glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b ); - } - - glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( w-GLUI_SPINNER_ARROW_WIDTH-2, 0 ); - glVertex2i( w, 0 ); - glVertex2i( w, h ); - glVertex2i( w-GLUI_SPINNER_ARROW_WIDTH-2, h ); - glEnd(); - glDisable( GL_LINE_STIPPLE ); - glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -} - - -/********************************* GLUI_Spinner::special_handler() **********/ - -int GLUI_Spinner::special_handler( int key,int modifiers ) -{ - if ( key == GLUT_KEY_UP ) { /** Simulate a click in the up arrow **/ - mouse_down_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs + GLUI_SPINNER_ARROW_Y+1 ); - mouse_up_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs + GLUI_SPINNER_ARROW_Y+1, true ); - } - else if ( key == GLUT_KEY_DOWN ) { /** Simulate a click in the up arrow **/ - mouse_down_handler(x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs+GLUI_SPINNER_ARROW_Y+1+GLUI_SPINNER_ARROW_HEIGHT); - mouse_up_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs+GLUI_SPINNER_ARROW_Y+1 +GLUI_SPINNER_ARROW_HEIGHT, - true ); - } - else if ( key == GLUT_KEY_HOME ) { /** Set value to limit top - - or increment by 10 **/ - } - else if ( key == GLUT_KEY_END ) { - } - - return true; -} - - -/******************************* GLUI_Spinner::set_float_val() ************/ - -void GLUI_Spinner::set_float_val( float new_val ) -{ - if ( NOT edittext ) - return; - - edittext->set_float_val( new_val ); -} - - -/********************************** GLUI_Spinner::set_int_val() ************/ - -void GLUI_Spinner::set_int_val( int new_val ) -{ - if ( NOT edittext ) - return; - - edittext->set_int_val( new_val ); -} - - -/************************************ GLUI_Spinner::update_size() **********/ - -void GLUI_Spinner::update_size( void ) -{ - if (!edittext) return; - /*edittext->w = this->w - GLUI_SPINNER_ARROW_WIDTH-3; */ - this->w = edittext->w + GLUI_SPINNER_ARROW_WIDTH + 3; -} - - -/************************************ GLUI_Spinner::find_arrow() ************/ - -int GLUI_Spinner::find_arrow( int local_x, int local_y ) -{ - local_x -= x_abs; - local_y -= y_abs; - - if ( local_x >= (w - GLUI_SPINNER_ARROW_WIDTH) AND - local_x <= w ) { - - if ( local_y >= GLUI_SPINNER_ARROW_Y AND - local_y <= (GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT) ) - return GLUI_SPINNER_STATE_UP; - - if ( local_y >= GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT AND - local_y <= (GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT*2) ) - return GLUI_SPINNER_STATE_DOWN; - - } - - return GLUI_SPINNER_STATE_NONE; -} - - -/***************************************** GLUI_Spinner::do_click() **********/ - -void GLUI_Spinner::do_click( void ) -{ - int direction = 0; - float incr; - float modifier_factor; - - if ( state == GLUI_SPINNER_STATE_UP ) - direction = +1; - else if ( state == GLUI_SPINNER_STATE_DOWN ) - direction = -1; - - increase_growth(); - - modifier_factor = 1.0; - if ( glui ) { - if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) - modifier_factor = 100.0f; - else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) - modifier_factor = .01f; - } - - if ( this->data_type == GLUI_SPINNER_FLOAT OR 1) { - incr = growth * direction * modifier_factor * user_speed; - edittext->set_float_val( edittext->float_val + incr ); - /** Remember, edittext mirrors the float and int values ***/ - } - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SPINNER_CALLBACK_INTERVAL ****/ - callback_count++; - if ( (callback_count % GLUI_SPINNER_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); -} - - -/***************************************** GLUI_Spinner::do_drag() **********/ - -void GLUI_Spinner::do_drag( int x, int y ) -{ - int delta_y; - float incr, modifier_factor; - /* int delta_x; */ - - modifier_factor = 1.0f; - if ( glui ) { - if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) - modifier_factor = 100.0f; - else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) - modifier_factor = .01f; - } - - /* delta_x = x - last_x; */ - delta_y = -(y - last_y); - - if ( this->data_type == GLUI_SPINNER_FLOAT OR 1 ) { - incr = growth * delta_y * modifier_factor * user_speed; - edittext->set_float_val( edittext->float_val + incr ); - /** Remember, edittext mirrors the float and int values ***/ - } - - last_x = x; - last_y = y; - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SPINNER_CALLBACK_INTERVAL ****/ - - callback_count++; - if ( (callback_count % GLUI_SPINNER_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); -} - - -/***************************************** GLUI_Spinner::needs_idle() ******/ - -bool GLUI_Spinner::needs_idle( void ) const -{ - if (state == GLUI_SPINNER_STATE_UP OR state == GLUI_SPINNER_STATE_DOWN ) { - return true; - } - else { - return false; - } -} - -/***************************************** GLUI_Spinner::idle() **********/ - -void GLUI_Spinner::idle( void ) -{ - if ( NOT needs_idle() ) - return; - else - do_click(); -} - - -/************************************ GLUI_Spinner::do_callbacks() **********/ - -void GLUI_Spinner::do_callbacks( void ) -{ - /*** This is not necessary, b/c edittext automatically updates us ***/ - if ( NOT edittext ) - return; - this->float_val = edittext->float_val; - this->int_val = edittext->int_val; - /* *******************************************/ - - if ( NOT first_callback ) { - if ( data_type == GLUI_SPINNER_INT AND int_val == last_int_val ) { - return; - } - - if ( data_type == GLUI_SPINNER_FLOAT AND float_val == last_float_val ) { - return; - } - } - - this->execute_callback(); - - last_int_val = int_val; - last_float_val = float_val; - first_callback = false; -} - - -/********************************* GLUI_Spinner::set_float_limits() *********/ - -void GLUI_Spinner::set_float_limits( float low, float high, int limit_type ) -{ - if ( NOT edittext ) - return; - - edittext->set_float_limits( low, high, limit_type ); -} - - -/*********************************** GLUI_Spinner::set_int_limits() *********/ - -void GLUI_Spinner::set_int_limits( int low, int high, int limit_type ) -{ - if ( NOT edittext ) - return; - - edittext->set_int_limits( low, high, limit_type ); -} - - -/*********************************** GLUI_Spinner:reset_growth() *************/ - -void GLUI_Spinner::reset_growth( void ) -{ - float lo, hi; - - if ( edittext->has_limits == GLUI_LIMIT_NONE ) { - if ( data_type == GLUI_SPINNER_FLOAT ) - growth = sqrt(ABS(edittext->float_val)) * .05f; - else if ( data_type == GLUI_SPINNER_INT ) - growth = .4f; - } - else { - if ( data_type == GLUI_SPINNER_FLOAT ) { - lo = edittext->float_low; - hi = edittext->float_high; - growth = (hi-lo) / GLUI_SPINNER_GROWTH_STEPS; - } - else if ( data_type == GLUI_SPINNER_INT ) { - lo = (float) edittext->int_low; - hi = (float) edittext->int_high; - - growth = (hi-lo) / GLUI_SPINNER_GROWTH_STEPS; - } - } - - if ( growth == 0.0f ) - growth = .001f; -} - - -/******************************* GLUI_Spinner:increase_growth() *************/ - -void GLUI_Spinner::increase_growth( void ) -{ - float hi = 0.0,lo = 0.0; - - if ( data_type == GLUI_SPINNER_FLOAT ) { - lo = edittext->float_low; - hi = edittext->float_high; - } - else if ( data_type == GLUI_SPINNER_INT ) { - lo = (float) edittext->int_low; - hi = (float) edittext->int_high; - } - - if ( growth < (hi-lo) / GLUI_SPINNER_MIN_GROWTH_STEPS ) - growth *= growth_exp; - - /* printf( "growth: %f\n", growth ); */ -} - - -/*************************************** GLUI_Spinner:get_text() *************/ - -const char *GLUI_Spinner::get_text( void ) -{ - if (edittext) - return edittext->text.c_str(); - else - return ""; -} - - -/********************************** GLUI_Spinner:get_float_val() *************/ - -float GLUI_Spinner::get_float_val( void ) -{ - if (edittext) - return edittext->float_val; - else - return 0.0f; -} - - -/********************************** GLUI_Spinner:get_int_val() *************/ - -int GLUI_Spinner::get_int_val( void ) -{ - if (edittext) - return edittext->int_val; - else - return 0; -} - - +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_spinner.cpp - GLUI_Spinner class + + + notes: + spinner does not explicitly keep track of the current value - this is all + handled by the underlying edittext control + -> thus, spinner->sync_live() has no meaning, nor spinner->output_live + -> BUT, edittext will alter this spinner's float_val and int_val, + so that spinner->get/set will work + + +FIXME: there's a heck of a lot of duplication between this and glui_scrollbar.cpp. + (OSL, 2006/06) + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" +#include +#include + +/*static int __debug=0; */ + +#define GLUI_SPINNER_GROWTH_STEPS 800 +#define GLUI_SPINNER_MIN_GROWTH_STEPS 100 +#define GLUI_SPINNER_CALLBACK_INTERVAL 1 + + + + +/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ + +GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, + int data_type, int id, GLUI_CB callback ) +{ + common_construct(parent, name, data_type, NULL, id, callback); +} + +/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ + +GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, + int *live_var, int id, GLUI_CB callback ) +{ + common_construct(parent, name, GLUI_SPINNER_INT, live_var, id, callback); +} + +/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ + +GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, + float *live_var, int id, GLUI_CB callback ) +{ + common_construct(parent, name, GLUI_SPINNER_FLOAT, live_var, id, callback); +} + +/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ + +GLUI_Spinner::GLUI_Spinner( GLUI_Node *parent, const char *name, + int data_t, void *live_var, + int id, GLUI_CB callback ) +{ + common_construct(parent, name, data_t, live_var, id, callback); +} + +/****************************** GLUI_Spinner::common_construct() ************/ + +void GLUI_Spinner::common_construct( GLUI_Node* parent, const char *name, + int data_t, void *data, + int id, GLUI_CB cb ) +{ + common_init(); + + if ( NOT strcmp( name, "Spinner Test" )) + id=id; + + int text_type; + if ( data_t == GLUI_SPINNER_INT ) { + text_type = GLUI_EDITTEXT_INT; + } + else if ( data_t == GLUI_SPINNER_FLOAT ) { + text_type = GLUI_EDITTEXT_FLOAT; + } + else { + assert(0); /* Did not pass in a valid data type */ + } + + user_id = id; + data_type = data_t; + callback = cb; + set_name( name ); + //glui = parent->get_glui(); + + parent->add_control( this ); + + GLUI_EditText *txt = + new GLUI_EditText( this, name, text_type, data, id, cb); + + edittext = txt; /* Link the edittext to the spinner */ + /* control->ptr_val = data; */ + + edittext->spinner = this; /* Link the spinner to the edittext */ + +} + +/****************************** GLUI_Spinner::mouse_down_handler() **********/ + +int GLUI_Spinner::mouse_down_handler( int local_x, int local_y ) +{ + this->state = find_arrow( local_x, local_y ); + GLUI_Master.glui_setIdleFuncIfNecessary(); + + /* printf( "spinner: mouse down : %d/%d arrow:%d\n", local_x, local_y, + find_arrow( local_x, local_y )); + */ + + if ( state != GLUI_SPINNER_STATE_UP AND state != GLUI_SPINNER_STATE_DOWN ) + return true; + + reset_growth(); + redraw(); + + /*** ints and floats behave a bit differently. When you click on + an int spinner, you expect the value to immediately go up by 1, whereas + for a float it'll go up only by a fractional amount. Therefore, we + go ahead and increment by one for int spinners ***/ + if ( data_type == GLUI_SPINNER_INT ) { + if ( state == GLUI_SPINNER_STATE_UP ) + edittext->set_float_val( edittext->float_val + 1.0 ); + else if ( state == GLUI_SPINNER_STATE_DOWN ) + edittext->set_float_val( edittext->float_val - .9 ); + } + + do_click(); + + return false; +} + + +/******************************** GLUI_Spinner::mouse_up_handler() **********/ + +int GLUI_Spinner::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + state = GLUI_SPINNER_STATE_NONE; + GLUI_Master.glui_setIdleFuncIfNecessary(); + + /* printf("spinner: mouse up : %d/%d inside: %d\n",local_x,local_y,inside); */ + + /*glutSetCursor( GLUT_CURSOR_INHERIT ); */ + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); + redraw(); + + /* do_callbacks(); --- stub */ + /* if ( callback ) */ + /* callback( this->user_id ); */ + + return false; +} + + +/***************************** GLUI_Spinner::mouse_held_down_handler() ******/ + +int GLUI_Spinner::mouse_held_down_handler( int local_x, int local_y, + bool new_inside) +{ + int new_state; + + if ( state == GLUI_SPINNER_STATE_NONE ) + return false; + + /* printf("spinner: mouse held: %d/%d inside: %d\n",local_x,local_y, + new_inside); + */ + + if ( state == GLUI_SPINNER_STATE_BOTH ) { /* dragging? */ + do_drag( local_x, local_y ); + } + else { /* not dragging */ + new_state = find_arrow( local_x, local_y ); + + if ( new_state == state ) { + /** Still in same arrow **/ + do_click(); + } + else { + if ( new_inside OR 1) { + /** The state changed, but we're still inside - that + means we moved off the arrow: begin dragging **/ + state = GLUI_SPINNER_STATE_BOTH; + } + else { + /*** Here check y of mouse position to determine whether to + drag ***/ + + /* ... */ + } + } + + /*** We switched to up/down dragging ***/ + if ( state == GLUI_SPINNER_STATE_BOTH ) { + glutSetCursor( GLUT_CURSOR_UP_DOWN ); + last_x = local_x; + last_y = local_y; + + /** If the spinner has limits, we reset the growth value, since + reset_growth() will compute a new growth value for dragging + vs. clicking. If the spinner has no limits, then we just let the + growth remain at whatever the user has incremented it up to **/ + if ( edittext->has_limits != GLUI_LIMIT_NONE ) + reset_growth(); + } + + redraw(); + } + + return false; +} + + +/****************************** GLUI_Spinner::key_handler() **********/ + +int GLUI_Spinner::key_handler( unsigned char key,int modifiers ) +{ + + + return true; +} + + +/****************************** GLUI_Spinner::draw() **********/ + +void GLUI_Spinner::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + if ( enabled ) { + /*** Draw the up arrow either pressed or unrpessed ***/ + if ( state == GLUI_SPINNER_STATE_UP OR state == GLUI_SPINNER_STATE_BOTH ) + glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_ON, + w-GLUI_SPINNER_ARROW_WIDTH-1, + GLUI_SPINNER_ARROW_Y); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_OFF, + w-GLUI_SPINNER_ARROW_WIDTH-1, + GLUI_SPINNER_ARROW_Y); + + /*** Draw the down arrow either pressed or unrpessed ***/ + if (state == GLUI_SPINNER_STATE_DOWN OR state == GLUI_SPINNER_STATE_BOTH) + glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_ON, + w-GLUI_SPINNER_ARROW_WIDTH-1, + GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); + else + glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_OFF, + w-GLUI_SPINNER_ARROW_WIDTH-1, + GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); + } + else { /**** The spinner is disabled ****/ + glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_DIS, + w-GLUI_SPINNER_ARROW_WIDTH-1, + GLUI_SPINNER_ARROW_Y); + glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_DIS, + w-GLUI_SPINNER_ARROW_WIDTH-1, + GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); + } + + if ( active ) { + glColor3ub( 0, 0, 0 ); + glEnable( GL_LINE_STIPPLE ); + glLineStipple( 1, 0x5555 ); + } + else { + glColor3ub( glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b ); + } + + glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( w-GLUI_SPINNER_ARROW_WIDTH-2, 0 ); + glVertex2i( w, 0 ); + glVertex2i( w, h ); + glVertex2i( w-GLUI_SPINNER_ARROW_WIDTH-2, h ); + glEnd(); + glDisable( GL_LINE_STIPPLE ); + glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); +} + + +/********************************* GLUI_Spinner::special_handler() **********/ + +int GLUI_Spinner::special_handler( int key,int modifiers ) +{ + if ( key == GLUT_KEY_UP ) { /** Simulate a click in the up arrow **/ + mouse_down_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, + y_abs + GLUI_SPINNER_ARROW_Y+1 ); + mouse_up_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, + y_abs + GLUI_SPINNER_ARROW_Y+1, true ); + } + else if ( key == GLUT_KEY_DOWN ) { /** Simulate a click in the up arrow **/ + mouse_down_handler(x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, + y_abs+GLUI_SPINNER_ARROW_Y+1+GLUI_SPINNER_ARROW_HEIGHT); + mouse_up_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, + y_abs+GLUI_SPINNER_ARROW_Y+1 +GLUI_SPINNER_ARROW_HEIGHT, + true ); + } + else if ( key == GLUT_KEY_HOME ) { /** Set value to limit top - + or increment by 10 **/ + } + else if ( key == GLUT_KEY_END ) { + } + + return true; +} + + +/******************************* GLUI_Spinner::set_float_val() ************/ + +void GLUI_Spinner::set_float_val( float new_val ) +{ + if ( NOT edittext ) + return; + + edittext->set_float_val( new_val ); +} + + +/********************************** GLUI_Spinner::set_int_val() ************/ + +void GLUI_Spinner::set_int_val( int new_val ) +{ + if ( NOT edittext ) + return; + + edittext->set_int_val( new_val ); +} + + +/************************************ GLUI_Spinner::update_size() **********/ + +void GLUI_Spinner::update_size( void ) +{ + if (!edittext) return; + /*edittext->w = this->w - GLUI_SPINNER_ARROW_WIDTH-3; */ + this->w = edittext->w + GLUI_SPINNER_ARROW_WIDTH + 3; +} + + +/************************************ GLUI_Spinner::find_arrow() ************/ + +int GLUI_Spinner::find_arrow( int local_x, int local_y ) +{ + local_x -= x_abs; + local_y -= y_abs; + + if ( local_x >= (w - GLUI_SPINNER_ARROW_WIDTH) AND + local_x <= w ) { + + if ( local_y >= GLUI_SPINNER_ARROW_Y AND + local_y <= (GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT) ) + return GLUI_SPINNER_STATE_UP; + + if ( local_y >= GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT AND + local_y <= (GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT*2) ) + return GLUI_SPINNER_STATE_DOWN; + + } + + return GLUI_SPINNER_STATE_NONE; +} + + +/***************************************** GLUI_Spinner::do_click() **********/ + +void GLUI_Spinner::do_click( void ) +{ + int direction = 0; + float incr; + float modifier_factor; + + if ( state == GLUI_SPINNER_STATE_UP ) + direction = +1; + else if ( state == GLUI_SPINNER_STATE_DOWN ) + direction = -1; + + increase_growth(); + + modifier_factor = 1.0; + if ( glui ) { + if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) + modifier_factor = 100.0f; + else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) + modifier_factor = .01f; + } + + if ( this->data_type == GLUI_SPINNER_FLOAT OR 1) { + incr = growth * direction * modifier_factor * user_speed; + edittext->set_float_val( edittext->float_val + incr ); + /** Remember, edittext mirrors the float and int values ***/ + } + + /*** Now update live variable and do callback. We don't want + to do the callback on each iteration of this function, just on every + i^th iteration, where i is given by GLUI_SPINNER_CALLBACK_INTERVAL ****/ + callback_count++; + if ( (callback_count % GLUI_SPINNER_CALLBACK_INTERVAL ) == 0 ) + do_callbacks(); +} + + +/***************************************** GLUI_Spinner::do_drag() **********/ + +void GLUI_Spinner::do_drag( int x, int y ) +{ + int delta_y; + float incr, modifier_factor; + /* int delta_x; */ + + modifier_factor = 1.0f; + if ( glui ) { + if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) + modifier_factor = 100.0f; + else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) + modifier_factor = .01f; + } + + /* delta_x = x - last_x; */ + delta_y = -(y - last_y); + + if ( this->data_type == GLUI_SPINNER_FLOAT OR 1 ) { + incr = growth * delta_y * modifier_factor * user_speed; + edittext->set_float_val( edittext->float_val + incr ); + /** Remember, edittext mirrors the float and int values ***/ + } + + last_x = x; + last_y = y; + + /*** Now update live variable and do callback. We don't want + to do the callback on each iteration of this function, just on every + i^th iteration, where i is given by GLUI_SPINNER_CALLBACK_INTERVAL ****/ + + callback_count++; + if ( (callback_count % GLUI_SPINNER_CALLBACK_INTERVAL ) == 0 ) + do_callbacks(); +} + + +/***************************************** GLUI_Spinner::needs_idle() ******/ + +bool GLUI_Spinner::needs_idle( void ) const +{ + if (state == GLUI_SPINNER_STATE_UP OR state == GLUI_SPINNER_STATE_DOWN ) { + return true; + } + else { + return false; + } +} + +/***************************************** GLUI_Spinner::idle() **********/ + +void GLUI_Spinner::idle( void ) +{ + if ( NOT needs_idle() ) + return; + else + do_click(); +} + + +/************************************ GLUI_Spinner::do_callbacks() **********/ + +void GLUI_Spinner::do_callbacks( void ) +{ + /*** This is not necessary, b/c edittext automatically updates us ***/ + if ( NOT edittext ) + return; + this->float_val = edittext->float_val; + this->int_val = edittext->int_val; + /* *******************************************/ + + if ( NOT first_callback ) { + if ( data_type == GLUI_SPINNER_INT AND int_val == last_int_val ) { + return; + } + + if ( data_type == GLUI_SPINNER_FLOAT AND float_val == last_float_val ) { + return; + } + } + + this->execute_callback(); + + last_int_val = int_val; + last_float_val = float_val; + first_callback = false; +} + + +/********************************* GLUI_Spinner::set_float_limits() *********/ + +void GLUI_Spinner::set_float_limits( float low, float high, int limit_type ) +{ + if ( NOT edittext ) + return; + + edittext->set_float_limits( low, high, limit_type ); +} + + +/*********************************** GLUI_Spinner::set_int_limits() *********/ + +void GLUI_Spinner::set_int_limits( int low, int high, int limit_type ) +{ + if ( NOT edittext ) + return; + + edittext->set_int_limits( low, high, limit_type ); +} + + +/*********************************** GLUI_Spinner:reset_growth() *************/ + +void GLUI_Spinner::reset_growth( void ) +{ + float lo, hi; + + if ( edittext->has_limits == GLUI_LIMIT_NONE ) { + if ( data_type == GLUI_SPINNER_FLOAT ) + growth = sqrt(ABS(edittext->float_val)) * .05f; + else if ( data_type == GLUI_SPINNER_INT ) + growth = .4f; + } + else { + if ( data_type == GLUI_SPINNER_FLOAT ) { + lo = edittext->float_low; + hi = edittext->float_high; + growth = (hi-lo) / GLUI_SPINNER_GROWTH_STEPS; + } + else if ( data_type == GLUI_SPINNER_INT ) { + lo = (float) edittext->int_low; + hi = (float) edittext->int_high; + + growth = (hi-lo) / GLUI_SPINNER_GROWTH_STEPS; + } + } + + if ( growth == 0.0f ) + growth = .001f; +} + + +/******************************* GLUI_Spinner:increase_growth() *************/ + +void GLUI_Spinner::increase_growth( void ) +{ + float hi = 0.0,lo = 0.0; + + if ( data_type == GLUI_SPINNER_FLOAT ) { + lo = edittext->float_low; + hi = edittext->float_high; + } + else if ( data_type == GLUI_SPINNER_INT ) { + lo = (float) edittext->int_low; + hi = (float) edittext->int_high; + } + + if ( growth < (hi-lo) / GLUI_SPINNER_MIN_GROWTH_STEPS ) + growth *= growth_exp; + + /* printf( "growth: %f\n", growth ); */ +} + + +/*************************************** GLUI_Spinner:get_text() *************/ + +const char *GLUI_Spinner::get_text( void ) +{ + if (edittext) + return edittext->text.c_str(); + else + return ""; +} + + +/********************************** GLUI_Spinner:get_float_val() *************/ + +float GLUI_Spinner::get_float_val( void ) +{ + if (edittext) + return edittext->float_val; + else + return 0.0f; +} + + +/********************************** GLUI_Spinner:get_int_val() *************/ + +int GLUI_Spinner::get_int_val( void ) +{ + if (edittext) + return edittext->int_val; + else + return 0; +} + + diff --git a/Extras/glui/glui_statictext.cpp b/Extras/glui/glui_statictext.cpp index b0db4b943..21ffa13ad 100644 --- a/Extras/glui/glui_statictext.cpp +++ b/Extras/glui/glui_statictext.cpp @@ -1,105 +1,105 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_statictext.cpp - GLUI_StaticText Control - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_StaticText::GLUI_StaticText() **********/ -GLUI_StaticText::GLUI_StaticText( GLUI_Node *parent, const char *name ) -{ - common_init(); - set_name( name ); - parent->add_control( this ); -} - -/****************************** GLUI_StaticText::draw() **********/ - -void GLUI_StaticText::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - draw_text(); -} - - -/****************************** GLUI_StaticText::set_text() **********/ - -void GLUI_StaticText::set_text( const char *text ) -{ - set_name( text ); - redraw(); -} - - -/************************************ GLUI_StaticText::update_size() **********/ - -void GLUI_StaticText::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width( name ); - - if ( w < text_size ) - w = text_size; -} - - -/****************************** GLUI_StaticText::draw_text() **********/ - -void GLUI_StaticText::draw_text( void ) -{ - if ( NOT can_draw() ) - return; - - erase_text(); - draw_name( 0, 9 ); -} - - -/****************************** GLUI_StaticText::erase_text() **********/ - -void GLUI_StaticText::erase_text( void ) -{ - if ( NOT can_draw() ) - return; - - set_to_bkgd_color(); - glDisable( GL_CULL_FACE ); - glBegin( GL_TRIANGLES ); - glVertex2i( 0,0 ); glVertex2i( w, 0 ); glVertex2i( w, h ); - glVertex2i( 0, 0 ); glVertex2i( w, h ); glVertex2i( 0, h ); - glEnd(); -} - - - +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_statictext.cpp - GLUI_StaticText Control + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" + +/****************************** GLUI_StaticText::GLUI_StaticText() **********/ +GLUI_StaticText::GLUI_StaticText( GLUI_Node *parent, const char *name ) +{ + common_init(); + set_name( name ); + parent->add_control( this ); +} + +/****************************** GLUI_StaticText::draw() **********/ + +void GLUI_StaticText::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + + draw_text(); +} + + +/****************************** GLUI_StaticText::set_text() **********/ + +void GLUI_StaticText::set_text( const char *text ) +{ + set_name( text ); + redraw(); +} + + +/************************************ GLUI_StaticText::update_size() **********/ + +void GLUI_StaticText::update_size( void ) +{ + int text_size; + + if ( NOT glui ) + return; + + text_size = string_width( name ); + + if ( w < text_size ) + w = text_size; +} + + +/****************************** GLUI_StaticText::draw_text() **********/ + +void GLUI_StaticText::draw_text( void ) +{ + if ( NOT can_draw() ) + return; + + erase_text(); + draw_name( 0, 9 ); +} + + +/****************************** GLUI_StaticText::erase_text() **********/ + +void GLUI_StaticText::erase_text( void ) +{ + if ( NOT can_draw() ) + return; + + set_to_bkgd_color(); + glDisable( GL_CULL_FACE ); + glBegin( GL_TRIANGLES ); + glVertex2i( 0,0 ); glVertex2i( w, 0 ); glVertex2i( w, h ); + glVertex2i( 0, 0 ); glVertex2i( w, h ); glVertex2i( 0, h ); + glEnd(); +} + + + diff --git a/Extras/glui/glui_string.cpp b/Extras/glui/glui_string.cpp index e1431f800..b2fe2eb56 100644 --- a/Extras/glui/glui_string.cpp +++ b/Extras/glui/glui_string.cpp @@ -1,62 +1,62 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui.cpp - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher (this file, Bill Baxter 2005) - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA - - This program is -not- in the public domain. - -*****************************************************************************/ - -#include "GL/glui.h" -#include - -#if defined (_MSC_VER) && (_MSC_VER < 1500) -#define vsnprintf _vsnprintf -#endif - -GLUI_String& glui_format_str(GLUI_String& str, const char* fmt, ...) -{ - const size_t ISIZE = 128; - char stackbuf[ISIZE]; - size_t bufsz = ISIZE; - char *buf = stackbuf; - str = ""; - va_list arg; - while (1) { - va_start(arg, fmt); - int ret = vsnprintf(buf,299,fmt,arg); - va_end(arg); - if (ret>=0) { - break; - } - // else make a bigger buf, try again - bufsz <<= 1; - if (buf==stackbuf) buf = (char*)malloc(sizeof(char)*bufsz); - else buf = (char*)realloc(buf, sizeof(char)*bufsz); - } - if (buf!=stackbuf) free(buf); - str=buf; - return str; -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui.cpp + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher (this file, Bill Baxter 2005) + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA + + This program is -not- in the public domain. + +*****************************************************************************/ + +#include "GL/glui.h" +#include + +#if defined (_MSC_VER) && (_MSC_VER < 1500) +#define vsnprintf _vsnprintf +#endif + +GLUI_String& glui_format_str(GLUI_String& str, const char* fmt, ...) +{ + const size_t ISIZE = 128; + char stackbuf[ISIZE]; + size_t bufsz = ISIZE; + char *buf = stackbuf; + str = ""; + va_list arg; + while (1) { + va_start(arg, fmt); + int ret = vsnprintf(buf,299,fmt,arg); + va_end(arg); + if (ret>=0) { + break; + } + // else make a bigger buf, try again + bufsz <<= 1; + if (buf==stackbuf) buf = (char*)malloc(sizeof(char)*bufsz); + else buf = (char*)realloc(buf, sizeof(char)*bufsz); + } + if (buf!=stackbuf) free(buf); + str=buf; + return str; +} diff --git a/Extras/glui/glui_textbox.cpp b/Extras/glui/glui_textbox.cpp index 05967c473..9bf042658 100644 --- a/Extras/glui/glui_textbox.cpp +++ b/Extras/glui/glui_textbox.cpp @@ -1,1108 +1,1108 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_textbox.cpp - GLUI_TextBox control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher, 2004 John Kew - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include - - -static const int LINE_HEIGHT = 15; - -/****************************** GLUI_TextBox::GLUI_TextBox() **********/ - -GLUI_TextBox::GLUI_TextBox(GLUI_Node *parent, GLUI_String &live_var, - bool scroll, int id, GLUI_CB callback ) -{ - common_construct(parent, &live_var, scroll, id, callback); -} - -/****************************** GLUI_TextBox::GLUI_TextBox() **********/ - -GLUI_TextBox::GLUI_TextBox( GLUI_Node *parent, bool scroll, int id, - GLUI_CB callback ) -{ - common_construct(parent, NULL, scroll, id, callback); -} - -/****************************** GLUI_TextBox::common_construct() **********/ -void GLUI_TextBox::common_construct( - GLUI_Node *parent, GLUI_String *data, - bool scroll, int id, GLUI_CB callback) -{ - common_init(); - - GLUI_Node *tb_panel = parent; - - if (scroll) { - GLUI_Panel *p = new GLUI_Panel(parent,"",GLUI_PANEL_NONE); - p->x_off = 1; - tb_panel = p; - } - this->ptr_val = data; - if (data) { - this->live_type = GLUI_LIVE_STRING; - } else { - this->live_type = GLUI_LIVE_NONE; - } - this->user_id = id; - this->callback = callback; - this->name = "textbox"; - tb_panel->add_control( this ); - if (scroll) { - new GLUI_Column(tb_panel, false); - scrollbar = - new GLUI_Scrollbar(tb_panel, - "scrollbar", - GLUI_SCROLL_VERTICAL, - GLUI_SCROLL_INT); - scrollbar->set_object_callback(GLUI_TextBox::scrollbar_callback, this); - scrollbar->set_alignment(GLUI_ALIGN_LEFT); - // scrollbar->can_activate = false; //kills ability to mouse drag too - } - init_live(); -} - -/****************************** GLUI_TextBox::mouse_down_handler() **********/ - -int GLUI_TextBox::mouse_down_handler( int local_x, int local_y ) -{ - int tmp_insertion_pt; - - if ( debug ) dump( stdout, "-> MOUSE DOWN" ); - - tmp_insertion_pt = find_insertion_pt( local_x, local_y ); - if ( tmp_insertion_pt == -1 ) { - if ( glui ) - glui->deactivate_current_control( ); - return false; - } - - insertion_pt = tmp_insertion_pt; - - sel_start = sel_end = insertion_pt; - - keygoal_x = insert_x; - - if ( can_draw()) - update_and_draw_text(); - - if ( debug ) dump( stdout, "<- MOUSE UP" ); - - return true; -} - - -/******************************** GLUI_TextBox::mouse_up_handler() **********/ - -int GLUI_TextBox::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - return false; -} - - -/***************************** GLUI_TextBox::mouse_held_down_handler() ******/ - -int GLUI_TextBox::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int tmp_pt; - - if ( NOT new_inside ) return false; - - if ( debug ) dump( stdout, "-> HELD DOWN" ); - - tmp_pt = find_insertion_pt( local_x, local_y ); - keygoal_x = insert_x; - - if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ - special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { - /* moved mouse past right edge */ - special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { - sel_end = insertion_pt = tmp_pt; - - update_and_draw_text(); - } - - if ( debug ) - dump( stdout, "<- HELD DOWN" ); - - return false; -} - - -/****************************** GLUI_TextBox::key_handler() **********/ -int GLUI_TextBox::key_handler( unsigned char key,int modifiers ) -{ - int regular_key; - /* int has_selection; */ - - if ( NOT glui ) - return false; - - if ( debug ) - dump( stdout, "-> KEY HANDLER" ); - - regular_key = false; - bool ctrl_down = (modifiers & GLUT_ACTIVE_CTRL)!=0; - /* has_selection = (sel_start != sel_end); */ - - if ( key == CTRL('[')) { /* ESCAPE */ - glui->deactivate_current_control(); - return true; - } - else if ( (key == 127 AND !ctrl_down) OR /* FORWARD DELETE */ - ( key == CTRL('d') AND modifiers == GLUT_ACTIVE_CTRL) ) - { - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt < (int)text.length() ) { - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( ((key == 127) AND ctrl_down) OR // Delete word forward - ((key == 'd') AND (modifiers == GLUT_ACTIVE_ALT)) ) - { - if ( sel_start == sel_end ) { /* no selection */ - sel_start = insertion_pt; - sel_end = find_word_break( insertion_pt, +1 ); - } - - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - else if ( key == CTRL('h') ) { /* BACKSPACE */ - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt > 0 ) { - insertion_pt--; - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( modifiers == GLUT_ACTIVE_CTRL ) /* CTRL ONLY */ - { - /* Ctrl-key bindings */ - if ( key == CTRL('a') ) { - return special_handler( GLUT_KEY_HOME, 0 ); - } - else if ( key == CTRL('e') ) { - return special_handler( GLUT_KEY_END, 0 ); - } - else if ( key == CTRL('b') ) { - return special_handler( GLUT_KEY_LEFT, 0 ); - } - else if ( key == CTRL('f') ) { - return special_handler( GLUT_KEY_RIGHT, 0 ); - } - else if ( key == CTRL('p') ) { - return special_handler( GLUT_KEY_UP, 0 ); - } - else if ( key == CTRL('n') ) { - return special_handler( GLUT_KEY_DOWN, 0 ); - } - else if ( key == CTRL('u') ) { /* ERASE LINE */ - insertion_pt = 0; - text.erase(0,text.length()); - sel_start = sel_end = 0; - } - else if ( key == CTRL('k') ) { /* KILL TO END OF LINE */ - sel_start = sel_end = insertion_pt; - text.erase(insertion_pt,GLUI_String::npos); - } - } - else if ( modifiers == GLUT_ACTIVE_ALT ) /* ALT ONLY */ - { - if ( key == 'b' ) { // Backward word - return special_handler ( GLUT_KEY_LEFT, GLUT_ACTIVE_CTRL ); - } - if ( key == 'f' ) { // Forward word - return special_handler ( GLUT_KEY_RIGHT, GLUT_ACTIVE_CTRL ); - } - } - else if ( (modifiers & GLUT_ACTIVE_CTRL) OR - (modifiers & GLUT_ACTIVE_ALT) ) - { - /** ignore other keys with modifiers */ - return true; - } - else { /* Regular key */ - if ( key == 13 ) /* RETURNS are written as newlines*/ - key = '\n'; - - regular_key = true; - - /** This is just to get rid of warnings - the flag regular_key is - set if the key was not a backspace, return, whatever. But I - believe if we're here, we know it was a regular key anyway */ - if ( regular_key ) { - } - - /**** If there's a current selection, erase it ******/ - if ( sel_start != sel_end ) { - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - - /******** We insert the character into the string ***/ - - text.insert(insertion_pt,1,key); - - /******** Move the insertion point and substring_end one over ******/ - insertion_pt++; - substring_end++; - - sel_start = sel_end = insertion_pt; - } - - /******** Now redraw text ***********/ - /* Hack to prevent text box from being cleared first **/ - /** int substring_change = update_substring_bounds(); - draw_text_only = - (NOT substring_change AND NOT has_selection AND regular_key ); - */ - - draw_text_only = false; /** Well, hack is not yet working **/ - update_and_draw_text(); - draw_text_only = false; - - - if ( debug ) - dump( stdout, "<- KEY HANDLER" ); - - return true; -} - -/****************************** GLUI_TextBox::enable() **********/ - -void GLUI_TextBox::enable( void ) -{ - GLUI_Control::enable(); - scrollbar->enable(); -} - -/****************************** GLUI_TextBox::disable() **********/ - -void GLUI_TextBox::disable( void ) -{ - GLUI_Control::disable(); - scrollbar->disable(); -} - -/****************************** GLUI_TextBox::activate() **********/ - -void GLUI_TextBox::activate( int how ) -{ - if ( debug ) - dump( stdout, "-> ACTIVATE" ); - active = true; - - if ( how == GLUI_ACTIVATE_MOUSE ) - return; /* Don't select everything if activated with mouse */ - - orig_text = text; - - sel_start = 0; - sel_end = int(text.length()); - insertion_pt = 0; - if ( debug ) - dump( stdout, "<- ACTIVATE" ); -} - - -/****************************** GLUI_TextBox::deactivate() **********/ - -void GLUI_TextBox::deactivate( void ) -{ - active = false; - - if ( NOT glui ) - return; - - if ( debug ) - dump( stdout, "-> DISACTIVATE" ); - - sel_start = sel_end = insertion_pt = -1; - - /***** Retrieve the current value from the text *****/ - /***** The live variable will be updated by set_text() ****/ - set_text(text.c_str()); /* This will force callbacks and gfx refresh */ - - update_substring_bounds(); - - /******** redraw text without insertion point ***********/ - redraw(); - - /***** Now do callbacks if value changed ******/ - if ( orig_text != text ) { - this->execute_callback(); - - - } - - - if ( debug ) - dump( stdout, "<- DISACTIVATE" ); -} - -/****************************** GLUI_TextBox::draw() **********/ - -void GLUI_TextBox::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int line = 0; - int text_length; - int box_width; - int i; - - /* Bevelled Border */ - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( 0, 0 ); glVertex2i( 0, h ); - - glColor3f( 1., 1., 1. ); - glVertex2i( 0, h ); glVertex2i( w, h ); - glVertex2i( w, h ); glVertex2i( w, 0 ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( 1, 1 ); glVertex2i( 1, h-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); - glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); - glEnd(); - - /* Draw Background if enabled*/ - if (enabled) { - glColor3f( 1., 1., 1. ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } else { - glColor3f( .8, .8, .8 ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } - - /* Begin Drawing Lines of Text */ - substring_start = 0; - substring_end = 0; - text_length = int(text.length())-1; - - /* Figure out how wide the box is */ - box_width = get_box_width(); - - /* Get the first line substring */ - while (substring_width(substring_start, substring_end+1 ) < box_width && - substring_end < text_length && text[substring_end+1] != '\n') - substring_end++; - - /* Figure out which lines are visible*/ - - visible_lines = (int)(h-20)/LINE_HEIGHT; - if (start_line < (curr_line-visible_lines)) { - for (i = 0; ((curr_line-i)*LINE_HEIGHT+20) > h; i++); - start_line = i; - } else if ( start_line > curr_line) { - start_line = curr_line; - } - line = 0; - do { - if (line && substring_end < text_length) { - substring_start = substring_end+1; - while (substring_width(substring_start, substring_end+1 ) < box_width && - substring_end < text_length && text[substring_end+1] != '\n') - substring_end++; - } - if (text[substring_end+1] == '\n') { /* Skip newline */ - substring_end++; - } - if (line < start_line || (line > curr_line && curr_line > (start_line + visible_lines))) { - line++; - continue; - } - if ((line - start_line) <= visible_lines) - draw_text(0,(line - start_line)*LINE_HEIGHT); /* tabs and other nasties are handled by substring_width */ - line++; - } while (substring_end < text_length); - - num_lines = line; - - draw_insertion_pt(); - if (scrollbar) { - scrollbar->set_int_limits(MAX(0,num_lines/*-1*/-visible_lines),0); - glPushMatrix(); - glTranslatef(scrollbar->x_abs-x_abs, scrollbar->y_abs-y_abs,0.0); - scrollbar->draw_scroll(); - glPopMatrix(); - } -} - - - -/************************** GLUI_TextBox::update_substring_bounds() *********/ - -int GLUI_TextBox::update_substring_bounds( void ) -{ - int box_width; - int text_len = int(text.length()); - int old_start, old_end; - - old_start = substring_start; - old_end = substring_end; - - /*** Calculate the width of the usable area of the edit box ***/ - box_width = get_box_width(); - - CLAMP( substring_end, 0, MAX(text_len-1,0) ); - CLAMP( substring_start, 0, MAX(text_len-1,0) ); - - if ( debug ) dump( stdout, "-> UPDATE SS" ); - - if ( insertion_pt >= 0 AND - insertion_pt < substring_start ) { /* cursor moved left */ - substring_start = insertion_pt; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - } - else if ( insertion_pt > substring_end ) { /* cursor moved right */ - substring_end = insertion_pt-1; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_start++; - } - else { /* cursor is within old substring bounds */ - if ( last_insertion_pt > insertion_pt ) { /* cursor moved left */ - } - else { - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - while(substring_width( substring_start, substring_end+1 ) <= box_width - AND substring_end < text_len-1 ) - substring_end++; - } - } - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - last_insertion_pt = insertion_pt; - - /*** No selection if not enabled ***/ - if ( NOT enabled ) { - sel_start = sel_end = 0; - } - - if ( debug ) dump( stdout, "<- UPDATE SS" ); - - if ( substring_start == old_start AND substring_end == old_end ) - return false; /*** bounds did not change ***/ - else - return true; /*** bounds did change ***/ - -} - - -/********************************* GLUI_TextBox::update_x_offsets() *********/ - -void GLUI_TextBox::update_x_offsets( void ) -{ -} - - -/********************************* GLUI_TextBox::draw_text() ****************/ - -void GLUI_TextBox::draw_text( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_x, i, sel_lo, sel_hi, x_pos; - - if ( debug ) dump( stdout, "-> DRAW_TEXT" ); - - /** Find where to draw the text **/ - - text_x = 2 + GLUI_TEXTBOX_BOXINNERMARGINX; - - /** Find lower and upper selection bounds **/ - sel_lo = MIN(sel_start, sel_end ); - sel_hi = MAX(sel_start, sel_end ); - - int sel_x_start, sel_x_end, delta; - - /** Draw selection area dark **/ - if ( sel_start != sel_end ) { - sel_x_start = text_x; - sel_x_end = text_x; - delta = 0; - for( i=substring_start; sel_x_end < (w - text_x) && i<=substring_end; i++ ) { - delta = 0; - if (text[i] == '\t') // Character is a tab, go to next tab stop - while (((delta + sel_x_end) < (w - text_x)) && - (delta == 0 || delta % tab_width)) - delta++; - else - delta = char_width( text[i] ); - - if ( i < sel_lo ) { - sel_x_start += delta; - sel_x_end += delta; - } - else if ( i < sel_hi ) { - sel_x_end += delta; - } - } - - glColor3f( 0.0f, 0.0f, .6f ); - glRecti(sel_x_start, y+5, sel_x_end, y+20); - } - - - if ( sel_start == sel_end ) { // No current selection - x_pos = text_x; - if ( enabled ) - glColor3b( 0, 0, 0 ); - else - glColor3b( 32, 32, 32 ); - - glRasterPos2i( text_x, y+LINE_HEIGHT); - for( i=substring_start; i<=substring_end; i++ ) { - if (this->text[i] == '\t') { // Character is a tab, go to next tab stop - x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; - glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab - } else { - glutBitmapCharacter( get_font(), this->text[i] ); - x_pos += char_width( this->text[i] ); - } - } - } - else { // There is a selection - x_pos = text_x; - for( i=substring_start; i<=substring_end; i++ ) { - if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { // This character is selected - glColor3f( 1., 1., 1. ); - glRasterPos2i( x_pos, y+LINE_HEIGHT); - if (this->text[i] == '\t') { // Character is a tab, go to next tab stop - x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; - } - else - glutBitmapCharacter( get_font(), this->text[i] ); - } - else { - glColor3f( 0., 0., 0. ); - glRasterPos2i( x_pos, y+LINE_HEIGHT); - if (this->text[i] == '\t') { // Character is a tab, go to next tab stop - x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; - glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab - } else - glutBitmapCharacter( get_font(), this->text[i] ); - } - - x_pos += char_width( text[i] ); - } - } - - if ( debug ) dump( stdout, "<- DRAW_TEXT" ); -} - - -/******************************** GLUI_TextBox::find_insertion_pt() *********/ -/* This function returns the character number *before which* the insertion */ -/* point goes */ - -int GLUI_TextBox::find_insertion_pt( int x, int y ) -{ - /*** See if we clicked outside box ***/ - if ( x < this->x_abs || y < this->y_abs) - return -1; - - /*** See if we clicked in an empty box ***/ - if ( text.empty() ) - return 0; - - /* update insert variables */ - insert_x = x; - insert_y = y; - - int text_length = int(text.length())-1; - int box_width = get_box_width(); - - int sol = 0; - int eol = 0; - int line = 0; - - int y_off = y - (y_abs + 2 + GLUI_TEXTBOX_BOXINNERMARGINX); - int x_off = x - (x_abs + 2 + GLUI_TEXTBOX_BOXINNERMARGINX); - - /* Find the line clicked, - The possibility of long lines getting wrapped complicates this. */ - while ((line-start_line+1)*LINE_HEIGHT < y_off && eol < text_length) - { - while (eol < text_length && text[eol] != '\n' && - substring_width(sol, eol+1) <= box_width) - { - eol++; - } - if (text[eol]=='\n' && eol=x_off) { - // did we go far enough? (see if click was >1/2 width of last char) - int decision_pt = prev_w+(total_w-prev_w)/2; - if (x_off>decision_pt) eol++; - } - return eol; - -#if 0 - while (eol < text_length && text[eol] != '\n' && - substring_width(sol, eol+1) < box_width ) - { - eol++; - } - - - /* We move from right to left, looking to see if the mouse was clicked - to the right of the ith character */ -#if 0 - int curr_x = this->x_abs - + substring_width( sol, eol ) - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_TEXTBOX_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ -#endif - - /** find mouse click in text **/ - - if (x_off > substring_width(sol, eol)) - return eol; - - for(i = sol; i <= eol+1; i++) { - if (x_off <= substring_width(sol, i)) - return i+1; - } - return 0; -#endif -} - - -int GLUI_TextBox::get_box_width() -{ - return MAX( this->w - - 4 /* 2 * the two-line box border */ - - 2 * GLUI_TEXTBOX_BOXINNERMARGINX, 0 ); - -} - -/******************************** GLUI_TextBox::draw_insertion_pt() *********/ - -void GLUI_TextBox::draw_insertion_pt( void ) -{ - int curr_x, box_width, text_length, eol, sol, line; - - if ( NOT can_draw() ) - return; - - /*** Don't draw insertion pt if control is disabled ***/ - if ( NOT enabled ) - return; - - if ( sel_start != sel_end OR insertion_pt < 0 ) { - return; /* Don't draw insertion point if there is a current selection */ - } - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); - - /* printf( "insertion pt: %d\n", insertion_pt ); */ - - box_width = get_box_width(); - - // This function is unable to distinguish whether an insertion - // point on a line break should be drawn on the line before or the line after. - // This depends on the sequence of operations used to get there, and this - // function just doesn't have that information. If curr_line were kept up - // to date elsewhere that could be used here to disambiguate, but arrow keys - // and such do not update it. - - sol = 0; - eol = 0; - text_length = int(text.length())-1; - - //while (eol < text_length && text[eol] != '\n' - // && substring_width(sol, eol + 1) < box_width ) - // eol++; - line = 0; - while (eol < insertion_pt && eol <= text_length) - { - if (text[eol] == '\n' || substring_width(sol, eol + 1) >= box_width) - { - eol++; - if (text[eol]=='\n'||eol!=insertion_pt - ||(eol==insertion_pt && eol>0 && text[eol-1]=='\n')) { - sol = eol; - line++; - } - } - else { - eol++; - } - } - - //glColor3f(1,0,0); - //glRecti(0, curr_line*LINE_HEIGHT, 3, (curr_line+1)*LINE_HEIGHT); - - curr_line = line; - - if (scrollbar) - scrollbar->set_int_val(start_line); - if (curr_line < start_line || curr_line > (start_line + visible_lines)) /* Insertion pt out of draw area */ - return; - - curr_x = this->x_abs - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_TEXTBOX_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ - - curr_x += substring_width(sol,insertion_pt-1); - if (insertion_pt == text.length() && text[text.length()-1] == '\n' - || curr_x-this->x_abs > (w - 2 - GLUI_TEXTBOX_BOXINNERMARGINX)) { // Insert on the next line - curr_x = this->x_abs + GLUI_TEXTBOX_BOXINNERMARGINX; - line++; - } - /* update insertion coordinates */ - insert_x = curr_x+5; /* I hate magic numbers too, these offset the imagined insertion point */ - insert_y = (curr_line-start_line+2)*LINE_HEIGHT; - - - glColor3f( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_LOOP ); - - curr_x -= x_abs; - glVertex2i( curr_x+1, (curr_line-start_line)*LINE_HEIGHT + 4 ); - glVertex2i( curr_x, (curr_line-start_line)*LINE_HEIGHT + 4 ); - glVertex2i( curr_x+1, (curr_line-start_line)*LINE_HEIGHT + 16 ); - glVertex2i( curr_x, (curr_line-start_line)*LINE_HEIGHT + 16 ); - glEnd(); - - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); -} - - - - -/******************************** GLUI_TextBox::substring_width() *********/ -int GLUI_TextBox::substring_width( int start, int end, int initial_width ) -{ - // This function only works properly if start is really the start of a line. - // Otherwise tabs will be messed up. - int i, width = initial_width; - - for( i=start; i<=end; i++ ) - if (text[i] == '\t') { // Character is a tab, jump to next tab stop - width += tab_width-(width%tab_width); - //while (width == 0 || width % tab_width) - // width++; - } - else - width += char_width( text[i] ); - - return width; -} - - -/***************************** GLUI_TextBox::update_and_draw_text() ********/ - -void GLUI_TextBox::update_and_draw_text( void ) -{ - //update_substring_bounds(); - /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ - - redraw(); -} - - -/********************************* GLUI_TextBox::special_handler() **********/ - -int GLUI_TextBox::special_handler( int key,int modifiers ) -{ - int tmp_insertion_pt; - if ( NOT glui ) - return false; - - if ( debug ) - printf( "SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", - key, modifiers, substring_start, substring_end,insertion_pt, - sel_start, sel_end ); - - if ( key == GLUT_KEY_DOWN ) { - if (insert_x == -1 || insert_y == -1) - return false; - tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y+LINE_HEIGHT); - if (tmp_insertion_pt < 0) - return false; - insertion_pt = tmp_insertion_pt; - sel_end = insertion_pt; - if (!(modifiers & GLUT_ACTIVE_SHIFT)) { - sel_start = sel_end; - } - if ( can_draw()) - update_and_draw_text(); - } else if ( key == GLUT_KEY_UP ) { - if (insert_x == -1 || insert_y == -1) - return false; - tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y-LINE_HEIGHT); - if (tmp_insertion_pt < 0) - return false; - insertion_pt = tmp_insertion_pt; - sel_end = insertion_pt; - if (!(modifiers & GLUT_ACTIVE_SHIFT)) { - sel_start = sel_end; - } - if ( can_draw()) - update_and_draw_text(); - } else if ( key == GLUT_KEY_LEFT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, -1 ); - } - else { - insertion_pt--; - } - // update keygoal_x! - } - else if ( key == GLUT_KEY_RIGHT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, +1 ); - } - else { - insertion_pt++; - } - // update keygoal_x! - } - else if ( key == GLUT_KEY_HOME ) { - insertion_pt = 0; - // update keygoal_x! - } - else if ( key == GLUT_KEY_END ) { - insertion_pt = int(text.length()); - // update keygoal_x! - } - - /*** Update selection if shift key is down ***/ - if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) - sel_end = insertion_pt; - else - sel_start = sel_end = insertion_pt; - - - CLAMP( insertion_pt, 0, (int)text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_start, 0, (int)text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_end, 0, (int)text.length()); /* Make sure insertion_pt - is in bounds */ - - /******** Now redraw text ***********/ - if ( can_draw()) - update_and_draw_text(); - - return true; -} - - -/****************************** GLUI_TextBox::find_word_break() **********/ -/* It looks either left or right (depending on value of 'direction' */ -/* for the beginning of the next 'word', where word are characters */ -/* separated by one of the following tokens: " :-.," */ -/* If there is no next word in the specified direction, this returns */ -/* the beginning of 'text', or the very end. */ - -int GLUI_TextBox::find_word_break( int start, int direction ) -{ - int i, j; - char breaks[] = " \n\t:-.,"; - int num_break_chars = (int)strlen(breaks), text_len = int(text.length()); - int new_pt; - - /** If we're moving left, we have to start two back, in case we're either - already at the beginning of a word, or on a separating token. - Otherwise, this function would just return the word we're already at **/ - if ( direction == -1 ) { - start -= 2; - } - - /***** Iterate over text in the specified direction *****/ - for ( i=start; i >= 0 AND i < text_len; i += direction ) { - - /** For each character in text, iterate over list of separating tokens **/ - for( j=0; j 0 ) /* Return the end of string */ - return text_len; - else /* Return the beginning of the text */ - return 0; -} - - -/********************************** GLUI_TextBox::clear_substring() ********/ - -void GLUI_TextBox::clear_substring( int start, int end ) -{ - text.erase(start,end-start); -} - - - -/************************************ GLUI_TextBox::update_size() **********/ - -void GLUI_TextBox::update_size( void ) -{ - if ( NOT glui ) - return; - - if ( w < GLUI_TEXTBOX_MIN_TEXT_WIDTH ) - w = GLUI_TEXTBOX_MIN_TEXT_WIDTH; -} - - -/****************************** GLUI_TextBox::set_text() **********/ - -void GLUI_TextBox::set_text( const char *new_text ) -{ - text = new_text; - - substring_start = 0; - substring_end = int(text.length()) - 1; - insertion_pt = -1; - sel_start = 0; - sel_end = 0; - visible_lines = 0; - start_line = 0; - curr_line = 0; - num_lines = 0; - - if ( can_draw() ) - update_and_draw_text(); - - /*** Now update the live variable ***/ - output_live(true); -} - - -/*************************************** GLUI_TextBox::dump() **************/ - -void GLUI_TextBox::dump( FILE *out, char *name ) -{ - fprintf( out, - "%s (edittext@%p): line:%d ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", - name, this, curr_line, - insertion_pt, substring_start, substring_end, sel_start, sel_end, - text.length()); -} - - -/**************************************** GLUI_TextBox::mouse_over() ********/ - -int GLUI_TextBox::mouse_over( int state, int x, int y ) -{ - if ( state && enabled) { - /* curr_cursor = GLUT_CURSOR_TEXT; */ - glutSetCursor( GLUT_CURSOR_TEXT ); - } - else { - /* printf( "OUT\n" ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - } - - return true; -} - -void GLUI_TextBox::scrollbar_callback(GLUI_Control *my_scrollbar) { - GLUI_Scrollbar *sb = my_scrollbar->dynamicCastGLUI_Scrollbar(); - if (!sb) return; - GLUI_TextBox* me = (GLUI_TextBox*) sb->associated_object; - if (me->scrollbar == NULL) - return; - int new_start_line = sb->get_int_val(); // ?? - me->start_line = new_start_line; - if (new_start_line < (me->curr_line - me->visible_lines)) - me->curr_line = new_start_line + me->visible_lines; - if (new_start_line > me->curr_line) - me->curr_line = new_start_line; - if ( me->can_draw() ) - me->update_and_draw_text(); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_textbox.cpp - GLUI_TextBox control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher, 2004 John Kew + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "glui_internal_control.h" +#include + + +static const int LINE_HEIGHT = 15; + +/****************************** GLUI_TextBox::GLUI_TextBox() **********/ + +GLUI_TextBox::GLUI_TextBox(GLUI_Node *parent, GLUI_String &live_var, + bool scroll, int id, GLUI_CB callback ) +{ + common_construct(parent, &live_var, scroll, id, callback); +} + +/****************************** GLUI_TextBox::GLUI_TextBox() **********/ + +GLUI_TextBox::GLUI_TextBox( GLUI_Node *parent, bool scroll, int id, + GLUI_CB callback ) +{ + common_construct(parent, NULL, scroll, id, callback); +} + +/****************************** GLUI_TextBox::common_construct() **********/ +void GLUI_TextBox::common_construct( + GLUI_Node *parent, GLUI_String *data, + bool scroll, int id, GLUI_CB callback) +{ + common_init(); + + GLUI_Node *tb_panel = parent; + + if (scroll) { + GLUI_Panel *p = new GLUI_Panel(parent,"",GLUI_PANEL_NONE); + p->x_off = 1; + tb_panel = p; + } + this->ptr_val = data; + if (data) { + this->live_type = GLUI_LIVE_STRING; + } else { + this->live_type = GLUI_LIVE_NONE; + } + this->user_id = id; + this->callback = callback; + this->name = "textbox"; + tb_panel->add_control( this ); + if (scroll) { + new GLUI_Column(tb_panel, false); + scrollbar = + new GLUI_Scrollbar(tb_panel, + "scrollbar", + GLUI_SCROLL_VERTICAL, + GLUI_SCROLL_INT); + scrollbar->set_object_callback(GLUI_TextBox::scrollbar_callback, this); + scrollbar->set_alignment(GLUI_ALIGN_LEFT); + // scrollbar->can_activate = false; //kills ability to mouse drag too + } + init_live(); +} + +/****************************** GLUI_TextBox::mouse_down_handler() **********/ + +int GLUI_TextBox::mouse_down_handler( int local_x, int local_y ) +{ + int tmp_insertion_pt; + + if ( debug ) dump( stdout, "-> MOUSE DOWN" ); + + tmp_insertion_pt = find_insertion_pt( local_x, local_y ); + if ( tmp_insertion_pt == -1 ) { + if ( glui ) + glui->deactivate_current_control( ); + return false; + } + + insertion_pt = tmp_insertion_pt; + + sel_start = sel_end = insertion_pt; + + keygoal_x = insert_x; + + if ( can_draw()) + update_and_draw_text(); + + if ( debug ) dump( stdout, "<- MOUSE UP" ); + + return true; +} + + +/******************************** GLUI_TextBox::mouse_up_handler() **********/ + +int GLUI_TextBox::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + return false; +} + + +/***************************** GLUI_TextBox::mouse_held_down_handler() ******/ + +int GLUI_TextBox::mouse_held_down_handler( int local_x, int local_y, + bool new_inside) +{ + int tmp_pt; + + if ( NOT new_inside ) return false; + + if ( debug ) dump( stdout, "-> HELD DOWN" ); + + tmp_pt = find_insertion_pt( local_x, local_y ); + keygoal_x = insert_x; + + if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ + special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); + } + else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { + /* moved mouse past right edge */ + special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); + } + else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { + sel_end = insertion_pt = tmp_pt; + + update_and_draw_text(); + } + + if ( debug ) + dump( stdout, "<- HELD DOWN" ); + + return false; +} + + +/****************************** GLUI_TextBox::key_handler() **********/ +int GLUI_TextBox::key_handler( unsigned char key,int modifiers ) +{ + int regular_key; + /* int has_selection; */ + + if ( NOT glui ) + return false; + + if ( debug ) + dump( stdout, "-> KEY HANDLER" ); + + regular_key = false; + bool ctrl_down = (modifiers & GLUT_ACTIVE_CTRL)!=0; + /* has_selection = (sel_start != sel_end); */ + + if ( key == CTRL('[')) { /* ESCAPE */ + glui->deactivate_current_control(); + return true; + } + else if ( (key == 127 AND !ctrl_down) OR /* FORWARD DELETE */ + ( key == CTRL('d') AND modifiers == GLUT_ACTIVE_CTRL) ) + { + if ( sel_start == sel_end ) { /* no selection */ + if ( insertion_pt < (int)text.length() ) { + text.erase(insertion_pt,1); + } + } + else { /* There is a selection */ + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + } + else if ( ((key == 127) AND ctrl_down) OR // Delete word forward + ((key == 'd') AND (modifiers == GLUT_ACTIVE_ALT)) ) + { + if ( sel_start == sel_end ) { /* no selection */ + sel_start = insertion_pt; + sel_end = find_word_break( insertion_pt, +1 ); + } + + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + else if ( key == CTRL('h') ) { /* BACKSPACE */ + if ( sel_start == sel_end ) { /* no selection */ + if ( insertion_pt > 0 ) { + insertion_pt--; + text.erase(insertion_pt,1); + } + } + else { /* There is a selection */ + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + } + else if ( modifiers == GLUT_ACTIVE_CTRL ) /* CTRL ONLY */ + { + /* Ctrl-key bindings */ + if ( key == CTRL('a') ) { + return special_handler( GLUT_KEY_HOME, 0 ); + } + else if ( key == CTRL('e') ) { + return special_handler( GLUT_KEY_END, 0 ); + } + else if ( key == CTRL('b') ) { + return special_handler( GLUT_KEY_LEFT, 0 ); + } + else if ( key == CTRL('f') ) { + return special_handler( GLUT_KEY_RIGHT, 0 ); + } + else if ( key == CTRL('p') ) { + return special_handler( GLUT_KEY_UP, 0 ); + } + else if ( key == CTRL('n') ) { + return special_handler( GLUT_KEY_DOWN, 0 ); + } + else if ( key == CTRL('u') ) { /* ERASE LINE */ + insertion_pt = 0; + text.erase(0,text.length()); + sel_start = sel_end = 0; + } + else if ( key == CTRL('k') ) { /* KILL TO END OF LINE */ + sel_start = sel_end = insertion_pt; + text.erase(insertion_pt,GLUI_String::npos); + } + } + else if ( modifiers == GLUT_ACTIVE_ALT ) /* ALT ONLY */ + { + if ( key == 'b' ) { // Backward word + return special_handler ( GLUT_KEY_LEFT, GLUT_ACTIVE_CTRL ); + } + if ( key == 'f' ) { // Forward word + return special_handler ( GLUT_KEY_RIGHT, GLUT_ACTIVE_CTRL ); + } + } + else if ( (modifiers & GLUT_ACTIVE_CTRL) OR + (modifiers & GLUT_ACTIVE_ALT) ) + { + /** ignore other keys with modifiers */ + return true; + } + else { /* Regular key */ + if ( key == 13 ) /* RETURNS are written as newlines*/ + key = '\n'; + + regular_key = true; + + /** This is just to get rid of warnings - the flag regular_key is + set if the key was not a backspace, return, whatever. But I + believe if we're here, we know it was a regular key anyway */ + if ( regular_key ) { + } + + /**** If there's a current selection, erase it ******/ + if ( sel_start != sel_end ) { + clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); + insertion_pt = MIN(sel_start,sel_end); + sel_start = sel_end = insertion_pt; + } + + /******** We insert the character into the string ***/ + + text.insert(insertion_pt,1,key); + + /******** Move the insertion point and substring_end one over ******/ + insertion_pt++; + substring_end++; + + sel_start = sel_end = insertion_pt; + } + + /******** Now redraw text ***********/ + /* Hack to prevent text box from being cleared first **/ + /** int substring_change = update_substring_bounds(); + draw_text_only = + (NOT substring_change AND NOT has_selection AND regular_key ); + */ + + draw_text_only = false; /** Well, hack is not yet working **/ + update_and_draw_text(); + draw_text_only = false; + + + if ( debug ) + dump( stdout, "<- KEY HANDLER" ); + + return true; +} + +/****************************** GLUI_TextBox::enable() **********/ + +void GLUI_TextBox::enable( void ) +{ + GLUI_Control::enable(); + scrollbar->enable(); +} + +/****************************** GLUI_TextBox::disable() **********/ + +void GLUI_TextBox::disable( void ) +{ + GLUI_Control::disable(); + scrollbar->disable(); +} + +/****************************** GLUI_TextBox::activate() **********/ + +void GLUI_TextBox::activate( int how ) +{ + if ( debug ) + dump( stdout, "-> ACTIVATE" ); + active = true; + + if ( how == GLUI_ACTIVATE_MOUSE ) + return; /* Don't select everything if activated with mouse */ + + orig_text = text; + + sel_start = 0; + sel_end = int(text.length()); + insertion_pt = 0; + if ( debug ) + dump( stdout, "<- ACTIVATE" ); +} + + +/****************************** GLUI_TextBox::deactivate() **********/ + +void GLUI_TextBox::deactivate( void ) +{ + active = false; + + if ( NOT glui ) + return; + + if ( debug ) + dump( stdout, "-> DISACTIVATE" ); + + sel_start = sel_end = insertion_pt = -1; + + /***** Retrieve the current value from the text *****/ + /***** The live variable will be updated by set_text() ****/ + set_text(text.c_str()); /* This will force callbacks and gfx refresh */ + + update_substring_bounds(); + + /******** redraw text without insertion point ***********/ + redraw(); + + /***** Now do callbacks if value changed ******/ + if ( orig_text != text ) { + this->execute_callback(); + + + } + + + if ( debug ) + dump( stdout, "<- DISACTIVATE" ); +} + +/****************************** GLUI_TextBox::draw() **********/ + +void GLUI_TextBox::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int line = 0; + int text_length; + int box_width; + int i; + + /* Bevelled Border */ + glBegin( GL_LINES ); + glColor3f( .5, .5, .5 ); + glVertex2i( 0, 0 ); glVertex2i( w, 0 ); + glVertex2i( 0, 0 ); glVertex2i( 0, h ); + + glColor3f( 1., 1., 1. ); + glVertex2i( 0, h ); glVertex2i( w, h ); + glVertex2i( w, h ); glVertex2i( w, 0 ); + + if ( enabled ) + glColor3f( 0., 0., 0. ); + else + glColor3f( .25, .25, .25 ); + glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); + glVertex2i( 1, 1 ); glVertex2i( 1, h-1 ); + + glColor3f( .75, .75, .75 ); + glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); + glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); + glEnd(); + + /* Draw Background if enabled*/ + if (enabled) { + glColor3f( 1., 1., 1. ); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); + glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); + glEnd(); + } else { + glColor3f( .8, .8, .8 ); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); + glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); + glEnd(); + } + + /* Begin Drawing Lines of Text */ + substring_start = 0; + substring_end = 0; + text_length = int(text.length())-1; + + /* Figure out how wide the box is */ + box_width = get_box_width(); + + /* Get the first line substring */ + while (substring_width(substring_start, substring_end+1 ) < box_width && + substring_end < text_length && text[substring_end+1] != '\n') + substring_end++; + + /* Figure out which lines are visible*/ + + visible_lines = (int)(h-20)/LINE_HEIGHT; + if (start_line < (curr_line-visible_lines)) { + for (i = 0; ((curr_line-i)*LINE_HEIGHT+20) > h; i++); + start_line = i; + } else if ( start_line > curr_line) { + start_line = curr_line; + } + line = 0; + do { + if (line && substring_end < text_length) { + substring_start = substring_end+1; + while (substring_width(substring_start, substring_end+1 ) < box_width && + substring_end < text_length && text[substring_end+1] != '\n') + substring_end++; + } + if (text[substring_end+1] == '\n') { /* Skip newline */ + substring_end++; + } + if (line < start_line || (line > curr_line && curr_line > (start_line + visible_lines))) { + line++; + continue; + } + if ((line - start_line) <= visible_lines) + draw_text(0,(line - start_line)*LINE_HEIGHT); /* tabs and other nasties are handled by substring_width */ + line++; + } while (substring_end < text_length); + + num_lines = line; + + draw_insertion_pt(); + if (scrollbar) { + scrollbar->set_int_limits(MAX(0,num_lines/*-1*/-visible_lines),0); + glPushMatrix(); + glTranslatef(scrollbar->x_abs-x_abs, scrollbar->y_abs-y_abs,0.0); + scrollbar->draw_scroll(); + glPopMatrix(); + } +} + + + +/************************** GLUI_TextBox::update_substring_bounds() *********/ + +int GLUI_TextBox::update_substring_bounds( void ) +{ + int box_width; + int text_len = int(text.length()); + int old_start, old_end; + + old_start = substring_start; + old_end = substring_end; + + /*** Calculate the width of the usable area of the edit box ***/ + box_width = get_box_width(); + + CLAMP( substring_end, 0, MAX(text_len-1,0) ); + CLAMP( substring_start, 0, MAX(text_len-1,0) ); + + if ( debug ) dump( stdout, "-> UPDATE SS" ); + + if ( insertion_pt >= 0 AND + insertion_pt < substring_start ) { /* cursor moved left */ + substring_start = insertion_pt; + + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_end--; + } + else if ( insertion_pt > substring_end ) { /* cursor moved right */ + substring_end = insertion_pt-1; + + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_start++; + } + else { /* cursor is within old substring bounds */ + if ( last_insertion_pt > insertion_pt ) { /* cursor moved left */ + } + else { + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_end--; + + while(substring_width( substring_start, substring_end+1 ) <= box_width + AND substring_end < text_len-1 ) + substring_end++; + } + } + + while ( substring_width( substring_start, substring_end ) > box_width ) + substring_end--; + + last_insertion_pt = insertion_pt; + + /*** No selection if not enabled ***/ + if ( NOT enabled ) { + sel_start = sel_end = 0; + } + + if ( debug ) dump( stdout, "<- UPDATE SS" ); + + if ( substring_start == old_start AND substring_end == old_end ) + return false; /*** bounds did not change ***/ + else + return true; /*** bounds did change ***/ + +} + + +/********************************* GLUI_TextBox::update_x_offsets() *********/ + +void GLUI_TextBox::update_x_offsets( void ) +{ +} + + +/********************************* GLUI_TextBox::draw_text() ****************/ + +void GLUI_TextBox::draw_text( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int text_x, i, sel_lo, sel_hi, x_pos; + + if ( debug ) dump( stdout, "-> DRAW_TEXT" ); + + /** Find where to draw the text **/ + + text_x = 2 + GLUI_TEXTBOX_BOXINNERMARGINX; + + /** Find lower and upper selection bounds **/ + sel_lo = MIN(sel_start, sel_end ); + sel_hi = MAX(sel_start, sel_end ); + + int sel_x_start, sel_x_end, delta; + + /** Draw selection area dark **/ + if ( sel_start != sel_end ) { + sel_x_start = text_x; + sel_x_end = text_x; + delta = 0; + for( i=substring_start; sel_x_end < (w - text_x) && i<=substring_end; i++ ) { + delta = 0; + if (text[i] == '\t') // Character is a tab, go to next tab stop + while (((delta + sel_x_end) < (w - text_x)) && + (delta == 0 || delta % tab_width)) + delta++; + else + delta = char_width( text[i] ); + + if ( i < sel_lo ) { + sel_x_start += delta; + sel_x_end += delta; + } + else if ( i < sel_hi ) { + sel_x_end += delta; + } + } + + glColor3f( 0.0f, 0.0f, .6f ); + glRecti(sel_x_start, y+5, sel_x_end, y+20); + } + + + if ( sel_start == sel_end ) { // No current selection + x_pos = text_x; + if ( enabled ) + glColor3b( 0, 0, 0 ); + else + glColor3b( 32, 32, 32 ); + + glRasterPos2i( text_x, y+LINE_HEIGHT); + for( i=substring_start; i<=substring_end; i++ ) { + if (this->text[i] == '\t') { // Character is a tab, go to next tab stop + x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; + glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab + } else { + glutBitmapCharacter( get_font(), this->text[i] ); + x_pos += char_width( this->text[i] ); + } + } + } + else { // There is a selection + x_pos = text_x; + for( i=substring_start; i<=substring_end; i++ ) { + if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { // This character is selected + glColor3f( 1., 1., 1. ); + glRasterPos2i( x_pos, y+LINE_HEIGHT); + if (this->text[i] == '\t') { // Character is a tab, go to next tab stop + x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; + } + else + glutBitmapCharacter( get_font(), this->text[i] ); + } + else { + glColor3f( 0., 0., 0. ); + glRasterPos2i( x_pos, y+LINE_HEIGHT); + if (this->text[i] == '\t') { // Character is a tab, go to next tab stop + x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; + glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab + } else + glutBitmapCharacter( get_font(), this->text[i] ); + } + + x_pos += char_width( text[i] ); + } + } + + if ( debug ) dump( stdout, "<- DRAW_TEXT" ); +} + + +/******************************** GLUI_TextBox::find_insertion_pt() *********/ +/* This function returns the character number *before which* the insertion */ +/* point goes */ + +int GLUI_TextBox::find_insertion_pt( int x, int y ) +{ + /*** See if we clicked outside box ***/ + if ( x < this->x_abs || y < this->y_abs) + return -1; + + /*** See if we clicked in an empty box ***/ + if ( text.empty() ) + return 0; + + /* update insert variables */ + insert_x = x; + insert_y = y; + + int text_length = int(text.length())-1; + int box_width = get_box_width(); + + int sol = 0; + int eol = 0; + int line = 0; + + int y_off = y - (y_abs + 2 + GLUI_TEXTBOX_BOXINNERMARGINX); + int x_off = x - (x_abs + 2 + GLUI_TEXTBOX_BOXINNERMARGINX); + + /* Find the line clicked, + The possibility of long lines getting wrapped complicates this. */ + while ((line-start_line+1)*LINE_HEIGHT < y_off && eol < text_length) + { + while (eol < text_length && text[eol] != '\n' && + substring_width(sol, eol+1) <= box_width) + { + eol++; + } + if (text[eol]=='\n' && eol=x_off) { + // did we go far enough? (see if click was >1/2 width of last char) + int decision_pt = prev_w+(total_w-prev_w)/2; + if (x_off>decision_pt) eol++; + } + return eol; + +#if 0 + while (eol < text_length && text[eol] != '\n' && + substring_width(sol, eol+1) < box_width ) + { + eol++; + } + + + /* We move from right to left, looking to see if the mouse was clicked + to the right of the ith character */ +#if 0 + int curr_x = this->x_abs + + substring_width( sol, eol ) + + 2 /* The edittext box has a 2-pixel margin */ + + GLUI_TEXTBOX_BOXINNERMARGINX; /** plus this many pixels blank space + between the text and the box **/ +#endif + + /** find mouse click in text **/ + + if (x_off > substring_width(sol, eol)) + return eol; + + for(i = sol; i <= eol+1; i++) { + if (x_off <= substring_width(sol, i)) + return i+1; + } + return 0; +#endif +} + + +int GLUI_TextBox::get_box_width() +{ + return MAX( this->w + - 4 /* 2 * the two-line box border */ + - 2 * GLUI_TEXTBOX_BOXINNERMARGINX, 0 ); + +} + +/******************************** GLUI_TextBox::draw_insertion_pt() *********/ + +void GLUI_TextBox::draw_insertion_pt( void ) +{ + int curr_x, box_width, text_length, eol, sol, line; + + if ( NOT can_draw() ) + return; + + /*** Don't draw insertion pt if control is disabled ***/ + if ( NOT enabled ) + return; + + if ( sel_start != sel_end OR insertion_pt < 0 ) { + return; /* Don't draw insertion point if there is a current selection */ + } + + if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); + + /* printf( "insertion pt: %d\n", insertion_pt ); */ + + box_width = get_box_width(); + + // This function is unable to distinguish whether an insertion + // point on a line break should be drawn on the line before or the line after. + // This depends on the sequence of operations used to get there, and this + // function just doesn't have that information. If curr_line were kept up + // to date elsewhere that could be used here to disambiguate, but arrow keys + // and such do not update it. + + sol = 0; + eol = 0; + text_length = int(text.length())-1; + + //while (eol < text_length && text[eol] != '\n' + // && substring_width(sol, eol + 1) < box_width ) + // eol++; + line = 0; + while (eol < insertion_pt && eol <= text_length) + { + if (text[eol] == '\n' || substring_width(sol, eol + 1) >= box_width) + { + eol++; + if (text[eol]=='\n'||eol!=insertion_pt + ||(eol==insertion_pt && eol>0 && text[eol-1]=='\n')) { + sol = eol; + line++; + } + } + else { + eol++; + } + } + + //glColor3f(1,0,0); + //glRecti(0, curr_line*LINE_HEIGHT, 3, (curr_line+1)*LINE_HEIGHT); + + curr_line = line; + + if (scrollbar) + scrollbar->set_int_val(start_line); + if (curr_line < start_line || curr_line > (start_line + visible_lines)) /* Insertion pt out of draw area */ + return; + + curr_x = this->x_abs + + 2 /* The edittext box has a 2-pixel margin */ + + GLUI_TEXTBOX_BOXINNERMARGINX; /** plus this many pixels blank space + between the text and the box **/ + + curr_x += substring_width(sol,insertion_pt-1); + if (insertion_pt == text.length() && text[text.length()-1] == '\n' + || curr_x-this->x_abs > (w - 2 - GLUI_TEXTBOX_BOXINNERMARGINX)) { // Insert on the next line + curr_x = this->x_abs + GLUI_TEXTBOX_BOXINNERMARGINX; + line++; + } + /* update insertion coordinates */ + insert_x = curr_x+5; /* I hate magic numbers too, these offset the imagined insertion point */ + insert_y = (curr_line-start_line+2)*LINE_HEIGHT; + + + glColor3f( 0.0, 0.0, 0.0 ); + glBegin( GL_LINE_LOOP ); + + curr_x -= x_abs; + glVertex2i( curr_x+1, (curr_line-start_line)*LINE_HEIGHT + 4 ); + glVertex2i( curr_x, (curr_line-start_line)*LINE_HEIGHT + 4 ); + glVertex2i( curr_x+1, (curr_line-start_line)*LINE_HEIGHT + 16 ); + glVertex2i( curr_x, (curr_line-start_line)*LINE_HEIGHT + 16 ); + glEnd(); + + + if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); +} + + + + +/******************************** GLUI_TextBox::substring_width() *********/ +int GLUI_TextBox::substring_width( int start, int end, int initial_width ) +{ + // This function only works properly if start is really the start of a line. + // Otherwise tabs will be messed up. + int i, width = initial_width; + + for( i=start; i<=end; i++ ) + if (text[i] == '\t') { // Character is a tab, jump to next tab stop + width += tab_width-(width%tab_width); + //while (width == 0 || width % tab_width) + // width++; + } + else + width += char_width( text[i] ); + + return width; +} + + +/***************************** GLUI_TextBox::update_and_draw_text() ********/ + +void GLUI_TextBox::update_and_draw_text( void ) +{ + //update_substring_bounds(); + /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ + + redraw(); +} + + +/********************************* GLUI_TextBox::special_handler() **********/ + +int GLUI_TextBox::special_handler( int key,int modifiers ) +{ + int tmp_insertion_pt; + if ( NOT glui ) + return false; + + if ( debug ) + printf( "SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", + key, modifiers, substring_start, substring_end,insertion_pt, + sel_start, sel_end ); + + if ( key == GLUT_KEY_DOWN ) { + if (insert_x == -1 || insert_y == -1) + return false; + tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y+LINE_HEIGHT); + if (tmp_insertion_pt < 0) + return false; + insertion_pt = tmp_insertion_pt; + sel_end = insertion_pt; + if (!(modifiers & GLUT_ACTIVE_SHIFT)) { + sel_start = sel_end; + } + if ( can_draw()) + update_and_draw_text(); + } else if ( key == GLUT_KEY_UP ) { + if (insert_x == -1 || insert_y == -1) + return false; + tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y-LINE_HEIGHT); + if (tmp_insertion_pt < 0) + return false; + insertion_pt = tmp_insertion_pt; + sel_end = insertion_pt; + if (!(modifiers & GLUT_ACTIVE_SHIFT)) { + sel_start = sel_end; + } + if ( can_draw()) + update_and_draw_text(); + } else if ( key == GLUT_KEY_LEFT ) { + if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { + insertion_pt = find_word_break( insertion_pt, -1 ); + } + else { + insertion_pt--; + } + // update keygoal_x! + } + else if ( key == GLUT_KEY_RIGHT ) { + if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { + insertion_pt = find_word_break( insertion_pt, +1 ); + } + else { + insertion_pt++; + } + // update keygoal_x! + } + else if ( key == GLUT_KEY_HOME ) { + insertion_pt = 0; + // update keygoal_x! + } + else if ( key == GLUT_KEY_END ) { + insertion_pt = int(text.length()); + // update keygoal_x! + } + + /*** Update selection if shift key is down ***/ + if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) + sel_end = insertion_pt; + else + sel_start = sel_end = insertion_pt; + + + CLAMP( insertion_pt, 0, (int)text.length()); /* Make sure insertion_pt + is in bounds */ + CLAMP( sel_start, 0, (int)text.length()); /* Make sure insertion_pt + is in bounds */ + CLAMP( sel_end, 0, (int)text.length()); /* Make sure insertion_pt + is in bounds */ + + /******** Now redraw text ***********/ + if ( can_draw()) + update_and_draw_text(); + + return true; +} + + +/****************************** GLUI_TextBox::find_word_break() **********/ +/* It looks either left or right (depending on value of 'direction' */ +/* for the beginning of the next 'word', where word are characters */ +/* separated by one of the following tokens: " :-.," */ +/* If there is no next word in the specified direction, this returns */ +/* the beginning of 'text', or the very end. */ + +int GLUI_TextBox::find_word_break( int start, int direction ) +{ + int i, j; + char breaks[] = " \n\t:-.,"; + int num_break_chars = (int)strlen(breaks), text_len = int(text.length()); + int new_pt; + + /** If we're moving left, we have to start two back, in case we're either + already at the beginning of a word, or on a separating token. + Otherwise, this function would just return the word we're already at **/ + if ( direction == -1 ) { + start -= 2; + } + + /***** Iterate over text in the specified direction *****/ + for ( i=start; i >= 0 AND i < text_len; i += direction ) { + + /** For each character in text, iterate over list of separating tokens **/ + for( j=0; j 0 ) /* Return the end of string */ + return text_len; + else /* Return the beginning of the text */ + return 0; +} + + +/********************************** GLUI_TextBox::clear_substring() ********/ + +void GLUI_TextBox::clear_substring( int start, int end ) +{ + text.erase(start,end-start); +} + + + +/************************************ GLUI_TextBox::update_size() **********/ + +void GLUI_TextBox::update_size( void ) +{ + if ( NOT glui ) + return; + + if ( w < GLUI_TEXTBOX_MIN_TEXT_WIDTH ) + w = GLUI_TEXTBOX_MIN_TEXT_WIDTH; +} + + +/****************************** GLUI_TextBox::set_text() **********/ + +void GLUI_TextBox::set_text( const char *new_text ) +{ + text = new_text; + + substring_start = 0; + substring_end = int(text.length()) - 1; + insertion_pt = -1; + sel_start = 0; + sel_end = 0; + visible_lines = 0; + start_line = 0; + curr_line = 0; + num_lines = 0; + + if ( can_draw() ) + update_and_draw_text(); + + /*** Now update the live variable ***/ + output_live(true); +} + + +/*************************************** GLUI_TextBox::dump() **************/ + +void GLUI_TextBox::dump( FILE *out, char *name ) +{ + fprintf( out, + "%s (edittext@%p): line:%d ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", + name, this, curr_line, + insertion_pt, substring_start, substring_end, sel_start, sel_end, + text.length()); +} + + +/**************************************** GLUI_TextBox::mouse_over() ********/ + +int GLUI_TextBox::mouse_over( int state, int x, int y ) +{ + if ( state && enabled) { + /* curr_cursor = GLUT_CURSOR_TEXT; */ + glutSetCursor( GLUT_CURSOR_TEXT ); + } + else { + /* printf( "OUT\n" ); */ + glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); + } + + return true; +} + +void GLUI_TextBox::scrollbar_callback(GLUI_Control *my_scrollbar) { + GLUI_Scrollbar *sb = my_scrollbar->dynamicCastGLUI_Scrollbar(); + if (!sb) return; + GLUI_TextBox* me = (GLUI_TextBox*) sb->associated_object; + if (me->scrollbar == NULL) + return; + int new_start_line = sb->get_int_val(); // ?? + me->start_line = new_start_line; + if (new_start_line < (me->curr_line - me->visible_lines)) + me->curr_line = new_start_line + me->visible_lines; + if (new_start_line > me->curr_line) + me->curr_line = new_start_line; + if ( me->can_draw() ) + me->update_and_draw_text(); +} diff --git a/Extras/glui/glui_translation.cpp b/Extras/glui/glui_translation.cpp index e11c743a7..43e82d87a 100644 --- a/Extras/glui/glui_translation.cpp +++ b/Extras/glui/glui_translation.cpp @@ -1,559 +1,559 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_translation - GLUI_Translation control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" -#include "algebra3.h" - -/********************** GLUI_Translation::GLUI_Translation() ***/ - -GLUI_Translation::GLUI_Translation( - GLUI_Node *parent, const char *name, - int trans_t, float *value_ptr, - int id, GLUI_CB cb ) -{ - common_init(); - - set_ptr_val( value_ptr ); - user_id = id; - set_name( name ); - callback = cb; - parent->add_control( this ); - //init_live(); - - trans_type = trans_t; - - if ( trans_type == GLUI_TRANSLATION_XY ) { - float_array_size = 2; - } - else if ( trans_type == GLUI_TRANSLATION_X ) { - float_array_size = 1; - } - else if ( trans_type == GLUI_TRANSLATION_Y ) { - float_array_size = 1; - } - else if ( trans_type == GLUI_TRANSLATION_Z ) { - float_array_size = 1; - } - init_live(); -} - -/********************** GLUI_Translation::iaction_mouse_down_handler() ***/ -/* These are really in local coords (5/10/99) */ - -int GLUI_Translation::iaction_mouse_down_handler( int local_x, - int local_y ) -{ - int center_x, center_y; - - down_x = local_x; - down_y = local_y; - - if ( trans_type == GLUI_TRANSLATION_XY ) { - orig_x = float_array_val[0]; - orig_y = float_array_val[1]; - - /** Check if the Alt key is down, which means lock to an axis **/ - - center_x = w/2; - center_y = (h-18)/2; - - if ( glui->curr_modifiers & GLUT_ACTIVE_ALT ) { - if ( ABS(local_y-center_y) > ABS(local_x-center_x) ) { - locked = GLUI_TRANSLATION_LOCK_Y; - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - } - else { - locked = GLUI_TRANSLATION_LOCK_X; - glutSetCursor( GLUT_CURSOR_LEFT_RIGHT ); - } - } - else { - locked = GLUI_TRANSLATION_LOCK_NONE; - glutSetCursor( GLUT_CURSOR_SPRAY ); - } - } - else if ( trans_type == GLUI_TRANSLATION_X ) { - glutSetCursor( GLUT_CURSOR_LEFT_RIGHT ); - orig_x = float_array_val[0]; - } - else if ( trans_type == GLUI_TRANSLATION_Y ) { - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - orig_y = float_array_val[0]; - } - else if ( trans_type == GLUI_TRANSLATION_Z ) { - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - orig_z = float_array_val[0]; - } - - trans_mouse_code = 1; - redraw(); - - return false; -} - - -/*********************** GLUI_Translation::iaction_mouse_up_handler() **********/ - -int GLUI_Translation::iaction_mouse_up_handler( int local_x, int local_y, - bool inside ) -{ - trans_mouse_code = GLUI_TRANSLATION_MOUSE_NONE; - locked = GLUI_TRANSLATION_LOCK_NONE; - - redraw(); - - return false; -} - - -/******************* GLUI_Translation::iaction_mouse_held_down_handler() ******/ - -int GLUI_Translation::iaction_mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - float x_off, y_off; - float off_array[2]; - - x_off = scale_factor * (float)(local_x - down_x); - y_off = -scale_factor * (float)(local_y - down_y); - - if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) { - x_off *= 100.0f; - y_off *= 100.0f; - } - else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) { - x_off *= .01f; - y_off *= .01f; - } - - - if ( trans_type == GLUI_TRANSLATION_XY ) { - - if ( locked == GLUI_TRANSLATION_LOCK_X ) - y_off = 0.0; - else if ( locked == GLUI_TRANSLATION_LOCK_Y ) - x_off = 0.0; - - off_array[0] = x_off + orig_x; - off_array[1] = y_off + orig_y; - } - else if ( trans_type == GLUI_TRANSLATION_X ) { - off_array[0] = x_off + orig_x; - } - else if ( trans_type == GLUI_TRANSLATION_Y ) { - off_array[0] = y_off + orig_y; - } - else if ( trans_type == GLUI_TRANSLATION_Z ) { - off_array[0] = y_off + orig_z; - } - - set_float_array_val( (float*) &off_array[0] ); - - return false; -} - - -/******************** GLUI_Translation::iaction_draw_active_area_persp() **************/ - -void GLUI_Translation::iaction_draw_active_area_persp( void ) -{ -} - - -/******************** GLUI_Translation::iaction_draw_active_area_ortho() **********/ - -void GLUI_Translation::iaction_draw_active_area_ortho( void ) -{ - /********* Draw emboss circles around arcball control *********/ - float radius; - radius = (float)(h-22)/2.0; /* MIN((float)w/2.0, (float)h/2.0); */ - glLineWidth( 1.0 ); - - draw_emboss_box( (int) -radius-2, (int)radius+2, - (int)-radius-2, (int)radius+2 ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glTranslatef( .5, .5, .5 ); - /* glScalef( radius-1.0, radius-1.0, radius-1.0 ); */ - if ( trans_type == GLUI_TRANSLATION_Z ) - draw_2d_z_arrows((int)radius-1); - else if ( trans_type == GLUI_TRANSLATION_XY ) - draw_2d_xy_arrows((int)radius-1); - else if ( trans_type == GLUI_TRANSLATION_X ) - draw_2d_x_arrows((int)radius-1); - else if ( trans_type == GLUI_TRANSLATION_Y ) - draw_2d_y_arrows((int)radius-1); - - glPopMatrix(); -} - - -/******************************** GLUI_Translation::iaction_dump() **********/ - -void GLUI_Translation::iaction_dump( FILE *output ) -{ -} - - -/******************** GLUI_Translation::iaction_special_handler() **********/ - -int GLUI_Translation::iaction_special_handler( int key,int modifiers ) -{ - - return false; -} - - - -/*************************** GLUI_Translation::draw_2d_z_arrows() **************/ - -void GLUI_Translation::draw_2d_z_arrows( int radius ) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - draw_2d_arrow(radius, true, 2); - draw_2d_arrow(radius, true, 0); - } - else { - draw_2d_arrow(radius, false, 2); - draw_2d_arrow(radius, false, 0); - } -} - - -/*************************** GLUI_Translation::draw_2d_x_arrows() **************/ - -void GLUI_Translation::draw_2d_x_arrows( int radius ) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - draw_2d_arrow(radius, true, 1); - draw_2d_arrow(radius, true, 3); - } - else { - draw_2d_arrow(radius, false, 1); - draw_2d_arrow(radius, false, 3); - } -} - - -/*************************** GLUI_Translation::draw_2d_y_arrows() **************/ - -void GLUI_Translation::draw_2d_y_arrows( int radius ) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - draw_2d_arrow(radius, true, 0); - draw_2d_arrow(radius, true, 2); - } - else { - draw_2d_arrow(radius, false, 0); - draw_2d_arrow(radius, false, 2); - } -} - - -/************************** GLUI_Translation::draw_2d_xy_arrows() **************/ - -void GLUI_Translation::draw_2d_xy_arrows( int radius) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - if ( locked == GLUI_TRANSLATION_LOCK_X ) { - draw_2d_arrow(radius, false, 0); - draw_2d_arrow(radius, false, 2); - draw_2d_arrow(radius, true, 1); - draw_2d_arrow(radius, true, 3); - } - else if ( locked == GLUI_TRANSLATION_LOCK_Y ) { - draw_2d_arrow(radius, false, 1); - draw_2d_arrow(radius, false, 3); - draw_2d_arrow(radius, true, 0); - draw_2d_arrow(radius, true, 2); - } - else { - draw_2d_arrow(radius, true, 0); - draw_2d_arrow(radius, true, 1); - draw_2d_arrow(radius, true, 2); - draw_2d_arrow(radius, true, 3); - } - } - else { - draw_2d_arrow(radius, false, 0); - draw_2d_arrow(radius, false, 1); - draw_2d_arrow(radius, false, 2); - draw_2d_arrow(radius, false, 3); - } - - return; -} - - -/*************************** GLUI_Translation::draw_2d_arrow() **************/ -/* ori: 0=up, 1=left, 2=down, 3=right */ -/* */ -/* */ -/* 0, y2 */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* -x2,y1 -x1b,y1 x1b,y1 x2,y1 */ -/* | | */ -/* | | */ -/* | | */ -/* | | */ -/* | | */ -/* -x1a,y0 x1a,y0 */ -/* */ - - -void GLUI_Translation::draw_2d_arrow( int radius, int filled, int orientation ) -{ - float x1 = .2, x2 = .4, y1 = .54, y2 = .94, y0; - float x1a, x1b; -/* - vec3 col1( 0.0, 0.0, 0.0 ), col2( .45, .45, .45 ), - col3( .7, .7, .7 ), col4( 1.0, 1.0, 1.0 ); - vec3 c1, c2, c3, c4, c5, c6; -*/ - vec3 white(1.0,1.0,1.0), black(0.0,0.0,0.0), gray(.45,.45,.45), - bkgd(.7,.7,.7); - int c_off=0; /* color index offset */ - - if ( glui ) - bkgd.set(glui->bkgd_color_f[0], - glui->bkgd_color_f[1], - glui->bkgd_color_f[2]); - - /* bkgd[0] = 255.0; bkgd[1] = 0; */ - - /** The following 8 colors define the shading of an octagon, in - clockwise order, starting from the upstroke on the left **/ - /** This is for an outside and inside octagons **/ - vec3 colors_out[]={white, white, white, gray, black, black, black, gray}; - vec3 colors_in[] ={bkgd,white,bkgd,gray,gray,gray,gray,gray}; - -#define SET_COL_OUT(i) glColor3fv((float*) &colors_out[(i)%8][0]); -#define SET_COL_IN(i) glColor3fv((float*) &colors_in[(i)%8][0]); - - x1 = (float)radius * .2; - x2 = x1 * 2; - y1 = (float)radius * .54; - y2 = y1 + x2; - x1a = x1; - x1b = x1; - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - -#define DRAW_SEG( xa,ya,xb,yb ) glVertex2f(xa,ya); glVertex2f(xb,yb); - - glScalef( -1.0, 1.0, 1.0 ); - - if ( orientation == 2 ) { - c_off = 4; - } - else if ( orientation == 0 ) { - c_off = 0; - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - } - else if ( orientation == 1 ) { - c_off = 2; - glRotatef( 90.0, 0.0, 0.0, 1.0 ); - } - else if ( orientation == 3 ) { - c_off = 6; - glRotatef( -90.0, 0.0, 0.0, 1.0 ); - } - - if ( trans_type == GLUI_TRANSLATION_Z ) - y0 = 0.0; - else if ( trans_type == GLUI_TRANSLATION_XY ) - y0 = x1; - else - y0 = 0.0; - - - if ( trans_type == GLUI_TRANSLATION_Z ) { - if ( orientation == 0 ) { - y1 += 2.0; - y2 += 0.0; - - x1b -= 2.0; - x2 -= 2.0; - x1a += 2.0; - } - else if ( orientation == 2 ) { - y1 -= 6.0; - x1a += 2.0; - x1b += 4.0; - x2 += 6.0; - } - } - - /*** Fill in inside of arrow ***/ - if ( NOT filled ) { /*** Means button is up - control is not clicked ***/ - /*glColor3f( .8, .8, .8 ); */ - set_to_bkgd_color(); - glColor3f( bkgd[0]+.07, bkgd[1]+.07, bkgd[2]+.07 ); - } - else { /*** Button is down on control ***/ - glColor3f( .6, .6, .6 ); - c_off += 4; /* Indents the shadows - goes from a raised look to embossed */ - } - - /*** Check if control is enabled or not ***/ - if ( NOT enabled ) { - set_to_bkgd_color(); - /*c_off += 4; -- Indents the shadows - goes from a raised look to embossed */ - colors_out[0] = colors_out[1] = colors_out[2] = colors_out[7] = gray; - colors_out[3] = colors_out[4] = colors_out[5] = colors_out[6] = white; - colors_in[0] = colors_in[1] = colors_in[2] = colors_in[7] = white; - colors_in[3] = colors_in[4] = colors_in[5] = colors_in[6] = gray; - - } - - glBegin( GL_POLYGON ); - glVertex2f( 0.0, 0.0 ); glVertex2f( -x1a, 0.0 ); - glVertex2f( -x1a, 0.0 ); glVertex2f( -x1b, y1 ); - glVertex2f( x1b, y1); glVertex2f( x1a, 0.0 ); - glVertex2f( x1a, 0.0 ); glVertex2f( 0.0, 0.0 ); - glEnd(); - glBegin( GL_TRIANGLES ); - glVertex2f( -x2, y1 ); glVertex2f( 0.0, y2 ); glVertex2f( x2, y1 ); - glEnd(); - - glLineWidth( 1.0 ); - /*** Draw arrow outline ***/ - glBegin( GL_LINES ); - - SET_COL_IN(1+c_off); DRAW_SEG( 0.0, y2-1.0, -x2, y1-1.0 ); - SET_COL_IN(6+c_off); DRAW_SEG( -x2+2.0, y1+1.0, -x1b+1.0, y1+1.0 ); - SET_COL_IN(0+c_off); DRAW_SEG( -x1b+1.0, y1+1.0, -x1a+1.0, y0 ); - SET_COL_IN(3+c_off); DRAW_SEG( 0.0, y2-1.0, x2, y1-1.0 ); - SET_COL_IN(6+c_off); DRAW_SEG( x2-1.0, y1+1.0, x1b-1.0, y1+1.0 ); - SET_COL_IN(4+c_off); DRAW_SEG( x1b-1.0, y1+1.0, x1a-1.0, y0 ); - - SET_COL_OUT(0+c_off); DRAW_SEG( -x1a, y0, -x1b, y1 ); - SET_COL_OUT(6+c_off); DRAW_SEG( -x1b, y1, -x2, y1 ); - SET_COL_OUT(1+c_off); DRAW_SEG( -x2, y1, 0.0, y2 ); - SET_COL_OUT(3+c_off); DRAW_SEG( 0.0, y2, x2, y1 ); - SET_COL_OUT(6+c_off); DRAW_SEG( x2, y1, x1b, y1 ); - SET_COL_OUT(4+c_off); DRAW_SEG( x1b, y1, x1a, y0 ); - - glEnd(); - -#undef DRAW_SEG - - glPopMatrix(); -} - - -/*************************** GLUI_Translation::get_mouse_code() *************/ - -int GLUI_Translation::get_mouse_code( int x, int y ) -{ - if ( x == 0 AND y < 0 ) - return GLUI_TRANSLATION_MOUSE_DOWN; - else if ( x == 0 AND y > 0 ) - return GLUI_TRANSLATION_MOUSE_UP; - else if ( x > 0 AND y == 0 ) - return GLUI_TRANSLATION_MOUSE_LEFT; - else if ( x < 0 AND y == 0 ) - return GLUI_TRANSLATION_MOUSE_RIGHT; - else if ( x < 0 AND y < 0 ) - return GLUI_TRANSLATION_MOUSE_DOWN_LEFT; - else if ( x < 0 AND y > 0 ) - return GLUI_TRANSLATION_MOUSE_DOWN_RIGHT; - else if ( x > 0 AND y < 0 ) - return GLUI_TRANSLATION_MOUSE_UP_LEFT; - else if ( x > 0 AND y > 0 ) - return GLUI_TRANSLATION_MOUSE_UP_RIGHT; - - - return GLUI_TRANSLATION_MOUSE_NONE; -} - - -/*********************************** GLUI_Translation::set_x() ******/ - -void GLUI_Translation::set_x( float val ) -{ - set_one_val( val, 0 ); -} - - -/*********************************** GLUI_Translation::set_y() ******/ - -void GLUI_Translation::set_y( float val ) -{ - if ( trans_type == GLUI_TRANSLATION_XY ) - set_one_val( val, 1 ); - else - set_one_val( val, 0 ); -} - - -/*********************************** GLUI_Translation::set_z() ******/ - -void GLUI_Translation::set_z( float val ) -{ - set_one_val( val, 0 ); -} - - -/******************************* GLUI_Translation::set_one_val() ****/ - -void GLUI_Translation::set_one_val( float val, int index ) -{ - float *fp; - - float_array_val[index] = val; /* set value in array */ - - /*** The code below is like output_live, except it only operates on - a single member of the float array (given by 'index') instead of - outputting the entire array ****/ - - if ( ptr_val == NULL OR NOT live_inited ) - return; - - fp = (float*) ptr_val; - fp[index] = float_array_val[index]; - last_live_float_array[index] = float_array_val[index]; - - /** Update the main gfx window? **/ - if ( this->glui != NULL ) { - this->glui->post_update_main_gfx(); - } -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_translation - GLUI_Translation control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#include "GL/glui.h" +#include "glui_internal.h" +#include "algebra3.h" + +/********************** GLUI_Translation::GLUI_Translation() ***/ + +GLUI_Translation::GLUI_Translation( + GLUI_Node *parent, const char *name, + int trans_t, float *value_ptr, + int id, GLUI_CB cb ) +{ + common_init(); + + set_ptr_val( value_ptr ); + user_id = id; + set_name( name ); + callback = cb; + parent->add_control( this ); + //init_live(); + + trans_type = trans_t; + + if ( trans_type == GLUI_TRANSLATION_XY ) { + float_array_size = 2; + } + else if ( trans_type == GLUI_TRANSLATION_X ) { + float_array_size = 1; + } + else if ( trans_type == GLUI_TRANSLATION_Y ) { + float_array_size = 1; + } + else if ( trans_type == GLUI_TRANSLATION_Z ) { + float_array_size = 1; + } + init_live(); +} + +/********************** GLUI_Translation::iaction_mouse_down_handler() ***/ +/* These are really in local coords (5/10/99) */ + +int GLUI_Translation::iaction_mouse_down_handler( int local_x, + int local_y ) +{ + int center_x, center_y; + + down_x = local_x; + down_y = local_y; + + if ( trans_type == GLUI_TRANSLATION_XY ) { + orig_x = float_array_val[0]; + orig_y = float_array_val[1]; + + /** Check if the Alt key is down, which means lock to an axis **/ + + center_x = w/2; + center_y = (h-18)/2; + + if ( glui->curr_modifiers & GLUT_ACTIVE_ALT ) { + if ( ABS(local_y-center_y) > ABS(local_x-center_x) ) { + locked = GLUI_TRANSLATION_LOCK_Y; + glutSetCursor( GLUT_CURSOR_UP_DOWN ); + } + else { + locked = GLUI_TRANSLATION_LOCK_X; + glutSetCursor( GLUT_CURSOR_LEFT_RIGHT ); + } + } + else { + locked = GLUI_TRANSLATION_LOCK_NONE; + glutSetCursor( GLUT_CURSOR_SPRAY ); + } + } + else if ( trans_type == GLUI_TRANSLATION_X ) { + glutSetCursor( GLUT_CURSOR_LEFT_RIGHT ); + orig_x = float_array_val[0]; + } + else if ( trans_type == GLUI_TRANSLATION_Y ) { + glutSetCursor( GLUT_CURSOR_UP_DOWN ); + orig_y = float_array_val[0]; + } + else if ( trans_type == GLUI_TRANSLATION_Z ) { + glutSetCursor( GLUT_CURSOR_UP_DOWN ); + orig_z = float_array_val[0]; + } + + trans_mouse_code = 1; + redraw(); + + return false; +} + + +/*********************** GLUI_Translation::iaction_mouse_up_handler() **********/ + +int GLUI_Translation::iaction_mouse_up_handler( int local_x, int local_y, + bool inside ) +{ + trans_mouse_code = GLUI_TRANSLATION_MOUSE_NONE; + locked = GLUI_TRANSLATION_LOCK_NONE; + + redraw(); + + return false; +} + + +/******************* GLUI_Translation::iaction_mouse_held_down_handler() ******/ + +int GLUI_Translation::iaction_mouse_held_down_handler( int local_x, int local_y, + bool inside) +{ + float x_off, y_off; + float off_array[2]; + + x_off = scale_factor * (float)(local_x - down_x); + y_off = -scale_factor * (float)(local_y - down_y); + + if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) { + x_off *= 100.0f; + y_off *= 100.0f; + } + else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) { + x_off *= .01f; + y_off *= .01f; + } + + + if ( trans_type == GLUI_TRANSLATION_XY ) { + + if ( locked == GLUI_TRANSLATION_LOCK_X ) + y_off = 0.0; + else if ( locked == GLUI_TRANSLATION_LOCK_Y ) + x_off = 0.0; + + off_array[0] = x_off + orig_x; + off_array[1] = y_off + orig_y; + } + else if ( trans_type == GLUI_TRANSLATION_X ) { + off_array[0] = x_off + orig_x; + } + else if ( trans_type == GLUI_TRANSLATION_Y ) { + off_array[0] = y_off + orig_y; + } + else if ( trans_type == GLUI_TRANSLATION_Z ) { + off_array[0] = y_off + orig_z; + } + + set_float_array_val( (float*) &off_array[0] ); + + return false; +} + + +/******************** GLUI_Translation::iaction_draw_active_area_persp() **************/ + +void GLUI_Translation::iaction_draw_active_area_persp( void ) +{ +} + + +/******************** GLUI_Translation::iaction_draw_active_area_ortho() **********/ + +void GLUI_Translation::iaction_draw_active_area_ortho( void ) +{ + /********* Draw emboss circles around arcball control *********/ + float radius; + radius = (float)(h-22)/2.0; /* MIN((float)w/2.0, (float)h/2.0); */ + glLineWidth( 1.0 ); + + draw_emboss_box( (int) -radius-2, (int)radius+2, + (int)-radius-2, (int)radius+2 ); + + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glTranslatef( .5, .5, .5 ); + /* glScalef( radius-1.0, radius-1.0, radius-1.0 ); */ + if ( trans_type == GLUI_TRANSLATION_Z ) + draw_2d_z_arrows((int)radius-1); + else if ( trans_type == GLUI_TRANSLATION_XY ) + draw_2d_xy_arrows((int)radius-1); + else if ( trans_type == GLUI_TRANSLATION_X ) + draw_2d_x_arrows((int)radius-1); + else if ( trans_type == GLUI_TRANSLATION_Y ) + draw_2d_y_arrows((int)radius-1); + + glPopMatrix(); +} + + +/******************************** GLUI_Translation::iaction_dump() **********/ + +void GLUI_Translation::iaction_dump( FILE *output ) +{ +} + + +/******************** GLUI_Translation::iaction_special_handler() **********/ + +int GLUI_Translation::iaction_special_handler( int key,int modifiers ) +{ + + return false; +} + + + +/*************************** GLUI_Translation::draw_2d_z_arrows() **************/ + +void GLUI_Translation::draw_2d_z_arrows( int radius ) +{ + if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { + draw_2d_arrow(radius, true, 2); + draw_2d_arrow(radius, true, 0); + } + else { + draw_2d_arrow(radius, false, 2); + draw_2d_arrow(radius, false, 0); + } +} + + +/*************************** GLUI_Translation::draw_2d_x_arrows() **************/ + +void GLUI_Translation::draw_2d_x_arrows( int radius ) +{ + if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { + draw_2d_arrow(radius, true, 1); + draw_2d_arrow(radius, true, 3); + } + else { + draw_2d_arrow(radius, false, 1); + draw_2d_arrow(radius, false, 3); + } +} + + +/*************************** GLUI_Translation::draw_2d_y_arrows() **************/ + +void GLUI_Translation::draw_2d_y_arrows( int radius ) +{ + if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { + draw_2d_arrow(radius, true, 0); + draw_2d_arrow(radius, true, 2); + } + else { + draw_2d_arrow(radius, false, 0); + draw_2d_arrow(radius, false, 2); + } +} + + +/************************** GLUI_Translation::draw_2d_xy_arrows() **************/ + +void GLUI_Translation::draw_2d_xy_arrows( int radius) +{ + if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { + if ( locked == GLUI_TRANSLATION_LOCK_X ) { + draw_2d_arrow(radius, false, 0); + draw_2d_arrow(radius, false, 2); + draw_2d_arrow(radius, true, 1); + draw_2d_arrow(radius, true, 3); + } + else if ( locked == GLUI_TRANSLATION_LOCK_Y ) { + draw_2d_arrow(radius, false, 1); + draw_2d_arrow(radius, false, 3); + draw_2d_arrow(radius, true, 0); + draw_2d_arrow(radius, true, 2); + } + else { + draw_2d_arrow(radius, true, 0); + draw_2d_arrow(radius, true, 1); + draw_2d_arrow(radius, true, 2); + draw_2d_arrow(radius, true, 3); + } + } + else { + draw_2d_arrow(radius, false, 0); + draw_2d_arrow(radius, false, 1); + draw_2d_arrow(radius, false, 2); + draw_2d_arrow(radius, false, 3); + } + + return; +} + + +/*************************** GLUI_Translation::draw_2d_arrow() **************/ +/* ori: 0=up, 1=left, 2=down, 3=right */ +/* */ +/* */ +/* 0, y2 */ +/* / \ */ +/* / \ */ +/* / \ */ +/* / \ */ +/* / \ */ +/* / \ */ +/* / \ */ +/* / \ */ +/* -x2,y1 -x1b,y1 x1b,y1 x2,y1 */ +/* | | */ +/* | | */ +/* | | */ +/* | | */ +/* | | */ +/* -x1a,y0 x1a,y0 */ +/* */ + + +void GLUI_Translation::draw_2d_arrow( int radius, int filled, int orientation ) +{ + float x1 = .2, x2 = .4, y1 = .54, y2 = .94, y0; + float x1a, x1b; +/* + vec3 col1( 0.0, 0.0, 0.0 ), col2( .45, .45, .45 ), + col3( .7, .7, .7 ), col4( 1.0, 1.0, 1.0 ); + vec3 c1, c2, c3, c4, c5, c6; +*/ + vec3 white(1.0,1.0,1.0), black(0.0,0.0,0.0), gray(.45,.45,.45), + bkgd(.7,.7,.7); + int c_off=0; /* color index offset */ + + if ( glui ) + bkgd.set(glui->bkgd_color_f[0], + glui->bkgd_color_f[1], + glui->bkgd_color_f[2]); + + /* bkgd[0] = 255.0; bkgd[1] = 0; */ + + /** The following 8 colors define the shading of an octagon, in + clockwise order, starting from the upstroke on the left **/ + /** This is for an outside and inside octagons **/ + vec3 colors_out[]={white, white, white, gray, black, black, black, gray}; + vec3 colors_in[] ={bkgd,white,bkgd,gray,gray,gray,gray,gray}; + +#define SET_COL_OUT(i) glColor3fv((float*) &colors_out[(i)%8][0]); +#define SET_COL_IN(i) glColor3fv((float*) &colors_in[(i)%8][0]); + + x1 = (float)radius * .2; + x2 = x1 * 2; + y1 = (float)radius * .54; + y2 = y1 + x2; + x1a = x1; + x1b = x1; + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + +#define DRAW_SEG( xa,ya,xb,yb ) glVertex2f(xa,ya); glVertex2f(xb,yb); + + glScalef( -1.0, 1.0, 1.0 ); + + if ( orientation == 2 ) { + c_off = 4; + } + else if ( orientation == 0 ) { + c_off = 0; + glRotatef( 180.0, 0.0, 0.0, 1.0 ); + } + else if ( orientation == 1 ) { + c_off = 2; + glRotatef( 90.0, 0.0, 0.0, 1.0 ); + } + else if ( orientation == 3 ) { + c_off = 6; + glRotatef( -90.0, 0.0, 0.0, 1.0 ); + } + + if ( trans_type == GLUI_TRANSLATION_Z ) + y0 = 0.0; + else if ( trans_type == GLUI_TRANSLATION_XY ) + y0 = x1; + else + y0 = 0.0; + + + if ( trans_type == GLUI_TRANSLATION_Z ) { + if ( orientation == 0 ) { + y1 += 2.0; + y2 += 0.0; + + x1b -= 2.0; + x2 -= 2.0; + x1a += 2.0; + } + else if ( orientation == 2 ) { + y1 -= 6.0; + x1a += 2.0; + x1b += 4.0; + x2 += 6.0; + } + } + + /*** Fill in inside of arrow ***/ + if ( NOT filled ) { /*** Means button is up - control is not clicked ***/ + /*glColor3f( .8, .8, .8 ); */ + set_to_bkgd_color(); + glColor3f( bkgd[0]+.07, bkgd[1]+.07, bkgd[2]+.07 ); + } + else { /*** Button is down on control ***/ + glColor3f( .6, .6, .6 ); + c_off += 4; /* Indents the shadows - goes from a raised look to embossed */ + } + + /*** Check if control is enabled or not ***/ + if ( NOT enabled ) { + set_to_bkgd_color(); + /*c_off += 4; -- Indents the shadows - goes from a raised look to embossed */ + colors_out[0] = colors_out[1] = colors_out[2] = colors_out[7] = gray; + colors_out[3] = colors_out[4] = colors_out[5] = colors_out[6] = white; + colors_in[0] = colors_in[1] = colors_in[2] = colors_in[7] = white; + colors_in[3] = colors_in[4] = colors_in[5] = colors_in[6] = gray; + + } + + glBegin( GL_POLYGON ); + glVertex2f( 0.0, 0.0 ); glVertex2f( -x1a, 0.0 ); + glVertex2f( -x1a, 0.0 ); glVertex2f( -x1b, y1 ); + glVertex2f( x1b, y1); glVertex2f( x1a, 0.0 ); + glVertex2f( x1a, 0.0 ); glVertex2f( 0.0, 0.0 ); + glEnd(); + glBegin( GL_TRIANGLES ); + glVertex2f( -x2, y1 ); glVertex2f( 0.0, y2 ); glVertex2f( x2, y1 ); + glEnd(); + + glLineWidth( 1.0 ); + /*** Draw arrow outline ***/ + glBegin( GL_LINES ); + + SET_COL_IN(1+c_off); DRAW_SEG( 0.0, y2-1.0, -x2, y1-1.0 ); + SET_COL_IN(6+c_off); DRAW_SEG( -x2+2.0, y1+1.0, -x1b+1.0, y1+1.0 ); + SET_COL_IN(0+c_off); DRAW_SEG( -x1b+1.0, y1+1.0, -x1a+1.0, y0 ); + SET_COL_IN(3+c_off); DRAW_SEG( 0.0, y2-1.0, x2, y1-1.0 ); + SET_COL_IN(6+c_off); DRAW_SEG( x2-1.0, y1+1.0, x1b-1.0, y1+1.0 ); + SET_COL_IN(4+c_off); DRAW_SEG( x1b-1.0, y1+1.0, x1a-1.0, y0 ); + + SET_COL_OUT(0+c_off); DRAW_SEG( -x1a, y0, -x1b, y1 ); + SET_COL_OUT(6+c_off); DRAW_SEG( -x1b, y1, -x2, y1 ); + SET_COL_OUT(1+c_off); DRAW_SEG( -x2, y1, 0.0, y2 ); + SET_COL_OUT(3+c_off); DRAW_SEG( 0.0, y2, x2, y1 ); + SET_COL_OUT(6+c_off); DRAW_SEG( x2, y1, x1b, y1 ); + SET_COL_OUT(4+c_off); DRAW_SEG( x1b, y1, x1a, y0 ); + + glEnd(); + +#undef DRAW_SEG + + glPopMatrix(); +} + + +/*************************** GLUI_Translation::get_mouse_code() *************/ + +int GLUI_Translation::get_mouse_code( int x, int y ) +{ + if ( x == 0 AND y < 0 ) + return GLUI_TRANSLATION_MOUSE_DOWN; + else if ( x == 0 AND y > 0 ) + return GLUI_TRANSLATION_MOUSE_UP; + else if ( x > 0 AND y == 0 ) + return GLUI_TRANSLATION_MOUSE_LEFT; + else if ( x < 0 AND y == 0 ) + return GLUI_TRANSLATION_MOUSE_RIGHT; + else if ( x < 0 AND y < 0 ) + return GLUI_TRANSLATION_MOUSE_DOWN_LEFT; + else if ( x < 0 AND y > 0 ) + return GLUI_TRANSLATION_MOUSE_DOWN_RIGHT; + else if ( x > 0 AND y < 0 ) + return GLUI_TRANSLATION_MOUSE_UP_LEFT; + else if ( x > 0 AND y > 0 ) + return GLUI_TRANSLATION_MOUSE_UP_RIGHT; + + + return GLUI_TRANSLATION_MOUSE_NONE; +} + + +/*********************************** GLUI_Translation::set_x() ******/ + +void GLUI_Translation::set_x( float val ) +{ + set_one_val( val, 0 ); +} + + +/*********************************** GLUI_Translation::set_y() ******/ + +void GLUI_Translation::set_y( float val ) +{ + if ( trans_type == GLUI_TRANSLATION_XY ) + set_one_val( val, 1 ); + else + set_one_val( val, 0 ); +} + + +/*********************************** GLUI_Translation::set_z() ******/ + +void GLUI_Translation::set_z( float val ) +{ + set_one_val( val, 0 ); +} + + +/******************************* GLUI_Translation::set_one_val() ****/ + +void GLUI_Translation::set_one_val( float val, int index ) +{ + float *fp; + + float_array_val[index] = val; /* set value in array */ + + /*** The code below is like output_live, except it only operates on + a single member of the float array (given by 'index') instead of + outputting the entire array ****/ + + if ( ptr_val == NULL OR NOT live_inited ) + return; + + fp = (float*) ptr_val; + fp[index] = float_array_val[index]; + last_live_float_array[index] = float_array_val[index]; + + /** Update the main gfx window? **/ + if ( this->glui != NULL ) { + this->glui->post_update_main_gfx(); + } +} diff --git a/Extras/glui/glui_tree.cpp b/Extras/glui/glui_tree.cpp index 1ed456d52..f253fa4f9 100644 --- a/Extras/glui/glui_tree.cpp +++ b/Extras/glui/glui_tree.cpp @@ -1,278 +1,278 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_panel.cpp - GLUI_Panel control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "glui_internal_control.h" - - -/****************************** GLUI_Tree::GLUI_Tree() **********/ -GLUI_Tree::GLUI_Tree(GLUI_Node *parent, const char *name, - int open, int inset) -{ - common_init(); - GLUI_StaticText *inset_label; - GLUI_Column *col; - - this->set_name( name ); - this->user_id = -1; - - if ( NOT open ) { - this->is_open = false; - this->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - } - - parent->add_control( this ); - inset_label = new GLUI_StaticText(this,""); - inset_label->set_w(inset); - col = new GLUI_Column(this,true); - this->set_column(col); - this->set_alignment(GLUI_ALIGN_LEFT); -} - - -/****************************** GLUI_Tree::open() **********/ - -void GLUI_Tree::open( void ) -{ - if ( is_open ) - return; - is_open = true; - - GLUI_DRAWINGSENTINAL_IDIOM - - child_head = collapsed_node.child_head; - child_tail = collapsed_node.child_tail; - - collapsed_node.child_head = NULL; - collapsed_node.child_tail = NULL; - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->unhide_internal( true ); - } - - glui->refresh(); -} - - -/****************************** GLUI_Tree::close() **********/ - -void GLUI_Tree::close( void ) -{ - if ( NOT glui ) - return; - - if ( NOT is_open ) - return; - is_open = false; - - GLUI_DRAWINGSENTINAL_IDIOM - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->hide_internal( true ); - } - - collapsed_node.child_head = first_child(); - collapsed_node.child_tail = last_child(); - - child_head = NULL; - child_tail = NULL; - - this->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - - glui->refresh(); -} - - -/**************************** GLUI_Tree::mouse_down_handler() **********/ - - -int GLUI_Tree::mouse_down_handler( int local_x, int local_y ) -{ - if ( local_y - y_abs > 18 ) { - initially_inside = currently_inside = false; - return false; - } - - currently_inside = true; - initially_inside = true; - redraw(); - - return false; -} - -/**************************** GLUI_Tree::mouse_held_down_handler() ****/ - -int GLUI_Tree::mouse_held_down_handler( - int local_x, int local_y, - bool new_inside ) -{ - if ( NOT initially_inside ) - return false; - - if ( local_y - y_abs> 18 ) - new_inside = false; - - if (currently_inside != new_inside) - redraw(); - - return false; -} - - -/**************************** GLUI_Tree::mouse_down_handler() **********/ - -int GLUI_Tree::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - if ( currently_inside ) { - if ( is_open ) - close(); - else - open(); - } - - currently_inside = false; - initially_inside = false; - redraw(); - - return false; -} - - -/********************************* GLUI_Tree::draw() ***********/ - -void GLUI_Tree::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int left, right, top, bottom, delta_x; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - delta_x = 0; - - glui->draw_raised_box( left, top, 16, 16 ); - - if ( glui ) - glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( left+17, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+17, bottom-1 ); - glEnd(); - - if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { - delta_x = string_width( level_name ) + char_width(' '); - glColor3f( lred, lgreen, lblue); /* The hierarchy is drawn in bold */ - glRasterPos2i(left + 25, top + 11); - draw_string(level_name); - glRasterPos2i(left + 24, top + 11); - draw_string(level_name); - } - - draw_name( delta_x+left+24, top+11 ); - - if ( active ) - draw_active_box( left+22, delta_x+left+string_width( name )+32, - top, bottom-2 ); - - - /** Draw '+' or '-' **/ - - glBegin( GL_LINES ); - if ( is_open ) { - if ( enabled ) - if (is_current) - glColor3f( 0, 0, 1 ); - else - glColor3f( 0.0, 0.0, 0.0 ); - else - glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(left+4,(top+bottom)/2); glVertex2i(left+13,(top+bottom)/2); - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(left+4,1+(top+bottom)/2);glVertex2i(left+13,1+(top+bottom)/2); - } - else - { - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(left+9,top+3); glVertex2i(left+9,bottom-4); - glVertex2i(left+4,(top+bottom)/2); glVertex2i(left+13,(top+bottom)/2); - - if ( enabled ) - if (is_current) - glColor3f( 0, 0, 1 ); - else - glColor3f( 0.0, 0.0, 0.0 ); - else - glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(left+4,-1+(top+bottom)/2); - glVertex2i(left+13,-1+(top+bottom)/2); - glVertex2i(left+8,top+3); - glVertex2i(left+8,bottom-4); - } - glEnd(); - - glLineWidth( 1.0 ); - - if (currently_inside) draw_pressed(); -} - - -/***************************** GLUI_Tree::update_size() **********/ - -void GLUI_Tree::update_size( void ) -{ - int text_size = 0, delta_x = 0; - - if ( NOT glui ) - return; - - text_size = string_width(name); - - if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { - delta_x = string_width( level_name ); - } - - if ( w < text_size + 36 + delta_x) - w = text_size + 36 + delta_x; -} - - -/**************************** GLUI_Tree::draw_pressed() ***********/ - -void GLUI_Tree::draw_pressed( void ) -{ - int left, right, top, bottom; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - - glColor3f( 0.0, 0.0, 0.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left, top ); glVertex2i( right, top ); - glVertex2i( right, bottom ); glVertex2i( left,bottom ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+1,bottom-1 ); - glEnd(); -} +/**************************************************************************** + + GLUI User Interface Toolkit + --------------------------- + + glui_panel.cpp - GLUI_Panel control class + + + -------------------------------------------------- + + Copyright (c) 1998 Paul Rademacher + + This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. + +*****************************************************************************/ + +#include "glui_internal_control.h" + + +/****************************** GLUI_Tree::GLUI_Tree() **********/ +GLUI_Tree::GLUI_Tree(GLUI_Node *parent, const char *name, + int open, int inset) +{ + common_init(); + GLUI_StaticText *inset_label; + GLUI_Column *col; + + this->set_name( name ); + this->user_id = -1; + + if ( NOT open ) { + this->is_open = false; + this->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; + } + + parent->add_control( this ); + inset_label = new GLUI_StaticText(this,""); + inset_label->set_w(inset); + col = new GLUI_Column(this,true); + this->set_column(col); + this->set_alignment(GLUI_ALIGN_LEFT); +} + + +/****************************** GLUI_Tree::open() **********/ + +void GLUI_Tree::open( void ) +{ + if ( is_open ) + return; + is_open = true; + + GLUI_DRAWINGSENTINAL_IDIOM + + child_head = collapsed_node.child_head; + child_tail = collapsed_node.child_tail; + + collapsed_node.child_head = NULL; + collapsed_node.child_tail = NULL; + + if ( child_head != NULL ) { + ((GLUI_Control*) child_head)->unhide_internal( true ); + } + + glui->refresh(); +} + + +/****************************** GLUI_Tree::close() **********/ + +void GLUI_Tree::close( void ) +{ + if ( NOT glui ) + return; + + if ( NOT is_open ) + return; + is_open = false; + + GLUI_DRAWINGSENTINAL_IDIOM + + if ( child_head != NULL ) { + ((GLUI_Control*) child_head)->hide_internal( true ); + } + + collapsed_node.child_head = first_child(); + collapsed_node.child_tail = last_child(); + + child_head = NULL; + child_tail = NULL; + + this->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; + + glui->refresh(); +} + + +/**************************** GLUI_Tree::mouse_down_handler() **********/ + + +int GLUI_Tree::mouse_down_handler( int local_x, int local_y ) +{ + if ( local_y - y_abs > 18 ) { + initially_inside = currently_inside = false; + return false; + } + + currently_inside = true; + initially_inside = true; + redraw(); + + return false; +} + +/**************************** GLUI_Tree::mouse_held_down_handler() ****/ + +int GLUI_Tree::mouse_held_down_handler( + int local_x, int local_y, + bool new_inside ) +{ + if ( NOT initially_inside ) + return false; + + if ( local_y - y_abs> 18 ) + new_inside = false; + + if (currently_inside != new_inside) + redraw(); + + return false; +} + + +/**************************** GLUI_Tree::mouse_down_handler() **********/ + +int GLUI_Tree::mouse_up_handler( int local_x, int local_y, bool inside ) +{ + if ( currently_inside ) { + if ( is_open ) + close(); + else + open(); + } + + currently_inside = false; + initially_inside = false; + redraw(); + + return false; +} + + +/********************************* GLUI_Tree::draw() ***********/ + +void GLUI_Tree::draw( int x, int y ) +{ + GLUI_DRAWINGSENTINAL_IDIOM + int left, right, top, bottom, delta_x; + + left = 5; + right = w-left; + top = 3; + bottom = 3+16; + delta_x = 0; + + glui->draw_raised_box( left, top, 16, 16 ); + + if ( glui ) + glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); + glDisable( GL_CULL_FACE ); + glBegin( GL_QUADS ); + glVertex2i( left+17, top+1 ); glVertex2i( right-1, top+1 ); + glVertex2i( right-1, bottom-1 ); glVertex2i( left+17, bottom-1 ); + glEnd(); + + if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { + delta_x = string_width( level_name ) + char_width(' '); + glColor3f( lred, lgreen, lblue); /* The hierarchy is drawn in bold */ + glRasterPos2i(left + 25, top + 11); + draw_string(level_name); + glRasterPos2i(left + 24, top + 11); + draw_string(level_name); + } + + draw_name( delta_x+left+24, top+11 ); + + if ( active ) + draw_active_box( left+22, delta_x+left+string_width( name )+32, + top, bottom-2 ); + + + /** Draw '+' or '-' **/ + + glBegin( GL_LINES ); + if ( is_open ) { + if ( enabled ) + if (is_current) + glColor3f( 0, 0, 1 ); + else + glColor3f( 0.0, 0.0, 0.0 ); + else + glColor3f( 0.5, 0.5, 0.5 ); + glVertex2i(left+4,(top+bottom)/2); glVertex2i(left+13,(top+bottom)/2); + + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i(left+4,1+(top+bottom)/2);glVertex2i(left+13,1+(top+bottom)/2); + } + else + { + glColor3f( 1.0, 1.0, 1.0 ); + glVertex2i(left+9,top+3); glVertex2i(left+9,bottom-4); + glVertex2i(left+4,(top+bottom)/2); glVertex2i(left+13,(top+bottom)/2); + + if ( enabled ) + if (is_current) + glColor3f( 0, 0, 1 ); + else + glColor3f( 0.0, 0.0, 0.0 ); + else + glColor3f( 0.5, 0.5, 0.5 ); + glVertex2i(left+4,-1+(top+bottom)/2); + glVertex2i(left+13,-1+(top+bottom)/2); + glVertex2i(left+8,top+3); + glVertex2i(left+8,bottom-4); + } + glEnd(); + + glLineWidth( 1.0 ); + + if (currently_inside) draw_pressed(); +} + + +/***************************** GLUI_Tree::update_size() **********/ + +void GLUI_Tree::update_size( void ) +{ + int text_size = 0, delta_x = 0; + + if ( NOT glui ) + return; + + text_size = string_width(name); + + if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { + delta_x = string_width( level_name ); + } + + if ( w < text_size + 36 + delta_x) + w = text_size + 36 + delta_x; +} + + +/**************************** GLUI_Tree::draw_pressed() ***********/ + +void GLUI_Tree::draw_pressed( void ) +{ + int left, right, top, bottom; + + left = 5; + right = w-left; + top = 3; + bottom = 3+16; + + glColor3f( 0.0, 0.0, 0.0 ); + + glBegin( GL_LINE_LOOP ); + glVertex2i( left, top ); glVertex2i( right, top ); + glVertex2i( right, bottom ); glVertex2i( left,bottom ); + glEnd(); + + glBegin( GL_LINE_LOOP ); + glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); + glVertex2i( right-1, bottom-1 ); glVertex2i( left+1,bottom-1 ); + glEnd(); +} diff --git a/Extras/glui/glui_treepanel.cpp b/Extras/glui/glui_treepanel.cpp index c9730e749..27c659c1d 100644 --- a/Extras/glui/glui_treepanel.cpp +++ b/Extras/glui/glui_treepanel.cpp @@ -1,388 +1,388 @@ -#include "GL/glui.h" - - -/****************************** GLUI_TreePanel::GLUI_TreePanel() *********/ - -GLUI_TreePanel::GLUI_TreePanel(GLUI_Node *parent, const char *name, - bool open, int inset) -{ - common_init(); - - set_name( name ); - user_id = -1; - - if ( !open ) { - is_open = false; - h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - } - - parent->add_control( this ); -} - -/****************************** GLUI_TreePanel::set_color() *********/ - -void GLUI_TreePanel::set_color(float r, float g, float b) -{ - red = r; - green = g; - blue = b; - redraw(); -} - -/************************ GLUI_TreePanel::set_level_color() *********/ - -void GLUI_TreePanel::set_level_color(float r, float g, float b) -{ - lred = r; - lgreen = g; - lblue = b; - redraw(); -} - -/****************************** GLUI_TreePanel::ab() *********/ - -/* Adds branch to curr_root */ -GLUI_Tree *GLUI_TreePanel::ab(const char *name, GLUI_Tree *root) -{ - GLUI_Tree *temp; - - - if (root != NULL) { - resetToRoot(root); - } - - temp = new GLUI_Tree(curr_root, name); - initNode(temp); - formatNode(temp); - - curr_root = temp; - curr_branch = NULL; /* Currently at leaf */ - - if (temp->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)temp)->set_current(true); - //refresh(); - // glui->deactivate_current_control(); - //glui->activate_control( temp, GLUI_ACTIVATE_TAB ); - return temp; - -} - -/****************************** GLUI_TreePanel::fb() *********/ - -/* Goes up one level, resets curr_root and curr_branch to parents*/ -void GLUI_TreePanel::fb(GLUI_Tree *branch) -{ - if (((GLUI_Panel *)branch) == ((GLUI_Panel *)this)) - return; - - if (((GLUI_Panel *)curr_branch) == ((GLUI_Panel *)this)) { - resetToRoot(); - return; - } - if (((GLUI_Panel *)curr_root) == ((GLUI_Panel *)this)) { - resetToRoot(); - return; - } - - if (branch != NULL) { - - if ( branch->dynamicCastGLUI_Tree() ) - ((GLUI_Tree *)branch)->set_current(false); - - curr_branch = (GLUI_Tree *)branch->next(); - curr_root = (GLUI_Panel *)branch->parent(); - - if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) - curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); - - - if ( curr_root->dynamicCastGLUI_Tree() ) - ((GLUI_Tree *)curr_root)->set_current(true); - - } else { - if (curr_root != NULL) { /* up one parent */ - - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)curr_root)->set_current(false); - - curr_branch = (GLUI_Tree *) curr_root->next(); - curr_root = (GLUI_Panel *) curr_root->parent(); - - if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) - curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); - - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)curr_root)->set_current(true); - - } - - } - //refresh(); -} - - -/****************************** GLUI_TreePanel::refresh() *********/ - -void GLUI_TreePanel::refresh() -{ - glui->deactivate_current_control(); - glui->activate_control( curr_root, GLUI_ACTIVATE_TAB ); - - redraw(); -} - -/****************************** GLUI_TreePanel::initNode() *********/ - -void GLUI_TreePanel::initNode(GLUI_Tree *temp) -{ - if (temp == NULL) - return; - int level = temp->get_level(); - int child_number = 1; - - GLUI_Tree *ptree = temp->parent()->dynamicCastGLUI_Tree(); - if (ptree) { - level = ptree->get_level() + 1; - GLUI_Tree *prevTree = temp->prev()->dynamicCastGLUI_Tree(); - if (prevTree) { - child_number = prevTree->get_child_number() + 1; - } - } else if (temp->dynamicCastGLUI_Tree() && - temp->parent()->dynamicCastGLUI_TreePanel()) { - child_number = ++root_children; - } - temp->set_id(uniqueID()); // -1 if unset - temp->set_level(level); - temp->set_child_number(child_number); -} - -/****************************** GLUI_TreePanel::formatNode() *********/ - -void GLUI_TreePanel::formatNode(GLUI_Tree *temp) -{ - if (temp == NULL) - return; - int level = temp->get_level(); - int child_number = temp->get_child_number(); - GLUI_String level_name=""; - GLUI_String full_name=""; - - temp->level_name == ""; - - if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { - if (format & GLUI_TREEPANEL_HIERARCHY_LEVEL_ONLY) { - glui_format_str(level_name, "%d", level); - } - if (format & GLUI_TREEPANEL_HIERARCHY_NUMERICDOT) { - if ( temp->parent()->dynamicCastGLUI_Tree() ) - glui_format_str(level_name, "%s.%d", - ((GLUI_Tree *)(temp->parent()))->level_name.c_str(), - child_number); - else - glui_format_str(level_name, "%d", child_number); - } - } - - temp->set_level_color(lred, lgreen, lblue); - temp->set_format(format); - temp->level_name = level_name; - - if (format & GLUI_TREEPANEL_ALTERNATE_COLOR) { - switch (level%8) { - case (7): temp->set_color(.5,.5,.5); break; - case (6): temp->set_color(.3,.5,.5); break; - case (5): temp->set_color(.5,.3,.5); break; - case (4): temp->set_color(.3,.3,.5); break; - case (3): temp->set_color(.5,.5,.3); break; - case (2): temp->set_color(.3,.5,.3); break; - case (1): temp->set_color(.5,.3,.3); break; - default: temp->set_color(.3,.3,.3); - } - } else { - temp->set_color(red,green,blue); - } - - if (format & GLUI_TREEPANEL_DISABLE_BAR) { - temp->disable_bar(); - } else { - if (format & GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) { - temp->disable_bar(); - if ( curr_root->dynamicCastGLUI_Tree() ) - ((GLUI_Tree *)curr_root)->enable_bar(); - } else - if (format & GLUI_TREEPANEL_CONNECT_CHILDREN_ONLY) { - temp->disable_bar(); - if (temp->prev() && temp->prev()->dynamicCastGLUI_Tree() ) - { - ((GLUI_Tree *)temp->prev())->enable_bar(); - } - } - } -} - -/****************************** GLUI_TreePanel::update_all() *********/ - -void GLUI_TreePanel::update_all() -{ - printf("GLUI_TreePanel::update_all() doesn't work yet. - JVK\n"); - return; - GLUI_Panel *saved_root = curr_root; - GLUI_Tree *saved_branch = curr_branch; - root_children = 0; - resetToRoot(this); - if (curr_branch && curr_branch->dynamicCastGLUI_Tree()) - formatNode((GLUI_Tree *)curr_branch); - next(); - while (curr_root && curr_branch != this->first_child()) { - if (curr_branch && curr_branch->dynamicCastGLUI_Tree()) { - formatNode((GLUI_Tree *)curr_branch); - } - next(); - } - curr_root = saved_root; - curr_branch = saved_branch; -} - -/****************************** GLUI_TreePanel::expand_all() *********/ - -void GLUI_TreePanel::expand_all() -{ - GLUI_Panel *saved_root = curr_root; - GLUI_Tree *saved_branch = curr_branch; - - resetToRoot(this); - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree*)curr_root)->open(); - next(); - while (curr_root != NULL && curr_branch != this->first_child()) { - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree*)curr_root)->open(); - next(); - } - - curr_root = saved_root; - curr_branch = saved_branch; -} - -/****************************** GLUI_TreePanel::collapse_all() *********/ - -void GLUI_TreePanel::collapse_all() -{ - GLUI_Panel *saved_root = curr_root; - GLUI_Tree *saved_branch = curr_branch; - - resetToRoot(this); - next(); - while (curr_root != NULL && curr_branch != this->first_child()) { - if (curr_root->dynamicCastGLUI_Tree() && - curr_branch == NULL) { /* we want to close everything leaf-first */ - ((GLUI_Tree*)curr_root)->close(); - /* Rather than simply next(), we need to manually move the - curr_root because this node has been moved to the - collapsed_node list */ - curr_branch = (GLUI_Tree *)curr_root->next(); - curr_root = (GLUI_Panel *)curr_root->parent(); - } else - next(); - } - - curr_root = saved_root; - curr_branch = saved_branch; - -} - -/****************************** GLUI_TreePanel::db() *********/ - -/* Deletes the curr_root */ -void GLUI_TreePanel::db(GLUI_Tree *root) -{ - GLUI_Tree *temp_branch; - GLUI_Panel *temp_root; - - if (((GLUI_Control *)root) == ((GLUI_Control *)this)) - return; - - if (root != NULL) { - curr_root = (GLUI_Tree *)root; - curr_branch = NULL; - } - - if (curr_root == NULL || ((GLUI_Panel *)curr_root) == ((GLUI_Panel *)this)) { - resetToRoot(); - return; - } - - - temp_branch = (GLUI_Tree *)curr_root->next(); /* Next branch, if any */ - temp_root = (GLUI_Panel *)curr_root->parent(); /* new root */ - curr_root->unlink(); - delete curr_root; - curr_branch = (GLUI_Tree *) temp_branch; - curr_root = (GLUI_Panel *) temp_root; - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)curr_root)->open(); - - if ((format & GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) == GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) { - if (curr_root->dynamicCastGLUI_Tree() && ((GLUI_Tree *)curr_root->next()) == NULL) - ((GLUI_Tree *)curr_root)->disable_bar(); - } - //refresh(); -} - -/****************************** GLUI_TreePanel::descendBranch() *********/ - -/* Finds the very last branch of curr_root, resets vars */ -void GLUI_TreePanel::descendBranch(GLUI_Panel *root) { - if (root) - resetToRoot(root); - else - resetToRoot(curr_root); - if (curr_branch != NULL && curr_branch != ((GLUI_Panel *)this)) { - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)curr_root)->set_current(false); - descendBranch(curr_branch); - } -} - -/****************************** GLUI_TreePanel::next() *********/ - -void GLUI_TreePanel::next() -{ - if (curr_root == NULL) - resetToRoot(this); - - if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) - curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); - - - if (curr_branch != NULL && curr_branch != ((GLUI_Panel *)this)) { /* Descend into branch */ - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)curr_root)->set_current(false); - resetToRoot(curr_branch); - } else if (curr_branch == NULL) { - fb(NULL); /* Backup and move on */ - } -} - -/****************************** GLUI_TreePanel::resetToRoot() *********/ - -/* Resets curr_root and curr branch to TreePanel and lastChild */ -void GLUI_TreePanel::resetToRoot(GLUI_Panel *new_root) -{ - GLUI_Panel *root = this; - if (new_root != NULL) - root = new_root; - curr_root = root; - if (curr_root->dynamicCastGLUI_Tree()) - ((GLUI_Tree *)curr_root)->set_current(true); - curr_branch = (GLUI_Tree *)root->first_child(); - - /* since Trees are collapsable, we need to check the collapsed nodes - in case the curr_root is collapsed */ - if (curr_branch == NULL && (root->collapsed_node).first_child() != NULL) { - curr_branch = (GLUI_Tree *)(root->collapsed_node).first_child(); - } - while (curr_branch && curr_branch->dynamicCastGLUI_Tree()) { - curr_branch=(GLUI_Tree *)curr_branch->next(); - } -} +#include "GL/glui.h" + + +/****************************** GLUI_TreePanel::GLUI_TreePanel() *********/ + +GLUI_TreePanel::GLUI_TreePanel(GLUI_Node *parent, const char *name, + bool open, int inset) +{ + common_init(); + + set_name( name ); + user_id = -1; + + if ( !open ) { + is_open = false; + h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; + } + + parent->add_control( this ); +} + +/****************************** GLUI_TreePanel::set_color() *********/ + +void GLUI_TreePanel::set_color(float r, float g, float b) +{ + red = r; + green = g; + blue = b; + redraw(); +} + +/************************ GLUI_TreePanel::set_level_color() *********/ + +void GLUI_TreePanel::set_level_color(float r, float g, float b) +{ + lred = r; + lgreen = g; + lblue = b; + redraw(); +} + +/****************************** GLUI_TreePanel::ab() *********/ + +/* Adds branch to curr_root */ +GLUI_Tree *GLUI_TreePanel::ab(const char *name, GLUI_Tree *root) +{ + GLUI_Tree *temp; + + + if (root != NULL) { + resetToRoot(root); + } + + temp = new GLUI_Tree(curr_root, name); + initNode(temp); + formatNode(temp); + + curr_root = temp; + curr_branch = NULL; /* Currently at leaf */ + + if (temp->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)temp)->set_current(true); + //refresh(); + // glui->deactivate_current_control(); + //glui->activate_control( temp, GLUI_ACTIVATE_TAB ); + return temp; + +} + +/****************************** GLUI_TreePanel::fb() *********/ + +/* Goes up one level, resets curr_root and curr_branch to parents*/ +void GLUI_TreePanel::fb(GLUI_Tree *branch) +{ + if (((GLUI_Panel *)branch) == ((GLUI_Panel *)this)) + return; + + if (((GLUI_Panel *)curr_branch) == ((GLUI_Panel *)this)) { + resetToRoot(); + return; + } + if (((GLUI_Panel *)curr_root) == ((GLUI_Panel *)this)) { + resetToRoot(); + return; + } + + if (branch != NULL) { + + if ( branch->dynamicCastGLUI_Tree() ) + ((GLUI_Tree *)branch)->set_current(false); + + curr_branch = (GLUI_Tree *)branch->next(); + curr_root = (GLUI_Panel *)branch->parent(); + + if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) + curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); + + + if ( curr_root->dynamicCastGLUI_Tree() ) + ((GLUI_Tree *)curr_root)->set_current(true); + + } else { + if (curr_root != NULL) { /* up one parent */ + + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)curr_root)->set_current(false); + + curr_branch = (GLUI_Tree *) curr_root->next(); + curr_root = (GLUI_Panel *) curr_root->parent(); + + if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) + curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); + + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)curr_root)->set_current(true); + + } + + } + //refresh(); +} + + +/****************************** GLUI_TreePanel::refresh() *********/ + +void GLUI_TreePanel::refresh() +{ + glui->deactivate_current_control(); + glui->activate_control( curr_root, GLUI_ACTIVATE_TAB ); + + redraw(); +} + +/****************************** GLUI_TreePanel::initNode() *********/ + +void GLUI_TreePanel::initNode(GLUI_Tree *temp) +{ + if (temp == NULL) + return; + int level = temp->get_level(); + int child_number = 1; + + GLUI_Tree *ptree = temp->parent()->dynamicCastGLUI_Tree(); + if (ptree) { + level = ptree->get_level() + 1; + GLUI_Tree *prevTree = temp->prev()->dynamicCastGLUI_Tree(); + if (prevTree) { + child_number = prevTree->get_child_number() + 1; + } + } else if (temp->dynamicCastGLUI_Tree() && + temp->parent()->dynamicCastGLUI_TreePanel()) { + child_number = ++root_children; + } + temp->set_id(uniqueID()); // -1 if unset + temp->set_level(level); + temp->set_child_number(child_number); +} + +/****************************** GLUI_TreePanel::formatNode() *********/ + +void GLUI_TreePanel::formatNode(GLUI_Tree *temp) +{ + if (temp == NULL) + return; + int level = temp->get_level(); + int child_number = temp->get_child_number(); + GLUI_String level_name=""; + GLUI_String full_name=""; + + temp->level_name == ""; + + if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { + if (format & GLUI_TREEPANEL_HIERARCHY_LEVEL_ONLY) { + glui_format_str(level_name, "%d", level); + } + if (format & GLUI_TREEPANEL_HIERARCHY_NUMERICDOT) { + if ( temp->parent()->dynamicCastGLUI_Tree() ) + glui_format_str(level_name, "%s.%d", + ((GLUI_Tree *)(temp->parent()))->level_name.c_str(), + child_number); + else + glui_format_str(level_name, "%d", child_number); + } + } + + temp->set_level_color(lred, lgreen, lblue); + temp->set_format(format); + temp->level_name = level_name; + + if (format & GLUI_TREEPANEL_ALTERNATE_COLOR) { + switch (level%8) { + case (7): temp->set_color(.5,.5,.5); break; + case (6): temp->set_color(.3,.5,.5); break; + case (5): temp->set_color(.5,.3,.5); break; + case (4): temp->set_color(.3,.3,.5); break; + case (3): temp->set_color(.5,.5,.3); break; + case (2): temp->set_color(.3,.5,.3); break; + case (1): temp->set_color(.5,.3,.3); break; + default: temp->set_color(.3,.3,.3); + } + } else { + temp->set_color(red,green,blue); + } + + if (format & GLUI_TREEPANEL_DISABLE_BAR) { + temp->disable_bar(); + } else { + if (format & GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) { + temp->disable_bar(); + if ( curr_root->dynamicCastGLUI_Tree() ) + ((GLUI_Tree *)curr_root)->enable_bar(); + } else + if (format & GLUI_TREEPANEL_CONNECT_CHILDREN_ONLY) { + temp->disable_bar(); + if (temp->prev() && temp->prev()->dynamicCastGLUI_Tree() ) + { + ((GLUI_Tree *)temp->prev())->enable_bar(); + } + } + } +} + +/****************************** GLUI_TreePanel::update_all() *********/ + +void GLUI_TreePanel::update_all() +{ + printf("GLUI_TreePanel::update_all() doesn't work yet. - JVK\n"); + return; + GLUI_Panel *saved_root = curr_root; + GLUI_Tree *saved_branch = curr_branch; + root_children = 0; + resetToRoot(this); + if (curr_branch && curr_branch->dynamicCastGLUI_Tree()) + formatNode((GLUI_Tree *)curr_branch); + next(); + while (curr_root && curr_branch != this->first_child()) { + if (curr_branch && curr_branch->dynamicCastGLUI_Tree()) { + formatNode((GLUI_Tree *)curr_branch); + } + next(); + } + curr_root = saved_root; + curr_branch = saved_branch; +} + +/****************************** GLUI_TreePanel::expand_all() *********/ + +void GLUI_TreePanel::expand_all() +{ + GLUI_Panel *saved_root = curr_root; + GLUI_Tree *saved_branch = curr_branch; + + resetToRoot(this); + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree*)curr_root)->open(); + next(); + while (curr_root != NULL && curr_branch != this->first_child()) { + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree*)curr_root)->open(); + next(); + } + + curr_root = saved_root; + curr_branch = saved_branch; +} + +/****************************** GLUI_TreePanel::collapse_all() *********/ + +void GLUI_TreePanel::collapse_all() +{ + GLUI_Panel *saved_root = curr_root; + GLUI_Tree *saved_branch = curr_branch; + + resetToRoot(this); + next(); + while (curr_root != NULL && curr_branch != this->first_child()) { + if (curr_root->dynamicCastGLUI_Tree() && + curr_branch == NULL) { /* we want to close everything leaf-first */ + ((GLUI_Tree*)curr_root)->close(); + /* Rather than simply next(), we need to manually move the + curr_root because this node has been moved to the + collapsed_node list */ + curr_branch = (GLUI_Tree *)curr_root->next(); + curr_root = (GLUI_Panel *)curr_root->parent(); + } else + next(); + } + + curr_root = saved_root; + curr_branch = saved_branch; + +} + +/****************************** GLUI_TreePanel::db() *********/ + +/* Deletes the curr_root */ +void GLUI_TreePanel::db(GLUI_Tree *root) +{ + GLUI_Tree *temp_branch; + GLUI_Panel *temp_root; + + if (((GLUI_Control *)root) == ((GLUI_Control *)this)) + return; + + if (root != NULL) { + curr_root = (GLUI_Tree *)root; + curr_branch = NULL; + } + + if (curr_root == NULL || ((GLUI_Panel *)curr_root) == ((GLUI_Panel *)this)) { + resetToRoot(); + return; + } + + + temp_branch = (GLUI_Tree *)curr_root->next(); /* Next branch, if any */ + temp_root = (GLUI_Panel *)curr_root->parent(); /* new root */ + curr_root->unlink(); + delete curr_root; + curr_branch = (GLUI_Tree *) temp_branch; + curr_root = (GLUI_Panel *) temp_root; + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)curr_root)->open(); + + if ((format & GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) == GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) { + if (curr_root->dynamicCastGLUI_Tree() && ((GLUI_Tree *)curr_root->next()) == NULL) + ((GLUI_Tree *)curr_root)->disable_bar(); + } + //refresh(); +} + +/****************************** GLUI_TreePanel::descendBranch() *********/ + +/* Finds the very last branch of curr_root, resets vars */ +void GLUI_TreePanel::descendBranch(GLUI_Panel *root) { + if (root) + resetToRoot(root); + else + resetToRoot(curr_root); + if (curr_branch != NULL && curr_branch != ((GLUI_Panel *)this)) { + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)curr_root)->set_current(false); + descendBranch(curr_branch); + } +} + +/****************************** GLUI_TreePanel::next() *********/ + +void GLUI_TreePanel::next() +{ + if (curr_root == NULL) + resetToRoot(this); + + if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) + curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); + + + if (curr_branch != NULL && curr_branch != ((GLUI_Panel *)this)) { /* Descend into branch */ + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)curr_root)->set_current(false); + resetToRoot(curr_branch); + } else if (curr_branch == NULL) { + fb(NULL); /* Backup and move on */ + } +} + +/****************************** GLUI_TreePanel::resetToRoot() *********/ + +/* Resets curr_root and curr branch to TreePanel and lastChild */ +void GLUI_TreePanel::resetToRoot(GLUI_Panel *new_root) +{ + GLUI_Panel *root = this; + if (new_root != NULL) + root = new_root; + curr_root = root; + if (curr_root->dynamicCastGLUI_Tree()) + ((GLUI_Tree *)curr_root)->set_current(true); + curr_branch = (GLUI_Tree *)root->first_child(); + + /* since Trees are collapsable, we need to check the collapsed nodes + in case the curr_root is collapsed */ + if (curr_branch == NULL && (root->collapsed_node).first_child() != NULL) { + curr_branch = (GLUI_Tree *)(root->collapsed_node).first_child(); + } + while (curr_branch && curr_branch->dynamicCastGLUI_Tree()) { + curr_branch=(GLUI_Tree *)curr_branch->next(); + } +} diff --git a/Extras/glui/glui_window.cpp b/Extras/glui/glui_window.cpp index c028e248e..02c2d0d26 100644 --- a/Extras/glui/glui_window.cpp +++ b/Extras/glui/glui_window.cpp @@ -1,44 +1,44 @@ -/* - - glui_window.cpp - GLUI_Button control class - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -#include "GL/glui.h" -#include "glui_internal.h" - -GLUI_Glut_Window::GLUI_Glut_Window() -: GLUI_Node(), - - glut_window_id(0), - glut_keyboard_CB(NULL), - glut_special_CB(NULL), - glut_reshape_CB(NULL), - glut_passive_motion_CB(NULL), - glut_mouse_CB(NULL), - glut_visibility_CB(NULL), - glut_motion_CB(NULL), - glut_display_CB(NULL), - glut_entry_CB(NULL) -{ -} +/* + + glui_window.cpp - GLUI_Button control class + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include "GL/glui.h" +#include "glui_internal.h" + +GLUI_Glut_Window::GLUI_Glut_Window() +: GLUI_Node(), + + glut_window_id(0), + glut_keyboard_CB(NULL), + glut_special_CB(NULL), + glut_reshape_CB(NULL), + glut_passive_motion_CB(NULL), + glut_mouse_CB(NULL), + glut_visibility_CB(NULL), + glut_motion_CB(NULL), + glut_display_CB(NULL), + glut_entry_CB(NULL) +{ +} diff --git a/Extras/glui/quaternion.cpp b/Extras/glui/quaternion.cpp index 056516713..d73523eb2 100644 --- a/Extras/glui/quaternion.cpp +++ b/Extras/glui/quaternion.cpp @@ -1,243 +1,243 @@ -/*********************************************************************** - - quaternion.cpp - A quaternion class - - ------------------------------------------------------------------- - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -************************************************************************ - - Feb 1998, Paul Rademacher (rademach@cs.unc.edu) - Oct 2003, Nigel Stewart - GLUI Code Cleaning - -************************************************************************/ -#include "glui_internal_control.h" -#include "quaternion.h" -#include -#include "glui_internal.h" - -/******************************************* constructors **************/ - -quat::quat() -{ - *this = quat_identity(); -} - -quat::quat(const float x, const float y, const float z, const float w) -{ - v.set( x, y, z ); - s = w; -} - -quat::quat(const vec3 &_v, const float _s) -{ - set( _v, _s ); -} - -quat::quat(const float _s, const vec3 &_v) -{ - set( _v, _s ); -} - -quat::quat(const float *d) -{ - v[0] = d[0]; - v[1] = d[1]; - v[2] = d[2]; - s = d[3]; -} - -quat::quat(const double *d) -{ - v[0] = (float) d[0]; - v[1] = (float) d[1]; - v[2] = (float) d[2]; - s = (float) d[3]; -} - -quat::quat(const quat &q) -{ - v = q.v; - s = q.s; -} - -void quat::set(const vec3 &_v, const float _s) -{ - v = _v; - s = _s; -} - -quat &quat::operator=(const quat &q) -{ - v = q.v; - s = q.s; - return *this; -} - -/******** quat friends ************/ - -quat operator + (const quat &a, const quat &b) -{ - return quat( a.s+b.s, a.v+b.v ); -} - -quat operator - (const quat &a, const quat &b) -{ - return quat( a.s-b.s, a.v-b.v ); -} - -quat operator - (const quat &a ) -{ - return quat( -a.s, -a.v ); -} - -quat operator * ( const quat &a, const quat &b) -{ - return quat( a.s*b.s - a.v*b.v, a.s*b.v + b.s*a.v + a.v^b.v ); -} - -quat operator * ( const quat &a, const float t) -{ - return quat( a.v * t, a.s * t ); -} - -quat operator * ( const float t, const quat &a ) -{ - return quat( a.v * t, a.s * t ); -} - -mat4 quat::to_mat4() const -{ - float xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; - - float t = 2.0f / (v*v + s*s); - - xs = v[VX]*t; ys = v[VY]*t; zs = v[VZ]*t; - wx = s*xs; wy = s*ys; wz = s*zs; - xx = v[VX]*xs; xy = v[VX]*ys; xz = v[VX]*zs; - yy = v[VY]*ys; yz = v[VY]*zs; zz = v[VZ]*zs; - - mat4 matrix( - 1.0f-(yy+zz), xy+wz, xz-wy, 0.0f, - xy-wz, 1.0f-(xx+zz), yz+wx, 0.0f, - xz+wy, yz-wx, 1.0f-(xx+yy), 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f ); - - return matrix; -} - -/************************************************* quat_identity() *****/ -/* Returns quaternion identity element */ - -quat quat_identity() -{ - return quat( vec3( 0.0, 0.0, 0.0 ), 1.0 ); -} - -/************************************************ quat_slerp() ********/ -/* Quaternion spherical interpolation */ - -quat quat_slerp(const quat &from, const quat &to, float t) -{ - quat to1; - float omega, cosom, sinom, scale0, scale1; - - /* calculate cosine */ - cosom = from.v * to.v + from.s + to.s; - - /* Adjust signs (if necessary) */ - if ( cosom < 0.0 ) - { - cosom = -cosom; - to1 = -to; - } - else - { - to1 = to; - } - - /* Calculate coefficients */ - if ((1.0 - cosom) > FUDGE ) - { - /* standard case (slerp) */ - omega = (float) acos( cosom ); - sinom = (float) sin( omega ); - scale0 = (float) sin((1.0 - t) * omega) / sinom; - scale1 = (float) sin(t * omega) / sinom; - } - else - { - /* 'from' and 'to' are very close - just do linear interpolation */ - scale0 = 1.0f - t; - scale1 = t; - } - - return scale0 * from + scale1 * to1; -} - -/********************************************** set_angle() ************/ -/* set rot angle (degrees) */ - -void quat::set_angle(float f) -{ - vec3 axis = get_axis(); - - s = (float) cos( DEG2RAD( f ) / 2.0 ); - - v = axis * (float) sin(DEG2RAD(f) / 2.0); -} - -/********************************************** scale_angle() ************/ -/* scale rot angle (degrees) */ - -void quat::scale_angle(float f) -{ - set_angle( f * get_angle() ); -} - -/********************************************** get_angle() ************/ -/* get rot angle (degrees). Assumes s is between -1 and 1 */ - -float quat::get_angle() const -{ - return (float) RAD2DEG( 2.0 * acos( s ) ); -} - -/********************************************* get_axis() **************/ - -vec3 quat::get_axis() const -{ - float scale = (float) sin( acos( s ) ); - - if ( scale < FUDGE AND scale > -FUDGE ) - return vec3( 0.0, 0.0, 0.0 ); - else - return v / scale; -} - -/******************************************* quat::print() ************/ - -void quat::print(FILE *dest, const char *name) const -{ - fprintf( dest, "%s: v:<%3.2f %3.2f %3.2f> s:%3.2f\n", - name, v[0], v[1], v[2], s ); -} +/*********************************************************************** + + quaternion.cpp - A quaternion class + + ------------------------------------------------------------------- + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +************************************************************************ + + Feb 1998, Paul Rademacher (rademach@cs.unc.edu) + Oct 2003, Nigel Stewart - GLUI Code Cleaning + +************************************************************************/ +#include "glui_internal_control.h" +#include "quaternion.h" +#include +#include "glui_internal.h" + +/******************************************* constructors **************/ + +quat::quat() +{ + *this = quat_identity(); +} + +quat::quat(const float x, const float y, const float z, const float w) +{ + v.set( x, y, z ); + s = w; +} + +quat::quat(const vec3 &_v, const float _s) +{ + set( _v, _s ); +} + +quat::quat(const float _s, const vec3 &_v) +{ + set( _v, _s ); +} + +quat::quat(const float *d) +{ + v[0] = d[0]; + v[1] = d[1]; + v[2] = d[2]; + s = d[3]; +} + +quat::quat(const double *d) +{ + v[0] = (float) d[0]; + v[1] = (float) d[1]; + v[2] = (float) d[2]; + s = (float) d[3]; +} + +quat::quat(const quat &q) +{ + v = q.v; + s = q.s; +} + +void quat::set(const vec3 &_v, const float _s) +{ + v = _v; + s = _s; +} + +quat &quat::operator=(const quat &q) +{ + v = q.v; + s = q.s; + return *this; +} + +/******** quat friends ************/ + +quat operator + (const quat &a, const quat &b) +{ + return quat( a.s+b.s, a.v+b.v ); +} + +quat operator - (const quat &a, const quat &b) +{ + return quat( a.s-b.s, a.v-b.v ); +} + +quat operator - (const quat &a ) +{ + return quat( -a.s, -a.v ); +} + +quat operator * ( const quat &a, const quat &b) +{ + return quat( a.s*b.s - a.v*b.v, a.s*b.v + b.s*a.v + a.v^b.v ); +} + +quat operator * ( const quat &a, const float t) +{ + return quat( a.v * t, a.s * t ); +} + +quat operator * ( const float t, const quat &a ) +{ + return quat( a.v * t, a.s * t ); +} + +mat4 quat::to_mat4() const +{ + float xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; + + float t = 2.0f / (v*v + s*s); + + xs = v[VX]*t; ys = v[VY]*t; zs = v[VZ]*t; + wx = s*xs; wy = s*ys; wz = s*zs; + xx = v[VX]*xs; xy = v[VX]*ys; xz = v[VX]*zs; + yy = v[VY]*ys; yz = v[VY]*zs; zz = v[VZ]*zs; + + mat4 matrix( + 1.0f-(yy+zz), xy+wz, xz-wy, 0.0f, + xy-wz, 1.0f-(xx+zz), yz+wx, 0.0f, + xz+wy, yz-wx, 1.0f-(xx+yy), 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f ); + + return matrix; +} + +/************************************************* quat_identity() *****/ +/* Returns quaternion identity element */ + +quat quat_identity() +{ + return quat( vec3( 0.0, 0.0, 0.0 ), 1.0 ); +} + +/************************************************ quat_slerp() ********/ +/* Quaternion spherical interpolation */ + +quat quat_slerp(const quat &from, const quat &to, float t) +{ + quat to1; + float omega, cosom, sinom, scale0, scale1; + + /* calculate cosine */ + cosom = from.v * to.v + from.s + to.s; + + /* Adjust signs (if necessary) */ + if ( cosom < 0.0 ) + { + cosom = -cosom; + to1 = -to; + } + else + { + to1 = to; + } + + /* Calculate coefficients */ + if ((1.0 - cosom) > FUDGE ) + { + /* standard case (slerp) */ + omega = (float) acos( cosom ); + sinom = (float) sin( omega ); + scale0 = (float) sin((1.0 - t) * omega) / sinom; + scale1 = (float) sin(t * omega) / sinom; + } + else + { + /* 'from' and 'to' are very close - just do linear interpolation */ + scale0 = 1.0f - t; + scale1 = t; + } + + return scale0 * from + scale1 * to1; +} + +/********************************************** set_angle() ************/ +/* set rot angle (degrees) */ + +void quat::set_angle(float f) +{ + vec3 axis = get_axis(); + + s = (float) cos( DEG2RAD( f ) / 2.0 ); + + v = axis * (float) sin(DEG2RAD(f) / 2.0); +} + +/********************************************** scale_angle() ************/ +/* scale rot angle (degrees) */ + +void quat::scale_angle(float f) +{ + set_angle( f * get_angle() ); +} + +/********************************************** get_angle() ************/ +/* get rot angle (degrees). Assumes s is between -1 and 1 */ + +float quat::get_angle() const +{ + return (float) RAD2DEG( 2.0 * acos( s ) ); +} + +/********************************************* get_axis() **************/ + +vec3 quat::get_axis() const +{ + float scale = (float) sin( acos( s ) ); + + if ( scale < FUDGE AND scale > -FUDGE ) + return vec3( 0.0, 0.0, 0.0 ); + else + return v / scale; +} + +/******************************************* quat::print() ************/ + +void quat::print(FILE *dest, const char *name) const +{ + fprintf( dest, "%s: v:<%3.2f %3.2f %3.2f> s:%3.2f\n", + name, v[0], v[1], v[2], s ); +} diff --git a/Extras/glui/quaternion.h b/Extras/glui/quaternion.h index 8bd458232..f58a7445e 100644 --- a/Extras/glui/quaternion.h +++ b/Extras/glui/quaternion.h @@ -1,114 +1,114 @@ -/**************************************************************************** - - quaternion.h - A quaternion class - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - --------------------------------------------------------------------- - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#ifndef GLUI_QUATERNION_H -#define GLUI_QUATERNION_H - -#include "algebra3.h" -#include - -/* this line defines a new type: pointer to a function which returns a */ -/* float and takes as argument a float */ -typedef float (*V_FCT_PTR)(float); - -/**************************************************************** - * Quaternion * - ****************************************************************/ - -class quat -{ - /*protected: */ -public: - - vec3 v; /* vector component */ - float s; /* scalar component */ - - /*public: */ - - /* Constructors */ - - quat(); - quat(float x, float y, float z, float w); - quat(const vec3 &v, float s); - quat(float s, const vec3 &v); - quat(const float *d); /* copy from four-element float array */ - quat(const double *f); /* copy from four-element double array */ - quat(const quat &q); /* copy from other quat */ - - /* Assignment operators */ - - quat &operator = (const quat &v); /* assignment of a quat */ - quat &operator += (const quat &v); /* incrementation by a quat */ - quat &operator -= (const quat &v); /* decrementation by a quat */ - quat &operator *= (float d); /* multiplication by a constant */ - quat &operator /= (float d); /* division by a constant */ - - /* special functions */ - - float length() const; /* length of a quat */ - float length2() const; /* squared length of a quat */ - quat &normalize(); /* normalize a quat */ - quat &apply(V_FCT_PTR fct); /* apply a func. to each component */ - vec3 xform(const vec3 &v ); /* q*v*q-1 */ - mat4 to_mat4() const; - void set_angle(float f); /* set rot angle (degrees) */ - void scale_angle(float f); /* scale rot angle (degrees) */ - float get_angle() const; /* set rot angle (degrees) */ - vec3 get_axis() const; /* get axis */ - - void print( FILE *file, const char *name ) const; /* print to a file */ - - float &operator [] (int i); /* indexing */ - const float &operator [] (int i) const; /* indexing */ - - void set(float x, float y, float z); /* set quat */ - void set(const vec3 &v, float s); /* set quat */ - - /* friends */ - - friend quat operator - (const quat &v); /* -q1 */ - friend quat operator + (const quat &a, const quat &b); /* q1 + q2 */ - friend quat operator - (const quat &a, const quat &b); /* q1 - q2 */ - friend quat operator * (const quat &a, float d); /* q1 * 3.0 */ - friend quat operator * (float d, const quat &a); /* 3.0 * q1 */ - friend quat operator * (const quat &a, const quat &b); /* q1 * q2 */ - friend quat operator / (const quat &a, float d); /* q1 / 3.0 */ - friend int operator == (const quat &a, const quat &b); /* q1 == q2 ? */ - friend int operator != (const quat &a, const quat &b); /* q1 != q2 ? */ - friend void swap(quat &a, quat &b); /* swap q1 &q2 */ - /*friend quat min(const quat &a, const quat &b); -- min(q1, q2) */ - /*friend quat max(const quat &a, const quat &b); -- max(q1, q2) */ - friend quat prod(const quat &a, const quat &b); /* term by term mult*/ -}; - -/* Utility functions */ - -quat quat_identity(); /* Returns quaternion identity element */ -quat quat_slerp(const quat &from, const quat &to, float t); - -#endif +/**************************************************************************** + + quaternion.h - A quaternion class + + GLUI User Interface Toolkit (LGPL) + Copyright (c) 1998 Paul Rademacher + + --------------------------------------------------------------------- + + WWW: http://sourceforge.net/projects/glui/ + Forums: http://sourceforge.net/forum/?group_id=92496 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*****************************************************************************/ + +#ifndef GLUI_QUATERNION_H +#define GLUI_QUATERNION_H + +#include "algebra3.h" +#include + +/* this line defines a new type: pointer to a function which returns a */ +/* float and takes as argument a float */ +typedef float (*V_FCT_PTR)(float); + +/**************************************************************** + * Quaternion * + ****************************************************************/ + +class quat +{ + /*protected: */ +public: + + vec3 v; /* vector component */ + float s; /* scalar component */ + + /*public: */ + + /* Constructors */ + + quat(); + quat(float x, float y, float z, float w); + quat(const vec3 &v, float s); + quat(float s, const vec3 &v); + quat(const float *d); /* copy from four-element float array */ + quat(const double *f); /* copy from four-element double array */ + quat(const quat &q); /* copy from other quat */ + + /* Assignment operators */ + + quat &operator = (const quat &v); /* assignment of a quat */ + quat &operator += (const quat &v); /* incrementation by a quat */ + quat &operator -= (const quat &v); /* decrementation by a quat */ + quat &operator *= (float d); /* multiplication by a constant */ + quat &operator /= (float d); /* division by a constant */ + + /* special functions */ + + float length() const; /* length of a quat */ + float length2() const; /* squared length of a quat */ + quat &normalize(); /* normalize a quat */ + quat &apply(V_FCT_PTR fct); /* apply a func. to each component */ + vec3 xform(const vec3 &v ); /* q*v*q-1 */ + mat4 to_mat4() const; + void set_angle(float f); /* set rot angle (degrees) */ + void scale_angle(float f); /* scale rot angle (degrees) */ + float get_angle() const; /* set rot angle (degrees) */ + vec3 get_axis() const; /* get axis */ + + void print( FILE *file, const char *name ) const; /* print to a file */ + + float &operator [] (int i); /* indexing */ + const float &operator [] (int i) const; /* indexing */ + + void set(float x, float y, float z); /* set quat */ + void set(const vec3 &v, float s); /* set quat */ + + /* friends */ + + friend quat operator - (const quat &v); /* -q1 */ + friend quat operator + (const quat &a, const quat &b); /* q1 + q2 */ + friend quat operator - (const quat &a, const quat &b); /* q1 - q2 */ + friend quat operator * (const quat &a, float d); /* q1 * 3.0 */ + friend quat operator * (float d, const quat &a); /* 3.0 * q1 */ + friend quat operator * (const quat &a, const quat &b); /* q1 * q2 */ + friend quat operator / (const quat &a, float d); /* q1 / 3.0 */ + friend int operator == (const quat &a, const quat &b); /* q1 == q2 ? */ + friend int operator != (const quat &a, const quat &b); /* q1 != q2 ? */ + friend void swap(quat &a, quat &b); /* swap q1 &q2 */ + /*friend quat min(const quat &a, const quat &b); -- min(q1, q2) */ + /*friend quat max(const quat &a, const quat &b); -- max(q1, q2) */ + friend quat prod(const quat &a, const quat &b); /* term by term mult*/ +}; + +/* Utility functions */ + +quat quat_identity(); /* Returns quaternion identity element */ +quat quat_slerp(const quat &from, const quat &to, float t); + +#endif diff --git a/Extras/glui/readme.txt b/Extras/glui/readme.txt index 43ba3ed52..4cda867f6 100644 --- a/Extras/glui/readme.txt +++ b/Extras/glui/readme.txt @@ -1,228 +1,228 @@ -Welcome to the GLUI User Interface Library, v2.3! -March 22, 2005 -------------------------------------------------- - -This distribution contains the latest community-maintained fork of the -GLUI Library. It is based on the GLUI v2.1 beta version from Paul -Rademacher (http://www.cs.unc.edu/~rademach/glui/) plus the -compatibility changes made by Nigel Stewart in his "GLUI v2.2" -(http://www.nigels.com/glt/glui) In accordance with the LGPL under -which the library is released (according to Paul's web page at least), -these changes are available to everyone in the community. - -WARNING: This version (2.3) introduces some incompatible changes with -previous versions!! - -CHANGES: - ----------------------------------- -- GLUI_String is now a std::string - This is the main source of most incopatibilities, but I felt it was - a necessary change, because the previous usage of a fixed-sized - buffer was just too unsafe. I myself was bitten a few times passing - a char* buffer of insufficient size into GLUI as a live variable. - It is still possible to use a char buffer, but it is not recommended. - - If you used GLUI_String before as a live var type, the easiest way - to get your code compiling again is to change those to "char - buf[300]". The better way, though, is to update your code to treat - it as a std::string. - - For instance, if you used to pass mystr to functions that take - 'const char*', now use mystr.c_str() method, instead. - If you used strcpy(mystr, b) to set the value, now just do mystr=b. - If you used sprintf(mystr,...) to set the value, now do - glui_format_string(mystr,...). - If you used to clear the string with mystr[0]='\0', now just clear - it with mystr="". - ----------------------------------- -- Enhanced GLUI_EditText - Control keys can be used for navigation and control. The bindings - are bash-like: Ctrl-B for previous char, Ctrl-F for forward char, etc. - bindings. Also control keys that aren't bound to commands are - simply ignored, whereas before they would be inserted as invisible - characters. - ----------------------------------- -- Added GLUI_CommandLine class - This is a GLUI_EditText with a history mechanism. - ----------------------------------- -- New, more object oriented construction API. - Now instead of calling - - glui->add_button_to_panel( panel, "my button", myid, mycallback ); - - you should just call the button constructor: - - new GLUI_Button( panel, "my button", myid, mycallback ); - - And similarly to add it to a GLUI instead of a panel, rather than: - - glui->add_button( glui, "my button", myid, mycallback ); - - just call the constructor with the GLUI as the first argument: - - new GLUI_Button( glui, "my button", myid, mycallback ); - - The old scheme is now deprecated, but still works. The benefit of - this new scheme is that now the GLUI class doesn't have to know - about all the different types of GLUI_Controls that exist. - Previously GLUI had to both know about all the controls, and know - how to initialize them. Now the responsibility for initialization - belongs to the GLUI_Control subclasses themselves, where it - belongs. Additionally it means that you can create your own - GLUI_Control subclasses which will be on equal footing with the - built-in controls, whereas before any user-created controls would - always be "second-class citizens" since they would have to be - constructed differently from the built-ins. - - ----------------------------------- -- Removed need for type-declaring arguments when argment type suffices. - This effects GLUI_Spinner and GLUI_EditText (and GLUI_CommandLine?). - - For example, instead of calling - - new GLUI_Spinner( glui, "myspin", GLUI_SPINNER_INT, &live_int_var ); - - you can just omit the GLUI_SPINNER_INT part, because the type of the - live_int_var tells the compiler which type you want. - - new GLUI_Spinner( glui, "myspin", &live_int_var ); - - If you're not using a live, var, you can still use the - GLUI_SPINNER_INT type argument. See glui.h for all the new - constructor signatures. Note this only works with the new - construction API, not with the old "add_blah_to_panel" style of - API. - ----------------------------------- -- GLUI_Rotation uses your matrix live-variable now. - GLUI used to ignore the matrix in your live variable. This version - doesn't ignore it, so you'll need to set it to the identity matrix - yourself if that's what you want it to start as. There could - probably be some improvements to this API, though. - ----------------------------------- -- Improvements to 'const' usage. - Most char*'s in GLUI functions used to be non-const even when the - functions did not modify the string. I changed everywhere - appropriate to use const char* instead. - ----------------------------------- -- Updated license info in the headers - Paul's web page says that GLUI is LGPL, but that wasn't declared in - the code itself. I've modified all the headers with the standard - LGPL notice. - ----------------------------------- -- Updated examples for the API changes - ----------------------------------- -- Created project files for Visual Studio .NET (MSVC7.1) - - -That's about it. Enjoy! - - -If you find yourself with too much time on your hands, the things I -think would be most useful for future improvements to GLUI would be: - -1. The GLUI_TextBox and GLUI_Tree definitely need some work, still. -2. Clipboard integration under Windows/X-Win. I have some code that - works on Win32 that I once integrated with GLUI, but I lost that - version somewhere. I still have the Win32 clipboard code, though - if anyone wants to work on integrating it. I have some X-Win - clipboard code, too, but I never got it working quite right. -3. Remove the dependency on GLUT, making the connection with window - system APIs into a more plug-in/adapter modular design. - So e.g. if you want to use GLUT, you'd link with the GLUI lib and a - GLUI_GLUT lib, and call one extra GLUI_glut_init() function or - something. - - -Definitly consider submitting a patch if you've made some nice improvements -to GLUI. Hopefully being an LGPL sourceforge project will attract some new -interest to the GLUI project. - -Bill Baxter -baxter -at -cs unc edu - -================================================= -JOHN KEW'S ADDITIONS (March 2005) -================================================= - -Thanks to John Kew of Natural Solutions Inc., -there are some new widgets. These are demonstrated in example6.cpp. - -The new widgets are: - -* GLUI_Scrollbar - A scrollbar slider widget -* GLUI_TextBox - A multi-line text widget -* GLUI_List - A static choice list -* GLUI_FileBrowser - A simple filebrowser based on GLUI_List -* GLUI_Tree - Hierarchical tree widget -* GLUI_TreePanel - Manager for the tree widget - -And one other change: - -* GLUI_Rollout has optional embossed border - -================================================= -PAUL'S ORIGINAL GLUI 2.0/2.1 README -================================================= - -Welcome to the GLUI User Interface Library, v2.0 beta! -------------------------------------------------- - -This distribution contains the full GLUI sources, as well as 5 example -programs. You'll find the full manual under "glui_manual.pdf". The -GLUI web page is at - - http://www.cs.unc.edu/~rademach/glui - - - ---------- Windows ---------- - -The directory 'msvc' contains a Visual C++ workspace entitled -'glui.dsw'. To recompile the library and examples, open this -workspace and run the menu command "Build:Batch Build:Build". The 3 -executables will be in the 'bin' directory, and the library in the -'lib' directory. - -To create a new Windows executable using GLUI, create a "Win32 Console -Application" in VC++, add the GLUI library (in 'msvc/lib/glui32.lib'), -and add the OpenGL libs: - - glui32.lib glut32.lib glu32.lib opengl32.lib (Microsoft OpenGL) - -Include the file "glui.h" in any file that uses the GLUI library. - - - ---------- Unix ---------- - -An SGI/HP makefile is found in the file 'makefile' (certain lines may need -to be commented/uncommented). - -To include GLUI in your own apps, add the glui library to your -makefile (before the glut library 'libglut.a'), and include "glui.h" -in your sources. - - - ----------------------------------------------------------------------- - -Please let me know what you think, what you'd like to change or add, -and especially what bugs you encounter. Also, please send me your -e-mail so I can add you to a mailing list for updates. - -Good luck, and thanks for trying this out! - -Paul Rademacher -rademach -at +Welcome to the GLUI User Interface Library, v2.3! +March 22, 2005 +------------------------------------------------- + +This distribution contains the latest community-maintained fork of the +GLUI Library. It is based on the GLUI v2.1 beta version from Paul +Rademacher (http://www.cs.unc.edu/~rademach/glui/) plus the +compatibility changes made by Nigel Stewart in his "GLUI v2.2" +(http://www.nigels.com/glt/glui) In accordance with the LGPL under +which the library is released (according to Paul's web page at least), +these changes are available to everyone in the community. + +WARNING: This version (2.3) introduces some incompatible changes with +previous versions!! + +CHANGES: + +---------------------------------- +- GLUI_String is now a std::string + This is the main source of most incopatibilities, but I felt it was + a necessary change, because the previous usage of a fixed-sized + buffer was just too unsafe. I myself was bitten a few times passing + a char* buffer of insufficient size into GLUI as a live variable. + It is still possible to use a char buffer, but it is not recommended. + + If you used GLUI_String before as a live var type, the easiest way + to get your code compiling again is to change those to "char + buf[300]". The better way, though, is to update your code to treat + it as a std::string. + + For instance, if you used to pass mystr to functions that take + 'const char*', now use mystr.c_str() method, instead. + If you used strcpy(mystr, b) to set the value, now just do mystr=b. + If you used sprintf(mystr,...) to set the value, now do + glui_format_string(mystr,...). + If you used to clear the string with mystr[0]='\0', now just clear + it with mystr="". + +---------------------------------- +- Enhanced GLUI_EditText + Control keys can be used for navigation and control. The bindings + are bash-like: Ctrl-B for previous char, Ctrl-F for forward char, etc. + bindings. Also control keys that aren't bound to commands are + simply ignored, whereas before they would be inserted as invisible + characters. + +---------------------------------- +- Added GLUI_CommandLine class + This is a GLUI_EditText with a history mechanism. + +---------------------------------- +- New, more object oriented construction API. + Now instead of calling + + glui->add_button_to_panel( panel, "my button", myid, mycallback ); + + you should just call the button constructor: + + new GLUI_Button( panel, "my button", myid, mycallback ); + + And similarly to add it to a GLUI instead of a panel, rather than: + + glui->add_button( glui, "my button", myid, mycallback ); + + just call the constructor with the GLUI as the first argument: + + new GLUI_Button( glui, "my button", myid, mycallback ); + + The old scheme is now deprecated, but still works. The benefit of + this new scheme is that now the GLUI class doesn't have to know + about all the different types of GLUI_Controls that exist. + Previously GLUI had to both know about all the controls, and know + how to initialize them. Now the responsibility for initialization + belongs to the GLUI_Control subclasses themselves, where it + belongs. Additionally it means that you can create your own + GLUI_Control subclasses which will be on equal footing with the + built-in controls, whereas before any user-created controls would + always be "second-class citizens" since they would have to be + constructed differently from the built-ins. + + +---------------------------------- +- Removed need for type-declaring arguments when argment type suffices. + This effects GLUI_Spinner and GLUI_EditText (and GLUI_CommandLine?). + + For example, instead of calling + + new GLUI_Spinner( glui, "myspin", GLUI_SPINNER_INT, &live_int_var ); + + you can just omit the GLUI_SPINNER_INT part, because the type of the + live_int_var tells the compiler which type you want. + + new GLUI_Spinner( glui, "myspin", &live_int_var ); + + If you're not using a live, var, you can still use the + GLUI_SPINNER_INT type argument. See glui.h for all the new + constructor signatures. Note this only works with the new + construction API, not with the old "add_blah_to_panel" style of + API. + +---------------------------------- +- GLUI_Rotation uses your matrix live-variable now. + GLUI used to ignore the matrix in your live variable. This version + doesn't ignore it, so you'll need to set it to the identity matrix + yourself if that's what you want it to start as. There could + probably be some improvements to this API, though. + +---------------------------------- +- Improvements to 'const' usage. + Most char*'s in GLUI functions used to be non-const even when the + functions did not modify the string. I changed everywhere + appropriate to use const char* instead. + +---------------------------------- +- Updated license info in the headers + Paul's web page says that GLUI is LGPL, but that wasn't declared in + the code itself. I've modified all the headers with the standard + LGPL notice. + +---------------------------------- +- Updated examples for the API changes + +---------------------------------- +- Created project files for Visual Studio .NET (MSVC7.1) + + +That's about it. Enjoy! + + +If you find yourself with too much time on your hands, the things I +think would be most useful for future improvements to GLUI would be: + +1. The GLUI_TextBox and GLUI_Tree definitely need some work, still. +2. Clipboard integration under Windows/X-Win. I have some code that + works on Win32 that I once integrated with GLUI, but I lost that + version somewhere. I still have the Win32 clipboard code, though + if anyone wants to work on integrating it. I have some X-Win + clipboard code, too, but I never got it working quite right. +3. Remove the dependency on GLUT, making the connection with window + system APIs into a more plug-in/adapter modular design. + So e.g. if you want to use GLUT, you'd link with the GLUI lib and a + GLUI_GLUT lib, and call one extra GLUI_glut_init() function or + something. + + +Definitly consider submitting a patch if you've made some nice improvements +to GLUI. Hopefully being an LGPL sourceforge project will attract some new +interest to the GLUI project. + +Bill Baxter +baxter +at +cs unc edu + +================================================= +JOHN KEW'S ADDITIONS (March 2005) +================================================= + +Thanks to John Kew of Natural Solutions Inc., +there are some new widgets. These are demonstrated in example6.cpp. + +The new widgets are: + +* GLUI_Scrollbar - A scrollbar slider widget +* GLUI_TextBox - A multi-line text widget +* GLUI_List - A static choice list +* GLUI_FileBrowser - A simple filebrowser based on GLUI_List +* GLUI_Tree - Hierarchical tree widget +* GLUI_TreePanel - Manager for the tree widget + +And one other change: + +* GLUI_Rollout has optional embossed border + +================================================= +PAUL'S ORIGINAL GLUI 2.0/2.1 README +================================================= + +Welcome to the GLUI User Interface Library, v2.0 beta! +------------------------------------------------- + +This distribution contains the full GLUI sources, as well as 5 example +programs. You'll find the full manual under "glui_manual.pdf". The +GLUI web page is at + + http://www.cs.unc.edu/~rademach/glui + + + ---------- Windows ---------- + +The directory 'msvc' contains a Visual C++ workspace entitled +'glui.dsw'. To recompile the library and examples, open this +workspace and run the menu command "Build:Batch Build:Build". The 3 +executables will be in the 'bin' directory, and the library in the +'lib' directory. + +To create a new Windows executable using GLUI, create a "Win32 Console +Application" in VC++, add the GLUI library (in 'msvc/lib/glui32.lib'), +and add the OpenGL libs: + + glui32.lib glut32.lib glu32.lib opengl32.lib (Microsoft OpenGL) + +Include the file "glui.h" in any file that uses the GLUI library. + + + ---------- Unix ---------- + +An SGI/HP makefile is found in the file 'makefile' (certain lines may need +to be commented/uncommented). + +To include GLUI in your own apps, add the glui library to your +makefile (before the glut library 'libglut.a'), and include "glui.h" +in your sources. + + + +---------------------------------------------------------------------- + +Please let me know what you think, what you'd like to change or add, +and especially what bugs you encounter. Also, please send me your +e-mail so I can add you to a mailing list for updates. + +Good luck, and thanks for trying this out! + +Paul Rademacher +rademach +at cs unc edu \ No newline at end of file diff --git a/Extras/iff/IFF.txt b/Extras/iff/IFF.txt index 36adfd88b..9d4ae8b78 100644 --- a/Extras/iff/IFF.txt +++ b/Extras/iff/IFF.txt @@ -1,1423 +1,1423 @@ - -"EA IFF 85" Standard for Interchange Format Files - -Document Date: January 14, 1985 -From: Jerry Morrison, Electronic Arts -Status of Standard: Released and in use - -1. Introduction - -Standards are Good for Software Developers - -As home computer hardware evolves to better and better media machines, -the demand increases for higher quality, more detailed data. Data -development gets more expensive, requires more expertise and better -tools, and has to be shared across projects. Think about several ports -of a product on one CD-ROM with 500M Bytes of common data! - -Development tools need standard interchange file formats. Imagine -scanning in images of "player" shapes, moving them to a paint program -for editing, then incorporating them into a game. Or writing a theme -song with a Macintosh score editor and incorporating it into an Amiga -game. The data must at times be transformed, clipped, filled out, -and moved across machine kinds. Media projects will depend on data -transfer from graphic, music, sound effect, animation, and script -tools. - -Standards are Good for Software Users - -Customers should be able to move their own data between independently -developed software products. And they should be able to buy data libraries -usable across many such products. The types of data objects to exchange -are open-ended and include plain and formatted text, raster and structured -graphics, fonts, music, sound effects, musical instrument descriptions, -and animation. - -The problem with expedient file formats typically memory dumps is -that they're too provincial. By designing data for one particular -use (e.g. a screen snapshot), they preclude future expansion (would -you like a full page picture? a multi-page document?). In neglecting -the possibility that other programs might read their data, they fail -to save contextual information (how many bit planes? what resolution?). -Ignoring that other programs might create such files, they're intolerant -of extra data (texture palette for a picture editor), missing data -(no color map), or minor variations (smaller image). In practice, -a filed representation should rarely mirror an in-memory representation. -The former should be designed for longevity; the latter to optimize -the manipulations of a particular program. The same filed data will -be read into different memory formats by different programs. - -The IFF philosophy: "A little behind-the-scenes conversion when programs -read and write files is far better than NxM explicit conversion utilities -for highly specialized formats." - -So we need some standardization for data interchange among development -tools and products. The more developers that adopt a standard, the -better for all of us and our customers. - -Here is "EA IFF 1985" - -Here is our offering: Electronic Arts' IFF standard for Interchange -File Format. The full name is "EA IFF 1985". Alternatives and justifications -are included for certain choices. Public domain subroutine packages -and utility programs are available to make it easy to write and use -IFF-compatible programs. - -Part 1 introduces the standard. Part 2 presents its requirements and -background. Parts 3, 4, and 5 define the primitive data types, FORMs, -and LISTs, respectively, and how to define new high level types. Part -6 specifies the top level file structure. Appendix A is included for -quick reference and Appendix B names the committee responsible for -this standard. - -References - -American National Standard Additional Control Codes for Use with ASCII, -ANSI standard 3.64-1979 for an 8-bit character set. See also ISO standard -2022 and ISO/DIS standard 6429.2. - -Amiga[tm] is a trademark of Commodore-Amiga, Inc. - -C, A Reference Manual, Samuel P. Harbison and Guy L. Steele Jr., Tartan -Laboratories. Prentice-Hall, Englewood Cliffs, NJ, 1984. - -Compiler Construction, An Advanced Course, edited by F. L. Bauer and -J. Eickel (Springer-Verlag, 1976). This book is one of many sources -for information on recursive descent parsing. - -DIF Technical Specification (c)1981 by Software Arts, Inc. DIF[tm] is -the format for spreadsheet data interchange developed by Software -Arts, Inc. -DIF[tm] is a trademark of Software Arts, Inc. - -Electronic Arts[tm] is a trademark of Electronic Arts. - -"FTXT" IFF Formatted Text, from Electronic Arts. IFF supplement document -for a text format. - -Inside Macintosh (c) 1982, 1983, 1984, 1985 Apple Computer, Inc., a -programmer's reference manual. -Apple(R) is a trademark of Apple Computer, Inc. -Macintosh[tm] is a trademark licensed to Apple Computer, Inc. - -"ILBM" IFF Interleaved Bitmap, from Electronic Arts. IFF supplement -document for a raster image format. - -M68000 16/32-Bit Microprocessor Programmer's Reference Manual(c) 1984, -1982, 1980, 1979 by Motorola, Inc. - -PostScript Language Manual (c) 1984 Adobe Systems Incorporated. -PostScript[tm] is a trademark of Adobe Systems, Inc. -Times and Helvetica(R) are trademarks of Allied Corporation. - -InterScript: A Proposal for a Standard for the Interchange of Editable -Documents (c)1984 Xerox Corporation. -Introduction to InterScript (c) 1985 Xerox Corporation. - - - -2. Background for Designers - -Part 2 is about the background, requirements, and goals for the standard. -It's geared for people who want to design new types of IFF objects. -People just interested in using the standard may wish to skip this -part. - -What Do We Need? - -A standard should be long on prescription and short on overhead. It -should give lots of rules for designing programs and data files for -synergy. But neither the programs nor the files should cost too much -more than the expedient variety. While we're looking to a future with -CD-ROMs and perpendicular recording, the standard must work well on -floppy disks. - -For program portability, simplicity, and efficiency, formats should -be designed with more than one implementation style in mind. (In practice, -pure stream I/O is adequate although random access makes it easier -to write files.) It ought to be possible to read one of many objects -in a file without scanning all the preceding data. Some programs need -to read and play out their data in real time, so we need good compromises -between generality and efficiency. - -As much as we need standards, they can't hold up product schedules. -So we also need a kind of decentralized extensibility where any software -developer can define and refine new object types without some "standards -authority" in the loop. Developers must be able to extend existing -formats in a forward- and backward-compatible way. A central repository -for design information and example programs can help us take full -advantage of the standard. - -For convenience, data formats should heed the restrictions of various -processors and environments. E.g. word-alignment greatly helps 68000 -access at insignificant cost to 8088 programs. - -Other goals include the ability to share common elements over a list -of objects and the ability to construct composite objects containing -other data objects with structural information like directories. - -And finally, "Simple things should be simple and complex things should -be possible." Alan Kay. - -Think Ahead - -Let's think ahead and build programs that read and write files for -each other and for programs yet to be designed. Build data formats -to last for future computers so long as the overhead is acceptable. -This extends the usefulness and life of today's programs and data. - -To maximize interconnectivity, the standard file structure and the -specific object formats must all be general and extensible. Think -ahead when designing an object. It should serve many purposes and -allow many programs to store and read back all the information they -need; even squeeze in custom data. Then a programmer can store the -available data and is encouraged to include fixed contextual details. -Recipient programs can read the needed parts, skip unrecognized stuff, -default missing data, and use the stored context to help transform -the data as needed. - -Scope - -IFF addresses these needs by defining a standard file structure, some -initial data object types, ways to define new types, and rules for -accessing these files. We can accomplish a great deal by writing programs -according to this standard, but don't expect direct compatibility -with existing software. We'll need conversion programs to bridge the -gap from the old world. - -IFF is geared for computers that readily process information in 8-bit -bytes. It assumes a "physical layer" of data storage and transmission -that reliably maintains "files" as strings of 8-bit bytes. The standard -treats a "file" as a container of data bytes and is independent of -how to find a file and whether it has a byte count. - -This standard does not by itself implement a clipboard for cutting -and pasting data between programs. A clipboard needs software to mediate -access, to maintain a "contents version number" so programs can detect -updates, and to manage the data in "virtual memory". - -Data Abstraction - -The basic problem is how to represent information in a way that's -program-independent, compiler- independent, machine-independent, and -device-independent. - -The computer science approach is "data abstraction", also known as -"objects", "actors", and "abstract data types". A data abstraction -has a "concrete representation" (its storage format), an "abstract -representation" (its capabilities and uses), and access procedures -that isolate all the calling software from the concrete representation. -Only the access procedures touch the data storage. Hiding mutable -details behind an interface is called "information hiding". What data -abstraction does is abstract from details of implementing the object, -namely the selected storage representation and algorithms for manipulating -it. - -The power of this approach is modularity. By adjusting the access -procedures we can extend and restructure the data without impacting -the interface or its callers. Conversely, we can extend and restructure -the interface and callers without making existing data obsolete. It's -great for interchange! - -But we seem to need the opposite: fixed file formats for all programs -to access. Actually, we could file data abstractions ("filed objects") -by storing the data and access procedures together. We'd have to encode -the access procedures in a standard machine-independent programming -language la PostScript. Even still, the interface can't evolve freely -since we can't update all copies of the access procedures. So we'll -have to design our abstract representations for limited evolution -and occasional revolution (conversion). - -In any case, today's microcomputers can't practically store data abstractions. -They can do the next best thing: store arbitrary types of data in -"data chunks", each with a type identifier and a length count. The -type identifier is a reference by name to the access procedures (any -local implementation). The length count enables storage-level object -operations like "copy" and "skip to next" independent of object type. - -Chunk writing is straightforward. Chunk reading requires a trivial -parser to scan each chunk and dispatch to the proper access/conversion -procedure. Reading chunks nested inside other chunks requires recursion, -but no lookahead or backup. - -That's the main idea of IFF. There are, of course, a few other detailsI - -Previous Work - -Where our needs are similar, we borrow from existing standards. - -Our basic need to move data between independently developed programs -is similar to that addressed by the Apple Macintosh desk scrap or -"clipboard" [Inside Macintosh chapter "Scrap Manager"]. The Scrap -Manager works closely with the Resource Manager, a handy filer and -swapper for data objects (text strings, dialog window templates, pictures, -fontsI) including types yet to be designed [Inside Macintosh chapter -"Resource Manager"]. The Resource Manager is a kin to Smalltalk's -object swapper. - -We will probably write a Macintosh desk accessory that converts IFF -files to and from the Macintosh clipboard for quick and easy interchange -with programs like MacPaint and Resource Mover. - -Macintosh uses a simple and elegant scheme of 4-character "identifiers" -to identify resource types, clipboard format types, file types, and -file creator programs. Alternatives are unique ID numbers assigned -by a central authority or by hierarchical authorities, unique ID numbers -generated by algorithm, other fixed length character strings, and -variable length strings. Character string identifiers double as readable -signposts in data files and programs. The choice of 4 characters is -a good tradeoff between storage space, fetch/compare/store time, and -name space size. We'll honor Apple's designers by adopting this scheme. - -"PICT" is a good example of a standard structured graphics format -(including raster images) and its many uses [Inside Macintosh chapter -"QuickDraw"]. Macintosh provides QuickDraw routines in ROM to create, -manipulate, and display PICTs. Any application can create a PICT by -simply asking QuickDraw to record a sequence of drawing commands. -Since it's just as easy to ask QuickDraw to render a PICT to a screen -or a printer, it's very effective to pass them between programs, say -from an illustrator to a word processor. An important feature is the -ability to store "comments" in a PICT which QuickDraw will ignore. -Actually, it passes them to your optional custom "comment handler". - -PostScript, Adobe's print file standard, is a more general way to -represent any print image (which is a specification for putting marks -on paper) [PostScript Language Manual]. In fact, PostScript is a full-fledged -programming language. To interpret a PostScript program is to render -a document on a raster output device. The language is defined in layers: -a lexical layer of identifiers, constants, and operators; a layer -of reverse polish semantics including scope rules and a way to define -new subroutines; and a printing-specific layer of built-in identifiers -and operators for rendering graphic images. It is clearly a powerful -(Turing equivalent) image definition language. PICT and a subset of -PostScript are candidates for structured graphics standards. - -A PostScript document can be printed on any raster output device (including -a display) but cannot generally be edited. That's because the original -flexibility and constraints have been discarded. Besides, a PostScript -program may use arbitrary computation to supply parameters like placement -and size to each operator. A QuickDraw PICT, in comparison, is a more -restricted format of graphic primitives parameterized by constants. -So a PICT can be edited at the level of the primitives, e.g. move -or thicken a line. It cannot be edited at the higher level of, say, -the bar chart data which generated the picture. - -PostScript has another limitation: Not all kinds of data amount to -marks on paper. A musical instrument description is one example. PostScript -is just not geared for such uses. - -"DIF" is another example of data being stored in a general format -usable by future programs [DIF Technical Specification]. DIF is a -format for spreadsheet data interchange. DIF and PostScript are both -expressed in plain ASCII text files. This is very handy for printing, -debugging, experimenting, and transmitting across modems. It can have -substantial cost in compaction and read/write work, depending on use. -We won't store IFF files this way but we could define an ASCII alternate -representation with a converter program. - -InterScript is Xerox' standard for interchange of editable documents -[Introduction to InterScript]. It approaches a harder problem: How -to represent editable word processor documents that may contain formatted -text, pictures, cross-references like figure numbers, and even highly -specialized objects like mathematical equations? InterScript aims -to define one standard representation for each kind of information. -Each InterScript-compatible editor is supposed to preserve the objects -it doesn't understand and even maintain nested cross-references. So -a simple word processor would let you edit the text of a fancy document -without discarding the equations or disrupting the equation numbers. - -Our task is similarly to store high level information and preserve -as much content as practical while moving it between programs. But -we need to span a larger universe of data types and cannot expect -to centrally define them all. Fortunately, we don't need to make programs -preserve information that they don't understand. And for better or -worse, we don't have to tackle general-purpose cross-references yet. - - - -3. Primitive Data Types - -Atomic components such as integers and characters that are interpretable -directly by the CPU are specified in one format for all processors. -We chose a format that's most convenient for the Motorola MC68000 -processor [M68000 16/32-Bit Microprocessor Programmer's Reference -Manual]. - -N.B.: Part 3 dictates the format for "primitive" data types where and -only where used in the overall file structure and standard kinds of -chunks (Cf. Chunks). The number of such occurrences will be small -enough that the costs of conversion, storage, and management of processor- -specific files would far exceed the costs of conversion during I/O by "foreign" -programs. A particular data chunk may be specified with a different -format for its internal primitive types or with processor- or environment- -speci fic variants if necessary to optimize local usage. Since that hurts -data interchange, it's not recommended. (Cf. Designing New Data Sections, -in Part 4.) - -Alignment - -All data objects larger than a byte are aligned on even byte addresses -relative to the start of the file. This may require padding. Pad bytes -are to be written as zeros, but don't count on that when reading. - -This means that every odd-length "chunk" (see below) must be padded -so that the next one will fall on an even boundary. Also, designers -of structures to be stored in chunks should include pad fields where -needed to align every field larger than a byte. Zeros should be stored -in all the pad bytes. - -Justification: Even-alignment causes a little extra work for files -that are used only on certain processors but allows 68000 programs -to construct and scan the data in memory and do block I/O. You just -add an occasional pad field to data structures that you're going to -block read/write or else stream read/write an extra byte. And the -same source code works on all processors. Unspecified alignment, on -the other hand, would force 68000 programs to (dis)assemble word and -long-word data one byte at a time. Pretty cumbersome in a high level -language. And if you don't conditionally compile that out for other -processors, you won't gain anything. - -Numbers - -Numeric types supported are two's complement binary integers in the -format used by the MC68000 processor high byte first, high word first the -reverse of 8088 and 6502 format. They could potentially include signed -and unsigned 8, 16, and 32 bit integers but the standard only uses -the following: - -UBYTE 8 bits unsigned -WORD 16 bits signed -UWORD 16 bits unsigned -LONG 32 bits signed - -The actual type definitions depend on the CPU and the compiler. In -this document, we'll express data type definitions in the C programming -language. [See C, A Reference Manual.] In 68000 Lattice C: - -typedef unsigned char UBYTE; /* 8 bits unsigned */ -typedef short WORD; /* 16 bits signed */ -typedef unsigned short UWORD; /* 16 bits unsigned */ -typedef long LONG; /* 32 bits signed */ - -Characters - -The following character set is assumed wherever characters are used, -e.g. in text strings, IDs, and TEXT chunks (see below). - -Characters are encoded in 8-bit ASCII. Characters in the range NUL -(hex 0) through DEL (hex 7F) are well defined by the 7-bit ASCII standard. -IFF uses the graphic group RJS (SP, hex 20) through R~S (hex 7E). - -Most of the control character group hex 01 through hex 1F have no -standard meaning in IFF. The control character LF (hex 0A) is defined -as a "newline" character. It denotes an intentional line break, that -is, a paragraph or line terminator. (There is no way to store an automatic -line break. That is strictly a function of the margins in the environment -the text is placed.) The control character ESC (hex 1B) is a reserved -escape character under the rules of ANSI standard 3.64-1979 American -National Standard Additional Control Codes for Use with ASCII, ISO -standard 2022, and ISO/DIS standard 6429.2. - -Characters in the range hex 7F through hex FF are not globally defined -in IFF. They are best left reserved for future standardization. But -note that the FORM type FTXT (formatted text) defines the meaning -of these characters within FTXT forms. In particular, character values -hex 7F through hex 9F are control codes while characters hex A0 through -hex FF are extended graphic characters like , as per the ISO and -ANSI standards cited above. [See the supplementary document "FTXT" -IFF Formatted Text.] - -Dates - -A "creation date" is defined as the date and time a stream of data -bytes was created. (Some systems call this a "last modified date".) -Editing some data changes its creation date. Moving the data between -volumes or machines does not. - -The IFF standard date format will be one of those used in MS-DOS, -Macintosh, or Amiga DOS (probably a 32-bit unsigned number of seconds -since a reference point). Issue: Investigate these three. - -Type IDs - -A "type ID", "property name", "FORM type", or any other IFF identifier -is a 32-bit value: the concatenation of four ASCII characters in the -range R S (SP, hex 20) through R~S (hex 7E). Spaces (hex 20) should -not precede printing characters; trailing spaces are ok. Control characters -are forbidden. - -typedef CHAR ID[4]; - -IDs are compared using a simple 32-bit case-dependent equality test. - -Data section type IDs (aka FORM types) are restriced IDs. (Cf. Data -Sections.) Since they may be stored in filename extensions (Cf. Single -Purpose Files) lower case letters and punctuation marks are forbidden. -Trailing spaces are ok. - -Carefully choose those four characters when you pick a new ID. Make -them mnemonic so programmers can look at an interchange format file -and figure out what kind of data it contains. The name space makes -it possible for developers scattered around the globe to generate -ID values with minimal collisions so long as they choose specific -names like "MUS4" instead of general ones like "TYPE" and "FILE". -EA will "register" new FORM type IDs and format descriptions as they're -devised, but collisions will be improbable so there will be no pressure -on this "clearinghouse" process. Appendix A has a list of currently -defined IDs. - -Sometimes it's necessary to make data format changes that aren't backward -compatible. Since IDs are used to denote data formats in IFF, new -IDs are chosen to denote revised formats. Since programs won't read -chunks whose IDs they don't recognize (see Chunks, below), the new -IDs keep old programs from stumbling over new data. The conventional -way to chose a "revision" ID is to increment the last character if -it's a digit or else change the last character to a digit. E.g. first -and second revisions of the ID "XY" would be "XY1" and "XY2". Revisions -of "CMAP" would be "CMA1" and "CMA2". - -Chunks - -Chunks are the building blocks in the IFF structure. The form expressed -as a C typedef is: - -typedef struct { - ID ckID; - LONG ckSize; /* sizeof(ckData) */ - UBYTE ckData[/* ckSize */]; - } Chunk; - -We can diagram an example chunk a "CMAP" chunk containing 12 data -bytes like this: - ---------------- - ckID: | 'CMAP' | - ckSize: | 12 | - ckData: | 0, 0, 0, 32 | -------- - | 0, 0, 64, 0 | 12 bytes - | 0, 0, 64, 0 | --------- - ---------------- - -The fixed header part means "Here's a type ckID chunk with ckSize -bytes of data." - -The ckID identifies the format and purpose of the chunk. As a rule, -a program must recognize ckID to interpret ckData. It should skip -over all unrecognized chunks. The ckID also serves as a format version -number as long as we pick new IDs to identify new formats of ckData -(see above). - -The following ckIDs are universally reserved to identify chunks with -particular IFF meanings: "LIST", "FORM", "PROP", "CAT ", and " -". The special ID " " (4 spaces) is a ckID for "filler" chunks, -that is, chunks that fill space but have no meaningful contents. The -IDs "LIS1" through "LIS9", "FOR1" through "FOR9", and "CAT1" through -"CAT9" are reserved for future "version number" variations. All IFF-compatible -software must account for these 23 chunk IDs. Appendix A has a list -of predefined IDs. - -The ckSize is a logical block size how many data bytes are in ckData. -If ckData is an odd number of bytes long, a 0 pad byte follows which -is not included in ckSize. (Cf. Alignment.) A chunk's total physical -size is ckSize rounded up to an even number plus the size of the header. -So the smallest chunk is 8 bytes long with ckSize = 0. For the sake -of following chunks, programs must respect every chunk's ckSize as -a virtual end-of-file for reading its ckData even if that data is -malformed, e.g. if nested contents are truncated. - -We can describe the syntax of a chunk as a regular expression with -"#" representing the ckSize, i.e. the length of the following {braced} -bytes. The "[0]" represents a sometimes needed pad byte. (The regular -expressions in this document are collected in Appendix A along with -an explanation of notation.) - -Chunk ::= ID #{ UBYTE* } [0] - -One chunk output technique is to stream write a chunk header, stream -write the chunk contents, then random access back to the header to -fill in the size. Another technique is to make a preliminary pass -over the data to compute the size, then write it out all at once. - -Strings, String Chunks, and String Properties - -In a string of ASCII text, LF denotes a forced line break (paragraph -or line terminator). Other control characters are not used. (Cf. Characters.) - -The ckID for a chunk that contains a string of plain, unformatted -text is "TEXT". As a practical matter, a text string should probably -not be longer than 32767 bytes. The standard allows up to 231 - 1 -bytes. - -When used as a data property (see below), a text string chunk may -be 0 to 255 characters long. Such a string is readily converted to -a C string or a Pascal STRING[255]. The ckID of a property must be -the property name, not "TEXT". - -When used as a part of a chunk or data property, restricted C string -format is normally used. That means 0 to 255 characters followed by -a NUL byte (ASCII value 0). - -Data Properties - -Data properties specify attributes for following (non-property) chunks. -A data property essentially says "identifier = value", for example -"XY = (10, 200)", telling something about following chunks. Properties -may only appear inside data sections ("FORM" chunks, cf. Data Sections) -and property sections ("PROP" chunks, cf. Group PROP). - -The form of a data property is a special case of Chunk. The ckID is -a property name as well as a property type. The ckSize should be small -since data properties are intended to be accumulated in RAM when reading -a file. (256 bytes is a reasonable upper bound.) Syntactically: - -Property ::= Chunk - -When designing a data object, use properties to describe context information -like the size of an image, even if they don't vary in your program. -Other programs will need this information. - -Think of property settings as assignments to variables in a programming -language. Multiple assignments are redundant and local assignments -temporarily override global assignments. The order of assignments -doesn't matter as long as they precede the affected chunks. (Cf. LISTs, -CATs, and Shared Properties.) - -Each object type (FORM type) is a local name space for property IDs. -Think of a "CMAP" property in a "FORM ILBM" as the qualified ID "ILBM.CMAP". -Property IDs specified when an object type is designed (and therefore -known to all clients) are called "standard" while specialized ones -added later are "nonstandard". - -Links - -Issue: A standard mechanism for "links" or "cross references" is very -desirable for things like combining images and sounds into animations. -Perhaps we'll define "link" chunks within FORMs that refer to other -FORMs or to specific chunks within the same and other FORMs. This -needs further work. EA IFF 1985 has no standard link mechanism. - -For now, it may suffice to read a list of, say, musical instruments, -and then just refer to them within a musical score by index number. - -File References - -Issue: We may need a standard form for references to other files. -A "file ref" could name a directory and a file in the same type of -operating system as the ref's originator. Following the reference -would expect the file to be on some mounted volume. In a network environment, -a file ref could name a server, too. - -Issue: How can we express operating-system independent file refs? - -Issue: What about a means to reference a portion of another file? -Would this be a "file ref" plus a reference to a "link" within the -target file? - - - -4. Data Sections - -The first thing we need of a file is to check: Does it contain IFF -data and, if so, does it contain the kind of data we're looking for? -So we come to the notion of a "data section". - -A "data section" or IFF "FORM" is one self-contained "data object" -that might be stored in a file by itself. It is one high level data -object such as a picture or a sound effect. The IFF structure "FORM" -makes it self- identifying. It could be a composite object like a -musical score with nested musical instrument descriptions. - -Group FORM - -A data section is a chunk with ckID "FORM" and this arrangement: - -FORM ::= "FORM" #{ FormType (LocalChunk | FORM | LIST | CAT)* -} -FormType ::= ID -LocalChunk ::= Property | Chunk - -The ID "FORM" is a syntactic keyword like "struct" in C. Think of -a "struct ILBM" containing a field "CMAP". If you see "FORM" you'll -know to expect a FORM type ID (the structure name, "ILBM" in this -example) and a particular contents arrangement or "syntax" (local -chunks, FORMs, LISTs, and CATs). (LISTs and CATs are discussed in -part 5, below.) A "FORM ILBM", in particular, might contain a local -chunk "CMAP", an "ILBM.CMAP" (to use a qualified name). - -So the chunk ID "FORM" indicates a data section. It implies that the -chunk contains an ID and some number of nested chunks. In reading -a FORM, like any other chunk, programs must respect its ckSize as -a virtual end-of-file for reading its contents, even if they're truncated. - -The FormType (or FORM type) is a restricted ID that may not contain -lower case letters or punctuation characters. (Cf. Type IDs. Cf. Single -Purpose Files.) - -The type-specific information in a FORM is composed of its "local -chunks": data properties and other chunks. Each FORM type is a local -name space for local chunk IDs. So "CMAP" local chunks in other FORM -types may be unrelated to "ILBM.CMAP". More than that, each FORM type -defines semantic scope. If you know what a FORM ILBM is, you'll know -what an ILBM.CMAP is. - -Local chunks defined when the FORM type is designed (and therefore -known to all clients of this type) are called "standard" while specialized -ones added later are "nonstandard". - -Among the local chunks, property chunks give settings for various -details like text font while the other chunks supply the essential -information. This distinction is not clear cut. A property setting -cancelled by a later setting of the same property has effect only -on data chunks in between. E.g. in the sequence: - -prop1 = x (propN = value)* prop1 = y - -where the propNs are not prop1, the setting prop1 = x has no effect. - -The following universal chunk IDs are reserved inside any FORM: "LIST", -"FORM", "PROP", "CAT ", "JJJJ", "LIS1" through "LIS9", "FOR1" through -"FOR9", and "CAT1" through "CAT9". (Cf. Chunks. Cf. Group LIST. Cf. -Group PROP.) For clarity, these universal chunk names may not be FORM -type IDs, either. - -Part 5, below, talks about grouping FORMs into LISTs and CATs. They -let you group a bunch of FORMs but don't impose any particular meaning -or constraints on the grouping. Read on. - -Composite FORMs - -A FORM chunk inside a FORM is a full-fledged data section. This means -you can build a composite object like a multi-frame animation sequence -from available picture FORMs and sound effect FORMs. You can insert -additional chunks with information like frame rate and frame count. - -Using composite FORMs, you leverage on existing programs that create -and edit the component FORMs. Those editors may even look into your -composite object to copy out its type of component, although it'll -be the rare program that's fancy enough to do that. Such editors are -not allowed to replace their component objects within your composite -object. That's because the IFF standard lets you specify consistency -requirements for the composite FORM such as maintaining a count or -a directory of the components. Only programs that are written to uphold -the rules of your FORM type should create or modify such FORMs. - -Therefore, in designing a program that creates composite objects, -you are strongly requested to provide a facility for your users to -import and export the nested FORMs. Import and export could move the -data through a clipboard or a file. - -Here are several existing FORM types and rules for defining new ones. - -FTXT - -An FTXT data section contains text with character formatting information -like fonts and faces. It has no paragraph or document formatting information -like margins and page headers. FORM FTXT is well matched to the text -representation in Amiga's Intuition environment. See the supplemental -document "FTXT" IFF Formatted Text. - -ILBM - -"ILBM" is an InterLeaved BitMap image with color map; a machine-independent -format for raster images. FORM ILBM is the standard image file format -for the Commodore-Amiga computer and is useful in other environments, -too. See the supplemental document "ILBM" IFF Interleaved Bitmap. - -PICS - -The data chunk inside a "PICS" data section has ID "PICT" and holds -a QuickDraw picture. Issue: Allow more than one PICT in a PICS? See -Inside Macintosh chapter "QuickDraw" for details on PICTs and how -to create and display them on the Macintosh computer. - -The only standard property for PICS is "XY", an optional property -that indicates the position of the PICT relative to "the big picture". -The contents of an XY is a QuickDraw Point. - -Note: PICT may be limited to Macintosh use, in which case there'll -be another format for structured graphics in other environments. - -Other Macintosh Resource Types - -Some other Macintosh resource types could be adopted for use within -IFF files; perhaps MWRT, ICN, ICN#, and STR#. - -Issue: Consider the candidates and reserve some more IDs. - -Designing New Data Sections - -Supplemental documents will define additional object types. A supplement -needs to specify the object's purpose, its FORM type ID, the IDs and -formats of standard local chunks, and rules for generating and interpreting -the data. It's a good idea to supply typedefs and an example source -program that accesses the new object. See "ILBM" IFF Interleaved Bitmap -for a good example. - -Anyone can pick a new FORM type ID but should reserve it with Electronic -Arts at their earliest convenience. [Issue: EA contact person? Hand -this off to another organization?] While decentralized format definitions -and extensions are possible in IFF, our preference is to get design -consensus by committee, implement a program to read and write it, -perhaps tune the format, and then publish the format with example -code. Some organization should remain in charge of answering questions -and coordinating extensions to the format. - -If it becomes necessary to revise the design of some data section, -its FORM type ID will serve as a version number (Cf. Type IDs). E.g. -a revised "VDEO" data section could be called "VDE1". But try to get -by with compatible revisions within the existing FORM type. - -In a new FORM type, the rules for primitive data types and word-alignment -(Cf. Primitive Data Types) may be overriden for the contents of its -local chunks but not for the chunk structure itself if your documentation -spells out the deviations. If machine-specific type variants are needed, -e.g. to store vast numbers of integers in reverse bit order, then -outline the conversion algorithm and indicate the variant inside each -file, perhaps via different FORM types. Needless to say, variations -should be minimized. - -In designing a FORM type, encapsulate all the data that other programs -will need to interpret your files. E.g. a raster graphics image should -specify the image size even if your program always uses 320 x 200 -pixels x 3 bitplanes. Receiving programs are then empowered to append -or clip the image rectangle, to add or drop bitplanes, etc. This enables -a lot more compatibility. - -Separate the central data (like musical notes) from more specialized -information (like note beams) so simpler programs can extract the -central parts during read-in. Leave room for expansion so other programs -can squeeze in new kinds of information (like lyrics). And remember -to keep the property chunks manageably short let's say 2 256 bytes. - -When designing a data object, try to strike a good tradeoff between -a super-general format and a highly-specialized one. Fit the details -to at least one particular need, for example a raster image might -as well store pixels in the current machine's scan order. But add -the kind of generality that makes it usable with foreseeable hardware -and software. E.g. use a whole byte for each red, green, and blue -color value even if this year's computer has only 4-bit video DACs. -Think ahead and help other programs so long as the overhead is acceptable. -E.g. run compress a raster by scan line rather than as a unit so future -programs can swap images by scan line to and from secondary storage. - -Try to design a general purpose "least common multiple" format that -encompasses the needs of many programs without getting too complicated. -Let's coalesce our uses around a few such formats widely separated -in the vast design space. Two factors make this flexibility and simplicity -practical. First, file storage space is getting very plentiful, so -compaction is not a priority. Second, nearly any locally-performed -data conversion work during file reading and writing will be cheap -compared to the I/O time. - -It must be ok to copy a LIST or FORM or CAT intact, e.g. to incorporate -it into a composite FORM. So any kind of internal references within -a FORM must be relative references. They could be relative to the -start of the containing FORM, relative from the referencing chunk, -or a sequence number into a collection. - -With composite FORMs, you leverage on existing programs that create -and edit the components. If you write a program that creates composite -objects, please provide a facility for your users to import and export -the nested FORMs. The import and export functions may move data through -a separate file or a clipboard. - -Finally, don't forget to specify all implied rules in detail. - - - -5. LISTs, CATs, and Shared Properties - -Data often needs to be grouped together like a list of icons. Sometimes -a trick like arranging little images into a big raster works, but -generally they'll need to be structured as a first class group. The -objects "LIST" and "CAT" are IFF-universal mechanisms for this purpose. - -Property settings sometimes need to be shared over a list of similar -objects. E.g. a list of icons may share one color map. LIST provides -a means called "PROP" to do this. One purpose of a LIST is to define -the scope of a PROP. A "CAT", on the other hand, is simply a concatenation -of objects. - -Simpler programs may skip LISTs and PROPs altogether and just handle -FORMs and CATs. All "fully-conforming" IFF programs also know about -"CAT ", "LIST", and "PROP". Any program that reads a FORM inside a -LIST must process shared PROPs to correctly interpret that FORM. - -Group CAT - -A CAT is just an untyped group of data objects. - -Structurally, a CAT is a chunk with chunk ID "CAT " containing a "contents -type" ID followed by the nested objects. The ckSize of each contained -chunk is essentially a relative pointer to the next one. - -CAT ::= "CAT " #{ ContentsType (FORM | LIST | CAT)* } -ContentsType ::= ID -- a hint or an "abstract data type" ID - -In reading a CAT, like any other chunk, programs must respect it's -ckSize as a virtual end-of-file for reading the nested objects even -if they're malformed or truncated. - -The "contents type" following the CAT's ckSize indicates what kind -of FORMs are inside. So a CAT of ILBMs would store "ILBM" there. It's -just a hint. It may be used to store an "abstract data type". A CAT -could just have blank contents ID ("JJJJ") if it contains more than -one kind of FORM. - -CAT defines only the format of the group. The group's meaning is open -to interpretation. This is like a list in LISP: the structure of cells -is predefined but the meaning of the contents as, say, an association -list depends on use. If you need a group with an enforced meaning -(an "abstract data type" or Smalltalk "subclass"), some consistency -constraints, or additional data chunks, use a composite FORM instead -(Cf. Composite FORMs). - -Since a CAT just means a concatenation of objects, CATs are rarely -nested. Programs should really merge CATs rather than nest them. - -Group LIST - -A LIST defines a group very much like CAT but it also gives a scope -for PROPs (see below). And unlike CATs, LISTs should not be merged -without understanding their contents. - -Structurally, a LIST is a chunk with ckID "LIST" containing a "contents -type" ID, optional shared properties, and the nested contents (FORMs, -LISTs, and CATs), in that order. The ckSize of each contained chunk -is a relative pointer to the next one. A LIST is not an arbitrary -linked list the cells are simply concatenated. - -LIST ::= "LIST" #{ ContentsType PROP* (FORM | LIST | CAT)* } -ContentsType ::= ID - -Group PROP - -PROP chunks may appear in LISTs (not in FORMs or CATs). They supply -shared properties for the FORMs in that LIST. This ability to elevate -some property settings to shared status for a list of forms is useful -for both indirection and compaction. E.g. a list of images with the -same size and colors can share one "size" property and one "color -map" property. Individual FORMs can override the shared settings. - -The contents of a PROP is like a FORM with no data chunks: - -PROP ::= "PROP" #{ FormType Property* } - -It means, "Here are the shared properties for FORM type <." - -A LIST may have at most one PROP of a FORM type, and all the PROPs -must appear before any of the FORMs or nested LISTs and CATs. You -can have subsequences of FORMs sharing properties by making each subsequence -a LIST. - -Scoping: Think of property settings as variable bindings in nested -blocks of a programming language. Where in C you could write: - -TEXT_FONT text_font = Courier; /* program's global default */ - -File(); { - TEXT_FONT text_font = TimesRoman; /* shared setting */ - - { - TEXT_FONT text_font = Helvetica; /* local setting */ - Print("Hello "); /* uses font Helvetica */ - } - - { - Print("there."); /* uses font TimesRoman */ - } - } - -An IFF file could contain: - -LIST { - PROP TEXT { - FONT {TimesRoman} /* shared setting */ - } - - FORM TEXT { - FONT {Helvetica} /* local setting */ - CHRS {Hello } /* uses font Helvetica */ - } - - FORM TEXT { - CHRS {there.} /* uses font TimesRoman */ - } - } - -The shared property assignments selectively override the reader's -global defaults, but only for FORMs within the group. A FORM's own -property assignments selectively override the global and group-supplied -values. So when reading an IFF file, keep property settings on a stack. -They're designed to be small enough to hold in main memory. - -Shared properties are semantically equivalent to copying those properties -into each of the nested FORMs right after their FORM type IDs. - -Properties for LIST - -Optional "properties for LIST" store the origin of the list's contents -in a PROP chunk for the fake FORM type "LIST". They are the properties -originating program "OPGM", processor family "OCPU", computer type -"OCMP", computer serial number or network address "OSN ", and user -name "UNAM". In our imperfect world, these could be called upon to -distinguish between unintended variations of a data format or to work -around bugs in particular originating/receiving program pairs. Issue: -Specify the format of these properties. - -A creation date could also be stored in a property but let's ask that -file creating, editing, and transporting programs maintain the correct -date in the local file system. Programs that move files between machine -types are expected to copy across the creation dates. - - - -6. Standard File Structure - -File Structure Overview - -An IFF file is just a single chunk of type FORM, LIST, or CAT. Therefore -an IFF file can be recognized by its first 4 bytes: "FORM", "LIST", -or "CAT ". Any file contents after the chunk's end are to be ignored. - -Since an IFF file can be a group of objects, programs that read/write -single objects can communicate to an extent with programs that read/write -groups. You're encouraged to write programs that handle all the objects -in a LIST or CAT. A graphics editor, for example, could process a -list of pictures as a multiple page document, one page at a time. - -Programs should enforce IFF's syntactic rules when reading and writing -files. This ensures robust data transfer. The public domain IFF reader/writer -subroutine package does this for you. A utility program "IFFCheck" -is available that scans an IFF file and checks it for conformance -to IFF's syntactic rules. IFFCheck also prints an outline of the chunks -in the file, showing the ckID and ckSize of each. This is quite handy -when building IFF programs. Example programs are also available to -show details of reading and writing IFF files. - -A merge program "IFFJoin" will be available that logically appends -IFF files into a single CAT group. It "unwraps" each input file that -is a CAT so that the combined file isn't nested CATs. - -If we need to revise the IFF standard, the three anchoring IDs will -be used as "version numbers". That's why IDs "FOR1" through "FOR9", -"LIS1" through "LIS9", and "CAT1" through "CAT9" are reserved. - -IFF formats are designed for reasonable performance with floppy disks. -We achieve considerable simplicity in the formats and programs by -relying on the host file system rather than defining universal grouping -structures like directories for LIST contents. On huge storage systems, -IFF files could be leaf nodes in a file structure like a B-tree. Let's -hope the host file system implements that for us! - -Thre are two kinds of IFF files: single purpose files and scrap files. -They differ in the interpretation of multiple data objects and in -the file's external type. - -Single Purpose Files - -A single purpose IFF file is for normal "document" and "archive" storage. -This is in contrast with "scrap files" (see below) and temporary backing -storage (non-interchange files). - -The external file type (or filename extension, depending on the host -file system) indicates the file's contents. It's generally the FORM -type of the data contained, hence the restrictions on FORM type IDs. - -Programmers and users may pick an "intended use" type as the filename -extension to make it easy to filter for the relevant files in a filename -requestor. This is actually a "subclass" or "subtype" that conveniently -separates files of the same FORM type that have different uses. Programs -cannot demand conformity to its expected subtypes without overly restricting -data interchange since they cannot know about the subtypes to be used -by future programs that users will want to exchange data with. - -Issue: How to generate 3-letter MS-DOS extensions from 4-letter FORM -type IDs? - -Most single purpose files will be a single FORM (perhaps a composite -FORM like a musical score containing nested FORMs like musical instrument -descriptions). If it's a LIST or a CAT, programs should skip over -unrecognized objects to read the recognized ones or the first recognized -one. Then a program that can read a single purpose file can read something -out of a "scrap file", too. - -Scrap Files - -A "scrap file" is for maximum interconnectivity in getting data between -programs; the core of a clipboard function. Scrap files may have type -"IFF " or filename extension ".IFF". - -A scrap file is typically a CAT containing alternate representations -of the same basic information. Include as many alternatives as you -can readily generate. This redundancy improves interconnectivity in -situations where we can't make all programs read and write super-general -formats. [Inside Macintosh chapter "Scrap Manager".] E.g. a graphically- -annotated musical score might be supplemented by a stripped down 4-voice -melody and by a text (the lyrics). - -The originating program should write the alternate representations -in order of "preference": most preferred (most comprehensive) type -to least preferred (least comprehensive) type. A receiving program -should either use the first appearing type that it understands or -search for its own "preferred" type. - -A scrap file should have at most one alternative of any type. (A LIST -of same type objects is ok as one of the alternatives.) But don't -count on this when reading; ignore extra sections of a type. Then -a program that reads scrap files can read something out of single -purpose files. - -Rules for Reader Programs - -Here are some notes on building programs that read IFF files. If you -use the standard IFF reader module "IFFR.C", many of these rules and -details will be automatically handled. (See "Support Software" in -Appendix A.) We recommend that you start from the example program -"ShowILBM.C". You should also read up on recursive descent parsers. -[See, for example, Compiler Construction, An Advanced Course.] - -% The standard is very flexible so many programs can exchange -data. This implies a program has to scan the file and react to what's -actually there in whatever order it appears. An IFF reader program -is a parser. - -% For interchange to really work, programs must be willing to -do some conversion during read-in. If the data isn't exactly what -you expect, say, the raster is smaller than those created by your -program, then adjust it. Similarly, your program could crop a large -picture, add or drop bitplanes, and create/discard a mask plane. The -program should give up gracefully on data that it can't convert. - -% If it doesn't start with "FORM", "LIST", or "CAT ", it's not -an IFF-85 file. - -% For any chunk you encounter, you must recognize its type ID -to understand its contents. - -% For any FORM chunk you encounter, you must recognize its FORM -type ID to understand the contained "local chunks". Even if you don't -recognize the FORM type, you can still scan it for nested FORMs, LISTs, -and CATs of interest. - -% Don't forget to skip the pad byte after every odd-length chunk. - -% Chunk types LIST, FORM, PROP, and CAT are generic groups. They -always contain a subtype ID followed by chunks. - -% Readers ought to handle a CAT of FORMs in a file. You may treat -the FORMs like document pages to sequence through or just use the -first FORM. - -% Simpler IFF readers completely skip LISTs. "Fully IFF-conforming" -readers are those that handle LISTs, even if just to read the first -FORM from a file. If you do look into a LIST, you must process shared -properties (in PROP chunks) properly. The idea is to get the correct -data or none at all. - -% The nicest readers are willing to look into unrecognized FORMs -for nested FORM types that they do recognize. For example, a musical -score may contain nested instrument descriptions and an animation -file may contain still pictures. - -Note to programmers: Processing PROP chunks is not simple! You'll -need some background in interpreters with stack frames. If this is -foreign to you, build programs that read/write only one FORM per file. -For the more intrepid programmers, the next paragraph summarizes how -to process LISTs and PROPs. See the general IFF reader module "IFFR.C" -and the example program "ShowILBM.C" for details. - -Allocate a stack frame for every LIST and FORM you encounter and initialize -it by copying the stack frame of the parent LIST or FORM. At the top -level, you'll need a stack frame initialized to your program's global -defaults. While reading each LIST or FORM, store all encountered properties -into the current stack frame. In the example ShowILBM, each stack -frame has a place for a bitmap header property ILBM.BMHD and a color -map property ILBM.CMAP. When you finally get to the ILBM's BODY chunk, -use the property settings accumulated in the current stack frame. - -An alternate implementation would just remember PROPs encountered, -forgetting each on reaching the end of its scope (the end of the containing -LIST). When a FORM XXXX is encountered, scan the chunks in all remembered -PROPs XXXX, in order, as if they appeared before the chunks actually -in the FORM XXXX. This gets trickier if you read FORMs inside of FORMs. - -Rules for Writer Programs - -Here are some notes on building programs that write IFF files, which -is much easier than reading them. If you use the standard IFF writer -module "IFFW.C" (see "Support Software" in Appendix A), many of these -rules and details will automatically be enforced. See the example -program "Raw2ILBM.C". - -% An IFF file is a single FORM, LIST, or CAT chunk. - -% Any IFF-85 file must start with the 4 characters "FORM", "LIST", -or "CAT ", followed by a LONG ckSize. There should be no data after -the chunk end. - -% Chunk types LIST, FORM, PROP, and CAT are generic. They always -contain a subtype ID followed by chunks. These three IDs are universally -reserved, as are "LIS1" through "LIS9", "FOR1" through "FOR9", "CAT1" -through "CAT9", and " ". - -% Don't forget to write a 0 pad byte after each odd-length chunk. - -% Four techniques for writing an IFF group: (1) build the data -in a file mapped into virtual memory, (2) build the data in memory -blocks and use block I/O, (3) stream write the data piecemeal and -(don't forget!) random access back to set the group length count, -and (4) make a preliminary pass to compute the length count then stream -write the data. - -% Do not try to edit a file that you don't know how to create. -Programs may look into a file and copy out nested FORMs of types that -they recognize, but don't edit and replace the nested FORMs and don't -add or remove them. That could make the containing structure inconsistent. -You may write a new file containing items you copied (or copied and -modified) from another IFF file, but don't copy structural parts you -don't understand. - -% You must adhere to the syntax descriptions in Appendex A. E.g. -PROPs may only appear inside LISTs. - - - - -Appendix A. Reference - -Type Definitions - -The following C typedefs describe standard IFF structures. Declarations -to use in practice will vary with the CPU and compiler. For example, -68000 Lattice C produces efficient comparison code if we define ID -as a "LONG". A macro "MakeID" builds these IDs at compile time. - -/* Standard IFF types, expressed in 68000 Lattice C. */ - -typedef unsigned char UBYTE; /* 8 bits unsigned */ -typedef short WORD; /* 16 bits signed */ -typedef unsigned short UWORD; /* 16 bits unsigned */ -typedef long LONG; /* 32 bits signed */ - -typedef char ID[4]; /* 4 chars in ' ' through '~' */ - -typedef struct { - ID ckID; - LONG ckSize; /* sizeof(ckData) */ - UBYTE ckData[/* ckSize */]; - } Chunk; - -/* ID typedef and builder for 68000 Lattice C. */ -typedef LONG ID; /* 4 chars in ' ' through '~' */ -#define MakeID(a,b,c,d) ( (a)<<<<24 | (b)<<<<16 | (c)<<<<8 | (d) ) - -/* Globally reserved IDs. */ -#define ID_FORM MakeID('F','O','R','M') -#define ID_LIST MakeID('L','I','S','T') -#define ID_PROP MakeID('P','R','O','P') -#define ID_CAT MakeID('C','A','T',' ') -#define ID_FILLER MakeID(' ',' ',' ',' ') - -Syntax Definitions - -Here's a collection of the syntax definitions in this document. - -Chunk ::= ID #{ UBYTE* } [0] - -Property ::= Chunk - -FORM ::= "FORM" #{ FormType (LocalChunk | FORM | LIST | CAT)* -} -FormType ::= ID -LocalChunk ::= Property | Chunk - -CAT ::= "CAT " #{ ContentsType (FORM | LIST | CAT)* } -ContentsType ::= ID -- a hint or an "abstract data type" ID - -LIST ::= "LIST" #{ ContentsType PROP* (FORM | LIST | CAT)* } -PROP ::= "PROP" #{ FormType Property* } - -In this extended regular expression notation, the token "#" represents -a ckSize LONG count of the following {braced} data bytes. Literal -items are shown in "quotes", [square bracketed items] are optional, -and "*" means 0 or more instances. A sometimes-needed pad byte is -shown as "[0]". - -Defined Chunk IDs - -This is a table of currently defined chunk IDs. We may also borrow -some Macintosh IDs and data formats. - -Group chunk IDs - FORM, LIST, PROP, CAT. -Future revision group chunk IDs - FOR1 I FOR9, LIS1 I LIS9, CAT1 I CAT9. -FORM type IDs - (The above group chunk IDs may not be used for FORM type IDs.) - (Lower case letters and punctuation marks are forbidden in FORM -type IDs.) - 8SVX 8-bit sampled sound voice, ANBM animated bitmap, FNTR raster -font, FNTV vector font, FTXT formatted text, GSCR general-use musical -score, ILBM interleaved raster bitmap image, PDEF Deluxe Print page -definition, PICS Macintosh picture, PLBM (obsolete), USCR Uhuru Sound -Software musical score, UVOX Uhuru Sound Software Macintosh voice, -SMUS simple musical score, VDEO Deluxe Video Construction Set video. -Data chunk IDs - "JJJJ", TEXT, PICT. -PROP LIST property IDs - OPGM, OCPU, OCMP, OSN, UNAM. - - - -Support Software - -These public domain C source programs are available for use in building -IFF-compatible programs: - -IFF.H, IFFR.C, IFFW.C - - IFF reader and writer package. - These modules handle many of the details of reliably - reading and writing IFF files. - -IFFCheck.C This handy utility program scans an IFF file, checks - that the contents are well formed, and prints an outline - of the chunks. - -PACKER.H, Packer.C, UnPacker.C - - Run encoder and decoder used for ILBM files. - -ILBM.H, ILBMR.C, ILBMW.C - - Reader and writer support routines for raster image - FORM ILBM. ILBMR calls IFFR and UnPacker. ILBMW calls - IFFW and Packer. - -ShowILBM.C - Example caller of IFFR and ILBMR modules. This - Commodore-Amiga program reads and displays a FORM ILBM. -Raw2ILBM.C - Example ILBM writer program. As a demonstration, it - reads a raw raster image file and writes the image - as a FORM ILBM file. -ILBM2Raw.C - Example ILBM reader program. Reads a FORM ILBM file - and writes it into a raw raster image. - -REMALLOC.H, Remalloc.c - - Memory allocation routines used in these examples. - -INTUALL.H generic "include almost everything" include-file - with the sequence of includes correctly specified. - -READPICT.H, ReadPict.c - - given an ILBM file, read it into a bitmap and - a color map - -PUTPICT.H, PutPict.c - - given a bitmap and a color map, save it as - an ILBM file. - -GIO.H, Gio.c generic I/O speedup package. Attempts to speed - disk I/O by buffering writes and reads. - -giocall.c sample call to gio. - -ilbmdump.c reads in ILBM file, prints out ascii representation - for including in C files. - -bmprintc.c prints out a C-language representation of data for - a bitmap. - - - -Example Diagrams - -Here's a box diagram for an example IFF file, a raster image FORM -ILBM. This FORM contains a bitmap header property chunk BMHD, a color -map property chunk CMAP, and a raster data chunk BODY. This particular -raster is 320 x 200 pixels x 3 bit planes uncompressed. The "0" after -the CMAP chunk represents a zero pad byte; included since the CMAP -chunk has an odd length. The text to the right of the diagram shows -the outline that would be printed by the IFFCheck utility program -for this particular file. - - +-----------------------------------+ - |'FORM' 24070 | FORM 24070 IBLM - +-----------------------------------+ - |'ILBM' | - +-----------------------------------+ - | +-------------------------------+ | - | | 'BMHD' 20 | | .BMHD 20 - | | 320, 200, 0, 0, 3, 0, 0, ... | | - | + ------------------------------+ | - | | 'CMAP' 21 | | .CMAP 21 - | | 0, 0, 0; 32, 0, 0; 64,0,0; .. | | - | +-------------------------------+ | - | 0 | - +-----------------------------------+ - |'BODY' 24000 | .BODY 24000 - |0, 0, 0, ... | - +-----------------------------------+ - -This second diagram shows a LIST of two FORMs ILBM sharing a common -BMHD property and a common CMAP property. Again, the text on the right -is an outline a la IFFCheck. - - - +-----------------------------------------+ - |'LIST' 48114 | LIST 48114 AAAA - +-----------------------------------------+ - |'AAAA' | .PROP 62 ILBM - | +-----------------------------------+ | - | |'PROP' 62 | | - | +-----------------------------------+ | - | |'ILBM' | | - | +-----------------------------------+ | - | | +-------------------------------+ | | - | | | 'BMHD' 20 | | | ..BMHD 20 - | | | 320, 200, 0, 0, 3, 0, 0, ... | | | - | | | ------------------------------+ | | - | | | 'CMAP' 21 | | | ..CMAP 21 - | | | 0, 0, 0; 32, 0, 0; 64,0,0; .. | | | - | | +-------------------------------+ | | - | | 0 | | - | +-----------------------------------+ | - | +-----------------------------------+ | - | |'FORM' 24012 | | .FORM 24012 ILBM - | +-----------------------------------+ | - | |'ILBM' | | - | +-----------------------------------+ | - | | +-----------------------------+ | | - | | |'BODY' 24000 | | | ..BODY 24000 - | | |0, 0, 0, ... | | | - | | +-----------------------------+ | | - | +-----------------------------------+ | - | +-----------------------------------+ | - | |'FORM' 24012 | | .FORM 24012 ILBM - | +-----------------------------------+ | - | |'ILBM' | | - | +-----------------------------------+ | - | | +-----------------------------+ | | - | | |'BODY' 24000 | | | ..BODY 24000 - | | |0, 0, 0, ... | | | - | | +-----------------------------+ | | - | +-----------------------------------+ | - +-----------------------------------------+ - - - -Appendix B. Standards Committee - -The following people contributed to the design of this IFF standard: - -Bob "Kodiak" Burns, Commodore-Amiga -R. J. Mical, Commodore-Amiga -Jerry Morrison, Electronic Arts -Greg Riker, Electronic Arts -Steve Shaw, Electronic Arts -Barry Walsh, Commodore-Amiga + +"EA IFF 85" Standard for Interchange Format Files + +Document Date: January 14, 1985 +From: Jerry Morrison, Electronic Arts +Status of Standard: Released and in use + +1. Introduction + +Standards are Good for Software Developers + +As home computer hardware evolves to better and better media machines, +the demand increases for higher quality, more detailed data. Data +development gets more expensive, requires more expertise and better +tools, and has to be shared across projects. Think about several ports +of a product on one CD-ROM with 500M Bytes of common data! + +Development tools need standard interchange file formats. Imagine +scanning in images of "player" shapes, moving them to a paint program +for editing, then incorporating them into a game. Or writing a theme +song with a Macintosh score editor and incorporating it into an Amiga +game. The data must at times be transformed, clipped, filled out, +and moved across machine kinds. Media projects will depend on data +transfer from graphic, music, sound effect, animation, and script +tools. + +Standards are Good for Software Users + +Customers should be able to move their own data between independently +developed software products. And they should be able to buy data libraries +usable across many such products. The types of data objects to exchange +are open-ended and include plain and formatted text, raster and structured +graphics, fonts, music, sound effects, musical instrument descriptions, +and animation. + +The problem with expedient file formats typically memory dumps is +that they're too provincial. By designing data for one particular +use (e.g. a screen snapshot), they preclude future expansion (would +you like a full page picture? a multi-page document?). In neglecting +the possibility that other programs might read their data, they fail +to save contextual information (how many bit planes? what resolution?). +Ignoring that other programs might create such files, they're intolerant +of extra data (texture palette for a picture editor), missing data +(no color map), or minor variations (smaller image). In practice, +a filed representation should rarely mirror an in-memory representation. +The former should be designed for longevity; the latter to optimize +the manipulations of a particular program. The same filed data will +be read into different memory formats by different programs. + +The IFF philosophy: "A little behind-the-scenes conversion when programs +read and write files is far better than NxM explicit conversion utilities +for highly specialized formats." + +So we need some standardization for data interchange among development +tools and products. The more developers that adopt a standard, the +better for all of us and our customers. + +Here is "EA IFF 1985" + +Here is our offering: Electronic Arts' IFF standard for Interchange +File Format. The full name is "EA IFF 1985". Alternatives and justifications +are included for certain choices. Public domain subroutine packages +and utility programs are available to make it easy to write and use +IFF-compatible programs. + +Part 1 introduces the standard. Part 2 presents its requirements and +background. Parts 3, 4, and 5 define the primitive data types, FORMs, +and LISTs, respectively, and how to define new high level types. Part +6 specifies the top level file structure. Appendix A is included for +quick reference and Appendix B names the committee responsible for +this standard. + +References + +American National Standard Additional Control Codes for Use with ASCII, +ANSI standard 3.64-1979 for an 8-bit character set. See also ISO standard +2022 and ISO/DIS standard 6429.2. + +Amiga[tm] is a trademark of Commodore-Amiga, Inc. + +C, A Reference Manual, Samuel P. Harbison and Guy L. Steele Jr., Tartan +Laboratories. Prentice-Hall, Englewood Cliffs, NJ, 1984. + +Compiler Construction, An Advanced Course, edited by F. L. Bauer and +J. Eickel (Springer-Verlag, 1976). This book is one of many sources +for information on recursive descent parsing. + +DIF Technical Specification (c)1981 by Software Arts, Inc. DIF[tm] is +the format for spreadsheet data interchange developed by Software +Arts, Inc. +DIF[tm] is a trademark of Software Arts, Inc. + +Electronic Arts[tm] is a trademark of Electronic Arts. + +"FTXT" IFF Formatted Text, from Electronic Arts. IFF supplement document +for a text format. + +Inside Macintosh (c) 1982, 1983, 1984, 1985 Apple Computer, Inc., a +programmer's reference manual. +Apple(R) is a trademark of Apple Computer, Inc. +Macintosh[tm] is a trademark licensed to Apple Computer, Inc. + +"ILBM" IFF Interleaved Bitmap, from Electronic Arts. IFF supplement +document for a raster image format. + +M68000 16/32-Bit Microprocessor Programmer's Reference Manual(c) 1984, +1982, 1980, 1979 by Motorola, Inc. + +PostScript Language Manual (c) 1984 Adobe Systems Incorporated. +PostScript[tm] is a trademark of Adobe Systems, Inc. +Times and Helvetica(R) are trademarks of Allied Corporation. + +InterScript: A Proposal for a Standard for the Interchange of Editable +Documents (c)1984 Xerox Corporation. +Introduction to InterScript (c) 1985 Xerox Corporation. + + + +2. Background for Designers + +Part 2 is about the background, requirements, and goals for the standard. +It's geared for people who want to design new types of IFF objects. +People just interested in using the standard may wish to skip this +part. + +What Do We Need? + +A standard should be long on prescription and short on overhead. It +should give lots of rules for designing programs and data files for +synergy. But neither the programs nor the files should cost too much +more than the expedient variety. While we're looking to a future with +CD-ROMs and perpendicular recording, the standard must work well on +floppy disks. + +For program portability, simplicity, and efficiency, formats should +be designed with more than one implementation style in mind. (In practice, +pure stream I/O is adequate although random access makes it easier +to write files.) It ought to be possible to read one of many objects +in a file without scanning all the preceding data. Some programs need +to read and play out their data in real time, so we need good compromises +between generality and efficiency. + +As much as we need standards, they can't hold up product schedules. +So we also need a kind of decentralized extensibility where any software +developer can define and refine new object types without some "standards +authority" in the loop. Developers must be able to extend existing +formats in a forward- and backward-compatible way. A central repository +for design information and example programs can help us take full +advantage of the standard. + +For convenience, data formats should heed the restrictions of various +processors and environments. E.g. word-alignment greatly helps 68000 +access at insignificant cost to 8088 programs. + +Other goals include the ability to share common elements over a list +of objects and the ability to construct composite objects containing +other data objects with structural information like directories. + +And finally, "Simple things should be simple and complex things should +be possible." Alan Kay. + +Think Ahead + +Let's think ahead and build programs that read and write files for +each other and for programs yet to be designed. Build data formats +to last for future computers so long as the overhead is acceptable. +This extends the usefulness and life of today's programs and data. + +To maximize interconnectivity, the standard file structure and the +specific object formats must all be general and extensible. Think +ahead when designing an object. It should serve many purposes and +allow many programs to store and read back all the information they +need; even squeeze in custom data. Then a programmer can store the +available data and is encouraged to include fixed contextual details. +Recipient programs can read the needed parts, skip unrecognized stuff, +default missing data, and use the stored context to help transform +the data as needed. + +Scope + +IFF addresses these needs by defining a standard file structure, some +initial data object types, ways to define new types, and rules for +accessing these files. We can accomplish a great deal by writing programs +according to this standard, but don't expect direct compatibility +with existing software. We'll need conversion programs to bridge the +gap from the old world. + +IFF is geared for computers that readily process information in 8-bit +bytes. It assumes a "physical layer" of data storage and transmission +that reliably maintains "files" as strings of 8-bit bytes. The standard +treats a "file" as a container of data bytes and is independent of +how to find a file and whether it has a byte count. + +This standard does not by itself implement a clipboard for cutting +and pasting data between programs. A clipboard needs software to mediate +access, to maintain a "contents version number" so programs can detect +updates, and to manage the data in "virtual memory". + +Data Abstraction + +The basic problem is how to represent information in a way that's +program-independent, compiler- independent, machine-independent, and +device-independent. + +The computer science approach is "data abstraction", also known as +"objects", "actors", and "abstract data types". A data abstraction +has a "concrete representation" (its storage format), an "abstract +representation" (its capabilities and uses), and access procedures +that isolate all the calling software from the concrete representation. +Only the access procedures touch the data storage. Hiding mutable +details behind an interface is called "information hiding". What data +abstraction does is abstract from details of implementing the object, +namely the selected storage representation and algorithms for manipulating +it. + +The power of this approach is modularity. By adjusting the access +procedures we can extend and restructure the data without impacting +the interface or its callers. Conversely, we can extend and restructure +the interface and callers without making existing data obsolete. It's +great for interchange! + +But we seem to need the opposite: fixed file formats for all programs +to access. Actually, we could file data abstractions ("filed objects") +by storing the data and access procedures together. We'd have to encode +the access procedures in a standard machine-independent programming +language la PostScript. Even still, the interface can't evolve freely +since we can't update all copies of the access procedures. So we'll +have to design our abstract representations for limited evolution +and occasional revolution (conversion). + +In any case, today's microcomputers can't practically store data abstractions. +They can do the next best thing: store arbitrary types of data in +"data chunks", each with a type identifier and a length count. The +type identifier is a reference by name to the access procedures (any +local implementation). The length count enables storage-level object +operations like "copy" and "skip to next" independent of object type. + +Chunk writing is straightforward. Chunk reading requires a trivial +parser to scan each chunk and dispatch to the proper access/conversion +procedure. Reading chunks nested inside other chunks requires recursion, +but no lookahead or backup. + +That's the main idea of IFF. There are, of course, a few other detailsI + +Previous Work + +Where our needs are similar, we borrow from existing standards. + +Our basic need to move data between independently developed programs +is similar to that addressed by the Apple Macintosh desk scrap or +"clipboard" [Inside Macintosh chapter "Scrap Manager"]. The Scrap +Manager works closely with the Resource Manager, a handy filer and +swapper for data objects (text strings, dialog window templates, pictures, +fontsI) including types yet to be designed [Inside Macintosh chapter +"Resource Manager"]. The Resource Manager is a kin to Smalltalk's +object swapper. + +We will probably write a Macintosh desk accessory that converts IFF +files to and from the Macintosh clipboard for quick and easy interchange +with programs like MacPaint and Resource Mover. + +Macintosh uses a simple and elegant scheme of 4-character "identifiers" +to identify resource types, clipboard format types, file types, and +file creator programs. Alternatives are unique ID numbers assigned +by a central authority or by hierarchical authorities, unique ID numbers +generated by algorithm, other fixed length character strings, and +variable length strings. Character string identifiers double as readable +signposts in data files and programs. The choice of 4 characters is +a good tradeoff between storage space, fetch/compare/store time, and +name space size. We'll honor Apple's designers by adopting this scheme. + +"PICT" is a good example of a standard structured graphics format +(including raster images) and its many uses [Inside Macintosh chapter +"QuickDraw"]. Macintosh provides QuickDraw routines in ROM to create, +manipulate, and display PICTs. Any application can create a PICT by +simply asking QuickDraw to record a sequence of drawing commands. +Since it's just as easy to ask QuickDraw to render a PICT to a screen +or a printer, it's very effective to pass them between programs, say +from an illustrator to a word processor. An important feature is the +ability to store "comments" in a PICT which QuickDraw will ignore. +Actually, it passes them to your optional custom "comment handler". + +PostScript, Adobe's print file standard, is a more general way to +represent any print image (which is a specification for putting marks +on paper) [PostScript Language Manual]. In fact, PostScript is a full-fledged +programming language. To interpret a PostScript program is to render +a document on a raster output device. The language is defined in layers: +a lexical layer of identifiers, constants, and operators; a layer +of reverse polish semantics including scope rules and a way to define +new subroutines; and a printing-specific layer of built-in identifiers +and operators for rendering graphic images. It is clearly a powerful +(Turing equivalent) image definition language. PICT and a subset of +PostScript are candidates for structured graphics standards. + +A PostScript document can be printed on any raster output device (including +a display) but cannot generally be edited. That's because the original +flexibility and constraints have been discarded. Besides, a PostScript +program may use arbitrary computation to supply parameters like placement +and size to each operator. A QuickDraw PICT, in comparison, is a more +restricted format of graphic primitives parameterized by constants. +So a PICT can be edited at the level of the primitives, e.g. move +or thicken a line. It cannot be edited at the higher level of, say, +the bar chart data which generated the picture. + +PostScript has another limitation: Not all kinds of data amount to +marks on paper. A musical instrument description is one example. PostScript +is just not geared for such uses. + +"DIF" is another example of data being stored in a general format +usable by future programs [DIF Technical Specification]. DIF is a +format for spreadsheet data interchange. DIF and PostScript are both +expressed in plain ASCII text files. This is very handy for printing, +debugging, experimenting, and transmitting across modems. It can have +substantial cost in compaction and read/write work, depending on use. +We won't store IFF files this way but we could define an ASCII alternate +representation with a converter program. + +InterScript is Xerox' standard for interchange of editable documents +[Introduction to InterScript]. It approaches a harder problem: How +to represent editable word processor documents that may contain formatted +text, pictures, cross-references like figure numbers, and even highly +specialized objects like mathematical equations? InterScript aims +to define one standard representation for each kind of information. +Each InterScript-compatible editor is supposed to preserve the objects +it doesn't understand and even maintain nested cross-references. So +a simple word processor would let you edit the text of a fancy document +without discarding the equations or disrupting the equation numbers. + +Our task is similarly to store high level information and preserve +as much content as practical while moving it between programs. But +we need to span a larger universe of data types and cannot expect +to centrally define them all. Fortunately, we don't need to make programs +preserve information that they don't understand. And for better or +worse, we don't have to tackle general-purpose cross-references yet. + + + +3. Primitive Data Types + +Atomic components such as integers and characters that are interpretable +directly by the CPU are specified in one format for all processors. +We chose a format that's most convenient for the Motorola MC68000 +processor [M68000 16/32-Bit Microprocessor Programmer's Reference +Manual]. + +N.B.: Part 3 dictates the format for "primitive" data types where and +only where used in the overall file structure and standard kinds of +chunks (Cf. Chunks). The number of such occurrences will be small +enough that the costs of conversion, storage, and management of processor- +specific files would far exceed the costs of conversion during I/O by "foreign" +programs. A particular data chunk may be specified with a different +format for its internal primitive types or with processor- or environment- +speci fic variants if necessary to optimize local usage. Since that hurts +data interchange, it's not recommended. (Cf. Designing New Data Sections, +in Part 4.) + +Alignment + +All data objects larger than a byte are aligned on even byte addresses +relative to the start of the file. This may require padding. Pad bytes +are to be written as zeros, but don't count on that when reading. + +This means that every odd-length "chunk" (see below) must be padded +so that the next one will fall on an even boundary. Also, designers +of structures to be stored in chunks should include pad fields where +needed to align every field larger than a byte. Zeros should be stored +in all the pad bytes. + +Justification: Even-alignment causes a little extra work for files +that are used only on certain processors but allows 68000 programs +to construct and scan the data in memory and do block I/O. You just +add an occasional pad field to data structures that you're going to +block read/write or else stream read/write an extra byte. And the +same source code works on all processors. Unspecified alignment, on +the other hand, would force 68000 programs to (dis)assemble word and +long-word data one byte at a time. Pretty cumbersome in a high level +language. And if you don't conditionally compile that out for other +processors, you won't gain anything. + +Numbers + +Numeric types supported are two's complement binary integers in the +format used by the MC68000 processor high byte first, high word first the +reverse of 8088 and 6502 format. They could potentially include signed +and unsigned 8, 16, and 32 bit integers but the standard only uses +the following: + +UBYTE 8 bits unsigned +WORD 16 bits signed +UWORD 16 bits unsigned +LONG 32 bits signed + +The actual type definitions depend on the CPU and the compiler. In +this document, we'll express data type definitions in the C programming +language. [See C, A Reference Manual.] In 68000 Lattice C: + +typedef unsigned char UBYTE; /* 8 bits unsigned */ +typedef short WORD; /* 16 bits signed */ +typedef unsigned short UWORD; /* 16 bits unsigned */ +typedef long LONG; /* 32 bits signed */ + +Characters + +The following character set is assumed wherever characters are used, +e.g. in text strings, IDs, and TEXT chunks (see below). + +Characters are encoded in 8-bit ASCII. Characters in the range NUL +(hex 0) through DEL (hex 7F) are well defined by the 7-bit ASCII standard. +IFF uses the graphic group RJS (SP, hex 20) through R~S (hex 7E). + +Most of the control character group hex 01 through hex 1F have no +standard meaning in IFF. The control character LF (hex 0A) is defined +as a "newline" character. It denotes an intentional line break, that +is, a paragraph or line terminator. (There is no way to store an automatic +line break. That is strictly a function of the margins in the environment +the text is placed.) The control character ESC (hex 1B) is a reserved +escape character under the rules of ANSI standard 3.64-1979 American +National Standard Additional Control Codes for Use with ASCII, ISO +standard 2022, and ISO/DIS standard 6429.2. + +Characters in the range hex 7F through hex FF are not globally defined +in IFF. They are best left reserved for future standardization. But +note that the FORM type FTXT (formatted text) defines the meaning +of these characters within FTXT forms. In particular, character values +hex 7F through hex 9F are control codes while characters hex A0 through +hex FF are extended graphic characters like , as per the ISO and +ANSI standards cited above. [See the supplementary document "FTXT" +IFF Formatted Text.] + +Dates + +A "creation date" is defined as the date and time a stream of data +bytes was created. (Some systems call this a "last modified date".) +Editing some data changes its creation date. Moving the data between +volumes or machines does not. + +The IFF standard date format will be one of those used in MS-DOS, +Macintosh, or Amiga DOS (probably a 32-bit unsigned number of seconds +since a reference point). Issue: Investigate these three. + +Type IDs + +A "type ID", "property name", "FORM type", or any other IFF identifier +is a 32-bit value: the concatenation of four ASCII characters in the +range R S (SP, hex 20) through R~S (hex 7E). Spaces (hex 20) should +not precede printing characters; trailing spaces are ok. Control characters +are forbidden. + +typedef CHAR ID[4]; + +IDs are compared using a simple 32-bit case-dependent equality test. + +Data section type IDs (aka FORM types) are restriced IDs. (Cf. Data +Sections.) Since they may be stored in filename extensions (Cf. Single +Purpose Files) lower case letters and punctuation marks are forbidden. +Trailing spaces are ok. + +Carefully choose those four characters when you pick a new ID. Make +them mnemonic so programmers can look at an interchange format file +and figure out what kind of data it contains. The name space makes +it possible for developers scattered around the globe to generate +ID values with minimal collisions so long as they choose specific +names like "MUS4" instead of general ones like "TYPE" and "FILE". +EA will "register" new FORM type IDs and format descriptions as they're +devised, but collisions will be improbable so there will be no pressure +on this "clearinghouse" process. Appendix A has a list of currently +defined IDs. + +Sometimes it's necessary to make data format changes that aren't backward +compatible. Since IDs are used to denote data formats in IFF, new +IDs are chosen to denote revised formats. Since programs won't read +chunks whose IDs they don't recognize (see Chunks, below), the new +IDs keep old programs from stumbling over new data. The conventional +way to chose a "revision" ID is to increment the last character if +it's a digit or else change the last character to a digit. E.g. first +and second revisions of the ID "XY" would be "XY1" and "XY2". Revisions +of "CMAP" would be "CMA1" and "CMA2". + +Chunks + +Chunks are the building blocks in the IFF structure. The form expressed +as a C typedef is: + +typedef struct { + ID ckID; + LONG ckSize; /* sizeof(ckData) */ + UBYTE ckData[/* ckSize */]; + } Chunk; + +We can diagram an example chunk a "CMAP" chunk containing 12 data +bytes like this: + ---------------- + ckID: | 'CMAP' | + ckSize: | 12 | + ckData: | 0, 0, 0, 32 | -------- + | 0, 0, 64, 0 | 12 bytes + | 0, 0, 64, 0 | --------- + ---------------- + +The fixed header part means "Here's a type ckID chunk with ckSize +bytes of data." + +The ckID identifies the format and purpose of the chunk. As a rule, +a program must recognize ckID to interpret ckData. It should skip +over all unrecognized chunks. The ckID also serves as a format version +number as long as we pick new IDs to identify new formats of ckData +(see above). + +The following ckIDs are universally reserved to identify chunks with +particular IFF meanings: "LIST", "FORM", "PROP", "CAT ", and " +". The special ID " " (4 spaces) is a ckID for "filler" chunks, +that is, chunks that fill space but have no meaningful contents. The +IDs "LIS1" through "LIS9", "FOR1" through "FOR9", and "CAT1" through +"CAT9" are reserved for future "version number" variations. All IFF-compatible +software must account for these 23 chunk IDs. Appendix A has a list +of predefined IDs. + +The ckSize is a logical block size how many data bytes are in ckData. +If ckData is an odd number of bytes long, a 0 pad byte follows which +is not included in ckSize. (Cf. Alignment.) A chunk's total physical +size is ckSize rounded up to an even number plus the size of the header. +So the smallest chunk is 8 bytes long with ckSize = 0. For the sake +of following chunks, programs must respect every chunk's ckSize as +a virtual end-of-file for reading its ckData even if that data is +malformed, e.g. if nested contents are truncated. + +We can describe the syntax of a chunk as a regular expression with +"#" representing the ckSize, i.e. the length of the following {braced} +bytes. The "[0]" represents a sometimes needed pad byte. (The regular +expressions in this document are collected in Appendix A along with +an explanation of notation.) + +Chunk ::= ID #{ UBYTE* } [0] + +One chunk output technique is to stream write a chunk header, stream +write the chunk contents, then random access back to the header to +fill in the size. Another technique is to make a preliminary pass +over the data to compute the size, then write it out all at once. + +Strings, String Chunks, and String Properties + +In a string of ASCII text, LF denotes a forced line break (paragraph +or line terminator). Other control characters are not used. (Cf. Characters.) + +The ckID for a chunk that contains a string of plain, unformatted +text is "TEXT". As a practical matter, a text string should probably +not be longer than 32767 bytes. The standard allows up to 231 - 1 +bytes. + +When used as a data property (see below), a text string chunk may +be 0 to 255 characters long. Such a string is readily converted to +a C string or a Pascal STRING[255]. The ckID of a property must be +the property name, not "TEXT". + +When used as a part of a chunk or data property, restricted C string +format is normally used. That means 0 to 255 characters followed by +a NUL byte (ASCII value 0). + +Data Properties + +Data properties specify attributes for following (non-property) chunks. +A data property essentially says "identifier = value", for example +"XY = (10, 200)", telling something about following chunks. Properties +may only appear inside data sections ("FORM" chunks, cf. Data Sections) +and property sections ("PROP" chunks, cf. Group PROP). + +The form of a data property is a special case of Chunk. The ckID is +a property name as well as a property type. The ckSize should be small +since data properties are intended to be accumulated in RAM when reading +a file. (256 bytes is a reasonable upper bound.) Syntactically: + +Property ::= Chunk + +When designing a data object, use properties to describe context information +like the size of an image, even if they don't vary in your program. +Other programs will need this information. + +Think of property settings as assignments to variables in a programming +language. Multiple assignments are redundant and local assignments +temporarily override global assignments. The order of assignments +doesn't matter as long as they precede the affected chunks. (Cf. LISTs, +CATs, and Shared Properties.) + +Each object type (FORM type) is a local name space for property IDs. +Think of a "CMAP" property in a "FORM ILBM" as the qualified ID "ILBM.CMAP". +Property IDs specified when an object type is designed (and therefore +known to all clients) are called "standard" while specialized ones +added later are "nonstandard". + +Links + +Issue: A standard mechanism for "links" or "cross references" is very +desirable for things like combining images and sounds into animations. +Perhaps we'll define "link" chunks within FORMs that refer to other +FORMs or to specific chunks within the same and other FORMs. This +needs further work. EA IFF 1985 has no standard link mechanism. + +For now, it may suffice to read a list of, say, musical instruments, +and then just refer to them within a musical score by index number. + +File References + +Issue: We may need a standard form for references to other files. +A "file ref" could name a directory and a file in the same type of +operating system as the ref's originator. Following the reference +would expect the file to be on some mounted volume. In a network environment, +a file ref could name a server, too. + +Issue: How can we express operating-system independent file refs? + +Issue: What about a means to reference a portion of another file? +Would this be a "file ref" plus a reference to a "link" within the +target file? + + + +4. Data Sections + +The first thing we need of a file is to check: Does it contain IFF +data and, if so, does it contain the kind of data we're looking for? +So we come to the notion of a "data section". + +A "data section" or IFF "FORM" is one self-contained "data object" +that might be stored in a file by itself. It is one high level data +object such as a picture or a sound effect. The IFF structure "FORM" +makes it self- identifying. It could be a composite object like a +musical score with nested musical instrument descriptions. + +Group FORM + +A data section is a chunk with ckID "FORM" and this arrangement: + +FORM ::= "FORM" #{ FormType (LocalChunk | FORM | LIST | CAT)* +} +FormType ::= ID +LocalChunk ::= Property | Chunk + +The ID "FORM" is a syntactic keyword like "struct" in C. Think of +a "struct ILBM" containing a field "CMAP". If you see "FORM" you'll +know to expect a FORM type ID (the structure name, "ILBM" in this +example) and a particular contents arrangement or "syntax" (local +chunks, FORMs, LISTs, and CATs). (LISTs and CATs are discussed in +part 5, below.) A "FORM ILBM", in particular, might contain a local +chunk "CMAP", an "ILBM.CMAP" (to use a qualified name). + +So the chunk ID "FORM" indicates a data section. It implies that the +chunk contains an ID and some number of nested chunks. In reading +a FORM, like any other chunk, programs must respect its ckSize as +a virtual end-of-file for reading its contents, even if they're truncated. + +The FormType (or FORM type) is a restricted ID that may not contain +lower case letters or punctuation characters. (Cf. Type IDs. Cf. Single +Purpose Files.) + +The type-specific information in a FORM is composed of its "local +chunks": data properties and other chunks. Each FORM type is a local +name space for local chunk IDs. So "CMAP" local chunks in other FORM +types may be unrelated to "ILBM.CMAP". More than that, each FORM type +defines semantic scope. If you know what a FORM ILBM is, you'll know +what an ILBM.CMAP is. + +Local chunks defined when the FORM type is designed (and therefore +known to all clients of this type) are called "standard" while specialized +ones added later are "nonstandard". + +Among the local chunks, property chunks give settings for various +details like text font while the other chunks supply the essential +information. This distinction is not clear cut. A property setting +cancelled by a later setting of the same property has effect only +on data chunks in between. E.g. in the sequence: + +prop1 = x (propN = value)* prop1 = y + +where the propNs are not prop1, the setting prop1 = x has no effect. + +The following universal chunk IDs are reserved inside any FORM: "LIST", +"FORM", "PROP", "CAT ", "JJJJ", "LIS1" through "LIS9", "FOR1" through +"FOR9", and "CAT1" through "CAT9". (Cf. Chunks. Cf. Group LIST. Cf. +Group PROP.) For clarity, these universal chunk names may not be FORM +type IDs, either. + +Part 5, below, talks about grouping FORMs into LISTs and CATs. They +let you group a bunch of FORMs but don't impose any particular meaning +or constraints on the grouping. Read on. + +Composite FORMs + +A FORM chunk inside a FORM is a full-fledged data section. This means +you can build a composite object like a multi-frame animation sequence +from available picture FORMs and sound effect FORMs. You can insert +additional chunks with information like frame rate and frame count. + +Using composite FORMs, you leverage on existing programs that create +and edit the component FORMs. Those editors may even look into your +composite object to copy out its type of component, although it'll +be the rare program that's fancy enough to do that. Such editors are +not allowed to replace their component objects within your composite +object. That's because the IFF standard lets you specify consistency +requirements for the composite FORM such as maintaining a count or +a directory of the components. Only programs that are written to uphold +the rules of your FORM type should create or modify such FORMs. + +Therefore, in designing a program that creates composite objects, +you are strongly requested to provide a facility for your users to +import and export the nested FORMs. Import and export could move the +data through a clipboard or a file. + +Here are several existing FORM types and rules for defining new ones. + +FTXT + +An FTXT data section contains text with character formatting information +like fonts and faces. It has no paragraph or document formatting information +like margins and page headers. FORM FTXT is well matched to the text +representation in Amiga's Intuition environment. See the supplemental +document "FTXT" IFF Formatted Text. + +ILBM + +"ILBM" is an InterLeaved BitMap image with color map; a machine-independent +format for raster images. FORM ILBM is the standard image file format +for the Commodore-Amiga computer and is useful in other environments, +too. See the supplemental document "ILBM" IFF Interleaved Bitmap. + +PICS + +The data chunk inside a "PICS" data section has ID "PICT" and holds +a QuickDraw picture. Issue: Allow more than one PICT in a PICS? See +Inside Macintosh chapter "QuickDraw" for details on PICTs and how +to create and display them on the Macintosh computer. + +The only standard property for PICS is "XY", an optional property +that indicates the position of the PICT relative to "the big picture". +The contents of an XY is a QuickDraw Point. + +Note: PICT may be limited to Macintosh use, in which case there'll +be another format for structured graphics in other environments. + +Other Macintosh Resource Types + +Some other Macintosh resource types could be adopted for use within +IFF files; perhaps MWRT, ICN, ICN#, and STR#. + +Issue: Consider the candidates and reserve some more IDs. + +Designing New Data Sections + +Supplemental documents will define additional object types. A supplement +needs to specify the object's purpose, its FORM type ID, the IDs and +formats of standard local chunks, and rules for generating and interpreting +the data. It's a good idea to supply typedefs and an example source +program that accesses the new object. See "ILBM" IFF Interleaved Bitmap +for a good example. + +Anyone can pick a new FORM type ID but should reserve it with Electronic +Arts at their earliest convenience. [Issue: EA contact person? Hand +this off to another organization?] While decentralized format definitions +and extensions are possible in IFF, our preference is to get design +consensus by committee, implement a program to read and write it, +perhaps tune the format, and then publish the format with example +code. Some organization should remain in charge of answering questions +and coordinating extensions to the format. + +If it becomes necessary to revise the design of some data section, +its FORM type ID will serve as a version number (Cf. Type IDs). E.g. +a revised "VDEO" data section could be called "VDE1". But try to get +by with compatible revisions within the existing FORM type. + +In a new FORM type, the rules for primitive data types and word-alignment +(Cf. Primitive Data Types) may be overriden for the contents of its +local chunks but not for the chunk structure itself if your documentation +spells out the deviations. If machine-specific type variants are needed, +e.g. to store vast numbers of integers in reverse bit order, then +outline the conversion algorithm and indicate the variant inside each +file, perhaps via different FORM types. Needless to say, variations +should be minimized. + +In designing a FORM type, encapsulate all the data that other programs +will need to interpret your files. E.g. a raster graphics image should +specify the image size even if your program always uses 320 x 200 +pixels x 3 bitplanes. Receiving programs are then empowered to append +or clip the image rectangle, to add or drop bitplanes, etc. This enables +a lot more compatibility. + +Separate the central data (like musical notes) from more specialized +information (like note beams) so simpler programs can extract the +central parts during read-in. Leave room for expansion so other programs +can squeeze in new kinds of information (like lyrics). And remember +to keep the property chunks manageably short let's say 2 256 bytes. + +When designing a data object, try to strike a good tradeoff between +a super-general format and a highly-specialized one. Fit the details +to at least one particular need, for example a raster image might +as well store pixels in the current machine's scan order. But add +the kind of generality that makes it usable with foreseeable hardware +and software. E.g. use a whole byte for each red, green, and blue +color value even if this year's computer has only 4-bit video DACs. +Think ahead and help other programs so long as the overhead is acceptable. +E.g. run compress a raster by scan line rather than as a unit so future +programs can swap images by scan line to and from secondary storage. + +Try to design a general purpose "least common multiple" format that +encompasses the needs of many programs without getting too complicated. +Let's coalesce our uses around a few such formats widely separated +in the vast design space. Two factors make this flexibility and simplicity +practical. First, file storage space is getting very plentiful, so +compaction is not a priority. Second, nearly any locally-performed +data conversion work during file reading and writing will be cheap +compared to the I/O time. + +It must be ok to copy a LIST or FORM or CAT intact, e.g. to incorporate +it into a composite FORM. So any kind of internal references within +a FORM must be relative references. They could be relative to the +start of the containing FORM, relative from the referencing chunk, +or a sequence number into a collection. + +With composite FORMs, you leverage on existing programs that create +and edit the components. If you write a program that creates composite +objects, please provide a facility for your users to import and export +the nested FORMs. The import and export functions may move data through +a separate file or a clipboard. + +Finally, don't forget to specify all implied rules in detail. + + + +5. LISTs, CATs, and Shared Properties + +Data often needs to be grouped together like a list of icons. Sometimes +a trick like arranging little images into a big raster works, but +generally they'll need to be structured as a first class group. The +objects "LIST" and "CAT" are IFF-universal mechanisms for this purpose. + +Property settings sometimes need to be shared over a list of similar +objects. E.g. a list of icons may share one color map. LIST provides +a means called "PROP" to do this. One purpose of a LIST is to define +the scope of a PROP. A "CAT", on the other hand, is simply a concatenation +of objects. + +Simpler programs may skip LISTs and PROPs altogether and just handle +FORMs and CATs. All "fully-conforming" IFF programs also know about +"CAT ", "LIST", and "PROP". Any program that reads a FORM inside a +LIST must process shared PROPs to correctly interpret that FORM. + +Group CAT + +A CAT is just an untyped group of data objects. + +Structurally, a CAT is a chunk with chunk ID "CAT " containing a "contents +type" ID followed by the nested objects. The ckSize of each contained +chunk is essentially a relative pointer to the next one. + +CAT ::= "CAT " #{ ContentsType (FORM | LIST | CAT)* } +ContentsType ::= ID -- a hint or an "abstract data type" ID + +In reading a CAT, like any other chunk, programs must respect it's +ckSize as a virtual end-of-file for reading the nested objects even +if they're malformed or truncated. + +The "contents type" following the CAT's ckSize indicates what kind +of FORMs are inside. So a CAT of ILBMs would store "ILBM" there. It's +just a hint. It may be used to store an "abstract data type". A CAT +could just have blank contents ID ("JJJJ") if it contains more than +one kind of FORM. + +CAT defines only the format of the group. The group's meaning is open +to interpretation. This is like a list in LISP: the structure of cells +is predefined but the meaning of the contents as, say, an association +list depends on use. If you need a group with an enforced meaning +(an "abstract data type" or Smalltalk "subclass"), some consistency +constraints, or additional data chunks, use a composite FORM instead +(Cf. Composite FORMs). + +Since a CAT just means a concatenation of objects, CATs are rarely +nested. Programs should really merge CATs rather than nest them. + +Group LIST + +A LIST defines a group very much like CAT but it also gives a scope +for PROPs (see below). And unlike CATs, LISTs should not be merged +without understanding their contents. + +Structurally, a LIST is a chunk with ckID "LIST" containing a "contents +type" ID, optional shared properties, and the nested contents (FORMs, +LISTs, and CATs), in that order. The ckSize of each contained chunk +is a relative pointer to the next one. A LIST is not an arbitrary +linked list the cells are simply concatenated. + +LIST ::= "LIST" #{ ContentsType PROP* (FORM | LIST | CAT)* } +ContentsType ::= ID + +Group PROP + +PROP chunks may appear in LISTs (not in FORMs or CATs). They supply +shared properties for the FORMs in that LIST. This ability to elevate +some property settings to shared status for a list of forms is useful +for both indirection and compaction. E.g. a list of images with the +same size and colors can share one "size" property and one "color +map" property. Individual FORMs can override the shared settings. + +The contents of a PROP is like a FORM with no data chunks: + +PROP ::= "PROP" #{ FormType Property* } + +It means, "Here are the shared properties for FORM type <." + +A LIST may have at most one PROP of a FORM type, and all the PROPs +must appear before any of the FORMs or nested LISTs and CATs. You +can have subsequences of FORMs sharing properties by making each subsequence +a LIST. + +Scoping: Think of property settings as variable bindings in nested +blocks of a programming language. Where in C you could write: + +TEXT_FONT text_font = Courier; /* program's global default */ + +File(); { + TEXT_FONT text_font = TimesRoman; /* shared setting */ + + { + TEXT_FONT text_font = Helvetica; /* local setting */ + Print("Hello "); /* uses font Helvetica */ + } + + { + Print("there."); /* uses font TimesRoman */ + } + } + +An IFF file could contain: + +LIST { + PROP TEXT { + FONT {TimesRoman} /* shared setting */ + } + + FORM TEXT { + FONT {Helvetica} /* local setting */ + CHRS {Hello } /* uses font Helvetica */ + } + + FORM TEXT { + CHRS {there.} /* uses font TimesRoman */ + } + } + +The shared property assignments selectively override the reader's +global defaults, but only for FORMs within the group. A FORM's own +property assignments selectively override the global and group-supplied +values. So when reading an IFF file, keep property settings on a stack. +They're designed to be small enough to hold in main memory. + +Shared properties are semantically equivalent to copying those properties +into each of the nested FORMs right after their FORM type IDs. + +Properties for LIST + +Optional "properties for LIST" store the origin of the list's contents +in a PROP chunk for the fake FORM type "LIST". They are the properties +originating program "OPGM", processor family "OCPU", computer type +"OCMP", computer serial number or network address "OSN ", and user +name "UNAM". In our imperfect world, these could be called upon to +distinguish between unintended variations of a data format or to work +around bugs in particular originating/receiving program pairs. Issue: +Specify the format of these properties. + +A creation date could also be stored in a property but let's ask that +file creating, editing, and transporting programs maintain the correct +date in the local file system. Programs that move files between machine +types are expected to copy across the creation dates. + + + +6. Standard File Structure + +File Structure Overview + +An IFF file is just a single chunk of type FORM, LIST, or CAT. Therefore +an IFF file can be recognized by its first 4 bytes: "FORM", "LIST", +or "CAT ". Any file contents after the chunk's end are to be ignored. + +Since an IFF file can be a group of objects, programs that read/write +single objects can communicate to an extent with programs that read/write +groups. You're encouraged to write programs that handle all the objects +in a LIST or CAT. A graphics editor, for example, could process a +list of pictures as a multiple page document, one page at a time. + +Programs should enforce IFF's syntactic rules when reading and writing +files. This ensures robust data transfer. The public domain IFF reader/writer +subroutine package does this for you. A utility program "IFFCheck" +is available that scans an IFF file and checks it for conformance +to IFF's syntactic rules. IFFCheck also prints an outline of the chunks +in the file, showing the ckID and ckSize of each. This is quite handy +when building IFF programs. Example programs are also available to +show details of reading and writing IFF files. + +A merge program "IFFJoin" will be available that logically appends +IFF files into a single CAT group. It "unwraps" each input file that +is a CAT so that the combined file isn't nested CATs. + +If we need to revise the IFF standard, the three anchoring IDs will +be used as "version numbers". That's why IDs "FOR1" through "FOR9", +"LIS1" through "LIS9", and "CAT1" through "CAT9" are reserved. + +IFF formats are designed for reasonable performance with floppy disks. +We achieve considerable simplicity in the formats and programs by +relying on the host file system rather than defining universal grouping +structures like directories for LIST contents. On huge storage systems, +IFF files could be leaf nodes in a file structure like a B-tree. Let's +hope the host file system implements that for us! + +Thre are two kinds of IFF files: single purpose files and scrap files. +They differ in the interpretation of multiple data objects and in +the file's external type. + +Single Purpose Files + +A single purpose IFF file is for normal "document" and "archive" storage. +This is in contrast with "scrap files" (see below) and temporary backing +storage (non-interchange files). + +The external file type (or filename extension, depending on the host +file system) indicates the file's contents. It's generally the FORM +type of the data contained, hence the restrictions on FORM type IDs. + +Programmers and users may pick an "intended use" type as the filename +extension to make it easy to filter for the relevant files in a filename +requestor. This is actually a "subclass" or "subtype" that conveniently +separates files of the same FORM type that have different uses. Programs +cannot demand conformity to its expected subtypes without overly restricting +data interchange since they cannot know about the subtypes to be used +by future programs that users will want to exchange data with. + +Issue: How to generate 3-letter MS-DOS extensions from 4-letter FORM +type IDs? + +Most single purpose files will be a single FORM (perhaps a composite +FORM like a musical score containing nested FORMs like musical instrument +descriptions). If it's a LIST or a CAT, programs should skip over +unrecognized objects to read the recognized ones or the first recognized +one. Then a program that can read a single purpose file can read something +out of a "scrap file", too. + +Scrap Files + +A "scrap file" is for maximum interconnectivity in getting data between +programs; the core of a clipboard function. Scrap files may have type +"IFF " or filename extension ".IFF". + +A scrap file is typically a CAT containing alternate representations +of the same basic information. Include as many alternatives as you +can readily generate. This redundancy improves interconnectivity in +situations where we can't make all programs read and write super-general +formats. [Inside Macintosh chapter "Scrap Manager".] E.g. a graphically- +annotated musical score might be supplemented by a stripped down 4-voice +melody and by a text (the lyrics). + +The originating program should write the alternate representations +in order of "preference": most preferred (most comprehensive) type +to least preferred (least comprehensive) type. A receiving program +should either use the first appearing type that it understands or +search for its own "preferred" type. + +A scrap file should have at most one alternative of any type. (A LIST +of same type objects is ok as one of the alternatives.) But don't +count on this when reading; ignore extra sections of a type. Then +a program that reads scrap files can read something out of single +purpose files. + +Rules for Reader Programs + +Here are some notes on building programs that read IFF files. If you +use the standard IFF reader module "IFFR.C", many of these rules and +details will be automatically handled. (See "Support Software" in +Appendix A.) We recommend that you start from the example program +"ShowILBM.C". You should also read up on recursive descent parsers. +[See, for example, Compiler Construction, An Advanced Course.] + +% The standard is very flexible so many programs can exchange +data. This implies a program has to scan the file and react to what's +actually there in whatever order it appears. An IFF reader program +is a parser. + +% For interchange to really work, programs must be willing to +do some conversion during read-in. If the data isn't exactly what +you expect, say, the raster is smaller than those created by your +program, then adjust it. Similarly, your program could crop a large +picture, add or drop bitplanes, and create/discard a mask plane. The +program should give up gracefully on data that it can't convert. + +% If it doesn't start with "FORM", "LIST", or "CAT ", it's not +an IFF-85 file. + +% For any chunk you encounter, you must recognize its type ID +to understand its contents. + +% For any FORM chunk you encounter, you must recognize its FORM +type ID to understand the contained "local chunks". Even if you don't +recognize the FORM type, you can still scan it for nested FORMs, LISTs, +and CATs of interest. + +% Don't forget to skip the pad byte after every odd-length chunk. + +% Chunk types LIST, FORM, PROP, and CAT are generic groups. They +always contain a subtype ID followed by chunks. + +% Readers ought to handle a CAT of FORMs in a file. You may treat +the FORMs like document pages to sequence through or just use the +first FORM. + +% Simpler IFF readers completely skip LISTs. "Fully IFF-conforming" +readers are those that handle LISTs, even if just to read the first +FORM from a file. If you do look into a LIST, you must process shared +properties (in PROP chunks) properly. The idea is to get the correct +data or none at all. + +% The nicest readers are willing to look into unrecognized FORMs +for nested FORM types that they do recognize. For example, a musical +score may contain nested instrument descriptions and an animation +file may contain still pictures. + +Note to programmers: Processing PROP chunks is not simple! You'll +need some background in interpreters with stack frames. If this is +foreign to you, build programs that read/write only one FORM per file. +For the more intrepid programmers, the next paragraph summarizes how +to process LISTs and PROPs. See the general IFF reader module "IFFR.C" +and the example program "ShowILBM.C" for details. + +Allocate a stack frame for every LIST and FORM you encounter and initialize +it by copying the stack frame of the parent LIST or FORM. At the top +level, you'll need a stack frame initialized to your program's global +defaults. While reading each LIST or FORM, store all encountered properties +into the current stack frame. In the example ShowILBM, each stack +frame has a place for a bitmap header property ILBM.BMHD and a color +map property ILBM.CMAP. When you finally get to the ILBM's BODY chunk, +use the property settings accumulated in the current stack frame. + +An alternate implementation would just remember PROPs encountered, +forgetting each on reaching the end of its scope (the end of the containing +LIST). When a FORM XXXX is encountered, scan the chunks in all remembered +PROPs XXXX, in order, as if they appeared before the chunks actually +in the FORM XXXX. This gets trickier if you read FORMs inside of FORMs. + +Rules for Writer Programs + +Here are some notes on building programs that write IFF files, which +is much easier than reading them. If you use the standard IFF writer +module "IFFW.C" (see "Support Software" in Appendix A), many of these +rules and details will automatically be enforced. See the example +program "Raw2ILBM.C". + +% An IFF file is a single FORM, LIST, or CAT chunk. + +% Any IFF-85 file must start with the 4 characters "FORM", "LIST", +or "CAT ", followed by a LONG ckSize. There should be no data after +the chunk end. + +% Chunk types LIST, FORM, PROP, and CAT are generic. They always +contain a subtype ID followed by chunks. These three IDs are universally +reserved, as are "LIS1" through "LIS9", "FOR1" through "FOR9", "CAT1" +through "CAT9", and " ". + +% Don't forget to write a 0 pad byte after each odd-length chunk. + +% Four techniques for writing an IFF group: (1) build the data +in a file mapped into virtual memory, (2) build the data in memory +blocks and use block I/O, (3) stream write the data piecemeal and +(don't forget!) random access back to set the group length count, +and (4) make a preliminary pass to compute the length count then stream +write the data. + +% Do not try to edit a file that you don't know how to create. +Programs may look into a file and copy out nested FORMs of types that +they recognize, but don't edit and replace the nested FORMs and don't +add or remove them. That could make the containing structure inconsistent. +You may write a new file containing items you copied (or copied and +modified) from another IFF file, but don't copy structural parts you +don't understand. + +% You must adhere to the syntax descriptions in Appendex A. E.g. +PROPs may only appear inside LISTs. + + + + +Appendix A. Reference + +Type Definitions + +The following C typedefs describe standard IFF structures. Declarations +to use in practice will vary with the CPU and compiler. For example, +68000 Lattice C produces efficient comparison code if we define ID +as a "LONG". A macro "MakeID" builds these IDs at compile time. + +/* Standard IFF types, expressed in 68000 Lattice C. */ + +typedef unsigned char UBYTE; /* 8 bits unsigned */ +typedef short WORD; /* 16 bits signed */ +typedef unsigned short UWORD; /* 16 bits unsigned */ +typedef long LONG; /* 32 bits signed */ + +typedef char ID[4]; /* 4 chars in ' ' through '~' */ + +typedef struct { + ID ckID; + LONG ckSize; /* sizeof(ckData) */ + UBYTE ckData[/* ckSize */]; + } Chunk; + +/* ID typedef and builder for 68000 Lattice C. */ +typedef LONG ID; /* 4 chars in ' ' through '~' */ +#define MakeID(a,b,c,d) ( (a)<<<<24 | (b)<<<<16 | (c)<<<<8 | (d) ) + +/* Globally reserved IDs. */ +#define ID_FORM MakeID('F','O','R','M') +#define ID_LIST MakeID('L','I','S','T') +#define ID_PROP MakeID('P','R','O','P') +#define ID_CAT MakeID('C','A','T',' ') +#define ID_FILLER MakeID(' ',' ',' ',' ') + +Syntax Definitions + +Here's a collection of the syntax definitions in this document. + +Chunk ::= ID #{ UBYTE* } [0] + +Property ::= Chunk + +FORM ::= "FORM" #{ FormType (LocalChunk | FORM | LIST | CAT)* +} +FormType ::= ID +LocalChunk ::= Property | Chunk + +CAT ::= "CAT " #{ ContentsType (FORM | LIST | CAT)* } +ContentsType ::= ID -- a hint or an "abstract data type" ID + +LIST ::= "LIST" #{ ContentsType PROP* (FORM | LIST | CAT)* } +PROP ::= "PROP" #{ FormType Property* } + +In this extended regular expression notation, the token "#" represents +a ckSize LONG count of the following {braced} data bytes. Literal +items are shown in "quotes", [square bracketed items] are optional, +and "*" means 0 or more instances. A sometimes-needed pad byte is +shown as "[0]". + +Defined Chunk IDs + +This is a table of currently defined chunk IDs. We may also borrow +some Macintosh IDs and data formats. + +Group chunk IDs + FORM, LIST, PROP, CAT. +Future revision group chunk IDs + FOR1 I FOR9, LIS1 I LIS9, CAT1 I CAT9. +FORM type IDs + (The above group chunk IDs may not be used for FORM type IDs.) + (Lower case letters and punctuation marks are forbidden in FORM +type IDs.) + 8SVX 8-bit sampled sound voice, ANBM animated bitmap, FNTR raster +font, FNTV vector font, FTXT formatted text, GSCR general-use musical +score, ILBM interleaved raster bitmap image, PDEF Deluxe Print page +definition, PICS Macintosh picture, PLBM (obsolete), USCR Uhuru Sound +Software musical score, UVOX Uhuru Sound Software Macintosh voice, +SMUS simple musical score, VDEO Deluxe Video Construction Set video. +Data chunk IDs + "JJJJ", TEXT, PICT. +PROP LIST property IDs + OPGM, OCPU, OCMP, OSN, UNAM. + + + +Support Software + +These public domain C source programs are available for use in building +IFF-compatible programs: + +IFF.H, IFFR.C, IFFW.C + + IFF reader and writer package. + These modules handle many of the details of reliably + reading and writing IFF files. + +IFFCheck.C This handy utility program scans an IFF file, checks + that the contents are well formed, and prints an outline + of the chunks. + +PACKER.H, Packer.C, UnPacker.C + + Run encoder and decoder used for ILBM files. + +ILBM.H, ILBMR.C, ILBMW.C + + Reader and writer support routines for raster image + FORM ILBM. ILBMR calls IFFR and UnPacker. ILBMW calls + IFFW and Packer. + +ShowILBM.C + Example caller of IFFR and ILBMR modules. This + Commodore-Amiga program reads and displays a FORM ILBM. +Raw2ILBM.C + Example ILBM writer program. As a demonstration, it + reads a raw raster image file and writes the image + as a FORM ILBM file. +ILBM2Raw.C + Example ILBM reader program. Reads a FORM ILBM file + and writes it into a raw raster image. + +REMALLOC.H, Remalloc.c + + Memory allocation routines used in these examples. + +INTUALL.H generic "include almost everything" include-file + with the sequence of includes correctly specified. + +READPICT.H, ReadPict.c + + given an ILBM file, read it into a bitmap and + a color map + +PUTPICT.H, PutPict.c + + given a bitmap and a color map, save it as + an ILBM file. + +GIO.H, Gio.c generic I/O speedup package. Attempts to speed + disk I/O by buffering writes and reads. + +giocall.c sample call to gio. + +ilbmdump.c reads in ILBM file, prints out ascii representation + for including in C files. + +bmprintc.c prints out a C-language representation of data for + a bitmap. + + + +Example Diagrams + +Here's a box diagram for an example IFF file, a raster image FORM +ILBM. This FORM contains a bitmap header property chunk BMHD, a color +map property chunk CMAP, and a raster data chunk BODY. This particular +raster is 320 x 200 pixels x 3 bit planes uncompressed. The "0" after +the CMAP chunk represents a zero pad byte; included since the CMAP +chunk has an odd length. The text to the right of the diagram shows +the outline that would be printed by the IFFCheck utility program +for this particular file. + + +-----------------------------------+ + |'FORM' 24070 | FORM 24070 IBLM + +-----------------------------------+ + |'ILBM' | + +-----------------------------------+ + | +-------------------------------+ | + | | 'BMHD' 20 | | .BMHD 20 + | | 320, 200, 0, 0, 3, 0, 0, ... | | + | + ------------------------------+ | + | | 'CMAP' 21 | | .CMAP 21 + | | 0, 0, 0; 32, 0, 0; 64,0,0; .. | | + | +-------------------------------+ | + | 0 | + +-----------------------------------+ + |'BODY' 24000 | .BODY 24000 + |0, 0, 0, ... | + +-----------------------------------+ + +This second diagram shows a LIST of two FORMs ILBM sharing a common +BMHD property and a common CMAP property. Again, the text on the right +is an outline a la IFFCheck. + + + +-----------------------------------------+ + |'LIST' 48114 | LIST 48114 AAAA + +-----------------------------------------+ + |'AAAA' | .PROP 62 ILBM + | +-----------------------------------+ | + | |'PROP' 62 | | + | +-----------------------------------+ | + | |'ILBM' | | + | +-----------------------------------+ | + | | +-------------------------------+ | | + | | | 'BMHD' 20 | | | ..BMHD 20 + | | | 320, 200, 0, 0, 3, 0, 0, ... | | | + | | | ------------------------------+ | | + | | | 'CMAP' 21 | | | ..CMAP 21 + | | | 0, 0, 0; 32, 0, 0; 64,0,0; .. | | | + | | +-------------------------------+ | | + | | 0 | | + | +-----------------------------------+ | + | +-----------------------------------+ | + | |'FORM' 24012 | | .FORM 24012 ILBM + | +-----------------------------------+ | + | |'ILBM' | | + | +-----------------------------------+ | + | | +-----------------------------+ | | + | | |'BODY' 24000 | | | ..BODY 24000 + | | |0, 0, 0, ... | | | + | | +-----------------------------+ | | + | +-----------------------------------+ | + | +-----------------------------------+ | + | |'FORM' 24012 | | .FORM 24012 ILBM + | +-----------------------------------+ | + | |'ILBM' | | + | +-----------------------------------+ | + | | +-----------------------------+ | | + | | |'BODY' 24000 | | | ..BODY 24000 + | | |0, 0, 0, ... | | | + | | +-----------------------------+ | | + | +-----------------------------------+ | + +-----------------------------------------+ + + + +Appendix B. Standards Committee + +The following people contributed to the design of this IFF standard: + +Bob "Kodiak" Burns, Commodore-Amiga +R. J. Mical, Commodore-Amiga +Jerry Morrison, Electronic Arts +Greg Riker, Electronic Arts +Steve Shaw, Electronic Arts +Barry Walsh, Commodore-Amiga diff --git a/Extras/iff/iffCheck/iffcheck.cpp b/Extras/iff/iffCheck/iffcheck.cpp index b9f604fe0..a3cdfeecf 100644 --- a/Extras/iff/iffCheck/iffcheck.cpp +++ b/Extras/iff/iffCheck/iffcheck.cpp @@ -1,233 +1,233 @@ -/*---------------------------------------------------------------------* -* IFFCheck.C Print out the structure of an IFF-85 file, 11/19/85 -* checking for structural errors. -* -* DO NOT USE THIS AS A SKELETAL PROGRAM FOR AN IFF READER! -* See ShowILBM.C for a skeletal example. -* -* Original version was for the Commodore-Amiga computer. -/* This version is compatible with PC, OSX, PS3, Wii, iPhone. 10/26/2008 -*----------------------------------------------------------------------*/ - -#include "iff.h" -#include "stdlib.h" //for exit - -/* ---------- IFFCheck -------------------------------------------------*/ -/* [TBD] More extensive checking could be done on the IDs encountered in the -* file. Check that the reserved IDs "FOR1".."FOR9", "LIS1".."LIS9", and -* "CAT1".."CAT9" aren't used. Check that reserved IDs aren't used as Form -* types. Check that all IDs are made of 4 printable characters (trailing -* spaces ok). */ - -typedef struct { - ClientFrame clientFrame; - int levels; /* # groups currently nested within.*/ -} Frame; - -char MsgOkay[] = { "----- (IFF_OKAY) A good IFF file." }; -char MsgEndMark[] = {"----- (END_MARK) How did you get this message??" }; -char MsgDone[] = { "----- (IFF_DONE) How did you get this message??" }; -char MsgDos[] = { "----- (DOS_ERROR) The DOS gave back an error." }; -char MsgNot[] = { "----- (NOT_IFF) not an IFF file." }; -char MsgNoFile[] = { "----- (NO_FILE) no such file found." }; -char MsgClientError[] = {"----- (CLIENT_ERROR) IFF Checker bug."}; -char MsgForm[] = { "----- (BAD_FORM) How did you get this message??" }; -char MsgShort[] = { "----- (SHORT_CHUNK) How did you get this message??" }; -char MsgBad[] = { "----- (BAD_IFF) a mangled IFF file." }; - -/* MUST GET THESE IN RIGHT ORDER!!*/ -char *IFFPMessages[-LAST_ERROR+1] = { - /*IFF_OKAY*/ MsgOkay, - /*END_MARK*/ MsgEndMark, - /*IFF_DONE*/ MsgDone, - /*DOS_ERROR*/ MsgDos, - /*NOT_IFF*/ MsgNot, - /*NO_FILE*/ MsgNoFile, - /*CLIENT_ERROR*/ MsgClientError, - /*BAD_FORM*/ MsgForm, - /*SHORT_CHUNK*/ MsgShort, - /*BAD_IFF*/ MsgBad -}; - -/* FORWARD REFERENCES */ -extern IFFP GetList(GroupContext*); -extern IFFP GetForm(GroupContext*); -extern IFFP GetProp(GroupContext*); -extern IFFP GetCat (GroupContext*); - -void IFFCheck(char *name) -{ - IFFP iffp; - BPTR file = fopen(name,"rb");//Open(name, MODE_OLDFILE); - Frame frame; - - frame.levels = 0; - frame.clientFrame.getList = GetList; - frame.clientFrame.getForm = GetForm; - frame.clientFrame.getProp = GetProp; - frame.clientFrame.getCat = GetCat ; - - printf("----- Checking file '%s' -----\n", name); - if (file == 0) - iffp = NO_FILE; - else - iffp = ReadIFF(file, (ClientFrame *)&frame); - - fclose(file); - printf("%s\n", IFFPMessages[-iffp]); -} - -int main(int argc, char **argv) -{ - if (argc != 1+1) { - printf("Usage: 'iffcheck filename'\n"); - exit(0); - } - IFFCheck(argv[1]); - return 0; -} - -/* ---------- Put... ---------------------------------------------------*/ - -void PutLevels(int count) -{ - for ( ; count > 0; --count) { - printf("."); - } -} - -void PutID(int id) -{ - long int i = 1; - const char *p = (const char *) &i; - if (p[0] == 1) // Lowest address contains the least significant byte - { - //little endian machine - printf("%c%c%c%c ", (char)(id&0x7f) , (char)(id>>8)&0x7f, - (char)(id>>16)&0x7f, (char)(id>>24)&0x7f); - } else - { - //big endian machine - printf("%c%c%c%c ", (char)(id>>24)&0x7f, (char)(id>>16)&0x7f, - (char)(id>>8)&0x7f, (char)(id&0x7f)); - } - /* printf("id = %lx", id); */ -} - -void PutN(long n) -{ - printf(" %ld ", n); -} - -/* Put something like "...BMHD 14" or "...LIST 14 PLBM". */ -void PutHdr(GroupContext *context) -{ - PutLevels( ((Frame *)context->clientFrame)->levels ); - PutID(context->ckHdr.ckID); - PutN(context->ckHdr.ckSize); - - if (context->subtype != NULL_CHUNK) - PutID(context->subtype); - - printf("\n"); -} - -/* ---------- AtLeaf ---------------------------------------------------*/ - -/* At Leaf chunk. That is, a chunk which does NOT contain other chunks. -* Print "int size".*/ -IFFP AtLeaf(GroupContext *context) -{ - - PutHdr(context); - /* A typical reader would read the chunk's contents, using the "Frame" - * for local data, esp. shared property settings (PROP).*/ - /* IFFReadBytes(context, ...buffer, context->ckHdr->ckSize); */ - return(IFF_OKAY); -} - -/* ---------- GetList --------------------------------------------------*/ -/* Handle a LIST chunk. Print "LIST size subTypeID". -* Then dive into it.*/ -IFFP GetList(GroupContext *parent) -{ - Frame newFrame; - - newFrame = *(Frame *)parent->clientFrame; /* copy parent's frame*/ - newFrame.levels++; - - PutHdr(parent); - - return( ReadIList(parent, (ClientFrame *)&newFrame) ); -} - -/* ---------- GetForm --------------------------------------------------*/ -/* Handle a FORM chunk. Print "FORM size subTypeID". -* Then dive into it.*/ -IFFP GetForm(GroupContext *parent) -{ - /*CompilerBug register*/ IFFP iffp; - GroupContext newptr; - Frame newFrame; - - newFrame = *(Frame *)parent->clientFrame; /* copy parent's frame*/ - newFrame.levels++; - - PutHdr(parent); - - iffp = OpenRGroup(parent, &newptr); - CheckIFFP(); - newptr.clientFrame = (ClientFrame *)&newFrame; - - /* FORM reader for Checker. */ - /* LIST, FORM, PROP, CAT already handled by GetF1ChunkHdr. */ - do {if ( (iffp = GetF1ChunkHdr(&newptr)) > 0 ) - iffp = AtLeaf(&newptr); - } while (iffp >= IFF_OKAY); - - CloseRGroup(&newptr); - return(iffp == END_MARK ? IFF_OKAY : iffp); -} - -/* ---------- GetProp --------------------------------------------------*/ -/* Handle a PROP chunk. Print "PROP size subTypeID". -* Then dive into it.*/ -IFFP GetProp(GroupContext *listContext) -{ - /*CompilerBug register*/ IFFP iffp; - GroupContext newptr; - - PutHdr(listContext); - - iffp = OpenRGroup(listContext, &newptr); - CheckIFFP(); - - /* PROP reader for Checker. */ - ((Frame *)listContext->clientFrame)->levels++; - - do {if ( (iffp = GetPChunkHdr(&newptr)) > 0 ) - iffp = AtLeaf(&newptr); - } while (iffp >= IFF_OKAY); - - ((Frame *)listContext->clientFrame)->levels--; - - CloseRGroup(&newptr); - return(iffp == END_MARK ? IFF_OKAY : iffp); -} - -/* ---------- GetCat ---------------------------------------------------*/ -/* Handle a CAT chunk. Print "CAT size subTypeID". -* Then dive into it.*/ -IFFP GetCat(GroupContext *parent) -{ - IFFP iffp; - - ((Frame *)parent->clientFrame)->levels++; - - PutHdr(parent); - - iffp = ReadICat(parent); - - ((Frame *)parent->clientFrame)->levels--; - return(iffp); -} +/*---------------------------------------------------------------------* +* IFFCheck.C Print out the structure of an IFF-85 file, 11/19/85 +* checking for structural errors. +* +* DO NOT USE THIS AS A SKELETAL PROGRAM FOR AN IFF READER! +* See ShowILBM.C for a skeletal example. +* +* Original version was for the Commodore-Amiga computer. +/* This version is compatible with PC, OSX, PS3, Wii, iPhone. 10/26/2008 +*----------------------------------------------------------------------*/ + +#include "iff.h" +#include "stdlib.h" //for exit + +/* ---------- IFFCheck -------------------------------------------------*/ +/* [TBD] More extensive checking could be done on the IDs encountered in the +* file. Check that the reserved IDs "FOR1".."FOR9", "LIS1".."LIS9", and +* "CAT1".."CAT9" aren't used. Check that reserved IDs aren't used as Form +* types. Check that all IDs are made of 4 printable characters (trailing +* spaces ok). */ + +typedef struct { + ClientFrame clientFrame; + int levels; /* # groups currently nested within.*/ +} Frame; + +char MsgOkay[] = { "----- (IFF_OKAY) A good IFF file." }; +char MsgEndMark[] = {"----- (END_MARK) How did you get this message??" }; +char MsgDone[] = { "----- (IFF_DONE) How did you get this message??" }; +char MsgDos[] = { "----- (DOS_ERROR) The DOS gave back an error." }; +char MsgNot[] = { "----- (NOT_IFF) not an IFF file." }; +char MsgNoFile[] = { "----- (NO_FILE) no such file found." }; +char MsgClientError[] = {"----- (CLIENT_ERROR) IFF Checker bug."}; +char MsgForm[] = { "----- (BAD_FORM) How did you get this message??" }; +char MsgShort[] = { "----- (SHORT_CHUNK) How did you get this message??" }; +char MsgBad[] = { "----- (BAD_IFF) a mangled IFF file." }; + +/* MUST GET THESE IN RIGHT ORDER!!*/ +char *IFFPMessages[-LAST_ERROR+1] = { + /*IFF_OKAY*/ MsgOkay, + /*END_MARK*/ MsgEndMark, + /*IFF_DONE*/ MsgDone, + /*DOS_ERROR*/ MsgDos, + /*NOT_IFF*/ MsgNot, + /*NO_FILE*/ MsgNoFile, + /*CLIENT_ERROR*/ MsgClientError, + /*BAD_FORM*/ MsgForm, + /*SHORT_CHUNK*/ MsgShort, + /*BAD_IFF*/ MsgBad +}; + +/* FORWARD REFERENCES */ +extern IFFP GetList(GroupContext*); +extern IFFP GetForm(GroupContext*); +extern IFFP GetProp(GroupContext*); +extern IFFP GetCat (GroupContext*); + +void IFFCheck(char *name) +{ + IFFP iffp; + BPTR file = fopen(name,"rb");//Open(name, MODE_OLDFILE); + Frame frame; + + frame.levels = 0; + frame.clientFrame.getList = GetList; + frame.clientFrame.getForm = GetForm; + frame.clientFrame.getProp = GetProp; + frame.clientFrame.getCat = GetCat ; + + printf("----- Checking file '%s' -----\n", name); + if (file == 0) + iffp = NO_FILE; + else + iffp = ReadIFF(file, (ClientFrame *)&frame); + + fclose(file); + printf("%s\n", IFFPMessages[-iffp]); +} + +int main(int argc, char **argv) +{ + if (argc != 1+1) { + printf("Usage: 'iffcheck filename'\n"); + exit(0); + } + IFFCheck(argv[1]); + return 0; +} + +/* ---------- Put... ---------------------------------------------------*/ + +void PutLevels(int count) +{ + for ( ; count > 0; --count) { + printf("."); + } +} + +void PutID(int id) +{ + long int i = 1; + const char *p = (const char *) &i; + if (p[0] == 1) // Lowest address contains the least significant byte + { + //little endian machine + printf("%c%c%c%c ", (char)(id&0x7f) , (char)(id>>8)&0x7f, + (char)(id>>16)&0x7f, (char)(id>>24)&0x7f); + } else + { + //big endian machine + printf("%c%c%c%c ", (char)(id>>24)&0x7f, (char)(id>>16)&0x7f, + (char)(id>>8)&0x7f, (char)(id&0x7f)); + } + /* printf("id = %lx", id); */ +} + +void PutN(long n) +{ + printf(" %ld ", n); +} + +/* Put something like "...BMHD 14" or "...LIST 14 PLBM". */ +void PutHdr(GroupContext *context) +{ + PutLevels( ((Frame *)context->clientFrame)->levels ); + PutID(context->ckHdr.ckID); + PutN(context->ckHdr.ckSize); + + if (context->subtype != NULL_CHUNK) + PutID(context->subtype); + + printf("\n"); +} + +/* ---------- AtLeaf ---------------------------------------------------*/ + +/* At Leaf chunk. That is, a chunk which does NOT contain other chunks. +* Print "int size".*/ +IFFP AtLeaf(GroupContext *context) +{ + + PutHdr(context); + /* A typical reader would read the chunk's contents, using the "Frame" + * for local data, esp. shared property settings (PROP).*/ + /* IFFReadBytes(context, ...buffer, context->ckHdr->ckSize); */ + return(IFF_OKAY); +} + +/* ---------- GetList --------------------------------------------------*/ +/* Handle a LIST chunk. Print "LIST size subTypeID". +* Then dive into it.*/ +IFFP GetList(GroupContext *parent) +{ + Frame newFrame; + + newFrame = *(Frame *)parent->clientFrame; /* copy parent's frame*/ + newFrame.levels++; + + PutHdr(parent); + + return( ReadIList(parent, (ClientFrame *)&newFrame) ); +} + +/* ---------- GetForm --------------------------------------------------*/ +/* Handle a FORM chunk. Print "FORM size subTypeID". +* Then dive into it.*/ +IFFP GetForm(GroupContext *parent) +{ + /*CompilerBug register*/ IFFP iffp; + GroupContext newptr; + Frame newFrame; + + newFrame = *(Frame *)parent->clientFrame; /* copy parent's frame*/ + newFrame.levels++; + + PutHdr(parent); + + iffp = OpenRGroup(parent, &newptr); + CheckIFFP(); + newptr.clientFrame = (ClientFrame *)&newFrame; + + /* FORM reader for Checker. */ + /* LIST, FORM, PROP, CAT already handled by GetF1ChunkHdr. */ + do {if ( (iffp = GetF1ChunkHdr(&newptr)) > 0 ) + iffp = AtLeaf(&newptr); + } while (iffp >= IFF_OKAY); + + CloseRGroup(&newptr); + return(iffp == END_MARK ? IFF_OKAY : iffp); +} + +/* ---------- GetProp --------------------------------------------------*/ +/* Handle a PROP chunk. Print "PROP size subTypeID". +* Then dive into it.*/ +IFFP GetProp(GroupContext *listContext) +{ + /*CompilerBug register*/ IFFP iffp; + GroupContext newptr; + + PutHdr(listContext); + + iffp = OpenRGroup(listContext, &newptr); + CheckIFFP(); + + /* PROP reader for Checker. */ + ((Frame *)listContext->clientFrame)->levels++; + + do {if ( (iffp = GetPChunkHdr(&newptr)) > 0 ) + iffp = AtLeaf(&newptr); + } while (iffp >= IFF_OKAY); + + ((Frame *)listContext->clientFrame)->levels--; + + CloseRGroup(&newptr); + return(iffp == END_MARK ? IFF_OKAY : iffp); +} + +/* ---------- GetCat ---------------------------------------------------*/ +/* Handle a CAT chunk. Print "CAT size subTypeID". +* Then dive into it.*/ +IFFP GetCat(GroupContext *parent) +{ + IFFP iffp; + + ((Frame *)parent->clientFrame)->levels++; + + PutHdr(parent); + + iffp = ReadICat(parent); + + ((Frame *)parent->clientFrame)->levels--; + return(iffp); +} diff --git a/Extras/iff/iffCreateTest/main.cpp b/Extras/iff/iffCreateTest/main.cpp index 99c2ddb14..6bf301a4b 100644 --- a/Extras/iff/iffCreateTest/main.cpp +++ b/Extras/iff/iffCreateTest/main.cpp @@ -1,236 +1,236 @@ -/* -Test read and write IFF-85, Interchange Format File -Copyright (c) 2008 Erwin Coumans http://bulletphysics.com - -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. -*/ - -/* -* IFF Support routines for writing IFF-85 files. 12/02/85 -* (IFF is Interchange Format File.) -* By Jerry Morrison and Steve Shaw, Electronic Arts. -* This software is in the public domain. -* -*/ - -#include - -#include "iff.h" - -IFFP MyReadICat(GroupContext *parent) -{ - printf("Found and skipped a CAT\n"); - return 0; -} - -IFFP MySkipGroup( GroupContext * ) -{ - printf("Found and skipped a LIST\n"); - return 0; -} - -typedef UBYTE Masking; /* Choice of masking technique.*/ -typedef UBYTE Compression; /* Choice of compression algorithm applied to - - /* A BitMapHeader is stored in a BMHD chunk. */ -typedef struct { - - UWORD w, h; /* raster width & height in pixels */ - - WORD x, y; /* position for this image */ - UBYTE nPlanes; /* # source bitplanes */ - Masking masking; /* masking technique */ - Compression compression; /* compression algoithm */ - UBYTE pad1; /* UNUSED. For consistency, put 0 here.*/ - UWORD transparentColor; /* transparent "color number" */ - UBYTE xAspect, yAspect; /* aspect ratio, a rational number x/y */ - WORD pageWidth, pageHeight; /* source "page" size in pixels */ - -} BitMapHeader; - - -#define bufSz 512 -BYTE bodyBuffer[bufSz]; - -static void btSwap(char* a, char* b) -{ - char tmp = *a; - *a = *b; - *b = tmp; -}; - -#define ID_ILBM MakeID('I','L','B','M') -#define ID_BMHD MakeID('B','M','H','D') -#define ID_CMAP MakeID('C','M','A','P') -#define ID_BODY MakeID('B','O','D','Y') - -#define ID_DYNAWORLD MakeID('B','T','D','W') -#define ID_RIGIDBODY MakeID('B','T','R','B') -#define ID_SID MakeID('S','I','D',' ') -#define ID_MASS MakeID('M','A','S','S') -#define ID_SHAPE MakeID('S','H','A','P') - - -#define ID_COLOBJ MakeID('C','O','B','J') -#define ID_CUBE MakeID('C','U','B','E') -#define ID_DIMENSIONS MakeID('D','I','M','E') - - -IFFP MyProcessGroup(GroupContext *parent) -{ - /*compilerBug register*/ IFFP iffp; - GroupContext rigidbodyContext; - - BitMapHeader bmHeader; - bool foundBMHD = false; - - - if (parent->subtype != ID_ILBM) - return(IFF_OKAY); /* just continue scaning the file */ - - iffp = OpenRGroup(parent, &rigidbodyContext); - CheckIFFP(); - - do { - iffp = GetFChunkHdr(&rigidbodyContext); - if (iffp == ID_BMHD) { - printf("found ID_BMHD\n"); - foundBMHD = true; - - iffp = IFFReadBytes(&rigidbodyContext, (BYTE *)&bmHeader, (long)sizeof(BitMapHeader)); - //do endian swap - bmHeader.w = endianSwap16(bmHeader.w); - bmHeader.h = endianSwap16(bmHeader.h); - bmHeader.pageWidth = endianSwap16(bmHeader.pageWidth); - bmHeader.pageHeight = endianSwap16(bmHeader.pageHeight); - } - - else if (iffp == ID_CMAP) { - printf("found ID_CMAP\n"); - - // ilbmFrame.nColorRegs = maxColorReg; /* we have room for this many */ - // iffp = GetCMAP( - // &rigidbodyContext, (WORD *)&ilbmFrame.colorMap, &ilbmFrame.nColorRegs); - } - - else if (iffp == ID_BODY) - { - printf("found ID_BODY\n"); - if (!foundBMHD) - return BAD_FORM; - // if (!ilbmFrame.foundBMHD) return(BAD_FORM); /* No BMHD chunk! */ - - int moreBytes = ChunkMoreBytes(&rigidbodyContext); - while (moreBytes>0) - { - int curRead = moreBytes > bufSz? bufSz : moreBytes; - //read - iffp = IFFReadBytes(&rigidbodyContext, bodyBuffer, curRead); - moreBytes -= curRead; - - } - printf("remaining=%d\n",moreBytes); - if (iffp == IFF_OKAY) - iffp = IFF_DONE; /* Eureka */ - - - - // nPlanes = MIN(ilbmFrame.bmHdr.nPlanes, EXDepth); - } - - else if (iffp == END_MARK) - iffp = BAD_FORM; - - } while (iffp >= IFF_OKAY); /* loop if valid ID of ignored chunk or a - * subroutine returned IFF_OKAY (no errors).*/ - - if (iffp != IFF_DONE) return(iffp); - - /* If we get this far, there were no errors. */ - CloseRGroup(&rigidbodyContext); - return(iffp); -} - - - -#define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);} - - -int main(int argc, char* argv[]) -{ - FILE* file = 0; - - { - //Create and write an IFF file from scratch - file = fopen("test.iff","wb"); - - GroupContext fileContext; - GroupContext catContext; - - IFFP ifferr=0; - - ifferr = OpenWIFF(file, &fileContext, szNotYetKnown) ; - //ifferr = StartWGroup(&fileContext, CAT, szNotYetKnown, ID_DYNAWORLD, &catContext); - ifferr = StartWGroup(&fileContext, LIST, szNotYetKnown, ID_DYNAWORLD, &catContext); - - { - GroupContext rigidbodyPropContext; - ifferr = StartWGroup(&catContext, PROP, szNotYetKnown, ID_MASS, &rigidbodyPropContext); - float mass = 0.1f; - PutCk(&rigidbodyPropContext, ID_MASS, 4,(char*)&mass); - ifferr = EndWGroup(&rigidbodyPropContext) ; - - for (int i=0;i<3;i++) - { - GroupContext rigidbodyContext; - ifferr = StartWGroup(&catContext, FORM, szNotYetKnown, ID_RIGIDBODY, &rigidbodyContext); - char sidbuffer[]="rb1"; - - float dimensions[3] = {2,2,2}; - PutCk(&rigidbodyContext, ID_SID, 3,sidbuffer); - { - GroupContext shapeContext; - ifferr = StartWGroup(&rigidbodyContext, FORM, szNotYetKnown, ID_SHAPE, &shapeContext); - PutCk(&shapeContext, ID_CUBE, 4,(char*)&mass); - PutCk(&shapeContext, ID_DIMENSIONS, sizeof(dimensions),(char*)&dimensions); - ifferr = EndWGroup(&shapeContext) ; - } - ifferr = EndWGroup(&rigidbodyContext) ; - } - - } - ifferr = EndWGroup(&catContext) ; - ifferr = CloseWGroup(&fileContext); - - fclose(file); - } - - { - //show a very simple way to skim through an ILBM or general IFF file - //for more verbose feedback, use iffcheck.c - IFFP result; - //file = fopen("pe_3000_fall.iff","rb"); - file = fopen("test.iff","rb"); - - ClientFrame clientFrame; - - clientFrame.getList = MySkipGroup; - clientFrame.getProp = MySkipGroup; - clientFrame.getForm = MyProcessGroup; - clientFrame.getCat = MyReadICat ; - - result = ReadIFF(file,&clientFrame); - fclose(file); - } - - - return 0; -} +/* +Test read and write IFF-85, Interchange Format File +Copyright (c) 2008 Erwin Coumans http://bulletphysics.com + +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. +*/ + +/* +* IFF Support routines for writing IFF-85 files. 12/02/85 +* (IFF is Interchange Format File.) +* By Jerry Morrison and Steve Shaw, Electronic Arts. +* This software is in the public domain. +* +*/ + +#include + +#include "iff.h" + +IFFP MyReadICat(GroupContext *parent) +{ + printf("Found and skipped a CAT\n"); + return 0; +} + +IFFP MySkipGroup( GroupContext * ) +{ + printf("Found and skipped a LIST\n"); + return 0; +} + +typedef UBYTE Masking; /* Choice of masking technique.*/ +typedef UBYTE Compression; /* Choice of compression algorithm applied to + + /* A BitMapHeader is stored in a BMHD chunk. */ +typedef struct { + + UWORD w, h; /* raster width & height in pixels */ + + WORD x, y; /* position for this image */ + UBYTE nPlanes; /* # source bitplanes */ + Masking masking; /* masking technique */ + Compression compression; /* compression algoithm */ + UBYTE pad1; /* UNUSED. For consistency, put 0 here.*/ + UWORD transparentColor; /* transparent "color number" */ + UBYTE xAspect, yAspect; /* aspect ratio, a rational number x/y */ + WORD pageWidth, pageHeight; /* source "page" size in pixels */ + +} BitMapHeader; + + +#define bufSz 512 +BYTE bodyBuffer[bufSz]; + +static void btSwap(char* a, char* b) +{ + char tmp = *a; + *a = *b; + *b = tmp; +}; + +#define ID_ILBM MakeID('I','L','B','M') +#define ID_BMHD MakeID('B','M','H','D') +#define ID_CMAP MakeID('C','M','A','P') +#define ID_BODY MakeID('B','O','D','Y') + +#define ID_DYNAWORLD MakeID('B','T','D','W') +#define ID_RIGIDBODY MakeID('B','T','R','B') +#define ID_SID MakeID('S','I','D',' ') +#define ID_MASS MakeID('M','A','S','S') +#define ID_SHAPE MakeID('S','H','A','P') + + +#define ID_COLOBJ MakeID('C','O','B','J') +#define ID_CUBE MakeID('C','U','B','E') +#define ID_DIMENSIONS MakeID('D','I','M','E') + + +IFFP MyProcessGroup(GroupContext *parent) +{ + /*compilerBug register*/ IFFP iffp; + GroupContext rigidbodyContext; + + BitMapHeader bmHeader; + bool foundBMHD = false; + + + if (parent->subtype != ID_ILBM) + return(IFF_OKAY); /* just continue scaning the file */ + + iffp = OpenRGroup(parent, &rigidbodyContext); + CheckIFFP(); + + do { + iffp = GetFChunkHdr(&rigidbodyContext); + if (iffp == ID_BMHD) { + printf("found ID_BMHD\n"); + foundBMHD = true; + + iffp = IFFReadBytes(&rigidbodyContext, (BYTE *)&bmHeader, (long)sizeof(BitMapHeader)); + //do endian swap + bmHeader.w = endianSwap16(bmHeader.w); + bmHeader.h = endianSwap16(bmHeader.h); + bmHeader.pageWidth = endianSwap16(bmHeader.pageWidth); + bmHeader.pageHeight = endianSwap16(bmHeader.pageHeight); + } + + else if (iffp == ID_CMAP) { + printf("found ID_CMAP\n"); + + // ilbmFrame.nColorRegs = maxColorReg; /* we have room for this many */ + // iffp = GetCMAP( + // &rigidbodyContext, (WORD *)&ilbmFrame.colorMap, &ilbmFrame.nColorRegs); + } + + else if (iffp == ID_BODY) + { + printf("found ID_BODY\n"); + if (!foundBMHD) + return BAD_FORM; + // if (!ilbmFrame.foundBMHD) return(BAD_FORM); /* No BMHD chunk! */ + + int moreBytes = ChunkMoreBytes(&rigidbodyContext); + while (moreBytes>0) + { + int curRead = moreBytes > bufSz? bufSz : moreBytes; + //read + iffp = IFFReadBytes(&rigidbodyContext, bodyBuffer, curRead); + moreBytes -= curRead; + + } + printf("remaining=%d\n",moreBytes); + if (iffp == IFF_OKAY) + iffp = IFF_DONE; /* Eureka */ + + + + // nPlanes = MIN(ilbmFrame.bmHdr.nPlanes, EXDepth); + } + + else if (iffp == END_MARK) + iffp = BAD_FORM; + + } while (iffp >= IFF_OKAY); /* loop if valid ID of ignored chunk or a + * subroutine returned IFF_OKAY (no errors).*/ + + if (iffp != IFF_DONE) return(iffp); + + /* If we get this far, there were no errors. */ + CloseRGroup(&rigidbodyContext); + return(iffp); +} + + + +#define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);} + + +int main(int argc, char* argv[]) +{ + FILE* file = 0; + + { + //Create and write an IFF file from scratch + file = fopen("test.iff","wb"); + + GroupContext fileContext; + GroupContext catContext; + + IFFP ifferr=0; + + ifferr = OpenWIFF(file, &fileContext, szNotYetKnown) ; + //ifferr = StartWGroup(&fileContext, CAT, szNotYetKnown, ID_DYNAWORLD, &catContext); + ifferr = StartWGroup(&fileContext, LIST, szNotYetKnown, ID_DYNAWORLD, &catContext); + + { + GroupContext rigidbodyPropContext; + ifferr = StartWGroup(&catContext, PROP, szNotYetKnown, ID_MASS, &rigidbodyPropContext); + float mass = 0.1f; + PutCk(&rigidbodyPropContext, ID_MASS, 4,(char*)&mass); + ifferr = EndWGroup(&rigidbodyPropContext) ; + + for (int i=0;i<3;i++) + { + GroupContext rigidbodyContext; + ifferr = StartWGroup(&catContext, FORM, szNotYetKnown, ID_RIGIDBODY, &rigidbodyContext); + char sidbuffer[]="rb1"; + + float dimensions[3] = {2,2,2}; + PutCk(&rigidbodyContext, ID_SID, 3,sidbuffer); + { + GroupContext shapeContext; + ifferr = StartWGroup(&rigidbodyContext, FORM, szNotYetKnown, ID_SHAPE, &shapeContext); + PutCk(&shapeContext, ID_CUBE, 4,(char*)&mass); + PutCk(&shapeContext, ID_DIMENSIONS, sizeof(dimensions),(char*)&dimensions); + ifferr = EndWGroup(&shapeContext) ; + } + ifferr = EndWGroup(&rigidbodyContext) ; + } + + } + ifferr = EndWGroup(&catContext) ; + ifferr = CloseWGroup(&fileContext); + + fclose(file); + } + + { + //show a very simple way to skim through an ILBM or general IFF file + //for more verbose feedback, use iffcheck.c + IFFP result; + //file = fopen("pe_3000_fall.iff","rb"); + file = fopen("test.iff","rb"); + + ClientFrame clientFrame; + + clientFrame.getList = MySkipGroup; + clientFrame.getProp = MySkipGroup; + clientFrame.getForm = MyProcessGroup; + clientFrame.getCat = MyReadICat ; + + result = ReadIFF(file,&clientFrame); + fclose(file); + } + + + return 0; +} diff --git a/Extras/iff/iffr.cpp b/Extras/iff/iffr.cpp index ac0709549..82377e764 100644 --- a/Extras/iff/iffr.cpp +++ b/Extras/iff/iffr.cpp @@ -1,370 +1,370 @@ -/*----------------------------------------------------------------------* -* IFFR.C Support routines for reading IFF-85 files. 11/15/85 -* (IFF is Interchange Format File.) -* -* By Jerry Morrison and Steve Shaw, Electronic Arts. -* This software is in the public domain. -* -* Original version was for the Commodore-Amiga computer. -* This version is compatible with PC, OSX, PS3, Wii, iPhone. 10/26/2008 -*----------------------------------------------------------------------*/ - -#include "iff.h" -/* #include "DF1:iff/gio.h" */ -/* #define OFFSET_BEGINNING OFFSET_BEGINING */ - -/** Manx expects INTs as 16 bits, This wont matter on LAttice ***/ - - - -/* ---------- Read -----------------------------------------------------*/ - -extern int PutID(); /** Added as a diagnostic aid, will remove later ***/ - -/* ---------- OpenRIFF --------------------------------------------------*/ -IFFP OpenRIFF(BPTR file0, GroupContext *new0,ClientFrame *clientFrame) -{ - register BPTR file = file0; - register GroupContext *newtmp = new0; - IFFP iffp = IFF_OKAY; - - newtmp->parent = NL; /* "whole file" has no parent.*/ - newtmp->clientFrame = clientFrame; - newtmp->file = file; - newtmp->position = 0; - newtmp->ckHdr.ckID = newtmp->subtype = NULL_CHUNK; - newtmp->ckHdr.ckSize = newtmp->bytesSoFar = 0; - - /* Set newtmp->bound. AmigaDOS specific code.*/ - if (file <= 0) return(NO_FILE); - Seek(file, 0L, OFFSET_END); /* Seek to end of file.*/ - newtmp->bound = ftell(file);//Seek(file, 0L, OFFSET_CURRENT); /* Pos'n == #bytes in file.*/ - if (newtmp->bound < 0) return(DOS_ERROR); /* DOS being absurd.*/ - Seek(file, 0L, OFFSET_BEGINNING); /* Go to file start.*/ - /* Would just do this if Amiga DOS maintained fh_End: */ - /* newtmp->bound = (FileHandle *)BADDR(file)->fh_End; */ - - if ( newtmp->bound < (long)sizeof(ChunkHeader) ) - iffp = NOT_IFF; - return(iffp); -} - -/* ---------- OpenRGroup -----------------------------------------------*/ -IFFP OpenRGroup(GroupContext* parent0,GroupContext* new0) -{ - register GroupContext *parent = parent0; - register GroupContext *newtmp = new0; - IFFP iffp = IFF_OKAY; - - newtmp->parent = parent; - newtmp->clientFrame = parent->clientFrame; - newtmp->file = parent->file; - newtmp->position = parent->position; - newtmp->bound = parent->position + ChunkMoreBytes(parent); - newtmp->ckHdr.ckID = newtmp->subtype = NULL_CHUNK; - newtmp->ckHdr.ckSize = newtmp->bytesSoFar = 0; - - if ( newtmp->bound > parent->bound || IS_ODD(newtmp->bound) ) - iffp = BAD_IFF; - return(iffp); -} - -/* ---------- CloseRGroup -----------------------------------------------*/ -IFFP CloseRGroup(GroupContext *context) -{ - register int position; - - if (context->parent == NL) { - } /* Context for whole file.*/ - else { - position = context->position; - context->parent->bytesSoFar += position - context->parent->position; - context->parent->position = position; - } - return(IFF_OKAY); -} - -/* ---------- SkipFwd --------------------------------------------------*/ -/* Skip over bytes in a context. Won't go backwards.*/ -/* Updates context->position but not context->bytesSoFar.*/ -/* This implementation is AmigaDOS specific.*/ -IFFP SkipFwd(GroupContext *context,int bytes) -{ - IFFP iffp = IFF_OKAY; - - if (bytes > 0) { - if (-1 == Seek(context->file, bytes, OFFSET_CURRENT)) - iffp = BAD_IFF; /* Ran out of bytes before chunk complete.*/ - else - context->position += bytes; - } - return(iffp); -} - -short int endianSwap16(short int val) -{ - long int i = 1; - const char *p = (const char *) &i; - if (p[0] == 1) // Lowest address contains the least significant byte - { - return (((val & 0xff00) >> 8) | ((val & 0x00ff) << 8)); - } - return val; -} - - - -int endianSwap32(int val) -{ - long int i = 1; - const char *p = (const char *) &i; - if (p[0] == 1) // Lowest address contains the least significant byte - { - return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); - } - return val; -} - - - - - -/* ---------- GetChunkHdr ----------------------------------------------*/ -int GetChunkHdr(GroupContext *context0) -{ - register GroupContext *context = context0; - register IFFP iffp; - int remaining; - - /* Skip remainder of previous chunk & padding. */ - iffp = SkipFwd(context, - ChunkMoreBytes(context) + IS_ODD(context->ckHdr.ckSize)); - CheckIFFP(); - - /* Set up to read the newtmp header. */ - context->ckHdr.ckID = BAD_IFF; /* Until we know it's okay, mark it BAD.*/ - context->subtype = NULL_CHUNK; - context->bytesSoFar = 0; - - /* Generate a psuedo-chunk if at end-of-context. */ - remaining = context->bound - context->position; - if (remaining == 0 ) { - context->ckHdr.ckSize = 0; - context->ckHdr.ckID = END_MARK; - } - /* BAD_IFF if not enough bytes in the context for a ChunkHeader.*/ - else if ((long)sizeof(ChunkHeader) > remaining) { - context->ckHdr.ckSize = remaining; - } - - /* Read the chunk header (finally). */ - else { - switch (Read(context->file, - &context->ckHdr, (long)sizeof(ChunkHeader))) - { - case -1: return(context->ckHdr.ckID = DOS_ERROR); - case 0: return(context->ckHdr.ckID = BAD_IFF); - } - //swap endian-ness of ckSize on little endian machines - context->ckHdr.ckSize = endianSwap32(context->ckHdr.ckSize); - - - - - /*** $$$ *** - PutID(context->ckHdr.ckID); - printf("\n"); - printf("id = %lx\n", context->ckHdr.ckID); - **/ - - /* Check: Top level chunk must be LIST or FORM or CAT. */ - if (context->parent == NL) { - if (context->ckHdr.ckID != FORM && - context->ckHdr.ckID != LIST && - context->ckHdr.ckID != CAT ) - return(context->ckHdr.ckID = NOT_IFF); - } - - /* Update the context. */ - context->position += (long)sizeof(ChunkHeader); - remaining -= (long)sizeof(ChunkHeader); - - /* Non-positive int values are illegal and used for error codes.*/ - /* We could check for other illegal IDs...*/ - if (context->ckHdr.ckID <= 0 ) - context->ckHdr.ckID = BAD_IFF; - - /* Check: ckSize negative or larger than # bytes left in context? */ - else if (context->ckHdr.ckSize < 0 || - context->ckHdr.ckSize > remaining) { - context->ckHdr.ckSize = remaining; - context->ckHdr.ckID = BAD_IFF; - } - - /* Automatically read the LIST, FORM, PROP, or CAT subtype int */ - else { - if (context->ckHdr.ckID == LIST || - context->ckHdr.ckID == FORM || - context->ckHdr.ckID == PROP || - context->ckHdr.ckID == CAT) { - iffp = IFFReadBytes(context, (BYTE *)&context->subtype, - (long)sizeof(int)); - if (iffp != IFF_OKAY ) - context->ckHdr.ckID = iffp; - } - } - } - return(context->ckHdr.ckID); -} - -/* ---------- IFFReadBytes ---------------------------------------------*/ -IFFP IFFReadBytes(GroupContext *context,BYTE *buffer, int nBytes) -{ - register IFFP iffp = IFF_OKAY; - - if (nBytes < 0) - iffp = CLIENT_ERROR; - - else if (nBytes > ChunkMoreBytes(context)) - iffp = SHORT_CHUNK; - - else if (nBytes > 0 ) - switch ( Read(context->file, buffer, nBytes) ) { - case -1: {iffp = DOS_ERROR; break; } - case 0: {iffp = BAD_IFF; break; } - default: { - context->position += nBytes; - context->bytesSoFar += nBytes; - } - } - return(iffp); -} - -/* ---------- SkipGroup ------------------------------------------------*/ -IFFP SkipGroup( GroupContext* context) -{ - return 0; -} /* Nothing to do, thanks to GetChunkHdr */ - -/* ---------- ReadIFF --------------------------------------------------*/ -IFFP ReadIFF(BPTR file,ClientFrame *clientFrame) -{ - /*CompilerBug register*/ IFFP iffp; - GroupContext context; - - iffp = OpenRIFF(file, &context,clientFrame); - context.clientFrame = clientFrame; - - if (iffp == IFF_OKAY) { - iffp = GetChunkHdr(&context); - - if (iffp == FORM) - iffp = (*clientFrame->getForm)(&context); - - else if (iffp == LIST) - iffp = (*clientFrame->getList)(&context); - - else if (iffp == CAT) - iffp = (*clientFrame->getCat)(&context); - } - CloseRGroup(&context); - - if (iffp > 0 ) /* Make sure we don't return an int.*/ - iffp = NOT_IFF; /* GetChunkHdr should've caught this.*/ - return(iffp); -} - -/* ---------- ReadIList ------------------------------------------------*/ -IFFP ReadIList(GroupContext *parent,ClientFrame *clientFrame) -{ - GroupContext listContext; - IFFP iffp; - BOOL propOk = TRUE; - - iffp = OpenRGroup(parent, &listContext); - CheckIFFP(); - - /* One special case test lets us handle CATs as well as LISTs.*/ - if (parent->ckHdr.ckID == CAT) - propOk = FALSE; - else - listContext.clientFrame = clientFrame; - - do { - iffp = GetChunkHdr(&listContext); - if (iffp == PROP) { - if (propOk) - iffp = (*clientFrame->getProp)(&listContext); - else - iffp = BAD_IFF; - } - else if (iffp == FORM) - iffp = (*clientFrame->getForm)(&listContext); - - else if (iffp == LIST) - iffp = (*clientFrame->getList)(&listContext); - - else if (iffp == CAT) - iffp = (*clientFrame->getList)(&listContext); - - if (listContext.ckHdr.ckID != PROP) - propOk = FALSE; /* No PROPs allowed after this point.*/ - } while (iffp == IFF_OKAY); - - CloseRGroup(&listContext); - - if (iffp > 0 ) /* Only chunk types above are allowed in a LIST/CAT.*/ - iffp = BAD_IFF; - return(iffp == END_MARK ? IFF_OKAY : iffp); -} - -/* ---------- ReadICat -------------------------------------------------*/ -/* By special arrangement with the ReadIList implement'n, this is trivial.*/ -IFFP ReadICat(GroupContext *parent) -{ - return( ReadIList(parent, parent->clientFrame));//NL) ); -} - -/* ---------- GetFChunkHdr ---------------------------------------------*/ -int GetFChunkHdr(GroupContext *context) -{ - register int id; - - id = GetChunkHdr(context); - if (id == PROP) - context->ckHdr.ckID = id = BAD_IFF; - return(id); -} - -/* ---------- GetF1ChunkHdr ---------------------------------------------*/ -int GetF1ChunkHdr(GroupContext *context) -{ - register int id; - register ClientFrame *clientFrame = context->clientFrame; - - id = GetChunkHdr(context); - if (id == PROP) - id = BAD_IFF; - - else if (id == FORM) - id = (*clientFrame->getForm)(context); - - else if (id == LIST) - id = (*clientFrame->getForm)(context); - - else if (id == CAT) - id = (*clientFrame->getCat)(context); - - return(context->ckHdr.ckID = id); -} - -/* ---------- GetPChunkHdr ---------------------------------------------*/ -int GetPChunkHdr(GroupContext *context) -{ - register int id; - - id = GetChunkHdr(context); - if (id == LIST || id == FORM || id == PROP || id == CAT ) - id = context->ckHdr.ckID = BAD_IFF; - return(id); -} +/*----------------------------------------------------------------------* +* IFFR.C Support routines for reading IFF-85 files. 11/15/85 +* (IFF is Interchange Format File.) +* +* By Jerry Morrison and Steve Shaw, Electronic Arts. +* This software is in the public domain. +* +* Original version was for the Commodore-Amiga computer. +* This version is compatible with PC, OSX, PS3, Wii, iPhone. 10/26/2008 +*----------------------------------------------------------------------*/ + +#include "iff.h" +/* #include "DF1:iff/gio.h" */ +/* #define OFFSET_BEGINNING OFFSET_BEGINING */ + +/** Manx expects INTs as 16 bits, This wont matter on LAttice ***/ + + + +/* ---------- Read -----------------------------------------------------*/ + +extern int PutID(); /** Added as a diagnostic aid, will remove later ***/ + +/* ---------- OpenRIFF --------------------------------------------------*/ +IFFP OpenRIFF(BPTR file0, GroupContext *new0,ClientFrame *clientFrame) +{ + register BPTR file = file0; + register GroupContext *newtmp = new0; + IFFP iffp = IFF_OKAY; + + newtmp->parent = NL; /* "whole file" has no parent.*/ + newtmp->clientFrame = clientFrame; + newtmp->file = file; + newtmp->position = 0; + newtmp->ckHdr.ckID = newtmp->subtype = NULL_CHUNK; + newtmp->ckHdr.ckSize = newtmp->bytesSoFar = 0; + + /* Set newtmp->bound. AmigaDOS specific code.*/ + if (file <= 0) return(NO_FILE); + Seek(file, 0L, OFFSET_END); /* Seek to end of file.*/ + newtmp->bound = ftell(file);//Seek(file, 0L, OFFSET_CURRENT); /* Pos'n == #bytes in file.*/ + if (newtmp->bound < 0) return(DOS_ERROR); /* DOS being absurd.*/ + Seek(file, 0L, OFFSET_BEGINNING); /* Go to file start.*/ + /* Would just do this if Amiga DOS maintained fh_End: */ + /* newtmp->bound = (FileHandle *)BADDR(file)->fh_End; */ + + if ( newtmp->bound < (long)sizeof(ChunkHeader) ) + iffp = NOT_IFF; + return(iffp); +} + +/* ---------- OpenRGroup -----------------------------------------------*/ +IFFP OpenRGroup(GroupContext* parent0,GroupContext* new0) +{ + register GroupContext *parent = parent0; + register GroupContext *newtmp = new0; + IFFP iffp = IFF_OKAY; + + newtmp->parent = parent; + newtmp->clientFrame = parent->clientFrame; + newtmp->file = parent->file; + newtmp->position = parent->position; + newtmp->bound = parent->position + ChunkMoreBytes(parent); + newtmp->ckHdr.ckID = newtmp->subtype = NULL_CHUNK; + newtmp->ckHdr.ckSize = newtmp->bytesSoFar = 0; + + if ( newtmp->bound > parent->bound || IS_ODD(newtmp->bound) ) + iffp = BAD_IFF; + return(iffp); +} + +/* ---------- CloseRGroup -----------------------------------------------*/ +IFFP CloseRGroup(GroupContext *context) +{ + register int position; + + if (context->parent == NL) { + } /* Context for whole file.*/ + else { + position = context->position; + context->parent->bytesSoFar += position - context->parent->position; + context->parent->position = position; + } + return(IFF_OKAY); +} + +/* ---------- SkipFwd --------------------------------------------------*/ +/* Skip over bytes in a context. Won't go backwards.*/ +/* Updates context->position but not context->bytesSoFar.*/ +/* This implementation is AmigaDOS specific.*/ +IFFP SkipFwd(GroupContext *context,int bytes) +{ + IFFP iffp = IFF_OKAY; + + if (bytes > 0) { + if (-1 == Seek(context->file, bytes, OFFSET_CURRENT)) + iffp = BAD_IFF; /* Ran out of bytes before chunk complete.*/ + else + context->position += bytes; + } + return(iffp); +} + +short int endianSwap16(short int val) +{ + long int i = 1; + const char *p = (const char *) &i; + if (p[0] == 1) // Lowest address contains the least significant byte + { + return (((val & 0xff00) >> 8) | ((val & 0x00ff) << 8)); + } + return val; +} + + + +int endianSwap32(int val) +{ + long int i = 1; + const char *p = (const char *) &i; + if (p[0] == 1) // Lowest address contains the least significant byte + { + return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); + } + return val; +} + + + + + +/* ---------- GetChunkHdr ----------------------------------------------*/ +int GetChunkHdr(GroupContext *context0) +{ + register GroupContext *context = context0; + register IFFP iffp; + int remaining; + + /* Skip remainder of previous chunk & padding. */ + iffp = SkipFwd(context, + ChunkMoreBytes(context) + IS_ODD(context->ckHdr.ckSize)); + CheckIFFP(); + + /* Set up to read the newtmp header. */ + context->ckHdr.ckID = BAD_IFF; /* Until we know it's okay, mark it BAD.*/ + context->subtype = NULL_CHUNK; + context->bytesSoFar = 0; + + /* Generate a psuedo-chunk if at end-of-context. */ + remaining = context->bound - context->position; + if (remaining == 0 ) { + context->ckHdr.ckSize = 0; + context->ckHdr.ckID = END_MARK; + } + /* BAD_IFF if not enough bytes in the context for a ChunkHeader.*/ + else if ((long)sizeof(ChunkHeader) > remaining) { + context->ckHdr.ckSize = remaining; + } + + /* Read the chunk header (finally). */ + else { + switch (Read(context->file, + &context->ckHdr, (long)sizeof(ChunkHeader))) + { + case -1: return(context->ckHdr.ckID = DOS_ERROR); + case 0: return(context->ckHdr.ckID = BAD_IFF); + } + //swap endian-ness of ckSize on little endian machines + context->ckHdr.ckSize = endianSwap32(context->ckHdr.ckSize); + + + + + /*** $$$ *** + PutID(context->ckHdr.ckID); + printf("\n"); + printf("id = %lx\n", context->ckHdr.ckID); + **/ + + /* Check: Top level chunk must be LIST or FORM or CAT. */ + if (context->parent == NL) { + if (context->ckHdr.ckID != FORM && + context->ckHdr.ckID != LIST && + context->ckHdr.ckID != CAT ) + return(context->ckHdr.ckID = NOT_IFF); + } + + /* Update the context. */ + context->position += (long)sizeof(ChunkHeader); + remaining -= (long)sizeof(ChunkHeader); + + /* Non-positive int values are illegal and used for error codes.*/ + /* We could check for other illegal IDs...*/ + if (context->ckHdr.ckID <= 0 ) + context->ckHdr.ckID = BAD_IFF; + + /* Check: ckSize negative or larger than # bytes left in context? */ + else if (context->ckHdr.ckSize < 0 || + context->ckHdr.ckSize > remaining) { + context->ckHdr.ckSize = remaining; + context->ckHdr.ckID = BAD_IFF; + } + + /* Automatically read the LIST, FORM, PROP, or CAT subtype int */ + else { + if (context->ckHdr.ckID == LIST || + context->ckHdr.ckID == FORM || + context->ckHdr.ckID == PROP || + context->ckHdr.ckID == CAT) { + iffp = IFFReadBytes(context, (BYTE *)&context->subtype, + (long)sizeof(int)); + if (iffp != IFF_OKAY ) + context->ckHdr.ckID = iffp; + } + } + } + return(context->ckHdr.ckID); +} + +/* ---------- IFFReadBytes ---------------------------------------------*/ +IFFP IFFReadBytes(GroupContext *context,BYTE *buffer, int nBytes) +{ + register IFFP iffp = IFF_OKAY; + + if (nBytes < 0) + iffp = CLIENT_ERROR; + + else if (nBytes > ChunkMoreBytes(context)) + iffp = SHORT_CHUNK; + + else if (nBytes > 0 ) + switch ( Read(context->file, buffer, nBytes) ) { + case -1: {iffp = DOS_ERROR; break; } + case 0: {iffp = BAD_IFF; break; } + default: { + context->position += nBytes; + context->bytesSoFar += nBytes; + } + } + return(iffp); +} + +/* ---------- SkipGroup ------------------------------------------------*/ +IFFP SkipGroup( GroupContext* context) +{ + return 0; +} /* Nothing to do, thanks to GetChunkHdr */ + +/* ---------- ReadIFF --------------------------------------------------*/ +IFFP ReadIFF(BPTR file,ClientFrame *clientFrame) +{ + /*CompilerBug register*/ IFFP iffp; + GroupContext context; + + iffp = OpenRIFF(file, &context,clientFrame); + context.clientFrame = clientFrame; + + if (iffp == IFF_OKAY) { + iffp = GetChunkHdr(&context); + + if (iffp == FORM) + iffp = (*clientFrame->getForm)(&context); + + else if (iffp == LIST) + iffp = (*clientFrame->getList)(&context); + + else if (iffp == CAT) + iffp = (*clientFrame->getCat)(&context); + } + CloseRGroup(&context); + + if (iffp > 0 ) /* Make sure we don't return an int.*/ + iffp = NOT_IFF; /* GetChunkHdr should've caught this.*/ + return(iffp); +} + +/* ---------- ReadIList ------------------------------------------------*/ +IFFP ReadIList(GroupContext *parent,ClientFrame *clientFrame) +{ + GroupContext listContext; + IFFP iffp; + BOOL propOk = TRUE; + + iffp = OpenRGroup(parent, &listContext); + CheckIFFP(); + + /* One special case test lets us handle CATs as well as LISTs.*/ + if (parent->ckHdr.ckID == CAT) + propOk = FALSE; + else + listContext.clientFrame = clientFrame; + + do { + iffp = GetChunkHdr(&listContext); + if (iffp == PROP) { + if (propOk) + iffp = (*clientFrame->getProp)(&listContext); + else + iffp = BAD_IFF; + } + else if (iffp == FORM) + iffp = (*clientFrame->getForm)(&listContext); + + else if (iffp == LIST) + iffp = (*clientFrame->getList)(&listContext); + + else if (iffp == CAT) + iffp = (*clientFrame->getList)(&listContext); + + if (listContext.ckHdr.ckID != PROP) + propOk = FALSE; /* No PROPs allowed after this point.*/ + } while (iffp == IFF_OKAY); + + CloseRGroup(&listContext); + + if (iffp > 0 ) /* Only chunk types above are allowed in a LIST/CAT.*/ + iffp = BAD_IFF; + return(iffp == END_MARK ? IFF_OKAY : iffp); +} + +/* ---------- ReadICat -------------------------------------------------*/ +/* By special arrangement with the ReadIList implement'n, this is trivial.*/ +IFFP ReadICat(GroupContext *parent) +{ + return( ReadIList(parent, parent->clientFrame));//NL) ); +} + +/* ---------- GetFChunkHdr ---------------------------------------------*/ +int GetFChunkHdr(GroupContext *context) +{ + register int id; + + id = GetChunkHdr(context); + if (id == PROP) + context->ckHdr.ckID = id = BAD_IFF; + return(id); +} + +/* ---------- GetF1ChunkHdr ---------------------------------------------*/ +int GetF1ChunkHdr(GroupContext *context) +{ + register int id; + register ClientFrame *clientFrame = context->clientFrame; + + id = GetChunkHdr(context); + if (id == PROP) + id = BAD_IFF; + + else if (id == FORM) + id = (*clientFrame->getForm)(context); + + else if (id == LIST) + id = (*clientFrame->getForm)(context); + + else if (id == CAT) + id = (*clientFrame->getCat)(context); + + return(context->ckHdr.ckID = id); +} + +/* ---------- GetPChunkHdr ---------------------------------------------*/ +int GetPChunkHdr(GroupContext *context) +{ + register int id; + + id = GetChunkHdr(context); + if (id == LIST || id == FORM || id == PROP || id == CAT ) + id = context->ckHdr.ckID = BAD_IFF; + return(id); +} diff --git a/Extras/khx2dae/readme.txt b/Extras/khx2dae/readme.txt index 569efc13f..76ec94bf3 100644 --- a/Extras/khx2dae/readme.txt +++ b/Extras/khx2dae/readme.txt @@ -1,6 +1,6 @@ - -hkx2dae converts Havok HKX files to COLLADA Physics .dae files. So Havok tools can be used with any COLLADA Physics enabled application, such as the Bullet physics engine. -Use the patch in combination with the free Havok 5.5 version to add COLLADA Physics export to the Havok SimpleLoad serialization sample (hk550\Demo\Demos\Common\Api\Serialize\SimpleLoad). - -For precompiled binary and further information, visit: -http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=12&t=2218 + +hkx2dae converts Havok HKX files to COLLADA Physics .dae files. So Havok tools can be used with any COLLADA Physics enabled application, such as the Bullet physics engine. +Use the patch in combination with the free Havok 5.5 version to add COLLADA Physics export to the Havok SimpleLoad serialization sample (hk550\Demo\Demos\Common\Api\Serialize\SimpleLoad). + +For precompiled binary and further information, visit: +http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=12&t=2218 diff --git a/Extras/simdmathlibrary/LICENSE b/Extras/simdmathlibrary/LICENSE index 1572d751e..5c316537d 100644 --- a/Extras/simdmathlibrary/LICENSE +++ b/Extras/simdmathlibrary/LICENSE @@ -1,28 +1,28 @@ - SIMD math library functions for both the PowerPC (PPU) and the SPU. - Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - All rights reserved. - - Redistribution and use in source and binary forms, - with or without modification, are permitted provided that the - following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Sony Computer Entertainment Inc nor the names - of its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - + SIMD math library functions for both the PowerPC (PPU) and the SPU. + Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + All rights reserved. + + Redistribution and use in source and binary forms, + with or without modification, are permitted provided that the + following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Sony Computer Entertainment Inc nor the names + of its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + diff --git a/Extras/simdmathlibrary/Make.defs b/Extras/simdmathlibrary/Make.defs index ef621e3eb..87e9aee9b 100644 --- a/Extras/simdmathlibrary/Make.defs +++ b/Extras/simdmathlibrary/Make.defs @@ -1,92 +1,92 @@ -# -*- Makefile -*- -# Common definition for all make files in the libsimdmath library. -# Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, -# with or without modification, are permitted provided that the -# following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the Sony Computer Entertainment Inc nor the names -# of its contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# PowerPC (32 bit) -ARCH_CFLAGS_ppu = -m32 -maltivec -mabi=altivec -fPIC -ARCH_LDFLAGS_ppu = -m32 -ENABLE_STATIC_ppu = 1 -ENABLE_SHARED_ppu = 1 - -# PowerPC (64 bit) -ARCH_DIR_ppu64 = ppu -ARCH_CFLAGS_ppu64 = -m64 -maltivec -mabi=altivec -fPIC -ARCH_LDFLAGS_ppu64 = -m64 -ENABLE_STATIC_ppu64 = 1 -ENABLE_SHARED_ppu64 = 1 - -# SPU -prefix_spu = /usr/spu -CROSS_spu = spu- -ENABLE_STATIC_spu = 1 -ENABLE_SHARED_spu = 0 - -# Common -prefix = $(if $(prefix_$(ARCH)),$(prefix_$(ARCH)),/usr) -DESTDIR = - -ARCH_DIR = $(if $(ARCH_DIR_$(ARCH)),$(ARCH_DIR_$(ARCH)),$(ARCH)) - -CROSS = $(CROSS_$(ARCH)) - -AR = $(CROSS)ar -CC= $(CROSS)gcc -CXX = $(CROSS)g++ -RANLIB = $(CROSS)ranlib - -ARCH_CFLAGS = $(ARCH_CFLAGS_$(ARCH)) -ARCH_LDFLAGS = $(ARCH_LDFLAGS_$(ARCH)) - -CFLAGS = -O2 -W -Wall -std=gnu99 -I. -I$(topdir)/common $(ARCH_CFLAGS) -LDFLAGS = $(ARCH_LDFLAGS) - -ENABLE_STATIC = $(ENABLE_STATIC_$(ARCH)) -ENABLE_SHARED = $(ENABLE_SHARED_$(ARCH)) - -INSTALL = install - -TEST_CMD = - -LIB_MAJOR_VERSION = 1 -LIB_MINOR_VERSION = 0 -LIB_RELEASE = 2 -LIB_FULL_VERSION = $(LIB_MAJOR_VERSION).$(LIB_MINOR_VERSION).$(LIB_RELEASE) - -LIB_BASE = simdmath -LIB_NAME = lib$(LIB_BASE) - -STATIC_LIB = $(LIB_NAME).a -ALL_STATIC_LIBS = $(STATIC_LIB) - -SHARED_LIB = $(LIB_NAME).so -SHARED_LIB_SONAME = $(SHARED_LIB).$(LIB_MAJOR_VERSION) -SHARED_LIB_FULL = $(SHARED_LIB).$(LIB_FULL_VERSION) -ALL_SHARED_LIBS = $(SHARED_LIB) $(SHARED_LIB_FULL) $(SHARED_LIB_SONAME) - -TAR_NAME = $(LIB_BASE)-$(LIB_FULL_VERSION) -TAR_BALL = $(TAR_NAME).tar.gz +# -*- Makefile -*- +# Common definition for all make files in the libsimdmath library. +# Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, +# with or without modification, are permitted provided that the +# following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the Sony Computer Entertainment Inc nor the names +# of its contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# PowerPC (32 bit) +ARCH_CFLAGS_ppu = -m32 -maltivec -mabi=altivec -fPIC +ARCH_LDFLAGS_ppu = -m32 +ENABLE_STATIC_ppu = 1 +ENABLE_SHARED_ppu = 1 + +# PowerPC (64 bit) +ARCH_DIR_ppu64 = ppu +ARCH_CFLAGS_ppu64 = -m64 -maltivec -mabi=altivec -fPIC +ARCH_LDFLAGS_ppu64 = -m64 +ENABLE_STATIC_ppu64 = 1 +ENABLE_SHARED_ppu64 = 1 + +# SPU +prefix_spu = /usr/spu +CROSS_spu = spu- +ENABLE_STATIC_spu = 1 +ENABLE_SHARED_spu = 0 + +# Common +prefix = $(if $(prefix_$(ARCH)),$(prefix_$(ARCH)),/usr) +DESTDIR = + +ARCH_DIR = $(if $(ARCH_DIR_$(ARCH)),$(ARCH_DIR_$(ARCH)),$(ARCH)) + +CROSS = $(CROSS_$(ARCH)) + +AR = $(CROSS)ar +CC= $(CROSS)gcc +CXX = $(CROSS)g++ +RANLIB = $(CROSS)ranlib + +ARCH_CFLAGS = $(ARCH_CFLAGS_$(ARCH)) +ARCH_LDFLAGS = $(ARCH_LDFLAGS_$(ARCH)) + +CFLAGS = -O2 -W -Wall -std=gnu99 -I. -I$(topdir)/common $(ARCH_CFLAGS) +LDFLAGS = $(ARCH_LDFLAGS) + +ENABLE_STATIC = $(ENABLE_STATIC_$(ARCH)) +ENABLE_SHARED = $(ENABLE_SHARED_$(ARCH)) + +INSTALL = install + +TEST_CMD = + +LIB_MAJOR_VERSION = 1 +LIB_MINOR_VERSION = 0 +LIB_RELEASE = 2 +LIB_FULL_VERSION = $(LIB_MAJOR_VERSION).$(LIB_MINOR_VERSION).$(LIB_RELEASE) + +LIB_BASE = simdmath +LIB_NAME = lib$(LIB_BASE) + +STATIC_LIB = $(LIB_NAME).a +ALL_STATIC_LIBS = $(STATIC_LIB) + +SHARED_LIB = $(LIB_NAME).so +SHARED_LIB_SONAME = $(SHARED_LIB).$(LIB_MAJOR_VERSION) +SHARED_LIB_FULL = $(SHARED_LIB).$(LIB_FULL_VERSION) +ALL_SHARED_LIBS = $(SHARED_LIB) $(SHARED_LIB_FULL) $(SHARED_LIB_SONAME) + +TAR_NAME = $(LIB_BASE)-$(LIB_FULL_VERSION) +TAR_BALL = $(TAR_NAME).tar.gz diff --git a/Extras/simdmathlibrary/Make.rules b/Extras/simdmathlibrary/Make.rules index 5cc8cc949..ff58e2fb4 100644 --- a/Extras/simdmathlibrary/Make.rules +++ b/Extras/simdmathlibrary/Make.rules @@ -1,82 +1,82 @@ -# -*- Makefile -*- -# Common make rules for all make files in the libsimdmath library. -# Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, -# with or without modification, are permitted provided that the -# following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the Sony Computer Entertainment Inc nor the names -# of its contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -ifeq ($(ENABLE_STATIC),1) - ALL_LIBS += $(ALL_STATIC_LIBS) - INSTALL_LIBS += install-static -endif - -ifeq ($(ENABLE_SHARED),1) - ALL_LIBS += $(ALL_SHARED_LIBS) - INSTALL_LIBS += install-shared -endif - -all: $(ALL_LIBS) - -static: $(STATIC_LIB) - -shared: $(SHARED_LIB) - -$(STATIC_LIB): $(OBJS) - $(AR) cr $@ $(OBJS) - $(RANLIB) $@ - -$(SHARED_LIB_FULL): $(OBJS) - $(CC) -shared $(OBJS) -o $@ $(LDFLAGS) -Wl,-h,$(SHARED_LIB_SONAME) - -$(SHARED_LIB) $(SHARED_LIB_SONAME): $(SHARED_LIB_FULL) - ln -fs $(SHARED_LIB_FULL) $@ - -install: install-headers $(INSTALL_LIBS) - -install-headers: - $(INSTALL) -m 755 -d $(DESTDIR)$(prefix)/include - $(INSTALL) -m 755 -d $(DESTDIR)$(prefix)/include/simdmath - $(INSTALL) -m 644 simdmath/*.h $(DESTDIR)$(prefix)/include/simdmath/ - -install-static: $(ALL_STATIC_LIBS) - $(INSTALL) -m 755 -d $(DESTDIR)$(prefix)/lib - $(INSTALL) -m 644 $(STATIC_LIB) $(DESTDIR)$(prefix)/lib/$(STATIC_LIB) - -install-shared: $(ALL_SHARED_LIBS) - $(INSTALL) -m 755 $(SHARED_LIB_FULL) $(DESTDIR)$(prefix)/lib/$(SHARED_LIB_FULL) - ln -fs $(SHARED_LIB_FULL) $(DESTDIR)$(prefix)/lib/$(SHARED_LIB_SONAME) - ln -fs $(SHARED_LIB_SONAME) $(DESTDIR)$(prefix)/lib/$(SHARED_LIB) - -clean: - $(MAKE) -C tests clean - -rm -f $(OBJS) - -rm -f $(STATIC_LIB) $(SHARED_LIB) $(SHARED_LIB_SONAME) $(SHARED_LIB_FULL) - -check: $(ALL_LIBS) - $(MAKE) -C tests all - $(MAKE) -C tests check - -%.o: ../common/%.c simdmath/%.h - $(CC) $(CFLAGS) -c -o $@ $< +# -*- Makefile -*- +# Common make rules for all make files in the libsimdmath library. +# Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, +# with or without modification, are permitted provided that the +# following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the Sony Computer Entertainment Inc nor the names +# of its contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +ifeq ($(ENABLE_STATIC),1) + ALL_LIBS += $(ALL_STATIC_LIBS) + INSTALL_LIBS += install-static +endif + +ifeq ($(ENABLE_SHARED),1) + ALL_LIBS += $(ALL_SHARED_LIBS) + INSTALL_LIBS += install-shared +endif + +all: $(ALL_LIBS) + +static: $(STATIC_LIB) + +shared: $(SHARED_LIB) + +$(STATIC_LIB): $(OBJS) + $(AR) cr $@ $(OBJS) + $(RANLIB) $@ + +$(SHARED_LIB_FULL): $(OBJS) + $(CC) -shared $(OBJS) -o $@ $(LDFLAGS) -Wl,-h,$(SHARED_LIB_SONAME) + +$(SHARED_LIB) $(SHARED_LIB_SONAME): $(SHARED_LIB_FULL) + ln -fs $(SHARED_LIB_FULL) $@ + +install: install-headers $(INSTALL_LIBS) + +install-headers: + $(INSTALL) -m 755 -d $(DESTDIR)$(prefix)/include + $(INSTALL) -m 755 -d $(DESTDIR)$(prefix)/include/simdmath + $(INSTALL) -m 644 simdmath/*.h $(DESTDIR)$(prefix)/include/simdmath/ + +install-static: $(ALL_STATIC_LIBS) + $(INSTALL) -m 755 -d $(DESTDIR)$(prefix)/lib + $(INSTALL) -m 644 $(STATIC_LIB) $(DESTDIR)$(prefix)/lib/$(STATIC_LIB) + +install-shared: $(ALL_SHARED_LIBS) + $(INSTALL) -m 755 $(SHARED_LIB_FULL) $(DESTDIR)$(prefix)/lib/$(SHARED_LIB_FULL) + ln -fs $(SHARED_LIB_FULL) $(DESTDIR)$(prefix)/lib/$(SHARED_LIB_SONAME) + ln -fs $(SHARED_LIB_SONAME) $(DESTDIR)$(prefix)/lib/$(SHARED_LIB) + +clean: + $(MAKE) -C tests clean + -rm -f $(OBJS) + -rm -f $(STATIC_LIB) $(SHARED_LIB) $(SHARED_LIB_SONAME) $(SHARED_LIB_FULL) + +check: $(ALL_LIBS) + $(MAKE) -C tests all + $(MAKE) -C tests check + +%.o: ../common/%.c simdmath/%.h + $(CC) $(CFLAGS) -c -o $@ $< diff --git a/Extras/simdmathlibrary/Make.test b/Extras/simdmathlibrary/Make.test index 1f1325ca8..59c977276 100644 --- a/Extras/simdmathlibrary/Make.test +++ b/Extras/simdmathlibrary/Make.test @@ -1,87 +1,87 @@ -# -*- Makefile -*- -# Common make rules for tests in the libsimdmath library. -# Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, -# with or without modification, are permitted provided that the -# following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the Sony Computer Entertainment Inc nor the names -# of its contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -STATIC_TESTS = $(TESTS) -SHARED_TESTS = $(TESTS:=.shared) - -ifeq ($(ENABLE_STATIC),1) - ALL_TESTS += $(STATIC_TESTS) -endif - -ifeq ($(ENABLE_SHARED),1) - ALL_TESTS += $(SHARED_TESTS) -endif - -STATIC_LDFLAGS = -static -SHARED_LDFLAGS = -Wl,-rpath=.. - -LDFLAGS += -L../ -l$(LIB_BASE) -lm - -all: $(ALL_TESTS) - -$(STATIC_TESTS): %: %.o ../$(STATIC_LIB) $(OBJS) - $(CC) $*.o $(OBJS) $(LDFLAGS) $(STATIC_LDFLAGS) -o $@ - -$(SHARED_TESTS): %.shared: %.o ../$(SHARED_LIB) $(OBJS) - $(CC) $*.o $(OBJS) $(LDFLAGS) $(SHARED_LDFLAGS) -o $@ - -clean: - rm -f *.o - rm -f $(STATIC_TESTS) $(SHARED_TESTS) - rm -f core* - -check: $(ALL_TESTS) - for test in $(ALL_TESTS); do \ - echo "TEST $${test}"; \ - if $(TEST_CMD) ./$${test}; then \ - pass="$$pass $$test"; \ - else \ - fail="$$fail $$test"; \ - fi \ - done; \ - echo; echo "PASS:$$pass"; echo "FAIL:$$fail"; \ - test -z "$$fail" - -static_check: - $(MAKE) ALL_TESTS="$(STATIC_TESTS)" check - -shared_check: - $(MAKE) ALL_TESTS="$(SHARED_TESTS)" check - -../$(STATIC_LIB): - $(MAKE) -C .. $(STATIC_LIB) - -../$(SHARED_LIB): - $(MAKE) -C .. $(SHARED_LIB) - -%.o: %.c - $(CC) $(CFLAGS) -c -o $@ $< - -%.o: %.cc - $(CXX) $(CFLAGS) -c -o $@ $< +# -*- Makefile -*- +# Common make rules for tests in the libsimdmath library. +# Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, +# with or without modification, are permitted provided that the +# following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the Sony Computer Entertainment Inc nor the names +# of its contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +STATIC_TESTS = $(TESTS) +SHARED_TESTS = $(TESTS:=.shared) + +ifeq ($(ENABLE_STATIC),1) + ALL_TESTS += $(STATIC_TESTS) +endif + +ifeq ($(ENABLE_SHARED),1) + ALL_TESTS += $(SHARED_TESTS) +endif + +STATIC_LDFLAGS = -static +SHARED_LDFLAGS = -Wl,-rpath=.. + +LDFLAGS += -L../ -l$(LIB_BASE) -lm + +all: $(ALL_TESTS) + +$(STATIC_TESTS): %: %.o ../$(STATIC_LIB) $(OBJS) + $(CC) $*.o $(OBJS) $(LDFLAGS) $(STATIC_LDFLAGS) -o $@ + +$(SHARED_TESTS): %.shared: %.o ../$(SHARED_LIB) $(OBJS) + $(CC) $*.o $(OBJS) $(LDFLAGS) $(SHARED_LDFLAGS) -o $@ + +clean: + rm -f *.o + rm -f $(STATIC_TESTS) $(SHARED_TESTS) + rm -f core* + +check: $(ALL_TESTS) + for test in $(ALL_TESTS); do \ + echo "TEST $${test}"; \ + if $(TEST_CMD) ./$${test}; then \ + pass="$$pass $$test"; \ + else \ + fail="$$fail $$test"; \ + fi \ + done; \ + echo; echo "PASS:$$pass"; echo "FAIL:$$fail"; \ + test -z "$$fail" + +static_check: + $(MAKE) ALL_TESTS="$(STATIC_TESTS)" check + +shared_check: + $(MAKE) ALL_TESTS="$(SHARED_TESTS)" check + +../$(STATIC_LIB): + $(MAKE) -C .. $(STATIC_LIB) + +../$(SHARED_LIB): + $(MAKE) -C .. $(SHARED_LIB) + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +%.o: %.cc + $(CXX) $(CFLAGS) -c -o $@ $< diff --git a/Extras/software_cache/cache/CommonPublicLicense-1.0 b/Extras/software_cache/cache/CommonPublicLicense-1.0 index 5723258b5..c9990a7ea 100644 --- a/Extras/software_cache/cache/CommonPublicLicense-1.0 +++ b/Extras/software_cache/cache/CommonPublicLicense-1.0 @@ -1,213 +1,213 @@ -Common Public License Version 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - - i) changes to the Program, and - - ii) additions to the Program; - - where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from a -Contributor if it was added to the Program by such Contributor itself or anyone -acting on such Contributor's behalf. Contributions do not include additions to -the Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) are not -derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents " mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and such -derivative works, in source code and object code form. - - b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed -Patents to make, use, sell, offer to sell, import and otherwise transfer the -Contribution of such Contributor, if any, in source code and object code form. -This patent license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, such -addition of the Contribution causes such combination to be covered by the -Licensed Patents. The patent license shall not apply to any other combinations -which include the Contribution. No hardware per se is licensed hereunder. - - c) Recipient understands that although each Contributor grants the licenses -to its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other intellectual -property rights of any other entity. Each Contributor disclaims any liability to -Recipient for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, each Recipient hereby assumes sole -responsibility to secure any other intellectual property rights needed, if any. -For example, if a third party patent license is required to allow Recipient to -distribute the Program, it is Recipient's responsibility to acquire that license -before distributing the Program. - - d) Each Contributor represents that to its knowledge it has sufficient -copyright rights in its Contribution, if any, to grant the copyright license set -forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its -own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - - b) its license agreement: - - i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title and -non-infringement, and implied warranties or conditions of merchantability and -fitness for a particular purpose; - - ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; - - iii) states that any provisions which differ from this Agreement are offered -by that Contributor alone and not by any other party; and - - iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on or -through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - - b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within the -Program. - -Each Contributor must identify itself as the originator of its Contribution, if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement, including but not limited to the risks and costs of -program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this Agreement, and without further action by the parties hereto, such -provision shall be reformed to the minimum extent necessary to make such -provision valid and enforceable. - -If Recipient institutes patent litigation against a Contributor with respect to -a patent applicable to software (including a cross-claim or counterclaim in a -lawsuit), then any patent licenses granted by that Contributor to such Recipient -under this Agreement shall terminate as of the date such litigation is filed. In -addition, if Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the Program -itself (excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -IBM is the initial Agreement Steward. IBM may assign the responsibility to serve -as the Agreement Steward to a suitable separate entity. Each new version of the -Agreement will be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the Agreement -under which it was received. In addition, after a new version of the Agreement -is published, Contributor may elect to distribute the Program (including its -Contributions) under the new version. Except as expressly stated in Sections -2(a) and 2(b) above, Recipient receives no rights or licenses to the -intellectual property of any Contributor under this Agreement, whether -expressly, by implication, estoppel or otherwise. All rights in the Program not -expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. +Common Public License Version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and +documentation distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are +distributed by that particular Contributor. A Contribution 'originates' from a +Contributor if it was added to the Program by such Contributor itself or anyone +acting on such Contributor's behalf. Contributions do not include additions to +the Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) are not +derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free copyright license to +reproduce, prepare derivative works of, publicly display, publicly perform, +distribute and sublicense the Contribution of such Contributor, if any, and such +derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed +Patents to make, use, sell, offer to sell, import and otherwise transfer the +Contribution of such Contributor, if any, in source code and object code form. +This patent license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, such +addition of the Contribution causes such combination to be covered by the +Licensed Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses +to its Contributions set forth herein, no assurances are provided by any +Contributor that the Program does not infringe the patent or other intellectual +property rights of any other entity. Each Contributor disclaims any liability to +Recipient for claims brought by any other entity based on infringement of +intellectual property rights or otherwise. As a condition to exercising the +rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. +For example, if a third party patent license is required to allow Recipient to +distribute the Program, it is Recipient's responsibility to acquire that license +before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright license set +forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its +own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title and +non-infringement, and implied warranties or conditions of merchantability and +fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and consequential +damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are offered +by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such +Contributor, and informs licensees how to obtain it in a reasonable manner on or +through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the +Program. + +Each Contributor must identify itself as the originator of its Contribution, if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, if +a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages +and costs (collectively "Losses") arising from claims, lawsuits and other legal +actions brought by a third party against the Indemnified Contributor to the +extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor to +control, and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may participate in +any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If that +Commercial Contributor then makes performance claims, or offers warranties +related to Product X, those performance claims and warranties are such +Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its exercise of +rights under this Agreement, including but not limited to the risks and costs of +program errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS +GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this Agreement, and without further action by the parties hereto, such +provision shall be reformed to the minimum extent necessary to make such +provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to +a patent applicable to software (including a cross-claim or counterclaim in a +lawsuit), then any patent licenses granted by that Contributor to such Recipient +under this Agreement shall terminate as of the date such litigation is filed. In +addition, if Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted under +Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to time. +No one other than the Agreement Steward has the right to modify this Agreement. +IBM is the initial Agreement Steward. IBM may assign the responsibility to serve +as the Agreement Steward to a suitable separate entity. Each new version of the +Agreement will be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the Agreement +is published, Contributor may elect to distribute the Program (including its +Contributions) under the new version. Except as expressly stated in Sections +2(a) and 2(b) above, Recipient receives no rights or licenses to the +intellectual property of any Contributor under this Agreement, whether +expressly, by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. diff --git a/Extras/software_cache/cache/include/Makefile b/Extras/software_cache/cache/include/Makefile index 27a5c4347..51c620275 100644 --- a/Extras/software_cache/cache/include/Makefile +++ b/Extras/software_cache/cache/include/Makefile @@ -1,28 +1,28 @@ -# --------------------------------------------------------------- -# PLEASE DO NOT MODIFY THIS SECTION -# This prolog section is automatically generated. -# -# (C) Copyright 2001,2006, -# International Business Machines Corporation, -# -# All Rights Reserved. -# --------------------------------------------------------------- -# PROLOG END TAG zYx - -######################################################################## -# Common Makefile -######################################################################## - -INSTALL_DIR = $(SDKINC_spu)/cache - -INSTALL_FILES := api.h \ - defs.h \ - dma.h \ - nway.h \ - nway-lookup.h \ - nway-miss.h \ - nway-opt.h \ - nway-replace.h \ - spe_cache.h - -include ../../../../../make.footer +# --------------------------------------------------------------- +# PLEASE DO NOT MODIFY THIS SECTION +# This prolog section is automatically generated. +# +# (C) Copyright 2001,2006, +# International Business Machines Corporation, +# +# All Rights Reserved. +# --------------------------------------------------------------- +# PROLOG END TAG zYx + +######################################################################## +# Common Makefile +######################################################################## + +INSTALL_DIR = $(SDKINC_spu)/cache + +INSTALL_FILES := api.h \ + defs.h \ + dma.h \ + nway.h \ + nway-lookup.h \ + nway-miss.h \ + nway-opt.h \ + nway-replace.h \ + spe_cache.h + +include ../../../../../make.footer diff --git a/Extras/software_cache/cache/include/README b/Extras/software_cache/cache/include/README index b0e532433..85268b860 100644 --- a/Extras/software_cache/cache/include/README +++ b/Extras/software_cache/cache/include/README @@ -1,32 +1,32 @@ -%% --------------------------------------------------------------- -%% PLEASE DO NOT MODIFY THIS SECTION -%% This prolog section is automatically generated. -%% -%% (C) Copyright 2001,2006, -%% International Business Machines Corporation, -%% -%% All Rights Reserved. -%% --------------------------------------------------------------- -%% PROLOG END TAG zYx -This directory contains implementation of software managed cache for -SPE. Whenever possible, the cache interfaces are implemented as macros -or inline-able functions. - -Depending on compile-time settings, different cache implementations can -be selected. - -The include file heirarchy is: - - + spe_cache.h Top level header. - | - + defs.h Common definitions. - + dma.h Initiate DMA transfers. - + nway.h Top level n-way header. - | - + nway-lookup.h n-way lookup operations. - + nway-miss.h n-way cache miss handler. - + nway-replace.h n-way cache replace handler. - + nway-opt.h "optimized" n-way interfaces. - | - + api.h Basic application interfaces. - +%% --------------------------------------------------------------- +%% PLEASE DO NOT MODIFY THIS SECTION +%% This prolog section is automatically generated. +%% +%% (C) Copyright 2001,2006, +%% International Business Machines Corporation, +%% +%% All Rights Reserved. +%% --------------------------------------------------------------- +%% PROLOG END TAG zYx +This directory contains implementation of software managed cache for +SPE. Whenever possible, the cache interfaces are implemented as macros +or inline-able functions. + +Depending on compile-time settings, different cache implementations can +be selected. + +The include file heirarchy is: + + + spe_cache.h Top level header. + | + + defs.h Common definitions. + + dma.h Initiate DMA transfers. + + nway.h Top level n-way header. + | + + nway-lookup.h n-way lookup operations. + + nway-miss.h n-way cache miss handler. + + nway-replace.h n-way cache replace handler. + + nway-opt.h "optimized" n-way interfaces. + | + + api.h Basic application interfaces. + diff --git a/Extras/software_cache/cache/include/api.h b/Extras/software_cache/cache/include/api.h index 77594221b..85f70f986 100644 --- a/Extras/software_cache/cache/include/api.h +++ b/Extras/software_cache/cache/include/api.h @@ -1,31 +1,31 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* api.h - * - * Copyright (C) 2005 IBM Corp. - * - * Simple API for software managed cache on SPEs. - * A sophisticated application would not use these, - * but rather use the low-level lookup functions. - */ - -#ifndef __SPE_CACHE_API_H__ -#define __SPE_CACHE_API_H__ - -typedef void *spe_cache_entry_t; - -#define spe_cache_rd(ea) _spe_cache_lookup_xfer_wait_(ea, 0, 1) -#define spe_cache_tr(ea) _spe_cache_lookup_xfer_(ea, 0, 1) -#define spe_cache_lr(ea) _spe_cache_lookup_(ea, 0) - -#define spe_cache_wait(entry) _spe_cache_wait_(entry) - -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* api.h + * + * Copyright (C) 2005 IBM Corp. + * + * Simple API for software managed cache on SPEs. + * A sophisticated application would not use these, + * but rather use the low-level lookup functions. + */ + +#ifndef __SPE_CACHE_API_H__ +#define __SPE_CACHE_API_H__ + +typedef void *spe_cache_entry_t; + +#define spe_cache_rd(ea) _spe_cache_lookup_xfer_wait_(ea, 0, 1) +#define spe_cache_tr(ea) _spe_cache_lookup_xfer_(ea, 0, 1) +#define spe_cache_lr(ea) _spe_cache_lookup_(ea, 0) + +#define spe_cache_wait(entry) _spe_cache_wait_(entry) + +#endif diff --git a/Extras/software_cache/cache/include/cbe_mfc.h b/Extras/software_cache/cache/include/cbe_mfc.h index c685118ac..a5ed207a5 100644 --- a/Extras/software_cache/cache/include/cbe_mfc.h +++ b/Extras/software_cache/cache/include/cbe_mfc.h @@ -1,245 +1,245 @@ -/* @(#)17 1.4 src/include/cbe_mfc.h, sw.includes, sdk_pub 10/11/05 16:00:25 */ -/* -------------------------------------------------------------- */ -/* (C) Copyright 2001,2005, */ -/* International Business Machines Corporation, */ -/* Sony Computer Entertainment Incorporated, */ -/* Toshiba Corporation. */ -/* */ -/* All Rights Reserved. */ -/* -------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -#ifndef _CBEA_MFC_H_ -#define _CBEA_MFC_H_ - -/* This header file contains various definitions related to the Memory Flow - * Controller (MFC) portion of the Cell Broadband Engine Architecture (CBEA). - */ - -/**************************************/ -/* MFC DMA Command Opcode Definitions */ -/**************************************/ - -/****************************************************************************/ -/* MFC DMA Command flags which identify classes of operations. */ -/****************************************************************************/ -/* Note: These flags may be used in conjunction with the base command types - * (i.e. MFC_PUT_CMD, MFC_PUTR_CMD, MFC_GET_CMD, and MFC_SNDSIG_CMD) - * to construct the various command permutations. - */ - -#define MFC_BARRIER_ENABLE 0x01 -#define MFC_FENCE_ENABLE 0x02 -#define MFC_LIST_ENABLE 0x04 /* SPU Only */ -#define MFC_START_ENABLE 0x08 /* proxy Only */ -#define MFC_RESULT_ENABLE 0x10 - -/****************************************************************************/ -/* MFC DMA Put Commands */ -/****************************************************************************/ - -#define MFC_PUT_CMD 0x20 -#define MFC_PUTS_CMD 0x28 /* proxy Only */ -#define MFC_PUTR_CMD 0x30 -#define MFC_PUTF_CMD 0x22 -#define MFC_PUTB_CMD 0x21 -#define MFC_PUTFS_CMD 0x2A /* proxy Only */ -#define MFC_PUTBS_CMD 0x29 /* proxy Only */ -#define MFC_PUTRF_CMD 0x32 -#define MFC_PUTRB_CMD 0x31 -#define MFC_PUTL_CMD 0x24 /* SPU Only */ -#define MFC_PUTRL_CMD 0x34 /* SPU Only */ -#define MFC_PUTLF_CMD 0x26 /* SPU Only */ -#define MFC_PUTLB_CMD 0x25 /* SPU Only */ -#define MFC_PUTRLF_CMD 0x36 /* SPU Only */ -#define MFC_PUTRLB_CMD 0x35 /* SPU Only */ - -/****************************************************************************/ -/* MFC DMA Get Commands */ -/****************************************************************************/ - -#define MFC_GET_CMD 0x40 -#define MFC_GETS_CMD 0x48 /* proxy Only */ -#define MFC_GETF_CMD 0x42 -#define MFC_GETB_CMD 0x41 -#define MFC_GETFS_CMD 0x4A /* proxy Only */ -#define MFC_GETBS_CMD 0x49 /* proxy Only */ -#define MFC_GETL_CMD 0x44 /* SPU Only */ -#define MFC_GETLF_CMD 0x46 /* SPU Only */ -#define MFC_GETLB_CMD 0x45 /* SPU Only */ - -/****************************************************************************/ -/* MFC DMA Storage Control Commands */ -/****************************************************************************/ -/* Note: These are only supported on implementations with a SL1 cache - * They are no-ops on the initial (CBE) implementation. - */ - -#define MFC_SDCRT_CMD 0x80 -#define MFC_SDCRTST_CMD 0x81 -#define MFC_SDCRZ_CMD 0x89 -#define MFC_SDCRS_CMD 0x8D -#define MFC_SDCRF_CMD 0x8F - -/****************************************************************************/ -/* MFC Synchronization Commands */ -/****************************************************************************/ - -#define MFC_GETLLAR_CMD 0xD0 /* SPU Only */ -#define MFC_PUTLLC_CMD 0xB4 /* SPU Only */ -#define MFC_PUTLLUC_CMD 0xB0 /* SPU Only */ -#define MFC_PUTQLLUC_CMD 0xB8 /* SPU Only */ - -#define MFC_SNDSIG_CMD 0xA0 -#define MFC_SNDSIGB_CMD 0xA1 -#define MFC_SNDSIGF_CMD 0xA2 -#define MFC_BARRIER_CMD 0xC0 -#define MFC_EIEIO_CMD 0xC8 -#define MFC_SYNC_CMD 0xCC - - -/****************************************************************************/ -/* Definitions for constructing a 32-bit command word including the transfer - * and replacement class id and the command opcode. - */ -/****************************************************************************/ -#define MFC_TCLASS(_tid) ((_tid) << 24) -#define MFC_RCLASS(_rid) ((_rid) << 16) - -#define MFC_CMD_WORD(_tid, _rid, _cmd) (MFC_TCLASS(_tid) | MFC_RCLASS(_rid) | (_cmd)) - -/****************************************************************************/ -/* Definitions for constructing a 64-bit command word including the size, tag, - * transfer and replacement class id and the command opcode. - */ -/****************************************************************************/ -#define MFC_SIZE(_size) ((unsigned long long)(_size) << 48) -#define MFC_TAG(_tag_id) ((unsigned long long)(_tag_id) << 32) -#define MFC_TR_CMD(_trcmd) ((unsigned long long)(_trcmd)) - -#define MFC_CMD_DWORD(_size, _tag_id, _trcmd) (MFC_SIZE(_size) | MFC_TAG(_tag_id) | MFC_TR_CMD(_trcmd)) - -/****************************************************************************/ -/* Mask definitions for obtaining DMA commands and class ids from packed words. - */ -/****************************************************************************/ -#define MFC_CMD_MASK 0x0000FFFF -#define MFC_CLASS_MASK 0x000000FF - -/****************************************************************************/ -/* DMA max/min size definitions. */ -/****************************************************************************/ -#define MFC_MIN_DMA_SIZE_SHIFT 4 /* 16 bytes */ -#define MFC_MAX_DMA_SIZE_SHIFT 14 /* 16384 bytes */ - -#define MFC_MIN_DMA_SIZE (1 << MFC_MIN_DMA_SIZE_SHIFT) -#define MFC_MAX_DMA_SIZE (1 << MFC_MAX_DMA_SIZE_SHIFT) - -#define MFC_MIN_DMA_SIZE_MASK (MFC_MIN_DMA_SIZE - 1) -#define MFC_MAX_DMA_SIZE_MASK (MFC_MAX_DMA_SIZE - 1) - -#define MFC_MIN_DMA_LIST_SIZE 0x0008 /* 8 bytes */ -#define MFC_MAX_DMA_LIST_SIZE 0x4000 /* 16K bytes */ - -/****************************************************************************/ -/* Mask definition for checking proper address alignment. */ -/****************************************************************************/ -#define MFC_ADDR_MATCH_MASK 0xF -#define MFC_BEST_ADDR_ALIGNMENT 0x80 - -/****************************************************************************/ -/* Definitions related to the Proxy DMA Command Status register (DMA_CMDStatus). - */ -/****************************************************************************/ -#define MFC_PROXY_DMA_CMD_ENQUEUE_SUCCESSFUL 0x00 -#define MFC_PROXY_DMA_CMD_SEQUENCE_ERROR 0x01 -#define MFC_PROXY_DMA_QUEUE_FULL 0x02 - -/****************************************************************************/ -/* Definitions related to the DMA Queue Status register (DMA_QStatus). */ -/****************************************************************************/ -#define MFC_PROXY_MAX_QUEUE_SPACE 0x08 -#define MFC_PROXY_DMA_Q_EMPTY 0x80000000 -#define MFC_PROXY_DMA_Q_FREE_SPACE_MASK 0x0000FFFF - -#define MFC_SPU_MAX_QUEUE_SPACE 0x10 - -/****************************************************************************/ -/* Definitions related to the Proxy Tag-Group Query-Type register - * (Prxy_QueryType). - */ -/****************************************************************************/ -#define MFC_PROXY_DMA_QUERYTYPE_ANY 0x1 -#define MFC_PROXY_DMA_QUERYTYPE_ALL 0x2 - -/****************************************************************************/ -/* Definitions related to the Proxy Tag-Group Query-Mask (Prxy_QueryMask) - * and PU Tag Status (DMA_TagStatus) registers. - * - * NOTE: The only use the bottom 5 bits of the tag id value passed to insure - * a valid tag id is used. - */ -/****************************************************************************/ - -#define MFC_TAGID_TO_TAGMASK(tag_id) (1 << (tag_id & 0x1F)) - -/****************************************************************************/ -/* Definitions related to the Mailbox Status register (SPU_Mbox_Stat) and the - * depths of the outbound Mailbox Register (SPU_OutMbox), the outbound - * interrupting Mailbox Register (SPU_OutIntrMbox), and the inbound Mailbox - * Register (SPU_In_Mbox). - */ -/****************************************************************************/ -#define MFC_SPU_OUT_MBOX_COUNT_STATUS_MASK 0x000000FF -#define MFC_SPU_OUT_MBOX_COUNT_STATUS_SHIFT 0x0 -#define MFC_SPU_IN_MBOX_COUNT_STATUS_MASK 0x0000FF00 -#define MFC_SPU_IN_MBOX_COUNT_STATUS_SHIFT 0x8 -#define MFC_SPU_OUT_INTR_MBOX_COUNT_STATUS_MASK 0x00FF0000 -#define MFC_SPU_OUT_INTR_MBOX_COUNT_STATUS_SHIFT 0x10 - -/****************************************************************************/ -/* Definitions related to the SPC Multi Source Syncronization register - * (MFC_MSSync). - */ -/****************************************************************************/ -#define MFC_SPC_MSS_STATUS_MASK 0x1 -#define MFC_SPC_MSS_COMPLETE 0x0 -#define MFC_SPC_MSS_NOT_COMPLETE 0x1 - - -/******************************************* - * Channel Defines - *******************************************/ - -/* Events Defines for channels: - * 0 (SPU_RdEventStat), - * 1 (SPU_WrEventMask), and - * 2 (SPU_WrEventAck). - */ -#define MFC_TAG_STATUS_UPDATE_EVENT 0x00000001 -#define MFC_LIST_STALL_NOTIFY_EVENT 0x00000002 -#define MFC_COMMAND_QUEUE_AVAILABLE_EVENT 0x00000008 -#define MFC_IN_MBOX_AVAILABLE_EVENT 0x00000010 -#define MFC_DECREMENTER_EVENT 0x00000020 -#define MFC_OUT_INTR_MBOX_AVAILABLE_EVENT 0x00000040 -#define MFC_OUT_MBOX_AVAILABLE_EVENT 0x00000080 -#define MFC_SIGNAL_NOTIFY_2_EVENT 0x00000100 -#define MFC_SIGNAL_NOTIFY_1_EVENT 0x00000200 -#define MFC_LLR_LOST_EVENT 0x00000400 -#define MFC_PRIV_ATTN_EVENT 0x00000800 -#define MFC_MULTI_SRC_SYNC_EVENT 0x00001000 - - - -/* Tag Status Update defines for channel 23 (MFC_WrTagUpdate) - */ -#define MFC_TAG_UPDATE_IMMEDIATE 0x0 -#define MFC_TAG_UPDATE_ANY 0x1 -#define MFC_TAG_UPDATE_ALL 0x2 - -/* Atomic Command Status defines for channel 27 (MFC_RdAtomicStat) - */ -#define MFC_PUTLLC_STATUS 0x00000001 -#define MFC_PUTLLUC_STATUS 0x00000002 -#define MFC_GETLLAR_STATUS 0x00000004 - -#endif /* _CBEA_MFC_H_ */ +/* @(#)17 1.4 src/include/cbe_mfc.h, sw.includes, sdk_pub 10/11/05 16:00:25 */ +/* -------------------------------------------------------------- */ +/* (C) Copyright 2001,2005, */ +/* International Business Machines Corporation, */ +/* Sony Computer Entertainment Incorporated, */ +/* Toshiba Corporation. */ +/* */ +/* All Rights Reserved. */ +/* -------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +#ifndef _CBEA_MFC_H_ +#define _CBEA_MFC_H_ + +/* This header file contains various definitions related to the Memory Flow + * Controller (MFC) portion of the Cell Broadband Engine Architecture (CBEA). + */ + +/**************************************/ +/* MFC DMA Command Opcode Definitions */ +/**************************************/ + +/****************************************************************************/ +/* MFC DMA Command flags which identify classes of operations. */ +/****************************************************************************/ +/* Note: These flags may be used in conjunction with the base command types + * (i.e. MFC_PUT_CMD, MFC_PUTR_CMD, MFC_GET_CMD, and MFC_SNDSIG_CMD) + * to construct the various command permutations. + */ + +#define MFC_BARRIER_ENABLE 0x01 +#define MFC_FENCE_ENABLE 0x02 +#define MFC_LIST_ENABLE 0x04 /* SPU Only */ +#define MFC_START_ENABLE 0x08 /* proxy Only */ +#define MFC_RESULT_ENABLE 0x10 + +/****************************************************************************/ +/* MFC DMA Put Commands */ +/****************************************************************************/ + +#define MFC_PUT_CMD 0x20 +#define MFC_PUTS_CMD 0x28 /* proxy Only */ +#define MFC_PUTR_CMD 0x30 +#define MFC_PUTF_CMD 0x22 +#define MFC_PUTB_CMD 0x21 +#define MFC_PUTFS_CMD 0x2A /* proxy Only */ +#define MFC_PUTBS_CMD 0x29 /* proxy Only */ +#define MFC_PUTRF_CMD 0x32 +#define MFC_PUTRB_CMD 0x31 +#define MFC_PUTL_CMD 0x24 /* SPU Only */ +#define MFC_PUTRL_CMD 0x34 /* SPU Only */ +#define MFC_PUTLF_CMD 0x26 /* SPU Only */ +#define MFC_PUTLB_CMD 0x25 /* SPU Only */ +#define MFC_PUTRLF_CMD 0x36 /* SPU Only */ +#define MFC_PUTRLB_CMD 0x35 /* SPU Only */ + +/****************************************************************************/ +/* MFC DMA Get Commands */ +/****************************************************************************/ + +#define MFC_GET_CMD 0x40 +#define MFC_GETS_CMD 0x48 /* proxy Only */ +#define MFC_GETF_CMD 0x42 +#define MFC_GETB_CMD 0x41 +#define MFC_GETFS_CMD 0x4A /* proxy Only */ +#define MFC_GETBS_CMD 0x49 /* proxy Only */ +#define MFC_GETL_CMD 0x44 /* SPU Only */ +#define MFC_GETLF_CMD 0x46 /* SPU Only */ +#define MFC_GETLB_CMD 0x45 /* SPU Only */ + +/****************************************************************************/ +/* MFC DMA Storage Control Commands */ +/****************************************************************************/ +/* Note: These are only supported on implementations with a SL1 cache + * They are no-ops on the initial (CBE) implementation. + */ + +#define MFC_SDCRT_CMD 0x80 +#define MFC_SDCRTST_CMD 0x81 +#define MFC_SDCRZ_CMD 0x89 +#define MFC_SDCRS_CMD 0x8D +#define MFC_SDCRF_CMD 0x8F + +/****************************************************************************/ +/* MFC Synchronization Commands */ +/****************************************************************************/ + +#define MFC_GETLLAR_CMD 0xD0 /* SPU Only */ +#define MFC_PUTLLC_CMD 0xB4 /* SPU Only */ +#define MFC_PUTLLUC_CMD 0xB0 /* SPU Only */ +#define MFC_PUTQLLUC_CMD 0xB8 /* SPU Only */ + +#define MFC_SNDSIG_CMD 0xA0 +#define MFC_SNDSIGB_CMD 0xA1 +#define MFC_SNDSIGF_CMD 0xA2 +#define MFC_BARRIER_CMD 0xC0 +#define MFC_EIEIO_CMD 0xC8 +#define MFC_SYNC_CMD 0xCC + + +/****************************************************************************/ +/* Definitions for constructing a 32-bit command word including the transfer + * and replacement class id and the command opcode. + */ +/****************************************************************************/ +#define MFC_TCLASS(_tid) ((_tid) << 24) +#define MFC_RCLASS(_rid) ((_rid) << 16) + +#define MFC_CMD_WORD(_tid, _rid, _cmd) (MFC_TCLASS(_tid) | MFC_RCLASS(_rid) | (_cmd)) + +/****************************************************************************/ +/* Definitions for constructing a 64-bit command word including the size, tag, + * transfer and replacement class id and the command opcode. + */ +/****************************************************************************/ +#define MFC_SIZE(_size) ((unsigned long long)(_size) << 48) +#define MFC_TAG(_tag_id) ((unsigned long long)(_tag_id) << 32) +#define MFC_TR_CMD(_trcmd) ((unsigned long long)(_trcmd)) + +#define MFC_CMD_DWORD(_size, _tag_id, _trcmd) (MFC_SIZE(_size) | MFC_TAG(_tag_id) | MFC_TR_CMD(_trcmd)) + +/****************************************************************************/ +/* Mask definitions for obtaining DMA commands and class ids from packed words. + */ +/****************************************************************************/ +#define MFC_CMD_MASK 0x0000FFFF +#define MFC_CLASS_MASK 0x000000FF + +/****************************************************************************/ +/* DMA max/min size definitions. */ +/****************************************************************************/ +#define MFC_MIN_DMA_SIZE_SHIFT 4 /* 16 bytes */ +#define MFC_MAX_DMA_SIZE_SHIFT 14 /* 16384 bytes */ + +#define MFC_MIN_DMA_SIZE (1 << MFC_MIN_DMA_SIZE_SHIFT) +#define MFC_MAX_DMA_SIZE (1 << MFC_MAX_DMA_SIZE_SHIFT) + +#define MFC_MIN_DMA_SIZE_MASK (MFC_MIN_DMA_SIZE - 1) +#define MFC_MAX_DMA_SIZE_MASK (MFC_MAX_DMA_SIZE - 1) + +#define MFC_MIN_DMA_LIST_SIZE 0x0008 /* 8 bytes */ +#define MFC_MAX_DMA_LIST_SIZE 0x4000 /* 16K bytes */ + +/****************************************************************************/ +/* Mask definition for checking proper address alignment. */ +/****************************************************************************/ +#define MFC_ADDR_MATCH_MASK 0xF +#define MFC_BEST_ADDR_ALIGNMENT 0x80 + +/****************************************************************************/ +/* Definitions related to the Proxy DMA Command Status register (DMA_CMDStatus). + */ +/****************************************************************************/ +#define MFC_PROXY_DMA_CMD_ENQUEUE_SUCCESSFUL 0x00 +#define MFC_PROXY_DMA_CMD_SEQUENCE_ERROR 0x01 +#define MFC_PROXY_DMA_QUEUE_FULL 0x02 + +/****************************************************************************/ +/* Definitions related to the DMA Queue Status register (DMA_QStatus). */ +/****************************************************************************/ +#define MFC_PROXY_MAX_QUEUE_SPACE 0x08 +#define MFC_PROXY_DMA_Q_EMPTY 0x80000000 +#define MFC_PROXY_DMA_Q_FREE_SPACE_MASK 0x0000FFFF + +#define MFC_SPU_MAX_QUEUE_SPACE 0x10 + +/****************************************************************************/ +/* Definitions related to the Proxy Tag-Group Query-Type register + * (Prxy_QueryType). + */ +/****************************************************************************/ +#define MFC_PROXY_DMA_QUERYTYPE_ANY 0x1 +#define MFC_PROXY_DMA_QUERYTYPE_ALL 0x2 + +/****************************************************************************/ +/* Definitions related to the Proxy Tag-Group Query-Mask (Prxy_QueryMask) + * and PU Tag Status (DMA_TagStatus) registers. + * + * NOTE: The only use the bottom 5 bits of the tag id value passed to insure + * a valid tag id is used. + */ +/****************************************************************************/ + +#define MFC_TAGID_TO_TAGMASK(tag_id) (1 << (tag_id & 0x1F)) + +/****************************************************************************/ +/* Definitions related to the Mailbox Status register (SPU_Mbox_Stat) and the + * depths of the outbound Mailbox Register (SPU_OutMbox), the outbound + * interrupting Mailbox Register (SPU_OutIntrMbox), and the inbound Mailbox + * Register (SPU_In_Mbox). + */ +/****************************************************************************/ +#define MFC_SPU_OUT_MBOX_COUNT_STATUS_MASK 0x000000FF +#define MFC_SPU_OUT_MBOX_COUNT_STATUS_SHIFT 0x0 +#define MFC_SPU_IN_MBOX_COUNT_STATUS_MASK 0x0000FF00 +#define MFC_SPU_IN_MBOX_COUNT_STATUS_SHIFT 0x8 +#define MFC_SPU_OUT_INTR_MBOX_COUNT_STATUS_MASK 0x00FF0000 +#define MFC_SPU_OUT_INTR_MBOX_COUNT_STATUS_SHIFT 0x10 + +/****************************************************************************/ +/* Definitions related to the SPC Multi Source Syncronization register + * (MFC_MSSync). + */ +/****************************************************************************/ +#define MFC_SPC_MSS_STATUS_MASK 0x1 +#define MFC_SPC_MSS_COMPLETE 0x0 +#define MFC_SPC_MSS_NOT_COMPLETE 0x1 + + +/******************************************* + * Channel Defines + *******************************************/ + +/* Events Defines for channels: + * 0 (SPU_RdEventStat), + * 1 (SPU_WrEventMask), and + * 2 (SPU_WrEventAck). + */ +#define MFC_TAG_STATUS_UPDATE_EVENT 0x00000001 +#define MFC_LIST_STALL_NOTIFY_EVENT 0x00000002 +#define MFC_COMMAND_QUEUE_AVAILABLE_EVENT 0x00000008 +#define MFC_IN_MBOX_AVAILABLE_EVENT 0x00000010 +#define MFC_DECREMENTER_EVENT 0x00000020 +#define MFC_OUT_INTR_MBOX_AVAILABLE_EVENT 0x00000040 +#define MFC_OUT_MBOX_AVAILABLE_EVENT 0x00000080 +#define MFC_SIGNAL_NOTIFY_2_EVENT 0x00000100 +#define MFC_SIGNAL_NOTIFY_1_EVENT 0x00000200 +#define MFC_LLR_LOST_EVENT 0x00000400 +#define MFC_PRIV_ATTN_EVENT 0x00000800 +#define MFC_MULTI_SRC_SYNC_EVENT 0x00001000 + + + +/* Tag Status Update defines for channel 23 (MFC_WrTagUpdate) + */ +#define MFC_TAG_UPDATE_IMMEDIATE 0x0 +#define MFC_TAG_UPDATE_ANY 0x1 +#define MFC_TAG_UPDATE_ALL 0x2 + +/* Atomic Command Status defines for channel 27 (MFC_RdAtomicStat) + */ +#define MFC_PUTLLC_STATUS 0x00000001 +#define MFC_PUTLLUC_STATUS 0x00000002 +#define MFC_GETLLAR_STATUS 0x00000004 + +#endif /* _CBEA_MFC_H_ */ diff --git a/Extras/software_cache/cache/include/defs.h b/Extras/software_cache/cache/include/defs.h index d15d9361a..6b22224a7 100644 --- a/Extras/software_cache/cache/include/defs.h +++ b/Extras/software_cache/cache/include/defs.h @@ -1,149 +1,149 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* spe_cache_defs.h - * - * Copyright (C) 2005 IBM Corp. - * - * Internal definitions for software managed cache. - */ - -#ifndef __SPE_CACHE_DEFS_H__ -#define __SPE_CACHE_DEFS_H__ - -/** - ** Defn's for number of cache sets. - ** Default is 64 sets. - */ -#if (SPE_CACHE_NSETS==1024) -#define SPE_CACHE_NSETS_SHIFT 10 -#elif (SPE_CACHE_NSETS==512) -#define SPE_CACHE_NSETS_SHIFT 9 -#elif (SPE_CACHE_NSETS==256) -#define SPE_CACHE_NSETS_SHIFT 8 -#elif (SPE_CACHE_NSETS==128) -#define SPE_CACHE_NSETS_SHIFT 7 -#elif (SPE_CACHE_NSETS==64) -#define SPE_CACHE_NSETS_SHIFT 6 -#elif (SPE_CACHE_NSETS==32) -#define SPE_CACHE_NSETS_SHIFT 5 -#elif (SPE_CACHE_NSETS==16) -#define SPE_CACHE_NSETS_SHIFT 4 -#elif (SPE_CACHE_NSETS==8) -#define SPE_CACHE_NSETS_SHIFT 3 -#elif (SPE_CACHE_NSETS==4) -#define SPE_CACHE_NSETS_SHIFT 2 -#elif (SPE_CACHE_NSETS==2) -#define SPE_CACHE_NSETS_SHIFT 1 -#else -#undef SPE_CACHE_NSETS -#define SPE_CACHE_NSETS 64 -#define SPE_CACHE_NSETS_SHIFT 6 -#endif - -/** - ** Defn's for cachline size (bytes). - ** Default is 128 bytes. - */ -#if (SPE_CACHELINE_SIZE==512) -#define SPE_CACHELINE_SHIFT 9 -#elif (SPE_CACHELINE_SIZE==256) -#define SPE_CACHELINE_SHIFT 8 -#elif (SPE_CACHELINE_SIZE==128) -#define SPE_CACHELINE_SHIFT 7 -#elif (SPE_CACHELINE_SIZE==64) -#define SPE_CACHELINE_SHIFT 6 -#elif (SPE_CACHELINE_SIZE==32) -#define SPE_CACHELINE_SHIFT 5 -#else -#undef SPE_CACHELINE_SIZE -#define SPE_CACHELINE_SIZE 128 -#define SPE_CACHELINE_SHIFT 7 -#endif - -/** - ** Defn's derived from above settings. - */ -#define SPE_CACHE_NSETS_MASK (SPE_CACHE_NSETS - 1) -#define SPE_CACHELINE_MASK (SPE_CACHELINE_SIZE - 1) - -/** - ** Defn's for managing cacheline state. - */ -#define SPE_CACHELINE_DIRTY 0x1 -#define SPE_CACHELINE_LOCKED 0x2 -#define SPE_CACHELINE_STATE_MASK (SPE_CACHELINE_DIRTY | SPE_CACHELINE_LOCKED) - -#ifdef _XLC -/** - * FIXME: For now disable manual branch hints - * on XLC due to performance degradation. - */ -#ifndef likely -#define likely(_c) (_c) -#define unlikely(_c) (_c) -#endif - -#else /* !_XLC */ - -#ifndef likely -#define likely(_c) __builtin_expect((_c), 1) -#define unlikely(_c) __builtin_expect((_c), 0) -#endif -#endif - - -/** - ** Debug controls. Set -DNDEBUG to - ** disable both panic and assert. - */ -#include -#define _spe_cache_panic_(c) assert(c) -#ifdef SPE_CACHE_DBG -#define _spe_cache_assert_(c) assert(c) -#else -#define _spe_cache_assert_(c) /* No-op. */ -#endif - -#define _spe_cacheline_byte_offset_(ea) \ - ((ea) & SPE_CACHELINE_MASK) - -#define _spe_cacheline_byte_offset_x4(ea) \ - spu_and ((ea), SPE_CACHELINE_MASK) - -#endif - -static __inline vector unsigned int _load_vec_uint4(unsigned int ui1, unsigned int ui2, unsigned int ui3, unsigned int ui4) -{ - vector unsigned int result; - vector unsigned int iv1, iv2, iv3, iv4; - - vector unsigned char shuffle = VEC_LITERAL(vector unsigned char, - 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80); - iv1 = spu_promote(ui1, 0); - iv2 = spu_promote(ui2, 0); - iv3 = spu_promote(ui3, 0); - iv4 = spu_promote(ui4, 0); - - result = spu_or(spu_shuffle(iv1, iv2, shuffle), spu_shuffle(iv3, iv4, spu_rlqwbyte(shuffle, 8))); - return (result); -} - -static __inline vector unsigned int _pack_vec_uint4(vector unsigned int ui1, vector unsigned int ui2, vector unsigned int ui3, vector unsigned int ui4) -{ - vector unsigned int result; - vector unsigned char shuffle = VEC_LITERAL(vector unsigned char, - 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80); - - result = spu_or(spu_shuffle(ui1, ui2, shuffle), spu_shuffle(ui3, ui4, spu_rlqwbyte(shuffle, 8))); - return (result); -} +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* spe_cache_defs.h + * + * Copyright (C) 2005 IBM Corp. + * + * Internal definitions for software managed cache. + */ + +#ifndef __SPE_CACHE_DEFS_H__ +#define __SPE_CACHE_DEFS_H__ + +/** + ** Defn's for number of cache sets. + ** Default is 64 sets. + */ +#if (SPE_CACHE_NSETS==1024) +#define SPE_CACHE_NSETS_SHIFT 10 +#elif (SPE_CACHE_NSETS==512) +#define SPE_CACHE_NSETS_SHIFT 9 +#elif (SPE_CACHE_NSETS==256) +#define SPE_CACHE_NSETS_SHIFT 8 +#elif (SPE_CACHE_NSETS==128) +#define SPE_CACHE_NSETS_SHIFT 7 +#elif (SPE_CACHE_NSETS==64) +#define SPE_CACHE_NSETS_SHIFT 6 +#elif (SPE_CACHE_NSETS==32) +#define SPE_CACHE_NSETS_SHIFT 5 +#elif (SPE_CACHE_NSETS==16) +#define SPE_CACHE_NSETS_SHIFT 4 +#elif (SPE_CACHE_NSETS==8) +#define SPE_CACHE_NSETS_SHIFT 3 +#elif (SPE_CACHE_NSETS==4) +#define SPE_CACHE_NSETS_SHIFT 2 +#elif (SPE_CACHE_NSETS==2) +#define SPE_CACHE_NSETS_SHIFT 1 +#else +#undef SPE_CACHE_NSETS +#define SPE_CACHE_NSETS 64 +#define SPE_CACHE_NSETS_SHIFT 6 +#endif + +/** + ** Defn's for cachline size (bytes). + ** Default is 128 bytes. + */ +#if (SPE_CACHELINE_SIZE==512) +#define SPE_CACHELINE_SHIFT 9 +#elif (SPE_CACHELINE_SIZE==256) +#define SPE_CACHELINE_SHIFT 8 +#elif (SPE_CACHELINE_SIZE==128) +#define SPE_CACHELINE_SHIFT 7 +#elif (SPE_CACHELINE_SIZE==64) +#define SPE_CACHELINE_SHIFT 6 +#elif (SPE_CACHELINE_SIZE==32) +#define SPE_CACHELINE_SHIFT 5 +#else +#undef SPE_CACHELINE_SIZE +#define SPE_CACHELINE_SIZE 128 +#define SPE_CACHELINE_SHIFT 7 +#endif + +/** + ** Defn's derived from above settings. + */ +#define SPE_CACHE_NSETS_MASK (SPE_CACHE_NSETS - 1) +#define SPE_CACHELINE_MASK (SPE_CACHELINE_SIZE - 1) + +/** + ** Defn's for managing cacheline state. + */ +#define SPE_CACHELINE_DIRTY 0x1 +#define SPE_CACHELINE_LOCKED 0x2 +#define SPE_CACHELINE_STATE_MASK (SPE_CACHELINE_DIRTY | SPE_CACHELINE_LOCKED) + +#ifdef _XLC +/** + * FIXME: For now disable manual branch hints + * on XLC due to performance degradation. + */ +#ifndef likely +#define likely(_c) (_c) +#define unlikely(_c) (_c) +#endif + +#else /* !_XLC */ + +#ifndef likely +#define likely(_c) __builtin_expect((_c), 1) +#define unlikely(_c) __builtin_expect((_c), 0) +#endif +#endif + + +/** + ** Debug controls. Set -DNDEBUG to + ** disable both panic and assert. + */ +#include +#define _spe_cache_panic_(c) assert(c) +#ifdef SPE_CACHE_DBG +#define _spe_cache_assert_(c) assert(c) +#else +#define _spe_cache_assert_(c) /* No-op. */ +#endif + +#define _spe_cacheline_byte_offset_(ea) \ + ((ea) & SPE_CACHELINE_MASK) + +#define _spe_cacheline_byte_offset_x4(ea) \ + spu_and ((ea), SPE_CACHELINE_MASK) + +#endif + +static __inline vector unsigned int _load_vec_uint4(unsigned int ui1, unsigned int ui2, unsigned int ui3, unsigned int ui4) +{ + vector unsigned int result; + vector unsigned int iv1, iv2, iv3, iv4; + + vector unsigned char shuffle = VEC_LITERAL(vector unsigned char, + 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80); + iv1 = spu_promote(ui1, 0); + iv2 = spu_promote(ui2, 0); + iv3 = spu_promote(ui3, 0); + iv4 = spu_promote(ui4, 0); + + result = spu_or(spu_shuffle(iv1, iv2, shuffle), spu_shuffle(iv3, iv4, spu_rlqwbyte(shuffle, 8))); + return (result); +} + +static __inline vector unsigned int _pack_vec_uint4(vector unsigned int ui1, vector unsigned int ui2, vector unsigned int ui3, vector unsigned int ui4) +{ + vector unsigned int result; + vector unsigned char shuffle = VEC_LITERAL(vector unsigned char, + 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80); + + result = spu_or(spu_shuffle(ui1, ui2, shuffle), spu_shuffle(ui3, ui4, spu_rlqwbyte(shuffle, 8))); + return (result); +} diff --git a/Extras/software_cache/cache/include/dma.h b/Extras/software_cache/cache/include/dma.h index fdcc8313c..e4ee89131 100644 --- a/Extras/software_cache/cache/include/dma.h +++ b/Extras/software_cache/cache/include/dma.h @@ -1,40 +1,40 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* dma.h - * - * Copyright (C) 2005 IBM Corp. - * - * Internal DMA utilities for software - * managed cache. - */ - -#ifndef __SPE_CACHE_DMA_H__ -#define __SPE_CACHE_DMA_H__ - -#define SPE_CACHE_TAGID_SHIFT (SPE_CACHELINE_SHIFT + SPE_CACHE_NWAY_SHIFT) - -#define _SPE_CACHELINE_TAGID(_ptr) (16) -#define _SPE_CACHELINE_TAGMASK(_ptr) (1 << 16) - -#define SPE_CACHELINE_TAGID(_line) \ - _SPE_CACHELINE_TAGID(&spe_cache_mem[_line]) -#define SPE_CACHELINE_TAGMASK(_line) \ - _SPE_CACHELINE_TAGMASK(&spe_cache_mem[_line]) - -#ifndef SPE_CACHE_SET_TAGID -#define SPE_CACHE_SET_TAGID(set) ((set) & 0x1f) -#endif -#define SPE_CACHE_SET_TAGMASK(set) (1 << SPE_CACHE_SET_TAGID(set)) - -#define SPE_CACHE_PUT MFC_PUTF_CMD -#define SPE_CACHE_GET MFC_GET_CMD - -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* dma.h + * + * Copyright (C) 2005 IBM Corp. + * + * Internal DMA utilities for software + * managed cache. + */ + +#ifndef __SPE_CACHE_DMA_H__ +#define __SPE_CACHE_DMA_H__ + +#define SPE_CACHE_TAGID_SHIFT (SPE_CACHELINE_SHIFT + SPE_CACHE_NWAY_SHIFT) + +#define _SPE_CACHELINE_TAGID(_ptr) (16) +#define _SPE_CACHELINE_TAGMASK(_ptr) (1 << 16) + +#define SPE_CACHELINE_TAGID(_line) \ + _SPE_CACHELINE_TAGID(&spe_cache_mem[_line]) +#define SPE_CACHELINE_TAGMASK(_line) \ + _SPE_CACHELINE_TAGMASK(&spe_cache_mem[_line]) + +#ifndef SPE_CACHE_SET_TAGID +#define SPE_CACHE_SET_TAGID(set) ((set) & 0x1f) +#endif +#define SPE_CACHE_SET_TAGMASK(set) (1 << SPE_CACHE_SET_TAGID(set)) + +#define SPE_CACHE_PUT MFC_PUTF_CMD +#define SPE_CACHE_GET MFC_GET_CMD + +#endif diff --git a/Extras/software_cache/cache/include/ilog2.h b/Extras/software_cache/cache/include/ilog2.h index 86a5ca865..37fa2c6f0 100644 --- a/Extras/software_cache/cache/include/ilog2.h +++ b/Extras/software_cache/cache/include/ilog2.h @@ -1,35 +1,35 @@ -/* @(#)12 1.5 src/lib/math/ilog2.h, sw.lib, sdk_pub 10/11/05 15:35:56 */ -/* -------------------------------------------------------------- */ -/* (C) Copyright 2001,2005, */ -/* International Business Machines Corporation, */ -/* Sony Computer Entertainment Incorporated, */ -/* Toshiba Corporation. */ -/* */ -/* All Rights Reserved. */ -/* -------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -#ifndef _ILOG2_H_ -#define _ILOG2_H_ 1 - -/* - * FUNCTION - * signed int _ilog2(signed int x) - * - * DESCRIPTION - * _ilog2 computes ceiling of log (base 2) of the input value x. - * The input value, x, must be a non-zero positive value. - */ - -static __inline signed int _ilog2(signed int x) -{ -#ifdef __SPU__ - return (32 - spu_extract(spu_cntlz(spu_promote(x - 1, 0)), 0)); -#else - signed int result; - - for (result=0, x--; x > 0; result++, x>>=1); - return (result); -#endif -} - -#endif /* _ILOG2_H_ */ +/* @(#)12 1.5 src/lib/math/ilog2.h, sw.lib, sdk_pub 10/11/05 15:35:56 */ +/* -------------------------------------------------------------- */ +/* (C) Copyright 2001,2005, */ +/* International Business Machines Corporation, */ +/* Sony Computer Entertainment Incorporated, */ +/* Toshiba Corporation. */ +/* */ +/* All Rights Reserved. */ +/* -------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +#ifndef _ILOG2_H_ +#define _ILOG2_H_ 1 + +/* + * FUNCTION + * signed int _ilog2(signed int x) + * + * DESCRIPTION + * _ilog2 computes ceiling of log (base 2) of the input value x. + * The input value, x, must be a non-zero positive value. + */ + +static __inline signed int _ilog2(signed int x) +{ +#ifdef __SPU__ + return (32 - spu_extract(spu_cntlz(spu_promote(x - 1, 0)), 0)); +#else + signed int result; + + for (result=0, x--; x > 0; result++, x>>=1); + return (result); +#endif +} + +#endif /* _ILOG2_H_ */ diff --git a/Extras/software_cache/cache/include/memset.h b/Extras/software_cache/cache/include/memset.h index b070d3e35..5dbdbacf5 100644 --- a/Extras/software_cache/cache/include/memset.h +++ b/Extras/software_cache/cache/include/memset.h @@ -1,68 +1,68 @@ -/* @(#)85 1.4 src/lib/c/memset.h, sw.lib, sdk_pub 10/13/05 10:17:09 */ -/* -------------------------------------------------------------- */ -/* (C) Copyright 2001,2005, */ -/* International Business Machines Corporation, */ -/* Sony Computer Entertainment Incorporated, */ -/* Toshiba Corporation. */ -/* */ -/* All Rights Reserved. */ -/* -------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -#include -#include - -/* Fills the first n bytes of the memory area pointed to by s - * with the constant byte c. Returns a pointer to the memory area s. - */ -static __inline void * _memset(void *s, int c, size_t n) -{ - int skip, cnt, i; - vec_uchar16 *vs; - vec_uchar16 vc, mask; - - vs = (vec_uchar16 *)(s); - vc = spu_splats((unsigned char)c); - cnt = (int)(n); - - /* Handle any leading partial quadwords as well a - * very short settings (ie, such that the n characters - * all reside in a single quadword. - */ - skip = (int)(s) & 15; - if (skip) { - mask = spu_rlmaskqwbyte((vec_uchar16)(-1), 0-skip); - cnt -= 16 - skip; - if (cnt < 0) { - mask = spu_and(mask, spu_slqwbyte((vec_uchar16)(-1), (unsigned int)(-cnt))); - } - *vs = spu_sel(*vs, vc, mask); - vs++; - } - - /* Handle 8 quadwords at a time - */ - for (i=127; i 0) { - mask = spu_slqwbyte((vec_uchar16)(-1), (unsigned int)(16-cnt)); - *vs = spu_sel(*vs, vc, mask); - } - - return (s); -} +/* @(#)85 1.4 src/lib/c/memset.h, sw.lib, sdk_pub 10/13/05 10:17:09 */ +/* -------------------------------------------------------------- */ +/* (C) Copyright 2001,2005, */ +/* International Business Machines Corporation, */ +/* Sony Computer Entertainment Incorporated, */ +/* Toshiba Corporation. */ +/* */ +/* All Rights Reserved. */ +/* -------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +#include +#include + +/* Fills the first n bytes of the memory area pointed to by s + * with the constant byte c. Returns a pointer to the memory area s. + */ +static __inline void * _memset(void *s, int c, size_t n) +{ + int skip, cnt, i; + vec_uchar16 *vs; + vec_uchar16 vc, mask; + + vs = (vec_uchar16 *)(s); + vc = spu_splats((unsigned char)c); + cnt = (int)(n); + + /* Handle any leading partial quadwords as well a + * very short settings (ie, such that the n characters + * all reside in a single quadword. + */ + skip = (int)(s) & 15; + if (skip) { + mask = spu_rlmaskqwbyte((vec_uchar16)(-1), 0-skip); + cnt -= 16 - skip; + if (cnt < 0) { + mask = spu_and(mask, spu_slqwbyte((vec_uchar16)(-1), (unsigned int)(-cnt))); + } + *vs = spu_sel(*vs, vc, mask); + vs++; + } + + /* Handle 8 quadwords at a time + */ + for (i=127; i 0) { + mask = spu_slqwbyte((vec_uchar16)(-1), (unsigned int)(16-cnt)); + *vs = spu_sel(*vs, vc, mask); + } + + return (s); +} diff --git a/Extras/software_cache/cache/include/nway-lookup.h b/Extras/software_cache/cache/include/nway-lookup.h index 33e552c6d..c12218fcd 100644 --- a/Extras/software_cache/cache/include/nway-lookup.h +++ b/Extras/software_cache/cache/include/nway-lookup.h @@ -1,194 +1,194 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* nway-lookup.h - * - * Copyright (C) 2005 IBM Corp. - * - * Internal lookup operations for software - * managed cache. - * - * See nway-opt.h for "optimized" nway - * lookup operations. - */ - -#ifndef __SPE_CACHE_NWAY_LOOKUP_H_ -#define __SPE_CACHE_NWAY_LOOKUP_H_ - - -/** - * _decl_set_entries_ - * Load up set entries (by 4) from an n-way - * set associative cache. Mask off the dirty - * bit, as needed. - */ -#define _decl_set_entries_(set, name, index) \ - vec_uint4 name = *((vec_uint4 *) &spe_cache_dir[set][index]) - - -#define _spe_cache_4_way_lookup_(set, ea) \ -({ \ - _decl_set_entries_(set, e0123, 0); \ - spu_gather(spu_cmpeq(e0123, ea)); \ -}) - -/** - * _spe_cache_set_lookup_ - * Compare 'ea' against all entries of - * a set, and return a result that is - * consistent with spu_gather(). - */ -#define _spe_cache_set_lookup_(set, ea) \ - _spe_cache_4_way_lookup_(set, ea) - - -/** - * _spe_cache_nway_lookup_x4_ - * Declare local variables and lookup four addresses - * in the n-way set associative cache. Upon return, - * 'idx_x4' contains the matching elements in the sets, - * or -1 if not found. - */ -#define _spe_cache_nway_lookup_x4(ea_x4, set_x4, idx_x4) \ -({ \ - vector unsigned int ea_aligned_x4 = spu_and ((ea_x4), ~SPE_CACHELINE_MASK); \ - vector unsigned char splat0 = VEC_LITERAL(vector unsigned char, \ - 0x00, 0x01, 0x02, 0x03, \ - 0x00, 0x01, 0x02, 0x03, \ - 0x00, 0x01, 0x02, 0x03, \ - 0x00, 0x01, 0x02, 0x03); \ - vector unsigned char splat1 = VEC_LITERAL(vector unsigned char, \ - 0x04, 0x05, 0x06, 0x07, \ - 0x04, 0x05, 0x06, 0x07, \ - 0x04, 0x05, 0x06, 0x07, \ - 0x04, 0x05, 0x06, 0x07); \ - vector unsigned char splat2 = VEC_LITERAL(vector unsigned char, \ - 0x08, 0x09, 0x0a, 0x0b, \ - 0x08, 0x09, 0x0a, 0x0b, \ - 0x08, 0x09, 0x0a, 0x0b, \ - 0x08, 0x09, 0x0a, 0x0b); \ - vector unsigned char splat3 = VEC_LITERAL(vector unsigned char, \ - 0x0c, 0x0d, 0x0e, 0x0f, \ - 0x0c, 0x0d, 0x0e, 0x0f, \ - 0x0c, 0x0d, 0x0e, 0x0f, \ - 0x0c, 0x0d, 0x0e, 0x0f); \ - vec_uint4 ea_aligned0 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat0); \ - vec_uint4 ea_aligned1 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat1); \ - vec_uint4 ea_aligned2 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat2); \ - vec_uint4 ea_aligned3 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat3); \ - vec_uint4 found0, found1, found2, found3; \ - vec_uint4 found_x4; \ - (set_x4) = _spe_cache_set_num_x4(ea_x4); \ - found0 = _spe_cache_set_lookup_(spu_extract (set_x4, 0), ea_aligned0); \ - found1 = _spe_cache_set_lookup_(spu_extract (set_x4, 1), ea_aligned1); \ - found2 = _spe_cache_set_lookup_(spu_extract (set_x4, 2), ea_aligned2); \ - found3 = _spe_cache_set_lookup_(spu_extract (set_x4, 3), ea_aligned3); \ - found_x4 = _pack_vec_uint4 (found0, found1, found2, found3); \ - (idx_x4) = (vector signed int)_spe_cache_idx_num_x4(found_x4); \ -}) - -#define _spe_cache_nway_lookup_(ea, set, idx) \ -({ \ - unsigned int ea_aligned = (ea) & ~SPE_CACHELINE_MASK; \ - vec_uint4 ea_aligned4 = spu_splats(ea_aligned); \ - vec_uint4 found; \ - (set) = _spe_cache_set_num_(ea); \ - found = _spe_cache_set_lookup_(set, ea_aligned4); \ - (idx) = _spe_cache_idx_num_(found); \ -}) - -/** - * _spe_cache_lookup_ - * Lookup and return the LSA of an EA - * that is known to be in the cache. - */ -#define _spe_cache_lookup_(ea, is_write) \ -({ \ - int set, idx, line, byte; \ - _spe_cache_nway_lookup_(ea, set, idx); \ - \ - line = _spe_cacheline_num_(set, idx); \ - byte = _spe_cacheline_byte_offset_(ea); \ - (void *) &spe_cache_mem[line + byte]; \ -}) - -/** - * _spe_cache_wait_ - * Wait for transfer of a cache line - * to complete. - */ -#define _spe_cache_wait_(_lsa) \ -({ \ - spu_writech(22, _SPE_CACHELINE_TAGMASK(_lsa)); \ - spu_mfcstat(MFC_TAG_UPDATE_ALL); \ -}) - -/** - * _spe_cache_lookup_wait_ - * Lookup and return the LSA of an EA - * that is known to be in the cache, - * and guarantee that its transfer is - * complete. - */ -#define _spe_cache_lookup_wait_(ea, is_write) \ -({ \ - int set, idx, line, byte; \ - _spe_cache_nway_lookup_(ea, set, idx); \ - \ - line = _spe_cacheline_num_(set, idx); \ - byte = _spe_cacheline_byte_offset_(ea); \ - spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ - spu_mfcstat(MFC_TAG_UPDATE_ALL); \ - (void *) &spe_cache_mem[line + byte]; \ -}) - -/** - * _spe_cache_lookup_xfer_ - * Lookup and return the LSA of an EA, where - * the line may either be in the cache or not. - * If not, initiate transfer but do not wait - * for completion. - */ -#define _spe_cache_lookup_xfer_(ea, is_write, rb) \ -({ \ - int set, idx, line, byte; \ - _spe_cache_nway_lookup_(ea, set, idx); \ - \ - if (unlikely(idx < 0)) { \ - idx = _spe_cache_miss_(ea, set, -1); \ - } \ - line = _spe_cacheline_num_(set, idx); \ - byte = _spe_cacheline_byte_offset_(ea); \ - (void *) &spe_cache_mem[line + byte]; \ -}) - -/** - * _spe_cache_lookup_xfer_wait_ - * Lookup and return the LSA of an EA, where - * the line may either be in the cache or not. - * If not, initiate transfer and guarantee - * completion. - */ -#define _spe_cache_lookup_xfer_wait_(ea, is_write, rb) \ -({ \ - int set, idx, line, byte; \ - _spe_cache_nway_lookup_(ea, set, idx); \ - \ - if (unlikely(idx < 0)) { \ - idx = _spe_cache_miss_(ea, set, -1); \ - spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ - spu_mfcstat(MFC_TAG_UPDATE_ALL); \ - } \ - line = _spe_cacheline_num_(set, idx); \ - byte = _spe_cacheline_byte_offset_(ea); \ - (void *) &spe_cache_mem[line + byte]; \ -}) - -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* nway-lookup.h + * + * Copyright (C) 2005 IBM Corp. + * + * Internal lookup operations for software + * managed cache. + * + * See nway-opt.h for "optimized" nway + * lookup operations. + */ + +#ifndef __SPE_CACHE_NWAY_LOOKUP_H_ +#define __SPE_CACHE_NWAY_LOOKUP_H_ + + +/** + * _decl_set_entries_ + * Load up set entries (by 4) from an n-way + * set associative cache. Mask off the dirty + * bit, as needed. + */ +#define _decl_set_entries_(set, name, index) \ + vec_uint4 name = *((vec_uint4 *) &spe_cache_dir[set][index]) + + +#define _spe_cache_4_way_lookup_(set, ea) \ +({ \ + _decl_set_entries_(set, e0123, 0); \ + spu_gather(spu_cmpeq(e0123, ea)); \ +}) + +/** + * _spe_cache_set_lookup_ + * Compare 'ea' against all entries of + * a set, and return a result that is + * consistent with spu_gather(). + */ +#define _spe_cache_set_lookup_(set, ea) \ + _spe_cache_4_way_lookup_(set, ea) + + +/** + * _spe_cache_nway_lookup_x4_ + * Declare local variables and lookup four addresses + * in the n-way set associative cache. Upon return, + * 'idx_x4' contains the matching elements in the sets, + * or -1 if not found. + */ +#define _spe_cache_nway_lookup_x4(ea_x4, set_x4, idx_x4) \ +({ \ + vector unsigned int ea_aligned_x4 = spu_and ((ea_x4), ~SPE_CACHELINE_MASK); \ + vector unsigned char splat0 = VEC_LITERAL(vector unsigned char, \ + 0x00, 0x01, 0x02, 0x03, \ + 0x00, 0x01, 0x02, 0x03, \ + 0x00, 0x01, 0x02, 0x03, \ + 0x00, 0x01, 0x02, 0x03); \ + vector unsigned char splat1 = VEC_LITERAL(vector unsigned char, \ + 0x04, 0x05, 0x06, 0x07, \ + 0x04, 0x05, 0x06, 0x07, \ + 0x04, 0x05, 0x06, 0x07, \ + 0x04, 0x05, 0x06, 0x07); \ + vector unsigned char splat2 = VEC_LITERAL(vector unsigned char, \ + 0x08, 0x09, 0x0a, 0x0b, \ + 0x08, 0x09, 0x0a, 0x0b, \ + 0x08, 0x09, 0x0a, 0x0b, \ + 0x08, 0x09, 0x0a, 0x0b); \ + vector unsigned char splat3 = VEC_LITERAL(vector unsigned char, \ + 0x0c, 0x0d, 0x0e, 0x0f, \ + 0x0c, 0x0d, 0x0e, 0x0f, \ + 0x0c, 0x0d, 0x0e, 0x0f, \ + 0x0c, 0x0d, 0x0e, 0x0f); \ + vec_uint4 ea_aligned0 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat0); \ + vec_uint4 ea_aligned1 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat1); \ + vec_uint4 ea_aligned2 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat2); \ + vec_uint4 ea_aligned3 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat3); \ + vec_uint4 found0, found1, found2, found3; \ + vec_uint4 found_x4; \ + (set_x4) = _spe_cache_set_num_x4(ea_x4); \ + found0 = _spe_cache_set_lookup_(spu_extract (set_x4, 0), ea_aligned0); \ + found1 = _spe_cache_set_lookup_(spu_extract (set_x4, 1), ea_aligned1); \ + found2 = _spe_cache_set_lookup_(spu_extract (set_x4, 2), ea_aligned2); \ + found3 = _spe_cache_set_lookup_(spu_extract (set_x4, 3), ea_aligned3); \ + found_x4 = _pack_vec_uint4 (found0, found1, found2, found3); \ + (idx_x4) = (vector signed int)_spe_cache_idx_num_x4(found_x4); \ +}) + +#define _spe_cache_nway_lookup_(ea, set, idx) \ +({ \ + unsigned int ea_aligned = (ea) & ~SPE_CACHELINE_MASK; \ + vec_uint4 ea_aligned4 = spu_splats(ea_aligned); \ + vec_uint4 found; \ + (set) = _spe_cache_set_num_(ea); \ + found = _spe_cache_set_lookup_(set, ea_aligned4); \ + (idx) = _spe_cache_idx_num_(found); \ +}) + +/** + * _spe_cache_lookup_ + * Lookup and return the LSA of an EA + * that is known to be in the cache. + */ +#define _spe_cache_lookup_(ea, is_write) \ +({ \ + int set, idx, line, byte; \ + _spe_cache_nway_lookup_(ea, set, idx); \ + \ + line = _spe_cacheline_num_(set, idx); \ + byte = _spe_cacheline_byte_offset_(ea); \ + (void *) &spe_cache_mem[line + byte]; \ +}) + +/** + * _spe_cache_wait_ + * Wait for transfer of a cache line + * to complete. + */ +#define _spe_cache_wait_(_lsa) \ +({ \ + spu_writech(22, _SPE_CACHELINE_TAGMASK(_lsa)); \ + spu_mfcstat(MFC_TAG_UPDATE_ALL); \ +}) + +/** + * _spe_cache_lookup_wait_ + * Lookup and return the LSA of an EA + * that is known to be in the cache, + * and guarantee that its transfer is + * complete. + */ +#define _spe_cache_lookup_wait_(ea, is_write) \ +({ \ + int set, idx, line, byte; \ + _spe_cache_nway_lookup_(ea, set, idx); \ + \ + line = _spe_cacheline_num_(set, idx); \ + byte = _spe_cacheline_byte_offset_(ea); \ + spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ + spu_mfcstat(MFC_TAG_UPDATE_ALL); \ + (void *) &spe_cache_mem[line + byte]; \ +}) + +/** + * _spe_cache_lookup_xfer_ + * Lookup and return the LSA of an EA, where + * the line may either be in the cache or not. + * If not, initiate transfer but do not wait + * for completion. + */ +#define _spe_cache_lookup_xfer_(ea, is_write, rb) \ +({ \ + int set, idx, line, byte; \ + _spe_cache_nway_lookup_(ea, set, idx); \ + \ + if (unlikely(idx < 0)) { \ + idx = _spe_cache_miss_(ea, set, -1); \ + } \ + line = _spe_cacheline_num_(set, idx); \ + byte = _spe_cacheline_byte_offset_(ea); \ + (void *) &spe_cache_mem[line + byte]; \ +}) + +/** + * _spe_cache_lookup_xfer_wait_ + * Lookup and return the LSA of an EA, where + * the line may either be in the cache or not. + * If not, initiate transfer and guarantee + * completion. + */ +#define _spe_cache_lookup_xfer_wait_(ea, is_write, rb) \ +({ \ + int set, idx, line, byte; \ + _spe_cache_nway_lookup_(ea, set, idx); \ + \ + if (unlikely(idx < 0)) { \ + idx = _spe_cache_miss_(ea, set, -1); \ + spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ + spu_mfcstat(MFC_TAG_UPDATE_ALL); \ + } \ + line = _spe_cacheline_num_(set, idx); \ + byte = _spe_cacheline_byte_offset_(ea); \ + (void *) &spe_cache_mem[line + byte]; \ +}) + +#endif diff --git a/Extras/software_cache/cache/include/nway-miss.h b/Extras/software_cache/cache/include/nway-miss.h index 4c73ae8bf..dfe50f2ae 100644 --- a/Extras/software_cache/cache/include/nway-miss.h +++ b/Extras/software_cache/cache/include/nway-miss.h @@ -1,51 +1,51 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* nway-miss.h - * - * Copyright (C) 2005 IBM Corp. - * - * Internal handler for cache misses. - */ - -#ifndef __SPE_CACHE_NWAY_MISS_H__ -#define __SPE_CACHE_NWAY_MISS_H__ - -static int _spe_cache_miss_(unsigned int ea, int set, int avail) -{ - unsigned int ea_aligned = ea & ~SPE_CACHELINE_MASK; - vec_uint4 slot; - vec_uint4 exists = _spe_cache_set_lookup_(set, ea_aligned); - int idx, line; - - /* Double check to make sure that the entry has not - * already been allocated in this set. This condition - * might occur if multiple lookups are being perfomed - * simultaneously. - */ - if (unlikely(spu_extract(exists, 0) != 0)) { - return _spe_cache_idx_num_(exists); - } - - /* Now check to see if there are empty slots - * that are available in the set. - */ - slot = _spe_cache_replace_(set, avail); - idx = _spe_cache_idx_num_(slot); - line = _spe_cacheline_num_(set, idx); - - spu_mfcdma32(&spe_cache_mem[line], ea_aligned, SPE_CACHELINE_SIZE, - SPE_CACHE_SET_TAGID(set), SPE_CACHE_GET); - - spe_cache_dir[set][SPE_CACHE_NWAY_MASK - idx] = ea_aligned; - - return idx; -} -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* nway-miss.h + * + * Copyright (C) 2005 IBM Corp. + * + * Internal handler for cache misses. + */ + +#ifndef __SPE_CACHE_NWAY_MISS_H__ +#define __SPE_CACHE_NWAY_MISS_H__ + +static int _spe_cache_miss_(unsigned int ea, int set, int avail) +{ + unsigned int ea_aligned = ea & ~SPE_CACHELINE_MASK; + vec_uint4 slot; + vec_uint4 exists = _spe_cache_set_lookup_(set, ea_aligned); + int idx, line; + + /* Double check to make sure that the entry has not + * already been allocated in this set. This condition + * might occur if multiple lookups are being perfomed + * simultaneously. + */ + if (unlikely(spu_extract(exists, 0) != 0)) { + return _spe_cache_idx_num_(exists); + } + + /* Now check to see if there are empty slots + * that are available in the set. + */ + slot = _spe_cache_replace_(set, avail); + idx = _spe_cache_idx_num_(slot); + line = _spe_cacheline_num_(set, idx); + + spu_mfcdma32(&spe_cache_mem[line], ea_aligned, SPE_CACHELINE_SIZE, + SPE_CACHE_SET_TAGID(set), SPE_CACHE_GET); + + spe_cache_dir[set][SPE_CACHE_NWAY_MASK - idx] = ea_aligned; + + return idx; +} +#endif diff --git a/Extras/software_cache/cache/include/nway-opt.h b/Extras/software_cache/cache/include/nway-opt.h index 6a96773c6..ec3993acb 100644 --- a/Extras/software_cache/cache/include/nway-opt.h +++ b/Extras/software_cache/cache/include/nway-opt.h @@ -1,153 +1,153 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* nway-opt.h - * - * Copyright (C) 2006 IBM Corp. - * - * "Optimized" lookup operations for n-way set associative - * software managed cache. - */ -#include - -#ifndef __SPE_CACHE_NWAY_OPT_H_ -#define __SPE_CACHE_NWAY_OPT_H_ - -/* __spe_cache_rd - * Look up and return data from the cache. If the data - * is not currently in cache then transfer it from main - * storage. - * - * This code uses a conditional branch to the cache miss - * handler in the event that the requested data is not - * in the cache. A branch hint is used to avoid paying - * the branch stall penalty. - */ -#define __spe_cache_rd(type, ea) \ -({ \ - int set, idx, lnum, byte; \ - type ret; \ - _spe_cache_nway_lookup_(ea, set, idx); \ - if (unlikely(idx < 0)) { \ - idx = _spe_cache_miss_(ea, set, -1); \ - spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ - spu_mfcstat(MFC_TAG_UPDATE_ALL); \ - } \ - lnum = _spe_cacheline_num_(set, idx); \ - byte = _spe_cacheline_byte_offset_(ea); \ - ret = *((type *) (&spe_cache_mem[lnum + byte])); \ - ret; \ -}) - -/** - * __spe_cache_rd_x4 - * Fetch four data elements from the cache. - * - * This code uses one conditional branch in - * the event that any of the four elements - * are missing. - * - * On a miss, light weight locking is used to - * avoid casting out entries that were found. - * Further, we wait just once for the transfers, - * allowing for parallel [rather than serial] - * transfers. - */ - -#define __spe_cache_rd_x4(type, ea_x4) \ -({ \ - vector unsigned int missing; \ - unsigned int ms; \ - vector unsigned int cindex; \ - unsigned int d0, d1, d2, d3; \ - vector unsigned int s_x4; \ - vector signed int i_x4; \ - vector unsigned int ibyte, iline; \ - vector unsigned int ret; \ - unsigned int idx0, idx1, idx2, idx3; \ - \ - _spe_cache_nway_lookup_x4(ea_x4, s_x4, i_x4); \ - missing = spu_rlmask ((vector unsigned int)i_x4, -8); \ - ms = spu_extract (spu_gather (missing), 0); \ - \ - ibyte = _spe_cacheline_byte_offset_x4(ea_x4); \ - \ - iline = _spe_cacheline_num_x4(s_x4, \ - (vector unsigned int)i_x4); \ - \ - cindex = spu_add (iline, ibyte); \ - \ - idx0 = spu_extract (cindex, 0); \ - idx1 = spu_extract (cindex, 1); \ - idx2 = spu_extract (cindex, 2); \ - idx3 = spu_extract (cindex, 3); \ - \ - d0 = *((type *) (&spe_cache_mem[idx0])); \ - d1 = *((type *) (&spe_cache_mem[idx1])); \ - d2 = *((type *) (&spe_cache_mem[idx2])); \ - d3 = *((type *) (&spe_cache_mem[idx3])); \ - \ - ret = _load_vec_uint4 (d0, d1, d2, d3); \ - \ - if (unlikely(ms)) { \ - int b0 = spu_extract (ibyte, 0); \ - int b1 = spu_extract (ibyte, 1); \ - int b2 = spu_extract (ibyte, 2); \ - int b3 = spu_extract (ibyte, 3); \ - int lnum0; \ - int lnum1; \ - int lnum2; \ - int lnum3; \ - int s0 = spu_extract (s_x4, 0); \ - int s1 = spu_extract (s_x4, 1); \ - int s2 = spu_extract (s_x4, 2); \ - int s3 = spu_extract (s_x4, 3); \ - int i0 = spu_extract (i_x4, 0); \ - int i1 = spu_extract (i_x4, 1); \ - int i2 = spu_extract (i_x4, 2); \ - int i3 = spu_extract (i_x4, 3); \ - unsigned int ea0 = spu_extract(ea_x4, 0); \ - unsigned int ea1 = spu_extract(ea_x4, 1); \ - unsigned int ea2 = spu_extract(ea_x4, 2); \ - unsigned int ea3 = spu_extract(ea_x4, 3); \ - int avail = -1; \ - \ - avail &= ~(((i0 < 0) ? 0 : (1 << i0)) | \ - ((i1 < 0) ? 0 : (1 << i1)) | \ - ((i2 < 0) ? 0 : (1 << i2)) | \ - ((i3 < 0) ? 0 : (1 << i3))); \ - \ - i0 = _spe_cache_miss_(ea0, s0, avail); \ - avail &= ~(1 << i0); \ - i1 = _spe_cache_miss_(ea1, s1, avail); \ - avail &= ~(1 << i1); \ - i2 = _spe_cache_miss_(ea2, s2, avail); \ - avail &= ~(1 << i2); \ - i3 = _spe_cache_miss_(ea3, s3, avail); \ - \ - lnum0 = _spe_cacheline_num_(s0, i0); \ - lnum1 = _spe_cacheline_num_(s1, i1); \ - lnum2 = _spe_cacheline_num_(s2, i2); \ - lnum3 = _spe_cacheline_num_(s3, i3); \ - \ - spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ - spu_mfcstat(MFC_TAG_UPDATE_ALL); \ - \ - d0 = *((type *) (&spe_cache_mem[lnum0 + b0])); \ - d1 = *((type *) (&spe_cache_mem[lnum1 + b1])); \ - d2 = *((type *) (&spe_cache_mem[lnum2 + b2])); \ - d3 = *((type *) (&spe_cache_mem[lnum3 + b3])); \ - \ - ret = _load_vec_uint4 (d0, d1, d2, d3); \ - } \ - ret; \ -}) - -#endif /* _SPE_CACHE_NWAY_OPT_H_ */ +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* nway-opt.h + * + * Copyright (C) 2006 IBM Corp. + * + * "Optimized" lookup operations for n-way set associative + * software managed cache. + */ +#include + +#ifndef __SPE_CACHE_NWAY_OPT_H_ +#define __SPE_CACHE_NWAY_OPT_H_ + +/* __spe_cache_rd + * Look up and return data from the cache. If the data + * is not currently in cache then transfer it from main + * storage. + * + * This code uses a conditional branch to the cache miss + * handler in the event that the requested data is not + * in the cache. A branch hint is used to avoid paying + * the branch stall penalty. + */ +#define __spe_cache_rd(type, ea) \ +({ \ + int set, idx, lnum, byte; \ + type ret; \ + _spe_cache_nway_lookup_(ea, set, idx); \ + if (unlikely(idx < 0)) { \ + idx = _spe_cache_miss_(ea, set, -1); \ + spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ + spu_mfcstat(MFC_TAG_UPDATE_ALL); \ + } \ + lnum = _spe_cacheline_num_(set, idx); \ + byte = _spe_cacheline_byte_offset_(ea); \ + ret = *((type *) (&spe_cache_mem[lnum + byte])); \ + ret; \ +}) + +/** + * __spe_cache_rd_x4 + * Fetch four data elements from the cache. + * + * This code uses one conditional branch in + * the event that any of the four elements + * are missing. + * + * On a miss, light weight locking is used to + * avoid casting out entries that were found. + * Further, we wait just once for the transfers, + * allowing for parallel [rather than serial] + * transfers. + */ + +#define __spe_cache_rd_x4(type, ea_x4) \ +({ \ + vector unsigned int missing; \ + unsigned int ms; \ + vector unsigned int cindex; \ + unsigned int d0, d1, d2, d3; \ + vector unsigned int s_x4; \ + vector signed int i_x4; \ + vector unsigned int ibyte, iline; \ + vector unsigned int ret; \ + unsigned int idx0, idx1, idx2, idx3; \ + \ + _spe_cache_nway_lookup_x4(ea_x4, s_x4, i_x4); \ + missing = spu_rlmask ((vector unsigned int)i_x4, -8); \ + ms = spu_extract (spu_gather (missing), 0); \ + \ + ibyte = _spe_cacheline_byte_offset_x4(ea_x4); \ + \ + iline = _spe_cacheline_num_x4(s_x4, \ + (vector unsigned int)i_x4); \ + \ + cindex = spu_add (iline, ibyte); \ + \ + idx0 = spu_extract (cindex, 0); \ + idx1 = spu_extract (cindex, 1); \ + idx2 = spu_extract (cindex, 2); \ + idx3 = spu_extract (cindex, 3); \ + \ + d0 = *((type *) (&spe_cache_mem[idx0])); \ + d1 = *((type *) (&spe_cache_mem[idx1])); \ + d2 = *((type *) (&spe_cache_mem[idx2])); \ + d3 = *((type *) (&spe_cache_mem[idx3])); \ + \ + ret = _load_vec_uint4 (d0, d1, d2, d3); \ + \ + if (unlikely(ms)) { \ + int b0 = spu_extract (ibyte, 0); \ + int b1 = spu_extract (ibyte, 1); \ + int b2 = spu_extract (ibyte, 2); \ + int b3 = spu_extract (ibyte, 3); \ + int lnum0; \ + int lnum1; \ + int lnum2; \ + int lnum3; \ + int s0 = spu_extract (s_x4, 0); \ + int s1 = spu_extract (s_x4, 1); \ + int s2 = spu_extract (s_x4, 2); \ + int s3 = spu_extract (s_x4, 3); \ + int i0 = spu_extract (i_x4, 0); \ + int i1 = spu_extract (i_x4, 1); \ + int i2 = spu_extract (i_x4, 2); \ + int i3 = spu_extract (i_x4, 3); \ + unsigned int ea0 = spu_extract(ea_x4, 0); \ + unsigned int ea1 = spu_extract(ea_x4, 1); \ + unsigned int ea2 = spu_extract(ea_x4, 2); \ + unsigned int ea3 = spu_extract(ea_x4, 3); \ + int avail = -1; \ + \ + avail &= ~(((i0 < 0) ? 0 : (1 << i0)) | \ + ((i1 < 0) ? 0 : (1 << i1)) | \ + ((i2 < 0) ? 0 : (1 << i2)) | \ + ((i3 < 0) ? 0 : (1 << i3))); \ + \ + i0 = _spe_cache_miss_(ea0, s0, avail); \ + avail &= ~(1 << i0); \ + i1 = _spe_cache_miss_(ea1, s1, avail); \ + avail &= ~(1 << i1); \ + i2 = _spe_cache_miss_(ea2, s2, avail); \ + avail &= ~(1 << i2); \ + i3 = _spe_cache_miss_(ea3, s3, avail); \ + \ + lnum0 = _spe_cacheline_num_(s0, i0); \ + lnum1 = _spe_cacheline_num_(s1, i1); \ + lnum2 = _spe_cacheline_num_(s2, i2); \ + lnum3 = _spe_cacheline_num_(s3, i3); \ + \ + spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \ + spu_mfcstat(MFC_TAG_UPDATE_ALL); \ + \ + d0 = *((type *) (&spe_cache_mem[lnum0 + b0])); \ + d1 = *((type *) (&spe_cache_mem[lnum1 + b1])); \ + d2 = *((type *) (&spe_cache_mem[lnum2 + b2])); \ + d3 = *((type *) (&spe_cache_mem[lnum3 + b3])); \ + \ + ret = _load_vec_uint4 (d0, d1, d2, d3); \ + } \ + ret; \ +}) + +#endif /* _SPE_CACHE_NWAY_OPT_H_ */ diff --git a/Extras/software_cache/cache/include/nway-replace.h b/Extras/software_cache/cache/include/nway-replace.h index 72fce1876..213301c2d 100644 --- a/Extras/software_cache/cache/include/nway-replace.h +++ b/Extras/software_cache/cache/include/nway-replace.h @@ -1,38 +1,38 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* nway-replace.h - * - * Copyright (C) 2005 IBM Corp. - * - * Implement replacement for software - * managed cache. - */ - -#ifndef __SPE_CACHE_NWAY_REPLACE_H_ -#define __SPE_CACHE_NWAY_REPLACE_H_ - -static vec_uint4 spe_cache_replace_cntr[SPE_CACHE_NSETS+1]; - -static inline vec_uint4 _spe_cache_replace_(int set, int avail) -{ - unsigned int mask = ((1 << SPE_CACHE_NWAY) - 1) & avail; - unsigned int curr, currbit, next; - - curr = spu_extract(spe_cache_replace_cntr[set], 0) & SPE_CACHE_NWAY_MASK; - currbit = (1 << curr); - next = (curr + 1) & SPE_CACHE_NWAY_MASK; - spe_cache_replace_cntr[set] = (vec_uint4) spu_promote(next, 0); - mask = (mask & currbit) ? currbit : mask; - - return (vec_uint4) spu_promote(mask, 0); -} - -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* nway-replace.h + * + * Copyright (C) 2005 IBM Corp. + * + * Implement replacement for software + * managed cache. + */ + +#ifndef __SPE_CACHE_NWAY_REPLACE_H_ +#define __SPE_CACHE_NWAY_REPLACE_H_ + +static vec_uint4 spe_cache_replace_cntr[SPE_CACHE_NSETS+1]; + +static inline vec_uint4 _spe_cache_replace_(int set, int avail) +{ + unsigned int mask = ((1 << SPE_CACHE_NWAY) - 1) & avail; + unsigned int curr, currbit, next; + + curr = spu_extract(spe_cache_replace_cntr[set], 0) & SPE_CACHE_NWAY_MASK; + currbit = (1 << curr); + next = (curr + 1) & SPE_CACHE_NWAY_MASK; + spe_cache_replace_cntr[set] = (vec_uint4) spu_promote(next, 0); + mask = (mask & currbit) ? currbit : mask; + + return (vec_uint4) spu_promote(mask, 0); +} + +#endif diff --git a/Extras/software_cache/cache/include/nway.h b/Extras/software_cache/cache/include/nway.h index 494cd6bea..0b37817b0 100644 --- a/Extras/software_cache/cache/include/nway.h +++ b/Extras/software_cache/cache/include/nway.h @@ -1,105 +1,105 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* nway.h - * - * Copyright (C) 2005 IBM Corp. - * - * Support for n-way set associative software - * managed cache. The 4-way associative cache - * is the only interface exposed currently. - */ - -#ifndef __SPE_CACHE_NWAY_H_ -#define __SPE_CACHE_NWAY_H_ - -/** - ** Defn's for n-way set associativity. - ** Default is 4-way. - */ -#define SPE_CACHE_NWAY 4 -#define SPE_CACHE_NWAY_SHIFT 2 - -#define SPE_CACHE_NWAY_MASK (SPE_CACHE_NWAY - 1) -#define SPE_CACHE_NENTRIES (SPE_CACHE_NWAY * SPE_CACHE_NSETS) -#define SPE_CACHE_MEM_SIZE (SPE_CACHE_NENTRIES * SPE_CACHELINE_SIZE) - -#define _spe_cache_set_num_(ea) \ -({ \ - unsigned int ead, eadm, ret; \ - ead = ((ea) >> SPE_CACHELINE_SHIFT); \ - eadm = ((ea) >> (SPE_CACHELINE_SHIFT+2)); \ - ret = (ead ^ eadm) & SPE_CACHE_NSETS_MASK; \ - ret; \ -}) - -#define _spe_cache_set_num_x4(ea_x4) \ -({ \ - vector unsigned int tmp0; \ - vector unsigned int tmp1; \ - tmp0 = spu_rlmask (ea_x4, -SPE_CACHELINE_SHIFT); \ - tmp1 = spu_rlmask (ea_x4, -(SPE_CACHELINE_SHIFT+1)); \ - spu_and (spu_xor (tmp0, tmp1), SPE_CACHE_NSETS_MASK); \ -}) - -#define _spe_cache_idx_num_x4(found) \ - spu_sub((unsigned int) 31, spu_cntlz(found)) - -#define _spe_cache_idx_num_(found) \ - spu_extract(spu_sub((unsigned int) 31, spu_cntlz(found)), 0) - -#define _spe_cacheline_num_(set, idx) \ - (((set << SPE_CACHE_NWAY_SHIFT) + idx) << SPE_CACHELINE_SHIFT) - -#define _spe_cacheline_num_x4(set, idx) \ - spu_sl (spu_add (spu_sl (set, SPE_CACHE_NWAY_SHIFT), idx), SPE_CACHELINE_SHIFT) - -#define _spe_cacheline_is_dirty_(set, idx) \ - (spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] & SPE_CACHELINE_DIRTY) - -#define _spe_cacheline_is_locked_(set, idx) \ - (spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] & SPE_CACHELINE_LOCKED) - -#define _spe_lock_cacheline_(set, idx) \ - spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] |= SPE_CACHELINE_LOCKED - -#define _spe_unlock_cacheline_(set, idx) \ - spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] &= ~SPE_CACHELINE_LOCKED - - -/** - * spe_cache_dir - * This is the n-way set associative cache - * directory. Entries are either zero (unused) - * or non-zero (used). - * - * State for one additional (dummy) set is - * allocated to improve efficiency of cache - * line locking. - * volatile seems not to be necessary here, the SCE toolchain guarantees a barrier after dma transfer - */ -static unsigned int spe_cache_dir[SPE_CACHE_NSETS+1][SPE_CACHE_NWAY] - __attribute__ ((aligned(16))); - -/** - * spe_cache_mem - * A contiguous set of cachelines in LS memory, - * one line for each entry in the cache. - * volatile seems not to be necessary here, the SCE toolchain guarantees a barrier after dma transfer - */ -static char spe_cache_mem[SPE_CACHE_MEM_SIZE] - __attribute__ ((aligned(128))); - -#include "nway-lookup.h" -#include "nway-replace.h" -#include "nway-miss.h" -#include "nway-opt.h" - -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* nway.h + * + * Copyright (C) 2005 IBM Corp. + * + * Support for n-way set associative software + * managed cache. The 4-way associative cache + * is the only interface exposed currently. + */ + +#ifndef __SPE_CACHE_NWAY_H_ +#define __SPE_CACHE_NWAY_H_ + +/** + ** Defn's for n-way set associativity. + ** Default is 4-way. + */ +#define SPE_CACHE_NWAY 4 +#define SPE_CACHE_NWAY_SHIFT 2 + +#define SPE_CACHE_NWAY_MASK (SPE_CACHE_NWAY - 1) +#define SPE_CACHE_NENTRIES (SPE_CACHE_NWAY * SPE_CACHE_NSETS) +#define SPE_CACHE_MEM_SIZE (SPE_CACHE_NENTRIES * SPE_CACHELINE_SIZE) + +#define _spe_cache_set_num_(ea) \ +({ \ + unsigned int ead, eadm, ret; \ + ead = ((ea) >> SPE_CACHELINE_SHIFT); \ + eadm = ((ea) >> (SPE_CACHELINE_SHIFT+2)); \ + ret = (ead ^ eadm) & SPE_CACHE_NSETS_MASK; \ + ret; \ +}) + +#define _spe_cache_set_num_x4(ea_x4) \ +({ \ + vector unsigned int tmp0; \ + vector unsigned int tmp1; \ + tmp0 = spu_rlmask (ea_x4, -SPE_CACHELINE_SHIFT); \ + tmp1 = spu_rlmask (ea_x4, -(SPE_CACHELINE_SHIFT+1)); \ + spu_and (spu_xor (tmp0, tmp1), SPE_CACHE_NSETS_MASK); \ +}) + +#define _spe_cache_idx_num_x4(found) \ + spu_sub((unsigned int) 31, spu_cntlz(found)) + +#define _spe_cache_idx_num_(found) \ + spu_extract(spu_sub((unsigned int) 31, spu_cntlz(found)), 0) + +#define _spe_cacheline_num_(set, idx) \ + (((set << SPE_CACHE_NWAY_SHIFT) + idx) << SPE_CACHELINE_SHIFT) + +#define _spe_cacheline_num_x4(set, idx) \ + spu_sl (spu_add (spu_sl (set, SPE_CACHE_NWAY_SHIFT), idx), SPE_CACHELINE_SHIFT) + +#define _spe_cacheline_is_dirty_(set, idx) \ + (spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] & SPE_CACHELINE_DIRTY) + +#define _spe_cacheline_is_locked_(set, idx) \ + (spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] & SPE_CACHELINE_LOCKED) + +#define _spe_lock_cacheline_(set, idx) \ + spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] |= SPE_CACHELINE_LOCKED + +#define _spe_unlock_cacheline_(set, idx) \ + spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] &= ~SPE_CACHELINE_LOCKED + + +/** + * spe_cache_dir + * This is the n-way set associative cache + * directory. Entries are either zero (unused) + * or non-zero (used). + * + * State for one additional (dummy) set is + * allocated to improve efficiency of cache + * line locking. + * volatile seems not to be necessary here, the SCE toolchain guarantees a barrier after dma transfer + */ +static unsigned int spe_cache_dir[SPE_CACHE_NSETS+1][SPE_CACHE_NWAY] + __attribute__ ((aligned(16))); + +/** + * spe_cache_mem + * A contiguous set of cachelines in LS memory, + * one line for each entry in the cache. + * volatile seems not to be necessary here, the SCE toolchain guarantees a barrier after dma transfer + */ +static char spe_cache_mem[SPE_CACHE_MEM_SIZE] + __attribute__ ((aligned(128))); + +#include "nway-lookup.h" +#include "nway-replace.h" +#include "nway-miss.h" +#include "nway-opt.h" + +#endif diff --git a/Extras/software_cache/cache/include/spe_cache.h b/Extras/software_cache/cache/include/spe_cache.h index f632bf11b..89b0bbb4a 100644 --- a/Extras/software_cache/cache/include/spe_cache.h +++ b/Extras/software_cache/cache/include/spe_cache.h @@ -1,32 +1,32 @@ -/* --------------------------------------------------------------- */ -/* PLEASE DO NOT MODIFY THIS SECTION */ -/* This prolog section is automatically generated. */ -/* */ -/* (C) Copyright 2001,2006, */ -/* International Business Machines Corporation, */ -/* */ -/* All Rights Reserved. */ -/* --------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -/* spe_cache.h - * - * Copyright (C) 2005 IBM Corp. - * - * Top level include file implementing - * software managed cache. - */ - -#ifndef __SPE_CACHE_H__ -#define __SPE_CACHE_H__ 1 - -#include "vec_literal.h" -#include "ilog2.h" -#include "memset.h" -//#include - -#include "defs.h" -#include "dma.h" -#include "nway.h" -#include "api.h" - -#endif +/* --------------------------------------------------------------- */ +/* PLEASE DO NOT MODIFY THIS SECTION */ +/* This prolog section is automatically generated. */ +/* */ +/* (C) Copyright 2001,2006, */ +/* International Business Machines Corporation, */ +/* */ +/* All Rights Reserved. */ +/* --------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +/* spe_cache.h + * + * Copyright (C) 2005 IBM Corp. + * + * Top level include file implementing + * software managed cache. + */ + +#ifndef __SPE_CACHE_H__ +#define __SPE_CACHE_H__ 1 + +#include "vec_literal.h" +#include "ilog2.h" +#include "memset.h" +//#include + +#include "defs.h" +#include "dma.h" +#include "nway.h" +#include "api.h" + +#endif diff --git a/Extras/software_cache/cache/include/vec_literal.h b/Extras/software_cache/cache/include/vec_literal.h index a7734708f..c58e1b552 100644 --- a/Extras/software_cache/cache/include/vec_literal.h +++ b/Extras/software_cache/cache/include/vec_literal.h @@ -1,74 +1,74 @@ -/* @(#)86 1.3 src/include/vec_literal.h, sw.includes, sdk_pub 10/11/05 16:00:27 */ -/* -------------------------------------------------------------- */ -/* (C) Copyright 2001,2005, */ -/* International Business Machines Corporation, */ -/* Sony Computer Entertainment Incorporated, */ -/* Toshiba Corporation. */ -/* */ -/* All Rights Reserved. */ -/* -------------------------------------------------------------- */ -/* PROLOG END TAG zYx */ -#ifndef _VEC_LITERAL_H_ -#define _VEC_LITERAL_H_ - -/* This header files provides an abstraction for the various implementations - * of vector literal construction. The two formats are: - * - * 1) Altivec styled using parenthesis - * 2) C grammer friendly styled using curly braces - * - * The macro, VEC_LITERAL has been developed to provide some portability - * in these two styles. To achieve true portability, user must specify all - * elements of the vector being initialized. A single element can be provided - * but only the first element guarenteed across both construction styles. - * - * The VEC_SPLAT_* macros have been provided for portability of vector literal - * construction when all the elements of the vector contain the same value. - */ - -#ifdef __SPU__ -#include -#endif - - -#ifdef __ALTIVEC_LITERAL_STYLE__ -/* Use altivec style. - */ -#define VEC_LITERAL(_type, ...) ((_type)(__VA_ARGS__)) - -#define VEC_SPLAT_U8(_val) ((vector unsigned char)(_val)) -#define VEC_SPLAT_S8(_val) ((vector signed char)(_val)) - -#define VEC_SPLAT_U16(_val) ((vector unsigned short)(_val)) -#define VEC_SPLAT_S16(_val) ((vector signed short)(_val)) - -#define VEC_SPLAT_U32(_val) ((vector unsigned int)(_val)) -#define VEC_SPLAT_S32(_val) ((vector signed int)(_val)) -#define VEC_SPLAT_F32(_val) ((vector float)(_val)) - -#define VEC_SPLAT_U64(_val) ((vector unsigned long long)(_val)) -#define VEC_SPLAT_S64(_val) ((vector signed long long)(_val)) -#define VEC_SPLAT_F64(_val) ((vector double)(_val)) - -#else -/* Use curly brace style. - */ -#define VEC_LITERAL(_type, ...) ((_type){__VA_ARGS__}) - -#define VEC_SPLAT_U8(_val) ((vector unsigned char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val}) -#define VEC_SPLAT_S8(_val) ((vector signed char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val}) - -#define VEC_SPLAT_U16(_val) ((vector unsigned short){_val, _val, _val, _val, _val, _val, _val, _val}) -#define VEC_SPLAT_S16(_val) ((vector signed short){_val, _val, _val, _val, _val, _val, _val, _val}) - -#define VEC_SPLAT_U32(_val) ((vector unsigned int){_val, _val, _val, _val}) -#define VEC_SPLAT_S32(_val) ((vector signed int){_val, _val, _val, _val}) -#define VEC_SPLAT_F32(_val) ((vector float){_val, _val, _val, _val}) - -#define VEC_SPLAT_U64(_val) ((vector unsigned long long){_val, _val}) -#define VEC_SPLAT_S64(_val) ((vector signed long long){_val, _val}) -#define VEC_SPLAT_F64(_val) ((vector double){_val, _val}) - -#endif - -#endif /* _VEC_LITERAL_H_ */ +/* @(#)86 1.3 src/include/vec_literal.h, sw.includes, sdk_pub 10/11/05 16:00:27 */ +/* -------------------------------------------------------------- */ +/* (C) Copyright 2001,2005, */ +/* International Business Machines Corporation, */ +/* Sony Computer Entertainment Incorporated, */ +/* Toshiba Corporation. */ +/* */ +/* All Rights Reserved. */ +/* -------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +#ifndef _VEC_LITERAL_H_ +#define _VEC_LITERAL_H_ + +/* This header files provides an abstraction for the various implementations + * of vector literal construction. The two formats are: + * + * 1) Altivec styled using parenthesis + * 2) C grammer friendly styled using curly braces + * + * The macro, VEC_LITERAL has been developed to provide some portability + * in these two styles. To achieve true portability, user must specify all + * elements of the vector being initialized. A single element can be provided + * but only the first element guarenteed across both construction styles. + * + * The VEC_SPLAT_* macros have been provided for portability of vector literal + * construction when all the elements of the vector contain the same value. + */ + +#ifdef __SPU__ +#include +#endif + + +#ifdef __ALTIVEC_LITERAL_STYLE__ +/* Use altivec style. + */ +#define VEC_LITERAL(_type, ...) ((_type)(__VA_ARGS__)) + +#define VEC_SPLAT_U8(_val) ((vector unsigned char)(_val)) +#define VEC_SPLAT_S8(_val) ((vector signed char)(_val)) + +#define VEC_SPLAT_U16(_val) ((vector unsigned short)(_val)) +#define VEC_SPLAT_S16(_val) ((vector signed short)(_val)) + +#define VEC_SPLAT_U32(_val) ((vector unsigned int)(_val)) +#define VEC_SPLAT_S32(_val) ((vector signed int)(_val)) +#define VEC_SPLAT_F32(_val) ((vector float)(_val)) + +#define VEC_SPLAT_U64(_val) ((vector unsigned long long)(_val)) +#define VEC_SPLAT_S64(_val) ((vector signed long long)(_val)) +#define VEC_SPLAT_F64(_val) ((vector double)(_val)) + +#else +/* Use curly brace style. + */ +#define VEC_LITERAL(_type, ...) ((_type){__VA_ARGS__}) + +#define VEC_SPLAT_U8(_val) ((vector unsigned char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val}) +#define VEC_SPLAT_S8(_val) ((vector signed char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val}) + +#define VEC_SPLAT_U16(_val) ((vector unsigned short){_val, _val, _val, _val, _val, _val, _val, _val}) +#define VEC_SPLAT_S16(_val) ((vector signed short){_val, _val, _val, _val, _val, _val, _val, _val}) + +#define VEC_SPLAT_U32(_val) ((vector unsigned int){_val, _val, _val, _val}) +#define VEC_SPLAT_S32(_val) ((vector signed int){_val, _val, _val, _val}) +#define VEC_SPLAT_F32(_val) ((vector float){_val, _val, _val, _val}) + +#define VEC_SPLAT_U64(_val) ((vector unsigned long long){_val, _val}) +#define VEC_SPLAT_S64(_val) ((vector signed long long){_val, _val}) +#define VEC_SPLAT_F64(_val) ((vector double){_val, _val}) + +#endif + +#endif /* _VEC_LITERAL_H_ */ diff --git a/Extras/sph/READ_ME.txt b/Extras/sph/READ_ME.txt index b5fef2bda..59546ca49 100644 --- a/Extras/sph/READ_ME.txt +++ b/Extras/sph/READ_ME.txt @@ -1,35 +1,35 @@ - -FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU -Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - -A fast CPU and GPU fluid simulator. See website above for details. - -Notes -(April 2009) -------------------- - -- Press 'h' for help screen. This shows keyboard cmds available. - -- By default, GPU simulation is off. - When running the fluid_gpu.exe, press 'g' to start/stop GPU simulation. - -- Disabling shadows in common_defs.h will greatly speed up the simulation - (You can also press 's' to render without shadows) - -- As of April 2009, CUDA builds only under Visual Studio 2005, not VS 2008. - To enable the CUDA build in VS2005, set the BUILD_CUDA define in common_defs.h - Be sure this is turned off if you build with VS2008. - -- The GPU integrator is not yet complete. Integration always takes place on the CPU, in both CPU and GPU modes. (As a result, this forces a bus transfer to and from the GPU per cycle. Once the integrator is finished, GPU simulation performance should increase significantly.) - -- Occassionally, the GPU simulation with crash cuda, causing the screen to blink and particles to move randomly. This is believed to be due to a not-yet-found out of bounds condition. - -ZLib License -------------------- -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. + +FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU +Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + +A fast CPU and GPU fluid simulator. See website above for details. + +Notes +(April 2009) +------------------- + +- Press 'h' for help screen. This shows keyboard cmds available. + +- By default, GPU simulation is off. + When running the fluid_gpu.exe, press 'g' to start/stop GPU simulation. + +- Disabling shadows in common_defs.h will greatly speed up the simulation + (You can also press 's' to render without shadows) + +- As of April 2009, CUDA builds only under Visual Studio 2005, not VS 2008. + To enable the CUDA build in VS2005, set the BUILD_CUDA define in common_defs.h + Be sure this is turned off if you build with VS2008. + +- The GPU integrator is not yet complete. Integration always takes place on the CPU, in both CPU and GPU modes. (As a result, this forces a bus transfer to and from the GPU per cycle. Once the integrator is finished, GPU simulation performance should increase significantly.) + +- Occassionally, the GPU simulation with crash cuda, causing the screen to blink and particles to move randomly. This is believed to be due to a not-yet-found out of bounds condition. + +ZLib License +------------------- +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. \ No newline at end of file diff --git a/Extras/sph/common/GLee.c b/Extras/sph/common/GLee.c index b89fae645..245b04d80 100644 --- a/Extras/sph/common/GLee.c +++ b/Extras/sph/common/GLee.c @@ -1,18170 +1,18170 @@ -/*************************************************************************** -* -* GLee.c -* GLee (OpenGL Easy Extension library) -* Version : 5.4 -* -* Copyright (c)2009 Ben Woodhouse All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are -* met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer as -* the first lines of this file unmodified. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR -* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -* IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -* Web: http://elf-stone.com/glee.php -* -* [This file was automatically generated by GLeeGen 7.0 -* -***************************************************************************/ - -#ifdef _MSC_VER - #pragma optimize( "g", off ) -#endif - -#include -#include -#include -#include "GLee.h" - -#if defined(__APPLE__) || defined(__APPLE_CC__) - #include -#endif - -typedef GLuint(*GLEE_LINK_FUNCTION)(void); - -GLboolean __GLeeInited=GL_FALSE; - -#ifndef _WIN32 - #define __stdcall /* nothing */ -#endif - -void * __GLeeGetProcAddress(const char *extname) -{ -#ifdef WIN32 - return (void*)wglGetProcAddress(extname); -#elif defined(__APPLE__) || defined(__APPLE_CC__) - CFBundleRef bundle; - CFURLRef bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true); - - CFStringRef functionName = CFStringCreateWithCString(kCFAllocatorDefault, extname, kCFStringEncodingASCII); - - void *function; - - bundle = CFBundleCreate(kCFAllocatorDefault, bundleURL); - assert(bundle != NULL); - - function = CFBundleGetFunctionPointerForName(bundle, functionName); - - CFRelease(bundleURL); - CFRelease(functionName); - CFRelease(bundle); - - return function; -#else - return (void*)glXGetProcAddressARB((const GLubyte *)extname); -#endif -} - - - - -/* Extension querying variables */ - -GLboolean _GLEE_VERSION_1_2 = GL_FALSE; -GLboolean _GLEE_ARB_imaging = GL_FALSE; -GLboolean _GLEE_VERSION_1_3 = GL_FALSE; -GLboolean _GLEE_VERSION_1_4 = GL_FALSE; -GLboolean _GLEE_VERSION_1_5 = GL_FALSE; -GLboolean _GLEE_VERSION_2_0 = GL_FALSE; -GLboolean _GLEE_VERSION_2_1 = GL_FALSE; -GLboolean _GLEE_VERSION_3_0 = GL_FALSE; -GLboolean _GLEE_ARB_multitexture = GL_FALSE; -GLboolean _GLEE_ARB_transpose_matrix = GL_FALSE; -GLboolean _GLEE_ARB_multisample = GL_FALSE; -GLboolean _GLEE_ARB_texture_env_add = GL_FALSE; -GLboolean _GLEE_ARB_texture_cube_map = GL_FALSE; -GLboolean _GLEE_ARB_texture_compression = GL_FALSE; -GLboolean _GLEE_ARB_texture_border_clamp = GL_FALSE; -GLboolean _GLEE_ARB_point_parameters = GL_FALSE; -GLboolean _GLEE_ARB_vertex_blend = GL_FALSE; -GLboolean _GLEE_ARB_matrix_palette = GL_FALSE; -GLboolean _GLEE_ARB_texture_env_combine = GL_FALSE; -GLboolean _GLEE_ARB_texture_env_crossbar = GL_FALSE; -GLboolean _GLEE_ARB_texture_env_dot3 = GL_FALSE; -GLboolean _GLEE_ARB_texture_mirrored_repeat = GL_FALSE; -GLboolean _GLEE_ARB_depth_texture = GL_FALSE; -GLboolean _GLEE_ARB_shadow = GL_FALSE; -GLboolean _GLEE_ARB_shadow_ambient = GL_FALSE; -GLboolean _GLEE_ARB_window_pos = GL_FALSE; -GLboolean _GLEE_ARB_vertex_program = GL_FALSE; -GLboolean _GLEE_ARB_fragment_program = GL_FALSE; -GLboolean _GLEE_ARB_vertex_buffer_object = GL_FALSE; -GLboolean _GLEE_ARB_occlusion_query = GL_FALSE; -GLboolean _GLEE_ARB_shader_objects = GL_FALSE; -GLboolean _GLEE_ARB_vertex_shader = GL_FALSE; -GLboolean _GLEE_ARB_fragment_shader = GL_FALSE; -GLboolean _GLEE_ARB_shading_language_100 = GL_FALSE; -GLboolean _GLEE_ARB_texture_non_power_of_two = GL_FALSE; -GLboolean _GLEE_ARB_point_sprite = GL_FALSE; -GLboolean _GLEE_ARB_fragment_program_shadow = GL_FALSE; -GLboolean _GLEE_ARB_draw_buffers = GL_FALSE; -GLboolean _GLEE_ARB_texture_rectangle = GL_FALSE; -GLboolean _GLEE_ARB_color_buffer_float = GL_FALSE; -GLboolean _GLEE_ARB_half_float_pixel = GL_FALSE; -GLboolean _GLEE_ARB_texture_float = GL_FALSE; -GLboolean _GLEE_ARB_pixel_buffer_object = GL_FALSE; -GLboolean _GLEE_ARB_depth_buffer_float = GL_FALSE; -GLboolean _GLEE_ARB_draw_instanced = GL_FALSE; -GLboolean _GLEE_ARB_framebuffer_object = GL_FALSE; -GLboolean _GLEE_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean _GLEE_ARB_geometry_shader4 = GL_FALSE; -GLboolean _GLEE_ARB_half_float_vertex = GL_FALSE; -GLboolean _GLEE_ARB_instanced_arrays = GL_FALSE; -GLboolean _GLEE_ARB_map_buffer_range = GL_FALSE; -GLboolean _GLEE_ARB_texture_buffer_object = GL_FALSE; -GLboolean _GLEE_ARB_texture_compression_rgtc = GL_FALSE; -GLboolean _GLEE_ARB_texture_rg = GL_FALSE; -GLboolean _GLEE_ARB_vertex_array_object = GL_FALSE; -GLboolean _GLEE_EXT_abgr = GL_FALSE; -GLboolean _GLEE_EXT_blend_color = GL_FALSE; -GLboolean _GLEE_EXT_polygon_offset = GL_FALSE; -GLboolean _GLEE_EXT_texture = GL_FALSE; -GLboolean _GLEE_EXT_texture3D = GL_FALSE; -GLboolean _GLEE_SGIS_texture_filter4 = GL_FALSE; -GLboolean _GLEE_EXT_subtexture = GL_FALSE; -GLboolean _GLEE_EXT_copy_texture = GL_FALSE; -GLboolean _GLEE_EXT_histogram = GL_FALSE; -GLboolean _GLEE_EXT_convolution = GL_FALSE; -GLboolean _GLEE_SGI_color_matrix = GL_FALSE; -GLboolean _GLEE_SGI_color_table = GL_FALSE; -GLboolean _GLEE_SGIS_pixel_texture = GL_FALSE; -GLboolean _GLEE_SGIX_pixel_texture = GL_FALSE; -GLboolean _GLEE_SGIS_texture4D = GL_FALSE; -GLboolean _GLEE_SGI_texture_color_table = GL_FALSE; -GLboolean _GLEE_EXT_cmyka = GL_FALSE; -GLboolean _GLEE_EXT_texture_object = GL_FALSE; -GLboolean _GLEE_SGIS_detail_texture = GL_FALSE; -GLboolean _GLEE_SGIS_sharpen_texture = GL_FALSE; -GLboolean _GLEE_EXT_packed_pixels = GL_FALSE; -GLboolean _GLEE_SGIS_texture_lod = GL_FALSE; -GLboolean _GLEE_SGIS_multisample = GL_FALSE; -GLboolean _GLEE_EXT_rescale_normal = GL_FALSE; -GLboolean _GLEE_EXT_vertex_array = GL_FALSE; -GLboolean _GLEE_EXT_misc_attribute = GL_FALSE; -GLboolean _GLEE_SGIS_generate_mipmap = GL_FALSE; -GLboolean _GLEE_SGIX_clipmap = GL_FALSE; -GLboolean _GLEE_SGIX_shadow = GL_FALSE; -GLboolean _GLEE_SGIS_texture_edge_clamp = GL_FALSE; -GLboolean _GLEE_SGIS_texture_border_clamp = GL_FALSE; -GLboolean _GLEE_EXT_blend_minmax = GL_FALSE; -GLboolean _GLEE_EXT_blend_subtract = GL_FALSE; -GLboolean _GLEE_EXT_blend_logic_op = GL_FALSE; -GLboolean _GLEE_SGIX_interlace = GL_FALSE; -GLboolean _GLEE_SGIX_pixel_tiles = GL_FALSE; -GLboolean _GLEE_SGIS_texture_select = GL_FALSE; -GLboolean _GLEE_SGIX_sprite = GL_FALSE; -GLboolean _GLEE_SGIX_texture_multi_buffer = GL_FALSE; -GLboolean _GLEE_EXT_point_parameters = GL_FALSE; -GLboolean _GLEE_SGIS_point_parameters = GL_FALSE; -GLboolean _GLEE_SGIX_instruments = GL_FALSE; -GLboolean _GLEE_SGIX_texture_scale_bias = GL_FALSE; -GLboolean _GLEE_SGIX_framezoom = GL_FALSE; -GLboolean _GLEE_SGIX_tag_sample_buffer = GL_FALSE; -GLboolean _GLEE_FfdMaskSGIX = GL_FALSE; -GLboolean _GLEE_SGIX_polynomial_ffd = GL_FALSE; -GLboolean _GLEE_SGIX_reference_plane = GL_FALSE; -GLboolean _GLEE_SGIX_flush_raster = GL_FALSE; -GLboolean _GLEE_SGIX_depth_texture = GL_FALSE; -GLboolean _GLEE_SGIS_fog_function = GL_FALSE; -GLboolean _GLEE_SGIX_fog_offset = GL_FALSE; -GLboolean _GLEE_HP_image_transform = GL_FALSE; -GLboolean _GLEE_HP_convolution_border_modes = GL_FALSE; -GLboolean _GLEE_INGR_palette_buffer = GL_FALSE; -GLboolean _GLEE_SGIX_texture_add_env = GL_FALSE; -GLboolean _GLEE_EXT_color_subtable = GL_FALSE; -GLboolean _GLEE_PGI_vertex_hints = GL_FALSE; -GLboolean _GLEE_PGI_misc_hints = GL_FALSE; -GLboolean _GLEE_EXT_paletted_texture = GL_FALSE; -GLboolean _GLEE_EXT_clip_volume_hint = GL_FALSE; -GLboolean _GLEE_SGIX_list_priority = GL_FALSE; -GLboolean _GLEE_SGIX_ir_instrument1 = GL_FALSE; -GLboolean _GLEE_SGIX_calligraphic_fragment = GL_FALSE; -GLboolean _GLEE_SGIX_texture_lod_bias = GL_FALSE; -GLboolean _GLEE_SGIX_shadow_ambient = GL_FALSE; -GLboolean _GLEE_EXT_index_texture = GL_FALSE; -GLboolean _GLEE_EXT_index_material = GL_FALSE; -GLboolean _GLEE_EXT_index_func = GL_FALSE; -GLboolean _GLEE_EXT_index_array_formats = GL_FALSE; -GLboolean _GLEE_EXT_compiled_vertex_array = GL_FALSE; -GLboolean _GLEE_EXT_cull_vertex = GL_FALSE; -GLboolean _GLEE_SGIX_ycrcb = GL_FALSE; -GLboolean _GLEE_SGIX_fragment_lighting = GL_FALSE; -GLboolean _GLEE_IBM_rasterpos_clip = GL_FALSE; -GLboolean _GLEE_HP_texture_lighting = GL_FALSE; -GLboolean _GLEE_EXT_draw_range_elements = GL_FALSE; -GLboolean _GLEE_WIN_phong_shading = GL_FALSE; -GLboolean _GLEE_WIN_specular_fog = GL_FALSE; -GLboolean _GLEE_EXT_light_texture = GL_FALSE; -GLboolean _GLEE_SGIX_blend_alpha_minmax = GL_FALSE; -GLboolean _GLEE_SGIX_impact_pixel_texture = GL_FALSE; -GLboolean _GLEE_EXT_bgra = GL_FALSE; -GLboolean _GLEE_SGIX_async = GL_FALSE; -GLboolean _GLEE_SGIX_async_pixel = GL_FALSE; -GLboolean _GLEE_SGIX_async_histogram = GL_FALSE; -GLboolean _GLEE_INTEL_texture_scissor = GL_FALSE; -GLboolean _GLEE_INTEL_parallel_arrays = GL_FALSE; -GLboolean _GLEE_HP_occlusion_test = GL_FALSE; -GLboolean _GLEE_EXT_pixel_transform = GL_FALSE; -GLboolean _GLEE_EXT_pixel_transform_color_table = GL_FALSE; -GLboolean _GLEE_EXT_shared_texture_palette = GL_FALSE; -GLboolean _GLEE_EXT_separate_specular_color = GL_FALSE; -GLboolean _GLEE_EXT_secondary_color = GL_FALSE; -GLboolean _GLEE_EXT_texture_perturb_normal = GL_FALSE; -GLboolean _GLEE_EXT_multi_draw_arrays = GL_FALSE; -GLboolean _GLEE_EXT_fog_coord = GL_FALSE; -GLboolean _GLEE_REND_screen_coordinates = GL_FALSE; -GLboolean _GLEE_EXT_coordinate_frame = GL_FALSE; -GLboolean _GLEE_EXT_texture_env_combine = GL_FALSE; -GLboolean _GLEE_APPLE_specular_vector = GL_FALSE; -GLboolean _GLEE_APPLE_transform_hint = GL_FALSE; -GLboolean _GLEE_SGIX_fog_scale = GL_FALSE; -GLboolean _GLEE_SUNX_constant_data = GL_FALSE; -GLboolean _GLEE_SUN_global_alpha = GL_FALSE; -GLboolean _GLEE_SUN_triangle_list = GL_FALSE; -GLboolean _GLEE_SUN_vertex = GL_FALSE; -GLboolean _GLEE_EXT_blend_func_separate = GL_FALSE; -GLboolean _GLEE_INGR_color_clamp = GL_FALSE; -GLboolean _GLEE_INGR_interlace_read = GL_FALSE; -GLboolean _GLEE_EXT_stencil_wrap = GL_FALSE; -GLboolean _GLEE_EXT_422_pixels = GL_FALSE; -GLboolean _GLEE_NV_texgen_reflection = GL_FALSE; -GLboolean _GLEE_EXT_texture_cube_map = GL_FALSE; -GLboolean _GLEE_SUN_convolution_border_modes = GL_FALSE; -GLboolean _GLEE_EXT_texture_env_add = GL_FALSE; -GLboolean _GLEE_EXT_texture_lod_bias = GL_FALSE; -GLboolean _GLEE_EXT_texture_filter_anisotropic = GL_FALSE; -GLboolean _GLEE_EXT_vertex_weighting = GL_FALSE; -GLboolean _GLEE_NV_light_max_exponent = GL_FALSE; -GLboolean _GLEE_NV_vertex_array_range = GL_FALSE; -GLboolean _GLEE_NV_register_combiners = GL_FALSE; -GLboolean _GLEE_NV_fog_distance = GL_FALSE; -GLboolean _GLEE_NV_texgen_emboss = GL_FALSE; -GLboolean _GLEE_NV_blend_square = GL_FALSE; -GLboolean _GLEE_NV_texture_env_combine4 = GL_FALSE; -GLboolean _GLEE_MESA_resize_buffers = GL_FALSE; -GLboolean _GLEE_MESA_window_pos = GL_FALSE; -GLboolean _GLEE_EXT_texture_compression_s3tc = GL_FALSE; -GLboolean _GLEE_IBM_cull_vertex = GL_FALSE; -GLboolean _GLEE_IBM_multimode_draw_arrays = GL_FALSE; -GLboolean _GLEE_IBM_vertex_array_lists = GL_FALSE; -GLboolean _GLEE_SGIX_subsample = GL_FALSE; -GLboolean _GLEE_SGIX_ycrcb_subsample = GL_FALSE; -GLboolean _GLEE_SGIX_ycrcba = GL_FALSE; -GLboolean _GLEE_SGI_depth_pass_instrument = GL_FALSE; -GLboolean _GLEE_3DFX_texture_compression_FXT1 = GL_FALSE; -GLboolean _GLEE_3DFX_multisample = GL_FALSE; -GLboolean _GLEE_3DFX_tbuffer = GL_FALSE; -GLboolean _GLEE_EXT_multisample = GL_FALSE; -GLboolean _GLEE_SGIX_vertex_preclip = GL_FALSE; -GLboolean _GLEE_SGIX_convolution_accuracy = GL_FALSE; -GLboolean _GLEE_SGIX_resample = GL_FALSE; -GLboolean _GLEE_SGIS_point_line_texgen = GL_FALSE; -GLboolean _GLEE_SGIS_texture_color_mask = GL_FALSE; -GLboolean _GLEE_EXT_texture_env_dot3 = GL_FALSE; -GLboolean _GLEE_ATI_texture_mirror_once = GL_FALSE; -GLboolean _GLEE_NV_fence = GL_FALSE; -GLboolean _GLEE_IBM_texture_mirrored_repeat = GL_FALSE; -GLboolean _GLEE_NV_evaluators = GL_FALSE; -GLboolean _GLEE_NV_packed_depth_stencil = GL_FALSE; -GLboolean _GLEE_NV_register_combiners2 = GL_FALSE; -GLboolean _GLEE_NV_texture_compression_vtc = GL_FALSE; -GLboolean _GLEE_NV_texture_rectangle = GL_FALSE; -GLboolean _GLEE_NV_texture_shader = GL_FALSE; -GLboolean _GLEE_NV_texture_shader2 = GL_FALSE; -GLboolean _GLEE_NV_vertex_array_range2 = GL_FALSE; -GLboolean _GLEE_NV_vertex_program = GL_FALSE; -GLboolean _GLEE_SGIX_texture_coordinate_clamp = GL_FALSE; -GLboolean _GLEE_SGIX_scalebias_hint = GL_FALSE; -GLboolean _GLEE_OML_interlace = GL_FALSE; -GLboolean _GLEE_OML_subsample = GL_FALSE; -GLboolean _GLEE_OML_resample = GL_FALSE; -GLboolean _GLEE_NV_copy_depth_to_color = GL_FALSE; -GLboolean _GLEE_ATI_envmap_bumpmap = GL_FALSE; -GLboolean _GLEE_ATI_fragment_shader = GL_FALSE; -GLboolean _GLEE_ATI_pn_triangles = GL_FALSE; -GLboolean _GLEE_ATI_vertex_array_object = GL_FALSE; -GLboolean _GLEE_EXT_vertex_shader = GL_FALSE; -GLboolean _GLEE_ATI_vertex_streams = GL_FALSE; -GLboolean _GLEE_ATI_element_array = GL_FALSE; -GLboolean _GLEE_SUN_mesh_array = GL_FALSE; -GLboolean _GLEE_SUN_slice_accum = GL_FALSE; -GLboolean _GLEE_NV_multisample_filter_hint = GL_FALSE; -GLboolean _GLEE_NV_depth_clamp = GL_FALSE; -GLboolean _GLEE_NV_occlusion_query = GL_FALSE; -GLboolean _GLEE_NV_point_sprite = GL_FALSE; -GLboolean _GLEE_NV_texture_shader3 = GL_FALSE; -GLboolean _GLEE_NV_vertex_program1_1 = GL_FALSE; -GLboolean _GLEE_EXT_shadow_funcs = GL_FALSE; -GLboolean _GLEE_EXT_stencil_two_side = GL_FALSE; -GLboolean _GLEE_ATI_text_fragment_shader = GL_FALSE; -GLboolean _GLEE_APPLE_client_storage = GL_FALSE; -GLboolean _GLEE_APPLE_element_array = GL_FALSE; -GLboolean _GLEE_APPLE_fence = GL_FALSE; -GLboolean _GLEE_APPLE_vertex_array_object = GL_FALSE; -GLboolean _GLEE_APPLE_vertex_array_range = GL_FALSE; -GLboolean _GLEE_APPLE_ycbcr_422 = GL_FALSE; -GLboolean _GLEE_S3_s3tc = GL_FALSE; -GLboolean _GLEE_ATI_draw_buffers = GL_FALSE; -GLboolean _GLEE_ATI_pixel_format_float = GL_FALSE; -GLboolean _GLEE_ATI_texture_env_combine3 = GL_FALSE; -GLboolean _GLEE_ATI_texture_float = GL_FALSE; -GLboolean _GLEE_NV_float_buffer = GL_FALSE; -GLboolean _GLEE_NV_fragment_program = GL_FALSE; -GLboolean _GLEE_NV_half_float = GL_FALSE; -GLboolean _GLEE_NV_pixel_data_range = GL_FALSE; -GLboolean _GLEE_NV_primitive_restart = GL_FALSE; -GLboolean _GLEE_NV_texture_expand_normal = GL_FALSE; -GLboolean _GLEE_NV_vertex_program2 = GL_FALSE; -GLboolean _GLEE_ATI_map_object_buffer = GL_FALSE; -GLboolean _GLEE_ATI_separate_stencil = GL_FALSE; -GLboolean _GLEE_ATI_vertex_attrib_array_object = GL_FALSE; -GLboolean _GLEE_OES_read_format = GL_FALSE; -GLboolean _GLEE_EXT_depth_bounds_test = GL_FALSE; -GLboolean _GLEE_EXT_texture_mirror_clamp = GL_FALSE; -GLboolean _GLEE_EXT_blend_equation_separate = GL_FALSE; -GLboolean _GLEE_MESA_pack_invert = GL_FALSE; -GLboolean _GLEE_MESA_ycbcr_texture = GL_FALSE; -GLboolean _GLEE_EXT_pixel_buffer_object = GL_FALSE; -GLboolean _GLEE_NV_fragment_program_option = GL_FALSE; -GLboolean _GLEE_NV_fragment_program2 = GL_FALSE; -GLboolean _GLEE_NV_vertex_program2_option = GL_FALSE; -GLboolean _GLEE_NV_vertex_program3 = GL_FALSE; -GLboolean _GLEE_EXT_framebuffer_object = GL_FALSE; -GLboolean _GLEE_GREMEDY_string_marker = GL_FALSE; -GLboolean _GLEE_EXT_packed_depth_stencil = GL_FALSE; -GLboolean _GLEE_EXT_stencil_clear_tag = GL_FALSE; -GLboolean _GLEE_EXT_texture_sRGB = GL_FALSE; -GLboolean _GLEE_EXT_framebuffer_blit = GL_FALSE; -GLboolean _GLEE_EXT_framebuffer_multisample = GL_FALSE; -GLboolean _GLEE_MESAX_texture_stack = GL_FALSE; -GLboolean _GLEE_EXT_timer_query = GL_FALSE; -GLboolean _GLEE_EXT_gpu_program_parameters = GL_FALSE; -GLboolean _GLEE_APPLE_flush_buffer_range = GL_FALSE; -GLboolean _GLEE_EXT_gpu_shader4 = GL_FALSE; -GLboolean _GLEE_EXT_draw_instanced = GL_FALSE; -GLboolean _GLEE_EXT_packed_float = GL_FALSE; -GLboolean _GLEE_EXT_texture_array = GL_FALSE; -GLboolean _GLEE_EXT_texture_buffer_object = GL_FALSE; -GLboolean _GLEE_EXT_texture_compression_latc = GL_FALSE; -GLboolean _GLEE_EXT_texture_compression_rgtc = GL_FALSE; -GLboolean _GLEE_EXT_texture_shared_exponent = GL_FALSE; -GLboolean _GLEE_NV_depth_buffer_float = GL_FALSE; -GLboolean _GLEE_NV_framebuffer_multisample_coverage = GL_FALSE; -GLboolean _GLEE_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean _GLEE_NV_geometry_shader4 = GL_FALSE; -GLboolean _GLEE_NV_parameter_buffer_object = GL_FALSE; -GLboolean _GLEE_EXT_draw_buffers2 = GL_FALSE; -GLboolean _GLEE_NV_transform_feedback = GL_FALSE; -GLboolean _GLEE_EXT_bindable_uniform = GL_FALSE; -GLboolean _GLEE_EXT_texture_integer = GL_FALSE; -GLboolean _GLEE_GREMEDY_frame_terminator = GL_FALSE; -GLboolean _GLEE_NV_conditional_render = GL_FALSE; -GLboolean _GLEE_NV_present_video = GL_FALSE; -GLboolean _GLEE_EXT_transform_feedback = GL_FALSE; -GLboolean _GLEE_EXT_direct_state_access = GL_FALSE; -GLboolean _GLEE_EXT_vertex_array_bgra = GL_FALSE; -GLboolean _GLEE_EXT_texture_swizzle = GL_FALSE; -GLboolean _GLEE_NV_explicit_multisample = GL_FALSE; -GLboolean _GLEE_NV_transform_feedback2 = GL_FALSE; -GLboolean _GLEE_SGIX_texture_select = GL_FALSE; -GLboolean _GLEE_INGR_blend_func_separate = GL_FALSE; -GLboolean _GLEE_SGIX_depth_pass_instrument = GL_FALSE; -GLboolean _GLEE_SGIX_igloo_interface = GL_FALSE; -GLboolean _GLEE_EXT_fragment_lighting = GL_FALSE; -GLboolean _GLEE_EXT_geometry_shader4 = GL_FALSE; -GLboolean _GLEE_EXT_scene_marker = GL_FALSE; -GLboolean _GLEE_EXT_texture_compression_dxt1 = GL_FALSE; -GLboolean _GLEE_EXT_texture_env = GL_FALSE; -GLboolean _GLEE_IBM_static_data = GL_FALSE; -GLboolean _GLEE_NV_gpu_program4 = GL_FALSE; -GLboolean _GLEE_OES_byte_coordinates = GL_FALSE; -GLboolean _GLEE_OES_compressed_paletted_texture = GL_FALSE; -GLboolean _GLEE_OES_single_precision = GL_FALSE; -GLboolean _GLEE_SGIX_pixel_texture_bits = GL_FALSE; -GLboolean _GLEE_SGIX_texture_range = GL_FALSE; - -/* GL Extension names */ - -char __GLeeGLExtensionNames[322][39]={ - "GL_VERSION_1_2", - "GL_ARB_imaging", - "GL_VERSION_1_3", - "GL_VERSION_1_4", - "GL_VERSION_1_5", - "GL_VERSION_2_0", - "GL_VERSION_2_1", - "GL_VERSION_3_0", - "GL_ARB_multitexture", - "GL_ARB_transpose_matrix", - "GL_ARB_multisample", - "GL_ARB_texture_env_add", - "GL_ARB_texture_cube_map", - "GL_ARB_texture_compression", - "GL_ARB_texture_border_clamp", - "GL_ARB_point_parameters", - "GL_ARB_vertex_blend", - "GL_ARB_matrix_palette", - "GL_ARB_texture_env_combine", - "GL_ARB_texture_env_crossbar", - "GL_ARB_texture_env_dot3", - "GL_ARB_texture_mirrored_repeat", - "GL_ARB_depth_texture", - "GL_ARB_shadow", - "GL_ARB_shadow_ambient", - "GL_ARB_window_pos", - "GL_ARB_vertex_program", - "GL_ARB_fragment_program", - "GL_ARB_vertex_buffer_object", - "GL_ARB_occlusion_query", - "GL_ARB_shader_objects", - "GL_ARB_vertex_shader", - "GL_ARB_fragment_shader", - "GL_ARB_shading_language_100", - "GL_ARB_texture_non_power_of_two", - "GL_ARB_point_sprite", - "GL_ARB_fragment_program_shadow", - "GL_ARB_draw_buffers", - "GL_ARB_texture_rectangle", - "GL_ARB_color_buffer_float", - "GL_ARB_half_float_pixel", - "GL_ARB_texture_float", - "GL_ARB_pixel_buffer_object", - "GL_ARB_depth_buffer_float", - "GL_ARB_draw_instanced", - "GL_ARB_framebuffer_object", - "GL_ARB_framebuffer_sRGB", - "GL_ARB_geometry_shader4", - "GL_ARB_half_float_vertex", - "GL_ARB_instanced_arrays", - "GL_ARB_map_buffer_range", - "GL_ARB_texture_buffer_object", - "GL_ARB_texture_compression_rgtc", - "GL_ARB_texture_rg", - "GL_ARB_vertex_array_object", - "GL_EXT_abgr", - "GL_EXT_blend_color", - "GL_EXT_polygon_offset", - "GL_EXT_texture", - "GL_EXT_texture3D", - "GL_SGIS_texture_filter4", - "GL_EXT_subtexture", - "GL_EXT_copy_texture", - "GL_EXT_histogram", - "GL_EXT_convolution", - "GL_SGI_color_matrix", - "GL_SGI_color_table", - "GL_SGIS_pixel_texture", - "GL_SGIX_pixel_texture", - "GL_SGIS_texture4D", - "GL_SGI_texture_color_table", - "GL_EXT_cmyka", - "GL_EXT_texture_object", - "GL_SGIS_detail_texture", - "GL_SGIS_sharpen_texture", - "GL_EXT_packed_pixels", - "GL_SGIS_texture_lod", - "GL_SGIS_multisample", - "GL_EXT_rescale_normal", - "GL_EXT_vertex_array", - "GL_EXT_misc_attribute", - "GL_SGIS_generate_mipmap", - "GL_SGIX_clipmap", - "GL_SGIX_shadow", - "GL_SGIS_texture_edge_clamp", - "GL_SGIS_texture_border_clamp", - "GL_EXT_blend_minmax", - "GL_EXT_blend_subtract", - "GL_EXT_blend_logic_op", - "GL_SGIX_interlace", - "GL_SGIX_pixel_tiles", - "GL_SGIS_texture_select", - "GL_SGIX_sprite", - "GL_SGIX_texture_multi_buffer", - "GL_EXT_point_parameters", - "GL_SGIS_point_parameters", - "GL_SGIX_instruments", - "GL_SGIX_texture_scale_bias", - "GL_SGIX_framezoom", - "GL_SGIX_tag_sample_buffer", - "GL_FfdMaskSGIX", - "GL_SGIX_polynomial_ffd", - "GL_SGIX_reference_plane", - "GL_SGIX_flush_raster", - "GL_SGIX_depth_texture", - "GL_SGIS_fog_function", - "GL_SGIX_fog_offset", - "GL_HP_image_transform", - "GL_HP_convolution_border_modes", - "GL_INGR_palette_buffer", - "GL_SGIX_texture_add_env", - "GL_EXT_color_subtable", - "GL_PGI_vertex_hints", - "GL_PGI_misc_hints", - "GL_EXT_paletted_texture", - "GL_EXT_clip_volume_hint", - "GL_SGIX_list_priority", - "GL_SGIX_ir_instrument1", - "GL_SGIX_calligraphic_fragment", - "GL_SGIX_texture_lod_bias", - "GL_SGIX_shadow_ambient", - "GL_EXT_index_texture", - "GL_EXT_index_material", - "GL_EXT_index_func", - "GL_EXT_index_array_formats", - "GL_EXT_compiled_vertex_array", - "GL_EXT_cull_vertex", - "GL_SGIX_ycrcb", - "GL_SGIX_fragment_lighting", - "GL_IBM_rasterpos_clip", - "GL_HP_texture_lighting", - "GL_EXT_draw_range_elements", - "GL_WIN_phong_shading", - "GL_WIN_specular_fog", - "GL_EXT_light_texture", - "GL_SGIX_blend_alpha_minmax", - "GL_SGIX_impact_pixel_texture", - "GL_EXT_bgra", - "GL_SGIX_async", - "GL_SGIX_async_pixel", - "GL_SGIX_async_histogram", - "GL_INTEL_texture_scissor", - "GL_INTEL_parallel_arrays", - "GL_HP_occlusion_test", - "GL_EXT_pixel_transform", - "GL_EXT_pixel_transform_color_table", - "GL_EXT_shared_texture_palette", - "GL_EXT_separate_specular_color", - "GL_EXT_secondary_color", - "GL_EXT_texture_perturb_normal", - "GL_EXT_multi_draw_arrays", - "GL_EXT_fog_coord", - "GL_REND_screen_coordinates", - "GL_EXT_coordinate_frame", - "GL_EXT_texture_env_combine", - "GL_APPLE_specular_vector", - "GL_APPLE_transform_hint", - "GL_SGIX_fog_scale", - "GL_SUNX_constant_data", - "GL_SUN_global_alpha", - "GL_SUN_triangle_list", - "GL_SUN_vertex", - "GL_EXT_blend_func_separate", - "GL_INGR_color_clamp", - "GL_INGR_interlace_read", - "GL_EXT_stencil_wrap", - "GL_EXT_422_pixels", - "GL_NV_texgen_reflection", - "GL_EXT_texture_cube_map", - "GL_SUN_convolution_border_modes", - "GL_EXT_texture_env_add", - "GL_EXT_texture_lod_bias", - "GL_EXT_texture_filter_anisotropic", - "GL_EXT_vertex_weighting", - "GL_NV_light_max_exponent", - "GL_NV_vertex_array_range", - "GL_NV_register_combiners", - "GL_NV_fog_distance", - "GL_NV_texgen_emboss", - "GL_NV_blend_square", - "GL_NV_texture_env_combine4", - "GL_MESA_resize_buffers", - "GL_MESA_window_pos", - "GL_EXT_texture_compression_s3tc", - "GL_IBM_cull_vertex", - "GL_IBM_multimode_draw_arrays", - "GL_IBM_vertex_array_lists", - "GL_SGIX_subsample", - "GL_SGIX_ycrcb_subsample", - "GL_SGIX_ycrcba", - "GL_SGI_depth_pass_instrument", - "GL_3DFX_texture_compression_FXT1", - "GL_3DFX_multisample", - "GL_3DFX_tbuffer", - "GL_EXT_multisample", - "GL_SGIX_vertex_preclip", - "GL_SGIX_convolution_accuracy", - "GL_SGIX_resample", - "GL_SGIS_point_line_texgen", - "GL_SGIS_texture_color_mask", - "GL_EXT_texture_env_dot3", - "GL_ATI_texture_mirror_once", - "GL_NV_fence", - "GL_IBM_texture_mirrored_repeat", - "GL_NV_evaluators", - "GL_NV_packed_depth_stencil", - "GL_NV_register_combiners2", - "GL_NV_texture_compression_vtc", - "GL_NV_texture_rectangle", - "GL_NV_texture_shader", - "GL_NV_texture_shader2", - "GL_NV_vertex_array_range2", - "GL_NV_vertex_program", - "GL_SGIX_texture_coordinate_clamp", - "GL_SGIX_scalebias_hint", - "GL_OML_interlace", - "GL_OML_subsample", - "GL_OML_resample", - "GL_NV_copy_depth_to_color", - "GL_ATI_envmap_bumpmap", - "GL_ATI_fragment_shader", - "GL_ATI_pn_triangles", - "GL_ATI_vertex_array_object", - "GL_EXT_vertex_shader", - "GL_ATI_vertex_streams", - "GL_ATI_element_array", - "GL_SUN_mesh_array", - "GL_SUN_slice_accum", - "GL_NV_multisample_filter_hint", - "GL_NV_depth_clamp", - "GL_NV_occlusion_query", - "GL_NV_point_sprite", - "GL_NV_texture_shader3", - "GL_NV_vertex_program1_1", - "GL_EXT_shadow_funcs", - "GL_EXT_stencil_two_side", - "GL_ATI_text_fragment_shader", - "GL_APPLE_client_storage", - "GL_APPLE_element_array", - "GL_APPLE_fence", - "GL_APPLE_vertex_array_object", - "GL_APPLE_vertex_array_range", - "GL_APPLE_ycbcr_422", - "GL_S3_s3tc", - "GL_ATI_draw_buffers", - "GL_ATI_pixel_format_float", - "GL_ATI_texture_env_combine3", - "GL_ATI_texture_float", - "GL_NV_float_buffer", - "GL_NV_fragment_program", - "GL_NV_half_float", - "GL_NV_pixel_data_range", - "GL_NV_primitive_restart", - "GL_NV_texture_expand_normal", - "GL_NV_vertex_program2", - "GL_ATI_map_object_buffer", - "GL_ATI_separate_stencil", - "GL_ATI_vertex_attrib_array_object", - "GL_OES_read_format", - "GL_EXT_depth_bounds_test", - "GL_EXT_texture_mirror_clamp", - "GL_EXT_blend_equation_separate", - "GL_MESA_pack_invert", - "GL_MESA_ycbcr_texture", - "GL_EXT_pixel_buffer_object", - "GL_NV_fragment_program_option", - "GL_NV_fragment_program2", - "GL_NV_vertex_program2_option", - "GL_NV_vertex_program3", - "GL_EXT_framebuffer_object", - "GL_GREMEDY_string_marker", - "GL_EXT_packed_depth_stencil", - "GL_EXT_stencil_clear_tag", - "GL_EXT_texture_sRGB", - "GL_EXT_framebuffer_blit", - "GL_EXT_framebuffer_multisample", - "GL_MESAX_texture_stack", - "GL_EXT_timer_query", - "GL_EXT_gpu_program_parameters", - "GL_APPLE_flush_buffer_range", - "GL_EXT_gpu_shader4", - "GL_EXT_draw_instanced", - "GL_EXT_packed_float", - "GL_EXT_texture_array", - "GL_EXT_texture_buffer_object", - "GL_EXT_texture_compression_latc", - "GL_EXT_texture_compression_rgtc", - "GL_EXT_texture_shared_exponent", - "GL_NV_depth_buffer_float", - "GL_NV_framebuffer_multisample_coverage", - "GL_EXT_framebuffer_sRGB", - "GL_NV_geometry_shader4", - "GL_NV_parameter_buffer_object", - "GL_EXT_draw_buffers2", - "GL_NV_transform_feedback", - "GL_EXT_bindable_uniform", - "GL_EXT_texture_integer", - "GL_GREMEDY_frame_terminator", - "GL_NV_conditional_render", - "GL_NV_present_video", - "GL_EXT_transform_feedback", - "GL_EXT_direct_state_access", - "GL_EXT_vertex_array_bgra", - "GL_EXT_texture_swizzle", - "GL_NV_explicit_multisample", - "GL_NV_transform_feedback2", - "GL_SGIX_texture_select", - "GL_INGR_blend_func_separate", - "GL_SGIX_depth_pass_instrument", - "GL_SGIX_igloo_interface", - "GL_EXT_fragment_lighting", - "GL_EXT_geometry_shader4", - "GL_EXT_scene_marker", - "GL_EXT_texture_compression_dxt1", - "GL_EXT_texture_env", - "GL_IBM_static_data", - "GL_NV_gpu_program4", - "GL_OES_byte_coordinates", - "GL_OES_compressed_paletted_texture", - "GL_OES_single_precision", - "GL_SGIX_pixel_texture_bits", - "GL_SGIX_texture_range" -}; -int __GLeeGLNumExtensions=322; - -/* GL_VERSION_1_2 */ - -#ifdef __GLEE_GL_VERSION_1_2 -#ifndef GLEE_C_DEFINED_glBlendColor -#define GLEE_C_DEFINED_glBlendColor - void __stdcall GLee_Lazy_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {if (GLeeInit()) glBlendColor(red, green, blue, alpha);} - GLEEPFNGLBLENDCOLORPROC GLeeFuncPtr_glBlendColor=GLee_Lazy_glBlendColor; -#endif -#ifndef GLEE_C_DEFINED_glBlendEquation -#define GLEE_C_DEFINED_glBlendEquation - void __stdcall GLee_Lazy_glBlendEquation(GLenum mode) {if (GLeeInit()) glBlendEquation(mode);} - GLEEPFNGLBLENDEQUATIONPROC GLeeFuncPtr_glBlendEquation=GLee_Lazy_glBlendEquation; -#endif -#ifndef GLEE_C_DEFINED_glDrawRangeElements -#define GLEE_C_DEFINED_glDrawRangeElements - void __stdcall GLee_Lazy_glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) {if (GLeeInit()) glDrawRangeElements(mode, start, end, count, type, indices);} - GLEEPFNGLDRAWRANGEELEMENTSPROC GLeeFuncPtr_glDrawRangeElements=GLee_Lazy_glDrawRangeElements; -#endif -#ifndef GLEE_C_DEFINED_glColorTable -#define GLEE_C_DEFINED_glColorTable - void __stdcall GLee_Lazy_glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table) {if (GLeeInit()) glColorTable(target, internalformat, width, format, type, table);} - GLEEPFNGLCOLORTABLEPROC GLeeFuncPtr_glColorTable=GLee_Lazy_glColorTable; -#endif -#ifndef GLEE_C_DEFINED_glColorTableParameterfv -#define GLEE_C_DEFINED_glColorTableParameterfv - void __stdcall GLee_Lazy_glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glColorTableParameterfv(target, pname, params);} - GLEEPFNGLCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glColorTableParameterfv=GLee_Lazy_glColorTableParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glColorTableParameteriv -#define GLEE_C_DEFINED_glColorTableParameteriv - void __stdcall GLee_Lazy_glColorTableParameteriv(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glColorTableParameteriv(target, pname, params);} - GLEEPFNGLCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glColorTableParameteriv=GLee_Lazy_glColorTableParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glCopyColorTable -#define GLEE_C_DEFINED_glCopyColorTable - void __stdcall GLee_Lazy_glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorTable(target, internalformat, x, y, width);} - GLEEPFNGLCOPYCOLORTABLEPROC GLeeFuncPtr_glCopyColorTable=GLee_Lazy_glCopyColorTable; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTable -#define GLEE_C_DEFINED_glGetColorTable - void __stdcall GLee_Lazy_glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid * table) {if (GLeeInit()) glGetColorTable(target, format, type, table);} - GLEEPFNGLGETCOLORTABLEPROC GLeeFuncPtr_glGetColorTable=GLee_Lazy_glGetColorTable; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableParameterfv -#define GLEE_C_DEFINED_glGetColorTableParameterfv - void __stdcall GLee_Lazy_glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetColorTableParameterfv(target, pname, params);} - GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glGetColorTableParameterfv=GLee_Lazy_glGetColorTableParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableParameteriv -#define GLEE_C_DEFINED_glGetColorTableParameteriv - void __stdcall GLee_Lazy_glGetColorTableParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetColorTableParameteriv(target, pname, params);} - GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glGetColorTableParameteriv=GLee_Lazy_glGetColorTableParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glColorSubTable -#define GLEE_C_DEFINED_glColorSubTable - void __stdcall GLee_Lazy_glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data) {if (GLeeInit()) glColorSubTable(target, start, count, format, type, data);} - GLEEPFNGLCOLORSUBTABLEPROC GLeeFuncPtr_glColorSubTable=GLee_Lazy_glColorSubTable; -#endif -#ifndef GLEE_C_DEFINED_glCopyColorSubTable -#define GLEE_C_DEFINED_glCopyColorSubTable - void __stdcall GLee_Lazy_glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorSubTable(target, start, x, y, width);} - GLEEPFNGLCOPYCOLORSUBTABLEPROC GLeeFuncPtr_glCopyColorSubTable=GLee_Lazy_glCopyColorSubTable; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionFilter1D -#define GLEE_C_DEFINED_glConvolutionFilter1D - void __stdcall GLee_Lazy_glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter1D(target, internalformat, width, format, type, image);} - GLEEPFNGLCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glConvolutionFilter1D=GLee_Lazy_glConvolutionFilter1D; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionFilter2D -#define GLEE_C_DEFINED_glConvolutionFilter2D - void __stdcall GLee_Lazy_glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter2D(target, internalformat, width, height, format, type, image);} - GLEEPFNGLCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glConvolutionFilter2D=GLee_Lazy_glConvolutionFilter2D; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameterf -#define GLEE_C_DEFINED_glConvolutionParameterf - void __stdcall GLee_Lazy_glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params) {if (GLeeInit()) glConvolutionParameterf(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERFPROC GLeeFuncPtr_glConvolutionParameterf=GLee_Lazy_glConvolutionParameterf; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameterfv -#define GLEE_C_DEFINED_glConvolutionParameterfv - void __stdcall GLee_Lazy_glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glConvolutionParameterfv(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glConvolutionParameterfv=GLee_Lazy_glConvolutionParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameteri -#define GLEE_C_DEFINED_glConvolutionParameteri - void __stdcall GLee_Lazy_glConvolutionParameteri(GLenum target, GLenum pname, GLint params) {if (GLeeInit()) glConvolutionParameteri(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERIPROC GLeeFuncPtr_glConvolutionParameteri=GLee_Lazy_glConvolutionParameteri; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameteriv -#define GLEE_C_DEFINED_glConvolutionParameteriv - void __stdcall GLee_Lazy_glConvolutionParameteriv(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glConvolutionParameteriv(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glConvolutionParameteriv=GLee_Lazy_glConvolutionParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter1D -#define GLEE_C_DEFINED_glCopyConvolutionFilter1D - void __stdcall GLee_Lazy_glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyConvolutionFilter1D(target, internalformat, x, y, width);} - GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glCopyConvolutionFilter1D=GLee_Lazy_glCopyConvolutionFilter1D; -#endif -#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter2D -#define GLEE_C_DEFINED_glCopyConvolutionFilter2D - void __stdcall GLee_Lazy_glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyConvolutionFilter2D(target, internalformat, x, y, width, height);} - GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glCopyConvolutionFilter2D=GLee_Lazy_glCopyConvolutionFilter2D; -#endif -#ifndef GLEE_C_DEFINED_glGetConvolutionFilter -#define GLEE_C_DEFINED_glGetConvolutionFilter - void __stdcall GLee_Lazy_glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid * image) {if (GLeeInit()) glGetConvolutionFilter(target, format, type, image);} - GLEEPFNGLGETCONVOLUTIONFILTERPROC GLeeFuncPtr_glGetConvolutionFilter=GLee_Lazy_glGetConvolutionFilter; -#endif -#ifndef GLEE_C_DEFINED_glGetConvolutionParameterfv -#define GLEE_C_DEFINED_glGetConvolutionParameterfv - void __stdcall GLee_Lazy_glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetConvolutionParameterfv(target, pname, params);} - GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glGetConvolutionParameterfv=GLee_Lazy_glGetConvolutionParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glGetConvolutionParameteriv -#define GLEE_C_DEFINED_glGetConvolutionParameteriv - void __stdcall GLee_Lazy_glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetConvolutionParameteriv(target, pname, params);} - GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glGetConvolutionParameteriv=GLee_Lazy_glGetConvolutionParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glGetSeparableFilter -#define GLEE_C_DEFINED_glGetSeparableFilter - void __stdcall GLee_Lazy_glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span) {if (GLeeInit()) glGetSeparableFilter(target, format, type, row, column, span);} - GLEEPFNGLGETSEPARABLEFILTERPROC GLeeFuncPtr_glGetSeparableFilter=GLee_Lazy_glGetSeparableFilter; -#endif -#ifndef GLEE_C_DEFINED_glSeparableFilter2D -#define GLEE_C_DEFINED_glSeparableFilter2D - void __stdcall GLee_Lazy_glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column) {if (GLeeInit()) glSeparableFilter2D(target, internalformat, width, height, format, type, row, column);} - GLEEPFNGLSEPARABLEFILTER2DPROC GLeeFuncPtr_glSeparableFilter2D=GLee_Lazy_glSeparableFilter2D; -#endif -#ifndef GLEE_C_DEFINED_glGetHistogram -#define GLEE_C_DEFINED_glGetHistogram - void __stdcall GLee_Lazy_glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetHistogram(target, reset, format, type, values);} - GLEEPFNGLGETHISTOGRAMPROC GLeeFuncPtr_glGetHistogram=GLee_Lazy_glGetHistogram; -#endif -#ifndef GLEE_C_DEFINED_glGetHistogramParameterfv -#define GLEE_C_DEFINED_glGetHistogramParameterfv - void __stdcall GLee_Lazy_glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetHistogramParameterfv(target, pname, params);} - GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC GLeeFuncPtr_glGetHistogramParameterfv=GLee_Lazy_glGetHistogramParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glGetHistogramParameteriv -#define GLEE_C_DEFINED_glGetHistogramParameteriv - void __stdcall GLee_Lazy_glGetHistogramParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetHistogramParameteriv(target, pname, params);} - GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC GLeeFuncPtr_glGetHistogramParameteriv=GLee_Lazy_glGetHistogramParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glGetMinmax -#define GLEE_C_DEFINED_glGetMinmax - void __stdcall GLee_Lazy_glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetMinmax(target, reset, format, type, values);} - GLEEPFNGLGETMINMAXPROC GLeeFuncPtr_glGetMinmax=GLee_Lazy_glGetMinmax; -#endif -#ifndef GLEE_C_DEFINED_glGetMinmaxParameterfv -#define GLEE_C_DEFINED_glGetMinmaxParameterfv - void __stdcall GLee_Lazy_glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMinmaxParameterfv(target, pname, params);} - GLEEPFNGLGETMINMAXPARAMETERFVPROC GLeeFuncPtr_glGetMinmaxParameterfv=GLee_Lazy_glGetMinmaxParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glGetMinmaxParameteriv -#define GLEE_C_DEFINED_glGetMinmaxParameteriv - void __stdcall GLee_Lazy_glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMinmaxParameteriv(target, pname, params);} - GLEEPFNGLGETMINMAXPARAMETERIVPROC GLeeFuncPtr_glGetMinmaxParameteriv=GLee_Lazy_glGetMinmaxParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glHistogram -#define GLEE_C_DEFINED_glHistogram - void __stdcall GLee_Lazy_glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glHistogram(target, width, internalformat, sink);} - GLEEPFNGLHISTOGRAMPROC GLeeFuncPtr_glHistogram=GLee_Lazy_glHistogram; -#endif -#ifndef GLEE_C_DEFINED_glMinmax -#define GLEE_C_DEFINED_glMinmax - void __stdcall GLee_Lazy_glMinmax(GLenum target, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glMinmax(target, internalformat, sink);} - GLEEPFNGLMINMAXPROC GLeeFuncPtr_glMinmax=GLee_Lazy_glMinmax; -#endif -#ifndef GLEE_C_DEFINED_glResetHistogram -#define GLEE_C_DEFINED_glResetHistogram - void __stdcall GLee_Lazy_glResetHistogram(GLenum target) {if (GLeeInit()) glResetHistogram(target);} - GLEEPFNGLRESETHISTOGRAMPROC GLeeFuncPtr_glResetHistogram=GLee_Lazy_glResetHistogram; -#endif -#ifndef GLEE_C_DEFINED_glResetMinmax -#define GLEE_C_DEFINED_glResetMinmax - void __stdcall GLee_Lazy_glResetMinmax(GLenum target) {if (GLeeInit()) glResetMinmax(target);} - GLEEPFNGLRESETMINMAXPROC GLeeFuncPtr_glResetMinmax=GLee_Lazy_glResetMinmax; -#endif -#ifndef GLEE_C_DEFINED_glTexImage3D -#define GLEE_C_DEFINED_glTexImage3D - void __stdcall GLee_Lazy_glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);} - GLEEPFNGLTEXIMAGE3DPROC GLeeFuncPtr_glTexImage3D=GLee_Lazy_glTexImage3D; -#endif -#ifndef GLEE_C_DEFINED_glTexSubImage3D -#define GLEE_C_DEFINED_glTexSubImage3D - void __stdcall GLee_Lazy_glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} - GLEEPFNGLTEXSUBIMAGE3DPROC GLeeFuncPtr_glTexSubImage3D=GLee_Lazy_glTexSubImage3D; -#endif -#ifndef GLEE_C_DEFINED_glCopyTexSubImage3D -#define GLEE_C_DEFINED_glCopyTexSubImage3D - void __stdcall GLee_Lazy_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);} - GLEEPFNGLCOPYTEXSUBIMAGE3DPROC GLeeFuncPtr_glCopyTexSubImage3D=GLee_Lazy_glCopyTexSubImage3D; -#endif -#endif - -/* GL_ARB_imaging */ - -#ifdef __GLEE_GL_ARB_imaging -#endif - -/* GL_VERSION_1_3 */ - -#ifdef __GLEE_GL_VERSION_1_3 -#ifndef GLEE_C_DEFINED_glActiveTexture -#define GLEE_C_DEFINED_glActiveTexture - void __stdcall GLee_Lazy_glActiveTexture(GLenum texture) {if (GLeeInit()) glActiveTexture(texture);} - GLEEPFNGLACTIVETEXTUREPROC GLeeFuncPtr_glActiveTexture=GLee_Lazy_glActiveTexture; -#endif -#ifndef GLEE_C_DEFINED_glClientActiveTexture -#define GLEE_C_DEFINED_glClientActiveTexture - void __stdcall GLee_Lazy_glClientActiveTexture(GLenum texture) {if (GLeeInit()) glClientActiveTexture(texture);} - GLEEPFNGLCLIENTACTIVETEXTUREPROC GLeeFuncPtr_glClientActiveTexture=GLee_Lazy_glClientActiveTexture; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1d -#define GLEE_C_DEFINED_glMultiTexCoord1d - void __stdcall GLee_Lazy_glMultiTexCoord1d(GLenum target, GLdouble s) {if (GLeeInit()) glMultiTexCoord1d(target, s);} - GLEEPFNGLMULTITEXCOORD1DPROC GLeeFuncPtr_glMultiTexCoord1d=GLee_Lazy_glMultiTexCoord1d; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1dv -#define GLEE_C_DEFINED_glMultiTexCoord1dv - void __stdcall GLee_Lazy_glMultiTexCoord1dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord1dv(target, v);} - GLEEPFNGLMULTITEXCOORD1DVPROC GLeeFuncPtr_glMultiTexCoord1dv=GLee_Lazy_glMultiTexCoord1dv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1f -#define GLEE_C_DEFINED_glMultiTexCoord1f - void __stdcall GLee_Lazy_glMultiTexCoord1f(GLenum target, GLfloat s) {if (GLeeInit()) glMultiTexCoord1f(target, s);} - GLEEPFNGLMULTITEXCOORD1FPROC GLeeFuncPtr_glMultiTexCoord1f=GLee_Lazy_glMultiTexCoord1f; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1fv -#define GLEE_C_DEFINED_glMultiTexCoord1fv - void __stdcall GLee_Lazy_glMultiTexCoord1fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord1fv(target, v);} - GLEEPFNGLMULTITEXCOORD1FVPROC GLeeFuncPtr_glMultiTexCoord1fv=GLee_Lazy_glMultiTexCoord1fv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1i -#define GLEE_C_DEFINED_glMultiTexCoord1i - void __stdcall GLee_Lazy_glMultiTexCoord1i(GLenum target, GLint s) {if (GLeeInit()) glMultiTexCoord1i(target, s);} - GLEEPFNGLMULTITEXCOORD1IPROC GLeeFuncPtr_glMultiTexCoord1i=GLee_Lazy_glMultiTexCoord1i; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1iv -#define GLEE_C_DEFINED_glMultiTexCoord1iv - void __stdcall GLee_Lazy_glMultiTexCoord1iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord1iv(target, v);} - GLEEPFNGLMULTITEXCOORD1IVPROC GLeeFuncPtr_glMultiTexCoord1iv=GLee_Lazy_glMultiTexCoord1iv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1s -#define GLEE_C_DEFINED_glMultiTexCoord1s - void __stdcall GLee_Lazy_glMultiTexCoord1s(GLenum target, GLshort s) {if (GLeeInit()) glMultiTexCoord1s(target, s);} - GLEEPFNGLMULTITEXCOORD1SPROC GLeeFuncPtr_glMultiTexCoord1s=GLee_Lazy_glMultiTexCoord1s; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1sv -#define GLEE_C_DEFINED_glMultiTexCoord1sv - void __stdcall GLee_Lazy_glMultiTexCoord1sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord1sv(target, v);} - GLEEPFNGLMULTITEXCOORD1SVPROC GLeeFuncPtr_glMultiTexCoord1sv=GLee_Lazy_glMultiTexCoord1sv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2d -#define GLEE_C_DEFINED_glMultiTexCoord2d - void __stdcall GLee_Lazy_glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t) {if (GLeeInit()) glMultiTexCoord2d(target, s, t);} - GLEEPFNGLMULTITEXCOORD2DPROC GLeeFuncPtr_glMultiTexCoord2d=GLee_Lazy_glMultiTexCoord2d; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2dv -#define GLEE_C_DEFINED_glMultiTexCoord2dv - void __stdcall GLee_Lazy_glMultiTexCoord2dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord2dv(target, v);} - GLEEPFNGLMULTITEXCOORD2DVPROC GLeeFuncPtr_glMultiTexCoord2dv=GLee_Lazy_glMultiTexCoord2dv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2f -#define GLEE_C_DEFINED_glMultiTexCoord2f - void __stdcall GLee_Lazy_glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t) {if (GLeeInit()) glMultiTexCoord2f(target, s, t);} - GLEEPFNGLMULTITEXCOORD2FPROC GLeeFuncPtr_glMultiTexCoord2f=GLee_Lazy_glMultiTexCoord2f; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2fv -#define GLEE_C_DEFINED_glMultiTexCoord2fv - void __stdcall GLee_Lazy_glMultiTexCoord2fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord2fv(target, v);} - GLEEPFNGLMULTITEXCOORD2FVPROC GLeeFuncPtr_glMultiTexCoord2fv=GLee_Lazy_glMultiTexCoord2fv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2i -#define GLEE_C_DEFINED_glMultiTexCoord2i - void __stdcall GLee_Lazy_glMultiTexCoord2i(GLenum target, GLint s, GLint t) {if (GLeeInit()) glMultiTexCoord2i(target, s, t);} - GLEEPFNGLMULTITEXCOORD2IPROC GLeeFuncPtr_glMultiTexCoord2i=GLee_Lazy_glMultiTexCoord2i; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2iv -#define GLEE_C_DEFINED_glMultiTexCoord2iv - void __stdcall GLee_Lazy_glMultiTexCoord2iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord2iv(target, v);} - GLEEPFNGLMULTITEXCOORD2IVPROC GLeeFuncPtr_glMultiTexCoord2iv=GLee_Lazy_glMultiTexCoord2iv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2s -#define GLEE_C_DEFINED_glMultiTexCoord2s - void __stdcall GLee_Lazy_glMultiTexCoord2s(GLenum target, GLshort s, GLshort t) {if (GLeeInit()) glMultiTexCoord2s(target, s, t);} - GLEEPFNGLMULTITEXCOORD2SPROC GLeeFuncPtr_glMultiTexCoord2s=GLee_Lazy_glMultiTexCoord2s; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2sv -#define GLEE_C_DEFINED_glMultiTexCoord2sv - void __stdcall GLee_Lazy_glMultiTexCoord2sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord2sv(target, v);} - GLEEPFNGLMULTITEXCOORD2SVPROC GLeeFuncPtr_glMultiTexCoord2sv=GLee_Lazy_glMultiTexCoord2sv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3d -#define GLEE_C_DEFINED_glMultiTexCoord3d - void __stdcall GLee_Lazy_glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r) {if (GLeeInit()) glMultiTexCoord3d(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3DPROC GLeeFuncPtr_glMultiTexCoord3d=GLee_Lazy_glMultiTexCoord3d; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3dv -#define GLEE_C_DEFINED_glMultiTexCoord3dv - void __stdcall GLee_Lazy_glMultiTexCoord3dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord3dv(target, v);} - GLEEPFNGLMULTITEXCOORD3DVPROC GLeeFuncPtr_glMultiTexCoord3dv=GLee_Lazy_glMultiTexCoord3dv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3f -#define GLEE_C_DEFINED_glMultiTexCoord3f - void __stdcall GLee_Lazy_glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r) {if (GLeeInit()) glMultiTexCoord3f(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3FPROC GLeeFuncPtr_glMultiTexCoord3f=GLee_Lazy_glMultiTexCoord3f; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3fv -#define GLEE_C_DEFINED_glMultiTexCoord3fv - void __stdcall GLee_Lazy_glMultiTexCoord3fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord3fv(target, v);} - GLEEPFNGLMULTITEXCOORD3FVPROC GLeeFuncPtr_glMultiTexCoord3fv=GLee_Lazy_glMultiTexCoord3fv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3i -#define GLEE_C_DEFINED_glMultiTexCoord3i - void __stdcall GLee_Lazy_glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r) {if (GLeeInit()) glMultiTexCoord3i(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3IPROC GLeeFuncPtr_glMultiTexCoord3i=GLee_Lazy_glMultiTexCoord3i; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3iv -#define GLEE_C_DEFINED_glMultiTexCoord3iv - void __stdcall GLee_Lazy_glMultiTexCoord3iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord3iv(target, v);} - GLEEPFNGLMULTITEXCOORD3IVPROC GLeeFuncPtr_glMultiTexCoord3iv=GLee_Lazy_glMultiTexCoord3iv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3s -#define GLEE_C_DEFINED_glMultiTexCoord3s - void __stdcall GLee_Lazy_glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r) {if (GLeeInit()) glMultiTexCoord3s(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3SPROC GLeeFuncPtr_glMultiTexCoord3s=GLee_Lazy_glMultiTexCoord3s; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3sv -#define GLEE_C_DEFINED_glMultiTexCoord3sv - void __stdcall GLee_Lazy_glMultiTexCoord3sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord3sv(target, v);} - GLEEPFNGLMULTITEXCOORD3SVPROC GLeeFuncPtr_glMultiTexCoord3sv=GLee_Lazy_glMultiTexCoord3sv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4d -#define GLEE_C_DEFINED_glMultiTexCoord4d - void __stdcall GLee_Lazy_glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) {if (GLeeInit()) glMultiTexCoord4d(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4DPROC GLeeFuncPtr_glMultiTexCoord4d=GLee_Lazy_glMultiTexCoord4d; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4dv -#define GLEE_C_DEFINED_glMultiTexCoord4dv - void __stdcall GLee_Lazy_glMultiTexCoord4dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord4dv(target, v);} - GLEEPFNGLMULTITEXCOORD4DVPROC GLeeFuncPtr_glMultiTexCoord4dv=GLee_Lazy_glMultiTexCoord4dv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4f -#define GLEE_C_DEFINED_glMultiTexCoord4f - void __stdcall GLee_Lazy_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {if (GLeeInit()) glMultiTexCoord4f(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4FPROC GLeeFuncPtr_glMultiTexCoord4f=GLee_Lazy_glMultiTexCoord4f; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4fv -#define GLEE_C_DEFINED_glMultiTexCoord4fv - void __stdcall GLee_Lazy_glMultiTexCoord4fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord4fv(target, v);} - GLEEPFNGLMULTITEXCOORD4FVPROC GLeeFuncPtr_glMultiTexCoord4fv=GLee_Lazy_glMultiTexCoord4fv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4i -#define GLEE_C_DEFINED_glMultiTexCoord4i - void __stdcall GLee_Lazy_glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q) {if (GLeeInit()) glMultiTexCoord4i(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4IPROC GLeeFuncPtr_glMultiTexCoord4i=GLee_Lazy_glMultiTexCoord4i; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4iv -#define GLEE_C_DEFINED_glMultiTexCoord4iv - void __stdcall GLee_Lazy_glMultiTexCoord4iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord4iv(target, v);} - GLEEPFNGLMULTITEXCOORD4IVPROC GLeeFuncPtr_glMultiTexCoord4iv=GLee_Lazy_glMultiTexCoord4iv; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4s -#define GLEE_C_DEFINED_glMultiTexCoord4s - void __stdcall GLee_Lazy_glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) {if (GLeeInit()) glMultiTexCoord4s(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4SPROC GLeeFuncPtr_glMultiTexCoord4s=GLee_Lazy_glMultiTexCoord4s; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4sv -#define GLEE_C_DEFINED_glMultiTexCoord4sv - void __stdcall GLee_Lazy_glMultiTexCoord4sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord4sv(target, v);} - GLEEPFNGLMULTITEXCOORD4SVPROC GLeeFuncPtr_glMultiTexCoord4sv=GLee_Lazy_glMultiTexCoord4sv; -#endif -#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixf -#define GLEE_C_DEFINED_glLoadTransposeMatrixf - void __stdcall GLee_Lazy_glLoadTransposeMatrixf(const GLfloat * m) {if (GLeeInit()) glLoadTransposeMatrixf(m);} - GLEEPFNGLLOADTRANSPOSEMATRIXFPROC GLeeFuncPtr_glLoadTransposeMatrixf=GLee_Lazy_glLoadTransposeMatrixf; -#endif -#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixd -#define GLEE_C_DEFINED_glLoadTransposeMatrixd - void __stdcall GLee_Lazy_glLoadTransposeMatrixd(const GLdouble * m) {if (GLeeInit()) glLoadTransposeMatrixd(m);} - GLEEPFNGLLOADTRANSPOSEMATRIXDPROC GLeeFuncPtr_glLoadTransposeMatrixd=GLee_Lazy_glLoadTransposeMatrixd; -#endif -#ifndef GLEE_C_DEFINED_glMultTransposeMatrixf -#define GLEE_C_DEFINED_glMultTransposeMatrixf - void __stdcall GLee_Lazy_glMultTransposeMatrixf(const GLfloat * m) {if (GLeeInit()) glMultTransposeMatrixf(m);} - GLEEPFNGLMULTTRANSPOSEMATRIXFPROC GLeeFuncPtr_glMultTransposeMatrixf=GLee_Lazy_glMultTransposeMatrixf; -#endif -#ifndef GLEE_C_DEFINED_glMultTransposeMatrixd -#define GLEE_C_DEFINED_glMultTransposeMatrixd - void __stdcall GLee_Lazy_glMultTransposeMatrixd(const GLdouble * m) {if (GLeeInit()) glMultTransposeMatrixd(m);} - GLEEPFNGLMULTTRANSPOSEMATRIXDPROC GLeeFuncPtr_glMultTransposeMatrixd=GLee_Lazy_glMultTransposeMatrixd; -#endif -#ifndef GLEE_C_DEFINED_glSampleCoverage -#define GLEE_C_DEFINED_glSampleCoverage - void __stdcall GLee_Lazy_glSampleCoverage(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleCoverage(value, invert);} - GLEEPFNGLSAMPLECOVERAGEPROC GLeeFuncPtr_glSampleCoverage=GLee_Lazy_glSampleCoverage; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexImage3D -#define GLEE_C_DEFINED_glCompressedTexImage3D - void __stdcall GLee_Lazy_glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC GLeeFuncPtr_glCompressedTexImage3D=GLee_Lazy_glCompressedTexImage3D; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexImage2D -#define GLEE_C_DEFINED_glCompressedTexImage2D - void __stdcall GLee_Lazy_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC GLeeFuncPtr_glCompressedTexImage2D=GLee_Lazy_glCompressedTexImage2D; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexImage1D -#define GLEE_C_DEFINED_glCompressedTexImage1D - void __stdcall GLee_Lazy_glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC GLeeFuncPtr_glCompressedTexImage1D=GLee_Lazy_glCompressedTexImage1D; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexSubImage3D -#define GLEE_C_DEFINED_glCompressedTexSubImage3D - void __stdcall GLee_Lazy_glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLeeFuncPtr_glCompressedTexSubImage3D=GLee_Lazy_glCompressedTexSubImage3D; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexSubImage2D -#define GLEE_C_DEFINED_glCompressedTexSubImage2D - void __stdcall GLee_Lazy_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLeeFuncPtr_glCompressedTexSubImage2D=GLee_Lazy_glCompressedTexSubImage2D; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexSubImage1D -#define GLEE_C_DEFINED_glCompressedTexSubImage1D - void __stdcall GLee_Lazy_glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLeeFuncPtr_glCompressedTexSubImage1D=GLee_Lazy_glCompressedTexSubImage1D; -#endif -#ifndef GLEE_C_DEFINED_glGetCompressedTexImage -#define GLEE_C_DEFINED_glGetCompressedTexImage - void __stdcall GLee_Lazy_glGetCompressedTexImage(GLenum target, GLint level, GLvoid * img) {if (GLeeInit()) glGetCompressedTexImage(target, level, img);} - GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC GLeeFuncPtr_glGetCompressedTexImage=GLee_Lazy_glGetCompressedTexImage; -#endif -#endif - -/* GL_VERSION_1_4 */ - -#ifdef __GLEE_GL_VERSION_1_4 -#ifndef GLEE_C_DEFINED_glBlendFuncSeparate -#define GLEE_C_DEFINED_glBlendFuncSeparate - void __stdcall GLee_Lazy_glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) {if (GLeeInit()) glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);} - GLEEPFNGLBLENDFUNCSEPARATEPROC GLeeFuncPtr_glBlendFuncSeparate=GLee_Lazy_glBlendFuncSeparate; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordf -#define GLEE_C_DEFINED_glFogCoordf - void __stdcall GLee_Lazy_glFogCoordf(GLfloat coord) {if (GLeeInit()) glFogCoordf(coord);} - GLEEPFNGLFOGCOORDFPROC GLeeFuncPtr_glFogCoordf=GLee_Lazy_glFogCoordf; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordfv -#define GLEE_C_DEFINED_glFogCoordfv - void __stdcall GLee_Lazy_glFogCoordfv(const GLfloat * coord) {if (GLeeInit()) glFogCoordfv(coord);} - GLEEPFNGLFOGCOORDFVPROC GLeeFuncPtr_glFogCoordfv=GLee_Lazy_glFogCoordfv; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordd -#define GLEE_C_DEFINED_glFogCoordd - void __stdcall GLee_Lazy_glFogCoordd(GLdouble coord) {if (GLeeInit()) glFogCoordd(coord);} - GLEEPFNGLFOGCOORDDPROC GLeeFuncPtr_glFogCoordd=GLee_Lazy_glFogCoordd; -#endif -#ifndef GLEE_C_DEFINED_glFogCoorddv -#define GLEE_C_DEFINED_glFogCoorddv - void __stdcall GLee_Lazy_glFogCoorddv(const GLdouble * coord) {if (GLeeInit()) glFogCoorddv(coord);} - GLEEPFNGLFOGCOORDDVPROC GLeeFuncPtr_glFogCoorddv=GLee_Lazy_glFogCoorddv; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordPointer -#define GLEE_C_DEFINED_glFogCoordPointer - void __stdcall GLee_Lazy_glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glFogCoordPointer(type, stride, pointer);} - GLEEPFNGLFOGCOORDPOINTERPROC GLeeFuncPtr_glFogCoordPointer=GLee_Lazy_glFogCoordPointer; -#endif -#ifndef GLEE_C_DEFINED_glMultiDrawArrays -#define GLEE_C_DEFINED_glMultiDrawArrays - void __stdcall GLee_Lazy_glMultiDrawArrays(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawArrays(mode, first, count, primcount);} - GLEEPFNGLMULTIDRAWARRAYSPROC GLeeFuncPtr_glMultiDrawArrays=GLee_Lazy_glMultiDrawArrays; -#endif -#ifndef GLEE_C_DEFINED_glMultiDrawElements -#define GLEE_C_DEFINED_glMultiDrawElements - void __stdcall GLee_Lazy_glMultiDrawElements(GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount) {if (GLeeInit()) glMultiDrawElements(mode, count, type, indices, primcount);} - GLEEPFNGLMULTIDRAWELEMENTSPROC GLeeFuncPtr_glMultiDrawElements=GLee_Lazy_glMultiDrawElements; -#endif -#ifndef GLEE_C_DEFINED_glPointParameterf -#define GLEE_C_DEFINED_glPointParameterf - void __stdcall GLee_Lazy_glPointParameterf(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterf(pname, param);} - GLEEPFNGLPOINTPARAMETERFPROC GLeeFuncPtr_glPointParameterf=GLee_Lazy_glPointParameterf; -#endif -#ifndef GLEE_C_DEFINED_glPointParameterfv -#define GLEE_C_DEFINED_glPointParameterfv - void __stdcall GLee_Lazy_glPointParameterfv(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfv(pname, params);} - GLEEPFNGLPOINTPARAMETERFVPROC GLeeFuncPtr_glPointParameterfv=GLee_Lazy_glPointParameterfv; -#endif -#ifndef GLEE_C_DEFINED_glPointParameteri -#define GLEE_C_DEFINED_glPointParameteri - void __stdcall GLee_Lazy_glPointParameteri(GLenum pname, GLint param) {if (GLeeInit()) glPointParameteri(pname, param);} - GLEEPFNGLPOINTPARAMETERIPROC GLeeFuncPtr_glPointParameteri=GLee_Lazy_glPointParameteri; -#endif -#ifndef GLEE_C_DEFINED_glPointParameteriv -#define GLEE_C_DEFINED_glPointParameteriv - void __stdcall GLee_Lazy_glPointParameteriv(GLenum pname, const GLint * params) {if (GLeeInit()) glPointParameteriv(pname, params);} - GLEEPFNGLPOINTPARAMETERIVPROC GLeeFuncPtr_glPointParameteriv=GLee_Lazy_glPointParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3b -#define GLEE_C_DEFINED_glSecondaryColor3b - void __stdcall GLee_Lazy_glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue) {if (GLeeInit()) glSecondaryColor3b(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3BPROC GLeeFuncPtr_glSecondaryColor3b=GLee_Lazy_glSecondaryColor3b; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3bv -#define GLEE_C_DEFINED_glSecondaryColor3bv - void __stdcall GLee_Lazy_glSecondaryColor3bv(const GLbyte * v) {if (GLeeInit()) glSecondaryColor3bv(v);} - GLEEPFNGLSECONDARYCOLOR3BVPROC GLeeFuncPtr_glSecondaryColor3bv=GLee_Lazy_glSecondaryColor3bv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3d -#define GLEE_C_DEFINED_glSecondaryColor3d - void __stdcall GLee_Lazy_glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue) {if (GLeeInit()) glSecondaryColor3d(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3DPROC GLeeFuncPtr_glSecondaryColor3d=GLee_Lazy_glSecondaryColor3d; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3dv -#define GLEE_C_DEFINED_glSecondaryColor3dv - void __stdcall GLee_Lazy_glSecondaryColor3dv(const GLdouble * v) {if (GLeeInit()) glSecondaryColor3dv(v);} - GLEEPFNGLSECONDARYCOLOR3DVPROC GLeeFuncPtr_glSecondaryColor3dv=GLee_Lazy_glSecondaryColor3dv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3f -#define GLEE_C_DEFINED_glSecondaryColor3f - void __stdcall GLee_Lazy_glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue) {if (GLeeInit()) glSecondaryColor3f(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3FPROC GLeeFuncPtr_glSecondaryColor3f=GLee_Lazy_glSecondaryColor3f; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3fv -#define GLEE_C_DEFINED_glSecondaryColor3fv - void __stdcall GLee_Lazy_glSecondaryColor3fv(const GLfloat * v) {if (GLeeInit()) glSecondaryColor3fv(v);} - GLEEPFNGLSECONDARYCOLOR3FVPROC GLeeFuncPtr_glSecondaryColor3fv=GLee_Lazy_glSecondaryColor3fv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3i -#define GLEE_C_DEFINED_glSecondaryColor3i - void __stdcall GLee_Lazy_glSecondaryColor3i(GLint red, GLint green, GLint blue) {if (GLeeInit()) glSecondaryColor3i(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3IPROC GLeeFuncPtr_glSecondaryColor3i=GLee_Lazy_glSecondaryColor3i; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3iv -#define GLEE_C_DEFINED_glSecondaryColor3iv - void __stdcall GLee_Lazy_glSecondaryColor3iv(const GLint * v) {if (GLeeInit()) glSecondaryColor3iv(v);} - GLEEPFNGLSECONDARYCOLOR3IVPROC GLeeFuncPtr_glSecondaryColor3iv=GLee_Lazy_glSecondaryColor3iv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3s -#define GLEE_C_DEFINED_glSecondaryColor3s - void __stdcall GLee_Lazy_glSecondaryColor3s(GLshort red, GLshort green, GLshort blue) {if (GLeeInit()) glSecondaryColor3s(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3SPROC GLeeFuncPtr_glSecondaryColor3s=GLee_Lazy_glSecondaryColor3s; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3sv -#define GLEE_C_DEFINED_glSecondaryColor3sv - void __stdcall GLee_Lazy_glSecondaryColor3sv(const GLshort * v) {if (GLeeInit()) glSecondaryColor3sv(v);} - GLEEPFNGLSECONDARYCOLOR3SVPROC GLeeFuncPtr_glSecondaryColor3sv=GLee_Lazy_glSecondaryColor3sv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3ub -#define GLEE_C_DEFINED_glSecondaryColor3ub - void __stdcall GLee_Lazy_glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue) {if (GLeeInit()) glSecondaryColor3ub(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3UBPROC GLeeFuncPtr_glSecondaryColor3ub=GLee_Lazy_glSecondaryColor3ub; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3ubv -#define GLEE_C_DEFINED_glSecondaryColor3ubv - void __stdcall GLee_Lazy_glSecondaryColor3ubv(const GLubyte * v) {if (GLeeInit()) glSecondaryColor3ubv(v);} - GLEEPFNGLSECONDARYCOLOR3UBVPROC GLeeFuncPtr_glSecondaryColor3ubv=GLee_Lazy_glSecondaryColor3ubv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3ui -#define GLEE_C_DEFINED_glSecondaryColor3ui - void __stdcall GLee_Lazy_glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue) {if (GLeeInit()) glSecondaryColor3ui(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3UIPROC GLeeFuncPtr_glSecondaryColor3ui=GLee_Lazy_glSecondaryColor3ui; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3uiv -#define GLEE_C_DEFINED_glSecondaryColor3uiv - void __stdcall GLee_Lazy_glSecondaryColor3uiv(const GLuint * v) {if (GLeeInit()) glSecondaryColor3uiv(v);} - GLEEPFNGLSECONDARYCOLOR3UIVPROC GLeeFuncPtr_glSecondaryColor3uiv=GLee_Lazy_glSecondaryColor3uiv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3us -#define GLEE_C_DEFINED_glSecondaryColor3us - void __stdcall GLee_Lazy_glSecondaryColor3us(GLushort red, GLushort green, GLushort blue) {if (GLeeInit()) glSecondaryColor3us(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3USPROC GLeeFuncPtr_glSecondaryColor3us=GLee_Lazy_glSecondaryColor3us; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3usv -#define GLEE_C_DEFINED_glSecondaryColor3usv - void __stdcall GLee_Lazy_glSecondaryColor3usv(const GLushort * v) {if (GLeeInit()) glSecondaryColor3usv(v);} - GLEEPFNGLSECONDARYCOLOR3USVPROC GLeeFuncPtr_glSecondaryColor3usv=GLee_Lazy_glSecondaryColor3usv; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColorPointer -#define GLEE_C_DEFINED_glSecondaryColorPointer - void __stdcall GLee_Lazy_glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glSecondaryColorPointer(size, type, stride, pointer);} - GLEEPFNGLSECONDARYCOLORPOINTERPROC GLeeFuncPtr_glSecondaryColorPointer=GLee_Lazy_glSecondaryColorPointer; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2d -#define GLEE_C_DEFINED_glWindowPos2d - void __stdcall GLee_Lazy_glWindowPos2d(GLdouble x, GLdouble y) {if (GLeeInit()) glWindowPos2d(x, y);} - GLEEPFNGLWINDOWPOS2DPROC GLeeFuncPtr_glWindowPos2d=GLee_Lazy_glWindowPos2d; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2dv -#define GLEE_C_DEFINED_glWindowPos2dv - void __stdcall GLee_Lazy_glWindowPos2dv(const GLdouble * v) {if (GLeeInit()) glWindowPos2dv(v);} - GLEEPFNGLWINDOWPOS2DVPROC GLeeFuncPtr_glWindowPos2dv=GLee_Lazy_glWindowPos2dv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2f -#define GLEE_C_DEFINED_glWindowPos2f - void __stdcall GLee_Lazy_glWindowPos2f(GLfloat x, GLfloat y) {if (GLeeInit()) glWindowPos2f(x, y);} - GLEEPFNGLWINDOWPOS2FPROC GLeeFuncPtr_glWindowPos2f=GLee_Lazy_glWindowPos2f; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2fv -#define GLEE_C_DEFINED_glWindowPos2fv - void __stdcall GLee_Lazy_glWindowPos2fv(const GLfloat * v) {if (GLeeInit()) glWindowPos2fv(v);} - GLEEPFNGLWINDOWPOS2FVPROC GLeeFuncPtr_glWindowPos2fv=GLee_Lazy_glWindowPos2fv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2i -#define GLEE_C_DEFINED_glWindowPos2i - void __stdcall GLee_Lazy_glWindowPos2i(GLint x, GLint y) {if (GLeeInit()) glWindowPos2i(x, y);} - GLEEPFNGLWINDOWPOS2IPROC GLeeFuncPtr_glWindowPos2i=GLee_Lazy_glWindowPos2i; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2iv -#define GLEE_C_DEFINED_glWindowPos2iv - void __stdcall GLee_Lazy_glWindowPos2iv(const GLint * v) {if (GLeeInit()) glWindowPos2iv(v);} - GLEEPFNGLWINDOWPOS2IVPROC GLeeFuncPtr_glWindowPos2iv=GLee_Lazy_glWindowPos2iv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2s -#define GLEE_C_DEFINED_glWindowPos2s - void __stdcall GLee_Lazy_glWindowPos2s(GLshort x, GLshort y) {if (GLeeInit()) glWindowPos2s(x, y);} - GLEEPFNGLWINDOWPOS2SPROC GLeeFuncPtr_glWindowPos2s=GLee_Lazy_glWindowPos2s; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2sv -#define GLEE_C_DEFINED_glWindowPos2sv - void __stdcall GLee_Lazy_glWindowPos2sv(const GLshort * v) {if (GLeeInit()) glWindowPos2sv(v);} - GLEEPFNGLWINDOWPOS2SVPROC GLeeFuncPtr_glWindowPos2sv=GLee_Lazy_glWindowPos2sv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3d -#define GLEE_C_DEFINED_glWindowPos3d - void __stdcall GLee_Lazy_glWindowPos3d(GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glWindowPos3d(x, y, z);} - GLEEPFNGLWINDOWPOS3DPROC GLeeFuncPtr_glWindowPos3d=GLee_Lazy_glWindowPos3d; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3dv -#define GLEE_C_DEFINED_glWindowPos3dv - void __stdcall GLee_Lazy_glWindowPos3dv(const GLdouble * v) {if (GLeeInit()) glWindowPos3dv(v);} - GLEEPFNGLWINDOWPOS3DVPROC GLeeFuncPtr_glWindowPos3dv=GLee_Lazy_glWindowPos3dv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3f -#define GLEE_C_DEFINED_glWindowPos3f - void __stdcall GLee_Lazy_glWindowPos3f(GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glWindowPos3f(x, y, z);} - GLEEPFNGLWINDOWPOS3FPROC GLeeFuncPtr_glWindowPos3f=GLee_Lazy_glWindowPos3f; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3fv -#define GLEE_C_DEFINED_glWindowPos3fv - void __stdcall GLee_Lazy_glWindowPos3fv(const GLfloat * v) {if (GLeeInit()) glWindowPos3fv(v);} - GLEEPFNGLWINDOWPOS3FVPROC GLeeFuncPtr_glWindowPos3fv=GLee_Lazy_glWindowPos3fv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3i -#define GLEE_C_DEFINED_glWindowPos3i - void __stdcall GLee_Lazy_glWindowPos3i(GLint x, GLint y, GLint z) {if (GLeeInit()) glWindowPos3i(x, y, z);} - GLEEPFNGLWINDOWPOS3IPROC GLeeFuncPtr_glWindowPos3i=GLee_Lazy_glWindowPos3i; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3iv -#define GLEE_C_DEFINED_glWindowPos3iv - void __stdcall GLee_Lazy_glWindowPos3iv(const GLint * v) {if (GLeeInit()) glWindowPos3iv(v);} - GLEEPFNGLWINDOWPOS3IVPROC GLeeFuncPtr_glWindowPos3iv=GLee_Lazy_glWindowPos3iv; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3s -#define GLEE_C_DEFINED_glWindowPos3s - void __stdcall GLee_Lazy_glWindowPos3s(GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glWindowPos3s(x, y, z);} - GLEEPFNGLWINDOWPOS3SPROC GLeeFuncPtr_glWindowPos3s=GLee_Lazy_glWindowPos3s; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3sv -#define GLEE_C_DEFINED_glWindowPos3sv - void __stdcall GLee_Lazy_glWindowPos3sv(const GLshort * v) {if (GLeeInit()) glWindowPos3sv(v);} - GLEEPFNGLWINDOWPOS3SVPROC GLeeFuncPtr_glWindowPos3sv=GLee_Lazy_glWindowPos3sv; -#endif -#endif - -/* GL_VERSION_1_5 */ - -#ifdef __GLEE_GL_VERSION_1_5 -#ifndef GLEE_C_DEFINED_glGenQueries -#define GLEE_C_DEFINED_glGenQueries - void __stdcall GLee_Lazy_glGenQueries(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenQueries(n, ids);} - GLEEPFNGLGENQUERIESPROC GLeeFuncPtr_glGenQueries=GLee_Lazy_glGenQueries; -#endif -#ifndef GLEE_C_DEFINED_glDeleteQueries -#define GLEE_C_DEFINED_glDeleteQueries - void __stdcall GLee_Lazy_glDeleteQueries(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteQueries(n, ids);} - GLEEPFNGLDELETEQUERIESPROC GLeeFuncPtr_glDeleteQueries=GLee_Lazy_glDeleteQueries; -#endif -#ifndef GLEE_C_DEFINED_glIsQuery -#define GLEE_C_DEFINED_glIsQuery - GLboolean __stdcall GLee_Lazy_glIsQuery(GLuint id) {if (GLeeInit()) return glIsQuery(id); return (GLboolean)0;} - GLEEPFNGLISQUERYPROC GLeeFuncPtr_glIsQuery=GLee_Lazy_glIsQuery; -#endif -#ifndef GLEE_C_DEFINED_glBeginQuery -#define GLEE_C_DEFINED_glBeginQuery - void __stdcall GLee_Lazy_glBeginQuery(GLenum target, GLuint id) {if (GLeeInit()) glBeginQuery(target, id);} - GLEEPFNGLBEGINQUERYPROC GLeeFuncPtr_glBeginQuery=GLee_Lazy_glBeginQuery; -#endif -#ifndef GLEE_C_DEFINED_glEndQuery -#define GLEE_C_DEFINED_glEndQuery - void __stdcall GLee_Lazy_glEndQuery(GLenum target) {if (GLeeInit()) glEndQuery(target);} - GLEEPFNGLENDQUERYPROC GLeeFuncPtr_glEndQuery=GLee_Lazy_glEndQuery; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryiv -#define GLEE_C_DEFINED_glGetQueryiv - void __stdcall GLee_Lazy_glGetQueryiv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryiv(target, pname, params);} - GLEEPFNGLGETQUERYIVPROC GLeeFuncPtr_glGetQueryiv=GLee_Lazy_glGetQueryiv; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryObjectiv -#define GLEE_C_DEFINED_glGetQueryObjectiv - void __stdcall GLee_Lazy_glGetQueryObjectiv(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryObjectiv(id, pname, params);} - GLEEPFNGLGETQUERYOBJECTIVPROC GLeeFuncPtr_glGetQueryObjectiv=GLee_Lazy_glGetQueryObjectiv; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryObjectuiv -#define GLEE_C_DEFINED_glGetQueryObjectuiv - void __stdcall GLee_Lazy_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint * params) {if (GLeeInit()) glGetQueryObjectuiv(id, pname, params);} - GLEEPFNGLGETQUERYOBJECTUIVPROC GLeeFuncPtr_glGetQueryObjectuiv=GLee_Lazy_glGetQueryObjectuiv; -#endif -#ifndef GLEE_C_DEFINED_glBindBuffer -#define GLEE_C_DEFINED_glBindBuffer - void __stdcall GLee_Lazy_glBindBuffer(GLenum target, GLuint buffer) {if (GLeeInit()) glBindBuffer(target, buffer);} - GLEEPFNGLBINDBUFFERPROC GLeeFuncPtr_glBindBuffer=GLee_Lazy_glBindBuffer; -#endif -#ifndef GLEE_C_DEFINED_glDeleteBuffers -#define GLEE_C_DEFINED_glDeleteBuffers - void __stdcall GLee_Lazy_glDeleteBuffers(GLsizei n, const GLuint * buffers) {if (GLeeInit()) glDeleteBuffers(n, buffers);} - GLEEPFNGLDELETEBUFFERSPROC GLeeFuncPtr_glDeleteBuffers=GLee_Lazy_glDeleteBuffers; -#endif -#ifndef GLEE_C_DEFINED_glGenBuffers -#define GLEE_C_DEFINED_glGenBuffers - void __stdcall GLee_Lazy_glGenBuffers(GLsizei n, GLuint * buffers) {if (GLeeInit()) glGenBuffers(n, buffers);} - GLEEPFNGLGENBUFFERSPROC GLeeFuncPtr_glGenBuffers=GLee_Lazy_glGenBuffers; -#endif -#ifndef GLEE_C_DEFINED_glIsBuffer -#define GLEE_C_DEFINED_glIsBuffer - GLboolean __stdcall GLee_Lazy_glIsBuffer(GLuint buffer) {if (GLeeInit()) return glIsBuffer(buffer); return (GLboolean)0;} - GLEEPFNGLISBUFFERPROC GLeeFuncPtr_glIsBuffer=GLee_Lazy_glIsBuffer; -#endif -#ifndef GLEE_C_DEFINED_glBufferData -#define GLEE_C_DEFINED_glBufferData - void __stdcall GLee_Lazy_glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {if (GLeeInit()) glBufferData(target, size, data, usage);} - GLEEPFNGLBUFFERDATAPROC GLeeFuncPtr_glBufferData=GLee_Lazy_glBufferData; -#endif -#ifndef GLEE_C_DEFINED_glBufferSubData -#define GLEE_C_DEFINED_glBufferSubData - void __stdcall GLee_Lazy_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {if (GLeeInit()) glBufferSubData(target, offset, size, data);} - GLEEPFNGLBUFFERSUBDATAPROC GLeeFuncPtr_glBufferSubData=GLee_Lazy_glBufferSubData; -#endif -#ifndef GLEE_C_DEFINED_glGetBufferSubData -#define GLEE_C_DEFINED_glGetBufferSubData - void __stdcall GLee_Lazy_glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data) {if (GLeeInit()) glGetBufferSubData(target, offset, size, data);} - GLEEPFNGLGETBUFFERSUBDATAPROC GLeeFuncPtr_glGetBufferSubData=GLee_Lazy_glGetBufferSubData; -#endif -#ifndef GLEE_C_DEFINED_glMapBuffer -#define GLEE_C_DEFINED_glMapBuffer - GLvoid* __stdcall GLee_Lazy_glMapBuffer(GLenum target, GLenum access) {if (GLeeInit()) return glMapBuffer(target, access); return (GLvoid*)0;} - GLEEPFNGLMAPBUFFERPROC GLeeFuncPtr_glMapBuffer=GLee_Lazy_glMapBuffer; -#endif -#ifndef GLEE_C_DEFINED_glUnmapBuffer -#define GLEE_C_DEFINED_glUnmapBuffer - GLboolean __stdcall GLee_Lazy_glUnmapBuffer(GLenum target) {if (GLeeInit()) return glUnmapBuffer(target); return (GLboolean)0;} - GLEEPFNGLUNMAPBUFFERPROC GLeeFuncPtr_glUnmapBuffer=GLee_Lazy_glUnmapBuffer; -#endif -#ifndef GLEE_C_DEFINED_glGetBufferParameteriv -#define GLEE_C_DEFINED_glGetBufferParameteriv - void __stdcall GLee_Lazy_glGetBufferParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetBufferParameteriv(target, pname, params);} - GLEEPFNGLGETBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetBufferParameteriv=GLee_Lazy_glGetBufferParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glGetBufferPointerv -#define GLEE_C_DEFINED_glGetBufferPointerv - void __stdcall GLee_Lazy_glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetBufferPointerv(target, pname, params);} - GLEEPFNGLGETBUFFERPOINTERVPROC GLeeFuncPtr_glGetBufferPointerv=GLee_Lazy_glGetBufferPointerv; -#endif -#endif - -/* GL_VERSION_2_0 */ - -#ifdef __GLEE_GL_VERSION_2_0 -#ifndef GLEE_C_DEFINED_glBlendEquationSeparate -#define GLEE_C_DEFINED_glBlendEquationSeparate - void __stdcall GLee_Lazy_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) {if (GLeeInit()) glBlendEquationSeparate(modeRGB, modeAlpha);} - GLEEPFNGLBLENDEQUATIONSEPARATEPROC GLeeFuncPtr_glBlendEquationSeparate=GLee_Lazy_glBlendEquationSeparate; -#endif -#ifndef GLEE_C_DEFINED_glDrawBuffers -#define GLEE_C_DEFINED_glDrawBuffers - void __stdcall GLee_Lazy_glDrawBuffers(GLsizei n, const GLenum * bufs) {if (GLeeInit()) glDrawBuffers(n, bufs);} - GLEEPFNGLDRAWBUFFERSPROC GLeeFuncPtr_glDrawBuffers=GLee_Lazy_glDrawBuffers; -#endif -#ifndef GLEE_C_DEFINED_glStencilOpSeparate -#define GLEE_C_DEFINED_glStencilOpSeparate - void __stdcall GLee_Lazy_glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) {if (GLeeInit()) glStencilOpSeparate(face, sfail, dpfail, dppass);} - GLEEPFNGLSTENCILOPSEPARATEPROC GLeeFuncPtr_glStencilOpSeparate=GLee_Lazy_glStencilOpSeparate; -#endif -#ifndef GLEE_C_DEFINED_glStencilFuncSeparate -#define GLEE_C_DEFINED_glStencilFuncSeparate - void __stdcall GLee_Lazy_glStencilFuncSeparate(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) {if (GLeeInit()) glStencilFuncSeparate(frontfunc, backfunc, ref, mask);} - GLEEPFNGLSTENCILFUNCSEPARATEPROC GLeeFuncPtr_glStencilFuncSeparate=GLee_Lazy_glStencilFuncSeparate; -#endif -#ifndef GLEE_C_DEFINED_glStencilMaskSeparate -#define GLEE_C_DEFINED_glStencilMaskSeparate - void __stdcall GLee_Lazy_glStencilMaskSeparate(GLenum face, GLuint mask) {if (GLeeInit()) glStencilMaskSeparate(face, mask);} - GLEEPFNGLSTENCILMASKSEPARATEPROC GLeeFuncPtr_glStencilMaskSeparate=GLee_Lazy_glStencilMaskSeparate; -#endif -#ifndef GLEE_C_DEFINED_glAttachShader -#define GLEE_C_DEFINED_glAttachShader - void __stdcall GLee_Lazy_glAttachShader(GLuint program, GLuint shader) {if (GLeeInit()) glAttachShader(program, shader);} - GLEEPFNGLATTACHSHADERPROC GLeeFuncPtr_glAttachShader=GLee_Lazy_glAttachShader; -#endif -#ifndef GLEE_C_DEFINED_glBindAttribLocation -#define GLEE_C_DEFINED_glBindAttribLocation - void __stdcall GLee_Lazy_glBindAttribLocation(GLuint program, GLuint index, const GLchar * name) {if (GLeeInit()) glBindAttribLocation(program, index, name);} - GLEEPFNGLBINDATTRIBLOCATIONPROC GLeeFuncPtr_glBindAttribLocation=GLee_Lazy_glBindAttribLocation; -#endif -#ifndef GLEE_C_DEFINED_glCompileShader -#define GLEE_C_DEFINED_glCompileShader - void __stdcall GLee_Lazy_glCompileShader(GLuint shader) {if (GLeeInit()) glCompileShader(shader);} - GLEEPFNGLCOMPILESHADERPROC GLeeFuncPtr_glCompileShader=GLee_Lazy_glCompileShader; -#endif -#ifndef GLEE_C_DEFINED_glCreateProgram -#define GLEE_C_DEFINED_glCreateProgram - GLuint __stdcall GLee_Lazy_glCreateProgram(void) {if (GLeeInit()) return glCreateProgram(); return (GLuint)0;} - GLEEPFNGLCREATEPROGRAMPROC GLeeFuncPtr_glCreateProgram=GLee_Lazy_glCreateProgram; -#endif -#ifndef GLEE_C_DEFINED_glCreateShader -#define GLEE_C_DEFINED_glCreateShader - GLuint __stdcall GLee_Lazy_glCreateShader(GLenum type) {if (GLeeInit()) return glCreateShader(type); return (GLuint)0;} - GLEEPFNGLCREATESHADERPROC GLeeFuncPtr_glCreateShader=GLee_Lazy_glCreateShader; -#endif -#ifndef GLEE_C_DEFINED_glDeleteProgram -#define GLEE_C_DEFINED_glDeleteProgram - void __stdcall GLee_Lazy_glDeleteProgram(GLuint program) {if (GLeeInit()) glDeleteProgram(program);} - GLEEPFNGLDELETEPROGRAMPROC GLeeFuncPtr_glDeleteProgram=GLee_Lazy_glDeleteProgram; -#endif -#ifndef GLEE_C_DEFINED_glDeleteShader -#define GLEE_C_DEFINED_glDeleteShader - void __stdcall GLee_Lazy_glDeleteShader(GLuint shader) {if (GLeeInit()) glDeleteShader(shader);} - GLEEPFNGLDELETESHADERPROC GLeeFuncPtr_glDeleteShader=GLee_Lazy_glDeleteShader; -#endif -#ifndef GLEE_C_DEFINED_glDetachShader -#define GLEE_C_DEFINED_glDetachShader - void __stdcall GLee_Lazy_glDetachShader(GLuint program, GLuint shader) {if (GLeeInit()) glDetachShader(program, shader);} - GLEEPFNGLDETACHSHADERPROC GLeeFuncPtr_glDetachShader=GLee_Lazy_glDetachShader; -#endif -#ifndef GLEE_C_DEFINED_glDisableVertexAttribArray -#define GLEE_C_DEFINED_glDisableVertexAttribArray - void __stdcall GLee_Lazy_glDisableVertexAttribArray(GLuint index) {if (GLeeInit()) glDisableVertexAttribArray(index);} - GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glDisableVertexAttribArray=GLee_Lazy_glDisableVertexAttribArray; -#endif -#ifndef GLEE_C_DEFINED_glEnableVertexAttribArray -#define GLEE_C_DEFINED_glEnableVertexAttribArray - void __stdcall GLee_Lazy_glEnableVertexAttribArray(GLuint index) {if (GLeeInit()) glEnableVertexAttribArray(index);} - GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glEnableVertexAttribArray=GLee_Lazy_glEnableVertexAttribArray; -#endif -#ifndef GLEE_C_DEFINED_glGetActiveAttrib -#define GLEE_C_DEFINED_glGetActiveAttrib - void __stdcall GLee_Lazy_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name) {if (GLeeInit()) glGetActiveAttrib(program, index, bufSize, length, size, type, name);} - GLEEPFNGLGETACTIVEATTRIBPROC GLeeFuncPtr_glGetActiveAttrib=GLee_Lazy_glGetActiveAttrib; -#endif -#ifndef GLEE_C_DEFINED_glGetActiveUniform -#define GLEE_C_DEFINED_glGetActiveUniform - void __stdcall GLee_Lazy_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name) {if (GLeeInit()) glGetActiveUniform(program, index, bufSize, length, size, type, name);} - GLEEPFNGLGETACTIVEUNIFORMPROC GLeeFuncPtr_glGetActiveUniform=GLee_Lazy_glGetActiveUniform; -#endif -#ifndef GLEE_C_DEFINED_glGetAttachedShaders -#define GLEE_C_DEFINED_glGetAttachedShaders - void __stdcall GLee_Lazy_glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj) {if (GLeeInit()) glGetAttachedShaders(program, maxCount, count, obj);} - GLEEPFNGLGETATTACHEDSHADERSPROC GLeeFuncPtr_glGetAttachedShaders=GLee_Lazy_glGetAttachedShaders; -#endif -#ifndef GLEE_C_DEFINED_glGetAttribLocation -#define GLEE_C_DEFINED_glGetAttribLocation - GLint __stdcall GLee_Lazy_glGetAttribLocation(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetAttribLocation(program, name); return (GLint)0;} - GLEEPFNGLGETATTRIBLOCATIONPROC GLeeFuncPtr_glGetAttribLocation=GLee_Lazy_glGetAttribLocation; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramiv -#define GLEE_C_DEFINED_glGetProgramiv - void __stdcall GLee_Lazy_glGetProgramiv(GLuint program, GLenum pname, GLint * params) {if (GLeeInit()) glGetProgramiv(program, pname, params);} - GLEEPFNGLGETPROGRAMIVPROC GLeeFuncPtr_glGetProgramiv=GLee_Lazy_glGetProgramiv; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramInfoLog -#define GLEE_C_DEFINED_glGetProgramInfoLog - void __stdcall GLee_Lazy_glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog) {if (GLeeInit()) glGetProgramInfoLog(program, bufSize, length, infoLog);} - GLEEPFNGLGETPROGRAMINFOLOGPROC GLeeFuncPtr_glGetProgramInfoLog=GLee_Lazy_glGetProgramInfoLog; -#endif -#ifndef GLEE_C_DEFINED_glGetShaderiv -#define GLEE_C_DEFINED_glGetShaderiv - void __stdcall GLee_Lazy_glGetShaderiv(GLuint shader, GLenum pname, GLint * params) {if (GLeeInit()) glGetShaderiv(shader, pname, params);} - GLEEPFNGLGETSHADERIVPROC GLeeFuncPtr_glGetShaderiv=GLee_Lazy_glGetShaderiv; -#endif -#ifndef GLEE_C_DEFINED_glGetShaderInfoLog -#define GLEE_C_DEFINED_glGetShaderInfoLog - void __stdcall GLee_Lazy_glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog) {if (GLeeInit()) glGetShaderInfoLog(shader, bufSize, length, infoLog);} - GLEEPFNGLGETSHADERINFOLOGPROC GLeeFuncPtr_glGetShaderInfoLog=GLee_Lazy_glGetShaderInfoLog; -#endif -#ifndef GLEE_C_DEFINED_glGetShaderSource -#define GLEE_C_DEFINED_glGetShaderSource - void __stdcall GLee_Lazy_glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source) {if (GLeeInit()) glGetShaderSource(shader, bufSize, length, source);} - GLEEPFNGLGETSHADERSOURCEPROC GLeeFuncPtr_glGetShaderSource=GLee_Lazy_glGetShaderSource; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformLocation -#define GLEE_C_DEFINED_glGetUniformLocation - GLint __stdcall GLee_Lazy_glGetUniformLocation(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetUniformLocation(program, name); return (GLint)0;} - GLEEPFNGLGETUNIFORMLOCATIONPROC GLeeFuncPtr_glGetUniformLocation=GLee_Lazy_glGetUniformLocation; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformfv -#define GLEE_C_DEFINED_glGetUniformfv - void __stdcall GLee_Lazy_glGetUniformfv(GLuint program, GLint location, GLfloat * params) {if (GLeeInit()) glGetUniformfv(program, location, params);} - GLEEPFNGLGETUNIFORMFVPROC GLeeFuncPtr_glGetUniformfv=GLee_Lazy_glGetUniformfv; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformiv -#define GLEE_C_DEFINED_glGetUniformiv - void __stdcall GLee_Lazy_glGetUniformiv(GLuint program, GLint location, GLint * params) {if (GLeeInit()) glGetUniformiv(program, location, params);} - GLEEPFNGLGETUNIFORMIVPROC GLeeFuncPtr_glGetUniformiv=GLee_Lazy_glGetUniformiv; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribdv -#define GLEE_C_DEFINED_glGetVertexAttribdv - void __stdcall GLee_Lazy_glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetVertexAttribdv(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBDVPROC GLeeFuncPtr_glGetVertexAttribdv=GLee_Lazy_glGetVertexAttribdv; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribfv -#define GLEE_C_DEFINED_glGetVertexAttribfv - void __stdcall GLee_Lazy_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribfv(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBFVPROC GLeeFuncPtr_glGetVertexAttribfv=GLee_Lazy_glGetVertexAttribfv; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribiv -#define GLEE_C_DEFINED_glGetVertexAttribiv - void __stdcall GLee_Lazy_glGetVertexAttribiv(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribiv(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIVPROC GLeeFuncPtr_glGetVertexAttribiv=GLee_Lazy_glGetVertexAttribiv; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribPointerv -#define GLEE_C_DEFINED_glGetVertexAttribPointerv - void __stdcall GLee_Lazy_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* * pointer) {if (GLeeInit()) glGetVertexAttribPointerv(index, pname, pointer);} - GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC GLeeFuncPtr_glGetVertexAttribPointerv=GLee_Lazy_glGetVertexAttribPointerv; -#endif -#ifndef GLEE_C_DEFINED_glIsProgram -#define GLEE_C_DEFINED_glIsProgram - GLboolean __stdcall GLee_Lazy_glIsProgram(GLuint program) {if (GLeeInit()) return glIsProgram(program); return (GLboolean)0;} - GLEEPFNGLISPROGRAMPROC GLeeFuncPtr_glIsProgram=GLee_Lazy_glIsProgram; -#endif -#ifndef GLEE_C_DEFINED_glIsShader -#define GLEE_C_DEFINED_glIsShader - GLboolean __stdcall GLee_Lazy_glIsShader(GLuint shader) {if (GLeeInit()) return glIsShader(shader); return (GLboolean)0;} - GLEEPFNGLISSHADERPROC GLeeFuncPtr_glIsShader=GLee_Lazy_glIsShader; -#endif -#ifndef GLEE_C_DEFINED_glLinkProgram -#define GLEE_C_DEFINED_glLinkProgram - void __stdcall GLee_Lazy_glLinkProgram(GLuint program) {if (GLeeInit()) glLinkProgram(program);} - GLEEPFNGLLINKPROGRAMPROC GLeeFuncPtr_glLinkProgram=GLee_Lazy_glLinkProgram; -#endif -#ifndef GLEE_C_DEFINED_glShaderSource -#define GLEE_C_DEFINED_glShaderSource - void __stdcall GLee_Lazy_glShaderSource(GLuint shader, GLsizei count, const GLchar* * string, const GLint * length) {if (GLeeInit()) glShaderSource(shader, count, string, length);} - GLEEPFNGLSHADERSOURCEPROC GLeeFuncPtr_glShaderSource=GLee_Lazy_glShaderSource; -#endif -#ifndef GLEE_C_DEFINED_glUseProgram -#define GLEE_C_DEFINED_glUseProgram - void __stdcall GLee_Lazy_glUseProgram(GLuint program) {if (GLeeInit()) glUseProgram(program);} - GLEEPFNGLUSEPROGRAMPROC GLeeFuncPtr_glUseProgram=GLee_Lazy_glUseProgram; -#endif -#ifndef GLEE_C_DEFINED_glUniform1f -#define GLEE_C_DEFINED_glUniform1f - void __stdcall GLee_Lazy_glUniform1f(GLint location, GLfloat v0) {if (GLeeInit()) glUniform1f(location, v0);} - GLEEPFNGLUNIFORM1FPROC GLeeFuncPtr_glUniform1f=GLee_Lazy_glUniform1f; -#endif -#ifndef GLEE_C_DEFINED_glUniform2f -#define GLEE_C_DEFINED_glUniform2f - void __stdcall GLee_Lazy_glUniform2f(GLint location, GLfloat v0, GLfloat v1) {if (GLeeInit()) glUniform2f(location, v0, v1);} - GLEEPFNGLUNIFORM2FPROC GLeeFuncPtr_glUniform2f=GLee_Lazy_glUniform2f; -#endif -#ifndef GLEE_C_DEFINED_glUniform3f -#define GLEE_C_DEFINED_glUniform3f - void __stdcall GLee_Lazy_glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {if (GLeeInit()) glUniform3f(location, v0, v1, v2);} - GLEEPFNGLUNIFORM3FPROC GLeeFuncPtr_glUniform3f=GLee_Lazy_glUniform3f; -#endif -#ifndef GLEE_C_DEFINED_glUniform4f -#define GLEE_C_DEFINED_glUniform4f - void __stdcall GLee_Lazy_glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {if (GLeeInit()) glUniform4f(location, v0, v1, v2, v3);} - GLEEPFNGLUNIFORM4FPROC GLeeFuncPtr_glUniform4f=GLee_Lazy_glUniform4f; -#endif -#ifndef GLEE_C_DEFINED_glUniform1i -#define GLEE_C_DEFINED_glUniform1i - void __stdcall GLee_Lazy_glUniform1i(GLint location, GLint v0) {if (GLeeInit()) glUniform1i(location, v0);} - GLEEPFNGLUNIFORM1IPROC GLeeFuncPtr_glUniform1i=GLee_Lazy_glUniform1i; -#endif -#ifndef GLEE_C_DEFINED_glUniform2i -#define GLEE_C_DEFINED_glUniform2i - void __stdcall GLee_Lazy_glUniform2i(GLint location, GLint v0, GLint v1) {if (GLeeInit()) glUniform2i(location, v0, v1);} - GLEEPFNGLUNIFORM2IPROC GLeeFuncPtr_glUniform2i=GLee_Lazy_glUniform2i; -#endif -#ifndef GLEE_C_DEFINED_glUniform3i -#define GLEE_C_DEFINED_glUniform3i - void __stdcall GLee_Lazy_glUniform3i(GLint location, GLint v0, GLint v1, GLint v2) {if (GLeeInit()) glUniform3i(location, v0, v1, v2);} - GLEEPFNGLUNIFORM3IPROC GLeeFuncPtr_glUniform3i=GLee_Lazy_glUniform3i; -#endif -#ifndef GLEE_C_DEFINED_glUniform4i -#define GLEE_C_DEFINED_glUniform4i - void __stdcall GLee_Lazy_glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {if (GLeeInit()) glUniform4i(location, v0, v1, v2, v3);} - GLEEPFNGLUNIFORM4IPROC GLeeFuncPtr_glUniform4i=GLee_Lazy_glUniform4i; -#endif -#ifndef GLEE_C_DEFINED_glUniform1fv -#define GLEE_C_DEFINED_glUniform1fv - void __stdcall GLee_Lazy_glUniform1fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform1fv(location, count, value);} - GLEEPFNGLUNIFORM1FVPROC GLeeFuncPtr_glUniform1fv=GLee_Lazy_glUniform1fv; -#endif -#ifndef GLEE_C_DEFINED_glUniform2fv -#define GLEE_C_DEFINED_glUniform2fv - void __stdcall GLee_Lazy_glUniform2fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform2fv(location, count, value);} - GLEEPFNGLUNIFORM2FVPROC GLeeFuncPtr_glUniform2fv=GLee_Lazy_glUniform2fv; -#endif -#ifndef GLEE_C_DEFINED_glUniform3fv -#define GLEE_C_DEFINED_glUniform3fv - void __stdcall GLee_Lazy_glUniform3fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform3fv(location, count, value);} - GLEEPFNGLUNIFORM3FVPROC GLeeFuncPtr_glUniform3fv=GLee_Lazy_glUniform3fv; -#endif -#ifndef GLEE_C_DEFINED_glUniform4fv -#define GLEE_C_DEFINED_glUniform4fv - void __stdcall GLee_Lazy_glUniform4fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform4fv(location, count, value);} - GLEEPFNGLUNIFORM4FVPROC GLeeFuncPtr_glUniform4fv=GLee_Lazy_glUniform4fv; -#endif -#ifndef GLEE_C_DEFINED_glUniform1iv -#define GLEE_C_DEFINED_glUniform1iv - void __stdcall GLee_Lazy_glUniform1iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform1iv(location, count, value);} - GLEEPFNGLUNIFORM1IVPROC GLeeFuncPtr_glUniform1iv=GLee_Lazy_glUniform1iv; -#endif -#ifndef GLEE_C_DEFINED_glUniform2iv -#define GLEE_C_DEFINED_glUniform2iv - void __stdcall GLee_Lazy_glUniform2iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform2iv(location, count, value);} - GLEEPFNGLUNIFORM2IVPROC GLeeFuncPtr_glUniform2iv=GLee_Lazy_glUniform2iv; -#endif -#ifndef GLEE_C_DEFINED_glUniform3iv -#define GLEE_C_DEFINED_glUniform3iv - void __stdcall GLee_Lazy_glUniform3iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform3iv(location, count, value);} - GLEEPFNGLUNIFORM3IVPROC GLeeFuncPtr_glUniform3iv=GLee_Lazy_glUniform3iv; -#endif -#ifndef GLEE_C_DEFINED_glUniform4iv -#define GLEE_C_DEFINED_glUniform4iv - void __stdcall GLee_Lazy_glUniform4iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform4iv(location, count, value);} - GLEEPFNGLUNIFORM4IVPROC GLeeFuncPtr_glUniform4iv=GLee_Lazy_glUniform4iv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix2fv -#define GLEE_C_DEFINED_glUniformMatrix2fv - void __stdcall GLee_Lazy_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX2FVPROC GLeeFuncPtr_glUniformMatrix2fv=GLee_Lazy_glUniformMatrix2fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix3fv -#define GLEE_C_DEFINED_glUniformMatrix3fv - void __stdcall GLee_Lazy_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX3FVPROC GLeeFuncPtr_glUniformMatrix3fv=GLee_Lazy_glUniformMatrix3fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix4fv -#define GLEE_C_DEFINED_glUniformMatrix4fv - void __stdcall GLee_Lazy_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX4FVPROC GLeeFuncPtr_glUniformMatrix4fv=GLee_Lazy_glUniformMatrix4fv; -#endif -#ifndef GLEE_C_DEFINED_glValidateProgram -#define GLEE_C_DEFINED_glValidateProgram - void __stdcall GLee_Lazy_glValidateProgram(GLuint program) {if (GLeeInit()) glValidateProgram(program);} - GLEEPFNGLVALIDATEPROGRAMPROC GLeeFuncPtr_glValidateProgram=GLee_Lazy_glValidateProgram; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1d -#define GLEE_C_DEFINED_glVertexAttrib1d - void __stdcall GLee_Lazy_glVertexAttrib1d(GLuint index, GLdouble x) {if (GLeeInit()) glVertexAttrib1d(index, x);} - GLEEPFNGLVERTEXATTRIB1DPROC GLeeFuncPtr_glVertexAttrib1d=GLee_Lazy_glVertexAttrib1d; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1dv -#define GLEE_C_DEFINED_glVertexAttrib1dv - void __stdcall GLee_Lazy_glVertexAttrib1dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib1dv(index, v);} - GLEEPFNGLVERTEXATTRIB1DVPROC GLeeFuncPtr_glVertexAttrib1dv=GLee_Lazy_glVertexAttrib1dv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1f -#define GLEE_C_DEFINED_glVertexAttrib1f - void __stdcall GLee_Lazy_glVertexAttrib1f(GLuint index, GLfloat x) {if (GLeeInit()) glVertexAttrib1f(index, x);} - GLEEPFNGLVERTEXATTRIB1FPROC GLeeFuncPtr_glVertexAttrib1f=GLee_Lazy_glVertexAttrib1f; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1fv -#define GLEE_C_DEFINED_glVertexAttrib1fv - void __stdcall GLee_Lazy_glVertexAttrib1fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib1fv(index, v);} - GLEEPFNGLVERTEXATTRIB1FVPROC GLeeFuncPtr_glVertexAttrib1fv=GLee_Lazy_glVertexAttrib1fv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1s -#define GLEE_C_DEFINED_glVertexAttrib1s - void __stdcall GLee_Lazy_glVertexAttrib1s(GLuint index, GLshort x) {if (GLeeInit()) glVertexAttrib1s(index, x);} - GLEEPFNGLVERTEXATTRIB1SPROC GLeeFuncPtr_glVertexAttrib1s=GLee_Lazy_glVertexAttrib1s; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1sv -#define GLEE_C_DEFINED_glVertexAttrib1sv - void __stdcall GLee_Lazy_glVertexAttrib1sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib1sv(index, v);} - GLEEPFNGLVERTEXATTRIB1SVPROC GLeeFuncPtr_glVertexAttrib1sv=GLee_Lazy_glVertexAttrib1sv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2d -#define GLEE_C_DEFINED_glVertexAttrib2d - void __stdcall GLee_Lazy_glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexAttrib2d(index, x, y);} - GLEEPFNGLVERTEXATTRIB2DPROC GLeeFuncPtr_glVertexAttrib2d=GLee_Lazy_glVertexAttrib2d; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2dv -#define GLEE_C_DEFINED_glVertexAttrib2dv - void __stdcall GLee_Lazy_glVertexAttrib2dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib2dv(index, v);} - GLEEPFNGLVERTEXATTRIB2DVPROC GLeeFuncPtr_glVertexAttrib2dv=GLee_Lazy_glVertexAttrib2dv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2f -#define GLEE_C_DEFINED_glVertexAttrib2f - void __stdcall GLee_Lazy_glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexAttrib2f(index, x, y);} - GLEEPFNGLVERTEXATTRIB2FPROC GLeeFuncPtr_glVertexAttrib2f=GLee_Lazy_glVertexAttrib2f; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2fv -#define GLEE_C_DEFINED_glVertexAttrib2fv - void __stdcall GLee_Lazy_glVertexAttrib2fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib2fv(index, v);} - GLEEPFNGLVERTEXATTRIB2FVPROC GLeeFuncPtr_glVertexAttrib2fv=GLee_Lazy_glVertexAttrib2fv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2s -#define GLEE_C_DEFINED_glVertexAttrib2s - void __stdcall GLee_Lazy_glVertexAttrib2s(GLuint index, GLshort x, GLshort y) {if (GLeeInit()) glVertexAttrib2s(index, x, y);} - GLEEPFNGLVERTEXATTRIB2SPROC GLeeFuncPtr_glVertexAttrib2s=GLee_Lazy_glVertexAttrib2s; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2sv -#define GLEE_C_DEFINED_glVertexAttrib2sv - void __stdcall GLee_Lazy_glVertexAttrib2sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib2sv(index, v);} - GLEEPFNGLVERTEXATTRIB2SVPROC GLeeFuncPtr_glVertexAttrib2sv=GLee_Lazy_glVertexAttrib2sv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3d -#define GLEE_C_DEFINED_glVertexAttrib3d - void __stdcall GLee_Lazy_glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexAttrib3d(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3DPROC GLeeFuncPtr_glVertexAttrib3d=GLee_Lazy_glVertexAttrib3d; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3dv -#define GLEE_C_DEFINED_glVertexAttrib3dv - void __stdcall GLee_Lazy_glVertexAttrib3dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib3dv(index, v);} - GLEEPFNGLVERTEXATTRIB3DVPROC GLeeFuncPtr_glVertexAttrib3dv=GLee_Lazy_glVertexAttrib3dv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3f -#define GLEE_C_DEFINED_glVertexAttrib3f - void __stdcall GLee_Lazy_glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexAttrib3f(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3FPROC GLeeFuncPtr_glVertexAttrib3f=GLee_Lazy_glVertexAttrib3f; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3fv -#define GLEE_C_DEFINED_glVertexAttrib3fv - void __stdcall GLee_Lazy_glVertexAttrib3fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib3fv(index, v);} - GLEEPFNGLVERTEXATTRIB3FVPROC GLeeFuncPtr_glVertexAttrib3fv=GLee_Lazy_glVertexAttrib3fv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3s -#define GLEE_C_DEFINED_glVertexAttrib3s - void __stdcall GLee_Lazy_glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexAttrib3s(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3SPROC GLeeFuncPtr_glVertexAttrib3s=GLee_Lazy_glVertexAttrib3s; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3sv -#define GLEE_C_DEFINED_glVertexAttrib3sv - void __stdcall GLee_Lazy_glVertexAttrib3sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib3sv(index, v);} - GLEEPFNGLVERTEXATTRIB3SVPROC GLeeFuncPtr_glVertexAttrib3sv=GLee_Lazy_glVertexAttrib3sv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Nbv -#define GLEE_C_DEFINED_glVertexAttrib4Nbv - void __stdcall GLee_Lazy_glVertexAttrib4Nbv(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4Nbv(index, v);} - GLEEPFNGLVERTEXATTRIB4NBVPROC GLeeFuncPtr_glVertexAttrib4Nbv=GLee_Lazy_glVertexAttrib4Nbv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Niv -#define GLEE_C_DEFINED_glVertexAttrib4Niv - void __stdcall GLee_Lazy_glVertexAttrib4Niv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4Niv(index, v);} - GLEEPFNGLVERTEXATTRIB4NIVPROC GLeeFuncPtr_glVertexAttrib4Niv=GLee_Lazy_glVertexAttrib4Niv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Nsv -#define GLEE_C_DEFINED_glVertexAttrib4Nsv - void __stdcall GLee_Lazy_glVertexAttrib4Nsv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4Nsv(index, v);} - GLEEPFNGLVERTEXATTRIB4NSVPROC GLeeFuncPtr_glVertexAttrib4Nsv=GLee_Lazy_glVertexAttrib4Nsv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Nub -#define GLEE_C_DEFINED_glVertexAttrib4Nub - void __stdcall GLee_Lazy_glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) {if (GLeeInit()) glVertexAttrib4Nub(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4NUBPROC GLeeFuncPtr_glVertexAttrib4Nub=GLee_Lazy_glVertexAttrib4Nub; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Nubv -#define GLEE_C_DEFINED_glVertexAttrib4Nubv - void __stdcall GLee_Lazy_glVertexAttrib4Nubv(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4Nubv(index, v);} - GLEEPFNGLVERTEXATTRIB4NUBVPROC GLeeFuncPtr_glVertexAttrib4Nubv=GLee_Lazy_glVertexAttrib4Nubv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Nuiv -#define GLEE_C_DEFINED_glVertexAttrib4Nuiv - void __stdcall GLee_Lazy_glVertexAttrib4Nuiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4Nuiv(index, v);} - GLEEPFNGLVERTEXATTRIB4NUIVPROC GLeeFuncPtr_glVertexAttrib4Nuiv=GLee_Lazy_glVertexAttrib4Nuiv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4Nusv -#define GLEE_C_DEFINED_glVertexAttrib4Nusv - void __stdcall GLee_Lazy_glVertexAttrib4Nusv(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4Nusv(index, v);} - GLEEPFNGLVERTEXATTRIB4NUSVPROC GLeeFuncPtr_glVertexAttrib4Nusv=GLee_Lazy_glVertexAttrib4Nusv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4bv -#define GLEE_C_DEFINED_glVertexAttrib4bv - void __stdcall GLee_Lazy_glVertexAttrib4bv(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4bv(index, v);} - GLEEPFNGLVERTEXATTRIB4BVPROC GLeeFuncPtr_glVertexAttrib4bv=GLee_Lazy_glVertexAttrib4bv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4d -#define GLEE_C_DEFINED_glVertexAttrib4d - void __stdcall GLee_Lazy_glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexAttrib4d(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4DPROC GLeeFuncPtr_glVertexAttrib4d=GLee_Lazy_glVertexAttrib4d; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4dv -#define GLEE_C_DEFINED_glVertexAttrib4dv - void __stdcall GLee_Lazy_glVertexAttrib4dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib4dv(index, v);} - GLEEPFNGLVERTEXATTRIB4DVPROC GLeeFuncPtr_glVertexAttrib4dv=GLee_Lazy_glVertexAttrib4dv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4f -#define GLEE_C_DEFINED_glVertexAttrib4f - void __stdcall GLee_Lazy_glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexAttrib4f(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4FPROC GLeeFuncPtr_glVertexAttrib4f=GLee_Lazy_glVertexAttrib4f; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4fv -#define GLEE_C_DEFINED_glVertexAttrib4fv - void __stdcall GLee_Lazy_glVertexAttrib4fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib4fv(index, v);} - GLEEPFNGLVERTEXATTRIB4FVPROC GLeeFuncPtr_glVertexAttrib4fv=GLee_Lazy_glVertexAttrib4fv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4iv -#define GLEE_C_DEFINED_glVertexAttrib4iv - void __stdcall GLee_Lazy_glVertexAttrib4iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4iv(index, v);} - GLEEPFNGLVERTEXATTRIB4IVPROC GLeeFuncPtr_glVertexAttrib4iv=GLee_Lazy_glVertexAttrib4iv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4s -#define GLEE_C_DEFINED_glVertexAttrib4s - void __stdcall GLee_Lazy_glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexAttrib4s(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4SPROC GLeeFuncPtr_glVertexAttrib4s=GLee_Lazy_glVertexAttrib4s; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4sv -#define GLEE_C_DEFINED_glVertexAttrib4sv - void __stdcall GLee_Lazy_glVertexAttrib4sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4sv(index, v);} - GLEEPFNGLVERTEXATTRIB4SVPROC GLeeFuncPtr_glVertexAttrib4sv=GLee_Lazy_glVertexAttrib4sv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4ubv -#define GLEE_C_DEFINED_glVertexAttrib4ubv - void __stdcall GLee_Lazy_glVertexAttrib4ubv(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4ubv(index, v);} - GLEEPFNGLVERTEXATTRIB4UBVPROC GLeeFuncPtr_glVertexAttrib4ubv=GLee_Lazy_glVertexAttrib4ubv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4uiv -#define GLEE_C_DEFINED_glVertexAttrib4uiv - void __stdcall GLee_Lazy_glVertexAttrib4uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4uiv(index, v);} - GLEEPFNGLVERTEXATTRIB4UIVPROC GLeeFuncPtr_glVertexAttrib4uiv=GLee_Lazy_glVertexAttrib4uiv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4usv -#define GLEE_C_DEFINED_glVertexAttrib4usv - void __stdcall GLee_Lazy_glVertexAttrib4usv(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4usv(index, v);} - GLEEPFNGLVERTEXATTRIB4USVPROC GLeeFuncPtr_glVertexAttrib4usv=GLee_Lazy_glVertexAttrib4usv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribPointer -#define GLEE_C_DEFINED_glVertexAttribPointer - void __stdcall GLee_Lazy_glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribPointer(index, size, type, normalized, stride, pointer);} - GLEEPFNGLVERTEXATTRIBPOINTERPROC GLeeFuncPtr_glVertexAttribPointer=GLee_Lazy_glVertexAttribPointer; -#endif -#endif - -/* GL_VERSION_2_1 */ - -#ifdef __GLEE_GL_VERSION_2_1 -#ifndef GLEE_C_DEFINED_glUniformMatrix2x3fv -#define GLEE_C_DEFINED_glUniformMatrix2x3fv - void __stdcall GLee_Lazy_glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2x3fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX2X3FVPROC GLeeFuncPtr_glUniformMatrix2x3fv=GLee_Lazy_glUniformMatrix2x3fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix3x2fv -#define GLEE_C_DEFINED_glUniformMatrix3x2fv - void __stdcall GLee_Lazy_glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3x2fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX3X2FVPROC GLeeFuncPtr_glUniformMatrix3x2fv=GLee_Lazy_glUniformMatrix3x2fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix2x4fv -#define GLEE_C_DEFINED_glUniformMatrix2x4fv - void __stdcall GLee_Lazy_glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2x4fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX2X4FVPROC GLeeFuncPtr_glUniformMatrix2x4fv=GLee_Lazy_glUniformMatrix2x4fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix4x2fv -#define GLEE_C_DEFINED_glUniformMatrix4x2fv - void __stdcall GLee_Lazy_glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4x2fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX4X2FVPROC GLeeFuncPtr_glUniformMatrix4x2fv=GLee_Lazy_glUniformMatrix4x2fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix3x4fv -#define GLEE_C_DEFINED_glUniformMatrix3x4fv - void __stdcall GLee_Lazy_glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3x4fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX3X4FVPROC GLeeFuncPtr_glUniformMatrix3x4fv=GLee_Lazy_glUniformMatrix3x4fv; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix4x3fv -#define GLEE_C_DEFINED_glUniformMatrix4x3fv - void __stdcall GLee_Lazy_glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4x3fv(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX4X3FVPROC GLeeFuncPtr_glUniformMatrix4x3fv=GLee_Lazy_glUniformMatrix4x3fv; -#endif -#endif - -/* GL_VERSION_3_0 */ - -#ifdef __GLEE_GL_VERSION_3_0 -#ifndef GLEE_C_DEFINED_glColorMaski -#define GLEE_C_DEFINED_glColorMaski - void __stdcall GLee_Lazy_glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) {if (GLeeInit()) glColorMaski(index, r, g, b, a);} - GLEEPFNGLCOLORMASKIPROC GLeeFuncPtr_glColorMaski=GLee_Lazy_glColorMaski; -#endif -#ifndef GLEE_C_DEFINED_glGetBooleani_v -#define GLEE_C_DEFINED_glGetBooleani_v - void __stdcall GLee_Lazy_glGetBooleani_v(GLenum target, GLuint index, GLboolean * data) {if (GLeeInit()) glGetBooleani_v(target, index, data);} - GLEEPFNGLGETBOOLEANI_VPROC GLeeFuncPtr_glGetBooleani_v=GLee_Lazy_glGetBooleani_v; -#endif -#ifndef GLEE_C_DEFINED_glGetIntegeri_v -#define GLEE_C_DEFINED_glGetIntegeri_v - void __stdcall GLee_Lazy_glGetIntegeri_v(GLenum target, GLuint index, GLint * data) {if (GLeeInit()) glGetIntegeri_v(target, index, data);} - GLEEPFNGLGETINTEGERI_VPROC GLeeFuncPtr_glGetIntegeri_v=GLee_Lazy_glGetIntegeri_v; -#endif -#ifndef GLEE_C_DEFINED_glEnablei -#define GLEE_C_DEFINED_glEnablei - void __stdcall GLee_Lazy_glEnablei(GLenum target, GLuint index) {if (GLeeInit()) glEnablei(target, index);} - GLEEPFNGLENABLEIPROC GLeeFuncPtr_glEnablei=GLee_Lazy_glEnablei; -#endif -#ifndef GLEE_C_DEFINED_glDisablei -#define GLEE_C_DEFINED_glDisablei - void __stdcall GLee_Lazy_glDisablei(GLenum target, GLuint index) {if (GLeeInit()) glDisablei(target, index);} - GLEEPFNGLDISABLEIPROC GLeeFuncPtr_glDisablei=GLee_Lazy_glDisablei; -#endif -#ifndef GLEE_C_DEFINED_glIsEnabledi -#define GLEE_C_DEFINED_glIsEnabledi - GLboolean __stdcall GLee_Lazy_glIsEnabledi(GLenum target, GLuint index) {if (GLeeInit()) return glIsEnabledi(target, index); return (GLboolean)0;} - GLEEPFNGLISENABLEDIPROC GLeeFuncPtr_glIsEnabledi=GLee_Lazy_glIsEnabledi; -#endif -#ifndef GLEE_C_DEFINED_glBeginTransformFeedback -#define GLEE_C_DEFINED_glBeginTransformFeedback - void __stdcall GLee_Lazy_glBeginTransformFeedback(GLenum primitiveMode) {if (GLeeInit()) glBeginTransformFeedback(primitiveMode);} - GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC GLeeFuncPtr_glBeginTransformFeedback=GLee_Lazy_glBeginTransformFeedback; -#endif -#ifndef GLEE_C_DEFINED_glEndTransformFeedback -#define GLEE_C_DEFINED_glEndTransformFeedback - void __stdcall GLee_Lazy_glEndTransformFeedback(void) {if (GLeeInit()) glEndTransformFeedback();} - GLEEPFNGLENDTRANSFORMFEEDBACKPROC GLeeFuncPtr_glEndTransformFeedback=GLee_Lazy_glEndTransformFeedback; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferRange -#define GLEE_C_DEFINED_glBindBufferRange - void __stdcall GLee_Lazy_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glBindBufferRange(target, index, buffer, offset, size);} - GLEEPFNGLBINDBUFFERRANGEPROC GLeeFuncPtr_glBindBufferRange=GLee_Lazy_glBindBufferRange; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferBase -#define GLEE_C_DEFINED_glBindBufferBase - void __stdcall GLee_Lazy_glBindBufferBase(GLenum target, GLuint index, GLuint buffer) {if (GLeeInit()) glBindBufferBase(target, index, buffer);} - GLEEPFNGLBINDBUFFERBASEPROC GLeeFuncPtr_glBindBufferBase=GLee_Lazy_glBindBufferBase; -#endif -#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryings -#define GLEE_C_DEFINED_glTransformFeedbackVaryings - void __stdcall GLee_Lazy_glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackVaryings(program, count, locations, bufferMode);} - GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC GLeeFuncPtr_glTransformFeedbackVaryings=GLee_Lazy_glTransformFeedbackVaryings; -#endif -#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVarying -#define GLEE_C_DEFINED_glGetTransformFeedbackVarying - void __stdcall GLee_Lazy_glGetTransformFeedbackVarying(GLuint program, GLuint index, GLint * location) {if (GLeeInit()) glGetTransformFeedbackVarying(program, index, location);} - GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC GLeeFuncPtr_glGetTransformFeedbackVarying=GLee_Lazy_glGetTransformFeedbackVarying; -#endif -#ifndef GLEE_C_DEFINED_glClampColor -#define GLEE_C_DEFINED_glClampColor - void __stdcall GLee_Lazy_glClampColor(GLenum target, GLenum clamp) {if (GLeeInit()) glClampColor(target, clamp);} - GLEEPFNGLCLAMPCOLORPROC GLeeFuncPtr_glClampColor=GLee_Lazy_glClampColor; -#endif -#ifndef GLEE_C_DEFINED_glBeginConditionalRender -#define GLEE_C_DEFINED_glBeginConditionalRender - void __stdcall GLee_Lazy_glBeginConditionalRender(GLuint id, GLenum mode) {if (GLeeInit()) glBeginConditionalRender(id, mode);} - GLEEPFNGLBEGINCONDITIONALRENDERPROC GLeeFuncPtr_glBeginConditionalRender=GLee_Lazy_glBeginConditionalRender; -#endif -#ifndef GLEE_C_DEFINED_glEndConditionalRender -#define GLEE_C_DEFINED_glEndConditionalRender - void __stdcall GLee_Lazy_glEndConditionalRender(void) {if (GLeeInit()) glEndConditionalRender();} - GLEEPFNGLENDCONDITIONALRENDERPROC GLeeFuncPtr_glEndConditionalRender=GLee_Lazy_glEndConditionalRender; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1i -#define GLEE_C_DEFINED_glVertexAttribI1i - void __stdcall GLee_Lazy_glVertexAttribI1i(GLuint index, GLint x) {if (GLeeInit()) glVertexAttribI1i(index, x);} - GLEEPFNGLVERTEXATTRIBI1IPROC GLeeFuncPtr_glVertexAttribI1i=GLee_Lazy_glVertexAttribI1i; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2i -#define GLEE_C_DEFINED_glVertexAttribI2i - void __stdcall GLee_Lazy_glVertexAttribI2i(GLuint index, GLint x, GLint y) {if (GLeeInit()) glVertexAttribI2i(index, x, y);} - GLEEPFNGLVERTEXATTRIBI2IPROC GLeeFuncPtr_glVertexAttribI2i=GLee_Lazy_glVertexAttribI2i; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3i -#define GLEE_C_DEFINED_glVertexAttribI3i - void __stdcall GLee_Lazy_glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z) {if (GLeeInit()) glVertexAttribI3i(index, x, y, z);} - GLEEPFNGLVERTEXATTRIBI3IPROC GLeeFuncPtr_glVertexAttribI3i=GLee_Lazy_glVertexAttribI3i; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4i -#define GLEE_C_DEFINED_glVertexAttribI4i - void __stdcall GLee_Lazy_glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glVertexAttribI4i(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIBI4IPROC GLeeFuncPtr_glVertexAttribI4i=GLee_Lazy_glVertexAttribI4i; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1ui -#define GLEE_C_DEFINED_glVertexAttribI1ui - void __stdcall GLee_Lazy_glVertexAttribI1ui(GLuint index, GLuint x) {if (GLeeInit()) glVertexAttribI1ui(index, x);} - GLEEPFNGLVERTEXATTRIBI1UIPROC GLeeFuncPtr_glVertexAttribI1ui=GLee_Lazy_glVertexAttribI1ui; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2ui -#define GLEE_C_DEFINED_glVertexAttribI2ui - void __stdcall GLee_Lazy_glVertexAttribI2ui(GLuint index, GLuint x, GLuint y) {if (GLeeInit()) glVertexAttribI2ui(index, x, y);} - GLEEPFNGLVERTEXATTRIBI2UIPROC GLeeFuncPtr_glVertexAttribI2ui=GLee_Lazy_glVertexAttribI2ui; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3ui -#define GLEE_C_DEFINED_glVertexAttribI3ui - void __stdcall GLee_Lazy_glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z) {if (GLeeInit()) glVertexAttribI3ui(index, x, y, z);} - GLEEPFNGLVERTEXATTRIBI3UIPROC GLeeFuncPtr_glVertexAttribI3ui=GLee_Lazy_glVertexAttribI3ui; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4ui -#define GLEE_C_DEFINED_glVertexAttribI4ui - void __stdcall GLee_Lazy_glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glVertexAttribI4ui(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIBI4UIPROC GLeeFuncPtr_glVertexAttribI4ui=GLee_Lazy_glVertexAttribI4ui; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1iv -#define GLEE_C_DEFINED_glVertexAttribI1iv - void __stdcall GLee_Lazy_glVertexAttribI1iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI1iv(index, v);} - GLEEPFNGLVERTEXATTRIBI1IVPROC GLeeFuncPtr_glVertexAttribI1iv=GLee_Lazy_glVertexAttribI1iv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2iv -#define GLEE_C_DEFINED_glVertexAttribI2iv - void __stdcall GLee_Lazy_glVertexAttribI2iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI2iv(index, v);} - GLEEPFNGLVERTEXATTRIBI2IVPROC GLeeFuncPtr_glVertexAttribI2iv=GLee_Lazy_glVertexAttribI2iv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3iv -#define GLEE_C_DEFINED_glVertexAttribI3iv - void __stdcall GLee_Lazy_glVertexAttribI3iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI3iv(index, v);} - GLEEPFNGLVERTEXATTRIBI3IVPROC GLeeFuncPtr_glVertexAttribI3iv=GLee_Lazy_glVertexAttribI3iv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4iv -#define GLEE_C_DEFINED_glVertexAttribI4iv - void __stdcall GLee_Lazy_glVertexAttribI4iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI4iv(index, v);} - GLEEPFNGLVERTEXATTRIBI4IVPROC GLeeFuncPtr_glVertexAttribI4iv=GLee_Lazy_glVertexAttribI4iv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1uiv -#define GLEE_C_DEFINED_glVertexAttribI1uiv - void __stdcall GLee_Lazy_glVertexAttribI1uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI1uiv(index, v);} - GLEEPFNGLVERTEXATTRIBI1UIVPROC GLeeFuncPtr_glVertexAttribI1uiv=GLee_Lazy_glVertexAttribI1uiv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2uiv -#define GLEE_C_DEFINED_glVertexAttribI2uiv - void __stdcall GLee_Lazy_glVertexAttribI2uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI2uiv(index, v);} - GLEEPFNGLVERTEXATTRIBI2UIVPROC GLeeFuncPtr_glVertexAttribI2uiv=GLee_Lazy_glVertexAttribI2uiv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3uiv -#define GLEE_C_DEFINED_glVertexAttribI3uiv - void __stdcall GLee_Lazy_glVertexAttribI3uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI3uiv(index, v);} - GLEEPFNGLVERTEXATTRIBI3UIVPROC GLeeFuncPtr_glVertexAttribI3uiv=GLee_Lazy_glVertexAttribI3uiv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4uiv -#define GLEE_C_DEFINED_glVertexAttribI4uiv - void __stdcall GLee_Lazy_glVertexAttribI4uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI4uiv(index, v);} - GLEEPFNGLVERTEXATTRIBI4UIVPROC GLeeFuncPtr_glVertexAttribI4uiv=GLee_Lazy_glVertexAttribI4uiv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4bv -#define GLEE_C_DEFINED_glVertexAttribI4bv - void __stdcall GLee_Lazy_glVertexAttribI4bv(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttribI4bv(index, v);} - GLEEPFNGLVERTEXATTRIBI4BVPROC GLeeFuncPtr_glVertexAttribI4bv=GLee_Lazy_glVertexAttribI4bv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4sv -#define GLEE_C_DEFINED_glVertexAttribI4sv - void __stdcall GLee_Lazy_glVertexAttribI4sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttribI4sv(index, v);} - GLEEPFNGLVERTEXATTRIBI4SVPROC GLeeFuncPtr_glVertexAttribI4sv=GLee_Lazy_glVertexAttribI4sv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4ubv -#define GLEE_C_DEFINED_glVertexAttribI4ubv - void __stdcall GLee_Lazy_glVertexAttribI4ubv(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttribI4ubv(index, v);} - GLEEPFNGLVERTEXATTRIBI4UBVPROC GLeeFuncPtr_glVertexAttribI4ubv=GLee_Lazy_glVertexAttribI4ubv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4usv -#define GLEE_C_DEFINED_glVertexAttribI4usv - void __stdcall GLee_Lazy_glVertexAttribI4usv(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttribI4usv(index, v);} - GLEEPFNGLVERTEXATTRIBI4USVPROC GLeeFuncPtr_glVertexAttribI4usv=GLee_Lazy_glVertexAttribI4usv; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribIPointer -#define GLEE_C_DEFINED_glVertexAttribIPointer - void __stdcall GLee_Lazy_glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribIPointer(index, size, type, stride, pointer);} - GLEEPFNGLVERTEXATTRIBIPOINTERPROC GLeeFuncPtr_glVertexAttribIPointer=GLee_Lazy_glVertexAttribIPointer; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribIiv -#define GLEE_C_DEFINED_glGetVertexAttribIiv - void __stdcall GLee_Lazy_glGetVertexAttribIiv(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribIiv(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIIVPROC GLeeFuncPtr_glGetVertexAttribIiv=GLee_Lazy_glGetVertexAttribIiv; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribIuiv -#define GLEE_C_DEFINED_glGetVertexAttribIuiv - void __stdcall GLee_Lazy_glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint * params) {if (GLeeInit()) glGetVertexAttribIuiv(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIUIVPROC GLeeFuncPtr_glGetVertexAttribIuiv=GLee_Lazy_glGetVertexAttribIuiv; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformuiv -#define GLEE_C_DEFINED_glGetUniformuiv - void __stdcall GLee_Lazy_glGetUniformuiv(GLuint program, GLint location, GLuint * params) {if (GLeeInit()) glGetUniformuiv(program, location, params);} - GLEEPFNGLGETUNIFORMUIVPROC GLeeFuncPtr_glGetUniformuiv=GLee_Lazy_glGetUniformuiv; -#endif -#ifndef GLEE_C_DEFINED_glBindFragDataLocation -#define GLEE_C_DEFINED_glBindFragDataLocation - void __stdcall GLee_Lazy_glBindFragDataLocation(GLuint program, GLuint color, const GLchar * name) {if (GLeeInit()) glBindFragDataLocation(program, color, name);} - GLEEPFNGLBINDFRAGDATALOCATIONPROC GLeeFuncPtr_glBindFragDataLocation=GLee_Lazy_glBindFragDataLocation; -#endif -#ifndef GLEE_C_DEFINED_glGetFragDataLocation -#define GLEE_C_DEFINED_glGetFragDataLocation - GLint __stdcall GLee_Lazy_glGetFragDataLocation(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetFragDataLocation(program, name); return (GLint)0;} - GLEEPFNGLGETFRAGDATALOCATIONPROC GLeeFuncPtr_glGetFragDataLocation=GLee_Lazy_glGetFragDataLocation; -#endif -#ifndef GLEE_C_DEFINED_glUniform1ui -#define GLEE_C_DEFINED_glUniform1ui - void __stdcall GLee_Lazy_glUniform1ui(GLint location, GLuint v0) {if (GLeeInit()) glUniform1ui(location, v0);} - GLEEPFNGLUNIFORM1UIPROC GLeeFuncPtr_glUniform1ui=GLee_Lazy_glUniform1ui; -#endif -#ifndef GLEE_C_DEFINED_glUniform2ui -#define GLEE_C_DEFINED_glUniform2ui - void __stdcall GLee_Lazy_glUniform2ui(GLint location, GLuint v0, GLuint v1) {if (GLeeInit()) glUniform2ui(location, v0, v1);} - GLEEPFNGLUNIFORM2UIPROC GLeeFuncPtr_glUniform2ui=GLee_Lazy_glUniform2ui; -#endif -#ifndef GLEE_C_DEFINED_glUniform3ui -#define GLEE_C_DEFINED_glUniform3ui - void __stdcall GLee_Lazy_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) {if (GLeeInit()) glUniform3ui(location, v0, v1, v2);} - GLEEPFNGLUNIFORM3UIPROC GLeeFuncPtr_glUniform3ui=GLee_Lazy_glUniform3ui; -#endif -#ifndef GLEE_C_DEFINED_glUniform4ui -#define GLEE_C_DEFINED_glUniform4ui - void __stdcall GLee_Lazy_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {if (GLeeInit()) glUniform4ui(location, v0, v1, v2, v3);} - GLEEPFNGLUNIFORM4UIPROC GLeeFuncPtr_glUniform4ui=GLee_Lazy_glUniform4ui; -#endif -#ifndef GLEE_C_DEFINED_glUniform1uiv -#define GLEE_C_DEFINED_glUniform1uiv - void __stdcall GLee_Lazy_glUniform1uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform1uiv(location, count, value);} - GLEEPFNGLUNIFORM1UIVPROC GLeeFuncPtr_glUniform1uiv=GLee_Lazy_glUniform1uiv; -#endif -#ifndef GLEE_C_DEFINED_glUniform2uiv -#define GLEE_C_DEFINED_glUniform2uiv - void __stdcall GLee_Lazy_glUniform2uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform2uiv(location, count, value);} - GLEEPFNGLUNIFORM2UIVPROC GLeeFuncPtr_glUniform2uiv=GLee_Lazy_glUniform2uiv; -#endif -#ifndef GLEE_C_DEFINED_glUniform3uiv -#define GLEE_C_DEFINED_glUniform3uiv - void __stdcall GLee_Lazy_glUniform3uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform3uiv(location, count, value);} - GLEEPFNGLUNIFORM3UIVPROC GLeeFuncPtr_glUniform3uiv=GLee_Lazy_glUniform3uiv; -#endif -#ifndef GLEE_C_DEFINED_glUniform4uiv -#define GLEE_C_DEFINED_glUniform4uiv - void __stdcall GLee_Lazy_glUniform4uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform4uiv(location, count, value);} - GLEEPFNGLUNIFORM4UIVPROC GLeeFuncPtr_glUniform4uiv=GLee_Lazy_glUniform4uiv; -#endif -#ifndef GLEE_C_DEFINED_glTexParameterIiv -#define GLEE_C_DEFINED_glTexParameterIiv - void __stdcall GLee_Lazy_glTexParameterIiv(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTexParameterIiv(target, pname, params);} - GLEEPFNGLTEXPARAMETERIIVPROC GLeeFuncPtr_glTexParameterIiv=GLee_Lazy_glTexParameterIiv; -#endif -#ifndef GLEE_C_DEFINED_glTexParameterIuiv -#define GLEE_C_DEFINED_glTexParameterIuiv - void __stdcall GLee_Lazy_glTexParameterIuiv(GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glTexParameterIuiv(target, pname, params);} - GLEEPFNGLTEXPARAMETERIUIVPROC GLeeFuncPtr_glTexParameterIuiv=GLee_Lazy_glTexParameterIuiv; -#endif -#ifndef GLEE_C_DEFINED_glGetTexParameterIiv -#define GLEE_C_DEFINED_glGetTexParameterIiv - void __stdcall GLee_Lazy_glGetTexParameterIiv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTexParameterIiv(target, pname, params);} - GLEEPFNGLGETTEXPARAMETERIIVPROC GLeeFuncPtr_glGetTexParameterIiv=GLee_Lazy_glGetTexParameterIiv; -#endif -#ifndef GLEE_C_DEFINED_glGetTexParameterIuiv -#define GLEE_C_DEFINED_glGetTexParameterIuiv - void __stdcall GLee_Lazy_glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetTexParameterIuiv(target, pname, params);} - GLEEPFNGLGETTEXPARAMETERIUIVPROC GLeeFuncPtr_glGetTexParameterIuiv=GLee_Lazy_glGetTexParameterIuiv; -#endif -#ifndef GLEE_C_DEFINED_glClearBufferiv -#define GLEE_C_DEFINED_glClearBufferiv - void __stdcall GLee_Lazy_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint * value) {if (GLeeInit()) glClearBufferiv(buffer, drawbuffer, value);} - GLEEPFNGLCLEARBUFFERIVPROC GLeeFuncPtr_glClearBufferiv=GLee_Lazy_glClearBufferiv; -#endif -#ifndef GLEE_C_DEFINED_glClearBufferuiv -#define GLEE_C_DEFINED_glClearBufferuiv - void __stdcall GLee_Lazy_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint * value) {if (GLeeInit()) glClearBufferuiv(buffer, drawbuffer, value);} - GLEEPFNGLCLEARBUFFERUIVPROC GLeeFuncPtr_glClearBufferuiv=GLee_Lazy_glClearBufferuiv; -#endif -#ifndef GLEE_C_DEFINED_glClearBufferfv -#define GLEE_C_DEFINED_glClearBufferfv - void __stdcall GLee_Lazy_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat * value) {if (GLeeInit()) glClearBufferfv(buffer, drawbuffer, value);} - GLEEPFNGLCLEARBUFFERFVPROC GLeeFuncPtr_glClearBufferfv=GLee_Lazy_glClearBufferfv; -#endif -#ifndef GLEE_C_DEFINED_glClearBufferfi -#define GLEE_C_DEFINED_glClearBufferfi - void __stdcall GLee_Lazy_glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) {if (GLeeInit()) glClearBufferfi(buffer, drawbuffer, depth, stencil);} - GLEEPFNGLCLEARBUFFERFIPROC GLeeFuncPtr_glClearBufferfi=GLee_Lazy_glClearBufferfi; -#endif -#ifndef GLEE_C_DEFINED_glGetStringi -#define GLEE_C_DEFINED_glGetStringi - const GLubyte * __stdcall GLee_Lazy_glGetStringi(GLenum name, GLuint index) {if (GLeeInit()) return glGetStringi(name, index); return (const GLubyte *)0;} - GLEEPFNGLGETSTRINGIPROC GLeeFuncPtr_glGetStringi=GLee_Lazy_glGetStringi; -#endif -#endif - -/* GL_ARB_multitexture */ - -#ifdef __GLEE_GL_ARB_multitexture -#ifndef GLEE_C_DEFINED_glActiveTextureARB -#define GLEE_C_DEFINED_glActiveTextureARB - void __stdcall GLee_Lazy_glActiveTextureARB(GLenum texture) {if (GLeeInit()) glActiveTextureARB(texture);} - GLEEPFNGLACTIVETEXTUREARBPROC GLeeFuncPtr_glActiveTextureARB=GLee_Lazy_glActiveTextureARB; -#endif -#ifndef GLEE_C_DEFINED_glClientActiveTextureARB -#define GLEE_C_DEFINED_glClientActiveTextureARB - void __stdcall GLee_Lazy_glClientActiveTextureARB(GLenum texture) {if (GLeeInit()) glClientActiveTextureARB(texture);} - GLEEPFNGLCLIENTACTIVETEXTUREARBPROC GLeeFuncPtr_glClientActiveTextureARB=GLee_Lazy_glClientActiveTextureARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1dARB -#define GLEE_C_DEFINED_glMultiTexCoord1dARB - void __stdcall GLee_Lazy_glMultiTexCoord1dARB(GLenum target, GLdouble s) {if (GLeeInit()) glMultiTexCoord1dARB(target, s);} - GLEEPFNGLMULTITEXCOORD1DARBPROC GLeeFuncPtr_glMultiTexCoord1dARB=GLee_Lazy_glMultiTexCoord1dARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1dvARB -#define GLEE_C_DEFINED_glMultiTexCoord1dvARB - void __stdcall GLee_Lazy_glMultiTexCoord1dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord1dvARB(target, v);} - GLEEPFNGLMULTITEXCOORD1DVARBPROC GLeeFuncPtr_glMultiTexCoord1dvARB=GLee_Lazy_glMultiTexCoord1dvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1fARB -#define GLEE_C_DEFINED_glMultiTexCoord1fARB - void __stdcall GLee_Lazy_glMultiTexCoord1fARB(GLenum target, GLfloat s) {if (GLeeInit()) glMultiTexCoord1fARB(target, s);} - GLEEPFNGLMULTITEXCOORD1FARBPROC GLeeFuncPtr_glMultiTexCoord1fARB=GLee_Lazy_glMultiTexCoord1fARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1fvARB -#define GLEE_C_DEFINED_glMultiTexCoord1fvARB - void __stdcall GLee_Lazy_glMultiTexCoord1fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord1fvARB(target, v);} - GLEEPFNGLMULTITEXCOORD1FVARBPROC GLeeFuncPtr_glMultiTexCoord1fvARB=GLee_Lazy_glMultiTexCoord1fvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1iARB -#define GLEE_C_DEFINED_glMultiTexCoord1iARB - void __stdcall GLee_Lazy_glMultiTexCoord1iARB(GLenum target, GLint s) {if (GLeeInit()) glMultiTexCoord1iARB(target, s);} - GLEEPFNGLMULTITEXCOORD1IARBPROC GLeeFuncPtr_glMultiTexCoord1iARB=GLee_Lazy_glMultiTexCoord1iARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1ivARB -#define GLEE_C_DEFINED_glMultiTexCoord1ivARB - void __stdcall GLee_Lazy_glMultiTexCoord1ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord1ivARB(target, v);} - GLEEPFNGLMULTITEXCOORD1IVARBPROC GLeeFuncPtr_glMultiTexCoord1ivARB=GLee_Lazy_glMultiTexCoord1ivARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1sARB -#define GLEE_C_DEFINED_glMultiTexCoord1sARB - void __stdcall GLee_Lazy_glMultiTexCoord1sARB(GLenum target, GLshort s) {if (GLeeInit()) glMultiTexCoord1sARB(target, s);} - GLEEPFNGLMULTITEXCOORD1SARBPROC GLeeFuncPtr_glMultiTexCoord1sARB=GLee_Lazy_glMultiTexCoord1sARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1svARB -#define GLEE_C_DEFINED_glMultiTexCoord1svARB - void __stdcall GLee_Lazy_glMultiTexCoord1svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord1svARB(target, v);} - GLEEPFNGLMULTITEXCOORD1SVARBPROC GLeeFuncPtr_glMultiTexCoord1svARB=GLee_Lazy_glMultiTexCoord1svARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2dARB -#define GLEE_C_DEFINED_glMultiTexCoord2dARB - void __stdcall GLee_Lazy_glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t) {if (GLeeInit()) glMultiTexCoord2dARB(target, s, t);} - GLEEPFNGLMULTITEXCOORD2DARBPROC GLeeFuncPtr_glMultiTexCoord2dARB=GLee_Lazy_glMultiTexCoord2dARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2dvARB -#define GLEE_C_DEFINED_glMultiTexCoord2dvARB - void __stdcall GLee_Lazy_glMultiTexCoord2dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord2dvARB(target, v);} - GLEEPFNGLMULTITEXCOORD2DVARBPROC GLeeFuncPtr_glMultiTexCoord2dvARB=GLee_Lazy_glMultiTexCoord2dvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2fARB -#define GLEE_C_DEFINED_glMultiTexCoord2fARB - void __stdcall GLee_Lazy_glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) {if (GLeeInit()) glMultiTexCoord2fARB(target, s, t);} - GLEEPFNGLMULTITEXCOORD2FARBPROC GLeeFuncPtr_glMultiTexCoord2fARB=GLee_Lazy_glMultiTexCoord2fARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2fvARB -#define GLEE_C_DEFINED_glMultiTexCoord2fvARB - void __stdcall GLee_Lazy_glMultiTexCoord2fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord2fvARB(target, v);} - GLEEPFNGLMULTITEXCOORD2FVARBPROC GLeeFuncPtr_glMultiTexCoord2fvARB=GLee_Lazy_glMultiTexCoord2fvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2iARB -#define GLEE_C_DEFINED_glMultiTexCoord2iARB - void __stdcall GLee_Lazy_glMultiTexCoord2iARB(GLenum target, GLint s, GLint t) {if (GLeeInit()) glMultiTexCoord2iARB(target, s, t);} - GLEEPFNGLMULTITEXCOORD2IARBPROC GLeeFuncPtr_glMultiTexCoord2iARB=GLee_Lazy_glMultiTexCoord2iARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2ivARB -#define GLEE_C_DEFINED_glMultiTexCoord2ivARB - void __stdcall GLee_Lazy_glMultiTexCoord2ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord2ivARB(target, v);} - GLEEPFNGLMULTITEXCOORD2IVARBPROC GLeeFuncPtr_glMultiTexCoord2ivARB=GLee_Lazy_glMultiTexCoord2ivARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2sARB -#define GLEE_C_DEFINED_glMultiTexCoord2sARB - void __stdcall GLee_Lazy_glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t) {if (GLeeInit()) glMultiTexCoord2sARB(target, s, t);} - GLEEPFNGLMULTITEXCOORD2SARBPROC GLeeFuncPtr_glMultiTexCoord2sARB=GLee_Lazy_glMultiTexCoord2sARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2svARB -#define GLEE_C_DEFINED_glMultiTexCoord2svARB - void __stdcall GLee_Lazy_glMultiTexCoord2svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord2svARB(target, v);} - GLEEPFNGLMULTITEXCOORD2SVARBPROC GLeeFuncPtr_glMultiTexCoord2svARB=GLee_Lazy_glMultiTexCoord2svARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3dARB -#define GLEE_C_DEFINED_glMultiTexCoord3dARB - void __stdcall GLee_Lazy_glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r) {if (GLeeInit()) glMultiTexCoord3dARB(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3DARBPROC GLeeFuncPtr_glMultiTexCoord3dARB=GLee_Lazy_glMultiTexCoord3dARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3dvARB -#define GLEE_C_DEFINED_glMultiTexCoord3dvARB - void __stdcall GLee_Lazy_glMultiTexCoord3dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord3dvARB(target, v);} - GLEEPFNGLMULTITEXCOORD3DVARBPROC GLeeFuncPtr_glMultiTexCoord3dvARB=GLee_Lazy_glMultiTexCoord3dvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3fARB -#define GLEE_C_DEFINED_glMultiTexCoord3fARB - void __stdcall GLee_Lazy_glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r) {if (GLeeInit()) glMultiTexCoord3fARB(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3FARBPROC GLeeFuncPtr_glMultiTexCoord3fARB=GLee_Lazy_glMultiTexCoord3fARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3fvARB -#define GLEE_C_DEFINED_glMultiTexCoord3fvARB - void __stdcall GLee_Lazy_glMultiTexCoord3fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord3fvARB(target, v);} - GLEEPFNGLMULTITEXCOORD3FVARBPROC GLeeFuncPtr_glMultiTexCoord3fvARB=GLee_Lazy_glMultiTexCoord3fvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3iARB -#define GLEE_C_DEFINED_glMultiTexCoord3iARB - void __stdcall GLee_Lazy_glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r) {if (GLeeInit()) glMultiTexCoord3iARB(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3IARBPROC GLeeFuncPtr_glMultiTexCoord3iARB=GLee_Lazy_glMultiTexCoord3iARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3ivARB -#define GLEE_C_DEFINED_glMultiTexCoord3ivARB - void __stdcall GLee_Lazy_glMultiTexCoord3ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord3ivARB(target, v);} - GLEEPFNGLMULTITEXCOORD3IVARBPROC GLeeFuncPtr_glMultiTexCoord3ivARB=GLee_Lazy_glMultiTexCoord3ivARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3sARB -#define GLEE_C_DEFINED_glMultiTexCoord3sARB - void __stdcall GLee_Lazy_glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r) {if (GLeeInit()) glMultiTexCoord3sARB(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3SARBPROC GLeeFuncPtr_glMultiTexCoord3sARB=GLee_Lazy_glMultiTexCoord3sARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3svARB -#define GLEE_C_DEFINED_glMultiTexCoord3svARB - void __stdcall GLee_Lazy_glMultiTexCoord3svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord3svARB(target, v);} - GLEEPFNGLMULTITEXCOORD3SVARBPROC GLeeFuncPtr_glMultiTexCoord3svARB=GLee_Lazy_glMultiTexCoord3svARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4dARB -#define GLEE_C_DEFINED_glMultiTexCoord4dARB - void __stdcall GLee_Lazy_glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) {if (GLeeInit()) glMultiTexCoord4dARB(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4DARBPROC GLeeFuncPtr_glMultiTexCoord4dARB=GLee_Lazy_glMultiTexCoord4dARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4dvARB -#define GLEE_C_DEFINED_glMultiTexCoord4dvARB - void __stdcall GLee_Lazy_glMultiTexCoord4dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord4dvARB(target, v);} - GLEEPFNGLMULTITEXCOORD4DVARBPROC GLeeFuncPtr_glMultiTexCoord4dvARB=GLee_Lazy_glMultiTexCoord4dvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4fARB -#define GLEE_C_DEFINED_glMultiTexCoord4fARB - void __stdcall GLee_Lazy_glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {if (GLeeInit()) glMultiTexCoord4fARB(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4FARBPROC GLeeFuncPtr_glMultiTexCoord4fARB=GLee_Lazy_glMultiTexCoord4fARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4fvARB -#define GLEE_C_DEFINED_glMultiTexCoord4fvARB - void __stdcall GLee_Lazy_glMultiTexCoord4fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord4fvARB(target, v);} - GLEEPFNGLMULTITEXCOORD4FVARBPROC GLeeFuncPtr_glMultiTexCoord4fvARB=GLee_Lazy_glMultiTexCoord4fvARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4iARB -#define GLEE_C_DEFINED_glMultiTexCoord4iARB - void __stdcall GLee_Lazy_glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q) {if (GLeeInit()) glMultiTexCoord4iARB(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4IARBPROC GLeeFuncPtr_glMultiTexCoord4iARB=GLee_Lazy_glMultiTexCoord4iARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4ivARB -#define GLEE_C_DEFINED_glMultiTexCoord4ivARB - void __stdcall GLee_Lazy_glMultiTexCoord4ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord4ivARB(target, v);} - GLEEPFNGLMULTITEXCOORD4IVARBPROC GLeeFuncPtr_glMultiTexCoord4ivARB=GLee_Lazy_glMultiTexCoord4ivARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4sARB -#define GLEE_C_DEFINED_glMultiTexCoord4sARB - void __stdcall GLee_Lazy_glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) {if (GLeeInit()) glMultiTexCoord4sARB(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4SARBPROC GLeeFuncPtr_glMultiTexCoord4sARB=GLee_Lazy_glMultiTexCoord4sARB; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4svARB -#define GLEE_C_DEFINED_glMultiTexCoord4svARB - void __stdcall GLee_Lazy_glMultiTexCoord4svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord4svARB(target, v);} - GLEEPFNGLMULTITEXCOORD4SVARBPROC GLeeFuncPtr_glMultiTexCoord4svARB=GLee_Lazy_glMultiTexCoord4svARB; -#endif -#endif - -/* GL_ARB_transpose_matrix */ - -#ifdef __GLEE_GL_ARB_transpose_matrix -#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixfARB -#define GLEE_C_DEFINED_glLoadTransposeMatrixfARB - void __stdcall GLee_Lazy_glLoadTransposeMatrixfARB(const GLfloat * m) {if (GLeeInit()) glLoadTransposeMatrixfARB(m);} - GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glLoadTransposeMatrixfARB=GLee_Lazy_glLoadTransposeMatrixfARB; -#endif -#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixdARB -#define GLEE_C_DEFINED_glLoadTransposeMatrixdARB - void __stdcall GLee_Lazy_glLoadTransposeMatrixdARB(const GLdouble * m) {if (GLeeInit()) glLoadTransposeMatrixdARB(m);} - GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glLoadTransposeMatrixdARB=GLee_Lazy_glLoadTransposeMatrixdARB; -#endif -#ifndef GLEE_C_DEFINED_glMultTransposeMatrixfARB -#define GLEE_C_DEFINED_glMultTransposeMatrixfARB - void __stdcall GLee_Lazy_glMultTransposeMatrixfARB(const GLfloat * m) {if (GLeeInit()) glMultTransposeMatrixfARB(m);} - GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glMultTransposeMatrixfARB=GLee_Lazy_glMultTransposeMatrixfARB; -#endif -#ifndef GLEE_C_DEFINED_glMultTransposeMatrixdARB -#define GLEE_C_DEFINED_glMultTransposeMatrixdARB - void __stdcall GLee_Lazy_glMultTransposeMatrixdARB(const GLdouble * m) {if (GLeeInit()) glMultTransposeMatrixdARB(m);} - GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glMultTransposeMatrixdARB=GLee_Lazy_glMultTransposeMatrixdARB; -#endif -#endif - -/* GL_ARB_multisample */ - -#ifdef __GLEE_GL_ARB_multisample -#ifndef GLEE_C_DEFINED_glSampleCoverageARB -#define GLEE_C_DEFINED_glSampleCoverageARB - void __stdcall GLee_Lazy_glSampleCoverageARB(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleCoverageARB(value, invert);} - GLEEPFNGLSAMPLECOVERAGEARBPROC GLeeFuncPtr_glSampleCoverageARB=GLee_Lazy_glSampleCoverageARB; -#endif -#endif - -/* GL_ARB_texture_env_add */ - -#ifdef __GLEE_GL_ARB_texture_env_add -#endif - -/* GL_ARB_texture_cube_map */ - -#ifdef __GLEE_GL_ARB_texture_cube_map -#endif - -/* GL_ARB_texture_compression */ - -#ifdef __GLEE_GL_ARB_texture_compression -#ifndef GLEE_C_DEFINED_glCompressedTexImage3DARB -#define GLEE_C_DEFINED_glCompressedTexImage3DARB - void __stdcall GLee_Lazy_glCompressedTexImage3DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexImage3DARB=GLee_Lazy_glCompressedTexImage3DARB; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexImage2DARB -#define GLEE_C_DEFINED_glCompressedTexImage2DARB - void __stdcall GLee_Lazy_glCompressedTexImage2DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexImage2DARB=GLee_Lazy_glCompressedTexImage2DARB; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexImage1DARB -#define GLEE_C_DEFINED_glCompressedTexImage1DARB - void __stdcall GLee_Lazy_glCompressedTexImage1DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexImage1DARB=GLee_Lazy_glCompressedTexImage1DARB; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexSubImage3DARB -#define GLEE_C_DEFINED_glCompressedTexSubImage3DARB - void __stdcall GLee_Lazy_glCompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexSubImage3DARB=GLee_Lazy_glCompressedTexSubImage3DARB; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexSubImage2DARB -#define GLEE_C_DEFINED_glCompressedTexSubImage2DARB - void __stdcall GLee_Lazy_glCompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexSubImage2DARB=GLee_Lazy_glCompressedTexSubImage2DARB; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTexSubImage1DARB -#define GLEE_C_DEFINED_glCompressedTexSubImage1DARB - void __stdcall GLee_Lazy_glCompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data);} - GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexSubImage1DARB=GLee_Lazy_glCompressedTexSubImage1DARB; -#endif -#ifndef GLEE_C_DEFINED_glGetCompressedTexImageARB -#define GLEE_C_DEFINED_glGetCompressedTexImageARB - void __stdcall GLee_Lazy_glGetCompressedTexImageARB(GLenum target, GLint level, GLvoid * img) {if (GLeeInit()) glGetCompressedTexImageARB(target, level, img);} - GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLeeFuncPtr_glGetCompressedTexImageARB=GLee_Lazy_glGetCompressedTexImageARB; -#endif -#endif - -/* GL_ARB_texture_border_clamp */ - -#ifdef __GLEE_GL_ARB_texture_border_clamp -#endif - -/* GL_ARB_point_parameters */ - -#ifdef __GLEE_GL_ARB_point_parameters -#ifndef GLEE_C_DEFINED_glPointParameterfARB -#define GLEE_C_DEFINED_glPointParameterfARB - void __stdcall GLee_Lazy_glPointParameterfARB(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterfARB(pname, param);} - GLEEPFNGLPOINTPARAMETERFARBPROC GLeeFuncPtr_glPointParameterfARB=GLee_Lazy_glPointParameterfARB; -#endif -#ifndef GLEE_C_DEFINED_glPointParameterfvARB -#define GLEE_C_DEFINED_glPointParameterfvARB - void __stdcall GLee_Lazy_glPointParameterfvARB(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfvARB(pname, params);} - GLEEPFNGLPOINTPARAMETERFVARBPROC GLeeFuncPtr_glPointParameterfvARB=GLee_Lazy_glPointParameterfvARB; -#endif -#endif - -/* GL_ARB_vertex_blend */ - -#ifdef __GLEE_GL_ARB_vertex_blend -#ifndef GLEE_C_DEFINED_glWeightbvARB -#define GLEE_C_DEFINED_glWeightbvARB - void __stdcall GLee_Lazy_glWeightbvARB(GLint size, const GLbyte * weights) {if (GLeeInit()) glWeightbvARB(size, weights);} - GLEEPFNGLWEIGHTBVARBPROC GLeeFuncPtr_glWeightbvARB=GLee_Lazy_glWeightbvARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightsvARB -#define GLEE_C_DEFINED_glWeightsvARB - void __stdcall GLee_Lazy_glWeightsvARB(GLint size, const GLshort * weights) {if (GLeeInit()) glWeightsvARB(size, weights);} - GLEEPFNGLWEIGHTSVARBPROC GLeeFuncPtr_glWeightsvARB=GLee_Lazy_glWeightsvARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightivARB -#define GLEE_C_DEFINED_glWeightivARB - void __stdcall GLee_Lazy_glWeightivARB(GLint size, const GLint * weights) {if (GLeeInit()) glWeightivARB(size, weights);} - GLEEPFNGLWEIGHTIVARBPROC GLeeFuncPtr_glWeightivARB=GLee_Lazy_glWeightivARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightfvARB -#define GLEE_C_DEFINED_glWeightfvARB - void __stdcall GLee_Lazy_glWeightfvARB(GLint size, const GLfloat * weights) {if (GLeeInit()) glWeightfvARB(size, weights);} - GLEEPFNGLWEIGHTFVARBPROC GLeeFuncPtr_glWeightfvARB=GLee_Lazy_glWeightfvARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightdvARB -#define GLEE_C_DEFINED_glWeightdvARB - void __stdcall GLee_Lazy_glWeightdvARB(GLint size, const GLdouble * weights) {if (GLeeInit()) glWeightdvARB(size, weights);} - GLEEPFNGLWEIGHTDVARBPROC GLeeFuncPtr_glWeightdvARB=GLee_Lazy_glWeightdvARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightubvARB -#define GLEE_C_DEFINED_glWeightubvARB - void __stdcall GLee_Lazy_glWeightubvARB(GLint size, const GLubyte * weights) {if (GLeeInit()) glWeightubvARB(size, weights);} - GLEEPFNGLWEIGHTUBVARBPROC GLeeFuncPtr_glWeightubvARB=GLee_Lazy_glWeightubvARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightusvARB -#define GLEE_C_DEFINED_glWeightusvARB - void __stdcall GLee_Lazy_glWeightusvARB(GLint size, const GLushort * weights) {if (GLeeInit()) glWeightusvARB(size, weights);} - GLEEPFNGLWEIGHTUSVARBPROC GLeeFuncPtr_glWeightusvARB=GLee_Lazy_glWeightusvARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightuivARB -#define GLEE_C_DEFINED_glWeightuivARB - void __stdcall GLee_Lazy_glWeightuivARB(GLint size, const GLuint * weights) {if (GLeeInit()) glWeightuivARB(size, weights);} - GLEEPFNGLWEIGHTUIVARBPROC GLeeFuncPtr_glWeightuivARB=GLee_Lazy_glWeightuivARB; -#endif -#ifndef GLEE_C_DEFINED_glWeightPointerARB -#define GLEE_C_DEFINED_glWeightPointerARB - void __stdcall GLee_Lazy_glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glWeightPointerARB(size, type, stride, pointer);} - GLEEPFNGLWEIGHTPOINTERARBPROC GLeeFuncPtr_glWeightPointerARB=GLee_Lazy_glWeightPointerARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexBlendARB -#define GLEE_C_DEFINED_glVertexBlendARB - void __stdcall GLee_Lazy_glVertexBlendARB(GLint count) {if (GLeeInit()) glVertexBlendARB(count);} - GLEEPFNGLVERTEXBLENDARBPROC GLeeFuncPtr_glVertexBlendARB=GLee_Lazy_glVertexBlendARB; -#endif -#endif - -/* GL_ARB_matrix_palette */ - -#ifdef __GLEE_GL_ARB_matrix_palette -#ifndef GLEE_C_DEFINED_glCurrentPaletteMatrixARB -#define GLEE_C_DEFINED_glCurrentPaletteMatrixARB - void __stdcall GLee_Lazy_glCurrentPaletteMatrixARB(GLint index) {if (GLeeInit()) glCurrentPaletteMatrixARB(index);} - GLEEPFNGLCURRENTPALETTEMATRIXARBPROC GLeeFuncPtr_glCurrentPaletteMatrixARB=GLee_Lazy_glCurrentPaletteMatrixARB; -#endif -#ifndef GLEE_C_DEFINED_glMatrixIndexubvARB -#define GLEE_C_DEFINED_glMatrixIndexubvARB - void __stdcall GLee_Lazy_glMatrixIndexubvARB(GLint size, const GLubyte * indices) {if (GLeeInit()) glMatrixIndexubvARB(size, indices);} - GLEEPFNGLMATRIXINDEXUBVARBPROC GLeeFuncPtr_glMatrixIndexubvARB=GLee_Lazy_glMatrixIndexubvARB; -#endif -#ifndef GLEE_C_DEFINED_glMatrixIndexusvARB -#define GLEE_C_DEFINED_glMatrixIndexusvARB - void __stdcall GLee_Lazy_glMatrixIndexusvARB(GLint size, const GLushort * indices) {if (GLeeInit()) glMatrixIndexusvARB(size, indices);} - GLEEPFNGLMATRIXINDEXUSVARBPROC GLeeFuncPtr_glMatrixIndexusvARB=GLee_Lazy_glMatrixIndexusvARB; -#endif -#ifndef GLEE_C_DEFINED_glMatrixIndexuivARB -#define GLEE_C_DEFINED_glMatrixIndexuivARB - void __stdcall GLee_Lazy_glMatrixIndexuivARB(GLint size, const GLuint * indices) {if (GLeeInit()) glMatrixIndexuivARB(size, indices);} - GLEEPFNGLMATRIXINDEXUIVARBPROC GLeeFuncPtr_glMatrixIndexuivARB=GLee_Lazy_glMatrixIndexuivARB; -#endif -#ifndef GLEE_C_DEFINED_glMatrixIndexPointerARB -#define GLEE_C_DEFINED_glMatrixIndexPointerARB - void __stdcall GLee_Lazy_glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glMatrixIndexPointerARB(size, type, stride, pointer);} - GLEEPFNGLMATRIXINDEXPOINTERARBPROC GLeeFuncPtr_glMatrixIndexPointerARB=GLee_Lazy_glMatrixIndexPointerARB; -#endif -#endif - -/* GL_ARB_texture_env_combine */ - -#ifdef __GLEE_GL_ARB_texture_env_combine -#endif - -/* GL_ARB_texture_env_crossbar */ - -#ifdef __GLEE_GL_ARB_texture_env_crossbar -#endif - -/* GL_ARB_texture_env_dot3 */ - -#ifdef __GLEE_GL_ARB_texture_env_dot3 -#endif - -/* GL_ARB_texture_mirrored_repeat */ - -#ifdef __GLEE_GL_ARB_texture_mirrored_repeat -#endif - -/* GL_ARB_depth_texture */ - -#ifdef __GLEE_GL_ARB_depth_texture -#endif - -/* GL_ARB_shadow */ - -#ifdef __GLEE_GL_ARB_shadow -#endif - -/* GL_ARB_shadow_ambient */ - -#ifdef __GLEE_GL_ARB_shadow_ambient -#endif - -/* GL_ARB_window_pos */ - -#ifdef __GLEE_GL_ARB_window_pos -#ifndef GLEE_C_DEFINED_glWindowPos2dARB -#define GLEE_C_DEFINED_glWindowPos2dARB - void __stdcall GLee_Lazy_glWindowPos2dARB(GLdouble x, GLdouble y) {if (GLeeInit()) glWindowPos2dARB(x, y);} - GLEEPFNGLWINDOWPOS2DARBPROC GLeeFuncPtr_glWindowPos2dARB=GLee_Lazy_glWindowPos2dARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2dvARB -#define GLEE_C_DEFINED_glWindowPos2dvARB - void __stdcall GLee_Lazy_glWindowPos2dvARB(const GLdouble * v) {if (GLeeInit()) glWindowPos2dvARB(v);} - GLEEPFNGLWINDOWPOS2DVARBPROC GLeeFuncPtr_glWindowPos2dvARB=GLee_Lazy_glWindowPos2dvARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2fARB -#define GLEE_C_DEFINED_glWindowPos2fARB - void __stdcall GLee_Lazy_glWindowPos2fARB(GLfloat x, GLfloat y) {if (GLeeInit()) glWindowPos2fARB(x, y);} - GLEEPFNGLWINDOWPOS2FARBPROC GLeeFuncPtr_glWindowPos2fARB=GLee_Lazy_glWindowPos2fARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2fvARB -#define GLEE_C_DEFINED_glWindowPos2fvARB - void __stdcall GLee_Lazy_glWindowPos2fvARB(const GLfloat * v) {if (GLeeInit()) glWindowPos2fvARB(v);} - GLEEPFNGLWINDOWPOS2FVARBPROC GLeeFuncPtr_glWindowPos2fvARB=GLee_Lazy_glWindowPos2fvARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2iARB -#define GLEE_C_DEFINED_glWindowPos2iARB - void __stdcall GLee_Lazy_glWindowPos2iARB(GLint x, GLint y) {if (GLeeInit()) glWindowPos2iARB(x, y);} - GLEEPFNGLWINDOWPOS2IARBPROC GLeeFuncPtr_glWindowPos2iARB=GLee_Lazy_glWindowPos2iARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2ivARB -#define GLEE_C_DEFINED_glWindowPos2ivARB - void __stdcall GLee_Lazy_glWindowPos2ivARB(const GLint * v) {if (GLeeInit()) glWindowPos2ivARB(v);} - GLEEPFNGLWINDOWPOS2IVARBPROC GLeeFuncPtr_glWindowPos2ivARB=GLee_Lazy_glWindowPos2ivARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2sARB -#define GLEE_C_DEFINED_glWindowPos2sARB - void __stdcall GLee_Lazy_glWindowPos2sARB(GLshort x, GLshort y) {if (GLeeInit()) glWindowPos2sARB(x, y);} - GLEEPFNGLWINDOWPOS2SARBPROC GLeeFuncPtr_glWindowPos2sARB=GLee_Lazy_glWindowPos2sARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2svARB -#define GLEE_C_DEFINED_glWindowPos2svARB - void __stdcall GLee_Lazy_glWindowPos2svARB(const GLshort * v) {if (GLeeInit()) glWindowPos2svARB(v);} - GLEEPFNGLWINDOWPOS2SVARBPROC GLeeFuncPtr_glWindowPos2svARB=GLee_Lazy_glWindowPos2svARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3dARB -#define GLEE_C_DEFINED_glWindowPos3dARB - void __stdcall GLee_Lazy_glWindowPos3dARB(GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glWindowPos3dARB(x, y, z);} - GLEEPFNGLWINDOWPOS3DARBPROC GLeeFuncPtr_glWindowPos3dARB=GLee_Lazy_glWindowPos3dARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3dvARB -#define GLEE_C_DEFINED_glWindowPos3dvARB - void __stdcall GLee_Lazy_glWindowPos3dvARB(const GLdouble * v) {if (GLeeInit()) glWindowPos3dvARB(v);} - GLEEPFNGLWINDOWPOS3DVARBPROC GLeeFuncPtr_glWindowPos3dvARB=GLee_Lazy_glWindowPos3dvARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3fARB -#define GLEE_C_DEFINED_glWindowPos3fARB - void __stdcall GLee_Lazy_glWindowPos3fARB(GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glWindowPos3fARB(x, y, z);} - GLEEPFNGLWINDOWPOS3FARBPROC GLeeFuncPtr_glWindowPos3fARB=GLee_Lazy_glWindowPos3fARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3fvARB -#define GLEE_C_DEFINED_glWindowPos3fvARB - void __stdcall GLee_Lazy_glWindowPos3fvARB(const GLfloat * v) {if (GLeeInit()) glWindowPos3fvARB(v);} - GLEEPFNGLWINDOWPOS3FVARBPROC GLeeFuncPtr_glWindowPos3fvARB=GLee_Lazy_glWindowPos3fvARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3iARB -#define GLEE_C_DEFINED_glWindowPos3iARB - void __stdcall GLee_Lazy_glWindowPos3iARB(GLint x, GLint y, GLint z) {if (GLeeInit()) glWindowPos3iARB(x, y, z);} - GLEEPFNGLWINDOWPOS3IARBPROC GLeeFuncPtr_glWindowPos3iARB=GLee_Lazy_glWindowPos3iARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3ivARB -#define GLEE_C_DEFINED_glWindowPos3ivARB - void __stdcall GLee_Lazy_glWindowPos3ivARB(const GLint * v) {if (GLeeInit()) glWindowPos3ivARB(v);} - GLEEPFNGLWINDOWPOS3IVARBPROC GLeeFuncPtr_glWindowPos3ivARB=GLee_Lazy_glWindowPos3ivARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3sARB -#define GLEE_C_DEFINED_glWindowPos3sARB - void __stdcall GLee_Lazy_glWindowPos3sARB(GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glWindowPos3sARB(x, y, z);} - GLEEPFNGLWINDOWPOS3SARBPROC GLeeFuncPtr_glWindowPos3sARB=GLee_Lazy_glWindowPos3sARB; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3svARB -#define GLEE_C_DEFINED_glWindowPos3svARB - void __stdcall GLee_Lazy_glWindowPos3svARB(const GLshort * v) {if (GLeeInit()) glWindowPos3svARB(v);} - GLEEPFNGLWINDOWPOS3SVARBPROC GLeeFuncPtr_glWindowPos3svARB=GLee_Lazy_glWindowPos3svARB; -#endif -#endif - -/* GL_ARB_vertex_program */ - -#ifdef __GLEE_GL_ARB_vertex_program -#ifndef GLEE_C_DEFINED_glVertexAttrib1dARB -#define GLEE_C_DEFINED_glVertexAttrib1dARB - void __stdcall GLee_Lazy_glVertexAttrib1dARB(GLuint index, GLdouble x) {if (GLeeInit()) glVertexAttrib1dARB(index, x);} - GLEEPFNGLVERTEXATTRIB1DARBPROC GLeeFuncPtr_glVertexAttrib1dARB=GLee_Lazy_glVertexAttrib1dARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1dvARB -#define GLEE_C_DEFINED_glVertexAttrib1dvARB - void __stdcall GLee_Lazy_glVertexAttrib1dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib1dvARB(index, v);} - GLEEPFNGLVERTEXATTRIB1DVARBPROC GLeeFuncPtr_glVertexAttrib1dvARB=GLee_Lazy_glVertexAttrib1dvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1fARB -#define GLEE_C_DEFINED_glVertexAttrib1fARB - void __stdcall GLee_Lazy_glVertexAttrib1fARB(GLuint index, GLfloat x) {if (GLeeInit()) glVertexAttrib1fARB(index, x);} - GLEEPFNGLVERTEXATTRIB1FARBPROC GLeeFuncPtr_glVertexAttrib1fARB=GLee_Lazy_glVertexAttrib1fARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1fvARB -#define GLEE_C_DEFINED_glVertexAttrib1fvARB - void __stdcall GLee_Lazy_glVertexAttrib1fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib1fvARB(index, v);} - GLEEPFNGLVERTEXATTRIB1FVARBPROC GLeeFuncPtr_glVertexAttrib1fvARB=GLee_Lazy_glVertexAttrib1fvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1sARB -#define GLEE_C_DEFINED_glVertexAttrib1sARB - void __stdcall GLee_Lazy_glVertexAttrib1sARB(GLuint index, GLshort x) {if (GLeeInit()) glVertexAttrib1sARB(index, x);} - GLEEPFNGLVERTEXATTRIB1SARBPROC GLeeFuncPtr_glVertexAttrib1sARB=GLee_Lazy_glVertexAttrib1sARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1svARB -#define GLEE_C_DEFINED_glVertexAttrib1svARB - void __stdcall GLee_Lazy_glVertexAttrib1svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib1svARB(index, v);} - GLEEPFNGLVERTEXATTRIB1SVARBPROC GLeeFuncPtr_glVertexAttrib1svARB=GLee_Lazy_glVertexAttrib1svARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2dARB -#define GLEE_C_DEFINED_glVertexAttrib2dARB - void __stdcall GLee_Lazy_glVertexAttrib2dARB(GLuint index, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexAttrib2dARB(index, x, y);} - GLEEPFNGLVERTEXATTRIB2DARBPROC GLeeFuncPtr_glVertexAttrib2dARB=GLee_Lazy_glVertexAttrib2dARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2dvARB -#define GLEE_C_DEFINED_glVertexAttrib2dvARB - void __stdcall GLee_Lazy_glVertexAttrib2dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib2dvARB(index, v);} - GLEEPFNGLVERTEXATTRIB2DVARBPROC GLeeFuncPtr_glVertexAttrib2dvARB=GLee_Lazy_glVertexAttrib2dvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2fARB -#define GLEE_C_DEFINED_glVertexAttrib2fARB - void __stdcall GLee_Lazy_glVertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexAttrib2fARB(index, x, y);} - GLEEPFNGLVERTEXATTRIB2FARBPROC GLeeFuncPtr_glVertexAttrib2fARB=GLee_Lazy_glVertexAttrib2fARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2fvARB -#define GLEE_C_DEFINED_glVertexAttrib2fvARB - void __stdcall GLee_Lazy_glVertexAttrib2fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib2fvARB(index, v);} - GLEEPFNGLVERTEXATTRIB2FVARBPROC GLeeFuncPtr_glVertexAttrib2fvARB=GLee_Lazy_glVertexAttrib2fvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2sARB -#define GLEE_C_DEFINED_glVertexAttrib2sARB - void __stdcall GLee_Lazy_glVertexAttrib2sARB(GLuint index, GLshort x, GLshort y) {if (GLeeInit()) glVertexAttrib2sARB(index, x, y);} - GLEEPFNGLVERTEXATTRIB2SARBPROC GLeeFuncPtr_glVertexAttrib2sARB=GLee_Lazy_glVertexAttrib2sARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2svARB -#define GLEE_C_DEFINED_glVertexAttrib2svARB - void __stdcall GLee_Lazy_glVertexAttrib2svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib2svARB(index, v);} - GLEEPFNGLVERTEXATTRIB2SVARBPROC GLeeFuncPtr_glVertexAttrib2svARB=GLee_Lazy_glVertexAttrib2svARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3dARB -#define GLEE_C_DEFINED_glVertexAttrib3dARB - void __stdcall GLee_Lazy_glVertexAttrib3dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexAttrib3dARB(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3DARBPROC GLeeFuncPtr_glVertexAttrib3dARB=GLee_Lazy_glVertexAttrib3dARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3dvARB -#define GLEE_C_DEFINED_glVertexAttrib3dvARB - void __stdcall GLee_Lazy_glVertexAttrib3dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib3dvARB(index, v);} - GLEEPFNGLVERTEXATTRIB3DVARBPROC GLeeFuncPtr_glVertexAttrib3dvARB=GLee_Lazy_glVertexAttrib3dvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3fARB -#define GLEE_C_DEFINED_glVertexAttrib3fARB - void __stdcall GLee_Lazy_glVertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexAttrib3fARB(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3FARBPROC GLeeFuncPtr_glVertexAttrib3fARB=GLee_Lazy_glVertexAttrib3fARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3fvARB -#define GLEE_C_DEFINED_glVertexAttrib3fvARB - void __stdcall GLee_Lazy_glVertexAttrib3fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib3fvARB(index, v);} - GLEEPFNGLVERTEXATTRIB3FVARBPROC GLeeFuncPtr_glVertexAttrib3fvARB=GLee_Lazy_glVertexAttrib3fvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3sARB -#define GLEE_C_DEFINED_glVertexAttrib3sARB - void __stdcall GLee_Lazy_glVertexAttrib3sARB(GLuint index, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexAttrib3sARB(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3SARBPROC GLeeFuncPtr_glVertexAttrib3sARB=GLee_Lazy_glVertexAttrib3sARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3svARB -#define GLEE_C_DEFINED_glVertexAttrib3svARB - void __stdcall GLee_Lazy_glVertexAttrib3svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib3svARB(index, v);} - GLEEPFNGLVERTEXATTRIB3SVARBPROC GLeeFuncPtr_glVertexAttrib3svARB=GLee_Lazy_glVertexAttrib3svARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NbvARB -#define GLEE_C_DEFINED_glVertexAttrib4NbvARB - void __stdcall GLee_Lazy_glVertexAttrib4NbvARB(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4NbvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4NBVARBPROC GLeeFuncPtr_glVertexAttrib4NbvARB=GLee_Lazy_glVertexAttrib4NbvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NivARB -#define GLEE_C_DEFINED_glVertexAttrib4NivARB - void __stdcall GLee_Lazy_glVertexAttrib4NivARB(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4NivARB(index, v);} - GLEEPFNGLVERTEXATTRIB4NIVARBPROC GLeeFuncPtr_glVertexAttrib4NivARB=GLee_Lazy_glVertexAttrib4NivARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NsvARB -#define GLEE_C_DEFINED_glVertexAttrib4NsvARB - void __stdcall GLee_Lazy_glVertexAttrib4NsvARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4NsvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4NSVARBPROC GLeeFuncPtr_glVertexAttrib4NsvARB=GLee_Lazy_glVertexAttrib4NsvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NubARB -#define GLEE_C_DEFINED_glVertexAttrib4NubARB - void __stdcall GLee_Lazy_glVertexAttrib4NubARB(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) {if (GLeeInit()) glVertexAttrib4NubARB(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4NUBARBPROC GLeeFuncPtr_glVertexAttrib4NubARB=GLee_Lazy_glVertexAttrib4NubARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NubvARB -#define GLEE_C_DEFINED_glVertexAttrib4NubvARB - void __stdcall GLee_Lazy_glVertexAttrib4NubvARB(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4NubvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4NUBVARBPROC GLeeFuncPtr_glVertexAttrib4NubvARB=GLee_Lazy_glVertexAttrib4NubvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NuivARB -#define GLEE_C_DEFINED_glVertexAttrib4NuivARB - void __stdcall GLee_Lazy_glVertexAttrib4NuivARB(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4NuivARB(index, v);} - GLEEPFNGLVERTEXATTRIB4NUIVARBPROC GLeeFuncPtr_glVertexAttrib4NuivARB=GLee_Lazy_glVertexAttrib4NuivARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4NusvARB -#define GLEE_C_DEFINED_glVertexAttrib4NusvARB - void __stdcall GLee_Lazy_glVertexAttrib4NusvARB(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4NusvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4NUSVARBPROC GLeeFuncPtr_glVertexAttrib4NusvARB=GLee_Lazy_glVertexAttrib4NusvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4bvARB -#define GLEE_C_DEFINED_glVertexAttrib4bvARB - void __stdcall GLee_Lazy_glVertexAttrib4bvARB(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4bvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4BVARBPROC GLeeFuncPtr_glVertexAttrib4bvARB=GLee_Lazy_glVertexAttrib4bvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4dARB -#define GLEE_C_DEFINED_glVertexAttrib4dARB - void __stdcall GLee_Lazy_glVertexAttrib4dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexAttrib4dARB(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4DARBPROC GLeeFuncPtr_glVertexAttrib4dARB=GLee_Lazy_glVertexAttrib4dARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4dvARB -#define GLEE_C_DEFINED_glVertexAttrib4dvARB - void __stdcall GLee_Lazy_glVertexAttrib4dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib4dvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4DVARBPROC GLeeFuncPtr_glVertexAttrib4dvARB=GLee_Lazy_glVertexAttrib4dvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4fARB -#define GLEE_C_DEFINED_glVertexAttrib4fARB - void __stdcall GLee_Lazy_glVertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexAttrib4fARB(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4FARBPROC GLeeFuncPtr_glVertexAttrib4fARB=GLee_Lazy_glVertexAttrib4fARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4fvARB -#define GLEE_C_DEFINED_glVertexAttrib4fvARB - void __stdcall GLee_Lazy_glVertexAttrib4fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib4fvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4FVARBPROC GLeeFuncPtr_glVertexAttrib4fvARB=GLee_Lazy_glVertexAttrib4fvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4ivARB -#define GLEE_C_DEFINED_glVertexAttrib4ivARB - void __stdcall GLee_Lazy_glVertexAttrib4ivARB(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4ivARB(index, v);} - GLEEPFNGLVERTEXATTRIB4IVARBPROC GLeeFuncPtr_glVertexAttrib4ivARB=GLee_Lazy_glVertexAttrib4ivARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4sARB -#define GLEE_C_DEFINED_glVertexAttrib4sARB - void __stdcall GLee_Lazy_glVertexAttrib4sARB(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexAttrib4sARB(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4SARBPROC GLeeFuncPtr_glVertexAttrib4sARB=GLee_Lazy_glVertexAttrib4sARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4svARB -#define GLEE_C_DEFINED_glVertexAttrib4svARB - void __stdcall GLee_Lazy_glVertexAttrib4svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4svARB(index, v);} - GLEEPFNGLVERTEXATTRIB4SVARBPROC GLeeFuncPtr_glVertexAttrib4svARB=GLee_Lazy_glVertexAttrib4svARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4ubvARB -#define GLEE_C_DEFINED_glVertexAttrib4ubvARB - void __stdcall GLee_Lazy_glVertexAttrib4ubvARB(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4ubvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4UBVARBPROC GLeeFuncPtr_glVertexAttrib4ubvARB=GLee_Lazy_glVertexAttrib4ubvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4uivARB -#define GLEE_C_DEFINED_glVertexAttrib4uivARB - void __stdcall GLee_Lazy_glVertexAttrib4uivARB(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4uivARB(index, v);} - GLEEPFNGLVERTEXATTRIB4UIVARBPROC GLeeFuncPtr_glVertexAttrib4uivARB=GLee_Lazy_glVertexAttrib4uivARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4usvARB -#define GLEE_C_DEFINED_glVertexAttrib4usvARB - void __stdcall GLee_Lazy_glVertexAttrib4usvARB(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4usvARB(index, v);} - GLEEPFNGLVERTEXATTRIB4USVARBPROC GLeeFuncPtr_glVertexAttrib4usvARB=GLee_Lazy_glVertexAttrib4usvARB; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribPointerARB -#define GLEE_C_DEFINED_glVertexAttribPointerARB - void __stdcall GLee_Lazy_glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribPointerARB(index, size, type, normalized, stride, pointer);} - GLEEPFNGLVERTEXATTRIBPOINTERARBPROC GLeeFuncPtr_glVertexAttribPointerARB=GLee_Lazy_glVertexAttribPointerARB; -#endif -#ifndef GLEE_C_DEFINED_glEnableVertexAttribArrayARB -#define GLEE_C_DEFINED_glEnableVertexAttribArrayARB - void __stdcall GLee_Lazy_glEnableVertexAttribArrayARB(GLuint index) {if (GLeeInit()) glEnableVertexAttribArrayARB(index);} - GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glEnableVertexAttribArrayARB=GLee_Lazy_glEnableVertexAttribArrayARB; -#endif -#ifndef GLEE_C_DEFINED_glDisableVertexAttribArrayARB -#define GLEE_C_DEFINED_glDisableVertexAttribArrayARB - void __stdcall GLee_Lazy_glDisableVertexAttribArrayARB(GLuint index) {if (GLeeInit()) glDisableVertexAttribArrayARB(index);} - GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glDisableVertexAttribArrayARB=GLee_Lazy_glDisableVertexAttribArrayARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramStringARB -#define GLEE_C_DEFINED_glProgramStringARB - void __stdcall GLee_Lazy_glProgramStringARB(GLenum target, GLenum format, GLsizei len, const GLvoid * string) {if (GLeeInit()) glProgramStringARB(target, format, len, string);} - GLEEPFNGLPROGRAMSTRINGARBPROC GLeeFuncPtr_glProgramStringARB=GLee_Lazy_glProgramStringARB; -#endif -#ifndef GLEE_C_DEFINED_glBindProgramARB -#define GLEE_C_DEFINED_glBindProgramARB - void __stdcall GLee_Lazy_glBindProgramARB(GLenum target, GLuint program) {if (GLeeInit()) glBindProgramARB(target, program);} - GLEEPFNGLBINDPROGRAMARBPROC GLeeFuncPtr_glBindProgramARB=GLee_Lazy_glBindProgramARB; -#endif -#ifndef GLEE_C_DEFINED_glDeleteProgramsARB -#define GLEE_C_DEFINED_glDeleteProgramsARB - void __stdcall GLee_Lazy_glDeleteProgramsARB(GLsizei n, const GLuint * programs) {if (GLeeInit()) glDeleteProgramsARB(n, programs);} - GLEEPFNGLDELETEPROGRAMSARBPROC GLeeFuncPtr_glDeleteProgramsARB=GLee_Lazy_glDeleteProgramsARB; -#endif -#ifndef GLEE_C_DEFINED_glGenProgramsARB -#define GLEE_C_DEFINED_glGenProgramsARB - void __stdcall GLee_Lazy_glGenProgramsARB(GLsizei n, GLuint * programs) {if (GLeeInit()) glGenProgramsARB(n, programs);} - GLEEPFNGLGENPROGRAMSARBPROC GLeeFuncPtr_glGenProgramsARB=GLee_Lazy_glGenProgramsARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameter4dARB -#define GLEE_C_DEFINED_glProgramEnvParameter4dARB - void __stdcall GLee_Lazy_glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramEnvParameter4dARB(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC GLeeFuncPtr_glProgramEnvParameter4dARB=GLee_Lazy_glProgramEnvParameter4dARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameter4dvARB -#define GLEE_C_DEFINED_glProgramEnvParameter4dvARB - void __stdcall GLee_Lazy_glProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble * params) {if (GLeeInit()) glProgramEnvParameter4dvARB(target, index, params);} - GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC GLeeFuncPtr_glProgramEnvParameter4dvARB=GLee_Lazy_glProgramEnvParameter4dvARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameter4fARB -#define GLEE_C_DEFINED_glProgramEnvParameter4fARB - void __stdcall GLee_Lazy_glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramEnvParameter4fARB(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC GLeeFuncPtr_glProgramEnvParameter4fARB=GLee_Lazy_glProgramEnvParameter4fARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameter4fvARB -#define GLEE_C_DEFINED_glProgramEnvParameter4fvARB - void __stdcall GLee_Lazy_glProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat * params) {if (GLeeInit()) glProgramEnvParameter4fvARB(target, index, params);} - GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC GLeeFuncPtr_glProgramEnvParameter4fvARB=GLee_Lazy_glProgramEnvParameter4fvARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameter4dARB -#define GLEE_C_DEFINED_glProgramLocalParameter4dARB - void __stdcall GLee_Lazy_glProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramLocalParameter4dARB(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC GLeeFuncPtr_glProgramLocalParameter4dARB=GLee_Lazy_glProgramLocalParameter4dARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameter4dvARB -#define GLEE_C_DEFINED_glProgramLocalParameter4dvARB - void __stdcall GLee_Lazy_glProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble * params) {if (GLeeInit()) glProgramLocalParameter4dvARB(target, index, params);} - GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLeeFuncPtr_glProgramLocalParameter4dvARB=GLee_Lazy_glProgramLocalParameter4dvARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameter4fARB -#define GLEE_C_DEFINED_glProgramLocalParameter4fARB - void __stdcall GLee_Lazy_glProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramLocalParameter4fARB(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC GLeeFuncPtr_glProgramLocalParameter4fARB=GLee_Lazy_glProgramLocalParameter4fARB; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameter4fvARB -#define GLEE_C_DEFINED_glProgramLocalParameter4fvARB - void __stdcall GLee_Lazy_glProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat * params) {if (GLeeInit()) glProgramLocalParameter4fvARB(target, index, params);} - GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLeeFuncPtr_glProgramLocalParameter4fvARB=GLee_Lazy_glProgramLocalParameter4fvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterdvARB -#define GLEE_C_DEFINED_glGetProgramEnvParameterdvARB - void __stdcall GLee_Lazy_glGetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble * params) {if (GLeeInit()) glGetProgramEnvParameterdvARB(target, index, params);} - GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramEnvParameterdvARB=GLee_Lazy_glGetProgramEnvParameterdvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterfvARB -#define GLEE_C_DEFINED_glGetProgramEnvParameterfvARB - void __stdcall GLee_Lazy_glGetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat * params) {if (GLeeInit()) glGetProgramEnvParameterfvARB(target, index, params);} - GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramEnvParameterfvARB=GLee_Lazy_glGetProgramEnvParameterfvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterdvARB -#define GLEE_C_DEFINED_glGetProgramLocalParameterdvARB - void __stdcall GLee_Lazy_glGetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble * params) {if (GLeeInit()) glGetProgramLocalParameterdvARB(target, index, params);} - GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramLocalParameterdvARB=GLee_Lazy_glGetProgramLocalParameterdvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterfvARB -#define GLEE_C_DEFINED_glGetProgramLocalParameterfvARB - void __stdcall GLee_Lazy_glGetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat * params) {if (GLeeInit()) glGetProgramLocalParameterfvARB(target, index, params);} - GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramLocalParameterfvARB=GLee_Lazy_glGetProgramLocalParameterfvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramivARB -#define GLEE_C_DEFINED_glGetProgramivARB - void __stdcall GLee_Lazy_glGetProgramivARB(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetProgramivARB(target, pname, params);} - GLEEPFNGLGETPROGRAMIVARBPROC GLeeFuncPtr_glGetProgramivARB=GLee_Lazy_glGetProgramivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramStringARB -#define GLEE_C_DEFINED_glGetProgramStringARB - void __stdcall GLee_Lazy_glGetProgramStringARB(GLenum target, GLenum pname, GLvoid * string) {if (GLeeInit()) glGetProgramStringARB(target, pname, string);} - GLEEPFNGLGETPROGRAMSTRINGARBPROC GLeeFuncPtr_glGetProgramStringARB=GLee_Lazy_glGetProgramStringARB; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribdvARB -#define GLEE_C_DEFINED_glGetVertexAttribdvARB - void __stdcall GLee_Lazy_glGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetVertexAttribdvARB(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBDVARBPROC GLeeFuncPtr_glGetVertexAttribdvARB=GLee_Lazy_glGetVertexAttribdvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribfvARB -#define GLEE_C_DEFINED_glGetVertexAttribfvARB - void __stdcall GLee_Lazy_glGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribfvARB(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBFVARBPROC GLeeFuncPtr_glGetVertexAttribfvARB=GLee_Lazy_glGetVertexAttribfvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribivARB -#define GLEE_C_DEFINED_glGetVertexAttribivARB - void __stdcall GLee_Lazy_glGetVertexAttribivARB(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribivARB(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIVARBPROC GLeeFuncPtr_glGetVertexAttribivARB=GLee_Lazy_glGetVertexAttribivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribPointervARB -#define GLEE_C_DEFINED_glGetVertexAttribPointervARB - void __stdcall GLee_Lazy_glGetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid* * pointer) {if (GLeeInit()) glGetVertexAttribPointervARB(index, pname, pointer);} - GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC GLeeFuncPtr_glGetVertexAttribPointervARB=GLee_Lazy_glGetVertexAttribPointervARB; -#endif -#ifndef GLEE_C_DEFINED_glIsProgramARB -#define GLEE_C_DEFINED_glIsProgramARB - GLboolean __stdcall GLee_Lazy_glIsProgramARB(GLuint program) {if (GLeeInit()) return glIsProgramARB(program); return (GLboolean)0;} - GLEEPFNGLISPROGRAMARBPROC GLeeFuncPtr_glIsProgramARB=GLee_Lazy_glIsProgramARB; -#endif -#endif - -/* GL_ARB_fragment_program */ - -#ifdef __GLEE_GL_ARB_fragment_program -#endif - -/* GL_ARB_vertex_buffer_object */ - -#ifdef __GLEE_GL_ARB_vertex_buffer_object -#ifndef GLEE_C_DEFINED_glBindBufferARB -#define GLEE_C_DEFINED_glBindBufferARB - void __stdcall GLee_Lazy_glBindBufferARB(GLenum target, GLuint buffer) {if (GLeeInit()) glBindBufferARB(target, buffer);} - GLEEPFNGLBINDBUFFERARBPROC GLeeFuncPtr_glBindBufferARB=GLee_Lazy_glBindBufferARB; -#endif -#ifndef GLEE_C_DEFINED_glDeleteBuffersARB -#define GLEE_C_DEFINED_glDeleteBuffersARB - void __stdcall GLee_Lazy_glDeleteBuffersARB(GLsizei n, const GLuint * buffers) {if (GLeeInit()) glDeleteBuffersARB(n, buffers);} - GLEEPFNGLDELETEBUFFERSARBPROC GLeeFuncPtr_glDeleteBuffersARB=GLee_Lazy_glDeleteBuffersARB; -#endif -#ifndef GLEE_C_DEFINED_glGenBuffersARB -#define GLEE_C_DEFINED_glGenBuffersARB - void __stdcall GLee_Lazy_glGenBuffersARB(GLsizei n, GLuint * buffers) {if (GLeeInit()) glGenBuffersARB(n, buffers);} - GLEEPFNGLGENBUFFERSARBPROC GLeeFuncPtr_glGenBuffersARB=GLee_Lazy_glGenBuffersARB; -#endif -#ifndef GLEE_C_DEFINED_glIsBufferARB -#define GLEE_C_DEFINED_glIsBufferARB - GLboolean __stdcall GLee_Lazy_glIsBufferARB(GLuint buffer) {if (GLeeInit()) return glIsBufferARB(buffer); return (GLboolean)0;} - GLEEPFNGLISBUFFERARBPROC GLeeFuncPtr_glIsBufferARB=GLee_Lazy_glIsBufferARB; -#endif -#ifndef GLEE_C_DEFINED_glBufferDataARB -#define GLEE_C_DEFINED_glBufferDataARB - void __stdcall GLee_Lazy_glBufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage) {if (GLeeInit()) glBufferDataARB(target, size, data, usage);} - GLEEPFNGLBUFFERDATAARBPROC GLeeFuncPtr_glBufferDataARB=GLee_Lazy_glBufferDataARB; -#endif -#ifndef GLEE_C_DEFINED_glBufferSubDataARB -#define GLEE_C_DEFINED_glBufferSubDataARB - void __stdcall GLee_Lazy_glBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data) {if (GLeeInit()) glBufferSubDataARB(target, offset, size, data);} - GLEEPFNGLBUFFERSUBDATAARBPROC GLeeFuncPtr_glBufferSubDataARB=GLee_Lazy_glBufferSubDataARB; -#endif -#ifndef GLEE_C_DEFINED_glGetBufferSubDataARB -#define GLEE_C_DEFINED_glGetBufferSubDataARB - void __stdcall GLee_Lazy_glGetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data) {if (GLeeInit()) glGetBufferSubDataARB(target, offset, size, data);} - GLEEPFNGLGETBUFFERSUBDATAARBPROC GLeeFuncPtr_glGetBufferSubDataARB=GLee_Lazy_glGetBufferSubDataARB; -#endif -#ifndef GLEE_C_DEFINED_glMapBufferARB -#define GLEE_C_DEFINED_glMapBufferARB - GLvoid* __stdcall GLee_Lazy_glMapBufferARB(GLenum target, GLenum access) {if (GLeeInit()) return glMapBufferARB(target, access); return (GLvoid*)0;} - GLEEPFNGLMAPBUFFERARBPROC GLeeFuncPtr_glMapBufferARB=GLee_Lazy_glMapBufferARB; -#endif -#ifndef GLEE_C_DEFINED_glUnmapBufferARB -#define GLEE_C_DEFINED_glUnmapBufferARB - GLboolean __stdcall GLee_Lazy_glUnmapBufferARB(GLenum target) {if (GLeeInit()) return glUnmapBufferARB(target); return (GLboolean)0;} - GLEEPFNGLUNMAPBUFFERARBPROC GLeeFuncPtr_glUnmapBufferARB=GLee_Lazy_glUnmapBufferARB; -#endif -#ifndef GLEE_C_DEFINED_glGetBufferParameterivARB -#define GLEE_C_DEFINED_glGetBufferParameterivARB - void __stdcall GLee_Lazy_glGetBufferParameterivARB(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetBufferParameterivARB(target, pname, params);} - GLEEPFNGLGETBUFFERPARAMETERIVARBPROC GLeeFuncPtr_glGetBufferParameterivARB=GLee_Lazy_glGetBufferParameterivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetBufferPointervARB -#define GLEE_C_DEFINED_glGetBufferPointervARB - void __stdcall GLee_Lazy_glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetBufferPointervARB(target, pname, params);} - GLEEPFNGLGETBUFFERPOINTERVARBPROC GLeeFuncPtr_glGetBufferPointervARB=GLee_Lazy_glGetBufferPointervARB; -#endif -#endif - -/* GL_ARB_occlusion_query */ - -#ifdef __GLEE_GL_ARB_occlusion_query -#ifndef GLEE_C_DEFINED_glGenQueriesARB -#define GLEE_C_DEFINED_glGenQueriesARB - void __stdcall GLee_Lazy_glGenQueriesARB(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenQueriesARB(n, ids);} - GLEEPFNGLGENQUERIESARBPROC GLeeFuncPtr_glGenQueriesARB=GLee_Lazy_glGenQueriesARB; -#endif -#ifndef GLEE_C_DEFINED_glDeleteQueriesARB -#define GLEE_C_DEFINED_glDeleteQueriesARB - void __stdcall GLee_Lazy_glDeleteQueriesARB(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteQueriesARB(n, ids);} - GLEEPFNGLDELETEQUERIESARBPROC GLeeFuncPtr_glDeleteQueriesARB=GLee_Lazy_glDeleteQueriesARB; -#endif -#ifndef GLEE_C_DEFINED_glIsQueryARB -#define GLEE_C_DEFINED_glIsQueryARB - GLboolean __stdcall GLee_Lazy_glIsQueryARB(GLuint id) {if (GLeeInit()) return glIsQueryARB(id); return (GLboolean)0;} - GLEEPFNGLISQUERYARBPROC GLeeFuncPtr_glIsQueryARB=GLee_Lazy_glIsQueryARB; -#endif -#ifndef GLEE_C_DEFINED_glBeginQueryARB -#define GLEE_C_DEFINED_glBeginQueryARB - void __stdcall GLee_Lazy_glBeginQueryARB(GLenum target, GLuint id) {if (GLeeInit()) glBeginQueryARB(target, id);} - GLEEPFNGLBEGINQUERYARBPROC GLeeFuncPtr_glBeginQueryARB=GLee_Lazy_glBeginQueryARB; -#endif -#ifndef GLEE_C_DEFINED_glEndQueryARB -#define GLEE_C_DEFINED_glEndQueryARB - void __stdcall GLee_Lazy_glEndQueryARB(GLenum target) {if (GLeeInit()) glEndQueryARB(target);} - GLEEPFNGLENDQUERYARBPROC GLeeFuncPtr_glEndQueryARB=GLee_Lazy_glEndQueryARB; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryivARB -#define GLEE_C_DEFINED_glGetQueryivARB - void __stdcall GLee_Lazy_glGetQueryivARB(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryivARB(target, pname, params);} - GLEEPFNGLGETQUERYIVARBPROC GLeeFuncPtr_glGetQueryivARB=GLee_Lazy_glGetQueryivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryObjectivARB -#define GLEE_C_DEFINED_glGetQueryObjectivARB - void __stdcall GLee_Lazy_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryObjectivARB(id, pname, params);} - GLEEPFNGLGETQUERYOBJECTIVARBPROC GLeeFuncPtr_glGetQueryObjectivARB=GLee_Lazy_glGetQueryObjectivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryObjectuivARB -#define GLEE_C_DEFINED_glGetQueryObjectuivARB - void __stdcall GLee_Lazy_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint * params) {if (GLeeInit()) glGetQueryObjectuivARB(id, pname, params);} - GLEEPFNGLGETQUERYOBJECTUIVARBPROC GLeeFuncPtr_glGetQueryObjectuivARB=GLee_Lazy_glGetQueryObjectuivARB; -#endif -#endif - -/* GL_ARB_shader_objects */ - -#ifdef __GLEE_GL_ARB_shader_objects -#ifndef GLEE_C_DEFINED_glDeleteObjectARB -#define GLEE_C_DEFINED_glDeleteObjectARB - void __stdcall GLee_Lazy_glDeleteObjectARB(GLhandleARB obj) {if (GLeeInit()) glDeleteObjectARB(obj);} - GLEEPFNGLDELETEOBJECTARBPROC GLeeFuncPtr_glDeleteObjectARB=GLee_Lazy_glDeleteObjectARB; -#endif -#ifndef GLEE_C_DEFINED_glGetHandleARB -#define GLEE_C_DEFINED_glGetHandleARB - GLhandleARB __stdcall GLee_Lazy_glGetHandleARB(GLenum pname) {if (GLeeInit()) return glGetHandleARB(pname); return (GLhandleARB)0;} - GLEEPFNGLGETHANDLEARBPROC GLeeFuncPtr_glGetHandleARB=GLee_Lazy_glGetHandleARB; -#endif -#ifndef GLEE_C_DEFINED_glDetachObjectARB -#define GLEE_C_DEFINED_glDetachObjectARB - void __stdcall GLee_Lazy_glDetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj) {if (GLeeInit()) glDetachObjectARB(containerObj, attachedObj);} - GLEEPFNGLDETACHOBJECTARBPROC GLeeFuncPtr_glDetachObjectARB=GLee_Lazy_glDetachObjectARB; -#endif -#ifndef GLEE_C_DEFINED_glCreateShaderObjectARB -#define GLEE_C_DEFINED_glCreateShaderObjectARB - GLhandleARB __stdcall GLee_Lazy_glCreateShaderObjectARB(GLenum shaderType) {if (GLeeInit()) return glCreateShaderObjectARB(shaderType); return (GLhandleARB)0;} - GLEEPFNGLCREATESHADEROBJECTARBPROC GLeeFuncPtr_glCreateShaderObjectARB=GLee_Lazy_glCreateShaderObjectARB; -#endif -#ifndef GLEE_C_DEFINED_glShaderSourceARB -#define GLEE_C_DEFINED_glShaderSourceARB - void __stdcall GLee_Lazy_glShaderSourceARB(GLhandleARB shaderObj, GLsizei count, const GLcharARB* * string, const GLint * length) {if (GLeeInit()) glShaderSourceARB(shaderObj, count, string, length);} - GLEEPFNGLSHADERSOURCEARBPROC GLeeFuncPtr_glShaderSourceARB=GLee_Lazy_glShaderSourceARB; -#endif -#ifndef GLEE_C_DEFINED_glCompileShaderARB -#define GLEE_C_DEFINED_glCompileShaderARB - void __stdcall GLee_Lazy_glCompileShaderARB(GLhandleARB shaderObj) {if (GLeeInit()) glCompileShaderARB(shaderObj);} - GLEEPFNGLCOMPILESHADERARBPROC GLeeFuncPtr_glCompileShaderARB=GLee_Lazy_glCompileShaderARB; -#endif -#ifndef GLEE_C_DEFINED_glCreateProgramObjectARB -#define GLEE_C_DEFINED_glCreateProgramObjectARB - GLhandleARB __stdcall GLee_Lazy_glCreateProgramObjectARB(void) {if (GLeeInit()) return glCreateProgramObjectARB(); return (GLhandleARB)0;} - GLEEPFNGLCREATEPROGRAMOBJECTARBPROC GLeeFuncPtr_glCreateProgramObjectARB=GLee_Lazy_glCreateProgramObjectARB; -#endif -#ifndef GLEE_C_DEFINED_glAttachObjectARB -#define GLEE_C_DEFINED_glAttachObjectARB - void __stdcall GLee_Lazy_glAttachObjectARB(GLhandleARB containerObj, GLhandleARB obj) {if (GLeeInit()) glAttachObjectARB(containerObj, obj);} - GLEEPFNGLATTACHOBJECTARBPROC GLeeFuncPtr_glAttachObjectARB=GLee_Lazy_glAttachObjectARB; -#endif -#ifndef GLEE_C_DEFINED_glLinkProgramARB -#define GLEE_C_DEFINED_glLinkProgramARB - void __stdcall GLee_Lazy_glLinkProgramARB(GLhandleARB programObj) {if (GLeeInit()) glLinkProgramARB(programObj);} - GLEEPFNGLLINKPROGRAMARBPROC GLeeFuncPtr_glLinkProgramARB=GLee_Lazy_glLinkProgramARB; -#endif -#ifndef GLEE_C_DEFINED_glUseProgramObjectARB -#define GLEE_C_DEFINED_glUseProgramObjectARB - void __stdcall GLee_Lazy_glUseProgramObjectARB(GLhandleARB programObj) {if (GLeeInit()) glUseProgramObjectARB(programObj);} - GLEEPFNGLUSEPROGRAMOBJECTARBPROC GLeeFuncPtr_glUseProgramObjectARB=GLee_Lazy_glUseProgramObjectARB; -#endif -#ifndef GLEE_C_DEFINED_glValidateProgramARB -#define GLEE_C_DEFINED_glValidateProgramARB - void __stdcall GLee_Lazy_glValidateProgramARB(GLhandleARB programObj) {if (GLeeInit()) glValidateProgramARB(programObj);} - GLEEPFNGLVALIDATEPROGRAMARBPROC GLeeFuncPtr_glValidateProgramARB=GLee_Lazy_glValidateProgramARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform1fARB -#define GLEE_C_DEFINED_glUniform1fARB - void __stdcall GLee_Lazy_glUniform1fARB(GLint location, GLfloat v0) {if (GLeeInit()) glUniform1fARB(location, v0);} - GLEEPFNGLUNIFORM1FARBPROC GLeeFuncPtr_glUniform1fARB=GLee_Lazy_glUniform1fARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform2fARB -#define GLEE_C_DEFINED_glUniform2fARB - void __stdcall GLee_Lazy_glUniform2fARB(GLint location, GLfloat v0, GLfloat v1) {if (GLeeInit()) glUniform2fARB(location, v0, v1);} - GLEEPFNGLUNIFORM2FARBPROC GLeeFuncPtr_glUniform2fARB=GLee_Lazy_glUniform2fARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform3fARB -#define GLEE_C_DEFINED_glUniform3fARB - void __stdcall GLee_Lazy_glUniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {if (GLeeInit()) glUniform3fARB(location, v0, v1, v2);} - GLEEPFNGLUNIFORM3FARBPROC GLeeFuncPtr_glUniform3fARB=GLee_Lazy_glUniform3fARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform4fARB -#define GLEE_C_DEFINED_glUniform4fARB - void __stdcall GLee_Lazy_glUniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {if (GLeeInit()) glUniform4fARB(location, v0, v1, v2, v3);} - GLEEPFNGLUNIFORM4FARBPROC GLeeFuncPtr_glUniform4fARB=GLee_Lazy_glUniform4fARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform1iARB -#define GLEE_C_DEFINED_glUniform1iARB - void __stdcall GLee_Lazy_glUniform1iARB(GLint location, GLint v0) {if (GLeeInit()) glUniform1iARB(location, v0);} - GLEEPFNGLUNIFORM1IARBPROC GLeeFuncPtr_glUniform1iARB=GLee_Lazy_glUniform1iARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform2iARB -#define GLEE_C_DEFINED_glUniform2iARB - void __stdcall GLee_Lazy_glUniform2iARB(GLint location, GLint v0, GLint v1) {if (GLeeInit()) glUniform2iARB(location, v0, v1);} - GLEEPFNGLUNIFORM2IARBPROC GLeeFuncPtr_glUniform2iARB=GLee_Lazy_glUniform2iARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform3iARB -#define GLEE_C_DEFINED_glUniform3iARB - void __stdcall GLee_Lazy_glUniform3iARB(GLint location, GLint v0, GLint v1, GLint v2) {if (GLeeInit()) glUniform3iARB(location, v0, v1, v2);} - GLEEPFNGLUNIFORM3IARBPROC GLeeFuncPtr_glUniform3iARB=GLee_Lazy_glUniform3iARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform4iARB -#define GLEE_C_DEFINED_glUniform4iARB - void __stdcall GLee_Lazy_glUniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {if (GLeeInit()) glUniform4iARB(location, v0, v1, v2, v3);} - GLEEPFNGLUNIFORM4IARBPROC GLeeFuncPtr_glUniform4iARB=GLee_Lazy_glUniform4iARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform1fvARB -#define GLEE_C_DEFINED_glUniform1fvARB - void __stdcall GLee_Lazy_glUniform1fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform1fvARB(location, count, value);} - GLEEPFNGLUNIFORM1FVARBPROC GLeeFuncPtr_glUniform1fvARB=GLee_Lazy_glUniform1fvARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform2fvARB -#define GLEE_C_DEFINED_glUniform2fvARB - void __stdcall GLee_Lazy_glUniform2fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform2fvARB(location, count, value);} - GLEEPFNGLUNIFORM2FVARBPROC GLeeFuncPtr_glUniform2fvARB=GLee_Lazy_glUniform2fvARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform3fvARB -#define GLEE_C_DEFINED_glUniform3fvARB - void __stdcall GLee_Lazy_glUniform3fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform3fvARB(location, count, value);} - GLEEPFNGLUNIFORM3FVARBPROC GLeeFuncPtr_glUniform3fvARB=GLee_Lazy_glUniform3fvARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform4fvARB -#define GLEE_C_DEFINED_glUniform4fvARB - void __stdcall GLee_Lazy_glUniform4fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform4fvARB(location, count, value);} - GLEEPFNGLUNIFORM4FVARBPROC GLeeFuncPtr_glUniform4fvARB=GLee_Lazy_glUniform4fvARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform1ivARB -#define GLEE_C_DEFINED_glUniform1ivARB - void __stdcall GLee_Lazy_glUniform1ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform1ivARB(location, count, value);} - GLEEPFNGLUNIFORM1IVARBPROC GLeeFuncPtr_glUniform1ivARB=GLee_Lazy_glUniform1ivARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform2ivARB -#define GLEE_C_DEFINED_glUniform2ivARB - void __stdcall GLee_Lazy_glUniform2ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform2ivARB(location, count, value);} - GLEEPFNGLUNIFORM2IVARBPROC GLeeFuncPtr_glUniform2ivARB=GLee_Lazy_glUniform2ivARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform3ivARB -#define GLEE_C_DEFINED_glUniform3ivARB - void __stdcall GLee_Lazy_glUniform3ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform3ivARB(location, count, value);} - GLEEPFNGLUNIFORM3IVARBPROC GLeeFuncPtr_glUniform3ivARB=GLee_Lazy_glUniform3ivARB; -#endif -#ifndef GLEE_C_DEFINED_glUniform4ivARB -#define GLEE_C_DEFINED_glUniform4ivARB - void __stdcall GLee_Lazy_glUniform4ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform4ivARB(location, count, value);} - GLEEPFNGLUNIFORM4IVARBPROC GLeeFuncPtr_glUniform4ivARB=GLee_Lazy_glUniform4ivARB; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix2fvARB -#define GLEE_C_DEFINED_glUniformMatrix2fvARB - void __stdcall GLee_Lazy_glUniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2fvARB(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX2FVARBPROC GLeeFuncPtr_glUniformMatrix2fvARB=GLee_Lazy_glUniformMatrix2fvARB; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix3fvARB -#define GLEE_C_DEFINED_glUniformMatrix3fvARB - void __stdcall GLee_Lazy_glUniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3fvARB(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX3FVARBPROC GLeeFuncPtr_glUniformMatrix3fvARB=GLee_Lazy_glUniformMatrix3fvARB; -#endif -#ifndef GLEE_C_DEFINED_glUniformMatrix4fvARB -#define GLEE_C_DEFINED_glUniformMatrix4fvARB - void __stdcall GLee_Lazy_glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4fvARB(location, count, transpose, value);} - GLEEPFNGLUNIFORMMATRIX4FVARBPROC GLeeFuncPtr_glUniformMatrix4fvARB=GLee_Lazy_glUniformMatrix4fvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetObjectParameterfvARB -#define GLEE_C_DEFINED_glGetObjectParameterfvARB - void __stdcall GLee_Lazy_glGetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetObjectParameterfvARB(obj, pname, params);} - GLEEPFNGLGETOBJECTPARAMETERFVARBPROC GLeeFuncPtr_glGetObjectParameterfvARB=GLee_Lazy_glGetObjectParameterfvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetObjectParameterivARB -#define GLEE_C_DEFINED_glGetObjectParameterivARB - void __stdcall GLee_Lazy_glGetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params) {if (GLeeInit()) glGetObjectParameterivARB(obj, pname, params);} - GLEEPFNGLGETOBJECTPARAMETERIVARBPROC GLeeFuncPtr_glGetObjectParameterivARB=GLee_Lazy_glGetObjectParameterivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetInfoLogARB -#define GLEE_C_DEFINED_glGetInfoLogARB - void __stdcall GLee_Lazy_glGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog) {if (GLeeInit()) glGetInfoLogARB(obj, maxLength, length, infoLog);} - GLEEPFNGLGETINFOLOGARBPROC GLeeFuncPtr_glGetInfoLogARB=GLee_Lazy_glGetInfoLogARB; -#endif -#ifndef GLEE_C_DEFINED_glGetAttachedObjectsARB -#define GLEE_C_DEFINED_glGetAttachedObjectsARB - void __stdcall GLee_Lazy_glGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj) {if (GLeeInit()) glGetAttachedObjectsARB(containerObj, maxCount, count, obj);} - GLEEPFNGLGETATTACHEDOBJECTSARBPROC GLeeFuncPtr_glGetAttachedObjectsARB=GLee_Lazy_glGetAttachedObjectsARB; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformLocationARB -#define GLEE_C_DEFINED_glGetUniformLocationARB - GLint __stdcall GLee_Lazy_glGetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name) {if (GLeeInit()) return glGetUniformLocationARB(programObj, name); return (GLint)0;} - GLEEPFNGLGETUNIFORMLOCATIONARBPROC GLeeFuncPtr_glGetUniformLocationARB=GLee_Lazy_glGetUniformLocationARB; -#endif -#ifndef GLEE_C_DEFINED_glGetActiveUniformARB -#define GLEE_C_DEFINED_glGetActiveUniformARB - void __stdcall GLee_Lazy_glGetActiveUniformARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name) {if (GLeeInit()) glGetActiveUniformARB(programObj, index, maxLength, length, size, type, name);} - GLEEPFNGLGETACTIVEUNIFORMARBPROC GLeeFuncPtr_glGetActiveUniformARB=GLee_Lazy_glGetActiveUniformARB; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformfvARB -#define GLEE_C_DEFINED_glGetUniformfvARB - void __stdcall GLee_Lazy_glGetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params) {if (GLeeInit()) glGetUniformfvARB(programObj, location, params);} - GLEEPFNGLGETUNIFORMFVARBPROC GLeeFuncPtr_glGetUniformfvARB=GLee_Lazy_glGetUniformfvARB; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformivARB -#define GLEE_C_DEFINED_glGetUniformivARB - void __stdcall GLee_Lazy_glGetUniformivARB(GLhandleARB programObj, GLint location, GLint * params) {if (GLeeInit()) glGetUniformivARB(programObj, location, params);} - GLEEPFNGLGETUNIFORMIVARBPROC GLeeFuncPtr_glGetUniformivARB=GLee_Lazy_glGetUniformivARB; -#endif -#ifndef GLEE_C_DEFINED_glGetShaderSourceARB -#define GLEE_C_DEFINED_glGetShaderSourceARB - void __stdcall GLee_Lazy_glGetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source) {if (GLeeInit()) glGetShaderSourceARB(obj, maxLength, length, source);} - GLEEPFNGLGETSHADERSOURCEARBPROC GLeeFuncPtr_glGetShaderSourceARB=GLee_Lazy_glGetShaderSourceARB; -#endif -#endif - -/* GL_ARB_vertex_shader */ - -#ifdef __GLEE_GL_ARB_vertex_shader -#ifndef GLEE_C_DEFINED_glBindAttribLocationARB -#define GLEE_C_DEFINED_glBindAttribLocationARB - void __stdcall GLee_Lazy_glBindAttribLocationARB(GLhandleARB programObj, GLuint index, const GLcharARB * name) {if (GLeeInit()) glBindAttribLocationARB(programObj, index, name);} - GLEEPFNGLBINDATTRIBLOCATIONARBPROC GLeeFuncPtr_glBindAttribLocationARB=GLee_Lazy_glBindAttribLocationARB; -#endif -#ifndef GLEE_C_DEFINED_glGetActiveAttribARB -#define GLEE_C_DEFINED_glGetActiveAttribARB - void __stdcall GLee_Lazy_glGetActiveAttribARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name) {if (GLeeInit()) glGetActiveAttribARB(programObj, index, maxLength, length, size, type, name);} - GLEEPFNGLGETACTIVEATTRIBARBPROC GLeeFuncPtr_glGetActiveAttribARB=GLee_Lazy_glGetActiveAttribARB; -#endif -#ifndef GLEE_C_DEFINED_glGetAttribLocationARB -#define GLEE_C_DEFINED_glGetAttribLocationARB - GLint __stdcall GLee_Lazy_glGetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name) {if (GLeeInit()) return glGetAttribLocationARB(programObj, name); return (GLint)0;} - GLEEPFNGLGETATTRIBLOCATIONARBPROC GLeeFuncPtr_glGetAttribLocationARB=GLee_Lazy_glGetAttribLocationARB; -#endif -#endif - -/* GL_ARB_fragment_shader */ - -#ifdef __GLEE_GL_ARB_fragment_shader -#endif - -/* GL_ARB_shading_language_100 */ - -#ifdef __GLEE_GL_ARB_shading_language_100 -#endif - -/* GL_ARB_texture_non_power_of_two */ - -#ifdef __GLEE_GL_ARB_texture_non_power_of_two -#endif - -/* GL_ARB_point_sprite */ - -#ifdef __GLEE_GL_ARB_point_sprite -#endif - -/* GL_ARB_fragment_program_shadow */ - -#ifdef __GLEE_GL_ARB_fragment_program_shadow -#endif - -/* GL_ARB_draw_buffers */ - -#ifdef __GLEE_GL_ARB_draw_buffers -#ifndef GLEE_C_DEFINED_glDrawBuffersARB -#define GLEE_C_DEFINED_glDrawBuffersARB - void __stdcall GLee_Lazy_glDrawBuffersARB(GLsizei n, const GLenum * bufs) {if (GLeeInit()) glDrawBuffersARB(n, bufs);} - GLEEPFNGLDRAWBUFFERSARBPROC GLeeFuncPtr_glDrawBuffersARB=GLee_Lazy_glDrawBuffersARB; -#endif -#endif - -/* GL_ARB_texture_rectangle */ - -#ifdef __GLEE_GL_ARB_texture_rectangle -#endif - -/* GL_ARB_color_buffer_float */ - -#ifdef __GLEE_GL_ARB_color_buffer_float -#ifndef GLEE_C_DEFINED_glClampColorARB -#define GLEE_C_DEFINED_glClampColorARB - void __stdcall GLee_Lazy_glClampColorARB(GLenum target, GLenum clamp) {if (GLeeInit()) glClampColorARB(target, clamp);} - GLEEPFNGLCLAMPCOLORARBPROC GLeeFuncPtr_glClampColorARB=GLee_Lazy_glClampColorARB; -#endif -#endif - -/* GL_ARB_half_float_pixel */ - -#ifdef __GLEE_GL_ARB_half_float_pixel -#endif - -/* GL_ARB_texture_float */ - -#ifdef __GLEE_GL_ARB_texture_float -#endif - -/* GL_ARB_pixel_buffer_object */ - -#ifdef __GLEE_GL_ARB_pixel_buffer_object -#endif - -/* GL_ARB_depth_buffer_float */ - -#ifdef __GLEE_GL_ARB_depth_buffer_float -#endif - -/* GL_ARB_draw_instanced */ - -#ifdef __GLEE_GL_ARB_draw_instanced -#ifndef GLEE_C_DEFINED_glDrawArraysInstancedARB -#define GLEE_C_DEFINED_glDrawArraysInstancedARB - void __stdcall GLee_Lazy_glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount) {if (GLeeInit()) glDrawArraysInstancedARB(mode, first, count, primcount);} - GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC GLeeFuncPtr_glDrawArraysInstancedARB=GLee_Lazy_glDrawArraysInstancedARB; -#endif -#ifndef GLEE_C_DEFINED_glDrawElementsInstancedARB -#define GLEE_C_DEFINED_glDrawElementsInstancedARB - void __stdcall GLee_Lazy_glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount) {if (GLeeInit()) glDrawElementsInstancedARB(mode, count, type, indices, primcount);} - GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC GLeeFuncPtr_glDrawElementsInstancedARB=GLee_Lazy_glDrawElementsInstancedARB; -#endif -#endif - -/* GL_ARB_framebuffer_object */ - -#ifdef __GLEE_GL_ARB_framebuffer_object -#ifndef GLEE_C_DEFINED_glIsRenderbuffer -#define GLEE_C_DEFINED_glIsRenderbuffer - GLboolean __stdcall GLee_Lazy_glIsRenderbuffer(GLuint renderbuffer) {if (GLeeInit()) return glIsRenderbuffer(renderbuffer); return (GLboolean)0;} - GLEEPFNGLISRENDERBUFFERPROC GLeeFuncPtr_glIsRenderbuffer=GLee_Lazy_glIsRenderbuffer; -#endif -#ifndef GLEE_C_DEFINED_glBindRenderbuffer -#define GLEE_C_DEFINED_glBindRenderbuffer - void __stdcall GLee_Lazy_glBindRenderbuffer(GLenum target, GLuint renderbuffer) {if (GLeeInit()) glBindRenderbuffer(target, renderbuffer);} - GLEEPFNGLBINDRENDERBUFFERPROC GLeeFuncPtr_glBindRenderbuffer=GLee_Lazy_glBindRenderbuffer; -#endif -#ifndef GLEE_C_DEFINED_glDeleteRenderbuffers -#define GLEE_C_DEFINED_glDeleteRenderbuffers - void __stdcall GLee_Lazy_glDeleteRenderbuffers(GLsizei n, const GLuint * renderbuffers) {if (GLeeInit()) glDeleteRenderbuffers(n, renderbuffers);} - GLEEPFNGLDELETERENDERBUFFERSPROC GLeeFuncPtr_glDeleteRenderbuffers=GLee_Lazy_glDeleteRenderbuffers; -#endif -#ifndef GLEE_C_DEFINED_glGenRenderbuffers -#define GLEE_C_DEFINED_glGenRenderbuffers - void __stdcall GLee_Lazy_glGenRenderbuffers(GLsizei n, GLuint * renderbuffers) {if (GLeeInit()) glGenRenderbuffers(n, renderbuffers);} - GLEEPFNGLGENRENDERBUFFERSPROC GLeeFuncPtr_glGenRenderbuffers=GLee_Lazy_glGenRenderbuffers; -#endif -#ifndef GLEE_C_DEFINED_glRenderbufferStorage -#define GLEE_C_DEFINED_glRenderbufferStorage - void __stdcall GLee_Lazy_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorage(target, internalformat, width, height);} - GLEEPFNGLRENDERBUFFERSTORAGEPROC GLeeFuncPtr_glRenderbufferStorage=GLee_Lazy_glRenderbufferStorage; -#endif -#ifndef GLEE_C_DEFINED_glGetRenderbufferParameteriv -#define GLEE_C_DEFINED_glGetRenderbufferParameteriv - void __stdcall GLee_Lazy_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetRenderbufferParameteriv(target, pname, params);} - GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetRenderbufferParameteriv=GLee_Lazy_glGetRenderbufferParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glIsFramebuffer -#define GLEE_C_DEFINED_glIsFramebuffer - GLboolean __stdcall GLee_Lazy_glIsFramebuffer(GLuint framebuffer) {if (GLeeInit()) return glIsFramebuffer(framebuffer); return (GLboolean)0;} - GLEEPFNGLISFRAMEBUFFERPROC GLeeFuncPtr_glIsFramebuffer=GLee_Lazy_glIsFramebuffer; -#endif -#ifndef GLEE_C_DEFINED_glBindFramebuffer -#define GLEE_C_DEFINED_glBindFramebuffer - void __stdcall GLee_Lazy_glBindFramebuffer(GLenum target, GLuint framebuffer) {if (GLeeInit()) glBindFramebuffer(target, framebuffer);} - GLEEPFNGLBINDFRAMEBUFFERPROC GLeeFuncPtr_glBindFramebuffer=GLee_Lazy_glBindFramebuffer; -#endif -#ifndef GLEE_C_DEFINED_glDeleteFramebuffers -#define GLEE_C_DEFINED_glDeleteFramebuffers - void __stdcall GLee_Lazy_glDeleteFramebuffers(GLsizei n, const GLuint * framebuffers) {if (GLeeInit()) glDeleteFramebuffers(n, framebuffers);} - GLEEPFNGLDELETEFRAMEBUFFERSPROC GLeeFuncPtr_glDeleteFramebuffers=GLee_Lazy_glDeleteFramebuffers; -#endif -#ifndef GLEE_C_DEFINED_glGenFramebuffers -#define GLEE_C_DEFINED_glGenFramebuffers - void __stdcall GLee_Lazy_glGenFramebuffers(GLsizei n, GLuint * framebuffers) {if (GLeeInit()) glGenFramebuffers(n, framebuffers);} - GLEEPFNGLGENFRAMEBUFFERSPROC GLeeFuncPtr_glGenFramebuffers=GLee_Lazy_glGenFramebuffers; -#endif -#ifndef GLEE_C_DEFINED_glCheckFramebufferStatus -#define GLEE_C_DEFINED_glCheckFramebufferStatus - GLenum __stdcall GLee_Lazy_glCheckFramebufferStatus(GLenum target) {if (GLeeInit()) return glCheckFramebufferStatus(target); return (GLenum)0;} - GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC GLeeFuncPtr_glCheckFramebufferStatus=GLee_Lazy_glCheckFramebufferStatus; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTexture1D -#define GLEE_C_DEFINED_glFramebufferTexture1D - void __stdcall GLee_Lazy_glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture1D(target, attachment, textarget, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC GLeeFuncPtr_glFramebufferTexture1D=GLee_Lazy_glFramebufferTexture1D; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTexture2D -#define GLEE_C_DEFINED_glFramebufferTexture2D - void __stdcall GLee_Lazy_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture2D(target, attachment, textarget, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC GLeeFuncPtr_glFramebufferTexture2D=GLee_Lazy_glFramebufferTexture2D; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTexture3D -#define GLEE_C_DEFINED_glFramebufferTexture3D - void __stdcall GLee_Lazy_glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {if (GLeeInit()) glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);} - GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC GLeeFuncPtr_glFramebufferTexture3D=GLee_Lazy_glFramebufferTexture3D; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferRenderbuffer -#define GLEE_C_DEFINED_glFramebufferRenderbuffer - void __stdcall GLee_Lazy_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {if (GLeeInit()) glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);} - GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC GLeeFuncPtr_glFramebufferRenderbuffer=GLee_Lazy_glFramebufferRenderbuffer; -#endif -#ifndef GLEE_C_DEFINED_glGetFramebufferAttachmentParameteriv -#define GLEE_C_DEFINED_glGetFramebufferAttachmentParameteriv - void __stdcall GLee_Lazy_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint * params) {if (GLeeInit()) glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);} - GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GLeeFuncPtr_glGetFramebufferAttachmentParameteriv=GLee_Lazy_glGetFramebufferAttachmentParameteriv; -#endif -#ifndef GLEE_C_DEFINED_glGenerateMipmap -#define GLEE_C_DEFINED_glGenerateMipmap - void __stdcall GLee_Lazy_glGenerateMipmap(GLenum target) {if (GLeeInit()) glGenerateMipmap(target);} - GLEEPFNGLGENERATEMIPMAPPROC GLeeFuncPtr_glGenerateMipmap=GLee_Lazy_glGenerateMipmap; -#endif -#ifndef GLEE_C_DEFINED_glBlitFramebuffer -#define GLEE_C_DEFINED_glBlitFramebuffer - void __stdcall GLee_Lazy_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {if (GLeeInit()) glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);} - GLEEPFNGLBLITFRAMEBUFFERPROC GLeeFuncPtr_glBlitFramebuffer=GLee_Lazy_glBlitFramebuffer; -#endif -#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisample -#define GLEE_C_DEFINED_glRenderbufferStorageMultisample - void __stdcall GLee_Lazy_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageMultisample(target, samples, internalformat, width, height);} - GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC GLeeFuncPtr_glRenderbufferStorageMultisample=GLee_Lazy_glRenderbufferStorageMultisample; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureLayer -#define GLEE_C_DEFINED_glFramebufferTextureLayer - void __stdcall GLee_Lazy_glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayer(target, attachment, texture, level, layer);} - GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC GLeeFuncPtr_glFramebufferTextureLayer=GLee_Lazy_glFramebufferTextureLayer; -#endif -#endif - -/* GL_ARB_framebuffer_sRGB */ - -#ifdef __GLEE_GL_ARB_framebuffer_sRGB -#endif - -/* GL_ARB_geometry_shader4 */ - -#ifdef __GLEE_GL_ARB_geometry_shader4 -#ifndef GLEE_C_DEFINED_glProgramParameteriARB -#define GLEE_C_DEFINED_glProgramParameteriARB - void __stdcall GLee_Lazy_glProgramParameteriARB(GLuint program, GLenum pname, GLint value) {if (GLeeInit()) glProgramParameteriARB(program, pname, value);} - GLEEPFNGLPROGRAMPARAMETERIARBPROC GLeeFuncPtr_glProgramParameteriARB=GLee_Lazy_glProgramParameteriARB; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureARB -#define GLEE_C_DEFINED_glFramebufferTextureARB - void __stdcall GLee_Lazy_glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTextureARB(target, attachment, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC GLeeFuncPtr_glFramebufferTextureARB=GLee_Lazy_glFramebufferTextureARB; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerARB -#define GLEE_C_DEFINED_glFramebufferTextureLayerARB - void __stdcall GLee_Lazy_glFramebufferTextureLayerARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayerARB(target, attachment, texture, level, layer);} - GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC GLeeFuncPtr_glFramebufferTextureLayerARB=GLee_Lazy_glFramebufferTextureLayerARB; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceARB -#define GLEE_C_DEFINED_glFramebufferTextureFaceARB - void __stdcall GLee_Lazy_glFramebufferTextureFaceARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glFramebufferTextureFaceARB(target, attachment, texture, level, face);} - GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC GLeeFuncPtr_glFramebufferTextureFaceARB=GLee_Lazy_glFramebufferTextureFaceARB; -#endif -#endif - -/* GL_ARB_half_float_vertex */ - -#ifdef __GLEE_GL_ARB_half_float_vertex -#endif - -/* GL_ARB_instanced_arrays */ - -#ifdef __GLEE_GL_ARB_instanced_arrays -#ifndef GLEE_C_DEFINED_glVertexAttribDivisor -#define GLEE_C_DEFINED_glVertexAttribDivisor - void __stdcall GLee_Lazy_glVertexAttribDivisor(GLuint index, GLuint divisor) {if (GLeeInit()) glVertexAttribDivisor(index, divisor);} - GLEEPFNGLVERTEXATTRIBDIVISORPROC GLeeFuncPtr_glVertexAttribDivisor=GLee_Lazy_glVertexAttribDivisor; -#endif -#endif - -/* GL_ARB_map_buffer_range */ - -#ifdef __GLEE_GL_ARB_map_buffer_range -#ifndef GLEE_C_DEFINED_glMapBufferRange -#define GLEE_C_DEFINED_glMapBufferRange - void __stdcall GLee_Lazy_glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {if (GLeeInit()) glMapBufferRange(target, offset, length, access);} - GLEEPFNGLMAPBUFFERRANGEPROC GLeeFuncPtr_glMapBufferRange=GLee_Lazy_glMapBufferRange; -#endif -#ifndef GLEE_C_DEFINED_glFlushMappedBufferRange -#define GLEE_C_DEFINED_glFlushMappedBufferRange - void __stdcall GLee_Lazy_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) {if (GLeeInit()) glFlushMappedBufferRange(target, offset, length);} - GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC GLeeFuncPtr_glFlushMappedBufferRange=GLee_Lazy_glFlushMappedBufferRange; -#endif -#endif - -/* GL_ARB_texture_buffer_object */ - -#ifdef __GLEE_GL_ARB_texture_buffer_object -#ifndef GLEE_C_DEFINED_glTexBufferARB -#define GLEE_C_DEFINED_glTexBufferARB - void __stdcall GLee_Lazy_glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glTexBufferARB(target, internalformat, buffer);} - GLEEPFNGLTEXBUFFERARBPROC GLeeFuncPtr_glTexBufferARB=GLee_Lazy_glTexBufferARB; -#endif -#endif - -/* GL_ARB_texture_compression_rgtc */ - -#ifdef __GLEE_GL_ARB_texture_compression_rgtc -#endif - -/* GL_ARB_texture_rg */ - -#ifdef __GLEE_GL_ARB_texture_rg -#endif - -/* GL_ARB_vertex_array_object */ - -#ifdef __GLEE_GL_ARB_vertex_array_object -#ifndef GLEE_C_DEFINED_glBindVertexArray -#define GLEE_C_DEFINED_glBindVertexArray - void __stdcall GLee_Lazy_glBindVertexArray(GLuint array) {if (GLeeInit()) glBindVertexArray(array);} - GLEEPFNGLBINDVERTEXARRAYPROC GLeeFuncPtr_glBindVertexArray=GLee_Lazy_glBindVertexArray; -#endif -#ifndef GLEE_C_DEFINED_glDeleteVertexArrays -#define GLEE_C_DEFINED_glDeleteVertexArrays - void __stdcall GLee_Lazy_glDeleteVertexArrays(GLsizei n, const GLuint * arrays) {if (GLeeInit()) glDeleteVertexArrays(n, arrays);} - GLEEPFNGLDELETEVERTEXARRAYSPROC GLeeFuncPtr_glDeleteVertexArrays=GLee_Lazy_glDeleteVertexArrays; -#endif -#ifndef GLEE_C_DEFINED_glGenVertexArrays -#define GLEE_C_DEFINED_glGenVertexArrays - void __stdcall GLee_Lazy_glGenVertexArrays(GLsizei n, GLuint * arrays) {if (GLeeInit()) glGenVertexArrays(n, arrays);} - GLEEPFNGLGENVERTEXARRAYSPROC GLeeFuncPtr_glGenVertexArrays=GLee_Lazy_glGenVertexArrays; -#endif -#ifndef GLEE_C_DEFINED_glIsVertexArray -#define GLEE_C_DEFINED_glIsVertexArray - GLboolean __stdcall GLee_Lazy_glIsVertexArray(GLuint array) {if (GLeeInit()) return glIsVertexArray(array); return (GLboolean)0;} - GLEEPFNGLISVERTEXARRAYPROC GLeeFuncPtr_glIsVertexArray=GLee_Lazy_glIsVertexArray; -#endif -#endif - -/* GL_EXT_abgr */ - -#ifdef __GLEE_GL_EXT_abgr -#endif - -/* GL_EXT_blend_color */ - -#ifdef __GLEE_GL_EXT_blend_color -#ifndef GLEE_C_DEFINED_glBlendColorEXT -#define GLEE_C_DEFINED_glBlendColorEXT - void __stdcall GLee_Lazy_glBlendColorEXT(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {if (GLeeInit()) glBlendColorEXT(red, green, blue, alpha);} - GLEEPFNGLBLENDCOLOREXTPROC GLeeFuncPtr_glBlendColorEXT=GLee_Lazy_glBlendColorEXT; -#endif -#endif - -/* GL_EXT_polygon_offset */ - -#ifdef __GLEE_GL_EXT_polygon_offset -#ifndef GLEE_C_DEFINED_glPolygonOffsetEXT -#define GLEE_C_DEFINED_glPolygonOffsetEXT - void __stdcall GLee_Lazy_glPolygonOffsetEXT(GLfloat factor, GLfloat bias) {if (GLeeInit()) glPolygonOffsetEXT(factor, bias);} - GLEEPFNGLPOLYGONOFFSETEXTPROC GLeeFuncPtr_glPolygonOffsetEXT=GLee_Lazy_glPolygonOffsetEXT; -#endif -#endif - -/* GL_EXT_texture */ - -#ifdef __GLEE_GL_EXT_texture -#endif - -/* GL_EXT_texture3D */ - -#ifdef __GLEE_GL_EXT_texture3D -#ifndef GLEE_C_DEFINED_glTexImage3DEXT -#define GLEE_C_DEFINED_glTexImage3DEXT - void __stdcall GLee_Lazy_glTexImage3DEXT(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexImage3DEXT(target, level, internalformat, width, height, depth, border, format, type, pixels);} - GLEEPFNGLTEXIMAGE3DEXTPROC GLeeFuncPtr_glTexImage3DEXT=GLee_Lazy_glTexImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glTexSubImage3DEXT -#define GLEE_C_DEFINED_glTexSubImage3DEXT - void __stdcall GLee_Lazy_glTexSubImage3DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} - GLEEPFNGLTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glTexSubImage3DEXT=GLee_Lazy_glTexSubImage3DEXT; -#endif -#endif - -/* GL_SGIS_texture_filter4 */ - -#ifdef __GLEE_GL_SGIS_texture_filter4 -#ifndef GLEE_C_DEFINED_glGetTexFilterFuncSGIS -#define GLEE_C_DEFINED_glGetTexFilterFuncSGIS - void __stdcall GLee_Lazy_glGetTexFilterFuncSGIS(GLenum target, GLenum filter, GLfloat * weights) {if (GLeeInit()) glGetTexFilterFuncSGIS(target, filter, weights);} - GLEEPFNGLGETTEXFILTERFUNCSGISPROC GLeeFuncPtr_glGetTexFilterFuncSGIS=GLee_Lazy_glGetTexFilterFuncSGIS; -#endif -#ifndef GLEE_C_DEFINED_glTexFilterFuncSGIS -#define GLEE_C_DEFINED_glTexFilterFuncSGIS - void __stdcall GLee_Lazy_glTexFilterFuncSGIS(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights) {if (GLeeInit()) glTexFilterFuncSGIS(target, filter, n, weights);} - GLEEPFNGLTEXFILTERFUNCSGISPROC GLeeFuncPtr_glTexFilterFuncSGIS=GLee_Lazy_glTexFilterFuncSGIS; -#endif -#endif - -/* GL_EXT_subtexture */ - -#ifdef __GLEE_GL_EXT_subtexture -#ifndef GLEE_C_DEFINED_glTexSubImage1DEXT -#define GLEE_C_DEFINED_glTexSubImage1DEXT - void __stdcall GLee_Lazy_glTexSubImage1DEXT(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage1DEXT(target, level, xoffset, width, format, type, pixels);} - GLEEPFNGLTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glTexSubImage1DEXT=GLee_Lazy_glTexSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glTexSubImage2DEXT -#define GLEE_C_DEFINED_glTexSubImage2DEXT - void __stdcall GLee_Lazy_glTexSubImage2DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage2DEXT(target, level, xoffset, yoffset, width, height, format, type, pixels);} - GLEEPFNGLTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glTexSubImage2DEXT=GLee_Lazy_glTexSubImage2DEXT; -#endif -#endif - -/* GL_EXT_copy_texture */ - -#ifdef __GLEE_GL_EXT_copy_texture -#ifndef GLEE_C_DEFINED_glCopyTexImage1DEXT -#define GLEE_C_DEFINED_glCopyTexImage1DEXT - void __stdcall GLee_Lazy_glCopyTexImage1DEXT(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) {if (GLeeInit()) glCopyTexImage1DEXT(target, level, internalformat, x, y, width, border);} - GLEEPFNGLCOPYTEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexImage1DEXT=GLee_Lazy_glCopyTexImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTexImage2DEXT -#define GLEE_C_DEFINED_glCopyTexImage2DEXT - void __stdcall GLee_Lazy_glCopyTexImage2DEXT(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {if (GLeeInit()) glCopyTexImage2DEXT(target, level, internalformat, x, y, width, height, border);} - GLEEPFNGLCOPYTEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexImage2DEXT=GLee_Lazy_glCopyTexImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTexSubImage1DEXT -#define GLEE_C_DEFINED_glCopyTexSubImage1DEXT - void __stdcall GLee_Lazy_glCopyTexSubImage1DEXT(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyTexSubImage1DEXT(target, level, xoffset, x, y, width);} - GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexSubImage1DEXT=GLee_Lazy_glCopyTexSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTexSubImage2DEXT -#define GLEE_C_DEFINED_glCopyTexSubImage2DEXT - void __stdcall GLee_Lazy_glCopyTexSubImage2DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height);} - GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexSubImage2DEXT=GLee_Lazy_glCopyTexSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTexSubImage3DEXT -#define GLEE_C_DEFINED_glCopyTexSubImage3DEXT - void __stdcall GLee_Lazy_glCopyTexSubImage3DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height);} - GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTexSubImage3DEXT=GLee_Lazy_glCopyTexSubImage3DEXT; -#endif -#endif - -/* GL_EXT_histogram */ - -#ifdef __GLEE_GL_EXT_histogram -#ifndef GLEE_C_DEFINED_glGetHistogramEXT -#define GLEE_C_DEFINED_glGetHistogramEXT - void __stdcall GLee_Lazy_glGetHistogramEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetHistogramEXT(target, reset, format, type, values);} - GLEEPFNGLGETHISTOGRAMEXTPROC GLeeFuncPtr_glGetHistogramEXT=GLee_Lazy_glGetHistogramEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetHistogramParameterfvEXT -#define GLEE_C_DEFINED_glGetHistogramParameterfvEXT - void __stdcall GLee_Lazy_glGetHistogramParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetHistogramParameterfvEXT(target, pname, params);} - GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC GLeeFuncPtr_glGetHistogramParameterfvEXT=GLee_Lazy_glGetHistogramParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetHistogramParameterivEXT -#define GLEE_C_DEFINED_glGetHistogramParameterivEXT - void __stdcall GLee_Lazy_glGetHistogramParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetHistogramParameterivEXT(target, pname, params);} - GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC GLeeFuncPtr_glGetHistogramParameterivEXT=GLee_Lazy_glGetHistogramParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMinmaxEXT -#define GLEE_C_DEFINED_glGetMinmaxEXT - void __stdcall GLee_Lazy_glGetMinmaxEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetMinmaxEXT(target, reset, format, type, values);} - GLEEPFNGLGETMINMAXEXTPROC GLeeFuncPtr_glGetMinmaxEXT=GLee_Lazy_glGetMinmaxEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMinmaxParameterfvEXT -#define GLEE_C_DEFINED_glGetMinmaxParameterfvEXT - void __stdcall GLee_Lazy_glGetMinmaxParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMinmaxParameterfvEXT(target, pname, params);} - GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMinmaxParameterfvEXT=GLee_Lazy_glGetMinmaxParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMinmaxParameterivEXT -#define GLEE_C_DEFINED_glGetMinmaxParameterivEXT - void __stdcall GLee_Lazy_glGetMinmaxParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMinmaxParameterivEXT(target, pname, params);} - GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMinmaxParameterivEXT=GLee_Lazy_glGetMinmaxParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glHistogramEXT -#define GLEE_C_DEFINED_glHistogramEXT - void __stdcall GLee_Lazy_glHistogramEXT(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glHistogramEXT(target, width, internalformat, sink);} - GLEEPFNGLHISTOGRAMEXTPROC GLeeFuncPtr_glHistogramEXT=GLee_Lazy_glHistogramEXT; -#endif -#ifndef GLEE_C_DEFINED_glMinmaxEXT -#define GLEE_C_DEFINED_glMinmaxEXT - void __stdcall GLee_Lazy_glMinmaxEXT(GLenum target, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glMinmaxEXT(target, internalformat, sink);} - GLEEPFNGLMINMAXEXTPROC GLeeFuncPtr_glMinmaxEXT=GLee_Lazy_glMinmaxEXT; -#endif -#ifndef GLEE_C_DEFINED_glResetHistogramEXT -#define GLEE_C_DEFINED_glResetHistogramEXT - void __stdcall GLee_Lazy_glResetHistogramEXT(GLenum target) {if (GLeeInit()) glResetHistogramEXT(target);} - GLEEPFNGLRESETHISTOGRAMEXTPROC GLeeFuncPtr_glResetHistogramEXT=GLee_Lazy_glResetHistogramEXT; -#endif -#ifndef GLEE_C_DEFINED_glResetMinmaxEXT -#define GLEE_C_DEFINED_glResetMinmaxEXT - void __stdcall GLee_Lazy_glResetMinmaxEXT(GLenum target) {if (GLeeInit()) glResetMinmaxEXT(target);} - GLEEPFNGLRESETMINMAXEXTPROC GLeeFuncPtr_glResetMinmaxEXT=GLee_Lazy_glResetMinmaxEXT; -#endif -#endif - -/* GL_EXT_convolution */ - -#ifdef __GLEE_GL_EXT_convolution -#ifndef GLEE_C_DEFINED_glConvolutionFilter1DEXT -#define GLEE_C_DEFINED_glConvolutionFilter1DEXT - void __stdcall GLee_Lazy_glConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter1DEXT(target, internalformat, width, format, type, image);} - GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glConvolutionFilter1DEXT=GLee_Lazy_glConvolutionFilter1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionFilter2DEXT -#define GLEE_C_DEFINED_glConvolutionFilter2DEXT - void __stdcall GLee_Lazy_glConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image);} - GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glConvolutionFilter2DEXT=GLee_Lazy_glConvolutionFilter2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameterfEXT -#define GLEE_C_DEFINED_glConvolutionParameterfEXT - void __stdcall GLee_Lazy_glConvolutionParameterfEXT(GLenum target, GLenum pname, GLfloat params) {if (GLeeInit()) glConvolutionParameterfEXT(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC GLeeFuncPtr_glConvolutionParameterfEXT=GLee_Lazy_glConvolutionParameterfEXT; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameterfvEXT -#define GLEE_C_DEFINED_glConvolutionParameterfvEXT - void __stdcall GLee_Lazy_glConvolutionParameterfvEXT(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glConvolutionParameterfvEXT(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glConvolutionParameterfvEXT=GLee_Lazy_glConvolutionParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameteriEXT -#define GLEE_C_DEFINED_glConvolutionParameteriEXT - void __stdcall GLee_Lazy_glConvolutionParameteriEXT(GLenum target, GLenum pname, GLint params) {if (GLeeInit()) glConvolutionParameteriEXT(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC GLeeFuncPtr_glConvolutionParameteriEXT=GLee_Lazy_glConvolutionParameteriEXT; -#endif -#ifndef GLEE_C_DEFINED_glConvolutionParameterivEXT -#define GLEE_C_DEFINED_glConvolutionParameterivEXT - void __stdcall GLee_Lazy_glConvolutionParameterivEXT(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glConvolutionParameterivEXT(target, pname, params);} - GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glConvolutionParameterivEXT=GLee_Lazy_glConvolutionParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter1DEXT -#define GLEE_C_DEFINED_glCopyConvolutionFilter1DEXT - void __stdcall GLee_Lazy_glCopyConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyConvolutionFilter1DEXT(target, internalformat, x, y, width);} - GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter1DEXT=GLee_Lazy_glCopyConvolutionFilter1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter2DEXT -#define GLEE_C_DEFINED_glCopyConvolutionFilter2DEXT - void __stdcall GLee_Lazy_glCopyConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height);} - GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter2DEXT=GLee_Lazy_glCopyConvolutionFilter2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetConvolutionFilterEXT -#define GLEE_C_DEFINED_glGetConvolutionFilterEXT - void __stdcall GLee_Lazy_glGetConvolutionFilterEXT(GLenum target, GLenum format, GLenum type, GLvoid * image) {if (GLeeInit()) glGetConvolutionFilterEXT(target, format, type, image);} - GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC GLeeFuncPtr_glGetConvolutionFilterEXT=GLee_Lazy_glGetConvolutionFilterEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetConvolutionParameterfvEXT -#define GLEE_C_DEFINED_glGetConvolutionParameterfvEXT - void __stdcall GLee_Lazy_glGetConvolutionParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetConvolutionParameterfvEXT(target, pname, params);} - GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glGetConvolutionParameterfvEXT=GLee_Lazy_glGetConvolutionParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetConvolutionParameterivEXT -#define GLEE_C_DEFINED_glGetConvolutionParameterivEXT - void __stdcall GLee_Lazy_glGetConvolutionParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetConvolutionParameterivEXT(target, pname, params);} - GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glGetConvolutionParameterivEXT=GLee_Lazy_glGetConvolutionParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetSeparableFilterEXT -#define GLEE_C_DEFINED_glGetSeparableFilterEXT - void __stdcall GLee_Lazy_glGetSeparableFilterEXT(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span) {if (GLeeInit()) glGetSeparableFilterEXT(target, format, type, row, column, span);} - GLEEPFNGLGETSEPARABLEFILTEREXTPROC GLeeFuncPtr_glGetSeparableFilterEXT=GLee_Lazy_glGetSeparableFilterEXT; -#endif -#ifndef GLEE_C_DEFINED_glSeparableFilter2DEXT -#define GLEE_C_DEFINED_glSeparableFilter2DEXT - void __stdcall GLee_Lazy_glSeparableFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column) {if (GLeeInit()) glSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column);} - GLEEPFNGLSEPARABLEFILTER2DEXTPROC GLeeFuncPtr_glSeparableFilter2DEXT=GLee_Lazy_glSeparableFilter2DEXT; -#endif -#endif - -/* GL_SGI_color_matrix */ - -#ifdef __GLEE_GL_SGI_color_matrix -#endif - -/* GL_SGI_color_table */ - -#ifdef __GLEE_GL_SGI_color_table -#ifndef GLEE_C_DEFINED_glColorTableSGI -#define GLEE_C_DEFINED_glColorTableSGI - void __stdcall GLee_Lazy_glColorTableSGI(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table) {if (GLeeInit()) glColorTableSGI(target, internalformat, width, format, type, table);} - GLEEPFNGLCOLORTABLESGIPROC GLeeFuncPtr_glColorTableSGI=GLee_Lazy_glColorTableSGI; -#endif -#ifndef GLEE_C_DEFINED_glColorTableParameterfvSGI -#define GLEE_C_DEFINED_glColorTableParameterfvSGI - void __stdcall GLee_Lazy_glColorTableParameterfvSGI(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glColorTableParameterfvSGI(target, pname, params);} - GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glColorTableParameterfvSGI=GLee_Lazy_glColorTableParameterfvSGI; -#endif -#ifndef GLEE_C_DEFINED_glColorTableParameterivSGI -#define GLEE_C_DEFINED_glColorTableParameterivSGI - void __stdcall GLee_Lazy_glColorTableParameterivSGI(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glColorTableParameterivSGI(target, pname, params);} - GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glColorTableParameterivSGI=GLee_Lazy_glColorTableParameterivSGI; -#endif -#ifndef GLEE_C_DEFINED_glCopyColorTableSGI -#define GLEE_C_DEFINED_glCopyColorTableSGI - void __stdcall GLee_Lazy_glCopyColorTableSGI(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorTableSGI(target, internalformat, x, y, width);} - GLEEPFNGLCOPYCOLORTABLESGIPROC GLeeFuncPtr_glCopyColorTableSGI=GLee_Lazy_glCopyColorTableSGI; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableSGI -#define GLEE_C_DEFINED_glGetColorTableSGI - void __stdcall GLee_Lazy_glGetColorTableSGI(GLenum target, GLenum format, GLenum type, GLvoid * table) {if (GLeeInit()) glGetColorTableSGI(target, format, type, table);} - GLEEPFNGLGETCOLORTABLESGIPROC GLeeFuncPtr_glGetColorTableSGI=GLee_Lazy_glGetColorTableSGI; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableParameterfvSGI -#define GLEE_C_DEFINED_glGetColorTableParameterfvSGI - void __stdcall GLee_Lazy_glGetColorTableParameterfvSGI(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetColorTableParameterfvSGI(target, pname, params);} - GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glGetColorTableParameterfvSGI=GLee_Lazy_glGetColorTableParameterfvSGI; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableParameterivSGI -#define GLEE_C_DEFINED_glGetColorTableParameterivSGI - void __stdcall GLee_Lazy_glGetColorTableParameterivSGI(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetColorTableParameterivSGI(target, pname, params);} - GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glGetColorTableParameterivSGI=GLee_Lazy_glGetColorTableParameterivSGI; -#endif -#endif - -/* GL_SGIS_pixel_texture */ - -#ifdef __GLEE_GL_SGIS_pixel_texture -#ifndef GLEE_C_DEFINED_glPixelTexGenParameteriSGIS -#define GLEE_C_DEFINED_glPixelTexGenParameteriSGIS - void __stdcall GLee_Lazy_glPixelTexGenParameteriSGIS(GLenum pname, GLint param) {if (GLeeInit()) glPixelTexGenParameteriSGIS(pname, param);} - GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC GLeeFuncPtr_glPixelTexGenParameteriSGIS=GLee_Lazy_glPixelTexGenParameteriSGIS; -#endif -#ifndef GLEE_C_DEFINED_glPixelTexGenParameterivSGIS -#define GLEE_C_DEFINED_glPixelTexGenParameterivSGIS - void __stdcall GLee_Lazy_glPixelTexGenParameterivSGIS(GLenum pname, const GLint * params) {if (GLeeInit()) glPixelTexGenParameterivSGIS(pname, params);} - GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glPixelTexGenParameterivSGIS=GLee_Lazy_glPixelTexGenParameterivSGIS; -#endif -#ifndef GLEE_C_DEFINED_glPixelTexGenParameterfSGIS -#define GLEE_C_DEFINED_glPixelTexGenParameterfSGIS - void __stdcall GLee_Lazy_glPixelTexGenParameterfSGIS(GLenum pname, GLfloat param) {if (GLeeInit()) glPixelTexGenParameterfSGIS(pname, param);} - GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC GLeeFuncPtr_glPixelTexGenParameterfSGIS=GLee_Lazy_glPixelTexGenParameterfSGIS; -#endif -#ifndef GLEE_C_DEFINED_glPixelTexGenParameterfvSGIS -#define GLEE_C_DEFINED_glPixelTexGenParameterfvSGIS - void __stdcall GLee_Lazy_glPixelTexGenParameterfvSGIS(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPixelTexGenParameterfvSGIS(pname, params);} - GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glPixelTexGenParameterfvSGIS=GLee_Lazy_glPixelTexGenParameterfvSGIS; -#endif -#ifndef GLEE_C_DEFINED_glGetPixelTexGenParameterivSGIS -#define GLEE_C_DEFINED_glGetPixelTexGenParameterivSGIS - void __stdcall GLee_Lazy_glGetPixelTexGenParameterivSGIS(GLenum pname, GLint * params) {if (GLeeInit()) glGetPixelTexGenParameterivSGIS(pname, params);} - GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterivSGIS=GLee_Lazy_glGetPixelTexGenParameterivSGIS; -#endif -#ifndef GLEE_C_DEFINED_glGetPixelTexGenParameterfvSGIS -#define GLEE_C_DEFINED_glGetPixelTexGenParameterfvSGIS - void __stdcall GLee_Lazy_glGetPixelTexGenParameterfvSGIS(GLenum pname, GLfloat * params) {if (GLeeInit()) glGetPixelTexGenParameterfvSGIS(pname, params);} - GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS=GLee_Lazy_glGetPixelTexGenParameterfvSGIS; -#endif -#endif - -/* GL_SGIX_pixel_texture */ - -#ifdef __GLEE_GL_SGIX_pixel_texture -#ifndef GLEE_C_DEFINED_glPixelTexGenSGIX -#define GLEE_C_DEFINED_glPixelTexGenSGIX - void __stdcall GLee_Lazy_glPixelTexGenSGIX(GLenum mode) {if (GLeeInit()) glPixelTexGenSGIX(mode);} - GLEEPFNGLPIXELTEXGENSGIXPROC GLeeFuncPtr_glPixelTexGenSGIX=GLee_Lazy_glPixelTexGenSGIX; -#endif -#endif - -/* GL_SGIS_texture4D */ - -#ifdef __GLEE_GL_SGIS_texture4D -#ifndef GLEE_C_DEFINED_glTexImage4DSGIS -#define GLEE_C_DEFINED_glTexImage4DSGIS - void __stdcall GLee_Lazy_glTexImage4DSGIS(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexImage4DSGIS(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels);} - GLEEPFNGLTEXIMAGE4DSGISPROC GLeeFuncPtr_glTexImage4DSGIS=GLee_Lazy_glTexImage4DSGIS; -#endif -#ifndef GLEE_C_DEFINED_glTexSubImage4DSGIS -#define GLEE_C_DEFINED_glTexSubImage4DSGIS - void __stdcall GLee_Lazy_glTexSubImage4DSGIS(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage4DSGIS(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels);} - GLEEPFNGLTEXSUBIMAGE4DSGISPROC GLeeFuncPtr_glTexSubImage4DSGIS=GLee_Lazy_glTexSubImage4DSGIS; -#endif -#endif - -/* GL_SGI_texture_color_table */ - -#ifdef __GLEE_GL_SGI_texture_color_table -#endif - -/* GL_EXT_cmyka */ - -#ifdef __GLEE_GL_EXT_cmyka -#endif - -/* GL_EXT_texture_object */ - -#ifdef __GLEE_GL_EXT_texture_object -#ifndef GLEE_C_DEFINED_glAreTexturesResidentEXT -#define GLEE_C_DEFINED_glAreTexturesResidentEXT - GLboolean __stdcall GLee_Lazy_glAreTexturesResidentEXT(GLsizei n, const GLuint * textures, GLboolean * residences) {if (GLeeInit()) return glAreTexturesResidentEXT(n, textures, residences); return (GLboolean)0;} - GLEEPFNGLARETEXTURESRESIDENTEXTPROC GLeeFuncPtr_glAreTexturesResidentEXT=GLee_Lazy_glAreTexturesResidentEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindTextureEXT -#define GLEE_C_DEFINED_glBindTextureEXT - void __stdcall GLee_Lazy_glBindTextureEXT(GLenum target, GLuint texture) {if (GLeeInit()) glBindTextureEXT(target, texture);} - GLEEPFNGLBINDTEXTUREEXTPROC GLeeFuncPtr_glBindTextureEXT=GLee_Lazy_glBindTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glDeleteTexturesEXT -#define GLEE_C_DEFINED_glDeleteTexturesEXT - void __stdcall GLee_Lazy_glDeleteTexturesEXT(GLsizei n, const GLuint * textures) {if (GLeeInit()) glDeleteTexturesEXT(n, textures);} - GLEEPFNGLDELETETEXTURESEXTPROC GLeeFuncPtr_glDeleteTexturesEXT=GLee_Lazy_glDeleteTexturesEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenTexturesEXT -#define GLEE_C_DEFINED_glGenTexturesEXT - void __stdcall GLee_Lazy_glGenTexturesEXT(GLsizei n, GLuint * textures) {if (GLeeInit()) glGenTexturesEXT(n, textures);} - GLEEPFNGLGENTEXTURESEXTPROC GLeeFuncPtr_glGenTexturesEXT=GLee_Lazy_glGenTexturesEXT; -#endif -#ifndef GLEE_C_DEFINED_glIsTextureEXT -#define GLEE_C_DEFINED_glIsTextureEXT - GLboolean __stdcall GLee_Lazy_glIsTextureEXT(GLuint texture) {if (GLeeInit()) return glIsTextureEXT(texture); return (GLboolean)0;} - GLEEPFNGLISTEXTUREEXTPROC GLeeFuncPtr_glIsTextureEXT=GLee_Lazy_glIsTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glPrioritizeTexturesEXT -#define GLEE_C_DEFINED_glPrioritizeTexturesEXT - void __stdcall GLee_Lazy_glPrioritizeTexturesEXT(GLsizei n, const GLuint * textures, const GLclampf * priorities) {if (GLeeInit()) glPrioritizeTexturesEXT(n, textures, priorities);} - GLEEPFNGLPRIORITIZETEXTURESEXTPROC GLeeFuncPtr_glPrioritizeTexturesEXT=GLee_Lazy_glPrioritizeTexturesEXT; -#endif -#endif - -/* GL_SGIS_detail_texture */ - -#ifdef __GLEE_GL_SGIS_detail_texture -#ifndef GLEE_C_DEFINED_glDetailTexFuncSGIS -#define GLEE_C_DEFINED_glDetailTexFuncSGIS - void __stdcall GLee_Lazy_glDetailTexFuncSGIS(GLenum target, GLsizei n, const GLfloat * points) {if (GLeeInit()) glDetailTexFuncSGIS(target, n, points);} - GLEEPFNGLDETAILTEXFUNCSGISPROC GLeeFuncPtr_glDetailTexFuncSGIS=GLee_Lazy_glDetailTexFuncSGIS; -#endif -#ifndef GLEE_C_DEFINED_glGetDetailTexFuncSGIS -#define GLEE_C_DEFINED_glGetDetailTexFuncSGIS - void __stdcall GLee_Lazy_glGetDetailTexFuncSGIS(GLenum target, GLfloat * points) {if (GLeeInit()) glGetDetailTexFuncSGIS(target, points);} - GLEEPFNGLGETDETAILTEXFUNCSGISPROC GLeeFuncPtr_glGetDetailTexFuncSGIS=GLee_Lazy_glGetDetailTexFuncSGIS; -#endif -#endif - -/* GL_SGIS_sharpen_texture */ - -#ifdef __GLEE_GL_SGIS_sharpen_texture -#ifndef GLEE_C_DEFINED_glSharpenTexFuncSGIS -#define GLEE_C_DEFINED_glSharpenTexFuncSGIS - void __stdcall GLee_Lazy_glSharpenTexFuncSGIS(GLenum target, GLsizei n, const GLfloat * points) {if (GLeeInit()) glSharpenTexFuncSGIS(target, n, points);} - GLEEPFNGLSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glSharpenTexFuncSGIS=GLee_Lazy_glSharpenTexFuncSGIS; -#endif -#ifndef GLEE_C_DEFINED_glGetSharpenTexFuncSGIS -#define GLEE_C_DEFINED_glGetSharpenTexFuncSGIS - void __stdcall GLee_Lazy_glGetSharpenTexFuncSGIS(GLenum target, GLfloat * points) {if (GLeeInit()) glGetSharpenTexFuncSGIS(target, points);} - GLEEPFNGLGETSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glGetSharpenTexFuncSGIS=GLee_Lazy_glGetSharpenTexFuncSGIS; -#endif -#endif - -/* GL_EXT_packed_pixels */ - -#ifdef __GLEE_GL_EXT_packed_pixels -#endif - -/* GL_SGIS_texture_lod */ - -#ifdef __GLEE_GL_SGIS_texture_lod -#endif - -/* GL_SGIS_multisample */ - -#ifdef __GLEE_GL_SGIS_multisample -#ifndef GLEE_C_DEFINED_glSampleMaskSGIS -#define GLEE_C_DEFINED_glSampleMaskSGIS - void __stdcall GLee_Lazy_glSampleMaskSGIS(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleMaskSGIS(value, invert);} - GLEEPFNGLSAMPLEMASKSGISPROC GLeeFuncPtr_glSampleMaskSGIS=GLee_Lazy_glSampleMaskSGIS; -#endif -#ifndef GLEE_C_DEFINED_glSamplePatternSGIS -#define GLEE_C_DEFINED_glSamplePatternSGIS - void __stdcall GLee_Lazy_glSamplePatternSGIS(GLenum pattern) {if (GLeeInit()) glSamplePatternSGIS(pattern);} - GLEEPFNGLSAMPLEPATTERNSGISPROC GLeeFuncPtr_glSamplePatternSGIS=GLee_Lazy_glSamplePatternSGIS; -#endif -#endif - -/* GL_EXT_rescale_normal */ - -#ifdef __GLEE_GL_EXT_rescale_normal -#endif - -/* GL_EXT_vertex_array */ - -#ifdef __GLEE_GL_EXT_vertex_array -#ifndef GLEE_C_DEFINED_glArrayElementEXT -#define GLEE_C_DEFINED_glArrayElementEXT - void __stdcall GLee_Lazy_glArrayElementEXT(GLint i) {if (GLeeInit()) glArrayElementEXT(i);} - GLEEPFNGLARRAYELEMENTEXTPROC GLeeFuncPtr_glArrayElementEXT=GLee_Lazy_glArrayElementEXT; -#endif -#ifndef GLEE_C_DEFINED_glColorPointerEXT -#define GLEE_C_DEFINED_glColorPointerEXT - void __stdcall GLee_Lazy_glColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glColorPointerEXT(size, type, stride, count, pointer);} - GLEEPFNGLCOLORPOINTEREXTPROC GLeeFuncPtr_glColorPointerEXT=GLee_Lazy_glColorPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glDrawArraysEXT -#define GLEE_C_DEFINED_glDrawArraysEXT - void __stdcall GLee_Lazy_glDrawArraysEXT(GLenum mode, GLint first, GLsizei count) {if (GLeeInit()) glDrawArraysEXT(mode, first, count);} - GLEEPFNGLDRAWARRAYSEXTPROC GLeeFuncPtr_glDrawArraysEXT=GLee_Lazy_glDrawArraysEXT; -#endif -#ifndef GLEE_C_DEFINED_glEdgeFlagPointerEXT -#define GLEE_C_DEFINED_glEdgeFlagPointerEXT - void __stdcall GLee_Lazy_glEdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean * pointer) {if (GLeeInit()) glEdgeFlagPointerEXT(stride, count, pointer);} - GLEEPFNGLEDGEFLAGPOINTEREXTPROC GLeeFuncPtr_glEdgeFlagPointerEXT=GLee_Lazy_glEdgeFlagPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetPointervEXT -#define GLEE_C_DEFINED_glGetPointervEXT - void __stdcall GLee_Lazy_glGetPointervEXT(GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetPointervEXT(pname, params);} - GLEEPFNGLGETPOINTERVEXTPROC GLeeFuncPtr_glGetPointervEXT=GLee_Lazy_glGetPointervEXT; -#endif -#ifndef GLEE_C_DEFINED_glIndexPointerEXT -#define GLEE_C_DEFINED_glIndexPointerEXT - void __stdcall GLee_Lazy_glIndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glIndexPointerEXT(type, stride, count, pointer);} - GLEEPFNGLINDEXPOINTEREXTPROC GLeeFuncPtr_glIndexPointerEXT=GLee_Lazy_glIndexPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glNormalPointerEXT -#define GLEE_C_DEFINED_glNormalPointerEXT - void __stdcall GLee_Lazy_glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glNormalPointerEXT(type, stride, count, pointer);} - GLEEPFNGLNORMALPOINTEREXTPROC GLeeFuncPtr_glNormalPointerEXT=GLee_Lazy_glNormalPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glTexCoordPointerEXT -#define GLEE_C_DEFINED_glTexCoordPointerEXT - void __stdcall GLee_Lazy_glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glTexCoordPointerEXT(size, type, stride, count, pointer);} - GLEEPFNGLTEXCOORDPOINTEREXTPROC GLeeFuncPtr_glTexCoordPointerEXT=GLee_Lazy_glTexCoordPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexPointerEXT -#define GLEE_C_DEFINED_glVertexPointerEXT - void __stdcall GLee_Lazy_glVertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glVertexPointerEXT(size, type, stride, count, pointer);} - GLEEPFNGLVERTEXPOINTEREXTPROC GLeeFuncPtr_glVertexPointerEXT=GLee_Lazy_glVertexPointerEXT; -#endif -#endif - -/* GL_EXT_misc_attribute */ - -#ifdef __GLEE_GL_EXT_misc_attribute -#endif - -/* GL_SGIS_generate_mipmap */ - -#ifdef __GLEE_GL_SGIS_generate_mipmap -#endif - -/* GL_SGIX_clipmap */ - -#ifdef __GLEE_GL_SGIX_clipmap -#endif - -/* GL_SGIX_shadow */ - -#ifdef __GLEE_GL_SGIX_shadow -#endif - -/* GL_SGIS_texture_edge_clamp */ - -#ifdef __GLEE_GL_SGIS_texture_edge_clamp -#endif - -/* GL_SGIS_texture_border_clamp */ - -#ifdef __GLEE_GL_SGIS_texture_border_clamp -#endif - -/* GL_EXT_blend_minmax */ - -#ifdef __GLEE_GL_EXT_blend_minmax -#ifndef GLEE_C_DEFINED_glBlendEquationEXT -#define GLEE_C_DEFINED_glBlendEquationEXT - void __stdcall GLee_Lazy_glBlendEquationEXT(GLenum mode) {if (GLeeInit()) glBlendEquationEXT(mode);} - GLEEPFNGLBLENDEQUATIONEXTPROC GLeeFuncPtr_glBlendEquationEXT=GLee_Lazy_glBlendEquationEXT; -#endif -#endif - -/* GL_EXT_blend_subtract */ - -#ifdef __GLEE_GL_EXT_blend_subtract -#endif - -/* GL_EXT_blend_logic_op */ - -#ifdef __GLEE_GL_EXT_blend_logic_op -#endif - -/* GL_SGIX_interlace */ - -#ifdef __GLEE_GL_SGIX_interlace -#endif - -/* GL_SGIX_pixel_tiles */ - -#ifdef __GLEE_GL_SGIX_pixel_tiles -#endif - -/* GL_SGIS_texture_select */ - -#ifdef __GLEE_GL_SGIS_texture_select -#endif - -/* GL_SGIX_sprite */ - -#ifdef __GLEE_GL_SGIX_sprite -#ifndef GLEE_C_DEFINED_glSpriteParameterfSGIX -#define GLEE_C_DEFINED_glSpriteParameterfSGIX - void __stdcall GLee_Lazy_glSpriteParameterfSGIX(GLenum pname, GLfloat param) {if (GLeeInit()) glSpriteParameterfSGIX(pname, param);} - GLEEPFNGLSPRITEPARAMETERFSGIXPROC GLeeFuncPtr_glSpriteParameterfSGIX=GLee_Lazy_glSpriteParameterfSGIX; -#endif -#ifndef GLEE_C_DEFINED_glSpriteParameterfvSGIX -#define GLEE_C_DEFINED_glSpriteParameterfvSGIX - void __stdcall GLee_Lazy_glSpriteParameterfvSGIX(GLenum pname, const GLfloat * params) {if (GLeeInit()) glSpriteParameterfvSGIX(pname, params);} - GLEEPFNGLSPRITEPARAMETERFVSGIXPROC GLeeFuncPtr_glSpriteParameterfvSGIX=GLee_Lazy_glSpriteParameterfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glSpriteParameteriSGIX -#define GLEE_C_DEFINED_glSpriteParameteriSGIX - void __stdcall GLee_Lazy_glSpriteParameteriSGIX(GLenum pname, GLint param) {if (GLeeInit()) glSpriteParameteriSGIX(pname, param);} - GLEEPFNGLSPRITEPARAMETERISGIXPROC GLeeFuncPtr_glSpriteParameteriSGIX=GLee_Lazy_glSpriteParameteriSGIX; -#endif -#ifndef GLEE_C_DEFINED_glSpriteParameterivSGIX -#define GLEE_C_DEFINED_glSpriteParameterivSGIX - void __stdcall GLee_Lazy_glSpriteParameterivSGIX(GLenum pname, const GLint * params) {if (GLeeInit()) glSpriteParameterivSGIX(pname, params);} - GLEEPFNGLSPRITEPARAMETERIVSGIXPROC GLeeFuncPtr_glSpriteParameterivSGIX=GLee_Lazy_glSpriteParameterivSGIX; -#endif -#endif - -/* GL_SGIX_texture_multi_buffer */ - -#ifdef __GLEE_GL_SGIX_texture_multi_buffer -#endif - -/* GL_EXT_point_parameters */ - -#ifdef __GLEE_GL_EXT_point_parameters -#ifndef GLEE_C_DEFINED_glPointParameterfEXT -#define GLEE_C_DEFINED_glPointParameterfEXT - void __stdcall GLee_Lazy_glPointParameterfEXT(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterfEXT(pname, param);} - GLEEPFNGLPOINTPARAMETERFEXTPROC GLeeFuncPtr_glPointParameterfEXT=GLee_Lazy_glPointParameterfEXT; -#endif -#ifndef GLEE_C_DEFINED_glPointParameterfvEXT -#define GLEE_C_DEFINED_glPointParameterfvEXT - void __stdcall GLee_Lazy_glPointParameterfvEXT(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfvEXT(pname, params);} - GLEEPFNGLPOINTPARAMETERFVEXTPROC GLeeFuncPtr_glPointParameterfvEXT=GLee_Lazy_glPointParameterfvEXT; -#endif -#endif - -/* GL_SGIS_point_parameters */ - -#ifdef __GLEE_GL_SGIS_point_parameters -#ifndef GLEE_C_DEFINED_glPointParameterfSGIS -#define GLEE_C_DEFINED_glPointParameterfSGIS - void __stdcall GLee_Lazy_glPointParameterfSGIS(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterfSGIS(pname, param);} - GLEEPFNGLPOINTPARAMETERFSGISPROC GLeeFuncPtr_glPointParameterfSGIS=GLee_Lazy_glPointParameterfSGIS; -#endif -#ifndef GLEE_C_DEFINED_glPointParameterfvSGIS -#define GLEE_C_DEFINED_glPointParameterfvSGIS - void __stdcall GLee_Lazy_glPointParameterfvSGIS(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfvSGIS(pname, params);} - GLEEPFNGLPOINTPARAMETERFVSGISPROC GLeeFuncPtr_glPointParameterfvSGIS=GLee_Lazy_glPointParameterfvSGIS; -#endif -#endif - -/* GL_SGIX_instruments */ - -#ifdef __GLEE_GL_SGIX_instruments -#ifndef GLEE_C_DEFINED_glGetInstrumentsSGIX -#define GLEE_C_DEFINED_glGetInstrumentsSGIX - GLint __stdcall GLee_Lazy_glGetInstrumentsSGIX(void) {if (GLeeInit()) return glGetInstrumentsSGIX(); return (GLint)0;} - GLEEPFNGLGETINSTRUMENTSSGIXPROC GLeeFuncPtr_glGetInstrumentsSGIX=GLee_Lazy_glGetInstrumentsSGIX; -#endif -#ifndef GLEE_C_DEFINED_glInstrumentsBufferSGIX -#define GLEE_C_DEFINED_glInstrumentsBufferSGIX - void __stdcall GLee_Lazy_glInstrumentsBufferSGIX(GLsizei size, GLint * buffer) {if (GLeeInit()) glInstrumentsBufferSGIX(size, buffer);} - GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC GLeeFuncPtr_glInstrumentsBufferSGIX=GLee_Lazy_glInstrumentsBufferSGIX; -#endif -#ifndef GLEE_C_DEFINED_glPollInstrumentsSGIX -#define GLEE_C_DEFINED_glPollInstrumentsSGIX - GLint __stdcall GLee_Lazy_glPollInstrumentsSGIX(GLint * marker_p) {if (GLeeInit()) return glPollInstrumentsSGIX(marker_p); return (GLint)0;} - GLEEPFNGLPOLLINSTRUMENTSSGIXPROC GLeeFuncPtr_glPollInstrumentsSGIX=GLee_Lazy_glPollInstrumentsSGIX; -#endif -#ifndef GLEE_C_DEFINED_glReadInstrumentsSGIX -#define GLEE_C_DEFINED_glReadInstrumentsSGIX - void __stdcall GLee_Lazy_glReadInstrumentsSGIX(GLint marker) {if (GLeeInit()) glReadInstrumentsSGIX(marker);} - GLEEPFNGLREADINSTRUMENTSSGIXPROC GLeeFuncPtr_glReadInstrumentsSGIX=GLee_Lazy_glReadInstrumentsSGIX; -#endif -#ifndef GLEE_C_DEFINED_glStartInstrumentsSGIX -#define GLEE_C_DEFINED_glStartInstrumentsSGIX - void __stdcall GLee_Lazy_glStartInstrumentsSGIX(void) {if (GLeeInit()) glStartInstrumentsSGIX();} - GLEEPFNGLSTARTINSTRUMENTSSGIXPROC GLeeFuncPtr_glStartInstrumentsSGIX=GLee_Lazy_glStartInstrumentsSGIX; -#endif -#ifndef GLEE_C_DEFINED_glStopInstrumentsSGIX -#define GLEE_C_DEFINED_glStopInstrumentsSGIX - void __stdcall GLee_Lazy_glStopInstrumentsSGIX(GLint marker) {if (GLeeInit()) glStopInstrumentsSGIX(marker);} - GLEEPFNGLSTOPINSTRUMENTSSGIXPROC GLeeFuncPtr_glStopInstrumentsSGIX=GLee_Lazy_glStopInstrumentsSGIX; -#endif -#endif - -/* GL_SGIX_texture_scale_bias */ - -#ifdef __GLEE_GL_SGIX_texture_scale_bias -#endif - -/* GL_SGIX_framezoom */ - -#ifdef __GLEE_GL_SGIX_framezoom -#ifndef GLEE_C_DEFINED_glFrameZoomSGIX -#define GLEE_C_DEFINED_glFrameZoomSGIX - void __stdcall GLee_Lazy_glFrameZoomSGIX(GLint factor) {if (GLeeInit()) glFrameZoomSGIX(factor);} - GLEEPFNGLFRAMEZOOMSGIXPROC GLeeFuncPtr_glFrameZoomSGIX=GLee_Lazy_glFrameZoomSGIX; -#endif -#endif - -/* GL_SGIX_tag_sample_buffer */ - -#ifdef __GLEE_GL_SGIX_tag_sample_buffer -#ifndef GLEE_C_DEFINED_glTagSampleBufferSGIX -#define GLEE_C_DEFINED_glTagSampleBufferSGIX - void __stdcall GLee_Lazy_glTagSampleBufferSGIX(void) {if (GLeeInit()) glTagSampleBufferSGIX();} - GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC GLeeFuncPtr_glTagSampleBufferSGIX=GLee_Lazy_glTagSampleBufferSGIX; -#endif -#endif - -/* GL_FfdMaskSGIX */ - -#ifdef __GLEE_GL_FfdMaskSGIX -#endif - -/* GL_SGIX_polynomial_ffd */ - -#ifdef __GLEE_GL_SGIX_polynomial_ffd -#ifndef GLEE_C_DEFINED_glDeformationMap3dSGIX -#define GLEE_C_DEFINED_glDeformationMap3dSGIX - void __stdcall GLee_Lazy_glDeformationMap3dSGIX(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points) {if (GLeeInit()) glDeformationMap3dSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points);} - GLEEPFNGLDEFORMATIONMAP3DSGIXPROC GLeeFuncPtr_glDeformationMap3dSGIX=GLee_Lazy_glDeformationMap3dSGIX; -#endif -#ifndef GLEE_C_DEFINED_glDeformationMap3fSGIX -#define GLEE_C_DEFINED_glDeformationMap3fSGIX - void __stdcall GLee_Lazy_glDeformationMap3fSGIX(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points) {if (GLeeInit()) glDeformationMap3fSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points);} - GLEEPFNGLDEFORMATIONMAP3FSGIXPROC GLeeFuncPtr_glDeformationMap3fSGIX=GLee_Lazy_glDeformationMap3fSGIX; -#endif -#ifndef GLEE_C_DEFINED_glDeformSGIX -#define GLEE_C_DEFINED_glDeformSGIX - void __stdcall GLee_Lazy_glDeformSGIX(GLbitfield mask) {if (GLeeInit()) glDeformSGIX(mask);} - GLEEPFNGLDEFORMSGIXPROC GLeeFuncPtr_glDeformSGIX=GLee_Lazy_glDeformSGIX; -#endif -#ifndef GLEE_C_DEFINED_glLoadIdentityDeformationMapSGIX -#define GLEE_C_DEFINED_glLoadIdentityDeformationMapSGIX - void __stdcall GLee_Lazy_glLoadIdentityDeformationMapSGIX(GLbitfield mask) {if (GLeeInit()) glLoadIdentityDeformationMapSGIX(mask);} - GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC GLeeFuncPtr_glLoadIdentityDeformationMapSGIX=GLee_Lazy_glLoadIdentityDeformationMapSGIX; -#endif -#endif - -/* GL_SGIX_reference_plane */ - -#ifdef __GLEE_GL_SGIX_reference_plane -#ifndef GLEE_C_DEFINED_glReferencePlaneSGIX -#define GLEE_C_DEFINED_glReferencePlaneSGIX - void __stdcall GLee_Lazy_glReferencePlaneSGIX(const GLdouble * equation) {if (GLeeInit()) glReferencePlaneSGIX(equation);} - GLEEPFNGLREFERENCEPLANESGIXPROC GLeeFuncPtr_glReferencePlaneSGIX=GLee_Lazy_glReferencePlaneSGIX; -#endif -#endif - -/* GL_SGIX_flush_raster */ - -#ifdef __GLEE_GL_SGIX_flush_raster -#ifndef GLEE_C_DEFINED_glFlushRasterSGIX -#define GLEE_C_DEFINED_glFlushRasterSGIX - void __stdcall GLee_Lazy_glFlushRasterSGIX(void) {if (GLeeInit()) glFlushRasterSGIX();} - GLEEPFNGLFLUSHRASTERSGIXPROC GLeeFuncPtr_glFlushRasterSGIX=GLee_Lazy_glFlushRasterSGIX; -#endif -#endif - -/* GL_SGIX_depth_texture */ - -#ifdef __GLEE_GL_SGIX_depth_texture -#endif - -/* GL_SGIS_fog_function */ - -#ifdef __GLEE_GL_SGIS_fog_function -#ifndef GLEE_C_DEFINED_glFogFuncSGIS -#define GLEE_C_DEFINED_glFogFuncSGIS - void __stdcall GLee_Lazy_glFogFuncSGIS(GLsizei n, const GLfloat * points) {if (GLeeInit()) glFogFuncSGIS(n, points);} - GLEEPFNGLFOGFUNCSGISPROC GLeeFuncPtr_glFogFuncSGIS=GLee_Lazy_glFogFuncSGIS; -#endif -#ifndef GLEE_C_DEFINED_glGetFogFuncSGIS -#define GLEE_C_DEFINED_glGetFogFuncSGIS - void __stdcall GLee_Lazy_glGetFogFuncSGIS(GLfloat * points) {if (GLeeInit()) glGetFogFuncSGIS(points);} - GLEEPFNGLGETFOGFUNCSGISPROC GLeeFuncPtr_glGetFogFuncSGIS=GLee_Lazy_glGetFogFuncSGIS; -#endif -#endif - -/* GL_SGIX_fog_offset */ - -#ifdef __GLEE_GL_SGIX_fog_offset -#endif - -/* GL_HP_image_transform */ - -#ifdef __GLEE_GL_HP_image_transform -#ifndef GLEE_C_DEFINED_glImageTransformParameteriHP -#define GLEE_C_DEFINED_glImageTransformParameteriHP - void __stdcall GLee_Lazy_glImageTransformParameteriHP(GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glImageTransformParameteriHP(target, pname, param);} - GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC GLeeFuncPtr_glImageTransformParameteriHP=GLee_Lazy_glImageTransformParameteriHP; -#endif -#ifndef GLEE_C_DEFINED_glImageTransformParameterfHP -#define GLEE_C_DEFINED_glImageTransformParameterfHP - void __stdcall GLee_Lazy_glImageTransformParameterfHP(GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glImageTransformParameterfHP(target, pname, param);} - GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC GLeeFuncPtr_glImageTransformParameterfHP=GLee_Lazy_glImageTransformParameterfHP; -#endif -#ifndef GLEE_C_DEFINED_glImageTransformParameterivHP -#define GLEE_C_DEFINED_glImageTransformParameterivHP - void __stdcall GLee_Lazy_glImageTransformParameterivHP(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glImageTransformParameterivHP(target, pname, params);} - GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glImageTransformParameterivHP=GLee_Lazy_glImageTransformParameterivHP; -#endif -#ifndef GLEE_C_DEFINED_glImageTransformParameterfvHP -#define GLEE_C_DEFINED_glImageTransformParameterfvHP - void __stdcall GLee_Lazy_glImageTransformParameterfvHP(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glImageTransformParameterfvHP(target, pname, params);} - GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glImageTransformParameterfvHP=GLee_Lazy_glImageTransformParameterfvHP; -#endif -#ifndef GLEE_C_DEFINED_glGetImageTransformParameterivHP -#define GLEE_C_DEFINED_glGetImageTransformParameterivHP - void __stdcall GLee_Lazy_glGetImageTransformParameterivHP(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetImageTransformParameterivHP(target, pname, params);} - GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glGetImageTransformParameterivHP=GLee_Lazy_glGetImageTransformParameterivHP; -#endif -#ifndef GLEE_C_DEFINED_glGetImageTransformParameterfvHP -#define GLEE_C_DEFINED_glGetImageTransformParameterfvHP - void __stdcall GLee_Lazy_glGetImageTransformParameterfvHP(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetImageTransformParameterfvHP(target, pname, params);} - GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glGetImageTransformParameterfvHP=GLee_Lazy_glGetImageTransformParameterfvHP; -#endif -#endif - -/* GL_HP_convolution_border_modes */ - -#ifdef __GLEE_GL_HP_convolution_border_modes -#endif - -/* GL_INGR_palette_buffer */ - -#ifdef __GLEE_GL_INGR_palette_buffer -#endif - -/* GL_SGIX_texture_add_env */ - -#ifdef __GLEE_GL_SGIX_texture_add_env -#endif - -/* GL_EXT_color_subtable */ - -#ifdef __GLEE_GL_EXT_color_subtable -#ifndef GLEE_C_DEFINED_glColorSubTableEXT -#define GLEE_C_DEFINED_glColorSubTableEXT - void __stdcall GLee_Lazy_glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data) {if (GLeeInit()) glColorSubTableEXT(target, start, count, format, type, data);} - GLEEPFNGLCOLORSUBTABLEEXTPROC GLeeFuncPtr_glColorSubTableEXT=GLee_Lazy_glColorSubTableEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyColorSubTableEXT -#define GLEE_C_DEFINED_glCopyColorSubTableEXT - void __stdcall GLee_Lazy_glCopyColorSubTableEXT(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorSubTableEXT(target, start, x, y, width);} - GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC GLeeFuncPtr_glCopyColorSubTableEXT=GLee_Lazy_glCopyColorSubTableEXT; -#endif -#endif - -/* GL_PGI_vertex_hints */ - -#ifdef __GLEE_GL_PGI_vertex_hints -#endif - -/* GL_PGI_misc_hints */ - -#ifdef __GLEE_GL_PGI_misc_hints -#ifndef GLEE_C_DEFINED_glHintPGI -#define GLEE_C_DEFINED_glHintPGI - void __stdcall GLee_Lazy_glHintPGI(GLenum target, GLint mode) {if (GLeeInit()) glHintPGI(target, mode);} - GLEEPFNGLHINTPGIPROC GLeeFuncPtr_glHintPGI=GLee_Lazy_glHintPGI; -#endif -#endif - -/* GL_EXT_paletted_texture */ - -#ifdef __GLEE_GL_EXT_paletted_texture -#ifndef GLEE_C_DEFINED_glColorTableEXT -#define GLEE_C_DEFINED_glColorTableEXT - void __stdcall GLee_Lazy_glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table) {if (GLeeInit()) glColorTableEXT(target, internalFormat, width, format, type, table);} - GLEEPFNGLCOLORTABLEEXTPROC GLeeFuncPtr_glColorTableEXT=GLee_Lazy_glColorTableEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableEXT -#define GLEE_C_DEFINED_glGetColorTableEXT - void __stdcall GLee_Lazy_glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid * data) {if (GLeeInit()) glGetColorTableEXT(target, format, type, data);} - GLEEPFNGLGETCOLORTABLEEXTPROC GLeeFuncPtr_glGetColorTableEXT=GLee_Lazy_glGetColorTableEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableParameterivEXT -#define GLEE_C_DEFINED_glGetColorTableParameterivEXT - void __stdcall GLee_Lazy_glGetColorTableParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetColorTableParameterivEXT(target, pname, params);} - GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLeeFuncPtr_glGetColorTableParameterivEXT=GLee_Lazy_glGetColorTableParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetColorTableParameterfvEXT -#define GLEE_C_DEFINED_glGetColorTableParameterfvEXT - void __stdcall GLee_Lazy_glGetColorTableParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetColorTableParameterfvEXT(target, pname, params);} - GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLeeFuncPtr_glGetColorTableParameterfvEXT=GLee_Lazy_glGetColorTableParameterfvEXT; -#endif -#endif - -/* GL_EXT_clip_volume_hint */ - -#ifdef __GLEE_GL_EXT_clip_volume_hint -#endif - -/* GL_SGIX_list_priority */ - -#ifdef __GLEE_GL_SGIX_list_priority -#ifndef GLEE_C_DEFINED_glGetListParameterfvSGIX -#define GLEE_C_DEFINED_glGetListParameterfvSGIX - void __stdcall GLee_Lazy_glGetListParameterfvSGIX(GLuint list, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetListParameterfvSGIX(list, pname, params);} - GLEEPFNGLGETLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glGetListParameterfvSGIX=GLee_Lazy_glGetListParameterfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glGetListParameterivSGIX -#define GLEE_C_DEFINED_glGetListParameterivSGIX - void __stdcall GLee_Lazy_glGetListParameterivSGIX(GLuint list, GLenum pname, GLint * params) {if (GLeeInit()) glGetListParameterivSGIX(list, pname, params);} - GLEEPFNGLGETLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glGetListParameterivSGIX=GLee_Lazy_glGetListParameterivSGIX; -#endif -#ifndef GLEE_C_DEFINED_glListParameterfSGIX -#define GLEE_C_DEFINED_glListParameterfSGIX - void __stdcall GLee_Lazy_glListParameterfSGIX(GLuint list, GLenum pname, GLfloat param) {if (GLeeInit()) glListParameterfSGIX(list, pname, param);} - GLEEPFNGLLISTPARAMETERFSGIXPROC GLeeFuncPtr_glListParameterfSGIX=GLee_Lazy_glListParameterfSGIX; -#endif -#ifndef GLEE_C_DEFINED_glListParameterfvSGIX -#define GLEE_C_DEFINED_glListParameterfvSGIX - void __stdcall GLee_Lazy_glListParameterfvSGIX(GLuint list, GLenum pname, const GLfloat * params) {if (GLeeInit()) glListParameterfvSGIX(list, pname, params);} - GLEEPFNGLLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glListParameterfvSGIX=GLee_Lazy_glListParameterfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glListParameteriSGIX -#define GLEE_C_DEFINED_glListParameteriSGIX - void __stdcall GLee_Lazy_glListParameteriSGIX(GLuint list, GLenum pname, GLint param) {if (GLeeInit()) glListParameteriSGIX(list, pname, param);} - GLEEPFNGLLISTPARAMETERISGIXPROC GLeeFuncPtr_glListParameteriSGIX=GLee_Lazy_glListParameteriSGIX; -#endif -#ifndef GLEE_C_DEFINED_glListParameterivSGIX -#define GLEE_C_DEFINED_glListParameterivSGIX - void __stdcall GLee_Lazy_glListParameterivSGIX(GLuint list, GLenum pname, const GLint * params) {if (GLeeInit()) glListParameterivSGIX(list, pname, params);} - GLEEPFNGLLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glListParameterivSGIX=GLee_Lazy_glListParameterivSGIX; -#endif -#endif - -/* GL_SGIX_ir_instrument1 */ - -#ifdef __GLEE_GL_SGIX_ir_instrument1 -#endif - -/* GL_SGIX_calligraphic_fragment */ - -#ifdef __GLEE_GL_SGIX_calligraphic_fragment -#endif - -/* GL_SGIX_texture_lod_bias */ - -#ifdef __GLEE_GL_SGIX_texture_lod_bias -#endif - -/* GL_SGIX_shadow_ambient */ - -#ifdef __GLEE_GL_SGIX_shadow_ambient -#endif - -/* GL_EXT_index_texture */ - -#ifdef __GLEE_GL_EXT_index_texture -#endif - -/* GL_EXT_index_material */ - -#ifdef __GLEE_GL_EXT_index_material -#ifndef GLEE_C_DEFINED_glIndexMaterialEXT -#define GLEE_C_DEFINED_glIndexMaterialEXT - void __stdcall GLee_Lazy_glIndexMaterialEXT(GLenum face, GLenum mode) {if (GLeeInit()) glIndexMaterialEXT(face, mode);} - GLEEPFNGLINDEXMATERIALEXTPROC GLeeFuncPtr_glIndexMaterialEXT=GLee_Lazy_glIndexMaterialEXT; -#endif -#endif - -/* GL_EXT_index_func */ - -#ifdef __GLEE_GL_EXT_index_func -#ifndef GLEE_C_DEFINED_glIndexFuncEXT -#define GLEE_C_DEFINED_glIndexFuncEXT - void __stdcall GLee_Lazy_glIndexFuncEXT(GLenum func, GLclampf ref) {if (GLeeInit()) glIndexFuncEXT(func, ref);} - GLEEPFNGLINDEXFUNCEXTPROC GLeeFuncPtr_glIndexFuncEXT=GLee_Lazy_glIndexFuncEXT; -#endif -#endif - -/* GL_EXT_index_array_formats */ - -#ifdef __GLEE_GL_EXT_index_array_formats -#endif - -/* GL_EXT_compiled_vertex_array */ - -#ifdef __GLEE_GL_EXT_compiled_vertex_array -#ifndef GLEE_C_DEFINED_glLockArraysEXT -#define GLEE_C_DEFINED_glLockArraysEXT - void __stdcall GLee_Lazy_glLockArraysEXT(GLint first, GLsizei count) {if (GLeeInit()) glLockArraysEXT(first, count);} - GLEEPFNGLLOCKARRAYSEXTPROC GLeeFuncPtr_glLockArraysEXT=GLee_Lazy_glLockArraysEXT; -#endif -#ifndef GLEE_C_DEFINED_glUnlockArraysEXT -#define GLEE_C_DEFINED_glUnlockArraysEXT - void __stdcall GLee_Lazy_glUnlockArraysEXT(void) {if (GLeeInit()) glUnlockArraysEXT();} - GLEEPFNGLUNLOCKARRAYSEXTPROC GLeeFuncPtr_glUnlockArraysEXT=GLee_Lazy_glUnlockArraysEXT; -#endif -#endif - -/* GL_EXT_cull_vertex */ - -#ifdef __GLEE_GL_EXT_cull_vertex -#ifndef GLEE_C_DEFINED_glCullParameterdvEXT -#define GLEE_C_DEFINED_glCullParameterdvEXT - void __stdcall GLee_Lazy_glCullParameterdvEXT(GLenum pname, GLdouble * params) {if (GLeeInit()) glCullParameterdvEXT(pname, params);} - GLEEPFNGLCULLPARAMETERDVEXTPROC GLeeFuncPtr_glCullParameterdvEXT=GLee_Lazy_glCullParameterdvEXT; -#endif -#ifndef GLEE_C_DEFINED_glCullParameterfvEXT -#define GLEE_C_DEFINED_glCullParameterfvEXT - void __stdcall GLee_Lazy_glCullParameterfvEXT(GLenum pname, GLfloat * params) {if (GLeeInit()) glCullParameterfvEXT(pname, params);} - GLEEPFNGLCULLPARAMETERFVEXTPROC GLeeFuncPtr_glCullParameterfvEXT=GLee_Lazy_glCullParameterfvEXT; -#endif -#endif - -/* GL_SGIX_ycrcb */ - -#ifdef __GLEE_GL_SGIX_ycrcb -#endif - -/* GL_SGIX_fragment_lighting */ - -#ifdef __GLEE_GL_SGIX_fragment_lighting -#ifndef GLEE_C_DEFINED_glFragmentColorMaterialSGIX -#define GLEE_C_DEFINED_glFragmentColorMaterialSGIX - void __stdcall GLee_Lazy_glFragmentColorMaterialSGIX(GLenum face, GLenum mode) {if (GLeeInit()) glFragmentColorMaterialSGIX(face, mode);} - GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC GLeeFuncPtr_glFragmentColorMaterialSGIX=GLee_Lazy_glFragmentColorMaterialSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightfSGIX -#define GLEE_C_DEFINED_glFragmentLightfSGIX - void __stdcall GLee_Lazy_glFragmentLightfSGIX(GLenum light, GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightfSGIX(light, pname, param);} - GLEEPFNGLFRAGMENTLIGHTFSGIXPROC GLeeFuncPtr_glFragmentLightfSGIX=GLee_Lazy_glFragmentLightfSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightfvSGIX -#define GLEE_C_DEFINED_glFragmentLightfvSGIX - void __stdcall GLee_Lazy_glFragmentLightfvSGIX(GLenum light, GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentLightfvSGIX(light, pname, params);} - GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glFragmentLightfvSGIX=GLee_Lazy_glFragmentLightfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightiSGIX -#define GLEE_C_DEFINED_glFragmentLightiSGIX - void __stdcall GLee_Lazy_glFragmentLightiSGIX(GLenum light, GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightiSGIX(light, pname, param);} - GLEEPFNGLFRAGMENTLIGHTISGIXPROC GLeeFuncPtr_glFragmentLightiSGIX=GLee_Lazy_glFragmentLightiSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightivSGIX -#define GLEE_C_DEFINED_glFragmentLightivSGIX - void __stdcall GLee_Lazy_glFragmentLightivSGIX(GLenum light, GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentLightivSGIX(light, pname, params);} - GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glFragmentLightivSGIX=GLee_Lazy_glFragmentLightivSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModelfSGIX -#define GLEE_C_DEFINED_glFragmentLightModelfSGIX - void __stdcall GLee_Lazy_glFragmentLightModelfSGIX(GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightModelfSGIX(pname, param);} - GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC GLeeFuncPtr_glFragmentLightModelfSGIX=GLee_Lazy_glFragmentLightModelfSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModelfvSGIX -#define GLEE_C_DEFINED_glFragmentLightModelfvSGIX - void __stdcall GLee_Lazy_glFragmentLightModelfvSGIX(GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentLightModelfvSGIX(pname, params);} - GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC GLeeFuncPtr_glFragmentLightModelfvSGIX=GLee_Lazy_glFragmentLightModelfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModeliSGIX -#define GLEE_C_DEFINED_glFragmentLightModeliSGIX - void __stdcall GLee_Lazy_glFragmentLightModeliSGIX(GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightModeliSGIX(pname, param);} - GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC GLeeFuncPtr_glFragmentLightModeliSGIX=GLee_Lazy_glFragmentLightModeliSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModelivSGIX -#define GLEE_C_DEFINED_glFragmentLightModelivSGIX - void __stdcall GLee_Lazy_glFragmentLightModelivSGIX(GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentLightModelivSGIX(pname, params);} - GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC GLeeFuncPtr_glFragmentLightModelivSGIX=GLee_Lazy_glFragmentLightModelivSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialfSGIX -#define GLEE_C_DEFINED_glFragmentMaterialfSGIX - void __stdcall GLee_Lazy_glFragmentMaterialfSGIX(GLenum face, GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentMaterialfSGIX(face, pname, param);} - GLEEPFNGLFRAGMENTMATERIALFSGIXPROC GLeeFuncPtr_glFragmentMaterialfSGIX=GLee_Lazy_glFragmentMaterialfSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialfvSGIX -#define GLEE_C_DEFINED_glFragmentMaterialfvSGIX - void __stdcall GLee_Lazy_glFragmentMaterialfvSGIX(GLenum face, GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentMaterialfvSGIX(face, pname, params);} - GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glFragmentMaterialfvSGIX=GLee_Lazy_glFragmentMaterialfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialiSGIX -#define GLEE_C_DEFINED_glFragmentMaterialiSGIX - void __stdcall GLee_Lazy_glFragmentMaterialiSGIX(GLenum face, GLenum pname, GLint param) {if (GLeeInit()) glFragmentMaterialiSGIX(face, pname, param);} - GLEEPFNGLFRAGMENTMATERIALISGIXPROC GLeeFuncPtr_glFragmentMaterialiSGIX=GLee_Lazy_glFragmentMaterialiSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialivSGIX -#define GLEE_C_DEFINED_glFragmentMaterialivSGIX - void __stdcall GLee_Lazy_glFragmentMaterialivSGIX(GLenum face, GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentMaterialivSGIX(face, pname, params);} - GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glFragmentMaterialivSGIX=GLee_Lazy_glFragmentMaterialivSGIX; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentLightfvSGIX -#define GLEE_C_DEFINED_glGetFragmentLightfvSGIX - void __stdcall GLee_Lazy_glGetFragmentLightfvSGIX(GLenum light, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFragmentLightfvSGIX(light, pname, params);} - GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glGetFragmentLightfvSGIX=GLee_Lazy_glGetFragmentLightfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentLightivSGIX -#define GLEE_C_DEFINED_glGetFragmentLightivSGIX - void __stdcall GLee_Lazy_glGetFragmentLightivSGIX(GLenum light, GLenum pname, GLint * params) {if (GLeeInit()) glGetFragmentLightivSGIX(light, pname, params);} - GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glGetFragmentLightivSGIX=GLee_Lazy_glGetFragmentLightivSGIX; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentMaterialfvSGIX -#define GLEE_C_DEFINED_glGetFragmentMaterialfvSGIX - void __stdcall GLee_Lazy_glGetFragmentMaterialfvSGIX(GLenum face, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFragmentMaterialfvSGIX(face, pname, params);} - GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialfvSGIX=GLee_Lazy_glGetFragmentMaterialfvSGIX; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentMaterialivSGIX -#define GLEE_C_DEFINED_glGetFragmentMaterialivSGIX - void __stdcall GLee_Lazy_glGetFragmentMaterialivSGIX(GLenum face, GLenum pname, GLint * params) {if (GLeeInit()) glGetFragmentMaterialivSGIX(face, pname, params);} - GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialivSGIX=GLee_Lazy_glGetFragmentMaterialivSGIX; -#endif -#ifndef GLEE_C_DEFINED_glLightEnviSGIX -#define GLEE_C_DEFINED_glLightEnviSGIX - void __stdcall GLee_Lazy_glLightEnviSGIX(GLenum pname, GLint param) {if (GLeeInit()) glLightEnviSGIX(pname, param);} - GLEEPFNGLLIGHTENVISGIXPROC GLeeFuncPtr_glLightEnviSGIX=GLee_Lazy_glLightEnviSGIX; -#endif -#endif - -/* GL_IBM_rasterpos_clip */ - -#ifdef __GLEE_GL_IBM_rasterpos_clip -#endif - -/* GL_HP_texture_lighting */ - -#ifdef __GLEE_GL_HP_texture_lighting -#endif - -/* GL_EXT_draw_range_elements */ - -#ifdef __GLEE_GL_EXT_draw_range_elements -#ifndef GLEE_C_DEFINED_glDrawRangeElementsEXT -#define GLEE_C_DEFINED_glDrawRangeElementsEXT - void __stdcall GLee_Lazy_glDrawRangeElementsEXT(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) {if (GLeeInit()) glDrawRangeElementsEXT(mode, start, end, count, type, indices);} - GLEEPFNGLDRAWRANGEELEMENTSEXTPROC GLeeFuncPtr_glDrawRangeElementsEXT=GLee_Lazy_glDrawRangeElementsEXT; -#endif -#endif - -/* GL_WIN_phong_shading */ - -#ifdef __GLEE_GL_WIN_phong_shading -#endif - -/* GL_WIN_specular_fog */ - -#ifdef __GLEE_GL_WIN_specular_fog -#endif - -/* GL_EXT_light_texture */ - -#ifdef __GLEE_GL_EXT_light_texture -#ifndef GLEE_C_DEFINED_glApplyTextureEXT -#define GLEE_C_DEFINED_glApplyTextureEXT - void __stdcall GLee_Lazy_glApplyTextureEXT(GLenum mode) {if (GLeeInit()) glApplyTextureEXT(mode);} - GLEEPFNGLAPPLYTEXTUREEXTPROC GLeeFuncPtr_glApplyTextureEXT=GLee_Lazy_glApplyTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureLightEXT -#define GLEE_C_DEFINED_glTextureLightEXT - void __stdcall GLee_Lazy_glTextureLightEXT(GLenum pname) {if (GLeeInit()) glTextureLightEXT(pname);} - GLEEPFNGLTEXTURELIGHTEXTPROC GLeeFuncPtr_glTextureLightEXT=GLee_Lazy_glTextureLightEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureMaterialEXT -#define GLEE_C_DEFINED_glTextureMaterialEXT - void __stdcall GLee_Lazy_glTextureMaterialEXT(GLenum face, GLenum mode) {if (GLeeInit()) glTextureMaterialEXT(face, mode);} - GLEEPFNGLTEXTUREMATERIALEXTPROC GLeeFuncPtr_glTextureMaterialEXT=GLee_Lazy_glTextureMaterialEXT; -#endif -#endif - -/* GL_SGIX_blend_alpha_minmax */ - -#ifdef __GLEE_GL_SGIX_blend_alpha_minmax -#endif - -/* GL_SGIX_impact_pixel_texture */ - -#ifdef __GLEE_GL_SGIX_impact_pixel_texture -#endif - -/* GL_EXT_bgra */ - -#ifdef __GLEE_GL_EXT_bgra -#endif - -/* GL_SGIX_async */ - -#ifdef __GLEE_GL_SGIX_async -#ifndef GLEE_C_DEFINED_glAsyncMarkerSGIX -#define GLEE_C_DEFINED_glAsyncMarkerSGIX - void __stdcall GLee_Lazy_glAsyncMarkerSGIX(GLuint marker) {if (GLeeInit()) glAsyncMarkerSGIX(marker);} - GLEEPFNGLASYNCMARKERSGIXPROC GLeeFuncPtr_glAsyncMarkerSGIX=GLee_Lazy_glAsyncMarkerSGIX; -#endif -#ifndef GLEE_C_DEFINED_glFinishAsyncSGIX -#define GLEE_C_DEFINED_glFinishAsyncSGIX - GLint __stdcall GLee_Lazy_glFinishAsyncSGIX(GLuint * markerp) {if (GLeeInit()) return glFinishAsyncSGIX(markerp); return (GLint)0;} - GLEEPFNGLFINISHASYNCSGIXPROC GLeeFuncPtr_glFinishAsyncSGIX=GLee_Lazy_glFinishAsyncSGIX; -#endif -#ifndef GLEE_C_DEFINED_glPollAsyncSGIX -#define GLEE_C_DEFINED_glPollAsyncSGIX - GLint __stdcall GLee_Lazy_glPollAsyncSGIX(GLuint * markerp) {if (GLeeInit()) return glPollAsyncSGIX(markerp); return (GLint)0;} - GLEEPFNGLPOLLASYNCSGIXPROC GLeeFuncPtr_glPollAsyncSGIX=GLee_Lazy_glPollAsyncSGIX; -#endif -#ifndef GLEE_C_DEFINED_glGenAsyncMarkersSGIX -#define GLEE_C_DEFINED_glGenAsyncMarkersSGIX - GLuint __stdcall GLee_Lazy_glGenAsyncMarkersSGIX(GLsizei range) {if (GLeeInit()) return glGenAsyncMarkersSGIX(range); return (GLuint)0;} - GLEEPFNGLGENASYNCMARKERSSGIXPROC GLeeFuncPtr_glGenAsyncMarkersSGIX=GLee_Lazy_glGenAsyncMarkersSGIX; -#endif -#ifndef GLEE_C_DEFINED_glDeleteAsyncMarkersSGIX -#define GLEE_C_DEFINED_glDeleteAsyncMarkersSGIX - void __stdcall GLee_Lazy_glDeleteAsyncMarkersSGIX(GLuint marker, GLsizei range) {if (GLeeInit()) glDeleteAsyncMarkersSGIX(marker, range);} - GLEEPFNGLDELETEASYNCMARKERSSGIXPROC GLeeFuncPtr_glDeleteAsyncMarkersSGIX=GLee_Lazy_glDeleteAsyncMarkersSGIX; -#endif -#ifndef GLEE_C_DEFINED_glIsAsyncMarkerSGIX -#define GLEE_C_DEFINED_glIsAsyncMarkerSGIX - GLboolean __stdcall GLee_Lazy_glIsAsyncMarkerSGIX(GLuint marker) {if (GLeeInit()) return glIsAsyncMarkerSGIX(marker); return (GLboolean)0;} - GLEEPFNGLISASYNCMARKERSGIXPROC GLeeFuncPtr_glIsAsyncMarkerSGIX=GLee_Lazy_glIsAsyncMarkerSGIX; -#endif -#endif - -/* GL_SGIX_async_pixel */ - -#ifdef __GLEE_GL_SGIX_async_pixel -#endif - -/* GL_SGIX_async_histogram */ - -#ifdef __GLEE_GL_SGIX_async_histogram -#endif - -/* GL_INTEL_texture_scissor */ - -#ifdef __GLEE_GL_INTEL_texture_scissor -#endif - -/* GL_INTEL_parallel_arrays */ - -#ifdef __GLEE_GL_INTEL_parallel_arrays -#ifndef GLEE_C_DEFINED_glVertexPointervINTEL -#define GLEE_C_DEFINED_glVertexPointervINTEL - void __stdcall GLee_Lazy_glVertexPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glVertexPointervINTEL(size, type, pointer);} - GLEEPFNGLVERTEXPOINTERVINTELPROC GLeeFuncPtr_glVertexPointervINTEL=GLee_Lazy_glVertexPointervINTEL; -#endif -#ifndef GLEE_C_DEFINED_glNormalPointervINTEL -#define GLEE_C_DEFINED_glNormalPointervINTEL - void __stdcall GLee_Lazy_glNormalPointervINTEL(GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glNormalPointervINTEL(type, pointer);} - GLEEPFNGLNORMALPOINTERVINTELPROC GLeeFuncPtr_glNormalPointervINTEL=GLee_Lazy_glNormalPointervINTEL; -#endif -#ifndef GLEE_C_DEFINED_glColorPointervINTEL -#define GLEE_C_DEFINED_glColorPointervINTEL - void __stdcall GLee_Lazy_glColorPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glColorPointervINTEL(size, type, pointer);} - GLEEPFNGLCOLORPOINTERVINTELPROC GLeeFuncPtr_glColorPointervINTEL=GLee_Lazy_glColorPointervINTEL; -#endif -#ifndef GLEE_C_DEFINED_glTexCoordPointervINTEL -#define GLEE_C_DEFINED_glTexCoordPointervINTEL - void __stdcall GLee_Lazy_glTexCoordPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glTexCoordPointervINTEL(size, type, pointer);} - GLEEPFNGLTEXCOORDPOINTERVINTELPROC GLeeFuncPtr_glTexCoordPointervINTEL=GLee_Lazy_glTexCoordPointervINTEL; -#endif -#endif - -/* GL_HP_occlusion_test */ - -#ifdef __GLEE_GL_HP_occlusion_test -#endif - -/* GL_EXT_pixel_transform */ - -#ifdef __GLEE_GL_EXT_pixel_transform -#ifndef GLEE_C_DEFINED_glPixelTransformParameteriEXT -#define GLEE_C_DEFINED_glPixelTransformParameteriEXT - void __stdcall GLee_Lazy_glPixelTransformParameteriEXT(GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glPixelTransformParameteriEXT(target, pname, param);} - GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC GLeeFuncPtr_glPixelTransformParameteriEXT=GLee_Lazy_glPixelTransformParameteriEXT; -#endif -#ifndef GLEE_C_DEFINED_glPixelTransformParameterfEXT -#define GLEE_C_DEFINED_glPixelTransformParameterfEXT - void __stdcall GLee_Lazy_glPixelTransformParameterfEXT(GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glPixelTransformParameterfEXT(target, pname, param);} - GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC GLeeFuncPtr_glPixelTransformParameterfEXT=GLee_Lazy_glPixelTransformParameterfEXT; -#endif -#ifndef GLEE_C_DEFINED_glPixelTransformParameterivEXT -#define GLEE_C_DEFINED_glPixelTransformParameterivEXT - void __stdcall GLee_Lazy_glPixelTransformParameterivEXT(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glPixelTransformParameterivEXT(target, pname, params);} - GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC GLeeFuncPtr_glPixelTransformParameterivEXT=GLee_Lazy_glPixelTransformParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glPixelTransformParameterfvEXT -#define GLEE_C_DEFINED_glPixelTransformParameterfvEXT - void __stdcall GLee_Lazy_glPixelTransformParameterfvEXT(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glPixelTransformParameterfvEXT(target, pname, params);} - GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC GLeeFuncPtr_glPixelTransformParameterfvEXT=GLee_Lazy_glPixelTransformParameterfvEXT; -#endif -#endif - -/* GL_EXT_pixel_transform_color_table */ - -#ifdef __GLEE_GL_EXT_pixel_transform_color_table -#endif - -/* GL_EXT_shared_texture_palette */ - -#ifdef __GLEE_GL_EXT_shared_texture_palette -#endif - -/* GL_EXT_separate_specular_color */ - -#ifdef __GLEE_GL_EXT_separate_specular_color -#endif - -/* GL_EXT_secondary_color */ - -#ifdef __GLEE_GL_EXT_secondary_color -#ifndef GLEE_C_DEFINED_glSecondaryColor3bEXT -#define GLEE_C_DEFINED_glSecondaryColor3bEXT - void __stdcall GLee_Lazy_glSecondaryColor3bEXT(GLbyte red, GLbyte green, GLbyte blue) {if (GLeeInit()) glSecondaryColor3bEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3BEXTPROC GLeeFuncPtr_glSecondaryColor3bEXT=GLee_Lazy_glSecondaryColor3bEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3bvEXT -#define GLEE_C_DEFINED_glSecondaryColor3bvEXT - void __stdcall GLee_Lazy_glSecondaryColor3bvEXT(const GLbyte * v) {if (GLeeInit()) glSecondaryColor3bvEXT(v);} - GLEEPFNGLSECONDARYCOLOR3BVEXTPROC GLeeFuncPtr_glSecondaryColor3bvEXT=GLee_Lazy_glSecondaryColor3bvEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3dEXT -#define GLEE_C_DEFINED_glSecondaryColor3dEXT - void __stdcall GLee_Lazy_glSecondaryColor3dEXT(GLdouble red, GLdouble green, GLdouble blue) {if (GLeeInit()) glSecondaryColor3dEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3DEXTPROC GLeeFuncPtr_glSecondaryColor3dEXT=GLee_Lazy_glSecondaryColor3dEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3dvEXT -#define GLEE_C_DEFINED_glSecondaryColor3dvEXT - void __stdcall GLee_Lazy_glSecondaryColor3dvEXT(const GLdouble * v) {if (GLeeInit()) glSecondaryColor3dvEXT(v);} - GLEEPFNGLSECONDARYCOLOR3DVEXTPROC GLeeFuncPtr_glSecondaryColor3dvEXT=GLee_Lazy_glSecondaryColor3dvEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3fEXT -#define GLEE_C_DEFINED_glSecondaryColor3fEXT - void __stdcall GLee_Lazy_glSecondaryColor3fEXT(GLfloat red, GLfloat green, GLfloat blue) {if (GLeeInit()) glSecondaryColor3fEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3FEXTPROC GLeeFuncPtr_glSecondaryColor3fEXT=GLee_Lazy_glSecondaryColor3fEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3fvEXT -#define GLEE_C_DEFINED_glSecondaryColor3fvEXT - void __stdcall GLee_Lazy_glSecondaryColor3fvEXT(const GLfloat * v) {if (GLeeInit()) glSecondaryColor3fvEXT(v);} - GLEEPFNGLSECONDARYCOLOR3FVEXTPROC GLeeFuncPtr_glSecondaryColor3fvEXT=GLee_Lazy_glSecondaryColor3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3iEXT -#define GLEE_C_DEFINED_glSecondaryColor3iEXT - void __stdcall GLee_Lazy_glSecondaryColor3iEXT(GLint red, GLint green, GLint blue) {if (GLeeInit()) glSecondaryColor3iEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3IEXTPROC GLeeFuncPtr_glSecondaryColor3iEXT=GLee_Lazy_glSecondaryColor3iEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3ivEXT -#define GLEE_C_DEFINED_glSecondaryColor3ivEXT - void __stdcall GLee_Lazy_glSecondaryColor3ivEXT(const GLint * v) {if (GLeeInit()) glSecondaryColor3ivEXT(v);} - GLEEPFNGLSECONDARYCOLOR3IVEXTPROC GLeeFuncPtr_glSecondaryColor3ivEXT=GLee_Lazy_glSecondaryColor3ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3sEXT -#define GLEE_C_DEFINED_glSecondaryColor3sEXT - void __stdcall GLee_Lazy_glSecondaryColor3sEXT(GLshort red, GLshort green, GLshort blue) {if (GLeeInit()) glSecondaryColor3sEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3SEXTPROC GLeeFuncPtr_glSecondaryColor3sEXT=GLee_Lazy_glSecondaryColor3sEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3svEXT -#define GLEE_C_DEFINED_glSecondaryColor3svEXT - void __stdcall GLee_Lazy_glSecondaryColor3svEXT(const GLshort * v) {if (GLeeInit()) glSecondaryColor3svEXT(v);} - GLEEPFNGLSECONDARYCOLOR3SVEXTPROC GLeeFuncPtr_glSecondaryColor3svEXT=GLee_Lazy_glSecondaryColor3svEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3ubEXT -#define GLEE_C_DEFINED_glSecondaryColor3ubEXT - void __stdcall GLee_Lazy_glSecondaryColor3ubEXT(GLubyte red, GLubyte green, GLubyte blue) {if (GLeeInit()) glSecondaryColor3ubEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3UBEXTPROC GLeeFuncPtr_glSecondaryColor3ubEXT=GLee_Lazy_glSecondaryColor3ubEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3ubvEXT -#define GLEE_C_DEFINED_glSecondaryColor3ubvEXT - void __stdcall GLee_Lazy_glSecondaryColor3ubvEXT(const GLubyte * v) {if (GLeeInit()) glSecondaryColor3ubvEXT(v);} - GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC GLeeFuncPtr_glSecondaryColor3ubvEXT=GLee_Lazy_glSecondaryColor3ubvEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3uiEXT -#define GLEE_C_DEFINED_glSecondaryColor3uiEXT - void __stdcall GLee_Lazy_glSecondaryColor3uiEXT(GLuint red, GLuint green, GLuint blue) {if (GLeeInit()) glSecondaryColor3uiEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3UIEXTPROC GLeeFuncPtr_glSecondaryColor3uiEXT=GLee_Lazy_glSecondaryColor3uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3uivEXT -#define GLEE_C_DEFINED_glSecondaryColor3uivEXT - void __stdcall GLee_Lazy_glSecondaryColor3uivEXT(const GLuint * v) {if (GLeeInit()) glSecondaryColor3uivEXT(v);} - GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC GLeeFuncPtr_glSecondaryColor3uivEXT=GLee_Lazy_glSecondaryColor3uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3usEXT -#define GLEE_C_DEFINED_glSecondaryColor3usEXT - void __stdcall GLee_Lazy_glSecondaryColor3usEXT(GLushort red, GLushort green, GLushort blue) {if (GLeeInit()) glSecondaryColor3usEXT(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3USEXTPROC GLeeFuncPtr_glSecondaryColor3usEXT=GLee_Lazy_glSecondaryColor3usEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3usvEXT -#define GLEE_C_DEFINED_glSecondaryColor3usvEXT - void __stdcall GLee_Lazy_glSecondaryColor3usvEXT(const GLushort * v) {if (GLeeInit()) glSecondaryColor3usvEXT(v);} - GLEEPFNGLSECONDARYCOLOR3USVEXTPROC GLeeFuncPtr_glSecondaryColor3usvEXT=GLee_Lazy_glSecondaryColor3usvEXT; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColorPointerEXT -#define GLEE_C_DEFINED_glSecondaryColorPointerEXT - void __stdcall GLee_Lazy_glSecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glSecondaryColorPointerEXT(size, type, stride, pointer);} - GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC GLeeFuncPtr_glSecondaryColorPointerEXT=GLee_Lazy_glSecondaryColorPointerEXT; -#endif -#endif - -/* GL_EXT_texture_perturb_normal */ - -#ifdef __GLEE_GL_EXT_texture_perturb_normal -#ifndef GLEE_C_DEFINED_glTextureNormalEXT -#define GLEE_C_DEFINED_glTextureNormalEXT - void __stdcall GLee_Lazy_glTextureNormalEXT(GLenum mode) {if (GLeeInit()) glTextureNormalEXT(mode);} - GLEEPFNGLTEXTURENORMALEXTPROC GLeeFuncPtr_glTextureNormalEXT=GLee_Lazy_glTextureNormalEXT; -#endif -#endif - -/* GL_EXT_multi_draw_arrays */ - -#ifdef __GLEE_GL_EXT_multi_draw_arrays -#ifndef GLEE_C_DEFINED_glMultiDrawArraysEXT -#define GLEE_C_DEFINED_glMultiDrawArraysEXT - void __stdcall GLee_Lazy_glMultiDrawArraysEXT(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawArraysEXT(mode, first, count, primcount);} - GLEEPFNGLMULTIDRAWARRAYSEXTPROC GLeeFuncPtr_glMultiDrawArraysEXT=GLee_Lazy_glMultiDrawArraysEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiDrawElementsEXT -#define GLEE_C_DEFINED_glMultiDrawElementsEXT - void __stdcall GLee_Lazy_glMultiDrawElementsEXT(GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount) {if (GLeeInit()) glMultiDrawElementsEXT(mode, count, type, indices, primcount);} - GLEEPFNGLMULTIDRAWELEMENTSEXTPROC GLeeFuncPtr_glMultiDrawElementsEXT=GLee_Lazy_glMultiDrawElementsEXT; -#endif -#endif - -/* GL_EXT_fog_coord */ - -#ifdef __GLEE_GL_EXT_fog_coord -#ifndef GLEE_C_DEFINED_glFogCoordfEXT -#define GLEE_C_DEFINED_glFogCoordfEXT - void __stdcall GLee_Lazy_glFogCoordfEXT(GLfloat coord) {if (GLeeInit()) glFogCoordfEXT(coord);} - GLEEPFNGLFOGCOORDFEXTPROC GLeeFuncPtr_glFogCoordfEXT=GLee_Lazy_glFogCoordfEXT; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordfvEXT -#define GLEE_C_DEFINED_glFogCoordfvEXT - void __stdcall GLee_Lazy_glFogCoordfvEXT(const GLfloat * coord) {if (GLeeInit()) glFogCoordfvEXT(coord);} - GLEEPFNGLFOGCOORDFVEXTPROC GLeeFuncPtr_glFogCoordfvEXT=GLee_Lazy_glFogCoordfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glFogCoorddEXT -#define GLEE_C_DEFINED_glFogCoorddEXT - void __stdcall GLee_Lazy_glFogCoorddEXT(GLdouble coord) {if (GLeeInit()) glFogCoorddEXT(coord);} - GLEEPFNGLFOGCOORDDEXTPROC GLeeFuncPtr_glFogCoorddEXT=GLee_Lazy_glFogCoorddEXT; -#endif -#ifndef GLEE_C_DEFINED_glFogCoorddvEXT -#define GLEE_C_DEFINED_glFogCoorddvEXT - void __stdcall GLee_Lazy_glFogCoorddvEXT(const GLdouble * coord) {if (GLeeInit()) glFogCoorddvEXT(coord);} - GLEEPFNGLFOGCOORDDVEXTPROC GLeeFuncPtr_glFogCoorddvEXT=GLee_Lazy_glFogCoorddvEXT; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordPointerEXT -#define GLEE_C_DEFINED_glFogCoordPointerEXT - void __stdcall GLee_Lazy_glFogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glFogCoordPointerEXT(type, stride, pointer);} - GLEEPFNGLFOGCOORDPOINTEREXTPROC GLeeFuncPtr_glFogCoordPointerEXT=GLee_Lazy_glFogCoordPointerEXT; -#endif -#endif - -/* GL_REND_screen_coordinates */ - -#ifdef __GLEE_GL_REND_screen_coordinates -#endif - -/* GL_EXT_coordinate_frame */ - -#ifdef __GLEE_GL_EXT_coordinate_frame -#ifndef GLEE_C_DEFINED_glTangent3bEXT -#define GLEE_C_DEFINED_glTangent3bEXT - void __stdcall GLee_Lazy_glTangent3bEXT(GLbyte tx, GLbyte ty, GLbyte tz) {if (GLeeInit()) glTangent3bEXT(tx, ty, tz);} - GLEEPFNGLTANGENT3BEXTPROC GLeeFuncPtr_glTangent3bEXT=GLee_Lazy_glTangent3bEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3bvEXT -#define GLEE_C_DEFINED_glTangent3bvEXT - void __stdcall GLee_Lazy_glTangent3bvEXT(const GLbyte * v) {if (GLeeInit()) glTangent3bvEXT(v);} - GLEEPFNGLTANGENT3BVEXTPROC GLeeFuncPtr_glTangent3bvEXT=GLee_Lazy_glTangent3bvEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3dEXT -#define GLEE_C_DEFINED_glTangent3dEXT - void __stdcall GLee_Lazy_glTangent3dEXT(GLdouble tx, GLdouble ty, GLdouble tz) {if (GLeeInit()) glTangent3dEXT(tx, ty, tz);} - GLEEPFNGLTANGENT3DEXTPROC GLeeFuncPtr_glTangent3dEXT=GLee_Lazy_glTangent3dEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3dvEXT -#define GLEE_C_DEFINED_glTangent3dvEXT - void __stdcall GLee_Lazy_glTangent3dvEXT(const GLdouble * v) {if (GLeeInit()) glTangent3dvEXT(v);} - GLEEPFNGLTANGENT3DVEXTPROC GLeeFuncPtr_glTangent3dvEXT=GLee_Lazy_glTangent3dvEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3fEXT -#define GLEE_C_DEFINED_glTangent3fEXT - void __stdcall GLee_Lazy_glTangent3fEXT(GLfloat tx, GLfloat ty, GLfloat tz) {if (GLeeInit()) glTangent3fEXT(tx, ty, tz);} - GLEEPFNGLTANGENT3FEXTPROC GLeeFuncPtr_glTangent3fEXT=GLee_Lazy_glTangent3fEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3fvEXT -#define GLEE_C_DEFINED_glTangent3fvEXT - void __stdcall GLee_Lazy_glTangent3fvEXT(const GLfloat * v) {if (GLeeInit()) glTangent3fvEXT(v);} - GLEEPFNGLTANGENT3FVEXTPROC GLeeFuncPtr_glTangent3fvEXT=GLee_Lazy_glTangent3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3iEXT -#define GLEE_C_DEFINED_glTangent3iEXT - void __stdcall GLee_Lazy_glTangent3iEXT(GLint tx, GLint ty, GLint tz) {if (GLeeInit()) glTangent3iEXT(tx, ty, tz);} - GLEEPFNGLTANGENT3IEXTPROC GLeeFuncPtr_glTangent3iEXT=GLee_Lazy_glTangent3iEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3ivEXT -#define GLEE_C_DEFINED_glTangent3ivEXT - void __stdcall GLee_Lazy_glTangent3ivEXT(const GLint * v) {if (GLeeInit()) glTangent3ivEXT(v);} - GLEEPFNGLTANGENT3IVEXTPROC GLeeFuncPtr_glTangent3ivEXT=GLee_Lazy_glTangent3ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3sEXT -#define GLEE_C_DEFINED_glTangent3sEXT - void __stdcall GLee_Lazy_glTangent3sEXT(GLshort tx, GLshort ty, GLshort tz) {if (GLeeInit()) glTangent3sEXT(tx, ty, tz);} - GLEEPFNGLTANGENT3SEXTPROC GLeeFuncPtr_glTangent3sEXT=GLee_Lazy_glTangent3sEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangent3svEXT -#define GLEE_C_DEFINED_glTangent3svEXT - void __stdcall GLee_Lazy_glTangent3svEXT(const GLshort * v) {if (GLeeInit()) glTangent3svEXT(v);} - GLEEPFNGLTANGENT3SVEXTPROC GLeeFuncPtr_glTangent3svEXT=GLee_Lazy_glTangent3svEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3bEXT -#define GLEE_C_DEFINED_glBinormal3bEXT - void __stdcall GLee_Lazy_glBinormal3bEXT(GLbyte bx, GLbyte by, GLbyte bz) {if (GLeeInit()) glBinormal3bEXT(bx, by, bz);} - GLEEPFNGLBINORMAL3BEXTPROC GLeeFuncPtr_glBinormal3bEXT=GLee_Lazy_glBinormal3bEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3bvEXT -#define GLEE_C_DEFINED_glBinormal3bvEXT - void __stdcall GLee_Lazy_glBinormal3bvEXT(const GLbyte * v) {if (GLeeInit()) glBinormal3bvEXT(v);} - GLEEPFNGLBINORMAL3BVEXTPROC GLeeFuncPtr_glBinormal3bvEXT=GLee_Lazy_glBinormal3bvEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3dEXT -#define GLEE_C_DEFINED_glBinormal3dEXT - void __stdcall GLee_Lazy_glBinormal3dEXT(GLdouble bx, GLdouble by, GLdouble bz) {if (GLeeInit()) glBinormal3dEXT(bx, by, bz);} - GLEEPFNGLBINORMAL3DEXTPROC GLeeFuncPtr_glBinormal3dEXT=GLee_Lazy_glBinormal3dEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3dvEXT -#define GLEE_C_DEFINED_glBinormal3dvEXT - void __stdcall GLee_Lazy_glBinormal3dvEXT(const GLdouble * v) {if (GLeeInit()) glBinormal3dvEXT(v);} - GLEEPFNGLBINORMAL3DVEXTPROC GLeeFuncPtr_glBinormal3dvEXT=GLee_Lazy_glBinormal3dvEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3fEXT -#define GLEE_C_DEFINED_glBinormal3fEXT - void __stdcall GLee_Lazy_glBinormal3fEXT(GLfloat bx, GLfloat by, GLfloat bz) {if (GLeeInit()) glBinormal3fEXT(bx, by, bz);} - GLEEPFNGLBINORMAL3FEXTPROC GLeeFuncPtr_glBinormal3fEXT=GLee_Lazy_glBinormal3fEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3fvEXT -#define GLEE_C_DEFINED_glBinormal3fvEXT - void __stdcall GLee_Lazy_glBinormal3fvEXT(const GLfloat * v) {if (GLeeInit()) glBinormal3fvEXT(v);} - GLEEPFNGLBINORMAL3FVEXTPROC GLeeFuncPtr_glBinormal3fvEXT=GLee_Lazy_glBinormal3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3iEXT -#define GLEE_C_DEFINED_glBinormal3iEXT - void __stdcall GLee_Lazy_glBinormal3iEXT(GLint bx, GLint by, GLint bz) {if (GLeeInit()) glBinormal3iEXT(bx, by, bz);} - GLEEPFNGLBINORMAL3IEXTPROC GLeeFuncPtr_glBinormal3iEXT=GLee_Lazy_glBinormal3iEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3ivEXT -#define GLEE_C_DEFINED_glBinormal3ivEXT - void __stdcall GLee_Lazy_glBinormal3ivEXT(const GLint * v) {if (GLeeInit()) glBinormal3ivEXT(v);} - GLEEPFNGLBINORMAL3IVEXTPROC GLeeFuncPtr_glBinormal3ivEXT=GLee_Lazy_glBinormal3ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3sEXT -#define GLEE_C_DEFINED_glBinormal3sEXT - void __stdcall GLee_Lazy_glBinormal3sEXT(GLshort bx, GLshort by, GLshort bz) {if (GLeeInit()) glBinormal3sEXT(bx, by, bz);} - GLEEPFNGLBINORMAL3SEXTPROC GLeeFuncPtr_glBinormal3sEXT=GLee_Lazy_glBinormal3sEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormal3svEXT -#define GLEE_C_DEFINED_glBinormal3svEXT - void __stdcall GLee_Lazy_glBinormal3svEXT(const GLshort * v) {if (GLeeInit()) glBinormal3svEXT(v);} - GLEEPFNGLBINORMAL3SVEXTPROC GLeeFuncPtr_glBinormal3svEXT=GLee_Lazy_glBinormal3svEXT; -#endif -#ifndef GLEE_C_DEFINED_glTangentPointerEXT -#define GLEE_C_DEFINED_glTangentPointerEXT - void __stdcall GLee_Lazy_glTangentPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glTangentPointerEXT(type, stride, pointer);} - GLEEPFNGLTANGENTPOINTEREXTPROC GLeeFuncPtr_glTangentPointerEXT=GLee_Lazy_glTangentPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glBinormalPointerEXT -#define GLEE_C_DEFINED_glBinormalPointerEXT - void __stdcall GLee_Lazy_glBinormalPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glBinormalPointerEXT(type, stride, pointer);} - GLEEPFNGLBINORMALPOINTEREXTPROC GLeeFuncPtr_glBinormalPointerEXT=GLee_Lazy_glBinormalPointerEXT; -#endif -#endif - -/* GL_EXT_texture_env_combine */ - -#ifdef __GLEE_GL_EXT_texture_env_combine -#endif - -/* GL_APPLE_specular_vector */ - -#ifdef __GLEE_GL_APPLE_specular_vector -#endif - -/* GL_APPLE_transform_hint */ - -#ifdef __GLEE_GL_APPLE_transform_hint -#endif - -/* GL_SGIX_fog_scale */ - -#ifdef __GLEE_GL_SGIX_fog_scale -#endif - -/* GL_SUNX_constant_data */ - -#ifdef __GLEE_GL_SUNX_constant_data -#ifndef GLEE_C_DEFINED_glFinishTextureSUNX -#define GLEE_C_DEFINED_glFinishTextureSUNX - void __stdcall GLee_Lazy_glFinishTextureSUNX(void) {if (GLeeInit()) glFinishTextureSUNX();} - GLEEPFNGLFINISHTEXTURESUNXPROC GLeeFuncPtr_glFinishTextureSUNX=GLee_Lazy_glFinishTextureSUNX; -#endif -#endif - -/* GL_SUN_global_alpha */ - -#ifdef __GLEE_GL_SUN_global_alpha -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorbSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactorbSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactorbSUN(GLbyte factor) {if (GLeeInit()) glGlobalAlphaFactorbSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorbSUN=GLee_Lazy_glGlobalAlphaFactorbSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorsSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactorsSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactorsSUN(GLshort factor) {if (GLeeInit()) glGlobalAlphaFactorsSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorsSUN=GLee_Lazy_glGlobalAlphaFactorsSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactoriSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactoriSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactoriSUN(GLint factor) {if (GLeeInit()) glGlobalAlphaFactoriSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORISUNPROC GLeeFuncPtr_glGlobalAlphaFactoriSUN=GLee_Lazy_glGlobalAlphaFactoriSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorfSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactorfSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactorfSUN(GLfloat factor) {if (GLeeInit()) glGlobalAlphaFactorfSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORFSUNPROC GLeeFuncPtr_glGlobalAlphaFactorfSUN=GLee_Lazy_glGlobalAlphaFactorfSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactordSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactordSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactordSUN(GLdouble factor) {if (GLeeInit()) glGlobalAlphaFactordSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORDSUNPROC GLeeFuncPtr_glGlobalAlphaFactordSUN=GLee_Lazy_glGlobalAlphaFactordSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorubSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactorubSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactorubSUN(GLubyte factor) {if (GLeeInit()) glGlobalAlphaFactorubSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorubSUN=GLee_Lazy_glGlobalAlphaFactorubSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorusSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactorusSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactorusSUN(GLushort factor) {if (GLeeInit()) glGlobalAlphaFactorusSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorusSUN=GLee_Lazy_glGlobalAlphaFactorusSUN; -#endif -#ifndef GLEE_C_DEFINED_glGlobalAlphaFactoruiSUN -#define GLEE_C_DEFINED_glGlobalAlphaFactoruiSUN - void __stdcall GLee_Lazy_glGlobalAlphaFactoruiSUN(GLuint factor) {if (GLeeInit()) glGlobalAlphaFactoruiSUN(factor);} - GLEEPFNGLGLOBALALPHAFACTORUISUNPROC GLeeFuncPtr_glGlobalAlphaFactoruiSUN=GLee_Lazy_glGlobalAlphaFactoruiSUN; -#endif -#endif - -/* GL_SUN_triangle_list */ - -#ifdef __GLEE_GL_SUN_triangle_list -#ifndef GLEE_C_DEFINED_glReplacementCodeuiSUN -#define GLEE_C_DEFINED_glReplacementCodeuiSUN - void __stdcall GLee_Lazy_glReplacementCodeuiSUN(GLuint code) {if (GLeeInit()) glReplacementCodeuiSUN(code);} - GLEEPFNGLREPLACEMENTCODEUISUNPROC GLeeFuncPtr_glReplacementCodeuiSUN=GLee_Lazy_glReplacementCodeuiSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeusSUN -#define GLEE_C_DEFINED_glReplacementCodeusSUN - void __stdcall GLee_Lazy_glReplacementCodeusSUN(GLushort code) {if (GLeeInit()) glReplacementCodeusSUN(code);} - GLEEPFNGLREPLACEMENTCODEUSSUNPROC GLeeFuncPtr_glReplacementCodeusSUN=GLee_Lazy_glReplacementCodeusSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeubSUN -#define GLEE_C_DEFINED_glReplacementCodeubSUN - void __stdcall GLee_Lazy_glReplacementCodeubSUN(GLubyte code) {if (GLeeInit()) glReplacementCodeubSUN(code);} - GLEEPFNGLREPLACEMENTCODEUBSUNPROC GLeeFuncPtr_glReplacementCodeubSUN=GLee_Lazy_glReplacementCodeubSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuivSUN -#define GLEE_C_DEFINED_glReplacementCodeuivSUN - void __stdcall GLee_Lazy_glReplacementCodeuivSUN(const GLuint * code) {if (GLeeInit()) glReplacementCodeuivSUN(code);} - GLEEPFNGLREPLACEMENTCODEUIVSUNPROC GLeeFuncPtr_glReplacementCodeuivSUN=GLee_Lazy_glReplacementCodeuivSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeusvSUN -#define GLEE_C_DEFINED_glReplacementCodeusvSUN - void __stdcall GLee_Lazy_glReplacementCodeusvSUN(const GLushort * code) {if (GLeeInit()) glReplacementCodeusvSUN(code);} - GLEEPFNGLREPLACEMENTCODEUSVSUNPROC GLeeFuncPtr_glReplacementCodeusvSUN=GLee_Lazy_glReplacementCodeusvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeubvSUN -#define GLEE_C_DEFINED_glReplacementCodeubvSUN - void __stdcall GLee_Lazy_glReplacementCodeubvSUN(const GLubyte * code) {if (GLeeInit()) glReplacementCodeubvSUN(code);} - GLEEPFNGLREPLACEMENTCODEUBVSUNPROC GLeeFuncPtr_glReplacementCodeubvSUN=GLee_Lazy_glReplacementCodeubvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodePointerSUN -#define GLEE_C_DEFINED_glReplacementCodePointerSUN - void __stdcall GLee_Lazy_glReplacementCodePointerSUN(GLenum type, GLsizei stride, const GLvoid* * pointer) {if (GLeeInit()) glReplacementCodePointerSUN(type, stride, pointer);} - GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC GLeeFuncPtr_glReplacementCodePointerSUN=GLee_Lazy_glReplacementCodePointerSUN; -#endif -#endif - -/* GL_SUN_vertex */ - -#ifdef __GLEE_GL_SUN_vertex -#ifndef GLEE_C_DEFINED_glColor4ubVertex2fSUN -#define GLEE_C_DEFINED_glColor4ubVertex2fSUN - void __stdcall GLee_Lazy_glColor4ubVertex2fSUN(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y) {if (GLeeInit()) glColor4ubVertex2fSUN(r, g, b, a, x, y);} - GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC GLeeFuncPtr_glColor4ubVertex2fSUN=GLee_Lazy_glColor4ubVertex2fSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor4ubVertex2fvSUN -#define GLEE_C_DEFINED_glColor4ubVertex2fvSUN - void __stdcall GLee_Lazy_glColor4ubVertex2fvSUN(const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glColor4ubVertex2fvSUN(c, v);} - GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC GLeeFuncPtr_glColor4ubVertex2fvSUN=GLee_Lazy_glColor4ubVertex2fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor4ubVertex3fSUN -#define GLEE_C_DEFINED_glColor4ubVertex3fSUN - void __stdcall GLee_Lazy_glColor4ubVertex3fSUN(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glColor4ubVertex3fSUN(r, g, b, a, x, y, z);} - GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glColor4ubVertex3fSUN=GLee_Lazy_glColor4ubVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor4ubVertex3fvSUN -#define GLEE_C_DEFINED_glColor4ubVertex3fvSUN - void __stdcall GLee_Lazy_glColor4ubVertex3fvSUN(const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glColor4ubVertex3fvSUN(c, v);} - GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glColor4ubVertex3fvSUN=GLee_Lazy_glColor4ubVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor3fVertex3fSUN -#define GLEE_C_DEFINED_glColor3fVertex3fSUN - void __stdcall GLee_Lazy_glColor3fVertex3fSUN(GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glColor3fVertex3fSUN(r, g, b, x, y, z);} - GLEEPFNGLCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glColor3fVertex3fSUN=GLee_Lazy_glColor3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor3fVertex3fvSUN -#define GLEE_C_DEFINED_glColor3fVertex3fvSUN - void __stdcall GLee_Lazy_glColor3fVertex3fvSUN(const GLfloat * c, const GLfloat * v) {if (GLeeInit()) glColor3fVertex3fvSUN(c, v);} - GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor3fVertex3fvSUN=GLee_Lazy_glColor3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glNormal3fVertex3fSUN(GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glNormal3fVertex3fSUN(nx, ny, nz, x, y, z);} - GLEEPFNGLNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glNormal3fVertex3fSUN=GLee_Lazy_glNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glNormal3fVertex3fvSUN(const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glNormal3fVertex3fvSUN(n, v);} - GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glNormal3fVertex3fvSUN=GLee_Lazy_glNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor4fNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glColor4fNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glColor4fNormal3fVertex3fSUN(GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glColor4fNormal3fVertex3fSUN(r, g, b, a, nx, ny, nz, x, y, z);} - GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fSUN=GLee_Lazy_glColor4fNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glColor4fNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glColor4fNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glColor4fNormal3fVertex3fvSUN(const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glColor4fNormal3fVertex3fvSUN(c, n, v);} - GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN=GLee_Lazy_glColor4fNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fVertex3fSUN -#define GLEE_C_DEFINED_glTexCoord2fVertex3fSUN - void __stdcall GLee_Lazy_glTexCoord2fVertex3fSUN(GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fVertex3fSUN(s, t, x, y, z);} - GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fSUN=GLee_Lazy_glTexCoord2fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fVertex3fvSUN -#define GLEE_C_DEFINED_glTexCoord2fVertex3fvSUN - void __stdcall GLee_Lazy_glTexCoord2fVertex3fvSUN(const GLfloat * tc, const GLfloat * v) {if (GLeeInit()) glTexCoord2fVertex3fvSUN(tc, v);} - GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fvSUN=GLee_Lazy_glTexCoord2fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord4fVertex4fSUN -#define GLEE_C_DEFINED_glTexCoord4fVertex4fSUN - void __stdcall GLee_Lazy_glTexCoord4fVertex4fSUN(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glTexCoord4fVertex4fSUN(s, t, p, q, x, y, z, w);} - GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fSUN=GLee_Lazy_glTexCoord4fVertex4fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord4fVertex4fvSUN -#define GLEE_C_DEFINED_glTexCoord4fVertex4fvSUN - void __stdcall GLee_Lazy_glTexCoord4fVertex4fvSUN(const GLfloat * tc, const GLfloat * v) {if (GLeeInit()) glTexCoord4fVertex4fvSUN(tc, v);} - GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fvSUN=GLee_Lazy_glTexCoord4fVertex4fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fSUN -#define GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fSUN - void __stdcall GLee_Lazy_glTexCoord2fColor4ubVertex3fSUN(GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fColor4ubVertex3fSUN(s, t, r, g, b, a, x, y, z);} - GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN=GLee_Lazy_glTexCoord2fColor4ubVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fvSUN -#define GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fvSUN - void __stdcall GLee_Lazy_glTexCoord2fColor4ubVertex3fvSUN(const GLfloat * tc, const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glTexCoord2fColor4ubVertex3fvSUN(tc, c, v);} - GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN=GLee_Lazy_glTexCoord2fColor4ubVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fSUN -#define GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fSUN - void __stdcall GLee_Lazy_glTexCoord2fColor3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fColor3fVertex3fSUN(s, t, r, g, b, x, y, z);} - GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN=GLee_Lazy_glTexCoord2fColor3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fvSUN -#define GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fvSUN - void __stdcall GLee_Lazy_glTexCoord2fColor3fVertex3fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * v) {if (GLeeInit()) glTexCoord2fColor3fVertex3fvSUN(tc, c, v);} - GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN=GLee_Lazy_glTexCoord2fColor3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glTexCoord2fNormal3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fNormal3fVertex3fSUN(s, t, nx, ny, nz, x, y, z);} - GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN=GLee_Lazy_glTexCoord2fNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glTexCoord2fNormal3fVertex3fvSUN(const GLfloat * tc, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glTexCoord2fNormal3fVertex3fvSUN(tc, n, v);} - GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN=GLee_Lazy_glTexCoord2fNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fColor4fNormal3fVertex3fSUN(s, t, r, g, b, a, nx, ny, nz, x, y, z);} - GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN=GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glTexCoord2fColor4fNormal3fVertex3fvSUN(tc, c, n, v);} - GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN=GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN -#define GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN - void __stdcall GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fSUN(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glTexCoord4fColor4fNormal3fVertex4fSUN(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w);} - GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN=GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fSUN; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN -#define GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN - void __stdcall GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glTexCoord4fColor4fNormal3fVertex4fvSUN(tc, c, n, v);} - GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN=GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiVertex3fSUN(GLuint rc, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiVertex3fSUN(rc, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fSUN=GLee_Lazy_glReplacementCodeuiVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiVertex3fvSUN(const GLuint * rc, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiVertex3fvSUN(rc, v);} - GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN=GLee_Lazy_glReplacementCodeuiVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiColor4ubVertex3fSUN(GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiColor4ubVertex3fSUN(rc, r, g, b, a, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor4ubVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiColor4ubVertex3fvSUN(const GLuint * rc, const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiColor4ubVertex3fvSUN(rc, c, v);} - GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor4ubVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiColor3fVertex3fSUN(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiColor3fVertex3fSUN(rc, r, g, b, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiColor3fVertex3fvSUN(const GLuint * rc, const GLfloat * c, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiColor3fVertex3fvSUN(rc, c, v);} - GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiNormal3fVertex3fSUN(GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiNormal3fVertex3fSUN(rc, nx, ny, nz, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiNormal3fVertex3fvSUN(rc, n, v);} - GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fSUN(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiColor4fNormal3fVertex3fSUN(rc, r, g, b, a, nx, ny, nz, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiColor4fNormal3fVertex3fvSUN(rc, c, n, v);} - GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiTexCoord2fVertex3fSUN(rc, s, t, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiTexCoord2fVertex3fvSUN(rc, tc, v);} - GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(rc, s, t, nx, ny, nz, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(rc, tc, n, v);} - GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN -#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN - void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z);} - GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; -#endif -#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN -#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN - void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(rc, tc, c, n, v);} - GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; -#endif -#endif - -/* GL_EXT_blend_func_separate */ - -#ifdef __GLEE_GL_EXT_blend_func_separate -#ifndef GLEE_C_DEFINED_glBlendFuncSeparateEXT -#define GLEE_C_DEFINED_glBlendFuncSeparateEXT - void __stdcall GLee_Lazy_glBlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) {if (GLeeInit()) glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);} - GLEEPFNGLBLENDFUNCSEPARATEEXTPROC GLeeFuncPtr_glBlendFuncSeparateEXT=GLee_Lazy_glBlendFuncSeparateEXT; -#endif -#endif - -/* GL_INGR_color_clamp */ - -#ifdef __GLEE_GL_INGR_color_clamp -#endif - -/* GL_INGR_interlace_read */ - -#ifdef __GLEE_GL_INGR_interlace_read -#endif - -/* GL_EXT_stencil_wrap */ - -#ifdef __GLEE_GL_EXT_stencil_wrap -#endif - -/* GL_EXT_422_pixels */ - -#ifdef __GLEE_GL_EXT_422_pixels -#endif - -/* GL_NV_texgen_reflection */ - -#ifdef __GLEE_GL_NV_texgen_reflection -#endif - -/* GL_EXT_texture_cube_map */ - -#ifdef __GLEE_GL_EXT_texture_cube_map -#endif - -/* GL_SUN_convolution_border_modes */ - -#ifdef __GLEE_GL_SUN_convolution_border_modes -#endif - -/* GL_EXT_texture_env_add */ - -#ifdef __GLEE_GL_EXT_texture_env_add -#endif - -/* GL_EXT_texture_lod_bias */ - -#ifdef __GLEE_GL_EXT_texture_lod_bias -#endif - -/* GL_EXT_texture_filter_anisotropic */ - -#ifdef __GLEE_GL_EXT_texture_filter_anisotropic -#endif - -/* GL_EXT_vertex_weighting */ - -#ifdef __GLEE_GL_EXT_vertex_weighting -#ifndef GLEE_C_DEFINED_glVertexWeightfEXT -#define GLEE_C_DEFINED_glVertexWeightfEXT - void __stdcall GLee_Lazy_glVertexWeightfEXT(GLfloat weight) {if (GLeeInit()) glVertexWeightfEXT(weight);} - GLEEPFNGLVERTEXWEIGHTFEXTPROC GLeeFuncPtr_glVertexWeightfEXT=GLee_Lazy_glVertexWeightfEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexWeightfvEXT -#define GLEE_C_DEFINED_glVertexWeightfvEXT - void __stdcall GLee_Lazy_glVertexWeightfvEXT(const GLfloat * weight) {if (GLeeInit()) glVertexWeightfvEXT(weight);} - GLEEPFNGLVERTEXWEIGHTFVEXTPROC GLeeFuncPtr_glVertexWeightfvEXT=GLee_Lazy_glVertexWeightfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexWeightPointerEXT -#define GLEE_C_DEFINED_glVertexWeightPointerEXT - void __stdcall GLee_Lazy_glVertexWeightPointerEXT(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexWeightPointerEXT(size, type, stride, pointer);} - GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC GLeeFuncPtr_glVertexWeightPointerEXT=GLee_Lazy_glVertexWeightPointerEXT; -#endif -#endif - -/* GL_NV_light_max_exponent */ - -#ifdef __GLEE_GL_NV_light_max_exponent -#endif - -/* GL_NV_vertex_array_range */ - -#ifdef __GLEE_GL_NV_vertex_array_range -#ifndef GLEE_C_DEFINED_glFlushVertexArrayRangeNV -#define GLEE_C_DEFINED_glFlushVertexArrayRangeNV - void __stdcall GLee_Lazy_glFlushVertexArrayRangeNV(void) {if (GLeeInit()) glFlushVertexArrayRangeNV();} - GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC GLeeFuncPtr_glFlushVertexArrayRangeNV=GLee_Lazy_glFlushVertexArrayRangeNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexArrayRangeNV -#define GLEE_C_DEFINED_glVertexArrayRangeNV - void __stdcall GLee_Lazy_glVertexArrayRangeNV(GLsizei length, const GLvoid * pointer) {if (GLeeInit()) glVertexArrayRangeNV(length, pointer);} - GLEEPFNGLVERTEXARRAYRANGENVPROC GLeeFuncPtr_glVertexArrayRangeNV=GLee_Lazy_glVertexArrayRangeNV; -#endif -#endif - -/* GL_NV_register_combiners */ - -#ifdef __GLEE_GL_NV_register_combiners -#ifndef GLEE_C_DEFINED_glCombinerParameterfvNV -#define GLEE_C_DEFINED_glCombinerParameterfvNV - void __stdcall GLee_Lazy_glCombinerParameterfvNV(GLenum pname, const GLfloat * params) {if (GLeeInit()) glCombinerParameterfvNV(pname, params);} - GLEEPFNGLCOMBINERPARAMETERFVNVPROC GLeeFuncPtr_glCombinerParameterfvNV=GLee_Lazy_glCombinerParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glCombinerParameterfNV -#define GLEE_C_DEFINED_glCombinerParameterfNV - void __stdcall GLee_Lazy_glCombinerParameterfNV(GLenum pname, GLfloat param) {if (GLeeInit()) glCombinerParameterfNV(pname, param);} - GLEEPFNGLCOMBINERPARAMETERFNVPROC GLeeFuncPtr_glCombinerParameterfNV=GLee_Lazy_glCombinerParameterfNV; -#endif -#ifndef GLEE_C_DEFINED_glCombinerParameterivNV -#define GLEE_C_DEFINED_glCombinerParameterivNV - void __stdcall GLee_Lazy_glCombinerParameterivNV(GLenum pname, const GLint * params) {if (GLeeInit()) glCombinerParameterivNV(pname, params);} - GLEEPFNGLCOMBINERPARAMETERIVNVPROC GLeeFuncPtr_glCombinerParameterivNV=GLee_Lazy_glCombinerParameterivNV; -#endif -#ifndef GLEE_C_DEFINED_glCombinerParameteriNV -#define GLEE_C_DEFINED_glCombinerParameteriNV - void __stdcall GLee_Lazy_glCombinerParameteriNV(GLenum pname, GLint param) {if (GLeeInit()) glCombinerParameteriNV(pname, param);} - GLEEPFNGLCOMBINERPARAMETERINVPROC GLeeFuncPtr_glCombinerParameteriNV=GLee_Lazy_glCombinerParameteriNV; -#endif -#ifndef GLEE_C_DEFINED_glCombinerInputNV -#define GLEE_C_DEFINED_glCombinerInputNV - void __stdcall GLee_Lazy_glCombinerInputNV(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) {if (GLeeInit()) glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage);} - GLEEPFNGLCOMBINERINPUTNVPROC GLeeFuncPtr_glCombinerInputNV=GLee_Lazy_glCombinerInputNV; -#endif -#ifndef GLEE_C_DEFINED_glCombinerOutputNV -#define GLEE_C_DEFINED_glCombinerOutputNV - void __stdcall GLee_Lazy_glCombinerOutputNV(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum) {if (GLeeInit()) glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum);} - GLEEPFNGLCOMBINEROUTPUTNVPROC GLeeFuncPtr_glCombinerOutputNV=GLee_Lazy_glCombinerOutputNV; -#endif -#ifndef GLEE_C_DEFINED_glFinalCombinerInputNV -#define GLEE_C_DEFINED_glFinalCombinerInputNV - void __stdcall GLee_Lazy_glFinalCombinerInputNV(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) {if (GLeeInit()) glFinalCombinerInputNV(variable, input, mapping, componentUsage);} - GLEEPFNGLFINALCOMBINERINPUTNVPROC GLeeFuncPtr_glFinalCombinerInputNV=GLee_Lazy_glFinalCombinerInputNV; -#endif -#ifndef GLEE_C_DEFINED_glGetCombinerInputParameterfvNV -#define GLEE_C_DEFINED_glGetCombinerInputParameterfvNV - void __stdcall GLee_Lazy_glGetCombinerInputParameterfvNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params);} - GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerInputParameterfvNV=GLee_Lazy_glGetCombinerInputParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetCombinerInputParameterivNV -#define GLEE_C_DEFINED_glGetCombinerInputParameterivNV - void __stdcall GLee_Lazy_glGetCombinerInputParameterivNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params) {if (GLeeInit()) glGetCombinerInputParameterivNV(stage, portion, variable, pname, params);} - GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerInputParameterivNV=GLee_Lazy_glGetCombinerInputParameterivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetCombinerOutputParameterfvNV -#define GLEE_C_DEFINED_glGetCombinerOutputParameterfvNV - void __stdcall GLee_Lazy_glGetCombinerOutputParameterfvNV(GLenum stage, GLenum portion, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetCombinerOutputParameterfvNV(stage, portion, pname, params);} - GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterfvNV=GLee_Lazy_glGetCombinerOutputParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetCombinerOutputParameterivNV -#define GLEE_C_DEFINED_glGetCombinerOutputParameterivNV - void __stdcall GLee_Lazy_glGetCombinerOutputParameterivNV(GLenum stage, GLenum portion, GLenum pname, GLint * params) {if (GLeeInit()) glGetCombinerOutputParameterivNV(stage, portion, pname, params);} - GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterivNV=GLee_Lazy_glGetCombinerOutputParameterivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetFinalCombinerInputParameterfvNV -#define GLEE_C_DEFINED_glGetFinalCombinerInputParameterfvNV - void __stdcall GLee_Lazy_glGetFinalCombinerInputParameterfvNV(GLenum variable, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFinalCombinerInputParameterfvNV(variable, pname, params);} - GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV=GLee_Lazy_glGetFinalCombinerInputParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetFinalCombinerInputParameterivNV -#define GLEE_C_DEFINED_glGetFinalCombinerInputParameterivNV - void __stdcall GLee_Lazy_glGetFinalCombinerInputParameterivNV(GLenum variable, GLenum pname, GLint * params) {if (GLeeInit()) glGetFinalCombinerInputParameterivNV(variable, pname, params);} - GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterivNV=GLee_Lazy_glGetFinalCombinerInputParameterivNV; -#endif -#endif - -/* GL_NV_fog_distance */ - -#ifdef __GLEE_GL_NV_fog_distance -#endif - -/* GL_NV_texgen_emboss */ - -#ifdef __GLEE_GL_NV_texgen_emboss -#endif - -/* GL_NV_blend_square */ - -#ifdef __GLEE_GL_NV_blend_square -#endif - -/* GL_NV_texture_env_combine4 */ - -#ifdef __GLEE_GL_NV_texture_env_combine4 -#endif - -/* GL_MESA_resize_buffers */ - -#ifdef __GLEE_GL_MESA_resize_buffers -#ifndef GLEE_C_DEFINED_glResizeBuffersMESA -#define GLEE_C_DEFINED_glResizeBuffersMESA - void __stdcall GLee_Lazy_glResizeBuffersMESA(void) {if (GLeeInit()) glResizeBuffersMESA();} - GLEEPFNGLRESIZEBUFFERSMESAPROC GLeeFuncPtr_glResizeBuffersMESA=GLee_Lazy_glResizeBuffersMESA; -#endif -#endif - -/* GL_MESA_window_pos */ - -#ifdef __GLEE_GL_MESA_window_pos -#ifndef GLEE_C_DEFINED_glWindowPos2dMESA -#define GLEE_C_DEFINED_glWindowPos2dMESA - void __stdcall GLee_Lazy_glWindowPos2dMESA(GLdouble x, GLdouble y) {if (GLeeInit()) glWindowPos2dMESA(x, y);} - GLEEPFNGLWINDOWPOS2DMESAPROC GLeeFuncPtr_glWindowPos2dMESA=GLee_Lazy_glWindowPos2dMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2dvMESA -#define GLEE_C_DEFINED_glWindowPos2dvMESA - void __stdcall GLee_Lazy_glWindowPos2dvMESA(const GLdouble * v) {if (GLeeInit()) glWindowPos2dvMESA(v);} - GLEEPFNGLWINDOWPOS2DVMESAPROC GLeeFuncPtr_glWindowPos2dvMESA=GLee_Lazy_glWindowPos2dvMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2fMESA -#define GLEE_C_DEFINED_glWindowPos2fMESA - void __stdcall GLee_Lazy_glWindowPos2fMESA(GLfloat x, GLfloat y) {if (GLeeInit()) glWindowPos2fMESA(x, y);} - GLEEPFNGLWINDOWPOS2FMESAPROC GLeeFuncPtr_glWindowPos2fMESA=GLee_Lazy_glWindowPos2fMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2fvMESA -#define GLEE_C_DEFINED_glWindowPos2fvMESA - void __stdcall GLee_Lazy_glWindowPos2fvMESA(const GLfloat * v) {if (GLeeInit()) glWindowPos2fvMESA(v);} - GLEEPFNGLWINDOWPOS2FVMESAPROC GLeeFuncPtr_glWindowPos2fvMESA=GLee_Lazy_glWindowPos2fvMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2iMESA -#define GLEE_C_DEFINED_glWindowPos2iMESA - void __stdcall GLee_Lazy_glWindowPos2iMESA(GLint x, GLint y) {if (GLeeInit()) glWindowPos2iMESA(x, y);} - GLEEPFNGLWINDOWPOS2IMESAPROC GLeeFuncPtr_glWindowPos2iMESA=GLee_Lazy_glWindowPos2iMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2ivMESA -#define GLEE_C_DEFINED_glWindowPos2ivMESA - void __stdcall GLee_Lazy_glWindowPos2ivMESA(const GLint * v) {if (GLeeInit()) glWindowPos2ivMESA(v);} - GLEEPFNGLWINDOWPOS2IVMESAPROC GLeeFuncPtr_glWindowPos2ivMESA=GLee_Lazy_glWindowPos2ivMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2sMESA -#define GLEE_C_DEFINED_glWindowPos2sMESA - void __stdcall GLee_Lazy_glWindowPos2sMESA(GLshort x, GLshort y) {if (GLeeInit()) glWindowPos2sMESA(x, y);} - GLEEPFNGLWINDOWPOS2SMESAPROC GLeeFuncPtr_glWindowPos2sMESA=GLee_Lazy_glWindowPos2sMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos2svMESA -#define GLEE_C_DEFINED_glWindowPos2svMESA - void __stdcall GLee_Lazy_glWindowPos2svMESA(const GLshort * v) {if (GLeeInit()) glWindowPos2svMESA(v);} - GLEEPFNGLWINDOWPOS2SVMESAPROC GLeeFuncPtr_glWindowPos2svMESA=GLee_Lazy_glWindowPos2svMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3dMESA -#define GLEE_C_DEFINED_glWindowPos3dMESA - void __stdcall GLee_Lazy_glWindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glWindowPos3dMESA(x, y, z);} - GLEEPFNGLWINDOWPOS3DMESAPROC GLeeFuncPtr_glWindowPos3dMESA=GLee_Lazy_glWindowPos3dMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3dvMESA -#define GLEE_C_DEFINED_glWindowPos3dvMESA - void __stdcall GLee_Lazy_glWindowPos3dvMESA(const GLdouble * v) {if (GLeeInit()) glWindowPos3dvMESA(v);} - GLEEPFNGLWINDOWPOS3DVMESAPROC GLeeFuncPtr_glWindowPos3dvMESA=GLee_Lazy_glWindowPos3dvMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3fMESA -#define GLEE_C_DEFINED_glWindowPos3fMESA - void __stdcall GLee_Lazy_glWindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glWindowPos3fMESA(x, y, z);} - GLEEPFNGLWINDOWPOS3FMESAPROC GLeeFuncPtr_glWindowPos3fMESA=GLee_Lazy_glWindowPos3fMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3fvMESA -#define GLEE_C_DEFINED_glWindowPos3fvMESA - void __stdcall GLee_Lazy_glWindowPos3fvMESA(const GLfloat * v) {if (GLeeInit()) glWindowPos3fvMESA(v);} - GLEEPFNGLWINDOWPOS3FVMESAPROC GLeeFuncPtr_glWindowPos3fvMESA=GLee_Lazy_glWindowPos3fvMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3iMESA -#define GLEE_C_DEFINED_glWindowPos3iMESA - void __stdcall GLee_Lazy_glWindowPos3iMESA(GLint x, GLint y, GLint z) {if (GLeeInit()) glWindowPos3iMESA(x, y, z);} - GLEEPFNGLWINDOWPOS3IMESAPROC GLeeFuncPtr_glWindowPos3iMESA=GLee_Lazy_glWindowPos3iMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3ivMESA -#define GLEE_C_DEFINED_glWindowPos3ivMESA - void __stdcall GLee_Lazy_glWindowPos3ivMESA(const GLint * v) {if (GLeeInit()) glWindowPos3ivMESA(v);} - GLEEPFNGLWINDOWPOS3IVMESAPROC GLeeFuncPtr_glWindowPos3ivMESA=GLee_Lazy_glWindowPos3ivMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3sMESA -#define GLEE_C_DEFINED_glWindowPos3sMESA - void __stdcall GLee_Lazy_glWindowPos3sMESA(GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glWindowPos3sMESA(x, y, z);} - GLEEPFNGLWINDOWPOS3SMESAPROC GLeeFuncPtr_glWindowPos3sMESA=GLee_Lazy_glWindowPos3sMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos3svMESA -#define GLEE_C_DEFINED_glWindowPos3svMESA - void __stdcall GLee_Lazy_glWindowPos3svMESA(const GLshort * v) {if (GLeeInit()) glWindowPos3svMESA(v);} - GLEEPFNGLWINDOWPOS3SVMESAPROC GLeeFuncPtr_glWindowPos3svMESA=GLee_Lazy_glWindowPos3svMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4dMESA -#define GLEE_C_DEFINED_glWindowPos4dMESA - void __stdcall GLee_Lazy_glWindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glWindowPos4dMESA(x, y, z, w);} - GLEEPFNGLWINDOWPOS4DMESAPROC GLeeFuncPtr_glWindowPos4dMESA=GLee_Lazy_glWindowPos4dMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4dvMESA -#define GLEE_C_DEFINED_glWindowPos4dvMESA - void __stdcall GLee_Lazy_glWindowPos4dvMESA(const GLdouble * v) {if (GLeeInit()) glWindowPos4dvMESA(v);} - GLEEPFNGLWINDOWPOS4DVMESAPROC GLeeFuncPtr_glWindowPos4dvMESA=GLee_Lazy_glWindowPos4dvMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4fMESA -#define GLEE_C_DEFINED_glWindowPos4fMESA - void __stdcall GLee_Lazy_glWindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glWindowPos4fMESA(x, y, z, w);} - GLEEPFNGLWINDOWPOS4FMESAPROC GLeeFuncPtr_glWindowPos4fMESA=GLee_Lazy_glWindowPos4fMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4fvMESA -#define GLEE_C_DEFINED_glWindowPos4fvMESA - void __stdcall GLee_Lazy_glWindowPos4fvMESA(const GLfloat * v) {if (GLeeInit()) glWindowPos4fvMESA(v);} - GLEEPFNGLWINDOWPOS4FVMESAPROC GLeeFuncPtr_glWindowPos4fvMESA=GLee_Lazy_glWindowPos4fvMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4iMESA -#define GLEE_C_DEFINED_glWindowPos4iMESA - void __stdcall GLee_Lazy_glWindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glWindowPos4iMESA(x, y, z, w);} - GLEEPFNGLWINDOWPOS4IMESAPROC GLeeFuncPtr_glWindowPos4iMESA=GLee_Lazy_glWindowPos4iMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4ivMESA -#define GLEE_C_DEFINED_glWindowPos4ivMESA - void __stdcall GLee_Lazy_glWindowPos4ivMESA(const GLint * v) {if (GLeeInit()) glWindowPos4ivMESA(v);} - GLEEPFNGLWINDOWPOS4IVMESAPROC GLeeFuncPtr_glWindowPos4ivMESA=GLee_Lazy_glWindowPos4ivMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4sMESA -#define GLEE_C_DEFINED_glWindowPos4sMESA - void __stdcall GLee_Lazy_glWindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glWindowPos4sMESA(x, y, z, w);} - GLEEPFNGLWINDOWPOS4SMESAPROC GLeeFuncPtr_glWindowPos4sMESA=GLee_Lazy_glWindowPos4sMESA; -#endif -#ifndef GLEE_C_DEFINED_glWindowPos4svMESA -#define GLEE_C_DEFINED_glWindowPos4svMESA - void __stdcall GLee_Lazy_glWindowPos4svMESA(const GLshort * v) {if (GLeeInit()) glWindowPos4svMESA(v);} - GLEEPFNGLWINDOWPOS4SVMESAPROC GLeeFuncPtr_glWindowPos4svMESA=GLee_Lazy_glWindowPos4svMESA; -#endif -#endif - -/* GL_EXT_texture_compression_s3tc */ - -#ifdef __GLEE_GL_EXT_texture_compression_s3tc -#endif - -/* GL_IBM_cull_vertex */ - -#ifdef __GLEE_GL_IBM_cull_vertex -#endif - -/* GL_IBM_multimode_draw_arrays */ - -#ifdef __GLEE_GL_IBM_multimode_draw_arrays -#ifndef GLEE_C_DEFINED_glMultiModeDrawArraysIBM -#define GLEE_C_DEFINED_glMultiModeDrawArraysIBM - void __stdcall GLee_Lazy_glMultiModeDrawArraysIBM(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride) {if (GLeeInit()) glMultiModeDrawArraysIBM(mode, first, count, primcount, modestride);} - GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC GLeeFuncPtr_glMultiModeDrawArraysIBM=GLee_Lazy_glMultiModeDrawArraysIBM; -#endif -#ifndef GLEE_C_DEFINED_glMultiModeDrawElementsIBM -#define GLEE_C_DEFINED_glMultiModeDrawElementsIBM - void __stdcall GLee_Lazy_glMultiModeDrawElementsIBM(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid* const * indices, GLsizei primcount, GLint modestride) {if (GLeeInit()) glMultiModeDrawElementsIBM(mode, count, type, indices, primcount, modestride);} - GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC GLeeFuncPtr_glMultiModeDrawElementsIBM=GLee_Lazy_glMultiModeDrawElementsIBM; -#endif -#endif - -/* GL_IBM_vertex_array_lists */ - -#ifdef __GLEE_GL_IBM_vertex_array_lists -#ifndef GLEE_C_DEFINED_glColorPointerListIBM -#define GLEE_C_DEFINED_glColorPointerListIBM - void __stdcall GLee_Lazy_glColorPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glColorPointerListIBM(size, type, stride, pointer, ptrstride);} - GLEEPFNGLCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glColorPointerListIBM=GLee_Lazy_glColorPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColorPointerListIBM -#define GLEE_C_DEFINED_glSecondaryColorPointerListIBM - void __stdcall GLee_Lazy_glSecondaryColorPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glSecondaryColorPointerListIBM(size, type, stride, pointer, ptrstride);} - GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glSecondaryColorPointerListIBM=GLee_Lazy_glSecondaryColorPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glEdgeFlagPointerListIBM -#define GLEE_C_DEFINED_glEdgeFlagPointerListIBM - void __stdcall GLee_Lazy_glEdgeFlagPointerListIBM(GLint stride, const GLboolean* * pointer, GLint ptrstride) {if (GLeeInit()) glEdgeFlagPointerListIBM(stride, pointer, ptrstride);} - GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC GLeeFuncPtr_glEdgeFlagPointerListIBM=GLee_Lazy_glEdgeFlagPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordPointerListIBM -#define GLEE_C_DEFINED_glFogCoordPointerListIBM - void __stdcall GLee_Lazy_glFogCoordPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glFogCoordPointerListIBM(type, stride, pointer, ptrstride);} - GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glFogCoordPointerListIBM=GLee_Lazy_glFogCoordPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glIndexPointerListIBM -#define GLEE_C_DEFINED_glIndexPointerListIBM - void __stdcall GLee_Lazy_glIndexPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glIndexPointerListIBM(type, stride, pointer, ptrstride);} - GLEEPFNGLINDEXPOINTERLISTIBMPROC GLeeFuncPtr_glIndexPointerListIBM=GLee_Lazy_glIndexPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glNormalPointerListIBM -#define GLEE_C_DEFINED_glNormalPointerListIBM - void __stdcall GLee_Lazy_glNormalPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glNormalPointerListIBM(type, stride, pointer, ptrstride);} - GLEEPFNGLNORMALPOINTERLISTIBMPROC GLeeFuncPtr_glNormalPointerListIBM=GLee_Lazy_glNormalPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glTexCoordPointerListIBM -#define GLEE_C_DEFINED_glTexCoordPointerListIBM - void __stdcall GLee_Lazy_glTexCoordPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glTexCoordPointerListIBM(size, type, stride, pointer, ptrstride);} - GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glTexCoordPointerListIBM=GLee_Lazy_glTexCoordPointerListIBM; -#endif -#ifndef GLEE_C_DEFINED_glVertexPointerListIBM -#define GLEE_C_DEFINED_glVertexPointerListIBM - void __stdcall GLee_Lazy_glVertexPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glVertexPointerListIBM(size, type, stride, pointer, ptrstride);} - GLEEPFNGLVERTEXPOINTERLISTIBMPROC GLeeFuncPtr_glVertexPointerListIBM=GLee_Lazy_glVertexPointerListIBM; -#endif -#endif - -/* GL_SGIX_subsample */ - -#ifdef __GLEE_GL_SGIX_subsample -#endif - -/* GL_SGIX_ycrcb_subsample */ - -#ifdef __GLEE_GL_SGIX_ycrcb_subsample -#endif - -/* GL_SGIX_ycrcba */ - -#ifdef __GLEE_GL_SGIX_ycrcba -#endif - -/* GL_SGI_depth_pass_instrument */ - -#ifdef __GLEE_GL_SGI_depth_pass_instrument -#endif - -/* GL_3DFX_texture_compression_FXT1 */ - -#ifdef __GLEE_GL_3DFX_texture_compression_FXT1 -#endif - -/* GL_3DFX_multisample */ - -#ifdef __GLEE_GL_3DFX_multisample -#endif - -/* GL_3DFX_tbuffer */ - -#ifdef __GLEE_GL_3DFX_tbuffer -#ifndef GLEE_C_DEFINED_glTbufferMask3DFX -#define GLEE_C_DEFINED_glTbufferMask3DFX - void __stdcall GLee_Lazy_glTbufferMask3DFX(GLuint mask) {if (GLeeInit()) glTbufferMask3DFX(mask);} - GLEEPFNGLTBUFFERMASK3DFXPROC GLeeFuncPtr_glTbufferMask3DFX=GLee_Lazy_glTbufferMask3DFX; -#endif -#endif - -/* GL_EXT_multisample */ - -#ifdef __GLEE_GL_EXT_multisample -#ifndef GLEE_C_DEFINED_glSampleMaskEXT -#define GLEE_C_DEFINED_glSampleMaskEXT - void __stdcall GLee_Lazy_glSampleMaskEXT(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleMaskEXT(value, invert);} - GLEEPFNGLSAMPLEMASKEXTPROC GLeeFuncPtr_glSampleMaskEXT=GLee_Lazy_glSampleMaskEXT; -#endif -#ifndef GLEE_C_DEFINED_glSamplePatternEXT -#define GLEE_C_DEFINED_glSamplePatternEXT - void __stdcall GLee_Lazy_glSamplePatternEXT(GLenum pattern) {if (GLeeInit()) glSamplePatternEXT(pattern);} - GLEEPFNGLSAMPLEPATTERNEXTPROC GLeeFuncPtr_glSamplePatternEXT=GLee_Lazy_glSamplePatternEXT; -#endif -#endif - -/* GL_SGIX_vertex_preclip */ - -#ifdef __GLEE_GL_SGIX_vertex_preclip -#endif - -/* GL_SGIX_convolution_accuracy */ - -#ifdef __GLEE_GL_SGIX_convolution_accuracy -#endif - -/* GL_SGIX_resample */ - -#ifdef __GLEE_GL_SGIX_resample -#endif - -/* GL_SGIS_point_line_texgen */ - -#ifdef __GLEE_GL_SGIS_point_line_texgen -#endif - -/* GL_SGIS_texture_color_mask */ - -#ifdef __GLEE_GL_SGIS_texture_color_mask -#ifndef GLEE_C_DEFINED_glTextureColorMaskSGIS -#define GLEE_C_DEFINED_glTextureColorMaskSGIS - void __stdcall GLee_Lazy_glTextureColorMaskSGIS(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {if (GLeeInit()) glTextureColorMaskSGIS(red, green, blue, alpha);} - GLEEPFNGLTEXTURECOLORMASKSGISPROC GLeeFuncPtr_glTextureColorMaskSGIS=GLee_Lazy_glTextureColorMaskSGIS; -#endif -#endif - -/* GL_EXT_texture_env_dot3 */ - -#ifdef __GLEE_GL_EXT_texture_env_dot3 -#endif - -/* GL_ATI_texture_mirror_once */ - -#ifdef __GLEE_GL_ATI_texture_mirror_once -#endif - -/* GL_NV_fence */ - -#ifdef __GLEE_GL_NV_fence -#ifndef GLEE_C_DEFINED_glDeleteFencesNV -#define GLEE_C_DEFINED_glDeleteFencesNV - void __stdcall GLee_Lazy_glDeleteFencesNV(GLsizei n, const GLuint * fences) {if (GLeeInit()) glDeleteFencesNV(n, fences);} - GLEEPFNGLDELETEFENCESNVPROC GLeeFuncPtr_glDeleteFencesNV=GLee_Lazy_glDeleteFencesNV; -#endif -#ifndef GLEE_C_DEFINED_glGenFencesNV -#define GLEE_C_DEFINED_glGenFencesNV - void __stdcall GLee_Lazy_glGenFencesNV(GLsizei n, GLuint * fences) {if (GLeeInit()) glGenFencesNV(n, fences);} - GLEEPFNGLGENFENCESNVPROC GLeeFuncPtr_glGenFencesNV=GLee_Lazy_glGenFencesNV; -#endif -#ifndef GLEE_C_DEFINED_glIsFenceNV -#define GLEE_C_DEFINED_glIsFenceNV - GLboolean __stdcall GLee_Lazy_glIsFenceNV(GLuint fence) {if (GLeeInit()) return glIsFenceNV(fence); return (GLboolean)0;} - GLEEPFNGLISFENCENVPROC GLeeFuncPtr_glIsFenceNV=GLee_Lazy_glIsFenceNV; -#endif -#ifndef GLEE_C_DEFINED_glTestFenceNV -#define GLEE_C_DEFINED_glTestFenceNV - GLboolean __stdcall GLee_Lazy_glTestFenceNV(GLuint fence) {if (GLeeInit()) return glTestFenceNV(fence); return (GLboolean)0;} - GLEEPFNGLTESTFENCENVPROC GLeeFuncPtr_glTestFenceNV=GLee_Lazy_glTestFenceNV; -#endif -#ifndef GLEE_C_DEFINED_glGetFenceivNV -#define GLEE_C_DEFINED_glGetFenceivNV - void __stdcall GLee_Lazy_glGetFenceivNV(GLuint fence, GLenum pname, GLint * params) {if (GLeeInit()) glGetFenceivNV(fence, pname, params);} - GLEEPFNGLGETFENCEIVNVPROC GLeeFuncPtr_glGetFenceivNV=GLee_Lazy_glGetFenceivNV; -#endif -#ifndef GLEE_C_DEFINED_glFinishFenceNV -#define GLEE_C_DEFINED_glFinishFenceNV - void __stdcall GLee_Lazy_glFinishFenceNV(GLuint fence) {if (GLeeInit()) glFinishFenceNV(fence);} - GLEEPFNGLFINISHFENCENVPROC GLeeFuncPtr_glFinishFenceNV=GLee_Lazy_glFinishFenceNV; -#endif -#ifndef GLEE_C_DEFINED_glSetFenceNV -#define GLEE_C_DEFINED_glSetFenceNV - void __stdcall GLee_Lazy_glSetFenceNV(GLuint fence, GLenum condition) {if (GLeeInit()) glSetFenceNV(fence, condition);} - GLEEPFNGLSETFENCENVPROC GLeeFuncPtr_glSetFenceNV=GLee_Lazy_glSetFenceNV; -#endif -#endif - -/* GL_IBM_texture_mirrored_repeat */ - -#ifdef __GLEE_GL_IBM_texture_mirrored_repeat -#endif - -/* GL_NV_evaluators */ - -#ifdef __GLEE_GL_NV_evaluators -#ifndef GLEE_C_DEFINED_glMapControlPointsNV -#define GLEE_C_DEFINED_glMapControlPointsNV - void __stdcall GLee_Lazy_glMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * points) {if (GLeeInit()) glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points);} - GLEEPFNGLMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glMapControlPointsNV=GLee_Lazy_glMapControlPointsNV; -#endif -#ifndef GLEE_C_DEFINED_glMapParameterivNV -#define GLEE_C_DEFINED_glMapParameterivNV - void __stdcall GLee_Lazy_glMapParameterivNV(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMapParameterivNV(target, pname, params);} - GLEEPFNGLMAPPARAMETERIVNVPROC GLeeFuncPtr_glMapParameterivNV=GLee_Lazy_glMapParameterivNV; -#endif -#ifndef GLEE_C_DEFINED_glMapParameterfvNV -#define GLEE_C_DEFINED_glMapParameterfvNV - void __stdcall GLee_Lazy_glMapParameterfvNV(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMapParameterfvNV(target, pname, params);} - GLEEPFNGLMAPPARAMETERFVNVPROC GLeeFuncPtr_glMapParameterfvNV=GLee_Lazy_glMapParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetMapControlPointsNV -#define GLEE_C_DEFINED_glGetMapControlPointsNV - void __stdcall GLee_Lazy_glGetMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid * points) {if (GLeeInit()) glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points);} - GLEEPFNGLGETMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glGetMapControlPointsNV=GLee_Lazy_glGetMapControlPointsNV; -#endif -#ifndef GLEE_C_DEFINED_glGetMapParameterivNV -#define GLEE_C_DEFINED_glGetMapParameterivNV - void __stdcall GLee_Lazy_glGetMapParameterivNV(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMapParameterivNV(target, pname, params);} - GLEEPFNGLGETMAPPARAMETERIVNVPROC GLeeFuncPtr_glGetMapParameterivNV=GLee_Lazy_glGetMapParameterivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetMapParameterfvNV -#define GLEE_C_DEFINED_glGetMapParameterfvNV - void __stdcall GLee_Lazy_glGetMapParameterfvNV(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMapParameterfvNV(target, pname, params);} - GLEEPFNGLGETMAPPARAMETERFVNVPROC GLeeFuncPtr_glGetMapParameterfvNV=GLee_Lazy_glGetMapParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetMapAttribParameterivNV -#define GLEE_C_DEFINED_glGetMapAttribParameterivNV - void __stdcall GLee_Lazy_glGetMapAttribParameterivNV(GLenum target, GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetMapAttribParameterivNV(target, index, pname, params);} - GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC GLeeFuncPtr_glGetMapAttribParameterivNV=GLee_Lazy_glGetMapAttribParameterivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetMapAttribParameterfvNV -#define GLEE_C_DEFINED_glGetMapAttribParameterfvNV - void __stdcall GLee_Lazy_glGetMapAttribParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMapAttribParameterfvNV(target, index, pname, params);} - GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC GLeeFuncPtr_glGetMapAttribParameterfvNV=GLee_Lazy_glGetMapAttribParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glEvalMapsNV -#define GLEE_C_DEFINED_glEvalMapsNV - void __stdcall GLee_Lazy_glEvalMapsNV(GLenum target, GLenum mode) {if (GLeeInit()) glEvalMapsNV(target, mode);} - GLEEPFNGLEVALMAPSNVPROC GLeeFuncPtr_glEvalMapsNV=GLee_Lazy_glEvalMapsNV; -#endif -#endif - -/* GL_NV_packed_depth_stencil */ - -#ifdef __GLEE_GL_NV_packed_depth_stencil -#endif - -/* GL_NV_register_combiners2 */ - -#ifdef __GLEE_GL_NV_register_combiners2 -#ifndef GLEE_C_DEFINED_glCombinerStageParameterfvNV -#define GLEE_C_DEFINED_glCombinerStageParameterfvNV - void __stdcall GLee_Lazy_glCombinerStageParameterfvNV(GLenum stage, GLenum pname, const GLfloat * params) {if (GLeeInit()) glCombinerStageParameterfvNV(stage, pname, params);} - GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glCombinerStageParameterfvNV=GLee_Lazy_glCombinerStageParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetCombinerStageParameterfvNV -#define GLEE_C_DEFINED_glGetCombinerStageParameterfvNV - void __stdcall GLee_Lazy_glGetCombinerStageParameterfvNV(GLenum stage, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetCombinerStageParameterfvNV(stage, pname, params);} - GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerStageParameterfvNV=GLee_Lazy_glGetCombinerStageParameterfvNV; -#endif -#endif - -/* GL_NV_texture_compression_vtc */ - -#ifdef __GLEE_GL_NV_texture_compression_vtc -#endif - -/* GL_NV_texture_rectangle */ - -#ifdef __GLEE_GL_NV_texture_rectangle -#endif - -/* GL_NV_texture_shader */ - -#ifdef __GLEE_GL_NV_texture_shader -#endif - -/* GL_NV_texture_shader2 */ - -#ifdef __GLEE_GL_NV_texture_shader2 -#endif - -/* GL_NV_vertex_array_range2 */ - -#ifdef __GLEE_GL_NV_vertex_array_range2 -#endif - -/* GL_NV_vertex_program */ - -#ifdef __GLEE_GL_NV_vertex_program -#ifndef GLEE_C_DEFINED_glAreProgramsResidentNV -#define GLEE_C_DEFINED_glAreProgramsResidentNV - GLboolean __stdcall GLee_Lazy_glAreProgramsResidentNV(GLsizei n, const GLuint * programs, GLboolean * residences) {if (GLeeInit()) return glAreProgramsResidentNV(n, programs, residences); return (GLboolean)0;} - GLEEPFNGLAREPROGRAMSRESIDENTNVPROC GLeeFuncPtr_glAreProgramsResidentNV=GLee_Lazy_glAreProgramsResidentNV; -#endif -#ifndef GLEE_C_DEFINED_glBindProgramNV -#define GLEE_C_DEFINED_glBindProgramNV - void __stdcall GLee_Lazy_glBindProgramNV(GLenum target, GLuint id) {if (GLeeInit()) glBindProgramNV(target, id);} - GLEEPFNGLBINDPROGRAMNVPROC GLeeFuncPtr_glBindProgramNV=GLee_Lazy_glBindProgramNV; -#endif -#ifndef GLEE_C_DEFINED_glDeleteProgramsNV -#define GLEE_C_DEFINED_glDeleteProgramsNV - void __stdcall GLee_Lazy_glDeleteProgramsNV(GLsizei n, const GLuint * programs) {if (GLeeInit()) glDeleteProgramsNV(n, programs);} - GLEEPFNGLDELETEPROGRAMSNVPROC GLeeFuncPtr_glDeleteProgramsNV=GLee_Lazy_glDeleteProgramsNV; -#endif -#ifndef GLEE_C_DEFINED_glExecuteProgramNV -#define GLEE_C_DEFINED_glExecuteProgramNV - void __stdcall GLee_Lazy_glExecuteProgramNV(GLenum target, GLuint id, const GLfloat * params) {if (GLeeInit()) glExecuteProgramNV(target, id, params);} - GLEEPFNGLEXECUTEPROGRAMNVPROC GLeeFuncPtr_glExecuteProgramNV=GLee_Lazy_glExecuteProgramNV; -#endif -#ifndef GLEE_C_DEFINED_glGenProgramsNV -#define GLEE_C_DEFINED_glGenProgramsNV - void __stdcall GLee_Lazy_glGenProgramsNV(GLsizei n, GLuint * programs) {if (GLeeInit()) glGenProgramsNV(n, programs);} - GLEEPFNGLGENPROGRAMSNVPROC GLeeFuncPtr_glGenProgramsNV=GLee_Lazy_glGenProgramsNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramParameterdvNV -#define GLEE_C_DEFINED_glGetProgramParameterdvNV - void __stdcall GLee_Lazy_glGetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetProgramParameterdvNV(target, index, pname, params);} - GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramParameterdvNV=GLee_Lazy_glGetProgramParameterdvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramParameterfvNV -#define GLEE_C_DEFINED_glGetProgramParameterfvNV - void __stdcall GLee_Lazy_glGetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetProgramParameterfvNV(target, index, pname, params);} - GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramParameterfvNV=GLee_Lazy_glGetProgramParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramivNV -#define GLEE_C_DEFINED_glGetProgramivNV - void __stdcall GLee_Lazy_glGetProgramivNV(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetProgramivNV(id, pname, params);} - GLEEPFNGLGETPROGRAMIVNVPROC GLeeFuncPtr_glGetProgramivNV=GLee_Lazy_glGetProgramivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramStringNV -#define GLEE_C_DEFINED_glGetProgramStringNV - void __stdcall GLee_Lazy_glGetProgramStringNV(GLuint id, GLenum pname, GLubyte * program) {if (GLeeInit()) glGetProgramStringNV(id, pname, program);} - GLEEPFNGLGETPROGRAMSTRINGNVPROC GLeeFuncPtr_glGetProgramStringNV=GLee_Lazy_glGetProgramStringNV; -#endif -#ifndef GLEE_C_DEFINED_glGetTrackMatrixivNV -#define GLEE_C_DEFINED_glGetTrackMatrixivNV - void __stdcall GLee_Lazy_glGetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint * params) {if (GLeeInit()) glGetTrackMatrixivNV(target, address, pname, params);} - GLEEPFNGLGETTRACKMATRIXIVNVPROC GLeeFuncPtr_glGetTrackMatrixivNV=GLee_Lazy_glGetTrackMatrixivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribdvNV -#define GLEE_C_DEFINED_glGetVertexAttribdvNV - void __stdcall GLee_Lazy_glGetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetVertexAttribdvNV(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBDVNVPROC GLeeFuncPtr_glGetVertexAttribdvNV=GLee_Lazy_glGetVertexAttribdvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribfvNV -#define GLEE_C_DEFINED_glGetVertexAttribfvNV - void __stdcall GLee_Lazy_glGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribfvNV(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBFVNVPROC GLeeFuncPtr_glGetVertexAttribfvNV=GLee_Lazy_glGetVertexAttribfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribivNV -#define GLEE_C_DEFINED_glGetVertexAttribivNV - void __stdcall GLee_Lazy_glGetVertexAttribivNV(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribivNV(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIVNVPROC GLeeFuncPtr_glGetVertexAttribivNV=GLee_Lazy_glGetVertexAttribivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribPointervNV -#define GLEE_C_DEFINED_glGetVertexAttribPointervNV - void __stdcall GLee_Lazy_glGetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid* * pointer) {if (GLeeInit()) glGetVertexAttribPointervNV(index, pname, pointer);} - GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC GLeeFuncPtr_glGetVertexAttribPointervNV=GLee_Lazy_glGetVertexAttribPointervNV; -#endif -#ifndef GLEE_C_DEFINED_glIsProgramNV -#define GLEE_C_DEFINED_glIsProgramNV - GLboolean __stdcall GLee_Lazy_glIsProgramNV(GLuint id) {if (GLeeInit()) return glIsProgramNV(id); return (GLboolean)0;} - GLEEPFNGLISPROGRAMNVPROC GLeeFuncPtr_glIsProgramNV=GLee_Lazy_glIsProgramNV; -#endif -#ifndef GLEE_C_DEFINED_glLoadProgramNV -#define GLEE_C_DEFINED_glLoadProgramNV - void __stdcall GLee_Lazy_glLoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte * program) {if (GLeeInit()) glLoadProgramNV(target, id, len, program);} - GLEEPFNGLLOADPROGRAMNVPROC GLeeFuncPtr_glLoadProgramNV=GLee_Lazy_glLoadProgramNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramParameter4dNV -#define GLEE_C_DEFINED_glProgramParameter4dNV - void __stdcall GLee_Lazy_glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramParameter4dNV(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMPARAMETER4DNVPROC GLeeFuncPtr_glProgramParameter4dNV=GLee_Lazy_glProgramParameter4dNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramParameter4dvNV -#define GLEE_C_DEFINED_glProgramParameter4dvNV - void __stdcall GLee_Lazy_glProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble * v) {if (GLeeInit()) glProgramParameter4dvNV(target, index, v);} - GLEEPFNGLPROGRAMPARAMETER4DVNVPROC GLeeFuncPtr_glProgramParameter4dvNV=GLee_Lazy_glProgramParameter4dvNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramParameter4fNV -#define GLEE_C_DEFINED_glProgramParameter4fNV - void __stdcall GLee_Lazy_glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramParameter4fNV(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMPARAMETER4FNVPROC GLeeFuncPtr_glProgramParameter4fNV=GLee_Lazy_glProgramParameter4fNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramParameter4fvNV -#define GLEE_C_DEFINED_glProgramParameter4fvNV - void __stdcall GLee_Lazy_glProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat * v) {if (GLeeInit()) glProgramParameter4fvNV(target, index, v);} - GLEEPFNGLPROGRAMPARAMETER4FVNVPROC GLeeFuncPtr_glProgramParameter4fvNV=GLee_Lazy_glProgramParameter4fvNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramParameters4dvNV -#define GLEE_C_DEFINED_glProgramParameters4dvNV - void __stdcall GLee_Lazy_glProgramParameters4dvNV(GLenum target, GLuint index, GLuint count, const GLdouble * v) {if (GLeeInit()) glProgramParameters4dvNV(target, index, count, v);} - GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC GLeeFuncPtr_glProgramParameters4dvNV=GLee_Lazy_glProgramParameters4dvNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramParameters4fvNV -#define GLEE_C_DEFINED_glProgramParameters4fvNV - void __stdcall GLee_Lazy_glProgramParameters4fvNV(GLenum target, GLuint index, GLuint count, const GLfloat * v) {if (GLeeInit()) glProgramParameters4fvNV(target, index, count, v);} - GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC GLeeFuncPtr_glProgramParameters4fvNV=GLee_Lazy_glProgramParameters4fvNV; -#endif -#ifndef GLEE_C_DEFINED_glRequestResidentProgramsNV -#define GLEE_C_DEFINED_glRequestResidentProgramsNV - void __stdcall GLee_Lazy_glRequestResidentProgramsNV(GLsizei n, const GLuint * programs) {if (GLeeInit()) glRequestResidentProgramsNV(n, programs);} - GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC GLeeFuncPtr_glRequestResidentProgramsNV=GLee_Lazy_glRequestResidentProgramsNV; -#endif -#ifndef GLEE_C_DEFINED_glTrackMatrixNV -#define GLEE_C_DEFINED_glTrackMatrixNV - void __stdcall GLee_Lazy_glTrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform) {if (GLeeInit()) glTrackMatrixNV(target, address, matrix, transform);} - GLEEPFNGLTRACKMATRIXNVPROC GLeeFuncPtr_glTrackMatrixNV=GLee_Lazy_glTrackMatrixNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribPointerNV -#define GLEE_C_DEFINED_glVertexAttribPointerNV - void __stdcall GLee_Lazy_glVertexAttribPointerNV(GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribPointerNV(index, fsize, type, stride, pointer);} - GLEEPFNGLVERTEXATTRIBPOINTERNVPROC GLeeFuncPtr_glVertexAttribPointerNV=GLee_Lazy_glVertexAttribPointerNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1dNV -#define GLEE_C_DEFINED_glVertexAttrib1dNV - void __stdcall GLee_Lazy_glVertexAttrib1dNV(GLuint index, GLdouble x) {if (GLeeInit()) glVertexAttrib1dNV(index, x);} - GLEEPFNGLVERTEXATTRIB1DNVPROC GLeeFuncPtr_glVertexAttrib1dNV=GLee_Lazy_glVertexAttrib1dNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1dvNV -#define GLEE_C_DEFINED_glVertexAttrib1dvNV - void __stdcall GLee_Lazy_glVertexAttrib1dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib1dvNV(index, v);} - GLEEPFNGLVERTEXATTRIB1DVNVPROC GLeeFuncPtr_glVertexAttrib1dvNV=GLee_Lazy_glVertexAttrib1dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1fNV -#define GLEE_C_DEFINED_glVertexAttrib1fNV - void __stdcall GLee_Lazy_glVertexAttrib1fNV(GLuint index, GLfloat x) {if (GLeeInit()) glVertexAttrib1fNV(index, x);} - GLEEPFNGLVERTEXATTRIB1FNVPROC GLeeFuncPtr_glVertexAttrib1fNV=GLee_Lazy_glVertexAttrib1fNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1fvNV -#define GLEE_C_DEFINED_glVertexAttrib1fvNV - void __stdcall GLee_Lazy_glVertexAttrib1fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib1fvNV(index, v);} - GLEEPFNGLVERTEXATTRIB1FVNVPROC GLeeFuncPtr_glVertexAttrib1fvNV=GLee_Lazy_glVertexAttrib1fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1sNV -#define GLEE_C_DEFINED_glVertexAttrib1sNV - void __stdcall GLee_Lazy_glVertexAttrib1sNV(GLuint index, GLshort x) {if (GLeeInit()) glVertexAttrib1sNV(index, x);} - GLEEPFNGLVERTEXATTRIB1SNVPROC GLeeFuncPtr_glVertexAttrib1sNV=GLee_Lazy_glVertexAttrib1sNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1svNV -#define GLEE_C_DEFINED_glVertexAttrib1svNV - void __stdcall GLee_Lazy_glVertexAttrib1svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib1svNV(index, v);} - GLEEPFNGLVERTEXATTRIB1SVNVPROC GLeeFuncPtr_glVertexAttrib1svNV=GLee_Lazy_glVertexAttrib1svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2dNV -#define GLEE_C_DEFINED_glVertexAttrib2dNV - void __stdcall GLee_Lazy_glVertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexAttrib2dNV(index, x, y);} - GLEEPFNGLVERTEXATTRIB2DNVPROC GLeeFuncPtr_glVertexAttrib2dNV=GLee_Lazy_glVertexAttrib2dNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2dvNV -#define GLEE_C_DEFINED_glVertexAttrib2dvNV - void __stdcall GLee_Lazy_glVertexAttrib2dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib2dvNV(index, v);} - GLEEPFNGLVERTEXATTRIB2DVNVPROC GLeeFuncPtr_glVertexAttrib2dvNV=GLee_Lazy_glVertexAttrib2dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2fNV -#define GLEE_C_DEFINED_glVertexAttrib2fNV - void __stdcall GLee_Lazy_glVertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexAttrib2fNV(index, x, y);} - GLEEPFNGLVERTEXATTRIB2FNVPROC GLeeFuncPtr_glVertexAttrib2fNV=GLee_Lazy_glVertexAttrib2fNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2fvNV -#define GLEE_C_DEFINED_glVertexAttrib2fvNV - void __stdcall GLee_Lazy_glVertexAttrib2fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib2fvNV(index, v);} - GLEEPFNGLVERTEXATTRIB2FVNVPROC GLeeFuncPtr_glVertexAttrib2fvNV=GLee_Lazy_glVertexAttrib2fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2sNV -#define GLEE_C_DEFINED_glVertexAttrib2sNV - void __stdcall GLee_Lazy_glVertexAttrib2sNV(GLuint index, GLshort x, GLshort y) {if (GLeeInit()) glVertexAttrib2sNV(index, x, y);} - GLEEPFNGLVERTEXATTRIB2SNVPROC GLeeFuncPtr_glVertexAttrib2sNV=GLee_Lazy_glVertexAttrib2sNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2svNV -#define GLEE_C_DEFINED_glVertexAttrib2svNV - void __stdcall GLee_Lazy_glVertexAttrib2svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib2svNV(index, v);} - GLEEPFNGLVERTEXATTRIB2SVNVPROC GLeeFuncPtr_glVertexAttrib2svNV=GLee_Lazy_glVertexAttrib2svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3dNV -#define GLEE_C_DEFINED_glVertexAttrib3dNV - void __stdcall GLee_Lazy_glVertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexAttrib3dNV(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3DNVPROC GLeeFuncPtr_glVertexAttrib3dNV=GLee_Lazy_glVertexAttrib3dNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3dvNV -#define GLEE_C_DEFINED_glVertexAttrib3dvNV - void __stdcall GLee_Lazy_glVertexAttrib3dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib3dvNV(index, v);} - GLEEPFNGLVERTEXATTRIB3DVNVPROC GLeeFuncPtr_glVertexAttrib3dvNV=GLee_Lazy_glVertexAttrib3dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3fNV -#define GLEE_C_DEFINED_glVertexAttrib3fNV - void __stdcall GLee_Lazy_glVertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexAttrib3fNV(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3FNVPROC GLeeFuncPtr_glVertexAttrib3fNV=GLee_Lazy_glVertexAttrib3fNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3fvNV -#define GLEE_C_DEFINED_glVertexAttrib3fvNV - void __stdcall GLee_Lazy_glVertexAttrib3fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib3fvNV(index, v);} - GLEEPFNGLVERTEXATTRIB3FVNVPROC GLeeFuncPtr_glVertexAttrib3fvNV=GLee_Lazy_glVertexAttrib3fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3sNV -#define GLEE_C_DEFINED_glVertexAttrib3sNV - void __stdcall GLee_Lazy_glVertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexAttrib3sNV(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3SNVPROC GLeeFuncPtr_glVertexAttrib3sNV=GLee_Lazy_glVertexAttrib3sNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3svNV -#define GLEE_C_DEFINED_glVertexAttrib3svNV - void __stdcall GLee_Lazy_glVertexAttrib3svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib3svNV(index, v);} - GLEEPFNGLVERTEXATTRIB3SVNVPROC GLeeFuncPtr_glVertexAttrib3svNV=GLee_Lazy_glVertexAttrib3svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4dNV -#define GLEE_C_DEFINED_glVertexAttrib4dNV - void __stdcall GLee_Lazy_glVertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexAttrib4dNV(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4DNVPROC GLeeFuncPtr_glVertexAttrib4dNV=GLee_Lazy_glVertexAttrib4dNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4dvNV -#define GLEE_C_DEFINED_glVertexAttrib4dvNV - void __stdcall GLee_Lazy_glVertexAttrib4dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib4dvNV(index, v);} - GLEEPFNGLVERTEXATTRIB4DVNVPROC GLeeFuncPtr_glVertexAttrib4dvNV=GLee_Lazy_glVertexAttrib4dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4fNV -#define GLEE_C_DEFINED_glVertexAttrib4fNV - void __stdcall GLee_Lazy_glVertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexAttrib4fNV(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4FNVPROC GLeeFuncPtr_glVertexAttrib4fNV=GLee_Lazy_glVertexAttrib4fNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4fvNV -#define GLEE_C_DEFINED_glVertexAttrib4fvNV - void __stdcall GLee_Lazy_glVertexAttrib4fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib4fvNV(index, v);} - GLEEPFNGLVERTEXATTRIB4FVNVPROC GLeeFuncPtr_glVertexAttrib4fvNV=GLee_Lazy_glVertexAttrib4fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4sNV -#define GLEE_C_DEFINED_glVertexAttrib4sNV - void __stdcall GLee_Lazy_glVertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexAttrib4sNV(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4SNVPROC GLeeFuncPtr_glVertexAttrib4sNV=GLee_Lazy_glVertexAttrib4sNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4svNV -#define GLEE_C_DEFINED_glVertexAttrib4svNV - void __stdcall GLee_Lazy_glVertexAttrib4svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4svNV(index, v);} - GLEEPFNGLVERTEXATTRIB4SVNVPROC GLeeFuncPtr_glVertexAttrib4svNV=GLee_Lazy_glVertexAttrib4svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4ubNV -#define GLEE_C_DEFINED_glVertexAttrib4ubNV - void __stdcall GLee_Lazy_glVertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) {if (GLeeInit()) glVertexAttrib4ubNV(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4UBNVPROC GLeeFuncPtr_glVertexAttrib4ubNV=GLee_Lazy_glVertexAttrib4ubNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4ubvNV -#define GLEE_C_DEFINED_glVertexAttrib4ubvNV - void __stdcall GLee_Lazy_glVertexAttrib4ubvNV(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4ubvNV(index, v);} - GLEEPFNGLVERTEXATTRIB4UBVNVPROC GLeeFuncPtr_glVertexAttrib4ubvNV=GLee_Lazy_glVertexAttrib4ubvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs1dvNV -#define GLEE_C_DEFINED_glVertexAttribs1dvNV - void __stdcall GLee_Lazy_glVertexAttribs1dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs1dvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS1DVNVPROC GLeeFuncPtr_glVertexAttribs1dvNV=GLee_Lazy_glVertexAttribs1dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs1fvNV -#define GLEE_C_DEFINED_glVertexAttribs1fvNV - void __stdcall GLee_Lazy_glVertexAttribs1fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs1fvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS1FVNVPROC GLeeFuncPtr_glVertexAttribs1fvNV=GLee_Lazy_glVertexAttribs1fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs1svNV -#define GLEE_C_DEFINED_glVertexAttribs1svNV - void __stdcall GLee_Lazy_glVertexAttribs1svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs1svNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS1SVNVPROC GLeeFuncPtr_glVertexAttribs1svNV=GLee_Lazy_glVertexAttribs1svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs2dvNV -#define GLEE_C_DEFINED_glVertexAttribs2dvNV - void __stdcall GLee_Lazy_glVertexAttribs2dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs2dvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS2DVNVPROC GLeeFuncPtr_glVertexAttribs2dvNV=GLee_Lazy_glVertexAttribs2dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs2fvNV -#define GLEE_C_DEFINED_glVertexAttribs2fvNV - void __stdcall GLee_Lazy_glVertexAttribs2fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs2fvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS2FVNVPROC GLeeFuncPtr_glVertexAttribs2fvNV=GLee_Lazy_glVertexAttribs2fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs2svNV -#define GLEE_C_DEFINED_glVertexAttribs2svNV - void __stdcall GLee_Lazy_glVertexAttribs2svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs2svNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS2SVNVPROC GLeeFuncPtr_glVertexAttribs2svNV=GLee_Lazy_glVertexAttribs2svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs3dvNV -#define GLEE_C_DEFINED_glVertexAttribs3dvNV - void __stdcall GLee_Lazy_glVertexAttribs3dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs3dvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS3DVNVPROC GLeeFuncPtr_glVertexAttribs3dvNV=GLee_Lazy_glVertexAttribs3dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs3fvNV -#define GLEE_C_DEFINED_glVertexAttribs3fvNV - void __stdcall GLee_Lazy_glVertexAttribs3fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs3fvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS3FVNVPROC GLeeFuncPtr_glVertexAttribs3fvNV=GLee_Lazy_glVertexAttribs3fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs3svNV -#define GLEE_C_DEFINED_glVertexAttribs3svNV - void __stdcall GLee_Lazy_glVertexAttribs3svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs3svNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS3SVNVPROC GLeeFuncPtr_glVertexAttribs3svNV=GLee_Lazy_glVertexAttribs3svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs4dvNV -#define GLEE_C_DEFINED_glVertexAttribs4dvNV - void __stdcall GLee_Lazy_glVertexAttribs4dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs4dvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS4DVNVPROC GLeeFuncPtr_glVertexAttribs4dvNV=GLee_Lazy_glVertexAttribs4dvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs4fvNV -#define GLEE_C_DEFINED_glVertexAttribs4fvNV - void __stdcall GLee_Lazy_glVertexAttribs4fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs4fvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS4FVNVPROC GLeeFuncPtr_glVertexAttribs4fvNV=GLee_Lazy_glVertexAttribs4fvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs4svNV -#define GLEE_C_DEFINED_glVertexAttribs4svNV - void __stdcall GLee_Lazy_glVertexAttribs4svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs4svNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS4SVNVPROC GLeeFuncPtr_glVertexAttribs4svNV=GLee_Lazy_glVertexAttribs4svNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs4ubvNV -#define GLEE_C_DEFINED_glVertexAttribs4ubvNV - void __stdcall GLee_Lazy_glVertexAttribs4ubvNV(GLuint index, GLsizei count, const GLubyte * v) {if (GLeeInit()) glVertexAttribs4ubvNV(index, count, v);} - GLEEPFNGLVERTEXATTRIBS4UBVNVPROC GLeeFuncPtr_glVertexAttribs4ubvNV=GLee_Lazy_glVertexAttribs4ubvNV; -#endif -#endif - -/* GL_SGIX_texture_coordinate_clamp */ - -#ifdef __GLEE_GL_SGIX_texture_coordinate_clamp -#endif - -/* GL_SGIX_scalebias_hint */ - -#ifdef __GLEE_GL_SGIX_scalebias_hint -#endif - -/* GL_OML_interlace */ - -#ifdef __GLEE_GL_OML_interlace -#endif - -/* GL_OML_subsample */ - -#ifdef __GLEE_GL_OML_subsample -#endif - -/* GL_OML_resample */ - -#ifdef __GLEE_GL_OML_resample -#endif - -/* GL_NV_copy_depth_to_color */ - -#ifdef __GLEE_GL_NV_copy_depth_to_color -#endif - -/* GL_ATI_envmap_bumpmap */ - -#ifdef __GLEE_GL_ATI_envmap_bumpmap -#ifndef GLEE_C_DEFINED_glTexBumpParameterivATI -#define GLEE_C_DEFINED_glTexBumpParameterivATI - void __stdcall GLee_Lazy_glTexBumpParameterivATI(GLenum pname, const GLint * param) {if (GLeeInit()) glTexBumpParameterivATI(pname, param);} - GLEEPFNGLTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glTexBumpParameterivATI=GLee_Lazy_glTexBumpParameterivATI; -#endif -#ifndef GLEE_C_DEFINED_glTexBumpParameterfvATI -#define GLEE_C_DEFINED_glTexBumpParameterfvATI - void __stdcall GLee_Lazy_glTexBumpParameterfvATI(GLenum pname, const GLfloat * param) {if (GLeeInit()) glTexBumpParameterfvATI(pname, param);} - GLEEPFNGLTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glTexBumpParameterfvATI=GLee_Lazy_glTexBumpParameterfvATI; -#endif -#ifndef GLEE_C_DEFINED_glGetTexBumpParameterivATI -#define GLEE_C_DEFINED_glGetTexBumpParameterivATI - void __stdcall GLee_Lazy_glGetTexBumpParameterivATI(GLenum pname, GLint * param) {if (GLeeInit()) glGetTexBumpParameterivATI(pname, param);} - GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glGetTexBumpParameterivATI=GLee_Lazy_glGetTexBumpParameterivATI; -#endif -#ifndef GLEE_C_DEFINED_glGetTexBumpParameterfvATI -#define GLEE_C_DEFINED_glGetTexBumpParameterfvATI - void __stdcall GLee_Lazy_glGetTexBumpParameterfvATI(GLenum pname, GLfloat * param) {if (GLeeInit()) glGetTexBumpParameterfvATI(pname, param);} - GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glGetTexBumpParameterfvATI=GLee_Lazy_glGetTexBumpParameterfvATI; -#endif -#endif - -/* GL_ATI_fragment_shader */ - -#ifdef __GLEE_GL_ATI_fragment_shader -#ifndef GLEE_C_DEFINED_glGenFragmentShadersATI -#define GLEE_C_DEFINED_glGenFragmentShadersATI - GLuint __stdcall GLee_Lazy_glGenFragmentShadersATI(GLuint range) {if (GLeeInit()) return glGenFragmentShadersATI(range); return (GLuint)0;} - GLEEPFNGLGENFRAGMENTSHADERSATIPROC GLeeFuncPtr_glGenFragmentShadersATI=GLee_Lazy_glGenFragmentShadersATI; -#endif -#ifndef GLEE_C_DEFINED_glBindFragmentShaderATI -#define GLEE_C_DEFINED_glBindFragmentShaderATI - void __stdcall GLee_Lazy_glBindFragmentShaderATI(GLuint id) {if (GLeeInit()) glBindFragmentShaderATI(id);} - GLEEPFNGLBINDFRAGMENTSHADERATIPROC GLeeFuncPtr_glBindFragmentShaderATI=GLee_Lazy_glBindFragmentShaderATI; -#endif -#ifndef GLEE_C_DEFINED_glDeleteFragmentShaderATI -#define GLEE_C_DEFINED_glDeleteFragmentShaderATI - void __stdcall GLee_Lazy_glDeleteFragmentShaderATI(GLuint id) {if (GLeeInit()) glDeleteFragmentShaderATI(id);} - GLEEPFNGLDELETEFRAGMENTSHADERATIPROC GLeeFuncPtr_glDeleteFragmentShaderATI=GLee_Lazy_glDeleteFragmentShaderATI; -#endif -#ifndef GLEE_C_DEFINED_glBeginFragmentShaderATI -#define GLEE_C_DEFINED_glBeginFragmentShaderATI - void __stdcall GLee_Lazy_glBeginFragmentShaderATI(void) {if (GLeeInit()) glBeginFragmentShaderATI();} - GLEEPFNGLBEGINFRAGMENTSHADERATIPROC GLeeFuncPtr_glBeginFragmentShaderATI=GLee_Lazy_glBeginFragmentShaderATI; -#endif -#ifndef GLEE_C_DEFINED_glEndFragmentShaderATI -#define GLEE_C_DEFINED_glEndFragmentShaderATI - void __stdcall GLee_Lazy_glEndFragmentShaderATI(void) {if (GLeeInit()) glEndFragmentShaderATI();} - GLEEPFNGLENDFRAGMENTSHADERATIPROC GLeeFuncPtr_glEndFragmentShaderATI=GLee_Lazy_glEndFragmentShaderATI; -#endif -#ifndef GLEE_C_DEFINED_glPassTexCoordATI -#define GLEE_C_DEFINED_glPassTexCoordATI - void __stdcall GLee_Lazy_glPassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle) {if (GLeeInit()) glPassTexCoordATI(dst, coord, swizzle);} - GLEEPFNGLPASSTEXCOORDATIPROC GLeeFuncPtr_glPassTexCoordATI=GLee_Lazy_glPassTexCoordATI; -#endif -#ifndef GLEE_C_DEFINED_glSampleMapATI -#define GLEE_C_DEFINED_glSampleMapATI - void __stdcall GLee_Lazy_glSampleMapATI(GLuint dst, GLuint interp, GLenum swizzle) {if (GLeeInit()) glSampleMapATI(dst, interp, swizzle);} - GLEEPFNGLSAMPLEMAPATIPROC GLeeFuncPtr_glSampleMapATI=GLee_Lazy_glSampleMapATI; -#endif -#ifndef GLEE_C_DEFINED_glColorFragmentOp1ATI -#define GLEE_C_DEFINED_glColorFragmentOp1ATI - void __stdcall GLee_Lazy_glColorFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) {if (GLeeInit()) glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod);} - GLEEPFNGLCOLORFRAGMENTOP1ATIPROC GLeeFuncPtr_glColorFragmentOp1ATI=GLee_Lazy_glColorFragmentOp1ATI; -#endif -#ifndef GLEE_C_DEFINED_glColorFragmentOp2ATI -#define GLEE_C_DEFINED_glColorFragmentOp2ATI - void __stdcall GLee_Lazy_glColorFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) {if (GLeeInit()) glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod);} - GLEEPFNGLCOLORFRAGMENTOP2ATIPROC GLeeFuncPtr_glColorFragmentOp2ATI=GLee_Lazy_glColorFragmentOp2ATI; -#endif -#ifndef GLEE_C_DEFINED_glColorFragmentOp3ATI -#define GLEE_C_DEFINED_glColorFragmentOp3ATI - void __stdcall GLee_Lazy_glColorFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) {if (GLeeInit()) glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod);} - GLEEPFNGLCOLORFRAGMENTOP3ATIPROC GLeeFuncPtr_glColorFragmentOp3ATI=GLee_Lazy_glColorFragmentOp3ATI; -#endif -#ifndef GLEE_C_DEFINED_glAlphaFragmentOp1ATI -#define GLEE_C_DEFINED_glAlphaFragmentOp1ATI - void __stdcall GLee_Lazy_glAlphaFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) {if (GLeeInit()) glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod);} - GLEEPFNGLALPHAFRAGMENTOP1ATIPROC GLeeFuncPtr_glAlphaFragmentOp1ATI=GLee_Lazy_glAlphaFragmentOp1ATI; -#endif -#ifndef GLEE_C_DEFINED_glAlphaFragmentOp2ATI -#define GLEE_C_DEFINED_glAlphaFragmentOp2ATI - void __stdcall GLee_Lazy_glAlphaFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) {if (GLeeInit()) glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod);} - GLEEPFNGLALPHAFRAGMENTOP2ATIPROC GLeeFuncPtr_glAlphaFragmentOp2ATI=GLee_Lazy_glAlphaFragmentOp2ATI; -#endif -#ifndef GLEE_C_DEFINED_glAlphaFragmentOp3ATI -#define GLEE_C_DEFINED_glAlphaFragmentOp3ATI - void __stdcall GLee_Lazy_glAlphaFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) {if (GLeeInit()) glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod);} - GLEEPFNGLALPHAFRAGMENTOP3ATIPROC GLeeFuncPtr_glAlphaFragmentOp3ATI=GLee_Lazy_glAlphaFragmentOp3ATI; -#endif -#ifndef GLEE_C_DEFINED_glSetFragmentShaderConstantATI -#define GLEE_C_DEFINED_glSetFragmentShaderConstantATI - void __stdcall GLee_Lazy_glSetFragmentShaderConstantATI(GLuint dst, const GLfloat * value) {if (GLeeInit()) glSetFragmentShaderConstantATI(dst, value);} - GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC GLeeFuncPtr_glSetFragmentShaderConstantATI=GLee_Lazy_glSetFragmentShaderConstantATI; -#endif -#endif - -/* GL_ATI_pn_triangles */ - -#ifdef __GLEE_GL_ATI_pn_triangles -#ifndef GLEE_C_DEFINED_glPNTrianglesiATI -#define GLEE_C_DEFINED_glPNTrianglesiATI - void __stdcall GLee_Lazy_glPNTrianglesiATI(GLenum pname, GLint param) {if (GLeeInit()) glPNTrianglesiATI(pname, param);} - GLEEPFNGLPNTRIANGLESIATIPROC GLeeFuncPtr_glPNTrianglesiATI=GLee_Lazy_glPNTrianglesiATI; -#endif -#ifndef GLEE_C_DEFINED_glPNTrianglesfATI -#define GLEE_C_DEFINED_glPNTrianglesfATI - void __stdcall GLee_Lazy_glPNTrianglesfATI(GLenum pname, GLfloat param) {if (GLeeInit()) glPNTrianglesfATI(pname, param);} - GLEEPFNGLPNTRIANGLESFATIPROC GLeeFuncPtr_glPNTrianglesfATI=GLee_Lazy_glPNTrianglesfATI; -#endif -#endif - -/* GL_ATI_vertex_array_object */ - -#ifdef __GLEE_GL_ATI_vertex_array_object -#ifndef GLEE_C_DEFINED_glNewObjectBufferATI -#define GLEE_C_DEFINED_glNewObjectBufferATI - GLuint __stdcall GLee_Lazy_glNewObjectBufferATI(GLsizei size, const GLvoid * pointer, GLenum usage) {if (GLeeInit()) return glNewObjectBufferATI(size, pointer, usage); return (GLuint)0;} - GLEEPFNGLNEWOBJECTBUFFERATIPROC GLeeFuncPtr_glNewObjectBufferATI=GLee_Lazy_glNewObjectBufferATI; -#endif -#ifndef GLEE_C_DEFINED_glIsObjectBufferATI -#define GLEE_C_DEFINED_glIsObjectBufferATI - GLboolean __stdcall GLee_Lazy_glIsObjectBufferATI(GLuint buffer) {if (GLeeInit()) return glIsObjectBufferATI(buffer); return (GLboolean)0;} - GLEEPFNGLISOBJECTBUFFERATIPROC GLeeFuncPtr_glIsObjectBufferATI=GLee_Lazy_glIsObjectBufferATI; -#endif -#ifndef GLEE_C_DEFINED_glUpdateObjectBufferATI -#define GLEE_C_DEFINED_glUpdateObjectBufferATI - void __stdcall GLee_Lazy_glUpdateObjectBufferATI(GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pointer, GLenum preserve) {if (GLeeInit()) glUpdateObjectBufferATI(buffer, offset, size, pointer, preserve);} - GLEEPFNGLUPDATEOBJECTBUFFERATIPROC GLeeFuncPtr_glUpdateObjectBufferATI=GLee_Lazy_glUpdateObjectBufferATI; -#endif -#ifndef GLEE_C_DEFINED_glGetObjectBufferfvATI -#define GLEE_C_DEFINED_glGetObjectBufferfvATI - void __stdcall GLee_Lazy_glGetObjectBufferfvATI(GLuint buffer, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetObjectBufferfvATI(buffer, pname, params);} - GLEEPFNGLGETOBJECTBUFFERFVATIPROC GLeeFuncPtr_glGetObjectBufferfvATI=GLee_Lazy_glGetObjectBufferfvATI; -#endif -#ifndef GLEE_C_DEFINED_glGetObjectBufferivATI -#define GLEE_C_DEFINED_glGetObjectBufferivATI - void __stdcall GLee_Lazy_glGetObjectBufferivATI(GLuint buffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetObjectBufferivATI(buffer, pname, params);} - GLEEPFNGLGETOBJECTBUFFERIVATIPROC GLeeFuncPtr_glGetObjectBufferivATI=GLee_Lazy_glGetObjectBufferivATI; -#endif -#ifndef GLEE_C_DEFINED_glFreeObjectBufferATI -#define GLEE_C_DEFINED_glFreeObjectBufferATI - void __stdcall GLee_Lazy_glFreeObjectBufferATI(GLuint buffer) {if (GLeeInit()) glFreeObjectBufferATI(buffer);} - GLEEPFNGLFREEOBJECTBUFFERATIPROC GLeeFuncPtr_glFreeObjectBufferATI=GLee_Lazy_glFreeObjectBufferATI; -#endif -#ifndef GLEE_C_DEFINED_glArrayObjectATI -#define GLEE_C_DEFINED_glArrayObjectATI - void __stdcall GLee_Lazy_glArrayObjectATI(GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) {if (GLeeInit()) glArrayObjectATI(array, size, type, stride, buffer, offset);} - GLEEPFNGLARRAYOBJECTATIPROC GLeeFuncPtr_glArrayObjectATI=GLee_Lazy_glArrayObjectATI; -#endif -#ifndef GLEE_C_DEFINED_glGetArrayObjectfvATI -#define GLEE_C_DEFINED_glGetArrayObjectfvATI - void __stdcall GLee_Lazy_glGetArrayObjectfvATI(GLenum array, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetArrayObjectfvATI(array, pname, params);} - GLEEPFNGLGETARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetArrayObjectfvATI=GLee_Lazy_glGetArrayObjectfvATI; -#endif -#ifndef GLEE_C_DEFINED_glGetArrayObjectivATI -#define GLEE_C_DEFINED_glGetArrayObjectivATI - void __stdcall GLee_Lazy_glGetArrayObjectivATI(GLenum array, GLenum pname, GLint * params) {if (GLeeInit()) glGetArrayObjectivATI(array, pname, params);} - GLEEPFNGLGETARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetArrayObjectivATI=GLee_Lazy_glGetArrayObjectivATI; -#endif -#ifndef GLEE_C_DEFINED_glVariantArrayObjectATI -#define GLEE_C_DEFINED_glVariantArrayObjectATI - void __stdcall GLee_Lazy_glVariantArrayObjectATI(GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) {if (GLeeInit()) glVariantArrayObjectATI(id, type, stride, buffer, offset);} - GLEEPFNGLVARIANTARRAYOBJECTATIPROC GLeeFuncPtr_glVariantArrayObjectATI=GLee_Lazy_glVariantArrayObjectATI; -#endif -#ifndef GLEE_C_DEFINED_glGetVariantArrayObjectfvATI -#define GLEE_C_DEFINED_glGetVariantArrayObjectfvATI - void __stdcall GLee_Lazy_glGetVariantArrayObjectfvATI(GLuint id, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVariantArrayObjectfvATI(id, pname, params);} - GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVariantArrayObjectfvATI=GLee_Lazy_glGetVariantArrayObjectfvATI; -#endif -#ifndef GLEE_C_DEFINED_glGetVariantArrayObjectivATI -#define GLEE_C_DEFINED_glGetVariantArrayObjectivATI - void __stdcall GLee_Lazy_glGetVariantArrayObjectivATI(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetVariantArrayObjectivATI(id, pname, params);} - GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVariantArrayObjectivATI=GLee_Lazy_glGetVariantArrayObjectivATI; -#endif -#endif - -/* GL_EXT_vertex_shader */ - -#ifdef __GLEE_GL_EXT_vertex_shader -#ifndef GLEE_C_DEFINED_glBeginVertexShaderEXT -#define GLEE_C_DEFINED_glBeginVertexShaderEXT - void __stdcall GLee_Lazy_glBeginVertexShaderEXT(void) {if (GLeeInit()) glBeginVertexShaderEXT();} - GLEEPFNGLBEGINVERTEXSHADEREXTPROC GLeeFuncPtr_glBeginVertexShaderEXT=GLee_Lazy_glBeginVertexShaderEXT; -#endif -#ifndef GLEE_C_DEFINED_glEndVertexShaderEXT -#define GLEE_C_DEFINED_glEndVertexShaderEXT - void __stdcall GLee_Lazy_glEndVertexShaderEXT(void) {if (GLeeInit()) glEndVertexShaderEXT();} - GLEEPFNGLENDVERTEXSHADEREXTPROC GLeeFuncPtr_glEndVertexShaderEXT=GLee_Lazy_glEndVertexShaderEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindVertexShaderEXT -#define GLEE_C_DEFINED_glBindVertexShaderEXT - void __stdcall GLee_Lazy_glBindVertexShaderEXT(GLuint id) {if (GLeeInit()) glBindVertexShaderEXT(id);} - GLEEPFNGLBINDVERTEXSHADEREXTPROC GLeeFuncPtr_glBindVertexShaderEXT=GLee_Lazy_glBindVertexShaderEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenVertexShadersEXT -#define GLEE_C_DEFINED_glGenVertexShadersEXT - GLuint __stdcall GLee_Lazy_glGenVertexShadersEXT(GLuint range) {if (GLeeInit()) return glGenVertexShadersEXT(range); return (GLuint)0;} - GLEEPFNGLGENVERTEXSHADERSEXTPROC GLeeFuncPtr_glGenVertexShadersEXT=GLee_Lazy_glGenVertexShadersEXT; -#endif -#ifndef GLEE_C_DEFINED_glDeleteVertexShaderEXT -#define GLEE_C_DEFINED_glDeleteVertexShaderEXT - void __stdcall GLee_Lazy_glDeleteVertexShaderEXT(GLuint id) {if (GLeeInit()) glDeleteVertexShaderEXT(id);} - GLEEPFNGLDELETEVERTEXSHADEREXTPROC GLeeFuncPtr_glDeleteVertexShaderEXT=GLee_Lazy_glDeleteVertexShaderEXT; -#endif -#ifndef GLEE_C_DEFINED_glShaderOp1EXT -#define GLEE_C_DEFINED_glShaderOp1EXT - void __stdcall GLee_Lazy_glShaderOp1EXT(GLenum op, GLuint res, GLuint arg1) {if (GLeeInit()) glShaderOp1EXT(op, res, arg1);} - GLEEPFNGLSHADEROP1EXTPROC GLeeFuncPtr_glShaderOp1EXT=GLee_Lazy_glShaderOp1EXT; -#endif -#ifndef GLEE_C_DEFINED_glShaderOp2EXT -#define GLEE_C_DEFINED_glShaderOp2EXT - void __stdcall GLee_Lazy_glShaderOp2EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2) {if (GLeeInit()) glShaderOp2EXT(op, res, arg1, arg2);} - GLEEPFNGLSHADEROP2EXTPROC GLeeFuncPtr_glShaderOp2EXT=GLee_Lazy_glShaderOp2EXT; -#endif -#ifndef GLEE_C_DEFINED_glShaderOp3EXT -#define GLEE_C_DEFINED_glShaderOp3EXT - void __stdcall GLee_Lazy_glShaderOp3EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3) {if (GLeeInit()) glShaderOp3EXT(op, res, arg1, arg2, arg3);} - GLEEPFNGLSHADEROP3EXTPROC GLeeFuncPtr_glShaderOp3EXT=GLee_Lazy_glShaderOp3EXT; -#endif -#ifndef GLEE_C_DEFINED_glSwizzleEXT -#define GLEE_C_DEFINED_glSwizzleEXT - void __stdcall GLee_Lazy_glSwizzleEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) {if (GLeeInit()) glSwizzleEXT(res, in, outX, outY, outZ, outW);} - GLEEPFNGLSWIZZLEEXTPROC GLeeFuncPtr_glSwizzleEXT=GLee_Lazy_glSwizzleEXT; -#endif -#ifndef GLEE_C_DEFINED_glWriteMaskEXT -#define GLEE_C_DEFINED_glWriteMaskEXT - void __stdcall GLee_Lazy_glWriteMaskEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) {if (GLeeInit()) glWriteMaskEXT(res, in, outX, outY, outZ, outW);} - GLEEPFNGLWRITEMASKEXTPROC GLeeFuncPtr_glWriteMaskEXT=GLee_Lazy_glWriteMaskEXT; -#endif -#ifndef GLEE_C_DEFINED_glInsertComponentEXT -#define GLEE_C_DEFINED_glInsertComponentEXT - void __stdcall GLee_Lazy_glInsertComponentEXT(GLuint res, GLuint src, GLuint num) {if (GLeeInit()) glInsertComponentEXT(res, src, num);} - GLEEPFNGLINSERTCOMPONENTEXTPROC GLeeFuncPtr_glInsertComponentEXT=GLee_Lazy_glInsertComponentEXT; -#endif -#ifndef GLEE_C_DEFINED_glExtractComponentEXT -#define GLEE_C_DEFINED_glExtractComponentEXT - void __stdcall GLee_Lazy_glExtractComponentEXT(GLuint res, GLuint src, GLuint num) {if (GLeeInit()) glExtractComponentEXT(res, src, num);} - GLEEPFNGLEXTRACTCOMPONENTEXTPROC GLeeFuncPtr_glExtractComponentEXT=GLee_Lazy_glExtractComponentEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenSymbolsEXT -#define GLEE_C_DEFINED_glGenSymbolsEXT - GLuint __stdcall GLee_Lazy_glGenSymbolsEXT(GLenum datatype, GLenum storagetype, GLenum range, GLuint components) {if (GLeeInit()) return glGenSymbolsEXT(datatype, storagetype, range, components); return (GLuint)0;} - GLEEPFNGLGENSYMBOLSEXTPROC GLeeFuncPtr_glGenSymbolsEXT=GLee_Lazy_glGenSymbolsEXT; -#endif -#ifndef GLEE_C_DEFINED_glSetInvariantEXT -#define GLEE_C_DEFINED_glSetInvariantEXT - void __stdcall GLee_Lazy_glSetInvariantEXT(GLuint id, GLenum type, const GLvoid * addr) {if (GLeeInit()) glSetInvariantEXT(id, type, addr);} - GLEEPFNGLSETINVARIANTEXTPROC GLeeFuncPtr_glSetInvariantEXT=GLee_Lazy_glSetInvariantEXT; -#endif -#ifndef GLEE_C_DEFINED_glSetLocalConstantEXT -#define GLEE_C_DEFINED_glSetLocalConstantEXT - void __stdcall GLee_Lazy_glSetLocalConstantEXT(GLuint id, GLenum type, const GLvoid * addr) {if (GLeeInit()) glSetLocalConstantEXT(id, type, addr);} - GLEEPFNGLSETLOCALCONSTANTEXTPROC GLeeFuncPtr_glSetLocalConstantEXT=GLee_Lazy_glSetLocalConstantEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantbvEXT -#define GLEE_C_DEFINED_glVariantbvEXT - void __stdcall GLee_Lazy_glVariantbvEXT(GLuint id, const GLbyte * addr) {if (GLeeInit()) glVariantbvEXT(id, addr);} - GLEEPFNGLVARIANTBVEXTPROC GLeeFuncPtr_glVariantbvEXT=GLee_Lazy_glVariantbvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantsvEXT -#define GLEE_C_DEFINED_glVariantsvEXT - void __stdcall GLee_Lazy_glVariantsvEXT(GLuint id, const GLshort * addr) {if (GLeeInit()) glVariantsvEXT(id, addr);} - GLEEPFNGLVARIANTSVEXTPROC GLeeFuncPtr_glVariantsvEXT=GLee_Lazy_glVariantsvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantivEXT -#define GLEE_C_DEFINED_glVariantivEXT - void __stdcall GLee_Lazy_glVariantivEXT(GLuint id, const GLint * addr) {if (GLeeInit()) glVariantivEXT(id, addr);} - GLEEPFNGLVARIANTIVEXTPROC GLeeFuncPtr_glVariantivEXT=GLee_Lazy_glVariantivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantfvEXT -#define GLEE_C_DEFINED_glVariantfvEXT - void __stdcall GLee_Lazy_glVariantfvEXT(GLuint id, const GLfloat * addr) {if (GLeeInit()) glVariantfvEXT(id, addr);} - GLEEPFNGLVARIANTFVEXTPROC GLeeFuncPtr_glVariantfvEXT=GLee_Lazy_glVariantfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantdvEXT -#define GLEE_C_DEFINED_glVariantdvEXT - void __stdcall GLee_Lazy_glVariantdvEXT(GLuint id, const GLdouble * addr) {if (GLeeInit()) glVariantdvEXT(id, addr);} - GLEEPFNGLVARIANTDVEXTPROC GLeeFuncPtr_glVariantdvEXT=GLee_Lazy_glVariantdvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantubvEXT -#define GLEE_C_DEFINED_glVariantubvEXT - void __stdcall GLee_Lazy_glVariantubvEXT(GLuint id, const GLubyte * addr) {if (GLeeInit()) glVariantubvEXT(id, addr);} - GLEEPFNGLVARIANTUBVEXTPROC GLeeFuncPtr_glVariantubvEXT=GLee_Lazy_glVariantubvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantusvEXT -#define GLEE_C_DEFINED_glVariantusvEXT - void __stdcall GLee_Lazy_glVariantusvEXT(GLuint id, const GLushort * addr) {if (GLeeInit()) glVariantusvEXT(id, addr);} - GLEEPFNGLVARIANTUSVEXTPROC GLeeFuncPtr_glVariantusvEXT=GLee_Lazy_glVariantusvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantuivEXT -#define GLEE_C_DEFINED_glVariantuivEXT - void __stdcall GLee_Lazy_glVariantuivEXT(GLuint id, const GLuint * addr) {if (GLeeInit()) glVariantuivEXT(id, addr);} - GLEEPFNGLVARIANTUIVEXTPROC GLeeFuncPtr_glVariantuivEXT=GLee_Lazy_glVariantuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVariantPointerEXT -#define GLEE_C_DEFINED_glVariantPointerEXT - void __stdcall GLee_Lazy_glVariantPointerEXT(GLuint id, GLenum type, GLuint stride, const GLvoid * addr) {if (GLeeInit()) glVariantPointerEXT(id, type, stride, addr);} - GLEEPFNGLVARIANTPOINTEREXTPROC GLeeFuncPtr_glVariantPointerEXT=GLee_Lazy_glVariantPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glEnableVariantClientStateEXT -#define GLEE_C_DEFINED_glEnableVariantClientStateEXT - void __stdcall GLee_Lazy_glEnableVariantClientStateEXT(GLuint id) {if (GLeeInit()) glEnableVariantClientStateEXT(id);} - GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glEnableVariantClientStateEXT=GLee_Lazy_glEnableVariantClientStateEXT; -#endif -#ifndef GLEE_C_DEFINED_glDisableVariantClientStateEXT -#define GLEE_C_DEFINED_glDisableVariantClientStateEXT - void __stdcall GLee_Lazy_glDisableVariantClientStateEXT(GLuint id) {if (GLeeInit()) glDisableVariantClientStateEXT(id);} - GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glDisableVariantClientStateEXT=GLee_Lazy_glDisableVariantClientStateEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindLightParameterEXT -#define GLEE_C_DEFINED_glBindLightParameterEXT - GLuint __stdcall GLee_Lazy_glBindLightParameterEXT(GLenum light, GLenum value) {if (GLeeInit()) return glBindLightParameterEXT(light, value); return (GLuint)0;} - GLEEPFNGLBINDLIGHTPARAMETEREXTPROC GLeeFuncPtr_glBindLightParameterEXT=GLee_Lazy_glBindLightParameterEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindMaterialParameterEXT -#define GLEE_C_DEFINED_glBindMaterialParameterEXT - GLuint __stdcall GLee_Lazy_glBindMaterialParameterEXT(GLenum face, GLenum value) {if (GLeeInit()) return glBindMaterialParameterEXT(face, value); return (GLuint)0;} - GLEEPFNGLBINDMATERIALPARAMETEREXTPROC GLeeFuncPtr_glBindMaterialParameterEXT=GLee_Lazy_glBindMaterialParameterEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindTexGenParameterEXT -#define GLEE_C_DEFINED_glBindTexGenParameterEXT - GLuint __stdcall GLee_Lazy_glBindTexGenParameterEXT(GLenum unit, GLenum coord, GLenum value) {if (GLeeInit()) return glBindTexGenParameterEXT(unit, coord, value); return (GLuint)0;} - GLEEPFNGLBINDTEXGENPARAMETEREXTPROC GLeeFuncPtr_glBindTexGenParameterEXT=GLee_Lazy_glBindTexGenParameterEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindTextureUnitParameterEXT -#define GLEE_C_DEFINED_glBindTextureUnitParameterEXT - GLuint __stdcall GLee_Lazy_glBindTextureUnitParameterEXT(GLenum unit, GLenum value) {if (GLeeInit()) return glBindTextureUnitParameterEXT(unit, value); return (GLuint)0;} - GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC GLeeFuncPtr_glBindTextureUnitParameterEXT=GLee_Lazy_glBindTextureUnitParameterEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindParameterEXT -#define GLEE_C_DEFINED_glBindParameterEXT - GLuint __stdcall GLee_Lazy_glBindParameterEXT(GLenum value) {if (GLeeInit()) return glBindParameterEXT(value); return (GLuint)0;} - GLEEPFNGLBINDPARAMETEREXTPROC GLeeFuncPtr_glBindParameterEXT=GLee_Lazy_glBindParameterEXT; -#endif -#ifndef GLEE_C_DEFINED_glIsVariantEnabledEXT -#define GLEE_C_DEFINED_glIsVariantEnabledEXT - GLboolean __stdcall GLee_Lazy_glIsVariantEnabledEXT(GLuint id, GLenum cap) {if (GLeeInit()) return glIsVariantEnabledEXT(id, cap); return (GLboolean)0;} - GLEEPFNGLISVARIANTENABLEDEXTPROC GLeeFuncPtr_glIsVariantEnabledEXT=GLee_Lazy_glIsVariantEnabledEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetVariantBooleanvEXT -#define GLEE_C_DEFINED_glGetVariantBooleanvEXT - void __stdcall GLee_Lazy_glGetVariantBooleanvEXT(GLuint id, GLenum value, GLboolean * data) {if (GLeeInit()) glGetVariantBooleanvEXT(id, value, data);} - GLEEPFNGLGETVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetVariantBooleanvEXT=GLee_Lazy_glGetVariantBooleanvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetVariantIntegervEXT -#define GLEE_C_DEFINED_glGetVariantIntegervEXT - void __stdcall GLee_Lazy_glGetVariantIntegervEXT(GLuint id, GLenum value, GLint * data) {if (GLeeInit()) glGetVariantIntegervEXT(id, value, data);} - GLEEPFNGLGETVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetVariantIntegervEXT=GLee_Lazy_glGetVariantIntegervEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetVariantFloatvEXT -#define GLEE_C_DEFINED_glGetVariantFloatvEXT - void __stdcall GLee_Lazy_glGetVariantFloatvEXT(GLuint id, GLenum value, GLfloat * data) {if (GLeeInit()) glGetVariantFloatvEXT(id, value, data);} - GLEEPFNGLGETVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetVariantFloatvEXT=GLee_Lazy_glGetVariantFloatvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetVariantPointervEXT -#define GLEE_C_DEFINED_glGetVariantPointervEXT - void __stdcall GLee_Lazy_glGetVariantPointervEXT(GLuint id, GLenum value, GLvoid* * data) {if (GLeeInit()) glGetVariantPointervEXT(id, value, data);} - GLEEPFNGLGETVARIANTPOINTERVEXTPROC GLeeFuncPtr_glGetVariantPointervEXT=GLee_Lazy_glGetVariantPointervEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetInvariantBooleanvEXT -#define GLEE_C_DEFINED_glGetInvariantBooleanvEXT - void __stdcall GLee_Lazy_glGetInvariantBooleanvEXT(GLuint id, GLenum value, GLboolean * data) {if (GLeeInit()) glGetInvariantBooleanvEXT(id, value, data);} - GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetInvariantBooleanvEXT=GLee_Lazy_glGetInvariantBooleanvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetInvariantIntegervEXT -#define GLEE_C_DEFINED_glGetInvariantIntegervEXT - void __stdcall GLee_Lazy_glGetInvariantIntegervEXT(GLuint id, GLenum value, GLint * data) {if (GLeeInit()) glGetInvariantIntegervEXT(id, value, data);} - GLEEPFNGLGETINVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetInvariantIntegervEXT=GLee_Lazy_glGetInvariantIntegervEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetInvariantFloatvEXT -#define GLEE_C_DEFINED_glGetInvariantFloatvEXT - void __stdcall GLee_Lazy_glGetInvariantFloatvEXT(GLuint id, GLenum value, GLfloat * data) {if (GLeeInit()) glGetInvariantFloatvEXT(id, value, data);} - GLEEPFNGLGETINVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetInvariantFloatvEXT=GLee_Lazy_glGetInvariantFloatvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetLocalConstantBooleanvEXT -#define GLEE_C_DEFINED_glGetLocalConstantBooleanvEXT - void __stdcall GLee_Lazy_glGetLocalConstantBooleanvEXT(GLuint id, GLenum value, GLboolean * data) {if (GLeeInit()) glGetLocalConstantBooleanvEXT(id, value, data);} - GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC GLeeFuncPtr_glGetLocalConstantBooleanvEXT=GLee_Lazy_glGetLocalConstantBooleanvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetLocalConstantIntegervEXT -#define GLEE_C_DEFINED_glGetLocalConstantIntegervEXT - void __stdcall GLee_Lazy_glGetLocalConstantIntegervEXT(GLuint id, GLenum value, GLint * data) {if (GLeeInit()) glGetLocalConstantIntegervEXT(id, value, data);} - GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC GLeeFuncPtr_glGetLocalConstantIntegervEXT=GLee_Lazy_glGetLocalConstantIntegervEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetLocalConstantFloatvEXT -#define GLEE_C_DEFINED_glGetLocalConstantFloatvEXT - void __stdcall GLee_Lazy_glGetLocalConstantFloatvEXT(GLuint id, GLenum value, GLfloat * data) {if (GLeeInit()) glGetLocalConstantFloatvEXT(id, value, data);} - GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC GLeeFuncPtr_glGetLocalConstantFloatvEXT=GLee_Lazy_glGetLocalConstantFloatvEXT; -#endif -#endif - -/* GL_ATI_vertex_streams */ - -#ifdef __GLEE_GL_ATI_vertex_streams -#ifndef GLEE_C_DEFINED_glVertexStream1sATI -#define GLEE_C_DEFINED_glVertexStream1sATI - void __stdcall GLee_Lazy_glVertexStream1sATI(GLenum stream, GLshort x) {if (GLeeInit()) glVertexStream1sATI(stream, x);} - GLEEPFNGLVERTEXSTREAM1SATIPROC GLeeFuncPtr_glVertexStream1sATI=GLee_Lazy_glVertexStream1sATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1svATI -#define GLEE_C_DEFINED_glVertexStream1svATI - void __stdcall GLee_Lazy_glVertexStream1svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream1svATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM1SVATIPROC GLeeFuncPtr_glVertexStream1svATI=GLee_Lazy_glVertexStream1svATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1iATI -#define GLEE_C_DEFINED_glVertexStream1iATI - void __stdcall GLee_Lazy_glVertexStream1iATI(GLenum stream, GLint x) {if (GLeeInit()) glVertexStream1iATI(stream, x);} - GLEEPFNGLVERTEXSTREAM1IATIPROC GLeeFuncPtr_glVertexStream1iATI=GLee_Lazy_glVertexStream1iATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1ivATI -#define GLEE_C_DEFINED_glVertexStream1ivATI - void __stdcall GLee_Lazy_glVertexStream1ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream1ivATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM1IVATIPROC GLeeFuncPtr_glVertexStream1ivATI=GLee_Lazy_glVertexStream1ivATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1fATI -#define GLEE_C_DEFINED_glVertexStream1fATI - void __stdcall GLee_Lazy_glVertexStream1fATI(GLenum stream, GLfloat x) {if (GLeeInit()) glVertexStream1fATI(stream, x);} - GLEEPFNGLVERTEXSTREAM1FATIPROC GLeeFuncPtr_glVertexStream1fATI=GLee_Lazy_glVertexStream1fATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1fvATI -#define GLEE_C_DEFINED_glVertexStream1fvATI - void __stdcall GLee_Lazy_glVertexStream1fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream1fvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM1FVATIPROC GLeeFuncPtr_glVertexStream1fvATI=GLee_Lazy_glVertexStream1fvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1dATI -#define GLEE_C_DEFINED_glVertexStream1dATI - void __stdcall GLee_Lazy_glVertexStream1dATI(GLenum stream, GLdouble x) {if (GLeeInit()) glVertexStream1dATI(stream, x);} - GLEEPFNGLVERTEXSTREAM1DATIPROC GLeeFuncPtr_glVertexStream1dATI=GLee_Lazy_glVertexStream1dATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream1dvATI -#define GLEE_C_DEFINED_glVertexStream1dvATI - void __stdcall GLee_Lazy_glVertexStream1dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream1dvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM1DVATIPROC GLeeFuncPtr_glVertexStream1dvATI=GLee_Lazy_glVertexStream1dvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2sATI -#define GLEE_C_DEFINED_glVertexStream2sATI - void __stdcall GLee_Lazy_glVertexStream2sATI(GLenum stream, GLshort x, GLshort y) {if (GLeeInit()) glVertexStream2sATI(stream, x, y);} - GLEEPFNGLVERTEXSTREAM2SATIPROC GLeeFuncPtr_glVertexStream2sATI=GLee_Lazy_glVertexStream2sATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2svATI -#define GLEE_C_DEFINED_glVertexStream2svATI - void __stdcall GLee_Lazy_glVertexStream2svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream2svATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM2SVATIPROC GLeeFuncPtr_glVertexStream2svATI=GLee_Lazy_glVertexStream2svATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2iATI -#define GLEE_C_DEFINED_glVertexStream2iATI - void __stdcall GLee_Lazy_glVertexStream2iATI(GLenum stream, GLint x, GLint y) {if (GLeeInit()) glVertexStream2iATI(stream, x, y);} - GLEEPFNGLVERTEXSTREAM2IATIPROC GLeeFuncPtr_glVertexStream2iATI=GLee_Lazy_glVertexStream2iATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2ivATI -#define GLEE_C_DEFINED_glVertexStream2ivATI - void __stdcall GLee_Lazy_glVertexStream2ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream2ivATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM2IVATIPROC GLeeFuncPtr_glVertexStream2ivATI=GLee_Lazy_glVertexStream2ivATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2fATI -#define GLEE_C_DEFINED_glVertexStream2fATI - void __stdcall GLee_Lazy_glVertexStream2fATI(GLenum stream, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexStream2fATI(stream, x, y);} - GLEEPFNGLVERTEXSTREAM2FATIPROC GLeeFuncPtr_glVertexStream2fATI=GLee_Lazy_glVertexStream2fATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2fvATI -#define GLEE_C_DEFINED_glVertexStream2fvATI - void __stdcall GLee_Lazy_glVertexStream2fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream2fvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM2FVATIPROC GLeeFuncPtr_glVertexStream2fvATI=GLee_Lazy_glVertexStream2fvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2dATI -#define GLEE_C_DEFINED_glVertexStream2dATI - void __stdcall GLee_Lazy_glVertexStream2dATI(GLenum stream, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexStream2dATI(stream, x, y);} - GLEEPFNGLVERTEXSTREAM2DATIPROC GLeeFuncPtr_glVertexStream2dATI=GLee_Lazy_glVertexStream2dATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream2dvATI -#define GLEE_C_DEFINED_glVertexStream2dvATI - void __stdcall GLee_Lazy_glVertexStream2dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream2dvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM2DVATIPROC GLeeFuncPtr_glVertexStream2dvATI=GLee_Lazy_glVertexStream2dvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3sATI -#define GLEE_C_DEFINED_glVertexStream3sATI - void __stdcall GLee_Lazy_glVertexStream3sATI(GLenum stream, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexStream3sATI(stream, x, y, z);} - GLEEPFNGLVERTEXSTREAM3SATIPROC GLeeFuncPtr_glVertexStream3sATI=GLee_Lazy_glVertexStream3sATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3svATI -#define GLEE_C_DEFINED_glVertexStream3svATI - void __stdcall GLee_Lazy_glVertexStream3svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream3svATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM3SVATIPROC GLeeFuncPtr_glVertexStream3svATI=GLee_Lazy_glVertexStream3svATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3iATI -#define GLEE_C_DEFINED_glVertexStream3iATI - void __stdcall GLee_Lazy_glVertexStream3iATI(GLenum stream, GLint x, GLint y, GLint z) {if (GLeeInit()) glVertexStream3iATI(stream, x, y, z);} - GLEEPFNGLVERTEXSTREAM3IATIPROC GLeeFuncPtr_glVertexStream3iATI=GLee_Lazy_glVertexStream3iATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3ivATI -#define GLEE_C_DEFINED_glVertexStream3ivATI - void __stdcall GLee_Lazy_glVertexStream3ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream3ivATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM3IVATIPROC GLeeFuncPtr_glVertexStream3ivATI=GLee_Lazy_glVertexStream3ivATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3fATI -#define GLEE_C_DEFINED_glVertexStream3fATI - void __stdcall GLee_Lazy_glVertexStream3fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexStream3fATI(stream, x, y, z);} - GLEEPFNGLVERTEXSTREAM3FATIPROC GLeeFuncPtr_glVertexStream3fATI=GLee_Lazy_glVertexStream3fATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3fvATI -#define GLEE_C_DEFINED_glVertexStream3fvATI - void __stdcall GLee_Lazy_glVertexStream3fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream3fvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM3FVATIPROC GLeeFuncPtr_glVertexStream3fvATI=GLee_Lazy_glVertexStream3fvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3dATI -#define GLEE_C_DEFINED_glVertexStream3dATI - void __stdcall GLee_Lazy_glVertexStream3dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexStream3dATI(stream, x, y, z);} - GLEEPFNGLVERTEXSTREAM3DATIPROC GLeeFuncPtr_glVertexStream3dATI=GLee_Lazy_glVertexStream3dATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream3dvATI -#define GLEE_C_DEFINED_glVertexStream3dvATI - void __stdcall GLee_Lazy_glVertexStream3dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream3dvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM3DVATIPROC GLeeFuncPtr_glVertexStream3dvATI=GLee_Lazy_glVertexStream3dvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4sATI -#define GLEE_C_DEFINED_glVertexStream4sATI - void __stdcall GLee_Lazy_glVertexStream4sATI(GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexStream4sATI(stream, x, y, z, w);} - GLEEPFNGLVERTEXSTREAM4SATIPROC GLeeFuncPtr_glVertexStream4sATI=GLee_Lazy_glVertexStream4sATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4svATI -#define GLEE_C_DEFINED_glVertexStream4svATI - void __stdcall GLee_Lazy_glVertexStream4svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream4svATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM4SVATIPROC GLeeFuncPtr_glVertexStream4svATI=GLee_Lazy_glVertexStream4svATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4iATI -#define GLEE_C_DEFINED_glVertexStream4iATI - void __stdcall GLee_Lazy_glVertexStream4iATI(GLenum stream, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glVertexStream4iATI(stream, x, y, z, w);} - GLEEPFNGLVERTEXSTREAM4IATIPROC GLeeFuncPtr_glVertexStream4iATI=GLee_Lazy_glVertexStream4iATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4ivATI -#define GLEE_C_DEFINED_glVertexStream4ivATI - void __stdcall GLee_Lazy_glVertexStream4ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream4ivATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM4IVATIPROC GLeeFuncPtr_glVertexStream4ivATI=GLee_Lazy_glVertexStream4ivATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4fATI -#define GLEE_C_DEFINED_glVertexStream4fATI - void __stdcall GLee_Lazy_glVertexStream4fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexStream4fATI(stream, x, y, z, w);} - GLEEPFNGLVERTEXSTREAM4FATIPROC GLeeFuncPtr_glVertexStream4fATI=GLee_Lazy_glVertexStream4fATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4fvATI -#define GLEE_C_DEFINED_glVertexStream4fvATI - void __stdcall GLee_Lazy_glVertexStream4fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream4fvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM4FVATIPROC GLeeFuncPtr_glVertexStream4fvATI=GLee_Lazy_glVertexStream4fvATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4dATI -#define GLEE_C_DEFINED_glVertexStream4dATI - void __stdcall GLee_Lazy_glVertexStream4dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexStream4dATI(stream, x, y, z, w);} - GLEEPFNGLVERTEXSTREAM4DATIPROC GLeeFuncPtr_glVertexStream4dATI=GLee_Lazy_glVertexStream4dATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexStream4dvATI -#define GLEE_C_DEFINED_glVertexStream4dvATI - void __stdcall GLee_Lazy_glVertexStream4dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream4dvATI(stream, coords);} - GLEEPFNGLVERTEXSTREAM4DVATIPROC GLeeFuncPtr_glVertexStream4dvATI=GLee_Lazy_glVertexStream4dvATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3bATI -#define GLEE_C_DEFINED_glNormalStream3bATI - void __stdcall GLee_Lazy_glNormalStream3bATI(GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz) {if (GLeeInit()) glNormalStream3bATI(stream, nx, ny, nz);} - GLEEPFNGLNORMALSTREAM3BATIPROC GLeeFuncPtr_glNormalStream3bATI=GLee_Lazy_glNormalStream3bATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3bvATI -#define GLEE_C_DEFINED_glNormalStream3bvATI - void __stdcall GLee_Lazy_glNormalStream3bvATI(GLenum stream, const GLbyte * coords) {if (GLeeInit()) glNormalStream3bvATI(stream, coords);} - GLEEPFNGLNORMALSTREAM3BVATIPROC GLeeFuncPtr_glNormalStream3bvATI=GLee_Lazy_glNormalStream3bvATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3sATI -#define GLEE_C_DEFINED_glNormalStream3sATI - void __stdcall GLee_Lazy_glNormalStream3sATI(GLenum stream, GLshort nx, GLshort ny, GLshort nz) {if (GLeeInit()) glNormalStream3sATI(stream, nx, ny, nz);} - GLEEPFNGLNORMALSTREAM3SATIPROC GLeeFuncPtr_glNormalStream3sATI=GLee_Lazy_glNormalStream3sATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3svATI -#define GLEE_C_DEFINED_glNormalStream3svATI - void __stdcall GLee_Lazy_glNormalStream3svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glNormalStream3svATI(stream, coords);} - GLEEPFNGLNORMALSTREAM3SVATIPROC GLeeFuncPtr_glNormalStream3svATI=GLee_Lazy_glNormalStream3svATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3iATI -#define GLEE_C_DEFINED_glNormalStream3iATI - void __stdcall GLee_Lazy_glNormalStream3iATI(GLenum stream, GLint nx, GLint ny, GLint nz) {if (GLeeInit()) glNormalStream3iATI(stream, nx, ny, nz);} - GLEEPFNGLNORMALSTREAM3IATIPROC GLeeFuncPtr_glNormalStream3iATI=GLee_Lazy_glNormalStream3iATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3ivATI -#define GLEE_C_DEFINED_glNormalStream3ivATI - void __stdcall GLee_Lazy_glNormalStream3ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glNormalStream3ivATI(stream, coords);} - GLEEPFNGLNORMALSTREAM3IVATIPROC GLeeFuncPtr_glNormalStream3ivATI=GLee_Lazy_glNormalStream3ivATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3fATI -#define GLEE_C_DEFINED_glNormalStream3fATI - void __stdcall GLee_Lazy_glNormalStream3fATI(GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz) {if (GLeeInit()) glNormalStream3fATI(stream, nx, ny, nz);} - GLEEPFNGLNORMALSTREAM3FATIPROC GLeeFuncPtr_glNormalStream3fATI=GLee_Lazy_glNormalStream3fATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3fvATI -#define GLEE_C_DEFINED_glNormalStream3fvATI - void __stdcall GLee_Lazy_glNormalStream3fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glNormalStream3fvATI(stream, coords);} - GLEEPFNGLNORMALSTREAM3FVATIPROC GLeeFuncPtr_glNormalStream3fvATI=GLee_Lazy_glNormalStream3fvATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3dATI -#define GLEE_C_DEFINED_glNormalStream3dATI - void __stdcall GLee_Lazy_glNormalStream3dATI(GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz) {if (GLeeInit()) glNormalStream3dATI(stream, nx, ny, nz);} - GLEEPFNGLNORMALSTREAM3DATIPROC GLeeFuncPtr_glNormalStream3dATI=GLee_Lazy_glNormalStream3dATI; -#endif -#ifndef GLEE_C_DEFINED_glNormalStream3dvATI -#define GLEE_C_DEFINED_glNormalStream3dvATI - void __stdcall GLee_Lazy_glNormalStream3dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glNormalStream3dvATI(stream, coords);} - GLEEPFNGLNORMALSTREAM3DVATIPROC GLeeFuncPtr_glNormalStream3dvATI=GLee_Lazy_glNormalStream3dvATI; -#endif -#ifndef GLEE_C_DEFINED_glClientActiveVertexStreamATI -#define GLEE_C_DEFINED_glClientActiveVertexStreamATI - void __stdcall GLee_Lazy_glClientActiveVertexStreamATI(GLenum stream) {if (GLeeInit()) glClientActiveVertexStreamATI(stream);} - GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC GLeeFuncPtr_glClientActiveVertexStreamATI=GLee_Lazy_glClientActiveVertexStreamATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexBlendEnviATI -#define GLEE_C_DEFINED_glVertexBlendEnviATI - void __stdcall GLee_Lazy_glVertexBlendEnviATI(GLenum pname, GLint param) {if (GLeeInit()) glVertexBlendEnviATI(pname, param);} - GLEEPFNGLVERTEXBLENDENVIATIPROC GLeeFuncPtr_glVertexBlendEnviATI=GLee_Lazy_glVertexBlendEnviATI; -#endif -#ifndef GLEE_C_DEFINED_glVertexBlendEnvfATI -#define GLEE_C_DEFINED_glVertexBlendEnvfATI - void __stdcall GLee_Lazy_glVertexBlendEnvfATI(GLenum pname, GLfloat param) {if (GLeeInit()) glVertexBlendEnvfATI(pname, param);} - GLEEPFNGLVERTEXBLENDENVFATIPROC GLeeFuncPtr_glVertexBlendEnvfATI=GLee_Lazy_glVertexBlendEnvfATI; -#endif -#endif - -/* GL_ATI_element_array */ - -#ifdef __GLEE_GL_ATI_element_array -#ifndef GLEE_C_DEFINED_glElementPointerATI -#define GLEE_C_DEFINED_glElementPointerATI - void __stdcall GLee_Lazy_glElementPointerATI(GLenum type, const GLvoid * pointer) {if (GLeeInit()) glElementPointerATI(type, pointer);} - GLEEPFNGLELEMENTPOINTERATIPROC GLeeFuncPtr_glElementPointerATI=GLee_Lazy_glElementPointerATI; -#endif -#ifndef GLEE_C_DEFINED_glDrawElementArrayATI -#define GLEE_C_DEFINED_glDrawElementArrayATI - void __stdcall GLee_Lazy_glDrawElementArrayATI(GLenum mode, GLsizei count) {if (GLeeInit()) glDrawElementArrayATI(mode, count);} - GLEEPFNGLDRAWELEMENTARRAYATIPROC GLeeFuncPtr_glDrawElementArrayATI=GLee_Lazy_glDrawElementArrayATI; -#endif -#ifndef GLEE_C_DEFINED_glDrawRangeElementArrayATI -#define GLEE_C_DEFINED_glDrawRangeElementArrayATI - void __stdcall GLee_Lazy_glDrawRangeElementArrayATI(GLenum mode, GLuint start, GLuint end, GLsizei count) {if (GLeeInit()) glDrawRangeElementArrayATI(mode, start, end, count);} - GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC GLeeFuncPtr_glDrawRangeElementArrayATI=GLee_Lazy_glDrawRangeElementArrayATI; -#endif -#endif - -/* GL_SUN_mesh_array */ - -#ifdef __GLEE_GL_SUN_mesh_array -#ifndef GLEE_C_DEFINED_glDrawMeshArraysSUN -#define GLEE_C_DEFINED_glDrawMeshArraysSUN - void __stdcall GLee_Lazy_glDrawMeshArraysSUN(GLenum mode, GLint first, GLsizei count, GLsizei width) {if (GLeeInit()) glDrawMeshArraysSUN(mode, first, count, width);} - GLEEPFNGLDRAWMESHARRAYSSUNPROC GLeeFuncPtr_glDrawMeshArraysSUN=GLee_Lazy_glDrawMeshArraysSUN; -#endif -#endif - -/* GL_SUN_slice_accum */ - -#ifdef __GLEE_GL_SUN_slice_accum -#endif - -/* GL_NV_multisample_filter_hint */ - -#ifdef __GLEE_GL_NV_multisample_filter_hint -#endif - -/* GL_NV_depth_clamp */ - -#ifdef __GLEE_GL_NV_depth_clamp -#endif - -/* GL_NV_occlusion_query */ - -#ifdef __GLEE_GL_NV_occlusion_query -#ifndef GLEE_C_DEFINED_glGenOcclusionQueriesNV -#define GLEE_C_DEFINED_glGenOcclusionQueriesNV - void __stdcall GLee_Lazy_glGenOcclusionQueriesNV(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenOcclusionQueriesNV(n, ids);} - GLEEPFNGLGENOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glGenOcclusionQueriesNV=GLee_Lazy_glGenOcclusionQueriesNV; -#endif -#ifndef GLEE_C_DEFINED_glDeleteOcclusionQueriesNV -#define GLEE_C_DEFINED_glDeleteOcclusionQueriesNV - void __stdcall GLee_Lazy_glDeleteOcclusionQueriesNV(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteOcclusionQueriesNV(n, ids);} - GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glDeleteOcclusionQueriesNV=GLee_Lazy_glDeleteOcclusionQueriesNV; -#endif -#ifndef GLEE_C_DEFINED_glIsOcclusionQueryNV -#define GLEE_C_DEFINED_glIsOcclusionQueryNV - GLboolean __stdcall GLee_Lazy_glIsOcclusionQueryNV(GLuint id) {if (GLeeInit()) return glIsOcclusionQueryNV(id); return (GLboolean)0;} - GLEEPFNGLISOCCLUSIONQUERYNVPROC GLeeFuncPtr_glIsOcclusionQueryNV=GLee_Lazy_glIsOcclusionQueryNV; -#endif -#ifndef GLEE_C_DEFINED_glBeginOcclusionQueryNV -#define GLEE_C_DEFINED_glBeginOcclusionQueryNV - void __stdcall GLee_Lazy_glBeginOcclusionQueryNV(GLuint id) {if (GLeeInit()) glBeginOcclusionQueryNV(id);} - GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC GLeeFuncPtr_glBeginOcclusionQueryNV=GLee_Lazy_glBeginOcclusionQueryNV; -#endif -#ifndef GLEE_C_DEFINED_glEndOcclusionQueryNV -#define GLEE_C_DEFINED_glEndOcclusionQueryNV - void __stdcall GLee_Lazy_glEndOcclusionQueryNV(void) {if (GLeeInit()) glEndOcclusionQueryNV();} - GLEEPFNGLENDOCCLUSIONQUERYNVPROC GLeeFuncPtr_glEndOcclusionQueryNV=GLee_Lazy_glEndOcclusionQueryNV; -#endif -#ifndef GLEE_C_DEFINED_glGetOcclusionQueryivNV -#define GLEE_C_DEFINED_glGetOcclusionQueryivNV - void __stdcall GLee_Lazy_glGetOcclusionQueryivNV(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetOcclusionQueryivNV(id, pname, params);} - GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC GLeeFuncPtr_glGetOcclusionQueryivNV=GLee_Lazy_glGetOcclusionQueryivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetOcclusionQueryuivNV -#define GLEE_C_DEFINED_glGetOcclusionQueryuivNV - void __stdcall GLee_Lazy_glGetOcclusionQueryuivNV(GLuint id, GLenum pname, GLuint * params) {if (GLeeInit()) glGetOcclusionQueryuivNV(id, pname, params);} - GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC GLeeFuncPtr_glGetOcclusionQueryuivNV=GLee_Lazy_glGetOcclusionQueryuivNV; -#endif -#endif - -/* GL_NV_point_sprite */ - -#ifdef __GLEE_GL_NV_point_sprite -#ifndef GLEE_C_DEFINED_glPointParameteriNV -#define GLEE_C_DEFINED_glPointParameteriNV - void __stdcall GLee_Lazy_glPointParameteriNV(GLenum pname, GLint param) {if (GLeeInit()) glPointParameteriNV(pname, param);} - GLEEPFNGLPOINTPARAMETERINVPROC GLeeFuncPtr_glPointParameteriNV=GLee_Lazy_glPointParameteriNV; -#endif -#ifndef GLEE_C_DEFINED_glPointParameterivNV -#define GLEE_C_DEFINED_glPointParameterivNV - void __stdcall GLee_Lazy_glPointParameterivNV(GLenum pname, const GLint * params) {if (GLeeInit()) glPointParameterivNV(pname, params);} - GLEEPFNGLPOINTPARAMETERIVNVPROC GLeeFuncPtr_glPointParameterivNV=GLee_Lazy_glPointParameterivNV; -#endif -#endif - -/* GL_NV_texture_shader3 */ - -#ifdef __GLEE_GL_NV_texture_shader3 -#endif - -/* GL_NV_vertex_program1_1 */ - -#ifdef __GLEE_GL_NV_vertex_program1_1 -#endif - -/* GL_EXT_shadow_funcs */ - -#ifdef __GLEE_GL_EXT_shadow_funcs -#endif - -/* GL_EXT_stencil_two_side */ - -#ifdef __GLEE_GL_EXT_stencil_two_side -#ifndef GLEE_C_DEFINED_glActiveStencilFaceEXT -#define GLEE_C_DEFINED_glActiveStencilFaceEXT - void __stdcall GLee_Lazy_glActiveStencilFaceEXT(GLenum face) {if (GLeeInit()) glActiveStencilFaceEXT(face);} - GLEEPFNGLACTIVESTENCILFACEEXTPROC GLeeFuncPtr_glActiveStencilFaceEXT=GLee_Lazy_glActiveStencilFaceEXT; -#endif -#endif - -/* GL_ATI_text_fragment_shader */ - -#ifdef __GLEE_GL_ATI_text_fragment_shader -#endif - -/* GL_APPLE_client_storage */ - -#ifdef __GLEE_GL_APPLE_client_storage -#endif - -/* GL_APPLE_element_array */ - -#ifdef __GLEE_GL_APPLE_element_array -#ifndef GLEE_C_DEFINED_glElementPointerAPPLE -#define GLEE_C_DEFINED_glElementPointerAPPLE - void __stdcall GLee_Lazy_glElementPointerAPPLE(GLenum type, const GLvoid * pointer) {if (GLeeInit()) glElementPointerAPPLE(type, pointer);} - GLEEPFNGLELEMENTPOINTERAPPLEPROC GLeeFuncPtr_glElementPointerAPPLE=GLee_Lazy_glElementPointerAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glDrawElementArrayAPPLE -#define GLEE_C_DEFINED_glDrawElementArrayAPPLE - void __stdcall GLee_Lazy_glDrawElementArrayAPPLE(GLenum mode, GLint first, GLsizei count) {if (GLeeInit()) glDrawElementArrayAPPLE(mode, first, count);} - GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawElementArrayAPPLE=GLee_Lazy_glDrawElementArrayAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glDrawRangeElementArrayAPPLE -#define GLEE_C_DEFINED_glDrawRangeElementArrayAPPLE - void __stdcall GLee_Lazy_glDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count) {if (GLeeInit()) glDrawRangeElementArrayAPPLE(mode, start, end, first, count);} - GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawRangeElementArrayAPPLE=GLee_Lazy_glDrawRangeElementArrayAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glMultiDrawElementArrayAPPLE -#define GLEE_C_DEFINED_glMultiDrawElementArrayAPPLE - void __stdcall GLee_Lazy_glMultiDrawElementArrayAPPLE(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawElementArrayAPPLE(mode, first, count, primcount);} - GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawElementArrayAPPLE=GLee_Lazy_glMultiDrawElementArrayAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glMultiDrawRangeElementArrayAPPLE -#define GLEE_C_DEFINED_glMultiDrawRangeElementArrayAPPLE - void __stdcall GLee_Lazy_glMultiDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount);} - GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE=GLee_Lazy_glMultiDrawRangeElementArrayAPPLE; -#endif -#endif - -/* GL_APPLE_fence */ - -#ifdef __GLEE_GL_APPLE_fence -#ifndef GLEE_C_DEFINED_glGenFencesAPPLE -#define GLEE_C_DEFINED_glGenFencesAPPLE - void __stdcall GLee_Lazy_glGenFencesAPPLE(GLsizei n, GLuint * fences) {if (GLeeInit()) glGenFencesAPPLE(n, fences);} - GLEEPFNGLGENFENCESAPPLEPROC GLeeFuncPtr_glGenFencesAPPLE=GLee_Lazy_glGenFencesAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glDeleteFencesAPPLE -#define GLEE_C_DEFINED_glDeleteFencesAPPLE - void __stdcall GLee_Lazy_glDeleteFencesAPPLE(GLsizei n, const GLuint * fences) {if (GLeeInit()) glDeleteFencesAPPLE(n, fences);} - GLEEPFNGLDELETEFENCESAPPLEPROC GLeeFuncPtr_glDeleteFencesAPPLE=GLee_Lazy_glDeleteFencesAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glSetFenceAPPLE -#define GLEE_C_DEFINED_glSetFenceAPPLE - void __stdcall GLee_Lazy_glSetFenceAPPLE(GLuint fence) {if (GLeeInit()) glSetFenceAPPLE(fence);} - GLEEPFNGLSETFENCEAPPLEPROC GLeeFuncPtr_glSetFenceAPPLE=GLee_Lazy_glSetFenceAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glIsFenceAPPLE -#define GLEE_C_DEFINED_glIsFenceAPPLE - GLboolean __stdcall GLee_Lazy_glIsFenceAPPLE(GLuint fence) {if (GLeeInit()) return glIsFenceAPPLE(fence); return (GLboolean)0;} - GLEEPFNGLISFENCEAPPLEPROC GLeeFuncPtr_glIsFenceAPPLE=GLee_Lazy_glIsFenceAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glTestFenceAPPLE -#define GLEE_C_DEFINED_glTestFenceAPPLE - GLboolean __stdcall GLee_Lazy_glTestFenceAPPLE(GLuint fence) {if (GLeeInit()) return glTestFenceAPPLE(fence); return (GLboolean)0;} - GLEEPFNGLTESTFENCEAPPLEPROC GLeeFuncPtr_glTestFenceAPPLE=GLee_Lazy_glTestFenceAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glFinishFenceAPPLE -#define GLEE_C_DEFINED_glFinishFenceAPPLE - void __stdcall GLee_Lazy_glFinishFenceAPPLE(GLuint fence) {if (GLeeInit()) glFinishFenceAPPLE(fence);} - GLEEPFNGLFINISHFENCEAPPLEPROC GLeeFuncPtr_glFinishFenceAPPLE=GLee_Lazy_glFinishFenceAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glTestObjectAPPLE -#define GLEE_C_DEFINED_glTestObjectAPPLE - GLboolean __stdcall GLee_Lazy_glTestObjectAPPLE(GLenum object, GLuint name) {if (GLeeInit()) return glTestObjectAPPLE(object, name); return (GLboolean)0;} - GLEEPFNGLTESTOBJECTAPPLEPROC GLeeFuncPtr_glTestObjectAPPLE=GLee_Lazy_glTestObjectAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glFinishObjectAPPLE -#define GLEE_C_DEFINED_glFinishObjectAPPLE - void __stdcall GLee_Lazy_glFinishObjectAPPLE(GLenum object, GLint name) {if (GLeeInit()) glFinishObjectAPPLE(object, name);} - GLEEPFNGLFINISHOBJECTAPPLEPROC GLeeFuncPtr_glFinishObjectAPPLE=GLee_Lazy_glFinishObjectAPPLE; -#endif -#endif - -/* GL_APPLE_vertex_array_object */ - -#ifdef __GLEE_GL_APPLE_vertex_array_object -#ifndef GLEE_C_DEFINED_glBindVertexArrayAPPLE -#define GLEE_C_DEFINED_glBindVertexArrayAPPLE - void __stdcall GLee_Lazy_glBindVertexArrayAPPLE(GLuint array) {if (GLeeInit()) glBindVertexArrayAPPLE(array);} - GLEEPFNGLBINDVERTEXARRAYAPPLEPROC GLeeFuncPtr_glBindVertexArrayAPPLE=GLee_Lazy_glBindVertexArrayAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glDeleteVertexArraysAPPLE -#define GLEE_C_DEFINED_glDeleteVertexArraysAPPLE - void __stdcall GLee_Lazy_glDeleteVertexArraysAPPLE(GLsizei n, const GLuint * arrays) {if (GLeeInit()) glDeleteVertexArraysAPPLE(n, arrays);} - GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glDeleteVertexArraysAPPLE=GLee_Lazy_glDeleteVertexArraysAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glGenVertexArraysAPPLE -#define GLEE_C_DEFINED_glGenVertexArraysAPPLE - void __stdcall GLee_Lazy_glGenVertexArraysAPPLE(GLsizei n, GLuint * arrays) {if (GLeeInit()) glGenVertexArraysAPPLE(n, arrays);} - GLEEPFNGLGENVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glGenVertexArraysAPPLE=GLee_Lazy_glGenVertexArraysAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glIsVertexArrayAPPLE -#define GLEE_C_DEFINED_glIsVertexArrayAPPLE - GLboolean __stdcall GLee_Lazy_glIsVertexArrayAPPLE(GLuint array) {if (GLeeInit()) return glIsVertexArrayAPPLE(array); return (GLboolean)0;} - GLEEPFNGLISVERTEXARRAYAPPLEPROC GLeeFuncPtr_glIsVertexArrayAPPLE=GLee_Lazy_glIsVertexArrayAPPLE; -#endif -#endif - -/* GL_APPLE_vertex_array_range */ - -#ifdef __GLEE_GL_APPLE_vertex_array_range -#ifndef GLEE_C_DEFINED_glVertexArrayRangeAPPLE -#define GLEE_C_DEFINED_glVertexArrayRangeAPPLE - void __stdcall GLee_Lazy_glVertexArrayRangeAPPLE(GLsizei length, GLvoid * pointer) {if (GLeeInit()) glVertexArrayRangeAPPLE(length, pointer);} - GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glVertexArrayRangeAPPLE=GLee_Lazy_glVertexArrayRangeAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glFlushVertexArrayRangeAPPLE -#define GLEE_C_DEFINED_glFlushVertexArrayRangeAPPLE - void __stdcall GLee_Lazy_glFlushVertexArrayRangeAPPLE(GLsizei length, GLvoid * pointer) {if (GLeeInit()) glFlushVertexArrayRangeAPPLE(length, pointer);} - GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glFlushVertexArrayRangeAPPLE=GLee_Lazy_glFlushVertexArrayRangeAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glVertexArrayParameteriAPPLE -#define GLEE_C_DEFINED_glVertexArrayParameteriAPPLE - void __stdcall GLee_Lazy_glVertexArrayParameteriAPPLE(GLenum pname, GLint param) {if (GLeeInit()) glVertexArrayParameteriAPPLE(pname, param);} - GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC GLeeFuncPtr_glVertexArrayParameteriAPPLE=GLee_Lazy_glVertexArrayParameteriAPPLE; -#endif -#endif - -/* GL_APPLE_ycbcr_422 */ - -#ifdef __GLEE_GL_APPLE_ycbcr_422 -#endif - -/* GL_S3_s3tc */ - -#ifdef __GLEE_GL_S3_s3tc -#endif - -/* GL_ATI_draw_buffers */ - -#ifdef __GLEE_GL_ATI_draw_buffers -#ifndef GLEE_C_DEFINED_glDrawBuffersATI -#define GLEE_C_DEFINED_glDrawBuffersATI - void __stdcall GLee_Lazy_glDrawBuffersATI(GLsizei n, const GLenum * bufs) {if (GLeeInit()) glDrawBuffersATI(n, bufs);} - GLEEPFNGLDRAWBUFFERSATIPROC GLeeFuncPtr_glDrawBuffersATI=GLee_Lazy_glDrawBuffersATI; -#endif -#endif - -/* GL_ATI_pixel_format_float */ - -#ifdef __GLEE_GL_ATI_pixel_format_float -#endif - -/* GL_ATI_texture_env_combine3 */ - -#ifdef __GLEE_GL_ATI_texture_env_combine3 -#endif - -/* GL_ATI_texture_float */ - -#ifdef __GLEE_GL_ATI_texture_float -#endif - -/* GL_NV_float_buffer */ - -#ifdef __GLEE_GL_NV_float_buffer -#endif - -/* GL_NV_fragment_program */ - -#ifdef __GLEE_GL_NV_fragment_program -#ifndef GLEE_C_DEFINED_glProgramNamedParameter4fNV -#define GLEE_C_DEFINED_glProgramNamedParameter4fNV - void __stdcall GLee_Lazy_glProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramNamedParameter4fNV(id, len, name, x, y, z, w);} - GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLeeFuncPtr_glProgramNamedParameter4fNV=GLee_Lazy_glProgramNamedParameter4fNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramNamedParameter4dNV -#define GLEE_C_DEFINED_glProgramNamedParameter4dNV - void __stdcall GLee_Lazy_glProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramNamedParameter4dNV(id, len, name, x, y, z, w);} - GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLeeFuncPtr_glProgramNamedParameter4dNV=GLee_Lazy_glProgramNamedParameter4dNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramNamedParameter4fvNV -#define GLEE_C_DEFINED_glProgramNamedParameter4fvNV - void __stdcall GLee_Lazy_glProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v) {if (GLeeInit()) glProgramNamedParameter4fvNV(id, len, name, v);} - GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLeeFuncPtr_glProgramNamedParameter4fvNV=GLee_Lazy_glProgramNamedParameter4fvNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramNamedParameter4dvNV -#define GLEE_C_DEFINED_glProgramNamedParameter4dvNV - void __stdcall GLee_Lazy_glProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v) {if (GLeeInit()) glProgramNamedParameter4dvNV(id, len, name, v);} - GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLeeFuncPtr_glProgramNamedParameter4dvNV=GLee_Lazy_glProgramNamedParameter4dvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramNamedParameterfvNV -#define GLEE_C_DEFINED_glGetProgramNamedParameterfvNV - void __stdcall GLee_Lazy_glGetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params) {if (GLeeInit()) glGetProgramNamedParameterfvNV(id, len, name, params);} - GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramNamedParameterfvNV=GLee_Lazy_glGetProgramNamedParameterfvNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramNamedParameterdvNV -#define GLEE_C_DEFINED_glGetProgramNamedParameterdvNV - void __stdcall GLee_Lazy_glGetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params) {if (GLeeInit()) glGetProgramNamedParameterdvNV(id, len, name, params);} - GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramNamedParameterdvNV=GLee_Lazy_glGetProgramNamedParameterdvNV; -#endif -#endif - -/* GL_NV_half_float */ - -#ifdef __GLEE_GL_NV_half_float -#ifndef GLEE_C_DEFINED_glVertex2hNV -#define GLEE_C_DEFINED_glVertex2hNV - void __stdcall GLee_Lazy_glVertex2hNV(GLhalfNV x, GLhalfNV y) {if (GLeeInit()) glVertex2hNV(x, y);} - GLEEPFNGLVERTEX2HNVPROC GLeeFuncPtr_glVertex2hNV=GLee_Lazy_glVertex2hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertex2hvNV -#define GLEE_C_DEFINED_glVertex2hvNV - void __stdcall GLee_Lazy_glVertex2hvNV(const GLhalfNV * v) {if (GLeeInit()) glVertex2hvNV(v);} - GLEEPFNGLVERTEX2HVNVPROC GLeeFuncPtr_glVertex2hvNV=GLee_Lazy_glVertex2hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertex3hNV -#define GLEE_C_DEFINED_glVertex3hNV - void __stdcall GLee_Lazy_glVertex3hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z) {if (GLeeInit()) glVertex3hNV(x, y, z);} - GLEEPFNGLVERTEX3HNVPROC GLeeFuncPtr_glVertex3hNV=GLee_Lazy_glVertex3hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertex3hvNV -#define GLEE_C_DEFINED_glVertex3hvNV - void __stdcall GLee_Lazy_glVertex3hvNV(const GLhalfNV * v) {if (GLeeInit()) glVertex3hvNV(v);} - GLEEPFNGLVERTEX3HVNVPROC GLeeFuncPtr_glVertex3hvNV=GLee_Lazy_glVertex3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertex4hNV -#define GLEE_C_DEFINED_glVertex4hNV - void __stdcall GLee_Lazy_glVertex4hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) {if (GLeeInit()) glVertex4hNV(x, y, z, w);} - GLEEPFNGLVERTEX4HNVPROC GLeeFuncPtr_glVertex4hNV=GLee_Lazy_glVertex4hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertex4hvNV -#define GLEE_C_DEFINED_glVertex4hvNV - void __stdcall GLee_Lazy_glVertex4hvNV(const GLhalfNV * v) {if (GLeeInit()) glVertex4hvNV(v);} - GLEEPFNGLVERTEX4HVNVPROC GLeeFuncPtr_glVertex4hvNV=GLee_Lazy_glVertex4hvNV; -#endif -#ifndef GLEE_C_DEFINED_glNormal3hNV -#define GLEE_C_DEFINED_glNormal3hNV - void __stdcall GLee_Lazy_glNormal3hNV(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz) {if (GLeeInit()) glNormal3hNV(nx, ny, nz);} - GLEEPFNGLNORMAL3HNVPROC GLeeFuncPtr_glNormal3hNV=GLee_Lazy_glNormal3hNV; -#endif -#ifndef GLEE_C_DEFINED_glNormal3hvNV -#define GLEE_C_DEFINED_glNormal3hvNV - void __stdcall GLee_Lazy_glNormal3hvNV(const GLhalfNV * v) {if (GLeeInit()) glNormal3hvNV(v);} - GLEEPFNGLNORMAL3HVNVPROC GLeeFuncPtr_glNormal3hvNV=GLee_Lazy_glNormal3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glColor3hNV -#define GLEE_C_DEFINED_glColor3hNV - void __stdcall GLee_Lazy_glColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) {if (GLeeInit()) glColor3hNV(red, green, blue);} - GLEEPFNGLCOLOR3HNVPROC GLeeFuncPtr_glColor3hNV=GLee_Lazy_glColor3hNV; -#endif -#ifndef GLEE_C_DEFINED_glColor3hvNV -#define GLEE_C_DEFINED_glColor3hvNV - void __stdcall GLee_Lazy_glColor3hvNV(const GLhalfNV * v) {if (GLeeInit()) glColor3hvNV(v);} - GLEEPFNGLCOLOR3HVNVPROC GLeeFuncPtr_glColor3hvNV=GLee_Lazy_glColor3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glColor4hNV -#define GLEE_C_DEFINED_glColor4hNV - void __stdcall GLee_Lazy_glColor4hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha) {if (GLeeInit()) glColor4hNV(red, green, blue, alpha);} - GLEEPFNGLCOLOR4HNVPROC GLeeFuncPtr_glColor4hNV=GLee_Lazy_glColor4hNV; -#endif -#ifndef GLEE_C_DEFINED_glColor4hvNV -#define GLEE_C_DEFINED_glColor4hvNV - void __stdcall GLee_Lazy_glColor4hvNV(const GLhalfNV * v) {if (GLeeInit()) glColor4hvNV(v);} - GLEEPFNGLCOLOR4HVNVPROC GLeeFuncPtr_glColor4hvNV=GLee_Lazy_glColor4hvNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord1hNV -#define GLEE_C_DEFINED_glTexCoord1hNV - void __stdcall GLee_Lazy_glTexCoord1hNV(GLhalfNV s) {if (GLeeInit()) glTexCoord1hNV(s);} - GLEEPFNGLTEXCOORD1HNVPROC GLeeFuncPtr_glTexCoord1hNV=GLee_Lazy_glTexCoord1hNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord1hvNV -#define GLEE_C_DEFINED_glTexCoord1hvNV - void __stdcall GLee_Lazy_glTexCoord1hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord1hvNV(v);} - GLEEPFNGLTEXCOORD1HVNVPROC GLeeFuncPtr_glTexCoord1hvNV=GLee_Lazy_glTexCoord1hvNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2hNV -#define GLEE_C_DEFINED_glTexCoord2hNV - void __stdcall GLee_Lazy_glTexCoord2hNV(GLhalfNV s, GLhalfNV t) {if (GLeeInit()) glTexCoord2hNV(s, t);} - GLEEPFNGLTEXCOORD2HNVPROC GLeeFuncPtr_glTexCoord2hNV=GLee_Lazy_glTexCoord2hNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord2hvNV -#define GLEE_C_DEFINED_glTexCoord2hvNV - void __stdcall GLee_Lazy_glTexCoord2hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord2hvNV(v);} - GLEEPFNGLTEXCOORD2HVNVPROC GLeeFuncPtr_glTexCoord2hvNV=GLee_Lazy_glTexCoord2hvNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord3hNV -#define GLEE_C_DEFINED_glTexCoord3hNV - void __stdcall GLee_Lazy_glTexCoord3hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r) {if (GLeeInit()) glTexCoord3hNV(s, t, r);} - GLEEPFNGLTEXCOORD3HNVPROC GLeeFuncPtr_glTexCoord3hNV=GLee_Lazy_glTexCoord3hNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord3hvNV -#define GLEE_C_DEFINED_glTexCoord3hvNV - void __stdcall GLee_Lazy_glTexCoord3hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord3hvNV(v);} - GLEEPFNGLTEXCOORD3HVNVPROC GLeeFuncPtr_glTexCoord3hvNV=GLee_Lazy_glTexCoord3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord4hNV -#define GLEE_C_DEFINED_glTexCoord4hNV - void __stdcall GLee_Lazy_glTexCoord4hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) {if (GLeeInit()) glTexCoord4hNV(s, t, r, q);} - GLEEPFNGLTEXCOORD4HNVPROC GLeeFuncPtr_glTexCoord4hNV=GLee_Lazy_glTexCoord4hNV; -#endif -#ifndef GLEE_C_DEFINED_glTexCoord4hvNV -#define GLEE_C_DEFINED_glTexCoord4hvNV - void __stdcall GLee_Lazy_glTexCoord4hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord4hvNV(v);} - GLEEPFNGLTEXCOORD4HVNVPROC GLeeFuncPtr_glTexCoord4hvNV=GLee_Lazy_glTexCoord4hvNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1hNV -#define GLEE_C_DEFINED_glMultiTexCoord1hNV - void __stdcall GLee_Lazy_glMultiTexCoord1hNV(GLenum target, GLhalfNV s) {if (GLeeInit()) glMultiTexCoord1hNV(target, s);} - GLEEPFNGLMULTITEXCOORD1HNVPROC GLeeFuncPtr_glMultiTexCoord1hNV=GLee_Lazy_glMultiTexCoord1hNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord1hvNV -#define GLEE_C_DEFINED_glMultiTexCoord1hvNV - void __stdcall GLee_Lazy_glMultiTexCoord1hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord1hvNV(target, v);} - GLEEPFNGLMULTITEXCOORD1HVNVPROC GLeeFuncPtr_glMultiTexCoord1hvNV=GLee_Lazy_glMultiTexCoord1hvNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2hNV -#define GLEE_C_DEFINED_glMultiTexCoord2hNV - void __stdcall GLee_Lazy_glMultiTexCoord2hNV(GLenum target, GLhalfNV s, GLhalfNV t) {if (GLeeInit()) glMultiTexCoord2hNV(target, s, t);} - GLEEPFNGLMULTITEXCOORD2HNVPROC GLeeFuncPtr_glMultiTexCoord2hNV=GLee_Lazy_glMultiTexCoord2hNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord2hvNV -#define GLEE_C_DEFINED_glMultiTexCoord2hvNV - void __stdcall GLee_Lazy_glMultiTexCoord2hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord2hvNV(target, v);} - GLEEPFNGLMULTITEXCOORD2HVNVPROC GLeeFuncPtr_glMultiTexCoord2hvNV=GLee_Lazy_glMultiTexCoord2hvNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3hNV -#define GLEE_C_DEFINED_glMultiTexCoord3hNV - void __stdcall GLee_Lazy_glMultiTexCoord3hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r) {if (GLeeInit()) glMultiTexCoord3hNV(target, s, t, r);} - GLEEPFNGLMULTITEXCOORD3HNVPROC GLeeFuncPtr_glMultiTexCoord3hNV=GLee_Lazy_glMultiTexCoord3hNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord3hvNV -#define GLEE_C_DEFINED_glMultiTexCoord3hvNV - void __stdcall GLee_Lazy_glMultiTexCoord3hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord3hvNV(target, v);} - GLEEPFNGLMULTITEXCOORD3HVNVPROC GLeeFuncPtr_glMultiTexCoord3hvNV=GLee_Lazy_glMultiTexCoord3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4hNV -#define GLEE_C_DEFINED_glMultiTexCoord4hNV - void __stdcall GLee_Lazy_glMultiTexCoord4hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) {if (GLeeInit()) glMultiTexCoord4hNV(target, s, t, r, q);} - GLEEPFNGLMULTITEXCOORD4HNVPROC GLeeFuncPtr_glMultiTexCoord4hNV=GLee_Lazy_glMultiTexCoord4hNV; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoord4hvNV -#define GLEE_C_DEFINED_glMultiTexCoord4hvNV - void __stdcall GLee_Lazy_glMultiTexCoord4hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord4hvNV(target, v);} - GLEEPFNGLMULTITEXCOORD4HVNVPROC GLeeFuncPtr_glMultiTexCoord4hvNV=GLee_Lazy_glMultiTexCoord4hvNV; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordhNV -#define GLEE_C_DEFINED_glFogCoordhNV - void __stdcall GLee_Lazy_glFogCoordhNV(GLhalfNV fog) {if (GLeeInit()) glFogCoordhNV(fog);} - GLEEPFNGLFOGCOORDHNVPROC GLeeFuncPtr_glFogCoordhNV=GLee_Lazy_glFogCoordhNV; -#endif -#ifndef GLEE_C_DEFINED_glFogCoordhvNV -#define GLEE_C_DEFINED_glFogCoordhvNV - void __stdcall GLee_Lazy_glFogCoordhvNV(const GLhalfNV * fog) {if (GLeeInit()) glFogCoordhvNV(fog);} - GLEEPFNGLFOGCOORDHVNVPROC GLeeFuncPtr_glFogCoordhvNV=GLee_Lazy_glFogCoordhvNV; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3hNV -#define GLEE_C_DEFINED_glSecondaryColor3hNV - void __stdcall GLee_Lazy_glSecondaryColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) {if (GLeeInit()) glSecondaryColor3hNV(red, green, blue);} - GLEEPFNGLSECONDARYCOLOR3HNVPROC GLeeFuncPtr_glSecondaryColor3hNV=GLee_Lazy_glSecondaryColor3hNV; -#endif -#ifndef GLEE_C_DEFINED_glSecondaryColor3hvNV -#define GLEE_C_DEFINED_glSecondaryColor3hvNV - void __stdcall GLee_Lazy_glSecondaryColor3hvNV(const GLhalfNV * v) {if (GLeeInit()) glSecondaryColor3hvNV(v);} - GLEEPFNGLSECONDARYCOLOR3HVNVPROC GLeeFuncPtr_glSecondaryColor3hvNV=GLee_Lazy_glSecondaryColor3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexWeighthNV -#define GLEE_C_DEFINED_glVertexWeighthNV - void __stdcall GLee_Lazy_glVertexWeighthNV(GLhalfNV weight) {if (GLeeInit()) glVertexWeighthNV(weight);} - GLEEPFNGLVERTEXWEIGHTHNVPROC GLeeFuncPtr_glVertexWeighthNV=GLee_Lazy_glVertexWeighthNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexWeighthvNV -#define GLEE_C_DEFINED_glVertexWeighthvNV - void __stdcall GLee_Lazy_glVertexWeighthvNV(const GLhalfNV * weight) {if (GLeeInit()) glVertexWeighthvNV(weight);} - GLEEPFNGLVERTEXWEIGHTHVNVPROC GLeeFuncPtr_glVertexWeighthvNV=GLee_Lazy_glVertexWeighthvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1hNV -#define GLEE_C_DEFINED_glVertexAttrib1hNV - void __stdcall GLee_Lazy_glVertexAttrib1hNV(GLuint index, GLhalfNV x) {if (GLeeInit()) glVertexAttrib1hNV(index, x);} - GLEEPFNGLVERTEXATTRIB1HNVPROC GLeeFuncPtr_glVertexAttrib1hNV=GLee_Lazy_glVertexAttrib1hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib1hvNV -#define GLEE_C_DEFINED_glVertexAttrib1hvNV - void __stdcall GLee_Lazy_glVertexAttrib1hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib1hvNV(index, v);} - GLEEPFNGLVERTEXATTRIB1HVNVPROC GLeeFuncPtr_glVertexAttrib1hvNV=GLee_Lazy_glVertexAttrib1hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2hNV -#define GLEE_C_DEFINED_glVertexAttrib2hNV - void __stdcall GLee_Lazy_glVertexAttrib2hNV(GLuint index, GLhalfNV x, GLhalfNV y) {if (GLeeInit()) glVertexAttrib2hNV(index, x, y);} - GLEEPFNGLVERTEXATTRIB2HNVPROC GLeeFuncPtr_glVertexAttrib2hNV=GLee_Lazy_glVertexAttrib2hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib2hvNV -#define GLEE_C_DEFINED_glVertexAttrib2hvNV - void __stdcall GLee_Lazy_glVertexAttrib2hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib2hvNV(index, v);} - GLEEPFNGLVERTEXATTRIB2HVNVPROC GLeeFuncPtr_glVertexAttrib2hvNV=GLee_Lazy_glVertexAttrib2hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3hNV -#define GLEE_C_DEFINED_glVertexAttrib3hNV - void __stdcall GLee_Lazy_glVertexAttrib3hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z) {if (GLeeInit()) glVertexAttrib3hNV(index, x, y, z);} - GLEEPFNGLVERTEXATTRIB3HNVPROC GLeeFuncPtr_glVertexAttrib3hNV=GLee_Lazy_glVertexAttrib3hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib3hvNV -#define GLEE_C_DEFINED_glVertexAttrib3hvNV - void __stdcall GLee_Lazy_glVertexAttrib3hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib3hvNV(index, v);} - GLEEPFNGLVERTEXATTRIB3HVNVPROC GLeeFuncPtr_glVertexAttrib3hvNV=GLee_Lazy_glVertexAttrib3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4hNV -#define GLEE_C_DEFINED_glVertexAttrib4hNV - void __stdcall GLee_Lazy_glVertexAttrib4hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) {if (GLeeInit()) glVertexAttrib4hNV(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIB4HNVPROC GLeeFuncPtr_glVertexAttrib4hNV=GLee_Lazy_glVertexAttrib4hNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttrib4hvNV -#define GLEE_C_DEFINED_glVertexAttrib4hvNV - void __stdcall GLee_Lazy_glVertexAttrib4hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib4hvNV(index, v);} - GLEEPFNGLVERTEXATTRIB4HVNVPROC GLeeFuncPtr_glVertexAttrib4hvNV=GLee_Lazy_glVertexAttrib4hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs1hvNV -#define GLEE_C_DEFINED_glVertexAttribs1hvNV - void __stdcall GLee_Lazy_glVertexAttribs1hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs1hvNV(index, n, v);} - GLEEPFNGLVERTEXATTRIBS1HVNVPROC GLeeFuncPtr_glVertexAttribs1hvNV=GLee_Lazy_glVertexAttribs1hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs2hvNV -#define GLEE_C_DEFINED_glVertexAttribs2hvNV - void __stdcall GLee_Lazy_glVertexAttribs2hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs2hvNV(index, n, v);} - GLEEPFNGLVERTEXATTRIBS2HVNVPROC GLeeFuncPtr_glVertexAttribs2hvNV=GLee_Lazy_glVertexAttribs2hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs3hvNV -#define GLEE_C_DEFINED_glVertexAttribs3hvNV - void __stdcall GLee_Lazy_glVertexAttribs3hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs3hvNV(index, n, v);} - GLEEPFNGLVERTEXATTRIBS3HVNVPROC GLeeFuncPtr_glVertexAttribs3hvNV=GLee_Lazy_glVertexAttribs3hvNV; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribs4hvNV -#define GLEE_C_DEFINED_glVertexAttribs4hvNV - void __stdcall GLee_Lazy_glVertexAttribs4hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs4hvNV(index, n, v);} - GLEEPFNGLVERTEXATTRIBS4HVNVPROC GLeeFuncPtr_glVertexAttribs4hvNV=GLee_Lazy_glVertexAttribs4hvNV; -#endif -#endif - -/* GL_NV_pixel_data_range */ - -#ifdef __GLEE_GL_NV_pixel_data_range -#ifndef GLEE_C_DEFINED_glPixelDataRangeNV -#define GLEE_C_DEFINED_glPixelDataRangeNV - void __stdcall GLee_Lazy_glPixelDataRangeNV(GLenum target, GLsizei length, GLvoid * pointer) {if (GLeeInit()) glPixelDataRangeNV(target, length, pointer);} - GLEEPFNGLPIXELDATARANGENVPROC GLeeFuncPtr_glPixelDataRangeNV=GLee_Lazy_glPixelDataRangeNV; -#endif -#ifndef GLEE_C_DEFINED_glFlushPixelDataRangeNV -#define GLEE_C_DEFINED_glFlushPixelDataRangeNV - void __stdcall GLee_Lazy_glFlushPixelDataRangeNV(GLenum target) {if (GLeeInit()) glFlushPixelDataRangeNV(target);} - GLEEPFNGLFLUSHPIXELDATARANGENVPROC GLeeFuncPtr_glFlushPixelDataRangeNV=GLee_Lazy_glFlushPixelDataRangeNV; -#endif -#endif - -/* GL_NV_primitive_restart */ - -#ifdef __GLEE_GL_NV_primitive_restart -#ifndef GLEE_C_DEFINED_glPrimitiveRestartNV -#define GLEE_C_DEFINED_glPrimitiveRestartNV - void __stdcall GLee_Lazy_glPrimitiveRestartNV(void) {if (GLeeInit()) glPrimitiveRestartNV();} - GLEEPFNGLPRIMITIVERESTARTNVPROC GLeeFuncPtr_glPrimitiveRestartNV=GLee_Lazy_glPrimitiveRestartNV; -#endif -#ifndef GLEE_C_DEFINED_glPrimitiveRestartIndexNV -#define GLEE_C_DEFINED_glPrimitiveRestartIndexNV - void __stdcall GLee_Lazy_glPrimitiveRestartIndexNV(GLuint index) {if (GLeeInit()) glPrimitiveRestartIndexNV(index);} - GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC GLeeFuncPtr_glPrimitiveRestartIndexNV=GLee_Lazy_glPrimitiveRestartIndexNV; -#endif -#endif - -/* GL_NV_texture_expand_normal */ - -#ifdef __GLEE_GL_NV_texture_expand_normal -#endif - -/* GL_NV_vertex_program2 */ - -#ifdef __GLEE_GL_NV_vertex_program2 -#endif - -/* GL_ATI_map_object_buffer */ - -#ifdef __GLEE_GL_ATI_map_object_buffer -#ifndef GLEE_C_DEFINED_glMapObjectBufferATI -#define GLEE_C_DEFINED_glMapObjectBufferATI - GLvoid* __stdcall GLee_Lazy_glMapObjectBufferATI(GLuint buffer) {if (GLeeInit()) return glMapObjectBufferATI(buffer); return (GLvoid*)0;} - GLEEPFNGLMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glMapObjectBufferATI=GLee_Lazy_glMapObjectBufferATI; -#endif -#ifndef GLEE_C_DEFINED_glUnmapObjectBufferATI -#define GLEE_C_DEFINED_glUnmapObjectBufferATI - void __stdcall GLee_Lazy_glUnmapObjectBufferATI(GLuint buffer) {if (GLeeInit()) glUnmapObjectBufferATI(buffer);} - GLEEPFNGLUNMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glUnmapObjectBufferATI=GLee_Lazy_glUnmapObjectBufferATI; -#endif -#endif - -/* GL_ATI_separate_stencil */ - -#ifdef __GLEE_GL_ATI_separate_stencil -#ifndef GLEE_C_DEFINED_glStencilOpSeparateATI -#define GLEE_C_DEFINED_glStencilOpSeparateATI - void __stdcall GLee_Lazy_glStencilOpSeparateATI(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) {if (GLeeInit()) glStencilOpSeparateATI(face, sfail, dpfail, dppass);} - GLEEPFNGLSTENCILOPSEPARATEATIPROC GLeeFuncPtr_glStencilOpSeparateATI=GLee_Lazy_glStencilOpSeparateATI; -#endif -#ifndef GLEE_C_DEFINED_glStencilFuncSeparateATI -#define GLEE_C_DEFINED_glStencilFuncSeparateATI - void __stdcall GLee_Lazy_glStencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) {if (GLeeInit()) glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);} - GLEEPFNGLSTENCILFUNCSEPARATEATIPROC GLeeFuncPtr_glStencilFuncSeparateATI=GLee_Lazy_glStencilFuncSeparateATI; -#endif -#endif - -/* GL_ATI_vertex_attrib_array_object */ - -#ifdef __GLEE_GL_ATI_vertex_attrib_array_object -#ifndef GLEE_C_DEFINED_glVertexAttribArrayObjectATI -#define GLEE_C_DEFINED_glVertexAttribArrayObjectATI - void __stdcall GLee_Lazy_glVertexAttribArrayObjectATI(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset) {if (GLeeInit()) glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset);} - GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC GLeeFuncPtr_glVertexAttribArrayObjectATI=GLee_Lazy_glVertexAttribArrayObjectATI; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribArrayObjectfvATI -#define GLEE_C_DEFINED_glGetVertexAttribArrayObjectfvATI - void __stdcall GLee_Lazy_glGetVertexAttribArrayObjectfvATI(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribArrayObjectfvATI(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI=GLee_Lazy_glGetVertexAttribArrayObjectfvATI; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribArrayObjectivATI -#define GLEE_C_DEFINED_glGetVertexAttribArrayObjectivATI - void __stdcall GLee_Lazy_glGetVertexAttribArrayObjectivATI(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribArrayObjectivATI(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectivATI=GLee_Lazy_glGetVertexAttribArrayObjectivATI; -#endif -#endif - -/* GL_OES_read_format */ - -#ifdef __GLEE_GL_OES_read_format -#endif - -/* GL_EXT_depth_bounds_test */ - -#ifdef __GLEE_GL_EXT_depth_bounds_test -#ifndef GLEE_C_DEFINED_glDepthBoundsEXT -#define GLEE_C_DEFINED_glDepthBoundsEXT - void __stdcall GLee_Lazy_glDepthBoundsEXT(GLclampd zmin, GLclampd zmax) {if (GLeeInit()) glDepthBoundsEXT(zmin, zmax);} - GLEEPFNGLDEPTHBOUNDSEXTPROC GLeeFuncPtr_glDepthBoundsEXT=GLee_Lazy_glDepthBoundsEXT; -#endif -#endif - -/* GL_EXT_texture_mirror_clamp */ - -#ifdef __GLEE_GL_EXT_texture_mirror_clamp -#endif - -/* GL_EXT_blend_equation_separate */ - -#ifdef __GLEE_GL_EXT_blend_equation_separate -#ifndef GLEE_C_DEFINED_glBlendEquationSeparateEXT -#define GLEE_C_DEFINED_glBlendEquationSeparateEXT - void __stdcall GLee_Lazy_glBlendEquationSeparateEXT(GLenum modeRGB, GLenum modeAlpha) {if (GLeeInit()) glBlendEquationSeparateEXT(modeRGB, modeAlpha);} - GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC GLeeFuncPtr_glBlendEquationSeparateEXT=GLee_Lazy_glBlendEquationSeparateEXT; -#endif -#endif - -/* GL_MESA_pack_invert */ - -#ifdef __GLEE_GL_MESA_pack_invert -#endif - -/* GL_MESA_ycbcr_texture */ - -#ifdef __GLEE_GL_MESA_ycbcr_texture -#endif - -/* GL_EXT_pixel_buffer_object */ - -#ifdef __GLEE_GL_EXT_pixel_buffer_object -#endif - -/* GL_NV_fragment_program_option */ - -#ifdef __GLEE_GL_NV_fragment_program_option -#endif - -/* GL_NV_fragment_program2 */ - -#ifdef __GLEE_GL_NV_fragment_program2 -#endif - -/* GL_NV_vertex_program2_option */ - -#ifdef __GLEE_GL_NV_vertex_program2_option -#endif - -/* GL_NV_vertex_program3 */ - -#ifdef __GLEE_GL_NV_vertex_program3 -#endif - -/* GL_EXT_framebuffer_object */ - -#ifdef __GLEE_GL_EXT_framebuffer_object -#ifndef GLEE_C_DEFINED_glIsRenderbufferEXT -#define GLEE_C_DEFINED_glIsRenderbufferEXT - GLboolean __stdcall GLee_Lazy_glIsRenderbufferEXT(GLuint renderbuffer) {if (GLeeInit()) return glIsRenderbufferEXT(renderbuffer); return (GLboolean)0;} - GLEEPFNGLISRENDERBUFFEREXTPROC GLeeFuncPtr_glIsRenderbufferEXT=GLee_Lazy_glIsRenderbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindRenderbufferEXT -#define GLEE_C_DEFINED_glBindRenderbufferEXT - void __stdcall GLee_Lazy_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) {if (GLeeInit()) glBindRenderbufferEXT(target, renderbuffer);} - GLEEPFNGLBINDRENDERBUFFEREXTPROC GLeeFuncPtr_glBindRenderbufferEXT=GLee_Lazy_glBindRenderbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glDeleteRenderbuffersEXT -#define GLEE_C_DEFINED_glDeleteRenderbuffersEXT - void __stdcall GLee_Lazy_glDeleteRenderbuffersEXT(GLsizei n, const GLuint * renderbuffers) {if (GLeeInit()) glDeleteRenderbuffersEXT(n, renderbuffers);} - GLEEPFNGLDELETERENDERBUFFERSEXTPROC GLeeFuncPtr_glDeleteRenderbuffersEXT=GLee_Lazy_glDeleteRenderbuffersEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenRenderbuffersEXT -#define GLEE_C_DEFINED_glGenRenderbuffersEXT - void __stdcall GLee_Lazy_glGenRenderbuffersEXT(GLsizei n, GLuint * renderbuffers) {if (GLeeInit()) glGenRenderbuffersEXT(n, renderbuffers);} - GLEEPFNGLGENRENDERBUFFERSEXTPROC GLeeFuncPtr_glGenRenderbuffersEXT=GLee_Lazy_glGenRenderbuffersEXT; -#endif -#ifndef GLEE_C_DEFINED_glRenderbufferStorageEXT -#define GLEE_C_DEFINED_glRenderbufferStorageEXT - void __stdcall GLee_Lazy_glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageEXT(target, internalformat, width, height);} - GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glRenderbufferStorageEXT=GLee_Lazy_glRenderbufferStorageEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetRenderbufferParameterivEXT -#define GLEE_C_DEFINED_glGetRenderbufferParameterivEXT - void __stdcall GLee_Lazy_glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetRenderbufferParameterivEXT(target, pname, params);} - GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetRenderbufferParameterivEXT=GLee_Lazy_glGetRenderbufferParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glIsFramebufferEXT -#define GLEE_C_DEFINED_glIsFramebufferEXT - GLboolean __stdcall GLee_Lazy_glIsFramebufferEXT(GLuint framebuffer) {if (GLeeInit()) return glIsFramebufferEXT(framebuffer); return (GLboolean)0;} - GLEEPFNGLISFRAMEBUFFEREXTPROC GLeeFuncPtr_glIsFramebufferEXT=GLee_Lazy_glIsFramebufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindFramebufferEXT -#define GLEE_C_DEFINED_glBindFramebufferEXT - void __stdcall GLee_Lazy_glBindFramebufferEXT(GLenum target, GLuint framebuffer) {if (GLeeInit()) glBindFramebufferEXT(target, framebuffer);} - GLEEPFNGLBINDFRAMEBUFFEREXTPROC GLeeFuncPtr_glBindFramebufferEXT=GLee_Lazy_glBindFramebufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glDeleteFramebuffersEXT -#define GLEE_C_DEFINED_glDeleteFramebuffersEXT - void __stdcall GLee_Lazy_glDeleteFramebuffersEXT(GLsizei n, const GLuint * framebuffers) {if (GLeeInit()) glDeleteFramebuffersEXT(n, framebuffers);} - GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC GLeeFuncPtr_glDeleteFramebuffersEXT=GLee_Lazy_glDeleteFramebuffersEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenFramebuffersEXT -#define GLEE_C_DEFINED_glGenFramebuffersEXT - void __stdcall GLee_Lazy_glGenFramebuffersEXT(GLsizei n, GLuint * framebuffers) {if (GLeeInit()) glGenFramebuffersEXT(n, framebuffers);} - GLEEPFNGLGENFRAMEBUFFERSEXTPROC GLeeFuncPtr_glGenFramebuffersEXT=GLee_Lazy_glGenFramebuffersEXT; -#endif -#ifndef GLEE_C_DEFINED_glCheckFramebufferStatusEXT -#define GLEE_C_DEFINED_glCheckFramebufferStatusEXT - GLenum __stdcall GLee_Lazy_glCheckFramebufferStatusEXT(GLenum target) {if (GLeeInit()) return glCheckFramebufferStatusEXT(target); return (GLenum)0;} - GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckFramebufferStatusEXT=GLee_Lazy_glCheckFramebufferStatusEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTexture1DEXT -#define GLEE_C_DEFINED_glFramebufferTexture1DEXT - void __stdcall GLee_Lazy_glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture1DEXT(target, attachment, textarget, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glFramebufferTexture1DEXT=GLee_Lazy_glFramebufferTexture1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTexture2DEXT -#define GLEE_C_DEFINED_glFramebufferTexture2DEXT - void __stdcall GLee_Lazy_glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glFramebufferTexture2DEXT=GLee_Lazy_glFramebufferTexture2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTexture3DEXT -#define GLEE_C_DEFINED_glFramebufferTexture3DEXT - void __stdcall GLee_Lazy_glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {if (GLeeInit()) glFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);} - GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glFramebufferTexture3DEXT=GLee_Lazy_glFramebufferTexture3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferRenderbufferEXT -#define GLEE_C_DEFINED_glFramebufferRenderbufferEXT - void __stdcall GLee_Lazy_glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {if (GLeeInit()) glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);} - GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glFramebufferRenderbufferEXT=GLee_Lazy_glFramebufferRenderbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFramebufferAttachmentParameterivEXT -#define GLEE_C_DEFINED_glGetFramebufferAttachmentParameterivEXT - void __stdcall GLee_Lazy_glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint * params) {if (GLeeInit()) glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);} - GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT=GLee_Lazy_glGetFramebufferAttachmentParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenerateMipmapEXT -#define GLEE_C_DEFINED_glGenerateMipmapEXT - void __stdcall GLee_Lazy_glGenerateMipmapEXT(GLenum target) {if (GLeeInit()) glGenerateMipmapEXT(target);} - GLEEPFNGLGENERATEMIPMAPEXTPROC GLeeFuncPtr_glGenerateMipmapEXT=GLee_Lazy_glGenerateMipmapEXT; -#endif -#endif - -/* GL_GREMEDY_string_marker */ - -#ifdef __GLEE_GL_GREMEDY_string_marker -#ifndef GLEE_C_DEFINED_glStringMarkerGREMEDY -#define GLEE_C_DEFINED_glStringMarkerGREMEDY - void __stdcall GLee_Lazy_glStringMarkerGREMEDY(GLsizei len, const GLvoid * string) {if (GLeeInit()) glStringMarkerGREMEDY(len, string);} - GLEEPFNGLSTRINGMARKERGREMEDYPROC GLeeFuncPtr_glStringMarkerGREMEDY=GLee_Lazy_glStringMarkerGREMEDY; -#endif -#endif - -/* GL_EXT_packed_depth_stencil */ - -#ifdef __GLEE_GL_EXT_packed_depth_stencil -#endif - -/* GL_EXT_stencil_clear_tag */ - -#ifdef __GLEE_GL_EXT_stencil_clear_tag -#ifndef GLEE_C_DEFINED_glStencilClearTagEXT -#define GLEE_C_DEFINED_glStencilClearTagEXT - void __stdcall GLee_Lazy_glStencilClearTagEXT(GLsizei stencilTagBits, GLuint stencilClearTag) {if (GLeeInit()) glStencilClearTagEXT(stencilTagBits, stencilClearTag);} - GLEEPFNGLSTENCILCLEARTAGEXTPROC GLeeFuncPtr_glStencilClearTagEXT=GLee_Lazy_glStencilClearTagEXT; -#endif -#endif - -/* GL_EXT_texture_sRGB */ - -#ifdef __GLEE_GL_EXT_texture_sRGB -#endif - -/* GL_EXT_framebuffer_blit */ - -#ifdef __GLEE_GL_EXT_framebuffer_blit -#ifndef GLEE_C_DEFINED_glBlitFramebufferEXT -#define GLEE_C_DEFINED_glBlitFramebufferEXT - void __stdcall GLee_Lazy_glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {if (GLeeInit()) glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);} - GLEEPFNGLBLITFRAMEBUFFEREXTPROC GLeeFuncPtr_glBlitFramebufferEXT=GLee_Lazy_glBlitFramebufferEXT; -#endif -#endif - -/* GL_EXT_framebuffer_multisample */ - -#ifdef __GLEE_GL_EXT_framebuffer_multisample -#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisampleEXT -#define GLEE_C_DEFINED_glRenderbufferStorageMultisampleEXT - void __stdcall GLee_Lazy_glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);} - GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glRenderbufferStorageMultisampleEXT=GLee_Lazy_glRenderbufferStorageMultisampleEXT; -#endif -#endif - -/* GL_MESAX_texture_stack */ - -#ifdef __GLEE_GL_MESAX_texture_stack -#endif - -/* GL_EXT_timer_query */ - -#ifdef __GLEE_GL_EXT_timer_query -#ifndef GLEE_C_DEFINED_glGetQueryObjecti64vEXT -#define GLEE_C_DEFINED_glGetQueryObjecti64vEXT - void __stdcall GLee_Lazy_glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64EXT * params) {if (GLeeInit()) glGetQueryObjecti64vEXT(id, pname, params);} - GLEEPFNGLGETQUERYOBJECTI64VEXTPROC GLeeFuncPtr_glGetQueryObjecti64vEXT=GLee_Lazy_glGetQueryObjecti64vEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetQueryObjectui64vEXT -#define GLEE_C_DEFINED_glGetQueryObjectui64vEXT - void __stdcall GLee_Lazy_glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64EXT * params) {if (GLeeInit()) glGetQueryObjectui64vEXT(id, pname, params);} - GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC GLeeFuncPtr_glGetQueryObjectui64vEXT=GLee_Lazy_glGetQueryObjectui64vEXT; -#endif -#endif - -/* GL_EXT_gpu_program_parameters */ - -#ifdef __GLEE_GL_EXT_gpu_program_parameters -#ifndef GLEE_C_DEFINED_glProgramEnvParameters4fvEXT -#define GLEE_C_DEFINED_glProgramEnvParameters4fvEXT - void __stdcall GLee_Lazy_glProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glProgramEnvParameters4fvEXT(target, index, count, params);} - GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramEnvParameters4fvEXT=GLee_Lazy_glProgramEnvParameters4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameters4fvEXT -#define GLEE_C_DEFINED_glProgramLocalParameters4fvEXT - void __stdcall GLee_Lazy_glProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glProgramLocalParameters4fvEXT(target, index, count, params);} - GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramLocalParameters4fvEXT=GLee_Lazy_glProgramLocalParameters4fvEXT; -#endif -#endif - -/* GL_APPLE_flush_buffer_range */ - -#ifdef __GLEE_GL_APPLE_flush_buffer_range -#ifndef GLEE_C_DEFINED_glBufferParameteriAPPLE -#define GLEE_C_DEFINED_glBufferParameteriAPPLE - void __stdcall GLee_Lazy_glBufferParameteriAPPLE(GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glBufferParameteriAPPLE(target, pname, param);} - GLEEPFNGLBUFFERPARAMETERIAPPLEPROC GLeeFuncPtr_glBufferParameteriAPPLE=GLee_Lazy_glBufferParameteriAPPLE; -#endif -#ifndef GLEE_C_DEFINED_glFlushMappedBufferRangeAPPLE -#define GLEE_C_DEFINED_glFlushMappedBufferRangeAPPLE - void __stdcall GLee_Lazy_glFlushMappedBufferRangeAPPLE(GLenum target, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glFlushMappedBufferRangeAPPLE(target, offset, size);} - GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC GLeeFuncPtr_glFlushMappedBufferRangeAPPLE=GLee_Lazy_glFlushMappedBufferRangeAPPLE; -#endif -#endif - -/* GL_EXT_gpu_shader4 */ - -#ifdef __GLEE_GL_EXT_gpu_shader4 -#ifndef GLEE_C_DEFINED_glGetUniformuivEXT -#define GLEE_C_DEFINED_glGetUniformuivEXT - void __stdcall GLee_Lazy_glGetUniformuivEXT(GLuint program, GLint location, GLuint * params) {if (GLeeInit()) glGetUniformuivEXT(program, location, params);} - GLEEPFNGLGETUNIFORMUIVEXTPROC GLeeFuncPtr_glGetUniformuivEXT=GLee_Lazy_glGetUniformuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindFragDataLocationEXT -#define GLEE_C_DEFINED_glBindFragDataLocationEXT - void __stdcall GLee_Lazy_glBindFragDataLocationEXT(GLuint program, GLuint color, const GLchar * name) {if (GLeeInit()) glBindFragDataLocationEXT(program, color, name);} - GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glBindFragDataLocationEXT=GLee_Lazy_glBindFragDataLocationEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFragDataLocationEXT -#define GLEE_C_DEFINED_glGetFragDataLocationEXT - GLint __stdcall GLee_Lazy_glGetFragDataLocationEXT(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetFragDataLocationEXT(program, name); return (GLint)0;} - GLEEPFNGLGETFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glGetFragDataLocationEXT=GLee_Lazy_glGetFragDataLocationEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform1uiEXT -#define GLEE_C_DEFINED_glUniform1uiEXT - void __stdcall GLee_Lazy_glUniform1uiEXT(GLint location, GLuint v0) {if (GLeeInit()) glUniform1uiEXT(location, v0);} - GLEEPFNGLUNIFORM1UIEXTPROC GLeeFuncPtr_glUniform1uiEXT=GLee_Lazy_glUniform1uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform2uiEXT -#define GLEE_C_DEFINED_glUniform2uiEXT - void __stdcall GLee_Lazy_glUniform2uiEXT(GLint location, GLuint v0, GLuint v1) {if (GLeeInit()) glUniform2uiEXT(location, v0, v1);} - GLEEPFNGLUNIFORM2UIEXTPROC GLeeFuncPtr_glUniform2uiEXT=GLee_Lazy_glUniform2uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform3uiEXT -#define GLEE_C_DEFINED_glUniform3uiEXT - void __stdcall GLee_Lazy_glUniform3uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2) {if (GLeeInit()) glUniform3uiEXT(location, v0, v1, v2);} - GLEEPFNGLUNIFORM3UIEXTPROC GLeeFuncPtr_glUniform3uiEXT=GLee_Lazy_glUniform3uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform4uiEXT -#define GLEE_C_DEFINED_glUniform4uiEXT - void __stdcall GLee_Lazy_glUniform4uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {if (GLeeInit()) glUniform4uiEXT(location, v0, v1, v2, v3);} - GLEEPFNGLUNIFORM4UIEXTPROC GLeeFuncPtr_glUniform4uiEXT=GLee_Lazy_glUniform4uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform1uivEXT -#define GLEE_C_DEFINED_glUniform1uivEXT - void __stdcall GLee_Lazy_glUniform1uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform1uivEXT(location, count, value);} - GLEEPFNGLUNIFORM1UIVEXTPROC GLeeFuncPtr_glUniform1uivEXT=GLee_Lazy_glUniform1uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform2uivEXT -#define GLEE_C_DEFINED_glUniform2uivEXT - void __stdcall GLee_Lazy_glUniform2uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform2uivEXT(location, count, value);} - GLEEPFNGLUNIFORM2UIVEXTPROC GLeeFuncPtr_glUniform2uivEXT=GLee_Lazy_glUniform2uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform3uivEXT -#define GLEE_C_DEFINED_glUniform3uivEXT - void __stdcall GLee_Lazy_glUniform3uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform3uivEXT(location, count, value);} - GLEEPFNGLUNIFORM3UIVEXTPROC GLeeFuncPtr_glUniform3uivEXT=GLee_Lazy_glUniform3uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glUniform4uivEXT -#define GLEE_C_DEFINED_glUniform4uivEXT - void __stdcall GLee_Lazy_glUniform4uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform4uivEXT(location, count, value);} - GLEEPFNGLUNIFORM4UIVEXTPROC GLeeFuncPtr_glUniform4uivEXT=GLee_Lazy_glUniform4uivEXT; -#endif -#endif - -/* GL_EXT_draw_instanced */ - -#ifdef __GLEE_GL_EXT_draw_instanced -#ifndef GLEE_C_DEFINED_glDrawArraysInstancedEXT -#define GLEE_C_DEFINED_glDrawArraysInstancedEXT - void __stdcall GLee_Lazy_glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount) {if (GLeeInit()) glDrawArraysInstancedEXT(mode, start, count, primcount);} - GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC GLeeFuncPtr_glDrawArraysInstancedEXT=GLee_Lazy_glDrawArraysInstancedEXT; -#endif -#ifndef GLEE_C_DEFINED_glDrawElementsInstancedEXT -#define GLEE_C_DEFINED_glDrawElementsInstancedEXT - void __stdcall GLee_Lazy_glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount) {if (GLeeInit()) glDrawElementsInstancedEXT(mode, count, type, indices, primcount);} - GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC GLeeFuncPtr_glDrawElementsInstancedEXT=GLee_Lazy_glDrawElementsInstancedEXT; -#endif -#endif - -/* GL_EXT_packed_float */ - -#ifdef __GLEE_GL_EXT_packed_float -#endif - -/* GL_EXT_texture_array */ - -#ifdef __GLEE_GL_EXT_texture_array -#endif - -/* GL_EXT_texture_buffer_object */ - -#ifdef __GLEE_GL_EXT_texture_buffer_object -#ifndef GLEE_C_DEFINED_glTexBufferEXT -#define GLEE_C_DEFINED_glTexBufferEXT - void __stdcall GLee_Lazy_glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glTexBufferEXT(target, internalformat, buffer);} - GLEEPFNGLTEXBUFFEREXTPROC GLeeFuncPtr_glTexBufferEXT=GLee_Lazy_glTexBufferEXT; -#endif -#endif - -/* GL_EXT_texture_compression_latc */ - -#ifdef __GLEE_GL_EXT_texture_compression_latc -#endif - -/* GL_EXT_texture_compression_rgtc */ - -#ifdef __GLEE_GL_EXT_texture_compression_rgtc -#endif - -/* GL_EXT_texture_shared_exponent */ - -#ifdef __GLEE_GL_EXT_texture_shared_exponent -#endif - -/* GL_NV_depth_buffer_float */ - -#ifdef __GLEE_GL_NV_depth_buffer_float -#ifndef GLEE_C_DEFINED_glDepthRangedNV -#define GLEE_C_DEFINED_glDepthRangedNV - void __stdcall GLee_Lazy_glDepthRangedNV(GLdouble zNear, GLdouble zFar) {if (GLeeInit()) glDepthRangedNV(zNear, zFar);} - GLEEPFNGLDEPTHRANGEDNVPROC GLeeFuncPtr_glDepthRangedNV=GLee_Lazy_glDepthRangedNV; -#endif -#ifndef GLEE_C_DEFINED_glClearDepthdNV -#define GLEE_C_DEFINED_glClearDepthdNV - void __stdcall GLee_Lazy_glClearDepthdNV(GLdouble depth) {if (GLeeInit()) glClearDepthdNV(depth);} - GLEEPFNGLCLEARDEPTHDNVPROC GLeeFuncPtr_glClearDepthdNV=GLee_Lazy_glClearDepthdNV; -#endif -#ifndef GLEE_C_DEFINED_glDepthBoundsdNV -#define GLEE_C_DEFINED_glDepthBoundsdNV - void __stdcall GLee_Lazy_glDepthBoundsdNV(GLdouble zmin, GLdouble zmax) {if (GLeeInit()) glDepthBoundsdNV(zmin, zmax);} - GLEEPFNGLDEPTHBOUNDSDNVPROC GLeeFuncPtr_glDepthBoundsdNV=GLee_Lazy_glDepthBoundsdNV; -#endif -#endif - -/* GL_NV_framebuffer_multisample_coverage */ - -#ifdef __GLEE_GL_NV_framebuffer_multisample_coverage -#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisampleCoverageNV -#define GLEE_C_DEFINED_glRenderbufferStorageMultisampleCoverageNV - void __stdcall GLee_Lazy_glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height);} - GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV=GLee_Lazy_glRenderbufferStorageMultisampleCoverageNV; -#endif -#endif - -/* GL_EXT_framebuffer_sRGB */ - -#ifdef __GLEE_GL_EXT_framebuffer_sRGB -#endif - -/* GL_NV_geometry_shader4 */ - -#ifdef __GLEE_GL_NV_geometry_shader4 -#endif - -/* GL_NV_parameter_buffer_object */ - -#ifdef __GLEE_GL_NV_parameter_buffer_object -#ifndef GLEE_C_DEFINED_glProgramBufferParametersfvNV -#define GLEE_C_DEFINED_glProgramBufferParametersfvNV - void __stdcall GLee_Lazy_glProgramBufferParametersfvNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glProgramBufferParametersfvNV(target, buffer, index, count, params);} - GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC GLeeFuncPtr_glProgramBufferParametersfvNV=GLee_Lazy_glProgramBufferParametersfvNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramBufferParametersIivNV -#define GLEE_C_DEFINED_glProgramBufferParametersIivNV - void __stdcall GLee_Lazy_glProgramBufferParametersIivNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glProgramBufferParametersIivNV(target, buffer, index, count, params);} - GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC GLeeFuncPtr_glProgramBufferParametersIivNV=GLee_Lazy_glProgramBufferParametersIivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramBufferParametersIuivNV -#define GLEE_C_DEFINED_glProgramBufferParametersIuivNV - void __stdcall GLee_Lazy_glProgramBufferParametersIuivNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glProgramBufferParametersIuivNV(target, buffer, index, count, params);} - GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC GLeeFuncPtr_glProgramBufferParametersIuivNV=GLee_Lazy_glProgramBufferParametersIuivNV; -#endif -#endif - -/* GL_EXT_draw_buffers2 */ - -#ifdef __GLEE_GL_EXT_draw_buffers2 -#ifndef GLEE_C_DEFINED_glColorMaskIndexedEXT -#define GLEE_C_DEFINED_glColorMaskIndexedEXT - void __stdcall GLee_Lazy_glColorMaskIndexedEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) {if (GLeeInit()) glColorMaskIndexedEXT(index, r, g, b, a);} - GLEEPFNGLCOLORMASKINDEXEDEXTPROC GLeeFuncPtr_glColorMaskIndexedEXT=GLee_Lazy_glColorMaskIndexedEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetBooleanIndexedvEXT -#define GLEE_C_DEFINED_glGetBooleanIndexedvEXT - void __stdcall GLee_Lazy_glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean * data) {if (GLeeInit()) glGetBooleanIndexedvEXT(target, index, data);} - GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC GLeeFuncPtr_glGetBooleanIndexedvEXT=GLee_Lazy_glGetBooleanIndexedvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetIntegerIndexedvEXT -#define GLEE_C_DEFINED_glGetIntegerIndexedvEXT - void __stdcall GLee_Lazy_glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint * data) {if (GLeeInit()) glGetIntegerIndexedvEXT(target, index, data);} - GLEEPFNGLGETINTEGERINDEXEDVEXTPROC GLeeFuncPtr_glGetIntegerIndexedvEXT=GLee_Lazy_glGetIntegerIndexedvEXT; -#endif -#ifndef GLEE_C_DEFINED_glEnableIndexedEXT -#define GLEE_C_DEFINED_glEnableIndexedEXT - void __stdcall GLee_Lazy_glEnableIndexedEXT(GLenum target, GLuint index) {if (GLeeInit()) glEnableIndexedEXT(target, index);} - GLEEPFNGLENABLEINDEXEDEXTPROC GLeeFuncPtr_glEnableIndexedEXT=GLee_Lazy_glEnableIndexedEXT; -#endif -#ifndef GLEE_C_DEFINED_glDisableIndexedEXT -#define GLEE_C_DEFINED_glDisableIndexedEXT - void __stdcall GLee_Lazy_glDisableIndexedEXT(GLenum target, GLuint index) {if (GLeeInit()) glDisableIndexedEXT(target, index);} - GLEEPFNGLDISABLEINDEXEDEXTPROC GLeeFuncPtr_glDisableIndexedEXT=GLee_Lazy_glDisableIndexedEXT; -#endif -#ifndef GLEE_C_DEFINED_glIsEnabledIndexedEXT -#define GLEE_C_DEFINED_glIsEnabledIndexedEXT - GLboolean __stdcall GLee_Lazy_glIsEnabledIndexedEXT(GLenum target, GLuint index) {if (GLeeInit()) return glIsEnabledIndexedEXT(target, index); return (GLboolean)0;} - GLEEPFNGLISENABLEDINDEXEDEXTPROC GLeeFuncPtr_glIsEnabledIndexedEXT=GLee_Lazy_glIsEnabledIndexedEXT; -#endif -#endif - -/* GL_NV_transform_feedback */ - -#ifdef __GLEE_GL_NV_transform_feedback -#ifndef GLEE_C_DEFINED_glBeginTransformFeedbackNV -#define GLEE_C_DEFINED_glBeginTransformFeedbackNV - void __stdcall GLee_Lazy_glBeginTransformFeedbackNV(GLenum primitiveMode) {if (GLeeInit()) glBeginTransformFeedbackNV(primitiveMode);} - GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBeginTransformFeedbackNV=GLee_Lazy_glBeginTransformFeedbackNV; -#endif -#ifndef GLEE_C_DEFINED_glEndTransformFeedbackNV -#define GLEE_C_DEFINED_glEndTransformFeedbackNV - void __stdcall GLee_Lazy_glEndTransformFeedbackNV(void) {if (GLeeInit()) glEndTransformFeedbackNV();} - GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glEndTransformFeedbackNV=GLee_Lazy_glEndTransformFeedbackNV; -#endif -#ifndef GLEE_C_DEFINED_glTransformFeedbackAttribsNV -#define GLEE_C_DEFINED_glTransformFeedbackAttribsNV - void __stdcall GLee_Lazy_glTransformFeedbackAttribsNV(GLuint count, const GLint * attribs, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackAttribsNV(count, attribs, bufferMode);} - GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC GLeeFuncPtr_glTransformFeedbackAttribsNV=GLee_Lazy_glTransformFeedbackAttribsNV; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferRangeNV -#define GLEE_C_DEFINED_glBindBufferRangeNV - void __stdcall GLee_Lazy_glBindBufferRangeNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glBindBufferRangeNV(target, index, buffer, offset, size);} - GLEEPFNGLBINDBUFFERRANGENVPROC GLeeFuncPtr_glBindBufferRangeNV=GLee_Lazy_glBindBufferRangeNV; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferOffsetNV -#define GLEE_C_DEFINED_glBindBufferOffsetNV - void __stdcall GLee_Lazy_glBindBufferOffsetNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset) {if (GLeeInit()) glBindBufferOffsetNV(target, index, buffer, offset);} - GLEEPFNGLBINDBUFFEROFFSETNVPROC GLeeFuncPtr_glBindBufferOffsetNV=GLee_Lazy_glBindBufferOffsetNV; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferBaseNV -#define GLEE_C_DEFINED_glBindBufferBaseNV - void __stdcall GLee_Lazy_glBindBufferBaseNV(GLenum target, GLuint index, GLuint buffer) {if (GLeeInit()) glBindBufferBaseNV(target, index, buffer);} - GLEEPFNGLBINDBUFFERBASENVPROC GLeeFuncPtr_glBindBufferBaseNV=GLee_Lazy_glBindBufferBaseNV; -#endif -#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryingsNV -#define GLEE_C_DEFINED_glTransformFeedbackVaryingsNV - void __stdcall GLee_Lazy_glTransformFeedbackVaryingsNV(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackVaryingsNV(program, count, locations, bufferMode);} - GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC GLeeFuncPtr_glTransformFeedbackVaryingsNV=GLee_Lazy_glTransformFeedbackVaryingsNV; -#endif -#ifndef GLEE_C_DEFINED_glActiveVaryingNV -#define GLEE_C_DEFINED_glActiveVaryingNV - void __stdcall GLee_Lazy_glActiveVaryingNV(GLuint program, const GLchar * name) {if (GLeeInit()) glActiveVaryingNV(program, name);} - GLEEPFNGLACTIVEVARYINGNVPROC GLeeFuncPtr_glActiveVaryingNV=GLee_Lazy_glActiveVaryingNV; -#endif -#ifndef GLEE_C_DEFINED_glGetVaryingLocationNV -#define GLEE_C_DEFINED_glGetVaryingLocationNV - GLint __stdcall GLee_Lazy_glGetVaryingLocationNV(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetVaryingLocationNV(program, name); return (GLint)0;} - GLEEPFNGLGETVARYINGLOCATIONNVPROC GLeeFuncPtr_glGetVaryingLocationNV=GLee_Lazy_glGetVaryingLocationNV; -#endif -#ifndef GLEE_C_DEFINED_glGetActiveVaryingNV -#define GLEE_C_DEFINED_glGetActiveVaryingNV - void __stdcall GLee_Lazy_glGetActiveVaryingNV(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name) {if (GLeeInit()) glGetActiveVaryingNV(program, index, bufSize, length, size, type, name);} - GLEEPFNGLGETACTIVEVARYINGNVPROC GLeeFuncPtr_glGetActiveVaryingNV=GLee_Lazy_glGetActiveVaryingNV; -#endif -#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVaryingNV -#define GLEE_C_DEFINED_glGetTransformFeedbackVaryingNV - void __stdcall GLee_Lazy_glGetTransformFeedbackVaryingNV(GLuint program, GLuint index, GLint * location) {if (GLeeInit()) glGetTransformFeedbackVaryingNV(program, index, location);} - GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC GLeeFuncPtr_glGetTransformFeedbackVaryingNV=GLee_Lazy_glGetTransformFeedbackVaryingNV; -#endif -#endif - -/* GL_EXT_bindable_uniform */ - -#ifdef __GLEE_GL_EXT_bindable_uniform -#ifndef GLEE_C_DEFINED_glUniformBufferEXT -#define GLEE_C_DEFINED_glUniformBufferEXT - void __stdcall GLee_Lazy_glUniformBufferEXT(GLuint program, GLint location, GLuint buffer) {if (GLeeInit()) glUniformBufferEXT(program, location, buffer);} - GLEEPFNGLUNIFORMBUFFEREXTPROC GLeeFuncPtr_glUniformBufferEXT=GLee_Lazy_glUniformBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformBufferSizeEXT -#define GLEE_C_DEFINED_glGetUniformBufferSizeEXT - GLint __stdcall GLee_Lazy_glGetUniformBufferSizeEXT(GLuint program, GLint location) {if (GLeeInit()) return glGetUniformBufferSizeEXT(program, location); return (GLint)0;} - GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC GLeeFuncPtr_glGetUniformBufferSizeEXT=GLee_Lazy_glGetUniformBufferSizeEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetUniformOffsetEXT -#define GLEE_C_DEFINED_glGetUniformOffsetEXT - GLintptr __stdcall GLee_Lazy_glGetUniformOffsetEXT(GLuint program, GLint location) {if (GLeeInit()) return glGetUniformOffsetEXT(program, location); return (GLintptr)0;} - GLEEPFNGLGETUNIFORMOFFSETEXTPROC GLeeFuncPtr_glGetUniformOffsetEXT=GLee_Lazy_glGetUniformOffsetEXT; -#endif -#endif - -/* GL_EXT_texture_integer */ - -#ifdef __GLEE_GL_EXT_texture_integer -#ifndef GLEE_C_DEFINED_glTexParameterIivEXT -#define GLEE_C_DEFINED_glTexParameterIivEXT - void __stdcall GLee_Lazy_glTexParameterIivEXT(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTexParameterIivEXT(target, pname, params);} - GLEEPFNGLTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glTexParameterIivEXT=GLee_Lazy_glTexParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glTexParameterIuivEXT -#define GLEE_C_DEFINED_glTexParameterIuivEXT - void __stdcall GLee_Lazy_glTexParameterIuivEXT(GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glTexParameterIuivEXT(target, pname, params);} - GLEEPFNGLTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glTexParameterIuivEXT=GLee_Lazy_glTexParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTexParameterIivEXT -#define GLEE_C_DEFINED_glGetTexParameterIivEXT - void __stdcall GLee_Lazy_glGetTexParameterIivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTexParameterIivEXT(target, pname, params);} - GLEEPFNGLGETTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTexParameterIivEXT=GLee_Lazy_glGetTexParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTexParameterIuivEXT -#define GLEE_C_DEFINED_glGetTexParameterIuivEXT - void __stdcall GLee_Lazy_glGetTexParameterIuivEXT(GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetTexParameterIuivEXT(target, pname, params);} - GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTexParameterIuivEXT=GLee_Lazy_glGetTexParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glClearColorIiEXT -#define GLEE_C_DEFINED_glClearColorIiEXT - void __stdcall GLee_Lazy_glClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha) {if (GLeeInit()) glClearColorIiEXT(red, green, blue, alpha);} - GLEEPFNGLCLEARCOLORIIEXTPROC GLeeFuncPtr_glClearColorIiEXT=GLee_Lazy_glClearColorIiEXT; -#endif -#ifndef GLEE_C_DEFINED_glClearColorIuiEXT -#define GLEE_C_DEFINED_glClearColorIuiEXT - void __stdcall GLee_Lazy_glClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha) {if (GLeeInit()) glClearColorIuiEXT(red, green, blue, alpha);} - GLEEPFNGLCLEARCOLORIUIEXTPROC GLeeFuncPtr_glClearColorIuiEXT=GLee_Lazy_glClearColorIuiEXT; -#endif -#endif - -/* GL_GREMEDY_frame_terminator */ - -#ifdef __GLEE_GL_GREMEDY_frame_terminator -#ifndef GLEE_C_DEFINED_glFrameTerminatorGREMEDY -#define GLEE_C_DEFINED_glFrameTerminatorGREMEDY - void __stdcall GLee_Lazy_glFrameTerminatorGREMEDY(void) {if (GLeeInit()) glFrameTerminatorGREMEDY();} - GLEEPFNGLFRAMETERMINATORGREMEDYPROC GLeeFuncPtr_glFrameTerminatorGREMEDY=GLee_Lazy_glFrameTerminatorGREMEDY; -#endif -#endif - -/* GL_NV_conditional_render */ - -#ifdef __GLEE_GL_NV_conditional_render -#ifndef GLEE_C_DEFINED_glBeginConditionalRenderNV -#define GLEE_C_DEFINED_glBeginConditionalRenderNV - void __stdcall GLee_Lazy_glBeginConditionalRenderNV(GLuint id, GLenum mode) {if (GLeeInit()) glBeginConditionalRenderNV(id, mode);} - GLEEPFNGLBEGINCONDITIONALRENDERNVPROC GLeeFuncPtr_glBeginConditionalRenderNV=GLee_Lazy_glBeginConditionalRenderNV; -#endif -#ifndef GLEE_C_DEFINED_glEndConditionalRenderNV -#define GLEE_C_DEFINED_glEndConditionalRenderNV - void __stdcall GLee_Lazy_glEndConditionalRenderNV(void) {if (GLeeInit()) glEndConditionalRenderNV();} - GLEEPFNGLENDCONDITIONALRENDERNVPROC GLeeFuncPtr_glEndConditionalRenderNV=GLee_Lazy_glEndConditionalRenderNV; -#endif -#endif - -/* GL_NV_present_video */ - -#ifdef __GLEE_GL_NV_present_video -#endif - -/* GL_EXT_transform_feedback */ - -#ifdef __GLEE_GL_EXT_transform_feedback -#ifndef GLEE_C_DEFINED_glBeginTransformFeedbackEXT -#define GLEE_C_DEFINED_glBeginTransformFeedbackEXT - void __stdcall GLee_Lazy_glBeginTransformFeedbackEXT(GLenum primitiveMode) {if (GLeeInit()) glBeginTransformFeedbackEXT(primitiveMode);} - GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glBeginTransformFeedbackEXT=GLee_Lazy_glBeginTransformFeedbackEXT; -#endif -#ifndef GLEE_C_DEFINED_glEndTransformFeedbackEXT -#define GLEE_C_DEFINED_glEndTransformFeedbackEXT - void __stdcall GLee_Lazy_glEndTransformFeedbackEXT(void) {if (GLeeInit()) glEndTransformFeedbackEXT();} - GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glEndTransformFeedbackEXT=GLee_Lazy_glEndTransformFeedbackEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferRangeEXT -#define GLEE_C_DEFINED_glBindBufferRangeEXT - void __stdcall GLee_Lazy_glBindBufferRangeEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glBindBufferRangeEXT(target, index, buffer, offset, size);} - GLEEPFNGLBINDBUFFERRANGEEXTPROC GLeeFuncPtr_glBindBufferRangeEXT=GLee_Lazy_glBindBufferRangeEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferOffsetEXT -#define GLEE_C_DEFINED_glBindBufferOffsetEXT - void __stdcall GLee_Lazy_glBindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset) {if (GLeeInit()) glBindBufferOffsetEXT(target, index, buffer, offset);} - GLEEPFNGLBINDBUFFEROFFSETEXTPROC GLeeFuncPtr_glBindBufferOffsetEXT=GLee_Lazy_glBindBufferOffsetEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindBufferBaseEXT -#define GLEE_C_DEFINED_glBindBufferBaseEXT - void __stdcall GLee_Lazy_glBindBufferBaseEXT(GLenum target, GLuint index, GLuint buffer) {if (GLeeInit()) glBindBufferBaseEXT(target, index, buffer);} - GLEEPFNGLBINDBUFFERBASEEXTPROC GLeeFuncPtr_glBindBufferBaseEXT=GLee_Lazy_glBindBufferBaseEXT; -#endif -#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryingsEXT -#define GLEE_C_DEFINED_glTransformFeedbackVaryingsEXT - void __stdcall GLee_Lazy_glTransformFeedbackVaryingsEXT(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackVaryingsEXT(program, count, locations, bufferMode);} - GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC GLeeFuncPtr_glTransformFeedbackVaryingsEXT=GLee_Lazy_glTransformFeedbackVaryingsEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVaryingEXT -#define GLEE_C_DEFINED_glGetTransformFeedbackVaryingEXT - void __stdcall GLee_Lazy_glGetTransformFeedbackVaryingEXT(GLuint program, GLuint index, GLint * location) {if (GLeeInit()) glGetTransformFeedbackVaryingEXT(program, index, location);} - GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC GLeeFuncPtr_glGetTransformFeedbackVaryingEXT=GLee_Lazy_glGetTransformFeedbackVaryingEXT; -#endif -#endif - -/* GL_EXT_direct_state_access */ - -#ifdef __GLEE_GL_EXT_direct_state_access -#ifndef GLEE_C_DEFINED_glClientAttribDefaultEXT -#define GLEE_C_DEFINED_glClientAttribDefaultEXT - void __stdcall GLee_Lazy_glClientAttribDefaultEXT(GLbitfield mask) {if (GLeeInit()) glClientAttribDefaultEXT(mask);} - GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glClientAttribDefaultEXT=GLee_Lazy_glClientAttribDefaultEXT; -#endif -#ifndef GLEE_C_DEFINED_glPushClientAttribDefaultEXT -#define GLEE_C_DEFINED_glPushClientAttribDefaultEXT - void __stdcall GLee_Lazy_glPushClientAttribDefaultEXT(GLbitfield mask) {if (GLeeInit()) glPushClientAttribDefaultEXT(mask);} - GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glPushClientAttribDefaultEXT=GLee_Lazy_glPushClientAttribDefaultEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixLoadfEXT -#define GLEE_C_DEFINED_glMatrixLoadfEXT - void __stdcall GLee_Lazy_glMatrixLoadfEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixLoadfEXT(mode, m);} - GLEEPFNGLMATRIXLOADFEXTPROC GLeeFuncPtr_glMatrixLoadfEXT=GLee_Lazy_glMatrixLoadfEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixLoaddEXT -#define GLEE_C_DEFINED_glMatrixLoaddEXT - void __stdcall GLee_Lazy_glMatrixLoaddEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixLoaddEXT(mode, m);} - GLEEPFNGLMATRIXLOADDEXTPROC GLeeFuncPtr_glMatrixLoaddEXT=GLee_Lazy_glMatrixLoaddEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixMultfEXT -#define GLEE_C_DEFINED_glMatrixMultfEXT - void __stdcall GLee_Lazy_glMatrixMultfEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixMultfEXT(mode, m);} - GLEEPFNGLMATRIXMULTFEXTPROC GLeeFuncPtr_glMatrixMultfEXT=GLee_Lazy_glMatrixMultfEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixMultdEXT -#define GLEE_C_DEFINED_glMatrixMultdEXT - void __stdcall GLee_Lazy_glMatrixMultdEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixMultdEXT(mode, m);} - GLEEPFNGLMATRIXMULTDEXTPROC GLeeFuncPtr_glMatrixMultdEXT=GLee_Lazy_glMatrixMultdEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixLoadIdentityEXT -#define GLEE_C_DEFINED_glMatrixLoadIdentityEXT - void __stdcall GLee_Lazy_glMatrixLoadIdentityEXT(GLenum mode) {if (GLeeInit()) glMatrixLoadIdentityEXT(mode);} - GLEEPFNGLMATRIXLOADIDENTITYEXTPROC GLeeFuncPtr_glMatrixLoadIdentityEXT=GLee_Lazy_glMatrixLoadIdentityEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixRotatefEXT -#define GLEE_C_DEFINED_glMatrixRotatefEXT - void __stdcall GLee_Lazy_glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glMatrixRotatefEXT(mode, angle, x, y, z);} - GLEEPFNGLMATRIXROTATEFEXTPROC GLeeFuncPtr_glMatrixRotatefEXT=GLee_Lazy_glMatrixRotatefEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixRotatedEXT -#define GLEE_C_DEFINED_glMatrixRotatedEXT - void __stdcall GLee_Lazy_glMatrixRotatedEXT(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glMatrixRotatedEXT(mode, angle, x, y, z);} - GLEEPFNGLMATRIXROTATEDEXTPROC GLeeFuncPtr_glMatrixRotatedEXT=GLee_Lazy_glMatrixRotatedEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixScalefEXT -#define GLEE_C_DEFINED_glMatrixScalefEXT - void __stdcall GLee_Lazy_glMatrixScalefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glMatrixScalefEXT(mode, x, y, z);} - GLEEPFNGLMATRIXSCALEFEXTPROC GLeeFuncPtr_glMatrixScalefEXT=GLee_Lazy_glMatrixScalefEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixScaledEXT -#define GLEE_C_DEFINED_glMatrixScaledEXT - void __stdcall GLee_Lazy_glMatrixScaledEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glMatrixScaledEXT(mode, x, y, z);} - GLEEPFNGLMATRIXSCALEDEXTPROC GLeeFuncPtr_glMatrixScaledEXT=GLee_Lazy_glMatrixScaledEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixTranslatefEXT -#define GLEE_C_DEFINED_glMatrixTranslatefEXT - void __stdcall GLee_Lazy_glMatrixTranslatefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glMatrixTranslatefEXT(mode, x, y, z);} - GLEEPFNGLMATRIXTRANSLATEFEXTPROC GLeeFuncPtr_glMatrixTranslatefEXT=GLee_Lazy_glMatrixTranslatefEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixTranslatedEXT -#define GLEE_C_DEFINED_glMatrixTranslatedEXT - void __stdcall GLee_Lazy_glMatrixTranslatedEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glMatrixTranslatedEXT(mode, x, y, z);} - GLEEPFNGLMATRIXTRANSLATEDEXTPROC GLeeFuncPtr_glMatrixTranslatedEXT=GLee_Lazy_glMatrixTranslatedEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixFrustumEXT -#define GLEE_C_DEFINED_glMatrixFrustumEXT - void __stdcall GLee_Lazy_glMatrixFrustumEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) {if (GLeeInit()) glMatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar);} - GLEEPFNGLMATRIXFRUSTUMEXTPROC GLeeFuncPtr_glMatrixFrustumEXT=GLee_Lazy_glMatrixFrustumEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixOrthoEXT -#define GLEE_C_DEFINED_glMatrixOrthoEXT - void __stdcall GLee_Lazy_glMatrixOrthoEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) {if (GLeeInit()) glMatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar);} - GLEEPFNGLMATRIXORTHOEXTPROC GLeeFuncPtr_glMatrixOrthoEXT=GLee_Lazy_glMatrixOrthoEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixPopEXT -#define GLEE_C_DEFINED_glMatrixPopEXT - void __stdcall GLee_Lazy_glMatrixPopEXT(GLenum mode) {if (GLeeInit()) glMatrixPopEXT(mode);} - GLEEPFNGLMATRIXPOPEXTPROC GLeeFuncPtr_glMatrixPopEXT=GLee_Lazy_glMatrixPopEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixPushEXT -#define GLEE_C_DEFINED_glMatrixPushEXT - void __stdcall GLee_Lazy_glMatrixPushEXT(GLenum mode) {if (GLeeInit()) glMatrixPushEXT(mode);} - GLEEPFNGLMATRIXPUSHEXTPROC GLeeFuncPtr_glMatrixPushEXT=GLee_Lazy_glMatrixPushEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixLoadTransposefEXT -#define GLEE_C_DEFINED_glMatrixLoadTransposefEXT - void __stdcall GLee_Lazy_glMatrixLoadTransposefEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixLoadTransposefEXT(mode, m);} - GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixLoadTransposefEXT=GLee_Lazy_glMatrixLoadTransposefEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixLoadTransposedEXT -#define GLEE_C_DEFINED_glMatrixLoadTransposedEXT - void __stdcall GLee_Lazy_glMatrixLoadTransposedEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixLoadTransposedEXT(mode, m);} - GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixLoadTransposedEXT=GLee_Lazy_glMatrixLoadTransposedEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixMultTransposefEXT -#define GLEE_C_DEFINED_glMatrixMultTransposefEXT - void __stdcall GLee_Lazy_glMatrixMultTransposefEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixMultTransposefEXT(mode, m);} - GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixMultTransposefEXT=GLee_Lazy_glMatrixMultTransposefEXT; -#endif -#ifndef GLEE_C_DEFINED_glMatrixMultTransposedEXT -#define GLEE_C_DEFINED_glMatrixMultTransposedEXT - void __stdcall GLee_Lazy_glMatrixMultTransposedEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixMultTransposedEXT(mode, m);} - GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixMultTransposedEXT=GLee_Lazy_glMatrixMultTransposedEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureParameterfEXT -#define GLEE_C_DEFINED_glTextureParameterfEXT - void __stdcall GLee_Lazy_glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glTextureParameterfEXT(texture, target, pname, param);} - GLEEPFNGLTEXTUREPARAMETERFEXTPROC GLeeFuncPtr_glTextureParameterfEXT=GLee_Lazy_glTextureParameterfEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureParameterfvEXT -#define GLEE_C_DEFINED_glTextureParameterfvEXT - void __stdcall GLee_Lazy_glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glTextureParameterfvEXT(texture, target, pname, params);} - GLEEPFNGLTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glTextureParameterfvEXT=GLee_Lazy_glTextureParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureParameteriEXT -#define GLEE_C_DEFINED_glTextureParameteriEXT - void __stdcall GLee_Lazy_glTextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glTextureParameteriEXT(texture, target, pname, param);} - GLEEPFNGLTEXTUREPARAMETERIEXTPROC GLeeFuncPtr_glTextureParameteriEXT=GLee_Lazy_glTextureParameteriEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureParameterivEXT -#define GLEE_C_DEFINED_glTextureParameterivEXT - void __stdcall GLee_Lazy_glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTextureParameterivEXT(texture, target, pname, params);} - GLEEPFNGLTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glTextureParameterivEXT=GLee_Lazy_glTextureParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureImage1DEXT -#define GLEE_C_DEFINED_glTextureImage1DEXT - void __stdcall GLee_Lazy_glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels);} - GLEEPFNGLTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glTextureImage1DEXT=GLee_Lazy_glTextureImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureImage2DEXT -#define GLEE_C_DEFINED_glTextureImage2DEXT - void __stdcall GLee_Lazy_glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels);} - GLEEPFNGLTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glTextureImage2DEXT=GLee_Lazy_glTextureImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureSubImage1DEXT -#define GLEE_C_DEFINED_glTextureSubImage1DEXT - void __stdcall GLee_Lazy_glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);} - GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glTextureSubImage1DEXT=GLee_Lazy_glTextureSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureSubImage2DEXT -#define GLEE_C_DEFINED_glTextureSubImage2DEXT - void __stdcall GLee_Lazy_glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);} - GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glTextureSubImage2DEXT=GLee_Lazy_glTextureSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTextureImage1DEXT -#define GLEE_C_DEFINED_glCopyTextureImage1DEXT - void __stdcall GLee_Lazy_glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) {if (GLeeInit()) glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border);} - GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureImage1DEXT=GLee_Lazy_glCopyTextureImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTextureImage2DEXT -#define GLEE_C_DEFINED_glCopyTextureImage2DEXT - void __stdcall GLee_Lazy_glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {if (GLeeInit()) glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border);} - GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureImage2DEXT=GLee_Lazy_glCopyTextureImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTextureSubImage1DEXT -#define GLEE_C_DEFINED_glCopyTextureSubImage1DEXT - void __stdcall GLee_Lazy_glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width);} - GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureSubImage1DEXT=GLee_Lazy_glCopyTextureSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTextureSubImage2DEXT -#define GLEE_C_DEFINED_glCopyTextureSubImage2DEXT - void __stdcall GLee_Lazy_glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height);} - GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureSubImage2DEXT=GLee_Lazy_glCopyTextureSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureImageEXT -#define GLEE_C_DEFINED_glGetTextureImageEXT - void __stdcall GLee_Lazy_glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels) {if (GLeeInit()) glGetTextureImageEXT(texture, target, level, format, type, pixels);} - GLEEPFNGLGETTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetTextureImageEXT=GLee_Lazy_glGetTextureImageEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureParameterfvEXT -#define GLEE_C_DEFINED_glGetTextureParameterfvEXT - void __stdcall GLee_Lazy_glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetTextureParameterfvEXT(texture, target, pname, params);} - GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureParameterfvEXT=GLee_Lazy_glGetTextureParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureParameterivEXT -#define GLEE_C_DEFINED_glGetTextureParameterivEXT - void __stdcall GLee_Lazy_glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTextureParameterivEXT(texture, target, pname, params);} - GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureParameterivEXT=GLee_Lazy_glGetTextureParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureLevelParameterfvEXT -#define GLEE_C_DEFINED_glGetTextureLevelParameterfvEXT - void __stdcall GLee_Lazy_glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetTextureLevelParameterfvEXT(texture, target, level, pname, params);} - GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterfvEXT=GLee_Lazy_glGetTextureLevelParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureLevelParameterivEXT -#define GLEE_C_DEFINED_glGetTextureLevelParameterivEXT - void __stdcall GLee_Lazy_glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params) {if (GLeeInit()) glGetTextureLevelParameterivEXT(texture, target, level, pname, params);} - GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterivEXT=GLee_Lazy_glGetTextureLevelParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureImage3DEXT -#define GLEE_C_DEFINED_glTextureImage3DEXT - void __stdcall GLee_Lazy_glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels);} - GLEEPFNGLTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glTextureImage3DEXT=GLee_Lazy_glTextureImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureSubImage3DEXT -#define GLEE_C_DEFINED_glTextureSubImage3DEXT - void __stdcall GLee_Lazy_glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} - GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glTextureSubImage3DEXT=GLee_Lazy_glTextureSubImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyTextureSubImage3DEXT -#define GLEE_C_DEFINED_glCopyTextureSubImage3DEXT - void __stdcall GLee_Lazy_glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height);} - GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTextureSubImage3DEXT=GLee_Lazy_glCopyTextureSubImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexParameterfEXT -#define GLEE_C_DEFINED_glMultiTexParameterfEXT - void __stdcall GLee_Lazy_glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glMultiTexParameterfEXT(texunit, target, pname, param);} - GLEEPFNGLMULTITEXPARAMETERFEXTPROC GLeeFuncPtr_glMultiTexParameterfEXT=GLee_Lazy_glMultiTexParameterfEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexParameterfvEXT -#define GLEE_C_DEFINED_glMultiTexParameterfvEXT - void __stdcall GLee_Lazy_glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMultiTexParameterfvEXT(texunit, target, pname, params);} - GLEEPFNGLMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glMultiTexParameterfvEXT=GLee_Lazy_glMultiTexParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexParameteriEXT -#define GLEE_C_DEFINED_glMultiTexParameteriEXT - void __stdcall GLee_Lazy_glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glMultiTexParameteriEXT(texunit, target, pname, param);} - GLEEPFNGLMULTITEXPARAMETERIEXTPROC GLeeFuncPtr_glMultiTexParameteriEXT=GLee_Lazy_glMultiTexParameteriEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexParameterivEXT -#define GLEE_C_DEFINED_glMultiTexParameterivEXT - void __stdcall GLee_Lazy_glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexParameterivEXT(texunit, target, pname, params);} - GLEEPFNGLMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glMultiTexParameterivEXT=GLee_Lazy_glMultiTexParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexImage1DEXT -#define GLEE_C_DEFINED_glMultiTexImage1DEXT - void __stdcall GLee_Lazy_glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels);} - GLEEPFNGLMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexImage1DEXT=GLee_Lazy_glMultiTexImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexImage2DEXT -#define GLEE_C_DEFINED_glMultiTexImage2DEXT - void __stdcall GLee_Lazy_glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels);} - GLEEPFNGLMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexImage2DEXT=GLee_Lazy_glMultiTexImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexSubImage1DEXT -#define GLEE_C_DEFINED_glMultiTexSubImage1DEXT - void __stdcall GLee_Lazy_glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels);} - GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexSubImage1DEXT=GLee_Lazy_glMultiTexSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexSubImage2DEXT -#define GLEE_C_DEFINED_glMultiTexSubImage2DEXT - void __stdcall GLee_Lazy_glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels);} - GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexSubImage2DEXT=GLee_Lazy_glMultiTexSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyMultiTexImage1DEXT -#define GLEE_C_DEFINED_glCopyMultiTexImage1DEXT - void __stdcall GLee_Lazy_glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) {if (GLeeInit()) glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border);} - GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexImage1DEXT=GLee_Lazy_glCopyMultiTexImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyMultiTexImage2DEXT -#define GLEE_C_DEFINED_glCopyMultiTexImage2DEXT - void __stdcall GLee_Lazy_glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {if (GLeeInit()) glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border);} - GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexImage2DEXT=GLee_Lazy_glCopyMultiTexImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage1DEXT -#define GLEE_C_DEFINED_glCopyMultiTexSubImage1DEXT - void __stdcall GLee_Lazy_glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width);} - GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage1DEXT=GLee_Lazy_glCopyMultiTexSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage2DEXT -#define GLEE_C_DEFINED_glCopyMultiTexSubImage2DEXT - void __stdcall GLee_Lazy_glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height);} - GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage2DEXT=GLee_Lazy_glCopyMultiTexSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexImageEXT -#define GLEE_C_DEFINED_glGetMultiTexImageEXT - void __stdcall GLee_Lazy_glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels) {if (GLeeInit()) glGetMultiTexImageEXT(texunit, target, level, format, type, pixels);} - GLEEPFNGLGETMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetMultiTexImageEXT=GLee_Lazy_glGetMultiTexImageEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexParameterfvEXT -#define GLEE_C_DEFINED_glGetMultiTexParameterfvEXT - void __stdcall GLee_Lazy_glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexParameterfvEXT(texunit, target, pname, params);} - GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexParameterfvEXT=GLee_Lazy_glGetMultiTexParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexParameterivEXT -#define GLEE_C_DEFINED_glGetMultiTexParameterivEXT - void __stdcall GLee_Lazy_glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexParameterivEXT(texunit, target, pname, params);} - GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterivEXT=GLee_Lazy_glGetMultiTexParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexLevelParameterfvEXT -#define GLEE_C_DEFINED_glGetMultiTexLevelParameterfvEXT - void __stdcall GLee_Lazy_glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params);} - GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT=GLee_Lazy_glGetMultiTexLevelParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexLevelParameterivEXT -#define GLEE_C_DEFINED_glGetMultiTexLevelParameterivEXT - void __stdcall GLee_Lazy_glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params);} - GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterivEXT=GLee_Lazy_glGetMultiTexLevelParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexImage3DEXT -#define GLEE_C_DEFINED_glMultiTexImage3DEXT - void __stdcall GLee_Lazy_glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels);} - GLEEPFNGLMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexImage3DEXT=GLee_Lazy_glMultiTexImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexSubImage3DEXT -#define GLEE_C_DEFINED_glMultiTexSubImage3DEXT - void __stdcall GLee_Lazy_glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} - GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexSubImage3DEXT=GLee_Lazy_glMultiTexSubImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage3DEXT -#define GLEE_C_DEFINED_glCopyMultiTexSubImage3DEXT - void __stdcall GLee_Lazy_glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height);} - GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage3DEXT=GLee_Lazy_glCopyMultiTexSubImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glBindMultiTextureEXT -#define GLEE_C_DEFINED_glBindMultiTextureEXT - void __stdcall GLee_Lazy_glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture) {if (GLeeInit()) glBindMultiTextureEXT(texunit, target, texture);} - GLEEPFNGLBINDMULTITEXTUREEXTPROC GLeeFuncPtr_glBindMultiTextureEXT=GLee_Lazy_glBindMultiTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glEnableClientStateIndexedEXT -#define GLEE_C_DEFINED_glEnableClientStateIndexedEXT - void __stdcall GLee_Lazy_glEnableClientStateIndexedEXT(GLenum array, GLuint index) {if (GLeeInit()) glEnableClientStateIndexedEXT(array, index);} - GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glEnableClientStateIndexedEXT=GLee_Lazy_glEnableClientStateIndexedEXT; -#endif -#ifndef GLEE_C_DEFINED_glDisableClientStateIndexedEXT -#define GLEE_C_DEFINED_glDisableClientStateIndexedEXT - void __stdcall GLee_Lazy_glDisableClientStateIndexedEXT(GLenum array, GLuint index) {if (GLeeInit()) glDisableClientStateIndexedEXT(array, index);} - GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glDisableClientStateIndexedEXT=GLee_Lazy_glDisableClientStateIndexedEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexCoordPointerEXT -#define GLEE_C_DEFINED_glMultiTexCoordPointerEXT - void __stdcall GLee_Lazy_glMultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer);} - GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC GLeeFuncPtr_glMultiTexCoordPointerEXT=GLee_Lazy_glMultiTexCoordPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexEnvfEXT -#define GLEE_C_DEFINED_glMultiTexEnvfEXT - void __stdcall GLee_Lazy_glMultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glMultiTexEnvfEXT(texunit, target, pname, param);} - GLEEPFNGLMULTITEXENVFEXTPROC GLeeFuncPtr_glMultiTexEnvfEXT=GLee_Lazy_glMultiTexEnvfEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexEnvfvEXT -#define GLEE_C_DEFINED_glMultiTexEnvfvEXT - void __stdcall GLee_Lazy_glMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMultiTexEnvfvEXT(texunit, target, pname, params);} - GLEEPFNGLMULTITEXENVFVEXTPROC GLeeFuncPtr_glMultiTexEnvfvEXT=GLee_Lazy_glMultiTexEnvfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexEnviEXT -#define GLEE_C_DEFINED_glMultiTexEnviEXT - void __stdcall GLee_Lazy_glMultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glMultiTexEnviEXT(texunit, target, pname, param);} - GLEEPFNGLMULTITEXENVIEXTPROC GLeeFuncPtr_glMultiTexEnviEXT=GLee_Lazy_glMultiTexEnviEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexEnvivEXT -#define GLEE_C_DEFINED_glMultiTexEnvivEXT - void __stdcall GLee_Lazy_glMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexEnvivEXT(texunit, target, pname, params);} - GLEEPFNGLMULTITEXENVIVEXTPROC GLeeFuncPtr_glMultiTexEnvivEXT=GLee_Lazy_glMultiTexEnvivEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexGendEXT -#define GLEE_C_DEFINED_glMultiTexGendEXT - void __stdcall GLee_Lazy_glMultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param) {if (GLeeInit()) glMultiTexGendEXT(texunit, coord, pname, param);} - GLEEPFNGLMULTITEXGENDEXTPROC GLeeFuncPtr_glMultiTexGendEXT=GLee_Lazy_glMultiTexGendEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexGendvEXT -#define GLEE_C_DEFINED_glMultiTexGendvEXT - void __stdcall GLee_Lazy_glMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params) {if (GLeeInit()) glMultiTexGendvEXT(texunit, coord, pname, params);} - GLEEPFNGLMULTITEXGENDVEXTPROC GLeeFuncPtr_glMultiTexGendvEXT=GLee_Lazy_glMultiTexGendvEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexGenfEXT -#define GLEE_C_DEFINED_glMultiTexGenfEXT - void __stdcall GLee_Lazy_glMultiTexGenfEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat param) {if (GLeeInit()) glMultiTexGenfEXT(texunit, coord, pname, param);} - GLEEPFNGLMULTITEXGENFEXTPROC GLeeFuncPtr_glMultiTexGenfEXT=GLee_Lazy_glMultiTexGenfEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexGenfvEXT -#define GLEE_C_DEFINED_glMultiTexGenfvEXT - void __stdcall GLee_Lazy_glMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMultiTexGenfvEXT(texunit, coord, pname, params);} - GLEEPFNGLMULTITEXGENFVEXTPROC GLeeFuncPtr_glMultiTexGenfvEXT=GLee_Lazy_glMultiTexGenfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexGeniEXT -#define GLEE_C_DEFINED_glMultiTexGeniEXT - void __stdcall GLee_Lazy_glMultiTexGeniEXT(GLenum texunit, GLenum coord, GLenum pname, GLint param) {if (GLeeInit()) glMultiTexGeniEXT(texunit, coord, pname, param);} - GLEEPFNGLMULTITEXGENIEXTPROC GLeeFuncPtr_glMultiTexGeniEXT=GLee_Lazy_glMultiTexGeniEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexGenivEXT -#define GLEE_C_DEFINED_glMultiTexGenivEXT - void __stdcall GLee_Lazy_glMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexGenivEXT(texunit, coord, pname, params);} - GLEEPFNGLMULTITEXGENIVEXTPROC GLeeFuncPtr_glMultiTexGenivEXT=GLee_Lazy_glMultiTexGenivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexEnvfvEXT -#define GLEE_C_DEFINED_glGetMultiTexEnvfvEXT - void __stdcall GLee_Lazy_glGetMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexEnvfvEXT(texunit, target, pname, params);} - GLEEPFNGLGETMULTITEXENVFVEXTPROC GLeeFuncPtr_glGetMultiTexEnvfvEXT=GLee_Lazy_glGetMultiTexEnvfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexEnvivEXT -#define GLEE_C_DEFINED_glGetMultiTexEnvivEXT - void __stdcall GLee_Lazy_glGetMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexEnvivEXT(texunit, target, pname, params);} - GLEEPFNGLGETMULTITEXENVIVEXTPROC GLeeFuncPtr_glGetMultiTexEnvivEXT=GLee_Lazy_glGetMultiTexEnvivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexGendvEXT -#define GLEE_C_DEFINED_glGetMultiTexGendvEXT - void __stdcall GLee_Lazy_glGetMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetMultiTexGendvEXT(texunit, coord, pname, params);} - GLEEPFNGLGETMULTITEXGENDVEXTPROC GLeeFuncPtr_glGetMultiTexGendvEXT=GLee_Lazy_glGetMultiTexGendvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexGenfvEXT -#define GLEE_C_DEFINED_glGetMultiTexGenfvEXT - void __stdcall GLee_Lazy_glGetMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexGenfvEXT(texunit, coord, pname, params);} - GLEEPFNGLGETMULTITEXGENFVEXTPROC GLeeFuncPtr_glGetMultiTexGenfvEXT=GLee_Lazy_glGetMultiTexGenfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexGenivEXT -#define GLEE_C_DEFINED_glGetMultiTexGenivEXT - void __stdcall GLee_Lazy_glGetMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexGenivEXT(texunit, coord, pname, params);} - GLEEPFNGLGETMULTITEXGENIVEXTPROC GLeeFuncPtr_glGetMultiTexGenivEXT=GLee_Lazy_glGetMultiTexGenivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFloatIndexedvEXT -#define GLEE_C_DEFINED_glGetFloatIndexedvEXT - void __stdcall GLee_Lazy_glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat * data) {if (GLeeInit()) glGetFloatIndexedvEXT(target, index, data);} - GLEEPFNGLGETFLOATINDEXEDVEXTPROC GLeeFuncPtr_glGetFloatIndexedvEXT=GLee_Lazy_glGetFloatIndexedvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetDoubleIndexedvEXT -#define GLEE_C_DEFINED_glGetDoubleIndexedvEXT - void __stdcall GLee_Lazy_glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble * data) {if (GLeeInit()) glGetDoubleIndexedvEXT(target, index, data);} - GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC GLeeFuncPtr_glGetDoubleIndexedvEXT=GLee_Lazy_glGetDoubleIndexedvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetPointerIndexedvEXT -#define GLEE_C_DEFINED_glGetPointerIndexedvEXT - void __stdcall GLee_Lazy_glGetPointerIndexedvEXT(GLenum target, GLuint index, GLvoid* * data) {if (GLeeInit()) glGetPointerIndexedvEXT(target, index, data);} - GLEEPFNGLGETPOINTERINDEXEDVEXTPROC GLeeFuncPtr_glGetPointerIndexedvEXT=GLee_Lazy_glGetPointerIndexedvEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTextureImage3DEXT -#define GLEE_C_DEFINED_glCompressedTextureImage3DEXT - void __stdcall GLee_Lazy_glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits);} - GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureImage3DEXT=GLee_Lazy_glCompressedTextureImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTextureImage2DEXT -#define GLEE_C_DEFINED_glCompressedTextureImage2DEXT - void __stdcall GLee_Lazy_glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits);} - GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureImage2DEXT=GLee_Lazy_glCompressedTextureImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTextureImage1DEXT -#define GLEE_C_DEFINED_glCompressedTextureImage1DEXT - void __stdcall GLee_Lazy_glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits);} - GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureImage1DEXT=GLee_Lazy_glCompressedTextureImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage3DEXT -#define GLEE_C_DEFINED_glCompressedTextureSubImage3DEXT - void __stdcall GLee_Lazy_glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);} - GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage3DEXT=GLee_Lazy_glCompressedTextureSubImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage2DEXT -#define GLEE_C_DEFINED_glCompressedTextureSubImage2DEXT - void __stdcall GLee_Lazy_glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);} - GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage2DEXT=GLee_Lazy_glCompressedTextureSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage1DEXT -#define GLEE_C_DEFINED_glCompressedTextureSubImage1DEXT - void __stdcall GLee_Lazy_glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);} - GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage1DEXT=GLee_Lazy_glCompressedTextureSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetCompressedTextureImageEXT -#define GLEE_C_DEFINED_glGetCompressedTextureImageEXT - void __stdcall GLee_Lazy_glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, GLvoid * img) {if (GLeeInit()) glGetCompressedTextureImageEXT(texture, target, lod, img);} - GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetCompressedTextureImageEXT=GLee_Lazy_glGetCompressedTextureImageEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage3DEXT -#define GLEE_C_DEFINED_glCompressedMultiTexImage3DEXT - void __stdcall GLee_Lazy_glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits);} - GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage3DEXT=GLee_Lazy_glCompressedMultiTexImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage2DEXT -#define GLEE_C_DEFINED_glCompressedMultiTexImage2DEXT - void __stdcall GLee_Lazy_glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits);} - GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage2DEXT=GLee_Lazy_glCompressedMultiTexImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage1DEXT -#define GLEE_C_DEFINED_glCompressedMultiTexImage1DEXT - void __stdcall GLee_Lazy_glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits);} - GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage1DEXT=GLee_Lazy_glCompressedMultiTexImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage3DEXT -#define GLEE_C_DEFINED_glCompressedMultiTexSubImage3DEXT - void __stdcall GLee_Lazy_glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);} - GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT=GLee_Lazy_glCompressedMultiTexSubImage3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage2DEXT -#define GLEE_C_DEFINED_glCompressedMultiTexSubImage2DEXT - void __stdcall GLee_Lazy_glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits);} - GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT=GLee_Lazy_glCompressedMultiTexSubImage2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage1DEXT -#define GLEE_C_DEFINED_glCompressedMultiTexSubImage1DEXT - void __stdcall GLee_Lazy_glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits);} - GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT=GLee_Lazy_glCompressedMultiTexSubImage1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetCompressedMultiTexImageEXT -#define GLEE_C_DEFINED_glGetCompressedMultiTexImageEXT - void __stdcall GLee_Lazy_glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, GLvoid * img) {if (GLeeInit()) glGetCompressedMultiTexImageEXT(texunit, target, lod, img);} - GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetCompressedMultiTexImageEXT=GLee_Lazy_glGetCompressedMultiTexImageEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramStringEXT -#define GLEE_C_DEFINED_glNamedProgramStringEXT - void __stdcall GLee_Lazy_glNamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string) {if (GLeeInit()) glNamedProgramStringEXT(program, target, format, len, string);} - GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glNamedProgramStringEXT=GLee_Lazy_glNamedProgramStringEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4dEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameter4dEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dEXT=GLee_Lazy_glNamedProgramLocalParameter4dEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4dvEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameter4dvEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index, const GLdouble * params) {if (GLeeInit()) glNamedProgramLocalParameter4dvEXT(program, target, index, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT=GLee_Lazy_glNamedProgramLocalParameter4dvEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4fEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameter4fEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fEXT=GLee_Lazy_glNamedProgramLocalParameter4fEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4fvEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameter4fvEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index, const GLfloat * params) {if (GLeeInit()) glNamedProgramLocalParameter4fvEXT(program, target, index, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT=GLee_Lazy_glNamedProgramLocalParameter4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterdvEXT -#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterdvEXT - void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterdvEXT(GLuint program, GLenum target, GLuint index, GLdouble * params) {if (GLeeInit()) glGetNamedProgramLocalParameterdvEXT(program, target, index, params);} - GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT=GLee_Lazy_glGetNamedProgramLocalParameterdvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterfvEXT -#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterfvEXT - void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterfvEXT(GLuint program, GLenum target, GLuint index, GLfloat * params) {if (GLeeInit()) glGetNamedProgramLocalParameterfvEXT(program, target, index, params);} - GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT=GLee_Lazy_glGetNamedProgramLocalParameterfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedProgramivEXT -#define GLEE_C_DEFINED_glGetNamedProgramivEXT - void __stdcall GLee_Lazy_glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedProgramivEXT(program, target, pname, params);} - GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC GLeeFuncPtr_glGetNamedProgramivEXT=GLee_Lazy_glGetNamedProgramivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedProgramStringEXT -#define GLEE_C_DEFINED_glGetNamedProgramStringEXT - void __stdcall GLee_Lazy_glGetNamedProgramStringEXT(GLuint program, GLenum target, GLenum pname, GLvoid * string) {if (GLeeInit()) glGetNamedProgramStringEXT(program, target, pname, string);} - GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glGetNamedProgramStringEXT=GLee_Lazy_glGetNamedProgramStringEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameters4fvEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameters4fvEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameters4fvEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glNamedProgramLocalParameters4fvEXT(program, target, index, count, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT=GLee_Lazy_glNamedProgramLocalParameters4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4iEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4iEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4iEXT(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT=GLee_Lazy_glNamedProgramLocalParameterI4iEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4ivEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4ivEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4ivEXT(GLuint program, GLenum target, GLuint index, const GLint * params) {if (GLeeInit()) glNamedProgramLocalParameterI4ivEXT(program, target, index, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT=GLee_Lazy_glNamedProgramLocalParameterI4ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParametersI4ivEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParametersI4ivEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParametersI4ivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glNamedProgramLocalParametersI4ivEXT(program, target, index, count, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT=GLee_Lazy_glNamedProgramLocalParametersI4ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4uiEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4uiEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4uiEXT(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT=GLee_Lazy_glNamedProgramLocalParameterI4uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4uivEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4uivEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4uivEXT(GLuint program, GLenum target, GLuint index, const GLuint * params) {if (GLeeInit()) glNamedProgramLocalParameterI4uivEXT(program, target, index, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT=GLee_Lazy_glNamedProgramLocalParameterI4uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedProgramLocalParametersI4uivEXT -#define GLEE_C_DEFINED_glNamedProgramLocalParametersI4uivEXT - void __stdcall GLee_Lazy_glNamedProgramLocalParametersI4uivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glNamedProgramLocalParametersI4uivEXT(program, target, index, count, params);} - GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT=GLee_Lazy_glNamedProgramLocalParametersI4uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterIivEXT -#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterIivEXT - void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterIivEXT(GLuint program, GLenum target, GLuint index, GLint * params) {if (GLeeInit()) glGetNamedProgramLocalParameterIivEXT(program, target, index, params);} - GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT=GLee_Lazy_glGetNamedProgramLocalParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterIuivEXT -#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterIuivEXT - void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterIuivEXT(GLuint program, GLenum target, GLuint index, GLuint * params) {if (GLeeInit()) glGetNamedProgramLocalParameterIuivEXT(program, target, index, params);} - GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT=GLee_Lazy_glGetNamedProgramLocalParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureParameterIivEXT -#define GLEE_C_DEFINED_glTextureParameterIivEXT - void __stdcall GLee_Lazy_glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTextureParameterIivEXT(texture, target, pname, params);} - GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glTextureParameterIivEXT=GLee_Lazy_glTextureParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureParameterIuivEXT -#define GLEE_C_DEFINED_glTextureParameterIuivEXT - void __stdcall GLee_Lazy_glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glTextureParameterIuivEXT(texture, target, pname, params);} - GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glTextureParameterIuivEXT=GLee_Lazy_glTextureParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureParameterIivEXT -#define GLEE_C_DEFINED_glGetTextureParameterIivEXT - void __stdcall GLee_Lazy_glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTextureParameterIivEXT(texture, target, pname, params);} - GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTextureParameterIivEXT=GLee_Lazy_glGetTextureParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetTextureParameterIuivEXT -#define GLEE_C_DEFINED_glGetTextureParameterIuivEXT - void __stdcall GLee_Lazy_glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetTextureParameterIuivEXT(texture, target, pname, params);} - GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTextureParameterIuivEXT=GLee_Lazy_glGetTextureParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexParameterIivEXT -#define GLEE_C_DEFINED_glMultiTexParameterIivEXT - void __stdcall GLee_Lazy_glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexParameterIivEXT(texunit, target, pname, params);} - GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glMultiTexParameterIivEXT=GLee_Lazy_glMultiTexParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexParameterIuivEXT -#define GLEE_C_DEFINED_glMultiTexParameterIuivEXT - void __stdcall GLee_Lazy_glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glMultiTexParameterIuivEXT(texunit, target, pname, params);} - GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glMultiTexParameterIuivEXT=GLee_Lazy_glMultiTexParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexParameterIivEXT -#define GLEE_C_DEFINED_glGetMultiTexParameterIivEXT - void __stdcall GLee_Lazy_glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexParameterIivEXT(texunit, target, pname, params);} - GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIivEXT=GLee_Lazy_glGetMultiTexParameterIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetMultiTexParameterIuivEXT -#define GLEE_C_DEFINED_glGetMultiTexParameterIuivEXT - void __stdcall GLee_Lazy_glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetMultiTexParameterIuivEXT(texunit, target, pname, params);} - GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIuivEXT=GLee_Lazy_glGetMultiTexParameterIuivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform1fEXT -#define GLEE_C_DEFINED_glProgramUniform1fEXT - void __stdcall GLee_Lazy_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0) {if (GLeeInit()) glProgramUniform1fEXT(program, location, v0);} - GLEEPFNGLPROGRAMUNIFORM1FEXTPROC GLeeFuncPtr_glProgramUniform1fEXT=GLee_Lazy_glProgramUniform1fEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform2fEXT -#define GLEE_C_DEFINED_glProgramUniform2fEXT - void __stdcall GLee_Lazy_glProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1) {if (GLeeInit()) glProgramUniform2fEXT(program, location, v0, v1);} - GLEEPFNGLPROGRAMUNIFORM2FEXTPROC GLeeFuncPtr_glProgramUniform2fEXT=GLee_Lazy_glProgramUniform2fEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform3fEXT -#define GLEE_C_DEFINED_glProgramUniform3fEXT - void __stdcall GLee_Lazy_glProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {if (GLeeInit()) glProgramUniform3fEXT(program, location, v0, v1, v2);} - GLEEPFNGLPROGRAMUNIFORM3FEXTPROC GLeeFuncPtr_glProgramUniform3fEXT=GLee_Lazy_glProgramUniform3fEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform4fEXT -#define GLEE_C_DEFINED_glProgramUniform4fEXT - void __stdcall GLee_Lazy_glProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {if (GLeeInit()) glProgramUniform4fEXT(program, location, v0, v1, v2, v3);} - GLEEPFNGLPROGRAMUNIFORM4FEXTPROC GLeeFuncPtr_glProgramUniform4fEXT=GLee_Lazy_glProgramUniform4fEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform1iEXT -#define GLEE_C_DEFINED_glProgramUniform1iEXT - void __stdcall GLee_Lazy_glProgramUniform1iEXT(GLuint program, GLint location, GLint v0) {if (GLeeInit()) glProgramUniform1iEXT(program, location, v0);} - GLEEPFNGLPROGRAMUNIFORM1IEXTPROC GLeeFuncPtr_glProgramUniform1iEXT=GLee_Lazy_glProgramUniform1iEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform2iEXT -#define GLEE_C_DEFINED_glProgramUniform2iEXT - void __stdcall GLee_Lazy_glProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1) {if (GLeeInit()) glProgramUniform2iEXT(program, location, v0, v1);} - GLEEPFNGLPROGRAMUNIFORM2IEXTPROC GLeeFuncPtr_glProgramUniform2iEXT=GLee_Lazy_glProgramUniform2iEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform3iEXT -#define GLEE_C_DEFINED_glProgramUniform3iEXT - void __stdcall GLee_Lazy_glProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) {if (GLeeInit()) glProgramUniform3iEXT(program, location, v0, v1, v2);} - GLEEPFNGLPROGRAMUNIFORM3IEXTPROC GLeeFuncPtr_glProgramUniform3iEXT=GLee_Lazy_glProgramUniform3iEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform4iEXT -#define GLEE_C_DEFINED_glProgramUniform4iEXT - void __stdcall GLee_Lazy_glProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {if (GLeeInit()) glProgramUniform4iEXT(program, location, v0, v1, v2, v3);} - GLEEPFNGLPROGRAMUNIFORM4IEXTPROC GLeeFuncPtr_glProgramUniform4iEXT=GLee_Lazy_glProgramUniform4iEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform1fvEXT -#define GLEE_C_DEFINED_glProgramUniform1fvEXT - void __stdcall GLee_Lazy_glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform1fvEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC GLeeFuncPtr_glProgramUniform1fvEXT=GLee_Lazy_glProgramUniform1fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform2fvEXT -#define GLEE_C_DEFINED_glProgramUniform2fvEXT - void __stdcall GLee_Lazy_glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform2fvEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC GLeeFuncPtr_glProgramUniform2fvEXT=GLee_Lazy_glProgramUniform2fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform3fvEXT -#define GLEE_C_DEFINED_glProgramUniform3fvEXT - void __stdcall GLee_Lazy_glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform3fvEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC GLeeFuncPtr_glProgramUniform3fvEXT=GLee_Lazy_glProgramUniform3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform4fvEXT -#define GLEE_C_DEFINED_glProgramUniform4fvEXT - void __stdcall GLee_Lazy_glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform4fvEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC GLeeFuncPtr_glProgramUniform4fvEXT=GLee_Lazy_glProgramUniform4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform1ivEXT -#define GLEE_C_DEFINED_glProgramUniform1ivEXT - void __stdcall GLee_Lazy_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform1ivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC GLeeFuncPtr_glProgramUniform1ivEXT=GLee_Lazy_glProgramUniform1ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform2ivEXT -#define GLEE_C_DEFINED_glProgramUniform2ivEXT - void __stdcall GLee_Lazy_glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform2ivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC GLeeFuncPtr_glProgramUniform2ivEXT=GLee_Lazy_glProgramUniform2ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform3ivEXT -#define GLEE_C_DEFINED_glProgramUniform3ivEXT - void __stdcall GLee_Lazy_glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform3ivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC GLeeFuncPtr_glProgramUniform3ivEXT=GLee_Lazy_glProgramUniform3ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform4ivEXT -#define GLEE_C_DEFINED_glProgramUniform4ivEXT - void __stdcall GLee_Lazy_glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform4ivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC GLeeFuncPtr_glProgramUniform4ivEXT=GLee_Lazy_glProgramUniform4ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix2fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix2fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2fvEXT=GLee_Lazy_glProgramUniformMatrix2fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix3fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix3fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3fvEXT=GLee_Lazy_glProgramUniformMatrix3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix4fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix4fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4fvEXT=GLee_Lazy_glProgramUniformMatrix4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2x3fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix2x3fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix2x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT=GLee_Lazy_glProgramUniformMatrix2x3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3x2fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix3x2fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix3x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT=GLee_Lazy_glProgramUniformMatrix3x2fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2x4fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix2x4fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix2x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT=GLee_Lazy_glProgramUniformMatrix2x4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4x2fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix4x2fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix4x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT=GLee_Lazy_glProgramUniformMatrix4x2fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3x4fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix3x4fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix3x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT=GLee_Lazy_glProgramUniformMatrix3x4fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4x3fvEXT -#define GLEE_C_DEFINED_glProgramUniformMatrix4x3fvEXT - void __stdcall GLee_Lazy_glProgramUniformMatrix4x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value);} - GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT=GLee_Lazy_glProgramUniformMatrix4x3fvEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform1uiEXT -#define GLEE_C_DEFINED_glProgramUniform1uiEXT - void __stdcall GLee_Lazy_glProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0) {if (GLeeInit()) glProgramUniform1uiEXT(program, location, v0);} - GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC GLeeFuncPtr_glProgramUniform1uiEXT=GLee_Lazy_glProgramUniform1uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform2uiEXT -#define GLEE_C_DEFINED_glProgramUniform2uiEXT - void __stdcall GLee_Lazy_glProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1) {if (GLeeInit()) glProgramUniform2uiEXT(program, location, v0, v1);} - GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC GLeeFuncPtr_glProgramUniform2uiEXT=GLee_Lazy_glProgramUniform2uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform3uiEXT -#define GLEE_C_DEFINED_glProgramUniform3uiEXT - void __stdcall GLee_Lazy_glProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) {if (GLeeInit()) glProgramUniform3uiEXT(program, location, v0, v1, v2);} - GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC GLeeFuncPtr_glProgramUniform3uiEXT=GLee_Lazy_glProgramUniform3uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform4uiEXT -#define GLEE_C_DEFINED_glProgramUniform4uiEXT - void __stdcall GLee_Lazy_glProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {if (GLeeInit()) glProgramUniform4uiEXT(program, location, v0, v1, v2, v3);} - GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC GLeeFuncPtr_glProgramUniform4uiEXT=GLee_Lazy_glProgramUniform4uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform1uivEXT -#define GLEE_C_DEFINED_glProgramUniform1uivEXT - void __stdcall GLee_Lazy_glProgramUniform1uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform1uivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC GLeeFuncPtr_glProgramUniform1uivEXT=GLee_Lazy_glProgramUniform1uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform2uivEXT -#define GLEE_C_DEFINED_glProgramUniform2uivEXT - void __stdcall GLee_Lazy_glProgramUniform2uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform2uivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC GLeeFuncPtr_glProgramUniform2uivEXT=GLee_Lazy_glProgramUniform2uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform3uivEXT -#define GLEE_C_DEFINED_glProgramUniform3uivEXT - void __stdcall GLee_Lazy_glProgramUniform3uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform3uivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC GLeeFuncPtr_glProgramUniform3uivEXT=GLee_Lazy_glProgramUniform3uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glProgramUniform4uivEXT -#define GLEE_C_DEFINED_glProgramUniform4uivEXT - void __stdcall GLee_Lazy_glProgramUniform4uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform4uivEXT(program, location, count, value);} - GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC GLeeFuncPtr_glProgramUniform4uivEXT=GLee_Lazy_glProgramUniform4uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedBufferDataEXT -#define GLEE_C_DEFINED_glNamedBufferDataEXT - void __stdcall GLee_Lazy_glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage) {if (GLeeInit()) glNamedBufferDataEXT(buffer, size, data, usage);} - GLEEPFNGLNAMEDBUFFERDATAEXTPROC GLeeFuncPtr_glNamedBufferDataEXT=GLee_Lazy_glNamedBufferDataEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedBufferSubDataEXT -#define GLEE_C_DEFINED_glNamedBufferSubDataEXT - void __stdcall GLee_Lazy_glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data) {if (GLeeInit()) glNamedBufferSubDataEXT(buffer, offset, size, data);} - GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glNamedBufferSubDataEXT=GLee_Lazy_glNamedBufferSubDataEXT; -#endif -#ifndef GLEE_C_DEFINED_glMapNamedBufferEXT -#define GLEE_C_DEFINED_glMapNamedBufferEXT - GLvoid* __stdcall GLee_Lazy_glMapNamedBufferEXT(GLuint buffer, GLenum access) {if (GLeeInit()) return glMapNamedBufferEXT(buffer, access); return (GLvoid*)0;} - GLEEPFNGLMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glMapNamedBufferEXT=GLee_Lazy_glMapNamedBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glUnmapNamedBufferEXT -#define GLEE_C_DEFINED_glUnmapNamedBufferEXT - GLboolean __stdcall GLee_Lazy_glUnmapNamedBufferEXT(GLuint buffer) {if (GLeeInit()) return glUnmapNamedBufferEXT(buffer); return (GLboolean)0;} - GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glUnmapNamedBufferEXT=GLee_Lazy_glUnmapNamedBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedBufferParameterivEXT -#define GLEE_C_DEFINED_glGetNamedBufferParameterivEXT - void __stdcall GLee_Lazy_glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedBufferParameterivEXT(buffer, pname, params);} - GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedBufferParameterivEXT=GLee_Lazy_glGetNamedBufferParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedBufferPointervEXT -#define GLEE_C_DEFINED_glGetNamedBufferPointervEXT - void __stdcall GLee_Lazy_glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetNamedBufferPointervEXT(buffer, pname, params);} - GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC GLeeFuncPtr_glGetNamedBufferPointervEXT=GLee_Lazy_glGetNamedBufferPointervEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedBufferSubDataEXT -#define GLEE_C_DEFINED_glGetNamedBufferSubDataEXT - void __stdcall GLee_Lazy_glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data) {if (GLeeInit()) glGetNamedBufferSubDataEXT(buffer, offset, size, data);} - GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glGetNamedBufferSubDataEXT=GLee_Lazy_glGetNamedBufferSubDataEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureBufferEXT -#define GLEE_C_DEFINED_glTextureBufferEXT - void __stdcall GLee_Lazy_glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glTextureBufferEXT(texture, target, internalformat, buffer);} - GLEEPFNGLTEXTUREBUFFEREXTPROC GLeeFuncPtr_glTextureBufferEXT=GLee_Lazy_glTextureBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexBufferEXT -#define GLEE_C_DEFINED_glMultiTexBufferEXT - void __stdcall GLee_Lazy_glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glMultiTexBufferEXT(texunit, target, internalformat, buffer);} - GLEEPFNGLMULTITEXBUFFEREXTPROC GLeeFuncPtr_glMultiTexBufferEXT=GLee_Lazy_glMultiTexBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageEXT -#define GLEE_C_DEFINED_glNamedRenderbufferStorageEXT - void __stdcall GLee_Lazy_glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height);} - GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageEXT=GLee_Lazy_glNamedRenderbufferStorageEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedRenderbufferParameterivEXT -#define GLEE_C_DEFINED_glGetNamedRenderbufferParameterivEXT - void __stdcall GLee_Lazy_glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params);} - GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT=GLee_Lazy_glGetNamedRenderbufferParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glCheckNamedFramebufferStatusEXT -#define GLEE_C_DEFINED_glCheckNamedFramebufferStatusEXT - GLenum __stdcall GLee_Lazy_glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) {if (GLeeInit()) return glCheckNamedFramebufferStatusEXT(framebuffer, target); return (GLenum)0;} - GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckNamedFramebufferStatusEXT=GLee_Lazy_glCheckNamedFramebufferStatusEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture1DEXT -#define GLEE_C_DEFINED_glNamedFramebufferTexture1DEXT - void __stdcall GLee_Lazy_glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);} - GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture1DEXT=GLee_Lazy_glNamedFramebufferTexture1DEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture2DEXT -#define GLEE_C_DEFINED_glNamedFramebufferTexture2DEXT - void __stdcall GLee_Lazy_glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level);} - GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture2DEXT=GLee_Lazy_glNamedFramebufferTexture2DEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture3DEXT -#define GLEE_C_DEFINED_glNamedFramebufferTexture3DEXT - void __stdcall GLee_Lazy_glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {if (GLeeInit()) glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);} - GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture3DEXT=GLee_Lazy_glNamedFramebufferTexture3DEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferRenderbufferEXT -#define GLEE_C_DEFINED_glNamedFramebufferRenderbufferEXT - void __stdcall GLee_Lazy_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {if (GLeeInit()) glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer);} - GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glNamedFramebufferRenderbufferEXT=GLee_Lazy_glNamedFramebufferRenderbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT -#define GLEE_C_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT - void __stdcall GLee_Lazy_glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params);} - GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT=GLee_Lazy_glGetNamedFramebufferAttachmentParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenerateTextureMipmapEXT -#define GLEE_C_DEFINED_glGenerateTextureMipmapEXT - void __stdcall GLee_Lazy_glGenerateTextureMipmapEXT(GLuint texture, GLenum target) {if (GLeeInit()) glGenerateTextureMipmapEXT(texture, target);} - GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC GLeeFuncPtr_glGenerateTextureMipmapEXT=GLee_Lazy_glGenerateTextureMipmapEXT; -#endif -#ifndef GLEE_C_DEFINED_glGenerateMultiTexMipmapEXT -#define GLEE_C_DEFINED_glGenerateMultiTexMipmapEXT - void __stdcall GLee_Lazy_glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) {if (GLeeInit()) glGenerateMultiTexMipmapEXT(texunit, target);} - GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC GLeeFuncPtr_glGenerateMultiTexMipmapEXT=GLee_Lazy_glGenerateMultiTexMipmapEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferDrawBufferEXT -#define GLEE_C_DEFINED_glFramebufferDrawBufferEXT - void __stdcall GLee_Lazy_glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode) {if (GLeeInit()) glFramebufferDrawBufferEXT(framebuffer, mode);} - GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC GLeeFuncPtr_glFramebufferDrawBufferEXT=GLee_Lazy_glFramebufferDrawBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferDrawBuffersEXT -#define GLEE_C_DEFINED_glFramebufferDrawBuffersEXT - void __stdcall GLee_Lazy_glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum * bufs) {if (GLeeInit()) glFramebufferDrawBuffersEXT(framebuffer, n, bufs);} - GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC GLeeFuncPtr_glFramebufferDrawBuffersEXT=GLee_Lazy_glFramebufferDrawBuffersEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferReadBufferEXT -#define GLEE_C_DEFINED_glFramebufferReadBufferEXT - void __stdcall GLee_Lazy_glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode) {if (GLeeInit()) glFramebufferReadBufferEXT(framebuffer, mode);} - GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC GLeeFuncPtr_glFramebufferReadBufferEXT=GLee_Lazy_glFramebufferReadBufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFramebufferParameterivEXT -#define GLEE_C_DEFINED_glGetFramebufferParameterivEXT - void __stdcall GLee_Lazy_glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetFramebufferParameterivEXT(framebuffer, pname, params);} - GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferParameterivEXT=GLee_Lazy_glGetFramebufferParameterivEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleEXT -#define GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleEXT - void __stdcall GLee_Lazy_glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height);} - GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT=GLee_Lazy_glNamedRenderbufferStorageMultisampleEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT -#define GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT - void __stdcall GLee_Lazy_glNamedRenderbufferStorageMultisampleCoverageEXT(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height);} - GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT=GLee_Lazy_glNamedRenderbufferStorageMultisampleCoverageEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureEXT -#define GLEE_C_DEFINED_glNamedFramebufferTextureEXT - void __stdcall GLee_Lazy_glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level);} - GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glNamedFramebufferTextureEXT=GLee_Lazy_glNamedFramebufferTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureLayerEXT -#define GLEE_C_DEFINED_glNamedFramebufferTextureLayerEXT - void __stdcall GLee_Lazy_glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer);} - GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glNamedFramebufferTextureLayerEXT=GLee_Lazy_glNamedFramebufferTextureLayerEXT; -#endif -#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureFaceEXT -#define GLEE_C_DEFINED_glNamedFramebufferTextureFaceEXT - void __stdcall GLee_Lazy_glNamedFramebufferTextureFaceEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face);} - GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glNamedFramebufferTextureFaceEXT=GLee_Lazy_glNamedFramebufferTextureFaceEXT; -#endif -#ifndef GLEE_C_DEFINED_glTextureRenderbufferEXT -#define GLEE_C_DEFINED_glTextureRenderbufferEXT - void __stdcall GLee_Lazy_glTextureRenderbufferEXT(GLuint texture, GLenum target, GLuint renderbuffer) {if (GLeeInit()) glTextureRenderbufferEXT(texture, target, renderbuffer);} - GLEEPFNGLTEXTURERENDERBUFFEREXTPROC GLeeFuncPtr_glTextureRenderbufferEXT=GLee_Lazy_glTextureRenderbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_glMultiTexRenderbufferEXT -#define GLEE_C_DEFINED_glMultiTexRenderbufferEXT - void __stdcall GLee_Lazy_glMultiTexRenderbufferEXT(GLenum texunit, GLenum target, GLuint renderbuffer) {if (GLeeInit()) glMultiTexRenderbufferEXT(texunit, target, renderbuffer);} - GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC GLeeFuncPtr_glMultiTexRenderbufferEXT=GLee_Lazy_glMultiTexRenderbufferEXT; -#endif -#endif - -/* GL_EXT_vertex_array_bgra */ - -#ifdef __GLEE_GL_EXT_vertex_array_bgra -#endif - -/* GL_EXT_texture_swizzle */ - -#ifdef __GLEE_GL_EXT_texture_swizzle -#endif - -/* GL_NV_explicit_multisample */ - -#ifdef __GLEE_GL_NV_explicit_multisample -#ifndef GLEE_C_DEFINED_glGetMultisamplefvNV -#define GLEE_C_DEFINED_glGetMultisamplefvNV - void __stdcall GLee_Lazy_glGetMultisamplefvNV(GLenum pname, GLuint index, GLfloat * val) {if (GLeeInit()) glGetMultisamplefvNV(pname, index, val);} - GLEEPFNGLGETMULTISAMPLEFVNVPROC GLeeFuncPtr_glGetMultisamplefvNV=GLee_Lazy_glGetMultisamplefvNV; -#endif -#ifndef GLEE_C_DEFINED_glSampleMaskIndexedNV -#define GLEE_C_DEFINED_glSampleMaskIndexedNV - void __stdcall GLee_Lazy_glSampleMaskIndexedNV(GLuint index, GLbitfield mask) {if (GLeeInit()) glSampleMaskIndexedNV(index, mask);} - GLEEPFNGLSAMPLEMASKINDEXEDNVPROC GLeeFuncPtr_glSampleMaskIndexedNV=GLee_Lazy_glSampleMaskIndexedNV; -#endif -#ifndef GLEE_C_DEFINED_glTexRenderbufferNV -#define GLEE_C_DEFINED_glTexRenderbufferNV - void __stdcall GLee_Lazy_glTexRenderbufferNV(GLenum target, GLuint renderbuffer) {if (GLeeInit()) glTexRenderbufferNV(target, renderbuffer);} - GLEEPFNGLTEXRENDERBUFFERNVPROC GLeeFuncPtr_glTexRenderbufferNV=GLee_Lazy_glTexRenderbufferNV; -#endif -#endif - -/* GL_NV_transform_feedback2 */ - -#ifdef __GLEE_GL_NV_transform_feedback2 -#ifndef GLEE_C_DEFINED_glBindTransformFeedbackNV -#define GLEE_C_DEFINED_glBindTransformFeedbackNV - void __stdcall GLee_Lazy_glBindTransformFeedbackNV(GLenum target, GLuint id) {if (GLeeInit()) glBindTransformFeedbackNV(target, id);} - GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBindTransformFeedbackNV=GLee_Lazy_glBindTransformFeedbackNV; -#endif -#ifndef GLEE_C_DEFINED_glDeleteTransformFeedbacksNV -#define GLEE_C_DEFINED_glDeleteTransformFeedbacksNV - void __stdcall GLee_Lazy_glDeleteTransformFeedbacksNV(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteTransformFeedbacksNV(n, ids);} - GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glDeleteTransformFeedbacksNV=GLee_Lazy_glDeleteTransformFeedbacksNV; -#endif -#ifndef GLEE_C_DEFINED_glGenTransformFeedbacksNV -#define GLEE_C_DEFINED_glGenTransformFeedbacksNV - void __stdcall GLee_Lazy_glGenTransformFeedbacksNV(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenTransformFeedbacksNV(n, ids);} - GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glGenTransformFeedbacksNV=GLee_Lazy_glGenTransformFeedbacksNV; -#endif -#ifndef GLEE_C_DEFINED_glIsTransformFeedbackNV -#define GLEE_C_DEFINED_glIsTransformFeedbackNV - GLboolean __stdcall GLee_Lazy_glIsTransformFeedbackNV(GLuint id) {if (GLeeInit()) return glIsTransformFeedbackNV(id); return (GLboolean)0;} - GLEEPFNGLISTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glIsTransformFeedbackNV=GLee_Lazy_glIsTransformFeedbackNV; -#endif -#ifndef GLEE_C_DEFINED_glPauseTransformFeedbackNV -#define GLEE_C_DEFINED_glPauseTransformFeedbackNV - void __stdcall GLee_Lazy_glPauseTransformFeedbackNV(void) {if (GLeeInit()) glPauseTransformFeedbackNV();} - GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glPauseTransformFeedbackNV=GLee_Lazy_glPauseTransformFeedbackNV; -#endif -#ifndef GLEE_C_DEFINED_glResumeTransformFeedbackNV -#define GLEE_C_DEFINED_glResumeTransformFeedbackNV - void __stdcall GLee_Lazy_glResumeTransformFeedbackNV(void) {if (GLeeInit()) glResumeTransformFeedbackNV();} - GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glResumeTransformFeedbackNV=GLee_Lazy_glResumeTransformFeedbackNV; -#endif -#ifndef GLEE_C_DEFINED_glDrawTransformFeedbackNV -#define GLEE_C_DEFINED_glDrawTransformFeedbackNV - void __stdcall GLee_Lazy_glDrawTransformFeedbackNV(GLenum mode, GLuint id) {if (GLeeInit()) glDrawTransformFeedbackNV(mode, id);} - GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glDrawTransformFeedbackNV=GLee_Lazy_glDrawTransformFeedbackNV; -#endif -#endif - -/* GL_SGIX_texture_select */ - -#ifdef __GLEE_GL_SGIX_texture_select -#endif - -/* GL_INGR_blend_func_separate */ - -#ifdef __GLEE_GL_INGR_blend_func_separate -#ifndef GLEE_C_DEFINED_glBlendFuncSeparateINGR -#define GLEE_C_DEFINED_glBlendFuncSeparateINGR - void __stdcall GLee_Lazy_glBlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) {if (GLeeInit()) glBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);} - GLEEPFNGLBLENDFUNCSEPARATEINGRPROC GLeeFuncPtr_glBlendFuncSeparateINGR=GLee_Lazy_glBlendFuncSeparateINGR; -#endif -#endif - -/* GL_SGIX_depth_pass_instrument */ - -#ifdef __GLEE_GL_SGIX_depth_pass_instrument -#endif - -/* GL_SGIX_igloo_interface */ - -#ifdef __GLEE_GL_SGIX_igloo_interface -#ifndef GLEE_C_DEFINED_glIglooInterfaceSGIX -#define GLEE_C_DEFINED_glIglooInterfaceSGIX - void __stdcall GLee_Lazy_glIglooInterfaceSGIX(GLenum pname, const GLvoid * params) {if (GLeeInit()) glIglooInterfaceSGIX(pname, params);} - GLEEPFNGLIGLOOINTERFACESGIXPROC GLeeFuncPtr_glIglooInterfaceSGIX=GLee_Lazy_glIglooInterfaceSGIX; -#endif -#endif - -/* GL_EXT_fragment_lighting */ - -#ifdef __GLEE_GL_EXT_fragment_lighting -#ifndef GLEE_C_DEFINED_glFragmentLightModeliEXT -#define GLEE_C_DEFINED_glFragmentLightModeliEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightModeliEXT(GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightModeliEXT(pname, param);} - GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC GLeeFuncPtr_glFragmentLightModeliEXT=GLee_Lazy_glFragmentLightModeliEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModelfEXT -#define GLEE_C_DEFINED_glFragmentLightModelfEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightModelfEXT(GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightModelfEXT(pname, param);} - GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC GLeeFuncPtr_glFragmentLightModelfEXT=GLee_Lazy_glFragmentLightModelfEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModelivEXT -#define GLEE_C_DEFINED_glFragmentLightModelivEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightModelivEXT(GLenum pname, GLint * params) {if (GLeeInit()) glFragmentLightModelivEXT(pname, params);} - GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC GLeeFuncPtr_glFragmentLightModelivEXT=GLee_Lazy_glFragmentLightModelivEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightModelfvEXT -#define GLEE_C_DEFINED_glFragmentLightModelfvEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightModelfvEXT(GLenum pname, GLfloat * params) {if (GLeeInit()) glFragmentLightModelfvEXT(pname, params);} - GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC GLeeFuncPtr_glFragmentLightModelfvEXT=GLee_Lazy_glFragmentLightModelfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightiEXT -#define GLEE_C_DEFINED_glFragmentLightiEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightiEXT(GLenum light, GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightiEXT(light, pname, param);} - GLEEPFNGLFRAGMENTLIGHTIEXTPROC GLeeFuncPtr_glFragmentLightiEXT=GLee_Lazy_glFragmentLightiEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightfEXT -#define GLEE_C_DEFINED_glFragmentLightfEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightfEXT(GLenum light, GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightfEXT(light, pname, param);} - GLEEPFNGLFRAGMENTLIGHTFEXTPROC GLeeFuncPtr_glFragmentLightfEXT=GLee_Lazy_glFragmentLightfEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightivEXT -#define GLEE_C_DEFINED_glFragmentLightivEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightivEXT(GLenum light, GLenum pname, GLint * params) {if (GLeeInit()) glFragmentLightivEXT(light, pname, params);} - GLEEPFNGLFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glFragmentLightivEXT=GLee_Lazy_glFragmentLightivEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentLightfvEXT -#define GLEE_C_DEFINED_glFragmentLightfvEXT - GLvoid __stdcall GLee_Lazy_glFragmentLightfvEXT(GLenum light, GLenum pname, GLfloat * params) {if (GLeeInit()) glFragmentLightfvEXT(light, pname, params);} - GLEEPFNGLFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glFragmentLightfvEXT=GLee_Lazy_glFragmentLightfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentLightivEXT -#define GLEE_C_DEFINED_glGetFragmentLightivEXT - GLvoid __stdcall GLee_Lazy_glGetFragmentLightivEXT(GLenum light, GLenum pname, GLint * params) {if (GLeeInit()) glGetFragmentLightivEXT(light, pname, params);} - GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glGetFragmentLightivEXT=GLee_Lazy_glGetFragmentLightivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentLightfvEXT -#define GLEE_C_DEFINED_glGetFragmentLightfvEXT - GLvoid __stdcall GLee_Lazy_glGetFragmentLightfvEXT(GLenum light, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFragmentLightfvEXT(light, pname, params);} - GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glGetFragmentLightfvEXT=GLee_Lazy_glGetFragmentLightfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialfEXT -#define GLEE_C_DEFINED_glFragmentMaterialfEXT - GLvoid __stdcall GLee_Lazy_glFragmentMaterialfEXT(GLenum face, GLenum pname, const GLfloat param) {if (GLeeInit()) glFragmentMaterialfEXT(face, pname, param);} - GLEEPFNGLFRAGMENTMATERIALFEXTPROC GLeeFuncPtr_glFragmentMaterialfEXT=GLee_Lazy_glFragmentMaterialfEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialiEXT -#define GLEE_C_DEFINED_glFragmentMaterialiEXT - GLvoid __stdcall GLee_Lazy_glFragmentMaterialiEXT(GLenum face, GLenum pname, const GLint param) {if (GLeeInit()) glFragmentMaterialiEXT(face, pname, param);} - GLEEPFNGLFRAGMENTMATERIALIEXTPROC GLeeFuncPtr_glFragmentMaterialiEXT=GLee_Lazy_glFragmentMaterialiEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialfvEXT -#define GLEE_C_DEFINED_glFragmentMaterialfvEXT - GLvoid __stdcall GLee_Lazy_glFragmentMaterialfvEXT(GLenum face, GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentMaterialfvEXT(face, pname, params);} - GLEEPFNGLFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glFragmentMaterialfvEXT=GLee_Lazy_glFragmentMaterialfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentMaterialivEXT -#define GLEE_C_DEFINED_glFragmentMaterialivEXT - GLvoid __stdcall GLee_Lazy_glFragmentMaterialivEXT(GLenum face, GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentMaterialivEXT(face, pname, params);} - GLEEPFNGLFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glFragmentMaterialivEXT=GLee_Lazy_glFragmentMaterialivEXT; -#endif -#ifndef GLEE_C_DEFINED_glFragmentColorMaterialEXT -#define GLEE_C_DEFINED_glFragmentColorMaterialEXT - GLvoid __stdcall GLee_Lazy_glFragmentColorMaterialEXT(GLenum face, GLenum mode) {if (GLeeInit()) glFragmentColorMaterialEXT(face, mode);} - GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC GLeeFuncPtr_glFragmentColorMaterialEXT=GLee_Lazy_glFragmentColorMaterialEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentMaterialfvEXT -#define GLEE_C_DEFINED_glGetFragmentMaterialfvEXT - GLvoid __stdcall GLee_Lazy_glGetFragmentMaterialfvEXT(GLenum face, GLenum pname, const GLfloat * params) {if (GLeeInit()) glGetFragmentMaterialfvEXT(face, pname, params);} - GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glGetFragmentMaterialfvEXT=GLee_Lazy_glGetFragmentMaterialfvEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetFragmentMaterialivEXT -#define GLEE_C_DEFINED_glGetFragmentMaterialivEXT - GLvoid __stdcall GLee_Lazy_glGetFragmentMaterialivEXT(GLenum face, GLenum pname, const GLint * params) {if (GLeeInit()) glGetFragmentMaterialivEXT(face, pname, params);} - GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glGetFragmentMaterialivEXT=GLee_Lazy_glGetFragmentMaterialivEXT; -#endif -#ifndef GLEE_C_DEFINED_glLightEnviEXT -#define GLEE_C_DEFINED_glLightEnviEXT - GLvoid __stdcall GLee_Lazy_glLightEnviEXT(GLenum pname, GLint param) {if (GLeeInit()) glLightEnviEXT(pname, param);} - GLEEPFNGLLIGHTENVIEXTPROC GLeeFuncPtr_glLightEnviEXT=GLee_Lazy_glLightEnviEXT; -#endif -#endif - -/* GL_EXT_geometry_shader4 */ - -#ifdef __GLEE_GL_EXT_geometry_shader4 -#ifndef GLEE_C_DEFINED_glProgramParameteriEXT -#define GLEE_C_DEFINED_glProgramParameteriEXT - GLvoid __stdcall GLee_Lazy_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value) {if (GLeeInit()) glProgramParameteriEXT(program, pname, value);} - GLEEPFNGLPROGRAMPARAMETERIEXTPROC GLeeFuncPtr_glProgramParameteriEXT=GLee_Lazy_glProgramParameteriEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureEXT -#define GLEE_C_DEFINED_glFramebufferTextureEXT - GLvoid __stdcall GLee_Lazy_glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTextureEXT(target, attachment, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT=GLee_Lazy_glFramebufferTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerEXT -#define GLEE_C_DEFINED_glFramebufferTextureLayerEXT - GLvoid __stdcall GLee_Lazy_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);} - GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT=GLee_Lazy_glFramebufferTextureLayerEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceEXT -#define GLEE_C_DEFINED_glFramebufferTextureFaceEXT - GLvoid __stdcall GLee_Lazy_glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glFramebufferTextureFaceEXT(target, attachment, texture, level, face);} - GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT=GLee_Lazy_glFramebufferTextureFaceEXT; -#endif -#endif - -/* GL_EXT_scene_marker */ - -#ifdef __GLEE_GL_EXT_scene_marker -#ifndef GLEE_C_DEFINED_glBeginSceneEXT -#define GLEE_C_DEFINED_glBeginSceneEXT - GLvoid __stdcall GLee_Lazy_glBeginSceneEXT(void) {if (GLeeInit()) glBeginSceneEXT();} - GLEEPFNGLBEGINSCENEEXTPROC GLeeFuncPtr_glBeginSceneEXT=GLee_Lazy_glBeginSceneEXT; -#endif -#ifndef GLEE_C_DEFINED_glEndSceneEXT -#define GLEE_C_DEFINED_glEndSceneEXT - GLvoid __stdcall GLee_Lazy_glEndSceneEXT(void) {if (GLeeInit()) glEndSceneEXT();} - GLEEPFNGLENDSCENEEXTPROC GLeeFuncPtr_glEndSceneEXT=GLee_Lazy_glEndSceneEXT; -#endif -#endif - -/* GL_EXT_texture_compression_dxt1 */ - -#ifdef __GLEE_GL_EXT_texture_compression_dxt1 -#endif - -/* GL_EXT_texture_env */ - -#ifdef __GLEE_GL_EXT_texture_env -#endif - -/* GL_IBM_static_data */ - -#ifdef __GLEE_GL_IBM_static_data -#endif - -/* GL_NV_gpu_program4 */ - -#ifdef __GLEE_GL_NV_gpu_program4 -#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4iNV -#define GLEE_C_DEFINED_glProgramLocalParameterI4iNV - GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glProgramLocalParameterI4iNV(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC GLeeFuncPtr_glProgramLocalParameterI4iNV=GLee_Lazy_glProgramLocalParameterI4iNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4ivNV -#define GLEE_C_DEFINED_glProgramLocalParameterI4ivNV - GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4ivNV(GLenum target, GLuint index, const GLint * params) {if (GLeeInit()) glProgramLocalParameterI4ivNV(target, index, params);} - GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramLocalParameterI4ivNV=GLee_Lazy_glProgramLocalParameterI4ivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParametersI4ivNV -#define GLEE_C_DEFINED_glProgramLocalParametersI4ivNV - GLvoid __stdcall GLee_Lazy_glProgramLocalParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glProgramLocalParametersI4ivNV(target, index, count, params);} - GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramLocalParametersI4ivNV=GLee_Lazy_glProgramLocalParametersI4ivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4uiNV -#define GLEE_C_DEFINED_glProgramLocalParameterI4uiNV - GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glProgramLocalParameterI4uiNV(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC GLeeFuncPtr_glProgramLocalParameterI4uiNV=GLee_Lazy_glProgramLocalParameterI4uiNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4uivNV -#define GLEE_C_DEFINED_glProgramLocalParameterI4uivNV - GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4uivNV(GLenum target, GLuint index, const GLuint * params) {if (GLeeInit()) glProgramLocalParameterI4uivNV(target, index, params);} - GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramLocalParameterI4uivNV=GLee_Lazy_glProgramLocalParameterI4uivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramLocalParametersI4uivNV -#define GLEE_C_DEFINED_glProgramLocalParametersI4uivNV - GLvoid __stdcall GLee_Lazy_glProgramLocalParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glProgramLocalParametersI4uivNV(target, index, count, params);} - GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramLocalParametersI4uivNV=GLee_Lazy_glProgramLocalParametersI4uivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4iNV -#define GLEE_C_DEFINED_glProgramEnvParameterI4iNV - GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glProgramEnvParameterI4iNV(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC GLeeFuncPtr_glProgramEnvParameterI4iNV=GLee_Lazy_glProgramEnvParameterI4iNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4ivNV -#define GLEE_C_DEFINED_glProgramEnvParameterI4ivNV - GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4ivNV(GLenum target, GLuint index, const GLint * params) {if (GLeeInit()) glProgramEnvParameterI4ivNV(target, index, params);} - GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramEnvParameterI4ivNV=GLee_Lazy_glProgramEnvParameterI4ivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParametersI4ivNV -#define GLEE_C_DEFINED_glProgramEnvParametersI4ivNV - GLvoid __stdcall GLee_Lazy_glProgramEnvParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glProgramEnvParametersI4ivNV(target, index, count, params);} - GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramEnvParametersI4ivNV=GLee_Lazy_glProgramEnvParametersI4ivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4uiNV -#define GLEE_C_DEFINED_glProgramEnvParameterI4uiNV - GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glProgramEnvParameterI4uiNV(target, index, x, y, z, w);} - GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC GLeeFuncPtr_glProgramEnvParameterI4uiNV=GLee_Lazy_glProgramEnvParameterI4uiNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4uivNV -#define GLEE_C_DEFINED_glProgramEnvParameterI4uivNV - GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4uivNV(GLenum target, GLuint index, const GLuint * params) {if (GLeeInit()) glProgramEnvParameterI4uivNV(target, index, params);} - GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramEnvParameterI4uivNV=GLee_Lazy_glProgramEnvParameterI4uivNV; -#endif -#ifndef GLEE_C_DEFINED_glProgramEnvParametersI4uivNV -#define GLEE_C_DEFINED_glProgramEnvParametersI4uivNV - GLvoid __stdcall GLee_Lazy_glProgramEnvParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glProgramEnvParametersI4uivNV(target, index, count, params);} - GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramEnvParametersI4uivNV=GLee_Lazy_glProgramEnvParametersI4uivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterIivNV -#define GLEE_C_DEFINED_glGetProgramLocalParameterIivNV - GLvoid __stdcall GLee_Lazy_glGetProgramLocalParameterIivNV(GLenum target, GLuint index, GLint * params) {if (GLeeInit()) glGetProgramLocalParameterIivNV(target, index, params);} - GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIivNV=GLee_Lazy_glGetProgramLocalParameterIivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterIuivNV -#define GLEE_C_DEFINED_glGetProgramLocalParameterIuivNV - GLvoid __stdcall GLee_Lazy_glGetProgramLocalParameterIuivNV(GLenum target, GLuint index, GLuint * params) {if (GLeeInit()) glGetProgramLocalParameterIuivNV(target, index, params);} - GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIuivNV=GLee_Lazy_glGetProgramLocalParameterIuivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterIivNV -#define GLEE_C_DEFINED_glGetProgramEnvParameterIivNV - GLvoid __stdcall GLee_Lazy_glGetProgramEnvParameterIivNV(GLenum target, GLuint index, GLint * params) {if (GLeeInit()) glGetProgramEnvParameterIivNV(target, index, params);} - GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIivNV=GLee_Lazy_glGetProgramEnvParameterIivNV; -#endif -#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterIuivNV -#define GLEE_C_DEFINED_glGetProgramEnvParameterIuivNV - GLvoid __stdcall GLee_Lazy_glGetProgramEnvParameterIuivNV(GLenum target, GLuint index, GLuint * params) {if (GLeeInit()) glGetProgramEnvParameterIuivNV(target, index, params);} - GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIuivNV=GLee_Lazy_glGetProgramEnvParameterIuivNV; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureEXT -#define GLEE_C_DEFINED_glFramebufferTextureEXT - GLvoid __stdcall GLee_Lazy_glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTextureEXT(target, attachment, texture, level);} - GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT=GLee_Lazy_glFramebufferTextureEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerEXT -#define GLEE_C_DEFINED_glFramebufferTextureLayerEXT - GLvoid __stdcall GLee_Lazy_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);} - GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT=GLee_Lazy_glFramebufferTextureLayerEXT; -#endif -#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceEXT -#define GLEE_C_DEFINED_glFramebufferTextureFaceEXT - GLvoid __stdcall GLee_Lazy_glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glFramebufferTextureFaceEXT(target, attachment, texture, level, face);} - GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT=GLee_Lazy_glFramebufferTextureFaceEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2iEXT -#define GLEE_C_DEFINED_glVertexAttribI2iEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI2iEXT(GLuint index, GLint x, GLint y) {if (GLeeInit()) glVertexAttribI2iEXT(index, x, y);} - GLEEPFNGLVERTEXATTRIBI2IEXTPROC GLeeFuncPtr_glVertexAttribI2iEXT=GLee_Lazy_glVertexAttribI2iEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3iEXT -#define GLEE_C_DEFINED_glVertexAttribI3iEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI3iEXT(GLuint index, GLint x, GLint y, GLint z) {if (GLeeInit()) glVertexAttribI3iEXT(index, x, y, z);} - GLEEPFNGLVERTEXATTRIBI3IEXTPROC GLeeFuncPtr_glVertexAttribI3iEXT=GLee_Lazy_glVertexAttribI3iEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4iEXT -#define GLEE_C_DEFINED_glVertexAttribI4iEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4iEXT(GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glVertexAttribI4iEXT(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIBI4IEXTPROC GLeeFuncPtr_glVertexAttribI4iEXT=GLee_Lazy_glVertexAttribI4iEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1uiEXT -#define GLEE_C_DEFINED_glVertexAttribI1uiEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI1uiEXT(GLuint index, GLuint x) {if (GLeeInit()) glVertexAttribI1uiEXT(index, x);} - GLEEPFNGLVERTEXATTRIBI1UIEXTPROC GLeeFuncPtr_glVertexAttribI1uiEXT=GLee_Lazy_glVertexAttribI1uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2uiEXT -#define GLEE_C_DEFINED_glVertexAttribI2uiEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI2uiEXT(GLuint index, GLuint x, GLuint y) {if (GLeeInit()) glVertexAttribI2uiEXT(index, x, y);} - GLEEPFNGLVERTEXATTRIBI2UIEXTPROC GLeeFuncPtr_glVertexAttribI2uiEXT=GLee_Lazy_glVertexAttribI2uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3uiEXT -#define GLEE_C_DEFINED_glVertexAttribI3uiEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI3uiEXT(GLuint index, GLuint x, GLuint y, GLuint z) {if (GLeeInit()) glVertexAttribI3uiEXT(index, x, y, z);} - GLEEPFNGLVERTEXATTRIBI3UIEXTPROC GLeeFuncPtr_glVertexAttribI3uiEXT=GLee_Lazy_glVertexAttribI3uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4uiEXT -#define GLEE_C_DEFINED_glVertexAttribI4uiEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4uiEXT(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glVertexAttribI4uiEXT(index, x, y, z, w);} - GLEEPFNGLVERTEXATTRIBI4UIEXTPROC GLeeFuncPtr_glVertexAttribI4uiEXT=GLee_Lazy_glVertexAttribI4uiEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1ivEXT -#define GLEE_C_DEFINED_glVertexAttribI1ivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI1ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI1ivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI1IVEXTPROC GLeeFuncPtr_glVertexAttribI1ivEXT=GLee_Lazy_glVertexAttribI1ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2ivEXT -#define GLEE_C_DEFINED_glVertexAttribI2ivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI2ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI2ivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI2IVEXTPROC GLeeFuncPtr_glVertexAttribI2ivEXT=GLee_Lazy_glVertexAttribI2ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3ivEXT -#define GLEE_C_DEFINED_glVertexAttribI3ivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI3ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI3ivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI3IVEXTPROC GLeeFuncPtr_glVertexAttribI3ivEXT=GLee_Lazy_glVertexAttribI3ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4ivEXT -#define GLEE_C_DEFINED_glVertexAttribI4ivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI4ivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI4IVEXTPROC GLeeFuncPtr_glVertexAttribI4ivEXT=GLee_Lazy_glVertexAttribI4ivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI1uivEXT -#define GLEE_C_DEFINED_glVertexAttribI1uivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI1uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI1uivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC GLeeFuncPtr_glVertexAttribI1uivEXT=GLee_Lazy_glVertexAttribI1uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI2uivEXT -#define GLEE_C_DEFINED_glVertexAttribI2uivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI2uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI2uivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC GLeeFuncPtr_glVertexAttribI2uivEXT=GLee_Lazy_glVertexAttribI2uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI3uivEXT -#define GLEE_C_DEFINED_glVertexAttribI3uivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI3uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI3uivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC GLeeFuncPtr_glVertexAttribI3uivEXT=GLee_Lazy_glVertexAttribI3uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4uivEXT -#define GLEE_C_DEFINED_glVertexAttribI4uivEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI4uivEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC GLeeFuncPtr_glVertexAttribI4uivEXT=GLee_Lazy_glVertexAttribI4uivEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4bvEXT -#define GLEE_C_DEFINED_glVertexAttribI4bvEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4bvEXT(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttribI4bvEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI4BVEXTPROC GLeeFuncPtr_glVertexAttribI4bvEXT=GLee_Lazy_glVertexAttribI4bvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4svEXT -#define GLEE_C_DEFINED_glVertexAttribI4svEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4svEXT(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttribI4svEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI4SVEXTPROC GLeeFuncPtr_glVertexAttribI4svEXT=GLee_Lazy_glVertexAttribI4svEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4ubvEXT -#define GLEE_C_DEFINED_glVertexAttribI4ubvEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4ubvEXT(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttribI4ubvEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC GLeeFuncPtr_glVertexAttribI4ubvEXT=GLee_Lazy_glVertexAttribI4ubvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribI4usvEXT -#define GLEE_C_DEFINED_glVertexAttribI4usvEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribI4usvEXT(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttribI4usvEXT(index, v);} - GLEEPFNGLVERTEXATTRIBI4USVEXTPROC GLeeFuncPtr_glVertexAttribI4usvEXT=GLee_Lazy_glVertexAttribI4usvEXT; -#endif -#ifndef GLEE_C_DEFINED_glVertexAttribIPointerEXT -#define GLEE_C_DEFINED_glVertexAttribIPointerEXT - GLvoid __stdcall GLee_Lazy_glVertexAttribIPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribIPointerEXT(index, size, type, stride, pointer);} - GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC GLeeFuncPtr_glVertexAttribIPointerEXT=GLee_Lazy_glVertexAttribIPointerEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribIivEXT -#define GLEE_C_DEFINED_glGetVertexAttribIivEXT - GLvoid __stdcall GLee_Lazy_glGetVertexAttribIivEXT(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribIivEXT(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC GLeeFuncPtr_glGetVertexAttribIivEXT=GLee_Lazy_glGetVertexAttribIivEXT; -#endif -#ifndef GLEE_C_DEFINED_glGetVertexAttribIuivEXT -#define GLEE_C_DEFINED_glGetVertexAttribIuivEXT - GLvoid __stdcall GLee_Lazy_glGetVertexAttribIuivEXT(GLuint index, GLenum pname, GLuint * params) {if (GLeeInit()) glGetVertexAttribIuivEXT(index, pname, params);} - GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC GLeeFuncPtr_glGetVertexAttribIuivEXT=GLee_Lazy_glGetVertexAttribIuivEXT; -#endif -#endif - -/* GL_OES_byte_coordinates */ - -#ifdef __GLEE_GL_OES_byte_coordinates -#endif - -/* GL_OES_compressed_paletted_texture */ - -#ifdef __GLEE_GL_OES_compressed_paletted_texture -#endif - -/* GL_OES_single_precision */ - -#ifdef __GLEE_GL_OES_single_precision -#ifndef GLEE_C_DEFINED_glDepthRangefOES -#define GLEE_C_DEFINED_glDepthRangefOES - GLvoid __stdcall GLee_Lazy_glDepthRangefOES(GLclampf n, GLclampf f) {if (GLeeInit()) glDepthRangefOES(n, f);} - GLEEPFNGLDEPTHRANGEFOESPROC GLeeFuncPtr_glDepthRangefOES=GLee_Lazy_glDepthRangefOES; -#endif -#ifndef GLEE_C_DEFINED_glFrustumfOES -#define GLEE_C_DEFINED_glFrustumfOES - GLvoid __stdcall GLee_Lazy_glFrustumfOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) {if (GLeeInit()) glFrustumfOES(l, r, b, t, n, f);} - GLEEPFNGLFRUSTUMFOESPROC GLeeFuncPtr_glFrustumfOES=GLee_Lazy_glFrustumfOES; -#endif -#ifndef GLEE_C_DEFINED_glOrthofOES -#define GLEE_C_DEFINED_glOrthofOES - GLvoid __stdcall GLee_Lazy_glOrthofOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) {if (GLeeInit()) glOrthofOES(l, r, b, t, n, f);} - GLEEPFNGLORTHOFOESPROC GLeeFuncPtr_glOrthofOES=GLee_Lazy_glOrthofOES; -#endif -#ifndef GLEE_C_DEFINED_glClipPlanefOES -#define GLEE_C_DEFINED_glClipPlanefOES - GLvoid __stdcall GLee_Lazy_glClipPlanefOES(GLenum plane, const GLfloat* equation) {if (GLeeInit()) glClipPlanefOES(plane, equation);} - GLEEPFNGLCLIPPLANEFOESPROC GLeeFuncPtr_glClipPlanefOES=GLee_Lazy_glClipPlanefOES; -#endif -#ifndef GLEE_C_DEFINED_glGetClipPlanefOES -#define GLEE_C_DEFINED_glGetClipPlanefOES - GLvoid __stdcall GLee_Lazy_glGetClipPlanefOES(GLenum plane, GLfloat* equation) {if (GLeeInit()) glGetClipPlanefOES(plane, equation);} - GLEEPFNGLGETCLIPPLANEFOESPROC GLeeFuncPtr_glGetClipPlanefOES=GLee_Lazy_glGetClipPlanefOES; -#endif -#ifndef GLEE_C_DEFINED_glClearDepthfOES -#define GLEE_C_DEFINED_glClearDepthfOES - GLvoid __stdcall GLee_Lazy_glClearDepthfOES(GLclampd depth) {if (GLeeInit()) glClearDepthfOES(depth);} - GLEEPFNGLCLEARDEPTHFOESPROC GLeeFuncPtr_glClearDepthfOES=GLee_Lazy_glClearDepthfOES; -#endif -#endif - -/* GL_SGIX_pixel_texture_bits */ - -#ifdef __GLEE_GL_SGIX_pixel_texture_bits -#endif - -/* GL_SGIX_texture_range */ - -#ifdef __GLEE_GL_SGIX_texture_range -#endif - -/* WGL */ - -#ifdef WIN32 - -/* Extension querying variables */ - -GLboolean _GLEE_WGL_ARB_buffer_region = GL_FALSE; -GLboolean _GLEE_WGL_ARB_multisample = GL_FALSE; -GLboolean _GLEE_WGL_ARB_extensions_string = GL_FALSE; -GLboolean _GLEE_WGL_ARB_pixel_format = GL_FALSE; -GLboolean _GLEE_WGL_ARB_make_current_read = GL_FALSE; -GLboolean _GLEE_WGL_ARB_pbuffer = GL_FALSE; -GLboolean _GLEE_WGL_ARB_render_texture = GL_FALSE; -GLboolean _GLEE_WGL_ARB_pixel_format_float = GL_FALSE; -GLboolean _GLEE_WGL_ARB_create_context = GL_FALSE; -GLboolean _GLEE_WGL_EXT_make_current_read = GL_FALSE; -GLboolean _GLEE_WGL_EXT_pixel_format = GL_FALSE; -GLboolean _GLEE_WGL_EXT_pbuffer = GL_FALSE; -GLboolean _GLEE_WGL_EXT_depth_float = GL_FALSE; -GLboolean _GLEE_WGL_3DFX_multisample = GL_FALSE; -GLboolean _GLEE_WGL_EXT_multisample = GL_FALSE; -GLboolean _GLEE_WGL_I3D_digital_video_control = GL_FALSE; -GLboolean _GLEE_WGL_I3D_gamma = GL_FALSE; -GLboolean _GLEE_WGL_I3D_genlock = GL_FALSE; -GLboolean _GLEE_WGL_I3D_image_buffer = GL_FALSE; -GLboolean _GLEE_WGL_I3D_swap_frame_lock = GL_FALSE; -GLboolean _GLEE_WGL_NV_render_depth_texture = GL_FALSE; -GLboolean _GLEE_WGL_NV_render_texture_rectangle = GL_FALSE; -GLboolean _GLEE_WGL_ATI_pixel_format_float = GL_FALSE; -GLboolean _GLEE_WGL_NV_float_buffer = GL_FALSE; -GLboolean _GLEE_WGL_3DL_stereo_control = GL_FALSE; -GLboolean _GLEE_WGL_EXT_pixel_format_packed_float = GL_FALSE; -GLboolean _GLEE_WGL_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean _GLEE_WGL_NV_present_video = GL_FALSE; -GLboolean _GLEE_WGL_NV_swap_group = GL_FALSE; -GLboolean _GLEE_WGL_NV_gpu_affinity = GL_FALSE; -GLboolean _GLEE_WGL_EXT_display_color_table = GL_FALSE; -GLboolean _GLEE_WGL_EXT_extensions_string = GL_FALSE; -GLboolean _GLEE_WGL_EXT_swap_control = GL_FALSE; -GLboolean _GLEE_WGL_NV_vertex_array_range = GL_FALSE; -GLboolean _GLEE_WGL_OML_sync_control = GL_FALSE; -GLboolean _GLEE_WGL_I3D_swap_frame_usage = GL_FALSE; -GLboolean _GLEE_WGL_NV_video_output = GL_FALSE; - -/* WGL Extension names */ - -char __GLeeWGLExtensionNames[37][34]={ - "WGL_ARB_buffer_region", - "WGL_ARB_multisample", - "WGL_ARB_extensions_string", - "WGL_ARB_pixel_format", - "WGL_ARB_make_current_read", - "WGL_ARB_pbuffer", - "WGL_ARB_render_texture", - "WGL_ARB_pixel_format_float", - "WGL_ARB_create_context", - "WGL_EXT_make_current_read", - "WGL_EXT_pixel_format", - "WGL_EXT_pbuffer", - "WGL_EXT_depth_float", - "WGL_3DFX_multisample", - "WGL_EXT_multisample", - "WGL_I3D_digital_video_control", - "WGL_I3D_gamma", - "WGL_I3D_genlock", - "WGL_I3D_image_buffer", - "WGL_I3D_swap_frame_lock", - "WGL_NV_render_depth_texture", - "WGL_NV_render_texture_rectangle", - "WGL_ATI_pixel_format_float", - "WGL_NV_float_buffer", - "WGL_3DL_stereo_control", - "WGL_EXT_pixel_format_packed_float", - "WGL_EXT_framebuffer_sRGB", - "WGL_NV_present_video", - "WGL_NV_swap_group", - "WGL_NV_gpu_affinity", - "WGL_EXT_display_color_table", - "WGL_EXT_extensions_string", - "WGL_EXT_swap_control", - "WGL_NV_vertex_array_range", - "WGL_OML_sync_control", - "WGL_I3D_swap_frame_usage", - "WGL_NV_video_output" -}; -int __GLeeWGLNumExtensions=37; - -/* WGL_ARB_buffer_region */ - -#ifdef __GLEE_WGL_ARB_buffer_region -#ifndef GLEE_C_DEFINED_wglCreateBufferRegionARB -#define GLEE_C_DEFINED_wglCreateBufferRegionARB - HANDLE __stdcall GLee_Lazy_wglCreateBufferRegionARB(HDC hDC, int iLayerPlane, UINT uType) {if (GLeeInit()) return wglCreateBufferRegionARB(hDC, iLayerPlane, uType); return (HANDLE)0;} - GLEEPFNWGLCREATEBUFFERREGIONARBPROC GLeeFuncPtr_wglCreateBufferRegionARB=GLee_Lazy_wglCreateBufferRegionARB; -#endif -#ifndef GLEE_C_DEFINED_wglDeleteBufferRegionARB -#define GLEE_C_DEFINED_wglDeleteBufferRegionARB - VOID __stdcall GLee_Lazy_wglDeleteBufferRegionARB(HANDLE hRegion) {if (GLeeInit()) wglDeleteBufferRegionARB(hRegion);} - GLEEPFNWGLDELETEBUFFERREGIONARBPROC GLeeFuncPtr_wglDeleteBufferRegionARB=GLee_Lazy_wglDeleteBufferRegionARB; -#endif -#ifndef GLEE_C_DEFINED_wglSaveBufferRegionARB -#define GLEE_C_DEFINED_wglSaveBufferRegionARB - BOOL __stdcall GLee_Lazy_wglSaveBufferRegionARB(HANDLE hRegion, int x, int y, int width, int height) {if (GLeeInit()) return wglSaveBufferRegionARB(hRegion, x, y, width, height); return (BOOL)0;} - GLEEPFNWGLSAVEBUFFERREGIONARBPROC GLeeFuncPtr_wglSaveBufferRegionARB=GLee_Lazy_wglSaveBufferRegionARB; -#endif -#ifndef GLEE_C_DEFINED_wglRestoreBufferRegionARB -#define GLEE_C_DEFINED_wglRestoreBufferRegionARB - BOOL __stdcall GLee_Lazy_wglRestoreBufferRegionARB(HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc) {if (GLeeInit()) return wglRestoreBufferRegionARB(hRegion, x, y, width, height, xSrc, ySrc); return (BOOL)0;} - GLEEPFNWGLRESTOREBUFFERREGIONARBPROC GLeeFuncPtr_wglRestoreBufferRegionARB=GLee_Lazy_wglRestoreBufferRegionARB; -#endif -#endif - -/* WGL_ARB_multisample */ - -#ifdef __GLEE_WGL_ARB_multisample -#endif - -/* WGL_ARB_extensions_string */ - -#ifdef __GLEE_WGL_ARB_extensions_string -#ifndef GLEE_C_DEFINED_wglGetExtensionsStringARB -#define GLEE_C_DEFINED_wglGetExtensionsStringARB - const char * __stdcall GLee_Lazy_wglGetExtensionsStringARB(HDC hdc) {if (GLeeInit()) return wglGetExtensionsStringARB(hdc); return (const char *)0;} - GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC GLeeFuncPtr_wglGetExtensionsStringARB=GLee_Lazy_wglGetExtensionsStringARB; -#endif -#endif - -/* WGL_ARB_pixel_format */ - -#ifdef __GLEE_WGL_ARB_pixel_format -#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribivARB -#define GLEE_C_DEFINED_wglGetPixelFormatAttribivARB - BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribivARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues) {if (GLeeInit()) return wglGetPixelFormatAttribivARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); return (BOOL)0;} - GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribivARB=GLee_Lazy_wglGetPixelFormatAttribivARB; -#endif -#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribfvARB -#define GLEE_C_DEFINED_wglGetPixelFormatAttribfvARB - BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribfvARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues) {if (GLeeInit()) return wglGetPixelFormatAttribfvARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); return (BOOL)0;} - GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribfvARB=GLee_Lazy_wglGetPixelFormatAttribfvARB; -#endif -#ifndef GLEE_C_DEFINED_wglChoosePixelFormatARB -#define GLEE_C_DEFINED_wglChoosePixelFormatARB - BOOL __stdcall GLee_Lazy_wglChoosePixelFormatARB(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats) {if (GLeeInit()) return wglChoosePixelFormatARB(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); return (BOOL)0;} - GLEEPFNWGLCHOOSEPIXELFORMATARBPROC GLeeFuncPtr_wglChoosePixelFormatARB=GLee_Lazy_wglChoosePixelFormatARB; -#endif -#endif - -/* WGL_ARB_make_current_read */ - -#ifdef __GLEE_WGL_ARB_make_current_read -#ifndef GLEE_C_DEFINED_wglMakeContextCurrentARB -#define GLEE_C_DEFINED_wglMakeContextCurrentARB - BOOL __stdcall GLee_Lazy_wglMakeContextCurrentARB(HDC hDrawDC, HDC hReadDC, HGLRC hglrc) {if (GLeeInit()) return wglMakeContextCurrentARB(hDrawDC, hReadDC, hglrc); return (BOOL)0;} - GLEEPFNWGLMAKECONTEXTCURRENTARBPROC GLeeFuncPtr_wglMakeContextCurrentARB=GLee_Lazy_wglMakeContextCurrentARB; -#endif -#ifndef GLEE_C_DEFINED_wglGetCurrentReadDCARB -#define GLEE_C_DEFINED_wglGetCurrentReadDCARB - HDC __stdcall GLee_Lazy_wglGetCurrentReadDCARB(void) {if (GLeeInit()) return wglGetCurrentReadDCARB(); return (HDC)0;} - GLEEPFNWGLGETCURRENTREADDCARBPROC GLeeFuncPtr_wglGetCurrentReadDCARB=GLee_Lazy_wglGetCurrentReadDCARB; -#endif -#endif - -/* WGL_ARB_pbuffer */ - -#ifdef __GLEE_WGL_ARB_pbuffer -#ifndef GLEE_C_DEFINED_wglCreatePbufferARB -#define GLEE_C_DEFINED_wglCreatePbufferARB - HPBUFFERARB __stdcall GLee_Lazy_wglCreatePbufferARB(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList) {if (GLeeInit()) return wglCreatePbufferARB(hDC, iPixelFormat, iWidth, iHeight, piAttribList); return (HPBUFFERARB)0;} - GLEEPFNWGLCREATEPBUFFERARBPROC GLeeFuncPtr_wglCreatePbufferARB=GLee_Lazy_wglCreatePbufferARB; -#endif -#ifndef GLEE_C_DEFINED_wglGetPbufferDCARB -#define GLEE_C_DEFINED_wglGetPbufferDCARB - HDC __stdcall GLee_Lazy_wglGetPbufferDCARB(HPBUFFERARB hPbuffer) {if (GLeeInit()) return wglGetPbufferDCARB(hPbuffer); return (HDC)0;} - GLEEPFNWGLGETPBUFFERDCARBPROC GLeeFuncPtr_wglGetPbufferDCARB=GLee_Lazy_wglGetPbufferDCARB; -#endif -#ifndef GLEE_C_DEFINED_wglReleasePbufferDCARB -#define GLEE_C_DEFINED_wglReleasePbufferDCARB - int __stdcall GLee_Lazy_wglReleasePbufferDCARB(HPBUFFERARB hPbuffer, HDC hDC) {if (GLeeInit()) return wglReleasePbufferDCARB(hPbuffer, hDC); return (int)0;} - GLEEPFNWGLRELEASEPBUFFERDCARBPROC GLeeFuncPtr_wglReleasePbufferDCARB=GLee_Lazy_wglReleasePbufferDCARB; -#endif -#ifndef GLEE_C_DEFINED_wglDestroyPbufferARB -#define GLEE_C_DEFINED_wglDestroyPbufferARB - BOOL __stdcall GLee_Lazy_wglDestroyPbufferARB(HPBUFFERARB hPbuffer) {if (GLeeInit()) return wglDestroyPbufferARB(hPbuffer); return (BOOL)0;} - GLEEPFNWGLDESTROYPBUFFERARBPROC GLeeFuncPtr_wglDestroyPbufferARB=GLee_Lazy_wglDestroyPbufferARB; -#endif -#ifndef GLEE_C_DEFINED_wglQueryPbufferARB -#define GLEE_C_DEFINED_wglQueryPbufferARB - BOOL __stdcall GLee_Lazy_wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, int * piValue) {if (GLeeInit()) return wglQueryPbufferARB(hPbuffer, iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLQUERYPBUFFERARBPROC GLeeFuncPtr_wglQueryPbufferARB=GLee_Lazy_wglQueryPbufferARB; -#endif -#endif - -/* WGL_ARB_render_texture */ - -#ifdef __GLEE_WGL_ARB_render_texture -#ifndef GLEE_C_DEFINED_wglBindTexImageARB -#define GLEE_C_DEFINED_wglBindTexImageARB - BOOL __stdcall GLee_Lazy_wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) {if (GLeeInit()) return wglBindTexImageARB(hPbuffer, iBuffer); return (BOOL)0;} - GLEEPFNWGLBINDTEXIMAGEARBPROC GLeeFuncPtr_wglBindTexImageARB=GLee_Lazy_wglBindTexImageARB; -#endif -#ifndef GLEE_C_DEFINED_wglReleaseTexImageARB -#define GLEE_C_DEFINED_wglReleaseTexImageARB - BOOL __stdcall GLee_Lazy_wglReleaseTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) {if (GLeeInit()) return wglReleaseTexImageARB(hPbuffer, iBuffer); return (BOOL)0;} - GLEEPFNWGLRELEASETEXIMAGEARBPROC GLeeFuncPtr_wglReleaseTexImageARB=GLee_Lazy_wglReleaseTexImageARB; -#endif -#ifndef GLEE_C_DEFINED_wglSetPbufferAttribARB -#define GLEE_C_DEFINED_wglSetPbufferAttribARB - BOOL __stdcall GLee_Lazy_wglSetPbufferAttribARB(HPBUFFERARB hPbuffer, const int * piAttribList) {if (GLeeInit()) return wglSetPbufferAttribARB(hPbuffer, piAttribList); return (BOOL)0;} - GLEEPFNWGLSETPBUFFERATTRIBARBPROC GLeeFuncPtr_wglSetPbufferAttribARB=GLee_Lazy_wglSetPbufferAttribARB; -#endif -#endif - -/* WGL_ARB_pixel_format_float */ - -#ifdef __GLEE_WGL_ARB_pixel_format_float -#endif - -/* WGL_ARB_create_context */ - -#ifdef __GLEE_WGL_ARB_create_context -#ifndef GLEE_C_DEFINED_wglCreateContextAttribsARB -#define GLEE_C_DEFINED_wglCreateContextAttribsARB - HGLRC __stdcall GLee_Lazy_wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int * attribList) {if (GLeeInit()) return wglCreateContextAttribsARB(hDC, hShareContext, attribList); return (HGLRC)0;} - GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_wglCreateContextAttribsARB=GLee_Lazy_wglCreateContextAttribsARB; -#endif -#endif - -/* WGL_EXT_make_current_read */ - -#ifdef __GLEE_WGL_EXT_make_current_read -#ifndef GLEE_C_DEFINED_wglMakeContextCurrentEXT -#define GLEE_C_DEFINED_wglMakeContextCurrentEXT - BOOL __stdcall GLee_Lazy_wglMakeContextCurrentEXT(HDC hDrawDC, HDC hReadDC, HGLRC hglrc) {if (GLeeInit()) return wglMakeContextCurrentEXT(hDrawDC, hReadDC, hglrc); return (BOOL)0;} - GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC GLeeFuncPtr_wglMakeContextCurrentEXT=GLee_Lazy_wglMakeContextCurrentEXT; -#endif -#ifndef GLEE_C_DEFINED_wglGetCurrentReadDCEXT -#define GLEE_C_DEFINED_wglGetCurrentReadDCEXT - HDC __stdcall GLee_Lazy_wglGetCurrentReadDCEXT(void) {if (GLeeInit()) return wglGetCurrentReadDCEXT(); return (HDC)0;} - GLEEPFNWGLGETCURRENTREADDCEXTPROC GLeeFuncPtr_wglGetCurrentReadDCEXT=GLee_Lazy_wglGetCurrentReadDCEXT; -#endif -#endif - -/* WGL_EXT_pixel_format */ - -#ifdef __GLEE_WGL_EXT_pixel_format -#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribivEXT -#define GLEE_C_DEFINED_wglGetPixelFormatAttribivEXT - BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribivEXT(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, int * piValues) {if (GLeeInit()) return wglGetPixelFormatAttribivEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); return (BOOL)0;} - GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribivEXT=GLee_Lazy_wglGetPixelFormatAttribivEXT; -#endif -#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribfvEXT -#define GLEE_C_DEFINED_wglGetPixelFormatAttribfvEXT - BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribfvEXT(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, FLOAT * pfValues) {if (GLeeInit()) return wglGetPixelFormatAttribfvEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); return (BOOL)0;} - GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribfvEXT=GLee_Lazy_wglGetPixelFormatAttribfvEXT; -#endif -#ifndef GLEE_C_DEFINED_wglChoosePixelFormatEXT -#define GLEE_C_DEFINED_wglChoosePixelFormatEXT - BOOL __stdcall GLee_Lazy_wglChoosePixelFormatEXT(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats) {if (GLeeInit()) return wglChoosePixelFormatEXT(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); return (BOOL)0;} - GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC GLeeFuncPtr_wglChoosePixelFormatEXT=GLee_Lazy_wglChoosePixelFormatEXT; -#endif -#endif - -/* WGL_EXT_pbuffer */ - -#ifdef __GLEE_WGL_EXT_pbuffer -#ifndef GLEE_C_DEFINED_wglCreatePbufferEXT -#define GLEE_C_DEFINED_wglCreatePbufferEXT - HPBUFFEREXT __stdcall GLee_Lazy_wglCreatePbufferEXT(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList) {if (GLeeInit()) return wglCreatePbufferEXT(hDC, iPixelFormat, iWidth, iHeight, piAttribList); return (HPBUFFEREXT)0;} - GLEEPFNWGLCREATEPBUFFEREXTPROC GLeeFuncPtr_wglCreatePbufferEXT=GLee_Lazy_wglCreatePbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_wglGetPbufferDCEXT -#define GLEE_C_DEFINED_wglGetPbufferDCEXT - HDC __stdcall GLee_Lazy_wglGetPbufferDCEXT(HPBUFFEREXT hPbuffer) {if (GLeeInit()) return wglGetPbufferDCEXT(hPbuffer); return (HDC)0;} - GLEEPFNWGLGETPBUFFERDCEXTPROC GLeeFuncPtr_wglGetPbufferDCEXT=GLee_Lazy_wglGetPbufferDCEXT; -#endif -#ifndef GLEE_C_DEFINED_wglReleasePbufferDCEXT -#define GLEE_C_DEFINED_wglReleasePbufferDCEXT - int __stdcall GLee_Lazy_wglReleasePbufferDCEXT(HPBUFFEREXT hPbuffer, HDC hDC) {if (GLeeInit()) return wglReleasePbufferDCEXT(hPbuffer, hDC); return (int)0;} - GLEEPFNWGLRELEASEPBUFFERDCEXTPROC GLeeFuncPtr_wglReleasePbufferDCEXT=GLee_Lazy_wglReleasePbufferDCEXT; -#endif -#ifndef GLEE_C_DEFINED_wglDestroyPbufferEXT -#define GLEE_C_DEFINED_wglDestroyPbufferEXT - BOOL __stdcall GLee_Lazy_wglDestroyPbufferEXT(HPBUFFEREXT hPbuffer) {if (GLeeInit()) return wglDestroyPbufferEXT(hPbuffer); return (BOOL)0;} - GLEEPFNWGLDESTROYPBUFFEREXTPROC GLeeFuncPtr_wglDestroyPbufferEXT=GLee_Lazy_wglDestroyPbufferEXT; -#endif -#ifndef GLEE_C_DEFINED_wglQueryPbufferEXT -#define GLEE_C_DEFINED_wglQueryPbufferEXT - BOOL __stdcall GLee_Lazy_wglQueryPbufferEXT(HPBUFFEREXT hPbuffer, int iAttribute, int * piValue) {if (GLeeInit()) return wglQueryPbufferEXT(hPbuffer, iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLQUERYPBUFFEREXTPROC GLeeFuncPtr_wglQueryPbufferEXT=GLee_Lazy_wglQueryPbufferEXT; -#endif -#endif - -/* WGL_EXT_depth_float */ - -#ifdef __GLEE_WGL_EXT_depth_float -#endif - -/* WGL_3DFX_multisample */ - -#ifdef __GLEE_WGL_3DFX_multisample -#endif - -/* WGL_EXT_multisample */ - -#ifdef __GLEE_WGL_EXT_multisample -#endif - -/* WGL_I3D_digital_video_control */ - -#ifdef __GLEE_WGL_I3D_digital_video_control -#ifndef GLEE_C_DEFINED_wglGetDigitalVideoParametersI3D -#define GLEE_C_DEFINED_wglGetDigitalVideoParametersI3D - BOOL __stdcall GLee_Lazy_wglGetDigitalVideoParametersI3D(HDC hDC, int iAttribute, int * piValue) {if (GLeeInit()) return wglGetDigitalVideoParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglGetDigitalVideoParametersI3D=GLee_Lazy_wglGetDigitalVideoParametersI3D; -#endif -#ifndef GLEE_C_DEFINED_wglSetDigitalVideoParametersI3D -#define GLEE_C_DEFINED_wglSetDigitalVideoParametersI3D - BOOL __stdcall GLee_Lazy_wglSetDigitalVideoParametersI3D(HDC hDC, int iAttribute, const int * piValue) {if (GLeeInit()) return wglSetDigitalVideoParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglSetDigitalVideoParametersI3D=GLee_Lazy_wglSetDigitalVideoParametersI3D; -#endif -#endif - -/* WGL_I3D_gamma */ - -#ifdef __GLEE_WGL_I3D_gamma -#ifndef GLEE_C_DEFINED_wglGetGammaTableParametersI3D -#define GLEE_C_DEFINED_wglGetGammaTableParametersI3D - BOOL __stdcall GLee_Lazy_wglGetGammaTableParametersI3D(HDC hDC, int iAttribute, int * piValue) {if (GLeeInit()) return wglGetGammaTableParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglGetGammaTableParametersI3D=GLee_Lazy_wglGetGammaTableParametersI3D; -#endif -#ifndef GLEE_C_DEFINED_wglSetGammaTableParametersI3D -#define GLEE_C_DEFINED_wglSetGammaTableParametersI3D - BOOL __stdcall GLee_Lazy_wglSetGammaTableParametersI3D(HDC hDC, int iAttribute, const int * piValue) {if (GLeeInit()) return wglSetGammaTableParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglSetGammaTableParametersI3D=GLee_Lazy_wglSetGammaTableParametersI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGetGammaTableI3D -#define GLEE_C_DEFINED_wglGetGammaTableI3D - BOOL __stdcall GLee_Lazy_wglGetGammaTableI3D(HDC hDC, int iEntries, USHORT * puRed, USHORT * puGreen, USHORT * puBlue) {if (GLeeInit()) return wglGetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); return (BOOL)0;} - GLEEPFNWGLGETGAMMATABLEI3DPROC GLeeFuncPtr_wglGetGammaTableI3D=GLee_Lazy_wglGetGammaTableI3D; -#endif -#ifndef GLEE_C_DEFINED_wglSetGammaTableI3D -#define GLEE_C_DEFINED_wglSetGammaTableI3D - BOOL __stdcall GLee_Lazy_wglSetGammaTableI3D(HDC hDC, int iEntries, const USHORT * puRed, const USHORT * puGreen, const USHORT * puBlue) {if (GLeeInit()) return wglSetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); return (BOOL)0;} - GLEEPFNWGLSETGAMMATABLEI3DPROC GLeeFuncPtr_wglSetGammaTableI3D=GLee_Lazy_wglSetGammaTableI3D; -#endif -#endif - -/* WGL_I3D_genlock */ - -#ifdef __GLEE_WGL_I3D_genlock -#ifndef GLEE_C_DEFINED_wglEnableGenlockI3D -#define GLEE_C_DEFINED_wglEnableGenlockI3D - BOOL __stdcall GLee_Lazy_wglEnableGenlockI3D(HDC hDC) {if (GLeeInit()) return wglEnableGenlockI3D(hDC); return (BOOL)0;} - GLEEPFNWGLENABLEGENLOCKI3DPROC GLeeFuncPtr_wglEnableGenlockI3D=GLee_Lazy_wglEnableGenlockI3D; -#endif -#ifndef GLEE_C_DEFINED_wglDisableGenlockI3D -#define GLEE_C_DEFINED_wglDisableGenlockI3D - BOOL __stdcall GLee_Lazy_wglDisableGenlockI3D(HDC hDC) {if (GLeeInit()) return wglDisableGenlockI3D(hDC); return (BOOL)0;} - GLEEPFNWGLDISABLEGENLOCKI3DPROC GLeeFuncPtr_wglDisableGenlockI3D=GLee_Lazy_wglDisableGenlockI3D; -#endif -#ifndef GLEE_C_DEFINED_wglIsEnabledGenlockI3D -#define GLEE_C_DEFINED_wglIsEnabledGenlockI3D - BOOL __stdcall GLee_Lazy_wglIsEnabledGenlockI3D(HDC hDC, BOOL * pFlag) {if (GLeeInit()) return wglIsEnabledGenlockI3D(hDC, pFlag); return (BOOL)0;} - GLEEPFNWGLISENABLEDGENLOCKI3DPROC GLeeFuncPtr_wglIsEnabledGenlockI3D=GLee_Lazy_wglIsEnabledGenlockI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGenlockSourceI3D -#define GLEE_C_DEFINED_wglGenlockSourceI3D - BOOL __stdcall GLee_Lazy_wglGenlockSourceI3D(HDC hDC, UINT uSource) {if (GLeeInit()) return wglGenlockSourceI3D(hDC, uSource); return (BOOL)0;} - GLEEPFNWGLGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGenlockSourceI3D=GLee_Lazy_wglGenlockSourceI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGetGenlockSourceI3D -#define GLEE_C_DEFINED_wglGetGenlockSourceI3D - BOOL __stdcall GLee_Lazy_wglGetGenlockSourceI3D(HDC hDC, UINT * uSource) {if (GLeeInit()) return wglGetGenlockSourceI3D(hDC, uSource); return (BOOL)0;} - GLEEPFNWGLGETGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGetGenlockSourceI3D=GLee_Lazy_wglGetGenlockSourceI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGenlockSourceEdgeI3D -#define GLEE_C_DEFINED_wglGenlockSourceEdgeI3D - BOOL __stdcall GLee_Lazy_wglGenlockSourceEdgeI3D(HDC hDC, UINT uEdge) {if (GLeeInit()) return wglGenlockSourceEdgeI3D(hDC, uEdge); return (BOOL)0;} - GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGenlockSourceEdgeI3D=GLee_Lazy_wglGenlockSourceEdgeI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGetGenlockSourceEdgeI3D -#define GLEE_C_DEFINED_wglGetGenlockSourceEdgeI3D - BOOL __stdcall GLee_Lazy_wglGetGenlockSourceEdgeI3D(HDC hDC, UINT * uEdge) {if (GLeeInit()) return wglGetGenlockSourceEdgeI3D(hDC, uEdge); return (BOOL)0;} - GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGetGenlockSourceEdgeI3D=GLee_Lazy_wglGetGenlockSourceEdgeI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGenlockSampleRateI3D -#define GLEE_C_DEFINED_wglGenlockSampleRateI3D - BOOL __stdcall GLee_Lazy_wglGenlockSampleRateI3D(HDC hDC, UINT uRate) {if (GLeeInit()) return wglGenlockSampleRateI3D(hDC, uRate); return (BOOL)0;} - GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGenlockSampleRateI3D=GLee_Lazy_wglGenlockSampleRateI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGetGenlockSampleRateI3D -#define GLEE_C_DEFINED_wglGetGenlockSampleRateI3D - BOOL __stdcall GLee_Lazy_wglGetGenlockSampleRateI3D(HDC hDC, UINT * uRate) {if (GLeeInit()) return wglGetGenlockSampleRateI3D(hDC, uRate); return (BOOL)0;} - GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGetGenlockSampleRateI3D=GLee_Lazy_wglGetGenlockSampleRateI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGenlockSourceDelayI3D -#define GLEE_C_DEFINED_wglGenlockSourceDelayI3D - BOOL __stdcall GLee_Lazy_wglGenlockSourceDelayI3D(HDC hDC, UINT uDelay) {if (GLeeInit()) return wglGenlockSourceDelayI3D(hDC, uDelay); return (BOOL)0;} - GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGenlockSourceDelayI3D=GLee_Lazy_wglGenlockSourceDelayI3D; -#endif -#ifndef GLEE_C_DEFINED_wglGetGenlockSourceDelayI3D -#define GLEE_C_DEFINED_wglGetGenlockSourceDelayI3D - BOOL __stdcall GLee_Lazy_wglGetGenlockSourceDelayI3D(HDC hDC, UINT * uDelay) {if (GLeeInit()) return wglGetGenlockSourceDelayI3D(hDC, uDelay); return (BOOL)0;} - GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGetGenlockSourceDelayI3D=GLee_Lazy_wglGetGenlockSourceDelayI3D; -#endif -#ifndef GLEE_C_DEFINED_wglQueryGenlockMaxSourceDelayI3D -#define GLEE_C_DEFINED_wglQueryGenlockMaxSourceDelayI3D - BOOL __stdcall GLee_Lazy_wglQueryGenlockMaxSourceDelayI3D(HDC hDC, UINT * uMaxLineDelay, UINT * uMaxPixelDelay) {if (GLeeInit()) return wglQueryGenlockMaxSourceDelayI3D(hDC, uMaxLineDelay, uMaxPixelDelay); return (BOOL)0;} - GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D=GLee_Lazy_wglQueryGenlockMaxSourceDelayI3D; -#endif -#endif - -/* WGL_I3D_image_buffer */ - -#ifdef __GLEE_WGL_I3D_image_buffer -#ifndef GLEE_C_DEFINED_wglCreateImageBufferI3D -#define GLEE_C_DEFINED_wglCreateImageBufferI3D - LPVOID __stdcall GLee_Lazy_wglCreateImageBufferI3D(HDC hDC, DWORD dwSize, UINT uFlags) {if (GLeeInit()) return wglCreateImageBufferI3D(hDC, dwSize, uFlags); return (LPVOID)0;} - GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC GLeeFuncPtr_wglCreateImageBufferI3D=GLee_Lazy_wglCreateImageBufferI3D; -#endif -#ifndef GLEE_C_DEFINED_wglDestroyImageBufferI3D -#define GLEE_C_DEFINED_wglDestroyImageBufferI3D - BOOL __stdcall GLee_Lazy_wglDestroyImageBufferI3D(HDC hDC, LPVOID pAddress) {if (GLeeInit()) return wglDestroyImageBufferI3D(hDC, pAddress); return (BOOL)0;} - GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC GLeeFuncPtr_wglDestroyImageBufferI3D=GLee_Lazy_wglDestroyImageBufferI3D; -#endif -#ifndef GLEE_C_DEFINED_wglAssociateImageBufferEventsI3D -#define GLEE_C_DEFINED_wglAssociateImageBufferEventsI3D - BOOL __stdcall GLee_Lazy_wglAssociateImageBufferEventsI3D(HDC hDC, const HANDLE * pEvent, const LPVOID * pAddress, const DWORD * pSize, UINT count) {if (GLeeInit()) return wglAssociateImageBufferEventsI3D(hDC, pEvent, pAddress, pSize, count); return (BOOL)0;} - GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglAssociateImageBufferEventsI3D=GLee_Lazy_wglAssociateImageBufferEventsI3D; -#endif -#ifndef GLEE_C_DEFINED_wglReleaseImageBufferEventsI3D -#define GLEE_C_DEFINED_wglReleaseImageBufferEventsI3D - BOOL __stdcall GLee_Lazy_wglReleaseImageBufferEventsI3D(HDC hDC, const LPVOID * pAddress, UINT count) {if (GLeeInit()) return wglReleaseImageBufferEventsI3D(hDC, pAddress, count); return (BOOL)0;} - GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglReleaseImageBufferEventsI3D=GLee_Lazy_wglReleaseImageBufferEventsI3D; -#endif -#endif - -/* WGL_I3D_swap_frame_lock */ - -#ifdef __GLEE_WGL_I3D_swap_frame_lock -#ifndef GLEE_C_DEFINED_wglEnableFrameLockI3D -#define GLEE_C_DEFINED_wglEnableFrameLockI3D - BOOL __stdcall GLee_Lazy_wglEnableFrameLockI3D(void) {if (GLeeInit()) return wglEnableFrameLockI3D(); return (BOOL)0;} - GLEEPFNWGLENABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglEnableFrameLockI3D=GLee_Lazy_wglEnableFrameLockI3D; -#endif -#ifndef GLEE_C_DEFINED_wglDisableFrameLockI3D -#define GLEE_C_DEFINED_wglDisableFrameLockI3D - BOOL __stdcall GLee_Lazy_wglDisableFrameLockI3D(void) {if (GLeeInit()) return wglDisableFrameLockI3D(); return (BOOL)0;} - GLEEPFNWGLDISABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglDisableFrameLockI3D=GLee_Lazy_wglDisableFrameLockI3D; -#endif -#ifndef GLEE_C_DEFINED_wglIsEnabledFrameLockI3D -#define GLEE_C_DEFINED_wglIsEnabledFrameLockI3D - BOOL __stdcall GLee_Lazy_wglIsEnabledFrameLockI3D(BOOL * pFlag) {if (GLeeInit()) return wglIsEnabledFrameLockI3D(pFlag); return (BOOL)0;} - GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC GLeeFuncPtr_wglIsEnabledFrameLockI3D=GLee_Lazy_wglIsEnabledFrameLockI3D; -#endif -#ifndef GLEE_C_DEFINED_wglQueryFrameLockMasterI3D -#define GLEE_C_DEFINED_wglQueryFrameLockMasterI3D - BOOL __stdcall GLee_Lazy_wglQueryFrameLockMasterI3D(BOOL * pFlag) {if (GLeeInit()) return wglQueryFrameLockMasterI3D(pFlag); return (BOOL)0;} - GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC GLeeFuncPtr_wglQueryFrameLockMasterI3D=GLee_Lazy_wglQueryFrameLockMasterI3D; -#endif -#endif - -/* WGL_NV_render_depth_texture */ - -#ifdef __GLEE_WGL_NV_render_depth_texture -#endif - -/* WGL_NV_render_texture_rectangle */ - -#ifdef __GLEE_WGL_NV_render_texture_rectangle -#endif - -/* WGL_ATI_pixel_format_float */ - -#ifdef __GLEE_WGL_ATI_pixel_format_float -#endif - -/* WGL_NV_float_buffer */ - -#ifdef __GLEE_WGL_NV_float_buffer -#endif - -/* WGL_3DL_stereo_control */ - -#ifdef __GLEE_WGL_3DL_stereo_control -#endif - -/* WGL_EXT_pixel_format_packed_float */ - -#ifdef __GLEE_WGL_EXT_pixel_format_packed_float -#endif - -/* WGL_EXT_framebuffer_sRGB */ - -#ifdef __GLEE_WGL_EXT_framebuffer_sRGB -#endif - -/* WGL_NV_present_video */ - -#ifdef __GLEE_WGL_NV_present_video -#ifndef GLEE_C_DEFINED_wglEnumerateVideoDevicesNV -#define GLEE_C_DEFINED_wglEnumerateVideoDevicesNV - int __stdcall GLee_Lazy_wglEnumerateVideoDevicesNV(HDC hDC, HVIDEOOUTPUTDEVICENV * phDeviceList) {if (GLeeInit()) return wglEnumerateVideoDevicesNV(hDC, phDeviceList); return (int)0;} - GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC GLeeFuncPtr_wglEnumerateVideoDevicesNV=GLee_Lazy_wglEnumerateVideoDevicesNV; -#endif -#ifndef GLEE_C_DEFINED_wglBindVideoDeviceNV -#define GLEE_C_DEFINED_wglBindVideoDeviceNV - BOOL __stdcall GLee_Lazy_wglBindVideoDeviceNV(HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList) {if (GLeeInit()) return wglBindVideoDeviceNV(hDC, uVideoSlot, hVideoDevice, piAttribList); return (BOOL)0;} - GLEEPFNWGLBINDVIDEODEVICENVPROC GLeeFuncPtr_wglBindVideoDeviceNV=GLee_Lazy_wglBindVideoDeviceNV; -#endif -#ifndef GLEE_C_DEFINED_wglQueryCurrentContextNV -#define GLEE_C_DEFINED_wglQueryCurrentContextNV - BOOL __stdcall GLee_Lazy_wglQueryCurrentContextNV(int iAttribute, int * piValue) {if (GLeeInit()) return wglQueryCurrentContextNV(iAttribute, piValue); return (BOOL)0;} - GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC GLeeFuncPtr_wglQueryCurrentContextNV=GLee_Lazy_wglQueryCurrentContextNV; -#endif -#endif - -/* WGL_NV_swap_group */ - -#ifdef __GLEE_WGL_NV_swap_group -#ifndef GLEE_C_DEFINED_wglJoinSwapGroupNV -#define GLEE_C_DEFINED_wglJoinSwapGroupNV - BOOL __stdcall GLee_Lazy_wglJoinSwapGroupNV(HDC hDC, GLuint group) {if (GLeeInit()) return wglJoinSwapGroupNV(hDC, group); return (BOOL)0;} - GLEEPFNWGLJOINSWAPGROUPNVPROC GLeeFuncPtr_wglJoinSwapGroupNV=GLee_Lazy_wglJoinSwapGroupNV; -#endif -#ifndef GLEE_C_DEFINED_wglBindSwapBarrierNV -#define GLEE_C_DEFINED_wglBindSwapBarrierNV - BOOL __stdcall GLee_Lazy_wglBindSwapBarrierNV(GLuint group, GLuint barrier) {if (GLeeInit()) return wglBindSwapBarrierNV(group, barrier); return (BOOL)0;} - GLEEPFNWGLBINDSWAPBARRIERNVPROC GLeeFuncPtr_wglBindSwapBarrierNV=GLee_Lazy_wglBindSwapBarrierNV; -#endif -#ifndef GLEE_C_DEFINED_wglQuerySwapGroupNV -#define GLEE_C_DEFINED_wglQuerySwapGroupNV - BOOL __stdcall GLee_Lazy_wglQuerySwapGroupNV(HDC hDC, GLuint * group, GLuint * barrier) {if (GLeeInit()) return wglQuerySwapGroupNV(hDC, group, barrier); return (BOOL)0;} - GLEEPFNWGLQUERYSWAPGROUPNVPROC GLeeFuncPtr_wglQuerySwapGroupNV=GLee_Lazy_wglQuerySwapGroupNV; -#endif -#ifndef GLEE_C_DEFINED_wglQueryMaxSwapGroupsNV -#define GLEE_C_DEFINED_wglQueryMaxSwapGroupsNV - BOOL __stdcall GLee_Lazy_wglQueryMaxSwapGroupsNV(HDC hDC, GLuint * maxGroups, GLuint * maxBarriers) {if (GLeeInit()) return wglQueryMaxSwapGroupsNV(hDC, maxGroups, maxBarriers); return (BOOL)0;} - GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC GLeeFuncPtr_wglQueryMaxSwapGroupsNV=GLee_Lazy_wglQueryMaxSwapGroupsNV; -#endif -#ifndef GLEE_C_DEFINED_wglQueryFrameCountNV -#define GLEE_C_DEFINED_wglQueryFrameCountNV - BOOL __stdcall GLee_Lazy_wglQueryFrameCountNV(HDC hDC, GLuint * count) {if (GLeeInit()) return wglQueryFrameCountNV(hDC, count); return (BOOL)0;} - GLEEPFNWGLQUERYFRAMECOUNTNVPROC GLeeFuncPtr_wglQueryFrameCountNV=GLee_Lazy_wglQueryFrameCountNV; -#endif -#ifndef GLEE_C_DEFINED_wglResetFrameCountNV -#define GLEE_C_DEFINED_wglResetFrameCountNV - BOOL __stdcall GLee_Lazy_wglResetFrameCountNV(HDC hDC) {if (GLeeInit()) return wglResetFrameCountNV(hDC); return (BOOL)0;} - GLEEPFNWGLRESETFRAMECOUNTNVPROC GLeeFuncPtr_wglResetFrameCountNV=GLee_Lazy_wglResetFrameCountNV; -#endif -#endif - -/* WGL_NV_gpu_affinity */ - -#ifdef __GLEE_WGL_NV_gpu_affinity -#ifndef GLEE_C_DEFINED_wglEnumGpusNV -#define GLEE_C_DEFINED_wglEnumGpusNV - BOOL __stdcall GLee_Lazy_wglEnumGpusNV(UINT iGpuIndex, HGPUNV * phGpu) {if (GLeeInit()) return wglEnumGpusNV(iGpuIndex, phGpu); return (BOOL)0;} - GLEEPFNWGLENUMGPUSNVPROC GLeeFuncPtr_wglEnumGpusNV=GLee_Lazy_wglEnumGpusNV; -#endif -#ifndef GLEE_C_DEFINED_wglEnumGpuDevicesNV -#define GLEE_C_DEFINED_wglEnumGpuDevicesNV - BOOL __stdcall GLee_Lazy_wglEnumGpuDevicesNV(HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice) {if (GLeeInit()) return wglEnumGpuDevicesNV(hGpu, iDeviceIndex, lpGpuDevice); return (BOOL)0;} - GLEEPFNWGLENUMGPUDEVICESNVPROC GLeeFuncPtr_wglEnumGpuDevicesNV=GLee_Lazy_wglEnumGpuDevicesNV; -#endif -#ifndef GLEE_C_DEFINED_wglCreateAffinityDCNV -#define GLEE_C_DEFINED_wglCreateAffinityDCNV - HDC __stdcall GLee_Lazy_wglCreateAffinityDCNV(const HGPUNV * phGpuList) {if (GLeeInit()) return wglCreateAffinityDCNV(phGpuList); return (HDC)0;} - GLEEPFNWGLCREATEAFFINITYDCNVPROC GLeeFuncPtr_wglCreateAffinityDCNV=GLee_Lazy_wglCreateAffinityDCNV; -#endif -#ifndef GLEE_C_DEFINED_wglEnumGpusFromAffinityDCNV -#define GLEE_C_DEFINED_wglEnumGpusFromAffinityDCNV - BOOL __stdcall GLee_Lazy_wglEnumGpusFromAffinityDCNV(HDC hAffinityDC, UINT iGpuIndex, HGPUNV * hGpu) {if (GLeeInit()) return wglEnumGpusFromAffinityDCNV(hAffinityDC, iGpuIndex, hGpu); return (BOOL)0;} - GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC GLeeFuncPtr_wglEnumGpusFromAffinityDCNV=GLee_Lazy_wglEnumGpusFromAffinityDCNV; -#endif -#ifndef GLEE_C_DEFINED_wglDeleteDCNV -#define GLEE_C_DEFINED_wglDeleteDCNV - BOOL __stdcall GLee_Lazy_wglDeleteDCNV(HDC hdc) {if (GLeeInit()) return wglDeleteDCNV(hdc); return (BOOL)0;} - GLEEPFNWGLDELETEDCNVPROC GLeeFuncPtr_wglDeleteDCNV=GLee_Lazy_wglDeleteDCNV; -#endif -#endif - -/* WGL_EXT_display_color_table */ - -#ifdef __GLEE_WGL_EXT_display_color_table -#ifndef GLEE_C_DEFINED_wglCreateDisplayColorTableEXT -#define GLEE_C_DEFINED_wglCreateDisplayColorTableEXT - GLboolean __stdcall GLee_Lazy_wglCreateDisplayColorTableEXT(GLushort id) {if (GLeeInit()) return wglCreateDisplayColorTableEXT(id); return (GLboolean)0;} - GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglCreateDisplayColorTableEXT=GLee_Lazy_wglCreateDisplayColorTableEXT; -#endif -#ifndef GLEE_C_DEFINED_wglLoadDisplayColorTableEXT -#define GLEE_C_DEFINED_wglLoadDisplayColorTableEXT - GLboolean __stdcall GLee_Lazy_wglLoadDisplayColorTableEXT(const GLushort * table, GLuint length) {if (GLeeInit()) return wglLoadDisplayColorTableEXT(table, length); return (GLboolean)0;} - GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglLoadDisplayColorTableEXT=GLee_Lazy_wglLoadDisplayColorTableEXT; -#endif -#ifndef GLEE_C_DEFINED_wglBindDisplayColorTableEXT -#define GLEE_C_DEFINED_wglBindDisplayColorTableEXT - GLboolean __stdcall GLee_Lazy_wglBindDisplayColorTableEXT(GLushort id) {if (GLeeInit()) return wglBindDisplayColorTableEXT(id); return (GLboolean)0;} - GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglBindDisplayColorTableEXT=GLee_Lazy_wglBindDisplayColorTableEXT; -#endif -#ifndef GLEE_C_DEFINED_wglDestroyDisplayColorTableEXT -#define GLEE_C_DEFINED_wglDestroyDisplayColorTableEXT - VOID __stdcall GLee_Lazy_wglDestroyDisplayColorTableEXT(GLushort id) {if (GLeeInit()) wglDestroyDisplayColorTableEXT(id);} - GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglDestroyDisplayColorTableEXT=GLee_Lazy_wglDestroyDisplayColorTableEXT; -#endif -#endif - -/* WGL_EXT_extensions_string */ - -#ifdef __GLEE_WGL_EXT_extensions_string -#ifndef GLEE_C_DEFINED_wglGetExtensionsStringEXT -#define GLEE_C_DEFINED_wglGetExtensionsStringEXT - const char * __stdcall GLee_Lazy_wglGetExtensionsStringEXT(void) {if (GLeeInit()) return wglGetExtensionsStringEXT(); return (const char *)0;} - GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC GLeeFuncPtr_wglGetExtensionsStringEXT=GLee_Lazy_wglGetExtensionsStringEXT; -#endif -#endif - -/* WGL_EXT_swap_control */ - -#ifdef __GLEE_WGL_EXT_swap_control -#ifndef GLEE_C_DEFINED_wglSwapIntervalEXT -#define GLEE_C_DEFINED_wglSwapIntervalEXT - BOOL __stdcall GLee_Lazy_wglSwapIntervalEXT(int interval) {if (GLeeInit()) return wglSwapIntervalEXT(interval); return (BOOL)0;} - GLEEPFNWGLSWAPINTERVALEXTPROC GLeeFuncPtr_wglSwapIntervalEXT=GLee_Lazy_wglSwapIntervalEXT; -#endif -#ifndef GLEE_C_DEFINED_wglGetSwapIntervalEXT -#define GLEE_C_DEFINED_wglGetSwapIntervalEXT - int __stdcall GLee_Lazy_wglGetSwapIntervalEXT(void) {if (GLeeInit()) return wglGetSwapIntervalEXT(); return (int)0;} - GLEEPFNWGLGETSWAPINTERVALEXTPROC GLeeFuncPtr_wglGetSwapIntervalEXT=GLee_Lazy_wglGetSwapIntervalEXT; -#endif -#endif - -/* WGL_NV_vertex_array_range */ - -#ifdef __GLEE_WGL_NV_vertex_array_range -#ifndef GLEE_C_DEFINED_wglAllocateMemoryNV -#define GLEE_C_DEFINED_wglAllocateMemoryNV - void* __stdcall GLee_Lazy_wglAllocateMemoryNV(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority) {if (GLeeInit()) return wglAllocateMemoryNV(size, readfreq, writefreq, priority); return (void*)0;} - GLEEPFNWGLALLOCATEMEMORYNVPROC GLeeFuncPtr_wglAllocateMemoryNV=GLee_Lazy_wglAllocateMemoryNV; -#endif -#ifndef GLEE_C_DEFINED_wglFreeMemoryNV -#define GLEE_C_DEFINED_wglFreeMemoryNV - void __stdcall GLee_Lazy_wglFreeMemoryNV(void * pointer) {if (GLeeInit()) wglFreeMemoryNV(pointer);} - GLEEPFNWGLFREEMEMORYNVPROC GLeeFuncPtr_wglFreeMemoryNV=GLee_Lazy_wglFreeMemoryNV; -#endif -#endif - -/* WGL_OML_sync_control */ - -#ifdef __GLEE_WGL_OML_sync_control -#ifndef GLEE_C_DEFINED_wglGetSyncValuesOML -#define GLEE_C_DEFINED_wglGetSyncValuesOML - BOOL __stdcall GLee_Lazy_wglGetSyncValuesOML(HDC hdc, INT64 * ust, INT64 * msc, INT64 * sbc) {if (GLeeInit()) return wglGetSyncValuesOML(hdc, ust, msc, sbc); return (BOOL)0;} - GLEEPFNWGLGETSYNCVALUESOMLPROC GLeeFuncPtr_wglGetSyncValuesOML=GLee_Lazy_wglGetSyncValuesOML; -#endif -#ifndef GLEE_C_DEFINED_wglGetMscRateOML -#define GLEE_C_DEFINED_wglGetMscRateOML - BOOL __stdcall GLee_Lazy_wglGetMscRateOML(HDC hdc, INT32 * numerator, INT32 * denominator) {if (GLeeInit()) return wglGetMscRateOML(hdc, numerator, denominator); return (BOOL)0;} - GLEEPFNWGLGETMSCRATEOMLPROC GLeeFuncPtr_wglGetMscRateOML=GLee_Lazy_wglGetMscRateOML; -#endif -#ifndef GLEE_C_DEFINED_wglSwapBuffersMscOML -#define GLEE_C_DEFINED_wglSwapBuffersMscOML - INT64 __stdcall GLee_Lazy_wglSwapBuffersMscOML(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder) {if (GLeeInit()) return wglSwapBuffersMscOML(hdc, target_msc, divisor, remainder); return (INT64)0;} - GLEEPFNWGLSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapBuffersMscOML=GLee_Lazy_wglSwapBuffersMscOML; -#endif -#ifndef GLEE_C_DEFINED_wglSwapLayerBuffersMscOML -#define GLEE_C_DEFINED_wglSwapLayerBuffersMscOML - INT64 __stdcall GLee_Lazy_wglSwapLayerBuffersMscOML(HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder) {if (GLeeInit()) return wglSwapLayerBuffersMscOML(hdc, fuPlanes, target_msc, divisor, remainder); return (INT64)0;} - GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapLayerBuffersMscOML=GLee_Lazy_wglSwapLayerBuffersMscOML; -#endif -#ifndef GLEE_C_DEFINED_wglWaitForMscOML -#define GLEE_C_DEFINED_wglWaitForMscOML - BOOL __stdcall GLee_Lazy_wglWaitForMscOML(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 * ust, INT64 * msc, INT64 * sbc) {if (GLeeInit()) return wglWaitForMscOML(hdc, target_msc, divisor, remainder, ust, msc, sbc); return (BOOL)0;} - GLEEPFNWGLWAITFORMSCOMLPROC GLeeFuncPtr_wglWaitForMscOML=GLee_Lazy_wglWaitForMscOML; -#endif -#ifndef GLEE_C_DEFINED_wglWaitForSbcOML -#define GLEE_C_DEFINED_wglWaitForSbcOML - BOOL __stdcall GLee_Lazy_wglWaitForSbcOML(HDC hdc, INT64 target_sbc, INT64 * ust, INT64 * msc, INT64 * sbc) {if (GLeeInit()) return wglWaitForSbcOML(hdc, target_sbc, ust, msc, sbc); return (BOOL)0;} - GLEEPFNWGLWAITFORSBCOMLPROC GLeeFuncPtr_wglWaitForSbcOML=GLee_Lazy_wglWaitForSbcOML; -#endif -#endif - -/* WGL_I3D_swap_frame_usage */ - -#ifdef __GLEE_WGL_I3D_swap_frame_usage -#ifndef GLEE_C_DEFINED_wglGetFrameUsageI3D -#define GLEE_C_DEFINED_wglGetFrameUsageI3D - BOOL __stdcall GLee_Lazy_wglGetFrameUsageI3D(float * pUsage) {if (GLeeInit()) return wglGetFrameUsageI3D(pUsage); return (BOOL)0;} - GLEEPFNWGLGETFRAMEUSAGEI3DPROC GLeeFuncPtr_wglGetFrameUsageI3D=GLee_Lazy_wglGetFrameUsageI3D; -#endif -#ifndef GLEE_C_DEFINED_wglBeginFrameTrackingI3D -#define GLEE_C_DEFINED_wglBeginFrameTrackingI3D - BOOL __stdcall GLee_Lazy_wglBeginFrameTrackingI3D(void) {if (GLeeInit()) return wglBeginFrameTrackingI3D(); return (BOOL)0;} - GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC GLeeFuncPtr_wglBeginFrameTrackingI3D=GLee_Lazy_wglBeginFrameTrackingI3D; -#endif -#ifndef GLEE_C_DEFINED_wglEndFrameTrackingI3D -#define GLEE_C_DEFINED_wglEndFrameTrackingI3D - BOOL __stdcall GLee_Lazy_wglEndFrameTrackingI3D(void) {if (GLeeInit()) return wglEndFrameTrackingI3D(); return (BOOL)0;} - GLEEPFNWGLENDFRAMETRACKINGI3DPROC GLeeFuncPtr_wglEndFrameTrackingI3D=GLee_Lazy_wglEndFrameTrackingI3D; -#endif -#ifndef GLEE_C_DEFINED_wglQueryFrameTrackingI3D -#define GLEE_C_DEFINED_wglQueryFrameTrackingI3D - BOOL __stdcall GLee_Lazy_wglQueryFrameTrackingI3D(DWORD * pFrameCount, DWORD * pMissedFrames, float * pLastMissedUsage) {if (GLeeInit()) return wglQueryFrameTrackingI3D(pFrameCount, pMissedFrames, pLastMissedUsage); return (BOOL)0;} - GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC GLeeFuncPtr_wglQueryFrameTrackingI3D=GLee_Lazy_wglQueryFrameTrackingI3D; -#endif -#endif - -/* WGL_NV_video_output */ - -#ifdef __GLEE_WGL_NV_video_output -#ifndef GLEE_C_DEFINED_wglGetVideoDeviceNV -#define GLEE_C_DEFINED_wglGetVideoDeviceNV - BOOL __stdcall GLee_Lazy_wglGetVideoDeviceNV(HDC hDC, int numDevices, HPVIDEODEV * hVideoDevice) {if (GLeeInit()) return wglGetVideoDeviceNV(hDC, numDevices, hVideoDevice); return (BOOL)0;} - GLEEPFNWGLGETVIDEODEVICENVPROC GLeeFuncPtr_wglGetVideoDeviceNV=GLee_Lazy_wglGetVideoDeviceNV; -#endif -#ifndef GLEE_C_DEFINED_wglReleaseVideoDeviceNV -#define GLEE_C_DEFINED_wglReleaseVideoDeviceNV - BOOL __stdcall GLee_Lazy_wglReleaseVideoDeviceNV(HPVIDEODEV hVideoDevice) {if (GLeeInit()) return wglReleaseVideoDeviceNV(hVideoDevice); return (BOOL)0;} - GLEEPFNWGLRELEASEVIDEODEVICENVPROC GLeeFuncPtr_wglReleaseVideoDeviceNV=GLee_Lazy_wglReleaseVideoDeviceNV; -#endif -#ifndef GLEE_C_DEFINED_wglBindVideoImageNV -#define GLEE_C_DEFINED_wglBindVideoImageNV - BOOL __stdcall GLee_Lazy_wglBindVideoImageNV(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer) {if (GLeeInit()) return wglBindVideoImageNV(hVideoDevice, hPbuffer, iVideoBuffer); return (BOOL)0;} - GLEEPFNWGLBINDVIDEOIMAGENVPROC GLeeFuncPtr_wglBindVideoImageNV=GLee_Lazy_wglBindVideoImageNV; -#endif -#ifndef GLEE_C_DEFINED_wglReleaseVideoImageNV -#define GLEE_C_DEFINED_wglReleaseVideoImageNV - BOOL __stdcall GLee_Lazy_wglReleaseVideoImageNV(HPBUFFERARB hPbuffer, int iVideoBuffer) {if (GLeeInit()) return wglReleaseVideoImageNV(hPbuffer, iVideoBuffer); return (BOOL)0;} - GLEEPFNWGLRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_wglReleaseVideoImageNV=GLee_Lazy_wglReleaseVideoImageNV; -#endif -#ifndef GLEE_C_DEFINED_wglSendPbufferToVideoNV -#define GLEE_C_DEFINED_wglSendPbufferToVideoNV - BOOL __stdcall GLee_Lazy_wglSendPbufferToVideoNV(HPBUFFERARB hPbuffer, int iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock) {if (GLeeInit()) return wglSendPbufferToVideoNV(hPbuffer, iBufferType, pulCounterPbuffer, bBlock); return (BOOL)0;} - GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_wglSendPbufferToVideoNV=GLee_Lazy_wglSendPbufferToVideoNV; -#endif -#ifndef GLEE_C_DEFINED_wglGetVideoInfoNV -#define GLEE_C_DEFINED_wglGetVideoInfoNV - BOOL __stdcall GLee_Lazy_wglGetVideoInfoNV(HPVIDEODEV hpVideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo) {if (GLeeInit()) return wglGetVideoInfoNV(hpVideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo); return (BOOL)0;} - GLEEPFNWGLGETVIDEOINFONVPROC GLeeFuncPtr_wglGetVideoInfoNV=GLee_Lazy_wglGetVideoInfoNV; -#endif -#endif -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else /* GLX */ - -/* Extension querying variables */ - -GLboolean _GLEE_GLX_VERSION_1_3 = GL_FALSE; -GLboolean _GLEE_GLX_VERSION_1_4 = GL_FALSE; -GLboolean _GLEE_GLX_ARB_multisample = GL_FALSE; -GLboolean _GLEE_GLX_ARB_fbconfig_float = GL_FALSE; -GLboolean _GLEE_GLX_ARB_create_context = GL_FALSE; -GLboolean _GLEE_GLX_SGIS_multisample = GL_FALSE; -GLboolean _GLEE_GLX_EXT_visual_info = GL_FALSE; -GLboolean _GLEE_GLX_SGI_swap_control = GL_FALSE; -GLboolean _GLEE_GLX_SGI_video_sync = GL_FALSE; -GLboolean _GLEE_GLX_SGI_make_current_read = GL_FALSE; -GLboolean _GLEE_GLX_EXT_visual_rating = GL_FALSE; -GLboolean _GLEE_GLX_EXT_import_context = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_fbconfig = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_pbuffer = GL_FALSE; -GLboolean _GLEE_GLX_SGI_cushion = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_video_resize = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_swap_group = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_swap_barrier = GL_FALSE; -GLboolean _GLEE_GLX_SGIS_blended_overlay = GL_FALSE; -GLboolean _GLEE_GLX_SGIS_shared_multisample = GL_FALSE; -GLboolean _GLEE_GLX_SUN_get_transparent_index = GL_FALSE; -GLboolean _GLEE_GLX_3DFX_multisample = GL_FALSE; -GLboolean _GLEE_GLX_MESA_copy_sub_buffer = GL_FALSE; -GLboolean _GLEE_GLX_MESA_pixmap_colormap = GL_FALSE; -GLboolean _GLEE_GLX_MESA_release_buffers = GL_FALSE; -GLboolean _GLEE_GLX_MESA_set_3dfx_mode = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_visual_select_group = GL_FALSE; -GLboolean _GLEE_GLX_OML_swap_method = GL_FALSE; -GLboolean _GLEE_GLX_OML_sync_control = GL_FALSE; -GLboolean _GLEE_GLX_NV_float_buffer = GL_FALSE; -GLboolean _GLEE_GLX_SGIX_hyperpipe = GL_FALSE; -GLboolean _GLEE_GLX_MESA_agp_offset = GL_FALSE; -GLboolean _GLEE_GLX_EXT_fbconfig_packed_float = GL_FALSE; -GLboolean _GLEE_GLX_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean _GLEE_GLX_EXT_texture_from_pixmap = GL_FALSE; -GLboolean _GLEE_GLX_NV_present_video = GL_FALSE; -GLboolean _GLEE_GLX_NV_video_out = GL_FALSE; -GLboolean _GLEE_GLX_NV_swap_group = GL_FALSE; -GLboolean _GLEE_GLX_EXT_scene_marker = GL_FALSE; -GLboolean _GLEE_GLX_NV_video_output = GL_FALSE; - -/* GLX Extension names */ - -char __GLeeGLXExtensionNames[40][30]={ - "GLX_VERSION_1_3", - "GLX_VERSION_1_4", - "GLX_ARB_multisample", - "GLX_ARB_fbconfig_float", - "GLX_ARB_create_context", - "GLX_SGIS_multisample", - "GLX_EXT_visual_info", - "GLX_SGI_swap_control", - "GLX_SGI_video_sync", - "GLX_SGI_make_current_read", - "GLX_EXT_visual_rating", - "GLX_EXT_import_context", - "GLX_SGIX_fbconfig", - "GLX_SGIX_pbuffer", - "GLX_SGI_cushion", - "GLX_SGIX_video_resize", - "GLX_SGIX_swap_group", - "GLX_SGIX_swap_barrier", - "GLX_SGIS_blended_overlay", - "GLX_SGIS_shared_multisample", - "GLX_SUN_get_transparent_index", - "GLX_3DFX_multisample", - "GLX_MESA_copy_sub_buffer", - "GLX_MESA_pixmap_colormap", - "GLX_MESA_release_buffers", - "GLX_MESA_set_3dfx_mode", - "GLX_SGIX_visual_select_group", - "GLX_OML_swap_method", - "GLX_OML_sync_control", - "GLX_NV_float_buffer", - "GLX_SGIX_hyperpipe", - "GLX_MESA_agp_offset", - "GLX_EXT_fbconfig_packed_float", - "GLX_EXT_framebuffer_sRGB", - "GLX_EXT_texture_from_pixmap", - "GLX_NV_present_video", - "GLX_NV_video_out", - "GLX_NV_swap_group", - "GLX_EXT_scene_marker", - "GLX_NV_video_output" -}; -int __GLeeGLXNumExtensions=40; - -/* GLX_VERSION_1_3 */ - -#ifdef __GLEE_GLX_VERSION_1_3 -#ifndef GLEE_C_DEFINED_glXGetFBConfigs -#define GLEE_C_DEFINED_glXGetFBConfigs - GLXFBConfig * __stdcall GLee_Lazy_glXGetFBConfigs(Display * dpy, int screen, int * nelements) {if (GLeeInit()) return glXGetFBConfigs(dpy, screen, nelements); return (GLXFBConfig *)0;} - GLEEPFNGLXGETFBCONFIGSPROC GLeeFuncPtr_glXGetFBConfigs=GLee_Lazy_glXGetFBConfigs; -#endif -#ifndef GLEE_C_DEFINED_glXChooseFBConfig -#define GLEE_C_DEFINED_glXChooseFBConfig - GLXFBConfig * __stdcall GLee_Lazy_glXChooseFBConfig(Display * dpy, int screen, const int * attrib_list, int * nelements) {if (GLeeInit()) return glXChooseFBConfig(dpy, screen, attrib_list, nelements); return (GLXFBConfig *)0;} - GLEEPFNGLXCHOOSEFBCONFIGPROC GLeeFuncPtr_glXChooseFBConfig=GLee_Lazy_glXChooseFBConfig; -#endif -#ifndef GLEE_C_DEFINED_glXGetFBConfigAttrib -#define GLEE_C_DEFINED_glXGetFBConfigAttrib - int __stdcall GLee_Lazy_glXGetFBConfigAttrib(Display * dpy, GLXFBConfig config, int attribute, int * value) {if (GLeeInit()) return glXGetFBConfigAttrib(dpy, config, attribute, value); return (int)0;} - GLEEPFNGLXGETFBCONFIGATTRIBPROC GLeeFuncPtr_glXGetFBConfigAttrib=GLee_Lazy_glXGetFBConfigAttrib; -#endif -#ifndef GLEE_C_DEFINED_glXGetVisualFromFBConfig -#define GLEE_C_DEFINED_glXGetVisualFromFBConfig - XVisualInfo * __stdcall GLee_Lazy_glXGetVisualFromFBConfig(Display * dpy, GLXFBConfig config) {if (GLeeInit()) return glXGetVisualFromFBConfig(dpy, config); return (XVisualInfo *)0;} - GLEEPFNGLXGETVISUALFROMFBCONFIGPROC GLeeFuncPtr_glXGetVisualFromFBConfig=GLee_Lazy_glXGetVisualFromFBConfig; -#endif -#ifndef GLEE_C_DEFINED_glXCreateWindow -#define GLEE_C_DEFINED_glXCreateWindow - GLXWindow __stdcall GLee_Lazy_glXCreateWindow(Display * dpy, GLXFBConfig config, Window win, const int * attrib_list) {if (GLeeInit()) return glXCreateWindow(dpy, config, win, attrib_list); return (GLXWindow)0;} - GLEEPFNGLXCREATEWINDOWPROC GLeeFuncPtr_glXCreateWindow=GLee_Lazy_glXCreateWindow; -#endif -#ifndef GLEE_C_DEFINED_glXDestroyWindow -#define GLEE_C_DEFINED_glXDestroyWindow - void __stdcall GLee_Lazy_glXDestroyWindow(Display * dpy, GLXWindow win) {if (GLeeInit()) glXDestroyWindow(dpy, win);} - GLEEPFNGLXDESTROYWINDOWPROC GLeeFuncPtr_glXDestroyWindow=GLee_Lazy_glXDestroyWindow; -#endif -#ifndef GLEE_C_DEFINED_glXCreatePixmap -#define GLEE_C_DEFINED_glXCreatePixmap - GLXPixmap __stdcall GLee_Lazy_glXCreatePixmap(Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list) {if (GLeeInit()) return glXCreatePixmap(dpy, config, pixmap, attrib_list); return (GLXPixmap)0;} - GLEEPFNGLXCREATEPIXMAPPROC GLeeFuncPtr_glXCreatePixmap=GLee_Lazy_glXCreatePixmap; -#endif -#ifndef GLEE_C_DEFINED_glXDestroyPixmap -#define GLEE_C_DEFINED_glXDestroyPixmap - void __stdcall GLee_Lazy_glXDestroyPixmap(Display * dpy, GLXPixmap pixmap) {if (GLeeInit()) glXDestroyPixmap(dpy, pixmap);} - GLEEPFNGLXDESTROYPIXMAPPROC GLeeFuncPtr_glXDestroyPixmap=GLee_Lazy_glXDestroyPixmap; -#endif -#ifndef GLEE_C_DEFINED_glXCreatePbuffer -#define GLEE_C_DEFINED_glXCreatePbuffer - GLXPbuffer __stdcall GLee_Lazy_glXCreatePbuffer(Display * dpy, GLXFBConfig config, const int * attrib_list) {if (GLeeInit()) return glXCreatePbuffer(dpy, config, attrib_list); return (GLXPbuffer)0;} - GLEEPFNGLXCREATEPBUFFERPROC GLeeFuncPtr_glXCreatePbuffer=GLee_Lazy_glXCreatePbuffer; -#endif -#ifndef GLEE_C_DEFINED_glXDestroyPbuffer -#define GLEE_C_DEFINED_glXDestroyPbuffer - void __stdcall GLee_Lazy_glXDestroyPbuffer(Display * dpy, GLXPbuffer pbuf) {if (GLeeInit()) glXDestroyPbuffer(dpy, pbuf);} - GLEEPFNGLXDESTROYPBUFFERPROC GLeeFuncPtr_glXDestroyPbuffer=GLee_Lazy_glXDestroyPbuffer; -#endif -#ifndef GLEE_C_DEFINED_glXQueryDrawable -#define GLEE_C_DEFINED_glXQueryDrawable - void __stdcall GLee_Lazy_glXQueryDrawable(Display * dpy, GLXDrawable draw, int attribute, unsigned int * value) {if (GLeeInit()) glXQueryDrawable(dpy, draw, attribute, value);} - GLEEPFNGLXQUERYDRAWABLEPROC GLeeFuncPtr_glXQueryDrawable=GLee_Lazy_glXQueryDrawable; -#endif -#ifndef GLEE_C_DEFINED_glXCreateNewContext -#define GLEE_C_DEFINED_glXCreateNewContext - GLXContext __stdcall GLee_Lazy_glXCreateNewContext(Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct) {if (GLeeInit()) return glXCreateNewContext(dpy, config, render_type, share_list, direct); return (GLXContext)0;} - GLEEPFNGLXCREATENEWCONTEXTPROC GLeeFuncPtr_glXCreateNewContext=GLee_Lazy_glXCreateNewContext; -#endif -#ifndef GLEE_C_DEFINED_glXMakeContextCurrent -#define GLEE_C_DEFINED_glXMakeContextCurrent - Bool __stdcall GLee_Lazy_glXMakeContextCurrent(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) {if (GLeeInit()) return glXMakeContextCurrent(dpy, draw, read, ctx); return (Bool)0;} - GLEEPFNGLXMAKECONTEXTCURRENTPROC GLeeFuncPtr_glXMakeContextCurrent=GLee_Lazy_glXMakeContextCurrent; -#endif -#ifndef GLEE_C_DEFINED_glXGetCurrentReadDrawable -#define GLEE_C_DEFINED_glXGetCurrentReadDrawable - GLXDrawable __stdcall GLee_Lazy_glXGetCurrentReadDrawable(void) {if (GLeeInit()) return glXGetCurrentReadDrawable(); return (GLXDrawable)0;} - GLEEPFNGLXGETCURRENTREADDRAWABLEPROC GLeeFuncPtr_glXGetCurrentReadDrawable=GLee_Lazy_glXGetCurrentReadDrawable; -#endif -#ifndef GLEE_C_DEFINED_glXGetCurrentDisplay -#define GLEE_C_DEFINED_glXGetCurrentDisplay - Display * __stdcall GLee_Lazy_glXGetCurrentDisplay(void) {if (GLeeInit()) return glXGetCurrentDisplay(); return (Display *)0;} - GLEEPFNGLXGETCURRENTDISPLAYPROC GLeeFuncPtr_glXGetCurrentDisplay=GLee_Lazy_glXGetCurrentDisplay; -#endif -#ifndef GLEE_C_DEFINED_glXQueryContext -#define GLEE_C_DEFINED_glXQueryContext - int __stdcall GLee_Lazy_glXQueryContext(Display * dpy, GLXContext ctx, int attribute, int * value) {if (GLeeInit()) return glXQueryContext(dpy, ctx, attribute, value); return (int)0;} - GLEEPFNGLXQUERYCONTEXTPROC GLeeFuncPtr_glXQueryContext=GLee_Lazy_glXQueryContext; -#endif -#ifndef GLEE_C_DEFINED_glXSelectEvent -#define GLEE_C_DEFINED_glXSelectEvent - void __stdcall GLee_Lazy_glXSelectEvent(Display * dpy, GLXDrawable draw, unsigned long event_mask) {if (GLeeInit()) glXSelectEvent(dpy, draw, event_mask);} - GLEEPFNGLXSELECTEVENTPROC GLeeFuncPtr_glXSelectEvent=GLee_Lazy_glXSelectEvent; -#endif -#ifndef GLEE_C_DEFINED_glXGetSelectedEvent -#define GLEE_C_DEFINED_glXGetSelectedEvent - void __stdcall GLee_Lazy_glXGetSelectedEvent(Display * dpy, GLXDrawable draw, unsigned long * event_mask) {if (GLeeInit()) glXGetSelectedEvent(dpy, draw, event_mask);} - GLEEPFNGLXGETSELECTEDEVENTPROC GLeeFuncPtr_glXGetSelectedEvent=GLee_Lazy_glXGetSelectedEvent; -#endif -#endif - -/* GLX_VERSION_1_4 */ - -#ifdef __GLEE_GLX_VERSION_1_4 -#ifndef GLEE_C_DEFINED_glXGetProcAddress -#define GLEE_C_DEFINED_glXGetProcAddress - __GLXextFuncPtr __stdcall GLee_Lazy_glXGetProcAddress(const GLubyte * procName) {if (GLeeInit()) return glXGetProcAddress(procName); return (__GLXextFuncPtr)0;} - GLEEPFNGLXGETPROCADDRESSPROC GLeeFuncPtr_glXGetProcAddress=GLee_Lazy_glXGetProcAddress; -#endif -#endif - -/* GLX_ARB_multisample */ - -#ifdef __GLEE_GLX_ARB_multisample -#endif - -/* GLX_ARB_fbconfig_float */ - -#ifdef __GLEE_GLX_ARB_fbconfig_float -#endif - -/* GLX_ARB_create_context */ - -#ifdef __GLEE_GLX_ARB_create_context -#ifndef GLEE_C_DEFINED_glXCreateContextAttribsARB -#define GLEE_C_DEFINED_glXCreateContextAttribsARB - GLXContext __stdcall GLee_Lazy_glXCreateContextAttribsARB(Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list) {if (GLeeInit()) return glXCreateContextAttribsARB(dpy, config, share_context, direct, attrib_list); return (GLXContext)0;} - GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_glXCreateContextAttribsARB=GLee_Lazy_glXCreateContextAttribsARB; -#endif -#endif - -/* GLX_SGIS_multisample */ - -#ifdef __GLEE_GLX_SGIS_multisample -#endif - -/* GLX_EXT_visual_info */ - -#ifdef __GLEE_GLX_EXT_visual_info -#endif - -/* GLX_SGI_swap_control */ - -#ifdef __GLEE_GLX_SGI_swap_control -#ifndef GLEE_C_DEFINED_glXSwapIntervalSGI -#define GLEE_C_DEFINED_glXSwapIntervalSGI - int __stdcall GLee_Lazy_glXSwapIntervalSGI(int interval) {if (GLeeInit()) return glXSwapIntervalSGI(interval); return (int)0;} - GLEEPFNGLXSWAPINTERVALSGIPROC GLeeFuncPtr_glXSwapIntervalSGI=GLee_Lazy_glXSwapIntervalSGI; -#endif -#endif - -/* GLX_SGI_video_sync */ - -#ifdef __GLEE_GLX_SGI_video_sync -#ifndef GLEE_C_DEFINED_glXGetVideoSyncSGI -#define GLEE_C_DEFINED_glXGetVideoSyncSGI - int __stdcall GLee_Lazy_glXGetVideoSyncSGI(unsigned int * count) {if (GLeeInit()) return glXGetVideoSyncSGI(count); return (int)0;} - GLEEPFNGLXGETVIDEOSYNCSGIPROC GLeeFuncPtr_glXGetVideoSyncSGI=GLee_Lazy_glXGetVideoSyncSGI; -#endif -#ifndef GLEE_C_DEFINED_glXWaitVideoSyncSGI -#define GLEE_C_DEFINED_glXWaitVideoSyncSGI - int __stdcall GLee_Lazy_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int * count) {if (GLeeInit()) return glXWaitVideoSyncSGI(divisor, remainder, count); return (int)0;} - GLEEPFNGLXWAITVIDEOSYNCSGIPROC GLeeFuncPtr_glXWaitVideoSyncSGI=GLee_Lazy_glXWaitVideoSyncSGI; -#endif -#endif - -/* GLX_SGI_make_current_read */ - -#ifdef __GLEE_GLX_SGI_make_current_read -#ifndef GLEE_C_DEFINED_glXMakeCurrentReadSGI -#define GLEE_C_DEFINED_glXMakeCurrentReadSGI - Bool __stdcall GLee_Lazy_glXMakeCurrentReadSGI(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) {if (GLeeInit()) return glXMakeCurrentReadSGI(dpy, draw, read, ctx); return (Bool)0;} - GLEEPFNGLXMAKECURRENTREADSGIPROC GLeeFuncPtr_glXMakeCurrentReadSGI=GLee_Lazy_glXMakeCurrentReadSGI; -#endif -#ifndef GLEE_C_DEFINED_glXGetCurrentReadDrawableSGI -#define GLEE_C_DEFINED_glXGetCurrentReadDrawableSGI - GLXDrawable __stdcall GLee_Lazy_glXGetCurrentReadDrawableSGI(void) {if (GLeeInit()) return glXGetCurrentReadDrawableSGI(); return (GLXDrawable)0;} - GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC GLeeFuncPtr_glXGetCurrentReadDrawableSGI=GLee_Lazy_glXGetCurrentReadDrawableSGI; -#endif -#endif - -/* GLX_EXT_visual_rating */ - -#ifdef __GLEE_GLX_EXT_visual_rating -#endif - -/* GLX_EXT_import_context */ - -#ifdef __GLEE_GLX_EXT_import_context -#ifndef GLEE_C_DEFINED_glXGetCurrentDisplayEXT -#define GLEE_C_DEFINED_glXGetCurrentDisplayEXT - Display * __stdcall GLee_Lazy_glXGetCurrentDisplayEXT(void) {if (GLeeInit()) return glXGetCurrentDisplayEXT(); return (Display *)0;} - GLEEPFNGLXGETCURRENTDISPLAYEXTPROC GLeeFuncPtr_glXGetCurrentDisplayEXT=GLee_Lazy_glXGetCurrentDisplayEXT; -#endif -#ifndef GLEE_C_DEFINED_glXQueryContextInfoEXT -#define GLEE_C_DEFINED_glXQueryContextInfoEXT - int __stdcall GLee_Lazy_glXQueryContextInfoEXT(Display * dpy, GLXContext context, int attribute, int * value) {if (GLeeInit()) return glXQueryContextInfoEXT(dpy, context, attribute, value); return (int)0;} - GLEEPFNGLXQUERYCONTEXTINFOEXTPROC GLeeFuncPtr_glXQueryContextInfoEXT=GLee_Lazy_glXQueryContextInfoEXT; -#endif -#ifndef GLEE_C_DEFINED_glXGetContextIDEXT -#define GLEE_C_DEFINED_glXGetContextIDEXT - GLXContextID __stdcall GLee_Lazy_glXGetContextIDEXT(const GLXContext context) {if (GLeeInit()) return glXGetContextIDEXT(context); return (GLXContextID)0;} - GLEEPFNGLXGETCONTEXTIDEXTPROC GLeeFuncPtr_glXGetContextIDEXT=GLee_Lazy_glXGetContextIDEXT; -#endif -#ifndef GLEE_C_DEFINED_glXImportContextEXT -#define GLEE_C_DEFINED_glXImportContextEXT - GLXContext __stdcall GLee_Lazy_glXImportContextEXT(Display * dpy, GLXContextID contextID) {if (GLeeInit()) return glXImportContextEXT(dpy, contextID); return (GLXContext)0;} - GLEEPFNGLXIMPORTCONTEXTEXTPROC GLeeFuncPtr_glXImportContextEXT=GLee_Lazy_glXImportContextEXT; -#endif -#ifndef GLEE_C_DEFINED_glXFreeContextEXT -#define GLEE_C_DEFINED_glXFreeContextEXT - void __stdcall GLee_Lazy_glXFreeContextEXT(Display * dpy, GLXContext context) {if (GLeeInit()) glXFreeContextEXT(dpy, context);} - GLEEPFNGLXFREECONTEXTEXTPROC GLeeFuncPtr_glXFreeContextEXT=GLee_Lazy_glXFreeContextEXT; -#endif -#endif - -/* GLX_SGIX_fbconfig */ - -#ifdef __GLEE_GLX_SGIX_fbconfig -#ifndef GLEE_C_DEFINED_glXGetFBConfigAttribSGIX -#define GLEE_C_DEFINED_glXGetFBConfigAttribSGIX - int __stdcall GLee_Lazy_glXGetFBConfigAttribSGIX(Display * dpy, GLXFBConfigSGIX config, int attribute, int * value) {if (GLeeInit()) return glXGetFBConfigAttribSGIX(dpy, config, attribute, value); return (int)0;} - GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC GLeeFuncPtr_glXGetFBConfigAttribSGIX=GLee_Lazy_glXGetFBConfigAttribSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXChooseFBConfigSGIX -#define GLEE_C_DEFINED_glXChooseFBConfigSGIX - GLXFBConfigSGIX * __stdcall GLee_Lazy_glXChooseFBConfigSGIX(Display * dpy, int screen, int * attrib_list, int * nelements) {if (GLeeInit()) return glXChooseFBConfigSGIX(dpy, screen, attrib_list, nelements); return (GLXFBConfigSGIX *)0;} - GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC GLeeFuncPtr_glXChooseFBConfigSGIX=GLee_Lazy_glXChooseFBConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXCreateGLXPixmapWithConfigSGIX -#define GLEE_C_DEFINED_glXCreateGLXPixmapWithConfigSGIX - GLXPixmap __stdcall GLee_Lazy_glXCreateGLXPixmapWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap) {if (GLeeInit()) return glXCreateGLXPixmapWithConfigSGIX(dpy, config, pixmap); return (GLXPixmap)0;} - GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX=GLee_Lazy_glXCreateGLXPixmapWithConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXCreateContextWithConfigSGIX -#define GLEE_C_DEFINED_glXCreateContextWithConfigSGIX - GLXContext __stdcall GLee_Lazy_glXCreateContextWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct) {if (GLeeInit()) return glXCreateContextWithConfigSGIX(dpy, config, render_type, share_list, direct); return (GLXContext)0;} - GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateContextWithConfigSGIX=GLee_Lazy_glXCreateContextWithConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXGetVisualFromFBConfigSGIX -#define GLEE_C_DEFINED_glXGetVisualFromFBConfigSGIX - XVisualInfo * __stdcall GLee_Lazy_glXGetVisualFromFBConfigSGIX(Display * dpy, GLXFBConfigSGIX config) {if (GLeeInit()) return glXGetVisualFromFBConfigSGIX(dpy, config); return (XVisualInfo *)0;} - GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLeeFuncPtr_glXGetVisualFromFBConfigSGIX=GLee_Lazy_glXGetVisualFromFBConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXGetFBConfigFromVisualSGIX -#define GLEE_C_DEFINED_glXGetFBConfigFromVisualSGIX - GLXFBConfigSGIX __stdcall GLee_Lazy_glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis) {if (GLeeInit()) return glXGetFBConfigFromVisualSGIX(dpy, vis); return (GLXFBConfigSGIX)0;} - GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLeeFuncPtr_glXGetFBConfigFromVisualSGIX=GLee_Lazy_glXGetFBConfigFromVisualSGIX; -#endif -#endif - -/* GLX_SGIX_pbuffer */ - -#ifdef __GLEE_GLX_SGIX_pbuffer -#ifndef GLEE_C_DEFINED_glXCreateGLXPbufferSGIX -#define GLEE_C_DEFINED_glXCreateGLXPbufferSGIX - GLXPbufferSGIX __stdcall GLee_Lazy_glXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list) {if (GLeeInit()) return glXCreateGLXPbufferSGIX(dpy, config, width, height, attrib_list); return (GLXPbufferSGIX)0;} - GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC GLeeFuncPtr_glXCreateGLXPbufferSGIX=GLee_Lazy_glXCreateGLXPbufferSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXDestroyGLXPbufferSGIX -#define GLEE_C_DEFINED_glXDestroyGLXPbufferSGIX - void __stdcall GLee_Lazy_glXDestroyGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX pbuf) {if (GLeeInit()) glXDestroyGLXPbufferSGIX(dpy, pbuf);} - GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXDestroyGLXPbufferSGIX=GLee_Lazy_glXDestroyGLXPbufferSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryGLXPbufferSGIX -#define GLEE_C_DEFINED_glXQueryGLXPbufferSGIX - int __stdcall GLee_Lazy_glXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value) {if (GLeeInit()) return glXQueryGLXPbufferSGIX(dpy, pbuf, attribute, value); return (int)0;} - GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXQueryGLXPbufferSGIX=GLee_Lazy_glXQueryGLXPbufferSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXSelectEventSGIX -#define GLEE_C_DEFINED_glXSelectEventSGIX - void __stdcall GLee_Lazy_glXSelectEventSGIX(Display * dpy, GLXDrawable drawable, unsigned long mask) {if (GLeeInit()) glXSelectEventSGIX(dpy, drawable, mask);} - GLEEPFNGLXSELECTEVENTSGIXPROC GLeeFuncPtr_glXSelectEventSGIX=GLee_Lazy_glXSelectEventSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXGetSelectedEventSGIX -#define GLEE_C_DEFINED_glXGetSelectedEventSGIX - void __stdcall GLee_Lazy_glXGetSelectedEventSGIX(Display * dpy, GLXDrawable drawable, unsigned long * mask) {if (GLeeInit()) glXGetSelectedEventSGIX(dpy, drawable, mask);} - GLEEPFNGLXGETSELECTEDEVENTSGIXPROC GLeeFuncPtr_glXGetSelectedEventSGIX=GLee_Lazy_glXGetSelectedEventSGIX; -#endif -#endif - -/* GLX_SGI_cushion */ - -#ifdef __GLEE_GLX_SGI_cushion -#ifndef GLEE_C_DEFINED_glXCushionSGI -#define GLEE_C_DEFINED_glXCushionSGI - void __stdcall GLee_Lazy_glXCushionSGI(Display * dpy, Window window, float cushion) {if (GLeeInit()) glXCushionSGI(dpy, window, cushion);} - GLEEPFNGLXCUSHIONSGIPROC GLeeFuncPtr_glXCushionSGI=GLee_Lazy_glXCushionSGI; -#endif -#endif - -/* GLX_SGIX_video_resize */ - -#ifdef __GLEE_GLX_SGIX_video_resize -#ifndef GLEE_C_DEFINED_glXBindChannelToWindowSGIX -#define GLEE_C_DEFINED_glXBindChannelToWindowSGIX - int __stdcall GLee_Lazy_glXBindChannelToWindowSGIX(Display * display, int screen, int channel, Window window) {if (GLeeInit()) return glXBindChannelToWindowSGIX(display, screen, channel, window); return (int)0;} - GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC GLeeFuncPtr_glXBindChannelToWindowSGIX=GLee_Lazy_glXBindChannelToWindowSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXChannelRectSGIX -#define GLEE_C_DEFINED_glXChannelRectSGIX - int __stdcall GLee_Lazy_glXChannelRectSGIX(Display * display, int screen, int channel, int x, int y, int w, int h) {if (GLeeInit()) return glXChannelRectSGIX(display, screen, channel, x, y, w, h); return (int)0;} - GLEEPFNGLXCHANNELRECTSGIXPROC GLeeFuncPtr_glXChannelRectSGIX=GLee_Lazy_glXChannelRectSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryChannelRectSGIX -#define GLEE_C_DEFINED_glXQueryChannelRectSGIX - int __stdcall GLee_Lazy_glXQueryChannelRectSGIX(Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh) {if (GLeeInit()) return glXQueryChannelRectSGIX(display, screen, channel, dx, dy, dw, dh); return (int)0;} - GLEEPFNGLXQUERYCHANNELRECTSGIXPROC GLeeFuncPtr_glXQueryChannelRectSGIX=GLee_Lazy_glXQueryChannelRectSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryChannelDeltasSGIX -#define GLEE_C_DEFINED_glXQueryChannelDeltasSGIX - int __stdcall GLee_Lazy_glXQueryChannelDeltasSGIX(Display * display, int screen, int channel, int * x, int * y, int * w, int * h) {if (GLeeInit()) return glXQueryChannelDeltasSGIX(display, screen, channel, x, y, w, h); return (int)0;} - GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC GLeeFuncPtr_glXQueryChannelDeltasSGIX=GLee_Lazy_glXQueryChannelDeltasSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXChannelRectSyncSGIX -#define GLEE_C_DEFINED_glXChannelRectSyncSGIX - int __stdcall GLee_Lazy_glXChannelRectSyncSGIX(Display * display, int screen, int channel, GLenum synctype) {if (GLeeInit()) return glXChannelRectSyncSGIX(display, screen, channel, synctype); return (int)0;} - GLEEPFNGLXCHANNELRECTSYNCSGIXPROC GLeeFuncPtr_glXChannelRectSyncSGIX=GLee_Lazy_glXChannelRectSyncSGIX; -#endif -#endif - -/* GLX_SGIX_swap_group */ - -#ifdef __GLEE_GLX_SGIX_swap_group -#ifndef GLEE_C_DEFINED_glXJoinSwapGroupSGIX -#define GLEE_C_DEFINED_glXJoinSwapGroupSGIX - void __stdcall GLee_Lazy_glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable, GLXDrawable member) {if (GLeeInit()) glXJoinSwapGroupSGIX(dpy, drawable, member);} - GLEEPFNGLXJOINSWAPGROUPSGIXPROC GLeeFuncPtr_glXJoinSwapGroupSGIX=GLee_Lazy_glXJoinSwapGroupSGIX; -#endif -#endif - -/* GLX_SGIX_swap_barrier */ - -#ifdef __GLEE_GLX_SGIX_swap_barrier -#ifndef GLEE_C_DEFINED_glXBindSwapBarrierSGIX -#define GLEE_C_DEFINED_glXBindSwapBarrierSGIX - void __stdcall GLee_Lazy_glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier) {if (GLeeInit()) glXBindSwapBarrierSGIX(dpy, drawable, barrier);} - GLEEPFNGLXBINDSWAPBARRIERSGIXPROC GLeeFuncPtr_glXBindSwapBarrierSGIX=GLee_Lazy_glXBindSwapBarrierSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryMaxSwapBarriersSGIX -#define GLEE_C_DEFINED_glXQueryMaxSwapBarriersSGIX - Bool __stdcall GLee_Lazy_glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int * max) {if (GLeeInit()) return glXQueryMaxSwapBarriersSGIX(dpy, screen, max); return (Bool)0;} - GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX=GLee_Lazy_glXQueryMaxSwapBarriersSGIX; -#endif -#endif - -/* GLX_SGIS_blended_overlay */ - -#ifdef __GLEE_GLX_SGIS_blended_overlay -#endif - -/* GLX_SGIS_shared_multisample */ - -#ifdef __GLEE_GLX_SGIS_shared_multisample -#endif - -/* GLX_SUN_get_transparent_index */ - -#ifdef __GLEE_GLX_SUN_get_transparent_index -#ifndef GLEE_C_DEFINED_glXGetTransparentIndexSUN -#define GLEE_C_DEFINED_glXGetTransparentIndexSUN - Status __stdcall GLee_Lazy_glXGetTransparentIndexSUN(Display * dpy, Window overlay, Window underlay, long * pTransparentIndex) {if (GLeeInit()) return glXGetTransparentIndexSUN(dpy, overlay, underlay, pTransparentIndex); return (Status)0;} - GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC GLeeFuncPtr_glXGetTransparentIndexSUN=GLee_Lazy_glXGetTransparentIndexSUN; -#endif -#endif - -/* GLX_3DFX_multisample */ - -#ifdef __GLEE_GLX_3DFX_multisample -#endif - -/* GLX_MESA_copy_sub_buffer */ - -#ifdef __GLEE_GLX_MESA_copy_sub_buffer -#ifndef GLEE_C_DEFINED_glXCopySubBufferMESA -#define GLEE_C_DEFINED_glXCopySubBufferMESA - void __stdcall GLee_Lazy_glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable, int x, int y, int width, int height) {if (GLeeInit()) glXCopySubBufferMESA(dpy, drawable, x, y, width, height);} - GLEEPFNGLXCOPYSUBBUFFERMESAPROC GLeeFuncPtr_glXCopySubBufferMESA=GLee_Lazy_glXCopySubBufferMESA; -#endif -#endif - -/* GLX_MESA_pixmap_colormap */ - -#ifdef __GLEE_GLX_MESA_pixmap_colormap -#ifndef GLEE_C_DEFINED_glXCreateGLXPixmapMESA -#define GLEE_C_DEFINED_glXCreateGLXPixmapMESA - GLXPixmap __stdcall GLee_Lazy_glXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap) {if (GLeeInit()) return glXCreateGLXPixmapMESA(dpy, visual, pixmap, cmap); return (GLXPixmap)0;} - GLEEPFNGLXCREATEGLXPIXMAPMESAPROC GLeeFuncPtr_glXCreateGLXPixmapMESA=GLee_Lazy_glXCreateGLXPixmapMESA; -#endif -#endif - -/* GLX_MESA_release_buffers */ - -#ifdef __GLEE_GLX_MESA_release_buffers -#ifndef GLEE_C_DEFINED_glXReleaseBuffersMESA -#define GLEE_C_DEFINED_glXReleaseBuffersMESA - Bool __stdcall GLee_Lazy_glXReleaseBuffersMESA(Display * dpy, GLXDrawable drawable) {if (GLeeInit()) return glXReleaseBuffersMESA(dpy, drawable); return (Bool)0;} - GLEEPFNGLXRELEASEBUFFERSMESAPROC GLeeFuncPtr_glXReleaseBuffersMESA=GLee_Lazy_glXReleaseBuffersMESA; -#endif -#endif - -/* GLX_MESA_set_3dfx_mode */ - -#ifdef __GLEE_GLX_MESA_set_3dfx_mode -#ifndef GLEE_C_DEFINED_glXSet3DfxModeMESA -#define GLEE_C_DEFINED_glXSet3DfxModeMESA - Bool __stdcall GLee_Lazy_glXSet3DfxModeMESA(int mode) {if (GLeeInit()) return glXSet3DfxModeMESA(mode); return (Bool)0;} - GLEEPFNGLXSET3DFXMODEMESAPROC GLeeFuncPtr_glXSet3DfxModeMESA=GLee_Lazy_glXSet3DfxModeMESA; -#endif -#endif - -/* GLX_SGIX_visual_select_group */ - -#ifdef __GLEE_GLX_SGIX_visual_select_group -#endif - -/* GLX_OML_swap_method */ - -#ifdef __GLEE_GLX_OML_swap_method -#endif - -/* GLX_OML_sync_control */ - -#ifdef __GLEE_GLX_OML_sync_control -#ifndef GLEE_C_DEFINED_glXGetSyncValuesOML -#define GLEE_C_DEFINED_glXGetSyncValuesOML - Bool __stdcall GLee_Lazy_glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc) {if (GLeeInit()) return glXGetSyncValuesOML(dpy, drawable, ust, msc, sbc); return (Bool)0;} - GLEEPFNGLXGETSYNCVALUESOMLPROC GLeeFuncPtr_glXGetSyncValuesOML=GLee_Lazy_glXGetSyncValuesOML; -#endif -#ifndef GLEE_C_DEFINED_glXGetMscRateOML -#define GLEE_C_DEFINED_glXGetMscRateOML - Bool __stdcall GLee_Lazy_glXGetMscRateOML(Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator) {if (GLeeInit()) return glXGetMscRateOML(dpy, drawable, numerator, denominator); return (Bool)0;} - GLEEPFNGLXGETMSCRATEOMLPROC GLeeFuncPtr_glXGetMscRateOML=GLee_Lazy_glXGetMscRateOML; -#endif -#ifndef GLEE_C_DEFINED_glXSwapBuffersMscOML -#define GLEE_C_DEFINED_glXSwapBuffersMscOML - int64_t __stdcall GLee_Lazy_glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder) {if (GLeeInit()) return glXSwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder); return (int64_t)0;} - GLEEPFNGLXSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_glXSwapBuffersMscOML=GLee_Lazy_glXSwapBuffersMscOML; -#endif -#ifndef GLEE_C_DEFINED_glXWaitForMscOML -#define GLEE_C_DEFINED_glXWaitForMscOML - Bool __stdcall GLee_Lazy_glXWaitForMscOML(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * ust, int64_t * msc, int64_t * sbc) {if (GLeeInit()) return glXWaitForMscOML(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc); return (Bool)0;} - GLEEPFNGLXWAITFORMSCOMLPROC GLeeFuncPtr_glXWaitForMscOML=GLee_Lazy_glXWaitForMscOML; -#endif -#ifndef GLEE_C_DEFINED_glXWaitForSbcOML -#define GLEE_C_DEFINED_glXWaitForSbcOML - Bool __stdcall GLee_Lazy_glXWaitForSbcOML(Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc) {if (GLeeInit()) return glXWaitForSbcOML(dpy, drawable, target_sbc, ust, msc, sbc); return (Bool)0;} - GLEEPFNGLXWAITFORSBCOMLPROC GLeeFuncPtr_glXWaitForSbcOML=GLee_Lazy_glXWaitForSbcOML; -#endif -#endif - -/* GLX_NV_float_buffer */ - -#ifdef __GLEE_GLX_NV_float_buffer -#endif - -/* GLX_SGIX_hyperpipe */ - -#ifdef __GLEE_GLX_SGIX_hyperpipe -#ifndef GLEE_C_DEFINED_glXQueryHyperpipeNetworkSGIX -#define GLEE_C_DEFINED_glXQueryHyperpipeNetworkSGIX - GLXHyperpipeNetworkSGIX * __stdcall GLee_Lazy_glXQueryHyperpipeNetworkSGIX(Display * dpy, int * npipes) {if (GLeeInit()) return glXQueryHyperpipeNetworkSGIX(dpy, npipes); return (GLXHyperpipeNetworkSGIX *)0;} - GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX=GLee_Lazy_glXQueryHyperpipeNetworkSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXHyperpipeConfigSGIX -#define GLEE_C_DEFINED_glXHyperpipeConfigSGIX - int __stdcall GLee_Lazy_glXHyperpipeConfigSGIX(Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId) {if (GLeeInit()) return glXHyperpipeConfigSGIX(dpy, networkId, npipes, cfg, hpId); return (int)0;} - GLEEPFNGLXHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXHyperpipeConfigSGIX=GLee_Lazy_glXHyperpipeConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryHyperpipeConfigSGIX -#define GLEE_C_DEFINED_glXQueryHyperpipeConfigSGIX - GLXHyperpipeConfigSGIX * __stdcall GLee_Lazy_glXQueryHyperpipeConfigSGIX(Display * dpy, int hpId, int * npipes) {if (GLeeInit()) return glXQueryHyperpipeConfigSGIX(dpy, hpId, npipes); return (GLXHyperpipeConfigSGIX *)0;} - GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXQueryHyperpipeConfigSGIX=GLee_Lazy_glXQueryHyperpipeConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXDestroyHyperpipeConfigSGIX -#define GLEE_C_DEFINED_glXDestroyHyperpipeConfigSGIX - int __stdcall GLee_Lazy_glXDestroyHyperpipeConfigSGIX(Display * dpy, int hpId) {if (GLeeInit()) return glXDestroyHyperpipeConfigSGIX(dpy, hpId); return (int)0;} - GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX=GLee_Lazy_glXDestroyHyperpipeConfigSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXBindHyperpipeSGIX -#define GLEE_C_DEFINED_glXBindHyperpipeSGIX - int __stdcall GLee_Lazy_glXBindHyperpipeSGIX(Display * dpy, int hpId) {if (GLeeInit()) return glXBindHyperpipeSGIX(dpy, hpId); return (int)0;} - GLEEPFNGLXBINDHYPERPIPESGIXPROC GLeeFuncPtr_glXBindHyperpipeSGIX=GLee_Lazy_glXBindHyperpipeSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryHyperpipeBestAttribSGIX -#define GLEE_C_DEFINED_glXQueryHyperpipeBestAttribSGIX - int __stdcall GLee_Lazy_glXQueryHyperpipeBestAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList) {if (GLeeInit()) return glXQueryHyperpipeBestAttribSGIX(dpy, timeSlice, attrib, size, attribList, returnAttribList); return (int)0;} - GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX=GLee_Lazy_glXQueryHyperpipeBestAttribSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXHyperpipeAttribSGIX -#define GLEE_C_DEFINED_glXHyperpipeAttribSGIX - int __stdcall GLee_Lazy_glXHyperpipeAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * attribList) {if (GLeeInit()) return glXHyperpipeAttribSGIX(dpy, timeSlice, attrib, size, attribList); return (int)0;} - GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXHyperpipeAttribSGIX=GLee_Lazy_glXHyperpipeAttribSGIX; -#endif -#ifndef GLEE_C_DEFINED_glXQueryHyperpipeAttribSGIX -#define GLEE_C_DEFINED_glXQueryHyperpipeAttribSGIX - int __stdcall GLee_Lazy_glXQueryHyperpipeAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList) {if (GLeeInit()) return glXQueryHyperpipeAttribSGIX(dpy, timeSlice, attrib, size, returnAttribList); return (int)0;} - GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeAttribSGIX=GLee_Lazy_glXQueryHyperpipeAttribSGIX; -#endif -#endif - -/* GLX_MESA_agp_offset */ - -#ifdef __GLEE_GLX_MESA_agp_offset -#ifndef GLEE_C_DEFINED_glXGetAGPOffsetMESA -#define GLEE_C_DEFINED_glXGetAGPOffsetMESA - unsigned int __stdcall GLee_Lazy_glXGetAGPOffsetMESA(const void * pointer) {if (GLeeInit()) return glXGetAGPOffsetMESA(pointer); return (unsigned int)0;} - GLEEPFNGLXGETAGPOFFSETMESAPROC GLeeFuncPtr_glXGetAGPOffsetMESA=GLee_Lazy_glXGetAGPOffsetMESA; -#endif -#endif - -/* GLX_EXT_fbconfig_packed_float */ - -#ifdef __GLEE_GLX_EXT_fbconfig_packed_float -#endif - -/* GLX_EXT_framebuffer_sRGB */ - -#ifdef __GLEE_GLX_EXT_framebuffer_sRGB -#endif - -/* GLX_EXT_texture_from_pixmap */ - -#ifdef __GLEE_GLX_EXT_texture_from_pixmap -#ifndef GLEE_C_DEFINED_glXBindTexImageEXT -#define GLEE_C_DEFINED_glXBindTexImageEXT - void __stdcall GLee_Lazy_glXBindTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list) {if (GLeeInit()) glXBindTexImageEXT(dpy, drawable, buffer, attrib_list);} - GLEEPFNGLXBINDTEXIMAGEEXTPROC GLeeFuncPtr_glXBindTexImageEXT=GLee_Lazy_glXBindTexImageEXT; -#endif -#ifndef GLEE_C_DEFINED_glXReleaseTexImageEXT -#define GLEE_C_DEFINED_glXReleaseTexImageEXT - void __stdcall GLee_Lazy_glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer) {if (GLeeInit()) glXReleaseTexImageEXT(dpy, drawable, buffer);} - GLEEPFNGLXRELEASETEXIMAGEEXTPROC GLeeFuncPtr_glXReleaseTexImageEXT=GLee_Lazy_glXReleaseTexImageEXT; -#endif -#endif - -/* GLX_NV_present_video */ - -#ifdef __GLEE_GLX_NV_present_video -#endif - -/* GLX_NV_video_out */ - -#ifdef __GLEE_GLX_NV_video_out -#endif - -/* GLX_NV_swap_group */ - -#ifdef __GLEE_GLX_NV_swap_group -#endif - -/* GLX_EXT_scene_marker */ - -#ifdef __GLEE_GLX_EXT_scene_marker -#endif - -/* GLX_NV_video_output */ - -#ifdef __GLEE_GLX_NV_video_output -#ifndef GLEE_C_DEFINED_glXGetVideoDeviceNV -#define GLEE_C_DEFINED_glXGetVideoDeviceNV - int __stdcall GLee_Lazy_glXGetVideoDeviceNV(Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice) {if (GLeeInit()) return glXGetVideoDeviceNV(dpy, screen, numVideoDevices, pVideoDevice); return (int)0;} - GLEEPFNGLXGETVIDEODEVICENVPROC GLeeFuncPtr_glXGetVideoDeviceNV=GLee_Lazy_glXGetVideoDeviceNV; -#endif -#ifndef GLEE_C_DEFINED_glXReleaseVideoDeviceNV -#define GLEE_C_DEFINED_glXReleaseVideoDeviceNV - int __stdcall GLee_Lazy_glXReleaseVideoDeviceNV(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice) {if (GLeeInit()) return glXReleaseVideoDeviceNV(dpy, screen, VideoDevice); return (int)0;} - GLEEPFNGLXRELEASEVIDEODEVICENVPROC GLeeFuncPtr_glXReleaseVideoDeviceNV=GLee_Lazy_glXReleaseVideoDeviceNV; -#endif -#ifndef GLEE_C_DEFINED_glXBindVideoImageNV -#define GLEE_C_DEFINED_glXBindVideoImageNV - int __stdcall GLee_Lazy_glXBindVideoImageNV(Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer) {if (GLeeInit()) return glXBindVideoImageNV(dpy, VideoDevice, pbuf, iVideoBuffer); return (int)0;} - GLEEPFNGLXBINDVIDEOIMAGENVPROC GLeeFuncPtr_glXBindVideoImageNV=GLee_Lazy_glXBindVideoImageNV; -#endif -#ifndef GLEE_C_DEFINED_glXReleaseVideoImageNV -#define GLEE_C_DEFINED_glXReleaseVideoImageNV - int __stdcall GLee_Lazy_glXReleaseVideoImageNV(Display * dpy, GLXPbuffer pbuf) {if (GLeeInit()) return glXReleaseVideoImageNV(dpy, pbuf); return (int)0;} - GLEEPFNGLXRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_glXReleaseVideoImageNV=GLee_Lazy_glXReleaseVideoImageNV; -#endif -#ifndef GLEE_C_DEFINED_glXSendPbufferToVideoNV -#define GLEE_C_DEFINED_glXSendPbufferToVideoNV - int __stdcall GLee_Lazy_glXSendPbufferToVideoNV(Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock) {if (GLeeInit()) return glXSendPbufferToVideoNV(dpy, pbuf, iBufferType, pulCounterPbuffer, bBlock); return (int)0;} - GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_glXSendPbufferToVideoNV=GLee_Lazy_glXSendPbufferToVideoNV; -#endif -#ifndef GLEE_C_DEFINED_glXGetVideoInfoNV -#define GLEE_C_DEFINED_glXGetVideoInfoNV - int __stdcall GLee_Lazy_glXGetVideoInfoNV(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo) {if (GLeeInit()) return glXGetVideoInfoNV(dpy, screen, VideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo); return (int)0;} - GLEEPFNGLXGETVIDEOINFONVPROC GLeeFuncPtr_glXGetVideoInfoNV=GLee_Lazy_glXGetVideoInfoNV; -#endif -#endif -#endif /* end GLX */ -/***************************************************************** -* Extension link functions -*****************************************************************/ - -GLuint __GLeeLink_GL_VERSION_1_2(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_1_2 - if ((GLeeFuncPtr_glBlendColor = (GLEEPFNGLBLENDCOLORPROC) __GLeeGetProcAddress("glBlendColor"))!=0) nLinked++; - if ((GLeeFuncPtr_glBlendEquation = (GLEEPFNGLBLENDEQUATIONPROC) __GLeeGetProcAddress("glBlendEquation"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawRangeElements = (GLEEPFNGLDRAWRANGEELEMENTSPROC) __GLeeGetProcAddress("glDrawRangeElements"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorTable = (GLEEPFNGLCOLORTABLEPROC) __GLeeGetProcAddress("glColorTable"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorTableParameterfv = (GLEEPFNGLCOLORTABLEPARAMETERFVPROC) __GLeeGetProcAddress("glColorTableParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorTableParameteriv = (GLEEPFNGLCOLORTABLEPARAMETERIVPROC) __GLeeGetProcAddress("glColorTableParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyColorTable = (GLEEPFNGLCOPYCOLORTABLEPROC) __GLeeGetProcAddress("glCopyColorTable"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTable = (GLEEPFNGLGETCOLORTABLEPROC) __GLeeGetProcAddress("glGetColorTable"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableParameterfv = (GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC) __GLeeGetProcAddress("glGetColorTableParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableParameteriv = (GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC) __GLeeGetProcAddress("glGetColorTableParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorSubTable = (GLEEPFNGLCOLORSUBTABLEPROC) __GLeeGetProcAddress("glColorSubTable"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyColorSubTable = (GLEEPFNGLCOPYCOLORSUBTABLEPROC) __GLeeGetProcAddress("glCopyColorSubTable"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionFilter1D = (GLEEPFNGLCONVOLUTIONFILTER1DPROC) __GLeeGetProcAddress("glConvolutionFilter1D"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionFilter2D = (GLEEPFNGLCONVOLUTIONFILTER2DPROC) __GLeeGetProcAddress("glConvolutionFilter2D"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameterf = (GLEEPFNGLCONVOLUTIONPARAMETERFPROC) __GLeeGetProcAddress("glConvolutionParameterf"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameterfv = (GLEEPFNGLCONVOLUTIONPARAMETERFVPROC) __GLeeGetProcAddress("glConvolutionParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameteri = (GLEEPFNGLCONVOLUTIONPARAMETERIPROC) __GLeeGetProcAddress("glConvolutionParameteri"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameteriv = (GLEEPFNGLCONVOLUTIONPARAMETERIVPROC) __GLeeGetProcAddress("glConvolutionParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyConvolutionFilter1D = (GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC) __GLeeGetProcAddress("glCopyConvolutionFilter1D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyConvolutionFilter2D = (GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC) __GLeeGetProcAddress("glCopyConvolutionFilter2D"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetConvolutionFilter = (GLEEPFNGLGETCONVOLUTIONFILTERPROC) __GLeeGetProcAddress("glGetConvolutionFilter"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetConvolutionParameterfv = (GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC) __GLeeGetProcAddress("glGetConvolutionParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetConvolutionParameteriv = (GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC) __GLeeGetProcAddress("glGetConvolutionParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetSeparableFilter = (GLEEPFNGLGETSEPARABLEFILTERPROC) __GLeeGetProcAddress("glGetSeparableFilter"))!=0) nLinked++; - if ((GLeeFuncPtr_glSeparableFilter2D = (GLEEPFNGLSEPARABLEFILTER2DPROC) __GLeeGetProcAddress("glSeparableFilter2D"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetHistogram = (GLEEPFNGLGETHISTOGRAMPROC) __GLeeGetProcAddress("glGetHistogram"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetHistogramParameterfv = (GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC) __GLeeGetProcAddress("glGetHistogramParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetHistogramParameteriv = (GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC) __GLeeGetProcAddress("glGetHistogramParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMinmax = (GLEEPFNGLGETMINMAXPROC) __GLeeGetProcAddress("glGetMinmax"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMinmaxParameterfv = (GLEEPFNGLGETMINMAXPARAMETERFVPROC) __GLeeGetProcAddress("glGetMinmaxParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMinmaxParameteriv = (GLEEPFNGLGETMINMAXPARAMETERIVPROC) __GLeeGetProcAddress("glGetMinmaxParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glHistogram = (GLEEPFNGLHISTOGRAMPROC) __GLeeGetProcAddress("glHistogram"))!=0) nLinked++; - if ((GLeeFuncPtr_glMinmax = (GLEEPFNGLMINMAXPROC) __GLeeGetProcAddress("glMinmax"))!=0) nLinked++; - if ((GLeeFuncPtr_glResetHistogram = (GLEEPFNGLRESETHISTOGRAMPROC) __GLeeGetProcAddress("glResetHistogram"))!=0) nLinked++; - if ((GLeeFuncPtr_glResetMinmax = (GLEEPFNGLRESETMINMAXPROC) __GLeeGetProcAddress("glResetMinmax"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexImage3D = (GLEEPFNGLTEXIMAGE3DPROC) __GLeeGetProcAddress("glTexImage3D"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexSubImage3D = (GLEEPFNGLTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glTexSubImage3D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTexSubImage3D = (GLEEPFNGLCOPYTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glCopyTexSubImage3D"))!=0) nLinked++; -#endif - if (nLinked==38) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_imaging(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_VERSION_1_3(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_1_3 - if ((GLeeFuncPtr_glActiveTexture = (GLEEPFNGLACTIVETEXTUREPROC) __GLeeGetProcAddress("glActiveTexture"))!=0) nLinked++; - if ((GLeeFuncPtr_glClientActiveTexture = (GLEEPFNGLCLIENTACTIVETEXTUREPROC) __GLeeGetProcAddress("glClientActiveTexture"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1d = (GLEEPFNGLMULTITEXCOORD1DPROC) __GLeeGetProcAddress("glMultiTexCoord1d"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1dv = (GLEEPFNGLMULTITEXCOORD1DVPROC) __GLeeGetProcAddress("glMultiTexCoord1dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1f = (GLEEPFNGLMULTITEXCOORD1FPROC) __GLeeGetProcAddress("glMultiTexCoord1f"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1fv = (GLEEPFNGLMULTITEXCOORD1FVPROC) __GLeeGetProcAddress("glMultiTexCoord1fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1i = (GLEEPFNGLMULTITEXCOORD1IPROC) __GLeeGetProcAddress("glMultiTexCoord1i"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1iv = (GLEEPFNGLMULTITEXCOORD1IVPROC) __GLeeGetProcAddress("glMultiTexCoord1iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1s = (GLEEPFNGLMULTITEXCOORD1SPROC) __GLeeGetProcAddress("glMultiTexCoord1s"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1sv = (GLEEPFNGLMULTITEXCOORD1SVPROC) __GLeeGetProcAddress("glMultiTexCoord1sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2d = (GLEEPFNGLMULTITEXCOORD2DPROC) __GLeeGetProcAddress("glMultiTexCoord2d"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2dv = (GLEEPFNGLMULTITEXCOORD2DVPROC) __GLeeGetProcAddress("glMultiTexCoord2dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2f = (GLEEPFNGLMULTITEXCOORD2FPROC) __GLeeGetProcAddress("glMultiTexCoord2f"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2fv = (GLEEPFNGLMULTITEXCOORD2FVPROC) __GLeeGetProcAddress("glMultiTexCoord2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2i = (GLEEPFNGLMULTITEXCOORD2IPROC) __GLeeGetProcAddress("glMultiTexCoord2i"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2iv = (GLEEPFNGLMULTITEXCOORD2IVPROC) __GLeeGetProcAddress("glMultiTexCoord2iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2s = (GLEEPFNGLMULTITEXCOORD2SPROC) __GLeeGetProcAddress("glMultiTexCoord2s"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2sv = (GLEEPFNGLMULTITEXCOORD2SVPROC) __GLeeGetProcAddress("glMultiTexCoord2sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3d = (GLEEPFNGLMULTITEXCOORD3DPROC) __GLeeGetProcAddress("glMultiTexCoord3d"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3dv = (GLEEPFNGLMULTITEXCOORD3DVPROC) __GLeeGetProcAddress("glMultiTexCoord3dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3f = (GLEEPFNGLMULTITEXCOORD3FPROC) __GLeeGetProcAddress("glMultiTexCoord3f"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3fv = (GLEEPFNGLMULTITEXCOORD3FVPROC) __GLeeGetProcAddress("glMultiTexCoord3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3i = (GLEEPFNGLMULTITEXCOORD3IPROC) __GLeeGetProcAddress("glMultiTexCoord3i"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3iv = (GLEEPFNGLMULTITEXCOORD3IVPROC) __GLeeGetProcAddress("glMultiTexCoord3iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3s = (GLEEPFNGLMULTITEXCOORD3SPROC) __GLeeGetProcAddress("glMultiTexCoord3s"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3sv = (GLEEPFNGLMULTITEXCOORD3SVPROC) __GLeeGetProcAddress("glMultiTexCoord3sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4d = (GLEEPFNGLMULTITEXCOORD4DPROC) __GLeeGetProcAddress("glMultiTexCoord4d"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4dv = (GLEEPFNGLMULTITEXCOORD4DVPROC) __GLeeGetProcAddress("glMultiTexCoord4dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4f = (GLEEPFNGLMULTITEXCOORD4FPROC) __GLeeGetProcAddress("glMultiTexCoord4f"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4fv = (GLEEPFNGLMULTITEXCOORD4FVPROC) __GLeeGetProcAddress("glMultiTexCoord4fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4i = (GLEEPFNGLMULTITEXCOORD4IPROC) __GLeeGetProcAddress("glMultiTexCoord4i"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4iv = (GLEEPFNGLMULTITEXCOORD4IVPROC) __GLeeGetProcAddress("glMultiTexCoord4iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4s = (GLEEPFNGLMULTITEXCOORD4SPROC) __GLeeGetProcAddress("glMultiTexCoord4s"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4sv = (GLEEPFNGLMULTITEXCOORD4SVPROC) __GLeeGetProcAddress("glMultiTexCoord4sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glLoadTransposeMatrixf = (GLEEPFNGLLOADTRANSPOSEMATRIXFPROC) __GLeeGetProcAddress("glLoadTransposeMatrixf"))!=0) nLinked++; - if ((GLeeFuncPtr_glLoadTransposeMatrixd = (GLEEPFNGLLOADTRANSPOSEMATRIXDPROC) __GLeeGetProcAddress("glLoadTransposeMatrixd"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultTransposeMatrixf = (GLEEPFNGLMULTTRANSPOSEMATRIXFPROC) __GLeeGetProcAddress("glMultTransposeMatrixf"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultTransposeMatrixd = (GLEEPFNGLMULTTRANSPOSEMATRIXDPROC) __GLeeGetProcAddress("glMultTransposeMatrixd"))!=0) nLinked++; - if ((GLeeFuncPtr_glSampleCoverage = (GLEEPFNGLSAMPLECOVERAGEPROC) __GLeeGetProcAddress("glSampleCoverage"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexImage3D = (GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC) __GLeeGetProcAddress("glCompressedTexImage3D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexImage2D = (GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC) __GLeeGetProcAddress("glCompressedTexImage2D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexImage1D = (GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC) __GLeeGetProcAddress("glCompressedTexImage1D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexSubImage3D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glCompressedTexSubImage3D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexSubImage2D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) __GLeeGetProcAddress("glCompressedTexSubImage2D"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexSubImage1D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) __GLeeGetProcAddress("glCompressedTexSubImage1D"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCompressedTexImage = (GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC) __GLeeGetProcAddress("glGetCompressedTexImage"))!=0) nLinked++; -#endif - if (nLinked==46) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_VERSION_1_4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_1_4 - if ((GLeeFuncPtr_glBlendFuncSeparate = (GLEEPFNGLBLENDFUNCSEPARATEPROC) __GLeeGetProcAddress("glBlendFuncSeparate"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordf = (GLEEPFNGLFOGCOORDFPROC) __GLeeGetProcAddress("glFogCoordf"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordfv = (GLEEPFNGLFOGCOORDFVPROC) __GLeeGetProcAddress("glFogCoordfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordd = (GLEEPFNGLFOGCOORDDPROC) __GLeeGetProcAddress("glFogCoordd"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoorddv = (GLEEPFNGLFOGCOORDDVPROC) __GLeeGetProcAddress("glFogCoorddv"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordPointer = (GLEEPFNGLFOGCOORDPOINTERPROC) __GLeeGetProcAddress("glFogCoordPointer"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiDrawArrays = (GLEEPFNGLMULTIDRAWARRAYSPROC) __GLeeGetProcAddress("glMultiDrawArrays"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiDrawElements = (GLEEPFNGLMULTIDRAWELEMENTSPROC) __GLeeGetProcAddress("glMultiDrawElements"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameterf = (GLEEPFNGLPOINTPARAMETERFPROC) __GLeeGetProcAddress("glPointParameterf"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameterfv = (GLEEPFNGLPOINTPARAMETERFVPROC) __GLeeGetProcAddress("glPointParameterfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameteri = (GLEEPFNGLPOINTPARAMETERIPROC) __GLeeGetProcAddress("glPointParameteri"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameteriv = (GLEEPFNGLPOINTPARAMETERIVPROC) __GLeeGetProcAddress("glPointParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3b = (GLEEPFNGLSECONDARYCOLOR3BPROC) __GLeeGetProcAddress("glSecondaryColor3b"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3bv = (GLEEPFNGLSECONDARYCOLOR3BVPROC) __GLeeGetProcAddress("glSecondaryColor3bv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3d = (GLEEPFNGLSECONDARYCOLOR3DPROC) __GLeeGetProcAddress("glSecondaryColor3d"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3dv = (GLEEPFNGLSECONDARYCOLOR3DVPROC) __GLeeGetProcAddress("glSecondaryColor3dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3f = (GLEEPFNGLSECONDARYCOLOR3FPROC) __GLeeGetProcAddress("glSecondaryColor3f"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3fv = (GLEEPFNGLSECONDARYCOLOR3FVPROC) __GLeeGetProcAddress("glSecondaryColor3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3i = (GLEEPFNGLSECONDARYCOLOR3IPROC) __GLeeGetProcAddress("glSecondaryColor3i"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3iv = (GLEEPFNGLSECONDARYCOLOR3IVPROC) __GLeeGetProcAddress("glSecondaryColor3iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3s = (GLEEPFNGLSECONDARYCOLOR3SPROC) __GLeeGetProcAddress("glSecondaryColor3s"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3sv = (GLEEPFNGLSECONDARYCOLOR3SVPROC) __GLeeGetProcAddress("glSecondaryColor3sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3ub = (GLEEPFNGLSECONDARYCOLOR3UBPROC) __GLeeGetProcAddress("glSecondaryColor3ub"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3ubv = (GLEEPFNGLSECONDARYCOLOR3UBVPROC) __GLeeGetProcAddress("glSecondaryColor3ubv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3ui = (GLEEPFNGLSECONDARYCOLOR3UIPROC) __GLeeGetProcAddress("glSecondaryColor3ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3uiv = (GLEEPFNGLSECONDARYCOLOR3UIVPROC) __GLeeGetProcAddress("glSecondaryColor3uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3us = (GLEEPFNGLSECONDARYCOLOR3USPROC) __GLeeGetProcAddress("glSecondaryColor3us"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3usv = (GLEEPFNGLSECONDARYCOLOR3USVPROC) __GLeeGetProcAddress("glSecondaryColor3usv"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColorPointer = (GLEEPFNGLSECONDARYCOLORPOINTERPROC) __GLeeGetProcAddress("glSecondaryColorPointer"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2d = (GLEEPFNGLWINDOWPOS2DPROC) __GLeeGetProcAddress("glWindowPos2d"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2dv = (GLEEPFNGLWINDOWPOS2DVPROC) __GLeeGetProcAddress("glWindowPos2dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2f = (GLEEPFNGLWINDOWPOS2FPROC) __GLeeGetProcAddress("glWindowPos2f"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2fv = (GLEEPFNGLWINDOWPOS2FVPROC) __GLeeGetProcAddress("glWindowPos2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2i = (GLEEPFNGLWINDOWPOS2IPROC) __GLeeGetProcAddress("glWindowPos2i"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2iv = (GLEEPFNGLWINDOWPOS2IVPROC) __GLeeGetProcAddress("glWindowPos2iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2s = (GLEEPFNGLWINDOWPOS2SPROC) __GLeeGetProcAddress("glWindowPos2s"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2sv = (GLEEPFNGLWINDOWPOS2SVPROC) __GLeeGetProcAddress("glWindowPos2sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3d = (GLEEPFNGLWINDOWPOS3DPROC) __GLeeGetProcAddress("glWindowPos3d"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3dv = (GLEEPFNGLWINDOWPOS3DVPROC) __GLeeGetProcAddress("glWindowPos3dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3f = (GLEEPFNGLWINDOWPOS3FPROC) __GLeeGetProcAddress("glWindowPos3f"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3fv = (GLEEPFNGLWINDOWPOS3FVPROC) __GLeeGetProcAddress("glWindowPos3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3i = (GLEEPFNGLWINDOWPOS3IPROC) __GLeeGetProcAddress("glWindowPos3i"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3iv = (GLEEPFNGLWINDOWPOS3IVPROC) __GLeeGetProcAddress("glWindowPos3iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3s = (GLEEPFNGLWINDOWPOS3SPROC) __GLeeGetProcAddress("glWindowPos3s"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3sv = (GLEEPFNGLWINDOWPOS3SVPROC) __GLeeGetProcAddress("glWindowPos3sv"))!=0) nLinked++; -#endif - if (nLinked==45) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_VERSION_1_5(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_1_5 - if ((GLeeFuncPtr_glGenQueries = (GLEEPFNGLGENQUERIESPROC) __GLeeGetProcAddress("glGenQueries"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteQueries = (GLEEPFNGLDELETEQUERIESPROC) __GLeeGetProcAddress("glDeleteQueries"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsQuery = (GLEEPFNGLISQUERYPROC) __GLeeGetProcAddress("glIsQuery"))!=0) nLinked++; - if ((GLeeFuncPtr_glBeginQuery = (GLEEPFNGLBEGINQUERYPROC) __GLeeGetProcAddress("glBeginQuery"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndQuery = (GLEEPFNGLENDQUERYPROC) __GLeeGetProcAddress("glEndQuery"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryiv = (GLEEPFNGLGETQUERYIVPROC) __GLeeGetProcAddress("glGetQueryiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryObjectiv = (GLEEPFNGLGETQUERYOBJECTIVPROC) __GLeeGetProcAddress("glGetQueryObjectiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryObjectuiv = (GLEEPFNGLGETQUERYOBJECTUIVPROC) __GLeeGetProcAddress("glGetQueryObjectuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBuffer = (GLEEPFNGLBINDBUFFERPROC) __GLeeGetProcAddress("glBindBuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteBuffers = (GLEEPFNGLDELETEBUFFERSPROC) __GLeeGetProcAddress("glDeleteBuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenBuffers = (GLEEPFNGLGENBUFFERSPROC) __GLeeGetProcAddress("glGenBuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsBuffer = (GLEEPFNGLISBUFFERPROC) __GLeeGetProcAddress("glIsBuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glBufferData = (GLEEPFNGLBUFFERDATAPROC) __GLeeGetProcAddress("glBufferData"))!=0) nLinked++; - if ((GLeeFuncPtr_glBufferSubData = (GLEEPFNGLBUFFERSUBDATAPROC) __GLeeGetProcAddress("glBufferSubData"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBufferSubData = (GLEEPFNGLGETBUFFERSUBDATAPROC) __GLeeGetProcAddress("glGetBufferSubData"))!=0) nLinked++; - if ((GLeeFuncPtr_glMapBuffer = (GLEEPFNGLMAPBUFFERPROC) __GLeeGetProcAddress("glMapBuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glUnmapBuffer = (GLEEPFNGLUNMAPBUFFERPROC) __GLeeGetProcAddress("glUnmapBuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBufferParameteriv = (GLEEPFNGLGETBUFFERPARAMETERIVPROC) __GLeeGetProcAddress("glGetBufferParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBufferPointerv = (GLEEPFNGLGETBUFFERPOINTERVPROC) __GLeeGetProcAddress("glGetBufferPointerv"))!=0) nLinked++; -#endif - if (nLinked==19) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_VERSION_2_0(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_2_0 - if ((GLeeFuncPtr_glBlendEquationSeparate = (GLEEPFNGLBLENDEQUATIONSEPARATEPROC) __GLeeGetProcAddress("glBlendEquationSeparate"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawBuffers = (GLEEPFNGLDRAWBUFFERSPROC) __GLeeGetProcAddress("glDrawBuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glStencilOpSeparate = (GLEEPFNGLSTENCILOPSEPARATEPROC) __GLeeGetProcAddress("glStencilOpSeparate"))!=0) nLinked++; - if ((GLeeFuncPtr_glStencilFuncSeparate = (GLEEPFNGLSTENCILFUNCSEPARATEPROC) __GLeeGetProcAddress("glStencilFuncSeparate"))!=0) nLinked++; - if ((GLeeFuncPtr_glStencilMaskSeparate = (GLEEPFNGLSTENCILMASKSEPARATEPROC) __GLeeGetProcAddress("glStencilMaskSeparate"))!=0) nLinked++; - if ((GLeeFuncPtr_glAttachShader = (GLEEPFNGLATTACHSHADERPROC) __GLeeGetProcAddress("glAttachShader"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindAttribLocation = (GLEEPFNGLBINDATTRIBLOCATIONPROC) __GLeeGetProcAddress("glBindAttribLocation"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompileShader = (GLEEPFNGLCOMPILESHADERPROC) __GLeeGetProcAddress("glCompileShader"))!=0) nLinked++; - if ((GLeeFuncPtr_glCreateProgram = (GLEEPFNGLCREATEPROGRAMPROC) __GLeeGetProcAddress("glCreateProgram"))!=0) nLinked++; - if ((GLeeFuncPtr_glCreateShader = (GLEEPFNGLCREATESHADERPROC) __GLeeGetProcAddress("glCreateShader"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteProgram = (GLEEPFNGLDELETEPROGRAMPROC) __GLeeGetProcAddress("glDeleteProgram"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteShader = (GLEEPFNGLDELETESHADERPROC) __GLeeGetProcAddress("glDeleteShader"))!=0) nLinked++; - if ((GLeeFuncPtr_glDetachShader = (GLEEPFNGLDETACHSHADERPROC) __GLeeGetProcAddress("glDetachShader"))!=0) nLinked++; - if ((GLeeFuncPtr_glDisableVertexAttribArray = (GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC) __GLeeGetProcAddress("glDisableVertexAttribArray"))!=0) nLinked++; - if ((GLeeFuncPtr_glEnableVertexAttribArray = (GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC) __GLeeGetProcAddress("glEnableVertexAttribArray"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetActiveAttrib = (GLEEPFNGLGETACTIVEATTRIBPROC) __GLeeGetProcAddress("glGetActiveAttrib"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetActiveUniform = (GLEEPFNGLGETACTIVEUNIFORMPROC) __GLeeGetProcAddress("glGetActiveUniform"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetAttachedShaders = (GLEEPFNGLGETATTACHEDSHADERSPROC) __GLeeGetProcAddress("glGetAttachedShaders"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetAttribLocation = (GLEEPFNGLGETATTRIBLOCATIONPROC) __GLeeGetProcAddress("glGetAttribLocation"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramiv = (GLEEPFNGLGETPROGRAMIVPROC) __GLeeGetProcAddress("glGetProgramiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramInfoLog = (GLEEPFNGLGETPROGRAMINFOLOGPROC) __GLeeGetProcAddress("glGetProgramInfoLog"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetShaderiv = (GLEEPFNGLGETSHADERIVPROC) __GLeeGetProcAddress("glGetShaderiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetShaderInfoLog = (GLEEPFNGLGETSHADERINFOLOGPROC) __GLeeGetProcAddress("glGetShaderInfoLog"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetShaderSource = (GLEEPFNGLGETSHADERSOURCEPROC) __GLeeGetProcAddress("glGetShaderSource"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformLocation = (GLEEPFNGLGETUNIFORMLOCATIONPROC) __GLeeGetProcAddress("glGetUniformLocation"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformfv = (GLEEPFNGLGETUNIFORMFVPROC) __GLeeGetProcAddress("glGetUniformfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformiv = (GLEEPFNGLGETUNIFORMIVPROC) __GLeeGetProcAddress("glGetUniformiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribdv = (GLEEPFNGLGETVERTEXATTRIBDVPROC) __GLeeGetProcAddress("glGetVertexAttribdv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribfv = (GLEEPFNGLGETVERTEXATTRIBFVPROC) __GLeeGetProcAddress("glGetVertexAttribfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribiv = (GLEEPFNGLGETVERTEXATTRIBIVPROC) __GLeeGetProcAddress("glGetVertexAttribiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribPointerv = (GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC) __GLeeGetProcAddress("glGetVertexAttribPointerv"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsProgram = (GLEEPFNGLISPROGRAMPROC) __GLeeGetProcAddress("glIsProgram"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsShader = (GLEEPFNGLISSHADERPROC) __GLeeGetProcAddress("glIsShader"))!=0) nLinked++; - if ((GLeeFuncPtr_glLinkProgram = (GLEEPFNGLLINKPROGRAMPROC) __GLeeGetProcAddress("glLinkProgram"))!=0) nLinked++; - if ((GLeeFuncPtr_glShaderSource = (GLEEPFNGLSHADERSOURCEPROC) __GLeeGetProcAddress("glShaderSource"))!=0) nLinked++; - if ((GLeeFuncPtr_glUseProgram = (GLEEPFNGLUSEPROGRAMPROC) __GLeeGetProcAddress("glUseProgram"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1f = (GLEEPFNGLUNIFORM1FPROC) __GLeeGetProcAddress("glUniform1f"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2f = (GLEEPFNGLUNIFORM2FPROC) __GLeeGetProcAddress("glUniform2f"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3f = (GLEEPFNGLUNIFORM3FPROC) __GLeeGetProcAddress("glUniform3f"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4f = (GLEEPFNGLUNIFORM4FPROC) __GLeeGetProcAddress("glUniform4f"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1i = (GLEEPFNGLUNIFORM1IPROC) __GLeeGetProcAddress("glUniform1i"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2i = (GLEEPFNGLUNIFORM2IPROC) __GLeeGetProcAddress("glUniform2i"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3i = (GLEEPFNGLUNIFORM3IPROC) __GLeeGetProcAddress("glUniform3i"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4i = (GLEEPFNGLUNIFORM4IPROC) __GLeeGetProcAddress("glUniform4i"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1fv = (GLEEPFNGLUNIFORM1FVPROC) __GLeeGetProcAddress("glUniform1fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2fv = (GLEEPFNGLUNIFORM2FVPROC) __GLeeGetProcAddress("glUniform2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3fv = (GLEEPFNGLUNIFORM3FVPROC) __GLeeGetProcAddress("glUniform3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4fv = (GLEEPFNGLUNIFORM4FVPROC) __GLeeGetProcAddress("glUniform4fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1iv = (GLEEPFNGLUNIFORM1IVPROC) __GLeeGetProcAddress("glUniform1iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2iv = (GLEEPFNGLUNIFORM2IVPROC) __GLeeGetProcAddress("glUniform2iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3iv = (GLEEPFNGLUNIFORM3IVPROC) __GLeeGetProcAddress("glUniform3iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4iv = (GLEEPFNGLUNIFORM4IVPROC) __GLeeGetProcAddress("glUniform4iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix2fv = (GLEEPFNGLUNIFORMMATRIX2FVPROC) __GLeeGetProcAddress("glUniformMatrix2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix3fv = (GLEEPFNGLUNIFORMMATRIX3FVPROC) __GLeeGetProcAddress("glUniformMatrix3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix4fv = (GLEEPFNGLUNIFORMMATRIX4FVPROC) __GLeeGetProcAddress("glUniformMatrix4fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glValidateProgram = (GLEEPFNGLVALIDATEPROGRAMPROC) __GLeeGetProcAddress("glValidateProgram"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1d = (GLEEPFNGLVERTEXATTRIB1DPROC) __GLeeGetProcAddress("glVertexAttrib1d"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1dv = (GLEEPFNGLVERTEXATTRIB1DVPROC) __GLeeGetProcAddress("glVertexAttrib1dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1f = (GLEEPFNGLVERTEXATTRIB1FPROC) __GLeeGetProcAddress("glVertexAttrib1f"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1fv = (GLEEPFNGLVERTEXATTRIB1FVPROC) __GLeeGetProcAddress("glVertexAttrib1fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1s = (GLEEPFNGLVERTEXATTRIB1SPROC) __GLeeGetProcAddress("glVertexAttrib1s"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1sv = (GLEEPFNGLVERTEXATTRIB1SVPROC) __GLeeGetProcAddress("glVertexAttrib1sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2d = (GLEEPFNGLVERTEXATTRIB2DPROC) __GLeeGetProcAddress("glVertexAttrib2d"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2dv = (GLEEPFNGLVERTEXATTRIB2DVPROC) __GLeeGetProcAddress("glVertexAttrib2dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2f = (GLEEPFNGLVERTEXATTRIB2FPROC) __GLeeGetProcAddress("glVertexAttrib2f"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2fv = (GLEEPFNGLVERTEXATTRIB2FVPROC) __GLeeGetProcAddress("glVertexAttrib2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2s = (GLEEPFNGLVERTEXATTRIB2SPROC) __GLeeGetProcAddress("glVertexAttrib2s"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2sv = (GLEEPFNGLVERTEXATTRIB2SVPROC) __GLeeGetProcAddress("glVertexAttrib2sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3d = (GLEEPFNGLVERTEXATTRIB3DPROC) __GLeeGetProcAddress("glVertexAttrib3d"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3dv = (GLEEPFNGLVERTEXATTRIB3DVPROC) __GLeeGetProcAddress("glVertexAttrib3dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3f = (GLEEPFNGLVERTEXATTRIB3FPROC) __GLeeGetProcAddress("glVertexAttrib3f"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3fv = (GLEEPFNGLVERTEXATTRIB3FVPROC) __GLeeGetProcAddress("glVertexAttrib3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3s = (GLEEPFNGLVERTEXATTRIB3SPROC) __GLeeGetProcAddress("glVertexAttrib3s"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3sv = (GLEEPFNGLVERTEXATTRIB3SVPROC) __GLeeGetProcAddress("glVertexAttrib3sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Nbv = (GLEEPFNGLVERTEXATTRIB4NBVPROC) __GLeeGetProcAddress("glVertexAttrib4Nbv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Niv = (GLEEPFNGLVERTEXATTRIB4NIVPROC) __GLeeGetProcAddress("glVertexAttrib4Niv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Nsv = (GLEEPFNGLVERTEXATTRIB4NSVPROC) __GLeeGetProcAddress("glVertexAttrib4Nsv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Nub = (GLEEPFNGLVERTEXATTRIB4NUBPROC) __GLeeGetProcAddress("glVertexAttrib4Nub"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Nubv = (GLEEPFNGLVERTEXATTRIB4NUBVPROC) __GLeeGetProcAddress("glVertexAttrib4Nubv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Nuiv = (GLEEPFNGLVERTEXATTRIB4NUIVPROC) __GLeeGetProcAddress("glVertexAttrib4Nuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4Nusv = (GLEEPFNGLVERTEXATTRIB4NUSVPROC) __GLeeGetProcAddress("glVertexAttrib4Nusv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4bv = (GLEEPFNGLVERTEXATTRIB4BVPROC) __GLeeGetProcAddress("glVertexAttrib4bv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4d = (GLEEPFNGLVERTEXATTRIB4DPROC) __GLeeGetProcAddress("glVertexAttrib4d"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4dv = (GLEEPFNGLVERTEXATTRIB4DVPROC) __GLeeGetProcAddress("glVertexAttrib4dv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4f = (GLEEPFNGLVERTEXATTRIB4FPROC) __GLeeGetProcAddress("glVertexAttrib4f"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4fv = (GLEEPFNGLVERTEXATTRIB4FVPROC) __GLeeGetProcAddress("glVertexAttrib4fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4iv = (GLEEPFNGLVERTEXATTRIB4IVPROC) __GLeeGetProcAddress("glVertexAttrib4iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4s = (GLEEPFNGLVERTEXATTRIB4SPROC) __GLeeGetProcAddress("glVertexAttrib4s"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4sv = (GLEEPFNGLVERTEXATTRIB4SVPROC) __GLeeGetProcAddress("glVertexAttrib4sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4ubv = (GLEEPFNGLVERTEXATTRIB4UBVPROC) __GLeeGetProcAddress("glVertexAttrib4ubv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4uiv = (GLEEPFNGLVERTEXATTRIB4UIVPROC) __GLeeGetProcAddress("glVertexAttrib4uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4usv = (GLEEPFNGLVERTEXATTRIB4USVPROC) __GLeeGetProcAddress("glVertexAttrib4usv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribPointer = (GLEEPFNGLVERTEXATTRIBPOINTERPROC) __GLeeGetProcAddress("glVertexAttribPointer"))!=0) nLinked++; -#endif - if (nLinked==93) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_VERSION_2_1(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_2_1 - if ((GLeeFuncPtr_glUniformMatrix2x3fv = (GLEEPFNGLUNIFORMMATRIX2X3FVPROC) __GLeeGetProcAddress("glUniformMatrix2x3fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix3x2fv = (GLEEPFNGLUNIFORMMATRIX3X2FVPROC) __GLeeGetProcAddress("glUniformMatrix3x2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix2x4fv = (GLEEPFNGLUNIFORMMATRIX2X4FVPROC) __GLeeGetProcAddress("glUniformMatrix2x4fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix4x2fv = (GLEEPFNGLUNIFORMMATRIX4X2FVPROC) __GLeeGetProcAddress("glUniformMatrix4x2fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix3x4fv = (GLEEPFNGLUNIFORMMATRIX3X4FVPROC) __GLeeGetProcAddress("glUniformMatrix3x4fv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix4x3fv = (GLEEPFNGLUNIFORMMATRIX4X3FVPROC) __GLeeGetProcAddress("glUniformMatrix4x3fv"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_VERSION_3_0(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_VERSION_3_0 - if ((GLeeFuncPtr_glColorMaski = (GLEEPFNGLCOLORMASKIPROC) __GLeeGetProcAddress("glColorMaski"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBooleani_v = (GLEEPFNGLGETBOOLEANI_VPROC) __GLeeGetProcAddress("glGetBooleani_v"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetIntegeri_v = (GLEEPFNGLGETINTEGERI_VPROC) __GLeeGetProcAddress("glGetIntegeri_v"))!=0) nLinked++; - if ((GLeeFuncPtr_glEnablei = (GLEEPFNGLENABLEIPROC) __GLeeGetProcAddress("glEnablei"))!=0) nLinked++; - if ((GLeeFuncPtr_glDisablei = (GLEEPFNGLDISABLEIPROC) __GLeeGetProcAddress("glDisablei"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsEnabledi = (GLEEPFNGLISENABLEDIPROC) __GLeeGetProcAddress("glIsEnabledi"))!=0) nLinked++; - if ((GLeeFuncPtr_glBeginTransformFeedback = (GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC) __GLeeGetProcAddress("glBeginTransformFeedback"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndTransformFeedback = (GLEEPFNGLENDTRANSFORMFEEDBACKPROC) __GLeeGetProcAddress("glEndTransformFeedback"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferRange = (GLEEPFNGLBINDBUFFERRANGEPROC) __GLeeGetProcAddress("glBindBufferRange"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferBase = (GLEEPFNGLBINDBUFFERBASEPROC) __GLeeGetProcAddress("glBindBufferBase"))!=0) nLinked++; - if ((GLeeFuncPtr_glTransformFeedbackVaryings = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC) __GLeeGetProcAddress("glTransformFeedbackVaryings"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTransformFeedbackVarying = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC) __GLeeGetProcAddress("glGetTransformFeedbackVarying"))!=0) nLinked++; - if ((GLeeFuncPtr_glClampColor = (GLEEPFNGLCLAMPCOLORPROC) __GLeeGetProcAddress("glClampColor"))!=0) nLinked++; - if ((GLeeFuncPtr_glBeginConditionalRender = (GLEEPFNGLBEGINCONDITIONALRENDERPROC) __GLeeGetProcAddress("glBeginConditionalRender"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndConditionalRender = (GLEEPFNGLENDCONDITIONALRENDERPROC) __GLeeGetProcAddress("glEndConditionalRender"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1i = (GLEEPFNGLVERTEXATTRIBI1IPROC) __GLeeGetProcAddress("glVertexAttribI1i"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2i = (GLEEPFNGLVERTEXATTRIBI2IPROC) __GLeeGetProcAddress("glVertexAttribI2i"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3i = (GLEEPFNGLVERTEXATTRIBI3IPROC) __GLeeGetProcAddress("glVertexAttribI3i"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4i = (GLEEPFNGLVERTEXATTRIBI4IPROC) __GLeeGetProcAddress("glVertexAttribI4i"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1ui = (GLEEPFNGLVERTEXATTRIBI1UIPROC) __GLeeGetProcAddress("glVertexAttribI1ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2ui = (GLEEPFNGLVERTEXATTRIBI2UIPROC) __GLeeGetProcAddress("glVertexAttribI2ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3ui = (GLEEPFNGLVERTEXATTRIBI3UIPROC) __GLeeGetProcAddress("glVertexAttribI3ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4ui = (GLEEPFNGLVERTEXATTRIBI4UIPROC) __GLeeGetProcAddress("glVertexAttribI4ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1iv = (GLEEPFNGLVERTEXATTRIBI1IVPROC) __GLeeGetProcAddress("glVertexAttribI1iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2iv = (GLEEPFNGLVERTEXATTRIBI2IVPROC) __GLeeGetProcAddress("glVertexAttribI2iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3iv = (GLEEPFNGLVERTEXATTRIBI3IVPROC) __GLeeGetProcAddress("glVertexAttribI3iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4iv = (GLEEPFNGLVERTEXATTRIBI4IVPROC) __GLeeGetProcAddress("glVertexAttribI4iv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1uiv = (GLEEPFNGLVERTEXATTRIBI1UIVPROC) __GLeeGetProcAddress("glVertexAttribI1uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2uiv = (GLEEPFNGLVERTEXATTRIBI2UIVPROC) __GLeeGetProcAddress("glVertexAttribI2uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3uiv = (GLEEPFNGLVERTEXATTRIBI3UIVPROC) __GLeeGetProcAddress("glVertexAttribI3uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4uiv = (GLEEPFNGLVERTEXATTRIBI4UIVPROC) __GLeeGetProcAddress("glVertexAttribI4uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4bv = (GLEEPFNGLVERTEXATTRIBI4BVPROC) __GLeeGetProcAddress("glVertexAttribI4bv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4sv = (GLEEPFNGLVERTEXATTRIBI4SVPROC) __GLeeGetProcAddress("glVertexAttribI4sv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4ubv = (GLEEPFNGLVERTEXATTRIBI4UBVPROC) __GLeeGetProcAddress("glVertexAttribI4ubv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4usv = (GLEEPFNGLVERTEXATTRIBI4USVPROC) __GLeeGetProcAddress("glVertexAttribI4usv"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribIPointer = (GLEEPFNGLVERTEXATTRIBIPOINTERPROC) __GLeeGetProcAddress("glVertexAttribIPointer"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribIiv = (GLEEPFNGLGETVERTEXATTRIBIIVPROC) __GLeeGetProcAddress("glGetVertexAttribIiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribIuiv = (GLEEPFNGLGETVERTEXATTRIBIUIVPROC) __GLeeGetProcAddress("glGetVertexAttribIuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformuiv = (GLEEPFNGLGETUNIFORMUIVPROC) __GLeeGetProcAddress("glGetUniformuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindFragDataLocation = (GLEEPFNGLBINDFRAGDATALOCATIONPROC) __GLeeGetProcAddress("glBindFragDataLocation"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragDataLocation = (GLEEPFNGLGETFRAGDATALOCATIONPROC) __GLeeGetProcAddress("glGetFragDataLocation"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1ui = (GLEEPFNGLUNIFORM1UIPROC) __GLeeGetProcAddress("glUniform1ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2ui = (GLEEPFNGLUNIFORM2UIPROC) __GLeeGetProcAddress("glUniform2ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3ui = (GLEEPFNGLUNIFORM3UIPROC) __GLeeGetProcAddress("glUniform3ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4ui = (GLEEPFNGLUNIFORM4UIPROC) __GLeeGetProcAddress("glUniform4ui"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1uiv = (GLEEPFNGLUNIFORM1UIVPROC) __GLeeGetProcAddress("glUniform1uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2uiv = (GLEEPFNGLUNIFORM2UIVPROC) __GLeeGetProcAddress("glUniform2uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3uiv = (GLEEPFNGLUNIFORM3UIVPROC) __GLeeGetProcAddress("glUniform3uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4uiv = (GLEEPFNGLUNIFORM4UIVPROC) __GLeeGetProcAddress("glUniform4uiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexParameterIiv = (GLEEPFNGLTEXPARAMETERIIVPROC) __GLeeGetProcAddress("glTexParameterIiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexParameterIuiv = (GLEEPFNGLTEXPARAMETERIUIVPROC) __GLeeGetProcAddress("glTexParameterIuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTexParameterIiv = (GLEEPFNGLGETTEXPARAMETERIIVPROC) __GLeeGetProcAddress("glGetTexParameterIiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTexParameterIuiv = (GLEEPFNGLGETTEXPARAMETERIUIVPROC) __GLeeGetProcAddress("glGetTexParameterIuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearBufferiv = (GLEEPFNGLCLEARBUFFERIVPROC) __GLeeGetProcAddress("glClearBufferiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearBufferuiv = (GLEEPFNGLCLEARBUFFERUIVPROC) __GLeeGetProcAddress("glClearBufferuiv"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearBufferfv = (GLEEPFNGLCLEARBUFFERFVPROC) __GLeeGetProcAddress("glClearBufferfv"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearBufferfi = (GLEEPFNGLCLEARBUFFERFIPROC) __GLeeGetProcAddress("glClearBufferfi"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetStringi = (GLEEPFNGLGETSTRINGIPROC) __GLeeGetProcAddress("glGetStringi"))!=0) nLinked++; -#endif - if (nLinked==58) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_multitexture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_multitexture - if ((GLeeFuncPtr_glActiveTextureARB = (GLEEPFNGLACTIVETEXTUREARBPROC) __GLeeGetProcAddress("glActiveTextureARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glClientActiveTextureARB = (GLEEPFNGLCLIENTACTIVETEXTUREARBPROC) __GLeeGetProcAddress("glClientActiveTextureARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1dARB = (GLEEPFNGLMULTITEXCOORD1DARBPROC) __GLeeGetProcAddress("glMultiTexCoord1dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1dvARB = (GLEEPFNGLMULTITEXCOORD1DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1fARB = (GLEEPFNGLMULTITEXCOORD1FARBPROC) __GLeeGetProcAddress("glMultiTexCoord1fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1fvARB = (GLEEPFNGLMULTITEXCOORD1FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1iARB = (GLEEPFNGLMULTITEXCOORD1IARBPROC) __GLeeGetProcAddress("glMultiTexCoord1iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1ivARB = (GLEEPFNGLMULTITEXCOORD1IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1sARB = (GLEEPFNGLMULTITEXCOORD1SARBPROC) __GLeeGetProcAddress("glMultiTexCoord1sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1svARB = (GLEEPFNGLMULTITEXCOORD1SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2dARB = (GLEEPFNGLMULTITEXCOORD2DARBPROC) __GLeeGetProcAddress("glMultiTexCoord2dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2dvARB = (GLEEPFNGLMULTITEXCOORD2DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2fARB = (GLEEPFNGLMULTITEXCOORD2FARBPROC) __GLeeGetProcAddress("glMultiTexCoord2fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2fvARB = (GLEEPFNGLMULTITEXCOORD2FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2iARB = (GLEEPFNGLMULTITEXCOORD2IARBPROC) __GLeeGetProcAddress("glMultiTexCoord2iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2ivARB = (GLEEPFNGLMULTITEXCOORD2IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2sARB = (GLEEPFNGLMULTITEXCOORD2SARBPROC) __GLeeGetProcAddress("glMultiTexCoord2sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2svARB = (GLEEPFNGLMULTITEXCOORD2SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3dARB = (GLEEPFNGLMULTITEXCOORD3DARBPROC) __GLeeGetProcAddress("glMultiTexCoord3dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3dvARB = (GLEEPFNGLMULTITEXCOORD3DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3fARB = (GLEEPFNGLMULTITEXCOORD3FARBPROC) __GLeeGetProcAddress("glMultiTexCoord3fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3fvARB = (GLEEPFNGLMULTITEXCOORD3FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3iARB = (GLEEPFNGLMULTITEXCOORD3IARBPROC) __GLeeGetProcAddress("glMultiTexCoord3iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3ivARB = (GLEEPFNGLMULTITEXCOORD3IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3sARB = (GLEEPFNGLMULTITEXCOORD3SARBPROC) __GLeeGetProcAddress("glMultiTexCoord3sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3svARB = (GLEEPFNGLMULTITEXCOORD3SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4dARB = (GLEEPFNGLMULTITEXCOORD4DARBPROC) __GLeeGetProcAddress("glMultiTexCoord4dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4dvARB = (GLEEPFNGLMULTITEXCOORD4DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4fARB = (GLEEPFNGLMULTITEXCOORD4FARBPROC) __GLeeGetProcAddress("glMultiTexCoord4fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4fvARB = (GLEEPFNGLMULTITEXCOORD4FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4iARB = (GLEEPFNGLMULTITEXCOORD4IARBPROC) __GLeeGetProcAddress("glMultiTexCoord4iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4ivARB = (GLEEPFNGLMULTITEXCOORD4IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4sARB = (GLEEPFNGLMULTITEXCOORD4SARBPROC) __GLeeGetProcAddress("glMultiTexCoord4sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4svARB = (GLEEPFNGLMULTITEXCOORD4SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4svARB"))!=0) nLinked++; -#endif - if (nLinked==34) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_transpose_matrix(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_transpose_matrix - if ((GLeeFuncPtr_glLoadTransposeMatrixfARB = (GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC) __GLeeGetProcAddress("glLoadTransposeMatrixfARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glLoadTransposeMatrixdARB = (GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC) __GLeeGetProcAddress("glLoadTransposeMatrixdARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultTransposeMatrixfARB = (GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC) __GLeeGetProcAddress("glMultTransposeMatrixfARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultTransposeMatrixdARB = (GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC) __GLeeGetProcAddress("glMultTransposeMatrixdARB"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_multisample(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_multisample - if ((GLeeFuncPtr_glSampleCoverageARB = (GLEEPFNGLSAMPLECOVERAGEARBPROC) __GLeeGetProcAddress("glSampleCoverageARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_texture_env_add(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_cube_map(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_compression(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_texture_compression - if ((GLeeFuncPtr_glCompressedTexImage3DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC) __GLeeGetProcAddress("glCompressedTexImage3DARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexImage2DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC) __GLeeGetProcAddress("glCompressedTexImage2DARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexImage1DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC) __GLeeGetProcAddress("glCompressedTexImage1DARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexSubImage3DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage3DARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexSubImage2DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage2DARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTexSubImage1DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage1DARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCompressedTexImageARB = (GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC) __GLeeGetProcAddress("glGetCompressedTexImageARB"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_texture_border_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_point_parameters(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_point_parameters - if ((GLeeFuncPtr_glPointParameterfARB = (GLEEPFNGLPOINTPARAMETERFARBPROC) __GLeeGetProcAddress("glPointParameterfARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameterfvARB = (GLEEPFNGLPOINTPARAMETERFVARBPROC) __GLeeGetProcAddress("glPointParameterfvARB"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_vertex_blend(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_vertex_blend - if ((GLeeFuncPtr_glWeightbvARB = (GLEEPFNGLWEIGHTBVARBPROC) __GLeeGetProcAddress("glWeightbvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightsvARB = (GLEEPFNGLWEIGHTSVARBPROC) __GLeeGetProcAddress("glWeightsvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightivARB = (GLEEPFNGLWEIGHTIVARBPROC) __GLeeGetProcAddress("glWeightivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightfvARB = (GLEEPFNGLWEIGHTFVARBPROC) __GLeeGetProcAddress("glWeightfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightdvARB = (GLEEPFNGLWEIGHTDVARBPROC) __GLeeGetProcAddress("glWeightdvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightubvARB = (GLEEPFNGLWEIGHTUBVARBPROC) __GLeeGetProcAddress("glWeightubvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightusvARB = (GLEEPFNGLWEIGHTUSVARBPROC) __GLeeGetProcAddress("glWeightusvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightuivARB = (GLEEPFNGLWEIGHTUIVARBPROC) __GLeeGetProcAddress("glWeightuivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWeightPointerARB = (GLEEPFNGLWEIGHTPOINTERARBPROC) __GLeeGetProcAddress("glWeightPointerARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexBlendARB = (GLEEPFNGLVERTEXBLENDARBPROC) __GLeeGetProcAddress("glVertexBlendARB"))!=0) nLinked++; -#endif - if (nLinked==10) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_matrix_palette(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_matrix_palette - if ((GLeeFuncPtr_glCurrentPaletteMatrixARB = (GLEEPFNGLCURRENTPALETTEMATRIXARBPROC) __GLeeGetProcAddress("glCurrentPaletteMatrixARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixIndexubvARB = (GLEEPFNGLMATRIXINDEXUBVARBPROC) __GLeeGetProcAddress("glMatrixIndexubvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixIndexusvARB = (GLEEPFNGLMATRIXINDEXUSVARBPROC) __GLeeGetProcAddress("glMatrixIndexusvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixIndexuivARB = (GLEEPFNGLMATRIXINDEXUIVARBPROC) __GLeeGetProcAddress("glMatrixIndexuivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixIndexPointerARB = (GLEEPFNGLMATRIXINDEXPOINTERARBPROC) __GLeeGetProcAddress("glMatrixIndexPointerARB"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_texture_env_combine(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_env_crossbar(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_env_dot3(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_mirrored_repeat(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_depth_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_shadow(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_shadow_ambient(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_window_pos(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_window_pos - if ((GLeeFuncPtr_glWindowPos2dARB = (GLEEPFNGLWINDOWPOS2DARBPROC) __GLeeGetProcAddress("glWindowPos2dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2dvARB = (GLEEPFNGLWINDOWPOS2DVARBPROC) __GLeeGetProcAddress("glWindowPos2dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2fARB = (GLEEPFNGLWINDOWPOS2FARBPROC) __GLeeGetProcAddress("glWindowPos2fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2fvARB = (GLEEPFNGLWINDOWPOS2FVARBPROC) __GLeeGetProcAddress("glWindowPos2fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2iARB = (GLEEPFNGLWINDOWPOS2IARBPROC) __GLeeGetProcAddress("glWindowPos2iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2ivARB = (GLEEPFNGLWINDOWPOS2IVARBPROC) __GLeeGetProcAddress("glWindowPos2ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2sARB = (GLEEPFNGLWINDOWPOS2SARBPROC) __GLeeGetProcAddress("glWindowPos2sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2svARB = (GLEEPFNGLWINDOWPOS2SVARBPROC) __GLeeGetProcAddress("glWindowPos2svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3dARB = (GLEEPFNGLWINDOWPOS3DARBPROC) __GLeeGetProcAddress("glWindowPos3dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3dvARB = (GLEEPFNGLWINDOWPOS3DVARBPROC) __GLeeGetProcAddress("glWindowPos3dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3fARB = (GLEEPFNGLWINDOWPOS3FARBPROC) __GLeeGetProcAddress("glWindowPos3fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3fvARB = (GLEEPFNGLWINDOWPOS3FVARBPROC) __GLeeGetProcAddress("glWindowPos3fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3iARB = (GLEEPFNGLWINDOWPOS3IARBPROC) __GLeeGetProcAddress("glWindowPos3iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3ivARB = (GLEEPFNGLWINDOWPOS3IVARBPROC) __GLeeGetProcAddress("glWindowPos3ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3sARB = (GLEEPFNGLWINDOWPOS3SARBPROC) __GLeeGetProcAddress("glWindowPos3sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3svARB = (GLEEPFNGLWINDOWPOS3SVARBPROC) __GLeeGetProcAddress("glWindowPos3svARB"))!=0) nLinked++; -#endif - if (nLinked==16) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_vertex_program(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_vertex_program - if ((GLeeFuncPtr_glVertexAttrib1dARB = (GLEEPFNGLVERTEXATTRIB1DARBPROC) __GLeeGetProcAddress("glVertexAttrib1dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1dvARB = (GLEEPFNGLVERTEXATTRIB1DVARBPROC) __GLeeGetProcAddress("glVertexAttrib1dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1fARB = (GLEEPFNGLVERTEXATTRIB1FARBPROC) __GLeeGetProcAddress("glVertexAttrib1fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1fvARB = (GLEEPFNGLVERTEXATTRIB1FVARBPROC) __GLeeGetProcAddress("glVertexAttrib1fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1sARB = (GLEEPFNGLVERTEXATTRIB1SARBPROC) __GLeeGetProcAddress("glVertexAttrib1sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1svARB = (GLEEPFNGLVERTEXATTRIB1SVARBPROC) __GLeeGetProcAddress("glVertexAttrib1svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2dARB = (GLEEPFNGLVERTEXATTRIB2DARBPROC) __GLeeGetProcAddress("glVertexAttrib2dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2dvARB = (GLEEPFNGLVERTEXATTRIB2DVARBPROC) __GLeeGetProcAddress("glVertexAttrib2dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2fARB = (GLEEPFNGLVERTEXATTRIB2FARBPROC) __GLeeGetProcAddress("glVertexAttrib2fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2fvARB = (GLEEPFNGLVERTEXATTRIB2FVARBPROC) __GLeeGetProcAddress("glVertexAttrib2fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2sARB = (GLEEPFNGLVERTEXATTRIB2SARBPROC) __GLeeGetProcAddress("glVertexAttrib2sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2svARB = (GLEEPFNGLVERTEXATTRIB2SVARBPROC) __GLeeGetProcAddress("glVertexAttrib2svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3dARB = (GLEEPFNGLVERTEXATTRIB3DARBPROC) __GLeeGetProcAddress("glVertexAttrib3dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3dvARB = (GLEEPFNGLVERTEXATTRIB3DVARBPROC) __GLeeGetProcAddress("glVertexAttrib3dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3fARB = (GLEEPFNGLVERTEXATTRIB3FARBPROC) __GLeeGetProcAddress("glVertexAttrib3fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3fvARB = (GLEEPFNGLVERTEXATTRIB3FVARBPROC) __GLeeGetProcAddress("glVertexAttrib3fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3sARB = (GLEEPFNGLVERTEXATTRIB3SARBPROC) __GLeeGetProcAddress("glVertexAttrib3sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3svARB = (GLEEPFNGLVERTEXATTRIB3SVARBPROC) __GLeeGetProcAddress("glVertexAttrib3svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NbvARB = (GLEEPFNGLVERTEXATTRIB4NBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NbvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NivARB = (GLEEPFNGLVERTEXATTRIB4NIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NsvARB = (GLEEPFNGLVERTEXATTRIB4NSVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NsvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NubARB = (GLEEPFNGLVERTEXATTRIB4NUBARBPROC) __GLeeGetProcAddress("glVertexAttrib4NubARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NubvARB = (GLEEPFNGLVERTEXATTRIB4NUBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NubvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NuivARB = (GLEEPFNGLVERTEXATTRIB4NUIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NuivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4NusvARB = (GLEEPFNGLVERTEXATTRIB4NUSVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NusvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4bvARB = (GLEEPFNGLVERTEXATTRIB4BVARBPROC) __GLeeGetProcAddress("glVertexAttrib4bvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4dARB = (GLEEPFNGLVERTEXATTRIB4DARBPROC) __GLeeGetProcAddress("glVertexAttrib4dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4dvARB = (GLEEPFNGLVERTEXATTRIB4DVARBPROC) __GLeeGetProcAddress("glVertexAttrib4dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4fARB = (GLEEPFNGLVERTEXATTRIB4FARBPROC) __GLeeGetProcAddress("glVertexAttrib4fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4fvARB = (GLEEPFNGLVERTEXATTRIB4FVARBPROC) __GLeeGetProcAddress("glVertexAttrib4fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4ivARB = (GLEEPFNGLVERTEXATTRIB4IVARBPROC) __GLeeGetProcAddress("glVertexAttrib4ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4sARB = (GLEEPFNGLVERTEXATTRIB4SARBPROC) __GLeeGetProcAddress("glVertexAttrib4sARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4svARB = (GLEEPFNGLVERTEXATTRIB4SVARBPROC) __GLeeGetProcAddress("glVertexAttrib4svARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4ubvARB = (GLEEPFNGLVERTEXATTRIB4UBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4ubvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4uivARB = (GLEEPFNGLVERTEXATTRIB4UIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4uivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4usvARB = (GLEEPFNGLVERTEXATTRIB4USVARBPROC) __GLeeGetProcAddress("glVertexAttrib4usvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribPointerARB = (GLEEPFNGLVERTEXATTRIBPOINTERARBPROC) __GLeeGetProcAddress("glVertexAttribPointerARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glEnableVertexAttribArrayARB = (GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC) __GLeeGetProcAddress("glEnableVertexAttribArrayARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glDisableVertexAttribArrayARB = (GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC) __GLeeGetProcAddress("glDisableVertexAttribArrayARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramStringARB = (GLEEPFNGLPROGRAMSTRINGARBPROC) __GLeeGetProcAddress("glProgramStringARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindProgramARB = (GLEEPFNGLBINDPROGRAMARBPROC) __GLeeGetProcAddress("glBindProgramARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteProgramsARB = (GLEEPFNGLDELETEPROGRAMSARBPROC) __GLeeGetProcAddress("glDeleteProgramsARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenProgramsARB = (GLEEPFNGLGENPROGRAMSARBPROC) __GLeeGetProcAddress("glGenProgramsARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameter4dARB = (GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameter4dvARB = (GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameter4fARB = (GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameter4fvARB = (GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameter4dARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4dARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameter4dvARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4dvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameter4fARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameter4fvARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramEnvParameterdvARB = (GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC) __GLeeGetProcAddress("glGetProgramEnvParameterdvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramEnvParameterfvARB = (GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetProgramEnvParameterfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramLocalParameterdvARB = (GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) __GLeeGetProcAddress("glGetProgramLocalParameterdvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramLocalParameterfvARB = (GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetProgramLocalParameterfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramivARB = (GLEEPFNGLGETPROGRAMIVARBPROC) __GLeeGetProcAddress("glGetProgramivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramStringARB = (GLEEPFNGLGETPROGRAMSTRINGARBPROC) __GLeeGetProcAddress("glGetProgramStringARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribdvARB = (GLEEPFNGLGETVERTEXATTRIBDVARBPROC) __GLeeGetProcAddress("glGetVertexAttribdvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribfvARB = (GLEEPFNGLGETVERTEXATTRIBFVARBPROC) __GLeeGetProcAddress("glGetVertexAttribfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribivARB = (GLEEPFNGLGETVERTEXATTRIBIVARBPROC) __GLeeGetProcAddress("glGetVertexAttribivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribPointervARB = (GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC) __GLeeGetProcAddress("glGetVertexAttribPointervARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsProgramARB = (GLEEPFNGLISPROGRAMARBPROC) __GLeeGetProcAddress("glIsProgramARB"))!=0) nLinked++; -#endif - if (nLinked==62) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_fragment_program(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_vertex_buffer_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_vertex_buffer_object - if ((GLeeFuncPtr_glBindBufferARB = (GLEEPFNGLBINDBUFFERARBPROC) __GLeeGetProcAddress("glBindBufferARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteBuffersARB = (GLEEPFNGLDELETEBUFFERSARBPROC) __GLeeGetProcAddress("glDeleteBuffersARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenBuffersARB = (GLEEPFNGLGENBUFFERSARBPROC) __GLeeGetProcAddress("glGenBuffersARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsBufferARB = (GLEEPFNGLISBUFFERARBPROC) __GLeeGetProcAddress("glIsBufferARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glBufferDataARB = (GLEEPFNGLBUFFERDATAARBPROC) __GLeeGetProcAddress("glBufferDataARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glBufferSubDataARB = (GLEEPFNGLBUFFERSUBDATAARBPROC) __GLeeGetProcAddress("glBufferSubDataARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBufferSubDataARB = (GLEEPFNGLGETBUFFERSUBDATAARBPROC) __GLeeGetProcAddress("glGetBufferSubDataARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glMapBufferARB = (GLEEPFNGLMAPBUFFERARBPROC) __GLeeGetProcAddress("glMapBufferARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUnmapBufferARB = (GLEEPFNGLUNMAPBUFFERARBPROC) __GLeeGetProcAddress("glUnmapBufferARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBufferParameterivARB = (GLEEPFNGLGETBUFFERPARAMETERIVARBPROC) __GLeeGetProcAddress("glGetBufferParameterivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBufferPointervARB = (GLEEPFNGLGETBUFFERPOINTERVARBPROC) __GLeeGetProcAddress("glGetBufferPointervARB"))!=0) nLinked++; -#endif - if (nLinked==11) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_occlusion_query(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_occlusion_query - if ((GLeeFuncPtr_glGenQueriesARB = (GLEEPFNGLGENQUERIESARBPROC) __GLeeGetProcAddress("glGenQueriesARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteQueriesARB = (GLEEPFNGLDELETEQUERIESARBPROC) __GLeeGetProcAddress("glDeleteQueriesARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsQueryARB = (GLEEPFNGLISQUERYARBPROC) __GLeeGetProcAddress("glIsQueryARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glBeginQueryARB = (GLEEPFNGLBEGINQUERYARBPROC) __GLeeGetProcAddress("glBeginQueryARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndQueryARB = (GLEEPFNGLENDQUERYARBPROC) __GLeeGetProcAddress("glEndQueryARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryivARB = (GLEEPFNGLGETQUERYIVARBPROC) __GLeeGetProcAddress("glGetQueryivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryObjectivARB = (GLEEPFNGLGETQUERYOBJECTIVARBPROC) __GLeeGetProcAddress("glGetQueryObjectivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryObjectuivARB = (GLEEPFNGLGETQUERYOBJECTUIVARBPROC) __GLeeGetProcAddress("glGetQueryObjectuivARB"))!=0) nLinked++; -#endif - if (nLinked==8) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_shader_objects(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_shader_objects - if ((GLeeFuncPtr_glDeleteObjectARB = (GLEEPFNGLDELETEOBJECTARBPROC) __GLeeGetProcAddress("glDeleteObjectARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetHandleARB = (GLEEPFNGLGETHANDLEARBPROC) __GLeeGetProcAddress("glGetHandleARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glDetachObjectARB = (GLEEPFNGLDETACHOBJECTARBPROC) __GLeeGetProcAddress("glDetachObjectARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCreateShaderObjectARB = (GLEEPFNGLCREATESHADEROBJECTARBPROC) __GLeeGetProcAddress("glCreateShaderObjectARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glShaderSourceARB = (GLEEPFNGLSHADERSOURCEARBPROC) __GLeeGetProcAddress("glShaderSourceARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompileShaderARB = (GLEEPFNGLCOMPILESHADERARBPROC) __GLeeGetProcAddress("glCompileShaderARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glCreateProgramObjectARB = (GLEEPFNGLCREATEPROGRAMOBJECTARBPROC) __GLeeGetProcAddress("glCreateProgramObjectARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glAttachObjectARB = (GLEEPFNGLATTACHOBJECTARBPROC) __GLeeGetProcAddress("glAttachObjectARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glLinkProgramARB = (GLEEPFNGLLINKPROGRAMARBPROC) __GLeeGetProcAddress("glLinkProgramARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUseProgramObjectARB = (GLEEPFNGLUSEPROGRAMOBJECTARBPROC) __GLeeGetProcAddress("glUseProgramObjectARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glValidateProgramARB = (GLEEPFNGLVALIDATEPROGRAMARBPROC) __GLeeGetProcAddress("glValidateProgramARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1fARB = (GLEEPFNGLUNIFORM1FARBPROC) __GLeeGetProcAddress("glUniform1fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2fARB = (GLEEPFNGLUNIFORM2FARBPROC) __GLeeGetProcAddress("glUniform2fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3fARB = (GLEEPFNGLUNIFORM3FARBPROC) __GLeeGetProcAddress("glUniform3fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4fARB = (GLEEPFNGLUNIFORM4FARBPROC) __GLeeGetProcAddress("glUniform4fARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1iARB = (GLEEPFNGLUNIFORM1IARBPROC) __GLeeGetProcAddress("glUniform1iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2iARB = (GLEEPFNGLUNIFORM2IARBPROC) __GLeeGetProcAddress("glUniform2iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3iARB = (GLEEPFNGLUNIFORM3IARBPROC) __GLeeGetProcAddress("glUniform3iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4iARB = (GLEEPFNGLUNIFORM4IARBPROC) __GLeeGetProcAddress("glUniform4iARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1fvARB = (GLEEPFNGLUNIFORM1FVARBPROC) __GLeeGetProcAddress("glUniform1fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2fvARB = (GLEEPFNGLUNIFORM2FVARBPROC) __GLeeGetProcAddress("glUniform2fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3fvARB = (GLEEPFNGLUNIFORM3FVARBPROC) __GLeeGetProcAddress("glUniform3fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4fvARB = (GLEEPFNGLUNIFORM4FVARBPROC) __GLeeGetProcAddress("glUniform4fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1ivARB = (GLEEPFNGLUNIFORM1IVARBPROC) __GLeeGetProcAddress("glUniform1ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2ivARB = (GLEEPFNGLUNIFORM2IVARBPROC) __GLeeGetProcAddress("glUniform2ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3ivARB = (GLEEPFNGLUNIFORM3IVARBPROC) __GLeeGetProcAddress("glUniform3ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4ivARB = (GLEEPFNGLUNIFORM4IVARBPROC) __GLeeGetProcAddress("glUniform4ivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix2fvARB = (GLEEPFNGLUNIFORMMATRIX2FVARBPROC) __GLeeGetProcAddress("glUniformMatrix2fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix3fvARB = (GLEEPFNGLUNIFORMMATRIX3FVARBPROC) __GLeeGetProcAddress("glUniformMatrix3fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniformMatrix4fvARB = (GLEEPFNGLUNIFORMMATRIX4FVARBPROC) __GLeeGetProcAddress("glUniformMatrix4fvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetObjectParameterfvARB = (GLEEPFNGLGETOBJECTPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetObjectParameterfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetObjectParameterivARB = (GLEEPFNGLGETOBJECTPARAMETERIVARBPROC) __GLeeGetProcAddress("glGetObjectParameterivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetInfoLogARB = (GLEEPFNGLGETINFOLOGARBPROC) __GLeeGetProcAddress("glGetInfoLogARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetAttachedObjectsARB = (GLEEPFNGLGETATTACHEDOBJECTSARBPROC) __GLeeGetProcAddress("glGetAttachedObjectsARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformLocationARB = (GLEEPFNGLGETUNIFORMLOCATIONARBPROC) __GLeeGetProcAddress("glGetUniformLocationARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetActiveUniformARB = (GLEEPFNGLGETACTIVEUNIFORMARBPROC) __GLeeGetProcAddress("glGetActiveUniformARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformfvARB = (GLEEPFNGLGETUNIFORMFVARBPROC) __GLeeGetProcAddress("glGetUniformfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformivARB = (GLEEPFNGLGETUNIFORMIVARBPROC) __GLeeGetProcAddress("glGetUniformivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetShaderSourceARB = (GLEEPFNGLGETSHADERSOURCEARBPROC) __GLeeGetProcAddress("glGetShaderSourceARB"))!=0) nLinked++; -#endif - if (nLinked==39) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_vertex_shader(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_vertex_shader - if ((GLeeFuncPtr_glBindAttribLocationARB = (GLEEPFNGLBINDATTRIBLOCATIONARBPROC) __GLeeGetProcAddress("glBindAttribLocationARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetActiveAttribARB = (GLEEPFNGLGETACTIVEATTRIBARBPROC) __GLeeGetProcAddress("glGetActiveAttribARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetAttribLocationARB = (GLEEPFNGLGETATTRIBLOCATIONARBPROC) __GLeeGetProcAddress("glGetAttribLocationARB"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_fragment_shader(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_shading_language_100(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_non_power_of_two(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_point_sprite(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_fragment_program_shadow(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_draw_buffers(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_draw_buffers - if ((GLeeFuncPtr_glDrawBuffersARB = (GLEEPFNGLDRAWBUFFERSARBPROC) __GLeeGetProcAddress("glDrawBuffersARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_texture_rectangle(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_color_buffer_float(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_color_buffer_float - if ((GLeeFuncPtr_glClampColorARB = (GLEEPFNGLCLAMPCOLORARBPROC) __GLeeGetProcAddress("glClampColorARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_half_float_pixel(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_pixel_buffer_object(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_depth_buffer_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_draw_instanced(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_draw_instanced - if ((GLeeFuncPtr_glDrawArraysInstancedARB = (GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC) __GLeeGetProcAddress("glDrawArraysInstancedARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawElementsInstancedARB = (GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC) __GLeeGetProcAddress("glDrawElementsInstancedARB"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_framebuffer_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_framebuffer_object - if ((GLeeFuncPtr_glIsRenderbuffer = (GLEEPFNGLISRENDERBUFFERPROC) __GLeeGetProcAddress("glIsRenderbuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindRenderbuffer = (GLEEPFNGLBINDRENDERBUFFERPROC) __GLeeGetProcAddress("glBindRenderbuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteRenderbuffers = (GLEEPFNGLDELETERENDERBUFFERSPROC) __GLeeGetProcAddress("glDeleteRenderbuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenRenderbuffers = (GLEEPFNGLGENRENDERBUFFERSPROC) __GLeeGetProcAddress("glGenRenderbuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glRenderbufferStorage = (GLEEPFNGLRENDERBUFFERSTORAGEPROC) __GLeeGetProcAddress("glRenderbufferStorage"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetRenderbufferParameteriv = (GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC) __GLeeGetProcAddress("glGetRenderbufferParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsFramebuffer = (GLEEPFNGLISFRAMEBUFFERPROC) __GLeeGetProcAddress("glIsFramebuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindFramebuffer = (GLEEPFNGLBINDFRAMEBUFFERPROC) __GLeeGetProcAddress("glBindFramebuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteFramebuffers = (GLEEPFNGLDELETEFRAMEBUFFERSPROC) __GLeeGetProcAddress("glDeleteFramebuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenFramebuffers = (GLEEPFNGLGENFRAMEBUFFERSPROC) __GLeeGetProcAddress("glGenFramebuffers"))!=0) nLinked++; - if ((GLeeFuncPtr_glCheckFramebufferStatus = (GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC) __GLeeGetProcAddress("glCheckFramebufferStatus"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTexture1D = (GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC) __GLeeGetProcAddress("glFramebufferTexture1D"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTexture2D = (GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC) __GLeeGetProcAddress("glFramebufferTexture2D"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTexture3D = (GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC) __GLeeGetProcAddress("glFramebufferTexture3D"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferRenderbuffer = (GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC) __GLeeGetProcAddress("glFramebufferRenderbuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFramebufferAttachmentParameteriv = (GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) __GLeeGetProcAddress("glGetFramebufferAttachmentParameteriv"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenerateMipmap = (GLEEPFNGLGENERATEMIPMAPPROC) __GLeeGetProcAddress("glGenerateMipmap"))!=0) nLinked++; - if ((GLeeFuncPtr_glBlitFramebuffer = (GLEEPFNGLBLITFRAMEBUFFERPROC) __GLeeGetProcAddress("glBlitFramebuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glRenderbufferStorageMultisample = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisample"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureLayer = (GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC) __GLeeGetProcAddress("glFramebufferTextureLayer"))!=0) nLinked++; -#endif - if (nLinked==20) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_geometry_shader4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_geometry_shader4 - if ((GLeeFuncPtr_glProgramParameteriARB = (GLEEPFNGLPROGRAMPARAMETERIARBPROC) __GLeeGetProcAddress("glProgramParameteriARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureARB = (GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC) __GLeeGetProcAddress("glFramebufferTextureARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureLayerARB = (GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC) __GLeeGetProcAddress("glFramebufferTextureLayerARB"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureFaceARB = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC) __GLeeGetProcAddress("glFramebufferTextureFaceARB"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_half_float_vertex(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_instanced_arrays(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_instanced_arrays - if ((GLeeFuncPtr_glVertexAttribDivisor = (GLEEPFNGLVERTEXATTRIBDIVISORPROC) __GLeeGetProcAddress("glVertexAttribDivisor"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_map_buffer_range(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_map_buffer_range - if ((GLeeFuncPtr_glMapBufferRange = (GLEEPFNGLMAPBUFFERRANGEPROC) __GLeeGetProcAddress("glMapBufferRange"))!=0) nLinked++; - if ((GLeeFuncPtr_glFlushMappedBufferRange = (GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC) __GLeeGetProcAddress("glFlushMappedBufferRange"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_texture_buffer_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_texture_buffer_object - if ((GLeeFuncPtr_glTexBufferARB = (GLEEPFNGLTEXBUFFERARBPROC) __GLeeGetProcAddress("glTexBufferARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ARB_texture_compression_rgtc(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_texture_rg(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ARB_vertex_array_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ARB_vertex_array_object - if ((GLeeFuncPtr_glBindVertexArray = (GLEEPFNGLBINDVERTEXARRAYPROC) __GLeeGetProcAddress("glBindVertexArray"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteVertexArrays = (GLEEPFNGLDELETEVERTEXARRAYSPROC) __GLeeGetProcAddress("glDeleteVertexArrays"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenVertexArrays = (GLEEPFNGLGENVERTEXARRAYSPROC) __GLeeGetProcAddress("glGenVertexArrays"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsVertexArray = (GLEEPFNGLISVERTEXARRAYPROC) __GLeeGetProcAddress("glIsVertexArray"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_abgr(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_blend_color(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_blend_color - if ((GLeeFuncPtr_glBlendColorEXT = (GLEEPFNGLBLENDCOLOREXTPROC) __GLeeGetProcAddress("glBlendColorEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_polygon_offset(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_polygon_offset - if ((GLeeFuncPtr_glPolygonOffsetEXT = (GLEEPFNGLPOLYGONOFFSETEXTPROC) __GLeeGetProcAddress("glPolygonOffsetEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture3D(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_texture3D - if ((GLeeFuncPtr_glTexImage3DEXT = (GLEEPFNGLTEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glTexImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexSubImage3DEXT = (GLEEPFNGLTEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glTexSubImage3DEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIS_texture_filter4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_texture_filter4 - if ((GLeeFuncPtr_glGetTexFilterFuncSGIS = (GLEEPFNGLGETTEXFILTERFUNCSGISPROC) __GLeeGetProcAddress("glGetTexFilterFuncSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexFilterFuncSGIS = (GLEEPFNGLTEXFILTERFUNCSGISPROC) __GLeeGetProcAddress("glTexFilterFuncSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_subtexture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_subtexture - if ((GLeeFuncPtr_glTexSubImage1DEXT = (GLEEPFNGLTEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glTexSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexSubImage2DEXT = (GLEEPFNGLTEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glTexSubImage2DEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_copy_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_copy_texture - if ((GLeeFuncPtr_glCopyTexImage1DEXT = (GLEEPFNGLCOPYTEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTexImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTexImage2DEXT = (GLEEPFNGLCOPYTEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTexImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTexSubImage1DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTexSubImage2DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTexSubImage3DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage3DEXT"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_histogram(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_histogram - if ((GLeeFuncPtr_glGetHistogramEXT = (GLEEPFNGLGETHISTOGRAMEXTPROC) __GLeeGetProcAddress("glGetHistogramEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetHistogramParameterfvEXT = (GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetHistogramParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetHistogramParameterivEXT = (GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetHistogramParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMinmaxEXT = (GLEEPFNGLGETMINMAXEXTPROC) __GLeeGetProcAddress("glGetMinmaxEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMinmaxParameterfvEXT = (GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMinmaxParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMinmaxParameterivEXT = (GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMinmaxParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glHistogramEXT = (GLEEPFNGLHISTOGRAMEXTPROC) __GLeeGetProcAddress("glHistogramEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMinmaxEXT = (GLEEPFNGLMINMAXEXTPROC) __GLeeGetProcAddress("glMinmaxEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glResetHistogramEXT = (GLEEPFNGLRESETHISTOGRAMEXTPROC) __GLeeGetProcAddress("glResetHistogramEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glResetMinmaxEXT = (GLEEPFNGLRESETMINMAXEXTPROC) __GLeeGetProcAddress("glResetMinmaxEXT"))!=0) nLinked++; -#endif - if (nLinked==10) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_convolution(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_convolution - if ((GLeeFuncPtr_glConvolutionFilter1DEXT = (GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC) __GLeeGetProcAddress("glConvolutionFilter1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionFilter2DEXT = (GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC) __GLeeGetProcAddress("glConvolutionFilter2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameterfEXT = (GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC) __GLeeGetProcAddress("glConvolutionParameterfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameterfvEXT = (GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC) __GLeeGetProcAddress("glConvolutionParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameteriEXT = (GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC) __GLeeGetProcAddress("glConvolutionParameteriEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glConvolutionParameterivEXT = (GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC) __GLeeGetProcAddress("glConvolutionParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyConvolutionFilter1DEXT = (GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) __GLeeGetProcAddress("glCopyConvolutionFilter1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyConvolutionFilter2DEXT = (GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) __GLeeGetProcAddress("glCopyConvolutionFilter2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetConvolutionFilterEXT = (GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC) __GLeeGetProcAddress("glGetConvolutionFilterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetConvolutionParameterfvEXT = (GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetConvolutionParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetConvolutionParameterivEXT = (GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetConvolutionParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetSeparableFilterEXT = (GLEEPFNGLGETSEPARABLEFILTEREXTPROC) __GLeeGetProcAddress("glGetSeparableFilterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSeparableFilter2DEXT = (GLEEPFNGLSEPARABLEFILTER2DEXTPROC) __GLeeGetProcAddress("glSeparableFilter2DEXT"))!=0) nLinked++; -#endif - if (nLinked==13) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGI_color_matrix(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGI_color_table(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGI_color_table - if ((GLeeFuncPtr_glColorTableSGI = (GLEEPFNGLCOLORTABLESGIPROC) __GLeeGetProcAddress("glColorTableSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorTableParameterfvSGI = (GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC) __GLeeGetProcAddress("glColorTableParameterfvSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorTableParameterivSGI = (GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC) __GLeeGetProcAddress("glColorTableParameterivSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyColorTableSGI = (GLEEPFNGLCOPYCOLORTABLESGIPROC) __GLeeGetProcAddress("glCopyColorTableSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableSGI = (GLEEPFNGLGETCOLORTABLESGIPROC) __GLeeGetProcAddress("glGetColorTableSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableParameterfvSGI = (GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC) __GLeeGetProcAddress("glGetColorTableParameterfvSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableParameterivSGI = (GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC) __GLeeGetProcAddress("glGetColorTableParameterivSGI"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIS_pixel_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_pixel_texture - if ((GLeeFuncPtr_glPixelTexGenParameteriSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC) __GLeeGetProcAddress("glPixelTexGenParameteriSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glPixelTexGenParameterivSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterivSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glPixelTexGenParameterfSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterfSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glPixelTexGenParameterfvSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterfvSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetPixelTexGenParameterivSGIS = (GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) __GLeeGetProcAddress("glGetPixelTexGenParameterivSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS = (GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) __GLeeGetProcAddress("glGetPixelTexGenParameterfvSGIS"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_pixel_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_pixel_texture - if ((GLeeFuncPtr_glPixelTexGenSGIX = (GLEEPFNGLPIXELTEXGENSGIXPROC) __GLeeGetProcAddress("glPixelTexGenSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIS_texture4D(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_texture4D - if ((GLeeFuncPtr_glTexImage4DSGIS = (GLEEPFNGLTEXIMAGE4DSGISPROC) __GLeeGetProcAddress("glTexImage4DSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexSubImage4DSGIS = (GLEEPFNGLTEXSUBIMAGE4DSGISPROC) __GLeeGetProcAddress("glTexSubImage4DSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGI_texture_color_table(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_cmyka(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_texture_object - if ((GLeeFuncPtr_glAreTexturesResidentEXT = (GLEEPFNGLARETEXTURESRESIDENTEXTPROC) __GLeeGetProcAddress("glAreTexturesResidentEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindTextureEXT = (GLEEPFNGLBINDTEXTUREEXTPROC) __GLeeGetProcAddress("glBindTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteTexturesEXT = (GLEEPFNGLDELETETEXTURESEXTPROC) __GLeeGetProcAddress("glDeleteTexturesEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenTexturesEXT = (GLEEPFNGLGENTEXTURESEXTPROC) __GLeeGetProcAddress("glGenTexturesEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsTextureEXT = (GLEEPFNGLISTEXTUREEXTPROC) __GLeeGetProcAddress("glIsTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glPrioritizeTexturesEXT = (GLEEPFNGLPRIORITIZETEXTURESEXTPROC) __GLeeGetProcAddress("glPrioritizeTexturesEXT"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIS_detail_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_detail_texture - if ((GLeeFuncPtr_glDetailTexFuncSGIS = (GLEEPFNGLDETAILTEXFUNCSGISPROC) __GLeeGetProcAddress("glDetailTexFuncSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetDetailTexFuncSGIS = (GLEEPFNGLGETDETAILTEXFUNCSGISPROC) __GLeeGetProcAddress("glGetDetailTexFuncSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIS_sharpen_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_sharpen_texture - if ((GLeeFuncPtr_glSharpenTexFuncSGIS = (GLEEPFNGLSHARPENTEXFUNCSGISPROC) __GLeeGetProcAddress("glSharpenTexFuncSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetSharpenTexFuncSGIS = (GLEEPFNGLGETSHARPENTEXFUNCSGISPROC) __GLeeGetProcAddress("glGetSharpenTexFuncSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_packed_pixels(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_texture_lod(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_multisample(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_multisample - if ((GLeeFuncPtr_glSampleMaskSGIS = (GLEEPFNGLSAMPLEMASKSGISPROC) __GLeeGetProcAddress("glSampleMaskSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glSamplePatternSGIS = (GLEEPFNGLSAMPLEPATTERNSGISPROC) __GLeeGetProcAddress("glSamplePatternSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_rescale_normal(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_vertex_array(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_vertex_array - if ((GLeeFuncPtr_glArrayElementEXT = (GLEEPFNGLARRAYELEMENTEXTPROC) __GLeeGetProcAddress("glArrayElementEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorPointerEXT = (GLEEPFNGLCOLORPOINTEREXTPROC) __GLeeGetProcAddress("glColorPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawArraysEXT = (GLEEPFNGLDRAWARRAYSEXTPROC) __GLeeGetProcAddress("glDrawArraysEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEdgeFlagPointerEXT = (GLEEPFNGLEDGEFLAGPOINTEREXTPROC) __GLeeGetProcAddress("glEdgeFlagPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetPointervEXT = (GLEEPFNGLGETPOINTERVEXTPROC) __GLeeGetProcAddress("glGetPointervEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glIndexPointerEXT = (GLEEPFNGLINDEXPOINTEREXTPROC) __GLeeGetProcAddress("glIndexPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalPointerEXT = (GLEEPFNGLNORMALPOINTEREXTPROC) __GLeeGetProcAddress("glNormalPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoordPointerEXT = (GLEEPFNGLTEXCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glTexCoordPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexPointerEXT = (GLEEPFNGLVERTEXPOINTEREXTPROC) __GLeeGetProcAddress("glVertexPointerEXT"))!=0) nLinked++; -#endif - if (nLinked==9) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_misc_attribute(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_generate_mipmap(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_clipmap(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_shadow(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_texture_edge_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_texture_border_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_blend_minmax(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_blend_minmax - if ((GLeeFuncPtr_glBlendEquationEXT = (GLEEPFNGLBLENDEQUATIONEXTPROC) __GLeeGetProcAddress("glBlendEquationEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_blend_subtract(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_blend_logic_op(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_interlace(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_pixel_tiles(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_texture_select(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_sprite(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_sprite - if ((GLeeFuncPtr_glSpriteParameterfSGIX = (GLEEPFNGLSPRITEPARAMETERFSGIXPROC) __GLeeGetProcAddress("glSpriteParameterfSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glSpriteParameterfvSGIX = (GLEEPFNGLSPRITEPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glSpriteParameterfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glSpriteParameteriSGIX = (GLEEPFNGLSPRITEPARAMETERISGIXPROC) __GLeeGetProcAddress("glSpriteParameteriSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glSpriteParameterivSGIX = (GLEEPFNGLSPRITEPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glSpriteParameterivSGIX"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_texture_multi_buffer(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_point_parameters(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_point_parameters - if ((GLeeFuncPtr_glPointParameterfEXT = (GLEEPFNGLPOINTPARAMETERFEXTPROC) __GLeeGetProcAddress("glPointParameterfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameterfvEXT = (GLEEPFNGLPOINTPARAMETERFVEXTPROC) __GLeeGetProcAddress("glPointParameterfvEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIS_point_parameters(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_point_parameters - if ((GLeeFuncPtr_glPointParameterfSGIS = (GLEEPFNGLPOINTPARAMETERFSGISPROC) __GLeeGetProcAddress("glPointParameterfSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameterfvSGIS = (GLEEPFNGLPOINTPARAMETERFVSGISPROC) __GLeeGetProcAddress("glPointParameterfvSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_instruments(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_instruments - if ((GLeeFuncPtr_glGetInstrumentsSGIX = (GLEEPFNGLGETINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glGetInstrumentsSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glInstrumentsBufferSGIX = (GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC) __GLeeGetProcAddress("glInstrumentsBufferSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glPollInstrumentsSGIX = (GLEEPFNGLPOLLINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glPollInstrumentsSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glReadInstrumentsSGIX = (GLEEPFNGLREADINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glReadInstrumentsSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glStartInstrumentsSGIX = (GLEEPFNGLSTARTINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glStartInstrumentsSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glStopInstrumentsSGIX = (GLEEPFNGLSTOPINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glStopInstrumentsSGIX"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_texture_scale_bias(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_framezoom(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_framezoom - if ((GLeeFuncPtr_glFrameZoomSGIX = (GLEEPFNGLFRAMEZOOMSGIXPROC) __GLeeGetProcAddress("glFrameZoomSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_tag_sample_buffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_tag_sample_buffer - if ((GLeeFuncPtr_glTagSampleBufferSGIX = (GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC) __GLeeGetProcAddress("glTagSampleBufferSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_FfdMaskSGIX(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_polynomial_ffd(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_polynomial_ffd - if ((GLeeFuncPtr_glDeformationMap3dSGIX = (GLEEPFNGLDEFORMATIONMAP3DSGIXPROC) __GLeeGetProcAddress("glDeformationMap3dSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeformationMap3fSGIX = (GLEEPFNGLDEFORMATIONMAP3FSGIXPROC) __GLeeGetProcAddress("glDeformationMap3fSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeformSGIX = (GLEEPFNGLDEFORMSGIXPROC) __GLeeGetProcAddress("glDeformSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glLoadIdentityDeformationMapSGIX = (GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) __GLeeGetProcAddress("glLoadIdentityDeformationMapSGIX"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_reference_plane(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_reference_plane - if ((GLeeFuncPtr_glReferencePlaneSGIX = (GLEEPFNGLREFERENCEPLANESGIXPROC) __GLeeGetProcAddress("glReferencePlaneSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_flush_raster(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_flush_raster - if ((GLeeFuncPtr_glFlushRasterSGIX = (GLEEPFNGLFLUSHRASTERSGIXPROC) __GLeeGetProcAddress("glFlushRasterSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_depth_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_fog_function(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_fog_function - if ((GLeeFuncPtr_glFogFuncSGIS = (GLEEPFNGLFOGFUNCSGISPROC) __GLeeGetProcAddress("glFogFuncSGIS"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFogFuncSGIS = (GLEEPFNGLGETFOGFUNCSGISPROC) __GLeeGetProcAddress("glGetFogFuncSGIS"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_fog_offset(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_HP_image_transform(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_HP_image_transform - if ((GLeeFuncPtr_glImageTransformParameteriHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC) __GLeeGetProcAddress("glImageTransformParameteriHP"))!=0) nLinked++; - if ((GLeeFuncPtr_glImageTransformParameterfHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC) __GLeeGetProcAddress("glImageTransformParameterfHP"))!=0) nLinked++; - if ((GLeeFuncPtr_glImageTransformParameterivHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC) __GLeeGetProcAddress("glImageTransformParameterivHP"))!=0) nLinked++; - if ((GLeeFuncPtr_glImageTransformParameterfvHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC) __GLeeGetProcAddress("glImageTransformParameterfvHP"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetImageTransformParameterivHP = (GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) __GLeeGetProcAddress("glGetImageTransformParameterivHP"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetImageTransformParameterfvHP = (GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) __GLeeGetProcAddress("glGetImageTransformParameterfvHP"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_HP_convolution_border_modes(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_INGR_palette_buffer(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_texture_add_env(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_color_subtable(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_color_subtable - if ((GLeeFuncPtr_glColorSubTableEXT = (GLEEPFNGLCOLORSUBTABLEEXTPROC) __GLeeGetProcAddress("glColorSubTableEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyColorSubTableEXT = (GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC) __GLeeGetProcAddress("glCopyColorSubTableEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_PGI_vertex_hints(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_PGI_misc_hints(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_PGI_misc_hints - if ((GLeeFuncPtr_glHintPGI = (GLEEPFNGLHINTPGIPROC) __GLeeGetProcAddress("glHintPGI"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_paletted_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_paletted_texture - if ((GLeeFuncPtr_glColorTableEXT = (GLEEPFNGLCOLORTABLEEXTPROC) __GLeeGetProcAddress("glColorTableEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableEXT = (GLEEPFNGLGETCOLORTABLEEXTPROC) __GLeeGetProcAddress("glGetColorTableEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableParameterivEXT = (GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetColorTableParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetColorTableParameterfvEXT = (GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetColorTableParameterfvEXT"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_clip_volume_hint(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_list_priority(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_list_priority - if ((GLeeFuncPtr_glGetListParameterfvSGIX = (GLEEPFNGLGETLISTPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glGetListParameterfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetListParameterivSGIX = (GLEEPFNGLGETLISTPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glGetListParameterivSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glListParameterfSGIX = (GLEEPFNGLLISTPARAMETERFSGIXPROC) __GLeeGetProcAddress("glListParameterfSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glListParameterfvSGIX = (GLEEPFNGLLISTPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glListParameterfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glListParameteriSGIX = (GLEEPFNGLLISTPARAMETERISGIXPROC) __GLeeGetProcAddress("glListParameteriSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glListParameterivSGIX = (GLEEPFNGLLISTPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glListParameterivSGIX"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_ir_instrument1(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_calligraphic_fragment(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_texture_lod_bias(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_shadow_ambient(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_index_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_index_material(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_index_material - if ((GLeeFuncPtr_glIndexMaterialEXT = (GLEEPFNGLINDEXMATERIALEXTPROC) __GLeeGetProcAddress("glIndexMaterialEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_index_func(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_index_func - if ((GLeeFuncPtr_glIndexFuncEXT = (GLEEPFNGLINDEXFUNCEXTPROC) __GLeeGetProcAddress("glIndexFuncEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_index_array_formats(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_compiled_vertex_array(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_compiled_vertex_array - if ((GLeeFuncPtr_glLockArraysEXT = (GLEEPFNGLLOCKARRAYSEXTPROC) __GLeeGetProcAddress("glLockArraysEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUnlockArraysEXT = (GLEEPFNGLUNLOCKARRAYSEXTPROC) __GLeeGetProcAddress("glUnlockArraysEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_cull_vertex(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_cull_vertex - if ((GLeeFuncPtr_glCullParameterdvEXT = (GLEEPFNGLCULLPARAMETERDVEXTPROC) __GLeeGetProcAddress("glCullParameterdvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCullParameterfvEXT = (GLEEPFNGLCULLPARAMETERFVEXTPROC) __GLeeGetProcAddress("glCullParameterfvEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_ycrcb(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_fragment_lighting(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_fragment_lighting - if ((GLeeFuncPtr_glFragmentColorMaterialSGIX = (GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC) __GLeeGetProcAddress("glFragmentColorMaterialSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightfSGIX = (GLEEPFNGLFRAGMENTLIGHTFSGIXPROC) __GLeeGetProcAddress("glFragmentLightfSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightfvSGIX = (GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC) __GLeeGetProcAddress("glFragmentLightfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightiSGIX = (GLEEPFNGLFRAGMENTLIGHTISGIXPROC) __GLeeGetProcAddress("glFragmentLightiSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightivSGIX = (GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC) __GLeeGetProcAddress("glFragmentLightivSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModelfSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelfSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModelfvSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModeliSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC) __GLeeGetProcAddress("glFragmentLightModeliSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModelivSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelivSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialfSGIX = (GLEEPFNGLFRAGMENTMATERIALFSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialfSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialfvSGIX = (GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialiSGIX = (GLEEPFNGLFRAGMENTMATERIALISGIXPROC) __GLeeGetProcAddress("glFragmentMaterialiSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialivSGIX = (GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialivSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentLightfvSGIX = (GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC) __GLeeGetProcAddress("glGetFragmentLightfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentLightivSGIX = (GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC) __GLeeGetProcAddress("glGetFragmentLightivSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentMaterialfvSGIX = (GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC) __GLeeGetProcAddress("glGetFragmentMaterialfvSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentMaterialivSGIX = (GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC) __GLeeGetProcAddress("glGetFragmentMaterialivSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glLightEnviSGIX = (GLEEPFNGLLIGHTENVISGIXPROC) __GLeeGetProcAddress("glLightEnviSGIX"))!=0) nLinked++; -#endif - if (nLinked==18) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_IBM_rasterpos_clip(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_HP_texture_lighting(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_draw_range_elements(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_draw_range_elements - if ((GLeeFuncPtr_glDrawRangeElementsEXT = (GLEEPFNGLDRAWRANGEELEMENTSEXTPROC) __GLeeGetProcAddress("glDrawRangeElementsEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_WIN_phong_shading(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_WIN_specular_fog(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_light_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_light_texture - if ((GLeeFuncPtr_glApplyTextureEXT = (GLEEPFNGLAPPLYTEXTUREEXTPROC) __GLeeGetProcAddress("glApplyTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureLightEXT = (GLEEPFNGLTEXTURELIGHTEXTPROC) __GLeeGetProcAddress("glTextureLightEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureMaterialEXT = (GLEEPFNGLTEXTUREMATERIALEXTPROC) __GLeeGetProcAddress("glTextureMaterialEXT"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_blend_alpha_minmax(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_impact_pixel_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_bgra(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_async(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_async - if ((GLeeFuncPtr_glAsyncMarkerSGIX = (GLEEPFNGLASYNCMARKERSGIXPROC) __GLeeGetProcAddress("glAsyncMarkerSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glFinishAsyncSGIX = (GLEEPFNGLFINISHASYNCSGIXPROC) __GLeeGetProcAddress("glFinishAsyncSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glPollAsyncSGIX = (GLEEPFNGLPOLLASYNCSGIXPROC) __GLeeGetProcAddress("glPollAsyncSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenAsyncMarkersSGIX = (GLEEPFNGLGENASYNCMARKERSSGIXPROC) __GLeeGetProcAddress("glGenAsyncMarkersSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteAsyncMarkersSGIX = (GLEEPFNGLDELETEASYNCMARKERSSGIXPROC) __GLeeGetProcAddress("glDeleteAsyncMarkersSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsAsyncMarkerSGIX = (GLEEPFNGLISASYNCMARKERSGIXPROC) __GLeeGetProcAddress("glIsAsyncMarkerSGIX"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_async_pixel(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_async_histogram(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_INTEL_texture_scissor(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_INTEL_parallel_arrays(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_INTEL_parallel_arrays - if ((GLeeFuncPtr_glVertexPointervINTEL = (GLEEPFNGLVERTEXPOINTERVINTELPROC) __GLeeGetProcAddress("glVertexPointervINTEL"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalPointervINTEL = (GLEEPFNGLNORMALPOINTERVINTELPROC) __GLeeGetProcAddress("glNormalPointervINTEL"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorPointervINTEL = (GLEEPFNGLCOLORPOINTERVINTELPROC) __GLeeGetProcAddress("glColorPointervINTEL"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoordPointervINTEL = (GLEEPFNGLTEXCOORDPOINTERVINTELPROC) __GLeeGetProcAddress("glTexCoordPointervINTEL"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_HP_occlusion_test(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_pixel_transform(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_pixel_transform - if ((GLeeFuncPtr_glPixelTransformParameteriEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC) __GLeeGetProcAddress("glPixelTransformParameteriEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glPixelTransformParameterfEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glPixelTransformParameterivEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glPixelTransformParameterfvEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterfvEXT"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_pixel_transform_color_table(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_shared_texture_palette(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_separate_specular_color(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_secondary_color(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_secondary_color - if ((GLeeFuncPtr_glSecondaryColor3bEXT = (GLEEPFNGLSECONDARYCOLOR3BEXTPROC) __GLeeGetProcAddress("glSecondaryColor3bEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3bvEXT = (GLEEPFNGLSECONDARYCOLOR3BVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3bvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3dEXT = (GLEEPFNGLSECONDARYCOLOR3DEXTPROC) __GLeeGetProcAddress("glSecondaryColor3dEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3dvEXT = (GLEEPFNGLSECONDARYCOLOR3DVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3dvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3fEXT = (GLEEPFNGLSECONDARYCOLOR3FEXTPROC) __GLeeGetProcAddress("glSecondaryColor3fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3fvEXT = (GLEEPFNGLSECONDARYCOLOR3FVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3iEXT = (GLEEPFNGLSECONDARYCOLOR3IEXTPROC) __GLeeGetProcAddress("glSecondaryColor3iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3ivEXT = (GLEEPFNGLSECONDARYCOLOR3IVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3sEXT = (GLEEPFNGLSECONDARYCOLOR3SEXTPROC) __GLeeGetProcAddress("glSecondaryColor3sEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3svEXT = (GLEEPFNGLSECONDARYCOLOR3SVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3svEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3ubEXT = (GLEEPFNGLSECONDARYCOLOR3UBEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ubEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3ubvEXT = (GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ubvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3uiEXT = (GLEEPFNGLSECONDARYCOLOR3UIEXTPROC) __GLeeGetProcAddress("glSecondaryColor3uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3uivEXT = (GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3usEXT = (GLEEPFNGLSECONDARYCOLOR3USEXTPROC) __GLeeGetProcAddress("glSecondaryColor3usEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3usvEXT = (GLEEPFNGLSECONDARYCOLOR3USVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3usvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColorPointerEXT = (GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC) __GLeeGetProcAddress("glSecondaryColorPointerEXT"))!=0) nLinked++; -#endif - if (nLinked==17) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_perturb_normal(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_texture_perturb_normal - if ((GLeeFuncPtr_glTextureNormalEXT = (GLEEPFNGLTEXTURENORMALEXTPROC) __GLeeGetProcAddress("glTextureNormalEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_multi_draw_arrays(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_multi_draw_arrays - if ((GLeeFuncPtr_glMultiDrawArraysEXT = (GLEEPFNGLMULTIDRAWARRAYSEXTPROC) __GLeeGetProcAddress("glMultiDrawArraysEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiDrawElementsEXT = (GLEEPFNGLMULTIDRAWELEMENTSEXTPROC) __GLeeGetProcAddress("glMultiDrawElementsEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_fog_coord(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_fog_coord - if ((GLeeFuncPtr_glFogCoordfEXT = (GLEEPFNGLFOGCOORDFEXTPROC) __GLeeGetProcAddress("glFogCoordfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordfvEXT = (GLEEPFNGLFOGCOORDFVEXTPROC) __GLeeGetProcAddress("glFogCoordfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoorddEXT = (GLEEPFNGLFOGCOORDDEXTPROC) __GLeeGetProcAddress("glFogCoorddEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoorddvEXT = (GLEEPFNGLFOGCOORDDVEXTPROC) __GLeeGetProcAddress("glFogCoorddvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordPointerEXT = (GLEEPFNGLFOGCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glFogCoordPointerEXT"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_REND_screen_coordinates(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_coordinate_frame(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_coordinate_frame - if ((GLeeFuncPtr_glTangent3bEXT = (GLEEPFNGLTANGENT3BEXTPROC) __GLeeGetProcAddress("glTangent3bEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3bvEXT = (GLEEPFNGLTANGENT3BVEXTPROC) __GLeeGetProcAddress("glTangent3bvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3dEXT = (GLEEPFNGLTANGENT3DEXTPROC) __GLeeGetProcAddress("glTangent3dEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3dvEXT = (GLEEPFNGLTANGENT3DVEXTPROC) __GLeeGetProcAddress("glTangent3dvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3fEXT = (GLEEPFNGLTANGENT3FEXTPROC) __GLeeGetProcAddress("glTangent3fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3fvEXT = (GLEEPFNGLTANGENT3FVEXTPROC) __GLeeGetProcAddress("glTangent3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3iEXT = (GLEEPFNGLTANGENT3IEXTPROC) __GLeeGetProcAddress("glTangent3iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3ivEXT = (GLEEPFNGLTANGENT3IVEXTPROC) __GLeeGetProcAddress("glTangent3ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3sEXT = (GLEEPFNGLTANGENT3SEXTPROC) __GLeeGetProcAddress("glTangent3sEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangent3svEXT = (GLEEPFNGLTANGENT3SVEXTPROC) __GLeeGetProcAddress("glTangent3svEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3bEXT = (GLEEPFNGLBINORMAL3BEXTPROC) __GLeeGetProcAddress("glBinormal3bEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3bvEXT = (GLEEPFNGLBINORMAL3BVEXTPROC) __GLeeGetProcAddress("glBinormal3bvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3dEXT = (GLEEPFNGLBINORMAL3DEXTPROC) __GLeeGetProcAddress("glBinormal3dEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3dvEXT = (GLEEPFNGLBINORMAL3DVEXTPROC) __GLeeGetProcAddress("glBinormal3dvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3fEXT = (GLEEPFNGLBINORMAL3FEXTPROC) __GLeeGetProcAddress("glBinormal3fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3fvEXT = (GLEEPFNGLBINORMAL3FVEXTPROC) __GLeeGetProcAddress("glBinormal3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3iEXT = (GLEEPFNGLBINORMAL3IEXTPROC) __GLeeGetProcAddress("glBinormal3iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3ivEXT = (GLEEPFNGLBINORMAL3IVEXTPROC) __GLeeGetProcAddress("glBinormal3ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3sEXT = (GLEEPFNGLBINORMAL3SEXTPROC) __GLeeGetProcAddress("glBinormal3sEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormal3svEXT = (GLEEPFNGLBINORMAL3SVEXTPROC) __GLeeGetProcAddress("glBinormal3svEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTangentPointerEXT = (GLEEPFNGLTANGENTPOINTEREXTPROC) __GLeeGetProcAddress("glTangentPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBinormalPointerEXT = (GLEEPFNGLBINORMALPOINTEREXTPROC) __GLeeGetProcAddress("glBinormalPointerEXT"))!=0) nLinked++; -#endif - if (nLinked==22) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_env_combine(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_APPLE_specular_vector(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_APPLE_transform_hint(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_fog_scale(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SUNX_constant_data(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SUNX_constant_data - if ((GLeeFuncPtr_glFinishTextureSUNX = (GLEEPFNGLFINISHTEXTURESUNXPROC) __GLeeGetProcAddress("glFinishTextureSUNX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SUN_global_alpha(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SUN_global_alpha - if ((GLeeFuncPtr_glGlobalAlphaFactorbSUN = (GLEEPFNGLGLOBALALPHAFACTORBSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorbSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactorsSUN = (GLEEPFNGLGLOBALALPHAFACTORSSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorsSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactoriSUN = (GLEEPFNGLGLOBALALPHAFACTORISUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactoriSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactorfSUN = (GLEEPFNGLGLOBALALPHAFACTORFSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorfSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactordSUN = (GLEEPFNGLGLOBALALPHAFACTORDSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactordSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactorubSUN = (GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorubSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactorusSUN = (GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorusSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glGlobalAlphaFactoruiSUN = (GLEEPFNGLGLOBALALPHAFACTORUISUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactoruiSUN"))!=0) nLinked++; -#endif - if (nLinked==8) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SUN_triangle_list(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SUN_triangle_list - if ((GLeeFuncPtr_glReplacementCodeuiSUN = (GLEEPFNGLREPLACEMENTCODEUISUNPROC) __GLeeGetProcAddress("glReplacementCodeuiSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeusSUN = (GLEEPFNGLREPLACEMENTCODEUSSUNPROC) __GLeeGetProcAddress("glReplacementCodeusSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeubSUN = (GLEEPFNGLREPLACEMENTCODEUBSUNPROC) __GLeeGetProcAddress("glReplacementCodeubSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuivSUN = (GLEEPFNGLREPLACEMENTCODEUIVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuivSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeusvSUN = (GLEEPFNGLREPLACEMENTCODEUSVSUNPROC) __GLeeGetProcAddress("glReplacementCodeusvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeubvSUN = (GLEEPFNGLREPLACEMENTCODEUBVSUNPROC) __GLeeGetProcAddress("glReplacementCodeubvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodePointerSUN = (GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC) __GLeeGetProcAddress("glReplacementCodePointerSUN"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SUN_vertex(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SUN_vertex - if ((GLeeFuncPtr_glColor4ubVertex2fSUN = (GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC) __GLeeGetProcAddress("glColor4ubVertex2fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4ubVertex2fvSUN = (GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC) __GLeeGetProcAddress("glColor4ubVertex2fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4ubVertex3fSUN = (GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor4ubVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4ubVertex3fvSUN = (GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor4ubVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor3fVertex3fSUN = (GLEEPFNGLCOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor3fVertex3fvSUN = (GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormal3fVertex3fSUN = (GLEEPFNGLNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormal3fVertex3fvSUN = (GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4fNormal3fVertex3fSUN = (GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor4fNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN = (GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fVertex3fSUN = (GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord4fVertex4fSUN = (GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC) __GLeeGetProcAddress("glTexCoord4fVertex4fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord4fVertex4fvSUN = (GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC) __GLeeGetProcAddress("glTexCoord4fVertex4fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4ubVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4ubVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN = (GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) __GLeeGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN = (GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) __GLeeGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4ubVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4ubVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN"))!=0) nLinked++; - if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; -#endif - if (nLinked==40) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_blend_func_separate(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_blend_func_separate - if ((GLeeFuncPtr_glBlendFuncSeparateEXT = (GLEEPFNGLBLENDFUNCSEPARATEEXTPROC) __GLeeGetProcAddress("glBlendFuncSeparateEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_INGR_color_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_INGR_interlace_read(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_stencil_wrap(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_422_pixels(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_texgen_reflection(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_cube_map(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SUN_convolution_border_modes(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_env_add(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_lod_bias(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_filter_anisotropic(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_vertex_weighting(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_vertex_weighting - if ((GLeeFuncPtr_glVertexWeightfEXT = (GLEEPFNGLVERTEXWEIGHTFEXTPROC) __GLeeGetProcAddress("glVertexWeightfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexWeightfvEXT = (GLEEPFNGLVERTEXWEIGHTFVEXTPROC) __GLeeGetProcAddress("glVertexWeightfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexWeightPointerEXT = (GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC) __GLeeGetProcAddress("glVertexWeightPointerEXT"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_light_max_exponent(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_array_range(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_vertex_array_range - if ((GLeeFuncPtr_glFlushVertexArrayRangeNV = (GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC) __GLeeGetProcAddress("glFlushVertexArrayRangeNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexArrayRangeNV = (GLEEPFNGLVERTEXARRAYRANGENVPROC) __GLeeGetProcAddress("glVertexArrayRangeNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_register_combiners(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_register_combiners - if ((GLeeFuncPtr_glCombinerParameterfvNV = (GLEEPFNGLCOMBINERPARAMETERFVNVPROC) __GLeeGetProcAddress("glCombinerParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glCombinerParameterfNV = (GLEEPFNGLCOMBINERPARAMETERFNVPROC) __GLeeGetProcAddress("glCombinerParameterfNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glCombinerParameterivNV = (GLEEPFNGLCOMBINERPARAMETERIVNVPROC) __GLeeGetProcAddress("glCombinerParameterivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glCombinerParameteriNV = (GLEEPFNGLCOMBINERPARAMETERINVPROC) __GLeeGetProcAddress("glCombinerParameteriNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glCombinerInputNV = (GLEEPFNGLCOMBINERINPUTNVPROC) __GLeeGetProcAddress("glCombinerInputNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glCombinerOutputNV = (GLEEPFNGLCOMBINEROUTPUTNVPROC) __GLeeGetProcAddress("glCombinerOutputNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glFinalCombinerInputNV = (GLEEPFNGLFINALCOMBINERINPUTNVPROC) __GLeeGetProcAddress("glFinalCombinerInputNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCombinerInputParameterfvNV = (GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerInputParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCombinerInputParameterivNV = (GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetCombinerInputParameterivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCombinerOutputParameterfvNV = (GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerOutputParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCombinerOutputParameterivNV = (GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetCombinerOutputParameterivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV = (GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetFinalCombinerInputParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFinalCombinerInputParameterivNV = (GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetFinalCombinerInputParameterivNV"))!=0) nLinked++; -#endif - if (nLinked==13) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_fog_distance(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_texgen_emboss(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_blend_square(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_texture_env_combine4(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_MESA_resize_buffers(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_MESA_resize_buffers - if ((GLeeFuncPtr_glResizeBuffersMESA = (GLEEPFNGLRESIZEBUFFERSMESAPROC) __GLeeGetProcAddress("glResizeBuffersMESA"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_MESA_window_pos(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_MESA_window_pos - if ((GLeeFuncPtr_glWindowPos2dMESA = (GLEEPFNGLWINDOWPOS2DMESAPROC) __GLeeGetProcAddress("glWindowPos2dMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2dvMESA = (GLEEPFNGLWINDOWPOS2DVMESAPROC) __GLeeGetProcAddress("glWindowPos2dvMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2fMESA = (GLEEPFNGLWINDOWPOS2FMESAPROC) __GLeeGetProcAddress("glWindowPos2fMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2fvMESA = (GLEEPFNGLWINDOWPOS2FVMESAPROC) __GLeeGetProcAddress("glWindowPos2fvMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2iMESA = (GLEEPFNGLWINDOWPOS2IMESAPROC) __GLeeGetProcAddress("glWindowPos2iMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2ivMESA = (GLEEPFNGLWINDOWPOS2IVMESAPROC) __GLeeGetProcAddress("glWindowPos2ivMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2sMESA = (GLEEPFNGLWINDOWPOS2SMESAPROC) __GLeeGetProcAddress("glWindowPos2sMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos2svMESA = (GLEEPFNGLWINDOWPOS2SVMESAPROC) __GLeeGetProcAddress("glWindowPos2svMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3dMESA = (GLEEPFNGLWINDOWPOS3DMESAPROC) __GLeeGetProcAddress("glWindowPos3dMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3dvMESA = (GLEEPFNGLWINDOWPOS3DVMESAPROC) __GLeeGetProcAddress("glWindowPos3dvMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3fMESA = (GLEEPFNGLWINDOWPOS3FMESAPROC) __GLeeGetProcAddress("glWindowPos3fMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3fvMESA = (GLEEPFNGLWINDOWPOS3FVMESAPROC) __GLeeGetProcAddress("glWindowPos3fvMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3iMESA = (GLEEPFNGLWINDOWPOS3IMESAPROC) __GLeeGetProcAddress("glWindowPos3iMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3ivMESA = (GLEEPFNGLWINDOWPOS3IVMESAPROC) __GLeeGetProcAddress("glWindowPos3ivMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3sMESA = (GLEEPFNGLWINDOWPOS3SMESAPROC) __GLeeGetProcAddress("glWindowPos3sMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos3svMESA = (GLEEPFNGLWINDOWPOS3SVMESAPROC) __GLeeGetProcAddress("glWindowPos3svMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4dMESA = (GLEEPFNGLWINDOWPOS4DMESAPROC) __GLeeGetProcAddress("glWindowPos4dMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4dvMESA = (GLEEPFNGLWINDOWPOS4DVMESAPROC) __GLeeGetProcAddress("glWindowPos4dvMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4fMESA = (GLEEPFNGLWINDOWPOS4FMESAPROC) __GLeeGetProcAddress("glWindowPos4fMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4fvMESA = (GLEEPFNGLWINDOWPOS4FVMESAPROC) __GLeeGetProcAddress("glWindowPos4fvMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4iMESA = (GLEEPFNGLWINDOWPOS4IMESAPROC) __GLeeGetProcAddress("glWindowPos4iMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4ivMESA = (GLEEPFNGLWINDOWPOS4IVMESAPROC) __GLeeGetProcAddress("glWindowPos4ivMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4sMESA = (GLEEPFNGLWINDOWPOS4SMESAPROC) __GLeeGetProcAddress("glWindowPos4sMESA"))!=0) nLinked++; - if ((GLeeFuncPtr_glWindowPos4svMESA = (GLEEPFNGLWINDOWPOS4SVMESAPROC) __GLeeGetProcAddress("glWindowPos4svMESA"))!=0) nLinked++; -#endif - if (nLinked==24) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_compression_s3tc(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_IBM_cull_vertex(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_IBM_multimode_draw_arrays(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_IBM_multimode_draw_arrays - if ((GLeeFuncPtr_glMultiModeDrawArraysIBM = (GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC) __GLeeGetProcAddress("glMultiModeDrawArraysIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiModeDrawElementsIBM = (GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC) __GLeeGetProcAddress("glMultiModeDrawElementsIBM"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_IBM_vertex_array_lists(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_IBM_vertex_array_lists - if ((GLeeFuncPtr_glColorPointerListIBM = (GLEEPFNGLCOLORPOINTERLISTIBMPROC) __GLeeGetProcAddress("glColorPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColorPointerListIBM = (GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC) __GLeeGetProcAddress("glSecondaryColorPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glEdgeFlagPointerListIBM = (GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC) __GLeeGetProcAddress("glEdgeFlagPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordPointerListIBM = (GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC) __GLeeGetProcAddress("glFogCoordPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glIndexPointerListIBM = (GLEEPFNGLINDEXPOINTERLISTIBMPROC) __GLeeGetProcAddress("glIndexPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalPointerListIBM = (GLEEPFNGLNORMALPOINTERLISTIBMPROC) __GLeeGetProcAddress("glNormalPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoordPointerListIBM = (GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC) __GLeeGetProcAddress("glTexCoordPointerListIBM"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexPointerListIBM = (GLEEPFNGLVERTEXPOINTERLISTIBMPROC) __GLeeGetProcAddress("glVertexPointerListIBM"))!=0) nLinked++; -#endif - if (nLinked==8) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_subsample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_ycrcb_subsample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_ycrcba(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGI_depth_pass_instrument(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_3DFX_texture_compression_FXT1(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_3DFX_tbuffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_3DFX_tbuffer - if ((GLeeFuncPtr_glTbufferMask3DFX = (GLEEPFNGLTBUFFERMASK3DFXPROC) __GLeeGetProcAddress("glTbufferMask3DFX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_multisample(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_multisample - if ((GLeeFuncPtr_glSampleMaskEXT = (GLEEPFNGLSAMPLEMASKEXTPROC) __GLeeGetProcAddress("glSampleMaskEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSamplePatternEXT = (GLEEPFNGLSAMPLEPATTERNEXTPROC) __GLeeGetProcAddress("glSamplePatternEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_vertex_preclip(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_convolution_accuracy(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_resample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_point_line_texgen(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIS_texture_color_mask(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIS_texture_color_mask - if ((GLeeFuncPtr_glTextureColorMaskSGIS = (GLEEPFNGLTEXTURECOLORMASKSGISPROC) __GLeeGetProcAddress("glTextureColorMaskSGIS"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_env_dot3(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ATI_texture_mirror_once(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_fence(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_fence - if ((GLeeFuncPtr_glDeleteFencesNV = (GLEEPFNGLDELETEFENCESNVPROC) __GLeeGetProcAddress("glDeleteFencesNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenFencesNV = (GLEEPFNGLGENFENCESNVPROC) __GLeeGetProcAddress("glGenFencesNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsFenceNV = (GLEEPFNGLISFENCENVPROC) __GLeeGetProcAddress("glIsFenceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTestFenceNV = (GLEEPFNGLTESTFENCENVPROC) __GLeeGetProcAddress("glTestFenceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFenceivNV = (GLEEPFNGLGETFENCEIVNVPROC) __GLeeGetProcAddress("glGetFenceivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glFinishFenceNV = (GLEEPFNGLFINISHFENCENVPROC) __GLeeGetProcAddress("glFinishFenceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glSetFenceNV = (GLEEPFNGLSETFENCENVPROC) __GLeeGetProcAddress("glSetFenceNV"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_IBM_texture_mirrored_repeat(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_evaluators(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_evaluators - if ((GLeeFuncPtr_glMapControlPointsNV = (GLEEPFNGLMAPCONTROLPOINTSNVPROC) __GLeeGetProcAddress("glMapControlPointsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMapParameterivNV = (GLEEPFNGLMAPPARAMETERIVNVPROC) __GLeeGetProcAddress("glMapParameterivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMapParameterfvNV = (GLEEPFNGLMAPPARAMETERFVNVPROC) __GLeeGetProcAddress("glMapParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMapControlPointsNV = (GLEEPFNGLGETMAPCONTROLPOINTSNVPROC) __GLeeGetProcAddress("glGetMapControlPointsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMapParameterivNV = (GLEEPFNGLGETMAPPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetMapParameterivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMapParameterfvNV = (GLEEPFNGLGETMAPPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetMapParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMapAttribParameterivNV = (GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetMapAttribParameterivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMapAttribParameterfvNV = (GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetMapAttribParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glEvalMapsNV = (GLEEPFNGLEVALMAPSNVPROC) __GLeeGetProcAddress("glEvalMapsNV"))!=0) nLinked++; -#endif - if (nLinked==9) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_packed_depth_stencil(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_register_combiners2(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_register_combiners2 - if ((GLeeFuncPtr_glCombinerStageParameterfvNV = (GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC) __GLeeGetProcAddress("glCombinerStageParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCombinerStageParameterfvNV = (GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerStageParameterfvNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_texture_compression_vtc(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_texture_rectangle(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_texture_shader(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_texture_shader2(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_array_range2(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_program(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_vertex_program - if ((GLeeFuncPtr_glAreProgramsResidentNV = (GLEEPFNGLAREPROGRAMSRESIDENTNVPROC) __GLeeGetProcAddress("glAreProgramsResidentNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindProgramNV = (GLEEPFNGLBINDPROGRAMNVPROC) __GLeeGetProcAddress("glBindProgramNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteProgramsNV = (GLEEPFNGLDELETEPROGRAMSNVPROC) __GLeeGetProcAddress("glDeleteProgramsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glExecuteProgramNV = (GLEEPFNGLEXECUTEPROGRAMNVPROC) __GLeeGetProcAddress("glExecuteProgramNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenProgramsNV = (GLEEPFNGLGENPROGRAMSNVPROC) __GLeeGetProcAddress("glGenProgramsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramParameterdvNV = (GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC) __GLeeGetProcAddress("glGetProgramParameterdvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramParameterfvNV = (GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetProgramParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramivNV = (GLEEPFNGLGETPROGRAMIVNVPROC) __GLeeGetProcAddress("glGetProgramivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramStringNV = (GLEEPFNGLGETPROGRAMSTRINGNVPROC) __GLeeGetProcAddress("glGetProgramStringNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTrackMatrixivNV = (GLEEPFNGLGETTRACKMATRIXIVNVPROC) __GLeeGetProcAddress("glGetTrackMatrixivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribdvNV = (GLEEPFNGLGETVERTEXATTRIBDVNVPROC) __GLeeGetProcAddress("glGetVertexAttribdvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribfvNV = (GLEEPFNGLGETVERTEXATTRIBFVNVPROC) __GLeeGetProcAddress("glGetVertexAttribfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribivNV = (GLEEPFNGLGETVERTEXATTRIBIVNVPROC) __GLeeGetProcAddress("glGetVertexAttribivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribPointervNV = (GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC) __GLeeGetProcAddress("glGetVertexAttribPointervNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsProgramNV = (GLEEPFNGLISPROGRAMNVPROC) __GLeeGetProcAddress("glIsProgramNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glLoadProgramNV = (GLEEPFNGLLOADPROGRAMNVPROC) __GLeeGetProcAddress("glLoadProgramNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramParameter4dNV = (GLEEPFNGLPROGRAMPARAMETER4DNVPROC) __GLeeGetProcAddress("glProgramParameter4dNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramParameter4dvNV = (GLEEPFNGLPROGRAMPARAMETER4DVNVPROC) __GLeeGetProcAddress("glProgramParameter4dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramParameter4fNV = (GLEEPFNGLPROGRAMPARAMETER4FNVPROC) __GLeeGetProcAddress("glProgramParameter4fNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramParameter4fvNV = (GLEEPFNGLPROGRAMPARAMETER4FVNVPROC) __GLeeGetProcAddress("glProgramParameter4fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramParameters4dvNV = (GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC) __GLeeGetProcAddress("glProgramParameters4dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramParameters4fvNV = (GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC) __GLeeGetProcAddress("glProgramParameters4fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glRequestResidentProgramsNV = (GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC) __GLeeGetProcAddress("glRequestResidentProgramsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTrackMatrixNV = (GLEEPFNGLTRACKMATRIXNVPROC) __GLeeGetProcAddress("glTrackMatrixNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribPointerNV = (GLEEPFNGLVERTEXATTRIBPOINTERNVPROC) __GLeeGetProcAddress("glVertexAttribPointerNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1dNV = (GLEEPFNGLVERTEXATTRIB1DNVPROC) __GLeeGetProcAddress("glVertexAttrib1dNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1dvNV = (GLEEPFNGLVERTEXATTRIB1DVNVPROC) __GLeeGetProcAddress("glVertexAttrib1dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1fNV = (GLEEPFNGLVERTEXATTRIB1FNVPROC) __GLeeGetProcAddress("glVertexAttrib1fNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1fvNV = (GLEEPFNGLVERTEXATTRIB1FVNVPROC) __GLeeGetProcAddress("glVertexAttrib1fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1sNV = (GLEEPFNGLVERTEXATTRIB1SNVPROC) __GLeeGetProcAddress("glVertexAttrib1sNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1svNV = (GLEEPFNGLVERTEXATTRIB1SVNVPROC) __GLeeGetProcAddress("glVertexAttrib1svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2dNV = (GLEEPFNGLVERTEXATTRIB2DNVPROC) __GLeeGetProcAddress("glVertexAttrib2dNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2dvNV = (GLEEPFNGLVERTEXATTRIB2DVNVPROC) __GLeeGetProcAddress("glVertexAttrib2dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2fNV = (GLEEPFNGLVERTEXATTRIB2FNVPROC) __GLeeGetProcAddress("glVertexAttrib2fNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2fvNV = (GLEEPFNGLVERTEXATTRIB2FVNVPROC) __GLeeGetProcAddress("glVertexAttrib2fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2sNV = (GLEEPFNGLVERTEXATTRIB2SNVPROC) __GLeeGetProcAddress("glVertexAttrib2sNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2svNV = (GLEEPFNGLVERTEXATTRIB2SVNVPROC) __GLeeGetProcAddress("glVertexAttrib2svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3dNV = (GLEEPFNGLVERTEXATTRIB3DNVPROC) __GLeeGetProcAddress("glVertexAttrib3dNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3dvNV = (GLEEPFNGLVERTEXATTRIB3DVNVPROC) __GLeeGetProcAddress("glVertexAttrib3dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3fNV = (GLEEPFNGLVERTEXATTRIB3FNVPROC) __GLeeGetProcAddress("glVertexAttrib3fNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3fvNV = (GLEEPFNGLVERTEXATTRIB3FVNVPROC) __GLeeGetProcAddress("glVertexAttrib3fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3sNV = (GLEEPFNGLVERTEXATTRIB3SNVPROC) __GLeeGetProcAddress("glVertexAttrib3sNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3svNV = (GLEEPFNGLVERTEXATTRIB3SVNVPROC) __GLeeGetProcAddress("glVertexAttrib3svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4dNV = (GLEEPFNGLVERTEXATTRIB4DNVPROC) __GLeeGetProcAddress("glVertexAttrib4dNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4dvNV = (GLEEPFNGLVERTEXATTRIB4DVNVPROC) __GLeeGetProcAddress("glVertexAttrib4dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4fNV = (GLEEPFNGLVERTEXATTRIB4FNVPROC) __GLeeGetProcAddress("glVertexAttrib4fNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4fvNV = (GLEEPFNGLVERTEXATTRIB4FVNVPROC) __GLeeGetProcAddress("glVertexAttrib4fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4sNV = (GLEEPFNGLVERTEXATTRIB4SNVPROC) __GLeeGetProcAddress("glVertexAttrib4sNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4svNV = (GLEEPFNGLVERTEXATTRIB4SVNVPROC) __GLeeGetProcAddress("glVertexAttrib4svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4ubNV = (GLEEPFNGLVERTEXATTRIB4UBNVPROC) __GLeeGetProcAddress("glVertexAttrib4ubNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4ubvNV = (GLEEPFNGLVERTEXATTRIB4UBVNVPROC) __GLeeGetProcAddress("glVertexAttrib4ubvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs1dvNV = (GLEEPFNGLVERTEXATTRIBS1DVNVPROC) __GLeeGetProcAddress("glVertexAttribs1dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs1fvNV = (GLEEPFNGLVERTEXATTRIBS1FVNVPROC) __GLeeGetProcAddress("glVertexAttribs1fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs1svNV = (GLEEPFNGLVERTEXATTRIBS1SVNVPROC) __GLeeGetProcAddress("glVertexAttribs1svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs2dvNV = (GLEEPFNGLVERTEXATTRIBS2DVNVPROC) __GLeeGetProcAddress("glVertexAttribs2dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs2fvNV = (GLEEPFNGLVERTEXATTRIBS2FVNVPROC) __GLeeGetProcAddress("glVertexAttribs2fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs2svNV = (GLEEPFNGLVERTEXATTRIBS2SVNVPROC) __GLeeGetProcAddress("glVertexAttribs2svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs3dvNV = (GLEEPFNGLVERTEXATTRIBS3DVNVPROC) __GLeeGetProcAddress("glVertexAttribs3dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs3fvNV = (GLEEPFNGLVERTEXATTRIBS3FVNVPROC) __GLeeGetProcAddress("glVertexAttribs3fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs3svNV = (GLEEPFNGLVERTEXATTRIBS3SVNVPROC) __GLeeGetProcAddress("glVertexAttribs3svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs4dvNV = (GLEEPFNGLVERTEXATTRIBS4DVNVPROC) __GLeeGetProcAddress("glVertexAttribs4dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs4fvNV = (GLEEPFNGLVERTEXATTRIBS4FVNVPROC) __GLeeGetProcAddress("glVertexAttribs4fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs4svNV = (GLEEPFNGLVERTEXATTRIBS4SVNVPROC) __GLeeGetProcAddress("glVertexAttribs4svNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs4ubvNV = (GLEEPFNGLVERTEXATTRIBS4UBVNVPROC) __GLeeGetProcAddress("glVertexAttribs4ubvNV"))!=0) nLinked++; -#endif - if (nLinked==64) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_texture_coordinate_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_scalebias_hint(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_OML_interlace(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_OML_subsample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_OML_resample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_copy_depth_to_color(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ATI_envmap_bumpmap(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_envmap_bumpmap - if ((GLeeFuncPtr_glTexBumpParameterivATI = (GLEEPFNGLTEXBUMPPARAMETERIVATIPROC) __GLeeGetProcAddress("glTexBumpParameterivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexBumpParameterfvATI = (GLEEPFNGLTEXBUMPPARAMETERFVATIPROC) __GLeeGetProcAddress("glTexBumpParameterfvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTexBumpParameterivATI = (GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC) __GLeeGetProcAddress("glGetTexBumpParameterivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTexBumpParameterfvATI = (GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC) __GLeeGetProcAddress("glGetTexBumpParameterfvATI"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_fragment_shader(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_fragment_shader - if ((GLeeFuncPtr_glGenFragmentShadersATI = (GLEEPFNGLGENFRAGMENTSHADERSATIPROC) __GLeeGetProcAddress("glGenFragmentShadersATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindFragmentShaderATI = (GLEEPFNGLBINDFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glBindFragmentShaderATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteFragmentShaderATI = (GLEEPFNGLDELETEFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glDeleteFragmentShaderATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glBeginFragmentShaderATI = (GLEEPFNGLBEGINFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glBeginFragmentShaderATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndFragmentShaderATI = (GLEEPFNGLENDFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glEndFragmentShaderATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glPassTexCoordATI = (GLEEPFNGLPASSTEXCOORDATIPROC) __GLeeGetProcAddress("glPassTexCoordATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glSampleMapATI = (GLEEPFNGLSAMPLEMAPATIPROC) __GLeeGetProcAddress("glSampleMapATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorFragmentOp1ATI = (GLEEPFNGLCOLORFRAGMENTOP1ATIPROC) __GLeeGetProcAddress("glColorFragmentOp1ATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorFragmentOp2ATI = (GLEEPFNGLCOLORFRAGMENTOP2ATIPROC) __GLeeGetProcAddress("glColorFragmentOp2ATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glColorFragmentOp3ATI = (GLEEPFNGLCOLORFRAGMENTOP3ATIPROC) __GLeeGetProcAddress("glColorFragmentOp3ATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glAlphaFragmentOp1ATI = (GLEEPFNGLALPHAFRAGMENTOP1ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp1ATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glAlphaFragmentOp2ATI = (GLEEPFNGLALPHAFRAGMENTOP2ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp2ATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glAlphaFragmentOp3ATI = (GLEEPFNGLALPHAFRAGMENTOP3ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp3ATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glSetFragmentShaderConstantATI = (GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC) __GLeeGetProcAddress("glSetFragmentShaderConstantATI"))!=0) nLinked++; -#endif - if (nLinked==14) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_pn_triangles(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_pn_triangles - if ((GLeeFuncPtr_glPNTrianglesiATI = (GLEEPFNGLPNTRIANGLESIATIPROC) __GLeeGetProcAddress("glPNTrianglesiATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glPNTrianglesfATI = (GLEEPFNGLPNTRIANGLESFATIPROC) __GLeeGetProcAddress("glPNTrianglesfATI"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_vertex_array_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_vertex_array_object - if ((GLeeFuncPtr_glNewObjectBufferATI = (GLEEPFNGLNEWOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glNewObjectBufferATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsObjectBufferATI = (GLEEPFNGLISOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glIsObjectBufferATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glUpdateObjectBufferATI = (GLEEPFNGLUPDATEOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glUpdateObjectBufferATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetObjectBufferfvATI = (GLEEPFNGLGETOBJECTBUFFERFVATIPROC) __GLeeGetProcAddress("glGetObjectBufferfvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetObjectBufferivATI = (GLEEPFNGLGETOBJECTBUFFERIVATIPROC) __GLeeGetProcAddress("glGetObjectBufferivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glFreeObjectBufferATI = (GLEEPFNGLFREEOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glFreeObjectBufferATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glArrayObjectATI = (GLEEPFNGLARRAYOBJECTATIPROC) __GLeeGetProcAddress("glArrayObjectATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetArrayObjectfvATI = (GLEEPFNGLGETARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetArrayObjectfvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetArrayObjectivATI = (GLEEPFNGLGETARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetArrayObjectivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantArrayObjectATI = (GLEEPFNGLVARIANTARRAYOBJECTATIPROC) __GLeeGetProcAddress("glVariantArrayObjectATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVariantArrayObjectfvATI = (GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetVariantArrayObjectfvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVariantArrayObjectivATI = (GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetVariantArrayObjectivATI"))!=0) nLinked++; -#endif - if (nLinked==12) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_vertex_shader(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_vertex_shader - if ((GLeeFuncPtr_glBeginVertexShaderEXT = (GLEEPFNGLBEGINVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glBeginVertexShaderEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndVertexShaderEXT = (GLEEPFNGLENDVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glEndVertexShaderEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindVertexShaderEXT = (GLEEPFNGLBINDVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glBindVertexShaderEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenVertexShadersEXT = (GLEEPFNGLGENVERTEXSHADERSEXTPROC) __GLeeGetProcAddress("glGenVertexShadersEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteVertexShaderEXT = (GLEEPFNGLDELETEVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glDeleteVertexShaderEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glShaderOp1EXT = (GLEEPFNGLSHADEROP1EXTPROC) __GLeeGetProcAddress("glShaderOp1EXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glShaderOp2EXT = (GLEEPFNGLSHADEROP2EXTPROC) __GLeeGetProcAddress("glShaderOp2EXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glShaderOp3EXT = (GLEEPFNGLSHADEROP3EXTPROC) __GLeeGetProcAddress("glShaderOp3EXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSwizzleEXT = (GLEEPFNGLSWIZZLEEXTPROC) __GLeeGetProcAddress("glSwizzleEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glWriteMaskEXT = (GLEEPFNGLWRITEMASKEXTPROC) __GLeeGetProcAddress("glWriteMaskEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glInsertComponentEXT = (GLEEPFNGLINSERTCOMPONENTEXTPROC) __GLeeGetProcAddress("glInsertComponentEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glExtractComponentEXT = (GLEEPFNGLEXTRACTCOMPONENTEXTPROC) __GLeeGetProcAddress("glExtractComponentEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenSymbolsEXT = (GLEEPFNGLGENSYMBOLSEXTPROC) __GLeeGetProcAddress("glGenSymbolsEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSetInvariantEXT = (GLEEPFNGLSETINVARIANTEXTPROC) __GLeeGetProcAddress("glSetInvariantEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glSetLocalConstantEXT = (GLEEPFNGLSETLOCALCONSTANTEXTPROC) __GLeeGetProcAddress("glSetLocalConstantEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantbvEXT = (GLEEPFNGLVARIANTBVEXTPROC) __GLeeGetProcAddress("glVariantbvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantsvEXT = (GLEEPFNGLVARIANTSVEXTPROC) __GLeeGetProcAddress("glVariantsvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantivEXT = (GLEEPFNGLVARIANTIVEXTPROC) __GLeeGetProcAddress("glVariantivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantfvEXT = (GLEEPFNGLVARIANTFVEXTPROC) __GLeeGetProcAddress("glVariantfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantdvEXT = (GLEEPFNGLVARIANTDVEXTPROC) __GLeeGetProcAddress("glVariantdvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantubvEXT = (GLEEPFNGLVARIANTUBVEXTPROC) __GLeeGetProcAddress("glVariantubvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantusvEXT = (GLEEPFNGLVARIANTUSVEXTPROC) __GLeeGetProcAddress("glVariantusvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantuivEXT = (GLEEPFNGLVARIANTUIVEXTPROC) __GLeeGetProcAddress("glVariantuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVariantPointerEXT = (GLEEPFNGLVARIANTPOINTEREXTPROC) __GLeeGetProcAddress("glVariantPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEnableVariantClientStateEXT = (GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC) __GLeeGetProcAddress("glEnableVariantClientStateEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDisableVariantClientStateEXT = (GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) __GLeeGetProcAddress("glDisableVariantClientStateEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindLightParameterEXT = (GLEEPFNGLBINDLIGHTPARAMETEREXTPROC) __GLeeGetProcAddress("glBindLightParameterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindMaterialParameterEXT = (GLEEPFNGLBINDMATERIALPARAMETEREXTPROC) __GLeeGetProcAddress("glBindMaterialParameterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindTexGenParameterEXT = (GLEEPFNGLBINDTEXGENPARAMETEREXTPROC) __GLeeGetProcAddress("glBindTexGenParameterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindTextureUnitParameterEXT = (GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC) __GLeeGetProcAddress("glBindTextureUnitParameterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindParameterEXT = (GLEEPFNGLBINDPARAMETEREXTPROC) __GLeeGetProcAddress("glBindParameterEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsVariantEnabledEXT = (GLEEPFNGLISVARIANTENABLEDEXTPROC) __GLeeGetProcAddress("glIsVariantEnabledEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVariantBooleanvEXT = (GLEEPFNGLGETVARIANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetVariantBooleanvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVariantIntegervEXT = (GLEEPFNGLGETVARIANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetVariantIntegervEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVariantFloatvEXT = (GLEEPFNGLGETVARIANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetVariantFloatvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVariantPointervEXT = (GLEEPFNGLGETVARIANTPOINTERVEXTPROC) __GLeeGetProcAddress("glGetVariantPointervEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetInvariantBooleanvEXT = (GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetInvariantBooleanvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetInvariantIntegervEXT = (GLEEPFNGLGETINVARIANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetInvariantIntegervEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetInvariantFloatvEXT = (GLEEPFNGLGETINVARIANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetInvariantFloatvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetLocalConstantBooleanvEXT = (GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantBooleanvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetLocalConstantIntegervEXT = (GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantIntegervEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetLocalConstantFloatvEXT = (GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantFloatvEXT"))!=0) nLinked++; -#endif - if (nLinked==42) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_vertex_streams(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_vertex_streams - if ((GLeeFuncPtr_glVertexStream1sATI = (GLEEPFNGLVERTEXSTREAM1SATIPROC) __GLeeGetProcAddress("glVertexStream1sATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1svATI = (GLEEPFNGLVERTEXSTREAM1SVATIPROC) __GLeeGetProcAddress("glVertexStream1svATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1iATI = (GLEEPFNGLVERTEXSTREAM1IATIPROC) __GLeeGetProcAddress("glVertexStream1iATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1ivATI = (GLEEPFNGLVERTEXSTREAM1IVATIPROC) __GLeeGetProcAddress("glVertexStream1ivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1fATI = (GLEEPFNGLVERTEXSTREAM1FATIPROC) __GLeeGetProcAddress("glVertexStream1fATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1fvATI = (GLEEPFNGLVERTEXSTREAM1FVATIPROC) __GLeeGetProcAddress("glVertexStream1fvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1dATI = (GLEEPFNGLVERTEXSTREAM1DATIPROC) __GLeeGetProcAddress("glVertexStream1dATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream1dvATI = (GLEEPFNGLVERTEXSTREAM1DVATIPROC) __GLeeGetProcAddress("glVertexStream1dvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2sATI = (GLEEPFNGLVERTEXSTREAM2SATIPROC) __GLeeGetProcAddress("glVertexStream2sATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2svATI = (GLEEPFNGLVERTEXSTREAM2SVATIPROC) __GLeeGetProcAddress("glVertexStream2svATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2iATI = (GLEEPFNGLVERTEXSTREAM2IATIPROC) __GLeeGetProcAddress("glVertexStream2iATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2ivATI = (GLEEPFNGLVERTEXSTREAM2IVATIPROC) __GLeeGetProcAddress("glVertexStream2ivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2fATI = (GLEEPFNGLVERTEXSTREAM2FATIPROC) __GLeeGetProcAddress("glVertexStream2fATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2fvATI = (GLEEPFNGLVERTEXSTREAM2FVATIPROC) __GLeeGetProcAddress("glVertexStream2fvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2dATI = (GLEEPFNGLVERTEXSTREAM2DATIPROC) __GLeeGetProcAddress("glVertexStream2dATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream2dvATI = (GLEEPFNGLVERTEXSTREAM2DVATIPROC) __GLeeGetProcAddress("glVertexStream2dvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3sATI = (GLEEPFNGLVERTEXSTREAM3SATIPROC) __GLeeGetProcAddress("glVertexStream3sATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3svATI = (GLEEPFNGLVERTEXSTREAM3SVATIPROC) __GLeeGetProcAddress("glVertexStream3svATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3iATI = (GLEEPFNGLVERTEXSTREAM3IATIPROC) __GLeeGetProcAddress("glVertexStream3iATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3ivATI = (GLEEPFNGLVERTEXSTREAM3IVATIPROC) __GLeeGetProcAddress("glVertexStream3ivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3fATI = (GLEEPFNGLVERTEXSTREAM3FATIPROC) __GLeeGetProcAddress("glVertexStream3fATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3fvATI = (GLEEPFNGLVERTEXSTREAM3FVATIPROC) __GLeeGetProcAddress("glVertexStream3fvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3dATI = (GLEEPFNGLVERTEXSTREAM3DATIPROC) __GLeeGetProcAddress("glVertexStream3dATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream3dvATI = (GLEEPFNGLVERTEXSTREAM3DVATIPROC) __GLeeGetProcAddress("glVertexStream3dvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4sATI = (GLEEPFNGLVERTEXSTREAM4SATIPROC) __GLeeGetProcAddress("glVertexStream4sATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4svATI = (GLEEPFNGLVERTEXSTREAM4SVATIPROC) __GLeeGetProcAddress("glVertexStream4svATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4iATI = (GLEEPFNGLVERTEXSTREAM4IATIPROC) __GLeeGetProcAddress("glVertexStream4iATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4ivATI = (GLEEPFNGLVERTEXSTREAM4IVATIPROC) __GLeeGetProcAddress("glVertexStream4ivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4fATI = (GLEEPFNGLVERTEXSTREAM4FATIPROC) __GLeeGetProcAddress("glVertexStream4fATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4fvATI = (GLEEPFNGLVERTEXSTREAM4FVATIPROC) __GLeeGetProcAddress("glVertexStream4fvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4dATI = (GLEEPFNGLVERTEXSTREAM4DATIPROC) __GLeeGetProcAddress("glVertexStream4dATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexStream4dvATI = (GLEEPFNGLVERTEXSTREAM4DVATIPROC) __GLeeGetProcAddress("glVertexStream4dvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3bATI = (GLEEPFNGLNORMALSTREAM3BATIPROC) __GLeeGetProcAddress("glNormalStream3bATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3bvATI = (GLEEPFNGLNORMALSTREAM3BVATIPROC) __GLeeGetProcAddress("glNormalStream3bvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3sATI = (GLEEPFNGLNORMALSTREAM3SATIPROC) __GLeeGetProcAddress("glNormalStream3sATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3svATI = (GLEEPFNGLNORMALSTREAM3SVATIPROC) __GLeeGetProcAddress("glNormalStream3svATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3iATI = (GLEEPFNGLNORMALSTREAM3IATIPROC) __GLeeGetProcAddress("glNormalStream3iATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3ivATI = (GLEEPFNGLNORMALSTREAM3IVATIPROC) __GLeeGetProcAddress("glNormalStream3ivATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3fATI = (GLEEPFNGLNORMALSTREAM3FATIPROC) __GLeeGetProcAddress("glNormalStream3fATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3fvATI = (GLEEPFNGLNORMALSTREAM3FVATIPROC) __GLeeGetProcAddress("glNormalStream3fvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3dATI = (GLEEPFNGLNORMALSTREAM3DATIPROC) __GLeeGetProcAddress("glNormalStream3dATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormalStream3dvATI = (GLEEPFNGLNORMALSTREAM3DVATIPROC) __GLeeGetProcAddress("glNormalStream3dvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glClientActiveVertexStreamATI = (GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) __GLeeGetProcAddress("glClientActiveVertexStreamATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexBlendEnviATI = (GLEEPFNGLVERTEXBLENDENVIATIPROC) __GLeeGetProcAddress("glVertexBlendEnviATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexBlendEnvfATI = (GLEEPFNGLVERTEXBLENDENVFATIPROC) __GLeeGetProcAddress("glVertexBlendEnvfATI"))!=0) nLinked++; -#endif - if (nLinked==45) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_element_array(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_element_array - if ((GLeeFuncPtr_glElementPointerATI = (GLEEPFNGLELEMENTPOINTERATIPROC) __GLeeGetProcAddress("glElementPointerATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawElementArrayATI = (GLEEPFNGLDRAWELEMENTARRAYATIPROC) __GLeeGetProcAddress("glDrawElementArrayATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawRangeElementArrayATI = (GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC) __GLeeGetProcAddress("glDrawRangeElementArrayATI"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SUN_mesh_array(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SUN_mesh_array - if ((GLeeFuncPtr_glDrawMeshArraysSUN = (GLEEPFNGLDRAWMESHARRAYSSUNPROC) __GLeeGetProcAddress("glDrawMeshArraysSUN"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SUN_slice_accum(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_multisample_filter_hint(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_depth_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_occlusion_query(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_occlusion_query - if ((GLeeFuncPtr_glGenOcclusionQueriesNV = (GLEEPFNGLGENOCCLUSIONQUERIESNVPROC) __GLeeGetProcAddress("glGenOcclusionQueriesNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteOcclusionQueriesNV = (GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC) __GLeeGetProcAddress("glDeleteOcclusionQueriesNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsOcclusionQueryNV = (GLEEPFNGLISOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glIsOcclusionQueryNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glBeginOcclusionQueryNV = (GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glBeginOcclusionQueryNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndOcclusionQueryNV = (GLEEPFNGLENDOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glEndOcclusionQueryNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetOcclusionQueryivNV = (GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC) __GLeeGetProcAddress("glGetOcclusionQueryivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetOcclusionQueryuivNV = (GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC) __GLeeGetProcAddress("glGetOcclusionQueryuivNV"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_point_sprite(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_point_sprite - if ((GLeeFuncPtr_glPointParameteriNV = (GLEEPFNGLPOINTPARAMETERINVPROC) __GLeeGetProcAddress("glPointParameteriNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glPointParameterivNV = (GLEEPFNGLPOINTPARAMETERIVNVPROC) __GLeeGetProcAddress("glPointParameterivNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_texture_shader3(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_program1_1(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_shadow_funcs(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_stencil_two_side(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_stencil_two_side - if ((GLeeFuncPtr_glActiveStencilFaceEXT = (GLEEPFNGLACTIVESTENCILFACEEXTPROC) __GLeeGetProcAddress("glActiveStencilFaceEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_text_fragment_shader(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_APPLE_client_storage(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_APPLE_element_array(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_APPLE_element_array - if ((GLeeFuncPtr_glElementPointerAPPLE = (GLEEPFNGLELEMENTPOINTERAPPLEPROC) __GLeeGetProcAddress("glElementPointerAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawElementArrayAPPLE = (GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glDrawElementArrayAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawRangeElementArrayAPPLE = (GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glDrawRangeElementArrayAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiDrawElementArrayAPPLE = (GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glMultiDrawElementArrayAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE = (GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glMultiDrawRangeElementArrayAPPLE"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_APPLE_fence(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_APPLE_fence - if ((GLeeFuncPtr_glGenFencesAPPLE = (GLEEPFNGLGENFENCESAPPLEPROC) __GLeeGetProcAddress("glGenFencesAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteFencesAPPLE = (GLEEPFNGLDELETEFENCESAPPLEPROC) __GLeeGetProcAddress("glDeleteFencesAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glSetFenceAPPLE = (GLEEPFNGLSETFENCEAPPLEPROC) __GLeeGetProcAddress("glSetFenceAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsFenceAPPLE = (GLEEPFNGLISFENCEAPPLEPROC) __GLeeGetProcAddress("glIsFenceAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glTestFenceAPPLE = (GLEEPFNGLTESTFENCEAPPLEPROC) __GLeeGetProcAddress("glTestFenceAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glFinishFenceAPPLE = (GLEEPFNGLFINISHFENCEAPPLEPROC) __GLeeGetProcAddress("glFinishFenceAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glTestObjectAPPLE = (GLEEPFNGLTESTOBJECTAPPLEPROC) __GLeeGetProcAddress("glTestObjectAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glFinishObjectAPPLE = (GLEEPFNGLFINISHOBJECTAPPLEPROC) __GLeeGetProcAddress("glFinishObjectAPPLE"))!=0) nLinked++; -#endif - if (nLinked==8) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_APPLE_vertex_array_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_APPLE_vertex_array_object - if ((GLeeFuncPtr_glBindVertexArrayAPPLE = (GLEEPFNGLBINDVERTEXARRAYAPPLEPROC) __GLeeGetProcAddress("glBindVertexArrayAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteVertexArraysAPPLE = (GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC) __GLeeGetProcAddress("glDeleteVertexArraysAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenVertexArraysAPPLE = (GLEEPFNGLGENVERTEXARRAYSAPPLEPROC) __GLeeGetProcAddress("glGenVertexArraysAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsVertexArrayAPPLE = (GLEEPFNGLISVERTEXARRAYAPPLEPROC) __GLeeGetProcAddress("glIsVertexArrayAPPLE"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_APPLE_vertex_array_range(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_APPLE_vertex_array_range - if ((GLeeFuncPtr_glVertexArrayRangeAPPLE = (GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC) __GLeeGetProcAddress("glVertexArrayRangeAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glFlushVertexArrayRangeAPPLE = (GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) __GLeeGetProcAddress("glFlushVertexArrayRangeAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexArrayParameteriAPPLE = (GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC) __GLeeGetProcAddress("glVertexArrayParameteriAPPLE"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_APPLE_ycbcr_422(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_S3_s3tc(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ATI_draw_buffers(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_draw_buffers - if ((GLeeFuncPtr_glDrawBuffersATI = (GLEEPFNGLDRAWBUFFERSATIPROC) __GLeeGetProcAddress("glDrawBuffersATI"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_pixel_format_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ATI_texture_env_combine3(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ATI_texture_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_fragment_program(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_fragment_program - if ((GLeeFuncPtr_glProgramNamedParameter4fNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4fNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramNamedParameter4dNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4dNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramNamedParameter4fvNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4fvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramNamedParameter4dvNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4dvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramNamedParameterfvNV = (GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetProgramNamedParameterfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramNamedParameterdvNV = (GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) __GLeeGetProcAddress("glGetProgramNamedParameterdvNV"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_half_float(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_half_float - if ((GLeeFuncPtr_glVertex2hNV = (GLEEPFNGLVERTEX2HNVPROC) __GLeeGetProcAddress("glVertex2hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertex2hvNV = (GLEEPFNGLVERTEX2HVNVPROC) __GLeeGetProcAddress("glVertex2hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertex3hNV = (GLEEPFNGLVERTEX3HNVPROC) __GLeeGetProcAddress("glVertex3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertex3hvNV = (GLEEPFNGLVERTEX3HVNVPROC) __GLeeGetProcAddress("glVertex3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertex4hNV = (GLEEPFNGLVERTEX4HNVPROC) __GLeeGetProcAddress("glVertex4hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertex4hvNV = (GLEEPFNGLVERTEX4HVNVPROC) __GLeeGetProcAddress("glVertex4hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormal3hNV = (GLEEPFNGLNORMAL3HNVPROC) __GLeeGetProcAddress("glNormal3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glNormal3hvNV = (GLEEPFNGLNORMAL3HVNVPROC) __GLeeGetProcAddress("glNormal3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor3hNV = (GLEEPFNGLCOLOR3HNVPROC) __GLeeGetProcAddress("glColor3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor3hvNV = (GLEEPFNGLCOLOR3HVNVPROC) __GLeeGetProcAddress("glColor3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4hNV = (GLEEPFNGLCOLOR4HNVPROC) __GLeeGetProcAddress("glColor4hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glColor4hvNV = (GLEEPFNGLCOLOR4HVNVPROC) __GLeeGetProcAddress("glColor4hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord1hNV = (GLEEPFNGLTEXCOORD1HNVPROC) __GLeeGetProcAddress("glTexCoord1hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord1hvNV = (GLEEPFNGLTEXCOORD1HVNVPROC) __GLeeGetProcAddress("glTexCoord1hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2hNV = (GLEEPFNGLTEXCOORD2HNVPROC) __GLeeGetProcAddress("glTexCoord2hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord2hvNV = (GLEEPFNGLTEXCOORD2HVNVPROC) __GLeeGetProcAddress("glTexCoord2hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord3hNV = (GLEEPFNGLTEXCOORD3HNVPROC) __GLeeGetProcAddress("glTexCoord3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord3hvNV = (GLEEPFNGLTEXCOORD3HVNVPROC) __GLeeGetProcAddress("glTexCoord3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord4hNV = (GLEEPFNGLTEXCOORD4HNVPROC) __GLeeGetProcAddress("glTexCoord4hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexCoord4hvNV = (GLEEPFNGLTEXCOORD4HVNVPROC) __GLeeGetProcAddress("glTexCoord4hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1hNV = (GLEEPFNGLMULTITEXCOORD1HNVPROC) __GLeeGetProcAddress("glMultiTexCoord1hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord1hvNV = (GLEEPFNGLMULTITEXCOORD1HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord1hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2hNV = (GLEEPFNGLMULTITEXCOORD2HNVPROC) __GLeeGetProcAddress("glMultiTexCoord2hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord2hvNV = (GLEEPFNGLMULTITEXCOORD2HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord2hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3hNV = (GLEEPFNGLMULTITEXCOORD3HNVPROC) __GLeeGetProcAddress("glMultiTexCoord3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord3hvNV = (GLEEPFNGLMULTITEXCOORD3HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4hNV = (GLEEPFNGLMULTITEXCOORD4HNVPROC) __GLeeGetProcAddress("glMultiTexCoord4hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoord4hvNV = (GLEEPFNGLMULTITEXCOORD4HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord4hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordhNV = (GLEEPFNGLFOGCOORDHNVPROC) __GLeeGetProcAddress("glFogCoordhNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glFogCoordhvNV = (GLEEPFNGLFOGCOORDHVNVPROC) __GLeeGetProcAddress("glFogCoordhvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3hNV = (GLEEPFNGLSECONDARYCOLOR3HNVPROC) __GLeeGetProcAddress("glSecondaryColor3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glSecondaryColor3hvNV = (GLEEPFNGLSECONDARYCOLOR3HVNVPROC) __GLeeGetProcAddress("glSecondaryColor3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexWeighthNV = (GLEEPFNGLVERTEXWEIGHTHNVPROC) __GLeeGetProcAddress("glVertexWeighthNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexWeighthvNV = (GLEEPFNGLVERTEXWEIGHTHVNVPROC) __GLeeGetProcAddress("glVertexWeighthvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1hNV = (GLEEPFNGLVERTEXATTRIB1HNVPROC) __GLeeGetProcAddress("glVertexAttrib1hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib1hvNV = (GLEEPFNGLVERTEXATTRIB1HVNVPROC) __GLeeGetProcAddress("glVertexAttrib1hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2hNV = (GLEEPFNGLVERTEXATTRIB2HNVPROC) __GLeeGetProcAddress("glVertexAttrib2hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib2hvNV = (GLEEPFNGLVERTEXATTRIB2HVNVPROC) __GLeeGetProcAddress("glVertexAttrib2hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3hNV = (GLEEPFNGLVERTEXATTRIB3HNVPROC) __GLeeGetProcAddress("glVertexAttrib3hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib3hvNV = (GLEEPFNGLVERTEXATTRIB3HVNVPROC) __GLeeGetProcAddress("glVertexAttrib3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4hNV = (GLEEPFNGLVERTEXATTRIB4HNVPROC) __GLeeGetProcAddress("glVertexAttrib4hNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttrib4hvNV = (GLEEPFNGLVERTEXATTRIB4HVNVPROC) __GLeeGetProcAddress("glVertexAttrib4hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs1hvNV = (GLEEPFNGLVERTEXATTRIBS1HVNVPROC) __GLeeGetProcAddress("glVertexAttribs1hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs2hvNV = (GLEEPFNGLVERTEXATTRIBS2HVNVPROC) __GLeeGetProcAddress("glVertexAttribs2hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs3hvNV = (GLEEPFNGLVERTEXATTRIBS3HVNVPROC) __GLeeGetProcAddress("glVertexAttribs3hvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribs4hvNV = (GLEEPFNGLVERTEXATTRIBS4HVNVPROC) __GLeeGetProcAddress("glVertexAttribs4hvNV"))!=0) nLinked++; -#endif - if (nLinked==46) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_pixel_data_range(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_pixel_data_range - if ((GLeeFuncPtr_glPixelDataRangeNV = (GLEEPFNGLPIXELDATARANGENVPROC) __GLeeGetProcAddress("glPixelDataRangeNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glFlushPixelDataRangeNV = (GLEEPFNGLFLUSHPIXELDATARANGENVPROC) __GLeeGetProcAddress("glFlushPixelDataRangeNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_primitive_restart(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_primitive_restart - if ((GLeeFuncPtr_glPrimitiveRestartNV = (GLEEPFNGLPRIMITIVERESTARTNVPROC) __GLeeGetProcAddress("glPrimitiveRestartNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glPrimitiveRestartIndexNV = (GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC) __GLeeGetProcAddress("glPrimitiveRestartIndexNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_texture_expand_normal(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_program2(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_ATI_map_object_buffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_map_object_buffer - if ((GLeeFuncPtr_glMapObjectBufferATI = (GLEEPFNGLMAPOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glMapObjectBufferATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glUnmapObjectBufferATI = (GLEEPFNGLUNMAPOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glUnmapObjectBufferATI"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_separate_stencil(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_separate_stencil - if ((GLeeFuncPtr_glStencilOpSeparateATI = (GLEEPFNGLSTENCILOPSEPARATEATIPROC) __GLeeGetProcAddress("glStencilOpSeparateATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glStencilFuncSeparateATI = (GLEEPFNGLSTENCILFUNCSEPARATEATIPROC) __GLeeGetProcAddress("glStencilFuncSeparateATI"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_ATI_vertex_attrib_array_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_ATI_vertex_attrib_array_object - if ((GLeeFuncPtr_glVertexAttribArrayObjectATI = (GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC) __GLeeGetProcAddress("glVertexAttribArrayObjectATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI = (GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetVertexAttribArrayObjectfvATI"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribArrayObjectivATI = (GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetVertexAttribArrayObjectivATI"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_OES_read_format(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_depth_bounds_test(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_depth_bounds_test - if ((GLeeFuncPtr_glDepthBoundsEXT = (GLEEPFNGLDEPTHBOUNDSEXTPROC) __GLeeGetProcAddress("glDepthBoundsEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_mirror_clamp(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_blend_equation_separate(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_blend_equation_separate - if ((GLeeFuncPtr_glBlendEquationSeparateEXT = (GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC) __GLeeGetProcAddress("glBlendEquationSeparateEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_MESA_pack_invert(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_MESA_ycbcr_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_pixel_buffer_object(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_fragment_program_option(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_fragment_program2(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_program2_option(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_vertex_program3(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_framebuffer_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_framebuffer_object - if ((GLeeFuncPtr_glIsRenderbufferEXT = (GLEEPFNGLISRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glIsRenderbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindRenderbufferEXT = (GLEEPFNGLBINDRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glBindRenderbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteRenderbuffersEXT = (GLEEPFNGLDELETERENDERBUFFERSEXTPROC) __GLeeGetProcAddress("glDeleteRenderbuffersEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenRenderbuffersEXT = (GLEEPFNGLGENRENDERBUFFERSEXTPROC) __GLeeGetProcAddress("glGenRenderbuffersEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glRenderbufferStorageEXT = (GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC) __GLeeGetProcAddress("glRenderbufferStorageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetRenderbufferParameterivEXT = (GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetRenderbufferParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsFramebufferEXT = (GLEEPFNGLISFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glIsFramebufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindFramebufferEXT = (GLEEPFNGLBINDFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glBindFramebufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteFramebuffersEXT = (GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC) __GLeeGetProcAddress("glDeleteFramebuffersEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenFramebuffersEXT = (GLEEPFNGLGENFRAMEBUFFERSEXTPROC) __GLeeGetProcAddress("glGenFramebuffersEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCheckFramebufferStatusEXT = (GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) __GLeeGetProcAddress("glCheckFramebufferStatusEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTexture1DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTexture2DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTexture3DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferRenderbufferEXT = (GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferRenderbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT = (GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetFramebufferAttachmentParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenerateMipmapEXT = (GLEEPFNGLGENERATEMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateMipmapEXT"))!=0) nLinked++; -#endif - if (nLinked==17) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_GREMEDY_string_marker(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_GREMEDY_string_marker - if ((GLeeFuncPtr_glStringMarkerGREMEDY = (GLEEPFNGLSTRINGMARKERGREMEDYPROC) __GLeeGetProcAddress("glStringMarkerGREMEDY"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_packed_depth_stencil(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_stencil_clear_tag(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_stencil_clear_tag - if ((GLeeFuncPtr_glStencilClearTagEXT = (GLEEPFNGLSTENCILCLEARTAGEXTPROC) __GLeeGetProcAddress("glStencilClearTagEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_sRGB(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_framebuffer_blit(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_framebuffer_blit - if ((GLeeFuncPtr_glBlitFramebufferEXT = (GLEEPFNGLBLITFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glBlitFramebufferEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_framebuffer_multisample(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_framebuffer_multisample - if ((GLeeFuncPtr_glRenderbufferStorageMultisampleEXT = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisampleEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_MESAX_texture_stack(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_timer_query(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_timer_query - if ((GLeeFuncPtr_glGetQueryObjecti64vEXT = (GLEEPFNGLGETQUERYOBJECTI64VEXTPROC) __GLeeGetProcAddress("glGetQueryObjecti64vEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetQueryObjectui64vEXT = (GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC) __GLeeGetProcAddress("glGetQueryObjectui64vEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_gpu_program_parameters(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_gpu_program_parameters - if ((GLeeFuncPtr_glProgramEnvParameters4fvEXT = (GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glProgramEnvParameters4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameters4fvEXT = (GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glProgramLocalParameters4fvEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_APPLE_flush_buffer_range(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_APPLE_flush_buffer_range - if ((GLeeFuncPtr_glBufferParameteriAPPLE = (GLEEPFNGLBUFFERPARAMETERIAPPLEPROC) __GLeeGetProcAddress("glBufferParameteriAPPLE"))!=0) nLinked++; - if ((GLeeFuncPtr_glFlushMappedBufferRangeAPPLE = (GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) __GLeeGetProcAddress("glFlushMappedBufferRangeAPPLE"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_gpu_shader4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_gpu_shader4 - if ((GLeeFuncPtr_glGetUniformuivEXT = (GLEEPFNGLGETUNIFORMUIVEXTPROC) __GLeeGetProcAddress("glGetUniformuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindFragDataLocationEXT = (GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC) __GLeeGetProcAddress("glBindFragDataLocationEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragDataLocationEXT = (GLEEPFNGLGETFRAGDATALOCATIONEXTPROC) __GLeeGetProcAddress("glGetFragDataLocationEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1uiEXT = (GLEEPFNGLUNIFORM1UIEXTPROC) __GLeeGetProcAddress("glUniform1uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2uiEXT = (GLEEPFNGLUNIFORM2UIEXTPROC) __GLeeGetProcAddress("glUniform2uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3uiEXT = (GLEEPFNGLUNIFORM3UIEXTPROC) __GLeeGetProcAddress("glUniform3uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4uiEXT = (GLEEPFNGLUNIFORM4UIEXTPROC) __GLeeGetProcAddress("glUniform4uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform1uivEXT = (GLEEPFNGLUNIFORM1UIVEXTPROC) __GLeeGetProcAddress("glUniform1uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform2uivEXT = (GLEEPFNGLUNIFORM2UIVEXTPROC) __GLeeGetProcAddress("glUniform2uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform3uivEXT = (GLEEPFNGLUNIFORM3UIVEXTPROC) __GLeeGetProcAddress("glUniform3uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUniform4uivEXT = (GLEEPFNGLUNIFORM4UIVEXTPROC) __GLeeGetProcAddress("glUniform4uivEXT"))!=0) nLinked++; -#endif - if (nLinked==11) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_draw_instanced(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_draw_instanced - if ((GLeeFuncPtr_glDrawArraysInstancedEXT = (GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC) __GLeeGetProcAddress("glDrawArraysInstancedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawElementsInstancedEXT = (GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC) __GLeeGetProcAddress("glDrawElementsInstancedEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_packed_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_array(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_buffer_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_texture_buffer_object - if ((GLeeFuncPtr_glTexBufferEXT = (GLEEPFNGLTEXBUFFEREXTPROC) __GLeeGetProcAddress("glTexBufferEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_compression_latc(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_compression_rgtc(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_shared_exponent(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_depth_buffer_float(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_depth_buffer_float - if ((GLeeFuncPtr_glDepthRangedNV = (GLEEPFNGLDEPTHRANGEDNVPROC) __GLeeGetProcAddress("glDepthRangedNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearDepthdNV = (GLEEPFNGLCLEARDEPTHDNVPROC) __GLeeGetProcAddress("glClearDepthdNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glDepthBoundsdNV = (GLEEPFNGLDEPTHBOUNDSDNVPROC) __GLeeGetProcAddress("glDepthBoundsdNV"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_framebuffer_multisample_coverage(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_framebuffer_multisample_coverage - if ((GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisampleCoverageNV"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_geometry_shader4(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_parameter_buffer_object(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_parameter_buffer_object - if ((GLeeFuncPtr_glProgramBufferParametersfvNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersfvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramBufferParametersIivNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersIivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramBufferParametersIuivNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersIuivNV"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_draw_buffers2(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_draw_buffers2 - if ((GLeeFuncPtr_glColorMaskIndexedEXT = (GLEEPFNGLCOLORMASKINDEXEDEXTPROC) __GLeeGetProcAddress("glColorMaskIndexedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetBooleanIndexedvEXT = (GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetBooleanIndexedvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetIntegerIndexedvEXT = (GLEEPFNGLGETINTEGERINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetIntegerIndexedvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEnableIndexedEXT = (GLEEPFNGLENABLEINDEXEDEXTPROC) __GLeeGetProcAddress("glEnableIndexedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDisableIndexedEXT = (GLEEPFNGLDISABLEINDEXEDEXTPROC) __GLeeGetProcAddress("glDisableIndexedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsEnabledIndexedEXT = (GLEEPFNGLISENABLEDINDEXEDEXTPROC) __GLeeGetProcAddress("glIsEnabledIndexedEXT"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_transform_feedback(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_transform_feedback - if ((GLeeFuncPtr_glBeginTransformFeedbackNV = (GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glBeginTransformFeedbackNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndTransformFeedbackNV = (GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glEndTransformFeedbackNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTransformFeedbackAttribsNV = (GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) __GLeeGetProcAddress("glTransformFeedbackAttribsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferRangeNV = (GLEEPFNGLBINDBUFFERRANGENVPROC) __GLeeGetProcAddress("glBindBufferRangeNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferOffsetNV = (GLEEPFNGLBINDBUFFEROFFSETNVPROC) __GLeeGetProcAddress("glBindBufferOffsetNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferBaseNV = (GLEEPFNGLBINDBUFFERBASENVPROC) __GLeeGetProcAddress("glBindBufferBaseNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTransformFeedbackVaryingsNV = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) __GLeeGetProcAddress("glTransformFeedbackVaryingsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glActiveVaryingNV = (GLEEPFNGLACTIVEVARYINGNVPROC) __GLeeGetProcAddress("glActiveVaryingNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVaryingLocationNV = (GLEEPFNGLGETVARYINGLOCATIONNVPROC) __GLeeGetProcAddress("glGetVaryingLocationNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetActiveVaryingNV = (GLEEPFNGLGETACTIVEVARYINGNVPROC) __GLeeGetProcAddress("glGetActiveVaryingNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTransformFeedbackVaryingNV = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) __GLeeGetProcAddress("glGetTransformFeedbackVaryingNV"))!=0) nLinked++; -#endif - if (nLinked==11) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_bindable_uniform(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_bindable_uniform - if ((GLeeFuncPtr_glUniformBufferEXT = (GLEEPFNGLUNIFORMBUFFEREXTPROC) __GLeeGetProcAddress("glUniformBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformBufferSizeEXT = (GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC) __GLeeGetProcAddress("glGetUniformBufferSizeEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetUniformOffsetEXT = (GLEEPFNGLGETUNIFORMOFFSETEXTPROC) __GLeeGetProcAddress("glGetUniformOffsetEXT"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_integer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_texture_integer - if ((GLeeFuncPtr_glTexParameterIivEXT = (GLEEPFNGLTEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glTexParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexParameterIuivEXT = (GLEEPFNGLTEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glTexParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTexParameterIivEXT = (GLEEPFNGLGETTEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetTexParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTexParameterIuivEXT = (GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetTexParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearColorIiEXT = (GLEEPFNGLCLEARCOLORIIEXTPROC) __GLeeGetProcAddress("glClearColorIiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearColorIuiEXT = (GLEEPFNGLCLEARCOLORIUIEXTPROC) __GLeeGetProcAddress("glClearColorIuiEXT"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_GREMEDY_frame_terminator(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_GREMEDY_frame_terminator - if ((GLeeFuncPtr_glFrameTerminatorGREMEDY = (GLEEPFNGLFRAMETERMINATORGREMEDYPROC) __GLeeGetProcAddress("glFrameTerminatorGREMEDY"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_conditional_render(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_conditional_render - if ((GLeeFuncPtr_glBeginConditionalRenderNV = (GLEEPFNGLBEGINCONDITIONALRENDERNVPROC) __GLeeGetProcAddress("glBeginConditionalRenderNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndConditionalRenderNV = (GLEEPFNGLENDCONDITIONALRENDERNVPROC) __GLeeGetProcAddress("glEndConditionalRenderNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_present_video(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_transform_feedback(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_transform_feedback - if ((GLeeFuncPtr_glBeginTransformFeedbackEXT = (GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC) __GLeeGetProcAddress("glBeginTransformFeedbackEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndTransformFeedbackEXT = (GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC) __GLeeGetProcAddress("glEndTransformFeedbackEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferRangeEXT = (GLEEPFNGLBINDBUFFERRANGEEXTPROC) __GLeeGetProcAddress("glBindBufferRangeEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferOffsetEXT = (GLEEPFNGLBINDBUFFEROFFSETEXTPROC) __GLeeGetProcAddress("glBindBufferOffsetEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindBufferBaseEXT = (GLEEPFNGLBINDBUFFERBASEEXTPROC) __GLeeGetProcAddress("glBindBufferBaseEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTransformFeedbackVaryingsEXT = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) __GLeeGetProcAddress("glTransformFeedbackVaryingsEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTransformFeedbackVaryingEXT = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) __GLeeGetProcAddress("glGetTransformFeedbackVaryingEXT"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_direct_state_access(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_direct_state_access - if ((GLeeFuncPtr_glClientAttribDefaultEXT = (GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC) __GLeeGetProcAddress("glClientAttribDefaultEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glPushClientAttribDefaultEXT = (GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) __GLeeGetProcAddress("glPushClientAttribDefaultEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixLoadfEXT = (GLEEPFNGLMATRIXLOADFEXTPROC) __GLeeGetProcAddress("glMatrixLoadfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixLoaddEXT = (GLEEPFNGLMATRIXLOADDEXTPROC) __GLeeGetProcAddress("glMatrixLoaddEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixMultfEXT = (GLEEPFNGLMATRIXMULTFEXTPROC) __GLeeGetProcAddress("glMatrixMultfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixMultdEXT = (GLEEPFNGLMATRIXMULTDEXTPROC) __GLeeGetProcAddress("glMatrixMultdEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixLoadIdentityEXT = (GLEEPFNGLMATRIXLOADIDENTITYEXTPROC) __GLeeGetProcAddress("glMatrixLoadIdentityEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixRotatefEXT = (GLEEPFNGLMATRIXROTATEFEXTPROC) __GLeeGetProcAddress("glMatrixRotatefEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixRotatedEXT = (GLEEPFNGLMATRIXROTATEDEXTPROC) __GLeeGetProcAddress("glMatrixRotatedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixScalefEXT = (GLEEPFNGLMATRIXSCALEFEXTPROC) __GLeeGetProcAddress("glMatrixScalefEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixScaledEXT = (GLEEPFNGLMATRIXSCALEDEXTPROC) __GLeeGetProcAddress("glMatrixScaledEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixTranslatefEXT = (GLEEPFNGLMATRIXTRANSLATEFEXTPROC) __GLeeGetProcAddress("glMatrixTranslatefEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixTranslatedEXT = (GLEEPFNGLMATRIXTRANSLATEDEXTPROC) __GLeeGetProcAddress("glMatrixTranslatedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixFrustumEXT = (GLEEPFNGLMATRIXFRUSTUMEXTPROC) __GLeeGetProcAddress("glMatrixFrustumEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixOrthoEXT = (GLEEPFNGLMATRIXORTHOEXTPROC) __GLeeGetProcAddress("glMatrixOrthoEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixPopEXT = (GLEEPFNGLMATRIXPOPEXTPROC) __GLeeGetProcAddress("glMatrixPopEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixPushEXT = (GLEEPFNGLMATRIXPUSHEXTPROC) __GLeeGetProcAddress("glMatrixPushEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixLoadTransposefEXT = (GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC) __GLeeGetProcAddress("glMatrixLoadTransposefEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixLoadTransposedEXT = (GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC) __GLeeGetProcAddress("glMatrixLoadTransposedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixMultTransposefEXT = (GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC) __GLeeGetProcAddress("glMatrixMultTransposefEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMatrixMultTransposedEXT = (GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC) __GLeeGetProcAddress("glMatrixMultTransposedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureParameterfEXT = (GLEEPFNGLTEXTUREPARAMETERFEXTPROC) __GLeeGetProcAddress("glTextureParameterfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureParameterfvEXT = (GLEEPFNGLTEXTUREPARAMETERFVEXTPROC) __GLeeGetProcAddress("glTextureParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureParameteriEXT = (GLEEPFNGLTEXTUREPARAMETERIEXTPROC) __GLeeGetProcAddress("glTextureParameteriEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureParameterivEXT = (GLEEPFNGLTEXTUREPARAMETERIVEXTPROC) __GLeeGetProcAddress("glTextureParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureImage1DEXT = (GLEEPFNGLTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glTextureImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureImage2DEXT = (GLEEPFNGLTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glTextureImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureSubImage1DEXT = (GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glTextureSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureSubImage2DEXT = (GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glTextureSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTextureImage1DEXT = (GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTextureImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTextureImage2DEXT = (GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTextureImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTextureSubImage1DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTextureSubImage2DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureImageEXT = (GLEEPFNGLGETTEXTUREIMAGEEXTPROC) __GLeeGetProcAddress("glGetTextureImageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureParameterfvEXT = (GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureParameterivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureLevelParameterfvEXT = (GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetTextureLevelParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureLevelParameterivEXT = (GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetTextureLevelParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureImage3DEXT = (GLEEPFNGLTEXTUREIMAGE3DEXTPROC) __GLeeGetProcAddress("glTextureImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureSubImage3DEXT = (GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glTextureSubImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyTextureSubImage3DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexParameterfEXT = (GLEEPFNGLMULTITEXPARAMETERFEXTPROC) __GLeeGetProcAddress("glMultiTexParameterfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexParameterfvEXT = (GLEEPFNGLMULTITEXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexParameteriEXT = (GLEEPFNGLMULTITEXPARAMETERIEXTPROC) __GLeeGetProcAddress("glMultiTexParameteriEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexParameterivEXT = (GLEEPFNGLMULTITEXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexImage1DEXT = (GLEEPFNGLMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glMultiTexImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexImage2DEXT = (GLEEPFNGLMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glMultiTexImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexSubImage1DEXT = (GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexSubImage2DEXT = (GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyMultiTexImage1DEXT = (GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyMultiTexImage2DEXT = (GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyMultiTexSubImage1DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyMultiTexSubImage2DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexImageEXT = (GLEEPFNGLGETMULTITEXIMAGEEXTPROC) __GLeeGetProcAddress("glGetMultiTexImageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexParameterfvEXT = (GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexParameterivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT = (GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexLevelParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexLevelParameterivEXT = (GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexLevelParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexImage3DEXT = (GLEEPFNGLMULTITEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glMultiTexImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexSubImage3DEXT = (GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCopyMultiTexSubImage3DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glBindMultiTextureEXT = (GLEEPFNGLBINDMULTITEXTUREEXTPROC) __GLeeGetProcAddress("glBindMultiTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEnableClientStateIndexedEXT = (GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC) __GLeeGetProcAddress("glEnableClientStateIndexedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glDisableClientStateIndexedEXT = (GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) __GLeeGetProcAddress("glDisableClientStateIndexedEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexCoordPointerEXT = (GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glMultiTexCoordPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexEnvfEXT = (GLEEPFNGLMULTITEXENVFEXTPROC) __GLeeGetProcAddress("glMultiTexEnvfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexEnvfvEXT = (GLEEPFNGLMULTITEXENVFVEXTPROC) __GLeeGetProcAddress("glMultiTexEnvfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexEnviEXT = (GLEEPFNGLMULTITEXENVIEXTPROC) __GLeeGetProcAddress("glMultiTexEnviEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexEnvivEXT = (GLEEPFNGLMULTITEXENVIVEXTPROC) __GLeeGetProcAddress("glMultiTexEnvivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexGendEXT = (GLEEPFNGLMULTITEXGENDEXTPROC) __GLeeGetProcAddress("glMultiTexGendEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexGendvEXT = (GLEEPFNGLMULTITEXGENDVEXTPROC) __GLeeGetProcAddress("glMultiTexGendvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexGenfEXT = (GLEEPFNGLMULTITEXGENFEXTPROC) __GLeeGetProcAddress("glMultiTexGenfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexGenfvEXT = (GLEEPFNGLMULTITEXGENFVEXTPROC) __GLeeGetProcAddress("glMultiTexGenfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexGeniEXT = (GLEEPFNGLMULTITEXGENIEXTPROC) __GLeeGetProcAddress("glMultiTexGeniEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexGenivEXT = (GLEEPFNGLMULTITEXGENIVEXTPROC) __GLeeGetProcAddress("glMultiTexGenivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexEnvfvEXT = (GLEEPFNGLGETMULTITEXENVFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexEnvfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexEnvivEXT = (GLEEPFNGLGETMULTITEXENVIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexEnvivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexGendvEXT = (GLEEPFNGLGETMULTITEXGENDVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGendvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexGenfvEXT = (GLEEPFNGLGETMULTITEXGENFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGenfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexGenivEXT = (GLEEPFNGLGETMULTITEXGENIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGenivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFloatIndexedvEXT = (GLEEPFNGLGETFLOATINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetFloatIndexedvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetDoubleIndexedvEXT = (GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetDoubleIndexedvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetPointerIndexedvEXT = (GLEEPFNGLGETPOINTERINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetPointerIndexedvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTextureImage3DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTextureImage2DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTextureImage1DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTextureSubImage3DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTextureSubImage2DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedTextureSubImage1DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCompressedTextureImageEXT = (GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) __GLeeGetProcAddress("glGetCompressedTextureImageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedMultiTexImage3DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedMultiTexImage2DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedMultiTexImage1DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetCompressedMultiTexImageEXT = (GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) __GLeeGetProcAddress("glGetCompressedMultiTexImageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramStringEXT = (GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC) __GLeeGetProcAddress("glNamedProgramStringEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameter4dEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4dEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4dvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameter4fEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterdvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedProgramivEXT = (GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedProgramStringEXT = (GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC) __GLeeGetProcAddress("glGetNamedProgramStringEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameters4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParametersI4ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParametersI4uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureParameterIivEXT = (GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glTextureParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureParameterIuivEXT = (GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glTextureParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureParameterIivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetTextureParameterIuivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexParameterIivEXT = (GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexParameterIuivEXT = (GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexParameterIivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetMultiTexParameterIuivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterIuivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform1fEXT = (GLEEPFNGLPROGRAMUNIFORM1FEXTPROC) __GLeeGetProcAddress("glProgramUniform1fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform2fEXT = (GLEEPFNGLPROGRAMUNIFORM2FEXTPROC) __GLeeGetProcAddress("glProgramUniform2fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform3fEXT = (GLEEPFNGLPROGRAMUNIFORM3FEXTPROC) __GLeeGetProcAddress("glProgramUniform3fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform4fEXT = (GLEEPFNGLPROGRAMUNIFORM4FEXTPROC) __GLeeGetProcAddress("glProgramUniform4fEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform1iEXT = (GLEEPFNGLPROGRAMUNIFORM1IEXTPROC) __GLeeGetProcAddress("glProgramUniform1iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform2iEXT = (GLEEPFNGLPROGRAMUNIFORM2IEXTPROC) __GLeeGetProcAddress("glProgramUniform2iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform3iEXT = (GLEEPFNGLPROGRAMUNIFORM3IEXTPROC) __GLeeGetProcAddress("glProgramUniform3iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform4iEXT = (GLEEPFNGLPROGRAMUNIFORM4IEXTPROC) __GLeeGetProcAddress("glProgramUniform4iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform1fvEXT = (GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC) __GLeeGetProcAddress("glProgramUniform1fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform2fvEXT = (GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC) __GLeeGetProcAddress("glProgramUniform2fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform3fvEXT = (GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC) __GLeeGetProcAddress("glProgramUniform3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform4fvEXT = (GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC) __GLeeGetProcAddress("glProgramUniform4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform1ivEXT = (GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC) __GLeeGetProcAddress("glProgramUniform1ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform2ivEXT = (GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC) __GLeeGetProcAddress("glProgramUniform2ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform3ivEXT = (GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC) __GLeeGetProcAddress("glProgramUniform3ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform4ivEXT = (GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC) __GLeeGetProcAddress("glProgramUniform4ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2x3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3x2fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2x4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4x2fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3x4fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4x3fvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform1uiEXT = (GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC) __GLeeGetProcAddress("glProgramUniform1uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform2uiEXT = (GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC) __GLeeGetProcAddress("glProgramUniform2uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform3uiEXT = (GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC) __GLeeGetProcAddress("glProgramUniform3uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform4uiEXT = (GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC) __GLeeGetProcAddress("glProgramUniform4uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform1uivEXT = (GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform1uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform2uivEXT = (GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform2uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform3uivEXT = (GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform3uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramUniform4uivEXT = (GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform4uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedBufferDataEXT = (GLEEPFNGLNAMEDBUFFERDATAEXTPROC) __GLeeGetProcAddress("glNamedBufferDataEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedBufferSubDataEXT = (GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC) __GLeeGetProcAddress("glNamedBufferSubDataEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMapNamedBufferEXT = (GLEEPFNGLMAPNAMEDBUFFEREXTPROC) __GLeeGetProcAddress("glMapNamedBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glUnmapNamedBufferEXT = (GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC) __GLeeGetProcAddress("glUnmapNamedBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedBufferParameterivEXT = (GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedBufferParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedBufferPointervEXT = (GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC) __GLeeGetProcAddress("glGetNamedBufferPointervEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedBufferSubDataEXT = (GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC) __GLeeGetProcAddress("glGetNamedBufferSubDataEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureBufferEXT = (GLEEPFNGLTEXTUREBUFFEREXTPROC) __GLeeGetProcAddress("glTextureBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexBufferEXT = (GLEEPFNGLMULTITEXBUFFEREXTPROC) __GLeeGetProcAddress("glMultiTexBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedRenderbufferStorageEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT = (GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedRenderbufferParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glCheckNamedFramebufferStatusEXT = (GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) __GLeeGetProcAddress("glCheckNamedFramebufferStatusEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferTexture1DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture1DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferTexture2DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture2DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferTexture3DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture3DEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferRenderbufferEXT = (GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glNamedFramebufferRenderbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT = (GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedFramebufferAttachmentParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenerateTextureMipmapEXT = (GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateTextureMipmapEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenerateMultiTexMipmapEXT = (GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateMultiTexMipmapEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferDrawBufferEXT = (GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferDrawBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferDrawBuffersEXT = (GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) __GLeeGetProcAddress("glFramebufferDrawBuffersEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferReadBufferEXT = (GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferReadBufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFramebufferParameterivEXT = (GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetFramebufferParameterivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageMultisampleEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageMultisampleCoverageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferTextureEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferTextureLayerEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureLayerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glNamedFramebufferTextureFaceEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureFaceEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glTextureRenderbufferEXT = (GLEEPFNGLTEXTURERENDERBUFFEREXTPROC) __GLeeGetProcAddress("glTextureRenderbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glMultiTexRenderbufferEXT = (GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glMultiTexRenderbufferEXT"))!=0) nLinked++; -#endif - if (nLinked==186) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_vertex_array_bgra(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_swizzle(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_explicit_multisample(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_explicit_multisample - if ((GLeeFuncPtr_glGetMultisamplefvNV = (GLEEPFNGLGETMULTISAMPLEFVNVPROC) __GLeeGetProcAddress("glGetMultisamplefvNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glSampleMaskIndexedNV = (GLEEPFNGLSAMPLEMASKINDEXEDNVPROC) __GLeeGetProcAddress("glSampleMaskIndexedNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glTexRenderbufferNV = (GLEEPFNGLTEXRENDERBUFFERNVPROC) __GLeeGetProcAddress("glTexRenderbufferNV"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_NV_transform_feedback2(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_transform_feedback2 - if ((GLeeFuncPtr_glBindTransformFeedbackNV = (GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glBindTransformFeedbackNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glDeleteTransformFeedbacksNV = (GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC) __GLeeGetProcAddress("glDeleteTransformFeedbacksNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGenTransformFeedbacksNV = (GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC) __GLeeGetProcAddress("glGenTransformFeedbacksNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glIsTransformFeedbackNV = (GLEEPFNGLISTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glIsTransformFeedbackNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glPauseTransformFeedbackNV = (GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glPauseTransformFeedbackNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glResumeTransformFeedbackNV = (GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glResumeTransformFeedbackNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glDrawTransformFeedbackNV = (GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glDrawTransformFeedbackNV"))!=0) nLinked++; -#endif - if (nLinked==7) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_texture_select(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_INGR_blend_func_separate(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_INGR_blend_func_separate - if ((GLeeFuncPtr_glBlendFuncSeparateINGR = (GLEEPFNGLBLENDFUNCSEPARATEINGRPROC) __GLeeGetProcAddress("glBlendFuncSeparateINGR"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_depth_pass_instrument(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_igloo_interface(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_SGIX_igloo_interface - if ((GLeeFuncPtr_glIglooInterfaceSGIX = (GLEEPFNGLIGLOOINTERFACESGIXPROC) __GLeeGetProcAddress("glIglooInterfaceSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_fragment_lighting(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_fragment_lighting - if ((GLeeFuncPtr_glFragmentLightModeliEXT = (GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC) __GLeeGetProcAddress("glFragmentLightModeliEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModelfEXT = (GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC) __GLeeGetProcAddress("glFragmentLightModelfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModelivEXT = (GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC) __GLeeGetProcAddress("glFragmentLightModelivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightModelfvEXT = (GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC) __GLeeGetProcAddress("glFragmentLightModelfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightiEXT = (GLEEPFNGLFRAGMENTLIGHTIEXTPROC) __GLeeGetProcAddress("glFragmentLightiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightfEXT = (GLEEPFNGLFRAGMENTLIGHTFEXTPROC) __GLeeGetProcAddress("glFragmentLightfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightivEXT = (GLEEPFNGLFRAGMENTLIGHTIVEXTPROC) __GLeeGetProcAddress("glFragmentLightivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentLightfvEXT = (GLEEPFNGLFRAGMENTLIGHTFVEXTPROC) __GLeeGetProcAddress("glFragmentLightfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentLightivEXT = (GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC) __GLeeGetProcAddress("glGetFragmentLightivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentLightfvEXT = (GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC) __GLeeGetProcAddress("glGetFragmentLightfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialfEXT = (GLEEPFNGLFRAGMENTMATERIALFEXTPROC) __GLeeGetProcAddress("glFragmentMaterialfEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialiEXT = (GLEEPFNGLFRAGMENTMATERIALIEXTPROC) __GLeeGetProcAddress("glFragmentMaterialiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialfvEXT = (GLEEPFNGLFRAGMENTMATERIALFVEXTPROC) __GLeeGetProcAddress("glFragmentMaterialfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentMaterialivEXT = (GLEEPFNGLFRAGMENTMATERIALIVEXTPROC) __GLeeGetProcAddress("glFragmentMaterialivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFragmentColorMaterialEXT = (GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC) __GLeeGetProcAddress("glFragmentColorMaterialEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentMaterialfvEXT = (GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC) __GLeeGetProcAddress("glGetFragmentMaterialfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetFragmentMaterialivEXT = (GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC) __GLeeGetProcAddress("glGetFragmentMaterialivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glLightEnviEXT = (GLEEPFNGLLIGHTENVIEXTPROC) __GLeeGetProcAddress("glLightEnviEXT"))!=0) nLinked++; -#endif - if (nLinked==18) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_geometry_shader4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_geometry_shader4 - if ((GLeeFuncPtr_glProgramParameteriEXT = (GLEEPFNGLPROGRAMPARAMETERIEXTPROC) __GLeeGetProcAddress("glProgramParameteriEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glFramebufferTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureLayerEXT = (GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glFramebufferTextureLayerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureFaceEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glFramebufferTextureFaceEXT"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_scene_marker(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_EXT_scene_marker - if ((GLeeFuncPtr_glBeginSceneEXT = (GLEEPFNGLBEGINSCENEEXTPROC) __GLeeGetProcAddress("glBeginSceneEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glEndSceneEXT = (GLEEPFNGLENDSCENEEXTPROC) __GLeeGetProcAddress("glEndSceneEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_EXT_texture_compression_dxt1(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_EXT_texture_env(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_IBM_static_data(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_NV_gpu_program4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_NV_gpu_program4 - if ((GLeeFuncPtr_glProgramLocalParameterI4iNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4iNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameterI4ivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4ivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParametersI4ivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) __GLeeGetProcAddress("glProgramLocalParametersI4ivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameterI4uiNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4uiNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParameterI4uivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4uivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramLocalParametersI4uivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) __GLeeGetProcAddress("glProgramLocalParametersI4uivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameterI4iNV = (GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4iNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameterI4ivNV = (GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4ivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParametersI4ivNV = (GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC) __GLeeGetProcAddress("glProgramEnvParametersI4ivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameterI4uiNV = (GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4uiNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParameterI4uivNV = (GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4uivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glProgramEnvParametersI4uivNV = (GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) __GLeeGetProcAddress("glProgramEnvParametersI4uivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramLocalParameterIivNV = (GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) __GLeeGetProcAddress("glGetProgramLocalParameterIivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramLocalParameterIuivNV = (GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) __GLeeGetProcAddress("glGetProgramLocalParameterIuivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramEnvParameterIivNV = (GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC) __GLeeGetProcAddress("glGetProgramEnvParameterIivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetProgramEnvParameterIuivNV = (GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) __GLeeGetProcAddress("glGetProgramEnvParameterIuivNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glFramebufferTextureEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureLayerEXT = (GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glFramebufferTextureLayerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glFramebufferTextureFaceEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glFramebufferTextureFaceEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2iEXT = (GLEEPFNGLVERTEXATTRIBI2IEXTPROC) __GLeeGetProcAddress("glVertexAttribI2iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3iEXT = (GLEEPFNGLVERTEXATTRIBI3IEXTPROC) __GLeeGetProcAddress("glVertexAttribI3iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4iEXT = (GLEEPFNGLVERTEXATTRIBI4IEXTPROC) __GLeeGetProcAddress("glVertexAttribI4iEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1uiEXT = (GLEEPFNGLVERTEXATTRIBI1UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI1uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2uiEXT = (GLEEPFNGLVERTEXATTRIBI2UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI2uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3uiEXT = (GLEEPFNGLVERTEXATTRIBI3UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI3uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4uiEXT = (GLEEPFNGLVERTEXATTRIBI4UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI4uiEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1ivEXT = (GLEEPFNGLVERTEXATTRIBI1IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI1ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2ivEXT = (GLEEPFNGLVERTEXATTRIBI2IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI2ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3ivEXT = (GLEEPFNGLVERTEXATTRIBI3IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI3ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4ivEXT = (GLEEPFNGLVERTEXATTRIBI4IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4ivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI1uivEXT = (GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI1uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI2uivEXT = (GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI2uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI3uivEXT = (GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI3uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4uivEXT = (GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4uivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4bvEXT = (GLEEPFNGLVERTEXATTRIBI4BVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4bvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4svEXT = (GLEEPFNGLVERTEXATTRIBI4SVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4svEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4ubvEXT = (GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4ubvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribI4usvEXT = (GLEEPFNGLVERTEXATTRIBI4USVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4usvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glVertexAttribIPointerEXT = (GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC) __GLeeGetProcAddress("glVertexAttribIPointerEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribIivEXT = (GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC) __GLeeGetProcAddress("glGetVertexAttribIivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetVertexAttribIuivEXT = (GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC) __GLeeGetProcAddress("glGetVertexAttribIuivEXT"))!=0) nLinked++; -#endif - if (nLinked==41) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_OES_byte_coordinates(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_OES_compressed_paletted_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_OES_single_precision(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GL_OES_single_precision - if ((GLeeFuncPtr_glDepthRangefOES = (GLEEPFNGLDEPTHRANGEFOESPROC) __GLeeGetProcAddress("glDepthRangefOES"))!=0) nLinked++; - if ((GLeeFuncPtr_glFrustumfOES = (GLEEPFNGLFRUSTUMFOESPROC) __GLeeGetProcAddress("glFrustumfOES"))!=0) nLinked++; - if ((GLeeFuncPtr_glOrthofOES = (GLEEPFNGLORTHOFOESPROC) __GLeeGetProcAddress("glOrthofOES"))!=0) nLinked++; - if ((GLeeFuncPtr_glClipPlanefOES = (GLEEPFNGLCLIPPLANEFOESPROC) __GLeeGetProcAddress("glClipPlanefOES"))!=0) nLinked++; - if ((GLeeFuncPtr_glGetClipPlanefOES = (GLEEPFNGLGETCLIPPLANEFOESPROC) __GLeeGetProcAddress("glGetClipPlanefOES"))!=0) nLinked++; - if ((GLeeFuncPtr_glClearDepthfOES = (GLEEPFNGLCLEARDEPTHFOESPROC) __GLeeGetProcAddress("glClearDepthfOES"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GL_SGIX_pixel_texture_bits(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GL_SGIX_texture_range(void) {return GLEE_LINK_COMPLETE;} - -GLEE_LINK_FUNCTION __GLeeGLLoadFunction[322]; - -void initGLLoadFunctions(void) -{ - __GLeeGLLoadFunction[0]=__GLeeLink_GL_VERSION_1_2; - __GLeeGLLoadFunction[1]=__GLeeLink_GL_ARB_imaging; - __GLeeGLLoadFunction[2]=__GLeeLink_GL_VERSION_1_3; - __GLeeGLLoadFunction[3]=__GLeeLink_GL_VERSION_1_4; - __GLeeGLLoadFunction[4]=__GLeeLink_GL_VERSION_1_5; - __GLeeGLLoadFunction[5]=__GLeeLink_GL_VERSION_2_0; - __GLeeGLLoadFunction[6]=__GLeeLink_GL_VERSION_2_1; - __GLeeGLLoadFunction[7]=__GLeeLink_GL_VERSION_3_0; - __GLeeGLLoadFunction[8]=__GLeeLink_GL_ARB_multitexture; - __GLeeGLLoadFunction[9]=__GLeeLink_GL_ARB_transpose_matrix; - __GLeeGLLoadFunction[10]=__GLeeLink_GL_ARB_multisample; - __GLeeGLLoadFunction[11]=__GLeeLink_GL_ARB_texture_env_add; - __GLeeGLLoadFunction[12]=__GLeeLink_GL_ARB_texture_cube_map; - __GLeeGLLoadFunction[13]=__GLeeLink_GL_ARB_texture_compression; - __GLeeGLLoadFunction[14]=__GLeeLink_GL_ARB_texture_border_clamp; - __GLeeGLLoadFunction[15]=__GLeeLink_GL_ARB_point_parameters; - __GLeeGLLoadFunction[16]=__GLeeLink_GL_ARB_vertex_blend; - __GLeeGLLoadFunction[17]=__GLeeLink_GL_ARB_matrix_palette; - __GLeeGLLoadFunction[18]=__GLeeLink_GL_ARB_texture_env_combine; - __GLeeGLLoadFunction[19]=__GLeeLink_GL_ARB_texture_env_crossbar; - __GLeeGLLoadFunction[20]=__GLeeLink_GL_ARB_texture_env_dot3; - __GLeeGLLoadFunction[21]=__GLeeLink_GL_ARB_texture_mirrored_repeat; - __GLeeGLLoadFunction[22]=__GLeeLink_GL_ARB_depth_texture; - __GLeeGLLoadFunction[23]=__GLeeLink_GL_ARB_shadow; - __GLeeGLLoadFunction[24]=__GLeeLink_GL_ARB_shadow_ambient; - __GLeeGLLoadFunction[25]=__GLeeLink_GL_ARB_window_pos; - __GLeeGLLoadFunction[26]=__GLeeLink_GL_ARB_vertex_program; - __GLeeGLLoadFunction[27]=__GLeeLink_GL_ARB_fragment_program; - __GLeeGLLoadFunction[28]=__GLeeLink_GL_ARB_vertex_buffer_object; - __GLeeGLLoadFunction[29]=__GLeeLink_GL_ARB_occlusion_query; - __GLeeGLLoadFunction[30]=__GLeeLink_GL_ARB_shader_objects; - __GLeeGLLoadFunction[31]=__GLeeLink_GL_ARB_vertex_shader; - __GLeeGLLoadFunction[32]=__GLeeLink_GL_ARB_fragment_shader; - __GLeeGLLoadFunction[33]=__GLeeLink_GL_ARB_shading_language_100; - __GLeeGLLoadFunction[34]=__GLeeLink_GL_ARB_texture_non_power_of_two; - __GLeeGLLoadFunction[35]=__GLeeLink_GL_ARB_point_sprite; - __GLeeGLLoadFunction[36]=__GLeeLink_GL_ARB_fragment_program_shadow; - __GLeeGLLoadFunction[37]=__GLeeLink_GL_ARB_draw_buffers; - __GLeeGLLoadFunction[38]=__GLeeLink_GL_ARB_texture_rectangle; - __GLeeGLLoadFunction[39]=__GLeeLink_GL_ARB_color_buffer_float; - __GLeeGLLoadFunction[40]=__GLeeLink_GL_ARB_half_float_pixel; - __GLeeGLLoadFunction[41]=__GLeeLink_GL_ARB_texture_float; - __GLeeGLLoadFunction[42]=__GLeeLink_GL_ARB_pixel_buffer_object; - __GLeeGLLoadFunction[43]=__GLeeLink_GL_ARB_depth_buffer_float; - __GLeeGLLoadFunction[44]=__GLeeLink_GL_ARB_draw_instanced; - __GLeeGLLoadFunction[45]=__GLeeLink_GL_ARB_framebuffer_object; - __GLeeGLLoadFunction[46]=__GLeeLink_GL_ARB_framebuffer_sRGB; - __GLeeGLLoadFunction[47]=__GLeeLink_GL_ARB_geometry_shader4; - __GLeeGLLoadFunction[48]=__GLeeLink_GL_ARB_half_float_vertex; - __GLeeGLLoadFunction[49]=__GLeeLink_GL_ARB_instanced_arrays; - __GLeeGLLoadFunction[50]=__GLeeLink_GL_ARB_map_buffer_range; - __GLeeGLLoadFunction[51]=__GLeeLink_GL_ARB_texture_buffer_object; - __GLeeGLLoadFunction[52]=__GLeeLink_GL_ARB_texture_compression_rgtc; - __GLeeGLLoadFunction[53]=__GLeeLink_GL_ARB_texture_rg; - __GLeeGLLoadFunction[54]=__GLeeLink_GL_ARB_vertex_array_object; - __GLeeGLLoadFunction[55]=__GLeeLink_GL_EXT_abgr; - __GLeeGLLoadFunction[56]=__GLeeLink_GL_EXT_blend_color; - __GLeeGLLoadFunction[57]=__GLeeLink_GL_EXT_polygon_offset; - __GLeeGLLoadFunction[58]=__GLeeLink_GL_EXT_texture; - __GLeeGLLoadFunction[59]=__GLeeLink_GL_EXT_texture3D; - __GLeeGLLoadFunction[60]=__GLeeLink_GL_SGIS_texture_filter4; - __GLeeGLLoadFunction[61]=__GLeeLink_GL_EXT_subtexture; - __GLeeGLLoadFunction[62]=__GLeeLink_GL_EXT_copy_texture; - __GLeeGLLoadFunction[63]=__GLeeLink_GL_EXT_histogram; - __GLeeGLLoadFunction[64]=__GLeeLink_GL_EXT_convolution; - __GLeeGLLoadFunction[65]=__GLeeLink_GL_SGI_color_matrix; - __GLeeGLLoadFunction[66]=__GLeeLink_GL_SGI_color_table; - __GLeeGLLoadFunction[67]=__GLeeLink_GL_SGIS_pixel_texture; - __GLeeGLLoadFunction[68]=__GLeeLink_GL_SGIX_pixel_texture; - __GLeeGLLoadFunction[69]=__GLeeLink_GL_SGIS_texture4D; - __GLeeGLLoadFunction[70]=__GLeeLink_GL_SGI_texture_color_table; - __GLeeGLLoadFunction[71]=__GLeeLink_GL_EXT_cmyka; - __GLeeGLLoadFunction[72]=__GLeeLink_GL_EXT_texture_object; - __GLeeGLLoadFunction[73]=__GLeeLink_GL_SGIS_detail_texture; - __GLeeGLLoadFunction[74]=__GLeeLink_GL_SGIS_sharpen_texture; - __GLeeGLLoadFunction[75]=__GLeeLink_GL_EXT_packed_pixels; - __GLeeGLLoadFunction[76]=__GLeeLink_GL_SGIS_texture_lod; - __GLeeGLLoadFunction[77]=__GLeeLink_GL_SGIS_multisample; - __GLeeGLLoadFunction[78]=__GLeeLink_GL_EXT_rescale_normal; - __GLeeGLLoadFunction[79]=__GLeeLink_GL_EXT_vertex_array; - __GLeeGLLoadFunction[80]=__GLeeLink_GL_EXT_misc_attribute; - __GLeeGLLoadFunction[81]=__GLeeLink_GL_SGIS_generate_mipmap; - __GLeeGLLoadFunction[82]=__GLeeLink_GL_SGIX_clipmap; - __GLeeGLLoadFunction[83]=__GLeeLink_GL_SGIX_shadow; - __GLeeGLLoadFunction[84]=__GLeeLink_GL_SGIS_texture_edge_clamp; - __GLeeGLLoadFunction[85]=__GLeeLink_GL_SGIS_texture_border_clamp; - __GLeeGLLoadFunction[86]=__GLeeLink_GL_EXT_blend_minmax; - __GLeeGLLoadFunction[87]=__GLeeLink_GL_EXT_blend_subtract; - __GLeeGLLoadFunction[88]=__GLeeLink_GL_EXT_blend_logic_op; - __GLeeGLLoadFunction[89]=__GLeeLink_GL_SGIX_interlace; - __GLeeGLLoadFunction[90]=__GLeeLink_GL_SGIX_pixel_tiles; - __GLeeGLLoadFunction[91]=__GLeeLink_GL_SGIS_texture_select; - __GLeeGLLoadFunction[92]=__GLeeLink_GL_SGIX_sprite; - __GLeeGLLoadFunction[93]=__GLeeLink_GL_SGIX_texture_multi_buffer; - __GLeeGLLoadFunction[94]=__GLeeLink_GL_EXT_point_parameters; - __GLeeGLLoadFunction[95]=__GLeeLink_GL_SGIS_point_parameters; - __GLeeGLLoadFunction[96]=__GLeeLink_GL_SGIX_instruments; - __GLeeGLLoadFunction[97]=__GLeeLink_GL_SGIX_texture_scale_bias; - __GLeeGLLoadFunction[98]=__GLeeLink_GL_SGIX_framezoom; - __GLeeGLLoadFunction[99]=__GLeeLink_GL_SGIX_tag_sample_buffer; - __GLeeGLLoadFunction[100]=__GLeeLink_GL_FfdMaskSGIX; - __GLeeGLLoadFunction[101]=__GLeeLink_GL_SGIX_polynomial_ffd; - __GLeeGLLoadFunction[102]=__GLeeLink_GL_SGIX_reference_plane; - __GLeeGLLoadFunction[103]=__GLeeLink_GL_SGIX_flush_raster; - __GLeeGLLoadFunction[104]=__GLeeLink_GL_SGIX_depth_texture; - __GLeeGLLoadFunction[105]=__GLeeLink_GL_SGIS_fog_function; - __GLeeGLLoadFunction[106]=__GLeeLink_GL_SGIX_fog_offset; - __GLeeGLLoadFunction[107]=__GLeeLink_GL_HP_image_transform; - __GLeeGLLoadFunction[108]=__GLeeLink_GL_HP_convolution_border_modes; - __GLeeGLLoadFunction[109]=__GLeeLink_GL_INGR_palette_buffer; - __GLeeGLLoadFunction[110]=__GLeeLink_GL_SGIX_texture_add_env; - __GLeeGLLoadFunction[111]=__GLeeLink_GL_EXT_color_subtable; - __GLeeGLLoadFunction[112]=__GLeeLink_GL_PGI_vertex_hints; - __GLeeGLLoadFunction[113]=__GLeeLink_GL_PGI_misc_hints; - __GLeeGLLoadFunction[114]=__GLeeLink_GL_EXT_paletted_texture; - __GLeeGLLoadFunction[115]=__GLeeLink_GL_EXT_clip_volume_hint; - __GLeeGLLoadFunction[116]=__GLeeLink_GL_SGIX_list_priority; - __GLeeGLLoadFunction[117]=__GLeeLink_GL_SGIX_ir_instrument1; - __GLeeGLLoadFunction[118]=__GLeeLink_GL_SGIX_calligraphic_fragment; - __GLeeGLLoadFunction[119]=__GLeeLink_GL_SGIX_texture_lod_bias; - __GLeeGLLoadFunction[120]=__GLeeLink_GL_SGIX_shadow_ambient; - __GLeeGLLoadFunction[121]=__GLeeLink_GL_EXT_index_texture; - __GLeeGLLoadFunction[122]=__GLeeLink_GL_EXT_index_material; - __GLeeGLLoadFunction[123]=__GLeeLink_GL_EXT_index_func; - __GLeeGLLoadFunction[124]=__GLeeLink_GL_EXT_index_array_formats; - __GLeeGLLoadFunction[125]=__GLeeLink_GL_EXT_compiled_vertex_array; - __GLeeGLLoadFunction[126]=__GLeeLink_GL_EXT_cull_vertex; - __GLeeGLLoadFunction[127]=__GLeeLink_GL_SGIX_ycrcb; - __GLeeGLLoadFunction[128]=__GLeeLink_GL_SGIX_fragment_lighting; - __GLeeGLLoadFunction[129]=__GLeeLink_GL_IBM_rasterpos_clip; - __GLeeGLLoadFunction[130]=__GLeeLink_GL_HP_texture_lighting; - __GLeeGLLoadFunction[131]=__GLeeLink_GL_EXT_draw_range_elements; - __GLeeGLLoadFunction[132]=__GLeeLink_GL_WIN_phong_shading; - __GLeeGLLoadFunction[133]=__GLeeLink_GL_WIN_specular_fog; - __GLeeGLLoadFunction[134]=__GLeeLink_GL_EXT_light_texture; - __GLeeGLLoadFunction[135]=__GLeeLink_GL_SGIX_blend_alpha_minmax; - __GLeeGLLoadFunction[136]=__GLeeLink_GL_SGIX_impact_pixel_texture; - __GLeeGLLoadFunction[137]=__GLeeLink_GL_EXT_bgra; - __GLeeGLLoadFunction[138]=__GLeeLink_GL_SGIX_async; - __GLeeGLLoadFunction[139]=__GLeeLink_GL_SGIX_async_pixel; - __GLeeGLLoadFunction[140]=__GLeeLink_GL_SGIX_async_histogram; - __GLeeGLLoadFunction[141]=__GLeeLink_GL_INTEL_texture_scissor; - __GLeeGLLoadFunction[142]=__GLeeLink_GL_INTEL_parallel_arrays; - __GLeeGLLoadFunction[143]=__GLeeLink_GL_HP_occlusion_test; - __GLeeGLLoadFunction[144]=__GLeeLink_GL_EXT_pixel_transform; - __GLeeGLLoadFunction[145]=__GLeeLink_GL_EXT_pixel_transform_color_table; - __GLeeGLLoadFunction[146]=__GLeeLink_GL_EXT_shared_texture_palette; - __GLeeGLLoadFunction[147]=__GLeeLink_GL_EXT_separate_specular_color; - __GLeeGLLoadFunction[148]=__GLeeLink_GL_EXT_secondary_color; - __GLeeGLLoadFunction[149]=__GLeeLink_GL_EXT_texture_perturb_normal; - __GLeeGLLoadFunction[150]=__GLeeLink_GL_EXT_multi_draw_arrays; - __GLeeGLLoadFunction[151]=__GLeeLink_GL_EXT_fog_coord; - __GLeeGLLoadFunction[152]=__GLeeLink_GL_REND_screen_coordinates; - __GLeeGLLoadFunction[153]=__GLeeLink_GL_EXT_coordinate_frame; - __GLeeGLLoadFunction[154]=__GLeeLink_GL_EXT_texture_env_combine; - __GLeeGLLoadFunction[155]=__GLeeLink_GL_APPLE_specular_vector; - __GLeeGLLoadFunction[156]=__GLeeLink_GL_APPLE_transform_hint; - __GLeeGLLoadFunction[157]=__GLeeLink_GL_SGIX_fog_scale; - __GLeeGLLoadFunction[158]=__GLeeLink_GL_SUNX_constant_data; - __GLeeGLLoadFunction[159]=__GLeeLink_GL_SUN_global_alpha; - __GLeeGLLoadFunction[160]=__GLeeLink_GL_SUN_triangle_list; - __GLeeGLLoadFunction[161]=__GLeeLink_GL_SUN_vertex; - __GLeeGLLoadFunction[162]=__GLeeLink_GL_EXT_blend_func_separate; - __GLeeGLLoadFunction[163]=__GLeeLink_GL_INGR_color_clamp; - __GLeeGLLoadFunction[164]=__GLeeLink_GL_INGR_interlace_read; - __GLeeGLLoadFunction[165]=__GLeeLink_GL_EXT_stencil_wrap; - __GLeeGLLoadFunction[166]=__GLeeLink_GL_EXT_422_pixels; - __GLeeGLLoadFunction[167]=__GLeeLink_GL_NV_texgen_reflection; - __GLeeGLLoadFunction[168]=__GLeeLink_GL_EXT_texture_cube_map; - __GLeeGLLoadFunction[169]=__GLeeLink_GL_SUN_convolution_border_modes; - __GLeeGLLoadFunction[170]=__GLeeLink_GL_EXT_texture_env_add; - __GLeeGLLoadFunction[171]=__GLeeLink_GL_EXT_texture_lod_bias; - __GLeeGLLoadFunction[172]=__GLeeLink_GL_EXT_texture_filter_anisotropic; - __GLeeGLLoadFunction[173]=__GLeeLink_GL_EXT_vertex_weighting; - __GLeeGLLoadFunction[174]=__GLeeLink_GL_NV_light_max_exponent; - __GLeeGLLoadFunction[175]=__GLeeLink_GL_NV_vertex_array_range; - __GLeeGLLoadFunction[176]=__GLeeLink_GL_NV_register_combiners; - __GLeeGLLoadFunction[177]=__GLeeLink_GL_NV_fog_distance; - __GLeeGLLoadFunction[178]=__GLeeLink_GL_NV_texgen_emboss; - __GLeeGLLoadFunction[179]=__GLeeLink_GL_NV_blend_square; - __GLeeGLLoadFunction[180]=__GLeeLink_GL_NV_texture_env_combine4; - __GLeeGLLoadFunction[181]=__GLeeLink_GL_MESA_resize_buffers; - __GLeeGLLoadFunction[182]=__GLeeLink_GL_MESA_window_pos; - __GLeeGLLoadFunction[183]=__GLeeLink_GL_EXT_texture_compression_s3tc; - __GLeeGLLoadFunction[184]=__GLeeLink_GL_IBM_cull_vertex; - __GLeeGLLoadFunction[185]=__GLeeLink_GL_IBM_multimode_draw_arrays; - __GLeeGLLoadFunction[186]=__GLeeLink_GL_IBM_vertex_array_lists; - __GLeeGLLoadFunction[187]=__GLeeLink_GL_SGIX_subsample; - __GLeeGLLoadFunction[188]=__GLeeLink_GL_SGIX_ycrcb_subsample; - __GLeeGLLoadFunction[189]=__GLeeLink_GL_SGIX_ycrcba; - __GLeeGLLoadFunction[190]=__GLeeLink_GL_SGI_depth_pass_instrument; - __GLeeGLLoadFunction[191]=__GLeeLink_GL_3DFX_texture_compression_FXT1; - __GLeeGLLoadFunction[192]=__GLeeLink_GL_3DFX_multisample; - __GLeeGLLoadFunction[193]=__GLeeLink_GL_3DFX_tbuffer; - __GLeeGLLoadFunction[194]=__GLeeLink_GL_EXT_multisample; - __GLeeGLLoadFunction[195]=__GLeeLink_GL_SGIX_vertex_preclip; - __GLeeGLLoadFunction[196]=__GLeeLink_GL_SGIX_convolution_accuracy; - __GLeeGLLoadFunction[197]=__GLeeLink_GL_SGIX_resample; - __GLeeGLLoadFunction[198]=__GLeeLink_GL_SGIS_point_line_texgen; - __GLeeGLLoadFunction[199]=__GLeeLink_GL_SGIS_texture_color_mask; - __GLeeGLLoadFunction[200]=__GLeeLink_GL_EXT_texture_env_dot3; - __GLeeGLLoadFunction[201]=__GLeeLink_GL_ATI_texture_mirror_once; - __GLeeGLLoadFunction[202]=__GLeeLink_GL_NV_fence; - __GLeeGLLoadFunction[203]=__GLeeLink_GL_IBM_texture_mirrored_repeat; - __GLeeGLLoadFunction[204]=__GLeeLink_GL_NV_evaluators; - __GLeeGLLoadFunction[205]=__GLeeLink_GL_NV_packed_depth_stencil; - __GLeeGLLoadFunction[206]=__GLeeLink_GL_NV_register_combiners2; - __GLeeGLLoadFunction[207]=__GLeeLink_GL_NV_texture_compression_vtc; - __GLeeGLLoadFunction[208]=__GLeeLink_GL_NV_texture_rectangle; - __GLeeGLLoadFunction[209]=__GLeeLink_GL_NV_texture_shader; - __GLeeGLLoadFunction[210]=__GLeeLink_GL_NV_texture_shader2; - __GLeeGLLoadFunction[211]=__GLeeLink_GL_NV_vertex_array_range2; - __GLeeGLLoadFunction[212]=__GLeeLink_GL_NV_vertex_program; - __GLeeGLLoadFunction[213]=__GLeeLink_GL_SGIX_texture_coordinate_clamp; - __GLeeGLLoadFunction[214]=__GLeeLink_GL_SGIX_scalebias_hint; - __GLeeGLLoadFunction[215]=__GLeeLink_GL_OML_interlace; - __GLeeGLLoadFunction[216]=__GLeeLink_GL_OML_subsample; - __GLeeGLLoadFunction[217]=__GLeeLink_GL_OML_resample; - __GLeeGLLoadFunction[218]=__GLeeLink_GL_NV_copy_depth_to_color; - __GLeeGLLoadFunction[219]=__GLeeLink_GL_ATI_envmap_bumpmap; - __GLeeGLLoadFunction[220]=__GLeeLink_GL_ATI_fragment_shader; - __GLeeGLLoadFunction[221]=__GLeeLink_GL_ATI_pn_triangles; - __GLeeGLLoadFunction[222]=__GLeeLink_GL_ATI_vertex_array_object; - __GLeeGLLoadFunction[223]=__GLeeLink_GL_EXT_vertex_shader; - __GLeeGLLoadFunction[224]=__GLeeLink_GL_ATI_vertex_streams; - __GLeeGLLoadFunction[225]=__GLeeLink_GL_ATI_element_array; - __GLeeGLLoadFunction[226]=__GLeeLink_GL_SUN_mesh_array; - __GLeeGLLoadFunction[227]=__GLeeLink_GL_SUN_slice_accum; - __GLeeGLLoadFunction[228]=__GLeeLink_GL_NV_multisample_filter_hint; - __GLeeGLLoadFunction[229]=__GLeeLink_GL_NV_depth_clamp; - __GLeeGLLoadFunction[230]=__GLeeLink_GL_NV_occlusion_query; - __GLeeGLLoadFunction[231]=__GLeeLink_GL_NV_point_sprite; - __GLeeGLLoadFunction[232]=__GLeeLink_GL_NV_texture_shader3; - __GLeeGLLoadFunction[233]=__GLeeLink_GL_NV_vertex_program1_1; - __GLeeGLLoadFunction[234]=__GLeeLink_GL_EXT_shadow_funcs; - __GLeeGLLoadFunction[235]=__GLeeLink_GL_EXT_stencil_two_side; - __GLeeGLLoadFunction[236]=__GLeeLink_GL_ATI_text_fragment_shader; - __GLeeGLLoadFunction[237]=__GLeeLink_GL_APPLE_client_storage; - __GLeeGLLoadFunction[238]=__GLeeLink_GL_APPLE_element_array; - __GLeeGLLoadFunction[239]=__GLeeLink_GL_APPLE_fence; - __GLeeGLLoadFunction[240]=__GLeeLink_GL_APPLE_vertex_array_object; - __GLeeGLLoadFunction[241]=__GLeeLink_GL_APPLE_vertex_array_range; - __GLeeGLLoadFunction[242]=__GLeeLink_GL_APPLE_ycbcr_422; - __GLeeGLLoadFunction[243]=__GLeeLink_GL_S3_s3tc; - __GLeeGLLoadFunction[244]=__GLeeLink_GL_ATI_draw_buffers; - __GLeeGLLoadFunction[245]=__GLeeLink_GL_ATI_pixel_format_float; - __GLeeGLLoadFunction[246]=__GLeeLink_GL_ATI_texture_env_combine3; - __GLeeGLLoadFunction[247]=__GLeeLink_GL_ATI_texture_float; - __GLeeGLLoadFunction[248]=__GLeeLink_GL_NV_float_buffer; - __GLeeGLLoadFunction[249]=__GLeeLink_GL_NV_fragment_program; - __GLeeGLLoadFunction[250]=__GLeeLink_GL_NV_half_float; - __GLeeGLLoadFunction[251]=__GLeeLink_GL_NV_pixel_data_range; - __GLeeGLLoadFunction[252]=__GLeeLink_GL_NV_primitive_restart; - __GLeeGLLoadFunction[253]=__GLeeLink_GL_NV_texture_expand_normal; - __GLeeGLLoadFunction[254]=__GLeeLink_GL_NV_vertex_program2; - __GLeeGLLoadFunction[255]=__GLeeLink_GL_ATI_map_object_buffer; - __GLeeGLLoadFunction[256]=__GLeeLink_GL_ATI_separate_stencil; - __GLeeGLLoadFunction[257]=__GLeeLink_GL_ATI_vertex_attrib_array_object; - __GLeeGLLoadFunction[258]=__GLeeLink_GL_OES_read_format; - __GLeeGLLoadFunction[259]=__GLeeLink_GL_EXT_depth_bounds_test; - __GLeeGLLoadFunction[260]=__GLeeLink_GL_EXT_texture_mirror_clamp; - __GLeeGLLoadFunction[261]=__GLeeLink_GL_EXT_blend_equation_separate; - __GLeeGLLoadFunction[262]=__GLeeLink_GL_MESA_pack_invert; - __GLeeGLLoadFunction[263]=__GLeeLink_GL_MESA_ycbcr_texture; - __GLeeGLLoadFunction[264]=__GLeeLink_GL_EXT_pixel_buffer_object; - __GLeeGLLoadFunction[265]=__GLeeLink_GL_NV_fragment_program_option; - __GLeeGLLoadFunction[266]=__GLeeLink_GL_NV_fragment_program2; - __GLeeGLLoadFunction[267]=__GLeeLink_GL_NV_vertex_program2_option; - __GLeeGLLoadFunction[268]=__GLeeLink_GL_NV_vertex_program3; - __GLeeGLLoadFunction[269]=__GLeeLink_GL_EXT_framebuffer_object; - __GLeeGLLoadFunction[270]=__GLeeLink_GL_GREMEDY_string_marker; - __GLeeGLLoadFunction[271]=__GLeeLink_GL_EXT_packed_depth_stencil; - __GLeeGLLoadFunction[272]=__GLeeLink_GL_EXT_stencil_clear_tag; - __GLeeGLLoadFunction[273]=__GLeeLink_GL_EXT_texture_sRGB; - __GLeeGLLoadFunction[274]=__GLeeLink_GL_EXT_framebuffer_blit; - __GLeeGLLoadFunction[275]=__GLeeLink_GL_EXT_framebuffer_multisample; - __GLeeGLLoadFunction[276]=__GLeeLink_GL_MESAX_texture_stack; - __GLeeGLLoadFunction[277]=__GLeeLink_GL_EXT_timer_query; - __GLeeGLLoadFunction[278]=__GLeeLink_GL_EXT_gpu_program_parameters; - __GLeeGLLoadFunction[279]=__GLeeLink_GL_APPLE_flush_buffer_range; - __GLeeGLLoadFunction[280]=__GLeeLink_GL_EXT_gpu_shader4; - __GLeeGLLoadFunction[281]=__GLeeLink_GL_EXT_draw_instanced; - __GLeeGLLoadFunction[282]=__GLeeLink_GL_EXT_packed_float; - __GLeeGLLoadFunction[283]=__GLeeLink_GL_EXT_texture_array; - __GLeeGLLoadFunction[284]=__GLeeLink_GL_EXT_texture_buffer_object; - __GLeeGLLoadFunction[285]=__GLeeLink_GL_EXT_texture_compression_latc; - __GLeeGLLoadFunction[286]=__GLeeLink_GL_EXT_texture_compression_rgtc; - __GLeeGLLoadFunction[287]=__GLeeLink_GL_EXT_texture_shared_exponent; - __GLeeGLLoadFunction[288]=__GLeeLink_GL_NV_depth_buffer_float; - __GLeeGLLoadFunction[289]=__GLeeLink_GL_NV_framebuffer_multisample_coverage; - __GLeeGLLoadFunction[290]=__GLeeLink_GL_EXT_framebuffer_sRGB; - __GLeeGLLoadFunction[291]=__GLeeLink_GL_NV_geometry_shader4; - __GLeeGLLoadFunction[292]=__GLeeLink_GL_NV_parameter_buffer_object; - __GLeeGLLoadFunction[293]=__GLeeLink_GL_EXT_draw_buffers2; - __GLeeGLLoadFunction[294]=__GLeeLink_GL_NV_transform_feedback; - __GLeeGLLoadFunction[295]=__GLeeLink_GL_EXT_bindable_uniform; - __GLeeGLLoadFunction[296]=__GLeeLink_GL_EXT_texture_integer; - __GLeeGLLoadFunction[297]=__GLeeLink_GL_GREMEDY_frame_terminator; - __GLeeGLLoadFunction[298]=__GLeeLink_GL_NV_conditional_render; - __GLeeGLLoadFunction[299]=__GLeeLink_GL_NV_present_video; - __GLeeGLLoadFunction[300]=__GLeeLink_GL_EXT_transform_feedback; - __GLeeGLLoadFunction[301]=__GLeeLink_GL_EXT_direct_state_access; - __GLeeGLLoadFunction[302]=__GLeeLink_GL_EXT_vertex_array_bgra; - __GLeeGLLoadFunction[303]=__GLeeLink_GL_EXT_texture_swizzle; - __GLeeGLLoadFunction[304]=__GLeeLink_GL_NV_explicit_multisample; - __GLeeGLLoadFunction[305]=__GLeeLink_GL_NV_transform_feedback2; - __GLeeGLLoadFunction[306]=__GLeeLink_GL_SGIX_texture_select; - __GLeeGLLoadFunction[307]=__GLeeLink_GL_INGR_blend_func_separate; - __GLeeGLLoadFunction[308]=__GLeeLink_GL_SGIX_depth_pass_instrument; - __GLeeGLLoadFunction[309]=__GLeeLink_GL_SGIX_igloo_interface; - __GLeeGLLoadFunction[310]=__GLeeLink_GL_EXT_fragment_lighting; - __GLeeGLLoadFunction[311]=__GLeeLink_GL_EXT_geometry_shader4; - __GLeeGLLoadFunction[312]=__GLeeLink_GL_EXT_scene_marker; - __GLeeGLLoadFunction[313]=__GLeeLink_GL_EXT_texture_compression_dxt1; - __GLeeGLLoadFunction[314]=__GLeeLink_GL_EXT_texture_env; - __GLeeGLLoadFunction[315]=__GLeeLink_GL_IBM_static_data; - __GLeeGLLoadFunction[316]=__GLeeLink_GL_NV_gpu_program4; - __GLeeGLLoadFunction[317]=__GLeeLink_GL_OES_byte_coordinates; - __GLeeGLLoadFunction[318]=__GLeeLink_GL_OES_compressed_paletted_texture; - __GLeeGLLoadFunction[319]=__GLeeLink_GL_OES_single_precision; - __GLeeGLLoadFunction[320]=__GLeeLink_GL_SGIX_pixel_texture_bits; - __GLeeGLLoadFunction[321]=__GLeeLink_GL_SGIX_texture_range; -} - -#ifdef WIN32 -GLuint __GLeeLink_WGL_ARB_buffer_region(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_buffer_region - if ((GLeeFuncPtr_wglCreateBufferRegionARB = (GLEEPFNWGLCREATEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglCreateBufferRegionARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDeleteBufferRegionARB = (GLEEPFNWGLDELETEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglDeleteBufferRegionARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSaveBufferRegionARB = (GLEEPFNWGLSAVEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglSaveBufferRegionARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglRestoreBufferRegionARB = (GLEEPFNWGLRESTOREBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglRestoreBufferRegionARB"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_ARB_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_ARB_extensions_string(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_extensions_string - if ((GLeeFuncPtr_wglGetExtensionsStringARB = (GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) __GLeeGetProcAddress("wglGetExtensionsStringARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_ARB_pixel_format(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_pixel_format - if ((GLeeFuncPtr_wglGetPixelFormatAttribivARB = (GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribivARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetPixelFormatAttribfvARB = (GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribfvARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglChoosePixelFormatARB = (GLEEPFNWGLCHOOSEPIXELFORMATARBPROC) __GLeeGetProcAddress("wglChoosePixelFormatARB"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_ARB_make_current_read(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_make_current_read - if ((GLeeFuncPtr_wglMakeContextCurrentARB = (GLEEPFNWGLMAKECONTEXTCURRENTARBPROC) __GLeeGetProcAddress("wglMakeContextCurrentARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetCurrentReadDCARB = (GLEEPFNWGLGETCURRENTREADDCARBPROC) __GLeeGetProcAddress("wglGetCurrentReadDCARB"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_ARB_pbuffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_pbuffer - if ((GLeeFuncPtr_wglCreatePbufferARB = (GLEEPFNWGLCREATEPBUFFERARBPROC) __GLeeGetProcAddress("wglCreatePbufferARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetPbufferDCARB = (GLEEPFNWGLGETPBUFFERDCARBPROC) __GLeeGetProcAddress("wglGetPbufferDCARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglReleasePbufferDCARB = (GLEEPFNWGLRELEASEPBUFFERDCARBPROC) __GLeeGetProcAddress("wglReleasePbufferDCARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDestroyPbufferARB = (GLEEPFNWGLDESTROYPBUFFERARBPROC) __GLeeGetProcAddress("wglDestroyPbufferARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryPbufferARB = (GLEEPFNWGLQUERYPBUFFERARBPROC) __GLeeGetProcAddress("wglQueryPbufferARB"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_ARB_render_texture(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_render_texture - if ((GLeeFuncPtr_wglBindTexImageARB = (GLEEPFNWGLBINDTEXIMAGEARBPROC) __GLeeGetProcAddress("wglBindTexImageARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglReleaseTexImageARB = (GLEEPFNWGLRELEASETEXIMAGEARBPROC) __GLeeGetProcAddress("wglReleaseTexImageARB"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSetPbufferAttribARB = (GLEEPFNWGLSETPBUFFERATTRIBARBPROC) __GLeeGetProcAddress("wglSetPbufferAttribARB"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_ARB_pixel_format_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_ARB_create_context(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_ARB_create_context - if ((GLeeFuncPtr_wglCreateContextAttribsARB = (GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC) __GLeeGetProcAddress("wglCreateContextAttribsARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_make_current_read(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_EXT_make_current_read - if ((GLeeFuncPtr_wglMakeContextCurrentEXT = (GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC) __GLeeGetProcAddress("wglMakeContextCurrentEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetCurrentReadDCEXT = (GLEEPFNWGLGETCURRENTREADDCEXTPROC) __GLeeGetProcAddress("wglGetCurrentReadDCEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_pixel_format(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_EXT_pixel_format - if ((GLeeFuncPtr_wglGetPixelFormatAttribivEXT = (GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribivEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetPixelFormatAttribfvEXT = (GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribfvEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglChoosePixelFormatEXT = (GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC) __GLeeGetProcAddress("wglChoosePixelFormatEXT"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_pbuffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_EXT_pbuffer - if ((GLeeFuncPtr_wglCreatePbufferEXT = (GLEEPFNWGLCREATEPBUFFEREXTPROC) __GLeeGetProcAddress("wglCreatePbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetPbufferDCEXT = (GLEEPFNWGLGETPBUFFERDCEXTPROC) __GLeeGetProcAddress("wglGetPbufferDCEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglReleasePbufferDCEXT = (GLEEPFNWGLRELEASEPBUFFERDCEXTPROC) __GLeeGetProcAddress("wglReleasePbufferDCEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDestroyPbufferEXT = (GLEEPFNWGLDESTROYPBUFFEREXTPROC) __GLeeGetProcAddress("wglDestroyPbufferEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryPbufferEXT = (GLEEPFNWGLQUERYPBUFFEREXTPROC) __GLeeGetProcAddress("wglQueryPbufferEXT"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_depth_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_EXT_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_I3D_digital_video_control(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_I3D_digital_video_control - if ((GLeeFuncPtr_wglGetDigitalVideoParametersI3D = (GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) __GLeeGetProcAddress("wglGetDigitalVideoParametersI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSetDigitalVideoParametersI3D = (GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) __GLeeGetProcAddress("wglSetDigitalVideoParametersI3D"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_I3D_gamma(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_I3D_gamma - if ((GLeeFuncPtr_wglGetGammaTableParametersI3D = (GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC) __GLeeGetProcAddress("wglGetGammaTableParametersI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSetGammaTableParametersI3D = (GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC) __GLeeGetProcAddress("wglSetGammaTableParametersI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetGammaTableI3D = (GLEEPFNWGLGETGAMMATABLEI3DPROC) __GLeeGetProcAddress("wglGetGammaTableI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSetGammaTableI3D = (GLEEPFNWGLSETGAMMATABLEI3DPROC) __GLeeGetProcAddress("wglSetGammaTableI3D"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_I3D_genlock(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_I3D_genlock - if ((GLeeFuncPtr_wglEnableGenlockI3D = (GLEEPFNWGLENABLEGENLOCKI3DPROC) __GLeeGetProcAddress("wglEnableGenlockI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDisableGenlockI3D = (GLEEPFNWGLDISABLEGENLOCKI3DPROC) __GLeeGetProcAddress("wglDisableGenlockI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglIsEnabledGenlockI3D = (GLEEPFNWGLISENABLEDGENLOCKI3DPROC) __GLeeGetProcAddress("wglIsEnabledGenlockI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGenlockSourceI3D = (GLEEPFNWGLGENLOCKSOURCEI3DPROC) __GLeeGetProcAddress("wglGenlockSourceI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetGenlockSourceI3D = (GLEEPFNWGLGETGENLOCKSOURCEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGenlockSourceEdgeI3D = (GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC) __GLeeGetProcAddress("wglGenlockSourceEdgeI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetGenlockSourceEdgeI3D = (GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceEdgeI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGenlockSampleRateI3D = (GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC) __GLeeGetProcAddress("wglGenlockSampleRateI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetGenlockSampleRateI3D = (GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSampleRateI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGenlockSourceDelayI3D = (GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglGenlockSourceDelayI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetGenlockSourceDelayI3D = (GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceDelayI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D = (GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglQueryGenlockMaxSourceDelayI3D"))!=0) nLinked++; -#endif - if (nLinked==12) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_I3D_image_buffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_I3D_image_buffer - if ((GLeeFuncPtr_wglCreateImageBufferI3D = (GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC) __GLeeGetProcAddress("wglCreateImageBufferI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDestroyImageBufferI3D = (GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC) __GLeeGetProcAddress("wglDestroyImageBufferI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglAssociateImageBufferEventsI3D = (GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) __GLeeGetProcAddress("wglAssociateImageBufferEventsI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglReleaseImageBufferEventsI3D = (GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) __GLeeGetProcAddress("wglReleaseImageBufferEventsI3D"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_I3D_swap_frame_lock(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_I3D_swap_frame_lock - if ((GLeeFuncPtr_wglEnableFrameLockI3D = (GLEEPFNWGLENABLEFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglEnableFrameLockI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDisableFrameLockI3D = (GLEEPFNWGLDISABLEFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglDisableFrameLockI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglIsEnabledFrameLockI3D = (GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglIsEnabledFrameLockI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryFrameLockMasterI3D = (GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC) __GLeeGetProcAddress("wglQueryFrameLockMasterI3D"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_NV_render_depth_texture(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_NV_render_texture_rectangle(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_ATI_pixel_format_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_3DL_stereo_control(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_EXT_pixel_format_packed_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_WGL_NV_present_video(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_NV_present_video - if ((GLeeFuncPtr_wglEnumerateVideoDevicesNV = (GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC) __GLeeGetProcAddress("wglEnumerateVideoDevicesNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglBindVideoDeviceNV = (GLEEPFNWGLBINDVIDEODEVICENVPROC) __GLeeGetProcAddress("wglBindVideoDeviceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryCurrentContextNV = (GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC) __GLeeGetProcAddress("wglQueryCurrentContextNV"))!=0) nLinked++; -#endif - if (nLinked==3) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_NV_swap_group(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_NV_swap_group - if ((GLeeFuncPtr_wglJoinSwapGroupNV = (GLEEPFNWGLJOINSWAPGROUPNVPROC) __GLeeGetProcAddress("wglJoinSwapGroupNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglBindSwapBarrierNV = (GLEEPFNWGLBINDSWAPBARRIERNVPROC) __GLeeGetProcAddress("wglBindSwapBarrierNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQuerySwapGroupNV = (GLEEPFNWGLQUERYSWAPGROUPNVPROC) __GLeeGetProcAddress("wglQuerySwapGroupNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryMaxSwapGroupsNV = (GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC) __GLeeGetProcAddress("wglQueryMaxSwapGroupsNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryFrameCountNV = (GLEEPFNWGLQUERYFRAMECOUNTNVPROC) __GLeeGetProcAddress("wglQueryFrameCountNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglResetFrameCountNV = (GLEEPFNWGLRESETFRAMECOUNTNVPROC) __GLeeGetProcAddress("wglResetFrameCountNV"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_NV_gpu_affinity(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_NV_gpu_affinity - if ((GLeeFuncPtr_wglEnumGpusNV = (GLEEPFNWGLENUMGPUSNVPROC) __GLeeGetProcAddress("wglEnumGpusNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglEnumGpuDevicesNV = (GLEEPFNWGLENUMGPUDEVICESNVPROC) __GLeeGetProcAddress("wglEnumGpuDevicesNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglCreateAffinityDCNV = (GLEEPFNWGLCREATEAFFINITYDCNVPROC) __GLeeGetProcAddress("wglCreateAffinityDCNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglEnumGpusFromAffinityDCNV = (GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC) __GLeeGetProcAddress("wglEnumGpusFromAffinityDCNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDeleteDCNV = (GLEEPFNWGLDELETEDCNVPROC) __GLeeGetProcAddress("wglDeleteDCNV"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_display_color_table(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_EXT_display_color_table - if ((GLeeFuncPtr_wglCreateDisplayColorTableEXT = (GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglCreateDisplayColorTableEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglLoadDisplayColorTableEXT = (GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglLoadDisplayColorTableEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglBindDisplayColorTableEXT = (GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglBindDisplayColorTableEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglDestroyDisplayColorTableEXT = (GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglDestroyDisplayColorTableEXT"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_extensions_string(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_EXT_extensions_string - if ((GLeeFuncPtr_wglGetExtensionsStringEXT = (GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC) __GLeeGetProcAddress("wglGetExtensionsStringEXT"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_EXT_swap_control(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_EXT_swap_control - if ((GLeeFuncPtr_wglSwapIntervalEXT = (GLEEPFNWGLSWAPINTERVALEXTPROC) __GLeeGetProcAddress("wglSwapIntervalEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetSwapIntervalEXT = (GLEEPFNWGLGETSWAPINTERVALEXTPROC) __GLeeGetProcAddress("wglGetSwapIntervalEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_NV_vertex_array_range(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_NV_vertex_array_range - if ((GLeeFuncPtr_wglAllocateMemoryNV = (GLEEPFNWGLALLOCATEMEMORYNVPROC) __GLeeGetProcAddress("wglAllocateMemoryNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglFreeMemoryNV = (GLEEPFNWGLFREEMEMORYNVPROC) __GLeeGetProcAddress("wglFreeMemoryNV"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_OML_sync_control(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_OML_sync_control - if ((GLeeFuncPtr_wglGetSyncValuesOML = (GLEEPFNWGLGETSYNCVALUESOMLPROC) __GLeeGetProcAddress("wglGetSyncValuesOML"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetMscRateOML = (GLEEPFNWGLGETMSCRATEOMLPROC) __GLeeGetProcAddress("wglGetMscRateOML"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSwapBuffersMscOML = (GLEEPFNWGLSWAPBUFFERSMSCOMLPROC) __GLeeGetProcAddress("wglSwapBuffersMscOML"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSwapLayerBuffersMscOML = (GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC) __GLeeGetProcAddress("wglSwapLayerBuffersMscOML"))!=0) nLinked++; - if ((GLeeFuncPtr_wglWaitForMscOML = (GLEEPFNWGLWAITFORMSCOMLPROC) __GLeeGetProcAddress("wglWaitForMscOML"))!=0) nLinked++; - if ((GLeeFuncPtr_wglWaitForSbcOML = (GLEEPFNWGLWAITFORSBCOMLPROC) __GLeeGetProcAddress("wglWaitForSbcOML"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_I3D_swap_frame_usage(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_I3D_swap_frame_usage - if ((GLeeFuncPtr_wglGetFrameUsageI3D = (GLEEPFNWGLGETFRAMEUSAGEI3DPROC) __GLeeGetProcAddress("wglGetFrameUsageI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglBeginFrameTrackingI3D = (GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglBeginFrameTrackingI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglEndFrameTrackingI3D = (GLEEPFNWGLENDFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglEndFrameTrackingI3D"))!=0) nLinked++; - if ((GLeeFuncPtr_wglQueryFrameTrackingI3D = (GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglQueryFrameTrackingI3D"))!=0) nLinked++; -#endif - if (nLinked==4) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_WGL_NV_video_output(void) -{ - GLint nLinked=0; -#ifdef __GLEE_WGL_NV_video_output - if ((GLeeFuncPtr_wglGetVideoDeviceNV = (GLEEPFNWGLGETVIDEODEVICENVPROC) __GLeeGetProcAddress("wglGetVideoDeviceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglReleaseVideoDeviceNV = (GLEEPFNWGLRELEASEVIDEODEVICENVPROC) __GLeeGetProcAddress("wglReleaseVideoDeviceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglBindVideoImageNV = (GLEEPFNWGLBINDVIDEOIMAGENVPROC) __GLeeGetProcAddress("wglBindVideoImageNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglReleaseVideoImageNV = (GLEEPFNWGLRELEASEVIDEOIMAGENVPROC) __GLeeGetProcAddress("wglReleaseVideoImageNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglSendPbufferToVideoNV = (GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC) __GLeeGetProcAddress("wglSendPbufferToVideoNV"))!=0) nLinked++; - if ((GLeeFuncPtr_wglGetVideoInfoNV = (GLEEPFNWGLGETVIDEOINFONVPROC) __GLeeGetProcAddress("wglGetVideoInfoNV"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLEE_LINK_FUNCTION __GLeeWGLLoadFunction[37]; - -void initWGLLoadFunctions(void) -{ - __GLeeWGLLoadFunction[0]=__GLeeLink_WGL_ARB_buffer_region; - __GLeeWGLLoadFunction[1]=__GLeeLink_WGL_ARB_multisample; - __GLeeWGLLoadFunction[2]=__GLeeLink_WGL_ARB_extensions_string; - __GLeeWGLLoadFunction[3]=__GLeeLink_WGL_ARB_pixel_format; - __GLeeWGLLoadFunction[4]=__GLeeLink_WGL_ARB_make_current_read; - __GLeeWGLLoadFunction[5]=__GLeeLink_WGL_ARB_pbuffer; - __GLeeWGLLoadFunction[6]=__GLeeLink_WGL_ARB_render_texture; - __GLeeWGLLoadFunction[7]=__GLeeLink_WGL_ARB_pixel_format_float; - __GLeeWGLLoadFunction[8]=__GLeeLink_WGL_ARB_create_context; - __GLeeWGLLoadFunction[9]=__GLeeLink_WGL_EXT_make_current_read; - __GLeeWGLLoadFunction[10]=__GLeeLink_WGL_EXT_pixel_format; - __GLeeWGLLoadFunction[11]=__GLeeLink_WGL_EXT_pbuffer; - __GLeeWGLLoadFunction[12]=__GLeeLink_WGL_EXT_depth_float; - __GLeeWGLLoadFunction[13]=__GLeeLink_WGL_3DFX_multisample; - __GLeeWGLLoadFunction[14]=__GLeeLink_WGL_EXT_multisample; - __GLeeWGLLoadFunction[15]=__GLeeLink_WGL_I3D_digital_video_control; - __GLeeWGLLoadFunction[16]=__GLeeLink_WGL_I3D_gamma; - __GLeeWGLLoadFunction[17]=__GLeeLink_WGL_I3D_genlock; - __GLeeWGLLoadFunction[18]=__GLeeLink_WGL_I3D_image_buffer; - __GLeeWGLLoadFunction[19]=__GLeeLink_WGL_I3D_swap_frame_lock; - __GLeeWGLLoadFunction[20]=__GLeeLink_WGL_NV_render_depth_texture; - __GLeeWGLLoadFunction[21]=__GLeeLink_WGL_NV_render_texture_rectangle; - __GLeeWGLLoadFunction[22]=__GLeeLink_WGL_ATI_pixel_format_float; - __GLeeWGLLoadFunction[23]=__GLeeLink_WGL_NV_float_buffer; - __GLeeWGLLoadFunction[24]=__GLeeLink_WGL_3DL_stereo_control; - __GLeeWGLLoadFunction[25]=__GLeeLink_WGL_EXT_pixel_format_packed_float; - __GLeeWGLLoadFunction[26]=__GLeeLink_WGL_EXT_framebuffer_sRGB; - __GLeeWGLLoadFunction[27]=__GLeeLink_WGL_NV_present_video; - __GLeeWGLLoadFunction[28]=__GLeeLink_WGL_NV_swap_group; - __GLeeWGLLoadFunction[29]=__GLeeLink_WGL_NV_gpu_affinity; - __GLeeWGLLoadFunction[30]=__GLeeLink_WGL_EXT_display_color_table; - __GLeeWGLLoadFunction[31]=__GLeeLink_WGL_EXT_extensions_string; - __GLeeWGLLoadFunction[32]=__GLeeLink_WGL_EXT_swap_control; - __GLeeWGLLoadFunction[33]=__GLeeLink_WGL_NV_vertex_array_range; - __GLeeWGLLoadFunction[34]=__GLeeLink_WGL_OML_sync_control; - __GLeeWGLLoadFunction[35]=__GLeeLink_WGL_I3D_swap_frame_usage; - __GLeeWGLLoadFunction[36]=__GLeeLink_WGL_NV_video_output; -} - -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else /* Linux */ -GLuint __GLeeLink_GLX_VERSION_1_3(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_VERSION_1_3 - if ((GLeeFuncPtr_glXGetFBConfigs = (GLEEPFNGLXGETFBCONFIGSPROC) __GLeeGetProcAddress("glXGetFBConfigs"))!=0) nLinked++; - if ((GLeeFuncPtr_glXChooseFBConfig = (GLEEPFNGLXCHOOSEFBCONFIGPROC) __GLeeGetProcAddress("glXChooseFBConfig"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetFBConfigAttrib = (GLEEPFNGLXGETFBCONFIGATTRIBPROC) __GLeeGetProcAddress("glXGetFBConfigAttrib"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetVisualFromFBConfig = (GLEEPFNGLXGETVISUALFROMFBCONFIGPROC) __GLeeGetProcAddress("glXGetVisualFromFBConfig"))!=0) nLinked++; - if ((GLeeFuncPtr_glXCreateWindow = (GLEEPFNGLXCREATEWINDOWPROC) __GLeeGetProcAddress("glXCreateWindow"))!=0) nLinked++; - if ((GLeeFuncPtr_glXDestroyWindow = (GLEEPFNGLXDESTROYWINDOWPROC) __GLeeGetProcAddress("glXDestroyWindow"))!=0) nLinked++; - if ((GLeeFuncPtr_glXCreatePixmap = (GLEEPFNGLXCREATEPIXMAPPROC) __GLeeGetProcAddress("glXCreatePixmap"))!=0) nLinked++; - if ((GLeeFuncPtr_glXDestroyPixmap = (GLEEPFNGLXDESTROYPIXMAPPROC) __GLeeGetProcAddress("glXDestroyPixmap"))!=0) nLinked++; - if ((GLeeFuncPtr_glXCreatePbuffer = (GLEEPFNGLXCREATEPBUFFERPROC) __GLeeGetProcAddress("glXCreatePbuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glXDestroyPbuffer = (GLEEPFNGLXDESTROYPBUFFERPROC) __GLeeGetProcAddress("glXDestroyPbuffer"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryDrawable = (GLEEPFNGLXQUERYDRAWABLEPROC) __GLeeGetProcAddress("glXQueryDrawable"))!=0) nLinked++; - if ((GLeeFuncPtr_glXCreateNewContext = (GLEEPFNGLXCREATENEWCONTEXTPROC) __GLeeGetProcAddress("glXCreateNewContext"))!=0) nLinked++; - if ((GLeeFuncPtr_glXMakeContextCurrent = (GLEEPFNGLXMAKECONTEXTCURRENTPROC) __GLeeGetProcAddress("glXMakeContextCurrent"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetCurrentReadDrawable = (GLEEPFNGLXGETCURRENTREADDRAWABLEPROC) __GLeeGetProcAddress("glXGetCurrentReadDrawable"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetCurrentDisplay = (GLEEPFNGLXGETCURRENTDISPLAYPROC) __GLeeGetProcAddress("glXGetCurrentDisplay"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryContext = (GLEEPFNGLXQUERYCONTEXTPROC) __GLeeGetProcAddress("glXQueryContext"))!=0) nLinked++; - if ((GLeeFuncPtr_glXSelectEvent = (GLEEPFNGLXSELECTEVENTPROC) __GLeeGetProcAddress("glXSelectEvent"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetSelectedEvent = (GLEEPFNGLXGETSELECTEDEVENTPROC) __GLeeGetProcAddress("glXGetSelectedEvent"))!=0) nLinked++; -#endif - if (nLinked==18) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_VERSION_1_4(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_VERSION_1_4 - if ((GLeeFuncPtr_glXGetProcAddress = (GLEEPFNGLXGETPROCADDRESSPROC) __GLeeGetProcAddress("glXGetProcAddress"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_ARB_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_ARB_fbconfig_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_ARB_create_context(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_ARB_create_context - if ((GLeeFuncPtr_glXCreateContextAttribsARB = (GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC) __GLeeGetProcAddress("glXCreateContextAttribsARB"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIS_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_EXT_visual_info(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_SGI_swap_control(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGI_swap_control - if ((GLeeFuncPtr_glXSwapIntervalSGI = (GLEEPFNGLXSWAPINTERVALSGIPROC) __GLeeGetProcAddress("glXSwapIntervalSGI"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGI_video_sync(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGI_video_sync - if ((GLeeFuncPtr_glXGetVideoSyncSGI = (GLEEPFNGLXGETVIDEOSYNCSGIPROC) __GLeeGetProcAddress("glXGetVideoSyncSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glXWaitVideoSyncSGI = (GLEEPFNGLXWAITVIDEOSYNCSGIPROC) __GLeeGetProcAddress("glXWaitVideoSyncSGI"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGI_make_current_read(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGI_make_current_read - if ((GLeeFuncPtr_glXMakeCurrentReadSGI = (GLEEPFNGLXMAKECURRENTREADSGIPROC) __GLeeGetProcAddress("glXMakeCurrentReadSGI"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetCurrentReadDrawableSGI = (GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC) __GLeeGetProcAddress("glXGetCurrentReadDrawableSGI"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_EXT_visual_rating(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_EXT_import_context(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_EXT_import_context - if ((GLeeFuncPtr_glXGetCurrentDisplayEXT = (GLEEPFNGLXGETCURRENTDISPLAYEXTPROC) __GLeeGetProcAddress("glXGetCurrentDisplayEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryContextInfoEXT = (GLEEPFNGLXQUERYCONTEXTINFOEXTPROC) __GLeeGetProcAddress("glXQueryContextInfoEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetContextIDEXT = (GLEEPFNGLXGETCONTEXTIDEXTPROC) __GLeeGetProcAddress("glXGetContextIDEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glXImportContextEXT = (GLEEPFNGLXIMPORTCONTEXTEXTPROC) __GLeeGetProcAddress("glXImportContextEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glXFreeContextEXT = (GLEEPFNGLXFREECONTEXTEXTPROC) __GLeeGetProcAddress("glXFreeContextEXT"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIX_fbconfig(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGIX_fbconfig - if ((GLeeFuncPtr_glXGetFBConfigAttribSGIX = (GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC) __GLeeGetProcAddress("glXGetFBConfigAttribSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXChooseFBConfigSGIX = (GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC) __GLeeGetProcAddress("glXChooseFBConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX = (GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) __GLeeGetProcAddress("glXCreateGLXPixmapWithConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXCreateContextWithConfigSGIX = (GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) __GLeeGetProcAddress("glXCreateContextWithConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetVisualFromFBConfigSGIX = (GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC) __GLeeGetProcAddress("glXGetVisualFromFBConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetFBConfigFromVisualSGIX = (GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC) __GLeeGetProcAddress("glXGetFBConfigFromVisualSGIX"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIX_pbuffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGIX_pbuffer - if ((GLeeFuncPtr_glXCreateGLXPbufferSGIX = (GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXCreateGLXPbufferSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXDestroyGLXPbufferSGIX = (GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXDestroyGLXPbufferSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryGLXPbufferSGIX = (GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXQueryGLXPbufferSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXSelectEventSGIX = (GLEEPFNGLXSELECTEVENTSGIXPROC) __GLeeGetProcAddress("glXSelectEventSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetSelectedEventSGIX = (GLEEPFNGLXGETSELECTEDEVENTSGIXPROC) __GLeeGetProcAddress("glXGetSelectedEventSGIX"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGI_cushion(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGI_cushion - if ((GLeeFuncPtr_glXCushionSGI = (GLEEPFNGLXCUSHIONSGIPROC) __GLeeGetProcAddress("glXCushionSGI"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIX_video_resize(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGIX_video_resize - if ((GLeeFuncPtr_glXBindChannelToWindowSGIX = (GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC) __GLeeGetProcAddress("glXBindChannelToWindowSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXChannelRectSGIX = (GLEEPFNGLXCHANNELRECTSGIXPROC) __GLeeGetProcAddress("glXChannelRectSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryChannelRectSGIX = (GLEEPFNGLXQUERYCHANNELRECTSGIXPROC) __GLeeGetProcAddress("glXQueryChannelRectSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryChannelDeltasSGIX = (GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC) __GLeeGetProcAddress("glXQueryChannelDeltasSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXChannelRectSyncSGIX = (GLEEPFNGLXCHANNELRECTSYNCSGIXPROC) __GLeeGetProcAddress("glXChannelRectSyncSGIX"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIX_swap_group(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGIX_swap_group - if ((GLeeFuncPtr_glXJoinSwapGroupSGIX = (GLEEPFNGLXJOINSWAPGROUPSGIXPROC) __GLeeGetProcAddress("glXJoinSwapGroupSGIX"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIX_swap_barrier(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGIX_swap_barrier - if ((GLeeFuncPtr_glXBindSwapBarrierSGIX = (GLEEPFNGLXBINDSWAPBARRIERSGIXPROC) __GLeeGetProcAddress("glXBindSwapBarrierSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX = (GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) __GLeeGetProcAddress("glXQueryMaxSwapBarriersSGIX"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIS_blended_overlay(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_SGIS_shared_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_SUN_get_transparent_index(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SUN_get_transparent_index - if ((GLeeFuncPtr_glXGetTransparentIndexSUN = (GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC) __GLeeGetProcAddress("glXGetTransparentIndexSUN"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_MESA_copy_sub_buffer(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_MESA_copy_sub_buffer - if ((GLeeFuncPtr_glXCopySubBufferMESA = (GLEEPFNGLXCOPYSUBBUFFERMESAPROC) __GLeeGetProcAddress("glXCopySubBufferMESA"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_MESA_pixmap_colormap(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_MESA_pixmap_colormap - if ((GLeeFuncPtr_glXCreateGLXPixmapMESA = (GLEEPFNGLXCREATEGLXPIXMAPMESAPROC) __GLeeGetProcAddress("glXCreateGLXPixmapMESA"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_MESA_release_buffers(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_MESA_release_buffers - if ((GLeeFuncPtr_glXReleaseBuffersMESA = (GLEEPFNGLXRELEASEBUFFERSMESAPROC) __GLeeGetProcAddress("glXReleaseBuffersMESA"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_MESA_set_3dfx_mode(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_MESA_set_3dfx_mode - if ((GLeeFuncPtr_glXSet3DfxModeMESA = (GLEEPFNGLXSET3DFXMODEMESAPROC) __GLeeGetProcAddress("glXSet3DfxModeMESA"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_SGIX_visual_select_group(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_OML_swap_method(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_OML_sync_control(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_OML_sync_control - if ((GLeeFuncPtr_glXGetSyncValuesOML = (GLEEPFNGLXGETSYNCVALUESOMLPROC) __GLeeGetProcAddress("glXGetSyncValuesOML"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetMscRateOML = (GLEEPFNGLXGETMSCRATEOMLPROC) __GLeeGetProcAddress("glXGetMscRateOML"))!=0) nLinked++; - if ((GLeeFuncPtr_glXSwapBuffersMscOML = (GLEEPFNGLXSWAPBUFFERSMSCOMLPROC) __GLeeGetProcAddress("glXSwapBuffersMscOML"))!=0) nLinked++; - if ((GLeeFuncPtr_glXWaitForMscOML = (GLEEPFNGLXWAITFORMSCOMLPROC) __GLeeGetProcAddress("glXWaitForMscOML"))!=0) nLinked++; - if ((GLeeFuncPtr_glXWaitForSbcOML = (GLEEPFNGLXWAITFORSBCOMLPROC) __GLeeGetProcAddress("glXWaitForSbcOML"))!=0) nLinked++; -#endif - if (nLinked==5) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_SGIX_hyperpipe(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_SGIX_hyperpipe - if ((GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX = (GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeNetworkSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXHyperpipeConfigSGIX = (GLEEPFNGLXHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXHyperpipeConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryHyperpipeConfigSGIX = (GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX = (GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXDestroyHyperpipeConfigSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXBindHyperpipeSGIX = (GLEEPFNGLXBINDHYPERPIPESGIXPROC) __GLeeGetProcAddress("glXBindHyperpipeSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX = (GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeBestAttribSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXHyperpipeAttribSGIX = (GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC) __GLeeGetProcAddress("glXHyperpipeAttribSGIX"))!=0) nLinked++; - if ((GLeeFuncPtr_glXQueryHyperpipeAttribSGIX = (GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeAttribSGIX"))!=0) nLinked++; -#endif - if (nLinked==8) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_MESA_agp_offset(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_MESA_agp_offset - if ((GLeeFuncPtr_glXGetAGPOffsetMESA = (GLEEPFNGLXGETAGPOFFSETMESAPROC) __GLeeGetProcAddress("glXGetAGPOffsetMESA"))!=0) nLinked++; -#endif - if (nLinked==1) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_EXT_fbconfig_packed_float(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_EXT_texture_from_pixmap(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_EXT_texture_from_pixmap - if ((GLeeFuncPtr_glXBindTexImageEXT = (GLEEPFNGLXBINDTEXIMAGEEXTPROC) __GLeeGetProcAddress("glXBindTexImageEXT"))!=0) nLinked++; - if ((GLeeFuncPtr_glXReleaseTexImageEXT = (GLEEPFNGLXRELEASETEXIMAGEEXTPROC) __GLeeGetProcAddress("glXReleaseTexImageEXT"))!=0) nLinked++; -#endif - if (nLinked==2) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLuint __GLeeLink_GLX_NV_present_video(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_NV_video_out(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_NV_swap_group(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_EXT_scene_marker(void) {return GLEE_LINK_COMPLETE;} - -GLuint __GLeeLink_GLX_NV_video_output(void) -{ - GLint nLinked=0; -#ifdef __GLEE_GLX_NV_video_output - if ((GLeeFuncPtr_glXGetVideoDeviceNV = (GLEEPFNGLXGETVIDEODEVICENVPROC) __GLeeGetProcAddress("glXGetVideoDeviceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glXReleaseVideoDeviceNV = (GLEEPFNGLXRELEASEVIDEODEVICENVPROC) __GLeeGetProcAddress("glXReleaseVideoDeviceNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glXBindVideoImageNV = (GLEEPFNGLXBINDVIDEOIMAGENVPROC) __GLeeGetProcAddress("glXBindVideoImageNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glXReleaseVideoImageNV = (GLEEPFNGLXRELEASEVIDEOIMAGENVPROC) __GLeeGetProcAddress("glXReleaseVideoImageNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glXSendPbufferToVideoNV = (GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC) __GLeeGetProcAddress("glXSendPbufferToVideoNV"))!=0) nLinked++; - if ((GLeeFuncPtr_glXGetVideoInfoNV = (GLEEPFNGLXGETVIDEOINFONVPROC) __GLeeGetProcAddress("glXGetVideoInfoNV"))!=0) nLinked++; -#endif - if (nLinked==6) return GLEE_LINK_COMPLETE; - if (nLinked==0) return GLEE_LINK_FAIL; - return GLEE_LINK_PARTIAL; -} - -GLEE_LINK_FUNCTION __GLeeGLXLoadFunction[40]; - -void initGLXLoadFunctions(void) -{ - __GLeeGLXLoadFunction[0]=__GLeeLink_GLX_VERSION_1_3; - __GLeeGLXLoadFunction[1]=__GLeeLink_GLX_VERSION_1_4; - __GLeeGLXLoadFunction[2]=__GLeeLink_GLX_ARB_multisample; - __GLeeGLXLoadFunction[3]=__GLeeLink_GLX_ARB_fbconfig_float; - __GLeeGLXLoadFunction[4]=__GLeeLink_GLX_ARB_create_context; - __GLeeGLXLoadFunction[5]=__GLeeLink_GLX_SGIS_multisample; - __GLeeGLXLoadFunction[6]=__GLeeLink_GLX_EXT_visual_info; - __GLeeGLXLoadFunction[7]=__GLeeLink_GLX_SGI_swap_control; - __GLeeGLXLoadFunction[8]=__GLeeLink_GLX_SGI_video_sync; - __GLeeGLXLoadFunction[9]=__GLeeLink_GLX_SGI_make_current_read; - __GLeeGLXLoadFunction[10]=__GLeeLink_GLX_EXT_visual_rating; - __GLeeGLXLoadFunction[11]=__GLeeLink_GLX_EXT_import_context; - __GLeeGLXLoadFunction[12]=__GLeeLink_GLX_SGIX_fbconfig; - __GLeeGLXLoadFunction[13]=__GLeeLink_GLX_SGIX_pbuffer; - __GLeeGLXLoadFunction[14]=__GLeeLink_GLX_SGI_cushion; - __GLeeGLXLoadFunction[15]=__GLeeLink_GLX_SGIX_video_resize; - __GLeeGLXLoadFunction[16]=__GLeeLink_GLX_SGIX_swap_group; - __GLeeGLXLoadFunction[17]=__GLeeLink_GLX_SGIX_swap_barrier; - __GLeeGLXLoadFunction[18]=__GLeeLink_GLX_SGIS_blended_overlay; - __GLeeGLXLoadFunction[19]=__GLeeLink_GLX_SGIS_shared_multisample; - __GLeeGLXLoadFunction[20]=__GLeeLink_GLX_SUN_get_transparent_index; - __GLeeGLXLoadFunction[21]=__GLeeLink_GLX_3DFX_multisample; - __GLeeGLXLoadFunction[22]=__GLeeLink_GLX_MESA_copy_sub_buffer; - __GLeeGLXLoadFunction[23]=__GLeeLink_GLX_MESA_pixmap_colormap; - __GLeeGLXLoadFunction[24]=__GLeeLink_GLX_MESA_release_buffers; - __GLeeGLXLoadFunction[25]=__GLeeLink_GLX_MESA_set_3dfx_mode; - __GLeeGLXLoadFunction[26]=__GLeeLink_GLX_SGIX_visual_select_group; - __GLeeGLXLoadFunction[27]=__GLeeLink_GLX_OML_swap_method; - __GLeeGLXLoadFunction[28]=__GLeeLink_GLX_OML_sync_control; - __GLeeGLXLoadFunction[29]=__GLeeLink_GLX_NV_float_buffer; - __GLeeGLXLoadFunction[30]=__GLeeLink_GLX_SGIX_hyperpipe; - __GLeeGLXLoadFunction[31]=__GLeeLink_GLX_MESA_agp_offset; - __GLeeGLXLoadFunction[32]=__GLeeLink_GLX_EXT_fbconfig_packed_float; - __GLeeGLXLoadFunction[33]=__GLeeLink_GLX_EXT_framebuffer_sRGB; - __GLeeGLXLoadFunction[34]=__GLeeLink_GLX_EXT_texture_from_pixmap; - __GLeeGLXLoadFunction[35]=__GLeeLink_GLX_NV_present_video; - __GLeeGLXLoadFunction[36]=__GLeeLink_GLX_NV_video_out; - __GLeeGLXLoadFunction[37]=__GLeeLink_GLX_NV_swap_group; - __GLeeGLXLoadFunction[38]=__GLeeLink_GLX_EXT_scene_marker; - __GLeeGLXLoadFunction[39]=__GLeeLink_GLX_NV_video_output; -} - -#endif /* end Linux */ - - -/***************************************************************** - * GLee internal types - *****************************************************************/ -typedef struct -{ - char ** names; - int * lengths; - int numNames; -}ExtensionList; - - -/***************************************************************** - * GLee internal variables - *****************************************************************/ -char GLeeErrorString[256]=""; - - -/***************************************************************** - * GLee internal functions - *****************************************************************/ - -void __GLeeExtList_init(ExtensionList *extList) -{ - extList->names=0; - extList->lengths=0; - extList->numNames=0; -} - -void __GLeeExtList_clean(ExtensionList *extList) -{ - int a; - for (a=0;anumNames;a++) - { - if (extList->names[a]!=0) free((void *)extList->names[a]); - } - if (extList->names!=0) free((void *)extList->names); - if (extList->lengths!=0) free((void *)extList->lengths); - extList->names=0; - extList->lengths=0; - extList->numNames=0; -} - -void __GLeeExtList_add(ExtensionList *extList, const char * extName) -{ - int length=strlen(extName)+1; - int i=extList->numNames; - int n=i+1; - if (i==0) - { - extList->lengths=(int *)malloc(sizeof(int)); - extList->names=(char **)malloc(sizeof(char *)); - }else - { - extList->lengths=(int *)realloc((void *)extList->lengths, n*sizeof(int)); - extList->names=(char **)realloc((void *)extList->names, n*sizeof(char *)); - } - extList->names[i]=(char *)malloc(length*sizeof(char)); - strcpy(extList->names[i],extName); - extList->lengths[i]=length; - extList->numNames++; -} - -const char *__GLeeGetExtStrPlat( void ) -{ -#ifdef WIN32 - if (!_GLEE_WGL_ARB_extensions_string) - wglGetExtensionsStringARB = (GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); - - if (wglGetExtensionsStringARB) - return (const char *)wglGetExtensionsStringARB(wglGetCurrentDC()); -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else - Display *dpy=glXGetCurrentDisplay(); - if(dpy) - { - int dpynr=DefaultScreen(dpy); - return (const char*)glXQueryExtensionsString(dpy,dpynr); - } -#endif - return 0; -} - -void __GLeeWriteError(const char * errorStr) -{ - int a=0; - for (a=0;a<256;a++) - { - GLeeErrorString[a]=errorStr[a]; - } - GLeeErrorString[255]='\0'; -} - -int __GLeeGetVersionNumber(char *versionStr) -{ - int major=(int)versionStr[0]-(int)'0'; - int minor=(int)versionStr[2]-(int)'0'; - return major<<8 | minor; -} - -GLboolean __GLeeGetExtensions(ExtensionList* extList) -{ - const char * platExtStr; - const char * glExtStr; - char * extStr; - char emptyString[1] = ""; - char extensionName[1024]; - int a,b; - int totalExtStrLen; - int platExtStrLen; - int addASpace; - - /* read the platform specific extension string */ - platExtStr=__GLeeGetExtStrPlat(); - if (!platExtStr) platExtStr=emptyString; - - glExtStr=(const char *)glGetString(GL_EXTENSIONS); - if (glExtStr==0) - { - __GLeeWriteError("glGetString(GL_EXTENSIONS) failed."); - return GL_FALSE; - } - - /* allocate the extension string */ - platExtStrLen = strlen(platExtStr); - totalExtStrLen = platExtStrLen + strlen(glExtStr); - extStr=(char *)malloc( (totalExtStrLen+2) * sizeof(char) ); /* we add 2 to allow for an extra space and a null terminator */ - - /* If the last character of platExtStr is not a space, we need to add one when we concatenate the extension strings*/ - addASpace = 0; - if ( platExtStrLen > 2 ) - { - if ( platExtStr[ platExtStrLen-1 ] != ' ') - { - addASpace = 1; - } - } - - /* concatenate the two extension strings */ - if ( addASpace ) - { - sprintf(extStr,"%s %s",platExtStr,glExtStr); - } - else - { - sprintf(extStr,"%s%s",platExtStr,glExtStr); - } - - /* extract the extensions */ - for ( a=0;anumNames; - int a; - for (a=0;anames[a],name)==0) - return GL_TRUE; - } - return GL_FALSE; -} - -GLEE_EXTERN GLint __GLeeGetExtensionNumber(const char *extensionName, int type) -{ - int a; - switch (type) - { - case 0: - for (a=0;a<__GLeeGLNumExtensions;a++) - if (strcmp(extensionName,__GLeeGLExtensionNames[a])==0) return a; - return -1; -#ifdef WIN32 - case 1: - for (a=0;a<__GLeeWGLNumExtensions;a++) - if (strcmp(extensionName,__GLeeWGLExtensionNames[a])==0) return a; - return -1; -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else - case 2: - for (a=0;a<__GLeeGLXNumExtensions;a++) - if (strcmp(extensionName,__GLeeGLXExtensionNames[a])==0) return a; - return -1; -#endif - } - return -1; -} - -/***************************************************************** - * GLee external functions - *****************************************************************/ - -#ifdef WIN32 -GLEE_EXTERN const char * GLeeGetExtStrWGL( void ) -{ - return __GLeeGetExtStrPlat(); -} -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else -GLEE_EXTERN const char * GLeeGetExtStrGLX( void ) -{ - return __GLeeGetExtStrPlat(); -} -#endif - -GLEE_EXTERN const char * GLeeGetExtStrGL( void ) -{ - return (const char *)glGetString(GL_EXTENSIONS); -} - -GLEE_EXTERN const char * GLeeGetErrorString( void ) -{ - return GLeeErrorString; -} - -GLboolean __GLeeInitedLoadFunctions=GL_FALSE; - -GLEE_EXTERN GLint GLeeForceLink(const char * extensionName) -{ - int type=0; - int extNum; - int len=strlen(extensionName); - if (len<5) return GLEE_LINK_FAIL; - if (!__GLeeInitedLoadFunctions) - { - if (!__GLeeInited) GLeeInit(); - initGLLoadFunctions(); -#ifdef WIN32 - initWGLLoadFunctions(); -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else - initGLXLoadFunctions(); -#endif - __GLeeInitedLoadFunctions=GL_TRUE; - } - if (extensionName[0]=='W') type=1; - else if (extensionName[2]=='X') type=2; - extNum=__GLeeGetExtensionNumber(extensionName,type); - if (extNum==-1) return GLEE_LINK_FAIL; - if (type==0) return __GLeeGLLoadFunction[extNum](); -#ifdef WIN32 - if (type==1) return __GLeeWGLLoadFunction[extNum](); -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else - if (type==2) return __GLeeGLXLoadFunction[extNum](); -#endif - return GLEE_LINK_FAIL; -} - -GLEE_EXTERN GLboolean GLeeEnabled(GLboolean * extensionQueryingVariable) -{ - if (!__GLeeInited) GLeeInit(); - return *extensionQueryingVariable; -} - -GLEE_EXTERN GLboolean GLeeInit( void ) -{ - int version; - ExtensionList extensionNames; - - if (__GLeeInited) - { - return GL_FALSE; - } - - __GLeeExtList_init(&extensionNames); - if (!__GLeeGetExtensions(&extensionNames)) - { - __GLeeWriteError("GL extension querying failed."); - __GLeeExtList_clean(&extensionNames); - return GL_FALSE; - } - - version=__GLeeGetVersionNumber((char *)glGetString(GL_VERSION)); - - __GLeeInited = GL_TRUE; - - -/***************************************************************** - * Autogenerated linking functions - *****************************************************************/ - if (version>=258) - { - _GLEE_VERSION_1_2 = GL_TRUE; - __GLeeLink_GL_VERSION_1_2(); - } - if (__GLeeCheckExtension("GL_ARB_imaging", &extensionNames) ) - { - _GLEE_ARB_imaging = GL_TRUE; - __GLeeLink_GL_ARB_imaging(); - } - if (version>=259) - { - _GLEE_VERSION_1_3 = GL_TRUE; - __GLeeLink_GL_VERSION_1_3(); - } - if (version>=260) - { - _GLEE_VERSION_1_4 = GL_TRUE; - __GLeeLink_GL_VERSION_1_4(); - } - if (version>=261) - { - _GLEE_VERSION_1_5 = GL_TRUE; - __GLeeLink_GL_VERSION_1_5(); - } - if (version>=512) - { - _GLEE_VERSION_2_0 = GL_TRUE; - __GLeeLink_GL_VERSION_2_0(); - } - if (version>=513) - { - _GLEE_VERSION_2_1 = GL_TRUE; - __GLeeLink_GL_VERSION_2_1(); - } - if (version>=768) - { - _GLEE_VERSION_3_0 = GL_TRUE; - __GLeeLink_GL_VERSION_3_0(); - } - if (__GLeeCheckExtension("GL_ARB_multitexture", &extensionNames) ) - { - _GLEE_ARB_multitexture = GL_TRUE; - __GLeeLink_GL_ARB_multitexture(); - } - if (__GLeeCheckExtension("GL_ARB_transpose_matrix", &extensionNames) ) - { - _GLEE_ARB_transpose_matrix = GL_TRUE; - __GLeeLink_GL_ARB_transpose_matrix(); - } - if (__GLeeCheckExtension("GL_ARB_multisample", &extensionNames) ) - { - _GLEE_ARB_multisample = GL_TRUE; - __GLeeLink_GL_ARB_multisample(); - } - if (__GLeeCheckExtension("GL_ARB_texture_env_add", &extensionNames) ) - { - _GLEE_ARB_texture_env_add = GL_TRUE; - __GLeeLink_GL_ARB_texture_env_add(); - } - if (__GLeeCheckExtension("GL_ARB_texture_cube_map", &extensionNames) ) - { - _GLEE_ARB_texture_cube_map = GL_TRUE; - __GLeeLink_GL_ARB_texture_cube_map(); - } - if (__GLeeCheckExtension("GL_ARB_texture_compression", &extensionNames) ) - { - _GLEE_ARB_texture_compression = GL_TRUE; - __GLeeLink_GL_ARB_texture_compression(); - } - if (__GLeeCheckExtension("GL_ARB_texture_border_clamp", &extensionNames) ) - { - _GLEE_ARB_texture_border_clamp = GL_TRUE; - __GLeeLink_GL_ARB_texture_border_clamp(); - } - if (__GLeeCheckExtension("GL_ARB_point_parameters", &extensionNames) ) - { - _GLEE_ARB_point_parameters = GL_TRUE; - __GLeeLink_GL_ARB_point_parameters(); - } - if (__GLeeCheckExtension("GL_ARB_vertex_blend", &extensionNames) ) - { - _GLEE_ARB_vertex_blend = GL_TRUE; - __GLeeLink_GL_ARB_vertex_blend(); - } - if (__GLeeCheckExtension("GL_ARB_matrix_palette", &extensionNames) ) - { - _GLEE_ARB_matrix_palette = GL_TRUE; - __GLeeLink_GL_ARB_matrix_palette(); - } - if (__GLeeCheckExtension("GL_ARB_texture_env_combine", &extensionNames) ) - { - _GLEE_ARB_texture_env_combine = GL_TRUE; - __GLeeLink_GL_ARB_texture_env_combine(); - } - if (__GLeeCheckExtension("GL_ARB_texture_env_crossbar", &extensionNames) ) - { - _GLEE_ARB_texture_env_crossbar = GL_TRUE; - __GLeeLink_GL_ARB_texture_env_crossbar(); - } - if (__GLeeCheckExtension("GL_ARB_texture_env_dot3", &extensionNames) ) - { - _GLEE_ARB_texture_env_dot3 = GL_TRUE; - __GLeeLink_GL_ARB_texture_env_dot3(); - } - if (__GLeeCheckExtension("GL_ARB_texture_mirrored_repeat", &extensionNames) ) - { - _GLEE_ARB_texture_mirrored_repeat = GL_TRUE; - __GLeeLink_GL_ARB_texture_mirrored_repeat(); - } - if (__GLeeCheckExtension("GL_ARB_depth_texture", &extensionNames) ) - { - _GLEE_ARB_depth_texture = GL_TRUE; - __GLeeLink_GL_ARB_depth_texture(); - } - if (__GLeeCheckExtension("GL_ARB_shadow", &extensionNames) ) - { - _GLEE_ARB_shadow = GL_TRUE; - __GLeeLink_GL_ARB_shadow(); - } - if (__GLeeCheckExtension("GL_ARB_shadow_ambient", &extensionNames) ) - { - _GLEE_ARB_shadow_ambient = GL_TRUE; - __GLeeLink_GL_ARB_shadow_ambient(); - } - if (__GLeeCheckExtension("GL_ARB_window_pos", &extensionNames) ) - { - _GLEE_ARB_window_pos = GL_TRUE; - __GLeeLink_GL_ARB_window_pos(); - } - if (__GLeeCheckExtension("GL_ARB_vertex_program", &extensionNames) ) - { - _GLEE_ARB_vertex_program = GL_TRUE; - __GLeeLink_GL_ARB_vertex_program(); - } - if (__GLeeCheckExtension("GL_ARB_fragment_program", &extensionNames) ) - { - _GLEE_ARB_fragment_program = GL_TRUE; - __GLeeLink_GL_ARB_fragment_program(); - } - if (__GLeeCheckExtension("GL_ARB_vertex_buffer_object", &extensionNames) ) - { - _GLEE_ARB_vertex_buffer_object = GL_TRUE; - __GLeeLink_GL_ARB_vertex_buffer_object(); - } - if (__GLeeCheckExtension("GL_ARB_occlusion_query", &extensionNames) ) - { - _GLEE_ARB_occlusion_query = GL_TRUE; - __GLeeLink_GL_ARB_occlusion_query(); - } - if (__GLeeCheckExtension("GL_ARB_shader_objects", &extensionNames) ) - { - _GLEE_ARB_shader_objects = GL_TRUE; - __GLeeLink_GL_ARB_shader_objects(); - } - if (__GLeeCheckExtension("GL_ARB_vertex_shader", &extensionNames) ) - { - _GLEE_ARB_vertex_shader = GL_TRUE; - __GLeeLink_GL_ARB_vertex_shader(); - } - if (__GLeeCheckExtension("GL_ARB_fragment_shader", &extensionNames) ) - { - _GLEE_ARB_fragment_shader = GL_TRUE; - __GLeeLink_GL_ARB_fragment_shader(); - } - if (__GLeeCheckExtension("GL_ARB_shading_language_100", &extensionNames) ) - { - _GLEE_ARB_shading_language_100 = GL_TRUE; - __GLeeLink_GL_ARB_shading_language_100(); - } - if (__GLeeCheckExtension("GL_ARB_texture_non_power_of_two", &extensionNames) ) - { - _GLEE_ARB_texture_non_power_of_two = GL_TRUE; - __GLeeLink_GL_ARB_texture_non_power_of_two(); - } - if (__GLeeCheckExtension("GL_ARB_point_sprite", &extensionNames) ) - { - _GLEE_ARB_point_sprite = GL_TRUE; - __GLeeLink_GL_ARB_point_sprite(); - } - if (__GLeeCheckExtension("GL_ARB_fragment_program_shadow", &extensionNames) ) - { - _GLEE_ARB_fragment_program_shadow = GL_TRUE; - __GLeeLink_GL_ARB_fragment_program_shadow(); - } - if (__GLeeCheckExtension("GL_ARB_draw_buffers", &extensionNames) ) - { - _GLEE_ARB_draw_buffers = GL_TRUE; - __GLeeLink_GL_ARB_draw_buffers(); - } - if (__GLeeCheckExtension("GL_ARB_texture_rectangle", &extensionNames) ) - { - _GLEE_ARB_texture_rectangle = GL_TRUE; - __GLeeLink_GL_ARB_texture_rectangle(); - } - if (__GLeeCheckExtension("GL_ARB_color_buffer_float", &extensionNames) ) - { - _GLEE_ARB_color_buffer_float = GL_TRUE; - __GLeeLink_GL_ARB_color_buffer_float(); - } - if (__GLeeCheckExtension("GL_ARB_half_float_pixel", &extensionNames) ) - { - _GLEE_ARB_half_float_pixel = GL_TRUE; - __GLeeLink_GL_ARB_half_float_pixel(); - } - if (__GLeeCheckExtension("GL_ARB_texture_float", &extensionNames) ) - { - _GLEE_ARB_texture_float = GL_TRUE; - __GLeeLink_GL_ARB_texture_float(); - } - if (__GLeeCheckExtension("GL_ARB_pixel_buffer_object", &extensionNames) ) - { - _GLEE_ARB_pixel_buffer_object = GL_TRUE; - __GLeeLink_GL_ARB_pixel_buffer_object(); - } - if (__GLeeCheckExtension("GL_ARB_depth_buffer_float", &extensionNames) ) - { - _GLEE_ARB_depth_buffer_float = GL_TRUE; - __GLeeLink_GL_ARB_depth_buffer_float(); - } - if (__GLeeCheckExtension("GL_ARB_draw_instanced", &extensionNames) ) - { - _GLEE_ARB_draw_instanced = GL_TRUE; - __GLeeLink_GL_ARB_draw_instanced(); - } - if (__GLeeCheckExtension("GL_ARB_framebuffer_object", &extensionNames) ) - { - _GLEE_ARB_framebuffer_object = GL_TRUE; - __GLeeLink_GL_ARB_framebuffer_object(); - } - if (__GLeeCheckExtension("GL_ARB_framebuffer_sRGB", &extensionNames) ) - { - _GLEE_ARB_framebuffer_sRGB = GL_TRUE; - __GLeeLink_GL_ARB_framebuffer_sRGB(); - } - if (__GLeeCheckExtension("GL_ARB_geometry_shader4", &extensionNames) ) - { - _GLEE_ARB_geometry_shader4 = GL_TRUE; - __GLeeLink_GL_ARB_geometry_shader4(); - } - if (__GLeeCheckExtension("GL_ARB_half_float_vertex", &extensionNames) ) - { - _GLEE_ARB_half_float_vertex = GL_TRUE; - __GLeeLink_GL_ARB_half_float_vertex(); - } - if (__GLeeCheckExtension("GL_ARB_instanced_arrays", &extensionNames) ) - { - _GLEE_ARB_instanced_arrays = GL_TRUE; - __GLeeLink_GL_ARB_instanced_arrays(); - } - if (__GLeeCheckExtension("GL_ARB_map_buffer_range", &extensionNames) ) - { - _GLEE_ARB_map_buffer_range = GL_TRUE; - __GLeeLink_GL_ARB_map_buffer_range(); - } - if (__GLeeCheckExtension("GL_ARB_texture_buffer_object", &extensionNames) ) - { - _GLEE_ARB_texture_buffer_object = GL_TRUE; - __GLeeLink_GL_ARB_texture_buffer_object(); - } - if (__GLeeCheckExtension("GL_ARB_texture_compression_rgtc", &extensionNames) ) - { - _GLEE_ARB_texture_compression_rgtc = GL_TRUE; - __GLeeLink_GL_ARB_texture_compression_rgtc(); - } - if (__GLeeCheckExtension("GL_ARB_texture_rg", &extensionNames) ) - { - _GLEE_ARB_texture_rg = GL_TRUE; - __GLeeLink_GL_ARB_texture_rg(); - } - if (__GLeeCheckExtension("GL_ARB_vertex_array_object", &extensionNames) ) - { - _GLEE_ARB_vertex_array_object = GL_TRUE; - __GLeeLink_GL_ARB_vertex_array_object(); - } - if (__GLeeCheckExtension("GL_EXT_abgr", &extensionNames) ) - { - _GLEE_EXT_abgr = GL_TRUE; - __GLeeLink_GL_EXT_abgr(); - } - if (__GLeeCheckExtension("GL_EXT_blend_color", &extensionNames) ) - { - _GLEE_EXT_blend_color = GL_TRUE; - __GLeeLink_GL_EXT_blend_color(); - } - if (__GLeeCheckExtension("GL_EXT_polygon_offset", &extensionNames) ) - { - _GLEE_EXT_polygon_offset = GL_TRUE; - __GLeeLink_GL_EXT_polygon_offset(); - } - if (__GLeeCheckExtension("GL_EXT_texture", &extensionNames) ) - { - _GLEE_EXT_texture = GL_TRUE; - __GLeeLink_GL_EXT_texture(); - } - if (__GLeeCheckExtension("GL_EXT_texture3D", &extensionNames) ) - { - _GLEE_EXT_texture3D = GL_TRUE; - __GLeeLink_GL_EXT_texture3D(); - } - if (__GLeeCheckExtension("GL_SGIS_texture_filter4", &extensionNames) ) - { - _GLEE_SGIS_texture_filter4 = GL_TRUE; - __GLeeLink_GL_SGIS_texture_filter4(); - } - if (__GLeeCheckExtension("GL_EXT_subtexture", &extensionNames) ) - { - _GLEE_EXT_subtexture = GL_TRUE; - __GLeeLink_GL_EXT_subtexture(); - } - if (__GLeeCheckExtension("GL_EXT_copy_texture", &extensionNames) ) - { - _GLEE_EXT_copy_texture = GL_TRUE; - __GLeeLink_GL_EXT_copy_texture(); - } - if (__GLeeCheckExtension("GL_EXT_histogram", &extensionNames) ) - { - _GLEE_EXT_histogram = GL_TRUE; - __GLeeLink_GL_EXT_histogram(); - } - if (__GLeeCheckExtension("GL_EXT_convolution", &extensionNames) ) - { - _GLEE_EXT_convolution = GL_TRUE; - __GLeeLink_GL_EXT_convolution(); - } - if (__GLeeCheckExtension("GL_SGI_color_matrix", &extensionNames) ) - { - _GLEE_SGI_color_matrix = GL_TRUE; - __GLeeLink_GL_SGI_color_matrix(); - } - if (__GLeeCheckExtension("GL_SGI_color_table", &extensionNames) ) - { - _GLEE_SGI_color_table = GL_TRUE; - __GLeeLink_GL_SGI_color_table(); - } - if (__GLeeCheckExtension("GL_SGIS_pixel_texture", &extensionNames) ) - { - _GLEE_SGIS_pixel_texture = GL_TRUE; - __GLeeLink_GL_SGIS_pixel_texture(); - } - if (__GLeeCheckExtension("GL_SGIX_pixel_texture", &extensionNames) ) - { - _GLEE_SGIX_pixel_texture = GL_TRUE; - __GLeeLink_GL_SGIX_pixel_texture(); - } - if (__GLeeCheckExtension("GL_SGIS_texture4D", &extensionNames) ) - { - _GLEE_SGIS_texture4D = GL_TRUE; - __GLeeLink_GL_SGIS_texture4D(); - } - if (__GLeeCheckExtension("GL_SGI_texture_color_table", &extensionNames) ) - { - _GLEE_SGI_texture_color_table = GL_TRUE; - __GLeeLink_GL_SGI_texture_color_table(); - } - if (__GLeeCheckExtension("GL_EXT_cmyka", &extensionNames) ) - { - _GLEE_EXT_cmyka = GL_TRUE; - __GLeeLink_GL_EXT_cmyka(); - } - if (__GLeeCheckExtension("GL_EXT_texture_object", &extensionNames) ) - { - _GLEE_EXT_texture_object = GL_TRUE; - __GLeeLink_GL_EXT_texture_object(); - } - if (__GLeeCheckExtension("GL_SGIS_detail_texture", &extensionNames) ) - { - _GLEE_SGIS_detail_texture = GL_TRUE; - __GLeeLink_GL_SGIS_detail_texture(); - } - if (__GLeeCheckExtension("GL_SGIS_sharpen_texture", &extensionNames) ) - { - _GLEE_SGIS_sharpen_texture = GL_TRUE; - __GLeeLink_GL_SGIS_sharpen_texture(); - } - if (__GLeeCheckExtension("GL_EXT_packed_pixels", &extensionNames) ) - { - _GLEE_EXT_packed_pixels = GL_TRUE; - __GLeeLink_GL_EXT_packed_pixels(); - } - if (__GLeeCheckExtension("GL_SGIS_texture_lod", &extensionNames) ) - { - _GLEE_SGIS_texture_lod = GL_TRUE; - __GLeeLink_GL_SGIS_texture_lod(); - } - if (__GLeeCheckExtension("GL_SGIS_multisample", &extensionNames) ) - { - _GLEE_SGIS_multisample = GL_TRUE; - __GLeeLink_GL_SGIS_multisample(); - } - if (__GLeeCheckExtension("GL_EXT_rescale_normal", &extensionNames) ) - { - _GLEE_EXT_rescale_normal = GL_TRUE; - __GLeeLink_GL_EXT_rescale_normal(); - } - if (__GLeeCheckExtension("GL_EXT_vertex_array", &extensionNames) ) - { - _GLEE_EXT_vertex_array = GL_TRUE; - __GLeeLink_GL_EXT_vertex_array(); - } - if (__GLeeCheckExtension("GL_EXT_misc_attribute", &extensionNames) ) - { - _GLEE_EXT_misc_attribute = GL_TRUE; - __GLeeLink_GL_EXT_misc_attribute(); - } - if (__GLeeCheckExtension("GL_SGIS_generate_mipmap", &extensionNames) ) - { - _GLEE_SGIS_generate_mipmap = GL_TRUE; - __GLeeLink_GL_SGIS_generate_mipmap(); - } - if (__GLeeCheckExtension("GL_SGIX_clipmap", &extensionNames) ) - { - _GLEE_SGIX_clipmap = GL_TRUE; - __GLeeLink_GL_SGIX_clipmap(); - } - if (__GLeeCheckExtension("GL_SGIX_shadow", &extensionNames) ) - { - _GLEE_SGIX_shadow = GL_TRUE; - __GLeeLink_GL_SGIX_shadow(); - } - if (__GLeeCheckExtension("GL_SGIS_texture_edge_clamp", &extensionNames) ) - { - _GLEE_SGIS_texture_edge_clamp = GL_TRUE; - __GLeeLink_GL_SGIS_texture_edge_clamp(); - } - if (__GLeeCheckExtension("GL_SGIS_texture_border_clamp", &extensionNames) ) - { - _GLEE_SGIS_texture_border_clamp = GL_TRUE; - __GLeeLink_GL_SGIS_texture_border_clamp(); - } - if (__GLeeCheckExtension("GL_EXT_blend_minmax", &extensionNames) ) - { - _GLEE_EXT_blend_minmax = GL_TRUE; - __GLeeLink_GL_EXT_blend_minmax(); - } - if (__GLeeCheckExtension("GL_EXT_blend_subtract", &extensionNames) ) - { - _GLEE_EXT_blend_subtract = GL_TRUE; - __GLeeLink_GL_EXT_blend_subtract(); - } - if (__GLeeCheckExtension("GL_EXT_blend_logic_op", &extensionNames) ) - { - _GLEE_EXT_blend_logic_op = GL_TRUE; - __GLeeLink_GL_EXT_blend_logic_op(); - } - if (__GLeeCheckExtension("GL_SGIX_interlace", &extensionNames) ) - { - _GLEE_SGIX_interlace = GL_TRUE; - __GLeeLink_GL_SGIX_interlace(); - } - if (__GLeeCheckExtension("GL_SGIX_pixel_tiles", &extensionNames) ) - { - _GLEE_SGIX_pixel_tiles = GL_TRUE; - __GLeeLink_GL_SGIX_pixel_tiles(); - } - if (__GLeeCheckExtension("GL_SGIS_texture_select", &extensionNames) ) - { - _GLEE_SGIS_texture_select = GL_TRUE; - __GLeeLink_GL_SGIS_texture_select(); - } - if (__GLeeCheckExtension("GL_SGIX_sprite", &extensionNames) ) - { - _GLEE_SGIX_sprite = GL_TRUE; - __GLeeLink_GL_SGIX_sprite(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_multi_buffer", &extensionNames) ) - { - _GLEE_SGIX_texture_multi_buffer = GL_TRUE; - __GLeeLink_GL_SGIX_texture_multi_buffer(); - } - if (__GLeeCheckExtension("GL_EXT_point_parameters", &extensionNames) ) - { - _GLEE_EXT_point_parameters = GL_TRUE; - __GLeeLink_GL_EXT_point_parameters(); - } - if (__GLeeCheckExtension("GL_SGIS_point_parameters", &extensionNames) ) - { - _GLEE_SGIS_point_parameters = GL_TRUE; - __GLeeLink_GL_SGIS_point_parameters(); - } - if (__GLeeCheckExtension("GL_SGIX_instruments", &extensionNames) ) - { - _GLEE_SGIX_instruments = GL_TRUE; - __GLeeLink_GL_SGIX_instruments(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_scale_bias", &extensionNames) ) - { - _GLEE_SGIX_texture_scale_bias = GL_TRUE; - __GLeeLink_GL_SGIX_texture_scale_bias(); - } - if (__GLeeCheckExtension("GL_SGIX_framezoom", &extensionNames) ) - { - _GLEE_SGIX_framezoom = GL_TRUE; - __GLeeLink_GL_SGIX_framezoom(); - } - if (__GLeeCheckExtension("GL_SGIX_tag_sample_buffer", &extensionNames) ) - { - _GLEE_SGIX_tag_sample_buffer = GL_TRUE; - __GLeeLink_GL_SGIX_tag_sample_buffer(); - } - if (__GLeeCheckExtension("GL_FfdMaskSGIX", &extensionNames) ) - { - _GLEE_FfdMaskSGIX = GL_TRUE; - __GLeeLink_GL_FfdMaskSGIX(); - } - if (__GLeeCheckExtension("GL_SGIX_polynomial_ffd", &extensionNames) ) - { - _GLEE_SGIX_polynomial_ffd = GL_TRUE; - __GLeeLink_GL_SGIX_polynomial_ffd(); - } - if (__GLeeCheckExtension("GL_SGIX_reference_plane", &extensionNames) ) - { - _GLEE_SGIX_reference_plane = GL_TRUE; - __GLeeLink_GL_SGIX_reference_plane(); - } - if (__GLeeCheckExtension("GL_SGIX_flush_raster", &extensionNames) ) - { - _GLEE_SGIX_flush_raster = GL_TRUE; - __GLeeLink_GL_SGIX_flush_raster(); - } - if (__GLeeCheckExtension("GL_SGIX_depth_texture", &extensionNames) ) - { - _GLEE_SGIX_depth_texture = GL_TRUE; - __GLeeLink_GL_SGIX_depth_texture(); - } - if (__GLeeCheckExtension("GL_SGIS_fog_function", &extensionNames) ) - { - _GLEE_SGIS_fog_function = GL_TRUE; - __GLeeLink_GL_SGIS_fog_function(); - } - if (__GLeeCheckExtension("GL_SGIX_fog_offset", &extensionNames) ) - { - _GLEE_SGIX_fog_offset = GL_TRUE; - __GLeeLink_GL_SGIX_fog_offset(); - } - if (__GLeeCheckExtension("GL_HP_image_transform", &extensionNames) ) - { - _GLEE_HP_image_transform = GL_TRUE; - __GLeeLink_GL_HP_image_transform(); - } - if (__GLeeCheckExtension("GL_HP_convolution_border_modes", &extensionNames) ) - { - _GLEE_HP_convolution_border_modes = GL_TRUE; - __GLeeLink_GL_HP_convolution_border_modes(); - } - if (__GLeeCheckExtension("GL_INGR_palette_buffer", &extensionNames) ) - { - _GLEE_INGR_palette_buffer = GL_TRUE; - __GLeeLink_GL_INGR_palette_buffer(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_add_env", &extensionNames) ) - { - _GLEE_SGIX_texture_add_env = GL_TRUE; - __GLeeLink_GL_SGIX_texture_add_env(); - } - if (__GLeeCheckExtension("GL_EXT_color_subtable", &extensionNames) ) - { - _GLEE_EXT_color_subtable = GL_TRUE; - __GLeeLink_GL_EXT_color_subtable(); - } - if (__GLeeCheckExtension("GL_PGI_vertex_hints", &extensionNames) ) - { - _GLEE_PGI_vertex_hints = GL_TRUE; - __GLeeLink_GL_PGI_vertex_hints(); - } - if (__GLeeCheckExtension("GL_PGI_misc_hints", &extensionNames) ) - { - _GLEE_PGI_misc_hints = GL_TRUE; - __GLeeLink_GL_PGI_misc_hints(); - } - if (__GLeeCheckExtension("GL_EXT_paletted_texture", &extensionNames) ) - { - _GLEE_EXT_paletted_texture = GL_TRUE; - __GLeeLink_GL_EXT_paletted_texture(); - } - if (__GLeeCheckExtension("GL_EXT_clip_volume_hint", &extensionNames) ) - { - _GLEE_EXT_clip_volume_hint = GL_TRUE; - __GLeeLink_GL_EXT_clip_volume_hint(); - } - if (__GLeeCheckExtension("GL_SGIX_list_priority", &extensionNames) ) - { - _GLEE_SGIX_list_priority = GL_TRUE; - __GLeeLink_GL_SGIX_list_priority(); - } - if (__GLeeCheckExtension("GL_SGIX_ir_instrument1", &extensionNames) ) - { - _GLEE_SGIX_ir_instrument1 = GL_TRUE; - __GLeeLink_GL_SGIX_ir_instrument1(); - } - if (__GLeeCheckExtension("GL_SGIX_calligraphic_fragment", &extensionNames) ) - { - _GLEE_SGIX_calligraphic_fragment = GL_TRUE; - __GLeeLink_GL_SGIX_calligraphic_fragment(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_lod_bias", &extensionNames) ) - { - _GLEE_SGIX_texture_lod_bias = GL_TRUE; - __GLeeLink_GL_SGIX_texture_lod_bias(); - } - if (__GLeeCheckExtension("GL_SGIX_shadow_ambient", &extensionNames) ) - { - _GLEE_SGIX_shadow_ambient = GL_TRUE; - __GLeeLink_GL_SGIX_shadow_ambient(); - } - if (__GLeeCheckExtension("GL_EXT_index_texture", &extensionNames) ) - { - _GLEE_EXT_index_texture = GL_TRUE; - __GLeeLink_GL_EXT_index_texture(); - } - if (__GLeeCheckExtension("GL_EXT_index_material", &extensionNames) ) - { - _GLEE_EXT_index_material = GL_TRUE; - __GLeeLink_GL_EXT_index_material(); - } - if (__GLeeCheckExtension("GL_EXT_index_func", &extensionNames) ) - { - _GLEE_EXT_index_func = GL_TRUE; - __GLeeLink_GL_EXT_index_func(); - } - if (__GLeeCheckExtension("GL_EXT_index_array_formats", &extensionNames) ) - { - _GLEE_EXT_index_array_formats = GL_TRUE; - __GLeeLink_GL_EXT_index_array_formats(); - } - if (__GLeeCheckExtension("GL_EXT_compiled_vertex_array", &extensionNames) ) - { - _GLEE_EXT_compiled_vertex_array = GL_TRUE; - __GLeeLink_GL_EXT_compiled_vertex_array(); - } - if (__GLeeCheckExtension("GL_EXT_cull_vertex", &extensionNames) ) - { - _GLEE_EXT_cull_vertex = GL_TRUE; - __GLeeLink_GL_EXT_cull_vertex(); - } - if (__GLeeCheckExtension("GL_SGIX_ycrcb", &extensionNames) ) - { - _GLEE_SGIX_ycrcb = GL_TRUE; - __GLeeLink_GL_SGIX_ycrcb(); - } - if (__GLeeCheckExtension("GL_SGIX_fragment_lighting", &extensionNames) ) - { - _GLEE_SGIX_fragment_lighting = GL_TRUE; - __GLeeLink_GL_SGIX_fragment_lighting(); - } - if (__GLeeCheckExtension("GL_IBM_rasterpos_clip", &extensionNames) ) - { - _GLEE_IBM_rasterpos_clip = GL_TRUE; - __GLeeLink_GL_IBM_rasterpos_clip(); - } - if (__GLeeCheckExtension("GL_HP_texture_lighting", &extensionNames) ) - { - _GLEE_HP_texture_lighting = GL_TRUE; - __GLeeLink_GL_HP_texture_lighting(); - } - if (__GLeeCheckExtension("GL_EXT_draw_range_elements", &extensionNames) ) - { - _GLEE_EXT_draw_range_elements = GL_TRUE; - __GLeeLink_GL_EXT_draw_range_elements(); - } - if (__GLeeCheckExtension("GL_WIN_phong_shading", &extensionNames) ) - { - _GLEE_WIN_phong_shading = GL_TRUE; - __GLeeLink_GL_WIN_phong_shading(); - } - if (__GLeeCheckExtension("GL_WIN_specular_fog", &extensionNames) ) - { - _GLEE_WIN_specular_fog = GL_TRUE; - __GLeeLink_GL_WIN_specular_fog(); - } - if (__GLeeCheckExtension("GL_EXT_light_texture", &extensionNames) ) - { - _GLEE_EXT_light_texture = GL_TRUE; - __GLeeLink_GL_EXT_light_texture(); - } - if (__GLeeCheckExtension("GL_SGIX_blend_alpha_minmax", &extensionNames) ) - { - _GLEE_SGIX_blend_alpha_minmax = GL_TRUE; - __GLeeLink_GL_SGIX_blend_alpha_minmax(); - } - if (__GLeeCheckExtension("GL_SGIX_impact_pixel_texture", &extensionNames) ) - { - _GLEE_SGIX_impact_pixel_texture = GL_TRUE; - __GLeeLink_GL_SGIX_impact_pixel_texture(); - } - if (__GLeeCheckExtension("GL_EXT_bgra", &extensionNames) ) - { - _GLEE_EXT_bgra = GL_TRUE; - __GLeeLink_GL_EXT_bgra(); - } - if (__GLeeCheckExtension("GL_SGIX_async", &extensionNames) ) - { - _GLEE_SGIX_async = GL_TRUE; - __GLeeLink_GL_SGIX_async(); - } - if (__GLeeCheckExtension("GL_SGIX_async_pixel", &extensionNames) ) - { - _GLEE_SGIX_async_pixel = GL_TRUE; - __GLeeLink_GL_SGIX_async_pixel(); - } - if (__GLeeCheckExtension("GL_SGIX_async_histogram", &extensionNames) ) - { - _GLEE_SGIX_async_histogram = GL_TRUE; - __GLeeLink_GL_SGIX_async_histogram(); - } - if (__GLeeCheckExtension("GL_INTEL_texture_scissor", &extensionNames) ) - { - _GLEE_INTEL_texture_scissor = GL_TRUE; - __GLeeLink_GL_INTEL_texture_scissor(); - } - if (__GLeeCheckExtension("GL_INTEL_parallel_arrays", &extensionNames) ) - { - _GLEE_INTEL_parallel_arrays = GL_TRUE; - __GLeeLink_GL_INTEL_parallel_arrays(); - } - if (__GLeeCheckExtension("GL_HP_occlusion_test", &extensionNames) ) - { - _GLEE_HP_occlusion_test = GL_TRUE; - __GLeeLink_GL_HP_occlusion_test(); - } - if (__GLeeCheckExtension("GL_EXT_pixel_transform", &extensionNames) ) - { - _GLEE_EXT_pixel_transform = GL_TRUE; - __GLeeLink_GL_EXT_pixel_transform(); - } - if (__GLeeCheckExtension("GL_EXT_pixel_transform_color_table", &extensionNames) ) - { - _GLEE_EXT_pixel_transform_color_table = GL_TRUE; - __GLeeLink_GL_EXT_pixel_transform_color_table(); - } - if (__GLeeCheckExtension("GL_EXT_shared_texture_palette", &extensionNames) ) - { - _GLEE_EXT_shared_texture_palette = GL_TRUE; - __GLeeLink_GL_EXT_shared_texture_palette(); - } - if (__GLeeCheckExtension("GL_EXT_separate_specular_color", &extensionNames) ) - { - _GLEE_EXT_separate_specular_color = GL_TRUE; - __GLeeLink_GL_EXT_separate_specular_color(); - } - if (__GLeeCheckExtension("GL_EXT_secondary_color", &extensionNames) ) - { - _GLEE_EXT_secondary_color = GL_TRUE; - __GLeeLink_GL_EXT_secondary_color(); - } - if (__GLeeCheckExtension("GL_EXT_texture_perturb_normal", &extensionNames) ) - { - _GLEE_EXT_texture_perturb_normal = GL_TRUE; - __GLeeLink_GL_EXT_texture_perturb_normal(); - } - if (__GLeeCheckExtension("GL_EXT_multi_draw_arrays", &extensionNames) ) - { - _GLEE_EXT_multi_draw_arrays = GL_TRUE; - __GLeeLink_GL_EXT_multi_draw_arrays(); - } - if (__GLeeCheckExtension("GL_EXT_fog_coord", &extensionNames) ) - { - _GLEE_EXT_fog_coord = GL_TRUE; - __GLeeLink_GL_EXT_fog_coord(); - } - if (__GLeeCheckExtension("GL_REND_screen_coordinates", &extensionNames) ) - { - _GLEE_REND_screen_coordinates = GL_TRUE; - __GLeeLink_GL_REND_screen_coordinates(); - } - if (__GLeeCheckExtension("GL_EXT_coordinate_frame", &extensionNames) ) - { - _GLEE_EXT_coordinate_frame = GL_TRUE; - __GLeeLink_GL_EXT_coordinate_frame(); - } - if (__GLeeCheckExtension("GL_EXT_texture_env_combine", &extensionNames) ) - { - _GLEE_EXT_texture_env_combine = GL_TRUE; - __GLeeLink_GL_EXT_texture_env_combine(); - } - if (__GLeeCheckExtension("GL_APPLE_specular_vector", &extensionNames) ) - { - _GLEE_APPLE_specular_vector = GL_TRUE; - __GLeeLink_GL_APPLE_specular_vector(); - } - if (__GLeeCheckExtension("GL_APPLE_transform_hint", &extensionNames) ) - { - _GLEE_APPLE_transform_hint = GL_TRUE; - __GLeeLink_GL_APPLE_transform_hint(); - } - if (__GLeeCheckExtension("GL_SGIX_fog_scale", &extensionNames) ) - { - _GLEE_SGIX_fog_scale = GL_TRUE; - __GLeeLink_GL_SGIX_fog_scale(); - } - if (__GLeeCheckExtension("GL_SUNX_constant_data", &extensionNames) ) - { - _GLEE_SUNX_constant_data = GL_TRUE; - __GLeeLink_GL_SUNX_constant_data(); - } - if (__GLeeCheckExtension("GL_SUN_global_alpha", &extensionNames) ) - { - _GLEE_SUN_global_alpha = GL_TRUE; - __GLeeLink_GL_SUN_global_alpha(); - } - if (__GLeeCheckExtension("GL_SUN_triangle_list", &extensionNames) ) - { - _GLEE_SUN_triangle_list = GL_TRUE; - __GLeeLink_GL_SUN_triangle_list(); - } - if (__GLeeCheckExtension("GL_SUN_vertex", &extensionNames) ) - { - _GLEE_SUN_vertex = GL_TRUE; - __GLeeLink_GL_SUN_vertex(); - } - if (__GLeeCheckExtension("GL_EXT_blend_func_separate", &extensionNames) ) - { - _GLEE_EXT_blend_func_separate = GL_TRUE; - __GLeeLink_GL_EXT_blend_func_separate(); - } - if (__GLeeCheckExtension("GL_INGR_color_clamp", &extensionNames) ) - { - _GLEE_INGR_color_clamp = GL_TRUE; - __GLeeLink_GL_INGR_color_clamp(); - } - if (__GLeeCheckExtension("GL_INGR_interlace_read", &extensionNames) ) - { - _GLEE_INGR_interlace_read = GL_TRUE; - __GLeeLink_GL_INGR_interlace_read(); - } - if (__GLeeCheckExtension("GL_EXT_stencil_wrap", &extensionNames) ) - { - _GLEE_EXT_stencil_wrap = GL_TRUE; - __GLeeLink_GL_EXT_stencil_wrap(); - } - if (__GLeeCheckExtension("GL_EXT_422_pixels", &extensionNames) ) - { - _GLEE_EXT_422_pixels = GL_TRUE; - __GLeeLink_GL_EXT_422_pixels(); - } - if (__GLeeCheckExtension("GL_NV_texgen_reflection", &extensionNames) ) - { - _GLEE_NV_texgen_reflection = GL_TRUE; - __GLeeLink_GL_NV_texgen_reflection(); - } - if (__GLeeCheckExtension("GL_EXT_texture_cube_map", &extensionNames) ) - { - _GLEE_EXT_texture_cube_map = GL_TRUE; - __GLeeLink_GL_EXT_texture_cube_map(); - } - if (__GLeeCheckExtension("GL_SUN_convolution_border_modes", &extensionNames) ) - { - _GLEE_SUN_convolution_border_modes = GL_TRUE; - __GLeeLink_GL_SUN_convolution_border_modes(); - } - if (__GLeeCheckExtension("GL_EXT_texture_env_add", &extensionNames) ) - { - _GLEE_EXT_texture_env_add = GL_TRUE; - __GLeeLink_GL_EXT_texture_env_add(); - } - if (__GLeeCheckExtension("GL_EXT_texture_lod_bias", &extensionNames) ) - { - _GLEE_EXT_texture_lod_bias = GL_TRUE; - __GLeeLink_GL_EXT_texture_lod_bias(); - } - if (__GLeeCheckExtension("GL_EXT_texture_filter_anisotropic", &extensionNames) ) - { - _GLEE_EXT_texture_filter_anisotropic = GL_TRUE; - __GLeeLink_GL_EXT_texture_filter_anisotropic(); - } - if (__GLeeCheckExtension("GL_EXT_vertex_weighting", &extensionNames) ) - { - _GLEE_EXT_vertex_weighting = GL_TRUE; - __GLeeLink_GL_EXT_vertex_weighting(); - } - if (__GLeeCheckExtension("GL_NV_light_max_exponent", &extensionNames) ) - { - _GLEE_NV_light_max_exponent = GL_TRUE; - __GLeeLink_GL_NV_light_max_exponent(); - } - if (__GLeeCheckExtension("GL_NV_vertex_array_range", &extensionNames) ) - { - _GLEE_NV_vertex_array_range = GL_TRUE; - __GLeeLink_GL_NV_vertex_array_range(); - } - if (__GLeeCheckExtension("GL_NV_register_combiners", &extensionNames) ) - { - _GLEE_NV_register_combiners = GL_TRUE; - __GLeeLink_GL_NV_register_combiners(); - } - if (__GLeeCheckExtension("GL_NV_fog_distance", &extensionNames) ) - { - _GLEE_NV_fog_distance = GL_TRUE; - __GLeeLink_GL_NV_fog_distance(); - } - if (__GLeeCheckExtension("GL_NV_texgen_emboss", &extensionNames) ) - { - _GLEE_NV_texgen_emboss = GL_TRUE; - __GLeeLink_GL_NV_texgen_emboss(); - } - if (__GLeeCheckExtension("GL_NV_blend_square", &extensionNames) ) - { - _GLEE_NV_blend_square = GL_TRUE; - __GLeeLink_GL_NV_blend_square(); - } - if (__GLeeCheckExtension("GL_NV_texture_env_combine4", &extensionNames) ) - { - _GLEE_NV_texture_env_combine4 = GL_TRUE; - __GLeeLink_GL_NV_texture_env_combine4(); - } - if (__GLeeCheckExtension("GL_MESA_resize_buffers", &extensionNames) ) - { - _GLEE_MESA_resize_buffers = GL_TRUE; - __GLeeLink_GL_MESA_resize_buffers(); - } - if (__GLeeCheckExtension("GL_MESA_window_pos", &extensionNames) ) - { - _GLEE_MESA_window_pos = GL_TRUE; - __GLeeLink_GL_MESA_window_pos(); - } - if (__GLeeCheckExtension("GL_EXT_texture_compression_s3tc", &extensionNames) ) - { - _GLEE_EXT_texture_compression_s3tc = GL_TRUE; - __GLeeLink_GL_EXT_texture_compression_s3tc(); - } - if (__GLeeCheckExtension("GL_IBM_cull_vertex", &extensionNames) ) - { - _GLEE_IBM_cull_vertex = GL_TRUE; - __GLeeLink_GL_IBM_cull_vertex(); - } - if (__GLeeCheckExtension("GL_IBM_multimode_draw_arrays", &extensionNames) ) - { - _GLEE_IBM_multimode_draw_arrays = GL_TRUE; - __GLeeLink_GL_IBM_multimode_draw_arrays(); - } - if (__GLeeCheckExtension("GL_IBM_vertex_array_lists", &extensionNames) ) - { - _GLEE_IBM_vertex_array_lists = GL_TRUE; - __GLeeLink_GL_IBM_vertex_array_lists(); - } - if (__GLeeCheckExtension("GL_SGIX_subsample", &extensionNames) ) - { - _GLEE_SGIX_subsample = GL_TRUE; - __GLeeLink_GL_SGIX_subsample(); - } - if (__GLeeCheckExtension("GL_SGIX_ycrcb_subsample", &extensionNames) ) - { - _GLEE_SGIX_ycrcb_subsample = GL_TRUE; - __GLeeLink_GL_SGIX_ycrcb_subsample(); - } - if (__GLeeCheckExtension("GL_SGIX_ycrcba", &extensionNames) ) - { - _GLEE_SGIX_ycrcba = GL_TRUE; - __GLeeLink_GL_SGIX_ycrcba(); - } - if (__GLeeCheckExtension("GL_SGI_depth_pass_instrument", &extensionNames) ) - { - _GLEE_SGI_depth_pass_instrument = GL_TRUE; - __GLeeLink_GL_SGI_depth_pass_instrument(); - } - if (__GLeeCheckExtension("GL_3DFX_texture_compression_FXT1", &extensionNames) ) - { - _GLEE_3DFX_texture_compression_FXT1 = GL_TRUE; - __GLeeLink_GL_3DFX_texture_compression_FXT1(); - } - if (__GLeeCheckExtension("GL_3DFX_multisample", &extensionNames) ) - { - _GLEE_3DFX_multisample = GL_TRUE; - __GLeeLink_GL_3DFX_multisample(); - } - if (__GLeeCheckExtension("GL_3DFX_tbuffer", &extensionNames) ) - { - _GLEE_3DFX_tbuffer = GL_TRUE; - __GLeeLink_GL_3DFX_tbuffer(); - } - if (__GLeeCheckExtension("GL_EXT_multisample", &extensionNames) ) - { - _GLEE_EXT_multisample = GL_TRUE; - __GLeeLink_GL_EXT_multisample(); - } - if (__GLeeCheckExtension("GL_SGIX_vertex_preclip", &extensionNames) ) - { - _GLEE_SGIX_vertex_preclip = GL_TRUE; - __GLeeLink_GL_SGIX_vertex_preclip(); - } - if (__GLeeCheckExtension("GL_SGIX_convolution_accuracy", &extensionNames) ) - { - _GLEE_SGIX_convolution_accuracy = GL_TRUE; - __GLeeLink_GL_SGIX_convolution_accuracy(); - } - if (__GLeeCheckExtension("GL_SGIX_resample", &extensionNames) ) - { - _GLEE_SGIX_resample = GL_TRUE; - __GLeeLink_GL_SGIX_resample(); - } - if (__GLeeCheckExtension("GL_SGIS_point_line_texgen", &extensionNames) ) - { - _GLEE_SGIS_point_line_texgen = GL_TRUE; - __GLeeLink_GL_SGIS_point_line_texgen(); - } - if (__GLeeCheckExtension("GL_SGIS_texture_color_mask", &extensionNames) ) - { - _GLEE_SGIS_texture_color_mask = GL_TRUE; - __GLeeLink_GL_SGIS_texture_color_mask(); - } - if (__GLeeCheckExtension("GL_EXT_texture_env_dot3", &extensionNames) ) - { - _GLEE_EXT_texture_env_dot3 = GL_TRUE; - __GLeeLink_GL_EXT_texture_env_dot3(); - } - if (__GLeeCheckExtension("GL_ATI_texture_mirror_once", &extensionNames) ) - { - _GLEE_ATI_texture_mirror_once = GL_TRUE; - __GLeeLink_GL_ATI_texture_mirror_once(); - } - if (__GLeeCheckExtension("GL_NV_fence", &extensionNames) ) - { - _GLEE_NV_fence = GL_TRUE; - __GLeeLink_GL_NV_fence(); - } - if (__GLeeCheckExtension("GL_IBM_texture_mirrored_repeat", &extensionNames) ) - { - _GLEE_IBM_texture_mirrored_repeat = GL_TRUE; - __GLeeLink_GL_IBM_texture_mirrored_repeat(); - } - if (__GLeeCheckExtension("GL_NV_evaluators", &extensionNames) ) - { - _GLEE_NV_evaluators = GL_TRUE; - __GLeeLink_GL_NV_evaluators(); - } - if (__GLeeCheckExtension("GL_NV_packed_depth_stencil", &extensionNames) ) - { - _GLEE_NV_packed_depth_stencil = GL_TRUE; - __GLeeLink_GL_NV_packed_depth_stencil(); - } - if (__GLeeCheckExtension("GL_NV_register_combiners2", &extensionNames) ) - { - _GLEE_NV_register_combiners2 = GL_TRUE; - __GLeeLink_GL_NV_register_combiners2(); - } - if (__GLeeCheckExtension("GL_NV_texture_compression_vtc", &extensionNames) ) - { - _GLEE_NV_texture_compression_vtc = GL_TRUE; - __GLeeLink_GL_NV_texture_compression_vtc(); - } - if (__GLeeCheckExtension("GL_NV_texture_rectangle", &extensionNames) ) - { - _GLEE_NV_texture_rectangle = GL_TRUE; - __GLeeLink_GL_NV_texture_rectangle(); - } - if (__GLeeCheckExtension("GL_NV_texture_shader", &extensionNames) ) - { - _GLEE_NV_texture_shader = GL_TRUE; - __GLeeLink_GL_NV_texture_shader(); - } - if (__GLeeCheckExtension("GL_NV_texture_shader2", &extensionNames) ) - { - _GLEE_NV_texture_shader2 = GL_TRUE; - __GLeeLink_GL_NV_texture_shader2(); - } - if (__GLeeCheckExtension("GL_NV_vertex_array_range2", &extensionNames) ) - { - _GLEE_NV_vertex_array_range2 = GL_TRUE; - __GLeeLink_GL_NV_vertex_array_range2(); - } - if (__GLeeCheckExtension("GL_NV_vertex_program", &extensionNames) ) - { - _GLEE_NV_vertex_program = GL_TRUE; - __GLeeLink_GL_NV_vertex_program(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_coordinate_clamp", &extensionNames) ) - { - _GLEE_SGIX_texture_coordinate_clamp = GL_TRUE; - __GLeeLink_GL_SGIX_texture_coordinate_clamp(); - } - if (__GLeeCheckExtension("GL_SGIX_scalebias_hint", &extensionNames) ) - { - _GLEE_SGIX_scalebias_hint = GL_TRUE; - __GLeeLink_GL_SGIX_scalebias_hint(); - } - if (__GLeeCheckExtension("GL_OML_interlace", &extensionNames) ) - { - _GLEE_OML_interlace = GL_TRUE; - __GLeeLink_GL_OML_interlace(); - } - if (__GLeeCheckExtension("GL_OML_subsample", &extensionNames) ) - { - _GLEE_OML_subsample = GL_TRUE; - __GLeeLink_GL_OML_subsample(); - } - if (__GLeeCheckExtension("GL_OML_resample", &extensionNames) ) - { - _GLEE_OML_resample = GL_TRUE; - __GLeeLink_GL_OML_resample(); - } - if (__GLeeCheckExtension("GL_NV_copy_depth_to_color", &extensionNames) ) - { - _GLEE_NV_copy_depth_to_color = GL_TRUE; - __GLeeLink_GL_NV_copy_depth_to_color(); - } - if (__GLeeCheckExtension("GL_ATI_envmap_bumpmap", &extensionNames) ) - { - _GLEE_ATI_envmap_bumpmap = GL_TRUE; - __GLeeLink_GL_ATI_envmap_bumpmap(); - } - if (__GLeeCheckExtension("GL_ATI_fragment_shader", &extensionNames) ) - { - _GLEE_ATI_fragment_shader = GL_TRUE; - __GLeeLink_GL_ATI_fragment_shader(); - } - if (__GLeeCheckExtension("GL_ATI_pn_triangles", &extensionNames) ) - { - _GLEE_ATI_pn_triangles = GL_TRUE; - __GLeeLink_GL_ATI_pn_triangles(); - } - if (__GLeeCheckExtension("GL_ATI_vertex_array_object", &extensionNames) ) - { - _GLEE_ATI_vertex_array_object = GL_TRUE; - __GLeeLink_GL_ATI_vertex_array_object(); - } - if (__GLeeCheckExtension("GL_EXT_vertex_shader", &extensionNames) ) - { - _GLEE_EXT_vertex_shader = GL_TRUE; - __GLeeLink_GL_EXT_vertex_shader(); - } - if (__GLeeCheckExtension("GL_ATI_vertex_streams", &extensionNames) ) - { - _GLEE_ATI_vertex_streams = GL_TRUE; - __GLeeLink_GL_ATI_vertex_streams(); - } - if (__GLeeCheckExtension("GL_ATI_element_array", &extensionNames) ) - { - _GLEE_ATI_element_array = GL_TRUE; - __GLeeLink_GL_ATI_element_array(); - } - if (__GLeeCheckExtension("GL_SUN_mesh_array", &extensionNames) ) - { - _GLEE_SUN_mesh_array = GL_TRUE; - __GLeeLink_GL_SUN_mesh_array(); - } - if (__GLeeCheckExtension("GL_SUN_slice_accum", &extensionNames) ) - { - _GLEE_SUN_slice_accum = GL_TRUE; - __GLeeLink_GL_SUN_slice_accum(); - } - if (__GLeeCheckExtension("GL_NV_multisample_filter_hint", &extensionNames) ) - { - _GLEE_NV_multisample_filter_hint = GL_TRUE; - __GLeeLink_GL_NV_multisample_filter_hint(); - } - if (__GLeeCheckExtension("GL_NV_depth_clamp", &extensionNames) ) - { - _GLEE_NV_depth_clamp = GL_TRUE; - __GLeeLink_GL_NV_depth_clamp(); - } - if (__GLeeCheckExtension("GL_NV_occlusion_query", &extensionNames) ) - { - _GLEE_NV_occlusion_query = GL_TRUE; - __GLeeLink_GL_NV_occlusion_query(); - } - if (__GLeeCheckExtension("GL_NV_point_sprite", &extensionNames) ) - { - _GLEE_NV_point_sprite = GL_TRUE; - __GLeeLink_GL_NV_point_sprite(); - } - if (__GLeeCheckExtension("GL_NV_texture_shader3", &extensionNames) ) - { - _GLEE_NV_texture_shader3 = GL_TRUE; - __GLeeLink_GL_NV_texture_shader3(); - } - if (__GLeeCheckExtension("GL_NV_vertex_program1_1", &extensionNames) ) - { - _GLEE_NV_vertex_program1_1 = GL_TRUE; - __GLeeLink_GL_NV_vertex_program1_1(); - } - if (__GLeeCheckExtension("GL_EXT_shadow_funcs", &extensionNames) ) - { - _GLEE_EXT_shadow_funcs = GL_TRUE; - __GLeeLink_GL_EXT_shadow_funcs(); - } - if (__GLeeCheckExtension("GL_EXT_stencil_two_side", &extensionNames) ) - { - _GLEE_EXT_stencil_two_side = GL_TRUE; - __GLeeLink_GL_EXT_stencil_two_side(); - } - if (__GLeeCheckExtension("GL_ATI_text_fragment_shader", &extensionNames) ) - { - _GLEE_ATI_text_fragment_shader = GL_TRUE; - __GLeeLink_GL_ATI_text_fragment_shader(); - } - if (__GLeeCheckExtension("GL_APPLE_client_storage", &extensionNames) ) - { - _GLEE_APPLE_client_storage = GL_TRUE; - __GLeeLink_GL_APPLE_client_storage(); - } - if (__GLeeCheckExtension("GL_APPLE_element_array", &extensionNames) ) - { - _GLEE_APPLE_element_array = GL_TRUE; - __GLeeLink_GL_APPLE_element_array(); - } - if (__GLeeCheckExtension("GL_APPLE_fence", &extensionNames) ) - { - _GLEE_APPLE_fence = GL_TRUE; - __GLeeLink_GL_APPLE_fence(); - } - if (__GLeeCheckExtension("GL_APPLE_vertex_array_object", &extensionNames) ) - { - _GLEE_APPLE_vertex_array_object = GL_TRUE; - __GLeeLink_GL_APPLE_vertex_array_object(); - } - if (__GLeeCheckExtension("GL_APPLE_vertex_array_range", &extensionNames) ) - { - _GLEE_APPLE_vertex_array_range = GL_TRUE; - __GLeeLink_GL_APPLE_vertex_array_range(); - } - if (__GLeeCheckExtension("GL_APPLE_ycbcr_422", &extensionNames) ) - { - _GLEE_APPLE_ycbcr_422 = GL_TRUE; - __GLeeLink_GL_APPLE_ycbcr_422(); - } - if (__GLeeCheckExtension("GL_S3_s3tc", &extensionNames) ) - { - _GLEE_S3_s3tc = GL_TRUE; - __GLeeLink_GL_S3_s3tc(); - } - if (__GLeeCheckExtension("GL_ATI_draw_buffers", &extensionNames) ) - { - _GLEE_ATI_draw_buffers = GL_TRUE; - __GLeeLink_GL_ATI_draw_buffers(); - } - if (__GLeeCheckExtension("GL_ATI_pixel_format_float", &extensionNames) ) - { - _GLEE_ATI_pixel_format_float = GL_TRUE; - __GLeeLink_GL_ATI_pixel_format_float(); - } - if (__GLeeCheckExtension("GL_ATI_texture_env_combine3", &extensionNames) ) - { - _GLEE_ATI_texture_env_combine3 = GL_TRUE; - __GLeeLink_GL_ATI_texture_env_combine3(); - } - if (__GLeeCheckExtension("GL_ATI_texture_float", &extensionNames) ) - { - _GLEE_ATI_texture_float = GL_TRUE; - __GLeeLink_GL_ATI_texture_float(); - } - if (__GLeeCheckExtension("GL_NV_float_buffer", &extensionNames) ) - { - _GLEE_NV_float_buffer = GL_TRUE; - __GLeeLink_GL_NV_float_buffer(); - } - if (__GLeeCheckExtension("GL_NV_fragment_program", &extensionNames) ) - { - _GLEE_NV_fragment_program = GL_TRUE; - __GLeeLink_GL_NV_fragment_program(); - } - if (__GLeeCheckExtension("GL_NV_half_float", &extensionNames) ) - { - _GLEE_NV_half_float = GL_TRUE; - __GLeeLink_GL_NV_half_float(); - } - if (__GLeeCheckExtension("GL_NV_pixel_data_range", &extensionNames) ) - { - _GLEE_NV_pixel_data_range = GL_TRUE; - __GLeeLink_GL_NV_pixel_data_range(); - } - if (__GLeeCheckExtension("GL_NV_primitive_restart", &extensionNames) ) - { - _GLEE_NV_primitive_restart = GL_TRUE; - __GLeeLink_GL_NV_primitive_restart(); - } - if (__GLeeCheckExtension("GL_NV_texture_expand_normal", &extensionNames) ) - { - _GLEE_NV_texture_expand_normal = GL_TRUE; - __GLeeLink_GL_NV_texture_expand_normal(); - } - if (__GLeeCheckExtension("GL_NV_vertex_program2", &extensionNames) ) - { - _GLEE_NV_vertex_program2 = GL_TRUE; - __GLeeLink_GL_NV_vertex_program2(); - } - if (__GLeeCheckExtension("GL_ATI_map_object_buffer", &extensionNames) ) - { - _GLEE_ATI_map_object_buffer = GL_TRUE; - __GLeeLink_GL_ATI_map_object_buffer(); - } - if (__GLeeCheckExtension("GL_ATI_separate_stencil", &extensionNames) ) - { - _GLEE_ATI_separate_stencil = GL_TRUE; - __GLeeLink_GL_ATI_separate_stencil(); - } - if (__GLeeCheckExtension("GL_ATI_vertex_attrib_array_object", &extensionNames) ) - { - _GLEE_ATI_vertex_attrib_array_object = GL_TRUE; - __GLeeLink_GL_ATI_vertex_attrib_array_object(); - } - if (__GLeeCheckExtension("GL_OES_read_format", &extensionNames) ) - { - _GLEE_OES_read_format = GL_TRUE; - __GLeeLink_GL_OES_read_format(); - } - if (__GLeeCheckExtension("GL_EXT_depth_bounds_test", &extensionNames) ) - { - _GLEE_EXT_depth_bounds_test = GL_TRUE; - __GLeeLink_GL_EXT_depth_bounds_test(); - } - if (__GLeeCheckExtension("GL_EXT_texture_mirror_clamp", &extensionNames) ) - { - _GLEE_EXT_texture_mirror_clamp = GL_TRUE; - __GLeeLink_GL_EXT_texture_mirror_clamp(); - } - if (__GLeeCheckExtension("GL_EXT_blend_equation_separate", &extensionNames) ) - { - _GLEE_EXT_blend_equation_separate = GL_TRUE; - __GLeeLink_GL_EXT_blend_equation_separate(); - } - if (__GLeeCheckExtension("GL_MESA_pack_invert", &extensionNames) ) - { - _GLEE_MESA_pack_invert = GL_TRUE; - __GLeeLink_GL_MESA_pack_invert(); - } - if (__GLeeCheckExtension("GL_MESA_ycbcr_texture", &extensionNames) ) - { - _GLEE_MESA_ycbcr_texture = GL_TRUE; - __GLeeLink_GL_MESA_ycbcr_texture(); - } - if (__GLeeCheckExtension("GL_EXT_pixel_buffer_object", &extensionNames) ) - { - _GLEE_EXT_pixel_buffer_object = GL_TRUE; - __GLeeLink_GL_EXT_pixel_buffer_object(); - } - if (__GLeeCheckExtension("GL_NV_fragment_program_option", &extensionNames) ) - { - _GLEE_NV_fragment_program_option = GL_TRUE; - __GLeeLink_GL_NV_fragment_program_option(); - } - if (__GLeeCheckExtension("GL_NV_fragment_program2", &extensionNames) ) - { - _GLEE_NV_fragment_program2 = GL_TRUE; - __GLeeLink_GL_NV_fragment_program2(); - } - if (__GLeeCheckExtension("GL_NV_vertex_program2_option", &extensionNames) ) - { - _GLEE_NV_vertex_program2_option = GL_TRUE; - __GLeeLink_GL_NV_vertex_program2_option(); - } - if (__GLeeCheckExtension("GL_NV_vertex_program3", &extensionNames) ) - { - _GLEE_NV_vertex_program3 = GL_TRUE; - __GLeeLink_GL_NV_vertex_program3(); - } - if (__GLeeCheckExtension("GL_EXT_framebuffer_object", &extensionNames) ) - { - _GLEE_EXT_framebuffer_object = GL_TRUE; - __GLeeLink_GL_EXT_framebuffer_object(); - } - if (__GLeeCheckExtension("GL_GREMEDY_string_marker", &extensionNames) ) - { - _GLEE_GREMEDY_string_marker = GL_TRUE; - __GLeeLink_GL_GREMEDY_string_marker(); - } - if (__GLeeCheckExtension("GL_EXT_packed_depth_stencil", &extensionNames) ) - { - _GLEE_EXT_packed_depth_stencil = GL_TRUE; - __GLeeLink_GL_EXT_packed_depth_stencil(); - } - if (__GLeeCheckExtension("GL_EXT_stencil_clear_tag", &extensionNames) ) - { - _GLEE_EXT_stencil_clear_tag = GL_TRUE; - __GLeeLink_GL_EXT_stencil_clear_tag(); - } - if (__GLeeCheckExtension("GL_EXT_texture_sRGB", &extensionNames) ) - { - _GLEE_EXT_texture_sRGB = GL_TRUE; - __GLeeLink_GL_EXT_texture_sRGB(); - } - if (__GLeeCheckExtension("GL_EXT_framebuffer_blit", &extensionNames) ) - { - _GLEE_EXT_framebuffer_blit = GL_TRUE; - __GLeeLink_GL_EXT_framebuffer_blit(); - } - if (__GLeeCheckExtension("GL_EXT_framebuffer_multisample", &extensionNames) ) - { - _GLEE_EXT_framebuffer_multisample = GL_TRUE; - __GLeeLink_GL_EXT_framebuffer_multisample(); - } - if (__GLeeCheckExtension("GL_MESAX_texture_stack", &extensionNames) ) - { - _GLEE_MESAX_texture_stack = GL_TRUE; - __GLeeLink_GL_MESAX_texture_stack(); - } - if (__GLeeCheckExtension("GL_EXT_timer_query", &extensionNames) ) - { - _GLEE_EXT_timer_query = GL_TRUE; - __GLeeLink_GL_EXT_timer_query(); - } - if (__GLeeCheckExtension("GL_EXT_gpu_program_parameters", &extensionNames) ) - { - _GLEE_EXT_gpu_program_parameters = GL_TRUE; - __GLeeLink_GL_EXT_gpu_program_parameters(); - } - if (__GLeeCheckExtension("GL_APPLE_flush_buffer_range", &extensionNames) ) - { - _GLEE_APPLE_flush_buffer_range = GL_TRUE; - __GLeeLink_GL_APPLE_flush_buffer_range(); - } - if (__GLeeCheckExtension("GL_EXT_gpu_shader4", &extensionNames) ) - { - _GLEE_EXT_gpu_shader4 = GL_TRUE; - __GLeeLink_GL_EXT_gpu_shader4(); - } - if (__GLeeCheckExtension("GL_EXT_draw_instanced", &extensionNames) ) - { - _GLEE_EXT_draw_instanced = GL_TRUE; - __GLeeLink_GL_EXT_draw_instanced(); - } - if (__GLeeCheckExtension("GL_EXT_packed_float", &extensionNames) ) - { - _GLEE_EXT_packed_float = GL_TRUE; - __GLeeLink_GL_EXT_packed_float(); - } - if (__GLeeCheckExtension("GL_EXT_texture_array", &extensionNames) ) - { - _GLEE_EXT_texture_array = GL_TRUE; - __GLeeLink_GL_EXT_texture_array(); - } - if (__GLeeCheckExtension("GL_EXT_texture_buffer_object", &extensionNames) ) - { - _GLEE_EXT_texture_buffer_object = GL_TRUE; - __GLeeLink_GL_EXT_texture_buffer_object(); - } - if (__GLeeCheckExtension("GL_EXT_texture_compression_latc", &extensionNames) ) - { - _GLEE_EXT_texture_compression_latc = GL_TRUE; - __GLeeLink_GL_EXT_texture_compression_latc(); - } - if (__GLeeCheckExtension("GL_EXT_texture_compression_rgtc", &extensionNames) ) - { - _GLEE_EXT_texture_compression_rgtc = GL_TRUE; - __GLeeLink_GL_EXT_texture_compression_rgtc(); - } - if (__GLeeCheckExtension("GL_EXT_texture_shared_exponent", &extensionNames) ) - { - _GLEE_EXT_texture_shared_exponent = GL_TRUE; - __GLeeLink_GL_EXT_texture_shared_exponent(); - } - if (__GLeeCheckExtension("GL_NV_depth_buffer_float", &extensionNames) ) - { - _GLEE_NV_depth_buffer_float = GL_TRUE; - __GLeeLink_GL_NV_depth_buffer_float(); - } - if (__GLeeCheckExtension("GL_NV_framebuffer_multisample_coverage", &extensionNames) ) - { - _GLEE_NV_framebuffer_multisample_coverage = GL_TRUE; - __GLeeLink_GL_NV_framebuffer_multisample_coverage(); - } - if (__GLeeCheckExtension("GL_EXT_framebuffer_sRGB", &extensionNames) ) - { - _GLEE_EXT_framebuffer_sRGB = GL_TRUE; - __GLeeLink_GL_EXT_framebuffer_sRGB(); - } - if (__GLeeCheckExtension("GL_NV_geometry_shader4", &extensionNames) ) - { - _GLEE_NV_geometry_shader4 = GL_TRUE; - __GLeeLink_GL_NV_geometry_shader4(); - } - if (__GLeeCheckExtension("GL_NV_parameter_buffer_object", &extensionNames) ) - { - _GLEE_NV_parameter_buffer_object = GL_TRUE; - __GLeeLink_GL_NV_parameter_buffer_object(); - } - if (__GLeeCheckExtension("GL_EXT_draw_buffers2", &extensionNames) ) - { - _GLEE_EXT_draw_buffers2 = GL_TRUE; - __GLeeLink_GL_EXT_draw_buffers2(); - } - if (__GLeeCheckExtension("GL_NV_transform_feedback", &extensionNames) ) - { - _GLEE_NV_transform_feedback = GL_TRUE; - __GLeeLink_GL_NV_transform_feedback(); - } - if (__GLeeCheckExtension("GL_EXT_bindable_uniform", &extensionNames) ) - { - _GLEE_EXT_bindable_uniform = GL_TRUE; - __GLeeLink_GL_EXT_bindable_uniform(); - } - if (__GLeeCheckExtension("GL_EXT_texture_integer", &extensionNames) ) - { - _GLEE_EXT_texture_integer = GL_TRUE; - __GLeeLink_GL_EXT_texture_integer(); - } - if (__GLeeCheckExtension("GL_GREMEDY_frame_terminator", &extensionNames) ) - { - _GLEE_GREMEDY_frame_terminator = GL_TRUE; - __GLeeLink_GL_GREMEDY_frame_terminator(); - } - if (__GLeeCheckExtension("GL_NV_conditional_render", &extensionNames) ) - { - _GLEE_NV_conditional_render = GL_TRUE; - __GLeeLink_GL_NV_conditional_render(); - } - if (__GLeeCheckExtension("GL_NV_present_video", &extensionNames) ) - { - _GLEE_NV_present_video = GL_TRUE; - __GLeeLink_GL_NV_present_video(); - } - if (__GLeeCheckExtension("GL_EXT_transform_feedback", &extensionNames) ) - { - _GLEE_EXT_transform_feedback = GL_TRUE; - __GLeeLink_GL_EXT_transform_feedback(); - } - if (__GLeeCheckExtension("GL_EXT_direct_state_access", &extensionNames) ) - { - _GLEE_EXT_direct_state_access = GL_TRUE; - __GLeeLink_GL_EXT_direct_state_access(); - } - if (__GLeeCheckExtension("GL_EXT_vertex_array_bgra", &extensionNames) ) - { - _GLEE_EXT_vertex_array_bgra = GL_TRUE; - __GLeeLink_GL_EXT_vertex_array_bgra(); - } - if (__GLeeCheckExtension("GL_EXT_texture_swizzle", &extensionNames) ) - { - _GLEE_EXT_texture_swizzle = GL_TRUE; - __GLeeLink_GL_EXT_texture_swizzle(); - } - if (__GLeeCheckExtension("GL_NV_explicit_multisample", &extensionNames) ) - { - _GLEE_NV_explicit_multisample = GL_TRUE; - __GLeeLink_GL_NV_explicit_multisample(); - } - if (__GLeeCheckExtension("GL_NV_transform_feedback2", &extensionNames) ) - { - _GLEE_NV_transform_feedback2 = GL_TRUE; - __GLeeLink_GL_NV_transform_feedback2(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_select", &extensionNames) ) - { - _GLEE_SGIX_texture_select = GL_TRUE; - __GLeeLink_GL_SGIX_texture_select(); - } - if (__GLeeCheckExtension("GL_INGR_blend_func_separate", &extensionNames) ) - { - _GLEE_INGR_blend_func_separate = GL_TRUE; - __GLeeLink_GL_INGR_blend_func_separate(); - } - if (__GLeeCheckExtension("GL_SGIX_depth_pass_instrument", &extensionNames) ) - { - _GLEE_SGIX_depth_pass_instrument = GL_TRUE; - __GLeeLink_GL_SGIX_depth_pass_instrument(); - } - if (__GLeeCheckExtension("GL_SGIX_igloo_interface", &extensionNames) ) - { - _GLEE_SGIX_igloo_interface = GL_TRUE; - __GLeeLink_GL_SGIX_igloo_interface(); - } - if (__GLeeCheckExtension("GL_EXT_fragment_lighting", &extensionNames) ) - { - _GLEE_EXT_fragment_lighting = GL_TRUE; - __GLeeLink_GL_EXT_fragment_lighting(); - } - if (__GLeeCheckExtension("GL_EXT_geometry_shader4", &extensionNames) ) - { - _GLEE_EXT_geometry_shader4 = GL_TRUE; - __GLeeLink_GL_EXT_geometry_shader4(); - } - if (__GLeeCheckExtension("GL_EXT_scene_marker", &extensionNames) ) - { - _GLEE_EXT_scene_marker = GL_TRUE; - __GLeeLink_GL_EXT_scene_marker(); - } - if (__GLeeCheckExtension("GL_EXT_texture_compression_dxt1", &extensionNames) ) - { - _GLEE_EXT_texture_compression_dxt1 = GL_TRUE; - __GLeeLink_GL_EXT_texture_compression_dxt1(); - } - if (__GLeeCheckExtension("GL_EXT_texture_env", &extensionNames) ) - { - _GLEE_EXT_texture_env = GL_TRUE; - __GLeeLink_GL_EXT_texture_env(); - } - if (__GLeeCheckExtension("GL_IBM_static_data", &extensionNames) ) - { - _GLEE_IBM_static_data = GL_TRUE; - __GLeeLink_GL_IBM_static_data(); - } - if (__GLeeCheckExtension("GL_NV_gpu_program4", &extensionNames) ) - { - _GLEE_NV_gpu_program4 = GL_TRUE; - __GLeeLink_GL_NV_gpu_program4(); - } - if (__GLeeCheckExtension("GL_OES_byte_coordinates", &extensionNames) ) - { - _GLEE_OES_byte_coordinates = GL_TRUE; - __GLeeLink_GL_OES_byte_coordinates(); - } - if (__GLeeCheckExtension("GL_OES_compressed_paletted_texture", &extensionNames) ) - { - _GLEE_OES_compressed_paletted_texture = GL_TRUE; - __GLeeLink_GL_OES_compressed_paletted_texture(); - } - if (__GLeeCheckExtension("GL_OES_single_precision", &extensionNames) ) - { - _GLEE_OES_single_precision = GL_TRUE; - __GLeeLink_GL_OES_single_precision(); - } - if (__GLeeCheckExtension("GL_SGIX_pixel_texture_bits", &extensionNames) ) - { - _GLEE_SGIX_pixel_texture_bits = GL_TRUE; - __GLeeLink_GL_SGIX_pixel_texture_bits(); - } - if (__GLeeCheckExtension("GL_SGIX_texture_range", &extensionNames) ) - { - _GLEE_SGIX_texture_range = GL_TRUE; - __GLeeLink_GL_SGIX_texture_range(); - } -#ifdef WIN32 - if (__GLeeCheckExtension("WGL_ARB_buffer_region", &extensionNames) ) - { - _GLEE_WGL_ARB_buffer_region = GL_TRUE; - __GLeeLink_WGL_ARB_buffer_region(); - } - if (__GLeeCheckExtension("WGL_ARB_multisample", &extensionNames) ) - { - _GLEE_WGL_ARB_multisample = GL_TRUE; - __GLeeLink_WGL_ARB_multisample(); - } - if (__GLeeCheckExtension("WGL_ARB_extensions_string", &extensionNames) ) - { - _GLEE_WGL_ARB_extensions_string = GL_TRUE; - __GLeeLink_WGL_ARB_extensions_string(); - } - if (__GLeeCheckExtension("WGL_ARB_pixel_format", &extensionNames) ) - { - _GLEE_WGL_ARB_pixel_format = GL_TRUE; - __GLeeLink_WGL_ARB_pixel_format(); - } - if (__GLeeCheckExtension("WGL_ARB_make_current_read", &extensionNames) ) - { - _GLEE_WGL_ARB_make_current_read = GL_TRUE; - __GLeeLink_WGL_ARB_make_current_read(); - } - if (__GLeeCheckExtension("WGL_ARB_pbuffer", &extensionNames) ) - { - _GLEE_WGL_ARB_pbuffer = GL_TRUE; - __GLeeLink_WGL_ARB_pbuffer(); - } - if (__GLeeCheckExtension("WGL_ARB_render_texture", &extensionNames) ) - { - _GLEE_WGL_ARB_render_texture = GL_TRUE; - __GLeeLink_WGL_ARB_render_texture(); - } - if (__GLeeCheckExtension("WGL_ARB_pixel_format_float", &extensionNames) ) - { - _GLEE_WGL_ARB_pixel_format_float = GL_TRUE; - __GLeeLink_WGL_ARB_pixel_format_float(); - } - if (__GLeeCheckExtension("WGL_ARB_create_context", &extensionNames) ) - { - _GLEE_WGL_ARB_create_context = GL_TRUE; - __GLeeLink_WGL_ARB_create_context(); - } - if (__GLeeCheckExtension("WGL_EXT_make_current_read", &extensionNames) ) - { - _GLEE_WGL_EXT_make_current_read = GL_TRUE; - __GLeeLink_WGL_EXT_make_current_read(); - } - if (__GLeeCheckExtension("WGL_EXT_pixel_format", &extensionNames) ) - { - _GLEE_WGL_EXT_pixel_format = GL_TRUE; - __GLeeLink_WGL_EXT_pixel_format(); - } - if (__GLeeCheckExtension("WGL_EXT_pbuffer", &extensionNames) ) - { - _GLEE_WGL_EXT_pbuffer = GL_TRUE; - __GLeeLink_WGL_EXT_pbuffer(); - } - if (__GLeeCheckExtension("WGL_EXT_depth_float", &extensionNames) ) - { - _GLEE_WGL_EXT_depth_float = GL_TRUE; - __GLeeLink_WGL_EXT_depth_float(); - } - if (__GLeeCheckExtension("WGL_3DFX_multisample", &extensionNames) ) - { - _GLEE_WGL_3DFX_multisample = GL_TRUE; - __GLeeLink_WGL_3DFX_multisample(); - } - if (__GLeeCheckExtension("WGL_EXT_multisample", &extensionNames) ) - { - _GLEE_WGL_EXT_multisample = GL_TRUE; - __GLeeLink_WGL_EXT_multisample(); - } - if (__GLeeCheckExtension("WGL_I3D_digital_video_control", &extensionNames) ) - { - _GLEE_WGL_I3D_digital_video_control = GL_TRUE; - __GLeeLink_WGL_I3D_digital_video_control(); - } - if (__GLeeCheckExtension("WGL_I3D_gamma", &extensionNames) ) - { - _GLEE_WGL_I3D_gamma = GL_TRUE; - __GLeeLink_WGL_I3D_gamma(); - } - if (__GLeeCheckExtension("WGL_I3D_genlock", &extensionNames) ) - { - _GLEE_WGL_I3D_genlock = GL_TRUE; - __GLeeLink_WGL_I3D_genlock(); - } - if (__GLeeCheckExtension("WGL_I3D_image_buffer", &extensionNames) ) - { - _GLEE_WGL_I3D_image_buffer = GL_TRUE; - __GLeeLink_WGL_I3D_image_buffer(); - } - if (__GLeeCheckExtension("WGL_I3D_swap_frame_lock", &extensionNames) ) - { - _GLEE_WGL_I3D_swap_frame_lock = GL_TRUE; - __GLeeLink_WGL_I3D_swap_frame_lock(); - } - if (__GLeeCheckExtension("WGL_NV_render_depth_texture", &extensionNames) ) - { - _GLEE_WGL_NV_render_depth_texture = GL_TRUE; - __GLeeLink_WGL_NV_render_depth_texture(); - } - if (__GLeeCheckExtension("WGL_NV_render_texture_rectangle", &extensionNames) ) - { - _GLEE_WGL_NV_render_texture_rectangle = GL_TRUE; - __GLeeLink_WGL_NV_render_texture_rectangle(); - } - if (__GLeeCheckExtension("WGL_ATI_pixel_format_float", &extensionNames) ) - { - _GLEE_WGL_ATI_pixel_format_float = GL_TRUE; - __GLeeLink_WGL_ATI_pixel_format_float(); - } - if (__GLeeCheckExtension("WGL_NV_float_buffer", &extensionNames) ) - { - _GLEE_WGL_NV_float_buffer = GL_TRUE; - __GLeeLink_WGL_NV_float_buffer(); - } - if (__GLeeCheckExtension("WGL_3DL_stereo_control", &extensionNames) ) - { - _GLEE_WGL_3DL_stereo_control = GL_TRUE; - __GLeeLink_WGL_3DL_stereo_control(); - } - if (__GLeeCheckExtension("WGL_EXT_pixel_format_packed_float", &extensionNames) ) - { - _GLEE_WGL_EXT_pixel_format_packed_float = GL_TRUE; - __GLeeLink_WGL_EXT_pixel_format_packed_float(); - } - if (__GLeeCheckExtension("WGL_EXT_framebuffer_sRGB", &extensionNames) ) - { - _GLEE_WGL_EXT_framebuffer_sRGB = GL_TRUE; - __GLeeLink_WGL_EXT_framebuffer_sRGB(); - } - if (__GLeeCheckExtension("WGL_NV_present_video", &extensionNames) ) - { - _GLEE_WGL_NV_present_video = GL_TRUE; - __GLeeLink_WGL_NV_present_video(); - } - if (__GLeeCheckExtension("WGL_NV_swap_group", &extensionNames) ) - { - _GLEE_WGL_NV_swap_group = GL_TRUE; - __GLeeLink_WGL_NV_swap_group(); - } - if (__GLeeCheckExtension("WGL_NV_gpu_affinity", &extensionNames) ) - { - _GLEE_WGL_NV_gpu_affinity = GL_TRUE; - __GLeeLink_WGL_NV_gpu_affinity(); - } - if (__GLeeCheckExtension("WGL_EXT_display_color_table", &extensionNames) ) - { - _GLEE_WGL_EXT_display_color_table = GL_TRUE; - __GLeeLink_WGL_EXT_display_color_table(); - } - if (__GLeeCheckExtension("WGL_EXT_extensions_string", &extensionNames) ) - { - _GLEE_WGL_EXT_extensions_string = GL_TRUE; - __GLeeLink_WGL_EXT_extensions_string(); - } - if (__GLeeCheckExtension("WGL_EXT_swap_control", &extensionNames) ) - { - _GLEE_WGL_EXT_swap_control = GL_TRUE; - __GLeeLink_WGL_EXT_swap_control(); - } - if (__GLeeCheckExtension("WGL_NV_vertex_array_range", &extensionNames) ) - { - _GLEE_WGL_NV_vertex_array_range = GL_TRUE; - __GLeeLink_WGL_NV_vertex_array_range(); - } - if (__GLeeCheckExtension("WGL_OML_sync_control", &extensionNames) ) - { - _GLEE_WGL_OML_sync_control = GL_TRUE; - __GLeeLink_WGL_OML_sync_control(); - } - if (__GLeeCheckExtension("WGL_I3D_swap_frame_usage", &extensionNames) ) - { - _GLEE_WGL_I3D_swap_frame_usage = GL_TRUE; - __GLeeLink_WGL_I3D_swap_frame_usage(); - } - if (__GLeeCheckExtension("WGL_NV_video_output", &extensionNames) ) - { - _GLEE_WGL_NV_video_output = GL_TRUE; - __GLeeLink_WGL_NV_video_output(); - } -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else /* GLX */ - if (__GLeeCheckExtension("GLX_VERSION_1_3", &extensionNames) ) - { - _GLEE_GLX_VERSION_1_3 = GL_TRUE; - __GLeeLink_GLX_VERSION_1_3(); - } - if (__GLeeCheckExtension("GLX_VERSION_1_4", &extensionNames) ) - { - _GLEE_GLX_VERSION_1_4 = GL_TRUE; - __GLeeLink_GLX_VERSION_1_4(); - } - if (__GLeeCheckExtension("GLX_ARB_multisample", &extensionNames) ) - { - _GLEE_GLX_ARB_multisample = GL_TRUE; - __GLeeLink_GLX_ARB_multisample(); - } - if (__GLeeCheckExtension("GLX_ARB_fbconfig_float", &extensionNames) ) - { - _GLEE_GLX_ARB_fbconfig_float = GL_TRUE; - __GLeeLink_GLX_ARB_fbconfig_float(); - } - if (__GLeeCheckExtension("GLX_ARB_create_context", &extensionNames) ) - { - _GLEE_GLX_ARB_create_context = GL_TRUE; - __GLeeLink_GLX_ARB_create_context(); - } - if (__GLeeCheckExtension("GLX_SGIS_multisample", &extensionNames) ) - { - _GLEE_GLX_SGIS_multisample = GL_TRUE; - __GLeeLink_GLX_SGIS_multisample(); - } - if (__GLeeCheckExtension("GLX_EXT_visual_info", &extensionNames) ) - { - _GLEE_GLX_EXT_visual_info = GL_TRUE; - __GLeeLink_GLX_EXT_visual_info(); - } - if (__GLeeCheckExtension("GLX_SGI_swap_control", &extensionNames) ) - { - _GLEE_GLX_SGI_swap_control = GL_TRUE; - __GLeeLink_GLX_SGI_swap_control(); - } - if (__GLeeCheckExtension("GLX_SGI_video_sync", &extensionNames) ) - { - _GLEE_GLX_SGI_video_sync = GL_TRUE; - __GLeeLink_GLX_SGI_video_sync(); - } - if (__GLeeCheckExtension("GLX_SGI_make_current_read", &extensionNames) ) - { - _GLEE_GLX_SGI_make_current_read = GL_TRUE; - __GLeeLink_GLX_SGI_make_current_read(); - } - if (__GLeeCheckExtension("GLX_EXT_visual_rating", &extensionNames) ) - { - _GLEE_GLX_EXT_visual_rating = GL_TRUE; - __GLeeLink_GLX_EXT_visual_rating(); - } - if (__GLeeCheckExtension("GLX_EXT_import_context", &extensionNames) ) - { - _GLEE_GLX_EXT_import_context = GL_TRUE; - __GLeeLink_GLX_EXT_import_context(); - } - if (__GLeeCheckExtension("GLX_SGIX_fbconfig", &extensionNames) ) - { - _GLEE_GLX_SGIX_fbconfig = GL_TRUE; - __GLeeLink_GLX_SGIX_fbconfig(); - } - if (__GLeeCheckExtension("GLX_SGIX_pbuffer", &extensionNames) ) - { - _GLEE_GLX_SGIX_pbuffer = GL_TRUE; - __GLeeLink_GLX_SGIX_pbuffer(); - } - if (__GLeeCheckExtension("GLX_SGI_cushion", &extensionNames) ) - { - _GLEE_GLX_SGI_cushion = GL_TRUE; - __GLeeLink_GLX_SGI_cushion(); - } - if (__GLeeCheckExtension("GLX_SGIX_video_resize", &extensionNames) ) - { - _GLEE_GLX_SGIX_video_resize = GL_TRUE; - __GLeeLink_GLX_SGIX_video_resize(); - } - if (__GLeeCheckExtension("GLX_SGIX_swap_group", &extensionNames) ) - { - _GLEE_GLX_SGIX_swap_group = GL_TRUE; - __GLeeLink_GLX_SGIX_swap_group(); - } - if (__GLeeCheckExtension("GLX_SGIX_swap_barrier", &extensionNames) ) - { - _GLEE_GLX_SGIX_swap_barrier = GL_TRUE; - __GLeeLink_GLX_SGIX_swap_barrier(); - } - if (__GLeeCheckExtension("GLX_SGIS_blended_overlay", &extensionNames) ) - { - _GLEE_GLX_SGIS_blended_overlay = GL_TRUE; - __GLeeLink_GLX_SGIS_blended_overlay(); - } - if (__GLeeCheckExtension("GLX_SGIS_shared_multisample", &extensionNames) ) - { - _GLEE_GLX_SGIS_shared_multisample = GL_TRUE; - __GLeeLink_GLX_SGIS_shared_multisample(); - } - if (__GLeeCheckExtension("GLX_SUN_get_transparent_index", &extensionNames) ) - { - _GLEE_GLX_SUN_get_transparent_index = GL_TRUE; - __GLeeLink_GLX_SUN_get_transparent_index(); - } - if (__GLeeCheckExtension("GLX_3DFX_multisample", &extensionNames) ) - { - _GLEE_GLX_3DFX_multisample = GL_TRUE; - __GLeeLink_GLX_3DFX_multisample(); - } - if (__GLeeCheckExtension("GLX_MESA_copy_sub_buffer", &extensionNames) ) - { - _GLEE_GLX_MESA_copy_sub_buffer = GL_TRUE; - __GLeeLink_GLX_MESA_copy_sub_buffer(); - } - if (__GLeeCheckExtension("GLX_MESA_pixmap_colormap", &extensionNames) ) - { - _GLEE_GLX_MESA_pixmap_colormap = GL_TRUE; - __GLeeLink_GLX_MESA_pixmap_colormap(); - } - if (__GLeeCheckExtension("GLX_MESA_release_buffers", &extensionNames) ) - { - _GLEE_GLX_MESA_release_buffers = GL_TRUE; - __GLeeLink_GLX_MESA_release_buffers(); - } - if (__GLeeCheckExtension("GLX_MESA_set_3dfx_mode", &extensionNames) ) - { - _GLEE_GLX_MESA_set_3dfx_mode = GL_TRUE; - __GLeeLink_GLX_MESA_set_3dfx_mode(); - } - if (__GLeeCheckExtension("GLX_SGIX_visual_select_group", &extensionNames) ) - { - _GLEE_GLX_SGIX_visual_select_group = GL_TRUE; - __GLeeLink_GLX_SGIX_visual_select_group(); - } - if (__GLeeCheckExtension("GLX_OML_swap_method", &extensionNames) ) - { - _GLEE_GLX_OML_swap_method = GL_TRUE; - __GLeeLink_GLX_OML_swap_method(); - } - if (__GLeeCheckExtension("GLX_OML_sync_control", &extensionNames) ) - { - _GLEE_GLX_OML_sync_control = GL_TRUE; - __GLeeLink_GLX_OML_sync_control(); - } - if (__GLeeCheckExtension("GLX_NV_float_buffer", &extensionNames) ) - { - _GLEE_GLX_NV_float_buffer = GL_TRUE; - __GLeeLink_GLX_NV_float_buffer(); - } - if (__GLeeCheckExtension("GLX_SGIX_hyperpipe", &extensionNames) ) - { - _GLEE_GLX_SGIX_hyperpipe = GL_TRUE; - __GLeeLink_GLX_SGIX_hyperpipe(); - } - if (__GLeeCheckExtension("GLX_MESA_agp_offset", &extensionNames) ) - { - _GLEE_GLX_MESA_agp_offset = GL_TRUE; - __GLeeLink_GLX_MESA_agp_offset(); - } - if (__GLeeCheckExtension("GLX_EXT_fbconfig_packed_float", &extensionNames) ) - { - _GLEE_GLX_EXT_fbconfig_packed_float = GL_TRUE; - __GLeeLink_GLX_EXT_fbconfig_packed_float(); - } - if (__GLeeCheckExtension("GLX_EXT_framebuffer_sRGB", &extensionNames) ) - { - _GLEE_GLX_EXT_framebuffer_sRGB = GL_TRUE; - __GLeeLink_GLX_EXT_framebuffer_sRGB(); - } - if (__GLeeCheckExtension("GLX_EXT_texture_from_pixmap", &extensionNames) ) - { - _GLEE_GLX_EXT_texture_from_pixmap = GL_TRUE; - __GLeeLink_GLX_EXT_texture_from_pixmap(); - } - if (__GLeeCheckExtension("GLX_NV_present_video", &extensionNames) ) - { - _GLEE_GLX_NV_present_video = GL_TRUE; - __GLeeLink_GLX_NV_present_video(); - } - if (__GLeeCheckExtension("GLX_NV_video_out", &extensionNames) ) - { - _GLEE_GLX_NV_video_out = GL_TRUE; - __GLeeLink_GLX_NV_video_out(); - } - if (__GLeeCheckExtension("GLX_NV_swap_group", &extensionNames) ) - { - _GLEE_GLX_NV_swap_group = GL_TRUE; - __GLeeLink_GLX_NV_swap_group(); - } - if (__GLeeCheckExtension("GLX_EXT_scene_marker", &extensionNames) ) - { - _GLEE_GLX_EXT_scene_marker = GL_TRUE; - __GLeeLink_GLX_EXT_scene_marker(); - } - if (__GLeeCheckExtension("GLX_NV_video_output", &extensionNames) ) - { - _GLEE_GLX_NV_video_output = GL_TRUE; - __GLeeLink_GLX_NV_video_output(); - } -#endif /* end GLX */ - - __GLeeExtList_clean(&extensionNames); - return GL_TRUE; -} +/*************************************************************************** +* +* GLee.c +* GLee (OpenGL Easy Extension library) +* Version : 5.4 +* +* Copyright (c)2009 Ben Woodhouse All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer as +* the first lines of this file unmodified. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +* Web: http://elf-stone.com/glee.php +* +* [This file was automatically generated by GLeeGen 7.0 +* +***************************************************************************/ + +#ifdef _MSC_VER + #pragma optimize( "g", off ) +#endif + +#include +#include +#include +#include "GLee.h" + +#if defined(__APPLE__) || defined(__APPLE_CC__) + #include +#endif + +typedef GLuint(*GLEE_LINK_FUNCTION)(void); + +GLboolean __GLeeInited=GL_FALSE; + +#ifndef _WIN32 + #define __stdcall /* nothing */ +#endif + +void * __GLeeGetProcAddress(const char *extname) +{ +#ifdef WIN32 + return (void*)wglGetProcAddress(extname); +#elif defined(__APPLE__) || defined(__APPLE_CC__) + CFBundleRef bundle; + CFURLRef bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true); + + CFStringRef functionName = CFStringCreateWithCString(kCFAllocatorDefault, extname, kCFStringEncodingASCII); + + void *function; + + bundle = CFBundleCreate(kCFAllocatorDefault, bundleURL); + assert(bundle != NULL); + + function = CFBundleGetFunctionPointerForName(bundle, functionName); + + CFRelease(bundleURL); + CFRelease(functionName); + CFRelease(bundle); + + return function; +#else + return (void*)glXGetProcAddressARB((const GLubyte *)extname); +#endif +} + + + + +/* Extension querying variables */ + +GLboolean _GLEE_VERSION_1_2 = GL_FALSE; +GLboolean _GLEE_ARB_imaging = GL_FALSE; +GLboolean _GLEE_VERSION_1_3 = GL_FALSE; +GLboolean _GLEE_VERSION_1_4 = GL_FALSE; +GLboolean _GLEE_VERSION_1_5 = GL_FALSE; +GLboolean _GLEE_VERSION_2_0 = GL_FALSE; +GLboolean _GLEE_VERSION_2_1 = GL_FALSE; +GLboolean _GLEE_VERSION_3_0 = GL_FALSE; +GLboolean _GLEE_ARB_multitexture = GL_FALSE; +GLboolean _GLEE_ARB_transpose_matrix = GL_FALSE; +GLboolean _GLEE_ARB_multisample = GL_FALSE; +GLboolean _GLEE_ARB_texture_env_add = GL_FALSE; +GLboolean _GLEE_ARB_texture_cube_map = GL_FALSE; +GLboolean _GLEE_ARB_texture_compression = GL_FALSE; +GLboolean _GLEE_ARB_texture_border_clamp = GL_FALSE; +GLboolean _GLEE_ARB_point_parameters = GL_FALSE; +GLboolean _GLEE_ARB_vertex_blend = GL_FALSE; +GLboolean _GLEE_ARB_matrix_palette = GL_FALSE; +GLboolean _GLEE_ARB_texture_env_combine = GL_FALSE; +GLboolean _GLEE_ARB_texture_env_crossbar = GL_FALSE; +GLboolean _GLEE_ARB_texture_env_dot3 = GL_FALSE; +GLboolean _GLEE_ARB_texture_mirrored_repeat = GL_FALSE; +GLboolean _GLEE_ARB_depth_texture = GL_FALSE; +GLboolean _GLEE_ARB_shadow = GL_FALSE; +GLboolean _GLEE_ARB_shadow_ambient = GL_FALSE; +GLboolean _GLEE_ARB_window_pos = GL_FALSE; +GLboolean _GLEE_ARB_vertex_program = GL_FALSE; +GLboolean _GLEE_ARB_fragment_program = GL_FALSE; +GLboolean _GLEE_ARB_vertex_buffer_object = GL_FALSE; +GLboolean _GLEE_ARB_occlusion_query = GL_FALSE; +GLboolean _GLEE_ARB_shader_objects = GL_FALSE; +GLboolean _GLEE_ARB_vertex_shader = GL_FALSE; +GLboolean _GLEE_ARB_fragment_shader = GL_FALSE; +GLboolean _GLEE_ARB_shading_language_100 = GL_FALSE; +GLboolean _GLEE_ARB_texture_non_power_of_two = GL_FALSE; +GLboolean _GLEE_ARB_point_sprite = GL_FALSE; +GLboolean _GLEE_ARB_fragment_program_shadow = GL_FALSE; +GLboolean _GLEE_ARB_draw_buffers = GL_FALSE; +GLboolean _GLEE_ARB_texture_rectangle = GL_FALSE; +GLboolean _GLEE_ARB_color_buffer_float = GL_FALSE; +GLboolean _GLEE_ARB_half_float_pixel = GL_FALSE; +GLboolean _GLEE_ARB_texture_float = GL_FALSE; +GLboolean _GLEE_ARB_pixel_buffer_object = GL_FALSE; +GLboolean _GLEE_ARB_depth_buffer_float = GL_FALSE; +GLboolean _GLEE_ARB_draw_instanced = GL_FALSE; +GLboolean _GLEE_ARB_framebuffer_object = GL_FALSE; +GLboolean _GLEE_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean _GLEE_ARB_geometry_shader4 = GL_FALSE; +GLboolean _GLEE_ARB_half_float_vertex = GL_FALSE; +GLboolean _GLEE_ARB_instanced_arrays = GL_FALSE; +GLboolean _GLEE_ARB_map_buffer_range = GL_FALSE; +GLboolean _GLEE_ARB_texture_buffer_object = GL_FALSE; +GLboolean _GLEE_ARB_texture_compression_rgtc = GL_FALSE; +GLboolean _GLEE_ARB_texture_rg = GL_FALSE; +GLboolean _GLEE_ARB_vertex_array_object = GL_FALSE; +GLboolean _GLEE_EXT_abgr = GL_FALSE; +GLboolean _GLEE_EXT_blend_color = GL_FALSE; +GLboolean _GLEE_EXT_polygon_offset = GL_FALSE; +GLboolean _GLEE_EXT_texture = GL_FALSE; +GLboolean _GLEE_EXT_texture3D = GL_FALSE; +GLboolean _GLEE_SGIS_texture_filter4 = GL_FALSE; +GLboolean _GLEE_EXT_subtexture = GL_FALSE; +GLboolean _GLEE_EXT_copy_texture = GL_FALSE; +GLboolean _GLEE_EXT_histogram = GL_FALSE; +GLboolean _GLEE_EXT_convolution = GL_FALSE; +GLboolean _GLEE_SGI_color_matrix = GL_FALSE; +GLboolean _GLEE_SGI_color_table = GL_FALSE; +GLboolean _GLEE_SGIS_pixel_texture = GL_FALSE; +GLboolean _GLEE_SGIX_pixel_texture = GL_FALSE; +GLboolean _GLEE_SGIS_texture4D = GL_FALSE; +GLboolean _GLEE_SGI_texture_color_table = GL_FALSE; +GLboolean _GLEE_EXT_cmyka = GL_FALSE; +GLboolean _GLEE_EXT_texture_object = GL_FALSE; +GLboolean _GLEE_SGIS_detail_texture = GL_FALSE; +GLboolean _GLEE_SGIS_sharpen_texture = GL_FALSE; +GLboolean _GLEE_EXT_packed_pixels = GL_FALSE; +GLboolean _GLEE_SGIS_texture_lod = GL_FALSE; +GLboolean _GLEE_SGIS_multisample = GL_FALSE; +GLboolean _GLEE_EXT_rescale_normal = GL_FALSE; +GLboolean _GLEE_EXT_vertex_array = GL_FALSE; +GLboolean _GLEE_EXT_misc_attribute = GL_FALSE; +GLboolean _GLEE_SGIS_generate_mipmap = GL_FALSE; +GLboolean _GLEE_SGIX_clipmap = GL_FALSE; +GLboolean _GLEE_SGIX_shadow = GL_FALSE; +GLboolean _GLEE_SGIS_texture_edge_clamp = GL_FALSE; +GLboolean _GLEE_SGIS_texture_border_clamp = GL_FALSE; +GLboolean _GLEE_EXT_blend_minmax = GL_FALSE; +GLboolean _GLEE_EXT_blend_subtract = GL_FALSE; +GLboolean _GLEE_EXT_blend_logic_op = GL_FALSE; +GLboolean _GLEE_SGIX_interlace = GL_FALSE; +GLboolean _GLEE_SGIX_pixel_tiles = GL_FALSE; +GLboolean _GLEE_SGIS_texture_select = GL_FALSE; +GLboolean _GLEE_SGIX_sprite = GL_FALSE; +GLboolean _GLEE_SGIX_texture_multi_buffer = GL_FALSE; +GLboolean _GLEE_EXT_point_parameters = GL_FALSE; +GLboolean _GLEE_SGIS_point_parameters = GL_FALSE; +GLboolean _GLEE_SGIX_instruments = GL_FALSE; +GLboolean _GLEE_SGIX_texture_scale_bias = GL_FALSE; +GLboolean _GLEE_SGIX_framezoom = GL_FALSE; +GLboolean _GLEE_SGIX_tag_sample_buffer = GL_FALSE; +GLboolean _GLEE_FfdMaskSGIX = GL_FALSE; +GLboolean _GLEE_SGIX_polynomial_ffd = GL_FALSE; +GLboolean _GLEE_SGIX_reference_plane = GL_FALSE; +GLboolean _GLEE_SGIX_flush_raster = GL_FALSE; +GLboolean _GLEE_SGIX_depth_texture = GL_FALSE; +GLboolean _GLEE_SGIS_fog_function = GL_FALSE; +GLboolean _GLEE_SGIX_fog_offset = GL_FALSE; +GLboolean _GLEE_HP_image_transform = GL_FALSE; +GLboolean _GLEE_HP_convolution_border_modes = GL_FALSE; +GLboolean _GLEE_INGR_palette_buffer = GL_FALSE; +GLboolean _GLEE_SGIX_texture_add_env = GL_FALSE; +GLboolean _GLEE_EXT_color_subtable = GL_FALSE; +GLboolean _GLEE_PGI_vertex_hints = GL_FALSE; +GLboolean _GLEE_PGI_misc_hints = GL_FALSE; +GLboolean _GLEE_EXT_paletted_texture = GL_FALSE; +GLboolean _GLEE_EXT_clip_volume_hint = GL_FALSE; +GLboolean _GLEE_SGIX_list_priority = GL_FALSE; +GLboolean _GLEE_SGIX_ir_instrument1 = GL_FALSE; +GLboolean _GLEE_SGIX_calligraphic_fragment = GL_FALSE; +GLboolean _GLEE_SGIX_texture_lod_bias = GL_FALSE; +GLboolean _GLEE_SGIX_shadow_ambient = GL_FALSE; +GLboolean _GLEE_EXT_index_texture = GL_FALSE; +GLboolean _GLEE_EXT_index_material = GL_FALSE; +GLboolean _GLEE_EXT_index_func = GL_FALSE; +GLboolean _GLEE_EXT_index_array_formats = GL_FALSE; +GLboolean _GLEE_EXT_compiled_vertex_array = GL_FALSE; +GLboolean _GLEE_EXT_cull_vertex = GL_FALSE; +GLboolean _GLEE_SGIX_ycrcb = GL_FALSE; +GLboolean _GLEE_SGIX_fragment_lighting = GL_FALSE; +GLboolean _GLEE_IBM_rasterpos_clip = GL_FALSE; +GLboolean _GLEE_HP_texture_lighting = GL_FALSE; +GLboolean _GLEE_EXT_draw_range_elements = GL_FALSE; +GLboolean _GLEE_WIN_phong_shading = GL_FALSE; +GLboolean _GLEE_WIN_specular_fog = GL_FALSE; +GLboolean _GLEE_EXT_light_texture = GL_FALSE; +GLboolean _GLEE_SGIX_blend_alpha_minmax = GL_FALSE; +GLboolean _GLEE_SGIX_impact_pixel_texture = GL_FALSE; +GLboolean _GLEE_EXT_bgra = GL_FALSE; +GLboolean _GLEE_SGIX_async = GL_FALSE; +GLboolean _GLEE_SGIX_async_pixel = GL_FALSE; +GLboolean _GLEE_SGIX_async_histogram = GL_FALSE; +GLboolean _GLEE_INTEL_texture_scissor = GL_FALSE; +GLboolean _GLEE_INTEL_parallel_arrays = GL_FALSE; +GLboolean _GLEE_HP_occlusion_test = GL_FALSE; +GLboolean _GLEE_EXT_pixel_transform = GL_FALSE; +GLboolean _GLEE_EXT_pixel_transform_color_table = GL_FALSE; +GLboolean _GLEE_EXT_shared_texture_palette = GL_FALSE; +GLboolean _GLEE_EXT_separate_specular_color = GL_FALSE; +GLboolean _GLEE_EXT_secondary_color = GL_FALSE; +GLboolean _GLEE_EXT_texture_perturb_normal = GL_FALSE; +GLboolean _GLEE_EXT_multi_draw_arrays = GL_FALSE; +GLboolean _GLEE_EXT_fog_coord = GL_FALSE; +GLboolean _GLEE_REND_screen_coordinates = GL_FALSE; +GLboolean _GLEE_EXT_coordinate_frame = GL_FALSE; +GLboolean _GLEE_EXT_texture_env_combine = GL_FALSE; +GLboolean _GLEE_APPLE_specular_vector = GL_FALSE; +GLboolean _GLEE_APPLE_transform_hint = GL_FALSE; +GLboolean _GLEE_SGIX_fog_scale = GL_FALSE; +GLboolean _GLEE_SUNX_constant_data = GL_FALSE; +GLboolean _GLEE_SUN_global_alpha = GL_FALSE; +GLboolean _GLEE_SUN_triangle_list = GL_FALSE; +GLboolean _GLEE_SUN_vertex = GL_FALSE; +GLboolean _GLEE_EXT_blend_func_separate = GL_FALSE; +GLboolean _GLEE_INGR_color_clamp = GL_FALSE; +GLboolean _GLEE_INGR_interlace_read = GL_FALSE; +GLboolean _GLEE_EXT_stencil_wrap = GL_FALSE; +GLboolean _GLEE_EXT_422_pixels = GL_FALSE; +GLboolean _GLEE_NV_texgen_reflection = GL_FALSE; +GLboolean _GLEE_EXT_texture_cube_map = GL_FALSE; +GLboolean _GLEE_SUN_convolution_border_modes = GL_FALSE; +GLboolean _GLEE_EXT_texture_env_add = GL_FALSE; +GLboolean _GLEE_EXT_texture_lod_bias = GL_FALSE; +GLboolean _GLEE_EXT_texture_filter_anisotropic = GL_FALSE; +GLboolean _GLEE_EXT_vertex_weighting = GL_FALSE; +GLboolean _GLEE_NV_light_max_exponent = GL_FALSE; +GLboolean _GLEE_NV_vertex_array_range = GL_FALSE; +GLboolean _GLEE_NV_register_combiners = GL_FALSE; +GLboolean _GLEE_NV_fog_distance = GL_FALSE; +GLboolean _GLEE_NV_texgen_emboss = GL_FALSE; +GLboolean _GLEE_NV_blend_square = GL_FALSE; +GLboolean _GLEE_NV_texture_env_combine4 = GL_FALSE; +GLboolean _GLEE_MESA_resize_buffers = GL_FALSE; +GLboolean _GLEE_MESA_window_pos = GL_FALSE; +GLboolean _GLEE_EXT_texture_compression_s3tc = GL_FALSE; +GLboolean _GLEE_IBM_cull_vertex = GL_FALSE; +GLboolean _GLEE_IBM_multimode_draw_arrays = GL_FALSE; +GLboolean _GLEE_IBM_vertex_array_lists = GL_FALSE; +GLboolean _GLEE_SGIX_subsample = GL_FALSE; +GLboolean _GLEE_SGIX_ycrcb_subsample = GL_FALSE; +GLboolean _GLEE_SGIX_ycrcba = GL_FALSE; +GLboolean _GLEE_SGI_depth_pass_instrument = GL_FALSE; +GLboolean _GLEE_3DFX_texture_compression_FXT1 = GL_FALSE; +GLboolean _GLEE_3DFX_multisample = GL_FALSE; +GLboolean _GLEE_3DFX_tbuffer = GL_FALSE; +GLboolean _GLEE_EXT_multisample = GL_FALSE; +GLboolean _GLEE_SGIX_vertex_preclip = GL_FALSE; +GLboolean _GLEE_SGIX_convolution_accuracy = GL_FALSE; +GLboolean _GLEE_SGIX_resample = GL_FALSE; +GLboolean _GLEE_SGIS_point_line_texgen = GL_FALSE; +GLboolean _GLEE_SGIS_texture_color_mask = GL_FALSE; +GLboolean _GLEE_EXT_texture_env_dot3 = GL_FALSE; +GLboolean _GLEE_ATI_texture_mirror_once = GL_FALSE; +GLboolean _GLEE_NV_fence = GL_FALSE; +GLboolean _GLEE_IBM_texture_mirrored_repeat = GL_FALSE; +GLboolean _GLEE_NV_evaluators = GL_FALSE; +GLboolean _GLEE_NV_packed_depth_stencil = GL_FALSE; +GLboolean _GLEE_NV_register_combiners2 = GL_FALSE; +GLboolean _GLEE_NV_texture_compression_vtc = GL_FALSE; +GLboolean _GLEE_NV_texture_rectangle = GL_FALSE; +GLboolean _GLEE_NV_texture_shader = GL_FALSE; +GLboolean _GLEE_NV_texture_shader2 = GL_FALSE; +GLboolean _GLEE_NV_vertex_array_range2 = GL_FALSE; +GLboolean _GLEE_NV_vertex_program = GL_FALSE; +GLboolean _GLEE_SGIX_texture_coordinate_clamp = GL_FALSE; +GLboolean _GLEE_SGIX_scalebias_hint = GL_FALSE; +GLboolean _GLEE_OML_interlace = GL_FALSE; +GLboolean _GLEE_OML_subsample = GL_FALSE; +GLboolean _GLEE_OML_resample = GL_FALSE; +GLboolean _GLEE_NV_copy_depth_to_color = GL_FALSE; +GLboolean _GLEE_ATI_envmap_bumpmap = GL_FALSE; +GLboolean _GLEE_ATI_fragment_shader = GL_FALSE; +GLboolean _GLEE_ATI_pn_triangles = GL_FALSE; +GLboolean _GLEE_ATI_vertex_array_object = GL_FALSE; +GLboolean _GLEE_EXT_vertex_shader = GL_FALSE; +GLboolean _GLEE_ATI_vertex_streams = GL_FALSE; +GLboolean _GLEE_ATI_element_array = GL_FALSE; +GLboolean _GLEE_SUN_mesh_array = GL_FALSE; +GLboolean _GLEE_SUN_slice_accum = GL_FALSE; +GLboolean _GLEE_NV_multisample_filter_hint = GL_FALSE; +GLboolean _GLEE_NV_depth_clamp = GL_FALSE; +GLboolean _GLEE_NV_occlusion_query = GL_FALSE; +GLboolean _GLEE_NV_point_sprite = GL_FALSE; +GLboolean _GLEE_NV_texture_shader3 = GL_FALSE; +GLboolean _GLEE_NV_vertex_program1_1 = GL_FALSE; +GLboolean _GLEE_EXT_shadow_funcs = GL_FALSE; +GLboolean _GLEE_EXT_stencil_two_side = GL_FALSE; +GLboolean _GLEE_ATI_text_fragment_shader = GL_FALSE; +GLboolean _GLEE_APPLE_client_storage = GL_FALSE; +GLboolean _GLEE_APPLE_element_array = GL_FALSE; +GLboolean _GLEE_APPLE_fence = GL_FALSE; +GLboolean _GLEE_APPLE_vertex_array_object = GL_FALSE; +GLboolean _GLEE_APPLE_vertex_array_range = GL_FALSE; +GLboolean _GLEE_APPLE_ycbcr_422 = GL_FALSE; +GLboolean _GLEE_S3_s3tc = GL_FALSE; +GLboolean _GLEE_ATI_draw_buffers = GL_FALSE; +GLboolean _GLEE_ATI_pixel_format_float = GL_FALSE; +GLboolean _GLEE_ATI_texture_env_combine3 = GL_FALSE; +GLboolean _GLEE_ATI_texture_float = GL_FALSE; +GLboolean _GLEE_NV_float_buffer = GL_FALSE; +GLboolean _GLEE_NV_fragment_program = GL_FALSE; +GLboolean _GLEE_NV_half_float = GL_FALSE; +GLboolean _GLEE_NV_pixel_data_range = GL_FALSE; +GLboolean _GLEE_NV_primitive_restart = GL_FALSE; +GLboolean _GLEE_NV_texture_expand_normal = GL_FALSE; +GLboolean _GLEE_NV_vertex_program2 = GL_FALSE; +GLboolean _GLEE_ATI_map_object_buffer = GL_FALSE; +GLboolean _GLEE_ATI_separate_stencil = GL_FALSE; +GLboolean _GLEE_ATI_vertex_attrib_array_object = GL_FALSE; +GLboolean _GLEE_OES_read_format = GL_FALSE; +GLboolean _GLEE_EXT_depth_bounds_test = GL_FALSE; +GLboolean _GLEE_EXT_texture_mirror_clamp = GL_FALSE; +GLboolean _GLEE_EXT_blend_equation_separate = GL_FALSE; +GLboolean _GLEE_MESA_pack_invert = GL_FALSE; +GLboolean _GLEE_MESA_ycbcr_texture = GL_FALSE; +GLboolean _GLEE_EXT_pixel_buffer_object = GL_FALSE; +GLboolean _GLEE_NV_fragment_program_option = GL_FALSE; +GLboolean _GLEE_NV_fragment_program2 = GL_FALSE; +GLboolean _GLEE_NV_vertex_program2_option = GL_FALSE; +GLboolean _GLEE_NV_vertex_program3 = GL_FALSE; +GLboolean _GLEE_EXT_framebuffer_object = GL_FALSE; +GLboolean _GLEE_GREMEDY_string_marker = GL_FALSE; +GLboolean _GLEE_EXT_packed_depth_stencil = GL_FALSE; +GLboolean _GLEE_EXT_stencil_clear_tag = GL_FALSE; +GLboolean _GLEE_EXT_texture_sRGB = GL_FALSE; +GLboolean _GLEE_EXT_framebuffer_blit = GL_FALSE; +GLboolean _GLEE_EXT_framebuffer_multisample = GL_FALSE; +GLboolean _GLEE_MESAX_texture_stack = GL_FALSE; +GLboolean _GLEE_EXT_timer_query = GL_FALSE; +GLboolean _GLEE_EXT_gpu_program_parameters = GL_FALSE; +GLboolean _GLEE_APPLE_flush_buffer_range = GL_FALSE; +GLboolean _GLEE_EXT_gpu_shader4 = GL_FALSE; +GLboolean _GLEE_EXT_draw_instanced = GL_FALSE; +GLboolean _GLEE_EXT_packed_float = GL_FALSE; +GLboolean _GLEE_EXT_texture_array = GL_FALSE; +GLboolean _GLEE_EXT_texture_buffer_object = GL_FALSE; +GLboolean _GLEE_EXT_texture_compression_latc = GL_FALSE; +GLboolean _GLEE_EXT_texture_compression_rgtc = GL_FALSE; +GLboolean _GLEE_EXT_texture_shared_exponent = GL_FALSE; +GLboolean _GLEE_NV_depth_buffer_float = GL_FALSE; +GLboolean _GLEE_NV_framebuffer_multisample_coverage = GL_FALSE; +GLboolean _GLEE_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean _GLEE_NV_geometry_shader4 = GL_FALSE; +GLboolean _GLEE_NV_parameter_buffer_object = GL_FALSE; +GLboolean _GLEE_EXT_draw_buffers2 = GL_FALSE; +GLboolean _GLEE_NV_transform_feedback = GL_FALSE; +GLboolean _GLEE_EXT_bindable_uniform = GL_FALSE; +GLboolean _GLEE_EXT_texture_integer = GL_FALSE; +GLboolean _GLEE_GREMEDY_frame_terminator = GL_FALSE; +GLboolean _GLEE_NV_conditional_render = GL_FALSE; +GLboolean _GLEE_NV_present_video = GL_FALSE; +GLboolean _GLEE_EXT_transform_feedback = GL_FALSE; +GLboolean _GLEE_EXT_direct_state_access = GL_FALSE; +GLboolean _GLEE_EXT_vertex_array_bgra = GL_FALSE; +GLboolean _GLEE_EXT_texture_swizzle = GL_FALSE; +GLboolean _GLEE_NV_explicit_multisample = GL_FALSE; +GLboolean _GLEE_NV_transform_feedback2 = GL_FALSE; +GLboolean _GLEE_SGIX_texture_select = GL_FALSE; +GLboolean _GLEE_INGR_blend_func_separate = GL_FALSE; +GLboolean _GLEE_SGIX_depth_pass_instrument = GL_FALSE; +GLboolean _GLEE_SGIX_igloo_interface = GL_FALSE; +GLboolean _GLEE_EXT_fragment_lighting = GL_FALSE; +GLboolean _GLEE_EXT_geometry_shader4 = GL_FALSE; +GLboolean _GLEE_EXT_scene_marker = GL_FALSE; +GLboolean _GLEE_EXT_texture_compression_dxt1 = GL_FALSE; +GLboolean _GLEE_EXT_texture_env = GL_FALSE; +GLboolean _GLEE_IBM_static_data = GL_FALSE; +GLboolean _GLEE_NV_gpu_program4 = GL_FALSE; +GLboolean _GLEE_OES_byte_coordinates = GL_FALSE; +GLboolean _GLEE_OES_compressed_paletted_texture = GL_FALSE; +GLboolean _GLEE_OES_single_precision = GL_FALSE; +GLboolean _GLEE_SGIX_pixel_texture_bits = GL_FALSE; +GLboolean _GLEE_SGIX_texture_range = GL_FALSE; + +/* GL Extension names */ + +char __GLeeGLExtensionNames[322][39]={ + "GL_VERSION_1_2", + "GL_ARB_imaging", + "GL_VERSION_1_3", + "GL_VERSION_1_4", + "GL_VERSION_1_5", + "GL_VERSION_2_0", + "GL_VERSION_2_1", + "GL_VERSION_3_0", + "GL_ARB_multitexture", + "GL_ARB_transpose_matrix", + "GL_ARB_multisample", + "GL_ARB_texture_env_add", + "GL_ARB_texture_cube_map", + "GL_ARB_texture_compression", + "GL_ARB_texture_border_clamp", + "GL_ARB_point_parameters", + "GL_ARB_vertex_blend", + "GL_ARB_matrix_palette", + "GL_ARB_texture_env_combine", + "GL_ARB_texture_env_crossbar", + "GL_ARB_texture_env_dot3", + "GL_ARB_texture_mirrored_repeat", + "GL_ARB_depth_texture", + "GL_ARB_shadow", + "GL_ARB_shadow_ambient", + "GL_ARB_window_pos", + "GL_ARB_vertex_program", + "GL_ARB_fragment_program", + "GL_ARB_vertex_buffer_object", + "GL_ARB_occlusion_query", + "GL_ARB_shader_objects", + "GL_ARB_vertex_shader", + "GL_ARB_fragment_shader", + "GL_ARB_shading_language_100", + "GL_ARB_texture_non_power_of_two", + "GL_ARB_point_sprite", + "GL_ARB_fragment_program_shadow", + "GL_ARB_draw_buffers", + "GL_ARB_texture_rectangle", + "GL_ARB_color_buffer_float", + "GL_ARB_half_float_pixel", + "GL_ARB_texture_float", + "GL_ARB_pixel_buffer_object", + "GL_ARB_depth_buffer_float", + "GL_ARB_draw_instanced", + "GL_ARB_framebuffer_object", + "GL_ARB_framebuffer_sRGB", + "GL_ARB_geometry_shader4", + "GL_ARB_half_float_vertex", + "GL_ARB_instanced_arrays", + "GL_ARB_map_buffer_range", + "GL_ARB_texture_buffer_object", + "GL_ARB_texture_compression_rgtc", + "GL_ARB_texture_rg", + "GL_ARB_vertex_array_object", + "GL_EXT_abgr", + "GL_EXT_blend_color", + "GL_EXT_polygon_offset", + "GL_EXT_texture", + "GL_EXT_texture3D", + "GL_SGIS_texture_filter4", + "GL_EXT_subtexture", + "GL_EXT_copy_texture", + "GL_EXT_histogram", + "GL_EXT_convolution", + "GL_SGI_color_matrix", + "GL_SGI_color_table", + "GL_SGIS_pixel_texture", + "GL_SGIX_pixel_texture", + "GL_SGIS_texture4D", + "GL_SGI_texture_color_table", + "GL_EXT_cmyka", + "GL_EXT_texture_object", + "GL_SGIS_detail_texture", + "GL_SGIS_sharpen_texture", + "GL_EXT_packed_pixels", + "GL_SGIS_texture_lod", + "GL_SGIS_multisample", + "GL_EXT_rescale_normal", + "GL_EXT_vertex_array", + "GL_EXT_misc_attribute", + "GL_SGIS_generate_mipmap", + "GL_SGIX_clipmap", + "GL_SGIX_shadow", + "GL_SGIS_texture_edge_clamp", + "GL_SGIS_texture_border_clamp", + "GL_EXT_blend_minmax", + "GL_EXT_blend_subtract", + "GL_EXT_blend_logic_op", + "GL_SGIX_interlace", + "GL_SGIX_pixel_tiles", + "GL_SGIS_texture_select", + "GL_SGIX_sprite", + "GL_SGIX_texture_multi_buffer", + "GL_EXT_point_parameters", + "GL_SGIS_point_parameters", + "GL_SGIX_instruments", + "GL_SGIX_texture_scale_bias", + "GL_SGIX_framezoom", + "GL_SGIX_tag_sample_buffer", + "GL_FfdMaskSGIX", + "GL_SGIX_polynomial_ffd", + "GL_SGIX_reference_plane", + "GL_SGIX_flush_raster", + "GL_SGIX_depth_texture", + "GL_SGIS_fog_function", + "GL_SGIX_fog_offset", + "GL_HP_image_transform", + "GL_HP_convolution_border_modes", + "GL_INGR_palette_buffer", + "GL_SGIX_texture_add_env", + "GL_EXT_color_subtable", + "GL_PGI_vertex_hints", + "GL_PGI_misc_hints", + "GL_EXT_paletted_texture", + "GL_EXT_clip_volume_hint", + "GL_SGIX_list_priority", + "GL_SGIX_ir_instrument1", + "GL_SGIX_calligraphic_fragment", + "GL_SGIX_texture_lod_bias", + "GL_SGIX_shadow_ambient", + "GL_EXT_index_texture", + "GL_EXT_index_material", + "GL_EXT_index_func", + "GL_EXT_index_array_formats", + "GL_EXT_compiled_vertex_array", + "GL_EXT_cull_vertex", + "GL_SGIX_ycrcb", + "GL_SGIX_fragment_lighting", + "GL_IBM_rasterpos_clip", + "GL_HP_texture_lighting", + "GL_EXT_draw_range_elements", + "GL_WIN_phong_shading", + "GL_WIN_specular_fog", + "GL_EXT_light_texture", + "GL_SGIX_blend_alpha_minmax", + "GL_SGIX_impact_pixel_texture", + "GL_EXT_bgra", + "GL_SGIX_async", + "GL_SGIX_async_pixel", + "GL_SGIX_async_histogram", + "GL_INTEL_texture_scissor", + "GL_INTEL_parallel_arrays", + "GL_HP_occlusion_test", + "GL_EXT_pixel_transform", + "GL_EXT_pixel_transform_color_table", + "GL_EXT_shared_texture_palette", + "GL_EXT_separate_specular_color", + "GL_EXT_secondary_color", + "GL_EXT_texture_perturb_normal", + "GL_EXT_multi_draw_arrays", + "GL_EXT_fog_coord", + "GL_REND_screen_coordinates", + "GL_EXT_coordinate_frame", + "GL_EXT_texture_env_combine", + "GL_APPLE_specular_vector", + "GL_APPLE_transform_hint", + "GL_SGIX_fog_scale", + "GL_SUNX_constant_data", + "GL_SUN_global_alpha", + "GL_SUN_triangle_list", + "GL_SUN_vertex", + "GL_EXT_blend_func_separate", + "GL_INGR_color_clamp", + "GL_INGR_interlace_read", + "GL_EXT_stencil_wrap", + "GL_EXT_422_pixels", + "GL_NV_texgen_reflection", + "GL_EXT_texture_cube_map", + "GL_SUN_convolution_border_modes", + "GL_EXT_texture_env_add", + "GL_EXT_texture_lod_bias", + "GL_EXT_texture_filter_anisotropic", + "GL_EXT_vertex_weighting", + "GL_NV_light_max_exponent", + "GL_NV_vertex_array_range", + "GL_NV_register_combiners", + "GL_NV_fog_distance", + "GL_NV_texgen_emboss", + "GL_NV_blend_square", + "GL_NV_texture_env_combine4", + "GL_MESA_resize_buffers", + "GL_MESA_window_pos", + "GL_EXT_texture_compression_s3tc", + "GL_IBM_cull_vertex", + "GL_IBM_multimode_draw_arrays", + "GL_IBM_vertex_array_lists", + "GL_SGIX_subsample", + "GL_SGIX_ycrcb_subsample", + "GL_SGIX_ycrcba", + "GL_SGI_depth_pass_instrument", + "GL_3DFX_texture_compression_FXT1", + "GL_3DFX_multisample", + "GL_3DFX_tbuffer", + "GL_EXT_multisample", + "GL_SGIX_vertex_preclip", + "GL_SGIX_convolution_accuracy", + "GL_SGIX_resample", + "GL_SGIS_point_line_texgen", + "GL_SGIS_texture_color_mask", + "GL_EXT_texture_env_dot3", + "GL_ATI_texture_mirror_once", + "GL_NV_fence", + "GL_IBM_texture_mirrored_repeat", + "GL_NV_evaluators", + "GL_NV_packed_depth_stencil", + "GL_NV_register_combiners2", + "GL_NV_texture_compression_vtc", + "GL_NV_texture_rectangle", + "GL_NV_texture_shader", + "GL_NV_texture_shader2", + "GL_NV_vertex_array_range2", + "GL_NV_vertex_program", + "GL_SGIX_texture_coordinate_clamp", + "GL_SGIX_scalebias_hint", + "GL_OML_interlace", + "GL_OML_subsample", + "GL_OML_resample", + "GL_NV_copy_depth_to_color", + "GL_ATI_envmap_bumpmap", + "GL_ATI_fragment_shader", + "GL_ATI_pn_triangles", + "GL_ATI_vertex_array_object", + "GL_EXT_vertex_shader", + "GL_ATI_vertex_streams", + "GL_ATI_element_array", + "GL_SUN_mesh_array", + "GL_SUN_slice_accum", + "GL_NV_multisample_filter_hint", + "GL_NV_depth_clamp", + "GL_NV_occlusion_query", + "GL_NV_point_sprite", + "GL_NV_texture_shader3", + "GL_NV_vertex_program1_1", + "GL_EXT_shadow_funcs", + "GL_EXT_stencil_two_side", + "GL_ATI_text_fragment_shader", + "GL_APPLE_client_storage", + "GL_APPLE_element_array", + "GL_APPLE_fence", + "GL_APPLE_vertex_array_object", + "GL_APPLE_vertex_array_range", + "GL_APPLE_ycbcr_422", + "GL_S3_s3tc", + "GL_ATI_draw_buffers", + "GL_ATI_pixel_format_float", + "GL_ATI_texture_env_combine3", + "GL_ATI_texture_float", + "GL_NV_float_buffer", + "GL_NV_fragment_program", + "GL_NV_half_float", + "GL_NV_pixel_data_range", + "GL_NV_primitive_restart", + "GL_NV_texture_expand_normal", + "GL_NV_vertex_program2", + "GL_ATI_map_object_buffer", + "GL_ATI_separate_stencil", + "GL_ATI_vertex_attrib_array_object", + "GL_OES_read_format", + "GL_EXT_depth_bounds_test", + "GL_EXT_texture_mirror_clamp", + "GL_EXT_blend_equation_separate", + "GL_MESA_pack_invert", + "GL_MESA_ycbcr_texture", + "GL_EXT_pixel_buffer_object", + "GL_NV_fragment_program_option", + "GL_NV_fragment_program2", + "GL_NV_vertex_program2_option", + "GL_NV_vertex_program3", + "GL_EXT_framebuffer_object", + "GL_GREMEDY_string_marker", + "GL_EXT_packed_depth_stencil", + "GL_EXT_stencil_clear_tag", + "GL_EXT_texture_sRGB", + "GL_EXT_framebuffer_blit", + "GL_EXT_framebuffer_multisample", + "GL_MESAX_texture_stack", + "GL_EXT_timer_query", + "GL_EXT_gpu_program_parameters", + "GL_APPLE_flush_buffer_range", + "GL_EXT_gpu_shader4", + "GL_EXT_draw_instanced", + "GL_EXT_packed_float", + "GL_EXT_texture_array", + "GL_EXT_texture_buffer_object", + "GL_EXT_texture_compression_latc", + "GL_EXT_texture_compression_rgtc", + "GL_EXT_texture_shared_exponent", + "GL_NV_depth_buffer_float", + "GL_NV_framebuffer_multisample_coverage", + "GL_EXT_framebuffer_sRGB", + "GL_NV_geometry_shader4", + "GL_NV_parameter_buffer_object", + "GL_EXT_draw_buffers2", + "GL_NV_transform_feedback", + "GL_EXT_bindable_uniform", + "GL_EXT_texture_integer", + "GL_GREMEDY_frame_terminator", + "GL_NV_conditional_render", + "GL_NV_present_video", + "GL_EXT_transform_feedback", + "GL_EXT_direct_state_access", + "GL_EXT_vertex_array_bgra", + "GL_EXT_texture_swizzle", + "GL_NV_explicit_multisample", + "GL_NV_transform_feedback2", + "GL_SGIX_texture_select", + "GL_INGR_blend_func_separate", + "GL_SGIX_depth_pass_instrument", + "GL_SGIX_igloo_interface", + "GL_EXT_fragment_lighting", + "GL_EXT_geometry_shader4", + "GL_EXT_scene_marker", + "GL_EXT_texture_compression_dxt1", + "GL_EXT_texture_env", + "GL_IBM_static_data", + "GL_NV_gpu_program4", + "GL_OES_byte_coordinates", + "GL_OES_compressed_paletted_texture", + "GL_OES_single_precision", + "GL_SGIX_pixel_texture_bits", + "GL_SGIX_texture_range" +}; +int __GLeeGLNumExtensions=322; + +/* GL_VERSION_1_2 */ + +#ifdef __GLEE_GL_VERSION_1_2 +#ifndef GLEE_C_DEFINED_glBlendColor +#define GLEE_C_DEFINED_glBlendColor + void __stdcall GLee_Lazy_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {if (GLeeInit()) glBlendColor(red, green, blue, alpha);} + GLEEPFNGLBLENDCOLORPROC GLeeFuncPtr_glBlendColor=GLee_Lazy_glBlendColor; +#endif +#ifndef GLEE_C_DEFINED_glBlendEquation +#define GLEE_C_DEFINED_glBlendEquation + void __stdcall GLee_Lazy_glBlendEquation(GLenum mode) {if (GLeeInit()) glBlendEquation(mode);} + GLEEPFNGLBLENDEQUATIONPROC GLeeFuncPtr_glBlendEquation=GLee_Lazy_glBlendEquation; +#endif +#ifndef GLEE_C_DEFINED_glDrawRangeElements +#define GLEE_C_DEFINED_glDrawRangeElements + void __stdcall GLee_Lazy_glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) {if (GLeeInit()) glDrawRangeElements(mode, start, end, count, type, indices);} + GLEEPFNGLDRAWRANGEELEMENTSPROC GLeeFuncPtr_glDrawRangeElements=GLee_Lazy_glDrawRangeElements; +#endif +#ifndef GLEE_C_DEFINED_glColorTable +#define GLEE_C_DEFINED_glColorTable + void __stdcall GLee_Lazy_glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table) {if (GLeeInit()) glColorTable(target, internalformat, width, format, type, table);} + GLEEPFNGLCOLORTABLEPROC GLeeFuncPtr_glColorTable=GLee_Lazy_glColorTable; +#endif +#ifndef GLEE_C_DEFINED_glColorTableParameterfv +#define GLEE_C_DEFINED_glColorTableParameterfv + void __stdcall GLee_Lazy_glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glColorTableParameterfv(target, pname, params);} + GLEEPFNGLCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glColorTableParameterfv=GLee_Lazy_glColorTableParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glColorTableParameteriv +#define GLEE_C_DEFINED_glColorTableParameteriv + void __stdcall GLee_Lazy_glColorTableParameteriv(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glColorTableParameteriv(target, pname, params);} + GLEEPFNGLCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glColorTableParameteriv=GLee_Lazy_glColorTableParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glCopyColorTable +#define GLEE_C_DEFINED_glCopyColorTable + void __stdcall GLee_Lazy_glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorTable(target, internalformat, x, y, width);} + GLEEPFNGLCOPYCOLORTABLEPROC GLeeFuncPtr_glCopyColorTable=GLee_Lazy_glCopyColorTable; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTable +#define GLEE_C_DEFINED_glGetColorTable + void __stdcall GLee_Lazy_glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid * table) {if (GLeeInit()) glGetColorTable(target, format, type, table);} + GLEEPFNGLGETCOLORTABLEPROC GLeeFuncPtr_glGetColorTable=GLee_Lazy_glGetColorTable; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableParameterfv +#define GLEE_C_DEFINED_glGetColorTableParameterfv + void __stdcall GLee_Lazy_glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetColorTableParameterfv(target, pname, params);} + GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glGetColorTableParameterfv=GLee_Lazy_glGetColorTableParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableParameteriv +#define GLEE_C_DEFINED_glGetColorTableParameteriv + void __stdcall GLee_Lazy_glGetColorTableParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetColorTableParameteriv(target, pname, params);} + GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glGetColorTableParameteriv=GLee_Lazy_glGetColorTableParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glColorSubTable +#define GLEE_C_DEFINED_glColorSubTable + void __stdcall GLee_Lazy_glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data) {if (GLeeInit()) glColorSubTable(target, start, count, format, type, data);} + GLEEPFNGLCOLORSUBTABLEPROC GLeeFuncPtr_glColorSubTable=GLee_Lazy_glColorSubTable; +#endif +#ifndef GLEE_C_DEFINED_glCopyColorSubTable +#define GLEE_C_DEFINED_glCopyColorSubTable + void __stdcall GLee_Lazy_glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorSubTable(target, start, x, y, width);} + GLEEPFNGLCOPYCOLORSUBTABLEPROC GLeeFuncPtr_glCopyColorSubTable=GLee_Lazy_glCopyColorSubTable; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionFilter1D +#define GLEE_C_DEFINED_glConvolutionFilter1D + void __stdcall GLee_Lazy_glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter1D(target, internalformat, width, format, type, image);} + GLEEPFNGLCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glConvolutionFilter1D=GLee_Lazy_glConvolutionFilter1D; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionFilter2D +#define GLEE_C_DEFINED_glConvolutionFilter2D + void __stdcall GLee_Lazy_glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter2D(target, internalformat, width, height, format, type, image);} + GLEEPFNGLCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glConvolutionFilter2D=GLee_Lazy_glConvolutionFilter2D; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameterf +#define GLEE_C_DEFINED_glConvolutionParameterf + void __stdcall GLee_Lazy_glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params) {if (GLeeInit()) glConvolutionParameterf(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERFPROC GLeeFuncPtr_glConvolutionParameterf=GLee_Lazy_glConvolutionParameterf; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameterfv +#define GLEE_C_DEFINED_glConvolutionParameterfv + void __stdcall GLee_Lazy_glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glConvolutionParameterfv(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glConvolutionParameterfv=GLee_Lazy_glConvolutionParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameteri +#define GLEE_C_DEFINED_glConvolutionParameteri + void __stdcall GLee_Lazy_glConvolutionParameteri(GLenum target, GLenum pname, GLint params) {if (GLeeInit()) glConvolutionParameteri(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERIPROC GLeeFuncPtr_glConvolutionParameteri=GLee_Lazy_glConvolutionParameteri; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameteriv +#define GLEE_C_DEFINED_glConvolutionParameteriv + void __stdcall GLee_Lazy_glConvolutionParameteriv(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glConvolutionParameteriv(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glConvolutionParameteriv=GLee_Lazy_glConvolutionParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter1D +#define GLEE_C_DEFINED_glCopyConvolutionFilter1D + void __stdcall GLee_Lazy_glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyConvolutionFilter1D(target, internalformat, x, y, width);} + GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glCopyConvolutionFilter1D=GLee_Lazy_glCopyConvolutionFilter1D; +#endif +#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter2D +#define GLEE_C_DEFINED_glCopyConvolutionFilter2D + void __stdcall GLee_Lazy_glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyConvolutionFilter2D(target, internalformat, x, y, width, height);} + GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glCopyConvolutionFilter2D=GLee_Lazy_glCopyConvolutionFilter2D; +#endif +#ifndef GLEE_C_DEFINED_glGetConvolutionFilter +#define GLEE_C_DEFINED_glGetConvolutionFilter + void __stdcall GLee_Lazy_glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid * image) {if (GLeeInit()) glGetConvolutionFilter(target, format, type, image);} + GLEEPFNGLGETCONVOLUTIONFILTERPROC GLeeFuncPtr_glGetConvolutionFilter=GLee_Lazy_glGetConvolutionFilter; +#endif +#ifndef GLEE_C_DEFINED_glGetConvolutionParameterfv +#define GLEE_C_DEFINED_glGetConvolutionParameterfv + void __stdcall GLee_Lazy_glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetConvolutionParameterfv(target, pname, params);} + GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glGetConvolutionParameterfv=GLee_Lazy_glGetConvolutionParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glGetConvolutionParameteriv +#define GLEE_C_DEFINED_glGetConvolutionParameteriv + void __stdcall GLee_Lazy_glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetConvolutionParameteriv(target, pname, params);} + GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glGetConvolutionParameteriv=GLee_Lazy_glGetConvolutionParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glGetSeparableFilter +#define GLEE_C_DEFINED_glGetSeparableFilter + void __stdcall GLee_Lazy_glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span) {if (GLeeInit()) glGetSeparableFilter(target, format, type, row, column, span);} + GLEEPFNGLGETSEPARABLEFILTERPROC GLeeFuncPtr_glGetSeparableFilter=GLee_Lazy_glGetSeparableFilter; +#endif +#ifndef GLEE_C_DEFINED_glSeparableFilter2D +#define GLEE_C_DEFINED_glSeparableFilter2D + void __stdcall GLee_Lazy_glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column) {if (GLeeInit()) glSeparableFilter2D(target, internalformat, width, height, format, type, row, column);} + GLEEPFNGLSEPARABLEFILTER2DPROC GLeeFuncPtr_glSeparableFilter2D=GLee_Lazy_glSeparableFilter2D; +#endif +#ifndef GLEE_C_DEFINED_glGetHistogram +#define GLEE_C_DEFINED_glGetHistogram + void __stdcall GLee_Lazy_glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetHistogram(target, reset, format, type, values);} + GLEEPFNGLGETHISTOGRAMPROC GLeeFuncPtr_glGetHistogram=GLee_Lazy_glGetHistogram; +#endif +#ifndef GLEE_C_DEFINED_glGetHistogramParameterfv +#define GLEE_C_DEFINED_glGetHistogramParameterfv + void __stdcall GLee_Lazy_glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetHistogramParameterfv(target, pname, params);} + GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC GLeeFuncPtr_glGetHistogramParameterfv=GLee_Lazy_glGetHistogramParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glGetHistogramParameteriv +#define GLEE_C_DEFINED_glGetHistogramParameteriv + void __stdcall GLee_Lazy_glGetHistogramParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetHistogramParameteriv(target, pname, params);} + GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC GLeeFuncPtr_glGetHistogramParameteriv=GLee_Lazy_glGetHistogramParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glGetMinmax +#define GLEE_C_DEFINED_glGetMinmax + void __stdcall GLee_Lazy_glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetMinmax(target, reset, format, type, values);} + GLEEPFNGLGETMINMAXPROC GLeeFuncPtr_glGetMinmax=GLee_Lazy_glGetMinmax; +#endif +#ifndef GLEE_C_DEFINED_glGetMinmaxParameterfv +#define GLEE_C_DEFINED_glGetMinmaxParameterfv + void __stdcall GLee_Lazy_glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMinmaxParameterfv(target, pname, params);} + GLEEPFNGLGETMINMAXPARAMETERFVPROC GLeeFuncPtr_glGetMinmaxParameterfv=GLee_Lazy_glGetMinmaxParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glGetMinmaxParameteriv +#define GLEE_C_DEFINED_glGetMinmaxParameteriv + void __stdcall GLee_Lazy_glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMinmaxParameteriv(target, pname, params);} + GLEEPFNGLGETMINMAXPARAMETERIVPROC GLeeFuncPtr_glGetMinmaxParameteriv=GLee_Lazy_glGetMinmaxParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glHistogram +#define GLEE_C_DEFINED_glHistogram + void __stdcall GLee_Lazy_glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glHistogram(target, width, internalformat, sink);} + GLEEPFNGLHISTOGRAMPROC GLeeFuncPtr_glHistogram=GLee_Lazy_glHistogram; +#endif +#ifndef GLEE_C_DEFINED_glMinmax +#define GLEE_C_DEFINED_glMinmax + void __stdcall GLee_Lazy_glMinmax(GLenum target, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glMinmax(target, internalformat, sink);} + GLEEPFNGLMINMAXPROC GLeeFuncPtr_glMinmax=GLee_Lazy_glMinmax; +#endif +#ifndef GLEE_C_DEFINED_glResetHistogram +#define GLEE_C_DEFINED_glResetHistogram + void __stdcall GLee_Lazy_glResetHistogram(GLenum target) {if (GLeeInit()) glResetHistogram(target);} + GLEEPFNGLRESETHISTOGRAMPROC GLeeFuncPtr_glResetHistogram=GLee_Lazy_glResetHistogram; +#endif +#ifndef GLEE_C_DEFINED_glResetMinmax +#define GLEE_C_DEFINED_glResetMinmax + void __stdcall GLee_Lazy_glResetMinmax(GLenum target) {if (GLeeInit()) glResetMinmax(target);} + GLEEPFNGLRESETMINMAXPROC GLeeFuncPtr_glResetMinmax=GLee_Lazy_glResetMinmax; +#endif +#ifndef GLEE_C_DEFINED_glTexImage3D +#define GLEE_C_DEFINED_glTexImage3D + void __stdcall GLee_Lazy_glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);} + GLEEPFNGLTEXIMAGE3DPROC GLeeFuncPtr_glTexImage3D=GLee_Lazy_glTexImage3D; +#endif +#ifndef GLEE_C_DEFINED_glTexSubImage3D +#define GLEE_C_DEFINED_glTexSubImage3D + void __stdcall GLee_Lazy_glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} + GLEEPFNGLTEXSUBIMAGE3DPROC GLeeFuncPtr_glTexSubImage3D=GLee_Lazy_glTexSubImage3D; +#endif +#ifndef GLEE_C_DEFINED_glCopyTexSubImage3D +#define GLEE_C_DEFINED_glCopyTexSubImage3D + void __stdcall GLee_Lazy_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);} + GLEEPFNGLCOPYTEXSUBIMAGE3DPROC GLeeFuncPtr_glCopyTexSubImage3D=GLee_Lazy_glCopyTexSubImage3D; +#endif +#endif + +/* GL_ARB_imaging */ + +#ifdef __GLEE_GL_ARB_imaging +#endif + +/* GL_VERSION_1_3 */ + +#ifdef __GLEE_GL_VERSION_1_3 +#ifndef GLEE_C_DEFINED_glActiveTexture +#define GLEE_C_DEFINED_glActiveTexture + void __stdcall GLee_Lazy_glActiveTexture(GLenum texture) {if (GLeeInit()) glActiveTexture(texture);} + GLEEPFNGLACTIVETEXTUREPROC GLeeFuncPtr_glActiveTexture=GLee_Lazy_glActiveTexture; +#endif +#ifndef GLEE_C_DEFINED_glClientActiveTexture +#define GLEE_C_DEFINED_glClientActiveTexture + void __stdcall GLee_Lazy_glClientActiveTexture(GLenum texture) {if (GLeeInit()) glClientActiveTexture(texture);} + GLEEPFNGLCLIENTACTIVETEXTUREPROC GLeeFuncPtr_glClientActiveTexture=GLee_Lazy_glClientActiveTexture; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1d +#define GLEE_C_DEFINED_glMultiTexCoord1d + void __stdcall GLee_Lazy_glMultiTexCoord1d(GLenum target, GLdouble s) {if (GLeeInit()) glMultiTexCoord1d(target, s);} + GLEEPFNGLMULTITEXCOORD1DPROC GLeeFuncPtr_glMultiTexCoord1d=GLee_Lazy_glMultiTexCoord1d; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1dv +#define GLEE_C_DEFINED_glMultiTexCoord1dv + void __stdcall GLee_Lazy_glMultiTexCoord1dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord1dv(target, v);} + GLEEPFNGLMULTITEXCOORD1DVPROC GLeeFuncPtr_glMultiTexCoord1dv=GLee_Lazy_glMultiTexCoord1dv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1f +#define GLEE_C_DEFINED_glMultiTexCoord1f + void __stdcall GLee_Lazy_glMultiTexCoord1f(GLenum target, GLfloat s) {if (GLeeInit()) glMultiTexCoord1f(target, s);} + GLEEPFNGLMULTITEXCOORD1FPROC GLeeFuncPtr_glMultiTexCoord1f=GLee_Lazy_glMultiTexCoord1f; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1fv +#define GLEE_C_DEFINED_glMultiTexCoord1fv + void __stdcall GLee_Lazy_glMultiTexCoord1fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord1fv(target, v);} + GLEEPFNGLMULTITEXCOORD1FVPROC GLeeFuncPtr_glMultiTexCoord1fv=GLee_Lazy_glMultiTexCoord1fv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1i +#define GLEE_C_DEFINED_glMultiTexCoord1i + void __stdcall GLee_Lazy_glMultiTexCoord1i(GLenum target, GLint s) {if (GLeeInit()) glMultiTexCoord1i(target, s);} + GLEEPFNGLMULTITEXCOORD1IPROC GLeeFuncPtr_glMultiTexCoord1i=GLee_Lazy_glMultiTexCoord1i; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1iv +#define GLEE_C_DEFINED_glMultiTexCoord1iv + void __stdcall GLee_Lazy_glMultiTexCoord1iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord1iv(target, v);} + GLEEPFNGLMULTITEXCOORD1IVPROC GLeeFuncPtr_glMultiTexCoord1iv=GLee_Lazy_glMultiTexCoord1iv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1s +#define GLEE_C_DEFINED_glMultiTexCoord1s + void __stdcall GLee_Lazy_glMultiTexCoord1s(GLenum target, GLshort s) {if (GLeeInit()) glMultiTexCoord1s(target, s);} + GLEEPFNGLMULTITEXCOORD1SPROC GLeeFuncPtr_glMultiTexCoord1s=GLee_Lazy_glMultiTexCoord1s; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1sv +#define GLEE_C_DEFINED_glMultiTexCoord1sv + void __stdcall GLee_Lazy_glMultiTexCoord1sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord1sv(target, v);} + GLEEPFNGLMULTITEXCOORD1SVPROC GLeeFuncPtr_glMultiTexCoord1sv=GLee_Lazy_glMultiTexCoord1sv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2d +#define GLEE_C_DEFINED_glMultiTexCoord2d + void __stdcall GLee_Lazy_glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t) {if (GLeeInit()) glMultiTexCoord2d(target, s, t);} + GLEEPFNGLMULTITEXCOORD2DPROC GLeeFuncPtr_glMultiTexCoord2d=GLee_Lazy_glMultiTexCoord2d; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2dv +#define GLEE_C_DEFINED_glMultiTexCoord2dv + void __stdcall GLee_Lazy_glMultiTexCoord2dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord2dv(target, v);} + GLEEPFNGLMULTITEXCOORD2DVPROC GLeeFuncPtr_glMultiTexCoord2dv=GLee_Lazy_glMultiTexCoord2dv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2f +#define GLEE_C_DEFINED_glMultiTexCoord2f + void __stdcall GLee_Lazy_glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t) {if (GLeeInit()) glMultiTexCoord2f(target, s, t);} + GLEEPFNGLMULTITEXCOORD2FPROC GLeeFuncPtr_glMultiTexCoord2f=GLee_Lazy_glMultiTexCoord2f; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2fv +#define GLEE_C_DEFINED_glMultiTexCoord2fv + void __stdcall GLee_Lazy_glMultiTexCoord2fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord2fv(target, v);} + GLEEPFNGLMULTITEXCOORD2FVPROC GLeeFuncPtr_glMultiTexCoord2fv=GLee_Lazy_glMultiTexCoord2fv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2i +#define GLEE_C_DEFINED_glMultiTexCoord2i + void __stdcall GLee_Lazy_glMultiTexCoord2i(GLenum target, GLint s, GLint t) {if (GLeeInit()) glMultiTexCoord2i(target, s, t);} + GLEEPFNGLMULTITEXCOORD2IPROC GLeeFuncPtr_glMultiTexCoord2i=GLee_Lazy_glMultiTexCoord2i; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2iv +#define GLEE_C_DEFINED_glMultiTexCoord2iv + void __stdcall GLee_Lazy_glMultiTexCoord2iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord2iv(target, v);} + GLEEPFNGLMULTITEXCOORD2IVPROC GLeeFuncPtr_glMultiTexCoord2iv=GLee_Lazy_glMultiTexCoord2iv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2s +#define GLEE_C_DEFINED_glMultiTexCoord2s + void __stdcall GLee_Lazy_glMultiTexCoord2s(GLenum target, GLshort s, GLshort t) {if (GLeeInit()) glMultiTexCoord2s(target, s, t);} + GLEEPFNGLMULTITEXCOORD2SPROC GLeeFuncPtr_glMultiTexCoord2s=GLee_Lazy_glMultiTexCoord2s; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2sv +#define GLEE_C_DEFINED_glMultiTexCoord2sv + void __stdcall GLee_Lazy_glMultiTexCoord2sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord2sv(target, v);} + GLEEPFNGLMULTITEXCOORD2SVPROC GLeeFuncPtr_glMultiTexCoord2sv=GLee_Lazy_glMultiTexCoord2sv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3d +#define GLEE_C_DEFINED_glMultiTexCoord3d + void __stdcall GLee_Lazy_glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r) {if (GLeeInit()) glMultiTexCoord3d(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3DPROC GLeeFuncPtr_glMultiTexCoord3d=GLee_Lazy_glMultiTexCoord3d; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3dv +#define GLEE_C_DEFINED_glMultiTexCoord3dv + void __stdcall GLee_Lazy_glMultiTexCoord3dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord3dv(target, v);} + GLEEPFNGLMULTITEXCOORD3DVPROC GLeeFuncPtr_glMultiTexCoord3dv=GLee_Lazy_glMultiTexCoord3dv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3f +#define GLEE_C_DEFINED_glMultiTexCoord3f + void __stdcall GLee_Lazy_glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r) {if (GLeeInit()) glMultiTexCoord3f(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3FPROC GLeeFuncPtr_glMultiTexCoord3f=GLee_Lazy_glMultiTexCoord3f; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3fv +#define GLEE_C_DEFINED_glMultiTexCoord3fv + void __stdcall GLee_Lazy_glMultiTexCoord3fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord3fv(target, v);} + GLEEPFNGLMULTITEXCOORD3FVPROC GLeeFuncPtr_glMultiTexCoord3fv=GLee_Lazy_glMultiTexCoord3fv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3i +#define GLEE_C_DEFINED_glMultiTexCoord3i + void __stdcall GLee_Lazy_glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r) {if (GLeeInit()) glMultiTexCoord3i(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3IPROC GLeeFuncPtr_glMultiTexCoord3i=GLee_Lazy_glMultiTexCoord3i; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3iv +#define GLEE_C_DEFINED_glMultiTexCoord3iv + void __stdcall GLee_Lazy_glMultiTexCoord3iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord3iv(target, v);} + GLEEPFNGLMULTITEXCOORD3IVPROC GLeeFuncPtr_glMultiTexCoord3iv=GLee_Lazy_glMultiTexCoord3iv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3s +#define GLEE_C_DEFINED_glMultiTexCoord3s + void __stdcall GLee_Lazy_glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r) {if (GLeeInit()) glMultiTexCoord3s(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3SPROC GLeeFuncPtr_glMultiTexCoord3s=GLee_Lazy_glMultiTexCoord3s; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3sv +#define GLEE_C_DEFINED_glMultiTexCoord3sv + void __stdcall GLee_Lazy_glMultiTexCoord3sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord3sv(target, v);} + GLEEPFNGLMULTITEXCOORD3SVPROC GLeeFuncPtr_glMultiTexCoord3sv=GLee_Lazy_glMultiTexCoord3sv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4d +#define GLEE_C_DEFINED_glMultiTexCoord4d + void __stdcall GLee_Lazy_glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) {if (GLeeInit()) glMultiTexCoord4d(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4DPROC GLeeFuncPtr_glMultiTexCoord4d=GLee_Lazy_glMultiTexCoord4d; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4dv +#define GLEE_C_DEFINED_glMultiTexCoord4dv + void __stdcall GLee_Lazy_glMultiTexCoord4dv(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord4dv(target, v);} + GLEEPFNGLMULTITEXCOORD4DVPROC GLeeFuncPtr_glMultiTexCoord4dv=GLee_Lazy_glMultiTexCoord4dv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4f +#define GLEE_C_DEFINED_glMultiTexCoord4f + void __stdcall GLee_Lazy_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {if (GLeeInit()) glMultiTexCoord4f(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4FPROC GLeeFuncPtr_glMultiTexCoord4f=GLee_Lazy_glMultiTexCoord4f; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4fv +#define GLEE_C_DEFINED_glMultiTexCoord4fv + void __stdcall GLee_Lazy_glMultiTexCoord4fv(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord4fv(target, v);} + GLEEPFNGLMULTITEXCOORD4FVPROC GLeeFuncPtr_glMultiTexCoord4fv=GLee_Lazy_glMultiTexCoord4fv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4i +#define GLEE_C_DEFINED_glMultiTexCoord4i + void __stdcall GLee_Lazy_glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q) {if (GLeeInit()) glMultiTexCoord4i(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4IPROC GLeeFuncPtr_glMultiTexCoord4i=GLee_Lazy_glMultiTexCoord4i; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4iv +#define GLEE_C_DEFINED_glMultiTexCoord4iv + void __stdcall GLee_Lazy_glMultiTexCoord4iv(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord4iv(target, v);} + GLEEPFNGLMULTITEXCOORD4IVPROC GLeeFuncPtr_glMultiTexCoord4iv=GLee_Lazy_glMultiTexCoord4iv; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4s +#define GLEE_C_DEFINED_glMultiTexCoord4s + void __stdcall GLee_Lazy_glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) {if (GLeeInit()) glMultiTexCoord4s(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4SPROC GLeeFuncPtr_glMultiTexCoord4s=GLee_Lazy_glMultiTexCoord4s; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4sv +#define GLEE_C_DEFINED_glMultiTexCoord4sv + void __stdcall GLee_Lazy_glMultiTexCoord4sv(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord4sv(target, v);} + GLEEPFNGLMULTITEXCOORD4SVPROC GLeeFuncPtr_glMultiTexCoord4sv=GLee_Lazy_glMultiTexCoord4sv; +#endif +#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixf +#define GLEE_C_DEFINED_glLoadTransposeMatrixf + void __stdcall GLee_Lazy_glLoadTransposeMatrixf(const GLfloat * m) {if (GLeeInit()) glLoadTransposeMatrixf(m);} + GLEEPFNGLLOADTRANSPOSEMATRIXFPROC GLeeFuncPtr_glLoadTransposeMatrixf=GLee_Lazy_glLoadTransposeMatrixf; +#endif +#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixd +#define GLEE_C_DEFINED_glLoadTransposeMatrixd + void __stdcall GLee_Lazy_glLoadTransposeMatrixd(const GLdouble * m) {if (GLeeInit()) glLoadTransposeMatrixd(m);} + GLEEPFNGLLOADTRANSPOSEMATRIXDPROC GLeeFuncPtr_glLoadTransposeMatrixd=GLee_Lazy_glLoadTransposeMatrixd; +#endif +#ifndef GLEE_C_DEFINED_glMultTransposeMatrixf +#define GLEE_C_DEFINED_glMultTransposeMatrixf + void __stdcall GLee_Lazy_glMultTransposeMatrixf(const GLfloat * m) {if (GLeeInit()) glMultTransposeMatrixf(m);} + GLEEPFNGLMULTTRANSPOSEMATRIXFPROC GLeeFuncPtr_glMultTransposeMatrixf=GLee_Lazy_glMultTransposeMatrixf; +#endif +#ifndef GLEE_C_DEFINED_glMultTransposeMatrixd +#define GLEE_C_DEFINED_glMultTransposeMatrixd + void __stdcall GLee_Lazy_glMultTransposeMatrixd(const GLdouble * m) {if (GLeeInit()) glMultTransposeMatrixd(m);} + GLEEPFNGLMULTTRANSPOSEMATRIXDPROC GLeeFuncPtr_glMultTransposeMatrixd=GLee_Lazy_glMultTransposeMatrixd; +#endif +#ifndef GLEE_C_DEFINED_glSampleCoverage +#define GLEE_C_DEFINED_glSampleCoverage + void __stdcall GLee_Lazy_glSampleCoverage(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleCoverage(value, invert);} + GLEEPFNGLSAMPLECOVERAGEPROC GLeeFuncPtr_glSampleCoverage=GLee_Lazy_glSampleCoverage; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexImage3D +#define GLEE_C_DEFINED_glCompressedTexImage3D + void __stdcall GLee_Lazy_glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC GLeeFuncPtr_glCompressedTexImage3D=GLee_Lazy_glCompressedTexImage3D; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexImage2D +#define GLEE_C_DEFINED_glCompressedTexImage2D + void __stdcall GLee_Lazy_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC GLeeFuncPtr_glCompressedTexImage2D=GLee_Lazy_glCompressedTexImage2D; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexImage1D +#define GLEE_C_DEFINED_glCompressedTexImage1D + void __stdcall GLee_Lazy_glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC GLeeFuncPtr_glCompressedTexImage1D=GLee_Lazy_glCompressedTexImage1D; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexSubImage3D +#define GLEE_C_DEFINED_glCompressedTexSubImage3D + void __stdcall GLee_Lazy_glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLeeFuncPtr_glCompressedTexSubImage3D=GLee_Lazy_glCompressedTexSubImage3D; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexSubImage2D +#define GLEE_C_DEFINED_glCompressedTexSubImage2D + void __stdcall GLee_Lazy_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLeeFuncPtr_glCompressedTexSubImage2D=GLee_Lazy_glCompressedTexSubImage2D; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexSubImage1D +#define GLEE_C_DEFINED_glCompressedTexSubImage1D + void __stdcall GLee_Lazy_glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLeeFuncPtr_glCompressedTexSubImage1D=GLee_Lazy_glCompressedTexSubImage1D; +#endif +#ifndef GLEE_C_DEFINED_glGetCompressedTexImage +#define GLEE_C_DEFINED_glGetCompressedTexImage + void __stdcall GLee_Lazy_glGetCompressedTexImage(GLenum target, GLint level, GLvoid * img) {if (GLeeInit()) glGetCompressedTexImage(target, level, img);} + GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC GLeeFuncPtr_glGetCompressedTexImage=GLee_Lazy_glGetCompressedTexImage; +#endif +#endif + +/* GL_VERSION_1_4 */ + +#ifdef __GLEE_GL_VERSION_1_4 +#ifndef GLEE_C_DEFINED_glBlendFuncSeparate +#define GLEE_C_DEFINED_glBlendFuncSeparate + void __stdcall GLee_Lazy_glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) {if (GLeeInit()) glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);} + GLEEPFNGLBLENDFUNCSEPARATEPROC GLeeFuncPtr_glBlendFuncSeparate=GLee_Lazy_glBlendFuncSeparate; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordf +#define GLEE_C_DEFINED_glFogCoordf + void __stdcall GLee_Lazy_glFogCoordf(GLfloat coord) {if (GLeeInit()) glFogCoordf(coord);} + GLEEPFNGLFOGCOORDFPROC GLeeFuncPtr_glFogCoordf=GLee_Lazy_glFogCoordf; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordfv +#define GLEE_C_DEFINED_glFogCoordfv + void __stdcall GLee_Lazy_glFogCoordfv(const GLfloat * coord) {if (GLeeInit()) glFogCoordfv(coord);} + GLEEPFNGLFOGCOORDFVPROC GLeeFuncPtr_glFogCoordfv=GLee_Lazy_glFogCoordfv; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordd +#define GLEE_C_DEFINED_glFogCoordd + void __stdcall GLee_Lazy_glFogCoordd(GLdouble coord) {if (GLeeInit()) glFogCoordd(coord);} + GLEEPFNGLFOGCOORDDPROC GLeeFuncPtr_glFogCoordd=GLee_Lazy_glFogCoordd; +#endif +#ifndef GLEE_C_DEFINED_glFogCoorddv +#define GLEE_C_DEFINED_glFogCoorddv + void __stdcall GLee_Lazy_glFogCoorddv(const GLdouble * coord) {if (GLeeInit()) glFogCoorddv(coord);} + GLEEPFNGLFOGCOORDDVPROC GLeeFuncPtr_glFogCoorddv=GLee_Lazy_glFogCoorddv; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordPointer +#define GLEE_C_DEFINED_glFogCoordPointer + void __stdcall GLee_Lazy_glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glFogCoordPointer(type, stride, pointer);} + GLEEPFNGLFOGCOORDPOINTERPROC GLeeFuncPtr_glFogCoordPointer=GLee_Lazy_glFogCoordPointer; +#endif +#ifndef GLEE_C_DEFINED_glMultiDrawArrays +#define GLEE_C_DEFINED_glMultiDrawArrays + void __stdcall GLee_Lazy_glMultiDrawArrays(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawArrays(mode, first, count, primcount);} + GLEEPFNGLMULTIDRAWARRAYSPROC GLeeFuncPtr_glMultiDrawArrays=GLee_Lazy_glMultiDrawArrays; +#endif +#ifndef GLEE_C_DEFINED_glMultiDrawElements +#define GLEE_C_DEFINED_glMultiDrawElements + void __stdcall GLee_Lazy_glMultiDrawElements(GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount) {if (GLeeInit()) glMultiDrawElements(mode, count, type, indices, primcount);} + GLEEPFNGLMULTIDRAWELEMENTSPROC GLeeFuncPtr_glMultiDrawElements=GLee_Lazy_glMultiDrawElements; +#endif +#ifndef GLEE_C_DEFINED_glPointParameterf +#define GLEE_C_DEFINED_glPointParameterf + void __stdcall GLee_Lazy_glPointParameterf(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterf(pname, param);} + GLEEPFNGLPOINTPARAMETERFPROC GLeeFuncPtr_glPointParameterf=GLee_Lazy_glPointParameterf; +#endif +#ifndef GLEE_C_DEFINED_glPointParameterfv +#define GLEE_C_DEFINED_glPointParameterfv + void __stdcall GLee_Lazy_glPointParameterfv(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfv(pname, params);} + GLEEPFNGLPOINTPARAMETERFVPROC GLeeFuncPtr_glPointParameterfv=GLee_Lazy_glPointParameterfv; +#endif +#ifndef GLEE_C_DEFINED_glPointParameteri +#define GLEE_C_DEFINED_glPointParameteri + void __stdcall GLee_Lazy_glPointParameteri(GLenum pname, GLint param) {if (GLeeInit()) glPointParameteri(pname, param);} + GLEEPFNGLPOINTPARAMETERIPROC GLeeFuncPtr_glPointParameteri=GLee_Lazy_glPointParameteri; +#endif +#ifndef GLEE_C_DEFINED_glPointParameteriv +#define GLEE_C_DEFINED_glPointParameteriv + void __stdcall GLee_Lazy_glPointParameteriv(GLenum pname, const GLint * params) {if (GLeeInit()) glPointParameteriv(pname, params);} + GLEEPFNGLPOINTPARAMETERIVPROC GLeeFuncPtr_glPointParameteriv=GLee_Lazy_glPointParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3b +#define GLEE_C_DEFINED_glSecondaryColor3b + void __stdcall GLee_Lazy_glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue) {if (GLeeInit()) glSecondaryColor3b(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3BPROC GLeeFuncPtr_glSecondaryColor3b=GLee_Lazy_glSecondaryColor3b; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3bv +#define GLEE_C_DEFINED_glSecondaryColor3bv + void __stdcall GLee_Lazy_glSecondaryColor3bv(const GLbyte * v) {if (GLeeInit()) glSecondaryColor3bv(v);} + GLEEPFNGLSECONDARYCOLOR3BVPROC GLeeFuncPtr_glSecondaryColor3bv=GLee_Lazy_glSecondaryColor3bv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3d +#define GLEE_C_DEFINED_glSecondaryColor3d + void __stdcall GLee_Lazy_glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue) {if (GLeeInit()) glSecondaryColor3d(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3DPROC GLeeFuncPtr_glSecondaryColor3d=GLee_Lazy_glSecondaryColor3d; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3dv +#define GLEE_C_DEFINED_glSecondaryColor3dv + void __stdcall GLee_Lazy_glSecondaryColor3dv(const GLdouble * v) {if (GLeeInit()) glSecondaryColor3dv(v);} + GLEEPFNGLSECONDARYCOLOR3DVPROC GLeeFuncPtr_glSecondaryColor3dv=GLee_Lazy_glSecondaryColor3dv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3f +#define GLEE_C_DEFINED_glSecondaryColor3f + void __stdcall GLee_Lazy_glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue) {if (GLeeInit()) glSecondaryColor3f(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3FPROC GLeeFuncPtr_glSecondaryColor3f=GLee_Lazy_glSecondaryColor3f; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3fv +#define GLEE_C_DEFINED_glSecondaryColor3fv + void __stdcall GLee_Lazy_glSecondaryColor3fv(const GLfloat * v) {if (GLeeInit()) glSecondaryColor3fv(v);} + GLEEPFNGLSECONDARYCOLOR3FVPROC GLeeFuncPtr_glSecondaryColor3fv=GLee_Lazy_glSecondaryColor3fv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3i +#define GLEE_C_DEFINED_glSecondaryColor3i + void __stdcall GLee_Lazy_glSecondaryColor3i(GLint red, GLint green, GLint blue) {if (GLeeInit()) glSecondaryColor3i(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3IPROC GLeeFuncPtr_glSecondaryColor3i=GLee_Lazy_glSecondaryColor3i; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3iv +#define GLEE_C_DEFINED_glSecondaryColor3iv + void __stdcall GLee_Lazy_glSecondaryColor3iv(const GLint * v) {if (GLeeInit()) glSecondaryColor3iv(v);} + GLEEPFNGLSECONDARYCOLOR3IVPROC GLeeFuncPtr_glSecondaryColor3iv=GLee_Lazy_glSecondaryColor3iv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3s +#define GLEE_C_DEFINED_glSecondaryColor3s + void __stdcall GLee_Lazy_glSecondaryColor3s(GLshort red, GLshort green, GLshort blue) {if (GLeeInit()) glSecondaryColor3s(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3SPROC GLeeFuncPtr_glSecondaryColor3s=GLee_Lazy_glSecondaryColor3s; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3sv +#define GLEE_C_DEFINED_glSecondaryColor3sv + void __stdcall GLee_Lazy_glSecondaryColor3sv(const GLshort * v) {if (GLeeInit()) glSecondaryColor3sv(v);} + GLEEPFNGLSECONDARYCOLOR3SVPROC GLeeFuncPtr_glSecondaryColor3sv=GLee_Lazy_glSecondaryColor3sv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3ub +#define GLEE_C_DEFINED_glSecondaryColor3ub + void __stdcall GLee_Lazy_glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue) {if (GLeeInit()) glSecondaryColor3ub(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3UBPROC GLeeFuncPtr_glSecondaryColor3ub=GLee_Lazy_glSecondaryColor3ub; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3ubv +#define GLEE_C_DEFINED_glSecondaryColor3ubv + void __stdcall GLee_Lazy_glSecondaryColor3ubv(const GLubyte * v) {if (GLeeInit()) glSecondaryColor3ubv(v);} + GLEEPFNGLSECONDARYCOLOR3UBVPROC GLeeFuncPtr_glSecondaryColor3ubv=GLee_Lazy_glSecondaryColor3ubv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3ui +#define GLEE_C_DEFINED_glSecondaryColor3ui + void __stdcall GLee_Lazy_glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue) {if (GLeeInit()) glSecondaryColor3ui(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3UIPROC GLeeFuncPtr_glSecondaryColor3ui=GLee_Lazy_glSecondaryColor3ui; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3uiv +#define GLEE_C_DEFINED_glSecondaryColor3uiv + void __stdcall GLee_Lazy_glSecondaryColor3uiv(const GLuint * v) {if (GLeeInit()) glSecondaryColor3uiv(v);} + GLEEPFNGLSECONDARYCOLOR3UIVPROC GLeeFuncPtr_glSecondaryColor3uiv=GLee_Lazy_glSecondaryColor3uiv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3us +#define GLEE_C_DEFINED_glSecondaryColor3us + void __stdcall GLee_Lazy_glSecondaryColor3us(GLushort red, GLushort green, GLushort blue) {if (GLeeInit()) glSecondaryColor3us(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3USPROC GLeeFuncPtr_glSecondaryColor3us=GLee_Lazy_glSecondaryColor3us; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3usv +#define GLEE_C_DEFINED_glSecondaryColor3usv + void __stdcall GLee_Lazy_glSecondaryColor3usv(const GLushort * v) {if (GLeeInit()) glSecondaryColor3usv(v);} + GLEEPFNGLSECONDARYCOLOR3USVPROC GLeeFuncPtr_glSecondaryColor3usv=GLee_Lazy_glSecondaryColor3usv; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColorPointer +#define GLEE_C_DEFINED_glSecondaryColorPointer + void __stdcall GLee_Lazy_glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glSecondaryColorPointer(size, type, stride, pointer);} + GLEEPFNGLSECONDARYCOLORPOINTERPROC GLeeFuncPtr_glSecondaryColorPointer=GLee_Lazy_glSecondaryColorPointer; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2d +#define GLEE_C_DEFINED_glWindowPos2d + void __stdcall GLee_Lazy_glWindowPos2d(GLdouble x, GLdouble y) {if (GLeeInit()) glWindowPos2d(x, y);} + GLEEPFNGLWINDOWPOS2DPROC GLeeFuncPtr_glWindowPos2d=GLee_Lazy_glWindowPos2d; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2dv +#define GLEE_C_DEFINED_glWindowPos2dv + void __stdcall GLee_Lazy_glWindowPos2dv(const GLdouble * v) {if (GLeeInit()) glWindowPos2dv(v);} + GLEEPFNGLWINDOWPOS2DVPROC GLeeFuncPtr_glWindowPos2dv=GLee_Lazy_glWindowPos2dv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2f +#define GLEE_C_DEFINED_glWindowPos2f + void __stdcall GLee_Lazy_glWindowPos2f(GLfloat x, GLfloat y) {if (GLeeInit()) glWindowPos2f(x, y);} + GLEEPFNGLWINDOWPOS2FPROC GLeeFuncPtr_glWindowPos2f=GLee_Lazy_glWindowPos2f; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2fv +#define GLEE_C_DEFINED_glWindowPos2fv + void __stdcall GLee_Lazy_glWindowPos2fv(const GLfloat * v) {if (GLeeInit()) glWindowPos2fv(v);} + GLEEPFNGLWINDOWPOS2FVPROC GLeeFuncPtr_glWindowPos2fv=GLee_Lazy_glWindowPos2fv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2i +#define GLEE_C_DEFINED_glWindowPos2i + void __stdcall GLee_Lazy_glWindowPos2i(GLint x, GLint y) {if (GLeeInit()) glWindowPos2i(x, y);} + GLEEPFNGLWINDOWPOS2IPROC GLeeFuncPtr_glWindowPos2i=GLee_Lazy_glWindowPos2i; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2iv +#define GLEE_C_DEFINED_glWindowPos2iv + void __stdcall GLee_Lazy_glWindowPos2iv(const GLint * v) {if (GLeeInit()) glWindowPos2iv(v);} + GLEEPFNGLWINDOWPOS2IVPROC GLeeFuncPtr_glWindowPos2iv=GLee_Lazy_glWindowPos2iv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2s +#define GLEE_C_DEFINED_glWindowPos2s + void __stdcall GLee_Lazy_glWindowPos2s(GLshort x, GLshort y) {if (GLeeInit()) glWindowPos2s(x, y);} + GLEEPFNGLWINDOWPOS2SPROC GLeeFuncPtr_glWindowPos2s=GLee_Lazy_glWindowPos2s; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2sv +#define GLEE_C_DEFINED_glWindowPos2sv + void __stdcall GLee_Lazy_glWindowPos2sv(const GLshort * v) {if (GLeeInit()) glWindowPos2sv(v);} + GLEEPFNGLWINDOWPOS2SVPROC GLeeFuncPtr_glWindowPos2sv=GLee_Lazy_glWindowPos2sv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3d +#define GLEE_C_DEFINED_glWindowPos3d + void __stdcall GLee_Lazy_glWindowPos3d(GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glWindowPos3d(x, y, z);} + GLEEPFNGLWINDOWPOS3DPROC GLeeFuncPtr_glWindowPos3d=GLee_Lazy_glWindowPos3d; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3dv +#define GLEE_C_DEFINED_glWindowPos3dv + void __stdcall GLee_Lazy_glWindowPos3dv(const GLdouble * v) {if (GLeeInit()) glWindowPos3dv(v);} + GLEEPFNGLWINDOWPOS3DVPROC GLeeFuncPtr_glWindowPos3dv=GLee_Lazy_glWindowPos3dv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3f +#define GLEE_C_DEFINED_glWindowPos3f + void __stdcall GLee_Lazy_glWindowPos3f(GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glWindowPos3f(x, y, z);} + GLEEPFNGLWINDOWPOS3FPROC GLeeFuncPtr_glWindowPos3f=GLee_Lazy_glWindowPos3f; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3fv +#define GLEE_C_DEFINED_glWindowPos3fv + void __stdcall GLee_Lazy_glWindowPos3fv(const GLfloat * v) {if (GLeeInit()) glWindowPos3fv(v);} + GLEEPFNGLWINDOWPOS3FVPROC GLeeFuncPtr_glWindowPos3fv=GLee_Lazy_glWindowPos3fv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3i +#define GLEE_C_DEFINED_glWindowPos3i + void __stdcall GLee_Lazy_glWindowPos3i(GLint x, GLint y, GLint z) {if (GLeeInit()) glWindowPos3i(x, y, z);} + GLEEPFNGLWINDOWPOS3IPROC GLeeFuncPtr_glWindowPos3i=GLee_Lazy_glWindowPos3i; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3iv +#define GLEE_C_DEFINED_glWindowPos3iv + void __stdcall GLee_Lazy_glWindowPos3iv(const GLint * v) {if (GLeeInit()) glWindowPos3iv(v);} + GLEEPFNGLWINDOWPOS3IVPROC GLeeFuncPtr_glWindowPos3iv=GLee_Lazy_glWindowPos3iv; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3s +#define GLEE_C_DEFINED_glWindowPos3s + void __stdcall GLee_Lazy_glWindowPos3s(GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glWindowPos3s(x, y, z);} + GLEEPFNGLWINDOWPOS3SPROC GLeeFuncPtr_glWindowPos3s=GLee_Lazy_glWindowPos3s; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3sv +#define GLEE_C_DEFINED_glWindowPos3sv + void __stdcall GLee_Lazy_glWindowPos3sv(const GLshort * v) {if (GLeeInit()) glWindowPos3sv(v);} + GLEEPFNGLWINDOWPOS3SVPROC GLeeFuncPtr_glWindowPos3sv=GLee_Lazy_glWindowPos3sv; +#endif +#endif + +/* GL_VERSION_1_5 */ + +#ifdef __GLEE_GL_VERSION_1_5 +#ifndef GLEE_C_DEFINED_glGenQueries +#define GLEE_C_DEFINED_glGenQueries + void __stdcall GLee_Lazy_glGenQueries(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenQueries(n, ids);} + GLEEPFNGLGENQUERIESPROC GLeeFuncPtr_glGenQueries=GLee_Lazy_glGenQueries; +#endif +#ifndef GLEE_C_DEFINED_glDeleteQueries +#define GLEE_C_DEFINED_glDeleteQueries + void __stdcall GLee_Lazy_glDeleteQueries(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteQueries(n, ids);} + GLEEPFNGLDELETEQUERIESPROC GLeeFuncPtr_glDeleteQueries=GLee_Lazy_glDeleteQueries; +#endif +#ifndef GLEE_C_DEFINED_glIsQuery +#define GLEE_C_DEFINED_glIsQuery + GLboolean __stdcall GLee_Lazy_glIsQuery(GLuint id) {if (GLeeInit()) return glIsQuery(id); return (GLboolean)0;} + GLEEPFNGLISQUERYPROC GLeeFuncPtr_glIsQuery=GLee_Lazy_glIsQuery; +#endif +#ifndef GLEE_C_DEFINED_glBeginQuery +#define GLEE_C_DEFINED_glBeginQuery + void __stdcall GLee_Lazy_glBeginQuery(GLenum target, GLuint id) {if (GLeeInit()) glBeginQuery(target, id);} + GLEEPFNGLBEGINQUERYPROC GLeeFuncPtr_glBeginQuery=GLee_Lazy_glBeginQuery; +#endif +#ifndef GLEE_C_DEFINED_glEndQuery +#define GLEE_C_DEFINED_glEndQuery + void __stdcall GLee_Lazy_glEndQuery(GLenum target) {if (GLeeInit()) glEndQuery(target);} + GLEEPFNGLENDQUERYPROC GLeeFuncPtr_glEndQuery=GLee_Lazy_glEndQuery; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryiv +#define GLEE_C_DEFINED_glGetQueryiv + void __stdcall GLee_Lazy_glGetQueryiv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryiv(target, pname, params);} + GLEEPFNGLGETQUERYIVPROC GLeeFuncPtr_glGetQueryiv=GLee_Lazy_glGetQueryiv; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryObjectiv +#define GLEE_C_DEFINED_glGetQueryObjectiv + void __stdcall GLee_Lazy_glGetQueryObjectiv(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryObjectiv(id, pname, params);} + GLEEPFNGLGETQUERYOBJECTIVPROC GLeeFuncPtr_glGetQueryObjectiv=GLee_Lazy_glGetQueryObjectiv; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryObjectuiv +#define GLEE_C_DEFINED_glGetQueryObjectuiv + void __stdcall GLee_Lazy_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint * params) {if (GLeeInit()) glGetQueryObjectuiv(id, pname, params);} + GLEEPFNGLGETQUERYOBJECTUIVPROC GLeeFuncPtr_glGetQueryObjectuiv=GLee_Lazy_glGetQueryObjectuiv; +#endif +#ifndef GLEE_C_DEFINED_glBindBuffer +#define GLEE_C_DEFINED_glBindBuffer + void __stdcall GLee_Lazy_glBindBuffer(GLenum target, GLuint buffer) {if (GLeeInit()) glBindBuffer(target, buffer);} + GLEEPFNGLBINDBUFFERPROC GLeeFuncPtr_glBindBuffer=GLee_Lazy_glBindBuffer; +#endif +#ifndef GLEE_C_DEFINED_glDeleteBuffers +#define GLEE_C_DEFINED_glDeleteBuffers + void __stdcall GLee_Lazy_glDeleteBuffers(GLsizei n, const GLuint * buffers) {if (GLeeInit()) glDeleteBuffers(n, buffers);} + GLEEPFNGLDELETEBUFFERSPROC GLeeFuncPtr_glDeleteBuffers=GLee_Lazy_glDeleteBuffers; +#endif +#ifndef GLEE_C_DEFINED_glGenBuffers +#define GLEE_C_DEFINED_glGenBuffers + void __stdcall GLee_Lazy_glGenBuffers(GLsizei n, GLuint * buffers) {if (GLeeInit()) glGenBuffers(n, buffers);} + GLEEPFNGLGENBUFFERSPROC GLeeFuncPtr_glGenBuffers=GLee_Lazy_glGenBuffers; +#endif +#ifndef GLEE_C_DEFINED_glIsBuffer +#define GLEE_C_DEFINED_glIsBuffer + GLboolean __stdcall GLee_Lazy_glIsBuffer(GLuint buffer) {if (GLeeInit()) return glIsBuffer(buffer); return (GLboolean)0;} + GLEEPFNGLISBUFFERPROC GLeeFuncPtr_glIsBuffer=GLee_Lazy_glIsBuffer; +#endif +#ifndef GLEE_C_DEFINED_glBufferData +#define GLEE_C_DEFINED_glBufferData + void __stdcall GLee_Lazy_glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {if (GLeeInit()) glBufferData(target, size, data, usage);} + GLEEPFNGLBUFFERDATAPROC GLeeFuncPtr_glBufferData=GLee_Lazy_glBufferData; +#endif +#ifndef GLEE_C_DEFINED_glBufferSubData +#define GLEE_C_DEFINED_glBufferSubData + void __stdcall GLee_Lazy_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {if (GLeeInit()) glBufferSubData(target, offset, size, data);} + GLEEPFNGLBUFFERSUBDATAPROC GLeeFuncPtr_glBufferSubData=GLee_Lazy_glBufferSubData; +#endif +#ifndef GLEE_C_DEFINED_glGetBufferSubData +#define GLEE_C_DEFINED_glGetBufferSubData + void __stdcall GLee_Lazy_glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data) {if (GLeeInit()) glGetBufferSubData(target, offset, size, data);} + GLEEPFNGLGETBUFFERSUBDATAPROC GLeeFuncPtr_glGetBufferSubData=GLee_Lazy_glGetBufferSubData; +#endif +#ifndef GLEE_C_DEFINED_glMapBuffer +#define GLEE_C_DEFINED_glMapBuffer + GLvoid* __stdcall GLee_Lazy_glMapBuffer(GLenum target, GLenum access) {if (GLeeInit()) return glMapBuffer(target, access); return (GLvoid*)0;} + GLEEPFNGLMAPBUFFERPROC GLeeFuncPtr_glMapBuffer=GLee_Lazy_glMapBuffer; +#endif +#ifndef GLEE_C_DEFINED_glUnmapBuffer +#define GLEE_C_DEFINED_glUnmapBuffer + GLboolean __stdcall GLee_Lazy_glUnmapBuffer(GLenum target) {if (GLeeInit()) return glUnmapBuffer(target); return (GLboolean)0;} + GLEEPFNGLUNMAPBUFFERPROC GLeeFuncPtr_glUnmapBuffer=GLee_Lazy_glUnmapBuffer; +#endif +#ifndef GLEE_C_DEFINED_glGetBufferParameteriv +#define GLEE_C_DEFINED_glGetBufferParameteriv + void __stdcall GLee_Lazy_glGetBufferParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetBufferParameteriv(target, pname, params);} + GLEEPFNGLGETBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetBufferParameteriv=GLee_Lazy_glGetBufferParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glGetBufferPointerv +#define GLEE_C_DEFINED_glGetBufferPointerv + void __stdcall GLee_Lazy_glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetBufferPointerv(target, pname, params);} + GLEEPFNGLGETBUFFERPOINTERVPROC GLeeFuncPtr_glGetBufferPointerv=GLee_Lazy_glGetBufferPointerv; +#endif +#endif + +/* GL_VERSION_2_0 */ + +#ifdef __GLEE_GL_VERSION_2_0 +#ifndef GLEE_C_DEFINED_glBlendEquationSeparate +#define GLEE_C_DEFINED_glBlendEquationSeparate + void __stdcall GLee_Lazy_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) {if (GLeeInit()) glBlendEquationSeparate(modeRGB, modeAlpha);} + GLEEPFNGLBLENDEQUATIONSEPARATEPROC GLeeFuncPtr_glBlendEquationSeparate=GLee_Lazy_glBlendEquationSeparate; +#endif +#ifndef GLEE_C_DEFINED_glDrawBuffers +#define GLEE_C_DEFINED_glDrawBuffers + void __stdcall GLee_Lazy_glDrawBuffers(GLsizei n, const GLenum * bufs) {if (GLeeInit()) glDrawBuffers(n, bufs);} + GLEEPFNGLDRAWBUFFERSPROC GLeeFuncPtr_glDrawBuffers=GLee_Lazy_glDrawBuffers; +#endif +#ifndef GLEE_C_DEFINED_glStencilOpSeparate +#define GLEE_C_DEFINED_glStencilOpSeparate + void __stdcall GLee_Lazy_glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) {if (GLeeInit()) glStencilOpSeparate(face, sfail, dpfail, dppass);} + GLEEPFNGLSTENCILOPSEPARATEPROC GLeeFuncPtr_glStencilOpSeparate=GLee_Lazy_glStencilOpSeparate; +#endif +#ifndef GLEE_C_DEFINED_glStencilFuncSeparate +#define GLEE_C_DEFINED_glStencilFuncSeparate + void __stdcall GLee_Lazy_glStencilFuncSeparate(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) {if (GLeeInit()) glStencilFuncSeparate(frontfunc, backfunc, ref, mask);} + GLEEPFNGLSTENCILFUNCSEPARATEPROC GLeeFuncPtr_glStencilFuncSeparate=GLee_Lazy_glStencilFuncSeparate; +#endif +#ifndef GLEE_C_DEFINED_glStencilMaskSeparate +#define GLEE_C_DEFINED_glStencilMaskSeparate + void __stdcall GLee_Lazy_glStencilMaskSeparate(GLenum face, GLuint mask) {if (GLeeInit()) glStencilMaskSeparate(face, mask);} + GLEEPFNGLSTENCILMASKSEPARATEPROC GLeeFuncPtr_glStencilMaskSeparate=GLee_Lazy_glStencilMaskSeparate; +#endif +#ifndef GLEE_C_DEFINED_glAttachShader +#define GLEE_C_DEFINED_glAttachShader + void __stdcall GLee_Lazy_glAttachShader(GLuint program, GLuint shader) {if (GLeeInit()) glAttachShader(program, shader);} + GLEEPFNGLATTACHSHADERPROC GLeeFuncPtr_glAttachShader=GLee_Lazy_glAttachShader; +#endif +#ifndef GLEE_C_DEFINED_glBindAttribLocation +#define GLEE_C_DEFINED_glBindAttribLocation + void __stdcall GLee_Lazy_glBindAttribLocation(GLuint program, GLuint index, const GLchar * name) {if (GLeeInit()) glBindAttribLocation(program, index, name);} + GLEEPFNGLBINDATTRIBLOCATIONPROC GLeeFuncPtr_glBindAttribLocation=GLee_Lazy_glBindAttribLocation; +#endif +#ifndef GLEE_C_DEFINED_glCompileShader +#define GLEE_C_DEFINED_glCompileShader + void __stdcall GLee_Lazy_glCompileShader(GLuint shader) {if (GLeeInit()) glCompileShader(shader);} + GLEEPFNGLCOMPILESHADERPROC GLeeFuncPtr_glCompileShader=GLee_Lazy_glCompileShader; +#endif +#ifndef GLEE_C_DEFINED_glCreateProgram +#define GLEE_C_DEFINED_glCreateProgram + GLuint __stdcall GLee_Lazy_glCreateProgram(void) {if (GLeeInit()) return glCreateProgram(); return (GLuint)0;} + GLEEPFNGLCREATEPROGRAMPROC GLeeFuncPtr_glCreateProgram=GLee_Lazy_glCreateProgram; +#endif +#ifndef GLEE_C_DEFINED_glCreateShader +#define GLEE_C_DEFINED_glCreateShader + GLuint __stdcall GLee_Lazy_glCreateShader(GLenum type) {if (GLeeInit()) return glCreateShader(type); return (GLuint)0;} + GLEEPFNGLCREATESHADERPROC GLeeFuncPtr_glCreateShader=GLee_Lazy_glCreateShader; +#endif +#ifndef GLEE_C_DEFINED_glDeleteProgram +#define GLEE_C_DEFINED_glDeleteProgram + void __stdcall GLee_Lazy_glDeleteProgram(GLuint program) {if (GLeeInit()) glDeleteProgram(program);} + GLEEPFNGLDELETEPROGRAMPROC GLeeFuncPtr_glDeleteProgram=GLee_Lazy_glDeleteProgram; +#endif +#ifndef GLEE_C_DEFINED_glDeleteShader +#define GLEE_C_DEFINED_glDeleteShader + void __stdcall GLee_Lazy_glDeleteShader(GLuint shader) {if (GLeeInit()) glDeleteShader(shader);} + GLEEPFNGLDELETESHADERPROC GLeeFuncPtr_glDeleteShader=GLee_Lazy_glDeleteShader; +#endif +#ifndef GLEE_C_DEFINED_glDetachShader +#define GLEE_C_DEFINED_glDetachShader + void __stdcall GLee_Lazy_glDetachShader(GLuint program, GLuint shader) {if (GLeeInit()) glDetachShader(program, shader);} + GLEEPFNGLDETACHSHADERPROC GLeeFuncPtr_glDetachShader=GLee_Lazy_glDetachShader; +#endif +#ifndef GLEE_C_DEFINED_glDisableVertexAttribArray +#define GLEE_C_DEFINED_glDisableVertexAttribArray + void __stdcall GLee_Lazy_glDisableVertexAttribArray(GLuint index) {if (GLeeInit()) glDisableVertexAttribArray(index);} + GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glDisableVertexAttribArray=GLee_Lazy_glDisableVertexAttribArray; +#endif +#ifndef GLEE_C_DEFINED_glEnableVertexAttribArray +#define GLEE_C_DEFINED_glEnableVertexAttribArray + void __stdcall GLee_Lazy_glEnableVertexAttribArray(GLuint index) {if (GLeeInit()) glEnableVertexAttribArray(index);} + GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glEnableVertexAttribArray=GLee_Lazy_glEnableVertexAttribArray; +#endif +#ifndef GLEE_C_DEFINED_glGetActiveAttrib +#define GLEE_C_DEFINED_glGetActiveAttrib + void __stdcall GLee_Lazy_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name) {if (GLeeInit()) glGetActiveAttrib(program, index, bufSize, length, size, type, name);} + GLEEPFNGLGETACTIVEATTRIBPROC GLeeFuncPtr_glGetActiveAttrib=GLee_Lazy_glGetActiveAttrib; +#endif +#ifndef GLEE_C_DEFINED_glGetActiveUniform +#define GLEE_C_DEFINED_glGetActiveUniform + void __stdcall GLee_Lazy_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name) {if (GLeeInit()) glGetActiveUniform(program, index, bufSize, length, size, type, name);} + GLEEPFNGLGETACTIVEUNIFORMPROC GLeeFuncPtr_glGetActiveUniform=GLee_Lazy_glGetActiveUniform; +#endif +#ifndef GLEE_C_DEFINED_glGetAttachedShaders +#define GLEE_C_DEFINED_glGetAttachedShaders + void __stdcall GLee_Lazy_glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj) {if (GLeeInit()) glGetAttachedShaders(program, maxCount, count, obj);} + GLEEPFNGLGETATTACHEDSHADERSPROC GLeeFuncPtr_glGetAttachedShaders=GLee_Lazy_glGetAttachedShaders; +#endif +#ifndef GLEE_C_DEFINED_glGetAttribLocation +#define GLEE_C_DEFINED_glGetAttribLocation + GLint __stdcall GLee_Lazy_glGetAttribLocation(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetAttribLocation(program, name); return (GLint)0;} + GLEEPFNGLGETATTRIBLOCATIONPROC GLeeFuncPtr_glGetAttribLocation=GLee_Lazy_glGetAttribLocation; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramiv +#define GLEE_C_DEFINED_glGetProgramiv + void __stdcall GLee_Lazy_glGetProgramiv(GLuint program, GLenum pname, GLint * params) {if (GLeeInit()) glGetProgramiv(program, pname, params);} + GLEEPFNGLGETPROGRAMIVPROC GLeeFuncPtr_glGetProgramiv=GLee_Lazy_glGetProgramiv; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramInfoLog +#define GLEE_C_DEFINED_glGetProgramInfoLog + void __stdcall GLee_Lazy_glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog) {if (GLeeInit()) glGetProgramInfoLog(program, bufSize, length, infoLog);} + GLEEPFNGLGETPROGRAMINFOLOGPROC GLeeFuncPtr_glGetProgramInfoLog=GLee_Lazy_glGetProgramInfoLog; +#endif +#ifndef GLEE_C_DEFINED_glGetShaderiv +#define GLEE_C_DEFINED_glGetShaderiv + void __stdcall GLee_Lazy_glGetShaderiv(GLuint shader, GLenum pname, GLint * params) {if (GLeeInit()) glGetShaderiv(shader, pname, params);} + GLEEPFNGLGETSHADERIVPROC GLeeFuncPtr_glGetShaderiv=GLee_Lazy_glGetShaderiv; +#endif +#ifndef GLEE_C_DEFINED_glGetShaderInfoLog +#define GLEE_C_DEFINED_glGetShaderInfoLog + void __stdcall GLee_Lazy_glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog) {if (GLeeInit()) glGetShaderInfoLog(shader, bufSize, length, infoLog);} + GLEEPFNGLGETSHADERINFOLOGPROC GLeeFuncPtr_glGetShaderInfoLog=GLee_Lazy_glGetShaderInfoLog; +#endif +#ifndef GLEE_C_DEFINED_glGetShaderSource +#define GLEE_C_DEFINED_glGetShaderSource + void __stdcall GLee_Lazy_glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source) {if (GLeeInit()) glGetShaderSource(shader, bufSize, length, source);} + GLEEPFNGLGETSHADERSOURCEPROC GLeeFuncPtr_glGetShaderSource=GLee_Lazy_glGetShaderSource; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformLocation +#define GLEE_C_DEFINED_glGetUniformLocation + GLint __stdcall GLee_Lazy_glGetUniformLocation(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetUniformLocation(program, name); return (GLint)0;} + GLEEPFNGLGETUNIFORMLOCATIONPROC GLeeFuncPtr_glGetUniformLocation=GLee_Lazy_glGetUniformLocation; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformfv +#define GLEE_C_DEFINED_glGetUniformfv + void __stdcall GLee_Lazy_glGetUniformfv(GLuint program, GLint location, GLfloat * params) {if (GLeeInit()) glGetUniformfv(program, location, params);} + GLEEPFNGLGETUNIFORMFVPROC GLeeFuncPtr_glGetUniformfv=GLee_Lazy_glGetUniformfv; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformiv +#define GLEE_C_DEFINED_glGetUniformiv + void __stdcall GLee_Lazy_glGetUniformiv(GLuint program, GLint location, GLint * params) {if (GLeeInit()) glGetUniformiv(program, location, params);} + GLEEPFNGLGETUNIFORMIVPROC GLeeFuncPtr_glGetUniformiv=GLee_Lazy_glGetUniformiv; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribdv +#define GLEE_C_DEFINED_glGetVertexAttribdv + void __stdcall GLee_Lazy_glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetVertexAttribdv(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBDVPROC GLeeFuncPtr_glGetVertexAttribdv=GLee_Lazy_glGetVertexAttribdv; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribfv +#define GLEE_C_DEFINED_glGetVertexAttribfv + void __stdcall GLee_Lazy_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribfv(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBFVPROC GLeeFuncPtr_glGetVertexAttribfv=GLee_Lazy_glGetVertexAttribfv; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribiv +#define GLEE_C_DEFINED_glGetVertexAttribiv + void __stdcall GLee_Lazy_glGetVertexAttribiv(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribiv(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIVPROC GLeeFuncPtr_glGetVertexAttribiv=GLee_Lazy_glGetVertexAttribiv; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribPointerv +#define GLEE_C_DEFINED_glGetVertexAttribPointerv + void __stdcall GLee_Lazy_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* * pointer) {if (GLeeInit()) glGetVertexAttribPointerv(index, pname, pointer);} + GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC GLeeFuncPtr_glGetVertexAttribPointerv=GLee_Lazy_glGetVertexAttribPointerv; +#endif +#ifndef GLEE_C_DEFINED_glIsProgram +#define GLEE_C_DEFINED_glIsProgram + GLboolean __stdcall GLee_Lazy_glIsProgram(GLuint program) {if (GLeeInit()) return glIsProgram(program); return (GLboolean)0;} + GLEEPFNGLISPROGRAMPROC GLeeFuncPtr_glIsProgram=GLee_Lazy_glIsProgram; +#endif +#ifndef GLEE_C_DEFINED_glIsShader +#define GLEE_C_DEFINED_glIsShader + GLboolean __stdcall GLee_Lazy_glIsShader(GLuint shader) {if (GLeeInit()) return glIsShader(shader); return (GLboolean)0;} + GLEEPFNGLISSHADERPROC GLeeFuncPtr_glIsShader=GLee_Lazy_glIsShader; +#endif +#ifndef GLEE_C_DEFINED_glLinkProgram +#define GLEE_C_DEFINED_glLinkProgram + void __stdcall GLee_Lazy_glLinkProgram(GLuint program) {if (GLeeInit()) glLinkProgram(program);} + GLEEPFNGLLINKPROGRAMPROC GLeeFuncPtr_glLinkProgram=GLee_Lazy_glLinkProgram; +#endif +#ifndef GLEE_C_DEFINED_glShaderSource +#define GLEE_C_DEFINED_glShaderSource + void __stdcall GLee_Lazy_glShaderSource(GLuint shader, GLsizei count, const GLchar* * string, const GLint * length) {if (GLeeInit()) glShaderSource(shader, count, string, length);} + GLEEPFNGLSHADERSOURCEPROC GLeeFuncPtr_glShaderSource=GLee_Lazy_glShaderSource; +#endif +#ifndef GLEE_C_DEFINED_glUseProgram +#define GLEE_C_DEFINED_glUseProgram + void __stdcall GLee_Lazy_glUseProgram(GLuint program) {if (GLeeInit()) glUseProgram(program);} + GLEEPFNGLUSEPROGRAMPROC GLeeFuncPtr_glUseProgram=GLee_Lazy_glUseProgram; +#endif +#ifndef GLEE_C_DEFINED_glUniform1f +#define GLEE_C_DEFINED_glUniform1f + void __stdcall GLee_Lazy_glUniform1f(GLint location, GLfloat v0) {if (GLeeInit()) glUniform1f(location, v0);} + GLEEPFNGLUNIFORM1FPROC GLeeFuncPtr_glUniform1f=GLee_Lazy_glUniform1f; +#endif +#ifndef GLEE_C_DEFINED_glUniform2f +#define GLEE_C_DEFINED_glUniform2f + void __stdcall GLee_Lazy_glUniform2f(GLint location, GLfloat v0, GLfloat v1) {if (GLeeInit()) glUniform2f(location, v0, v1);} + GLEEPFNGLUNIFORM2FPROC GLeeFuncPtr_glUniform2f=GLee_Lazy_glUniform2f; +#endif +#ifndef GLEE_C_DEFINED_glUniform3f +#define GLEE_C_DEFINED_glUniform3f + void __stdcall GLee_Lazy_glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {if (GLeeInit()) glUniform3f(location, v0, v1, v2);} + GLEEPFNGLUNIFORM3FPROC GLeeFuncPtr_glUniform3f=GLee_Lazy_glUniform3f; +#endif +#ifndef GLEE_C_DEFINED_glUniform4f +#define GLEE_C_DEFINED_glUniform4f + void __stdcall GLee_Lazy_glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {if (GLeeInit()) glUniform4f(location, v0, v1, v2, v3);} + GLEEPFNGLUNIFORM4FPROC GLeeFuncPtr_glUniform4f=GLee_Lazy_glUniform4f; +#endif +#ifndef GLEE_C_DEFINED_glUniform1i +#define GLEE_C_DEFINED_glUniform1i + void __stdcall GLee_Lazy_glUniform1i(GLint location, GLint v0) {if (GLeeInit()) glUniform1i(location, v0);} + GLEEPFNGLUNIFORM1IPROC GLeeFuncPtr_glUniform1i=GLee_Lazy_glUniform1i; +#endif +#ifndef GLEE_C_DEFINED_glUniform2i +#define GLEE_C_DEFINED_glUniform2i + void __stdcall GLee_Lazy_glUniform2i(GLint location, GLint v0, GLint v1) {if (GLeeInit()) glUniform2i(location, v0, v1);} + GLEEPFNGLUNIFORM2IPROC GLeeFuncPtr_glUniform2i=GLee_Lazy_glUniform2i; +#endif +#ifndef GLEE_C_DEFINED_glUniform3i +#define GLEE_C_DEFINED_glUniform3i + void __stdcall GLee_Lazy_glUniform3i(GLint location, GLint v0, GLint v1, GLint v2) {if (GLeeInit()) glUniform3i(location, v0, v1, v2);} + GLEEPFNGLUNIFORM3IPROC GLeeFuncPtr_glUniform3i=GLee_Lazy_glUniform3i; +#endif +#ifndef GLEE_C_DEFINED_glUniform4i +#define GLEE_C_DEFINED_glUniform4i + void __stdcall GLee_Lazy_glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {if (GLeeInit()) glUniform4i(location, v0, v1, v2, v3);} + GLEEPFNGLUNIFORM4IPROC GLeeFuncPtr_glUniform4i=GLee_Lazy_glUniform4i; +#endif +#ifndef GLEE_C_DEFINED_glUniform1fv +#define GLEE_C_DEFINED_glUniform1fv + void __stdcall GLee_Lazy_glUniform1fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform1fv(location, count, value);} + GLEEPFNGLUNIFORM1FVPROC GLeeFuncPtr_glUniform1fv=GLee_Lazy_glUniform1fv; +#endif +#ifndef GLEE_C_DEFINED_glUniform2fv +#define GLEE_C_DEFINED_glUniform2fv + void __stdcall GLee_Lazy_glUniform2fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform2fv(location, count, value);} + GLEEPFNGLUNIFORM2FVPROC GLeeFuncPtr_glUniform2fv=GLee_Lazy_glUniform2fv; +#endif +#ifndef GLEE_C_DEFINED_glUniform3fv +#define GLEE_C_DEFINED_glUniform3fv + void __stdcall GLee_Lazy_glUniform3fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform3fv(location, count, value);} + GLEEPFNGLUNIFORM3FVPROC GLeeFuncPtr_glUniform3fv=GLee_Lazy_glUniform3fv; +#endif +#ifndef GLEE_C_DEFINED_glUniform4fv +#define GLEE_C_DEFINED_glUniform4fv + void __stdcall GLee_Lazy_glUniform4fv(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform4fv(location, count, value);} + GLEEPFNGLUNIFORM4FVPROC GLeeFuncPtr_glUniform4fv=GLee_Lazy_glUniform4fv; +#endif +#ifndef GLEE_C_DEFINED_glUniform1iv +#define GLEE_C_DEFINED_glUniform1iv + void __stdcall GLee_Lazy_glUniform1iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform1iv(location, count, value);} + GLEEPFNGLUNIFORM1IVPROC GLeeFuncPtr_glUniform1iv=GLee_Lazy_glUniform1iv; +#endif +#ifndef GLEE_C_DEFINED_glUniform2iv +#define GLEE_C_DEFINED_glUniform2iv + void __stdcall GLee_Lazy_glUniform2iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform2iv(location, count, value);} + GLEEPFNGLUNIFORM2IVPROC GLeeFuncPtr_glUniform2iv=GLee_Lazy_glUniform2iv; +#endif +#ifndef GLEE_C_DEFINED_glUniform3iv +#define GLEE_C_DEFINED_glUniform3iv + void __stdcall GLee_Lazy_glUniform3iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform3iv(location, count, value);} + GLEEPFNGLUNIFORM3IVPROC GLeeFuncPtr_glUniform3iv=GLee_Lazy_glUniform3iv; +#endif +#ifndef GLEE_C_DEFINED_glUniform4iv +#define GLEE_C_DEFINED_glUniform4iv + void __stdcall GLee_Lazy_glUniform4iv(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform4iv(location, count, value);} + GLEEPFNGLUNIFORM4IVPROC GLeeFuncPtr_glUniform4iv=GLee_Lazy_glUniform4iv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix2fv +#define GLEE_C_DEFINED_glUniformMatrix2fv + void __stdcall GLee_Lazy_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX2FVPROC GLeeFuncPtr_glUniformMatrix2fv=GLee_Lazy_glUniformMatrix2fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix3fv +#define GLEE_C_DEFINED_glUniformMatrix3fv + void __stdcall GLee_Lazy_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX3FVPROC GLeeFuncPtr_glUniformMatrix3fv=GLee_Lazy_glUniformMatrix3fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix4fv +#define GLEE_C_DEFINED_glUniformMatrix4fv + void __stdcall GLee_Lazy_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX4FVPROC GLeeFuncPtr_glUniformMatrix4fv=GLee_Lazy_glUniformMatrix4fv; +#endif +#ifndef GLEE_C_DEFINED_glValidateProgram +#define GLEE_C_DEFINED_glValidateProgram + void __stdcall GLee_Lazy_glValidateProgram(GLuint program) {if (GLeeInit()) glValidateProgram(program);} + GLEEPFNGLVALIDATEPROGRAMPROC GLeeFuncPtr_glValidateProgram=GLee_Lazy_glValidateProgram; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1d +#define GLEE_C_DEFINED_glVertexAttrib1d + void __stdcall GLee_Lazy_glVertexAttrib1d(GLuint index, GLdouble x) {if (GLeeInit()) glVertexAttrib1d(index, x);} + GLEEPFNGLVERTEXATTRIB1DPROC GLeeFuncPtr_glVertexAttrib1d=GLee_Lazy_glVertexAttrib1d; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1dv +#define GLEE_C_DEFINED_glVertexAttrib1dv + void __stdcall GLee_Lazy_glVertexAttrib1dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib1dv(index, v);} + GLEEPFNGLVERTEXATTRIB1DVPROC GLeeFuncPtr_glVertexAttrib1dv=GLee_Lazy_glVertexAttrib1dv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1f +#define GLEE_C_DEFINED_glVertexAttrib1f + void __stdcall GLee_Lazy_glVertexAttrib1f(GLuint index, GLfloat x) {if (GLeeInit()) glVertexAttrib1f(index, x);} + GLEEPFNGLVERTEXATTRIB1FPROC GLeeFuncPtr_glVertexAttrib1f=GLee_Lazy_glVertexAttrib1f; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1fv +#define GLEE_C_DEFINED_glVertexAttrib1fv + void __stdcall GLee_Lazy_glVertexAttrib1fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib1fv(index, v);} + GLEEPFNGLVERTEXATTRIB1FVPROC GLeeFuncPtr_glVertexAttrib1fv=GLee_Lazy_glVertexAttrib1fv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1s +#define GLEE_C_DEFINED_glVertexAttrib1s + void __stdcall GLee_Lazy_glVertexAttrib1s(GLuint index, GLshort x) {if (GLeeInit()) glVertexAttrib1s(index, x);} + GLEEPFNGLVERTEXATTRIB1SPROC GLeeFuncPtr_glVertexAttrib1s=GLee_Lazy_glVertexAttrib1s; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1sv +#define GLEE_C_DEFINED_glVertexAttrib1sv + void __stdcall GLee_Lazy_glVertexAttrib1sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib1sv(index, v);} + GLEEPFNGLVERTEXATTRIB1SVPROC GLeeFuncPtr_glVertexAttrib1sv=GLee_Lazy_glVertexAttrib1sv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2d +#define GLEE_C_DEFINED_glVertexAttrib2d + void __stdcall GLee_Lazy_glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexAttrib2d(index, x, y);} + GLEEPFNGLVERTEXATTRIB2DPROC GLeeFuncPtr_glVertexAttrib2d=GLee_Lazy_glVertexAttrib2d; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2dv +#define GLEE_C_DEFINED_glVertexAttrib2dv + void __stdcall GLee_Lazy_glVertexAttrib2dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib2dv(index, v);} + GLEEPFNGLVERTEXATTRIB2DVPROC GLeeFuncPtr_glVertexAttrib2dv=GLee_Lazy_glVertexAttrib2dv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2f +#define GLEE_C_DEFINED_glVertexAttrib2f + void __stdcall GLee_Lazy_glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexAttrib2f(index, x, y);} + GLEEPFNGLVERTEXATTRIB2FPROC GLeeFuncPtr_glVertexAttrib2f=GLee_Lazy_glVertexAttrib2f; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2fv +#define GLEE_C_DEFINED_glVertexAttrib2fv + void __stdcall GLee_Lazy_glVertexAttrib2fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib2fv(index, v);} + GLEEPFNGLVERTEXATTRIB2FVPROC GLeeFuncPtr_glVertexAttrib2fv=GLee_Lazy_glVertexAttrib2fv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2s +#define GLEE_C_DEFINED_glVertexAttrib2s + void __stdcall GLee_Lazy_glVertexAttrib2s(GLuint index, GLshort x, GLshort y) {if (GLeeInit()) glVertexAttrib2s(index, x, y);} + GLEEPFNGLVERTEXATTRIB2SPROC GLeeFuncPtr_glVertexAttrib2s=GLee_Lazy_glVertexAttrib2s; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2sv +#define GLEE_C_DEFINED_glVertexAttrib2sv + void __stdcall GLee_Lazy_glVertexAttrib2sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib2sv(index, v);} + GLEEPFNGLVERTEXATTRIB2SVPROC GLeeFuncPtr_glVertexAttrib2sv=GLee_Lazy_glVertexAttrib2sv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3d +#define GLEE_C_DEFINED_glVertexAttrib3d + void __stdcall GLee_Lazy_glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexAttrib3d(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3DPROC GLeeFuncPtr_glVertexAttrib3d=GLee_Lazy_glVertexAttrib3d; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3dv +#define GLEE_C_DEFINED_glVertexAttrib3dv + void __stdcall GLee_Lazy_glVertexAttrib3dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib3dv(index, v);} + GLEEPFNGLVERTEXATTRIB3DVPROC GLeeFuncPtr_glVertexAttrib3dv=GLee_Lazy_glVertexAttrib3dv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3f +#define GLEE_C_DEFINED_glVertexAttrib3f + void __stdcall GLee_Lazy_glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexAttrib3f(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3FPROC GLeeFuncPtr_glVertexAttrib3f=GLee_Lazy_glVertexAttrib3f; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3fv +#define GLEE_C_DEFINED_glVertexAttrib3fv + void __stdcall GLee_Lazy_glVertexAttrib3fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib3fv(index, v);} + GLEEPFNGLVERTEXATTRIB3FVPROC GLeeFuncPtr_glVertexAttrib3fv=GLee_Lazy_glVertexAttrib3fv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3s +#define GLEE_C_DEFINED_glVertexAttrib3s + void __stdcall GLee_Lazy_glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexAttrib3s(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3SPROC GLeeFuncPtr_glVertexAttrib3s=GLee_Lazy_glVertexAttrib3s; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3sv +#define GLEE_C_DEFINED_glVertexAttrib3sv + void __stdcall GLee_Lazy_glVertexAttrib3sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib3sv(index, v);} + GLEEPFNGLVERTEXATTRIB3SVPROC GLeeFuncPtr_glVertexAttrib3sv=GLee_Lazy_glVertexAttrib3sv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Nbv +#define GLEE_C_DEFINED_glVertexAttrib4Nbv + void __stdcall GLee_Lazy_glVertexAttrib4Nbv(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4Nbv(index, v);} + GLEEPFNGLVERTEXATTRIB4NBVPROC GLeeFuncPtr_glVertexAttrib4Nbv=GLee_Lazy_glVertexAttrib4Nbv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Niv +#define GLEE_C_DEFINED_glVertexAttrib4Niv + void __stdcall GLee_Lazy_glVertexAttrib4Niv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4Niv(index, v);} + GLEEPFNGLVERTEXATTRIB4NIVPROC GLeeFuncPtr_glVertexAttrib4Niv=GLee_Lazy_glVertexAttrib4Niv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Nsv +#define GLEE_C_DEFINED_glVertexAttrib4Nsv + void __stdcall GLee_Lazy_glVertexAttrib4Nsv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4Nsv(index, v);} + GLEEPFNGLVERTEXATTRIB4NSVPROC GLeeFuncPtr_glVertexAttrib4Nsv=GLee_Lazy_glVertexAttrib4Nsv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Nub +#define GLEE_C_DEFINED_glVertexAttrib4Nub + void __stdcall GLee_Lazy_glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) {if (GLeeInit()) glVertexAttrib4Nub(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4NUBPROC GLeeFuncPtr_glVertexAttrib4Nub=GLee_Lazy_glVertexAttrib4Nub; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Nubv +#define GLEE_C_DEFINED_glVertexAttrib4Nubv + void __stdcall GLee_Lazy_glVertexAttrib4Nubv(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4Nubv(index, v);} + GLEEPFNGLVERTEXATTRIB4NUBVPROC GLeeFuncPtr_glVertexAttrib4Nubv=GLee_Lazy_glVertexAttrib4Nubv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Nuiv +#define GLEE_C_DEFINED_glVertexAttrib4Nuiv + void __stdcall GLee_Lazy_glVertexAttrib4Nuiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4Nuiv(index, v);} + GLEEPFNGLVERTEXATTRIB4NUIVPROC GLeeFuncPtr_glVertexAttrib4Nuiv=GLee_Lazy_glVertexAttrib4Nuiv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4Nusv +#define GLEE_C_DEFINED_glVertexAttrib4Nusv + void __stdcall GLee_Lazy_glVertexAttrib4Nusv(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4Nusv(index, v);} + GLEEPFNGLVERTEXATTRIB4NUSVPROC GLeeFuncPtr_glVertexAttrib4Nusv=GLee_Lazy_glVertexAttrib4Nusv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4bv +#define GLEE_C_DEFINED_glVertexAttrib4bv + void __stdcall GLee_Lazy_glVertexAttrib4bv(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4bv(index, v);} + GLEEPFNGLVERTEXATTRIB4BVPROC GLeeFuncPtr_glVertexAttrib4bv=GLee_Lazy_glVertexAttrib4bv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4d +#define GLEE_C_DEFINED_glVertexAttrib4d + void __stdcall GLee_Lazy_glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexAttrib4d(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4DPROC GLeeFuncPtr_glVertexAttrib4d=GLee_Lazy_glVertexAttrib4d; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4dv +#define GLEE_C_DEFINED_glVertexAttrib4dv + void __stdcall GLee_Lazy_glVertexAttrib4dv(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib4dv(index, v);} + GLEEPFNGLVERTEXATTRIB4DVPROC GLeeFuncPtr_glVertexAttrib4dv=GLee_Lazy_glVertexAttrib4dv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4f +#define GLEE_C_DEFINED_glVertexAttrib4f + void __stdcall GLee_Lazy_glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexAttrib4f(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4FPROC GLeeFuncPtr_glVertexAttrib4f=GLee_Lazy_glVertexAttrib4f; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4fv +#define GLEE_C_DEFINED_glVertexAttrib4fv + void __stdcall GLee_Lazy_glVertexAttrib4fv(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib4fv(index, v);} + GLEEPFNGLVERTEXATTRIB4FVPROC GLeeFuncPtr_glVertexAttrib4fv=GLee_Lazy_glVertexAttrib4fv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4iv +#define GLEE_C_DEFINED_glVertexAttrib4iv + void __stdcall GLee_Lazy_glVertexAttrib4iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4iv(index, v);} + GLEEPFNGLVERTEXATTRIB4IVPROC GLeeFuncPtr_glVertexAttrib4iv=GLee_Lazy_glVertexAttrib4iv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4s +#define GLEE_C_DEFINED_glVertexAttrib4s + void __stdcall GLee_Lazy_glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexAttrib4s(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4SPROC GLeeFuncPtr_glVertexAttrib4s=GLee_Lazy_glVertexAttrib4s; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4sv +#define GLEE_C_DEFINED_glVertexAttrib4sv + void __stdcall GLee_Lazy_glVertexAttrib4sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4sv(index, v);} + GLEEPFNGLVERTEXATTRIB4SVPROC GLeeFuncPtr_glVertexAttrib4sv=GLee_Lazy_glVertexAttrib4sv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4ubv +#define GLEE_C_DEFINED_glVertexAttrib4ubv + void __stdcall GLee_Lazy_glVertexAttrib4ubv(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4ubv(index, v);} + GLEEPFNGLVERTEXATTRIB4UBVPROC GLeeFuncPtr_glVertexAttrib4ubv=GLee_Lazy_glVertexAttrib4ubv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4uiv +#define GLEE_C_DEFINED_glVertexAttrib4uiv + void __stdcall GLee_Lazy_glVertexAttrib4uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4uiv(index, v);} + GLEEPFNGLVERTEXATTRIB4UIVPROC GLeeFuncPtr_glVertexAttrib4uiv=GLee_Lazy_glVertexAttrib4uiv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4usv +#define GLEE_C_DEFINED_glVertexAttrib4usv + void __stdcall GLee_Lazy_glVertexAttrib4usv(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4usv(index, v);} + GLEEPFNGLVERTEXATTRIB4USVPROC GLeeFuncPtr_glVertexAttrib4usv=GLee_Lazy_glVertexAttrib4usv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribPointer +#define GLEE_C_DEFINED_glVertexAttribPointer + void __stdcall GLee_Lazy_glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribPointer(index, size, type, normalized, stride, pointer);} + GLEEPFNGLVERTEXATTRIBPOINTERPROC GLeeFuncPtr_glVertexAttribPointer=GLee_Lazy_glVertexAttribPointer; +#endif +#endif + +/* GL_VERSION_2_1 */ + +#ifdef __GLEE_GL_VERSION_2_1 +#ifndef GLEE_C_DEFINED_glUniformMatrix2x3fv +#define GLEE_C_DEFINED_glUniformMatrix2x3fv + void __stdcall GLee_Lazy_glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2x3fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX2X3FVPROC GLeeFuncPtr_glUniformMatrix2x3fv=GLee_Lazy_glUniformMatrix2x3fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix3x2fv +#define GLEE_C_DEFINED_glUniformMatrix3x2fv + void __stdcall GLee_Lazy_glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3x2fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX3X2FVPROC GLeeFuncPtr_glUniformMatrix3x2fv=GLee_Lazy_glUniformMatrix3x2fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix2x4fv +#define GLEE_C_DEFINED_glUniformMatrix2x4fv + void __stdcall GLee_Lazy_glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2x4fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX2X4FVPROC GLeeFuncPtr_glUniformMatrix2x4fv=GLee_Lazy_glUniformMatrix2x4fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix4x2fv +#define GLEE_C_DEFINED_glUniformMatrix4x2fv + void __stdcall GLee_Lazy_glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4x2fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX4X2FVPROC GLeeFuncPtr_glUniformMatrix4x2fv=GLee_Lazy_glUniformMatrix4x2fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix3x4fv +#define GLEE_C_DEFINED_glUniformMatrix3x4fv + void __stdcall GLee_Lazy_glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3x4fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX3X4FVPROC GLeeFuncPtr_glUniformMatrix3x4fv=GLee_Lazy_glUniformMatrix3x4fv; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix4x3fv +#define GLEE_C_DEFINED_glUniformMatrix4x3fv + void __stdcall GLee_Lazy_glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4x3fv(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX4X3FVPROC GLeeFuncPtr_glUniformMatrix4x3fv=GLee_Lazy_glUniformMatrix4x3fv; +#endif +#endif + +/* GL_VERSION_3_0 */ + +#ifdef __GLEE_GL_VERSION_3_0 +#ifndef GLEE_C_DEFINED_glColorMaski +#define GLEE_C_DEFINED_glColorMaski + void __stdcall GLee_Lazy_glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) {if (GLeeInit()) glColorMaski(index, r, g, b, a);} + GLEEPFNGLCOLORMASKIPROC GLeeFuncPtr_glColorMaski=GLee_Lazy_glColorMaski; +#endif +#ifndef GLEE_C_DEFINED_glGetBooleani_v +#define GLEE_C_DEFINED_glGetBooleani_v + void __stdcall GLee_Lazy_glGetBooleani_v(GLenum target, GLuint index, GLboolean * data) {if (GLeeInit()) glGetBooleani_v(target, index, data);} + GLEEPFNGLGETBOOLEANI_VPROC GLeeFuncPtr_glGetBooleani_v=GLee_Lazy_glGetBooleani_v; +#endif +#ifndef GLEE_C_DEFINED_glGetIntegeri_v +#define GLEE_C_DEFINED_glGetIntegeri_v + void __stdcall GLee_Lazy_glGetIntegeri_v(GLenum target, GLuint index, GLint * data) {if (GLeeInit()) glGetIntegeri_v(target, index, data);} + GLEEPFNGLGETINTEGERI_VPROC GLeeFuncPtr_glGetIntegeri_v=GLee_Lazy_glGetIntegeri_v; +#endif +#ifndef GLEE_C_DEFINED_glEnablei +#define GLEE_C_DEFINED_glEnablei + void __stdcall GLee_Lazy_glEnablei(GLenum target, GLuint index) {if (GLeeInit()) glEnablei(target, index);} + GLEEPFNGLENABLEIPROC GLeeFuncPtr_glEnablei=GLee_Lazy_glEnablei; +#endif +#ifndef GLEE_C_DEFINED_glDisablei +#define GLEE_C_DEFINED_glDisablei + void __stdcall GLee_Lazy_glDisablei(GLenum target, GLuint index) {if (GLeeInit()) glDisablei(target, index);} + GLEEPFNGLDISABLEIPROC GLeeFuncPtr_glDisablei=GLee_Lazy_glDisablei; +#endif +#ifndef GLEE_C_DEFINED_glIsEnabledi +#define GLEE_C_DEFINED_glIsEnabledi + GLboolean __stdcall GLee_Lazy_glIsEnabledi(GLenum target, GLuint index) {if (GLeeInit()) return glIsEnabledi(target, index); return (GLboolean)0;} + GLEEPFNGLISENABLEDIPROC GLeeFuncPtr_glIsEnabledi=GLee_Lazy_glIsEnabledi; +#endif +#ifndef GLEE_C_DEFINED_glBeginTransformFeedback +#define GLEE_C_DEFINED_glBeginTransformFeedback + void __stdcall GLee_Lazy_glBeginTransformFeedback(GLenum primitiveMode) {if (GLeeInit()) glBeginTransformFeedback(primitiveMode);} + GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC GLeeFuncPtr_glBeginTransformFeedback=GLee_Lazy_glBeginTransformFeedback; +#endif +#ifndef GLEE_C_DEFINED_glEndTransformFeedback +#define GLEE_C_DEFINED_glEndTransformFeedback + void __stdcall GLee_Lazy_glEndTransformFeedback(void) {if (GLeeInit()) glEndTransformFeedback();} + GLEEPFNGLENDTRANSFORMFEEDBACKPROC GLeeFuncPtr_glEndTransformFeedback=GLee_Lazy_glEndTransformFeedback; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferRange +#define GLEE_C_DEFINED_glBindBufferRange + void __stdcall GLee_Lazy_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glBindBufferRange(target, index, buffer, offset, size);} + GLEEPFNGLBINDBUFFERRANGEPROC GLeeFuncPtr_glBindBufferRange=GLee_Lazy_glBindBufferRange; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferBase +#define GLEE_C_DEFINED_glBindBufferBase + void __stdcall GLee_Lazy_glBindBufferBase(GLenum target, GLuint index, GLuint buffer) {if (GLeeInit()) glBindBufferBase(target, index, buffer);} + GLEEPFNGLBINDBUFFERBASEPROC GLeeFuncPtr_glBindBufferBase=GLee_Lazy_glBindBufferBase; +#endif +#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryings +#define GLEE_C_DEFINED_glTransformFeedbackVaryings + void __stdcall GLee_Lazy_glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackVaryings(program, count, locations, bufferMode);} + GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC GLeeFuncPtr_glTransformFeedbackVaryings=GLee_Lazy_glTransformFeedbackVaryings; +#endif +#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVarying +#define GLEE_C_DEFINED_glGetTransformFeedbackVarying + void __stdcall GLee_Lazy_glGetTransformFeedbackVarying(GLuint program, GLuint index, GLint * location) {if (GLeeInit()) glGetTransformFeedbackVarying(program, index, location);} + GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC GLeeFuncPtr_glGetTransformFeedbackVarying=GLee_Lazy_glGetTransformFeedbackVarying; +#endif +#ifndef GLEE_C_DEFINED_glClampColor +#define GLEE_C_DEFINED_glClampColor + void __stdcall GLee_Lazy_glClampColor(GLenum target, GLenum clamp) {if (GLeeInit()) glClampColor(target, clamp);} + GLEEPFNGLCLAMPCOLORPROC GLeeFuncPtr_glClampColor=GLee_Lazy_glClampColor; +#endif +#ifndef GLEE_C_DEFINED_glBeginConditionalRender +#define GLEE_C_DEFINED_glBeginConditionalRender + void __stdcall GLee_Lazy_glBeginConditionalRender(GLuint id, GLenum mode) {if (GLeeInit()) glBeginConditionalRender(id, mode);} + GLEEPFNGLBEGINCONDITIONALRENDERPROC GLeeFuncPtr_glBeginConditionalRender=GLee_Lazy_glBeginConditionalRender; +#endif +#ifndef GLEE_C_DEFINED_glEndConditionalRender +#define GLEE_C_DEFINED_glEndConditionalRender + void __stdcall GLee_Lazy_glEndConditionalRender(void) {if (GLeeInit()) glEndConditionalRender();} + GLEEPFNGLENDCONDITIONALRENDERPROC GLeeFuncPtr_glEndConditionalRender=GLee_Lazy_glEndConditionalRender; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1i +#define GLEE_C_DEFINED_glVertexAttribI1i + void __stdcall GLee_Lazy_glVertexAttribI1i(GLuint index, GLint x) {if (GLeeInit()) glVertexAttribI1i(index, x);} + GLEEPFNGLVERTEXATTRIBI1IPROC GLeeFuncPtr_glVertexAttribI1i=GLee_Lazy_glVertexAttribI1i; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2i +#define GLEE_C_DEFINED_glVertexAttribI2i + void __stdcall GLee_Lazy_glVertexAttribI2i(GLuint index, GLint x, GLint y) {if (GLeeInit()) glVertexAttribI2i(index, x, y);} + GLEEPFNGLVERTEXATTRIBI2IPROC GLeeFuncPtr_glVertexAttribI2i=GLee_Lazy_glVertexAttribI2i; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3i +#define GLEE_C_DEFINED_glVertexAttribI3i + void __stdcall GLee_Lazy_glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z) {if (GLeeInit()) glVertexAttribI3i(index, x, y, z);} + GLEEPFNGLVERTEXATTRIBI3IPROC GLeeFuncPtr_glVertexAttribI3i=GLee_Lazy_glVertexAttribI3i; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4i +#define GLEE_C_DEFINED_glVertexAttribI4i + void __stdcall GLee_Lazy_glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glVertexAttribI4i(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIBI4IPROC GLeeFuncPtr_glVertexAttribI4i=GLee_Lazy_glVertexAttribI4i; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1ui +#define GLEE_C_DEFINED_glVertexAttribI1ui + void __stdcall GLee_Lazy_glVertexAttribI1ui(GLuint index, GLuint x) {if (GLeeInit()) glVertexAttribI1ui(index, x);} + GLEEPFNGLVERTEXATTRIBI1UIPROC GLeeFuncPtr_glVertexAttribI1ui=GLee_Lazy_glVertexAttribI1ui; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2ui +#define GLEE_C_DEFINED_glVertexAttribI2ui + void __stdcall GLee_Lazy_glVertexAttribI2ui(GLuint index, GLuint x, GLuint y) {if (GLeeInit()) glVertexAttribI2ui(index, x, y);} + GLEEPFNGLVERTEXATTRIBI2UIPROC GLeeFuncPtr_glVertexAttribI2ui=GLee_Lazy_glVertexAttribI2ui; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3ui +#define GLEE_C_DEFINED_glVertexAttribI3ui + void __stdcall GLee_Lazy_glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z) {if (GLeeInit()) glVertexAttribI3ui(index, x, y, z);} + GLEEPFNGLVERTEXATTRIBI3UIPROC GLeeFuncPtr_glVertexAttribI3ui=GLee_Lazy_glVertexAttribI3ui; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4ui +#define GLEE_C_DEFINED_glVertexAttribI4ui + void __stdcall GLee_Lazy_glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glVertexAttribI4ui(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIBI4UIPROC GLeeFuncPtr_glVertexAttribI4ui=GLee_Lazy_glVertexAttribI4ui; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1iv +#define GLEE_C_DEFINED_glVertexAttribI1iv + void __stdcall GLee_Lazy_glVertexAttribI1iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI1iv(index, v);} + GLEEPFNGLVERTEXATTRIBI1IVPROC GLeeFuncPtr_glVertexAttribI1iv=GLee_Lazy_glVertexAttribI1iv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2iv +#define GLEE_C_DEFINED_glVertexAttribI2iv + void __stdcall GLee_Lazy_glVertexAttribI2iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI2iv(index, v);} + GLEEPFNGLVERTEXATTRIBI2IVPROC GLeeFuncPtr_glVertexAttribI2iv=GLee_Lazy_glVertexAttribI2iv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3iv +#define GLEE_C_DEFINED_glVertexAttribI3iv + void __stdcall GLee_Lazy_glVertexAttribI3iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI3iv(index, v);} + GLEEPFNGLVERTEXATTRIBI3IVPROC GLeeFuncPtr_glVertexAttribI3iv=GLee_Lazy_glVertexAttribI3iv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4iv +#define GLEE_C_DEFINED_glVertexAttribI4iv + void __stdcall GLee_Lazy_glVertexAttribI4iv(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI4iv(index, v);} + GLEEPFNGLVERTEXATTRIBI4IVPROC GLeeFuncPtr_glVertexAttribI4iv=GLee_Lazy_glVertexAttribI4iv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1uiv +#define GLEE_C_DEFINED_glVertexAttribI1uiv + void __stdcall GLee_Lazy_glVertexAttribI1uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI1uiv(index, v);} + GLEEPFNGLVERTEXATTRIBI1UIVPROC GLeeFuncPtr_glVertexAttribI1uiv=GLee_Lazy_glVertexAttribI1uiv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2uiv +#define GLEE_C_DEFINED_glVertexAttribI2uiv + void __stdcall GLee_Lazy_glVertexAttribI2uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI2uiv(index, v);} + GLEEPFNGLVERTEXATTRIBI2UIVPROC GLeeFuncPtr_glVertexAttribI2uiv=GLee_Lazy_glVertexAttribI2uiv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3uiv +#define GLEE_C_DEFINED_glVertexAttribI3uiv + void __stdcall GLee_Lazy_glVertexAttribI3uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI3uiv(index, v);} + GLEEPFNGLVERTEXATTRIBI3UIVPROC GLeeFuncPtr_glVertexAttribI3uiv=GLee_Lazy_glVertexAttribI3uiv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4uiv +#define GLEE_C_DEFINED_glVertexAttribI4uiv + void __stdcall GLee_Lazy_glVertexAttribI4uiv(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI4uiv(index, v);} + GLEEPFNGLVERTEXATTRIBI4UIVPROC GLeeFuncPtr_glVertexAttribI4uiv=GLee_Lazy_glVertexAttribI4uiv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4bv +#define GLEE_C_DEFINED_glVertexAttribI4bv + void __stdcall GLee_Lazy_glVertexAttribI4bv(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttribI4bv(index, v);} + GLEEPFNGLVERTEXATTRIBI4BVPROC GLeeFuncPtr_glVertexAttribI4bv=GLee_Lazy_glVertexAttribI4bv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4sv +#define GLEE_C_DEFINED_glVertexAttribI4sv + void __stdcall GLee_Lazy_glVertexAttribI4sv(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttribI4sv(index, v);} + GLEEPFNGLVERTEXATTRIBI4SVPROC GLeeFuncPtr_glVertexAttribI4sv=GLee_Lazy_glVertexAttribI4sv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4ubv +#define GLEE_C_DEFINED_glVertexAttribI4ubv + void __stdcall GLee_Lazy_glVertexAttribI4ubv(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttribI4ubv(index, v);} + GLEEPFNGLVERTEXATTRIBI4UBVPROC GLeeFuncPtr_glVertexAttribI4ubv=GLee_Lazy_glVertexAttribI4ubv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4usv +#define GLEE_C_DEFINED_glVertexAttribI4usv + void __stdcall GLee_Lazy_glVertexAttribI4usv(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttribI4usv(index, v);} + GLEEPFNGLVERTEXATTRIBI4USVPROC GLeeFuncPtr_glVertexAttribI4usv=GLee_Lazy_glVertexAttribI4usv; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribIPointer +#define GLEE_C_DEFINED_glVertexAttribIPointer + void __stdcall GLee_Lazy_glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribIPointer(index, size, type, stride, pointer);} + GLEEPFNGLVERTEXATTRIBIPOINTERPROC GLeeFuncPtr_glVertexAttribIPointer=GLee_Lazy_glVertexAttribIPointer; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribIiv +#define GLEE_C_DEFINED_glGetVertexAttribIiv + void __stdcall GLee_Lazy_glGetVertexAttribIiv(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribIiv(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIIVPROC GLeeFuncPtr_glGetVertexAttribIiv=GLee_Lazy_glGetVertexAttribIiv; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribIuiv +#define GLEE_C_DEFINED_glGetVertexAttribIuiv + void __stdcall GLee_Lazy_glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint * params) {if (GLeeInit()) glGetVertexAttribIuiv(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIUIVPROC GLeeFuncPtr_glGetVertexAttribIuiv=GLee_Lazy_glGetVertexAttribIuiv; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformuiv +#define GLEE_C_DEFINED_glGetUniformuiv + void __stdcall GLee_Lazy_glGetUniformuiv(GLuint program, GLint location, GLuint * params) {if (GLeeInit()) glGetUniformuiv(program, location, params);} + GLEEPFNGLGETUNIFORMUIVPROC GLeeFuncPtr_glGetUniformuiv=GLee_Lazy_glGetUniformuiv; +#endif +#ifndef GLEE_C_DEFINED_glBindFragDataLocation +#define GLEE_C_DEFINED_glBindFragDataLocation + void __stdcall GLee_Lazy_glBindFragDataLocation(GLuint program, GLuint color, const GLchar * name) {if (GLeeInit()) glBindFragDataLocation(program, color, name);} + GLEEPFNGLBINDFRAGDATALOCATIONPROC GLeeFuncPtr_glBindFragDataLocation=GLee_Lazy_glBindFragDataLocation; +#endif +#ifndef GLEE_C_DEFINED_glGetFragDataLocation +#define GLEE_C_DEFINED_glGetFragDataLocation + GLint __stdcall GLee_Lazy_glGetFragDataLocation(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetFragDataLocation(program, name); return (GLint)0;} + GLEEPFNGLGETFRAGDATALOCATIONPROC GLeeFuncPtr_glGetFragDataLocation=GLee_Lazy_glGetFragDataLocation; +#endif +#ifndef GLEE_C_DEFINED_glUniform1ui +#define GLEE_C_DEFINED_glUniform1ui + void __stdcall GLee_Lazy_glUniform1ui(GLint location, GLuint v0) {if (GLeeInit()) glUniform1ui(location, v0);} + GLEEPFNGLUNIFORM1UIPROC GLeeFuncPtr_glUniform1ui=GLee_Lazy_glUniform1ui; +#endif +#ifndef GLEE_C_DEFINED_glUniform2ui +#define GLEE_C_DEFINED_glUniform2ui + void __stdcall GLee_Lazy_glUniform2ui(GLint location, GLuint v0, GLuint v1) {if (GLeeInit()) glUniform2ui(location, v0, v1);} + GLEEPFNGLUNIFORM2UIPROC GLeeFuncPtr_glUniform2ui=GLee_Lazy_glUniform2ui; +#endif +#ifndef GLEE_C_DEFINED_glUniform3ui +#define GLEE_C_DEFINED_glUniform3ui + void __stdcall GLee_Lazy_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) {if (GLeeInit()) glUniform3ui(location, v0, v1, v2);} + GLEEPFNGLUNIFORM3UIPROC GLeeFuncPtr_glUniform3ui=GLee_Lazy_glUniform3ui; +#endif +#ifndef GLEE_C_DEFINED_glUniform4ui +#define GLEE_C_DEFINED_glUniform4ui + void __stdcall GLee_Lazy_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {if (GLeeInit()) glUniform4ui(location, v0, v1, v2, v3);} + GLEEPFNGLUNIFORM4UIPROC GLeeFuncPtr_glUniform4ui=GLee_Lazy_glUniform4ui; +#endif +#ifndef GLEE_C_DEFINED_glUniform1uiv +#define GLEE_C_DEFINED_glUniform1uiv + void __stdcall GLee_Lazy_glUniform1uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform1uiv(location, count, value);} + GLEEPFNGLUNIFORM1UIVPROC GLeeFuncPtr_glUniform1uiv=GLee_Lazy_glUniform1uiv; +#endif +#ifndef GLEE_C_DEFINED_glUniform2uiv +#define GLEE_C_DEFINED_glUniform2uiv + void __stdcall GLee_Lazy_glUniform2uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform2uiv(location, count, value);} + GLEEPFNGLUNIFORM2UIVPROC GLeeFuncPtr_glUniform2uiv=GLee_Lazy_glUniform2uiv; +#endif +#ifndef GLEE_C_DEFINED_glUniform3uiv +#define GLEE_C_DEFINED_glUniform3uiv + void __stdcall GLee_Lazy_glUniform3uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform3uiv(location, count, value);} + GLEEPFNGLUNIFORM3UIVPROC GLeeFuncPtr_glUniform3uiv=GLee_Lazy_glUniform3uiv; +#endif +#ifndef GLEE_C_DEFINED_glUniform4uiv +#define GLEE_C_DEFINED_glUniform4uiv + void __stdcall GLee_Lazy_glUniform4uiv(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform4uiv(location, count, value);} + GLEEPFNGLUNIFORM4UIVPROC GLeeFuncPtr_glUniform4uiv=GLee_Lazy_glUniform4uiv; +#endif +#ifndef GLEE_C_DEFINED_glTexParameterIiv +#define GLEE_C_DEFINED_glTexParameterIiv + void __stdcall GLee_Lazy_glTexParameterIiv(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTexParameterIiv(target, pname, params);} + GLEEPFNGLTEXPARAMETERIIVPROC GLeeFuncPtr_glTexParameterIiv=GLee_Lazy_glTexParameterIiv; +#endif +#ifndef GLEE_C_DEFINED_glTexParameterIuiv +#define GLEE_C_DEFINED_glTexParameterIuiv + void __stdcall GLee_Lazy_glTexParameterIuiv(GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glTexParameterIuiv(target, pname, params);} + GLEEPFNGLTEXPARAMETERIUIVPROC GLeeFuncPtr_glTexParameterIuiv=GLee_Lazy_glTexParameterIuiv; +#endif +#ifndef GLEE_C_DEFINED_glGetTexParameterIiv +#define GLEE_C_DEFINED_glGetTexParameterIiv + void __stdcall GLee_Lazy_glGetTexParameterIiv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTexParameterIiv(target, pname, params);} + GLEEPFNGLGETTEXPARAMETERIIVPROC GLeeFuncPtr_glGetTexParameterIiv=GLee_Lazy_glGetTexParameterIiv; +#endif +#ifndef GLEE_C_DEFINED_glGetTexParameterIuiv +#define GLEE_C_DEFINED_glGetTexParameterIuiv + void __stdcall GLee_Lazy_glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetTexParameterIuiv(target, pname, params);} + GLEEPFNGLGETTEXPARAMETERIUIVPROC GLeeFuncPtr_glGetTexParameterIuiv=GLee_Lazy_glGetTexParameterIuiv; +#endif +#ifndef GLEE_C_DEFINED_glClearBufferiv +#define GLEE_C_DEFINED_glClearBufferiv + void __stdcall GLee_Lazy_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint * value) {if (GLeeInit()) glClearBufferiv(buffer, drawbuffer, value);} + GLEEPFNGLCLEARBUFFERIVPROC GLeeFuncPtr_glClearBufferiv=GLee_Lazy_glClearBufferiv; +#endif +#ifndef GLEE_C_DEFINED_glClearBufferuiv +#define GLEE_C_DEFINED_glClearBufferuiv + void __stdcall GLee_Lazy_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint * value) {if (GLeeInit()) glClearBufferuiv(buffer, drawbuffer, value);} + GLEEPFNGLCLEARBUFFERUIVPROC GLeeFuncPtr_glClearBufferuiv=GLee_Lazy_glClearBufferuiv; +#endif +#ifndef GLEE_C_DEFINED_glClearBufferfv +#define GLEE_C_DEFINED_glClearBufferfv + void __stdcall GLee_Lazy_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat * value) {if (GLeeInit()) glClearBufferfv(buffer, drawbuffer, value);} + GLEEPFNGLCLEARBUFFERFVPROC GLeeFuncPtr_glClearBufferfv=GLee_Lazy_glClearBufferfv; +#endif +#ifndef GLEE_C_DEFINED_glClearBufferfi +#define GLEE_C_DEFINED_glClearBufferfi + void __stdcall GLee_Lazy_glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) {if (GLeeInit()) glClearBufferfi(buffer, drawbuffer, depth, stencil);} + GLEEPFNGLCLEARBUFFERFIPROC GLeeFuncPtr_glClearBufferfi=GLee_Lazy_glClearBufferfi; +#endif +#ifndef GLEE_C_DEFINED_glGetStringi +#define GLEE_C_DEFINED_glGetStringi + const GLubyte * __stdcall GLee_Lazy_glGetStringi(GLenum name, GLuint index) {if (GLeeInit()) return glGetStringi(name, index); return (const GLubyte *)0;} + GLEEPFNGLGETSTRINGIPROC GLeeFuncPtr_glGetStringi=GLee_Lazy_glGetStringi; +#endif +#endif + +/* GL_ARB_multitexture */ + +#ifdef __GLEE_GL_ARB_multitexture +#ifndef GLEE_C_DEFINED_glActiveTextureARB +#define GLEE_C_DEFINED_glActiveTextureARB + void __stdcall GLee_Lazy_glActiveTextureARB(GLenum texture) {if (GLeeInit()) glActiveTextureARB(texture);} + GLEEPFNGLACTIVETEXTUREARBPROC GLeeFuncPtr_glActiveTextureARB=GLee_Lazy_glActiveTextureARB; +#endif +#ifndef GLEE_C_DEFINED_glClientActiveTextureARB +#define GLEE_C_DEFINED_glClientActiveTextureARB + void __stdcall GLee_Lazy_glClientActiveTextureARB(GLenum texture) {if (GLeeInit()) glClientActiveTextureARB(texture);} + GLEEPFNGLCLIENTACTIVETEXTUREARBPROC GLeeFuncPtr_glClientActiveTextureARB=GLee_Lazy_glClientActiveTextureARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1dARB +#define GLEE_C_DEFINED_glMultiTexCoord1dARB + void __stdcall GLee_Lazy_glMultiTexCoord1dARB(GLenum target, GLdouble s) {if (GLeeInit()) glMultiTexCoord1dARB(target, s);} + GLEEPFNGLMULTITEXCOORD1DARBPROC GLeeFuncPtr_glMultiTexCoord1dARB=GLee_Lazy_glMultiTexCoord1dARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1dvARB +#define GLEE_C_DEFINED_glMultiTexCoord1dvARB + void __stdcall GLee_Lazy_glMultiTexCoord1dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord1dvARB(target, v);} + GLEEPFNGLMULTITEXCOORD1DVARBPROC GLeeFuncPtr_glMultiTexCoord1dvARB=GLee_Lazy_glMultiTexCoord1dvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1fARB +#define GLEE_C_DEFINED_glMultiTexCoord1fARB + void __stdcall GLee_Lazy_glMultiTexCoord1fARB(GLenum target, GLfloat s) {if (GLeeInit()) glMultiTexCoord1fARB(target, s);} + GLEEPFNGLMULTITEXCOORD1FARBPROC GLeeFuncPtr_glMultiTexCoord1fARB=GLee_Lazy_glMultiTexCoord1fARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1fvARB +#define GLEE_C_DEFINED_glMultiTexCoord1fvARB + void __stdcall GLee_Lazy_glMultiTexCoord1fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord1fvARB(target, v);} + GLEEPFNGLMULTITEXCOORD1FVARBPROC GLeeFuncPtr_glMultiTexCoord1fvARB=GLee_Lazy_glMultiTexCoord1fvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1iARB +#define GLEE_C_DEFINED_glMultiTexCoord1iARB + void __stdcall GLee_Lazy_glMultiTexCoord1iARB(GLenum target, GLint s) {if (GLeeInit()) glMultiTexCoord1iARB(target, s);} + GLEEPFNGLMULTITEXCOORD1IARBPROC GLeeFuncPtr_glMultiTexCoord1iARB=GLee_Lazy_glMultiTexCoord1iARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1ivARB +#define GLEE_C_DEFINED_glMultiTexCoord1ivARB + void __stdcall GLee_Lazy_glMultiTexCoord1ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord1ivARB(target, v);} + GLEEPFNGLMULTITEXCOORD1IVARBPROC GLeeFuncPtr_glMultiTexCoord1ivARB=GLee_Lazy_glMultiTexCoord1ivARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1sARB +#define GLEE_C_DEFINED_glMultiTexCoord1sARB + void __stdcall GLee_Lazy_glMultiTexCoord1sARB(GLenum target, GLshort s) {if (GLeeInit()) glMultiTexCoord1sARB(target, s);} + GLEEPFNGLMULTITEXCOORD1SARBPROC GLeeFuncPtr_glMultiTexCoord1sARB=GLee_Lazy_glMultiTexCoord1sARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1svARB +#define GLEE_C_DEFINED_glMultiTexCoord1svARB + void __stdcall GLee_Lazy_glMultiTexCoord1svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord1svARB(target, v);} + GLEEPFNGLMULTITEXCOORD1SVARBPROC GLeeFuncPtr_glMultiTexCoord1svARB=GLee_Lazy_glMultiTexCoord1svARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2dARB +#define GLEE_C_DEFINED_glMultiTexCoord2dARB + void __stdcall GLee_Lazy_glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t) {if (GLeeInit()) glMultiTexCoord2dARB(target, s, t);} + GLEEPFNGLMULTITEXCOORD2DARBPROC GLeeFuncPtr_glMultiTexCoord2dARB=GLee_Lazy_glMultiTexCoord2dARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2dvARB +#define GLEE_C_DEFINED_glMultiTexCoord2dvARB + void __stdcall GLee_Lazy_glMultiTexCoord2dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord2dvARB(target, v);} + GLEEPFNGLMULTITEXCOORD2DVARBPROC GLeeFuncPtr_glMultiTexCoord2dvARB=GLee_Lazy_glMultiTexCoord2dvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2fARB +#define GLEE_C_DEFINED_glMultiTexCoord2fARB + void __stdcall GLee_Lazy_glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) {if (GLeeInit()) glMultiTexCoord2fARB(target, s, t);} + GLEEPFNGLMULTITEXCOORD2FARBPROC GLeeFuncPtr_glMultiTexCoord2fARB=GLee_Lazy_glMultiTexCoord2fARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2fvARB +#define GLEE_C_DEFINED_glMultiTexCoord2fvARB + void __stdcall GLee_Lazy_glMultiTexCoord2fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord2fvARB(target, v);} + GLEEPFNGLMULTITEXCOORD2FVARBPROC GLeeFuncPtr_glMultiTexCoord2fvARB=GLee_Lazy_glMultiTexCoord2fvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2iARB +#define GLEE_C_DEFINED_glMultiTexCoord2iARB + void __stdcall GLee_Lazy_glMultiTexCoord2iARB(GLenum target, GLint s, GLint t) {if (GLeeInit()) glMultiTexCoord2iARB(target, s, t);} + GLEEPFNGLMULTITEXCOORD2IARBPROC GLeeFuncPtr_glMultiTexCoord2iARB=GLee_Lazy_glMultiTexCoord2iARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2ivARB +#define GLEE_C_DEFINED_glMultiTexCoord2ivARB + void __stdcall GLee_Lazy_glMultiTexCoord2ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord2ivARB(target, v);} + GLEEPFNGLMULTITEXCOORD2IVARBPROC GLeeFuncPtr_glMultiTexCoord2ivARB=GLee_Lazy_glMultiTexCoord2ivARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2sARB +#define GLEE_C_DEFINED_glMultiTexCoord2sARB + void __stdcall GLee_Lazy_glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t) {if (GLeeInit()) glMultiTexCoord2sARB(target, s, t);} + GLEEPFNGLMULTITEXCOORD2SARBPROC GLeeFuncPtr_glMultiTexCoord2sARB=GLee_Lazy_glMultiTexCoord2sARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2svARB +#define GLEE_C_DEFINED_glMultiTexCoord2svARB + void __stdcall GLee_Lazy_glMultiTexCoord2svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord2svARB(target, v);} + GLEEPFNGLMULTITEXCOORD2SVARBPROC GLeeFuncPtr_glMultiTexCoord2svARB=GLee_Lazy_glMultiTexCoord2svARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3dARB +#define GLEE_C_DEFINED_glMultiTexCoord3dARB + void __stdcall GLee_Lazy_glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r) {if (GLeeInit()) glMultiTexCoord3dARB(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3DARBPROC GLeeFuncPtr_glMultiTexCoord3dARB=GLee_Lazy_glMultiTexCoord3dARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3dvARB +#define GLEE_C_DEFINED_glMultiTexCoord3dvARB + void __stdcall GLee_Lazy_glMultiTexCoord3dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord3dvARB(target, v);} + GLEEPFNGLMULTITEXCOORD3DVARBPROC GLeeFuncPtr_glMultiTexCoord3dvARB=GLee_Lazy_glMultiTexCoord3dvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3fARB +#define GLEE_C_DEFINED_glMultiTexCoord3fARB + void __stdcall GLee_Lazy_glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r) {if (GLeeInit()) glMultiTexCoord3fARB(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3FARBPROC GLeeFuncPtr_glMultiTexCoord3fARB=GLee_Lazy_glMultiTexCoord3fARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3fvARB +#define GLEE_C_DEFINED_glMultiTexCoord3fvARB + void __stdcall GLee_Lazy_glMultiTexCoord3fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord3fvARB(target, v);} + GLEEPFNGLMULTITEXCOORD3FVARBPROC GLeeFuncPtr_glMultiTexCoord3fvARB=GLee_Lazy_glMultiTexCoord3fvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3iARB +#define GLEE_C_DEFINED_glMultiTexCoord3iARB + void __stdcall GLee_Lazy_glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r) {if (GLeeInit()) glMultiTexCoord3iARB(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3IARBPROC GLeeFuncPtr_glMultiTexCoord3iARB=GLee_Lazy_glMultiTexCoord3iARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3ivARB +#define GLEE_C_DEFINED_glMultiTexCoord3ivARB + void __stdcall GLee_Lazy_glMultiTexCoord3ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord3ivARB(target, v);} + GLEEPFNGLMULTITEXCOORD3IVARBPROC GLeeFuncPtr_glMultiTexCoord3ivARB=GLee_Lazy_glMultiTexCoord3ivARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3sARB +#define GLEE_C_DEFINED_glMultiTexCoord3sARB + void __stdcall GLee_Lazy_glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r) {if (GLeeInit()) glMultiTexCoord3sARB(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3SARBPROC GLeeFuncPtr_glMultiTexCoord3sARB=GLee_Lazy_glMultiTexCoord3sARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3svARB +#define GLEE_C_DEFINED_glMultiTexCoord3svARB + void __stdcall GLee_Lazy_glMultiTexCoord3svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord3svARB(target, v);} + GLEEPFNGLMULTITEXCOORD3SVARBPROC GLeeFuncPtr_glMultiTexCoord3svARB=GLee_Lazy_glMultiTexCoord3svARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4dARB +#define GLEE_C_DEFINED_glMultiTexCoord4dARB + void __stdcall GLee_Lazy_glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) {if (GLeeInit()) glMultiTexCoord4dARB(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4DARBPROC GLeeFuncPtr_glMultiTexCoord4dARB=GLee_Lazy_glMultiTexCoord4dARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4dvARB +#define GLEE_C_DEFINED_glMultiTexCoord4dvARB + void __stdcall GLee_Lazy_glMultiTexCoord4dvARB(GLenum target, const GLdouble * v) {if (GLeeInit()) glMultiTexCoord4dvARB(target, v);} + GLEEPFNGLMULTITEXCOORD4DVARBPROC GLeeFuncPtr_glMultiTexCoord4dvARB=GLee_Lazy_glMultiTexCoord4dvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4fARB +#define GLEE_C_DEFINED_glMultiTexCoord4fARB + void __stdcall GLee_Lazy_glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {if (GLeeInit()) glMultiTexCoord4fARB(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4FARBPROC GLeeFuncPtr_glMultiTexCoord4fARB=GLee_Lazy_glMultiTexCoord4fARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4fvARB +#define GLEE_C_DEFINED_glMultiTexCoord4fvARB + void __stdcall GLee_Lazy_glMultiTexCoord4fvARB(GLenum target, const GLfloat * v) {if (GLeeInit()) glMultiTexCoord4fvARB(target, v);} + GLEEPFNGLMULTITEXCOORD4FVARBPROC GLeeFuncPtr_glMultiTexCoord4fvARB=GLee_Lazy_glMultiTexCoord4fvARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4iARB +#define GLEE_C_DEFINED_glMultiTexCoord4iARB + void __stdcall GLee_Lazy_glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q) {if (GLeeInit()) glMultiTexCoord4iARB(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4IARBPROC GLeeFuncPtr_glMultiTexCoord4iARB=GLee_Lazy_glMultiTexCoord4iARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4ivARB +#define GLEE_C_DEFINED_glMultiTexCoord4ivARB + void __stdcall GLee_Lazy_glMultiTexCoord4ivARB(GLenum target, const GLint * v) {if (GLeeInit()) glMultiTexCoord4ivARB(target, v);} + GLEEPFNGLMULTITEXCOORD4IVARBPROC GLeeFuncPtr_glMultiTexCoord4ivARB=GLee_Lazy_glMultiTexCoord4ivARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4sARB +#define GLEE_C_DEFINED_glMultiTexCoord4sARB + void __stdcall GLee_Lazy_glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) {if (GLeeInit()) glMultiTexCoord4sARB(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4SARBPROC GLeeFuncPtr_glMultiTexCoord4sARB=GLee_Lazy_glMultiTexCoord4sARB; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4svARB +#define GLEE_C_DEFINED_glMultiTexCoord4svARB + void __stdcall GLee_Lazy_glMultiTexCoord4svARB(GLenum target, const GLshort * v) {if (GLeeInit()) glMultiTexCoord4svARB(target, v);} + GLEEPFNGLMULTITEXCOORD4SVARBPROC GLeeFuncPtr_glMultiTexCoord4svARB=GLee_Lazy_glMultiTexCoord4svARB; +#endif +#endif + +/* GL_ARB_transpose_matrix */ + +#ifdef __GLEE_GL_ARB_transpose_matrix +#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixfARB +#define GLEE_C_DEFINED_glLoadTransposeMatrixfARB + void __stdcall GLee_Lazy_glLoadTransposeMatrixfARB(const GLfloat * m) {if (GLeeInit()) glLoadTransposeMatrixfARB(m);} + GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glLoadTransposeMatrixfARB=GLee_Lazy_glLoadTransposeMatrixfARB; +#endif +#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixdARB +#define GLEE_C_DEFINED_glLoadTransposeMatrixdARB + void __stdcall GLee_Lazy_glLoadTransposeMatrixdARB(const GLdouble * m) {if (GLeeInit()) glLoadTransposeMatrixdARB(m);} + GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glLoadTransposeMatrixdARB=GLee_Lazy_glLoadTransposeMatrixdARB; +#endif +#ifndef GLEE_C_DEFINED_glMultTransposeMatrixfARB +#define GLEE_C_DEFINED_glMultTransposeMatrixfARB + void __stdcall GLee_Lazy_glMultTransposeMatrixfARB(const GLfloat * m) {if (GLeeInit()) glMultTransposeMatrixfARB(m);} + GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glMultTransposeMatrixfARB=GLee_Lazy_glMultTransposeMatrixfARB; +#endif +#ifndef GLEE_C_DEFINED_glMultTransposeMatrixdARB +#define GLEE_C_DEFINED_glMultTransposeMatrixdARB + void __stdcall GLee_Lazy_glMultTransposeMatrixdARB(const GLdouble * m) {if (GLeeInit()) glMultTransposeMatrixdARB(m);} + GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glMultTransposeMatrixdARB=GLee_Lazy_glMultTransposeMatrixdARB; +#endif +#endif + +/* GL_ARB_multisample */ + +#ifdef __GLEE_GL_ARB_multisample +#ifndef GLEE_C_DEFINED_glSampleCoverageARB +#define GLEE_C_DEFINED_glSampleCoverageARB + void __stdcall GLee_Lazy_glSampleCoverageARB(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleCoverageARB(value, invert);} + GLEEPFNGLSAMPLECOVERAGEARBPROC GLeeFuncPtr_glSampleCoverageARB=GLee_Lazy_glSampleCoverageARB; +#endif +#endif + +/* GL_ARB_texture_env_add */ + +#ifdef __GLEE_GL_ARB_texture_env_add +#endif + +/* GL_ARB_texture_cube_map */ + +#ifdef __GLEE_GL_ARB_texture_cube_map +#endif + +/* GL_ARB_texture_compression */ + +#ifdef __GLEE_GL_ARB_texture_compression +#ifndef GLEE_C_DEFINED_glCompressedTexImage3DARB +#define GLEE_C_DEFINED_glCompressedTexImage3DARB + void __stdcall GLee_Lazy_glCompressedTexImage3DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexImage3DARB=GLee_Lazy_glCompressedTexImage3DARB; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexImage2DARB +#define GLEE_C_DEFINED_glCompressedTexImage2DARB + void __stdcall GLee_Lazy_glCompressedTexImage2DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexImage2DARB=GLee_Lazy_glCompressedTexImage2DARB; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexImage1DARB +#define GLEE_C_DEFINED_glCompressedTexImage1DARB + void __stdcall GLee_Lazy_glCompressedTexImage1DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexImage1DARB=GLee_Lazy_glCompressedTexImage1DARB; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexSubImage3DARB +#define GLEE_C_DEFINED_glCompressedTexSubImage3DARB + void __stdcall GLee_Lazy_glCompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexSubImage3DARB=GLee_Lazy_glCompressedTexSubImage3DARB; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexSubImage2DARB +#define GLEE_C_DEFINED_glCompressedTexSubImage2DARB + void __stdcall GLee_Lazy_glCompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexSubImage2DARB=GLee_Lazy_glCompressedTexSubImage2DARB; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTexSubImage1DARB +#define GLEE_C_DEFINED_glCompressedTexSubImage1DARB + void __stdcall GLee_Lazy_glCompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data) {if (GLeeInit()) glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data);} + GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexSubImage1DARB=GLee_Lazy_glCompressedTexSubImage1DARB; +#endif +#ifndef GLEE_C_DEFINED_glGetCompressedTexImageARB +#define GLEE_C_DEFINED_glGetCompressedTexImageARB + void __stdcall GLee_Lazy_glGetCompressedTexImageARB(GLenum target, GLint level, GLvoid * img) {if (GLeeInit()) glGetCompressedTexImageARB(target, level, img);} + GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLeeFuncPtr_glGetCompressedTexImageARB=GLee_Lazy_glGetCompressedTexImageARB; +#endif +#endif + +/* GL_ARB_texture_border_clamp */ + +#ifdef __GLEE_GL_ARB_texture_border_clamp +#endif + +/* GL_ARB_point_parameters */ + +#ifdef __GLEE_GL_ARB_point_parameters +#ifndef GLEE_C_DEFINED_glPointParameterfARB +#define GLEE_C_DEFINED_glPointParameterfARB + void __stdcall GLee_Lazy_glPointParameterfARB(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterfARB(pname, param);} + GLEEPFNGLPOINTPARAMETERFARBPROC GLeeFuncPtr_glPointParameterfARB=GLee_Lazy_glPointParameterfARB; +#endif +#ifndef GLEE_C_DEFINED_glPointParameterfvARB +#define GLEE_C_DEFINED_glPointParameterfvARB + void __stdcall GLee_Lazy_glPointParameterfvARB(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfvARB(pname, params);} + GLEEPFNGLPOINTPARAMETERFVARBPROC GLeeFuncPtr_glPointParameterfvARB=GLee_Lazy_glPointParameterfvARB; +#endif +#endif + +/* GL_ARB_vertex_blend */ + +#ifdef __GLEE_GL_ARB_vertex_blend +#ifndef GLEE_C_DEFINED_glWeightbvARB +#define GLEE_C_DEFINED_glWeightbvARB + void __stdcall GLee_Lazy_glWeightbvARB(GLint size, const GLbyte * weights) {if (GLeeInit()) glWeightbvARB(size, weights);} + GLEEPFNGLWEIGHTBVARBPROC GLeeFuncPtr_glWeightbvARB=GLee_Lazy_glWeightbvARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightsvARB +#define GLEE_C_DEFINED_glWeightsvARB + void __stdcall GLee_Lazy_glWeightsvARB(GLint size, const GLshort * weights) {if (GLeeInit()) glWeightsvARB(size, weights);} + GLEEPFNGLWEIGHTSVARBPROC GLeeFuncPtr_glWeightsvARB=GLee_Lazy_glWeightsvARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightivARB +#define GLEE_C_DEFINED_glWeightivARB + void __stdcall GLee_Lazy_glWeightivARB(GLint size, const GLint * weights) {if (GLeeInit()) glWeightivARB(size, weights);} + GLEEPFNGLWEIGHTIVARBPROC GLeeFuncPtr_glWeightivARB=GLee_Lazy_glWeightivARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightfvARB +#define GLEE_C_DEFINED_glWeightfvARB + void __stdcall GLee_Lazy_glWeightfvARB(GLint size, const GLfloat * weights) {if (GLeeInit()) glWeightfvARB(size, weights);} + GLEEPFNGLWEIGHTFVARBPROC GLeeFuncPtr_glWeightfvARB=GLee_Lazy_glWeightfvARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightdvARB +#define GLEE_C_DEFINED_glWeightdvARB + void __stdcall GLee_Lazy_glWeightdvARB(GLint size, const GLdouble * weights) {if (GLeeInit()) glWeightdvARB(size, weights);} + GLEEPFNGLWEIGHTDVARBPROC GLeeFuncPtr_glWeightdvARB=GLee_Lazy_glWeightdvARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightubvARB +#define GLEE_C_DEFINED_glWeightubvARB + void __stdcall GLee_Lazy_glWeightubvARB(GLint size, const GLubyte * weights) {if (GLeeInit()) glWeightubvARB(size, weights);} + GLEEPFNGLWEIGHTUBVARBPROC GLeeFuncPtr_glWeightubvARB=GLee_Lazy_glWeightubvARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightusvARB +#define GLEE_C_DEFINED_glWeightusvARB + void __stdcall GLee_Lazy_glWeightusvARB(GLint size, const GLushort * weights) {if (GLeeInit()) glWeightusvARB(size, weights);} + GLEEPFNGLWEIGHTUSVARBPROC GLeeFuncPtr_glWeightusvARB=GLee_Lazy_glWeightusvARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightuivARB +#define GLEE_C_DEFINED_glWeightuivARB + void __stdcall GLee_Lazy_glWeightuivARB(GLint size, const GLuint * weights) {if (GLeeInit()) glWeightuivARB(size, weights);} + GLEEPFNGLWEIGHTUIVARBPROC GLeeFuncPtr_glWeightuivARB=GLee_Lazy_glWeightuivARB; +#endif +#ifndef GLEE_C_DEFINED_glWeightPointerARB +#define GLEE_C_DEFINED_glWeightPointerARB + void __stdcall GLee_Lazy_glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glWeightPointerARB(size, type, stride, pointer);} + GLEEPFNGLWEIGHTPOINTERARBPROC GLeeFuncPtr_glWeightPointerARB=GLee_Lazy_glWeightPointerARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexBlendARB +#define GLEE_C_DEFINED_glVertexBlendARB + void __stdcall GLee_Lazy_glVertexBlendARB(GLint count) {if (GLeeInit()) glVertexBlendARB(count);} + GLEEPFNGLVERTEXBLENDARBPROC GLeeFuncPtr_glVertexBlendARB=GLee_Lazy_glVertexBlendARB; +#endif +#endif + +/* GL_ARB_matrix_palette */ + +#ifdef __GLEE_GL_ARB_matrix_palette +#ifndef GLEE_C_DEFINED_glCurrentPaletteMatrixARB +#define GLEE_C_DEFINED_glCurrentPaletteMatrixARB + void __stdcall GLee_Lazy_glCurrentPaletteMatrixARB(GLint index) {if (GLeeInit()) glCurrentPaletteMatrixARB(index);} + GLEEPFNGLCURRENTPALETTEMATRIXARBPROC GLeeFuncPtr_glCurrentPaletteMatrixARB=GLee_Lazy_glCurrentPaletteMatrixARB; +#endif +#ifndef GLEE_C_DEFINED_glMatrixIndexubvARB +#define GLEE_C_DEFINED_glMatrixIndexubvARB + void __stdcall GLee_Lazy_glMatrixIndexubvARB(GLint size, const GLubyte * indices) {if (GLeeInit()) glMatrixIndexubvARB(size, indices);} + GLEEPFNGLMATRIXINDEXUBVARBPROC GLeeFuncPtr_glMatrixIndexubvARB=GLee_Lazy_glMatrixIndexubvARB; +#endif +#ifndef GLEE_C_DEFINED_glMatrixIndexusvARB +#define GLEE_C_DEFINED_glMatrixIndexusvARB + void __stdcall GLee_Lazy_glMatrixIndexusvARB(GLint size, const GLushort * indices) {if (GLeeInit()) glMatrixIndexusvARB(size, indices);} + GLEEPFNGLMATRIXINDEXUSVARBPROC GLeeFuncPtr_glMatrixIndexusvARB=GLee_Lazy_glMatrixIndexusvARB; +#endif +#ifndef GLEE_C_DEFINED_glMatrixIndexuivARB +#define GLEE_C_DEFINED_glMatrixIndexuivARB + void __stdcall GLee_Lazy_glMatrixIndexuivARB(GLint size, const GLuint * indices) {if (GLeeInit()) glMatrixIndexuivARB(size, indices);} + GLEEPFNGLMATRIXINDEXUIVARBPROC GLeeFuncPtr_glMatrixIndexuivARB=GLee_Lazy_glMatrixIndexuivARB; +#endif +#ifndef GLEE_C_DEFINED_glMatrixIndexPointerARB +#define GLEE_C_DEFINED_glMatrixIndexPointerARB + void __stdcall GLee_Lazy_glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glMatrixIndexPointerARB(size, type, stride, pointer);} + GLEEPFNGLMATRIXINDEXPOINTERARBPROC GLeeFuncPtr_glMatrixIndexPointerARB=GLee_Lazy_glMatrixIndexPointerARB; +#endif +#endif + +/* GL_ARB_texture_env_combine */ + +#ifdef __GLEE_GL_ARB_texture_env_combine +#endif + +/* GL_ARB_texture_env_crossbar */ + +#ifdef __GLEE_GL_ARB_texture_env_crossbar +#endif + +/* GL_ARB_texture_env_dot3 */ + +#ifdef __GLEE_GL_ARB_texture_env_dot3 +#endif + +/* GL_ARB_texture_mirrored_repeat */ + +#ifdef __GLEE_GL_ARB_texture_mirrored_repeat +#endif + +/* GL_ARB_depth_texture */ + +#ifdef __GLEE_GL_ARB_depth_texture +#endif + +/* GL_ARB_shadow */ + +#ifdef __GLEE_GL_ARB_shadow +#endif + +/* GL_ARB_shadow_ambient */ + +#ifdef __GLEE_GL_ARB_shadow_ambient +#endif + +/* GL_ARB_window_pos */ + +#ifdef __GLEE_GL_ARB_window_pos +#ifndef GLEE_C_DEFINED_glWindowPos2dARB +#define GLEE_C_DEFINED_glWindowPos2dARB + void __stdcall GLee_Lazy_glWindowPos2dARB(GLdouble x, GLdouble y) {if (GLeeInit()) glWindowPos2dARB(x, y);} + GLEEPFNGLWINDOWPOS2DARBPROC GLeeFuncPtr_glWindowPos2dARB=GLee_Lazy_glWindowPos2dARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2dvARB +#define GLEE_C_DEFINED_glWindowPos2dvARB + void __stdcall GLee_Lazy_glWindowPos2dvARB(const GLdouble * v) {if (GLeeInit()) glWindowPos2dvARB(v);} + GLEEPFNGLWINDOWPOS2DVARBPROC GLeeFuncPtr_glWindowPos2dvARB=GLee_Lazy_glWindowPos2dvARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2fARB +#define GLEE_C_DEFINED_glWindowPos2fARB + void __stdcall GLee_Lazy_glWindowPos2fARB(GLfloat x, GLfloat y) {if (GLeeInit()) glWindowPos2fARB(x, y);} + GLEEPFNGLWINDOWPOS2FARBPROC GLeeFuncPtr_glWindowPos2fARB=GLee_Lazy_glWindowPos2fARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2fvARB +#define GLEE_C_DEFINED_glWindowPos2fvARB + void __stdcall GLee_Lazy_glWindowPos2fvARB(const GLfloat * v) {if (GLeeInit()) glWindowPos2fvARB(v);} + GLEEPFNGLWINDOWPOS2FVARBPROC GLeeFuncPtr_glWindowPos2fvARB=GLee_Lazy_glWindowPos2fvARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2iARB +#define GLEE_C_DEFINED_glWindowPos2iARB + void __stdcall GLee_Lazy_glWindowPos2iARB(GLint x, GLint y) {if (GLeeInit()) glWindowPos2iARB(x, y);} + GLEEPFNGLWINDOWPOS2IARBPROC GLeeFuncPtr_glWindowPos2iARB=GLee_Lazy_glWindowPos2iARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2ivARB +#define GLEE_C_DEFINED_glWindowPos2ivARB + void __stdcall GLee_Lazy_glWindowPos2ivARB(const GLint * v) {if (GLeeInit()) glWindowPos2ivARB(v);} + GLEEPFNGLWINDOWPOS2IVARBPROC GLeeFuncPtr_glWindowPos2ivARB=GLee_Lazy_glWindowPos2ivARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2sARB +#define GLEE_C_DEFINED_glWindowPos2sARB + void __stdcall GLee_Lazy_glWindowPos2sARB(GLshort x, GLshort y) {if (GLeeInit()) glWindowPos2sARB(x, y);} + GLEEPFNGLWINDOWPOS2SARBPROC GLeeFuncPtr_glWindowPos2sARB=GLee_Lazy_glWindowPos2sARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2svARB +#define GLEE_C_DEFINED_glWindowPos2svARB + void __stdcall GLee_Lazy_glWindowPos2svARB(const GLshort * v) {if (GLeeInit()) glWindowPos2svARB(v);} + GLEEPFNGLWINDOWPOS2SVARBPROC GLeeFuncPtr_glWindowPos2svARB=GLee_Lazy_glWindowPos2svARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3dARB +#define GLEE_C_DEFINED_glWindowPos3dARB + void __stdcall GLee_Lazy_glWindowPos3dARB(GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glWindowPos3dARB(x, y, z);} + GLEEPFNGLWINDOWPOS3DARBPROC GLeeFuncPtr_glWindowPos3dARB=GLee_Lazy_glWindowPos3dARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3dvARB +#define GLEE_C_DEFINED_glWindowPos3dvARB + void __stdcall GLee_Lazy_glWindowPos3dvARB(const GLdouble * v) {if (GLeeInit()) glWindowPos3dvARB(v);} + GLEEPFNGLWINDOWPOS3DVARBPROC GLeeFuncPtr_glWindowPos3dvARB=GLee_Lazy_glWindowPos3dvARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3fARB +#define GLEE_C_DEFINED_glWindowPos3fARB + void __stdcall GLee_Lazy_glWindowPos3fARB(GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glWindowPos3fARB(x, y, z);} + GLEEPFNGLWINDOWPOS3FARBPROC GLeeFuncPtr_glWindowPos3fARB=GLee_Lazy_glWindowPos3fARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3fvARB +#define GLEE_C_DEFINED_glWindowPos3fvARB + void __stdcall GLee_Lazy_glWindowPos3fvARB(const GLfloat * v) {if (GLeeInit()) glWindowPos3fvARB(v);} + GLEEPFNGLWINDOWPOS3FVARBPROC GLeeFuncPtr_glWindowPos3fvARB=GLee_Lazy_glWindowPos3fvARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3iARB +#define GLEE_C_DEFINED_glWindowPos3iARB + void __stdcall GLee_Lazy_glWindowPos3iARB(GLint x, GLint y, GLint z) {if (GLeeInit()) glWindowPos3iARB(x, y, z);} + GLEEPFNGLWINDOWPOS3IARBPROC GLeeFuncPtr_glWindowPos3iARB=GLee_Lazy_glWindowPos3iARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3ivARB +#define GLEE_C_DEFINED_glWindowPos3ivARB + void __stdcall GLee_Lazy_glWindowPos3ivARB(const GLint * v) {if (GLeeInit()) glWindowPos3ivARB(v);} + GLEEPFNGLWINDOWPOS3IVARBPROC GLeeFuncPtr_glWindowPos3ivARB=GLee_Lazy_glWindowPos3ivARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3sARB +#define GLEE_C_DEFINED_glWindowPos3sARB + void __stdcall GLee_Lazy_glWindowPos3sARB(GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glWindowPos3sARB(x, y, z);} + GLEEPFNGLWINDOWPOS3SARBPROC GLeeFuncPtr_glWindowPos3sARB=GLee_Lazy_glWindowPos3sARB; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3svARB +#define GLEE_C_DEFINED_glWindowPos3svARB + void __stdcall GLee_Lazy_glWindowPos3svARB(const GLshort * v) {if (GLeeInit()) glWindowPos3svARB(v);} + GLEEPFNGLWINDOWPOS3SVARBPROC GLeeFuncPtr_glWindowPos3svARB=GLee_Lazy_glWindowPos3svARB; +#endif +#endif + +/* GL_ARB_vertex_program */ + +#ifdef __GLEE_GL_ARB_vertex_program +#ifndef GLEE_C_DEFINED_glVertexAttrib1dARB +#define GLEE_C_DEFINED_glVertexAttrib1dARB + void __stdcall GLee_Lazy_glVertexAttrib1dARB(GLuint index, GLdouble x) {if (GLeeInit()) glVertexAttrib1dARB(index, x);} + GLEEPFNGLVERTEXATTRIB1DARBPROC GLeeFuncPtr_glVertexAttrib1dARB=GLee_Lazy_glVertexAttrib1dARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1dvARB +#define GLEE_C_DEFINED_glVertexAttrib1dvARB + void __stdcall GLee_Lazy_glVertexAttrib1dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib1dvARB(index, v);} + GLEEPFNGLVERTEXATTRIB1DVARBPROC GLeeFuncPtr_glVertexAttrib1dvARB=GLee_Lazy_glVertexAttrib1dvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1fARB +#define GLEE_C_DEFINED_glVertexAttrib1fARB + void __stdcall GLee_Lazy_glVertexAttrib1fARB(GLuint index, GLfloat x) {if (GLeeInit()) glVertexAttrib1fARB(index, x);} + GLEEPFNGLVERTEXATTRIB1FARBPROC GLeeFuncPtr_glVertexAttrib1fARB=GLee_Lazy_glVertexAttrib1fARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1fvARB +#define GLEE_C_DEFINED_glVertexAttrib1fvARB + void __stdcall GLee_Lazy_glVertexAttrib1fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib1fvARB(index, v);} + GLEEPFNGLVERTEXATTRIB1FVARBPROC GLeeFuncPtr_glVertexAttrib1fvARB=GLee_Lazy_glVertexAttrib1fvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1sARB +#define GLEE_C_DEFINED_glVertexAttrib1sARB + void __stdcall GLee_Lazy_glVertexAttrib1sARB(GLuint index, GLshort x) {if (GLeeInit()) glVertexAttrib1sARB(index, x);} + GLEEPFNGLVERTEXATTRIB1SARBPROC GLeeFuncPtr_glVertexAttrib1sARB=GLee_Lazy_glVertexAttrib1sARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1svARB +#define GLEE_C_DEFINED_glVertexAttrib1svARB + void __stdcall GLee_Lazy_glVertexAttrib1svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib1svARB(index, v);} + GLEEPFNGLVERTEXATTRIB1SVARBPROC GLeeFuncPtr_glVertexAttrib1svARB=GLee_Lazy_glVertexAttrib1svARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2dARB +#define GLEE_C_DEFINED_glVertexAttrib2dARB + void __stdcall GLee_Lazy_glVertexAttrib2dARB(GLuint index, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexAttrib2dARB(index, x, y);} + GLEEPFNGLVERTEXATTRIB2DARBPROC GLeeFuncPtr_glVertexAttrib2dARB=GLee_Lazy_glVertexAttrib2dARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2dvARB +#define GLEE_C_DEFINED_glVertexAttrib2dvARB + void __stdcall GLee_Lazy_glVertexAttrib2dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib2dvARB(index, v);} + GLEEPFNGLVERTEXATTRIB2DVARBPROC GLeeFuncPtr_glVertexAttrib2dvARB=GLee_Lazy_glVertexAttrib2dvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2fARB +#define GLEE_C_DEFINED_glVertexAttrib2fARB + void __stdcall GLee_Lazy_glVertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexAttrib2fARB(index, x, y);} + GLEEPFNGLVERTEXATTRIB2FARBPROC GLeeFuncPtr_glVertexAttrib2fARB=GLee_Lazy_glVertexAttrib2fARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2fvARB +#define GLEE_C_DEFINED_glVertexAttrib2fvARB + void __stdcall GLee_Lazy_glVertexAttrib2fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib2fvARB(index, v);} + GLEEPFNGLVERTEXATTRIB2FVARBPROC GLeeFuncPtr_glVertexAttrib2fvARB=GLee_Lazy_glVertexAttrib2fvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2sARB +#define GLEE_C_DEFINED_glVertexAttrib2sARB + void __stdcall GLee_Lazy_glVertexAttrib2sARB(GLuint index, GLshort x, GLshort y) {if (GLeeInit()) glVertexAttrib2sARB(index, x, y);} + GLEEPFNGLVERTEXATTRIB2SARBPROC GLeeFuncPtr_glVertexAttrib2sARB=GLee_Lazy_glVertexAttrib2sARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2svARB +#define GLEE_C_DEFINED_glVertexAttrib2svARB + void __stdcall GLee_Lazy_glVertexAttrib2svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib2svARB(index, v);} + GLEEPFNGLVERTEXATTRIB2SVARBPROC GLeeFuncPtr_glVertexAttrib2svARB=GLee_Lazy_glVertexAttrib2svARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3dARB +#define GLEE_C_DEFINED_glVertexAttrib3dARB + void __stdcall GLee_Lazy_glVertexAttrib3dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexAttrib3dARB(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3DARBPROC GLeeFuncPtr_glVertexAttrib3dARB=GLee_Lazy_glVertexAttrib3dARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3dvARB +#define GLEE_C_DEFINED_glVertexAttrib3dvARB + void __stdcall GLee_Lazy_glVertexAttrib3dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib3dvARB(index, v);} + GLEEPFNGLVERTEXATTRIB3DVARBPROC GLeeFuncPtr_glVertexAttrib3dvARB=GLee_Lazy_glVertexAttrib3dvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3fARB +#define GLEE_C_DEFINED_glVertexAttrib3fARB + void __stdcall GLee_Lazy_glVertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexAttrib3fARB(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3FARBPROC GLeeFuncPtr_glVertexAttrib3fARB=GLee_Lazy_glVertexAttrib3fARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3fvARB +#define GLEE_C_DEFINED_glVertexAttrib3fvARB + void __stdcall GLee_Lazy_glVertexAttrib3fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib3fvARB(index, v);} + GLEEPFNGLVERTEXATTRIB3FVARBPROC GLeeFuncPtr_glVertexAttrib3fvARB=GLee_Lazy_glVertexAttrib3fvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3sARB +#define GLEE_C_DEFINED_glVertexAttrib3sARB + void __stdcall GLee_Lazy_glVertexAttrib3sARB(GLuint index, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexAttrib3sARB(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3SARBPROC GLeeFuncPtr_glVertexAttrib3sARB=GLee_Lazy_glVertexAttrib3sARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3svARB +#define GLEE_C_DEFINED_glVertexAttrib3svARB + void __stdcall GLee_Lazy_glVertexAttrib3svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib3svARB(index, v);} + GLEEPFNGLVERTEXATTRIB3SVARBPROC GLeeFuncPtr_glVertexAttrib3svARB=GLee_Lazy_glVertexAttrib3svARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NbvARB +#define GLEE_C_DEFINED_glVertexAttrib4NbvARB + void __stdcall GLee_Lazy_glVertexAttrib4NbvARB(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4NbvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4NBVARBPROC GLeeFuncPtr_glVertexAttrib4NbvARB=GLee_Lazy_glVertexAttrib4NbvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NivARB +#define GLEE_C_DEFINED_glVertexAttrib4NivARB + void __stdcall GLee_Lazy_glVertexAttrib4NivARB(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4NivARB(index, v);} + GLEEPFNGLVERTEXATTRIB4NIVARBPROC GLeeFuncPtr_glVertexAttrib4NivARB=GLee_Lazy_glVertexAttrib4NivARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NsvARB +#define GLEE_C_DEFINED_glVertexAttrib4NsvARB + void __stdcall GLee_Lazy_glVertexAttrib4NsvARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4NsvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4NSVARBPROC GLeeFuncPtr_glVertexAttrib4NsvARB=GLee_Lazy_glVertexAttrib4NsvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NubARB +#define GLEE_C_DEFINED_glVertexAttrib4NubARB + void __stdcall GLee_Lazy_glVertexAttrib4NubARB(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) {if (GLeeInit()) glVertexAttrib4NubARB(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4NUBARBPROC GLeeFuncPtr_glVertexAttrib4NubARB=GLee_Lazy_glVertexAttrib4NubARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NubvARB +#define GLEE_C_DEFINED_glVertexAttrib4NubvARB + void __stdcall GLee_Lazy_glVertexAttrib4NubvARB(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4NubvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4NUBVARBPROC GLeeFuncPtr_glVertexAttrib4NubvARB=GLee_Lazy_glVertexAttrib4NubvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NuivARB +#define GLEE_C_DEFINED_glVertexAttrib4NuivARB + void __stdcall GLee_Lazy_glVertexAttrib4NuivARB(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4NuivARB(index, v);} + GLEEPFNGLVERTEXATTRIB4NUIVARBPROC GLeeFuncPtr_glVertexAttrib4NuivARB=GLee_Lazy_glVertexAttrib4NuivARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4NusvARB +#define GLEE_C_DEFINED_glVertexAttrib4NusvARB + void __stdcall GLee_Lazy_glVertexAttrib4NusvARB(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4NusvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4NUSVARBPROC GLeeFuncPtr_glVertexAttrib4NusvARB=GLee_Lazy_glVertexAttrib4NusvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4bvARB +#define GLEE_C_DEFINED_glVertexAttrib4bvARB + void __stdcall GLee_Lazy_glVertexAttrib4bvARB(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttrib4bvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4BVARBPROC GLeeFuncPtr_glVertexAttrib4bvARB=GLee_Lazy_glVertexAttrib4bvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4dARB +#define GLEE_C_DEFINED_glVertexAttrib4dARB + void __stdcall GLee_Lazy_glVertexAttrib4dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexAttrib4dARB(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4DARBPROC GLeeFuncPtr_glVertexAttrib4dARB=GLee_Lazy_glVertexAttrib4dARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4dvARB +#define GLEE_C_DEFINED_glVertexAttrib4dvARB + void __stdcall GLee_Lazy_glVertexAttrib4dvARB(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib4dvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4DVARBPROC GLeeFuncPtr_glVertexAttrib4dvARB=GLee_Lazy_glVertexAttrib4dvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4fARB +#define GLEE_C_DEFINED_glVertexAttrib4fARB + void __stdcall GLee_Lazy_glVertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexAttrib4fARB(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4FARBPROC GLeeFuncPtr_glVertexAttrib4fARB=GLee_Lazy_glVertexAttrib4fARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4fvARB +#define GLEE_C_DEFINED_glVertexAttrib4fvARB + void __stdcall GLee_Lazy_glVertexAttrib4fvARB(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib4fvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4FVARBPROC GLeeFuncPtr_glVertexAttrib4fvARB=GLee_Lazy_glVertexAttrib4fvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4ivARB +#define GLEE_C_DEFINED_glVertexAttrib4ivARB + void __stdcall GLee_Lazy_glVertexAttrib4ivARB(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttrib4ivARB(index, v);} + GLEEPFNGLVERTEXATTRIB4IVARBPROC GLeeFuncPtr_glVertexAttrib4ivARB=GLee_Lazy_glVertexAttrib4ivARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4sARB +#define GLEE_C_DEFINED_glVertexAttrib4sARB + void __stdcall GLee_Lazy_glVertexAttrib4sARB(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexAttrib4sARB(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4SARBPROC GLeeFuncPtr_glVertexAttrib4sARB=GLee_Lazy_glVertexAttrib4sARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4svARB +#define GLEE_C_DEFINED_glVertexAttrib4svARB + void __stdcall GLee_Lazy_glVertexAttrib4svARB(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4svARB(index, v);} + GLEEPFNGLVERTEXATTRIB4SVARBPROC GLeeFuncPtr_glVertexAttrib4svARB=GLee_Lazy_glVertexAttrib4svARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4ubvARB +#define GLEE_C_DEFINED_glVertexAttrib4ubvARB + void __stdcall GLee_Lazy_glVertexAttrib4ubvARB(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4ubvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4UBVARBPROC GLeeFuncPtr_glVertexAttrib4ubvARB=GLee_Lazy_glVertexAttrib4ubvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4uivARB +#define GLEE_C_DEFINED_glVertexAttrib4uivARB + void __stdcall GLee_Lazy_glVertexAttrib4uivARB(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttrib4uivARB(index, v);} + GLEEPFNGLVERTEXATTRIB4UIVARBPROC GLeeFuncPtr_glVertexAttrib4uivARB=GLee_Lazy_glVertexAttrib4uivARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4usvARB +#define GLEE_C_DEFINED_glVertexAttrib4usvARB + void __stdcall GLee_Lazy_glVertexAttrib4usvARB(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttrib4usvARB(index, v);} + GLEEPFNGLVERTEXATTRIB4USVARBPROC GLeeFuncPtr_glVertexAttrib4usvARB=GLee_Lazy_glVertexAttrib4usvARB; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribPointerARB +#define GLEE_C_DEFINED_glVertexAttribPointerARB + void __stdcall GLee_Lazy_glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribPointerARB(index, size, type, normalized, stride, pointer);} + GLEEPFNGLVERTEXATTRIBPOINTERARBPROC GLeeFuncPtr_glVertexAttribPointerARB=GLee_Lazy_glVertexAttribPointerARB; +#endif +#ifndef GLEE_C_DEFINED_glEnableVertexAttribArrayARB +#define GLEE_C_DEFINED_glEnableVertexAttribArrayARB + void __stdcall GLee_Lazy_glEnableVertexAttribArrayARB(GLuint index) {if (GLeeInit()) glEnableVertexAttribArrayARB(index);} + GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glEnableVertexAttribArrayARB=GLee_Lazy_glEnableVertexAttribArrayARB; +#endif +#ifndef GLEE_C_DEFINED_glDisableVertexAttribArrayARB +#define GLEE_C_DEFINED_glDisableVertexAttribArrayARB + void __stdcall GLee_Lazy_glDisableVertexAttribArrayARB(GLuint index) {if (GLeeInit()) glDisableVertexAttribArrayARB(index);} + GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glDisableVertexAttribArrayARB=GLee_Lazy_glDisableVertexAttribArrayARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramStringARB +#define GLEE_C_DEFINED_glProgramStringARB + void __stdcall GLee_Lazy_glProgramStringARB(GLenum target, GLenum format, GLsizei len, const GLvoid * string) {if (GLeeInit()) glProgramStringARB(target, format, len, string);} + GLEEPFNGLPROGRAMSTRINGARBPROC GLeeFuncPtr_glProgramStringARB=GLee_Lazy_glProgramStringARB; +#endif +#ifndef GLEE_C_DEFINED_glBindProgramARB +#define GLEE_C_DEFINED_glBindProgramARB + void __stdcall GLee_Lazy_glBindProgramARB(GLenum target, GLuint program) {if (GLeeInit()) glBindProgramARB(target, program);} + GLEEPFNGLBINDPROGRAMARBPROC GLeeFuncPtr_glBindProgramARB=GLee_Lazy_glBindProgramARB; +#endif +#ifndef GLEE_C_DEFINED_glDeleteProgramsARB +#define GLEE_C_DEFINED_glDeleteProgramsARB + void __stdcall GLee_Lazy_glDeleteProgramsARB(GLsizei n, const GLuint * programs) {if (GLeeInit()) glDeleteProgramsARB(n, programs);} + GLEEPFNGLDELETEPROGRAMSARBPROC GLeeFuncPtr_glDeleteProgramsARB=GLee_Lazy_glDeleteProgramsARB; +#endif +#ifndef GLEE_C_DEFINED_glGenProgramsARB +#define GLEE_C_DEFINED_glGenProgramsARB + void __stdcall GLee_Lazy_glGenProgramsARB(GLsizei n, GLuint * programs) {if (GLeeInit()) glGenProgramsARB(n, programs);} + GLEEPFNGLGENPROGRAMSARBPROC GLeeFuncPtr_glGenProgramsARB=GLee_Lazy_glGenProgramsARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameter4dARB +#define GLEE_C_DEFINED_glProgramEnvParameter4dARB + void __stdcall GLee_Lazy_glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramEnvParameter4dARB(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC GLeeFuncPtr_glProgramEnvParameter4dARB=GLee_Lazy_glProgramEnvParameter4dARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameter4dvARB +#define GLEE_C_DEFINED_glProgramEnvParameter4dvARB + void __stdcall GLee_Lazy_glProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble * params) {if (GLeeInit()) glProgramEnvParameter4dvARB(target, index, params);} + GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC GLeeFuncPtr_glProgramEnvParameter4dvARB=GLee_Lazy_glProgramEnvParameter4dvARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameter4fARB +#define GLEE_C_DEFINED_glProgramEnvParameter4fARB + void __stdcall GLee_Lazy_glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramEnvParameter4fARB(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC GLeeFuncPtr_glProgramEnvParameter4fARB=GLee_Lazy_glProgramEnvParameter4fARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameter4fvARB +#define GLEE_C_DEFINED_glProgramEnvParameter4fvARB + void __stdcall GLee_Lazy_glProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat * params) {if (GLeeInit()) glProgramEnvParameter4fvARB(target, index, params);} + GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC GLeeFuncPtr_glProgramEnvParameter4fvARB=GLee_Lazy_glProgramEnvParameter4fvARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameter4dARB +#define GLEE_C_DEFINED_glProgramLocalParameter4dARB + void __stdcall GLee_Lazy_glProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramLocalParameter4dARB(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC GLeeFuncPtr_glProgramLocalParameter4dARB=GLee_Lazy_glProgramLocalParameter4dARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameter4dvARB +#define GLEE_C_DEFINED_glProgramLocalParameter4dvARB + void __stdcall GLee_Lazy_glProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble * params) {if (GLeeInit()) glProgramLocalParameter4dvARB(target, index, params);} + GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLeeFuncPtr_glProgramLocalParameter4dvARB=GLee_Lazy_glProgramLocalParameter4dvARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameter4fARB +#define GLEE_C_DEFINED_glProgramLocalParameter4fARB + void __stdcall GLee_Lazy_glProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramLocalParameter4fARB(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC GLeeFuncPtr_glProgramLocalParameter4fARB=GLee_Lazy_glProgramLocalParameter4fARB; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameter4fvARB +#define GLEE_C_DEFINED_glProgramLocalParameter4fvARB + void __stdcall GLee_Lazy_glProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat * params) {if (GLeeInit()) glProgramLocalParameter4fvARB(target, index, params);} + GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLeeFuncPtr_glProgramLocalParameter4fvARB=GLee_Lazy_glProgramLocalParameter4fvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterdvARB +#define GLEE_C_DEFINED_glGetProgramEnvParameterdvARB + void __stdcall GLee_Lazy_glGetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble * params) {if (GLeeInit()) glGetProgramEnvParameterdvARB(target, index, params);} + GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramEnvParameterdvARB=GLee_Lazy_glGetProgramEnvParameterdvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterfvARB +#define GLEE_C_DEFINED_glGetProgramEnvParameterfvARB + void __stdcall GLee_Lazy_glGetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat * params) {if (GLeeInit()) glGetProgramEnvParameterfvARB(target, index, params);} + GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramEnvParameterfvARB=GLee_Lazy_glGetProgramEnvParameterfvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterdvARB +#define GLEE_C_DEFINED_glGetProgramLocalParameterdvARB + void __stdcall GLee_Lazy_glGetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble * params) {if (GLeeInit()) glGetProgramLocalParameterdvARB(target, index, params);} + GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramLocalParameterdvARB=GLee_Lazy_glGetProgramLocalParameterdvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterfvARB +#define GLEE_C_DEFINED_glGetProgramLocalParameterfvARB + void __stdcall GLee_Lazy_glGetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat * params) {if (GLeeInit()) glGetProgramLocalParameterfvARB(target, index, params);} + GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramLocalParameterfvARB=GLee_Lazy_glGetProgramLocalParameterfvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramivARB +#define GLEE_C_DEFINED_glGetProgramivARB + void __stdcall GLee_Lazy_glGetProgramivARB(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetProgramivARB(target, pname, params);} + GLEEPFNGLGETPROGRAMIVARBPROC GLeeFuncPtr_glGetProgramivARB=GLee_Lazy_glGetProgramivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramStringARB +#define GLEE_C_DEFINED_glGetProgramStringARB + void __stdcall GLee_Lazy_glGetProgramStringARB(GLenum target, GLenum pname, GLvoid * string) {if (GLeeInit()) glGetProgramStringARB(target, pname, string);} + GLEEPFNGLGETPROGRAMSTRINGARBPROC GLeeFuncPtr_glGetProgramStringARB=GLee_Lazy_glGetProgramStringARB; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribdvARB +#define GLEE_C_DEFINED_glGetVertexAttribdvARB + void __stdcall GLee_Lazy_glGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetVertexAttribdvARB(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBDVARBPROC GLeeFuncPtr_glGetVertexAttribdvARB=GLee_Lazy_glGetVertexAttribdvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribfvARB +#define GLEE_C_DEFINED_glGetVertexAttribfvARB + void __stdcall GLee_Lazy_glGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribfvARB(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBFVARBPROC GLeeFuncPtr_glGetVertexAttribfvARB=GLee_Lazy_glGetVertexAttribfvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribivARB +#define GLEE_C_DEFINED_glGetVertexAttribivARB + void __stdcall GLee_Lazy_glGetVertexAttribivARB(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribivARB(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIVARBPROC GLeeFuncPtr_glGetVertexAttribivARB=GLee_Lazy_glGetVertexAttribivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribPointervARB +#define GLEE_C_DEFINED_glGetVertexAttribPointervARB + void __stdcall GLee_Lazy_glGetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid* * pointer) {if (GLeeInit()) glGetVertexAttribPointervARB(index, pname, pointer);} + GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC GLeeFuncPtr_glGetVertexAttribPointervARB=GLee_Lazy_glGetVertexAttribPointervARB; +#endif +#ifndef GLEE_C_DEFINED_glIsProgramARB +#define GLEE_C_DEFINED_glIsProgramARB + GLboolean __stdcall GLee_Lazy_glIsProgramARB(GLuint program) {if (GLeeInit()) return glIsProgramARB(program); return (GLboolean)0;} + GLEEPFNGLISPROGRAMARBPROC GLeeFuncPtr_glIsProgramARB=GLee_Lazy_glIsProgramARB; +#endif +#endif + +/* GL_ARB_fragment_program */ + +#ifdef __GLEE_GL_ARB_fragment_program +#endif + +/* GL_ARB_vertex_buffer_object */ + +#ifdef __GLEE_GL_ARB_vertex_buffer_object +#ifndef GLEE_C_DEFINED_glBindBufferARB +#define GLEE_C_DEFINED_glBindBufferARB + void __stdcall GLee_Lazy_glBindBufferARB(GLenum target, GLuint buffer) {if (GLeeInit()) glBindBufferARB(target, buffer);} + GLEEPFNGLBINDBUFFERARBPROC GLeeFuncPtr_glBindBufferARB=GLee_Lazy_glBindBufferARB; +#endif +#ifndef GLEE_C_DEFINED_glDeleteBuffersARB +#define GLEE_C_DEFINED_glDeleteBuffersARB + void __stdcall GLee_Lazy_glDeleteBuffersARB(GLsizei n, const GLuint * buffers) {if (GLeeInit()) glDeleteBuffersARB(n, buffers);} + GLEEPFNGLDELETEBUFFERSARBPROC GLeeFuncPtr_glDeleteBuffersARB=GLee_Lazy_glDeleteBuffersARB; +#endif +#ifndef GLEE_C_DEFINED_glGenBuffersARB +#define GLEE_C_DEFINED_glGenBuffersARB + void __stdcall GLee_Lazy_glGenBuffersARB(GLsizei n, GLuint * buffers) {if (GLeeInit()) glGenBuffersARB(n, buffers);} + GLEEPFNGLGENBUFFERSARBPROC GLeeFuncPtr_glGenBuffersARB=GLee_Lazy_glGenBuffersARB; +#endif +#ifndef GLEE_C_DEFINED_glIsBufferARB +#define GLEE_C_DEFINED_glIsBufferARB + GLboolean __stdcall GLee_Lazy_glIsBufferARB(GLuint buffer) {if (GLeeInit()) return glIsBufferARB(buffer); return (GLboolean)0;} + GLEEPFNGLISBUFFERARBPROC GLeeFuncPtr_glIsBufferARB=GLee_Lazy_glIsBufferARB; +#endif +#ifndef GLEE_C_DEFINED_glBufferDataARB +#define GLEE_C_DEFINED_glBufferDataARB + void __stdcall GLee_Lazy_glBufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage) {if (GLeeInit()) glBufferDataARB(target, size, data, usage);} + GLEEPFNGLBUFFERDATAARBPROC GLeeFuncPtr_glBufferDataARB=GLee_Lazy_glBufferDataARB; +#endif +#ifndef GLEE_C_DEFINED_glBufferSubDataARB +#define GLEE_C_DEFINED_glBufferSubDataARB + void __stdcall GLee_Lazy_glBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data) {if (GLeeInit()) glBufferSubDataARB(target, offset, size, data);} + GLEEPFNGLBUFFERSUBDATAARBPROC GLeeFuncPtr_glBufferSubDataARB=GLee_Lazy_glBufferSubDataARB; +#endif +#ifndef GLEE_C_DEFINED_glGetBufferSubDataARB +#define GLEE_C_DEFINED_glGetBufferSubDataARB + void __stdcall GLee_Lazy_glGetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data) {if (GLeeInit()) glGetBufferSubDataARB(target, offset, size, data);} + GLEEPFNGLGETBUFFERSUBDATAARBPROC GLeeFuncPtr_glGetBufferSubDataARB=GLee_Lazy_glGetBufferSubDataARB; +#endif +#ifndef GLEE_C_DEFINED_glMapBufferARB +#define GLEE_C_DEFINED_glMapBufferARB + GLvoid* __stdcall GLee_Lazy_glMapBufferARB(GLenum target, GLenum access) {if (GLeeInit()) return glMapBufferARB(target, access); return (GLvoid*)0;} + GLEEPFNGLMAPBUFFERARBPROC GLeeFuncPtr_glMapBufferARB=GLee_Lazy_glMapBufferARB; +#endif +#ifndef GLEE_C_DEFINED_glUnmapBufferARB +#define GLEE_C_DEFINED_glUnmapBufferARB + GLboolean __stdcall GLee_Lazy_glUnmapBufferARB(GLenum target) {if (GLeeInit()) return glUnmapBufferARB(target); return (GLboolean)0;} + GLEEPFNGLUNMAPBUFFERARBPROC GLeeFuncPtr_glUnmapBufferARB=GLee_Lazy_glUnmapBufferARB; +#endif +#ifndef GLEE_C_DEFINED_glGetBufferParameterivARB +#define GLEE_C_DEFINED_glGetBufferParameterivARB + void __stdcall GLee_Lazy_glGetBufferParameterivARB(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetBufferParameterivARB(target, pname, params);} + GLEEPFNGLGETBUFFERPARAMETERIVARBPROC GLeeFuncPtr_glGetBufferParameterivARB=GLee_Lazy_glGetBufferParameterivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetBufferPointervARB +#define GLEE_C_DEFINED_glGetBufferPointervARB + void __stdcall GLee_Lazy_glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetBufferPointervARB(target, pname, params);} + GLEEPFNGLGETBUFFERPOINTERVARBPROC GLeeFuncPtr_glGetBufferPointervARB=GLee_Lazy_glGetBufferPointervARB; +#endif +#endif + +/* GL_ARB_occlusion_query */ + +#ifdef __GLEE_GL_ARB_occlusion_query +#ifndef GLEE_C_DEFINED_glGenQueriesARB +#define GLEE_C_DEFINED_glGenQueriesARB + void __stdcall GLee_Lazy_glGenQueriesARB(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenQueriesARB(n, ids);} + GLEEPFNGLGENQUERIESARBPROC GLeeFuncPtr_glGenQueriesARB=GLee_Lazy_glGenQueriesARB; +#endif +#ifndef GLEE_C_DEFINED_glDeleteQueriesARB +#define GLEE_C_DEFINED_glDeleteQueriesARB + void __stdcall GLee_Lazy_glDeleteQueriesARB(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteQueriesARB(n, ids);} + GLEEPFNGLDELETEQUERIESARBPROC GLeeFuncPtr_glDeleteQueriesARB=GLee_Lazy_glDeleteQueriesARB; +#endif +#ifndef GLEE_C_DEFINED_glIsQueryARB +#define GLEE_C_DEFINED_glIsQueryARB + GLboolean __stdcall GLee_Lazy_glIsQueryARB(GLuint id) {if (GLeeInit()) return glIsQueryARB(id); return (GLboolean)0;} + GLEEPFNGLISQUERYARBPROC GLeeFuncPtr_glIsQueryARB=GLee_Lazy_glIsQueryARB; +#endif +#ifndef GLEE_C_DEFINED_glBeginQueryARB +#define GLEE_C_DEFINED_glBeginQueryARB + void __stdcall GLee_Lazy_glBeginQueryARB(GLenum target, GLuint id) {if (GLeeInit()) glBeginQueryARB(target, id);} + GLEEPFNGLBEGINQUERYARBPROC GLeeFuncPtr_glBeginQueryARB=GLee_Lazy_glBeginQueryARB; +#endif +#ifndef GLEE_C_DEFINED_glEndQueryARB +#define GLEE_C_DEFINED_glEndQueryARB + void __stdcall GLee_Lazy_glEndQueryARB(GLenum target) {if (GLeeInit()) glEndQueryARB(target);} + GLEEPFNGLENDQUERYARBPROC GLeeFuncPtr_glEndQueryARB=GLee_Lazy_glEndQueryARB; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryivARB +#define GLEE_C_DEFINED_glGetQueryivARB + void __stdcall GLee_Lazy_glGetQueryivARB(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryivARB(target, pname, params);} + GLEEPFNGLGETQUERYIVARBPROC GLeeFuncPtr_glGetQueryivARB=GLee_Lazy_glGetQueryivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryObjectivARB +#define GLEE_C_DEFINED_glGetQueryObjectivARB + void __stdcall GLee_Lazy_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetQueryObjectivARB(id, pname, params);} + GLEEPFNGLGETQUERYOBJECTIVARBPROC GLeeFuncPtr_glGetQueryObjectivARB=GLee_Lazy_glGetQueryObjectivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryObjectuivARB +#define GLEE_C_DEFINED_glGetQueryObjectuivARB + void __stdcall GLee_Lazy_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint * params) {if (GLeeInit()) glGetQueryObjectuivARB(id, pname, params);} + GLEEPFNGLGETQUERYOBJECTUIVARBPROC GLeeFuncPtr_glGetQueryObjectuivARB=GLee_Lazy_glGetQueryObjectuivARB; +#endif +#endif + +/* GL_ARB_shader_objects */ + +#ifdef __GLEE_GL_ARB_shader_objects +#ifndef GLEE_C_DEFINED_glDeleteObjectARB +#define GLEE_C_DEFINED_glDeleteObjectARB + void __stdcall GLee_Lazy_glDeleteObjectARB(GLhandleARB obj) {if (GLeeInit()) glDeleteObjectARB(obj);} + GLEEPFNGLDELETEOBJECTARBPROC GLeeFuncPtr_glDeleteObjectARB=GLee_Lazy_glDeleteObjectARB; +#endif +#ifndef GLEE_C_DEFINED_glGetHandleARB +#define GLEE_C_DEFINED_glGetHandleARB + GLhandleARB __stdcall GLee_Lazy_glGetHandleARB(GLenum pname) {if (GLeeInit()) return glGetHandleARB(pname); return (GLhandleARB)0;} + GLEEPFNGLGETHANDLEARBPROC GLeeFuncPtr_glGetHandleARB=GLee_Lazy_glGetHandleARB; +#endif +#ifndef GLEE_C_DEFINED_glDetachObjectARB +#define GLEE_C_DEFINED_glDetachObjectARB + void __stdcall GLee_Lazy_glDetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj) {if (GLeeInit()) glDetachObjectARB(containerObj, attachedObj);} + GLEEPFNGLDETACHOBJECTARBPROC GLeeFuncPtr_glDetachObjectARB=GLee_Lazy_glDetachObjectARB; +#endif +#ifndef GLEE_C_DEFINED_glCreateShaderObjectARB +#define GLEE_C_DEFINED_glCreateShaderObjectARB + GLhandleARB __stdcall GLee_Lazy_glCreateShaderObjectARB(GLenum shaderType) {if (GLeeInit()) return glCreateShaderObjectARB(shaderType); return (GLhandleARB)0;} + GLEEPFNGLCREATESHADEROBJECTARBPROC GLeeFuncPtr_glCreateShaderObjectARB=GLee_Lazy_glCreateShaderObjectARB; +#endif +#ifndef GLEE_C_DEFINED_glShaderSourceARB +#define GLEE_C_DEFINED_glShaderSourceARB + void __stdcall GLee_Lazy_glShaderSourceARB(GLhandleARB shaderObj, GLsizei count, const GLcharARB* * string, const GLint * length) {if (GLeeInit()) glShaderSourceARB(shaderObj, count, string, length);} + GLEEPFNGLSHADERSOURCEARBPROC GLeeFuncPtr_glShaderSourceARB=GLee_Lazy_glShaderSourceARB; +#endif +#ifndef GLEE_C_DEFINED_glCompileShaderARB +#define GLEE_C_DEFINED_glCompileShaderARB + void __stdcall GLee_Lazy_glCompileShaderARB(GLhandleARB shaderObj) {if (GLeeInit()) glCompileShaderARB(shaderObj);} + GLEEPFNGLCOMPILESHADERARBPROC GLeeFuncPtr_glCompileShaderARB=GLee_Lazy_glCompileShaderARB; +#endif +#ifndef GLEE_C_DEFINED_glCreateProgramObjectARB +#define GLEE_C_DEFINED_glCreateProgramObjectARB + GLhandleARB __stdcall GLee_Lazy_glCreateProgramObjectARB(void) {if (GLeeInit()) return glCreateProgramObjectARB(); return (GLhandleARB)0;} + GLEEPFNGLCREATEPROGRAMOBJECTARBPROC GLeeFuncPtr_glCreateProgramObjectARB=GLee_Lazy_glCreateProgramObjectARB; +#endif +#ifndef GLEE_C_DEFINED_glAttachObjectARB +#define GLEE_C_DEFINED_glAttachObjectARB + void __stdcall GLee_Lazy_glAttachObjectARB(GLhandleARB containerObj, GLhandleARB obj) {if (GLeeInit()) glAttachObjectARB(containerObj, obj);} + GLEEPFNGLATTACHOBJECTARBPROC GLeeFuncPtr_glAttachObjectARB=GLee_Lazy_glAttachObjectARB; +#endif +#ifndef GLEE_C_DEFINED_glLinkProgramARB +#define GLEE_C_DEFINED_glLinkProgramARB + void __stdcall GLee_Lazy_glLinkProgramARB(GLhandleARB programObj) {if (GLeeInit()) glLinkProgramARB(programObj);} + GLEEPFNGLLINKPROGRAMARBPROC GLeeFuncPtr_glLinkProgramARB=GLee_Lazy_glLinkProgramARB; +#endif +#ifndef GLEE_C_DEFINED_glUseProgramObjectARB +#define GLEE_C_DEFINED_glUseProgramObjectARB + void __stdcall GLee_Lazy_glUseProgramObjectARB(GLhandleARB programObj) {if (GLeeInit()) glUseProgramObjectARB(programObj);} + GLEEPFNGLUSEPROGRAMOBJECTARBPROC GLeeFuncPtr_glUseProgramObjectARB=GLee_Lazy_glUseProgramObjectARB; +#endif +#ifndef GLEE_C_DEFINED_glValidateProgramARB +#define GLEE_C_DEFINED_glValidateProgramARB + void __stdcall GLee_Lazy_glValidateProgramARB(GLhandleARB programObj) {if (GLeeInit()) glValidateProgramARB(programObj);} + GLEEPFNGLVALIDATEPROGRAMARBPROC GLeeFuncPtr_glValidateProgramARB=GLee_Lazy_glValidateProgramARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform1fARB +#define GLEE_C_DEFINED_glUniform1fARB + void __stdcall GLee_Lazy_glUniform1fARB(GLint location, GLfloat v0) {if (GLeeInit()) glUniform1fARB(location, v0);} + GLEEPFNGLUNIFORM1FARBPROC GLeeFuncPtr_glUniform1fARB=GLee_Lazy_glUniform1fARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform2fARB +#define GLEE_C_DEFINED_glUniform2fARB + void __stdcall GLee_Lazy_glUniform2fARB(GLint location, GLfloat v0, GLfloat v1) {if (GLeeInit()) glUniform2fARB(location, v0, v1);} + GLEEPFNGLUNIFORM2FARBPROC GLeeFuncPtr_glUniform2fARB=GLee_Lazy_glUniform2fARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform3fARB +#define GLEE_C_DEFINED_glUniform3fARB + void __stdcall GLee_Lazy_glUniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {if (GLeeInit()) glUniform3fARB(location, v0, v1, v2);} + GLEEPFNGLUNIFORM3FARBPROC GLeeFuncPtr_glUniform3fARB=GLee_Lazy_glUniform3fARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform4fARB +#define GLEE_C_DEFINED_glUniform4fARB + void __stdcall GLee_Lazy_glUniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {if (GLeeInit()) glUniform4fARB(location, v0, v1, v2, v3);} + GLEEPFNGLUNIFORM4FARBPROC GLeeFuncPtr_glUniform4fARB=GLee_Lazy_glUniform4fARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform1iARB +#define GLEE_C_DEFINED_glUniform1iARB + void __stdcall GLee_Lazy_glUniform1iARB(GLint location, GLint v0) {if (GLeeInit()) glUniform1iARB(location, v0);} + GLEEPFNGLUNIFORM1IARBPROC GLeeFuncPtr_glUniform1iARB=GLee_Lazy_glUniform1iARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform2iARB +#define GLEE_C_DEFINED_glUniform2iARB + void __stdcall GLee_Lazy_glUniform2iARB(GLint location, GLint v0, GLint v1) {if (GLeeInit()) glUniform2iARB(location, v0, v1);} + GLEEPFNGLUNIFORM2IARBPROC GLeeFuncPtr_glUniform2iARB=GLee_Lazy_glUniform2iARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform3iARB +#define GLEE_C_DEFINED_glUniform3iARB + void __stdcall GLee_Lazy_glUniform3iARB(GLint location, GLint v0, GLint v1, GLint v2) {if (GLeeInit()) glUniform3iARB(location, v0, v1, v2);} + GLEEPFNGLUNIFORM3IARBPROC GLeeFuncPtr_glUniform3iARB=GLee_Lazy_glUniform3iARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform4iARB +#define GLEE_C_DEFINED_glUniform4iARB + void __stdcall GLee_Lazy_glUniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {if (GLeeInit()) glUniform4iARB(location, v0, v1, v2, v3);} + GLEEPFNGLUNIFORM4IARBPROC GLeeFuncPtr_glUniform4iARB=GLee_Lazy_glUniform4iARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform1fvARB +#define GLEE_C_DEFINED_glUniform1fvARB + void __stdcall GLee_Lazy_glUniform1fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform1fvARB(location, count, value);} + GLEEPFNGLUNIFORM1FVARBPROC GLeeFuncPtr_glUniform1fvARB=GLee_Lazy_glUniform1fvARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform2fvARB +#define GLEE_C_DEFINED_glUniform2fvARB + void __stdcall GLee_Lazy_glUniform2fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform2fvARB(location, count, value);} + GLEEPFNGLUNIFORM2FVARBPROC GLeeFuncPtr_glUniform2fvARB=GLee_Lazy_glUniform2fvARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform3fvARB +#define GLEE_C_DEFINED_glUniform3fvARB + void __stdcall GLee_Lazy_glUniform3fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform3fvARB(location, count, value);} + GLEEPFNGLUNIFORM3FVARBPROC GLeeFuncPtr_glUniform3fvARB=GLee_Lazy_glUniform3fvARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform4fvARB +#define GLEE_C_DEFINED_glUniform4fvARB + void __stdcall GLee_Lazy_glUniform4fvARB(GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glUniform4fvARB(location, count, value);} + GLEEPFNGLUNIFORM4FVARBPROC GLeeFuncPtr_glUniform4fvARB=GLee_Lazy_glUniform4fvARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform1ivARB +#define GLEE_C_DEFINED_glUniform1ivARB + void __stdcall GLee_Lazy_glUniform1ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform1ivARB(location, count, value);} + GLEEPFNGLUNIFORM1IVARBPROC GLeeFuncPtr_glUniform1ivARB=GLee_Lazy_glUniform1ivARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform2ivARB +#define GLEE_C_DEFINED_glUniform2ivARB + void __stdcall GLee_Lazy_glUniform2ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform2ivARB(location, count, value);} + GLEEPFNGLUNIFORM2IVARBPROC GLeeFuncPtr_glUniform2ivARB=GLee_Lazy_glUniform2ivARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform3ivARB +#define GLEE_C_DEFINED_glUniform3ivARB + void __stdcall GLee_Lazy_glUniform3ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform3ivARB(location, count, value);} + GLEEPFNGLUNIFORM3IVARBPROC GLeeFuncPtr_glUniform3ivARB=GLee_Lazy_glUniform3ivARB; +#endif +#ifndef GLEE_C_DEFINED_glUniform4ivARB +#define GLEE_C_DEFINED_glUniform4ivARB + void __stdcall GLee_Lazy_glUniform4ivARB(GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glUniform4ivARB(location, count, value);} + GLEEPFNGLUNIFORM4IVARBPROC GLeeFuncPtr_glUniform4ivARB=GLee_Lazy_glUniform4ivARB; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix2fvARB +#define GLEE_C_DEFINED_glUniformMatrix2fvARB + void __stdcall GLee_Lazy_glUniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix2fvARB(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX2FVARBPROC GLeeFuncPtr_glUniformMatrix2fvARB=GLee_Lazy_glUniformMatrix2fvARB; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix3fvARB +#define GLEE_C_DEFINED_glUniformMatrix3fvARB + void __stdcall GLee_Lazy_glUniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix3fvARB(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX3FVARBPROC GLeeFuncPtr_glUniformMatrix3fvARB=GLee_Lazy_glUniformMatrix3fvARB; +#endif +#ifndef GLEE_C_DEFINED_glUniformMatrix4fvARB +#define GLEE_C_DEFINED_glUniformMatrix4fvARB + void __stdcall GLee_Lazy_glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glUniformMatrix4fvARB(location, count, transpose, value);} + GLEEPFNGLUNIFORMMATRIX4FVARBPROC GLeeFuncPtr_glUniformMatrix4fvARB=GLee_Lazy_glUniformMatrix4fvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetObjectParameterfvARB +#define GLEE_C_DEFINED_glGetObjectParameterfvARB + void __stdcall GLee_Lazy_glGetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetObjectParameterfvARB(obj, pname, params);} + GLEEPFNGLGETOBJECTPARAMETERFVARBPROC GLeeFuncPtr_glGetObjectParameterfvARB=GLee_Lazy_glGetObjectParameterfvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetObjectParameterivARB +#define GLEE_C_DEFINED_glGetObjectParameterivARB + void __stdcall GLee_Lazy_glGetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params) {if (GLeeInit()) glGetObjectParameterivARB(obj, pname, params);} + GLEEPFNGLGETOBJECTPARAMETERIVARBPROC GLeeFuncPtr_glGetObjectParameterivARB=GLee_Lazy_glGetObjectParameterivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetInfoLogARB +#define GLEE_C_DEFINED_glGetInfoLogARB + void __stdcall GLee_Lazy_glGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog) {if (GLeeInit()) glGetInfoLogARB(obj, maxLength, length, infoLog);} + GLEEPFNGLGETINFOLOGARBPROC GLeeFuncPtr_glGetInfoLogARB=GLee_Lazy_glGetInfoLogARB; +#endif +#ifndef GLEE_C_DEFINED_glGetAttachedObjectsARB +#define GLEE_C_DEFINED_glGetAttachedObjectsARB + void __stdcall GLee_Lazy_glGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj) {if (GLeeInit()) glGetAttachedObjectsARB(containerObj, maxCount, count, obj);} + GLEEPFNGLGETATTACHEDOBJECTSARBPROC GLeeFuncPtr_glGetAttachedObjectsARB=GLee_Lazy_glGetAttachedObjectsARB; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformLocationARB +#define GLEE_C_DEFINED_glGetUniformLocationARB + GLint __stdcall GLee_Lazy_glGetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name) {if (GLeeInit()) return glGetUniformLocationARB(programObj, name); return (GLint)0;} + GLEEPFNGLGETUNIFORMLOCATIONARBPROC GLeeFuncPtr_glGetUniformLocationARB=GLee_Lazy_glGetUniformLocationARB; +#endif +#ifndef GLEE_C_DEFINED_glGetActiveUniformARB +#define GLEE_C_DEFINED_glGetActiveUniformARB + void __stdcall GLee_Lazy_glGetActiveUniformARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name) {if (GLeeInit()) glGetActiveUniformARB(programObj, index, maxLength, length, size, type, name);} + GLEEPFNGLGETACTIVEUNIFORMARBPROC GLeeFuncPtr_glGetActiveUniformARB=GLee_Lazy_glGetActiveUniformARB; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformfvARB +#define GLEE_C_DEFINED_glGetUniformfvARB + void __stdcall GLee_Lazy_glGetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params) {if (GLeeInit()) glGetUniformfvARB(programObj, location, params);} + GLEEPFNGLGETUNIFORMFVARBPROC GLeeFuncPtr_glGetUniformfvARB=GLee_Lazy_glGetUniformfvARB; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformivARB +#define GLEE_C_DEFINED_glGetUniformivARB + void __stdcall GLee_Lazy_glGetUniformivARB(GLhandleARB programObj, GLint location, GLint * params) {if (GLeeInit()) glGetUniformivARB(programObj, location, params);} + GLEEPFNGLGETUNIFORMIVARBPROC GLeeFuncPtr_glGetUniformivARB=GLee_Lazy_glGetUniformivARB; +#endif +#ifndef GLEE_C_DEFINED_glGetShaderSourceARB +#define GLEE_C_DEFINED_glGetShaderSourceARB + void __stdcall GLee_Lazy_glGetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source) {if (GLeeInit()) glGetShaderSourceARB(obj, maxLength, length, source);} + GLEEPFNGLGETSHADERSOURCEARBPROC GLeeFuncPtr_glGetShaderSourceARB=GLee_Lazy_glGetShaderSourceARB; +#endif +#endif + +/* GL_ARB_vertex_shader */ + +#ifdef __GLEE_GL_ARB_vertex_shader +#ifndef GLEE_C_DEFINED_glBindAttribLocationARB +#define GLEE_C_DEFINED_glBindAttribLocationARB + void __stdcall GLee_Lazy_glBindAttribLocationARB(GLhandleARB programObj, GLuint index, const GLcharARB * name) {if (GLeeInit()) glBindAttribLocationARB(programObj, index, name);} + GLEEPFNGLBINDATTRIBLOCATIONARBPROC GLeeFuncPtr_glBindAttribLocationARB=GLee_Lazy_glBindAttribLocationARB; +#endif +#ifndef GLEE_C_DEFINED_glGetActiveAttribARB +#define GLEE_C_DEFINED_glGetActiveAttribARB + void __stdcall GLee_Lazy_glGetActiveAttribARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name) {if (GLeeInit()) glGetActiveAttribARB(programObj, index, maxLength, length, size, type, name);} + GLEEPFNGLGETACTIVEATTRIBARBPROC GLeeFuncPtr_glGetActiveAttribARB=GLee_Lazy_glGetActiveAttribARB; +#endif +#ifndef GLEE_C_DEFINED_glGetAttribLocationARB +#define GLEE_C_DEFINED_glGetAttribLocationARB + GLint __stdcall GLee_Lazy_glGetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name) {if (GLeeInit()) return glGetAttribLocationARB(programObj, name); return (GLint)0;} + GLEEPFNGLGETATTRIBLOCATIONARBPROC GLeeFuncPtr_glGetAttribLocationARB=GLee_Lazy_glGetAttribLocationARB; +#endif +#endif + +/* GL_ARB_fragment_shader */ + +#ifdef __GLEE_GL_ARB_fragment_shader +#endif + +/* GL_ARB_shading_language_100 */ + +#ifdef __GLEE_GL_ARB_shading_language_100 +#endif + +/* GL_ARB_texture_non_power_of_two */ + +#ifdef __GLEE_GL_ARB_texture_non_power_of_two +#endif + +/* GL_ARB_point_sprite */ + +#ifdef __GLEE_GL_ARB_point_sprite +#endif + +/* GL_ARB_fragment_program_shadow */ + +#ifdef __GLEE_GL_ARB_fragment_program_shadow +#endif + +/* GL_ARB_draw_buffers */ + +#ifdef __GLEE_GL_ARB_draw_buffers +#ifndef GLEE_C_DEFINED_glDrawBuffersARB +#define GLEE_C_DEFINED_glDrawBuffersARB + void __stdcall GLee_Lazy_glDrawBuffersARB(GLsizei n, const GLenum * bufs) {if (GLeeInit()) glDrawBuffersARB(n, bufs);} + GLEEPFNGLDRAWBUFFERSARBPROC GLeeFuncPtr_glDrawBuffersARB=GLee_Lazy_glDrawBuffersARB; +#endif +#endif + +/* GL_ARB_texture_rectangle */ + +#ifdef __GLEE_GL_ARB_texture_rectangle +#endif + +/* GL_ARB_color_buffer_float */ + +#ifdef __GLEE_GL_ARB_color_buffer_float +#ifndef GLEE_C_DEFINED_glClampColorARB +#define GLEE_C_DEFINED_glClampColorARB + void __stdcall GLee_Lazy_glClampColorARB(GLenum target, GLenum clamp) {if (GLeeInit()) glClampColorARB(target, clamp);} + GLEEPFNGLCLAMPCOLORARBPROC GLeeFuncPtr_glClampColorARB=GLee_Lazy_glClampColorARB; +#endif +#endif + +/* GL_ARB_half_float_pixel */ + +#ifdef __GLEE_GL_ARB_half_float_pixel +#endif + +/* GL_ARB_texture_float */ + +#ifdef __GLEE_GL_ARB_texture_float +#endif + +/* GL_ARB_pixel_buffer_object */ + +#ifdef __GLEE_GL_ARB_pixel_buffer_object +#endif + +/* GL_ARB_depth_buffer_float */ + +#ifdef __GLEE_GL_ARB_depth_buffer_float +#endif + +/* GL_ARB_draw_instanced */ + +#ifdef __GLEE_GL_ARB_draw_instanced +#ifndef GLEE_C_DEFINED_glDrawArraysInstancedARB +#define GLEE_C_DEFINED_glDrawArraysInstancedARB + void __stdcall GLee_Lazy_glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount) {if (GLeeInit()) glDrawArraysInstancedARB(mode, first, count, primcount);} + GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC GLeeFuncPtr_glDrawArraysInstancedARB=GLee_Lazy_glDrawArraysInstancedARB; +#endif +#ifndef GLEE_C_DEFINED_glDrawElementsInstancedARB +#define GLEE_C_DEFINED_glDrawElementsInstancedARB + void __stdcall GLee_Lazy_glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount) {if (GLeeInit()) glDrawElementsInstancedARB(mode, count, type, indices, primcount);} + GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC GLeeFuncPtr_glDrawElementsInstancedARB=GLee_Lazy_glDrawElementsInstancedARB; +#endif +#endif + +/* GL_ARB_framebuffer_object */ + +#ifdef __GLEE_GL_ARB_framebuffer_object +#ifndef GLEE_C_DEFINED_glIsRenderbuffer +#define GLEE_C_DEFINED_glIsRenderbuffer + GLboolean __stdcall GLee_Lazy_glIsRenderbuffer(GLuint renderbuffer) {if (GLeeInit()) return glIsRenderbuffer(renderbuffer); return (GLboolean)0;} + GLEEPFNGLISRENDERBUFFERPROC GLeeFuncPtr_glIsRenderbuffer=GLee_Lazy_glIsRenderbuffer; +#endif +#ifndef GLEE_C_DEFINED_glBindRenderbuffer +#define GLEE_C_DEFINED_glBindRenderbuffer + void __stdcall GLee_Lazy_glBindRenderbuffer(GLenum target, GLuint renderbuffer) {if (GLeeInit()) glBindRenderbuffer(target, renderbuffer);} + GLEEPFNGLBINDRENDERBUFFERPROC GLeeFuncPtr_glBindRenderbuffer=GLee_Lazy_glBindRenderbuffer; +#endif +#ifndef GLEE_C_DEFINED_glDeleteRenderbuffers +#define GLEE_C_DEFINED_glDeleteRenderbuffers + void __stdcall GLee_Lazy_glDeleteRenderbuffers(GLsizei n, const GLuint * renderbuffers) {if (GLeeInit()) glDeleteRenderbuffers(n, renderbuffers);} + GLEEPFNGLDELETERENDERBUFFERSPROC GLeeFuncPtr_glDeleteRenderbuffers=GLee_Lazy_glDeleteRenderbuffers; +#endif +#ifndef GLEE_C_DEFINED_glGenRenderbuffers +#define GLEE_C_DEFINED_glGenRenderbuffers + void __stdcall GLee_Lazy_glGenRenderbuffers(GLsizei n, GLuint * renderbuffers) {if (GLeeInit()) glGenRenderbuffers(n, renderbuffers);} + GLEEPFNGLGENRENDERBUFFERSPROC GLeeFuncPtr_glGenRenderbuffers=GLee_Lazy_glGenRenderbuffers; +#endif +#ifndef GLEE_C_DEFINED_glRenderbufferStorage +#define GLEE_C_DEFINED_glRenderbufferStorage + void __stdcall GLee_Lazy_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorage(target, internalformat, width, height);} + GLEEPFNGLRENDERBUFFERSTORAGEPROC GLeeFuncPtr_glRenderbufferStorage=GLee_Lazy_glRenderbufferStorage; +#endif +#ifndef GLEE_C_DEFINED_glGetRenderbufferParameteriv +#define GLEE_C_DEFINED_glGetRenderbufferParameteriv + void __stdcall GLee_Lazy_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetRenderbufferParameteriv(target, pname, params);} + GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetRenderbufferParameteriv=GLee_Lazy_glGetRenderbufferParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glIsFramebuffer +#define GLEE_C_DEFINED_glIsFramebuffer + GLboolean __stdcall GLee_Lazy_glIsFramebuffer(GLuint framebuffer) {if (GLeeInit()) return glIsFramebuffer(framebuffer); return (GLboolean)0;} + GLEEPFNGLISFRAMEBUFFERPROC GLeeFuncPtr_glIsFramebuffer=GLee_Lazy_glIsFramebuffer; +#endif +#ifndef GLEE_C_DEFINED_glBindFramebuffer +#define GLEE_C_DEFINED_glBindFramebuffer + void __stdcall GLee_Lazy_glBindFramebuffer(GLenum target, GLuint framebuffer) {if (GLeeInit()) glBindFramebuffer(target, framebuffer);} + GLEEPFNGLBINDFRAMEBUFFERPROC GLeeFuncPtr_glBindFramebuffer=GLee_Lazy_glBindFramebuffer; +#endif +#ifndef GLEE_C_DEFINED_glDeleteFramebuffers +#define GLEE_C_DEFINED_glDeleteFramebuffers + void __stdcall GLee_Lazy_glDeleteFramebuffers(GLsizei n, const GLuint * framebuffers) {if (GLeeInit()) glDeleteFramebuffers(n, framebuffers);} + GLEEPFNGLDELETEFRAMEBUFFERSPROC GLeeFuncPtr_glDeleteFramebuffers=GLee_Lazy_glDeleteFramebuffers; +#endif +#ifndef GLEE_C_DEFINED_glGenFramebuffers +#define GLEE_C_DEFINED_glGenFramebuffers + void __stdcall GLee_Lazy_glGenFramebuffers(GLsizei n, GLuint * framebuffers) {if (GLeeInit()) glGenFramebuffers(n, framebuffers);} + GLEEPFNGLGENFRAMEBUFFERSPROC GLeeFuncPtr_glGenFramebuffers=GLee_Lazy_glGenFramebuffers; +#endif +#ifndef GLEE_C_DEFINED_glCheckFramebufferStatus +#define GLEE_C_DEFINED_glCheckFramebufferStatus + GLenum __stdcall GLee_Lazy_glCheckFramebufferStatus(GLenum target) {if (GLeeInit()) return glCheckFramebufferStatus(target); return (GLenum)0;} + GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC GLeeFuncPtr_glCheckFramebufferStatus=GLee_Lazy_glCheckFramebufferStatus; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTexture1D +#define GLEE_C_DEFINED_glFramebufferTexture1D + void __stdcall GLee_Lazy_glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture1D(target, attachment, textarget, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC GLeeFuncPtr_glFramebufferTexture1D=GLee_Lazy_glFramebufferTexture1D; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTexture2D +#define GLEE_C_DEFINED_glFramebufferTexture2D + void __stdcall GLee_Lazy_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture2D(target, attachment, textarget, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC GLeeFuncPtr_glFramebufferTexture2D=GLee_Lazy_glFramebufferTexture2D; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTexture3D +#define GLEE_C_DEFINED_glFramebufferTexture3D + void __stdcall GLee_Lazy_glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {if (GLeeInit()) glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);} + GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC GLeeFuncPtr_glFramebufferTexture3D=GLee_Lazy_glFramebufferTexture3D; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferRenderbuffer +#define GLEE_C_DEFINED_glFramebufferRenderbuffer + void __stdcall GLee_Lazy_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {if (GLeeInit()) glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);} + GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC GLeeFuncPtr_glFramebufferRenderbuffer=GLee_Lazy_glFramebufferRenderbuffer; +#endif +#ifndef GLEE_C_DEFINED_glGetFramebufferAttachmentParameteriv +#define GLEE_C_DEFINED_glGetFramebufferAttachmentParameteriv + void __stdcall GLee_Lazy_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint * params) {if (GLeeInit()) glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);} + GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GLeeFuncPtr_glGetFramebufferAttachmentParameteriv=GLee_Lazy_glGetFramebufferAttachmentParameteriv; +#endif +#ifndef GLEE_C_DEFINED_glGenerateMipmap +#define GLEE_C_DEFINED_glGenerateMipmap + void __stdcall GLee_Lazy_glGenerateMipmap(GLenum target) {if (GLeeInit()) glGenerateMipmap(target);} + GLEEPFNGLGENERATEMIPMAPPROC GLeeFuncPtr_glGenerateMipmap=GLee_Lazy_glGenerateMipmap; +#endif +#ifndef GLEE_C_DEFINED_glBlitFramebuffer +#define GLEE_C_DEFINED_glBlitFramebuffer + void __stdcall GLee_Lazy_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {if (GLeeInit()) glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);} + GLEEPFNGLBLITFRAMEBUFFERPROC GLeeFuncPtr_glBlitFramebuffer=GLee_Lazy_glBlitFramebuffer; +#endif +#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisample +#define GLEE_C_DEFINED_glRenderbufferStorageMultisample + void __stdcall GLee_Lazy_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageMultisample(target, samples, internalformat, width, height);} + GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC GLeeFuncPtr_glRenderbufferStorageMultisample=GLee_Lazy_glRenderbufferStorageMultisample; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureLayer +#define GLEE_C_DEFINED_glFramebufferTextureLayer + void __stdcall GLee_Lazy_glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayer(target, attachment, texture, level, layer);} + GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC GLeeFuncPtr_glFramebufferTextureLayer=GLee_Lazy_glFramebufferTextureLayer; +#endif +#endif + +/* GL_ARB_framebuffer_sRGB */ + +#ifdef __GLEE_GL_ARB_framebuffer_sRGB +#endif + +/* GL_ARB_geometry_shader4 */ + +#ifdef __GLEE_GL_ARB_geometry_shader4 +#ifndef GLEE_C_DEFINED_glProgramParameteriARB +#define GLEE_C_DEFINED_glProgramParameteriARB + void __stdcall GLee_Lazy_glProgramParameteriARB(GLuint program, GLenum pname, GLint value) {if (GLeeInit()) glProgramParameteriARB(program, pname, value);} + GLEEPFNGLPROGRAMPARAMETERIARBPROC GLeeFuncPtr_glProgramParameteriARB=GLee_Lazy_glProgramParameteriARB; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureARB +#define GLEE_C_DEFINED_glFramebufferTextureARB + void __stdcall GLee_Lazy_glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTextureARB(target, attachment, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC GLeeFuncPtr_glFramebufferTextureARB=GLee_Lazy_glFramebufferTextureARB; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerARB +#define GLEE_C_DEFINED_glFramebufferTextureLayerARB + void __stdcall GLee_Lazy_glFramebufferTextureLayerARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayerARB(target, attachment, texture, level, layer);} + GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC GLeeFuncPtr_glFramebufferTextureLayerARB=GLee_Lazy_glFramebufferTextureLayerARB; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceARB +#define GLEE_C_DEFINED_glFramebufferTextureFaceARB + void __stdcall GLee_Lazy_glFramebufferTextureFaceARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glFramebufferTextureFaceARB(target, attachment, texture, level, face);} + GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC GLeeFuncPtr_glFramebufferTextureFaceARB=GLee_Lazy_glFramebufferTextureFaceARB; +#endif +#endif + +/* GL_ARB_half_float_vertex */ + +#ifdef __GLEE_GL_ARB_half_float_vertex +#endif + +/* GL_ARB_instanced_arrays */ + +#ifdef __GLEE_GL_ARB_instanced_arrays +#ifndef GLEE_C_DEFINED_glVertexAttribDivisor +#define GLEE_C_DEFINED_glVertexAttribDivisor + void __stdcall GLee_Lazy_glVertexAttribDivisor(GLuint index, GLuint divisor) {if (GLeeInit()) glVertexAttribDivisor(index, divisor);} + GLEEPFNGLVERTEXATTRIBDIVISORPROC GLeeFuncPtr_glVertexAttribDivisor=GLee_Lazy_glVertexAttribDivisor; +#endif +#endif + +/* GL_ARB_map_buffer_range */ + +#ifdef __GLEE_GL_ARB_map_buffer_range +#ifndef GLEE_C_DEFINED_glMapBufferRange +#define GLEE_C_DEFINED_glMapBufferRange + void __stdcall GLee_Lazy_glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {if (GLeeInit()) glMapBufferRange(target, offset, length, access);} + GLEEPFNGLMAPBUFFERRANGEPROC GLeeFuncPtr_glMapBufferRange=GLee_Lazy_glMapBufferRange; +#endif +#ifndef GLEE_C_DEFINED_glFlushMappedBufferRange +#define GLEE_C_DEFINED_glFlushMappedBufferRange + void __stdcall GLee_Lazy_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) {if (GLeeInit()) glFlushMappedBufferRange(target, offset, length);} + GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC GLeeFuncPtr_glFlushMappedBufferRange=GLee_Lazy_glFlushMappedBufferRange; +#endif +#endif + +/* GL_ARB_texture_buffer_object */ + +#ifdef __GLEE_GL_ARB_texture_buffer_object +#ifndef GLEE_C_DEFINED_glTexBufferARB +#define GLEE_C_DEFINED_glTexBufferARB + void __stdcall GLee_Lazy_glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glTexBufferARB(target, internalformat, buffer);} + GLEEPFNGLTEXBUFFERARBPROC GLeeFuncPtr_glTexBufferARB=GLee_Lazy_glTexBufferARB; +#endif +#endif + +/* GL_ARB_texture_compression_rgtc */ + +#ifdef __GLEE_GL_ARB_texture_compression_rgtc +#endif + +/* GL_ARB_texture_rg */ + +#ifdef __GLEE_GL_ARB_texture_rg +#endif + +/* GL_ARB_vertex_array_object */ + +#ifdef __GLEE_GL_ARB_vertex_array_object +#ifndef GLEE_C_DEFINED_glBindVertexArray +#define GLEE_C_DEFINED_glBindVertexArray + void __stdcall GLee_Lazy_glBindVertexArray(GLuint array) {if (GLeeInit()) glBindVertexArray(array);} + GLEEPFNGLBINDVERTEXARRAYPROC GLeeFuncPtr_glBindVertexArray=GLee_Lazy_glBindVertexArray; +#endif +#ifndef GLEE_C_DEFINED_glDeleteVertexArrays +#define GLEE_C_DEFINED_glDeleteVertexArrays + void __stdcall GLee_Lazy_glDeleteVertexArrays(GLsizei n, const GLuint * arrays) {if (GLeeInit()) glDeleteVertexArrays(n, arrays);} + GLEEPFNGLDELETEVERTEXARRAYSPROC GLeeFuncPtr_glDeleteVertexArrays=GLee_Lazy_glDeleteVertexArrays; +#endif +#ifndef GLEE_C_DEFINED_glGenVertexArrays +#define GLEE_C_DEFINED_glGenVertexArrays + void __stdcall GLee_Lazy_glGenVertexArrays(GLsizei n, GLuint * arrays) {if (GLeeInit()) glGenVertexArrays(n, arrays);} + GLEEPFNGLGENVERTEXARRAYSPROC GLeeFuncPtr_glGenVertexArrays=GLee_Lazy_glGenVertexArrays; +#endif +#ifndef GLEE_C_DEFINED_glIsVertexArray +#define GLEE_C_DEFINED_glIsVertexArray + GLboolean __stdcall GLee_Lazy_glIsVertexArray(GLuint array) {if (GLeeInit()) return glIsVertexArray(array); return (GLboolean)0;} + GLEEPFNGLISVERTEXARRAYPROC GLeeFuncPtr_glIsVertexArray=GLee_Lazy_glIsVertexArray; +#endif +#endif + +/* GL_EXT_abgr */ + +#ifdef __GLEE_GL_EXT_abgr +#endif + +/* GL_EXT_blend_color */ + +#ifdef __GLEE_GL_EXT_blend_color +#ifndef GLEE_C_DEFINED_glBlendColorEXT +#define GLEE_C_DEFINED_glBlendColorEXT + void __stdcall GLee_Lazy_glBlendColorEXT(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {if (GLeeInit()) glBlendColorEXT(red, green, blue, alpha);} + GLEEPFNGLBLENDCOLOREXTPROC GLeeFuncPtr_glBlendColorEXT=GLee_Lazy_glBlendColorEXT; +#endif +#endif + +/* GL_EXT_polygon_offset */ + +#ifdef __GLEE_GL_EXT_polygon_offset +#ifndef GLEE_C_DEFINED_glPolygonOffsetEXT +#define GLEE_C_DEFINED_glPolygonOffsetEXT + void __stdcall GLee_Lazy_glPolygonOffsetEXT(GLfloat factor, GLfloat bias) {if (GLeeInit()) glPolygonOffsetEXT(factor, bias);} + GLEEPFNGLPOLYGONOFFSETEXTPROC GLeeFuncPtr_glPolygonOffsetEXT=GLee_Lazy_glPolygonOffsetEXT; +#endif +#endif + +/* GL_EXT_texture */ + +#ifdef __GLEE_GL_EXT_texture +#endif + +/* GL_EXT_texture3D */ + +#ifdef __GLEE_GL_EXT_texture3D +#ifndef GLEE_C_DEFINED_glTexImage3DEXT +#define GLEE_C_DEFINED_glTexImage3DEXT + void __stdcall GLee_Lazy_glTexImage3DEXT(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexImage3DEXT(target, level, internalformat, width, height, depth, border, format, type, pixels);} + GLEEPFNGLTEXIMAGE3DEXTPROC GLeeFuncPtr_glTexImage3DEXT=GLee_Lazy_glTexImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glTexSubImage3DEXT +#define GLEE_C_DEFINED_glTexSubImage3DEXT + void __stdcall GLee_Lazy_glTexSubImage3DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} + GLEEPFNGLTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glTexSubImage3DEXT=GLee_Lazy_glTexSubImage3DEXT; +#endif +#endif + +/* GL_SGIS_texture_filter4 */ + +#ifdef __GLEE_GL_SGIS_texture_filter4 +#ifndef GLEE_C_DEFINED_glGetTexFilterFuncSGIS +#define GLEE_C_DEFINED_glGetTexFilterFuncSGIS + void __stdcall GLee_Lazy_glGetTexFilterFuncSGIS(GLenum target, GLenum filter, GLfloat * weights) {if (GLeeInit()) glGetTexFilterFuncSGIS(target, filter, weights);} + GLEEPFNGLGETTEXFILTERFUNCSGISPROC GLeeFuncPtr_glGetTexFilterFuncSGIS=GLee_Lazy_glGetTexFilterFuncSGIS; +#endif +#ifndef GLEE_C_DEFINED_glTexFilterFuncSGIS +#define GLEE_C_DEFINED_glTexFilterFuncSGIS + void __stdcall GLee_Lazy_glTexFilterFuncSGIS(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights) {if (GLeeInit()) glTexFilterFuncSGIS(target, filter, n, weights);} + GLEEPFNGLTEXFILTERFUNCSGISPROC GLeeFuncPtr_glTexFilterFuncSGIS=GLee_Lazy_glTexFilterFuncSGIS; +#endif +#endif + +/* GL_EXT_subtexture */ + +#ifdef __GLEE_GL_EXT_subtexture +#ifndef GLEE_C_DEFINED_glTexSubImage1DEXT +#define GLEE_C_DEFINED_glTexSubImage1DEXT + void __stdcall GLee_Lazy_glTexSubImage1DEXT(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage1DEXT(target, level, xoffset, width, format, type, pixels);} + GLEEPFNGLTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glTexSubImage1DEXT=GLee_Lazy_glTexSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glTexSubImage2DEXT +#define GLEE_C_DEFINED_glTexSubImage2DEXT + void __stdcall GLee_Lazy_glTexSubImage2DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage2DEXT(target, level, xoffset, yoffset, width, height, format, type, pixels);} + GLEEPFNGLTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glTexSubImage2DEXT=GLee_Lazy_glTexSubImage2DEXT; +#endif +#endif + +/* GL_EXT_copy_texture */ + +#ifdef __GLEE_GL_EXT_copy_texture +#ifndef GLEE_C_DEFINED_glCopyTexImage1DEXT +#define GLEE_C_DEFINED_glCopyTexImage1DEXT + void __stdcall GLee_Lazy_glCopyTexImage1DEXT(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) {if (GLeeInit()) glCopyTexImage1DEXT(target, level, internalformat, x, y, width, border);} + GLEEPFNGLCOPYTEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexImage1DEXT=GLee_Lazy_glCopyTexImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTexImage2DEXT +#define GLEE_C_DEFINED_glCopyTexImage2DEXT + void __stdcall GLee_Lazy_glCopyTexImage2DEXT(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {if (GLeeInit()) glCopyTexImage2DEXT(target, level, internalformat, x, y, width, height, border);} + GLEEPFNGLCOPYTEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexImage2DEXT=GLee_Lazy_glCopyTexImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTexSubImage1DEXT +#define GLEE_C_DEFINED_glCopyTexSubImage1DEXT + void __stdcall GLee_Lazy_glCopyTexSubImage1DEXT(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyTexSubImage1DEXT(target, level, xoffset, x, y, width);} + GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexSubImage1DEXT=GLee_Lazy_glCopyTexSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTexSubImage2DEXT +#define GLEE_C_DEFINED_glCopyTexSubImage2DEXT + void __stdcall GLee_Lazy_glCopyTexSubImage2DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height);} + GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexSubImage2DEXT=GLee_Lazy_glCopyTexSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTexSubImage3DEXT +#define GLEE_C_DEFINED_glCopyTexSubImage3DEXT + void __stdcall GLee_Lazy_glCopyTexSubImage3DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height);} + GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTexSubImage3DEXT=GLee_Lazy_glCopyTexSubImage3DEXT; +#endif +#endif + +/* GL_EXT_histogram */ + +#ifdef __GLEE_GL_EXT_histogram +#ifndef GLEE_C_DEFINED_glGetHistogramEXT +#define GLEE_C_DEFINED_glGetHistogramEXT + void __stdcall GLee_Lazy_glGetHistogramEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetHistogramEXT(target, reset, format, type, values);} + GLEEPFNGLGETHISTOGRAMEXTPROC GLeeFuncPtr_glGetHistogramEXT=GLee_Lazy_glGetHistogramEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetHistogramParameterfvEXT +#define GLEE_C_DEFINED_glGetHistogramParameterfvEXT + void __stdcall GLee_Lazy_glGetHistogramParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetHistogramParameterfvEXT(target, pname, params);} + GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC GLeeFuncPtr_glGetHistogramParameterfvEXT=GLee_Lazy_glGetHistogramParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetHistogramParameterivEXT +#define GLEE_C_DEFINED_glGetHistogramParameterivEXT + void __stdcall GLee_Lazy_glGetHistogramParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetHistogramParameterivEXT(target, pname, params);} + GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC GLeeFuncPtr_glGetHistogramParameterivEXT=GLee_Lazy_glGetHistogramParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMinmaxEXT +#define GLEE_C_DEFINED_glGetMinmaxEXT + void __stdcall GLee_Lazy_glGetMinmaxEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values) {if (GLeeInit()) glGetMinmaxEXT(target, reset, format, type, values);} + GLEEPFNGLGETMINMAXEXTPROC GLeeFuncPtr_glGetMinmaxEXT=GLee_Lazy_glGetMinmaxEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMinmaxParameterfvEXT +#define GLEE_C_DEFINED_glGetMinmaxParameterfvEXT + void __stdcall GLee_Lazy_glGetMinmaxParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMinmaxParameterfvEXT(target, pname, params);} + GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMinmaxParameterfvEXT=GLee_Lazy_glGetMinmaxParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMinmaxParameterivEXT +#define GLEE_C_DEFINED_glGetMinmaxParameterivEXT + void __stdcall GLee_Lazy_glGetMinmaxParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMinmaxParameterivEXT(target, pname, params);} + GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMinmaxParameterivEXT=GLee_Lazy_glGetMinmaxParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glHistogramEXT +#define GLEE_C_DEFINED_glHistogramEXT + void __stdcall GLee_Lazy_glHistogramEXT(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glHistogramEXT(target, width, internalformat, sink);} + GLEEPFNGLHISTOGRAMEXTPROC GLeeFuncPtr_glHistogramEXT=GLee_Lazy_glHistogramEXT; +#endif +#ifndef GLEE_C_DEFINED_glMinmaxEXT +#define GLEE_C_DEFINED_glMinmaxEXT + void __stdcall GLee_Lazy_glMinmaxEXT(GLenum target, GLenum internalformat, GLboolean sink) {if (GLeeInit()) glMinmaxEXT(target, internalformat, sink);} + GLEEPFNGLMINMAXEXTPROC GLeeFuncPtr_glMinmaxEXT=GLee_Lazy_glMinmaxEXT; +#endif +#ifndef GLEE_C_DEFINED_glResetHistogramEXT +#define GLEE_C_DEFINED_glResetHistogramEXT + void __stdcall GLee_Lazy_glResetHistogramEXT(GLenum target) {if (GLeeInit()) glResetHistogramEXT(target);} + GLEEPFNGLRESETHISTOGRAMEXTPROC GLeeFuncPtr_glResetHistogramEXT=GLee_Lazy_glResetHistogramEXT; +#endif +#ifndef GLEE_C_DEFINED_glResetMinmaxEXT +#define GLEE_C_DEFINED_glResetMinmaxEXT + void __stdcall GLee_Lazy_glResetMinmaxEXT(GLenum target) {if (GLeeInit()) glResetMinmaxEXT(target);} + GLEEPFNGLRESETMINMAXEXTPROC GLeeFuncPtr_glResetMinmaxEXT=GLee_Lazy_glResetMinmaxEXT; +#endif +#endif + +/* GL_EXT_convolution */ + +#ifdef __GLEE_GL_EXT_convolution +#ifndef GLEE_C_DEFINED_glConvolutionFilter1DEXT +#define GLEE_C_DEFINED_glConvolutionFilter1DEXT + void __stdcall GLee_Lazy_glConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter1DEXT(target, internalformat, width, format, type, image);} + GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glConvolutionFilter1DEXT=GLee_Lazy_glConvolutionFilter1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionFilter2DEXT +#define GLEE_C_DEFINED_glConvolutionFilter2DEXT + void __stdcall GLee_Lazy_glConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image) {if (GLeeInit()) glConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image);} + GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glConvolutionFilter2DEXT=GLee_Lazy_glConvolutionFilter2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameterfEXT +#define GLEE_C_DEFINED_glConvolutionParameterfEXT + void __stdcall GLee_Lazy_glConvolutionParameterfEXT(GLenum target, GLenum pname, GLfloat params) {if (GLeeInit()) glConvolutionParameterfEXT(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC GLeeFuncPtr_glConvolutionParameterfEXT=GLee_Lazy_glConvolutionParameterfEXT; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameterfvEXT +#define GLEE_C_DEFINED_glConvolutionParameterfvEXT + void __stdcall GLee_Lazy_glConvolutionParameterfvEXT(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glConvolutionParameterfvEXT(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glConvolutionParameterfvEXT=GLee_Lazy_glConvolutionParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameteriEXT +#define GLEE_C_DEFINED_glConvolutionParameteriEXT + void __stdcall GLee_Lazy_glConvolutionParameteriEXT(GLenum target, GLenum pname, GLint params) {if (GLeeInit()) glConvolutionParameteriEXT(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC GLeeFuncPtr_glConvolutionParameteriEXT=GLee_Lazy_glConvolutionParameteriEXT; +#endif +#ifndef GLEE_C_DEFINED_glConvolutionParameterivEXT +#define GLEE_C_DEFINED_glConvolutionParameterivEXT + void __stdcall GLee_Lazy_glConvolutionParameterivEXT(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glConvolutionParameterivEXT(target, pname, params);} + GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glConvolutionParameterivEXT=GLee_Lazy_glConvolutionParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter1DEXT +#define GLEE_C_DEFINED_glCopyConvolutionFilter1DEXT + void __stdcall GLee_Lazy_glCopyConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyConvolutionFilter1DEXT(target, internalformat, x, y, width);} + GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter1DEXT=GLee_Lazy_glCopyConvolutionFilter1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter2DEXT +#define GLEE_C_DEFINED_glCopyConvolutionFilter2DEXT + void __stdcall GLee_Lazy_glCopyConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height);} + GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter2DEXT=GLee_Lazy_glCopyConvolutionFilter2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetConvolutionFilterEXT +#define GLEE_C_DEFINED_glGetConvolutionFilterEXT + void __stdcall GLee_Lazy_glGetConvolutionFilterEXT(GLenum target, GLenum format, GLenum type, GLvoid * image) {if (GLeeInit()) glGetConvolutionFilterEXT(target, format, type, image);} + GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC GLeeFuncPtr_glGetConvolutionFilterEXT=GLee_Lazy_glGetConvolutionFilterEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetConvolutionParameterfvEXT +#define GLEE_C_DEFINED_glGetConvolutionParameterfvEXT + void __stdcall GLee_Lazy_glGetConvolutionParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetConvolutionParameterfvEXT(target, pname, params);} + GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glGetConvolutionParameterfvEXT=GLee_Lazy_glGetConvolutionParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetConvolutionParameterivEXT +#define GLEE_C_DEFINED_glGetConvolutionParameterivEXT + void __stdcall GLee_Lazy_glGetConvolutionParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetConvolutionParameterivEXT(target, pname, params);} + GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glGetConvolutionParameterivEXT=GLee_Lazy_glGetConvolutionParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetSeparableFilterEXT +#define GLEE_C_DEFINED_glGetSeparableFilterEXT + void __stdcall GLee_Lazy_glGetSeparableFilterEXT(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span) {if (GLeeInit()) glGetSeparableFilterEXT(target, format, type, row, column, span);} + GLEEPFNGLGETSEPARABLEFILTEREXTPROC GLeeFuncPtr_glGetSeparableFilterEXT=GLee_Lazy_glGetSeparableFilterEXT; +#endif +#ifndef GLEE_C_DEFINED_glSeparableFilter2DEXT +#define GLEE_C_DEFINED_glSeparableFilter2DEXT + void __stdcall GLee_Lazy_glSeparableFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column) {if (GLeeInit()) glSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column);} + GLEEPFNGLSEPARABLEFILTER2DEXTPROC GLeeFuncPtr_glSeparableFilter2DEXT=GLee_Lazy_glSeparableFilter2DEXT; +#endif +#endif + +/* GL_SGI_color_matrix */ + +#ifdef __GLEE_GL_SGI_color_matrix +#endif + +/* GL_SGI_color_table */ + +#ifdef __GLEE_GL_SGI_color_table +#ifndef GLEE_C_DEFINED_glColorTableSGI +#define GLEE_C_DEFINED_glColorTableSGI + void __stdcall GLee_Lazy_glColorTableSGI(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table) {if (GLeeInit()) glColorTableSGI(target, internalformat, width, format, type, table);} + GLEEPFNGLCOLORTABLESGIPROC GLeeFuncPtr_glColorTableSGI=GLee_Lazy_glColorTableSGI; +#endif +#ifndef GLEE_C_DEFINED_glColorTableParameterfvSGI +#define GLEE_C_DEFINED_glColorTableParameterfvSGI + void __stdcall GLee_Lazy_glColorTableParameterfvSGI(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glColorTableParameterfvSGI(target, pname, params);} + GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glColorTableParameterfvSGI=GLee_Lazy_glColorTableParameterfvSGI; +#endif +#ifndef GLEE_C_DEFINED_glColorTableParameterivSGI +#define GLEE_C_DEFINED_glColorTableParameterivSGI + void __stdcall GLee_Lazy_glColorTableParameterivSGI(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glColorTableParameterivSGI(target, pname, params);} + GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glColorTableParameterivSGI=GLee_Lazy_glColorTableParameterivSGI; +#endif +#ifndef GLEE_C_DEFINED_glCopyColorTableSGI +#define GLEE_C_DEFINED_glCopyColorTableSGI + void __stdcall GLee_Lazy_glCopyColorTableSGI(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorTableSGI(target, internalformat, x, y, width);} + GLEEPFNGLCOPYCOLORTABLESGIPROC GLeeFuncPtr_glCopyColorTableSGI=GLee_Lazy_glCopyColorTableSGI; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableSGI +#define GLEE_C_DEFINED_glGetColorTableSGI + void __stdcall GLee_Lazy_glGetColorTableSGI(GLenum target, GLenum format, GLenum type, GLvoid * table) {if (GLeeInit()) glGetColorTableSGI(target, format, type, table);} + GLEEPFNGLGETCOLORTABLESGIPROC GLeeFuncPtr_glGetColorTableSGI=GLee_Lazy_glGetColorTableSGI; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableParameterfvSGI +#define GLEE_C_DEFINED_glGetColorTableParameterfvSGI + void __stdcall GLee_Lazy_glGetColorTableParameterfvSGI(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetColorTableParameterfvSGI(target, pname, params);} + GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glGetColorTableParameterfvSGI=GLee_Lazy_glGetColorTableParameterfvSGI; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableParameterivSGI +#define GLEE_C_DEFINED_glGetColorTableParameterivSGI + void __stdcall GLee_Lazy_glGetColorTableParameterivSGI(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetColorTableParameterivSGI(target, pname, params);} + GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glGetColorTableParameterivSGI=GLee_Lazy_glGetColorTableParameterivSGI; +#endif +#endif + +/* GL_SGIS_pixel_texture */ + +#ifdef __GLEE_GL_SGIS_pixel_texture +#ifndef GLEE_C_DEFINED_glPixelTexGenParameteriSGIS +#define GLEE_C_DEFINED_glPixelTexGenParameteriSGIS + void __stdcall GLee_Lazy_glPixelTexGenParameteriSGIS(GLenum pname, GLint param) {if (GLeeInit()) glPixelTexGenParameteriSGIS(pname, param);} + GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC GLeeFuncPtr_glPixelTexGenParameteriSGIS=GLee_Lazy_glPixelTexGenParameteriSGIS; +#endif +#ifndef GLEE_C_DEFINED_glPixelTexGenParameterivSGIS +#define GLEE_C_DEFINED_glPixelTexGenParameterivSGIS + void __stdcall GLee_Lazy_glPixelTexGenParameterivSGIS(GLenum pname, const GLint * params) {if (GLeeInit()) glPixelTexGenParameterivSGIS(pname, params);} + GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glPixelTexGenParameterivSGIS=GLee_Lazy_glPixelTexGenParameterivSGIS; +#endif +#ifndef GLEE_C_DEFINED_glPixelTexGenParameterfSGIS +#define GLEE_C_DEFINED_glPixelTexGenParameterfSGIS + void __stdcall GLee_Lazy_glPixelTexGenParameterfSGIS(GLenum pname, GLfloat param) {if (GLeeInit()) glPixelTexGenParameterfSGIS(pname, param);} + GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC GLeeFuncPtr_glPixelTexGenParameterfSGIS=GLee_Lazy_glPixelTexGenParameterfSGIS; +#endif +#ifndef GLEE_C_DEFINED_glPixelTexGenParameterfvSGIS +#define GLEE_C_DEFINED_glPixelTexGenParameterfvSGIS + void __stdcall GLee_Lazy_glPixelTexGenParameterfvSGIS(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPixelTexGenParameterfvSGIS(pname, params);} + GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glPixelTexGenParameterfvSGIS=GLee_Lazy_glPixelTexGenParameterfvSGIS; +#endif +#ifndef GLEE_C_DEFINED_glGetPixelTexGenParameterivSGIS +#define GLEE_C_DEFINED_glGetPixelTexGenParameterivSGIS + void __stdcall GLee_Lazy_glGetPixelTexGenParameterivSGIS(GLenum pname, GLint * params) {if (GLeeInit()) glGetPixelTexGenParameterivSGIS(pname, params);} + GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterivSGIS=GLee_Lazy_glGetPixelTexGenParameterivSGIS; +#endif +#ifndef GLEE_C_DEFINED_glGetPixelTexGenParameterfvSGIS +#define GLEE_C_DEFINED_glGetPixelTexGenParameterfvSGIS + void __stdcall GLee_Lazy_glGetPixelTexGenParameterfvSGIS(GLenum pname, GLfloat * params) {if (GLeeInit()) glGetPixelTexGenParameterfvSGIS(pname, params);} + GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS=GLee_Lazy_glGetPixelTexGenParameterfvSGIS; +#endif +#endif + +/* GL_SGIX_pixel_texture */ + +#ifdef __GLEE_GL_SGIX_pixel_texture +#ifndef GLEE_C_DEFINED_glPixelTexGenSGIX +#define GLEE_C_DEFINED_glPixelTexGenSGIX + void __stdcall GLee_Lazy_glPixelTexGenSGIX(GLenum mode) {if (GLeeInit()) glPixelTexGenSGIX(mode);} + GLEEPFNGLPIXELTEXGENSGIXPROC GLeeFuncPtr_glPixelTexGenSGIX=GLee_Lazy_glPixelTexGenSGIX; +#endif +#endif + +/* GL_SGIS_texture4D */ + +#ifdef __GLEE_GL_SGIS_texture4D +#ifndef GLEE_C_DEFINED_glTexImage4DSGIS +#define GLEE_C_DEFINED_glTexImage4DSGIS + void __stdcall GLee_Lazy_glTexImage4DSGIS(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexImage4DSGIS(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels);} + GLEEPFNGLTEXIMAGE4DSGISPROC GLeeFuncPtr_glTexImage4DSGIS=GLee_Lazy_glTexImage4DSGIS; +#endif +#ifndef GLEE_C_DEFINED_glTexSubImage4DSGIS +#define GLEE_C_DEFINED_glTexSubImage4DSGIS + void __stdcall GLee_Lazy_glTexSubImage4DSGIS(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTexSubImage4DSGIS(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels);} + GLEEPFNGLTEXSUBIMAGE4DSGISPROC GLeeFuncPtr_glTexSubImage4DSGIS=GLee_Lazy_glTexSubImage4DSGIS; +#endif +#endif + +/* GL_SGI_texture_color_table */ + +#ifdef __GLEE_GL_SGI_texture_color_table +#endif + +/* GL_EXT_cmyka */ + +#ifdef __GLEE_GL_EXT_cmyka +#endif + +/* GL_EXT_texture_object */ + +#ifdef __GLEE_GL_EXT_texture_object +#ifndef GLEE_C_DEFINED_glAreTexturesResidentEXT +#define GLEE_C_DEFINED_glAreTexturesResidentEXT + GLboolean __stdcall GLee_Lazy_glAreTexturesResidentEXT(GLsizei n, const GLuint * textures, GLboolean * residences) {if (GLeeInit()) return glAreTexturesResidentEXT(n, textures, residences); return (GLboolean)0;} + GLEEPFNGLARETEXTURESRESIDENTEXTPROC GLeeFuncPtr_glAreTexturesResidentEXT=GLee_Lazy_glAreTexturesResidentEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindTextureEXT +#define GLEE_C_DEFINED_glBindTextureEXT + void __stdcall GLee_Lazy_glBindTextureEXT(GLenum target, GLuint texture) {if (GLeeInit()) glBindTextureEXT(target, texture);} + GLEEPFNGLBINDTEXTUREEXTPROC GLeeFuncPtr_glBindTextureEXT=GLee_Lazy_glBindTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glDeleteTexturesEXT +#define GLEE_C_DEFINED_glDeleteTexturesEXT + void __stdcall GLee_Lazy_glDeleteTexturesEXT(GLsizei n, const GLuint * textures) {if (GLeeInit()) glDeleteTexturesEXT(n, textures);} + GLEEPFNGLDELETETEXTURESEXTPROC GLeeFuncPtr_glDeleteTexturesEXT=GLee_Lazy_glDeleteTexturesEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenTexturesEXT +#define GLEE_C_DEFINED_glGenTexturesEXT + void __stdcall GLee_Lazy_glGenTexturesEXT(GLsizei n, GLuint * textures) {if (GLeeInit()) glGenTexturesEXT(n, textures);} + GLEEPFNGLGENTEXTURESEXTPROC GLeeFuncPtr_glGenTexturesEXT=GLee_Lazy_glGenTexturesEXT; +#endif +#ifndef GLEE_C_DEFINED_glIsTextureEXT +#define GLEE_C_DEFINED_glIsTextureEXT + GLboolean __stdcall GLee_Lazy_glIsTextureEXT(GLuint texture) {if (GLeeInit()) return glIsTextureEXT(texture); return (GLboolean)0;} + GLEEPFNGLISTEXTUREEXTPROC GLeeFuncPtr_glIsTextureEXT=GLee_Lazy_glIsTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glPrioritizeTexturesEXT +#define GLEE_C_DEFINED_glPrioritizeTexturesEXT + void __stdcall GLee_Lazy_glPrioritizeTexturesEXT(GLsizei n, const GLuint * textures, const GLclampf * priorities) {if (GLeeInit()) glPrioritizeTexturesEXT(n, textures, priorities);} + GLEEPFNGLPRIORITIZETEXTURESEXTPROC GLeeFuncPtr_glPrioritizeTexturesEXT=GLee_Lazy_glPrioritizeTexturesEXT; +#endif +#endif + +/* GL_SGIS_detail_texture */ + +#ifdef __GLEE_GL_SGIS_detail_texture +#ifndef GLEE_C_DEFINED_glDetailTexFuncSGIS +#define GLEE_C_DEFINED_glDetailTexFuncSGIS + void __stdcall GLee_Lazy_glDetailTexFuncSGIS(GLenum target, GLsizei n, const GLfloat * points) {if (GLeeInit()) glDetailTexFuncSGIS(target, n, points);} + GLEEPFNGLDETAILTEXFUNCSGISPROC GLeeFuncPtr_glDetailTexFuncSGIS=GLee_Lazy_glDetailTexFuncSGIS; +#endif +#ifndef GLEE_C_DEFINED_glGetDetailTexFuncSGIS +#define GLEE_C_DEFINED_glGetDetailTexFuncSGIS + void __stdcall GLee_Lazy_glGetDetailTexFuncSGIS(GLenum target, GLfloat * points) {if (GLeeInit()) glGetDetailTexFuncSGIS(target, points);} + GLEEPFNGLGETDETAILTEXFUNCSGISPROC GLeeFuncPtr_glGetDetailTexFuncSGIS=GLee_Lazy_glGetDetailTexFuncSGIS; +#endif +#endif + +/* GL_SGIS_sharpen_texture */ + +#ifdef __GLEE_GL_SGIS_sharpen_texture +#ifndef GLEE_C_DEFINED_glSharpenTexFuncSGIS +#define GLEE_C_DEFINED_glSharpenTexFuncSGIS + void __stdcall GLee_Lazy_glSharpenTexFuncSGIS(GLenum target, GLsizei n, const GLfloat * points) {if (GLeeInit()) glSharpenTexFuncSGIS(target, n, points);} + GLEEPFNGLSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glSharpenTexFuncSGIS=GLee_Lazy_glSharpenTexFuncSGIS; +#endif +#ifndef GLEE_C_DEFINED_glGetSharpenTexFuncSGIS +#define GLEE_C_DEFINED_glGetSharpenTexFuncSGIS + void __stdcall GLee_Lazy_glGetSharpenTexFuncSGIS(GLenum target, GLfloat * points) {if (GLeeInit()) glGetSharpenTexFuncSGIS(target, points);} + GLEEPFNGLGETSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glGetSharpenTexFuncSGIS=GLee_Lazy_glGetSharpenTexFuncSGIS; +#endif +#endif + +/* GL_EXT_packed_pixels */ + +#ifdef __GLEE_GL_EXT_packed_pixels +#endif + +/* GL_SGIS_texture_lod */ + +#ifdef __GLEE_GL_SGIS_texture_lod +#endif + +/* GL_SGIS_multisample */ + +#ifdef __GLEE_GL_SGIS_multisample +#ifndef GLEE_C_DEFINED_glSampleMaskSGIS +#define GLEE_C_DEFINED_glSampleMaskSGIS + void __stdcall GLee_Lazy_glSampleMaskSGIS(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleMaskSGIS(value, invert);} + GLEEPFNGLSAMPLEMASKSGISPROC GLeeFuncPtr_glSampleMaskSGIS=GLee_Lazy_glSampleMaskSGIS; +#endif +#ifndef GLEE_C_DEFINED_glSamplePatternSGIS +#define GLEE_C_DEFINED_glSamplePatternSGIS + void __stdcall GLee_Lazy_glSamplePatternSGIS(GLenum pattern) {if (GLeeInit()) glSamplePatternSGIS(pattern);} + GLEEPFNGLSAMPLEPATTERNSGISPROC GLeeFuncPtr_glSamplePatternSGIS=GLee_Lazy_glSamplePatternSGIS; +#endif +#endif + +/* GL_EXT_rescale_normal */ + +#ifdef __GLEE_GL_EXT_rescale_normal +#endif + +/* GL_EXT_vertex_array */ + +#ifdef __GLEE_GL_EXT_vertex_array +#ifndef GLEE_C_DEFINED_glArrayElementEXT +#define GLEE_C_DEFINED_glArrayElementEXT + void __stdcall GLee_Lazy_glArrayElementEXT(GLint i) {if (GLeeInit()) glArrayElementEXT(i);} + GLEEPFNGLARRAYELEMENTEXTPROC GLeeFuncPtr_glArrayElementEXT=GLee_Lazy_glArrayElementEXT; +#endif +#ifndef GLEE_C_DEFINED_glColorPointerEXT +#define GLEE_C_DEFINED_glColorPointerEXT + void __stdcall GLee_Lazy_glColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glColorPointerEXT(size, type, stride, count, pointer);} + GLEEPFNGLCOLORPOINTEREXTPROC GLeeFuncPtr_glColorPointerEXT=GLee_Lazy_glColorPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glDrawArraysEXT +#define GLEE_C_DEFINED_glDrawArraysEXT + void __stdcall GLee_Lazy_glDrawArraysEXT(GLenum mode, GLint first, GLsizei count) {if (GLeeInit()) glDrawArraysEXT(mode, first, count);} + GLEEPFNGLDRAWARRAYSEXTPROC GLeeFuncPtr_glDrawArraysEXT=GLee_Lazy_glDrawArraysEXT; +#endif +#ifndef GLEE_C_DEFINED_glEdgeFlagPointerEXT +#define GLEE_C_DEFINED_glEdgeFlagPointerEXT + void __stdcall GLee_Lazy_glEdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean * pointer) {if (GLeeInit()) glEdgeFlagPointerEXT(stride, count, pointer);} + GLEEPFNGLEDGEFLAGPOINTEREXTPROC GLeeFuncPtr_glEdgeFlagPointerEXT=GLee_Lazy_glEdgeFlagPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetPointervEXT +#define GLEE_C_DEFINED_glGetPointervEXT + void __stdcall GLee_Lazy_glGetPointervEXT(GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetPointervEXT(pname, params);} + GLEEPFNGLGETPOINTERVEXTPROC GLeeFuncPtr_glGetPointervEXT=GLee_Lazy_glGetPointervEXT; +#endif +#ifndef GLEE_C_DEFINED_glIndexPointerEXT +#define GLEE_C_DEFINED_glIndexPointerEXT + void __stdcall GLee_Lazy_glIndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glIndexPointerEXT(type, stride, count, pointer);} + GLEEPFNGLINDEXPOINTEREXTPROC GLeeFuncPtr_glIndexPointerEXT=GLee_Lazy_glIndexPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glNormalPointerEXT +#define GLEE_C_DEFINED_glNormalPointerEXT + void __stdcall GLee_Lazy_glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glNormalPointerEXT(type, stride, count, pointer);} + GLEEPFNGLNORMALPOINTEREXTPROC GLeeFuncPtr_glNormalPointerEXT=GLee_Lazy_glNormalPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glTexCoordPointerEXT +#define GLEE_C_DEFINED_glTexCoordPointerEXT + void __stdcall GLee_Lazy_glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glTexCoordPointerEXT(size, type, stride, count, pointer);} + GLEEPFNGLTEXCOORDPOINTEREXTPROC GLeeFuncPtr_glTexCoordPointerEXT=GLee_Lazy_glTexCoordPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexPointerEXT +#define GLEE_C_DEFINED_glVertexPointerEXT + void __stdcall GLee_Lazy_glVertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer) {if (GLeeInit()) glVertexPointerEXT(size, type, stride, count, pointer);} + GLEEPFNGLVERTEXPOINTEREXTPROC GLeeFuncPtr_glVertexPointerEXT=GLee_Lazy_glVertexPointerEXT; +#endif +#endif + +/* GL_EXT_misc_attribute */ + +#ifdef __GLEE_GL_EXT_misc_attribute +#endif + +/* GL_SGIS_generate_mipmap */ + +#ifdef __GLEE_GL_SGIS_generate_mipmap +#endif + +/* GL_SGIX_clipmap */ + +#ifdef __GLEE_GL_SGIX_clipmap +#endif + +/* GL_SGIX_shadow */ + +#ifdef __GLEE_GL_SGIX_shadow +#endif + +/* GL_SGIS_texture_edge_clamp */ + +#ifdef __GLEE_GL_SGIS_texture_edge_clamp +#endif + +/* GL_SGIS_texture_border_clamp */ + +#ifdef __GLEE_GL_SGIS_texture_border_clamp +#endif + +/* GL_EXT_blend_minmax */ + +#ifdef __GLEE_GL_EXT_blend_minmax +#ifndef GLEE_C_DEFINED_glBlendEquationEXT +#define GLEE_C_DEFINED_glBlendEquationEXT + void __stdcall GLee_Lazy_glBlendEquationEXT(GLenum mode) {if (GLeeInit()) glBlendEquationEXT(mode);} + GLEEPFNGLBLENDEQUATIONEXTPROC GLeeFuncPtr_glBlendEquationEXT=GLee_Lazy_glBlendEquationEXT; +#endif +#endif + +/* GL_EXT_blend_subtract */ + +#ifdef __GLEE_GL_EXT_blend_subtract +#endif + +/* GL_EXT_blend_logic_op */ + +#ifdef __GLEE_GL_EXT_blend_logic_op +#endif + +/* GL_SGIX_interlace */ + +#ifdef __GLEE_GL_SGIX_interlace +#endif + +/* GL_SGIX_pixel_tiles */ + +#ifdef __GLEE_GL_SGIX_pixel_tiles +#endif + +/* GL_SGIS_texture_select */ + +#ifdef __GLEE_GL_SGIS_texture_select +#endif + +/* GL_SGIX_sprite */ + +#ifdef __GLEE_GL_SGIX_sprite +#ifndef GLEE_C_DEFINED_glSpriteParameterfSGIX +#define GLEE_C_DEFINED_glSpriteParameterfSGIX + void __stdcall GLee_Lazy_glSpriteParameterfSGIX(GLenum pname, GLfloat param) {if (GLeeInit()) glSpriteParameterfSGIX(pname, param);} + GLEEPFNGLSPRITEPARAMETERFSGIXPROC GLeeFuncPtr_glSpriteParameterfSGIX=GLee_Lazy_glSpriteParameterfSGIX; +#endif +#ifndef GLEE_C_DEFINED_glSpriteParameterfvSGIX +#define GLEE_C_DEFINED_glSpriteParameterfvSGIX + void __stdcall GLee_Lazy_glSpriteParameterfvSGIX(GLenum pname, const GLfloat * params) {if (GLeeInit()) glSpriteParameterfvSGIX(pname, params);} + GLEEPFNGLSPRITEPARAMETERFVSGIXPROC GLeeFuncPtr_glSpriteParameterfvSGIX=GLee_Lazy_glSpriteParameterfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glSpriteParameteriSGIX +#define GLEE_C_DEFINED_glSpriteParameteriSGIX + void __stdcall GLee_Lazy_glSpriteParameteriSGIX(GLenum pname, GLint param) {if (GLeeInit()) glSpriteParameteriSGIX(pname, param);} + GLEEPFNGLSPRITEPARAMETERISGIXPROC GLeeFuncPtr_glSpriteParameteriSGIX=GLee_Lazy_glSpriteParameteriSGIX; +#endif +#ifndef GLEE_C_DEFINED_glSpriteParameterivSGIX +#define GLEE_C_DEFINED_glSpriteParameterivSGIX + void __stdcall GLee_Lazy_glSpriteParameterivSGIX(GLenum pname, const GLint * params) {if (GLeeInit()) glSpriteParameterivSGIX(pname, params);} + GLEEPFNGLSPRITEPARAMETERIVSGIXPROC GLeeFuncPtr_glSpriteParameterivSGIX=GLee_Lazy_glSpriteParameterivSGIX; +#endif +#endif + +/* GL_SGIX_texture_multi_buffer */ + +#ifdef __GLEE_GL_SGIX_texture_multi_buffer +#endif + +/* GL_EXT_point_parameters */ + +#ifdef __GLEE_GL_EXT_point_parameters +#ifndef GLEE_C_DEFINED_glPointParameterfEXT +#define GLEE_C_DEFINED_glPointParameterfEXT + void __stdcall GLee_Lazy_glPointParameterfEXT(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterfEXT(pname, param);} + GLEEPFNGLPOINTPARAMETERFEXTPROC GLeeFuncPtr_glPointParameterfEXT=GLee_Lazy_glPointParameterfEXT; +#endif +#ifndef GLEE_C_DEFINED_glPointParameterfvEXT +#define GLEE_C_DEFINED_glPointParameterfvEXT + void __stdcall GLee_Lazy_glPointParameterfvEXT(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfvEXT(pname, params);} + GLEEPFNGLPOINTPARAMETERFVEXTPROC GLeeFuncPtr_glPointParameterfvEXT=GLee_Lazy_glPointParameterfvEXT; +#endif +#endif + +/* GL_SGIS_point_parameters */ + +#ifdef __GLEE_GL_SGIS_point_parameters +#ifndef GLEE_C_DEFINED_glPointParameterfSGIS +#define GLEE_C_DEFINED_glPointParameterfSGIS + void __stdcall GLee_Lazy_glPointParameterfSGIS(GLenum pname, GLfloat param) {if (GLeeInit()) glPointParameterfSGIS(pname, param);} + GLEEPFNGLPOINTPARAMETERFSGISPROC GLeeFuncPtr_glPointParameterfSGIS=GLee_Lazy_glPointParameterfSGIS; +#endif +#ifndef GLEE_C_DEFINED_glPointParameterfvSGIS +#define GLEE_C_DEFINED_glPointParameterfvSGIS + void __stdcall GLee_Lazy_glPointParameterfvSGIS(GLenum pname, const GLfloat * params) {if (GLeeInit()) glPointParameterfvSGIS(pname, params);} + GLEEPFNGLPOINTPARAMETERFVSGISPROC GLeeFuncPtr_glPointParameterfvSGIS=GLee_Lazy_glPointParameterfvSGIS; +#endif +#endif + +/* GL_SGIX_instruments */ + +#ifdef __GLEE_GL_SGIX_instruments +#ifndef GLEE_C_DEFINED_glGetInstrumentsSGIX +#define GLEE_C_DEFINED_glGetInstrumentsSGIX + GLint __stdcall GLee_Lazy_glGetInstrumentsSGIX(void) {if (GLeeInit()) return glGetInstrumentsSGIX(); return (GLint)0;} + GLEEPFNGLGETINSTRUMENTSSGIXPROC GLeeFuncPtr_glGetInstrumentsSGIX=GLee_Lazy_glGetInstrumentsSGIX; +#endif +#ifndef GLEE_C_DEFINED_glInstrumentsBufferSGIX +#define GLEE_C_DEFINED_glInstrumentsBufferSGIX + void __stdcall GLee_Lazy_glInstrumentsBufferSGIX(GLsizei size, GLint * buffer) {if (GLeeInit()) glInstrumentsBufferSGIX(size, buffer);} + GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC GLeeFuncPtr_glInstrumentsBufferSGIX=GLee_Lazy_glInstrumentsBufferSGIX; +#endif +#ifndef GLEE_C_DEFINED_glPollInstrumentsSGIX +#define GLEE_C_DEFINED_glPollInstrumentsSGIX + GLint __stdcall GLee_Lazy_glPollInstrumentsSGIX(GLint * marker_p) {if (GLeeInit()) return glPollInstrumentsSGIX(marker_p); return (GLint)0;} + GLEEPFNGLPOLLINSTRUMENTSSGIXPROC GLeeFuncPtr_glPollInstrumentsSGIX=GLee_Lazy_glPollInstrumentsSGIX; +#endif +#ifndef GLEE_C_DEFINED_glReadInstrumentsSGIX +#define GLEE_C_DEFINED_glReadInstrumentsSGIX + void __stdcall GLee_Lazy_glReadInstrumentsSGIX(GLint marker) {if (GLeeInit()) glReadInstrumentsSGIX(marker);} + GLEEPFNGLREADINSTRUMENTSSGIXPROC GLeeFuncPtr_glReadInstrumentsSGIX=GLee_Lazy_glReadInstrumentsSGIX; +#endif +#ifndef GLEE_C_DEFINED_glStartInstrumentsSGIX +#define GLEE_C_DEFINED_glStartInstrumentsSGIX + void __stdcall GLee_Lazy_glStartInstrumentsSGIX(void) {if (GLeeInit()) glStartInstrumentsSGIX();} + GLEEPFNGLSTARTINSTRUMENTSSGIXPROC GLeeFuncPtr_glStartInstrumentsSGIX=GLee_Lazy_glStartInstrumentsSGIX; +#endif +#ifndef GLEE_C_DEFINED_glStopInstrumentsSGIX +#define GLEE_C_DEFINED_glStopInstrumentsSGIX + void __stdcall GLee_Lazy_glStopInstrumentsSGIX(GLint marker) {if (GLeeInit()) glStopInstrumentsSGIX(marker);} + GLEEPFNGLSTOPINSTRUMENTSSGIXPROC GLeeFuncPtr_glStopInstrumentsSGIX=GLee_Lazy_glStopInstrumentsSGIX; +#endif +#endif + +/* GL_SGIX_texture_scale_bias */ + +#ifdef __GLEE_GL_SGIX_texture_scale_bias +#endif + +/* GL_SGIX_framezoom */ + +#ifdef __GLEE_GL_SGIX_framezoom +#ifndef GLEE_C_DEFINED_glFrameZoomSGIX +#define GLEE_C_DEFINED_glFrameZoomSGIX + void __stdcall GLee_Lazy_glFrameZoomSGIX(GLint factor) {if (GLeeInit()) glFrameZoomSGIX(factor);} + GLEEPFNGLFRAMEZOOMSGIXPROC GLeeFuncPtr_glFrameZoomSGIX=GLee_Lazy_glFrameZoomSGIX; +#endif +#endif + +/* GL_SGIX_tag_sample_buffer */ + +#ifdef __GLEE_GL_SGIX_tag_sample_buffer +#ifndef GLEE_C_DEFINED_glTagSampleBufferSGIX +#define GLEE_C_DEFINED_glTagSampleBufferSGIX + void __stdcall GLee_Lazy_glTagSampleBufferSGIX(void) {if (GLeeInit()) glTagSampleBufferSGIX();} + GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC GLeeFuncPtr_glTagSampleBufferSGIX=GLee_Lazy_glTagSampleBufferSGIX; +#endif +#endif + +/* GL_FfdMaskSGIX */ + +#ifdef __GLEE_GL_FfdMaskSGIX +#endif + +/* GL_SGIX_polynomial_ffd */ + +#ifdef __GLEE_GL_SGIX_polynomial_ffd +#ifndef GLEE_C_DEFINED_glDeformationMap3dSGIX +#define GLEE_C_DEFINED_glDeformationMap3dSGIX + void __stdcall GLee_Lazy_glDeformationMap3dSGIX(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points) {if (GLeeInit()) glDeformationMap3dSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points);} + GLEEPFNGLDEFORMATIONMAP3DSGIXPROC GLeeFuncPtr_glDeformationMap3dSGIX=GLee_Lazy_glDeformationMap3dSGIX; +#endif +#ifndef GLEE_C_DEFINED_glDeformationMap3fSGIX +#define GLEE_C_DEFINED_glDeformationMap3fSGIX + void __stdcall GLee_Lazy_glDeformationMap3fSGIX(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points) {if (GLeeInit()) glDeformationMap3fSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points);} + GLEEPFNGLDEFORMATIONMAP3FSGIXPROC GLeeFuncPtr_glDeformationMap3fSGIX=GLee_Lazy_glDeformationMap3fSGIX; +#endif +#ifndef GLEE_C_DEFINED_glDeformSGIX +#define GLEE_C_DEFINED_glDeformSGIX + void __stdcall GLee_Lazy_glDeformSGIX(GLbitfield mask) {if (GLeeInit()) glDeformSGIX(mask);} + GLEEPFNGLDEFORMSGIXPROC GLeeFuncPtr_glDeformSGIX=GLee_Lazy_glDeformSGIX; +#endif +#ifndef GLEE_C_DEFINED_glLoadIdentityDeformationMapSGIX +#define GLEE_C_DEFINED_glLoadIdentityDeformationMapSGIX + void __stdcall GLee_Lazy_glLoadIdentityDeformationMapSGIX(GLbitfield mask) {if (GLeeInit()) glLoadIdentityDeformationMapSGIX(mask);} + GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC GLeeFuncPtr_glLoadIdentityDeformationMapSGIX=GLee_Lazy_glLoadIdentityDeformationMapSGIX; +#endif +#endif + +/* GL_SGIX_reference_plane */ + +#ifdef __GLEE_GL_SGIX_reference_plane +#ifndef GLEE_C_DEFINED_glReferencePlaneSGIX +#define GLEE_C_DEFINED_glReferencePlaneSGIX + void __stdcall GLee_Lazy_glReferencePlaneSGIX(const GLdouble * equation) {if (GLeeInit()) glReferencePlaneSGIX(equation);} + GLEEPFNGLREFERENCEPLANESGIXPROC GLeeFuncPtr_glReferencePlaneSGIX=GLee_Lazy_glReferencePlaneSGIX; +#endif +#endif + +/* GL_SGIX_flush_raster */ + +#ifdef __GLEE_GL_SGIX_flush_raster +#ifndef GLEE_C_DEFINED_glFlushRasterSGIX +#define GLEE_C_DEFINED_glFlushRasterSGIX + void __stdcall GLee_Lazy_glFlushRasterSGIX(void) {if (GLeeInit()) glFlushRasterSGIX();} + GLEEPFNGLFLUSHRASTERSGIXPROC GLeeFuncPtr_glFlushRasterSGIX=GLee_Lazy_glFlushRasterSGIX; +#endif +#endif + +/* GL_SGIX_depth_texture */ + +#ifdef __GLEE_GL_SGIX_depth_texture +#endif + +/* GL_SGIS_fog_function */ + +#ifdef __GLEE_GL_SGIS_fog_function +#ifndef GLEE_C_DEFINED_glFogFuncSGIS +#define GLEE_C_DEFINED_glFogFuncSGIS + void __stdcall GLee_Lazy_glFogFuncSGIS(GLsizei n, const GLfloat * points) {if (GLeeInit()) glFogFuncSGIS(n, points);} + GLEEPFNGLFOGFUNCSGISPROC GLeeFuncPtr_glFogFuncSGIS=GLee_Lazy_glFogFuncSGIS; +#endif +#ifndef GLEE_C_DEFINED_glGetFogFuncSGIS +#define GLEE_C_DEFINED_glGetFogFuncSGIS + void __stdcall GLee_Lazy_glGetFogFuncSGIS(GLfloat * points) {if (GLeeInit()) glGetFogFuncSGIS(points);} + GLEEPFNGLGETFOGFUNCSGISPROC GLeeFuncPtr_glGetFogFuncSGIS=GLee_Lazy_glGetFogFuncSGIS; +#endif +#endif + +/* GL_SGIX_fog_offset */ + +#ifdef __GLEE_GL_SGIX_fog_offset +#endif + +/* GL_HP_image_transform */ + +#ifdef __GLEE_GL_HP_image_transform +#ifndef GLEE_C_DEFINED_glImageTransformParameteriHP +#define GLEE_C_DEFINED_glImageTransformParameteriHP + void __stdcall GLee_Lazy_glImageTransformParameteriHP(GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glImageTransformParameteriHP(target, pname, param);} + GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC GLeeFuncPtr_glImageTransformParameteriHP=GLee_Lazy_glImageTransformParameteriHP; +#endif +#ifndef GLEE_C_DEFINED_glImageTransformParameterfHP +#define GLEE_C_DEFINED_glImageTransformParameterfHP + void __stdcall GLee_Lazy_glImageTransformParameterfHP(GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glImageTransformParameterfHP(target, pname, param);} + GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC GLeeFuncPtr_glImageTransformParameterfHP=GLee_Lazy_glImageTransformParameterfHP; +#endif +#ifndef GLEE_C_DEFINED_glImageTransformParameterivHP +#define GLEE_C_DEFINED_glImageTransformParameterivHP + void __stdcall GLee_Lazy_glImageTransformParameterivHP(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glImageTransformParameterivHP(target, pname, params);} + GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glImageTransformParameterivHP=GLee_Lazy_glImageTransformParameterivHP; +#endif +#ifndef GLEE_C_DEFINED_glImageTransformParameterfvHP +#define GLEE_C_DEFINED_glImageTransformParameterfvHP + void __stdcall GLee_Lazy_glImageTransformParameterfvHP(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glImageTransformParameterfvHP(target, pname, params);} + GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glImageTransformParameterfvHP=GLee_Lazy_glImageTransformParameterfvHP; +#endif +#ifndef GLEE_C_DEFINED_glGetImageTransformParameterivHP +#define GLEE_C_DEFINED_glGetImageTransformParameterivHP + void __stdcall GLee_Lazy_glGetImageTransformParameterivHP(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetImageTransformParameterivHP(target, pname, params);} + GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glGetImageTransformParameterivHP=GLee_Lazy_glGetImageTransformParameterivHP; +#endif +#ifndef GLEE_C_DEFINED_glGetImageTransformParameterfvHP +#define GLEE_C_DEFINED_glGetImageTransformParameterfvHP + void __stdcall GLee_Lazy_glGetImageTransformParameterfvHP(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetImageTransformParameterfvHP(target, pname, params);} + GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glGetImageTransformParameterfvHP=GLee_Lazy_glGetImageTransformParameterfvHP; +#endif +#endif + +/* GL_HP_convolution_border_modes */ + +#ifdef __GLEE_GL_HP_convolution_border_modes +#endif + +/* GL_INGR_palette_buffer */ + +#ifdef __GLEE_GL_INGR_palette_buffer +#endif + +/* GL_SGIX_texture_add_env */ + +#ifdef __GLEE_GL_SGIX_texture_add_env +#endif + +/* GL_EXT_color_subtable */ + +#ifdef __GLEE_GL_EXT_color_subtable +#ifndef GLEE_C_DEFINED_glColorSubTableEXT +#define GLEE_C_DEFINED_glColorSubTableEXT + void __stdcall GLee_Lazy_glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data) {if (GLeeInit()) glColorSubTableEXT(target, start, count, format, type, data);} + GLEEPFNGLCOLORSUBTABLEEXTPROC GLeeFuncPtr_glColorSubTableEXT=GLee_Lazy_glColorSubTableEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyColorSubTableEXT +#define GLEE_C_DEFINED_glCopyColorSubTableEXT + void __stdcall GLee_Lazy_glCopyColorSubTableEXT(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyColorSubTableEXT(target, start, x, y, width);} + GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC GLeeFuncPtr_glCopyColorSubTableEXT=GLee_Lazy_glCopyColorSubTableEXT; +#endif +#endif + +/* GL_PGI_vertex_hints */ + +#ifdef __GLEE_GL_PGI_vertex_hints +#endif + +/* GL_PGI_misc_hints */ + +#ifdef __GLEE_GL_PGI_misc_hints +#ifndef GLEE_C_DEFINED_glHintPGI +#define GLEE_C_DEFINED_glHintPGI + void __stdcall GLee_Lazy_glHintPGI(GLenum target, GLint mode) {if (GLeeInit()) glHintPGI(target, mode);} + GLEEPFNGLHINTPGIPROC GLeeFuncPtr_glHintPGI=GLee_Lazy_glHintPGI; +#endif +#endif + +/* GL_EXT_paletted_texture */ + +#ifdef __GLEE_GL_EXT_paletted_texture +#ifndef GLEE_C_DEFINED_glColorTableEXT +#define GLEE_C_DEFINED_glColorTableEXT + void __stdcall GLee_Lazy_glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table) {if (GLeeInit()) glColorTableEXT(target, internalFormat, width, format, type, table);} + GLEEPFNGLCOLORTABLEEXTPROC GLeeFuncPtr_glColorTableEXT=GLee_Lazy_glColorTableEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableEXT +#define GLEE_C_DEFINED_glGetColorTableEXT + void __stdcall GLee_Lazy_glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid * data) {if (GLeeInit()) glGetColorTableEXT(target, format, type, data);} + GLEEPFNGLGETCOLORTABLEEXTPROC GLeeFuncPtr_glGetColorTableEXT=GLee_Lazy_glGetColorTableEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableParameterivEXT +#define GLEE_C_DEFINED_glGetColorTableParameterivEXT + void __stdcall GLee_Lazy_glGetColorTableParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetColorTableParameterivEXT(target, pname, params);} + GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLeeFuncPtr_glGetColorTableParameterivEXT=GLee_Lazy_glGetColorTableParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetColorTableParameterfvEXT +#define GLEE_C_DEFINED_glGetColorTableParameterfvEXT + void __stdcall GLee_Lazy_glGetColorTableParameterfvEXT(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetColorTableParameterfvEXT(target, pname, params);} + GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLeeFuncPtr_glGetColorTableParameterfvEXT=GLee_Lazy_glGetColorTableParameterfvEXT; +#endif +#endif + +/* GL_EXT_clip_volume_hint */ + +#ifdef __GLEE_GL_EXT_clip_volume_hint +#endif + +/* GL_SGIX_list_priority */ + +#ifdef __GLEE_GL_SGIX_list_priority +#ifndef GLEE_C_DEFINED_glGetListParameterfvSGIX +#define GLEE_C_DEFINED_glGetListParameterfvSGIX + void __stdcall GLee_Lazy_glGetListParameterfvSGIX(GLuint list, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetListParameterfvSGIX(list, pname, params);} + GLEEPFNGLGETLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glGetListParameterfvSGIX=GLee_Lazy_glGetListParameterfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glGetListParameterivSGIX +#define GLEE_C_DEFINED_glGetListParameterivSGIX + void __stdcall GLee_Lazy_glGetListParameterivSGIX(GLuint list, GLenum pname, GLint * params) {if (GLeeInit()) glGetListParameterivSGIX(list, pname, params);} + GLEEPFNGLGETLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glGetListParameterivSGIX=GLee_Lazy_glGetListParameterivSGIX; +#endif +#ifndef GLEE_C_DEFINED_glListParameterfSGIX +#define GLEE_C_DEFINED_glListParameterfSGIX + void __stdcall GLee_Lazy_glListParameterfSGIX(GLuint list, GLenum pname, GLfloat param) {if (GLeeInit()) glListParameterfSGIX(list, pname, param);} + GLEEPFNGLLISTPARAMETERFSGIXPROC GLeeFuncPtr_glListParameterfSGIX=GLee_Lazy_glListParameterfSGIX; +#endif +#ifndef GLEE_C_DEFINED_glListParameterfvSGIX +#define GLEE_C_DEFINED_glListParameterfvSGIX + void __stdcall GLee_Lazy_glListParameterfvSGIX(GLuint list, GLenum pname, const GLfloat * params) {if (GLeeInit()) glListParameterfvSGIX(list, pname, params);} + GLEEPFNGLLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glListParameterfvSGIX=GLee_Lazy_glListParameterfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glListParameteriSGIX +#define GLEE_C_DEFINED_glListParameteriSGIX + void __stdcall GLee_Lazy_glListParameteriSGIX(GLuint list, GLenum pname, GLint param) {if (GLeeInit()) glListParameteriSGIX(list, pname, param);} + GLEEPFNGLLISTPARAMETERISGIXPROC GLeeFuncPtr_glListParameteriSGIX=GLee_Lazy_glListParameteriSGIX; +#endif +#ifndef GLEE_C_DEFINED_glListParameterivSGIX +#define GLEE_C_DEFINED_glListParameterivSGIX + void __stdcall GLee_Lazy_glListParameterivSGIX(GLuint list, GLenum pname, const GLint * params) {if (GLeeInit()) glListParameterivSGIX(list, pname, params);} + GLEEPFNGLLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glListParameterivSGIX=GLee_Lazy_glListParameterivSGIX; +#endif +#endif + +/* GL_SGIX_ir_instrument1 */ + +#ifdef __GLEE_GL_SGIX_ir_instrument1 +#endif + +/* GL_SGIX_calligraphic_fragment */ + +#ifdef __GLEE_GL_SGIX_calligraphic_fragment +#endif + +/* GL_SGIX_texture_lod_bias */ + +#ifdef __GLEE_GL_SGIX_texture_lod_bias +#endif + +/* GL_SGIX_shadow_ambient */ + +#ifdef __GLEE_GL_SGIX_shadow_ambient +#endif + +/* GL_EXT_index_texture */ + +#ifdef __GLEE_GL_EXT_index_texture +#endif + +/* GL_EXT_index_material */ + +#ifdef __GLEE_GL_EXT_index_material +#ifndef GLEE_C_DEFINED_glIndexMaterialEXT +#define GLEE_C_DEFINED_glIndexMaterialEXT + void __stdcall GLee_Lazy_glIndexMaterialEXT(GLenum face, GLenum mode) {if (GLeeInit()) glIndexMaterialEXT(face, mode);} + GLEEPFNGLINDEXMATERIALEXTPROC GLeeFuncPtr_glIndexMaterialEXT=GLee_Lazy_glIndexMaterialEXT; +#endif +#endif + +/* GL_EXT_index_func */ + +#ifdef __GLEE_GL_EXT_index_func +#ifndef GLEE_C_DEFINED_glIndexFuncEXT +#define GLEE_C_DEFINED_glIndexFuncEXT + void __stdcall GLee_Lazy_glIndexFuncEXT(GLenum func, GLclampf ref) {if (GLeeInit()) glIndexFuncEXT(func, ref);} + GLEEPFNGLINDEXFUNCEXTPROC GLeeFuncPtr_glIndexFuncEXT=GLee_Lazy_glIndexFuncEXT; +#endif +#endif + +/* GL_EXT_index_array_formats */ + +#ifdef __GLEE_GL_EXT_index_array_formats +#endif + +/* GL_EXT_compiled_vertex_array */ + +#ifdef __GLEE_GL_EXT_compiled_vertex_array +#ifndef GLEE_C_DEFINED_glLockArraysEXT +#define GLEE_C_DEFINED_glLockArraysEXT + void __stdcall GLee_Lazy_glLockArraysEXT(GLint first, GLsizei count) {if (GLeeInit()) glLockArraysEXT(first, count);} + GLEEPFNGLLOCKARRAYSEXTPROC GLeeFuncPtr_glLockArraysEXT=GLee_Lazy_glLockArraysEXT; +#endif +#ifndef GLEE_C_DEFINED_glUnlockArraysEXT +#define GLEE_C_DEFINED_glUnlockArraysEXT + void __stdcall GLee_Lazy_glUnlockArraysEXT(void) {if (GLeeInit()) glUnlockArraysEXT();} + GLEEPFNGLUNLOCKARRAYSEXTPROC GLeeFuncPtr_glUnlockArraysEXT=GLee_Lazy_glUnlockArraysEXT; +#endif +#endif + +/* GL_EXT_cull_vertex */ + +#ifdef __GLEE_GL_EXT_cull_vertex +#ifndef GLEE_C_DEFINED_glCullParameterdvEXT +#define GLEE_C_DEFINED_glCullParameterdvEXT + void __stdcall GLee_Lazy_glCullParameterdvEXT(GLenum pname, GLdouble * params) {if (GLeeInit()) glCullParameterdvEXT(pname, params);} + GLEEPFNGLCULLPARAMETERDVEXTPROC GLeeFuncPtr_glCullParameterdvEXT=GLee_Lazy_glCullParameterdvEXT; +#endif +#ifndef GLEE_C_DEFINED_glCullParameterfvEXT +#define GLEE_C_DEFINED_glCullParameterfvEXT + void __stdcall GLee_Lazy_glCullParameterfvEXT(GLenum pname, GLfloat * params) {if (GLeeInit()) glCullParameterfvEXT(pname, params);} + GLEEPFNGLCULLPARAMETERFVEXTPROC GLeeFuncPtr_glCullParameterfvEXT=GLee_Lazy_glCullParameterfvEXT; +#endif +#endif + +/* GL_SGIX_ycrcb */ + +#ifdef __GLEE_GL_SGIX_ycrcb +#endif + +/* GL_SGIX_fragment_lighting */ + +#ifdef __GLEE_GL_SGIX_fragment_lighting +#ifndef GLEE_C_DEFINED_glFragmentColorMaterialSGIX +#define GLEE_C_DEFINED_glFragmentColorMaterialSGIX + void __stdcall GLee_Lazy_glFragmentColorMaterialSGIX(GLenum face, GLenum mode) {if (GLeeInit()) glFragmentColorMaterialSGIX(face, mode);} + GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC GLeeFuncPtr_glFragmentColorMaterialSGIX=GLee_Lazy_glFragmentColorMaterialSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightfSGIX +#define GLEE_C_DEFINED_glFragmentLightfSGIX + void __stdcall GLee_Lazy_glFragmentLightfSGIX(GLenum light, GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightfSGIX(light, pname, param);} + GLEEPFNGLFRAGMENTLIGHTFSGIXPROC GLeeFuncPtr_glFragmentLightfSGIX=GLee_Lazy_glFragmentLightfSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightfvSGIX +#define GLEE_C_DEFINED_glFragmentLightfvSGIX + void __stdcall GLee_Lazy_glFragmentLightfvSGIX(GLenum light, GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentLightfvSGIX(light, pname, params);} + GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glFragmentLightfvSGIX=GLee_Lazy_glFragmentLightfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightiSGIX +#define GLEE_C_DEFINED_glFragmentLightiSGIX + void __stdcall GLee_Lazy_glFragmentLightiSGIX(GLenum light, GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightiSGIX(light, pname, param);} + GLEEPFNGLFRAGMENTLIGHTISGIXPROC GLeeFuncPtr_glFragmentLightiSGIX=GLee_Lazy_glFragmentLightiSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightivSGIX +#define GLEE_C_DEFINED_glFragmentLightivSGIX + void __stdcall GLee_Lazy_glFragmentLightivSGIX(GLenum light, GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentLightivSGIX(light, pname, params);} + GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glFragmentLightivSGIX=GLee_Lazy_glFragmentLightivSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModelfSGIX +#define GLEE_C_DEFINED_glFragmentLightModelfSGIX + void __stdcall GLee_Lazy_glFragmentLightModelfSGIX(GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightModelfSGIX(pname, param);} + GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC GLeeFuncPtr_glFragmentLightModelfSGIX=GLee_Lazy_glFragmentLightModelfSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModelfvSGIX +#define GLEE_C_DEFINED_glFragmentLightModelfvSGIX + void __stdcall GLee_Lazy_glFragmentLightModelfvSGIX(GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentLightModelfvSGIX(pname, params);} + GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC GLeeFuncPtr_glFragmentLightModelfvSGIX=GLee_Lazy_glFragmentLightModelfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModeliSGIX +#define GLEE_C_DEFINED_glFragmentLightModeliSGIX + void __stdcall GLee_Lazy_glFragmentLightModeliSGIX(GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightModeliSGIX(pname, param);} + GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC GLeeFuncPtr_glFragmentLightModeliSGIX=GLee_Lazy_glFragmentLightModeliSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModelivSGIX +#define GLEE_C_DEFINED_glFragmentLightModelivSGIX + void __stdcall GLee_Lazy_glFragmentLightModelivSGIX(GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentLightModelivSGIX(pname, params);} + GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC GLeeFuncPtr_glFragmentLightModelivSGIX=GLee_Lazy_glFragmentLightModelivSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialfSGIX +#define GLEE_C_DEFINED_glFragmentMaterialfSGIX + void __stdcall GLee_Lazy_glFragmentMaterialfSGIX(GLenum face, GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentMaterialfSGIX(face, pname, param);} + GLEEPFNGLFRAGMENTMATERIALFSGIXPROC GLeeFuncPtr_glFragmentMaterialfSGIX=GLee_Lazy_glFragmentMaterialfSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialfvSGIX +#define GLEE_C_DEFINED_glFragmentMaterialfvSGIX + void __stdcall GLee_Lazy_glFragmentMaterialfvSGIX(GLenum face, GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentMaterialfvSGIX(face, pname, params);} + GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glFragmentMaterialfvSGIX=GLee_Lazy_glFragmentMaterialfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialiSGIX +#define GLEE_C_DEFINED_glFragmentMaterialiSGIX + void __stdcall GLee_Lazy_glFragmentMaterialiSGIX(GLenum face, GLenum pname, GLint param) {if (GLeeInit()) glFragmentMaterialiSGIX(face, pname, param);} + GLEEPFNGLFRAGMENTMATERIALISGIXPROC GLeeFuncPtr_glFragmentMaterialiSGIX=GLee_Lazy_glFragmentMaterialiSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialivSGIX +#define GLEE_C_DEFINED_glFragmentMaterialivSGIX + void __stdcall GLee_Lazy_glFragmentMaterialivSGIX(GLenum face, GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentMaterialivSGIX(face, pname, params);} + GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glFragmentMaterialivSGIX=GLee_Lazy_glFragmentMaterialivSGIX; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentLightfvSGIX +#define GLEE_C_DEFINED_glGetFragmentLightfvSGIX + void __stdcall GLee_Lazy_glGetFragmentLightfvSGIX(GLenum light, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFragmentLightfvSGIX(light, pname, params);} + GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glGetFragmentLightfvSGIX=GLee_Lazy_glGetFragmentLightfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentLightivSGIX +#define GLEE_C_DEFINED_glGetFragmentLightivSGIX + void __stdcall GLee_Lazy_glGetFragmentLightivSGIX(GLenum light, GLenum pname, GLint * params) {if (GLeeInit()) glGetFragmentLightivSGIX(light, pname, params);} + GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glGetFragmentLightivSGIX=GLee_Lazy_glGetFragmentLightivSGIX; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentMaterialfvSGIX +#define GLEE_C_DEFINED_glGetFragmentMaterialfvSGIX + void __stdcall GLee_Lazy_glGetFragmentMaterialfvSGIX(GLenum face, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFragmentMaterialfvSGIX(face, pname, params);} + GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialfvSGIX=GLee_Lazy_glGetFragmentMaterialfvSGIX; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentMaterialivSGIX +#define GLEE_C_DEFINED_glGetFragmentMaterialivSGIX + void __stdcall GLee_Lazy_glGetFragmentMaterialivSGIX(GLenum face, GLenum pname, GLint * params) {if (GLeeInit()) glGetFragmentMaterialivSGIX(face, pname, params);} + GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialivSGIX=GLee_Lazy_glGetFragmentMaterialivSGIX; +#endif +#ifndef GLEE_C_DEFINED_glLightEnviSGIX +#define GLEE_C_DEFINED_glLightEnviSGIX + void __stdcall GLee_Lazy_glLightEnviSGIX(GLenum pname, GLint param) {if (GLeeInit()) glLightEnviSGIX(pname, param);} + GLEEPFNGLLIGHTENVISGIXPROC GLeeFuncPtr_glLightEnviSGIX=GLee_Lazy_glLightEnviSGIX; +#endif +#endif + +/* GL_IBM_rasterpos_clip */ + +#ifdef __GLEE_GL_IBM_rasterpos_clip +#endif + +/* GL_HP_texture_lighting */ + +#ifdef __GLEE_GL_HP_texture_lighting +#endif + +/* GL_EXT_draw_range_elements */ + +#ifdef __GLEE_GL_EXT_draw_range_elements +#ifndef GLEE_C_DEFINED_glDrawRangeElementsEXT +#define GLEE_C_DEFINED_glDrawRangeElementsEXT + void __stdcall GLee_Lazy_glDrawRangeElementsEXT(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) {if (GLeeInit()) glDrawRangeElementsEXT(mode, start, end, count, type, indices);} + GLEEPFNGLDRAWRANGEELEMENTSEXTPROC GLeeFuncPtr_glDrawRangeElementsEXT=GLee_Lazy_glDrawRangeElementsEXT; +#endif +#endif + +/* GL_WIN_phong_shading */ + +#ifdef __GLEE_GL_WIN_phong_shading +#endif + +/* GL_WIN_specular_fog */ + +#ifdef __GLEE_GL_WIN_specular_fog +#endif + +/* GL_EXT_light_texture */ + +#ifdef __GLEE_GL_EXT_light_texture +#ifndef GLEE_C_DEFINED_glApplyTextureEXT +#define GLEE_C_DEFINED_glApplyTextureEXT + void __stdcall GLee_Lazy_glApplyTextureEXT(GLenum mode) {if (GLeeInit()) glApplyTextureEXT(mode);} + GLEEPFNGLAPPLYTEXTUREEXTPROC GLeeFuncPtr_glApplyTextureEXT=GLee_Lazy_glApplyTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureLightEXT +#define GLEE_C_DEFINED_glTextureLightEXT + void __stdcall GLee_Lazy_glTextureLightEXT(GLenum pname) {if (GLeeInit()) glTextureLightEXT(pname);} + GLEEPFNGLTEXTURELIGHTEXTPROC GLeeFuncPtr_glTextureLightEXT=GLee_Lazy_glTextureLightEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureMaterialEXT +#define GLEE_C_DEFINED_glTextureMaterialEXT + void __stdcall GLee_Lazy_glTextureMaterialEXT(GLenum face, GLenum mode) {if (GLeeInit()) glTextureMaterialEXT(face, mode);} + GLEEPFNGLTEXTUREMATERIALEXTPROC GLeeFuncPtr_glTextureMaterialEXT=GLee_Lazy_glTextureMaterialEXT; +#endif +#endif + +/* GL_SGIX_blend_alpha_minmax */ + +#ifdef __GLEE_GL_SGIX_blend_alpha_minmax +#endif + +/* GL_SGIX_impact_pixel_texture */ + +#ifdef __GLEE_GL_SGIX_impact_pixel_texture +#endif + +/* GL_EXT_bgra */ + +#ifdef __GLEE_GL_EXT_bgra +#endif + +/* GL_SGIX_async */ + +#ifdef __GLEE_GL_SGIX_async +#ifndef GLEE_C_DEFINED_glAsyncMarkerSGIX +#define GLEE_C_DEFINED_glAsyncMarkerSGIX + void __stdcall GLee_Lazy_glAsyncMarkerSGIX(GLuint marker) {if (GLeeInit()) glAsyncMarkerSGIX(marker);} + GLEEPFNGLASYNCMARKERSGIXPROC GLeeFuncPtr_glAsyncMarkerSGIX=GLee_Lazy_glAsyncMarkerSGIX; +#endif +#ifndef GLEE_C_DEFINED_glFinishAsyncSGIX +#define GLEE_C_DEFINED_glFinishAsyncSGIX + GLint __stdcall GLee_Lazy_glFinishAsyncSGIX(GLuint * markerp) {if (GLeeInit()) return glFinishAsyncSGIX(markerp); return (GLint)0;} + GLEEPFNGLFINISHASYNCSGIXPROC GLeeFuncPtr_glFinishAsyncSGIX=GLee_Lazy_glFinishAsyncSGIX; +#endif +#ifndef GLEE_C_DEFINED_glPollAsyncSGIX +#define GLEE_C_DEFINED_glPollAsyncSGIX + GLint __stdcall GLee_Lazy_glPollAsyncSGIX(GLuint * markerp) {if (GLeeInit()) return glPollAsyncSGIX(markerp); return (GLint)0;} + GLEEPFNGLPOLLASYNCSGIXPROC GLeeFuncPtr_glPollAsyncSGIX=GLee_Lazy_glPollAsyncSGIX; +#endif +#ifndef GLEE_C_DEFINED_glGenAsyncMarkersSGIX +#define GLEE_C_DEFINED_glGenAsyncMarkersSGIX + GLuint __stdcall GLee_Lazy_glGenAsyncMarkersSGIX(GLsizei range) {if (GLeeInit()) return glGenAsyncMarkersSGIX(range); return (GLuint)0;} + GLEEPFNGLGENASYNCMARKERSSGIXPROC GLeeFuncPtr_glGenAsyncMarkersSGIX=GLee_Lazy_glGenAsyncMarkersSGIX; +#endif +#ifndef GLEE_C_DEFINED_glDeleteAsyncMarkersSGIX +#define GLEE_C_DEFINED_glDeleteAsyncMarkersSGIX + void __stdcall GLee_Lazy_glDeleteAsyncMarkersSGIX(GLuint marker, GLsizei range) {if (GLeeInit()) glDeleteAsyncMarkersSGIX(marker, range);} + GLEEPFNGLDELETEASYNCMARKERSSGIXPROC GLeeFuncPtr_glDeleteAsyncMarkersSGIX=GLee_Lazy_glDeleteAsyncMarkersSGIX; +#endif +#ifndef GLEE_C_DEFINED_glIsAsyncMarkerSGIX +#define GLEE_C_DEFINED_glIsAsyncMarkerSGIX + GLboolean __stdcall GLee_Lazy_glIsAsyncMarkerSGIX(GLuint marker) {if (GLeeInit()) return glIsAsyncMarkerSGIX(marker); return (GLboolean)0;} + GLEEPFNGLISASYNCMARKERSGIXPROC GLeeFuncPtr_glIsAsyncMarkerSGIX=GLee_Lazy_glIsAsyncMarkerSGIX; +#endif +#endif + +/* GL_SGIX_async_pixel */ + +#ifdef __GLEE_GL_SGIX_async_pixel +#endif + +/* GL_SGIX_async_histogram */ + +#ifdef __GLEE_GL_SGIX_async_histogram +#endif + +/* GL_INTEL_texture_scissor */ + +#ifdef __GLEE_GL_INTEL_texture_scissor +#endif + +/* GL_INTEL_parallel_arrays */ + +#ifdef __GLEE_GL_INTEL_parallel_arrays +#ifndef GLEE_C_DEFINED_glVertexPointervINTEL +#define GLEE_C_DEFINED_glVertexPointervINTEL + void __stdcall GLee_Lazy_glVertexPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glVertexPointervINTEL(size, type, pointer);} + GLEEPFNGLVERTEXPOINTERVINTELPROC GLeeFuncPtr_glVertexPointervINTEL=GLee_Lazy_glVertexPointervINTEL; +#endif +#ifndef GLEE_C_DEFINED_glNormalPointervINTEL +#define GLEE_C_DEFINED_glNormalPointervINTEL + void __stdcall GLee_Lazy_glNormalPointervINTEL(GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glNormalPointervINTEL(type, pointer);} + GLEEPFNGLNORMALPOINTERVINTELPROC GLeeFuncPtr_glNormalPointervINTEL=GLee_Lazy_glNormalPointervINTEL; +#endif +#ifndef GLEE_C_DEFINED_glColorPointervINTEL +#define GLEE_C_DEFINED_glColorPointervINTEL + void __stdcall GLee_Lazy_glColorPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glColorPointervINTEL(size, type, pointer);} + GLEEPFNGLCOLORPOINTERVINTELPROC GLeeFuncPtr_glColorPointervINTEL=GLee_Lazy_glColorPointervINTEL; +#endif +#ifndef GLEE_C_DEFINED_glTexCoordPointervINTEL +#define GLEE_C_DEFINED_glTexCoordPointervINTEL + void __stdcall GLee_Lazy_glTexCoordPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer) {if (GLeeInit()) glTexCoordPointervINTEL(size, type, pointer);} + GLEEPFNGLTEXCOORDPOINTERVINTELPROC GLeeFuncPtr_glTexCoordPointervINTEL=GLee_Lazy_glTexCoordPointervINTEL; +#endif +#endif + +/* GL_HP_occlusion_test */ + +#ifdef __GLEE_GL_HP_occlusion_test +#endif + +/* GL_EXT_pixel_transform */ + +#ifdef __GLEE_GL_EXT_pixel_transform +#ifndef GLEE_C_DEFINED_glPixelTransformParameteriEXT +#define GLEE_C_DEFINED_glPixelTransformParameteriEXT + void __stdcall GLee_Lazy_glPixelTransformParameteriEXT(GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glPixelTransformParameteriEXT(target, pname, param);} + GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC GLeeFuncPtr_glPixelTransformParameteriEXT=GLee_Lazy_glPixelTransformParameteriEXT; +#endif +#ifndef GLEE_C_DEFINED_glPixelTransformParameterfEXT +#define GLEE_C_DEFINED_glPixelTransformParameterfEXT + void __stdcall GLee_Lazy_glPixelTransformParameterfEXT(GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glPixelTransformParameterfEXT(target, pname, param);} + GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC GLeeFuncPtr_glPixelTransformParameterfEXT=GLee_Lazy_glPixelTransformParameterfEXT; +#endif +#ifndef GLEE_C_DEFINED_glPixelTransformParameterivEXT +#define GLEE_C_DEFINED_glPixelTransformParameterivEXT + void __stdcall GLee_Lazy_glPixelTransformParameterivEXT(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glPixelTransformParameterivEXT(target, pname, params);} + GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC GLeeFuncPtr_glPixelTransformParameterivEXT=GLee_Lazy_glPixelTransformParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glPixelTransformParameterfvEXT +#define GLEE_C_DEFINED_glPixelTransformParameterfvEXT + void __stdcall GLee_Lazy_glPixelTransformParameterfvEXT(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glPixelTransformParameterfvEXT(target, pname, params);} + GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC GLeeFuncPtr_glPixelTransformParameterfvEXT=GLee_Lazy_glPixelTransformParameterfvEXT; +#endif +#endif + +/* GL_EXT_pixel_transform_color_table */ + +#ifdef __GLEE_GL_EXT_pixel_transform_color_table +#endif + +/* GL_EXT_shared_texture_palette */ + +#ifdef __GLEE_GL_EXT_shared_texture_palette +#endif + +/* GL_EXT_separate_specular_color */ + +#ifdef __GLEE_GL_EXT_separate_specular_color +#endif + +/* GL_EXT_secondary_color */ + +#ifdef __GLEE_GL_EXT_secondary_color +#ifndef GLEE_C_DEFINED_glSecondaryColor3bEXT +#define GLEE_C_DEFINED_glSecondaryColor3bEXT + void __stdcall GLee_Lazy_glSecondaryColor3bEXT(GLbyte red, GLbyte green, GLbyte blue) {if (GLeeInit()) glSecondaryColor3bEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3BEXTPROC GLeeFuncPtr_glSecondaryColor3bEXT=GLee_Lazy_glSecondaryColor3bEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3bvEXT +#define GLEE_C_DEFINED_glSecondaryColor3bvEXT + void __stdcall GLee_Lazy_glSecondaryColor3bvEXT(const GLbyte * v) {if (GLeeInit()) glSecondaryColor3bvEXT(v);} + GLEEPFNGLSECONDARYCOLOR3BVEXTPROC GLeeFuncPtr_glSecondaryColor3bvEXT=GLee_Lazy_glSecondaryColor3bvEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3dEXT +#define GLEE_C_DEFINED_glSecondaryColor3dEXT + void __stdcall GLee_Lazy_glSecondaryColor3dEXT(GLdouble red, GLdouble green, GLdouble blue) {if (GLeeInit()) glSecondaryColor3dEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3DEXTPROC GLeeFuncPtr_glSecondaryColor3dEXT=GLee_Lazy_glSecondaryColor3dEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3dvEXT +#define GLEE_C_DEFINED_glSecondaryColor3dvEXT + void __stdcall GLee_Lazy_glSecondaryColor3dvEXT(const GLdouble * v) {if (GLeeInit()) glSecondaryColor3dvEXT(v);} + GLEEPFNGLSECONDARYCOLOR3DVEXTPROC GLeeFuncPtr_glSecondaryColor3dvEXT=GLee_Lazy_glSecondaryColor3dvEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3fEXT +#define GLEE_C_DEFINED_glSecondaryColor3fEXT + void __stdcall GLee_Lazy_glSecondaryColor3fEXT(GLfloat red, GLfloat green, GLfloat blue) {if (GLeeInit()) glSecondaryColor3fEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3FEXTPROC GLeeFuncPtr_glSecondaryColor3fEXT=GLee_Lazy_glSecondaryColor3fEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3fvEXT +#define GLEE_C_DEFINED_glSecondaryColor3fvEXT + void __stdcall GLee_Lazy_glSecondaryColor3fvEXT(const GLfloat * v) {if (GLeeInit()) glSecondaryColor3fvEXT(v);} + GLEEPFNGLSECONDARYCOLOR3FVEXTPROC GLeeFuncPtr_glSecondaryColor3fvEXT=GLee_Lazy_glSecondaryColor3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3iEXT +#define GLEE_C_DEFINED_glSecondaryColor3iEXT + void __stdcall GLee_Lazy_glSecondaryColor3iEXT(GLint red, GLint green, GLint blue) {if (GLeeInit()) glSecondaryColor3iEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3IEXTPROC GLeeFuncPtr_glSecondaryColor3iEXT=GLee_Lazy_glSecondaryColor3iEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3ivEXT +#define GLEE_C_DEFINED_glSecondaryColor3ivEXT + void __stdcall GLee_Lazy_glSecondaryColor3ivEXT(const GLint * v) {if (GLeeInit()) glSecondaryColor3ivEXT(v);} + GLEEPFNGLSECONDARYCOLOR3IVEXTPROC GLeeFuncPtr_glSecondaryColor3ivEXT=GLee_Lazy_glSecondaryColor3ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3sEXT +#define GLEE_C_DEFINED_glSecondaryColor3sEXT + void __stdcall GLee_Lazy_glSecondaryColor3sEXT(GLshort red, GLshort green, GLshort blue) {if (GLeeInit()) glSecondaryColor3sEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3SEXTPROC GLeeFuncPtr_glSecondaryColor3sEXT=GLee_Lazy_glSecondaryColor3sEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3svEXT +#define GLEE_C_DEFINED_glSecondaryColor3svEXT + void __stdcall GLee_Lazy_glSecondaryColor3svEXT(const GLshort * v) {if (GLeeInit()) glSecondaryColor3svEXT(v);} + GLEEPFNGLSECONDARYCOLOR3SVEXTPROC GLeeFuncPtr_glSecondaryColor3svEXT=GLee_Lazy_glSecondaryColor3svEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3ubEXT +#define GLEE_C_DEFINED_glSecondaryColor3ubEXT + void __stdcall GLee_Lazy_glSecondaryColor3ubEXT(GLubyte red, GLubyte green, GLubyte blue) {if (GLeeInit()) glSecondaryColor3ubEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3UBEXTPROC GLeeFuncPtr_glSecondaryColor3ubEXT=GLee_Lazy_glSecondaryColor3ubEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3ubvEXT +#define GLEE_C_DEFINED_glSecondaryColor3ubvEXT + void __stdcall GLee_Lazy_glSecondaryColor3ubvEXT(const GLubyte * v) {if (GLeeInit()) glSecondaryColor3ubvEXT(v);} + GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC GLeeFuncPtr_glSecondaryColor3ubvEXT=GLee_Lazy_glSecondaryColor3ubvEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3uiEXT +#define GLEE_C_DEFINED_glSecondaryColor3uiEXT + void __stdcall GLee_Lazy_glSecondaryColor3uiEXT(GLuint red, GLuint green, GLuint blue) {if (GLeeInit()) glSecondaryColor3uiEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3UIEXTPROC GLeeFuncPtr_glSecondaryColor3uiEXT=GLee_Lazy_glSecondaryColor3uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3uivEXT +#define GLEE_C_DEFINED_glSecondaryColor3uivEXT + void __stdcall GLee_Lazy_glSecondaryColor3uivEXT(const GLuint * v) {if (GLeeInit()) glSecondaryColor3uivEXT(v);} + GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC GLeeFuncPtr_glSecondaryColor3uivEXT=GLee_Lazy_glSecondaryColor3uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3usEXT +#define GLEE_C_DEFINED_glSecondaryColor3usEXT + void __stdcall GLee_Lazy_glSecondaryColor3usEXT(GLushort red, GLushort green, GLushort blue) {if (GLeeInit()) glSecondaryColor3usEXT(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3USEXTPROC GLeeFuncPtr_glSecondaryColor3usEXT=GLee_Lazy_glSecondaryColor3usEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3usvEXT +#define GLEE_C_DEFINED_glSecondaryColor3usvEXT + void __stdcall GLee_Lazy_glSecondaryColor3usvEXT(const GLushort * v) {if (GLeeInit()) glSecondaryColor3usvEXT(v);} + GLEEPFNGLSECONDARYCOLOR3USVEXTPROC GLeeFuncPtr_glSecondaryColor3usvEXT=GLee_Lazy_glSecondaryColor3usvEXT; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColorPointerEXT +#define GLEE_C_DEFINED_glSecondaryColorPointerEXT + void __stdcall GLee_Lazy_glSecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glSecondaryColorPointerEXT(size, type, stride, pointer);} + GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC GLeeFuncPtr_glSecondaryColorPointerEXT=GLee_Lazy_glSecondaryColorPointerEXT; +#endif +#endif + +/* GL_EXT_texture_perturb_normal */ + +#ifdef __GLEE_GL_EXT_texture_perturb_normal +#ifndef GLEE_C_DEFINED_glTextureNormalEXT +#define GLEE_C_DEFINED_glTextureNormalEXT + void __stdcall GLee_Lazy_glTextureNormalEXT(GLenum mode) {if (GLeeInit()) glTextureNormalEXT(mode);} + GLEEPFNGLTEXTURENORMALEXTPROC GLeeFuncPtr_glTextureNormalEXT=GLee_Lazy_glTextureNormalEXT; +#endif +#endif + +/* GL_EXT_multi_draw_arrays */ + +#ifdef __GLEE_GL_EXT_multi_draw_arrays +#ifndef GLEE_C_DEFINED_glMultiDrawArraysEXT +#define GLEE_C_DEFINED_glMultiDrawArraysEXT + void __stdcall GLee_Lazy_glMultiDrawArraysEXT(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawArraysEXT(mode, first, count, primcount);} + GLEEPFNGLMULTIDRAWARRAYSEXTPROC GLeeFuncPtr_glMultiDrawArraysEXT=GLee_Lazy_glMultiDrawArraysEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiDrawElementsEXT +#define GLEE_C_DEFINED_glMultiDrawElementsEXT + void __stdcall GLee_Lazy_glMultiDrawElementsEXT(GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount) {if (GLeeInit()) glMultiDrawElementsEXT(mode, count, type, indices, primcount);} + GLEEPFNGLMULTIDRAWELEMENTSEXTPROC GLeeFuncPtr_glMultiDrawElementsEXT=GLee_Lazy_glMultiDrawElementsEXT; +#endif +#endif + +/* GL_EXT_fog_coord */ + +#ifdef __GLEE_GL_EXT_fog_coord +#ifndef GLEE_C_DEFINED_glFogCoordfEXT +#define GLEE_C_DEFINED_glFogCoordfEXT + void __stdcall GLee_Lazy_glFogCoordfEXT(GLfloat coord) {if (GLeeInit()) glFogCoordfEXT(coord);} + GLEEPFNGLFOGCOORDFEXTPROC GLeeFuncPtr_glFogCoordfEXT=GLee_Lazy_glFogCoordfEXT; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordfvEXT +#define GLEE_C_DEFINED_glFogCoordfvEXT + void __stdcall GLee_Lazy_glFogCoordfvEXT(const GLfloat * coord) {if (GLeeInit()) glFogCoordfvEXT(coord);} + GLEEPFNGLFOGCOORDFVEXTPROC GLeeFuncPtr_glFogCoordfvEXT=GLee_Lazy_glFogCoordfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glFogCoorddEXT +#define GLEE_C_DEFINED_glFogCoorddEXT + void __stdcall GLee_Lazy_glFogCoorddEXT(GLdouble coord) {if (GLeeInit()) glFogCoorddEXT(coord);} + GLEEPFNGLFOGCOORDDEXTPROC GLeeFuncPtr_glFogCoorddEXT=GLee_Lazy_glFogCoorddEXT; +#endif +#ifndef GLEE_C_DEFINED_glFogCoorddvEXT +#define GLEE_C_DEFINED_glFogCoorddvEXT + void __stdcall GLee_Lazy_glFogCoorddvEXT(const GLdouble * coord) {if (GLeeInit()) glFogCoorddvEXT(coord);} + GLEEPFNGLFOGCOORDDVEXTPROC GLeeFuncPtr_glFogCoorddvEXT=GLee_Lazy_glFogCoorddvEXT; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordPointerEXT +#define GLEE_C_DEFINED_glFogCoordPointerEXT + void __stdcall GLee_Lazy_glFogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glFogCoordPointerEXT(type, stride, pointer);} + GLEEPFNGLFOGCOORDPOINTEREXTPROC GLeeFuncPtr_glFogCoordPointerEXT=GLee_Lazy_glFogCoordPointerEXT; +#endif +#endif + +/* GL_REND_screen_coordinates */ + +#ifdef __GLEE_GL_REND_screen_coordinates +#endif + +/* GL_EXT_coordinate_frame */ + +#ifdef __GLEE_GL_EXT_coordinate_frame +#ifndef GLEE_C_DEFINED_glTangent3bEXT +#define GLEE_C_DEFINED_glTangent3bEXT + void __stdcall GLee_Lazy_glTangent3bEXT(GLbyte tx, GLbyte ty, GLbyte tz) {if (GLeeInit()) glTangent3bEXT(tx, ty, tz);} + GLEEPFNGLTANGENT3BEXTPROC GLeeFuncPtr_glTangent3bEXT=GLee_Lazy_glTangent3bEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3bvEXT +#define GLEE_C_DEFINED_glTangent3bvEXT + void __stdcall GLee_Lazy_glTangent3bvEXT(const GLbyte * v) {if (GLeeInit()) glTangent3bvEXT(v);} + GLEEPFNGLTANGENT3BVEXTPROC GLeeFuncPtr_glTangent3bvEXT=GLee_Lazy_glTangent3bvEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3dEXT +#define GLEE_C_DEFINED_glTangent3dEXT + void __stdcall GLee_Lazy_glTangent3dEXT(GLdouble tx, GLdouble ty, GLdouble tz) {if (GLeeInit()) glTangent3dEXT(tx, ty, tz);} + GLEEPFNGLTANGENT3DEXTPROC GLeeFuncPtr_glTangent3dEXT=GLee_Lazy_glTangent3dEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3dvEXT +#define GLEE_C_DEFINED_glTangent3dvEXT + void __stdcall GLee_Lazy_glTangent3dvEXT(const GLdouble * v) {if (GLeeInit()) glTangent3dvEXT(v);} + GLEEPFNGLTANGENT3DVEXTPROC GLeeFuncPtr_glTangent3dvEXT=GLee_Lazy_glTangent3dvEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3fEXT +#define GLEE_C_DEFINED_glTangent3fEXT + void __stdcall GLee_Lazy_glTangent3fEXT(GLfloat tx, GLfloat ty, GLfloat tz) {if (GLeeInit()) glTangent3fEXT(tx, ty, tz);} + GLEEPFNGLTANGENT3FEXTPROC GLeeFuncPtr_glTangent3fEXT=GLee_Lazy_glTangent3fEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3fvEXT +#define GLEE_C_DEFINED_glTangent3fvEXT + void __stdcall GLee_Lazy_glTangent3fvEXT(const GLfloat * v) {if (GLeeInit()) glTangent3fvEXT(v);} + GLEEPFNGLTANGENT3FVEXTPROC GLeeFuncPtr_glTangent3fvEXT=GLee_Lazy_glTangent3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3iEXT +#define GLEE_C_DEFINED_glTangent3iEXT + void __stdcall GLee_Lazy_glTangent3iEXT(GLint tx, GLint ty, GLint tz) {if (GLeeInit()) glTangent3iEXT(tx, ty, tz);} + GLEEPFNGLTANGENT3IEXTPROC GLeeFuncPtr_glTangent3iEXT=GLee_Lazy_glTangent3iEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3ivEXT +#define GLEE_C_DEFINED_glTangent3ivEXT + void __stdcall GLee_Lazy_glTangent3ivEXT(const GLint * v) {if (GLeeInit()) glTangent3ivEXT(v);} + GLEEPFNGLTANGENT3IVEXTPROC GLeeFuncPtr_glTangent3ivEXT=GLee_Lazy_glTangent3ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3sEXT +#define GLEE_C_DEFINED_glTangent3sEXT + void __stdcall GLee_Lazy_glTangent3sEXT(GLshort tx, GLshort ty, GLshort tz) {if (GLeeInit()) glTangent3sEXT(tx, ty, tz);} + GLEEPFNGLTANGENT3SEXTPROC GLeeFuncPtr_glTangent3sEXT=GLee_Lazy_glTangent3sEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangent3svEXT +#define GLEE_C_DEFINED_glTangent3svEXT + void __stdcall GLee_Lazy_glTangent3svEXT(const GLshort * v) {if (GLeeInit()) glTangent3svEXT(v);} + GLEEPFNGLTANGENT3SVEXTPROC GLeeFuncPtr_glTangent3svEXT=GLee_Lazy_glTangent3svEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3bEXT +#define GLEE_C_DEFINED_glBinormal3bEXT + void __stdcall GLee_Lazy_glBinormal3bEXT(GLbyte bx, GLbyte by, GLbyte bz) {if (GLeeInit()) glBinormal3bEXT(bx, by, bz);} + GLEEPFNGLBINORMAL3BEXTPROC GLeeFuncPtr_glBinormal3bEXT=GLee_Lazy_glBinormal3bEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3bvEXT +#define GLEE_C_DEFINED_glBinormal3bvEXT + void __stdcall GLee_Lazy_glBinormal3bvEXT(const GLbyte * v) {if (GLeeInit()) glBinormal3bvEXT(v);} + GLEEPFNGLBINORMAL3BVEXTPROC GLeeFuncPtr_glBinormal3bvEXT=GLee_Lazy_glBinormal3bvEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3dEXT +#define GLEE_C_DEFINED_glBinormal3dEXT + void __stdcall GLee_Lazy_glBinormal3dEXT(GLdouble bx, GLdouble by, GLdouble bz) {if (GLeeInit()) glBinormal3dEXT(bx, by, bz);} + GLEEPFNGLBINORMAL3DEXTPROC GLeeFuncPtr_glBinormal3dEXT=GLee_Lazy_glBinormal3dEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3dvEXT +#define GLEE_C_DEFINED_glBinormal3dvEXT + void __stdcall GLee_Lazy_glBinormal3dvEXT(const GLdouble * v) {if (GLeeInit()) glBinormal3dvEXT(v);} + GLEEPFNGLBINORMAL3DVEXTPROC GLeeFuncPtr_glBinormal3dvEXT=GLee_Lazy_glBinormal3dvEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3fEXT +#define GLEE_C_DEFINED_glBinormal3fEXT + void __stdcall GLee_Lazy_glBinormal3fEXT(GLfloat bx, GLfloat by, GLfloat bz) {if (GLeeInit()) glBinormal3fEXT(bx, by, bz);} + GLEEPFNGLBINORMAL3FEXTPROC GLeeFuncPtr_glBinormal3fEXT=GLee_Lazy_glBinormal3fEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3fvEXT +#define GLEE_C_DEFINED_glBinormal3fvEXT + void __stdcall GLee_Lazy_glBinormal3fvEXT(const GLfloat * v) {if (GLeeInit()) glBinormal3fvEXT(v);} + GLEEPFNGLBINORMAL3FVEXTPROC GLeeFuncPtr_glBinormal3fvEXT=GLee_Lazy_glBinormal3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3iEXT +#define GLEE_C_DEFINED_glBinormal3iEXT + void __stdcall GLee_Lazy_glBinormal3iEXT(GLint bx, GLint by, GLint bz) {if (GLeeInit()) glBinormal3iEXT(bx, by, bz);} + GLEEPFNGLBINORMAL3IEXTPROC GLeeFuncPtr_glBinormal3iEXT=GLee_Lazy_glBinormal3iEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3ivEXT +#define GLEE_C_DEFINED_glBinormal3ivEXT + void __stdcall GLee_Lazy_glBinormal3ivEXT(const GLint * v) {if (GLeeInit()) glBinormal3ivEXT(v);} + GLEEPFNGLBINORMAL3IVEXTPROC GLeeFuncPtr_glBinormal3ivEXT=GLee_Lazy_glBinormal3ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3sEXT +#define GLEE_C_DEFINED_glBinormal3sEXT + void __stdcall GLee_Lazy_glBinormal3sEXT(GLshort bx, GLshort by, GLshort bz) {if (GLeeInit()) glBinormal3sEXT(bx, by, bz);} + GLEEPFNGLBINORMAL3SEXTPROC GLeeFuncPtr_glBinormal3sEXT=GLee_Lazy_glBinormal3sEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormal3svEXT +#define GLEE_C_DEFINED_glBinormal3svEXT + void __stdcall GLee_Lazy_glBinormal3svEXT(const GLshort * v) {if (GLeeInit()) glBinormal3svEXT(v);} + GLEEPFNGLBINORMAL3SVEXTPROC GLeeFuncPtr_glBinormal3svEXT=GLee_Lazy_glBinormal3svEXT; +#endif +#ifndef GLEE_C_DEFINED_glTangentPointerEXT +#define GLEE_C_DEFINED_glTangentPointerEXT + void __stdcall GLee_Lazy_glTangentPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glTangentPointerEXT(type, stride, pointer);} + GLEEPFNGLTANGENTPOINTEREXTPROC GLeeFuncPtr_glTangentPointerEXT=GLee_Lazy_glTangentPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glBinormalPointerEXT +#define GLEE_C_DEFINED_glBinormalPointerEXT + void __stdcall GLee_Lazy_glBinormalPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glBinormalPointerEXT(type, stride, pointer);} + GLEEPFNGLBINORMALPOINTEREXTPROC GLeeFuncPtr_glBinormalPointerEXT=GLee_Lazy_glBinormalPointerEXT; +#endif +#endif + +/* GL_EXT_texture_env_combine */ + +#ifdef __GLEE_GL_EXT_texture_env_combine +#endif + +/* GL_APPLE_specular_vector */ + +#ifdef __GLEE_GL_APPLE_specular_vector +#endif + +/* GL_APPLE_transform_hint */ + +#ifdef __GLEE_GL_APPLE_transform_hint +#endif + +/* GL_SGIX_fog_scale */ + +#ifdef __GLEE_GL_SGIX_fog_scale +#endif + +/* GL_SUNX_constant_data */ + +#ifdef __GLEE_GL_SUNX_constant_data +#ifndef GLEE_C_DEFINED_glFinishTextureSUNX +#define GLEE_C_DEFINED_glFinishTextureSUNX + void __stdcall GLee_Lazy_glFinishTextureSUNX(void) {if (GLeeInit()) glFinishTextureSUNX();} + GLEEPFNGLFINISHTEXTURESUNXPROC GLeeFuncPtr_glFinishTextureSUNX=GLee_Lazy_glFinishTextureSUNX; +#endif +#endif + +/* GL_SUN_global_alpha */ + +#ifdef __GLEE_GL_SUN_global_alpha +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorbSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactorbSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactorbSUN(GLbyte factor) {if (GLeeInit()) glGlobalAlphaFactorbSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorbSUN=GLee_Lazy_glGlobalAlphaFactorbSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorsSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactorsSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactorsSUN(GLshort factor) {if (GLeeInit()) glGlobalAlphaFactorsSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorsSUN=GLee_Lazy_glGlobalAlphaFactorsSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactoriSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactoriSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactoriSUN(GLint factor) {if (GLeeInit()) glGlobalAlphaFactoriSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORISUNPROC GLeeFuncPtr_glGlobalAlphaFactoriSUN=GLee_Lazy_glGlobalAlphaFactoriSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorfSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactorfSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactorfSUN(GLfloat factor) {if (GLeeInit()) glGlobalAlphaFactorfSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORFSUNPROC GLeeFuncPtr_glGlobalAlphaFactorfSUN=GLee_Lazy_glGlobalAlphaFactorfSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactordSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactordSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactordSUN(GLdouble factor) {if (GLeeInit()) glGlobalAlphaFactordSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORDSUNPROC GLeeFuncPtr_glGlobalAlphaFactordSUN=GLee_Lazy_glGlobalAlphaFactordSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorubSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactorubSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactorubSUN(GLubyte factor) {if (GLeeInit()) glGlobalAlphaFactorubSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorubSUN=GLee_Lazy_glGlobalAlphaFactorubSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorusSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactorusSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactorusSUN(GLushort factor) {if (GLeeInit()) glGlobalAlphaFactorusSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorusSUN=GLee_Lazy_glGlobalAlphaFactorusSUN; +#endif +#ifndef GLEE_C_DEFINED_glGlobalAlphaFactoruiSUN +#define GLEE_C_DEFINED_glGlobalAlphaFactoruiSUN + void __stdcall GLee_Lazy_glGlobalAlphaFactoruiSUN(GLuint factor) {if (GLeeInit()) glGlobalAlphaFactoruiSUN(factor);} + GLEEPFNGLGLOBALALPHAFACTORUISUNPROC GLeeFuncPtr_glGlobalAlphaFactoruiSUN=GLee_Lazy_glGlobalAlphaFactoruiSUN; +#endif +#endif + +/* GL_SUN_triangle_list */ + +#ifdef __GLEE_GL_SUN_triangle_list +#ifndef GLEE_C_DEFINED_glReplacementCodeuiSUN +#define GLEE_C_DEFINED_glReplacementCodeuiSUN + void __stdcall GLee_Lazy_glReplacementCodeuiSUN(GLuint code) {if (GLeeInit()) glReplacementCodeuiSUN(code);} + GLEEPFNGLREPLACEMENTCODEUISUNPROC GLeeFuncPtr_glReplacementCodeuiSUN=GLee_Lazy_glReplacementCodeuiSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeusSUN +#define GLEE_C_DEFINED_glReplacementCodeusSUN + void __stdcall GLee_Lazy_glReplacementCodeusSUN(GLushort code) {if (GLeeInit()) glReplacementCodeusSUN(code);} + GLEEPFNGLREPLACEMENTCODEUSSUNPROC GLeeFuncPtr_glReplacementCodeusSUN=GLee_Lazy_glReplacementCodeusSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeubSUN +#define GLEE_C_DEFINED_glReplacementCodeubSUN + void __stdcall GLee_Lazy_glReplacementCodeubSUN(GLubyte code) {if (GLeeInit()) glReplacementCodeubSUN(code);} + GLEEPFNGLREPLACEMENTCODEUBSUNPROC GLeeFuncPtr_glReplacementCodeubSUN=GLee_Lazy_glReplacementCodeubSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuivSUN +#define GLEE_C_DEFINED_glReplacementCodeuivSUN + void __stdcall GLee_Lazy_glReplacementCodeuivSUN(const GLuint * code) {if (GLeeInit()) glReplacementCodeuivSUN(code);} + GLEEPFNGLREPLACEMENTCODEUIVSUNPROC GLeeFuncPtr_glReplacementCodeuivSUN=GLee_Lazy_glReplacementCodeuivSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeusvSUN +#define GLEE_C_DEFINED_glReplacementCodeusvSUN + void __stdcall GLee_Lazy_glReplacementCodeusvSUN(const GLushort * code) {if (GLeeInit()) glReplacementCodeusvSUN(code);} + GLEEPFNGLREPLACEMENTCODEUSVSUNPROC GLeeFuncPtr_glReplacementCodeusvSUN=GLee_Lazy_glReplacementCodeusvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeubvSUN +#define GLEE_C_DEFINED_glReplacementCodeubvSUN + void __stdcall GLee_Lazy_glReplacementCodeubvSUN(const GLubyte * code) {if (GLeeInit()) glReplacementCodeubvSUN(code);} + GLEEPFNGLREPLACEMENTCODEUBVSUNPROC GLeeFuncPtr_glReplacementCodeubvSUN=GLee_Lazy_glReplacementCodeubvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodePointerSUN +#define GLEE_C_DEFINED_glReplacementCodePointerSUN + void __stdcall GLee_Lazy_glReplacementCodePointerSUN(GLenum type, GLsizei stride, const GLvoid* * pointer) {if (GLeeInit()) glReplacementCodePointerSUN(type, stride, pointer);} + GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC GLeeFuncPtr_glReplacementCodePointerSUN=GLee_Lazy_glReplacementCodePointerSUN; +#endif +#endif + +/* GL_SUN_vertex */ + +#ifdef __GLEE_GL_SUN_vertex +#ifndef GLEE_C_DEFINED_glColor4ubVertex2fSUN +#define GLEE_C_DEFINED_glColor4ubVertex2fSUN + void __stdcall GLee_Lazy_glColor4ubVertex2fSUN(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y) {if (GLeeInit()) glColor4ubVertex2fSUN(r, g, b, a, x, y);} + GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC GLeeFuncPtr_glColor4ubVertex2fSUN=GLee_Lazy_glColor4ubVertex2fSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor4ubVertex2fvSUN +#define GLEE_C_DEFINED_glColor4ubVertex2fvSUN + void __stdcall GLee_Lazy_glColor4ubVertex2fvSUN(const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glColor4ubVertex2fvSUN(c, v);} + GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC GLeeFuncPtr_glColor4ubVertex2fvSUN=GLee_Lazy_glColor4ubVertex2fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor4ubVertex3fSUN +#define GLEE_C_DEFINED_glColor4ubVertex3fSUN + void __stdcall GLee_Lazy_glColor4ubVertex3fSUN(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glColor4ubVertex3fSUN(r, g, b, a, x, y, z);} + GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glColor4ubVertex3fSUN=GLee_Lazy_glColor4ubVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor4ubVertex3fvSUN +#define GLEE_C_DEFINED_glColor4ubVertex3fvSUN + void __stdcall GLee_Lazy_glColor4ubVertex3fvSUN(const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glColor4ubVertex3fvSUN(c, v);} + GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glColor4ubVertex3fvSUN=GLee_Lazy_glColor4ubVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor3fVertex3fSUN +#define GLEE_C_DEFINED_glColor3fVertex3fSUN + void __stdcall GLee_Lazy_glColor3fVertex3fSUN(GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glColor3fVertex3fSUN(r, g, b, x, y, z);} + GLEEPFNGLCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glColor3fVertex3fSUN=GLee_Lazy_glColor3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor3fVertex3fvSUN +#define GLEE_C_DEFINED_glColor3fVertex3fvSUN + void __stdcall GLee_Lazy_glColor3fVertex3fvSUN(const GLfloat * c, const GLfloat * v) {if (GLeeInit()) glColor3fVertex3fvSUN(c, v);} + GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor3fVertex3fvSUN=GLee_Lazy_glColor3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glNormal3fVertex3fSUN(GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glNormal3fVertex3fSUN(nx, ny, nz, x, y, z);} + GLEEPFNGLNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glNormal3fVertex3fSUN=GLee_Lazy_glNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glNormal3fVertex3fvSUN(const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glNormal3fVertex3fvSUN(n, v);} + GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glNormal3fVertex3fvSUN=GLee_Lazy_glNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor4fNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glColor4fNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glColor4fNormal3fVertex3fSUN(GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glColor4fNormal3fVertex3fSUN(r, g, b, a, nx, ny, nz, x, y, z);} + GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fSUN=GLee_Lazy_glColor4fNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glColor4fNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glColor4fNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glColor4fNormal3fVertex3fvSUN(const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glColor4fNormal3fVertex3fvSUN(c, n, v);} + GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN=GLee_Lazy_glColor4fNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fVertex3fSUN +#define GLEE_C_DEFINED_glTexCoord2fVertex3fSUN + void __stdcall GLee_Lazy_glTexCoord2fVertex3fSUN(GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fVertex3fSUN(s, t, x, y, z);} + GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fSUN=GLee_Lazy_glTexCoord2fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fVertex3fvSUN +#define GLEE_C_DEFINED_glTexCoord2fVertex3fvSUN + void __stdcall GLee_Lazy_glTexCoord2fVertex3fvSUN(const GLfloat * tc, const GLfloat * v) {if (GLeeInit()) glTexCoord2fVertex3fvSUN(tc, v);} + GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fvSUN=GLee_Lazy_glTexCoord2fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord4fVertex4fSUN +#define GLEE_C_DEFINED_glTexCoord4fVertex4fSUN + void __stdcall GLee_Lazy_glTexCoord4fVertex4fSUN(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glTexCoord4fVertex4fSUN(s, t, p, q, x, y, z, w);} + GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fSUN=GLee_Lazy_glTexCoord4fVertex4fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord4fVertex4fvSUN +#define GLEE_C_DEFINED_glTexCoord4fVertex4fvSUN + void __stdcall GLee_Lazy_glTexCoord4fVertex4fvSUN(const GLfloat * tc, const GLfloat * v) {if (GLeeInit()) glTexCoord4fVertex4fvSUN(tc, v);} + GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fvSUN=GLee_Lazy_glTexCoord4fVertex4fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fSUN +#define GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fSUN + void __stdcall GLee_Lazy_glTexCoord2fColor4ubVertex3fSUN(GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fColor4ubVertex3fSUN(s, t, r, g, b, a, x, y, z);} + GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN=GLee_Lazy_glTexCoord2fColor4ubVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fvSUN +#define GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fvSUN + void __stdcall GLee_Lazy_glTexCoord2fColor4ubVertex3fvSUN(const GLfloat * tc, const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glTexCoord2fColor4ubVertex3fvSUN(tc, c, v);} + GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN=GLee_Lazy_glTexCoord2fColor4ubVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fSUN +#define GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fSUN + void __stdcall GLee_Lazy_glTexCoord2fColor3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fColor3fVertex3fSUN(s, t, r, g, b, x, y, z);} + GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN=GLee_Lazy_glTexCoord2fColor3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fvSUN +#define GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fvSUN + void __stdcall GLee_Lazy_glTexCoord2fColor3fVertex3fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * v) {if (GLeeInit()) glTexCoord2fColor3fVertex3fvSUN(tc, c, v);} + GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN=GLee_Lazy_glTexCoord2fColor3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glTexCoord2fNormal3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fNormal3fVertex3fSUN(s, t, nx, ny, nz, x, y, z);} + GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN=GLee_Lazy_glTexCoord2fNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glTexCoord2fNormal3fVertex3fvSUN(const GLfloat * tc, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glTexCoord2fNormal3fVertex3fvSUN(tc, n, v);} + GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN=GLee_Lazy_glTexCoord2fNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glTexCoord2fColor4fNormal3fVertex3fSUN(s, t, r, g, b, a, nx, ny, nz, x, y, z);} + GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN=GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glTexCoord2fColor4fNormal3fVertex3fvSUN(tc, c, n, v);} + GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN=GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN +#define GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN + void __stdcall GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fSUN(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glTexCoord4fColor4fNormal3fVertex4fSUN(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w);} + GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN=GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fSUN; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN +#define GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN + void __stdcall GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glTexCoord4fColor4fNormal3fVertex4fvSUN(tc, c, n, v);} + GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN=GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiVertex3fSUN(GLuint rc, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiVertex3fSUN(rc, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fSUN=GLee_Lazy_glReplacementCodeuiVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiVertex3fvSUN(const GLuint * rc, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiVertex3fvSUN(rc, v);} + GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN=GLee_Lazy_glReplacementCodeuiVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiColor4ubVertex3fSUN(GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiColor4ubVertex3fSUN(rc, r, g, b, a, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor4ubVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiColor4ubVertex3fvSUN(const GLuint * rc, const GLubyte * c, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiColor4ubVertex3fvSUN(rc, c, v);} + GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor4ubVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiColor3fVertex3fSUN(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiColor3fVertex3fSUN(rc, r, g, b, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiColor3fVertex3fvSUN(const GLuint * rc, const GLfloat * c, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiColor3fVertex3fvSUN(rc, c, v);} + GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiNormal3fVertex3fSUN(GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiNormal3fVertex3fSUN(rc, nx, ny, nz, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiNormal3fVertex3fvSUN(rc, n, v);} + GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fSUN(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiColor4fNormal3fVertex3fSUN(rc, r, g, b, a, nx, ny, nz, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiColor4fNormal3fVertex3fvSUN(rc, c, n, v);} + GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiTexCoord2fVertex3fSUN(rc, s, t, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiTexCoord2fVertex3fvSUN(rc, tc, v);} + GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(rc, s, t, nx, ny, nz, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(rc, tc, n, v);} + GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN + void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z);} + GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +#endif +#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN + void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v) {if (GLeeInit()) glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(rc, tc, c, n, v);} + GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +#endif +#endif + +/* GL_EXT_blend_func_separate */ + +#ifdef __GLEE_GL_EXT_blend_func_separate +#ifndef GLEE_C_DEFINED_glBlendFuncSeparateEXT +#define GLEE_C_DEFINED_glBlendFuncSeparateEXT + void __stdcall GLee_Lazy_glBlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) {if (GLeeInit()) glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);} + GLEEPFNGLBLENDFUNCSEPARATEEXTPROC GLeeFuncPtr_glBlendFuncSeparateEXT=GLee_Lazy_glBlendFuncSeparateEXT; +#endif +#endif + +/* GL_INGR_color_clamp */ + +#ifdef __GLEE_GL_INGR_color_clamp +#endif + +/* GL_INGR_interlace_read */ + +#ifdef __GLEE_GL_INGR_interlace_read +#endif + +/* GL_EXT_stencil_wrap */ + +#ifdef __GLEE_GL_EXT_stencil_wrap +#endif + +/* GL_EXT_422_pixels */ + +#ifdef __GLEE_GL_EXT_422_pixels +#endif + +/* GL_NV_texgen_reflection */ + +#ifdef __GLEE_GL_NV_texgen_reflection +#endif + +/* GL_EXT_texture_cube_map */ + +#ifdef __GLEE_GL_EXT_texture_cube_map +#endif + +/* GL_SUN_convolution_border_modes */ + +#ifdef __GLEE_GL_SUN_convolution_border_modes +#endif + +/* GL_EXT_texture_env_add */ + +#ifdef __GLEE_GL_EXT_texture_env_add +#endif + +/* GL_EXT_texture_lod_bias */ + +#ifdef __GLEE_GL_EXT_texture_lod_bias +#endif + +/* GL_EXT_texture_filter_anisotropic */ + +#ifdef __GLEE_GL_EXT_texture_filter_anisotropic +#endif + +/* GL_EXT_vertex_weighting */ + +#ifdef __GLEE_GL_EXT_vertex_weighting +#ifndef GLEE_C_DEFINED_glVertexWeightfEXT +#define GLEE_C_DEFINED_glVertexWeightfEXT + void __stdcall GLee_Lazy_glVertexWeightfEXT(GLfloat weight) {if (GLeeInit()) glVertexWeightfEXT(weight);} + GLEEPFNGLVERTEXWEIGHTFEXTPROC GLeeFuncPtr_glVertexWeightfEXT=GLee_Lazy_glVertexWeightfEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexWeightfvEXT +#define GLEE_C_DEFINED_glVertexWeightfvEXT + void __stdcall GLee_Lazy_glVertexWeightfvEXT(const GLfloat * weight) {if (GLeeInit()) glVertexWeightfvEXT(weight);} + GLEEPFNGLVERTEXWEIGHTFVEXTPROC GLeeFuncPtr_glVertexWeightfvEXT=GLee_Lazy_glVertexWeightfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexWeightPointerEXT +#define GLEE_C_DEFINED_glVertexWeightPointerEXT + void __stdcall GLee_Lazy_glVertexWeightPointerEXT(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexWeightPointerEXT(size, type, stride, pointer);} + GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC GLeeFuncPtr_glVertexWeightPointerEXT=GLee_Lazy_glVertexWeightPointerEXT; +#endif +#endif + +/* GL_NV_light_max_exponent */ + +#ifdef __GLEE_GL_NV_light_max_exponent +#endif + +/* GL_NV_vertex_array_range */ + +#ifdef __GLEE_GL_NV_vertex_array_range +#ifndef GLEE_C_DEFINED_glFlushVertexArrayRangeNV +#define GLEE_C_DEFINED_glFlushVertexArrayRangeNV + void __stdcall GLee_Lazy_glFlushVertexArrayRangeNV(void) {if (GLeeInit()) glFlushVertexArrayRangeNV();} + GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC GLeeFuncPtr_glFlushVertexArrayRangeNV=GLee_Lazy_glFlushVertexArrayRangeNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexArrayRangeNV +#define GLEE_C_DEFINED_glVertexArrayRangeNV + void __stdcall GLee_Lazy_glVertexArrayRangeNV(GLsizei length, const GLvoid * pointer) {if (GLeeInit()) glVertexArrayRangeNV(length, pointer);} + GLEEPFNGLVERTEXARRAYRANGENVPROC GLeeFuncPtr_glVertexArrayRangeNV=GLee_Lazy_glVertexArrayRangeNV; +#endif +#endif + +/* GL_NV_register_combiners */ + +#ifdef __GLEE_GL_NV_register_combiners +#ifndef GLEE_C_DEFINED_glCombinerParameterfvNV +#define GLEE_C_DEFINED_glCombinerParameterfvNV + void __stdcall GLee_Lazy_glCombinerParameterfvNV(GLenum pname, const GLfloat * params) {if (GLeeInit()) glCombinerParameterfvNV(pname, params);} + GLEEPFNGLCOMBINERPARAMETERFVNVPROC GLeeFuncPtr_glCombinerParameterfvNV=GLee_Lazy_glCombinerParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glCombinerParameterfNV +#define GLEE_C_DEFINED_glCombinerParameterfNV + void __stdcall GLee_Lazy_glCombinerParameterfNV(GLenum pname, GLfloat param) {if (GLeeInit()) glCombinerParameterfNV(pname, param);} + GLEEPFNGLCOMBINERPARAMETERFNVPROC GLeeFuncPtr_glCombinerParameterfNV=GLee_Lazy_glCombinerParameterfNV; +#endif +#ifndef GLEE_C_DEFINED_glCombinerParameterivNV +#define GLEE_C_DEFINED_glCombinerParameterivNV + void __stdcall GLee_Lazy_glCombinerParameterivNV(GLenum pname, const GLint * params) {if (GLeeInit()) glCombinerParameterivNV(pname, params);} + GLEEPFNGLCOMBINERPARAMETERIVNVPROC GLeeFuncPtr_glCombinerParameterivNV=GLee_Lazy_glCombinerParameterivNV; +#endif +#ifndef GLEE_C_DEFINED_glCombinerParameteriNV +#define GLEE_C_DEFINED_glCombinerParameteriNV + void __stdcall GLee_Lazy_glCombinerParameteriNV(GLenum pname, GLint param) {if (GLeeInit()) glCombinerParameteriNV(pname, param);} + GLEEPFNGLCOMBINERPARAMETERINVPROC GLeeFuncPtr_glCombinerParameteriNV=GLee_Lazy_glCombinerParameteriNV; +#endif +#ifndef GLEE_C_DEFINED_glCombinerInputNV +#define GLEE_C_DEFINED_glCombinerInputNV + void __stdcall GLee_Lazy_glCombinerInputNV(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) {if (GLeeInit()) glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage);} + GLEEPFNGLCOMBINERINPUTNVPROC GLeeFuncPtr_glCombinerInputNV=GLee_Lazy_glCombinerInputNV; +#endif +#ifndef GLEE_C_DEFINED_glCombinerOutputNV +#define GLEE_C_DEFINED_glCombinerOutputNV + void __stdcall GLee_Lazy_glCombinerOutputNV(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum) {if (GLeeInit()) glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum);} + GLEEPFNGLCOMBINEROUTPUTNVPROC GLeeFuncPtr_glCombinerOutputNV=GLee_Lazy_glCombinerOutputNV; +#endif +#ifndef GLEE_C_DEFINED_glFinalCombinerInputNV +#define GLEE_C_DEFINED_glFinalCombinerInputNV + void __stdcall GLee_Lazy_glFinalCombinerInputNV(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) {if (GLeeInit()) glFinalCombinerInputNV(variable, input, mapping, componentUsage);} + GLEEPFNGLFINALCOMBINERINPUTNVPROC GLeeFuncPtr_glFinalCombinerInputNV=GLee_Lazy_glFinalCombinerInputNV; +#endif +#ifndef GLEE_C_DEFINED_glGetCombinerInputParameterfvNV +#define GLEE_C_DEFINED_glGetCombinerInputParameterfvNV + void __stdcall GLee_Lazy_glGetCombinerInputParameterfvNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params);} + GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerInputParameterfvNV=GLee_Lazy_glGetCombinerInputParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetCombinerInputParameterivNV +#define GLEE_C_DEFINED_glGetCombinerInputParameterivNV + void __stdcall GLee_Lazy_glGetCombinerInputParameterivNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params) {if (GLeeInit()) glGetCombinerInputParameterivNV(stage, portion, variable, pname, params);} + GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerInputParameterivNV=GLee_Lazy_glGetCombinerInputParameterivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetCombinerOutputParameterfvNV +#define GLEE_C_DEFINED_glGetCombinerOutputParameterfvNV + void __stdcall GLee_Lazy_glGetCombinerOutputParameterfvNV(GLenum stage, GLenum portion, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetCombinerOutputParameterfvNV(stage, portion, pname, params);} + GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterfvNV=GLee_Lazy_glGetCombinerOutputParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetCombinerOutputParameterivNV +#define GLEE_C_DEFINED_glGetCombinerOutputParameterivNV + void __stdcall GLee_Lazy_glGetCombinerOutputParameterivNV(GLenum stage, GLenum portion, GLenum pname, GLint * params) {if (GLeeInit()) glGetCombinerOutputParameterivNV(stage, portion, pname, params);} + GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterivNV=GLee_Lazy_glGetCombinerOutputParameterivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetFinalCombinerInputParameterfvNV +#define GLEE_C_DEFINED_glGetFinalCombinerInputParameterfvNV + void __stdcall GLee_Lazy_glGetFinalCombinerInputParameterfvNV(GLenum variable, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFinalCombinerInputParameterfvNV(variable, pname, params);} + GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV=GLee_Lazy_glGetFinalCombinerInputParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetFinalCombinerInputParameterivNV +#define GLEE_C_DEFINED_glGetFinalCombinerInputParameterivNV + void __stdcall GLee_Lazy_glGetFinalCombinerInputParameterivNV(GLenum variable, GLenum pname, GLint * params) {if (GLeeInit()) glGetFinalCombinerInputParameterivNV(variable, pname, params);} + GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterivNV=GLee_Lazy_glGetFinalCombinerInputParameterivNV; +#endif +#endif + +/* GL_NV_fog_distance */ + +#ifdef __GLEE_GL_NV_fog_distance +#endif + +/* GL_NV_texgen_emboss */ + +#ifdef __GLEE_GL_NV_texgen_emboss +#endif + +/* GL_NV_blend_square */ + +#ifdef __GLEE_GL_NV_blend_square +#endif + +/* GL_NV_texture_env_combine4 */ + +#ifdef __GLEE_GL_NV_texture_env_combine4 +#endif + +/* GL_MESA_resize_buffers */ + +#ifdef __GLEE_GL_MESA_resize_buffers +#ifndef GLEE_C_DEFINED_glResizeBuffersMESA +#define GLEE_C_DEFINED_glResizeBuffersMESA + void __stdcall GLee_Lazy_glResizeBuffersMESA(void) {if (GLeeInit()) glResizeBuffersMESA();} + GLEEPFNGLRESIZEBUFFERSMESAPROC GLeeFuncPtr_glResizeBuffersMESA=GLee_Lazy_glResizeBuffersMESA; +#endif +#endif + +/* GL_MESA_window_pos */ + +#ifdef __GLEE_GL_MESA_window_pos +#ifndef GLEE_C_DEFINED_glWindowPos2dMESA +#define GLEE_C_DEFINED_glWindowPos2dMESA + void __stdcall GLee_Lazy_glWindowPos2dMESA(GLdouble x, GLdouble y) {if (GLeeInit()) glWindowPos2dMESA(x, y);} + GLEEPFNGLWINDOWPOS2DMESAPROC GLeeFuncPtr_glWindowPos2dMESA=GLee_Lazy_glWindowPos2dMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2dvMESA +#define GLEE_C_DEFINED_glWindowPos2dvMESA + void __stdcall GLee_Lazy_glWindowPos2dvMESA(const GLdouble * v) {if (GLeeInit()) glWindowPos2dvMESA(v);} + GLEEPFNGLWINDOWPOS2DVMESAPROC GLeeFuncPtr_glWindowPos2dvMESA=GLee_Lazy_glWindowPos2dvMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2fMESA +#define GLEE_C_DEFINED_glWindowPos2fMESA + void __stdcall GLee_Lazy_glWindowPos2fMESA(GLfloat x, GLfloat y) {if (GLeeInit()) glWindowPos2fMESA(x, y);} + GLEEPFNGLWINDOWPOS2FMESAPROC GLeeFuncPtr_glWindowPos2fMESA=GLee_Lazy_glWindowPos2fMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2fvMESA +#define GLEE_C_DEFINED_glWindowPos2fvMESA + void __stdcall GLee_Lazy_glWindowPos2fvMESA(const GLfloat * v) {if (GLeeInit()) glWindowPos2fvMESA(v);} + GLEEPFNGLWINDOWPOS2FVMESAPROC GLeeFuncPtr_glWindowPos2fvMESA=GLee_Lazy_glWindowPos2fvMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2iMESA +#define GLEE_C_DEFINED_glWindowPos2iMESA + void __stdcall GLee_Lazy_glWindowPos2iMESA(GLint x, GLint y) {if (GLeeInit()) glWindowPos2iMESA(x, y);} + GLEEPFNGLWINDOWPOS2IMESAPROC GLeeFuncPtr_glWindowPos2iMESA=GLee_Lazy_glWindowPos2iMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2ivMESA +#define GLEE_C_DEFINED_glWindowPos2ivMESA + void __stdcall GLee_Lazy_glWindowPos2ivMESA(const GLint * v) {if (GLeeInit()) glWindowPos2ivMESA(v);} + GLEEPFNGLWINDOWPOS2IVMESAPROC GLeeFuncPtr_glWindowPos2ivMESA=GLee_Lazy_glWindowPos2ivMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2sMESA +#define GLEE_C_DEFINED_glWindowPos2sMESA + void __stdcall GLee_Lazy_glWindowPos2sMESA(GLshort x, GLshort y) {if (GLeeInit()) glWindowPos2sMESA(x, y);} + GLEEPFNGLWINDOWPOS2SMESAPROC GLeeFuncPtr_glWindowPos2sMESA=GLee_Lazy_glWindowPos2sMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos2svMESA +#define GLEE_C_DEFINED_glWindowPos2svMESA + void __stdcall GLee_Lazy_glWindowPos2svMESA(const GLshort * v) {if (GLeeInit()) glWindowPos2svMESA(v);} + GLEEPFNGLWINDOWPOS2SVMESAPROC GLeeFuncPtr_glWindowPos2svMESA=GLee_Lazy_glWindowPos2svMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3dMESA +#define GLEE_C_DEFINED_glWindowPos3dMESA + void __stdcall GLee_Lazy_glWindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glWindowPos3dMESA(x, y, z);} + GLEEPFNGLWINDOWPOS3DMESAPROC GLeeFuncPtr_glWindowPos3dMESA=GLee_Lazy_glWindowPos3dMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3dvMESA +#define GLEE_C_DEFINED_glWindowPos3dvMESA + void __stdcall GLee_Lazy_glWindowPos3dvMESA(const GLdouble * v) {if (GLeeInit()) glWindowPos3dvMESA(v);} + GLEEPFNGLWINDOWPOS3DVMESAPROC GLeeFuncPtr_glWindowPos3dvMESA=GLee_Lazy_glWindowPos3dvMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3fMESA +#define GLEE_C_DEFINED_glWindowPos3fMESA + void __stdcall GLee_Lazy_glWindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glWindowPos3fMESA(x, y, z);} + GLEEPFNGLWINDOWPOS3FMESAPROC GLeeFuncPtr_glWindowPos3fMESA=GLee_Lazy_glWindowPos3fMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3fvMESA +#define GLEE_C_DEFINED_glWindowPos3fvMESA + void __stdcall GLee_Lazy_glWindowPos3fvMESA(const GLfloat * v) {if (GLeeInit()) glWindowPos3fvMESA(v);} + GLEEPFNGLWINDOWPOS3FVMESAPROC GLeeFuncPtr_glWindowPos3fvMESA=GLee_Lazy_glWindowPos3fvMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3iMESA +#define GLEE_C_DEFINED_glWindowPos3iMESA + void __stdcall GLee_Lazy_glWindowPos3iMESA(GLint x, GLint y, GLint z) {if (GLeeInit()) glWindowPos3iMESA(x, y, z);} + GLEEPFNGLWINDOWPOS3IMESAPROC GLeeFuncPtr_glWindowPos3iMESA=GLee_Lazy_glWindowPos3iMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3ivMESA +#define GLEE_C_DEFINED_glWindowPos3ivMESA + void __stdcall GLee_Lazy_glWindowPos3ivMESA(const GLint * v) {if (GLeeInit()) glWindowPos3ivMESA(v);} + GLEEPFNGLWINDOWPOS3IVMESAPROC GLeeFuncPtr_glWindowPos3ivMESA=GLee_Lazy_glWindowPos3ivMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3sMESA +#define GLEE_C_DEFINED_glWindowPos3sMESA + void __stdcall GLee_Lazy_glWindowPos3sMESA(GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glWindowPos3sMESA(x, y, z);} + GLEEPFNGLWINDOWPOS3SMESAPROC GLeeFuncPtr_glWindowPos3sMESA=GLee_Lazy_glWindowPos3sMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos3svMESA +#define GLEE_C_DEFINED_glWindowPos3svMESA + void __stdcall GLee_Lazy_glWindowPos3svMESA(const GLshort * v) {if (GLeeInit()) glWindowPos3svMESA(v);} + GLEEPFNGLWINDOWPOS3SVMESAPROC GLeeFuncPtr_glWindowPos3svMESA=GLee_Lazy_glWindowPos3svMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4dMESA +#define GLEE_C_DEFINED_glWindowPos4dMESA + void __stdcall GLee_Lazy_glWindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glWindowPos4dMESA(x, y, z, w);} + GLEEPFNGLWINDOWPOS4DMESAPROC GLeeFuncPtr_glWindowPos4dMESA=GLee_Lazy_glWindowPos4dMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4dvMESA +#define GLEE_C_DEFINED_glWindowPos4dvMESA + void __stdcall GLee_Lazy_glWindowPos4dvMESA(const GLdouble * v) {if (GLeeInit()) glWindowPos4dvMESA(v);} + GLEEPFNGLWINDOWPOS4DVMESAPROC GLeeFuncPtr_glWindowPos4dvMESA=GLee_Lazy_glWindowPos4dvMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4fMESA +#define GLEE_C_DEFINED_glWindowPos4fMESA + void __stdcall GLee_Lazy_glWindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glWindowPos4fMESA(x, y, z, w);} + GLEEPFNGLWINDOWPOS4FMESAPROC GLeeFuncPtr_glWindowPos4fMESA=GLee_Lazy_glWindowPos4fMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4fvMESA +#define GLEE_C_DEFINED_glWindowPos4fvMESA + void __stdcall GLee_Lazy_glWindowPos4fvMESA(const GLfloat * v) {if (GLeeInit()) glWindowPos4fvMESA(v);} + GLEEPFNGLWINDOWPOS4FVMESAPROC GLeeFuncPtr_glWindowPos4fvMESA=GLee_Lazy_glWindowPos4fvMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4iMESA +#define GLEE_C_DEFINED_glWindowPos4iMESA + void __stdcall GLee_Lazy_glWindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glWindowPos4iMESA(x, y, z, w);} + GLEEPFNGLWINDOWPOS4IMESAPROC GLeeFuncPtr_glWindowPos4iMESA=GLee_Lazy_glWindowPos4iMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4ivMESA +#define GLEE_C_DEFINED_glWindowPos4ivMESA + void __stdcall GLee_Lazy_glWindowPos4ivMESA(const GLint * v) {if (GLeeInit()) glWindowPos4ivMESA(v);} + GLEEPFNGLWINDOWPOS4IVMESAPROC GLeeFuncPtr_glWindowPos4ivMESA=GLee_Lazy_glWindowPos4ivMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4sMESA +#define GLEE_C_DEFINED_glWindowPos4sMESA + void __stdcall GLee_Lazy_glWindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glWindowPos4sMESA(x, y, z, w);} + GLEEPFNGLWINDOWPOS4SMESAPROC GLeeFuncPtr_glWindowPos4sMESA=GLee_Lazy_glWindowPos4sMESA; +#endif +#ifndef GLEE_C_DEFINED_glWindowPos4svMESA +#define GLEE_C_DEFINED_glWindowPos4svMESA + void __stdcall GLee_Lazy_glWindowPos4svMESA(const GLshort * v) {if (GLeeInit()) glWindowPos4svMESA(v);} + GLEEPFNGLWINDOWPOS4SVMESAPROC GLeeFuncPtr_glWindowPos4svMESA=GLee_Lazy_glWindowPos4svMESA; +#endif +#endif + +/* GL_EXT_texture_compression_s3tc */ + +#ifdef __GLEE_GL_EXT_texture_compression_s3tc +#endif + +/* GL_IBM_cull_vertex */ + +#ifdef __GLEE_GL_IBM_cull_vertex +#endif + +/* GL_IBM_multimode_draw_arrays */ + +#ifdef __GLEE_GL_IBM_multimode_draw_arrays +#ifndef GLEE_C_DEFINED_glMultiModeDrawArraysIBM +#define GLEE_C_DEFINED_glMultiModeDrawArraysIBM + void __stdcall GLee_Lazy_glMultiModeDrawArraysIBM(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride) {if (GLeeInit()) glMultiModeDrawArraysIBM(mode, first, count, primcount, modestride);} + GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC GLeeFuncPtr_glMultiModeDrawArraysIBM=GLee_Lazy_glMultiModeDrawArraysIBM; +#endif +#ifndef GLEE_C_DEFINED_glMultiModeDrawElementsIBM +#define GLEE_C_DEFINED_glMultiModeDrawElementsIBM + void __stdcall GLee_Lazy_glMultiModeDrawElementsIBM(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid* const * indices, GLsizei primcount, GLint modestride) {if (GLeeInit()) glMultiModeDrawElementsIBM(mode, count, type, indices, primcount, modestride);} + GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC GLeeFuncPtr_glMultiModeDrawElementsIBM=GLee_Lazy_glMultiModeDrawElementsIBM; +#endif +#endif + +/* GL_IBM_vertex_array_lists */ + +#ifdef __GLEE_GL_IBM_vertex_array_lists +#ifndef GLEE_C_DEFINED_glColorPointerListIBM +#define GLEE_C_DEFINED_glColorPointerListIBM + void __stdcall GLee_Lazy_glColorPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glColorPointerListIBM(size, type, stride, pointer, ptrstride);} + GLEEPFNGLCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glColorPointerListIBM=GLee_Lazy_glColorPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColorPointerListIBM +#define GLEE_C_DEFINED_glSecondaryColorPointerListIBM + void __stdcall GLee_Lazy_glSecondaryColorPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glSecondaryColorPointerListIBM(size, type, stride, pointer, ptrstride);} + GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glSecondaryColorPointerListIBM=GLee_Lazy_glSecondaryColorPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glEdgeFlagPointerListIBM +#define GLEE_C_DEFINED_glEdgeFlagPointerListIBM + void __stdcall GLee_Lazy_glEdgeFlagPointerListIBM(GLint stride, const GLboolean* * pointer, GLint ptrstride) {if (GLeeInit()) glEdgeFlagPointerListIBM(stride, pointer, ptrstride);} + GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC GLeeFuncPtr_glEdgeFlagPointerListIBM=GLee_Lazy_glEdgeFlagPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordPointerListIBM +#define GLEE_C_DEFINED_glFogCoordPointerListIBM + void __stdcall GLee_Lazy_glFogCoordPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glFogCoordPointerListIBM(type, stride, pointer, ptrstride);} + GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glFogCoordPointerListIBM=GLee_Lazy_glFogCoordPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glIndexPointerListIBM +#define GLEE_C_DEFINED_glIndexPointerListIBM + void __stdcall GLee_Lazy_glIndexPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glIndexPointerListIBM(type, stride, pointer, ptrstride);} + GLEEPFNGLINDEXPOINTERLISTIBMPROC GLeeFuncPtr_glIndexPointerListIBM=GLee_Lazy_glIndexPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glNormalPointerListIBM +#define GLEE_C_DEFINED_glNormalPointerListIBM + void __stdcall GLee_Lazy_glNormalPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glNormalPointerListIBM(type, stride, pointer, ptrstride);} + GLEEPFNGLNORMALPOINTERLISTIBMPROC GLeeFuncPtr_glNormalPointerListIBM=GLee_Lazy_glNormalPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glTexCoordPointerListIBM +#define GLEE_C_DEFINED_glTexCoordPointerListIBM + void __stdcall GLee_Lazy_glTexCoordPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glTexCoordPointerListIBM(size, type, stride, pointer, ptrstride);} + GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glTexCoordPointerListIBM=GLee_Lazy_glTexCoordPointerListIBM; +#endif +#ifndef GLEE_C_DEFINED_glVertexPointerListIBM +#define GLEE_C_DEFINED_glVertexPointerListIBM + void __stdcall GLee_Lazy_glVertexPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride) {if (GLeeInit()) glVertexPointerListIBM(size, type, stride, pointer, ptrstride);} + GLEEPFNGLVERTEXPOINTERLISTIBMPROC GLeeFuncPtr_glVertexPointerListIBM=GLee_Lazy_glVertexPointerListIBM; +#endif +#endif + +/* GL_SGIX_subsample */ + +#ifdef __GLEE_GL_SGIX_subsample +#endif + +/* GL_SGIX_ycrcb_subsample */ + +#ifdef __GLEE_GL_SGIX_ycrcb_subsample +#endif + +/* GL_SGIX_ycrcba */ + +#ifdef __GLEE_GL_SGIX_ycrcba +#endif + +/* GL_SGI_depth_pass_instrument */ + +#ifdef __GLEE_GL_SGI_depth_pass_instrument +#endif + +/* GL_3DFX_texture_compression_FXT1 */ + +#ifdef __GLEE_GL_3DFX_texture_compression_FXT1 +#endif + +/* GL_3DFX_multisample */ + +#ifdef __GLEE_GL_3DFX_multisample +#endif + +/* GL_3DFX_tbuffer */ + +#ifdef __GLEE_GL_3DFX_tbuffer +#ifndef GLEE_C_DEFINED_glTbufferMask3DFX +#define GLEE_C_DEFINED_glTbufferMask3DFX + void __stdcall GLee_Lazy_glTbufferMask3DFX(GLuint mask) {if (GLeeInit()) glTbufferMask3DFX(mask);} + GLEEPFNGLTBUFFERMASK3DFXPROC GLeeFuncPtr_glTbufferMask3DFX=GLee_Lazy_glTbufferMask3DFX; +#endif +#endif + +/* GL_EXT_multisample */ + +#ifdef __GLEE_GL_EXT_multisample +#ifndef GLEE_C_DEFINED_glSampleMaskEXT +#define GLEE_C_DEFINED_glSampleMaskEXT + void __stdcall GLee_Lazy_glSampleMaskEXT(GLclampf value, GLboolean invert) {if (GLeeInit()) glSampleMaskEXT(value, invert);} + GLEEPFNGLSAMPLEMASKEXTPROC GLeeFuncPtr_glSampleMaskEXT=GLee_Lazy_glSampleMaskEXT; +#endif +#ifndef GLEE_C_DEFINED_glSamplePatternEXT +#define GLEE_C_DEFINED_glSamplePatternEXT + void __stdcall GLee_Lazy_glSamplePatternEXT(GLenum pattern) {if (GLeeInit()) glSamplePatternEXT(pattern);} + GLEEPFNGLSAMPLEPATTERNEXTPROC GLeeFuncPtr_glSamplePatternEXT=GLee_Lazy_glSamplePatternEXT; +#endif +#endif + +/* GL_SGIX_vertex_preclip */ + +#ifdef __GLEE_GL_SGIX_vertex_preclip +#endif + +/* GL_SGIX_convolution_accuracy */ + +#ifdef __GLEE_GL_SGIX_convolution_accuracy +#endif + +/* GL_SGIX_resample */ + +#ifdef __GLEE_GL_SGIX_resample +#endif + +/* GL_SGIS_point_line_texgen */ + +#ifdef __GLEE_GL_SGIS_point_line_texgen +#endif + +/* GL_SGIS_texture_color_mask */ + +#ifdef __GLEE_GL_SGIS_texture_color_mask +#ifndef GLEE_C_DEFINED_glTextureColorMaskSGIS +#define GLEE_C_DEFINED_glTextureColorMaskSGIS + void __stdcall GLee_Lazy_glTextureColorMaskSGIS(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {if (GLeeInit()) glTextureColorMaskSGIS(red, green, blue, alpha);} + GLEEPFNGLTEXTURECOLORMASKSGISPROC GLeeFuncPtr_glTextureColorMaskSGIS=GLee_Lazy_glTextureColorMaskSGIS; +#endif +#endif + +/* GL_EXT_texture_env_dot3 */ + +#ifdef __GLEE_GL_EXT_texture_env_dot3 +#endif + +/* GL_ATI_texture_mirror_once */ + +#ifdef __GLEE_GL_ATI_texture_mirror_once +#endif + +/* GL_NV_fence */ + +#ifdef __GLEE_GL_NV_fence +#ifndef GLEE_C_DEFINED_glDeleteFencesNV +#define GLEE_C_DEFINED_glDeleteFencesNV + void __stdcall GLee_Lazy_glDeleteFencesNV(GLsizei n, const GLuint * fences) {if (GLeeInit()) glDeleteFencesNV(n, fences);} + GLEEPFNGLDELETEFENCESNVPROC GLeeFuncPtr_glDeleteFencesNV=GLee_Lazy_glDeleteFencesNV; +#endif +#ifndef GLEE_C_DEFINED_glGenFencesNV +#define GLEE_C_DEFINED_glGenFencesNV + void __stdcall GLee_Lazy_glGenFencesNV(GLsizei n, GLuint * fences) {if (GLeeInit()) glGenFencesNV(n, fences);} + GLEEPFNGLGENFENCESNVPROC GLeeFuncPtr_glGenFencesNV=GLee_Lazy_glGenFencesNV; +#endif +#ifndef GLEE_C_DEFINED_glIsFenceNV +#define GLEE_C_DEFINED_glIsFenceNV + GLboolean __stdcall GLee_Lazy_glIsFenceNV(GLuint fence) {if (GLeeInit()) return glIsFenceNV(fence); return (GLboolean)0;} + GLEEPFNGLISFENCENVPROC GLeeFuncPtr_glIsFenceNV=GLee_Lazy_glIsFenceNV; +#endif +#ifndef GLEE_C_DEFINED_glTestFenceNV +#define GLEE_C_DEFINED_glTestFenceNV + GLboolean __stdcall GLee_Lazy_glTestFenceNV(GLuint fence) {if (GLeeInit()) return glTestFenceNV(fence); return (GLboolean)0;} + GLEEPFNGLTESTFENCENVPROC GLeeFuncPtr_glTestFenceNV=GLee_Lazy_glTestFenceNV; +#endif +#ifndef GLEE_C_DEFINED_glGetFenceivNV +#define GLEE_C_DEFINED_glGetFenceivNV + void __stdcall GLee_Lazy_glGetFenceivNV(GLuint fence, GLenum pname, GLint * params) {if (GLeeInit()) glGetFenceivNV(fence, pname, params);} + GLEEPFNGLGETFENCEIVNVPROC GLeeFuncPtr_glGetFenceivNV=GLee_Lazy_glGetFenceivNV; +#endif +#ifndef GLEE_C_DEFINED_glFinishFenceNV +#define GLEE_C_DEFINED_glFinishFenceNV + void __stdcall GLee_Lazy_glFinishFenceNV(GLuint fence) {if (GLeeInit()) glFinishFenceNV(fence);} + GLEEPFNGLFINISHFENCENVPROC GLeeFuncPtr_glFinishFenceNV=GLee_Lazy_glFinishFenceNV; +#endif +#ifndef GLEE_C_DEFINED_glSetFenceNV +#define GLEE_C_DEFINED_glSetFenceNV + void __stdcall GLee_Lazy_glSetFenceNV(GLuint fence, GLenum condition) {if (GLeeInit()) glSetFenceNV(fence, condition);} + GLEEPFNGLSETFENCENVPROC GLeeFuncPtr_glSetFenceNV=GLee_Lazy_glSetFenceNV; +#endif +#endif + +/* GL_IBM_texture_mirrored_repeat */ + +#ifdef __GLEE_GL_IBM_texture_mirrored_repeat +#endif + +/* GL_NV_evaluators */ + +#ifdef __GLEE_GL_NV_evaluators +#ifndef GLEE_C_DEFINED_glMapControlPointsNV +#define GLEE_C_DEFINED_glMapControlPointsNV + void __stdcall GLee_Lazy_glMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * points) {if (GLeeInit()) glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points);} + GLEEPFNGLMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glMapControlPointsNV=GLee_Lazy_glMapControlPointsNV; +#endif +#ifndef GLEE_C_DEFINED_glMapParameterivNV +#define GLEE_C_DEFINED_glMapParameterivNV + void __stdcall GLee_Lazy_glMapParameterivNV(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMapParameterivNV(target, pname, params);} + GLEEPFNGLMAPPARAMETERIVNVPROC GLeeFuncPtr_glMapParameterivNV=GLee_Lazy_glMapParameterivNV; +#endif +#ifndef GLEE_C_DEFINED_glMapParameterfvNV +#define GLEE_C_DEFINED_glMapParameterfvNV + void __stdcall GLee_Lazy_glMapParameterfvNV(GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMapParameterfvNV(target, pname, params);} + GLEEPFNGLMAPPARAMETERFVNVPROC GLeeFuncPtr_glMapParameterfvNV=GLee_Lazy_glMapParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetMapControlPointsNV +#define GLEE_C_DEFINED_glGetMapControlPointsNV + void __stdcall GLee_Lazy_glGetMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid * points) {if (GLeeInit()) glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points);} + GLEEPFNGLGETMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glGetMapControlPointsNV=GLee_Lazy_glGetMapControlPointsNV; +#endif +#ifndef GLEE_C_DEFINED_glGetMapParameterivNV +#define GLEE_C_DEFINED_glGetMapParameterivNV + void __stdcall GLee_Lazy_glGetMapParameterivNV(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMapParameterivNV(target, pname, params);} + GLEEPFNGLGETMAPPARAMETERIVNVPROC GLeeFuncPtr_glGetMapParameterivNV=GLee_Lazy_glGetMapParameterivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetMapParameterfvNV +#define GLEE_C_DEFINED_glGetMapParameterfvNV + void __stdcall GLee_Lazy_glGetMapParameterfvNV(GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMapParameterfvNV(target, pname, params);} + GLEEPFNGLGETMAPPARAMETERFVNVPROC GLeeFuncPtr_glGetMapParameterfvNV=GLee_Lazy_glGetMapParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetMapAttribParameterivNV +#define GLEE_C_DEFINED_glGetMapAttribParameterivNV + void __stdcall GLee_Lazy_glGetMapAttribParameterivNV(GLenum target, GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetMapAttribParameterivNV(target, index, pname, params);} + GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC GLeeFuncPtr_glGetMapAttribParameterivNV=GLee_Lazy_glGetMapAttribParameterivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetMapAttribParameterfvNV +#define GLEE_C_DEFINED_glGetMapAttribParameterfvNV + void __stdcall GLee_Lazy_glGetMapAttribParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMapAttribParameterfvNV(target, index, pname, params);} + GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC GLeeFuncPtr_glGetMapAttribParameterfvNV=GLee_Lazy_glGetMapAttribParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glEvalMapsNV +#define GLEE_C_DEFINED_glEvalMapsNV + void __stdcall GLee_Lazy_glEvalMapsNV(GLenum target, GLenum mode) {if (GLeeInit()) glEvalMapsNV(target, mode);} + GLEEPFNGLEVALMAPSNVPROC GLeeFuncPtr_glEvalMapsNV=GLee_Lazy_glEvalMapsNV; +#endif +#endif + +/* GL_NV_packed_depth_stencil */ + +#ifdef __GLEE_GL_NV_packed_depth_stencil +#endif + +/* GL_NV_register_combiners2 */ + +#ifdef __GLEE_GL_NV_register_combiners2 +#ifndef GLEE_C_DEFINED_glCombinerStageParameterfvNV +#define GLEE_C_DEFINED_glCombinerStageParameterfvNV + void __stdcall GLee_Lazy_glCombinerStageParameterfvNV(GLenum stage, GLenum pname, const GLfloat * params) {if (GLeeInit()) glCombinerStageParameterfvNV(stage, pname, params);} + GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glCombinerStageParameterfvNV=GLee_Lazy_glCombinerStageParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetCombinerStageParameterfvNV +#define GLEE_C_DEFINED_glGetCombinerStageParameterfvNV + void __stdcall GLee_Lazy_glGetCombinerStageParameterfvNV(GLenum stage, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetCombinerStageParameterfvNV(stage, pname, params);} + GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerStageParameterfvNV=GLee_Lazy_glGetCombinerStageParameterfvNV; +#endif +#endif + +/* GL_NV_texture_compression_vtc */ + +#ifdef __GLEE_GL_NV_texture_compression_vtc +#endif + +/* GL_NV_texture_rectangle */ + +#ifdef __GLEE_GL_NV_texture_rectangle +#endif + +/* GL_NV_texture_shader */ + +#ifdef __GLEE_GL_NV_texture_shader +#endif + +/* GL_NV_texture_shader2 */ + +#ifdef __GLEE_GL_NV_texture_shader2 +#endif + +/* GL_NV_vertex_array_range2 */ + +#ifdef __GLEE_GL_NV_vertex_array_range2 +#endif + +/* GL_NV_vertex_program */ + +#ifdef __GLEE_GL_NV_vertex_program +#ifndef GLEE_C_DEFINED_glAreProgramsResidentNV +#define GLEE_C_DEFINED_glAreProgramsResidentNV + GLboolean __stdcall GLee_Lazy_glAreProgramsResidentNV(GLsizei n, const GLuint * programs, GLboolean * residences) {if (GLeeInit()) return glAreProgramsResidentNV(n, programs, residences); return (GLboolean)0;} + GLEEPFNGLAREPROGRAMSRESIDENTNVPROC GLeeFuncPtr_glAreProgramsResidentNV=GLee_Lazy_glAreProgramsResidentNV; +#endif +#ifndef GLEE_C_DEFINED_glBindProgramNV +#define GLEE_C_DEFINED_glBindProgramNV + void __stdcall GLee_Lazy_glBindProgramNV(GLenum target, GLuint id) {if (GLeeInit()) glBindProgramNV(target, id);} + GLEEPFNGLBINDPROGRAMNVPROC GLeeFuncPtr_glBindProgramNV=GLee_Lazy_glBindProgramNV; +#endif +#ifndef GLEE_C_DEFINED_glDeleteProgramsNV +#define GLEE_C_DEFINED_glDeleteProgramsNV + void __stdcall GLee_Lazy_glDeleteProgramsNV(GLsizei n, const GLuint * programs) {if (GLeeInit()) glDeleteProgramsNV(n, programs);} + GLEEPFNGLDELETEPROGRAMSNVPROC GLeeFuncPtr_glDeleteProgramsNV=GLee_Lazy_glDeleteProgramsNV; +#endif +#ifndef GLEE_C_DEFINED_glExecuteProgramNV +#define GLEE_C_DEFINED_glExecuteProgramNV + void __stdcall GLee_Lazy_glExecuteProgramNV(GLenum target, GLuint id, const GLfloat * params) {if (GLeeInit()) glExecuteProgramNV(target, id, params);} + GLEEPFNGLEXECUTEPROGRAMNVPROC GLeeFuncPtr_glExecuteProgramNV=GLee_Lazy_glExecuteProgramNV; +#endif +#ifndef GLEE_C_DEFINED_glGenProgramsNV +#define GLEE_C_DEFINED_glGenProgramsNV + void __stdcall GLee_Lazy_glGenProgramsNV(GLsizei n, GLuint * programs) {if (GLeeInit()) glGenProgramsNV(n, programs);} + GLEEPFNGLGENPROGRAMSNVPROC GLeeFuncPtr_glGenProgramsNV=GLee_Lazy_glGenProgramsNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramParameterdvNV +#define GLEE_C_DEFINED_glGetProgramParameterdvNV + void __stdcall GLee_Lazy_glGetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetProgramParameterdvNV(target, index, pname, params);} + GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramParameterdvNV=GLee_Lazy_glGetProgramParameterdvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramParameterfvNV +#define GLEE_C_DEFINED_glGetProgramParameterfvNV + void __stdcall GLee_Lazy_glGetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetProgramParameterfvNV(target, index, pname, params);} + GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramParameterfvNV=GLee_Lazy_glGetProgramParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramivNV +#define GLEE_C_DEFINED_glGetProgramivNV + void __stdcall GLee_Lazy_glGetProgramivNV(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetProgramivNV(id, pname, params);} + GLEEPFNGLGETPROGRAMIVNVPROC GLeeFuncPtr_glGetProgramivNV=GLee_Lazy_glGetProgramivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramStringNV +#define GLEE_C_DEFINED_glGetProgramStringNV + void __stdcall GLee_Lazy_glGetProgramStringNV(GLuint id, GLenum pname, GLubyte * program) {if (GLeeInit()) glGetProgramStringNV(id, pname, program);} + GLEEPFNGLGETPROGRAMSTRINGNVPROC GLeeFuncPtr_glGetProgramStringNV=GLee_Lazy_glGetProgramStringNV; +#endif +#ifndef GLEE_C_DEFINED_glGetTrackMatrixivNV +#define GLEE_C_DEFINED_glGetTrackMatrixivNV + void __stdcall GLee_Lazy_glGetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint * params) {if (GLeeInit()) glGetTrackMatrixivNV(target, address, pname, params);} + GLEEPFNGLGETTRACKMATRIXIVNVPROC GLeeFuncPtr_glGetTrackMatrixivNV=GLee_Lazy_glGetTrackMatrixivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribdvNV +#define GLEE_C_DEFINED_glGetVertexAttribdvNV + void __stdcall GLee_Lazy_glGetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetVertexAttribdvNV(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBDVNVPROC GLeeFuncPtr_glGetVertexAttribdvNV=GLee_Lazy_glGetVertexAttribdvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribfvNV +#define GLEE_C_DEFINED_glGetVertexAttribfvNV + void __stdcall GLee_Lazy_glGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribfvNV(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBFVNVPROC GLeeFuncPtr_glGetVertexAttribfvNV=GLee_Lazy_glGetVertexAttribfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribivNV +#define GLEE_C_DEFINED_glGetVertexAttribivNV + void __stdcall GLee_Lazy_glGetVertexAttribivNV(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribivNV(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIVNVPROC GLeeFuncPtr_glGetVertexAttribivNV=GLee_Lazy_glGetVertexAttribivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribPointervNV +#define GLEE_C_DEFINED_glGetVertexAttribPointervNV + void __stdcall GLee_Lazy_glGetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid* * pointer) {if (GLeeInit()) glGetVertexAttribPointervNV(index, pname, pointer);} + GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC GLeeFuncPtr_glGetVertexAttribPointervNV=GLee_Lazy_glGetVertexAttribPointervNV; +#endif +#ifndef GLEE_C_DEFINED_glIsProgramNV +#define GLEE_C_DEFINED_glIsProgramNV + GLboolean __stdcall GLee_Lazy_glIsProgramNV(GLuint id) {if (GLeeInit()) return glIsProgramNV(id); return (GLboolean)0;} + GLEEPFNGLISPROGRAMNVPROC GLeeFuncPtr_glIsProgramNV=GLee_Lazy_glIsProgramNV; +#endif +#ifndef GLEE_C_DEFINED_glLoadProgramNV +#define GLEE_C_DEFINED_glLoadProgramNV + void __stdcall GLee_Lazy_glLoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte * program) {if (GLeeInit()) glLoadProgramNV(target, id, len, program);} + GLEEPFNGLLOADPROGRAMNVPROC GLeeFuncPtr_glLoadProgramNV=GLee_Lazy_glLoadProgramNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramParameter4dNV +#define GLEE_C_DEFINED_glProgramParameter4dNV + void __stdcall GLee_Lazy_glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramParameter4dNV(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMPARAMETER4DNVPROC GLeeFuncPtr_glProgramParameter4dNV=GLee_Lazy_glProgramParameter4dNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramParameter4dvNV +#define GLEE_C_DEFINED_glProgramParameter4dvNV + void __stdcall GLee_Lazy_glProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble * v) {if (GLeeInit()) glProgramParameter4dvNV(target, index, v);} + GLEEPFNGLPROGRAMPARAMETER4DVNVPROC GLeeFuncPtr_glProgramParameter4dvNV=GLee_Lazy_glProgramParameter4dvNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramParameter4fNV +#define GLEE_C_DEFINED_glProgramParameter4fNV + void __stdcall GLee_Lazy_glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramParameter4fNV(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMPARAMETER4FNVPROC GLeeFuncPtr_glProgramParameter4fNV=GLee_Lazy_glProgramParameter4fNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramParameter4fvNV +#define GLEE_C_DEFINED_glProgramParameter4fvNV + void __stdcall GLee_Lazy_glProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat * v) {if (GLeeInit()) glProgramParameter4fvNV(target, index, v);} + GLEEPFNGLPROGRAMPARAMETER4FVNVPROC GLeeFuncPtr_glProgramParameter4fvNV=GLee_Lazy_glProgramParameter4fvNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramParameters4dvNV +#define GLEE_C_DEFINED_glProgramParameters4dvNV + void __stdcall GLee_Lazy_glProgramParameters4dvNV(GLenum target, GLuint index, GLuint count, const GLdouble * v) {if (GLeeInit()) glProgramParameters4dvNV(target, index, count, v);} + GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC GLeeFuncPtr_glProgramParameters4dvNV=GLee_Lazy_glProgramParameters4dvNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramParameters4fvNV +#define GLEE_C_DEFINED_glProgramParameters4fvNV + void __stdcall GLee_Lazy_glProgramParameters4fvNV(GLenum target, GLuint index, GLuint count, const GLfloat * v) {if (GLeeInit()) glProgramParameters4fvNV(target, index, count, v);} + GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC GLeeFuncPtr_glProgramParameters4fvNV=GLee_Lazy_glProgramParameters4fvNV; +#endif +#ifndef GLEE_C_DEFINED_glRequestResidentProgramsNV +#define GLEE_C_DEFINED_glRequestResidentProgramsNV + void __stdcall GLee_Lazy_glRequestResidentProgramsNV(GLsizei n, const GLuint * programs) {if (GLeeInit()) glRequestResidentProgramsNV(n, programs);} + GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC GLeeFuncPtr_glRequestResidentProgramsNV=GLee_Lazy_glRequestResidentProgramsNV; +#endif +#ifndef GLEE_C_DEFINED_glTrackMatrixNV +#define GLEE_C_DEFINED_glTrackMatrixNV + void __stdcall GLee_Lazy_glTrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform) {if (GLeeInit()) glTrackMatrixNV(target, address, matrix, transform);} + GLEEPFNGLTRACKMATRIXNVPROC GLeeFuncPtr_glTrackMatrixNV=GLee_Lazy_glTrackMatrixNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribPointerNV +#define GLEE_C_DEFINED_glVertexAttribPointerNV + void __stdcall GLee_Lazy_glVertexAttribPointerNV(GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribPointerNV(index, fsize, type, stride, pointer);} + GLEEPFNGLVERTEXATTRIBPOINTERNVPROC GLeeFuncPtr_glVertexAttribPointerNV=GLee_Lazy_glVertexAttribPointerNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1dNV +#define GLEE_C_DEFINED_glVertexAttrib1dNV + void __stdcall GLee_Lazy_glVertexAttrib1dNV(GLuint index, GLdouble x) {if (GLeeInit()) glVertexAttrib1dNV(index, x);} + GLEEPFNGLVERTEXATTRIB1DNVPROC GLeeFuncPtr_glVertexAttrib1dNV=GLee_Lazy_glVertexAttrib1dNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1dvNV +#define GLEE_C_DEFINED_glVertexAttrib1dvNV + void __stdcall GLee_Lazy_glVertexAttrib1dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib1dvNV(index, v);} + GLEEPFNGLVERTEXATTRIB1DVNVPROC GLeeFuncPtr_glVertexAttrib1dvNV=GLee_Lazy_glVertexAttrib1dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1fNV +#define GLEE_C_DEFINED_glVertexAttrib1fNV + void __stdcall GLee_Lazy_glVertexAttrib1fNV(GLuint index, GLfloat x) {if (GLeeInit()) glVertexAttrib1fNV(index, x);} + GLEEPFNGLVERTEXATTRIB1FNVPROC GLeeFuncPtr_glVertexAttrib1fNV=GLee_Lazy_glVertexAttrib1fNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1fvNV +#define GLEE_C_DEFINED_glVertexAttrib1fvNV + void __stdcall GLee_Lazy_glVertexAttrib1fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib1fvNV(index, v);} + GLEEPFNGLVERTEXATTRIB1FVNVPROC GLeeFuncPtr_glVertexAttrib1fvNV=GLee_Lazy_glVertexAttrib1fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1sNV +#define GLEE_C_DEFINED_glVertexAttrib1sNV + void __stdcall GLee_Lazy_glVertexAttrib1sNV(GLuint index, GLshort x) {if (GLeeInit()) glVertexAttrib1sNV(index, x);} + GLEEPFNGLVERTEXATTRIB1SNVPROC GLeeFuncPtr_glVertexAttrib1sNV=GLee_Lazy_glVertexAttrib1sNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1svNV +#define GLEE_C_DEFINED_glVertexAttrib1svNV + void __stdcall GLee_Lazy_glVertexAttrib1svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib1svNV(index, v);} + GLEEPFNGLVERTEXATTRIB1SVNVPROC GLeeFuncPtr_glVertexAttrib1svNV=GLee_Lazy_glVertexAttrib1svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2dNV +#define GLEE_C_DEFINED_glVertexAttrib2dNV + void __stdcall GLee_Lazy_glVertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexAttrib2dNV(index, x, y);} + GLEEPFNGLVERTEXATTRIB2DNVPROC GLeeFuncPtr_glVertexAttrib2dNV=GLee_Lazy_glVertexAttrib2dNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2dvNV +#define GLEE_C_DEFINED_glVertexAttrib2dvNV + void __stdcall GLee_Lazy_glVertexAttrib2dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib2dvNV(index, v);} + GLEEPFNGLVERTEXATTRIB2DVNVPROC GLeeFuncPtr_glVertexAttrib2dvNV=GLee_Lazy_glVertexAttrib2dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2fNV +#define GLEE_C_DEFINED_glVertexAttrib2fNV + void __stdcall GLee_Lazy_glVertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexAttrib2fNV(index, x, y);} + GLEEPFNGLVERTEXATTRIB2FNVPROC GLeeFuncPtr_glVertexAttrib2fNV=GLee_Lazy_glVertexAttrib2fNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2fvNV +#define GLEE_C_DEFINED_glVertexAttrib2fvNV + void __stdcall GLee_Lazy_glVertexAttrib2fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib2fvNV(index, v);} + GLEEPFNGLVERTEXATTRIB2FVNVPROC GLeeFuncPtr_glVertexAttrib2fvNV=GLee_Lazy_glVertexAttrib2fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2sNV +#define GLEE_C_DEFINED_glVertexAttrib2sNV + void __stdcall GLee_Lazy_glVertexAttrib2sNV(GLuint index, GLshort x, GLshort y) {if (GLeeInit()) glVertexAttrib2sNV(index, x, y);} + GLEEPFNGLVERTEXATTRIB2SNVPROC GLeeFuncPtr_glVertexAttrib2sNV=GLee_Lazy_glVertexAttrib2sNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2svNV +#define GLEE_C_DEFINED_glVertexAttrib2svNV + void __stdcall GLee_Lazy_glVertexAttrib2svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib2svNV(index, v);} + GLEEPFNGLVERTEXATTRIB2SVNVPROC GLeeFuncPtr_glVertexAttrib2svNV=GLee_Lazy_glVertexAttrib2svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3dNV +#define GLEE_C_DEFINED_glVertexAttrib3dNV + void __stdcall GLee_Lazy_glVertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexAttrib3dNV(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3DNVPROC GLeeFuncPtr_glVertexAttrib3dNV=GLee_Lazy_glVertexAttrib3dNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3dvNV +#define GLEE_C_DEFINED_glVertexAttrib3dvNV + void __stdcall GLee_Lazy_glVertexAttrib3dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib3dvNV(index, v);} + GLEEPFNGLVERTEXATTRIB3DVNVPROC GLeeFuncPtr_glVertexAttrib3dvNV=GLee_Lazy_glVertexAttrib3dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3fNV +#define GLEE_C_DEFINED_glVertexAttrib3fNV + void __stdcall GLee_Lazy_glVertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexAttrib3fNV(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3FNVPROC GLeeFuncPtr_glVertexAttrib3fNV=GLee_Lazy_glVertexAttrib3fNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3fvNV +#define GLEE_C_DEFINED_glVertexAttrib3fvNV + void __stdcall GLee_Lazy_glVertexAttrib3fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib3fvNV(index, v);} + GLEEPFNGLVERTEXATTRIB3FVNVPROC GLeeFuncPtr_glVertexAttrib3fvNV=GLee_Lazy_glVertexAttrib3fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3sNV +#define GLEE_C_DEFINED_glVertexAttrib3sNV + void __stdcall GLee_Lazy_glVertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexAttrib3sNV(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3SNVPROC GLeeFuncPtr_glVertexAttrib3sNV=GLee_Lazy_glVertexAttrib3sNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3svNV +#define GLEE_C_DEFINED_glVertexAttrib3svNV + void __stdcall GLee_Lazy_glVertexAttrib3svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib3svNV(index, v);} + GLEEPFNGLVERTEXATTRIB3SVNVPROC GLeeFuncPtr_glVertexAttrib3svNV=GLee_Lazy_glVertexAttrib3svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4dNV +#define GLEE_C_DEFINED_glVertexAttrib4dNV + void __stdcall GLee_Lazy_glVertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexAttrib4dNV(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4DNVPROC GLeeFuncPtr_glVertexAttrib4dNV=GLee_Lazy_glVertexAttrib4dNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4dvNV +#define GLEE_C_DEFINED_glVertexAttrib4dvNV + void __stdcall GLee_Lazy_glVertexAttrib4dvNV(GLuint index, const GLdouble * v) {if (GLeeInit()) glVertexAttrib4dvNV(index, v);} + GLEEPFNGLVERTEXATTRIB4DVNVPROC GLeeFuncPtr_glVertexAttrib4dvNV=GLee_Lazy_glVertexAttrib4dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4fNV +#define GLEE_C_DEFINED_glVertexAttrib4fNV + void __stdcall GLee_Lazy_glVertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexAttrib4fNV(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4FNVPROC GLeeFuncPtr_glVertexAttrib4fNV=GLee_Lazy_glVertexAttrib4fNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4fvNV +#define GLEE_C_DEFINED_glVertexAttrib4fvNV + void __stdcall GLee_Lazy_glVertexAttrib4fvNV(GLuint index, const GLfloat * v) {if (GLeeInit()) glVertexAttrib4fvNV(index, v);} + GLEEPFNGLVERTEXATTRIB4FVNVPROC GLeeFuncPtr_glVertexAttrib4fvNV=GLee_Lazy_glVertexAttrib4fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4sNV +#define GLEE_C_DEFINED_glVertexAttrib4sNV + void __stdcall GLee_Lazy_glVertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexAttrib4sNV(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4SNVPROC GLeeFuncPtr_glVertexAttrib4sNV=GLee_Lazy_glVertexAttrib4sNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4svNV +#define GLEE_C_DEFINED_glVertexAttrib4svNV + void __stdcall GLee_Lazy_glVertexAttrib4svNV(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttrib4svNV(index, v);} + GLEEPFNGLVERTEXATTRIB4SVNVPROC GLeeFuncPtr_glVertexAttrib4svNV=GLee_Lazy_glVertexAttrib4svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4ubNV +#define GLEE_C_DEFINED_glVertexAttrib4ubNV + void __stdcall GLee_Lazy_glVertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) {if (GLeeInit()) glVertexAttrib4ubNV(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4UBNVPROC GLeeFuncPtr_glVertexAttrib4ubNV=GLee_Lazy_glVertexAttrib4ubNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4ubvNV +#define GLEE_C_DEFINED_glVertexAttrib4ubvNV + void __stdcall GLee_Lazy_glVertexAttrib4ubvNV(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttrib4ubvNV(index, v);} + GLEEPFNGLVERTEXATTRIB4UBVNVPROC GLeeFuncPtr_glVertexAttrib4ubvNV=GLee_Lazy_glVertexAttrib4ubvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs1dvNV +#define GLEE_C_DEFINED_glVertexAttribs1dvNV + void __stdcall GLee_Lazy_glVertexAttribs1dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs1dvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS1DVNVPROC GLeeFuncPtr_glVertexAttribs1dvNV=GLee_Lazy_glVertexAttribs1dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs1fvNV +#define GLEE_C_DEFINED_glVertexAttribs1fvNV + void __stdcall GLee_Lazy_glVertexAttribs1fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs1fvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS1FVNVPROC GLeeFuncPtr_glVertexAttribs1fvNV=GLee_Lazy_glVertexAttribs1fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs1svNV +#define GLEE_C_DEFINED_glVertexAttribs1svNV + void __stdcall GLee_Lazy_glVertexAttribs1svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs1svNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS1SVNVPROC GLeeFuncPtr_glVertexAttribs1svNV=GLee_Lazy_glVertexAttribs1svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs2dvNV +#define GLEE_C_DEFINED_glVertexAttribs2dvNV + void __stdcall GLee_Lazy_glVertexAttribs2dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs2dvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS2DVNVPROC GLeeFuncPtr_glVertexAttribs2dvNV=GLee_Lazy_glVertexAttribs2dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs2fvNV +#define GLEE_C_DEFINED_glVertexAttribs2fvNV + void __stdcall GLee_Lazy_glVertexAttribs2fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs2fvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS2FVNVPROC GLeeFuncPtr_glVertexAttribs2fvNV=GLee_Lazy_glVertexAttribs2fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs2svNV +#define GLEE_C_DEFINED_glVertexAttribs2svNV + void __stdcall GLee_Lazy_glVertexAttribs2svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs2svNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS2SVNVPROC GLeeFuncPtr_glVertexAttribs2svNV=GLee_Lazy_glVertexAttribs2svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs3dvNV +#define GLEE_C_DEFINED_glVertexAttribs3dvNV + void __stdcall GLee_Lazy_glVertexAttribs3dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs3dvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS3DVNVPROC GLeeFuncPtr_glVertexAttribs3dvNV=GLee_Lazy_glVertexAttribs3dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs3fvNV +#define GLEE_C_DEFINED_glVertexAttribs3fvNV + void __stdcall GLee_Lazy_glVertexAttribs3fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs3fvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS3FVNVPROC GLeeFuncPtr_glVertexAttribs3fvNV=GLee_Lazy_glVertexAttribs3fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs3svNV +#define GLEE_C_DEFINED_glVertexAttribs3svNV + void __stdcall GLee_Lazy_glVertexAttribs3svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs3svNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS3SVNVPROC GLeeFuncPtr_glVertexAttribs3svNV=GLee_Lazy_glVertexAttribs3svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs4dvNV +#define GLEE_C_DEFINED_glVertexAttribs4dvNV + void __stdcall GLee_Lazy_glVertexAttribs4dvNV(GLuint index, GLsizei count, const GLdouble * v) {if (GLeeInit()) glVertexAttribs4dvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS4DVNVPROC GLeeFuncPtr_glVertexAttribs4dvNV=GLee_Lazy_glVertexAttribs4dvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs4fvNV +#define GLEE_C_DEFINED_glVertexAttribs4fvNV + void __stdcall GLee_Lazy_glVertexAttribs4fvNV(GLuint index, GLsizei count, const GLfloat * v) {if (GLeeInit()) glVertexAttribs4fvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS4FVNVPROC GLeeFuncPtr_glVertexAttribs4fvNV=GLee_Lazy_glVertexAttribs4fvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs4svNV +#define GLEE_C_DEFINED_glVertexAttribs4svNV + void __stdcall GLee_Lazy_glVertexAttribs4svNV(GLuint index, GLsizei count, const GLshort * v) {if (GLeeInit()) glVertexAttribs4svNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS4SVNVPROC GLeeFuncPtr_glVertexAttribs4svNV=GLee_Lazy_glVertexAttribs4svNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs4ubvNV +#define GLEE_C_DEFINED_glVertexAttribs4ubvNV + void __stdcall GLee_Lazy_glVertexAttribs4ubvNV(GLuint index, GLsizei count, const GLubyte * v) {if (GLeeInit()) glVertexAttribs4ubvNV(index, count, v);} + GLEEPFNGLVERTEXATTRIBS4UBVNVPROC GLeeFuncPtr_glVertexAttribs4ubvNV=GLee_Lazy_glVertexAttribs4ubvNV; +#endif +#endif + +/* GL_SGIX_texture_coordinate_clamp */ + +#ifdef __GLEE_GL_SGIX_texture_coordinate_clamp +#endif + +/* GL_SGIX_scalebias_hint */ + +#ifdef __GLEE_GL_SGIX_scalebias_hint +#endif + +/* GL_OML_interlace */ + +#ifdef __GLEE_GL_OML_interlace +#endif + +/* GL_OML_subsample */ + +#ifdef __GLEE_GL_OML_subsample +#endif + +/* GL_OML_resample */ + +#ifdef __GLEE_GL_OML_resample +#endif + +/* GL_NV_copy_depth_to_color */ + +#ifdef __GLEE_GL_NV_copy_depth_to_color +#endif + +/* GL_ATI_envmap_bumpmap */ + +#ifdef __GLEE_GL_ATI_envmap_bumpmap +#ifndef GLEE_C_DEFINED_glTexBumpParameterivATI +#define GLEE_C_DEFINED_glTexBumpParameterivATI + void __stdcall GLee_Lazy_glTexBumpParameterivATI(GLenum pname, const GLint * param) {if (GLeeInit()) glTexBumpParameterivATI(pname, param);} + GLEEPFNGLTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glTexBumpParameterivATI=GLee_Lazy_glTexBumpParameterivATI; +#endif +#ifndef GLEE_C_DEFINED_glTexBumpParameterfvATI +#define GLEE_C_DEFINED_glTexBumpParameterfvATI + void __stdcall GLee_Lazy_glTexBumpParameterfvATI(GLenum pname, const GLfloat * param) {if (GLeeInit()) glTexBumpParameterfvATI(pname, param);} + GLEEPFNGLTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glTexBumpParameterfvATI=GLee_Lazy_glTexBumpParameterfvATI; +#endif +#ifndef GLEE_C_DEFINED_glGetTexBumpParameterivATI +#define GLEE_C_DEFINED_glGetTexBumpParameterivATI + void __stdcall GLee_Lazy_glGetTexBumpParameterivATI(GLenum pname, GLint * param) {if (GLeeInit()) glGetTexBumpParameterivATI(pname, param);} + GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glGetTexBumpParameterivATI=GLee_Lazy_glGetTexBumpParameterivATI; +#endif +#ifndef GLEE_C_DEFINED_glGetTexBumpParameterfvATI +#define GLEE_C_DEFINED_glGetTexBumpParameterfvATI + void __stdcall GLee_Lazy_glGetTexBumpParameterfvATI(GLenum pname, GLfloat * param) {if (GLeeInit()) glGetTexBumpParameterfvATI(pname, param);} + GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glGetTexBumpParameterfvATI=GLee_Lazy_glGetTexBumpParameterfvATI; +#endif +#endif + +/* GL_ATI_fragment_shader */ + +#ifdef __GLEE_GL_ATI_fragment_shader +#ifndef GLEE_C_DEFINED_glGenFragmentShadersATI +#define GLEE_C_DEFINED_glGenFragmentShadersATI + GLuint __stdcall GLee_Lazy_glGenFragmentShadersATI(GLuint range) {if (GLeeInit()) return glGenFragmentShadersATI(range); return (GLuint)0;} + GLEEPFNGLGENFRAGMENTSHADERSATIPROC GLeeFuncPtr_glGenFragmentShadersATI=GLee_Lazy_glGenFragmentShadersATI; +#endif +#ifndef GLEE_C_DEFINED_glBindFragmentShaderATI +#define GLEE_C_DEFINED_glBindFragmentShaderATI + void __stdcall GLee_Lazy_glBindFragmentShaderATI(GLuint id) {if (GLeeInit()) glBindFragmentShaderATI(id);} + GLEEPFNGLBINDFRAGMENTSHADERATIPROC GLeeFuncPtr_glBindFragmentShaderATI=GLee_Lazy_glBindFragmentShaderATI; +#endif +#ifndef GLEE_C_DEFINED_glDeleteFragmentShaderATI +#define GLEE_C_DEFINED_glDeleteFragmentShaderATI + void __stdcall GLee_Lazy_glDeleteFragmentShaderATI(GLuint id) {if (GLeeInit()) glDeleteFragmentShaderATI(id);} + GLEEPFNGLDELETEFRAGMENTSHADERATIPROC GLeeFuncPtr_glDeleteFragmentShaderATI=GLee_Lazy_glDeleteFragmentShaderATI; +#endif +#ifndef GLEE_C_DEFINED_glBeginFragmentShaderATI +#define GLEE_C_DEFINED_glBeginFragmentShaderATI + void __stdcall GLee_Lazy_glBeginFragmentShaderATI(void) {if (GLeeInit()) glBeginFragmentShaderATI();} + GLEEPFNGLBEGINFRAGMENTSHADERATIPROC GLeeFuncPtr_glBeginFragmentShaderATI=GLee_Lazy_glBeginFragmentShaderATI; +#endif +#ifndef GLEE_C_DEFINED_glEndFragmentShaderATI +#define GLEE_C_DEFINED_glEndFragmentShaderATI + void __stdcall GLee_Lazy_glEndFragmentShaderATI(void) {if (GLeeInit()) glEndFragmentShaderATI();} + GLEEPFNGLENDFRAGMENTSHADERATIPROC GLeeFuncPtr_glEndFragmentShaderATI=GLee_Lazy_glEndFragmentShaderATI; +#endif +#ifndef GLEE_C_DEFINED_glPassTexCoordATI +#define GLEE_C_DEFINED_glPassTexCoordATI + void __stdcall GLee_Lazy_glPassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle) {if (GLeeInit()) glPassTexCoordATI(dst, coord, swizzle);} + GLEEPFNGLPASSTEXCOORDATIPROC GLeeFuncPtr_glPassTexCoordATI=GLee_Lazy_glPassTexCoordATI; +#endif +#ifndef GLEE_C_DEFINED_glSampleMapATI +#define GLEE_C_DEFINED_glSampleMapATI + void __stdcall GLee_Lazy_glSampleMapATI(GLuint dst, GLuint interp, GLenum swizzle) {if (GLeeInit()) glSampleMapATI(dst, interp, swizzle);} + GLEEPFNGLSAMPLEMAPATIPROC GLeeFuncPtr_glSampleMapATI=GLee_Lazy_glSampleMapATI; +#endif +#ifndef GLEE_C_DEFINED_glColorFragmentOp1ATI +#define GLEE_C_DEFINED_glColorFragmentOp1ATI + void __stdcall GLee_Lazy_glColorFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) {if (GLeeInit()) glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod);} + GLEEPFNGLCOLORFRAGMENTOP1ATIPROC GLeeFuncPtr_glColorFragmentOp1ATI=GLee_Lazy_glColorFragmentOp1ATI; +#endif +#ifndef GLEE_C_DEFINED_glColorFragmentOp2ATI +#define GLEE_C_DEFINED_glColorFragmentOp2ATI + void __stdcall GLee_Lazy_glColorFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) {if (GLeeInit()) glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod);} + GLEEPFNGLCOLORFRAGMENTOP2ATIPROC GLeeFuncPtr_glColorFragmentOp2ATI=GLee_Lazy_glColorFragmentOp2ATI; +#endif +#ifndef GLEE_C_DEFINED_glColorFragmentOp3ATI +#define GLEE_C_DEFINED_glColorFragmentOp3ATI + void __stdcall GLee_Lazy_glColorFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) {if (GLeeInit()) glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod);} + GLEEPFNGLCOLORFRAGMENTOP3ATIPROC GLeeFuncPtr_glColorFragmentOp3ATI=GLee_Lazy_glColorFragmentOp3ATI; +#endif +#ifndef GLEE_C_DEFINED_glAlphaFragmentOp1ATI +#define GLEE_C_DEFINED_glAlphaFragmentOp1ATI + void __stdcall GLee_Lazy_glAlphaFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) {if (GLeeInit()) glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod);} + GLEEPFNGLALPHAFRAGMENTOP1ATIPROC GLeeFuncPtr_glAlphaFragmentOp1ATI=GLee_Lazy_glAlphaFragmentOp1ATI; +#endif +#ifndef GLEE_C_DEFINED_glAlphaFragmentOp2ATI +#define GLEE_C_DEFINED_glAlphaFragmentOp2ATI + void __stdcall GLee_Lazy_glAlphaFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) {if (GLeeInit()) glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod);} + GLEEPFNGLALPHAFRAGMENTOP2ATIPROC GLeeFuncPtr_glAlphaFragmentOp2ATI=GLee_Lazy_glAlphaFragmentOp2ATI; +#endif +#ifndef GLEE_C_DEFINED_glAlphaFragmentOp3ATI +#define GLEE_C_DEFINED_glAlphaFragmentOp3ATI + void __stdcall GLee_Lazy_glAlphaFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) {if (GLeeInit()) glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod);} + GLEEPFNGLALPHAFRAGMENTOP3ATIPROC GLeeFuncPtr_glAlphaFragmentOp3ATI=GLee_Lazy_glAlphaFragmentOp3ATI; +#endif +#ifndef GLEE_C_DEFINED_glSetFragmentShaderConstantATI +#define GLEE_C_DEFINED_glSetFragmentShaderConstantATI + void __stdcall GLee_Lazy_glSetFragmentShaderConstantATI(GLuint dst, const GLfloat * value) {if (GLeeInit()) glSetFragmentShaderConstantATI(dst, value);} + GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC GLeeFuncPtr_glSetFragmentShaderConstantATI=GLee_Lazy_glSetFragmentShaderConstantATI; +#endif +#endif + +/* GL_ATI_pn_triangles */ + +#ifdef __GLEE_GL_ATI_pn_triangles +#ifndef GLEE_C_DEFINED_glPNTrianglesiATI +#define GLEE_C_DEFINED_glPNTrianglesiATI + void __stdcall GLee_Lazy_glPNTrianglesiATI(GLenum pname, GLint param) {if (GLeeInit()) glPNTrianglesiATI(pname, param);} + GLEEPFNGLPNTRIANGLESIATIPROC GLeeFuncPtr_glPNTrianglesiATI=GLee_Lazy_glPNTrianglesiATI; +#endif +#ifndef GLEE_C_DEFINED_glPNTrianglesfATI +#define GLEE_C_DEFINED_glPNTrianglesfATI + void __stdcall GLee_Lazy_glPNTrianglesfATI(GLenum pname, GLfloat param) {if (GLeeInit()) glPNTrianglesfATI(pname, param);} + GLEEPFNGLPNTRIANGLESFATIPROC GLeeFuncPtr_glPNTrianglesfATI=GLee_Lazy_glPNTrianglesfATI; +#endif +#endif + +/* GL_ATI_vertex_array_object */ + +#ifdef __GLEE_GL_ATI_vertex_array_object +#ifndef GLEE_C_DEFINED_glNewObjectBufferATI +#define GLEE_C_DEFINED_glNewObjectBufferATI + GLuint __stdcall GLee_Lazy_glNewObjectBufferATI(GLsizei size, const GLvoid * pointer, GLenum usage) {if (GLeeInit()) return glNewObjectBufferATI(size, pointer, usage); return (GLuint)0;} + GLEEPFNGLNEWOBJECTBUFFERATIPROC GLeeFuncPtr_glNewObjectBufferATI=GLee_Lazy_glNewObjectBufferATI; +#endif +#ifndef GLEE_C_DEFINED_glIsObjectBufferATI +#define GLEE_C_DEFINED_glIsObjectBufferATI + GLboolean __stdcall GLee_Lazy_glIsObjectBufferATI(GLuint buffer) {if (GLeeInit()) return glIsObjectBufferATI(buffer); return (GLboolean)0;} + GLEEPFNGLISOBJECTBUFFERATIPROC GLeeFuncPtr_glIsObjectBufferATI=GLee_Lazy_glIsObjectBufferATI; +#endif +#ifndef GLEE_C_DEFINED_glUpdateObjectBufferATI +#define GLEE_C_DEFINED_glUpdateObjectBufferATI + void __stdcall GLee_Lazy_glUpdateObjectBufferATI(GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pointer, GLenum preserve) {if (GLeeInit()) glUpdateObjectBufferATI(buffer, offset, size, pointer, preserve);} + GLEEPFNGLUPDATEOBJECTBUFFERATIPROC GLeeFuncPtr_glUpdateObjectBufferATI=GLee_Lazy_glUpdateObjectBufferATI; +#endif +#ifndef GLEE_C_DEFINED_glGetObjectBufferfvATI +#define GLEE_C_DEFINED_glGetObjectBufferfvATI + void __stdcall GLee_Lazy_glGetObjectBufferfvATI(GLuint buffer, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetObjectBufferfvATI(buffer, pname, params);} + GLEEPFNGLGETOBJECTBUFFERFVATIPROC GLeeFuncPtr_glGetObjectBufferfvATI=GLee_Lazy_glGetObjectBufferfvATI; +#endif +#ifndef GLEE_C_DEFINED_glGetObjectBufferivATI +#define GLEE_C_DEFINED_glGetObjectBufferivATI + void __stdcall GLee_Lazy_glGetObjectBufferivATI(GLuint buffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetObjectBufferivATI(buffer, pname, params);} + GLEEPFNGLGETOBJECTBUFFERIVATIPROC GLeeFuncPtr_glGetObjectBufferivATI=GLee_Lazy_glGetObjectBufferivATI; +#endif +#ifndef GLEE_C_DEFINED_glFreeObjectBufferATI +#define GLEE_C_DEFINED_glFreeObjectBufferATI + void __stdcall GLee_Lazy_glFreeObjectBufferATI(GLuint buffer) {if (GLeeInit()) glFreeObjectBufferATI(buffer);} + GLEEPFNGLFREEOBJECTBUFFERATIPROC GLeeFuncPtr_glFreeObjectBufferATI=GLee_Lazy_glFreeObjectBufferATI; +#endif +#ifndef GLEE_C_DEFINED_glArrayObjectATI +#define GLEE_C_DEFINED_glArrayObjectATI + void __stdcall GLee_Lazy_glArrayObjectATI(GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) {if (GLeeInit()) glArrayObjectATI(array, size, type, stride, buffer, offset);} + GLEEPFNGLARRAYOBJECTATIPROC GLeeFuncPtr_glArrayObjectATI=GLee_Lazy_glArrayObjectATI; +#endif +#ifndef GLEE_C_DEFINED_glGetArrayObjectfvATI +#define GLEE_C_DEFINED_glGetArrayObjectfvATI + void __stdcall GLee_Lazy_glGetArrayObjectfvATI(GLenum array, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetArrayObjectfvATI(array, pname, params);} + GLEEPFNGLGETARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetArrayObjectfvATI=GLee_Lazy_glGetArrayObjectfvATI; +#endif +#ifndef GLEE_C_DEFINED_glGetArrayObjectivATI +#define GLEE_C_DEFINED_glGetArrayObjectivATI + void __stdcall GLee_Lazy_glGetArrayObjectivATI(GLenum array, GLenum pname, GLint * params) {if (GLeeInit()) glGetArrayObjectivATI(array, pname, params);} + GLEEPFNGLGETARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetArrayObjectivATI=GLee_Lazy_glGetArrayObjectivATI; +#endif +#ifndef GLEE_C_DEFINED_glVariantArrayObjectATI +#define GLEE_C_DEFINED_glVariantArrayObjectATI + void __stdcall GLee_Lazy_glVariantArrayObjectATI(GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) {if (GLeeInit()) glVariantArrayObjectATI(id, type, stride, buffer, offset);} + GLEEPFNGLVARIANTARRAYOBJECTATIPROC GLeeFuncPtr_glVariantArrayObjectATI=GLee_Lazy_glVariantArrayObjectATI; +#endif +#ifndef GLEE_C_DEFINED_glGetVariantArrayObjectfvATI +#define GLEE_C_DEFINED_glGetVariantArrayObjectfvATI + void __stdcall GLee_Lazy_glGetVariantArrayObjectfvATI(GLuint id, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVariantArrayObjectfvATI(id, pname, params);} + GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVariantArrayObjectfvATI=GLee_Lazy_glGetVariantArrayObjectfvATI; +#endif +#ifndef GLEE_C_DEFINED_glGetVariantArrayObjectivATI +#define GLEE_C_DEFINED_glGetVariantArrayObjectivATI + void __stdcall GLee_Lazy_glGetVariantArrayObjectivATI(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetVariantArrayObjectivATI(id, pname, params);} + GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVariantArrayObjectivATI=GLee_Lazy_glGetVariantArrayObjectivATI; +#endif +#endif + +/* GL_EXT_vertex_shader */ + +#ifdef __GLEE_GL_EXT_vertex_shader +#ifndef GLEE_C_DEFINED_glBeginVertexShaderEXT +#define GLEE_C_DEFINED_glBeginVertexShaderEXT + void __stdcall GLee_Lazy_glBeginVertexShaderEXT(void) {if (GLeeInit()) glBeginVertexShaderEXT();} + GLEEPFNGLBEGINVERTEXSHADEREXTPROC GLeeFuncPtr_glBeginVertexShaderEXT=GLee_Lazy_glBeginVertexShaderEXT; +#endif +#ifndef GLEE_C_DEFINED_glEndVertexShaderEXT +#define GLEE_C_DEFINED_glEndVertexShaderEXT + void __stdcall GLee_Lazy_glEndVertexShaderEXT(void) {if (GLeeInit()) glEndVertexShaderEXT();} + GLEEPFNGLENDVERTEXSHADEREXTPROC GLeeFuncPtr_glEndVertexShaderEXT=GLee_Lazy_glEndVertexShaderEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindVertexShaderEXT +#define GLEE_C_DEFINED_glBindVertexShaderEXT + void __stdcall GLee_Lazy_glBindVertexShaderEXT(GLuint id) {if (GLeeInit()) glBindVertexShaderEXT(id);} + GLEEPFNGLBINDVERTEXSHADEREXTPROC GLeeFuncPtr_glBindVertexShaderEXT=GLee_Lazy_glBindVertexShaderEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenVertexShadersEXT +#define GLEE_C_DEFINED_glGenVertexShadersEXT + GLuint __stdcall GLee_Lazy_glGenVertexShadersEXT(GLuint range) {if (GLeeInit()) return glGenVertexShadersEXT(range); return (GLuint)0;} + GLEEPFNGLGENVERTEXSHADERSEXTPROC GLeeFuncPtr_glGenVertexShadersEXT=GLee_Lazy_glGenVertexShadersEXT; +#endif +#ifndef GLEE_C_DEFINED_glDeleteVertexShaderEXT +#define GLEE_C_DEFINED_glDeleteVertexShaderEXT + void __stdcall GLee_Lazy_glDeleteVertexShaderEXT(GLuint id) {if (GLeeInit()) glDeleteVertexShaderEXT(id);} + GLEEPFNGLDELETEVERTEXSHADEREXTPROC GLeeFuncPtr_glDeleteVertexShaderEXT=GLee_Lazy_glDeleteVertexShaderEXT; +#endif +#ifndef GLEE_C_DEFINED_glShaderOp1EXT +#define GLEE_C_DEFINED_glShaderOp1EXT + void __stdcall GLee_Lazy_glShaderOp1EXT(GLenum op, GLuint res, GLuint arg1) {if (GLeeInit()) glShaderOp1EXT(op, res, arg1);} + GLEEPFNGLSHADEROP1EXTPROC GLeeFuncPtr_glShaderOp1EXT=GLee_Lazy_glShaderOp1EXT; +#endif +#ifndef GLEE_C_DEFINED_glShaderOp2EXT +#define GLEE_C_DEFINED_glShaderOp2EXT + void __stdcall GLee_Lazy_glShaderOp2EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2) {if (GLeeInit()) glShaderOp2EXT(op, res, arg1, arg2);} + GLEEPFNGLSHADEROP2EXTPROC GLeeFuncPtr_glShaderOp2EXT=GLee_Lazy_glShaderOp2EXT; +#endif +#ifndef GLEE_C_DEFINED_glShaderOp3EXT +#define GLEE_C_DEFINED_glShaderOp3EXT + void __stdcall GLee_Lazy_glShaderOp3EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3) {if (GLeeInit()) glShaderOp3EXT(op, res, arg1, arg2, arg3);} + GLEEPFNGLSHADEROP3EXTPROC GLeeFuncPtr_glShaderOp3EXT=GLee_Lazy_glShaderOp3EXT; +#endif +#ifndef GLEE_C_DEFINED_glSwizzleEXT +#define GLEE_C_DEFINED_glSwizzleEXT + void __stdcall GLee_Lazy_glSwizzleEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) {if (GLeeInit()) glSwizzleEXT(res, in, outX, outY, outZ, outW);} + GLEEPFNGLSWIZZLEEXTPROC GLeeFuncPtr_glSwizzleEXT=GLee_Lazy_glSwizzleEXT; +#endif +#ifndef GLEE_C_DEFINED_glWriteMaskEXT +#define GLEE_C_DEFINED_glWriteMaskEXT + void __stdcall GLee_Lazy_glWriteMaskEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) {if (GLeeInit()) glWriteMaskEXT(res, in, outX, outY, outZ, outW);} + GLEEPFNGLWRITEMASKEXTPROC GLeeFuncPtr_glWriteMaskEXT=GLee_Lazy_glWriteMaskEXT; +#endif +#ifndef GLEE_C_DEFINED_glInsertComponentEXT +#define GLEE_C_DEFINED_glInsertComponentEXT + void __stdcall GLee_Lazy_glInsertComponentEXT(GLuint res, GLuint src, GLuint num) {if (GLeeInit()) glInsertComponentEXT(res, src, num);} + GLEEPFNGLINSERTCOMPONENTEXTPROC GLeeFuncPtr_glInsertComponentEXT=GLee_Lazy_glInsertComponentEXT; +#endif +#ifndef GLEE_C_DEFINED_glExtractComponentEXT +#define GLEE_C_DEFINED_glExtractComponentEXT + void __stdcall GLee_Lazy_glExtractComponentEXT(GLuint res, GLuint src, GLuint num) {if (GLeeInit()) glExtractComponentEXT(res, src, num);} + GLEEPFNGLEXTRACTCOMPONENTEXTPROC GLeeFuncPtr_glExtractComponentEXT=GLee_Lazy_glExtractComponentEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenSymbolsEXT +#define GLEE_C_DEFINED_glGenSymbolsEXT + GLuint __stdcall GLee_Lazy_glGenSymbolsEXT(GLenum datatype, GLenum storagetype, GLenum range, GLuint components) {if (GLeeInit()) return glGenSymbolsEXT(datatype, storagetype, range, components); return (GLuint)0;} + GLEEPFNGLGENSYMBOLSEXTPROC GLeeFuncPtr_glGenSymbolsEXT=GLee_Lazy_glGenSymbolsEXT; +#endif +#ifndef GLEE_C_DEFINED_glSetInvariantEXT +#define GLEE_C_DEFINED_glSetInvariantEXT + void __stdcall GLee_Lazy_glSetInvariantEXT(GLuint id, GLenum type, const GLvoid * addr) {if (GLeeInit()) glSetInvariantEXT(id, type, addr);} + GLEEPFNGLSETINVARIANTEXTPROC GLeeFuncPtr_glSetInvariantEXT=GLee_Lazy_glSetInvariantEXT; +#endif +#ifndef GLEE_C_DEFINED_glSetLocalConstantEXT +#define GLEE_C_DEFINED_glSetLocalConstantEXT + void __stdcall GLee_Lazy_glSetLocalConstantEXT(GLuint id, GLenum type, const GLvoid * addr) {if (GLeeInit()) glSetLocalConstantEXT(id, type, addr);} + GLEEPFNGLSETLOCALCONSTANTEXTPROC GLeeFuncPtr_glSetLocalConstantEXT=GLee_Lazy_glSetLocalConstantEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantbvEXT +#define GLEE_C_DEFINED_glVariantbvEXT + void __stdcall GLee_Lazy_glVariantbvEXT(GLuint id, const GLbyte * addr) {if (GLeeInit()) glVariantbvEXT(id, addr);} + GLEEPFNGLVARIANTBVEXTPROC GLeeFuncPtr_glVariantbvEXT=GLee_Lazy_glVariantbvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantsvEXT +#define GLEE_C_DEFINED_glVariantsvEXT + void __stdcall GLee_Lazy_glVariantsvEXT(GLuint id, const GLshort * addr) {if (GLeeInit()) glVariantsvEXT(id, addr);} + GLEEPFNGLVARIANTSVEXTPROC GLeeFuncPtr_glVariantsvEXT=GLee_Lazy_glVariantsvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantivEXT +#define GLEE_C_DEFINED_glVariantivEXT + void __stdcall GLee_Lazy_glVariantivEXT(GLuint id, const GLint * addr) {if (GLeeInit()) glVariantivEXT(id, addr);} + GLEEPFNGLVARIANTIVEXTPROC GLeeFuncPtr_glVariantivEXT=GLee_Lazy_glVariantivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantfvEXT +#define GLEE_C_DEFINED_glVariantfvEXT + void __stdcall GLee_Lazy_glVariantfvEXT(GLuint id, const GLfloat * addr) {if (GLeeInit()) glVariantfvEXT(id, addr);} + GLEEPFNGLVARIANTFVEXTPROC GLeeFuncPtr_glVariantfvEXT=GLee_Lazy_glVariantfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantdvEXT +#define GLEE_C_DEFINED_glVariantdvEXT + void __stdcall GLee_Lazy_glVariantdvEXT(GLuint id, const GLdouble * addr) {if (GLeeInit()) glVariantdvEXT(id, addr);} + GLEEPFNGLVARIANTDVEXTPROC GLeeFuncPtr_glVariantdvEXT=GLee_Lazy_glVariantdvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantubvEXT +#define GLEE_C_DEFINED_glVariantubvEXT + void __stdcall GLee_Lazy_glVariantubvEXT(GLuint id, const GLubyte * addr) {if (GLeeInit()) glVariantubvEXT(id, addr);} + GLEEPFNGLVARIANTUBVEXTPROC GLeeFuncPtr_glVariantubvEXT=GLee_Lazy_glVariantubvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantusvEXT +#define GLEE_C_DEFINED_glVariantusvEXT + void __stdcall GLee_Lazy_glVariantusvEXT(GLuint id, const GLushort * addr) {if (GLeeInit()) glVariantusvEXT(id, addr);} + GLEEPFNGLVARIANTUSVEXTPROC GLeeFuncPtr_glVariantusvEXT=GLee_Lazy_glVariantusvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantuivEXT +#define GLEE_C_DEFINED_glVariantuivEXT + void __stdcall GLee_Lazy_glVariantuivEXT(GLuint id, const GLuint * addr) {if (GLeeInit()) glVariantuivEXT(id, addr);} + GLEEPFNGLVARIANTUIVEXTPROC GLeeFuncPtr_glVariantuivEXT=GLee_Lazy_glVariantuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVariantPointerEXT +#define GLEE_C_DEFINED_glVariantPointerEXT + void __stdcall GLee_Lazy_glVariantPointerEXT(GLuint id, GLenum type, GLuint stride, const GLvoid * addr) {if (GLeeInit()) glVariantPointerEXT(id, type, stride, addr);} + GLEEPFNGLVARIANTPOINTEREXTPROC GLeeFuncPtr_glVariantPointerEXT=GLee_Lazy_glVariantPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glEnableVariantClientStateEXT +#define GLEE_C_DEFINED_glEnableVariantClientStateEXT + void __stdcall GLee_Lazy_glEnableVariantClientStateEXT(GLuint id) {if (GLeeInit()) glEnableVariantClientStateEXT(id);} + GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glEnableVariantClientStateEXT=GLee_Lazy_glEnableVariantClientStateEXT; +#endif +#ifndef GLEE_C_DEFINED_glDisableVariantClientStateEXT +#define GLEE_C_DEFINED_glDisableVariantClientStateEXT + void __stdcall GLee_Lazy_glDisableVariantClientStateEXT(GLuint id) {if (GLeeInit()) glDisableVariantClientStateEXT(id);} + GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glDisableVariantClientStateEXT=GLee_Lazy_glDisableVariantClientStateEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindLightParameterEXT +#define GLEE_C_DEFINED_glBindLightParameterEXT + GLuint __stdcall GLee_Lazy_glBindLightParameterEXT(GLenum light, GLenum value) {if (GLeeInit()) return glBindLightParameterEXT(light, value); return (GLuint)0;} + GLEEPFNGLBINDLIGHTPARAMETEREXTPROC GLeeFuncPtr_glBindLightParameterEXT=GLee_Lazy_glBindLightParameterEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindMaterialParameterEXT +#define GLEE_C_DEFINED_glBindMaterialParameterEXT + GLuint __stdcall GLee_Lazy_glBindMaterialParameterEXT(GLenum face, GLenum value) {if (GLeeInit()) return glBindMaterialParameterEXT(face, value); return (GLuint)0;} + GLEEPFNGLBINDMATERIALPARAMETEREXTPROC GLeeFuncPtr_glBindMaterialParameterEXT=GLee_Lazy_glBindMaterialParameterEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindTexGenParameterEXT +#define GLEE_C_DEFINED_glBindTexGenParameterEXT + GLuint __stdcall GLee_Lazy_glBindTexGenParameterEXT(GLenum unit, GLenum coord, GLenum value) {if (GLeeInit()) return glBindTexGenParameterEXT(unit, coord, value); return (GLuint)0;} + GLEEPFNGLBINDTEXGENPARAMETEREXTPROC GLeeFuncPtr_glBindTexGenParameterEXT=GLee_Lazy_glBindTexGenParameterEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindTextureUnitParameterEXT +#define GLEE_C_DEFINED_glBindTextureUnitParameterEXT + GLuint __stdcall GLee_Lazy_glBindTextureUnitParameterEXT(GLenum unit, GLenum value) {if (GLeeInit()) return glBindTextureUnitParameterEXT(unit, value); return (GLuint)0;} + GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC GLeeFuncPtr_glBindTextureUnitParameterEXT=GLee_Lazy_glBindTextureUnitParameterEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindParameterEXT +#define GLEE_C_DEFINED_glBindParameterEXT + GLuint __stdcall GLee_Lazy_glBindParameterEXT(GLenum value) {if (GLeeInit()) return glBindParameterEXT(value); return (GLuint)0;} + GLEEPFNGLBINDPARAMETEREXTPROC GLeeFuncPtr_glBindParameterEXT=GLee_Lazy_glBindParameterEXT; +#endif +#ifndef GLEE_C_DEFINED_glIsVariantEnabledEXT +#define GLEE_C_DEFINED_glIsVariantEnabledEXT + GLboolean __stdcall GLee_Lazy_glIsVariantEnabledEXT(GLuint id, GLenum cap) {if (GLeeInit()) return glIsVariantEnabledEXT(id, cap); return (GLboolean)0;} + GLEEPFNGLISVARIANTENABLEDEXTPROC GLeeFuncPtr_glIsVariantEnabledEXT=GLee_Lazy_glIsVariantEnabledEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetVariantBooleanvEXT +#define GLEE_C_DEFINED_glGetVariantBooleanvEXT + void __stdcall GLee_Lazy_glGetVariantBooleanvEXT(GLuint id, GLenum value, GLboolean * data) {if (GLeeInit()) glGetVariantBooleanvEXT(id, value, data);} + GLEEPFNGLGETVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetVariantBooleanvEXT=GLee_Lazy_glGetVariantBooleanvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetVariantIntegervEXT +#define GLEE_C_DEFINED_glGetVariantIntegervEXT + void __stdcall GLee_Lazy_glGetVariantIntegervEXT(GLuint id, GLenum value, GLint * data) {if (GLeeInit()) glGetVariantIntegervEXT(id, value, data);} + GLEEPFNGLGETVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetVariantIntegervEXT=GLee_Lazy_glGetVariantIntegervEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetVariantFloatvEXT +#define GLEE_C_DEFINED_glGetVariantFloatvEXT + void __stdcall GLee_Lazy_glGetVariantFloatvEXT(GLuint id, GLenum value, GLfloat * data) {if (GLeeInit()) glGetVariantFloatvEXT(id, value, data);} + GLEEPFNGLGETVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetVariantFloatvEXT=GLee_Lazy_glGetVariantFloatvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetVariantPointervEXT +#define GLEE_C_DEFINED_glGetVariantPointervEXT + void __stdcall GLee_Lazy_glGetVariantPointervEXT(GLuint id, GLenum value, GLvoid* * data) {if (GLeeInit()) glGetVariantPointervEXT(id, value, data);} + GLEEPFNGLGETVARIANTPOINTERVEXTPROC GLeeFuncPtr_glGetVariantPointervEXT=GLee_Lazy_glGetVariantPointervEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetInvariantBooleanvEXT +#define GLEE_C_DEFINED_glGetInvariantBooleanvEXT + void __stdcall GLee_Lazy_glGetInvariantBooleanvEXT(GLuint id, GLenum value, GLboolean * data) {if (GLeeInit()) glGetInvariantBooleanvEXT(id, value, data);} + GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetInvariantBooleanvEXT=GLee_Lazy_glGetInvariantBooleanvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetInvariantIntegervEXT +#define GLEE_C_DEFINED_glGetInvariantIntegervEXT + void __stdcall GLee_Lazy_glGetInvariantIntegervEXT(GLuint id, GLenum value, GLint * data) {if (GLeeInit()) glGetInvariantIntegervEXT(id, value, data);} + GLEEPFNGLGETINVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetInvariantIntegervEXT=GLee_Lazy_glGetInvariantIntegervEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetInvariantFloatvEXT +#define GLEE_C_DEFINED_glGetInvariantFloatvEXT + void __stdcall GLee_Lazy_glGetInvariantFloatvEXT(GLuint id, GLenum value, GLfloat * data) {if (GLeeInit()) glGetInvariantFloatvEXT(id, value, data);} + GLEEPFNGLGETINVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetInvariantFloatvEXT=GLee_Lazy_glGetInvariantFloatvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetLocalConstantBooleanvEXT +#define GLEE_C_DEFINED_glGetLocalConstantBooleanvEXT + void __stdcall GLee_Lazy_glGetLocalConstantBooleanvEXT(GLuint id, GLenum value, GLboolean * data) {if (GLeeInit()) glGetLocalConstantBooleanvEXT(id, value, data);} + GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC GLeeFuncPtr_glGetLocalConstantBooleanvEXT=GLee_Lazy_glGetLocalConstantBooleanvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetLocalConstantIntegervEXT +#define GLEE_C_DEFINED_glGetLocalConstantIntegervEXT + void __stdcall GLee_Lazy_glGetLocalConstantIntegervEXT(GLuint id, GLenum value, GLint * data) {if (GLeeInit()) glGetLocalConstantIntegervEXT(id, value, data);} + GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC GLeeFuncPtr_glGetLocalConstantIntegervEXT=GLee_Lazy_glGetLocalConstantIntegervEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetLocalConstantFloatvEXT +#define GLEE_C_DEFINED_glGetLocalConstantFloatvEXT + void __stdcall GLee_Lazy_glGetLocalConstantFloatvEXT(GLuint id, GLenum value, GLfloat * data) {if (GLeeInit()) glGetLocalConstantFloatvEXT(id, value, data);} + GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC GLeeFuncPtr_glGetLocalConstantFloatvEXT=GLee_Lazy_glGetLocalConstantFloatvEXT; +#endif +#endif + +/* GL_ATI_vertex_streams */ + +#ifdef __GLEE_GL_ATI_vertex_streams +#ifndef GLEE_C_DEFINED_glVertexStream1sATI +#define GLEE_C_DEFINED_glVertexStream1sATI + void __stdcall GLee_Lazy_glVertexStream1sATI(GLenum stream, GLshort x) {if (GLeeInit()) glVertexStream1sATI(stream, x);} + GLEEPFNGLVERTEXSTREAM1SATIPROC GLeeFuncPtr_glVertexStream1sATI=GLee_Lazy_glVertexStream1sATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1svATI +#define GLEE_C_DEFINED_glVertexStream1svATI + void __stdcall GLee_Lazy_glVertexStream1svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream1svATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM1SVATIPROC GLeeFuncPtr_glVertexStream1svATI=GLee_Lazy_glVertexStream1svATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1iATI +#define GLEE_C_DEFINED_glVertexStream1iATI + void __stdcall GLee_Lazy_glVertexStream1iATI(GLenum stream, GLint x) {if (GLeeInit()) glVertexStream1iATI(stream, x);} + GLEEPFNGLVERTEXSTREAM1IATIPROC GLeeFuncPtr_glVertexStream1iATI=GLee_Lazy_glVertexStream1iATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1ivATI +#define GLEE_C_DEFINED_glVertexStream1ivATI + void __stdcall GLee_Lazy_glVertexStream1ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream1ivATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM1IVATIPROC GLeeFuncPtr_glVertexStream1ivATI=GLee_Lazy_glVertexStream1ivATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1fATI +#define GLEE_C_DEFINED_glVertexStream1fATI + void __stdcall GLee_Lazy_glVertexStream1fATI(GLenum stream, GLfloat x) {if (GLeeInit()) glVertexStream1fATI(stream, x);} + GLEEPFNGLVERTEXSTREAM1FATIPROC GLeeFuncPtr_glVertexStream1fATI=GLee_Lazy_glVertexStream1fATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1fvATI +#define GLEE_C_DEFINED_glVertexStream1fvATI + void __stdcall GLee_Lazy_glVertexStream1fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream1fvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM1FVATIPROC GLeeFuncPtr_glVertexStream1fvATI=GLee_Lazy_glVertexStream1fvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1dATI +#define GLEE_C_DEFINED_glVertexStream1dATI + void __stdcall GLee_Lazy_glVertexStream1dATI(GLenum stream, GLdouble x) {if (GLeeInit()) glVertexStream1dATI(stream, x);} + GLEEPFNGLVERTEXSTREAM1DATIPROC GLeeFuncPtr_glVertexStream1dATI=GLee_Lazy_glVertexStream1dATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream1dvATI +#define GLEE_C_DEFINED_glVertexStream1dvATI + void __stdcall GLee_Lazy_glVertexStream1dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream1dvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM1DVATIPROC GLeeFuncPtr_glVertexStream1dvATI=GLee_Lazy_glVertexStream1dvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2sATI +#define GLEE_C_DEFINED_glVertexStream2sATI + void __stdcall GLee_Lazy_glVertexStream2sATI(GLenum stream, GLshort x, GLshort y) {if (GLeeInit()) glVertexStream2sATI(stream, x, y);} + GLEEPFNGLVERTEXSTREAM2SATIPROC GLeeFuncPtr_glVertexStream2sATI=GLee_Lazy_glVertexStream2sATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2svATI +#define GLEE_C_DEFINED_glVertexStream2svATI + void __stdcall GLee_Lazy_glVertexStream2svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream2svATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM2SVATIPROC GLeeFuncPtr_glVertexStream2svATI=GLee_Lazy_glVertexStream2svATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2iATI +#define GLEE_C_DEFINED_glVertexStream2iATI + void __stdcall GLee_Lazy_glVertexStream2iATI(GLenum stream, GLint x, GLint y) {if (GLeeInit()) glVertexStream2iATI(stream, x, y);} + GLEEPFNGLVERTEXSTREAM2IATIPROC GLeeFuncPtr_glVertexStream2iATI=GLee_Lazy_glVertexStream2iATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2ivATI +#define GLEE_C_DEFINED_glVertexStream2ivATI + void __stdcall GLee_Lazy_glVertexStream2ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream2ivATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM2IVATIPROC GLeeFuncPtr_glVertexStream2ivATI=GLee_Lazy_glVertexStream2ivATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2fATI +#define GLEE_C_DEFINED_glVertexStream2fATI + void __stdcall GLee_Lazy_glVertexStream2fATI(GLenum stream, GLfloat x, GLfloat y) {if (GLeeInit()) glVertexStream2fATI(stream, x, y);} + GLEEPFNGLVERTEXSTREAM2FATIPROC GLeeFuncPtr_glVertexStream2fATI=GLee_Lazy_glVertexStream2fATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2fvATI +#define GLEE_C_DEFINED_glVertexStream2fvATI + void __stdcall GLee_Lazy_glVertexStream2fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream2fvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM2FVATIPROC GLeeFuncPtr_glVertexStream2fvATI=GLee_Lazy_glVertexStream2fvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2dATI +#define GLEE_C_DEFINED_glVertexStream2dATI + void __stdcall GLee_Lazy_glVertexStream2dATI(GLenum stream, GLdouble x, GLdouble y) {if (GLeeInit()) glVertexStream2dATI(stream, x, y);} + GLEEPFNGLVERTEXSTREAM2DATIPROC GLeeFuncPtr_glVertexStream2dATI=GLee_Lazy_glVertexStream2dATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream2dvATI +#define GLEE_C_DEFINED_glVertexStream2dvATI + void __stdcall GLee_Lazy_glVertexStream2dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream2dvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM2DVATIPROC GLeeFuncPtr_glVertexStream2dvATI=GLee_Lazy_glVertexStream2dvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3sATI +#define GLEE_C_DEFINED_glVertexStream3sATI + void __stdcall GLee_Lazy_glVertexStream3sATI(GLenum stream, GLshort x, GLshort y, GLshort z) {if (GLeeInit()) glVertexStream3sATI(stream, x, y, z);} + GLEEPFNGLVERTEXSTREAM3SATIPROC GLeeFuncPtr_glVertexStream3sATI=GLee_Lazy_glVertexStream3sATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3svATI +#define GLEE_C_DEFINED_glVertexStream3svATI + void __stdcall GLee_Lazy_glVertexStream3svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream3svATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM3SVATIPROC GLeeFuncPtr_glVertexStream3svATI=GLee_Lazy_glVertexStream3svATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3iATI +#define GLEE_C_DEFINED_glVertexStream3iATI + void __stdcall GLee_Lazy_glVertexStream3iATI(GLenum stream, GLint x, GLint y, GLint z) {if (GLeeInit()) glVertexStream3iATI(stream, x, y, z);} + GLEEPFNGLVERTEXSTREAM3IATIPROC GLeeFuncPtr_glVertexStream3iATI=GLee_Lazy_glVertexStream3iATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3ivATI +#define GLEE_C_DEFINED_glVertexStream3ivATI + void __stdcall GLee_Lazy_glVertexStream3ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream3ivATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM3IVATIPROC GLeeFuncPtr_glVertexStream3ivATI=GLee_Lazy_glVertexStream3ivATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3fATI +#define GLEE_C_DEFINED_glVertexStream3fATI + void __stdcall GLee_Lazy_glVertexStream3fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glVertexStream3fATI(stream, x, y, z);} + GLEEPFNGLVERTEXSTREAM3FATIPROC GLeeFuncPtr_glVertexStream3fATI=GLee_Lazy_glVertexStream3fATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3fvATI +#define GLEE_C_DEFINED_glVertexStream3fvATI + void __stdcall GLee_Lazy_glVertexStream3fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream3fvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM3FVATIPROC GLeeFuncPtr_glVertexStream3fvATI=GLee_Lazy_glVertexStream3fvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3dATI +#define GLEE_C_DEFINED_glVertexStream3dATI + void __stdcall GLee_Lazy_glVertexStream3dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glVertexStream3dATI(stream, x, y, z);} + GLEEPFNGLVERTEXSTREAM3DATIPROC GLeeFuncPtr_glVertexStream3dATI=GLee_Lazy_glVertexStream3dATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream3dvATI +#define GLEE_C_DEFINED_glVertexStream3dvATI + void __stdcall GLee_Lazy_glVertexStream3dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream3dvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM3DVATIPROC GLeeFuncPtr_glVertexStream3dvATI=GLee_Lazy_glVertexStream3dvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4sATI +#define GLEE_C_DEFINED_glVertexStream4sATI + void __stdcall GLee_Lazy_glVertexStream4sATI(GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w) {if (GLeeInit()) glVertexStream4sATI(stream, x, y, z, w);} + GLEEPFNGLVERTEXSTREAM4SATIPROC GLeeFuncPtr_glVertexStream4sATI=GLee_Lazy_glVertexStream4sATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4svATI +#define GLEE_C_DEFINED_glVertexStream4svATI + void __stdcall GLee_Lazy_glVertexStream4svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glVertexStream4svATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM4SVATIPROC GLeeFuncPtr_glVertexStream4svATI=GLee_Lazy_glVertexStream4svATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4iATI +#define GLEE_C_DEFINED_glVertexStream4iATI + void __stdcall GLee_Lazy_glVertexStream4iATI(GLenum stream, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glVertexStream4iATI(stream, x, y, z, w);} + GLEEPFNGLVERTEXSTREAM4IATIPROC GLeeFuncPtr_glVertexStream4iATI=GLee_Lazy_glVertexStream4iATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4ivATI +#define GLEE_C_DEFINED_glVertexStream4ivATI + void __stdcall GLee_Lazy_glVertexStream4ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glVertexStream4ivATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM4IVATIPROC GLeeFuncPtr_glVertexStream4ivATI=GLee_Lazy_glVertexStream4ivATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4fATI +#define GLEE_C_DEFINED_glVertexStream4fATI + void __stdcall GLee_Lazy_glVertexStream4fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glVertexStream4fATI(stream, x, y, z, w);} + GLEEPFNGLVERTEXSTREAM4FATIPROC GLeeFuncPtr_glVertexStream4fATI=GLee_Lazy_glVertexStream4fATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4fvATI +#define GLEE_C_DEFINED_glVertexStream4fvATI + void __stdcall GLee_Lazy_glVertexStream4fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glVertexStream4fvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM4FVATIPROC GLeeFuncPtr_glVertexStream4fvATI=GLee_Lazy_glVertexStream4fvATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4dATI +#define GLEE_C_DEFINED_glVertexStream4dATI + void __stdcall GLee_Lazy_glVertexStream4dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glVertexStream4dATI(stream, x, y, z, w);} + GLEEPFNGLVERTEXSTREAM4DATIPROC GLeeFuncPtr_glVertexStream4dATI=GLee_Lazy_glVertexStream4dATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexStream4dvATI +#define GLEE_C_DEFINED_glVertexStream4dvATI + void __stdcall GLee_Lazy_glVertexStream4dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glVertexStream4dvATI(stream, coords);} + GLEEPFNGLVERTEXSTREAM4DVATIPROC GLeeFuncPtr_glVertexStream4dvATI=GLee_Lazy_glVertexStream4dvATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3bATI +#define GLEE_C_DEFINED_glNormalStream3bATI + void __stdcall GLee_Lazy_glNormalStream3bATI(GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz) {if (GLeeInit()) glNormalStream3bATI(stream, nx, ny, nz);} + GLEEPFNGLNORMALSTREAM3BATIPROC GLeeFuncPtr_glNormalStream3bATI=GLee_Lazy_glNormalStream3bATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3bvATI +#define GLEE_C_DEFINED_glNormalStream3bvATI + void __stdcall GLee_Lazy_glNormalStream3bvATI(GLenum stream, const GLbyte * coords) {if (GLeeInit()) glNormalStream3bvATI(stream, coords);} + GLEEPFNGLNORMALSTREAM3BVATIPROC GLeeFuncPtr_glNormalStream3bvATI=GLee_Lazy_glNormalStream3bvATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3sATI +#define GLEE_C_DEFINED_glNormalStream3sATI + void __stdcall GLee_Lazy_glNormalStream3sATI(GLenum stream, GLshort nx, GLshort ny, GLshort nz) {if (GLeeInit()) glNormalStream3sATI(stream, nx, ny, nz);} + GLEEPFNGLNORMALSTREAM3SATIPROC GLeeFuncPtr_glNormalStream3sATI=GLee_Lazy_glNormalStream3sATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3svATI +#define GLEE_C_DEFINED_glNormalStream3svATI + void __stdcall GLee_Lazy_glNormalStream3svATI(GLenum stream, const GLshort * coords) {if (GLeeInit()) glNormalStream3svATI(stream, coords);} + GLEEPFNGLNORMALSTREAM3SVATIPROC GLeeFuncPtr_glNormalStream3svATI=GLee_Lazy_glNormalStream3svATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3iATI +#define GLEE_C_DEFINED_glNormalStream3iATI + void __stdcall GLee_Lazy_glNormalStream3iATI(GLenum stream, GLint nx, GLint ny, GLint nz) {if (GLeeInit()) glNormalStream3iATI(stream, nx, ny, nz);} + GLEEPFNGLNORMALSTREAM3IATIPROC GLeeFuncPtr_glNormalStream3iATI=GLee_Lazy_glNormalStream3iATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3ivATI +#define GLEE_C_DEFINED_glNormalStream3ivATI + void __stdcall GLee_Lazy_glNormalStream3ivATI(GLenum stream, const GLint * coords) {if (GLeeInit()) glNormalStream3ivATI(stream, coords);} + GLEEPFNGLNORMALSTREAM3IVATIPROC GLeeFuncPtr_glNormalStream3ivATI=GLee_Lazy_glNormalStream3ivATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3fATI +#define GLEE_C_DEFINED_glNormalStream3fATI + void __stdcall GLee_Lazy_glNormalStream3fATI(GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz) {if (GLeeInit()) glNormalStream3fATI(stream, nx, ny, nz);} + GLEEPFNGLNORMALSTREAM3FATIPROC GLeeFuncPtr_glNormalStream3fATI=GLee_Lazy_glNormalStream3fATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3fvATI +#define GLEE_C_DEFINED_glNormalStream3fvATI + void __stdcall GLee_Lazy_glNormalStream3fvATI(GLenum stream, const GLfloat * coords) {if (GLeeInit()) glNormalStream3fvATI(stream, coords);} + GLEEPFNGLNORMALSTREAM3FVATIPROC GLeeFuncPtr_glNormalStream3fvATI=GLee_Lazy_glNormalStream3fvATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3dATI +#define GLEE_C_DEFINED_glNormalStream3dATI + void __stdcall GLee_Lazy_glNormalStream3dATI(GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz) {if (GLeeInit()) glNormalStream3dATI(stream, nx, ny, nz);} + GLEEPFNGLNORMALSTREAM3DATIPROC GLeeFuncPtr_glNormalStream3dATI=GLee_Lazy_glNormalStream3dATI; +#endif +#ifndef GLEE_C_DEFINED_glNormalStream3dvATI +#define GLEE_C_DEFINED_glNormalStream3dvATI + void __stdcall GLee_Lazy_glNormalStream3dvATI(GLenum stream, const GLdouble * coords) {if (GLeeInit()) glNormalStream3dvATI(stream, coords);} + GLEEPFNGLNORMALSTREAM3DVATIPROC GLeeFuncPtr_glNormalStream3dvATI=GLee_Lazy_glNormalStream3dvATI; +#endif +#ifndef GLEE_C_DEFINED_glClientActiveVertexStreamATI +#define GLEE_C_DEFINED_glClientActiveVertexStreamATI + void __stdcall GLee_Lazy_glClientActiveVertexStreamATI(GLenum stream) {if (GLeeInit()) glClientActiveVertexStreamATI(stream);} + GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC GLeeFuncPtr_glClientActiveVertexStreamATI=GLee_Lazy_glClientActiveVertexStreamATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexBlendEnviATI +#define GLEE_C_DEFINED_glVertexBlendEnviATI + void __stdcall GLee_Lazy_glVertexBlendEnviATI(GLenum pname, GLint param) {if (GLeeInit()) glVertexBlendEnviATI(pname, param);} + GLEEPFNGLVERTEXBLENDENVIATIPROC GLeeFuncPtr_glVertexBlendEnviATI=GLee_Lazy_glVertexBlendEnviATI; +#endif +#ifndef GLEE_C_DEFINED_glVertexBlendEnvfATI +#define GLEE_C_DEFINED_glVertexBlendEnvfATI + void __stdcall GLee_Lazy_glVertexBlendEnvfATI(GLenum pname, GLfloat param) {if (GLeeInit()) glVertexBlendEnvfATI(pname, param);} + GLEEPFNGLVERTEXBLENDENVFATIPROC GLeeFuncPtr_glVertexBlendEnvfATI=GLee_Lazy_glVertexBlendEnvfATI; +#endif +#endif + +/* GL_ATI_element_array */ + +#ifdef __GLEE_GL_ATI_element_array +#ifndef GLEE_C_DEFINED_glElementPointerATI +#define GLEE_C_DEFINED_glElementPointerATI + void __stdcall GLee_Lazy_glElementPointerATI(GLenum type, const GLvoid * pointer) {if (GLeeInit()) glElementPointerATI(type, pointer);} + GLEEPFNGLELEMENTPOINTERATIPROC GLeeFuncPtr_glElementPointerATI=GLee_Lazy_glElementPointerATI; +#endif +#ifndef GLEE_C_DEFINED_glDrawElementArrayATI +#define GLEE_C_DEFINED_glDrawElementArrayATI + void __stdcall GLee_Lazy_glDrawElementArrayATI(GLenum mode, GLsizei count) {if (GLeeInit()) glDrawElementArrayATI(mode, count);} + GLEEPFNGLDRAWELEMENTARRAYATIPROC GLeeFuncPtr_glDrawElementArrayATI=GLee_Lazy_glDrawElementArrayATI; +#endif +#ifndef GLEE_C_DEFINED_glDrawRangeElementArrayATI +#define GLEE_C_DEFINED_glDrawRangeElementArrayATI + void __stdcall GLee_Lazy_glDrawRangeElementArrayATI(GLenum mode, GLuint start, GLuint end, GLsizei count) {if (GLeeInit()) glDrawRangeElementArrayATI(mode, start, end, count);} + GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC GLeeFuncPtr_glDrawRangeElementArrayATI=GLee_Lazy_glDrawRangeElementArrayATI; +#endif +#endif + +/* GL_SUN_mesh_array */ + +#ifdef __GLEE_GL_SUN_mesh_array +#ifndef GLEE_C_DEFINED_glDrawMeshArraysSUN +#define GLEE_C_DEFINED_glDrawMeshArraysSUN + void __stdcall GLee_Lazy_glDrawMeshArraysSUN(GLenum mode, GLint first, GLsizei count, GLsizei width) {if (GLeeInit()) glDrawMeshArraysSUN(mode, first, count, width);} + GLEEPFNGLDRAWMESHARRAYSSUNPROC GLeeFuncPtr_glDrawMeshArraysSUN=GLee_Lazy_glDrawMeshArraysSUN; +#endif +#endif + +/* GL_SUN_slice_accum */ + +#ifdef __GLEE_GL_SUN_slice_accum +#endif + +/* GL_NV_multisample_filter_hint */ + +#ifdef __GLEE_GL_NV_multisample_filter_hint +#endif + +/* GL_NV_depth_clamp */ + +#ifdef __GLEE_GL_NV_depth_clamp +#endif + +/* GL_NV_occlusion_query */ + +#ifdef __GLEE_GL_NV_occlusion_query +#ifndef GLEE_C_DEFINED_glGenOcclusionQueriesNV +#define GLEE_C_DEFINED_glGenOcclusionQueriesNV + void __stdcall GLee_Lazy_glGenOcclusionQueriesNV(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenOcclusionQueriesNV(n, ids);} + GLEEPFNGLGENOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glGenOcclusionQueriesNV=GLee_Lazy_glGenOcclusionQueriesNV; +#endif +#ifndef GLEE_C_DEFINED_glDeleteOcclusionQueriesNV +#define GLEE_C_DEFINED_glDeleteOcclusionQueriesNV + void __stdcall GLee_Lazy_glDeleteOcclusionQueriesNV(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteOcclusionQueriesNV(n, ids);} + GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glDeleteOcclusionQueriesNV=GLee_Lazy_glDeleteOcclusionQueriesNV; +#endif +#ifndef GLEE_C_DEFINED_glIsOcclusionQueryNV +#define GLEE_C_DEFINED_glIsOcclusionQueryNV + GLboolean __stdcall GLee_Lazy_glIsOcclusionQueryNV(GLuint id) {if (GLeeInit()) return glIsOcclusionQueryNV(id); return (GLboolean)0;} + GLEEPFNGLISOCCLUSIONQUERYNVPROC GLeeFuncPtr_glIsOcclusionQueryNV=GLee_Lazy_glIsOcclusionQueryNV; +#endif +#ifndef GLEE_C_DEFINED_glBeginOcclusionQueryNV +#define GLEE_C_DEFINED_glBeginOcclusionQueryNV + void __stdcall GLee_Lazy_glBeginOcclusionQueryNV(GLuint id) {if (GLeeInit()) glBeginOcclusionQueryNV(id);} + GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC GLeeFuncPtr_glBeginOcclusionQueryNV=GLee_Lazy_glBeginOcclusionQueryNV; +#endif +#ifndef GLEE_C_DEFINED_glEndOcclusionQueryNV +#define GLEE_C_DEFINED_glEndOcclusionQueryNV + void __stdcall GLee_Lazy_glEndOcclusionQueryNV(void) {if (GLeeInit()) glEndOcclusionQueryNV();} + GLEEPFNGLENDOCCLUSIONQUERYNVPROC GLeeFuncPtr_glEndOcclusionQueryNV=GLee_Lazy_glEndOcclusionQueryNV; +#endif +#ifndef GLEE_C_DEFINED_glGetOcclusionQueryivNV +#define GLEE_C_DEFINED_glGetOcclusionQueryivNV + void __stdcall GLee_Lazy_glGetOcclusionQueryivNV(GLuint id, GLenum pname, GLint * params) {if (GLeeInit()) glGetOcclusionQueryivNV(id, pname, params);} + GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC GLeeFuncPtr_glGetOcclusionQueryivNV=GLee_Lazy_glGetOcclusionQueryivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetOcclusionQueryuivNV +#define GLEE_C_DEFINED_glGetOcclusionQueryuivNV + void __stdcall GLee_Lazy_glGetOcclusionQueryuivNV(GLuint id, GLenum pname, GLuint * params) {if (GLeeInit()) glGetOcclusionQueryuivNV(id, pname, params);} + GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC GLeeFuncPtr_glGetOcclusionQueryuivNV=GLee_Lazy_glGetOcclusionQueryuivNV; +#endif +#endif + +/* GL_NV_point_sprite */ + +#ifdef __GLEE_GL_NV_point_sprite +#ifndef GLEE_C_DEFINED_glPointParameteriNV +#define GLEE_C_DEFINED_glPointParameteriNV + void __stdcall GLee_Lazy_glPointParameteriNV(GLenum pname, GLint param) {if (GLeeInit()) glPointParameteriNV(pname, param);} + GLEEPFNGLPOINTPARAMETERINVPROC GLeeFuncPtr_glPointParameteriNV=GLee_Lazy_glPointParameteriNV; +#endif +#ifndef GLEE_C_DEFINED_glPointParameterivNV +#define GLEE_C_DEFINED_glPointParameterivNV + void __stdcall GLee_Lazy_glPointParameterivNV(GLenum pname, const GLint * params) {if (GLeeInit()) glPointParameterivNV(pname, params);} + GLEEPFNGLPOINTPARAMETERIVNVPROC GLeeFuncPtr_glPointParameterivNV=GLee_Lazy_glPointParameterivNV; +#endif +#endif + +/* GL_NV_texture_shader3 */ + +#ifdef __GLEE_GL_NV_texture_shader3 +#endif + +/* GL_NV_vertex_program1_1 */ + +#ifdef __GLEE_GL_NV_vertex_program1_1 +#endif + +/* GL_EXT_shadow_funcs */ + +#ifdef __GLEE_GL_EXT_shadow_funcs +#endif + +/* GL_EXT_stencil_two_side */ + +#ifdef __GLEE_GL_EXT_stencil_two_side +#ifndef GLEE_C_DEFINED_glActiveStencilFaceEXT +#define GLEE_C_DEFINED_glActiveStencilFaceEXT + void __stdcall GLee_Lazy_glActiveStencilFaceEXT(GLenum face) {if (GLeeInit()) glActiveStencilFaceEXT(face);} + GLEEPFNGLACTIVESTENCILFACEEXTPROC GLeeFuncPtr_glActiveStencilFaceEXT=GLee_Lazy_glActiveStencilFaceEXT; +#endif +#endif + +/* GL_ATI_text_fragment_shader */ + +#ifdef __GLEE_GL_ATI_text_fragment_shader +#endif + +/* GL_APPLE_client_storage */ + +#ifdef __GLEE_GL_APPLE_client_storage +#endif + +/* GL_APPLE_element_array */ + +#ifdef __GLEE_GL_APPLE_element_array +#ifndef GLEE_C_DEFINED_glElementPointerAPPLE +#define GLEE_C_DEFINED_glElementPointerAPPLE + void __stdcall GLee_Lazy_glElementPointerAPPLE(GLenum type, const GLvoid * pointer) {if (GLeeInit()) glElementPointerAPPLE(type, pointer);} + GLEEPFNGLELEMENTPOINTERAPPLEPROC GLeeFuncPtr_glElementPointerAPPLE=GLee_Lazy_glElementPointerAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glDrawElementArrayAPPLE +#define GLEE_C_DEFINED_glDrawElementArrayAPPLE + void __stdcall GLee_Lazy_glDrawElementArrayAPPLE(GLenum mode, GLint first, GLsizei count) {if (GLeeInit()) glDrawElementArrayAPPLE(mode, first, count);} + GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawElementArrayAPPLE=GLee_Lazy_glDrawElementArrayAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glDrawRangeElementArrayAPPLE +#define GLEE_C_DEFINED_glDrawRangeElementArrayAPPLE + void __stdcall GLee_Lazy_glDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count) {if (GLeeInit()) glDrawRangeElementArrayAPPLE(mode, start, end, first, count);} + GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawRangeElementArrayAPPLE=GLee_Lazy_glDrawRangeElementArrayAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glMultiDrawElementArrayAPPLE +#define GLEE_C_DEFINED_glMultiDrawElementArrayAPPLE + void __stdcall GLee_Lazy_glMultiDrawElementArrayAPPLE(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawElementArrayAPPLE(mode, first, count, primcount);} + GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawElementArrayAPPLE=GLee_Lazy_glMultiDrawElementArrayAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glMultiDrawRangeElementArrayAPPLE +#define GLEE_C_DEFINED_glMultiDrawRangeElementArrayAPPLE + void __stdcall GLee_Lazy_glMultiDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount) {if (GLeeInit()) glMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount);} + GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE=GLee_Lazy_glMultiDrawRangeElementArrayAPPLE; +#endif +#endif + +/* GL_APPLE_fence */ + +#ifdef __GLEE_GL_APPLE_fence +#ifndef GLEE_C_DEFINED_glGenFencesAPPLE +#define GLEE_C_DEFINED_glGenFencesAPPLE + void __stdcall GLee_Lazy_glGenFencesAPPLE(GLsizei n, GLuint * fences) {if (GLeeInit()) glGenFencesAPPLE(n, fences);} + GLEEPFNGLGENFENCESAPPLEPROC GLeeFuncPtr_glGenFencesAPPLE=GLee_Lazy_glGenFencesAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glDeleteFencesAPPLE +#define GLEE_C_DEFINED_glDeleteFencesAPPLE + void __stdcall GLee_Lazy_glDeleteFencesAPPLE(GLsizei n, const GLuint * fences) {if (GLeeInit()) glDeleteFencesAPPLE(n, fences);} + GLEEPFNGLDELETEFENCESAPPLEPROC GLeeFuncPtr_glDeleteFencesAPPLE=GLee_Lazy_glDeleteFencesAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glSetFenceAPPLE +#define GLEE_C_DEFINED_glSetFenceAPPLE + void __stdcall GLee_Lazy_glSetFenceAPPLE(GLuint fence) {if (GLeeInit()) glSetFenceAPPLE(fence);} + GLEEPFNGLSETFENCEAPPLEPROC GLeeFuncPtr_glSetFenceAPPLE=GLee_Lazy_glSetFenceAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glIsFenceAPPLE +#define GLEE_C_DEFINED_glIsFenceAPPLE + GLboolean __stdcall GLee_Lazy_glIsFenceAPPLE(GLuint fence) {if (GLeeInit()) return glIsFenceAPPLE(fence); return (GLboolean)0;} + GLEEPFNGLISFENCEAPPLEPROC GLeeFuncPtr_glIsFenceAPPLE=GLee_Lazy_glIsFenceAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glTestFenceAPPLE +#define GLEE_C_DEFINED_glTestFenceAPPLE + GLboolean __stdcall GLee_Lazy_glTestFenceAPPLE(GLuint fence) {if (GLeeInit()) return glTestFenceAPPLE(fence); return (GLboolean)0;} + GLEEPFNGLTESTFENCEAPPLEPROC GLeeFuncPtr_glTestFenceAPPLE=GLee_Lazy_glTestFenceAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glFinishFenceAPPLE +#define GLEE_C_DEFINED_glFinishFenceAPPLE + void __stdcall GLee_Lazy_glFinishFenceAPPLE(GLuint fence) {if (GLeeInit()) glFinishFenceAPPLE(fence);} + GLEEPFNGLFINISHFENCEAPPLEPROC GLeeFuncPtr_glFinishFenceAPPLE=GLee_Lazy_glFinishFenceAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glTestObjectAPPLE +#define GLEE_C_DEFINED_glTestObjectAPPLE + GLboolean __stdcall GLee_Lazy_glTestObjectAPPLE(GLenum object, GLuint name) {if (GLeeInit()) return glTestObjectAPPLE(object, name); return (GLboolean)0;} + GLEEPFNGLTESTOBJECTAPPLEPROC GLeeFuncPtr_glTestObjectAPPLE=GLee_Lazy_glTestObjectAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glFinishObjectAPPLE +#define GLEE_C_DEFINED_glFinishObjectAPPLE + void __stdcall GLee_Lazy_glFinishObjectAPPLE(GLenum object, GLint name) {if (GLeeInit()) glFinishObjectAPPLE(object, name);} + GLEEPFNGLFINISHOBJECTAPPLEPROC GLeeFuncPtr_glFinishObjectAPPLE=GLee_Lazy_glFinishObjectAPPLE; +#endif +#endif + +/* GL_APPLE_vertex_array_object */ + +#ifdef __GLEE_GL_APPLE_vertex_array_object +#ifndef GLEE_C_DEFINED_glBindVertexArrayAPPLE +#define GLEE_C_DEFINED_glBindVertexArrayAPPLE + void __stdcall GLee_Lazy_glBindVertexArrayAPPLE(GLuint array) {if (GLeeInit()) glBindVertexArrayAPPLE(array);} + GLEEPFNGLBINDVERTEXARRAYAPPLEPROC GLeeFuncPtr_glBindVertexArrayAPPLE=GLee_Lazy_glBindVertexArrayAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glDeleteVertexArraysAPPLE +#define GLEE_C_DEFINED_glDeleteVertexArraysAPPLE + void __stdcall GLee_Lazy_glDeleteVertexArraysAPPLE(GLsizei n, const GLuint * arrays) {if (GLeeInit()) glDeleteVertexArraysAPPLE(n, arrays);} + GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glDeleteVertexArraysAPPLE=GLee_Lazy_glDeleteVertexArraysAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glGenVertexArraysAPPLE +#define GLEE_C_DEFINED_glGenVertexArraysAPPLE + void __stdcall GLee_Lazy_glGenVertexArraysAPPLE(GLsizei n, GLuint * arrays) {if (GLeeInit()) glGenVertexArraysAPPLE(n, arrays);} + GLEEPFNGLGENVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glGenVertexArraysAPPLE=GLee_Lazy_glGenVertexArraysAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glIsVertexArrayAPPLE +#define GLEE_C_DEFINED_glIsVertexArrayAPPLE + GLboolean __stdcall GLee_Lazy_glIsVertexArrayAPPLE(GLuint array) {if (GLeeInit()) return glIsVertexArrayAPPLE(array); return (GLboolean)0;} + GLEEPFNGLISVERTEXARRAYAPPLEPROC GLeeFuncPtr_glIsVertexArrayAPPLE=GLee_Lazy_glIsVertexArrayAPPLE; +#endif +#endif + +/* GL_APPLE_vertex_array_range */ + +#ifdef __GLEE_GL_APPLE_vertex_array_range +#ifndef GLEE_C_DEFINED_glVertexArrayRangeAPPLE +#define GLEE_C_DEFINED_glVertexArrayRangeAPPLE + void __stdcall GLee_Lazy_glVertexArrayRangeAPPLE(GLsizei length, GLvoid * pointer) {if (GLeeInit()) glVertexArrayRangeAPPLE(length, pointer);} + GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glVertexArrayRangeAPPLE=GLee_Lazy_glVertexArrayRangeAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glFlushVertexArrayRangeAPPLE +#define GLEE_C_DEFINED_glFlushVertexArrayRangeAPPLE + void __stdcall GLee_Lazy_glFlushVertexArrayRangeAPPLE(GLsizei length, GLvoid * pointer) {if (GLeeInit()) glFlushVertexArrayRangeAPPLE(length, pointer);} + GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glFlushVertexArrayRangeAPPLE=GLee_Lazy_glFlushVertexArrayRangeAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glVertexArrayParameteriAPPLE +#define GLEE_C_DEFINED_glVertexArrayParameteriAPPLE + void __stdcall GLee_Lazy_glVertexArrayParameteriAPPLE(GLenum pname, GLint param) {if (GLeeInit()) glVertexArrayParameteriAPPLE(pname, param);} + GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC GLeeFuncPtr_glVertexArrayParameteriAPPLE=GLee_Lazy_glVertexArrayParameteriAPPLE; +#endif +#endif + +/* GL_APPLE_ycbcr_422 */ + +#ifdef __GLEE_GL_APPLE_ycbcr_422 +#endif + +/* GL_S3_s3tc */ + +#ifdef __GLEE_GL_S3_s3tc +#endif + +/* GL_ATI_draw_buffers */ + +#ifdef __GLEE_GL_ATI_draw_buffers +#ifndef GLEE_C_DEFINED_glDrawBuffersATI +#define GLEE_C_DEFINED_glDrawBuffersATI + void __stdcall GLee_Lazy_glDrawBuffersATI(GLsizei n, const GLenum * bufs) {if (GLeeInit()) glDrawBuffersATI(n, bufs);} + GLEEPFNGLDRAWBUFFERSATIPROC GLeeFuncPtr_glDrawBuffersATI=GLee_Lazy_glDrawBuffersATI; +#endif +#endif + +/* GL_ATI_pixel_format_float */ + +#ifdef __GLEE_GL_ATI_pixel_format_float +#endif + +/* GL_ATI_texture_env_combine3 */ + +#ifdef __GLEE_GL_ATI_texture_env_combine3 +#endif + +/* GL_ATI_texture_float */ + +#ifdef __GLEE_GL_ATI_texture_float +#endif + +/* GL_NV_float_buffer */ + +#ifdef __GLEE_GL_NV_float_buffer +#endif + +/* GL_NV_fragment_program */ + +#ifdef __GLEE_GL_NV_fragment_program +#ifndef GLEE_C_DEFINED_glProgramNamedParameter4fNV +#define GLEE_C_DEFINED_glProgramNamedParameter4fNV + void __stdcall GLee_Lazy_glProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glProgramNamedParameter4fNV(id, len, name, x, y, z, w);} + GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLeeFuncPtr_glProgramNamedParameter4fNV=GLee_Lazy_glProgramNamedParameter4fNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramNamedParameter4dNV +#define GLEE_C_DEFINED_glProgramNamedParameter4dNV + void __stdcall GLee_Lazy_glProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glProgramNamedParameter4dNV(id, len, name, x, y, z, w);} + GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLeeFuncPtr_glProgramNamedParameter4dNV=GLee_Lazy_glProgramNamedParameter4dNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramNamedParameter4fvNV +#define GLEE_C_DEFINED_glProgramNamedParameter4fvNV + void __stdcall GLee_Lazy_glProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v) {if (GLeeInit()) glProgramNamedParameter4fvNV(id, len, name, v);} + GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLeeFuncPtr_glProgramNamedParameter4fvNV=GLee_Lazy_glProgramNamedParameter4fvNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramNamedParameter4dvNV +#define GLEE_C_DEFINED_glProgramNamedParameter4dvNV + void __stdcall GLee_Lazy_glProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v) {if (GLeeInit()) glProgramNamedParameter4dvNV(id, len, name, v);} + GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLeeFuncPtr_glProgramNamedParameter4dvNV=GLee_Lazy_glProgramNamedParameter4dvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramNamedParameterfvNV +#define GLEE_C_DEFINED_glGetProgramNamedParameterfvNV + void __stdcall GLee_Lazy_glGetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params) {if (GLeeInit()) glGetProgramNamedParameterfvNV(id, len, name, params);} + GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramNamedParameterfvNV=GLee_Lazy_glGetProgramNamedParameterfvNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramNamedParameterdvNV +#define GLEE_C_DEFINED_glGetProgramNamedParameterdvNV + void __stdcall GLee_Lazy_glGetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params) {if (GLeeInit()) glGetProgramNamedParameterdvNV(id, len, name, params);} + GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramNamedParameterdvNV=GLee_Lazy_glGetProgramNamedParameterdvNV; +#endif +#endif + +/* GL_NV_half_float */ + +#ifdef __GLEE_GL_NV_half_float +#ifndef GLEE_C_DEFINED_glVertex2hNV +#define GLEE_C_DEFINED_glVertex2hNV + void __stdcall GLee_Lazy_glVertex2hNV(GLhalfNV x, GLhalfNV y) {if (GLeeInit()) glVertex2hNV(x, y);} + GLEEPFNGLVERTEX2HNVPROC GLeeFuncPtr_glVertex2hNV=GLee_Lazy_glVertex2hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertex2hvNV +#define GLEE_C_DEFINED_glVertex2hvNV + void __stdcall GLee_Lazy_glVertex2hvNV(const GLhalfNV * v) {if (GLeeInit()) glVertex2hvNV(v);} + GLEEPFNGLVERTEX2HVNVPROC GLeeFuncPtr_glVertex2hvNV=GLee_Lazy_glVertex2hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertex3hNV +#define GLEE_C_DEFINED_glVertex3hNV + void __stdcall GLee_Lazy_glVertex3hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z) {if (GLeeInit()) glVertex3hNV(x, y, z);} + GLEEPFNGLVERTEX3HNVPROC GLeeFuncPtr_glVertex3hNV=GLee_Lazy_glVertex3hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertex3hvNV +#define GLEE_C_DEFINED_glVertex3hvNV + void __stdcall GLee_Lazy_glVertex3hvNV(const GLhalfNV * v) {if (GLeeInit()) glVertex3hvNV(v);} + GLEEPFNGLVERTEX3HVNVPROC GLeeFuncPtr_glVertex3hvNV=GLee_Lazy_glVertex3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertex4hNV +#define GLEE_C_DEFINED_glVertex4hNV + void __stdcall GLee_Lazy_glVertex4hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) {if (GLeeInit()) glVertex4hNV(x, y, z, w);} + GLEEPFNGLVERTEX4HNVPROC GLeeFuncPtr_glVertex4hNV=GLee_Lazy_glVertex4hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertex4hvNV +#define GLEE_C_DEFINED_glVertex4hvNV + void __stdcall GLee_Lazy_glVertex4hvNV(const GLhalfNV * v) {if (GLeeInit()) glVertex4hvNV(v);} + GLEEPFNGLVERTEX4HVNVPROC GLeeFuncPtr_glVertex4hvNV=GLee_Lazy_glVertex4hvNV; +#endif +#ifndef GLEE_C_DEFINED_glNormal3hNV +#define GLEE_C_DEFINED_glNormal3hNV + void __stdcall GLee_Lazy_glNormal3hNV(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz) {if (GLeeInit()) glNormal3hNV(nx, ny, nz);} + GLEEPFNGLNORMAL3HNVPROC GLeeFuncPtr_glNormal3hNV=GLee_Lazy_glNormal3hNV; +#endif +#ifndef GLEE_C_DEFINED_glNormal3hvNV +#define GLEE_C_DEFINED_glNormal3hvNV + void __stdcall GLee_Lazy_glNormal3hvNV(const GLhalfNV * v) {if (GLeeInit()) glNormal3hvNV(v);} + GLEEPFNGLNORMAL3HVNVPROC GLeeFuncPtr_glNormal3hvNV=GLee_Lazy_glNormal3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glColor3hNV +#define GLEE_C_DEFINED_glColor3hNV + void __stdcall GLee_Lazy_glColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) {if (GLeeInit()) glColor3hNV(red, green, blue);} + GLEEPFNGLCOLOR3HNVPROC GLeeFuncPtr_glColor3hNV=GLee_Lazy_glColor3hNV; +#endif +#ifndef GLEE_C_DEFINED_glColor3hvNV +#define GLEE_C_DEFINED_glColor3hvNV + void __stdcall GLee_Lazy_glColor3hvNV(const GLhalfNV * v) {if (GLeeInit()) glColor3hvNV(v);} + GLEEPFNGLCOLOR3HVNVPROC GLeeFuncPtr_glColor3hvNV=GLee_Lazy_glColor3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glColor4hNV +#define GLEE_C_DEFINED_glColor4hNV + void __stdcall GLee_Lazy_glColor4hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha) {if (GLeeInit()) glColor4hNV(red, green, blue, alpha);} + GLEEPFNGLCOLOR4HNVPROC GLeeFuncPtr_glColor4hNV=GLee_Lazy_glColor4hNV; +#endif +#ifndef GLEE_C_DEFINED_glColor4hvNV +#define GLEE_C_DEFINED_glColor4hvNV + void __stdcall GLee_Lazy_glColor4hvNV(const GLhalfNV * v) {if (GLeeInit()) glColor4hvNV(v);} + GLEEPFNGLCOLOR4HVNVPROC GLeeFuncPtr_glColor4hvNV=GLee_Lazy_glColor4hvNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord1hNV +#define GLEE_C_DEFINED_glTexCoord1hNV + void __stdcall GLee_Lazy_glTexCoord1hNV(GLhalfNV s) {if (GLeeInit()) glTexCoord1hNV(s);} + GLEEPFNGLTEXCOORD1HNVPROC GLeeFuncPtr_glTexCoord1hNV=GLee_Lazy_glTexCoord1hNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord1hvNV +#define GLEE_C_DEFINED_glTexCoord1hvNV + void __stdcall GLee_Lazy_glTexCoord1hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord1hvNV(v);} + GLEEPFNGLTEXCOORD1HVNVPROC GLeeFuncPtr_glTexCoord1hvNV=GLee_Lazy_glTexCoord1hvNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2hNV +#define GLEE_C_DEFINED_glTexCoord2hNV + void __stdcall GLee_Lazy_glTexCoord2hNV(GLhalfNV s, GLhalfNV t) {if (GLeeInit()) glTexCoord2hNV(s, t);} + GLEEPFNGLTEXCOORD2HNVPROC GLeeFuncPtr_glTexCoord2hNV=GLee_Lazy_glTexCoord2hNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord2hvNV +#define GLEE_C_DEFINED_glTexCoord2hvNV + void __stdcall GLee_Lazy_glTexCoord2hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord2hvNV(v);} + GLEEPFNGLTEXCOORD2HVNVPROC GLeeFuncPtr_glTexCoord2hvNV=GLee_Lazy_glTexCoord2hvNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord3hNV +#define GLEE_C_DEFINED_glTexCoord3hNV + void __stdcall GLee_Lazy_glTexCoord3hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r) {if (GLeeInit()) glTexCoord3hNV(s, t, r);} + GLEEPFNGLTEXCOORD3HNVPROC GLeeFuncPtr_glTexCoord3hNV=GLee_Lazy_glTexCoord3hNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord3hvNV +#define GLEE_C_DEFINED_glTexCoord3hvNV + void __stdcall GLee_Lazy_glTexCoord3hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord3hvNV(v);} + GLEEPFNGLTEXCOORD3HVNVPROC GLeeFuncPtr_glTexCoord3hvNV=GLee_Lazy_glTexCoord3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord4hNV +#define GLEE_C_DEFINED_glTexCoord4hNV + void __stdcall GLee_Lazy_glTexCoord4hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) {if (GLeeInit()) glTexCoord4hNV(s, t, r, q);} + GLEEPFNGLTEXCOORD4HNVPROC GLeeFuncPtr_glTexCoord4hNV=GLee_Lazy_glTexCoord4hNV; +#endif +#ifndef GLEE_C_DEFINED_glTexCoord4hvNV +#define GLEE_C_DEFINED_glTexCoord4hvNV + void __stdcall GLee_Lazy_glTexCoord4hvNV(const GLhalfNV * v) {if (GLeeInit()) glTexCoord4hvNV(v);} + GLEEPFNGLTEXCOORD4HVNVPROC GLeeFuncPtr_glTexCoord4hvNV=GLee_Lazy_glTexCoord4hvNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1hNV +#define GLEE_C_DEFINED_glMultiTexCoord1hNV + void __stdcall GLee_Lazy_glMultiTexCoord1hNV(GLenum target, GLhalfNV s) {if (GLeeInit()) glMultiTexCoord1hNV(target, s);} + GLEEPFNGLMULTITEXCOORD1HNVPROC GLeeFuncPtr_glMultiTexCoord1hNV=GLee_Lazy_glMultiTexCoord1hNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord1hvNV +#define GLEE_C_DEFINED_glMultiTexCoord1hvNV + void __stdcall GLee_Lazy_glMultiTexCoord1hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord1hvNV(target, v);} + GLEEPFNGLMULTITEXCOORD1HVNVPROC GLeeFuncPtr_glMultiTexCoord1hvNV=GLee_Lazy_glMultiTexCoord1hvNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2hNV +#define GLEE_C_DEFINED_glMultiTexCoord2hNV + void __stdcall GLee_Lazy_glMultiTexCoord2hNV(GLenum target, GLhalfNV s, GLhalfNV t) {if (GLeeInit()) glMultiTexCoord2hNV(target, s, t);} + GLEEPFNGLMULTITEXCOORD2HNVPROC GLeeFuncPtr_glMultiTexCoord2hNV=GLee_Lazy_glMultiTexCoord2hNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord2hvNV +#define GLEE_C_DEFINED_glMultiTexCoord2hvNV + void __stdcall GLee_Lazy_glMultiTexCoord2hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord2hvNV(target, v);} + GLEEPFNGLMULTITEXCOORD2HVNVPROC GLeeFuncPtr_glMultiTexCoord2hvNV=GLee_Lazy_glMultiTexCoord2hvNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3hNV +#define GLEE_C_DEFINED_glMultiTexCoord3hNV + void __stdcall GLee_Lazy_glMultiTexCoord3hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r) {if (GLeeInit()) glMultiTexCoord3hNV(target, s, t, r);} + GLEEPFNGLMULTITEXCOORD3HNVPROC GLeeFuncPtr_glMultiTexCoord3hNV=GLee_Lazy_glMultiTexCoord3hNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord3hvNV +#define GLEE_C_DEFINED_glMultiTexCoord3hvNV + void __stdcall GLee_Lazy_glMultiTexCoord3hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord3hvNV(target, v);} + GLEEPFNGLMULTITEXCOORD3HVNVPROC GLeeFuncPtr_glMultiTexCoord3hvNV=GLee_Lazy_glMultiTexCoord3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4hNV +#define GLEE_C_DEFINED_glMultiTexCoord4hNV + void __stdcall GLee_Lazy_glMultiTexCoord4hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) {if (GLeeInit()) glMultiTexCoord4hNV(target, s, t, r, q);} + GLEEPFNGLMULTITEXCOORD4HNVPROC GLeeFuncPtr_glMultiTexCoord4hNV=GLee_Lazy_glMultiTexCoord4hNV; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoord4hvNV +#define GLEE_C_DEFINED_glMultiTexCoord4hvNV + void __stdcall GLee_Lazy_glMultiTexCoord4hvNV(GLenum target, const GLhalfNV * v) {if (GLeeInit()) glMultiTexCoord4hvNV(target, v);} + GLEEPFNGLMULTITEXCOORD4HVNVPROC GLeeFuncPtr_glMultiTexCoord4hvNV=GLee_Lazy_glMultiTexCoord4hvNV; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordhNV +#define GLEE_C_DEFINED_glFogCoordhNV + void __stdcall GLee_Lazy_glFogCoordhNV(GLhalfNV fog) {if (GLeeInit()) glFogCoordhNV(fog);} + GLEEPFNGLFOGCOORDHNVPROC GLeeFuncPtr_glFogCoordhNV=GLee_Lazy_glFogCoordhNV; +#endif +#ifndef GLEE_C_DEFINED_glFogCoordhvNV +#define GLEE_C_DEFINED_glFogCoordhvNV + void __stdcall GLee_Lazy_glFogCoordhvNV(const GLhalfNV * fog) {if (GLeeInit()) glFogCoordhvNV(fog);} + GLEEPFNGLFOGCOORDHVNVPROC GLeeFuncPtr_glFogCoordhvNV=GLee_Lazy_glFogCoordhvNV; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3hNV +#define GLEE_C_DEFINED_glSecondaryColor3hNV + void __stdcall GLee_Lazy_glSecondaryColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) {if (GLeeInit()) glSecondaryColor3hNV(red, green, blue);} + GLEEPFNGLSECONDARYCOLOR3HNVPROC GLeeFuncPtr_glSecondaryColor3hNV=GLee_Lazy_glSecondaryColor3hNV; +#endif +#ifndef GLEE_C_DEFINED_glSecondaryColor3hvNV +#define GLEE_C_DEFINED_glSecondaryColor3hvNV + void __stdcall GLee_Lazy_glSecondaryColor3hvNV(const GLhalfNV * v) {if (GLeeInit()) glSecondaryColor3hvNV(v);} + GLEEPFNGLSECONDARYCOLOR3HVNVPROC GLeeFuncPtr_glSecondaryColor3hvNV=GLee_Lazy_glSecondaryColor3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexWeighthNV +#define GLEE_C_DEFINED_glVertexWeighthNV + void __stdcall GLee_Lazy_glVertexWeighthNV(GLhalfNV weight) {if (GLeeInit()) glVertexWeighthNV(weight);} + GLEEPFNGLVERTEXWEIGHTHNVPROC GLeeFuncPtr_glVertexWeighthNV=GLee_Lazy_glVertexWeighthNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexWeighthvNV +#define GLEE_C_DEFINED_glVertexWeighthvNV + void __stdcall GLee_Lazy_glVertexWeighthvNV(const GLhalfNV * weight) {if (GLeeInit()) glVertexWeighthvNV(weight);} + GLEEPFNGLVERTEXWEIGHTHVNVPROC GLeeFuncPtr_glVertexWeighthvNV=GLee_Lazy_glVertexWeighthvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1hNV +#define GLEE_C_DEFINED_glVertexAttrib1hNV + void __stdcall GLee_Lazy_glVertexAttrib1hNV(GLuint index, GLhalfNV x) {if (GLeeInit()) glVertexAttrib1hNV(index, x);} + GLEEPFNGLVERTEXATTRIB1HNVPROC GLeeFuncPtr_glVertexAttrib1hNV=GLee_Lazy_glVertexAttrib1hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib1hvNV +#define GLEE_C_DEFINED_glVertexAttrib1hvNV + void __stdcall GLee_Lazy_glVertexAttrib1hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib1hvNV(index, v);} + GLEEPFNGLVERTEXATTRIB1HVNVPROC GLeeFuncPtr_glVertexAttrib1hvNV=GLee_Lazy_glVertexAttrib1hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2hNV +#define GLEE_C_DEFINED_glVertexAttrib2hNV + void __stdcall GLee_Lazy_glVertexAttrib2hNV(GLuint index, GLhalfNV x, GLhalfNV y) {if (GLeeInit()) glVertexAttrib2hNV(index, x, y);} + GLEEPFNGLVERTEXATTRIB2HNVPROC GLeeFuncPtr_glVertexAttrib2hNV=GLee_Lazy_glVertexAttrib2hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib2hvNV +#define GLEE_C_DEFINED_glVertexAttrib2hvNV + void __stdcall GLee_Lazy_glVertexAttrib2hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib2hvNV(index, v);} + GLEEPFNGLVERTEXATTRIB2HVNVPROC GLeeFuncPtr_glVertexAttrib2hvNV=GLee_Lazy_glVertexAttrib2hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3hNV +#define GLEE_C_DEFINED_glVertexAttrib3hNV + void __stdcall GLee_Lazy_glVertexAttrib3hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z) {if (GLeeInit()) glVertexAttrib3hNV(index, x, y, z);} + GLEEPFNGLVERTEXATTRIB3HNVPROC GLeeFuncPtr_glVertexAttrib3hNV=GLee_Lazy_glVertexAttrib3hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib3hvNV +#define GLEE_C_DEFINED_glVertexAttrib3hvNV + void __stdcall GLee_Lazy_glVertexAttrib3hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib3hvNV(index, v);} + GLEEPFNGLVERTEXATTRIB3HVNVPROC GLeeFuncPtr_glVertexAttrib3hvNV=GLee_Lazy_glVertexAttrib3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4hNV +#define GLEE_C_DEFINED_glVertexAttrib4hNV + void __stdcall GLee_Lazy_glVertexAttrib4hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) {if (GLeeInit()) glVertexAttrib4hNV(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIB4HNVPROC GLeeFuncPtr_glVertexAttrib4hNV=GLee_Lazy_glVertexAttrib4hNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttrib4hvNV +#define GLEE_C_DEFINED_glVertexAttrib4hvNV + void __stdcall GLee_Lazy_glVertexAttrib4hvNV(GLuint index, const GLhalfNV * v) {if (GLeeInit()) glVertexAttrib4hvNV(index, v);} + GLEEPFNGLVERTEXATTRIB4HVNVPROC GLeeFuncPtr_glVertexAttrib4hvNV=GLee_Lazy_glVertexAttrib4hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs1hvNV +#define GLEE_C_DEFINED_glVertexAttribs1hvNV + void __stdcall GLee_Lazy_glVertexAttribs1hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs1hvNV(index, n, v);} + GLEEPFNGLVERTEXATTRIBS1HVNVPROC GLeeFuncPtr_glVertexAttribs1hvNV=GLee_Lazy_glVertexAttribs1hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs2hvNV +#define GLEE_C_DEFINED_glVertexAttribs2hvNV + void __stdcall GLee_Lazy_glVertexAttribs2hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs2hvNV(index, n, v);} + GLEEPFNGLVERTEXATTRIBS2HVNVPROC GLeeFuncPtr_glVertexAttribs2hvNV=GLee_Lazy_glVertexAttribs2hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs3hvNV +#define GLEE_C_DEFINED_glVertexAttribs3hvNV + void __stdcall GLee_Lazy_glVertexAttribs3hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs3hvNV(index, n, v);} + GLEEPFNGLVERTEXATTRIBS3HVNVPROC GLeeFuncPtr_glVertexAttribs3hvNV=GLee_Lazy_glVertexAttribs3hvNV; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribs4hvNV +#define GLEE_C_DEFINED_glVertexAttribs4hvNV + void __stdcall GLee_Lazy_glVertexAttribs4hvNV(GLuint index, GLsizei n, const GLhalfNV * v) {if (GLeeInit()) glVertexAttribs4hvNV(index, n, v);} + GLEEPFNGLVERTEXATTRIBS4HVNVPROC GLeeFuncPtr_glVertexAttribs4hvNV=GLee_Lazy_glVertexAttribs4hvNV; +#endif +#endif + +/* GL_NV_pixel_data_range */ + +#ifdef __GLEE_GL_NV_pixel_data_range +#ifndef GLEE_C_DEFINED_glPixelDataRangeNV +#define GLEE_C_DEFINED_glPixelDataRangeNV + void __stdcall GLee_Lazy_glPixelDataRangeNV(GLenum target, GLsizei length, GLvoid * pointer) {if (GLeeInit()) glPixelDataRangeNV(target, length, pointer);} + GLEEPFNGLPIXELDATARANGENVPROC GLeeFuncPtr_glPixelDataRangeNV=GLee_Lazy_glPixelDataRangeNV; +#endif +#ifndef GLEE_C_DEFINED_glFlushPixelDataRangeNV +#define GLEE_C_DEFINED_glFlushPixelDataRangeNV + void __stdcall GLee_Lazy_glFlushPixelDataRangeNV(GLenum target) {if (GLeeInit()) glFlushPixelDataRangeNV(target);} + GLEEPFNGLFLUSHPIXELDATARANGENVPROC GLeeFuncPtr_glFlushPixelDataRangeNV=GLee_Lazy_glFlushPixelDataRangeNV; +#endif +#endif + +/* GL_NV_primitive_restart */ + +#ifdef __GLEE_GL_NV_primitive_restart +#ifndef GLEE_C_DEFINED_glPrimitiveRestartNV +#define GLEE_C_DEFINED_glPrimitiveRestartNV + void __stdcall GLee_Lazy_glPrimitiveRestartNV(void) {if (GLeeInit()) glPrimitiveRestartNV();} + GLEEPFNGLPRIMITIVERESTARTNVPROC GLeeFuncPtr_glPrimitiveRestartNV=GLee_Lazy_glPrimitiveRestartNV; +#endif +#ifndef GLEE_C_DEFINED_glPrimitiveRestartIndexNV +#define GLEE_C_DEFINED_glPrimitiveRestartIndexNV + void __stdcall GLee_Lazy_glPrimitiveRestartIndexNV(GLuint index) {if (GLeeInit()) glPrimitiveRestartIndexNV(index);} + GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC GLeeFuncPtr_glPrimitiveRestartIndexNV=GLee_Lazy_glPrimitiveRestartIndexNV; +#endif +#endif + +/* GL_NV_texture_expand_normal */ + +#ifdef __GLEE_GL_NV_texture_expand_normal +#endif + +/* GL_NV_vertex_program2 */ + +#ifdef __GLEE_GL_NV_vertex_program2 +#endif + +/* GL_ATI_map_object_buffer */ + +#ifdef __GLEE_GL_ATI_map_object_buffer +#ifndef GLEE_C_DEFINED_glMapObjectBufferATI +#define GLEE_C_DEFINED_glMapObjectBufferATI + GLvoid* __stdcall GLee_Lazy_glMapObjectBufferATI(GLuint buffer) {if (GLeeInit()) return glMapObjectBufferATI(buffer); return (GLvoid*)0;} + GLEEPFNGLMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glMapObjectBufferATI=GLee_Lazy_glMapObjectBufferATI; +#endif +#ifndef GLEE_C_DEFINED_glUnmapObjectBufferATI +#define GLEE_C_DEFINED_glUnmapObjectBufferATI + void __stdcall GLee_Lazy_glUnmapObjectBufferATI(GLuint buffer) {if (GLeeInit()) glUnmapObjectBufferATI(buffer);} + GLEEPFNGLUNMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glUnmapObjectBufferATI=GLee_Lazy_glUnmapObjectBufferATI; +#endif +#endif + +/* GL_ATI_separate_stencil */ + +#ifdef __GLEE_GL_ATI_separate_stencil +#ifndef GLEE_C_DEFINED_glStencilOpSeparateATI +#define GLEE_C_DEFINED_glStencilOpSeparateATI + void __stdcall GLee_Lazy_glStencilOpSeparateATI(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) {if (GLeeInit()) glStencilOpSeparateATI(face, sfail, dpfail, dppass);} + GLEEPFNGLSTENCILOPSEPARATEATIPROC GLeeFuncPtr_glStencilOpSeparateATI=GLee_Lazy_glStencilOpSeparateATI; +#endif +#ifndef GLEE_C_DEFINED_glStencilFuncSeparateATI +#define GLEE_C_DEFINED_glStencilFuncSeparateATI + void __stdcall GLee_Lazy_glStencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) {if (GLeeInit()) glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);} + GLEEPFNGLSTENCILFUNCSEPARATEATIPROC GLeeFuncPtr_glStencilFuncSeparateATI=GLee_Lazy_glStencilFuncSeparateATI; +#endif +#endif + +/* GL_ATI_vertex_attrib_array_object */ + +#ifdef __GLEE_GL_ATI_vertex_attrib_array_object +#ifndef GLEE_C_DEFINED_glVertexAttribArrayObjectATI +#define GLEE_C_DEFINED_glVertexAttribArrayObjectATI + void __stdcall GLee_Lazy_glVertexAttribArrayObjectATI(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset) {if (GLeeInit()) glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset);} + GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC GLeeFuncPtr_glVertexAttribArrayObjectATI=GLee_Lazy_glVertexAttribArrayObjectATI; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribArrayObjectfvATI +#define GLEE_C_DEFINED_glGetVertexAttribArrayObjectfvATI + void __stdcall GLee_Lazy_glGetVertexAttribArrayObjectfvATI(GLuint index, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetVertexAttribArrayObjectfvATI(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI=GLee_Lazy_glGetVertexAttribArrayObjectfvATI; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribArrayObjectivATI +#define GLEE_C_DEFINED_glGetVertexAttribArrayObjectivATI + void __stdcall GLee_Lazy_glGetVertexAttribArrayObjectivATI(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribArrayObjectivATI(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectivATI=GLee_Lazy_glGetVertexAttribArrayObjectivATI; +#endif +#endif + +/* GL_OES_read_format */ + +#ifdef __GLEE_GL_OES_read_format +#endif + +/* GL_EXT_depth_bounds_test */ + +#ifdef __GLEE_GL_EXT_depth_bounds_test +#ifndef GLEE_C_DEFINED_glDepthBoundsEXT +#define GLEE_C_DEFINED_glDepthBoundsEXT + void __stdcall GLee_Lazy_glDepthBoundsEXT(GLclampd zmin, GLclampd zmax) {if (GLeeInit()) glDepthBoundsEXT(zmin, zmax);} + GLEEPFNGLDEPTHBOUNDSEXTPROC GLeeFuncPtr_glDepthBoundsEXT=GLee_Lazy_glDepthBoundsEXT; +#endif +#endif + +/* GL_EXT_texture_mirror_clamp */ + +#ifdef __GLEE_GL_EXT_texture_mirror_clamp +#endif + +/* GL_EXT_blend_equation_separate */ + +#ifdef __GLEE_GL_EXT_blend_equation_separate +#ifndef GLEE_C_DEFINED_glBlendEquationSeparateEXT +#define GLEE_C_DEFINED_glBlendEquationSeparateEXT + void __stdcall GLee_Lazy_glBlendEquationSeparateEXT(GLenum modeRGB, GLenum modeAlpha) {if (GLeeInit()) glBlendEquationSeparateEXT(modeRGB, modeAlpha);} + GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC GLeeFuncPtr_glBlendEquationSeparateEXT=GLee_Lazy_glBlendEquationSeparateEXT; +#endif +#endif + +/* GL_MESA_pack_invert */ + +#ifdef __GLEE_GL_MESA_pack_invert +#endif + +/* GL_MESA_ycbcr_texture */ + +#ifdef __GLEE_GL_MESA_ycbcr_texture +#endif + +/* GL_EXT_pixel_buffer_object */ + +#ifdef __GLEE_GL_EXT_pixel_buffer_object +#endif + +/* GL_NV_fragment_program_option */ + +#ifdef __GLEE_GL_NV_fragment_program_option +#endif + +/* GL_NV_fragment_program2 */ + +#ifdef __GLEE_GL_NV_fragment_program2 +#endif + +/* GL_NV_vertex_program2_option */ + +#ifdef __GLEE_GL_NV_vertex_program2_option +#endif + +/* GL_NV_vertex_program3 */ + +#ifdef __GLEE_GL_NV_vertex_program3 +#endif + +/* GL_EXT_framebuffer_object */ + +#ifdef __GLEE_GL_EXT_framebuffer_object +#ifndef GLEE_C_DEFINED_glIsRenderbufferEXT +#define GLEE_C_DEFINED_glIsRenderbufferEXT + GLboolean __stdcall GLee_Lazy_glIsRenderbufferEXT(GLuint renderbuffer) {if (GLeeInit()) return glIsRenderbufferEXT(renderbuffer); return (GLboolean)0;} + GLEEPFNGLISRENDERBUFFEREXTPROC GLeeFuncPtr_glIsRenderbufferEXT=GLee_Lazy_glIsRenderbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindRenderbufferEXT +#define GLEE_C_DEFINED_glBindRenderbufferEXT + void __stdcall GLee_Lazy_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) {if (GLeeInit()) glBindRenderbufferEXT(target, renderbuffer);} + GLEEPFNGLBINDRENDERBUFFEREXTPROC GLeeFuncPtr_glBindRenderbufferEXT=GLee_Lazy_glBindRenderbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glDeleteRenderbuffersEXT +#define GLEE_C_DEFINED_glDeleteRenderbuffersEXT + void __stdcall GLee_Lazy_glDeleteRenderbuffersEXT(GLsizei n, const GLuint * renderbuffers) {if (GLeeInit()) glDeleteRenderbuffersEXT(n, renderbuffers);} + GLEEPFNGLDELETERENDERBUFFERSEXTPROC GLeeFuncPtr_glDeleteRenderbuffersEXT=GLee_Lazy_glDeleteRenderbuffersEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenRenderbuffersEXT +#define GLEE_C_DEFINED_glGenRenderbuffersEXT + void __stdcall GLee_Lazy_glGenRenderbuffersEXT(GLsizei n, GLuint * renderbuffers) {if (GLeeInit()) glGenRenderbuffersEXT(n, renderbuffers);} + GLEEPFNGLGENRENDERBUFFERSEXTPROC GLeeFuncPtr_glGenRenderbuffersEXT=GLee_Lazy_glGenRenderbuffersEXT; +#endif +#ifndef GLEE_C_DEFINED_glRenderbufferStorageEXT +#define GLEE_C_DEFINED_glRenderbufferStorageEXT + void __stdcall GLee_Lazy_glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageEXT(target, internalformat, width, height);} + GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glRenderbufferStorageEXT=GLee_Lazy_glRenderbufferStorageEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetRenderbufferParameterivEXT +#define GLEE_C_DEFINED_glGetRenderbufferParameterivEXT + void __stdcall GLee_Lazy_glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetRenderbufferParameterivEXT(target, pname, params);} + GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetRenderbufferParameterivEXT=GLee_Lazy_glGetRenderbufferParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glIsFramebufferEXT +#define GLEE_C_DEFINED_glIsFramebufferEXT + GLboolean __stdcall GLee_Lazy_glIsFramebufferEXT(GLuint framebuffer) {if (GLeeInit()) return glIsFramebufferEXT(framebuffer); return (GLboolean)0;} + GLEEPFNGLISFRAMEBUFFEREXTPROC GLeeFuncPtr_glIsFramebufferEXT=GLee_Lazy_glIsFramebufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindFramebufferEXT +#define GLEE_C_DEFINED_glBindFramebufferEXT + void __stdcall GLee_Lazy_glBindFramebufferEXT(GLenum target, GLuint framebuffer) {if (GLeeInit()) glBindFramebufferEXT(target, framebuffer);} + GLEEPFNGLBINDFRAMEBUFFEREXTPROC GLeeFuncPtr_glBindFramebufferEXT=GLee_Lazy_glBindFramebufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glDeleteFramebuffersEXT +#define GLEE_C_DEFINED_glDeleteFramebuffersEXT + void __stdcall GLee_Lazy_glDeleteFramebuffersEXT(GLsizei n, const GLuint * framebuffers) {if (GLeeInit()) glDeleteFramebuffersEXT(n, framebuffers);} + GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC GLeeFuncPtr_glDeleteFramebuffersEXT=GLee_Lazy_glDeleteFramebuffersEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenFramebuffersEXT +#define GLEE_C_DEFINED_glGenFramebuffersEXT + void __stdcall GLee_Lazy_glGenFramebuffersEXT(GLsizei n, GLuint * framebuffers) {if (GLeeInit()) glGenFramebuffersEXT(n, framebuffers);} + GLEEPFNGLGENFRAMEBUFFERSEXTPROC GLeeFuncPtr_glGenFramebuffersEXT=GLee_Lazy_glGenFramebuffersEXT; +#endif +#ifndef GLEE_C_DEFINED_glCheckFramebufferStatusEXT +#define GLEE_C_DEFINED_glCheckFramebufferStatusEXT + GLenum __stdcall GLee_Lazy_glCheckFramebufferStatusEXT(GLenum target) {if (GLeeInit()) return glCheckFramebufferStatusEXT(target); return (GLenum)0;} + GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckFramebufferStatusEXT=GLee_Lazy_glCheckFramebufferStatusEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTexture1DEXT +#define GLEE_C_DEFINED_glFramebufferTexture1DEXT + void __stdcall GLee_Lazy_glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture1DEXT(target, attachment, textarget, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glFramebufferTexture1DEXT=GLee_Lazy_glFramebufferTexture1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTexture2DEXT +#define GLEE_C_DEFINED_glFramebufferTexture2DEXT + void __stdcall GLee_Lazy_glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glFramebufferTexture2DEXT=GLee_Lazy_glFramebufferTexture2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTexture3DEXT +#define GLEE_C_DEFINED_glFramebufferTexture3DEXT + void __stdcall GLee_Lazy_glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {if (GLeeInit()) glFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);} + GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glFramebufferTexture3DEXT=GLee_Lazy_glFramebufferTexture3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferRenderbufferEXT +#define GLEE_C_DEFINED_glFramebufferRenderbufferEXT + void __stdcall GLee_Lazy_glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {if (GLeeInit()) glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);} + GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glFramebufferRenderbufferEXT=GLee_Lazy_glFramebufferRenderbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFramebufferAttachmentParameterivEXT +#define GLEE_C_DEFINED_glGetFramebufferAttachmentParameterivEXT + void __stdcall GLee_Lazy_glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint * params) {if (GLeeInit()) glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);} + GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT=GLee_Lazy_glGetFramebufferAttachmentParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenerateMipmapEXT +#define GLEE_C_DEFINED_glGenerateMipmapEXT + void __stdcall GLee_Lazy_glGenerateMipmapEXT(GLenum target) {if (GLeeInit()) glGenerateMipmapEXT(target);} + GLEEPFNGLGENERATEMIPMAPEXTPROC GLeeFuncPtr_glGenerateMipmapEXT=GLee_Lazy_glGenerateMipmapEXT; +#endif +#endif + +/* GL_GREMEDY_string_marker */ + +#ifdef __GLEE_GL_GREMEDY_string_marker +#ifndef GLEE_C_DEFINED_glStringMarkerGREMEDY +#define GLEE_C_DEFINED_glStringMarkerGREMEDY + void __stdcall GLee_Lazy_glStringMarkerGREMEDY(GLsizei len, const GLvoid * string) {if (GLeeInit()) glStringMarkerGREMEDY(len, string);} + GLEEPFNGLSTRINGMARKERGREMEDYPROC GLeeFuncPtr_glStringMarkerGREMEDY=GLee_Lazy_glStringMarkerGREMEDY; +#endif +#endif + +/* GL_EXT_packed_depth_stencil */ + +#ifdef __GLEE_GL_EXT_packed_depth_stencil +#endif + +/* GL_EXT_stencil_clear_tag */ + +#ifdef __GLEE_GL_EXT_stencil_clear_tag +#ifndef GLEE_C_DEFINED_glStencilClearTagEXT +#define GLEE_C_DEFINED_glStencilClearTagEXT + void __stdcall GLee_Lazy_glStencilClearTagEXT(GLsizei stencilTagBits, GLuint stencilClearTag) {if (GLeeInit()) glStencilClearTagEXT(stencilTagBits, stencilClearTag);} + GLEEPFNGLSTENCILCLEARTAGEXTPROC GLeeFuncPtr_glStencilClearTagEXT=GLee_Lazy_glStencilClearTagEXT; +#endif +#endif + +/* GL_EXT_texture_sRGB */ + +#ifdef __GLEE_GL_EXT_texture_sRGB +#endif + +/* GL_EXT_framebuffer_blit */ + +#ifdef __GLEE_GL_EXT_framebuffer_blit +#ifndef GLEE_C_DEFINED_glBlitFramebufferEXT +#define GLEE_C_DEFINED_glBlitFramebufferEXT + void __stdcall GLee_Lazy_glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {if (GLeeInit()) glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);} + GLEEPFNGLBLITFRAMEBUFFEREXTPROC GLeeFuncPtr_glBlitFramebufferEXT=GLee_Lazy_glBlitFramebufferEXT; +#endif +#endif + +/* GL_EXT_framebuffer_multisample */ + +#ifdef __GLEE_GL_EXT_framebuffer_multisample +#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisampleEXT +#define GLEE_C_DEFINED_glRenderbufferStorageMultisampleEXT + void __stdcall GLee_Lazy_glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);} + GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glRenderbufferStorageMultisampleEXT=GLee_Lazy_glRenderbufferStorageMultisampleEXT; +#endif +#endif + +/* GL_MESAX_texture_stack */ + +#ifdef __GLEE_GL_MESAX_texture_stack +#endif + +/* GL_EXT_timer_query */ + +#ifdef __GLEE_GL_EXT_timer_query +#ifndef GLEE_C_DEFINED_glGetQueryObjecti64vEXT +#define GLEE_C_DEFINED_glGetQueryObjecti64vEXT + void __stdcall GLee_Lazy_glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64EXT * params) {if (GLeeInit()) glGetQueryObjecti64vEXT(id, pname, params);} + GLEEPFNGLGETQUERYOBJECTI64VEXTPROC GLeeFuncPtr_glGetQueryObjecti64vEXT=GLee_Lazy_glGetQueryObjecti64vEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetQueryObjectui64vEXT +#define GLEE_C_DEFINED_glGetQueryObjectui64vEXT + void __stdcall GLee_Lazy_glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64EXT * params) {if (GLeeInit()) glGetQueryObjectui64vEXT(id, pname, params);} + GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC GLeeFuncPtr_glGetQueryObjectui64vEXT=GLee_Lazy_glGetQueryObjectui64vEXT; +#endif +#endif + +/* GL_EXT_gpu_program_parameters */ + +#ifdef __GLEE_GL_EXT_gpu_program_parameters +#ifndef GLEE_C_DEFINED_glProgramEnvParameters4fvEXT +#define GLEE_C_DEFINED_glProgramEnvParameters4fvEXT + void __stdcall GLee_Lazy_glProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glProgramEnvParameters4fvEXT(target, index, count, params);} + GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramEnvParameters4fvEXT=GLee_Lazy_glProgramEnvParameters4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameters4fvEXT +#define GLEE_C_DEFINED_glProgramLocalParameters4fvEXT + void __stdcall GLee_Lazy_glProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glProgramLocalParameters4fvEXT(target, index, count, params);} + GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramLocalParameters4fvEXT=GLee_Lazy_glProgramLocalParameters4fvEXT; +#endif +#endif + +/* GL_APPLE_flush_buffer_range */ + +#ifdef __GLEE_GL_APPLE_flush_buffer_range +#ifndef GLEE_C_DEFINED_glBufferParameteriAPPLE +#define GLEE_C_DEFINED_glBufferParameteriAPPLE + void __stdcall GLee_Lazy_glBufferParameteriAPPLE(GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glBufferParameteriAPPLE(target, pname, param);} + GLEEPFNGLBUFFERPARAMETERIAPPLEPROC GLeeFuncPtr_glBufferParameteriAPPLE=GLee_Lazy_glBufferParameteriAPPLE; +#endif +#ifndef GLEE_C_DEFINED_glFlushMappedBufferRangeAPPLE +#define GLEE_C_DEFINED_glFlushMappedBufferRangeAPPLE + void __stdcall GLee_Lazy_glFlushMappedBufferRangeAPPLE(GLenum target, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glFlushMappedBufferRangeAPPLE(target, offset, size);} + GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC GLeeFuncPtr_glFlushMappedBufferRangeAPPLE=GLee_Lazy_glFlushMappedBufferRangeAPPLE; +#endif +#endif + +/* GL_EXT_gpu_shader4 */ + +#ifdef __GLEE_GL_EXT_gpu_shader4 +#ifndef GLEE_C_DEFINED_glGetUniformuivEXT +#define GLEE_C_DEFINED_glGetUniformuivEXT + void __stdcall GLee_Lazy_glGetUniformuivEXT(GLuint program, GLint location, GLuint * params) {if (GLeeInit()) glGetUniformuivEXT(program, location, params);} + GLEEPFNGLGETUNIFORMUIVEXTPROC GLeeFuncPtr_glGetUniformuivEXT=GLee_Lazy_glGetUniformuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindFragDataLocationEXT +#define GLEE_C_DEFINED_glBindFragDataLocationEXT + void __stdcall GLee_Lazy_glBindFragDataLocationEXT(GLuint program, GLuint color, const GLchar * name) {if (GLeeInit()) glBindFragDataLocationEXT(program, color, name);} + GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glBindFragDataLocationEXT=GLee_Lazy_glBindFragDataLocationEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFragDataLocationEXT +#define GLEE_C_DEFINED_glGetFragDataLocationEXT + GLint __stdcall GLee_Lazy_glGetFragDataLocationEXT(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetFragDataLocationEXT(program, name); return (GLint)0;} + GLEEPFNGLGETFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glGetFragDataLocationEXT=GLee_Lazy_glGetFragDataLocationEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform1uiEXT +#define GLEE_C_DEFINED_glUniform1uiEXT + void __stdcall GLee_Lazy_glUniform1uiEXT(GLint location, GLuint v0) {if (GLeeInit()) glUniform1uiEXT(location, v0);} + GLEEPFNGLUNIFORM1UIEXTPROC GLeeFuncPtr_glUniform1uiEXT=GLee_Lazy_glUniform1uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform2uiEXT +#define GLEE_C_DEFINED_glUniform2uiEXT + void __stdcall GLee_Lazy_glUniform2uiEXT(GLint location, GLuint v0, GLuint v1) {if (GLeeInit()) glUniform2uiEXT(location, v0, v1);} + GLEEPFNGLUNIFORM2UIEXTPROC GLeeFuncPtr_glUniform2uiEXT=GLee_Lazy_glUniform2uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform3uiEXT +#define GLEE_C_DEFINED_glUniform3uiEXT + void __stdcall GLee_Lazy_glUniform3uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2) {if (GLeeInit()) glUniform3uiEXT(location, v0, v1, v2);} + GLEEPFNGLUNIFORM3UIEXTPROC GLeeFuncPtr_glUniform3uiEXT=GLee_Lazy_glUniform3uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform4uiEXT +#define GLEE_C_DEFINED_glUniform4uiEXT + void __stdcall GLee_Lazy_glUniform4uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {if (GLeeInit()) glUniform4uiEXT(location, v0, v1, v2, v3);} + GLEEPFNGLUNIFORM4UIEXTPROC GLeeFuncPtr_glUniform4uiEXT=GLee_Lazy_glUniform4uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform1uivEXT +#define GLEE_C_DEFINED_glUniform1uivEXT + void __stdcall GLee_Lazy_glUniform1uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform1uivEXT(location, count, value);} + GLEEPFNGLUNIFORM1UIVEXTPROC GLeeFuncPtr_glUniform1uivEXT=GLee_Lazy_glUniform1uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform2uivEXT +#define GLEE_C_DEFINED_glUniform2uivEXT + void __stdcall GLee_Lazy_glUniform2uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform2uivEXT(location, count, value);} + GLEEPFNGLUNIFORM2UIVEXTPROC GLeeFuncPtr_glUniform2uivEXT=GLee_Lazy_glUniform2uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform3uivEXT +#define GLEE_C_DEFINED_glUniform3uivEXT + void __stdcall GLee_Lazy_glUniform3uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform3uivEXT(location, count, value);} + GLEEPFNGLUNIFORM3UIVEXTPROC GLeeFuncPtr_glUniform3uivEXT=GLee_Lazy_glUniform3uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glUniform4uivEXT +#define GLEE_C_DEFINED_glUniform4uivEXT + void __stdcall GLee_Lazy_glUniform4uivEXT(GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glUniform4uivEXT(location, count, value);} + GLEEPFNGLUNIFORM4UIVEXTPROC GLeeFuncPtr_glUniform4uivEXT=GLee_Lazy_glUniform4uivEXT; +#endif +#endif + +/* GL_EXT_draw_instanced */ + +#ifdef __GLEE_GL_EXT_draw_instanced +#ifndef GLEE_C_DEFINED_glDrawArraysInstancedEXT +#define GLEE_C_DEFINED_glDrawArraysInstancedEXT + void __stdcall GLee_Lazy_glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount) {if (GLeeInit()) glDrawArraysInstancedEXT(mode, start, count, primcount);} + GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC GLeeFuncPtr_glDrawArraysInstancedEXT=GLee_Lazy_glDrawArraysInstancedEXT; +#endif +#ifndef GLEE_C_DEFINED_glDrawElementsInstancedEXT +#define GLEE_C_DEFINED_glDrawElementsInstancedEXT + void __stdcall GLee_Lazy_glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount) {if (GLeeInit()) glDrawElementsInstancedEXT(mode, count, type, indices, primcount);} + GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC GLeeFuncPtr_glDrawElementsInstancedEXT=GLee_Lazy_glDrawElementsInstancedEXT; +#endif +#endif + +/* GL_EXT_packed_float */ + +#ifdef __GLEE_GL_EXT_packed_float +#endif + +/* GL_EXT_texture_array */ + +#ifdef __GLEE_GL_EXT_texture_array +#endif + +/* GL_EXT_texture_buffer_object */ + +#ifdef __GLEE_GL_EXT_texture_buffer_object +#ifndef GLEE_C_DEFINED_glTexBufferEXT +#define GLEE_C_DEFINED_glTexBufferEXT + void __stdcall GLee_Lazy_glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glTexBufferEXT(target, internalformat, buffer);} + GLEEPFNGLTEXBUFFEREXTPROC GLeeFuncPtr_glTexBufferEXT=GLee_Lazy_glTexBufferEXT; +#endif +#endif + +/* GL_EXT_texture_compression_latc */ + +#ifdef __GLEE_GL_EXT_texture_compression_latc +#endif + +/* GL_EXT_texture_compression_rgtc */ + +#ifdef __GLEE_GL_EXT_texture_compression_rgtc +#endif + +/* GL_EXT_texture_shared_exponent */ + +#ifdef __GLEE_GL_EXT_texture_shared_exponent +#endif + +/* GL_NV_depth_buffer_float */ + +#ifdef __GLEE_GL_NV_depth_buffer_float +#ifndef GLEE_C_DEFINED_glDepthRangedNV +#define GLEE_C_DEFINED_glDepthRangedNV + void __stdcall GLee_Lazy_glDepthRangedNV(GLdouble zNear, GLdouble zFar) {if (GLeeInit()) glDepthRangedNV(zNear, zFar);} + GLEEPFNGLDEPTHRANGEDNVPROC GLeeFuncPtr_glDepthRangedNV=GLee_Lazy_glDepthRangedNV; +#endif +#ifndef GLEE_C_DEFINED_glClearDepthdNV +#define GLEE_C_DEFINED_glClearDepthdNV + void __stdcall GLee_Lazy_glClearDepthdNV(GLdouble depth) {if (GLeeInit()) glClearDepthdNV(depth);} + GLEEPFNGLCLEARDEPTHDNVPROC GLeeFuncPtr_glClearDepthdNV=GLee_Lazy_glClearDepthdNV; +#endif +#ifndef GLEE_C_DEFINED_glDepthBoundsdNV +#define GLEE_C_DEFINED_glDepthBoundsdNV + void __stdcall GLee_Lazy_glDepthBoundsdNV(GLdouble zmin, GLdouble zmax) {if (GLeeInit()) glDepthBoundsdNV(zmin, zmax);} + GLEEPFNGLDEPTHBOUNDSDNVPROC GLeeFuncPtr_glDepthBoundsdNV=GLee_Lazy_glDepthBoundsdNV; +#endif +#endif + +/* GL_NV_framebuffer_multisample_coverage */ + +#ifdef __GLEE_GL_NV_framebuffer_multisample_coverage +#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisampleCoverageNV +#define GLEE_C_DEFINED_glRenderbufferStorageMultisampleCoverageNV + void __stdcall GLee_Lazy_glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height);} + GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV=GLee_Lazy_glRenderbufferStorageMultisampleCoverageNV; +#endif +#endif + +/* GL_EXT_framebuffer_sRGB */ + +#ifdef __GLEE_GL_EXT_framebuffer_sRGB +#endif + +/* GL_NV_geometry_shader4 */ + +#ifdef __GLEE_GL_NV_geometry_shader4 +#endif + +/* GL_NV_parameter_buffer_object */ + +#ifdef __GLEE_GL_NV_parameter_buffer_object +#ifndef GLEE_C_DEFINED_glProgramBufferParametersfvNV +#define GLEE_C_DEFINED_glProgramBufferParametersfvNV + void __stdcall GLee_Lazy_glProgramBufferParametersfvNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glProgramBufferParametersfvNV(target, buffer, index, count, params);} + GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC GLeeFuncPtr_glProgramBufferParametersfvNV=GLee_Lazy_glProgramBufferParametersfvNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramBufferParametersIivNV +#define GLEE_C_DEFINED_glProgramBufferParametersIivNV + void __stdcall GLee_Lazy_glProgramBufferParametersIivNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glProgramBufferParametersIivNV(target, buffer, index, count, params);} + GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC GLeeFuncPtr_glProgramBufferParametersIivNV=GLee_Lazy_glProgramBufferParametersIivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramBufferParametersIuivNV +#define GLEE_C_DEFINED_glProgramBufferParametersIuivNV + void __stdcall GLee_Lazy_glProgramBufferParametersIuivNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glProgramBufferParametersIuivNV(target, buffer, index, count, params);} + GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC GLeeFuncPtr_glProgramBufferParametersIuivNV=GLee_Lazy_glProgramBufferParametersIuivNV; +#endif +#endif + +/* GL_EXT_draw_buffers2 */ + +#ifdef __GLEE_GL_EXT_draw_buffers2 +#ifndef GLEE_C_DEFINED_glColorMaskIndexedEXT +#define GLEE_C_DEFINED_glColorMaskIndexedEXT + void __stdcall GLee_Lazy_glColorMaskIndexedEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) {if (GLeeInit()) glColorMaskIndexedEXT(index, r, g, b, a);} + GLEEPFNGLCOLORMASKINDEXEDEXTPROC GLeeFuncPtr_glColorMaskIndexedEXT=GLee_Lazy_glColorMaskIndexedEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetBooleanIndexedvEXT +#define GLEE_C_DEFINED_glGetBooleanIndexedvEXT + void __stdcall GLee_Lazy_glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean * data) {if (GLeeInit()) glGetBooleanIndexedvEXT(target, index, data);} + GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC GLeeFuncPtr_glGetBooleanIndexedvEXT=GLee_Lazy_glGetBooleanIndexedvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetIntegerIndexedvEXT +#define GLEE_C_DEFINED_glGetIntegerIndexedvEXT + void __stdcall GLee_Lazy_glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint * data) {if (GLeeInit()) glGetIntegerIndexedvEXT(target, index, data);} + GLEEPFNGLGETINTEGERINDEXEDVEXTPROC GLeeFuncPtr_glGetIntegerIndexedvEXT=GLee_Lazy_glGetIntegerIndexedvEXT; +#endif +#ifndef GLEE_C_DEFINED_glEnableIndexedEXT +#define GLEE_C_DEFINED_glEnableIndexedEXT + void __stdcall GLee_Lazy_glEnableIndexedEXT(GLenum target, GLuint index) {if (GLeeInit()) glEnableIndexedEXT(target, index);} + GLEEPFNGLENABLEINDEXEDEXTPROC GLeeFuncPtr_glEnableIndexedEXT=GLee_Lazy_glEnableIndexedEXT; +#endif +#ifndef GLEE_C_DEFINED_glDisableIndexedEXT +#define GLEE_C_DEFINED_glDisableIndexedEXT + void __stdcall GLee_Lazy_glDisableIndexedEXT(GLenum target, GLuint index) {if (GLeeInit()) glDisableIndexedEXT(target, index);} + GLEEPFNGLDISABLEINDEXEDEXTPROC GLeeFuncPtr_glDisableIndexedEXT=GLee_Lazy_glDisableIndexedEXT; +#endif +#ifndef GLEE_C_DEFINED_glIsEnabledIndexedEXT +#define GLEE_C_DEFINED_glIsEnabledIndexedEXT + GLboolean __stdcall GLee_Lazy_glIsEnabledIndexedEXT(GLenum target, GLuint index) {if (GLeeInit()) return glIsEnabledIndexedEXT(target, index); return (GLboolean)0;} + GLEEPFNGLISENABLEDINDEXEDEXTPROC GLeeFuncPtr_glIsEnabledIndexedEXT=GLee_Lazy_glIsEnabledIndexedEXT; +#endif +#endif + +/* GL_NV_transform_feedback */ + +#ifdef __GLEE_GL_NV_transform_feedback +#ifndef GLEE_C_DEFINED_glBeginTransformFeedbackNV +#define GLEE_C_DEFINED_glBeginTransformFeedbackNV + void __stdcall GLee_Lazy_glBeginTransformFeedbackNV(GLenum primitiveMode) {if (GLeeInit()) glBeginTransformFeedbackNV(primitiveMode);} + GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBeginTransformFeedbackNV=GLee_Lazy_glBeginTransformFeedbackNV; +#endif +#ifndef GLEE_C_DEFINED_glEndTransformFeedbackNV +#define GLEE_C_DEFINED_glEndTransformFeedbackNV + void __stdcall GLee_Lazy_glEndTransformFeedbackNV(void) {if (GLeeInit()) glEndTransformFeedbackNV();} + GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glEndTransformFeedbackNV=GLee_Lazy_glEndTransformFeedbackNV; +#endif +#ifndef GLEE_C_DEFINED_glTransformFeedbackAttribsNV +#define GLEE_C_DEFINED_glTransformFeedbackAttribsNV + void __stdcall GLee_Lazy_glTransformFeedbackAttribsNV(GLuint count, const GLint * attribs, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackAttribsNV(count, attribs, bufferMode);} + GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC GLeeFuncPtr_glTransformFeedbackAttribsNV=GLee_Lazy_glTransformFeedbackAttribsNV; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferRangeNV +#define GLEE_C_DEFINED_glBindBufferRangeNV + void __stdcall GLee_Lazy_glBindBufferRangeNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glBindBufferRangeNV(target, index, buffer, offset, size);} + GLEEPFNGLBINDBUFFERRANGENVPROC GLeeFuncPtr_glBindBufferRangeNV=GLee_Lazy_glBindBufferRangeNV; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferOffsetNV +#define GLEE_C_DEFINED_glBindBufferOffsetNV + void __stdcall GLee_Lazy_glBindBufferOffsetNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset) {if (GLeeInit()) glBindBufferOffsetNV(target, index, buffer, offset);} + GLEEPFNGLBINDBUFFEROFFSETNVPROC GLeeFuncPtr_glBindBufferOffsetNV=GLee_Lazy_glBindBufferOffsetNV; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferBaseNV +#define GLEE_C_DEFINED_glBindBufferBaseNV + void __stdcall GLee_Lazy_glBindBufferBaseNV(GLenum target, GLuint index, GLuint buffer) {if (GLeeInit()) glBindBufferBaseNV(target, index, buffer);} + GLEEPFNGLBINDBUFFERBASENVPROC GLeeFuncPtr_glBindBufferBaseNV=GLee_Lazy_glBindBufferBaseNV; +#endif +#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryingsNV +#define GLEE_C_DEFINED_glTransformFeedbackVaryingsNV + void __stdcall GLee_Lazy_glTransformFeedbackVaryingsNV(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackVaryingsNV(program, count, locations, bufferMode);} + GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC GLeeFuncPtr_glTransformFeedbackVaryingsNV=GLee_Lazy_glTransformFeedbackVaryingsNV; +#endif +#ifndef GLEE_C_DEFINED_glActiveVaryingNV +#define GLEE_C_DEFINED_glActiveVaryingNV + void __stdcall GLee_Lazy_glActiveVaryingNV(GLuint program, const GLchar * name) {if (GLeeInit()) glActiveVaryingNV(program, name);} + GLEEPFNGLACTIVEVARYINGNVPROC GLeeFuncPtr_glActiveVaryingNV=GLee_Lazy_glActiveVaryingNV; +#endif +#ifndef GLEE_C_DEFINED_glGetVaryingLocationNV +#define GLEE_C_DEFINED_glGetVaryingLocationNV + GLint __stdcall GLee_Lazy_glGetVaryingLocationNV(GLuint program, const GLchar * name) {if (GLeeInit()) return glGetVaryingLocationNV(program, name); return (GLint)0;} + GLEEPFNGLGETVARYINGLOCATIONNVPROC GLeeFuncPtr_glGetVaryingLocationNV=GLee_Lazy_glGetVaryingLocationNV; +#endif +#ifndef GLEE_C_DEFINED_glGetActiveVaryingNV +#define GLEE_C_DEFINED_glGetActiveVaryingNV + void __stdcall GLee_Lazy_glGetActiveVaryingNV(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name) {if (GLeeInit()) glGetActiveVaryingNV(program, index, bufSize, length, size, type, name);} + GLEEPFNGLGETACTIVEVARYINGNVPROC GLeeFuncPtr_glGetActiveVaryingNV=GLee_Lazy_glGetActiveVaryingNV; +#endif +#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVaryingNV +#define GLEE_C_DEFINED_glGetTransformFeedbackVaryingNV + void __stdcall GLee_Lazy_glGetTransformFeedbackVaryingNV(GLuint program, GLuint index, GLint * location) {if (GLeeInit()) glGetTransformFeedbackVaryingNV(program, index, location);} + GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC GLeeFuncPtr_glGetTransformFeedbackVaryingNV=GLee_Lazy_glGetTransformFeedbackVaryingNV; +#endif +#endif + +/* GL_EXT_bindable_uniform */ + +#ifdef __GLEE_GL_EXT_bindable_uniform +#ifndef GLEE_C_DEFINED_glUniformBufferEXT +#define GLEE_C_DEFINED_glUniformBufferEXT + void __stdcall GLee_Lazy_glUniformBufferEXT(GLuint program, GLint location, GLuint buffer) {if (GLeeInit()) glUniformBufferEXT(program, location, buffer);} + GLEEPFNGLUNIFORMBUFFEREXTPROC GLeeFuncPtr_glUniformBufferEXT=GLee_Lazy_glUniformBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformBufferSizeEXT +#define GLEE_C_DEFINED_glGetUniformBufferSizeEXT + GLint __stdcall GLee_Lazy_glGetUniformBufferSizeEXT(GLuint program, GLint location) {if (GLeeInit()) return glGetUniformBufferSizeEXT(program, location); return (GLint)0;} + GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC GLeeFuncPtr_glGetUniformBufferSizeEXT=GLee_Lazy_glGetUniformBufferSizeEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetUniformOffsetEXT +#define GLEE_C_DEFINED_glGetUniformOffsetEXT + GLintptr __stdcall GLee_Lazy_glGetUniformOffsetEXT(GLuint program, GLint location) {if (GLeeInit()) return glGetUniformOffsetEXT(program, location); return (GLintptr)0;} + GLEEPFNGLGETUNIFORMOFFSETEXTPROC GLeeFuncPtr_glGetUniformOffsetEXT=GLee_Lazy_glGetUniformOffsetEXT; +#endif +#endif + +/* GL_EXT_texture_integer */ + +#ifdef __GLEE_GL_EXT_texture_integer +#ifndef GLEE_C_DEFINED_glTexParameterIivEXT +#define GLEE_C_DEFINED_glTexParameterIivEXT + void __stdcall GLee_Lazy_glTexParameterIivEXT(GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTexParameterIivEXT(target, pname, params);} + GLEEPFNGLTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glTexParameterIivEXT=GLee_Lazy_glTexParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glTexParameterIuivEXT +#define GLEE_C_DEFINED_glTexParameterIuivEXT + void __stdcall GLee_Lazy_glTexParameterIuivEXT(GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glTexParameterIuivEXT(target, pname, params);} + GLEEPFNGLTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glTexParameterIuivEXT=GLee_Lazy_glTexParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTexParameterIivEXT +#define GLEE_C_DEFINED_glGetTexParameterIivEXT + void __stdcall GLee_Lazy_glGetTexParameterIivEXT(GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTexParameterIivEXT(target, pname, params);} + GLEEPFNGLGETTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTexParameterIivEXT=GLee_Lazy_glGetTexParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTexParameterIuivEXT +#define GLEE_C_DEFINED_glGetTexParameterIuivEXT + void __stdcall GLee_Lazy_glGetTexParameterIuivEXT(GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetTexParameterIuivEXT(target, pname, params);} + GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTexParameterIuivEXT=GLee_Lazy_glGetTexParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glClearColorIiEXT +#define GLEE_C_DEFINED_glClearColorIiEXT + void __stdcall GLee_Lazy_glClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha) {if (GLeeInit()) glClearColorIiEXT(red, green, blue, alpha);} + GLEEPFNGLCLEARCOLORIIEXTPROC GLeeFuncPtr_glClearColorIiEXT=GLee_Lazy_glClearColorIiEXT; +#endif +#ifndef GLEE_C_DEFINED_glClearColorIuiEXT +#define GLEE_C_DEFINED_glClearColorIuiEXT + void __stdcall GLee_Lazy_glClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha) {if (GLeeInit()) glClearColorIuiEXT(red, green, blue, alpha);} + GLEEPFNGLCLEARCOLORIUIEXTPROC GLeeFuncPtr_glClearColorIuiEXT=GLee_Lazy_glClearColorIuiEXT; +#endif +#endif + +/* GL_GREMEDY_frame_terminator */ + +#ifdef __GLEE_GL_GREMEDY_frame_terminator +#ifndef GLEE_C_DEFINED_glFrameTerminatorGREMEDY +#define GLEE_C_DEFINED_glFrameTerminatorGREMEDY + void __stdcall GLee_Lazy_glFrameTerminatorGREMEDY(void) {if (GLeeInit()) glFrameTerminatorGREMEDY();} + GLEEPFNGLFRAMETERMINATORGREMEDYPROC GLeeFuncPtr_glFrameTerminatorGREMEDY=GLee_Lazy_glFrameTerminatorGREMEDY; +#endif +#endif + +/* GL_NV_conditional_render */ + +#ifdef __GLEE_GL_NV_conditional_render +#ifndef GLEE_C_DEFINED_glBeginConditionalRenderNV +#define GLEE_C_DEFINED_glBeginConditionalRenderNV + void __stdcall GLee_Lazy_glBeginConditionalRenderNV(GLuint id, GLenum mode) {if (GLeeInit()) glBeginConditionalRenderNV(id, mode);} + GLEEPFNGLBEGINCONDITIONALRENDERNVPROC GLeeFuncPtr_glBeginConditionalRenderNV=GLee_Lazy_glBeginConditionalRenderNV; +#endif +#ifndef GLEE_C_DEFINED_glEndConditionalRenderNV +#define GLEE_C_DEFINED_glEndConditionalRenderNV + void __stdcall GLee_Lazy_glEndConditionalRenderNV(void) {if (GLeeInit()) glEndConditionalRenderNV();} + GLEEPFNGLENDCONDITIONALRENDERNVPROC GLeeFuncPtr_glEndConditionalRenderNV=GLee_Lazy_glEndConditionalRenderNV; +#endif +#endif + +/* GL_NV_present_video */ + +#ifdef __GLEE_GL_NV_present_video +#endif + +/* GL_EXT_transform_feedback */ + +#ifdef __GLEE_GL_EXT_transform_feedback +#ifndef GLEE_C_DEFINED_glBeginTransformFeedbackEXT +#define GLEE_C_DEFINED_glBeginTransformFeedbackEXT + void __stdcall GLee_Lazy_glBeginTransformFeedbackEXT(GLenum primitiveMode) {if (GLeeInit()) glBeginTransformFeedbackEXT(primitiveMode);} + GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glBeginTransformFeedbackEXT=GLee_Lazy_glBeginTransformFeedbackEXT; +#endif +#ifndef GLEE_C_DEFINED_glEndTransformFeedbackEXT +#define GLEE_C_DEFINED_glEndTransformFeedbackEXT + void __stdcall GLee_Lazy_glEndTransformFeedbackEXT(void) {if (GLeeInit()) glEndTransformFeedbackEXT();} + GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glEndTransformFeedbackEXT=GLee_Lazy_glEndTransformFeedbackEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferRangeEXT +#define GLEE_C_DEFINED_glBindBufferRangeEXT + void __stdcall GLee_Lazy_glBindBufferRangeEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {if (GLeeInit()) glBindBufferRangeEXT(target, index, buffer, offset, size);} + GLEEPFNGLBINDBUFFERRANGEEXTPROC GLeeFuncPtr_glBindBufferRangeEXT=GLee_Lazy_glBindBufferRangeEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferOffsetEXT +#define GLEE_C_DEFINED_glBindBufferOffsetEXT + void __stdcall GLee_Lazy_glBindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset) {if (GLeeInit()) glBindBufferOffsetEXT(target, index, buffer, offset);} + GLEEPFNGLBINDBUFFEROFFSETEXTPROC GLeeFuncPtr_glBindBufferOffsetEXT=GLee_Lazy_glBindBufferOffsetEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindBufferBaseEXT +#define GLEE_C_DEFINED_glBindBufferBaseEXT + void __stdcall GLee_Lazy_glBindBufferBaseEXT(GLenum target, GLuint index, GLuint buffer) {if (GLeeInit()) glBindBufferBaseEXT(target, index, buffer);} + GLEEPFNGLBINDBUFFERBASEEXTPROC GLeeFuncPtr_glBindBufferBaseEXT=GLee_Lazy_glBindBufferBaseEXT; +#endif +#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryingsEXT +#define GLEE_C_DEFINED_glTransformFeedbackVaryingsEXT + void __stdcall GLee_Lazy_glTransformFeedbackVaryingsEXT(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode) {if (GLeeInit()) glTransformFeedbackVaryingsEXT(program, count, locations, bufferMode);} + GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC GLeeFuncPtr_glTransformFeedbackVaryingsEXT=GLee_Lazy_glTransformFeedbackVaryingsEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVaryingEXT +#define GLEE_C_DEFINED_glGetTransformFeedbackVaryingEXT + void __stdcall GLee_Lazy_glGetTransformFeedbackVaryingEXT(GLuint program, GLuint index, GLint * location) {if (GLeeInit()) glGetTransformFeedbackVaryingEXT(program, index, location);} + GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC GLeeFuncPtr_glGetTransformFeedbackVaryingEXT=GLee_Lazy_glGetTransformFeedbackVaryingEXT; +#endif +#endif + +/* GL_EXT_direct_state_access */ + +#ifdef __GLEE_GL_EXT_direct_state_access +#ifndef GLEE_C_DEFINED_glClientAttribDefaultEXT +#define GLEE_C_DEFINED_glClientAttribDefaultEXT + void __stdcall GLee_Lazy_glClientAttribDefaultEXT(GLbitfield mask) {if (GLeeInit()) glClientAttribDefaultEXT(mask);} + GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glClientAttribDefaultEXT=GLee_Lazy_glClientAttribDefaultEXT; +#endif +#ifndef GLEE_C_DEFINED_glPushClientAttribDefaultEXT +#define GLEE_C_DEFINED_glPushClientAttribDefaultEXT + void __stdcall GLee_Lazy_glPushClientAttribDefaultEXT(GLbitfield mask) {if (GLeeInit()) glPushClientAttribDefaultEXT(mask);} + GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glPushClientAttribDefaultEXT=GLee_Lazy_glPushClientAttribDefaultEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixLoadfEXT +#define GLEE_C_DEFINED_glMatrixLoadfEXT + void __stdcall GLee_Lazy_glMatrixLoadfEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixLoadfEXT(mode, m);} + GLEEPFNGLMATRIXLOADFEXTPROC GLeeFuncPtr_glMatrixLoadfEXT=GLee_Lazy_glMatrixLoadfEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixLoaddEXT +#define GLEE_C_DEFINED_glMatrixLoaddEXT + void __stdcall GLee_Lazy_glMatrixLoaddEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixLoaddEXT(mode, m);} + GLEEPFNGLMATRIXLOADDEXTPROC GLeeFuncPtr_glMatrixLoaddEXT=GLee_Lazy_glMatrixLoaddEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixMultfEXT +#define GLEE_C_DEFINED_glMatrixMultfEXT + void __stdcall GLee_Lazy_glMatrixMultfEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixMultfEXT(mode, m);} + GLEEPFNGLMATRIXMULTFEXTPROC GLeeFuncPtr_glMatrixMultfEXT=GLee_Lazy_glMatrixMultfEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixMultdEXT +#define GLEE_C_DEFINED_glMatrixMultdEXT + void __stdcall GLee_Lazy_glMatrixMultdEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixMultdEXT(mode, m);} + GLEEPFNGLMATRIXMULTDEXTPROC GLeeFuncPtr_glMatrixMultdEXT=GLee_Lazy_glMatrixMultdEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixLoadIdentityEXT +#define GLEE_C_DEFINED_glMatrixLoadIdentityEXT + void __stdcall GLee_Lazy_glMatrixLoadIdentityEXT(GLenum mode) {if (GLeeInit()) glMatrixLoadIdentityEXT(mode);} + GLEEPFNGLMATRIXLOADIDENTITYEXTPROC GLeeFuncPtr_glMatrixLoadIdentityEXT=GLee_Lazy_glMatrixLoadIdentityEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixRotatefEXT +#define GLEE_C_DEFINED_glMatrixRotatefEXT + void __stdcall GLee_Lazy_glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glMatrixRotatefEXT(mode, angle, x, y, z);} + GLEEPFNGLMATRIXROTATEFEXTPROC GLeeFuncPtr_glMatrixRotatefEXT=GLee_Lazy_glMatrixRotatefEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixRotatedEXT +#define GLEE_C_DEFINED_glMatrixRotatedEXT + void __stdcall GLee_Lazy_glMatrixRotatedEXT(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glMatrixRotatedEXT(mode, angle, x, y, z);} + GLEEPFNGLMATRIXROTATEDEXTPROC GLeeFuncPtr_glMatrixRotatedEXT=GLee_Lazy_glMatrixRotatedEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixScalefEXT +#define GLEE_C_DEFINED_glMatrixScalefEXT + void __stdcall GLee_Lazy_glMatrixScalefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glMatrixScalefEXT(mode, x, y, z);} + GLEEPFNGLMATRIXSCALEFEXTPROC GLeeFuncPtr_glMatrixScalefEXT=GLee_Lazy_glMatrixScalefEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixScaledEXT +#define GLEE_C_DEFINED_glMatrixScaledEXT + void __stdcall GLee_Lazy_glMatrixScaledEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glMatrixScaledEXT(mode, x, y, z);} + GLEEPFNGLMATRIXSCALEDEXTPROC GLeeFuncPtr_glMatrixScaledEXT=GLee_Lazy_glMatrixScaledEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixTranslatefEXT +#define GLEE_C_DEFINED_glMatrixTranslatefEXT + void __stdcall GLee_Lazy_glMatrixTranslatefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) {if (GLeeInit()) glMatrixTranslatefEXT(mode, x, y, z);} + GLEEPFNGLMATRIXTRANSLATEFEXTPROC GLeeFuncPtr_glMatrixTranslatefEXT=GLee_Lazy_glMatrixTranslatefEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixTranslatedEXT +#define GLEE_C_DEFINED_glMatrixTranslatedEXT + void __stdcall GLee_Lazy_glMatrixTranslatedEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) {if (GLeeInit()) glMatrixTranslatedEXT(mode, x, y, z);} + GLEEPFNGLMATRIXTRANSLATEDEXTPROC GLeeFuncPtr_glMatrixTranslatedEXT=GLee_Lazy_glMatrixTranslatedEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixFrustumEXT +#define GLEE_C_DEFINED_glMatrixFrustumEXT + void __stdcall GLee_Lazy_glMatrixFrustumEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) {if (GLeeInit()) glMatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar);} + GLEEPFNGLMATRIXFRUSTUMEXTPROC GLeeFuncPtr_glMatrixFrustumEXT=GLee_Lazy_glMatrixFrustumEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixOrthoEXT +#define GLEE_C_DEFINED_glMatrixOrthoEXT + void __stdcall GLee_Lazy_glMatrixOrthoEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) {if (GLeeInit()) glMatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar);} + GLEEPFNGLMATRIXORTHOEXTPROC GLeeFuncPtr_glMatrixOrthoEXT=GLee_Lazy_glMatrixOrthoEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixPopEXT +#define GLEE_C_DEFINED_glMatrixPopEXT + void __stdcall GLee_Lazy_glMatrixPopEXT(GLenum mode) {if (GLeeInit()) glMatrixPopEXT(mode);} + GLEEPFNGLMATRIXPOPEXTPROC GLeeFuncPtr_glMatrixPopEXT=GLee_Lazy_glMatrixPopEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixPushEXT +#define GLEE_C_DEFINED_glMatrixPushEXT + void __stdcall GLee_Lazy_glMatrixPushEXT(GLenum mode) {if (GLeeInit()) glMatrixPushEXT(mode);} + GLEEPFNGLMATRIXPUSHEXTPROC GLeeFuncPtr_glMatrixPushEXT=GLee_Lazy_glMatrixPushEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixLoadTransposefEXT +#define GLEE_C_DEFINED_glMatrixLoadTransposefEXT + void __stdcall GLee_Lazy_glMatrixLoadTransposefEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixLoadTransposefEXT(mode, m);} + GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixLoadTransposefEXT=GLee_Lazy_glMatrixLoadTransposefEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixLoadTransposedEXT +#define GLEE_C_DEFINED_glMatrixLoadTransposedEXT + void __stdcall GLee_Lazy_glMatrixLoadTransposedEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixLoadTransposedEXT(mode, m);} + GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixLoadTransposedEXT=GLee_Lazy_glMatrixLoadTransposedEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixMultTransposefEXT +#define GLEE_C_DEFINED_glMatrixMultTransposefEXT + void __stdcall GLee_Lazy_glMatrixMultTransposefEXT(GLenum mode, const GLfloat * m) {if (GLeeInit()) glMatrixMultTransposefEXT(mode, m);} + GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixMultTransposefEXT=GLee_Lazy_glMatrixMultTransposefEXT; +#endif +#ifndef GLEE_C_DEFINED_glMatrixMultTransposedEXT +#define GLEE_C_DEFINED_glMatrixMultTransposedEXT + void __stdcall GLee_Lazy_glMatrixMultTransposedEXT(GLenum mode, const GLdouble * m) {if (GLeeInit()) glMatrixMultTransposedEXT(mode, m);} + GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixMultTransposedEXT=GLee_Lazy_glMatrixMultTransposedEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureParameterfEXT +#define GLEE_C_DEFINED_glTextureParameterfEXT + void __stdcall GLee_Lazy_glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glTextureParameterfEXT(texture, target, pname, param);} + GLEEPFNGLTEXTUREPARAMETERFEXTPROC GLeeFuncPtr_glTextureParameterfEXT=GLee_Lazy_glTextureParameterfEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureParameterfvEXT +#define GLEE_C_DEFINED_glTextureParameterfvEXT + void __stdcall GLee_Lazy_glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glTextureParameterfvEXT(texture, target, pname, params);} + GLEEPFNGLTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glTextureParameterfvEXT=GLee_Lazy_glTextureParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureParameteriEXT +#define GLEE_C_DEFINED_glTextureParameteriEXT + void __stdcall GLee_Lazy_glTextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glTextureParameteriEXT(texture, target, pname, param);} + GLEEPFNGLTEXTUREPARAMETERIEXTPROC GLeeFuncPtr_glTextureParameteriEXT=GLee_Lazy_glTextureParameteriEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureParameterivEXT +#define GLEE_C_DEFINED_glTextureParameterivEXT + void __stdcall GLee_Lazy_glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTextureParameterivEXT(texture, target, pname, params);} + GLEEPFNGLTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glTextureParameterivEXT=GLee_Lazy_glTextureParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureImage1DEXT +#define GLEE_C_DEFINED_glTextureImage1DEXT + void __stdcall GLee_Lazy_glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels);} + GLEEPFNGLTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glTextureImage1DEXT=GLee_Lazy_glTextureImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureImage2DEXT +#define GLEE_C_DEFINED_glTextureImage2DEXT + void __stdcall GLee_Lazy_glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels);} + GLEEPFNGLTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glTextureImage2DEXT=GLee_Lazy_glTextureImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureSubImage1DEXT +#define GLEE_C_DEFINED_glTextureSubImage1DEXT + void __stdcall GLee_Lazy_glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);} + GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glTextureSubImage1DEXT=GLee_Lazy_glTextureSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureSubImage2DEXT +#define GLEE_C_DEFINED_glTextureSubImage2DEXT + void __stdcall GLee_Lazy_glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);} + GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glTextureSubImage2DEXT=GLee_Lazy_glTextureSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTextureImage1DEXT +#define GLEE_C_DEFINED_glCopyTextureImage1DEXT + void __stdcall GLee_Lazy_glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) {if (GLeeInit()) glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border);} + GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureImage1DEXT=GLee_Lazy_glCopyTextureImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTextureImage2DEXT +#define GLEE_C_DEFINED_glCopyTextureImage2DEXT + void __stdcall GLee_Lazy_glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {if (GLeeInit()) glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border);} + GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureImage2DEXT=GLee_Lazy_glCopyTextureImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTextureSubImage1DEXT +#define GLEE_C_DEFINED_glCopyTextureSubImage1DEXT + void __stdcall GLee_Lazy_glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width);} + GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureSubImage1DEXT=GLee_Lazy_glCopyTextureSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTextureSubImage2DEXT +#define GLEE_C_DEFINED_glCopyTextureSubImage2DEXT + void __stdcall GLee_Lazy_glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height);} + GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureSubImage2DEXT=GLee_Lazy_glCopyTextureSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureImageEXT +#define GLEE_C_DEFINED_glGetTextureImageEXT + void __stdcall GLee_Lazy_glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels) {if (GLeeInit()) glGetTextureImageEXT(texture, target, level, format, type, pixels);} + GLEEPFNGLGETTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetTextureImageEXT=GLee_Lazy_glGetTextureImageEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureParameterfvEXT +#define GLEE_C_DEFINED_glGetTextureParameterfvEXT + void __stdcall GLee_Lazy_glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetTextureParameterfvEXT(texture, target, pname, params);} + GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureParameterfvEXT=GLee_Lazy_glGetTextureParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureParameterivEXT +#define GLEE_C_DEFINED_glGetTextureParameterivEXT + void __stdcall GLee_Lazy_glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTextureParameterivEXT(texture, target, pname, params);} + GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureParameterivEXT=GLee_Lazy_glGetTextureParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureLevelParameterfvEXT +#define GLEE_C_DEFINED_glGetTextureLevelParameterfvEXT + void __stdcall GLee_Lazy_glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetTextureLevelParameterfvEXT(texture, target, level, pname, params);} + GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterfvEXT=GLee_Lazy_glGetTextureLevelParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureLevelParameterivEXT +#define GLEE_C_DEFINED_glGetTextureLevelParameterivEXT + void __stdcall GLee_Lazy_glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params) {if (GLeeInit()) glGetTextureLevelParameterivEXT(texture, target, level, pname, params);} + GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterivEXT=GLee_Lazy_glGetTextureLevelParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureImage3DEXT +#define GLEE_C_DEFINED_glTextureImage3DEXT + void __stdcall GLee_Lazy_glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels);} + GLEEPFNGLTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glTextureImage3DEXT=GLee_Lazy_glTextureImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureSubImage3DEXT +#define GLEE_C_DEFINED_glTextureSubImage3DEXT + void __stdcall GLee_Lazy_glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} + GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glTextureSubImage3DEXT=GLee_Lazy_glTextureSubImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyTextureSubImage3DEXT +#define GLEE_C_DEFINED_glCopyTextureSubImage3DEXT + void __stdcall GLee_Lazy_glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height);} + GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTextureSubImage3DEXT=GLee_Lazy_glCopyTextureSubImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexParameterfEXT +#define GLEE_C_DEFINED_glMultiTexParameterfEXT + void __stdcall GLee_Lazy_glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glMultiTexParameterfEXT(texunit, target, pname, param);} + GLEEPFNGLMULTITEXPARAMETERFEXTPROC GLeeFuncPtr_glMultiTexParameterfEXT=GLee_Lazy_glMultiTexParameterfEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexParameterfvEXT +#define GLEE_C_DEFINED_glMultiTexParameterfvEXT + void __stdcall GLee_Lazy_glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMultiTexParameterfvEXT(texunit, target, pname, params);} + GLEEPFNGLMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glMultiTexParameterfvEXT=GLee_Lazy_glMultiTexParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexParameteriEXT +#define GLEE_C_DEFINED_glMultiTexParameteriEXT + void __stdcall GLee_Lazy_glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glMultiTexParameteriEXT(texunit, target, pname, param);} + GLEEPFNGLMULTITEXPARAMETERIEXTPROC GLeeFuncPtr_glMultiTexParameteriEXT=GLee_Lazy_glMultiTexParameteriEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexParameterivEXT +#define GLEE_C_DEFINED_glMultiTexParameterivEXT + void __stdcall GLee_Lazy_glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexParameterivEXT(texunit, target, pname, params);} + GLEEPFNGLMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glMultiTexParameterivEXT=GLee_Lazy_glMultiTexParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexImage1DEXT +#define GLEE_C_DEFINED_glMultiTexImage1DEXT + void __stdcall GLee_Lazy_glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels);} + GLEEPFNGLMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexImage1DEXT=GLee_Lazy_glMultiTexImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexImage2DEXT +#define GLEE_C_DEFINED_glMultiTexImage2DEXT + void __stdcall GLee_Lazy_glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels);} + GLEEPFNGLMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexImage2DEXT=GLee_Lazy_glMultiTexImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexSubImage1DEXT +#define GLEE_C_DEFINED_glMultiTexSubImage1DEXT + void __stdcall GLee_Lazy_glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels);} + GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexSubImage1DEXT=GLee_Lazy_glMultiTexSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexSubImage2DEXT +#define GLEE_C_DEFINED_glMultiTexSubImage2DEXT + void __stdcall GLee_Lazy_glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels);} + GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexSubImage2DEXT=GLee_Lazy_glMultiTexSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyMultiTexImage1DEXT +#define GLEE_C_DEFINED_glCopyMultiTexImage1DEXT + void __stdcall GLee_Lazy_glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) {if (GLeeInit()) glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border);} + GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexImage1DEXT=GLee_Lazy_glCopyMultiTexImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyMultiTexImage2DEXT +#define GLEE_C_DEFINED_glCopyMultiTexImage2DEXT + void __stdcall GLee_Lazy_glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {if (GLeeInit()) glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border);} + GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexImage2DEXT=GLee_Lazy_glCopyMultiTexImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage1DEXT +#define GLEE_C_DEFINED_glCopyMultiTexSubImage1DEXT + void __stdcall GLee_Lazy_glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) {if (GLeeInit()) glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width);} + GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage1DEXT=GLee_Lazy_glCopyMultiTexSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage2DEXT +#define GLEE_C_DEFINED_glCopyMultiTexSubImage2DEXT + void __stdcall GLee_Lazy_glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height);} + GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage2DEXT=GLee_Lazy_glCopyMultiTexSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexImageEXT +#define GLEE_C_DEFINED_glGetMultiTexImageEXT + void __stdcall GLee_Lazy_glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels) {if (GLeeInit()) glGetMultiTexImageEXT(texunit, target, level, format, type, pixels);} + GLEEPFNGLGETMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetMultiTexImageEXT=GLee_Lazy_glGetMultiTexImageEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexParameterfvEXT +#define GLEE_C_DEFINED_glGetMultiTexParameterfvEXT + void __stdcall GLee_Lazy_glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexParameterfvEXT(texunit, target, pname, params);} + GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexParameterfvEXT=GLee_Lazy_glGetMultiTexParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexParameterivEXT +#define GLEE_C_DEFINED_glGetMultiTexParameterivEXT + void __stdcall GLee_Lazy_glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexParameterivEXT(texunit, target, pname, params);} + GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterivEXT=GLee_Lazy_glGetMultiTexParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexLevelParameterfvEXT +#define GLEE_C_DEFINED_glGetMultiTexLevelParameterfvEXT + void __stdcall GLee_Lazy_glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params);} + GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT=GLee_Lazy_glGetMultiTexLevelParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexLevelParameterivEXT +#define GLEE_C_DEFINED_glGetMultiTexLevelParameterivEXT + void __stdcall GLee_Lazy_glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params);} + GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterivEXT=GLee_Lazy_glGetMultiTexLevelParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexImage3DEXT +#define GLEE_C_DEFINED_glMultiTexImage3DEXT + void __stdcall GLee_Lazy_glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels);} + GLEEPFNGLMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexImage3DEXT=GLee_Lazy_glMultiTexImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexSubImage3DEXT +#define GLEE_C_DEFINED_glMultiTexSubImage3DEXT + void __stdcall GLee_Lazy_glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels) {if (GLeeInit()) glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);} + GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexSubImage3DEXT=GLee_Lazy_glMultiTexSubImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage3DEXT +#define GLEE_C_DEFINED_glCopyMultiTexSubImage3DEXT + void __stdcall GLee_Lazy_glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {if (GLeeInit()) glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height);} + GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage3DEXT=GLee_Lazy_glCopyMultiTexSubImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glBindMultiTextureEXT +#define GLEE_C_DEFINED_glBindMultiTextureEXT + void __stdcall GLee_Lazy_glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture) {if (GLeeInit()) glBindMultiTextureEXT(texunit, target, texture);} + GLEEPFNGLBINDMULTITEXTUREEXTPROC GLeeFuncPtr_glBindMultiTextureEXT=GLee_Lazy_glBindMultiTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glEnableClientStateIndexedEXT +#define GLEE_C_DEFINED_glEnableClientStateIndexedEXT + void __stdcall GLee_Lazy_glEnableClientStateIndexedEXT(GLenum array, GLuint index) {if (GLeeInit()) glEnableClientStateIndexedEXT(array, index);} + GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glEnableClientStateIndexedEXT=GLee_Lazy_glEnableClientStateIndexedEXT; +#endif +#ifndef GLEE_C_DEFINED_glDisableClientStateIndexedEXT +#define GLEE_C_DEFINED_glDisableClientStateIndexedEXT + void __stdcall GLee_Lazy_glDisableClientStateIndexedEXT(GLenum array, GLuint index) {if (GLeeInit()) glDisableClientStateIndexedEXT(array, index);} + GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glDisableClientStateIndexedEXT=GLee_Lazy_glDisableClientStateIndexedEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexCoordPointerEXT +#define GLEE_C_DEFINED_glMultiTexCoordPointerEXT + void __stdcall GLee_Lazy_glMultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer);} + GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC GLeeFuncPtr_glMultiTexCoordPointerEXT=GLee_Lazy_glMultiTexCoordPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexEnvfEXT +#define GLEE_C_DEFINED_glMultiTexEnvfEXT + void __stdcall GLee_Lazy_glMultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) {if (GLeeInit()) glMultiTexEnvfEXT(texunit, target, pname, param);} + GLEEPFNGLMULTITEXENVFEXTPROC GLeeFuncPtr_glMultiTexEnvfEXT=GLee_Lazy_glMultiTexEnvfEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexEnvfvEXT +#define GLEE_C_DEFINED_glMultiTexEnvfvEXT + void __stdcall GLee_Lazy_glMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMultiTexEnvfvEXT(texunit, target, pname, params);} + GLEEPFNGLMULTITEXENVFVEXTPROC GLeeFuncPtr_glMultiTexEnvfvEXT=GLee_Lazy_glMultiTexEnvfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexEnviEXT +#define GLEE_C_DEFINED_glMultiTexEnviEXT + void __stdcall GLee_Lazy_glMultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) {if (GLeeInit()) glMultiTexEnviEXT(texunit, target, pname, param);} + GLEEPFNGLMULTITEXENVIEXTPROC GLeeFuncPtr_glMultiTexEnviEXT=GLee_Lazy_glMultiTexEnviEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexEnvivEXT +#define GLEE_C_DEFINED_glMultiTexEnvivEXT + void __stdcall GLee_Lazy_glMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexEnvivEXT(texunit, target, pname, params);} + GLEEPFNGLMULTITEXENVIVEXTPROC GLeeFuncPtr_glMultiTexEnvivEXT=GLee_Lazy_glMultiTexEnvivEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexGendEXT +#define GLEE_C_DEFINED_glMultiTexGendEXT + void __stdcall GLee_Lazy_glMultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param) {if (GLeeInit()) glMultiTexGendEXT(texunit, coord, pname, param);} + GLEEPFNGLMULTITEXGENDEXTPROC GLeeFuncPtr_glMultiTexGendEXT=GLee_Lazy_glMultiTexGendEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexGendvEXT +#define GLEE_C_DEFINED_glMultiTexGendvEXT + void __stdcall GLee_Lazy_glMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params) {if (GLeeInit()) glMultiTexGendvEXT(texunit, coord, pname, params);} + GLEEPFNGLMULTITEXGENDVEXTPROC GLeeFuncPtr_glMultiTexGendvEXT=GLee_Lazy_glMultiTexGendvEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexGenfEXT +#define GLEE_C_DEFINED_glMultiTexGenfEXT + void __stdcall GLee_Lazy_glMultiTexGenfEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat param) {if (GLeeInit()) glMultiTexGenfEXT(texunit, coord, pname, param);} + GLEEPFNGLMULTITEXGENFEXTPROC GLeeFuncPtr_glMultiTexGenfEXT=GLee_Lazy_glMultiTexGenfEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexGenfvEXT +#define GLEE_C_DEFINED_glMultiTexGenfvEXT + void __stdcall GLee_Lazy_glMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params) {if (GLeeInit()) glMultiTexGenfvEXT(texunit, coord, pname, params);} + GLEEPFNGLMULTITEXGENFVEXTPROC GLeeFuncPtr_glMultiTexGenfvEXT=GLee_Lazy_glMultiTexGenfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexGeniEXT +#define GLEE_C_DEFINED_glMultiTexGeniEXT + void __stdcall GLee_Lazy_glMultiTexGeniEXT(GLenum texunit, GLenum coord, GLenum pname, GLint param) {if (GLeeInit()) glMultiTexGeniEXT(texunit, coord, pname, param);} + GLEEPFNGLMULTITEXGENIEXTPROC GLeeFuncPtr_glMultiTexGeniEXT=GLee_Lazy_glMultiTexGeniEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexGenivEXT +#define GLEE_C_DEFINED_glMultiTexGenivEXT + void __stdcall GLee_Lazy_glMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexGenivEXT(texunit, coord, pname, params);} + GLEEPFNGLMULTITEXGENIVEXTPROC GLeeFuncPtr_glMultiTexGenivEXT=GLee_Lazy_glMultiTexGenivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexEnvfvEXT +#define GLEE_C_DEFINED_glGetMultiTexEnvfvEXT + void __stdcall GLee_Lazy_glGetMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexEnvfvEXT(texunit, target, pname, params);} + GLEEPFNGLGETMULTITEXENVFVEXTPROC GLeeFuncPtr_glGetMultiTexEnvfvEXT=GLee_Lazy_glGetMultiTexEnvfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexEnvivEXT +#define GLEE_C_DEFINED_glGetMultiTexEnvivEXT + void __stdcall GLee_Lazy_glGetMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexEnvivEXT(texunit, target, pname, params);} + GLEEPFNGLGETMULTITEXENVIVEXTPROC GLeeFuncPtr_glGetMultiTexEnvivEXT=GLee_Lazy_glGetMultiTexEnvivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexGendvEXT +#define GLEE_C_DEFINED_glGetMultiTexGendvEXT + void __stdcall GLee_Lazy_glGetMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble * params) {if (GLeeInit()) glGetMultiTexGendvEXT(texunit, coord, pname, params);} + GLEEPFNGLGETMULTITEXGENDVEXTPROC GLeeFuncPtr_glGetMultiTexGendvEXT=GLee_Lazy_glGetMultiTexGendvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexGenfvEXT +#define GLEE_C_DEFINED_glGetMultiTexGenfvEXT + void __stdcall GLee_Lazy_glGetMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetMultiTexGenfvEXT(texunit, coord, pname, params);} + GLEEPFNGLGETMULTITEXGENFVEXTPROC GLeeFuncPtr_glGetMultiTexGenfvEXT=GLee_Lazy_glGetMultiTexGenfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexGenivEXT +#define GLEE_C_DEFINED_glGetMultiTexGenivEXT + void __stdcall GLee_Lazy_glGetMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexGenivEXT(texunit, coord, pname, params);} + GLEEPFNGLGETMULTITEXGENIVEXTPROC GLeeFuncPtr_glGetMultiTexGenivEXT=GLee_Lazy_glGetMultiTexGenivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFloatIndexedvEXT +#define GLEE_C_DEFINED_glGetFloatIndexedvEXT + void __stdcall GLee_Lazy_glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat * data) {if (GLeeInit()) glGetFloatIndexedvEXT(target, index, data);} + GLEEPFNGLGETFLOATINDEXEDVEXTPROC GLeeFuncPtr_glGetFloatIndexedvEXT=GLee_Lazy_glGetFloatIndexedvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetDoubleIndexedvEXT +#define GLEE_C_DEFINED_glGetDoubleIndexedvEXT + void __stdcall GLee_Lazy_glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble * data) {if (GLeeInit()) glGetDoubleIndexedvEXT(target, index, data);} + GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC GLeeFuncPtr_glGetDoubleIndexedvEXT=GLee_Lazy_glGetDoubleIndexedvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetPointerIndexedvEXT +#define GLEE_C_DEFINED_glGetPointerIndexedvEXT + void __stdcall GLee_Lazy_glGetPointerIndexedvEXT(GLenum target, GLuint index, GLvoid* * data) {if (GLeeInit()) glGetPointerIndexedvEXT(target, index, data);} + GLEEPFNGLGETPOINTERINDEXEDVEXTPROC GLeeFuncPtr_glGetPointerIndexedvEXT=GLee_Lazy_glGetPointerIndexedvEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTextureImage3DEXT +#define GLEE_C_DEFINED_glCompressedTextureImage3DEXT + void __stdcall GLee_Lazy_glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits);} + GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureImage3DEXT=GLee_Lazy_glCompressedTextureImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTextureImage2DEXT +#define GLEE_C_DEFINED_glCompressedTextureImage2DEXT + void __stdcall GLee_Lazy_glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits);} + GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureImage2DEXT=GLee_Lazy_glCompressedTextureImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTextureImage1DEXT +#define GLEE_C_DEFINED_glCompressedTextureImage1DEXT + void __stdcall GLee_Lazy_glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits);} + GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureImage1DEXT=GLee_Lazy_glCompressedTextureImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage3DEXT +#define GLEE_C_DEFINED_glCompressedTextureSubImage3DEXT + void __stdcall GLee_Lazy_glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);} + GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage3DEXT=GLee_Lazy_glCompressedTextureSubImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage2DEXT +#define GLEE_C_DEFINED_glCompressedTextureSubImage2DEXT + void __stdcall GLee_Lazy_glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);} + GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage2DEXT=GLee_Lazy_glCompressedTextureSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage1DEXT +#define GLEE_C_DEFINED_glCompressedTextureSubImage1DEXT + void __stdcall GLee_Lazy_glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);} + GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage1DEXT=GLee_Lazy_glCompressedTextureSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetCompressedTextureImageEXT +#define GLEE_C_DEFINED_glGetCompressedTextureImageEXT + void __stdcall GLee_Lazy_glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, GLvoid * img) {if (GLeeInit()) glGetCompressedTextureImageEXT(texture, target, lod, img);} + GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetCompressedTextureImageEXT=GLee_Lazy_glGetCompressedTextureImageEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage3DEXT +#define GLEE_C_DEFINED_glCompressedMultiTexImage3DEXT + void __stdcall GLee_Lazy_glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits);} + GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage3DEXT=GLee_Lazy_glCompressedMultiTexImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage2DEXT +#define GLEE_C_DEFINED_glCompressedMultiTexImage2DEXT + void __stdcall GLee_Lazy_glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits);} + GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage2DEXT=GLee_Lazy_glCompressedMultiTexImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage1DEXT +#define GLEE_C_DEFINED_glCompressedMultiTexImage1DEXT + void __stdcall GLee_Lazy_glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits);} + GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage1DEXT=GLee_Lazy_glCompressedMultiTexImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage3DEXT +#define GLEE_C_DEFINED_glCompressedMultiTexSubImage3DEXT + void __stdcall GLee_Lazy_glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);} + GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT=GLee_Lazy_glCompressedMultiTexSubImage3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage2DEXT +#define GLEE_C_DEFINED_glCompressedMultiTexSubImage2DEXT + void __stdcall GLee_Lazy_glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits);} + GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT=GLee_Lazy_glCompressedMultiTexSubImage2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage1DEXT +#define GLEE_C_DEFINED_glCompressedMultiTexSubImage1DEXT + void __stdcall GLee_Lazy_glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits) {if (GLeeInit()) glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits);} + GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT=GLee_Lazy_glCompressedMultiTexSubImage1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetCompressedMultiTexImageEXT +#define GLEE_C_DEFINED_glGetCompressedMultiTexImageEXT + void __stdcall GLee_Lazy_glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, GLvoid * img) {if (GLeeInit()) glGetCompressedMultiTexImageEXT(texunit, target, lod, img);} + GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetCompressedMultiTexImageEXT=GLee_Lazy_glGetCompressedMultiTexImageEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramStringEXT +#define GLEE_C_DEFINED_glNamedProgramStringEXT + void __stdcall GLee_Lazy_glNamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string) {if (GLeeInit()) glNamedProgramStringEXT(program, target, format, len, string);} + GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glNamedProgramStringEXT=GLee_Lazy_glNamedProgramStringEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4dEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameter4dEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) {if (GLeeInit()) glNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dEXT=GLee_Lazy_glNamedProgramLocalParameter4dEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4dvEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameter4dvEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index, const GLdouble * params) {if (GLeeInit()) glNamedProgramLocalParameter4dvEXT(program, target, index, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT=GLee_Lazy_glNamedProgramLocalParameter4dvEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4fEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameter4fEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {if (GLeeInit()) glNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fEXT=GLee_Lazy_glNamedProgramLocalParameter4fEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4fvEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameter4fvEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index, const GLfloat * params) {if (GLeeInit()) glNamedProgramLocalParameter4fvEXT(program, target, index, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT=GLee_Lazy_glNamedProgramLocalParameter4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterdvEXT +#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterdvEXT + void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterdvEXT(GLuint program, GLenum target, GLuint index, GLdouble * params) {if (GLeeInit()) glGetNamedProgramLocalParameterdvEXT(program, target, index, params);} + GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT=GLee_Lazy_glGetNamedProgramLocalParameterdvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterfvEXT +#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterfvEXT + void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterfvEXT(GLuint program, GLenum target, GLuint index, GLfloat * params) {if (GLeeInit()) glGetNamedProgramLocalParameterfvEXT(program, target, index, params);} + GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT=GLee_Lazy_glGetNamedProgramLocalParameterfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedProgramivEXT +#define GLEE_C_DEFINED_glGetNamedProgramivEXT + void __stdcall GLee_Lazy_glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedProgramivEXT(program, target, pname, params);} + GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC GLeeFuncPtr_glGetNamedProgramivEXT=GLee_Lazy_glGetNamedProgramivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedProgramStringEXT +#define GLEE_C_DEFINED_glGetNamedProgramStringEXT + void __stdcall GLee_Lazy_glGetNamedProgramStringEXT(GLuint program, GLenum target, GLenum pname, GLvoid * string) {if (GLeeInit()) glGetNamedProgramStringEXT(program, target, pname, string);} + GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glGetNamedProgramStringEXT=GLee_Lazy_glGetNamedProgramStringEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameters4fvEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameters4fvEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameters4fvEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params) {if (GLeeInit()) glNamedProgramLocalParameters4fvEXT(program, target, index, count, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT=GLee_Lazy_glNamedProgramLocalParameters4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4iEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4iEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4iEXT(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT=GLee_Lazy_glNamedProgramLocalParameterI4iEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4ivEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4ivEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4ivEXT(GLuint program, GLenum target, GLuint index, const GLint * params) {if (GLeeInit()) glNamedProgramLocalParameterI4ivEXT(program, target, index, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT=GLee_Lazy_glNamedProgramLocalParameterI4ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParametersI4ivEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParametersI4ivEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParametersI4ivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glNamedProgramLocalParametersI4ivEXT(program, target, index, count, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT=GLee_Lazy_glNamedProgramLocalParametersI4ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4uiEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4uiEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4uiEXT(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT=GLee_Lazy_glNamedProgramLocalParameterI4uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4uivEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4uivEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4uivEXT(GLuint program, GLenum target, GLuint index, const GLuint * params) {if (GLeeInit()) glNamedProgramLocalParameterI4uivEXT(program, target, index, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT=GLee_Lazy_glNamedProgramLocalParameterI4uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedProgramLocalParametersI4uivEXT +#define GLEE_C_DEFINED_glNamedProgramLocalParametersI4uivEXT + void __stdcall GLee_Lazy_glNamedProgramLocalParametersI4uivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glNamedProgramLocalParametersI4uivEXT(program, target, index, count, params);} + GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT=GLee_Lazy_glNamedProgramLocalParametersI4uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterIivEXT +#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterIivEXT + void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterIivEXT(GLuint program, GLenum target, GLuint index, GLint * params) {if (GLeeInit()) glGetNamedProgramLocalParameterIivEXT(program, target, index, params);} + GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT=GLee_Lazy_glGetNamedProgramLocalParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterIuivEXT +#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterIuivEXT + void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterIuivEXT(GLuint program, GLenum target, GLuint index, GLuint * params) {if (GLeeInit()) glGetNamedProgramLocalParameterIuivEXT(program, target, index, params);} + GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT=GLee_Lazy_glGetNamedProgramLocalParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureParameterIivEXT +#define GLEE_C_DEFINED_glTextureParameterIivEXT + void __stdcall GLee_Lazy_glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glTextureParameterIivEXT(texture, target, pname, params);} + GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glTextureParameterIivEXT=GLee_Lazy_glTextureParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureParameterIuivEXT +#define GLEE_C_DEFINED_glTextureParameterIuivEXT + void __stdcall GLee_Lazy_glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glTextureParameterIuivEXT(texture, target, pname, params);} + GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glTextureParameterIuivEXT=GLee_Lazy_glTextureParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureParameterIivEXT +#define GLEE_C_DEFINED_glGetTextureParameterIivEXT + void __stdcall GLee_Lazy_glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetTextureParameterIivEXT(texture, target, pname, params);} + GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTextureParameterIivEXT=GLee_Lazy_glGetTextureParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetTextureParameterIuivEXT +#define GLEE_C_DEFINED_glGetTextureParameterIuivEXT + void __stdcall GLee_Lazy_glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetTextureParameterIuivEXT(texture, target, pname, params);} + GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTextureParameterIuivEXT=GLee_Lazy_glGetTextureParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexParameterIivEXT +#define GLEE_C_DEFINED_glMultiTexParameterIivEXT + void __stdcall GLee_Lazy_glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params) {if (GLeeInit()) glMultiTexParameterIivEXT(texunit, target, pname, params);} + GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glMultiTexParameterIivEXT=GLee_Lazy_glMultiTexParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexParameterIuivEXT +#define GLEE_C_DEFINED_glMultiTexParameterIuivEXT + void __stdcall GLee_Lazy_glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint * params) {if (GLeeInit()) glMultiTexParameterIuivEXT(texunit, target, pname, params);} + GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glMultiTexParameterIuivEXT=GLee_Lazy_glMultiTexParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexParameterIivEXT +#define GLEE_C_DEFINED_glGetMultiTexParameterIivEXT + void __stdcall GLee_Lazy_glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params) {if (GLeeInit()) glGetMultiTexParameterIivEXT(texunit, target, pname, params);} + GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIivEXT=GLee_Lazy_glGetMultiTexParameterIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetMultiTexParameterIuivEXT +#define GLEE_C_DEFINED_glGetMultiTexParameterIuivEXT + void __stdcall GLee_Lazy_glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint * params) {if (GLeeInit()) glGetMultiTexParameterIuivEXT(texunit, target, pname, params);} + GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIuivEXT=GLee_Lazy_glGetMultiTexParameterIuivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform1fEXT +#define GLEE_C_DEFINED_glProgramUniform1fEXT + void __stdcall GLee_Lazy_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0) {if (GLeeInit()) glProgramUniform1fEXT(program, location, v0);} + GLEEPFNGLPROGRAMUNIFORM1FEXTPROC GLeeFuncPtr_glProgramUniform1fEXT=GLee_Lazy_glProgramUniform1fEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform2fEXT +#define GLEE_C_DEFINED_glProgramUniform2fEXT + void __stdcall GLee_Lazy_glProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1) {if (GLeeInit()) glProgramUniform2fEXT(program, location, v0, v1);} + GLEEPFNGLPROGRAMUNIFORM2FEXTPROC GLeeFuncPtr_glProgramUniform2fEXT=GLee_Lazy_glProgramUniform2fEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform3fEXT +#define GLEE_C_DEFINED_glProgramUniform3fEXT + void __stdcall GLee_Lazy_glProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {if (GLeeInit()) glProgramUniform3fEXT(program, location, v0, v1, v2);} + GLEEPFNGLPROGRAMUNIFORM3FEXTPROC GLeeFuncPtr_glProgramUniform3fEXT=GLee_Lazy_glProgramUniform3fEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform4fEXT +#define GLEE_C_DEFINED_glProgramUniform4fEXT + void __stdcall GLee_Lazy_glProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {if (GLeeInit()) glProgramUniform4fEXT(program, location, v0, v1, v2, v3);} + GLEEPFNGLPROGRAMUNIFORM4FEXTPROC GLeeFuncPtr_glProgramUniform4fEXT=GLee_Lazy_glProgramUniform4fEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform1iEXT +#define GLEE_C_DEFINED_glProgramUniform1iEXT + void __stdcall GLee_Lazy_glProgramUniform1iEXT(GLuint program, GLint location, GLint v0) {if (GLeeInit()) glProgramUniform1iEXT(program, location, v0);} + GLEEPFNGLPROGRAMUNIFORM1IEXTPROC GLeeFuncPtr_glProgramUniform1iEXT=GLee_Lazy_glProgramUniform1iEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform2iEXT +#define GLEE_C_DEFINED_glProgramUniform2iEXT + void __stdcall GLee_Lazy_glProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1) {if (GLeeInit()) glProgramUniform2iEXT(program, location, v0, v1);} + GLEEPFNGLPROGRAMUNIFORM2IEXTPROC GLeeFuncPtr_glProgramUniform2iEXT=GLee_Lazy_glProgramUniform2iEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform3iEXT +#define GLEE_C_DEFINED_glProgramUniform3iEXT + void __stdcall GLee_Lazy_glProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) {if (GLeeInit()) glProgramUniform3iEXT(program, location, v0, v1, v2);} + GLEEPFNGLPROGRAMUNIFORM3IEXTPROC GLeeFuncPtr_glProgramUniform3iEXT=GLee_Lazy_glProgramUniform3iEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform4iEXT +#define GLEE_C_DEFINED_glProgramUniform4iEXT + void __stdcall GLee_Lazy_glProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {if (GLeeInit()) glProgramUniform4iEXT(program, location, v0, v1, v2, v3);} + GLEEPFNGLPROGRAMUNIFORM4IEXTPROC GLeeFuncPtr_glProgramUniform4iEXT=GLee_Lazy_glProgramUniform4iEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform1fvEXT +#define GLEE_C_DEFINED_glProgramUniform1fvEXT + void __stdcall GLee_Lazy_glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform1fvEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC GLeeFuncPtr_glProgramUniform1fvEXT=GLee_Lazy_glProgramUniform1fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform2fvEXT +#define GLEE_C_DEFINED_glProgramUniform2fvEXT + void __stdcall GLee_Lazy_glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform2fvEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC GLeeFuncPtr_glProgramUniform2fvEXT=GLee_Lazy_glProgramUniform2fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform3fvEXT +#define GLEE_C_DEFINED_glProgramUniform3fvEXT + void __stdcall GLee_Lazy_glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform3fvEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC GLeeFuncPtr_glProgramUniform3fvEXT=GLee_Lazy_glProgramUniform3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform4fvEXT +#define GLEE_C_DEFINED_glProgramUniform4fvEXT + void __stdcall GLee_Lazy_glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value) {if (GLeeInit()) glProgramUniform4fvEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC GLeeFuncPtr_glProgramUniform4fvEXT=GLee_Lazy_glProgramUniform4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform1ivEXT +#define GLEE_C_DEFINED_glProgramUniform1ivEXT + void __stdcall GLee_Lazy_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform1ivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC GLeeFuncPtr_glProgramUniform1ivEXT=GLee_Lazy_glProgramUniform1ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform2ivEXT +#define GLEE_C_DEFINED_glProgramUniform2ivEXT + void __stdcall GLee_Lazy_glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform2ivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC GLeeFuncPtr_glProgramUniform2ivEXT=GLee_Lazy_glProgramUniform2ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform3ivEXT +#define GLEE_C_DEFINED_glProgramUniform3ivEXT + void __stdcall GLee_Lazy_glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform3ivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC GLeeFuncPtr_glProgramUniform3ivEXT=GLee_Lazy_glProgramUniform3ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform4ivEXT +#define GLEE_C_DEFINED_glProgramUniform4ivEXT + void __stdcall GLee_Lazy_glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value) {if (GLeeInit()) glProgramUniform4ivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC GLeeFuncPtr_glProgramUniform4ivEXT=GLee_Lazy_glProgramUniform4ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix2fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix2fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2fvEXT=GLee_Lazy_glProgramUniformMatrix2fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix3fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix3fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3fvEXT=GLee_Lazy_glProgramUniformMatrix3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix4fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix4fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4fvEXT=GLee_Lazy_glProgramUniformMatrix4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2x3fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix2x3fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix2x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT=GLee_Lazy_glProgramUniformMatrix2x3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3x2fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix3x2fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix3x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT=GLee_Lazy_glProgramUniformMatrix3x2fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2x4fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix2x4fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix2x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT=GLee_Lazy_glProgramUniformMatrix2x4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4x2fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix4x2fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix4x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT=GLee_Lazy_glProgramUniformMatrix4x2fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3x4fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix3x4fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix3x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT=GLee_Lazy_glProgramUniformMatrix3x4fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4x3fvEXT +#define GLEE_C_DEFINED_glProgramUniformMatrix4x3fvEXT + void __stdcall GLee_Lazy_glProgramUniformMatrix4x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) {if (GLeeInit()) glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value);} + GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT=GLee_Lazy_glProgramUniformMatrix4x3fvEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform1uiEXT +#define GLEE_C_DEFINED_glProgramUniform1uiEXT + void __stdcall GLee_Lazy_glProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0) {if (GLeeInit()) glProgramUniform1uiEXT(program, location, v0);} + GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC GLeeFuncPtr_glProgramUniform1uiEXT=GLee_Lazy_glProgramUniform1uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform2uiEXT +#define GLEE_C_DEFINED_glProgramUniform2uiEXT + void __stdcall GLee_Lazy_glProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1) {if (GLeeInit()) glProgramUniform2uiEXT(program, location, v0, v1);} + GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC GLeeFuncPtr_glProgramUniform2uiEXT=GLee_Lazy_glProgramUniform2uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform3uiEXT +#define GLEE_C_DEFINED_glProgramUniform3uiEXT + void __stdcall GLee_Lazy_glProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) {if (GLeeInit()) glProgramUniform3uiEXT(program, location, v0, v1, v2);} + GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC GLeeFuncPtr_glProgramUniform3uiEXT=GLee_Lazy_glProgramUniform3uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform4uiEXT +#define GLEE_C_DEFINED_glProgramUniform4uiEXT + void __stdcall GLee_Lazy_glProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {if (GLeeInit()) glProgramUniform4uiEXT(program, location, v0, v1, v2, v3);} + GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC GLeeFuncPtr_glProgramUniform4uiEXT=GLee_Lazy_glProgramUniform4uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform1uivEXT +#define GLEE_C_DEFINED_glProgramUniform1uivEXT + void __stdcall GLee_Lazy_glProgramUniform1uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform1uivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC GLeeFuncPtr_glProgramUniform1uivEXT=GLee_Lazy_glProgramUniform1uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform2uivEXT +#define GLEE_C_DEFINED_glProgramUniform2uivEXT + void __stdcall GLee_Lazy_glProgramUniform2uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform2uivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC GLeeFuncPtr_glProgramUniform2uivEXT=GLee_Lazy_glProgramUniform2uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform3uivEXT +#define GLEE_C_DEFINED_glProgramUniform3uivEXT + void __stdcall GLee_Lazy_glProgramUniform3uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform3uivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC GLeeFuncPtr_glProgramUniform3uivEXT=GLee_Lazy_glProgramUniform3uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glProgramUniform4uivEXT +#define GLEE_C_DEFINED_glProgramUniform4uivEXT + void __stdcall GLee_Lazy_glProgramUniform4uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value) {if (GLeeInit()) glProgramUniform4uivEXT(program, location, count, value);} + GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC GLeeFuncPtr_glProgramUniform4uivEXT=GLee_Lazy_glProgramUniform4uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedBufferDataEXT +#define GLEE_C_DEFINED_glNamedBufferDataEXT + void __stdcall GLee_Lazy_glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage) {if (GLeeInit()) glNamedBufferDataEXT(buffer, size, data, usage);} + GLEEPFNGLNAMEDBUFFERDATAEXTPROC GLeeFuncPtr_glNamedBufferDataEXT=GLee_Lazy_glNamedBufferDataEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedBufferSubDataEXT +#define GLEE_C_DEFINED_glNamedBufferSubDataEXT + void __stdcall GLee_Lazy_glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data) {if (GLeeInit()) glNamedBufferSubDataEXT(buffer, offset, size, data);} + GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glNamedBufferSubDataEXT=GLee_Lazy_glNamedBufferSubDataEXT; +#endif +#ifndef GLEE_C_DEFINED_glMapNamedBufferEXT +#define GLEE_C_DEFINED_glMapNamedBufferEXT + GLvoid* __stdcall GLee_Lazy_glMapNamedBufferEXT(GLuint buffer, GLenum access) {if (GLeeInit()) return glMapNamedBufferEXT(buffer, access); return (GLvoid*)0;} + GLEEPFNGLMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glMapNamedBufferEXT=GLee_Lazy_glMapNamedBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glUnmapNamedBufferEXT +#define GLEE_C_DEFINED_glUnmapNamedBufferEXT + GLboolean __stdcall GLee_Lazy_glUnmapNamedBufferEXT(GLuint buffer) {if (GLeeInit()) return glUnmapNamedBufferEXT(buffer); return (GLboolean)0;} + GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glUnmapNamedBufferEXT=GLee_Lazy_glUnmapNamedBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedBufferParameterivEXT +#define GLEE_C_DEFINED_glGetNamedBufferParameterivEXT + void __stdcall GLee_Lazy_glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedBufferParameterivEXT(buffer, pname, params);} + GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedBufferParameterivEXT=GLee_Lazy_glGetNamedBufferParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedBufferPointervEXT +#define GLEE_C_DEFINED_glGetNamedBufferPointervEXT + void __stdcall GLee_Lazy_glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, GLvoid* * params) {if (GLeeInit()) glGetNamedBufferPointervEXT(buffer, pname, params);} + GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC GLeeFuncPtr_glGetNamedBufferPointervEXT=GLee_Lazy_glGetNamedBufferPointervEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedBufferSubDataEXT +#define GLEE_C_DEFINED_glGetNamedBufferSubDataEXT + void __stdcall GLee_Lazy_glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data) {if (GLeeInit()) glGetNamedBufferSubDataEXT(buffer, offset, size, data);} + GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glGetNamedBufferSubDataEXT=GLee_Lazy_glGetNamedBufferSubDataEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureBufferEXT +#define GLEE_C_DEFINED_glTextureBufferEXT + void __stdcall GLee_Lazy_glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glTextureBufferEXT(texture, target, internalformat, buffer);} + GLEEPFNGLTEXTUREBUFFEREXTPROC GLeeFuncPtr_glTextureBufferEXT=GLee_Lazy_glTextureBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexBufferEXT +#define GLEE_C_DEFINED_glMultiTexBufferEXT + void __stdcall GLee_Lazy_glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer) {if (GLeeInit()) glMultiTexBufferEXT(texunit, target, internalformat, buffer);} + GLEEPFNGLMULTITEXBUFFEREXTPROC GLeeFuncPtr_glMultiTexBufferEXT=GLee_Lazy_glMultiTexBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageEXT +#define GLEE_C_DEFINED_glNamedRenderbufferStorageEXT + void __stdcall GLee_Lazy_glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height);} + GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageEXT=GLee_Lazy_glNamedRenderbufferStorageEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedRenderbufferParameterivEXT +#define GLEE_C_DEFINED_glGetNamedRenderbufferParameterivEXT + void __stdcall GLee_Lazy_glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params);} + GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT=GLee_Lazy_glGetNamedRenderbufferParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glCheckNamedFramebufferStatusEXT +#define GLEE_C_DEFINED_glCheckNamedFramebufferStatusEXT + GLenum __stdcall GLee_Lazy_glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) {if (GLeeInit()) return glCheckNamedFramebufferStatusEXT(framebuffer, target); return (GLenum)0;} + GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckNamedFramebufferStatusEXT=GLee_Lazy_glCheckNamedFramebufferStatusEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture1DEXT +#define GLEE_C_DEFINED_glNamedFramebufferTexture1DEXT + void __stdcall GLee_Lazy_glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);} + GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture1DEXT=GLee_Lazy_glNamedFramebufferTexture1DEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture2DEXT +#define GLEE_C_DEFINED_glNamedFramebufferTexture2DEXT + void __stdcall GLee_Lazy_glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {if (GLeeInit()) glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level);} + GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture2DEXT=GLee_Lazy_glNamedFramebufferTexture2DEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture3DEXT +#define GLEE_C_DEFINED_glNamedFramebufferTexture3DEXT + void __stdcall GLee_Lazy_glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {if (GLeeInit()) glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);} + GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture3DEXT=GLee_Lazy_glNamedFramebufferTexture3DEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferRenderbufferEXT +#define GLEE_C_DEFINED_glNamedFramebufferRenderbufferEXT + void __stdcall GLee_Lazy_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {if (GLeeInit()) glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer);} + GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glNamedFramebufferRenderbufferEXT=GLee_Lazy_glNamedFramebufferRenderbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT +#define GLEE_C_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT + void __stdcall GLee_Lazy_glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params) {if (GLeeInit()) glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params);} + GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT=GLee_Lazy_glGetNamedFramebufferAttachmentParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenerateTextureMipmapEXT +#define GLEE_C_DEFINED_glGenerateTextureMipmapEXT + void __stdcall GLee_Lazy_glGenerateTextureMipmapEXT(GLuint texture, GLenum target) {if (GLeeInit()) glGenerateTextureMipmapEXT(texture, target);} + GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC GLeeFuncPtr_glGenerateTextureMipmapEXT=GLee_Lazy_glGenerateTextureMipmapEXT; +#endif +#ifndef GLEE_C_DEFINED_glGenerateMultiTexMipmapEXT +#define GLEE_C_DEFINED_glGenerateMultiTexMipmapEXT + void __stdcall GLee_Lazy_glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) {if (GLeeInit()) glGenerateMultiTexMipmapEXT(texunit, target);} + GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC GLeeFuncPtr_glGenerateMultiTexMipmapEXT=GLee_Lazy_glGenerateMultiTexMipmapEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferDrawBufferEXT +#define GLEE_C_DEFINED_glFramebufferDrawBufferEXT + void __stdcall GLee_Lazy_glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode) {if (GLeeInit()) glFramebufferDrawBufferEXT(framebuffer, mode);} + GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC GLeeFuncPtr_glFramebufferDrawBufferEXT=GLee_Lazy_glFramebufferDrawBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferDrawBuffersEXT +#define GLEE_C_DEFINED_glFramebufferDrawBuffersEXT + void __stdcall GLee_Lazy_glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum * bufs) {if (GLeeInit()) glFramebufferDrawBuffersEXT(framebuffer, n, bufs);} + GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC GLeeFuncPtr_glFramebufferDrawBuffersEXT=GLee_Lazy_glFramebufferDrawBuffersEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferReadBufferEXT +#define GLEE_C_DEFINED_glFramebufferReadBufferEXT + void __stdcall GLee_Lazy_glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode) {if (GLeeInit()) glFramebufferReadBufferEXT(framebuffer, mode);} + GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC GLeeFuncPtr_glFramebufferReadBufferEXT=GLee_Lazy_glFramebufferReadBufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFramebufferParameterivEXT +#define GLEE_C_DEFINED_glGetFramebufferParameterivEXT + void __stdcall GLee_Lazy_glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint * params) {if (GLeeInit()) glGetFramebufferParameterivEXT(framebuffer, pname, params);} + GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferParameterivEXT=GLee_Lazy_glGetFramebufferParameterivEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleEXT +#define GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleEXT + void __stdcall GLee_Lazy_glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height);} + GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT=GLee_Lazy_glNamedRenderbufferStorageMultisampleEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT +#define GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT + void __stdcall GLee_Lazy_glNamedRenderbufferStorageMultisampleCoverageEXT(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) {if (GLeeInit()) glNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height);} + GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT=GLee_Lazy_glNamedRenderbufferStorageMultisampleCoverageEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureEXT +#define GLEE_C_DEFINED_glNamedFramebufferTextureEXT + void __stdcall GLee_Lazy_glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level);} + GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glNamedFramebufferTextureEXT=GLee_Lazy_glNamedFramebufferTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureLayerEXT +#define GLEE_C_DEFINED_glNamedFramebufferTextureLayerEXT + void __stdcall GLee_Lazy_glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer);} + GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glNamedFramebufferTextureLayerEXT=GLee_Lazy_glNamedFramebufferTextureLayerEXT; +#endif +#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureFaceEXT +#define GLEE_C_DEFINED_glNamedFramebufferTextureFaceEXT + void __stdcall GLee_Lazy_glNamedFramebufferTextureFaceEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face);} + GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glNamedFramebufferTextureFaceEXT=GLee_Lazy_glNamedFramebufferTextureFaceEXT; +#endif +#ifndef GLEE_C_DEFINED_glTextureRenderbufferEXT +#define GLEE_C_DEFINED_glTextureRenderbufferEXT + void __stdcall GLee_Lazy_glTextureRenderbufferEXT(GLuint texture, GLenum target, GLuint renderbuffer) {if (GLeeInit()) glTextureRenderbufferEXT(texture, target, renderbuffer);} + GLEEPFNGLTEXTURERENDERBUFFEREXTPROC GLeeFuncPtr_glTextureRenderbufferEXT=GLee_Lazy_glTextureRenderbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_glMultiTexRenderbufferEXT +#define GLEE_C_DEFINED_glMultiTexRenderbufferEXT + void __stdcall GLee_Lazy_glMultiTexRenderbufferEXT(GLenum texunit, GLenum target, GLuint renderbuffer) {if (GLeeInit()) glMultiTexRenderbufferEXT(texunit, target, renderbuffer);} + GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC GLeeFuncPtr_glMultiTexRenderbufferEXT=GLee_Lazy_glMultiTexRenderbufferEXT; +#endif +#endif + +/* GL_EXT_vertex_array_bgra */ + +#ifdef __GLEE_GL_EXT_vertex_array_bgra +#endif + +/* GL_EXT_texture_swizzle */ + +#ifdef __GLEE_GL_EXT_texture_swizzle +#endif + +/* GL_NV_explicit_multisample */ + +#ifdef __GLEE_GL_NV_explicit_multisample +#ifndef GLEE_C_DEFINED_glGetMultisamplefvNV +#define GLEE_C_DEFINED_glGetMultisamplefvNV + void __stdcall GLee_Lazy_glGetMultisamplefvNV(GLenum pname, GLuint index, GLfloat * val) {if (GLeeInit()) glGetMultisamplefvNV(pname, index, val);} + GLEEPFNGLGETMULTISAMPLEFVNVPROC GLeeFuncPtr_glGetMultisamplefvNV=GLee_Lazy_glGetMultisamplefvNV; +#endif +#ifndef GLEE_C_DEFINED_glSampleMaskIndexedNV +#define GLEE_C_DEFINED_glSampleMaskIndexedNV + void __stdcall GLee_Lazy_glSampleMaskIndexedNV(GLuint index, GLbitfield mask) {if (GLeeInit()) glSampleMaskIndexedNV(index, mask);} + GLEEPFNGLSAMPLEMASKINDEXEDNVPROC GLeeFuncPtr_glSampleMaskIndexedNV=GLee_Lazy_glSampleMaskIndexedNV; +#endif +#ifndef GLEE_C_DEFINED_glTexRenderbufferNV +#define GLEE_C_DEFINED_glTexRenderbufferNV + void __stdcall GLee_Lazy_glTexRenderbufferNV(GLenum target, GLuint renderbuffer) {if (GLeeInit()) glTexRenderbufferNV(target, renderbuffer);} + GLEEPFNGLTEXRENDERBUFFERNVPROC GLeeFuncPtr_glTexRenderbufferNV=GLee_Lazy_glTexRenderbufferNV; +#endif +#endif + +/* GL_NV_transform_feedback2 */ + +#ifdef __GLEE_GL_NV_transform_feedback2 +#ifndef GLEE_C_DEFINED_glBindTransformFeedbackNV +#define GLEE_C_DEFINED_glBindTransformFeedbackNV + void __stdcall GLee_Lazy_glBindTransformFeedbackNV(GLenum target, GLuint id) {if (GLeeInit()) glBindTransformFeedbackNV(target, id);} + GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBindTransformFeedbackNV=GLee_Lazy_glBindTransformFeedbackNV; +#endif +#ifndef GLEE_C_DEFINED_glDeleteTransformFeedbacksNV +#define GLEE_C_DEFINED_glDeleteTransformFeedbacksNV + void __stdcall GLee_Lazy_glDeleteTransformFeedbacksNV(GLsizei n, const GLuint * ids) {if (GLeeInit()) glDeleteTransformFeedbacksNV(n, ids);} + GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glDeleteTransformFeedbacksNV=GLee_Lazy_glDeleteTransformFeedbacksNV; +#endif +#ifndef GLEE_C_DEFINED_glGenTransformFeedbacksNV +#define GLEE_C_DEFINED_glGenTransformFeedbacksNV + void __stdcall GLee_Lazy_glGenTransformFeedbacksNV(GLsizei n, GLuint * ids) {if (GLeeInit()) glGenTransformFeedbacksNV(n, ids);} + GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glGenTransformFeedbacksNV=GLee_Lazy_glGenTransformFeedbacksNV; +#endif +#ifndef GLEE_C_DEFINED_glIsTransformFeedbackNV +#define GLEE_C_DEFINED_glIsTransformFeedbackNV + GLboolean __stdcall GLee_Lazy_glIsTransformFeedbackNV(GLuint id) {if (GLeeInit()) return glIsTransformFeedbackNV(id); return (GLboolean)0;} + GLEEPFNGLISTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glIsTransformFeedbackNV=GLee_Lazy_glIsTransformFeedbackNV; +#endif +#ifndef GLEE_C_DEFINED_glPauseTransformFeedbackNV +#define GLEE_C_DEFINED_glPauseTransformFeedbackNV + void __stdcall GLee_Lazy_glPauseTransformFeedbackNV(void) {if (GLeeInit()) glPauseTransformFeedbackNV();} + GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glPauseTransformFeedbackNV=GLee_Lazy_glPauseTransformFeedbackNV; +#endif +#ifndef GLEE_C_DEFINED_glResumeTransformFeedbackNV +#define GLEE_C_DEFINED_glResumeTransformFeedbackNV + void __stdcall GLee_Lazy_glResumeTransformFeedbackNV(void) {if (GLeeInit()) glResumeTransformFeedbackNV();} + GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glResumeTransformFeedbackNV=GLee_Lazy_glResumeTransformFeedbackNV; +#endif +#ifndef GLEE_C_DEFINED_glDrawTransformFeedbackNV +#define GLEE_C_DEFINED_glDrawTransformFeedbackNV + void __stdcall GLee_Lazy_glDrawTransformFeedbackNV(GLenum mode, GLuint id) {if (GLeeInit()) glDrawTransformFeedbackNV(mode, id);} + GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glDrawTransformFeedbackNV=GLee_Lazy_glDrawTransformFeedbackNV; +#endif +#endif + +/* GL_SGIX_texture_select */ + +#ifdef __GLEE_GL_SGIX_texture_select +#endif + +/* GL_INGR_blend_func_separate */ + +#ifdef __GLEE_GL_INGR_blend_func_separate +#ifndef GLEE_C_DEFINED_glBlendFuncSeparateINGR +#define GLEE_C_DEFINED_glBlendFuncSeparateINGR + void __stdcall GLee_Lazy_glBlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) {if (GLeeInit()) glBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);} + GLEEPFNGLBLENDFUNCSEPARATEINGRPROC GLeeFuncPtr_glBlendFuncSeparateINGR=GLee_Lazy_glBlendFuncSeparateINGR; +#endif +#endif + +/* GL_SGIX_depth_pass_instrument */ + +#ifdef __GLEE_GL_SGIX_depth_pass_instrument +#endif + +/* GL_SGIX_igloo_interface */ + +#ifdef __GLEE_GL_SGIX_igloo_interface +#ifndef GLEE_C_DEFINED_glIglooInterfaceSGIX +#define GLEE_C_DEFINED_glIglooInterfaceSGIX + void __stdcall GLee_Lazy_glIglooInterfaceSGIX(GLenum pname, const GLvoid * params) {if (GLeeInit()) glIglooInterfaceSGIX(pname, params);} + GLEEPFNGLIGLOOINTERFACESGIXPROC GLeeFuncPtr_glIglooInterfaceSGIX=GLee_Lazy_glIglooInterfaceSGIX; +#endif +#endif + +/* GL_EXT_fragment_lighting */ + +#ifdef __GLEE_GL_EXT_fragment_lighting +#ifndef GLEE_C_DEFINED_glFragmentLightModeliEXT +#define GLEE_C_DEFINED_glFragmentLightModeliEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightModeliEXT(GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightModeliEXT(pname, param);} + GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC GLeeFuncPtr_glFragmentLightModeliEXT=GLee_Lazy_glFragmentLightModeliEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModelfEXT +#define GLEE_C_DEFINED_glFragmentLightModelfEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightModelfEXT(GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightModelfEXT(pname, param);} + GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC GLeeFuncPtr_glFragmentLightModelfEXT=GLee_Lazy_glFragmentLightModelfEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModelivEXT +#define GLEE_C_DEFINED_glFragmentLightModelivEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightModelivEXT(GLenum pname, GLint * params) {if (GLeeInit()) glFragmentLightModelivEXT(pname, params);} + GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC GLeeFuncPtr_glFragmentLightModelivEXT=GLee_Lazy_glFragmentLightModelivEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightModelfvEXT +#define GLEE_C_DEFINED_glFragmentLightModelfvEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightModelfvEXT(GLenum pname, GLfloat * params) {if (GLeeInit()) glFragmentLightModelfvEXT(pname, params);} + GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC GLeeFuncPtr_glFragmentLightModelfvEXT=GLee_Lazy_glFragmentLightModelfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightiEXT +#define GLEE_C_DEFINED_glFragmentLightiEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightiEXT(GLenum light, GLenum pname, GLint param) {if (GLeeInit()) glFragmentLightiEXT(light, pname, param);} + GLEEPFNGLFRAGMENTLIGHTIEXTPROC GLeeFuncPtr_glFragmentLightiEXT=GLee_Lazy_glFragmentLightiEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightfEXT +#define GLEE_C_DEFINED_glFragmentLightfEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightfEXT(GLenum light, GLenum pname, GLfloat param) {if (GLeeInit()) glFragmentLightfEXT(light, pname, param);} + GLEEPFNGLFRAGMENTLIGHTFEXTPROC GLeeFuncPtr_glFragmentLightfEXT=GLee_Lazy_glFragmentLightfEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightivEXT +#define GLEE_C_DEFINED_glFragmentLightivEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightivEXT(GLenum light, GLenum pname, GLint * params) {if (GLeeInit()) glFragmentLightivEXT(light, pname, params);} + GLEEPFNGLFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glFragmentLightivEXT=GLee_Lazy_glFragmentLightivEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentLightfvEXT +#define GLEE_C_DEFINED_glFragmentLightfvEXT + GLvoid __stdcall GLee_Lazy_glFragmentLightfvEXT(GLenum light, GLenum pname, GLfloat * params) {if (GLeeInit()) glFragmentLightfvEXT(light, pname, params);} + GLEEPFNGLFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glFragmentLightfvEXT=GLee_Lazy_glFragmentLightfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentLightivEXT +#define GLEE_C_DEFINED_glGetFragmentLightivEXT + GLvoid __stdcall GLee_Lazy_glGetFragmentLightivEXT(GLenum light, GLenum pname, GLint * params) {if (GLeeInit()) glGetFragmentLightivEXT(light, pname, params);} + GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glGetFragmentLightivEXT=GLee_Lazy_glGetFragmentLightivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentLightfvEXT +#define GLEE_C_DEFINED_glGetFragmentLightfvEXT + GLvoid __stdcall GLee_Lazy_glGetFragmentLightfvEXT(GLenum light, GLenum pname, GLfloat * params) {if (GLeeInit()) glGetFragmentLightfvEXT(light, pname, params);} + GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glGetFragmentLightfvEXT=GLee_Lazy_glGetFragmentLightfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialfEXT +#define GLEE_C_DEFINED_glFragmentMaterialfEXT + GLvoid __stdcall GLee_Lazy_glFragmentMaterialfEXT(GLenum face, GLenum pname, const GLfloat param) {if (GLeeInit()) glFragmentMaterialfEXT(face, pname, param);} + GLEEPFNGLFRAGMENTMATERIALFEXTPROC GLeeFuncPtr_glFragmentMaterialfEXT=GLee_Lazy_glFragmentMaterialfEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialiEXT +#define GLEE_C_DEFINED_glFragmentMaterialiEXT + GLvoid __stdcall GLee_Lazy_glFragmentMaterialiEXT(GLenum face, GLenum pname, const GLint param) {if (GLeeInit()) glFragmentMaterialiEXT(face, pname, param);} + GLEEPFNGLFRAGMENTMATERIALIEXTPROC GLeeFuncPtr_glFragmentMaterialiEXT=GLee_Lazy_glFragmentMaterialiEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialfvEXT +#define GLEE_C_DEFINED_glFragmentMaterialfvEXT + GLvoid __stdcall GLee_Lazy_glFragmentMaterialfvEXT(GLenum face, GLenum pname, const GLfloat * params) {if (GLeeInit()) glFragmentMaterialfvEXT(face, pname, params);} + GLEEPFNGLFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glFragmentMaterialfvEXT=GLee_Lazy_glFragmentMaterialfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentMaterialivEXT +#define GLEE_C_DEFINED_glFragmentMaterialivEXT + GLvoid __stdcall GLee_Lazy_glFragmentMaterialivEXT(GLenum face, GLenum pname, const GLint * params) {if (GLeeInit()) glFragmentMaterialivEXT(face, pname, params);} + GLEEPFNGLFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glFragmentMaterialivEXT=GLee_Lazy_glFragmentMaterialivEXT; +#endif +#ifndef GLEE_C_DEFINED_glFragmentColorMaterialEXT +#define GLEE_C_DEFINED_glFragmentColorMaterialEXT + GLvoid __stdcall GLee_Lazy_glFragmentColorMaterialEXT(GLenum face, GLenum mode) {if (GLeeInit()) glFragmentColorMaterialEXT(face, mode);} + GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC GLeeFuncPtr_glFragmentColorMaterialEXT=GLee_Lazy_glFragmentColorMaterialEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentMaterialfvEXT +#define GLEE_C_DEFINED_glGetFragmentMaterialfvEXT + GLvoid __stdcall GLee_Lazy_glGetFragmentMaterialfvEXT(GLenum face, GLenum pname, const GLfloat * params) {if (GLeeInit()) glGetFragmentMaterialfvEXT(face, pname, params);} + GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glGetFragmentMaterialfvEXT=GLee_Lazy_glGetFragmentMaterialfvEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetFragmentMaterialivEXT +#define GLEE_C_DEFINED_glGetFragmentMaterialivEXT + GLvoid __stdcall GLee_Lazy_glGetFragmentMaterialivEXT(GLenum face, GLenum pname, const GLint * params) {if (GLeeInit()) glGetFragmentMaterialivEXT(face, pname, params);} + GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glGetFragmentMaterialivEXT=GLee_Lazy_glGetFragmentMaterialivEXT; +#endif +#ifndef GLEE_C_DEFINED_glLightEnviEXT +#define GLEE_C_DEFINED_glLightEnviEXT + GLvoid __stdcall GLee_Lazy_glLightEnviEXT(GLenum pname, GLint param) {if (GLeeInit()) glLightEnviEXT(pname, param);} + GLEEPFNGLLIGHTENVIEXTPROC GLeeFuncPtr_glLightEnviEXT=GLee_Lazy_glLightEnviEXT; +#endif +#endif + +/* GL_EXT_geometry_shader4 */ + +#ifdef __GLEE_GL_EXT_geometry_shader4 +#ifndef GLEE_C_DEFINED_glProgramParameteriEXT +#define GLEE_C_DEFINED_glProgramParameteriEXT + GLvoid __stdcall GLee_Lazy_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value) {if (GLeeInit()) glProgramParameteriEXT(program, pname, value);} + GLEEPFNGLPROGRAMPARAMETERIEXTPROC GLeeFuncPtr_glProgramParameteriEXT=GLee_Lazy_glProgramParameteriEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureEXT +#define GLEE_C_DEFINED_glFramebufferTextureEXT + GLvoid __stdcall GLee_Lazy_glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTextureEXT(target, attachment, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT=GLee_Lazy_glFramebufferTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerEXT +#define GLEE_C_DEFINED_glFramebufferTextureLayerEXT + GLvoid __stdcall GLee_Lazy_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);} + GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT=GLee_Lazy_glFramebufferTextureLayerEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceEXT +#define GLEE_C_DEFINED_glFramebufferTextureFaceEXT + GLvoid __stdcall GLee_Lazy_glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glFramebufferTextureFaceEXT(target, attachment, texture, level, face);} + GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT=GLee_Lazy_glFramebufferTextureFaceEXT; +#endif +#endif + +/* GL_EXT_scene_marker */ + +#ifdef __GLEE_GL_EXT_scene_marker +#ifndef GLEE_C_DEFINED_glBeginSceneEXT +#define GLEE_C_DEFINED_glBeginSceneEXT + GLvoid __stdcall GLee_Lazy_glBeginSceneEXT(void) {if (GLeeInit()) glBeginSceneEXT();} + GLEEPFNGLBEGINSCENEEXTPROC GLeeFuncPtr_glBeginSceneEXT=GLee_Lazy_glBeginSceneEXT; +#endif +#ifndef GLEE_C_DEFINED_glEndSceneEXT +#define GLEE_C_DEFINED_glEndSceneEXT + GLvoid __stdcall GLee_Lazy_glEndSceneEXT(void) {if (GLeeInit()) glEndSceneEXT();} + GLEEPFNGLENDSCENEEXTPROC GLeeFuncPtr_glEndSceneEXT=GLee_Lazy_glEndSceneEXT; +#endif +#endif + +/* GL_EXT_texture_compression_dxt1 */ + +#ifdef __GLEE_GL_EXT_texture_compression_dxt1 +#endif + +/* GL_EXT_texture_env */ + +#ifdef __GLEE_GL_EXT_texture_env +#endif + +/* GL_IBM_static_data */ + +#ifdef __GLEE_GL_IBM_static_data +#endif + +/* GL_NV_gpu_program4 */ + +#ifdef __GLEE_GL_NV_gpu_program4 +#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4iNV +#define GLEE_C_DEFINED_glProgramLocalParameterI4iNV + GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glProgramLocalParameterI4iNV(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC GLeeFuncPtr_glProgramLocalParameterI4iNV=GLee_Lazy_glProgramLocalParameterI4iNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4ivNV +#define GLEE_C_DEFINED_glProgramLocalParameterI4ivNV + GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4ivNV(GLenum target, GLuint index, const GLint * params) {if (GLeeInit()) glProgramLocalParameterI4ivNV(target, index, params);} + GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramLocalParameterI4ivNV=GLee_Lazy_glProgramLocalParameterI4ivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParametersI4ivNV +#define GLEE_C_DEFINED_glProgramLocalParametersI4ivNV + GLvoid __stdcall GLee_Lazy_glProgramLocalParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glProgramLocalParametersI4ivNV(target, index, count, params);} + GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramLocalParametersI4ivNV=GLee_Lazy_glProgramLocalParametersI4ivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4uiNV +#define GLEE_C_DEFINED_glProgramLocalParameterI4uiNV + GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glProgramLocalParameterI4uiNV(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC GLeeFuncPtr_glProgramLocalParameterI4uiNV=GLee_Lazy_glProgramLocalParameterI4uiNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4uivNV +#define GLEE_C_DEFINED_glProgramLocalParameterI4uivNV + GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4uivNV(GLenum target, GLuint index, const GLuint * params) {if (GLeeInit()) glProgramLocalParameterI4uivNV(target, index, params);} + GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramLocalParameterI4uivNV=GLee_Lazy_glProgramLocalParameterI4uivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramLocalParametersI4uivNV +#define GLEE_C_DEFINED_glProgramLocalParametersI4uivNV + GLvoid __stdcall GLee_Lazy_glProgramLocalParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glProgramLocalParametersI4uivNV(target, index, count, params);} + GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramLocalParametersI4uivNV=GLee_Lazy_glProgramLocalParametersI4uivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4iNV +#define GLEE_C_DEFINED_glProgramEnvParameterI4iNV + GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glProgramEnvParameterI4iNV(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC GLeeFuncPtr_glProgramEnvParameterI4iNV=GLee_Lazy_glProgramEnvParameterI4iNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4ivNV +#define GLEE_C_DEFINED_glProgramEnvParameterI4ivNV + GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4ivNV(GLenum target, GLuint index, const GLint * params) {if (GLeeInit()) glProgramEnvParameterI4ivNV(target, index, params);} + GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramEnvParameterI4ivNV=GLee_Lazy_glProgramEnvParameterI4ivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParametersI4ivNV +#define GLEE_C_DEFINED_glProgramEnvParametersI4ivNV + GLvoid __stdcall GLee_Lazy_glProgramEnvParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint * params) {if (GLeeInit()) glProgramEnvParametersI4ivNV(target, index, count, params);} + GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramEnvParametersI4ivNV=GLee_Lazy_glProgramEnvParametersI4ivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4uiNV +#define GLEE_C_DEFINED_glProgramEnvParameterI4uiNV + GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glProgramEnvParameterI4uiNV(target, index, x, y, z, w);} + GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC GLeeFuncPtr_glProgramEnvParameterI4uiNV=GLee_Lazy_glProgramEnvParameterI4uiNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4uivNV +#define GLEE_C_DEFINED_glProgramEnvParameterI4uivNV + GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4uivNV(GLenum target, GLuint index, const GLuint * params) {if (GLeeInit()) glProgramEnvParameterI4uivNV(target, index, params);} + GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramEnvParameterI4uivNV=GLee_Lazy_glProgramEnvParameterI4uivNV; +#endif +#ifndef GLEE_C_DEFINED_glProgramEnvParametersI4uivNV +#define GLEE_C_DEFINED_glProgramEnvParametersI4uivNV + GLvoid __stdcall GLee_Lazy_glProgramEnvParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint * params) {if (GLeeInit()) glProgramEnvParametersI4uivNV(target, index, count, params);} + GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramEnvParametersI4uivNV=GLee_Lazy_glProgramEnvParametersI4uivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterIivNV +#define GLEE_C_DEFINED_glGetProgramLocalParameterIivNV + GLvoid __stdcall GLee_Lazy_glGetProgramLocalParameterIivNV(GLenum target, GLuint index, GLint * params) {if (GLeeInit()) glGetProgramLocalParameterIivNV(target, index, params);} + GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIivNV=GLee_Lazy_glGetProgramLocalParameterIivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterIuivNV +#define GLEE_C_DEFINED_glGetProgramLocalParameterIuivNV + GLvoid __stdcall GLee_Lazy_glGetProgramLocalParameterIuivNV(GLenum target, GLuint index, GLuint * params) {if (GLeeInit()) glGetProgramLocalParameterIuivNV(target, index, params);} + GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIuivNV=GLee_Lazy_glGetProgramLocalParameterIuivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterIivNV +#define GLEE_C_DEFINED_glGetProgramEnvParameterIivNV + GLvoid __stdcall GLee_Lazy_glGetProgramEnvParameterIivNV(GLenum target, GLuint index, GLint * params) {if (GLeeInit()) glGetProgramEnvParameterIivNV(target, index, params);} + GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIivNV=GLee_Lazy_glGetProgramEnvParameterIivNV; +#endif +#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterIuivNV +#define GLEE_C_DEFINED_glGetProgramEnvParameterIuivNV + GLvoid __stdcall GLee_Lazy_glGetProgramEnvParameterIuivNV(GLenum target, GLuint index, GLuint * params) {if (GLeeInit()) glGetProgramEnvParameterIuivNV(target, index, params);} + GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIuivNV=GLee_Lazy_glGetProgramEnvParameterIuivNV; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureEXT +#define GLEE_C_DEFINED_glFramebufferTextureEXT + GLvoid __stdcall GLee_Lazy_glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) {if (GLeeInit()) glFramebufferTextureEXT(target, attachment, texture, level);} + GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT=GLee_Lazy_glFramebufferTextureEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerEXT +#define GLEE_C_DEFINED_glFramebufferTextureLayerEXT + GLvoid __stdcall GLee_Lazy_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) {if (GLeeInit()) glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);} + GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT=GLee_Lazy_glFramebufferTextureLayerEXT; +#endif +#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceEXT +#define GLEE_C_DEFINED_glFramebufferTextureFaceEXT + GLvoid __stdcall GLee_Lazy_glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) {if (GLeeInit()) glFramebufferTextureFaceEXT(target, attachment, texture, level, face);} + GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT=GLee_Lazy_glFramebufferTextureFaceEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2iEXT +#define GLEE_C_DEFINED_glVertexAttribI2iEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI2iEXT(GLuint index, GLint x, GLint y) {if (GLeeInit()) glVertexAttribI2iEXT(index, x, y);} + GLEEPFNGLVERTEXATTRIBI2IEXTPROC GLeeFuncPtr_glVertexAttribI2iEXT=GLee_Lazy_glVertexAttribI2iEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3iEXT +#define GLEE_C_DEFINED_glVertexAttribI3iEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI3iEXT(GLuint index, GLint x, GLint y, GLint z) {if (GLeeInit()) glVertexAttribI3iEXT(index, x, y, z);} + GLEEPFNGLVERTEXATTRIBI3IEXTPROC GLeeFuncPtr_glVertexAttribI3iEXT=GLee_Lazy_glVertexAttribI3iEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4iEXT +#define GLEE_C_DEFINED_glVertexAttribI4iEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4iEXT(GLuint index, GLint x, GLint y, GLint z, GLint w) {if (GLeeInit()) glVertexAttribI4iEXT(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIBI4IEXTPROC GLeeFuncPtr_glVertexAttribI4iEXT=GLee_Lazy_glVertexAttribI4iEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1uiEXT +#define GLEE_C_DEFINED_glVertexAttribI1uiEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI1uiEXT(GLuint index, GLuint x) {if (GLeeInit()) glVertexAttribI1uiEXT(index, x);} + GLEEPFNGLVERTEXATTRIBI1UIEXTPROC GLeeFuncPtr_glVertexAttribI1uiEXT=GLee_Lazy_glVertexAttribI1uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2uiEXT +#define GLEE_C_DEFINED_glVertexAttribI2uiEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI2uiEXT(GLuint index, GLuint x, GLuint y) {if (GLeeInit()) glVertexAttribI2uiEXT(index, x, y);} + GLEEPFNGLVERTEXATTRIBI2UIEXTPROC GLeeFuncPtr_glVertexAttribI2uiEXT=GLee_Lazy_glVertexAttribI2uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3uiEXT +#define GLEE_C_DEFINED_glVertexAttribI3uiEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI3uiEXT(GLuint index, GLuint x, GLuint y, GLuint z) {if (GLeeInit()) glVertexAttribI3uiEXT(index, x, y, z);} + GLEEPFNGLVERTEXATTRIBI3UIEXTPROC GLeeFuncPtr_glVertexAttribI3uiEXT=GLee_Lazy_glVertexAttribI3uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4uiEXT +#define GLEE_C_DEFINED_glVertexAttribI4uiEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4uiEXT(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) {if (GLeeInit()) glVertexAttribI4uiEXT(index, x, y, z, w);} + GLEEPFNGLVERTEXATTRIBI4UIEXTPROC GLeeFuncPtr_glVertexAttribI4uiEXT=GLee_Lazy_glVertexAttribI4uiEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1ivEXT +#define GLEE_C_DEFINED_glVertexAttribI1ivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI1ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI1ivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI1IVEXTPROC GLeeFuncPtr_glVertexAttribI1ivEXT=GLee_Lazy_glVertexAttribI1ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2ivEXT +#define GLEE_C_DEFINED_glVertexAttribI2ivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI2ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI2ivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI2IVEXTPROC GLeeFuncPtr_glVertexAttribI2ivEXT=GLee_Lazy_glVertexAttribI2ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3ivEXT +#define GLEE_C_DEFINED_glVertexAttribI3ivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI3ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI3ivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI3IVEXTPROC GLeeFuncPtr_glVertexAttribI3ivEXT=GLee_Lazy_glVertexAttribI3ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4ivEXT +#define GLEE_C_DEFINED_glVertexAttribI4ivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4ivEXT(GLuint index, const GLint * v) {if (GLeeInit()) glVertexAttribI4ivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI4IVEXTPROC GLeeFuncPtr_glVertexAttribI4ivEXT=GLee_Lazy_glVertexAttribI4ivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI1uivEXT +#define GLEE_C_DEFINED_glVertexAttribI1uivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI1uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI1uivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC GLeeFuncPtr_glVertexAttribI1uivEXT=GLee_Lazy_glVertexAttribI1uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI2uivEXT +#define GLEE_C_DEFINED_glVertexAttribI2uivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI2uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI2uivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC GLeeFuncPtr_glVertexAttribI2uivEXT=GLee_Lazy_glVertexAttribI2uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI3uivEXT +#define GLEE_C_DEFINED_glVertexAttribI3uivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI3uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI3uivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC GLeeFuncPtr_glVertexAttribI3uivEXT=GLee_Lazy_glVertexAttribI3uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4uivEXT +#define GLEE_C_DEFINED_glVertexAttribI4uivEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4uivEXT(GLuint index, const GLuint * v) {if (GLeeInit()) glVertexAttribI4uivEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC GLeeFuncPtr_glVertexAttribI4uivEXT=GLee_Lazy_glVertexAttribI4uivEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4bvEXT +#define GLEE_C_DEFINED_glVertexAttribI4bvEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4bvEXT(GLuint index, const GLbyte * v) {if (GLeeInit()) glVertexAttribI4bvEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI4BVEXTPROC GLeeFuncPtr_glVertexAttribI4bvEXT=GLee_Lazy_glVertexAttribI4bvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4svEXT +#define GLEE_C_DEFINED_glVertexAttribI4svEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4svEXT(GLuint index, const GLshort * v) {if (GLeeInit()) glVertexAttribI4svEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI4SVEXTPROC GLeeFuncPtr_glVertexAttribI4svEXT=GLee_Lazy_glVertexAttribI4svEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4ubvEXT +#define GLEE_C_DEFINED_glVertexAttribI4ubvEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4ubvEXT(GLuint index, const GLubyte * v) {if (GLeeInit()) glVertexAttribI4ubvEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC GLeeFuncPtr_glVertexAttribI4ubvEXT=GLee_Lazy_glVertexAttribI4ubvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribI4usvEXT +#define GLEE_C_DEFINED_glVertexAttribI4usvEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribI4usvEXT(GLuint index, const GLushort * v) {if (GLeeInit()) glVertexAttribI4usvEXT(index, v);} + GLEEPFNGLVERTEXATTRIBI4USVEXTPROC GLeeFuncPtr_glVertexAttribI4usvEXT=GLee_Lazy_glVertexAttribI4usvEXT; +#endif +#ifndef GLEE_C_DEFINED_glVertexAttribIPointerEXT +#define GLEE_C_DEFINED_glVertexAttribIPointerEXT + GLvoid __stdcall GLee_Lazy_glVertexAttribIPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) {if (GLeeInit()) glVertexAttribIPointerEXT(index, size, type, stride, pointer);} + GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC GLeeFuncPtr_glVertexAttribIPointerEXT=GLee_Lazy_glVertexAttribIPointerEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribIivEXT +#define GLEE_C_DEFINED_glGetVertexAttribIivEXT + GLvoid __stdcall GLee_Lazy_glGetVertexAttribIivEXT(GLuint index, GLenum pname, GLint * params) {if (GLeeInit()) glGetVertexAttribIivEXT(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC GLeeFuncPtr_glGetVertexAttribIivEXT=GLee_Lazy_glGetVertexAttribIivEXT; +#endif +#ifndef GLEE_C_DEFINED_glGetVertexAttribIuivEXT +#define GLEE_C_DEFINED_glGetVertexAttribIuivEXT + GLvoid __stdcall GLee_Lazy_glGetVertexAttribIuivEXT(GLuint index, GLenum pname, GLuint * params) {if (GLeeInit()) glGetVertexAttribIuivEXT(index, pname, params);} + GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC GLeeFuncPtr_glGetVertexAttribIuivEXT=GLee_Lazy_glGetVertexAttribIuivEXT; +#endif +#endif + +/* GL_OES_byte_coordinates */ + +#ifdef __GLEE_GL_OES_byte_coordinates +#endif + +/* GL_OES_compressed_paletted_texture */ + +#ifdef __GLEE_GL_OES_compressed_paletted_texture +#endif + +/* GL_OES_single_precision */ + +#ifdef __GLEE_GL_OES_single_precision +#ifndef GLEE_C_DEFINED_glDepthRangefOES +#define GLEE_C_DEFINED_glDepthRangefOES + GLvoid __stdcall GLee_Lazy_glDepthRangefOES(GLclampf n, GLclampf f) {if (GLeeInit()) glDepthRangefOES(n, f);} + GLEEPFNGLDEPTHRANGEFOESPROC GLeeFuncPtr_glDepthRangefOES=GLee_Lazy_glDepthRangefOES; +#endif +#ifndef GLEE_C_DEFINED_glFrustumfOES +#define GLEE_C_DEFINED_glFrustumfOES + GLvoid __stdcall GLee_Lazy_glFrustumfOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) {if (GLeeInit()) glFrustumfOES(l, r, b, t, n, f);} + GLEEPFNGLFRUSTUMFOESPROC GLeeFuncPtr_glFrustumfOES=GLee_Lazy_glFrustumfOES; +#endif +#ifndef GLEE_C_DEFINED_glOrthofOES +#define GLEE_C_DEFINED_glOrthofOES + GLvoid __stdcall GLee_Lazy_glOrthofOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) {if (GLeeInit()) glOrthofOES(l, r, b, t, n, f);} + GLEEPFNGLORTHOFOESPROC GLeeFuncPtr_glOrthofOES=GLee_Lazy_glOrthofOES; +#endif +#ifndef GLEE_C_DEFINED_glClipPlanefOES +#define GLEE_C_DEFINED_glClipPlanefOES + GLvoid __stdcall GLee_Lazy_glClipPlanefOES(GLenum plane, const GLfloat* equation) {if (GLeeInit()) glClipPlanefOES(plane, equation);} + GLEEPFNGLCLIPPLANEFOESPROC GLeeFuncPtr_glClipPlanefOES=GLee_Lazy_glClipPlanefOES; +#endif +#ifndef GLEE_C_DEFINED_glGetClipPlanefOES +#define GLEE_C_DEFINED_glGetClipPlanefOES + GLvoid __stdcall GLee_Lazy_glGetClipPlanefOES(GLenum plane, GLfloat* equation) {if (GLeeInit()) glGetClipPlanefOES(plane, equation);} + GLEEPFNGLGETCLIPPLANEFOESPROC GLeeFuncPtr_glGetClipPlanefOES=GLee_Lazy_glGetClipPlanefOES; +#endif +#ifndef GLEE_C_DEFINED_glClearDepthfOES +#define GLEE_C_DEFINED_glClearDepthfOES + GLvoid __stdcall GLee_Lazy_glClearDepthfOES(GLclampd depth) {if (GLeeInit()) glClearDepthfOES(depth);} + GLEEPFNGLCLEARDEPTHFOESPROC GLeeFuncPtr_glClearDepthfOES=GLee_Lazy_glClearDepthfOES; +#endif +#endif + +/* GL_SGIX_pixel_texture_bits */ + +#ifdef __GLEE_GL_SGIX_pixel_texture_bits +#endif + +/* GL_SGIX_texture_range */ + +#ifdef __GLEE_GL_SGIX_texture_range +#endif + +/* WGL */ + +#ifdef WIN32 + +/* Extension querying variables */ + +GLboolean _GLEE_WGL_ARB_buffer_region = GL_FALSE; +GLboolean _GLEE_WGL_ARB_multisample = GL_FALSE; +GLboolean _GLEE_WGL_ARB_extensions_string = GL_FALSE; +GLboolean _GLEE_WGL_ARB_pixel_format = GL_FALSE; +GLboolean _GLEE_WGL_ARB_make_current_read = GL_FALSE; +GLboolean _GLEE_WGL_ARB_pbuffer = GL_FALSE; +GLboolean _GLEE_WGL_ARB_render_texture = GL_FALSE; +GLboolean _GLEE_WGL_ARB_pixel_format_float = GL_FALSE; +GLboolean _GLEE_WGL_ARB_create_context = GL_FALSE; +GLboolean _GLEE_WGL_EXT_make_current_read = GL_FALSE; +GLboolean _GLEE_WGL_EXT_pixel_format = GL_FALSE; +GLboolean _GLEE_WGL_EXT_pbuffer = GL_FALSE; +GLboolean _GLEE_WGL_EXT_depth_float = GL_FALSE; +GLboolean _GLEE_WGL_3DFX_multisample = GL_FALSE; +GLboolean _GLEE_WGL_EXT_multisample = GL_FALSE; +GLboolean _GLEE_WGL_I3D_digital_video_control = GL_FALSE; +GLboolean _GLEE_WGL_I3D_gamma = GL_FALSE; +GLboolean _GLEE_WGL_I3D_genlock = GL_FALSE; +GLboolean _GLEE_WGL_I3D_image_buffer = GL_FALSE; +GLboolean _GLEE_WGL_I3D_swap_frame_lock = GL_FALSE; +GLboolean _GLEE_WGL_NV_render_depth_texture = GL_FALSE; +GLboolean _GLEE_WGL_NV_render_texture_rectangle = GL_FALSE; +GLboolean _GLEE_WGL_ATI_pixel_format_float = GL_FALSE; +GLboolean _GLEE_WGL_NV_float_buffer = GL_FALSE; +GLboolean _GLEE_WGL_3DL_stereo_control = GL_FALSE; +GLboolean _GLEE_WGL_EXT_pixel_format_packed_float = GL_FALSE; +GLboolean _GLEE_WGL_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean _GLEE_WGL_NV_present_video = GL_FALSE; +GLboolean _GLEE_WGL_NV_swap_group = GL_FALSE; +GLboolean _GLEE_WGL_NV_gpu_affinity = GL_FALSE; +GLboolean _GLEE_WGL_EXT_display_color_table = GL_FALSE; +GLboolean _GLEE_WGL_EXT_extensions_string = GL_FALSE; +GLboolean _GLEE_WGL_EXT_swap_control = GL_FALSE; +GLboolean _GLEE_WGL_NV_vertex_array_range = GL_FALSE; +GLboolean _GLEE_WGL_OML_sync_control = GL_FALSE; +GLboolean _GLEE_WGL_I3D_swap_frame_usage = GL_FALSE; +GLboolean _GLEE_WGL_NV_video_output = GL_FALSE; + +/* WGL Extension names */ + +char __GLeeWGLExtensionNames[37][34]={ + "WGL_ARB_buffer_region", + "WGL_ARB_multisample", + "WGL_ARB_extensions_string", + "WGL_ARB_pixel_format", + "WGL_ARB_make_current_read", + "WGL_ARB_pbuffer", + "WGL_ARB_render_texture", + "WGL_ARB_pixel_format_float", + "WGL_ARB_create_context", + "WGL_EXT_make_current_read", + "WGL_EXT_pixel_format", + "WGL_EXT_pbuffer", + "WGL_EXT_depth_float", + "WGL_3DFX_multisample", + "WGL_EXT_multisample", + "WGL_I3D_digital_video_control", + "WGL_I3D_gamma", + "WGL_I3D_genlock", + "WGL_I3D_image_buffer", + "WGL_I3D_swap_frame_lock", + "WGL_NV_render_depth_texture", + "WGL_NV_render_texture_rectangle", + "WGL_ATI_pixel_format_float", + "WGL_NV_float_buffer", + "WGL_3DL_stereo_control", + "WGL_EXT_pixel_format_packed_float", + "WGL_EXT_framebuffer_sRGB", + "WGL_NV_present_video", + "WGL_NV_swap_group", + "WGL_NV_gpu_affinity", + "WGL_EXT_display_color_table", + "WGL_EXT_extensions_string", + "WGL_EXT_swap_control", + "WGL_NV_vertex_array_range", + "WGL_OML_sync_control", + "WGL_I3D_swap_frame_usage", + "WGL_NV_video_output" +}; +int __GLeeWGLNumExtensions=37; + +/* WGL_ARB_buffer_region */ + +#ifdef __GLEE_WGL_ARB_buffer_region +#ifndef GLEE_C_DEFINED_wglCreateBufferRegionARB +#define GLEE_C_DEFINED_wglCreateBufferRegionARB + HANDLE __stdcall GLee_Lazy_wglCreateBufferRegionARB(HDC hDC, int iLayerPlane, UINT uType) {if (GLeeInit()) return wglCreateBufferRegionARB(hDC, iLayerPlane, uType); return (HANDLE)0;} + GLEEPFNWGLCREATEBUFFERREGIONARBPROC GLeeFuncPtr_wglCreateBufferRegionARB=GLee_Lazy_wglCreateBufferRegionARB; +#endif +#ifndef GLEE_C_DEFINED_wglDeleteBufferRegionARB +#define GLEE_C_DEFINED_wglDeleteBufferRegionARB + VOID __stdcall GLee_Lazy_wglDeleteBufferRegionARB(HANDLE hRegion) {if (GLeeInit()) wglDeleteBufferRegionARB(hRegion);} + GLEEPFNWGLDELETEBUFFERREGIONARBPROC GLeeFuncPtr_wglDeleteBufferRegionARB=GLee_Lazy_wglDeleteBufferRegionARB; +#endif +#ifndef GLEE_C_DEFINED_wglSaveBufferRegionARB +#define GLEE_C_DEFINED_wglSaveBufferRegionARB + BOOL __stdcall GLee_Lazy_wglSaveBufferRegionARB(HANDLE hRegion, int x, int y, int width, int height) {if (GLeeInit()) return wglSaveBufferRegionARB(hRegion, x, y, width, height); return (BOOL)0;} + GLEEPFNWGLSAVEBUFFERREGIONARBPROC GLeeFuncPtr_wglSaveBufferRegionARB=GLee_Lazy_wglSaveBufferRegionARB; +#endif +#ifndef GLEE_C_DEFINED_wglRestoreBufferRegionARB +#define GLEE_C_DEFINED_wglRestoreBufferRegionARB + BOOL __stdcall GLee_Lazy_wglRestoreBufferRegionARB(HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc) {if (GLeeInit()) return wglRestoreBufferRegionARB(hRegion, x, y, width, height, xSrc, ySrc); return (BOOL)0;} + GLEEPFNWGLRESTOREBUFFERREGIONARBPROC GLeeFuncPtr_wglRestoreBufferRegionARB=GLee_Lazy_wglRestoreBufferRegionARB; +#endif +#endif + +/* WGL_ARB_multisample */ + +#ifdef __GLEE_WGL_ARB_multisample +#endif + +/* WGL_ARB_extensions_string */ + +#ifdef __GLEE_WGL_ARB_extensions_string +#ifndef GLEE_C_DEFINED_wglGetExtensionsStringARB +#define GLEE_C_DEFINED_wglGetExtensionsStringARB + const char * __stdcall GLee_Lazy_wglGetExtensionsStringARB(HDC hdc) {if (GLeeInit()) return wglGetExtensionsStringARB(hdc); return (const char *)0;} + GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC GLeeFuncPtr_wglGetExtensionsStringARB=GLee_Lazy_wglGetExtensionsStringARB; +#endif +#endif + +/* WGL_ARB_pixel_format */ + +#ifdef __GLEE_WGL_ARB_pixel_format +#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribivARB +#define GLEE_C_DEFINED_wglGetPixelFormatAttribivARB + BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribivARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues) {if (GLeeInit()) return wglGetPixelFormatAttribivARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); return (BOOL)0;} + GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribivARB=GLee_Lazy_wglGetPixelFormatAttribivARB; +#endif +#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribfvARB +#define GLEE_C_DEFINED_wglGetPixelFormatAttribfvARB + BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribfvARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues) {if (GLeeInit()) return wglGetPixelFormatAttribfvARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); return (BOOL)0;} + GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribfvARB=GLee_Lazy_wglGetPixelFormatAttribfvARB; +#endif +#ifndef GLEE_C_DEFINED_wglChoosePixelFormatARB +#define GLEE_C_DEFINED_wglChoosePixelFormatARB + BOOL __stdcall GLee_Lazy_wglChoosePixelFormatARB(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats) {if (GLeeInit()) return wglChoosePixelFormatARB(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); return (BOOL)0;} + GLEEPFNWGLCHOOSEPIXELFORMATARBPROC GLeeFuncPtr_wglChoosePixelFormatARB=GLee_Lazy_wglChoosePixelFormatARB; +#endif +#endif + +/* WGL_ARB_make_current_read */ + +#ifdef __GLEE_WGL_ARB_make_current_read +#ifndef GLEE_C_DEFINED_wglMakeContextCurrentARB +#define GLEE_C_DEFINED_wglMakeContextCurrentARB + BOOL __stdcall GLee_Lazy_wglMakeContextCurrentARB(HDC hDrawDC, HDC hReadDC, HGLRC hglrc) {if (GLeeInit()) return wglMakeContextCurrentARB(hDrawDC, hReadDC, hglrc); return (BOOL)0;} + GLEEPFNWGLMAKECONTEXTCURRENTARBPROC GLeeFuncPtr_wglMakeContextCurrentARB=GLee_Lazy_wglMakeContextCurrentARB; +#endif +#ifndef GLEE_C_DEFINED_wglGetCurrentReadDCARB +#define GLEE_C_DEFINED_wglGetCurrentReadDCARB + HDC __stdcall GLee_Lazy_wglGetCurrentReadDCARB(void) {if (GLeeInit()) return wglGetCurrentReadDCARB(); return (HDC)0;} + GLEEPFNWGLGETCURRENTREADDCARBPROC GLeeFuncPtr_wglGetCurrentReadDCARB=GLee_Lazy_wglGetCurrentReadDCARB; +#endif +#endif + +/* WGL_ARB_pbuffer */ + +#ifdef __GLEE_WGL_ARB_pbuffer +#ifndef GLEE_C_DEFINED_wglCreatePbufferARB +#define GLEE_C_DEFINED_wglCreatePbufferARB + HPBUFFERARB __stdcall GLee_Lazy_wglCreatePbufferARB(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList) {if (GLeeInit()) return wglCreatePbufferARB(hDC, iPixelFormat, iWidth, iHeight, piAttribList); return (HPBUFFERARB)0;} + GLEEPFNWGLCREATEPBUFFERARBPROC GLeeFuncPtr_wglCreatePbufferARB=GLee_Lazy_wglCreatePbufferARB; +#endif +#ifndef GLEE_C_DEFINED_wglGetPbufferDCARB +#define GLEE_C_DEFINED_wglGetPbufferDCARB + HDC __stdcall GLee_Lazy_wglGetPbufferDCARB(HPBUFFERARB hPbuffer) {if (GLeeInit()) return wglGetPbufferDCARB(hPbuffer); return (HDC)0;} + GLEEPFNWGLGETPBUFFERDCARBPROC GLeeFuncPtr_wglGetPbufferDCARB=GLee_Lazy_wglGetPbufferDCARB; +#endif +#ifndef GLEE_C_DEFINED_wglReleasePbufferDCARB +#define GLEE_C_DEFINED_wglReleasePbufferDCARB + int __stdcall GLee_Lazy_wglReleasePbufferDCARB(HPBUFFERARB hPbuffer, HDC hDC) {if (GLeeInit()) return wglReleasePbufferDCARB(hPbuffer, hDC); return (int)0;} + GLEEPFNWGLRELEASEPBUFFERDCARBPROC GLeeFuncPtr_wglReleasePbufferDCARB=GLee_Lazy_wglReleasePbufferDCARB; +#endif +#ifndef GLEE_C_DEFINED_wglDestroyPbufferARB +#define GLEE_C_DEFINED_wglDestroyPbufferARB + BOOL __stdcall GLee_Lazy_wglDestroyPbufferARB(HPBUFFERARB hPbuffer) {if (GLeeInit()) return wglDestroyPbufferARB(hPbuffer); return (BOOL)0;} + GLEEPFNWGLDESTROYPBUFFERARBPROC GLeeFuncPtr_wglDestroyPbufferARB=GLee_Lazy_wglDestroyPbufferARB; +#endif +#ifndef GLEE_C_DEFINED_wglQueryPbufferARB +#define GLEE_C_DEFINED_wglQueryPbufferARB + BOOL __stdcall GLee_Lazy_wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, int * piValue) {if (GLeeInit()) return wglQueryPbufferARB(hPbuffer, iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLQUERYPBUFFERARBPROC GLeeFuncPtr_wglQueryPbufferARB=GLee_Lazy_wglQueryPbufferARB; +#endif +#endif + +/* WGL_ARB_render_texture */ + +#ifdef __GLEE_WGL_ARB_render_texture +#ifndef GLEE_C_DEFINED_wglBindTexImageARB +#define GLEE_C_DEFINED_wglBindTexImageARB + BOOL __stdcall GLee_Lazy_wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) {if (GLeeInit()) return wglBindTexImageARB(hPbuffer, iBuffer); return (BOOL)0;} + GLEEPFNWGLBINDTEXIMAGEARBPROC GLeeFuncPtr_wglBindTexImageARB=GLee_Lazy_wglBindTexImageARB; +#endif +#ifndef GLEE_C_DEFINED_wglReleaseTexImageARB +#define GLEE_C_DEFINED_wglReleaseTexImageARB + BOOL __stdcall GLee_Lazy_wglReleaseTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) {if (GLeeInit()) return wglReleaseTexImageARB(hPbuffer, iBuffer); return (BOOL)0;} + GLEEPFNWGLRELEASETEXIMAGEARBPROC GLeeFuncPtr_wglReleaseTexImageARB=GLee_Lazy_wglReleaseTexImageARB; +#endif +#ifndef GLEE_C_DEFINED_wglSetPbufferAttribARB +#define GLEE_C_DEFINED_wglSetPbufferAttribARB + BOOL __stdcall GLee_Lazy_wglSetPbufferAttribARB(HPBUFFERARB hPbuffer, const int * piAttribList) {if (GLeeInit()) return wglSetPbufferAttribARB(hPbuffer, piAttribList); return (BOOL)0;} + GLEEPFNWGLSETPBUFFERATTRIBARBPROC GLeeFuncPtr_wglSetPbufferAttribARB=GLee_Lazy_wglSetPbufferAttribARB; +#endif +#endif + +/* WGL_ARB_pixel_format_float */ + +#ifdef __GLEE_WGL_ARB_pixel_format_float +#endif + +/* WGL_ARB_create_context */ + +#ifdef __GLEE_WGL_ARB_create_context +#ifndef GLEE_C_DEFINED_wglCreateContextAttribsARB +#define GLEE_C_DEFINED_wglCreateContextAttribsARB + HGLRC __stdcall GLee_Lazy_wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int * attribList) {if (GLeeInit()) return wglCreateContextAttribsARB(hDC, hShareContext, attribList); return (HGLRC)0;} + GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_wglCreateContextAttribsARB=GLee_Lazy_wglCreateContextAttribsARB; +#endif +#endif + +/* WGL_EXT_make_current_read */ + +#ifdef __GLEE_WGL_EXT_make_current_read +#ifndef GLEE_C_DEFINED_wglMakeContextCurrentEXT +#define GLEE_C_DEFINED_wglMakeContextCurrentEXT + BOOL __stdcall GLee_Lazy_wglMakeContextCurrentEXT(HDC hDrawDC, HDC hReadDC, HGLRC hglrc) {if (GLeeInit()) return wglMakeContextCurrentEXT(hDrawDC, hReadDC, hglrc); return (BOOL)0;} + GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC GLeeFuncPtr_wglMakeContextCurrentEXT=GLee_Lazy_wglMakeContextCurrentEXT; +#endif +#ifndef GLEE_C_DEFINED_wglGetCurrentReadDCEXT +#define GLEE_C_DEFINED_wglGetCurrentReadDCEXT + HDC __stdcall GLee_Lazy_wglGetCurrentReadDCEXT(void) {if (GLeeInit()) return wglGetCurrentReadDCEXT(); return (HDC)0;} + GLEEPFNWGLGETCURRENTREADDCEXTPROC GLeeFuncPtr_wglGetCurrentReadDCEXT=GLee_Lazy_wglGetCurrentReadDCEXT; +#endif +#endif + +/* WGL_EXT_pixel_format */ + +#ifdef __GLEE_WGL_EXT_pixel_format +#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribivEXT +#define GLEE_C_DEFINED_wglGetPixelFormatAttribivEXT + BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribivEXT(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, int * piValues) {if (GLeeInit()) return wglGetPixelFormatAttribivEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); return (BOOL)0;} + GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribivEXT=GLee_Lazy_wglGetPixelFormatAttribivEXT; +#endif +#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribfvEXT +#define GLEE_C_DEFINED_wglGetPixelFormatAttribfvEXT + BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribfvEXT(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, FLOAT * pfValues) {if (GLeeInit()) return wglGetPixelFormatAttribfvEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); return (BOOL)0;} + GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribfvEXT=GLee_Lazy_wglGetPixelFormatAttribfvEXT; +#endif +#ifndef GLEE_C_DEFINED_wglChoosePixelFormatEXT +#define GLEE_C_DEFINED_wglChoosePixelFormatEXT + BOOL __stdcall GLee_Lazy_wglChoosePixelFormatEXT(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats) {if (GLeeInit()) return wglChoosePixelFormatEXT(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); return (BOOL)0;} + GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC GLeeFuncPtr_wglChoosePixelFormatEXT=GLee_Lazy_wglChoosePixelFormatEXT; +#endif +#endif + +/* WGL_EXT_pbuffer */ + +#ifdef __GLEE_WGL_EXT_pbuffer +#ifndef GLEE_C_DEFINED_wglCreatePbufferEXT +#define GLEE_C_DEFINED_wglCreatePbufferEXT + HPBUFFEREXT __stdcall GLee_Lazy_wglCreatePbufferEXT(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList) {if (GLeeInit()) return wglCreatePbufferEXT(hDC, iPixelFormat, iWidth, iHeight, piAttribList); return (HPBUFFEREXT)0;} + GLEEPFNWGLCREATEPBUFFEREXTPROC GLeeFuncPtr_wglCreatePbufferEXT=GLee_Lazy_wglCreatePbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_wglGetPbufferDCEXT +#define GLEE_C_DEFINED_wglGetPbufferDCEXT + HDC __stdcall GLee_Lazy_wglGetPbufferDCEXT(HPBUFFEREXT hPbuffer) {if (GLeeInit()) return wglGetPbufferDCEXT(hPbuffer); return (HDC)0;} + GLEEPFNWGLGETPBUFFERDCEXTPROC GLeeFuncPtr_wglGetPbufferDCEXT=GLee_Lazy_wglGetPbufferDCEXT; +#endif +#ifndef GLEE_C_DEFINED_wglReleasePbufferDCEXT +#define GLEE_C_DEFINED_wglReleasePbufferDCEXT + int __stdcall GLee_Lazy_wglReleasePbufferDCEXT(HPBUFFEREXT hPbuffer, HDC hDC) {if (GLeeInit()) return wglReleasePbufferDCEXT(hPbuffer, hDC); return (int)0;} + GLEEPFNWGLRELEASEPBUFFERDCEXTPROC GLeeFuncPtr_wglReleasePbufferDCEXT=GLee_Lazy_wglReleasePbufferDCEXT; +#endif +#ifndef GLEE_C_DEFINED_wglDestroyPbufferEXT +#define GLEE_C_DEFINED_wglDestroyPbufferEXT + BOOL __stdcall GLee_Lazy_wglDestroyPbufferEXT(HPBUFFEREXT hPbuffer) {if (GLeeInit()) return wglDestroyPbufferEXT(hPbuffer); return (BOOL)0;} + GLEEPFNWGLDESTROYPBUFFEREXTPROC GLeeFuncPtr_wglDestroyPbufferEXT=GLee_Lazy_wglDestroyPbufferEXT; +#endif +#ifndef GLEE_C_DEFINED_wglQueryPbufferEXT +#define GLEE_C_DEFINED_wglQueryPbufferEXT + BOOL __stdcall GLee_Lazy_wglQueryPbufferEXT(HPBUFFEREXT hPbuffer, int iAttribute, int * piValue) {if (GLeeInit()) return wglQueryPbufferEXT(hPbuffer, iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLQUERYPBUFFEREXTPROC GLeeFuncPtr_wglQueryPbufferEXT=GLee_Lazy_wglQueryPbufferEXT; +#endif +#endif + +/* WGL_EXT_depth_float */ + +#ifdef __GLEE_WGL_EXT_depth_float +#endif + +/* WGL_3DFX_multisample */ + +#ifdef __GLEE_WGL_3DFX_multisample +#endif + +/* WGL_EXT_multisample */ + +#ifdef __GLEE_WGL_EXT_multisample +#endif + +/* WGL_I3D_digital_video_control */ + +#ifdef __GLEE_WGL_I3D_digital_video_control +#ifndef GLEE_C_DEFINED_wglGetDigitalVideoParametersI3D +#define GLEE_C_DEFINED_wglGetDigitalVideoParametersI3D + BOOL __stdcall GLee_Lazy_wglGetDigitalVideoParametersI3D(HDC hDC, int iAttribute, int * piValue) {if (GLeeInit()) return wglGetDigitalVideoParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglGetDigitalVideoParametersI3D=GLee_Lazy_wglGetDigitalVideoParametersI3D; +#endif +#ifndef GLEE_C_DEFINED_wglSetDigitalVideoParametersI3D +#define GLEE_C_DEFINED_wglSetDigitalVideoParametersI3D + BOOL __stdcall GLee_Lazy_wglSetDigitalVideoParametersI3D(HDC hDC, int iAttribute, const int * piValue) {if (GLeeInit()) return wglSetDigitalVideoParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglSetDigitalVideoParametersI3D=GLee_Lazy_wglSetDigitalVideoParametersI3D; +#endif +#endif + +/* WGL_I3D_gamma */ + +#ifdef __GLEE_WGL_I3D_gamma +#ifndef GLEE_C_DEFINED_wglGetGammaTableParametersI3D +#define GLEE_C_DEFINED_wglGetGammaTableParametersI3D + BOOL __stdcall GLee_Lazy_wglGetGammaTableParametersI3D(HDC hDC, int iAttribute, int * piValue) {if (GLeeInit()) return wglGetGammaTableParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglGetGammaTableParametersI3D=GLee_Lazy_wglGetGammaTableParametersI3D; +#endif +#ifndef GLEE_C_DEFINED_wglSetGammaTableParametersI3D +#define GLEE_C_DEFINED_wglSetGammaTableParametersI3D + BOOL __stdcall GLee_Lazy_wglSetGammaTableParametersI3D(HDC hDC, int iAttribute, const int * piValue) {if (GLeeInit()) return wglSetGammaTableParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglSetGammaTableParametersI3D=GLee_Lazy_wglSetGammaTableParametersI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGetGammaTableI3D +#define GLEE_C_DEFINED_wglGetGammaTableI3D + BOOL __stdcall GLee_Lazy_wglGetGammaTableI3D(HDC hDC, int iEntries, USHORT * puRed, USHORT * puGreen, USHORT * puBlue) {if (GLeeInit()) return wglGetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); return (BOOL)0;} + GLEEPFNWGLGETGAMMATABLEI3DPROC GLeeFuncPtr_wglGetGammaTableI3D=GLee_Lazy_wglGetGammaTableI3D; +#endif +#ifndef GLEE_C_DEFINED_wglSetGammaTableI3D +#define GLEE_C_DEFINED_wglSetGammaTableI3D + BOOL __stdcall GLee_Lazy_wglSetGammaTableI3D(HDC hDC, int iEntries, const USHORT * puRed, const USHORT * puGreen, const USHORT * puBlue) {if (GLeeInit()) return wglSetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); return (BOOL)0;} + GLEEPFNWGLSETGAMMATABLEI3DPROC GLeeFuncPtr_wglSetGammaTableI3D=GLee_Lazy_wglSetGammaTableI3D; +#endif +#endif + +/* WGL_I3D_genlock */ + +#ifdef __GLEE_WGL_I3D_genlock +#ifndef GLEE_C_DEFINED_wglEnableGenlockI3D +#define GLEE_C_DEFINED_wglEnableGenlockI3D + BOOL __stdcall GLee_Lazy_wglEnableGenlockI3D(HDC hDC) {if (GLeeInit()) return wglEnableGenlockI3D(hDC); return (BOOL)0;} + GLEEPFNWGLENABLEGENLOCKI3DPROC GLeeFuncPtr_wglEnableGenlockI3D=GLee_Lazy_wglEnableGenlockI3D; +#endif +#ifndef GLEE_C_DEFINED_wglDisableGenlockI3D +#define GLEE_C_DEFINED_wglDisableGenlockI3D + BOOL __stdcall GLee_Lazy_wglDisableGenlockI3D(HDC hDC) {if (GLeeInit()) return wglDisableGenlockI3D(hDC); return (BOOL)0;} + GLEEPFNWGLDISABLEGENLOCKI3DPROC GLeeFuncPtr_wglDisableGenlockI3D=GLee_Lazy_wglDisableGenlockI3D; +#endif +#ifndef GLEE_C_DEFINED_wglIsEnabledGenlockI3D +#define GLEE_C_DEFINED_wglIsEnabledGenlockI3D + BOOL __stdcall GLee_Lazy_wglIsEnabledGenlockI3D(HDC hDC, BOOL * pFlag) {if (GLeeInit()) return wglIsEnabledGenlockI3D(hDC, pFlag); return (BOOL)0;} + GLEEPFNWGLISENABLEDGENLOCKI3DPROC GLeeFuncPtr_wglIsEnabledGenlockI3D=GLee_Lazy_wglIsEnabledGenlockI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGenlockSourceI3D +#define GLEE_C_DEFINED_wglGenlockSourceI3D + BOOL __stdcall GLee_Lazy_wglGenlockSourceI3D(HDC hDC, UINT uSource) {if (GLeeInit()) return wglGenlockSourceI3D(hDC, uSource); return (BOOL)0;} + GLEEPFNWGLGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGenlockSourceI3D=GLee_Lazy_wglGenlockSourceI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGetGenlockSourceI3D +#define GLEE_C_DEFINED_wglGetGenlockSourceI3D + BOOL __stdcall GLee_Lazy_wglGetGenlockSourceI3D(HDC hDC, UINT * uSource) {if (GLeeInit()) return wglGetGenlockSourceI3D(hDC, uSource); return (BOOL)0;} + GLEEPFNWGLGETGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGetGenlockSourceI3D=GLee_Lazy_wglGetGenlockSourceI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGenlockSourceEdgeI3D +#define GLEE_C_DEFINED_wglGenlockSourceEdgeI3D + BOOL __stdcall GLee_Lazy_wglGenlockSourceEdgeI3D(HDC hDC, UINT uEdge) {if (GLeeInit()) return wglGenlockSourceEdgeI3D(hDC, uEdge); return (BOOL)0;} + GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGenlockSourceEdgeI3D=GLee_Lazy_wglGenlockSourceEdgeI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGetGenlockSourceEdgeI3D +#define GLEE_C_DEFINED_wglGetGenlockSourceEdgeI3D + BOOL __stdcall GLee_Lazy_wglGetGenlockSourceEdgeI3D(HDC hDC, UINT * uEdge) {if (GLeeInit()) return wglGetGenlockSourceEdgeI3D(hDC, uEdge); return (BOOL)0;} + GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGetGenlockSourceEdgeI3D=GLee_Lazy_wglGetGenlockSourceEdgeI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGenlockSampleRateI3D +#define GLEE_C_DEFINED_wglGenlockSampleRateI3D + BOOL __stdcall GLee_Lazy_wglGenlockSampleRateI3D(HDC hDC, UINT uRate) {if (GLeeInit()) return wglGenlockSampleRateI3D(hDC, uRate); return (BOOL)0;} + GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGenlockSampleRateI3D=GLee_Lazy_wglGenlockSampleRateI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGetGenlockSampleRateI3D +#define GLEE_C_DEFINED_wglGetGenlockSampleRateI3D + BOOL __stdcall GLee_Lazy_wglGetGenlockSampleRateI3D(HDC hDC, UINT * uRate) {if (GLeeInit()) return wglGetGenlockSampleRateI3D(hDC, uRate); return (BOOL)0;} + GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGetGenlockSampleRateI3D=GLee_Lazy_wglGetGenlockSampleRateI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGenlockSourceDelayI3D +#define GLEE_C_DEFINED_wglGenlockSourceDelayI3D + BOOL __stdcall GLee_Lazy_wglGenlockSourceDelayI3D(HDC hDC, UINT uDelay) {if (GLeeInit()) return wglGenlockSourceDelayI3D(hDC, uDelay); return (BOOL)0;} + GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGenlockSourceDelayI3D=GLee_Lazy_wglGenlockSourceDelayI3D; +#endif +#ifndef GLEE_C_DEFINED_wglGetGenlockSourceDelayI3D +#define GLEE_C_DEFINED_wglGetGenlockSourceDelayI3D + BOOL __stdcall GLee_Lazy_wglGetGenlockSourceDelayI3D(HDC hDC, UINT * uDelay) {if (GLeeInit()) return wglGetGenlockSourceDelayI3D(hDC, uDelay); return (BOOL)0;} + GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGetGenlockSourceDelayI3D=GLee_Lazy_wglGetGenlockSourceDelayI3D; +#endif +#ifndef GLEE_C_DEFINED_wglQueryGenlockMaxSourceDelayI3D +#define GLEE_C_DEFINED_wglQueryGenlockMaxSourceDelayI3D + BOOL __stdcall GLee_Lazy_wglQueryGenlockMaxSourceDelayI3D(HDC hDC, UINT * uMaxLineDelay, UINT * uMaxPixelDelay) {if (GLeeInit()) return wglQueryGenlockMaxSourceDelayI3D(hDC, uMaxLineDelay, uMaxPixelDelay); return (BOOL)0;} + GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D=GLee_Lazy_wglQueryGenlockMaxSourceDelayI3D; +#endif +#endif + +/* WGL_I3D_image_buffer */ + +#ifdef __GLEE_WGL_I3D_image_buffer +#ifndef GLEE_C_DEFINED_wglCreateImageBufferI3D +#define GLEE_C_DEFINED_wglCreateImageBufferI3D + LPVOID __stdcall GLee_Lazy_wglCreateImageBufferI3D(HDC hDC, DWORD dwSize, UINT uFlags) {if (GLeeInit()) return wglCreateImageBufferI3D(hDC, dwSize, uFlags); return (LPVOID)0;} + GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC GLeeFuncPtr_wglCreateImageBufferI3D=GLee_Lazy_wglCreateImageBufferI3D; +#endif +#ifndef GLEE_C_DEFINED_wglDestroyImageBufferI3D +#define GLEE_C_DEFINED_wglDestroyImageBufferI3D + BOOL __stdcall GLee_Lazy_wglDestroyImageBufferI3D(HDC hDC, LPVOID pAddress) {if (GLeeInit()) return wglDestroyImageBufferI3D(hDC, pAddress); return (BOOL)0;} + GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC GLeeFuncPtr_wglDestroyImageBufferI3D=GLee_Lazy_wglDestroyImageBufferI3D; +#endif +#ifndef GLEE_C_DEFINED_wglAssociateImageBufferEventsI3D +#define GLEE_C_DEFINED_wglAssociateImageBufferEventsI3D + BOOL __stdcall GLee_Lazy_wglAssociateImageBufferEventsI3D(HDC hDC, const HANDLE * pEvent, const LPVOID * pAddress, const DWORD * pSize, UINT count) {if (GLeeInit()) return wglAssociateImageBufferEventsI3D(hDC, pEvent, pAddress, pSize, count); return (BOOL)0;} + GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglAssociateImageBufferEventsI3D=GLee_Lazy_wglAssociateImageBufferEventsI3D; +#endif +#ifndef GLEE_C_DEFINED_wglReleaseImageBufferEventsI3D +#define GLEE_C_DEFINED_wglReleaseImageBufferEventsI3D + BOOL __stdcall GLee_Lazy_wglReleaseImageBufferEventsI3D(HDC hDC, const LPVOID * pAddress, UINT count) {if (GLeeInit()) return wglReleaseImageBufferEventsI3D(hDC, pAddress, count); return (BOOL)0;} + GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglReleaseImageBufferEventsI3D=GLee_Lazy_wglReleaseImageBufferEventsI3D; +#endif +#endif + +/* WGL_I3D_swap_frame_lock */ + +#ifdef __GLEE_WGL_I3D_swap_frame_lock +#ifndef GLEE_C_DEFINED_wglEnableFrameLockI3D +#define GLEE_C_DEFINED_wglEnableFrameLockI3D + BOOL __stdcall GLee_Lazy_wglEnableFrameLockI3D(void) {if (GLeeInit()) return wglEnableFrameLockI3D(); return (BOOL)0;} + GLEEPFNWGLENABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglEnableFrameLockI3D=GLee_Lazy_wglEnableFrameLockI3D; +#endif +#ifndef GLEE_C_DEFINED_wglDisableFrameLockI3D +#define GLEE_C_DEFINED_wglDisableFrameLockI3D + BOOL __stdcall GLee_Lazy_wglDisableFrameLockI3D(void) {if (GLeeInit()) return wglDisableFrameLockI3D(); return (BOOL)0;} + GLEEPFNWGLDISABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglDisableFrameLockI3D=GLee_Lazy_wglDisableFrameLockI3D; +#endif +#ifndef GLEE_C_DEFINED_wglIsEnabledFrameLockI3D +#define GLEE_C_DEFINED_wglIsEnabledFrameLockI3D + BOOL __stdcall GLee_Lazy_wglIsEnabledFrameLockI3D(BOOL * pFlag) {if (GLeeInit()) return wglIsEnabledFrameLockI3D(pFlag); return (BOOL)0;} + GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC GLeeFuncPtr_wglIsEnabledFrameLockI3D=GLee_Lazy_wglIsEnabledFrameLockI3D; +#endif +#ifndef GLEE_C_DEFINED_wglQueryFrameLockMasterI3D +#define GLEE_C_DEFINED_wglQueryFrameLockMasterI3D + BOOL __stdcall GLee_Lazy_wglQueryFrameLockMasterI3D(BOOL * pFlag) {if (GLeeInit()) return wglQueryFrameLockMasterI3D(pFlag); return (BOOL)0;} + GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC GLeeFuncPtr_wglQueryFrameLockMasterI3D=GLee_Lazy_wglQueryFrameLockMasterI3D; +#endif +#endif + +/* WGL_NV_render_depth_texture */ + +#ifdef __GLEE_WGL_NV_render_depth_texture +#endif + +/* WGL_NV_render_texture_rectangle */ + +#ifdef __GLEE_WGL_NV_render_texture_rectangle +#endif + +/* WGL_ATI_pixel_format_float */ + +#ifdef __GLEE_WGL_ATI_pixel_format_float +#endif + +/* WGL_NV_float_buffer */ + +#ifdef __GLEE_WGL_NV_float_buffer +#endif + +/* WGL_3DL_stereo_control */ + +#ifdef __GLEE_WGL_3DL_stereo_control +#endif + +/* WGL_EXT_pixel_format_packed_float */ + +#ifdef __GLEE_WGL_EXT_pixel_format_packed_float +#endif + +/* WGL_EXT_framebuffer_sRGB */ + +#ifdef __GLEE_WGL_EXT_framebuffer_sRGB +#endif + +/* WGL_NV_present_video */ + +#ifdef __GLEE_WGL_NV_present_video +#ifndef GLEE_C_DEFINED_wglEnumerateVideoDevicesNV +#define GLEE_C_DEFINED_wglEnumerateVideoDevicesNV + int __stdcall GLee_Lazy_wglEnumerateVideoDevicesNV(HDC hDC, HVIDEOOUTPUTDEVICENV * phDeviceList) {if (GLeeInit()) return wglEnumerateVideoDevicesNV(hDC, phDeviceList); return (int)0;} + GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC GLeeFuncPtr_wglEnumerateVideoDevicesNV=GLee_Lazy_wglEnumerateVideoDevicesNV; +#endif +#ifndef GLEE_C_DEFINED_wglBindVideoDeviceNV +#define GLEE_C_DEFINED_wglBindVideoDeviceNV + BOOL __stdcall GLee_Lazy_wglBindVideoDeviceNV(HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList) {if (GLeeInit()) return wglBindVideoDeviceNV(hDC, uVideoSlot, hVideoDevice, piAttribList); return (BOOL)0;} + GLEEPFNWGLBINDVIDEODEVICENVPROC GLeeFuncPtr_wglBindVideoDeviceNV=GLee_Lazy_wglBindVideoDeviceNV; +#endif +#ifndef GLEE_C_DEFINED_wglQueryCurrentContextNV +#define GLEE_C_DEFINED_wglQueryCurrentContextNV + BOOL __stdcall GLee_Lazy_wglQueryCurrentContextNV(int iAttribute, int * piValue) {if (GLeeInit()) return wglQueryCurrentContextNV(iAttribute, piValue); return (BOOL)0;} + GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC GLeeFuncPtr_wglQueryCurrentContextNV=GLee_Lazy_wglQueryCurrentContextNV; +#endif +#endif + +/* WGL_NV_swap_group */ + +#ifdef __GLEE_WGL_NV_swap_group +#ifndef GLEE_C_DEFINED_wglJoinSwapGroupNV +#define GLEE_C_DEFINED_wglJoinSwapGroupNV + BOOL __stdcall GLee_Lazy_wglJoinSwapGroupNV(HDC hDC, GLuint group) {if (GLeeInit()) return wglJoinSwapGroupNV(hDC, group); return (BOOL)0;} + GLEEPFNWGLJOINSWAPGROUPNVPROC GLeeFuncPtr_wglJoinSwapGroupNV=GLee_Lazy_wglJoinSwapGroupNV; +#endif +#ifndef GLEE_C_DEFINED_wglBindSwapBarrierNV +#define GLEE_C_DEFINED_wglBindSwapBarrierNV + BOOL __stdcall GLee_Lazy_wglBindSwapBarrierNV(GLuint group, GLuint barrier) {if (GLeeInit()) return wglBindSwapBarrierNV(group, barrier); return (BOOL)0;} + GLEEPFNWGLBINDSWAPBARRIERNVPROC GLeeFuncPtr_wglBindSwapBarrierNV=GLee_Lazy_wglBindSwapBarrierNV; +#endif +#ifndef GLEE_C_DEFINED_wglQuerySwapGroupNV +#define GLEE_C_DEFINED_wglQuerySwapGroupNV + BOOL __stdcall GLee_Lazy_wglQuerySwapGroupNV(HDC hDC, GLuint * group, GLuint * barrier) {if (GLeeInit()) return wglQuerySwapGroupNV(hDC, group, barrier); return (BOOL)0;} + GLEEPFNWGLQUERYSWAPGROUPNVPROC GLeeFuncPtr_wglQuerySwapGroupNV=GLee_Lazy_wglQuerySwapGroupNV; +#endif +#ifndef GLEE_C_DEFINED_wglQueryMaxSwapGroupsNV +#define GLEE_C_DEFINED_wglQueryMaxSwapGroupsNV + BOOL __stdcall GLee_Lazy_wglQueryMaxSwapGroupsNV(HDC hDC, GLuint * maxGroups, GLuint * maxBarriers) {if (GLeeInit()) return wglQueryMaxSwapGroupsNV(hDC, maxGroups, maxBarriers); return (BOOL)0;} + GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC GLeeFuncPtr_wglQueryMaxSwapGroupsNV=GLee_Lazy_wglQueryMaxSwapGroupsNV; +#endif +#ifndef GLEE_C_DEFINED_wglQueryFrameCountNV +#define GLEE_C_DEFINED_wglQueryFrameCountNV + BOOL __stdcall GLee_Lazy_wglQueryFrameCountNV(HDC hDC, GLuint * count) {if (GLeeInit()) return wglQueryFrameCountNV(hDC, count); return (BOOL)0;} + GLEEPFNWGLQUERYFRAMECOUNTNVPROC GLeeFuncPtr_wglQueryFrameCountNV=GLee_Lazy_wglQueryFrameCountNV; +#endif +#ifndef GLEE_C_DEFINED_wglResetFrameCountNV +#define GLEE_C_DEFINED_wglResetFrameCountNV + BOOL __stdcall GLee_Lazy_wglResetFrameCountNV(HDC hDC) {if (GLeeInit()) return wglResetFrameCountNV(hDC); return (BOOL)0;} + GLEEPFNWGLRESETFRAMECOUNTNVPROC GLeeFuncPtr_wglResetFrameCountNV=GLee_Lazy_wglResetFrameCountNV; +#endif +#endif + +/* WGL_NV_gpu_affinity */ + +#ifdef __GLEE_WGL_NV_gpu_affinity +#ifndef GLEE_C_DEFINED_wglEnumGpusNV +#define GLEE_C_DEFINED_wglEnumGpusNV + BOOL __stdcall GLee_Lazy_wglEnumGpusNV(UINT iGpuIndex, HGPUNV * phGpu) {if (GLeeInit()) return wglEnumGpusNV(iGpuIndex, phGpu); return (BOOL)0;} + GLEEPFNWGLENUMGPUSNVPROC GLeeFuncPtr_wglEnumGpusNV=GLee_Lazy_wglEnumGpusNV; +#endif +#ifndef GLEE_C_DEFINED_wglEnumGpuDevicesNV +#define GLEE_C_DEFINED_wglEnumGpuDevicesNV + BOOL __stdcall GLee_Lazy_wglEnumGpuDevicesNV(HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice) {if (GLeeInit()) return wglEnumGpuDevicesNV(hGpu, iDeviceIndex, lpGpuDevice); return (BOOL)0;} + GLEEPFNWGLENUMGPUDEVICESNVPROC GLeeFuncPtr_wglEnumGpuDevicesNV=GLee_Lazy_wglEnumGpuDevicesNV; +#endif +#ifndef GLEE_C_DEFINED_wglCreateAffinityDCNV +#define GLEE_C_DEFINED_wglCreateAffinityDCNV + HDC __stdcall GLee_Lazy_wglCreateAffinityDCNV(const HGPUNV * phGpuList) {if (GLeeInit()) return wglCreateAffinityDCNV(phGpuList); return (HDC)0;} + GLEEPFNWGLCREATEAFFINITYDCNVPROC GLeeFuncPtr_wglCreateAffinityDCNV=GLee_Lazy_wglCreateAffinityDCNV; +#endif +#ifndef GLEE_C_DEFINED_wglEnumGpusFromAffinityDCNV +#define GLEE_C_DEFINED_wglEnumGpusFromAffinityDCNV + BOOL __stdcall GLee_Lazy_wglEnumGpusFromAffinityDCNV(HDC hAffinityDC, UINT iGpuIndex, HGPUNV * hGpu) {if (GLeeInit()) return wglEnumGpusFromAffinityDCNV(hAffinityDC, iGpuIndex, hGpu); return (BOOL)0;} + GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC GLeeFuncPtr_wglEnumGpusFromAffinityDCNV=GLee_Lazy_wglEnumGpusFromAffinityDCNV; +#endif +#ifndef GLEE_C_DEFINED_wglDeleteDCNV +#define GLEE_C_DEFINED_wglDeleteDCNV + BOOL __stdcall GLee_Lazy_wglDeleteDCNV(HDC hdc) {if (GLeeInit()) return wglDeleteDCNV(hdc); return (BOOL)0;} + GLEEPFNWGLDELETEDCNVPROC GLeeFuncPtr_wglDeleteDCNV=GLee_Lazy_wglDeleteDCNV; +#endif +#endif + +/* WGL_EXT_display_color_table */ + +#ifdef __GLEE_WGL_EXT_display_color_table +#ifndef GLEE_C_DEFINED_wglCreateDisplayColorTableEXT +#define GLEE_C_DEFINED_wglCreateDisplayColorTableEXT + GLboolean __stdcall GLee_Lazy_wglCreateDisplayColorTableEXT(GLushort id) {if (GLeeInit()) return wglCreateDisplayColorTableEXT(id); return (GLboolean)0;} + GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglCreateDisplayColorTableEXT=GLee_Lazy_wglCreateDisplayColorTableEXT; +#endif +#ifndef GLEE_C_DEFINED_wglLoadDisplayColorTableEXT +#define GLEE_C_DEFINED_wglLoadDisplayColorTableEXT + GLboolean __stdcall GLee_Lazy_wglLoadDisplayColorTableEXT(const GLushort * table, GLuint length) {if (GLeeInit()) return wglLoadDisplayColorTableEXT(table, length); return (GLboolean)0;} + GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglLoadDisplayColorTableEXT=GLee_Lazy_wglLoadDisplayColorTableEXT; +#endif +#ifndef GLEE_C_DEFINED_wglBindDisplayColorTableEXT +#define GLEE_C_DEFINED_wglBindDisplayColorTableEXT + GLboolean __stdcall GLee_Lazy_wglBindDisplayColorTableEXT(GLushort id) {if (GLeeInit()) return wglBindDisplayColorTableEXT(id); return (GLboolean)0;} + GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglBindDisplayColorTableEXT=GLee_Lazy_wglBindDisplayColorTableEXT; +#endif +#ifndef GLEE_C_DEFINED_wglDestroyDisplayColorTableEXT +#define GLEE_C_DEFINED_wglDestroyDisplayColorTableEXT + VOID __stdcall GLee_Lazy_wglDestroyDisplayColorTableEXT(GLushort id) {if (GLeeInit()) wglDestroyDisplayColorTableEXT(id);} + GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglDestroyDisplayColorTableEXT=GLee_Lazy_wglDestroyDisplayColorTableEXT; +#endif +#endif + +/* WGL_EXT_extensions_string */ + +#ifdef __GLEE_WGL_EXT_extensions_string +#ifndef GLEE_C_DEFINED_wglGetExtensionsStringEXT +#define GLEE_C_DEFINED_wglGetExtensionsStringEXT + const char * __stdcall GLee_Lazy_wglGetExtensionsStringEXT(void) {if (GLeeInit()) return wglGetExtensionsStringEXT(); return (const char *)0;} + GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC GLeeFuncPtr_wglGetExtensionsStringEXT=GLee_Lazy_wglGetExtensionsStringEXT; +#endif +#endif + +/* WGL_EXT_swap_control */ + +#ifdef __GLEE_WGL_EXT_swap_control +#ifndef GLEE_C_DEFINED_wglSwapIntervalEXT +#define GLEE_C_DEFINED_wglSwapIntervalEXT + BOOL __stdcall GLee_Lazy_wglSwapIntervalEXT(int interval) {if (GLeeInit()) return wglSwapIntervalEXT(interval); return (BOOL)0;} + GLEEPFNWGLSWAPINTERVALEXTPROC GLeeFuncPtr_wglSwapIntervalEXT=GLee_Lazy_wglSwapIntervalEXT; +#endif +#ifndef GLEE_C_DEFINED_wglGetSwapIntervalEXT +#define GLEE_C_DEFINED_wglGetSwapIntervalEXT + int __stdcall GLee_Lazy_wglGetSwapIntervalEXT(void) {if (GLeeInit()) return wglGetSwapIntervalEXT(); return (int)0;} + GLEEPFNWGLGETSWAPINTERVALEXTPROC GLeeFuncPtr_wglGetSwapIntervalEXT=GLee_Lazy_wglGetSwapIntervalEXT; +#endif +#endif + +/* WGL_NV_vertex_array_range */ + +#ifdef __GLEE_WGL_NV_vertex_array_range +#ifndef GLEE_C_DEFINED_wglAllocateMemoryNV +#define GLEE_C_DEFINED_wglAllocateMemoryNV + void* __stdcall GLee_Lazy_wglAllocateMemoryNV(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority) {if (GLeeInit()) return wglAllocateMemoryNV(size, readfreq, writefreq, priority); return (void*)0;} + GLEEPFNWGLALLOCATEMEMORYNVPROC GLeeFuncPtr_wglAllocateMemoryNV=GLee_Lazy_wglAllocateMemoryNV; +#endif +#ifndef GLEE_C_DEFINED_wglFreeMemoryNV +#define GLEE_C_DEFINED_wglFreeMemoryNV + void __stdcall GLee_Lazy_wglFreeMemoryNV(void * pointer) {if (GLeeInit()) wglFreeMemoryNV(pointer);} + GLEEPFNWGLFREEMEMORYNVPROC GLeeFuncPtr_wglFreeMemoryNV=GLee_Lazy_wglFreeMemoryNV; +#endif +#endif + +/* WGL_OML_sync_control */ + +#ifdef __GLEE_WGL_OML_sync_control +#ifndef GLEE_C_DEFINED_wglGetSyncValuesOML +#define GLEE_C_DEFINED_wglGetSyncValuesOML + BOOL __stdcall GLee_Lazy_wglGetSyncValuesOML(HDC hdc, INT64 * ust, INT64 * msc, INT64 * sbc) {if (GLeeInit()) return wglGetSyncValuesOML(hdc, ust, msc, sbc); return (BOOL)0;} + GLEEPFNWGLGETSYNCVALUESOMLPROC GLeeFuncPtr_wglGetSyncValuesOML=GLee_Lazy_wglGetSyncValuesOML; +#endif +#ifndef GLEE_C_DEFINED_wglGetMscRateOML +#define GLEE_C_DEFINED_wglGetMscRateOML + BOOL __stdcall GLee_Lazy_wglGetMscRateOML(HDC hdc, INT32 * numerator, INT32 * denominator) {if (GLeeInit()) return wglGetMscRateOML(hdc, numerator, denominator); return (BOOL)0;} + GLEEPFNWGLGETMSCRATEOMLPROC GLeeFuncPtr_wglGetMscRateOML=GLee_Lazy_wglGetMscRateOML; +#endif +#ifndef GLEE_C_DEFINED_wglSwapBuffersMscOML +#define GLEE_C_DEFINED_wglSwapBuffersMscOML + INT64 __stdcall GLee_Lazy_wglSwapBuffersMscOML(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder) {if (GLeeInit()) return wglSwapBuffersMscOML(hdc, target_msc, divisor, remainder); return (INT64)0;} + GLEEPFNWGLSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapBuffersMscOML=GLee_Lazy_wglSwapBuffersMscOML; +#endif +#ifndef GLEE_C_DEFINED_wglSwapLayerBuffersMscOML +#define GLEE_C_DEFINED_wglSwapLayerBuffersMscOML + INT64 __stdcall GLee_Lazy_wglSwapLayerBuffersMscOML(HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder) {if (GLeeInit()) return wglSwapLayerBuffersMscOML(hdc, fuPlanes, target_msc, divisor, remainder); return (INT64)0;} + GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapLayerBuffersMscOML=GLee_Lazy_wglSwapLayerBuffersMscOML; +#endif +#ifndef GLEE_C_DEFINED_wglWaitForMscOML +#define GLEE_C_DEFINED_wglWaitForMscOML + BOOL __stdcall GLee_Lazy_wglWaitForMscOML(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 * ust, INT64 * msc, INT64 * sbc) {if (GLeeInit()) return wglWaitForMscOML(hdc, target_msc, divisor, remainder, ust, msc, sbc); return (BOOL)0;} + GLEEPFNWGLWAITFORMSCOMLPROC GLeeFuncPtr_wglWaitForMscOML=GLee_Lazy_wglWaitForMscOML; +#endif +#ifndef GLEE_C_DEFINED_wglWaitForSbcOML +#define GLEE_C_DEFINED_wglWaitForSbcOML + BOOL __stdcall GLee_Lazy_wglWaitForSbcOML(HDC hdc, INT64 target_sbc, INT64 * ust, INT64 * msc, INT64 * sbc) {if (GLeeInit()) return wglWaitForSbcOML(hdc, target_sbc, ust, msc, sbc); return (BOOL)0;} + GLEEPFNWGLWAITFORSBCOMLPROC GLeeFuncPtr_wglWaitForSbcOML=GLee_Lazy_wglWaitForSbcOML; +#endif +#endif + +/* WGL_I3D_swap_frame_usage */ + +#ifdef __GLEE_WGL_I3D_swap_frame_usage +#ifndef GLEE_C_DEFINED_wglGetFrameUsageI3D +#define GLEE_C_DEFINED_wglGetFrameUsageI3D + BOOL __stdcall GLee_Lazy_wglGetFrameUsageI3D(float * pUsage) {if (GLeeInit()) return wglGetFrameUsageI3D(pUsage); return (BOOL)0;} + GLEEPFNWGLGETFRAMEUSAGEI3DPROC GLeeFuncPtr_wglGetFrameUsageI3D=GLee_Lazy_wglGetFrameUsageI3D; +#endif +#ifndef GLEE_C_DEFINED_wglBeginFrameTrackingI3D +#define GLEE_C_DEFINED_wglBeginFrameTrackingI3D + BOOL __stdcall GLee_Lazy_wglBeginFrameTrackingI3D(void) {if (GLeeInit()) return wglBeginFrameTrackingI3D(); return (BOOL)0;} + GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC GLeeFuncPtr_wglBeginFrameTrackingI3D=GLee_Lazy_wglBeginFrameTrackingI3D; +#endif +#ifndef GLEE_C_DEFINED_wglEndFrameTrackingI3D +#define GLEE_C_DEFINED_wglEndFrameTrackingI3D + BOOL __stdcall GLee_Lazy_wglEndFrameTrackingI3D(void) {if (GLeeInit()) return wglEndFrameTrackingI3D(); return (BOOL)0;} + GLEEPFNWGLENDFRAMETRACKINGI3DPROC GLeeFuncPtr_wglEndFrameTrackingI3D=GLee_Lazy_wglEndFrameTrackingI3D; +#endif +#ifndef GLEE_C_DEFINED_wglQueryFrameTrackingI3D +#define GLEE_C_DEFINED_wglQueryFrameTrackingI3D + BOOL __stdcall GLee_Lazy_wglQueryFrameTrackingI3D(DWORD * pFrameCount, DWORD * pMissedFrames, float * pLastMissedUsage) {if (GLeeInit()) return wglQueryFrameTrackingI3D(pFrameCount, pMissedFrames, pLastMissedUsage); return (BOOL)0;} + GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC GLeeFuncPtr_wglQueryFrameTrackingI3D=GLee_Lazy_wglQueryFrameTrackingI3D; +#endif +#endif + +/* WGL_NV_video_output */ + +#ifdef __GLEE_WGL_NV_video_output +#ifndef GLEE_C_DEFINED_wglGetVideoDeviceNV +#define GLEE_C_DEFINED_wglGetVideoDeviceNV + BOOL __stdcall GLee_Lazy_wglGetVideoDeviceNV(HDC hDC, int numDevices, HPVIDEODEV * hVideoDevice) {if (GLeeInit()) return wglGetVideoDeviceNV(hDC, numDevices, hVideoDevice); return (BOOL)0;} + GLEEPFNWGLGETVIDEODEVICENVPROC GLeeFuncPtr_wglGetVideoDeviceNV=GLee_Lazy_wglGetVideoDeviceNV; +#endif +#ifndef GLEE_C_DEFINED_wglReleaseVideoDeviceNV +#define GLEE_C_DEFINED_wglReleaseVideoDeviceNV + BOOL __stdcall GLee_Lazy_wglReleaseVideoDeviceNV(HPVIDEODEV hVideoDevice) {if (GLeeInit()) return wglReleaseVideoDeviceNV(hVideoDevice); return (BOOL)0;} + GLEEPFNWGLRELEASEVIDEODEVICENVPROC GLeeFuncPtr_wglReleaseVideoDeviceNV=GLee_Lazy_wglReleaseVideoDeviceNV; +#endif +#ifndef GLEE_C_DEFINED_wglBindVideoImageNV +#define GLEE_C_DEFINED_wglBindVideoImageNV + BOOL __stdcall GLee_Lazy_wglBindVideoImageNV(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer) {if (GLeeInit()) return wglBindVideoImageNV(hVideoDevice, hPbuffer, iVideoBuffer); return (BOOL)0;} + GLEEPFNWGLBINDVIDEOIMAGENVPROC GLeeFuncPtr_wglBindVideoImageNV=GLee_Lazy_wglBindVideoImageNV; +#endif +#ifndef GLEE_C_DEFINED_wglReleaseVideoImageNV +#define GLEE_C_DEFINED_wglReleaseVideoImageNV + BOOL __stdcall GLee_Lazy_wglReleaseVideoImageNV(HPBUFFERARB hPbuffer, int iVideoBuffer) {if (GLeeInit()) return wglReleaseVideoImageNV(hPbuffer, iVideoBuffer); return (BOOL)0;} + GLEEPFNWGLRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_wglReleaseVideoImageNV=GLee_Lazy_wglReleaseVideoImageNV; +#endif +#ifndef GLEE_C_DEFINED_wglSendPbufferToVideoNV +#define GLEE_C_DEFINED_wglSendPbufferToVideoNV + BOOL __stdcall GLee_Lazy_wglSendPbufferToVideoNV(HPBUFFERARB hPbuffer, int iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock) {if (GLeeInit()) return wglSendPbufferToVideoNV(hPbuffer, iBufferType, pulCounterPbuffer, bBlock); return (BOOL)0;} + GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_wglSendPbufferToVideoNV=GLee_Lazy_wglSendPbufferToVideoNV; +#endif +#ifndef GLEE_C_DEFINED_wglGetVideoInfoNV +#define GLEE_C_DEFINED_wglGetVideoInfoNV + BOOL __stdcall GLee_Lazy_wglGetVideoInfoNV(HPVIDEODEV hpVideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo) {if (GLeeInit()) return wglGetVideoInfoNV(hpVideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo); return (BOOL)0;} + GLEEPFNWGLGETVIDEOINFONVPROC GLeeFuncPtr_wglGetVideoInfoNV=GLee_Lazy_wglGetVideoInfoNV; +#endif +#endif +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else /* GLX */ + +/* Extension querying variables */ + +GLboolean _GLEE_GLX_VERSION_1_3 = GL_FALSE; +GLboolean _GLEE_GLX_VERSION_1_4 = GL_FALSE; +GLboolean _GLEE_GLX_ARB_multisample = GL_FALSE; +GLboolean _GLEE_GLX_ARB_fbconfig_float = GL_FALSE; +GLboolean _GLEE_GLX_ARB_create_context = GL_FALSE; +GLboolean _GLEE_GLX_SGIS_multisample = GL_FALSE; +GLboolean _GLEE_GLX_EXT_visual_info = GL_FALSE; +GLboolean _GLEE_GLX_SGI_swap_control = GL_FALSE; +GLboolean _GLEE_GLX_SGI_video_sync = GL_FALSE; +GLboolean _GLEE_GLX_SGI_make_current_read = GL_FALSE; +GLboolean _GLEE_GLX_EXT_visual_rating = GL_FALSE; +GLboolean _GLEE_GLX_EXT_import_context = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_fbconfig = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_pbuffer = GL_FALSE; +GLboolean _GLEE_GLX_SGI_cushion = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_video_resize = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_swap_group = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_swap_barrier = GL_FALSE; +GLboolean _GLEE_GLX_SGIS_blended_overlay = GL_FALSE; +GLboolean _GLEE_GLX_SGIS_shared_multisample = GL_FALSE; +GLboolean _GLEE_GLX_SUN_get_transparent_index = GL_FALSE; +GLboolean _GLEE_GLX_3DFX_multisample = GL_FALSE; +GLboolean _GLEE_GLX_MESA_copy_sub_buffer = GL_FALSE; +GLboolean _GLEE_GLX_MESA_pixmap_colormap = GL_FALSE; +GLboolean _GLEE_GLX_MESA_release_buffers = GL_FALSE; +GLboolean _GLEE_GLX_MESA_set_3dfx_mode = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_visual_select_group = GL_FALSE; +GLboolean _GLEE_GLX_OML_swap_method = GL_FALSE; +GLboolean _GLEE_GLX_OML_sync_control = GL_FALSE; +GLboolean _GLEE_GLX_NV_float_buffer = GL_FALSE; +GLboolean _GLEE_GLX_SGIX_hyperpipe = GL_FALSE; +GLboolean _GLEE_GLX_MESA_agp_offset = GL_FALSE; +GLboolean _GLEE_GLX_EXT_fbconfig_packed_float = GL_FALSE; +GLboolean _GLEE_GLX_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean _GLEE_GLX_EXT_texture_from_pixmap = GL_FALSE; +GLboolean _GLEE_GLX_NV_present_video = GL_FALSE; +GLboolean _GLEE_GLX_NV_video_out = GL_FALSE; +GLboolean _GLEE_GLX_NV_swap_group = GL_FALSE; +GLboolean _GLEE_GLX_EXT_scene_marker = GL_FALSE; +GLboolean _GLEE_GLX_NV_video_output = GL_FALSE; + +/* GLX Extension names */ + +char __GLeeGLXExtensionNames[40][30]={ + "GLX_VERSION_1_3", + "GLX_VERSION_1_4", + "GLX_ARB_multisample", + "GLX_ARB_fbconfig_float", + "GLX_ARB_create_context", + "GLX_SGIS_multisample", + "GLX_EXT_visual_info", + "GLX_SGI_swap_control", + "GLX_SGI_video_sync", + "GLX_SGI_make_current_read", + "GLX_EXT_visual_rating", + "GLX_EXT_import_context", + "GLX_SGIX_fbconfig", + "GLX_SGIX_pbuffer", + "GLX_SGI_cushion", + "GLX_SGIX_video_resize", + "GLX_SGIX_swap_group", + "GLX_SGIX_swap_barrier", + "GLX_SGIS_blended_overlay", + "GLX_SGIS_shared_multisample", + "GLX_SUN_get_transparent_index", + "GLX_3DFX_multisample", + "GLX_MESA_copy_sub_buffer", + "GLX_MESA_pixmap_colormap", + "GLX_MESA_release_buffers", + "GLX_MESA_set_3dfx_mode", + "GLX_SGIX_visual_select_group", + "GLX_OML_swap_method", + "GLX_OML_sync_control", + "GLX_NV_float_buffer", + "GLX_SGIX_hyperpipe", + "GLX_MESA_agp_offset", + "GLX_EXT_fbconfig_packed_float", + "GLX_EXT_framebuffer_sRGB", + "GLX_EXT_texture_from_pixmap", + "GLX_NV_present_video", + "GLX_NV_video_out", + "GLX_NV_swap_group", + "GLX_EXT_scene_marker", + "GLX_NV_video_output" +}; +int __GLeeGLXNumExtensions=40; + +/* GLX_VERSION_1_3 */ + +#ifdef __GLEE_GLX_VERSION_1_3 +#ifndef GLEE_C_DEFINED_glXGetFBConfigs +#define GLEE_C_DEFINED_glXGetFBConfigs + GLXFBConfig * __stdcall GLee_Lazy_glXGetFBConfigs(Display * dpy, int screen, int * nelements) {if (GLeeInit()) return glXGetFBConfigs(dpy, screen, nelements); return (GLXFBConfig *)0;} + GLEEPFNGLXGETFBCONFIGSPROC GLeeFuncPtr_glXGetFBConfigs=GLee_Lazy_glXGetFBConfigs; +#endif +#ifndef GLEE_C_DEFINED_glXChooseFBConfig +#define GLEE_C_DEFINED_glXChooseFBConfig + GLXFBConfig * __stdcall GLee_Lazy_glXChooseFBConfig(Display * dpy, int screen, const int * attrib_list, int * nelements) {if (GLeeInit()) return glXChooseFBConfig(dpy, screen, attrib_list, nelements); return (GLXFBConfig *)0;} + GLEEPFNGLXCHOOSEFBCONFIGPROC GLeeFuncPtr_glXChooseFBConfig=GLee_Lazy_glXChooseFBConfig; +#endif +#ifndef GLEE_C_DEFINED_glXGetFBConfigAttrib +#define GLEE_C_DEFINED_glXGetFBConfigAttrib + int __stdcall GLee_Lazy_glXGetFBConfigAttrib(Display * dpy, GLXFBConfig config, int attribute, int * value) {if (GLeeInit()) return glXGetFBConfigAttrib(dpy, config, attribute, value); return (int)0;} + GLEEPFNGLXGETFBCONFIGATTRIBPROC GLeeFuncPtr_glXGetFBConfigAttrib=GLee_Lazy_glXGetFBConfigAttrib; +#endif +#ifndef GLEE_C_DEFINED_glXGetVisualFromFBConfig +#define GLEE_C_DEFINED_glXGetVisualFromFBConfig + XVisualInfo * __stdcall GLee_Lazy_glXGetVisualFromFBConfig(Display * dpy, GLXFBConfig config) {if (GLeeInit()) return glXGetVisualFromFBConfig(dpy, config); return (XVisualInfo *)0;} + GLEEPFNGLXGETVISUALFROMFBCONFIGPROC GLeeFuncPtr_glXGetVisualFromFBConfig=GLee_Lazy_glXGetVisualFromFBConfig; +#endif +#ifndef GLEE_C_DEFINED_glXCreateWindow +#define GLEE_C_DEFINED_glXCreateWindow + GLXWindow __stdcall GLee_Lazy_glXCreateWindow(Display * dpy, GLXFBConfig config, Window win, const int * attrib_list) {if (GLeeInit()) return glXCreateWindow(dpy, config, win, attrib_list); return (GLXWindow)0;} + GLEEPFNGLXCREATEWINDOWPROC GLeeFuncPtr_glXCreateWindow=GLee_Lazy_glXCreateWindow; +#endif +#ifndef GLEE_C_DEFINED_glXDestroyWindow +#define GLEE_C_DEFINED_glXDestroyWindow + void __stdcall GLee_Lazy_glXDestroyWindow(Display * dpy, GLXWindow win) {if (GLeeInit()) glXDestroyWindow(dpy, win);} + GLEEPFNGLXDESTROYWINDOWPROC GLeeFuncPtr_glXDestroyWindow=GLee_Lazy_glXDestroyWindow; +#endif +#ifndef GLEE_C_DEFINED_glXCreatePixmap +#define GLEE_C_DEFINED_glXCreatePixmap + GLXPixmap __stdcall GLee_Lazy_glXCreatePixmap(Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list) {if (GLeeInit()) return glXCreatePixmap(dpy, config, pixmap, attrib_list); return (GLXPixmap)0;} + GLEEPFNGLXCREATEPIXMAPPROC GLeeFuncPtr_glXCreatePixmap=GLee_Lazy_glXCreatePixmap; +#endif +#ifndef GLEE_C_DEFINED_glXDestroyPixmap +#define GLEE_C_DEFINED_glXDestroyPixmap + void __stdcall GLee_Lazy_glXDestroyPixmap(Display * dpy, GLXPixmap pixmap) {if (GLeeInit()) glXDestroyPixmap(dpy, pixmap);} + GLEEPFNGLXDESTROYPIXMAPPROC GLeeFuncPtr_glXDestroyPixmap=GLee_Lazy_glXDestroyPixmap; +#endif +#ifndef GLEE_C_DEFINED_glXCreatePbuffer +#define GLEE_C_DEFINED_glXCreatePbuffer + GLXPbuffer __stdcall GLee_Lazy_glXCreatePbuffer(Display * dpy, GLXFBConfig config, const int * attrib_list) {if (GLeeInit()) return glXCreatePbuffer(dpy, config, attrib_list); return (GLXPbuffer)0;} + GLEEPFNGLXCREATEPBUFFERPROC GLeeFuncPtr_glXCreatePbuffer=GLee_Lazy_glXCreatePbuffer; +#endif +#ifndef GLEE_C_DEFINED_glXDestroyPbuffer +#define GLEE_C_DEFINED_glXDestroyPbuffer + void __stdcall GLee_Lazy_glXDestroyPbuffer(Display * dpy, GLXPbuffer pbuf) {if (GLeeInit()) glXDestroyPbuffer(dpy, pbuf);} + GLEEPFNGLXDESTROYPBUFFERPROC GLeeFuncPtr_glXDestroyPbuffer=GLee_Lazy_glXDestroyPbuffer; +#endif +#ifndef GLEE_C_DEFINED_glXQueryDrawable +#define GLEE_C_DEFINED_glXQueryDrawable + void __stdcall GLee_Lazy_glXQueryDrawable(Display * dpy, GLXDrawable draw, int attribute, unsigned int * value) {if (GLeeInit()) glXQueryDrawable(dpy, draw, attribute, value);} + GLEEPFNGLXQUERYDRAWABLEPROC GLeeFuncPtr_glXQueryDrawable=GLee_Lazy_glXQueryDrawable; +#endif +#ifndef GLEE_C_DEFINED_glXCreateNewContext +#define GLEE_C_DEFINED_glXCreateNewContext + GLXContext __stdcall GLee_Lazy_glXCreateNewContext(Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct) {if (GLeeInit()) return glXCreateNewContext(dpy, config, render_type, share_list, direct); return (GLXContext)0;} + GLEEPFNGLXCREATENEWCONTEXTPROC GLeeFuncPtr_glXCreateNewContext=GLee_Lazy_glXCreateNewContext; +#endif +#ifndef GLEE_C_DEFINED_glXMakeContextCurrent +#define GLEE_C_DEFINED_glXMakeContextCurrent + Bool __stdcall GLee_Lazy_glXMakeContextCurrent(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) {if (GLeeInit()) return glXMakeContextCurrent(dpy, draw, read, ctx); return (Bool)0;} + GLEEPFNGLXMAKECONTEXTCURRENTPROC GLeeFuncPtr_glXMakeContextCurrent=GLee_Lazy_glXMakeContextCurrent; +#endif +#ifndef GLEE_C_DEFINED_glXGetCurrentReadDrawable +#define GLEE_C_DEFINED_glXGetCurrentReadDrawable + GLXDrawable __stdcall GLee_Lazy_glXGetCurrentReadDrawable(void) {if (GLeeInit()) return glXGetCurrentReadDrawable(); return (GLXDrawable)0;} + GLEEPFNGLXGETCURRENTREADDRAWABLEPROC GLeeFuncPtr_glXGetCurrentReadDrawable=GLee_Lazy_glXGetCurrentReadDrawable; +#endif +#ifndef GLEE_C_DEFINED_glXGetCurrentDisplay +#define GLEE_C_DEFINED_glXGetCurrentDisplay + Display * __stdcall GLee_Lazy_glXGetCurrentDisplay(void) {if (GLeeInit()) return glXGetCurrentDisplay(); return (Display *)0;} + GLEEPFNGLXGETCURRENTDISPLAYPROC GLeeFuncPtr_glXGetCurrentDisplay=GLee_Lazy_glXGetCurrentDisplay; +#endif +#ifndef GLEE_C_DEFINED_glXQueryContext +#define GLEE_C_DEFINED_glXQueryContext + int __stdcall GLee_Lazy_glXQueryContext(Display * dpy, GLXContext ctx, int attribute, int * value) {if (GLeeInit()) return glXQueryContext(dpy, ctx, attribute, value); return (int)0;} + GLEEPFNGLXQUERYCONTEXTPROC GLeeFuncPtr_glXQueryContext=GLee_Lazy_glXQueryContext; +#endif +#ifndef GLEE_C_DEFINED_glXSelectEvent +#define GLEE_C_DEFINED_glXSelectEvent + void __stdcall GLee_Lazy_glXSelectEvent(Display * dpy, GLXDrawable draw, unsigned long event_mask) {if (GLeeInit()) glXSelectEvent(dpy, draw, event_mask);} + GLEEPFNGLXSELECTEVENTPROC GLeeFuncPtr_glXSelectEvent=GLee_Lazy_glXSelectEvent; +#endif +#ifndef GLEE_C_DEFINED_glXGetSelectedEvent +#define GLEE_C_DEFINED_glXGetSelectedEvent + void __stdcall GLee_Lazy_glXGetSelectedEvent(Display * dpy, GLXDrawable draw, unsigned long * event_mask) {if (GLeeInit()) glXGetSelectedEvent(dpy, draw, event_mask);} + GLEEPFNGLXGETSELECTEDEVENTPROC GLeeFuncPtr_glXGetSelectedEvent=GLee_Lazy_glXGetSelectedEvent; +#endif +#endif + +/* GLX_VERSION_1_4 */ + +#ifdef __GLEE_GLX_VERSION_1_4 +#ifndef GLEE_C_DEFINED_glXGetProcAddress +#define GLEE_C_DEFINED_glXGetProcAddress + __GLXextFuncPtr __stdcall GLee_Lazy_glXGetProcAddress(const GLubyte * procName) {if (GLeeInit()) return glXGetProcAddress(procName); return (__GLXextFuncPtr)0;} + GLEEPFNGLXGETPROCADDRESSPROC GLeeFuncPtr_glXGetProcAddress=GLee_Lazy_glXGetProcAddress; +#endif +#endif + +/* GLX_ARB_multisample */ + +#ifdef __GLEE_GLX_ARB_multisample +#endif + +/* GLX_ARB_fbconfig_float */ + +#ifdef __GLEE_GLX_ARB_fbconfig_float +#endif + +/* GLX_ARB_create_context */ + +#ifdef __GLEE_GLX_ARB_create_context +#ifndef GLEE_C_DEFINED_glXCreateContextAttribsARB +#define GLEE_C_DEFINED_glXCreateContextAttribsARB + GLXContext __stdcall GLee_Lazy_glXCreateContextAttribsARB(Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list) {if (GLeeInit()) return glXCreateContextAttribsARB(dpy, config, share_context, direct, attrib_list); return (GLXContext)0;} + GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_glXCreateContextAttribsARB=GLee_Lazy_glXCreateContextAttribsARB; +#endif +#endif + +/* GLX_SGIS_multisample */ + +#ifdef __GLEE_GLX_SGIS_multisample +#endif + +/* GLX_EXT_visual_info */ + +#ifdef __GLEE_GLX_EXT_visual_info +#endif + +/* GLX_SGI_swap_control */ + +#ifdef __GLEE_GLX_SGI_swap_control +#ifndef GLEE_C_DEFINED_glXSwapIntervalSGI +#define GLEE_C_DEFINED_glXSwapIntervalSGI + int __stdcall GLee_Lazy_glXSwapIntervalSGI(int interval) {if (GLeeInit()) return glXSwapIntervalSGI(interval); return (int)0;} + GLEEPFNGLXSWAPINTERVALSGIPROC GLeeFuncPtr_glXSwapIntervalSGI=GLee_Lazy_glXSwapIntervalSGI; +#endif +#endif + +/* GLX_SGI_video_sync */ + +#ifdef __GLEE_GLX_SGI_video_sync +#ifndef GLEE_C_DEFINED_glXGetVideoSyncSGI +#define GLEE_C_DEFINED_glXGetVideoSyncSGI + int __stdcall GLee_Lazy_glXGetVideoSyncSGI(unsigned int * count) {if (GLeeInit()) return glXGetVideoSyncSGI(count); return (int)0;} + GLEEPFNGLXGETVIDEOSYNCSGIPROC GLeeFuncPtr_glXGetVideoSyncSGI=GLee_Lazy_glXGetVideoSyncSGI; +#endif +#ifndef GLEE_C_DEFINED_glXWaitVideoSyncSGI +#define GLEE_C_DEFINED_glXWaitVideoSyncSGI + int __stdcall GLee_Lazy_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int * count) {if (GLeeInit()) return glXWaitVideoSyncSGI(divisor, remainder, count); return (int)0;} + GLEEPFNGLXWAITVIDEOSYNCSGIPROC GLeeFuncPtr_glXWaitVideoSyncSGI=GLee_Lazy_glXWaitVideoSyncSGI; +#endif +#endif + +/* GLX_SGI_make_current_read */ + +#ifdef __GLEE_GLX_SGI_make_current_read +#ifndef GLEE_C_DEFINED_glXMakeCurrentReadSGI +#define GLEE_C_DEFINED_glXMakeCurrentReadSGI + Bool __stdcall GLee_Lazy_glXMakeCurrentReadSGI(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) {if (GLeeInit()) return glXMakeCurrentReadSGI(dpy, draw, read, ctx); return (Bool)0;} + GLEEPFNGLXMAKECURRENTREADSGIPROC GLeeFuncPtr_glXMakeCurrentReadSGI=GLee_Lazy_glXMakeCurrentReadSGI; +#endif +#ifndef GLEE_C_DEFINED_glXGetCurrentReadDrawableSGI +#define GLEE_C_DEFINED_glXGetCurrentReadDrawableSGI + GLXDrawable __stdcall GLee_Lazy_glXGetCurrentReadDrawableSGI(void) {if (GLeeInit()) return glXGetCurrentReadDrawableSGI(); return (GLXDrawable)0;} + GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC GLeeFuncPtr_glXGetCurrentReadDrawableSGI=GLee_Lazy_glXGetCurrentReadDrawableSGI; +#endif +#endif + +/* GLX_EXT_visual_rating */ + +#ifdef __GLEE_GLX_EXT_visual_rating +#endif + +/* GLX_EXT_import_context */ + +#ifdef __GLEE_GLX_EXT_import_context +#ifndef GLEE_C_DEFINED_glXGetCurrentDisplayEXT +#define GLEE_C_DEFINED_glXGetCurrentDisplayEXT + Display * __stdcall GLee_Lazy_glXGetCurrentDisplayEXT(void) {if (GLeeInit()) return glXGetCurrentDisplayEXT(); return (Display *)0;} + GLEEPFNGLXGETCURRENTDISPLAYEXTPROC GLeeFuncPtr_glXGetCurrentDisplayEXT=GLee_Lazy_glXGetCurrentDisplayEXT; +#endif +#ifndef GLEE_C_DEFINED_glXQueryContextInfoEXT +#define GLEE_C_DEFINED_glXQueryContextInfoEXT + int __stdcall GLee_Lazy_glXQueryContextInfoEXT(Display * dpy, GLXContext context, int attribute, int * value) {if (GLeeInit()) return glXQueryContextInfoEXT(dpy, context, attribute, value); return (int)0;} + GLEEPFNGLXQUERYCONTEXTINFOEXTPROC GLeeFuncPtr_glXQueryContextInfoEXT=GLee_Lazy_glXQueryContextInfoEXT; +#endif +#ifndef GLEE_C_DEFINED_glXGetContextIDEXT +#define GLEE_C_DEFINED_glXGetContextIDEXT + GLXContextID __stdcall GLee_Lazy_glXGetContextIDEXT(const GLXContext context) {if (GLeeInit()) return glXGetContextIDEXT(context); return (GLXContextID)0;} + GLEEPFNGLXGETCONTEXTIDEXTPROC GLeeFuncPtr_glXGetContextIDEXT=GLee_Lazy_glXGetContextIDEXT; +#endif +#ifndef GLEE_C_DEFINED_glXImportContextEXT +#define GLEE_C_DEFINED_glXImportContextEXT + GLXContext __stdcall GLee_Lazy_glXImportContextEXT(Display * dpy, GLXContextID contextID) {if (GLeeInit()) return glXImportContextEXT(dpy, contextID); return (GLXContext)0;} + GLEEPFNGLXIMPORTCONTEXTEXTPROC GLeeFuncPtr_glXImportContextEXT=GLee_Lazy_glXImportContextEXT; +#endif +#ifndef GLEE_C_DEFINED_glXFreeContextEXT +#define GLEE_C_DEFINED_glXFreeContextEXT + void __stdcall GLee_Lazy_glXFreeContextEXT(Display * dpy, GLXContext context) {if (GLeeInit()) glXFreeContextEXT(dpy, context);} + GLEEPFNGLXFREECONTEXTEXTPROC GLeeFuncPtr_glXFreeContextEXT=GLee_Lazy_glXFreeContextEXT; +#endif +#endif + +/* GLX_SGIX_fbconfig */ + +#ifdef __GLEE_GLX_SGIX_fbconfig +#ifndef GLEE_C_DEFINED_glXGetFBConfigAttribSGIX +#define GLEE_C_DEFINED_glXGetFBConfigAttribSGIX + int __stdcall GLee_Lazy_glXGetFBConfigAttribSGIX(Display * dpy, GLXFBConfigSGIX config, int attribute, int * value) {if (GLeeInit()) return glXGetFBConfigAttribSGIX(dpy, config, attribute, value); return (int)0;} + GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC GLeeFuncPtr_glXGetFBConfigAttribSGIX=GLee_Lazy_glXGetFBConfigAttribSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXChooseFBConfigSGIX +#define GLEE_C_DEFINED_glXChooseFBConfigSGIX + GLXFBConfigSGIX * __stdcall GLee_Lazy_glXChooseFBConfigSGIX(Display * dpy, int screen, int * attrib_list, int * nelements) {if (GLeeInit()) return glXChooseFBConfigSGIX(dpy, screen, attrib_list, nelements); return (GLXFBConfigSGIX *)0;} + GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC GLeeFuncPtr_glXChooseFBConfigSGIX=GLee_Lazy_glXChooseFBConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXCreateGLXPixmapWithConfigSGIX +#define GLEE_C_DEFINED_glXCreateGLXPixmapWithConfigSGIX + GLXPixmap __stdcall GLee_Lazy_glXCreateGLXPixmapWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap) {if (GLeeInit()) return glXCreateGLXPixmapWithConfigSGIX(dpy, config, pixmap); return (GLXPixmap)0;} + GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX=GLee_Lazy_glXCreateGLXPixmapWithConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXCreateContextWithConfigSGIX +#define GLEE_C_DEFINED_glXCreateContextWithConfigSGIX + GLXContext __stdcall GLee_Lazy_glXCreateContextWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct) {if (GLeeInit()) return glXCreateContextWithConfigSGIX(dpy, config, render_type, share_list, direct); return (GLXContext)0;} + GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateContextWithConfigSGIX=GLee_Lazy_glXCreateContextWithConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXGetVisualFromFBConfigSGIX +#define GLEE_C_DEFINED_glXGetVisualFromFBConfigSGIX + XVisualInfo * __stdcall GLee_Lazy_glXGetVisualFromFBConfigSGIX(Display * dpy, GLXFBConfigSGIX config) {if (GLeeInit()) return glXGetVisualFromFBConfigSGIX(dpy, config); return (XVisualInfo *)0;} + GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLeeFuncPtr_glXGetVisualFromFBConfigSGIX=GLee_Lazy_glXGetVisualFromFBConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXGetFBConfigFromVisualSGIX +#define GLEE_C_DEFINED_glXGetFBConfigFromVisualSGIX + GLXFBConfigSGIX __stdcall GLee_Lazy_glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis) {if (GLeeInit()) return glXGetFBConfigFromVisualSGIX(dpy, vis); return (GLXFBConfigSGIX)0;} + GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLeeFuncPtr_glXGetFBConfigFromVisualSGIX=GLee_Lazy_glXGetFBConfigFromVisualSGIX; +#endif +#endif + +/* GLX_SGIX_pbuffer */ + +#ifdef __GLEE_GLX_SGIX_pbuffer +#ifndef GLEE_C_DEFINED_glXCreateGLXPbufferSGIX +#define GLEE_C_DEFINED_glXCreateGLXPbufferSGIX + GLXPbufferSGIX __stdcall GLee_Lazy_glXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list) {if (GLeeInit()) return glXCreateGLXPbufferSGIX(dpy, config, width, height, attrib_list); return (GLXPbufferSGIX)0;} + GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC GLeeFuncPtr_glXCreateGLXPbufferSGIX=GLee_Lazy_glXCreateGLXPbufferSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXDestroyGLXPbufferSGIX +#define GLEE_C_DEFINED_glXDestroyGLXPbufferSGIX + void __stdcall GLee_Lazy_glXDestroyGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX pbuf) {if (GLeeInit()) glXDestroyGLXPbufferSGIX(dpy, pbuf);} + GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXDestroyGLXPbufferSGIX=GLee_Lazy_glXDestroyGLXPbufferSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryGLXPbufferSGIX +#define GLEE_C_DEFINED_glXQueryGLXPbufferSGIX + int __stdcall GLee_Lazy_glXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value) {if (GLeeInit()) return glXQueryGLXPbufferSGIX(dpy, pbuf, attribute, value); return (int)0;} + GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXQueryGLXPbufferSGIX=GLee_Lazy_glXQueryGLXPbufferSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXSelectEventSGIX +#define GLEE_C_DEFINED_glXSelectEventSGIX + void __stdcall GLee_Lazy_glXSelectEventSGIX(Display * dpy, GLXDrawable drawable, unsigned long mask) {if (GLeeInit()) glXSelectEventSGIX(dpy, drawable, mask);} + GLEEPFNGLXSELECTEVENTSGIXPROC GLeeFuncPtr_glXSelectEventSGIX=GLee_Lazy_glXSelectEventSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXGetSelectedEventSGIX +#define GLEE_C_DEFINED_glXGetSelectedEventSGIX + void __stdcall GLee_Lazy_glXGetSelectedEventSGIX(Display * dpy, GLXDrawable drawable, unsigned long * mask) {if (GLeeInit()) glXGetSelectedEventSGIX(dpy, drawable, mask);} + GLEEPFNGLXGETSELECTEDEVENTSGIXPROC GLeeFuncPtr_glXGetSelectedEventSGIX=GLee_Lazy_glXGetSelectedEventSGIX; +#endif +#endif + +/* GLX_SGI_cushion */ + +#ifdef __GLEE_GLX_SGI_cushion +#ifndef GLEE_C_DEFINED_glXCushionSGI +#define GLEE_C_DEFINED_glXCushionSGI + void __stdcall GLee_Lazy_glXCushionSGI(Display * dpy, Window window, float cushion) {if (GLeeInit()) glXCushionSGI(dpy, window, cushion);} + GLEEPFNGLXCUSHIONSGIPROC GLeeFuncPtr_glXCushionSGI=GLee_Lazy_glXCushionSGI; +#endif +#endif + +/* GLX_SGIX_video_resize */ + +#ifdef __GLEE_GLX_SGIX_video_resize +#ifndef GLEE_C_DEFINED_glXBindChannelToWindowSGIX +#define GLEE_C_DEFINED_glXBindChannelToWindowSGIX + int __stdcall GLee_Lazy_glXBindChannelToWindowSGIX(Display * display, int screen, int channel, Window window) {if (GLeeInit()) return glXBindChannelToWindowSGIX(display, screen, channel, window); return (int)0;} + GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC GLeeFuncPtr_glXBindChannelToWindowSGIX=GLee_Lazy_glXBindChannelToWindowSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXChannelRectSGIX +#define GLEE_C_DEFINED_glXChannelRectSGIX + int __stdcall GLee_Lazy_glXChannelRectSGIX(Display * display, int screen, int channel, int x, int y, int w, int h) {if (GLeeInit()) return glXChannelRectSGIX(display, screen, channel, x, y, w, h); return (int)0;} + GLEEPFNGLXCHANNELRECTSGIXPROC GLeeFuncPtr_glXChannelRectSGIX=GLee_Lazy_glXChannelRectSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryChannelRectSGIX +#define GLEE_C_DEFINED_glXQueryChannelRectSGIX + int __stdcall GLee_Lazy_glXQueryChannelRectSGIX(Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh) {if (GLeeInit()) return glXQueryChannelRectSGIX(display, screen, channel, dx, dy, dw, dh); return (int)0;} + GLEEPFNGLXQUERYCHANNELRECTSGIXPROC GLeeFuncPtr_glXQueryChannelRectSGIX=GLee_Lazy_glXQueryChannelRectSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryChannelDeltasSGIX +#define GLEE_C_DEFINED_glXQueryChannelDeltasSGIX + int __stdcall GLee_Lazy_glXQueryChannelDeltasSGIX(Display * display, int screen, int channel, int * x, int * y, int * w, int * h) {if (GLeeInit()) return glXQueryChannelDeltasSGIX(display, screen, channel, x, y, w, h); return (int)0;} + GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC GLeeFuncPtr_glXQueryChannelDeltasSGIX=GLee_Lazy_glXQueryChannelDeltasSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXChannelRectSyncSGIX +#define GLEE_C_DEFINED_glXChannelRectSyncSGIX + int __stdcall GLee_Lazy_glXChannelRectSyncSGIX(Display * display, int screen, int channel, GLenum synctype) {if (GLeeInit()) return glXChannelRectSyncSGIX(display, screen, channel, synctype); return (int)0;} + GLEEPFNGLXCHANNELRECTSYNCSGIXPROC GLeeFuncPtr_glXChannelRectSyncSGIX=GLee_Lazy_glXChannelRectSyncSGIX; +#endif +#endif + +/* GLX_SGIX_swap_group */ + +#ifdef __GLEE_GLX_SGIX_swap_group +#ifndef GLEE_C_DEFINED_glXJoinSwapGroupSGIX +#define GLEE_C_DEFINED_glXJoinSwapGroupSGIX + void __stdcall GLee_Lazy_glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable, GLXDrawable member) {if (GLeeInit()) glXJoinSwapGroupSGIX(dpy, drawable, member);} + GLEEPFNGLXJOINSWAPGROUPSGIXPROC GLeeFuncPtr_glXJoinSwapGroupSGIX=GLee_Lazy_glXJoinSwapGroupSGIX; +#endif +#endif + +/* GLX_SGIX_swap_barrier */ + +#ifdef __GLEE_GLX_SGIX_swap_barrier +#ifndef GLEE_C_DEFINED_glXBindSwapBarrierSGIX +#define GLEE_C_DEFINED_glXBindSwapBarrierSGIX + void __stdcall GLee_Lazy_glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier) {if (GLeeInit()) glXBindSwapBarrierSGIX(dpy, drawable, barrier);} + GLEEPFNGLXBINDSWAPBARRIERSGIXPROC GLeeFuncPtr_glXBindSwapBarrierSGIX=GLee_Lazy_glXBindSwapBarrierSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryMaxSwapBarriersSGIX +#define GLEE_C_DEFINED_glXQueryMaxSwapBarriersSGIX + Bool __stdcall GLee_Lazy_glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int * max) {if (GLeeInit()) return glXQueryMaxSwapBarriersSGIX(dpy, screen, max); return (Bool)0;} + GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX=GLee_Lazy_glXQueryMaxSwapBarriersSGIX; +#endif +#endif + +/* GLX_SGIS_blended_overlay */ + +#ifdef __GLEE_GLX_SGIS_blended_overlay +#endif + +/* GLX_SGIS_shared_multisample */ + +#ifdef __GLEE_GLX_SGIS_shared_multisample +#endif + +/* GLX_SUN_get_transparent_index */ + +#ifdef __GLEE_GLX_SUN_get_transparent_index +#ifndef GLEE_C_DEFINED_glXGetTransparentIndexSUN +#define GLEE_C_DEFINED_glXGetTransparentIndexSUN + Status __stdcall GLee_Lazy_glXGetTransparentIndexSUN(Display * dpy, Window overlay, Window underlay, long * pTransparentIndex) {if (GLeeInit()) return glXGetTransparentIndexSUN(dpy, overlay, underlay, pTransparentIndex); return (Status)0;} + GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC GLeeFuncPtr_glXGetTransparentIndexSUN=GLee_Lazy_glXGetTransparentIndexSUN; +#endif +#endif + +/* GLX_3DFX_multisample */ + +#ifdef __GLEE_GLX_3DFX_multisample +#endif + +/* GLX_MESA_copy_sub_buffer */ + +#ifdef __GLEE_GLX_MESA_copy_sub_buffer +#ifndef GLEE_C_DEFINED_glXCopySubBufferMESA +#define GLEE_C_DEFINED_glXCopySubBufferMESA + void __stdcall GLee_Lazy_glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable, int x, int y, int width, int height) {if (GLeeInit()) glXCopySubBufferMESA(dpy, drawable, x, y, width, height);} + GLEEPFNGLXCOPYSUBBUFFERMESAPROC GLeeFuncPtr_glXCopySubBufferMESA=GLee_Lazy_glXCopySubBufferMESA; +#endif +#endif + +/* GLX_MESA_pixmap_colormap */ + +#ifdef __GLEE_GLX_MESA_pixmap_colormap +#ifndef GLEE_C_DEFINED_glXCreateGLXPixmapMESA +#define GLEE_C_DEFINED_glXCreateGLXPixmapMESA + GLXPixmap __stdcall GLee_Lazy_glXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap) {if (GLeeInit()) return glXCreateGLXPixmapMESA(dpy, visual, pixmap, cmap); return (GLXPixmap)0;} + GLEEPFNGLXCREATEGLXPIXMAPMESAPROC GLeeFuncPtr_glXCreateGLXPixmapMESA=GLee_Lazy_glXCreateGLXPixmapMESA; +#endif +#endif + +/* GLX_MESA_release_buffers */ + +#ifdef __GLEE_GLX_MESA_release_buffers +#ifndef GLEE_C_DEFINED_glXReleaseBuffersMESA +#define GLEE_C_DEFINED_glXReleaseBuffersMESA + Bool __stdcall GLee_Lazy_glXReleaseBuffersMESA(Display * dpy, GLXDrawable drawable) {if (GLeeInit()) return glXReleaseBuffersMESA(dpy, drawable); return (Bool)0;} + GLEEPFNGLXRELEASEBUFFERSMESAPROC GLeeFuncPtr_glXReleaseBuffersMESA=GLee_Lazy_glXReleaseBuffersMESA; +#endif +#endif + +/* GLX_MESA_set_3dfx_mode */ + +#ifdef __GLEE_GLX_MESA_set_3dfx_mode +#ifndef GLEE_C_DEFINED_glXSet3DfxModeMESA +#define GLEE_C_DEFINED_glXSet3DfxModeMESA + Bool __stdcall GLee_Lazy_glXSet3DfxModeMESA(int mode) {if (GLeeInit()) return glXSet3DfxModeMESA(mode); return (Bool)0;} + GLEEPFNGLXSET3DFXMODEMESAPROC GLeeFuncPtr_glXSet3DfxModeMESA=GLee_Lazy_glXSet3DfxModeMESA; +#endif +#endif + +/* GLX_SGIX_visual_select_group */ + +#ifdef __GLEE_GLX_SGIX_visual_select_group +#endif + +/* GLX_OML_swap_method */ + +#ifdef __GLEE_GLX_OML_swap_method +#endif + +/* GLX_OML_sync_control */ + +#ifdef __GLEE_GLX_OML_sync_control +#ifndef GLEE_C_DEFINED_glXGetSyncValuesOML +#define GLEE_C_DEFINED_glXGetSyncValuesOML + Bool __stdcall GLee_Lazy_glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc) {if (GLeeInit()) return glXGetSyncValuesOML(dpy, drawable, ust, msc, sbc); return (Bool)0;} + GLEEPFNGLXGETSYNCVALUESOMLPROC GLeeFuncPtr_glXGetSyncValuesOML=GLee_Lazy_glXGetSyncValuesOML; +#endif +#ifndef GLEE_C_DEFINED_glXGetMscRateOML +#define GLEE_C_DEFINED_glXGetMscRateOML + Bool __stdcall GLee_Lazy_glXGetMscRateOML(Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator) {if (GLeeInit()) return glXGetMscRateOML(dpy, drawable, numerator, denominator); return (Bool)0;} + GLEEPFNGLXGETMSCRATEOMLPROC GLeeFuncPtr_glXGetMscRateOML=GLee_Lazy_glXGetMscRateOML; +#endif +#ifndef GLEE_C_DEFINED_glXSwapBuffersMscOML +#define GLEE_C_DEFINED_glXSwapBuffersMscOML + int64_t __stdcall GLee_Lazy_glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder) {if (GLeeInit()) return glXSwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder); return (int64_t)0;} + GLEEPFNGLXSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_glXSwapBuffersMscOML=GLee_Lazy_glXSwapBuffersMscOML; +#endif +#ifndef GLEE_C_DEFINED_glXWaitForMscOML +#define GLEE_C_DEFINED_glXWaitForMscOML + Bool __stdcall GLee_Lazy_glXWaitForMscOML(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * ust, int64_t * msc, int64_t * sbc) {if (GLeeInit()) return glXWaitForMscOML(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc); return (Bool)0;} + GLEEPFNGLXWAITFORMSCOMLPROC GLeeFuncPtr_glXWaitForMscOML=GLee_Lazy_glXWaitForMscOML; +#endif +#ifndef GLEE_C_DEFINED_glXWaitForSbcOML +#define GLEE_C_DEFINED_glXWaitForSbcOML + Bool __stdcall GLee_Lazy_glXWaitForSbcOML(Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc) {if (GLeeInit()) return glXWaitForSbcOML(dpy, drawable, target_sbc, ust, msc, sbc); return (Bool)0;} + GLEEPFNGLXWAITFORSBCOMLPROC GLeeFuncPtr_glXWaitForSbcOML=GLee_Lazy_glXWaitForSbcOML; +#endif +#endif + +/* GLX_NV_float_buffer */ + +#ifdef __GLEE_GLX_NV_float_buffer +#endif + +/* GLX_SGIX_hyperpipe */ + +#ifdef __GLEE_GLX_SGIX_hyperpipe +#ifndef GLEE_C_DEFINED_glXQueryHyperpipeNetworkSGIX +#define GLEE_C_DEFINED_glXQueryHyperpipeNetworkSGIX + GLXHyperpipeNetworkSGIX * __stdcall GLee_Lazy_glXQueryHyperpipeNetworkSGIX(Display * dpy, int * npipes) {if (GLeeInit()) return glXQueryHyperpipeNetworkSGIX(dpy, npipes); return (GLXHyperpipeNetworkSGIX *)0;} + GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX=GLee_Lazy_glXQueryHyperpipeNetworkSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXHyperpipeConfigSGIX +#define GLEE_C_DEFINED_glXHyperpipeConfigSGIX + int __stdcall GLee_Lazy_glXHyperpipeConfigSGIX(Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId) {if (GLeeInit()) return glXHyperpipeConfigSGIX(dpy, networkId, npipes, cfg, hpId); return (int)0;} + GLEEPFNGLXHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXHyperpipeConfigSGIX=GLee_Lazy_glXHyperpipeConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryHyperpipeConfigSGIX +#define GLEE_C_DEFINED_glXQueryHyperpipeConfigSGIX + GLXHyperpipeConfigSGIX * __stdcall GLee_Lazy_glXQueryHyperpipeConfigSGIX(Display * dpy, int hpId, int * npipes) {if (GLeeInit()) return glXQueryHyperpipeConfigSGIX(dpy, hpId, npipes); return (GLXHyperpipeConfigSGIX *)0;} + GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXQueryHyperpipeConfigSGIX=GLee_Lazy_glXQueryHyperpipeConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXDestroyHyperpipeConfigSGIX +#define GLEE_C_DEFINED_glXDestroyHyperpipeConfigSGIX + int __stdcall GLee_Lazy_glXDestroyHyperpipeConfigSGIX(Display * dpy, int hpId) {if (GLeeInit()) return glXDestroyHyperpipeConfigSGIX(dpy, hpId); return (int)0;} + GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX=GLee_Lazy_glXDestroyHyperpipeConfigSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXBindHyperpipeSGIX +#define GLEE_C_DEFINED_glXBindHyperpipeSGIX + int __stdcall GLee_Lazy_glXBindHyperpipeSGIX(Display * dpy, int hpId) {if (GLeeInit()) return glXBindHyperpipeSGIX(dpy, hpId); return (int)0;} + GLEEPFNGLXBINDHYPERPIPESGIXPROC GLeeFuncPtr_glXBindHyperpipeSGIX=GLee_Lazy_glXBindHyperpipeSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryHyperpipeBestAttribSGIX +#define GLEE_C_DEFINED_glXQueryHyperpipeBestAttribSGIX + int __stdcall GLee_Lazy_glXQueryHyperpipeBestAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList) {if (GLeeInit()) return glXQueryHyperpipeBestAttribSGIX(dpy, timeSlice, attrib, size, attribList, returnAttribList); return (int)0;} + GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX=GLee_Lazy_glXQueryHyperpipeBestAttribSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXHyperpipeAttribSGIX +#define GLEE_C_DEFINED_glXHyperpipeAttribSGIX + int __stdcall GLee_Lazy_glXHyperpipeAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * attribList) {if (GLeeInit()) return glXHyperpipeAttribSGIX(dpy, timeSlice, attrib, size, attribList); return (int)0;} + GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXHyperpipeAttribSGIX=GLee_Lazy_glXHyperpipeAttribSGIX; +#endif +#ifndef GLEE_C_DEFINED_glXQueryHyperpipeAttribSGIX +#define GLEE_C_DEFINED_glXQueryHyperpipeAttribSGIX + int __stdcall GLee_Lazy_glXQueryHyperpipeAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList) {if (GLeeInit()) return glXQueryHyperpipeAttribSGIX(dpy, timeSlice, attrib, size, returnAttribList); return (int)0;} + GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeAttribSGIX=GLee_Lazy_glXQueryHyperpipeAttribSGIX; +#endif +#endif + +/* GLX_MESA_agp_offset */ + +#ifdef __GLEE_GLX_MESA_agp_offset +#ifndef GLEE_C_DEFINED_glXGetAGPOffsetMESA +#define GLEE_C_DEFINED_glXGetAGPOffsetMESA + unsigned int __stdcall GLee_Lazy_glXGetAGPOffsetMESA(const void * pointer) {if (GLeeInit()) return glXGetAGPOffsetMESA(pointer); return (unsigned int)0;} + GLEEPFNGLXGETAGPOFFSETMESAPROC GLeeFuncPtr_glXGetAGPOffsetMESA=GLee_Lazy_glXGetAGPOffsetMESA; +#endif +#endif + +/* GLX_EXT_fbconfig_packed_float */ + +#ifdef __GLEE_GLX_EXT_fbconfig_packed_float +#endif + +/* GLX_EXT_framebuffer_sRGB */ + +#ifdef __GLEE_GLX_EXT_framebuffer_sRGB +#endif + +/* GLX_EXT_texture_from_pixmap */ + +#ifdef __GLEE_GLX_EXT_texture_from_pixmap +#ifndef GLEE_C_DEFINED_glXBindTexImageEXT +#define GLEE_C_DEFINED_glXBindTexImageEXT + void __stdcall GLee_Lazy_glXBindTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list) {if (GLeeInit()) glXBindTexImageEXT(dpy, drawable, buffer, attrib_list);} + GLEEPFNGLXBINDTEXIMAGEEXTPROC GLeeFuncPtr_glXBindTexImageEXT=GLee_Lazy_glXBindTexImageEXT; +#endif +#ifndef GLEE_C_DEFINED_glXReleaseTexImageEXT +#define GLEE_C_DEFINED_glXReleaseTexImageEXT + void __stdcall GLee_Lazy_glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer) {if (GLeeInit()) glXReleaseTexImageEXT(dpy, drawable, buffer);} + GLEEPFNGLXRELEASETEXIMAGEEXTPROC GLeeFuncPtr_glXReleaseTexImageEXT=GLee_Lazy_glXReleaseTexImageEXT; +#endif +#endif + +/* GLX_NV_present_video */ + +#ifdef __GLEE_GLX_NV_present_video +#endif + +/* GLX_NV_video_out */ + +#ifdef __GLEE_GLX_NV_video_out +#endif + +/* GLX_NV_swap_group */ + +#ifdef __GLEE_GLX_NV_swap_group +#endif + +/* GLX_EXT_scene_marker */ + +#ifdef __GLEE_GLX_EXT_scene_marker +#endif + +/* GLX_NV_video_output */ + +#ifdef __GLEE_GLX_NV_video_output +#ifndef GLEE_C_DEFINED_glXGetVideoDeviceNV +#define GLEE_C_DEFINED_glXGetVideoDeviceNV + int __stdcall GLee_Lazy_glXGetVideoDeviceNV(Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice) {if (GLeeInit()) return glXGetVideoDeviceNV(dpy, screen, numVideoDevices, pVideoDevice); return (int)0;} + GLEEPFNGLXGETVIDEODEVICENVPROC GLeeFuncPtr_glXGetVideoDeviceNV=GLee_Lazy_glXGetVideoDeviceNV; +#endif +#ifndef GLEE_C_DEFINED_glXReleaseVideoDeviceNV +#define GLEE_C_DEFINED_glXReleaseVideoDeviceNV + int __stdcall GLee_Lazy_glXReleaseVideoDeviceNV(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice) {if (GLeeInit()) return glXReleaseVideoDeviceNV(dpy, screen, VideoDevice); return (int)0;} + GLEEPFNGLXRELEASEVIDEODEVICENVPROC GLeeFuncPtr_glXReleaseVideoDeviceNV=GLee_Lazy_glXReleaseVideoDeviceNV; +#endif +#ifndef GLEE_C_DEFINED_glXBindVideoImageNV +#define GLEE_C_DEFINED_glXBindVideoImageNV + int __stdcall GLee_Lazy_glXBindVideoImageNV(Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer) {if (GLeeInit()) return glXBindVideoImageNV(dpy, VideoDevice, pbuf, iVideoBuffer); return (int)0;} + GLEEPFNGLXBINDVIDEOIMAGENVPROC GLeeFuncPtr_glXBindVideoImageNV=GLee_Lazy_glXBindVideoImageNV; +#endif +#ifndef GLEE_C_DEFINED_glXReleaseVideoImageNV +#define GLEE_C_DEFINED_glXReleaseVideoImageNV + int __stdcall GLee_Lazy_glXReleaseVideoImageNV(Display * dpy, GLXPbuffer pbuf) {if (GLeeInit()) return glXReleaseVideoImageNV(dpy, pbuf); return (int)0;} + GLEEPFNGLXRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_glXReleaseVideoImageNV=GLee_Lazy_glXReleaseVideoImageNV; +#endif +#ifndef GLEE_C_DEFINED_glXSendPbufferToVideoNV +#define GLEE_C_DEFINED_glXSendPbufferToVideoNV + int __stdcall GLee_Lazy_glXSendPbufferToVideoNV(Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock) {if (GLeeInit()) return glXSendPbufferToVideoNV(dpy, pbuf, iBufferType, pulCounterPbuffer, bBlock); return (int)0;} + GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_glXSendPbufferToVideoNV=GLee_Lazy_glXSendPbufferToVideoNV; +#endif +#ifndef GLEE_C_DEFINED_glXGetVideoInfoNV +#define GLEE_C_DEFINED_glXGetVideoInfoNV + int __stdcall GLee_Lazy_glXGetVideoInfoNV(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo) {if (GLeeInit()) return glXGetVideoInfoNV(dpy, screen, VideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo); return (int)0;} + GLEEPFNGLXGETVIDEOINFONVPROC GLeeFuncPtr_glXGetVideoInfoNV=GLee_Lazy_glXGetVideoInfoNV; +#endif +#endif +#endif /* end GLX */ +/***************************************************************** +* Extension link functions +*****************************************************************/ + +GLuint __GLeeLink_GL_VERSION_1_2(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_1_2 + if ((GLeeFuncPtr_glBlendColor = (GLEEPFNGLBLENDCOLORPROC) __GLeeGetProcAddress("glBlendColor"))!=0) nLinked++; + if ((GLeeFuncPtr_glBlendEquation = (GLEEPFNGLBLENDEQUATIONPROC) __GLeeGetProcAddress("glBlendEquation"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawRangeElements = (GLEEPFNGLDRAWRANGEELEMENTSPROC) __GLeeGetProcAddress("glDrawRangeElements"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorTable = (GLEEPFNGLCOLORTABLEPROC) __GLeeGetProcAddress("glColorTable"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorTableParameterfv = (GLEEPFNGLCOLORTABLEPARAMETERFVPROC) __GLeeGetProcAddress("glColorTableParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorTableParameteriv = (GLEEPFNGLCOLORTABLEPARAMETERIVPROC) __GLeeGetProcAddress("glColorTableParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyColorTable = (GLEEPFNGLCOPYCOLORTABLEPROC) __GLeeGetProcAddress("glCopyColorTable"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTable = (GLEEPFNGLGETCOLORTABLEPROC) __GLeeGetProcAddress("glGetColorTable"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableParameterfv = (GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC) __GLeeGetProcAddress("glGetColorTableParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableParameteriv = (GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC) __GLeeGetProcAddress("glGetColorTableParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorSubTable = (GLEEPFNGLCOLORSUBTABLEPROC) __GLeeGetProcAddress("glColorSubTable"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyColorSubTable = (GLEEPFNGLCOPYCOLORSUBTABLEPROC) __GLeeGetProcAddress("glCopyColorSubTable"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionFilter1D = (GLEEPFNGLCONVOLUTIONFILTER1DPROC) __GLeeGetProcAddress("glConvolutionFilter1D"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionFilter2D = (GLEEPFNGLCONVOLUTIONFILTER2DPROC) __GLeeGetProcAddress("glConvolutionFilter2D"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameterf = (GLEEPFNGLCONVOLUTIONPARAMETERFPROC) __GLeeGetProcAddress("glConvolutionParameterf"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameterfv = (GLEEPFNGLCONVOLUTIONPARAMETERFVPROC) __GLeeGetProcAddress("glConvolutionParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameteri = (GLEEPFNGLCONVOLUTIONPARAMETERIPROC) __GLeeGetProcAddress("glConvolutionParameteri"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameteriv = (GLEEPFNGLCONVOLUTIONPARAMETERIVPROC) __GLeeGetProcAddress("glConvolutionParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyConvolutionFilter1D = (GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC) __GLeeGetProcAddress("glCopyConvolutionFilter1D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyConvolutionFilter2D = (GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC) __GLeeGetProcAddress("glCopyConvolutionFilter2D"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetConvolutionFilter = (GLEEPFNGLGETCONVOLUTIONFILTERPROC) __GLeeGetProcAddress("glGetConvolutionFilter"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetConvolutionParameterfv = (GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC) __GLeeGetProcAddress("glGetConvolutionParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetConvolutionParameteriv = (GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC) __GLeeGetProcAddress("glGetConvolutionParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetSeparableFilter = (GLEEPFNGLGETSEPARABLEFILTERPROC) __GLeeGetProcAddress("glGetSeparableFilter"))!=0) nLinked++; + if ((GLeeFuncPtr_glSeparableFilter2D = (GLEEPFNGLSEPARABLEFILTER2DPROC) __GLeeGetProcAddress("glSeparableFilter2D"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetHistogram = (GLEEPFNGLGETHISTOGRAMPROC) __GLeeGetProcAddress("glGetHistogram"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetHistogramParameterfv = (GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC) __GLeeGetProcAddress("glGetHistogramParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetHistogramParameteriv = (GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC) __GLeeGetProcAddress("glGetHistogramParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMinmax = (GLEEPFNGLGETMINMAXPROC) __GLeeGetProcAddress("glGetMinmax"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMinmaxParameterfv = (GLEEPFNGLGETMINMAXPARAMETERFVPROC) __GLeeGetProcAddress("glGetMinmaxParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMinmaxParameteriv = (GLEEPFNGLGETMINMAXPARAMETERIVPROC) __GLeeGetProcAddress("glGetMinmaxParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glHistogram = (GLEEPFNGLHISTOGRAMPROC) __GLeeGetProcAddress("glHistogram"))!=0) nLinked++; + if ((GLeeFuncPtr_glMinmax = (GLEEPFNGLMINMAXPROC) __GLeeGetProcAddress("glMinmax"))!=0) nLinked++; + if ((GLeeFuncPtr_glResetHistogram = (GLEEPFNGLRESETHISTOGRAMPROC) __GLeeGetProcAddress("glResetHistogram"))!=0) nLinked++; + if ((GLeeFuncPtr_glResetMinmax = (GLEEPFNGLRESETMINMAXPROC) __GLeeGetProcAddress("glResetMinmax"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexImage3D = (GLEEPFNGLTEXIMAGE3DPROC) __GLeeGetProcAddress("glTexImage3D"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexSubImage3D = (GLEEPFNGLTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glTexSubImage3D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTexSubImage3D = (GLEEPFNGLCOPYTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glCopyTexSubImage3D"))!=0) nLinked++; +#endif + if (nLinked==38) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_imaging(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_VERSION_1_3(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_1_3 + if ((GLeeFuncPtr_glActiveTexture = (GLEEPFNGLACTIVETEXTUREPROC) __GLeeGetProcAddress("glActiveTexture"))!=0) nLinked++; + if ((GLeeFuncPtr_glClientActiveTexture = (GLEEPFNGLCLIENTACTIVETEXTUREPROC) __GLeeGetProcAddress("glClientActiveTexture"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1d = (GLEEPFNGLMULTITEXCOORD1DPROC) __GLeeGetProcAddress("glMultiTexCoord1d"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1dv = (GLEEPFNGLMULTITEXCOORD1DVPROC) __GLeeGetProcAddress("glMultiTexCoord1dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1f = (GLEEPFNGLMULTITEXCOORD1FPROC) __GLeeGetProcAddress("glMultiTexCoord1f"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1fv = (GLEEPFNGLMULTITEXCOORD1FVPROC) __GLeeGetProcAddress("glMultiTexCoord1fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1i = (GLEEPFNGLMULTITEXCOORD1IPROC) __GLeeGetProcAddress("glMultiTexCoord1i"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1iv = (GLEEPFNGLMULTITEXCOORD1IVPROC) __GLeeGetProcAddress("glMultiTexCoord1iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1s = (GLEEPFNGLMULTITEXCOORD1SPROC) __GLeeGetProcAddress("glMultiTexCoord1s"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1sv = (GLEEPFNGLMULTITEXCOORD1SVPROC) __GLeeGetProcAddress("glMultiTexCoord1sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2d = (GLEEPFNGLMULTITEXCOORD2DPROC) __GLeeGetProcAddress("glMultiTexCoord2d"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2dv = (GLEEPFNGLMULTITEXCOORD2DVPROC) __GLeeGetProcAddress("glMultiTexCoord2dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2f = (GLEEPFNGLMULTITEXCOORD2FPROC) __GLeeGetProcAddress("glMultiTexCoord2f"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2fv = (GLEEPFNGLMULTITEXCOORD2FVPROC) __GLeeGetProcAddress("glMultiTexCoord2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2i = (GLEEPFNGLMULTITEXCOORD2IPROC) __GLeeGetProcAddress("glMultiTexCoord2i"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2iv = (GLEEPFNGLMULTITEXCOORD2IVPROC) __GLeeGetProcAddress("glMultiTexCoord2iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2s = (GLEEPFNGLMULTITEXCOORD2SPROC) __GLeeGetProcAddress("glMultiTexCoord2s"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2sv = (GLEEPFNGLMULTITEXCOORD2SVPROC) __GLeeGetProcAddress("glMultiTexCoord2sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3d = (GLEEPFNGLMULTITEXCOORD3DPROC) __GLeeGetProcAddress("glMultiTexCoord3d"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3dv = (GLEEPFNGLMULTITEXCOORD3DVPROC) __GLeeGetProcAddress("glMultiTexCoord3dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3f = (GLEEPFNGLMULTITEXCOORD3FPROC) __GLeeGetProcAddress("glMultiTexCoord3f"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3fv = (GLEEPFNGLMULTITEXCOORD3FVPROC) __GLeeGetProcAddress("glMultiTexCoord3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3i = (GLEEPFNGLMULTITEXCOORD3IPROC) __GLeeGetProcAddress("glMultiTexCoord3i"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3iv = (GLEEPFNGLMULTITEXCOORD3IVPROC) __GLeeGetProcAddress("glMultiTexCoord3iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3s = (GLEEPFNGLMULTITEXCOORD3SPROC) __GLeeGetProcAddress("glMultiTexCoord3s"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3sv = (GLEEPFNGLMULTITEXCOORD3SVPROC) __GLeeGetProcAddress("glMultiTexCoord3sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4d = (GLEEPFNGLMULTITEXCOORD4DPROC) __GLeeGetProcAddress("glMultiTexCoord4d"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4dv = (GLEEPFNGLMULTITEXCOORD4DVPROC) __GLeeGetProcAddress("glMultiTexCoord4dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4f = (GLEEPFNGLMULTITEXCOORD4FPROC) __GLeeGetProcAddress("glMultiTexCoord4f"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4fv = (GLEEPFNGLMULTITEXCOORD4FVPROC) __GLeeGetProcAddress("glMultiTexCoord4fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4i = (GLEEPFNGLMULTITEXCOORD4IPROC) __GLeeGetProcAddress("glMultiTexCoord4i"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4iv = (GLEEPFNGLMULTITEXCOORD4IVPROC) __GLeeGetProcAddress("glMultiTexCoord4iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4s = (GLEEPFNGLMULTITEXCOORD4SPROC) __GLeeGetProcAddress("glMultiTexCoord4s"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4sv = (GLEEPFNGLMULTITEXCOORD4SVPROC) __GLeeGetProcAddress("glMultiTexCoord4sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glLoadTransposeMatrixf = (GLEEPFNGLLOADTRANSPOSEMATRIXFPROC) __GLeeGetProcAddress("glLoadTransposeMatrixf"))!=0) nLinked++; + if ((GLeeFuncPtr_glLoadTransposeMatrixd = (GLEEPFNGLLOADTRANSPOSEMATRIXDPROC) __GLeeGetProcAddress("glLoadTransposeMatrixd"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultTransposeMatrixf = (GLEEPFNGLMULTTRANSPOSEMATRIXFPROC) __GLeeGetProcAddress("glMultTransposeMatrixf"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultTransposeMatrixd = (GLEEPFNGLMULTTRANSPOSEMATRIXDPROC) __GLeeGetProcAddress("glMultTransposeMatrixd"))!=0) nLinked++; + if ((GLeeFuncPtr_glSampleCoverage = (GLEEPFNGLSAMPLECOVERAGEPROC) __GLeeGetProcAddress("glSampleCoverage"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexImage3D = (GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC) __GLeeGetProcAddress("glCompressedTexImage3D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexImage2D = (GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC) __GLeeGetProcAddress("glCompressedTexImage2D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexImage1D = (GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC) __GLeeGetProcAddress("glCompressedTexImage1D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexSubImage3D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glCompressedTexSubImage3D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexSubImage2D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) __GLeeGetProcAddress("glCompressedTexSubImage2D"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexSubImage1D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) __GLeeGetProcAddress("glCompressedTexSubImage1D"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCompressedTexImage = (GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC) __GLeeGetProcAddress("glGetCompressedTexImage"))!=0) nLinked++; +#endif + if (nLinked==46) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_VERSION_1_4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_1_4 + if ((GLeeFuncPtr_glBlendFuncSeparate = (GLEEPFNGLBLENDFUNCSEPARATEPROC) __GLeeGetProcAddress("glBlendFuncSeparate"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordf = (GLEEPFNGLFOGCOORDFPROC) __GLeeGetProcAddress("glFogCoordf"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordfv = (GLEEPFNGLFOGCOORDFVPROC) __GLeeGetProcAddress("glFogCoordfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordd = (GLEEPFNGLFOGCOORDDPROC) __GLeeGetProcAddress("glFogCoordd"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoorddv = (GLEEPFNGLFOGCOORDDVPROC) __GLeeGetProcAddress("glFogCoorddv"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordPointer = (GLEEPFNGLFOGCOORDPOINTERPROC) __GLeeGetProcAddress("glFogCoordPointer"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiDrawArrays = (GLEEPFNGLMULTIDRAWARRAYSPROC) __GLeeGetProcAddress("glMultiDrawArrays"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiDrawElements = (GLEEPFNGLMULTIDRAWELEMENTSPROC) __GLeeGetProcAddress("glMultiDrawElements"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameterf = (GLEEPFNGLPOINTPARAMETERFPROC) __GLeeGetProcAddress("glPointParameterf"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameterfv = (GLEEPFNGLPOINTPARAMETERFVPROC) __GLeeGetProcAddress("glPointParameterfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameteri = (GLEEPFNGLPOINTPARAMETERIPROC) __GLeeGetProcAddress("glPointParameteri"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameteriv = (GLEEPFNGLPOINTPARAMETERIVPROC) __GLeeGetProcAddress("glPointParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3b = (GLEEPFNGLSECONDARYCOLOR3BPROC) __GLeeGetProcAddress("glSecondaryColor3b"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3bv = (GLEEPFNGLSECONDARYCOLOR3BVPROC) __GLeeGetProcAddress("glSecondaryColor3bv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3d = (GLEEPFNGLSECONDARYCOLOR3DPROC) __GLeeGetProcAddress("glSecondaryColor3d"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3dv = (GLEEPFNGLSECONDARYCOLOR3DVPROC) __GLeeGetProcAddress("glSecondaryColor3dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3f = (GLEEPFNGLSECONDARYCOLOR3FPROC) __GLeeGetProcAddress("glSecondaryColor3f"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3fv = (GLEEPFNGLSECONDARYCOLOR3FVPROC) __GLeeGetProcAddress("glSecondaryColor3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3i = (GLEEPFNGLSECONDARYCOLOR3IPROC) __GLeeGetProcAddress("glSecondaryColor3i"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3iv = (GLEEPFNGLSECONDARYCOLOR3IVPROC) __GLeeGetProcAddress("glSecondaryColor3iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3s = (GLEEPFNGLSECONDARYCOLOR3SPROC) __GLeeGetProcAddress("glSecondaryColor3s"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3sv = (GLEEPFNGLSECONDARYCOLOR3SVPROC) __GLeeGetProcAddress("glSecondaryColor3sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3ub = (GLEEPFNGLSECONDARYCOLOR3UBPROC) __GLeeGetProcAddress("glSecondaryColor3ub"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3ubv = (GLEEPFNGLSECONDARYCOLOR3UBVPROC) __GLeeGetProcAddress("glSecondaryColor3ubv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3ui = (GLEEPFNGLSECONDARYCOLOR3UIPROC) __GLeeGetProcAddress("glSecondaryColor3ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3uiv = (GLEEPFNGLSECONDARYCOLOR3UIVPROC) __GLeeGetProcAddress("glSecondaryColor3uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3us = (GLEEPFNGLSECONDARYCOLOR3USPROC) __GLeeGetProcAddress("glSecondaryColor3us"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3usv = (GLEEPFNGLSECONDARYCOLOR3USVPROC) __GLeeGetProcAddress("glSecondaryColor3usv"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColorPointer = (GLEEPFNGLSECONDARYCOLORPOINTERPROC) __GLeeGetProcAddress("glSecondaryColorPointer"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2d = (GLEEPFNGLWINDOWPOS2DPROC) __GLeeGetProcAddress("glWindowPos2d"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2dv = (GLEEPFNGLWINDOWPOS2DVPROC) __GLeeGetProcAddress("glWindowPos2dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2f = (GLEEPFNGLWINDOWPOS2FPROC) __GLeeGetProcAddress("glWindowPos2f"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2fv = (GLEEPFNGLWINDOWPOS2FVPROC) __GLeeGetProcAddress("glWindowPos2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2i = (GLEEPFNGLWINDOWPOS2IPROC) __GLeeGetProcAddress("glWindowPos2i"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2iv = (GLEEPFNGLWINDOWPOS2IVPROC) __GLeeGetProcAddress("glWindowPos2iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2s = (GLEEPFNGLWINDOWPOS2SPROC) __GLeeGetProcAddress("glWindowPos2s"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2sv = (GLEEPFNGLWINDOWPOS2SVPROC) __GLeeGetProcAddress("glWindowPos2sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3d = (GLEEPFNGLWINDOWPOS3DPROC) __GLeeGetProcAddress("glWindowPos3d"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3dv = (GLEEPFNGLWINDOWPOS3DVPROC) __GLeeGetProcAddress("glWindowPos3dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3f = (GLEEPFNGLWINDOWPOS3FPROC) __GLeeGetProcAddress("glWindowPos3f"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3fv = (GLEEPFNGLWINDOWPOS3FVPROC) __GLeeGetProcAddress("glWindowPos3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3i = (GLEEPFNGLWINDOWPOS3IPROC) __GLeeGetProcAddress("glWindowPos3i"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3iv = (GLEEPFNGLWINDOWPOS3IVPROC) __GLeeGetProcAddress("glWindowPos3iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3s = (GLEEPFNGLWINDOWPOS3SPROC) __GLeeGetProcAddress("glWindowPos3s"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3sv = (GLEEPFNGLWINDOWPOS3SVPROC) __GLeeGetProcAddress("glWindowPos3sv"))!=0) nLinked++; +#endif + if (nLinked==45) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_VERSION_1_5(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_1_5 + if ((GLeeFuncPtr_glGenQueries = (GLEEPFNGLGENQUERIESPROC) __GLeeGetProcAddress("glGenQueries"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteQueries = (GLEEPFNGLDELETEQUERIESPROC) __GLeeGetProcAddress("glDeleteQueries"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsQuery = (GLEEPFNGLISQUERYPROC) __GLeeGetProcAddress("glIsQuery"))!=0) nLinked++; + if ((GLeeFuncPtr_glBeginQuery = (GLEEPFNGLBEGINQUERYPROC) __GLeeGetProcAddress("glBeginQuery"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndQuery = (GLEEPFNGLENDQUERYPROC) __GLeeGetProcAddress("glEndQuery"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryiv = (GLEEPFNGLGETQUERYIVPROC) __GLeeGetProcAddress("glGetQueryiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryObjectiv = (GLEEPFNGLGETQUERYOBJECTIVPROC) __GLeeGetProcAddress("glGetQueryObjectiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryObjectuiv = (GLEEPFNGLGETQUERYOBJECTUIVPROC) __GLeeGetProcAddress("glGetQueryObjectuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBuffer = (GLEEPFNGLBINDBUFFERPROC) __GLeeGetProcAddress("glBindBuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteBuffers = (GLEEPFNGLDELETEBUFFERSPROC) __GLeeGetProcAddress("glDeleteBuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenBuffers = (GLEEPFNGLGENBUFFERSPROC) __GLeeGetProcAddress("glGenBuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsBuffer = (GLEEPFNGLISBUFFERPROC) __GLeeGetProcAddress("glIsBuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glBufferData = (GLEEPFNGLBUFFERDATAPROC) __GLeeGetProcAddress("glBufferData"))!=0) nLinked++; + if ((GLeeFuncPtr_glBufferSubData = (GLEEPFNGLBUFFERSUBDATAPROC) __GLeeGetProcAddress("glBufferSubData"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBufferSubData = (GLEEPFNGLGETBUFFERSUBDATAPROC) __GLeeGetProcAddress("glGetBufferSubData"))!=0) nLinked++; + if ((GLeeFuncPtr_glMapBuffer = (GLEEPFNGLMAPBUFFERPROC) __GLeeGetProcAddress("glMapBuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glUnmapBuffer = (GLEEPFNGLUNMAPBUFFERPROC) __GLeeGetProcAddress("glUnmapBuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBufferParameteriv = (GLEEPFNGLGETBUFFERPARAMETERIVPROC) __GLeeGetProcAddress("glGetBufferParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBufferPointerv = (GLEEPFNGLGETBUFFERPOINTERVPROC) __GLeeGetProcAddress("glGetBufferPointerv"))!=0) nLinked++; +#endif + if (nLinked==19) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_VERSION_2_0(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_2_0 + if ((GLeeFuncPtr_glBlendEquationSeparate = (GLEEPFNGLBLENDEQUATIONSEPARATEPROC) __GLeeGetProcAddress("glBlendEquationSeparate"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawBuffers = (GLEEPFNGLDRAWBUFFERSPROC) __GLeeGetProcAddress("glDrawBuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glStencilOpSeparate = (GLEEPFNGLSTENCILOPSEPARATEPROC) __GLeeGetProcAddress("glStencilOpSeparate"))!=0) nLinked++; + if ((GLeeFuncPtr_glStencilFuncSeparate = (GLEEPFNGLSTENCILFUNCSEPARATEPROC) __GLeeGetProcAddress("glStencilFuncSeparate"))!=0) nLinked++; + if ((GLeeFuncPtr_glStencilMaskSeparate = (GLEEPFNGLSTENCILMASKSEPARATEPROC) __GLeeGetProcAddress("glStencilMaskSeparate"))!=0) nLinked++; + if ((GLeeFuncPtr_glAttachShader = (GLEEPFNGLATTACHSHADERPROC) __GLeeGetProcAddress("glAttachShader"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindAttribLocation = (GLEEPFNGLBINDATTRIBLOCATIONPROC) __GLeeGetProcAddress("glBindAttribLocation"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompileShader = (GLEEPFNGLCOMPILESHADERPROC) __GLeeGetProcAddress("glCompileShader"))!=0) nLinked++; + if ((GLeeFuncPtr_glCreateProgram = (GLEEPFNGLCREATEPROGRAMPROC) __GLeeGetProcAddress("glCreateProgram"))!=0) nLinked++; + if ((GLeeFuncPtr_glCreateShader = (GLEEPFNGLCREATESHADERPROC) __GLeeGetProcAddress("glCreateShader"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteProgram = (GLEEPFNGLDELETEPROGRAMPROC) __GLeeGetProcAddress("glDeleteProgram"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteShader = (GLEEPFNGLDELETESHADERPROC) __GLeeGetProcAddress("glDeleteShader"))!=0) nLinked++; + if ((GLeeFuncPtr_glDetachShader = (GLEEPFNGLDETACHSHADERPROC) __GLeeGetProcAddress("glDetachShader"))!=0) nLinked++; + if ((GLeeFuncPtr_glDisableVertexAttribArray = (GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC) __GLeeGetProcAddress("glDisableVertexAttribArray"))!=0) nLinked++; + if ((GLeeFuncPtr_glEnableVertexAttribArray = (GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC) __GLeeGetProcAddress("glEnableVertexAttribArray"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetActiveAttrib = (GLEEPFNGLGETACTIVEATTRIBPROC) __GLeeGetProcAddress("glGetActiveAttrib"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetActiveUniform = (GLEEPFNGLGETACTIVEUNIFORMPROC) __GLeeGetProcAddress("glGetActiveUniform"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetAttachedShaders = (GLEEPFNGLGETATTACHEDSHADERSPROC) __GLeeGetProcAddress("glGetAttachedShaders"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetAttribLocation = (GLEEPFNGLGETATTRIBLOCATIONPROC) __GLeeGetProcAddress("glGetAttribLocation"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramiv = (GLEEPFNGLGETPROGRAMIVPROC) __GLeeGetProcAddress("glGetProgramiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramInfoLog = (GLEEPFNGLGETPROGRAMINFOLOGPROC) __GLeeGetProcAddress("glGetProgramInfoLog"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetShaderiv = (GLEEPFNGLGETSHADERIVPROC) __GLeeGetProcAddress("glGetShaderiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetShaderInfoLog = (GLEEPFNGLGETSHADERINFOLOGPROC) __GLeeGetProcAddress("glGetShaderInfoLog"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetShaderSource = (GLEEPFNGLGETSHADERSOURCEPROC) __GLeeGetProcAddress("glGetShaderSource"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformLocation = (GLEEPFNGLGETUNIFORMLOCATIONPROC) __GLeeGetProcAddress("glGetUniformLocation"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformfv = (GLEEPFNGLGETUNIFORMFVPROC) __GLeeGetProcAddress("glGetUniformfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformiv = (GLEEPFNGLGETUNIFORMIVPROC) __GLeeGetProcAddress("glGetUniformiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribdv = (GLEEPFNGLGETVERTEXATTRIBDVPROC) __GLeeGetProcAddress("glGetVertexAttribdv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribfv = (GLEEPFNGLGETVERTEXATTRIBFVPROC) __GLeeGetProcAddress("glGetVertexAttribfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribiv = (GLEEPFNGLGETVERTEXATTRIBIVPROC) __GLeeGetProcAddress("glGetVertexAttribiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribPointerv = (GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC) __GLeeGetProcAddress("glGetVertexAttribPointerv"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsProgram = (GLEEPFNGLISPROGRAMPROC) __GLeeGetProcAddress("glIsProgram"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsShader = (GLEEPFNGLISSHADERPROC) __GLeeGetProcAddress("glIsShader"))!=0) nLinked++; + if ((GLeeFuncPtr_glLinkProgram = (GLEEPFNGLLINKPROGRAMPROC) __GLeeGetProcAddress("glLinkProgram"))!=0) nLinked++; + if ((GLeeFuncPtr_glShaderSource = (GLEEPFNGLSHADERSOURCEPROC) __GLeeGetProcAddress("glShaderSource"))!=0) nLinked++; + if ((GLeeFuncPtr_glUseProgram = (GLEEPFNGLUSEPROGRAMPROC) __GLeeGetProcAddress("glUseProgram"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1f = (GLEEPFNGLUNIFORM1FPROC) __GLeeGetProcAddress("glUniform1f"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2f = (GLEEPFNGLUNIFORM2FPROC) __GLeeGetProcAddress("glUniform2f"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3f = (GLEEPFNGLUNIFORM3FPROC) __GLeeGetProcAddress("glUniform3f"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4f = (GLEEPFNGLUNIFORM4FPROC) __GLeeGetProcAddress("glUniform4f"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1i = (GLEEPFNGLUNIFORM1IPROC) __GLeeGetProcAddress("glUniform1i"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2i = (GLEEPFNGLUNIFORM2IPROC) __GLeeGetProcAddress("glUniform2i"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3i = (GLEEPFNGLUNIFORM3IPROC) __GLeeGetProcAddress("glUniform3i"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4i = (GLEEPFNGLUNIFORM4IPROC) __GLeeGetProcAddress("glUniform4i"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1fv = (GLEEPFNGLUNIFORM1FVPROC) __GLeeGetProcAddress("glUniform1fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2fv = (GLEEPFNGLUNIFORM2FVPROC) __GLeeGetProcAddress("glUniform2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3fv = (GLEEPFNGLUNIFORM3FVPROC) __GLeeGetProcAddress("glUniform3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4fv = (GLEEPFNGLUNIFORM4FVPROC) __GLeeGetProcAddress("glUniform4fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1iv = (GLEEPFNGLUNIFORM1IVPROC) __GLeeGetProcAddress("glUniform1iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2iv = (GLEEPFNGLUNIFORM2IVPROC) __GLeeGetProcAddress("glUniform2iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3iv = (GLEEPFNGLUNIFORM3IVPROC) __GLeeGetProcAddress("glUniform3iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4iv = (GLEEPFNGLUNIFORM4IVPROC) __GLeeGetProcAddress("glUniform4iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix2fv = (GLEEPFNGLUNIFORMMATRIX2FVPROC) __GLeeGetProcAddress("glUniformMatrix2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix3fv = (GLEEPFNGLUNIFORMMATRIX3FVPROC) __GLeeGetProcAddress("glUniformMatrix3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix4fv = (GLEEPFNGLUNIFORMMATRIX4FVPROC) __GLeeGetProcAddress("glUniformMatrix4fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glValidateProgram = (GLEEPFNGLVALIDATEPROGRAMPROC) __GLeeGetProcAddress("glValidateProgram"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1d = (GLEEPFNGLVERTEXATTRIB1DPROC) __GLeeGetProcAddress("glVertexAttrib1d"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1dv = (GLEEPFNGLVERTEXATTRIB1DVPROC) __GLeeGetProcAddress("glVertexAttrib1dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1f = (GLEEPFNGLVERTEXATTRIB1FPROC) __GLeeGetProcAddress("glVertexAttrib1f"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1fv = (GLEEPFNGLVERTEXATTRIB1FVPROC) __GLeeGetProcAddress("glVertexAttrib1fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1s = (GLEEPFNGLVERTEXATTRIB1SPROC) __GLeeGetProcAddress("glVertexAttrib1s"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1sv = (GLEEPFNGLVERTEXATTRIB1SVPROC) __GLeeGetProcAddress("glVertexAttrib1sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2d = (GLEEPFNGLVERTEXATTRIB2DPROC) __GLeeGetProcAddress("glVertexAttrib2d"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2dv = (GLEEPFNGLVERTEXATTRIB2DVPROC) __GLeeGetProcAddress("glVertexAttrib2dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2f = (GLEEPFNGLVERTEXATTRIB2FPROC) __GLeeGetProcAddress("glVertexAttrib2f"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2fv = (GLEEPFNGLVERTEXATTRIB2FVPROC) __GLeeGetProcAddress("glVertexAttrib2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2s = (GLEEPFNGLVERTEXATTRIB2SPROC) __GLeeGetProcAddress("glVertexAttrib2s"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2sv = (GLEEPFNGLVERTEXATTRIB2SVPROC) __GLeeGetProcAddress("glVertexAttrib2sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3d = (GLEEPFNGLVERTEXATTRIB3DPROC) __GLeeGetProcAddress("glVertexAttrib3d"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3dv = (GLEEPFNGLVERTEXATTRIB3DVPROC) __GLeeGetProcAddress("glVertexAttrib3dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3f = (GLEEPFNGLVERTEXATTRIB3FPROC) __GLeeGetProcAddress("glVertexAttrib3f"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3fv = (GLEEPFNGLVERTEXATTRIB3FVPROC) __GLeeGetProcAddress("glVertexAttrib3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3s = (GLEEPFNGLVERTEXATTRIB3SPROC) __GLeeGetProcAddress("glVertexAttrib3s"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3sv = (GLEEPFNGLVERTEXATTRIB3SVPROC) __GLeeGetProcAddress("glVertexAttrib3sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Nbv = (GLEEPFNGLVERTEXATTRIB4NBVPROC) __GLeeGetProcAddress("glVertexAttrib4Nbv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Niv = (GLEEPFNGLVERTEXATTRIB4NIVPROC) __GLeeGetProcAddress("glVertexAttrib4Niv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Nsv = (GLEEPFNGLVERTEXATTRIB4NSVPROC) __GLeeGetProcAddress("glVertexAttrib4Nsv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Nub = (GLEEPFNGLVERTEXATTRIB4NUBPROC) __GLeeGetProcAddress("glVertexAttrib4Nub"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Nubv = (GLEEPFNGLVERTEXATTRIB4NUBVPROC) __GLeeGetProcAddress("glVertexAttrib4Nubv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Nuiv = (GLEEPFNGLVERTEXATTRIB4NUIVPROC) __GLeeGetProcAddress("glVertexAttrib4Nuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4Nusv = (GLEEPFNGLVERTEXATTRIB4NUSVPROC) __GLeeGetProcAddress("glVertexAttrib4Nusv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4bv = (GLEEPFNGLVERTEXATTRIB4BVPROC) __GLeeGetProcAddress("glVertexAttrib4bv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4d = (GLEEPFNGLVERTEXATTRIB4DPROC) __GLeeGetProcAddress("glVertexAttrib4d"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4dv = (GLEEPFNGLVERTEXATTRIB4DVPROC) __GLeeGetProcAddress("glVertexAttrib4dv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4f = (GLEEPFNGLVERTEXATTRIB4FPROC) __GLeeGetProcAddress("glVertexAttrib4f"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4fv = (GLEEPFNGLVERTEXATTRIB4FVPROC) __GLeeGetProcAddress("glVertexAttrib4fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4iv = (GLEEPFNGLVERTEXATTRIB4IVPROC) __GLeeGetProcAddress("glVertexAttrib4iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4s = (GLEEPFNGLVERTEXATTRIB4SPROC) __GLeeGetProcAddress("glVertexAttrib4s"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4sv = (GLEEPFNGLVERTEXATTRIB4SVPROC) __GLeeGetProcAddress("glVertexAttrib4sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4ubv = (GLEEPFNGLVERTEXATTRIB4UBVPROC) __GLeeGetProcAddress("glVertexAttrib4ubv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4uiv = (GLEEPFNGLVERTEXATTRIB4UIVPROC) __GLeeGetProcAddress("glVertexAttrib4uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4usv = (GLEEPFNGLVERTEXATTRIB4USVPROC) __GLeeGetProcAddress("glVertexAttrib4usv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribPointer = (GLEEPFNGLVERTEXATTRIBPOINTERPROC) __GLeeGetProcAddress("glVertexAttribPointer"))!=0) nLinked++; +#endif + if (nLinked==93) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_VERSION_2_1(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_2_1 + if ((GLeeFuncPtr_glUniformMatrix2x3fv = (GLEEPFNGLUNIFORMMATRIX2X3FVPROC) __GLeeGetProcAddress("glUniformMatrix2x3fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix3x2fv = (GLEEPFNGLUNIFORMMATRIX3X2FVPROC) __GLeeGetProcAddress("glUniformMatrix3x2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix2x4fv = (GLEEPFNGLUNIFORMMATRIX2X4FVPROC) __GLeeGetProcAddress("glUniformMatrix2x4fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix4x2fv = (GLEEPFNGLUNIFORMMATRIX4X2FVPROC) __GLeeGetProcAddress("glUniformMatrix4x2fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix3x4fv = (GLEEPFNGLUNIFORMMATRIX3X4FVPROC) __GLeeGetProcAddress("glUniformMatrix3x4fv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix4x3fv = (GLEEPFNGLUNIFORMMATRIX4X3FVPROC) __GLeeGetProcAddress("glUniformMatrix4x3fv"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_VERSION_3_0(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_VERSION_3_0 + if ((GLeeFuncPtr_glColorMaski = (GLEEPFNGLCOLORMASKIPROC) __GLeeGetProcAddress("glColorMaski"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBooleani_v = (GLEEPFNGLGETBOOLEANI_VPROC) __GLeeGetProcAddress("glGetBooleani_v"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetIntegeri_v = (GLEEPFNGLGETINTEGERI_VPROC) __GLeeGetProcAddress("glGetIntegeri_v"))!=0) nLinked++; + if ((GLeeFuncPtr_glEnablei = (GLEEPFNGLENABLEIPROC) __GLeeGetProcAddress("glEnablei"))!=0) nLinked++; + if ((GLeeFuncPtr_glDisablei = (GLEEPFNGLDISABLEIPROC) __GLeeGetProcAddress("glDisablei"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsEnabledi = (GLEEPFNGLISENABLEDIPROC) __GLeeGetProcAddress("glIsEnabledi"))!=0) nLinked++; + if ((GLeeFuncPtr_glBeginTransformFeedback = (GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC) __GLeeGetProcAddress("glBeginTransformFeedback"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndTransformFeedback = (GLEEPFNGLENDTRANSFORMFEEDBACKPROC) __GLeeGetProcAddress("glEndTransformFeedback"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferRange = (GLEEPFNGLBINDBUFFERRANGEPROC) __GLeeGetProcAddress("glBindBufferRange"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferBase = (GLEEPFNGLBINDBUFFERBASEPROC) __GLeeGetProcAddress("glBindBufferBase"))!=0) nLinked++; + if ((GLeeFuncPtr_glTransformFeedbackVaryings = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC) __GLeeGetProcAddress("glTransformFeedbackVaryings"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTransformFeedbackVarying = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC) __GLeeGetProcAddress("glGetTransformFeedbackVarying"))!=0) nLinked++; + if ((GLeeFuncPtr_glClampColor = (GLEEPFNGLCLAMPCOLORPROC) __GLeeGetProcAddress("glClampColor"))!=0) nLinked++; + if ((GLeeFuncPtr_glBeginConditionalRender = (GLEEPFNGLBEGINCONDITIONALRENDERPROC) __GLeeGetProcAddress("glBeginConditionalRender"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndConditionalRender = (GLEEPFNGLENDCONDITIONALRENDERPROC) __GLeeGetProcAddress("glEndConditionalRender"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1i = (GLEEPFNGLVERTEXATTRIBI1IPROC) __GLeeGetProcAddress("glVertexAttribI1i"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2i = (GLEEPFNGLVERTEXATTRIBI2IPROC) __GLeeGetProcAddress("glVertexAttribI2i"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3i = (GLEEPFNGLVERTEXATTRIBI3IPROC) __GLeeGetProcAddress("glVertexAttribI3i"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4i = (GLEEPFNGLVERTEXATTRIBI4IPROC) __GLeeGetProcAddress("glVertexAttribI4i"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1ui = (GLEEPFNGLVERTEXATTRIBI1UIPROC) __GLeeGetProcAddress("glVertexAttribI1ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2ui = (GLEEPFNGLVERTEXATTRIBI2UIPROC) __GLeeGetProcAddress("glVertexAttribI2ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3ui = (GLEEPFNGLVERTEXATTRIBI3UIPROC) __GLeeGetProcAddress("glVertexAttribI3ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4ui = (GLEEPFNGLVERTEXATTRIBI4UIPROC) __GLeeGetProcAddress("glVertexAttribI4ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1iv = (GLEEPFNGLVERTEXATTRIBI1IVPROC) __GLeeGetProcAddress("glVertexAttribI1iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2iv = (GLEEPFNGLVERTEXATTRIBI2IVPROC) __GLeeGetProcAddress("glVertexAttribI2iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3iv = (GLEEPFNGLVERTEXATTRIBI3IVPROC) __GLeeGetProcAddress("glVertexAttribI3iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4iv = (GLEEPFNGLVERTEXATTRIBI4IVPROC) __GLeeGetProcAddress("glVertexAttribI4iv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1uiv = (GLEEPFNGLVERTEXATTRIBI1UIVPROC) __GLeeGetProcAddress("glVertexAttribI1uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2uiv = (GLEEPFNGLVERTEXATTRIBI2UIVPROC) __GLeeGetProcAddress("glVertexAttribI2uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3uiv = (GLEEPFNGLVERTEXATTRIBI3UIVPROC) __GLeeGetProcAddress("glVertexAttribI3uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4uiv = (GLEEPFNGLVERTEXATTRIBI4UIVPROC) __GLeeGetProcAddress("glVertexAttribI4uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4bv = (GLEEPFNGLVERTEXATTRIBI4BVPROC) __GLeeGetProcAddress("glVertexAttribI4bv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4sv = (GLEEPFNGLVERTEXATTRIBI4SVPROC) __GLeeGetProcAddress("glVertexAttribI4sv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4ubv = (GLEEPFNGLVERTEXATTRIBI4UBVPROC) __GLeeGetProcAddress("glVertexAttribI4ubv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4usv = (GLEEPFNGLVERTEXATTRIBI4USVPROC) __GLeeGetProcAddress("glVertexAttribI4usv"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribIPointer = (GLEEPFNGLVERTEXATTRIBIPOINTERPROC) __GLeeGetProcAddress("glVertexAttribIPointer"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribIiv = (GLEEPFNGLGETVERTEXATTRIBIIVPROC) __GLeeGetProcAddress("glGetVertexAttribIiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribIuiv = (GLEEPFNGLGETVERTEXATTRIBIUIVPROC) __GLeeGetProcAddress("glGetVertexAttribIuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformuiv = (GLEEPFNGLGETUNIFORMUIVPROC) __GLeeGetProcAddress("glGetUniformuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindFragDataLocation = (GLEEPFNGLBINDFRAGDATALOCATIONPROC) __GLeeGetProcAddress("glBindFragDataLocation"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragDataLocation = (GLEEPFNGLGETFRAGDATALOCATIONPROC) __GLeeGetProcAddress("glGetFragDataLocation"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1ui = (GLEEPFNGLUNIFORM1UIPROC) __GLeeGetProcAddress("glUniform1ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2ui = (GLEEPFNGLUNIFORM2UIPROC) __GLeeGetProcAddress("glUniform2ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3ui = (GLEEPFNGLUNIFORM3UIPROC) __GLeeGetProcAddress("glUniform3ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4ui = (GLEEPFNGLUNIFORM4UIPROC) __GLeeGetProcAddress("glUniform4ui"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1uiv = (GLEEPFNGLUNIFORM1UIVPROC) __GLeeGetProcAddress("glUniform1uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2uiv = (GLEEPFNGLUNIFORM2UIVPROC) __GLeeGetProcAddress("glUniform2uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3uiv = (GLEEPFNGLUNIFORM3UIVPROC) __GLeeGetProcAddress("glUniform3uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4uiv = (GLEEPFNGLUNIFORM4UIVPROC) __GLeeGetProcAddress("glUniform4uiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexParameterIiv = (GLEEPFNGLTEXPARAMETERIIVPROC) __GLeeGetProcAddress("glTexParameterIiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexParameterIuiv = (GLEEPFNGLTEXPARAMETERIUIVPROC) __GLeeGetProcAddress("glTexParameterIuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTexParameterIiv = (GLEEPFNGLGETTEXPARAMETERIIVPROC) __GLeeGetProcAddress("glGetTexParameterIiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTexParameterIuiv = (GLEEPFNGLGETTEXPARAMETERIUIVPROC) __GLeeGetProcAddress("glGetTexParameterIuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearBufferiv = (GLEEPFNGLCLEARBUFFERIVPROC) __GLeeGetProcAddress("glClearBufferiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearBufferuiv = (GLEEPFNGLCLEARBUFFERUIVPROC) __GLeeGetProcAddress("glClearBufferuiv"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearBufferfv = (GLEEPFNGLCLEARBUFFERFVPROC) __GLeeGetProcAddress("glClearBufferfv"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearBufferfi = (GLEEPFNGLCLEARBUFFERFIPROC) __GLeeGetProcAddress("glClearBufferfi"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetStringi = (GLEEPFNGLGETSTRINGIPROC) __GLeeGetProcAddress("glGetStringi"))!=0) nLinked++; +#endif + if (nLinked==58) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_multitexture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_multitexture + if ((GLeeFuncPtr_glActiveTextureARB = (GLEEPFNGLACTIVETEXTUREARBPROC) __GLeeGetProcAddress("glActiveTextureARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glClientActiveTextureARB = (GLEEPFNGLCLIENTACTIVETEXTUREARBPROC) __GLeeGetProcAddress("glClientActiveTextureARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1dARB = (GLEEPFNGLMULTITEXCOORD1DARBPROC) __GLeeGetProcAddress("glMultiTexCoord1dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1dvARB = (GLEEPFNGLMULTITEXCOORD1DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1fARB = (GLEEPFNGLMULTITEXCOORD1FARBPROC) __GLeeGetProcAddress("glMultiTexCoord1fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1fvARB = (GLEEPFNGLMULTITEXCOORD1FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1iARB = (GLEEPFNGLMULTITEXCOORD1IARBPROC) __GLeeGetProcAddress("glMultiTexCoord1iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1ivARB = (GLEEPFNGLMULTITEXCOORD1IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1sARB = (GLEEPFNGLMULTITEXCOORD1SARBPROC) __GLeeGetProcAddress("glMultiTexCoord1sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1svARB = (GLEEPFNGLMULTITEXCOORD1SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2dARB = (GLEEPFNGLMULTITEXCOORD2DARBPROC) __GLeeGetProcAddress("glMultiTexCoord2dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2dvARB = (GLEEPFNGLMULTITEXCOORD2DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2fARB = (GLEEPFNGLMULTITEXCOORD2FARBPROC) __GLeeGetProcAddress("glMultiTexCoord2fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2fvARB = (GLEEPFNGLMULTITEXCOORD2FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2iARB = (GLEEPFNGLMULTITEXCOORD2IARBPROC) __GLeeGetProcAddress("glMultiTexCoord2iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2ivARB = (GLEEPFNGLMULTITEXCOORD2IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2sARB = (GLEEPFNGLMULTITEXCOORD2SARBPROC) __GLeeGetProcAddress("glMultiTexCoord2sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2svARB = (GLEEPFNGLMULTITEXCOORD2SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3dARB = (GLEEPFNGLMULTITEXCOORD3DARBPROC) __GLeeGetProcAddress("glMultiTexCoord3dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3dvARB = (GLEEPFNGLMULTITEXCOORD3DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3fARB = (GLEEPFNGLMULTITEXCOORD3FARBPROC) __GLeeGetProcAddress("glMultiTexCoord3fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3fvARB = (GLEEPFNGLMULTITEXCOORD3FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3iARB = (GLEEPFNGLMULTITEXCOORD3IARBPROC) __GLeeGetProcAddress("glMultiTexCoord3iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3ivARB = (GLEEPFNGLMULTITEXCOORD3IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3sARB = (GLEEPFNGLMULTITEXCOORD3SARBPROC) __GLeeGetProcAddress("glMultiTexCoord3sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3svARB = (GLEEPFNGLMULTITEXCOORD3SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4dARB = (GLEEPFNGLMULTITEXCOORD4DARBPROC) __GLeeGetProcAddress("glMultiTexCoord4dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4dvARB = (GLEEPFNGLMULTITEXCOORD4DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4fARB = (GLEEPFNGLMULTITEXCOORD4FARBPROC) __GLeeGetProcAddress("glMultiTexCoord4fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4fvARB = (GLEEPFNGLMULTITEXCOORD4FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4iARB = (GLEEPFNGLMULTITEXCOORD4IARBPROC) __GLeeGetProcAddress("glMultiTexCoord4iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4ivARB = (GLEEPFNGLMULTITEXCOORD4IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4sARB = (GLEEPFNGLMULTITEXCOORD4SARBPROC) __GLeeGetProcAddress("glMultiTexCoord4sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4svARB = (GLEEPFNGLMULTITEXCOORD4SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4svARB"))!=0) nLinked++; +#endif + if (nLinked==34) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_transpose_matrix(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_transpose_matrix + if ((GLeeFuncPtr_glLoadTransposeMatrixfARB = (GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC) __GLeeGetProcAddress("glLoadTransposeMatrixfARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glLoadTransposeMatrixdARB = (GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC) __GLeeGetProcAddress("glLoadTransposeMatrixdARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultTransposeMatrixfARB = (GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC) __GLeeGetProcAddress("glMultTransposeMatrixfARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultTransposeMatrixdARB = (GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC) __GLeeGetProcAddress("glMultTransposeMatrixdARB"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_multisample(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_multisample + if ((GLeeFuncPtr_glSampleCoverageARB = (GLEEPFNGLSAMPLECOVERAGEARBPROC) __GLeeGetProcAddress("glSampleCoverageARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_texture_env_add(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_cube_map(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_compression(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_texture_compression + if ((GLeeFuncPtr_glCompressedTexImage3DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC) __GLeeGetProcAddress("glCompressedTexImage3DARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexImage2DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC) __GLeeGetProcAddress("glCompressedTexImage2DARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexImage1DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC) __GLeeGetProcAddress("glCompressedTexImage1DARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexSubImage3DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage3DARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexSubImage2DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage2DARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTexSubImage1DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage1DARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCompressedTexImageARB = (GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC) __GLeeGetProcAddress("glGetCompressedTexImageARB"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_texture_border_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_point_parameters(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_point_parameters + if ((GLeeFuncPtr_glPointParameterfARB = (GLEEPFNGLPOINTPARAMETERFARBPROC) __GLeeGetProcAddress("glPointParameterfARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameterfvARB = (GLEEPFNGLPOINTPARAMETERFVARBPROC) __GLeeGetProcAddress("glPointParameterfvARB"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_vertex_blend(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_vertex_blend + if ((GLeeFuncPtr_glWeightbvARB = (GLEEPFNGLWEIGHTBVARBPROC) __GLeeGetProcAddress("glWeightbvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightsvARB = (GLEEPFNGLWEIGHTSVARBPROC) __GLeeGetProcAddress("glWeightsvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightivARB = (GLEEPFNGLWEIGHTIVARBPROC) __GLeeGetProcAddress("glWeightivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightfvARB = (GLEEPFNGLWEIGHTFVARBPROC) __GLeeGetProcAddress("glWeightfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightdvARB = (GLEEPFNGLWEIGHTDVARBPROC) __GLeeGetProcAddress("glWeightdvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightubvARB = (GLEEPFNGLWEIGHTUBVARBPROC) __GLeeGetProcAddress("glWeightubvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightusvARB = (GLEEPFNGLWEIGHTUSVARBPROC) __GLeeGetProcAddress("glWeightusvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightuivARB = (GLEEPFNGLWEIGHTUIVARBPROC) __GLeeGetProcAddress("glWeightuivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWeightPointerARB = (GLEEPFNGLWEIGHTPOINTERARBPROC) __GLeeGetProcAddress("glWeightPointerARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexBlendARB = (GLEEPFNGLVERTEXBLENDARBPROC) __GLeeGetProcAddress("glVertexBlendARB"))!=0) nLinked++; +#endif + if (nLinked==10) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_matrix_palette(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_matrix_palette + if ((GLeeFuncPtr_glCurrentPaletteMatrixARB = (GLEEPFNGLCURRENTPALETTEMATRIXARBPROC) __GLeeGetProcAddress("glCurrentPaletteMatrixARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixIndexubvARB = (GLEEPFNGLMATRIXINDEXUBVARBPROC) __GLeeGetProcAddress("glMatrixIndexubvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixIndexusvARB = (GLEEPFNGLMATRIXINDEXUSVARBPROC) __GLeeGetProcAddress("glMatrixIndexusvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixIndexuivARB = (GLEEPFNGLMATRIXINDEXUIVARBPROC) __GLeeGetProcAddress("glMatrixIndexuivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixIndexPointerARB = (GLEEPFNGLMATRIXINDEXPOINTERARBPROC) __GLeeGetProcAddress("glMatrixIndexPointerARB"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_texture_env_combine(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_env_crossbar(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_env_dot3(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_mirrored_repeat(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_depth_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_shadow(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_shadow_ambient(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_window_pos(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_window_pos + if ((GLeeFuncPtr_glWindowPos2dARB = (GLEEPFNGLWINDOWPOS2DARBPROC) __GLeeGetProcAddress("glWindowPos2dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2dvARB = (GLEEPFNGLWINDOWPOS2DVARBPROC) __GLeeGetProcAddress("glWindowPos2dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2fARB = (GLEEPFNGLWINDOWPOS2FARBPROC) __GLeeGetProcAddress("glWindowPos2fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2fvARB = (GLEEPFNGLWINDOWPOS2FVARBPROC) __GLeeGetProcAddress("glWindowPos2fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2iARB = (GLEEPFNGLWINDOWPOS2IARBPROC) __GLeeGetProcAddress("glWindowPos2iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2ivARB = (GLEEPFNGLWINDOWPOS2IVARBPROC) __GLeeGetProcAddress("glWindowPos2ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2sARB = (GLEEPFNGLWINDOWPOS2SARBPROC) __GLeeGetProcAddress("glWindowPos2sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2svARB = (GLEEPFNGLWINDOWPOS2SVARBPROC) __GLeeGetProcAddress("glWindowPos2svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3dARB = (GLEEPFNGLWINDOWPOS3DARBPROC) __GLeeGetProcAddress("glWindowPos3dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3dvARB = (GLEEPFNGLWINDOWPOS3DVARBPROC) __GLeeGetProcAddress("glWindowPos3dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3fARB = (GLEEPFNGLWINDOWPOS3FARBPROC) __GLeeGetProcAddress("glWindowPos3fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3fvARB = (GLEEPFNGLWINDOWPOS3FVARBPROC) __GLeeGetProcAddress("glWindowPos3fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3iARB = (GLEEPFNGLWINDOWPOS3IARBPROC) __GLeeGetProcAddress("glWindowPos3iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3ivARB = (GLEEPFNGLWINDOWPOS3IVARBPROC) __GLeeGetProcAddress("glWindowPos3ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3sARB = (GLEEPFNGLWINDOWPOS3SARBPROC) __GLeeGetProcAddress("glWindowPos3sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3svARB = (GLEEPFNGLWINDOWPOS3SVARBPROC) __GLeeGetProcAddress("glWindowPos3svARB"))!=0) nLinked++; +#endif + if (nLinked==16) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_vertex_program(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_vertex_program + if ((GLeeFuncPtr_glVertexAttrib1dARB = (GLEEPFNGLVERTEXATTRIB1DARBPROC) __GLeeGetProcAddress("glVertexAttrib1dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1dvARB = (GLEEPFNGLVERTEXATTRIB1DVARBPROC) __GLeeGetProcAddress("glVertexAttrib1dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1fARB = (GLEEPFNGLVERTEXATTRIB1FARBPROC) __GLeeGetProcAddress("glVertexAttrib1fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1fvARB = (GLEEPFNGLVERTEXATTRIB1FVARBPROC) __GLeeGetProcAddress("glVertexAttrib1fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1sARB = (GLEEPFNGLVERTEXATTRIB1SARBPROC) __GLeeGetProcAddress("glVertexAttrib1sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1svARB = (GLEEPFNGLVERTEXATTRIB1SVARBPROC) __GLeeGetProcAddress("glVertexAttrib1svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2dARB = (GLEEPFNGLVERTEXATTRIB2DARBPROC) __GLeeGetProcAddress("glVertexAttrib2dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2dvARB = (GLEEPFNGLVERTEXATTRIB2DVARBPROC) __GLeeGetProcAddress("glVertexAttrib2dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2fARB = (GLEEPFNGLVERTEXATTRIB2FARBPROC) __GLeeGetProcAddress("glVertexAttrib2fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2fvARB = (GLEEPFNGLVERTEXATTRIB2FVARBPROC) __GLeeGetProcAddress("glVertexAttrib2fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2sARB = (GLEEPFNGLVERTEXATTRIB2SARBPROC) __GLeeGetProcAddress("glVertexAttrib2sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2svARB = (GLEEPFNGLVERTEXATTRIB2SVARBPROC) __GLeeGetProcAddress("glVertexAttrib2svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3dARB = (GLEEPFNGLVERTEXATTRIB3DARBPROC) __GLeeGetProcAddress("glVertexAttrib3dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3dvARB = (GLEEPFNGLVERTEXATTRIB3DVARBPROC) __GLeeGetProcAddress("glVertexAttrib3dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3fARB = (GLEEPFNGLVERTEXATTRIB3FARBPROC) __GLeeGetProcAddress("glVertexAttrib3fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3fvARB = (GLEEPFNGLVERTEXATTRIB3FVARBPROC) __GLeeGetProcAddress("glVertexAttrib3fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3sARB = (GLEEPFNGLVERTEXATTRIB3SARBPROC) __GLeeGetProcAddress("glVertexAttrib3sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3svARB = (GLEEPFNGLVERTEXATTRIB3SVARBPROC) __GLeeGetProcAddress("glVertexAttrib3svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NbvARB = (GLEEPFNGLVERTEXATTRIB4NBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NbvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NivARB = (GLEEPFNGLVERTEXATTRIB4NIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NsvARB = (GLEEPFNGLVERTEXATTRIB4NSVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NsvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NubARB = (GLEEPFNGLVERTEXATTRIB4NUBARBPROC) __GLeeGetProcAddress("glVertexAttrib4NubARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NubvARB = (GLEEPFNGLVERTEXATTRIB4NUBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NubvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NuivARB = (GLEEPFNGLVERTEXATTRIB4NUIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NuivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4NusvARB = (GLEEPFNGLVERTEXATTRIB4NUSVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NusvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4bvARB = (GLEEPFNGLVERTEXATTRIB4BVARBPROC) __GLeeGetProcAddress("glVertexAttrib4bvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4dARB = (GLEEPFNGLVERTEXATTRIB4DARBPROC) __GLeeGetProcAddress("glVertexAttrib4dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4dvARB = (GLEEPFNGLVERTEXATTRIB4DVARBPROC) __GLeeGetProcAddress("glVertexAttrib4dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4fARB = (GLEEPFNGLVERTEXATTRIB4FARBPROC) __GLeeGetProcAddress("glVertexAttrib4fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4fvARB = (GLEEPFNGLVERTEXATTRIB4FVARBPROC) __GLeeGetProcAddress("glVertexAttrib4fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4ivARB = (GLEEPFNGLVERTEXATTRIB4IVARBPROC) __GLeeGetProcAddress("glVertexAttrib4ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4sARB = (GLEEPFNGLVERTEXATTRIB4SARBPROC) __GLeeGetProcAddress("glVertexAttrib4sARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4svARB = (GLEEPFNGLVERTEXATTRIB4SVARBPROC) __GLeeGetProcAddress("glVertexAttrib4svARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4ubvARB = (GLEEPFNGLVERTEXATTRIB4UBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4ubvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4uivARB = (GLEEPFNGLVERTEXATTRIB4UIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4uivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4usvARB = (GLEEPFNGLVERTEXATTRIB4USVARBPROC) __GLeeGetProcAddress("glVertexAttrib4usvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribPointerARB = (GLEEPFNGLVERTEXATTRIBPOINTERARBPROC) __GLeeGetProcAddress("glVertexAttribPointerARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glEnableVertexAttribArrayARB = (GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC) __GLeeGetProcAddress("glEnableVertexAttribArrayARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glDisableVertexAttribArrayARB = (GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC) __GLeeGetProcAddress("glDisableVertexAttribArrayARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramStringARB = (GLEEPFNGLPROGRAMSTRINGARBPROC) __GLeeGetProcAddress("glProgramStringARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindProgramARB = (GLEEPFNGLBINDPROGRAMARBPROC) __GLeeGetProcAddress("glBindProgramARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteProgramsARB = (GLEEPFNGLDELETEPROGRAMSARBPROC) __GLeeGetProcAddress("glDeleteProgramsARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenProgramsARB = (GLEEPFNGLGENPROGRAMSARBPROC) __GLeeGetProcAddress("glGenProgramsARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameter4dARB = (GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameter4dvARB = (GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameter4fARB = (GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameter4fvARB = (GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameter4dARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4dARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameter4dvARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4dvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameter4fARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameter4fvARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramEnvParameterdvARB = (GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC) __GLeeGetProcAddress("glGetProgramEnvParameterdvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramEnvParameterfvARB = (GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetProgramEnvParameterfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramLocalParameterdvARB = (GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) __GLeeGetProcAddress("glGetProgramLocalParameterdvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramLocalParameterfvARB = (GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetProgramLocalParameterfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramivARB = (GLEEPFNGLGETPROGRAMIVARBPROC) __GLeeGetProcAddress("glGetProgramivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramStringARB = (GLEEPFNGLGETPROGRAMSTRINGARBPROC) __GLeeGetProcAddress("glGetProgramStringARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribdvARB = (GLEEPFNGLGETVERTEXATTRIBDVARBPROC) __GLeeGetProcAddress("glGetVertexAttribdvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribfvARB = (GLEEPFNGLGETVERTEXATTRIBFVARBPROC) __GLeeGetProcAddress("glGetVertexAttribfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribivARB = (GLEEPFNGLGETVERTEXATTRIBIVARBPROC) __GLeeGetProcAddress("glGetVertexAttribivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribPointervARB = (GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC) __GLeeGetProcAddress("glGetVertexAttribPointervARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsProgramARB = (GLEEPFNGLISPROGRAMARBPROC) __GLeeGetProcAddress("glIsProgramARB"))!=0) nLinked++; +#endif + if (nLinked==62) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_fragment_program(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_vertex_buffer_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_vertex_buffer_object + if ((GLeeFuncPtr_glBindBufferARB = (GLEEPFNGLBINDBUFFERARBPROC) __GLeeGetProcAddress("glBindBufferARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteBuffersARB = (GLEEPFNGLDELETEBUFFERSARBPROC) __GLeeGetProcAddress("glDeleteBuffersARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenBuffersARB = (GLEEPFNGLGENBUFFERSARBPROC) __GLeeGetProcAddress("glGenBuffersARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsBufferARB = (GLEEPFNGLISBUFFERARBPROC) __GLeeGetProcAddress("glIsBufferARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glBufferDataARB = (GLEEPFNGLBUFFERDATAARBPROC) __GLeeGetProcAddress("glBufferDataARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glBufferSubDataARB = (GLEEPFNGLBUFFERSUBDATAARBPROC) __GLeeGetProcAddress("glBufferSubDataARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBufferSubDataARB = (GLEEPFNGLGETBUFFERSUBDATAARBPROC) __GLeeGetProcAddress("glGetBufferSubDataARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glMapBufferARB = (GLEEPFNGLMAPBUFFERARBPROC) __GLeeGetProcAddress("glMapBufferARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUnmapBufferARB = (GLEEPFNGLUNMAPBUFFERARBPROC) __GLeeGetProcAddress("glUnmapBufferARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBufferParameterivARB = (GLEEPFNGLGETBUFFERPARAMETERIVARBPROC) __GLeeGetProcAddress("glGetBufferParameterivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBufferPointervARB = (GLEEPFNGLGETBUFFERPOINTERVARBPROC) __GLeeGetProcAddress("glGetBufferPointervARB"))!=0) nLinked++; +#endif + if (nLinked==11) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_occlusion_query(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_occlusion_query + if ((GLeeFuncPtr_glGenQueriesARB = (GLEEPFNGLGENQUERIESARBPROC) __GLeeGetProcAddress("glGenQueriesARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteQueriesARB = (GLEEPFNGLDELETEQUERIESARBPROC) __GLeeGetProcAddress("glDeleteQueriesARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsQueryARB = (GLEEPFNGLISQUERYARBPROC) __GLeeGetProcAddress("glIsQueryARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glBeginQueryARB = (GLEEPFNGLBEGINQUERYARBPROC) __GLeeGetProcAddress("glBeginQueryARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndQueryARB = (GLEEPFNGLENDQUERYARBPROC) __GLeeGetProcAddress("glEndQueryARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryivARB = (GLEEPFNGLGETQUERYIVARBPROC) __GLeeGetProcAddress("glGetQueryivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryObjectivARB = (GLEEPFNGLGETQUERYOBJECTIVARBPROC) __GLeeGetProcAddress("glGetQueryObjectivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryObjectuivARB = (GLEEPFNGLGETQUERYOBJECTUIVARBPROC) __GLeeGetProcAddress("glGetQueryObjectuivARB"))!=0) nLinked++; +#endif + if (nLinked==8) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_shader_objects(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_shader_objects + if ((GLeeFuncPtr_glDeleteObjectARB = (GLEEPFNGLDELETEOBJECTARBPROC) __GLeeGetProcAddress("glDeleteObjectARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetHandleARB = (GLEEPFNGLGETHANDLEARBPROC) __GLeeGetProcAddress("glGetHandleARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glDetachObjectARB = (GLEEPFNGLDETACHOBJECTARBPROC) __GLeeGetProcAddress("glDetachObjectARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCreateShaderObjectARB = (GLEEPFNGLCREATESHADEROBJECTARBPROC) __GLeeGetProcAddress("glCreateShaderObjectARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glShaderSourceARB = (GLEEPFNGLSHADERSOURCEARBPROC) __GLeeGetProcAddress("glShaderSourceARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompileShaderARB = (GLEEPFNGLCOMPILESHADERARBPROC) __GLeeGetProcAddress("glCompileShaderARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glCreateProgramObjectARB = (GLEEPFNGLCREATEPROGRAMOBJECTARBPROC) __GLeeGetProcAddress("glCreateProgramObjectARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glAttachObjectARB = (GLEEPFNGLATTACHOBJECTARBPROC) __GLeeGetProcAddress("glAttachObjectARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glLinkProgramARB = (GLEEPFNGLLINKPROGRAMARBPROC) __GLeeGetProcAddress("glLinkProgramARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUseProgramObjectARB = (GLEEPFNGLUSEPROGRAMOBJECTARBPROC) __GLeeGetProcAddress("glUseProgramObjectARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glValidateProgramARB = (GLEEPFNGLVALIDATEPROGRAMARBPROC) __GLeeGetProcAddress("glValidateProgramARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1fARB = (GLEEPFNGLUNIFORM1FARBPROC) __GLeeGetProcAddress("glUniform1fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2fARB = (GLEEPFNGLUNIFORM2FARBPROC) __GLeeGetProcAddress("glUniform2fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3fARB = (GLEEPFNGLUNIFORM3FARBPROC) __GLeeGetProcAddress("glUniform3fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4fARB = (GLEEPFNGLUNIFORM4FARBPROC) __GLeeGetProcAddress("glUniform4fARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1iARB = (GLEEPFNGLUNIFORM1IARBPROC) __GLeeGetProcAddress("glUniform1iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2iARB = (GLEEPFNGLUNIFORM2IARBPROC) __GLeeGetProcAddress("glUniform2iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3iARB = (GLEEPFNGLUNIFORM3IARBPROC) __GLeeGetProcAddress("glUniform3iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4iARB = (GLEEPFNGLUNIFORM4IARBPROC) __GLeeGetProcAddress("glUniform4iARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1fvARB = (GLEEPFNGLUNIFORM1FVARBPROC) __GLeeGetProcAddress("glUniform1fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2fvARB = (GLEEPFNGLUNIFORM2FVARBPROC) __GLeeGetProcAddress("glUniform2fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3fvARB = (GLEEPFNGLUNIFORM3FVARBPROC) __GLeeGetProcAddress("glUniform3fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4fvARB = (GLEEPFNGLUNIFORM4FVARBPROC) __GLeeGetProcAddress("glUniform4fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1ivARB = (GLEEPFNGLUNIFORM1IVARBPROC) __GLeeGetProcAddress("glUniform1ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2ivARB = (GLEEPFNGLUNIFORM2IVARBPROC) __GLeeGetProcAddress("glUniform2ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3ivARB = (GLEEPFNGLUNIFORM3IVARBPROC) __GLeeGetProcAddress("glUniform3ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4ivARB = (GLEEPFNGLUNIFORM4IVARBPROC) __GLeeGetProcAddress("glUniform4ivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix2fvARB = (GLEEPFNGLUNIFORMMATRIX2FVARBPROC) __GLeeGetProcAddress("glUniformMatrix2fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix3fvARB = (GLEEPFNGLUNIFORMMATRIX3FVARBPROC) __GLeeGetProcAddress("glUniformMatrix3fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniformMatrix4fvARB = (GLEEPFNGLUNIFORMMATRIX4FVARBPROC) __GLeeGetProcAddress("glUniformMatrix4fvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetObjectParameterfvARB = (GLEEPFNGLGETOBJECTPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetObjectParameterfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetObjectParameterivARB = (GLEEPFNGLGETOBJECTPARAMETERIVARBPROC) __GLeeGetProcAddress("glGetObjectParameterivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetInfoLogARB = (GLEEPFNGLGETINFOLOGARBPROC) __GLeeGetProcAddress("glGetInfoLogARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetAttachedObjectsARB = (GLEEPFNGLGETATTACHEDOBJECTSARBPROC) __GLeeGetProcAddress("glGetAttachedObjectsARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformLocationARB = (GLEEPFNGLGETUNIFORMLOCATIONARBPROC) __GLeeGetProcAddress("glGetUniformLocationARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetActiveUniformARB = (GLEEPFNGLGETACTIVEUNIFORMARBPROC) __GLeeGetProcAddress("glGetActiveUniformARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformfvARB = (GLEEPFNGLGETUNIFORMFVARBPROC) __GLeeGetProcAddress("glGetUniformfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformivARB = (GLEEPFNGLGETUNIFORMIVARBPROC) __GLeeGetProcAddress("glGetUniformivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetShaderSourceARB = (GLEEPFNGLGETSHADERSOURCEARBPROC) __GLeeGetProcAddress("glGetShaderSourceARB"))!=0) nLinked++; +#endif + if (nLinked==39) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_vertex_shader(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_vertex_shader + if ((GLeeFuncPtr_glBindAttribLocationARB = (GLEEPFNGLBINDATTRIBLOCATIONARBPROC) __GLeeGetProcAddress("glBindAttribLocationARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetActiveAttribARB = (GLEEPFNGLGETACTIVEATTRIBARBPROC) __GLeeGetProcAddress("glGetActiveAttribARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetAttribLocationARB = (GLEEPFNGLGETATTRIBLOCATIONARBPROC) __GLeeGetProcAddress("glGetAttribLocationARB"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_fragment_shader(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_shading_language_100(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_non_power_of_two(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_point_sprite(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_fragment_program_shadow(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_draw_buffers(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_draw_buffers + if ((GLeeFuncPtr_glDrawBuffersARB = (GLEEPFNGLDRAWBUFFERSARBPROC) __GLeeGetProcAddress("glDrawBuffersARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_texture_rectangle(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_color_buffer_float(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_color_buffer_float + if ((GLeeFuncPtr_glClampColorARB = (GLEEPFNGLCLAMPCOLORARBPROC) __GLeeGetProcAddress("glClampColorARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_half_float_pixel(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_pixel_buffer_object(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_depth_buffer_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_draw_instanced(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_draw_instanced + if ((GLeeFuncPtr_glDrawArraysInstancedARB = (GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC) __GLeeGetProcAddress("glDrawArraysInstancedARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawElementsInstancedARB = (GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC) __GLeeGetProcAddress("glDrawElementsInstancedARB"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_framebuffer_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_framebuffer_object + if ((GLeeFuncPtr_glIsRenderbuffer = (GLEEPFNGLISRENDERBUFFERPROC) __GLeeGetProcAddress("glIsRenderbuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindRenderbuffer = (GLEEPFNGLBINDRENDERBUFFERPROC) __GLeeGetProcAddress("glBindRenderbuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteRenderbuffers = (GLEEPFNGLDELETERENDERBUFFERSPROC) __GLeeGetProcAddress("glDeleteRenderbuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenRenderbuffers = (GLEEPFNGLGENRENDERBUFFERSPROC) __GLeeGetProcAddress("glGenRenderbuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glRenderbufferStorage = (GLEEPFNGLRENDERBUFFERSTORAGEPROC) __GLeeGetProcAddress("glRenderbufferStorage"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetRenderbufferParameteriv = (GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC) __GLeeGetProcAddress("glGetRenderbufferParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsFramebuffer = (GLEEPFNGLISFRAMEBUFFERPROC) __GLeeGetProcAddress("glIsFramebuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindFramebuffer = (GLEEPFNGLBINDFRAMEBUFFERPROC) __GLeeGetProcAddress("glBindFramebuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteFramebuffers = (GLEEPFNGLDELETEFRAMEBUFFERSPROC) __GLeeGetProcAddress("glDeleteFramebuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenFramebuffers = (GLEEPFNGLGENFRAMEBUFFERSPROC) __GLeeGetProcAddress("glGenFramebuffers"))!=0) nLinked++; + if ((GLeeFuncPtr_glCheckFramebufferStatus = (GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC) __GLeeGetProcAddress("glCheckFramebufferStatus"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTexture1D = (GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC) __GLeeGetProcAddress("glFramebufferTexture1D"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTexture2D = (GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC) __GLeeGetProcAddress("glFramebufferTexture2D"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTexture3D = (GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC) __GLeeGetProcAddress("glFramebufferTexture3D"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferRenderbuffer = (GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC) __GLeeGetProcAddress("glFramebufferRenderbuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFramebufferAttachmentParameteriv = (GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) __GLeeGetProcAddress("glGetFramebufferAttachmentParameteriv"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenerateMipmap = (GLEEPFNGLGENERATEMIPMAPPROC) __GLeeGetProcAddress("glGenerateMipmap"))!=0) nLinked++; + if ((GLeeFuncPtr_glBlitFramebuffer = (GLEEPFNGLBLITFRAMEBUFFERPROC) __GLeeGetProcAddress("glBlitFramebuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glRenderbufferStorageMultisample = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisample"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureLayer = (GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC) __GLeeGetProcAddress("glFramebufferTextureLayer"))!=0) nLinked++; +#endif + if (nLinked==20) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_geometry_shader4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_geometry_shader4 + if ((GLeeFuncPtr_glProgramParameteriARB = (GLEEPFNGLPROGRAMPARAMETERIARBPROC) __GLeeGetProcAddress("glProgramParameteriARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureARB = (GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC) __GLeeGetProcAddress("glFramebufferTextureARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureLayerARB = (GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC) __GLeeGetProcAddress("glFramebufferTextureLayerARB"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureFaceARB = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC) __GLeeGetProcAddress("glFramebufferTextureFaceARB"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_half_float_vertex(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_instanced_arrays(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_instanced_arrays + if ((GLeeFuncPtr_glVertexAttribDivisor = (GLEEPFNGLVERTEXATTRIBDIVISORPROC) __GLeeGetProcAddress("glVertexAttribDivisor"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_map_buffer_range(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_map_buffer_range + if ((GLeeFuncPtr_glMapBufferRange = (GLEEPFNGLMAPBUFFERRANGEPROC) __GLeeGetProcAddress("glMapBufferRange"))!=0) nLinked++; + if ((GLeeFuncPtr_glFlushMappedBufferRange = (GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC) __GLeeGetProcAddress("glFlushMappedBufferRange"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_texture_buffer_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_texture_buffer_object + if ((GLeeFuncPtr_glTexBufferARB = (GLEEPFNGLTEXBUFFERARBPROC) __GLeeGetProcAddress("glTexBufferARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ARB_texture_compression_rgtc(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_texture_rg(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ARB_vertex_array_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ARB_vertex_array_object + if ((GLeeFuncPtr_glBindVertexArray = (GLEEPFNGLBINDVERTEXARRAYPROC) __GLeeGetProcAddress("glBindVertexArray"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteVertexArrays = (GLEEPFNGLDELETEVERTEXARRAYSPROC) __GLeeGetProcAddress("glDeleteVertexArrays"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenVertexArrays = (GLEEPFNGLGENVERTEXARRAYSPROC) __GLeeGetProcAddress("glGenVertexArrays"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsVertexArray = (GLEEPFNGLISVERTEXARRAYPROC) __GLeeGetProcAddress("glIsVertexArray"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_abgr(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_blend_color(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_blend_color + if ((GLeeFuncPtr_glBlendColorEXT = (GLEEPFNGLBLENDCOLOREXTPROC) __GLeeGetProcAddress("glBlendColorEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_polygon_offset(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_polygon_offset + if ((GLeeFuncPtr_glPolygonOffsetEXT = (GLEEPFNGLPOLYGONOFFSETEXTPROC) __GLeeGetProcAddress("glPolygonOffsetEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture3D(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_texture3D + if ((GLeeFuncPtr_glTexImage3DEXT = (GLEEPFNGLTEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glTexImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexSubImage3DEXT = (GLEEPFNGLTEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glTexSubImage3DEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIS_texture_filter4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_texture_filter4 + if ((GLeeFuncPtr_glGetTexFilterFuncSGIS = (GLEEPFNGLGETTEXFILTERFUNCSGISPROC) __GLeeGetProcAddress("glGetTexFilterFuncSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexFilterFuncSGIS = (GLEEPFNGLTEXFILTERFUNCSGISPROC) __GLeeGetProcAddress("glTexFilterFuncSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_subtexture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_subtexture + if ((GLeeFuncPtr_glTexSubImage1DEXT = (GLEEPFNGLTEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glTexSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexSubImage2DEXT = (GLEEPFNGLTEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glTexSubImage2DEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_copy_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_copy_texture + if ((GLeeFuncPtr_glCopyTexImage1DEXT = (GLEEPFNGLCOPYTEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTexImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTexImage2DEXT = (GLEEPFNGLCOPYTEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTexImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTexSubImage1DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTexSubImage2DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTexSubImage3DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage3DEXT"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_histogram(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_histogram + if ((GLeeFuncPtr_glGetHistogramEXT = (GLEEPFNGLGETHISTOGRAMEXTPROC) __GLeeGetProcAddress("glGetHistogramEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetHistogramParameterfvEXT = (GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetHistogramParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetHistogramParameterivEXT = (GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetHistogramParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMinmaxEXT = (GLEEPFNGLGETMINMAXEXTPROC) __GLeeGetProcAddress("glGetMinmaxEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMinmaxParameterfvEXT = (GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMinmaxParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMinmaxParameterivEXT = (GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMinmaxParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glHistogramEXT = (GLEEPFNGLHISTOGRAMEXTPROC) __GLeeGetProcAddress("glHistogramEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMinmaxEXT = (GLEEPFNGLMINMAXEXTPROC) __GLeeGetProcAddress("glMinmaxEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glResetHistogramEXT = (GLEEPFNGLRESETHISTOGRAMEXTPROC) __GLeeGetProcAddress("glResetHistogramEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glResetMinmaxEXT = (GLEEPFNGLRESETMINMAXEXTPROC) __GLeeGetProcAddress("glResetMinmaxEXT"))!=0) nLinked++; +#endif + if (nLinked==10) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_convolution(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_convolution + if ((GLeeFuncPtr_glConvolutionFilter1DEXT = (GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC) __GLeeGetProcAddress("glConvolutionFilter1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionFilter2DEXT = (GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC) __GLeeGetProcAddress("glConvolutionFilter2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameterfEXT = (GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC) __GLeeGetProcAddress("glConvolutionParameterfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameterfvEXT = (GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC) __GLeeGetProcAddress("glConvolutionParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameteriEXT = (GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC) __GLeeGetProcAddress("glConvolutionParameteriEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glConvolutionParameterivEXT = (GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC) __GLeeGetProcAddress("glConvolutionParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyConvolutionFilter1DEXT = (GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) __GLeeGetProcAddress("glCopyConvolutionFilter1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyConvolutionFilter2DEXT = (GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) __GLeeGetProcAddress("glCopyConvolutionFilter2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetConvolutionFilterEXT = (GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC) __GLeeGetProcAddress("glGetConvolutionFilterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetConvolutionParameterfvEXT = (GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetConvolutionParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetConvolutionParameterivEXT = (GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetConvolutionParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetSeparableFilterEXT = (GLEEPFNGLGETSEPARABLEFILTEREXTPROC) __GLeeGetProcAddress("glGetSeparableFilterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSeparableFilter2DEXT = (GLEEPFNGLSEPARABLEFILTER2DEXTPROC) __GLeeGetProcAddress("glSeparableFilter2DEXT"))!=0) nLinked++; +#endif + if (nLinked==13) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGI_color_matrix(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGI_color_table(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGI_color_table + if ((GLeeFuncPtr_glColorTableSGI = (GLEEPFNGLCOLORTABLESGIPROC) __GLeeGetProcAddress("glColorTableSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorTableParameterfvSGI = (GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC) __GLeeGetProcAddress("glColorTableParameterfvSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorTableParameterivSGI = (GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC) __GLeeGetProcAddress("glColorTableParameterivSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyColorTableSGI = (GLEEPFNGLCOPYCOLORTABLESGIPROC) __GLeeGetProcAddress("glCopyColorTableSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableSGI = (GLEEPFNGLGETCOLORTABLESGIPROC) __GLeeGetProcAddress("glGetColorTableSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableParameterfvSGI = (GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC) __GLeeGetProcAddress("glGetColorTableParameterfvSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableParameterivSGI = (GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC) __GLeeGetProcAddress("glGetColorTableParameterivSGI"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIS_pixel_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_pixel_texture + if ((GLeeFuncPtr_glPixelTexGenParameteriSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC) __GLeeGetProcAddress("glPixelTexGenParameteriSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glPixelTexGenParameterivSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterivSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glPixelTexGenParameterfSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterfSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glPixelTexGenParameterfvSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterfvSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetPixelTexGenParameterivSGIS = (GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) __GLeeGetProcAddress("glGetPixelTexGenParameterivSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS = (GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) __GLeeGetProcAddress("glGetPixelTexGenParameterfvSGIS"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_pixel_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_pixel_texture + if ((GLeeFuncPtr_glPixelTexGenSGIX = (GLEEPFNGLPIXELTEXGENSGIXPROC) __GLeeGetProcAddress("glPixelTexGenSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIS_texture4D(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_texture4D + if ((GLeeFuncPtr_glTexImage4DSGIS = (GLEEPFNGLTEXIMAGE4DSGISPROC) __GLeeGetProcAddress("glTexImage4DSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexSubImage4DSGIS = (GLEEPFNGLTEXSUBIMAGE4DSGISPROC) __GLeeGetProcAddress("glTexSubImage4DSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGI_texture_color_table(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_cmyka(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_texture_object + if ((GLeeFuncPtr_glAreTexturesResidentEXT = (GLEEPFNGLARETEXTURESRESIDENTEXTPROC) __GLeeGetProcAddress("glAreTexturesResidentEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindTextureEXT = (GLEEPFNGLBINDTEXTUREEXTPROC) __GLeeGetProcAddress("glBindTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteTexturesEXT = (GLEEPFNGLDELETETEXTURESEXTPROC) __GLeeGetProcAddress("glDeleteTexturesEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenTexturesEXT = (GLEEPFNGLGENTEXTURESEXTPROC) __GLeeGetProcAddress("glGenTexturesEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsTextureEXT = (GLEEPFNGLISTEXTUREEXTPROC) __GLeeGetProcAddress("glIsTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glPrioritizeTexturesEXT = (GLEEPFNGLPRIORITIZETEXTURESEXTPROC) __GLeeGetProcAddress("glPrioritizeTexturesEXT"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIS_detail_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_detail_texture + if ((GLeeFuncPtr_glDetailTexFuncSGIS = (GLEEPFNGLDETAILTEXFUNCSGISPROC) __GLeeGetProcAddress("glDetailTexFuncSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetDetailTexFuncSGIS = (GLEEPFNGLGETDETAILTEXFUNCSGISPROC) __GLeeGetProcAddress("glGetDetailTexFuncSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIS_sharpen_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_sharpen_texture + if ((GLeeFuncPtr_glSharpenTexFuncSGIS = (GLEEPFNGLSHARPENTEXFUNCSGISPROC) __GLeeGetProcAddress("glSharpenTexFuncSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetSharpenTexFuncSGIS = (GLEEPFNGLGETSHARPENTEXFUNCSGISPROC) __GLeeGetProcAddress("glGetSharpenTexFuncSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_packed_pixels(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_texture_lod(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_multisample(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_multisample + if ((GLeeFuncPtr_glSampleMaskSGIS = (GLEEPFNGLSAMPLEMASKSGISPROC) __GLeeGetProcAddress("glSampleMaskSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glSamplePatternSGIS = (GLEEPFNGLSAMPLEPATTERNSGISPROC) __GLeeGetProcAddress("glSamplePatternSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_rescale_normal(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_vertex_array(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_vertex_array + if ((GLeeFuncPtr_glArrayElementEXT = (GLEEPFNGLARRAYELEMENTEXTPROC) __GLeeGetProcAddress("glArrayElementEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorPointerEXT = (GLEEPFNGLCOLORPOINTEREXTPROC) __GLeeGetProcAddress("glColorPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawArraysEXT = (GLEEPFNGLDRAWARRAYSEXTPROC) __GLeeGetProcAddress("glDrawArraysEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEdgeFlagPointerEXT = (GLEEPFNGLEDGEFLAGPOINTEREXTPROC) __GLeeGetProcAddress("glEdgeFlagPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetPointervEXT = (GLEEPFNGLGETPOINTERVEXTPROC) __GLeeGetProcAddress("glGetPointervEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glIndexPointerEXT = (GLEEPFNGLINDEXPOINTEREXTPROC) __GLeeGetProcAddress("glIndexPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalPointerEXT = (GLEEPFNGLNORMALPOINTEREXTPROC) __GLeeGetProcAddress("glNormalPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoordPointerEXT = (GLEEPFNGLTEXCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glTexCoordPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexPointerEXT = (GLEEPFNGLVERTEXPOINTEREXTPROC) __GLeeGetProcAddress("glVertexPointerEXT"))!=0) nLinked++; +#endif + if (nLinked==9) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_misc_attribute(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_generate_mipmap(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_clipmap(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_shadow(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_texture_edge_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_texture_border_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_blend_minmax(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_blend_minmax + if ((GLeeFuncPtr_glBlendEquationEXT = (GLEEPFNGLBLENDEQUATIONEXTPROC) __GLeeGetProcAddress("glBlendEquationEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_blend_subtract(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_blend_logic_op(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_interlace(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_pixel_tiles(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_texture_select(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_sprite(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_sprite + if ((GLeeFuncPtr_glSpriteParameterfSGIX = (GLEEPFNGLSPRITEPARAMETERFSGIXPROC) __GLeeGetProcAddress("glSpriteParameterfSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glSpriteParameterfvSGIX = (GLEEPFNGLSPRITEPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glSpriteParameterfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glSpriteParameteriSGIX = (GLEEPFNGLSPRITEPARAMETERISGIXPROC) __GLeeGetProcAddress("glSpriteParameteriSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glSpriteParameterivSGIX = (GLEEPFNGLSPRITEPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glSpriteParameterivSGIX"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_texture_multi_buffer(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_point_parameters(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_point_parameters + if ((GLeeFuncPtr_glPointParameterfEXT = (GLEEPFNGLPOINTPARAMETERFEXTPROC) __GLeeGetProcAddress("glPointParameterfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameterfvEXT = (GLEEPFNGLPOINTPARAMETERFVEXTPROC) __GLeeGetProcAddress("glPointParameterfvEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIS_point_parameters(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_point_parameters + if ((GLeeFuncPtr_glPointParameterfSGIS = (GLEEPFNGLPOINTPARAMETERFSGISPROC) __GLeeGetProcAddress("glPointParameterfSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameterfvSGIS = (GLEEPFNGLPOINTPARAMETERFVSGISPROC) __GLeeGetProcAddress("glPointParameterfvSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_instruments(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_instruments + if ((GLeeFuncPtr_glGetInstrumentsSGIX = (GLEEPFNGLGETINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glGetInstrumentsSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glInstrumentsBufferSGIX = (GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC) __GLeeGetProcAddress("glInstrumentsBufferSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glPollInstrumentsSGIX = (GLEEPFNGLPOLLINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glPollInstrumentsSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glReadInstrumentsSGIX = (GLEEPFNGLREADINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glReadInstrumentsSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glStartInstrumentsSGIX = (GLEEPFNGLSTARTINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glStartInstrumentsSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glStopInstrumentsSGIX = (GLEEPFNGLSTOPINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glStopInstrumentsSGIX"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_texture_scale_bias(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_framezoom(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_framezoom + if ((GLeeFuncPtr_glFrameZoomSGIX = (GLEEPFNGLFRAMEZOOMSGIXPROC) __GLeeGetProcAddress("glFrameZoomSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_tag_sample_buffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_tag_sample_buffer + if ((GLeeFuncPtr_glTagSampleBufferSGIX = (GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC) __GLeeGetProcAddress("glTagSampleBufferSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_FfdMaskSGIX(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_polynomial_ffd(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_polynomial_ffd + if ((GLeeFuncPtr_glDeformationMap3dSGIX = (GLEEPFNGLDEFORMATIONMAP3DSGIXPROC) __GLeeGetProcAddress("glDeformationMap3dSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeformationMap3fSGIX = (GLEEPFNGLDEFORMATIONMAP3FSGIXPROC) __GLeeGetProcAddress("glDeformationMap3fSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeformSGIX = (GLEEPFNGLDEFORMSGIXPROC) __GLeeGetProcAddress("glDeformSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glLoadIdentityDeformationMapSGIX = (GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) __GLeeGetProcAddress("glLoadIdentityDeformationMapSGIX"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_reference_plane(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_reference_plane + if ((GLeeFuncPtr_glReferencePlaneSGIX = (GLEEPFNGLREFERENCEPLANESGIXPROC) __GLeeGetProcAddress("glReferencePlaneSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_flush_raster(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_flush_raster + if ((GLeeFuncPtr_glFlushRasterSGIX = (GLEEPFNGLFLUSHRASTERSGIXPROC) __GLeeGetProcAddress("glFlushRasterSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_depth_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_fog_function(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_fog_function + if ((GLeeFuncPtr_glFogFuncSGIS = (GLEEPFNGLFOGFUNCSGISPROC) __GLeeGetProcAddress("glFogFuncSGIS"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFogFuncSGIS = (GLEEPFNGLGETFOGFUNCSGISPROC) __GLeeGetProcAddress("glGetFogFuncSGIS"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_fog_offset(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_HP_image_transform(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_HP_image_transform + if ((GLeeFuncPtr_glImageTransformParameteriHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC) __GLeeGetProcAddress("glImageTransformParameteriHP"))!=0) nLinked++; + if ((GLeeFuncPtr_glImageTransformParameterfHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC) __GLeeGetProcAddress("glImageTransformParameterfHP"))!=0) nLinked++; + if ((GLeeFuncPtr_glImageTransformParameterivHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC) __GLeeGetProcAddress("glImageTransformParameterivHP"))!=0) nLinked++; + if ((GLeeFuncPtr_glImageTransformParameterfvHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC) __GLeeGetProcAddress("glImageTransformParameterfvHP"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetImageTransformParameterivHP = (GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) __GLeeGetProcAddress("glGetImageTransformParameterivHP"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetImageTransformParameterfvHP = (GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) __GLeeGetProcAddress("glGetImageTransformParameterfvHP"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_HP_convolution_border_modes(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_INGR_palette_buffer(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_texture_add_env(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_color_subtable(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_color_subtable + if ((GLeeFuncPtr_glColorSubTableEXT = (GLEEPFNGLCOLORSUBTABLEEXTPROC) __GLeeGetProcAddress("glColorSubTableEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyColorSubTableEXT = (GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC) __GLeeGetProcAddress("glCopyColorSubTableEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_PGI_vertex_hints(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_PGI_misc_hints(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_PGI_misc_hints + if ((GLeeFuncPtr_glHintPGI = (GLEEPFNGLHINTPGIPROC) __GLeeGetProcAddress("glHintPGI"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_paletted_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_paletted_texture + if ((GLeeFuncPtr_glColorTableEXT = (GLEEPFNGLCOLORTABLEEXTPROC) __GLeeGetProcAddress("glColorTableEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableEXT = (GLEEPFNGLGETCOLORTABLEEXTPROC) __GLeeGetProcAddress("glGetColorTableEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableParameterivEXT = (GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetColorTableParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetColorTableParameterfvEXT = (GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetColorTableParameterfvEXT"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_clip_volume_hint(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_list_priority(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_list_priority + if ((GLeeFuncPtr_glGetListParameterfvSGIX = (GLEEPFNGLGETLISTPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glGetListParameterfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetListParameterivSGIX = (GLEEPFNGLGETLISTPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glGetListParameterivSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glListParameterfSGIX = (GLEEPFNGLLISTPARAMETERFSGIXPROC) __GLeeGetProcAddress("glListParameterfSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glListParameterfvSGIX = (GLEEPFNGLLISTPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glListParameterfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glListParameteriSGIX = (GLEEPFNGLLISTPARAMETERISGIXPROC) __GLeeGetProcAddress("glListParameteriSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glListParameterivSGIX = (GLEEPFNGLLISTPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glListParameterivSGIX"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_ir_instrument1(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_calligraphic_fragment(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_texture_lod_bias(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_shadow_ambient(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_index_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_index_material(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_index_material + if ((GLeeFuncPtr_glIndexMaterialEXT = (GLEEPFNGLINDEXMATERIALEXTPROC) __GLeeGetProcAddress("glIndexMaterialEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_index_func(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_index_func + if ((GLeeFuncPtr_glIndexFuncEXT = (GLEEPFNGLINDEXFUNCEXTPROC) __GLeeGetProcAddress("glIndexFuncEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_index_array_formats(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_compiled_vertex_array(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_compiled_vertex_array + if ((GLeeFuncPtr_glLockArraysEXT = (GLEEPFNGLLOCKARRAYSEXTPROC) __GLeeGetProcAddress("glLockArraysEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUnlockArraysEXT = (GLEEPFNGLUNLOCKARRAYSEXTPROC) __GLeeGetProcAddress("glUnlockArraysEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_cull_vertex(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_cull_vertex + if ((GLeeFuncPtr_glCullParameterdvEXT = (GLEEPFNGLCULLPARAMETERDVEXTPROC) __GLeeGetProcAddress("glCullParameterdvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCullParameterfvEXT = (GLEEPFNGLCULLPARAMETERFVEXTPROC) __GLeeGetProcAddress("glCullParameterfvEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_ycrcb(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_fragment_lighting(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_fragment_lighting + if ((GLeeFuncPtr_glFragmentColorMaterialSGIX = (GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC) __GLeeGetProcAddress("glFragmentColorMaterialSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightfSGIX = (GLEEPFNGLFRAGMENTLIGHTFSGIXPROC) __GLeeGetProcAddress("glFragmentLightfSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightfvSGIX = (GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC) __GLeeGetProcAddress("glFragmentLightfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightiSGIX = (GLEEPFNGLFRAGMENTLIGHTISGIXPROC) __GLeeGetProcAddress("glFragmentLightiSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightivSGIX = (GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC) __GLeeGetProcAddress("glFragmentLightivSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModelfSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelfSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModelfvSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModeliSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC) __GLeeGetProcAddress("glFragmentLightModeliSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModelivSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelivSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialfSGIX = (GLEEPFNGLFRAGMENTMATERIALFSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialfSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialfvSGIX = (GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialiSGIX = (GLEEPFNGLFRAGMENTMATERIALISGIXPROC) __GLeeGetProcAddress("glFragmentMaterialiSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialivSGIX = (GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialivSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentLightfvSGIX = (GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC) __GLeeGetProcAddress("glGetFragmentLightfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentLightivSGIX = (GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC) __GLeeGetProcAddress("glGetFragmentLightivSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentMaterialfvSGIX = (GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC) __GLeeGetProcAddress("glGetFragmentMaterialfvSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentMaterialivSGIX = (GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC) __GLeeGetProcAddress("glGetFragmentMaterialivSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glLightEnviSGIX = (GLEEPFNGLLIGHTENVISGIXPROC) __GLeeGetProcAddress("glLightEnviSGIX"))!=0) nLinked++; +#endif + if (nLinked==18) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_IBM_rasterpos_clip(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_HP_texture_lighting(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_draw_range_elements(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_draw_range_elements + if ((GLeeFuncPtr_glDrawRangeElementsEXT = (GLEEPFNGLDRAWRANGEELEMENTSEXTPROC) __GLeeGetProcAddress("glDrawRangeElementsEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_WIN_phong_shading(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_WIN_specular_fog(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_light_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_light_texture + if ((GLeeFuncPtr_glApplyTextureEXT = (GLEEPFNGLAPPLYTEXTUREEXTPROC) __GLeeGetProcAddress("glApplyTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureLightEXT = (GLEEPFNGLTEXTURELIGHTEXTPROC) __GLeeGetProcAddress("glTextureLightEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureMaterialEXT = (GLEEPFNGLTEXTUREMATERIALEXTPROC) __GLeeGetProcAddress("glTextureMaterialEXT"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_blend_alpha_minmax(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_impact_pixel_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_bgra(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_async(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_async + if ((GLeeFuncPtr_glAsyncMarkerSGIX = (GLEEPFNGLASYNCMARKERSGIXPROC) __GLeeGetProcAddress("glAsyncMarkerSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glFinishAsyncSGIX = (GLEEPFNGLFINISHASYNCSGIXPROC) __GLeeGetProcAddress("glFinishAsyncSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glPollAsyncSGIX = (GLEEPFNGLPOLLASYNCSGIXPROC) __GLeeGetProcAddress("glPollAsyncSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenAsyncMarkersSGIX = (GLEEPFNGLGENASYNCMARKERSSGIXPROC) __GLeeGetProcAddress("glGenAsyncMarkersSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteAsyncMarkersSGIX = (GLEEPFNGLDELETEASYNCMARKERSSGIXPROC) __GLeeGetProcAddress("glDeleteAsyncMarkersSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsAsyncMarkerSGIX = (GLEEPFNGLISASYNCMARKERSGIXPROC) __GLeeGetProcAddress("glIsAsyncMarkerSGIX"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_async_pixel(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_async_histogram(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_INTEL_texture_scissor(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_INTEL_parallel_arrays(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_INTEL_parallel_arrays + if ((GLeeFuncPtr_glVertexPointervINTEL = (GLEEPFNGLVERTEXPOINTERVINTELPROC) __GLeeGetProcAddress("glVertexPointervINTEL"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalPointervINTEL = (GLEEPFNGLNORMALPOINTERVINTELPROC) __GLeeGetProcAddress("glNormalPointervINTEL"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorPointervINTEL = (GLEEPFNGLCOLORPOINTERVINTELPROC) __GLeeGetProcAddress("glColorPointervINTEL"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoordPointervINTEL = (GLEEPFNGLTEXCOORDPOINTERVINTELPROC) __GLeeGetProcAddress("glTexCoordPointervINTEL"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_HP_occlusion_test(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_pixel_transform(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_pixel_transform + if ((GLeeFuncPtr_glPixelTransformParameteriEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC) __GLeeGetProcAddress("glPixelTransformParameteriEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glPixelTransformParameterfEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glPixelTransformParameterivEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glPixelTransformParameterfvEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterfvEXT"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_pixel_transform_color_table(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_shared_texture_palette(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_separate_specular_color(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_secondary_color(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_secondary_color + if ((GLeeFuncPtr_glSecondaryColor3bEXT = (GLEEPFNGLSECONDARYCOLOR3BEXTPROC) __GLeeGetProcAddress("glSecondaryColor3bEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3bvEXT = (GLEEPFNGLSECONDARYCOLOR3BVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3bvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3dEXT = (GLEEPFNGLSECONDARYCOLOR3DEXTPROC) __GLeeGetProcAddress("glSecondaryColor3dEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3dvEXT = (GLEEPFNGLSECONDARYCOLOR3DVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3dvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3fEXT = (GLEEPFNGLSECONDARYCOLOR3FEXTPROC) __GLeeGetProcAddress("glSecondaryColor3fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3fvEXT = (GLEEPFNGLSECONDARYCOLOR3FVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3iEXT = (GLEEPFNGLSECONDARYCOLOR3IEXTPROC) __GLeeGetProcAddress("glSecondaryColor3iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3ivEXT = (GLEEPFNGLSECONDARYCOLOR3IVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3sEXT = (GLEEPFNGLSECONDARYCOLOR3SEXTPROC) __GLeeGetProcAddress("glSecondaryColor3sEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3svEXT = (GLEEPFNGLSECONDARYCOLOR3SVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3svEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3ubEXT = (GLEEPFNGLSECONDARYCOLOR3UBEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ubEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3ubvEXT = (GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ubvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3uiEXT = (GLEEPFNGLSECONDARYCOLOR3UIEXTPROC) __GLeeGetProcAddress("glSecondaryColor3uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3uivEXT = (GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3usEXT = (GLEEPFNGLSECONDARYCOLOR3USEXTPROC) __GLeeGetProcAddress("glSecondaryColor3usEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3usvEXT = (GLEEPFNGLSECONDARYCOLOR3USVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3usvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColorPointerEXT = (GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC) __GLeeGetProcAddress("glSecondaryColorPointerEXT"))!=0) nLinked++; +#endif + if (nLinked==17) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_perturb_normal(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_texture_perturb_normal + if ((GLeeFuncPtr_glTextureNormalEXT = (GLEEPFNGLTEXTURENORMALEXTPROC) __GLeeGetProcAddress("glTextureNormalEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_multi_draw_arrays(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_multi_draw_arrays + if ((GLeeFuncPtr_glMultiDrawArraysEXT = (GLEEPFNGLMULTIDRAWARRAYSEXTPROC) __GLeeGetProcAddress("glMultiDrawArraysEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiDrawElementsEXT = (GLEEPFNGLMULTIDRAWELEMENTSEXTPROC) __GLeeGetProcAddress("glMultiDrawElementsEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_fog_coord(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_fog_coord + if ((GLeeFuncPtr_glFogCoordfEXT = (GLEEPFNGLFOGCOORDFEXTPROC) __GLeeGetProcAddress("glFogCoordfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordfvEXT = (GLEEPFNGLFOGCOORDFVEXTPROC) __GLeeGetProcAddress("glFogCoordfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoorddEXT = (GLEEPFNGLFOGCOORDDEXTPROC) __GLeeGetProcAddress("glFogCoorddEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoorddvEXT = (GLEEPFNGLFOGCOORDDVEXTPROC) __GLeeGetProcAddress("glFogCoorddvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordPointerEXT = (GLEEPFNGLFOGCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glFogCoordPointerEXT"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_REND_screen_coordinates(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_coordinate_frame(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_coordinate_frame + if ((GLeeFuncPtr_glTangent3bEXT = (GLEEPFNGLTANGENT3BEXTPROC) __GLeeGetProcAddress("glTangent3bEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3bvEXT = (GLEEPFNGLTANGENT3BVEXTPROC) __GLeeGetProcAddress("glTangent3bvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3dEXT = (GLEEPFNGLTANGENT3DEXTPROC) __GLeeGetProcAddress("glTangent3dEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3dvEXT = (GLEEPFNGLTANGENT3DVEXTPROC) __GLeeGetProcAddress("glTangent3dvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3fEXT = (GLEEPFNGLTANGENT3FEXTPROC) __GLeeGetProcAddress("glTangent3fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3fvEXT = (GLEEPFNGLTANGENT3FVEXTPROC) __GLeeGetProcAddress("glTangent3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3iEXT = (GLEEPFNGLTANGENT3IEXTPROC) __GLeeGetProcAddress("glTangent3iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3ivEXT = (GLEEPFNGLTANGENT3IVEXTPROC) __GLeeGetProcAddress("glTangent3ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3sEXT = (GLEEPFNGLTANGENT3SEXTPROC) __GLeeGetProcAddress("glTangent3sEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangent3svEXT = (GLEEPFNGLTANGENT3SVEXTPROC) __GLeeGetProcAddress("glTangent3svEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3bEXT = (GLEEPFNGLBINORMAL3BEXTPROC) __GLeeGetProcAddress("glBinormal3bEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3bvEXT = (GLEEPFNGLBINORMAL3BVEXTPROC) __GLeeGetProcAddress("glBinormal3bvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3dEXT = (GLEEPFNGLBINORMAL3DEXTPROC) __GLeeGetProcAddress("glBinormal3dEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3dvEXT = (GLEEPFNGLBINORMAL3DVEXTPROC) __GLeeGetProcAddress("glBinormal3dvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3fEXT = (GLEEPFNGLBINORMAL3FEXTPROC) __GLeeGetProcAddress("glBinormal3fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3fvEXT = (GLEEPFNGLBINORMAL3FVEXTPROC) __GLeeGetProcAddress("glBinormal3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3iEXT = (GLEEPFNGLBINORMAL3IEXTPROC) __GLeeGetProcAddress("glBinormal3iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3ivEXT = (GLEEPFNGLBINORMAL3IVEXTPROC) __GLeeGetProcAddress("glBinormal3ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3sEXT = (GLEEPFNGLBINORMAL3SEXTPROC) __GLeeGetProcAddress("glBinormal3sEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormal3svEXT = (GLEEPFNGLBINORMAL3SVEXTPROC) __GLeeGetProcAddress("glBinormal3svEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTangentPointerEXT = (GLEEPFNGLTANGENTPOINTEREXTPROC) __GLeeGetProcAddress("glTangentPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBinormalPointerEXT = (GLEEPFNGLBINORMALPOINTEREXTPROC) __GLeeGetProcAddress("glBinormalPointerEXT"))!=0) nLinked++; +#endif + if (nLinked==22) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_env_combine(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_APPLE_specular_vector(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_APPLE_transform_hint(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_fog_scale(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SUNX_constant_data(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SUNX_constant_data + if ((GLeeFuncPtr_glFinishTextureSUNX = (GLEEPFNGLFINISHTEXTURESUNXPROC) __GLeeGetProcAddress("glFinishTextureSUNX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SUN_global_alpha(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SUN_global_alpha + if ((GLeeFuncPtr_glGlobalAlphaFactorbSUN = (GLEEPFNGLGLOBALALPHAFACTORBSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorbSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactorsSUN = (GLEEPFNGLGLOBALALPHAFACTORSSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorsSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactoriSUN = (GLEEPFNGLGLOBALALPHAFACTORISUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactoriSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactorfSUN = (GLEEPFNGLGLOBALALPHAFACTORFSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorfSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactordSUN = (GLEEPFNGLGLOBALALPHAFACTORDSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactordSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactorubSUN = (GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorubSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactorusSUN = (GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorusSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glGlobalAlphaFactoruiSUN = (GLEEPFNGLGLOBALALPHAFACTORUISUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactoruiSUN"))!=0) nLinked++; +#endif + if (nLinked==8) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SUN_triangle_list(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SUN_triangle_list + if ((GLeeFuncPtr_glReplacementCodeuiSUN = (GLEEPFNGLREPLACEMENTCODEUISUNPROC) __GLeeGetProcAddress("glReplacementCodeuiSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeusSUN = (GLEEPFNGLREPLACEMENTCODEUSSUNPROC) __GLeeGetProcAddress("glReplacementCodeusSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeubSUN = (GLEEPFNGLREPLACEMENTCODEUBSUNPROC) __GLeeGetProcAddress("glReplacementCodeubSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuivSUN = (GLEEPFNGLREPLACEMENTCODEUIVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuivSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeusvSUN = (GLEEPFNGLREPLACEMENTCODEUSVSUNPROC) __GLeeGetProcAddress("glReplacementCodeusvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeubvSUN = (GLEEPFNGLREPLACEMENTCODEUBVSUNPROC) __GLeeGetProcAddress("glReplacementCodeubvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodePointerSUN = (GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC) __GLeeGetProcAddress("glReplacementCodePointerSUN"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SUN_vertex(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SUN_vertex + if ((GLeeFuncPtr_glColor4ubVertex2fSUN = (GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC) __GLeeGetProcAddress("glColor4ubVertex2fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4ubVertex2fvSUN = (GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC) __GLeeGetProcAddress("glColor4ubVertex2fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4ubVertex3fSUN = (GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor4ubVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4ubVertex3fvSUN = (GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor4ubVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor3fVertex3fSUN = (GLEEPFNGLCOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor3fVertex3fvSUN = (GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormal3fVertex3fSUN = (GLEEPFNGLNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormal3fVertex3fvSUN = (GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4fNormal3fVertex3fSUN = (GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor4fNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN = (GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fVertex3fSUN = (GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord4fVertex4fSUN = (GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC) __GLeeGetProcAddress("glTexCoord4fVertex4fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord4fVertex4fvSUN = (GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC) __GLeeGetProcAddress("glTexCoord4fVertex4fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4ubVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4ubVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN = (GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) __GLeeGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN = (GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) __GLeeGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4ubVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4ubVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN"))!=0) nLinked++; + if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN"))!=0) nLinked++; +#endif + if (nLinked==40) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_blend_func_separate(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_blend_func_separate + if ((GLeeFuncPtr_glBlendFuncSeparateEXT = (GLEEPFNGLBLENDFUNCSEPARATEEXTPROC) __GLeeGetProcAddress("glBlendFuncSeparateEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_INGR_color_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_INGR_interlace_read(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_stencil_wrap(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_422_pixels(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_texgen_reflection(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_cube_map(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SUN_convolution_border_modes(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_env_add(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_lod_bias(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_filter_anisotropic(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_vertex_weighting(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_vertex_weighting + if ((GLeeFuncPtr_glVertexWeightfEXT = (GLEEPFNGLVERTEXWEIGHTFEXTPROC) __GLeeGetProcAddress("glVertexWeightfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexWeightfvEXT = (GLEEPFNGLVERTEXWEIGHTFVEXTPROC) __GLeeGetProcAddress("glVertexWeightfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexWeightPointerEXT = (GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC) __GLeeGetProcAddress("glVertexWeightPointerEXT"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_light_max_exponent(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_array_range(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_vertex_array_range + if ((GLeeFuncPtr_glFlushVertexArrayRangeNV = (GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC) __GLeeGetProcAddress("glFlushVertexArrayRangeNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexArrayRangeNV = (GLEEPFNGLVERTEXARRAYRANGENVPROC) __GLeeGetProcAddress("glVertexArrayRangeNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_register_combiners(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_register_combiners + if ((GLeeFuncPtr_glCombinerParameterfvNV = (GLEEPFNGLCOMBINERPARAMETERFVNVPROC) __GLeeGetProcAddress("glCombinerParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glCombinerParameterfNV = (GLEEPFNGLCOMBINERPARAMETERFNVPROC) __GLeeGetProcAddress("glCombinerParameterfNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glCombinerParameterivNV = (GLEEPFNGLCOMBINERPARAMETERIVNVPROC) __GLeeGetProcAddress("glCombinerParameterivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glCombinerParameteriNV = (GLEEPFNGLCOMBINERPARAMETERINVPROC) __GLeeGetProcAddress("glCombinerParameteriNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glCombinerInputNV = (GLEEPFNGLCOMBINERINPUTNVPROC) __GLeeGetProcAddress("glCombinerInputNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glCombinerOutputNV = (GLEEPFNGLCOMBINEROUTPUTNVPROC) __GLeeGetProcAddress("glCombinerOutputNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glFinalCombinerInputNV = (GLEEPFNGLFINALCOMBINERINPUTNVPROC) __GLeeGetProcAddress("glFinalCombinerInputNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCombinerInputParameterfvNV = (GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerInputParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCombinerInputParameterivNV = (GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetCombinerInputParameterivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCombinerOutputParameterfvNV = (GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerOutputParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCombinerOutputParameterivNV = (GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetCombinerOutputParameterivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV = (GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetFinalCombinerInputParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFinalCombinerInputParameterivNV = (GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetFinalCombinerInputParameterivNV"))!=0) nLinked++; +#endif + if (nLinked==13) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_fog_distance(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_texgen_emboss(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_blend_square(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_texture_env_combine4(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_MESA_resize_buffers(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_MESA_resize_buffers + if ((GLeeFuncPtr_glResizeBuffersMESA = (GLEEPFNGLRESIZEBUFFERSMESAPROC) __GLeeGetProcAddress("glResizeBuffersMESA"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_MESA_window_pos(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_MESA_window_pos + if ((GLeeFuncPtr_glWindowPos2dMESA = (GLEEPFNGLWINDOWPOS2DMESAPROC) __GLeeGetProcAddress("glWindowPos2dMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2dvMESA = (GLEEPFNGLWINDOWPOS2DVMESAPROC) __GLeeGetProcAddress("glWindowPos2dvMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2fMESA = (GLEEPFNGLWINDOWPOS2FMESAPROC) __GLeeGetProcAddress("glWindowPos2fMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2fvMESA = (GLEEPFNGLWINDOWPOS2FVMESAPROC) __GLeeGetProcAddress("glWindowPos2fvMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2iMESA = (GLEEPFNGLWINDOWPOS2IMESAPROC) __GLeeGetProcAddress("glWindowPos2iMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2ivMESA = (GLEEPFNGLWINDOWPOS2IVMESAPROC) __GLeeGetProcAddress("glWindowPos2ivMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2sMESA = (GLEEPFNGLWINDOWPOS2SMESAPROC) __GLeeGetProcAddress("glWindowPos2sMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos2svMESA = (GLEEPFNGLWINDOWPOS2SVMESAPROC) __GLeeGetProcAddress("glWindowPos2svMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3dMESA = (GLEEPFNGLWINDOWPOS3DMESAPROC) __GLeeGetProcAddress("glWindowPos3dMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3dvMESA = (GLEEPFNGLWINDOWPOS3DVMESAPROC) __GLeeGetProcAddress("glWindowPos3dvMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3fMESA = (GLEEPFNGLWINDOWPOS3FMESAPROC) __GLeeGetProcAddress("glWindowPos3fMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3fvMESA = (GLEEPFNGLWINDOWPOS3FVMESAPROC) __GLeeGetProcAddress("glWindowPos3fvMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3iMESA = (GLEEPFNGLWINDOWPOS3IMESAPROC) __GLeeGetProcAddress("glWindowPos3iMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3ivMESA = (GLEEPFNGLWINDOWPOS3IVMESAPROC) __GLeeGetProcAddress("glWindowPos3ivMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3sMESA = (GLEEPFNGLWINDOWPOS3SMESAPROC) __GLeeGetProcAddress("glWindowPos3sMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos3svMESA = (GLEEPFNGLWINDOWPOS3SVMESAPROC) __GLeeGetProcAddress("glWindowPos3svMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4dMESA = (GLEEPFNGLWINDOWPOS4DMESAPROC) __GLeeGetProcAddress("glWindowPos4dMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4dvMESA = (GLEEPFNGLWINDOWPOS4DVMESAPROC) __GLeeGetProcAddress("glWindowPos4dvMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4fMESA = (GLEEPFNGLWINDOWPOS4FMESAPROC) __GLeeGetProcAddress("glWindowPos4fMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4fvMESA = (GLEEPFNGLWINDOWPOS4FVMESAPROC) __GLeeGetProcAddress("glWindowPos4fvMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4iMESA = (GLEEPFNGLWINDOWPOS4IMESAPROC) __GLeeGetProcAddress("glWindowPos4iMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4ivMESA = (GLEEPFNGLWINDOWPOS4IVMESAPROC) __GLeeGetProcAddress("glWindowPos4ivMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4sMESA = (GLEEPFNGLWINDOWPOS4SMESAPROC) __GLeeGetProcAddress("glWindowPos4sMESA"))!=0) nLinked++; + if ((GLeeFuncPtr_glWindowPos4svMESA = (GLEEPFNGLWINDOWPOS4SVMESAPROC) __GLeeGetProcAddress("glWindowPos4svMESA"))!=0) nLinked++; +#endif + if (nLinked==24) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_compression_s3tc(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_IBM_cull_vertex(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_IBM_multimode_draw_arrays(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_IBM_multimode_draw_arrays + if ((GLeeFuncPtr_glMultiModeDrawArraysIBM = (GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC) __GLeeGetProcAddress("glMultiModeDrawArraysIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiModeDrawElementsIBM = (GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC) __GLeeGetProcAddress("glMultiModeDrawElementsIBM"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_IBM_vertex_array_lists(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_IBM_vertex_array_lists + if ((GLeeFuncPtr_glColorPointerListIBM = (GLEEPFNGLCOLORPOINTERLISTIBMPROC) __GLeeGetProcAddress("glColorPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColorPointerListIBM = (GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC) __GLeeGetProcAddress("glSecondaryColorPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glEdgeFlagPointerListIBM = (GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC) __GLeeGetProcAddress("glEdgeFlagPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordPointerListIBM = (GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC) __GLeeGetProcAddress("glFogCoordPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glIndexPointerListIBM = (GLEEPFNGLINDEXPOINTERLISTIBMPROC) __GLeeGetProcAddress("glIndexPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalPointerListIBM = (GLEEPFNGLNORMALPOINTERLISTIBMPROC) __GLeeGetProcAddress("glNormalPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoordPointerListIBM = (GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC) __GLeeGetProcAddress("glTexCoordPointerListIBM"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexPointerListIBM = (GLEEPFNGLVERTEXPOINTERLISTIBMPROC) __GLeeGetProcAddress("glVertexPointerListIBM"))!=0) nLinked++; +#endif + if (nLinked==8) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_subsample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_ycrcb_subsample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_ycrcba(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGI_depth_pass_instrument(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_3DFX_texture_compression_FXT1(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_3DFX_tbuffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_3DFX_tbuffer + if ((GLeeFuncPtr_glTbufferMask3DFX = (GLEEPFNGLTBUFFERMASK3DFXPROC) __GLeeGetProcAddress("glTbufferMask3DFX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_multisample(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_multisample + if ((GLeeFuncPtr_glSampleMaskEXT = (GLEEPFNGLSAMPLEMASKEXTPROC) __GLeeGetProcAddress("glSampleMaskEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSamplePatternEXT = (GLEEPFNGLSAMPLEPATTERNEXTPROC) __GLeeGetProcAddress("glSamplePatternEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_vertex_preclip(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_convolution_accuracy(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_resample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_point_line_texgen(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIS_texture_color_mask(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIS_texture_color_mask + if ((GLeeFuncPtr_glTextureColorMaskSGIS = (GLEEPFNGLTEXTURECOLORMASKSGISPROC) __GLeeGetProcAddress("glTextureColorMaskSGIS"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_env_dot3(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ATI_texture_mirror_once(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_fence(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_fence + if ((GLeeFuncPtr_glDeleteFencesNV = (GLEEPFNGLDELETEFENCESNVPROC) __GLeeGetProcAddress("glDeleteFencesNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenFencesNV = (GLEEPFNGLGENFENCESNVPROC) __GLeeGetProcAddress("glGenFencesNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsFenceNV = (GLEEPFNGLISFENCENVPROC) __GLeeGetProcAddress("glIsFenceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTestFenceNV = (GLEEPFNGLTESTFENCENVPROC) __GLeeGetProcAddress("glTestFenceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFenceivNV = (GLEEPFNGLGETFENCEIVNVPROC) __GLeeGetProcAddress("glGetFenceivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glFinishFenceNV = (GLEEPFNGLFINISHFENCENVPROC) __GLeeGetProcAddress("glFinishFenceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glSetFenceNV = (GLEEPFNGLSETFENCENVPROC) __GLeeGetProcAddress("glSetFenceNV"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_IBM_texture_mirrored_repeat(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_evaluators(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_evaluators + if ((GLeeFuncPtr_glMapControlPointsNV = (GLEEPFNGLMAPCONTROLPOINTSNVPROC) __GLeeGetProcAddress("glMapControlPointsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMapParameterivNV = (GLEEPFNGLMAPPARAMETERIVNVPROC) __GLeeGetProcAddress("glMapParameterivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMapParameterfvNV = (GLEEPFNGLMAPPARAMETERFVNVPROC) __GLeeGetProcAddress("glMapParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMapControlPointsNV = (GLEEPFNGLGETMAPCONTROLPOINTSNVPROC) __GLeeGetProcAddress("glGetMapControlPointsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMapParameterivNV = (GLEEPFNGLGETMAPPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetMapParameterivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMapParameterfvNV = (GLEEPFNGLGETMAPPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetMapParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMapAttribParameterivNV = (GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetMapAttribParameterivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMapAttribParameterfvNV = (GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetMapAttribParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glEvalMapsNV = (GLEEPFNGLEVALMAPSNVPROC) __GLeeGetProcAddress("glEvalMapsNV"))!=0) nLinked++; +#endif + if (nLinked==9) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_packed_depth_stencil(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_register_combiners2(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_register_combiners2 + if ((GLeeFuncPtr_glCombinerStageParameterfvNV = (GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC) __GLeeGetProcAddress("glCombinerStageParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCombinerStageParameterfvNV = (GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerStageParameterfvNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_texture_compression_vtc(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_texture_rectangle(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_texture_shader(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_texture_shader2(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_array_range2(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_program(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_vertex_program + if ((GLeeFuncPtr_glAreProgramsResidentNV = (GLEEPFNGLAREPROGRAMSRESIDENTNVPROC) __GLeeGetProcAddress("glAreProgramsResidentNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindProgramNV = (GLEEPFNGLBINDPROGRAMNVPROC) __GLeeGetProcAddress("glBindProgramNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteProgramsNV = (GLEEPFNGLDELETEPROGRAMSNVPROC) __GLeeGetProcAddress("glDeleteProgramsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glExecuteProgramNV = (GLEEPFNGLEXECUTEPROGRAMNVPROC) __GLeeGetProcAddress("glExecuteProgramNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenProgramsNV = (GLEEPFNGLGENPROGRAMSNVPROC) __GLeeGetProcAddress("glGenProgramsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramParameterdvNV = (GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC) __GLeeGetProcAddress("glGetProgramParameterdvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramParameterfvNV = (GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetProgramParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramivNV = (GLEEPFNGLGETPROGRAMIVNVPROC) __GLeeGetProcAddress("glGetProgramivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramStringNV = (GLEEPFNGLGETPROGRAMSTRINGNVPROC) __GLeeGetProcAddress("glGetProgramStringNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTrackMatrixivNV = (GLEEPFNGLGETTRACKMATRIXIVNVPROC) __GLeeGetProcAddress("glGetTrackMatrixivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribdvNV = (GLEEPFNGLGETVERTEXATTRIBDVNVPROC) __GLeeGetProcAddress("glGetVertexAttribdvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribfvNV = (GLEEPFNGLGETVERTEXATTRIBFVNVPROC) __GLeeGetProcAddress("glGetVertexAttribfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribivNV = (GLEEPFNGLGETVERTEXATTRIBIVNVPROC) __GLeeGetProcAddress("glGetVertexAttribivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribPointervNV = (GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC) __GLeeGetProcAddress("glGetVertexAttribPointervNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsProgramNV = (GLEEPFNGLISPROGRAMNVPROC) __GLeeGetProcAddress("glIsProgramNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glLoadProgramNV = (GLEEPFNGLLOADPROGRAMNVPROC) __GLeeGetProcAddress("glLoadProgramNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramParameter4dNV = (GLEEPFNGLPROGRAMPARAMETER4DNVPROC) __GLeeGetProcAddress("glProgramParameter4dNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramParameter4dvNV = (GLEEPFNGLPROGRAMPARAMETER4DVNVPROC) __GLeeGetProcAddress("glProgramParameter4dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramParameter4fNV = (GLEEPFNGLPROGRAMPARAMETER4FNVPROC) __GLeeGetProcAddress("glProgramParameter4fNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramParameter4fvNV = (GLEEPFNGLPROGRAMPARAMETER4FVNVPROC) __GLeeGetProcAddress("glProgramParameter4fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramParameters4dvNV = (GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC) __GLeeGetProcAddress("glProgramParameters4dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramParameters4fvNV = (GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC) __GLeeGetProcAddress("glProgramParameters4fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glRequestResidentProgramsNV = (GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC) __GLeeGetProcAddress("glRequestResidentProgramsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTrackMatrixNV = (GLEEPFNGLTRACKMATRIXNVPROC) __GLeeGetProcAddress("glTrackMatrixNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribPointerNV = (GLEEPFNGLVERTEXATTRIBPOINTERNVPROC) __GLeeGetProcAddress("glVertexAttribPointerNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1dNV = (GLEEPFNGLVERTEXATTRIB1DNVPROC) __GLeeGetProcAddress("glVertexAttrib1dNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1dvNV = (GLEEPFNGLVERTEXATTRIB1DVNVPROC) __GLeeGetProcAddress("glVertexAttrib1dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1fNV = (GLEEPFNGLVERTEXATTRIB1FNVPROC) __GLeeGetProcAddress("glVertexAttrib1fNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1fvNV = (GLEEPFNGLVERTEXATTRIB1FVNVPROC) __GLeeGetProcAddress("glVertexAttrib1fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1sNV = (GLEEPFNGLVERTEXATTRIB1SNVPROC) __GLeeGetProcAddress("glVertexAttrib1sNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1svNV = (GLEEPFNGLVERTEXATTRIB1SVNVPROC) __GLeeGetProcAddress("glVertexAttrib1svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2dNV = (GLEEPFNGLVERTEXATTRIB2DNVPROC) __GLeeGetProcAddress("glVertexAttrib2dNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2dvNV = (GLEEPFNGLVERTEXATTRIB2DVNVPROC) __GLeeGetProcAddress("glVertexAttrib2dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2fNV = (GLEEPFNGLVERTEXATTRIB2FNVPROC) __GLeeGetProcAddress("glVertexAttrib2fNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2fvNV = (GLEEPFNGLVERTEXATTRIB2FVNVPROC) __GLeeGetProcAddress("glVertexAttrib2fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2sNV = (GLEEPFNGLVERTEXATTRIB2SNVPROC) __GLeeGetProcAddress("glVertexAttrib2sNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2svNV = (GLEEPFNGLVERTEXATTRIB2SVNVPROC) __GLeeGetProcAddress("glVertexAttrib2svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3dNV = (GLEEPFNGLVERTEXATTRIB3DNVPROC) __GLeeGetProcAddress("glVertexAttrib3dNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3dvNV = (GLEEPFNGLVERTEXATTRIB3DVNVPROC) __GLeeGetProcAddress("glVertexAttrib3dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3fNV = (GLEEPFNGLVERTEXATTRIB3FNVPROC) __GLeeGetProcAddress("glVertexAttrib3fNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3fvNV = (GLEEPFNGLVERTEXATTRIB3FVNVPROC) __GLeeGetProcAddress("glVertexAttrib3fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3sNV = (GLEEPFNGLVERTEXATTRIB3SNVPROC) __GLeeGetProcAddress("glVertexAttrib3sNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3svNV = (GLEEPFNGLVERTEXATTRIB3SVNVPROC) __GLeeGetProcAddress("glVertexAttrib3svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4dNV = (GLEEPFNGLVERTEXATTRIB4DNVPROC) __GLeeGetProcAddress("glVertexAttrib4dNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4dvNV = (GLEEPFNGLVERTEXATTRIB4DVNVPROC) __GLeeGetProcAddress("glVertexAttrib4dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4fNV = (GLEEPFNGLVERTEXATTRIB4FNVPROC) __GLeeGetProcAddress("glVertexAttrib4fNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4fvNV = (GLEEPFNGLVERTEXATTRIB4FVNVPROC) __GLeeGetProcAddress("glVertexAttrib4fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4sNV = (GLEEPFNGLVERTEXATTRIB4SNVPROC) __GLeeGetProcAddress("glVertexAttrib4sNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4svNV = (GLEEPFNGLVERTEXATTRIB4SVNVPROC) __GLeeGetProcAddress("glVertexAttrib4svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4ubNV = (GLEEPFNGLVERTEXATTRIB4UBNVPROC) __GLeeGetProcAddress("glVertexAttrib4ubNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4ubvNV = (GLEEPFNGLVERTEXATTRIB4UBVNVPROC) __GLeeGetProcAddress("glVertexAttrib4ubvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs1dvNV = (GLEEPFNGLVERTEXATTRIBS1DVNVPROC) __GLeeGetProcAddress("glVertexAttribs1dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs1fvNV = (GLEEPFNGLVERTEXATTRIBS1FVNVPROC) __GLeeGetProcAddress("glVertexAttribs1fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs1svNV = (GLEEPFNGLVERTEXATTRIBS1SVNVPROC) __GLeeGetProcAddress("glVertexAttribs1svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs2dvNV = (GLEEPFNGLVERTEXATTRIBS2DVNVPROC) __GLeeGetProcAddress("glVertexAttribs2dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs2fvNV = (GLEEPFNGLVERTEXATTRIBS2FVNVPROC) __GLeeGetProcAddress("glVertexAttribs2fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs2svNV = (GLEEPFNGLVERTEXATTRIBS2SVNVPROC) __GLeeGetProcAddress("glVertexAttribs2svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs3dvNV = (GLEEPFNGLVERTEXATTRIBS3DVNVPROC) __GLeeGetProcAddress("glVertexAttribs3dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs3fvNV = (GLEEPFNGLVERTEXATTRIBS3FVNVPROC) __GLeeGetProcAddress("glVertexAttribs3fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs3svNV = (GLEEPFNGLVERTEXATTRIBS3SVNVPROC) __GLeeGetProcAddress("glVertexAttribs3svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs4dvNV = (GLEEPFNGLVERTEXATTRIBS4DVNVPROC) __GLeeGetProcAddress("glVertexAttribs4dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs4fvNV = (GLEEPFNGLVERTEXATTRIBS4FVNVPROC) __GLeeGetProcAddress("glVertexAttribs4fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs4svNV = (GLEEPFNGLVERTEXATTRIBS4SVNVPROC) __GLeeGetProcAddress("glVertexAttribs4svNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs4ubvNV = (GLEEPFNGLVERTEXATTRIBS4UBVNVPROC) __GLeeGetProcAddress("glVertexAttribs4ubvNV"))!=0) nLinked++; +#endif + if (nLinked==64) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_texture_coordinate_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_scalebias_hint(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_OML_interlace(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_OML_subsample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_OML_resample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_copy_depth_to_color(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ATI_envmap_bumpmap(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_envmap_bumpmap + if ((GLeeFuncPtr_glTexBumpParameterivATI = (GLEEPFNGLTEXBUMPPARAMETERIVATIPROC) __GLeeGetProcAddress("glTexBumpParameterivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexBumpParameterfvATI = (GLEEPFNGLTEXBUMPPARAMETERFVATIPROC) __GLeeGetProcAddress("glTexBumpParameterfvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTexBumpParameterivATI = (GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC) __GLeeGetProcAddress("glGetTexBumpParameterivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTexBumpParameterfvATI = (GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC) __GLeeGetProcAddress("glGetTexBumpParameterfvATI"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_fragment_shader(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_fragment_shader + if ((GLeeFuncPtr_glGenFragmentShadersATI = (GLEEPFNGLGENFRAGMENTSHADERSATIPROC) __GLeeGetProcAddress("glGenFragmentShadersATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindFragmentShaderATI = (GLEEPFNGLBINDFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glBindFragmentShaderATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteFragmentShaderATI = (GLEEPFNGLDELETEFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glDeleteFragmentShaderATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glBeginFragmentShaderATI = (GLEEPFNGLBEGINFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glBeginFragmentShaderATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndFragmentShaderATI = (GLEEPFNGLENDFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glEndFragmentShaderATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glPassTexCoordATI = (GLEEPFNGLPASSTEXCOORDATIPROC) __GLeeGetProcAddress("glPassTexCoordATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glSampleMapATI = (GLEEPFNGLSAMPLEMAPATIPROC) __GLeeGetProcAddress("glSampleMapATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorFragmentOp1ATI = (GLEEPFNGLCOLORFRAGMENTOP1ATIPROC) __GLeeGetProcAddress("glColorFragmentOp1ATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorFragmentOp2ATI = (GLEEPFNGLCOLORFRAGMENTOP2ATIPROC) __GLeeGetProcAddress("glColorFragmentOp2ATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glColorFragmentOp3ATI = (GLEEPFNGLCOLORFRAGMENTOP3ATIPROC) __GLeeGetProcAddress("glColorFragmentOp3ATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glAlphaFragmentOp1ATI = (GLEEPFNGLALPHAFRAGMENTOP1ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp1ATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glAlphaFragmentOp2ATI = (GLEEPFNGLALPHAFRAGMENTOP2ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp2ATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glAlphaFragmentOp3ATI = (GLEEPFNGLALPHAFRAGMENTOP3ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp3ATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glSetFragmentShaderConstantATI = (GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC) __GLeeGetProcAddress("glSetFragmentShaderConstantATI"))!=0) nLinked++; +#endif + if (nLinked==14) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_pn_triangles(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_pn_triangles + if ((GLeeFuncPtr_glPNTrianglesiATI = (GLEEPFNGLPNTRIANGLESIATIPROC) __GLeeGetProcAddress("glPNTrianglesiATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glPNTrianglesfATI = (GLEEPFNGLPNTRIANGLESFATIPROC) __GLeeGetProcAddress("glPNTrianglesfATI"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_vertex_array_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_vertex_array_object + if ((GLeeFuncPtr_glNewObjectBufferATI = (GLEEPFNGLNEWOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glNewObjectBufferATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsObjectBufferATI = (GLEEPFNGLISOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glIsObjectBufferATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glUpdateObjectBufferATI = (GLEEPFNGLUPDATEOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glUpdateObjectBufferATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetObjectBufferfvATI = (GLEEPFNGLGETOBJECTBUFFERFVATIPROC) __GLeeGetProcAddress("glGetObjectBufferfvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetObjectBufferivATI = (GLEEPFNGLGETOBJECTBUFFERIVATIPROC) __GLeeGetProcAddress("glGetObjectBufferivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glFreeObjectBufferATI = (GLEEPFNGLFREEOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glFreeObjectBufferATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glArrayObjectATI = (GLEEPFNGLARRAYOBJECTATIPROC) __GLeeGetProcAddress("glArrayObjectATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetArrayObjectfvATI = (GLEEPFNGLGETARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetArrayObjectfvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetArrayObjectivATI = (GLEEPFNGLGETARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetArrayObjectivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantArrayObjectATI = (GLEEPFNGLVARIANTARRAYOBJECTATIPROC) __GLeeGetProcAddress("glVariantArrayObjectATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVariantArrayObjectfvATI = (GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetVariantArrayObjectfvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVariantArrayObjectivATI = (GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetVariantArrayObjectivATI"))!=0) nLinked++; +#endif + if (nLinked==12) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_vertex_shader(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_vertex_shader + if ((GLeeFuncPtr_glBeginVertexShaderEXT = (GLEEPFNGLBEGINVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glBeginVertexShaderEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndVertexShaderEXT = (GLEEPFNGLENDVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glEndVertexShaderEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindVertexShaderEXT = (GLEEPFNGLBINDVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glBindVertexShaderEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenVertexShadersEXT = (GLEEPFNGLGENVERTEXSHADERSEXTPROC) __GLeeGetProcAddress("glGenVertexShadersEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteVertexShaderEXT = (GLEEPFNGLDELETEVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glDeleteVertexShaderEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glShaderOp1EXT = (GLEEPFNGLSHADEROP1EXTPROC) __GLeeGetProcAddress("glShaderOp1EXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glShaderOp2EXT = (GLEEPFNGLSHADEROP2EXTPROC) __GLeeGetProcAddress("glShaderOp2EXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glShaderOp3EXT = (GLEEPFNGLSHADEROP3EXTPROC) __GLeeGetProcAddress("glShaderOp3EXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSwizzleEXT = (GLEEPFNGLSWIZZLEEXTPROC) __GLeeGetProcAddress("glSwizzleEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glWriteMaskEXT = (GLEEPFNGLWRITEMASKEXTPROC) __GLeeGetProcAddress("glWriteMaskEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glInsertComponentEXT = (GLEEPFNGLINSERTCOMPONENTEXTPROC) __GLeeGetProcAddress("glInsertComponentEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glExtractComponentEXT = (GLEEPFNGLEXTRACTCOMPONENTEXTPROC) __GLeeGetProcAddress("glExtractComponentEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenSymbolsEXT = (GLEEPFNGLGENSYMBOLSEXTPROC) __GLeeGetProcAddress("glGenSymbolsEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSetInvariantEXT = (GLEEPFNGLSETINVARIANTEXTPROC) __GLeeGetProcAddress("glSetInvariantEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glSetLocalConstantEXT = (GLEEPFNGLSETLOCALCONSTANTEXTPROC) __GLeeGetProcAddress("glSetLocalConstantEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantbvEXT = (GLEEPFNGLVARIANTBVEXTPROC) __GLeeGetProcAddress("glVariantbvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantsvEXT = (GLEEPFNGLVARIANTSVEXTPROC) __GLeeGetProcAddress("glVariantsvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantivEXT = (GLEEPFNGLVARIANTIVEXTPROC) __GLeeGetProcAddress("glVariantivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantfvEXT = (GLEEPFNGLVARIANTFVEXTPROC) __GLeeGetProcAddress("glVariantfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantdvEXT = (GLEEPFNGLVARIANTDVEXTPROC) __GLeeGetProcAddress("glVariantdvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantubvEXT = (GLEEPFNGLVARIANTUBVEXTPROC) __GLeeGetProcAddress("glVariantubvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantusvEXT = (GLEEPFNGLVARIANTUSVEXTPROC) __GLeeGetProcAddress("glVariantusvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantuivEXT = (GLEEPFNGLVARIANTUIVEXTPROC) __GLeeGetProcAddress("glVariantuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVariantPointerEXT = (GLEEPFNGLVARIANTPOINTEREXTPROC) __GLeeGetProcAddress("glVariantPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEnableVariantClientStateEXT = (GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC) __GLeeGetProcAddress("glEnableVariantClientStateEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDisableVariantClientStateEXT = (GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) __GLeeGetProcAddress("glDisableVariantClientStateEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindLightParameterEXT = (GLEEPFNGLBINDLIGHTPARAMETEREXTPROC) __GLeeGetProcAddress("glBindLightParameterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindMaterialParameterEXT = (GLEEPFNGLBINDMATERIALPARAMETEREXTPROC) __GLeeGetProcAddress("glBindMaterialParameterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindTexGenParameterEXT = (GLEEPFNGLBINDTEXGENPARAMETEREXTPROC) __GLeeGetProcAddress("glBindTexGenParameterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindTextureUnitParameterEXT = (GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC) __GLeeGetProcAddress("glBindTextureUnitParameterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindParameterEXT = (GLEEPFNGLBINDPARAMETEREXTPROC) __GLeeGetProcAddress("glBindParameterEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsVariantEnabledEXT = (GLEEPFNGLISVARIANTENABLEDEXTPROC) __GLeeGetProcAddress("glIsVariantEnabledEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVariantBooleanvEXT = (GLEEPFNGLGETVARIANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetVariantBooleanvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVariantIntegervEXT = (GLEEPFNGLGETVARIANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetVariantIntegervEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVariantFloatvEXT = (GLEEPFNGLGETVARIANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetVariantFloatvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVariantPointervEXT = (GLEEPFNGLGETVARIANTPOINTERVEXTPROC) __GLeeGetProcAddress("glGetVariantPointervEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetInvariantBooleanvEXT = (GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetInvariantBooleanvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetInvariantIntegervEXT = (GLEEPFNGLGETINVARIANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetInvariantIntegervEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetInvariantFloatvEXT = (GLEEPFNGLGETINVARIANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetInvariantFloatvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetLocalConstantBooleanvEXT = (GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantBooleanvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetLocalConstantIntegervEXT = (GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantIntegervEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetLocalConstantFloatvEXT = (GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantFloatvEXT"))!=0) nLinked++; +#endif + if (nLinked==42) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_vertex_streams(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_vertex_streams + if ((GLeeFuncPtr_glVertexStream1sATI = (GLEEPFNGLVERTEXSTREAM1SATIPROC) __GLeeGetProcAddress("glVertexStream1sATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1svATI = (GLEEPFNGLVERTEXSTREAM1SVATIPROC) __GLeeGetProcAddress("glVertexStream1svATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1iATI = (GLEEPFNGLVERTEXSTREAM1IATIPROC) __GLeeGetProcAddress("glVertexStream1iATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1ivATI = (GLEEPFNGLVERTEXSTREAM1IVATIPROC) __GLeeGetProcAddress("glVertexStream1ivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1fATI = (GLEEPFNGLVERTEXSTREAM1FATIPROC) __GLeeGetProcAddress("glVertexStream1fATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1fvATI = (GLEEPFNGLVERTEXSTREAM1FVATIPROC) __GLeeGetProcAddress("glVertexStream1fvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1dATI = (GLEEPFNGLVERTEXSTREAM1DATIPROC) __GLeeGetProcAddress("glVertexStream1dATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream1dvATI = (GLEEPFNGLVERTEXSTREAM1DVATIPROC) __GLeeGetProcAddress("glVertexStream1dvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2sATI = (GLEEPFNGLVERTEXSTREAM2SATIPROC) __GLeeGetProcAddress("glVertexStream2sATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2svATI = (GLEEPFNGLVERTEXSTREAM2SVATIPROC) __GLeeGetProcAddress("glVertexStream2svATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2iATI = (GLEEPFNGLVERTEXSTREAM2IATIPROC) __GLeeGetProcAddress("glVertexStream2iATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2ivATI = (GLEEPFNGLVERTEXSTREAM2IVATIPROC) __GLeeGetProcAddress("glVertexStream2ivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2fATI = (GLEEPFNGLVERTEXSTREAM2FATIPROC) __GLeeGetProcAddress("glVertexStream2fATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2fvATI = (GLEEPFNGLVERTEXSTREAM2FVATIPROC) __GLeeGetProcAddress("glVertexStream2fvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2dATI = (GLEEPFNGLVERTEXSTREAM2DATIPROC) __GLeeGetProcAddress("glVertexStream2dATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream2dvATI = (GLEEPFNGLVERTEXSTREAM2DVATIPROC) __GLeeGetProcAddress("glVertexStream2dvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3sATI = (GLEEPFNGLVERTEXSTREAM3SATIPROC) __GLeeGetProcAddress("glVertexStream3sATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3svATI = (GLEEPFNGLVERTEXSTREAM3SVATIPROC) __GLeeGetProcAddress("glVertexStream3svATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3iATI = (GLEEPFNGLVERTEXSTREAM3IATIPROC) __GLeeGetProcAddress("glVertexStream3iATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3ivATI = (GLEEPFNGLVERTEXSTREAM3IVATIPROC) __GLeeGetProcAddress("glVertexStream3ivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3fATI = (GLEEPFNGLVERTEXSTREAM3FATIPROC) __GLeeGetProcAddress("glVertexStream3fATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3fvATI = (GLEEPFNGLVERTEXSTREAM3FVATIPROC) __GLeeGetProcAddress("glVertexStream3fvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3dATI = (GLEEPFNGLVERTEXSTREAM3DATIPROC) __GLeeGetProcAddress("glVertexStream3dATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream3dvATI = (GLEEPFNGLVERTEXSTREAM3DVATIPROC) __GLeeGetProcAddress("glVertexStream3dvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4sATI = (GLEEPFNGLVERTEXSTREAM4SATIPROC) __GLeeGetProcAddress("glVertexStream4sATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4svATI = (GLEEPFNGLVERTEXSTREAM4SVATIPROC) __GLeeGetProcAddress("glVertexStream4svATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4iATI = (GLEEPFNGLVERTEXSTREAM4IATIPROC) __GLeeGetProcAddress("glVertexStream4iATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4ivATI = (GLEEPFNGLVERTEXSTREAM4IVATIPROC) __GLeeGetProcAddress("glVertexStream4ivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4fATI = (GLEEPFNGLVERTEXSTREAM4FATIPROC) __GLeeGetProcAddress("glVertexStream4fATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4fvATI = (GLEEPFNGLVERTEXSTREAM4FVATIPROC) __GLeeGetProcAddress("glVertexStream4fvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4dATI = (GLEEPFNGLVERTEXSTREAM4DATIPROC) __GLeeGetProcAddress("glVertexStream4dATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexStream4dvATI = (GLEEPFNGLVERTEXSTREAM4DVATIPROC) __GLeeGetProcAddress("glVertexStream4dvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3bATI = (GLEEPFNGLNORMALSTREAM3BATIPROC) __GLeeGetProcAddress("glNormalStream3bATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3bvATI = (GLEEPFNGLNORMALSTREAM3BVATIPROC) __GLeeGetProcAddress("glNormalStream3bvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3sATI = (GLEEPFNGLNORMALSTREAM3SATIPROC) __GLeeGetProcAddress("glNormalStream3sATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3svATI = (GLEEPFNGLNORMALSTREAM3SVATIPROC) __GLeeGetProcAddress("glNormalStream3svATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3iATI = (GLEEPFNGLNORMALSTREAM3IATIPROC) __GLeeGetProcAddress("glNormalStream3iATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3ivATI = (GLEEPFNGLNORMALSTREAM3IVATIPROC) __GLeeGetProcAddress("glNormalStream3ivATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3fATI = (GLEEPFNGLNORMALSTREAM3FATIPROC) __GLeeGetProcAddress("glNormalStream3fATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3fvATI = (GLEEPFNGLNORMALSTREAM3FVATIPROC) __GLeeGetProcAddress("glNormalStream3fvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3dATI = (GLEEPFNGLNORMALSTREAM3DATIPROC) __GLeeGetProcAddress("glNormalStream3dATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormalStream3dvATI = (GLEEPFNGLNORMALSTREAM3DVATIPROC) __GLeeGetProcAddress("glNormalStream3dvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glClientActiveVertexStreamATI = (GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) __GLeeGetProcAddress("glClientActiveVertexStreamATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexBlendEnviATI = (GLEEPFNGLVERTEXBLENDENVIATIPROC) __GLeeGetProcAddress("glVertexBlendEnviATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexBlendEnvfATI = (GLEEPFNGLVERTEXBLENDENVFATIPROC) __GLeeGetProcAddress("glVertexBlendEnvfATI"))!=0) nLinked++; +#endif + if (nLinked==45) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_element_array(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_element_array + if ((GLeeFuncPtr_glElementPointerATI = (GLEEPFNGLELEMENTPOINTERATIPROC) __GLeeGetProcAddress("glElementPointerATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawElementArrayATI = (GLEEPFNGLDRAWELEMENTARRAYATIPROC) __GLeeGetProcAddress("glDrawElementArrayATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawRangeElementArrayATI = (GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC) __GLeeGetProcAddress("glDrawRangeElementArrayATI"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SUN_mesh_array(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SUN_mesh_array + if ((GLeeFuncPtr_glDrawMeshArraysSUN = (GLEEPFNGLDRAWMESHARRAYSSUNPROC) __GLeeGetProcAddress("glDrawMeshArraysSUN"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SUN_slice_accum(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_multisample_filter_hint(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_depth_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_occlusion_query(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_occlusion_query + if ((GLeeFuncPtr_glGenOcclusionQueriesNV = (GLEEPFNGLGENOCCLUSIONQUERIESNVPROC) __GLeeGetProcAddress("glGenOcclusionQueriesNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteOcclusionQueriesNV = (GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC) __GLeeGetProcAddress("glDeleteOcclusionQueriesNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsOcclusionQueryNV = (GLEEPFNGLISOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glIsOcclusionQueryNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glBeginOcclusionQueryNV = (GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glBeginOcclusionQueryNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndOcclusionQueryNV = (GLEEPFNGLENDOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glEndOcclusionQueryNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetOcclusionQueryivNV = (GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC) __GLeeGetProcAddress("glGetOcclusionQueryivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetOcclusionQueryuivNV = (GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC) __GLeeGetProcAddress("glGetOcclusionQueryuivNV"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_point_sprite(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_point_sprite + if ((GLeeFuncPtr_glPointParameteriNV = (GLEEPFNGLPOINTPARAMETERINVPROC) __GLeeGetProcAddress("glPointParameteriNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glPointParameterivNV = (GLEEPFNGLPOINTPARAMETERIVNVPROC) __GLeeGetProcAddress("glPointParameterivNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_texture_shader3(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_program1_1(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_shadow_funcs(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_stencil_two_side(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_stencil_two_side + if ((GLeeFuncPtr_glActiveStencilFaceEXT = (GLEEPFNGLACTIVESTENCILFACEEXTPROC) __GLeeGetProcAddress("glActiveStencilFaceEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_text_fragment_shader(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_APPLE_client_storage(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_APPLE_element_array(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_APPLE_element_array + if ((GLeeFuncPtr_glElementPointerAPPLE = (GLEEPFNGLELEMENTPOINTERAPPLEPROC) __GLeeGetProcAddress("glElementPointerAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawElementArrayAPPLE = (GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glDrawElementArrayAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawRangeElementArrayAPPLE = (GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glDrawRangeElementArrayAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiDrawElementArrayAPPLE = (GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glMultiDrawElementArrayAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE = (GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glMultiDrawRangeElementArrayAPPLE"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_APPLE_fence(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_APPLE_fence + if ((GLeeFuncPtr_glGenFencesAPPLE = (GLEEPFNGLGENFENCESAPPLEPROC) __GLeeGetProcAddress("glGenFencesAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteFencesAPPLE = (GLEEPFNGLDELETEFENCESAPPLEPROC) __GLeeGetProcAddress("glDeleteFencesAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glSetFenceAPPLE = (GLEEPFNGLSETFENCEAPPLEPROC) __GLeeGetProcAddress("glSetFenceAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsFenceAPPLE = (GLEEPFNGLISFENCEAPPLEPROC) __GLeeGetProcAddress("glIsFenceAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glTestFenceAPPLE = (GLEEPFNGLTESTFENCEAPPLEPROC) __GLeeGetProcAddress("glTestFenceAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glFinishFenceAPPLE = (GLEEPFNGLFINISHFENCEAPPLEPROC) __GLeeGetProcAddress("glFinishFenceAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glTestObjectAPPLE = (GLEEPFNGLTESTOBJECTAPPLEPROC) __GLeeGetProcAddress("glTestObjectAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glFinishObjectAPPLE = (GLEEPFNGLFINISHOBJECTAPPLEPROC) __GLeeGetProcAddress("glFinishObjectAPPLE"))!=0) nLinked++; +#endif + if (nLinked==8) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_APPLE_vertex_array_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_APPLE_vertex_array_object + if ((GLeeFuncPtr_glBindVertexArrayAPPLE = (GLEEPFNGLBINDVERTEXARRAYAPPLEPROC) __GLeeGetProcAddress("glBindVertexArrayAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteVertexArraysAPPLE = (GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC) __GLeeGetProcAddress("glDeleteVertexArraysAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenVertexArraysAPPLE = (GLEEPFNGLGENVERTEXARRAYSAPPLEPROC) __GLeeGetProcAddress("glGenVertexArraysAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsVertexArrayAPPLE = (GLEEPFNGLISVERTEXARRAYAPPLEPROC) __GLeeGetProcAddress("glIsVertexArrayAPPLE"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_APPLE_vertex_array_range(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_APPLE_vertex_array_range + if ((GLeeFuncPtr_glVertexArrayRangeAPPLE = (GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC) __GLeeGetProcAddress("glVertexArrayRangeAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glFlushVertexArrayRangeAPPLE = (GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) __GLeeGetProcAddress("glFlushVertexArrayRangeAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexArrayParameteriAPPLE = (GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC) __GLeeGetProcAddress("glVertexArrayParameteriAPPLE"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_APPLE_ycbcr_422(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_S3_s3tc(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ATI_draw_buffers(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_draw_buffers + if ((GLeeFuncPtr_glDrawBuffersATI = (GLEEPFNGLDRAWBUFFERSATIPROC) __GLeeGetProcAddress("glDrawBuffersATI"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_pixel_format_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ATI_texture_env_combine3(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ATI_texture_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_fragment_program(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_fragment_program + if ((GLeeFuncPtr_glProgramNamedParameter4fNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4fNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramNamedParameter4dNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4dNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramNamedParameter4fvNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4fvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramNamedParameter4dvNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4dvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramNamedParameterfvNV = (GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetProgramNamedParameterfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramNamedParameterdvNV = (GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) __GLeeGetProcAddress("glGetProgramNamedParameterdvNV"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_half_float(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_half_float + if ((GLeeFuncPtr_glVertex2hNV = (GLEEPFNGLVERTEX2HNVPROC) __GLeeGetProcAddress("glVertex2hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertex2hvNV = (GLEEPFNGLVERTEX2HVNVPROC) __GLeeGetProcAddress("glVertex2hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertex3hNV = (GLEEPFNGLVERTEX3HNVPROC) __GLeeGetProcAddress("glVertex3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertex3hvNV = (GLEEPFNGLVERTEX3HVNVPROC) __GLeeGetProcAddress("glVertex3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertex4hNV = (GLEEPFNGLVERTEX4HNVPROC) __GLeeGetProcAddress("glVertex4hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertex4hvNV = (GLEEPFNGLVERTEX4HVNVPROC) __GLeeGetProcAddress("glVertex4hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormal3hNV = (GLEEPFNGLNORMAL3HNVPROC) __GLeeGetProcAddress("glNormal3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glNormal3hvNV = (GLEEPFNGLNORMAL3HVNVPROC) __GLeeGetProcAddress("glNormal3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor3hNV = (GLEEPFNGLCOLOR3HNVPROC) __GLeeGetProcAddress("glColor3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor3hvNV = (GLEEPFNGLCOLOR3HVNVPROC) __GLeeGetProcAddress("glColor3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4hNV = (GLEEPFNGLCOLOR4HNVPROC) __GLeeGetProcAddress("glColor4hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glColor4hvNV = (GLEEPFNGLCOLOR4HVNVPROC) __GLeeGetProcAddress("glColor4hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord1hNV = (GLEEPFNGLTEXCOORD1HNVPROC) __GLeeGetProcAddress("glTexCoord1hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord1hvNV = (GLEEPFNGLTEXCOORD1HVNVPROC) __GLeeGetProcAddress("glTexCoord1hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2hNV = (GLEEPFNGLTEXCOORD2HNVPROC) __GLeeGetProcAddress("glTexCoord2hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord2hvNV = (GLEEPFNGLTEXCOORD2HVNVPROC) __GLeeGetProcAddress("glTexCoord2hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord3hNV = (GLEEPFNGLTEXCOORD3HNVPROC) __GLeeGetProcAddress("glTexCoord3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord3hvNV = (GLEEPFNGLTEXCOORD3HVNVPROC) __GLeeGetProcAddress("glTexCoord3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord4hNV = (GLEEPFNGLTEXCOORD4HNVPROC) __GLeeGetProcAddress("glTexCoord4hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexCoord4hvNV = (GLEEPFNGLTEXCOORD4HVNVPROC) __GLeeGetProcAddress("glTexCoord4hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1hNV = (GLEEPFNGLMULTITEXCOORD1HNVPROC) __GLeeGetProcAddress("glMultiTexCoord1hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord1hvNV = (GLEEPFNGLMULTITEXCOORD1HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord1hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2hNV = (GLEEPFNGLMULTITEXCOORD2HNVPROC) __GLeeGetProcAddress("glMultiTexCoord2hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord2hvNV = (GLEEPFNGLMULTITEXCOORD2HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord2hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3hNV = (GLEEPFNGLMULTITEXCOORD3HNVPROC) __GLeeGetProcAddress("glMultiTexCoord3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord3hvNV = (GLEEPFNGLMULTITEXCOORD3HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4hNV = (GLEEPFNGLMULTITEXCOORD4HNVPROC) __GLeeGetProcAddress("glMultiTexCoord4hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoord4hvNV = (GLEEPFNGLMULTITEXCOORD4HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord4hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordhNV = (GLEEPFNGLFOGCOORDHNVPROC) __GLeeGetProcAddress("glFogCoordhNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glFogCoordhvNV = (GLEEPFNGLFOGCOORDHVNVPROC) __GLeeGetProcAddress("glFogCoordhvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3hNV = (GLEEPFNGLSECONDARYCOLOR3HNVPROC) __GLeeGetProcAddress("glSecondaryColor3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glSecondaryColor3hvNV = (GLEEPFNGLSECONDARYCOLOR3HVNVPROC) __GLeeGetProcAddress("glSecondaryColor3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexWeighthNV = (GLEEPFNGLVERTEXWEIGHTHNVPROC) __GLeeGetProcAddress("glVertexWeighthNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexWeighthvNV = (GLEEPFNGLVERTEXWEIGHTHVNVPROC) __GLeeGetProcAddress("glVertexWeighthvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1hNV = (GLEEPFNGLVERTEXATTRIB1HNVPROC) __GLeeGetProcAddress("glVertexAttrib1hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib1hvNV = (GLEEPFNGLVERTEXATTRIB1HVNVPROC) __GLeeGetProcAddress("glVertexAttrib1hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2hNV = (GLEEPFNGLVERTEXATTRIB2HNVPROC) __GLeeGetProcAddress("glVertexAttrib2hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib2hvNV = (GLEEPFNGLVERTEXATTRIB2HVNVPROC) __GLeeGetProcAddress("glVertexAttrib2hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3hNV = (GLEEPFNGLVERTEXATTRIB3HNVPROC) __GLeeGetProcAddress("glVertexAttrib3hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib3hvNV = (GLEEPFNGLVERTEXATTRIB3HVNVPROC) __GLeeGetProcAddress("glVertexAttrib3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4hNV = (GLEEPFNGLVERTEXATTRIB4HNVPROC) __GLeeGetProcAddress("glVertexAttrib4hNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttrib4hvNV = (GLEEPFNGLVERTEXATTRIB4HVNVPROC) __GLeeGetProcAddress("glVertexAttrib4hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs1hvNV = (GLEEPFNGLVERTEXATTRIBS1HVNVPROC) __GLeeGetProcAddress("glVertexAttribs1hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs2hvNV = (GLEEPFNGLVERTEXATTRIBS2HVNVPROC) __GLeeGetProcAddress("glVertexAttribs2hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs3hvNV = (GLEEPFNGLVERTEXATTRIBS3HVNVPROC) __GLeeGetProcAddress("glVertexAttribs3hvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribs4hvNV = (GLEEPFNGLVERTEXATTRIBS4HVNVPROC) __GLeeGetProcAddress("glVertexAttribs4hvNV"))!=0) nLinked++; +#endif + if (nLinked==46) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_pixel_data_range(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_pixel_data_range + if ((GLeeFuncPtr_glPixelDataRangeNV = (GLEEPFNGLPIXELDATARANGENVPROC) __GLeeGetProcAddress("glPixelDataRangeNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glFlushPixelDataRangeNV = (GLEEPFNGLFLUSHPIXELDATARANGENVPROC) __GLeeGetProcAddress("glFlushPixelDataRangeNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_primitive_restart(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_primitive_restart + if ((GLeeFuncPtr_glPrimitiveRestartNV = (GLEEPFNGLPRIMITIVERESTARTNVPROC) __GLeeGetProcAddress("glPrimitiveRestartNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glPrimitiveRestartIndexNV = (GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC) __GLeeGetProcAddress("glPrimitiveRestartIndexNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_texture_expand_normal(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_program2(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_ATI_map_object_buffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_map_object_buffer + if ((GLeeFuncPtr_glMapObjectBufferATI = (GLEEPFNGLMAPOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glMapObjectBufferATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glUnmapObjectBufferATI = (GLEEPFNGLUNMAPOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glUnmapObjectBufferATI"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_separate_stencil(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_separate_stencil + if ((GLeeFuncPtr_glStencilOpSeparateATI = (GLEEPFNGLSTENCILOPSEPARATEATIPROC) __GLeeGetProcAddress("glStencilOpSeparateATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glStencilFuncSeparateATI = (GLEEPFNGLSTENCILFUNCSEPARATEATIPROC) __GLeeGetProcAddress("glStencilFuncSeparateATI"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_ATI_vertex_attrib_array_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_ATI_vertex_attrib_array_object + if ((GLeeFuncPtr_glVertexAttribArrayObjectATI = (GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC) __GLeeGetProcAddress("glVertexAttribArrayObjectATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI = (GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetVertexAttribArrayObjectfvATI"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribArrayObjectivATI = (GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetVertexAttribArrayObjectivATI"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_OES_read_format(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_depth_bounds_test(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_depth_bounds_test + if ((GLeeFuncPtr_glDepthBoundsEXT = (GLEEPFNGLDEPTHBOUNDSEXTPROC) __GLeeGetProcAddress("glDepthBoundsEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_mirror_clamp(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_blend_equation_separate(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_blend_equation_separate + if ((GLeeFuncPtr_glBlendEquationSeparateEXT = (GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC) __GLeeGetProcAddress("glBlendEquationSeparateEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_MESA_pack_invert(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_MESA_ycbcr_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_pixel_buffer_object(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_fragment_program_option(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_fragment_program2(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_program2_option(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_vertex_program3(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_framebuffer_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_framebuffer_object + if ((GLeeFuncPtr_glIsRenderbufferEXT = (GLEEPFNGLISRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glIsRenderbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindRenderbufferEXT = (GLEEPFNGLBINDRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glBindRenderbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteRenderbuffersEXT = (GLEEPFNGLDELETERENDERBUFFERSEXTPROC) __GLeeGetProcAddress("glDeleteRenderbuffersEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenRenderbuffersEXT = (GLEEPFNGLGENRENDERBUFFERSEXTPROC) __GLeeGetProcAddress("glGenRenderbuffersEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glRenderbufferStorageEXT = (GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC) __GLeeGetProcAddress("glRenderbufferStorageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetRenderbufferParameterivEXT = (GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetRenderbufferParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsFramebufferEXT = (GLEEPFNGLISFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glIsFramebufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindFramebufferEXT = (GLEEPFNGLBINDFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glBindFramebufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteFramebuffersEXT = (GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC) __GLeeGetProcAddress("glDeleteFramebuffersEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenFramebuffersEXT = (GLEEPFNGLGENFRAMEBUFFERSEXTPROC) __GLeeGetProcAddress("glGenFramebuffersEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCheckFramebufferStatusEXT = (GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) __GLeeGetProcAddress("glCheckFramebufferStatusEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTexture1DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTexture2DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTexture3DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferRenderbufferEXT = (GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferRenderbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT = (GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetFramebufferAttachmentParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenerateMipmapEXT = (GLEEPFNGLGENERATEMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateMipmapEXT"))!=0) nLinked++; +#endif + if (nLinked==17) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_GREMEDY_string_marker(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_GREMEDY_string_marker + if ((GLeeFuncPtr_glStringMarkerGREMEDY = (GLEEPFNGLSTRINGMARKERGREMEDYPROC) __GLeeGetProcAddress("glStringMarkerGREMEDY"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_packed_depth_stencil(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_stencil_clear_tag(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_stencil_clear_tag + if ((GLeeFuncPtr_glStencilClearTagEXT = (GLEEPFNGLSTENCILCLEARTAGEXTPROC) __GLeeGetProcAddress("glStencilClearTagEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_sRGB(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_framebuffer_blit(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_framebuffer_blit + if ((GLeeFuncPtr_glBlitFramebufferEXT = (GLEEPFNGLBLITFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glBlitFramebufferEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_framebuffer_multisample(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_framebuffer_multisample + if ((GLeeFuncPtr_glRenderbufferStorageMultisampleEXT = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisampleEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_MESAX_texture_stack(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_timer_query(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_timer_query + if ((GLeeFuncPtr_glGetQueryObjecti64vEXT = (GLEEPFNGLGETQUERYOBJECTI64VEXTPROC) __GLeeGetProcAddress("glGetQueryObjecti64vEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetQueryObjectui64vEXT = (GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC) __GLeeGetProcAddress("glGetQueryObjectui64vEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_gpu_program_parameters(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_gpu_program_parameters + if ((GLeeFuncPtr_glProgramEnvParameters4fvEXT = (GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glProgramEnvParameters4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameters4fvEXT = (GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glProgramLocalParameters4fvEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_APPLE_flush_buffer_range(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_APPLE_flush_buffer_range + if ((GLeeFuncPtr_glBufferParameteriAPPLE = (GLEEPFNGLBUFFERPARAMETERIAPPLEPROC) __GLeeGetProcAddress("glBufferParameteriAPPLE"))!=0) nLinked++; + if ((GLeeFuncPtr_glFlushMappedBufferRangeAPPLE = (GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) __GLeeGetProcAddress("glFlushMappedBufferRangeAPPLE"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_gpu_shader4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_gpu_shader4 + if ((GLeeFuncPtr_glGetUniformuivEXT = (GLEEPFNGLGETUNIFORMUIVEXTPROC) __GLeeGetProcAddress("glGetUniformuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindFragDataLocationEXT = (GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC) __GLeeGetProcAddress("glBindFragDataLocationEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragDataLocationEXT = (GLEEPFNGLGETFRAGDATALOCATIONEXTPROC) __GLeeGetProcAddress("glGetFragDataLocationEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1uiEXT = (GLEEPFNGLUNIFORM1UIEXTPROC) __GLeeGetProcAddress("glUniform1uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2uiEXT = (GLEEPFNGLUNIFORM2UIEXTPROC) __GLeeGetProcAddress("glUniform2uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3uiEXT = (GLEEPFNGLUNIFORM3UIEXTPROC) __GLeeGetProcAddress("glUniform3uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4uiEXT = (GLEEPFNGLUNIFORM4UIEXTPROC) __GLeeGetProcAddress("glUniform4uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform1uivEXT = (GLEEPFNGLUNIFORM1UIVEXTPROC) __GLeeGetProcAddress("glUniform1uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform2uivEXT = (GLEEPFNGLUNIFORM2UIVEXTPROC) __GLeeGetProcAddress("glUniform2uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform3uivEXT = (GLEEPFNGLUNIFORM3UIVEXTPROC) __GLeeGetProcAddress("glUniform3uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUniform4uivEXT = (GLEEPFNGLUNIFORM4UIVEXTPROC) __GLeeGetProcAddress("glUniform4uivEXT"))!=0) nLinked++; +#endif + if (nLinked==11) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_draw_instanced(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_draw_instanced + if ((GLeeFuncPtr_glDrawArraysInstancedEXT = (GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC) __GLeeGetProcAddress("glDrawArraysInstancedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawElementsInstancedEXT = (GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC) __GLeeGetProcAddress("glDrawElementsInstancedEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_packed_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_array(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_buffer_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_texture_buffer_object + if ((GLeeFuncPtr_glTexBufferEXT = (GLEEPFNGLTEXBUFFEREXTPROC) __GLeeGetProcAddress("glTexBufferEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_compression_latc(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_compression_rgtc(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_shared_exponent(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_depth_buffer_float(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_depth_buffer_float + if ((GLeeFuncPtr_glDepthRangedNV = (GLEEPFNGLDEPTHRANGEDNVPROC) __GLeeGetProcAddress("glDepthRangedNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearDepthdNV = (GLEEPFNGLCLEARDEPTHDNVPROC) __GLeeGetProcAddress("glClearDepthdNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glDepthBoundsdNV = (GLEEPFNGLDEPTHBOUNDSDNVPROC) __GLeeGetProcAddress("glDepthBoundsdNV"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_framebuffer_multisample_coverage(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_framebuffer_multisample_coverage + if ((GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisampleCoverageNV"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_geometry_shader4(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_parameter_buffer_object(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_parameter_buffer_object + if ((GLeeFuncPtr_glProgramBufferParametersfvNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersfvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramBufferParametersIivNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersIivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramBufferParametersIuivNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersIuivNV"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_draw_buffers2(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_draw_buffers2 + if ((GLeeFuncPtr_glColorMaskIndexedEXT = (GLEEPFNGLCOLORMASKINDEXEDEXTPROC) __GLeeGetProcAddress("glColorMaskIndexedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetBooleanIndexedvEXT = (GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetBooleanIndexedvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetIntegerIndexedvEXT = (GLEEPFNGLGETINTEGERINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetIntegerIndexedvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEnableIndexedEXT = (GLEEPFNGLENABLEINDEXEDEXTPROC) __GLeeGetProcAddress("glEnableIndexedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDisableIndexedEXT = (GLEEPFNGLDISABLEINDEXEDEXTPROC) __GLeeGetProcAddress("glDisableIndexedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsEnabledIndexedEXT = (GLEEPFNGLISENABLEDINDEXEDEXTPROC) __GLeeGetProcAddress("glIsEnabledIndexedEXT"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_transform_feedback(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_transform_feedback + if ((GLeeFuncPtr_glBeginTransformFeedbackNV = (GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glBeginTransformFeedbackNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndTransformFeedbackNV = (GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glEndTransformFeedbackNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTransformFeedbackAttribsNV = (GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) __GLeeGetProcAddress("glTransformFeedbackAttribsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferRangeNV = (GLEEPFNGLBINDBUFFERRANGENVPROC) __GLeeGetProcAddress("glBindBufferRangeNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferOffsetNV = (GLEEPFNGLBINDBUFFEROFFSETNVPROC) __GLeeGetProcAddress("glBindBufferOffsetNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferBaseNV = (GLEEPFNGLBINDBUFFERBASENVPROC) __GLeeGetProcAddress("glBindBufferBaseNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTransformFeedbackVaryingsNV = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) __GLeeGetProcAddress("glTransformFeedbackVaryingsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glActiveVaryingNV = (GLEEPFNGLACTIVEVARYINGNVPROC) __GLeeGetProcAddress("glActiveVaryingNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVaryingLocationNV = (GLEEPFNGLGETVARYINGLOCATIONNVPROC) __GLeeGetProcAddress("glGetVaryingLocationNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetActiveVaryingNV = (GLEEPFNGLGETACTIVEVARYINGNVPROC) __GLeeGetProcAddress("glGetActiveVaryingNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTransformFeedbackVaryingNV = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) __GLeeGetProcAddress("glGetTransformFeedbackVaryingNV"))!=0) nLinked++; +#endif + if (nLinked==11) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_bindable_uniform(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_bindable_uniform + if ((GLeeFuncPtr_glUniformBufferEXT = (GLEEPFNGLUNIFORMBUFFEREXTPROC) __GLeeGetProcAddress("glUniformBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformBufferSizeEXT = (GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC) __GLeeGetProcAddress("glGetUniformBufferSizeEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetUniformOffsetEXT = (GLEEPFNGLGETUNIFORMOFFSETEXTPROC) __GLeeGetProcAddress("glGetUniformOffsetEXT"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_integer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_texture_integer + if ((GLeeFuncPtr_glTexParameterIivEXT = (GLEEPFNGLTEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glTexParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexParameterIuivEXT = (GLEEPFNGLTEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glTexParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTexParameterIivEXT = (GLEEPFNGLGETTEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetTexParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTexParameterIuivEXT = (GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetTexParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearColorIiEXT = (GLEEPFNGLCLEARCOLORIIEXTPROC) __GLeeGetProcAddress("glClearColorIiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearColorIuiEXT = (GLEEPFNGLCLEARCOLORIUIEXTPROC) __GLeeGetProcAddress("glClearColorIuiEXT"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_GREMEDY_frame_terminator(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_GREMEDY_frame_terminator + if ((GLeeFuncPtr_glFrameTerminatorGREMEDY = (GLEEPFNGLFRAMETERMINATORGREMEDYPROC) __GLeeGetProcAddress("glFrameTerminatorGREMEDY"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_conditional_render(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_conditional_render + if ((GLeeFuncPtr_glBeginConditionalRenderNV = (GLEEPFNGLBEGINCONDITIONALRENDERNVPROC) __GLeeGetProcAddress("glBeginConditionalRenderNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndConditionalRenderNV = (GLEEPFNGLENDCONDITIONALRENDERNVPROC) __GLeeGetProcAddress("glEndConditionalRenderNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_present_video(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_transform_feedback(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_transform_feedback + if ((GLeeFuncPtr_glBeginTransformFeedbackEXT = (GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC) __GLeeGetProcAddress("glBeginTransformFeedbackEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndTransformFeedbackEXT = (GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC) __GLeeGetProcAddress("glEndTransformFeedbackEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferRangeEXT = (GLEEPFNGLBINDBUFFERRANGEEXTPROC) __GLeeGetProcAddress("glBindBufferRangeEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferOffsetEXT = (GLEEPFNGLBINDBUFFEROFFSETEXTPROC) __GLeeGetProcAddress("glBindBufferOffsetEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindBufferBaseEXT = (GLEEPFNGLBINDBUFFERBASEEXTPROC) __GLeeGetProcAddress("glBindBufferBaseEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTransformFeedbackVaryingsEXT = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) __GLeeGetProcAddress("glTransformFeedbackVaryingsEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTransformFeedbackVaryingEXT = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) __GLeeGetProcAddress("glGetTransformFeedbackVaryingEXT"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_direct_state_access(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_direct_state_access + if ((GLeeFuncPtr_glClientAttribDefaultEXT = (GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC) __GLeeGetProcAddress("glClientAttribDefaultEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glPushClientAttribDefaultEXT = (GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) __GLeeGetProcAddress("glPushClientAttribDefaultEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixLoadfEXT = (GLEEPFNGLMATRIXLOADFEXTPROC) __GLeeGetProcAddress("glMatrixLoadfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixLoaddEXT = (GLEEPFNGLMATRIXLOADDEXTPROC) __GLeeGetProcAddress("glMatrixLoaddEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixMultfEXT = (GLEEPFNGLMATRIXMULTFEXTPROC) __GLeeGetProcAddress("glMatrixMultfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixMultdEXT = (GLEEPFNGLMATRIXMULTDEXTPROC) __GLeeGetProcAddress("glMatrixMultdEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixLoadIdentityEXT = (GLEEPFNGLMATRIXLOADIDENTITYEXTPROC) __GLeeGetProcAddress("glMatrixLoadIdentityEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixRotatefEXT = (GLEEPFNGLMATRIXROTATEFEXTPROC) __GLeeGetProcAddress("glMatrixRotatefEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixRotatedEXT = (GLEEPFNGLMATRIXROTATEDEXTPROC) __GLeeGetProcAddress("glMatrixRotatedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixScalefEXT = (GLEEPFNGLMATRIXSCALEFEXTPROC) __GLeeGetProcAddress("glMatrixScalefEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixScaledEXT = (GLEEPFNGLMATRIXSCALEDEXTPROC) __GLeeGetProcAddress("glMatrixScaledEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixTranslatefEXT = (GLEEPFNGLMATRIXTRANSLATEFEXTPROC) __GLeeGetProcAddress("glMatrixTranslatefEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixTranslatedEXT = (GLEEPFNGLMATRIXTRANSLATEDEXTPROC) __GLeeGetProcAddress("glMatrixTranslatedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixFrustumEXT = (GLEEPFNGLMATRIXFRUSTUMEXTPROC) __GLeeGetProcAddress("glMatrixFrustumEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixOrthoEXT = (GLEEPFNGLMATRIXORTHOEXTPROC) __GLeeGetProcAddress("glMatrixOrthoEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixPopEXT = (GLEEPFNGLMATRIXPOPEXTPROC) __GLeeGetProcAddress("glMatrixPopEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixPushEXT = (GLEEPFNGLMATRIXPUSHEXTPROC) __GLeeGetProcAddress("glMatrixPushEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixLoadTransposefEXT = (GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC) __GLeeGetProcAddress("glMatrixLoadTransposefEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixLoadTransposedEXT = (GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC) __GLeeGetProcAddress("glMatrixLoadTransposedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixMultTransposefEXT = (GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC) __GLeeGetProcAddress("glMatrixMultTransposefEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMatrixMultTransposedEXT = (GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC) __GLeeGetProcAddress("glMatrixMultTransposedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureParameterfEXT = (GLEEPFNGLTEXTUREPARAMETERFEXTPROC) __GLeeGetProcAddress("glTextureParameterfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureParameterfvEXT = (GLEEPFNGLTEXTUREPARAMETERFVEXTPROC) __GLeeGetProcAddress("glTextureParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureParameteriEXT = (GLEEPFNGLTEXTUREPARAMETERIEXTPROC) __GLeeGetProcAddress("glTextureParameteriEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureParameterivEXT = (GLEEPFNGLTEXTUREPARAMETERIVEXTPROC) __GLeeGetProcAddress("glTextureParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureImage1DEXT = (GLEEPFNGLTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glTextureImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureImage2DEXT = (GLEEPFNGLTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glTextureImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureSubImage1DEXT = (GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glTextureSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureSubImage2DEXT = (GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glTextureSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTextureImage1DEXT = (GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTextureImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTextureImage2DEXT = (GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTextureImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTextureSubImage1DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTextureSubImage2DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureImageEXT = (GLEEPFNGLGETTEXTUREIMAGEEXTPROC) __GLeeGetProcAddress("glGetTextureImageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureParameterfvEXT = (GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureParameterivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureLevelParameterfvEXT = (GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetTextureLevelParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureLevelParameterivEXT = (GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetTextureLevelParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureImage3DEXT = (GLEEPFNGLTEXTUREIMAGE3DEXTPROC) __GLeeGetProcAddress("glTextureImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureSubImage3DEXT = (GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glTextureSubImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyTextureSubImage3DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexParameterfEXT = (GLEEPFNGLMULTITEXPARAMETERFEXTPROC) __GLeeGetProcAddress("glMultiTexParameterfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexParameterfvEXT = (GLEEPFNGLMULTITEXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexParameteriEXT = (GLEEPFNGLMULTITEXPARAMETERIEXTPROC) __GLeeGetProcAddress("glMultiTexParameteriEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexParameterivEXT = (GLEEPFNGLMULTITEXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexImage1DEXT = (GLEEPFNGLMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glMultiTexImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexImage2DEXT = (GLEEPFNGLMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glMultiTexImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexSubImage1DEXT = (GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexSubImage2DEXT = (GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyMultiTexImage1DEXT = (GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyMultiTexImage2DEXT = (GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyMultiTexSubImage1DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyMultiTexSubImage2DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexImageEXT = (GLEEPFNGLGETMULTITEXIMAGEEXTPROC) __GLeeGetProcAddress("glGetMultiTexImageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexParameterfvEXT = (GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexParameterivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT = (GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexLevelParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexLevelParameterivEXT = (GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexLevelParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexImage3DEXT = (GLEEPFNGLMULTITEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glMultiTexImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexSubImage3DEXT = (GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCopyMultiTexSubImage3DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glBindMultiTextureEXT = (GLEEPFNGLBINDMULTITEXTUREEXTPROC) __GLeeGetProcAddress("glBindMultiTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEnableClientStateIndexedEXT = (GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC) __GLeeGetProcAddress("glEnableClientStateIndexedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glDisableClientStateIndexedEXT = (GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) __GLeeGetProcAddress("glDisableClientStateIndexedEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexCoordPointerEXT = (GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glMultiTexCoordPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexEnvfEXT = (GLEEPFNGLMULTITEXENVFEXTPROC) __GLeeGetProcAddress("glMultiTexEnvfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexEnvfvEXT = (GLEEPFNGLMULTITEXENVFVEXTPROC) __GLeeGetProcAddress("glMultiTexEnvfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexEnviEXT = (GLEEPFNGLMULTITEXENVIEXTPROC) __GLeeGetProcAddress("glMultiTexEnviEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexEnvivEXT = (GLEEPFNGLMULTITEXENVIVEXTPROC) __GLeeGetProcAddress("glMultiTexEnvivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexGendEXT = (GLEEPFNGLMULTITEXGENDEXTPROC) __GLeeGetProcAddress("glMultiTexGendEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexGendvEXT = (GLEEPFNGLMULTITEXGENDVEXTPROC) __GLeeGetProcAddress("glMultiTexGendvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexGenfEXT = (GLEEPFNGLMULTITEXGENFEXTPROC) __GLeeGetProcAddress("glMultiTexGenfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexGenfvEXT = (GLEEPFNGLMULTITEXGENFVEXTPROC) __GLeeGetProcAddress("glMultiTexGenfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexGeniEXT = (GLEEPFNGLMULTITEXGENIEXTPROC) __GLeeGetProcAddress("glMultiTexGeniEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexGenivEXT = (GLEEPFNGLMULTITEXGENIVEXTPROC) __GLeeGetProcAddress("glMultiTexGenivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexEnvfvEXT = (GLEEPFNGLGETMULTITEXENVFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexEnvfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexEnvivEXT = (GLEEPFNGLGETMULTITEXENVIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexEnvivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexGendvEXT = (GLEEPFNGLGETMULTITEXGENDVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGendvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexGenfvEXT = (GLEEPFNGLGETMULTITEXGENFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGenfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexGenivEXT = (GLEEPFNGLGETMULTITEXGENIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGenivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFloatIndexedvEXT = (GLEEPFNGLGETFLOATINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetFloatIndexedvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetDoubleIndexedvEXT = (GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetDoubleIndexedvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetPointerIndexedvEXT = (GLEEPFNGLGETPOINTERINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetPointerIndexedvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTextureImage3DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTextureImage2DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTextureImage1DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTextureSubImage3DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTextureSubImage2DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedTextureSubImage1DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCompressedTextureImageEXT = (GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) __GLeeGetProcAddress("glGetCompressedTextureImageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedMultiTexImage3DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedMultiTexImage2DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedMultiTexImage1DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetCompressedMultiTexImageEXT = (GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) __GLeeGetProcAddress("glGetCompressedMultiTexImageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramStringEXT = (GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC) __GLeeGetProcAddress("glNamedProgramStringEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameter4dEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4dEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4dvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameter4fEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterdvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedProgramivEXT = (GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedProgramStringEXT = (GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC) __GLeeGetProcAddress("glGetNamedProgramStringEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameters4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParametersI4ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParametersI4uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureParameterIivEXT = (GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glTextureParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureParameterIuivEXT = (GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glTextureParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureParameterIivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetTextureParameterIuivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexParameterIivEXT = (GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexParameterIuivEXT = (GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexParameterIivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetMultiTexParameterIuivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterIuivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform1fEXT = (GLEEPFNGLPROGRAMUNIFORM1FEXTPROC) __GLeeGetProcAddress("glProgramUniform1fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform2fEXT = (GLEEPFNGLPROGRAMUNIFORM2FEXTPROC) __GLeeGetProcAddress("glProgramUniform2fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform3fEXT = (GLEEPFNGLPROGRAMUNIFORM3FEXTPROC) __GLeeGetProcAddress("glProgramUniform3fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform4fEXT = (GLEEPFNGLPROGRAMUNIFORM4FEXTPROC) __GLeeGetProcAddress("glProgramUniform4fEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform1iEXT = (GLEEPFNGLPROGRAMUNIFORM1IEXTPROC) __GLeeGetProcAddress("glProgramUniform1iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform2iEXT = (GLEEPFNGLPROGRAMUNIFORM2IEXTPROC) __GLeeGetProcAddress("glProgramUniform2iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform3iEXT = (GLEEPFNGLPROGRAMUNIFORM3IEXTPROC) __GLeeGetProcAddress("glProgramUniform3iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform4iEXT = (GLEEPFNGLPROGRAMUNIFORM4IEXTPROC) __GLeeGetProcAddress("glProgramUniform4iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform1fvEXT = (GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC) __GLeeGetProcAddress("glProgramUniform1fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform2fvEXT = (GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC) __GLeeGetProcAddress("glProgramUniform2fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform3fvEXT = (GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC) __GLeeGetProcAddress("glProgramUniform3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform4fvEXT = (GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC) __GLeeGetProcAddress("glProgramUniform4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform1ivEXT = (GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC) __GLeeGetProcAddress("glProgramUniform1ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform2ivEXT = (GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC) __GLeeGetProcAddress("glProgramUniform2ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform3ivEXT = (GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC) __GLeeGetProcAddress("glProgramUniform3ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform4ivEXT = (GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC) __GLeeGetProcAddress("glProgramUniform4ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2x3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3x2fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2x4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4x2fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3x4fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4x3fvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform1uiEXT = (GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC) __GLeeGetProcAddress("glProgramUniform1uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform2uiEXT = (GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC) __GLeeGetProcAddress("glProgramUniform2uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform3uiEXT = (GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC) __GLeeGetProcAddress("glProgramUniform3uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform4uiEXT = (GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC) __GLeeGetProcAddress("glProgramUniform4uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform1uivEXT = (GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform1uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform2uivEXT = (GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform2uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform3uivEXT = (GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform3uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramUniform4uivEXT = (GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform4uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedBufferDataEXT = (GLEEPFNGLNAMEDBUFFERDATAEXTPROC) __GLeeGetProcAddress("glNamedBufferDataEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedBufferSubDataEXT = (GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC) __GLeeGetProcAddress("glNamedBufferSubDataEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMapNamedBufferEXT = (GLEEPFNGLMAPNAMEDBUFFEREXTPROC) __GLeeGetProcAddress("glMapNamedBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glUnmapNamedBufferEXT = (GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC) __GLeeGetProcAddress("glUnmapNamedBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedBufferParameterivEXT = (GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedBufferParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedBufferPointervEXT = (GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC) __GLeeGetProcAddress("glGetNamedBufferPointervEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedBufferSubDataEXT = (GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC) __GLeeGetProcAddress("glGetNamedBufferSubDataEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureBufferEXT = (GLEEPFNGLTEXTUREBUFFEREXTPROC) __GLeeGetProcAddress("glTextureBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexBufferEXT = (GLEEPFNGLMULTITEXBUFFEREXTPROC) __GLeeGetProcAddress("glMultiTexBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedRenderbufferStorageEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT = (GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedRenderbufferParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glCheckNamedFramebufferStatusEXT = (GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) __GLeeGetProcAddress("glCheckNamedFramebufferStatusEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferTexture1DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture1DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferTexture2DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture2DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferTexture3DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture3DEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferRenderbufferEXT = (GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glNamedFramebufferRenderbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT = (GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedFramebufferAttachmentParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenerateTextureMipmapEXT = (GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateTextureMipmapEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenerateMultiTexMipmapEXT = (GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateMultiTexMipmapEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferDrawBufferEXT = (GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferDrawBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferDrawBuffersEXT = (GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) __GLeeGetProcAddress("glFramebufferDrawBuffersEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferReadBufferEXT = (GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferReadBufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFramebufferParameterivEXT = (GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetFramebufferParameterivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageMultisampleEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageMultisampleCoverageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferTextureEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferTextureLayerEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureLayerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glNamedFramebufferTextureFaceEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureFaceEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glTextureRenderbufferEXT = (GLEEPFNGLTEXTURERENDERBUFFEREXTPROC) __GLeeGetProcAddress("glTextureRenderbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glMultiTexRenderbufferEXT = (GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glMultiTexRenderbufferEXT"))!=0) nLinked++; +#endif + if (nLinked==186) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_vertex_array_bgra(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_swizzle(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_explicit_multisample(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_explicit_multisample + if ((GLeeFuncPtr_glGetMultisamplefvNV = (GLEEPFNGLGETMULTISAMPLEFVNVPROC) __GLeeGetProcAddress("glGetMultisamplefvNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glSampleMaskIndexedNV = (GLEEPFNGLSAMPLEMASKINDEXEDNVPROC) __GLeeGetProcAddress("glSampleMaskIndexedNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glTexRenderbufferNV = (GLEEPFNGLTEXRENDERBUFFERNVPROC) __GLeeGetProcAddress("glTexRenderbufferNV"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_NV_transform_feedback2(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_transform_feedback2 + if ((GLeeFuncPtr_glBindTransformFeedbackNV = (GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glBindTransformFeedbackNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glDeleteTransformFeedbacksNV = (GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC) __GLeeGetProcAddress("glDeleteTransformFeedbacksNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGenTransformFeedbacksNV = (GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC) __GLeeGetProcAddress("glGenTransformFeedbacksNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glIsTransformFeedbackNV = (GLEEPFNGLISTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glIsTransformFeedbackNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glPauseTransformFeedbackNV = (GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glPauseTransformFeedbackNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glResumeTransformFeedbackNV = (GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glResumeTransformFeedbackNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glDrawTransformFeedbackNV = (GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glDrawTransformFeedbackNV"))!=0) nLinked++; +#endif + if (nLinked==7) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_texture_select(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_INGR_blend_func_separate(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_INGR_blend_func_separate + if ((GLeeFuncPtr_glBlendFuncSeparateINGR = (GLEEPFNGLBLENDFUNCSEPARATEINGRPROC) __GLeeGetProcAddress("glBlendFuncSeparateINGR"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_depth_pass_instrument(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_igloo_interface(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_SGIX_igloo_interface + if ((GLeeFuncPtr_glIglooInterfaceSGIX = (GLEEPFNGLIGLOOINTERFACESGIXPROC) __GLeeGetProcAddress("glIglooInterfaceSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_fragment_lighting(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_fragment_lighting + if ((GLeeFuncPtr_glFragmentLightModeliEXT = (GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC) __GLeeGetProcAddress("glFragmentLightModeliEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModelfEXT = (GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC) __GLeeGetProcAddress("glFragmentLightModelfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModelivEXT = (GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC) __GLeeGetProcAddress("glFragmentLightModelivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightModelfvEXT = (GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC) __GLeeGetProcAddress("glFragmentLightModelfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightiEXT = (GLEEPFNGLFRAGMENTLIGHTIEXTPROC) __GLeeGetProcAddress("glFragmentLightiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightfEXT = (GLEEPFNGLFRAGMENTLIGHTFEXTPROC) __GLeeGetProcAddress("glFragmentLightfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightivEXT = (GLEEPFNGLFRAGMENTLIGHTIVEXTPROC) __GLeeGetProcAddress("glFragmentLightivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentLightfvEXT = (GLEEPFNGLFRAGMENTLIGHTFVEXTPROC) __GLeeGetProcAddress("glFragmentLightfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentLightivEXT = (GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC) __GLeeGetProcAddress("glGetFragmentLightivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentLightfvEXT = (GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC) __GLeeGetProcAddress("glGetFragmentLightfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialfEXT = (GLEEPFNGLFRAGMENTMATERIALFEXTPROC) __GLeeGetProcAddress("glFragmentMaterialfEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialiEXT = (GLEEPFNGLFRAGMENTMATERIALIEXTPROC) __GLeeGetProcAddress("glFragmentMaterialiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialfvEXT = (GLEEPFNGLFRAGMENTMATERIALFVEXTPROC) __GLeeGetProcAddress("glFragmentMaterialfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentMaterialivEXT = (GLEEPFNGLFRAGMENTMATERIALIVEXTPROC) __GLeeGetProcAddress("glFragmentMaterialivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFragmentColorMaterialEXT = (GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC) __GLeeGetProcAddress("glFragmentColorMaterialEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentMaterialfvEXT = (GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC) __GLeeGetProcAddress("glGetFragmentMaterialfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetFragmentMaterialivEXT = (GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC) __GLeeGetProcAddress("glGetFragmentMaterialivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glLightEnviEXT = (GLEEPFNGLLIGHTENVIEXTPROC) __GLeeGetProcAddress("glLightEnviEXT"))!=0) nLinked++; +#endif + if (nLinked==18) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_geometry_shader4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_geometry_shader4 + if ((GLeeFuncPtr_glProgramParameteriEXT = (GLEEPFNGLPROGRAMPARAMETERIEXTPROC) __GLeeGetProcAddress("glProgramParameteriEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glFramebufferTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureLayerEXT = (GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glFramebufferTextureLayerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureFaceEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glFramebufferTextureFaceEXT"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_scene_marker(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_EXT_scene_marker + if ((GLeeFuncPtr_glBeginSceneEXT = (GLEEPFNGLBEGINSCENEEXTPROC) __GLeeGetProcAddress("glBeginSceneEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glEndSceneEXT = (GLEEPFNGLENDSCENEEXTPROC) __GLeeGetProcAddress("glEndSceneEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_EXT_texture_compression_dxt1(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_EXT_texture_env(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_IBM_static_data(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_NV_gpu_program4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_NV_gpu_program4 + if ((GLeeFuncPtr_glProgramLocalParameterI4iNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4iNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameterI4ivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4ivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParametersI4ivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) __GLeeGetProcAddress("glProgramLocalParametersI4ivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameterI4uiNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4uiNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParameterI4uivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4uivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramLocalParametersI4uivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) __GLeeGetProcAddress("glProgramLocalParametersI4uivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameterI4iNV = (GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4iNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameterI4ivNV = (GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4ivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParametersI4ivNV = (GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC) __GLeeGetProcAddress("glProgramEnvParametersI4ivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameterI4uiNV = (GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4uiNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParameterI4uivNV = (GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4uivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glProgramEnvParametersI4uivNV = (GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) __GLeeGetProcAddress("glProgramEnvParametersI4uivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramLocalParameterIivNV = (GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) __GLeeGetProcAddress("glGetProgramLocalParameterIivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramLocalParameterIuivNV = (GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) __GLeeGetProcAddress("glGetProgramLocalParameterIuivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramEnvParameterIivNV = (GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC) __GLeeGetProcAddress("glGetProgramEnvParameterIivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetProgramEnvParameterIuivNV = (GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) __GLeeGetProcAddress("glGetProgramEnvParameterIuivNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glFramebufferTextureEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureLayerEXT = (GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glFramebufferTextureLayerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glFramebufferTextureFaceEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glFramebufferTextureFaceEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2iEXT = (GLEEPFNGLVERTEXATTRIBI2IEXTPROC) __GLeeGetProcAddress("glVertexAttribI2iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3iEXT = (GLEEPFNGLVERTEXATTRIBI3IEXTPROC) __GLeeGetProcAddress("glVertexAttribI3iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4iEXT = (GLEEPFNGLVERTEXATTRIBI4IEXTPROC) __GLeeGetProcAddress("glVertexAttribI4iEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1uiEXT = (GLEEPFNGLVERTEXATTRIBI1UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI1uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2uiEXT = (GLEEPFNGLVERTEXATTRIBI2UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI2uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3uiEXT = (GLEEPFNGLVERTEXATTRIBI3UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI3uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4uiEXT = (GLEEPFNGLVERTEXATTRIBI4UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI4uiEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1ivEXT = (GLEEPFNGLVERTEXATTRIBI1IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI1ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2ivEXT = (GLEEPFNGLVERTEXATTRIBI2IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI2ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3ivEXT = (GLEEPFNGLVERTEXATTRIBI3IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI3ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4ivEXT = (GLEEPFNGLVERTEXATTRIBI4IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4ivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI1uivEXT = (GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI1uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI2uivEXT = (GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI2uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI3uivEXT = (GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI3uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4uivEXT = (GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4uivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4bvEXT = (GLEEPFNGLVERTEXATTRIBI4BVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4bvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4svEXT = (GLEEPFNGLVERTEXATTRIBI4SVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4svEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4ubvEXT = (GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4ubvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribI4usvEXT = (GLEEPFNGLVERTEXATTRIBI4USVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4usvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glVertexAttribIPointerEXT = (GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC) __GLeeGetProcAddress("glVertexAttribIPointerEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribIivEXT = (GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC) __GLeeGetProcAddress("glGetVertexAttribIivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetVertexAttribIuivEXT = (GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC) __GLeeGetProcAddress("glGetVertexAttribIuivEXT"))!=0) nLinked++; +#endif + if (nLinked==41) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_OES_byte_coordinates(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_OES_compressed_paletted_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_OES_single_precision(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GL_OES_single_precision + if ((GLeeFuncPtr_glDepthRangefOES = (GLEEPFNGLDEPTHRANGEFOESPROC) __GLeeGetProcAddress("glDepthRangefOES"))!=0) nLinked++; + if ((GLeeFuncPtr_glFrustumfOES = (GLEEPFNGLFRUSTUMFOESPROC) __GLeeGetProcAddress("glFrustumfOES"))!=0) nLinked++; + if ((GLeeFuncPtr_glOrthofOES = (GLEEPFNGLORTHOFOESPROC) __GLeeGetProcAddress("glOrthofOES"))!=0) nLinked++; + if ((GLeeFuncPtr_glClipPlanefOES = (GLEEPFNGLCLIPPLANEFOESPROC) __GLeeGetProcAddress("glClipPlanefOES"))!=0) nLinked++; + if ((GLeeFuncPtr_glGetClipPlanefOES = (GLEEPFNGLGETCLIPPLANEFOESPROC) __GLeeGetProcAddress("glGetClipPlanefOES"))!=0) nLinked++; + if ((GLeeFuncPtr_glClearDepthfOES = (GLEEPFNGLCLEARDEPTHFOESPROC) __GLeeGetProcAddress("glClearDepthfOES"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GL_SGIX_pixel_texture_bits(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GL_SGIX_texture_range(void) {return GLEE_LINK_COMPLETE;} + +GLEE_LINK_FUNCTION __GLeeGLLoadFunction[322]; + +void initGLLoadFunctions(void) +{ + __GLeeGLLoadFunction[0]=__GLeeLink_GL_VERSION_1_2; + __GLeeGLLoadFunction[1]=__GLeeLink_GL_ARB_imaging; + __GLeeGLLoadFunction[2]=__GLeeLink_GL_VERSION_1_3; + __GLeeGLLoadFunction[3]=__GLeeLink_GL_VERSION_1_4; + __GLeeGLLoadFunction[4]=__GLeeLink_GL_VERSION_1_5; + __GLeeGLLoadFunction[5]=__GLeeLink_GL_VERSION_2_0; + __GLeeGLLoadFunction[6]=__GLeeLink_GL_VERSION_2_1; + __GLeeGLLoadFunction[7]=__GLeeLink_GL_VERSION_3_0; + __GLeeGLLoadFunction[8]=__GLeeLink_GL_ARB_multitexture; + __GLeeGLLoadFunction[9]=__GLeeLink_GL_ARB_transpose_matrix; + __GLeeGLLoadFunction[10]=__GLeeLink_GL_ARB_multisample; + __GLeeGLLoadFunction[11]=__GLeeLink_GL_ARB_texture_env_add; + __GLeeGLLoadFunction[12]=__GLeeLink_GL_ARB_texture_cube_map; + __GLeeGLLoadFunction[13]=__GLeeLink_GL_ARB_texture_compression; + __GLeeGLLoadFunction[14]=__GLeeLink_GL_ARB_texture_border_clamp; + __GLeeGLLoadFunction[15]=__GLeeLink_GL_ARB_point_parameters; + __GLeeGLLoadFunction[16]=__GLeeLink_GL_ARB_vertex_blend; + __GLeeGLLoadFunction[17]=__GLeeLink_GL_ARB_matrix_palette; + __GLeeGLLoadFunction[18]=__GLeeLink_GL_ARB_texture_env_combine; + __GLeeGLLoadFunction[19]=__GLeeLink_GL_ARB_texture_env_crossbar; + __GLeeGLLoadFunction[20]=__GLeeLink_GL_ARB_texture_env_dot3; + __GLeeGLLoadFunction[21]=__GLeeLink_GL_ARB_texture_mirrored_repeat; + __GLeeGLLoadFunction[22]=__GLeeLink_GL_ARB_depth_texture; + __GLeeGLLoadFunction[23]=__GLeeLink_GL_ARB_shadow; + __GLeeGLLoadFunction[24]=__GLeeLink_GL_ARB_shadow_ambient; + __GLeeGLLoadFunction[25]=__GLeeLink_GL_ARB_window_pos; + __GLeeGLLoadFunction[26]=__GLeeLink_GL_ARB_vertex_program; + __GLeeGLLoadFunction[27]=__GLeeLink_GL_ARB_fragment_program; + __GLeeGLLoadFunction[28]=__GLeeLink_GL_ARB_vertex_buffer_object; + __GLeeGLLoadFunction[29]=__GLeeLink_GL_ARB_occlusion_query; + __GLeeGLLoadFunction[30]=__GLeeLink_GL_ARB_shader_objects; + __GLeeGLLoadFunction[31]=__GLeeLink_GL_ARB_vertex_shader; + __GLeeGLLoadFunction[32]=__GLeeLink_GL_ARB_fragment_shader; + __GLeeGLLoadFunction[33]=__GLeeLink_GL_ARB_shading_language_100; + __GLeeGLLoadFunction[34]=__GLeeLink_GL_ARB_texture_non_power_of_two; + __GLeeGLLoadFunction[35]=__GLeeLink_GL_ARB_point_sprite; + __GLeeGLLoadFunction[36]=__GLeeLink_GL_ARB_fragment_program_shadow; + __GLeeGLLoadFunction[37]=__GLeeLink_GL_ARB_draw_buffers; + __GLeeGLLoadFunction[38]=__GLeeLink_GL_ARB_texture_rectangle; + __GLeeGLLoadFunction[39]=__GLeeLink_GL_ARB_color_buffer_float; + __GLeeGLLoadFunction[40]=__GLeeLink_GL_ARB_half_float_pixel; + __GLeeGLLoadFunction[41]=__GLeeLink_GL_ARB_texture_float; + __GLeeGLLoadFunction[42]=__GLeeLink_GL_ARB_pixel_buffer_object; + __GLeeGLLoadFunction[43]=__GLeeLink_GL_ARB_depth_buffer_float; + __GLeeGLLoadFunction[44]=__GLeeLink_GL_ARB_draw_instanced; + __GLeeGLLoadFunction[45]=__GLeeLink_GL_ARB_framebuffer_object; + __GLeeGLLoadFunction[46]=__GLeeLink_GL_ARB_framebuffer_sRGB; + __GLeeGLLoadFunction[47]=__GLeeLink_GL_ARB_geometry_shader4; + __GLeeGLLoadFunction[48]=__GLeeLink_GL_ARB_half_float_vertex; + __GLeeGLLoadFunction[49]=__GLeeLink_GL_ARB_instanced_arrays; + __GLeeGLLoadFunction[50]=__GLeeLink_GL_ARB_map_buffer_range; + __GLeeGLLoadFunction[51]=__GLeeLink_GL_ARB_texture_buffer_object; + __GLeeGLLoadFunction[52]=__GLeeLink_GL_ARB_texture_compression_rgtc; + __GLeeGLLoadFunction[53]=__GLeeLink_GL_ARB_texture_rg; + __GLeeGLLoadFunction[54]=__GLeeLink_GL_ARB_vertex_array_object; + __GLeeGLLoadFunction[55]=__GLeeLink_GL_EXT_abgr; + __GLeeGLLoadFunction[56]=__GLeeLink_GL_EXT_blend_color; + __GLeeGLLoadFunction[57]=__GLeeLink_GL_EXT_polygon_offset; + __GLeeGLLoadFunction[58]=__GLeeLink_GL_EXT_texture; + __GLeeGLLoadFunction[59]=__GLeeLink_GL_EXT_texture3D; + __GLeeGLLoadFunction[60]=__GLeeLink_GL_SGIS_texture_filter4; + __GLeeGLLoadFunction[61]=__GLeeLink_GL_EXT_subtexture; + __GLeeGLLoadFunction[62]=__GLeeLink_GL_EXT_copy_texture; + __GLeeGLLoadFunction[63]=__GLeeLink_GL_EXT_histogram; + __GLeeGLLoadFunction[64]=__GLeeLink_GL_EXT_convolution; + __GLeeGLLoadFunction[65]=__GLeeLink_GL_SGI_color_matrix; + __GLeeGLLoadFunction[66]=__GLeeLink_GL_SGI_color_table; + __GLeeGLLoadFunction[67]=__GLeeLink_GL_SGIS_pixel_texture; + __GLeeGLLoadFunction[68]=__GLeeLink_GL_SGIX_pixel_texture; + __GLeeGLLoadFunction[69]=__GLeeLink_GL_SGIS_texture4D; + __GLeeGLLoadFunction[70]=__GLeeLink_GL_SGI_texture_color_table; + __GLeeGLLoadFunction[71]=__GLeeLink_GL_EXT_cmyka; + __GLeeGLLoadFunction[72]=__GLeeLink_GL_EXT_texture_object; + __GLeeGLLoadFunction[73]=__GLeeLink_GL_SGIS_detail_texture; + __GLeeGLLoadFunction[74]=__GLeeLink_GL_SGIS_sharpen_texture; + __GLeeGLLoadFunction[75]=__GLeeLink_GL_EXT_packed_pixels; + __GLeeGLLoadFunction[76]=__GLeeLink_GL_SGIS_texture_lod; + __GLeeGLLoadFunction[77]=__GLeeLink_GL_SGIS_multisample; + __GLeeGLLoadFunction[78]=__GLeeLink_GL_EXT_rescale_normal; + __GLeeGLLoadFunction[79]=__GLeeLink_GL_EXT_vertex_array; + __GLeeGLLoadFunction[80]=__GLeeLink_GL_EXT_misc_attribute; + __GLeeGLLoadFunction[81]=__GLeeLink_GL_SGIS_generate_mipmap; + __GLeeGLLoadFunction[82]=__GLeeLink_GL_SGIX_clipmap; + __GLeeGLLoadFunction[83]=__GLeeLink_GL_SGIX_shadow; + __GLeeGLLoadFunction[84]=__GLeeLink_GL_SGIS_texture_edge_clamp; + __GLeeGLLoadFunction[85]=__GLeeLink_GL_SGIS_texture_border_clamp; + __GLeeGLLoadFunction[86]=__GLeeLink_GL_EXT_blend_minmax; + __GLeeGLLoadFunction[87]=__GLeeLink_GL_EXT_blend_subtract; + __GLeeGLLoadFunction[88]=__GLeeLink_GL_EXT_blend_logic_op; + __GLeeGLLoadFunction[89]=__GLeeLink_GL_SGIX_interlace; + __GLeeGLLoadFunction[90]=__GLeeLink_GL_SGIX_pixel_tiles; + __GLeeGLLoadFunction[91]=__GLeeLink_GL_SGIS_texture_select; + __GLeeGLLoadFunction[92]=__GLeeLink_GL_SGIX_sprite; + __GLeeGLLoadFunction[93]=__GLeeLink_GL_SGIX_texture_multi_buffer; + __GLeeGLLoadFunction[94]=__GLeeLink_GL_EXT_point_parameters; + __GLeeGLLoadFunction[95]=__GLeeLink_GL_SGIS_point_parameters; + __GLeeGLLoadFunction[96]=__GLeeLink_GL_SGIX_instruments; + __GLeeGLLoadFunction[97]=__GLeeLink_GL_SGIX_texture_scale_bias; + __GLeeGLLoadFunction[98]=__GLeeLink_GL_SGIX_framezoom; + __GLeeGLLoadFunction[99]=__GLeeLink_GL_SGIX_tag_sample_buffer; + __GLeeGLLoadFunction[100]=__GLeeLink_GL_FfdMaskSGIX; + __GLeeGLLoadFunction[101]=__GLeeLink_GL_SGIX_polynomial_ffd; + __GLeeGLLoadFunction[102]=__GLeeLink_GL_SGIX_reference_plane; + __GLeeGLLoadFunction[103]=__GLeeLink_GL_SGIX_flush_raster; + __GLeeGLLoadFunction[104]=__GLeeLink_GL_SGIX_depth_texture; + __GLeeGLLoadFunction[105]=__GLeeLink_GL_SGIS_fog_function; + __GLeeGLLoadFunction[106]=__GLeeLink_GL_SGIX_fog_offset; + __GLeeGLLoadFunction[107]=__GLeeLink_GL_HP_image_transform; + __GLeeGLLoadFunction[108]=__GLeeLink_GL_HP_convolution_border_modes; + __GLeeGLLoadFunction[109]=__GLeeLink_GL_INGR_palette_buffer; + __GLeeGLLoadFunction[110]=__GLeeLink_GL_SGIX_texture_add_env; + __GLeeGLLoadFunction[111]=__GLeeLink_GL_EXT_color_subtable; + __GLeeGLLoadFunction[112]=__GLeeLink_GL_PGI_vertex_hints; + __GLeeGLLoadFunction[113]=__GLeeLink_GL_PGI_misc_hints; + __GLeeGLLoadFunction[114]=__GLeeLink_GL_EXT_paletted_texture; + __GLeeGLLoadFunction[115]=__GLeeLink_GL_EXT_clip_volume_hint; + __GLeeGLLoadFunction[116]=__GLeeLink_GL_SGIX_list_priority; + __GLeeGLLoadFunction[117]=__GLeeLink_GL_SGIX_ir_instrument1; + __GLeeGLLoadFunction[118]=__GLeeLink_GL_SGIX_calligraphic_fragment; + __GLeeGLLoadFunction[119]=__GLeeLink_GL_SGIX_texture_lod_bias; + __GLeeGLLoadFunction[120]=__GLeeLink_GL_SGIX_shadow_ambient; + __GLeeGLLoadFunction[121]=__GLeeLink_GL_EXT_index_texture; + __GLeeGLLoadFunction[122]=__GLeeLink_GL_EXT_index_material; + __GLeeGLLoadFunction[123]=__GLeeLink_GL_EXT_index_func; + __GLeeGLLoadFunction[124]=__GLeeLink_GL_EXT_index_array_formats; + __GLeeGLLoadFunction[125]=__GLeeLink_GL_EXT_compiled_vertex_array; + __GLeeGLLoadFunction[126]=__GLeeLink_GL_EXT_cull_vertex; + __GLeeGLLoadFunction[127]=__GLeeLink_GL_SGIX_ycrcb; + __GLeeGLLoadFunction[128]=__GLeeLink_GL_SGIX_fragment_lighting; + __GLeeGLLoadFunction[129]=__GLeeLink_GL_IBM_rasterpos_clip; + __GLeeGLLoadFunction[130]=__GLeeLink_GL_HP_texture_lighting; + __GLeeGLLoadFunction[131]=__GLeeLink_GL_EXT_draw_range_elements; + __GLeeGLLoadFunction[132]=__GLeeLink_GL_WIN_phong_shading; + __GLeeGLLoadFunction[133]=__GLeeLink_GL_WIN_specular_fog; + __GLeeGLLoadFunction[134]=__GLeeLink_GL_EXT_light_texture; + __GLeeGLLoadFunction[135]=__GLeeLink_GL_SGIX_blend_alpha_minmax; + __GLeeGLLoadFunction[136]=__GLeeLink_GL_SGIX_impact_pixel_texture; + __GLeeGLLoadFunction[137]=__GLeeLink_GL_EXT_bgra; + __GLeeGLLoadFunction[138]=__GLeeLink_GL_SGIX_async; + __GLeeGLLoadFunction[139]=__GLeeLink_GL_SGIX_async_pixel; + __GLeeGLLoadFunction[140]=__GLeeLink_GL_SGIX_async_histogram; + __GLeeGLLoadFunction[141]=__GLeeLink_GL_INTEL_texture_scissor; + __GLeeGLLoadFunction[142]=__GLeeLink_GL_INTEL_parallel_arrays; + __GLeeGLLoadFunction[143]=__GLeeLink_GL_HP_occlusion_test; + __GLeeGLLoadFunction[144]=__GLeeLink_GL_EXT_pixel_transform; + __GLeeGLLoadFunction[145]=__GLeeLink_GL_EXT_pixel_transform_color_table; + __GLeeGLLoadFunction[146]=__GLeeLink_GL_EXT_shared_texture_palette; + __GLeeGLLoadFunction[147]=__GLeeLink_GL_EXT_separate_specular_color; + __GLeeGLLoadFunction[148]=__GLeeLink_GL_EXT_secondary_color; + __GLeeGLLoadFunction[149]=__GLeeLink_GL_EXT_texture_perturb_normal; + __GLeeGLLoadFunction[150]=__GLeeLink_GL_EXT_multi_draw_arrays; + __GLeeGLLoadFunction[151]=__GLeeLink_GL_EXT_fog_coord; + __GLeeGLLoadFunction[152]=__GLeeLink_GL_REND_screen_coordinates; + __GLeeGLLoadFunction[153]=__GLeeLink_GL_EXT_coordinate_frame; + __GLeeGLLoadFunction[154]=__GLeeLink_GL_EXT_texture_env_combine; + __GLeeGLLoadFunction[155]=__GLeeLink_GL_APPLE_specular_vector; + __GLeeGLLoadFunction[156]=__GLeeLink_GL_APPLE_transform_hint; + __GLeeGLLoadFunction[157]=__GLeeLink_GL_SGIX_fog_scale; + __GLeeGLLoadFunction[158]=__GLeeLink_GL_SUNX_constant_data; + __GLeeGLLoadFunction[159]=__GLeeLink_GL_SUN_global_alpha; + __GLeeGLLoadFunction[160]=__GLeeLink_GL_SUN_triangle_list; + __GLeeGLLoadFunction[161]=__GLeeLink_GL_SUN_vertex; + __GLeeGLLoadFunction[162]=__GLeeLink_GL_EXT_blend_func_separate; + __GLeeGLLoadFunction[163]=__GLeeLink_GL_INGR_color_clamp; + __GLeeGLLoadFunction[164]=__GLeeLink_GL_INGR_interlace_read; + __GLeeGLLoadFunction[165]=__GLeeLink_GL_EXT_stencil_wrap; + __GLeeGLLoadFunction[166]=__GLeeLink_GL_EXT_422_pixels; + __GLeeGLLoadFunction[167]=__GLeeLink_GL_NV_texgen_reflection; + __GLeeGLLoadFunction[168]=__GLeeLink_GL_EXT_texture_cube_map; + __GLeeGLLoadFunction[169]=__GLeeLink_GL_SUN_convolution_border_modes; + __GLeeGLLoadFunction[170]=__GLeeLink_GL_EXT_texture_env_add; + __GLeeGLLoadFunction[171]=__GLeeLink_GL_EXT_texture_lod_bias; + __GLeeGLLoadFunction[172]=__GLeeLink_GL_EXT_texture_filter_anisotropic; + __GLeeGLLoadFunction[173]=__GLeeLink_GL_EXT_vertex_weighting; + __GLeeGLLoadFunction[174]=__GLeeLink_GL_NV_light_max_exponent; + __GLeeGLLoadFunction[175]=__GLeeLink_GL_NV_vertex_array_range; + __GLeeGLLoadFunction[176]=__GLeeLink_GL_NV_register_combiners; + __GLeeGLLoadFunction[177]=__GLeeLink_GL_NV_fog_distance; + __GLeeGLLoadFunction[178]=__GLeeLink_GL_NV_texgen_emboss; + __GLeeGLLoadFunction[179]=__GLeeLink_GL_NV_blend_square; + __GLeeGLLoadFunction[180]=__GLeeLink_GL_NV_texture_env_combine4; + __GLeeGLLoadFunction[181]=__GLeeLink_GL_MESA_resize_buffers; + __GLeeGLLoadFunction[182]=__GLeeLink_GL_MESA_window_pos; + __GLeeGLLoadFunction[183]=__GLeeLink_GL_EXT_texture_compression_s3tc; + __GLeeGLLoadFunction[184]=__GLeeLink_GL_IBM_cull_vertex; + __GLeeGLLoadFunction[185]=__GLeeLink_GL_IBM_multimode_draw_arrays; + __GLeeGLLoadFunction[186]=__GLeeLink_GL_IBM_vertex_array_lists; + __GLeeGLLoadFunction[187]=__GLeeLink_GL_SGIX_subsample; + __GLeeGLLoadFunction[188]=__GLeeLink_GL_SGIX_ycrcb_subsample; + __GLeeGLLoadFunction[189]=__GLeeLink_GL_SGIX_ycrcba; + __GLeeGLLoadFunction[190]=__GLeeLink_GL_SGI_depth_pass_instrument; + __GLeeGLLoadFunction[191]=__GLeeLink_GL_3DFX_texture_compression_FXT1; + __GLeeGLLoadFunction[192]=__GLeeLink_GL_3DFX_multisample; + __GLeeGLLoadFunction[193]=__GLeeLink_GL_3DFX_tbuffer; + __GLeeGLLoadFunction[194]=__GLeeLink_GL_EXT_multisample; + __GLeeGLLoadFunction[195]=__GLeeLink_GL_SGIX_vertex_preclip; + __GLeeGLLoadFunction[196]=__GLeeLink_GL_SGIX_convolution_accuracy; + __GLeeGLLoadFunction[197]=__GLeeLink_GL_SGIX_resample; + __GLeeGLLoadFunction[198]=__GLeeLink_GL_SGIS_point_line_texgen; + __GLeeGLLoadFunction[199]=__GLeeLink_GL_SGIS_texture_color_mask; + __GLeeGLLoadFunction[200]=__GLeeLink_GL_EXT_texture_env_dot3; + __GLeeGLLoadFunction[201]=__GLeeLink_GL_ATI_texture_mirror_once; + __GLeeGLLoadFunction[202]=__GLeeLink_GL_NV_fence; + __GLeeGLLoadFunction[203]=__GLeeLink_GL_IBM_texture_mirrored_repeat; + __GLeeGLLoadFunction[204]=__GLeeLink_GL_NV_evaluators; + __GLeeGLLoadFunction[205]=__GLeeLink_GL_NV_packed_depth_stencil; + __GLeeGLLoadFunction[206]=__GLeeLink_GL_NV_register_combiners2; + __GLeeGLLoadFunction[207]=__GLeeLink_GL_NV_texture_compression_vtc; + __GLeeGLLoadFunction[208]=__GLeeLink_GL_NV_texture_rectangle; + __GLeeGLLoadFunction[209]=__GLeeLink_GL_NV_texture_shader; + __GLeeGLLoadFunction[210]=__GLeeLink_GL_NV_texture_shader2; + __GLeeGLLoadFunction[211]=__GLeeLink_GL_NV_vertex_array_range2; + __GLeeGLLoadFunction[212]=__GLeeLink_GL_NV_vertex_program; + __GLeeGLLoadFunction[213]=__GLeeLink_GL_SGIX_texture_coordinate_clamp; + __GLeeGLLoadFunction[214]=__GLeeLink_GL_SGIX_scalebias_hint; + __GLeeGLLoadFunction[215]=__GLeeLink_GL_OML_interlace; + __GLeeGLLoadFunction[216]=__GLeeLink_GL_OML_subsample; + __GLeeGLLoadFunction[217]=__GLeeLink_GL_OML_resample; + __GLeeGLLoadFunction[218]=__GLeeLink_GL_NV_copy_depth_to_color; + __GLeeGLLoadFunction[219]=__GLeeLink_GL_ATI_envmap_bumpmap; + __GLeeGLLoadFunction[220]=__GLeeLink_GL_ATI_fragment_shader; + __GLeeGLLoadFunction[221]=__GLeeLink_GL_ATI_pn_triangles; + __GLeeGLLoadFunction[222]=__GLeeLink_GL_ATI_vertex_array_object; + __GLeeGLLoadFunction[223]=__GLeeLink_GL_EXT_vertex_shader; + __GLeeGLLoadFunction[224]=__GLeeLink_GL_ATI_vertex_streams; + __GLeeGLLoadFunction[225]=__GLeeLink_GL_ATI_element_array; + __GLeeGLLoadFunction[226]=__GLeeLink_GL_SUN_mesh_array; + __GLeeGLLoadFunction[227]=__GLeeLink_GL_SUN_slice_accum; + __GLeeGLLoadFunction[228]=__GLeeLink_GL_NV_multisample_filter_hint; + __GLeeGLLoadFunction[229]=__GLeeLink_GL_NV_depth_clamp; + __GLeeGLLoadFunction[230]=__GLeeLink_GL_NV_occlusion_query; + __GLeeGLLoadFunction[231]=__GLeeLink_GL_NV_point_sprite; + __GLeeGLLoadFunction[232]=__GLeeLink_GL_NV_texture_shader3; + __GLeeGLLoadFunction[233]=__GLeeLink_GL_NV_vertex_program1_1; + __GLeeGLLoadFunction[234]=__GLeeLink_GL_EXT_shadow_funcs; + __GLeeGLLoadFunction[235]=__GLeeLink_GL_EXT_stencil_two_side; + __GLeeGLLoadFunction[236]=__GLeeLink_GL_ATI_text_fragment_shader; + __GLeeGLLoadFunction[237]=__GLeeLink_GL_APPLE_client_storage; + __GLeeGLLoadFunction[238]=__GLeeLink_GL_APPLE_element_array; + __GLeeGLLoadFunction[239]=__GLeeLink_GL_APPLE_fence; + __GLeeGLLoadFunction[240]=__GLeeLink_GL_APPLE_vertex_array_object; + __GLeeGLLoadFunction[241]=__GLeeLink_GL_APPLE_vertex_array_range; + __GLeeGLLoadFunction[242]=__GLeeLink_GL_APPLE_ycbcr_422; + __GLeeGLLoadFunction[243]=__GLeeLink_GL_S3_s3tc; + __GLeeGLLoadFunction[244]=__GLeeLink_GL_ATI_draw_buffers; + __GLeeGLLoadFunction[245]=__GLeeLink_GL_ATI_pixel_format_float; + __GLeeGLLoadFunction[246]=__GLeeLink_GL_ATI_texture_env_combine3; + __GLeeGLLoadFunction[247]=__GLeeLink_GL_ATI_texture_float; + __GLeeGLLoadFunction[248]=__GLeeLink_GL_NV_float_buffer; + __GLeeGLLoadFunction[249]=__GLeeLink_GL_NV_fragment_program; + __GLeeGLLoadFunction[250]=__GLeeLink_GL_NV_half_float; + __GLeeGLLoadFunction[251]=__GLeeLink_GL_NV_pixel_data_range; + __GLeeGLLoadFunction[252]=__GLeeLink_GL_NV_primitive_restart; + __GLeeGLLoadFunction[253]=__GLeeLink_GL_NV_texture_expand_normal; + __GLeeGLLoadFunction[254]=__GLeeLink_GL_NV_vertex_program2; + __GLeeGLLoadFunction[255]=__GLeeLink_GL_ATI_map_object_buffer; + __GLeeGLLoadFunction[256]=__GLeeLink_GL_ATI_separate_stencil; + __GLeeGLLoadFunction[257]=__GLeeLink_GL_ATI_vertex_attrib_array_object; + __GLeeGLLoadFunction[258]=__GLeeLink_GL_OES_read_format; + __GLeeGLLoadFunction[259]=__GLeeLink_GL_EXT_depth_bounds_test; + __GLeeGLLoadFunction[260]=__GLeeLink_GL_EXT_texture_mirror_clamp; + __GLeeGLLoadFunction[261]=__GLeeLink_GL_EXT_blend_equation_separate; + __GLeeGLLoadFunction[262]=__GLeeLink_GL_MESA_pack_invert; + __GLeeGLLoadFunction[263]=__GLeeLink_GL_MESA_ycbcr_texture; + __GLeeGLLoadFunction[264]=__GLeeLink_GL_EXT_pixel_buffer_object; + __GLeeGLLoadFunction[265]=__GLeeLink_GL_NV_fragment_program_option; + __GLeeGLLoadFunction[266]=__GLeeLink_GL_NV_fragment_program2; + __GLeeGLLoadFunction[267]=__GLeeLink_GL_NV_vertex_program2_option; + __GLeeGLLoadFunction[268]=__GLeeLink_GL_NV_vertex_program3; + __GLeeGLLoadFunction[269]=__GLeeLink_GL_EXT_framebuffer_object; + __GLeeGLLoadFunction[270]=__GLeeLink_GL_GREMEDY_string_marker; + __GLeeGLLoadFunction[271]=__GLeeLink_GL_EXT_packed_depth_stencil; + __GLeeGLLoadFunction[272]=__GLeeLink_GL_EXT_stencil_clear_tag; + __GLeeGLLoadFunction[273]=__GLeeLink_GL_EXT_texture_sRGB; + __GLeeGLLoadFunction[274]=__GLeeLink_GL_EXT_framebuffer_blit; + __GLeeGLLoadFunction[275]=__GLeeLink_GL_EXT_framebuffer_multisample; + __GLeeGLLoadFunction[276]=__GLeeLink_GL_MESAX_texture_stack; + __GLeeGLLoadFunction[277]=__GLeeLink_GL_EXT_timer_query; + __GLeeGLLoadFunction[278]=__GLeeLink_GL_EXT_gpu_program_parameters; + __GLeeGLLoadFunction[279]=__GLeeLink_GL_APPLE_flush_buffer_range; + __GLeeGLLoadFunction[280]=__GLeeLink_GL_EXT_gpu_shader4; + __GLeeGLLoadFunction[281]=__GLeeLink_GL_EXT_draw_instanced; + __GLeeGLLoadFunction[282]=__GLeeLink_GL_EXT_packed_float; + __GLeeGLLoadFunction[283]=__GLeeLink_GL_EXT_texture_array; + __GLeeGLLoadFunction[284]=__GLeeLink_GL_EXT_texture_buffer_object; + __GLeeGLLoadFunction[285]=__GLeeLink_GL_EXT_texture_compression_latc; + __GLeeGLLoadFunction[286]=__GLeeLink_GL_EXT_texture_compression_rgtc; + __GLeeGLLoadFunction[287]=__GLeeLink_GL_EXT_texture_shared_exponent; + __GLeeGLLoadFunction[288]=__GLeeLink_GL_NV_depth_buffer_float; + __GLeeGLLoadFunction[289]=__GLeeLink_GL_NV_framebuffer_multisample_coverage; + __GLeeGLLoadFunction[290]=__GLeeLink_GL_EXT_framebuffer_sRGB; + __GLeeGLLoadFunction[291]=__GLeeLink_GL_NV_geometry_shader4; + __GLeeGLLoadFunction[292]=__GLeeLink_GL_NV_parameter_buffer_object; + __GLeeGLLoadFunction[293]=__GLeeLink_GL_EXT_draw_buffers2; + __GLeeGLLoadFunction[294]=__GLeeLink_GL_NV_transform_feedback; + __GLeeGLLoadFunction[295]=__GLeeLink_GL_EXT_bindable_uniform; + __GLeeGLLoadFunction[296]=__GLeeLink_GL_EXT_texture_integer; + __GLeeGLLoadFunction[297]=__GLeeLink_GL_GREMEDY_frame_terminator; + __GLeeGLLoadFunction[298]=__GLeeLink_GL_NV_conditional_render; + __GLeeGLLoadFunction[299]=__GLeeLink_GL_NV_present_video; + __GLeeGLLoadFunction[300]=__GLeeLink_GL_EXT_transform_feedback; + __GLeeGLLoadFunction[301]=__GLeeLink_GL_EXT_direct_state_access; + __GLeeGLLoadFunction[302]=__GLeeLink_GL_EXT_vertex_array_bgra; + __GLeeGLLoadFunction[303]=__GLeeLink_GL_EXT_texture_swizzle; + __GLeeGLLoadFunction[304]=__GLeeLink_GL_NV_explicit_multisample; + __GLeeGLLoadFunction[305]=__GLeeLink_GL_NV_transform_feedback2; + __GLeeGLLoadFunction[306]=__GLeeLink_GL_SGIX_texture_select; + __GLeeGLLoadFunction[307]=__GLeeLink_GL_INGR_blend_func_separate; + __GLeeGLLoadFunction[308]=__GLeeLink_GL_SGIX_depth_pass_instrument; + __GLeeGLLoadFunction[309]=__GLeeLink_GL_SGIX_igloo_interface; + __GLeeGLLoadFunction[310]=__GLeeLink_GL_EXT_fragment_lighting; + __GLeeGLLoadFunction[311]=__GLeeLink_GL_EXT_geometry_shader4; + __GLeeGLLoadFunction[312]=__GLeeLink_GL_EXT_scene_marker; + __GLeeGLLoadFunction[313]=__GLeeLink_GL_EXT_texture_compression_dxt1; + __GLeeGLLoadFunction[314]=__GLeeLink_GL_EXT_texture_env; + __GLeeGLLoadFunction[315]=__GLeeLink_GL_IBM_static_data; + __GLeeGLLoadFunction[316]=__GLeeLink_GL_NV_gpu_program4; + __GLeeGLLoadFunction[317]=__GLeeLink_GL_OES_byte_coordinates; + __GLeeGLLoadFunction[318]=__GLeeLink_GL_OES_compressed_paletted_texture; + __GLeeGLLoadFunction[319]=__GLeeLink_GL_OES_single_precision; + __GLeeGLLoadFunction[320]=__GLeeLink_GL_SGIX_pixel_texture_bits; + __GLeeGLLoadFunction[321]=__GLeeLink_GL_SGIX_texture_range; +} + +#ifdef WIN32 +GLuint __GLeeLink_WGL_ARB_buffer_region(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_buffer_region + if ((GLeeFuncPtr_wglCreateBufferRegionARB = (GLEEPFNWGLCREATEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglCreateBufferRegionARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDeleteBufferRegionARB = (GLEEPFNWGLDELETEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglDeleteBufferRegionARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSaveBufferRegionARB = (GLEEPFNWGLSAVEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglSaveBufferRegionARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglRestoreBufferRegionARB = (GLEEPFNWGLRESTOREBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglRestoreBufferRegionARB"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_ARB_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_ARB_extensions_string(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_extensions_string + if ((GLeeFuncPtr_wglGetExtensionsStringARB = (GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) __GLeeGetProcAddress("wglGetExtensionsStringARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_ARB_pixel_format(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_pixel_format + if ((GLeeFuncPtr_wglGetPixelFormatAttribivARB = (GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribivARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetPixelFormatAttribfvARB = (GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribfvARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglChoosePixelFormatARB = (GLEEPFNWGLCHOOSEPIXELFORMATARBPROC) __GLeeGetProcAddress("wglChoosePixelFormatARB"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_ARB_make_current_read(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_make_current_read + if ((GLeeFuncPtr_wglMakeContextCurrentARB = (GLEEPFNWGLMAKECONTEXTCURRENTARBPROC) __GLeeGetProcAddress("wglMakeContextCurrentARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetCurrentReadDCARB = (GLEEPFNWGLGETCURRENTREADDCARBPROC) __GLeeGetProcAddress("wglGetCurrentReadDCARB"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_ARB_pbuffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_pbuffer + if ((GLeeFuncPtr_wglCreatePbufferARB = (GLEEPFNWGLCREATEPBUFFERARBPROC) __GLeeGetProcAddress("wglCreatePbufferARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetPbufferDCARB = (GLEEPFNWGLGETPBUFFERDCARBPROC) __GLeeGetProcAddress("wglGetPbufferDCARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglReleasePbufferDCARB = (GLEEPFNWGLRELEASEPBUFFERDCARBPROC) __GLeeGetProcAddress("wglReleasePbufferDCARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDestroyPbufferARB = (GLEEPFNWGLDESTROYPBUFFERARBPROC) __GLeeGetProcAddress("wglDestroyPbufferARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryPbufferARB = (GLEEPFNWGLQUERYPBUFFERARBPROC) __GLeeGetProcAddress("wglQueryPbufferARB"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_ARB_render_texture(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_render_texture + if ((GLeeFuncPtr_wglBindTexImageARB = (GLEEPFNWGLBINDTEXIMAGEARBPROC) __GLeeGetProcAddress("wglBindTexImageARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglReleaseTexImageARB = (GLEEPFNWGLRELEASETEXIMAGEARBPROC) __GLeeGetProcAddress("wglReleaseTexImageARB"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSetPbufferAttribARB = (GLEEPFNWGLSETPBUFFERATTRIBARBPROC) __GLeeGetProcAddress("wglSetPbufferAttribARB"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_ARB_pixel_format_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_ARB_create_context(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_ARB_create_context + if ((GLeeFuncPtr_wglCreateContextAttribsARB = (GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC) __GLeeGetProcAddress("wglCreateContextAttribsARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_make_current_read(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_EXT_make_current_read + if ((GLeeFuncPtr_wglMakeContextCurrentEXT = (GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC) __GLeeGetProcAddress("wglMakeContextCurrentEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetCurrentReadDCEXT = (GLEEPFNWGLGETCURRENTREADDCEXTPROC) __GLeeGetProcAddress("wglGetCurrentReadDCEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_pixel_format(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_EXT_pixel_format + if ((GLeeFuncPtr_wglGetPixelFormatAttribivEXT = (GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribivEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetPixelFormatAttribfvEXT = (GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribfvEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglChoosePixelFormatEXT = (GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC) __GLeeGetProcAddress("wglChoosePixelFormatEXT"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_pbuffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_EXT_pbuffer + if ((GLeeFuncPtr_wglCreatePbufferEXT = (GLEEPFNWGLCREATEPBUFFEREXTPROC) __GLeeGetProcAddress("wglCreatePbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetPbufferDCEXT = (GLEEPFNWGLGETPBUFFERDCEXTPROC) __GLeeGetProcAddress("wglGetPbufferDCEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglReleasePbufferDCEXT = (GLEEPFNWGLRELEASEPBUFFERDCEXTPROC) __GLeeGetProcAddress("wglReleasePbufferDCEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDestroyPbufferEXT = (GLEEPFNWGLDESTROYPBUFFEREXTPROC) __GLeeGetProcAddress("wglDestroyPbufferEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryPbufferEXT = (GLEEPFNWGLQUERYPBUFFEREXTPROC) __GLeeGetProcAddress("wglQueryPbufferEXT"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_depth_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_EXT_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_I3D_digital_video_control(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_I3D_digital_video_control + if ((GLeeFuncPtr_wglGetDigitalVideoParametersI3D = (GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) __GLeeGetProcAddress("wglGetDigitalVideoParametersI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSetDigitalVideoParametersI3D = (GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) __GLeeGetProcAddress("wglSetDigitalVideoParametersI3D"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_I3D_gamma(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_I3D_gamma + if ((GLeeFuncPtr_wglGetGammaTableParametersI3D = (GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC) __GLeeGetProcAddress("wglGetGammaTableParametersI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSetGammaTableParametersI3D = (GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC) __GLeeGetProcAddress("wglSetGammaTableParametersI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetGammaTableI3D = (GLEEPFNWGLGETGAMMATABLEI3DPROC) __GLeeGetProcAddress("wglGetGammaTableI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSetGammaTableI3D = (GLEEPFNWGLSETGAMMATABLEI3DPROC) __GLeeGetProcAddress("wglSetGammaTableI3D"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_I3D_genlock(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_I3D_genlock + if ((GLeeFuncPtr_wglEnableGenlockI3D = (GLEEPFNWGLENABLEGENLOCKI3DPROC) __GLeeGetProcAddress("wglEnableGenlockI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDisableGenlockI3D = (GLEEPFNWGLDISABLEGENLOCKI3DPROC) __GLeeGetProcAddress("wglDisableGenlockI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglIsEnabledGenlockI3D = (GLEEPFNWGLISENABLEDGENLOCKI3DPROC) __GLeeGetProcAddress("wglIsEnabledGenlockI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGenlockSourceI3D = (GLEEPFNWGLGENLOCKSOURCEI3DPROC) __GLeeGetProcAddress("wglGenlockSourceI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetGenlockSourceI3D = (GLEEPFNWGLGETGENLOCKSOURCEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGenlockSourceEdgeI3D = (GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC) __GLeeGetProcAddress("wglGenlockSourceEdgeI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetGenlockSourceEdgeI3D = (GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceEdgeI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGenlockSampleRateI3D = (GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC) __GLeeGetProcAddress("wglGenlockSampleRateI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetGenlockSampleRateI3D = (GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSampleRateI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGenlockSourceDelayI3D = (GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglGenlockSourceDelayI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetGenlockSourceDelayI3D = (GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceDelayI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D = (GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglQueryGenlockMaxSourceDelayI3D"))!=0) nLinked++; +#endif + if (nLinked==12) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_I3D_image_buffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_I3D_image_buffer + if ((GLeeFuncPtr_wglCreateImageBufferI3D = (GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC) __GLeeGetProcAddress("wglCreateImageBufferI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDestroyImageBufferI3D = (GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC) __GLeeGetProcAddress("wglDestroyImageBufferI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglAssociateImageBufferEventsI3D = (GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) __GLeeGetProcAddress("wglAssociateImageBufferEventsI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglReleaseImageBufferEventsI3D = (GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) __GLeeGetProcAddress("wglReleaseImageBufferEventsI3D"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_I3D_swap_frame_lock(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_I3D_swap_frame_lock + if ((GLeeFuncPtr_wglEnableFrameLockI3D = (GLEEPFNWGLENABLEFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglEnableFrameLockI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDisableFrameLockI3D = (GLEEPFNWGLDISABLEFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglDisableFrameLockI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglIsEnabledFrameLockI3D = (GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglIsEnabledFrameLockI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryFrameLockMasterI3D = (GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC) __GLeeGetProcAddress("wglQueryFrameLockMasterI3D"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_NV_render_depth_texture(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_NV_render_texture_rectangle(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_ATI_pixel_format_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_3DL_stereo_control(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_EXT_pixel_format_packed_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_WGL_NV_present_video(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_NV_present_video + if ((GLeeFuncPtr_wglEnumerateVideoDevicesNV = (GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC) __GLeeGetProcAddress("wglEnumerateVideoDevicesNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglBindVideoDeviceNV = (GLEEPFNWGLBINDVIDEODEVICENVPROC) __GLeeGetProcAddress("wglBindVideoDeviceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryCurrentContextNV = (GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC) __GLeeGetProcAddress("wglQueryCurrentContextNV"))!=0) nLinked++; +#endif + if (nLinked==3) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_NV_swap_group(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_NV_swap_group + if ((GLeeFuncPtr_wglJoinSwapGroupNV = (GLEEPFNWGLJOINSWAPGROUPNVPROC) __GLeeGetProcAddress("wglJoinSwapGroupNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglBindSwapBarrierNV = (GLEEPFNWGLBINDSWAPBARRIERNVPROC) __GLeeGetProcAddress("wglBindSwapBarrierNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQuerySwapGroupNV = (GLEEPFNWGLQUERYSWAPGROUPNVPROC) __GLeeGetProcAddress("wglQuerySwapGroupNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryMaxSwapGroupsNV = (GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC) __GLeeGetProcAddress("wglQueryMaxSwapGroupsNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryFrameCountNV = (GLEEPFNWGLQUERYFRAMECOUNTNVPROC) __GLeeGetProcAddress("wglQueryFrameCountNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglResetFrameCountNV = (GLEEPFNWGLRESETFRAMECOUNTNVPROC) __GLeeGetProcAddress("wglResetFrameCountNV"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_NV_gpu_affinity(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_NV_gpu_affinity + if ((GLeeFuncPtr_wglEnumGpusNV = (GLEEPFNWGLENUMGPUSNVPROC) __GLeeGetProcAddress("wglEnumGpusNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglEnumGpuDevicesNV = (GLEEPFNWGLENUMGPUDEVICESNVPROC) __GLeeGetProcAddress("wglEnumGpuDevicesNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglCreateAffinityDCNV = (GLEEPFNWGLCREATEAFFINITYDCNVPROC) __GLeeGetProcAddress("wglCreateAffinityDCNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglEnumGpusFromAffinityDCNV = (GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC) __GLeeGetProcAddress("wglEnumGpusFromAffinityDCNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDeleteDCNV = (GLEEPFNWGLDELETEDCNVPROC) __GLeeGetProcAddress("wglDeleteDCNV"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_display_color_table(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_EXT_display_color_table + if ((GLeeFuncPtr_wglCreateDisplayColorTableEXT = (GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglCreateDisplayColorTableEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglLoadDisplayColorTableEXT = (GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglLoadDisplayColorTableEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglBindDisplayColorTableEXT = (GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglBindDisplayColorTableEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglDestroyDisplayColorTableEXT = (GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglDestroyDisplayColorTableEXT"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_extensions_string(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_EXT_extensions_string + if ((GLeeFuncPtr_wglGetExtensionsStringEXT = (GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC) __GLeeGetProcAddress("wglGetExtensionsStringEXT"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_EXT_swap_control(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_EXT_swap_control + if ((GLeeFuncPtr_wglSwapIntervalEXT = (GLEEPFNWGLSWAPINTERVALEXTPROC) __GLeeGetProcAddress("wglSwapIntervalEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetSwapIntervalEXT = (GLEEPFNWGLGETSWAPINTERVALEXTPROC) __GLeeGetProcAddress("wglGetSwapIntervalEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_NV_vertex_array_range(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_NV_vertex_array_range + if ((GLeeFuncPtr_wglAllocateMemoryNV = (GLEEPFNWGLALLOCATEMEMORYNVPROC) __GLeeGetProcAddress("wglAllocateMemoryNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglFreeMemoryNV = (GLEEPFNWGLFREEMEMORYNVPROC) __GLeeGetProcAddress("wglFreeMemoryNV"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_OML_sync_control(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_OML_sync_control + if ((GLeeFuncPtr_wglGetSyncValuesOML = (GLEEPFNWGLGETSYNCVALUESOMLPROC) __GLeeGetProcAddress("wglGetSyncValuesOML"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetMscRateOML = (GLEEPFNWGLGETMSCRATEOMLPROC) __GLeeGetProcAddress("wglGetMscRateOML"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSwapBuffersMscOML = (GLEEPFNWGLSWAPBUFFERSMSCOMLPROC) __GLeeGetProcAddress("wglSwapBuffersMscOML"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSwapLayerBuffersMscOML = (GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC) __GLeeGetProcAddress("wglSwapLayerBuffersMscOML"))!=0) nLinked++; + if ((GLeeFuncPtr_wglWaitForMscOML = (GLEEPFNWGLWAITFORMSCOMLPROC) __GLeeGetProcAddress("wglWaitForMscOML"))!=0) nLinked++; + if ((GLeeFuncPtr_wglWaitForSbcOML = (GLEEPFNWGLWAITFORSBCOMLPROC) __GLeeGetProcAddress("wglWaitForSbcOML"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_I3D_swap_frame_usage(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_I3D_swap_frame_usage + if ((GLeeFuncPtr_wglGetFrameUsageI3D = (GLEEPFNWGLGETFRAMEUSAGEI3DPROC) __GLeeGetProcAddress("wglGetFrameUsageI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglBeginFrameTrackingI3D = (GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglBeginFrameTrackingI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglEndFrameTrackingI3D = (GLEEPFNWGLENDFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglEndFrameTrackingI3D"))!=0) nLinked++; + if ((GLeeFuncPtr_wglQueryFrameTrackingI3D = (GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglQueryFrameTrackingI3D"))!=0) nLinked++; +#endif + if (nLinked==4) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_WGL_NV_video_output(void) +{ + GLint nLinked=0; +#ifdef __GLEE_WGL_NV_video_output + if ((GLeeFuncPtr_wglGetVideoDeviceNV = (GLEEPFNWGLGETVIDEODEVICENVPROC) __GLeeGetProcAddress("wglGetVideoDeviceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglReleaseVideoDeviceNV = (GLEEPFNWGLRELEASEVIDEODEVICENVPROC) __GLeeGetProcAddress("wglReleaseVideoDeviceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglBindVideoImageNV = (GLEEPFNWGLBINDVIDEOIMAGENVPROC) __GLeeGetProcAddress("wglBindVideoImageNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglReleaseVideoImageNV = (GLEEPFNWGLRELEASEVIDEOIMAGENVPROC) __GLeeGetProcAddress("wglReleaseVideoImageNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglSendPbufferToVideoNV = (GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC) __GLeeGetProcAddress("wglSendPbufferToVideoNV"))!=0) nLinked++; + if ((GLeeFuncPtr_wglGetVideoInfoNV = (GLEEPFNWGLGETVIDEOINFONVPROC) __GLeeGetProcAddress("wglGetVideoInfoNV"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLEE_LINK_FUNCTION __GLeeWGLLoadFunction[37]; + +void initWGLLoadFunctions(void) +{ + __GLeeWGLLoadFunction[0]=__GLeeLink_WGL_ARB_buffer_region; + __GLeeWGLLoadFunction[1]=__GLeeLink_WGL_ARB_multisample; + __GLeeWGLLoadFunction[2]=__GLeeLink_WGL_ARB_extensions_string; + __GLeeWGLLoadFunction[3]=__GLeeLink_WGL_ARB_pixel_format; + __GLeeWGLLoadFunction[4]=__GLeeLink_WGL_ARB_make_current_read; + __GLeeWGLLoadFunction[5]=__GLeeLink_WGL_ARB_pbuffer; + __GLeeWGLLoadFunction[6]=__GLeeLink_WGL_ARB_render_texture; + __GLeeWGLLoadFunction[7]=__GLeeLink_WGL_ARB_pixel_format_float; + __GLeeWGLLoadFunction[8]=__GLeeLink_WGL_ARB_create_context; + __GLeeWGLLoadFunction[9]=__GLeeLink_WGL_EXT_make_current_read; + __GLeeWGLLoadFunction[10]=__GLeeLink_WGL_EXT_pixel_format; + __GLeeWGLLoadFunction[11]=__GLeeLink_WGL_EXT_pbuffer; + __GLeeWGLLoadFunction[12]=__GLeeLink_WGL_EXT_depth_float; + __GLeeWGLLoadFunction[13]=__GLeeLink_WGL_3DFX_multisample; + __GLeeWGLLoadFunction[14]=__GLeeLink_WGL_EXT_multisample; + __GLeeWGLLoadFunction[15]=__GLeeLink_WGL_I3D_digital_video_control; + __GLeeWGLLoadFunction[16]=__GLeeLink_WGL_I3D_gamma; + __GLeeWGLLoadFunction[17]=__GLeeLink_WGL_I3D_genlock; + __GLeeWGLLoadFunction[18]=__GLeeLink_WGL_I3D_image_buffer; + __GLeeWGLLoadFunction[19]=__GLeeLink_WGL_I3D_swap_frame_lock; + __GLeeWGLLoadFunction[20]=__GLeeLink_WGL_NV_render_depth_texture; + __GLeeWGLLoadFunction[21]=__GLeeLink_WGL_NV_render_texture_rectangle; + __GLeeWGLLoadFunction[22]=__GLeeLink_WGL_ATI_pixel_format_float; + __GLeeWGLLoadFunction[23]=__GLeeLink_WGL_NV_float_buffer; + __GLeeWGLLoadFunction[24]=__GLeeLink_WGL_3DL_stereo_control; + __GLeeWGLLoadFunction[25]=__GLeeLink_WGL_EXT_pixel_format_packed_float; + __GLeeWGLLoadFunction[26]=__GLeeLink_WGL_EXT_framebuffer_sRGB; + __GLeeWGLLoadFunction[27]=__GLeeLink_WGL_NV_present_video; + __GLeeWGLLoadFunction[28]=__GLeeLink_WGL_NV_swap_group; + __GLeeWGLLoadFunction[29]=__GLeeLink_WGL_NV_gpu_affinity; + __GLeeWGLLoadFunction[30]=__GLeeLink_WGL_EXT_display_color_table; + __GLeeWGLLoadFunction[31]=__GLeeLink_WGL_EXT_extensions_string; + __GLeeWGLLoadFunction[32]=__GLeeLink_WGL_EXT_swap_control; + __GLeeWGLLoadFunction[33]=__GLeeLink_WGL_NV_vertex_array_range; + __GLeeWGLLoadFunction[34]=__GLeeLink_WGL_OML_sync_control; + __GLeeWGLLoadFunction[35]=__GLeeLink_WGL_I3D_swap_frame_usage; + __GLeeWGLLoadFunction[36]=__GLeeLink_WGL_NV_video_output; +} + +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else /* Linux */ +GLuint __GLeeLink_GLX_VERSION_1_3(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_VERSION_1_3 + if ((GLeeFuncPtr_glXGetFBConfigs = (GLEEPFNGLXGETFBCONFIGSPROC) __GLeeGetProcAddress("glXGetFBConfigs"))!=0) nLinked++; + if ((GLeeFuncPtr_glXChooseFBConfig = (GLEEPFNGLXCHOOSEFBCONFIGPROC) __GLeeGetProcAddress("glXChooseFBConfig"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetFBConfigAttrib = (GLEEPFNGLXGETFBCONFIGATTRIBPROC) __GLeeGetProcAddress("glXGetFBConfigAttrib"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetVisualFromFBConfig = (GLEEPFNGLXGETVISUALFROMFBCONFIGPROC) __GLeeGetProcAddress("glXGetVisualFromFBConfig"))!=0) nLinked++; + if ((GLeeFuncPtr_glXCreateWindow = (GLEEPFNGLXCREATEWINDOWPROC) __GLeeGetProcAddress("glXCreateWindow"))!=0) nLinked++; + if ((GLeeFuncPtr_glXDestroyWindow = (GLEEPFNGLXDESTROYWINDOWPROC) __GLeeGetProcAddress("glXDestroyWindow"))!=0) nLinked++; + if ((GLeeFuncPtr_glXCreatePixmap = (GLEEPFNGLXCREATEPIXMAPPROC) __GLeeGetProcAddress("glXCreatePixmap"))!=0) nLinked++; + if ((GLeeFuncPtr_glXDestroyPixmap = (GLEEPFNGLXDESTROYPIXMAPPROC) __GLeeGetProcAddress("glXDestroyPixmap"))!=0) nLinked++; + if ((GLeeFuncPtr_glXCreatePbuffer = (GLEEPFNGLXCREATEPBUFFERPROC) __GLeeGetProcAddress("glXCreatePbuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glXDestroyPbuffer = (GLEEPFNGLXDESTROYPBUFFERPROC) __GLeeGetProcAddress("glXDestroyPbuffer"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryDrawable = (GLEEPFNGLXQUERYDRAWABLEPROC) __GLeeGetProcAddress("glXQueryDrawable"))!=0) nLinked++; + if ((GLeeFuncPtr_glXCreateNewContext = (GLEEPFNGLXCREATENEWCONTEXTPROC) __GLeeGetProcAddress("glXCreateNewContext"))!=0) nLinked++; + if ((GLeeFuncPtr_glXMakeContextCurrent = (GLEEPFNGLXMAKECONTEXTCURRENTPROC) __GLeeGetProcAddress("glXMakeContextCurrent"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetCurrentReadDrawable = (GLEEPFNGLXGETCURRENTREADDRAWABLEPROC) __GLeeGetProcAddress("glXGetCurrentReadDrawable"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetCurrentDisplay = (GLEEPFNGLXGETCURRENTDISPLAYPROC) __GLeeGetProcAddress("glXGetCurrentDisplay"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryContext = (GLEEPFNGLXQUERYCONTEXTPROC) __GLeeGetProcAddress("glXQueryContext"))!=0) nLinked++; + if ((GLeeFuncPtr_glXSelectEvent = (GLEEPFNGLXSELECTEVENTPROC) __GLeeGetProcAddress("glXSelectEvent"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetSelectedEvent = (GLEEPFNGLXGETSELECTEDEVENTPROC) __GLeeGetProcAddress("glXGetSelectedEvent"))!=0) nLinked++; +#endif + if (nLinked==18) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_VERSION_1_4(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_VERSION_1_4 + if ((GLeeFuncPtr_glXGetProcAddress = (GLEEPFNGLXGETPROCADDRESSPROC) __GLeeGetProcAddress("glXGetProcAddress"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_ARB_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_ARB_fbconfig_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_ARB_create_context(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_ARB_create_context + if ((GLeeFuncPtr_glXCreateContextAttribsARB = (GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC) __GLeeGetProcAddress("glXCreateContextAttribsARB"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIS_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_EXT_visual_info(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_SGI_swap_control(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGI_swap_control + if ((GLeeFuncPtr_glXSwapIntervalSGI = (GLEEPFNGLXSWAPINTERVALSGIPROC) __GLeeGetProcAddress("glXSwapIntervalSGI"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGI_video_sync(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGI_video_sync + if ((GLeeFuncPtr_glXGetVideoSyncSGI = (GLEEPFNGLXGETVIDEOSYNCSGIPROC) __GLeeGetProcAddress("glXGetVideoSyncSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glXWaitVideoSyncSGI = (GLEEPFNGLXWAITVIDEOSYNCSGIPROC) __GLeeGetProcAddress("glXWaitVideoSyncSGI"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGI_make_current_read(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGI_make_current_read + if ((GLeeFuncPtr_glXMakeCurrentReadSGI = (GLEEPFNGLXMAKECURRENTREADSGIPROC) __GLeeGetProcAddress("glXMakeCurrentReadSGI"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetCurrentReadDrawableSGI = (GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC) __GLeeGetProcAddress("glXGetCurrentReadDrawableSGI"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_EXT_visual_rating(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_EXT_import_context(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_EXT_import_context + if ((GLeeFuncPtr_glXGetCurrentDisplayEXT = (GLEEPFNGLXGETCURRENTDISPLAYEXTPROC) __GLeeGetProcAddress("glXGetCurrentDisplayEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryContextInfoEXT = (GLEEPFNGLXQUERYCONTEXTINFOEXTPROC) __GLeeGetProcAddress("glXQueryContextInfoEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetContextIDEXT = (GLEEPFNGLXGETCONTEXTIDEXTPROC) __GLeeGetProcAddress("glXGetContextIDEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glXImportContextEXT = (GLEEPFNGLXIMPORTCONTEXTEXTPROC) __GLeeGetProcAddress("glXImportContextEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glXFreeContextEXT = (GLEEPFNGLXFREECONTEXTEXTPROC) __GLeeGetProcAddress("glXFreeContextEXT"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIX_fbconfig(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGIX_fbconfig + if ((GLeeFuncPtr_glXGetFBConfigAttribSGIX = (GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC) __GLeeGetProcAddress("glXGetFBConfigAttribSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXChooseFBConfigSGIX = (GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC) __GLeeGetProcAddress("glXChooseFBConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX = (GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) __GLeeGetProcAddress("glXCreateGLXPixmapWithConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXCreateContextWithConfigSGIX = (GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) __GLeeGetProcAddress("glXCreateContextWithConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetVisualFromFBConfigSGIX = (GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC) __GLeeGetProcAddress("glXGetVisualFromFBConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetFBConfigFromVisualSGIX = (GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC) __GLeeGetProcAddress("glXGetFBConfigFromVisualSGIX"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIX_pbuffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGIX_pbuffer + if ((GLeeFuncPtr_glXCreateGLXPbufferSGIX = (GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXCreateGLXPbufferSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXDestroyGLXPbufferSGIX = (GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXDestroyGLXPbufferSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryGLXPbufferSGIX = (GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXQueryGLXPbufferSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXSelectEventSGIX = (GLEEPFNGLXSELECTEVENTSGIXPROC) __GLeeGetProcAddress("glXSelectEventSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetSelectedEventSGIX = (GLEEPFNGLXGETSELECTEDEVENTSGIXPROC) __GLeeGetProcAddress("glXGetSelectedEventSGIX"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGI_cushion(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGI_cushion + if ((GLeeFuncPtr_glXCushionSGI = (GLEEPFNGLXCUSHIONSGIPROC) __GLeeGetProcAddress("glXCushionSGI"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIX_video_resize(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGIX_video_resize + if ((GLeeFuncPtr_glXBindChannelToWindowSGIX = (GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC) __GLeeGetProcAddress("glXBindChannelToWindowSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXChannelRectSGIX = (GLEEPFNGLXCHANNELRECTSGIXPROC) __GLeeGetProcAddress("glXChannelRectSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryChannelRectSGIX = (GLEEPFNGLXQUERYCHANNELRECTSGIXPROC) __GLeeGetProcAddress("glXQueryChannelRectSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryChannelDeltasSGIX = (GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC) __GLeeGetProcAddress("glXQueryChannelDeltasSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXChannelRectSyncSGIX = (GLEEPFNGLXCHANNELRECTSYNCSGIXPROC) __GLeeGetProcAddress("glXChannelRectSyncSGIX"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIX_swap_group(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGIX_swap_group + if ((GLeeFuncPtr_glXJoinSwapGroupSGIX = (GLEEPFNGLXJOINSWAPGROUPSGIXPROC) __GLeeGetProcAddress("glXJoinSwapGroupSGIX"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIX_swap_barrier(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGIX_swap_barrier + if ((GLeeFuncPtr_glXBindSwapBarrierSGIX = (GLEEPFNGLXBINDSWAPBARRIERSGIXPROC) __GLeeGetProcAddress("glXBindSwapBarrierSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX = (GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) __GLeeGetProcAddress("glXQueryMaxSwapBarriersSGIX"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIS_blended_overlay(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_SGIS_shared_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_SUN_get_transparent_index(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SUN_get_transparent_index + if ((GLeeFuncPtr_glXGetTransparentIndexSUN = (GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC) __GLeeGetProcAddress("glXGetTransparentIndexSUN"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_MESA_copy_sub_buffer(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_MESA_copy_sub_buffer + if ((GLeeFuncPtr_glXCopySubBufferMESA = (GLEEPFNGLXCOPYSUBBUFFERMESAPROC) __GLeeGetProcAddress("glXCopySubBufferMESA"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_MESA_pixmap_colormap(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_MESA_pixmap_colormap + if ((GLeeFuncPtr_glXCreateGLXPixmapMESA = (GLEEPFNGLXCREATEGLXPIXMAPMESAPROC) __GLeeGetProcAddress("glXCreateGLXPixmapMESA"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_MESA_release_buffers(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_MESA_release_buffers + if ((GLeeFuncPtr_glXReleaseBuffersMESA = (GLEEPFNGLXRELEASEBUFFERSMESAPROC) __GLeeGetProcAddress("glXReleaseBuffersMESA"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_MESA_set_3dfx_mode(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_MESA_set_3dfx_mode + if ((GLeeFuncPtr_glXSet3DfxModeMESA = (GLEEPFNGLXSET3DFXMODEMESAPROC) __GLeeGetProcAddress("glXSet3DfxModeMESA"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_SGIX_visual_select_group(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_OML_swap_method(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_OML_sync_control(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_OML_sync_control + if ((GLeeFuncPtr_glXGetSyncValuesOML = (GLEEPFNGLXGETSYNCVALUESOMLPROC) __GLeeGetProcAddress("glXGetSyncValuesOML"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetMscRateOML = (GLEEPFNGLXGETMSCRATEOMLPROC) __GLeeGetProcAddress("glXGetMscRateOML"))!=0) nLinked++; + if ((GLeeFuncPtr_glXSwapBuffersMscOML = (GLEEPFNGLXSWAPBUFFERSMSCOMLPROC) __GLeeGetProcAddress("glXSwapBuffersMscOML"))!=0) nLinked++; + if ((GLeeFuncPtr_glXWaitForMscOML = (GLEEPFNGLXWAITFORMSCOMLPROC) __GLeeGetProcAddress("glXWaitForMscOML"))!=0) nLinked++; + if ((GLeeFuncPtr_glXWaitForSbcOML = (GLEEPFNGLXWAITFORSBCOMLPROC) __GLeeGetProcAddress("glXWaitForSbcOML"))!=0) nLinked++; +#endif + if (nLinked==5) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_SGIX_hyperpipe(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_SGIX_hyperpipe + if ((GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX = (GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeNetworkSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXHyperpipeConfigSGIX = (GLEEPFNGLXHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXHyperpipeConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryHyperpipeConfigSGIX = (GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX = (GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXDestroyHyperpipeConfigSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXBindHyperpipeSGIX = (GLEEPFNGLXBINDHYPERPIPESGIXPROC) __GLeeGetProcAddress("glXBindHyperpipeSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX = (GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeBestAttribSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXHyperpipeAttribSGIX = (GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC) __GLeeGetProcAddress("glXHyperpipeAttribSGIX"))!=0) nLinked++; + if ((GLeeFuncPtr_glXQueryHyperpipeAttribSGIX = (GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeAttribSGIX"))!=0) nLinked++; +#endif + if (nLinked==8) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_MESA_agp_offset(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_MESA_agp_offset + if ((GLeeFuncPtr_glXGetAGPOffsetMESA = (GLEEPFNGLXGETAGPOFFSETMESAPROC) __GLeeGetProcAddress("glXGetAGPOffsetMESA"))!=0) nLinked++; +#endif + if (nLinked==1) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_EXT_fbconfig_packed_float(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_EXT_texture_from_pixmap(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_EXT_texture_from_pixmap + if ((GLeeFuncPtr_glXBindTexImageEXT = (GLEEPFNGLXBINDTEXIMAGEEXTPROC) __GLeeGetProcAddress("glXBindTexImageEXT"))!=0) nLinked++; + if ((GLeeFuncPtr_glXReleaseTexImageEXT = (GLEEPFNGLXRELEASETEXIMAGEEXTPROC) __GLeeGetProcAddress("glXReleaseTexImageEXT"))!=0) nLinked++; +#endif + if (nLinked==2) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLuint __GLeeLink_GLX_NV_present_video(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_NV_video_out(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_NV_swap_group(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_EXT_scene_marker(void) {return GLEE_LINK_COMPLETE;} + +GLuint __GLeeLink_GLX_NV_video_output(void) +{ + GLint nLinked=0; +#ifdef __GLEE_GLX_NV_video_output + if ((GLeeFuncPtr_glXGetVideoDeviceNV = (GLEEPFNGLXGETVIDEODEVICENVPROC) __GLeeGetProcAddress("glXGetVideoDeviceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glXReleaseVideoDeviceNV = (GLEEPFNGLXRELEASEVIDEODEVICENVPROC) __GLeeGetProcAddress("glXReleaseVideoDeviceNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glXBindVideoImageNV = (GLEEPFNGLXBINDVIDEOIMAGENVPROC) __GLeeGetProcAddress("glXBindVideoImageNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glXReleaseVideoImageNV = (GLEEPFNGLXRELEASEVIDEOIMAGENVPROC) __GLeeGetProcAddress("glXReleaseVideoImageNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glXSendPbufferToVideoNV = (GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC) __GLeeGetProcAddress("glXSendPbufferToVideoNV"))!=0) nLinked++; + if ((GLeeFuncPtr_glXGetVideoInfoNV = (GLEEPFNGLXGETVIDEOINFONVPROC) __GLeeGetProcAddress("glXGetVideoInfoNV"))!=0) nLinked++; +#endif + if (nLinked==6) return GLEE_LINK_COMPLETE; + if (nLinked==0) return GLEE_LINK_FAIL; + return GLEE_LINK_PARTIAL; +} + +GLEE_LINK_FUNCTION __GLeeGLXLoadFunction[40]; + +void initGLXLoadFunctions(void) +{ + __GLeeGLXLoadFunction[0]=__GLeeLink_GLX_VERSION_1_3; + __GLeeGLXLoadFunction[1]=__GLeeLink_GLX_VERSION_1_4; + __GLeeGLXLoadFunction[2]=__GLeeLink_GLX_ARB_multisample; + __GLeeGLXLoadFunction[3]=__GLeeLink_GLX_ARB_fbconfig_float; + __GLeeGLXLoadFunction[4]=__GLeeLink_GLX_ARB_create_context; + __GLeeGLXLoadFunction[5]=__GLeeLink_GLX_SGIS_multisample; + __GLeeGLXLoadFunction[6]=__GLeeLink_GLX_EXT_visual_info; + __GLeeGLXLoadFunction[7]=__GLeeLink_GLX_SGI_swap_control; + __GLeeGLXLoadFunction[8]=__GLeeLink_GLX_SGI_video_sync; + __GLeeGLXLoadFunction[9]=__GLeeLink_GLX_SGI_make_current_read; + __GLeeGLXLoadFunction[10]=__GLeeLink_GLX_EXT_visual_rating; + __GLeeGLXLoadFunction[11]=__GLeeLink_GLX_EXT_import_context; + __GLeeGLXLoadFunction[12]=__GLeeLink_GLX_SGIX_fbconfig; + __GLeeGLXLoadFunction[13]=__GLeeLink_GLX_SGIX_pbuffer; + __GLeeGLXLoadFunction[14]=__GLeeLink_GLX_SGI_cushion; + __GLeeGLXLoadFunction[15]=__GLeeLink_GLX_SGIX_video_resize; + __GLeeGLXLoadFunction[16]=__GLeeLink_GLX_SGIX_swap_group; + __GLeeGLXLoadFunction[17]=__GLeeLink_GLX_SGIX_swap_barrier; + __GLeeGLXLoadFunction[18]=__GLeeLink_GLX_SGIS_blended_overlay; + __GLeeGLXLoadFunction[19]=__GLeeLink_GLX_SGIS_shared_multisample; + __GLeeGLXLoadFunction[20]=__GLeeLink_GLX_SUN_get_transparent_index; + __GLeeGLXLoadFunction[21]=__GLeeLink_GLX_3DFX_multisample; + __GLeeGLXLoadFunction[22]=__GLeeLink_GLX_MESA_copy_sub_buffer; + __GLeeGLXLoadFunction[23]=__GLeeLink_GLX_MESA_pixmap_colormap; + __GLeeGLXLoadFunction[24]=__GLeeLink_GLX_MESA_release_buffers; + __GLeeGLXLoadFunction[25]=__GLeeLink_GLX_MESA_set_3dfx_mode; + __GLeeGLXLoadFunction[26]=__GLeeLink_GLX_SGIX_visual_select_group; + __GLeeGLXLoadFunction[27]=__GLeeLink_GLX_OML_swap_method; + __GLeeGLXLoadFunction[28]=__GLeeLink_GLX_OML_sync_control; + __GLeeGLXLoadFunction[29]=__GLeeLink_GLX_NV_float_buffer; + __GLeeGLXLoadFunction[30]=__GLeeLink_GLX_SGIX_hyperpipe; + __GLeeGLXLoadFunction[31]=__GLeeLink_GLX_MESA_agp_offset; + __GLeeGLXLoadFunction[32]=__GLeeLink_GLX_EXT_fbconfig_packed_float; + __GLeeGLXLoadFunction[33]=__GLeeLink_GLX_EXT_framebuffer_sRGB; + __GLeeGLXLoadFunction[34]=__GLeeLink_GLX_EXT_texture_from_pixmap; + __GLeeGLXLoadFunction[35]=__GLeeLink_GLX_NV_present_video; + __GLeeGLXLoadFunction[36]=__GLeeLink_GLX_NV_video_out; + __GLeeGLXLoadFunction[37]=__GLeeLink_GLX_NV_swap_group; + __GLeeGLXLoadFunction[38]=__GLeeLink_GLX_EXT_scene_marker; + __GLeeGLXLoadFunction[39]=__GLeeLink_GLX_NV_video_output; +} + +#endif /* end Linux */ + + +/***************************************************************** + * GLee internal types + *****************************************************************/ +typedef struct +{ + char ** names; + int * lengths; + int numNames; +}ExtensionList; + + +/***************************************************************** + * GLee internal variables + *****************************************************************/ +char GLeeErrorString[256]=""; + + +/***************************************************************** + * GLee internal functions + *****************************************************************/ + +void __GLeeExtList_init(ExtensionList *extList) +{ + extList->names=0; + extList->lengths=0; + extList->numNames=0; +} + +void __GLeeExtList_clean(ExtensionList *extList) +{ + int a; + for (a=0;anumNames;a++) + { + if (extList->names[a]!=0) free((void *)extList->names[a]); + } + if (extList->names!=0) free((void *)extList->names); + if (extList->lengths!=0) free((void *)extList->lengths); + extList->names=0; + extList->lengths=0; + extList->numNames=0; +} + +void __GLeeExtList_add(ExtensionList *extList, const char * extName) +{ + int length=strlen(extName)+1; + int i=extList->numNames; + int n=i+1; + if (i==0) + { + extList->lengths=(int *)malloc(sizeof(int)); + extList->names=(char **)malloc(sizeof(char *)); + }else + { + extList->lengths=(int *)realloc((void *)extList->lengths, n*sizeof(int)); + extList->names=(char **)realloc((void *)extList->names, n*sizeof(char *)); + } + extList->names[i]=(char *)malloc(length*sizeof(char)); + strcpy(extList->names[i],extName); + extList->lengths[i]=length; + extList->numNames++; +} + +const char *__GLeeGetExtStrPlat( void ) +{ +#ifdef WIN32 + if (!_GLEE_WGL_ARB_extensions_string) + wglGetExtensionsStringARB = (GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); + + if (wglGetExtensionsStringARB) + return (const char *)wglGetExtensionsStringARB(wglGetCurrentDC()); +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else + Display *dpy=glXGetCurrentDisplay(); + if(dpy) + { + int dpynr=DefaultScreen(dpy); + return (const char*)glXQueryExtensionsString(dpy,dpynr); + } +#endif + return 0; +} + +void __GLeeWriteError(const char * errorStr) +{ + int a=0; + for (a=0;a<256;a++) + { + GLeeErrorString[a]=errorStr[a]; + } + GLeeErrorString[255]='\0'; +} + +int __GLeeGetVersionNumber(char *versionStr) +{ + int major=(int)versionStr[0]-(int)'0'; + int minor=(int)versionStr[2]-(int)'0'; + return major<<8 | minor; +} + +GLboolean __GLeeGetExtensions(ExtensionList* extList) +{ + const char * platExtStr; + const char * glExtStr; + char * extStr; + char emptyString[1] = ""; + char extensionName[1024]; + int a,b; + int totalExtStrLen; + int platExtStrLen; + int addASpace; + + /* read the platform specific extension string */ + platExtStr=__GLeeGetExtStrPlat(); + if (!platExtStr) platExtStr=emptyString; + + glExtStr=(const char *)glGetString(GL_EXTENSIONS); + if (glExtStr==0) + { + __GLeeWriteError("glGetString(GL_EXTENSIONS) failed."); + return GL_FALSE; + } + + /* allocate the extension string */ + platExtStrLen = strlen(platExtStr); + totalExtStrLen = platExtStrLen + strlen(glExtStr); + extStr=(char *)malloc( (totalExtStrLen+2) * sizeof(char) ); /* we add 2 to allow for an extra space and a null terminator */ + + /* If the last character of platExtStr is not a space, we need to add one when we concatenate the extension strings*/ + addASpace = 0; + if ( platExtStrLen > 2 ) + { + if ( platExtStr[ platExtStrLen-1 ] != ' ') + { + addASpace = 1; + } + } + + /* concatenate the two extension strings */ + if ( addASpace ) + { + sprintf(extStr,"%s %s",platExtStr,glExtStr); + } + else + { + sprintf(extStr,"%s%s",platExtStr,glExtStr); + } + + /* extract the extensions */ + for ( a=0;anumNames; + int a; + for (a=0;anames[a],name)==0) + return GL_TRUE; + } + return GL_FALSE; +} + +GLEE_EXTERN GLint __GLeeGetExtensionNumber(const char *extensionName, int type) +{ + int a; + switch (type) + { + case 0: + for (a=0;a<__GLeeGLNumExtensions;a++) + if (strcmp(extensionName,__GLeeGLExtensionNames[a])==0) return a; + return -1; +#ifdef WIN32 + case 1: + for (a=0;a<__GLeeWGLNumExtensions;a++) + if (strcmp(extensionName,__GLeeWGLExtensionNames[a])==0) return a; + return -1; +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else + case 2: + for (a=0;a<__GLeeGLXNumExtensions;a++) + if (strcmp(extensionName,__GLeeGLXExtensionNames[a])==0) return a; + return -1; +#endif + } + return -1; +} + +/***************************************************************** + * GLee external functions + *****************************************************************/ + +#ifdef WIN32 +GLEE_EXTERN const char * GLeeGetExtStrWGL( void ) +{ + return __GLeeGetExtStrPlat(); +} +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else +GLEE_EXTERN const char * GLeeGetExtStrGLX( void ) +{ + return __GLeeGetExtStrPlat(); +} +#endif + +GLEE_EXTERN const char * GLeeGetExtStrGL( void ) +{ + return (const char *)glGetString(GL_EXTENSIONS); +} + +GLEE_EXTERN const char * GLeeGetErrorString( void ) +{ + return GLeeErrorString; +} + +GLboolean __GLeeInitedLoadFunctions=GL_FALSE; + +GLEE_EXTERN GLint GLeeForceLink(const char * extensionName) +{ + int type=0; + int extNum; + int len=strlen(extensionName); + if (len<5) return GLEE_LINK_FAIL; + if (!__GLeeInitedLoadFunctions) + { + if (!__GLeeInited) GLeeInit(); + initGLLoadFunctions(); +#ifdef WIN32 + initWGLLoadFunctions(); +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else + initGLXLoadFunctions(); +#endif + __GLeeInitedLoadFunctions=GL_TRUE; + } + if (extensionName[0]=='W') type=1; + else if (extensionName[2]=='X') type=2; + extNum=__GLeeGetExtensionNumber(extensionName,type); + if (extNum==-1) return GLEE_LINK_FAIL; + if (type==0) return __GLeeGLLoadFunction[extNum](); +#ifdef WIN32 + if (type==1) return __GLeeWGLLoadFunction[extNum](); +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else + if (type==2) return __GLeeGLXLoadFunction[extNum](); +#endif + return GLEE_LINK_FAIL; +} + +GLEE_EXTERN GLboolean GLeeEnabled(GLboolean * extensionQueryingVariable) +{ + if (!__GLeeInited) GLeeInit(); + return *extensionQueryingVariable; +} + +GLEE_EXTERN GLboolean GLeeInit( void ) +{ + int version; + ExtensionList extensionNames; + + if (__GLeeInited) + { + return GL_FALSE; + } + + __GLeeExtList_init(&extensionNames); + if (!__GLeeGetExtensions(&extensionNames)) + { + __GLeeWriteError("GL extension querying failed."); + __GLeeExtList_clean(&extensionNames); + return GL_FALSE; + } + + version=__GLeeGetVersionNumber((char *)glGetString(GL_VERSION)); + + __GLeeInited = GL_TRUE; + + +/***************************************************************** + * Autogenerated linking functions + *****************************************************************/ + if (version>=258) + { + _GLEE_VERSION_1_2 = GL_TRUE; + __GLeeLink_GL_VERSION_1_2(); + } + if (__GLeeCheckExtension("GL_ARB_imaging", &extensionNames) ) + { + _GLEE_ARB_imaging = GL_TRUE; + __GLeeLink_GL_ARB_imaging(); + } + if (version>=259) + { + _GLEE_VERSION_1_3 = GL_TRUE; + __GLeeLink_GL_VERSION_1_3(); + } + if (version>=260) + { + _GLEE_VERSION_1_4 = GL_TRUE; + __GLeeLink_GL_VERSION_1_4(); + } + if (version>=261) + { + _GLEE_VERSION_1_5 = GL_TRUE; + __GLeeLink_GL_VERSION_1_5(); + } + if (version>=512) + { + _GLEE_VERSION_2_0 = GL_TRUE; + __GLeeLink_GL_VERSION_2_0(); + } + if (version>=513) + { + _GLEE_VERSION_2_1 = GL_TRUE; + __GLeeLink_GL_VERSION_2_1(); + } + if (version>=768) + { + _GLEE_VERSION_3_0 = GL_TRUE; + __GLeeLink_GL_VERSION_3_0(); + } + if (__GLeeCheckExtension("GL_ARB_multitexture", &extensionNames) ) + { + _GLEE_ARB_multitexture = GL_TRUE; + __GLeeLink_GL_ARB_multitexture(); + } + if (__GLeeCheckExtension("GL_ARB_transpose_matrix", &extensionNames) ) + { + _GLEE_ARB_transpose_matrix = GL_TRUE; + __GLeeLink_GL_ARB_transpose_matrix(); + } + if (__GLeeCheckExtension("GL_ARB_multisample", &extensionNames) ) + { + _GLEE_ARB_multisample = GL_TRUE; + __GLeeLink_GL_ARB_multisample(); + } + if (__GLeeCheckExtension("GL_ARB_texture_env_add", &extensionNames) ) + { + _GLEE_ARB_texture_env_add = GL_TRUE; + __GLeeLink_GL_ARB_texture_env_add(); + } + if (__GLeeCheckExtension("GL_ARB_texture_cube_map", &extensionNames) ) + { + _GLEE_ARB_texture_cube_map = GL_TRUE; + __GLeeLink_GL_ARB_texture_cube_map(); + } + if (__GLeeCheckExtension("GL_ARB_texture_compression", &extensionNames) ) + { + _GLEE_ARB_texture_compression = GL_TRUE; + __GLeeLink_GL_ARB_texture_compression(); + } + if (__GLeeCheckExtension("GL_ARB_texture_border_clamp", &extensionNames) ) + { + _GLEE_ARB_texture_border_clamp = GL_TRUE; + __GLeeLink_GL_ARB_texture_border_clamp(); + } + if (__GLeeCheckExtension("GL_ARB_point_parameters", &extensionNames) ) + { + _GLEE_ARB_point_parameters = GL_TRUE; + __GLeeLink_GL_ARB_point_parameters(); + } + if (__GLeeCheckExtension("GL_ARB_vertex_blend", &extensionNames) ) + { + _GLEE_ARB_vertex_blend = GL_TRUE; + __GLeeLink_GL_ARB_vertex_blend(); + } + if (__GLeeCheckExtension("GL_ARB_matrix_palette", &extensionNames) ) + { + _GLEE_ARB_matrix_palette = GL_TRUE; + __GLeeLink_GL_ARB_matrix_palette(); + } + if (__GLeeCheckExtension("GL_ARB_texture_env_combine", &extensionNames) ) + { + _GLEE_ARB_texture_env_combine = GL_TRUE; + __GLeeLink_GL_ARB_texture_env_combine(); + } + if (__GLeeCheckExtension("GL_ARB_texture_env_crossbar", &extensionNames) ) + { + _GLEE_ARB_texture_env_crossbar = GL_TRUE; + __GLeeLink_GL_ARB_texture_env_crossbar(); + } + if (__GLeeCheckExtension("GL_ARB_texture_env_dot3", &extensionNames) ) + { + _GLEE_ARB_texture_env_dot3 = GL_TRUE; + __GLeeLink_GL_ARB_texture_env_dot3(); + } + if (__GLeeCheckExtension("GL_ARB_texture_mirrored_repeat", &extensionNames) ) + { + _GLEE_ARB_texture_mirrored_repeat = GL_TRUE; + __GLeeLink_GL_ARB_texture_mirrored_repeat(); + } + if (__GLeeCheckExtension("GL_ARB_depth_texture", &extensionNames) ) + { + _GLEE_ARB_depth_texture = GL_TRUE; + __GLeeLink_GL_ARB_depth_texture(); + } + if (__GLeeCheckExtension("GL_ARB_shadow", &extensionNames) ) + { + _GLEE_ARB_shadow = GL_TRUE; + __GLeeLink_GL_ARB_shadow(); + } + if (__GLeeCheckExtension("GL_ARB_shadow_ambient", &extensionNames) ) + { + _GLEE_ARB_shadow_ambient = GL_TRUE; + __GLeeLink_GL_ARB_shadow_ambient(); + } + if (__GLeeCheckExtension("GL_ARB_window_pos", &extensionNames) ) + { + _GLEE_ARB_window_pos = GL_TRUE; + __GLeeLink_GL_ARB_window_pos(); + } + if (__GLeeCheckExtension("GL_ARB_vertex_program", &extensionNames) ) + { + _GLEE_ARB_vertex_program = GL_TRUE; + __GLeeLink_GL_ARB_vertex_program(); + } + if (__GLeeCheckExtension("GL_ARB_fragment_program", &extensionNames) ) + { + _GLEE_ARB_fragment_program = GL_TRUE; + __GLeeLink_GL_ARB_fragment_program(); + } + if (__GLeeCheckExtension("GL_ARB_vertex_buffer_object", &extensionNames) ) + { + _GLEE_ARB_vertex_buffer_object = GL_TRUE; + __GLeeLink_GL_ARB_vertex_buffer_object(); + } + if (__GLeeCheckExtension("GL_ARB_occlusion_query", &extensionNames) ) + { + _GLEE_ARB_occlusion_query = GL_TRUE; + __GLeeLink_GL_ARB_occlusion_query(); + } + if (__GLeeCheckExtension("GL_ARB_shader_objects", &extensionNames) ) + { + _GLEE_ARB_shader_objects = GL_TRUE; + __GLeeLink_GL_ARB_shader_objects(); + } + if (__GLeeCheckExtension("GL_ARB_vertex_shader", &extensionNames) ) + { + _GLEE_ARB_vertex_shader = GL_TRUE; + __GLeeLink_GL_ARB_vertex_shader(); + } + if (__GLeeCheckExtension("GL_ARB_fragment_shader", &extensionNames) ) + { + _GLEE_ARB_fragment_shader = GL_TRUE; + __GLeeLink_GL_ARB_fragment_shader(); + } + if (__GLeeCheckExtension("GL_ARB_shading_language_100", &extensionNames) ) + { + _GLEE_ARB_shading_language_100 = GL_TRUE; + __GLeeLink_GL_ARB_shading_language_100(); + } + if (__GLeeCheckExtension("GL_ARB_texture_non_power_of_two", &extensionNames) ) + { + _GLEE_ARB_texture_non_power_of_two = GL_TRUE; + __GLeeLink_GL_ARB_texture_non_power_of_two(); + } + if (__GLeeCheckExtension("GL_ARB_point_sprite", &extensionNames) ) + { + _GLEE_ARB_point_sprite = GL_TRUE; + __GLeeLink_GL_ARB_point_sprite(); + } + if (__GLeeCheckExtension("GL_ARB_fragment_program_shadow", &extensionNames) ) + { + _GLEE_ARB_fragment_program_shadow = GL_TRUE; + __GLeeLink_GL_ARB_fragment_program_shadow(); + } + if (__GLeeCheckExtension("GL_ARB_draw_buffers", &extensionNames) ) + { + _GLEE_ARB_draw_buffers = GL_TRUE; + __GLeeLink_GL_ARB_draw_buffers(); + } + if (__GLeeCheckExtension("GL_ARB_texture_rectangle", &extensionNames) ) + { + _GLEE_ARB_texture_rectangle = GL_TRUE; + __GLeeLink_GL_ARB_texture_rectangle(); + } + if (__GLeeCheckExtension("GL_ARB_color_buffer_float", &extensionNames) ) + { + _GLEE_ARB_color_buffer_float = GL_TRUE; + __GLeeLink_GL_ARB_color_buffer_float(); + } + if (__GLeeCheckExtension("GL_ARB_half_float_pixel", &extensionNames) ) + { + _GLEE_ARB_half_float_pixel = GL_TRUE; + __GLeeLink_GL_ARB_half_float_pixel(); + } + if (__GLeeCheckExtension("GL_ARB_texture_float", &extensionNames) ) + { + _GLEE_ARB_texture_float = GL_TRUE; + __GLeeLink_GL_ARB_texture_float(); + } + if (__GLeeCheckExtension("GL_ARB_pixel_buffer_object", &extensionNames) ) + { + _GLEE_ARB_pixel_buffer_object = GL_TRUE; + __GLeeLink_GL_ARB_pixel_buffer_object(); + } + if (__GLeeCheckExtension("GL_ARB_depth_buffer_float", &extensionNames) ) + { + _GLEE_ARB_depth_buffer_float = GL_TRUE; + __GLeeLink_GL_ARB_depth_buffer_float(); + } + if (__GLeeCheckExtension("GL_ARB_draw_instanced", &extensionNames) ) + { + _GLEE_ARB_draw_instanced = GL_TRUE; + __GLeeLink_GL_ARB_draw_instanced(); + } + if (__GLeeCheckExtension("GL_ARB_framebuffer_object", &extensionNames) ) + { + _GLEE_ARB_framebuffer_object = GL_TRUE; + __GLeeLink_GL_ARB_framebuffer_object(); + } + if (__GLeeCheckExtension("GL_ARB_framebuffer_sRGB", &extensionNames) ) + { + _GLEE_ARB_framebuffer_sRGB = GL_TRUE; + __GLeeLink_GL_ARB_framebuffer_sRGB(); + } + if (__GLeeCheckExtension("GL_ARB_geometry_shader4", &extensionNames) ) + { + _GLEE_ARB_geometry_shader4 = GL_TRUE; + __GLeeLink_GL_ARB_geometry_shader4(); + } + if (__GLeeCheckExtension("GL_ARB_half_float_vertex", &extensionNames) ) + { + _GLEE_ARB_half_float_vertex = GL_TRUE; + __GLeeLink_GL_ARB_half_float_vertex(); + } + if (__GLeeCheckExtension("GL_ARB_instanced_arrays", &extensionNames) ) + { + _GLEE_ARB_instanced_arrays = GL_TRUE; + __GLeeLink_GL_ARB_instanced_arrays(); + } + if (__GLeeCheckExtension("GL_ARB_map_buffer_range", &extensionNames) ) + { + _GLEE_ARB_map_buffer_range = GL_TRUE; + __GLeeLink_GL_ARB_map_buffer_range(); + } + if (__GLeeCheckExtension("GL_ARB_texture_buffer_object", &extensionNames) ) + { + _GLEE_ARB_texture_buffer_object = GL_TRUE; + __GLeeLink_GL_ARB_texture_buffer_object(); + } + if (__GLeeCheckExtension("GL_ARB_texture_compression_rgtc", &extensionNames) ) + { + _GLEE_ARB_texture_compression_rgtc = GL_TRUE; + __GLeeLink_GL_ARB_texture_compression_rgtc(); + } + if (__GLeeCheckExtension("GL_ARB_texture_rg", &extensionNames) ) + { + _GLEE_ARB_texture_rg = GL_TRUE; + __GLeeLink_GL_ARB_texture_rg(); + } + if (__GLeeCheckExtension("GL_ARB_vertex_array_object", &extensionNames) ) + { + _GLEE_ARB_vertex_array_object = GL_TRUE; + __GLeeLink_GL_ARB_vertex_array_object(); + } + if (__GLeeCheckExtension("GL_EXT_abgr", &extensionNames) ) + { + _GLEE_EXT_abgr = GL_TRUE; + __GLeeLink_GL_EXT_abgr(); + } + if (__GLeeCheckExtension("GL_EXT_blend_color", &extensionNames) ) + { + _GLEE_EXT_blend_color = GL_TRUE; + __GLeeLink_GL_EXT_blend_color(); + } + if (__GLeeCheckExtension("GL_EXT_polygon_offset", &extensionNames) ) + { + _GLEE_EXT_polygon_offset = GL_TRUE; + __GLeeLink_GL_EXT_polygon_offset(); + } + if (__GLeeCheckExtension("GL_EXT_texture", &extensionNames) ) + { + _GLEE_EXT_texture = GL_TRUE; + __GLeeLink_GL_EXT_texture(); + } + if (__GLeeCheckExtension("GL_EXT_texture3D", &extensionNames) ) + { + _GLEE_EXT_texture3D = GL_TRUE; + __GLeeLink_GL_EXT_texture3D(); + } + if (__GLeeCheckExtension("GL_SGIS_texture_filter4", &extensionNames) ) + { + _GLEE_SGIS_texture_filter4 = GL_TRUE; + __GLeeLink_GL_SGIS_texture_filter4(); + } + if (__GLeeCheckExtension("GL_EXT_subtexture", &extensionNames) ) + { + _GLEE_EXT_subtexture = GL_TRUE; + __GLeeLink_GL_EXT_subtexture(); + } + if (__GLeeCheckExtension("GL_EXT_copy_texture", &extensionNames) ) + { + _GLEE_EXT_copy_texture = GL_TRUE; + __GLeeLink_GL_EXT_copy_texture(); + } + if (__GLeeCheckExtension("GL_EXT_histogram", &extensionNames) ) + { + _GLEE_EXT_histogram = GL_TRUE; + __GLeeLink_GL_EXT_histogram(); + } + if (__GLeeCheckExtension("GL_EXT_convolution", &extensionNames) ) + { + _GLEE_EXT_convolution = GL_TRUE; + __GLeeLink_GL_EXT_convolution(); + } + if (__GLeeCheckExtension("GL_SGI_color_matrix", &extensionNames) ) + { + _GLEE_SGI_color_matrix = GL_TRUE; + __GLeeLink_GL_SGI_color_matrix(); + } + if (__GLeeCheckExtension("GL_SGI_color_table", &extensionNames) ) + { + _GLEE_SGI_color_table = GL_TRUE; + __GLeeLink_GL_SGI_color_table(); + } + if (__GLeeCheckExtension("GL_SGIS_pixel_texture", &extensionNames) ) + { + _GLEE_SGIS_pixel_texture = GL_TRUE; + __GLeeLink_GL_SGIS_pixel_texture(); + } + if (__GLeeCheckExtension("GL_SGIX_pixel_texture", &extensionNames) ) + { + _GLEE_SGIX_pixel_texture = GL_TRUE; + __GLeeLink_GL_SGIX_pixel_texture(); + } + if (__GLeeCheckExtension("GL_SGIS_texture4D", &extensionNames) ) + { + _GLEE_SGIS_texture4D = GL_TRUE; + __GLeeLink_GL_SGIS_texture4D(); + } + if (__GLeeCheckExtension("GL_SGI_texture_color_table", &extensionNames) ) + { + _GLEE_SGI_texture_color_table = GL_TRUE; + __GLeeLink_GL_SGI_texture_color_table(); + } + if (__GLeeCheckExtension("GL_EXT_cmyka", &extensionNames) ) + { + _GLEE_EXT_cmyka = GL_TRUE; + __GLeeLink_GL_EXT_cmyka(); + } + if (__GLeeCheckExtension("GL_EXT_texture_object", &extensionNames) ) + { + _GLEE_EXT_texture_object = GL_TRUE; + __GLeeLink_GL_EXT_texture_object(); + } + if (__GLeeCheckExtension("GL_SGIS_detail_texture", &extensionNames) ) + { + _GLEE_SGIS_detail_texture = GL_TRUE; + __GLeeLink_GL_SGIS_detail_texture(); + } + if (__GLeeCheckExtension("GL_SGIS_sharpen_texture", &extensionNames) ) + { + _GLEE_SGIS_sharpen_texture = GL_TRUE; + __GLeeLink_GL_SGIS_sharpen_texture(); + } + if (__GLeeCheckExtension("GL_EXT_packed_pixels", &extensionNames) ) + { + _GLEE_EXT_packed_pixels = GL_TRUE; + __GLeeLink_GL_EXT_packed_pixels(); + } + if (__GLeeCheckExtension("GL_SGIS_texture_lod", &extensionNames) ) + { + _GLEE_SGIS_texture_lod = GL_TRUE; + __GLeeLink_GL_SGIS_texture_lod(); + } + if (__GLeeCheckExtension("GL_SGIS_multisample", &extensionNames) ) + { + _GLEE_SGIS_multisample = GL_TRUE; + __GLeeLink_GL_SGIS_multisample(); + } + if (__GLeeCheckExtension("GL_EXT_rescale_normal", &extensionNames) ) + { + _GLEE_EXT_rescale_normal = GL_TRUE; + __GLeeLink_GL_EXT_rescale_normal(); + } + if (__GLeeCheckExtension("GL_EXT_vertex_array", &extensionNames) ) + { + _GLEE_EXT_vertex_array = GL_TRUE; + __GLeeLink_GL_EXT_vertex_array(); + } + if (__GLeeCheckExtension("GL_EXT_misc_attribute", &extensionNames) ) + { + _GLEE_EXT_misc_attribute = GL_TRUE; + __GLeeLink_GL_EXT_misc_attribute(); + } + if (__GLeeCheckExtension("GL_SGIS_generate_mipmap", &extensionNames) ) + { + _GLEE_SGIS_generate_mipmap = GL_TRUE; + __GLeeLink_GL_SGIS_generate_mipmap(); + } + if (__GLeeCheckExtension("GL_SGIX_clipmap", &extensionNames) ) + { + _GLEE_SGIX_clipmap = GL_TRUE; + __GLeeLink_GL_SGIX_clipmap(); + } + if (__GLeeCheckExtension("GL_SGIX_shadow", &extensionNames) ) + { + _GLEE_SGIX_shadow = GL_TRUE; + __GLeeLink_GL_SGIX_shadow(); + } + if (__GLeeCheckExtension("GL_SGIS_texture_edge_clamp", &extensionNames) ) + { + _GLEE_SGIS_texture_edge_clamp = GL_TRUE; + __GLeeLink_GL_SGIS_texture_edge_clamp(); + } + if (__GLeeCheckExtension("GL_SGIS_texture_border_clamp", &extensionNames) ) + { + _GLEE_SGIS_texture_border_clamp = GL_TRUE; + __GLeeLink_GL_SGIS_texture_border_clamp(); + } + if (__GLeeCheckExtension("GL_EXT_blend_minmax", &extensionNames) ) + { + _GLEE_EXT_blend_minmax = GL_TRUE; + __GLeeLink_GL_EXT_blend_minmax(); + } + if (__GLeeCheckExtension("GL_EXT_blend_subtract", &extensionNames) ) + { + _GLEE_EXT_blend_subtract = GL_TRUE; + __GLeeLink_GL_EXT_blend_subtract(); + } + if (__GLeeCheckExtension("GL_EXT_blend_logic_op", &extensionNames) ) + { + _GLEE_EXT_blend_logic_op = GL_TRUE; + __GLeeLink_GL_EXT_blend_logic_op(); + } + if (__GLeeCheckExtension("GL_SGIX_interlace", &extensionNames) ) + { + _GLEE_SGIX_interlace = GL_TRUE; + __GLeeLink_GL_SGIX_interlace(); + } + if (__GLeeCheckExtension("GL_SGIX_pixel_tiles", &extensionNames) ) + { + _GLEE_SGIX_pixel_tiles = GL_TRUE; + __GLeeLink_GL_SGIX_pixel_tiles(); + } + if (__GLeeCheckExtension("GL_SGIS_texture_select", &extensionNames) ) + { + _GLEE_SGIS_texture_select = GL_TRUE; + __GLeeLink_GL_SGIS_texture_select(); + } + if (__GLeeCheckExtension("GL_SGIX_sprite", &extensionNames) ) + { + _GLEE_SGIX_sprite = GL_TRUE; + __GLeeLink_GL_SGIX_sprite(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_multi_buffer", &extensionNames) ) + { + _GLEE_SGIX_texture_multi_buffer = GL_TRUE; + __GLeeLink_GL_SGIX_texture_multi_buffer(); + } + if (__GLeeCheckExtension("GL_EXT_point_parameters", &extensionNames) ) + { + _GLEE_EXT_point_parameters = GL_TRUE; + __GLeeLink_GL_EXT_point_parameters(); + } + if (__GLeeCheckExtension("GL_SGIS_point_parameters", &extensionNames) ) + { + _GLEE_SGIS_point_parameters = GL_TRUE; + __GLeeLink_GL_SGIS_point_parameters(); + } + if (__GLeeCheckExtension("GL_SGIX_instruments", &extensionNames) ) + { + _GLEE_SGIX_instruments = GL_TRUE; + __GLeeLink_GL_SGIX_instruments(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_scale_bias", &extensionNames) ) + { + _GLEE_SGIX_texture_scale_bias = GL_TRUE; + __GLeeLink_GL_SGIX_texture_scale_bias(); + } + if (__GLeeCheckExtension("GL_SGIX_framezoom", &extensionNames) ) + { + _GLEE_SGIX_framezoom = GL_TRUE; + __GLeeLink_GL_SGIX_framezoom(); + } + if (__GLeeCheckExtension("GL_SGIX_tag_sample_buffer", &extensionNames) ) + { + _GLEE_SGIX_tag_sample_buffer = GL_TRUE; + __GLeeLink_GL_SGIX_tag_sample_buffer(); + } + if (__GLeeCheckExtension("GL_FfdMaskSGIX", &extensionNames) ) + { + _GLEE_FfdMaskSGIX = GL_TRUE; + __GLeeLink_GL_FfdMaskSGIX(); + } + if (__GLeeCheckExtension("GL_SGIX_polynomial_ffd", &extensionNames) ) + { + _GLEE_SGIX_polynomial_ffd = GL_TRUE; + __GLeeLink_GL_SGIX_polynomial_ffd(); + } + if (__GLeeCheckExtension("GL_SGIX_reference_plane", &extensionNames) ) + { + _GLEE_SGIX_reference_plane = GL_TRUE; + __GLeeLink_GL_SGIX_reference_plane(); + } + if (__GLeeCheckExtension("GL_SGIX_flush_raster", &extensionNames) ) + { + _GLEE_SGIX_flush_raster = GL_TRUE; + __GLeeLink_GL_SGIX_flush_raster(); + } + if (__GLeeCheckExtension("GL_SGIX_depth_texture", &extensionNames) ) + { + _GLEE_SGIX_depth_texture = GL_TRUE; + __GLeeLink_GL_SGIX_depth_texture(); + } + if (__GLeeCheckExtension("GL_SGIS_fog_function", &extensionNames) ) + { + _GLEE_SGIS_fog_function = GL_TRUE; + __GLeeLink_GL_SGIS_fog_function(); + } + if (__GLeeCheckExtension("GL_SGIX_fog_offset", &extensionNames) ) + { + _GLEE_SGIX_fog_offset = GL_TRUE; + __GLeeLink_GL_SGIX_fog_offset(); + } + if (__GLeeCheckExtension("GL_HP_image_transform", &extensionNames) ) + { + _GLEE_HP_image_transform = GL_TRUE; + __GLeeLink_GL_HP_image_transform(); + } + if (__GLeeCheckExtension("GL_HP_convolution_border_modes", &extensionNames) ) + { + _GLEE_HP_convolution_border_modes = GL_TRUE; + __GLeeLink_GL_HP_convolution_border_modes(); + } + if (__GLeeCheckExtension("GL_INGR_palette_buffer", &extensionNames) ) + { + _GLEE_INGR_palette_buffer = GL_TRUE; + __GLeeLink_GL_INGR_palette_buffer(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_add_env", &extensionNames) ) + { + _GLEE_SGIX_texture_add_env = GL_TRUE; + __GLeeLink_GL_SGIX_texture_add_env(); + } + if (__GLeeCheckExtension("GL_EXT_color_subtable", &extensionNames) ) + { + _GLEE_EXT_color_subtable = GL_TRUE; + __GLeeLink_GL_EXT_color_subtable(); + } + if (__GLeeCheckExtension("GL_PGI_vertex_hints", &extensionNames) ) + { + _GLEE_PGI_vertex_hints = GL_TRUE; + __GLeeLink_GL_PGI_vertex_hints(); + } + if (__GLeeCheckExtension("GL_PGI_misc_hints", &extensionNames) ) + { + _GLEE_PGI_misc_hints = GL_TRUE; + __GLeeLink_GL_PGI_misc_hints(); + } + if (__GLeeCheckExtension("GL_EXT_paletted_texture", &extensionNames) ) + { + _GLEE_EXT_paletted_texture = GL_TRUE; + __GLeeLink_GL_EXT_paletted_texture(); + } + if (__GLeeCheckExtension("GL_EXT_clip_volume_hint", &extensionNames) ) + { + _GLEE_EXT_clip_volume_hint = GL_TRUE; + __GLeeLink_GL_EXT_clip_volume_hint(); + } + if (__GLeeCheckExtension("GL_SGIX_list_priority", &extensionNames) ) + { + _GLEE_SGIX_list_priority = GL_TRUE; + __GLeeLink_GL_SGIX_list_priority(); + } + if (__GLeeCheckExtension("GL_SGIX_ir_instrument1", &extensionNames) ) + { + _GLEE_SGIX_ir_instrument1 = GL_TRUE; + __GLeeLink_GL_SGIX_ir_instrument1(); + } + if (__GLeeCheckExtension("GL_SGIX_calligraphic_fragment", &extensionNames) ) + { + _GLEE_SGIX_calligraphic_fragment = GL_TRUE; + __GLeeLink_GL_SGIX_calligraphic_fragment(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_lod_bias", &extensionNames) ) + { + _GLEE_SGIX_texture_lod_bias = GL_TRUE; + __GLeeLink_GL_SGIX_texture_lod_bias(); + } + if (__GLeeCheckExtension("GL_SGIX_shadow_ambient", &extensionNames) ) + { + _GLEE_SGIX_shadow_ambient = GL_TRUE; + __GLeeLink_GL_SGIX_shadow_ambient(); + } + if (__GLeeCheckExtension("GL_EXT_index_texture", &extensionNames) ) + { + _GLEE_EXT_index_texture = GL_TRUE; + __GLeeLink_GL_EXT_index_texture(); + } + if (__GLeeCheckExtension("GL_EXT_index_material", &extensionNames) ) + { + _GLEE_EXT_index_material = GL_TRUE; + __GLeeLink_GL_EXT_index_material(); + } + if (__GLeeCheckExtension("GL_EXT_index_func", &extensionNames) ) + { + _GLEE_EXT_index_func = GL_TRUE; + __GLeeLink_GL_EXT_index_func(); + } + if (__GLeeCheckExtension("GL_EXT_index_array_formats", &extensionNames) ) + { + _GLEE_EXT_index_array_formats = GL_TRUE; + __GLeeLink_GL_EXT_index_array_formats(); + } + if (__GLeeCheckExtension("GL_EXT_compiled_vertex_array", &extensionNames) ) + { + _GLEE_EXT_compiled_vertex_array = GL_TRUE; + __GLeeLink_GL_EXT_compiled_vertex_array(); + } + if (__GLeeCheckExtension("GL_EXT_cull_vertex", &extensionNames) ) + { + _GLEE_EXT_cull_vertex = GL_TRUE; + __GLeeLink_GL_EXT_cull_vertex(); + } + if (__GLeeCheckExtension("GL_SGIX_ycrcb", &extensionNames) ) + { + _GLEE_SGIX_ycrcb = GL_TRUE; + __GLeeLink_GL_SGIX_ycrcb(); + } + if (__GLeeCheckExtension("GL_SGIX_fragment_lighting", &extensionNames) ) + { + _GLEE_SGIX_fragment_lighting = GL_TRUE; + __GLeeLink_GL_SGIX_fragment_lighting(); + } + if (__GLeeCheckExtension("GL_IBM_rasterpos_clip", &extensionNames) ) + { + _GLEE_IBM_rasterpos_clip = GL_TRUE; + __GLeeLink_GL_IBM_rasterpos_clip(); + } + if (__GLeeCheckExtension("GL_HP_texture_lighting", &extensionNames) ) + { + _GLEE_HP_texture_lighting = GL_TRUE; + __GLeeLink_GL_HP_texture_lighting(); + } + if (__GLeeCheckExtension("GL_EXT_draw_range_elements", &extensionNames) ) + { + _GLEE_EXT_draw_range_elements = GL_TRUE; + __GLeeLink_GL_EXT_draw_range_elements(); + } + if (__GLeeCheckExtension("GL_WIN_phong_shading", &extensionNames) ) + { + _GLEE_WIN_phong_shading = GL_TRUE; + __GLeeLink_GL_WIN_phong_shading(); + } + if (__GLeeCheckExtension("GL_WIN_specular_fog", &extensionNames) ) + { + _GLEE_WIN_specular_fog = GL_TRUE; + __GLeeLink_GL_WIN_specular_fog(); + } + if (__GLeeCheckExtension("GL_EXT_light_texture", &extensionNames) ) + { + _GLEE_EXT_light_texture = GL_TRUE; + __GLeeLink_GL_EXT_light_texture(); + } + if (__GLeeCheckExtension("GL_SGIX_blend_alpha_minmax", &extensionNames) ) + { + _GLEE_SGIX_blend_alpha_minmax = GL_TRUE; + __GLeeLink_GL_SGIX_blend_alpha_minmax(); + } + if (__GLeeCheckExtension("GL_SGIX_impact_pixel_texture", &extensionNames) ) + { + _GLEE_SGIX_impact_pixel_texture = GL_TRUE; + __GLeeLink_GL_SGIX_impact_pixel_texture(); + } + if (__GLeeCheckExtension("GL_EXT_bgra", &extensionNames) ) + { + _GLEE_EXT_bgra = GL_TRUE; + __GLeeLink_GL_EXT_bgra(); + } + if (__GLeeCheckExtension("GL_SGIX_async", &extensionNames) ) + { + _GLEE_SGIX_async = GL_TRUE; + __GLeeLink_GL_SGIX_async(); + } + if (__GLeeCheckExtension("GL_SGIX_async_pixel", &extensionNames) ) + { + _GLEE_SGIX_async_pixel = GL_TRUE; + __GLeeLink_GL_SGIX_async_pixel(); + } + if (__GLeeCheckExtension("GL_SGIX_async_histogram", &extensionNames) ) + { + _GLEE_SGIX_async_histogram = GL_TRUE; + __GLeeLink_GL_SGIX_async_histogram(); + } + if (__GLeeCheckExtension("GL_INTEL_texture_scissor", &extensionNames) ) + { + _GLEE_INTEL_texture_scissor = GL_TRUE; + __GLeeLink_GL_INTEL_texture_scissor(); + } + if (__GLeeCheckExtension("GL_INTEL_parallel_arrays", &extensionNames) ) + { + _GLEE_INTEL_parallel_arrays = GL_TRUE; + __GLeeLink_GL_INTEL_parallel_arrays(); + } + if (__GLeeCheckExtension("GL_HP_occlusion_test", &extensionNames) ) + { + _GLEE_HP_occlusion_test = GL_TRUE; + __GLeeLink_GL_HP_occlusion_test(); + } + if (__GLeeCheckExtension("GL_EXT_pixel_transform", &extensionNames) ) + { + _GLEE_EXT_pixel_transform = GL_TRUE; + __GLeeLink_GL_EXT_pixel_transform(); + } + if (__GLeeCheckExtension("GL_EXT_pixel_transform_color_table", &extensionNames) ) + { + _GLEE_EXT_pixel_transform_color_table = GL_TRUE; + __GLeeLink_GL_EXT_pixel_transform_color_table(); + } + if (__GLeeCheckExtension("GL_EXT_shared_texture_palette", &extensionNames) ) + { + _GLEE_EXT_shared_texture_palette = GL_TRUE; + __GLeeLink_GL_EXT_shared_texture_palette(); + } + if (__GLeeCheckExtension("GL_EXT_separate_specular_color", &extensionNames) ) + { + _GLEE_EXT_separate_specular_color = GL_TRUE; + __GLeeLink_GL_EXT_separate_specular_color(); + } + if (__GLeeCheckExtension("GL_EXT_secondary_color", &extensionNames) ) + { + _GLEE_EXT_secondary_color = GL_TRUE; + __GLeeLink_GL_EXT_secondary_color(); + } + if (__GLeeCheckExtension("GL_EXT_texture_perturb_normal", &extensionNames) ) + { + _GLEE_EXT_texture_perturb_normal = GL_TRUE; + __GLeeLink_GL_EXT_texture_perturb_normal(); + } + if (__GLeeCheckExtension("GL_EXT_multi_draw_arrays", &extensionNames) ) + { + _GLEE_EXT_multi_draw_arrays = GL_TRUE; + __GLeeLink_GL_EXT_multi_draw_arrays(); + } + if (__GLeeCheckExtension("GL_EXT_fog_coord", &extensionNames) ) + { + _GLEE_EXT_fog_coord = GL_TRUE; + __GLeeLink_GL_EXT_fog_coord(); + } + if (__GLeeCheckExtension("GL_REND_screen_coordinates", &extensionNames) ) + { + _GLEE_REND_screen_coordinates = GL_TRUE; + __GLeeLink_GL_REND_screen_coordinates(); + } + if (__GLeeCheckExtension("GL_EXT_coordinate_frame", &extensionNames) ) + { + _GLEE_EXT_coordinate_frame = GL_TRUE; + __GLeeLink_GL_EXT_coordinate_frame(); + } + if (__GLeeCheckExtension("GL_EXT_texture_env_combine", &extensionNames) ) + { + _GLEE_EXT_texture_env_combine = GL_TRUE; + __GLeeLink_GL_EXT_texture_env_combine(); + } + if (__GLeeCheckExtension("GL_APPLE_specular_vector", &extensionNames) ) + { + _GLEE_APPLE_specular_vector = GL_TRUE; + __GLeeLink_GL_APPLE_specular_vector(); + } + if (__GLeeCheckExtension("GL_APPLE_transform_hint", &extensionNames) ) + { + _GLEE_APPLE_transform_hint = GL_TRUE; + __GLeeLink_GL_APPLE_transform_hint(); + } + if (__GLeeCheckExtension("GL_SGIX_fog_scale", &extensionNames) ) + { + _GLEE_SGIX_fog_scale = GL_TRUE; + __GLeeLink_GL_SGIX_fog_scale(); + } + if (__GLeeCheckExtension("GL_SUNX_constant_data", &extensionNames) ) + { + _GLEE_SUNX_constant_data = GL_TRUE; + __GLeeLink_GL_SUNX_constant_data(); + } + if (__GLeeCheckExtension("GL_SUN_global_alpha", &extensionNames) ) + { + _GLEE_SUN_global_alpha = GL_TRUE; + __GLeeLink_GL_SUN_global_alpha(); + } + if (__GLeeCheckExtension("GL_SUN_triangle_list", &extensionNames) ) + { + _GLEE_SUN_triangle_list = GL_TRUE; + __GLeeLink_GL_SUN_triangle_list(); + } + if (__GLeeCheckExtension("GL_SUN_vertex", &extensionNames) ) + { + _GLEE_SUN_vertex = GL_TRUE; + __GLeeLink_GL_SUN_vertex(); + } + if (__GLeeCheckExtension("GL_EXT_blend_func_separate", &extensionNames) ) + { + _GLEE_EXT_blend_func_separate = GL_TRUE; + __GLeeLink_GL_EXT_blend_func_separate(); + } + if (__GLeeCheckExtension("GL_INGR_color_clamp", &extensionNames) ) + { + _GLEE_INGR_color_clamp = GL_TRUE; + __GLeeLink_GL_INGR_color_clamp(); + } + if (__GLeeCheckExtension("GL_INGR_interlace_read", &extensionNames) ) + { + _GLEE_INGR_interlace_read = GL_TRUE; + __GLeeLink_GL_INGR_interlace_read(); + } + if (__GLeeCheckExtension("GL_EXT_stencil_wrap", &extensionNames) ) + { + _GLEE_EXT_stencil_wrap = GL_TRUE; + __GLeeLink_GL_EXT_stencil_wrap(); + } + if (__GLeeCheckExtension("GL_EXT_422_pixels", &extensionNames) ) + { + _GLEE_EXT_422_pixels = GL_TRUE; + __GLeeLink_GL_EXT_422_pixels(); + } + if (__GLeeCheckExtension("GL_NV_texgen_reflection", &extensionNames) ) + { + _GLEE_NV_texgen_reflection = GL_TRUE; + __GLeeLink_GL_NV_texgen_reflection(); + } + if (__GLeeCheckExtension("GL_EXT_texture_cube_map", &extensionNames) ) + { + _GLEE_EXT_texture_cube_map = GL_TRUE; + __GLeeLink_GL_EXT_texture_cube_map(); + } + if (__GLeeCheckExtension("GL_SUN_convolution_border_modes", &extensionNames) ) + { + _GLEE_SUN_convolution_border_modes = GL_TRUE; + __GLeeLink_GL_SUN_convolution_border_modes(); + } + if (__GLeeCheckExtension("GL_EXT_texture_env_add", &extensionNames) ) + { + _GLEE_EXT_texture_env_add = GL_TRUE; + __GLeeLink_GL_EXT_texture_env_add(); + } + if (__GLeeCheckExtension("GL_EXT_texture_lod_bias", &extensionNames) ) + { + _GLEE_EXT_texture_lod_bias = GL_TRUE; + __GLeeLink_GL_EXT_texture_lod_bias(); + } + if (__GLeeCheckExtension("GL_EXT_texture_filter_anisotropic", &extensionNames) ) + { + _GLEE_EXT_texture_filter_anisotropic = GL_TRUE; + __GLeeLink_GL_EXT_texture_filter_anisotropic(); + } + if (__GLeeCheckExtension("GL_EXT_vertex_weighting", &extensionNames) ) + { + _GLEE_EXT_vertex_weighting = GL_TRUE; + __GLeeLink_GL_EXT_vertex_weighting(); + } + if (__GLeeCheckExtension("GL_NV_light_max_exponent", &extensionNames) ) + { + _GLEE_NV_light_max_exponent = GL_TRUE; + __GLeeLink_GL_NV_light_max_exponent(); + } + if (__GLeeCheckExtension("GL_NV_vertex_array_range", &extensionNames) ) + { + _GLEE_NV_vertex_array_range = GL_TRUE; + __GLeeLink_GL_NV_vertex_array_range(); + } + if (__GLeeCheckExtension("GL_NV_register_combiners", &extensionNames) ) + { + _GLEE_NV_register_combiners = GL_TRUE; + __GLeeLink_GL_NV_register_combiners(); + } + if (__GLeeCheckExtension("GL_NV_fog_distance", &extensionNames) ) + { + _GLEE_NV_fog_distance = GL_TRUE; + __GLeeLink_GL_NV_fog_distance(); + } + if (__GLeeCheckExtension("GL_NV_texgen_emboss", &extensionNames) ) + { + _GLEE_NV_texgen_emboss = GL_TRUE; + __GLeeLink_GL_NV_texgen_emboss(); + } + if (__GLeeCheckExtension("GL_NV_blend_square", &extensionNames) ) + { + _GLEE_NV_blend_square = GL_TRUE; + __GLeeLink_GL_NV_blend_square(); + } + if (__GLeeCheckExtension("GL_NV_texture_env_combine4", &extensionNames) ) + { + _GLEE_NV_texture_env_combine4 = GL_TRUE; + __GLeeLink_GL_NV_texture_env_combine4(); + } + if (__GLeeCheckExtension("GL_MESA_resize_buffers", &extensionNames) ) + { + _GLEE_MESA_resize_buffers = GL_TRUE; + __GLeeLink_GL_MESA_resize_buffers(); + } + if (__GLeeCheckExtension("GL_MESA_window_pos", &extensionNames) ) + { + _GLEE_MESA_window_pos = GL_TRUE; + __GLeeLink_GL_MESA_window_pos(); + } + if (__GLeeCheckExtension("GL_EXT_texture_compression_s3tc", &extensionNames) ) + { + _GLEE_EXT_texture_compression_s3tc = GL_TRUE; + __GLeeLink_GL_EXT_texture_compression_s3tc(); + } + if (__GLeeCheckExtension("GL_IBM_cull_vertex", &extensionNames) ) + { + _GLEE_IBM_cull_vertex = GL_TRUE; + __GLeeLink_GL_IBM_cull_vertex(); + } + if (__GLeeCheckExtension("GL_IBM_multimode_draw_arrays", &extensionNames) ) + { + _GLEE_IBM_multimode_draw_arrays = GL_TRUE; + __GLeeLink_GL_IBM_multimode_draw_arrays(); + } + if (__GLeeCheckExtension("GL_IBM_vertex_array_lists", &extensionNames) ) + { + _GLEE_IBM_vertex_array_lists = GL_TRUE; + __GLeeLink_GL_IBM_vertex_array_lists(); + } + if (__GLeeCheckExtension("GL_SGIX_subsample", &extensionNames) ) + { + _GLEE_SGIX_subsample = GL_TRUE; + __GLeeLink_GL_SGIX_subsample(); + } + if (__GLeeCheckExtension("GL_SGIX_ycrcb_subsample", &extensionNames) ) + { + _GLEE_SGIX_ycrcb_subsample = GL_TRUE; + __GLeeLink_GL_SGIX_ycrcb_subsample(); + } + if (__GLeeCheckExtension("GL_SGIX_ycrcba", &extensionNames) ) + { + _GLEE_SGIX_ycrcba = GL_TRUE; + __GLeeLink_GL_SGIX_ycrcba(); + } + if (__GLeeCheckExtension("GL_SGI_depth_pass_instrument", &extensionNames) ) + { + _GLEE_SGI_depth_pass_instrument = GL_TRUE; + __GLeeLink_GL_SGI_depth_pass_instrument(); + } + if (__GLeeCheckExtension("GL_3DFX_texture_compression_FXT1", &extensionNames) ) + { + _GLEE_3DFX_texture_compression_FXT1 = GL_TRUE; + __GLeeLink_GL_3DFX_texture_compression_FXT1(); + } + if (__GLeeCheckExtension("GL_3DFX_multisample", &extensionNames) ) + { + _GLEE_3DFX_multisample = GL_TRUE; + __GLeeLink_GL_3DFX_multisample(); + } + if (__GLeeCheckExtension("GL_3DFX_tbuffer", &extensionNames) ) + { + _GLEE_3DFX_tbuffer = GL_TRUE; + __GLeeLink_GL_3DFX_tbuffer(); + } + if (__GLeeCheckExtension("GL_EXT_multisample", &extensionNames) ) + { + _GLEE_EXT_multisample = GL_TRUE; + __GLeeLink_GL_EXT_multisample(); + } + if (__GLeeCheckExtension("GL_SGIX_vertex_preclip", &extensionNames) ) + { + _GLEE_SGIX_vertex_preclip = GL_TRUE; + __GLeeLink_GL_SGIX_vertex_preclip(); + } + if (__GLeeCheckExtension("GL_SGIX_convolution_accuracy", &extensionNames) ) + { + _GLEE_SGIX_convolution_accuracy = GL_TRUE; + __GLeeLink_GL_SGIX_convolution_accuracy(); + } + if (__GLeeCheckExtension("GL_SGIX_resample", &extensionNames) ) + { + _GLEE_SGIX_resample = GL_TRUE; + __GLeeLink_GL_SGIX_resample(); + } + if (__GLeeCheckExtension("GL_SGIS_point_line_texgen", &extensionNames) ) + { + _GLEE_SGIS_point_line_texgen = GL_TRUE; + __GLeeLink_GL_SGIS_point_line_texgen(); + } + if (__GLeeCheckExtension("GL_SGIS_texture_color_mask", &extensionNames) ) + { + _GLEE_SGIS_texture_color_mask = GL_TRUE; + __GLeeLink_GL_SGIS_texture_color_mask(); + } + if (__GLeeCheckExtension("GL_EXT_texture_env_dot3", &extensionNames) ) + { + _GLEE_EXT_texture_env_dot3 = GL_TRUE; + __GLeeLink_GL_EXT_texture_env_dot3(); + } + if (__GLeeCheckExtension("GL_ATI_texture_mirror_once", &extensionNames) ) + { + _GLEE_ATI_texture_mirror_once = GL_TRUE; + __GLeeLink_GL_ATI_texture_mirror_once(); + } + if (__GLeeCheckExtension("GL_NV_fence", &extensionNames) ) + { + _GLEE_NV_fence = GL_TRUE; + __GLeeLink_GL_NV_fence(); + } + if (__GLeeCheckExtension("GL_IBM_texture_mirrored_repeat", &extensionNames) ) + { + _GLEE_IBM_texture_mirrored_repeat = GL_TRUE; + __GLeeLink_GL_IBM_texture_mirrored_repeat(); + } + if (__GLeeCheckExtension("GL_NV_evaluators", &extensionNames) ) + { + _GLEE_NV_evaluators = GL_TRUE; + __GLeeLink_GL_NV_evaluators(); + } + if (__GLeeCheckExtension("GL_NV_packed_depth_stencil", &extensionNames) ) + { + _GLEE_NV_packed_depth_stencil = GL_TRUE; + __GLeeLink_GL_NV_packed_depth_stencil(); + } + if (__GLeeCheckExtension("GL_NV_register_combiners2", &extensionNames) ) + { + _GLEE_NV_register_combiners2 = GL_TRUE; + __GLeeLink_GL_NV_register_combiners2(); + } + if (__GLeeCheckExtension("GL_NV_texture_compression_vtc", &extensionNames) ) + { + _GLEE_NV_texture_compression_vtc = GL_TRUE; + __GLeeLink_GL_NV_texture_compression_vtc(); + } + if (__GLeeCheckExtension("GL_NV_texture_rectangle", &extensionNames) ) + { + _GLEE_NV_texture_rectangle = GL_TRUE; + __GLeeLink_GL_NV_texture_rectangle(); + } + if (__GLeeCheckExtension("GL_NV_texture_shader", &extensionNames) ) + { + _GLEE_NV_texture_shader = GL_TRUE; + __GLeeLink_GL_NV_texture_shader(); + } + if (__GLeeCheckExtension("GL_NV_texture_shader2", &extensionNames) ) + { + _GLEE_NV_texture_shader2 = GL_TRUE; + __GLeeLink_GL_NV_texture_shader2(); + } + if (__GLeeCheckExtension("GL_NV_vertex_array_range2", &extensionNames) ) + { + _GLEE_NV_vertex_array_range2 = GL_TRUE; + __GLeeLink_GL_NV_vertex_array_range2(); + } + if (__GLeeCheckExtension("GL_NV_vertex_program", &extensionNames) ) + { + _GLEE_NV_vertex_program = GL_TRUE; + __GLeeLink_GL_NV_vertex_program(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_coordinate_clamp", &extensionNames) ) + { + _GLEE_SGIX_texture_coordinate_clamp = GL_TRUE; + __GLeeLink_GL_SGIX_texture_coordinate_clamp(); + } + if (__GLeeCheckExtension("GL_SGIX_scalebias_hint", &extensionNames) ) + { + _GLEE_SGIX_scalebias_hint = GL_TRUE; + __GLeeLink_GL_SGIX_scalebias_hint(); + } + if (__GLeeCheckExtension("GL_OML_interlace", &extensionNames) ) + { + _GLEE_OML_interlace = GL_TRUE; + __GLeeLink_GL_OML_interlace(); + } + if (__GLeeCheckExtension("GL_OML_subsample", &extensionNames) ) + { + _GLEE_OML_subsample = GL_TRUE; + __GLeeLink_GL_OML_subsample(); + } + if (__GLeeCheckExtension("GL_OML_resample", &extensionNames) ) + { + _GLEE_OML_resample = GL_TRUE; + __GLeeLink_GL_OML_resample(); + } + if (__GLeeCheckExtension("GL_NV_copy_depth_to_color", &extensionNames) ) + { + _GLEE_NV_copy_depth_to_color = GL_TRUE; + __GLeeLink_GL_NV_copy_depth_to_color(); + } + if (__GLeeCheckExtension("GL_ATI_envmap_bumpmap", &extensionNames) ) + { + _GLEE_ATI_envmap_bumpmap = GL_TRUE; + __GLeeLink_GL_ATI_envmap_bumpmap(); + } + if (__GLeeCheckExtension("GL_ATI_fragment_shader", &extensionNames) ) + { + _GLEE_ATI_fragment_shader = GL_TRUE; + __GLeeLink_GL_ATI_fragment_shader(); + } + if (__GLeeCheckExtension("GL_ATI_pn_triangles", &extensionNames) ) + { + _GLEE_ATI_pn_triangles = GL_TRUE; + __GLeeLink_GL_ATI_pn_triangles(); + } + if (__GLeeCheckExtension("GL_ATI_vertex_array_object", &extensionNames) ) + { + _GLEE_ATI_vertex_array_object = GL_TRUE; + __GLeeLink_GL_ATI_vertex_array_object(); + } + if (__GLeeCheckExtension("GL_EXT_vertex_shader", &extensionNames) ) + { + _GLEE_EXT_vertex_shader = GL_TRUE; + __GLeeLink_GL_EXT_vertex_shader(); + } + if (__GLeeCheckExtension("GL_ATI_vertex_streams", &extensionNames) ) + { + _GLEE_ATI_vertex_streams = GL_TRUE; + __GLeeLink_GL_ATI_vertex_streams(); + } + if (__GLeeCheckExtension("GL_ATI_element_array", &extensionNames) ) + { + _GLEE_ATI_element_array = GL_TRUE; + __GLeeLink_GL_ATI_element_array(); + } + if (__GLeeCheckExtension("GL_SUN_mesh_array", &extensionNames) ) + { + _GLEE_SUN_mesh_array = GL_TRUE; + __GLeeLink_GL_SUN_mesh_array(); + } + if (__GLeeCheckExtension("GL_SUN_slice_accum", &extensionNames) ) + { + _GLEE_SUN_slice_accum = GL_TRUE; + __GLeeLink_GL_SUN_slice_accum(); + } + if (__GLeeCheckExtension("GL_NV_multisample_filter_hint", &extensionNames) ) + { + _GLEE_NV_multisample_filter_hint = GL_TRUE; + __GLeeLink_GL_NV_multisample_filter_hint(); + } + if (__GLeeCheckExtension("GL_NV_depth_clamp", &extensionNames) ) + { + _GLEE_NV_depth_clamp = GL_TRUE; + __GLeeLink_GL_NV_depth_clamp(); + } + if (__GLeeCheckExtension("GL_NV_occlusion_query", &extensionNames) ) + { + _GLEE_NV_occlusion_query = GL_TRUE; + __GLeeLink_GL_NV_occlusion_query(); + } + if (__GLeeCheckExtension("GL_NV_point_sprite", &extensionNames) ) + { + _GLEE_NV_point_sprite = GL_TRUE; + __GLeeLink_GL_NV_point_sprite(); + } + if (__GLeeCheckExtension("GL_NV_texture_shader3", &extensionNames) ) + { + _GLEE_NV_texture_shader3 = GL_TRUE; + __GLeeLink_GL_NV_texture_shader3(); + } + if (__GLeeCheckExtension("GL_NV_vertex_program1_1", &extensionNames) ) + { + _GLEE_NV_vertex_program1_1 = GL_TRUE; + __GLeeLink_GL_NV_vertex_program1_1(); + } + if (__GLeeCheckExtension("GL_EXT_shadow_funcs", &extensionNames) ) + { + _GLEE_EXT_shadow_funcs = GL_TRUE; + __GLeeLink_GL_EXT_shadow_funcs(); + } + if (__GLeeCheckExtension("GL_EXT_stencil_two_side", &extensionNames) ) + { + _GLEE_EXT_stencil_two_side = GL_TRUE; + __GLeeLink_GL_EXT_stencil_two_side(); + } + if (__GLeeCheckExtension("GL_ATI_text_fragment_shader", &extensionNames) ) + { + _GLEE_ATI_text_fragment_shader = GL_TRUE; + __GLeeLink_GL_ATI_text_fragment_shader(); + } + if (__GLeeCheckExtension("GL_APPLE_client_storage", &extensionNames) ) + { + _GLEE_APPLE_client_storage = GL_TRUE; + __GLeeLink_GL_APPLE_client_storage(); + } + if (__GLeeCheckExtension("GL_APPLE_element_array", &extensionNames) ) + { + _GLEE_APPLE_element_array = GL_TRUE; + __GLeeLink_GL_APPLE_element_array(); + } + if (__GLeeCheckExtension("GL_APPLE_fence", &extensionNames) ) + { + _GLEE_APPLE_fence = GL_TRUE; + __GLeeLink_GL_APPLE_fence(); + } + if (__GLeeCheckExtension("GL_APPLE_vertex_array_object", &extensionNames) ) + { + _GLEE_APPLE_vertex_array_object = GL_TRUE; + __GLeeLink_GL_APPLE_vertex_array_object(); + } + if (__GLeeCheckExtension("GL_APPLE_vertex_array_range", &extensionNames) ) + { + _GLEE_APPLE_vertex_array_range = GL_TRUE; + __GLeeLink_GL_APPLE_vertex_array_range(); + } + if (__GLeeCheckExtension("GL_APPLE_ycbcr_422", &extensionNames) ) + { + _GLEE_APPLE_ycbcr_422 = GL_TRUE; + __GLeeLink_GL_APPLE_ycbcr_422(); + } + if (__GLeeCheckExtension("GL_S3_s3tc", &extensionNames) ) + { + _GLEE_S3_s3tc = GL_TRUE; + __GLeeLink_GL_S3_s3tc(); + } + if (__GLeeCheckExtension("GL_ATI_draw_buffers", &extensionNames) ) + { + _GLEE_ATI_draw_buffers = GL_TRUE; + __GLeeLink_GL_ATI_draw_buffers(); + } + if (__GLeeCheckExtension("GL_ATI_pixel_format_float", &extensionNames) ) + { + _GLEE_ATI_pixel_format_float = GL_TRUE; + __GLeeLink_GL_ATI_pixel_format_float(); + } + if (__GLeeCheckExtension("GL_ATI_texture_env_combine3", &extensionNames) ) + { + _GLEE_ATI_texture_env_combine3 = GL_TRUE; + __GLeeLink_GL_ATI_texture_env_combine3(); + } + if (__GLeeCheckExtension("GL_ATI_texture_float", &extensionNames) ) + { + _GLEE_ATI_texture_float = GL_TRUE; + __GLeeLink_GL_ATI_texture_float(); + } + if (__GLeeCheckExtension("GL_NV_float_buffer", &extensionNames) ) + { + _GLEE_NV_float_buffer = GL_TRUE; + __GLeeLink_GL_NV_float_buffer(); + } + if (__GLeeCheckExtension("GL_NV_fragment_program", &extensionNames) ) + { + _GLEE_NV_fragment_program = GL_TRUE; + __GLeeLink_GL_NV_fragment_program(); + } + if (__GLeeCheckExtension("GL_NV_half_float", &extensionNames) ) + { + _GLEE_NV_half_float = GL_TRUE; + __GLeeLink_GL_NV_half_float(); + } + if (__GLeeCheckExtension("GL_NV_pixel_data_range", &extensionNames) ) + { + _GLEE_NV_pixel_data_range = GL_TRUE; + __GLeeLink_GL_NV_pixel_data_range(); + } + if (__GLeeCheckExtension("GL_NV_primitive_restart", &extensionNames) ) + { + _GLEE_NV_primitive_restart = GL_TRUE; + __GLeeLink_GL_NV_primitive_restart(); + } + if (__GLeeCheckExtension("GL_NV_texture_expand_normal", &extensionNames) ) + { + _GLEE_NV_texture_expand_normal = GL_TRUE; + __GLeeLink_GL_NV_texture_expand_normal(); + } + if (__GLeeCheckExtension("GL_NV_vertex_program2", &extensionNames) ) + { + _GLEE_NV_vertex_program2 = GL_TRUE; + __GLeeLink_GL_NV_vertex_program2(); + } + if (__GLeeCheckExtension("GL_ATI_map_object_buffer", &extensionNames) ) + { + _GLEE_ATI_map_object_buffer = GL_TRUE; + __GLeeLink_GL_ATI_map_object_buffer(); + } + if (__GLeeCheckExtension("GL_ATI_separate_stencil", &extensionNames) ) + { + _GLEE_ATI_separate_stencil = GL_TRUE; + __GLeeLink_GL_ATI_separate_stencil(); + } + if (__GLeeCheckExtension("GL_ATI_vertex_attrib_array_object", &extensionNames) ) + { + _GLEE_ATI_vertex_attrib_array_object = GL_TRUE; + __GLeeLink_GL_ATI_vertex_attrib_array_object(); + } + if (__GLeeCheckExtension("GL_OES_read_format", &extensionNames) ) + { + _GLEE_OES_read_format = GL_TRUE; + __GLeeLink_GL_OES_read_format(); + } + if (__GLeeCheckExtension("GL_EXT_depth_bounds_test", &extensionNames) ) + { + _GLEE_EXT_depth_bounds_test = GL_TRUE; + __GLeeLink_GL_EXT_depth_bounds_test(); + } + if (__GLeeCheckExtension("GL_EXT_texture_mirror_clamp", &extensionNames) ) + { + _GLEE_EXT_texture_mirror_clamp = GL_TRUE; + __GLeeLink_GL_EXT_texture_mirror_clamp(); + } + if (__GLeeCheckExtension("GL_EXT_blend_equation_separate", &extensionNames) ) + { + _GLEE_EXT_blend_equation_separate = GL_TRUE; + __GLeeLink_GL_EXT_blend_equation_separate(); + } + if (__GLeeCheckExtension("GL_MESA_pack_invert", &extensionNames) ) + { + _GLEE_MESA_pack_invert = GL_TRUE; + __GLeeLink_GL_MESA_pack_invert(); + } + if (__GLeeCheckExtension("GL_MESA_ycbcr_texture", &extensionNames) ) + { + _GLEE_MESA_ycbcr_texture = GL_TRUE; + __GLeeLink_GL_MESA_ycbcr_texture(); + } + if (__GLeeCheckExtension("GL_EXT_pixel_buffer_object", &extensionNames) ) + { + _GLEE_EXT_pixel_buffer_object = GL_TRUE; + __GLeeLink_GL_EXT_pixel_buffer_object(); + } + if (__GLeeCheckExtension("GL_NV_fragment_program_option", &extensionNames) ) + { + _GLEE_NV_fragment_program_option = GL_TRUE; + __GLeeLink_GL_NV_fragment_program_option(); + } + if (__GLeeCheckExtension("GL_NV_fragment_program2", &extensionNames) ) + { + _GLEE_NV_fragment_program2 = GL_TRUE; + __GLeeLink_GL_NV_fragment_program2(); + } + if (__GLeeCheckExtension("GL_NV_vertex_program2_option", &extensionNames) ) + { + _GLEE_NV_vertex_program2_option = GL_TRUE; + __GLeeLink_GL_NV_vertex_program2_option(); + } + if (__GLeeCheckExtension("GL_NV_vertex_program3", &extensionNames) ) + { + _GLEE_NV_vertex_program3 = GL_TRUE; + __GLeeLink_GL_NV_vertex_program3(); + } + if (__GLeeCheckExtension("GL_EXT_framebuffer_object", &extensionNames) ) + { + _GLEE_EXT_framebuffer_object = GL_TRUE; + __GLeeLink_GL_EXT_framebuffer_object(); + } + if (__GLeeCheckExtension("GL_GREMEDY_string_marker", &extensionNames) ) + { + _GLEE_GREMEDY_string_marker = GL_TRUE; + __GLeeLink_GL_GREMEDY_string_marker(); + } + if (__GLeeCheckExtension("GL_EXT_packed_depth_stencil", &extensionNames) ) + { + _GLEE_EXT_packed_depth_stencil = GL_TRUE; + __GLeeLink_GL_EXT_packed_depth_stencil(); + } + if (__GLeeCheckExtension("GL_EXT_stencil_clear_tag", &extensionNames) ) + { + _GLEE_EXT_stencil_clear_tag = GL_TRUE; + __GLeeLink_GL_EXT_stencil_clear_tag(); + } + if (__GLeeCheckExtension("GL_EXT_texture_sRGB", &extensionNames) ) + { + _GLEE_EXT_texture_sRGB = GL_TRUE; + __GLeeLink_GL_EXT_texture_sRGB(); + } + if (__GLeeCheckExtension("GL_EXT_framebuffer_blit", &extensionNames) ) + { + _GLEE_EXT_framebuffer_blit = GL_TRUE; + __GLeeLink_GL_EXT_framebuffer_blit(); + } + if (__GLeeCheckExtension("GL_EXT_framebuffer_multisample", &extensionNames) ) + { + _GLEE_EXT_framebuffer_multisample = GL_TRUE; + __GLeeLink_GL_EXT_framebuffer_multisample(); + } + if (__GLeeCheckExtension("GL_MESAX_texture_stack", &extensionNames) ) + { + _GLEE_MESAX_texture_stack = GL_TRUE; + __GLeeLink_GL_MESAX_texture_stack(); + } + if (__GLeeCheckExtension("GL_EXT_timer_query", &extensionNames) ) + { + _GLEE_EXT_timer_query = GL_TRUE; + __GLeeLink_GL_EXT_timer_query(); + } + if (__GLeeCheckExtension("GL_EXT_gpu_program_parameters", &extensionNames) ) + { + _GLEE_EXT_gpu_program_parameters = GL_TRUE; + __GLeeLink_GL_EXT_gpu_program_parameters(); + } + if (__GLeeCheckExtension("GL_APPLE_flush_buffer_range", &extensionNames) ) + { + _GLEE_APPLE_flush_buffer_range = GL_TRUE; + __GLeeLink_GL_APPLE_flush_buffer_range(); + } + if (__GLeeCheckExtension("GL_EXT_gpu_shader4", &extensionNames) ) + { + _GLEE_EXT_gpu_shader4 = GL_TRUE; + __GLeeLink_GL_EXT_gpu_shader4(); + } + if (__GLeeCheckExtension("GL_EXT_draw_instanced", &extensionNames) ) + { + _GLEE_EXT_draw_instanced = GL_TRUE; + __GLeeLink_GL_EXT_draw_instanced(); + } + if (__GLeeCheckExtension("GL_EXT_packed_float", &extensionNames) ) + { + _GLEE_EXT_packed_float = GL_TRUE; + __GLeeLink_GL_EXT_packed_float(); + } + if (__GLeeCheckExtension("GL_EXT_texture_array", &extensionNames) ) + { + _GLEE_EXT_texture_array = GL_TRUE; + __GLeeLink_GL_EXT_texture_array(); + } + if (__GLeeCheckExtension("GL_EXT_texture_buffer_object", &extensionNames) ) + { + _GLEE_EXT_texture_buffer_object = GL_TRUE; + __GLeeLink_GL_EXT_texture_buffer_object(); + } + if (__GLeeCheckExtension("GL_EXT_texture_compression_latc", &extensionNames) ) + { + _GLEE_EXT_texture_compression_latc = GL_TRUE; + __GLeeLink_GL_EXT_texture_compression_latc(); + } + if (__GLeeCheckExtension("GL_EXT_texture_compression_rgtc", &extensionNames) ) + { + _GLEE_EXT_texture_compression_rgtc = GL_TRUE; + __GLeeLink_GL_EXT_texture_compression_rgtc(); + } + if (__GLeeCheckExtension("GL_EXT_texture_shared_exponent", &extensionNames) ) + { + _GLEE_EXT_texture_shared_exponent = GL_TRUE; + __GLeeLink_GL_EXT_texture_shared_exponent(); + } + if (__GLeeCheckExtension("GL_NV_depth_buffer_float", &extensionNames) ) + { + _GLEE_NV_depth_buffer_float = GL_TRUE; + __GLeeLink_GL_NV_depth_buffer_float(); + } + if (__GLeeCheckExtension("GL_NV_framebuffer_multisample_coverage", &extensionNames) ) + { + _GLEE_NV_framebuffer_multisample_coverage = GL_TRUE; + __GLeeLink_GL_NV_framebuffer_multisample_coverage(); + } + if (__GLeeCheckExtension("GL_EXT_framebuffer_sRGB", &extensionNames) ) + { + _GLEE_EXT_framebuffer_sRGB = GL_TRUE; + __GLeeLink_GL_EXT_framebuffer_sRGB(); + } + if (__GLeeCheckExtension("GL_NV_geometry_shader4", &extensionNames) ) + { + _GLEE_NV_geometry_shader4 = GL_TRUE; + __GLeeLink_GL_NV_geometry_shader4(); + } + if (__GLeeCheckExtension("GL_NV_parameter_buffer_object", &extensionNames) ) + { + _GLEE_NV_parameter_buffer_object = GL_TRUE; + __GLeeLink_GL_NV_parameter_buffer_object(); + } + if (__GLeeCheckExtension("GL_EXT_draw_buffers2", &extensionNames) ) + { + _GLEE_EXT_draw_buffers2 = GL_TRUE; + __GLeeLink_GL_EXT_draw_buffers2(); + } + if (__GLeeCheckExtension("GL_NV_transform_feedback", &extensionNames) ) + { + _GLEE_NV_transform_feedback = GL_TRUE; + __GLeeLink_GL_NV_transform_feedback(); + } + if (__GLeeCheckExtension("GL_EXT_bindable_uniform", &extensionNames) ) + { + _GLEE_EXT_bindable_uniform = GL_TRUE; + __GLeeLink_GL_EXT_bindable_uniform(); + } + if (__GLeeCheckExtension("GL_EXT_texture_integer", &extensionNames) ) + { + _GLEE_EXT_texture_integer = GL_TRUE; + __GLeeLink_GL_EXT_texture_integer(); + } + if (__GLeeCheckExtension("GL_GREMEDY_frame_terminator", &extensionNames) ) + { + _GLEE_GREMEDY_frame_terminator = GL_TRUE; + __GLeeLink_GL_GREMEDY_frame_terminator(); + } + if (__GLeeCheckExtension("GL_NV_conditional_render", &extensionNames) ) + { + _GLEE_NV_conditional_render = GL_TRUE; + __GLeeLink_GL_NV_conditional_render(); + } + if (__GLeeCheckExtension("GL_NV_present_video", &extensionNames) ) + { + _GLEE_NV_present_video = GL_TRUE; + __GLeeLink_GL_NV_present_video(); + } + if (__GLeeCheckExtension("GL_EXT_transform_feedback", &extensionNames) ) + { + _GLEE_EXT_transform_feedback = GL_TRUE; + __GLeeLink_GL_EXT_transform_feedback(); + } + if (__GLeeCheckExtension("GL_EXT_direct_state_access", &extensionNames) ) + { + _GLEE_EXT_direct_state_access = GL_TRUE; + __GLeeLink_GL_EXT_direct_state_access(); + } + if (__GLeeCheckExtension("GL_EXT_vertex_array_bgra", &extensionNames) ) + { + _GLEE_EXT_vertex_array_bgra = GL_TRUE; + __GLeeLink_GL_EXT_vertex_array_bgra(); + } + if (__GLeeCheckExtension("GL_EXT_texture_swizzle", &extensionNames) ) + { + _GLEE_EXT_texture_swizzle = GL_TRUE; + __GLeeLink_GL_EXT_texture_swizzle(); + } + if (__GLeeCheckExtension("GL_NV_explicit_multisample", &extensionNames) ) + { + _GLEE_NV_explicit_multisample = GL_TRUE; + __GLeeLink_GL_NV_explicit_multisample(); + } + if (__GLeeCheckExtension("GL_NV_transform_feedback2", &extensionNames) ) + { + _GLEE_NV_transform_feedback2 = GL_TRUE; + __GLeeLink_GL_NV_transform_feedback2(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_select", &extensionNames) ) + { + _GLEE_SGIX_texture_select = GL_TRUE; + __GLeeLink_GL_SGIX_texture_select(); + } + if (__GLeeCheckExtension("GL_INGR_blend_func_separate", &extensionNames) ) + { + _GLEE_INGR_blend_func_separate = GL_TRUE; + __GLeeLink_GL_INGR_blend_func_separate(); + } + if (__GLeeCheckExtension("GL_SGIX_depth_pass_instrument", &extensionNames) ) + { + _GLEE_SGIX_depth_pass_instrument = GL_TRUE; + __GLeeLink_GL_SGIX_depth_pass_instrument(); + } + if (__GLeeCheckExtension("GL_SGIX_igloo_interface", &extensionNames) ) + { + _GLEE_SGIX_igloo_interface = GL_TRUE; + __GLeeLink_GL_SGIX_igloo_interface(); + } + if (__GLeeCheckExtension("GL_EXT_fragment_lighting", &extensionNames) ) + { + _GLEE_EXT_fragment_lighting = GL_TRUE; + __GLeeLink_GL_EXT_fragment_lighting(); + } + if (__GLeeCheckExtension("GL_EXT_geometry_shader4", &extensionNames) ) + { + _GLEE_EXT_geometry_shader4 = GL_TRUE; + __GLeeLink_GL_EXT_geometry_shader4(); + } + if (__GLeeCheckExtension("GL_EXT_scene_marker", &extensionNames) ) + { + _GLEE_EXT_scene_marker = GL_TRUE; + __GLeeLink_GL_EXT_scene_marker(); + } + if (__GLeeCheckExtension("GL_EXT_texture_compression_dxt1", &extensionNames) ) + { + _GLEE_EXT_texture_compression_dxt1 = GL_TRUE; + __GLeeLink_GL_EXT_texture_compression_dxt1(); + } + if (__GLeeCheckExtension("GL_EXT_texture_env", &extensionNames) ) + { + _GLEE_EXT_texture_env = GL_TRUE; + __GLeeLink_GL_EXT_texture_env(); + } + if (__GLeeCheckExtension("GL_IBM_static_data", &extensionNames) ) + { + _GLEE_IBM_static_data = GL_TRUE; + __GLeeLink_GL_IBM_static_data(); + } + if (__GLeeCheckExtension("GL_NV_gpu_program4", &extensionNames) ) + { + _GLEE_NV_gpu_program4 = GL_TRUE; + __GLeeLink_GL_NV_gpu_program4(); + } + if (__GLeeCheckExtension("GL_OES_byte_coordinates", &extensionNames) ) + { + _GLEE_OES_byte_coordinates = GL_TRUE; + __GLeeLink_GL_OES_byte_coordinates(); + } + if (__GLeeCheckExtension("GL_OES_compressed_paletted_texture", &extensionNames) ) + { + _GLEE_OES_compressed_paletted_texture = GL_TRUE; + __GLeeLink_GL_OES_compressed_paletted_texture(); + } + if (__GLeeCheckExtension("GL_OES_single_precision", &extensionNames) ) + { + _GLEE_OES_single_precision = GL_TRUE; + __GLeeLink_GL_OES_single_precision(); + } + if (__GLeeCheckExtension("GL_SGIX_pixel_texture_bits", &extensionNames) ) + { + _GLEE_SGIX_pixel_texture_bits = GL_TRUE; + __GLeeLink_GL_SGIX_pixel_texture_bits(); + } + if (__GLeeCheckExtension("GL_SGIX_texture_range", &extensionNames) ) + { + _GLEE_SGIX_texture_range = GL_TRUE; + __GLeeLink_GL_SGIX_texture_range(); + } +#ifdef WIN32 + if (__GLeeCheckExtension("WGL_ARB_buffer_region", &extensionNames) ) + { + _GLEE_WGL_ARB_buffer_region = GL_TRUE; + __GLeeLink_WGL_ARB_buffer_region(); + } + if (__GLeeCheckExtension("WGL_ARB_multisample", &extensionNames) ) + { + _GLEE_WGL_ARB_multisample = GL_TRUE; + __GLeeLink_WGL_ARB_multisample(); + } + if (__GLeeCheckExtension("WGL_ARB_extensions_string", &extensionNames) ) + { + _GLEE_WGL_ARB_extensions_string = GL_TRUE; + __GLeeLink_WGL_ARB_extensions_string(); + } + if (__GLeeCheckExtension("WGL_ARB_pixel_format", &extensionNames) ) + { + _GLEE_WGL_ARB_pixel_format = GL_TRUE; + __GLeeLink_WGL_ARB_pixel_format(); + } + if (__GLeeCheckExtension("WGL_ARB_make_current_read", &extensionNames) ) + { + _GLEE_WGL_ARB_make_current_read = GL_TRUE; + __GLeeLink_WGL_ARB_make_current_read(); + } + if (__GLeeCheckExtension("WGL_ARB_pbuffer", &extensionNames) ) + { + _GLEE_WGL_ARB_pbuffer = GL_TRUE; + __GLeeLink_WGL_ARB_pbuffer(); + } + if (__GLeeCheckExtension("WGL_ARB_render_texture", &extensionNames) ) + { + _GLEE_WGL_ARB_render_texture = GL_TRUE; + __GLeeLink_WGL_ARB_render_texture(); + } + if (__GLeeCheckExtension("WGL_ARB_pixel_format_float", &extensionNames) ) + { + _GLEE_WGL_ARB_pixel_format_float = GL_TRUE; + __GLeeLink_WGL_ARB_pixel_format_float(); + } + if (__GLeeCheckExtension("WGL_ARB_create_context", &extensionNames) ) + { + _GLEE_WGL_ARB_create_context = GL_TRUE; + __GLeeLink_WGL_ARB_create_context(); + } + if (__GLeeCheckExtension("WGL_EXT_make_current_read", &extensionNames) ) + { + _GLEE_WGL_EXT_make_current_read = GL_TRUE; + __GLeeLink_WGL_EXT_make_current_read(); + } + if (__GLeeCheckExtension("WGL_EXT_pixel_format", &extensionNames) ) + { + _GLEE_WGL_EXT_pixel_format = GL_TRUE; + __GLeeLink_WGL_EXT_pixel_format(); + } + if (__GLeeCheckExtension("WGL_EXT_pbuffer", &extensionNames) ) + { + _GLEE_WGL_EXT_pbuffer = GL_TRUE; + __GLeeLink_WGL_EXT_pbuffer(); + } + if (__GLeeCheckExtension("WGL_EXT_depth_float", &extensionNames) ) + { + _GLEE_WGL_EXT_depth_float = GL_TRUE; + __GLeeLink_WGL_EXT_depth_float(); + } + if (__GLeeCheckExtension("WGL_3DFX_multisample", &extensionNames) ) + { + _GLEE_WGL_3DFX_multisample = GL_TRUE; + __GLeeLink_WGL_3DFX_multisample(); + } + if (__GLeeCheckExtension("WGL_EXT_multisample", &extensionNames) ) + { + _GLEE_WGL_EXT_multisample = GL_TRUE; + __GLeeLink_WGL_EXT_multisample(); + } + if (__GLeeCheckExtension("WGL_I3D_digital_video_control", &extensionNames) ) + { + _GLEE_WGL_I3D_digital_video_control = GL_TRUE; + __GLeeLink_WGL_I3D_digital_video_control(); + } + if (__GLeeCheckExtension("WGL_I3D_gamma", &extensionNames) ) + { + _GLEE_WGL_I3D_gamma = GL_TRUE; + __GLeeLink_WGL_I3D_gamma(); + } + if (__GLeeCheckExtension("WGL_I3D_genlock", &extensionNames) ) + { + _GLEE_WGL_I3D_genlock = GL_TRUE; + __GLeeLink_WGL_I3D_genlock(); + } + if (__GLeeCheckExtension("WGL_I3D_image_buffer", &extensionNames) ) + { + _GLEE_WGL_I3D_image_buffer = GL_TRUE; + __GLeeLink_WGL_I3D_image_buffer(); + } + if (__GLeeCheckExtension("WGL_I3D_swap_frame_lock", &extensionNames) ) + { + _GLEE_WGL_I3D_swap_frame_lock = GL_TRUE; + __GLeeLink_WGL_I3D_swap_frame_lock(); + } + if (__GLeeCheckExtension("WGL_NV_render_depth_texture", &extensionNames) ) + { + _GLEE_WGL_NV_render_depth_texture = GL_TRUE; + __GLeeLink_WGL_NV_render_depth_texture(); + } + if (__GLeeCheckExtension("WGL_NV_render_texture_rectangle", &extensionNames) ) + { + _GLEE_WGL_NV_render_texture_rectangle = GL_TRUE; + __GLeeLink_WGL_NV_render_texture_rectangle(); + } + if (__GLeeCheckExtension("WGL_ATI_pixel_format_float", &extensionNames) ) + { + _GLEE_WGL_ATI_pixel_format_float = GL_TRUE; + __GLeeLink_WGL_ATI_pixel_format_float(); + } + if (__GLeeCheckExtension("WGL_NV_float_buffer", &extensionNames) ) + { + _GLEE_WGL_NV_float_buffer = GL_TRUE; + __GLeeLink_WGL_NV_float_buffer(); + } + if (__GLeeCheckExtension("WGL_3DL_stereo_control", &extensionNames) ) + { + _GLEE_WGL_3DL_stereo_control = GL_TRUE; + __GLeeLink_WGL_3DL_stereo_control(); + } + if (__GLeeCheckExtension("WGL_EXT_pixel_format_packed_float", &extensionNames) ) + { + _GLEE_WGL_EXT_pixel_format_packed_float = GL_TRUE; + __GLeeLink_WGL_EXT_pixel_format_packed_float(); + } + if (__GLeeCheckExtension("WGL_EXT_framebuffer_sRGB", &extensionNames) ) + { + _GLEE_WGL_EXT_framebuffer_sRGB = GL_TRUE; + __GLeeLink_WGL_EXT_framebuffer_sRGB(); + } + if (__GLeeCheckExtension("WGL_NV_present_video", &extensionNames) ) + { + _GLEE_WGL_NV_present_video = GL_TRUE; + __GLeeLink_WGL_NV_present_video(); + } + if (__GLeeCheckExtension("WGL_NV_swap_group", &extensionNames) ) + { + _GLEE_WGL_NV_swap_group = GL_TRUE; + __GLeeLink_WGL_NV_swap_group(); + } + if (__GLeeCheckExtension("WGL_NV_gpu_affinity", &extensionNames) ) + { + _GLEE_WGL_NV_gpu_affinity = GL_TRUE; + __GLeeLink_WGL_NV_gpu_affinity(); + } + if (__GLeeCheckExtension("WGL_EXT_display_color_table", &extensionNames) ) + { + _GLEE_WGL_EXT_display_color_table = GL_TRUE; + __GLeeLink_WGL_EXT_display_color_table(); + } + if (__GLeeCheckExtension("WGL_EXT_extensions_string", &extensionNames) ) + { + _GLEE_WGL_EXT_extensions_string = GL_TRUE; + __GLeeLink_WGL_EXT_extensions_string(); + } + if (__GLeeCheckExtension("WGL_EXT_swap_control", &extensionNames) ) + { + _GLEE_WGL_EXT_swap_control = GL_TRUE; + __GLeeLink_WGL_EXT_swap_control(); + } + if (__GLeeCheckExtension("WGL_NV_vertex_array_range", &extensionNames) ) + { + _GLEE_WGL_NV_vertex_array_range = GL_TRUE; + __GLeeLink_WGL_NV_vertex_array_range(); + } + if (__GLeeCheckExtension("WGL_OML_sync_control", &extensionNames) ) + { + _GLEE_WGL_OML_sync_control = GL_TRUE; + __GLeeLink_WGL_OML_sync_control(); + } + if (__GLeeCheckExtension("WGL_I3D_swap_frame_usage", &extensionNames) ) + { + _GLEE_WGL_I3D_swap_frame_usage = GL_TRUE; + __GLeeLink_WGL_I3D_swap_frame_usage(); + } + if (__GLeeCheckExtension("WGL_NV_video_output", &extensionNames) ) + { + _GLEE_WGL_NV_video_output = GL_TRUE; + __GLeeLink_WGL_NV_video_output(); + } +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else /* GLX */ + if (__GLeeCheckExtension("GLX_VERSION_1_3", &extensionNames) ) + { + _GLEE_GLX_VERSION_1_3 = GL_TRUE; + __GLeeLink_GLX_VERSION_1_3(); + } + if (__GLeeCheckExtension("GLX_VERSION_1_4", &extensionNames) ) + { + _GLEE_GLX_VERSION_1_4 = GL_TRUE; + __GLeeLink_GLX_VERSION_1_4(); + } + if (__GLeeCheckExtension("GLX_ARB_multisample", &extensionNames) ) + { + _GLEE_GLX_ARB_multisample = GL_TRUE; + __GLeeLink_GLX_ARB_multisample(); + } + if (__GLeeCheckExtension("GLX_ARB_fbconfig_float", &extensionNames) ) + { + _GLEE_GLX_ARB_fbconfig_float = GL_TRUE; + __GLeeLink_GLX_ARB_fbconfig_float(); + } + if (__GLeeCheckExtension("GLX_ARB_create_context", &extensionNames) ) + { + _GLEE_GLX_ARB_create_context = GL_TRUE; + __GLeeLink_GLX_ARB_create_context(); + } + if (__GLeeCheckExtension("GLX_SGIS_multisample", &extensionNames) ) + { + _GLEE_GLX_SGIS_multisample = GL_TRUE; + __GLeeLink_GLX_SGIS_multisample(); + } + if (__GLeeCheckExtension("GLX_EXT_visual_info", &extensionNames) ) + { + _GLEE_GLX_EXT_visual_info = GL_TRUE; + __GLeeLink_GLX_EXT_visual_info(); + } + if (__GLeeCheckExtension("GLX_SGI_swap_control", &extensionNames) ) + { + _GLEE_GLX_SGI_swap_control = GL_TRUE; + __GLeeLink_GLX_SGI_swap_control(); + } + if (__GLeeCheckExtension("GLX_SGI_video_sync", &extensionNames) ) + { + _GLEE_GLX_SGI_video_sync = GL_TRUE; + __GLeeLink_GLX_SGI_video_sync(); + } + if (__GLeeCheckExtension("GLX_SGI_make_current_read", &extensionNames) ) + { + _GLEE_GLX_SGI_make_current_read = GL_TRUE; + __GLeeLink_GLX_SGI_make_current_read(); + } + if (__GLeeCheckExtension("GLX_EXT_visual_rating", &extensionNames) ) + { + _GLEE_GLX_EXT_visual_rating = GL_TRUE; + __GLeeLink_GLX_EXT_visual_rating(); + } + if (__GLeeCheckExtension("GLX_EXT_import_context", &extensionNames) ) + { + _GLEE_GLX_EXT_import_context = GL_TRUE; + __GLeeLink_GLX_EXT_import_context(); + } + if (__GLeeCheckExtension("GLX_SGIX_fbconfig", &extensionNames) ) + { + _GLEE_GLX_SGIX_fbconfig = GL_TRUE; + __GLeeLink_GLX_SGIX_fbconfig(); + } + if (__GLeeCheckExtension("GLX_SGIX_pbuffer", &extensionNames) ) + { + _GLEE_GLX_SGIX_pbuffer = GL_TRUE; + __GLeeLink_GLX_SGIX_pbuffer(); + } + if (__GLeeCheckExtension("GLX_SGI_cushion", &extensionNames) ) + { + _GLEE_GLX_SGI_cushion = GL_TRUE; + __GLeeLink_GLX_SGI_cushion(); + } + if (__GLeeCheckExtension("GLX_SGIX_video_resize", &extensionNames) ) + { + _GLEE_GLX_SGIX_video_resize = GL_TRUE; + __GLeeLink_GLX_SGIX_video_resize(); + } + if (__GLeeCheckExtension("GLX_SGIX_swap_group", &extensionNames) ) + { + _GLEE_GLX_SGIX_swap_group = GL_TRUE; + __GLeeLink_GLX_SGIX_swap_group(); + } + if (__GLeeCheckExtension("GLX_SGIX_swap_barrier", &extensionNames) ) + { + _GLEE_GLX_SGIX_swap_barrier = GL_TRUE; + __GLeeLink_GLX_SGIX_swap_barrier(); + } + if (__GLeeCheckExtension("GLX_SGIS_blended_overlay", &extensionNames) ) + { + _GLEE_GLX_SGIS_blended_overlay = GL_TRUE; + __GLeeLink_GLX_SGIS_blended_overlay(); + } + if (__GLeeCheckExtension("GLX_SGIS_shared_multisample", &extensionNames) ) + { + _GLEE_GLX_SGIS_shared_multisample = GL_TRUE; + __GLeeLink_GLX_SGIS_shared_multisample(); + } + if (__GLeeCheckExtension("GLX_SUN_get_transparent_index", &extensionNames) ) + { + _GLEE_GLX_SUN_get_transparent_index = GL_TRUE; + __GLeeLink_GLX_SUN_get_transparent_index(); + } + if (__GLeeCheckExtension("GLX_3DFX_multisample", &extensionNames) ) + { + _GLEE_GLX_3DFX_multisample = GL_TRUE; + __GLeeLink_GLX_3DFX_multisample(); + } + if (__GLeeCheckExtension("GLX_MESA_copy_sub_buffer", &extensionNames) ) + { + _GLEE_GLX_MESA_copy_sub_buffer = GL_TRUE; + __GLeeLink_GLX_MESA_copy_sub_buffer(); + } + if (__GLeeCheckExtension("GLX_MESA_pixmap_colormap", &extensionNames) ) + { + _GLEE_GLX_MESA_pixmap_colormap = GL_TRUE; + __GLeeLink_GLX_MESA_pixmap_colormap(); + } + if (__GLeeCheckExtension("GLX_MESA_release_buffers", &extensionNames) ) + { + _GLEE_GLX_MESA_release_buffers = GL_TRUE; + __GLeeLink_GLX_MESA_release_buffers(); + } + if (__GLeeCheckExtension("GLX_MESA_set_3dfx_mode", &extensionNames) ) + { + _GLEE_GLX_MESA_set_3dfx_mode = GL_TRUE; + __GLeeLink_GLX_MESA_set_3dfx_mode(); + } + if (__GLeeCheckExtension("GLX_SGIX_visual_select_group", &extensionNames) ) + { + _GLEE_GLX_SGIX_visual_select_group = GL_TRUE; + __GLeeLink_GLX_SGIX_visual_select_group(); + } + if (__GLeeCheckExtension("GLX_OML_swap_method", &extensionNames) ) + { + _GLEE_GLX_OML_swap_method = GL_TRUE; + __GLeeLink_GLX_OML_swap_method(); + } + if (__GLeeCheckExtension("GLX_OML_sync_control", &extensionNames) ) + { + _GLEE_GLX_OML_sync_control = GL_TRUE; + __GLeeLink_GLX_OML_sync_control(); + } + if (__GLeeCheckExtension("GLX_NV_float_buffer", &extensionNames) ) + { + _GLEE_GLX_NV_float_buffer = GL_TRUE; + __GLeeLink_GLX_NV_float_buffer(); + } + if (__GLeeCheckExtension("GLX_SGIX_hyperpipe", &extensionNames) ) + { + _GLEE_GLX_SGIX_hyperpipe = GL_TRUE; + __GLeeLink_GLX_SGIX_hyperpipe(); + } + if (__GLeeCheckExtension("GLX_MESA_agp_offset", &extensionNames) ) + { + _GLEE_GLX_MESA_agp_offset = GL_TRUE; + __GLeeLink_GLX_MESA_agp_offset(); + } + if (__GLeeCheckExtension("GLX_EXT_fbconfig_packed_float", &extensionNames) ) + { + _GLEE_GLX_EXT_fbconfig_packed_float = GL_TRUE; + __GLeeLink_GLX_EXT_fbconfig_packed_float(); + } + if (__GLeeCheckExtension("GLX_EXT_framebuffer_sRGB", &extensionNames) ) + { + _GLEE_GLX_EXT_framebuffer_sRGB = GL_TRUE; + __GLeeLink_GLX_EXT_framebuffer_sRGB(); + } + if (__GLeeCheckExtension("GLX_EXT_texture_from_pixmap", &extensionNames) ) + { + _GLEE_GLX_EXT_texture_from_pixmap = GL_TRUE; + __GLeeLink_GLX_EXT_texture_from_pixmap(); + } + if (__GLeeCheckExtension("GLX_NV_present_video", &extensionNames) ) + { + _GLEE_GLX_NV_present_video = GL_TRUE; + __GLeeLink_GLX_NV_present_video(); + } + if (__GLeeCheckExtension("GLX_NV_video_out", &extensionNames) ) + { + _GLEE_GLX_NV_video_out = GL_TRUE; + __GLeeLink_GLX_NV_video_out(); + } + if (__GLeeCheckExtension("GLX_NV_swap_group", &extensionNames) ) + { + _GLEE_GLX_NV_swap_group = GL_TRUE; + __GLeeLink_GLX_NV_swap_group(); + } + if (__GLeeCheckExtension("GLX_EXT_scene_marker", &extensionNames) ) + { + _GLEE_GLX_EXT_scene_marker = GL_TRUE; + __GLeeLink_GLX_EXT_scene_marker(); + } + if (__GLeeCheckExtension("GLX_NV_video_output", &extensionNames) ) + { + _GLEE_GLX_NV_video_output = GL_TRUE; + __GLeeLink_GLX_NV_video_output(); + } +#endif /* end GLX */ + + __GLeeExtList_clean(&extensionNames); + return GL_TRUE; +} diff --git a/Extras/sph/common/GLee.h b/Extras/sph/common/GLee.h index c88dbc9a9..8987d2425 100644 --- a/Extras/sph/common/GLee.h +++ b/Extras/sph/common/GLee.h @@ -1,17647 +1,17647 @@ -/*************************************************************************** -* -* GLee.h -* GLee (OpenGL Easy Extension library) -* Version : 5.4 -* -* Copyright (c)2009 Ben Woodhouse All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are -* met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer as -* the first lines of this file unmodified. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR -* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -* IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -* Web: http://elf-stone.com/glee.php -* -* [This file was automatically generated by GLeeGen 7.0 -* -***************************************************************************/ - -#ifndef __glee_h_ -#define __glee_h_ - -#ifdef __gl_h_ - #error gl.h included before glee.h -#endif - -#ifdef __glext_h_ - #error glext.h included before glee.h -#endif - -#ifdef __wglext_h_ - #error wglext.h included before glee.h -#endif - -#ifdef __glxext_h_ - #error glxext.h included before glee.h -#endif - -#ifdef WIN32 - #define WIN32_LEAN_AND_MEAN - #include - #include -#elif defined(__APPLE__) || defined(__APPLE_CC__) - #define GL_GLEXT_LEGACY - #include -#else // GLX - #define __glext_h_ /* prevent glext.h from being included */ - #define __glxext_h_ /* prevent glxext.h from being included */ - #define GLX_GLXEXT_PROTOTYPES - #include - #include -#endif - -#ifndef APIENTRY - #define APIENTRY -#endif - -#ifndef APIENTRYP - #define APIENTRYP APIENTRY * -#endif - -#define GLEE_EXTERN extern - -#ifdef __cplusplus - extern "C" { /* begin C linkage */ -#endif - -#define GLEE_LINK_FAIL 0 -#define GLEE_LINK_PARTIAL 1 -#define GLEE_LINK_COMPLETE 2 - -/* Extension querying variables */ - -GLEE_EXTERN GLboolean _GLEE_VERSION_1_2; -GLEE_EXTERN GLboolean _GLEE_ARB_imaging; -GLEE_EXTERN GLboolean _GLEE_VERSION_1_3; -GLEE_EXTERN GLboolean _GLEE_VERSION_1_4; -GLEE_EXTERN GLboolean _GLEE_VERSION_1_5; -GLEE_EXTERN GLboolean _GLEE_VERSION_2_0; -GLEE_EXTERN GLboolean _GLEE_VERSION_2_1; -GLEE_EXTERN GLboolean _GLEE_VERSION_3_0; -GLEE_EXTERN GLboolean _GLEE_ARB_multitexture; -GLEE_EXTERN GLboolean _GLEE_ARB_transpose_matrix; -GLEE_EXTERN GLboolean _GLEE_ARB_multisample; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_add; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_cube_map; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_compression; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_border_clamp; -GLEE_EXTERN GLboolean _GLEE_ARB_point_parameters; -GLEE_EXTERN GLboolean _GLEE_ARB_vertex_blend; -GLEE_EXTERN GLboolean _GLEE_ARB_matrix_palette; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_combine; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_crossbar; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_dot3; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_mirrored_repeat; -GLEE_EXTERN GLboolean _GLEE_ARB_depth_texture; -GLEE_EXTERN GLboolean _GLEE_ARB_shadow; -GLEE_EXTERN GLboolean _GLEE_ARB_shadow_ambient; -GLEE_EXTERN GLboolean _GLEE_ARB_window_pos; -GLEE_EXTERN GLboolean _GLEE_ARB_vertex_program; -GLEE_EXTERN GLboolean _GLEE_ARB_fragment_program; -GLEE_EXTERN GLboolean _GLEE_ARB_vertex_buffer_object; -GLEE_EXTERN GLboolean _GLEE_ARB_occlusion_query; -GLEE_EXTERN GLboolean _GLEE_ARB_shader_objects; -GLEE_EXTERN GLboolean _GLEE_ARB_vertex_shader; -GLEE_EXTERN GLboolean _GLEE_ARB_fragment_shader; -GLEE_EXTERN GLboolean _GLEE_ARB_shading_language_100; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_non_power_of_two; -GLEE_EXTERN GLboolean _GLEE_ARB_point_sprite; -GLEE_EXTERN GLboolean _GLEE_ARB_fragment_program_shadow; -GLEE_EXTERN GLboolean _GLEE_ARB_draw_buffers; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_rectangle; -GLEE_EXTERN GLboolean _GLEE_ARB_color_buffer_float; -GLEE_EXTERN GLboolean _GLEE_ARB_half_float_pixel; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_float; -GLEE_EXTERN GLboolean _GLEE_ARB_pixel_buffer_object; -GLEE_EXTERN GLboolean _GLEE_ARB_depth_buffer_float; -GLEE_EXTERN GLboolean _GLEE_ARB_draw_instanced; -GLEE_EXTERN GLboolean _GLEE_ARB_framebuffer_object; -GLEE_EXTERN GLboolean _GLEE_ARB_framebuffer_sRGB; -GLEE_EXTERN GLboolean _GLEE_ARB_geometry_shader4; -GLEE_EXTERN GLboolean _GLEE_ARB_half_float_vertex; -GLEE_EXTERN GLboolean _GLEE_ARB_instanced_arrays; -GLEE_EXTERN GLboolean _GLEE_ARB_map_buffer_range; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_buffer_object; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_compression_rgtc; -GLEE_EXTERN GLboolean _GLEE_ARB_texture_rg; -GLEE_EXTERN GLboolean _GLEE_ARB_vertex_array_object; -GLEE_EXTERN GLboolean _GLEE_EXT_abgr; -GLEE_EXTERN GLboolean _GLEE_EXT_blend_color; -GLEE_EXTERN GLboolean _GLEE_EXT_polygon_offset; -GLEE_EXTERN GLboolean _GLEE_EXT_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_texture3D; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture_filter4; -GLEE_EXTERN GLboolean _GLEE_EXT_subtexture; -GLEE_EXTERN GLboolean _GLEE_EXT_copy_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_histogram; -GLEE_EXTERN GLboolean _GLEE_EXT_convolution; -GLEE_EXTERN GLboolean _GLEE_SGI_color_matrix; -GLEE_EXTERN GLboolean _GLEE_SGI_color_table; -GLEE_EXTERN GLboolean _GLEE_SGIS_pixel_texture; -GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_texture; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture4D; -GLEE_EXTERN GLboolean _GLEE_SGI_texture_color_table; -GLEE_EXTERN GLboolean _GLEE_EXT_cmyka; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_object; -GLEE_EXTERN GLboolean _GLEE_SGIS_detail_texture; -GLEE_EXTERN GLboolean _GLEE_SGIS_sharpen_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_packed_pixels; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture_lod; -GLEE_EXTERN GLboolean _GLEE_SGIS_multisample; -GLEE_EXTERN GLboolean _GLEE_EXT_rescale_normal; -GLEE_EXTERN GLboolean _GLEE_EXT_vertex_array; -GLEE_EXTERN GLboolean _GLEE_EXT_misc_attribute; -GLEE_EXTERN GLboolean _GLEE_SGIS_generate_mipmap; -GLEE_EXTERN GLboolean _GLEE_SGIX_clipmap; -GLEE_EXTERN GLboolean _GLEE_SGIX_shadow; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture_edge_clamp; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture_border_clamp; -GLEE_EXTERN GLboolean _GLEE_EXT_blend_minmax; -GLEE_EXTERN GLboolean _GLEE_EXT_blend_subtract; -GLEE_EXTERN GLboolean _GLEE_EXT_blend_logic_op; -GLEE_EXTERN GLboolean _GLEE_SGIX_interlace; -GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_tiles; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture_select; -GLEE_EXTERN GLboolean _GLEE_SGIX_sprite; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_multi_buffer; -GLEE_EXTERN GLboolean _GLEE_EXT_point_parameters; -GLEE_EXTERN GLboolean _GLEE_SGIS_point_parameters; -GLEE_EXTERN GLboolean _GLEE_SGIX_instruments; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_scale_bias; -GLEE_EXTERN GLboolean _GLEE_SGIX_framezoom; -GLEE_EXTERN GLboolean _GLEE_SGIX_tag_sample_buffer; -GLEE_EXTERN GLboolean _GLEE_FfdMaskSGIX; -GLEE_EXTERN GLboolean _GLEE_SGIX_polynomial_ffd; -GLEE_EXTERN GLboolean _GLEE_SGIX_reference_plane; -GLEE_EXTERN GLboolean _GLEE_SGIX_flush_raster; -GLEE_EXTERN GLboolean _GLEE_SGIX_depth_texture; -GLEE_EXTERN GLboolean _GLEE_SGIS_fog_function; -GLEE_EXTERN GLboolean _GLEE_SGIX_fog_offset; -GLEE_EXTERN GLboolean _GLEE_HP_image_transform; -GLEE_EXTERN GLboolean _GLEE_HP_convolution_border_modes; -GLEE_EXTERN GLboolean _GLEE_INGR_palette_buffer; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_add_env; -GLEE_EXTERN GLboolean _GLEE_EXT_color_subtable; -GLEE_EXTERN GLboolean _GLEE_PGI_vertex_hints; -GLEE_EXTERN GLboolean _GLEE_PGI_misc_hints; -GLEE_EXTERN GLboolean _GLEE_EXT_paletted_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_clip_volume_hint; -GLEE_EXTERN GLboolean _GLEE_SGIX_list_priority; -GLEE_EXTERN GLboolean _GLEE_SGIX_ir_instrument1; -GLEE_EXTERN GLboolean _GLEE_SGIX_calligraphic_fragment; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_lod_bias; -GLEE_EXTERN GLboolean _GLEE_SGIX_shadow_ambient; -GLEE_EXTERN GLboolean _GLEE_EXT_index_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_index_material; -GLEE_EXTERN GLboolean _GLEE_EXT_index_func; -GLEE_EXTERN GLboolean _GLEE_EXT_index_array_formats; -GLEE_EXTERN GLboolean _GLEE_EXT_compiled_vertex_array; -GLEE_EXTERN GLboolean _GLEE_EXT_cull_vertex; -GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcb; -GLEE_EXTERN GLboolean _GLEE_SGIX_fragment_lighting; -GLEE_EXTERN GLboolean _GLEE_IBM_rasterpos_clip; -GLEE_EXTERN GLboolean _GLEE_HP_texture_lighting; -GLEE_EXTERN GLboolean _GLEE_EXT_draw_range_elements; -GLEE_EXTERN GLboolean _GLEE_WIN_phong_shading; -GLEE_EXTERN GLboolean _GLEE_WIN_specular_fog; -GLEE_EXTERN GLboolean _GLEE_EXT_light_texture; -GLEE_EXTERN GLboolean _GLEE_SGIX_blend_alpha_minmax; -GLEE_EXTERN GLboolean _GLEE_SGIX_impact_pixel_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_bgra; -GLEE_EXTERN GLboolean _GLEE_SGIX_async; -GLEE_EXTERN GLboolean _GLEE_SGIX_async_pixel; -GLEE_EXTERN GLboolean _GLEE_SGIX_async_histogram; -GLEE_EXTERN GLboolean _GLEE_INTEL_texture_scissor; -GLEE_EXTERN GLboolean _GLEE_INTEL_parallel_arrays; -GLEE_EXTERN GLboolean _GLEE_HP_occlusion_test; -GLEE_EXTERN GLboolean _GLEE_EXT_pixel_transform; -GLEE_EXTERN GLboolean _GLEE_EXT_pixel_transform_color_table; -GLEE_EXTERN GLboolean _GLEE_EXT_shared_texture_palette; -GLEE_EXTERN GLboolean _GLEE_EXT_separate_specular_color; -GLEE_EXTERN GLboolean _GLEE_EXT_secondary_color; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_perturb_normal; -GLEE_EXTERN GLboolean _GLEE_EXT_multi_draw_arrays; -GLEE_EXTERN GLboolean _GLEE_EXT_fog_coord; -GLEE_EXTERN GLboolean _GLEE_REND_screen_coordinates; -GLEE_EXTERN GLboolean _GLEE_EXT_coordinate_frame; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_combine; -GLEE_EXTERN GLboolean _GLEE_APPLE_specular_vector; -GLEE_EXTERN GLboolean _GLEE_APPLE_transform_hint; -GLEE_EXTERN GLboolean _GLEE_SGIX_fog_scale; -GLEE_EXTERN GLboolean _GLEE_SUNX_constant_data; -GLEE_EXTERN GLboolean _GLEE_SUN_global_alpha; -GLEE_EXTERN GLboolean _GLEE_SUN_triangle_list; -GLEE_EXTERN GLboolean _GLEE_SUN_vertex; -GLEE_EXTERN GLboolean _GLEE_EXT_blend_func_separate; -GLEE_EXTERN GLboolean _GLEE_INGR_color_clamp; -GLEE_EXTERN GLboolean _GLEE_INGR_interlace_read; -GLEE_EXTERN GLboolean _GLEE_EXT_stencil_wrap; -GLEE_EXTERN GLboolean _GLEE_EXT_422_pixels; -GLEE_EXTERN GLboolean _GLEE_NV_texgen_reflection; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_cube_map; -GLEE_EXTERN GLboolean _GLEE_SUN_convolution_border_modes; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_add; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_lod_bias; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_filter_anisotropic; -GLEE_EXTERN GLboolean _GLEE_EXT_vertex_weighting; -GLEE_EXTERN GLboolean _GLEE_NV_light_max_exponent; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_array_range; -GLEE_EXTERN GLboolean _GLEE_NV_register_combiners; -GLEE_EXTERN GLboolean _GLEE_NV_fog_distance; -GLEE_EXTERN GLboolean _GLEE_NV_texgen_emboss; -GLEE_EXTERN GLboolean _GLEE_NV_blend_square; -GLEE_EXTERN GLboolean _GLEE_NV_texture_env_combine4; -GLEE_EXTERN GLboolean _GLEE_MESA_resize_buffers; -GLEE_EXTERN GLboolean _GLEE_MESA_window_pos; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_s3tc; -GLEE_EXTERN GLboolean _GLEE_IBM_cull_vertex; -GLEE_EXTERN GLboolean _GLEE_IBM_multimode_draw_arrays; -GLEE_EXTERN GLboolean _GLEE_IBM_vertex_array_lists; -GLEE_EXTERN GLboolean _GLEE_SGIX_subsample; -GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcb_subsample; -GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcba; -GLEE_EXTERN GLboolean _GLEE_SGI_depth_pass_instrument; -GLEE_EXTERN GLboolean _GLEE_3DFX_texture_compression_FXT1; -GLEE_EXTERN GLboolean _GLEE_3DFX_multisample; -GLEE_EXTERN GLboolean _GLEE_3DFX_tbuffer; -GLEE_EXTERN GLboolean _GLEE_EXT_multisample; -GLEE_EXTERN GLboolean _GLEE_SGIX_vertex_preclip; -GLEE_EXTERN GLboolean _GLEE_SGIX_convolution_accuracy; -GLEE_EXTERN GLboolean _GLEE_SGIX_resample; -GLEE_EXTERN GLboolean _GLEE_SGIS_point_line_texgen; -GLEE_EXTERN GLboolean _GLEE_SGIS_texture_color_mask; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_dot3; -GLEE_EXTERN GLboolean _GLEE_ATI_texture_mirror_once; -GLEE_EXTERN GLboolean _GLEE_NV_fence; -GLEE_EXTERN GLboolean _GLEE_IBM_texture_mirrored_repeat; -GLEE_EXTERN GLboolean _GLEE_NV_evaluators; -GLEE_EXTERN GLboolean _GLEE_NV_packed_depth_stencil; -GLEE_EXTERN GLboolean _GLEE_NV_register_combiners2; -GLEE_EXTERN GLboolean _GLEE_NV_texture_compression_vtc; -GLEE_EXTERN GLboolean _GLEE_NV_texture_rectangle; -GLEE_EXTERN GLboolean _GLEE_NV_texture_shader; -GLEE_EXTERN GLboolean _GLEE_NV_texture_shader2; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_array_range2; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_program; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_coordinate_clamp; -GLEE_EXTERN GLboolean _GLEE_SGIX_scalebias_hint; -GLEE_EXTERN GLboolean _GLEE_OML_interlace; -GLEE_EXTERN GLboolean _GLEE_OML_subsample; -GLEE_EXTERN GLboolean _GLEE_OML_resample; -GLEE_EXTERN GLboolean _GLEE_NV_copy_depth_to_color; -GLEE_EXTERN GLboolean _GLEE_ATI_envmap_bumpmap; -GLEE_EXTERN GLboolean _GLEE_ATI_fragment_shader; -GLEE_EXTERN GLboolean _GLEE_ATI_pn_triangles; -GLEE_EXTERN GLboolean _GLEE_ATI_vertex_array_object; -GLEE_EXTERN GLboolean _GLEE_EXT_vertex_shader; -GLEE_EXTERN GLboolean _GLEE_ATI_vertex_streams; -GLEE_EXTERN GLboolean _GLEE_ATI_element_array; -GLEE_EXTERN GLboolean _GLEE_SUN_mesh_array; -GLEE_EXTERN GLboolean _GLEE_SUN_slice_accum; -GLEE_EXTERN GLboolean _GLEE_NV_multisample_filter_hint; -GLEE_EXTERN GLboolean _GLEE_NV_depth_clamp; -GLEE_EXTERN GLboolean _GLEE_NV_occlusion_query; -GLEE_EXTERN GLboolean _GLEE_NV_point_sprite; -GLEE_EXTERN GLboolean _GLEE_NV_texture_shader3; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_program1_1; -GLEE_EXTERN GLboolean _GLEE_EXT_shadow_funcs; -GLEE_EXTERN GLboolean _GLEE_EXT_stencil_two_side; -GLEE_EXTERN GLboolean _GLEE_ATI_text_fragment_shader; -GLEE_EXTERN GLboolean _GLEE_APPLE_client_storage; -GLEE_EXTERN GLboolean _GLEE_APPLE_element_array; -GLEE_EXTERN GLboolean _GLEE_APPLE_fence; -GLEE_EXTERN GLboolean _GLEE_APPLE_vertex_array_object; -GLEE_EXTERN GLboolean _GLEE_APPLE_vertex_array_range; -GLEE_EXTERN GLboolean _GLEE_APPLE_ycbcr_422; -GLEE_EXTERN GLboolean _GLEE_S3_s3tc; -GLEE_EXTERN GLboolean _GLEE_ATI_draw_buffers; -GLEE_EXTERN GLboolean _GLEE_ATI_pixel_format_float; -GLEE_EXTERN GLboolean _GLEE_ATI_texture_env_combine3; -GLEE_EXTERN GLboolean _GLEE_ATI_texture_float; -GLEE_EXTERN GLboolean _GLEE_NV_float_buffer; -GLEE_EXTERN GLboolean _GLEE_NV_fragment_program; -GLEE_EXTERN GLboolean _GLEE_NV_half_float; -GLEE_EXTERN GLboolean _GLEE_NV_pixel_data_range; -GLEE_EXTERN GLboolean _GLEE_NV_primitive_restart; -GLEE_EXTERN GLboolean _GLEE_NV_texture_expand_normal; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_program2; -GLEE_EXTERN GLboolean _GLEE_ATI_map_object_buffer; -GLEE_EXTERN GLboolean _GLEE_ATI_separate_stencil; -GLEE_EXTERN GLboolean _GLEE_ATI_vertex_attrib_array_object; -GLEE_EXTERN GLboolean _GLEE_OES_read_format; -GLEE_EXTERN GLboolean _GLEE_EXT_depth_bounds_test; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_mirror_clamp; -GLEE_EXTERN GLboolean _GLEE_EXT_blend_equation_separate; -GLEE_EXTERN GLboolean _GLEE_MESA_pack_invert; -GLEE_EXTERN GLboolean _GLEE_MESA_ycbcr_texture; -GLEE_EXTERN GLboolean _GLEE_EXT_pixel_buffer_object; -GLEE_EXTERN GLboolean _GLEE_NV_fragment_program_option; -GLEE_EXTERN GLboolean _GLEE_NV_fragment_program2; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_program2_option; -GLEE_EXTERN GLboolean _GLEE_NV_vertex_program3; -GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_object; -GLEE_EXTERN GLboolean _GLEE_GREMEDY_string_marker; -GLEE_EXTERN GLboolean _GLEE_EXT_packed_depth_stencil; -GLEE_EXTERN GLboolean _GLEE_EXT_stencil_clear_tag; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_sRGB; -GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_blit; -GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_multisample; -GLEE_EXTERN GLboolean _GLEE_MESAX_texture_stack; -GLEE_EXTERN GLboolean _GLEE_EXT_timer_query; -GLEE_EXTERN GLboolean _GLEE_EXT_gpu_program_parameters; -GLEE_EXTERN GLboolean _GLEE_APPLE_flush_buffer_range; -GLEE_EXTERN GLboolean _GLEE_EXT_gpu_shader4; -GLEE_EXTERN GLboolean _GLEE_EXT_draw_instanced; -GLEE_EXTERN GLboolean _GLEE_EXT_packed_float; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_array; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_buffer_object; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_latc; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_rgtc; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_shared_exponent; -GLEE_EXTERN GLboolean _GLEE_NV_depth_buffer_float; -GLEE_EXTERN GLboolean _GLEE_NV_framebuffer_multisample_coverage; -GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_sRGB; -GLEE_EXTERN GLboolean _GLEE_NV_geometry_shader4; -GLEE_EXTERN GLboolean _GLEE_NV_parameter_buffer_object; -GLEE_EXTERN GLboolean _GLEE_EXT_draw_buffers2; -GLEE_EXTERN GLboolean _GLEE_NV_transform_feedback; -GLEE_EXTERN GLboolean _GLEE_EXT_bindable_uniform; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_integer; -GLEE_EXTERN GLboolean _GLEE_GREMEDY_frame_terminator; -GLEE_EXTERN GLboolean _GLEE_NV_conditional_render; -GLEE_EXTERN GLboolean _GLEE_NV_present_video; -GLEE_EXTERN GLboolean _GLEE_EXT_transform_feedback; -GLEE_EXTERN GLboolean _GLEE_EXT_direct_state_access; -GLEE_EXTERN GLboolean _GLEE_EXT_vertex_array_bgra; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_swizzle; -GLEE_EXTERN GLboolean _GLEE_NV_explicit_multisample; -GLEE_EXTERN GLboolean _GLEE_NV_transform_feedback2; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_select; -GLEE_EXTERN GLboolean _GLEE_INGR_blend_func_separate; -GLEE_EXTERN GLboolean _GLEE_SGIX_depth_pass_instrument; -GLEE_EXTERN GLboolean _GLEE_SGIX_igloo_interface; -GLEE_EXTERN GLboolean _GLEE_EXT_fragment_lighting; -GLEE_EXTERN GLboolean _GLEE_EXT_geometry_shader4; -GLEE_EXTERN GLboolean _GLEE_EXT_scene_marker; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_dxt1; -GLEE_EXTERN GLboolean _GLEE_EXT_texture_env; -GLEE_EXTERN GLboolean _GLEE_IBM_static_data; -GLEE_EXTERN GLboolean _GLEE_NV_gpu_program4; -GLEE_EXTERN GLboolean _GLEE_OES_byte_coordinates; -GLEE_EXTERN GLboolean _GLEE_OES_compressed_paletted_texture; -GLEE_EXTERN GLboolean _GLEE_OES_single_precision; -GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_texture_bits; -GLEE_EXTERN GLboolean _GLEE_SGIX_texture_range; - -/* Aliases for extension querying variables */ - -#define GLEE_VERSION_1_2 GLeeEnabled(&_GLEE_VERSION_1_2) -#define GLEE_ARB_imaging GLeeEnabled(&_GLEE_ARB_imaging) -#define GLEE_VERSION_1_3 GLeeEnabled(&_GLEE_VERSION_1_3) -#define GLEE_VERSION_1_4 GLeeEnabled(&_GLEE_VERSION_1_4) -#define GLEE_VERSION_1_5 GLeeEnabled(&_GLEE_VERSION_1_5) -#define GLEE_VERSION_2_0 GLeeEnabled(&_GLEE_VERSION_2_0) -#define GLEE_VERSION_2_1 GLeeEnabled(&_GLEE_VERSION_2_1) -#define GLEE_VERSION_3_0 GLeeEnabled(&_GLEE_VERSION_3_0) -#define GLEE_ARB_multitexture GLeeEnabled(&_GLEE_ARB_multitexture) -#define GLEE_ARB_transpose_matrix GLeeEnabled(&_GLEE_ARB_transpose_matrix) -#define GLEE_ARB_multisample GLeeEnabled(&_GLEE_ARB_multisample) -#define GLEE_ARB_texture_env_add GLeeEnabled(&_GLEE_ARB_texture_env_add) -#define GLEE_ARB_texture_cube_map GLeeEnabled(&_GLEE_ARB_texture_cube_map) -#define GLEE_ARB_texture_compression GLeeEnabled(&_GLEE_ARB_texture_compression) -#define GLEE_ARB_texture_border_clamp GLeeEnabled(&_GLEE_ARB_texture_border_clamp) -#define GLEE_ARB_point_parameters GLeeEnabled(&_GLEE_ARB_point_parameters) -#define GLEE_ARB_vertex_blend GLeeEnabled(&_GLEE_ARB_vertex_blend) -#define GLEE_ARB_matrix_palette GLeeEnabled(&_GLEE_ARB_matrix_palette) -#define GLEE_ARB_texture_env_combine GLeeEnabled(&_GLEE_ARB_texture_env_combine) -#define GLEE_ARB_texture_env_crossbar GLeeEnabled(&_GLEE_ARB_texture_env_crossbar) -#define GLEE_ARB_texture_env_dot3 GLeeEnabled(&_GLEE_ARB_texture_env_dot3) -#define GLEE_ARB_texture_mirrored_repeat GLeeEnabled(&_GLEE_ARB_texture_mirrored_repeat) -#define GLEE_ARB_depth_texture GLeeEnabled(&_GLEE_ARB_depth_texture) -#define GLEE_ARB_shadow GLeeEnabled(&_GLEE_ARB_shadow) -#define GLEE_ARB_shadow_ambient GLeeEnabled(&_GLEE_ARB_shadow_ambient) -#define GLEE_ARB_window_pos GLeeEnabled(&_GLEE_ARB_window_pos) -#define GLEE_ARB_vertex_program GLeeEnabled(&_GLEE_ARB_vertex_program) -#define GLEE_ARB_fragment_program GLeeEnabled(&_GLEE_ARB_fragment_program) -#define GLEE_ARB_vertex_buffer_object GLeeEnabled(&_GLEE_ARB_vertex_buffer_object) -#define GLEE_ARB_occlusion_query GLeeEnabled(&_GLEE_ARB_occlusion_query) -#define GLEE_ARB_shader_objects GLeeEnabled(&_GLEE_ARB_shader_objects) -#define GLEE_ARB_vertex_shader GLeeEnabled(&_GLEE_ARB_vertex_shader) -#define GLEE_ARB_fragment_shader GLeeEnabled(&_GLEE_ARB_fragment_shader) -#define GLEE_ARB_shading_language_100 GLeeEnabled(&_GLEE_ARB_shading_language_100) -#define GLEE_ARB_texture_non_power_of_two GLeeEnabled(&_GLEE_ARB_texture_non_power_of_two) -#define GLEE_ARB_point_sprite GLeeEnabled(&_GLEE_ARB_point_sprite) -#define GLEE_ARB_fragment_program_shadow GLeeEnabled(&_GLEE_ARB_fragment_program_shadow) -#define GLEE_ARB_draw_buffers GLeeEnabled(&_GLEE_ARB_draw_buffers) -#define GLEE_ARB_texture_rectangle GLeeEnabled(&_GLEE_ARB_texture_rectangle) -#define GLEE_ARB_color_buffer_float GLeeEnabled(&_GLEE_ARB_color_buffer_float) -#define GLEE_ARB_half_float_pixel GLeeEnabled(&_GLEE_ARB_half_float_pixel) -#define GLEE_ARB_texture_float GLeeEnabled(&_GLEE_ARB_texture_float) -#define GLEE_ARB_pixel_buffer_object GLeeEnabled(&_GLEE_ARB_pixel_buffer_object) -#define GLEE_ARB_depth_buffer_float GLeeEnabled(&_GLEE_ARB_depth_buffer_float) -#define GLEE_ARB_draw_instanced GLeeEnabled(&_GLEE_ARB_draw_instanced) -#define GLEE_ARB_framebuffer_object GLeeEnabled(&_GLEE_ARB_framebuffer_object) -#define GLEE_ARB_framebuffer_sRGB GLeeEnabled(&_GLEE_ARB_framebuffer_sRGB) -#define GLEE_ARB_geometry_shader4 GLeeEnabled(&_GLEE_ARB_geometry_shader4) -#define GLEE_ARB_half_float_vertex GLeeEnabled(&_GLEE_ARB_half_float_vertex) -#define GLEE_ARB_instanced_arrays GLeeEnabled(&_GLEE_ARB_instanced_arrays) -#define GLEE_ARB_map_buffer_range GLeeEnabled(&_GLEE_ARB_map_buffer_range) -#define GLEE_ARB_texture_buffer_object GLeeEnabled(&_GLEE_ARB_texture_buffer_object) -#define GLEE_ARB_texture_compression_rgtc GLeeEnabled(&_GLEE_ARB_texture_compression_rgtc) -#define GLEE_ARB_texture_rg GLeeEnabled(&_GLEE_ARB_texture_rg) -#define GLEE_ARB_vertex_array_object GLeeEnabled(&_GLEE_ARB_vertex_array_object) -#define GLEE_EXT_abgr GLeeEnabled(&_GLEE_EXT_abgr) -#define GLEE_EXT_blend_color GLeeEnabled(&_GLEE_EXT_blend_color) -#define GLEE_EXT_polygon_offset GLeeEnabled(&_GLEE_EXT_polygon_offset) -#define GLEE_EXT_texture GLeeEnabled(&_GLEE_EXT_texture) -#define GLEE_EXT_texture3D GLeeEnabled(&_GLEE_EXT_texture3D) -#define GLEE_SGIS_texture_filter4 GLeeEnabled(&_GLEE_SGIS_texture_filter4) -#define GLEE_EXT_subtexture GLeeEnabled(&_GLEE_EXT_subtexture) -#define GLEE_EXT_copy_texture GLeeEnabled(&_GLEE_EXT_copy_texture) -#define GLEE_EXT_histogram GLeeEnabled(&_GLEE_EXT_histogram) -#define GLEE_EXT_convolution GLeeEnabled(&_GLEE_EXT_convolution) -#define GLEE_SGI_color_matrix GLeeEnabled(&_GLEE_SGI_color_matrix) -#define GLEE_SGI_color_table GLeeEnabled(&_GLEE_SGI_color_table) -#define GLEE_SGIS_pixel_texture GLeeEnabled(&_GLEE_SGIS_pixel_texture) -#define GLEE_SGIX_pixel_texture GLeeEnabled(&_GLEE_SGIX_pixel_texture) -#define GLEE_SGIS_texture4D GLeeEnabled(&_GLEE_SGIS_texture4D) -#define GLEE_SGI_texture_color_table GLeeEnabled(&_GLEE_SGI_texture_color_table) -#define GLEE_EXT_cmyka GLeeEnabled(&_GLEE_EXT_cmyka) -#define GLEE_EXT_texture_object GLeeEnabled(&_GLEE_EXT_texture_object) -#define GLEE_SGIS_detail_texture GLeeEnabled(&_GLEE_SGIS_detail_texture) -#define GLEE_SGIS_sharpen_texture GLeeEnabled(&_GLEE_SGIS_sharpen_texture) -#define GLEE_EXT_packed_pixels GLeeEnabled(&_GLEE_EXT_packed_pixels) -#define GLEE_SGIS_texture_lod GLeeEnabled(&_GLEE_SGIS_texture_lod) -#define GLEE_SGIS_multisample GLeeEnabled(&_GLEE_SGIS_multisample) -#define GLEE_EXT_rescale_normal GLeeEnabled(&_GLEE_EXT_rescale_normal) -#define GLEE_EXT_vertex_array GLeeEnabled(&_GLEE_EXT_vertex_array) -#define GLEE_EXT_misc_attribute GLeeEnabled(&_GLEE_EXT_misc_attribute) -#define GLEE_SGIS_generate_mipmap GLeeEnabled(&_GLEE_SGIS_generate_mipmap) -#define GLEE_SGIX_clipmap GLeeEnabled(&_GLEE_SGIX_clipmap) -#define GLEE_SGIX_shadow GLeeEnabled(&_GLEE_SGIX_shadow) -#define GLEE_SGIS_texture_edge_clamp GLeeEnabled(&_GLEE_SGIS_texture_edge_clamp) -#define GLEE_SGIS_texture_border_clamp GLeeEnabled(&_GLEE_SGIS_texture_border_clamp) -#define GLEE_EXT_blend_minmax GLeeEnabled(&_GLEE_EXT_blend_minmax) -#define GLEE_EXT_blend_subtract GLeeEnabled(&_GLEE_EXT_blend_subtract) -#define GLEE_EXT_blend_logic_op GLeeEnabled(&_GLEE_EXT_blend_logic_op) -#define GLEE_SGIX_interlace GLeeEnabled(&_GLEE_SGIX_interlace) -#define GLEE_SGIX_pixel_tiles GLeeEnabled(&_GLEE_SGIX_pixel_tiles) -#define GLEE_SGIS_texture_select GLeeEnabled(&_GLEE_SGIS_texture_select) -#define GLEE_SGIX_sprite GLeeEnabled(&_GLEE_SGIX_sprite) -#define GLEE_SGIX_texture_multi_buffer GLeeEnabled(&_GLEE_SGIX_texture_multi_buffer) -#define GLEE_EXT_point_parameters GLeeEnabled(&_GLEE_EXT_point_parameters) -#define GLEE_SGIS_point_parameters GLeeEnabled(&_GLEE_SGIS_point_parameters) -#define GLEE_SGIX_instruments GLeeEnabled(&_GLEE_SGIX_instruments) -#define GLEE_SGIX_texture_scale_bias GLeeEnabled(&_GLEE_SGIX_texture_scale_bias) -#define GLEE_SGIX_framezoom GLeeEnabled(&_GLEE_SGIX_framezoom) -#define GLEE_SGIX_tag_sample_buffer GLeeEnabled(&_GLEE_SGIX_tag_sample_buffer) -#define GLEE_FfdMaskSGIX GLeeEnabled(&_GLEE_FfdMaskSGIX) -#define GLEE_SGIX_polynomial_ffd GLeeEnabled(&_GLEE_SGIX_polynomial_ffd) -#define GLEE_SGIX_reference_plane GLeeEnabled(&_GLEE_SGIX_reference_plane) -#define GLEE_SGIX_flush_raster GLeeEnabled(&_GLEE_SGIX_flush_raster) -#define GLEE_SGIX_depth_texture GLeeEnabled(&_GLEE_SGIX_depth_texture) -#define GLEE_SGIS_fog_function GLeeEnabled(&_GLEE_SGIS_fog_function) -#define GLEE_SGIX_fog_offset GLeeEnabled(&_GLEE_SGIX_fog_offset) -#define GLEE_HP_image_transform GLeeEnabled(&_GLEE_HP_image_transform) -#define GLEE_HP_convolution_border_modes GLeeEnabled(&_GLEE_HP_convolution_border_modes) -#define GLEE_INGR_palette_buffer GLeeEnabled(&_GLEE_INGR_palette_buffer) -#define GLEE_SGIX_texture_add_env GLeeEnabled(&_GLEE_SGIX_texture_add_env) -#define GLEE_EXT_color_subtable GLeeEnabled(&_GLEE_EXT_color_subtable) -#define GLEE_PGI_vertex_hints GLeeEnabled(&_GLEE_PGI_vertex_hints) -#define GLEE_PGI_misc_hints GLeeEnabled(&_GLEE_PGI_misc_hints) -#define GLEE_EXT_paletted_texture GLeeEnabled(&_GLEE_EXT_paletted_texture) -#define GLEE_EXT_clip_volume_hint GLeeEnabled(&_GLEE_EXT_clip_volume_hint) -#define GLEE_SGIX_list_priority GLeeEnabled(&_GLEE_SGIX_list_priority) -#define GLEE_SGIX_ir_instrument1 GLeeEnabled(&_GLEE_SGIX_ir_instrument1) -#define GLEE_SGIX_calligraphic_fragment GLeeEnabled(&_GLEE_SGIX_calligraphic_fragment) -#define GLEE_SGIX_texture_lod_bias GLeeEnabled(&_GLEE_SGIX_texture_lod_bias) -#define GLEE_SGIX_shadow_ambient GLeeEnabled(&_GLEE_SGIX_shadow_ambient) -#define GLEE_EXT_index_texture GLeeEnabled(&_GLEE_EXT_index_texture) -#define GLEE_EXT_index_material GLeeEnabled(&_GLEE_EXT_index_material) -#define GLEE_EXT_index_func GLeeEnabled(&_GLEE_EXT_index_func) -#define GLEE_EXT_index_array_formats GLeeEnabled(&_GLEE_EXT_index_array_formats) -#define GLEE_EXT_compiled_vertex_array GLeeEnabled(&_GLEE_EXT_compiled_vertex_array) -#define GLEE_EXT_cull_vertex GLeeEnabled(&_GLEE_EXT_cull_vertex) -#define GLEE_SGIX_ycrcb GLeeEnabled(&_GLEE_SGIX_ycrcb) -#define GLEE_SGIX_fragment_lighting GLeeEnabled(&_GLEE_SGIX_fragment_lighting) -#define GLEE_IBM_rasterpos_clip GLeeEnabled(&_GLEE_IBM_rasterpos_clip) -#define GLEE_HP_texture_lighting GLeeEnabled(&_GLEE_HP_texture_lighting) -#define GLEE_EXT_draw_range_elements GLeeEnabled(&_GLEE_EXT_draw_range_elements) -#define GLEE_WIN_phong_shading GLeeEnabled(&_GLEE_WIN_phong_shading) -#define GLEE_WIN_specular_fog GLeeEnabled(&_GLEE_WIN_specular_fog) -#define GLEE_EXT_light_texture GLeeEnabled(&_GLEE_EXT_light_texture) -#define GLEE_SGIX_blend_alpha_minmax GLeeEnabled(&_GLEE_SGIX_blend_alpha_minmax) -#define GLEE_SGIX_impact_pixel_texture GLeeEnabled(&_GLEE_SGIX_impact_pixel_texture) -#define GLEE_EXT_bgra GLeeEnabled(&_GLEE_EXT_bgra) -#define GLEE_SGIX_async GLeeEnabled(&_GLEE_SGIX_async) -#define GLEE_SGIX_async_pixel GLeeEnabled(&_GLEE_SGIX_async_pixel) -#define GLEE_SGIX_async_histogram GLeeEnabled(&_GLEE_SGIX_async_histogram) -#define GLEE_INTEL_texture_scissor GLeeEnabled(&_GLEE_INTEL_texture_scissor) -#define GLEE_INTEL_parallel_arrays GLeeEnabled(&_GLEE_INTEL_parallel_arrays) -#define GLEE_HP_occlusion_test GLeeEnabled(&_GLEE_HP_occlusion_test) -#define GLEE_EXT_pixel_transform GLeeEnabled(&_GLEE_EXT_pixel_transform) -#define GLEE_EXT_pixel_transform_color_table GLeeEnabled(&_GLEE_EXT_pixel_transform_color_table) -#define GLEE_EXT_shared_texture_palette GLeeEnabled(&_GLEE_EXT_shared_texture_palette) -#define GLEE_EXT_separate_specular_color GLeeEnabled(&_GLEE_EXT_separate_specular_color) -#define GLEE_EXT_secondary_color GLeeEnabled(&_GLEE_EXT_secondary_color) -#define GLEE_EXT_texture_perturb_normal GLeeEnabled(&_GLEE_EXT_texture_perturb_normal) -#define GLEE_EXT_multi_draw_arrays GLeeEnabled(&_GLEE_EXT_multi_draw_arrays) -#define GLEE_EXT_fog_coord GLeeEnabled(&_GLEE_EXT_fog_coord) -#define GLEE_REND_screen_coordinates GLeeEnabled(&_GLEE_REND_screen_coordinates) -#define GLEE_EXT_coordinate_frame GLeeEnabled(&_GLEE_EXT_coordinate_frame) -#define GLEE_EXT_texture_env_combine GLeeEnabled(&_GLEE_EXT_texture_env_combine) -#define GLEE_APPLE_specular_vector GLeeEnabled(&_GLEE_APPLE_specular_vector) -#define GLEE_APPLE_transform_hint GLeeEnabled(&_GLEE_APPLE_transform_hint) -#define GLEE_SGIX_fog_scale GLeeEnabled(&_GLEE_SGIX_fog_scale) -#define GLEE_SUNX_constant_data GLeeEnabled(&_GLEE_SUNX_constant_data) -#define GLEE_SUN_global_alpha GLeeEnabled(&_GLEE_SUN_global_alpha) -#define GLEE_SUN_triangle_list GLeeEnabled(&_GLEE_SUN_triangle_list) -#define GLEE_SUN_vertex GLeeEnabled(&_GLEE_SUN_vertex) -#define GLEE_EXT_blend_func_separate GLeeEnabled(&_GLEE_EXT_blend_func_separate) -#define GLEE_INGR_color_clamp GLeeEnabled(&_GLEE_INGR_color_clamp) -#define GLEE_INGR_interlace_read GLeeEnabled(&_GLEE_INGR_interlace_read) -#define GLEE_EXT_stencil_wrap GLeeEnabled(&_GLEE_EXT_stencil_wrap) -#define GLEE_EXT_422_pixels GLeeEnabled(&_GLEE_EXT_422_pixels) -#define GLEE_NV_texgen_reflection GLeeEnabled(&_GLEE_NV_texgen_reflection) -#define GLEE_EXT_texture_cube_map GLeeEnabled(&_GLEE_EXT_texture_cube_map) -#define GLEE_SUN_convolution_border_modes GLeeEnabled(&_GLEE_SUN_convolution_border_modes) -#define GLEE_EXT_texture_env_add GLeeEnabled(&_GLEE_EXT_texture_env_add) -#define GLEE_EXT_texture_lod_bias GLeeEnabled(&_GLEE_EXT_texture_lod_bias) -#define GLEE_EXT_texture_filter_anisotropic GLeeEnabled(&_GLEE_EXT_texture_filter_anisotropic) -#define GLEE_EXT_vertex_weighting GLeeEnabled(&_GLEE_EXT_vertex_weighting) -#define GLEE_NV_light_max_exponent GLeeEnabled(&_GLEE_NV_light_max_exponent) -#define GLEE_NV_vertex_array_range GLeeEnabled(&_GLEE_NV_vertex_array_range) -#define GLEE_NV_register_combiners GLeeEnabled(&_GLEE_NV_register_combiners) -#define GLEE_NV_fog_distance GLeeEnabled(&_GLEE_NV_fog_distance) -#define GLEE_NV_texgen_emboss GLeeEnabled(&_GLEE_NV_texgen_emboss) -#define GLEE_NV_blend_square GLeeEnabled(&_GLEE_NV_blend_square) -#define GLEE_NV_texture_env_combine4 GLeeEnabled(&_GLEE_NV_texture_env_combine4) -#define GLEE_MESA_resize_buffers GLeeEnabled(&_GLEE_MESA_resize_buffers) -#define GLEE_MESA_window_pos GLeeEnabled(&_GLEE_MESA_window_pos) -#define GLEE_EXT_texture_compression_s3tc GLeeEnabled(&_GLEE_EXT_texture_compression_s3tc) -#define GLEE_IBM_cull_vertex GLeeEnabled(&_GLEE_IBM_cull_vertex) -#define GLEE_IBM_multimode_draw_arrays GLeeEnabled(&_GLEE_IBM_multimode_draw_arrays) -#define GLEE_IBM_vertex_array_lists GLeeEnabled(&_GLEE_IBM_vertex_array_lists) -#define GLEE_SGIX_subsample GLeeEnabled(&_GLEE_SGIX_subsample) -#define GLEE_SGIX_ycrcb_subsample GLeeEnabled(&_GLEE_SGIX_ycrcb_subsample) -#define GLEE_SGIX_ycrcba GLeeEnabled(&_GLEE_SGIX_ycrcba) -#define GLEE_SGI_depth_pass_instrument GLeeEnabled(&_GLEE_SGI_depth_pass_instrument) -#define GLEE_3DFX_texture_compression_FXT1 GLeeEnabled(&_GLEE_3DFX_texture_compression_FXT1) -#define GLEE_3DFX_multisample GLeeEnabled(&_GLEE_3DFX_multisample) -#define GLEE_3DFX_tbuffer GLeeEnabled(&_GLEE_3DFX_tbuffer) -#define GLEE_EXT_multisample GLeeEnabled(&_GLEE_EXT_multisample) -#define GLEE_SGIX_vertex_preclip GLeeEnabled(&_GLEE_SGIX_vertex_preclip) -#define GLEE_SGIX_convolution_accuracy GLeeEnabled(&_GLEE_SGIX_convolution_accuracy) -#define GLEE_SGIX_resample GLeeEnabled(&_GLEE_SGIX_resample) -#define GLEE_SGIS_point_line_texgen GLeeEnabled(&_GLEE_SGIS_point_line_texgen) -#define GLEE_SGIS_texture_color_mask GLeeEnabled(&_GLEE_SGIS_texture_color_mask) -#define GLEE_EXT_texture_env_dot3 GLeeEnabled(&_GLEE_EXT_texture_env_dot3) -#define GLEE_ATI_texture_mirror_once GLeeEnabled(&_GLEE_ATI_texture_mirror_once) -#define GLEE_NV_fence GLeeEnabled(&_GLEE_NV_fence) -#define GLEE_IBM_texture_mirrored_repeat GLeeEnabled(&_GLEE_IBM_texture_mirrored_repeat) -#define GLEE_NV_evaluators GLeeEnabled(&_GLEE_NV_evaluators) -#define GLEE_NV_packed_depth_stencil GLeeEnabled(&_GLEE_NV_packed_depth_stencil) -#define GLEE_NV_register_combiners2 GLeeEnabled(&_GLEE_NV_register_combiners2) -#define GLEE_NV_texture_compression_vtc GLeeEnabled(&_GLEE_NV_texture_compression_vtc) -#define GLEE_NV_texture_rectangle GLeeEnabled(&_GLEE_NV_texture_rectangle) -#define GLEE_NV_texture_shader GLeeEnabled(&_GLEE_NV_texture_shader) -#define GLEE_NV_texture_shader2 GLeeEnabled(&_GLEE_NV_texture_shader2) -#define GLEE_NV_vertex_array_range2 GLeeEnabled(&_GLEE_NV_vertex_array_range2) -#define GLEE_NV_vertex_program GLeeEnabled(&_GLEE_NV_vertex_program) -#define GLEE_SGIX_texture_coordinate_clamp GLeeEnabled(&_GLEE_SGIX_texture_coordinate_clamp) -#define GLEE_SGIX_scalebias_hint GLeeEnabled(&_GLEE_SGIX_scalebias_hint) -#define GLEE_OML_interlace GLeeEnabled(&_GLEE_OML_interlace) -#define GLEE_OML_subsample GLeeEnabled(&_GLEE_OML_subsample) -#define GLEE_OML_resample GLeeEnabled(&_GLEE_OML_resample) -#define GLEE_NV_copy_depth_to_color GLeeEnabled(&_GLEE_NV_copy_depth_to_color) -#define GLEE_ATI_envmap_bumpmap GLeeEnabled(&_GLEE_ATI_envmap_bumpmap) -#define GLEE_ATI_fragment_shader GLeeEnabled(&_GLEE_ATI_fragment_shader) -#define GLEE_ATI_pn_triangles GLeeEnabled(&_GLEE_ATI_pn_triangles) -#define GLEE_ATI_vertex_array_object GLeeEnabled(&_GLEE_ATI_vertex_array_object) -#define GLEE_EXT_vertex_shader GLeeEnabled(&_GLEE_EXT_vertex_shader) -#define GLEE_ATI_vertex_streams GLeeEnabled(&_GLEE_ATI_vertex_streams) -#define GLEE_ATI_element_array GLeeEnabled(&_GLEE_ATI_element_array) -#define GLEE_SUN_mesh_array GLeeEnabled(&_GLEE_SUN_mesh_array) -#define GLEE_SUN_slice_accum GLeeEnabled(&_GLEE_SUN_slice_accum) -#define GLEE_NV_multisample_filter_hint GLeeEnabled(&_GLEE_NV_multisample_filter_hint) -#define GLEE_NV_depth_clamp GLeeEnabled(&_GLEE_NV_depth_clamp) -#define GLEE_NV_occlusion_query GLeeEnabled(&_GLEE_NV_occlusion_query) -#define GLEE_NV_point_sprite GLeeEnabled(&_GLEE_NV_point_sprite) -#define GLEE_NV_texture_shader3 GLeeEnabled(&_GLEE_NV_texture_shader3) -#define GLEE_NV_vertex_program1_1 GLeeEnabled(&_GLEE_NV_vertex_program1_1) -#define GLEE_EXT_shadow_funcs GLeeEnabled(&_GLEE_EXT_shadow_funcs) -#define GLEE_EXT_stencil_two_side GLeeEnabled(&_GLEE_EXT_stencil_two_side) -#define GLEE_ATI_text_fragment_shader GLeeEnabled(&_GLEE_ATI_text_fragment_shader) -#define GLEE_APPLE_client_storage GLeeEnabled(&_GLEE_APPLE_client_storage) -#define GLEE_APPLE_element_array GLeeEnabled(&_GLEE_APPLE_element_array) -#define GLEE_APPLE_fence GLeeEnabled(&_GLEE_APPLE_fence) -#define GLEE_APPLE_vertex_array_object GLeeEnabled(&_GLEE_APPLE_vertex_array_object) -#define GLEE_APPLE_vertex_array_range GLeeEnabled(&_GLEE_APPLE_vertex_array_range) -#define GLEE_APPLE_ycbcr_422 GLeeEnabled(&_GLEE_APPLE_ycbcr_422) -#define GLEE_S3_s3tc GLeeEnabled(&_GLEE_S3_s3tc) -#define GLEE_ATI_draw_buffers GLeeEnabled(&_GLEE_ATI_draw_buffers) -#define GLEE_ATI_pixel_format_float GLeeEnabled(&_GLEE_ATI_pixel_format_float) -#define GLEE_ATI_texture_env_combine3 GLeeEnabled(&_GLEE_ATI_texture_env_combine3) -#define GLEE_ATI_texture_float GLeeEnabled(&_GLEE_ATI_texture_float) -#define GLEE_NV_float_buffer GLeeEnabled(&_GLEE_NV_float_buffer) -#define GLEE_NV_fragment_program GLeeEnabled(&_GLEE_NV_fragment_program) -#define GLEE_NV_half_float GLeeEnabled(&_GLEE_NV_half_float) -#define GLEE_NV_pixel_data_range GLeeEnabled(&_GLEE_NV_pixel_data_range) -#define GLEE_NV_primitive_restart GLeeEnabled(&_GLEE_NV_primitive_restart) -#define GLEE_NV_texture_expand_normal GLeeEnabled(&_GLEE_NV_texture_expand_normal) -#define GLEE_NV_vertex_program2 GLeeEnabled(&_GLEE_NV_vertex_program2) -#define GLEE_ATI_map_object_buffer GLeeEnabled(&_GLEE_ATI_map_object_buffer) -#define GLEE_ATI_separate_stencil GLeeEnabled(&_GLEE_ATI_separate_stencil) -#define GLEE_ATI_vertex_attrib_array_object GLeeEnabled(&_GLEE_ATI_vertex_attrib_array_object) -#define GLEE_OES_read_format GLeeEnabled(&_GLEE_OES_read_format) -#define GLEE_EXT_depth_bounds_test GLeeEnabled(&_GLEE_EXT_depth_bounds_test) -#define GLEE_EXT_texture_mirror_clamp GLeeEnabled(&_GLEE_EXT_texture_mirror_clamp) -#define GLEE_EXT_blend_equation_separate GLeeEnabled(&_GLEE_EXT_blend_equation_separate) -#define GLEE_MESA_pack_invert GLeeEnabled(&_GLEE_MESA_pack_invert) -#define GLEE_MESA_ycbcr_texture GLeeEnabled(&_GLEE_MESA_ycbcr_texture) -#define GLEE_EXT_pixel_buffer_object GLeeEnabled(&_GLEE_EXT_pixel_buffer_object) -#define GLEE_NV_fragment_program_option GLeeEnabled(&_GLEE_NV_fragment_program_option) -#define GLEE_NV_fragment_program2 GLeeEnabled(&_GLEE_NV_fragment_program2) -#define GLEE_NV_vertex_program2_option GLeeEnabled(&_GLEE_NV_vertex_program2_option) -#define GLEE_NV_vertex_program3 GLeeEnabled(&_GLEE_NV_vertex_program3) -#define GLEE_EXT_framebuffer_object GLeeEnabled(&_GLEE_EXT_framebuffer_object) -#define GLEE_GREMEDY_string_marker GLeeEnabled(&_GLEE_GREMEDY_string_marker) -#define GLEE_EXT_packed_depth_stencil GLeeEnabled(&_GLEE_EXT_packed_depth_stencil) -#define GLEE_EXT_stencil_clear_tag GLeeEnabled(&_GLEE_EXT_stencil_clear_tag) -#define GLEE_EXT_texture_sRGB GLeeEnabled(&_GLEE_EXT_texture_sRGB) -#define GLEE_EXT_framebuffer_blit GLeeEnabled(&_GLEE_EXT_framebuffer_blit) -#define GLEE_EXT_framebuffer_multisample GLeeEnabled(&_GLEE_EXT_framebuffer_multisample) -#define GLEE_MESAX_texture_stack GLeeEnabled(&_GLEE_MESAX_texture_stack) -#define GLEE_EXT_timer_query GLeeEnabled(&_GLEE_EXT_timer_query) -#define GLEE_EXT_gpu_program_parameters GLeeEnabled(&_GLEE_EXT_gpu_program_parameters) -#define GLEE_APPLE_flush_buffer_range GLeeEnabled(&_GLEE_APPLE_flush_buffer_range) -#define GLEE_EXT_gpu_shader4 GLeeEnabled(&_GLEE_EXT_gpu_shader4) -#define GLEE_EXT_draw_instanced GLeeEnabled(&_GLEE_EXT_draw_instanced) -#define GLEE_EXT_packed_float GLeeEnabled(&_GLEE_EXT_packed_float) -#define GLEE_EXT_texture_array GLeeEnabled(&_GLEE_EXT_texture_array) -#define GLEE_EXT_texture_buffer_object GLeeEnabled(&_GLEE_EXT_texture_buffer_object) -#define GLEE_EXT_texture_compression_latc GLeeEnabled(&_GLEE_EXT_texture_compression_latc) -#define GLEE_EXT_texture_compression_rgtc GLeeEnabled(&_GLEE_EXT_texture_compression_rgtc) -#define GLEE_EXT_texture_shared_exponent GLeeEnabled(&_GLEE_EXT_texture_shared_exponent) -#define GLEE_NV_depth_buffer_float GLeeEnabled(&_GLEE_NV_depth_buffer_float) -#define GLEE_NV_framebuffer_multisample_coverage GLeeEnabled(&_GLEE_NV_framebuffer_multisample_coverage) -#define GLEE_EXT_framebuffer_sRGB GLeeEnabled(&_GLEE_EXT_framebuffer_sRGB) -#define GLEE_NV_geometry_shader4 GLeeEnabled(&_GLEE_NV_geometry_shader4) -#define GLEE_NV_parameter_buffer_object GLeeEnabled(&_GLEE_NV_parameter_buffer_object) -#define GLEE_EXT_draw_buffers2 GLeeEnabled(&_GLEE_EXT_draw_buffers2) -#define GLEE_NV_transform_feedback GLeeEnabled(&_GLEE_NV_transform_feedback) -#define GLEE_EXT_bindable_uniform GLeeEnabled(&_GLEE_EXT_bindable_uniform) -#define GLEE_EXT_texture_integer GLeeEnabled(&_GLEE_EXT_texture_integer) -#define GLEE_GREMEDY_frame_terminator GLeeEnabled(&_GLEE_GREMEDY_frame_terminator) -#define GLEE_NV_conditional_render GLeeEnabled(&_GLEE_NV_conditional_render) -#define GLEE_NV_present_video GLeeEnabled(&_GLEE_NV_present_video) -#define GLEE_EXT_transform_feedback GLeeEnabled(&_GLEE_EXT_transform_feedback) -#define GLEE_EXT_direct_state_access GLeeEnabled(&_GLEE_EXT_direct_state_access) -#define GLEE_EXT_vertex_array_bgra GLeeEnabled(&_GLEE_EXT_vertex_array_bgra) -#define GLEE_EXT_texture_swizzle GLeeEnabled(&_GLEE_EXT_texture_swizzle) -#define GLEE_NV_explicit_multisample GLeeEnabled(&_GLEE_NV_explicit_multisample) -#define GLEE_NV_transform_feedback2 GLeeEnabled(&_GLEE_NV_transform_feedback2) -#define GLEE_SGIX_texture_select GLeeEnabled(&_GLEE_SGIX_texture_select) -#define GLEE_INGR_blend_func_separate GLeeEnabled(&_GLEE_INGR_blend_func_separate) -#define GLEE_SGIX_depth_pass_instrument GLeeEnabled(&_GLEE_SGIX_depth_pass_instrument) -#define GLEE_SGIX_igloo_interface GLeeEnabled(&_GLEE_SGIX_igloo_interface) -#define GLEE_EXT_fragment_lighting GLeeEnabled(&_GLEE_EXT_fragment_lighting) -#define GLEE_EXT_geometry_shader4 GLeeEnabled(&_GLEE_EXT_geometry_shader4) -#define GLEE_EXT_scene_marker GLeeEnabled(&_GLEE_EXT_scene_marker) -#define GLEE_EXT_texture_compression_dxt1 GLeeEnabled(&_GLEE_EXT_texture_compression_dxt1) -#define GLEE_EXT_texture_env GLeeEnabled(&_GLEE_EXT_texture_env) -#define GLEE_IBM_static_data GLeeEnabled(&_GLEE_IBM_static_data) -#define GLEE_NV_gpu_program4 GLeeEnabled(&_GLEE_NV_gpu_program4) -#define GLEE_OES_byte_coordinates GLeeEnabled(&_GLEE_OES_byte_coordinates) -#define GLEE_OES_compressed_paletted_texture GLeeEnabled(&_GLEE_OES_compressed_paletted_texture) -#define GLEE_OES_single_precision GLeeEnabled(&_GLEE_OES_single_precision) -#define GLEE_SGIX_pixel_texture_bits GLeeEnabled(&_GLEE_SGIX_pixel_texture_bits) -#define GLEE_SGIX_texture_range GLeeEnabled(&_GLEE_SGIX_texture_range) - - -/***************************************************************** - * Additional types needed for extensions - *****************************************************************/ - -/* Used for GLSL shader text */ -#ifndef GL_VERSION_2_0 - typedef char GLchar; -#endif - -#include - -#ifndef GL_VERSION_1_5 - typedef ptrdiff_t GLintptr; - typedef ptrdiff_t GLsizeiptr; -#endif - -#ifndef GL_NV_half_float - typedef unsigned short GLhalfNV; -#endif - -#ifndef GL_ARB_vertex_buffer_object - typedef ptrdiff_t GLintptrARB; - typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects - typedef int GLhandleARB; - typedef char GLcharARB; -#endif - -#ifndef GL_EXT_timer_query - typedef signed long long GLint64EXT; - typedef unsigned long long GLuint64EXT; -#endif - -/* Platform-specific */ - -#ifdef WIN32 - - /* WGL */ - - #ifndef WGL_ARB_pbuffer - DECLARE_HANDLE(HPBUFFERARB); - #endif - - #ifndef WGL_EXT_pbuffer - DECLARE_HANDLE(HPBUFFEREXT); - #endif - - #ifndef WGL_NV_video_output - DECLARE_HANDLE(HPVIDEODEV); - #endif - - #ifndef WGL_NV_present_video - DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); - #endif - - #ifndef WGL_NV_gpu_affinity - DECLARE_HANDLE(HPGPUNV); - DECLARE_HANDLE(HGPUNV); - - typedef struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; - } GPU_DEVICE, *PGPU_DEVICE; - #endif - -#elif defined(__APPLE__) || defined(__APPLE_CC__) - - /* Mac OS X */ - -#else - - /* GLX */ - - typedef void (*__GLXextFuncPtr)(void); - - #ifndef GLX_ARB_get_proc_address - #define GLX_ARB_get_proc_address 1 - extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *); - extern void ( * glXGetProcAddressARB (const GLubyte *procName))(void); - typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName); - #endif - - #ifndef GLX_SGIX_fbconfig - typedef XID GLXFBConfigIDSGIX; - typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; - #endif - - #ifndef GLX_SGIX_pbuffer - typedef XID GLXPbufferSGIX; - typedef struct { - int type; - unsigned long serial; - Bool send_event; - Display *display; - GLXDrawable drawable; - int event_type; - int draw_type; - unsigned int mask; - int x, y; - int width, height; - int count; - } GLXBufferClobberEventSGIX; - #endif - - #ifndef GLX_SGIX_hyperpipe - #define _GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 - typedef struct - { - char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int networkId; - } GLXHyperpipeNetworkSGIX; - - typedef struct - { - char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int channel; - unsigned int participationType; - int timeSlice; - } GLXHyperpipeConfigSGIX; - - typedef struct - { - char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int srcXOrigin; - int srcYOrigin; - int srcWidth; - int srcHeight; - int destXOrigin; - int destYOrigin; - int destWidth; - int destHeight; - } GLXPipeRect; - - typedef struct - { - char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int XOrigin; - int YOrigin; - int maxHeight; - int maxWidth; - } GLXPipeRectLimits; - #endif - - #ifndef GLX_NV_video_output - typedef unsigned int GLXVideoDeviceNV; - #endif // GLX_NV_video_output - -#endif /* end platform specific */ - - - -/* GL_VERSION_1_2 */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#define __GLEE_GL_VERSION_1_2 1 -/* Constants */ -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#ifndef GLEE_H_DEFINED_glBlendColor -#define GLEE_H_DEFINED_glBlendColor - typedef void (APIENTRYP GLEEPFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - GLEE_EXTERN GLEEPFNGLBLENDCOLORPROC GLeeFuncPtr_glBlendColor; - #define glBlendColor GLeeFuncPtr_glBlendColor -#endif -#ifndef GLEE_H_DEFINED_glBlendEquation -#define GLEE_H_DEFINED_glBlendEquation - typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLBLENDEQUATIONPROC GLeeFuncPtr_glBlendEquation; - #define glBlendEquation GLeeFuncPtr_glBlendEquation -#endif -#ifndef GLEE_H_DEFINED_glDrawRangeElements -#define GLEE_H_DEFINED_glDrawRangeElements - typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); - GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTSPROC GLeeFuncPtr_glDrawRangeElements; - #define glDrawRangeElements GLeeFuncPtr_glDrawRangeElements -#endif -#ifndef GLEE_H_DEFINED_glColorTable -#define GLEE_H_DEFINED_glColorTable - typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); - GLEE_EXTERN GLEEPFNGLCOLORTABLEPROC GLeeFuncPtr_glColorTable; - #define glColorTable GLeeFuncPtr_glColorTable -#endif -#ifndef GLEE_H_DEFINED_glColorTableParameterfv -#define GLEE_H_DEFINED_glColorTableParameterfv - typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glColorTableParameterfv; - #define glColorTableParameterfv GLeeFuncPtr_glColorTableParameterfv -#endif -#ifndef GLEE_H_DEFINED_glColorTableParameteriv -#define GLEE_H_DEFINED_glColorTableParameteriv - typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glColorTableParameteriv; - #define glColorTableParameteriv GLeeFuncPtr_glColorTableParameteriv -#endif -#ifndef GLEE_H_DEFINED_glCopyColorTable -#define GLEE_H_DEFINED_glCopyColorTable - typedef void (APIENTRYP GLEEPFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYCOLORTABLEPROC GLeeFuncPtr_glCopyColorTable; - #define glCopyColorTable GLeeFuncPtr_glCopyColorTable -#endif -#ifndef GLEE_H_DEFINED_glGetColorTable -#define GLEE_H_DEFINED_glGetColorTable - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid * table); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPROC GLeeFuncPtr_glGetColorTable; - #define glGetColorTable GLeeFuncPtr_glGetColorTable -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableParameterfv -#define GLEE_H_DEFINED_glGetColorTableParameterfv - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glGetColorTableParameterfv; - #define glGetColorTableParameterfv GLeeFuncPtr_glGetColorTableParameterfv -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableParameteriv -#define GLEE_H_DEFINED_glGetColorTableParameteriv - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glGetColorTableParameteriv; - #define glGetColorTableParameteriv GLeeFuncPtr_glGetColorTableParameteriv -#endif -#ifndef GLEE_H_DEFINED_glColorSubTable -#define GLEE_H_DEFINED_glColorSubTable - typedef void (APIENTRYP GLEEPFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOLORSUBTABLEPROC GLeeFuncPtr_glColorSubTable; - #define glColorSubTable GLeeFuncPtr_glColorSubTable -#endif -#ifndef GLEE_H_DEFINED_glCopyColorSubTable -#define GLEE_H_DEFINED_glCopyColorSubTable - typedef void (APIENTRYP GLEEPFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYCOLORSUBTABLEPROC GLeeFuncPtr_glCopyColorSubTable; - #define glCopyColorSubTable GLeeFuncPtr_glCopyColorSubTable -#endif -#ifndef GLEE_H_DEFINED_glConvolutionFilter1D -#define GLEE_H_DEFINED_glConvolutionFilter1D - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glConvolutionFilter1D; - #define glConvolutionFilter1D GLeeFuncPtr_glConvolutionFilter1D -#endif -#ifndef GLEE_H_DEFINED_glConvolutionFilter2D -#define GLEE_H_DEFINED_glConvolutionFilter2D - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glConvolutionFilter2D; - #define glConvolutionFilter2D GLeeFuncPtr_glConvolutionFilter2D -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameterf -#define GLEE_H_DEFINED_glConvolutionParameterf - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFPROC GLeeFuncPtr_glConvolutionParameterf; - #define glConvolutionParameterf GLeeFuncPtr_glConvolutionParameterf -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameterfv -#define GLEE_H_DEFINED_glConvolutionParameterfv - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glConvolutionParameterfv; - #define glConvolutionParameterfv GLeeFuncPtr_glConvolutionParameterfv -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameteri -#define GLEE_H_DEFINED_glConvolutionParameteri - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIPROC GLeeFuncPtr_glConvolutionParameteri; - #define glConvolutionParameteri GLeeFuncPtr_glConvolutionParameteri -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameteriv -#define GLEE_H_DEFINED_glConvolutionParameteriv - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glConvolutionParameteriv; - #define glConvolutionParameteriv GLeeFuncPtr_glConvolutionParameteriv -#endif -#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter1D -#define GLEE_H_DEFINED_glCopyConvolutionFilter1D - typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glCopyConvolutionFilter1D; - #define glCopyConvolutionFilter1D GLeeFuncPtr_glCopyConvolutionFilter1D -#endif -#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter2D -#define GLEE_H_DEFINED_glCopyConvolutionFilter2D - typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glCopyConvolutionFilter2D; - #define glCopyConvolutionFilter2D GLeeFuncPtr_glCopyConvolutionFilter2D -#endif -#ifndef GLEE_H_DEFINED_glGetConvolutionFilter -#define GLEE_H_DEFINED_glGetConvolutionFilter - typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image); - GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONFILTERPROC GLeeFuncPtr_glGetConvolutionFilter; - #define glGetConvolutionFilter GLeeFuncPtr_glGetConvolutionFilter -#endif -#ifndef GLEE_H_DEFINED_glGetConvolutionParameterfv -#define GLEE_H_DEFINED_glGetConvolutionParameterfv - typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glGetConvolutionParameterfv; - #define glGetConvolutionParameterfv GLeeFuncPtr_glGetConvolutionParameterfv -#endif -#ifndef GLEE_H_DEFINED_glGetConvolutionParameteriv -#define GLEE_H_DEFINED_glGetConvolutionParameteriv - typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glGetConvolutionParameteriv; - #define glGetConvolutionParameteriv GLeeFuncPtr_glGetConvolutionParameteriv -#endif -#ifndef GLEE_H_DEFINED_glGetSeparableFilter -#define GLEE_H_DEFINED_glGetSeparableFilter - typedef void (APIENTRYP GLEEPFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); - GLEE_EXTERN GLEEPFNGLGETSEPARABLEFILTERPROC GLeeFuncPtr_glGetSeparableFilter; - #define glGetSeparableFilter GLeeFuncPtr_glGetSeparableFilter -#endif -#ifndef GLEE_H_DEFINED_glSeparableFilter2D -#define GLEE_H_DEFINED_glSeparableFilter2D - typedef void (APIENTRYP GLEEPFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); - GLEE_EXTERN GLEEPFNGLSEPARABLEFILTER2DPROC GLeeFuncPtr_glSeparableFilter2D; - #define glSeparableFilter2D GLeeFuncPtr_glSeparableFilter2D -#endif -#ifndef GLEE_H_DEFINED_glGetHistogram -#define GLEE_H_DEFINED_glGetHistogram - typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); - GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPROC GLeeFuncPtr_glGetHistogram; - #define glGetHistogram GLeeFuncPtr_glGetHistogram -#endif -#ifndef GLEE_H_DEFINED_glGetHistogramParameterfv -#define GLEE_H_DEFINED_glGetHistogramParameterfv - typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC GLeeFuncPtr_glGetHistogramParameterfv; - #define glGetHistogramParameterfv GLeeFuncPtr_glGetHistogramParameterfv -#endif -#ifndef GLEE_H_DEFINED_glGetHistogramParameteriv -#define GLEE_H_DEFINED_glGetHistogramParameteriv - typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC GLeeFuncPtr_glGetHistogramParameteriv; - #define glGetHistogramParameteriv GLeeFuncPtr_glGetHistogramParameteriv -#endif -#ifndef GLEE_H_DEFINED_glGetMinmax -#define GLEE_H_DEFINED_glGetMinmax - typedef void (APIENTRYP GLEEPFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); - GLEE_EXTERN GLEEPFNGLGETMINMAXPROC GLeeFuncPtr_glGetMinmax; - #define glGetMinmax GLeeFuncPtr_glGetMinmax -#endif -#ifndef GLEE_H_DEFINED_glGetMinmaxParameterfv -#define GLEE_H_DEFINED_glGetMinmaxParameterfv - typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERFVPROC GLeeFuncPtr_glGetMinmaxParameterfv; - #define glGetMinmaxParameterfv GLeeFuncPtr_glGetMinmaxParameterfv -#endif -#ifndef GLEE_H_DEFINED_glGetMinmaxParameteriv -#define GLEE_H_DEFINED_glGetMinmaxParameteriv - typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERIVPROC GLeeFuncPtr_glGetMinmaxParameteriv; - #define glGetMinmaxParameteriv GLeeFuncPtr_glGetMinmaxParameteriv -#endif -#ifndef GLEE_H_DEFINED_glHistogram -#define GLEE_H_DEFINED_glHistogram - typedef void (APIENTRYP GLEEPFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); - GLEE_EXTERN GLEEPFNGLHISTOGRAMPROC GLeeFuncPtr_glHistogram; - #define glHistogram GLeeFuncPtr_glHistogram -#endif -#ifndef GLEE_H_DEFINED_glMinmax -#define GLEE_H_DEFINED_glMinmax - typedef void (APIENTRYP GLEEPFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); - GLEE_EXTERN GLEEPFNGLMINMAXPROC GLeeFuncPtr_glMinmax; - #define glMinmax GLeeFuncPtr_glMinmax -#endif -#ifndef GLEE_H_DEFINED_glResetHistogram -#define GLEE_H_DEFINED_glResetHistogram - typedef void (APIENTRYP GLEEPFNGLRESETHISTOGRAMPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLRESETHISTOGRAMPROC GLeeFuncPtr_glResetHistogram; - #define glResetHistogram GLeeFuncPtr_glResetHistogram -#endif -#ifndef GLEE_H_DEFINED_glResetMinmax -#define GLEE_H_DEFINED_glResetMinmax - typedef void (APIENTRYP GLEEPFNGLRESETMINMAXPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLRESETMINMAXPROC GLeeFuncPtr_glResetMinmax; - #define glResetMinmax GLeeFuncPtr_glResetMinmax -#endif -#ifndef GLEE_H_DEFINED_glTexImage3D -#define GLEE_H_DEFINED_glTexImage3D - typedef void (APIENTRYP GLEEPFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXIMAGE3DPROC GLeeFuncPtr_glTexImage3D; - #define glTexImage3D GLeeFuncPtr_glTexImage3D -#endif -#ifndef GLEE_H_DEFINED_glTexSubImage3D -#define GLEE_H_DEFINED_glTexSubImage3D - typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE3DPROC GLeeFuncPtr_glTexSubImage3D; - #define glTexSubImage3D GLeeFuncPtr_glTexSubImage3D -#endif -#ifndef GLEE_H_DEFINED_glCopyTexSubImage3D -#define GLEE_H_DEFINED_glCopyTexSubImage3D - typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE3DPROC GLeeFuncPtr_glCopyTexSubImage3D; - #define glCopyTexSubImage3D GLeeFuncPtr_glCopyTexSubImage3D -#endif -#endif - -/* GL_ARB_imaging */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 -#define __GLEE_GL_ARB_imaging 1 -/* Constants */ -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#endif - -/* GL_VERSION_1_3 */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#define __GLEE_GL_VERSION_1_3 1 -/* Constants */ -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#ifndef GLEE_H_DEFINED_glActiveTexture -#define GLEE_H_DEFINED_glActiveTexture - typedef void (APIENTRYP GLEEPFNGLACTIVETEXTUREPROC) (GLenum texture); - GLEE_EXTERN GLEEPFNGLACTIVETEXTUREPROC GLeeFuncPtr_glActiveTexture; - #define glActiveTexture GLeeFuncPtr_glActiveTexture -#endif -#ifndef GLEE_H_DEFINED_glClientActiveTexture -#define GLEE_H_DEFINED_glClientActiveTexture - typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); - GLEE_EXTERN GLEEPFNGLCLIENTACTIVETEXTUREPROC GLeeFuncPtr_glClientActiveTexture; - #define glClientActiveTexture GLeeFuncPtr_glClientActiveTexture -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1d -#define GLEE_H_DEFINED_glMultiTexCoord1d - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DPROC GLeeFuncPtr_glMultiTexCoord1d; - #define glMultiTexCoord1d GLeeFuncPtr_glMultiTexCoord1d -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1dv -#define GLEE_H_DEFINED_glMultiTexCoord1dv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DVPROC GLeeFuncPtr_glMultiTexCoord1dv; - #define glMultiTexCoord1dv GLeeFuncPtr_glMultiTexCoord1dv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1f -#define GLEE_H_DEFINED_glMultiTexCoord1f - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FPROC GLeeFuncPtr_glMultiTexCoord1f; - #define glMultiTexCoord1f GLeeFuncPtr_glMultiTexCoord1f -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1fv -#define GLEE_H_DEFINED_glMultiTexCoord1fv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FVPROC GLeeFuncPtr_glMultiTexCoord1fv; - #define glMultiTexCoord1fv GLeeFuncPtr_glMultiTexCoord1fv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1i -#define GLEE_H_DEFINED_glMultiTexCoord1i - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IPROC GLeeFuncPtr_glMultiTexCoord1i; - #define glMultiTexCoord1i GLeeFuncPtr_glMultiTexCoord1i -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1iv -#define GLEE_H_DEFINED_glMultiTexCoord1iv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IVPROC GLeeFuncPtr_glMultiTexCoord1iv; - #define glMultiTexCoord1iv GLeeFuncPtr_glMultiTexCoord1iv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1s -#define GLEE_H_DEFINED_glMultiTexCoord1s - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SPROC GLeeFuncPtr_glMultiTexCoord1s; - #define glMultiTexCoord1s GLeeFuncPtr_glMultiTexCoord1s -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1sv -#define GLEE_H_DEFINED_glMultiTexCoord1sv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SVPROC GLeeFuncPtr_glMultiTexCoord1sv; - #define glMultiTexCoord1sv GLeeFuncPtr_glMultiTexCoord1sv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2d -#define GLEE_H_DEFINED_glMultiTexCoord2d - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DPROC GLeeFuncPtr_glMultiTexCoord2d; - #define glMultiTexCoord2d GLeeFuncPtr_glMultiTexCoord2d -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2dv -#define GLEE_H_DEFINED_glMultiTexCoord2dv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DVPROC GLeeFuncPtr_glMultiTexCoord2dv; - #define glMultiTexCoord2dv GLeeFuncPtr_glMultiTexCoord2dv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2f -#define GLEE_H_DEFINED_glMultiTexCoord2f - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FPROC GLeeFuncPtr_glMultiTexCoord2f; - #define glMultiTexCoord2f GLeeFuncPtr_glMultiTexCoord2f -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2fv -#define GLEE_H_DEFINED_glMultiTexCoord2fv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FVPROC GLeeFuncPtr_glMultiTexCoord2fv; - #define glMultiTexCoord2fv GLeeFuncPtr_glMultiTexCoord2fv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2i -#define GLEE_H_DEFINED_glMultiTexCoord2i - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IPROC GLeeFuncPtr_glMultiTexCoord2i; - #define glMultiTexCoord2i GLeeFuncPtr_glMultiTexCoord2i -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2iv -#define GLEE_H_DEFINED_glMultiTexCoord2iv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IVPROC GLeeFuncPtr_glMultiTexCoord2iv; - #define glMultiTexCoord2iv GLeeFuncPtr_glMultiTexCoord2iv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2s -#define GLEE_H_DEFINED_glMultiTexCoord2s - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SPROC GLeeFuncPtr_glMultiTexCoord2s; - #define glMultiTexCoord2s GLeeFuncPtr_glMultiTexCoord2s -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2sv -#define GLEE_H_DEFINED_glMultiTexCoord2sv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SVPROC GLeeFuncPtr_glMultiTexCoord2sv; - #define glMultiTexCoord2sv GLeeFuncPtr_glMultiTexCoord2sv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3d -#define GLEE_H_DEFINED_glMultiTexCoord3d - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DPROC GLeeFuncPtr_glMultiTexCoord3d; - #define glMultiTexCoord3d GLeeFuncPtr_glMultiTexCoord3d -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3dv -#define GLEE_H_DEFINED_glMultiTexCoord3dv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DVPROC GLeeFuncPtr_glMultiTexCoord3dv; - #define glMultiTexCoord3dv GLeeFuncPtr_glMultiTexCoord3dv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3f -#define GLEE_H_DEFINED_glMultiTexCoord3f - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FPROC GLeeFuncPtr_glMultiTexCoord3f; - #define glMultiTexCoord3f GLeeFuncPtr_glMultiTexCoord3f -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3fv -#define GLEE_H_DEFINED_glMultiTexCoord3fv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FVPROC GLeeFuncPtr_glMultiTexCoord3fv; - #define glMultiTexCoord3fv GLeeFuncPtr_glMultiTexCoord3fv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3i -#define GLEE_H_DEFINED_glMultiTexCoord3i - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IPROC GLeeFuncPtr_glMultiTexCoord3i; - #define glMultiTexCoord3i GLeeFuncPtr_glMultiTexCoord3i -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3iv -#define GLEE_H_DEFINED_glMultiTexCoord3iv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IVPROC GLeeFuncPtr_glMultiTexCoord3iv; - #define glMultiTexCoord3iv GLeeFuncPtr_glMultiTexCoord3iv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3s -#define GLEE_H_DEFINED_glMultiTexCoord3s - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SPROC GLeeFuncPtr_glMultiTexCoord3s; - #define glMultiTexCoord3s GLeeFuncPtr_glMultiTexCoord3s -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3sv -#define GLEE_H_DEFINED_glMultiTexCoord3sv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SVPROC GLeeFuncPtr_glMultiTexCoord3sv; - #define glMultiTexCoord3sv GLeeFuncPtr_glMultiTexCoord3sv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4d -#define GLEE_H_DEFINED_glMultiTexCoord4d - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DPROC GLeeFuncPtr_glMultiTexCoord4d; - #define glMultiTexCoord4d GLeeFuncPtr_glMultiTexCoord4d -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4dv -#define GLEE_H_DEFINED_glMultiTexCoord4dv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DVPROC GLeeFuncPtr_glMultiTexCoord4dv; - #define glMultiTexCoord4dv GLeeFuncPtr_glMultiTexCoord4dv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4f -#define GLEE_H_DEFINED_glMultiTexCoord4f - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FPROC GLeeFuncPtr_glMultiTexCoord4f; - #define glMultiTexCoord4f GLeeFuncPtr_glMultiTexCoord4f -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4fv -#define GLEE_H_DEFINED_glMultiTexCoord4fv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FVPROC GLeeFuncPtr_glMultiTexCoord4fv; - #define glMultiTexCoord4fv GLeeFuncPtr_glMultiTexCoord4fv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4i -#define GLEE_H_DEFINED_glMultiTexCoord4i - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IPROC GLeeFuncPtr_glMultiTexCoord4i; - #define glMultiTexCoord4i GLeeFuncPtr_glMultiTexCoord4i -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4iv -#define GLEE_H_DEFINED_glMultiTexCoord4iv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IVPROC GLeeFuncPtr_glMultiTexCoord4iv; - #define glMultiTexCoord4iv GLeeFuncPtr_glMultiTexCoord4iv -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4s -#define GLEE_H_DEFINED_glMultiTexCoord4s - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SPROC GLeeFuncPtr_glMultiTexCoord4s; - #define glMultiTexCoord4s GLeeFuncPtr_glMultiTexCoord4s -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4sv -#define GLEE_H_DEFINED_glMultiTexCoord4sv - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SVPROC GLeeFuncPtr_glMultiTexCoord4sv; - #define glMultiTexCoord4sv GLeeFuncPtr_glMultiTexCoord4sv -#endif -#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixf -#define GLEE_H_DEFINED_glLoadTransposeMatrixf - typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat * m); - GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXFPROC GLeeFuncPtr_glLoadTransposeMatrixf; - #define glLoadTransposeMatrixf GLeeFuncPtr_glLoadTransposeMatrixf -#endif -#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixd -#define GLEE_H_DEFINED_glLoadTransposeMatrixd - typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble * m); - GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXDPROC GLeeFuncPtr_glLoadTransposeMatrixd; - #define glLoadTransposeMatrixd GLeeFuncPtr_glLoadTransposeMatrixd -#endif -#ifndef GLEE_H_DEFINED_glMultTransposeMatrixf -#define GLEE_H_DEFINED_glMultTransposeMatrixf - typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat * m); - GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXFPROC GLeeFuncPtr_glMultTransposeMatrixf; - #define glMultTransposeMatrixf GLeeFuncPtr_glMultTransposeMatrixf -#endif -#ifndef GLEE_H_DEFINED_glMultTransposeMatrixd -#define GLEE_H_DEFINED_glMultTransposeMatrixd - typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble * m); - GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXDPROC GLeeFuncPtr_glMultTransposeMatrixd; - #define glMultTransposeMatrixd GLeeFuncPtr_glMultTransposeMatrixd -#endif -#ifndef GLEE_H_DEFINED_glSampleCoverage -#define GLEE_H_DEFINED_glSampleCoverage - typedef void (APIENTRYP GLEEPFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); - GLEE_EXTERN GLEEPFNGLSAMPLECOVERAGEPROC GLeeFuncPtr_glSampleCoverage; - #define glSampleCoverage GLeeFuncPtr_glSampleCoverage -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexImage3D -#define GLEE_H_DEFINED_glCompressedTexImage3D - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC GLeeFuncPtr_glCompressedTexImage3D; - #define glCompressedTexImage3D GLeeFuncPtr_glCompressedTexImage3D -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexImage2D -#define GLEE_H_DEFINED_glCompressedTexImage2D - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC GLeeFuncPtr_glCompressedTexImage2D; - #define glCompressedTexImage2D GLeeFuncPtr_glCompressedTexImage2D -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexImage1D -#define GLEE_H_DEFINED_glCompressedTexImage1D - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC GLeeFuncPtr_glCompressedTexImage1D; - #define glCompressedTexImage1D GLeeFuncPtr_glCompressedTexImage1D -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexSubImage3D -#define GLEE_H_DEFINED_glCompressedTexSubImage3D - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLeeFuncPtr_glCompressedTexSubImage3D; - #define glCompressedTexSubImage3D GLeeFuncPtr_glCompressedTexSubImage3D -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexSubImage2D -#define GLEE_H_DEFINED_glCompressedTexSubImage2D - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLeeFuncPtr_glCompressedTexSubImage2D; - #define glCompressedTexSubImage2D GLeeFuncPtr_glCompressedTexSubImage2D -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexSubImage1D -#define GLEE_H_DEFINED_glCompressedTexSubImage1D - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLeeFuncPtr_glCompressedTexSubImage1D; - #define glCompressedTexSubImage1D GLeeFuncPtr_glCompressedTexSubImage1D -#endif -#ifndef GLEE_H_DEFINED_glGetCompressedTexImage -#define GLEE_H_DEFINED_glGetCompressedTexImage - typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid * img); - GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC GLeeFuncPtr_glGetCompressedTexImage; - #define glGetCompressedTexImage GLeeFuncPtr_glGetCompressedTexImage -#endif -#endif - -/* GL_VERSION_1_4 */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#define __GLEE_GL_VERSION_1_4 1 -/* Constants */ -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#ifndef GLEE_H_DEFINED_glBlendFuncSeparate -#define GLEE_H_DEFINED_glBlendFuncSeparate - typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEPROC GLeeFuncPtr_glBlendFuncSeparate; - #define glBlendFuncSeparate GLeeFuncPtr_glBlendFuncSeparate -#endif -#ifndef GLEE_H_DEFINED_glFogCoordf -#define GLEE_H_DEFINED_glFogCoordf - typedef void (APIENTRYP GLEEPFNGLFOGCOORDFPROC) (GLfloat coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDFPROC GLeeFuncPtr_glFogCoordf; - #define glFogCoordf GLeeFuncPtr_glFogCoordf -#endif -#ifndef GLEE_H_DEFINED_glFogCoordfv -#define GLEE_H_DEFINED_glFogCoordfv - typedef void (APIENTRYP GLEEPFNGLFOGCOORDFVPROC) (const GLfloat * coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDFVPROC GLeeFuncPtr_glFogCoordfv; - #define glFogCoordfv GLeeFuncPtr_glFogCoordfv -#endif -#ifndef GLEE_H_DEFINED_glFogCoordd -#define GLEE_H_DEFINED_glFogCoordd - typedef void (APIENTRYP GLEEPFNGLFOGCOORDDPROC) (GLdouble coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDDPROC GLeeFuncPtr_glFogCoordd; - #define glFogCoordd GLeeFuncPtr_glFogCoordd -#endif -#ifndef GLEE_H_DEFINED_glFogCoorddv -#define GLEE_H_DEFINED_glFogCoorddv - typedef void (APIENTRYP GLEEPFNGLFOGCOORDDVPROC) (const GLdouble * coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDDVPROC GLeeFuncPtr_glFogCoorddv; - #define glFogCoorddv GLeeFuncPtr_glFogCoorddv -#endif -#ifndef GLEE_H_DEFINED_glFogCoordPointer -#define GLEE_H_DEFINED_glFogCoordPointer - typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTERPROC GLeeFuncPtr_glFogCoordPointer; - #define glFogCoordPointer GLeeFuncPtr_glFogCoordPointer -#endif -#ifndef GLEE_H_DEFINED_glMultiDrawArrays -#define GLEE_H_DEFINED_glMultiDrawArrays - typedef void (APIENTRYP GLEEPFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLMULTIDRAWARRAYSPROC GLeeFuncPtr_glMultiDrawArrays; - #define glMultiDrawArrays GLeeFuncPtr_glMultiDrawArrays -#endif -#ifndef GLEE_H_DEFINED_glMultiDrawElements -#define GLEE_H_DEFINED_glMultiDrawElements - typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTSPROC GLeeFuncPtr_glMultiDrawElements; - #define glMultiDrawElements GLeeFuncPtr_glMultiDrawElements -#endif -#ifndef GLEE_H_DEFINED_glPointParameterf -#define GLEE_H_DEFINED_glPointParameterf - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFPROC GLeeFuncPtr_glPointParameterf; - #define glPointParameterf GLeeFuncPtr_glPointParameterf -#endif -#ifndef GLEE_H_DEFINED_glPointParameterfv -#define GLEE_H_DEFINED_glPointParameterfv - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVPROC GLeeFuncPtr_glPointParameterfv; - #define glPointParameterfv GLeeFuncPtr_glPointParameterfv -#endif -#ifndef GLEE_H_DEFINED_glPointParameteri -#define GLEE_H_DEFINED_glPointParameteri - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIPROC GLeeFuncPtr_glPointParameteri; - #define glPointParameteri GLeeFuncPtr_glPointParameteri -#endif -#ifndef GLEE_H_DEFINED_glPointParameteriv -#define GLEE_H_DEFINED_glPointParameteriv - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIVPROC GLeeFuncPtr_glPointParameteriv; - #define glPointParameteriv GLeeFuncPtr_glPointParameteriv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3b -#define GLEE_H_DEFINED_glSecondaryColor3b - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BPROC GLeeFuncPtr_glSecondaryColor3b; - #define glSecondaryColor3b GLeeFuncPtr_glSecondaryColor3b -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3bv -#define GLEE_H_DEFINED_glSecondaryColor3bv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BVPROC) (const GLbyte * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BVPROC GLeeFuncPtr_glSecondaryColor3bv; - #define glSecondaryColor3bv GLeeFuncPtr_glSecondaryColor3bv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3d -#define GLEE_H_DEFINED_glSecondaryColor3d - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DPROC GLeeFuncPtr_glSecondaryColor3d; - #define glSecondaryColor3d GLeeFuncPtr_glSecondaryColor3d -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3dv -#define GLEE_H_DEFINED_glSecondaryColor3dv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DVPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DVPROC GLeeFuncPtr_glSecondaryColor3dv; - #define glSecondaryColor3dv GLeeFuncPtr_glSecondaryColor3dv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3f -#define GLEE_H_DEFINED_glSecondaryColor3f - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FPROC GLeeFuncPtr_glSecondaryColor3f; - #define glSecondaryColor3f GLeeFuncPtr_glSecondaryColor3f -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3fv -#define GLEE_H_DEFINED_glSecondaryColor3fv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FVPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FVPROC GLeeFuncPtr_glSecondaryColor3fv; - #define glSecondaryColor3fv GLeeFuncPtr_glSecondaryColor3fv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3i -#define GLEE_H_DEFINED_glSecondaryColor3i - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IPROC GLeeFuncPtr_glSecondaryColor3i; - #define glSecondaryColor3i GLeeFuncPtr_glSecondaryColor3i -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3iv -#define GLEE_H_DEFINED_glSecondaryColor3iv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IVPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IVPROC GLeeFuncPtr_glSecondaryColor3iv; - #define glSecondaryColor3iv GLeeFuncPtr_glSecondaryColor3iv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3s -#define GLEE_H_DEFINED_glSecondaryColor3s - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SPROC GLeeFuncPtr_glSecondaryColor3s; - #define glSecondaryColor3s GLeeFuncPtr_glSecondaryColor3s -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3sv -#define GLEE_H_DEFINED_glSecondaryColor3sv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SVPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SVPROC GLeeFuncPtr_glSecondaryColor3sv; - #define glSecondaryColor3sv GLeeFuncPtr_glSecondaryColor3sv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3ub -#define GLEE_H_DEFINED_glSecondaryColor3ub - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBPROC GLeeFuncPtr_glSecondaryColor3ub; - #define glSecondaryColor3ub GLeeFuncPtr_glSecondaryColor3ub -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3ubv -#define GLEE_H_DEFINED_glSecondaryColor3ubv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBVPROC GLeeFuncPtr_glSecondaryColor3ubv; - #define glSecondaryColor3ubv GLeeFuncPtr_glSecondaryColor3ubv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3ui -#define GLEE_H_DEFINED_glSecondaryColor3ui - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIPROC GLeeFuncPtr_glSecondaryColor3ui; - #define glSecondaryColor3ui GLeeFuncPtr_glSecondaryColor3ui -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3uiv -#define GLEE_H_DEFINED_glSecondaryColor3uiv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIVPROC) (const GLuint * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIVPROC GLeeFuncPtr_glSecondaryColor3uiv; - #define glSecondaryColor3uiv GLeeFuncPtr_glSecondaryColor3uiv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3us -#define GLEE_H_DEFINED_glSecondaryColor3us - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USPROC GLeeFuncPtr_glSecondaryColor3us; - #define glSecondaryColor3us GLeeFuncPtr_glSecondaryColor3us -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3usv -#define GLEE_H_DEFINED_glSecondaryColor3usv - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USVPROC) (const GLushort * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USVPROC GLeeFuncPtr_glSecondaryColor3usv; - #define glSecondaryColor3usv GLeeFuncPtr_glSecondaryColor3usv -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColorPointer -#define GLEE_H_DEFINED_glSecondaryColorPointer - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTERPROC GLeeFuncPtr_glSecondaryColorPointer; - #define glSecondaryColorPointer GLeeFuncPtr_glSecondaryColorPointer -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2d -#define GLEE_H_DEFINED_glWindowPos2d - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2DPROC GLeeFuncPtr_glWindowPos2d; - #define glWindowPos2d GLeeFuncPtr_glWindowPos2d -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2dv -#define GLEE_H_DEFINED_glWindowPos2dv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVPROC GLeeFuncPtr_glWindowPos2dv; - #define glWindowPos2dv GLeeFuncPtr_glWindowPos2dv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2f -#define GLEE_H_DEFINED_glWindowPos2f - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2FPROC GLeeFuncPtr_glWindowPos2f; - #define glWindowPos2f GLeeFuncPtr_glWindowPos2f -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2fv -#define GLEE_H_DEFINED_glWindowPos2fv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVPROC GLeeFuncPtr_glWindowPos2fv; - #define glWindowPos2fv GLeeFuncPtr_glWindowPos2fv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2i -#define GLEE_H_DEFINED_glWindowPos2i - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IPROC) (GLint x, GLint y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2IPROC GLeeFuncPtr_glWindowPos2i; - #define glWindowPos2i GLeeFuncPtr_glWindowPos2i -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2iv -#define GLEE_H_DEFINED_glWindowPos2iv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVPROC GLeeFuncPtr_glWindowPos2iv; - #define glWindowPos2iv GLeeFuncPtr_glWindowPos2iv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2s -#define GLEE_H_DEFINED_glWindowPos2s - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2SPROC GLeeFuncPtr_glWindowPos2s; - #define glWindowPos2s GLeeFuncPtr_glWindowPos2s -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2sv -#define GLEE_H_DEFINED_glWindowPos2sv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVPROC GLeeFuncPtr_glWindowPos2sv; - #define glWindowPos2sv GLeeFuncPtr_glWindowPos2sv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3d -#define GLEE_H_DEFINED_glWindowPos3d - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3DPROC GLeeFuncPtr_glWindowPos3d; - #define glWindowPos3d GLeeFuncPtr_glWindowPos3d -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3dv -#define GLEE_H_DEFINED_glWindowPos3dv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVPROC GLeeFuncPtr_glWindowPos3dv; - #define glWindowPos3dv GLeeFuncPtr_glWindowPos3dv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3f -#define GLEE_H_DEFINED_glWindowPos3f - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3FPROC GLeeFuncPtr_glWindowPos3f; - #define glWindowPos3f GLeeFuncPtr_glWindowPos3f -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3fv -#define GLEE_H_DEFINED_glWindowPos3fv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVPROC GLeeFuncPtr_glWindowPos3fv; - #define glWindowPos3fv GLeeFuncPtr_glWindowPos3fv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3i -#define GLEE_H_DEFINED_glWindowPos3i - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3IPROC GLeeFuncPtr_glWindowPos3i; - #define glWindowPos3i GLeeFuncPtr_glWindowPos3i -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3iv -#define GLEE_H_DEFINED_glWindowPos3iv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVPROC GLeeFuncPtr_glWindowPos3iv; - #define glWindowPos3iv GLeeFuncPtr_glWindowPos3iv -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3s -#define GLEE_H_DEFINED_glWindowPos3s - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3SPROC GLeeFuncPtr_glWindowPos3s; - #define glWindowPos3s GLeeFuncPtr_glWindowPos3s -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3sv -#define GLEE_H_DEFINED_glWindowPos3sv - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVPROC GLeeFuncPtr_glWindowPos3sv; - #define glWindowPos3sv GLeeFuncPtr_glWindowPos3sv -#endif -#endif - -/* GL_VERSION_1_5 */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#define __GLEE_GL_VERSION_1_5 1 -/* Constants */ -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#ifndef GLEE_H_DEFINED_glGenQueries -#define GLEE_H_DEFINED_glGenQueries - typedef void (APIENTRYP GLEEPFNGLGENQUERIESPROC) (GLsizei n, GLuint * ids); - GLEE_EXTERN GLEEPFNGLGENQUERIESPROC GLeeFuncPtr_glGenQueries; - #define glGenQueries GLeeFuncPtr_glGenQueries -#endif -#ifndef GLEE_H_DEFINED_glDeleteQueries -#define GLEE_H_DEFINED_glDeleteQueries - typedef void (APIENTRYP GLEEPFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint * ids); - GLEE_EXTERN GLEEPFNGLDELETEQUERIESPROC GLeeFuncPtr_glDeleteQueries; - #define glDeleteQueries GLeeFuncPtr_glDeleteQueries -#endif -#ifndef GLEE_H_DEFINED_glIsQuery -#define GLEE_H_DEFINED_glIsQuery - typedef GLboolean (APIENTRYP GLEEPFNGLISQUERYPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLISQUERYPROC GLeeFuncPtr_glIsQuery; - #define glIsQuery GLeeFuncPtr_glIsQuery -#endif -#ifndef GLEE_H_DEFINED_glBeginQuery -#define GLEE_H_DEFINED_glBeginQuery - typedef void (APIENTRYP GLEEPFNGLBEGINQUERYPROC) (GLenum target, GLuint id); - GLEE_EXTERN GLEEPFNGLBEGINQUERYPROC GLeeFuncPtr_glBeginQuery; - #define glBeginQuery GLeeFuncPtr_glBeginQuery -#endif -#ifndef GLEE_H_DEFINED_glEndQuery -#define GLEE_H_DEFINED_glEndQuery - typedef void (APIENTRYP GLEEPFNGLENDQUERYPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLENDQUERYPROC GLeeFuncPtr_glEndQuery; - #define glEndQuery GLeeFuncPtr_glEndQuery -#endif -#ifndef GLEE_H_DEFINED_glGetQueryiv -#define GLEE_H_DEFINED_glGetQueryiv - typedef void (APIENTRYP GLEEPFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETQUERYIVPROC GLeeFuncPtr_glGetQueryiv; - #define glGetQueryiv GLeeFuncPtr_glGetQueryiv -#endif -#ifndef GLEE_H_DEFINED_glGetQueryObjectiv -#define GLEE_H_DEFINED_glGetQueryObjectiv - typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTIVPROC GLeeFuncPtr_glGetQueryObjectiv; - #define glGetQueryObjectiv GLeeFuncPtr_glGetQueryObjectiv -#endif -#ifndef GLEE_H_DEFINED_glGetQueryObjectuiv -#define GLEE_H_DEFINED_glGetQueryObjectuiv - typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUIVPROC GLeeFuncPtr_glGetQueryObjectuiv; - #define glGetQueryObjectuiv GLeeFuncPtr_glGetQueryObjectuiv -#endif -#ifndef GLEE_H_DEFINED_glBindBuffer -#define GLEE_H_DEFINED_glBindBuffer - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); - GLEE_EXTERN GLEEPFNGLBINDBUFFERPROC GLeeFuncPtr_glBindBuffer; - #define glBindBuffer GLeeFuncPtr_glBindBuffer -#endif -#ifndef GLEE_H_DEFINED_glDeleteBuffers -#define GLEE_H_DEFINED_glDeleteBuffers - typedef void (APIENTRYP GLEEPFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint * buffers); - GLEE_EXTERN GLEEPFNGLDELETEBUFFERSPROC GLeeFuncPtr_glDeleteBuffers; - #define glDeleteBuffers GLeeFuncPtr_glDeleteBuffers -#endif -#ifndef GLEE_H_DEFINED_glGenBuffers -#define GLEE_H_DEFINED_glGenBuffers - typedef void (APIENTRYP GLEEPFNGLGENBUFFERSPROC) (GLsizei n, GLuint * buffers); - GLEE_EXTERN GLEEPFNGLGENBUFFERSPROC GLeeFuncPtr_glGenBuffers; - #define glGenBuffers GLeeFuncPtr_glGenBuffers -#endif -#ifndef GLEE_H_DEFINED_glIsBuffer -#define GLEE_H_DEFINED_glIsBuffer - typedef GLboolean (APIENTRYP GLEEPFNGLISBUFFERPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLISBUFFERPROC GLeeFuncPtr_glIsBuffer; - #define glIsBuffer GLeeFuncPtr_glIsBuffer -#endif -#ifndef GLEE_H_DEFINED_glBufferData -#define GLEE_H_DEFINED_glBufferData - typedef void (APIENTRYP GLEEPFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); - GLEE_EXTERN GLEEPFNGLBUFFERDATAPROC GLeeFuncPtr_glBufferData; - #define glBufferData GLeeFuncPtr_glBufferData -#endif -#ifndef GLEE_H_DEFINED_glBufferSubData -#define GLEE_H_DEFINED_glBufferSubData - typedef void (APIENTRYP GLEEPFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLBUFFERSUBDATAPROC GLeeFuncPtr_glBufferSubData; - #define glBufferSubData GLeeFuncPtr_glBufferSubData -#endif -#ifndef GLEE_H_DEFINED_glGetBufferSubData -#define GLEE_H_DEFINED_glGetBufferSubData - typedef void (APIENTRYP GLEEPFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data); - GLEE_EXTERN GLEEPFNGLGETBUFFERSUBDATAPROC GLeeFuncPtr_glGetBufferSubData; - #define glGetBufferSubData GLeeFuncPtr_glGetBufferSubData -#endif -#ifndef GLEE_H_DEFINED_glMapBuffer -#define GLEE_H_DEFINED_glMapBuffer - typedef GLvoid* (APIENTRYP GLEEPFNGLMAPBUFFERPROC) (GLenum target, GLenum access); - GLEE_EXTERN GLEEPFNGLMAPBUFFERPROC GLeeFuncPtr_glMapBuffer; - #define glMapBuffer GLeeFuncPtr_glMapBuffer -#endif -#ifndef GLEE_H_DEFINED_glUnmapBuffer -#define GLEE_H_DEFINED_glUnmapBuffer - typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPBUFFERPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLUNMAPBUFFERPROC GLeeFuncPtr_glUnmapBuffer; - #define glUnmapBuffer GLeeFuncPtr_glUnmapBuffer -#endif -#ifndef GLEE_H_DEFINED_glGetBufferParameteriv -#define GLEE_H_DEFINED_glGetBufferParameteriv - typedef void (APIENTRYP GLEEPFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetBufferParameteriv; - #define glGetBufferParameteriv GLeeFuncPtr_glGetBufferParameteriv -#endif -#ifndef GLEE_H_DEFINED_glGetBufferPointerv -#define GLEE_H_DEFINED_glGetBufferPointerv - typedef void (APIENTRYP GLEEPFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* * params); - GLEE_EXTERN GLEEPFNGLGETBUFFERPOINTERVPROC GLeeFuncPtr_glGetBufferPointerv; - #define glGetBufferPointerv GLeeFuncPtr_glGetBufferPointerv -#endif -#endif - -/* GL_VERSION_2_0 */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#define __GLEE_GL_VERSION_2_0 1 -/* Constants */ -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#ifndef GLEE_H_DEFINED_glBlendEquationSeparate -#define GLEE_H_DEFINED_glBlendEquationSeparate - typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); - GLEE_EXTERN GLEEPFNGLBLENDEQUATIONSEPARATEPROC GLeeFuncPtr_glBlendEquationSeparate; - #define glBlendEquationSeparate GLeeFuncPtr_glBlendEquationSeparate -#endif -#ifndef GLEE_H_DEFINED_glDrawBuffers -#define GLEE_H_DEFINED_glDrawBuffers - typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum * bufs); - GLEE_EXTERN GLEEPFNGLDRAWBUFFERSPROC GLeeFuncPtr_glDrawBuffers; - #define glDrawBuffers GLeeFuncPtr_glDrawBuffers -#endif -#ifndef GLEE_H_DEFINED_glStencilOpSeparate -#define GLEE_H_DEFINED_glStencilOpSeparate - typedef void (APIENTRYP GLEEPFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - GLEE_EXTERN GLEEPFNGLSTENCILOPSEPARATEPROC GLeeFuncPtr_glStencilOpSeparate; - #define glStencilOpSeparate GLeeFuncPtr_glStencilOpSeparate -#endif -#ifndef GLEE_H_DEFINED_glStencilFuncSeparate -#define GLEE_H_DEFINED_glStencilFuncSeparate - typedef void (APIENTRYP GLEEPFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); - GLEE_EXTERN GLEEPFNGLSTENCILFUNCSEPARATEPROC GLeeFuncPtr_glStencilFuncSeparate; - #define glStencilFuncSeparate GLeeFuncPtr_glStencilFuncSeparate -#endif -#ifndef GLEE_H_DEFINED_glStencilMaskSeparate -#define GLEE_H_DEFINED_glStencilMaskSeparate - typedef void (APIENTRYP GLEEPFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); - GLEE_EXTERN GLEEPFNGLSTENCILMASKSEPARATEPROC GLeeFuncPtr_glStencilMaskSeparate; - #define glStencilMaskSeparate GLeeFuncPtr_glStencilMaskSeparate -#endif -#ifndef GLEE_H_DEFINED_glAttachShader -#define GLEE_H_DEFINED_glAttachShader - typedef void (APIENTRYP GLEEPFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); - GLEE_EXTERN GLEEPFNGLATTACHSHADERPROC GLeeFuncPtr_glAttachShader; - #define glAttachShader GLeeFuncPtr_glAttachShader -#endif -#ifndef GLEE_H_DEFINED_glBindAttribLocation -#define GLEE_H_DEFINED_glBindAttribLocation - typedef void (APIENTRYP GLEEPFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar * name); - GLEE_EXTERN GLEEPFNGLBINDATTRIBLOCATIONPROC GLeeFuncPtr_glBindAttribLocation; - #define glBindAttribLocation GLeeFuncPtr_glBindAttribLocation -#endif -#ifndef GLEE_H_DEFINED_glCompileShader -#define GLEE_H_DEFINED_glCompileShader - typedef void (APIENTRYP GLEEPFNGLCOMPILESHADERPROC) (GLuint shader); - GLEE_EXTERN GLEEPFNGLCOMPILESHADERPROC GLeeFuncPtr_glCompileShader; - #define glCompileShader GLeeFuncPtr_glCompileShader -#endif -#ifndef GLEE_H_DEFINED_glCreateProgram -#define GLEE_H_DEFINED_glCreateProgram - typedef GLuint (APIENTRYP GLEEPFNGLCREATEPROGRAMPROC) (); - GLEE_EXTERN GLEEPFNGLCREATEPROGRAMPROC GLeeFuncPtr_glCreateProgram; - #define glCreateProgram GLeeFuncPtr_glCreateProgram -#endif -#ifndef GLEE_H_DEFINED_glCreateShader -#define GLEE_H_DEFINED_glCreateShader - typedef GLuint (APIENTRYP GLEEPFNGLCREATESHADERPROC) (GLenum type); - GLEE_EXTERN GLEEPFNGLCREATESHADERPROC GLeeFuncPtr_glCreateShader; - #define glCreateShader GLeeFuncPtr_glCreateShader -#endif -#ifndef GLEE_H_DEFINED_glDeleteProgram -#define GLEE_H_DEFINED_glDeleteProgram - typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMPROC) (GLuint program); - GLEE_EXTERN GLEEPFNGLDELETEPROGRAMPROC GLeeFuncPtr_glDeleteProgram; - #define glDeleteProgram GLeeFuncPtr_glDeleteProgram -#endif -#ifndef GLEE_H_DEFINED_glDeleteShader -#define GLEE_H_DEFINED_glDeleteShader - typedef void (APIENTRYP GLEEPFNGLDELETESHADERPROC) (GLuint shader); - GLEE_EXTERN GLEEPFNGLDELETESHADERPROC GLeeFuncPtr_glDeleteShader; - #define glDeleteShader GLeeFuncPtr_glDeleteShader -#endif -#ifndef GLEE_H_DEFINED_glDetachShader -#define GLEE_H_DEFINED_glDetachShader - typedef void (APIENTRYP GLEEPFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); - GLEE_EXTERN GLEEPFNGLDETACHSHADERPROC GLeeFuncPtr_glDetachShader; - #define glDetachShader GLeeFuncPtr_glDetachShader -#endif -#ifndef GLEE_H_DEFINED_glDisableVertexAttribArray -#define GLEE_H_DEFINED_glDisableVertexAttribArray - typedef void (APIENTRYP GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); - GLEE_EXTERN GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glDisableVertexAttribArray; - #define glDisableVertexAttribArray GLeeFuncPtr_glDisableVertexAttribArray -#endif -#ifndef GLEE_H_DEFINED_glEnableVertexAttribArray -#define GLEE_H_DEFINED_glEnableVertexAttribArray - typedef void (APIENTRYP GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); - GLEE_EXTERN GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glEnableVertexAttribArray; - #define glEnableVertexAttribArray GLeeFuncPtr_glEnableVertexAttribArray -#endif -#ifndef GLEE_H_DEFINED_glGetActiveAttrib -#define GLEE_H_DEFINED_glGetActiveAttrib - typedef void (APIENTRYP GLEEPFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); - GLEE_EXTERN GLEEPFNGLGETACTIVEATTRIBPROC GLeeFuncPtr_glGetActiveAttrib; - #define glGetActiveAttrib GLeeFuncPtr_glGetActiveAttrib -#endif -#ifndef GLEE_H_DEFINED_glGetActiveUniform -#define GLEE_H_DEFINED_glGetActiveUniform - typedef void (APIENTRYP GLEEPFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); - GLEE_EXTERN GLEEPFNGLGETACTIVEUNIFORMPROC GLeeFuncPtr_glGetActiveUniform; - #define glGetActiveUniform GLeeFuncPtr_glGetActiveUniform -#endif -#ifndef GLEE_H_DEFINED_glGetAttachedShaders -#define GLEE_H_DEFINED_glGetAttachedShaders - typedef void (APIENTRYP GLEEPFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj); - GLEE_EXTERN GLEEPFNGLGETATTACHEDSHADERSPROC GLeeFuncPtr_glGetAttachedShaders; - #define glGetAttachedShaders GLeeFuncPtr_glGetAttachedShaders -#endif -#ifndef GLEE_H_DEFINED_glGetAttribLocation -#define GLEE_H_DEFINED_glGetAttribLocation - typedef GLint (APIENTRYP GLEEPFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar * name); - GLEE_EXTERN GLEEPFNGLGETATTRIBLOCATIONPROC GLeeFuncPtr_glGetAttribLocation; - #define glGetAttribLocation GLeeFuncPtr_glGetAttribLocation -#endif -#ifndef GLEE_H_DEFINED_glGetProgramiv -#define GLEE_H_DEFINED_glGetProgramiv - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMIVPROC GLeeFuncPtr_glGetProgramiv; - #define glGetProgramiv GLeeFuncPtr_glGetProgramiv -#endif -#ifndef GLEE_H_DEFINED_glGetProgramInfoLog -#define GLEE_H_DEFINED_glGetProgramInfoLog - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); - GLEE_EXTERN GLEEPFNGLGETPROGRAMINFOLOGPROC GLeeFuncPtr_glGetProgramInfoLog; - #define glGetProgramInfoLog GLeeFuncPtr_glGetProgramInfoLog -#endif -#ifndef GLEE_H_DEFINED_glGetShaderiv -#define GLEE_H_DEFINED_glGetShaderiv - typedef void (APIENTRYP GLEEPFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETSHADERIVPROC GLeeFuncPtr_glGetShaderiv; - #define glGetShaderiv GLeeFuncPtr_glGetShaderiv -#endif -#ifndef GLEE_H_DEFINED_glGetShaderInfoLog -#define GLEE_H_DEFINED_glGetShaderInfoLog - typedef void (APIENTRYP GLEEPFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); - GLEE_EXTERN GLEEPFNGLGETSHADERINFOLOGPROC GLeeFuncPtr_glGetShaderInfoLog; - #define glGetShaderInfoLog GLeeFuncPtr_glGetShaderInfoLog -#endif -#ifndef GLEE_H_DEFINED_glGetShaderSource -#define GLEE_H_DEFINED_glGetShaderSource - typedef void (APIENTRYP GLEEPFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); - GLEE_EXTERN GLEEPFNGLGETSHADERSOURCEPROC GLeeFuncPtr_glGetShaderSource; - #define glGetShaderSource GLeeFuncPtr_glGetShaderSource -#endif -#ifndef GLEE_H_DEFINED_glGetUniformLocation -#define GLEE_H_DEFINED_glGetUniformLocation - typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar * name); - GLEE_EXTERN GLEEPFNGLGETUNIFORMLOCATIONPROC GLeeFuncPtr_glGetUniformLocation; - #define glGetUniformLocation GLeeFuncPtr_glGetUniformLocation -#endif -#ifndef GLEE_H_DEFINED_glGetUniformfv -#define GLEE_H_DEFINED_glGetUniformfv - typedef void (APIENTRYP GLEEPFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETUNIFORMFVPROC GLeeFuncPtr_glGetUniformfv; - #define glGetUniformfv GLeeFuncPtr_glGetUniformfv -#endif -#ifndef GLEE_H_DEFINED_glGetUniformiv -#define GLEE_H_DEFINED_glGetUniformiv - typedef void (APIENTRYP GLEEPFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint * params); - GLEE_EXTERN GLEEPFNGLGETUNIFORMIVPROC GLeeFuncPtr_glGetUniformiv; - #define glGetUniformiv GLeeFuncPtr_glGetUniformiv -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribdv -#define GLEE_H_DEFINED_glGetVertexAttribdv - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVPROC GLeeFuncPtr_glGetVertexAttribdv; - #define glGetVertexAttribdv GLeeFuncPtr_glGetVertexAttribdv -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribfv -#define GLEE_H_DEFINED_glGetVertexAttribfv - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVPROC GLeeFuncPtr_glGetVertexAttribfv; - #define glGetVertexAttribfv GLeeFuncPtr_glGetVertexAttribfv -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribiv -#define GLEE_H_DEFINED_glGetVertexAttribiv - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVPROC GLeeFuncPtr_glGetVertexAttribiv; - #define glGetVertexAttribiv GLeeFuncPtr_glGetVertexAttribiv -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribPointerv -#define GLEE_H_DEFINED_glGetVertexAttribPointerv - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC GLeeFuncPtr_glGetVertexAttribPointerv; - #define glGetVertexAttribPointerv GLeeFuncPtr_glGetVertexAttribPointerv -#endif -#ifndef GLEE_H_DEFINED_glIsProgram -#define GLEE_H_DEFINED_glIsProgram - typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMPROC) (GLuint program); - GLEE_EXTERN GLEEPFNGLISPROGRAMPROC GLeeFuncPtr_glIsProgram; - #define glIsProgram GLeeFuncPtr_glIsProgram -#endif -#ifndef GLEE_H_DEFINED_glIsShader -#define GLEE_H_DEFINED_glIsShader - typedef GLboolean (APIENTRYP GLEEPFNGLISSHADERPROC) (GLuint shader); - GLEE_EXTERN GLEEPFNGLISSHADERPROC GLeeFuncPtr_glIsShader; - #define glIsShader GLeeFuncPtr_glIsShader -#endif -#ifndef GLEE_H_DEFINED_glLinkProgram -#define GLEE_H_DEFINED_glLinkProgram - typedef void (APIENTRYP GLEEPFNGLLINKPROGRAMPROC) (GLuint program); - GLEE_EXTERN GLEEPFNGLLINKPROGRAMPROC GLeeFuncPtr_glLinkProgram; - #define glLinkProgram GLeeFuncPtr_glLinkProgram -#endif -#ifndef GLEE_H_DEFINED_glShaderSource -#define GLEE_H_DEFINED_glShaderSource - typedef void (APIENTRYP GLEEPFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* * string, const GLint * length); - GLEE_EXTERN GLEEPFNGLSHADERSOURCEPROC GLeeFuncPtr_glShaderSource; - #define glShaderSource GLeeFuncPtr_glShaderSource -#endif -#ifndef GLEE_H_DEFINED_glUseProgram -#define GLEE_H_DEFINED_glUseProgram - typedef void (APIENTRYP GLEEPFNGLUSEPROGRAMPROC) (GLuint program); - GLEE_EXTERN GLEEPFNGLUSEPROGRAMPROC GLeeFuncPtr_glUseProgram; - #define glUseProgram GLeeFuncPtr_glUseProgram -#endif -#ifndef GLEE_H_DEFINED_glUniform1f -#define GLEE_H_DEFINED_glUniform1f - typedef void (APIENTRYP GLEEPFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); - GLEE_EXTERN GLEEPFNGLUNIFORM1FPROC GLeeFuncPtr_glUniform1f; - #define glUniform1f GLeeFuncPtr_glUniform1f -#endif -#ifndef GLEE_H_DEFINED_glUniform2f -#define GLEE_H_DEFINED_glUniform2f - typedef void (APIENTRYP GLEEPFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); - GLEE_EXTERN GLEEPFNGLUNIFORM2FPROC GLeeFuncPtr_glUniform2f; - #define glUniform2f GLeeFuncPtr_glUniform2f -#endif -#ifndef GLEE_H_DEFINED_glUniform3f -#define GLEE_H_DEFINED_glUniform3f - typedef void (APIENTRYP GLEEPFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GLEE_EXTERN GLEEPFNGLUNIFORM3FPROC GLeeFuncPtr_glUniform3f; - #define glUniform3f GLeeFuncPtr_glUniform3f -#endif -#ifndef GLEE_H_DEFINED_glUniform4f -#define GLEE_H_DEFINED_glUniform4f - typedef void (APIENTRYP GLEEPFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GLEE_EXTERN GLEEPFNGLUNIFORM4FPROC GLeeFuncPtr_glUniform4f; - #define glUniform4f GLeeFuncPtr_glUniform4f -#endif -#ifndef GLEE_H_DEFINED_glUniform1i -#define GLEE_H_DEFINED_glUniform1i - typedef void (APIENTRYP GLEEPFNGLUNIFORM1IPROC) (GLint location, GLint v0); - GLEE_EXTERN GLEEPFNGLUNIFORM1IPROC GLeeFuncPtr_glUniform1i; - #define glUniform1i GLeeFuncPtr_glUniform1i -#endif -#ifndef GLEE_H_DEFINED_glUniform2i -#define GLEE_H_DEFINED_glUniform2i - typedef void (APIENTRYP GLEEPFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); - GLEE_EXTERN GLEEPFNGLUNIFORM2IPROC GLeeFuncPtr_glUniform2i; - #define glUniform2i GLeeFuncPtr_glUniform2i -#endif -#ifndef GLEE_H_DEFINED_glUniform3i -#define GLEE_H_DEFINED_glUniform3i - typedef void (APIENTRYP GLEEPFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); - GLEE_EXTERN GLEEPFNGLUNIFORM3IPROC GLeeFuncPtr_glUniform3i; - #define glUniform3i GLeeFuncPtr_glUniform3i -#endif -#ifndef GLEE_H_DEFINED_glUniform4i -#define GLEE_H_DEFINED_glUniform4i - typedef void (APIENTRYP GLEEPFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GLEE_EXTERN GLEEPFNGLUNIFORM4IPROC GLeeFuncPtr_glUniform4i; - #define glUniform4i GLeeFuncPtr_glUniform4i -#endif -#ifndef GLEE_H_DEFINED_glUniform1fv -#define GLEE_H_DEFINED_glUniform1fv - typedef void (APIENTRYP GLEEPFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM1FVPROC GLeeFuncPtr_glUniform1fv; - #define glUniform1fv GLeeFuncPtr_glUniform1fv -#endif -#ifndef GLEE_H_DEFINED_glUniform2fv -#define GLEE_H_DEFINED_glUniform2fv - typedef void (APIENTRYP GLEEPFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM2FVPROC GLeeFuncPtr_glUniform2fv; - #define glUniform2fv GLeeFuncPtr_glUniform2fv -#endif -#ifndef GLEE_H_DEFINED_glUniform3fv -#define GLEE_H_DEFINED_glUniform3fv - typedef void (APIENTRYP GLEEPFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM3FVPROC GLeeFuncPtr_glUniform3fv; - #define glUniform3fv GLeeFuncPtr_glUniform3fv -#endif -#ifndef GLEE_H_DEFINED_glUniform4fv -#define GLEE_H_DEFINED_glUniform4fv - typedef void (APIENTRYP GLEEPFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM4FVPROC GLeeFuncPtr_glUniform4fv; - #define glUniform4fv GLeeFuncPtr_glUniform4fv -#endif -#ifndef GLEE_H_DEFINED_glUniform1iv -#define GLEE_H_DEFINED_glUniform1iv - typedef void (APIENTRYP GLEEPFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM1IVPROC GLeeFuncPtr_glUniform1iv; - #define glUniform1iv GLeeFuncPtr_glUniform1iv -#endif -#ifndef GLEE_H_DEFINED_glUniform2iv -#define GLEE_H_DEFINED_glUniform2iv - typedef void (APIENTRYP GLEEPFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM2IVPROC GLeeFuncPtr_glUniform2iv; - #define glUniform2iv GLeeFuncPtr_glUniform2iv -#endif -#ifndef GLEE_H_DEFINED_glUniform3iv -#define GLEE_H_DEFINED_glUniform3iv - typedef void (APIENTRYP GLEEPFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM3IVPROC GLeeFuncPtr_glUniform3iv; - #define glUniform3iv GLeeFuncPtr_glUniform3iv -#endif -#ifndef GLEE_H_DEFINED_glUniform4iv -#define GLEE_H_DEFINED_glUniform4iv - typedef void (APIENTRYP GLEEPFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM4IVPROC GLeeFuncPtr_glUniform4iv; - #define glUniform4iv GLeeFuncPtr_glUniform4iv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix2fv -#define GLEE_H_DEFINED_glUniformMatrix2fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2FVPROC GLeeFuncPtr_glUniformMatrix2fv; - #define glUniformMatrix2fv GLeeFuncPtr_glUniformMatrix2fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix3fv -#define GLEE_H_DEFINED_glUniformMatrix3fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3FVPROC GLeeFuncPtr_glUniformMatrix3fv; - #define glUniformMatrix3fv GLeeFuncPtr_glUniformMatrix3fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix4fv -#define GLEE_H_DEFINED_glUniformMatrix4fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4FVPROC GLeeFuncPtr_glUniformMatrix4fv; - #define glUniformMatrix4fv GLeeFuncPtr_glUniformMatrix4fv -#endif -#ifndef GLEE_H_DEFINED_glValidateProgram -#define GLEE_H_DEFINED_glValidateProgram - typedef void (APIENTRYP GLEEPFNGLVALIDATEPROGRAMPROC) (GLuint program); - GLEE_EXTERN GLEEPFNGLVALIDATEPROGRAMPROC GLeeFuncPtr_glValidateProgram; - #define glValidateProgram GLeeFuncPtr_glValidateProgram -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1d -#define GLEE_H_DEFINED_glVertexAttrib1d - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DPROC GLeeFuncPtr_glVertexAttrib1d; - #define glVertexAttrib1d GLeeFuncPtr_glVertexAttrib1d -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1dv -#define GLEE_H_DEFINED_glVertexAttrib1dv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVPROC GLeeFuncPtr_glVertexAttrib1dv; - #define glVertexAttrib1dv GLeeFuncPtr_glVertexAttrib1dv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1f -#define GLEE_H_DEFINED_glVertexAttrib1f - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FPROC GLeeFuncPtr_glVertexAttrib1f; - #define glVertexAttrib1f GLeeFuncPtr_glVertexAttrib1f -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1fv -#define GLEE_H_DEFINED_glVertexAttrib1fv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVPROC GLeeFuncPtr_glVertexAttrib1fv; - #define glVertexAttrib1fv GLeeFuncPtr_glVertexAttrib1fv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1s -#define GLEE_H_DEFINED_glVertexAttrib1s - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SPROC GLeeFuncPtr_glVertexAttrib1s; - #define glVertexAttrib1s GLeeFuncPtr_glVertexAttrib1s -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1sv -#define GLEE_H_DEFINED_glVertexAttrib1sv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVPROC GLeeFuncPtr_glVertexAttrib1sv; - #define glVertexAttrib1sv GLeeFuncPtr_glVertexAttrib1sv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2d -#define GLEE_H_DEFINED_glVertexAttrib2d - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DPROC GLeeFuncPtr_glVertexAttrib2d; - #define glVertexAttrib2d GLeeFuncPtr_glVertexAttrib2d -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2dv -#define GLEE_H_DEFINED_glVertexAttrib2dv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVPROC GLeeFuncPtr_glVertexAttrib2dv; - #define glVertexAttrib2dv GLeeFuncPtr_glVertexAttrib2dv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2f -#define GLEE_H_DEFINED_glVertexAttrib2f - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FPROC GLeeFuncPtr_glVertexAttrib2f; - #define glVertexAttrib2f GLeeFuncPtr_glVertexAttrib2f -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2fv -#define GLEE_H_DEFINED_glVertexAttrib2fv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVPROC GLeeFuncPtr_glVertexAttrib2fv; - #define glVertexAttrib2fv GLeeFuncPtr_glVertexAttrib2fv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2s -#define GLEE_H_DEFINED_glVertexAttrib2s - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SPROC GLeeFuncPtr_glVertexAttrib2s; - #define glVertexAttrib2s GLeeFuncPtr_glVertexAttrib2s -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2sv -#define GLEE_H_DEFINED_glVertexAttrib2sv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVPROC GLeeFuncPtr_glVertexAttrib2sv; - #define glVertexAttrib2sv GLeeFuncPtr_glVertexAttrib2sv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3d -#define GLEE_H_DEFINED_glVertexAttrib3d - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DPROC GLeeFuncPtr_glVertexAttrib3d; - #define glVertexAttrib3d GLeeFuncPtr_glVertexAttrib3d -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3dv -#define GLEE_H_DEFINED_glVertexAttrib3dv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVPROC GLeeFuncPtr_glVertexAttrib3dv; - #define glVertexAttrib3dv GLeeFuncPtr_glVertexAttrib3dv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3f -#define GLEE_H_DEFINED_glVertexAttrib3f - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FPROC GLeeFuncPtr_glVertexAttrib3f; - #define glVertexAttrib3f GLeeFuncPtr_glVertexAttrib3f -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3fv -#define GLEE_H_DEFINED_glVertexAttrib3fv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVPROC GLeeFuncPtr_glVertexAttrib3fv; - #define glVertexAttrib3fv GLeeFuncPtr_glVertexAttrib3fv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3s -#define GLEE_H_DEFINED_glVertexAttrib3s - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SPROC GLeeFuncPtr_glVertexAttrib3s; - #define glVertexAttrib3s GLeeFuncPtr_glVertexAttrib3s -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3sv -#define GLEE_H_DEFINED_glVertexAttrib3sv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVPROC GLeeFuncPtr_glVertexAttrib3sv; - #define glVertexAttrib3sv GLeeFuncPtr_glVertexAttrib3sv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Nbv -#define GLEE_H_DEFINED_glVertexAttrib4Nbv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NBVPROC GLeeFuncPtr_glVertexAttrib4Nbv; - #define glVertexAttrib4Nbv GLeeFuncPtr_glVertexAttrib4Nbv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Niv -#define GLEE_H_DEFINED_glVertexAttrib4Niv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NIVPROC GLeeFuncPtr_glVertexAttrib4Niv; - #define glVertexAttrib4Niv GLeeFuncPtr_glVertexAttrib4Niv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Nsv -#define GLEE_H_DEFINED_glVertexAttrib4Nsv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NSVPROC GLeeFuncPtr_glVertexAttrib4Nsv; - #define glVertexAttrib4Nsv GLeeFuncPtr_glVertexAttrib4Nsv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Nub -#define GLEE_H_DEFINED_glVertexAttrib4Nub - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBPROC GLeeFuncPtr_glVertexAttrib4Nub; - #define glVertexAttrib4Nub GLeeFuncPtr_glVertexAttrib4Nub -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Nubv -#define GLEE_H_DEFINED_glVertexAttrib4Nubv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBVPROC GLeeFuncPtr_glVertexAttrib4Nubv; - #define glVertexAttrib4Nubv GLeeFuncPtr_glVertexAttrib4Nubv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Nuiv -#define GLEE_H_DEFINED_glVertexAttrib4Nuiv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUIVPROC GLeeFuncPtr_glVertexAttrib4Nuiv; - #define glVertexAttrib4Nuiv GLeeFuncPtr_glVertexAttrib4Nuiv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4Nusv -#define GLEE_H_DEFINED_glVertexAttrib4Nusv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUSVPROC GLeeFuncPtr_glVertexAttrib4Nusv; - #define glVertexAttrib4Nusv GLeeFuncPtr_glVertexAttrib4Nusv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4bv -#define GLEE_H_DEFINED_glVertexAttrib4bv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4BVPROC GLeeFuncPtr_glVertexAttrib4bv; - #define glVertexAttrib4bv GLeeFuncPtr_glVertexAttrib4bv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4d -#define GLEE_H_DEFINED_glVertexAttrib4d - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DPROC GLeeFuncPtr_glVertexAttrib4d; - #define glVertexAttrib4d GLeeFuncPtr_glVertexAttrib4d -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4dv -#define GLEE_H_DEFINED_glVertexAttrib4dv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVPROC GLeeFuncPtr_glVertexAttrib4dv; - #define glVertexAttrib4dv GLeeFuncPtr_glVertexAttrib4dv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4f -#define GLEE_H_DEFINED_glVertexAttrib4f - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FPROC GLeeFuncPtr_glVertexAttrib4f; - #define glVertexAttrib4f GLeeFuncPtr_glVertexAttrib4f -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4fv -#define GLEE_H_DEFINED_glVertexAttrib4fv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVPROC GLeeFuncPtr_glVertexAttrib4fv; - #define glVertexAttrib4fv GLeeFuncPtr_glVertexAttrib4fv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4iv -#define GLEE_H_DEFINED_glVertexAttrib4iv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4IVPROC GLeeFuncPtr_glVertexAttrib4iv; - #define glVertexAttrib4iv GLeeFuncPtr_glVertexAttrib4iv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4s -#define GLEE_H_DEFINED_glVertexAttrib4s - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SPROC GLeeFuncPtr_glVertexAttrib4s; - #define glVertexAttrib4s GLeeFuncPtr_glVertexAttrib4s -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4sv -#define GLEE_H_DEFINED_glVertexAttrib4sv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVPROC GLeeFuncPtr_glVertexAttrib4sv; - #define glVertexAttrib4sv GLeeFuncPtr_glVertexAttrib4sv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4ubv -#define GLEE_H_DEFINED_glVertexAttrib4ubv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVPROC GLeeFuncPtr_glVertexAttrib4ubv; - #define glVertexAttrib4ubv GLeeFuncPtr_glVertexAttrib4ubv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4uiv -#define GLEE_H_DEFINED_glVertexAttrib4uiv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UIVPROC GLeeFuncPtr_glVertexAttrib4uiv; - #define glVertexAttrib4uiv GLeeFuncPtr_glVertexAttrib4uiv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4usv -#define GLEE_H_DEFINED_glVertexAttrib4usv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4USVPROC GLeeFuncPtr_glVertexAttrib4usv; - #define glVertexAttrib4usv GLeeFuncPtr_glVertexAttrib4usv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribPointer -#define GLEE_H_DEFINED_glVertexAttribPointer - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERPROC GLeeFuncPtr_glVertexAttribPointer; - #define glVertexAttribPointer GLeeFuncPtr_glVertexAttribPointer -#endif -#endif - -/* GL_VERSION_2_1 */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#define __GLEE_GL_VERSION_2_1 1 -/* Constants */ -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B -#ifndef GLEE_H_DEFINED_glUniformMatrix2x3fv -#define GLEE_H_DEFINED_glUniformMatrix2x3fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2X3FVPROC GLeeFuncPtr_glUniformMatrix2x3fv; - #define glUniformMatrix2x3fv GLeeFuncPtr_glUniformMatrix2x3fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix3x2fv -#define GLEE_H_DEFINED_glUniformMatrix3x2fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3X2FVPROC GLeeFuncPtr_glUniformMatrix3x2fv; - #define glUniformMatrix3x2fv GLeeFuncPtr_glUniformMatrix3x2fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix2x4fv -#define GLEE_H_DEFINED_glUniformMatrix2x4fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2X4FVPROC GLeeFuncPtr_glUniformMatrix2x4fv; - #define glUniformMatrix2x4fv GLeeFuncPtr_glUniformMatrix2x4fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix4x2fv -#define GLEE_H_DEFINED_glUniformMatrix4x2fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4X2FVPROC GLeeFuncPtr_glUniformMatrix4x2fv; - #define glUniformMatrix4x2fv GLeeFuncPtr_glUniformMatrix4x2fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix3x4fv -#define GLEE_H_DEFINED_glUniformMatrix3x4fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3X4FVPROC GLeeFuncPtr_glUniformMatrix3x4fv; - #define glUniformMatrix3x4fv GLeeFuncPtr_glUniformMatrix3x4fv -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix4x3fv -#define GLEE_H_DEFINED_glUniformMatrix4x3fv - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4X3FVPROC GLeeFuncPtr_glUniformMatrix4x3fv; - #define glUniformMatrix4x3fv GLeeFuncPtr_glUniformMatrix4x3fv -#endif -#endif - -/* GL_VERSION_3_0 */ - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -#define __GLEE_GL_VERSION_3_0 1 -/* Constants */ -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB -#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 -#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_DEPTH_BUFFER 0x8223 -#define GL_STENCIL_BUFFER 0x8224 -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_ALPHA_INTEGER 0x8D97 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#ifndef GLEE_H_DEFINED_glColorMaski -#define GLEE_H_DEFINED_glColorMaski - typedef void (APIENTRYP GLEEPFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); - GLEE_EXTERN GLEEPFNGLCOLORMASKIPROC GLeeFuncPtr_glColorMaski; - #define glColorMaski GLeeFuncPtr_glColorMaski -#endif -#ifndef GLEE_H_DEFINED_glGetBooleani_v -#define GLEE_H_DEFINED_glGetBooleani_v - typedef void (APIENTRYP GLEEPFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean * data); - GLEE_EXTERN GLEEPFNGLGETBOOLEANI_VPROC GLeeFuncPtr_glGetBooleani_v; - #define glGetBooleani_v GLeeFuncPtr_glGetBooleani_v -#endif -#ifndef GLEE_H_DEFINED_glGetIntegeri_v -#define GLEE_H_DEFINED_glGetIntegeri_v - typedef void (APIENTRYP GLEEPFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint * data); - GLEE_EXTERN GLEEPFNGLGETINTEGERI_VPROC GLeeFuncPtr_glGetIntegeri_v; - #define glGetIntegeri_v GLeeFuncPtr_glGetIntegeri_v -#endif -#ifndef GLEE_H_DEFINED_glEnablei -#define GLEE_H_DEFINED_glEnablei - typedef void (APIENTRYP GLEEPFNGLENABLEIPROC) (GLenum target, GLuint index); - GLEE_EXTERN GLEEPFNGLENABLEIPROC GLeeFuncPtr_glEnablei; - #define glEnablei GLeeFuncPtr_glEnablei -#endif -#ifndef GLEE_H_DEFINED_glDisablei -#define GLEE_H_DEFINED_glDisablei - typedef void (APIENTRYP GLEEPFNGLDISABLEIPROC) (GLenum target, GLuint index); - GLEE_EXTERN GLEEPFNGLDISABLEIPROC GLeeFuncPtr_glDisablei; - #define glDisablei GLeeFuncPtr_glDisablei -#endif -#ifndef GLEE_H_DEFINED_glIsEnabledi -#define GLEE_H_DEFINED_glIsEnabledi - typedef GLboolean (APIENTRYP GLEEPFNGLISENABLEDIPROC) (GLenum target, GLuint index); - GLEE_EXTERN GLEEPFNGLISENABLEDIPROC GLeeFuncPtr_glIsEnabledi; - #define glIsEnabledi GLeeFuncPtr_glIsEnabledi -#endif -#ifndef GLEE_H_DEFINED_glBeginTransformFeedback -#define GLEE_H_DEFINED_glBeginTransformFeedback - typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); - GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC GLeeFuncPtr_glBeginTransformFeedback; - #define glBeginTransformFeedback GLeeFuncPtr_glBeginTransformFeedback -#endif -#ifndef GLEE_H_DEFINED_glEndTransformFeedback -#define GLEE_H_DEFINED_glEndTransformFeedback - typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKPROC) (); - GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKPROC GLeeFuncPtr_glEndTransformFeedback; - #define glEndTransformFeedback GLeeFuncPtr_glEndTransformFeedback -#endif -#ifndef GLEE_H_DEFINED_glBindBufferRange -#define GLEE_H_DEFINED_glBindBufferRange - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); - GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGEPROC GLeeFuncPtr_glBindBufferRange; - #define glBindBufferRange GLeeFuncPtr_glBindBufferRange -#endif -#ifndef GLEE_H_DEFINED_glBindBufferBase -#define GLEE_H_DEFINED_glBindBufferBase - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); - GLEE_EXTERN GLEEPFNGLBINDBUFFERBASEPROC GLeeFuncPtr_glBindBufferBase; - #define glBindBufferBase GLeeFuncPtr_glBindBufferBase -#endif -#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryings -#define GLEE_H_DEFINED_glTransformFeedbackVaryings - typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); - GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC GLeeFuncPtr_glTransformFeedbackVaryings; - #define glTransformFeedbackVaryings GLeeFuncPtr_glTransformFeedbackVaryings -#endif -#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVarying -#define GLEE_H_DEFINED_glGetTransformFeedbackVarying - typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLint * location); - GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC GLeeFuncPtr_glGetTransformFeedbackVarying; - #define glGetTransformFeedbackVarying GLeeFuncPtr_glGetTransformFeedbackVarying -#endif -#ifndef GLEE_H_DEFINED_glClampColor -#define GLEE_H_DEFINED_glClampColor - typedef void (APIENTRYP GLEEPFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); - GLEE_EXTERN GLEEPFNGLCLAMPCOLORPROC GLeeFuncPtr_glClampColor; - #define glClampColor GLeeFuncPtr_glClampColor -#endif -#ifndef GLEE_H_DEFINED_glBeginConditionalRender -#define GLEE_H_DEFINED_glBeginConditionalRender - typedef void (APIENTRYP GLEEPFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); - GLEE_EXTERN GLEEPFNGLBEGINCONDITIONALRENDERPROC GLeeFuncPtr_glBeginConditionalRender; - #define glBeginConditionalRender GLeeFuncPtr_glBeginConditionalRender -#endif -#ifndef GLEE_H_DEFINED_glEndConditionalRender -#define GLEE_H_DEFINED_glEndConditionalRender - typedef void (APIENTRYP GLEEPFNGLENDCONDITIONALRENDERPROC) (); - GLEE_EXTERN GLEEPFNGLENDCONDITIONALRENDERPROC GLeeFuncPtr_glEndConditionalRender; - #define glEndConditionalRender GLeeFuncPtr_glEndConditionalRender -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1i -#define GLEE_H_DEFINED_glVertexAttribI1i - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IPROC GLeeFuncPtr_glVertexAttribI1i; - #define glVertexAttribI1i GLeeFuncPtr_glVertexAttribI1i -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2i -#define GLEE_H_DEFINED_glVertexAttribI2i - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IPROC GLeeFuncPtr_glVertexAttribI2i; - #define glVertexAttribI2i GLeeFuncPtr_glVertexAttribI2i -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3i -#define GLEE_H_DEFINED_glVertexAttribI3i - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IPROC GLeeFuncPtr_glVertexAttribI3i; - #define glVertexAttribI3i GLeeFuncPtr_glVertexAttribI3i -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4i -#define GLEE_H_DEFINED_glVertexAttribI4i - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IPROC GLeeFuncPtr_glVertexAttribI4i; - #define glVertexAttribI4i GLeeFuncPtr_glVertexAttribI4i -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1ui -#define GLEE_H_DEFINED_glVertexAttribI1ui - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIPROC GLeeFuncPtr_glVertexAttribI1ui; - #define glVertexAttribI1ui GLeeFuncPtr_glVertexAttribI1ui -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2ui -#define GLEE_H_DEFINED_glVertexAttribI2ui - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIPROC GLeeFuncPtr_glVertexAttribI2ui; - #define glVertexAttribI2ui GLeeFuncPtr_glVertexAttribI2ui -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3ui -#define GLEE_H_DEFINED_glVertexAttribI3ui - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIPROC GLeeFuncPtr_glVertexAttribI3ui; - #define glVertexAttribI3ui GLeeFuncPtr_glVertexAttribI3ui -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4ui -#define GLEE_H_DEFINED_glVertexAttribI4ui - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIPROC GLeeFuncPtr_glVertexAttribI4ui; - #define glVertexAttribI4ui GLeeFuncPtr_glVertexAttribI4ui -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1iv -#define GLEE_H_DEFINED_glVertexAttribI1iv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IVPROC GLeeFuncPtr_glVertexAttribI1iv; - #define glVertexAttribI1iv GLeeFuncPtr_glVertexAttribI1iv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2iv -#define GLEE_H_DEFINED_glVertexAttribI2iv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IVPROC GLeeFuncPtr_glVertexAttribI2iv; - #define glVertexAttribI2iv GLeeFuncPtr_glVertexAttribI2iv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3iv -#define GLEE_H_DEFINED_glVertexAttribI3iv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IVPROC GLeeFuncPtr_glVertexAttribI3iv; - #define glVertexAttribI3iv GLeeFuncPtr_glVertexAttribI3iv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4iv -#define GLEE_H_DEFINED_glVertexAttribI4iv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IVPROC GLeeFuncPtr_glVertexAttribI4iv; - #define glVertexAttribI4iv GLeeFuncPtr_glVertexAttribI4iv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1uiv -#define GLEE_H_DEFINED_glVertexAttribI1uiv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIVPROC GLeeFuncPtr_glVertexAttribI1uiv; - #define glVertexAttribI1uiv GLeeFuncPtr_glVertexAttribI1uiv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2uiv -#define GLEE_H_DEFINED_glVertexAttribI2uiv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIVPROC GLeeFuncPtr_glVertexAttribI2uiv; - #define glVertexAttribI2uiv GLeeFuncPtr_glVertexAttribI2uiv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3uiv -#define GLEE_H_DEFINED_glVertexAttribI3uiv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIVPROC GLeeFuncPtr_glVertexAttribI3uiv; - #define glVertexAttribI3uiv GLeeFuncPtr_glVertexAttribI3uiv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4uiv -#define GLEE_H_DEFINED_glVertexAttribI4uiv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIVPROC GLeeFuncPtr_glVertexAttribI4uiv; - #define glVertexAttribI4uiv GLeeFuncPtr_glVertexAttribI4uiv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4bv -#define GLEE_H_DEFINED_glVertexAttribI4bv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4BVPROC GLeeFuncPtr_glVertexAttribI4bv; - #define glVertexAttribI4bv GLeeFuncPtr_glVertexAttribI4bv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4sv -#define GLEE_H_DEFINED_glVertexAttribI4sv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4SVPROC GLeeFuncPtr_glVertexAttribI4sv; - #define glVertexAttribI4sv GLeeFuncPtr_glVertexAttribI4sv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4ubv -#define GLEE_H_DEFINED_glVertexAttribI4ubv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UBVPROC GLeeFuncPtr_glVertexAttribI4ubv; - #define glVertexAttribI4ubv GLeeFuncPtr_glVertexAttribI4ubv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4usv -#define GLEE_H_DEFINED_glVertexAttribI4usv - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4USVPROC GLeeFuncPtr_glVertexAttribI4usv; - #define glVertexAttribI4usv GLeeFuncPtr_glVertexAttribI4usv -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribIPointer -#define GLEE_H_DEFINED_glVertexAttribIPointer - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBIPOINTERPROC GLeeFuncPtr_glVertexAttribIPointer; - #define glVertexAttribIPointer GLeeFuncPtr_glVertexAttribIPointer -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribIiv -#define GLEE_H_DEFINED_glGetVertexAttribIiv - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIIVPROC GLeeFuncPtr_glGetVertexAttribIiv; - #define glGetVertexAttribIiv GLeeFuncPtr_glGetVertexAttribIiv -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribIuiv -#define GLEE_H_DEFINED_glGetVertexAttribIuiv - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIUIVPROC GLeeFuncPtr_glGetVertexAttribIuiv; - #define glGetVertexAttribIuiv GLeeFuncPtr_glGetVertexAttribIuiv -#endif -#ifndef GLEE_H_DEFINED_glGetUniformuiv -#define GLEE_H_DEFINED_glGetUniformuiv - typedef void (APIENTRYP GLEEPFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETUNIFORMUIVPROC GLeeFuncPtr_glGetUniformuiv; - #define glGetUniformuiv GLeeFuncPtr_glGetUniformuiv -#endif -#ifndef GLEE_H_DEFINED_glBindFragDataLocation -#define GLEE_H_DEFINED_glBindFragDataLocation - typedef void (APIENTRYP GLEEPFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar * name); - GLEE_EXTERN GLEEPFNGLBINDFRAGDATALOCATIONPROC GLeeFuncPtr_glBindFragDataLocation; - #define glBindFragDataLocation GLeeFuncPtr_glBindFragDataLocation -#endif -#ifndef GLEE_H_DEFINED_glGetFragDataLocation -#define GLEE_H_DEFINED_glGetFragDataLocation - typedef GLint (APIENTRYP GLEEPFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar * name); - GLEE_EXTERN GLEEPFNGLGETFRAGDATALOCATIONPROC GLeeFuncPtr_glGetFragDataLocation; - #define glGetFragDataLocation GLeeFuncPtr_glGetFragDataLocation -#endif -#ifndef GLEE_H_DEFINED_glUniform1ui -#define GLEE_H_DEFINED_glUniform1ui - typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); - GLEE_EXTERN GLEEPFNGLUNIFORM1UIPROC GLeeFuncPtr_glUniform1ui; - #define glUniform1ui GLeeFuncPtr_glUniform1ui -#endif -#ifndef GLEE_H_DEFINED_glUniform2ui -#define GLEE_H_DEFINED_glUniform2ui - typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); - GLEE_EXTERN GLEEPFNGLUNIFORM2UIPROC GLeeFuncPtr_glUniform2ui; - #define glUniform2ui GLeeFuncPtr_glUniform2ui -#endif -#ifndef GLEE_H_DEFINED_glUniform3ui -#define GLEE_H_DEFINED_glUniform3ui - typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); - GLEE_EXTERN GLEEPFNGLUNIFORM3UIPROC GLeeFuncPtr_glUniform3ui; - #define glUniform3ui GLeeFuncPtr_glUniform3ui -#endif -#ifndef GLEE_H_DEFINED_glUniform4ui -#define GLEE_H_DEFINED_glUniform4ui - typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - GLEE_EXTERN GLEEPFNGLUNIFORM4UIPROC GLeeFuncPtr_glUniform4ui; - #define glUniform4ui GLeeFuncPtr_glUniform4ui -#endif -#ifndef GLEE_H_DEFINED_glUniform1uiv -#define GLEE_H_DEFINED_glUniform1uiv - typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM1UIVPROC GLeeFuncPtr_glUniform1uiv; - #define glUniform1uiv GLeeFuncPtr_glUniform1uiv -#endif -#ifndef GLEE_H_DEFINED_glUniform2uiv -#define GLEE_H_DEFINED_glUniform2uiv - typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM2UIVPROC GLeeFuncPtr_glUniform2uiv; - #define glUniform2uiv GLeeFuncPtr_glUniform2uiv -#endif -#ifndef GLEE_H_DEFINED_glUniform3uiv -#define GLEE_H_DEFINED_glUniform3uiv - typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM3UIVPROC GLeeFuncPtr_glUniform3uiv; - #define glUniform3uiv GLeeFuncPtr_glUniform3uiv -#endif -#ifndef GLEE_H_DEFINED_glUniform4uiv -#define GLEE_H_DEFINED_glUniform4uiv - typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM4UIVPROC GLeeFuncPtr_glUniform4uiv; - #define glUniform4uiv GLeeFuncPtr_glUniform4uiv -#endif -#ifndef GLEE_H_DEFINED_glTexParameterIiv -#define GLEE_H_DEFINED_glTexParameterIiv - typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLTEXPARAMETERIIVPROC GLeeFuncPtr_glTexParameterIiv; - #define glTexParameterIiv GLeeFuncPtr_glTexParameterIiv -#endif -#ifndef GLEE_H_DEFINED_glTexParameterIuiv -#define GLEE_H_DEFINED_glTexParameterIuiv - typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint * params); - GLEE_EXTERN GLEEPFNGLTEXPARAMETERIUIVPROC GLeeFuncPtr_glTexParameterIuiv; - #define glTexParameterIuiv GLeeFuncPtr_glTexParameterIuiv -#endif -#ifndef GLEE_H_DEFINED_glGetTexParameterIiv -#define GLEE_H_DEFINED_glGetTexParameterIiv - typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIIVPROC GLeeFuncPtr_glGetTexParameterIiv; - #define glGetTexParameterIiv GLeeFuncPtr_glGetTexParameterIiv -#endif -#ifndef GLEE_H_DEFINED_glGetTexParameterIuiv -#define GLEE_H_DEFINED_glGetTexParameterIuiv - typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIUIVPROC GLeeFuncPtr_glGetTexParameterIuiv; - #define glGetTexParameterIuiv GLeeFuncPtr_glGetTexParameterIuiv -#endif -#ifndef GLEE_H_DEFINED_glClearBufferiv -#define GLEE_H_DEFINED_glClearBufferiv - typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint * value); - GLEE_EXTERN GLEEPFNGLCLEARBUFFERIVPROC GLeeFuncPtr_glClearBufferiv; - #define glClearBufferiv GLeeFuncPtr_glClearBufferiv -#endif -#ifndef GLEE_H_DEFINED_glClearBufferuiv -#define GLEE_H_DEFINED_glClearBufferuiv - typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint * value); - GLEE_EXTERN GLEEPFNGLCLEARBUFFERUIVPROC GLeeFuncPtr_glClearBufferuiv; - #define glClearBufferuiv GLeeFuncPtr_glClearBufferuiv -#endif -#ifndef GLEE_H_DEFINED_glClearBufferfv -#define GLEE_H_DEFINED_glClearBufferfv - typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLCLEARBUFFERFVPROC GLeeFuncPtr_glClearBufferfv; - #define glClearBufferfv GLeeFuncPtr_glClearBufferfv -#endif -#ifndef GLEE_H_DEFINED_glClearBufferfi -#define GLEE_H_DEFINED_glClearBufferfi - typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); - GLEE_EXTERN GLEEPFNGLCLEARBUFFERFIPROC GLeeFuncPtr_glClearBufferfi; - #define glClearBufferfi GLeeFuncPtr_glClearBufferfi -#endif -#ifndef GLEE_H_DEFINED_glGetStringi -#define GLEE_H_DEFINED_glGetStringi - typedef const GLubyte * (APIENTRYP GLEEPFNGLGETSTRINGIPROC) (GLenum name, GLuint index); - GLEE_EXTERN GLEEPFNGLGETSTRINGIPROC GLeeFuncPtr_glGetStringi; - #define glGetStringi GLeeFuncPtr_glGetStringi -#endif -#endif - -/* GL_ARB_multitexture */ - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#define __GLEE_GL_ARB_multitexture 1 -/* Constants */ -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#ifndef GLEE_H_DEFINED_glActiveTextureARB -#define GLEE_H_DEFINED_glActiveTextureARB - typedef void (APIENTRYP GLEEPFNGLACTIVETEXTUREARBPROC) (GLenum texture); - GLEE_EXTERN GLEEPFNGLACTIVETEXTUREARBPROC GLeeFuncPtr_glActiveTextureARB; - #define glActiveTextureARB GLeeFuncPtr_glActiveTextureARB -#endif -#ifndef GLEE_H_DEFINED_glClientActiveTextureARB -#define GLEE_H_DEFINED_glClientActiveTextureARB - typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); - GLEE_EXTERN GLEEPFNGLCLIENTACTIVETEXTUREARBPROC GLeeFuncPtr_glClientActiveTextureARB; - #define glClientActiveTextureARB GLeeFuncPtr_glClientActiveTextureARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1dARB -#define GLEE_H_DEFINED_glMultiTexCoord1dARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DARBPROC GLeeFuncPtr_glMultiTexCoord1dARB; - #define glMultiTexCoord1dARB GLeeFuncPtr_glMultiTexCoord1dARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1dvARB -#define GLEE_H_DEFINED_glMultiTexCoord1dvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DVARBPROC GLeeFuncPtr_glMultiTexCoord1dvARB; - #define glMultiTexCoord1dvARB GLeeFuncPtr_glMultiTexCoord1dvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1fARB -#define GLEE_H_DEFINED_glMultiTexCoord1fARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FARBPROC GLeeFuncPtr_glMultiTexCoord1fARB; - #define glMultiTexCoord1fARB GLeeFuncPtr_glMultiTexCoord1fARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1fvARB -#define GLEE_H_DEFINED_glMultiTexCoord1fvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FVARBPROC GLeeFuncPtr_glMultiTexCoord1fvARB; - #define glMultiTexCoord1fvARB GLeeFuncPtr_glMultiTexCoord1fvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1iARB -#define GLEE_H_DEFINED_glMultiTexCoord1iARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IARBPROC GLeeFuncPtr_glMultiTexCoord1iARB; - #define glMultiTexCoord1iARB GLeeFuncPtr_glMultiTexCoord1iARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1ivARB -#define GLEE_H_DEFINED_glMultiTexCoord1ivARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IVARBPROC GLeeFuncPtr_glMultiTexCoord1ivARB; - #define glMultiTexCoord1ivARB GLeeFuncPtr_glMultiTexCoord1ivARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1sARB -#define GLEE_H_DEFINED_glMultiTexCoord1sARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SARBPROC GLeeFuncPtr_glMultiTexCoord1sARB; - #define glMultiTexCoord1sARB GLeeFuncPtr_glMultiTexCoord1sARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1svARB -#define GLEE_H_DEFINED_glMultiTexCoord1svARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SVARBPROC GLeeFuncPtr_glMultiTexCoord1svARB; - #define glMultiTexCoord1svARB GLeeFuncPtr_glMultiTexCoord1svARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2dARB -#define GLEE_H_DEFINED_glMultiTexCoord2dARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DARBPROC GLeeFuncPtr_glMultiTexCoord2dARB; - #define glMultiTexCoord2dARB GLeeFuncPtr_glMultiTexCoord2dARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2dvARB -#define GLEE_H_DEFINED_glMultiTexCoord2dvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DVARBPROC GLeeFuncPtr_glMultiTexCoord2dvARB; - #define glMultiTexCoord2dvARB GLeeFuncPtr_glMultiTexCoord2dvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2fARB -#define GLEE_H_DEFINED_glMultiTexCoord2fARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FARBPROC GLeeFuncPtr_glMultiTexCoord2fARB; - #define glMultiTexCoord2fARB GLeeFuncPtr_glMultiTexCoord2fARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2fvARB -#define GLEE_H_DEFINED_glMultiTexCoord2fvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FVARBPROC GLeeFuncPtr_glMultiTexCoord2fvARB; - #define glMultiTexCoord2fvARB GLeeFuncPtr_glMultiTexCoord2fvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2iARB -#define GLEE_H_DEFINED_glMultiTexCoord2iARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IARBPROC GLeeFuncPtr_glMultiTexCoord2iARB; - #define glMultiTexCoord2iARB GLeeFuncPtr_glMultiTexCoord2iARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2ivARB -#define GLEE_H_DEFINED_glMultiTexCoord2ivARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IVARBPROC GLeeFuncPtr_glMultiTexCoord2ivARB; - #define glMultiTexCoord2ivARB GLeeFuncPtr_glMultiTexCoord2ivARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2sARB -#define GLEE_H_DEFINED_glMultiTexCoord2sARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SARBPROC GLeeFuncPtr_glMultiTexCoord2sARB; - #define glMultiTexCoord2sARB GLeeFuncPtr_glMultiTexCoord2sARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2svARB -#define GLEE_H_DEFINED_glMultiTexCoord2svARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SVARBPROC GLeeFuncPtr_glMultiTexCoord2svARB; - #define glMultiTexCoord2svARB GLeeFuncPtr_glMultiTexCoord2svARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3dARB -#define GLEE_H_DEFINED_glMultiTexCoord3dARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DARBPROC GLeeFuncPtr_glMultiTexCoord3dARB; - #define glMultiTexCoord3dARB GLeeFuncPtr_glMultiTexCoord3dARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3dvARB -#define GLEE_H_DEFINED_glMultiTexCoord3dvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DVARBPROC GLeeFuncPtr_glMultiTexCoord3dvARB; - #define glMultiTexCoord3dvARB GLeeFuncPtr_glMultiTexCoord3dvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3fARB -#define GLEE_H_DEFINED_glMultiTexCoord3fARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FARBPROC GLeeFuncPtr_glMultiTexCoord3fARB; - #define glMultiTexCoord3fARB GLeeFuncPtr_glMultiTexCoord3fARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3fvARB -#define GLEE_H_DEFINED_glMultiTexCoord3fvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FVARBPROC GLeeFuncPtr_glMultiTexCoord3fvARB; - #define glMultiTexCoord3fvARB GLeeFuncPtr_glMultiTexCoord3fvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3iARB -#define GLEE_H_DEFINED_glMultiTexCoord3iARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IARBPROC GLeeFuncPtr_glMultiTexCoord3iARB; - #define glMultiTexCoord3iARB GLeeFuncPtr_glMultiTexCoord3iARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3ivARB -#define GLEE_H_DEFINED_glMultiTexCoord3ivARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IVARBPROC GLeeFuncPtr_glMultiTexCoord3ivARB; - #define glMultiTexCoord3ivARB GLeeFuncPtr_glMultiTexCoord3ivARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3sARB -#define GLEE_H_DEFINED_glMultiTexCoord3sARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SARBPROC GLeeFuncPtr_glMultiTexCoord3sARB; - #define glMultiTexCoord3sARB GLeeFuncPtr_glMultiTexCoord3sARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3svARB -#define GLEE_H_DEFINED_glMultiTexCoord3svARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SVARBPROC GLeeFuncPtr_glMultiTexCoord3svARB; - #define glMultiTexCoord3svARB GLeeFuncPtr_glMultiTexCoord3svARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4dARB -#define GLEE_H_DEFINED_glMultiTexCoord4dARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DARBPROC GLeeFuncPtr_glMultiTexCoord4dARB; - #define glMultiTexCoord4dARB GLeeFuncPtr_glMultiTexCoord4dARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4dvARB -#define GLEE_H_DEFINED_glMultiTexCoord4dvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DVARBPROC GLeeFuncPtr_glMultiTexCoord4dvARB; - #define glMultiTexCoord4dvARB GLeeFuncPtr_glMultiTexCoord4dvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4fARB -#define GLEE_H_DEFINED_glMultiTexCoord4fARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FARBPROC GLeeFuncPtr_glMultiTexCoord4fARB; - #define glMultiTexCoord4fARB GLeeFuncPtr_glMultiTexCoord4fARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4fvARB -#define GLEE_H_DEFINED_glMultiTexCoord4fvARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FVARBPROC GLeeFuncPtr_glMultiTexCoord4fvARB; - #define glMultiTexCoord4fvARB GLeeFuncPtr_glMultiTexCoord4fvARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4iARB -#define GLEE_H_DEFINED_glMultiTexCoord4iARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IARBPROC GLeeFuncPtr_glMultiTexCoord4iARB; - #define glMultiTexCoord4iARB GLeeFuncPtr_glMultiTexCoord4iARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4ivARB -#define GLEE_H_DEFINED_glMultiTexCoord4ivARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IVARBPROC GLeeFuncPtr_glMultiTexCoord4ivARB; - #define glMultiTexCoord4ivARB GLeeFuncPtr_glMultiTexCoord4ivARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4sARB -#define GLEE_H_DEFINED_glMultiTexCoord4sARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SARBPROC GLeeFuncPtr_glMultiTexCoord4sARB; - #define glMultiTexCoord4sARB GLeeFuncPtr_glMultiTexCoord4sARB -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4svARB -#define GLEE_H_DEFINED_glMultiTexCoord4svARB - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SVARBPROC GLeeFuncPtr_glMultiTexCoord4svARB; - #define glMultiTexCoord4svARB GLeeFuncPtr_glMultiTexCoord4svARB -#endif -#endif - -/* GL_ARB_transpose_matrix */ - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#define __GLEE_GL_ARB_transpose_matrix 1 -/* Constants */ -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixfARB -#define GLEE_H_DEFINED_glLoadTransposeMatrixfARB - typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat * m); - GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glLoadTransposeMatrixfARB; - #define glLoadTransposeMatrixfARB GLeeFuncPtr_glLoadTransposeMatrixfARB -#endif -#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixdARB -#define GLEE_H_DEFINED_glLoadTransposeMatrixdARB - typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble * m); - GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glLoadTransposeMatrixdARB; - #define glLoadTransposeMatrixdARB GLeeFuncPtr_glLoadTransposeMatrixdARB -#endif -#ifndef GLEE_H_DEFINED_glMultTransposeMatrixfARB -#define GLEE_H_DEFINED_glMultTransposeMatrixfARB - typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat * m); - GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glMultTransposeMatrixfARB; - #define glMultTransposeMatrixfARB GLeeFuncPtr_glMultTransposeMatrixfARB -#endif -#ifndef GLEE_H_DEFINED_glMultTransposeMatrixdARB -#define GLEE_H_DEFINED_glMultTransposeMatrixdARB - typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble * m); - GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glMultTransposeMatrixdARB; - #define glMultTransposeMatrixdARB GLeeFuncPtr_glMultTransposeMatrixdARB -#endif -#endif - -/* GL_ARB_multisample */ - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#define __GLEE_GL_ARB_multisample 1 -/* Constants */ -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#ifndef GLEE_H_DEFINED_glSampleCoverageARB -#define GLEE_H_DEFINED_glSampleCoverageARB - typedef void (APIENTRYP GLEEPFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); - GLEE_EXTERN GLEEPFNGLSAMPLECOVERAGEARBPROC GLeeFuncPtr_glSampleCoverageARB; - #define glSampleCoverageARB GLeeFuncPtr_glSampleCoverageARB -#endif -#endif - -/* GL_ARB_texture_env_add */ - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#define __GLEE_GL_ARB_texture_env_add 1 -/* Constants */ -#endif - -/* GL_ARB_texture_cube_map */ - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#define __GLEE_GL_ARB_texture_cube_map 1 -/* Constants */ -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -/* GL_ARB_texture_compression */ - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#define __GLEE_GL_ARB_texture_compression 1 -/* Constants */ -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#ifndef GLEE_H_DEFINED_glCompressedTexImage3DARB -#define GLEE_H_DEFINED_glCompressedTexImage3DARB - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexImage3DARB; - #define glCompressedTexImage3DARB GLeeFuncPtr_glCompressedTexImage3DARB -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexImage2DARB -#define GLEE_H_DEFINED_glCompressedTexImage2DARB - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexImage2DARB; - #define glCompressedTexImage2DARB GLeeFuncPtr_glCompressedTexImage2DARB -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexImage1DARB -#define GLEE_H_DEFINED_glCompressedTexImage1DARB - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexImage1DARB; - #define glCompressedTexImage1DARB GLeeFuncPtr_glCompressedTexImage1DARB -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexSubImage3DARB -#define GLEE_H_DEFINED_glCompressedTexSubImage3DARB - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexSubImage3DARB; - #define glCompressedTexSubImage3DARB GLeeFuncPtr_glCompressedTexSubImage3DARB -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexSubImage2DARB -#define GLEE_H_DEFINED_glCompressedTexSubImage2DARB - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexSubImage2DARB; - #define glCompressedTexSubImage2DARB GLeeFuncPtr_glCompressedTexSubImage2DARB -#endif -#ifndef GLEE_H_DEFINED_glCompressedTexSubImage1DARB -#define GLEE_H_DEFINED_glCompressedTexSubImage1DARB - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexSubImage1DARB; - #define glCompressedTexSubImage1DARB GLeeFuncPtr_glCompressedTexSubImage1DARB -#endif -#ifndef GLEE_H_DEFINED_glGetCompressedTexImageARB -#define GLEE_H_DEFINED_glGetCompressedTexImageARB - typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid * img); - GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLeeFuncPtr_glGetCompressedTexImageARB; - #define glGetCompressedTexImageARB GLeeFuncPtr_glGetCompressedTexImageARB -#endif -#endif - -/* GL_ARB_texture_border_clamp */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#define __GLEE_GL_ARB_texture_border_clamp 1 -/* Constants */ -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif - -/* GL_ARB_point_parameters */ - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#define __GLEE_GL_ARB_point_parameters 1 -/* Constants */ -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#ifndef GLEE_H_DEFINED_glPointParameterfARB -#define GLEE_H_DEFINED_glPointParameterfARB - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFARBPROC GLeeFuncPtr_glPointParameterfARB; - #define glPointParameterfARB GLeeFuncPtr_glPointParameterfARB -#endif -#ifndef GLEE_H_DEFINED_glPointParameterfvARB -#define GLEE_H_DEFINED_glPointParameterfvARB - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVARBPROC GLeeFuncPtr_glPointParameterfvARB; - #define glPointParameterfvARB GLeeFuncPtr_glPointParameterfvARB -#endif -#endif - -/* GL_ARB_vertex_blend */ - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#define __GLEE_GL_ARB_vertex_blend 1 -/* Constants */ -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#ifndef GLEE_H_DEFINED_glWeightbvARB -#define GLEE_H_DEFINED_glWeightbvARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTBVARBPROC GLeeFuncPtr_glWeightbvARB; - #define glWeightbvARB GLeeFuncPtr_glWeightbvARB -#endif -#ifndef GLEE_H_DEFINED_glWeightsvARB -#define GLEE_H_DEFINED_glWeightsvARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTSVARBPROC) (GLint size, const GLshort * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTSVARBPROC GLeeFuncPtr_glWeightsvARB; - #define glWeightsvARB GLeeFuncPtr_glWeightsvARB -#endif -#ifndef GLEE_H_DEFINED_glWeightivARB -#define GLEE_H_DEFINED_glWeightivARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTIVARBPROC) (GLint size, const GLint * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTIVARBPROC GLeeFuncPtr_glWeightivARB; - #define glWeightivARB GLeeFuncPtr_glWeightivARB -#endif -#ifndef GLEE_H_DEFINED_glWeightfvARB -#define GLEE_H_DEFINED_glWeightfvARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTFVARBPROC GLeeFuncPtr_glWeightfvARB; - #define glWeightfvARB GLeeFuncPtr_glWeightfvARB -#endif -#ifndef GLEE_H_DEFINED_glWeightdvARB -#define GLEE_H_DEFINED_glWeightdvARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTDVARBPROC GLeeFuncPtr_glWeightdvARB; - #define glWeightdvARB GLeeFuncPtr_glWeightdvARB -#endif -#ifndef GLEE_H_DEFINED_glWeightubvARB -#define GLEE_H_DEFINED_glWeightubvARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTUBVARBPROC GLeeFuncPtr_glWeightubvARB; - #define glWeightubvARB GLeeFuncPtr_glWeightubvARB -#endif -#ifndef GLEE_H_DEFINED_glWeightusvARB -#define GLEE_H_DEFINED_glWeightusvARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTUSVARBPROC GLeeFuncPtr_glWeightusvARB; - #define glWeightusvARB GLeeFuncPtr_glWeightusvARB -#endif -#ifndef GLEE_H_DEFINED_glWeightuivARB -#define GLEE_H_DEFINED_glWeightuivARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint * weights); - GLEE_EXTERN GLEEPFNGLWEIGHTUIVARBPROC GLeeFuncPtr_glWeightuivARB; - #define glWeightuivARB GLeeFuncPtr_glWeightuivARB -#endif -#ifndef GLEE_H_DEFINED_glWeightPointerARB -#define GLEE_H_DEFINED_glWeightPointerARB - typedef void (APIENTRYP GLEEPFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLWEIGHTPOINTERARBPROC GLeeFuncPtr_glWeightPointerARB; - #define glWeightPointerARB GLeeFuncPtr_glWeightPointerARB -#endif -#ifndef GLEE_H_DEFINED_glVertexBlendARB -#define GLEE_H_DEFINED_glVertexBlendARB - typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDARBPROC) (GLint count); - GLEE_EXTERN GLEEPFNGLVERTEXBLENDARBPROC GLeeFuncPtr_glVertexBlendARB; - #define glVertexBlendARB GLeeFuncPtr_glVertexBlendARB -#endif -#endif - -/* GL_ARB_matrix_palette */ - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#define __GLEE_GL_ARB_matrix_palette 1 -/* Constants */ -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#ifndef GLEE_H_DEFINED_glCurrentPaletteMatrixARB -#define GLEE_H_DEFINED_glCurrentPaletteMatrixARB - typedef void (APIENTRYP GLEEPFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); - GLEE_EXTERN GLEEPFNGLCURRENTPALETTEMATRIXARBPROC GLeeFuncPtr_glCurrentPaletteMatrixARB; - #define glCurrentPaletteMatrixARB GLeeFuncPtr_glCurrentPaletteMatrixARB -#endif -#ifndef GLEE_H_DEFINED_glMatrixIndexubvARB -#define GLEE_H_DEFINED_glMatrixIndexubvARB - typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte * indices); - GLEE_EXTERN GLEEPFNGLMATRIXINDEXUBVARBPROC GLeeFuncPtr_glMatrixIndexubvARB; - #define glMatrixIndexubvARB GLeeFuncPtr_glMatrixIndexubvARB -#endif -#ifndef GLEE_H_DEFINED_glMatrixIndexusvARB -#define GLEE_H_DEFINED_glMatrixIndexusvARB - typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort * indices); - GLEE_EXTERN GLEEPFNGLMATRIXINDEXUSVARBPROC GLeeFuncPtr_glMatrixIndexusvARB; - #define glMatrixIndexusvARB GLeeFuncPtr_glMatrixIndexusvARB -#endif -#ifndef GLEE_H_DEFINED_glMatrixIndexuivARB -#define GLEE_H_DEFINED_glMatrixIndexuivARB - typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint * indices); - GLEE_EXTERN GLEEPFNGLMATRIXINDEXUIVARBPROC GLeeFuncPtr_glMatrixIndexuivARB; - #define glMatrixIndexuivARB GLeeFuncPtr_glMatrixIndexuivARB -#endif -#ifndef GLEE_H_DEFINED_glMatrixIndexPointerARB -#define GLEE_H_DEFINED_glMatrixIndexPointerARB - typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLMATRIXINDEXPOINTERARBPROC GLeeFuncPtr_glMatrixIndexPointerARB; - #define glMatrixIndexPointerARB GLeeFuncPtr_glMatrixIndexPointerARB -#endif -#endif - -/* GL_ARB_texture_env_combine */ - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#define __GLEE_GL_ARB_texture_env_combine 1 -/* Constants */ -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif - -/* GL_ARB_texture_env_crossbar */ - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#define __GLEE_GL_ARB_texture_env_crossbar 1 -/* Constants */ -#endif - -/* GL_ARB_texture_env_dot3 */ - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#define __GLEE_GL_ARB_texture_env_dot3 1 -/* Constants */ -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif - -/* GL_ARB_texture_mirrored_repeat */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#define __GLEE_GL_ARB_texture_mirrored_repeat 1 -/* Constants */ -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif - -/* GL_ARB_depth_texture */ - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#define __GLEE_GL_ARB_depth_texture 1 -/* Constants */ -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif - -/* GL_ARB_shadow */ - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#define __GLEE_GL_ARB_shadow 1 -/* Constants */ -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif - -/* GL_ARB_shadow_ambient */ - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#define __GLEE_GL_ARB_shadow_ambient 1 -/* Constants */ -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif - -/* GL_ARB_window_pos */ - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#define __GLEE_GL_ARB_window_pos 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glWindowPos2dARB -#define GLEE_H_DEFINED_glWindowPos2dARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2DARBPROC GLeeFuncPtr_glWindowPos2dARB; - #define glWindowPos2dARB GLeeFuncPtr_glWindowPos2dARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2dvARB -#define GLEE_H_DEFINED_glWindowPos2dvARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVARBPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVARBPROC GLeeFuncPtr_glWindowPos2dvARB; - #define glWindowPos2dvARB GLeeFuncPtr_glWindowPos2dvARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2fARB -#define GLEE_H_DEFINED_glWindowPos2fARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2FARBPROC GLeeFuncPtr_glWindowPos2fARB; - #define glWindowPos2fARB GLeeFuncPtr_glWindowPos2fARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2fvARB -#define GLEE_H_DEFINED_glWindowPos2fvARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVARBPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVARBPROC GLeeFuncPtr_glWindowPos2fvARB; - #define glWindowPos2fvARB GLeeFuncPtr_glWindowPos2fvARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2iARB -#define GLEE_H_DEFINED_glWindowPos2iARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2IARBPROC GLeeFuncPtr_glWindowPos2iARB; - #define glWindowPos2iARB GLeeFuncPtr_glWindowPos2iARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2ivARB -#define GLEE_H_DEFINED_glWindowPos2ivARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVARBPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVARBPROC GLeeFuncPtr_glWindowPos2ivARB; - #define glWindowPos2ivARB GLeeFuncPtr_glWindowPos2ivARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2sARB -#define GLEE_H_DEFINED_glWindowPos2sARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2SARBPROC GLeeFuncPtr_glWindowPos2sARB; - #define glWindowPos2sARB GLeeFuncPtr_glWindowPos2sARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2svARB -#define GLEE_H_DEFINED_glWindowPos2svARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVARBPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVARBPROC GLeeFuncPtr_glWindowPos2svARB; - #define glWindowPos2svARB GLeeFuncPtr_glWindowPos2svARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3dARB -#define GLEE_H_DEFINED_glWindowPos3dARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3DARBPROC GLeeFuncPtr_glWindowPos3dARB; - #define glWindowPos3dARB GLeeFuncPtr_glWindowPos3dARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3dvARB -#define GLEE_H_DEFINED_glWindowPos3dvARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVARBPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVARBPROC GLeeFuncPtr_glWindowPos3dvARB; - #define glWindowPos3dvARB GLeeFuncPtr_glWindowPos3dvARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3fARB -#define GLEE_H_DEFINED_glWindowPos3fARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3FARBPROC GLeeFuncPtr_glWindowPos3fARB; - #define glWindowPos3fARB GLeeFuncPtr_glWindowPos3fARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3fvARB -#define GLEE_H_DEFINED_glWindowPos3fvARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVARBPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVARBPROC GLeeFuncPtr_glWindowPos3fvARB; - #define glWindowPos3fvARB GLeeFuncPtr_glWindowPos3fvARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3iARB -#define GLEE_H_DEFINED_glWindowPos3iARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3IARBPROC GLeeFuncPtr_glWindowPos3iARB; - #define glWindowPos3iARB GLeeFuncPtr_glWindowPos3iARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3ivARB -#define GLEE_H_DEFINED_glWindowPos3ivARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVARBPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVARBPROC GLeeFuncPtr_glWindowPos3ivARB; - #define glWindowPos3ivARB GLeeFuncPtr_glWindowPos3ivARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3sARB -#define GLEE_H_DEFINED_glWindowPos3sARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3SARBPROC GLeeFuncPtr_glWindowPos3sARB; - #define glWindowPos3sARB GLeeFuncPtr_glWindowPos3sARB -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3svARB -#define GLEE_H_DEFINED_glWindowPos3svARB - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVARBPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVARBPROC GLeeFuncPtr_glWindowPos3svARB; - #define glWindowPos3svARB GLeeFuncPtr_glWindowPos3svARB -#endif -#endif - -/* GL_ARB_vertex_program */ - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#define __GLEE_GL_ARB_vertex_program 1 -/* Constants */ -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#ifndef GLEE_H_DEFINED_glVertexAttrib1dARB -#define GLEE_H_DEFINED_glVertexAttrib1dARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DARBPROC GLeeFuncPtr_glVertexAttrib1dARB; - #define glVertexAttrib1dARB GLeeFuncPtr_glVertexAttrib1dARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1dvARB -#define GLEE_H_DEFINED_glVertexAttrib1dvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVARBPROC GLeeFuncPtr_glVertexAttrib1dvARB; - #define glVertexAttrib1dvARB GLeeFuncPtr_glVertexAttrib1dvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1fARB -#define GLEE_H_DEFINED_glVertexAttrib1fARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FARBPROC GLeeFuncPtr_glVertexAttrib1fARB; - #define glVertexAttrib1fARB GLeeFuncPtr_glVertexAttrib1fARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1fvARB -#define GLEE_H_DEFINED_glVertexAttrib1fvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVARBPROC GLeeFuncPtr_glVertexAttrib1fvARB; - #define glVertexAttrib1fvARB GLeeFuncPtr_glVertexAttrib1fvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1sARB -#define GLEE_H_DEFINED_glVertexAttrib1sARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SARBPROC GLeeFuncPtr_glVertexAttrib1sARB; - #define glVertexAttrib1sARB GLeeFuncPtr_glVertexAttrib1sARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1svARB -#define GLEE_H_DEFINED_glVertexAttrib1svARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVARBPROC GLeeFuncPtr_glVertexAttrib1svARB; - #define glVertexAttrib1svARB GLeeFuncPtr_glVertexAttrib1svARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2dARB -#define GLEE_H_DEFINED_glVertexAttrib2dARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DARBPROC GLeeFuncPtr_glVertexAttrib2dARB; - #define glVertexAttrib2dARB GLeeFuncPtr_glVertexAttrib2dARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2dvARB -#define GLEE_H_DEFINED_glVertexAttrib2dvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVARBPROC GLeeFuncPtr_glVertexAttrib2dvARB; - #define glVertexAttrib2dvARB GLeeFuncPtr_glVertexAttrib2dvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2fARB -#define GLEE_H_DEFINED_glVertexAttrib2fARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FARBPROC GLeeFuncPtr_glVertexAttrib2fARB; - #define glVertexAttrib2fARB GLeeFuncPtr_glVertexAttrib2fARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2fvARB -#define GLEE_H_DEFINED_glVertexAttrib2fvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVARBPROC GLeeFuncPtr_glVertexAttrib2fvARB; - #define glVertexAttrib2fvARB GLeeFuncPtr_glVertexAttrib2fvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2sARB -#define GLEE_H_DEFINED_glVertexAttrib2sARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SARBPROC GLeeFuncPtr_glVertexAttrib2sARB; - #define glVertexAttrib2sARB GLeeFuncPtr_glVertexAttrib2sARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2svARB -#define GLEE_H_DEFINED_glVertexAttrib2svARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVARBPROC GLeeFuncPtr_glVertexAttrib2svARB; - #define glVertexAttrib2svARB GLeeFuncPtr_glVertexAttrib2svARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3dARB -#define GLEE_H_DEFINED_glVertexAttrib3dARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DARBPROC GLeeFuncPtr_glVertexAttrib3dARB; - #define glVertexAttrib3dARB GLeeFuncPtr_glVertexAttrib3dARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3dvARB -#define GLEE_H_DEFINED_glVertexAttrib3dvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVARBPROC GLeeFuncPtr_glVertexAttrib3dvARB; - #define glVertexAttrib3dvARB GLeeFuncPtr_glVertexAttrib3dvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3fARB -#define GLEE_H_DEFINED_glVertexAttrib3fARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FARBPROC GLeeFuncPtr_glVertexAttrib3fARB; - #define glVertexAttrib3fARB GLeeFuncPtr_glVertexAttrib3fARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3fvARB -#define GLEE_H_DEFINED_glVertexAttrib3fvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVARBPROC GLeeFuncPtr_glVertexAttrib3fvARB; - #define glVertexAttrib3fvARB GLeeFuncPtr_glVertexAttrib3fvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3sARB -#define GLEE_H_DEFINED_glVertexAttrib3sARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SARBPROC GLeeFuncPtr_glVertexAttrib3sARB; - #define glVertexAttrib3sARB GLeeFuncPtr_glVertexAttrib3sARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3svARB -#define GLEE_H_DEFINED_glVertexAttrib3svARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVARBPROC GLeeFuncPtr_glVertexAttrib3svARB; - #define glVertexAttrib3svARB GLeeFuncPtr_glVertexAttrib3svARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NbvARB -#define GLEE_H_DEFINED_glVertexAttrib4NbvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NBVARBPROC GLeeFuncPtr_glVertexAttrib4NbvARB; - #define glVertexAttrib4NbvARB GLeeFuncPtr_glVertexAttrib4NbvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NivARB -#define GLEE_H_DEFINED_glVertexAttrib4NivARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NIVARBPROC GLeeFuncPtr_glVertexAttrib4NivARB; - #define glVertexAttrib4NivARB GLeeFuncPtr_glVertexAttrib4NivARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NsvARB -#define GLEE_H_DEFINED_glVertexAttrib4NsvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NSVARBPROC GLeeFuncPtr_glVertexAttrib4NsvARB; - #define glVertexAttrib4NsvARB GLeeFuncPtr_glVertexAttrib4NsvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NubARB -#define GLEE_H_DEFINED_glVertexAttrib4NubARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBARBPROC GLeeFuncPtr_glVertexAttrib4NubARB; - #define glVertexAttrib4NubARB GLeeFuncPtr_glVertexAttrib4NubARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NubvARB -#define GLEE_H_DEFINED_glVertexAttrib4NubvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBVARBPROC GLeeFuncPtr_glVertexAttrib4NubvARB; - #define glVertexAttrib4NubvARB GLeeFuncPtr_glVertexAttrib4NubvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NuivARB -#define GLEE_H_DEFINED_glVertexAttrib4NuivARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUIVARBPROC GLeeFuncPtr_glVertexAttrib4NuivARB; - #define glVertexAttrib4NuivARB GLeeFuncPtr_glVertexAttrib4NuivARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4NusvARB -#define GLEE_H_DEFINED_glVertexAttrib4NusvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUSVARBPROC GLeeFuncPtr_glVertexAttrib4NusvARB; - #define glVertexAttrib4NusvARB GLeeFuncPtr_glVertexAttrib4NusvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4bvARB -#define GLEE_H_DEFINED_glVertexAttrib4bvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4BVARBPROC GLeeFuncPtr_glVertexAttrib4bvARB; - #define glVertexAttrib4bvARB GLeeFuncPtr_glVertexAttrib4bvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4dARB -#define GLEE_H_DEFINED_glVertexAttrib4dARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DARBPROC GLeeFuncPtr_glVertexAttrib4dARB; - #define glVertexAttrib4dARB GLeeFuncPtr_glVertexAttrib4dARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4dvARB -#define GLEE_H_DEFINED_glVertexAttrib4dvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVARBPROC GLeeFuncPtr_glVertexAttrib4dvARB; - #define glVertexAttrib4dvARB GLeeFuncPtr_glVertexAttrib4dvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4fARB -#define GLEE_H_DEFINED_glVertexAttrib4fARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FARBPROC GLeeFuncPtr_glVertexAttrib4fARB; - #define glVertexAttrib4fARB GLeeFuncPtr_glVertexAttrib4fARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4fvARB -#define GLEE_H_DEFINED_glVertexAttrib4fvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVARBPROC GLeeFuncPtr_glVertexAttrib4fvARB; - #define glVertexAttrib4fvARB GLeeFuncPtr_glVertexAttrib4fvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4ivARB -#define GLEE_H_DEFINED_glVertexAttrib4ivARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4IVARBPROC GLeeFuncPtr_glVertexAttrib4ivARB; - #define glVertexAttrib4ivARB GLeeFuncPtr_glVertexAttrib4ivARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4sARB -#define GLEE_H_DEFINED_glVertexAttrib4sARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SARBPROC GLeeFuncPtr_glVertexAttrib4sARB; - #define glVertexAttrib4sARB GLeeFuncPtr_glVertexAttrib4sARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4svARB -#define GLEE_H_DEFINED_glVertexAttrib4svARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVARBPROC GLeeFuncPtr_glVertexAttrib4svARB; - #define glVertexAttrib4svARB GLeeFuncPtr_glVertexAttrib4svARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4ubvARB -#define GLEE_H_DEFINED_glVertexAttrib4ubvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVARBPROC GLeeFuncPtr_glVertexAttrib4ubvARB; - #define glVertexAttrib4ubvARB GLeeFuncPtr_glVertexAttrib4ubvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4uivARB -#define GLEE_H_DEFINED_glVertexAttrib4uivARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UIVARBPROC GLeeFuncPtr_glVertexAttrib4uivARB; - #define glVertexAttrib4uivARB GLeeFuncPtr_glVertexAttrib4uivARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4usvARB -#define GLEE_H_DEFINED_glVertexAttrib4usvARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4USVARBPROC GLeeFuncPtr_glVertexAttrib4usvARB; - #define glVertexAttrib4usvARB GLeeFuncPtr_glVertexAttrib4usvARB -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribPointerARB -#define GLEE_H_DEFINED_glVertexAttribPointerARB - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERARBPROC GLeeFuncPtr_glVertexAttribPointerARB; - #define glVertexAttribPointerARB GLeeFuncPtr_glVertexAttribPointerARB -#endif -#ifndef GLEE_H_DEFINED_glEnableVertexAttribArrayARB -#define GLEE_H_DEFINED_glEnableVertexAttribArrayARB - typedef void (APIENTRYP GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); - GLEE_EXTERN GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glEnableVertexAttribArrayARB; - #define glEnableVertexAttribArrayARB GLeeFuncPtr_glEnableVertexAttribArrayARB -#endif -#ifndef GLEE_H_DEFINED_glDisableVertexAttribArrayARB -#define GLEE_H_DEFINED_glDisableVertexAttribArrayARB - typedef void (APIENTRYP GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); - GLEE_EXTERN GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glDisableVertexAttribArrayARB; - #define glDisableVertexAttribArrayARB GLeeFuncPtr_glDisableVertexAttribArrayARB -#endif -#ifndef GLEE_H_DEFINED_glProgramStringARB -#define GLEE_H_DEFINED_glProgramStringARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid * string); - GLEE_EXTERN GLEEPFNGLPROGRAMSTRINGARBPROC GLeeFuncPtr_glProgramStringARB; - #define glProgramStringARB GLeeFuncPtr_glProgramStringARB -#endif -#ifndef GLEE_H_DEFINED_glBindProgramARB -#define GLEE_H_DEFINED_glBindProgramARB - typedef void (APIENTRYP GLEEPFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); - GLEE_EXTERN GLEEPFNGLBINDPROGRAMARBPROC GLeeFuncPtr_glBindProgramARB; - #define glBindProgramARB GLeeFuncPtr_glBindProgramARB -#endif -#ifndef GLEE_H_DEFINED_glDeleteProgramsARB -#define GLEE_H_DEFINED_glDeleteProgramsARB - typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint * programs); - GLEE_EXTERN GLEEPFNGLDELETEPROGRAMSARBPROC GLeeFuncPtr_glDeleteProgramsARB; - #define glDeleteProgramsARB GLeeFuncPtr_glDeleteProgramsARB -#endif -#ifndef GLEE_H_DEFINED_glGenProgramsARB -#define GLEE_H_DEFINED_glGenProgramsARB - typedef void (APIENTRYP GLEEPFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint * programs); - GLEE_EXTERN GLEEPFNGLGENPROGRAMSARBPROC GLeeFuncPtr_glGenProgramsARB; - #define glGenProgramsARB GLeeFuncPtr_glGenProgramsARB -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameter4dARB -#define GLEE_H_DEFINED_glProgramEnvParameter4dARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC GLeeFuncPtr_glProgramEnvParameter4dARB; - #define glProgramEnvParameter4dARB GLeeFuncPtr_glProgramEnvParameter4dARB -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameter4dvARB -#define GLEE_H_DEFINED_glProgramEnvParameter4dvARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC GLeeFuncPtr_glProgramEnvParameter4dvARB; - #define glProgramEnvParameter4dvARB GLeeFuncPtr_glProgramEnvParameter4dvARB -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameter4fARB -#define GLEE_H_DEFINED_glProgramEnvParameter4fARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC GLeeFuncPtr_glProgramEnvParameter4fARB; - #define glProgramEnvParameter4fARB GLeeFuncPtr_glProgramEnvParameter4fARB -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameter4fvARB -#define GLEE_H_DEFINED_glProgramEnvParameter4fvARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC GLeeFuncPtr_glProgramEnvParameter4fvARB; - #define glProgramEnvParameter4fvARB GLeeFuncPtr_glProgramEnvParameter4fvARB -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameter4dARB -#define GLEE_H_DEFINED_glProgramLocalParameter4dARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC GLeeFuncPtr_glProgramLocalParameter4dARB; - #define glProgramLocalParameter4dARB GLeeFuncPtr_glProgramLocalParameter4dARB -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameter4dvARB -#define GLEE_H_DEFINED_glProgramLocalParameter4dvARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLeeFuncPtr_glProgramLocalParameter4dvARB; - #define glProgramLocalParameter4dvARB GLeeFuncPtr_glProgramLocalParameter4dvARB -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameter4fARB -#define GLEE_H_DEFINED_glProgramLocalParameter4fARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC GLeeFuncPtr_glProgramLocalParameter4fARB; - #define glProgramLocalParameter4fARB GLeeFuncPtr_glProgramLocalParameter4fARB -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameter4fvARB -#define GLEE_H_DEFINED_glProgramLocalParameter4fvARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLeeFuncPtr_glProgramLocalParameter4fvARB; - #define glProgramLocalParameter4fvARB GLeeFuncPtr_glProgramLocalParameter4fvARB -#endif -#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterdvARB -#define GLEE_H_DEFINED_glGetProgramEnvParameterdvARB - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramEnvParameterdvARB; - #define glGetProgramEnvParameterdvARB GLeeFuncPtr_glGetProgramEnvParameterdvARB -#endif -#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterfvARB -#define GLEE_H_DEFINED_glGetProgramEnvParameterfvARB - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramEnvParameterfvARB; - #define glGetProgramEnvParameterfvARB GLeeFuncPtr_glGetProgramEnvParameterfvARB -#endif -#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterdvARB -#define GLEE_H_DEFINED_glGetProgramLocalParameterdvARB - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramLocalParameterdvARB; - #define glGetProgramLocalParameterdvARB GLeeFuncPtr_glGetProgramLocalParameterdvARB -#endif -#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterfvARB -#define GLEE_H_DEFINED_glGetProgramLocalParameterfvARB - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramLocalParameterfvARB; - #define glGetProgramLocalParameterfvARB GLeeFuncPtr_glGetProgramLocalParameterfvARB -#endif -#ifndef GLEE_H_DEFINED_glGetProgramivARB -#define GLEE_H_DEFINED_glGetProgramivARB - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMIVARBPROC GLeeFuncPtr_glGetProgramivARB; - #define glGetProgramivARB GLeeFuncPtr_glGetProgramivARB -#endif -#ifndef GLEE_H_DEFINED_glGetProgramStringARB -#define GLEE_H_DEFINED_glGetProgramStringARB - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid * string); - GLEE_EXTERN GLEEPFNGLGETPROGRAMSTRINGARBPROC GLeeFuncPtr_glGetProgramStringARB; - #define glGetProgramStringARB GLeeFuncPtr_glGetProgramStringARB -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribdvARB -#define GLEE_H_DEFINED_glGetVertexAttribdvARB - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVARBPROC GLeeFuncPtr_glGetVertexAttribdvARB; - #define glGetVertexAttribdvARB GLeeFuncPtr_glGetVertexAttribdvARB -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribfvARB -#define GLEE_H_DEFINED_glGetVertexAttribfvARB - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVARBPROC GLeeFuncPtr_glGetVertexAttribfvARB; - #define glGetVertexAttribfvARB GLeeFuncPtr_glGetVertexAttribfvARB -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribivARB -#define GLEE_H_DEFINED_glGetVertexAttribivARB - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVARBPROC GLeeFuncPtr_glGetVertexAttribivARB; - #define glGetVertexAttribivARB GLeeFuncPtr_glGetVertexAttribivARB -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribPointervARB -#define GLEE_H_DEFINED_glGetVertexAttribPointervARB - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC GLeeFuncPtr_glGetVertexAttribPointervARB; - #define glGetVertexAttribPointervARB GLeeFuncPtr_glGetVertexAttribPointervARB -#endif -#ifndef GLEE_H_DEFINED_glIsProgramARB -#define GLEE_H_DEFINED_glIsProgramARB - typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMARBPROC) (GLuint program); - GLEE_EXTERN GLEEPFNGLISPROGRAMARBPROC GLeeFuncPtr_glIsProgramARB; - #define glIsProgramARB GLeeFuncPtr_glIsProgramARB -#endif -#endif - -/* GL_ARB_fragment_program */ - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -#define __GLEE_GL_ARB_fragment_program 1 -/* Constants */ -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif - -/* GL_ARB_vertex_buffer_object */ - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#define __GLEE_GL_ARB_vertex_buffer_object 1 -/* Constants */ -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#ifndef GLEE_H_DEFINED_glBindBufferARB -#define GLEE_H_DEFINED_glBindBufferARB - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); - GLEE_EXTERN GLEEPFNGLBINDBUFFERARBPROC GLeeFuncPtr_glBindBufferARB; - #define glBindBufferARB GLeeFuncPtr_glBindBufferARB -#endif -#ifndef GLEE_H_DEFINED_glDeleteBuffersARB -#define GLEE_H_DEFINED_glDeleteBuffersARB - typedef void (APIENTRYP GLEEPFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint * buffers); - GLEE_EXTERN GLEEPFNGLDELETEBUFFERSARBPROC GLeeFuncPtr_glDeleteBuffersARB; - #define glDeleteBuffersARB GLeeFuncPtr_glDeleteBuffersARB -#endif -#ifndef GLEE_H_DEFINED_glGenBuffersARB -#define GLEE_H_DEFINED_glGenBuffersARB - typedef void (APIENTRYP GLEEPFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint * buffers); - GLEE_EXTERN GLEEPFNGLGENBUFFERSARBPROC GLeeFuncPtr_glGenBuffersARB; - #define glGenBuffersARB GLeeFuncPtr_glGenBuffersARB -#endif -#ifndef GLEE_H_DEFINED_glIsBufferARB -#define GLEE_H_DEFINED_glIsBufferARB - typedef GLboolean (APIENTRYP GLEEPFNGLISBUFFERARBPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLISBUFFERARBPROC GLeeFuncPtr_glIsBufferARB; - #define glIsBufferARB GLeeFuncPtr_glIsBufferARB -#endif -#ifndef GLEE_H_DEFINED_glBufferDataARB -#define GLEE_H_DEFINED_glBufferDataARB - typedef void (APIENTRYP GLEEPFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); - GLEE_EXTERN GLEEPFNGLBUFFERDATAARBPROC GLeeFuncPtr_glBufferDataARB; - #define glBufferDataARB GLeeFuncPtr_glBufferDataARB -#endif -#ifndef GLEE_H_DEFINED_glBufferSubDataARB -#define GLEE_H_DEFINED_glBufferSubDataARB - typedef void (APIENTRYP GLEEPFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLBUFFERSUBDATAARBPROC GLeeFuncPtr_glBufferSubDataARB; - #define glBufferSubDataARB GLeeFuncPtr_glBufferSubDataARB -#endif -#ifndef GLEE_H_DEFINED_glGetBufferSubDataARB -#define GLEE_H_DEFINED_glGetBufferSubDataARB - typedef void (APIENTRYP GLEEPFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data); - GLEE_EXTERN GLEEPFNGLGETBUFFERSUBDATAARBPROC GLeeFuncPtr_glGetBufferSubDataARB; - #define glGetBufferSubDataARB GLeeFuncPtr_glGetBufferSubDataARB -#endif -#ifndef GLEE_H_DEFINED_glMapBufferARB -#define GLEE_H_DEFINED_glMapBufferARB - typedef GLvoid* (APIENTRYP GLEEPFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); - GLEE_EXTERN GLEEPFNGLMAPBUFFERARBPROC GLeeFuncPtr_glMapBufferARB; - #define glMapBufferARB GLeeFuncPtr_glMapBufferARB -#endif -#ifndef GLEE_H_DEFINED_glUnmapBufferARB -#define GLEE_H_DEFINED_glUnmapBufferARB - typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPBUFFERARBPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLUNMAPBUFFERARBPROC GLeeFuncPtr_glUnmapBufferARB; - #define glUnmapBufferARB GLeeFuncPtr_glUnmapBufferARB -#endif -#ifndef GLEE_H_DEFINED_glGetBufferParameterivARB -#define GLEE_H_DEFINED_glGetBufferParameterivARB - typedef void (APIENTRYP GLEEPFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETBUFFERPARAMETERIVARBPROC GLeeFuncPtr_glGetBufferParameterivARB; - #define glGetBufferParameterivARB GLeeFuncPtr_glGetBufferParameterivARB -#endif -#ifndef GLEE_H_DEFINED_glGetBufferPointervARB -#define GLEE_H_DEFINED_glGetBufferPointervARB - typedef void (APIENTRYP GLEEPFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* * params); - GLEE_EXTERN GLEEPFNGLGETBUFFERPOINTERVARBPROC GLeeFuncPtr_glGetBufferPointervARB; - #define glGetBufferPointervARB GLeeFuncPtr_glGetBufferPointervARB -#endif -#endif - -/* GL_ARB_occlusion_query */ - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#define __GLEE_GL_ARB_occlusion_query 1 -/* Constants */ -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#ifndef GLEE_H_DEFINED_glGenQueriesARB -#define GLEE_H_DEFINED_glGenQueriesARB - typedef void (APIENTRYP GLEEPFNGLGENQUERIESARBPROC) (GLsizei n, GLuint * ids); - GLEE_EXTERN GLEEPFNGLGENQUERIESARBPROC GLeeFuncPtr_glGenQueriesARB; - #define glGenQueriesARB GLeeFuncPtr_glGenQueriesARB -#endif -#ifndef GLEE_H_DEFINED_glDeleteQueriesARB -#define GLEE_H_DEFINED_glDeleteQueriesARB - typedef void (APIENTRYP GLEEPFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint * ids); - GLEE_EXTERN GLEEPFNGLDELETEQUERIESARBPROC GLeeFuncPtr_glDeleteQueriesARB; - #define glDeleteQueriesARB GLeeFuncPtr_glDeleteQueriesARB -#endif -#ifndef GLEE_H_DEFINED_glIsQueryARB -#define GLEE_H_DEFINED_glIsQueryARB - typedef GLboolean (APIENTRYP GLEEPFNGLISQUERYARBPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLISQUERYARBPROC GLeeFuncPtr_glIsQueryARB; - #define glIsQueryARB GLeeFuncPtr_glIsQueryARB -#endif -#ifndef GLEE_H_DEFINED_glBeginQueryARB -#define GLEE_H_DEFINED_glBeginQueryARB - typedef void (APIENTRYP GLEEPFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); - GLEE_EXTERN GLEEPFNGLBEGINQUERYARBPROC GLeeFuncPtr_glBeginQueryARB; - #define glBeginQueryARB GLeeFuncPtr_glBeginQueryARB -#endif -#ifndef GLEE_H_DEFINED_glEndQueryARB -#define GLEE_H_DEFINED_glEndQueryARB - typedef void (APIENTRYP GLEEPFNGLENDQUERYARBPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLENDQUERYARBPROC GLeeFuncPtr_glEndQueryARB; - #define glEndQueryARB GLeeFuncPtr_glEndQueryARB -#endif -#ifndef GLEE_H_DEFINED_glGetQueryivARB -#define GLEE_H_DEFINED_glGetQueryivARB - typedef void (APIENTRYP GLEEPFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETQUERYIVARBPROC GLeeFuncPtr_glGetQueryivARB; - #define glGetQueryivARB GLeeFuncPtr_glGetQueryivARB -#endif -#ifndef GLEE_H_DEFINED_glGetQueryObjectivARB -#define GLEE_H_DEFINED_glGetQueryObjectivARB - typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTIVARBPROC GLeeFuncPtr_glGetQueryObjectivARB; - #define glGetQueryObjectivARB GLeeFuncPtr_glGetQueryObjectivARB -#endif -#ifndef GLEE_H_DEFINED_glGetQueryObjectuivARB -#define GLEE_H_DEFINED_glGetQueryObjectuivARB - typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUIVARBPROC GLeeFuncPtr_glGetQueryObjectuivARB; - #define glGetQueryObjectuivARB GLeeFuncPtr_glGetQueryObjectuivARB -#endif -#endif - -/* GL_ARB_shader_objects */ - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#define __GLEE_GL_ARB_shader_objects 1 -/* Constants */ -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#ifndef GLEE_H_DEFINED_glDeleteObjectARB -#define GLEE_H_DEFINED_glDeleteObjectARB - typedef void (APIENTRYP GLEEPFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); - GLEE_EXTERN GLEEPFNGLDELETEOBJECTARBPROC GLeeFuncPtr_glDeleteObjectARB; - #define glDeleteObjectARB GLeeFuncPtr_glDeleteObjectARB -#endif -#ifndef GLEE_H_DEFINED_glGetHandleARB -#define GLEE_H_DEFINED_glGetHandleARB - typedef GLhandleARB (APIENTRYP GLEEPFNGLGETHANDLEARBPROC) (GLenum pname); - GLEE_EXTERN GLEEPFNGLGETHANDLEARBPROC GLeeFuncPtr_glGetHandleARB; - #define glGetHandleARB GLeeFuncPtr_glGetHandleARB -#endif -#ifndef GLEE_H_DEFINED_glDetachObjectARB -#define GLEE_H_DEFINED_glDetachObjectARB - typedef void (APIENTRYP GLEEPFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); - GLEE_EXTERN GLEEPFNGLDETACHOBJECTARBPROC GLeeFuncPtr_glDetachObjectARB; - #define glDetachObjectARB GLeeFuncPtr_glDetachObjectARB -#endif -#ifndef GLEE_H_DEFINED_glCreateShaderObjectARB -#define GLEE_H_DEFINED_glCreateShaderObjectARB - typedef GLhandleARB (APIENTRYP GLEEPFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); - GLEE_EXTERN GLEEPFNGLCREATESHADEROBJECTARBPROC GLeeFuncPtr_glCreateShaderObjectARB; - #define glCreateShaderObjectARB GLeeFuncPtr_glCreateShaderObjectARB -#endif -#ifndef GLEE_H_DEFINED_glShaderSourceARB -#define GLEE_H_DEFINED_glShaderSourceARB - typedef void (APIENTRYP GLEEPFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* * string, const GLint * length); - GLEE_EXTERN GLEEPFNGLSHADERSOURCEARBPROC GLeeFuncPtr_glShaderSourceARB; - #define glShaderSourceARB GLeeFuncPtr_glShaderSourceARB -#endif -#ifndef GLEE_H_DEFINED_glCompileShaderARB -#define GLEE_H_DEFINED_glCompileShaderARB - typedef void (APIENTRYP GLEEPFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); - GLEE_EXTERN GLEEPFNGLCOMPILESHADERARBPROC GLeeFuncPtr_glCompileShaderARB; - #define glCompileShaderARB GLeeFuncPtr_glCompileShaderARB -#endif -#ifndef GLEE_H_DEFINED_glCreateProgramObjectARB -#define GLEE_H_DEFINED_glCreateProgramObjectARB - typedef GLhandleARB (APIENTRYP GLEEPFNGLCREATEPROGRAMOBJECTARBPROC) (); - GLEE_EXTERN GLEEPFNGLCREATEPROGRAMOBJECTARBPROC GLeeFuncPtr_glCreateProgramObjectARB; - #define glCreateProgramObjectARB GLeeFuncPtr_glCreateProgramObjectARB -#endif -#ifndef GLEE_H_DEFINED_glAttachObjectARB -#define GLEE_H_DEFINED_glAttachObjectARB - typedef void (APIENTRYP GLEEPFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); - GLEE_EXTERN GLEEPFNGLATTACHOBJECTARBPROC GLeeFuncPtr_glAttachObjectARB; - #define glAttachObjectARB GLeeFuncPtr_glAttachObjectARB -#endif -#ifndef GLEE_H_DEFINED_glLinkProgramARB -#define GLEE_H_DEFINED_glLinkProgramARB - typedef void (APIENTRYP GLEEPFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); - GLEE_EXTERN GLEEPFNGLLINKPROGRAMARBPROC GLeeFuncPtr_glLinkProgramARB; - #define glLinkProgramARB GLeeFuncPtr_glLinkProgramARB -#endif -#ifndef GLEE_H_DEFINED_glUseProgramObjectARB -#define GLEE_H_DEFINED_glUseProgramObjectARB - typedef void (APIENTRYP GLEEPFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); - GLEE_EXTERN GLEEPFNGLUSEPROGRAMOBJECTARBPROC GLeeFuncPtr_glUseProgramObjectARB; - #define glUseProgramObjectARB GLeeFuncPtr_glUseProgramObjectARB -#endif -#ifndef GLEE_H_DEFINED_glValidateProgramARB -#define GLEE_H_DEFINED_glValidateProgramARB - typedef void (APIENTRYP GLEEPFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); - GLEE_EXTERN GLEEPFNGLVALIDATEPROGRAMARBPROC GLeeFuncPtr_glValidateProgramARB; - #define glValidateProgramARB GLeeFuncPtr_glValidateProgramARB -#endif -#ifndef GLEE_H_DEFINED_glUniform1fARB -#define GLEE_H_DEFINED_glUniform1fARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); - GLEE_EXTERN GLEEPFNGLUNIFORM1FARBPROC GLeeFuncPtr_glUniform1fARB; - #define glUniform1fARB GLeeFuncPtr_glUniform1fARB -#endif -#ifndef GLEE_H_DEFINED_glUniform2fARB -#define GLEE_H_DEFINED_glUniform2fARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); - GLEE_EXTERN GLEEPFNGLUNIFORM2FARBPROC GLeeFuncPtr_glUniform2fARB; - #define glUniform2fARB GLeeFuncPtr_glUniform2fARB -#endif -#ifndef GLEE_H_DEFINED_glUniform3fARB -#define GLEE_H_DEFINED_glUniform3fARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GLEE_EXTERN GLEEPFNGLUNIFORM3FARBPROC GLeeFuncPtr_glUniform3fARB; - #define glUniform3fARB GLeeFuncPtr_glUniform3fARB -#endif -#ifndef GLEE_H_DEFINED_glUniform4fARB -#define GLEE_H_DEFINED_glUniform4fARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GLEE_EXTERN GLEEPFNGLUNIFORM4FARBPROC GLeeFuncPtr_glUniform4fARB; - #define glUniform4fARB GLeeFuncPtr_glUniform4fARB -#endif -#ifndef GLEE_H_DEFINED_glUniform1iARB -#define GLEE_H_DEFINED_glUniform1iARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); - GLEE_EXTERN GLEEPFNGLUNIFORM1IARBPROC GLeeFuncPtr_glUniform1iARB; - #define glUniform1iARB GLeeFuncPtr_glUniform1iARB -#endif -#ifndef GLEE_H_DEFINED_glUniform2iARB -#define GLEE_H_DEFINED_glUniform2iARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); - GLEE_EXTERN GLEEPFNGLUNIFORM2IARBPROC GLeeFuncPtr_glUniform2iARB; - #define glUniform2iARB GLeeFuncPtr_glUniform2iARB -#endif -#ifndef GLEE_H_DEFINED_glUniform3iARB -#define GLEE_H_DEFINED_glUniform3iARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); - GLEE_EXTERN GLEEPFNGLUNIFORM3IARBPROC GLeeFuncPtr_glUniform3iARB; - #define glUniform3iARB GLeeFuncPtr_glUniform3iARB -#endif -#ifndef GLEE_H_DEFINED_glUniform4iARB -#define GLEE_H_DEFINED_glUniform4iARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GLEE_EXTERN GLEEPFNGLUNIFORM4IARBPROC GLeeFuncPtr_glUniform4iARB; - #define glUniform4iARB GLeeFuncPtr_glUniform4iARB -#endif -#ifndef GLEE_H_DEFINED_glUniform1fvARB -#define GLEE_H_DEFINED_glUniform1fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM1FVARBPROC GLeeFuncPtr_glUniform1fvARB; - #define glUniform1fvARB GLeeFuncPtr_glUniform1fvARB -#endif -#ifndef GLEE_H_DEFINED_glUniform2fvARB -#define GLEE_H_DEFINED_glUniform2fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM2FVARBPROC GLeeFuncPtr_glUniform2fvARB; - #define glUniform2fvARB GLeeFuncPtr_glUniform2fvARB -#endif -#ifndef GLEE_H_DEFINED_glUniform3fvARB -#define GLEE_H_DEFINED_glUniform3fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM3FVARBPROC GLeeFuncPtr_glUniform3fvARB; - #define glUniform3fvARB GLeeFuncPtr_glUniform3fvARB -#endif -#ifndef GLEE_H_DEFINED_glUniform4fvARB -#define GLEE_H_DEFINED_glUniform4fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORM4FVARBPROC GLeeFuncPtr_glUniform4fvARB; - #define glUniform4fvARB GLeeFuncPtr_glUniform4fvARB -#endif -#ifndef GLEE_H_DEFINED_glUniform1ivARB -#define GLEE_H_DEFINED_glUniform1ivARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM1IVARBPROC GLeeFuncPtr_glUniform1ivARB; - #define glUniform1ivARB GLeeFuncPtr_glUniform1ivARB -#endif -#ifndef GLEE_H_DEFINED_glUniform2ivARB -#define GLEE_H_DEFINED_glUniform2ivARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM2IVARBPROC GLeeFuncPtr_glUniform2ivARB; - #define glUniform2ivARB GLeeFuncPtr_glUniform2ivARB -#endif -#ifndef GLEE_H_DEFINED_glUniform3ivARB -#define GLEE_H_DEFINED_glUniform3ivARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM3IVARBPROC GLeeFuncPtr_glUniform3ivARB; - #define glUniform3ivARB GLeeFuncPtr_glUniform3ivARB -#endif -#ifndef GLEE_H_DEFINED_glUniform4ivARB -#define GLEE_H_DEFINED_glUniform4ivARB - typedef void (APIENTRYP GLEEPFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM4IVARBPROC GLeeFuncPtr_glUniform4ivARB; - #define glUniform4ivARB GLeeFuncPtr_glUniform4ivARB -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix2fvARB -#define GLEE_H_DEFINED_glUniformMatrix2fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2FVARBPROC GLeeFuncPtr_glUniformMatrix2fvARB; - #define glUniformMatrix2fvARB GLeeFuncPtr_glUniformMatrix2fvARB -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix3fvARB -#define GLEE_H_DEFINED_glUniformMatrix3fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3FVARBPROC GLeeFuncPtr_glUniformMatrix3fvARB; - #define glUniformMatrix3fvARB GLeeFuncPtr_glUniformMatrix3fvARB -#endif -#ifndef GLEE_H_DEFINED_glUniformMatrix4fvARB -#define GLEE_H_DEFINED_glUniformMatrix4fvARB - typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4FVARBPROC GLeeFuncPtr_glUniformMatrix4fvARB; - #define glUniformMatrix4fvARB GLeeFuncPtr_glUniformMatrix4fvARB -#endif -#ifndef GLEE_H_DEFINED_glGetObjectParameterfvARB -#define GLEE_H_DEFINED_glGetObjectParameterfvARB - typedef void (APIENTRYP GLEEPFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETOBJECTPARAMETERFVARBPROC GLeeFuncPtr_glGetObjectParameterfvARB; - #define glGetObjectParameterfvARB GLeeFuncPtr_glGetObjectParameterfvARB -#endif -#ifndef GLEE_H_DEFINED_glGetObjectParameterivARB -#define GLEE_H_DEFINED_glGetObjectParameterivARB - typedef void (APIENTRYP GLEEPFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETOBJECTPARAMETERIVARBPROC GLeeFuncPtr_glGetObjectParameterivARB; - #define glGetObjectParameterivARB GLeeFuncPtr_glGetObjectParameterivARB -#endif -#ifndef GLEE_H_DEFINED_glGetInfoLogARB -#define GLEE_H_DEFINED_glGetInfoLogARB - typedef void (APIENTRYP GLEEPFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); - GLEE_EXTERN GLEEPFNGLGETINFOLOGARBPROC GLeeFuncPtr_glGetInfoLogARB; - #define glGetInfoLogARB GLeeFuncPtr_glGetInfoLogARB -#endif -#ifndef GLEE_H_DEFINED_glGetAttachedObjectsARB -#define GLEE_H_DEFINED_glGetAttachedObjectsARB - typedef void (APIENTRYP GLEEPFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj); - GLEE_EXTERN GLEEPFNGLGETATTACHEDOBJECTSARBPROC GLeeFuncPtr_glGetAttachedObjectsARB; - #define glGetAttachedObjectsARB GLeeFuncPtr_glGetAttachedObjectsARB -#endif -#ifndef GLEE_H_DEFINED_glGetUniformLocationARB -#define GLEE_H_DEFINED_glGetUniformLocationARB - typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB * name); - GLEE_EXTERN GLEEPFNGLGETUNIFORMLOCATIONARBPROC GLeeFuncPtr_glGetUniformLocationARB; - #define glGetUniformLocationARB GLeeFuncPtr_glGetUniformLocationARB -#endif -#ifndef GLEE_H_DEFINED_glGetActiveUniformARB -#define GLEE_H_DEFINED_glGetActiveUniformARB - typedef void (APIENTRYP GLEEPFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); - GLEE_EXTERN GLEEPFNGLGETACTIVEUNIFORMARBPROC GLeeFuncPtr_glGetActiveUniformARB; - #define glGetActiveUniformARB GLeeFuncPtr_glGetActiveUniformARB -#endif -#ifndef GLEE_H_DEFINED_glGetUniformfvARB -#define GLEE_H_DEFINED_glGetUniformfvARB - typedef void (APIENTRYP GLEEPFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETUNIFORMFVARBPROC GLeeFuncPtr_glGetUniformfvARB; - #define glGetUniformfvARB GLeeFuncPtr_glGetUniformfvARB -#endif -#ifndef GLEE_H_DEFINED_glGetUniformivARB -#define GLEE_H_DEFINED_glGetUniformivARB - typedef void (APIENTRYP GLEEPFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint * params); - GLEE_EXTERN GLEEPFNGLGETUNIFORMIVARBPROC GLeeFuncPtr_glGetUniformivARB; - #define glGetUniformivARB GLeeFuncPtr_glGetUniformivARB -#endif -#ifndef GLEE_H_DEFINED_glGetShaderSourceARB -#define GLEE_H_DEFINED_glGetShaderSourceARB - typedef void (APIENTRYP GLEEPFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source); - GLEE_EXTERN GLEEPFNGLGETSHADERSOURCEARBPROC GLeeFuncPtr_glGetShaderSourceARB; - #define glGetShaderSourceARB GLeeFuncPtr_glGetShaderSourceARB -#endif -#endif - -/* GL_ARB_vertex_shader */ - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#define __GLEE_GL_ARB_vertex_shader 1 -/* Constants */ -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#ifndef GLEE_H_DEFINED_glBindAttribLocationARB -#define GLEE_H_DEFINED_glBindAttribLocationARB - typedef void (APIENTRYP GLEEPFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB * name); - GLEE_EXTERN GLEEPFNGLBINDATTRIBLOCATIONARBPROC GLeeFuncPtr_glBindAttribLocationARB; - #define glBindAttribLocationARB GLeeFuncPtr_glBindAttribLocationARB -#endif -#ifndef GLEE_H_DEFINED_glGetActiveAttribARB -#define GLEE_H_DEFINED_glGetActiveAttribARB - typedef void (APIENTRYP GLEEPFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); - GLEE_EXTERN GLEEPFNGLGETACTIVEATTRIBARBPROC GLeeFuncPtr_glGetActiveAttribARB; - #define glGetActiveAttribARB GLeeFuncPtr_glGetActiveAttribARB -#endif -#ifndef GLEE_H_DEFINED_glGetAttribLocationARB -#define GLEE_H_DEFINED_glGetAttribLocationARB - typedef GLint (APIENTRYP GLEEPFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB * name); - GLEE_EXTERN GLEEPFNGLGETATTRIBLOCATIONARBPROC GLeeFuncPtr_glGetAttribLocationARB; - #define glGetAttribLocationARB GLeeFuncPtr_glGetAttribLocationARB -#endif -#endif - -/* GL_ARB_fragment_shader */ - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#define __GLEE_GL_ARB_fragment_shader 1 -/* Constants */ -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif - -/* GL_ARB_shading_language_100 */ - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#define __GLEE_GL_ARB_shading_language_100 1 -/* Constants */ -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif - -/* GL_ARB_texture_non_power_of_two */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#define __GLEE_GL_ARB_texture_non_power_of_two 1 -/* Constants */ -#endif - -/* GL_ARB_point_sprite */ - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#define __GLEE_GL_ARB_point_sprite 1 -/* Constants */ -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif - -/* GL_ARB_fragment_program_shadow */ - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#define __GLEE_GL_ARB_fragment_program_shadow 1 -/* Constants */ -#endif - -/* GL_ARB_draw_buffers */ - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#define __GLEE_GL_ARB_draw_buffers 1 -/* Constants */ -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#ifndef GLEE_H_DEFINED_glDrawBuffersARB -#define GLEE_H_DEFINED_glDrawBuffersARB - typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum * bufs); - GLEE_EXTERN GLEEPFNGLDRAWBUFFERSARBPROC GLeeFuncPtr_glDrawBuffersARB; - #define glDrawBuffersARB GLeeFuncPtr_glDrawBuffersARB -#endif -#endif - -/* GL_ARB_texture_rectangle */ - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#define __GLEE_GL_ARB_texture_rectangle 1 -/* Constants */ -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif - -/* GL_ARB_color_buffer_float */ - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#define __GLEE_GL_ARB_color_buffer_float 1 -/* Constants */ -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#ifndef GLEE_H_DEFINED_glClampColorARB -#define GLEE_H_DEFINED_glClampColorARB - typedef void (APIENTRYP GLEEPFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); - GLEE_EXTERN GLEEPFNGLCLAMPCOLORARBPROC GLeeFuncPtr_glClampColorARB; - #define glClampColorARB GLeeFuncPtr_glClampColorARB -#endif -#endif - -/* GL_ARB_half_float_pixel */ - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#define __GLEE_GL_ARB_half_float_pixel 1 -/* Constants */ -#define GL_HALF_FLOAT_ARB 0x140B -#endif - -/* GL_ARB_texture_float */ - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#define __GLEE_GL_ARB_texture_float 1 -/* Constants */ -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif - -/* GL_ARB_pixel_buffer_object */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#define __GLEE_GL_ARB_pixel_buffer_object 1 -/* Constants */ -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif - -/* GL_ARB_depth_buffer_float */ - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#define __GLEE_GL_ARB_depth_buffer_float 1 -/* Constants */ -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#endif - -/* GL_ARB_draw_instanced */ - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 -#define __GLEE_GL_ARB_draw_instanced 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glDrawArraysInstancedARB -#define GLEE_H_DEFINED_glDrawArraysInstancedARB - typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC GLeeFuncPtr_glDrawArraysInstancedARB; - #define glDrawArraysInstancedARB GLeeFuncPtr_glDrawArraysInstancedARB -#endif -#ifndef GLEE_H_DEFINED_glDrawElementsInstancedARB -#define GLEE_H_DEFINED_glDrawElementsInstancedARB - typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC GLeeFuncPtr_glDrawElementsInstancedARB; - #define glDrawElementsInstancedARB GLeeFuncPtr_glDrawElementsInstancedARB -#endif -#endif - -/* GL_ARB_framebuffer_object */ - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#define __GLEE_GL_ARB_framebuffer_object 1 -/* Constants */ -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_INDEX 0x8222 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#ifndef GLEE_H_DEFINED_glIsRenderbuffer -#define GLEE_H_DEFINED_glIsRenderbuffer - typedef GLboolean (APIENTRYP GLEEPFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLISRENDERBUFFERPROC GLeeFuncPtr_glIsRenderbuffer; - #define glIsRenderbuffer GLeeFuncPtr_glIsRenderbuffer -#endif -#ifndef GLEE_H_DEFINED_glBindRenderbuffer -#define GLEE_H_DEFINED_glBindRenderbuffer - typedef void (APIENTRYP GLEEPFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLBINDRENDERBUFFERPROC GLeeFuncPtr_glBindRenderbuffer; - #define glBindRenderbuffer GLeeFuncPtr_glBindRenderbuffer -#endif -#ifndef GLEE_H_DEFINED_glDeleteRenderbuffers -#define GLEE_H_DEFINED_glDeleteRenderbuffers - typedef void (APIENTRYP GLEEPFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint * renderbuffers); - GLEE_EXTERN GLEEPFNGLDELETERENDERBUFFERSPROC GLeeFuncPtr_glDeleteRenderbuffers; - #define glDeleteRenderbuffers GLeeFuncPtr_glDeleteRenderbuffers -#endif -#ifndef GLEE_H_DEFINED_glGenRenderbuffers -#define GLEE_H_DEFINED_glGenRenderbuffers - typedef void (APIENTRYP GLEEPFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint * renderbuffers); - GLEE_EXTERN GLEEPFNGLGENRENDERBUFFERSPROC GLeeFuncPtr_glGenRenderbuffers; - #define glGenRenderbuffers GLeeFuncPtr_glGenRenderbuffers -#endif -#ifndef GLEE_H_DEFINED_glRenderbufferStorage -#define GLEE_H_DEFINED_glRenderbufferStorage - typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEPROC GLeeFuncPtr_glRenderbufferStorage; - #define glRenderbufferStorage GLeeFuncPtr_glRenderbufferStorage -#endif -#ifndef GLEE_H_DEFINED_glGetRenderbufferParameteriv -#define GLEE_H_DEFINED_glGetRenderbufferParameteriv - typedef void (APIENTRYP GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetRenderbufferParameteriv; - #define glGetRenderbufferParameteriv GLeeFuncPtr_glGetRenderbufferParameteriv -#endif -#ifndef GLEE_H_DEFINED_glIsFramebuffer -#define GLEE_H_DEFINED_glIsFramebuffer - typedef GLboolean (APIENTRYP GLEEPFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); - GLEE_EXTERN GLEEPFNGLISFRAMEBUFFERPROC GLeeFuncPtr_glIsFramebuffer; - #define glIsFramebuffer GLeeFuncPtr_glIsFramebuffer -#endif -#ifndef GLEE_H_DEFINED_glBindFramebuffer -#define GLEE_H_DEFINED_glBindFramebuffer - typedef void (APIENTRYP GLEEPFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); - GLEE_EXTERN GLEEPFNGLBINDFRAMEBUFFERPROC GLeeFuncPtr_glBindFramebuffer; - #define glBindFramebuffer GLeeFuncPtr_glBindFramebuffer -#endif -#ifndef GLEE_H_DEFINED_glDeleteFramebuffers -#define GLEE_H_DEFINED_glDeleteFramebuffers - typedef void (APIENTRYP GLEEPFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint * framebuffers); - GLEE_EXTERN GLEEPFNGLDELETEFRAMEBUFFERSPROC GLeeFuncPtr_glDeleteFramebuffers; - #define glDeleteFramebuffers GLeeFuncPtr_glDeleteFramebuffers -#endif -#ifndef GLEE_H_DEFINED_glGenFramebuffers -#define GLEE_H_DEFINED_glGenFramebuffers - typedef void (APIENTRYP GLEEPFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint * framebuffers); - GLEE_EXTERN GLEEPFNGLGENFRAMEBUFFERSPROC GLeeFuncPtr_glGenFramebuffers; - #define glGenFramebuffers GLeeFuncPtr_glGenFramebuffers -#endif -#ifndef GLEE_H_DEFINED_glCheckFramebufferStatus -#define GLEE_H_DEFINED_glCheckFramebufferStatus - typedef GLenum (APIENTRYP GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC GLeeFuncPtr_glCheckFramebufferStatus; - #define glCheckFramebufferStatus GLeeFuncPtr_glCheckFramebufferStatus -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTexture1D -#define GLEE_H_DEFINED_glFramebufferTexture1D - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC GLeeFuncPtr_glFramebufferTexture1D; - #define glFramebufferTexture1D GLeeFuncPtr_glFramebufferTexture1D -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTexture2D -#define GLEE_H_DEFINED_glFramebufferTexture2D - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC GLeeFuncPtr_glFramebufferTexture2D; - #define glFramebufferTexture2D GLeeFuncPtr_glFramebufferTexture2D -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTexture3D -#define GLEE_H_DEFINED_glFramebufferTexture3D - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC GLeeFuncPtr_glFramebufferTexture3D; - #define glFramebufferTexture3D GLeeFuncPtr_glFramebufferTexture3D -#endif -#ifndef GLEE_H_DEFINED_glFramebufferRenderbuffer -#define GLEE_H_DEFINED_glFramebufferRenderbuffer - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC GLeeFuncPtr_glFramebufferRenderbuffer; - #define glFramebufferRenderbuffer GLeeFuncPtr_glFramebufferRenderbuffer -#endif -#ifndef GLEE_H_DEFINED_glGetFramebufferAttachmentParameteriv -#define GLEE_H_DEFINED_glGetFramebufferAttachmentParameteriv - typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GLeeFuncPtr_glGetFramebufferAttachmentParameteriv; - #define glGetFramebufferAttachmentParameteriv GLeeFuncPtr_glGetFramebufferAttachmentParameteriv -#endif -#ifndef GLEE_H_DEFINED_glGenerateMipmap -#define GLEE_H_DEFINED_glGenerateMipmap - typedef void (APIENTRYP GLEEPFNGLGENERATEMIPMAPPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLGENERATEMIPMAPPROC GLeeFuncPtr_glGenerateMipmap; - #define glGenerateMipmap GLeeFuncPtr_glGenerateMipmap -#endif -#ifndef GLEE_H_DEFINED_glBlitFramebuffer -#define GLEE_H_DEFINED_glBlitFramebuffer - typedef void (APIENTRYP GLEEPFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - GLEE_EXTERN GLEEPFNGLBLITFRAMEBUFFERPROC GLeeFuncPtr_glBlitFramebuffer; - #define glBlitFramebuffer GLeeFuncPtr_glBlitFramebuffer -#endif -#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisample -#define GLEE_H_DEFINED_glRenderbufferStorageMultisample - typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC GLeeFuncPtr_glRenderbufferStorageMultisample; - #define glRenderbufferStorageMultisample GLeeFuncPtr_glRenderbufferStorageMultisample -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureLayer -#define GLEE_H_DEFINED_glFramebufferTextureLayer - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC GLeeFuncPtr_glFramebufferTextureLayer; - #define glFramebufferTextureLayer GLeeFuncPtr_glFramebufferTextureLayer -#endif -#endif - -/* GL_ARB_framebuffer_sRGB */ - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#define __GLEE_GL_ARB_framebuffer_sRGB 1 -/* Constants */ -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#endif - -/* GL_ARB_geometry_shader4 */ - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 -#define __GLEE_GL_ARB_geometry_shader4 1 -/* Constants */ -#define GL_LINES_ADJACENCY_ARB 0x000A -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B -#define GL_TRIANGLES_ADJACENCY_ARB 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 -#ifndef GLEE_H_DEFINED_glProgramParameteriARB -#define GLEE_H_DEFINED_glProgramParameteriARB - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERIARBPROC GLeeFuncPtr_glProgramParameteriARB; - #define glProgramParameteriARB GLeeFuncPtr_glProgramParameteriARB -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureARB -#define GLEE_H_DEFINED_glFramebufferTextureARB - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC GLeeFuncPtr_glFramebufferTextureARB; - #define glFramebufferTextureARB GLeeFuncPtr_glFramebufferTextureARB -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerARB -#define GLEE_H_DEFINED_glFramebufferTextureLayerARB - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC GLeeFuncPtr_glFramebufferTextureLayerARB; - #define glFramebufferTextureLayerARB GLeeFuncPtr_glFramebufferTextureLayerARB -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceARB -#define GLEE_H_DEFINED_glFramebufferTextureFaceARB - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC GLeeFuncPtr_glFramebufferTextureFaceARB; - #define glFramebufferTextureFaceARB GLeeFuncPtr_glFramebufferTextureFaceARB -#endif -#endif - -/* GL_ARB_half_float_vertex */ - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#define __GLEE_GL_ARB_half_float_vertex 1 -/* Constants */ -#define GL_HALF_FLOAT 0x140B -#endif - -/* GL_ARB_instanced_arrays */ - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 -#define __GLEE_GL_ARB_instanced_arrays 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glVertexAttribDivisor -#define GLEE_H_DEFINED_glVertexAttribDivisor - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBDIVISORPROC GLeeFuncPtr_glVertexAttribDivisor; - #define glVertexAttribDivisor GLeeFuncPtr_glVertexAttribDivisor -#endif -#endif - -/* GL_ARB_map_buffer_range */ - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#define __GLEE_GL_ARB_map_buffer_range 1 -/* Constants */ -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#ifndef GLEE_H_DEFINED_glMapBufferRange -#define GLEE_H_DEFINED_glMapBufferRange - typedef void (APIENTRYP GLEEPFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - GLEE_EXTERN GLEEPFNGLMAPBUFFERRANGEPROC GLeeFuncPtr_glMapBufferRange; - #define glMapBufferRange GLeeFuncPtr_glMapBufferRange -#endif -#ifndef GLEE_H_DEFINED_glFlushMappedBufferRange -#define GLEE_H_DEFINED_glFlushMappedBufferRange - typedef void (APIENTRYP GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); - GLEE_EXTERN GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC GLeeFuncPtr_glFlushMappedBufferRange; - #define glFlushMappedBufferRange GLeeFuncPtr_glFlushMappedBufferRange -#endif -#endif - -/* GL_ARB_texture_buffer_object */ - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 -#define __GLEE_GL_ARB_texture_buffer_object 1 -/* Constants */ -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E -#ifndef GLEE_H_DEFINED_glTexBufferARB -#define GLEE_H_DEFINED_glTexBufferARB - typedef void (APIENTRYP GLEEPFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); - GLEE_EXTERN GLEEPFNGLTEXBUFFERARBPROC GLeeFuncPtr_glTexBufferARB; - #define glTexBufferARB GLeeFuncPtr_glTexBufferARB -#endif -#endif - -/* GL_ARB_texture_compression_rgtc */ - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#define __GLEE_GL_ARB_texture_compression_rgtc 1 -/* Constants */ -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#endif - -/* GL_ARB_texture_rg */ - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#define __GLEE_GL_ARB_texture_rg 1 -/* Constants */ -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#endif - -/* GL_ARB_vertex_array_object */ - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#define __GLEE_GL_ARB_vertex_array_object 1 -/* Constants */ -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#ifndef GLEE_H_DEFINED_glBindVertexArray -#define GLEE_H_DEFINED_glBindVertexArray - typedef void (APIENTRYP GLEEPFNGLBINDVERTEXARRAYPROC) (GLuint array); - GLEE_EXTERN GLEEPFNGLBINDVERTEXARRAYPROC GLeeFuncPtr_glBindVertexArray; - #define glBindVertexArray GLeeFuncPtr_glBindVertexArray -#endif -#ifndef GLEE_H_DEFINED_glDeleteVertexArrays -#define GLEE_H_DEFINED_glDeleteVertexArrays - typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint * arrays); - GLEE_EXTERN GLEEPFNGLDELETEVERTEXARRAYSPROC GLeeFuncPtr_glDeleteVertexArrays; - #define glDeleteVertexArrays GLeeFuncPtr_glDeleteVertexArrays -#endif -#ifndef GLEE_H_DEFINED_glGenVertexArrays -#define GLEE_H_DEFINED_glGenVertexArrays - typedef void (APIENTRYP GLEEPFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint * arrays); - GLEE_EXTERN GLEEPFNGLGENVERTEXARRAYSPROC GLeeFuncPtr_glGenVertexArrays; - #define glGenVertexArrays GLeeFuncPtr_glGenVertexArrays -#endif -#ifndef GLEE_H_DEFINED_glIsVertexArray -#define GLEE_H_DEFINED_glIsVertexArray - typedef GLboolean (APIENTRYP GLEEPFNGLISVERTEXARRAYPROC) (GLuint array); - GLEE_EXTERN GLEEPFNGLISVERTEXARRAYPROC GLeeFuncPtr_glIsVertexArray; - #define glIsVertexArray GLeeFuncPtr_glIsVertexArray -#endif -#endif - -/* GL_EXT_abgr */ - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#define __GLEE_GL_EXT_abgr 1 -/* Constants */ -#define GL_ABGR_EXT 0x8000 -#endif - -/* GL_EXT_blend_color */ - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#define __GLEE_GL_EXT_blend_color 1 -/* Constants */ -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#ifndef GLEE_H_DEFINED_glBlendColorEXT -#define GLEE_H_DEFINED_glBlendColorEXT - typedef void (APIENTRYP GLEEPFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - GLEE_EXTERN GLEEPFNGLBLENDCOLOREXTPROC GLeeFuncPtr_glBlendColorEXT; - #define glBlendColorEXT GLeeFuncPtr_glBlendColorEXT -#endif -#endif - -/* GL_EXT_polygon_offset */ - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#define __GLEE_GL_EXT_polygon_offset 1 -/* Constants */ -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#ifndef GLEE_H_DEFINED_glPolygonOffsetEXT -#define GLEE_H_DEFINED_glPolygonOffsetEXT - typedef void (APIENTRYP GLEEPFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); - GLEE_EXTERN GLEEPFNGLPOLYGONOFFSETEXTPROC GLeeFuncPtr_glPolygonOffsetEXT; - #define glPolygonOffsetEXT GLeeFuncPtr_glPolygonOffsetEXT -#endif -#endif - -/* GL_EXT_texture */ - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#define __GLEE_GL_EXT_texture 1 -/* Constants */ -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -/* GL_EXT_texture3D */ - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#define __GLEE_GL_EXT_texture3D 1 -/* Constants */ -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#ifndef GLEE_H_DEFINED_glTexImage3DEXT -#define GLEE_H_DEFINED_glTexImage3DEXT - typedef void (APIENTRYP GLEEPFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXIMAGE3DEXTPROC GLeeFuncPtr_glTexImage3DEXT; - #define glTexImage3DEXT GLeeFuncPtr_glTexImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glTexSubImage3DEXT -#define GLEE_H_DEFINED_glTexSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glTexSubImage3DEXT; - #define glTexSubImage3DEXT GLeeFuncPtr_glTexSubImage3DEXT -#endif -#endif - -/* GL_SGIS_texture_filter4 */ - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#define __GLEE_GL_SGIS_texture_filter4 1 -/* Constants */ -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#ifndef GLEE_H_DEFINED_glGetTexFilterFuncSGIS -#define GLEE_H_DEFINED_glGetTexFilterFuncSGIS - typedef void (APIENTRYP GLEEPFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat * weights); - GLEE_EXTERN GLEEPFNGLGETTEXFILTERFUNCSGISPROC GLeeFuncPtr_glGetTexFilterFuncSGIS; - #define glGetTexFilterFuncSGIS GLeeFuncPtr_glGetTexFilterFuncSGIS -#endif -#ifndef GLEE_H_DEFINED_glTexFilterFuncSGIS -#define GLEE_H_DEFINED_glTexFilterFuncSGIS - typedef void (APIENTRYP GLEEPFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat * weights); - GLEE_EXTERN GLEEPFNGLTEXFILTERFUNCSGISPROC GLeeFuncPtr_glTexFilterFuncSGIS; - #define glTexFilterFuncSGIS GLeeFuncPtr_glTexFilterFuncSGIS -#endif -#endif - -/* GL_EXT_subtexture */ - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#define __GLEE_GL_EXT_subtexture 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glTexSubImage1DEXT -#define GLEE_H_DEFINED_glTexSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glTexSubImage1DEXT; - #define glTexSubImage1DEXT GLeeFuncPtr_glTexSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glTexSubImage2DEXT -#define GLEE_H_DEFINED_glTexSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glTexSubImage2DEXT; - #define glTexSubImage2DEXT GLeeFuncPtr_glTexSubImage2DEXT -#endif -#endif - -/* GL_EXT_copy_texture */ - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#define __GLEE_GL_EXT_copy_texture 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glCopyTexImage1DEXT -#define GLEE_H_DEFINED_glCopyTexImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); - GLEE_EXTERN GLEEPFNGLCOPYTEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexImage1DEXT; - #define glCopyTexImage1DEXT GLeeFuncPtr_glCopyTexImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTexImage2DEXT -#define GLEE_H_DEFINED_glCopyTexImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); - GLEE_EXTERN GLEEPFNGLCOPYTEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexImage2DEXT; - #define glCopyTexImage2DEXT GLeeFuncPtr_glCopyTexImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTexSubImage1DEXT -#define GLEE_H_DEFINED_glCopyTexSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexSubImage1DEXT; - #define glCopyTexSubImage1DEXT GLeeFuncPtr_glCopyTexSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTexSubImage2DEXT -#define GLEE_H_DEFINED_glCopyTexSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexSubImage2DEXT; - #define glCopyTexSubImage2DEXT GLeeFuncPtr_glCopyTexSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTexSubImage3DEXT -#define GLEE_H_DEFINED_glCopyTexSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTexSubImage3DEXT; - #define glCopyTexSubImage3DEXT GLeeFuncPtr_glCopyTexSubImage3DEXT -#endif -#endif - -/* GL_EXT_histogram */ - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#define __GLEE_GL_EXT_histogram 1 -/* Constants */ -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#ifndef GLEE_H_DEFINED_glGetHistogramEXT -#define GLEE_H_DEFINED_glGetHistogramEXT - typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); - GLEE_EXTERN GLEEPFNGLGETHISTOGRAMEXTPROC GLeeFuncPtr_glGetHistogramEXT; - #define glGetHistogramEXT GLeeFuncPtr_glGetHistogramEXT -#endif -#ifndef GLEE_H_DEFINED_glGetHistogramParameterfvEXT -#define GLEE_H_DEFINED_glGetHistogramParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC GLeeFuncPtr_glGetHistogramParameterfvEXT; - #define glGetHistogramParameterfvEXT GLeeFuncPtr_glGetHistogramParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetHistogramParameterivEXT -#define GLEE_H_DEFINED_glGetHistogramParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC GLeeFuncPtr_glGetHistogramParameterivEXT; - #define glGetHistogramParameterivEXT GLeeFuncPtr_glGetHistogramParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMinmaxEXT -#define GLEE_H_DEFINED_glGetMinmaxEXT - typedef void (APIENTRYP GLEEPFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); - GLEE_EXTERN GLEEPFNGLGETMINMAXEXTPROC GLeeFuncPtr_glGetMinmaxEXT; - #define glGetMinmaxEXT GLeeFuncPtr_glGetMinmaxEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMinmaxParameterfvEXT -#define GLEE_H_DEFINED_glGetMinmaxParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMinmaxParameterfvEXT; - #define glGetMinmaxParameterfvEXT GLeeFuncPtr_glGetMinmaxParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMinmaxParameterivEXT -#define GLEE_H_DEFINED_glGetMinmaxParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMinmaxParameterivEXT; - #define glGetMinmaxParameterivEXT GLeeFuncPtr_glGetMinmaxParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glHistogramEXT -#define GLEE_H_DEFINED_glHistogramEXT - typedef void (APIENTRYP GLEEPFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); - GLEE_EXTERN GLEEPFNGLHISTOGRAMEXTPROC GLeeFuncPtr_glHistogramEXT; - #define glHistogramEXT GLeeFuncPtr_glHistogramEXT -#endif -#ifndef GLEE_H_DEFINED_glMinmaxEXT -#define GLEE_H_DEFINED_glMinmaxEXT - typedef void (APIENTRYP GLEEPFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); - GLEE_EXTERN GLEEPFNGLMINMAXEXTPROC GLeeFuncPtr_glMinmaxEXT; - #define glMinmaxEXT GLeeFuncPtr_glMinmaxEXT -#endif -#ifndef GLEE_H_DEFINED_glResetHistogramEXT -#define GLEE_H_DEFINED_glResetHistogramEXT - typedef void (APIENTRYP GLEEPFNGLRESETHISTOGRAMEXTPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLRESETHISTOGRAMEXTPROC GLeeFuncPtr_glResetHistogramEXT; - #define glResetHistogramEXT GLeeFuncPtr_glResetHistogramEXT -#endif -#ifndef GLEE_H_DEFINED_glResetMinmaxEXT -#define GLEE_H_DEFINED_glResetMinmaxEXT - typedef void (APIENTRYP GLEEPFNGLRESETMINMAXEXTPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLRESETMINMAXEXTPROC GLeeFuncPtr_glResetMinmaxEXT; - #define glResetMinmaxEXT GLeeFuncPtr_glResetMinmaxEXT -#endif -#endif - -/* GL_EXT_convolution */ - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#define __GLEE_GL_EXT_convolution 1 -/* Constants */ -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#ifndef GLEE_H_DEFINED_glConvolutionFilter1DEXT -#define GLEE_H_DEFINED_glConvolutionFilter1DEXT - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glConvolutionFilter1DEXT; - #define glConvolutionFilter1DEXT GLeeFuncPtr_glConvolutionFilter1DEXT -#endif -#ifndef GLEE_H_DEFINED_glConvolutionFilter2DEXT -#define GLEE_H_DEFINED_glConvolutionFilter2DEXT - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glConvolutionFilter2DEXT; - #define glConvolutionFilter2DEXT GLeeFuncPtr_glConvolutionFilter2DEXT -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameterfEXT -#define GLEE_H_DEFINED_glConvolutionParameterfEXT - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC GLeeFuncPtr_glConvolutionParameterfEXT; - #define glConvolutionParameterfEXT GLeeFuncPtr_glConvolutionParameterfEXT -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameterfvEXT -#define GLEE_H_DEFINED_glConvolutionParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glConvolutionParameterfvEXT; - #define glConvolutionParameterfvEXT GLeeFuncPtr_glConvolutionParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameteriEXT -#define GLEE_H_DEFINED_glConvolutionParameteriEXT - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC GLeeFuncPtr_glConvolutionParameteriEXT; - #define glConvolutionParameteriEXT GLeeFuncPtr_glConvolutionParameteriEXT -#endif -#ifndef GLEE_H_DEFINED_glConvolutionParameterivEXT -#define GLEE_H_DEFINED_glConvolutionParameterivEXT - typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glConvolutionParameterivEXT; - #define glConvolutionParameterivEXT GLeeFuncPtr_glConvolutionParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter1DEXT -#define GLEE_H_DEFINED_glCopyConvolutionFilter1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter1DEXT; - #define glCopyConvolutionFilter1DEXT GLeeFuncPtr_glCopyConvolutionFilter1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter2DEXT -#define GLEE_H_DEFINED_glCopyConvolutionFilter2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter2DEXT; - #define glCopyConvolutionFilter2DEXT GLeeFuncPtr_glCopyConvolutionFilter2DEXT -#endif -#ifndef GLEE_H_DEFINED_glGetConvolutionFilterEXT -#define GLEE_H_DEFINED_glGetConvolutionFilterEXT - typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image); - GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC GLeeFuncPtr_glGetConvolutionFilterEXT; - #define glGetConvolutionFilterEXT GLeeFuncPtr_glGetConvolutionFilterEXT -#endif -#ifndef GLEE_H_DEFINED_glGetConvolutionParameterfvEXT -#define GLEE_H_DEFINED_glGetConvolutionParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glGetConvolutionParameterfvEXT; - #define glGetConvolutionParameterfvEXT GLeeFuncPtr_glGetConvolutionParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetConvolutionParameterivEXT -#define GLEE_H_DEFINED_glGetConvolutionParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glGetConvolutionParameterivEXT; - #define glGetConvolutionParameterivEXT GLeeFuncPtr_glGetConvolutionParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetSeparableFilterEXT -#define GLEE_H_DEFINED_glGetSeparableFilterEXT - typedef void (APIENTRYP GLEEPFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); - GLEE_EXTERN GLEEPFNGLGETSEPARABLEFILTEREXTPROC GLeeFuncPtr_glGetSeparableFilterEXT; - #define glGetSeparableFilterEXT GLeeFuncPtr_glGetSeparableFilterEXT -#endif -#ifndef GLEE_H_DEFINED_glSeparableFilter2DEXT -#define GLEE_H_DEFINED_glSeparableFilter2DEXT - typedef void (APIENTRYP GLEEPFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); - GLEE_EXTERN GLEEPFNGLSEPARABLEFILTER2DEXTPROC GLeeFuncPtr_glSeparableFilter2DEXT; - #define glSeparableFilter2DEXT GLeeFuncPtr_glSeparableFilter2DEXT -#endif -#endif - -/* GL_SGI_color_matrix */ - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 -#define __GLEE_GL_SGI_color_matrix 1 -/* Constants */ -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -/* GL_SGI_color_table */ - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#define __GLEE_GL_SGI_color_table 1 -/* Constants */ -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#ifndef GLEE_H_DEFINED_glColorTableSGI -#define GLEE_H_DEFINED_glColorTableSGI - typedef void (APIENTRYP GLEEPFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); - GLEE_EXTERN GLEEPFNGLCOLORTABLESGIPROC GLeeFuncPtr_glColorTableSGI; - #define glColorTableSGI GLeeFuncPtr_glColorTableSGI -#endif -#ifndef GLEE_H_DEFINED_glColorTableParameterfvSGI -#define GLEE_H_DEFINED_glColorTableParameterfvSGI - typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glColorTableParameterfvSGI; - #define glColorTableParameterfvSGI GLeeFuncPtr_glColorTableParameterfvSGI -#endif -#ifndef GLEE_H_DEFINED_glColorTableParameterivSGI -#define GLEE_H_DEFINED_glColorTableParameterivSGI - typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glColorTableParameterivSGI; - #define glColorTableParameterivSGI GLeeFuncPtr_glColorTableParameterivSGI -#endif -#ifndef GLEE_H_DEFINED_glCopyColorTableSGI -#define GLEE_H_DEFINED_glCopyColorTableSGI - typedef void (APIENTRYP GLEEPFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYCOLORTABLESGIPROC GLeeFuncPtr_glCopyColorTableSGI; - #define glCopyColorTableSGI GLeeFuncPtr_glCopyColorTableSGI -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableSGI -#define GLEE_H_DEFINED_glGetColorTableSGI - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid * table); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLESGIPROC GLeeFuncPtr_glGetColorTableSGI; - #define glGetColorTableSGI GLeeFuncPtr_glGetColorTableSGI -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableParameterfvSGI -#define GLEE_H_DEFINED_glGetColorTableParameterfvSGI - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glGetColorTableParameterfvSGI; - #define glGetColorTableParameterfvSGI GLeeFuncPtr_glGetColorTableParameterfvSGI -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableParameterivSGI -#define GLEE_H_DEFINED_glGetColorTableParameterivSGI - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glGetColorTableParameterivSGI; - #define glGetColorTableParameterivSGI GLeeFuncPtr_glGetColorTableParameterivSGI -#endif -#endif - -/* GL_SGIS_pixel_texture */ - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#define __GLEE_GL_SGIS_pixel_texture 1 -/* Constants */ -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#ifndef GLEE_H_DEFINED_glPixelTexGenParameteriSGIS -#define GLEE_H_DEFINED_glPixelTexGenParameteriSGIS - typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC GLeeFuncPtr_glPixelTexGenParameteriSGIS; - #define glPixelTexGenParameteriSGIS GLeeFuncPtr_glPixelTexGenParameteriSGIS -#endif -#ifndef GLEE_H_DEFINED_glPixelTexGenParameterivSGIS -#define GLEE_H_DEFINED_glPixelTexGenParameterivSGIS - typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glPixelTexGenParameterivSGIS; - #define glPixelTexGenParameterivSGIS GLeeFuncPtr_glPixelTexGenParameterivSGIS -#endif -#ifndef GLEE_H_DEFINED_glPixelTexGenParameterfSGIS -#define GLEE_H_DEFINED_glPixelTexGenParameterfSGIS - typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC GLeeFuncPtr_glPixelTexGenParameterfSGIS; - #define glPixelTexGenParameterfSGIS GLeeFuncPtr_glPixelTexGenParameterfSGIS -#endif -#ifndef GLEE_H_DEFINED_glPixelTexGenParameterfvSGIS -#define GLEE_H_DEFINED_glPixelTexGenParameterfvSGIS - typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glPixelTexGenParameterfvSGIS; - #define glPixelTexGenParameterfvSGIS GLeeFuncPtr_glPixelTexGenParameterfvSGIS -#endif -#ifndef GLEE_H_DEFINED_glGetPixelTexGenParameterivSGIS -#define GLEE_H_DEFINED_glGetPixelTexGenParameterivSGIS - typedef void (APIENTRYP GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterivSGIS; - #define glGetPixelTexGenParameterivSGIS GLeeFuncPtr_glGetPixelTexGenParameterivSGIS -#endif -#ifndef GLEE_H_DEFINED_glGetPixelTexGenParameterfvSGIS -#define GLEE_H_DEFINED_glGetPixelTexGenParameterfvSGIS - typedef void (APIENTRYP GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS; - #define glGetPixelTexGenParameterfvSGIS GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS -#endif -#endif - -/* GL_SGIX_pixel_texture */ - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#define __GLEE_GL_SGIX_pixel_texture 1 -/* Constants */ -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#ifndef GLEE_H_DEFINED_glPixelTexGenSGIX -#define GLEE_H_DEFINED_glPixelTexGenSGIX - typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENSGIXPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLPIXELTEXGENSGIXPROC GLeeFuncPtr_glPixelTexGenSGIX; - #define glPixelTexGenSGIX GLeeFuncPtr_glPixelTexGenSGIX -#endif -#endif - -/* GL_SGIS_texture4D */ - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#define __GLEE_GL_SGIS_texture4D 1 -/* Constants */ -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#ifndef GLEE_H_DEFINED_glTexImage4DSGIS -#define GLEE_H_DEFINED_glTexImage4DSGIS - typedef void (APIENTRYP GLEEPFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXIMAGE4DSGISPROC GLeeFuncPtr_glTexImage4DSGIS; - #define glTexImage4DSGIS GLeeFuncPtr_glTexImage4DSGIS -#endif -#ifndef GLEE_H_DEFINED_glTexSubImage4DSGIS -#define GLEE_H_DEFINED_glTexSubImage4DSGIS - typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE4DSGISPROC GLeeFuncPtr_glTexSubImage4DSGIS; - #define glTexSubImage4DSGIS GLeeFuncPtr_glTexSubImage4DSGIS -#endif -#endif - -/* GL_SGI_texture_color_table */ - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#define __GLEE_GL_SGI_texture_color_table 1 -/* Constants */ -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -/* GL_EXT_cmyka */ - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#define __GLEE_GL_EXT_cmyka 1 -/* Constants */ -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -/* GL_EXT_texture_object */ - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#define __GLEE_GL_EXT_texture_object 1 -/* Constants */ -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#ifndef GLEE_H_DEFINED_glAreTexturesResidentEXT -#define GLEE_H_DEFINED_glAreTexturesResidentEXT - typedef GLboolean (APIENTRYP GLEEPFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint * textures, GLboolean * residences); - GLEE_EXTERN GLEEPFNGLARETEXTURESRESIDENTEXTPROC GLeeFuncPtr_glAreTexturesResidentEXT; - #define glAreTexturesResidentEXT GLeeFuncPtr_glAreTexturesResidentEXT -#endif -#ifndef GLEE_H_DEFINED_glBindTextureEXT -#define GLEE_H_DEFINED_glBindTextureEXT - typedef void (APIENTRYP GLEEPFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); - GLEE_EXTERN GLEEPFNGLBINDTEXTUREEXTPROC GLeeFuncPtr_glBindTextureEXT; - #define glBindTextureEXT GLeeFuncPtr_glBindTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glDeleteTexturesEXT -#define GLEE_H_DEFINED_glDeleteTexturesEXT - typedef void (APIENTRYP GLEEPFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint * textures); - GLEE_EXTERN GLEEPFNGLDELETETEXTURESEXTPROC GLeeFuncPtr_glDeleteTexturesEXT; - #define glDeleteTexturesEXT GLeeFuncPtr_glDeleteTexturesEXT -#endif -#ifndef GLEE_H_DEFINED_glGenTexturesEXT -#define GLEE_H_DEFINED_glGenTexturesEXT - typedef void (APIENTRYP GLEEPFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint * textures); - GLEE_EXTERN GLEEPFNGLGENTEXTURESEXTPROC GLeeFuncPtr_glGenTexturesEXT; - #define glGenTexturesEXT GLeeFuncPtr_glGenTexturesEXT -#endif -#ifndef GLEE_H_DEFINED_glIsTextureEXT -#define GLEE_H_DEFINED_glIsTextureEXT - typedef GLboolean (APIENTRYP GLEEPFNGLISTEXTUREEXTPROC) (GLuint texture); - GLEE_EXTERN GLEEPFNGLISTEXTUREEXTPROC GLeeFuncPtr_glIsTextureEXT; - #define glIsTextureEXT GLeeFuncPtr_glIsTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glPrioritizeTexturesEXT -#define GLEE_H_DEFINED_glPrioritizeTexturesEXT - typedef void (APIENTRYP GLEEPFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint * textures, const GLclampf * priorities); - GLEE_EXTERN GLEEPFNGLPRIORITIZETEXTURESEXTPROC GLeeFuncPtr_glPrioritizeTexturesEXT; - #define glPrioritizeTexturesEXT GLeeFuncPtr_glPrioritizeTexturesEXT -#endif -#endif - -/* GL_SGIS_detail_texture */ - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#define __GLEE_GL_SGIS_detail_texture 1 -/* Constants */ -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#ifndef GLEE_H_DEFINED_glDetailTexFuncSGIS -#define GLEE_H_DEFINED_glDetailTexFuncSGIS - typedef void (APIENTRYP GLEEPFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat * points); - GLEE_EXTERN GLEEPFNGLDETAILTEXFUNCSGISPROC GLeeFuncPtr_glDetailTexFuncSGIS; - #define glDetailTexFuncSGIS GLeeFuncPtr_glDetailTexFuncSGIS -#endif -#ifndef GLEE_H_DEFINED_glGetDetailTexFuncSGIS -#define GLEE_H_DEFINED_glGetDetailTexFuncSGIS - typedef void (APIENTRYP GLEEPFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat * points); - GLEE_EXTERN GLEEPFNGLGETDETAILTEXFUNCSGISPROC GLeeFuncPtr_glGetDetailTexFuncSGIS; - #define glGetDetailTexFuncSGIS GLeeFuncPtr_glGetDetailTexFuncSGIS -#endif -#endif - -/* GL_SGIS_sharpen_texture */ - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#define __GLEE_GL_SGIS_sharpen_texture 1 -/* Constants */ -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#ifndef GLEE_H_DEFINED_glSharpenTexFuncSGIS -#define GLEE_H_DEFINED_glSharpenTexFuncSGIS - typedef void (APIENTRYP GLEEPFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat * points); - GLEE_EXTERN GLEEPFNGLSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glSharpenTexFuncSGIS; - #define glSharpenTexFuncSGIS GLeeFuncPtr_glSharpenTexFuncSGIS -#endif -#ifndef GLEE_H_DEFINED_glGetSharpenTexFuncSGIS -#define GLEE_H_DEFINED_glGetSharpenTexFuncSGIS - typedef void (APIENTRYP GLEEPFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat * points); - GLEE_EXTERN GLEEPFNGLGETSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glGetSharpenTexFuncSGIS; - #define glGetSharpenTexFuncSGIS GLeeFuncPtr_glGetSharpenTexFuncSGIS -#endif -#endif - -/* GL_EXT_packed_pixels */ - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#define __GLEE_GL_EXT_packed_pixels 1 -/* Constants */ -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -/* GL_SGIS_texture_lod */ - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#define __GLEE_GL_SGIS_texture_lod 1 -/* Constants */ -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -/* GL_SGIS_multisample */ - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#define __GLEE_GL_SGIS_multisample 1 -/* Constants */ -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#ifndef GLEE_H_DEFINED_glSampleMaskSGIS -#define GLEE_H_DEFINED_glSampleMaskSGIS - typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); - GLEE_EXTERN GLEEPFNGLSAMPLEMASKSGISPROC GLeeFuncPtr_glSampleMaskSGIS; - #define glSampleMaskSGIS GLeeFuncPtr_glSampleMaskSGIS -#endif -#ifndef GLEE_H_DEFINED_glSamplePatternSGIS -#define GLEE_H_DEFINED_glSamplePatternSGIS - typedef void (APIENTRYP GLEEPFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); - GLEE_EXTERN GLEEPFNGLSAMPLEPATTERNSGISPROC GLeeFuncPtr_glSamplePatternSGIS; - #define glSamplePatternSGIS GLeeFuncPtr_glSamplePatternSGIS -#endif -#endif - -/* GL_EXT_rescale_normal */ - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#define __GLEE_GL_EXT_rescale_normal 1 -/* Constants */ -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -/* GL_EXT_vertex_array */ - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#define __GLEE_GL_EXT_vertex_array 1 -/* Constants */ -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#ifndef GLEE_H_DEFINED_glArrayElementEXT -#define GLEE_H_DEFINED_glArrayElementEXT - typedef void (APIENTRYP GLEEPFNGLARRAYELEMENTEXTPROC) (GLint i); - GLEE_EXTERN GLEEPFNGLARRAYELEMENTEXTPROC GLeeFuncPtr_glArrayElementEXT; - #define glArrayElementEXT GLeeFuncPtr_glArrayElementEXT -#endif -#ifndef GLEE_H_DEFINED_glColorPointerEXT -#define GLEE_H_DEFINED_glColorPointerEXT - typedef void (APIENTRYP GLEEPFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLCOLORPOINTEREXTPROC GLeeFuncPtr_glColorPointerEXT; - #define glColorPointerEXT GLeeFuncPtr_glColorPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glDrawArraysEXT -#define GLEE_H_DEFINED_glDrawArraysEXT - typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); - GLEE_EXTERN GLEEPFNGLDRAWARRAYSEXTPROC GLeeFuncPtr_glDrawArraysEXT; - #define glDrawArraysEXT GLeeFuncPtr_glDrawArraysEXT -#endif -#ifndef GLEE_H_DEFINED_glEdgeFlagPointerEXT -#define GLEE_H_DEFINED_glEdgeFlagPointerEXT - typedef void (APIENTRYP GLEEPFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean * pointer); - GLEE_EXTERN GLEEPFNGLEDGEFLAGPOINTEREXTPROC GLeeFuncPtr_glEdgeFlagPointerEXT; - #define glEdgeFlagPointerEXT GLeeFuncPtr_glEdgeFlagPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glGetPointervEXT -#define GLEE_H_DEFINED_glGetPointervEXT - typedef void (APIENTRYP GLEEPFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* * params); - GLEE_EXTERN GLEEPFNGLGETPOINTERVEXTPROC GLeeFuncPtr_glGetPointervEXT; - #define glGetPointervEXT GLeeFuncPtr_glGetPointervEXT -#endif -#ifndef GLEE_H_DEFINED_glIndexPointerEXT -#define GLEE_H_DEFINED_glIndexPointerEXT - typedef void (APIENTRYP GLEEPFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLINDEXPOINTEREXTPROC GLeeFuncPtr_glIndexPointerEXT; - #define glIndexPointerEXT GLeeFuncPtr_glIndexPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glNormalPointerEXT -#define GLEE_H_DEFINED_glNormalPointerEXT - typedef void (APIENTRYP GLEEPFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLNORMALPOINTEREXTPROC GLeeFuncPtr_glNormalPointerEXT; - #define glNormalPointerEXT GLeeFuncPtr_glNormalPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glTexCoordPointerEXT -#define GLEE_H_DEFINED_glTexCoordPointerEXT - typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTEREXTPROC GLeeFuncPtr_glTexCoordPointerEXT; - #define glTexCoordPointerEXT GLeeFuncPtr_glTexCoordPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexPointerEXT -#define GLEE_H_DEFINED_glVertexPointerEXT - typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXPOINTEREXTPROC GLeeFuncPtr_glVertexPointerEXT; - #define glVertexPointerEXT GLeeFuncPtr_glVertexPointerEXT -#endif -#endif - -/* GL_EXT_misc_attribute */ - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#define __GLEE_GL_EXT_misc_attribute 1 -/* Constants */ -#endif - -/* GL_SGIS_generate_mipmap */ - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#define __GLEE_GL_SGIS_generate_mipmap 1 -/* Constants */ -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -/* GL_SGIX_clipmap */ - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#define __GLEE_GL_SGIX_clipmap 1 -/* Constants */ -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -/* GL_SGIX_shadow */ - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#define __GLEE_GL_SGIX_shadow 1 -/* Constants */ -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -/* GL_SGIS_texture_edge_clamp */ - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#define __GLEE_GL_SGIS_texture_edge_clamp 1 -/* Constants */ -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -/* GL_SGIS_texture_border_clamp */ - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#define __GLEE_GL_SGIS_texture_border_clamp 1 -/* Constants */ -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -/* GL_EXT_blend_minmax */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#define __GLEE_GL_EXT_blend_minmax 1 -/* Constants */ -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#ifndef GLEE_H_DEFINED_glBlendEquationEXT -#define GLEE_H_DEFINED_glBlendEquationEXT - typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONEXTPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLBLENDEQUATIONEXTPROC GLeeFuncPtr_glBlendEquationEXT; - #define glBlendEquationEXT GLeeFuncPtr_glBlendEquationEXT -#endif -#endif - -/* GL_EXT_blend_subtract */ - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#define __GLEE_GL_EXT_blend_subtract 1 -/* Constants */ -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -/* GL_EXT_blend_logic_op */ - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#define __GLEE_GL_EXT_blend_logic_op 1 -/* Constants */ -#endif - -/* GL_SGIX_interlace */ - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#define __GLEE_GL_SGIX_interlace 1 -/* Constants */ -#define GL_INTERLACE_SGIX 0x8094 -#endif - -/* GL_SGIX_pixel_tiles */ - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#define __GLEE_GL_SGIX_pixel_tiles 1 -/* Constants */ -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -/* GL_SGIS_texture_select */ - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 -#define __GLEE_GL_SGIS_texture_select 1 -/* Constants */ -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -/* GL_SGIX_sprite */ - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#define __GLEE_GL_SGIX_sprite 1 -/* Constants */ -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#ifndef GLEE_H_DEFINED_glSpriteParameterfSGIX -#define GLEE_H_DEFINED_glSpriteParameterfSGIX - typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERFSGIXPROC GLeeFuncPtr_glSpriteParameterfSGIX; - #define glSpriteParameterfSGIX GLeeFuncPtr_glSpriteParameterfSGIX -#endif -#ifndef GLEE_H_DEFINED_glSpriteParameterfvSGIX -#define GLEE_H_DEFINED_glSpriteParameterfvSGIX - typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERFVSGIXPROC GLeeFuncPtr_glSpriteParameterfvSGIX; - #define glSpriteParameterfvSGIX GLeeFuncPtr_glSpriteParameterfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glSpriteParameteriSGIX -#define GLEE_H_DEFINED_glSpriteParameteriSGIX - typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERISGIXPROC GLeeFuncPtr_glSpriteParameteriSGIX; - #define glSpriteParameteriSGIX GLeeFuncPtr_glSpriteParameteriSGIX -#endif -#ifndef GLEE_H_DEFINED_glSpriteParameterivSGIX -#define GLEE_H_DEFINED_glSpriteParameterivSGIX - typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERIVSGIXPROC GLeeFuncPtr_glSpriteParameterivSGIX; - #define glSpriteParameterivSGIX GLeeFuncPtr_glSpriteParameterivSGIX -#endif -#endif - -/* GL_SGIX_texture_multi_buffer */ - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#define __GLEE_GL_SGIX_texture_multi_buffer 1 -/* Constants */ -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -/* GL_EXT_point_parameters */ - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#define __GLEE_GL_EXT_point_parameters 1 -/* Constants */ -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#ifndef GLEE_H_DEFINED_glPointParameterfEXT -#define GLEE_H_DEFINED_glPointParameterfEXT - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFEXTPROC GLeeFuncPtr_glPointParameterfEXT; - #define glPointParameterfEXT GLeeFuncPtr_glPointParameterfEXT -#endif -#ifndef GLEE_H_DEFINED_glPointParameterfvEXT -#define GLEE_H_DEFINED_glPointParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVEXTPROC GLeeFuncPtr_glPointParameterfvEXT; - #define glPointParameterfvEXT GLeeFuncPtr_glPointParameterfvEXT -#endif -#endif - -/* GL_SGIS_point_parameters */ - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#define __GLEE_GL_SGIS_point_parameters 1 -/* Constants */ -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#ifndef GLEE_H_DEFINED_glPointParameterfSGIS -#define GLEE_H_DEFINED_glPointParameterfSGIS - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFSGISPROC GLeeFuncPtr_glPointParameterfSGIS; - #define glPointParameterfSGIS GLeeFuncPtr_glPointParameterfSGIS -#endif -#ifndef GLEE_H_DEFINED_glPointParameterfvSGIS -#define GLEE_H_DEFINED_glPointParameterfvSGIS - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVSGISPROC GLeeFuncPtr_glPointParameterfvSGIS; - #define glPointParameterfvSGIS GLeeFuncPtr_glPointParameterfvSGIS -#endif -#endif - -/* GL_SGIX_instruments */ - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#define __GLEE_GL_SGIX_instruments 1 -/* Constants */ -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#ifndef GLEE_H_DEFINED_glGetInstrumentsSGIX -#define GLEE_H_DEFINED_glGetInstrumentsSGIX - typedef GLint (APIENTRYP GLEEPFNGLGETINSTRUMENTSSGIXPROC) (); - GLEE_EXTERN GLEEPFNGLGETINSTRUMENTSSGIXPROC GLeeFuncPtr_glGetInstrumentsSGIX; - #define glGetInstrumentsSGIX GLeeFuncPtr_glGetInstrumentsSGIX -#endif -#ifndef GLEE_H_DEFINED_glInstrumentsBufferSGIX -#define GLEE_H_DEFINED_glInstrumentsBufferSGIX - typedef void (APIENTRYP GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint * buffer); - GLEE_EXTERN GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC GLeeFuncPtr_glInstrumentsBufferSGIX; - #define glInstrumentsBufferSGIX GLeeFuncPtr_glInstrumentsBufferSGIX -#endif -#ifndef GLEE_H_DEFINED_glPollInstrumentsSGIX -#define GLEE_H_DEFINED_glPollInstrumentsSGIX - typedef GLint (APIENTRYP GLEEPFNGLPOLLINSTRUMENTSSGIXPROC) (GLint * marker_p); - GLEE_EXTERN GLEEPFNGLPOLLINSTRUMENTSSGIXPROC GLeeFuncPtr_glPollInstrumentsSGIX; - #define glPollInstrumentsSGIX GLeeFuncPtr_glPollInstrumentsSGIX -#endif -#ifndef GLEE_H_DEFINED_glReadInstrumentsSGIX -#define GLEE_H_DEFINED_glReadInstrumentsSGIX - typedef void (APIENTRYP GLEEPFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); - GLEE_EXTERN GLEEPFNGLREADINSTRUMENTSSGIXPROC GLeeFuncPtr_glReadInstrumentsSGIX; - #define glReadInstrumentsSGIX GLeeFuncPtr_glReadInstrumentsSGIX -#endif -#ifndef GLEE_H_DEFINED_glStartInstrumentsSGIX -#define GLEE_H_DEFINED_glStartInstrumentsSGIX - typedef void (APIENTRYP GLEEPFNGLSTARTINSTRUMENTSSGIXPROC) (); - GLEE_EXTERN GLEEPFNGLSTARTINSTRUMENTSSGIXPROC GLeeFuncPtr_glStartInstrumentsSGIX; - #define glStartInstrumentsSGIX GLeeFuncPtr_glStartInstrumentsSGIX -#endif -#ifndef GLEE_H_DEFINED_glStopInstrumentsSGIX -#define GLEE_H_DEFINED_glStopInstrumentsSGIX - typedef void (APIENTRYP GLEEPFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); - GLEE_EXTERN GLEEPFNGLSTOPINSTRUMENTSSGIXPROC GLeeFuncPtr_glStopInstrumentsSGIX; - #define glStopInstrumentsSGIX GLeeFuncPtr_glStopInstrumentsSGIX -#endif -#endif - -/* GL_SGIX_texture_scale_bias */ - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#define __GLEE_GL_SGIX_texture_scale_bias 1 -/* Constants */ -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -/* GL_SGIX_framezoom */ - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#define __GLEE_GL_SGIX_framezoom 1 -/* Constants */ -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#ifndef GLEE_H_DEFINED_glFrameZoomSGIX -#define GLEE_H_DEFINED_glFrameZoomSGIX - typedef void (APIENTRYP GLEEPFNGLFRAMEZOOMSGIXPROC) (GLint factor); - GLEE_EXTERN GLEEPFNGLFRAMEZOOMSGIXPROC GLeeFuncPtr_glFrameZoomSGIX; - #define glFrameZoomSGIX GLeeFuncPtr_glFrameZoomSGIX -#endif -#endif - -/* GL_SGIX_tag_sample_buffer */ - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#define __GLEE_GL_SGIX_tag_sample_buffer 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glTagSampleBufferSGIX -#define GLEE_H_DEFINED_glTagSampleBufferSGIX - typedef void (APIENTRYP GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC) (); - GLEE_EXTERN GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC GLeeFuncPtr_glTagSampleBufferSGIX; - #define glTagSampleBufferSGIX GLeeFuncPtr_glTagSampleBufferSGIX -#endif -#endif - -/* GL_FfdMaskSGIX */ - -#ifndef GL_FfdMaskSGIX -#define GL_FfdMaskSGIX 1 -#define __GLEE_GL_FfdMaskSGIX 1 -/* Constants */ -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -/* GL_SGIX_polynomial_ffd */ - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#define __GLEE_GL_SGIX_polynomial_ffd 1 -/* Constants */ -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#ifndef GLEE_H_DEFINED_glDeformationMap3dSGIX -#define GLEE_H_DEFINED_glDeformationMap3dSGIX - typedef void (APIENTRYP GLEEPFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points); - GLEE_EXTERN GLEEPFNGLDEFORMATIONMAP3DSGIXPROC GLeeFuncPtr_glDeformationMap3dSGIX; - #define glDeformationMap3dSGIX GLeeFuncPtr_glDeformationMap3dSGIX -#endif -#ifndef GLEE_H_DEFINED_glDeformationMap3fSGIX -#define GLEE_H_DEFINED_glDeformationMap3fSGIX - typedef void (APIENTRYP GLEEPFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points); - GLEE_EXTERN GLEEPFNGLDEFORMATIONMAP3FSGIXPROC GLeeFuncPtr_glDeformationMap3fSGIX; - #define glDeformationMap3fSGIX GLeeFuncPtr_glDeformationMap3fSGIX -#endif -#ifndef GLEE_H_DEFINED_glDeformSGIX -#define GLEE_H_DEFINED_glDeformSGIX - typedef void (APIENTRYP GLEEPFNGLDEFORMSGIXPROC) (GLbitfield mask); - GLEE_EXTERN GLEEPFNGLDEFORMSGIXPROC GLeeFuncPtr_glDeformSGIX; - #define glDeformSGIX GLeeFuncPtr_glDeformSGIX -#endif -#ifndef GLEE_H_DEFINED_glLoadIdentityDeformationMapSGIX -#define GLEE_H_DEFINED_glLoadIdentityDeformationMapSGIX - typedef void (APIENTRYP GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); - GLEE_EXTERN GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC GLeeFuncPtr_glLoadIdentityDeformationMapSGIX; - #define glLoadIdentityDeformationMapSGIX GLeeFuncPtr_glLoadIdentityDeformationMapSGIX -#endif -#endif - -/* GL_SGIX_reference_plane */ - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#define __GLEE_GL_SGIX_reference_plane 1 -/* Constants */ -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#ifndef GLEE_H_DEFINED_glReferencePlaneSGIX -#define GLEE_H_DEFINED_glReferencePlaneSGIX - typedef void (APIENTRYP GLEEPFNGLREFERENCEPLANESGIXPROC) (const GLdouble * equation); - GLEE_EXTERN GLEEPFNGLREFERENCEPLANESGIXPROC GLeeFuncPtr_glReferencePlaneSGIX; - #define glReferencePlaneSGIX GLeeFuncPtr_glReferencePlaneSGIX -#endif -#endif - -/* GL_SGIX_flush_raster */ - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#define __GLEE_GL_SGIX_flush_raster 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glFlushRasterSGIX -#define GLEE_H_DEFINED_glFlushRasterSGIX - typedef void (APIENTRYP GLEEPFNGLFLUSHRASTERSGIXPROC) (); - GLEE_EXTERN GLEEPFNGLFLUSHRASTERSGIXPROC GLeeFuncPtr_glFlushRasterSGIX; - #define glFlushRasterSGIX GLeeFuncPtr_glFlushRasterSGIX -#endif -#endif - -/* GL_SGIX_depth_texture */ - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#define __GLEE_GL_SGIX_depth_texture 1 -/* Constants */ -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -/* GL_SGIS_fog_function */ - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#define __GLEE_GL_SGIS_fog_function 1 -/* Constants */ -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#ifndef GLEE_H_DEFINED_glFogFuncSGIS -#define GLEE_H_DEFINED_glFogFuncSGIS - typedef void (APIENTRYP GLEEPFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat * points); - GLEE_EXTERN GLEEPFNGLFOGFUNCSGISPROC GLeeFuncPtr_glFogFuncSGIS; - #define glFogFuncSGIS GLeeFuncPtr_glFogFuncSGIS -#endif -#ifndef GLEE_H_DEFINED_glGetFogFuncSGIS -#define GLEE_H_DEFINED_glGetFogFuncSGIS - typedef void (APIENTRYP GLEEPFNGLGETFOGFUNCSGISPROC) (GLfloat * points); - GLEE_EXTERN GLEEPFNGLGETFOGFUNCSGISPROC GLeeFuncPtr_glGetFogFuncSGIS; - #define glGetFogFuncSGIS GLeeFuncPtr_glGetFogFuncSGIS -#endif -#endif - -/* GL_SGIX_fog_offset */ - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#define __GLEE_GL_SGIX_fog_offset 1 -/* Constants */ -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -/* GL_HP_image_transform */ - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#define __GLEE_GL_HP_image_transform 1 -/* Constants */ -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#ifndef GLEE_H_DEFINED_glImageTransformParameteriHP -#define GLEE_H_DEFINED_glImageTransformParameteriHP - typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC GLeeFuncPtr_glImageTransformParameteriHP; - #define glImageTransformParameteriHP GLeeFuncPtr_glImageTransformParameteriHP -#endif -#ifndef GLEE_H_DEFINED_glImageTransformParameterfHP -#define GLEE_H_DEFINED_glImageTransformParameterfHP - typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC GLeeFuncPtr_glImageTransformParameterfHP; - #define glImageTransformParameterfHP GLeeFuncPtr_glImageTransformParameterfHP -#endif -#ifndef GLEE_H_DEFINED_glImageTransformParameterivHP -#define GLEE_H_DEFINED_glImageTransformParameterivHP - typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glImageTransformParameterivHP; - #define glImageTransformParameterivHP GLeeFuncPtr_glImageTransformParameterivHP -#endif -#ifndef GLEE_H_DEFINED_glImageTransformParameterfvHP -#define GLEE_H_DEFINED_glImageTransformParameterfvHP - typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glImageTransformParameterfvHP; - #define glImageTransformParameterfvHP GLeeFuncPtr_glImageTransformParameterfvHP -#endif -#ifndef GLEE_H_DEFINED_glGetImageTransformParameterivHP -#define GLEE_H_DEFINED_glGetImageTransformParameterivHP - typedef void (APIENTRYP GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glGetImageTransformParameterivHP; - #define glGetImageTransformParameterivHP GLeeFuncPtr_glGetImageTransformParameterivHP -#endif -#ifndef GLEE_H_DEFINED_glGetImageTransformParameterfvHP -#define GLEE_H_DEFINED_glGetImageTransformParameterfvHP - typedef void (APIENTRYP GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glGetImageTransformParameterfvHP; - #define glGetImageTransformParameterfvHP GLeeFuncPtr_glGetImageTransformParameterfvHP -#endif -#endif - -/* GL_HP_convolution_border_modes */ - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#define __GLEE_GL_HP_convolution_border_modes 1 -/* Constants */ -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -/* GL_INGR_palette_buffer */ - -#ifndef GL_INGR_palette_buffer -#define GL_INGR_palette_buffer 1 -#define __GLEE_GL_INGR_palette_buffer 1 -/* Constants */ -#endif - -/* GL_SGIX_texture_add_env */ - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#define __GLEE_GL_SGIX_texture_add_env 1 -/* Constants */ -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -/* GL_EXT_color_subtable */ - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#define __GLEE_GL_EXT_color_subtable 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glColorSubTableEXT -#define GLEE_H_DEFINED_glColorSubTableEXT - typedef void (APIENTRYP GLEEPFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLCOLORSUBTABLEEXTPROC GLeeFuncPtr_glColorSubTableEXT; - #define glColorSubTableEXT GLeeFuncPtr_glColorSubTableEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyColorSubTableEXT -#define GLEE_H_DEFINED_glCopyColorSubTableEXT - typedef void (APIENTRYP GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC GLeeFuncPtr_glCopyColorSubTableEXT; - #define glCopyColorSubTableEXT GLeeFuncPtr_glCopyColorSubTableEXT -#endif -#endif - -/* GL_PGI_vertex_hints */ - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#define __GLEE_GL_PGI_vertex_hints 1 -/* Constants */ -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -/* GL_PGI_misc_hints */ - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#define __GLEE_GL_PGI_misc_hints 1 -/* Constants */ -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#ifndef GLEE_H_DEFINED_glHintPGI -#define GLEE_H_DEFINED_glHintPGI - typedef void (APIENTRYP GLEEPFNGLHINTPGIPROC) (GLenum target, GLint mode); - GLEE_EXTERN GLEEPFNGLHINTPGIPROC GLeeFuncPtr_glHintPGI; - #define glHintPGI GLeeFuncPtr_glHintPGI -#endif -#endif - -/* GL_EXT_paletted_texture */ - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#define __GLEE_GL_EXT_paletted_texture 1 -/* Constants */ -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#ifndef GLEE_H_DEFINED_glColorTableEXT -#define GLEE_H_DEFINED_glColorTableEXT - typedef void (APIENTRYP GLEEPFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); - GLEE_EXTERN GLEEPFNGLCOLORTABLEEXTPROC GLeeFuncPtr_glColorTableEXT; - #define glColorTableEXT GLeeFuncPtr_glColorTableEXT -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableEXT -#define GLEE_H_DEFINED_glGetColorTableEXT - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * data); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEEXTPROC GLeeFuncPtr_glGetColorTableEXT; - #define glGetColorTableEXT GLeeFuncPtr_glGetColorTableEXT -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableParameterivEXT -#define GLEE_H_DEFINED_glGetColorTableParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLeeFuncPtr_glGetColorTableParameterivEXT; - #define glGetColorTableParameterivEXT GLeeFuncPtr_glGetColorTableParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetColorTableParameterfvEXT -#define GLEE_H_DEFINED_glGetColorTableParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLeeFuncPtr_glGetColorTableParameterfvEXT; - #define glGetColorTableParameterfvEXT GLeeFuncPtr_glGetColorTableParameterfvEXT -#endif -#endif - -/* GL_EXT_clip_volume_hint */ - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#define __GLEE_GL_EXT_clip_volume_hint 1 -/* Constants */ -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -/* GL_SGIX_list_priority */ - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#define __GLEE_GL_SGIX_list_priority 1 -/* Constants */ -#define GL_LIST_PRIORITY_SGIX 0x8182 -#ifndef GLEE_H_DEFINED_glGetListParameterfvSGIX -#define GLEE_H_DEFINED_glGetListParameterfvSGIX - typedef void (APIENTRYP GLEEPFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glGetListParameterfvSGIX; - #define glGetListParameterfvSGIX GLeeFuncPtr_glGetListParameterfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glGetListParameterivSGIX -#define GLEE_H_DEFINED_glGetListParameterivSGIX - typedef void (APIENTRYP GLEEPFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glGetListParameterivSGIX; - #define glGetListParameterivSGIX GLeeFuncPtr_glGetListParameterivSGIX -#endif -#ifndef GLEE_H_DEFINED_glListParameterfSGIX -#define GLEE_H_DEFINED_glListParameterfSGIX - typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLLISTPARAMETERFSGIXPROC GLeeFuncPtr_glListParameterfSGIX; - #define glListParameterfSGIX GLeeFuncPtr_glListParameterfSGIX -#endif -#ifndef GLEE_H_DEFINED_glListParameterfvSGIX -#define GLEE_H_DEFINED_glListParameterfvSGIX - typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glListParameterfvSGIX; - #define glListParameterfvSGIX GLeeFuncPtr_glListParameterfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glListParameteriSGIX -#define GLEE_H_DEFINED_glListParameteriSGIX - typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLLISTPARAMETERISGIXPROC GLeeFuncPtr_glListParameteriSGIX; - #define glListParameteriSGIX GLeeFuncPtr_glListParameteriSGIX -#endif -#ifndef GLEE_H_DEFINED_glListParameterivSGIX -#define GLEE_H_DEFINED_glListParameterivSGIX - typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glListParameterivSGIX; - #define glListParameterivSGIX GLeeFuncPtr_glListParameterivSGIX -#endif -#endif - -/* GL_SGIX_ir_instrument1 */ - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#define __GLEE_GL_SGIX_ir_instrument1 1 -/* Constants */ -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -/* GL_SGIX_calligraphic_fragment */ - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#define __GLEE_GL_SGIX_calligraphic_fragment 1 -/* Constants */ -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -/* GL_SGIX_texture_lod_bias */ - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#define __GLEE_GL_SGIX_texture_lod_bias 1 -/* Constants */ -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -/* GL_SGIX_shadow_ambient */ - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#define __GLEE_GL_SGIX_shadow_ambient 1 -/* Constants */ -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -/* GL_EXT_index_texture */ - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#define __GLEE_GL_EXT_index_texture 1 -/* Constants */ -#endif - -/* GL_EXT_index_material */ - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#define __GLEE_GL_EXT_index_material 1 -/* Constants */ -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#ifndef GLEE_H_DEFINED_glIndexMaterialEXT -#define GLEE_H_DEFINED_glIndexMaterialEXT - typedef void (APIENTRYP GLEEPFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); - GLEE_EXTERN GLEEPFNGLINDEXMATERIALEXTPROC GLeeFuncPtr_glIndexMaterialEXT; - #define glIndexMaterialEXT GLeeFuncPtr_glIndexMaterialEXT -#endif -#endif - -/* GL_EXT_index_func */ - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#define __GLEE_GL_EXT_index_func 1 -/* Constants */ -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#ifndef GLEE_H_DEFINED_glIndexFuncEXT -#define GLEE_H_DEFINED_glIndexFuncEXT - typedef void (APIENTRYP GLEEPFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); - GLEE_EXTERN GLEEPFNGLINDEXFUNCEXTPROC GLeeFuncPtr_glIndexFuncEXT; - #define glIndexFuncEXT GLeeFuncPtr_glIndexFuncEXT -#endif -#endif - -/* GL_EXT_index_array_formats */ - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#define __GLEE_GL_EXT_index_array_formats 1 -/* Constants */ -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -/* GL_EXT_compiled_vertex_array */ - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#define __GLEE_GL_EXT_compiled_vertex_array 1 -/* Constants */ -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#ifndef GLEE_H_DEFINED_glLockArraysEXT -#define GLEE_H_DEFINED_glLockArraysEXT - typedef void (APIENTRYP GLEEPFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); - GLEE_EXTERN GLEEPFNGLLOCKARRAYSEXTPROC GLeeFuncPtr_glLockArraysEXT; - #define glLockArraysEXT GLeeFuncPtr_glLockArraysEXT -#endif -#ifndef GLEE_H_DEFINED_glUnlockArraysEXT -#define GLEE_H_DEFINED_glUnlockArraysEXT - typedef void (APIENTRYP GLEEPFNGLUNLOCKARRAYSEXTPROC) (); - GLEE_EXTERN GLEEPFNGLUNLOCKARRAYSEXTPROC GLeeFuncPtr_glUnlockArraysEXT; - #define glUnlockArraysEXT GLeeFuncPtr_glUnlockArraysEXT -#endif -#endif - -/* GL_EXT_cull_vertex */ - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#define __GLEE_GL_EXT_cull_vertex 1 -/* Constants */ -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#ifndef GLEE_H_DEFINED_glCullParameterdvEXT -#define GLEE_H_DEFINED_glCullParameterdvEXT - typedef void (APIENTRYP GLEEPFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble * params); - GLEE_EXTERN GLEEPFNGLCULLPARAMETERDVEXTPROC GLeeFuncPtr_glCullParameterdvEXT; - #define glCullParameterdvEXT GLeeFuncPtr_glCullParameterdvEXT -#endif -#ifndef GLEE_H_DEFINED_glCullParameterfvEXT -#define GLEE_H_DEFINED_glCullParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLCULLPARAMETERFVEXTPROC GLeeFuncPtr_glCullParameterfvEXT; - #define glCullParameterfvEXT GLeeFuncPtr_glCullParameterfvEXT -#endif -#endif - -/* GL_SGIX_ycrcb */ - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#define __GLEE_GL_SGIX_ycrcb 1 -/* Constants */ -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -/* GL_SGIX_fragment_lighting */ - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#define __GLEE_GL_SGIX_fragment_lighting 1 -/* Constants */ -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#ifndef GLEE_H_DEFINED_glFragmentColorMaterialSGIX -#define GLEE_H_DEFINED_glFragmentColorMaterialSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); - GLEE_EXTERN GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC GLeeFuncPtr_glFragmentColorMaterialSGIX; - #define glFragmentColorMaterialSGIX GLeeFuncPtr_glFragmentColorMaterialSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightfSGIX -#define GLEE_H_DEFINED_glFragmentLightfSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFSGIXPROC GLeeFuncPtr_glFragmentLightfSGIX; - #define glFragmentLightfSGIX GLeeFuncPtr_glFragmentLightfSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightfvSGIX -#define GLEE_H_DEFINED_glFragmentLightfvSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glFragmentLightfvSGIX; - #define glFragmentLightfvSGIX GLeeFuncPtr_glFragmentLightfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightiSGIX -#define GLEE_H_DEFINED_glFragmentLightiSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTISGIXPROC GLeeFuncPtr_glFragmentLightiSGIX; - #define glFragmentLightiSGIX GLeeFuncPtr_glFragmentLightiSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightivSGIX -#define GLEE_H_DEFINED_glFragmentLightivSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glFragmentLightivSGIX; - #define glFragmentLightivSGIX GLeeFuncPtr_glFragmentLightivSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModelfSGIX -#define GLEE_H_DEFINED_glFragmentLightModelfSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC GLeeFuncPtr_glFragmentLightModelfSGIX; - #define glFragmentLightModelfSGIX GLeeFuncPtr_glFragmentLightModelfSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModelfvSGIX -#define GLEE_H_DEFINED_glFragmentLightModelfvSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC GLeeFuncPtr_glFragmentLightModelfvSGIX; - #define glFragmentLightModelfvSGIX GLeeFuncPtr_glFragmentLightModelfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModeliSGIX -#define GLEE_H_DEFINED_glFragmentLightModeliSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC GLeeFuncPtr_glFragmentLightModeliSGIX; - #define glFragmentLightModeliSGIX GLeeFuncPtr_glFragmentLightModeliSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModelivSGIX -#define GLEE_H_DEFINED_glFragmentLightModelivSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC GLeeFuncPtr_glFragmentLightModelivSGIX; - #define glFragmentLightModelivSGIX GLeeFuncPtr_glFragmentLightModelivSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialfSGIX -#define GLEE_H_DEFINED_glFragmentMaterialfSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFSGIXPROC GLeeFuncPtr_glFragmentMaterialfSGIX; - #define glFragmentMaterialfSGIX GLeeFuncPtr_glFragmentMaterialfSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialfvSGIX -#define GLEE_H_DEFINED_glFragmentMaterialfvSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glFragmentMaterialfvSGIX; - #define glFragmentMaterialfvSGIX GLeeFuncPtr_glFragmentMaterialfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialiSGIX -#define GLEE_H_DEFINED_glFragmentMaterialiSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALISGIXPROC GLeeFuncPtr_glFragmentMaterialiSGIX; - #define glFragmentMaterialiSGIX GLeeFuncPtr_glFragmentMaterialiSGIX -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialivSGIX -#define GLEE_H_DEFINED_glFragmentMaterialivSGIX - typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glFragmentMaterialivSGIX; - #define glFragmentMaterialivSGIX GLeeFuncPtr_glFragmentMaterialivSGIX -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentLightfvSGIX -#define GLEE_H_DEFINED_glGetFragmentLightfvSGIX - typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glGetFragmentLightfvSGIX; - #define glGetFragmentLightfvSGIX GLeeFuncPtr_glGetFragmentLightfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentLightivSGIX -#define GLEE_H_DEFINED_glGetFragmentLightivSGIX - typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glGetFragmentLightivSGIX; - #define glGetFragmentLightivSGIX GLeeFuncPtr_glGetFragmentLightivSGIX -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentMaterialfvSGIX -#define GLEE_H_DEFINED_glGetFragmentMaterialfvSGIX - typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialfvSGIX; - #define glGetFragmentMaterialfvSGIX GLeeFuncPtr_glGetFragmentMaterialfvSGIX -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentMaterialivSGIX -#define GLEE_H_DEFINED_glGetFragmentMaterialivSGIX - typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialivSGIX; - #define glGetFragmentMaterialivSGIX GLeeFuncPtr_glGetFragmentMaterialivSGIX -#endif -#ifndef GLEE_H_DEFINED_glLightEnviSGIX -#define GLEE_H_DEFINED_glLightEnviSGIX - typedef void (APIENTRYP GLEEPFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLLIGHTENVISGIXPROC GLeeFuncPtr_glLightEnviSGIX; - #define glLightEnviSGIX GLeeFuncPtr_glLightEnviSGIX -#endif -#endif - -/* GL_IBM_rasterpos_clip */ - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#define __GLEE_GL_IBM_rasterpos_clip 1 -/* Constants */ -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -/* GL_HP_texture_lighting */ - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#define __GLEE_GL_HP_texture_lighting 1 -/* Constants */ -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -/* GL_EXT_draw_range_elements */ - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#define __GLEE_GL_EXT_draw_range_elements 1 -/* Constants */ -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#ifndef GLEE_H_DEFINED_glDrawRangeElementsEXT -#define GLEE_H_DEFINED_glDrawRangeElementsEXT - typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); - GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTSEXTPROC GLeeFuncPtr_glDrawRangeElementsEXT; - #define glDrawRangeElementsEXT GLeeFuncPtr_glDrawRangeElementsEXT -#endif -#endif - -/* GL_WIN_phong_shading */ - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#define __GLEE_GL_WIN_phong_shading 1 -/* Constants */ -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -/* GL_WIN_specular_fog */ - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#define __GLEE_GL_WIN_specular_fog 1 -/* Constants */ -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -/* GL_EXT_light_texture */ - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#define __GLEE_GL_EXT_light_texture 1 -/* Constants */ -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -#ifndef GLEE_H_DEFINED_glApplyTextureEXT -#define GLEE_H_DEFINED_glApplyTextureEXT - typedef void (APIENTRYP GLEEPFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLAPPLYTEXTUREEXTPROC GLeeFuncPtr_glApplyTextureEXT; - #define glApplyTextureEXT GLeeFuncPtr_glApplyTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureLightEXT -#define GLEE_H_DEFINED_glTextureLightEXT - typedef void (APIENTRYP GLEEPFNGLTEXTURELIGHTEXTPROC) (GLenum pname); - GLEE_EXTERN GLEEPFNGLTEXTURELIGHTEXTPROC GLeeFuncPtr_glTextureLightEXT; - #define glTextureLightEXT GLeeFuncPtr_glTextureLightEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureMaterialEXT -#define GLEE_H_DEFINED_glTextureMaterialEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); - GLEE_EXTERN GLEEPFNGLTEXTUREMATERIALEXTPROC GLeeFuncPtr_glTextureMaterialEXT; - #define glTextureMaterialEXT GLeeFuncPtr_glTextureMaterialEXT -#endif -#endif - -/* GL_SGIX_blend_alpha_minmax */ - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#define __GLEE_GL_SGIX_blend_alpha_minmax 1 -/* Constants */ -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -/* GL_SGIX_impact_pixel_texture */ - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_SGIX_impact_pixel_texture 1 -#define __GLEE_GL_SGIX_impact_pixel_texture 1 -/* Constants */ -#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 -#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 -#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 -#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 -#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 -#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 -#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A -#endif - -/* GL_EXT_bgra */ - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#define __GLEE_GL_EXT_bgra 1 -/* Constants */ -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -/* GL_SGIX_async */ - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#define __GLEE_GL_SGIX_async 1 -/* Constants */ -#define GL_ASYNC_MARKER_SGIX 0x8329 -#ifndef GLEE_H_DEFINED_glAsyncMarkerSGIX -#define GLEE_H_DEFINED_glAsyncMarkerSGIX - typedef void (APIENTRYP GLEEPFNGLASYNCMARKERSGIXPROC) (GLuint marker); - GLEE_EXTERN GLEEPFNGLASYNCMARKERSGIXPROC GLeeFuncPtr_glAsyncMarkerSGIX; - #define glAsyncMarkerSGIX GLeeFuncPtr_glAsyncMarkerSGIX -#endif -#ifndef GLEE_H_DEFINED_glFinishAsyncSGIX -#define GLEE_H_DEFINED_glFinishAsyncSGIX - typedef GLint (APIENTRYP GLEEPFNGLFINISHASYNCSGIXPROC) (GLuint * markerp); - GLEE_EXTERN GLEEPFNGLFINISHASYNCSGIXPROC GLeeFuncPtr_glFinishAsyncSGIX; - #define glFinishAsyncSGIX GLeeFuncPtr_glFinishAsyncSGIX -#endif -#ifndef GLEE_H_DEFINED_glPollAsyncSGIX -#define GLEE_H_DEFINED_glPollAsyncSGIX - typedef GLint (APIENTRYP GLEEPFNGLPOLLASYNCSGIXPROC) (GLuint * markerp); - GLEE_EXTERN GLEEPFNGLPOLLASYNCSGIXPROC GLeeFuncPtr_glPollAsyncSGIX; - #define glPollAsyncSGIX GLeeFuncPtr_glPollAsyncSGIX -#endif -#ifndef GLEE_H_DEFINED_glGenAsyncMarkersSGIX -#define GLEE_H_DEFINED_glGenAsyncMarkersSGIX - typedef GLuint (APIENTRYP GLEEPFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); - GLEE_EXTERN GLEEPFNGLGENASYNCMARKERSSGIXPROC GLeeFuncPtr_glGenAsyncMarkersSGIX; - #define glGenAsyncMarkersSGIX GLeeFuncPtr_glGenAsyncMarkersSGIX -#endif -#ifndef GLEE_H_DEFINED_glDeleteAsyncMarkersSGIX -#define GLEE_H_DEFINED_glDeleteAsyncMarkersSGIX - typedef void (APIENTRYP GLEEPFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); - GLEE_EXTERN GLEEPFNGLDELETEASYNCMARKERSSGIXPROC GLeeFuncPtr_glDeleteAsyncMarkersSGIX; - #define glDeleteAsyncMarkersSGIX GLeeFuncPtr_glDeleteAsyncMarkersSGIX -#endif -#ifndef GLEE_H_DEFINED_glIsAsyncMarkerSGIX -#define GLEE_H_DEFINED_glIsAsyncMarkerSGIX - typedef GLboolean (APIENTRYP GLEEPFNGLISASYNCMARKERSGIXPROC) (GLuint marker); - GLEE_EXTERN GLEEPFNGLISASYNCMARKERSGIXPROC GLeeFuncPtr_glIsAsyncMarkerSGIX; - #define glIsAsyncMarkerSGIX GLeeFuncPtr_glIsAsyncMarkerSGIX -#endif -#endif - -/* GL_SGIX_async_pixel */ - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#define __GLEE_GL_SGIX_async_pixel 1 -/* Constants */ -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -/* GL_SGIX_async_histogram */ - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#define __GLEE_GL_SGIX_async_histogram 1 -/* Constants */ -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -/* GL_INTEL_texture_scissor */ - -#ifndef GL_INTEL_texture_scissor -#define GL_INTEL_texture_scissor 1 -#define __GLEE_GL_INTEL_texture_scissor 1 -/* Constants */ -#endif - -/* GL_INTEL_parallel_arrays */ - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#define __GLEE_GL_INTEL_parallel_arrays 1 -/* Constants */ -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#ifndef GLEE_H_DEFINED_glVertexPointervINTEL -#define GLEE_H_DEFINED_glVertexPointervINTEL - typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXPOINTERVINTELPROC GLeeFuncPtr_glVertexPointervINTEL; - #define glVertexPointervINTEL GLeeFuncPtr_glVertexPointervINTEL -#endif -#ifndef GLEE_H_DEFINED_glNormalPointervINTEL -#define GLEE_H_DEFINED_glNormalPointervINTEL - typedef void (APIENTRYP GLEEPFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLNORMALPOINTERVINTELPROC GLeeFuncPtr_glNormalPointervINTEL; - #define glNormalPointervINTEL GLeeFuncPtr_glNormalPointervINTEL -#endif -#ifndef GLEE_H_DEFINED_glColorPointervINTEL -#define GLEE_H_DEFINED_glColorPointervINTEL - typedef void (APIENTRYP GLEEPFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLCOLORPOINTERVINTELPROC GLeeFuncPtr_glColorPointervINTEL; - #define glColorPointervINTEL GLeeFuncPtr_glColorPointervINTEL -#endif -#ifndef GLEE_H_DEFINED_glTexCoordPointervINTEL -#define GLEE_H_DEFINED_glTexCoordPointervINTEL - typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTERVINTELPROC GLeeFuncPtr_glTexCoordPointervINTEL; - #define glTexCoordPointervINTEL GLeeFuncPtr_glTexCoordPointervINTEL -#endif -#endif - -/* GL_HP_occlusion_test */ - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#define __GLEE_GL_HP_occlusion_test 1 -/* Constants */ -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -/* GL_EXT_pixel_transform */ - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#define __GLEE_GL_EXT_pixel_transform 1 -/* Constants */ -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#ifndef GLEE_H_DEFINED_glPixelTransformParameteriEXT -#define GLEE_H_DEFINED_glPixelTransformParameteriEXT - typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC GLeeFuncPtr_glPixelTransformParameteriEXT; - #define glPixelTransformParameteriEXT GLeeFuncPtr_glPixelTransformParameteriEXT -#endif -#ifndef GLEE_H_DEFINED_glPixelTransformParameterfEXT -#define GLEE_H_DEFINED_glPixelTransformParameterfEXT - typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC GLeeFuncPtr_glPixelTransformParameterfEXT; - #define glPixelTransformParameterfEXT GLeeFuncPtr_glPixelTransformParameterfEXT -#endif -#ifndef GLEE_H_DEFINED_glPixelTransformParameterivEXT -#define GLEE_H_DEFINED_glPixelTransformParameterivEXT - typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC GLeeFuncPtr_glPixelTransformParameterivEXT; - #define glPixelTransformParameterivEXT GLeeFuncPtr_glPixelTransformParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glPixelTransformParameterfvEXT -#define GLEE_H_DEFINED_glPixelTransformParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC GLeeFuncPtr_glPixelTransformParameterfvEXT; - #define glPixelTransformParameterfvEXT GLeeFuncPtr_glPixelTransformParameterfvEXT -#endif -#endif - -/* GL_EXT_pixel_transform_color_table */ - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#define __GLEE_GL_EXT_pixel_transform_color_table 1 -/* Constants */ -#endif - -/* GL_EXT_shared_texture_palette */ - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#define __GLEE_GL_EXT_shared_texture_palette 1 -/* Constants */ -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -/* GL_EXT_separate_specular_color */ - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#define __GLEE_GL_EXT_separate_specular_color 1 -/* Constants */ -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -/* GL_EXT_secondary_color */ - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#define __GLEE_GL_EXT_secondary_color 1 -/* Constants */ -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#ifndef GLEE_H_DEFINED_glSecondaryColor3bEXT -#define GLEE_H_DEFINED_glSecondaryColor3bEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BEXTPROC GLeeFuncPtr_glSecondaryColor3bEXT; - #define glSecondaryColor3bEXT GLeeFuncPtr_glSecondaryColor3bEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3bvEXT -#define GLEE_H_DEFINED_glSecondaryColor3bvEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BVEXTPROC GLeeFuncPtr_glSecondaryColor3bvEXT; - #define glSecondaryColor3bvEXT GLeeFuncPtr_glSecondaryColor3bvEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3dEXT -#define GLEE_H_DEFINED_glSecondaryColor3dEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DEXTPROC GLeeFuncPtr_glSecondaryColor3dEXT; - #define glSecondaryColor3dEXT GLeeFuncPtr_glSecondaryColor3dEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3dvEXT -#define GLEE_H_DEFINED_glSecondaryColor3dvEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DVEXTPROC GLeeFuncPtr_glSecondaryColor3dvEXT; - #define glSecondaryColor3dvEXT GLeeFuncPtr_glSecondaryColor3dvEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3fEXT -#define GLEE_H_DEFINED_glSecondaryColor3fEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FEXTPROC GLeeFuncPtr_glSecondaryColor3fEXT; - #define glSecondaryColor3fEXT GLeeFuncPtr_glSecondaryColor3fEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3fvEXT -#define GLEE_H_DEFINED_glSecondaryColor3fvEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FVEXTPROC GLeeFuncPtr_glSecondaryColor3fvEXT; - #define glSecondaryColor3fvEXT GLeeFuncPtr_glSecondaryColor3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3iEXT -#define GLEE_H_DEFINED_glSecondaryColor3iEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IEXTPROC GLeeFuncPtr_glSecondaryColor3iEXT; - #define glSecondaryColor3iEXT GLeeFuncPtr_glSecondaryColor3iEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3ivEXT -#define GLEE_H_DEFINED_glSecondaryColor3ivEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IVEXTPROC GLeeFuncPtr_glSecondaryColor3ivEXT; - #define glSecondaryColor3ivEXT GLeeFuncPtr_glSecondaryColor3ivEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3sEXT -#define GLEE_H_DEFINED_glSecondaryColor3sEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SEXTPROC GLeeFuncPtr_glSecondaryColor3sEXT; - #define glSecondaryColor3sEXT GLeeFuncPtr_glSecondaryColor3sEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3svEXT -#define GLEE_H_DEFINED_glSecondaryColor3svEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SVEXTPROC GLeeFuncPtr_glSecondaryColor3svEXT; - #define glSecondaryColor3svEXT GLeeFuncPtr_glSecondaryColor3svEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3ubEXT -#define GLEE_H_DEFINED_glSecondaryColor3ubEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBEXTPROC GLeeFuncPtr_glSecondaryColor3ubEXT; - #define glSecondaryColor3ubEXT GLeeFuncPtr_glSecondaryColor3ubEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3ubvEXT -#define GLEE_H_DEFINED_glSecondaryColor3ubvEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC GLeeFuncPtr_glSecondaryColor3ubvEXT; - #define glSecondaryColor3ubvEXT GLeeFuncPtr_glSecondaryColor3ubvEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3uiEXT -#define GLEE_H_DEFINED_glSecondaryColor3uiEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIEXTPROC GLeeFuncPtr_glSecondaryColor3uiEXT; - #define glSecondaryColor3uiEXT GLeeFuncPtr_glSecondaryColor3uiEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3uivEXT -#define GLEE_H_DEFINED_glSecondaryColor3uivEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC GLeeFuncPtr_glSecondaryColor3uivEXT; - #define glSecondaryColor3uivEXT GLeeFuncPtr_glSecondaryColor3uivEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3usEXT -#define GLEE_H_DEFINED_glSecondaryColor3usEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USEXTPROC GLeeFuncPtr_glSecondaryColor3usEXT; - #define glSecondaryColor3usEXT GLeeFuncPtr_glSecondaryColor3usEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3usvEXT -#define GLEE_H_DEFINED_glSecondaryColor3usvEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USVEXTPROC GLeeFuncPtr_glSecondaryColor3usvEXT; - #define glSecondaryColor3usvEXT GLeeFuncPtr_glSecondaryColor3usvEXT -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColorPointerEXT -#define GLEE_H_DEFINED_glSecondaryColorPointerEXT - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC GLeeFuncPtr_glSecondaryColorPointerEXT; - #define glSecondaryColorPointerEXT GLeeFuncPtr_glSecondaryColorPointerEXT -#endif -#endif - -/* GL_EXT_texture_perturb_normal */ - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#define __GLEE_GL_EXT_texture_perturb_normal 1 -/* Constants */ -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#ifndef GLEE_H_DEFINED_glTextureNormalEXT -#define GLEE_H_DEFINED_glTextureNormalEXT - typedef void (APIENTRYP GLEEPFNGLTEXTURENORMALEXTPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLTEXTURENORMALEXTPROC GLeeFuncPtr_glTextureNormalEXT; - #define glTextureNormalEXT GLeeFuncPtr_glTextureNormalEXT -#endif -#endif - -/* GL_EXT_multi_draw_arrays */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#define __GLEE_GL_EXT_multi_draw_arrays 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glMultiDrawArraysEXT -#define GLEE_H_DEFINED_glMultiDrawArraysEXT - typedef void (APIENTRYP GLEEPFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLMULTIDRAWARRAYSEXTPROC GLeeFuncPtr_glMultiDrawArraysEXT; - #define glMultiDrawArraysEXT GLeeFuncPtr_glMultiDrawArraysEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiDrawElementsEXT -#define GLEE_H_DEFINED_glMultiDrawElementsEXT - typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTSEXTPROC GLeeFuncPtr_glMultiDrawElementsEXT; - #define glMultiDrawElementsEXT GLeeFuncPtr_glMultiDrawElementsEXT -#endif -#endif - -/* GL_EXT_fog_coord */ - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#define __GLEE_GL_EXT_fog_coord 1 -/* Constants */ -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#ifndef GLEE_H_DEFINED_glFogCoordfEXT -#define GLEE_H_DEFINED_glFogCoordfEXT - typedef void (APIENTRYP GLEEPFNGLFOGCOORDFEXTPROC) (GLfloat coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDFEXTPROC GLeeFuncPtr_glFogCoordfEXT; - #define glFogCoordfEXT GLeeFuncPtr_glFogCoordfEXT -#endif -#ifndef GLEE_H_DEFINED_glFogCoordfvEXT -#define GLEE_H_DEFINED_glFogCoordfvEXT - typedef void (APIENTRYP GLEEPFNGLFOGCOORDFVEXTPROC) (const GLfloat * coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDFVEXTPROC GLeeFuncPtr_glFogCoordfvEXT; - #define glFogCoordfvEXT GLeeFuncPtr_glFogCoordfvEXT -#endif -#ifndef GLEE_H_DEFINED_glFogCoorddEXT -#define GLEE_H_DEFINED_glFogCoorddEXT - typedef void (APIENTRYP GLEEPFNGLFOGCOORDDEXTPROC) (GLdouble coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDDEXTPROC GLeeFuncPtr_glFogCoorddEXT; - #define glFogCoorddEXT GLeeFuncPtr_glFogCoorddEXT -#endif -#ifndef GLEE_H_DEFINED_glFogCoorddvEXT -#define GLEE_H_DEFINED_glFogCoorddvEXT - typedef void (APIENTRYP GLEEPFNGLFOGCOORDDVEXTPROC) (const GLdouble * coord); - GLEE_EXTERN GLEEPFNGLFOGCOORDDVEXTPROC GLeeFuncPtr_glFogCoorddvEXT; - #define glFogCoorddvEXT GLeeFuncPtr_glFogCoorddvEXT -#endif -#ifndef GLEE_H_DEFINED_glFogCoordPointerEXT -#define GLEE_H_DEFINED_glFogCoordPointerEXT - typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTEREXTPROC GLeeFuncPtr_glFogCoordPointerEXT; - #define glFogCoordPointerEXT GLeeFuncPtr_glFogCoordPointerEXT -#endif -#endif - -/* GL_REND_screen_coordinates */ - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#define __GLEE_GL_REND_screen_coordinates 1 -/* Constants */ -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -/* GL_EXT_coordinate_frame */ - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#define __GLEE_GL_EXT_coordinate_frame 1 -/* Constants */ -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#ifndef GLEE_H_DEFINED_glTangent3bEXT -#define GLEE_H_DEFINED_glTangent3bEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); - GLEE_EXTERN GLEEPFNGLTANGENT3BEXTPROC GLeeFuncPtr_glTangent3bEXT; - #define glTangent3bEXT GLeeFuncPtr_glTangent3bEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3bvEXT -#define GLEE_H_DEFINED_glTangent3bvEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3BVEXTPROC) (const GLbyte * v); - GLEE_EXTERN GLEEPFNGLTANGENT3BVEXTPROC GLeeFuncPtr_glTangent3bvEXT; - #define glTangent3bvEXT GLeeFuncPtr_glTangent3bvEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3dEXT -#define GLEE_H_DEFINED_glTangent3dEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); - GLEE_EXTERN GLEEPFNGLTANGENT3DEXTPROC GLeeFuncPtr_glTangent3dEXT; - #define glTangent3dEXT GLeeFuncPtr_glTangent3dEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3dvEXT -#define GLEE_H_DEFINED_glTangent3dvEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3DVEXTPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLTANGENT3DVEXTPROC GLeeFuncPtr_glTangent3dvEXT; - #define glTangent3dvEXT GLeeFuncPtr_glTangent3dvEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3fEXT -#define GLEE_H_DEFINED_glTangent3fEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); - GLEE_EXTERN GLEEPFNGLTANGENT3FEXTPROC GLeeFuncPtr_glTangent3fEXT; - #define glTangent3fEXT GLeeFuncPtr_glTangent3fEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3fvEXT -#define GLEE_H_DEFINED_glTangent3fvEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3FVEXTPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTANGENT3FVEXTPROC GLeeFuncPtr_glTangent3fvEXT; - #define glTangent3fvEXT GLeeFuncPtr_glTangent3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3iEXT -#define GLEE_H_DEFINED_glTangent3iEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); - GLEE_EXTERN GLEEPFNGLTANGENT3IEXTPROC GLeeFuncPtr_glTangent3iEXT; - #define glTangent3iEXT GLeeFuncPtr_glTangent3iEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3ivEXT -#define GLEE_H_DEFINED_glTangent3ivEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3IVEXTPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLTANGENT3IVEXTPROC GLeeFuncPtr_glTangent3ivEXT; - #define glTangent3ivEXT GLeeFuncPtr_glTangent3ivEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3sEXT -#define GLEE_H_DEFINED_glTangent3sEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); - GLEE_EXTERN GLEEPFNGLTANGENT3SEXTPROC GLeeFuncPtr_glTangent3sEXT; - #define glTangent3sEXT GLeeFuncPtr_glTangent3sEXT -#endif -#ifndef GLEE_H_DEFINED_glTangent3svEXT -#define GLEE_H_DEFINED_glTangent3svEXT - typedef void (APIENTRYP GLEEPFNGLTANGENT3SVEXTPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLTANGENT3SVEXTPROC GLeeFuncPtr_glTangent3svEXT; - #define glTangent3svEXT GLeeFuncPtr_glTangent3svEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3bEXT -#define GLEE_H_DEFINED_glBinormal3bEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); - GLEE_EXTERN GLEEPFNGLBINORMAL3BEXTPROC GLeeFuncPtr_glBinormal3bEXT; - #define glBinormal3bEXT GLeeFuncPtr_glBinormal3bEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3bvEXT -#define GLEE_H_DEFINED_glBinormal3bvEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3BVEXTPROC) (const GLbyte * v); - GLEE_EXTERN GLEEPFNGLBINORMAL3BVEXTPROC GLeeFuncPtr_glBinormal3bvEXT; - #define glBinormal3bvEXT GLeeFuncPtr_glBinormal3bvEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3dEXT -#define GLEE_H_DEFINED_glBinormal3dEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); - GLEE_EXTERN GLEEPFNGLBINORMAL3DEXTPROC GLeeFuncPtr_glBinormal3dEXT; - #define glBinormal3dEXT GLeeFuncPtr_glBinormal3dEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3dvEXT -#define GLEE_H_DEFINED_glBinormal3dvEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3DVEXTPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLBINORMAL3DVEXTPROC GLeeFuncPtr_glBinormal3dvEXT; - #define glBinormal3dvEXT GLeeFuncPtr_glBinormal3dvEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3fEXT -#define GLEE_H_DEFINED_glBinormal3fEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); - GLEE_EXTERN GLEEPFNGLBINORMAL3FEXTPROC GLeeFuncPtr_glBinormal3fEXT; - #define glBinormal3fEXT GLeeFuncPtr_glBinormal3fEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3fvEXT -#define GLEE_H_DEFINED_glBinormal3fvEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3FVEXTPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLBINORMAL3FVEXTPROC GLeeFuncPtr_glBinormal3fvEXT; - #define glBinormal3fvEXT GLeeFuncPtr_glBinormal3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3iEXT -#define GLEE_H_DEFINED_glBinormal3iEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); - GLEE_EXTERN GLEEPFNGLBINORMAL3IEXTPROC GLeeFuncPtr_glBinormal3iEXT; - #define glBinormal3iEXT GLeeFuncPtr_glBinormal3iEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3ivEXT -#define GLEE_H_DEFINED_glBinormal3ivEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3IVEXTPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLBINORMAL3IVEXTPROC GLeeFuncPtr_glBinormal3ivEXT; - #define glBinormal3ivEXT GLeeFuncPtr_glBinormal3ivEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3sEXT -#define GLEE_H_DEFINED_glBinormal3sEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); - GLEE_EXTERN GLEEPFNGLBINORMAL3SEXTPROC GLeeFuncPtr_glBinormal3sEXT; - #define glBinormal3sEXT GLeeFuncPtr_glBinormal3sEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormal3svEXT -#define GLEE_H_DEFINED_glBinormal3svEXT - typedef void (APIENTRYP GLEEPFNGLBINORMAL3SVEXTPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLBINORMAL3SVEXTPROC GLeeFuncPtr_glBinormal3svEXT; - #define glBinormal3svEXT GLeeFuncPtr_glBinormal3svEXT -#endif -#ifndef GLEE_H_DEFINED_glTangentPointerEXT -#define GLEE_H_DEFINED_glTangentPointerEXT - typedef void (APIENTRYP GLEEPFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLTANGENTPOINTEREXTPROC GLeeFuncPtr_glTangentPointerEXT; - #define glTangentPointerEXT GLeeFuncPtr_glTangentPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glBinormalPointerEXT -#define GLEE_H_DEFINED_glBinormalPointerEXT - typedef void (APIENTRYP GLEEPFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLBINORMALPOINTEREXTPROC GLeeFuncPtr_glBinormalPointerEXT; - #define glBinormalPointerEXT GLeeFuncPtr_glBinormalPointerEXT -#endif -#endif - -/* GL_EXT_texture_env_combine */ - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#define __GLEE_GL_EXT_texture_env_combine 1 -/* Constants */ -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif - -/* GL_APPLE_specular_vector */ - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#define __GLEE_GL_APPLE_specular_vector 1 -/* Constants */ -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -/* GL_APPLE_transform_hint */ - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#define __GLEE_GL_APPLE_transform_hint 1 -/* Constants */ -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -/* GL_SGIX_fog_scale */ - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#define __GLEE_GL_SGIX_fog_scale 1 -/* Constants */ -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -/* GL_SUNX_constant_data */ - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#define __GLEE_GL_SUNX_constant_data 1 -/* Constants */ -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#ifndef GLEE_H_DEFINED_glFinishTextureSUNX -#define GLEE_H_DEFINED_glFinishTextureSUNX - typedef void (APIENTRYP GLEEPFNGLFINISHTEXTURESUNXPROC) (); - GLEE_EXTERN GLEEPFNGLFINISHTEXTURESUNXPROC GLeeFuncPtr_glFinishTextureSUNX; - #define glFinishTextureSUNX GLeeFuncPtr_glFinishTextureSUNX -#endif -#endif - -/* GL_SUN_global_alpha */ - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#define __GLEE_GL_SUN_global_alpha 1 -/* Constants */ -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorbSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactorbSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorbSUN; - #define glGlobalAlphaFactorbSUN GLeeFuncPtr_glGlobalAlphaFactorbSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorsSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactorsSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorsSUN; - #define glGlobalAlphaFactorsSUN GLeeFuncPtr_glGlobalAlphaFactorsSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactoriSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactoriSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORISUNPROC GLeeFuncPtr_glGlobalAlphaFactoriSUN; - #define glGlobalAlphaFactoriSUN GLeeFuncPtr_glGlobalAlphaFactoriSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorfSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactorfSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORFSUNPROC GLeeFuncPtr_glGlobalAlphaFactorfSUN; - #define glGlobalAlphaFactorfSUN GLeeFuncPtr_glGlobalAlphaFactorfSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactordSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactordSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORDSUNPROC GLeeFuncPtr_glGlobalAlphaFactordSUN; - #define glGlobalAlphaFactordSUN GLeeFuncPtr_glGlobalAlphaFactordSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorubSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactorubSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorubSUN; - #define glGlobalAlphaFactorubSUN GLeeFuncPtr_glGlobalAlphaFactorubSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorusSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactorusSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorusSUN; - #define glGlobalAlphaFactorusSUN GLeeFuncPtr_glGlobalAlphaFactorusSUN -#endif -#ifndef GLEE_H_DEFINED_glGlobalAlphaFactoruiSUN -#define GLEE_H_DEFINED_glGlobalAlphaFactoruiSUN - typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); - GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUISUNPROC GLeeFuncPtr_glGlobalAlphaFactoruiSUN; - #define glGlobalAlphaFactoruiSUN GLeeFuncPtr_glGlobalAlphaFactoruiSUN -#endif -#endif - -/* GL_SUN_triangle_list */ - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#define __GLEE_GL_SUN_triangle_list 1 -/* Constants */ -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#ifndef GLEE_H_DEFINED_glReplacementCodeuiSUN -#define GLEE_H_DEFINED_glReplacementCodeuiSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUISUNPROC GLeeFuncPtr_glReplacementCodeuiSUN; - #define glReplacementCodeuiSUN GLeeFuncPtr_glReplacementCodeuiSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeusSUN -#define GLEE_H_DEFINED_glReplacementCodeusSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUSSUNPROC GLeeFuncPtr_glReplacementCodeusSUN; - #define glReplacementCodeusSUN GLeeFuncPtr_glReplacementCodeusSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeubSUN -#define GLEE_H_DEFINED_glReplacementCodeubSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUBSUNPROC GLeeFuncPtr_glReplacementCodeubSUN; - #define glReplacementCodeubSUN GLeeFuncPtr_glReplacementCodeubSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuivSUN -#define GLEE_H_DEFINED_glReplacementCodeuivSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint * code); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVSUNPROC GLeeFuncPtr_glReplacementCodeuivSUN; - #define glReplacementCodeuivSUN GLeeFuncPtr_glReplacementCodeuivSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeusvSUN -#define GLEE_H_DEFINED_glReplacementCodeusvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort * code); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUSVSUNPROC GLeeFuncPtr_glReplacementCodeusvSUN; - #define glReplacementCodeusvSUN GLeeFuncPtr_glReplacementCodeusvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeubvSUN -#define GLEE_H_DEFINED_glReplacementCodeubvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte * code); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUBVSUNPROC GLeeFuncPtr_glReplacementCodeubvSUN; - #define glReplacementCodeubvSUN GLeeFuncPtr_glReplacementCodeubvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodePointerSUN -#define GLEE_H_DEFINED_glReplacementCodePointerSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC GLeeFuncPtr_glReplacementCodePointerSUN; - #define glReplacementCodePointerSUN GLeeFuncPtr_glReplacementCodePointerSUN -#endif -#endif - -/* GL_SUN_vertex */ - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#define __GLEE_GL_SUN_vertex 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glColor4ubVertex2fSUN -#define GLEE_H_DEFINED_glColor4ubVertex2fSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC GLeeFuncPtr_glColor4ubVertex2fSUN; - #define glColor4ubVertex2fSUN GLeeFuncPtr_glColor4ubVertex2fSUN -#endif -#ifndef GLEE_H_DEFINED_glColor4ubVertex2fvSUN -#define GLEE_H_DEFINED_glColor4ubVertex2fvSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC GLeeFuncPtr_glColor4ubVertex2fvSUN; - #define glColor4ubVertex2fvSUN GLeeFuncPtr_glColor4ubVertex2fvSUN -#endif -#ifndef GLEE_H_DEFINED_glColor4ubVertex3fSUN -#define GLEE_H_DEFINED_glColor4ubVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glColor4ubVertex3fSUN; - #define glColor4ubVertex3fSUN GLeeFuncPtr_glColor4ubVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glColor4ubVertex3fvSUN -#define GLEE_H_DEFINED_glColor4ubVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glColor4ubVertex3fvSUN; - #define glColor4ubVertex3fvSUN GLeeFuncPtr_glColor4ubVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glColor3fVertex3fSUN -#define GLEE_H_DEFINED_glColor3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glColor3fVertex3fSUN; - #define glColor3fVertex3fSUN GLeeFuncPtr_glColor3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glColor3fVertex3fvSUN -#define GLEE_H_DEFINED_glColor3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor3fVertex3fvSUN; - #define glColor3fVertex3fvSUN GLeeFuncPtr_glColor3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glNormal3fVertex3fSUN; - #define glNormal3fVertex3fSUN GLeeFuncPtr_glNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glNormal3fVertex3fvSUN; - #define glNormal3fVertex3fvSUN GLeeFuncPtr_glNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glColor4fNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glColor4fNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fSUN; - #define glColor4fNormal3fVertex3fSUN GLeeFuncPtr_glColor4fNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glColor4fNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glColor4fNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * c, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN; - #define glColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fVertex3fSUN -#define GLEE_H_DEFINED_glTexCoord2fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fSUN; - #define glTexCoord2fVertex3fSUN GLeeFuncPtr_glTexCoord2fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fVertex3fvSUN -#define GLEE_H_DEFINED_glTexCoord2fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fvSUN; - #define glTexCoord2fVertex3fvSUN GLeeFuncPtr_glTexCoord2fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord4fVertex4fSUN -#define GLEE_H_DEFINED_glTexCoord4fVertex4fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fSUN; - #define glTexCoord4fVertex4fSUN GLeeFuncPtr_glTexCoord4fVertex4fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord4fVertex4fvSUN -#define GLEE_H_DEFINED_glTexCoord4fVertex4fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat * tc, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fvSUN; - #define glTexCoord4fVertex4fvSUN GLeeFuncPtr_glTexCoord4fVertex4fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fSUN -#define GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN; - #define glTexCoord2fColor4ubVertex3fSUN GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fvSUN -#define GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat * tc, const GLubyte * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN; - #define glTexCoord2fColor4ubVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fSUN -#define GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN; - #define glTexCoord2fColor3fVertex3fSUN GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fvSUN -#define GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN; - #define glTexCoord2fColor3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN; - #define glTexCoord2fNormal3fVertex3fSUN GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN; - #define glTexCoord2fNormal3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN; - #define glTexCoord2fColor4fNormal3fVertex3fSUN GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN; - #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN -#define GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN; - #define glTexCoord4fColor4fNormal3fVertex4fSUN GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN -#endif -#ifndef GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN -#define GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN - typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN; - #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fSUN; - #define glReplacementCodeuiVertex3fSUN GLeeFuncPtr_glReplacementCodeuiVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN; - #define glReplacementCodeuiVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN; - #define glReplacementCodeuiColor4ubVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint * rc, const GLubyte * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN; - #define glReplacementCodeuiColor4ubVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN; - #define glReplacementCodeuiColor3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * c, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN; - #define glReplacementCodeuiColor3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN; - #define glReplacementCodeuiNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN; - #define glReplacementCodeuiNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN; - #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; - #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN; - #define glReplacementCodeuiTexCoord2fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN; - #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; - #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; - #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN -#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; - #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN -#endif -#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN -#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN - typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; - #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN -#endif -#endif - -/* GL_EXT_blend_func_separate */ - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#define __GLEE_GL_EXT_blend_func_separate 1 -/* Constants */ -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#ifndef GLEE_H_DEFINED_glBlendFuncSeparateEXT -#define GLEE_H_DEFINED_glBlendFuncSeparateEXT - typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEEXTPROC GLeeFuncPtr_glBlendFuncSeparateEXT; - #define glBlendFuncSeparateEXT GLeeFuncPtr_glBlendFuncSeparateEXT -#endif -#endif - -/* GL_INGR_color_clamp */ - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#define __GLEE_GL_INGR_color_clamp 1 -/* Constants */ -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -/* GL_INGR_interlace_read */ - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#define __GLEE_GL_INGR_interlace_read 1 -/* Constants */ -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -/* GL_EXT_stencil_wrap */ - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#define __GLEE_GL_EXT_stencil_wrap 1 -/* Constants */ -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -/* GL_EXT_422_pixels */ - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#define __GLEE_GL_EXT_422_pixels 1 -/* Constants */ -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -/* GL_NV_texgen_reflection */ - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#define __GLEE_GL_NV_texgen_reflection 1 -/* Constants */ -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -/* GL_EXT_texture_cube_map */ - -#ifndef GL_EXT_texture_cube_map -#define GL_EXT_texture_cube_map 1 -#define __GLEE_GL_EXT_texture_cube_map 1 -/* Constants */ -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -/* GL_SUN_convolution_border_modes */ - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#define __GLEE_GL_SUN_convolution_border_modes 1 -/* Constants */ -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -/* GL_EXT_texture_env_add */ - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#define __GLEE_GL_EXT_texture_env_add 1 -/* Constants */ -#endif - -/* GL_EXT_texture_lod_bias */ - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#define __GLEE_GL_EXT_texture_lod_bias 1 -/* Constants */ -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -/* GL_EXT_texture_filter_anisotropic */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#define __GLEE_GL_EXT_texture_filter_anisotropic 1 -/* Constants */ -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -/* GL_EXT_vertex_weighting */ - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#define __GLEE_GL_EXT_vertex_weighting 1 -/* Constants */ -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#ifndef GLEE_H_DEFINED_glVertexWeightfEXT -#define GLEE_H_DEFINED_glVertexWeightfEXT - typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); - GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTFEXTPROC GLeeFuncPtr_glVertexWeightfEXT; - #define glVertexWeightfEXT GLeeFuncPtr_glVertexWeightfEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexWeightfvEXT -#define GLEE_H_DEFINED_glVertexWeightfvEXT - typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat * weight); - GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTFVEXTPROC GLeeFuncPtr_glVertexWeightfvEXT; - #define glVertexWeightfvEXT GLeeFuncPtr_glVertexWeightfvEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexWeightPointerEXT -#define GLEE_H_DEFINED_glVertexWeightPointerEXT - typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC GLeeFuncPtr_glVertexWeightPointerEXT; - #define glVertexWeightPointerEXT GLeeFuncPtr_glVertexWeightPointerEXT -#endif -#endif - -/* GL_NV_light_max_exponent */ - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#define __GLEE_GL_NV_light_max_exponent 1 -/* Constants */ -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -/* GL_NV_vertex_array_range */ - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#define __GLEE_GL_NV_vertex_array_range 1 -/* Constants */ -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#ifndef GLEE_H_DEFINED_glFlushVertexArrayRangeNV -#define GLEE_H_DEFINED_glFlushVertexArrayRangeNV - typedef void (APIENTRYP GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC) (); - GLEE_EXTERN GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC GLeeFuncPtr_glFlushVertexArrayRangeNV; - #define glFlushVertexArrayRangeNV GLeeFuncPtr_glFlushVertexArrayRangeNV -#endif -#ifndef GLEE_H_DEFINED_glVertexArrayRangeNV -#define GLEE_H_DEFINED_glVertexArrayRangeNV - typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXARRAYRANGENVPROC GLeeFuncPtr_glVertexArrayRangeNV; - #define glVertexArrayRangeNV GLeeFuncPtr_glVertexArrayRangeNV -#endif -#endif - -/* GL_NV_register_combiners */ - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#define __GLEE_GL_NV_register_combiners 1 -/* Constants */ -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -#ifndef GLEE_H_DEFINED_glCombinerParameterfvNV -#define GLEE_H_DEFINED_glCombinerParameterfvNV - typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERFVNVPROC GLeeFuncPtr_glCombinerParameterfvNV; - #define glCombinerParameterfvNV GLeeFuncPtr_glCombinerParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glCombinerParameterfNV -#define GLEE_H_DEFINED_glCombinerParameterfNV - typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERFNVPROC GLeeFuncPtr_glCombinerParameterfNV; - #define glCombinerParameterfNV GLeeFuncPtr_glCombinerParameterfNV -#endif -#ifndef GLEE_H_DEFINED_glCombinerParameterivNV -#define GLEE_H_DEFINED_glCombinerParameterivNV - typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERIVNVPROC GLeeFuncPtr_glCombinerParameterivNV; - #define glCombinerParameterivNV GLeeFuncPtr_glCombinerParameterivNV -#endif -#ifndef GLEE_H_DEFINED_glCombinerParameteriNV -#define GLEE_H_DEFINED_glCombinerParameteriNV - typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERINVPROC GLeeFuncPtr_glCombinerParameteriNV; - #define glCombinerParameteriNV GLeeFuncPtr_glCombinerParameteriNV -#endif -#ifndef GLEE_H_DEFINED_glCombinerInputNV -#define GLEE_H_DEFINED_glCombinerInputNV - typedef void (APIENTRYP GLEEPFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); - GLEE_EXTERN GLEEPFNGLCOMBINERINPUTNVPROC GLeeFuncPtr_glCombinerInputNV; - #define glCombinerInputNV GLeeFuncPtr_glCombinerInputNV -#endif -#ifndef GLEE_H_DEFINED_glCombinerOutputNV -#define GLEE_H_DEFINED_glCombinerOutputNV - typedef void (APIENTRYP GLEEPFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); - GLEE_EXTERN GLEEPFNGLCOMBINEROUTPUTNVPROC GLeeFuncPtr_glCombinerOutputNV; - #define glCombinerOutputNV GLeeFuncPtr_glCombinerOutputNV -#endif -#ifndef GLEE_H_DEFINED_glFinalCombinerInputNV -#define GLEE_H_DEFINED_glFinalCombinerInputNV - typedef void (APIENTRYP GLEEPFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); - GLEE_EXTERN GLEEPFNGLFINALCOMBINERINPUTNVPROC GLeeFuncPtr_glFinalCombinerInputNV; - #define glFinalCombinerInputNV GLeeFuncPtr_glFinalCombinerInputNV -#endif -#ifndef GLEE_H_DEFINED_glGetCombinerInputParameterfvNV -#define GLEE_H_DEFINED_glGetCombinerInputParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerInputParameterfvNV; - #define glGetCombinerInputParameterfvNV GLeeFuncPtr_glGetCombinerInputParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetCombinerInputParameterivNV -#define GLEE_H_DEFINED_glGetCombinerInputParameterivNV - typedef void (APIENTRYP GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerInputParameterivNV; - #define glGetCombinerInputParameterivNV GLeeFuncPtr_glGetCombinerInputParameterivNV -#endif -#ifndef GLEE_H_DEFINED_glGetCombinerOutputParameterfvNV -#define GLEE_H_DEFINED_glGetCombinerOutputParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterfvNV; - #define glGetCombinerOutputParameterfvNV GLeeFuncPtr_glGetCombinerOutputParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetCombinerOutputParameterivNV -#define GLEE_H_DEFINED_glGetCombinerOutputParameterivNV - typedef void (APIENTRYP GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterivNV; - #define glGetCombinerOutputParameterivNV GLeeFuncPtr_glGetCombinerOutputParameterivNV -#endif -#ifndef GLEE_H_DEFINED_glGetFinalCombinerInputParameterfvNV -#define GLEE_H_DEFINED_glGetFinalCombinerInputParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV; - #define glGetFinalCombinerInputParameterfvNV GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetFinalCombinerInputParameterivNV -#define GLEE_H_DEFINED_glGetFinalCombinerInputParameterivNV - typedef void (APIENTRYP GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterivNV; - #define glGetFinalCombinerInputParameterivNV GLeeFuncPtr_glGetFinalCombinerInputParameterivNV -#endif -#endif - -/* GL_NV_fog_distance */ - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#define __GLEE_GL_NV_fog_distance 1 -/* Constants */ -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -#endif - -/* GL_NV_texgen_emboss */ - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#define __GLEE_GL_NV_texgen_emboss 1 -/* Constants */ -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -/* GL_NV_blend_square */ - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#define __GLEE_GL_NV_blend_square 1 -/* Constants */ -#endif - -/* GL_NV_texture_env_combine4 */ - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#define __GLEE_GL_NV_texture_env_combine4 1 -/* Constants */ -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -/* GL_MESA_resize_buffers */ - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#define __GLEE_GL_MESA_resize_buffers 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glResizeBuffersMESA -#define GLEE_H_DEFINED_glResizeBuffersMESA - typedef void (APIENTRYP GLEEPFNGLRESIZEBUFFERSMESAPROC) (); - GLEE_EXTERN GLEEPFNGLRESIZEBUFFERSMESAPROC GLeeFuncPtr_glResizeBuffersMESA; - #define glResizeBuffersMESA GLeeFuncPtr_glResizeBuffersMESA -#endif -#endif - -/* GL_MESA_window_pos */ - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#define __GLEE_GL_MESA_window_pos 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glWindowPos2dMESA -#define GLEE_H_DEFINED_glWindowPos2dMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2DMESAPROC GLeeFuncPtr_glWindowPos2dMESA; - #define glWindowPos2dMESA GLeeFuncPtr_glWindowPos2dMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2dvMESA -#define GLEE_H_DEFINED_glWindowPos2dvMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVMESAPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVMESAPROC GLeeFuncPtr_glWindowPos2dvMESA; - #define glWindowPos2dvMESA GLeeFuncPtr_glWindowPos2dvMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2fMESA -#define GLEE_H_DEFINED_glWindowPos2fMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2FMESAPROC GLeeFuncPtr_glWindowPos2fMESA; - #define glWindowPos2fMESA GLeeFuncPtr_glWindowPos2fMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2fvMESA -#define GLEE_H_DEFINED_glWindowPos2fvMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVMESAPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVMESAPROC GLeeFuncPtr_glWindowPos2fvMESA; - #define glWindowPos2fvMESA GLeeFuncPtr_glWindowPos2fvMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2iMESA -#define GLEE_H_DEFINED_glWindowPos2iMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2IMESAPROC GLeeFuncPtr_glWindowPos2iMESA; - #define glWindowPos2iMESA GLeeFuncPtr_glWindowPos2iMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2ivMESA -#define GLEE_H_DEFINED_glWindowPos2ivMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVMESAPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVMESAPROC GLeeFuncPtr_glWindowPos2ivMESA; - #define glWindowPos2ivMESA GLeeFuncPtr_glWindowPos2ivMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2sMESA -#define GLEE_H_DEFINED_glWindowPos2sMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2SMESAPROC GLeeFuncPtr_glWindowPos2sMESA; - #define glWindowPos2sMESA GLeeFuncPtr_glWindowPos2sMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos2svMESA -#define GLEE_H_DEFINED_glWindowPos2svMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVMESAPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVMESAPROC GLeeFuncPtr_glWindowPos2svMESA; - #define glWindowPos2svMESA GLeeFuncPtr_glWindowPos2svMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3dMESA -#define GLEE_H_DEFINED_glWindowPos3dMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3DMESAPROC GLeeFuncPtr_glWindowPos3dMESA; - #define glWindowPos3dMESA GLeeFuncPtr_glWindowPos3dMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3dvMESA -#define GLEE_H_DEFINED_glWindowPos3dvMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVMESAPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVMESAPROC GLeeFuncPtr_glWindowPos3dvMESA; - #define glWindowPos3dvMESA GLeeFuncPtr_glWindowPos3dvMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3fMESA -#define GLEE_H_DEFINED_glWindowPos3fMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3FMESAPROC GLeeFuncPtr_glWindowPos3fMESA; - #define glWindowPos3fMESA GLeeFuncPtr_glWindowPos3fMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3fvMESA -#define GLEE_H_DEFINED_glWindowPos3fvMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVMESAPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVMESAPROC GLeeFuncPtr_glWindowPos3fvMESA; - #define glWindowPos3fvMESA GLeeFuncPtr_glWindowPos3fvMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3iMESA -#define GLEE_H_DEFINED_glWindowPos3iMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3IMESAPROC GLeeFuncPtr_glWindowPos3iMESA; - #define glWindowPos3iMESA GLeeFuncPtr_glWindowPos3iMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3ivMESA -#define GLEE_H_DEFINED_glWindowPos3ivMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVMESAPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVMESAPROC GLeeFuncPtr_glWindowPos3ivMESA; - #define glWindowPos3ivMESA GLeeFuncPtr_glWindowPos3ivMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3sMESA -#define GLEE_H_DEFINED_glWindowPos3sMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3SMESAPROC GLeeFuncPtr_glWindowPos3sMESA; - #define glWindowPos3sMESA GLeeFuncPtr_glWindowPos3sMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos3svMESA -#define GLEE_H_DEFINED_glWindowPos3svMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVMESAPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVMESAPROC GLeeFuncPtr_glWindowPos3svMESA; - #define glWindowPos3svMESA GLeeFuncPtr_glWindowPos3svMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4dMESA -#define GLEE_H_DEFINED_glWindowPos4dMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4DMESAPROC GLeeFuncPtr_glWindowPos4dMESA; - #define glWindowPos4dMESA GLeeFuncPtr_glWindowPos4dMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4dvMESA -#define GLEE_H_DEFINED_glWindowPos4dvMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4DVMESAPROC) (const GLdouble * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4DVMESAPROC GLeeFuncPtr_glWindowPos4dvMESA; - #define glWindowPos4dvMESA GLeeFuncPtr_glWindowPos4dvMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4fMESA -#define GLEE_H_DEFINED_glWindowPos4fMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4FMESAPROC GLeeFuncPtr_glWindowPos4fMESA; - #define glWindowPos4fMESA GLeeFuncPtr_glWindowPos4fMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4fvMESA -#define GLEE_H_DEFINED_glWindowPos4fvMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4FVMESAPROC) (const GLfloat * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4FVMESAPROC GLeeFuncPtr_glWindowPos4fvMESA; - #define glWindowPos4fvMESA GLeeFuncPtr_glWindowPos4fvMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4iMESA -#define GLEE_H_DEFINED_glWindowPos4iMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4IMESAPROC GLeeFuncPtr_glWindowPos4iMESA; - #define glWindowPos4iMESA GLeeFuncPtr_glWindowPos4iMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4ivMESA -#define GLEE_H_DEFINED_glWindowPos4ivMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4IVMESAPROC) (const GLint * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4IVMESAPROC GLeeFuncPtr_glWindowPos4ivMESA; - #define glWindowPos4ivMESA GLeeFuncPtr_glWindowPos4ivMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4sMESA -#define GLEE_H_DEFINED_glWindowPos4sMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4SMESAPROC GLeeFuncPtr_glWindowPos4sMESA; - #define glWindowPos4sMESA GLeeFuncPtr_glWindowPos4sMESA -#endif -#ifndef GLEE_H_DEFINED_glWindowPos4svMESA -#define GLEE_H_DEFINED_glWindowPos4svMESA - typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4SVMESAPROC) (const GLshort * v); - GLEE_EXTERN GLEEPFNGLWINDOWPOS4SVMESAPROC GLeeFuncPtr_glWindowPos4svMESA; - #define glWindowPos4svMESA GLeeFuncPtr_glWindowPos4svMESA -#endif -#endif - -/* GL_EXT_texture_compression_s3tc */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#define __GLEE_GL_EXT_texture_compression_s3tc 1 -/* Constants */ -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -/* GL_IBM_cull_vertex */ - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#define __GLEE_GL_IBM_cull_vertex 1 -/* Constants */ -#define GL_CULL_VERTEX_IBM 103050 -#endif - -/* GL_IBM_multimode_draw_arrays */ - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#define __GLEE_GL_IBM_multimode_draw_arrays 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glMultiModeDrawArraysIBM -#define GLEE_H_DEFINED_glMultiModeDrawArraysIBM - typedef void (APIENTRYP GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); - GLEE_EXTERN GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC GLeeFuncPtr_glMultiModeDrawArraysIBM; - #define glMultiModeDrawArraysIBM GLeeFuncPtr_glMultiModeDrawArraysIBM -#endif -#ifndef GLEE_H_DEFINED_glMultiModeDrawElementsIBM -#define GLEE_H_DEFINED_glMultiModeDrawElementsIBM - typedef void (APIENTRYP GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid* const * indices, GLsizei primcount, GLint modestride); - GLEE_EXTERN GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC GLeeFuncPtr_glMultiModeDrawElementsIBM; - #define glMultiModeDrawElementsIBM GLeeFuncPtr_glMultiModeDrawElementsIBM -#endif -#endif - -/* GL_IBM_vertex_array_lists */ - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#define __GLEE_GL_IBM_vertex_array_lists 1 -/* Constants */ -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#ifndef GLEE_H_DEFINED_glColorPointerListIBM -#define GLEE_H_DEFINED_glColorPointerListIBM - typedef void (APIENTRYP GLEEPFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glColorPointerListIBM; - #define glColorPointerListIBM GLeeFuncPtr_glColorPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColorPointerListIBM -#define GLEE_H_DEFINED_glSecondaryColorPointerListIBM - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glSecondaryColorPointerListIBM; - #define glSecondaryColorPointerListIBM GLeeFuncPtr_glSecondaryColorPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glEdgeFlagPointerListIBM -#define GLEE_H_DEFINED_glEdgeFlagPointerListIBM - typedef void (APIENTRYP GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC GLeeFuncPtr_glEdgeFlagPointerListIBM; - #define glEdgeFlagPointerListIBM GLeeFuncPtr_glEdgeFlagPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glFogCoordPointerListIBM -#define GLEE_H_DEFINED_glFogCoordPointerListIBM - typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glFogCoordPointerListIBM; - #define glFogCoordPointerListIBM GLeeFuncPtr_glFogCoordPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glIndexPointerListIBM -#define GLEE_H_DEFINED_glIndexPointerListIBM - typedef void (APIENTRYP GLEEPFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLINDEXPOINTERLISTIBMPROC GLeeFuncPtr_glIndexPointerListIBM; - #define glIndexPointerListIBM GLeeFuncPtr_glIndexPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glNormalPointerListIBM -#define GLEE_H_DEFINED_glNormalPointerListIBM - typedef void (APIENTRYP GLEEPFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLNORMALPOINTERLISTIBMPROC GLeeFuncPtr_glNormalPointerListIBM; - #define glNormalPointerListIBM GLeeFuncPtr_glNormalPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glTexCoordPointerListIBM -#define GLEE_H_DEFINED_glTexCoordPointerListIBM - typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glTexCoordPointerListIBM; - #define glTexCoordPointerListIBM GLeeFuncPtr_glTexCoordPointerListIBM -#endif -#ifndef GLEE_H_DEFINED_glVertexPointerListIBM -#define GLEE_H_DEFINED_glVertexPointerListIBM - typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); - GLEE_EXTERN GLEEPFNGLVERTEXPOINTERLISTIBMPROC GLeeFuncPtr_glVertexPointerListIBM; - #define glVertexPointerListIBM GLeeFuncPtr_glVertexPointerListIBM -#endif -#endif - -/* GL_SGIX_subsample */ - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#define __GLEE_GL_SGIX_subsample 1 -/* Constants */ -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -/* GL_SGIX_ycrcb_subsample */ - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#define __GLEE_GL_SGIX_ycrcb_subsample 1 -/* Constants */ -#endif - -/* GL_SGIX_ycrcba */ - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#define __GLEE_GL_SGIX_ycrcba 1 -/* Constants */ -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -/* GL_SGI_depth_pass_instrument */ - -#ifndef GL_SGI_depth_pass_instrument -#define GL_SGI_depth_pass_instrument 1 -#define __GLEE_GL_SGI_depth_pass_instrument 1 -/* Constants */ -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -/* GL_3DFX_texture_compression_FXT1 */ - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#define __GLEE_GL_3DFX_texture_compression_FXT1 1 -/* Constants */ -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -/* GL_3DFX_multisample */ - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#define __GLEE_GL_3DFX_multisample 1 -/* Constants */ -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -/* GL_3DFX_tbuffer */ - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#define __GLEE_GL_3DFX_tbuffer 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glTbufferMask3DFX -#define GLEE_H_DEFINED_glTbufferMask3DFX - typedef void (APIENTRYP GLEEPFNGLTBUFFERMASK3DFXPROC) (GLuint mask); - GLEE_EXTERN GLEEPFNGLTBUFFERMASK3DFXPROC GLeeFuncPtr_glTbufferMask3DFX; - #define glTbufferMask3DFX GLeeFuncPtr_glTbufferMask3DFX -#endif -#endif - -/* GL_EXT_multisample */ - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#define __GLEE_GL_EXT_multisample 1 -/* Constants */ -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#ifndef GLEE_H_DEFINED_glSampleMaskEXT -#define GLEE_H_DEFINED_glSampleMaskEXT - typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); - GLEE_EXTERN GLEEPFNGLSAMPLEMASKEXTPROC GLeeFuncPtr_glSampleMaskEXT; - #define glSampleMaskEXT GLeeFuncPtr_glSampleMaskEXT -#endif -#ifndef GLEE_H_DEFINED_glSamplePatternEXT -#define GLEE_H_DEFINED_glSamplePatternEXT - typedef void (APIENTRYP GLEEPFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); - GLEE_EXTERN GLEEPFNGLSAMPLEPATTERNEXTPROC GLeeFuncPtr_glSamplePatternEXT; - #define glSamplePatternEXT GLeeFuncPtr_glSamplePatternEXT -#endif -#endif - -/* GL_SGIX_vertex_preclip */ - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#define __GLEE_GL_SGIX_vertex_preclip 1 -/* Constants */ -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -/* GL_SGIX_convolution_accuracy */ - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#define __GLEE_GL_SGIX_convolution_accuracy 1 -/* Constants */ -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -/* GL_SGIX_resample */ - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#define __GLEE_GL_SGIX_resample 1 -/* Constants */ -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -/* GL_SGIS_point_line_texgen */ - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#define __GLEE_GL_SGIS_point_line_texgen 1 -/* Constants */ -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -/* GL_SGIS_texture_color_mask */ - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#define __GLEE_GL_SGIS_texture_color_mask 1 -/* Constants */ -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#ifndef GLEE_H_DEFINED_glTextureColorMaskSGIS -#define GLEE_H_DEFINED_glTextureColorMaskSGIS - typedef void (APIENTRYP GLEEPFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); - GLEE_EXTERN GLEEPFNGLTEXTURECOLORMASKSGISPROC GLeeFuncPtr_glTextureColorMaskSGIS; - #define glTextureColorMaskSGIS GLeeFuncPtr_glTextureColorMaskSGIS -#endif -#endif - -/* GL_EXT_texture_env_dot3 */ - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#define __GLEE_GL_EXT_texture_env_dot3 1 -/* Constants */ -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif - -/* GL_ATI_texture_mirror_once */ - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#define __GLEE_GL_ATI_texture_mirror_once 1 -/* Constants */ -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif - -/* GL_NV_fence */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#define __GLEE_GL_NV_fence 1 -/* Constants */ -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#ifndef GLEE_H_DEFINED_glDeleteFencesNV -#define GLEE_H_DEFINED_glDeleteFencesNV - typedef void (APIENTRYP GLEEPFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint * fences); - GLEE_EXTERN GLEEPFNGLDELETEFENCESNVPROC GLeeFuncPtr_glDeleteFencesNV; - #define glDeleteFencesNV GLeeFuncPtr_glDeleteFencesNV -#endif -#ifndef GLEE_H_DEFINED_glGenFencesNV -#define GLEE_H_DEFINED_glGenFencesNV - typedef void (APIENTRYP GLEEPFNGLGENFENCESNVPROC) (GLsizei n, GLuint * fences); - GLEE_EXTERN GLEEPFNGLGENFENCESNVPROC GLeeFuncPtr_glGenFencesNV; - #define glGenFencesNV GLeeFuncPtr_glGenFencesNV -#endif -#ifndef GLEE_H_DEFINED_glIsFenceNV -#define GLEE_H_DEFINED_glIsFenceNV - typedef GLboolean (APIENTRYP GLEEPFNGLISFENCENVPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLISFENCENVPROC GLeeFuncPtr_glIsFenceNV; - #define glIsFenceNV GLeeFuncPtr_glIsFenceNV -#endif -#ifndef GLEE_H_DEFINED_glTestFenceNV -#define GLEE_H_DEFINED_glTestFenceNV - typedef GLboolean (APIENTRYP GLEEPFNGLTESTFENCENVPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLTESTFENCENVPROC GLeeFuncPtr_glTestFenceNV; - #define glTestFenceNV GLeeFuncPtr_glTestFenceNV -#endif -#ifndef GLEE_H_DEFINED_glGetFenceivNV -#define GLEE_H_DEFINED_glGetFenceivNV - typedef void (APIENTRYP GLEEPFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFENCEIVNVPROC GLeeFuncPtr_glGetFenceivNV; - #define glGetFenceivNV GLeeFuncPtr_glGetFenceivNV -#endif -#ifndef GLEE_H_DEFINED_glFinishFenceNV -#define GLEE_H_DEFINED_glFinishFenceNV - typedef void (APIENTRYP GLEEPFNGLFINISHFENCENVPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLFINISHFENCENVPROC GLeeFuncPtr_glFinishFenceNV; - #define glFinishFenceNV GLeeFuncPtr_glFinishFenceNV -#endif -#ifndef GLEE_H_DEFINED_glSetFenceNV -#define GLEE_H_DEFINED_glSetFenceNV - typedef void (APIENTRYP GLEEPFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); - GLEE_EXTERN GLEEPFNGLSETFENCENVPROC GLeeFuncPtr_glSetFenceNV; - #define glSetFenceNV GLeeFuncPtr_glSetFenceNV -#endif -#endif - -/* GL_IBM_texture_mirrored_repeat */ - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 -#define __GLEE_GL_IBM_texture_mirrored_repeat 1 -/* Constants */ -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif - -/* GL_NV_evaluators */ - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#define __GLEE_GL_NV_evaluators 1 -/* Constants */ -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -#ifndef GLEE_H_DEFINED_glMapControlPointsNV -#define GLEE_H_DEFINED_glMapControlPointsNV - typedef void (APIENTRYP GLEEPFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * points); - GLEE_EXTERN GLEEPFNGLMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glMapControlPointsNV; - #define glMapControlPointsNV GLeeFuncPtr_glMapControlPointsNV -#endif -#ifndef GLEE_H_DEFINED_glMapParameterivNV -#define GLEE_H_DEFINED_glMapParameterivNV - typedef void (APIENTRYP GLEEPFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLMAPPARAMETERIVNVPROC GLeeFuncPtr_glMapParameterivNV; - #define glMapParameterivNV GLeeFuncPtr_glMapParameterivNV -#endif -#ifndef GLEE_H_DEFINED_glMapParameterfvNV -#define GLEE_H_DEFINED_glMapParameterfvNV - typedef void (APIENTRYP GLEEPFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLMAPPARAMETERFVNVPROC GLeeFuncPtr_glMapParameterfvNV; - #define glMapParameterfvNV GLeeFuncPtr_glMapParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetMapControlPointsNV -#define GLEE_H_DEFINED_glGetMapControlPointsNV - typedef void (APIENTRYP GLEEPFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid * points); - GLEE_EXTERN GLEEPFNGLGETMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glGetMapControlPointsNV; - #define glGetMapControlPointsNV GLeeFuncPtr_glGetMapControlPointsNV -#endif -#ifndef GLEE_H_DEFINED_glGetMapParameterivNV -#define GLEE_H_DEFINED_glGetMapParameterivNV - typedef void (APIENTRYP GLEEPFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMAPPARAMETERIVNVPROC GLeeFuncPtr_glGetMapParameterivNV; - #define glGetMapParameterivNV GLeeFuncPtr_glGetMapParameterivNV -#endif -#ifndef GLEE_H_DEFINED_glGetMapParameterfvNV -#define GLEE_H_DEFINED_glGetMapParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMAPPARAMETERFVNVPROC GLeeFuncPtr_glGetMapParameterfvNV; - #define glGetMapParameterfvNV GLeeFuncPtr_glGetMapParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetMapAttribParameterivNV -#define GLEE_H_DEFINED_glGetMapAttribParameterivNV - typedef void (APIENTRYP GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC GLeeFuncPtr_glGetMapAttribParameterivNV; - #define glGetMapAttribParameterivNV GLeeFuncPtr_glGetMapAttribParameterivNV -#endif -#ifndef GLEE_H_DEFINED_glGetMapAttribParameterfvNV -#define GLEE_H_DEFINED_glGetMapAttribParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC GLeeFuncPtr_glGetMapAttribParameterfvNV; - #define glGetMapAttribParameterfvNV GLeeFuncPtr_glGetMapAttribParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glEvalMapsNV -#define GLEE_H_DEFINED_glEvalMapsNV - typedef void (APIENTRYP GLEEPFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); - GLEE_EXTERN GLEEPFNGLEVALMAPSNVPROC GLeeFuncPtr_glEvalMapsNV; - #define glEvalMapsNV GLeeFuncPtr_glEvalMapsNV -#endif -#endif - -/* GL_NV_packed_depth_stencil */ - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#define __GLEE_GL_NV_packed_depth_stencil 1 -/* Constants */ -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif - -/* GL_NV_register_combiners2 */ - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#define __GLEE_GL_NV_register_combiners2 1 -/* Constants */ -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#ifndef GLEE_H_DEFINED_glCombinerStageParameterfvNV -#define GLEE_H_DEFINED_glCombinerStageParameterfvNV - typedef void (APIENTRYP GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glCombinerStageParameterfvNV; - #define glCombinerStageParameterfvNV GLeeFuncPtr_glCombinerStageParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetCombinerStageParameterfvNV -#define GLEE_H_DEFINED_glGetCombinerStageParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerStageParameterfvNV; - #define glGetCombinerStageParameterfvNV GLeeFuncPtr_glGetCombinerStageParameterfvNV -#endif -#endif - -/* GL_NV_texture_compression_vtc */ - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#define __GLEE_GL_NV_texture_compression_vtc 1 -/* Constants */ -#endif - -/* GL_NV_texture_rectangle */ - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#define __GLEE_GL_NV_texture_rectangle 1 -/* Constants */ -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif - -/* GL_NV_texture_shader */ - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#define __GLEE_GL_NV_texture_shader 1 -/* Constants */ -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif - -/* GL_NV_texture_shader2 */ - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#define __GLEE_GL_NV_texture_shader2 1 -/* Constants */ -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif - -/* GL_NV_vertex_array_range2 */ - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#define __GLEE_GL_NV_vertex_array_range2 1 -/* Constants */ -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif - -/* GL_NV_vertex_program */ - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#define __GLEE_GL_NV_vertex_program 1 -/* Constants */ -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#ifndef GLEE_H_DEFINED_glAreProgramsResidentNV -#define GLEE_H_DEFINED_glAreProgramsResidentNV - typedef GLboolean (APIENTRYP GLEEPFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint * programs, GLboolean * residences); - GLEE_EXTERN GLEEPFNGLAREPROGRAMSRESIDENTNVPROC GLeeFuncPtr_glAreProgramsResidentNV; - #define glAreProgramsResidentNV GLeeFuncPtr_glAreProgramsResidentNV -#endif -#ifndef GLEE_H_DEFINED_glBindProgramNV -#define GLEE_H_DEFINED_glBindProgramNV - typedef void (APIENTRYP GLEEPFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); - GLEE_EXTERN GLEEPFNGLBINDPROGRAMNVPROC GLeeFuncPtr_glBindProgramNV; - #define glBindProgramNV GLeeFuncPtr_glBindProgramNV -#endif -#ifndef GLEE_H_DEFINED_glDeleteProgramsNV -#define GLEE_H_DEFINED_glDeleteProgramsNV - typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint * programs); - GLEE_EXTERN GLEEPFNGLDELETEPROGRAMSNVPROC GLeeFuncPtr_glDeleteProgramsNV; - #define glDeleteProgramsNV GLeeFuncPtr_glDeleteProgramsNV -#endif -#ifndef GLEE_H_DEFINED_glExecuteProgramNV -#define GLEE_H_DEFINED_glExecuteProgramNV - typedef void (APIENTRYP GLEEPFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLEXECUTEPROGRAMNVPROC GLeeFuncPtr_glExecuteProgramNV; - #define glExecuteProgramNV GLeeFuncPtr_glExecuteProgramNV -#endif -#ifndef GLEE_H_DEFINED_glGenProgramsNV -#define GLEE_H_DEFINED_glGenProgramsNV - typedef void (APIENTRYP GLEEPFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint * programs); - GLEE_EXTERN GLEEPFNGLGENPROGRAMSNVPROC GLeeFuncPtr_glGenProgramsNV; - #define glGenProgramsNV GLeeFuncPtr_glGenProgramsNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramParameterdvNV -#define GLEE_H_DEFINED_glGetProgramParameterdvNV - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramParameterdvNV; - #define glGetProgramParameterdvNV GLeeFuncPtr_glGetProgramParameterdvNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramParameterfvNV -#define GLEE_H_DEFINED_glGetProgramParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramParameterfvNV; - #define glGetProgramParameterfvNV GLeeFuncPtr_glGetProgramParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramivNV -#define GLEE_H_DEFINED_glGetProgramivNV - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMIVNVPROC GLeeFuncPtr_glGetProgramivNV; - #define glGetProgramivNV GLeeFuncPtr_glGetProgramivNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramStringNV -#define GLEE_H_DEFINED_glGetProgramStringNV - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte * program); - GLEE_EXTERN GLEEPFNGLGETPROGRAMSTRINGNVPROC GLeeFuncPtr_glGetProgramStringNV; - #define glGetProgramStringNV GLeeFuncPtr_glGetProgramStringNV -#endif -#ifndef GLEE_H_DEFINED_glGetTrackMatrixivNV -#define GLEE_H_DEFINED_glGetTrackMatrixivNV - typedef void (APIENTRYP GLEEPFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETTRACKMATRIXIVNVPROC GLeeFuncPtr_glGetTrackMatrixivNV; - #define glGetTrackMatrixivNV GLeeFuncPtr_glGetTrackMatrixivNV -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribdvNV -#define GLEE_H_DEFINED_glGetVertexAttribdvNV - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVNVPROC GLeeFuncPtr_glGetVertexAttribdvNV; - #define glGetVertexAttribdvNV GLeeFuncPtr_glGetVertexAttribdvNV -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribfvNV -#define GLEE_H_DEFINED_glGetVertexAttribfvNV - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVNVPROC GLeeFuncPtr_glGetVertexAttribfvNV; - #define glGetVertexAttribfvNV GLeeFuncPtr_glGetVertexAttribfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribivNV -#define GLEE_H_DEFINED_glGetVertexAttribivNV - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVNVPROC GLeeFuncPtr_glGetVertexAttribivNV; - #define glGetVertexAttribivNV GLeeFuncPtr_glGetVertexAttribivNV -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribPointervNV -#define GLEE_H_DEFINED_glGetVertexAttribPointervNV - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* * pointer); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC GLeeFuncPtr_glGetVertexAttribPointervNV; - #define glGetVertexAttribPointervNV GLeeFuncPtr_glGetVertexAttribPointervNV -#endif -#ifndef GLEE_H_DEFINED_glIsProgramNV -#define GLEE_H_DEFINED_glIsProgramNV - typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMNVPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLISPROGRAMNVPROC GLeeFuncPtr_glIsProgramNV; - #define glIsProgramNV GLeeFuncPtr_glIsProgramNV -#endif -#ifndef GLEE_H_DEFINED_glLoadProgramNV -#define GLEE_H_DEFINED_glLoadProgramNV - typedef void (APIENTRYP GLEEPFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte * program); - GLEE_EXTERN GLEEPFNGLLOADPROGRAMNVPROC GLeeFuncPtr_glLoadProgramNV; - #define glLoadProgramNV GLeeFuncPtr_glLoadProgramNV -#endif -#ifndef GLEE_H_DEFINED_glProgramParameter4dNV -#define GLEE_H_DEFINED_glProgramParameter4dNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4DNVPROC GLeeFuncPtr_glProgramParameter4dNV; - #define glProgramParameter4dNV GLeeFuncPtr_glProgramParameter4dNV -#endif -#ifndef GLEE_H_DEFINED_glProgramParameter4dvNV -#define GLEE_H_DEFINED_glProgramParameter4dvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4DVNVPROC GLeeFuncPtr_glProgramParameter4dvNV; - #define glProgramParameter4dvNV GLeeFuncPtr_glProgramParameter4dvNV -#endif -#ifndef GLEE_H_DEFINED_glProgramParameter4fNV -#define GLEE_H_DEFINED_glProgramParameter4fNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4FNVPROC GLeeFuncPtr_glProgramParameter4fNV; - #define glProgramParameter4fNV GLeeFuncPtr_glProgramParameter4fNV -#endif -#ifndef GLEE_H_DEFINED_glProgramParameter4fvNV -#define GLEE_H_DEFINED_glProgramParameter4fvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4FVNVPROC GLeeFuncPtr_glProgramParameter4fvNV; - #define glProgramParameter4fvNV GLeeFuncPtr_glProgramParameter4fvNV -#endif -#ifndef GLEE_H_DEFINED_glProgramParameters4dvNV -#define GLEE_H_DEFINED_glProgramParameters4dvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC GLeeFuncPtr_glProgramParameters4dvNV; - #define glProgramParameters4dvNV GLeeFuncPtr_glProgramParameters4dvNV -#endif -#ifndef GLEE_H_DEFINED_glProgramParameters4fvNV -#define GLEE_H_DEFINED_glProgramParameters4fvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC GLeeFuncPtr_glProgramParameters4fvNV; - #define glProgramParameters4fvNV GLeeFuncPtr_glProgramParameters4fvNV -#endif -#ifndef GLEE_H_DEFINED_glRequestResidentProgramsNV -#define GLEE_H_DEFINED_glRequestResidentProgramsNV - typedef void (APIENTRYP GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint * programs); - GLEE_EXTERN GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC GLeeFuncPtr_glRequestResidentProgramsNV; - #define glRequestResidentProgramsNV GLeeFuncPtr_glRequestResidentProgramsNV -#endif -#ifndef GLEE_H_DEFINED_glTrackMatrixNV -#define GLEE_H_DEFINED_glTrackMatrixNV - typedef void (APIENTRYP GLEEPFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); - GLEE_EXTERN GLEEPFNGLTRACKMATRIXNVPROC GLeeFuncPtr_glTrackMatrixNV; - #define glTrackMatrixNV GLeeFuncPtr_glTrackMatrixNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribPointerNV -#define GLEE_H_DEFINED_glVertexAttribPointerNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERNVPROC GLeeFuncPtr_glVertexAttribPointerNV; - #define glVertexAttribPointerNV GLeeFuncPtr_glVertexAttribPointerNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1dNV -#define GLEE_H_DEFINED_glVertexAttrib1dNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DNVPROC GLeeFuncPtr_glVertexAttrib1dNV; - #define glVertexAttrib1dNV GLeeFuncPtr_glVertexAttrib1dNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1dvNV -#define GLEE_H_DEFINED_glVertexAttrib1dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVNVPROC GLeeFuncPtr_glVertexAttrib1dvNV; - #define glVertexAttrib1dvNV GLeeFuncPtr_glVertexAttrib1dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1fNV -#define GLEE_H_DEFINED_glVertexAttrib1fNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FNVPROC GLeeFuncPtr_glVertexAttrib1fNV; - #define glVertexAttrib1fNV GLeeFuncPtr_glVertexAttrib1fNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1fvNV -#define GLEE_H_DEFINED_glVertexAttrib1fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVNVPROC GLeeFuncPtr_glVertexAttrib1fvNV; - #define glVertexAttrib1fvNV GLeeFuncPtr_glVertexAttrib1fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1sNV -#define GLEE_H_DEFINED_glVertexAttrib1sNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SNVPROC GLeeFuncPtr_glVertexAttrib1sNV; - #define glVertexAttrib1sNV GLeeFuncPtr_glVertexAttrib1sNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1svNV -#define GLEE_H_DEFINED_glVertexAttrib1svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVNVPROC GLeeFuncPtr_glVertexAttrib1svNV; - #define glVertexAttrib1svNV GLeeFuncPtr_glVertexAttrib1svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2dNV -#define GLEE_H_DEFINED_glVertexAttrib2dNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DNVPROC GLeeFuncPtr_glVertexAttrib2dNV; - #define glVertexAttrib2dNV GLeeFuncPtr_glVertexAttrib2dNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2dvNV -#define GLEE_H_DEFINED_glVertexAttrib2dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVNVPROC GLeeFuncPtr_glVertexAttrib2dvNV; - #define glVertexAttrib2dvNV GLeeFuncPtr_glVertexAttrib2dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2fNV -#define GLEE_H_DEFINED_glVertexAttrib2fNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FNVPROC GLeeFuncPtr_glVertexAttrib2fNV; - #define glVertexAttrib2fNV GLeeFuncPtr_glVertexAttrib2fNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2fvNV -#define GLEE_H_DEFINED_glVertexAttrib2fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVNVPROC GLeeFuncPtr_glVertexAttrib2fvNV; - #define glVertexAttrib2fvNV GLeeFuncPtr_glVertexAttrib2fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2sNV -#define GLEE_H_DEFINED_glVertexAttrib2sNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SNVPROC GLeeFuncPtr_glVertexAttrib2sNV; - #define glVertexAttrib2sNV GLeeFuncPtr_glVertexAttrib2sNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2svNV -#define GLEE_H_DEFINED_glVertexAttrib2svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVNVPROC GLeeFuncPtr_glVertexAttrib2svNV; - #define glVertexAttrib2svNV GLeeFuncPtr_glVertexAttrib2svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3dNV -#define GLEE_H_DEFINED_glVertexAttrib3dNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DNVPROC GLeeFuncPtr_glVertexAttrib3dNV; - #define glVertexAttrib3dNV GLeeFuncPtr_glVertexAttrib3dNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3dvNV -#define GLEE_H_DEFINED_glVertexAttrib3dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVNVPROC GLeeFuncPtr_glVertexAttrib3dvNV; - #define glVertexAttrib3dvNV GLeeFuncPtr_glVertexAttrib3dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3fNV -#define GLEE_H_DEFINED_glVertexAttrib3fNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FNVPROC GLeeFuncPtr_glVertexAttrib3fNV; - #define glVertexAttrib3fNV GLeeFuncPtr_glVertexAttrib3fNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3fvNV -#define GLEE_H_DEFINED_glVertexAttrib3fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVNVPROC GLeeFuncPtr_glVertexAttrib3fvNV; - #define glVertexAttrib3fvNV GLeeFuncPtr_glVertexAttrib3fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3sNV -#define GLEE_H_DEFINED_glVertexAttrib3sNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SNVPROC GLeeFuncPtr_glVertexAttrib3sNV; - #define glVertexAttrib3sNV GLeeFuncPtr_glVertexAttrib3sNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3svNV -#define GLEE_H_DEFINED_glVertexAttrib3svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVNVPROC GLeeFuncPtr_glVertexAttrib3svNV; - #define glVertexAttrib3svNV GLeeFuncPtr_glVertexAttrib3svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4dNV -#define GLEE_H_DEFINED_glVertexAttrib4dNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DNVPROC GLeeFuncPtr_glVertexAttrib4dNV; - #define glVertexAttrib4dNV GLeeFuncPtr_glVertexAttrib4dNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4dvNV -#define GLEE_H_DEFINED_glVertexAttrib4dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVNVPROC GLeeFuncPtr_glVertexAttrib4dvNV; - #define glVertexAttrib4dvNV GLeeFuncPtr_glVertexAttrib4dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4fNV -#define GLEE_H_DEFINED_glVertexAttrib4fNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FNVPROC GLeeFuncPtr_glVertexAttrib4fNV; - #define glVertexAttrib4fNV GLeeFuncPtr_glVertexAttrib4fNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4fvNV -#define GLEE_H_DEFINED_glVertexAttrib4fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVNVPROC GLeeFuncPtr_glVertexAttrib4fvNV; - #define glVertexAttrib4fvNV GLeeFuncPtr_glVertexAttrib4fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4sNV -#define GLEE_H_DEFINED_glVertexAttrib4sNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SNVPROC GLeeFuncPtr_glVertexAttrib4sNV; - #define glVertexAttrib4sNV GLeeFuncPtr_glVertexAttrib4sNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4svNV -#define GLEE_H_DEFINED_glVertexAttrib4svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVNVPROC GLeeFuncPtr_glVertexAttrib4svNV; - #define glVertexAttrib4svNV GLeeFuncPtr_glVertexAttrib4svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4ubNV -#define GLEE_H_DEFINED_glVertexAttrib4ubNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBNVPROC GLeeFuncPtr_glVertexAttrib4ubNV; - #define glVertexAttrib4ubNV GLeeFuncPtr_glVertexAttrib4ubNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4ubvNV -#define GLEE_H_DEFINED_glVertexAttrib4ubvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVNVPROC GLeeFuncPtr_glVertexAttrib4ubvNV; - #define glVertexAttrib4ubvNV GLeeFuncPtr_glVertexAttrib4ubvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs1dvNV -#define GLEE_H_DEFINED_glVertexAttribs1dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1DVNVPROC GLeeFuncPtr_glVertexAttribs1dvNV; - #define glVertexAttribs1dvNV GLeeFuncPtr_glVertexAttribs1dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs1fvNV -#define GLEE_H_DEFINED_glVertexAttribs1fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1FVNVPROC GLeeFuncPtr_glVertexAttribs1fvNV; - #define glVertexAttribs1fvNV GLeeFuncPtr_glVertexAttribs1fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs1svNV -#define GLEE_H_DEFINED_glVertexAttribs1svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1SVNVPROC GLeeFuncPtr_glVertexAttribs1svNV; - #define glVertexAttribs1svNV GLeeFuncPtr_glVertexAttribs1svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs2dvNV -#define GLEE_H_DEFINED_glVertexAttribs2dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2DVNVPROC GLeeFuncPtr_glVertexAttribs2dvNV; - #define glVertexAttribs2dvNV GLeeFuncPtr_glVertexAttribs2dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs2fvNV -#define GLEE_H_DEFINED_glVertexAttribs2fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2FVNVPROC GLeeFuncPtr_glVertexAttribs2fvNV; - #define glVertexAttribs2fvNV GLeeFuncPtr_glVertexAttribs2fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs2svNV -#define GLEE_H_DEFINED_glVertexAttribs2svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2SVNVPROC GLeeFuncPtr_glVertexAttribs2svNV; - #define glVertexAttribs2svNV GLeeFuncPtr_glVertexAttribs2svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs3dvNV -#define GLEE_H_DEFINED_glVertexAttribs3dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3DVNVPROC GLeeFuncPtr_glVertexAttribs3dvNV; - #define glVertexAttribs3dvNV GLeeFuncPtr_glVertexAttribs3dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs3fvNV -#define GLEE_H_DEFINED_glVertexAttribs3fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3FVNVPROC GLeeFuncPtr_glVertexAttribs3fvNV; - #define glVertexAttribs3fvNV GLeeFuncPtr_glVertexAttribs3fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs3svNV -#define GLEE_H_DEFINED_glVertexAttribs3svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3SVNVPROC GLeeFuncPtr_glVertexAttribs3svNV; - #define glVertexAttribs3svNV GLeeFuncPtr_glVertexAttribs3svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs4dvNV -#define GLEE_H_DEFINED_glVertexAttribs4dvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4DVNVPROC GLeeFuncPtr_glVertexAttribs4dvNV; - #define glVertexAttribs4dvNV GLeeFuncPtr_glVertexAttribs4dvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs4fvNV -#define GLEE_H_DEFINED_glVertexAttribs4fvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4FVNVPROC GLeeFuncPtr_glVertexAttribs4fvNV; - #define glVertexAttribs4fvNV GLeeFuncPtr_glVertexAttribs4fvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs4svNV -#define GLEE_H_DEFINED_glVertexAttribs4svNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4SVNVPROC GLeeFuncPtr_glVertexAttribs4svNV; - #define glVertexAttribs4svNV GLeeFuncPtr_glVertexAttribs4svNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs4ubvNV -#define GLEE_H_DEFINED_glVertexAttribs4ubvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4UBVNVPROC GLeeFuncPtr_glVertexAttribs4ubvNV; - #define glVertexAttribs4ubvNV GLeeFuncPtr_glVertexAttribs4ubvNV -#endif -#endif - -/* GL_SGIX_texture_coordinate_clamp */ - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#define __GLEE_GL_SGIX_texture_coordinate_clamp 1 -/* Constants */ -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif - -/* GL_SGIX_scalebias_hint */ - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#define __GLEE_GL_SGIX_scalebias_hint 1 -/* Constants */ -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif - -/* GL_OML_interlace */ - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#define __GLEE_GL_OML_interlace 1 -/* Constants */ -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif - -/* GL_OML_subsample */ - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#define __GLEE_GL_OML_subsample 1 -/* Constants */ -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif - -/* GL_OML_resample */ - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#define __GLEE_GL_OML_resample 1 -/* Constants */ -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif - -/* GL_NV_copy_depth_to_color */ - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#define __GLEE_GL_NV_copy_depth_to_color 1 -/* Constants */ -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif - -/* GL_ATI_envmap_bumpmap */ - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#define __GLEE_GL_ATI_envmap_bumpmap 1 -/* Constants */ -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -#ifndef GLEE_H_DEFINED_glTexBumpParameterivATI -#define GLEE_H_DEFINED_glTexBumpParameterivATI - typedef void (APIENTRYP GLEEPFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint * param); - GLEE_EXTERN GLEEPFNGLTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glTexBumpParameterivATI; - #define glTexBumpParameterivATI GLeeFuncPtr_glTexBumpParameterivATI -#endif -#ifndef GLEE_H_DEFINED_glTexBumpParameterfvATI -#define GLEE_H_DEFINED_glTexBumpParameterfvATI - typedef void (APIENTRYP GLEEPFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat * param); - GLEE_EXTERN GLEEPFNGLTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glTexBumpParameterfvATI; - #define glTexBumpParameterfvATI GLeeFuncPtr_glTexBumpParameterfvATI -#endif -#ifndef GLEE_H_DEFINED_glGetTexBumpParameterivATI -#define GLEE_H_DEFINED_glGetTexBumpParameterivATI - typedef void (APIENTRYP GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint * param); - GLEE_EXTERN GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glGetTexBumpParameterivATI; - #define glGetTexBumpParameterivATI GLeeFuncPtr_glGetTexBumpParameterivATI -#endif -#ifndef GLEE_H_DEFINED_glGetTexBumpParameterfvATI -#define GLEE_H_DEFINED_glGetTexBumpParameterfvATI - typedef void (APIENTRYP GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat * param); - GLEE_EXTERN GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glGetTexBumpParameterfvATI; - #define glGetTexBumpParameterfvATI GLeeFuncPtr_glGetTexBumpParameterfvATI -#endif -#endif - -/* GL_ATI_fragment_shader */ - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#define __GLEE_GL_ATI_fragment_shader 1 -/* Constants */ -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#ifndef GLEE_H_DEFINED_glGenFragmentShadersATI -#define GLEE_H_DEFINED_glGenFragmentShadersATI - typedef GLuint (APIENTRYP GLEEPFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); - GLEE_EXTERN GLEEPFNGLGENFRAGMENTSHADERSATIPROC GLeeFuncPtr_glGenFragmentShadersATI; - #define glGenFragmentShadersATI GLeeFuncPtr_glGenFragmentShadersATI -#endif -#ifndef GLEE_H_DEFINED_glBindFragmentShaderATI -#define GLEE_H_DEFINED_glBindFragmentShaderATI - typedef void (APIENTRYP GLEEPFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLBINDFRAGMENTSHADERATIPROC GLeeFuncPtr_glBindFragmentShaderATI; - #define glBindFragmentShaderATI GLeeFuncPtr_glBindFragmentShaderATI -#endif -#ifndef GLEE_H_DEFINED_glDeleteFragmentShaderATI -#define GLEE_H_DEFINED_glDeleteFragmentShaderATI - typedef void (APIENTRYP GLEEPFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLDELETEFRAGMENTSHADERATIPROC GLeeFuncPtr_glDeleteFragmentShaderATI; - #define glDeleteFragmentShaderATI GLeeFuncPtr_glDeleteFragmentShaderATI -#endif -#ifndef GLEE_H_DEFINED_glBeginFragmentShaderATI -#define GLEE_H_DEFINED_glBeginFragmentShaderATI - typedef void (APIENTRYP GLEEPFNGLBEGINFRAGMENTSHADERATIPROC) (); - GLEE_EXTERN GLEEPFNGLBEGINFRAGMENTSHADERATIPROC GLeeFuncPtr_glBeginFragmentShaderATI; - #define glBeginFragmentShaderATI GLeeFuncPtr_glBeginFragmentShaderATI -#endif -#ifndef GLEE_H_DEFINED_glEndFragmentShaderATI -#define GLEE_H_DEFINED_glEndFragmentShaderATI - typedef void (APIENTRYP GLEEPFNGLENDFRAGMENTSHADERATIPROC) (); - GLEE_EXTERN GLEEPFNGLENDFRAGMENTSHADERATIPROC GLeeFuncPtr_glEndFragmentShaderATI; - #define glEndFragmentShaderATI GLeeFuncPtr_glEndFragmentShaderATI -#endif -#ifndef GLEE_H_DEFINED_glPassTexCoordATI -#define GLEE_H_DEFINED_glPassTexCoordATI - typedef void (APIENTRYP GLEEPFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); - GLEE_EXTERN GLEEPFNGLPASSTEXCOORDATIPROC GLeeFuncPtr_glPassTexCoordATI; - #define glPassTexCoordATI GLeeFuncPtr_glPassTexCoordATI -#endif -#ifndef GLEE_H_DEFINED_glSampleMapATI -#define GLEE_H_DEFINED_glSampleMapATI - typedef void (APIENTRYP GLEEPFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); - GLEE_EXTERN GLEEPFNGLSAMPLEMAPATIPROC GLeeFuncPtr_glSampleMapATI; - #define glSampleMapATI GLeeFuncPtr_glSampleMapATI -#endif -#ifndef GLEE_H_DEFINED_glColorFragmentOp1ATI -#define GLEE_H_DEFINED_glColorFragmentOp1ATI - typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); - GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP1ATIPROC GLeeFuncPtr_glColorFragmentOp1ATI; - #define glColorFragmentOp1ATI GLeeFuncPtr_glColorFragmentOp1ATI -#endif -#ifndef GLEE_H_DEFINED_glColorFragmentOp2ATI -#define GLEE_H_DEFINED_glColorFragmentOp2ATI - typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); - GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP2ATIPROC GLeeFuncPtr_glColorFragmentOp2ATI; - #define glColorFragmentOp2ATI GLeeFuncPtr_glColorFragmentOp2ATI -#endif -#ifndef GLEE_H_DEFINED_glColorFragmentOp3ATI -#define GLEE_H_DEFINED_glColorFragmentOp3ATI - typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); - GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP3ATIPROC GLeeFuncPtr_glColorFragmentOp3ATI; - #define glColorFragmentOp3ATI GLeeFuncPtr_glColorFragmentOp3ATI -#endif -#ifndef GLEE_H_DEFINED_glAlphaFragmentOp1ATI -#define GLEE_H_DEFINED_glAlphaFragmentOp1ATI - typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); - GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP1ATIPROC GLeeFuncPtr_glAlphaFragmentOp1ATI; - #define glAlphaFragmentOp1ATI GLeeFuncPtr_glAlphaFragmentOp1ATI -#endif -#ifndef GLEE_H_DEFINED_glAlphaFragmentOp2ATI -#define GLEE_H_DEFINED_glAlphaFragmentOp2ATI - typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); - GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP2ATIPROC GLeeFuncPtr_glAlphaFragmentOp2ATI; - #define glAlphaFragmentOp2ATI GLeeFuncPtr_glAlphaFragmentOp2ATI -#endif -#ifndef GLEE_H_DEFINED_glAlphaFragmentOp3ATI -#define GLEE_H_DEFINED_glAlphaFragmentOp3ATI - typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); - GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP3ATIPROC GLeeFuncPtr_glAlphaFragmentOp3ATI; - #define glAlphaFragmentOp3ATI GLeeFuncPtr_glAlphaFragmentOp3ATI -#endif -#ifndef GLEE_H_DEFINED_glSetFragmentShaderConstantATI -#define GLEE_H_DEFINED_glSetFragmentShaderConstantATI - typedef void (APIENTRYP GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC GLeeFuncPtr_glSetFragmentShaderConstantATI; - #define glSetFragmentShaderConstantATI GLeeFuncPtr_glSetFragmentShaderConstantATI -#endif -#endif - -/* GL_ATI_pn_triangles */ - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#define __GLEE_GL_ATI_pn_triangles 1 -/* Constants */ -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -#ifndef GLEE_H_DEFINED_glPNTrianglesiATI -#define GLEE_H_DEFINED_glPNTrianglesiATI - typedef void (APIENTRYP GLEEPFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLPNTRIANGLESIATIPROC GLeeFuncPtr_glPNTrianglesiATI; - #define glPNTrianglesiATI GLeeFuncPtr_glPNTrianglesiATI -#endif -#ifndef GLEE_H_DEFINED_glPNTrianglesfATI -#define GLEE_H_DEFINED_glPNTrianglesfATI - typedef void (APIENTRYP GLEEPFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLPNTRIANGLESFATIPROC GLeeFuncPtr_glPNTrianglesfATI; - #define glPNTrianglesfATI GLeeFuncPtr_glPNTrianglesfATI -#endif -#endif - -/* GL_ATI_vertex_array_object */ - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#define __GLEE_GL_ATI_vertex_array_object 1 -/* Constants */ -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -#ifndef GLEE_H_DEFINED_glNewObjectBufferATI -#define GLEE_H_DEFINED_glNewObjectBufferATI - typedef GLuint (APIENTRYP GLEEPFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid * pointer, GLenum usage); - GLEE_EXTERN GLEEPFNGLNEWOBJECTBUFFERATIPROC GLeeFuncPtr_glNewObjectBufferATI; - #define glNewObjectBufferATI GLeeFuncPtr_glNewObjectBufferATI -#endif -#ifndef GLEE_H_DEFINED_glIsObjectBufferATI -#define GLEE_H_DEFINED_glIsObjectBufferATI - typedef GLboolean (APIENTRYP GLEEPFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLISOBJECTBUFFERATIPROC GLeeFuncPtr_glIsObjectBufferATI; - #define glIsObjectBufferATI GLeeFuncPtr_glIsObjectBufferATI -#endif -#ifndef GLEE_H_DEFINED_glUpdateObjectBufferATI -#define GLEE_H_DEFINED_glUpdateObjectBufferATI - typedef void (APIENTRYP GLEEPFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pointer, GLenum preserve); - GLEE_EXTERN GLEEPFNGLUPDATEOBJECTBUFFERATIPROC GLeeFuncPtr_glUpdateObjectBufferATI; - #define glUpdateObjectBufferATI GLeeFuncPtr_glUpdateObjectBufferATI -#endif -#ifndef GLEE_H_DEFINED_glGetObjectBufferfvATI -#define GLEE_H_DEFINED_glGetObjectBufferfvATI - typedef void (APIENTRYP GLEEPFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETOBJECTBUFFERFVATIPROC GLeeFuncPtr_glGetObjectBufferfvATI; - #define glGetObjectBufferfvATI GLeeFuncPtr_glGetObjectBufferfvATI -#endif -#ifndef GLEE_H_DEFINED_glGetObjectBufferivATI -#define GLEE_H_DEFINED_glGetObjectBufferivATI - typedef void (APIENTRYP GLEEPFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETOBJECTBUFFERIVATIPROC GLeeFuncPtr_glGetObjectBufferivATI; - #define glGetObjectBufferivATI GLeeFuncPtr_glGetObjectBufferivATI -#endif -#ifndef GLEE_H_DEFINED_glFreeObjectBufferATI -#define GLEE_H_DEFINED_glFreeObjectBufferATI - typedef void (APIENTRYP GLEEPFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLFREEOBJECTBUFFERATIPROC GLeeFuncPtr_glFreeObjectBufferATI; - #define glFreeObjectBufferATI GLeeFuncPtr_glFreeObjectBufferATI -#endif -#ifndef GLEE_H_DEFINED_glArrayObjectATI -#define GLEE_H_DEFINED_glArrayObjectATI - typedef void (APIENTRYP GLEEPFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); - GLEE_EXTERN GLEEPFNGLARRAYOBJECTATIPROC GLeeFuncPtr_glArrayObjectATI; - #define glArrayObjectATI GLeeFuncPtr_glArrayObjectATI -#endif -#ifndef GLEE_H_DEFINED_glGetArrayObjectfvATI -#define GLEE_H_DEFINED_glGetArrayObjectfvATI - typedef void (APIENTRYP GLEEPFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetArrayObjectfvATI; - #define glGetArrayObjectfvATI GLeeFuncPtr_glGetArrayObjectfvATI -#endif -#ifndef GLEE_H_DEFINED_glGetArrayObjectivATI -#define GLEE_H_DEFINED_glGetArrayObjectivATI - typedef void (APIENTRYP GLEEPFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetArrayObjectivATI; - #define glGetArrayObjectivATI GLeeFuncPtr_glGetArrayObjectivATI -#endif -#ifndef GLEE_H_DEFINED_glVariantArrayObjectATI -#define GLEE_H_DEFINED_glVariantArrayObjectATI - typedef void (APIENTRYP GLEEPFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); - GLEE_EXTERN GLEEPFNGLVARIANTARRAYOBJECTATIPROC GLeeFuncPtr_glVariantArrayObjectATI; - #define glVariantArrayObjectATI GLeeFuncPtr_glVariantArrayObjectATI -#endif -#ifndef GLEE_H_DEFINED_glGetVariantArrayObjectfvATI -#define GLEE_H_DEFINED_glGetVariantArrayObjectfvATI - typedef void (APIENTRYP GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVariantArrayObjectfvATI; - #define glGetVariantArrayObjectfvATI GLeeFuncPtr_glGetVariantArrayObjectfvATI -#endif -#ifndef GLEE_H_DEFINED_glGetVariantArrayObjectivATI -#define GLEE_H_DEFINED_glGetVariantArrayObjectivATI - typedef void (APIENTRYP GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVariantArrayObjectivATI; - #define glGetVariantArrayObjectivATI GLeeFuncPtr_glGetVariantArrayObjectivATI -#endif -#endif - -/* GL_EXT_vertex_shader */ - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#define __GLEE_GL_EXT_vertex_shader 1 -/* Constants */ -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -#ifndef GLEE_H_DEFINED_glBeginVertexShaderEXT -#define GLEE_H_DEFINED_glBeginVertexShaderEXT - typedef void (APIENTRYP GLEEPFNGLBEGINVERTEXSHADEREXTPROC) (); - GLEE_EXTERN GLEEPFNGLBEGINVERTEXSHADEREXTPROC GLeeFuncPtr_glBeginVertexShaderEXT; - #define glBeginVertexShaderEXT GLeeFuncPtr_glBeginVertexShaderEXT -#endif -#ifndef GLEE_H_DEFINED_glEndVertexShaderEXT -#define GLEE_H_DEFINED_glEndVertexShaderEXT - typedef void (APIENTRYP GLEEPFNGLENDVERTEXSHADEREXTPROC) (); - GLEE_EXTERN GLEEPFNGLENDVERTEXSHADEREXTPROC GLeeFuncPtr_glEndVertexShaderEXT; - #define glEndVertexShaderEXT GLeeFuncPtr_glEndVertexShaderEXT -#endif -#ifndef GLEE_H_DEFINED_glBindVertexShaderEXT -#define GLEE_H_DEFINED_glBindVertexShaderEXT - typedef void (APIENTRYP GLEEPFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLBINDVERTEXSHADEREXTPROC GLeeFuncPtr_glBindVertexShaderEXT; - #define glBindVertexShaderEXT GLeeFuncPtr_glBindVertexShaderEXT -#endif -#ifndef GLEE_H_DEFINED_glGenVertexShadersEXT -#define GLEE_H_DEFINED_glGenVertexShadersEXT - typedef GLuint (APIENTRYP GLEEPFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); - GLEE_EXTERN GLEEPFNGLGENVERTEXSHADERSEXTPROC GLeeFuncPtr_glGenVertexShadersEXT; - #define glGenVertexShadersEXT GLeeFuncPtr_glGenVertexShadersEXT -#endif -#ifndef GLEE_H_DEFINED_glDeleteVertexShaderEXT -#define GLEE_H_DEFINED_glDeleteVertexShaderEXT - typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLDELETEVERTEXSHADEREXTPROC GLeeFuncPtr_glDeleteVertexShaderEXT; - #define glDeleteVertexShaderEXT GLeeFuncPtr_glDeleteVertexShaderEXT -#endif -#ifndef GLEE_H_DEFINED_glShaderOp1EXT -#define GLEE_H_DEFINED_glShaderOp1EXT - typedef void (APIENTRYP GLEEPFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); - GLEE_EXTERN GLEEPFNGLSHADEROP1EXTPROC GLeeFuncPtr_glShaderOp1EXT; - #define glShaderOp1EXT GLeeFuncPtr_glShaderOp1EXT -#endif -#ifndef GLEE_H_DEFINED_glShaderOp2EXT -#define GLEE_H_DEFINED_glShaderOp2EXT - typedef void (APIENTRYP GLEEPFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); - GLEE_EXTERN GLEEPFNGLSHADEROP2EXTPROC GLeeFuncPtr_glShaderOp2EXT; - #define glShaderOp2EXT GLeeFuncPtr_glShaderOp2EXT -#endif -#ifndef GLEE_H_DEFINED_glShaderOp3EXT -#define GLEE_H_DEFINED_glShaderOp3EXT - typedef void (APIENTRYP GLEEPFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); - GLEE_EXTERN GLEEPFNGLSHADEROP3EXTPROC GLeeFuncPtr_glShaderOp3EXT; - #define glShaderOp3EXT GLeeFuncPtr_glShaderOp3EXT -#endif -#ifndef GLEE_H_DEFINED_glSwizzleEXT -#define GLEE_H_DEFINED_glSwizzleEXT - typedef void (APIENTRYP GLEEPFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); - GLEE_EXTERN GLEEPFNGLSWIZZLEEXTPROC GLeeFuncPtr_glSwizzleEXT; - #define glSwizzleEXT GLeeFuncPtr_glSwizzleEXT -#endif -#ifndef GLEE_H_DEFINED_glWriteMaskEXT -#define GLEE_H_DEFINED_glWriteMaskEXT - typedef void (APIENTRYP GLEEPFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); - GLEE_EXTERN GLEEPFNGLWRITEMASKEXTPROC GLeeFuncPtr_glWriteMaskEXT; - #define glWriteMaskEXT GLeeFuncPtr_glWriteMaskEXT -#endif -#ifndef GLEE_H_DEFINED_glInsertComponentEXT -#define GLEE_H_DEFINED_glInsertComponentEXT - typedef void (APIENTRYP GLEEPFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); - GLEE_EXTERN GLEEPFNGLINSERTCOMPONENTEXTPROC GLeeFuncPtr_glInsertComponentEXT; - #define glInsertComponentEXT GLeeFuncPtr_glInsertComponentEXT -#endif -#ifndef GLEE_H_DEFINED_glExtractComponentEXT -#define GLEE_H_DEFINED_glExtractComponentEXT - typedef void (APIENTRYP GLEEPFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); - GLEE_EXTERN GLEEPFNGLEXTRACTCOMPONENTEXTPROC GLeeFuncPtr_glExtractComponentEXT; - #define glExtractComponentEXT GLeeFuncPtr_glExtractComponentEXT -#endif -#ifndef GLEE_H_DEFINED_glGenSymbolsEXT -#define GLEE_H_DEFINED_glGenSymbolsEXT - typedef GLuint (APIENTRYP GLEEPFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); - GLEE_EXTERN GLEEPFNGLGENSYMBOLSEXTPROC GLeeFuncPtr_glGenSymbolsEXT; - #define glGenSymbolsEXT GLeeFuncPtr_glGenSymbolsEXT -#endif -#ifndef GLEE_H_DEFINED_glSetInvariantEXT -#define GLEE_H_DEFINED_glSetInvariantEXT - typedef void (APIENTRYP GLEEPFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid * addr); - GLEE_EXTERN GLEEPFNGLSETINVARIANTEXTPROC GLeeFuncPtr_glSetInvariantEXT; - #define glSetInvariantEXT GLeeFuncPtr_glSetInvariantEXT -#endif -#ifndef GLEE_H_DEFINED_glSetLocalConstantEXT -#define GLEE_H_DEFINED_glSetLocalConstantEXT - typedef void (APIENTRYP GLEEPFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid * addr); - GLEE_EXTERN GLEEPFNGLSETLOCALCONSTANTEXTPROC GLeeFuncPtr_glSetLocalConstantEXT; - #define glSetLocalConstantEXT GLeeFuncPtr_glSetLocalConstantEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantbvEXT -#define GLEE_H_DEFINED_glVariantbvEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte * addr); - GLEE_EXTERN GLEEPFNGLVARIANTBVEXTPROC GLeeFuncPtr_glVariantbvEXT; - #define glVariantbvEXT GLeeFuncPtr_glVariantbvEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantsvEXT -#define GLEE_H_DEFINED_glVariantsvEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort * addr); - GLEE_EXTERN GLEEPFNGLVARIANTSVEXTPROC GLeeFuncPtr_glVariantsvEXT; - #define glVariantsvEXT GLeeFuncPtr_glVariantsvEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantivEXT -#define GLEE_H_DEFINED_glVariantivEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTIVEXTPROC) (GLuint id, const GLint * addr); - GLEE_EXTERN GLEEPFNGLVARIANTIVEXTPROC GLeeFuncPtr_glVariantivEXT; - #define glVariantivEXT GLeeFuncPtr_glVariantivEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantfvEXT -#define GLEE_H_DEFINED_glVariantfvEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat * addr); - GLEE_EXTERN GLEEPFNGLVARIANTFVEXTPROC GLeeFuncPtr_glVariantfvEXT; - #define glVariantfvEXT GLeeFuncPtr_glVariantfvEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantdvEXT -#define GLEE_H_DEFINED_glVariantdvEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble * addr); - GLEE_EXTERN GLEEPFNGLVARIANTDVEXTPROC GLeeFuncPtr_glVariantdvEXT; - #define glVariantdvEXT GLeeFuncPtr_glVariantdvEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantubvEXT -#define GLEE_H_DEFINED_glVariantubvEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte * addr); - GLEE_EXTERN GLEEPFNGLVARIANTUBVEXTPROC GLeeFuncPtr_glVariantubvEXT; - #define glVariantubvEXT GLeeFuncPtr_glVariantubvEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantusvEXT -#define GLEE_H_DEFINED_glVariantusvEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort * addr); - GLEE_EXTERN GLEEPFNGLVARIANTUSVEXTPROC GLeeFuncPtr_glVariantusvEXT; - #define glVariantusvEXT GLeeFuncPtr_glVariantusvEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantuivEXT -#define GLEE_H_DEFINED_glVariantuivEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint * addr); - GLEE_EXTERN GLEEPFNGLVARIANTUIVEXTPROC GLeeFuncPtr_glVariantuivEXT; - #define glVariantuivEXT GLeeFuncPtr_glVariantuivEXT -#endif -#ifndef GLEE_H_DEFINED_glVariantPointerEXT -#define GLEE_H_DEFINED_glVariantPointerEXT - typedef void (APIENTRYP GLEEPFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid * addr); - GLEE_EXTERN GLEEPFNGLVARIANTPOINTEREXTPROC GLeeFuncPtr_glVariantPointerEXT; - #define glVariantPointerEXT GLeeFuncPtr_glVariantPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glEnableVariantClientStateEXT -#define GLEE_H_DEFINED_glEnableVariantClientStateEXT - typedef void (APIENTRYP GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glEnableVariantClientStateEXT; - #define glEnableVariantClientStateEXT GLeeFuncPtr_glEnableVariantClientStateEXT -#endif -#ifndef GLEE_H_DEFINED_glDisableVariantClientStateEXT -#define GLEE_H_DEFINED_glDisableVariantClientStateEXT - typedef void (APIENTRYP GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glDisableVariantClientStateEXT; - #define glDisableVariantClientStateEXT GLeeFuncPtr_glDisableVariantClientStateEXT -#endif -#ifndef GLEE_H_DEFINED_glBindLightParameterEXT -#define GLEE_H_DEFINED_glBindLightParameterEXT - typedef GLuint (APIENTRYP GLEEPFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); - GLEE_EXTERN GLEEPFNGLBINDLIGHTPARAMETEREXTPROC GLeeFuncPtr_glBindLightParameterEXT; - #define glBindLightParameterEXT GLeeFuncPtr_glBindLightParameterEXT -#endif -#ifndef GLEE_H_DEFINED_glBindMaterialParameterEXT -#define GLEE_H_DEFINED_glBindMaterialParameterEXT - typedef GLuint (APIENTRYP GLEEPFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); - GLEE_EXTERN GLEEPFNGLBINDMATERIALPARAMETEREXTPROC GLeeFuncPtr_glBindMaterialParameterEXT; - #define glBindMaterialParameterEXT GLeeFuncPtr_glBindMaterialParameterEXT -#endif -#ifndef GLEE_H_DEFINED_glBindTexGenParameterEXT -#define GLEE_H_DEFINED_glBindTexGenParameterEXT - typedef GLuint (APIENTRYP GLEEPFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); - GLEE_EXTERN GLEEPFNGLBINDTEXGENPARAMETEREXTPROC GLeeFuncPtr_glBindTexGenParameterEXT; - #define glBindTexGenParameterEXT GLeeFuncPtr_glBindTexGenParameterEXT -#endif -#ifndef GLEE_H_DEFINED_glBindTextureUnitParameterEXT -#define GLEE_H_DEFINED_glBindTextureUnitParameterEXT - typedef GLuint (APIENTRYP GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); - GLEE_EXTERN GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC GLeeFuncPtr_glBindTextureUnitParameterEXT; - #define glBindTextureUnitParameterEXT GLeeFuncPtr_glBindTextureUnitParameterEXT -#endif -#ifndef GLEE_H_DEFINED_glBindParameterEXT -#define GLEE_H_DEFINED_glBindParameterEXT - typedef GLuint (APIENTRYP GLEEPFNGLBINDPARAMETEREXTPROC) (GLenum value); - GLEE_EXTERN GLEEPFNGLBINDPARAMETEREXTPROC GLeeFuncPtr_glBindParameterEXT; - #define glBindParameterEXT GLeeFuncPtr_glBindParameterEXT -#endif -#ifndef GLEE_H_DEFINED_glIsVariantEnabledEXT -#define GLEE_H_DEFINED_glIsVariantEnabledEXT - typedef GLboolean (APIENTRYP GLEEPFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); - GLEE_EXTERN GLEEPFNGLISVARIANTENABLEDEXTPROC GLeeFuncPtr_glIsVariantEnabledEXT; - #define glIsVariantEnabledEXT GLeeFuncPtr_glIsVariantEnabledEXT -#endif -#ifndef GLEE_H_DEFINED_glGetVariantBooleanvEXT -#define GLEE_H_DEFINED_glGetVariantBooleanvEXT - typedef void (APIENTRYP GLEEPFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data); - GLEE_EXTERN GLEEPFNGLGETVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetVariantBooleanvEXT; - #define glGetVariantBooleanvEXT GLeeFuncPtr_glGetVariantBooleanvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetVariantIntegervEXT -#define GLEE_H_DEFINED_glGetVariantIntegervEXT - typedef void (APIENTRYP GLEEPFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data); - GLEE_EXTERN GLEEPFNGLGETVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetVariantIntegervEXT; - #define glGetVariantIntegervEXT GLeeFuncPtr_glGetVariantIntegervEXT -#endif -#ifndef GLEE_H_DEFINED_glGetVariantFloatvEXT -#define GLEE_H_DEFINED_glGetVariantFloatvEXT - typedef void (APIENTRYP GLEEPFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data); - GLEE_EXTERN GLEEPFNGLGETVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetVariantFloatvEXT; - #define glGetVariantFloatvEXT GLeeFuncPtr_glGetVariantFloatvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetVariantPointervEXT -#define GLEE_H_DEFINED_glGetVariantPointervEXT - typedef void (APIENTRYP GLEEPFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* * data); - GLEE_EXTERN GLEEPFNGLGETVARIANTPOINTERVEXTPROC GLeeFuncPtr_glGetVariantPointervEXT; - #define glGetVariantPointervEXT GLeeFuncPtr_glGetVariantPointervEXT -#endif -#ifndef GLEE_H_DEFINED_glGetInvariantBooleanvEXT -#define GLEE_H_DEFINED_glGetInvariantBooleanvEXT - typedef void (APIENTRYP GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data); - GLEE_EXTERN GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetInvariantBooleanvEXT; - #define glGetInvariantBooleanvEXT GLeeFuncPtr_glGetInvariantBooleanvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetInvariantIntegervEXT -#define GLEE_H_DEFINED_glGetInvariantIntegervEXT - typedef void (APIENTRYP GLEEPFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data); - GLEE_EXTERN GLEEPFNGLGETINVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetInvariantIntegervEXT; - #define glGetInvariantIntegervEXT GLeeFuncPtr_glGetInvariantIntegervEXT -#endif -#ifndef GLEE_H_DEFINED_glGetInvariantFloatvEXT -#define GLEE_H_DEFINED_glGetInvariantFloatvEXT - typedef void (APIENTRYP GLEEPFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data); - GLEE_EXTERN GLEEPFNGLGETINVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetInvariantFloatvEXT; - #define glGetInvariantFloatvEXT GLeeFuncPtr_glGetInvariantFloatvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetLocalConstantBooleanvEXT -#define GLEE_H_DEFINED_glGetLocalConstantBooleanvEXT - typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data); - GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC GLeeFuncPtr_glGetLocalConstantBooleanvEXT; - #define glGetLocalConstantBooleanvEXT GLeeFuncPtr_glGetLocalConstantBooleanvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetLocalConstantIntegervEXT -#define GLEE_H_DEFINED_glGetLocalConstantIntegervEXT - typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data); - GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC GLeeFuncPtr_glGetLocalConstantIntegervEXT; - #define glGetLocalConstantIntegervEXT GLeeFuncPtr_glGetLocalConstantIntegervEXT -#endif -#ifndef GLEE_H_DEFINED_glGetLocalConstantFloatvEXT -#define GLEE_H_DEFINED_glGetLocalConstantFloatvEXT - typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data); - GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC GLeeFuncPtr_glGetLocalConstantFloatvEXT; - #define glGetLocalConstantFloatvEXT GLeeFuncPtr_glGetLocalConstantFloatvEXT -#endif -#endif - -/* GL_ATI_vertex_streams */ - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#define __GLEE_GL_ATI_vertex_streams 1 -/* Constants */ -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -#ifndef GLEE_H_DEFINED_glVertexStream1sATI -#define GLEE_H_DEFINED_glVertexStream1sATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1SATIPROC GLeeFuncPtr_glVertexStream1sATI; - #define glVertexStream1sATI GLeeFuncPtr_glVertexStream1sATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1svATI -#define GLEE_H_DEFINED_glVertexStream1svATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1SVATIPROC GLeeFuncPtr_glVertexStream1svATI; - #define glVertexStream1svATI GLeeFuncPtr_glVertexStream1svATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1iATI -#define GLEE_H_DEFINED_glVertexStream1iATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1IATIPROC GLeeFuncPtr_glVertexStream1iATI; - #define glVertexStream1iATI GLeeFuncPtr_glVertexStream1iATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1ivATI -#define GLEE_H_DEFINED_glVertexStream1ivATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1IVATIPROC GLeeFuncPtr_glVertexStream1ivATI; - #define glVertexStream1ivATI GLeeFuncPtr_glVertexStream1ivATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1fATI -#define GLEE_H_DEFINED_glVertexStream1fATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1FATIPROC GLeeFuncPtr_glVertexStream1fATI; - #define glVertexStream1fATI GLeeFuncPtr_glVertexStream1fATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1fvATI -#define GLEE_H_DEFINED_glVertexStream1fvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1FVATIPROC GLeeFuncPtr_glVertexStream1fvATI; - #define glVertexStream1fvATI GLeeFuncPtr_glVertexStream1fvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1dATI -#define GLEE_H_DEFINED_glVertexStream1dATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1DATIPROC GLeeFuncPtr_glVertexStream1dATI; - #define glVertexStream1dATI GLeeFuncPtr_glVertexStream1dATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream1dvATI -#define GLEE_H_DEFINED_glVertexStream1dvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1DVATIPROC GLeeFuncPtr_glVertexStream1dvATI; - #define glVertexStream1dvATI GLeeFuncPtr_glVertexStream1dvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2sATI -#define GLEE_H_DEFINED_glVertexStream2sATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2SATIPROC GLeeFuncPtr_glVertexStream2sATI; - #define glVertexStream2sATI GLeeFuncPtr_glVertexStream2sATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2svATI -#define GLEE_H_DEFINED_glVertexStream2svATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2SVATIPROC GLeeFuncPtr_glVertexStream2svATI; - #define glVertexStream2svATI GLeeFuncPtr_glVertexStream2svATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2iATI -#define GLEE_H_DEFINED_glVertexStream2iATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2IATIPROC GLeeFuncPtr_glVertexStream2iATI; - #define glVertexStream2iATI GLeeFuncPtr_glVertexStream2iATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2ivATI -#define GLEE_H_DEFINED_glVertexStream2ivATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2IVATIPROC GLeeFuncPtr_glVertexStream2ivATI; - #define glVertexStream2ivATI GLeeFuncPtr_glVertexStream2ivATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2fATI -#define GLEE_H_DEFINED_glVertexStream2fATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2FATIPROC GLeeFuncPtr_glVertexStream2fATI; - #define glVertexStream2fATI GLeeFuncPtr_glVertexStream2fATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2fvATI -#define GLEE_H_DEFINED_glVertexStream2fvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2FVATIPROC GLeeFuncPtr_glVertexStream2fvATI; - #define glVertexStream2fvATI GLeeFuncPtr_glVertexStream2fvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2dATI -#define GLEE_H_DEFINED_glVertexStream2dATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2DATIPROC GLeeFuncPtr_glVertexStream2dATI; - #define glVertexStream2dATI GLeeFuncPtr_glVertexStream2dATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream2dvATI -#define GLEE_H_DEFINED_glVertexStream2dvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2DVATIPROC GLeeFuncPtr_glVertexStream2dvATI; - #define glVertexStream2dvATI GLeeFuncPtr_glVertexStream2dvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3sATI -#define GLEE_H_DEFINED_glVertexStream3sATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3SATIPROC GLeeFuncPtr_glVertexStream3sATI; - #define glVertexStream3sATI GLeeFuncPtr_glVertexStream3sATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3svATI -#define GLEE_H_DEFINED_glVertexStream3svATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3SVATIPROC GLeeFuncPtr_glVertexStream3svATI; - #define glVertexStream3svATI GLeeFuncPtr_glVertexStream3svATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3iATI -#define GLEE_H_DEFINED_glVertexStream3iATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3IATIPROC GLeeFuncPtr_glVertexStream3iATI; - #define glVertexStream3iATI GLeeFuncPtr_glVertexStream3iATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3ivATI -#define GLEE_H_DEFINED_glVertexStream3ivATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3IVATIPROC GLeeFuncPtr_glVertexStream3ivATI; - #define glVertexStream3ivATI GLeeFuncPtr_glVertexStream3ivATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3fATI -#define GLEE_H_DEFINED_glVertexStream3fATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3FATIPROC GLeeFuncPtr_glVertexStream3fATI; - #define glVertexStream3fATI GLeeFuncPtr_glVertexStream3fATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3fvATI -#define GLEE_H_DEFINED_glVertexStream3fvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3FVATIPROC GLeeFuncPtr_glVertexStream3fvATI; - #define glVertexStream3fvATI GLeeFuncPtr_glVertexStream3fvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3dATI -#define GLEE_H_DEFINED_glVertexStream3dATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3DATIPROC GLeeFuncPtr_glVertexStream3dATI; - #define glVertexStream3dATI GLeeFuncPtr_glVertexStream3dATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream3dvATI -#define GLEE_H_DEFINED_glVertexStream3dvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3DVATIPROC GLeeFuncPtr_glVertexStream3dvATI; - #define glVertexStream3dvATI GLeeFuncPtr_glVertexStream3dvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4sATI -#define GLEE_H_DEFINED_glVertexStream4sATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4SATIPROC GLeeFuncPtr_glVertexStream4sATI; - #define glVertexStream4sATI GLeeFuncPtr_glVertexStream4sATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4svATI -#define GLEE_H_DEFINED_glVertexStream4svATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4SVATIPROC GLeeFuncPtr_glVertexStream4svATI; - #define glVertexStream4svATI GLeeFuncPtr_glVertexStream4svATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4iATI -#define GLEE_H_DEFINED_glVertexStream4iATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4IATIPROC GLeeFuncPtr_glVertexStream4iATI; - #define glVertexStream4iATI GLeeFuncPtr_glVertexStream4iATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4ivATI -#define GLEE_H_DEFINED_glVertexStream4ivATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4IVATIPROC GLeeFuncPtr_glVertexStream4ivATI; - #define glVertexStream4ivATI GLeeFuncPtr_glVertexStream4ivATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4fATI -#define GLEE_H_DEFINED_glVertexStream4fATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4FATIPROC GLeeFuncPtr_glVertexStream4fATI; - #define glVertexStream4fATI GLeeFuncPtr_glVertexStream4fATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4fvATI -#define GLEE_H_DEFINED_glVertexStream4fvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4FVATIPROC GLeeFuncPtr_glVertexStream4fvATI; - #define glVertexStream4fvATI GLeeFuncPtr_glVertexStream4fvATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4dATI -#define GLEE_H_DEFINED_glVertexStream4dATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4DATIPROC GLeeFuncPtr_glVertexStream4dATI; - #define glVertexStream4dATI GLeeFuncPtr_glVertexStream4dATI -#endif -#ifndef GLEE_H_DEFINED_glVertexStream4dvATI -#define GLEE_H_DEFINED_glVertexStream4dvATI - typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble * coords); - GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4DVATIPROC GLeeFuncPtr_glVertexStream4dvATI; - #define glVertexStream4dvATI GLeeFuncPtr_glVertexStream4dvATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3bATI -#define GLEE_H_DEFINED_glNormalStream3bATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3BATIPROC GLeeFuncPtr_glNormalStream3bATI; - #define glNormalStream3bATI GLeeFuncPtr_glNormalStream3bATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3bvATI -#define GLEE_H_DEFINED_glNormalStream3bvATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte * coords); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3BVATIPROC GLeeFuncPtr_glNormalStream3bvATI; - #define glNormalStream3bvATI GLeeFuncPtr_glNormalStream3bvATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3sATI -#define GLEE_H_DEFINED_glNormalStream3sATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3SATIPROC GLeeFuncPtr_glNormalStream3sATI; - #define glNormalStream3sATI GLeeFuncPtr_glNormalStream3sATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3svATI -#define GLEE_H_DEFINED_glNormalStream3svATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort * coords); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3SVATIPROC GLeeFuncPtr_glNormalStream3svATI; - #define glNormalStream3svATI GLeeFuncPtr_glNormalStream3svATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3iATI -#define GLEE_H_DEFINED_glNormalStream3iATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3IATIPROC GLeeFuncPtr_glNormalStream3iATI; - #define glNormalStream3iATI GLeeFuncPtr_glNormalStream3iATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3ivATI -#define GLEE_H_DEFINED_glNormalStream3ivATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint * coords); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3IVATIPROC GLeeFuncPtr_glNormalStream3ivATI; - #define glNormalStream3ivATI GLeeFuncPtr_glNormalStream3ivATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3fATI -#define GLEE_H_DEFINED_glNormalStream3fATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3FATIPROC GLeeFuncPtr_glNormalStream3fATI; - #define glNormalStream3fATI GLeeFuncPtr_glNormalStream3fATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3fvATI -#define GLEE_H_DEFINED_glNormalStream3fvATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat * coords); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3FVATIPROC GLeeFuncPtr_glNormalStream3fvATI; - #define glNormalStream3fvATI GLeeFuncPtr_glNormalStream3fvATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3dATI -#define GLEE_H_DEFINED_glNormalStream3dATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3DATIPROC GLeeFuncPtr_glNormalStream3dATI; - #define glNormalStream3dATI GLeeFuncPtr_glNormalStream3dATI -#endif -#ifndef GLEE_H_DEFINED_glNormalStream3dvATI -#define GLEE_H_DEFINED_glNormalStream3dvATI - typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble * coords); - GLEE_EXTERN GLEEPFNGLNORMALSTREAM3DVATIPROC GLeeFuncPtr_glNormalStream3dvATI; - #define glNormalStream3dvATI GLeeFuncPtr_glNormalStream3dvATI -#endif -#ifndef GLEE_H_DEFINED_glClientActiveVertexStreamATI -#define GLEE_H_DEFINED_glClientActiveVertexStreamATI - typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); - GLEE_EXTERN GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC GLeeFuncPtr_glClientActiveVertexStreamATI; - #define glClientActiveVertexStreamATI GLeeFuncPtr_glClientActiveVertexStreamATI -#endif -#ifndef GLEE_H_DEFINED_glVertexBlendEnviATI -#define GLEE_H_DEFINED_glVertexBlendEnviATI - typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLVERTEXBLENDENVIATIPROC GLeeFuncPtr_glVertexBlendEnviATI; - #define glVertexBlendEnviATI GLeeFuncPtr_glVertexBlendEnviATI -#endif -#ifndef GLEE_H_DEFINED_glVertexBlendEnvfATI -#define GLEE_H_DEFINED_glVertexBlendEnvfATI - typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLVERTEXBLENDENVFATIPROC GLeeFuncPtr_glVertexBlendEnvfATI; - #define glVertexBlendEnvfATI GLeeFuncPtr_glVertexBlendEnvfATI -#endif -#endif - -/* GL_ATI_element_array */ - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#define __GLEE_GL_ATI_element_array 1 -/* Constants */ -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -#ifndef GLEE_H_DEFINED_glElementPointerATI -#define GLEE_H_DEFINED_glElementPointerATI - typedef void (APIENTRYP GLEEPFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLELEMENTPOINTERATIPROC GLeeFuncPtr_glElementPointerATI; - #define glElementPointerATI GLeeFuncPtr_glElementPointerATI -#endif -#ifndef GLEE_H_DEFINED_glDrawElementArrayATI -#define GLEE_H_DEFINED_glDrawElementArrayATI - typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); - GLEE_EXTERN GLEEPFNGLDRAWELEMENTARRAYATIPROC GLeeFuncPtr_glDrawElementArrayATI; - #define glDrawElementArrayATI GLeeFuncPtr_glDrawElementArrayATI -#endif -#ifndef GLEE_H_DEFINED_glDrawRangeElementArrayATI -#define GLEE_H_DEFINED_glDrawRangeElementArrayATI - typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); - GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC GLeeFuncPtr_glDrawRangeElementArrayATI; - #define glDrawRangeElementArrayATI GLeeFuncPtr_glDrawRangeElementArrayATI -#endif -#endif - -/* GL_SUN_mesh_array */ - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#define __GLEE_GL_SUN_mesh_array 1 -/* Constants */ -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -#ifndef GLEE_H_DEFINED_glDrawMeshArraysSUN -#define GLEE_H_DEFINED_glDrawMeshArraysSUN - typedef void (APIENTRYP GLEEPFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); - GLEE_EXTERN GLEEPFNGLDRAWMESHARRAYSSUNPROC GLeeFuncPtr_glDrawMeshArraysSUN; - #define glDrawMeshArraysSUN GLeeFuncPtr_glDrawMeshArraysSUN -#endif -#endif - -/* GL_SUN_slice_accum */ - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#define __GLEE_GL_SUN_slice_accum 1 -/* Constants */ -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif - -/* GL_NV_multisample_filter_hint */ - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#define __GLEE_GL_NV_multisample_filter_hint 1 -/* Constants */ -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif - -/* GL_NV_depth_clamp */ - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#define __GLEE_GL_NV_depth_clamp 1 -/* Constants */ -#define GL_DEPTH_CLAMP_NV 0x864F -#endif - -/* GL_NV_occlusion_query */ - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#define __GLEE_GL_NV_occlusion_query 1 -/* Constants */ -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#ifndef GLEE_H_DEFINED_glGenOcclusionQueriesNV -#define GLEE_H_DEFINED_glGenOcclusionQueriesNV - typedef void (APIENTRYP GLEEPFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint * ids); - GLEE_EXTERN GLEEPFNGLGENOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glGenOcclusionQueriesNV; - #define glGenOcclusionQueriesNV GLeeFuncPtr_glGenOcclusionQueriesNV -#endif -#ifndef GLEE_H_DEFINED_glDeleteOcclusionQueriesNV -#define GLEE_H_DEFINED_glDeleteOcclusionQueriesNV - typedef void (APIENTRYP GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint * ids); - GLEE_EXTERN GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glDeleteOcclusionQueriesNV; - #define glDeleteOcclusionQueriesNV GLeeFuncPtr_glDeleteOcclusionQueriesNV -#endif -#ifndef GLEE_H_DEFINED_glIsOcclusionQueryNV -#define GLEE_H_DEFINED_glIsOcclusionQueryNV - typedef GLboolean (APIENTRYP GLEEPFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLISOCCLUSIONQUERYNVPROC GLeeFuncPtr_glIsOcclusionQueryNV; - #define glIsOcclusionQueryNV GLeeFuncPtr_glIsOcclusionQueryNV -#endif -#ifndef GLEE_H_DEFINED_glBeginOcclusionQueryNV -#define GLEE_H_DEFINED_glBeginOcclusionQueryNV - typedef void (APIENTRYP GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC GLeeFuncPtr_glBeginOcclusionQueryNV; - #define glBeginOcclusionQueryNV GLeeFuncPtr_glBeginOcclusionQueryNV -#endif -#ifndef GLEE_H_DEFINED_glEndOcclusionQueryNV -#define GLEE_H_DEFINED_glEndOcclusionQueryNV - typedef void (APIENTRYP GLEEPFNGLENDOCCLUSIONQUERYNVPROC) (); - GLEE_EXTERN GLEEPFNGLENDOCCLUSIONQUERYNVPROC GLeeFuncPtr_glEndOcclusionQueryNV; - #define glEndOcclusionQueryNV GLeeFuncPtr_glEndOcclusionQueryNV -#endif -#ifndef GLEE_H_DEFINED_glGetOcclusionQueryivNV -#define GLEE_H_DEFINED_glGetOcclusionQueryivNV - typedef void (APIENTRYP GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC GLeeFuncPtr_glGetOcclusionQueryivNV; - #define glGetOcclusionQueryivNV GLeeFuncPtr_glGetOcclusionQueryivNV -#endif -#ifndef GLEE_H_DEFINED_glGetOcclusionQueryuivNV -#define GLEE_H_DEFINED_glGetOcclusionQueryuivNV - typedef void (APIENTRYP GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC GLeeFuncPtr_glGetOcclusionQueryuivNV; - #define glGetOcclusionQueryuivNV GLeeFuncPtr_glGetOcclusionQueryuivNV -#endif -#endif - -/* GL_NV_point_sprite */ - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#define __GLEE_GL_NV_point_sprite 1 -/* Constants */ -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#ifndef GLEE_H_DEFINED_glPointParameteriNV -#define GLEE_H_DEFINED_glPointParameteriNV - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERINVPROC GLeeFuncPtr_glPointParameteriNV; - #define glPointParameteriNV GLeeFuncPtr_glPointParameteriNV -#endif -#ifndef GLEE_H_DEFINED_glPointParameterivNV -#define GLEE_H_DEFINED_glPointParameterivNV - typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIVNVPROC GLeeFuncPtr_glPointParameterivNV; - #define glPointParameterivNV GLeeFuncPtr_glPointParameterivNV -#endif -#endif - -/* GL_NV_texture_shader3 */ - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#define __GLEE_GL_NV_texture_shader3 1 -/* Constants */ -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif - -/* GL_NV_vertex_program1_1 */ - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#define __GLEE_GL_NV_vertex_program1_1 1 -/* Constants */ -#endif - -/* GL_EXT_shadow_funcs */ - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#define __GLEE_GL_EXT_shadow_funcs 1 -/* Constants */ -#endif - -/* GL_EXT_stencil_two_side */ - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#define __GLEE_GL_EXT_stencil_two_side 1 -/* Constants */ -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#ifndef GLEE_H_DEFINED_glActiveStencilFaceEXT -#define GLEE_H_DEFINED_glActiveStencilFaceEXT - typedef void (APIENTRYP GLEEPFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); - GLEE_EXTERN GLEEPFNGLACTIVESTENCILFACEEXTPROC GLeeFuncPtr_glActiveStencilFaceEXT; - #define glActiveStencilFaceEXT GLeeFuncPtr_glActiveStencilFaceEXT -#endif -#endif - -/* GL_ATI_text_fragment_shader */ - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#define __GLEE_GL_ATI_text_fragment_shader 1 -/* Constants */ -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif - -/* GL_APPLE_client_storage */ - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#define __GLEE_GL_APPLE_client_storage 1 -/* Constants */ -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif - -/* GL_APPLE_element_array */ - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#define __GLEE_GL_APPLE_element_array 1 -/* Constants */ -#define GL_ELEMENT_ARRAY_APPLE 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A -#ifndef GLEE_H_DEFINED_glElementPointerAPPLE -#define GLEE_H_DEFINED_glElementPointerAPPLE - typedef void (APIENTRYP GLEEPFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLELEMENTPOINTERAPPLEPROC GLeeFuncPtr_glElementPointerAPPLE; - #define glElementPointerAPPLE GLeeFuncPtr_glElementPointerAPPLE -#endif -#ifndef GLEE_H_DEFINED_glDrawElementArrayAPPLE -#define GLEE_H_DEFINED_glDrawElementArrayAPPLE - typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); - GLEE_EXTERN GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawElementArrayAPPLE; - #define glDrawElementArrayAPPLE GLeeFuncPtr_glDrawElementArrayAPPLE -#endif -#ifndef GLEE_H_DEFINED_glDrawRangeElementArrayAPPLE -#define GLEE_H_DEFINED_glDrawRangeElementArrayAPPLE - typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); - GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawRangeElementArrayAPPLE; - #define glDrawRangeElementArrayAPPLE GLeeFuncPtr_glDrawRangeElementArrayAPPLE -#endif -#ifndef GLEE_H_DEFINED_glMultiDrawElementArrayAPPLE -#define GLEE_H_DEFINED_glMultiDrawElementArrayAPPLE - typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawElementArrayAPPLE; - #define glMultiDrawElementArrayAPPLE GLeeFuncPtr_glMultiDrawElementArrayAPPLE -#endif -#ifndef GLEE_H_DEFINED_glMultiDrawRangeElementArrayAPPLE -#define GLEE_H_DEFINED_glMultiDrawRangeElementArrayAPPLE - typedef void (APIENTRYP GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE; - #define glMultiDrawRangeElementArrayAPPLE GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE -#endif -#endif - -/* GL_APPLE_fence */ - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#define __GLEE_GL_APPLE_fence 1 -/* Constants */ -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#ifndef GLEE_H_DEFINED_glGenFencesAPPLE -#define GLEE_H_DEFINED_glGenFencesAPPLE - typedef void (APIENTRYP GLEEPFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint * fences); - GLEE_EXTERN GLEEPFNGLGENFENCESAPPLEPROC GLeeFuncPtr_glGenFencesAPPLE; - #define glGenFencesAPPLE GLeeFuncPtr_glGenFencesAPPLE -#endif -#ifndef GLEE_H_DEFINED_glDeleteFencesAPPLE -#define GLEE_H_DEFINED_glDeleteFencesAPPLE - typedef void (APIENTRYP GLEEPFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint * fences); - GLEE_EXTERN GLEEPFNGLDELETEFENCESAPPLEPROC GLeeFuncPtr_glDeleteFencesAPPLE; - #define glDeleteFencesAPPLE GLeeFuncPtr_glDeleteFencesAPPLE -#endif -#ifndef GLEE_H_DEFINED_glSetFenceAPPLE -#define GLEE_H_DEFINED_glSetFenceAPPLE - typedef void (APIENTRYP GLEEPFNGLSETFENCEAPPLEPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLSETFENCEAPPLEPROC GLeeFuncPtr_glSetFenceAPPLE; - #define glSetFenceAPPLE GLeeFuncPtr_glSetFenceAPPLE -#endif -#ifndef GLEE_H_DEFINED_glIsFenceAPPLE -#define GLEE_H_DEFINED_glIsFenceAPPLE - typedef GLboolean (APIENTRYP GLEEPFNGLISFENCEAPPLEPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLISFENCEAPPLEPROC GLeeFuncPtr_glIsFenceAPPLE; - #define glIsFenceAPPLE GLeeFuncPtr_glIsFenceAPPLE -#endif -#ifndef GLEE_H_DEFINED_glTestFenceAPPLE -#define GLEE_H_DEFINED_glTestFenceAPPLE - typedef GLboolean (APIENTRYP GLEEPFNGLTESTFENCEAPPLEPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLTESTFENCEAPPLEPROC GLeeFuncPtr_glTestFenceAPPLE; - #define glTestFenceAPPLE GLeeFuncPtr_glTestFenceAPPLE -#endif -#ifndef GLEE_H_DEFINED_glFinishFenceAPPLE -#define GLEE_H_DEFINED_glFinishFenceAPPLE - typedef void (APIENTRYP GLEEPFNGLFINISHFENCEAPPLEPROC) (GLuint fence); - GLEE_EXTERN GLEEPFNGLFINISHFENCEAPPLEPROC GLeeFuncPtr_glFinishFenceAPPLE; - #define glFinishFenceAPPLE GLeeFuncPtr_glFinishFenceAPPLE -#endif -#ifndef GLEE_H_DEFINED_glTestObjectAPPLE -#define GLEE_H_DEFINED_glTestObjectAPPLE - typedef GLboolean (APIENTRYP GLEEPFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); - GLEE_EXTERN GLEEPFNGLTESTOBJECTAPPLEPROC GLeeFuncPtr_glTestObjectAPPLE; - #define glTestObjectAPPLE GLeeFuncPtr_glTestObjectAPPLE -#endif -#ifndef GLEE_H_DEFINED_glFinishObjectAPPLE -#define GLEE_H_DEFINED_glFinishObjectAPPLE - typedef void (APIENTRYP GLEEPFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); - GLEE_EXTERN GLEEPFNGLFINISHOBJECTAPPLEPROC GLeeFuncPtr_glFinishObjectAPPLE; - #define glFinishObjectAPPLE GLeeFuncPtr_glFinishObjectAPPLE -#endif -#endif - -/* GL_APPLE_vertex_array_object */ - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#define __GLEE_GL_APPLE_vertex_array_object 1 -/* Constants */ -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#ifndef GLEE_H_DEFINED_glBindVertexArrayAPPLE -#define GLEE_H_DEFINED_glBindVertexArrayAPPLE - typedef void (APIENTRYP GLEEPFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); - GLEE_EXTERN GLEEPFNGLBINDVERTEXARRAYAPPLEPROC GLeeFuncPtr_glBindVertexArrayAPPLE; - #define glBindVertexArrayAPPLE GLeeFuncPtr_glBindVertexArrayAPPLE -#endif -#ifndef GLEE_H_DEFINED_glDeleteVertexArraysAPPLE -#define GLEE_H_DEFINED_glDeleteVertexArraysAPPLE - typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint * arrays); - GLEE_EXTERN GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glDeleteVertexArraysAPPLE; - #define glDeleteVertexArraysAPPLE GLeeFuncPtr_glDeleteVertexArraysAPPLE -#endif -#ifndef GLEE_H_DEFINED_glGenVertexArraysAPPLE -#define GLEE_H_DEFINED_glGenVertexArraysAPPLE - typedef void (APIENTRYP GLEEPFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint * arrays); - GLEE_EXTERN GLEEPFNGLGENVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glGenVertexArraysAPPLE; - #define glGenVertexArraysAPPLE GLeeFuncPtr_glGenVertexArraysAPPLE -#endif -#ifndef GLEE_H_DEFINED_glIsVertexArrayAPPLE -#define GLEE_H_DEFINED_glIsVertexArrayAPPLE - typedef GLboolean (APIENTRYP GLEEPFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); - GLEE_EXTERN GLEEPFNGLISVERTEXARRAYAPPLEPROC GLeeFuncPtr_glIsVertexArrayAPPLE; - #define glIsVertexArrayAPPLE GLeeFuncPtr_glIsVertexArrayAPPLE -#endif -#endif - -/* GL_APPLE_vertex_array_range */ - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#define __GLEE_GL_APPLE_vertex_array_range 1 -/* Constants */ -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#ifndef GLEE_H_DEFINED_glVertexArrayRangeAPPLE -#define GLEE_H_DEFINED_glVertexArrayRangeAPPLE - typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glVertexArrayRangeAPPLE; - #define glVertexArrayRangeAPPLE GLeeFuncPtr_glVertexArrayRangeAPPLE -#endif -#ifndef GLEE_H_DEFINED_glFlushVertexArrayRangeAPPLE -#define GLEE_H_DEFINED_glFlushVertexArrayRangeAPPLE - typedef void (APIENTRYP GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glFlushVertexArrayRangeAPPLE; - #define glFlushVertexArrayRangeAPPLE GLeeFuncPtr_glFlushVertexArrayRangeAPPLE -#endif -#ifndef GLEE_H_DEFINED_glVertexArrayParameteriAPPLE -#define GLEE_H_DEFINED_glVertexArrayParameteriAPPLE - typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC GLeeFuncPtr_glVertexArrayParameteriAPPLE; - #define glVertexArrayParameteriAPPLE GLeeFuncPtr_glVertexArrayParameteriAPPLE -#endif -#endif - -/* GL_APPLE_ycbcr_422 */ - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#define __GLEE_GL_APPLE_ycbcr_422 1 -/* Constants */ -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -/* GL_S3_s3tc */ - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#define __GLEE_GL_S3_s3tc 1 -/* Constants */ -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#endif - -/* GL_ATI_draw_buffers */ - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#define __GLEE_GL_ATI_draw_buffers 1 -/* Constants */ -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#ifndef GLEE_H_DEFINED_glDrawBuffersATI -#define GLEE_H_DEFINED_glDrawBuffersATI - typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum * bufs); - GLEE_EXTERN GLEEPFNGLDRAWBUFFERSATIPROC GLeeFuncPtr_glDrawBuffersATI; - #define glDrawBuffersATI GLeeFuncPtr_glDrawBuffersATI -#endif -#endif - -/* GL_ATI_pixel_format_float */ - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -#define __GLEE_GL_ATI_pixel_format_float 1 -/* Constants */ -#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif - -/* GL_ATI_texture_env_combine3 */ - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#define __GLEE_GL_ATI_texture_env_combine3 1 -/* Constants */ -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif - -/* GL_ATI_texture_float */ - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#define __GLEE_GL_ATI_texture_float 1 -/* Constants */ -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif - -/* GL_NV_float_buffer */ - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#define __GLEE_GL_NV_float_buffer 1 -/* Constants */ -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif - -/* GL_NV_fragment_program */ - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -#define __GLEE_GL_NV_fragment_program 1 -/* Constants */ -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -#ifndef GLEE_H_DEFINED_glProgramNamedParameter4fNV -#define GLEE_H_DEFINED_glProgramNamedParameter4fNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLeeFuncPtr_glProgramNamedParameter4fNV; - #define glProgramNamedParameter4fNV GLeeFuncPtr_glProgramNamedParameter4fNV -#endif -#ifndef GLEE_H_DEFINED_glProgramNamedParameter4dNV -#define GLEE_H_DEFINED_glProgramNamedParameter4dNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLeeFuncPtr_glProgramNamedParameter4dNV; - #define glProgramNamedParameter4dNV GLeeFuncPtr_glProgramNamedParameter4dNV -#endif -#ifndef GLEE_H_DEFINED_glProgramNamedParameter4fvNV -#define GLEE_H_DEFINED_glProgramNamedParameter4fvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); - GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLeeFuncPtr_glProgramNamedParameter4fvNV; - #define glProgramNamedParameter4fvNV GLeeFuncPtr_glProgramNamedParameter4fvNV -#endif -#ifndef GLEE_H_DEFINED_glProgramNamedParameter4dvNV -#define GLEE_H_DEFINED_glProgramNamedParameter4dvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); - GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLeeFuncPtr_glProgramNamedParameter4dvNV; - #define glProgramNamedParameter4dvNV GLeeFuncPtr_glProgramNamedParameter4dvNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramNamedParameterfvNV -#define GLEE_H_DEFINED_glGetProgramNamedParameterfvNV - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramNamedParameterfvNV; - #define glGetProgramNamedParameterfvNV GLeeFuncPtr_glGetProgramNamedParameterfvNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramNamedParameterdvNV -#define GLEE_H_DEFINED_glGetProgramNamedParameterdvNV - typedef void (APIENTRYP GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramNamedParameterdvNV; - #define glGetProgramNamedParameterdvNV GLeeFuncPtr_glGetProgramNamedParameterdvNV -#endif -#endif - -/* GL_NV_half_float */ - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#define __GLEE_GL_NV_half_float 1 -/* Constants */ -#define GL_HALF_FLOAT_NV 0x140B -#ifndef GLEE_H_DEFINED_glVertex2hNV -#define GLEE_H_DEFINED_glVertex2hNV - typedef void (APIENTRYP GLEEPFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); - GLEE_EXTERN GLEEPFNGLVERTEX2HNVPROC GLeeFuncPtr_glVertex2hNV; - #define glVertex2hNV GLeeFuncPtr_glVertex2hNV -#endif -#ifndef GLEE_H_DEFINED_glVertex2hvNV -#define GLEE_H_DEFINED_glVertex2hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEX2HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEX2HVNVPROC GLeeFuncPtr_glVertex2hvNV; - #define glVertex2hvNV GLeeFuncPtr_glVertex2hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertex3hNV -#define GLEE_H_DEFINED_glVertex3hNV - typedef void (APIENTRYP GLEEPFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); - GLEE_EXTERN GLEEPFNGLVERTEX3HNVPROC GLeeFuncPtr_glVertex3hNV; - #define glVertex3hNV GLeeFuncPtr_glVertex3hNV -#endif -#ifndef GLEE_H_DEFINED_glVertex3hvNV -#define GLEE_H_DEFINED_glVertex3hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEX3HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEX3HVNVPROC GLeeFuncPtr_glVertex3hvNV; - #define glVertex3hvNV GLeeFuncPtr_glVertex3hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertex4hNV -#define GLEE_H_DEFINED_glVertex4hNV - typedef void (APIENTRYP GLEEPFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); - GLEE_EXTERN GLEEPFNGLVERTEX4HNVPROC GLeeFuncPtr_glVertex4hNV; - #define glVertex4hNV GLeeFuncPtr_glVertex4hNV -#endif -#ifndef GLEE_H_DEFINED_glVertex4hvNV -#define GLEE_H_DEFINED_glVertex4hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEX4HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEX4HVNVPROC GLeeFuncPtr_glVertex4hvNV; - #define glVertex4hvNV GLeeFuncPtr_glVertex4hvNV -#endif -#ifndef GLEE_H_DEFINED_glNormal3hNV -#define GLEE_H_DEFINED_glNormal3hNV - typedef void (APIENTRYP GLEEPFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); - GLEE_EXTERN GLEEPFNGLNORMAL3HNVPROC GLeeFuncPtr_glNormal3hNV; - #define glNormal3hNV GLeeFuncPtr_glNormal3hNV -#endif -#ifndef GLEE_H_DEFINED_glNormal3hvNV -#define GLEE_H_DEFINED_glNormal3hvNV - typedef void (APIENTRYP GLEEPFNGLNORMAL3HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLNORMAL3HVNVPROC GLeeFuncPtr_glNormal3hvNV; - #define glNormal3hvNV GLeeFuncPtr_glNormal3hvNV -#endif -#ifndef GLEE_H_DEFINED_glColor3hNV -#define GLEE_H_DEFINED_glColor3hNV - typedef void (APIENTRYP GLEEPFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); - GLEE_EXTERN GLEEPFNGLCOLOR3HNVPROC GLeeFuncPtr_glColor3hNV; - #define glColor3hNV GLeeFuncPtr_glColor3hNV -#endif -#ifndef GLEE_H_DEFINED_glColor3hvNV -#define GLEE_H_DEFINED_glColor3hvNV - typedef void (APIENTRYP GLEEPFNGLCOLOR3HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLCOLOR3HVNVPROC GLeeFuncPtr_glColor3hvNV; - #define glColor3hvNV GLeeFuncPtr_glColor3hvNV -#endif -#ifndef GLEE_H_DEFINED_glColor4hNV -#define GLEE_H_DEFINED_glColor4hNV - typedef void (APIENTRYP GLEEPFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); - GLEE_EXTERN GLEEPFNGLCOLOR4HNVPROC GLeeFuncPtr_glColor4hNV; - #define glColor4hNV GLeeFuncPtr_glColor4hNV -#endif -#ifndef GLEE_H_DEFINED_glColor4hvNV -#define GLEE_H_DEFINED_glColor4hvNV - typedef void (APIENTRYP GLEEPFNGLCOLOR4HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLCOLOR4HVNVPROC GLeeFuncPtr_glColor4hvNV; - #define glColor4hvNV GLeeFuncPtr_glColor4hvNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord1hNV -#define GLEE_H_DEFINED_glTexCoord1hNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD1HNVPROC) (GLhalfNV s); - GLEE_EXTERN GLEEPFNGLTEXCOORD1HNVPROC GLeeFuncPtr_glTexCoord1hNV; - #define glTexCoord1hNV GLeeFuncPtr_glTexCoord1hNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord1hvNV -#define GLEE_H_DEFINED_glTexCoord1hvNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD1HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD1HVNVPROC GLeeFuncPtr_glTexCoord1hvNV; - #define glTexCoord1hvNV GLeeFuncPtr_glTexCoord1hvNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2hNV -#define GLEE_H_DEFINED_glTexCoord2hNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); - GLEE_EXTERN GLEEPFNGLTEXCOORD2HNVPROC GLeeFuncPtr_glTexCoord2hNV; - #define glTexCoord2hNV GLeeFuncPtr_glTexCoord2hNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord2hvNV -#define GLEE_H_DEFINED_glTexCoord2hvNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD2HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD2HVNVPROC GLeeFuncPtr_glTexCoord2hvNV; - #define glTexCoord2hvNV GLeeFuncPtr_glTexCoord2hvNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord3hNV -#define GLEE_H_DEFINED_glTexCoord3hNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); - GLEE_EXTERN GLEEPFNGLTEXCOORD3HNVPROC GLeeFuncPtr_glTexCoord3hNV; - #define glTexCoord3hNV GLeeFuncPtr_glTexCoord3hNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord3hvNV -#define GLEE_H_DEFINED_glTexCoord3hvNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD3HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD3HVNVPROC GLeeFuncPtr_glTexCoord3hvNV; - #define glTexCoord3hvNV GLeeFuncPtr_glTexCoord3hvNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord4hNV -#define GLEE_H_DEFINED_glTexCoord4hNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); - GLEE_EXTERN GLEEPFNGLTEXCOORD4HNVPROC GLeeFuncPtr_glTexCoord4hNV; - #define glTexCoord4hNV GLeeFuncPtr_glTexCoord4hNV -#endif -#ifndef GLEE_H_DEFINED_glTexCoord4hvNV -#define GLEE_H_DEFINED_glTexCoord4hvNV - typedef void (APIENTRYP GLEEPFNGLTEXCOORD4HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLTEXCOORD4HVNVPROC GLeeFuncPtr_glTexCoord4hvNV; - #define glTexCoord4hvNV GLeeFuncPtr_glTexCoord4hvNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1hNV -#define GLEE_H_DEFINED_glMultiTexCoord1hNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1HNVPROC GLeeFuncPtr_glMultiTexCoord1hNV; - #define glMultiTexCoord1hNV GLeeFuncPtr_glMultiTexCoord1hNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord1hvNV -#define GLEE_H_DEFINED_glMultiTexCoord1hvNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1HVNVPROC GLeeFuncPtr_glMultiTexCoord1hvNV; - #define glMultiTexCoord1hvNV GLeeFuncPtr_glMultiTexCoord1hvNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2hNV -#define GLEE_H_DEFINED_glMultiTexCoord2hNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2HNVPROC GLeeFuncPtr_glMultiTexCoord2hNV; - #define glMultiTexCoord2hNV GLeeFuncPtr_glMultiTexCoord2hNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord2hvNV -#define GLEE_H_DEFINED_glMultiTexCoord2hvNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2HVNVPROC GLeeFuncPtr_glMultiTexCoord2hvNV; - #define glMultiTexCoord2hvNV GLeeFuncPtr_glMultiTexCoord2hvNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3hNV -#define GLEE_H_DEFINED_glMultiTexCoord3hNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3HNVPROC GLeeFuncPtr_glMultiTexCoord3hNV; - #define glMultiTexCoord3hNV GLeeFuncPtr_glMultiTexCoord3hNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord3hvNV -#define GLEE_H_DEFINED_glMultiTexCoord3hvNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3HVNVPROC GLeeFuncPtr_glMultiTexCoord3hvNV; - #define glMultiTexCoord3hvNV GLeeFuncPtr_glMultiTexCoord3hvNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4hNV -#define GLEE_H_DEFINED_glMultiTexCoord4hNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4HNVPROC GLeeFuncPtr_glMultiTexCoord4hNV; - #define glMultiTexCoord4hNV GLeeFuncPtr_glMultiTexCoord4hNV -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoord4hvNV -#define GLEE_H_DEFINED_glMultiTexCoord4hvNV - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4HVNVPROC GLeeFuncPtr_glMultiTexCoord4hvNV; - #define glMultiTexCoord4hvNV GLeeFuncPtr_glMultiTexCoord4hvNV -#endif -#ifndef GLEE_H_DEFINED_glFogCoordhNV -#define GLEE_H_DEFINED_glFogCoordhNV - typedef void (APIENTRYP GLEEPFNGLFOGCOORDHNVPROC) (GLhalfNV fog); - GLEE_EXTERN GLEEPFNGLFOGCOORDHNVPROC GLeeFuncPtr_glFogCoordhNV; - #define glFogCoordhNV GLeeFuncPtr_glFogCoordhNV -#endif -#ifndef GLEE_H_DEFINED_glFogCoordhvNV -#define GLEE_H_DEFINED_glFogCoordhvNV - typedef void (APIENTRYP GLEEPFNGLFOGCOORDHVNVPROC) (const GLhalfNV * fog); - GLEE_EXTERN GLEEPFNGLFOGCOORDHVNVPROC GLeeFuncPtr_glFogCoordhvNV; - #define glFogCoordhvNV GLeeFuncPtr_glFogCoordhvNV -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3hNV -#define GLEE_H_DEFINED_glSecondaryColor3hNV - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3HNVPROC GLeeFuncPtr_glSecondaryColor3hNV; - #define glSecondaryColor3hNV GLeeFuncPtr_glSecondaryColor3hNV -#endif -#ifndef GLEE_H_DEFINED_glSecondaryColor3hvNV -#define GLEE_H_DEFINED_glSecondaryColor3hvNV - typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3HVNVPROC GLeeFuncPtr_glSecondaryColor3hvNV; - #define glSecondaryColor3hvNV GLeeFuncPtr_glSecondaryColor3hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexWeighthNV -#define GLEE_H_DEFINED_glVertexWeighthNV - typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); - GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTHNVPROC GLeeFuncPtr_glVertexWeighthNV; - #define glVertexWeighthNV GLeeFuncPtr_glVertexWeighthNV -#endif -#ifndef GLEE_H_DEFINED_glVertexWeighthvNV -#define GLEE_H_DEFINED_glVertexWeighthvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV * weight); - GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTHVNVPROC GLeeFuncPtr_glVertexWeighthvNV; - #define glVertexWeighthvNV GLeeFuncPtr_glVertexWeighthvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1hNV -#define GLEE_H_DEFINED_glVertexAttrib1hNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1HNVPROC GLeeFuncPtr_glVertexAttrib1hNV; - #define glVertexAttrib1hNV GLeeFuncPtr_glVertexAttrib1hNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib1hvNV -#define GLEE_H_DEFINED_glVertexAttrib1hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1HVNVPROC GLeeFuncPtr_glVertexAttrib1hvNV; - #define glVertexAttrib1hvNV GLeeFuncPtr_glVertexAttrib1hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2hNV -#define GLEE_H_DEFINED_glVertexAttrib2hNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2HNVPROC GLeeFuncPtr_glVertexAttrib2hNV; - #define glVertexAttrib2hNV GLeeFuncPtr_glVertexAttrib2hNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib2hvNV -#define GLEE_H_DEFINED_glVertexAttrib2hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2HVNVPROC GLeeFuncPtr_glVertexAttrib2hvNV; - #define glVertexAttrib2hvNV GLeeFuncPtr_glVertexAttrib2hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3hNV -#define GLEE_H_DEFINED_glVertexAttrib3hNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3HNVPROC GLeeFuncPtr_glVertexAttrib3hNV; - #define glVertexAttrib3hNV GLeeFuncPtr_glVertexAttrib3hNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib3hvNV -#define GLEE_H_DEFINED_glVertexAttrib3hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3HVNVPROC GLeeFuncPtr_glVertexAttrib3hvNV; - #define glVertexAttrib3hvNV GLeeFuncPtr_glVertexAttrib3hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4hNV -#define GLEE_H_DEFINED_glVertexAttrib4hNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4HNVPROC GLeeFuncPtr_glVertexAttrib4hNV; - #define glVertexAttrib4hNV GLeeFuncPtr_glVertexAttrib4hNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttrib4hvNV -#define GLEE_H_DEFINED_glVertexAttrib4hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4HVNVPROC GLeeFuncPtr_glVertexAttrib4hvNV; - #define glVertexAttrib4hvNV GLeeFuncPtr_glVertexAttrib4hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs1hvNV -#define GLEE_H_DEFINED_glVertexAttribs1hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1HVNVPROC GLeeFuncPtr_glVertexAttribs1hvNV; - #define glVertexAttribs1hvNV GLeeFuncPtr_glVertexAttribs1hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs2hvNV -#define GLEE_H_DEFINED_glVertexAttribs2hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2HVNVPROC GLeeFuncPtr_glVertexAttribs2hvNV; - #define glVertexAttribs2hvNV GLeeFuncPtr_glVertexAttribs2hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs3hvNV -#define GLEE_H_DEFINED_glVertexAttribs3hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3HVNVPROC GLeeFuncPtr_glVertexAttribs3hvNV; - #define glVertexAttribs3hvNV GLeeFuncPtr_glVertexAttribs3hvNV -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribs4hvNV -#define GLEE_H_DEFINED_glVertexAttribs4hvNV - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4HVNVPROC GLeeFuncPtr_glVertexAttribs4hvNV; - #define glVertexAttribs4hvNV GLeeFuncPtr_glVertexAttribs4hvNV -#endif -#endif - -/* GL_NV_pixel_data_range */ - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#define __GLEE_GL_NV_pixel_data_range 1 -/* Constants */ -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#ifndef GLEE_H_DEFINED_glPixelDataRangeNV -#define GLEE_H_DEFINED_glPixelDataRangeNV - typedef void (APIENTRYP GLEEPFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLPIXELDATARANGENVPROC GLeeFuncPtr_glPixelDataRangeNV; - #define glPixelDataRangeNV GLeeFuncPtr_glPixelDataRangeNV -#endif -#ifndef GLEE_H_DEFINED_glFlushPixelDataRangeNV -#define GLEE_H_DEFINED_glFlushPixelDataRangeNV - typedef void (APIENTRYP GLEEPFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLFLUSHPIXELDATARANGENVPROC GLeeFuncPtr_glFlushPixelDataRangeNV; - #define glFlushPixelDataRangeNV GLeeFuncPtr_glFlushPixelDataRangeNV -#endif -#endif - -/* GL_NV_primitive_restart */ - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#define __GLEE_GL_NV_primitive_restart 1 -/* Constants */ -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#ifndef GLEE_H_DEFINED_glPrimitiveRestartNV -#define GLEE_H_DEFINED_glPrimitiveRestartNV - typedef void (APIENTRYP GLEEPFNGLPRIMITIVERESTARTNVPROC) (); - GLEE_EXTERN GLEEPFNGLPRIMITIVERESTARTNVPROC GLeeFuncPtr_glPrimitiveRestartNV; - #define glPrimitiveRestartNV GLeeFuncPtr_glPrimitiveRestartNV -#endif -#ifndef GLEE_H_DEFINED_glPrimitiveRestartIndexNV -#define GLEE_H_DEFINED_glPrimitiveRestartIndexNV - typedef void (APIENTRYP GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); - GLEE_EXTERN GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC GLeeFuncPtr_glPrimitiveRestartIndexNV; - #define glPrimitiveRestartIndexNV GLeeFuncPtr_glPrimitiveRestartIndexNV -#endif -#endif - -/* GL_NV_texture_expand_normal */ - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#define __GLEE_GL_NV_texture_expand_normal 1 -/* Constants */ -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif - -/* GL_NV_vertex_program2 */ - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#define __GLEE_GL_NV_vertex_program2 1 -/* Constants */ -#endif - -/* GL_ATI_map_object_buffer */ - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#define __GLEE_GL_ATI_map_object_buffer 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glMapObjectBufferATI -#define GLEE_H_DEFINED_glMapObjectBufferATI - typedef GLvoid* (APIENTRYP GLEEPFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glMapObjectBufferATI; - #define glMapObjectBufferATI GLeeFuncPtr_glMapObjectBufferATI -#endif -#ifndef GLEE_H_DEFINED_glUnmapObjectBufferATI -#define GLEE_H_DEFINED_glUnmapObjectBufferATI - typedef void (APIENTRYP GLEEPFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLUNMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glUnmapObjectBufferATI; - #define glUnmapObjectBufferATI GLeeFuncPtr_glUnmapObjectBufferATI -#endif -#endif - -/* GL_ATI_separate_stencil */ - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#define __GLEE_GL_ATI_separate_stencil 1 -/* Constants */ -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#ifndef GLEE_H_DEFINED_glStencilOpSeparateATI -#define GLEE_H_DEFINED_glStencilOpSeparateATI - typedef void (APIENTRYP GLEEPFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - GLEE_EXTERN GLEEPFNGLSTENCILOPSEPARATEATIPROC GLeeFuncPtr_glStencilOpSeparateATI; - #define glStencilOpSeparateATI GLeeFuncPtr_glStencilOpSeparateATI -#endif -#ifndef GLEE_H_DEFINED_glStencilFuncSeparateATI -#define GLEE_H_DEFINED_glStencilFuncSeparateATI - typedef void (APIENTRYP GLEEPFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); - GLEE_EXTERN GLEEPFNGLSTENCILFUNCSEPARATEATIPROC GLeeFuncPtr_glStencilFuncSeparateATI; - #define glStencilFuncSeparateATI GLeeFuncPtr_glStencilFuncSeparateATI -#endif -#endif - -/* GL_ATI_vertex_attrib_array_object */ - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#define __GLEE_GL_ATI_vertex_attrib_array_object 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glVertexAttribArrayObjectATI -#define GLEE_H_DEFINED_glVertexAttribArrayObjectATI - typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC GLeeFuncPtr_glVertexAttribArrayObjectATI; - #define glVertexAttribArrayObjectATI GLeeFuncPtr_glVertexAttribArrayObjectATI -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribArrayObjectfvATI -#define GLEE_H_DEFINED_glGetVertexAttribArrayObjectfvATI - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI; - #define glGetVertexAttribArrayObjectfvATI GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribArrayObjectivATI -#define GLEE_H_DEFINED_glGetVertexAttribArrayObjectivATI - typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectivATI; - #define glGetVertexAttribArrayObjectivATI GLeeFuncPtr_glGetVertexAttribArrayObjectivATI -#endif -#endif - -/* GL_OES_read_format */ - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#define __GLEE_GL_OES_read_format 1 -/* Constants */ -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -/* GL_EXT_depth_bounds_test */ - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#define __GLEE_GL_EXT_depth_bounds_test 1 -/* Constants */ -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#ifndef GLEE_H_DEFINED_glDepthBoundsEXT -#define GLEE_H_DEFINED_glDepthBoundsEXT - typedef void (APIENTRYP GLEEPFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); - GLEE_EXTERN GLEEPFNGLDEPTHBOUNDSEXTPROC GLeeFuncPtr_glDepthBoundsEXT; - #define glDepthBoundsEXT GLeeFuncPtr_glDepthBoundsEXT -#endif -#endif - -/* GL_EXT_texture_mirror_clamp */ - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#define __GLEE_GL_EXT_texture_mirror_clamp 1 -/* Constants */ -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif - -/* GL_EXT_blend_equation_separate */ - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#define __GLEE_GL_EXT_blend_equation_separate 1 -/* Constants */ -#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#ifndef GLEE_H_DEFINED_glBlendEquationSeparateEXT -#define GLEE_H_DEFINED_glBlendEquationSeparateEXT - typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); - GLEE_EXTERN GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC GLeeFuncPtr_glBlendEquationSeparateEXT; - #define glBlendEquationSeparateEXT GLeeFuncPtr_glBlendEquationSeparateEXT -#endif -#endif - -/* GL_MESA_pack_invert */ - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#define __GLEE_GL_MESA_pack_invert 1 -/* Constants */ -#define GL_PACK_INVERT_MESA 0x8758 -#endif - -/* GL_MESA_ycbcr_texture */ - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#define __GLEE_GL_MESA_ycbcr_texture 1 -/* Constants */ -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif - -/* GL_EXT_pixel_buffer_object */ - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#define __GLEE_GL_EXT_pixel_buffer_object 1 -/* Constants */ -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif - -/* GL_NV_fragment_program_option */ - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#define __GLEE_GL_NV_fragment_program_option 1 -/* Constants */ -#endif - -/* GL_NV_fragment_program2 */ - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#define __GLEE_GL_NV_fragment_program2 1 -/* Constants */ -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif - -/* GL_NV_vertex_program2_option */ - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#define __GLEE_GL_NV_vertex_program2_option 1 -/* Constants */ -#endif - -/* GL_NV_vertex_program3 */ - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#define __GLEE_GL_NV_vertex_program3 1 -/* Constants */ -#endif - -/* GL_EXT_framebuffer_object */ - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#define __GLEE_GL_EXT_framebuffer_object 1 -/* Constants */ -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#ifndef GLEE_H_DEFINED_glIsRenderbufferEXT -#define GLEE_H_DEFINED_glIsRenderbufferEXT - typedef GLboolean (APIENTRYP GLEEPFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLISRENDERBUFFEREXTPROC GLeeFuncPtr_glIsRenderbufferEXT; - #define glIsRenderbufferEXT GLeeFuncPtr_glIsRenderbufferEXT -#endif -#ifndef GLEE_H_DEFINED_glBindRenderbufferEXT -#define GLEE_H_DEFINED_glBindRenderbufferEXT - typedef void (APIENTRYP GLEEPFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLBINDRENDERBUFFEREXTPROC GLeeFuncPtr_glBindRenderbufferEXT; - #define glBindRenderbufferEXT GLeeFuncPtr_glBindRenderbufferEXT -#endif -#ifndef GLEE_H_DEFINED_glDeleteRenderbuffersEXT -#define GLEE_H_DEFINED_glDeleteRenderbuffersEXT - typedef void (APIENTRYP GLEEPFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint * renderbuffers); - GLEE_EXTERN GLEEPFNGLDELETERENDERBUFFERSEXTPROC GLeeFuncPtr_glDeleteRenderbuffersEXT; - #define glDeleteRenderbuffersEXT GLeeFuncPtr_glDeleteRenderbuffersEXT -#endif -#ifndef GLEE_H_DEFINED_glGenRenderbuffersEXT -#define GLEE_H_DEFINED_glGenRenderbuffersEXT - typedef void (APIENTRYP GLEEPFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint * renderbuffers); - GLEE_EXTERN GLEEPFNGLGENRENDERBUFFERSEXTPROC GLeeFuncPtr_glGenRenderbuffersEXT; - #define glGenRenderbuffersEXT GLeeFuncPtr_glGenRenderbuffersEXT -#endif -#ifndef GLEE_H_DEFINED_glRenderbufferStorageEXT -#define GLEE_H_DEFINED_glRenderbufferStorageEXT - typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glRenderbufferStorageEXT; - #define glRenderbufferStorageEXT GLeeFuncPtr_glRenderbufferStorageEXT -#endif -#ifndef GLEE_H_DEFINED_glGetRenderbufferParameterivEXT -#define GLEE_H_DEFINED_glGetRenderbufferParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetRenderbufferParameterivEXT; - #define glGetRenderbufferParameterivEXT GLeeFuncPtr_glGetRenderbufferParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glIsFramebufferEXT -#define GLEE_H_DEFINED_glIsFramebufferEXT - typedef GLboolean (APIENTRYP GLEEPFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); - GLEE_EXTERN GLEEPFNGLISFRAMEBUFFEREXTPROC GLeeFuncPtr_glIsFramebufferEXT; - #define glIsFramebufferEXT GLeeFuncPtr_glIsFramebufferEXT -#endif -#ifndef GLEE_H_DEFINED_glBindFramebufferEXT -#define GLEE_H_DEFINED_glBindFramebufferEXT - typedef void (APIENTRYP GLEEPFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); - GLEE_EXTERN GLEEPFNGLBINDFRAMEBUFFEREXTPROC GLeeFuncPtr_glBindFramebufferEXT; - #define glBindFramebufferEXT GLeeFuncPtr_glBindFramebufferEXT -#endif -#ifndef GLEE_H_DEFINED_glDeleteFramebuffersEXT -#define GLEE_H_DEFINED_glDeleteFramebuffersEXT - typedef void (APIENTRYP GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint * framebuffers); - GLEE_EXTERN GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC GLeeFuncPtr_glDeleteFramebuffersEXT; - #define glDeleteFramebuffersEXT GLeeFuncPtr_glDeleteFramebuffersEXT -#endif -#ifndef GLEE_H_DEFINED_glGenFramebuffersEXT -#define GLEE_H_DEFINED_glGenFramebuffersEXT - typedef void (APIENTRYP GLEEPFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint * framebuffers); - GLEE_EXTERN GLEEPFNGLGENFRAMEBUFFERSEXTPROC GLeeFuncPtr_glGenFramebuffersEXT; - #define glGenFramebuffersEXT GLeeFuncPtr_glGenFramebuffersEXT -#endif -#ifndef GLEE_H_DEFINED_glCheckFramebufferStatusEXT -#define GLEE_H_DEFINED_glCheckFramebufferStatusEXT - typedef GLenum (APIENTRYP GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckFramebufferStatusEXT; - #define glCheckFramebufferStatusEXT GLeeFuncPtr_glCheckFramebufferStatusEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTexture1DEXT -#define GLEE_H_DEFINED_glFramebufferTexture1DEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glFramebufferTexture1DEXT; - #define glFramebufferTexture1DEXT GLeeFuncPtr_glFramebufferTexture1DEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTexture2DEXT -#define GLEE_H_DEFINED_glFramebufferTexture2DEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glFramebufferTexture2DEXT; - #define glFramebufferTexture2DEXT GLeeFuncPtr_glFramebufferTexture2DEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTexture3DEXT -#define GLEE_H_DEFINED_glFramebufferTexture3DEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glFramebufferTexture3DEXT; - #define glFramebufferTexture3DEXT GLeeFuncPtr_glFramebufferTexture3DEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferRenderbufferEXT -#define GLEE_H_DEFINED_glFramebufferRenderbufferEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glFramebufferRenderbufferEXT; - #define glFramebufferRenderbufferEXT GLeeFuncPtr_glFramebufferRenderbufferEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFramebufferAttachmentParameterivEXT -#define GLEE_H_DEFINED_glGetFramebufferAttachmentParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT; - #define glGetFramebufferAttachmentParameterivEXT GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGenerateMipmapEXT -#define GLEE_H_DEFINED_glGenerateMipmapEXT - typedef void (APIENTRYP GLEEPFNGLGENERATEMIPMAPEXTPROC) (GLenum target); - GLEE_EXTERN GLEEPFNGLGENERATEMIPMAPEXTPROC GLeeFuncPtr_glGenerateMipmapEXT; - #define glGenerateMipmapEXT GLeeFuncPtr_glGenerateMipmapEXT -#endif -#endif - -/* GL_GREMEDY_string_marker */ - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#define __GLEE_GL_GREMEDY_string_marker 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glStringMarkerGREMEDY -#define GLEE_H_DEFINED_glStringMarkerGREMEDY - typedef void (APIENTRYP GLEEPFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid * string); - GLEE_EXTERN GLEEPFNGLSTRINGMARKERGREMEDYPROC GLeeFuncPtr_glStringMarkerGREMEDY; - #define glStringMarkerGREMEDY GLeeFuncPtr_glStringMarkerGREMEDY -#endif -#endif - -/* GL_EXT_packed_depth_stencil */ - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 -#define __GLEE_GL_EXT_packed_depth_stencil 1 -/* Constants */ -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 -#endif - -/* GL_EXT_stencil_clear_tag */ - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 -#define __GLEE_GL_EXT_stencil_clear_tag 1 -/* Constants */ -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 -#ifndef GLEE_H_DEFINED_glStencilClearTagEXT -#define GLEE_H_DEFINED_glStencilClearTagEXT - typedef void (APIENTRYP GLEEPFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); - GLEE_EXTERN GLEEPFNGLSTENCILCLEARTAGEXTPROC GLeeFuncPtr_glStencilClearTagEXT; - #define glStencilClearTagEXT GLeeFuncPtr_glStencilClearTagEXT -#endif -#endif - -/* GL_EXT_texture_sRGB */ - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 -#define __GLEE_GL_EXT_texture_sRGB 1 -/* Constants */ -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif - -/* GL_EXT_framebuffer_blit */ - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 -#define __GLEE_GL_EXT_framebuffer_blit 1 -/* Constants */ -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -#ifndef GLEE_H_DEFINED_glBlitFramebufferEXT -#define GLEE_H_DEFINED_glBlitFramebufferEXT - typedef void (APIENTRYP GLEEPFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - GLEE_EXTERN GLEEPFNGLBLITFRAMEBUFFEREXTPROC GLeeFuncPtr_glBlitFramebufferEXT; - #define glBlitFramebufferEXT GLeeFuncPtr_glBlitFramebufferEXT -#endif -#endif - -/* GL_EXT_framebuffer_multisample */ - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 -#define __GLEE_GL_EXT_framebuffer_multisample 1 -/* Constants */ -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisampleEXT -#define GLEE_H_DEFINED_glRenderbufferStorageMultisampleEXT - typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glRenderbufferStorageMultisampleEXT; - #define glRenderbufferStorageMultisampleEXT GLeeFuncPtr_glRenderbufferStorageMultisampleEXT -#endif -#endif - -/* GL_MESAX_texture_stack */ - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 -#define __GLEE_GL_MESAX_texture_stack 1 -/* Constants */ -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E -#endif - -/* GL_EXT_timer_query */ - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 -#define __GLEE_GL_EXT_timer_query 1 -/* Constants */ -#define GL_TIME_ELAPSED_EXT 0x88BF -#ifndef GLEE_H_DEFINED_glGetQueryObjecti64vEXT -#define GLEE_H_DEFINED_glGetQueryObjecti64vEXT - typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT * params); - GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTI64VEXTPROC GLeeFuncPtr_glGetQueryObjecti64vEXT; - #define glGetQueryObjecti64vEXT GLeeFuncPtr_glGetQueryObjecti64vEXT -#endif -#ifndef GLEE_H_DEFINED_glGetQueryObjectui64vEXT -#define GLEE_H_DEFINED_glGetQueryObjectui64vEXT - typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT * params); - GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC GLeeFuncPtr_glGetQueryObjectui64vEXT; - #define glGetQueryObjectui64vEXT GLeeFuncPtr_glGetQueryObjectui64vEXT -#endif -#endif - -/* GL_EXT_gpu_program_parameters */ - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 -#define __GLEE_GL_EXT_gpu_program_parameters 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glProgramEnvParameters4fvEXT -#define GLEE_H_DEFINED_glProgramEnvParameters4fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramEnvParameters4fvEXT; - #define glProgramEnvParameters4fvEXT GLeeFuncPtr_glProgramEnvParameters4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameters4fvEXT -#define GLEE_H_DEFINED_glProgramLocalParameters4fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramLocalParameters4fvEXT; - #define glProgramLocalParameters4fvEXT GLeeFuncPtr_glProgramLocalParameters4fvEXT -#endif -#endif - -/* GL_APPLE_flush_buffer_range */ - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 -#define __GLEE_GL_APPLE_flush_buffer_range 1 -/* Constants */ -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 -#ifndef GLEE_H_DEFINED_glBufferParameteriAPPLE -#define GLEE_H_DEFINED_glBufferParameteriAPPLE - typedef void (APIENTRYP GLEEPFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLBUFFERPARAMETERIAPPLEPROC GLeeFuncPtr_glBufferParameteriAPPLE; - #define glBufferParameteriAPPLE GLeeFuncPtr_glBufferParameteriAPPLE -#endif -#ifndef GLEE_H_DEFINED_glFlushMappedBufferRangeAPPLE -#define GLEE_H_DEFINED_glFlushMappedBufferRangeAPPLE - typedef void (APIENTRYP GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); - GLEE_EXTERN GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC GLeeFuncPtr_glFlushMappedBufferRangeAPPLE; - #define glFlushMappedBufferRangeAPPLE GLeeFuncPtr_glFlushMappedBufferRangeAPPLE -#endif -#endif - -/* GL_EXT_gpu_shader4 */ - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 -#define __GLEE_GL_EXT_gpu_shader4 1 -/* Constants */ -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#ifndef GLEE_H_DEFINED_glGetUniformuivEXT -#define GLEE_H_DEFINED_glGetUniformuivEXT - typedef void (APIENTRYP GLEEPFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETUNIFORMUIVEXTPROC GLeeFuncPtr_glGetUniformuivEXT; - #define glGetUniformuivEXT GLeeFuncPtr_glGetUniformuivEXT -#endif -#ifndef GLEE_H_DEFINED_glBindFragDataLocationEXT -#define GLEE_H_DEFINED_glBindFragDataLocationEXT - typedef void (APIENTRYP GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar * name); - GLEE_EXTERN GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glBindFragDataLocationEXT; - #define glBindFragDataLocationEXT GLeeFuncPtr_glBindFragDataLocationEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFragDataLocationEXT -#define GLEE_H_DEFINED_glGetFragDataLocationEXT - typedef GLint (APIENTRYP GLEEPFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar * name); - GLEE_EXTERN GLEEPFNGLGETFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glGetFragDataLocationEXT; - #define glGetFragDataLocationEXT GLeeFuncPtr_glGetFragDataLocationEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform1uiEXT -#define GLEE_H_DEFINED_glUniform1uiEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); - GLEE_EXTERN GLEEPFNGLUNIFORM1UIEXTPROC GLeeFuncPtr_glUniform1uiEXT; - #define glUniform1uiEXT GLeeFuncPtr_glUniform1uiEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform2uiEXT -#define GLEE_H_DEFINED_glUniform2uiEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); - GLEE_EXTERN GLEEPFNGLUNIFORM2UIEXTPROC GLeeFuncPtr_glUniform2uiEXT; - #define glUniform2uiEXT GLeeFuncPtr_glUniform2uiEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform3uiEXT -#define GLEE_H_DEFINED_glUniform3uiEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); - GLEE_EXTERN GLEEPFNGLUNIFORM3UIEXTPROC GLeeFuncPtr_glUniform3uiEXT; - #define glUniform3uiEXT GLeeFuncPtr_glUniform3uiEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform4uiEXT -#define GLEE_H_DEFINED_glUniform4uiEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - GLEE_EXTERN GLEEPFNGLUNIFORM4UIEXTPROC GLeeFuncPtr_glUniform4uiEXT; - #define glUniform4uiEXT GLeeFuncPtr_glUniform4uiEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform1uivEXT -#define GLEE_H_DEFINED_glUniform1uivEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM1UIVEXTPROC GLeeFuncPtr_glUniform1uivEXT; - #define glUniform1uivEXT GLeeFuncPtr_glUniform1uivEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform2uivEXT -#define GLEE_H_DEFINED_glUniform2uivEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM2UIVEXTPROC GLeeFuncPtr_glUniform2uivEXT; - #define glUniform2uivEXT GLeeFuncPtr_glUniform2uivEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform3uivEXT -#define GLEE_H_DEFINED_glUniform3uivEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM3UIVEXTPROC GLeeFuncPtr_glUniform3uivEXT; - #define glUniform3uivEXT GLeeFuncPtr_glUniform3uivEXT -#endif -#ifndef GLEE_H_DEFINED_glUniform4uivEXT -#define GLEE_H_DEFINED_glUniform4uivEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLUNIFORM4UIVEXTPROC GLeeFuncPtr_glUniform4uivEXT; - #define glUniform4uivEXT GLeeFuncPtr_glUniform4uivEXT -#endif -#endif - -/* GL_EXT_draw_instanced */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -#define __GLEE_GL_EXT_draw_instanced 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glDrawArraysInstancedEXT -#define GLEE_H_DEFINED_glDrawArraysInstancedEXT - typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC GLeeFuncPtr_glDrawArraysInstancedEXT; - #define glDrawArraysInstancedEXT GLeeFuncPtr_glDrawArraysInstancedEXT -#endif -#ifndef GLEE_H_DEFINED_glDrawElementsInstancedEXT -#define GLEE_H_DEFINED_glDrawElementsInstancedEXT - typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); - GLEE_EXTERN GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC GLeeFuncPtr_glDrawElementsInstancedEXT; - #define glDrawElementsInstancedEXT GLeeFuncPtr_glDrawElementsInstancedEXT -#endif -#endif - -/* GL_EXT_packed_float */ - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 -#define __GLEE_GL_EXT_packed_float 1 -/* Constants */ -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C -#endif - -/* GL_EXT_texture_array */ - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 -#define __GLEE_GL_EXT_texture_array 1 -/* Constants */ -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -#endif - -/* GL_EXT_texture_buffer_object */ - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 -#define __GLEE_GL_EXT_texture_buffer_object 1 -/* Constants */ -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E -#ifndef GLEE_H_DEFINED_glTexBufferEXT -#define GLEE_H_DEFINED_glTexBufferEXT - typedef void (APIENTRYP GLEEPFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); - GLEE_EXTERN GLEEPFNGLTEXBUFFEREXTPROC GLeeFuncPtr_glTexBufferEXT; - #define glTexBufferEXT GLeeFuncPtr_glTexBufferEXT -#endif -#endif - -/* GL_EXT_texture_compression_latc */ - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 -#define __GLEE_GL_EXT_texture_compression_latc 1 -/* Constants */ -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif - -/* GL_EXT_texture_compression_rgtc */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#define __GLEE_GL_EXT_texture_compression_rgtc 1 -/* Constants */ -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif - -/* GL_EXT_texture_shared_exponent */ - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 -#define __GLEE_GL_EXT_texture_shared_exponent 1 -/* Constants */ -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F -#endif - -/* GL_NV_depth_buffer_float */ - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 -#define __GLEE_GL_NV_depth_buffer_float 1 -/* Constants */ -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF -#ifndef GLEE_H_DEFINED_glDepthRangedNV -#define GLEE_H_DEFINED_glDepthRangedNV - typedef void (APIENTRYP GLEEPFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); - GLEE_EXTERN GLEEPFNGLDEPTHRANGEDNVPROC GLeeFuncPtr_glDepthRangedNV; - #define glDepthRangedNV GLeeFuncPtr_glDepthRangedNV -#endif -#ifndef GLEE_H_DEFINED_glClearDepthdNV -#define GLEE_H_DEFINED_glClearDepthdNV - typedef void (APIENTRYP GLEEPFNGLCLEARDEPTHDNVPROC) (GLdouble depth); - GLEE_EXTERN GLEEPFNGLCLEARDEPTHDNVPROC GLeeFuncPtr_glClearDepthdNV; - #define glClearDepthdNV GLeeFuncPtr_glClearDepthdNV -#endif -#ifndef GLEE_H_DEFINED_glDepthBoundsdNV -#define GLEE_H_DEFINED_glDepthBoundsdNV - typedef void (APIENTRYP GLEEPFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); - GLEE_EXTERN GLEEPFNGLDEPTHBOUNDSDNVPROC GLeeFuncPtr_glDepthBoundsdNV; - #define glDepthBoundsdNV GLeeFuncPtr_glDepthBoundsdNV -#endif -#endif - -/* GL_NV_framebuffer_multisample_coverage */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#define __GLEE_GL_NV_framebuffer_multisample_coverage 1 -/* Constants */ -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisampleCoverageNV -#define GLEE_H_DEFINED_glRenderbufferStorageMultisampleCoverageNV - typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV; - #define glRenderbufferStorageMultisampleCoverageNV GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV -#endif -#endif - -/* GL_EXT_framebuffer_sRGB */ - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 -#define __GLEE_GL_EXT_framebuffer_sRGB 1 -/* Constants */ -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA -#endif - -/* GL_NV_geometry_shader4 */ - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 -#define __GLEE_GL_NV_geometry_shader4 1 -/* Constants */ -#endif - -/* GL_NV_parameter_buffer_object */ - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 -#define __GLEE_GL_NV_parameter_buffer_object 1 -/* Constants */ -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 -#ifndef GLEE_H_DEFINED_glProgramBufferParametersfvNV -#define GLEE_H_DEFINED_glProgramBufferParametersfvNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC GLeeFuncPtr_glProgramBufferParametersfvNV; - #define glProgramBufferParametersfvNV GLeeFuncPtr_glProgramBufferParametersfvNV -#endif -#ifndef GLEE_H_DEFINED_glProgramBufferParametersIivNV -#define GLEE_H_DEFINED_glProgramBufferParametersIivNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC GLeeFuncPtr_glProgramBufferParametersIivNV; - #define glProgramBufferParametersIivNV GLeeFuncPtr_glProgramBufferParametersIivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramBufferParametersIuivNV -#define GLEE_H_DEFINED_glProgramBufferParametersIuivNV - typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC GLeeFuncPtr_glProgramBufferParametersIuivNV; - #define glProgramBufferParametersIuivNV GLeeFuncPtr_glProgramBufferParametersIuivNV -#endif -#endif - -/* GL_EXT_draw_buffers2 */ - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 -#define __GLEE_GL_EXT_draw_buffers2 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glColorMaskIndexedEXT -#define GLEE_H_DEFINED_glColorMaskIndexedEXT - typedef void (APIENTRYP GLEEPFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); - GLEE_EXTERN GLEEPFNGLCOLORMASKINDEXEDEXTPROC GLeeFuncPtr_glColorMaskIndexedEXT; - #define glColorMaskIndexedEXT GLeeFuncPtr_glColorMaskIndexedEXT -#endif -#ifndef GLEE_H_DEFINED_glGetBooleanIndexedvEXT -#define GLEE_H_DEFINED_glGetBooleanIndexedvEXT - typedef void (APIENTRYP GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean * data); - GLEE_EXTERN GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC GLeeFuncPtr_glGetBooleanIndexedvEXT; - #define glGetBooleanIndexedvEXT GLeeFuncPtr_glGetBooleanIndexedvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetIntegerIndexedvEXT -#define GLEE_H_DEFINED_glGetIntegerIndexedvEXT - typedef void (APIENTRYP GLEEPFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint * data); - GLEE_EXTERN GLEEPFNGLGETINTEGERINDEXEDVEXTPROC GLeeFuncPtr_glGetIntegerIndexedvEXT; - #define glGetIntegerIndexedvEXT GLeeFuncPtr_glGetIntegerIndexedvEXT -#endif -#ifndef GLEE_H_DEFINED_glEnableIndexedEXT -#define GLEE_H_DEFINED_glEnableIndexedEXT - typedef void (APIENTRYP GLEEPFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); - GLEE_EXTERN GLEEPFNGLENABLEINDEXEDEXTPROC GLeeFuncPtr_glEnableIndexedEXT; - #define glEnableIndexedEXT GLeeFuncPtr_glEnableIndexedEXT -#endif -#ifndef GLEE_H_DEFINED_glDisableIndexedEXT -#define GLEE_H_DEFINED_glDisableIndexedEXT - typedef void (APIENTRYP GLEEPFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); - GLEE_EXTERN GLEEPFNGLDISABLEINDEXEDEXTPROC GLeeFuncPtr_glDisableIndexedEXT; - #define glDisableIndexedEXT GLeeFuncPtr_glDisableIndexedEXT -#endif -#ifndef GLEE_H_DEFINED_glIsEnabledIndexedEXT -#define GLEE_H_DEFINED_glIsEnabledIndexedEXT - typedef GLboolean (APIENTRYP GLEEPFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); - GLEE_EXTERN GLEEPFNGLISENABLEDINDEXEDEXTPROC GLeeFuncPtr_glIsEnabledIndexedEXT; - #define glIsEnabledIndexedEXT GLeeFuncPtr_glIsEnabledIndexedEXT -#endif -#endif - -/* GL_NV_transform_feedback */ - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 -#define __GLEE_GL_NV_transform_feedback 1 -/* Constants */ -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F -#ifndef GLEE_H_DEFINED_glBeginTransformFeedbackNV -#define GLEE_H_DEFINED_glBeginTransformFeedbackNV - typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); - GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBeginTransformFeedbackNV; - #define glBeginTransformFeedbackNV GLeeFuncPtr_glBeginTransformFeedbackNV -#endif -#ifndef GLEE_H_DEFINED_glEndTransformFeedbackNV -#define GLEE_H_DEFINED_glEndTransformFeedbackNV - typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC) (); - GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glEndTransformFeedbackNV; - #define glEndTransformFeedbackNV GLeeFuncPtr_glEndTransformFeedbackNV -#endif -#ifndef GLEE_H_DEFINED_glTransformFeedbackAttribsNV -#define GLEE_H_DEFINED_glTransformFeedbackAttribsNV - typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint * attribs, GLenum bufferMode); - GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC GLeeFuncPtr_glTransformFeedbackAttribsNV; - #define glTransformFeedbackAttribsNV GLeeFuncPtr_glTransformFeedbackAttribsNV -#endif -#ifndef GLEE_H_DEFINED_glBindBufferRangeNV -#define GLEE_H_DEFINED_glBindBufferRangeNV - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); - GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGENVPROC GLeeFuncPtr_glBindBufferRangeNV; - #define glBindBufferRangeNV GLeeFuncPtr_glBindBufferRangeNV -#endif -#ifndef GLEE_H_DEFINED_glBindBufferOffsetNV -#define GLEE_H_DEFINED_glBindBufferOffsetNV - typedef void (APIENTRYP GLEEPFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); - GLEE_EXTERN GLEEPFNGLBINDBUFFEROFFSETNVPROC GLeeFuncPtr_glBindBufferOffsetNV; - #define glBindBufferOffsetNV GLeeFuncPtr_glBindBufferOffsetNV -#endif -#ifndef GLEE_H_DEFINED_glBindBufferBaseNV -#define GLEE_H_DEFINED_glBindBufferBaseNV - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); - GLEE_EXTERN GLEEPFNGLBINDBUFFERBASENVPROC GLeeFuncPtr_glBindBufferBaseNV; - #define glBindBufferBaseNV GLeeFuncPtr_glBindBufferBaseNV -#endif -#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryingsNV -#define GLEE_H_DEFINED_glTransformFeedbackVaryingsNV - typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); - GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC GLeeFuncPtr_glTransformFeedbackVaryingsNV; - #define glTransformFeedbackVaryingsNV GLeeFuncPtr_glTransformFeedbackVaryingsNV -#endif -#ifndef GLEE_H_DEFINED_glActiveVaryingNV -#define GLEE_H_DEFINED_glActiveVaryingNV - typedef void (APIENTRYP GLEEPFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar * name); - GLEE_EXTERN GLEEPFNGLACTIVEVARYINGNVPROC GLeeFuncPtr_glActiveVaryingNV; - #define glActiveVaryingNV GLeeFuncPtr_glActiveVaryingNV -#endif -#ifndef GLEE_H_DEFINED_glGetVaryingLocationNV -#define GLEE_H_DEFINED_glGetVaryingLocationNV - typedef GLint (APIENTRYP GLEEPFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar * name); - GLEE_EXTERN GLEEPFNGLGETVARYINGLOCATIONNVPROC GLeeFuncPtr_glGetVaryingLocationNV; - #define glGetVaryingLocationNV GLeeFuncPtr_glGetVaryingLocationNV -#endif -#ifndef GLEE_H_DEFINED_glGetActiveVaryingNV -#define GLEE_H_DEFINED_glGetActiveVaryingNV - typedef void (APIENTRYP GLEEPFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); - GLEE_EXTERN GLEEPFNGLGETACTIVEVARYINGNVPROC GLeeFuncPtr_glGetActiveVaryingNV; - #define glGetActiveVaryingNV GLeeFuncPtr_glGetActiveVaryingNV -#endif -#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVaryingNV -#define GLEE_H_DEFINED_glGetTransformFeedbackVaryingNV - typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint * location); - GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC GLeeFuncPtr_glGetTransformFeedbackVaryingNV; - #define glGetTransformFeedbackVaryingNV GLeeFuncPtr_glGetTransformFeedbackVaryingNV -#endif -#endif - -/* GL_EXT_bindable_uniform */ - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 -#define __GLEE_GL_EXT_bindable_uniform 1 -/* Constants */ -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF -#ifndef GLEE_H_DEFINED_glUniformBufferEXT -#define GLEE_H_DEFINED_glUniformBufferEXT - typedef void (APIENTRYP GLEEPFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); - GLEE_EXTERN GLEEPFNGLUNIFORMBUFFEREXTPROC GLeeFuncPtr_glUniformBufferEXT; - #define glUniformBufferEXT GLeeFuncPtr_glUniformBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glGetUniformBufferSizeEXT -#define GLEE_H_DEFINED_glGetUniformBufferSizeEXT - typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); - GLEE_EXTERN GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC GLeeFuncPtr_glGetUniformBufferSizeEXT; - #define glGetUniformBufferSizeEXT GLeeFuncPtr_glGetUniformBufferSizeEXT -#endif -#ifndef GLEE_H_DEFINED_glGetUniformOffsetEXT -#define GLEE_H_DEFINED_glGetUniformOffsetEXT - typedef GLintptr (APIENTRYP GLEEPFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); - GLEE_EXTERN GLEEPFNGLGETUNIFORMOFFSETEXTPROC GLeeFuncPtr_glGetUniformOffsetEXT; - #define glGetUniformOffsetEXT GLeeFuncPtr_glGetUniformOffsetEXT -#endif -#endif - -/* GL_EXT_texture_integer */ - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 -#define __GLEE_GL_EXT_texture_integer 1 -/* Constants */ -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -#ifndef GLEE_H_DEFINED_glTexParameterIivEXT -#define GLEE_H_DEFINED_glTexParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glTexParameterIivEXT; - #define glTexParameterIivEXT GLeeFuncPtr_glTexParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glTexParameterIuivEXT -#define GLEE_H_DEFINED_glTexParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint * params); - GLEE_EXTERN GLEEPFNGLTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glTexParameterIuivEXT; - #define glTexParameterIuivEXT GLeeFuncPtr_glTexParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTexParameterIivEXT -#define GLEE_H_DEFINED_glGetTexParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTexParameterIivEXT; - #define glGetTexParameterIivEXT GLeeFuncPtr_glGetTexParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTexParameterIuivEXT -#define GLEE_H_DEFINED_glGetTexParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTexParameterIuivEXT; - #define glGetTexParameterIuivEXT GLeeFuncPtr_glGetTexParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glClearColorIiEXT -#define GLEE_H_DEFINED_glClearColorIiEXT - typedef void (APIENTRYP GLEEPFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); - GLEE_EXTERN GLEEPFNGLCLEARCOLORIIEXTPROC GLeeFuncPtr_glClearColorIiEXT; - #define glClearColorIiEXT GLeeFuncPtr_glClearColorIiEXT -#endif -#ifndef GLEE_H_DEFINED_glClearColorIuiEXT -#define GLEE_H_DEFINED_glClearColorIuiEXT - typedef void (APIENTRYP GLEEPFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); - GLEE_EXTERN GLEEPFNGLCLEARCOLORIUIEXTPROC GLeeFuncPtr_glClearColorIuiEXT; - #define glClearColorIuiEXT GLeeFuncPtr_glClearColorIuiEXT -#endif -#endif - -/* GL_GREMEDY_frame_terminator */ - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 -#define __GLEE_GL_GREMEDY_frame_terminator 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glFrameTerminatorGREMEDY -#define GLEE_H_DEFINED_glFrameTerminatorGREMEDY - typedef void (APIENTRYP GLEEPFNGLFRAMETERMINATORGREMEDYPROC) (); - GLEE_EXTERN GLEEPFNGLFRAMETERMINATORGREMEDYPROC GLeeFuncPtr_glFrameTerminatorGREMEDY; - #define glFrameTerminatorGREMEDY GLeeFuncPtr_glFrameTerminatorGREMEDY -#endif -#endif - -/* GL_NV_conditional_render */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#define __GLEE_GL_NV_conditional_render 1 -/* Constants */ -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -#ifndef GLEE_H_DEFINED_glBeginConditionalRenderNV -#define GLEE_H_DEFINED_glBeginConditionalRenderNV - typedef void (APIENTRYP GLEEPFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); - GLEE_EXTERN GLEEPFNGLBEGINCONDITIONALRENDERNVPROC GLeeFuncPtr_glBeginConditionalRenderNV; - #define glBeginConditionalRenderNV GLeeFuncPtr_glBeginConditionalRenderNV -#endif -#ifndef GLEE_H_DEFINED_glEndConditionalRenderNV -#define GLEE_H_DEFINED_glEndConditionalRenderNV - typedef void (APIENTRYP GLEEPFNGLENDCONDITIONALRENDERNVPROC) (); - GLEE_EXTERN GLEEPFNGLENDCONDITIONALRENDERNVPROC GLeeFuncPtr_glEndConditionalRenderNV; - #define glEndConditionalRenderNV GLeeFuncPtr_glEndConditionalRenderNV -#endif -#endif - -/* GL_NV_present_video */ - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 -#define __GLEE_GL_NV_present_video 1 -/* Constants */ -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B -#endif - -/* GL_EXT_transform_feedback */ - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 -#define __GLEE_GL_EXT_transform_feedback 1 -/* Constants */ -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#ifndef GLEE_H_DEFINED_glBeginTransformFeedbackEXT -#define GLEE_H_DEFINED_glBeginTransformFeedbackEXT - typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); - GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glBeginTransformFeedbackEXT; - #define glBeginTransformFeedbackEXT GLeeFuncPtr_glBeginTransformFeedbackEXT -#endif -#ifndef GLEE_H_DEFINED_glEndTransformFeedbackEXT -#define GLEE_H_DEFINED_glEndTransformFeedbackEXT - typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC) (); - GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glEndTransformFeedbackEXT; - #define glEndTransformFeedbackEXT GLeeFuncPtr_glEndTransformFeedbackEXT -#endif -#ifndef GLEE_H_DEFINED_glBindBufferRangeEXT -#define GLEE_H_DEFINED_glBindBufferRangeEXT - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); - GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGEEXTPROC GLeeFuncPtr_glBindBufferRangeEXT; - #define glBindBufferRangeEXT GLeeFuncPtr_glBindBufferRangeEXT -#endif -#ifndef GLEE_H_DEFINED_glBindBufferOffsetEXT -#define GLEE_H_DEFINED_glBindBufferOffsetEXT - typedef void (APIENTRYP GLEEPFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); - GLEE_EXTERN GLEEPFNGLBINDBUFFEROFFSETEXTPROC GLeeFuncPtr_glBindBufferOffsetEXT; - #define glBindBufferOffsetEXT GLeeFuncPtr_glBindBufferOffsetEXT -#endif -#ifndef GLEE_H_DEFINED_glBindBufferBaseEXT -#define GLEE_H_DEFINED_glBindBufferBaseEXT - typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); - GLEE_EXTERN GLEEPFNGLBINDBUFFERBASEEXTPROC GLeeFuncPtr_glBindBufferBaseEXT; - #define glBindBufferBaseEXT GLeeFuncPtr_glBindBufferBaseEXT -#endif -#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryingsEXT -#define GLEE_H_DEFINED_glTransformFeedbackVaryingsEXT - typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); - GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC GLeeFuncPtr_glTransformFeedbackVaryingsEXT; - #define glTransformFeedbackVaryingsEXT GLeeFuncPtr_glTransformFeedbackVaryingsEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVaryingEXT -#define GLEE_H_DEFINED_glGetTransformFeedbackVaryingEXT - typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLint * location); - GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC GLeeFuncPtr_glGetTransformFeedbackVaryingEXT; - #define glGetTransformFeedbackVaryingEXT GLeeFuncPtr_glGetTransformFeedbackVaryingEXT -#endif -#endif - -/* GL_EXT_direct_state_access */ - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 -#define __GLEE_GL_EXT_direct_state_access 1 -/* Constants */ -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F -#ifndef GLEE_H_DEFINED_glClientAttribDefaultEXT -#define GLEE_H_DEFINED_glClientAttribDefaultEXT - typedef void (APIENTRYP GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); - GLEE_EXTERN GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glClientAttribDefaultEXT; - #define glClientAttribDefaultEXT GLeeFuncPtr_glClientAttribDefaultEXT -#endif -#ifndef GLEE_H_DEFINED_glPushClientAttribDefaultEXT -#define GLEE_H_DEFINED_glPushClientAttribDefaultEXT - typedef void (APIENTRYP GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); - GLEE_EXTERN GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glPushClientAttribDefaultEXT; - #define glPushClientAttribDefaultEXT GLeeFuncPtr_glPushClientAttribDefaultEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixLoadfEXT -#define GLEE_H_DEFINED_glMatrixLoadfEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat * m); - GLEE_EXTERN GLEEPFNGLMATRIXLOADFEXTPROC GLeeFuncPtr_glMatrixLoadfEXT; - #define glMatrixLoadfEXT GLeeFuncPtr_glMatrixLoadfEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixLoaddEXT -#define GLEE_H_DEFINED_glMatrixLoaddEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble * m); - GLEE_EXTERN GLEEPFNGLMATRIXLOADDEXTPROC GLeeFuncPtr_glMatrixLoaddEXT; - #define glMatrixLoaddEXT GLeeFuncPtr_glMatrixLoaddEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixMultfEXT -#define GLEE_H_DEFINED_glMatrixMultfEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat * m); - GLEE_EXTERN GLEEPFNGLMATRIXMULTFEXTPROC GLeeFuncPtr_glMatrixMultfEXT; - #define glMatrixMultfEXT GLeeFuncPtr_glMatrixMultfEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixMultdEXT -#define GLEE_H_DEFINED_glMatrixMultdEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble * m); - GLEE_EXTERN GLEEPFNGLMATRIXMULTDEXTPROC GLeeFuncPtr_glMatrixMultdEXT; - #define glMatrixMultdEXT GLeeFuncPtr_glMatrixMultdEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixLoadIdentityEXT -#define GLEE_H_DEFINED_glMatrixLoadIdentityEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLMATRIXLOADIDENTITYEXTPROC GLeeFuncPtr_glMatrixLoadIdentityEXT; - #define glMatrixLoadIdentityEXT GLeeFuncPtr_glMatrixLoadIdentityEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixRotatefEXT -#define GLEE_H_DEFINED_glMatrixRotatefEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLMATRIXROTATEFEXTPROC GLeeFuncPtr_glMatrixRotatefEXT; - #define glMatrixRotatefEXT GLeeFuncPtr_glMatrixRotatefEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixRotatedEXT -#define GLEE_H_DEFINED_glMatrixRotatedEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLMATRIXROTATEDEXTPROC GLeeFuncPtr_glMatrixRotatedEXT; - #define glMatrixRotatedEXT GLeeFuncPtr_glMatrixRotatedEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixScalefEXT -#define GLEE_H_DEFINED_glMatrixScalefEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLMATRIXSCALEFEXTPROC GLeeFuncPtr_glMatrixScalefEXT; - #define glMatrixScalefEXT GLeeFuncPtr_glMatrixScalefEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixScaledEXT -#define GLEE_H_DEFINED_glMatrixScaledEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLMATRIXSCALEDEXTPROC GLeeFuncPtr_glMatrixScaledEXT; - #define glMatrixScaledEXT GLeeFuncPtr_glMatrixScaledEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixTranslatefEXT -#define GLEE_H_DEFINED_glMatrixTranslatefEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); - GLEE_EXTERN GLEEPFNGLMATRIXTRANSLATEFEXTPROC GLeeFuncPtr_glMatrixTranslatefEXT; - #define glMatrixTranslatefEXT GLeeFuncPtr_glMatrixTranslatefEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixTranslatedEXT -#define GLEE_H_DEFINED_glMatrixTranslatedEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); - GLEE_EXTERN GLEEPFNGLMATRIXTRANSLATEDEXTPROC GLeeFuncPtr_glMatrixTranslatedEXT; - #define glMatrixTranslatedEXT GLeeFuncPtr_glMatrixTranslatedEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixFrustumEXT -#define GLEE_H_DEFINED_glMatrixFrustumEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); - GLEE_EXTERN GLEEPFNGLMATRIXFRUSTUMEXTPROC GLeeFuncPtr_glMatrixFrustumEXT; - #define glMatrixFrustumEXT GLeeFuncPtr_glMatrixFrustumEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixOrthoEXT -#define GLEE_H_DEFINED_glMatrixOrthoEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); - GLEE_EXTERN GLEEPFNGLMATRIXORTHOEXTPROC GLeeFuncPtr_glMatrixOrthoEXT; - #define glMatrixOrthoEXT GLeeFuncPtr_glMatrixOrthoEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixPopEXT -#define GLEE_H_DEFINED_glMatrixPopEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXPOPEXTPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLMATRIXPOPEXTPROC GLeeFuncPtr_glMatrixPopEXT; - #define glMatrixPopEXT GLeeFuncPtr_glMatrixPopEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixPushEXT -#define GLEE_H_DEFINED_glMatrixPushEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXPUSHEXTPROC) (GLenum mode); - GLEE_EXTERN GLEEPFNGLMATRIXPUSHEXTPROC GLeeFuncPtr_glMatrixPushEXT; - #define glMatrixPushEXT GLeeFuncPtr_glMatrixPushEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixLoadTransposefEXT -#define GLEE_H_DEFINED_glMatrixLoadTransposefEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat * m); - GLEE_EXTERN GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixLoadTransposefEXT; - #define glMatrixLoadTransposefEXT GLeeFuncPtr_glMatrixLoadTransposefEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixLoadTransposedEXT -#define GLEE_H_DEFINED_glMatrixLoadTransposedEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble * m); - GLEE_EXTERN GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixLoadTransposedEXT; - #define glMatrixLoadTransposedEXT GLeeFuncPtr_glMatrixLoadTransposedEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixMultTransposefEXT -#define GLEE_H_DEFINED_glMatrixMultTransposefEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat * m); - GLEE_EXTERN GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixMultTransposefEXT; - #define glMatrixMultTransposefEXT GLeeFuncPtr_glMatrixMultTransposefEXT -#endif -#ifndef GLEE_H_DEFINED_glMatrixMultTransposedEXT -#define GLEE_H_DEFINED_glMatrixMultTransposedEXT - typedef void (APIENTRYP GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble * m); - GLEE_EXTERN GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixMultTransposedEXT; - #define glMatrixMultTransposedEXT GLeeFuncPtr_glMatrixMultTransposedEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureParameterfEXT -#define GLEE_H_DEFINED_glTextureParameterfEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERFEXTPROC GLeeFuncPtr_glTextureParameterfEXT; - #define glTextureParameterfEXT GLeeFuncPtr_glTextureParameterfEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureParameterfvEXT -#define GLEE_H_DEFINED_glTextureParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glTextureParameterfvEXT; - #define glTextureParameterfvEXT GLeeFuncPtr_glTextureParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureParameteriEXT -#define GLEE_H_DEFINED_glTextureParameteriEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIEXTPROC GLeeFuncPtr_glTextureParameteriEXT; - #define glTextureParameteriEXT GLeeFuncPtr_glTextureParameteriEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureParameterivEXT -#define GLEE_H_DEFINED_glTextureParameterivEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glTextureParameterivEXT; - #define glTextureParameterivEXT GLeeFuncPtr_glTextureParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureImage1DEXT -#define GLEE_H_DEFINED_glTextureImage1DEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glTextureImage1DEXT; - #define glTextureImage1DEXT GLeeFuncPtr_glTextureImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureImage2DEXT -#define GLEE_H_DEFINED_glTextureImage2DEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glTextureImage2DEXT; - #define glTextureImage2DEXT GLeeFuncPtr_glTextureImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureSubImage1DEXT -#define GLEE_H_DEFINED_glTextureSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glTextureSubImage1DEXT; - #define glTextureSubImage1DEXT GLeeFuncPtr_glTextureSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureSubImage2DEXT -#define GLEE_H_DEFINED_glTextureSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glTextureSubImage2DEXT; - #define glTextureSubImage2DEXT GLeeFuncPtr_glTextureSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTextureImage1DEXT -#define GLEE_H_DEFINED_glCopyTextureImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); - GLEE_EXTERN GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureImage1DEXT; - #define glCopyTextureImage1DEXT GLeeFuncPtr_glCopyTextureImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTextureImage2DEXT -#define GLEE_H_DEFINED_glCopyTextureImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); - GLEE_EXTERN GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureImage2DEXT; - #define glCopyTextureImage2DEXT GLeeFuncPtr_glCopyTextureImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTextureSubImage1DEXT -#define GLEE_H_DEFINED_glCopyTextureSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureSubImage1DEXT; - #define glCopyTextureSubImage1DEXT GLeeFuncPtr_glCopyTextureSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTextureSubImage2DEXT -#define GLEE_H_DEFINED_glCopyTextureSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureSubImage2DEXT; - #define glCopyTextureSubImage2DEXT GLeeFuncPtr_glCopyTextureSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureImageEXT -#define GLEE_H_DEFINED_glGetTextureImageEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLGETTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetTextureImageEXT; - #define glGetTextureImageEXT GLeeFuncPtr_glGetTextureImageEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureParameterfvEXT -#define GLEE_H_DEFINED_glGetTextureParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureParameterfvEXT; - #define glGetTextureParameterfvEXT GLeeFuncPtr_glGetTextureParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureParameterivEXT -#define GLEE_H_DEFINED_glGetTextureParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureParameterivEXT; - #define glGetTextureParameterivEXT GLeeFuncPtr_glGetTextureParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureLevelParameterfvEXT -#define GLEE_H_DEFINED_glGetTextureLevelParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterfvEXT; - #define glGetTextureLevelParameterfvEXT GLeeFuncPtr_glGetTextureLevelParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureLevelParameterivEXT -#define GLEE_H_DEFINED_glGetTextureLevelParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterivEXT; - #define glGetTextureLevelParameterivEXT GLeeFuncPtr_glGetTextureLevelParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureImage3DEXT -#define GLEE_H_DEFINED_glTextureImage3DEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glTextureImage3DEXT; - #define glTextureImage3DEXT GLeeFuncPtr_glTextureImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureSubImage3DEXT -#define GLEE_H_DEFINED_glTextureSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glTextureSubImage3DEXT; - #define glTextureSubImage3DEXT GLeeFuncPtr_glTextureSubImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyTextureSubImage3DEXT -#define GLEE_H_DEFINED_glCopyTextureSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTextureSubImage3DEXT; - #define glCopyTextureSubImage3DEXT GLeeFuncPtr_glCopyTextureSubImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexParameterfEXT -#define GLEE_H_DEFINED_glMultiTexParameterfEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERFEXTPROC GLeeFuncPtr_glMultiTexParameterfEXT; - #define glMultiTexParameterfEXT GLeeFuncPtr_glMultiTexParameterfEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexParameterfvEXT -#define GLEE_H_DEFINED_glMultiTexParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glMultiTexParameterfvEXT; - #define glMultiTexParameterfvEXT GLeeFuncPtr_glMultiTexParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexParameteriEXT -#define GLEE_H_DEFINED_glMultiTexParameteriEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIEXTPROC GLeeFuncPtr_glMultiTexParameteriEXT; - #define glMultiTexParameteriEXT GLeeFuncPtr_glMultiTexParameteriEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexParameterivEXT -#define GLEE_H_DEFINED_glMultiTexParameterivEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glMultiTexParameterivEXT; - #define glMultiTexParameterivEXT GLeeFuncPtr_glMultiTexParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexImage1DEXT -#define GLEE_H_DEFINED_glMultiTexImage1DEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexImage1DEXT; - #define glMultiTexImage1DEXT GLeeFuncPtr_glMultiTexImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexImage2DEXT -#define GLEE_H_DEFINED_glMultiTexImage2DEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexImage2DEXT; - #define glMultiTexImage2DEXT GLeeFuncPtr_glMultiTexImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexSubImage1DEXT -#define GLEE_H_DEFINED_glMultiTexSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexSubImage1DEXT; - #define glMultiTexSubImage1DEXT GLeeFuncPtr_glMultiTexSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexSubImage2DEXT -#define GLEE_H_DEFINED_glMultiTexSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexSubImage2DEXT; - #define glMultiTexSubImage2DEXT GLeeFuncPtr_glMultiTexSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyMultiTexImage1DEXT -#define GLEE_H_DEFINED_glCopyMultiTexImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); - GLEE_EXTERN GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexImage1DEXT; - #define glCopyMultiTexImage1DEXT GLeeFuncPtr_glCopyMultiTexImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyMultiTexImage2DEXT -#define GLEE_H_DEFINED_glCopyMultiTexImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); - GLEE_EXTERN GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexImage2DEXT; - #define glCopyMultiTexImage2DEXT GLeeFuncPtr_glCopyMultiTexImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage1DEXT -#define GLEE_H_DEFINED_glCopyMultiTexSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); - GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage1DEXT; - #define glCopyMultiTexSubImage1DEXT GLeeFuncPtr_glCopyMultiTexSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage2DEXT -#define GLEE_H_DEFINED_glCopyMultiTexSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage2DEXT; - #define glCopyMultiTexSubImage2DEXT GLeeFuncPtr_glCopyMultiTexSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexImageEXT -#define GLEE_H_DEFINED_glGetMultiTexImageEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLGETMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetMultiTexImageEXT; - #define glGetMultiTexImageEXT GLeeFuncPtr_glGetMultiTexImageEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexParameterfvEXT -#define GLEE_H_DEFINED_glGetMultiTexParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexParameterfvEXT; - #define glGetMultiTexParameterfvEXT GLeeFuncPtr_glGetMultiTexParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexParameterivEXT -#define GLEE_H_DEFINED_glGetMultiTexParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterivEXT; - #define glGetMultiTexParameterivEXT GLeeFuncPtr_glGetMultiTexParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexLevelParameterfvEXT -#define GLEE_H_DEFINED_glGetMultiTexLevelParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT; - #define glGetMultiTexLevelParameterfvEXT GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexLevelParameterivEXT -#define GLEE_H_DEFINED_glGetMultiTexLevelParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterivEXT; - #define glGetMultiTexLevelParameterivEXT GLeeFuncPtr_glGetMultiTexLevelParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexImage3DEXT -#define GLEE_H_DEFINED_glMultiTexImage3DEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexImage3DEXT; - #define glMultiTexImage3DEXT GLeeFuncPtr_glMultiTexImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexSubImage3DEXT -#define GLEE_H_DEFINED_glMultiTexSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); - GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexSubImage3DEXT; - #define glMultiTexSubImage3DEXT GLeeFuncPtr_glMultiTexSubImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage3DEXT -#define GLEE_H_DEFINED_glCopyMultiTexSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage3DEXT; - #define glCopyMultiTexSubImage3DEXT GLeeFuncPtr_glCopyMultiTexSubImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glBindMultiTextureEXT -#define GLEE_H_DEFINED_glBindMultiTextureEXT - typedef void (APIENTRYP GLEEPFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); - GLEE_EXTERN GLEEPFNGLBINDMULTITEXTUREEXTPROC GLeeFuncPtr_glBindMultiTextureEXT; - #define glBindMultiTextureEXT GLeeFuncPtr_glBindMultiTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glEnableClientStateIndexedEXT -#define GLEE_H_DEFINED_glEnableClientStateIndexedEXT - typedef void (APIENTRYP GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); - GLEE_EXTERN GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glEnableClientStateIndexedEXT; - #define glEnableClientStateIndexedEXT GLeeFuncPtr_glEnableClientStateIndexedEXT -#endif -#ifndef GLEE_H_DEFINED_glDisableClientStateIndexedEXT -#define GLEE_H_DEFINED_glDisableClientStateIndexedEXT - typedef void (APIENTRYP GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); - GLEE_EXTERN GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glDisableClientStateIndexedEXT; - #define glDisableClientStateIndexedEXT GLeeFuncPtr_glDisableClientStateIndexedEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexCoordPointerEXT -#define GLEE_H_DEFINED_glMultiTexCoordPointerEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC GLeeFuncPtr_glMultiTexCoordPointerEXT; - #define glMultiTexCoordPointerEXT GLeeFuncPtr_glMultiTexCoordPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexEnvfEXT -#define GLEE_H_DEFINED_glMultiTexEnvfEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLMULTITEXENVFEXTPROC GLeeFuncPtr_glMultiTexEnvfEXT; - #define glMultiTexEnvfEXT GLeeFuncPtr_glMultiTexEnvfEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexEnvfvEXT -#define GLEE_H_DEFINED_glMultiTexEnvfvEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLMULTITEXENVFVEXTPROC GLeeFuncPtr_glMultiTexEnvfvEXT; - #define glMultiTexEnvfvEXT GLeeFuncPtr_glMultiTexEnvfvEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexEnviEXT -#define GLEE_H_DEFINED_glMultiTexEnviEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLMULTITEXENVIEXTPROC GLeeFuncPtr_glMultiTexEnviEXT; - #define glMultiTexEnviEXT GLeeFuncPtr_glMultiTexEnviEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexEnvivEXT -#define GLEE_H_DEFINED_glMultiTexEnvivEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLMULTITEXENVIVEXTPROC GLeeFuncPtr_glMultiTexEnvivEXT; - #define glMultiTexEnvivEXT GLeeFuncPtr_glMultiTexEnvivEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexGendEXT -#define GLEE_H_DEFINED_glMultiTexGendEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); - GLEE_EXTERN GLEEPFNGLMULTITEXGENDEXTPROC GLeeFuncPtr_glMultiTexGendEXT; - #define glMultiTexGendEXT GLeeFuncPtr_glMultiTexGendEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexGendvEXT -#define GLEE_H_DEFINED_glMultiTexGendvEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params); - GLEE_EXTERN GLEEPFNGLMULTITEXGENDVEXTPROC GLeeFuncPtr_glMultiTexGendvEXT; - #define glMultiTexGendvEXT GLeeFuncPtr_glMultiTexGendvEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexGenfEXT -#define GLEE_H_DEFINED_glMultiTexGenfEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLMULTITEXGENFEXTPROC GLeeFuncPtr_glMultiTexGenfEXT; - #define glMultiTexGenfEXT GLeeFuncPtr_glMultiTexGenfEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexGenfvEXT -#define GLEE_H_DEFINED_glMultiTexGenfvEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLMULTITEXGENFVEXTPROC GLeeFuncPtr_glMultiTexGenfvEXT; - #define glMultiTexGenfvEXT GLeeFuncPtr_glMultiTexGenfvEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexGeniEXT -#define GLEE_H_DEFINED_glMultiTexGeniEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLMULTITEXGENIEXTPROC GLeeFuncPtr_glMultiTexGeniEXT; - #define glMultiTexGeniEXT GLeeFuncPtr_glMultiTexGeniEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexGenivEXT -#define GLEE_H_DEFINED_glMultiTexGenivEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLMULTITEXGENIVEXTPROC GLeeFuncPtr_glMultiTexGenivEXT; - #define glMultiTexGenivEXT GLeeFuncPtr_glMultiTexGenivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexEnvfvEXT -#define GLEE_H_DEFINED_glGetMultiTexEnvfvEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXENVFVEXTPROC GLeeFuncPtr_glGetMultiTexEnvfvEXT; - #define glGetMultiTexEnvfvEXT GLeeFuncPtr_glGetMultiTexEnvfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexEnvivEXT -#define GLEE_H_DEFINED_glGetMultiTexEnvivEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXENVIVEXTPROC GLeeFuncPtr_glGetMultiTexEnvivEXT; - #define glGetMultiTexEnvivEXT GLeeFuncPtr_glGetMultiTexEnvivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexGendvEXT -#define GLEE_H_DEFINED_glGetMultiTexGendvEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXGENDVEXTPROC GLeeFuncPtr_glGetMultiTexGendvEXT; - #define glGetMultiTexGendvEXT GLeeFuncPtr_glGetMultiTexGendvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexGenfvEXT -#define GLEE_H_DEFINED_glGetMultiTexGenfvEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXGENFVEXTPROC GLeeFuncPtr_glGetMultiTexGenfvEXT; - #define glGetMultiTexGenfvEXT GLeeFuncPtr_glGetMultiTexGenfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexGenivEXT -#define GLEE_H_DEFINED_glGetMultiTexGenivEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXGENIVEXTPROC GLeeFuncPtr_glGetMultiTexGenivEXT; - #define glGetMultiTexGenivEXT GLeeFuncPtr_glGetMultiTexGenivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFloatIndexedvEXT -#define GLEE_H_DEFINED_glGetFloatIndexedvEXT - typedef void (APIENTRYP GLEEPFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat * data); - GLEE_EXTERN GLEEPFNGLGETFLOATINDEXEDVEXTPROC GLeeFuncPtr_glGetFloatIndexedvEXT; - #define glGetFloatIndexedvEXT GLeeFuncPtr_glGetFloatIndexedvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetDoubleIndexedvEXT -#define GLEE_H_DEFINED_glGetDoubleIndexedvEXT - typedef void (APIENTRYP GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble * data); - GLEE_EXTERN GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC GLeeFuncPtr_glGetDoubleIndexedvEXT; - #define glGetDoubleIndexedvEXT GLeeFuncPtr_glGetDoubleIndexedvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetPointerIndexedvEXT -#define GLEE_H_DEFINED_glGetPointerIndexedvEXT - typedef void (APIENTRYP GLEEPFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* * data); - GLEE_EXTERN GLEEPFNGLGETPOINTERINDEXEDVEXTPROC GLeeFuncPtr_glGetPointerIndexedvEXT; - #define glGetPointerIndexedvEXT GLeeFuncPtr_glGetPointerIndexedvEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedTextureImage3DEXT -#define GLEE_H_DEFINED_glCompressedTextureImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureImage3DEXT; - #define glCompressedTextureImage3DEXT GLeeFuncPtr_glCompressedTextureImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedTextureImage2DEXT -#define GLEE_H_DEFINED_glCompressedTextureImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureImage2DEXT; - #define glCompressedTextureImage2DEXT GLeeFuncPtr_glCompressedTextureImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedTextureImage1DEXT -#define GLEE_H_DEFINED_glCompressedTextureImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureImage1DEXT; - #define glCompressedTextureImage1DEXT GLeeFuncPtr_glCompressedTextureImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage3DEXT -#define GLEE_H_DEFINED_glCompressedTextureSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage3DEXT; - #define glCompressedTextureSubImage3DEXT GLeeFuncPtr_glCompressedTextureSubImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage2DEXT -#define GLEE_H_DEFINED_glCompressedTextureSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage2DEXT; - #define glCompressedTextureSubImage2DEXT GLeeFuncPtr_glCompressedTextureSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage1DEXT -#define GLEE_H_DEFINED_glCompressedTextureSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage1DEXT; - #define glCompressedTextureSubImage1DEXT GLeeFuncPtr_glCompressedTextureSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glGetCompressedTextureImageEXT -#define GLEE_H_DEFINED_glGetCompressedTextureImageEXT - typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid * img); - GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetCompressedTextureImageEXT; - #define glGetCompressedTextureImageEXT GLeeFuncPtr_glGetCompressedTextureImageEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage3DEXT -#define GLEE_H_DEFINED_glCompressedMultiTexImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage3DEXT; - #define glCompressedMultiTexImage3DEXT GLeeFuncPtr_glCompressedMultiTexImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage2DEXT -#define GLEE_H_DEFINED_glCompressedMultiTexImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage2DEXT; - #define glCompressedMultiTexImage2DEXT GLeeFuncPtr_glCompressedMultiTexImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage1DEXT -#define GLEE_H_DEFINED_glCompressedMultiTexImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage1DEXT; - #define glCompressedMultiTexImage1DEXT GLeeFuncPtr_glCompressedMultiTexImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage3DEXT -#define GLEE_H_DEFINED_glCompressedMultiTexSubImage3DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT; - #define glCompressedMultiTexSubImage3DEXT GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage2DEXT -#define GLEE_H_DEFINED_glCompressedMultiTexSubImage2DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT; - #define glCompressedMultiTexSubImage2DEXT GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT -#endif -#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage1DEXT -#define GLEE_H_DEFINED_glCompressedMultiTexSubImage1DEXT - typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits); - GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT; - #define glCompressedMultiTexSubImage1DEXT GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT -#endif -#ifndef GLEE_H_DEFINED_glGetCompressedMultiTexImageEXT -#define GLEE_H_DEFINED_glGetCompressedMultiTexImageEXT - typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid * img); - GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetCompressedMultiTexImageEXT; - #define glGetCompressedMultiTexImageEXT GLeeFuncPtr_glGetCompressedMultiTexImageEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramStringEXT -#define GLEE_H_DEFINED_glNamedProgramStringEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glNamedProgramStringEXT; - #define glNamedProgramStringEXT GLeeFuncPtr_glNamedProgramStringEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4dEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameter4dEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dEXT; - #define glNamedProgramLocalParameter4dEXT GLeeFuncPtr_glNamedProgramLocalParameter4dEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4dvEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameter4dvEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT; - #define glNamedProgramLocalParameter4dvEXT GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4fEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameter4fEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fEXT; - #define glNamedProgramLocalParameter4fEXT GLeeFuncPtr_glNamedProgramLocalParameter4fEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4fvEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameter4fvEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT; - #define glNamedProgramLocalParameter4fvEXT GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterdvEXT -#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterdvEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT; - #define glGetNamedProgramLocalParameterdvEXT GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterfvEXT -#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterfvEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT; - #define glGetNamedProgramLocalParameterfvEXT GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedProgramivEXT -#define GLEE_H_DEFINED_glGetNamedProgramivEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC GLeeFuncPtr_glGetNamedProgramivEXT; - #define glGetNamedProgramivEXT GLeeFuncPtr_glGetNamedProgramivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedProgramStringEXT -#define GLEE_H_DEFINED_glGetNamedProgramStringEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid * string); - GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glGetNamedProgramStringEXT; - #define glGetNamedProgramStringEXT GLeeFuncPtr_glGetNamedProgramStringEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameters4fvEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameters4fvEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT; - #define glNamedProgramLocalParameters4fvEXT GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4iEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4iEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT; - #define glNamedProgramLocalParameterI4iEXT GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4ivEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4ivEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT; - #define glNamedProgramLocalParameterI4ivEXT GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParametersI4ivEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParametersI4ivEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT; - #define glNamedProgramLocalParametersI4ivEXT GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4uiEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4uiEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT; - #define glNamedProgramLocalParameterI4uiEXT GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4uivEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4uivEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT; - #define glNamedProgramLocalParameterI4uivEXT GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedProgramLocalParametersI4uivEXT -#define GLEE_H_DEFINED_glNamedProgramLocalParametersI4uivEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params); - GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT; - #define glNamedProgramLocalParametersI4uivEXT GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterIivEXT -#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT; - #define glGetNamedProgramLocalParameterIivEXT GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterIuivEXT -#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT; - #define glGetNamedProgramLocalParameterIuivEXT GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureParameterIivEXT -#define GLEE_H_DEFINED_glTextureParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glTextureParameterIivEXT; - #define glTextureParameterIivEXT GLeeFuncPtr_glTextureParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureParameterIuivEXT -#define GLEE_H_DEFINED_glTextureParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint * params); - GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glTextureParameterIuivEXT; - #define glTextureParameterIuivEXT GLeeFuncPtr_glTextureParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureParameterIivEXT -#define GLEE_H_DEFINED_glGetTextureParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTextureParameterIivEXT; - #define glGetTextureParameterIivEXT GLeeFuncPtr_glGetTextureParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetTextureParameterIuivEXT -#define GLEE_H_DEFINED_glGetTextureParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTextureParameterIuivEXT; - #define glGetTextureParameterIuivEXT GLeeFuncPtr_glGetTextureParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexParameterIivEXT -#define GLEE_H_DEFINED_glMultiTexParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glMultiTexParameterIivEXT; - #define glMultiTexParameterIivEXT GLeeFuncPtr_glMultiTexParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexParameterIuivEXT -#define GLEE_H_DEFINED_glMultiTexParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint * params); - GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glMultiTexParameterIuivEXT; - #define glMultiTexParameterIuivEXT GLeeFuncPtr_glMultiTexParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexParameterIivEXT -#define GLEE_H_DEFINED_glGetMultiTexParameterIivEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIivEXT; - #define glGetMultiTexParameterIivEXT GLeeFuncPtr_glGetMultiTexParameterIivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetMultiTexParameterIuivEXT -#define GLEE_H_DEFINED_glGetMultiTexParameterIuivEXT - typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIuivEXT; - #define glGetMultiTexParameterIuivEXT GLeeFuncPtr_glGetMultiTexParameterIuivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform1fEXT -#define GLEE_H_DEFINED_glProgramUniform1fEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1FEXTPROC GLeeFuncPtr_glProgramUniform1fEXT; - #define glProgramUniform1fEXT GLeeFuncPtr_glProgramUniform1fEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform2fEXT -#define GLEE_H_DEFINED_glProgramUniform2fEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2FEXTPROC GLeeFuncPtr_glProgramUniform2fEXT; - #define glProgramUniform2fEXT GLeeFuncPtr_glProgramUniform2fEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform3fEXT -#define GLEE_H_DEFINED_glProgramUniform3fEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3FEXTPROC GLeeFuncPtr_glProgramUniform3fEXT; - #define glProgramUniform3fEXT GLeeFuncPtr_glProgramUniform3fEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform4fEXT -#define GLEE_H_DEFINED_glProgramUniform4fEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4FEXTPROC GLeeFuncPtr_glProgramUniform4fEXT; - #define glProgramUniform4fEXT GLeeFuncPtr_glProgramUniform4fEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform1iEXT -#define GLEE_H_DEFINED_glProgramUniform1iEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1IEXTPROC GLeeFuncPtr_glProgramUniform1iEXT; - #define glProgramUniform1iEXT GLeeFuncPtr_glProgramUniform1iEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform2iEXT -#define GLEE_H_DEFINED_glProgramUniform2iEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2IEXTPROC GLeeFuncPtr_glProgramUniform2iEXT; - #define glProgramUniform2iEXT GLeeFuncPtr_glProgramUniform2iEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform3iEXT -#define GLEE_H_DEFINED_glProgramUniform3iEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3IEXTPROC GLeeFuncPtr_glProgramUniform3iEXT; - #define glProgramUniform3iEXT GLeeFuncPtr_glProgramUniform3iEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform4iEXT -#define GLEE_H_DEFINED_glProgramUniform4iEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4IEXTPROC GLeeFuncPtr_glProgramUniform4iEXT; - #define glProgramUniform4iEXT GLeeFuncPtr_glProgramUniform4iEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform1fvEXT -#define GLEE_H_DEFINED_glProgramUniform1fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC GLeeFuncPtr_glProgramUniform1fvEXT; - #define glProgramUniform1fvEXT GLeeFuncPtr_glProgramUniform1fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform2fvEXT -#define GLEE_H_DEFINED_glProgramUniform2fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC GLeeFuncPtr_glProgramUniform2fvEXT; - #define glProgramUniform2fvEXT GLeeFuncPtr_glProgramUniform2fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform3fvEXT -#define GLEE_H_DEFINED_glProgramUniform3fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC GLeeFuncPtr_glProgramUniform3fvEXT; - #define glProgramUniform3fvEXT GLeeFuncPtr_glProgramUniform3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform4fvEXT -#define GLEE_H_DEFINED_glProgramUniform4fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC GLeeFuncPtr_glProgramUniform4fvEXT; - #define glProgramUniform4fvEXT GLeeFuncPtr_glProgramUniform4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform1ivEXT -#define GLEE_H_DEFINED_glProgramUniform1ivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC GLeeFuncPtr_glProgramUniform1ivEXT; - #define glProgramUniform1ivEXT GLeeFuncPtr_glProgramUniform1ivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform2ivEXT -#define GLEE_H_DEFINED_glProgramUniform2ivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC GLeeFuncPtr_glProgramUniform2ivEXT; - #define glProgramUniform2ivEXT GLeeFuncPtr_glProgramUniform2ivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform3ivEXT -#define GLEE_H_DEFINED_glProgramUniform3ivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC GLeeFuncPtr_glProgramUniform3ivEXT; - #define glProgramUniform3ivEXT GLeeFuncPtr_glProgramUniform3ivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform4ivEXT -#define GLEE_H_DEFINED_glProgramUniform4ivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC GLeeFuncPtr_glProgramUniform4ivEXT; - #define glProgramUniform4ivEXT GLeeFuncPtr_glProgramUniform4ivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix2fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2fvEXT; - #define glProgramUniformMatrix2fvEXT GLeeFuncPtr_glProgramUniformMatrix2fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix3fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3fvEXT; - #define glProgramUniformMatrix3fvEXT GLeeFuncPtr_glProgramUniformMatrix3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix4fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4fvEXT; - #define glProgramUniformMatrix4fvEXT GLeeFuncPtr_glProgramUniformMatrix4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2x3fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix2x3fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT; - #define glProgramUniformMatrix2x3fvEXT GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3x2fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix3x2fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT; - #define glProgramUniformMatrix3x2fvEXT GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2x4fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix2x4fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT; - #define glProgramUniformMatrix2x4fvEXT GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4x2fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix4x2fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT; - #define glProgramUniformMatrix4x2fvEXT GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3x4fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix3x4fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT; - #define glProgramUniformMatrix3x4fvEXT GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4x3fvEXT -#define GLEE_H_DEFINED_glProgramUniformMatrix4x3fvEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT; - #define glProgramUniformMatrix4x3fvEXT GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform1uiEXT -#define GLEE_H_DEFINED_glProgramUniform1uiEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC GLeeFuncPtr_glProgramUniform1uiEXT; - #define glProgramUniform1uiEXT GLeeFuncPtr_glProgramUniform1uiEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform2uiEXT -#define GLEE_H_DEFINED_glProgramUniform2uiEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC GLeeFuncPtr_glProgramUniform2uiEXT; - #define glProgramUniform2uiEXT GLeeFuncPtr_glProgramUniform2uiEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform3uiEXT -#define GLEE_H_DEFINED_glProgramUniform3uiEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC GLeeFuncPtr_glProgramUniform3uiEXT; - #define glProgramUniform3uiEXT GLeeFuncPtr_glProgramUniform3uiEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform4uiEXT -#define GLEE_H_DEFINED_glProgramUniform4uiEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC GLeeFuncPtr_glProgramUniform4uiEXT; - #define glProgramUniform4uiEXT GLeeFuncPtr_glProgramUniform4uiEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform1uivEXT -#define GLEE_H_DEFINED_glProgramUniform1uivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC GLeeFuncPtr_glProgramUniform1uivEXT; - #define glProgramUniform1uivEXT GLeeFuncPtr_glProgramUniform1uivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform2uivEXT -#define GLEE_H_DEFINED_glProgramUniform2uivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC GLeeFuncPtr_glProgramUniform2uivEXT; - #define glProgramUniform2uivEXT GLeeFuncPtr_glProgramUniform2uivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform3uivEXT -#define GLEE_H_DEFINED_glProgramUniform3uivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC GLeeFuncPtr_glProgramUniform3uivEXT; - #define glProgramUniform3uivEXT GLeeFuncPtr_glProgramUniform3uivEXT -#endif -#ifndef GLEE_H_DEFINED_glProgramUniform4uivEXT -#define GLEE_H_DEFINED_glProgramUniform4uivEXT - typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); - GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC GLeeFuncPtr_glProgramUniform4uivEXT; - #define glProgramUniform4uivEXT GLeeFuncPtr_glProgramUniform4uivEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedBufferDataEXT -#define GLEE_H_DEFINED_glNamedBufferDataEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage); - GLEE_EXTERN GLEEPFNGLNAMEDBUFFERDATAEXTPROC GLeeFuncPtr_glNamedBufferDataEXT; - #define glNamedBufferDataEXT GLeeFuncPtr_glNamedBufferDataEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedBufferSubDataEXT -#define GLEE_H_DEFINED_glNamedBufferSubDataEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data); - GLEE_EXTERN GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glNamedBufferSubDataEXT; - #define glNamedBufferSubDataEXT GLeeFuncPtr_glNamedBufferSubDataEXT -#endif -#ifndef GLEE_H_DEFINED_glMapNamedBufferEXT -#define GLEE_H_DEFINED_glMapNamedBufferEXT - typedef GLvoid* (APIENTRYP GLEEPFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); - GLEE_EXTERN GLEEPFNGLMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glMapNamedBufferEXT; - #define glMapNamedBufferEXT GLeeFuncPtr_glMapNamedBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glUnmapNamedBufferEXT -#define GLEE_H_DEFINED_glUnmapNamedBufferEXT - typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); - GLEE_EXTERN GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glUnmapNamedBufferEXT; - #define glUnmapNamedBufferEXT GLeeFuncPtr_glUnmapNamedBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedBufferParameterivEXT -#define GLEE_H_DEFINED_glGetNamedBufferParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedBufferParameterivEXT; - #define glGetNamedBufferParameterivEXT GLeeFuncPtr_glGetNamedBufferParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedBufferPointervEXT -#define GLEE_H_DEFINED_glGetNamedBufferPointervEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC GLeeFuncPtr_glGetNamedBufferPointervEXT; - #define glGetNamedBufferPointervEXT GLeeFuncPtr_glGetNamedBufferPointervEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedBufferSubDataEXT -#define GLEE_H_DEFINED_glGetNamedBufferSubDataEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data); - GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glGetNamedBufferSubDataEXT; - #define glGetNamedBufferSubDataEXT GLeeFuncPtr_glGetNamedBufferSubDataEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureBufferEXT -#define GLEE_H_DEFINED_glTextureBufferEXT - typedef void (APIENTRYP GLEEPFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); - GLEE_EXTERN GLEEPFNGLTEXTUREBUFFEREXTPROC GLeeFuncPtr_glTextureBufferEXT; - #define glTextureBufferEXT GLeeFuncPtr_glTextureBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexBufferEXT -#define GLEE_H_DEFINED_glMultiTexBufferEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); - GLEE_EXTERN GLEEPFNGLMULTITEXBUFFEREXTPROC GLeeFuncPtr_glMultiTexBufferEXT; - #define glMultiTexBufferEXT GLeeFuncPtr_glMultiTexBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageEXT -#define GLEE_H_DEFINED_glNamedRenderbufferStorageEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageEXT; - #define glNamedRenderbufferStorageEXT GLeeFuncPtr_glNamedRenderbufferStorageEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedRenderbufferParameterivEXT -#define GLEE_H_DEFINED_glGetNamedRenderbufferParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT; - #define glGetNamedRenderbufferParameterivEXT GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glCheckNamedFramebufferStatusEXT -#define GLEE_H_DEFINED_glCheckNamedFramebufferStatusEXT - typedef GLenum (APIENTRYP GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); - GLEE_EXTERN GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckNamedFramebufferStatusEXT; - #define glCheckNamedFramebufferStatusEXT GLeeFuncPtr_glCheckNamedFramebufferStatusEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture1DEXT -#define GLEE_H_DEFINED_glNamedFramebufferTexture1DEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture1DEXT; - #define glNamedFramebufferTexture1DEXT GLeeFuncPtr_glNamedFramebufferTexture1DEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture2DEXT -#define GLEE_H_DEFINED_glNamedFramebufferTexture2DEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture2DEXT; - #define glNamedFramebufferTexture2DEXT GLeeFuncPtr_glNamedFramebufferTexture2DEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture3DEXT -#define GLEE_H_DEFINED_glNamedFramebufferTexture3DEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture3DEXT; - #define glNamedFramebufferTexture3DEXT GLeeFuncPtr_glNamedFramebufferTexture3DEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferRenderbufferEXT -#define GLEE_H_DEFINED_glNamedFramebufferRenderbufferEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glNamedFramebufferRenderbufferEXT; - #define glNamedFramebufferRenderbufferEXT GLeeFuncPtr_glNamedFramebufferRenderbufferEXT -#endif -#ifndef GLEE_H_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT -#define GLEE_H_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT; - #define glGetNamedFramebufferAttachmentParameterivEXT GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glGenerateTextureMipmapEXT -#define GLEE_H_DEFINED_glGenerateTextureMipmapEXT - typedef void (APIENTRYP GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); - GLEE_EXTERN GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC GLeeFuncPtr_glGenerateTextureMipmapEXT; - #define glGenerateTextureMipmapEXT GLeeFuncPtr_glGenerateTextureMipmapEXT -#endif -#ifndef GLEE_H_DEFINED_glGenerateMultiTexMipmapEXT -#define GLEE_H_DEFINED_glGenerateMultiTexMipmapEXT - typedef void (APIENTRYP GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); - GLEE_EXTERN GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC GLeeFuncPtr_glGenerateMultiTexMipmapEXT; - #define glGenerateMultiTexMipmapEXT GLeeFuncPtr_glGenerateMultiTexMipmapEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferDrawBufferEXT -#define GLEE_H_DEFINED_glFramebufferDrawBufferEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC GLeeFuncPtr_glFramebufferDrawBufferEXT; - #define glFramebufferDrawBufferEXT GLeeFuncPtr_glFramebufferDrawBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferDrawBuffersEXT -#define GLEE_H_DEFINED_glFramebufferDrawBuffersEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum * bufs); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC GLeeFuncPtr_glFramebufferDrawBuffersEXT; - #define glFramebufferDrawBuffersEXT GLeeFuncPtr_glFramebufferDrawBuffersEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferReadBufferEXT -#define GLEE_H_DEFINED_glFramebufferReadBufferEXT - typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC GLeeFuncPtr_glFramebufferReadBufferEXT; - #define glFramebufferReadBufferEXT GLeeFuncPtr_glFramebufferReadBufferEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFramebufferParameterivEXT -#define GLEE_H_DEFINED_glGetFramebufferParameterivEXT - typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferParameterivEXT; - #define glGetFramebufferParameterivEXT GLeeFuncPtr_glGetFramebufferParameterivEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleEXT -#define GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT; - #define glNamedRenderbufferStorageMultisampleEXT GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT -#define GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); - GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT; - #define glNamedRenderbufferStorageMultisampleCoverageEXT GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureEXT -#define GLEE_H_DEFINED_glNamedFramebufferTextureEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glNamedFramebufferTextureEXT; - #define glNamedFramebufferTextureEXT GLeeFuncPtr_glNamedFramebufferTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureLayerEXT -#define GLEE_H_DEFINED_glNamedFramebufferTextureLayerEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glNamedFramebufferTextureLayerEXT; - #define glNamedFramebufferTextureLayerEXT GLeeFuncPtr_glNamedFramebufferTextureLayerEXT -#endif -#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureFaceEXT -#define GLEE_H_DEFINED_glNamedFramebufferTextureFaceEXT - typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); - GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glNamedFramebufferTextureFaceEXT; - #define glNamedFramebufferTextureFaceEXT GLeeFuncPtr_glNamedFramebufferTextureFaceEXT -#endif -#ifndef GLEE_H_DEFINED_glTextureRenderbufferEXT -#define GLEE_H_DEFINED_glTextureRenderbufferEXT - typedef void (APIENTRYP GLEEPFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLTEXTURERENDERBUFFEREXTPROC GLeeFuncPtr_glTextureRenderbufferEXT; - #define glTextureRenderbufferEXT GLeeFuncPtr_glTextureRenderbufferEXT -#endif -#ifndef GLEE_H_DEFINED_glMultiTexRenderbufferEXT -#define GLEE_H_DEFINED_glMultiTexRenderbufferEXT - typedef void (APIENTRYP GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC GLeeFuncPtr_glMultiTexRenderbufferEXT; - #define glMultiTexRenderbufferEXT GLeeFuncPtr_glMultiTexRenderbufferEXT -#endif -#endif - -/* GL_EXT_vertex_array_bgra */ - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 -#define __GLEE_GL_EXT_vertex_array_bgra 1 -/* Constants */ -#endif - -/* GL_EXT_texture_swizzle */ - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 -#define __GLEE_GL_EXT_texture_swizzle 1 -/* Constants */ -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 -#endif - -/* GL_NV_explicit_multisample */ - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 -#define __GLEE_GL_NV_explicit_multisample 1 -/* Constants */ -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#ifndef GLEE_H_DEFINED_glGetMultisamplefvNV -#define GLEE_H_DEFINED_glGetMultisamplefvNV - typedef void (APIENTRYP GLEEPFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat * val); - GLEE_EXTERN GLEEPFNGLGETMULTISAMPLEFVNVPROC GLeeFuncPtr_glGetMultisamplefvNV; - #define glGetMultisamplefvNV GLeeFuncPtr_glGetMultisamplefvNV -#endif -#ifndef GLEE_H_DEFINED_glSampleMaskIndexedNV -#define GLEE_H_DEFINED_glSampleMaskIndexedNV - typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); - GLEE_EXTERN GLEEPFNGLSAMPLEMASKINDEXEDNVPROC GLeeFuncPtr_glSampleMaskIndexedNV; - #define glSampleMaskIndexedNV GLeeFuncPtr_glSampleMaskIndexedNV -#endif -#ifndef GLEE_H_DEFINED_glTexRenderbufferNV -#define GLEE_H_DEFINED_glTexRenderbufferNV - typedef void (APIENTRYP GLEEPFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); - GLEE_EXTERN GLEEPFNGLTEXRENDERBUFFERNVPROC GLeeFuncPtr_glTexRenderbufferNV; - #define glTexRenderbufferNV GLeeFuncPtr_glTexRenderbufferNV -#endif -#endif - -/* GL_NV_transform_feedback2 */ - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 -#define __GLEE_GL_NV_transform_feedback2 1 -/* Constants */ -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 -#ifndef GLEE_H_DEFINED_glBindTransformFeedbackNV -#define GLEE_H_DEFINED_glBindTransformFeedbackNV - typedef void (APIENTRYP GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); - GLEE_EXTERN GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBindTransformFeedbackNV; - #define glBindTransformFeedbackNV GLeeFuncPtr_glBindTransformFeedbackNV -#endif -#ifndef GLEE_H_DEFINED_glDeleteTransformFeedbacksNV -#define GLEE_H_DEFINED_glDeleteTransformFeedbacksNV - typedef void (APIENTRYP GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint * ids); - GLEE_EXTERN GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glDeleteTransformFeedbacksNV; - #define glDeleteTransformFeedbacksNV GLeeFuncPtr_glDeleteTransformFeedbacksNV -#endif -#ifndef GLEE_H_DEFINED_glGenTransformFeedbacksNV -#define GLEE_H_DEFINED_glGenTransformFeedbacksNV - typedef void (APIENTRYP GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint * ids); - GLEE_EXTERN GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glGenTransformFeedbacksNV; - #define glGenTransformFeedbacksNV GLeeFuncPtr_glGenTransformFeedbacksNV -#endif -#ifndef GLEE_H_DEFINED_glIsTransformFeedbackNV -#define GLEE_H_DEFINED_glIsTransformFeedbackNV - typedef GLboolean (APIENTRYP GLEEPFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); - GLEE_EXTERN GLEEPFNGLISTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glIsTransformFeedbackNV; - #define glIsTransformFeedbackNV GLeeFuncPtr_glIsTransformFeedbackNV -#endif -#ifndef GLEE_H_DEFINED_glPauseTransformFeedbackNV -#define GLEE_H_DEFINED_glPauseTransformFeedbackNV - typedef void (APIENTRYP GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC) (); - GLEE_EXTERN GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glPauseTransformFeedbackNV; - #define glPauseTransformFeedbackNV GLeeFuncPtr_glPauseTransformFeedbackNV -#endif -#ifndef GLEE_H_DEFINED_glResumeTransformFeedbackNV -#define GLEE_H_DEFINED_glResumeTransformFeedbackNV - typedef void (APIENTRYP GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC) (); - GLEE_EXTERN GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glResumeTransformFeedbackNV; - #define glResumeTransformFeedbackNV GLeeFuncPtr_glResumeTransformFeedbackNV -#endif -#ifndef GLEE_H_DEFINED_glDrawTransformFeedbackNV -#define GLEE_H_DEFINED_glDrawTransformFeedbackNV - typedef void (APIENTRYP GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); - GLEE_EXTERN GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glDrawTransformFeedbackNV; - #define glDrawTransformFeedbackNV GLeeFuncPtr_glDrawTransformFeedbackNV -#endif -#endif - -/* GL_SGIX_texture_select */ - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#define __GLEE_GL_SGIX_texture_select 1 -/* Constants */ -#endif - -/* GL_INGR_blend_func_separate */ - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#define __GLEE_GL_INGR_blend_func_separate 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glBlendFuncSeparateINGR -#define GLEE_H_DEFINED_glBlendFuncSeparateINGR - typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEINGRPROC GLeeFuncPtr_glBlendFuncSeparateINGR; - #define glBlendFuncSeparateINGR GLeeFuncPtr_glBlendFuncSeparateINGR -#endif -#endif - -/* GL_SGIX_depth_pass_instrument */ - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#define __GLEE_GL_SGIX_depth_pass_instrument 1 -/* Constants */ -#endif - -/* GL_SGIX_igloo_interface */ - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#define __GLEE_GL_SGIX_igloo_interface 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glIglooInterfaceSGIX -#define GLEE_H_DEFINED_glIglooInterfaceSGIX - typedef void (APIENTRYP GLEEPFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid * params); - GLEE_EXTERN GLEEPFNGLIGLOOINTERFACESGIXPROC GLeeFuncPtr_glIglooInterfaceSGIX; - #define glIglooInterfaceSGIX GLeeFuncPtr_glIglooInterfaceSGIX -#endif -#endif - -/* GL_EXT_fragment_lighting */ - -#ifndef GL_EXT_fragment_lighting -#define GL_EXT_fragment_lighting 1 -#define __GLEE_GL_EXT_fragment_lighting 1 -/* Constants */ -#define GL_FRAGMENT_LIGHTING_EXT 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 -#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 -#define GL_LIGHT_ENV_MODE_EXT 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B -#define GL_FRAGMENT_LIGHT0_EXT 0x840C -#define GL_FRAGMENT_LIGHT7_EXT 0x8413 -#ifndef GLEE_H_DEFINED_glFragmentLightModeliEXT -#define GLEE_H_DEFINED_glFragmentLightModeliEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC GLeeFuncPtr_glFragmentLightModeliEXT; - #define glFragmentLightModeliEXT GLeeFuncPtr_glFragmentLightModeliEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModelfEXT -#define GLEE_H_DEFINED_glFragmentLightModelfEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC GLeeFuncPtr_glFragmentLightModelfEXT; - #define glFragmentLightModelfEXT GLeeFuncPtr_glFragmentLightModelfEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModelivEXT -#define GLEE_H_DEFINED_glFragmentLightModelivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC GLeeFuncPtr_glFragmentLightModelivEXT; - #define glFragmentLightModelivEXT GLeeFuncPtr_glFragmentLightModelivEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightModelfvEXT -#define GLEE_H_DEFINED_glFragmentLightModelfvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC GLeeFuncPtr_glFragmentLightModelfvEXT; - #define glFragmentLightModelfvEXT GLeeFuncPtr_glFragmentLightModelfvEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightiEXT -#define GLEE_H_DEFINED_glFragmentLightiEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIEXTPROC GLeeFuncPtr_glFragmentLightiEXT; - #define glFragmentLightiEXT GLeeFuncPtr_glFragmentLightiEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightfEXT -#define GLEE_H_DEFINED_glFragmentLightfEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFEXTPROC GLeeFuncPtr_glFragmentLightfEXT; - #define glFragmentLightfEXT GLeeFuncPtr_glFragmentLightfEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightivEXT -#define GLEE_H_DEFINED_glFragmentLightivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glFragmentLightivEXT; - #define glFragmentLightivEXT GLeeFuncPtr_glFragmentLightivEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentLightfvEXT -#define GLEE_H_DEFINED_glFragmentLightfvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glFragmentLightfvEXT; - #define glFragmentLightfvEXT GLeeFuncPtr_glFragmentLightfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentLightivEXT -#define GLEE_H_DEFINED_glGetFragmentLightivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glGetFragmentLightivEXT; - #define glGetFragmentLightivEXT GLeeFuncPtr_glGetFragmentLightivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentLightfvEXT -#define GLEE_H_DEFINED_glGetFragmentLightfvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glGetFragmentLightfvEXT; - #define glGetFragmentLightfvEXT GLeeFuncPtr_glGetFragmentLightfvEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialfEXT -#define GLEE_H_DEFINED_glFragmentMaterialfEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFEXTPROC GLeeFuncPtr_glFragmentMaterialfEXT; - #define glFragmentMaterialfEXT GLeeFuncPtr_glFragmentMaterialfEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialiEXT -#define GLEE_H_DEFINED_glFragmentMaterialiEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIEXTPROC GLeeFuncPtr_glFragmentMaterialiEXT; - #define glFragmentMaterialiEXT GLeeFuncPtr_glFragmentMaterialiEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialfvEXT -#define GLEE_H_DEFINED_glFragmentMaterialfvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glFragmentMaterialfvEXT; - #define glFragmentMaterialfvEXT GLeeFuncPtr_glFragmentMaterialfvEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentMaterialivEXT -#define GLEE_H_DEFINED_glFragmentMaterialivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glFragmentMaterialivEXT; - #define glFragmentMaterialivEXT GLeeFuncPtr_glFragmentMaterialivEXT -#endif -#ifndef GLEE_H_DEFINED_glFragmentColorMaterialEXT -#define GLEE_H_DEFINED_glFragmentColorMaterialEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); - GLEE_EXTERN GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC GLeeFuncPtr_glFragmentColorMaterialEXT; - #define glFragmentColorMaterialEXT GLeeFuncPtr_glFragmentColorMaterialEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentMaterialfvEXT -#define GLEE_H_DEFINED_glGetFragmentMaterialfvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glGetFragmentMaterialfvEXT; - #define glGetFragmentMaterialfvEXT GLeeFuncPtr_glGetFragmentMaterialfvEXT -#endif -#ifndef GLEE_H_DEFINED_glGetFragmentMaterialivEXT -#define GLEE_H_DEFINED_glGetFragmentMaterialivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint * params); - GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glGetFragmentMaterialivEXT; - #define glGetFragmentMaterialivEXT GLeeFuncPtr_glGetFragmentMaterialivEXT -#endif -#ifndef GLEE_H_DEFINED_glLightEnviEXT -#define GLEE_H_DEFINED_glLightEnviEXT - typedef GLvoid (APIENTRYP GLEEPFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); - GLEE_EXTERN GLEEPFNGLLIGHTENVIEXTPROC GLeeFuncPtr_glLightEnviEXT; - #define glLightEnviEXT GLeeFuncPtr_glLightEnviEXT -#endif -#endif - -/* GL_EXT_geometry_shader4 */ - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 -#define __GLEE_GL_EXT_geometry_shader4 1 -/* Constants */ -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#ifndef GLEE_H_DEFINED_glProgramParameteriEXT -#define GLEE_H_DEFINED_glProgramParameteriEXT - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERIEXTPROC GLeeFuncPtr_glProgramParameteriEXT; - #define glProgramParameteriEXT GLeeFuncPtr_glProgramParameteriEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureEXT -#define GLEE_H_DEFINED_glFramebufferTextureEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT; - #define glFramebufferTextureEXT GLeeFuncPtr_glFramebufferTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerEXT -#define GLEE_H_DEFINED_glFramebufferTextureLayerEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT; - #define glFramebufferTextureLayerEXT GLeeFuncPtr_glFramebufferTextureLayerEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceEXT -#define GLEE_H_DEFINED_glFramebufferTextureFaceEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT; - #define glFramebufferTextureFaceEXT GLeeFuncPtr_glFramebufferTextureFaceEXT -#endif -#endif - -/* GL_EXT_scene_marker */ - -#ifndef GL_EXT_scene_marker -#define GL_EXT_scene_marker 1 -#define __GLEE_GL_EXT_scene_marker 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glBeginSceneEXT -#define GLEE_H_DEFINED_glBeginSceneEXT - typedef GLvoid (APIENTRYP GLEEPFNGLBEGINSCENEEXTPROC) (); - GLEE_EXTERN GLEEPFNGLBEGINSCENEEXTPROC GLeeFuncPtr_glBeginSceneEXT; - #define glBeginSceneEXT GLeeFuncPtr_glBeginSceneEXT -#endif -#ifndef GLEE_H_DEFINED_glEndSceneEXT -#define GLEE_H_DEFINED_glEndSceneEXT - typedef GLvoid (APIENTRYP GLEEPFNGLENDSCENEEXTPROC) (); - GLEE_EXTERN GLEEPFNGLENDSCENEEXTPROC GLeeFuncPtr_glEndSceneEXT; - #define glEndSceneEXT GLeeFuncPtr_glEndSceneEXT -#endif -#endif - -/* GL_EXT_texture_compression_dxt1 */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 -#define __GLEE_GL_EXT_texture_compression_dxt1 1 -/* Constants */ -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#endif - -/* GL_EXT_texture_env */ - -#ifndef GL_EXT_texture_env -#define GL_EXT_texture_env 1 -#define __GLEE_GL_EXT_texture_env 1 -/* Constants */ -#define GL_TEXTURE_ENV0_EXT 0 -#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 -#define GL_ENV_COPY_EXT 0 -#define GL_ENV_REPLACE_EXT 0 -#define GL_ENV_MODULATE_EXT 0 -#define GL_ENV_ADD_EXT 0 -#define GL_ENV_SUBTRACT_EXT 0 -#define GL_ENV_REVERSE_SUBTRACT_EXT 0 -#define GL_ENV_BLEND_EXT 0 -#define GL_ENV_REVERSE_BLEND_EXT 0 -#define GL_TEXTURE_ENV_SHIFT_EXT 0 -#endif - -/* GL_IBM_static_data */ - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 -#define __GLEE_GL_IBM_static_data 1 -/* Constants */ -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 -#endif - -/* GL_NV_gpu_program4 */ - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 -#define __GLEE_GL_NV_gpu_program4 1 -/* Constants */ -#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4iNV -#define GLEE_H_DEFINED_glProgramLocalParameterI4iNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC GLeeFuncPtr_glProgramLocalParameterI4iNV; - #define glProgramLocalParameterI4iNV GLeeFuncPtr_glProgramLocalParameterI4iNV -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4ivNV -#define GLEE_H_DEFINED_glProgramLocalParameterI4ivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramLocalParameterI4ivNV; - #define glProgramLocalParameterI4ivNV GLeeFuncPtr_glProgramLocalParameterI4ivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParametersI4ivNV -#define GLEE_H_DEFINED_glProgramLocalParametersI4ivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramLocalParametersI4ivNV; - #define glProgramLocalParametersI4ivNV GLeeFuncPtr_glProgramLocalParametersI4ivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4uiNV -#define GLEE_H_DEFINED_glProgramLocalParameterI4uiNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC GLeeFuncPtr_glProgramLocalParameterI4uiNV; - #define glProgramLocalParameterI4uiNV GLeeFuncPtr_glProgramLocalParameterI4uiNV -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4uivNV -#define GLEE_H_DEFINED_glProgramLocalParameterI4uivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramLocalParameterI4uivNV; - #define glProgramLocalParameterI4uivNV GLeeFuncPtr_glProgramLocalParameterI4uivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramLocalParametersI4uivNV -#define GLEE_H_DEFINED_glProgramLocalParametersI4uivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramLocalParametersI4uivNV; - #define glProgramLocalParametersI4uivNV GLeeFuncPtr_glProgramLocalParametersI4uivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4iNV -#define GLEE_H_DEFINED_glProgramEnvParameterI4iNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC GLeeFuncPtr_glProgramEnvParameterI4iNV; - #define glProgramEnvParameterI4iNV GLeeFuncPtr_glProgramEnvParameterI4iNV -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4ivNV -#define GLEE_H_DEFINED_glProgramEnvParameterI4ivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramEnvParameterI4ivNV; - #define glProgramEnvParameterI4ivNV GLeeFuncPtr_glProgramEnvParameterI4ivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParametersI4ivNV -#define GLEE_H_DEFINED_glProgramEnvParametersI4ivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramEnvParametersI4ivNV; - #define glProgramEnvParametersI4ivNV GLeeFuncPtr_glProgramEnvParametersI4ivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4uiNV -#define GLEE_H_DEFINED_glProgramEnvParameterI4uiNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC GLeeFuncPtr_glProgramEnvParameterI4uiNV; - #define glProgramEnvParameterI4uiNV GLeeFuncPtr_glProgramEnvParameterI4uiNV -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4uivNV -#define GLEE_H_DEFINED_glProgramEnvParameterI4uivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramEnvParameterI4uivNV; - #define glProgramEnvParameterI4uivNV GLeeFuncPtr_glProgramEnvParameterI4uivNV -#endif -#ifndef GLEE_H_DEFINED_glProgramEnvParametersI4uivNV -#define GLEE_H_DEFINED_glProgramEnvParametersI4uivNV - typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params); - GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramEnvParametersI4uivNV; - #define glProgramEnvParametersI4uivNV GLeeFuncPtr_glProgramEnvParametersI4uivNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterIivNV -#define GLEE_H_DEFINED_glGetProgramLocalParameterIivNV - typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIivNV; - #define glGetProgramLocalParameterIivNV GLeeFuncPtr_glGetProgramLocalParameterIivNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterIuivNV -#define GLEE_H_DEFINED_glGetProgramLocalParameterIuivNV - typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIuivNV; - #define glGetProgramLocalParameterIuivNV GLeeFuncPtr_glGetProgramLocalParameterIuivNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterIivNV -#define GLEE_H_DEFINED_glGetProgramEnvParameterIivNV - typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIivNV; - #define glGetProgramEnvParameterIivNV GLeeFuncPtr_glGetProgramEnvParameterIivNV -#endif -#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterIuivNV -#define GLEE_H_DEFINED_glGetProgramEnvParameterIuivNV - typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIuivNV; - #define glGetProgramEnvParameterIuivNV GLeeFuncPtr_glGetProgramEnvParameterIuivNV -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureEXT -#define GLEE_H_DEFINED_glFramebufferTextureEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT; - #define glFramebufferTextureEXT GLeeFuncPtr_glFramebufferTextureEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerEXT -#define GLEE_H_DEFINED_glFramebufferTextureLayerEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT; - #define glFramebufferTextureLayerEXT GLeeFuncPtr_glFramebufferTextureLayerEXT -#endif -#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceEXT -#define GLEE_H_DEFINED_glFramebufferTextureFaceEXT - typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); - GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT; - #define glFramebufferTextureFaceEXT GLeeFuncPtr_glFramebufferTextureFaceEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2iEXT -#define GLEE_H_DEFINED_glVertexAttribI2iEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IEXTPROC GLeeFuncPtr_glVertexAttribI2iEXT; - #define glVertexAttribI2iEXT GLeeFuncPtr_glVertexAttribI2iEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3iEXT -#define GLEE_H_DEFINED_glVertexAttribI3iEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IEXTPROC GLeeFuncPtr_glVertexAttribI3iEXT; - #define glVertexAttribI3iEXT GLeeFuncPtr_glVertexAttribI3iEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4iEXT -#define GLEE_H_DEFINED_glVertexAttribI4iEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IEXTPROC GLeeFuncPtr_glVertexAttribI4iEXT; - #define glVertexAttribI4iEXT GLeeFuncPtr_glVertexAttribI4iEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1uiEXT -#define GLEE_H_DEFINED_glVertexAttribI1uiEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIEXTPROC GLeeFuncPtr_glVertexAttribI1uiEXT; - #define glVertexAttribI1uiEXT GLeeFuncPtr_glVertexAttribI1uiEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2uiEXT -#define GLEE_H_DEFINED_glVertexAttribI2uiEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIEXTPROC GLeeFuncPtr_glVertexAttribI2uiEXT; - #define glVertexAttribI2uiEXT GLeeFuncPtr_glVertexAttribI2uiEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3uiEXT -#define GLEE_H_DEFINED_glVertexAttribI3uiEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIEXTPROC GLeeFuncPtr_glVertexAttribI3uiEXT; - #define glVertexAttribI3uiEXT GLeeFuncPtr_glVertexAttribI3uiEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4uiEXT -#define GLEE_H_DEFINED_glVertexAttribI4uiEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIEXTPROC GLeeFuncPtr_glVertexAttribI4uiEXT; - #define glVertexAttribI4uiEXT GLeeFuncPtr_glVertexAttribI4uiEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1ivEXT -#define GLEE_H_DEFINED_glVertexAttribI1ivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IVEXTPROC GLeeFuncPtr_glVertexAttribI1ivEXT; - #define glVertexAttribI1ivEXT GLeeFuncPtr_glVertexAttribI1ivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2ivEXT -#define GLEE_H_DEFINED_glVertexAttribI2ivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IVEXTPROC GLeeFuncPtr_glVertexAttribI2ivEXT; - #define glVertexAttribI2ivEXT GLeeFuncPtr_glVertexAttribI2ivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3ivEXT -#define GLEE_H_DEFINED_glVertexAttribI3ivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IVEXTPROC GLeeFuncPtr_glVertexAttribI3ivEXT; - #define glVertexAttribI3ivEXT GLeeFuncPtr_glVertexAttribI3ivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4ivEXT -#define GLEE_H_DEFINED_glVertexAttribI4ivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IVEXTPROC GLeeFuncPtr_glVertexAttribI4ivEXT; - #define glVertexAttribI4ivEXT GLeeFuncPtr_glVertexAttribI4ivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI1uivEXT -#define GLEE_H_DEFINED_glVertexAttribI1uivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC GLeeFuncPtr_glVertexAttribI1uivEXT; - #define glVertexAttribI1uivEXT GLeeFuncPtr_glVertexAttribI1uivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI2uivEXT -#define GLEE_H_DEFINED_glVertexAttribI2uivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC GLeeFuncPtr_glVertexAttribI2uivEXT; - #define glVertexAttribI2uivEXT GLeeFuncPtr_glVertexAttribI2uivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI3uivEXT -#define GLEE_H_DEFINED_glVertexAttribI3uivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC GLeeFuncPtr_glVertexAttribI3uivEXT; - #define glVertexAttribI3uivEXT GLeeFuncPtr_glVertexAttribI3uivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4uivEXT -#define GLEE_H_DEFINED_glVertexAttribI4uivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC GLeeFuncPtr_glVertexAttribI4uivEXT; - #define glVertexAttribI4uivEXT GLeeFuncPtr_glVertexAttribI4uivEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4bvEXT -#define GLEE_H_DEFINED_glVertexAttribI4bvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4BVEXTPROC GLeeFuncPtr_glVertexAttribI4bvEXT; - #define glVertexAttribI4bvEXT GLeeFuncPtr_glVertexAttribI4bvEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4svEXT -#define GLEE_H_DEFINED_glVertexAttribI4svEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4SVEXTPROC GLeeFuncPtr_glVertexAttribI4svEXT; - #define glVertexAttribI4svEXT GLeeFuncPtr_glVertexAttribI4svEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4ubvEXT -#define GLEE_H_DEFINED_glVertexAttribI4ubvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC GLeeFuncPtr_glVertexAttribI4ubvEXT; - #define glVertexAttribI4ubvEXT GLeeFuncPtr_glVertexAttribI4ubvEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribI4usvEXT -#define GLEE_H_DEFINED_glVertexAttribI4usvEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort * v); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4USVEXTPROC GLeeFuncPtr_glVertexAttribI4usvEXT; - #define glVertexAttribI4usvEXT GLeeFuncPtr_glVertexAttribI4usvEXT -#endif -#ifndef GLEE_H_DEFINED_glVertexAttribIPointerEXT -#define GLEE_H_DEFINED_glVertexAttribIPointerEXT - typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); - GLEE_EXTERN GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC GLeeFuncPtr_glVertexAttribIPointerEXT; - #define glVertexAttribIPointerEXT GLeeFuncPtr_glVertexAttribIPointerEXT -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribIivEXT -#define GLEE_H_DEFINED_glGetVertexAttribIivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC GLeeFuncPtr_glGetVertexAttribIivEXT; - #define glGetVertexAttribIivEXT GLeeFuncPtr_glGetVertexAttribIivEXT -#endif -#ifndef GLEE_H_DEFINED_glGetVertexAttribIuivEXT -#define GLEE_H_DEFINED_glGetVertexAttribIuivEXT - typedef GLvoid (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint * params); - GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC GLeeFuncPtr_glGetVertexAttribIuivEXT; - #define glGetVertexAttribIuivEXT GLeeFuncPtr_glGetVertexAttribIuivEXT -#endif -#endif - -/* GL_OES_byte_coordinates */ - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 -#define __GLEE_GL_OES_byte_coordinates 1 -/* Constants */ -#define GL_BYTE 0x1400 -#endif - -/* GL_OES_compressed_paletted_texture */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#define __GLEE_GL_OES_compressed_paletted_texture 1 -/* Constants */ -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif - -/* GL_OES_single_precision */ - -#ifndef GL_OES_single_precision -#define GL_OES_single_precision 1 -#define __GLEE_GL_OES_single_precision 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glDepthRangefOES -#define GLEE_H_DEFINED_glDepthRangefOES - typedef GLvoid (APIENTRYP GLEEPFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); - GLEE_EXTERN GLEEPFNGLDEPTHRANGEFOESPROC GLeeFuncPtr_glDepthRangefOES; - #define glDepthRangefOES GLeeFuncPtr_glDepthRangefOES -#endif -#ifndef GLEE_H_DEFINED_glFrustumfOES -#define GLEE_H_DEFINED_glFrustumfOES - typedef GLvoid (APIENTRYP GLEEPFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); - GLEE_EXTERN GLEEPFNGLFRUSTUMFOESPROC GLeeFuncPtr_glFrustumfOES; - #define glFrustumfOES GLeeFuncPtr_glFrustumfOES -#endif -#ifndef GLEE_H_DEFINED_glOrthofOES -#define GLEE_H_DEFINED_glOrthofOES - typedef GLvoid (APIENTRYP GLEEPFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); - GLEE_EXTERN GLEEPFNGLORTHOFOESPROC GLeeFuncPtr_glOrthofOES; - #define glOrthofOES GLeeFuncPtr_glOrthofOES -#endif -#ifndef GLEE_H_DEFINED_glClipPlanefOES -#define GLEE_H_DEFINED_glClipPlanefOES - typedef GLvoid (APIENTRYP GLEEPFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); - GLEE_EXTERN GLEEPFNGLCLIPPLANEFOESPROC GLeeFuncPtr_glClipPlanefOES; - #define glClipPlanefOES GLeeFuncPtr_glClipPlanefOES -#endif -#ifndef GLEE_H_DEFINED_glGetClipPlanefOES -#define GLEE_H_DEFINED_glGetClipPlanefOES - typedef GLvoid (APIENTRYP GLEEPFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); - GLEE_EXTERN GLEEPFNGLGETCLIPPLANEFOESPROC GLeeFuncPtr_glGetClipPlanefOES; - #define glGetClipPlanefOES GLeeFuncPtr_glGetClipPlanefOES -#endif -#ifndef GLEE_H_DEFINED_glClearDepthfOES -#define GLEE_H_DEFINED_glClearDepthfOES - typedef GLvoid (APIENTRYP GLEEPFNGLCLEARDEPTHFOESPROC) (GLclampd depth); - GLEE_EXTERN GLEEPFNGLCLEARDEPTHFOESPROC GLeeFuncPtr_glClearDepthfOES; - #define glClearDepthfOES GLeeFuncPtr_glClearDepthfOES -#endif -#endif - -/* GL_SGIX_pixel_texture_bits */ - -#ifndef GL_SGIX_pixel_texture_bits -#define GL_SGIX_pixel_texture_bits 1 -#define __GLEE_GL_SGIX_pixel_texture_bits 1 -/* Constants */ -#endif - -/* GL_SGIX_texture_range */ - -#ifndef GL_SGIX_texture_range -#define GL_SGIX_texture_range 1 -#define __GLEE_GL_SGIX_texture_range 1 -/* Constants */ -#define GL_RGB_SIGNED_SGIX 0x85E0 -#define GL_RGBA_SIGNED_SGIX 0x85E1 -#define GL_ALPHA_SIGNED_SGIX 0x85E2 -#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 -#define GL_INTENSITY_SIGNED_SGIX 0x85E4 -#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 -#define GL_RGB16_SIGNED_SGIX 0x85E6 -#define GL_RGBA16_SIGNED_SGIX 0x85E7 -#define GL_ALPHA16_SIGNED_SGIX 0x85E8 -#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 -#define GL_INTENSITY16_SIGNED_SGIX 0x85EA -#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB -#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC -#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED -#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE -#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF -#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 -#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 -#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 -#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 -#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 -#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 -#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 -#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 -#define GL_MIN_LUMINANCE_SGIS 0x85F8 -#define GL_MAX_LUMINANCE_SGIS 0x85F9 -#define GL_MIN_INTENSITY_SGIS 0x85FA -#define GL_MAX_INTENSITY_SGIS 0x85FB -#endif - -/* WGL */ - -#ifdef WIN32 - -/* Extension querying variables */ - -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_buffer_region; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_multisample; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_extensions_string; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pixel_format; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_make_current_read; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pbuffer; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_render_texture; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pixel_format_float; -GLEE_EXTERN GLboolean _GLEE_WGL_ARB_create_context; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_make_current_read; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pixel_format; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pbuffer; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_depth_float; -GLEE_EXTERN GLboolean _GLEE_WGL_3DFX_multisample; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_multisample; -GLEE_EXTERN GLboolean _GLEE_WGL_I3D_digital_video_control; -GLEE_EXTERN GLboolean _GLEE_WGL_I3D_gamma; -GLEE_EXTERN GLboolean _GLEE_WGL_I3D_genlock; -GLEE_EXTERN GLboolean _GLEE_WGL_I3D_image_buffer; -GLEE_EXTERN GLboolean _GLEE_WGL_I3D_swap_frame_lock; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_render_depth_texture; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_render_texture_rectangle; -GLEE_EXTERN GLboolean _GLEE_WGL_ATI_pixel_format_float; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_float_buffer; -GLEE_EXTERN GLboolean _GLEE_WGL_3DL_stereo_control; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pixel_format_packed_float; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_framebuffer_sRGB; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_present_video; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_swap_group; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_gpu_affinity; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_display_color_table; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_extensions_string; -GLEE_EXTERN GLboolean _GLEE_WGL_EXT_swap_control; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_vertex_array_range; -GLEE_EXTERN GLboolean _GLEE_WGL_OML_sync_control; -GLEE_EXTERN GLboolean _GLEE_WGL_I3D_swap_frame_usage; -GLEE_EXTERN GLboolean _GLEE_WGL_NV_video_output; - -/* Aliases for extension querying variables */ - -#define GLEE_WGL_ARB_buffer_region GLeeEnabled(&_GLEE_WGL_ARB_buffer_region) -#define GLEE_WGL_ARB_multisample GLeeEnabled(&_GLEE_WGL_ARB_multisample) -#define GLEE_WGL_ARB_extensions_string GLeeEnabled(&_GLEE_WGL_ARB_extensions_string) -#define GLEE_WGL_ARB_pixel_format GLeeEnabled(&_GLEE_WGL_ARB_pixel_format) -#define GLEE_WGL_ARB_make_current_read GLeeEnabled(&_GLEE_WGL_ARB_make_current_read) -#define GLEE_WGL_ARB_pbuffer GLeeEnabled(&_GLEE_WGL_ARB_pbuffer) -#define GLEE_WGL_ARB_render_texture GLeeEnabled(&_GLEE_WGL_ARB_render_texture) -#define GLEE_WGL_ARB_pixel_format_float GLeeEnabled(&_GLEE_WGL_ARB_pixel_format_float) -#define GLEE_WGL_ARB_create_context GLeeEnabled(&_GLEE_WGL_ARB_create_context) -#define GLEE_WGL_EXT_make_current_read GLeeEnabled(&_GLEE_WGL_EXT_make_current_read) -#define GLEE_WGL_EXT_pixel_format GLeeEnabled(&_GLEE_WGL_EXT_pixel_format) -#define GLEE_WGL_EXT_pbuffer GLeeEnabled(&_GLEE_WGL_EXT_pbuffer) -#define GLEE_WGL_EXT_depth_float GLeeEnabled(&_GLEE_WGL_EXT_depth_float) -#define GLEE_WGL_3DFX_multisample GLeeEnabled(&_GLEE_WGL_3DFX_multisample) -#define GLEE_WGL_EXT_multisample GLeeEnabled(&_GLEE_WGL_EXT_multisample) -#define GLEE_WGL_I3D_digital_video_control GLeeEnabled(&_GLEE_WGL_I3D_digital_video_control) -#define GLEE_WGL_I3D_gamma GLeeEnabled(&_GLEE_WGL_I3D_gamma) -#define GLEE_WGL_I3D_genlock GLeeEnabled(&_GLEE_WGL_I3D_genlock) -#define GLEE_WGL_I3D_image_buffer GLeeEnabled(&_GLEE_WGL_I3D_image_buffer) -#define GLEE_WGL_I3D_swap_frame_lock GLeeEnabled(&_GLEE_WGL_I3D_swap_frame_lock) -#define GLEE_WGL_NV_render_depth_texture GLeeEnabled(&_GLEE_WGL_NV_render_depth_texture) -#define GLEE_WGL_NV_render_texture_rectangle GLeeEnabled(&_GLEE_WGL_NV_render_texture_rectangle) -#define GLEE_WGL_ATI_pixel_format_float GLeeEnabled(&_GLEE_WGL_ATI_pixel_format_float) -#define GLEE_WGL_NV_float_buffer GLeeEnabled(&_GLEE_WGL_NV_float_buffer) -#define GLEE_WGL_3DL_stereo_control GLeeEnabled(&_GLEE_WGL_3DL_stereo_control) -#define GLEE_WGL_EXT_pixel_format_packed_float GLeeEnabled(&_GLEE_WGL_EXT_pixel_format_packed_float) -#define GLEE_WGL_EXT_framebuffer_sRGB GLeeEnabled(&_GLEE_WGL_EXT_framebuffer_sRGB) -#define GLEE_WGL_NV_present_video GLeeEnabled(&_GLEE_WGL_NV_present_video) -#define GLEE_WGL_NV_swap_group GLeeEnabled(&_GLEE_WGL_NV_swap_group) -#define GLEE_WGL_NV_gpu_affinity GLeeEnabled(&_GLEE_WGL_NV_gpu_affinity) -#define GLEE_WGL_EXT_display_color_table GLeeEnabled(&_GLEE_WGL_EXT_display_color_table) -#define GLEE_WGL_EXT_extensions_string GLeeEnabled(&_GLEE_WGL_EXT_extensions_string) -#define GLEE_WGL_EXT_swap_control GLeeEnabled(&_GLEE_WGL_EXT_swap_control) -#define GLEE_WGL_NV_vertex_array_range GLeeEnabled(&_GLEE_WGL_NV_vertex_array_range) -#define GLEE_WGL_OML_sync_control GLeeEnabled(&_GLEE_WGL_OML_sync_control) -#define GLEE_WGL_I3D_swap_frame_usage GLeeEnabled(&_GLEE_WGL_I3D_swap_frame_usage) -#define GLEE_WGL_NV_video_output GLeeEnabled(&_GLEE_WGL_NV_video_output) - -/* WGL_ARB_buffer_region */ - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 -#define __GLEE_WGL_ARB_buffer_region 1 -/* Constants */ -#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 -#ifndef GLEE_H_DEFINED_wglCreateBufferRegionARB -#define GLEE_H_DEFINED_wglCreateBufferRegionARB - typedef HANDLE (APIENTRYP GLEEPFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); - GLEE_EXTERN GLEEPFNWGLCREATEBUFFERREGIONARBPROC GLeeFuncPtr_wglCreateBufferRegionARB; - #define wglCreateBufferRegionARB GLeeFuncPtr_wglCreateBufferRegionARB -#endif -#ifndef GLEE_H_DEFINED_wglDeleteBufferRegionARB -#define GLEE_H_DEFINED_wglDeleteBufferRegionARB - typedef VOID (APIENTRYP GLEEPFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); - GLEE_EXTERN GLEEPFNWGLDELETEBUFFERREGIONARBPROC GLeeFuncPtr_wglDeleteBufferRegionARB; - #define wglDeleteBufferRegionARB GLeeFuncPtr_wglDeleteBufferRegionARB -#endif -#ifndef GLEE_H_DEFINED_wglSaveBufferRegionARB -#define GLEE_H_DEFINED_wglSaveBufferRegionARB - typedef BOOL (APIENTRYP GLEEPFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); - GLEE_EXTERN GLEEPFNWGLSAVEBUFFERREGIONARBPROC GLeeFuncPtr_wglSaveBufferRegionARB; - #define wglSaveBufferRegionARB GLeeFuncPtr_wglSaveBufferRegionARB -#endif -#ifndef GLEE_H_DEFINED_wglRestoreBufferRegionARB -#define GLEE_H_DEFINED_wglRestoreBufferRegionARB - typedef BOOL (APIENTRYP GLEEPFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); - GLEE_EXTERN GLEEPFNWGLRESTOREBUFFERREGIONARBPROC GLeeFuncPtr_wglRestoreBufferRegionARB; - #define wglRestoreBufferRegionARB GLeeFuncPtr_wglRestoreBufferRegionARB -#endif -#endif - -/* WGL_ARB_multisample */ - -#ifndef WGL_ARB_multisample -#define WGL_ARB_multisample 1 -#define __GLEE_WGL_ARB_multisample 1 -/* Constants */ -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 -#endif - -/* WGL_ARB_extensions_string */ - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 -#define __GLEE_WGL_ARB_extensions_string 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglGetExtensionsStringARB -#define GLEE_H_DEFINED_wglGetExtensionsStringARB - typedef const char * (APIENTRYP GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - GLEE_EXTERN GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC GLeeFuncPtr_wglGetExtensionsStringARB; - #define wglGetExtensionsStringARB GLeeFuncPtr_wglGetExtensionsStringARB -#endif -#endif - -/* WGL_ARB_pixel_format */ - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 -#define __GLEE_WGL_ARB_pixel_format 1 -/* Constants */ -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribivARB -#define GLEE_H_DEFINED_wglGetPixelFormatAttribivARB - typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues); - GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribivARB; - #define wglGetPixelFormatAttribivARB GLeeFuncPtr_wglGetPixelFormatAttribivARB -#endif -#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribfvARB -#define GLEE_H_DEFINED_wglGetPixelFormatAttribfvARB - typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues); - GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribfvARB; - #define wglGetPixelFormatAttribfvARB GLeeFuncPtr_wglGetPixelFormatAttribfvARB -#endif -#ifndef GLEE_H_DEFINED_wglChoosePixelFormatARB -#define GLEE_H_DEFINED_wglChoosePixelFormatARB - typedef BOOL (APIENTRYP GLEEPFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats); - GLEE_EXTERN GLEEPFNWGLCHOOSEPIXELFORMATARBPROC GLeeFuncPtr_wglChoosePixelFormatARB; - #define wglChoosePixelFormatARB GLeeFuncPtr_wglChoosePixelFormatARB -#endif -#endif - -/* WGL_ARB_make_current_read */ - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 -#define __GLEE_WGL_ARB_make_current_read 1 -/* Constants */ -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 -#ifndef GLEE_H_DEFINED_wglMakeContextCurrentARB -#define GLEE_H_DEFINED_wglMakeContextCurrentARB - typedef BOOL (APIENTRYP GLEEPFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - GLEE_EXTERN GLEEPFNWGLMAKECONTEXTCURRENTARBPROC GLeeFuncPtr_wglMakeContextCurrentARB; - #define wglMakeContextCurrentARB GLeeFuncPtr_wglMakeContextCurrentARB -#endif -#ifndef GLEE_H_DEFINED_wglGetCurrentReadDCARB -#define GLEE_H_DEFINED_wglGetCurrentReadDCARB - typedef HDC (APIENTRYP GLEEPFNWGLGETCURRENTREADDCARBPROC) (); - GLEE_EXTERN GLEEPFNWGLGETCURRENTREADDCARBPROC GLeeFuncPtr_wglGetCurrentReadDCARB; - #define wglGetCurrentReadDCARB GLeeFuncPtr_wglGetCurrentReadDCARB -#endif -#endif - -/* WGL_ARB_pbuffer */ - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 -#define __GLEE_WGL_ARB_pbuffer 1 -/* Constants */ -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 -#ifndef GLEE_H_DEFINED_wglCreatePbufferARB -#define GLEE_H_DEFINED_wglCreatePbufferARB - typedef HPBUFFERARB (APIENTRYP GLEEPFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList); - GLEE_EXTERN GLEEPFNWGLCREATEPBUFFERARBPROC GLeeFuncPtr_wglCreatePbufferARB; - #define wglCreatePbufferARB GLeeFuncPtr_wglCreatePbufferARB -#endif -#ifndef GLEE_H_DEFINED_wglGetPbufferDCARB -#define GLEE_H_DEFINED_wglGetPbufferDCARB - typedef HDC (APIENTRYP GLEEPFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); - GLEE_EXTERN GLEEPFNWGLGETPBUFFERDCARBPROC GLeeFuncPtr_wglGetPbufferDCARB; - #define wglGetPbufferDCARB GLeeFuncPtr_wglGetPbufferDCARB -#endif -#ifndef GLEE_H_DEFINED_wglReleasePbufferDCARB -#define GLEE_H_DEFINED_wglReleasePbufferDCARB - typedef int (APIENTRYP GLEEPFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); - GLEE_EXTERN GLEEPFNWGLRELEASEPBUFFERDCARBPROC GLeeFuncPtr_wglReleasePbufferDCARB; - #define wglReleasePbufferDCARB GLeeFuncPtr_wglReleasePbufferDCARB -#endif -#ifndef GLEE_H_DEFINED_wglDestroyPbufferARB -#define GLEE_H_DEFINED_wglDestroyPbufferARB - typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); - GLEE_EXTERN GLEEPFNWGLDESTROYPBUFFERARBPROC GLeeFuncPtr_wglDestroyPbufferARB; - #define wglDestroyPbufferARB GLeeFuncPtr_wglDestroyPbufferARB -#endif -#ifndef GLEE_H_DEFINED_wglQueryPbufferARB -#define GLEE_H_DEFINED_wglQueryPbufferARB - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int * piValue); - GLEE_EXTERN GLEEPFNWGLQUERYPBUFFERARBPROC GLeeFuncPtr_wglQueryPbufferARB; - #define wglQueryPbufferARB GLeeFuncPtr_wglQueryPbufferARB -#endif -#endif - -/* WGL_ARB_render_texture */ - -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 -#define __GLEE_WGL_ARB_render_texture 1 -/* Constants */ -#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_MIPMAP_TEXTURE_ARB 0x2074 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 -#define WGL_TEXTURE_1D_ARB 0x2079 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_MIPMAP_LEVEL_ARB 0x207B -#define WGL_CUBE_MAP_FACE_ARB 0x207C -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 -#define WGL_FRONT_LEFT_ARB 0x2083 -#define WGL_FRONT_RIGHT_ARB 0x2084 -#define WGL_BACK_LEFT_ARB 0x2085 -#define WGL_BACK_RIGHT_ARB 0x2086 -#define WGL_AUX0_ARB 0x2087 -#define WGL_AUX1_ARB 0x2088 -#define WGL_AUX2_ARB 0x2089 -#define WGL_AUX3_ARB 0x208A -#define WGL_AUX4_ARB 0x208B -#define WGL_AUX5_ARB 0x208C -#define WGL_AUX6_ARB 0x208D -#define WGL_AUX7_ARB 0x208E -#define WGL_AUX8_ARB 0x208F -#define WGL_AUX9_ARB 0x2090 -#ifndef GLEE_H_DEFINED_wglBindTexImageARB -#define GLEE_H_DEFINED_wglBindTexImageARB - typedef BOOL (APIENTRYP GLEEPFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); - GLEE_EXTERN GLEEPFNWGLBINDTEXIMAGEARBPROC GLeeFuncPtr_wglBindTexImageARB; - #define wglBindTexImageARB GLeeFuncPtr_wglBindTexImageARB -#endif -#ifndef GLEE_H_DEFINED_wglReleaseTexImageARB -#define GLEE_H_DEFINED_wglReleaseTexImageARB - typedef BOOL (APIENTRYP GLEEPFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); - GLEE_EXTERN GLEEPFNWGLRELEASETEXIMAGEARBPROC GLeeFuncPtr_wglReleaseTexImageARB; - #define wglReleaseTexImageARB GLeeFuncPtr_wglReleaseTexImageARB -#endif -#ifndef GLEE_H_DEFINED_wglSetPbufferAttribARB -#define GLEE_H_DEFINED_wglSetPbufferAttribARB - typedef BOOL (APIENTRYP GLEEPFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList); - GLEE_EXTERN GLEEPFNWGLSETPBUFFERATTRIBARBPROC GLeeFuncPtr_wglSetPbufferAttribARB; - #define wglSetPbufferAttribARB GLeeFuncPtr_wglSetPbufferAttribARB -#endif -#endif - -/* WGL_ARB_pixel_format_float */ - -#ifndef WGL_ARB_pixel_format_float -#define WGL_ARB_pixel_format_float 1 -#define __GLEE_WGL_ARB_pixel_format_float 1 -/* Constants */ -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 -#endif - -/* WGL_ARB_create_context */ - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context 1 -#define __GLEE_WGL_ARB_create_context 1 -/* Constants */ -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define ERROR_INVALID_VERSION_ARB 0x2095 -#ifndef GLEE_H_DEFINED_wglCreateContextAttribsARB -#define GLEE_H_DEFINED_wglCreateContextAttribsARB - typedef HGLRC (APIENTRYP GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int * attribList); - GLEE_EXTERN GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_wglCreateContextAttribsARB; - #define wglCreateContextAttribsARB GLeeFuncPtr_wglCreateContextAttribsARB -#endif -#endif - -/* WGL_EXT_make_current_read */ - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 -#define __GLEE_WGL_EXT_make_current_read 1 -/* Constants */ -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 -#ifndef GLEE_H_DEFINED_wglMakeContextCurrentEXT -#define GLEE_H_DEFINED_wglMakeContextCurrentEXT - typedef BOOL (APIENTRYP GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - GLEE_EXTERN GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC GLeeFuncPtr_wglMakeContextCurrentEXT; - #define wglMakeContextCurrentEXT GLeeFuncPtr_wglMakeContextCurrentEXT -#endif -#ifndef GLEE_H_DEFINED_wglGetCurrentReadDCEXT -#define GLEE_H_DEFINED_wglGetCurrentReadDCEXT - typedef HDC (APIENTRYP GLEEPFNWGLGETCURRENTREADDCEXTPROC) (); - GLEE_EXTERN GLEEPFNWGLGETCURRENTREADDCEXTPROC GLeeFuncPtr_wglGetCurrentReadDCEXT; - #define wglGetCurrentReadDCEXT GLeeFuncPtr_wglGetCurrentReadDCEXT -#endif -#endif - -/* WGL_EXT_pixel_format */ - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 -#define __GLEE_WGL_EXT_pixel_format 1 -/* Constants */ -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C -#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribivEXT -#define GLEE_H_DEFINED_wglGetPixelFormatAttribivEXT - typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, int * piValues); - GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribivEXT; - #define wglGetPixelFormatAttribivEXT GLeeFuncPtr_wglGetPixelFormatAttribivEXT -#endif -#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribfvEXT -#define GLEE_H_DEFINED_wglGetPixelFormatAttribfvEXT - typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, FLOAT * pfValues); - GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribfvEXT; - #define wglGetPixelFormatAttribfvEXT GLeeFuncPtr_wglGetPixelFormatAttribfvEXT -#endif -#ifndef GLEE_H_DEFINED_wglChoosePixelFormatEXT -#define GLEE_H_DEFINED_wglChoosePixelFormatEXT - typedef BOOL (APIENTRYP GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats); - GLEE_EXTERN GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC GLeeFuncPtr_wglChoosePixelFormatEXT; - #define wglChoosePixelFormatEXT GLeeFuncPtr_wglChoosePixelFormatEXT -#endif -#endif - -/* WGL_EXT_pbuffer */ - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 -#define __GLEE_WGL_EXT_pbuffer 1 -/* Constants */ -#define WGL_DRAW_TO_PBUFFER_EXT 0x202D -#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WGL_PBUFFER_LARGEST_EXT 0x2033 -#define WGL_PBUFFER_WIDTH_EXT 0x2034 -#define WGL_PBUFFER_HEIGHT_EXT 0x2035 -#ifndef GLEE_H_DEFINED_wglCreatePbufferEXT -#define GLEE_H_DEFINED_wglCreatePbufferEXT - typedef HPBUFFEREXT (APIENTRYP GLEEPFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList); - GLEE_EXTERN GLEEPFNWGLCREATEPBUFFEREXTPROC GLeeFuncPtr_wglCreatePbufferEXT; - #define wglCreatePbufferEXT GLeeFuncPtr_wglCreatePbufferEXT -#endif -#ifndef GLEE_H_DEFINED_wglGetPbufferDCEXT -#define GLEE_H_DEFINED_wglGetPbufferDCEXT - typedef HDC (APIENTRYP GLEEPFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); - GLEE_EXTERN GLEEPFNWGLGETPBUFFERDCEXTPROC GLeeFuncPtr_wglGetPbufferDCEXT; - #define wglGetPbufferDCEXT GLeeFuncPtr_wglGetPbufferDCEXT -#endif -#ifndef GLEE_H_DEFINED_wglReleasePbufferDCEXT -#define GLEE_H_DEFINED_wglReleasePbufferDCEXT - typedef int (APIENTRYP GLEEPFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); - GLEE_EXTERN GLEEPFNWGLRELEASEPBUFFERDCEXTPROC GLeeFuncPtr_wglReleasePbufferDCEXT; - #define wglReleasePbufferDCEXT GLeeFuncPtr_wglReleasePbufferDCEXT -#endif -#ifndef GLEE_H_DEFINED_wglDestroyPbufferEXT -#define GLEE_H_DEFINED_wglDestroyPbufferEXT - typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); - GLEE_EXTERN GLEEPFNWGLDESTROYPBUFFEREXTPROC GLeeFuncPtr_wglDestroyPbufferEXT; - #define wglDestroyPbufferEXT GLeeFuncPtr_wglDestroyPbufferEXT -#endif -#ifndef GLEE_H_DEFINED_wglQueryPbufferEXT -#define GLEE_H_DEFINED_wglQueryPbufferEXT - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int * piValue); - GLEE_EXTERN GLEEPFNWGLQUERYPBUFFEREXTPROC GLeeFuncPtr_wglQueryPbufferEXT; - #define wglQueryPbufferEXT GLeeFuncPtr_wglQueryPbufferEXT -#endif -#endif - -/* WGL_EXT_depth_float */ - -#ifndef WGL_EXT_depth_float -#define WGL_EXT_depth_float 1 -#define __GLEE_WGL_EXT_depth_float 1 -/* Constants */ -#define WGL_DEPTH_FLOAT_EXT 0x2040 -#endif - -/* WGL_3DFX_multisample */ - -#ifndef WGL_3DFX_multisample -#define WGL_3DFX_multisample 1 -#define __GLEE_WGL_3DFX_multisample 1 -/* Constants */ -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 -#endif - -/* WGL_EXT_multisample */ - -#ifndef WGL_EXT_multisample -#define WGL_EXT_multisample 1 -#define __GLEE_WGL_EXT_multisample 1 -/* Constants */ -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 -#endif - -/* WGL_I3D_digital_video_control */ - -#ifndef WGL_I3D_digital_video_control -#define WGL_I3D_digital_video_control 1 -#define __GLEE_WGL_I3D_digital_video_control 1 -/* Constants */ -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 -#ifndef GLEE_H_DEFINED_wglGetDigitalVideoParametersI3D -#define GLEE_H_DEFINED_wglGetDigitalVideoParametersI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int * piValue); - GLEE_EXTERN GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglGetDigitalVideoParametersI3D; - #define wglGetDigitalVideoParametersI3D GLeeFuncPtr_wglGetDigitalVideoParametersI3D -#endif -#ifndef GLEE_H_DEFINED_wglSetDigitalVideoParametersI3D -#define GLEE_H_DEFINED_wglSetDigitalVideoParametersI3D - typedef BOOL (APIENTRYP GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int * piValue); - GLEE_EXTERN GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglSetDigitalVideoParametersI3D; - #define wglSetDigitalVideoParametersI3D GLeeFuncPtr_wglSetDigitalVideoParametersI3D -#endif -#endif - -/* WGL_I3D_gamma */ - -#ifndef WGL_I3D_gamma -#define WGL_I3D_gamma 1 -#define __GLEE_WGL_I3D_gamma 1 -/* Constants */ -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F -#ifndef GLEE_H_DEFINED_wglGetGammaTableParametersI3D -#define GLEE_H_DEFINED_wglGetGammaTableParametersI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int * piValue); - GLEE_EXTERN GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglGetGammaTableParametersI3D; - #define wglGetGammaTableParametersI3D GLeeFuncPtr_wglGetGammaTableParametersI3D -#endif -#ifndef GLEE_H_DEFINED_wglSetGammaTableParametersI3D -#define GLEE_H_DEFINED_wglSetGammaTableParametersI3D - typedef BOOL (APIENTRYP GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int * piValue); - GLEE_EXTERN GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglSetGammaTableParametersI3D; - #define wglSetGammaTableParametersI3D GLeeFuncPtr_wglSetGammaTableParametersI3D -#endif -#ifndef GLEE_H_DEFINED_wglGetGammaTableI3D -#define GLEE_H_DEFINED_wglGetGammaTableI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT * puRed, USHORT * puGreen, USHORT * puBlue); - GLEE_EXTERN GLEEPFNWGLGETGAMMATABLEI3DPROC GLeeFuncPtr_wglGetGammaTableI3D; - #define wglGetGammaTableI3D GLeeFuncPtr_wglGetGammaTableI3D -#endif -#ifndef GLEE_H_DEFINED_wglSetGammaTableI3D -#define GLEE_H_DEFINED_wglSetGammaTableI3D - typedef BOOL (APIENTRYP GLEEPFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT * puRed, const USHORT * puGreen, const USHORT * puBlue); - GLEE_EXTERN GLEEPFNWGLSETGAMMATABLEI3DPROC GLeeFuncPtr_wglSetGammaTableI3D; - #define wglSetGammaTableI3D GLeeFuncPtr_wglSetGammaTableI3D -#endif -#endif - -/* WGL_I3D_genlock */ - -#ifndef WGL_I3D_genlock -#define WGL_I3D_genlock 1 -#define __GLEE_WGL_I3D_genlock 1 -/* Constants */ -#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 -#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 -#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 -#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C -#ifndef GLEE_H_DEFINED_wglEnableGenlockI3D -#define GLEE_H_DEFINED_wglEnableGenlockI3D - typedef BOOL (APIENTRYP GLEEPFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); - GLEE_EXTERN GLEEPFNWGLENABLEGENLOCKI3DPROC GLeeFuncPtr_wglEnableGenlockI3D; - #define wglEnableGenlockI3D GLeeFuncPtr_wglEnableGenlockI3D -#endif -#ifndef GLEE_H_DEFINED_wglDisableGenlockI3D -#define GLEE_H_DEFINED_wglDisableGenlockI3D - typedef BOOL (APIENTRYP GLEEPFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); - GLEE_EXTERN GLEEPFNWGLDISABLEGENLOCKI3DPROC GLeeFuncPtr_wglDisableGenlockI3D; - #define wglDisableGenlockI3D GLeeFuncPtr_wglDisableGenlockI3D -#endif -#ifndef GLEE_H_DEFINED_wglIsEnabledGenlockI3D -#define GLEE_H_DEFINED_wglIsEnabledGenlockI3D - typedef BOOL (APIENTRYP GLEEPFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL * pFlag); - GLEE_EXTERN GLEEPFNWGLISENABLEDGENLOCKI3DPROC GLeeFuncPtr_wglIsEnabledGenlockI3D; - #define wglIsEnabledGenlockI3D GLeeFuncPtr_wglIsEnabledGenlockI3D -#endif -#ifndef GLEE_H_DEFINED_wglGenlockSourceI3D -#define GLEE_H_DEFINED_wglGenlockSourceI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); - GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGenlockSourceI3D; - #define wglGenlockSourceI3D GLeeFuncPtr_wglGenlockSourceI3D -#endif -#ifndef GLEE_H_DEFINED_wglGetGenlockSourceI3D -#define GLEE_H_DEFINED_wglGetGenlockSourceI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT * uSource); - GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGetGenlockSourceI3D; - #define wglGetGenlockSourceI3D GLeeFuncPtr_wglGetGenlockSourceI3D -#endif -#ifndef GLEE_H_DEFINED_wglGenlockSourceEdgeI3D -#define GLEE_H_DEFINED_wglGenlockSourceEdgeI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); - GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGenlockSourceEdgeI3D; - #define wglGenlockSourceEdgeI3D GLeeFuncPtr_wglGenlockSourceEdgeI3D -#endif -#ifndef GLEE_H_DEFINED_wglGetGenlockSourceEdgeI3D -#define GLEE_H_DEFINED_wglGetGenlockSourceEdgeI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT * uEdge); - GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGetGenlockSourceEdgeI3D; - #define wglGetGenlockSourceEdgeI3D GLeeFuncPtr_wglGetGenlockSourceEdgeI3D -#endif -#ifndef GLEE_H_DEFINED_wglGenlockSampleRateI3D -#define GLEE_H_DEFINED_wglGenlockSampleRateI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); - GLEE_EXTERN GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGenlockSampleRateI3D; - #define wglGenlockSampleRateI3D GLeeFuncPtr_wglGenlockSampleRateI3D -#endif -#ifndef GLEE_H_DEFINED_wglGetGenlockSampleRateI3D -#define GLEE_H_DEFINED_wglGetGenlockSampleRateI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT * uRate); - GLEE_EXTERN GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGetGenlockSampleRateI3D; - #define wglGetGenlockSampleRateI3D GLeeFuncPtr_wglGetGenlockSampleRateI3D -#endif -#ifndef GLEE_H_DEFINED_wglGenlockSourceDelayI3D -#define GLEE_H_DEFINED_wglGenlockSourceDelayI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); - GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGenlockSourceDelayI3D; - #define wglGenlockSourceDelayI3D GLeeFuncPtr_wglGenlockSourceDelayI3D -#endif -#ifndef GLEE_H_DEFINED_wglGetGenlockSourceDelayI3D -#define GLEE_H_DEFINED_wglGetGenlockSourceDelayI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT * uDelay); - GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGetGenlockSourceDelayI3D; - #define wglGetGenlockSourceDelayI3D GLeeFuncPtr_wglGetGenlockSourceDelayI3D -#endif -#ifndef GLEE_H_DEFINED_wglQueryGenlockMaxSourceDelayI3D -#define GLEE_H_DEFINED_wglQueryGenlockMaxSourceDelayI3D - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT * uMaxLineDelay, UINT * uMaxPixelDelay); - GLEE_EXTERN GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D; - #define wglQueryGenlockMaxSourceDelayI3D GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D -#endif -#endif - -/* WGL_I3D_image_buffer */ - -#ifndef WGL_I3D_image_buffer -#define WGL_I3D_image_buffer 1 -#define __GLEE_WGL_I3D_image_buffer 1 -/* Constants */ -#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 -#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 -#ifndef GLEE_H_DEFINED_wglCreateImageBufferI3D -#define GLEE_H_DEFINED_wglCreateImageBufferI3D - typedef LPVOID (APIENTRYP GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); - GLEE_EXTERN GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC GLeeFuncPtr_wglCreateImageBufferI3D; - #define wglCreateImageBufferI3D GLeeFuncPtr_wglCreateImageBufferI3D -#endif -#ifndef GLEE_H_DEFINED_wglDestroyImageBufferI3D -#define GLEE_H_DEFINED_wglDestroyImageBufferI3D - typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); - GLEE_EXTERN GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC GLeeFuncPtr_wglDestroyImageBufferI3D; - #define wglDestroyImageBufferI3D GLeeFuncPtr_wglDestroyImageBufferI3D -#endif -#ifndef GLEE_H_DEFINED_wglAssociateImageBufferEventsI3D -#define GLEE_H_DEFINED_wglAssociateImageBufferEventsI3D - typedef BOOL (APIENTRYP GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE * pEvent, const LPVOID * pAddress, const DWORD * pSize, UINT count); - GLEE_EXTERN GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglAssociateImageBufferEventsI3D; - #define wglAssociateImageBufferEventsI3D GLeeFuncPtr_wglAssociateImageBufferEventsI3D -#endif -#ifndef GLEE_H_DEFINED_wglReleaseImageBufferEventsI3D -#define GLEE_H_DEFINED_wglReleaseImageBufferEventsI3D - typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID * pAddress, UINT count); - GLEE_EXTERN GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglReleaseImageBufferEventsI3D; - #define wglReleaseImageBufferEventsI3D GLeeFuncPtr_wglReleaseImageBufferEventsI3D -#endif -#endif - -/* WGL_I3D_swap_frame_lock */ - -#ifndef WGL_I3D_swap_frame_lock -#define WGL_I3D_swap_frame_lock 1 -#define __GLEE_WGL_I3D_swap_frame_lock 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglEnableFrameLockI3D -#define GLEE_H_DEFINED_wglEnableFrameLockI3D - typedef BOOL (APIENTRYP GLEEPFNWGLENABLEFRAMELOCKI3DPROC) (); - GLEE_EXTERN GLEEPFNWGLENABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglEnableFrameLockI3D; - #define wglEnableFrameLockI3D GLeeFuncPtr_wglEnableFrameLockI3D -#endif -#ifndef GLEE_H_DEFINED_wglDisableFrameLockI3D -#define GLEE_H_DEFINED_wglDisableFrameLockI3D - typedef BOOL (APIENTRYP GLEEPFNWGLDISABLEFRAMELOCKI3DPROC) (); - GLEE_EXTERN GLEEPFNWGLDISABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglDisableFrameLockI3D; - #define wglDisableFrameLockI3D GLeeFuncPtr_wglDisableFrameLockI3D -#endif -#ifndef GLEE_H_DEFINED_wglIsEnabledFrameLockI3D -#define GLEE_H_DEFINED_wglIsEnabledFrameLockI3D - typedef BOOL (APIENTRYP GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL * pFlag); - GLEE_EXTERN GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC GLeeFuncPtr_wglIsEnabledFrameLockI3D; - #define wglIsEnabledFrameLockI3D GLeeFuncPtr_wglIsEnabledFrameLockI3D -#endif -#ifndef GLEE_H_DEFINED_wglQueryFrameLockMasterI3D -#define GLEE_H_DEFINED_wglQueryFrameLockMasterI3D - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL * pFlag); - GLEE_EXTERN GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC GLeeFuncPtr_wglQueryFrameLockMasterI3D; - #define wglQueryFrameLockMasterI3D GLeeFuncPtr_wglQueryFrameLockMasterI3D -#endif -#endif - -/* WGL_NV_render_depth_texture */ - -#ifndef WGL_NV_render_depth_texture -#define WGL_NV_render_depth_texture 1 -#define __GLEE_WGL_NV_render_depth_texture 1 -/* Constants */ -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 -#endif - -/* WGL_NV_render_texture_rectangle */ - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_NV_render_texture_rectangle 1 -#define __GLEE_WGL_NV_render_texture_rectangle 1 -/* Constants */ -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 -#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 -#endif - -/* WGL_ATI_pixel_format_float */ - -#ifndef WGL_ATI_pixel_format_float -#define WGL_ATI_pixel_format_float 1 -#define __GLEE_WGL_ATI_pixel_format_float 1 -/* Constants */ -#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 -#endif - -/* WGL_NV_float_buffer */ - -#ifndef WGL_NV_float_buffer -#define WGL_NV_float_buffer 1 -#define __GLEE_WGL_NV_float_buffer 1 -/* Constants */ -#define WGL_FLOAT_COMPONENTS_NV 0x20B0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 -#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 -#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 -#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 -#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 -#endif - -/* WGL_3DL_stereo_control */ - -#ifndef WGL_3DL_stereo_control -#define WGL_3DL_stereo_control 1 -#define __GLEE_WGL_3DL_stereo_control 1 -/* Constants */ -#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 -#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 -#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 -#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 -#endif - -/* WGL_EXT_pixel_format_packed_float */ - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_EXT_pixel_format_packed_float 1 -#define __GLEE_WGL_EXT_pixel_format_packed_float 1 -/* Constants */ -#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 -#endif - -/* WGL_EXT_framebuffer_sRGB */ - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_EXT_framebuffer_sRGB 1 -#define __GLEE_WGL_EXT_framebuffer_sRGB 1 -/* Constants */ -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 -#endif - -/* WGL_NV_present_video */ - -#ifndef WGL_NV_present_video -#define WGL_NV_present_video 1 -#define __GLEE_WGL_NV_present_video 1 -/* Constants */ -#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 -#ifndef GLEE_H_DEFINED_wglEnumerateVideoDevicesNV -#define GLEE_H_DEFINED_wglEnumerateVideoDevicesNV - typedef int (APIENTRYP GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV * phDeviceList); - GLEE_EXTERN GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC GLeeFuncPtr_wglEnumerateVideoDevicesNV; - #define wglEnumerateVideoDevicesNV GLeeFuncPtr_wglEnumerateVideoDevicesNV -#endif -#ifndef GLEE_H_DEFINED_wglBindVideoDeviceNV -#define GLEE_H_DEFINED_wglBindVideoDeviceNV - typedef BOOL (APIENTRYP GLEEPFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList); - GLEE_EXTERN GLEEPFNWGLBINDVIDEODEVICENVPROC GLeeFuncPtr_wglBindVideoDeviceNV; - #define wglBindVideoDeviceNV GLeeFuncPtr_wglBindVideoDeviceNV -#endif -#ifndef GLEE_H_DEFINED_wglQueryCurrentContextNV -#define GLEE_H_DEFINED_wglQueryCurrentContextNV - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int * piValue); - GLEE_EXTERN GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC GLeeFuncPtr_wglQueryCurrentContextNV; - #define wglQueryCurrentContextNV GLeeFuncPtr_wglQueryCurrentContextNV -#endif -#endif - -/* WGL_NV_swap_group */ - -#ifndef WGL_NV_swap_group -#define WGL_NV_swap_group 1 -#define __GLEE_WGL_NV_swap_group 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglJoinSwapGroupNV -#define GLEE_H_DEFINED_wglJoinSwapGroupNV - typedef BOOL (APIENTRYP GLEEPFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); - GLEE_EXTERN GLEEPFNWGLJOINSWAPGROUPNVPROC GLeeFuncPtr_wglJoinSwapGroupNV; - #define wglJoinSwapGroupNV GLeeFuncPtr_wglJoinSwapGroupNV -#endif -#ifndef GLEE_H_DEFINED_wglBindSwapBarrierNV -#define GLEE_H_DEFINED_wglBindSwapBarrierNV - typedef BOOL (APIENTRYP GLEEPFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); - GLEE_EXTERN GLEEPFNWGLBINDSWAPBARRIERNVPROC GLeeFuncPtr_wglBindSwapBarrierNV; - #define wglBindSwapBarrierNV GLeeFuncPtr_wglBindSwapBarrierNV -#endif -#ifndef GLEE_H_DEFINED_wglQuerySwapGroupNV -#define GLEE_H_DEFINED_wglQuerySwapGroupNV - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint * group, GLuint * barrier); - GLEE_EXTERN GLEEPFNWGLQUERYSWAPGROUPNVPROC GLeeFuncPtr_wglQuerySwapGroupNV; - #define wglQuerySwapGroupNV GLeeFuncPtr_wglQuerySwapGroupNV -#endif -#ifndef GLEE_H_DEFINED_wglQueryMaxSwapGroupsNV -#define GLEE_H_DEFINED_wglQueryMaxSwapGroupsNV - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint * maxGroups, GLuint * maxBarriers); - GLEE_EXTERN GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC GLeeFuncPtr_wglQueryMaxSwapGroupsNV; - #define wglQueryMaxSwapGroupsNV GLeeFuncPtr_wglQueryMaxSwapGroupsNV -#endif -#ifndef GLEE_H_DEFINED_wglQueryFrameCountNV -#define GLEE_H_DEFINED_wglQueryFrameCountNV - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint * count); - GLEE_EXTERN GLEEPFNWGLQUERYFRAMECOUNTNVPROC GLeeFuncPtr_wglQueryFrameCountNV; - #define wglQueryFrameCountNV GLeeFuncPtr_wglQueryFrameCountNV -#endif -#ifndef GLEE_H_DEFINED_wglResetFrameCountNV -#define GLEE_H_DEFINED_wglResetFrameCountNV - typedef BOOL (APIENTRYP GLEEPFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); - GLEE_EXTERN GLEEPFNWGLRESETFRAMECOUNTNVPROC GLeeFuncPtr_wglResetFrameCountNV; - #define wglResetFrameCountNV GLeeFuncPtr_wglResetFrameCountNV -#endif -#endif - -/* WGL_NV_gpu_affinity */ - -#ifndef WGL_NV_gpu_affinity -#define WGL_NV_gpu_affinity 1 -#define __GLEE_WGL_NV_gpu_affinity 1 -/* Constants */ -#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 -#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 -#ifndef GLEE_H_DEFINED_wglEnumGpusNV -#define GLEE_H_DEFINED_wglEnumGpusNV - typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV * phGpu); - GLEE_EXTERN GLEEPFNWGLENUMGPUSNVPROC GLeeFuncPtr_wglEnumGpusNV; - #define wglEnumGpusNV GLeeFuncPtr_wglEnumGpusNV -#endif -#ifndef GLEE_H_DEFINED_wglEnumGpuDevicesNV -#define GLEE_H_DEFINED_wglEnumGpuDevicesNV - typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); - GLEE_EXTERN GLEEPFNWGLENUMGPUDEVICESNVPROC GLeeFuncPtr_wglEnumGpuDevicesNV; - #define wglEnumGpuDevicesNV GLeeFuncPtr_wglEnumGpuDevicesNV -#endif -#ifndef GLEE_H_DEFINED_wglCreateAffinityDCNV -#define GLEE_H_DEFINED_wglCreateAffinityDCNV - typedef HDC (APIENTRYP GLEEPFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV * phGpuList); - GLEE_EXTERN GLEEPFNWGLCREATEAFFINITYDCNVPROC GLeeFuncPtr_wglCreateAffinityDCNV; - #define wglCreateAffinityDCNV GLeeFuncPtr_wglCreateAffinityDCNV -#endif -#ifndef GLEE_H_DEFINED_wglEnumGpusFromAffinityDCNV -#define GLEE_H_DEFINED_wglEnumGpusFromAffinityDCNV - typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV * hGpu); - GLEE_EXTERN GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC GLeeFuncPtr_wglEnumGpusFromAffinityDCNV; - #define wglEnumGpusFromAffinityDCNV GLeeFuncPtr_wglEnumGpusFromAffinityDCNV -#endif -#ifndef GLEE_H_DEFINED_wglDeleteDCNV -#define GLEE_H_DEFINED_wglDeleteDCNV - typedef BOOL (APIENTRYP GLEEPFNWGLDELETEDCNVPROC) (HDC hdc); - GLEE_EXTERN GLEEPFNWGLDELETEDCNVPROC GLeeFuncPtr_wglDeleteDCNV; - #define wglDeleteDCNV GLeeFuncPtr_wglDeleteDCNV -#endif -#endif - -/* WGL_EXT_display_color_table */ - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 -#define __GLEE_WGL_EXT_display_color_table 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglCreateDisplayColorTableEXT -#define GLEE_H_DEFINED_wglCreateDisplayColorTableEXT - typedef GLboolean (APIENTRYP GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); - GLEE_EXTERN GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglCreateDisplayColorTableEXT; - #define wglCreateDisplayColorTableEXT GLeeFuncPtr_wglCreateDisplayColorTableEXT -#endif -#ifndef GLEE_H_DEFINED_wglLoadDisplayColorTableEXT -#define GLEE_H_DEFINED_wglLoadDisplayColorTableEXT - typedef GLboolean (APIENTRYP GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort * table, GLuint length); - GLEE_EXTERN GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglLoadDisplayColorTableEXT; - #define wglLoadDisplayColorTableEXT GLeeFuncPtr_wglLoadDisplayColorTableEXT -#endif -#ifndef GLEE_H_DEFINED_wglBindDisplayColorTableEXT -#define GLEE_H_DEFINED_wglBindDisplayColorTableEXT - typedef GLboolean (APIENTRYP GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); - GLEE_EXTERN GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglBindDisplayColorTableEXT; - #define wglBindDisplayColorTableEXT GLeeFuncPtr_wglBindDisplayColorTableEXT -#endif -#ifndef GLEE_H_DEFINED_wglDestroyDisplayColorTableEXT -#define GLEE_H_DEFINED_wglDestroyDisplayColorTableEXT - typedef VOID (APIENTRYP GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); - GLEE_EXTERN GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglDestroyDisplayColorTableEXT; - #define wglDestroyDisplayColorTableEXT GLeeFuncPtr_wglDestroyDisplayColorTableEXT -#endif -#endif - -/* WGL_EXT_extensions_string */ - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 -#define __GLEE_WGL_EXT_extensions_string 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglGetExtensionsStringEXT -#define GLEE_H_DEFINED_wglGetExtensionsStringEXT - typedef const char * (APIENTRYP GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC) (); - GLEE_EXTERN GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC GLeeFuncPtr_wglGetExtensionsStringEXT; - #define wglGetExtensionsStringEXT GLeeFuncPtr_wglGetExtensionsStringEXT -#endif -#endif - -/* WGL_EXT_swap_control */ - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 -#define __GLEE_WGL_EXT_swap_control 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglSwapIntervalEXT -#define GLEE_H_DEFINED_wglSwapIntervalEXT - typedef BOOL (APIENTRYP GLEEPFNWGLSWAPINTERVALEXTPROC) (int interval); - GLEE_EXTERN GLEEPFNWGLSWAPINTERVALEXTPROC GLeeFuncPtr_wglSwapIntervalEXT; - #define wglSwapIntervalEXT GLeeFuncPtr_wglSwapIntervalEXT -#endif -#ifndef GLEE_H_DEFINED_wglGetSwapIntervalEXT -#define GLEE_H_DEFINED_wglGetSwapIntervalEXT - typedef int (APIENTRYP GLEEPFNWGLGETSWAPINTERVALEXTPROC) (); - GLEE_EXTERN GLEEPFNWGLGETSWAPINTERVALEXTPROC GLeeFuncPtr_wglGetSwapIntervalEXT; - #define wglGetSwapIntervalEXT GLeeFuncPtr_wglGetSwapIntervalEXT -#endif -#endif - -/* WGL_NV_vertex_array_range */ - -#ifndef WGL_NV_vertex_array_range -#define WGL_NV_vertex_array_range 1 -#define __GLEE_WGL_NV_vertex_array_range 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglAllocateMemoryNV -#define GLEE_H_DEFINED_wglAllocateMemoryNV - typedef void* (APIENTRYP GLEEPFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); - GLEE_EXTERN GLEEPFNWGLALLOCATEMEMORYNVPROC GLeeFuncPtr_wglAllocateMemoryNV; - #define wglAllocateMemoryNV GLeeFuncPtr_wglAllocateMemoryNV -#endif -#ifndef GLEE_H_DEFINED_wglFreeMemoryNV -#define GLEE_H_DEFINED_wglFreeMemoryNV - typedef void (APIENTRYP GLEEPFNWGLFREEMEMORYNVPROC) (void * pointer); - GLEE_EXTERN GLEEPFNWGLFREEMEMORYNVPROC GLeeFuncPtr_wglFreeMemoryNV; - #define wglFreeMemoryNV GLeeFuncPtr_wglFreeMemoryNV -#endif -#endif - -/* WGL_OML_sync_control */ - -#ifndef WGL_OML_sync_control -#define WGL_OML_sync_control 1 -#define __GLEE_WGL_OML_sync_control 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglGetSyncValuesOML -#define GLEE_H_DEFINED_wglGetSyncValuesOML - typedef BOOL (APIENTRYP GLEEPFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 * ust, INT64 * msc, INT64 * sbc); - GLEE_EXTERN GLEEPFNWGLGETSYNCVALUESOMLPROC GLeeFuncPtr_wglGetSyncValuesOML; - #define wglGetSyncValuesOML GLeeFuncPtr_wglGetSyncValuesOML -#endif -#ifndef GLEE_H_DEFINED_wglGetMscRateOML -#define GLEE_H_DEFINED_wglGetMscRateOML - typedef BOOL (APIENTRYP GLEEPFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 * numerator, INT32 * denominator); - GLEE_EXTERN GLEEPFNWGLGETMSCRATEOMLPROC GLeeFuncPtr_wglGetMscRateOML; - #define wglGetMscRateOML GLeeFuncPtr_wglGetMscRateOML -#endif -#ifndef GLEE_H_DEFINED_wglSwapBuffersMscOML -#define GLEE_H_DEFINED_wglSwapBuffersMscOML - typedef INT64 (APIENTRYP GLEEPFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); - GLEE_EXTERN GLEEPFNWGLSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapBuffersMscOML; - #define wglSwapBuffersMscOML GLeeFuncPtr_wglSwapBuffersMscOML -#endif -#ifndef GLEE_H_DEFINED_wglSwapLayerBuffersMscOML -#define GLEE_H_DEFINED_wglSwapLayerBuffersMscOML - typedef INT64 (APIENTRYP GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); - GLEE_EXTERN GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapLayerBuffersMscOML; - #define wglSwapLayerBuffersMscOML GLeeFuncPtr_wglSwapLayerBuffersMscOML -#endif -#ifndef GLEE_H_DEFINED_wglWaitForMscOML -#define GLEE_H_DEFINED_wglWaitForMscOML - typedef BOOL (APIENTRYP GLEEPFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 * ust, INT64 * msc, INT64 * sbc); - GLEE_EXTERN GLEEPFNWGLWAITFORMSCOMLPROC GLeeFuncPtr_wglWaitForMscOML; - #define wglWaitForMscOML GLeeFuncPtr_wglWaitForMscOML -#endif -#ifndef GLEE_H_DEFINED_wglWaitForSbcOML -#define GLEE_H_DEFINED_wglWaitForSbcOML - typedef BOOL (APIENTRYP GLEEPFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 * ust, INT64 * msc, INT64 * sbc); - GLEE_EXTERN GLEEPFNWGLWAITFORSBCOMLPROC GLeeFuncPtr_wglWaitForSbcOML; - #define wglWaitForSbcOML GLeeFuncPtr_wglWaitForSbcOML -#endif -#endif - -/* WGL_I3D_swap_frame_usage */ - -#ifndef WGL_I3D_swap_frame_usage -#define WGL_I3D_swap_frame_usage 1 -#define __GLEE_WGL_I3D_swap_frame_usage 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_wglGetFrameUsageI3D -#define GLEE_H_DEFINED_wglGetFrameUsageI3D - typedef BOOL (APIENTRYP GLEEPFNWGLGETFRAMEUSAGEI3DPROC) (float * pUsage); - GLEE_EXTERN GLEEPFNWGLGETFRAMEUSAGEI3DPROC GLeeFuncPtr_wglGetFrameUsageI3D; - #define wglGetFrameUsageI3D GLeeFuncPtr_wglGetFrameUsageI3D -#endif -#ifndef GLEE_H_DEFINED_wglBeginFrameTrackingI3D -#define GLEE_H_DEFINED_wglBeginFrameTrackingI3D - typedef BOOL (APIENTRYP GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC) (); - GLEE_EXTERN GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC GLeeFuncPtr_wglBeginFrameTrackingI3D; - #define wglBeginFrameTrackingI3D GLeeFuncPtr_wglBeginFrameTrackingI3D -#endif -#ifndef GLEE_H_DEFINED_wglEndFrameTrackingI3D -#define GLEE_H_DEFINED_wglEndFrameTrackingI3D - typedef BOOL (APIENTRYP GLEEPFNWGLENDFRAMETRACKINGI3DPROC) (); - GLEE_EXTERN GLEEPFNWGLENDFRAMETRACKINGI3DPROC GLeeFuncPtr_wglEndFrameTrackingI3D; - #define wglEndFrameTrackingI3D GLeeFuncPtr_wglEndFrameTrackingI3D -#endif -#ifndef GLEE_H_DEFINED_wglQueryFrameTrackingI3D -#define GLEE_H_DEFINED_wglQueryFrameTrackingI3D - typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD * pFrameCount, DWORD * pMissedFrames, float * pLastMissedUsage); - GLEE_EXTERN GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC GLeeFuncPtr_wglQueryFrameTrackingI3D; - #define wglQueryFrameTrackingI3D GLeeFuncPtr_wglQueryFrameTrackingI3D -#endif -#endif - -/* WGL_NV_video_output */ - -#ifndef WGL_NV_video_output -#define WGL_NV_video_output 1 -#define __GLEE_WGL_NV_video_output 1 -/* Constants */ -#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 -#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 -#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 -#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 -#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 -#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 -#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define WGL_VIDEO_OUT_FRAME 0x20C8 -#define WGL_VIDEO_OUT_FIELD_1 0x20C9 -#define WGL_VIDEO_OUT_FIELD_2 0x20CA -#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB -#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC -#ifndef GLEE_H_DEFINED_wglGetVideoDeviceNV -#define GLEE_H_DEFINED_wglGetVideoDeviceNV - typedef BOOL (APIENTRYP GLEEPFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV * hVideoDevice); - GLEE_EXTERN GLEEPFNWGLGETVIDEODEVICENVPROC GLeeFuncPtr_wglGetVideoDeviceNV; - #define wglGetVideoDeviceNV GLeeFuncPtr_wglGetVideoDeviceNV -#endif -#ifndef GLEE_H_DEFINED_wglReleaseVideoDeviceNV -#define GLEE_H_DEFINED_wglReleaseVideoDeviceNV - typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); - GLEE_EXTERN GLEEPFNWGLRELEASEVIDEODEVICENVPROC GLeeFuncPtr_wglReleaseVideoDeviceNV; - #define wglReleaseVideoDeviceNV GLeeFuncPtr_wglReleaseVideoDeviceNV -#endif -#ifndef GLEE_H_DEFINED_wglBindVideoImageNV -#define GLEE_H_DEFINED_wglBindVideoImageNV - typedef BOOL (APIENTRYP GLEEPFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); - GLEE_EXTERN GLEEPFNWGLBINDVIDEOIMAGENVPROC GLeeFuncPtr_wglBindVideoImageNV; - #define wglBindVideoImageNV GLeeFuncPtr_wglBindVideoImageNV -#endif -#ifndef GLEE_H_DEFINED_wglReleaseVideoImageNV -#define GLEE_H_DEFINED_wglReleaseVideoImageNV - typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); - GLEE_EXTERN GLEEPFNWGLRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_wglReleaseVideoImageNV; - #define wglReleaseVideoImageNV GLeeFuncPtr_wglReleaseVideoImageNV -#endif -#ifndef GLEE_H_DEFINED_wglSendPbufferToVideoNV -#define GLEE_H_DEFINED_wglSendPbufferToVideoNV - typedef BOOL (APIENTRYP GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock); - GLEE_EXTERN GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_wglSendPbufferToVideoNV; - #define wglSendPbufferToVideoNV GLeeFuncPtr_wglSendPbufferToVideoNV -#endif -#ifndef GLEE_H_DEFINED_wglGetVideoInfoNV -#define GLEE_H_DEFINED_wglGetVideoInfoNV - typedef BOOL (APIENTRYP GLEEPFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo); - GLEE_EXTERN GLEEPFNWGLGETVIDEOINFONVPROC GLeeFuncPtr_wglGetVideoInfoNV; - #define wglGetVideoInfoNV GLeeFuncPtr_wglGetVideoInfoNV -#endif -#endif -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else /* GLX */ - -/* Extension querying variables */ - -GLEE_EXTERN GLboolean _GLEE_GLX_VERSION_1_3; -GLEE_EXTERN GLboolean _GLEE_GLX_VERSION_1_4; -GLEE_EXTERN GLboolean _GLEE_GLX_ARB_multisample; -GLEE_EXTERN GLboolean _GLEE_GLX_ARB_fbconfig_float; -GLEE_EXTERN GLboolean _GLEE_GLX_ARB_create_context; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_multisample; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_visual_info; -GLEE_EXTERN GLboolean _GLEE_GLX_SGI_swap_control; -GLEE_EXTERN GLboolean _GLEE_GLX_SGI_video_sync; -GLEE_EXTERN GLboolean _GLEE_GLX_SGI_make_current_read; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_visual_rating; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_import_context; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_fbconfig; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_pbuffer; -GLEE_EXTERN GLboolean _GLEE_GLX_SGI_cushion; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_video_resize; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_swap_group; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_swap_barrier; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_blended_overlay; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_shared_multisample; -GLEE_EXTERN GLboolean _GLEE_GLX_SUN_get_transparent_index; -GLEE_EXTERN GLboolean _GLEE_GLX_3DFX_multisample; -GLEE_EXTERN GLboolean _GLEE_GLX_MESA_copy_sub_buffer; -GLEE_EXTERN GLboolean _GLEE_GLX_MESA_pixmap_colormap; -GLEE_EXTERN GLboolean _GLEE_GLX_MESA_release_buffers; -GLEE_EXTERN GLboolean _GLEE_GLX_MESA_set_3dfx_mode; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_visual_select_group; -GLEE_EXTERN GLboolean _GLEE_GLX_OML_swap_method; -GLEE_EXTERN GLboolean _GLEE_GLX_OML_sync_control; -GLEE_EXTERN GLboolean _GLEE_GLX_NV_float_buffer; -GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_hyperpipe; -GLEE_EXTERN GLboolean _GLEE_GLX_MESA_agp_offset; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_fbconfig_packed_float; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_framebuffer_sRGB; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_texture_from_pixmap; -GLEE_EXTERN GLboolean _GLEE_GLX_NV_present_video; -GLEE_EXTERN GLboolean _GLEE_GLX_NV_video_out; -GLEE_EXTERN GLboolean _GLEE_GLX_NV_swap_group; -GLEE_EXTERN GLboolean _GLEE_GLX_EXT_scene_marker; -GLEE_EXTERN GLboolean _GLEE_GLX_NV_video_output; - -/* Aliases for extension querying variables */ - -#define GLEE_GLX_VERSION_1_3 GLeeEnabled(&_GLEE_GLX_VERSION_1_3) -#define GLEE_GLX_VERSION_1_4 GLeeEnabled(&_GLEE_GLX_VERSION_1_4) -#define GLEE_GLX_ARB_multisample GLeeEnabled(&_GLEE_GLX_ARB_multisample) -#define GLEE_GLX_ARB_fbconfig_float GLeeEnabled(&_GLEE_GLX_ARB_fbconfig_float) -#define GLEE_GLX_ARB_create_context GLeeEnabled(&_GLEE_GLX_ARB_create_context) -#define GLEE_GLX_SGIS_multisample GLeeEnabled(&_GLEE_GLX_SGIS_multisample) -#define GLEE_GLX_EXT_visual_info GLeeEnabled(&_GLEE_GLX_EXT_visual_info) -#define GLEE_GLX_SGI_swap_control GLeeEnabled(&_GLEE_GLX_SGI_swap_control) -#define GLEE_GLX_SGI_video_sync GLeeEnabled(&_GLEE_GLX_SGI_video_sync) -#define GLEE_GLX_SGI_make_current_read GLeeEnabled(&_GLEE_GLX_SGI_make_current_read) -#define GLEE_GLX_EXT_visual_rating GLeeEnabled(&_GLEE_GLX_EXT_visual_rating) -#define GLEE_GLX_EXT_import_context GLeeEnabled(&_GLEE_GLX_EXT_import_context) -#define GLEE_GLX_SGIX_fbconfig GLeeEnabled(&_GLEE_GLX_SGIX_fbconfig) -#define GLEE_GLX_SGIX_pbuffer GLeeEnabled(&_GLEE_GLX_SGIX_pbuffer) -#define GLEE_GLX_SGI_cushion GLeeEnabled(&_GLEE_GLX_SGI_cushion) -#define GLEE_GLX_SGIX_video_resize GLeeEnabled(&_GLEE_GLX_SGIX_video_resize) -#define GLEE_GLX_SGIX_swap_group GLeeEnabled(&_GLEE_GLX_SGIX_swap_group) -#define GLEE_GLX_SGIX_swap_barrier GLeeEnabled(&_GLEE_GLX_SGIX_swap_barrier) -#define GLEE_GLX_SGIS_blended_overlay GLeeEnabled(&_GLEE_GLX_SGIS_blended_overlay) -#define GLEE_GLX_SGIS_shared_multisample GLeeEnabled(&_GLEE_GLX_SGIS_shared_multisample) -#define GLEE_GLX_SUN_get_transparent_index GLeeEnabled(&_GLEE_GLX_SUN_get_transparent_index) -#define GLEE_GLX_3DFX_multisample GLeeEnabled(&_GLEE_GLX_3DFX_multisample) -#define GLEE_GLX_MESA_copy_sub_buffer GLeeEnabled(&_GLEE_GLX_MESA_copy_sub_buffer) -#define GLEE_GLX_MESA_pixmap_colormap GLeeEnabled(&_GLEE_GLX_MESA_pixmap_colormap) -#define GLEE_GLX_MESA_release_buffers GLeeEnabled(&_GLEE_GLX_MESA_release_buffers) -#define GLEE_GLX_MESA_set_3dfx_mode GLeeEnabled(&_GLEE_GLX_MESA_set_3dfx_mode) -#define GLEE_GLX_SGIX_visual_select_group GLeeEnabled(&_GLEE_GLX_SGIX_visual_select_group) -#define GLEE_GLX_OML_swap_method GLeeEnabled(&_GLEE_GLX_OML_swap_method) -#define GLEE_GLX_OML_sync_control GLeeEnabled(&_GLEE_GLX_OML_sync_control) -#define GLEE_GLX_NV_float_buffer GLeeEnabled(&_GLEE_GLX_NV_float_buffer) -#define GLEE_GLX_SGIX_hyperpipe GLeeEnabled(&_GLEE_GLX_SGIX_hyperpipe) -#define GLEE_GLX_MESA_agp_offset GLeeEnabled(&_GLEE_GLX_MESA_agp_offset) -#define GLEE_GLX_EXT_fbconfig_packed_float GLeeEnabled(&_GLEE_GLX_EXT_fbconfig_packed_float) -#define GLEE_GLX_EXT_framebuffer_sRGB GLeeEnabled(&_GLEE_GLX_EXT_framebuffer_sRGB) -#define GLEE_GLX_EXT_texture_from_pixmap GLeeEnabled(&_GLEE_GLX_EXT_texture_from_pixmap) -#define GLEE_GLX_NV_present_video GLeeEnabled(&_GLEE_GLX_NV_present_video) -#define GLEE_GLX_NV_video_out GLeeEnabled(&_GLEE_GLX_NV_video_out) -#define GLEE_GLX_NV_swap_group GLeeEnabled(&_GLEE_GLX_NV_swap_group) -#define GLEE_GLX_EXT_scene_marker GLeeEnabled(&_GLEE_GLX_EXT_scene_marker) -#define GLEE_GLX_NV_video_output GLeeEnabled(&_GLEE_GLX_NV_video_output) - -/* GLX_VERSION_1_3 */ - -#ifndef GLX_VERSION_1_3 -#define GLX_VERSION_1_3 1 -#define __GLEE_GLX_VERSION_1_3 1 -/* Constants */ -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_RGBA_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_CONFIG_CAVEAT 0x20 -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_DONT_CARE 0xFFFFFFFF -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 -#define GLX_VISUAL_ID 0x800B -#define GLX_SCREEN 0x800C -#define GLX_NON_CONFORMANT_CONFIG 0x800D -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_PBUFFER_HEIGHT 0x8040 -#define GLX_PBUFFER_WIDTH 0x8041 -#ifndef GLEE_H_DEFINED_glXGetFBConfigs -#define GLEE_H_DEFINED_glXGetFBConfigs - typedef GLXFBConfig * (APIENTRYP GLEEPFNGLXGETFBCONFIGSPROC) (Display * dpy, int screen, int * nelements); - GLEE_EXTERN GLEEPFNGLXGETFBCONFIGSPROC GLeeFuncPtr_glXGetFBConfigs; - #define glXGetFBConfigs GLeeFuncPtr_glXGetFBConfigs -#endif -#ifndef GLEE_H_DEFINED_glXChooseFBConfig -#define GLEE_H_DEFINED_glXChooseFBConfig - typedef GLXFBConfig * (APIENTRYP GLEEPFNGLXCHOOSEFBCONFIGPROC) (Display * dpy, int screen, const int * attrib_list, int * nelements); - GLEE_EXTERN GLEEPFNGLXCHOOSEFBCONFIGPROC GLeeFuncPtr_glXChooseFBConfig; - #define glXChooseFBConfig GLeeFuncPtr_glXChooseFBConfig -#endif -#ifndef GLEE_H_DEFINED_glXGetFBConfigAttrib -#define GLEE_H_DEFINED_glXGetFBConfigAttrib - typedef int (APIENTRYP GLEEPFNGLXGETFBCONFIGATTRIBPROC) (Display * dpy, GLXFBConfig config, int attribute, int * value); - GLEE_EXTERN GLEEPFNGLXGETFBCONFIGATTRIBPROC GLeeFuncPtr_glXGetFBConfigAttrib; - #define glXGetFBConfigAttrib GLeeFuncPtr_glXGetFBConfigAttrib -#endif -#ifndef GLEE_H_DEFINED_glXGetVisualFromFBConfig -#define GLEE_H_DEFINED_glXGetVisualFromFBConfig - typedef XVisualInfo * (APIENTRYP GLEEPFNGLXGETVISUALFROMFBCONFIGPROC) (Display * dpy, GLXFBConfig config); - GLEE_EXTERN GLEEPFNGLXGETVISUALFROMFBCONFIGPROC GLeeFuncPtr_glXGetVisualFromFBConfig; - #define glXGetVisualFromFBConfig GLeeFuncPtr_glXGetVisualFromFBConfig -#endif -#ifndef GLEE_H_DEFINED_glXCreateWindow -#define GLEE_H_DEFINED_glXCreateWindow - typedef GLXWindow (APIENTRYP GLEEPFNGLXCREATEWINDOWPROC) (Display * dpy, GLXFBConfig config, Window win, const int * attrib_list); - GLEE_EXTERN GLEEPFNGLXCREATEWINDOWPROC GLeeFuncPtr_glXCreateWindow; - #define glXCreateWindow GLeeFuncPtr_glXCreateWindow -#endif -#ifndef GLEE_H_DEFINED_glXDestroyWindow -#define GLEE_H_DEFINED_glXDestroyWindow - typedef void (APIENTRYP GLEEPFNGLXDESTROYWINDOWPROC) (Display * dpy, GLXWindow win); - GLEE_EXTERN GLEEPFNGLXDESTROYWINDOWPROC GLeeFuncPtr_glXDestroyWindow; - #define glXDestroyWindow GLeeFuncPtr_glXDestroyWindow -#endif -#ifndef GLEE_H_DEFINED_glXCreatePixmap -#define GLEE_H_DEFINED_glXCreatePixmap - typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEPIXMAPPROC) (Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list); - GLEE_EXTERN GLEEPFNGLXCREATEPIXMAPPROC GLeeFuncPtr_glXCreatePixmap; - #define glXCreatePixmap GLeeFuncPtr_glXCreatePixmap -#endif -#ifndef GLEE_H_DEFINED_glXDestroyPixmap -#define GLEE_H_DEFINED_glXDestroyPixmap - typedef void (APIENTRYP GLEEPFNGLXDESTROYPIXMAPPROC) (Display * dpy, GLXPixmap pixmap); - GLEE_EXTERN GLEEPFNGLXDESTROYPIXMAPPROC GLeeFuncPtr_glXDestroyPixmap; - #define glXDestroyPixmap GLeeFuncPtr_glXDestroyPixmap -#endif -#ifndef GLEE_H_DEFINED_glXCreatePbuffer -#define GLEE_H_DEFINED_glXCreatePbuffer - typedef GLXPbuffer (APIENTRYP GLEEPFNGLXCREATEPBUFFERPROC) (Display * dpy, GLXFBConfig config, const int * attrib_list); - GLEE_EXTERN GLEEPFNGLXCREATEPBUFFERPROC GLeeFuncPtr_glXCreatePbuffer; - #define glXCreatePbuffer GLeeFuncPtr_glXCreatePbuffer -#endif -#ifndef GLEE_H_DEFINED_glXDestroyPbuffer -#define GLEE_H_DEFINED_glXDestroyPbuffer - typedef void (APIENTRYP GLEEPFNGLXDESTROYPBUFFERPROC) (Display * dpy, GLXPbuffer pbuf); - GLEE_EXTERN GLEEPFNGLXDESTROYPBUFFERPROC GLeeFuncPtr_glXDestroyPbuffer; - #define glXDestroyPbuffer GLeeFuncPtr_glXDestroyPbuffer -#endif -#ifndef GLEE_H_DEFINED_glXQueryDrawable -#define GLEE_H_DEFINED_glXQueryDrawable - typedef void (APIENTRYP GLEEPFNGLXQUERYDRAWABLEPROC) (Display * dpy, GLXDrawable draw, int attribute, unsigned int * value); - GLEE_EXTERN GLEEPFNGLXQUERYDRAWABLEPROC GLeeFuncPtr_glXQueryDrawable; - #define glXQueryDrawable GLeeFuncPtr_glXQueryDrawable -#endif -#ifndef GLEE_H_DEFINED_glXCreateNewContext -#define GLEE_H_DEFINED_glXCreateNewContext - typedef GLXContext (APIENTRYP GLEEPFNGLXCREATENEWCONTEXTPROC) (Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); - GLEE_EXTERN GLEEPFNGLXCREATENEWCONTEXTPROC GLeeFuncPtr_glXCreateNewContext; - #define glXCreateNewContext GLeeFuncPtr_glXCreateNewContext -#endif -#ifndef GLEE_H_DEFINED_glXMakeContextCurrent -#define GLEE_H_DEFINED_glXMakeContextCurrent - typedef Bool (APIENTRYP GLEEPFNGLXMAKECONTEXTCURRENTPROC) (Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); - GLEE_EXTERN GLEEPFNGLXMAKECONTEXTCURRENTPROC GLeeFuncPtr_glXMakeContextCurrent; - #define glXMakeContextCurrent GLeeFuncPtr_glXMakeContextCurrent -#endif -#ifndef GLEE_H_DEFINED_glXGetCurrentReadDrawable -#define GLEE_H_DEFINED_glXGetCurrentReadDrawable - typedef GLXDrawable (APIENTRYP GLEEPFNGLXGETCURRENTREADDRAWABLEPROC) (); - GLEE_EXTERN GLEEPFNGLXGETCURRENTREADDRAWABLEPROC GLeeFuncPtr_glXGetCurrentReadDrawable; - #define glXGetCurrentReadDrawable GLeeFuncPtr_glXGetCurrentReadDrawable -#endif -#ifndef GLEE_H_DEFINED_glXGetCurrentDisplay -#define GLEE_H_DEFINED_glXGetCurrentDisplay - typedef Display * (APIENTRYP GLEEPFNGLXGETCURRENTDISPLAYPROC) (); - GLEE_EXTERN GLEEPFNGLXGETCURRENTDISPLAYPROC GLeeFuncPtr_glXGetCurrentDisplay; - #define glXGetCurrentDisplay GLeeFuncPtr_glXGetCurrentDisplay -#endif -#ifndef GLEE_H_DEFINED_glXQueryContext -#define GLEE_H_DEFINED_glXQueryContext - typedef int (APIENTRYP GLEEPFNGLXQUERYCONTEXTPROC) (Display * dpy, GLXContext ctx, int attribute, int * value); - GLEE_EXTERN GLEEPFNGLXQUERYCONTEXTPROC GLeeFuncPtr_glXQueryContext; - #define glXQueryContext GLeeFuncPtr_glXQueryContext -#endif -#ifndef GLEE_H_DEFINED_glXSelectEvent -#define GLEE_H_DEFINED_glXSelectEvent - typedef void (APIENTRYP GLEEPFNGLXSELECTEVENTPROC) (Display * dpy, GLXDrawable draw, unsigned long event_mask); - GLEE_EXTERN GLEEPFNGLXSELECTEVENTPROC GLeeFuncPtr_glXSelectEvent; - #define glXSelectEvent GLeeFuncPtr_glXSelectEvent -#endif -#ifndef GLEE_H_DEFINED_glXGetSelectedEvent -#define GLEE_H_DEFINED_glXGetSelectedEvent - typedef void (APIENTRYP GLEEPFNGLXGETSELECTEDEVENTPROC) (Display * dpy, GLXDrawable draw, unsigned long * event_mask); - GLEE_EXTERN GLEEPFNGLXGETSELECTEDEVENTPROC GLeeFuncPtr_glXGetSelectedEvent; - #define glXGetSelectedEvent GLeeFuncPtr_glXGetSelectedEvent -#endif -#endif - -/* GLX_VERSION_1_4 */ - -#ifndef GLX_VERSION_1_4 -#define GLX_VERSION_1_4 1 -#define __GLEE_GLX_VERSION_1_4 1 -/* Constants */ -#define GLX_SAMPLE_BUFFERS 100000 -#define GLX_SAMPLES 100001 -#ifndef GLEE_H_DEFINED_glXGetProcAddress -#define GLEE_H_DEFINED_glXGetProcAddress - typedef __GLXextFuncPtr (APIENTRYP GLEEPFNGLXGETPROCADDRESSPROC) (const GLubyte * procName); - GLEE_EXTERN GLEEPFNGLXGETPROCADDRESSPROC GLeeFuncPtr_glXGetProcAddress; - #define glXGetProcAddress GLeeFuncPtr_glXGetProcAddress -#endif -#endif - -/* GLX_ARB_multisample */ - -#ifndef GLX_ARB_multisample -#define GLX_ARB_multisample 1 -#define __GLEE_GLX_ARB_multisample 1 -/* Constants */ -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 -#endif - -/* GLX_ARB_fbconfig_float */ - -#ifndef GLX_ARB_fbconfig_float -#define GLX_ARB_fbconfig_float 1 -#define __GLEE_GLX_ARB_fbconfig_float 1 -/* Constants */ -#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 -#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 -#endif - -/* GLX_ARB_create_context */ - -#ifndef GLX_ARB_create_context -#define GLX_ARB_create_context 1 -#define __GLEE_GLX_ARB_create_context 1 -/* Constants */ -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 -#ifndef GLEE_H_DEFINED_glXCreateContextAttribsARB -#define GLEE_H_DEFINED_glXCreateContextAttribsARB - typedef GLXContext (APIENTRYP GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC) (Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list); - GLEE_EXTERN GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_glXCreateContextAttribsARB; - #define glXCreateContextAttribsARB GLeeFuncPtr_glXCreateContextAttribsARB -#endif -#endif - -/* GLX_SGIS_multisample */ - -#ifndef GLX_SGIS_multisample -#define GLX_SGIS_multisample 1 -#define __GLEE_GLX_SGIS_multisample 1 -/* Constants */ -#define GLX_SAMPLE_BUFFERS_SGIS 100000 -#define GLX_SAMPLES_SGIS 100001 -#endif - -/* GLX_EXT_visual_info */ - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info 1 -#define __GLEE_GLX_EXT_visual_info 1 -/* Constants */ -#define GLX_X_VISUAL_TYPE_EXT 0x22 -#define GLX_TRANSPARENT_TYPE_EXT 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 -#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 -#define GLX_NONE_EXT 0x8000 -#define GLX_TRUE_COLOR_EXT 0x8002 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#define GLX_PSEUDO_COLOR_EXT 0x8004 -#define GLX_STATIC_COLOR_EXT 0x8005 -#define GLX_GRAY_SCALE_EXT 0x8006 -#define GLX_STATIC_GRAY_EXT 0x8007 -#define GLX_TRANSPARENT_RGB_EXT 0x8008 -#define GLX_TRANSPARENT_INDEX_EXT 0x8009 -#endif - -/* GLX_SGI_swap_control */ - -#ifndef GLX_SGI_swap_control -#define GLX_SGI_swap_control 1 -#define __GLEE_GLX_SGI_swap_control 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXSwapIntervalSGI -#define GLEE_H_DEFINED_glXSwapIntervalSGI - typedef int (APIENTRYP GLEEPFNGLXSWAPINTERVALSGIPROC) (int interval); - GLEE_EXTERN GLEEPFNGLXSWAPINTERVALSGIPROC GLeeFuncPtr_glXSwapIntervalSGI; - #define glXSwapIntervalSGI GLeeFuncPtr_glXSwapIntervalSGI -#endif -#endif - -/* GLX_SGI_video_sync */ - -#ifndef GLX_SGI_video_sync -#define GLX_SGI_video_sync 1 -#define __GLEE_GLX_SGI_video_sync 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXGetVideoSyncSGI -#define GLEE_H_DEFINED_glXGetVideoSyncSGI - typedef int (APIENTRYP GLEEPFNGLXGETVIDEOSYNCSGIPROC) (unsigned int * count); - GLEE_EXTERN GLEEPFNGLXGETVIDEOSYNCSGIPROC GLeeFuncPtr_glXGetVideoSyncSGI; - #define glXGetVideoSyncSGI GLeeFuncPtr_glXGetVideoSyncSGI -#endif -#ifndef GLEE_H_DEFINED_glXWaitVideoSyncSGI -#define GLEE_H_DEFINED_glXWaitVideoSyncSGI - typedef int (APIENTRYP GLEEPFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int * count); - GLEE_EXTERN GLEEPFNGLXWAITVIDEOSYNCSGIPROC GLeeFuncPtr_glXWaitVideoSyncSGI; - #define glXWaitVideoSyncSGI GLeeFuncPtr_glXWaitVideoSyncSGI -#endif -#endif - -/* GLX_SGI_make_current_read */ - -#ifndef GLX_SGI_make_current_read -#define GLX_SGI_make_current_read 1 -#define __GLEE_GLX_SGI_make_current_read 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXMakeCurrentReadSGI -#define GLEE_H_DEFINED_glXMakeCurrentReadSGI - typedef Bool (APIENTRYP GLEEPFNGLXMAKECURRENTREADSGIPROC) (Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); - GLEE_EXTERN GLEEPFNGLXMAKECURRENTREADSGIPROC GLeeFuncPtr_glXMakeCurrentReadSGI; - #define glXMakeCurrentReadSGI GLeeFuncPtr_glXMakeCurrentReadSGI -#endif -#ifndef GLEE_H_DEFINED_glXGetCurrentReadDrawableSGI -#define GLEE_H_DEFINED_glXGetCurrentReadDrawableSGI - typedef GLXDrawable (APIENTRYP GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC) (); - GLEE_EXTERN GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC GLeeFuncPtr_glXGetCurrentReadDrawableSGI; - #define glXGetCurrentReadDrawableSGI GLeeFuncPtr_glXGetCurrentReadDrawableSGI -#endif -#endif - -/* GLX_EXT_visual_rating */ - -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating 1 -#define __GLEE_GLX_EXT_visual_rating 1 -/* Constants */ -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D -#endif - -/* GLX_EXT_import_context */ - -#ifndef GLX_EXT_import_context -#define GLX_EXT_import_context 1 -#define __GLEE_GLX_EXT_import_context 1 -/* Constants */ -#define GLX_SHARE_CONTEXT_EXT 0x800A -#define GLX_VISUAL_ID_EXT 0x800B -#define GLX_SCREEN_EXT 0x800C -#ifndef GLEE_H_DEFINED_glXGetCurrentDisplayEXT -#define GLEE_H_DEFINED_glXGetCurrentDisplayEXT - typedef Display * (APIENTRYP GLEEPFNGLXGETCURRENTDISPLAYEXTPROC) (); - GLEE_EXTERN GLEEPFNGLXGETCURRENTDISPLAYEXTPROC GLeeFuncPtr_glXGetCurrentDisplayEXT; - #define glXGetCurrentDisplayEXT GLeeFuncPtr_glXGetCurrentDisplayEXT -#endif -#ifndef GLEE_H_DEFINED_glXQueryContextInfoEXT -#define GLEE_H_DEFINED_glXQueryContextInfoEXT - typedef int (APIENTRYP GLEEPFNGLXQUERYCONTEXTINFOEXTPROC) (Display * dpy, GLXContext context, int attribute, int * value); - GLEE_EXTERN GLEEPFNGLXQUERYCONTEXTINFOEXTPROC GLeeFuncPtr_glXQueryContextInfoEXT; - #define glXQueryContextInfoEXT GLeeFuncPtr_glXQueryContextInfoEXT -#endif -#ifndef GLEE_H_DEFINED_glXGetContextIDEXT -#define GLEE_H_DEFINED_glXGetContextIDEXT - typedef GLXContextID (APIENTRYP GLEEPFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); - GLEE_EXTERN GLEEPFNGLXGETCONTEXTIDEXTPROC GLeeFuncPtr_glXGetContextIDEXT; - #define glXGetContextIDEXT GLeeFuncPtr_glXGetContextIDEXT -#endif -#ifndef GLEE_H_DEFINED_glXImportContextEXT -#define GLEE_H_DEFINED_glXImportContextEXT - typedef GLXContext (APIENTRYP GLEEPFNGLXIMPORTCONTEXTEXTPROC) (Display * dpy, GLXContextID contextID); - GLEE_EXTERN GLEEPFNGLXIMPORTCONTEXTEXTPROC GLeeFuncPtr_glXImportContextEXT; - #define glXImportContextEXT GLeeFuncPtr_glXImportContextEXT -#endif -#ifndef GLEE_H_DEFINED_glXFreeContextEXT -#define GLEE_H_DEFINED_glXFreeContextEXT - typedef void (APIENTRYP GLEEPFNGLXFREECONTEXTEXTPROC) (Display * dpy, GLXContext context); - GLEE_EXTERN GLEEPFNGLXFREECONTEXTEXTPROC GLeeFuncPtr_glXFreeContextEXT; - #define glXFreeContextEXT GLeeFuncPtr_glXFreeContextEXT -#endif -#endif - -/* GLX_SGIX_fbconfig */ - -#ifndef GLX_SGIX_fbconfig -#define GLX_SGIX_fbconfig 1 -#define __GLEE_GLX_SGIX_fbconfig 1 -/* Constants */ -#define GLX_WINDOW_BIT_SGIX 0x00000001 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 -#define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 -#define GLX_DRAWABLE_TYPE_SGIX 0x8010 -#define GLX_RENDER_TYPE_SGIX 0x8011 -#define GLX_X_RENDERABLE_SGIX 0x8012 -#define GLX_FBCONFIG_ID_SGIX 0x8013 -#define GLX_RGBA_TYPE_SGIX 0x8014 -#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 -#ifndef GLEE_H_DEFINED_glXGetFBConfigAttribSGIX -#define GLEE_H_DEFINED_glXGetFBConfigAttribSGIX - typedef int (APIENTRYP GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, int attribute, int * value); - GLEE_EXTERN GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC GLeeFuncPtr_glXGetFBConfigAttribSGIX; - #define glXGetFBConfigAttribSGIX GLeeFuncPtr_glXGetFBConfigAttribSGIX -#endif -#ifndef GLEE_H_DEFINED_glXChooseFBConfigSGIX -#define GLEE_H_DEFINED_glXChooseFBConfigSGIX - typedef GLXFBConfigSGIX * (APIENTRYP GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC) (Display * dpy, int screen, int * attrib_list, int * nelements); - GLEE_EXTERN GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC GLeeFuncPtr_glXChooseFBConfigSGIX; - #define glXChooseFBConfigSGIX GLeeFuncPtr_glXChooseFBConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXCreateGLXPixmapWithConfigSGIX -#define GLEE_H_DEFINED_glXCreateGLXPixmapWithConfigSGIX - typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap); - GLEE_EXTERN GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX; - #define glXCreateGLXPixmapWithConfigSGIX GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXCreateContextWithConfigSGIX -#define GLEE_H_DEFINED_glXCreateContextWithConfigSGIX - typedef GLXContext (APIENTRYP GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); - GLEE_EXTERN GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateContextWithConfigSGIX; - #define glXCreateContextWithConfigSGIX GLeeFuncPtr_glXCreateContextWithConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXGetVisualFromFBConfigSGIX -#define GLEE_H_DEFINED_glXGetVisualFromFBConfigSGIX - typedef XVisualInfo * (APIENTRYP GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config); - GLEE_EXTERN GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLeeFuncPtr_glXGetVisualFromFBConfigSGIX; - #define glXGetVisualFromFBConfigSGIX GLeeFuncPtr_glXGetVisualFromFBConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXGetFBConfigFromVisualSGIX -#define GLEE_H_DEFINED_glXGetFBConfigFromVisualSGIX - typedef GLXFBConfigSGIX (APIENTRYP GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display * dpy, XVisualInfo * vis); - GLEE_EXTERN GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLeeFuncPtr_glXGetFBConfigFromVisualSGIX; - #define glXGetFBConfigFromVisualSGIX GLeeFuncPtr_glXGetFBConfigFromVisualSGIX -#endif -#endif - -/* GLX_SGIX_pbuffer */ - -#ifndef GLX_SGIX_pbuffer -#define GLX_SGIX_pbuffer 1 -#define __GLEE_GLX_SGIX_pbuffer 1 -/* Constants */ -#define GLX_PBUFFER_BIT_SGIX 0x00000004 -#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 -#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 -#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 -#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 -#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 -#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 -#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 -#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 -#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 -#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 -#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A -#define GLX_PRESERVED_CONTENTS_SGIX 0x801B -#define GLX_LARGEST_PBUFFER_SGIX 0x801C -#define GLX_WIDTH_SGIX 0x801D -#define GLX_HEIGHT_SGIX 0x801E -#define GLX_EVENT_MASK_SGIX 0x801F -#define GLX_DAMAGED_SGIX 0x8020 -#define GLX_SAVED_SGIX 0x8021 -#define GLX_WINDOW_SGIX 0x8022 -#define GLX_PBUFFER_SGIX 0x8023 -#ifndef GLEE_H_DEFINED_glXCreateGLXPbufferSGIX -#define GLEE_H_DEFINED_glXCreateGLXPbufferSGIX - typedef GLXPbufferSGIX (APIENTRYP GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list); - GLEE_EXTERN GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC GLeeFuncPtr_glXCreateGLXPbufferSGIX; - #define glXCreateGLXPbufferSGIX GLeeFuncPtr_glXCreateGLXPbufferSGIX -#endif -#ifndef GLEE_H_DEFINED_glXDestroyGLXPbufferSGIX -#define GLEE_H_DEFINED_glXDestroyGLXPbufferSGIX - typedef void (APIENTRYP GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display * dpy, GLXPbufferSGIX pbuf); - GLEE_EXTERN GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXDestroyGLXPbufferSGIX; - #define glXDestroyGLXPbufferSGIX GLeeFuncPtr_glXDestroyGLXPbufferSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryGLXPbufferSGIX -#define GLEE_H_DEFINED_glXQueryGLXPbufferSGIX - typedef int (APIENTRYP GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC) (Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value); - GLEE_EXTERN GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXQueryGLXPbufferSGIX; - #define glXQueryGLXPbufferSGIX GLeeFuncPtr_glXQueryGLXPbufferSGIX -#endif -#ifndef GLEE_H_DEFINED_glXSelectEventSGIX -#define GLEE_H_DEFINED_glXSelectEventSGIX - typedef void (APIENTRYP GLEEPFNGLXSELECTEVENTSGIXPROC) (Display * dpy, GLXDrawable drawable, unsigned long mask); - GLEE_EXTERN GLEEPFNGLXSELECTEVENTSGIXPROC GLeeFuncPtr_glXSelectEventSGIX; - #define glXSelectEventSGIX GLeeFuncPtr_glXSelectEventSGIX -#endif -#ifndef GLEE_H_DEFINED_glXGetSelectedEventSGIX -#define GLEE_H_DEFINED_glXGetSelectedEventSGIX - typedef void (APIENTRYP GLEEPFNGLXGETSELECTEDEVENTSGIXPROC) (Display * dpy, GLXDrawable drawable, unsigned long * mask); - GLEE_EXTERN GLEEPFNGLXGETSELECTEDEVENTSGIXPROC GLeeFuncPtr_glXGetSelectedEventSGIX; - #define glXGetSelectedEventSGIX GLeeFuncPtr_glXGetSelectedEventSGIX -#endif -#endif - -/* GLX_SGI_cushion */ - -#ifndef GLX_SGI_cushion -#define GLX_SGI_cushion 1 -#define __GLEE_GLX_SGI_cushion 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXCushionSGI -#define GLEE_H_DEFINED_glXCushionSGI - typedef void (APIENTRYP GLEEPFNGLXCUSHIONSGIPROC) (Display * dpy, Window window, float cushion); - GLEE_EXTERN GLEEPFNGLXCUSHIONSGIPROC GLeeFuncPtr_glXCushionSGI; - #define glXCushionSGI GLeeFuncPtr_glXCushionSGI -#endif -#endif - -/* GLX_SGIX_video_resize */ - -#ifndef GLX_SGIX_video_resize -#define GLX_SGIX_video_resize 1 -#define __GLEE_GLX_SGIX_video_resize 1 -/* Constants */ -#define GLX_SYNC_FRAME_SGIX 0x00000000 -#define GLX_SYNC_SWAP_SGIX 0x00000001 -#ifndef GLEE_H_DEFINED_glXBindChannelToWindowSGIX -#define GLEE_H_DEFINED_glXBindChannelToWindowSGIX - typedef int (APIENTRYP GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display * display, int screen, int channel, Window window); - GLEE_EXTERN GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC GLeeFuncPtr_glXBindChannelToWindowSGIX; - #define glXBindChannelToWindowSGIX GLeeFuncPtr_glXBindChannelToWindowSGIX -#endif -#ifndef GLEE_H_DEFINED_glXChannelRectSGIX -#define GLEE_H_DEFINED_glXChannelRectSGIX - typedef int (APIENTRYP GLEEPFNGLXCHANNELRECTSGIXPROC) (Display * display, int screen, int channel, int x, int y, int w, int h); - GLEE_EXTERN GLEEPFNGLXCHANNELRECTSGIXPROC GLeeFuncPtr_glXChannelRectSGIX; - #define glXChannelRectSGIX GLeeFuncPtr_glXChannelRectSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryChannelRectSGIX -#define GLEE_H_DEFINED_glXQueryChannelRectSGIX - typedef int (APIENTRYP GLEEPFNGLXQUERYCHANNELRECTSGIXPROC) (Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh); - GLEE_EXTERN GLEEPFNGLXQUERYCHANNELRECTSGIXPROC GLeeFuncPtr_glXQueryChannelRectSGIX; - #define glXQueryChannelRectSGIX GLeeFuncPtr_glXQueryChannelRectSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryChannelDeltasSGIX -#define GLEE_H_DEFINED_glXQueryChannelDeltasSGIX - typedef int (APIENTRYP GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC) (Display * display, int screen, int channel, int * x, int * y, int * w, int * h); - GLEE_EXTERN GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC GLeeFuncPtr_glXQueryChannelDeltasSGIX; - #define glXQueryChannelDeltasSGIX GLeeFuncPtr_glXQueryChannelDeltasSGIX -#endif -#ifndef GLEE_H_DEFINED_glXChannelRectSyncSGIX -#define GLEE_H_DEFINED_glXChannelRectSyncSGIX - typedef int (APIENTRYP GLEEPFNGLXCHANNELRECTSYNCSGIXPROC) (Display * display, int screen, int channel, GLenum synctype); - GLEE_EXTERN GLEEPFNGLXCHANNELRECTSYNCSGIXPROC GLeeFuncPtr_glXChannelRectSyncSGIX; - #define glXChannelRectSyncSGIX GLeeFuncPtr_glXChannelRectSyncSGIX -#endif -#endif - -/* GLX_SGIX_swap_group */ - -#ifndef GLX_SGIX_swap_group -#define GLX_SGIX_swap_group 1 -#define __GLEE_GLX_SGIX_swap_group 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXJoinSwapGroupSGIX -#define GLEE_H_DEFINED_glXJoinSwapGroupSGIX - typedef void (APIENTRYP GLEEPFNGLXJOINSWAPGROUPSGIXPROC) (Display * dpy, GLXDrawable drawable, GLXDrawable member); - GLEE_EXTERN GLEEPFNGLXJOINSWAPGROUPSGIXPROC GLeeFuncPtr_glXJoinSwapGroupSGIX; - #define glXJoinSwapGroupSGIX GLeeFuncPtr_glXJoinSwapGroupSGIX -#endif -#endif - -/* GLX_SGIX_swap_barrier */ - -#ifndef GLX_SGIX_swap_barrier -#define GLX_SGIX_swap_barrier 1 -#define __GLEE_GLX_SGIX_swap_barrier 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXBindSwapBarrierSGIX -#define GLEE_H_DEFINED_glXBindSwapBarrierSGIX - typedef void (APIENTRYP GLEEPFNGLXBINDSWAPBARRIERSGIXPROC) (Display * dpy, GLXDrawable drawable, int barrier); - GLEE_EXTERN GLEEPFNGLXBINDSWAPBARRIERSGIXPROC GLeeFuncPtr_glXBindSwapBarrierSGIX; - #define glXBindSwapBarrierSGIX GLeeFuncPtr_glXBindSwapBarrierSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryMaxSwapBarriersSGIX -#define GLEE_H_DEFINED_glXQueryMaxSwapBarriersSGIX - typedef Bool (APIENTRYP GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display * dpy, int screen, int * max); - GLEE_EXTERN GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX; - #define glXQueryMaxSwapBarriersSGIX GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX -#endif -#endif - -/* GLX_SGIS_blended_overlay */ - -#ifndef GLX_SGIS_blended_overlay -#define GLX_SGIS_blended_overlay 1 -#define __GLEE_GLX_SGIS_blended_overlay 1 -/* Constants */ -#define GLX_BLENDED_RGBA_SGIS 0x8025 -#endif - -/* GLX_SGIS_shared_multisample */ - -#ifndef GLX_SGIS_shared_multisample -#define GLX_SGIS_shared_multisample 1 -#define __GLEE_GLX_SGIS_shared_multisample 1 -/* Constants */ -#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 -#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 -#endif - -/* GLX_SUN_get_transparent_index */ - -#ifndef GLX_SUN_get_transparent_index -#define GLX_SUN_get_transparent_index 1 -#define __GLEE_GLX_SUN_get_transparent_index 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXGetTransparentIndexSUN -#define GLEE_H_DEFINED_glXGetTransparentIndexSUN - typedef Status (APIENTRYP GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC) (Display * dpy, Window overlay, Window underlay, long * pTransparentIndex); - GLEE_EXTERN GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC GLeeFuncPtr_glXGetTransparentIndexSUN; - #define glXGetTransparentIndexSUN GLeeFuncPtr_glXGetTransparentIndexSUN -#endif -#endif - -/* GLX_3DFX_multisample */ - -#ifndef GLX_3DFX_multisample -#define GLX_3DFX_multisample 1 -#define __GLEE_GLX_3DFX_multisample 1 -/* Constants */ -#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 -#define GLX_SAMPLES_3DFX 0x8051 -#endif - -/* GLX_MESA_copy_sub_buffer */ - -#ifndef GLX_MESA_copy_sub_buffer -#define GLX_MESA_copy_sub_buffer 1 -#define __GLEE_GLX_MESA_copy_sub_buffer 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXCopySubBufferMESA -#define GLEE_H_DEFINED_glXCopySubBufferMESA - typedef void (APIENTRYP GLEEPFNGLXCOPYSUBBUFFERMESAPROC) (Display * dpy, GLXDrawable drawable, int x, int y, int width, int height); - GLEE_EXTERN GLEEPFNGLXCOPYSUBBUFFERMESAPROC GLeeFuncPtr_glXCopySubBufferMESA; - #define glXCopySubBufferMESA GLeeFuncPtr_glXCopySubBufferMESA -#endif -#endif - -/* GLX_MESA_pixmap_colormap */ - -#ifndef GLX_MESA_pixmap_colormap -#define GLX_MESA_pixmap_colormap 1 -#define __GLEE_GLX_MESA_pixmap_colormap 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXCreateGLXPixmapMESA -#define GLEE_H_DEFINED_glXCreateGLXPixmapMESA - typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEGLXPIXMAPMESAPROC) (Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap); - GLEE_EXTERN GLEEPFNGLXCREATEGLXPIXMAPMESAPROC GLeeFuncPtr_glXCreateGLXPixmapMESA; - #define glXCreateGLXPixmapMESA GLeeFuncPtr_glXCreateGLXPixmapMESA -#endif -#endif - -/* GLX_MESA_release_buffers */ - -#ifndef GLX_MESA_release_buffers -#define GLX_MESA_release_buffers 1 -#define __GLEE_GLX_MESA_release_buffers 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXReleaseBuffersMESA -#define GLEE_H_DEFINED_glXReleaseBuffersMESA - typedef Bool (APIENTRYP GLEEPFNGLXRELEASEBUFFERSMESAPROC) (Display * dpy, GLXDrawable drawable); - GLEE_EXTERN GLEEPFNGLXRELEASEBUFFERSMESAPROC GLeeFuncPtr_glXReleaseBuffersMESA; - #define glXReleaseBuffersMESA GLeeFuncPtr_glXReleaseBuffersMESA -#endif -#endif - -/* GLX_MESA_set_3dfx_mode */ - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_MESA_set_3dfx_mode 1 -#define __GLEE_GLX_MESA_set_3dfx_mode 1 -/* Constants */ -#define GLX_3DFX_WINDOW_MODE_MESA 0x1 -#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 -#ifndef GLEE_H_DEFINED_glXSet3DfxModeMESA -#define GLEE_H_DEFINED_glXSet3DfxModeMESA - typedef Bool (APIENTRYP GLEEPFNGLXSET3DFXMODEMESAPROC) (int mode); - GLEE_EXTERN GLEEPFNGLXSET3DFXMODEMESAPROC GLeeFuncPtr_glXSet3DfxModeMESA; - #define glXSet3DfxModeMESA GLeeFuncPtr_glXSet3DfxModeMESA -#endif -#endif - -/* GLX_SGIX_visual_select_group */ - -#ifndef GLX_SGIX_visual_select_group -#define GLX_SGIX_visual_select_group 1 -#define __GLEE_GLX_SGIX_visual_select_group 1 -/* Constants */ -#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 -#endif - -/* GLX_OML_swap_method */ - -#ifndef GLX_OML_swap_method -#define GLX_OML_swap_method 1 -#define __GLEE_GLX_OML_swap_method 1 -/* Constants */ -#define GLX_SWAP_METHOD_OML 0x8060 -#define GLX_SWAP_EXCHANGE_OML 0x8061 -#define GLX_SWAP_COPY_OML 0x8062 -#define GLX_SWAP_UNDEFINED_OML 0x8063 -#endif - -/* GLX_OML_sync_control */ - -#ifndef GLX_OML_sync_control -#define GLX_OML_sync_control 1 -#define __GLEE_GLX_OML_sync_control 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXGetSyncValuesOML -#define GLEE_H_DEFINED_glXGetSyncValuesOML - typedef Bool (APIENTRYP GLEEPFNGLXGETSYNCVALUESOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc); - GLEE_EXTERN GLEEPFNGLXGETSYNCVALUESOMLPROC GLeeFuncPtr_glXGetSyncValuesOML; - #define glXGetSyncValuesOML GLeeFuncPtr_glXGetSyncValuesOML -#endif -#ifndef GLEE_H_DEFINED_glXGetMscRateOML -#define GLEE_H_DEFINED_glXGetMscRateOML - typedef Bool (APIENTRYP GLEEPFNGLXGETMSCRATEOMLPROC) (Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator); - GLEE_EXTERN GLEEPFNGLXGETMSCRATEOMLPROC GLeeFuncPtr_glXGetMscRateOML; - #define glXGetMscRateOML GLeeFuncPtr_glXGetMscRateOML -#endif -#ifndef GLEE_H_DEFINED_glXSwapBuffersMscOML -#define GLEE_H_DEFINED_glXSwapBuffersMscOML - typedef int64_t (APIENTRYP GLEEPFNGLXSWAPBUFFERSMSCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); - GLEE_EXTERN GLEEPFNGLXSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_glXSwapBuffersMscOML; - #define glXSwapBuffersMscOML GLeeFuncPtr_glXSwapBuffersMscOML -#endif -#ifndef GLEE_H_DEFINED_glXWaitForMscOML -#define GLEE_H_DEFINED_glXWaitForMscOML - typedef Bool (APIENTRYP GLEEPFNGLXWAITFORMSCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * ust, int64_t * msc, int64_t * sbc); - GLEE_EXTERN GLEEPFNGLXWAITFORMSCOMLPROC GLeeFuncPtr_glXWaitForMscOML; - #define glXWaitForMscOML GLeeFuncPtr_glXWaitForMscOML -#endif -#ifndef GLEE_H_DEFINED_glXWaitForSbcOML -#define GLEE_H_DEFINED_glXWaitForSbcOML - typedef Bool (APIENTRYP GLEEPFNGLXWAITFORSBCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc); - GLEE_EXTERN GLEEPFNGLXWAITFORSBCOMLPROC GLeeFuncPtr_glXWaitForSbcOML; - #define glXWaitForSbcOML GLeeFuncPtr_glXWaitForSbcOML -#endif -#endif - -/* GLX_NV_float_buffer */ - -#ifndef GLX_NV_float_buffer -#define GLX_NV_float_buffer 1 -#define __GLEE_GLX_NV_float_buffer 1 -/* Constants */ -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 -#endif - -/* GLX_SGIX_hyperpipe */ - -#ifndef GLX_SGIX_hyperpipe -#define GLX_SGIX_hyperpipe 1 -#define __GLEE_GLX_SGIX_hyperpipe 1 -/* Constants */ -#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 -#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 -#define GLX_BAD_HYPERPIPE_SGIX 92 -#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 -#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 -#define GLX_PIPE_RECT_SGIX 0x00000001 -#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 -#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 -#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 -#define GLX_HYPERPIPE_ID_SGIX 0x8030 -#ifndef GLEE_H_DEFINED_glXQueryHyperpipeNetworkSGIX -#define GLEE_H_DEFINED_glXQueryHyperpipeNetworkSGIX - typedef GLXHyperpipeNetworkSGIX * (APIENTRYP GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display * dpy, int * npipes); - GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX; - #define glXQueryHyperpipeNetworkSGIX GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX -#endif -#ifndef GLEE_H_DEFINED_glXHyperpipeConfigSGIX -#define GLEE_H_DEFINED_glXHyperpipeConfigSGIX - typedef int (APIENTRYP GLEEPFNGLXHYPERPIPECONFIGSGIXPROC) (Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId); - GLEE_EXTERN GLEEPFNGLXHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXHyperpipeConfigSGIX; - #define glXHyperpipeConfigSGIX GLeeFuncPtr_glXHyperpipeConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryHyperpipeConfigSGIX -#define GLEE_H_DEFINED_glXQueryHyperpipeConfigSGIX - typedef GLXHyperpipeConfigSGIX * (APIENTRYP GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display * dpy, int hpId, int * npipes); - GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXQueryHyperpipeConfigSGIX; - #define glXQueryHyperpipeConfigSGIX GLeeFuncPtr_glXQueryHyperpipeConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXDestroyHyperpipeConfigSGIX -#define GLEE_H_DEFINED_glXDestroyHyperpipeConfigSGIX - typedef int (APIENTRYP GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display * dpy, int hpId); - GLEE_EXTERN GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX; - #define glXDestroyHyperpipeConfigSGIX GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX -#endif -#ifndef GLEE_H_DEFINED_glXBindHyperpipeSGIX -#define GLEE_H_DEFINED_glXBindHyperpipeSGIX - typedef int (APIENTRYP GLEEPFNGLXBINDHYPERPIPESGIXPROC) (Display * dpy, int hpId); - GLEE_EXTERN GLEEPFNGLXBINDHYPERPIPESGIXPROC GLeeFuncPtr_glXBindHyperpipeSGIX; - #define glXBindHyperpipeSGIX GLeeFuncPtr_glXBindHyperpipeSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryHyperpipeBestAttribSGIX -#define GLEE_H_DEFINED_glXQueryHyperpipeBestAttribSGIX - typedef int (APIENTRYP GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList); - GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX; - #define glXQueryHyperpipeBestAttribSGIX GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX -#endif -#ifndef GLEE_H_DEFINED_glXHyperpipeAttribSGIX -#define GLEE_H_DEFINED_glXHyperpipeAttribSGIX - typedef int (APIENTRYP GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * attribList); - GLEE_EXTERN GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXHyperpipeAttribSGIX; - #define glXHyperpipeAttribSGIX GLeeFuncPtr_glXHyperpipeAttribSGIX -#endif -#ifndef GLEE_H_DEFINED_glXQueryHyperpipeAttribSGIX -#define GLEE_H_DEFINED_glXQueryHyperpipeAttribSGIX - typedef int (APIENTRYP GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList); - GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeAttribSGIX; - #define glXQueryHyperpipeAttribSGIX GLeeFuncPtr_glXQueryHyperpipeAttribSGIX -#endif -#endif - -/* GLX_MESA_agp_offset */ - -#ifndef GLX_MESA_agp_offset -#define GLX_MESA_agp_offset 1 -#define __GLEE_GLX_MESA_agp_offset 1 -/* Constants */ -#ifndef GLEE_H_DEFINED_glXGetAGPOffsetMESA -#define GLEE_H_DEFINED_glXGetAGPOffsetMESA - typedef unsigned int (APIENTRYP GLEEPFNGLXGETAGPOFFSETMESAPROC) (const void * pointer); - GLEE_EXTERN GLEEPFNGLXGETAGPOFFSETMESAPROC GLeeFuncPtr_glXGetAGPOffsetMESA; - #define glXGetAGPOffsetMESA GLeeFuncPtr_glXGetAGPOffsetMESA -#endif -#endif - -/* GLX_EXT_fbconfig_packed_float */ - -#ifndef GLX_EXT_fbconfig_packed_float -#define GLX_EXT_fbconfig_packed_float 1 -#define __GLEE_GLX_EXT_fbconfig_packed_float 1 -/* Constants */ -#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 -#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 -#endif - -/* GLX_EXT_framebuffer_sRGB */ - -#ifndef GLX_EXT_framebuffer_sRGB -#define GLX_EXT_framebuffer_sRGB 1 -#define __GLEE_GLX_EXT_framebuffer_sRGB 1 -/* Constants */ -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 -#endif - -/* GLX_EXT_texture_from_pixmap */ - -#ifndef GLX_EXT_texture_from_pixmap -#define GLX_EXT_texture_from_pixmap 1 -#define __GLEE_GLX_EXT_texture_from_pixmap 1 -/* Constants */ -#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 -#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 -#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 -#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 -#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 -#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 -#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 -#define GLX_Y_INVERTED_EXT 0x20D4 -#define GLX_TEXTURE_FORMAT_EXT 0x20D5 -#define GLX_TEXTURE_TARGET_EXT 0x20D6 -#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 -#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 -#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 -#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA -#define GLX_TEXTURE_1D_EXT 0x20DB -#define GLX_TEXTURE_2D_EXT 0x20DC -#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD -#define GLX_FRONT_LEFT_EXT 0x20DE -#define GLX_FRONT_RIGHT_EXT 0x20DF -#define GLX_BACK_LEFT_EXT 0x20E0 -#define GLX_BACK_RIGHT_EXT 0x20E1 -#define GLX_FRONT_EXT GLX_FRONT_LEFT_EXT -#define GLX_BACK_EXT GLX_BACK_LEFT_EXT -#define GLX_AUX0_EXT 0x20E2 -#define GLX_AUX1_EXT 0x20E3 -#define GLX_AUX2_EXT 0x20E4 -#define GLX_AUX3_EXT 0x20E5 -#define GLX_AUX4_EXT 0x20E6 -#define GLX_AUX5_EXT 0x20E7 -#define GLX_AUX6_EXT 0x20E8 -#define GLX_AUX7_EXT 0x20E9 -#define GLX_AUX8_EXT 0x20EA -#define GLX_AUX9_EXT 0x20EB -#ifndef GLEE_H_DEFINED_glXBindTexImageEXT -#define GLEE_H_DEFINED_glXBindTexImageEXT - typedef void (APIENTRYP GLEEPFNGLXBINDTEXIMAGEEXTPROC) (Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list); - GLEE_EXTERN GLEEPFNGLXBINDTEXIMAGEEXTPROC GLeeFuncPtr_glXBindTexImageEXT; - #define glXBindTexImageEXT GLeeFuncPtr_glXBindTexImageEXT -#endif -#ifndef GLEE_H_DEFINED_glXReleaseTexImageEXT -#define GLEE_H_DEFINED_glXReleaseTexImageEXT - typedef void (APIENTRYP GLEEPFNGLXRELEASETEXIMAGEEXTPROC) (Display * dpy, GLXDrawable drawable, int buffer); - GLEE_EXTERN GLEEPFNGLXRELEASETEXIMAGEEXTPROC GLeeFuncPtr_glXReleaseTexImageEXT; - #define glXReleaseTexImageEXT GLeeFuncPtr_glXReleaseTexImageEXT -#endif -#endif - -/* GLX_NV_present_video */ - -#ifndef GLX_NV_present_video -#define GLX_NV_present_video 1 -#define __GLEE_GLX_NV_present_video 1 -/* Constants */ -#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 -#endif - -/* GLX_NV_video_out */ - -#ifndef GLX_NV_video_out -#define GLX_NV_video_out 1 -#define __GLEE_GLX_NV_video_out 1 -/* Constants */ -#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 -#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 -#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 -#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 -#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 -#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA -#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB -#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC -#endif - -/* GLX_NV_swap_group */ - -#ifndef GLX_NV_swap_group -#define GLX_NV_swap_group 1 -#define __GLEE_GLX_NV_swap_group 1 -/* Constants */ -#endif - -/* GLX_EXT_scene_marker */ - -#ifndef GLX_EXT_scene_marker -#define GLX_EXT_scene_marker 1 -#define __GLEE_GLX_EXT_scene_marker 1 -/* Constants */ -#endif - -/* GLX_NV_video_output */ - -#ifndef GLX_NV_video_output -#define GLX_NV_video_output 1 -#define __GLEE_GLX_NV_video_output 1 -/* Constants */ -#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 -#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 -#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 -#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 -#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 -#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA -#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB -#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC -#ifndef GLEE_H_DEFINED_glXGetVideoDeviceNV -#define GLEE_H_DEFINED_glXGetVideoDeviceNV - typedef int (APIENTRYP GLEEPFNGLXGETVIDEODEVICENVPROC) (Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice); - GLEE_EXTERN GLEEPFNGLXGETVIDEODEVICENVPROC GLeeFuncPtr_glXGetVideoDeviceNV; - #define glXGetVideoDeviceNV GLeeFuncPtr_glXGetVideoDeviceNV -#endif -#ifndef GLEE_H_DEFINED_glXReleaseVideoDeviceNV -#define GLEE_H_DEFINED_glXReleaseVideoDeviceNV - typedef int (APIENTRYP GLEEPFNGLXRELEASEVIDEODEVICENVPROC) (Display * dpy, int screen, GLXVideoDeviceNV VideoDevice); - GLEE_EXTERN GLEEPFNGLXRELEASEVIDEODEVICENVPROC GLeeFuncPtr_glXReleaseVideoDeviceNV; - #define glXReleaseVideoDeviceNV GLeeFuncPtr_glXReleaseVideoDeviceNV -#endif -#ifndef GLEE_H_DEFINED_glXBindVideoImageNV -#define GLEE_H_DEFINED_glXBindVideoImageNV - typedef int (APIENTRYP GLEEPFNGLXBINDVIDEOIMAGENVPROC) (Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); - GLEE_EXTERN GLEEPFNGLXBINDVIDEOIMAGENVPROC GLeeFuncPtr_glXBindVideoImageNV; - #define glXBindVideoImageNV GLeeFuncPtr_glXBindVideoImageNV -#endif -#ifndef GLEE_H_DEFINED_glXReleaseVideoImageNV -#define GLEE_H_DEFINED_glXReleaseVideoImageNV - typedef int (APIENTRYP GLEEPFNGLXRELEASEVIDEOIMAGENVPROC) (Display * dpy, GLXPbuffer pbuf); - GLEE_EXTERN GLEEPFNGLXRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_glXReleaseVideoImageNV; - #define glXReleaseVideoImageNV GLeeFuncPtr_glXReleaseVideoImageNV -#endif -#ifndef GLEE_H_DEFINED_glXSendPbufferToVideoNV -#define GLEE_H_DEFINED_glXSendPbufferToVideoNV - typedef int (APIENTRYP GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC) (Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock); - GLEE_EXTERN GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_glXSendPbufferToVideoNV; - #define glXSendPbufferToVideoNV GLeeFuncPtr_glXSendPbufferToVideoNV -#endif -#ifndef GLEE_H_DEFINED_glXGetVideoInfoNV -#define GLEE_H_DEFINED_glXGetVideoInfoNV - typedef int (APIENTRYP GLEEPFNGLXGETVIDEOINFONVPROC) (Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo); - GLEE_EXTERN GLEEPFNGLXGETVIDEOINFONVPROC GLeeFuncPtr_glXGetVideoInfoNV; - #define glXGetVideoInfoNV GLeeFuncPtr_glXGetVideoInfoNV -#endif -#endif -#endif /*end GLX */ - -/***************************************************************** - * GLee functions - *****************************************************************/ - -GLEE_EXTERN GLboolean GLeeInit( void ); -GLEE_EXTERN GLint GLeeForceLink(const char * extensionName); -GLEE_EXTERN const char * GLeeGetErrorString( void ); -GLEE_EXTERN const char * GLeeGetExtStrGL( void ); -GLEE_EXTERN GLboolean GLeeEnabled(GLboolean * extensionQueryingVariable); - -#ifdef WIN32 -GLEE_EXTERN const char * GLeeGetExtStrWGL( void ); -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#else -GLEE_EXTERN const char * GLeeGetExtStrGLX( void ); -#endif - -#ifdef __cplusplus -} /* end C linkage */ -#endif - -#endif /* __glee_h_ defined */ +/*************************************************************************** +* +* GLee.h +* GLee (OpenGL Easy Extension library) +* Version : 5.4 +* +* Copyright (c)2009 Ben Woodhouse All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer as +* the first lines of this file unmodified. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +* Web: http://elf-stone.com/glee.php +* +* [This file was automatically generated by GLeeGen 7.0 +* +***************************************************************************/ + +#ifndef __glee_h_ +#define __glee_h_ + +#ifdef __gl_h_ + #error gl.h included before glee.h +#endif + +#ifdef __glext_h_ + #error glext.h included before glee.h +#endif + +#ifdef __wglext_h_ + #error wglext.h included before glee.h +#endif + +#ifdef __glxext_h_ + #error glxext.h included before glee.h +#endif + +#ifdef WIN32 + #define WIN32_LEAN_AND_MEAN + #include + #include +#elif defined(__APPLE__) || defined(__APPLE_CC__) + #define GL_GLEXT_LEGACY + #include +#else // GLX + #define __glext_h_ /* prevent glext.h from being included */ + #define __glxext_h_ /* prevent glxext.h from being included */ + #define GLX_GLXEXT_PROTOTYPES + #include + #include +#endif + +#ifndef APIENTRY + #define APIENTRY +#endif + +#ifndef APIENTRYP + #define APIENTRYP APIENTRY * +#endif + +#define GLEE_EXTERN extern + +#ifdef __cplusplus + extern "C" { /* begin C linkage */ +#endif + +#define GLEE_LINK_FAIL 0 +#define GLEE_LINK_PARTIAL 1 +#define GLEE_LINK_COMPLETE 2 + +/* Extension querying variables */ + +GLEE_EXTERN GLboolean _GLEE_VERSION_1_2; +GLEE_EXTERN GLboolean _GLEE_ARB_imaging; +GLEE_EXTERN GLboolean _GLEE_VERSION_1_3; +GLEE_EXTERN GLboolean _GLEE_VERSION_1_4; +GLEE_EXTERN GLboolean _GLEE_VERSION_1_5; +GLEE_EXTERN GLboolean _GLEE_VERSION_2_0; +GLEE_EXTERN GLboolean _GLEE_VERSION_2_1; +GLEE_EXTERN GLboolean _GLEE_VERSION_3_0; +GLEE_EXTERN GLboolean _GLEE_ARB_multitexture; +GLEE_EXTERN GLboolean _GLEE_ARB_transpose_matrix; +GLEE_EXTERN GLboolean _GLEE_ARB_multisample; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_add; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_cube_map; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_compression; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_border_clamp; +GLEE_EXTERN GLboolean _GLEE_ARB_point_parameters; +GLEE_EXTERN GLboolean _GLEE_ARB_vertex_blend; +GLEE_EXTERN GLboolean _GLEE_ARB_matrix_palette; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_combine; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_crossbar; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_dot3; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_mirrored_repeat; +GLEE_EXTERN GLboolean _GLEE_ARB_depth_texture; +GLEE_EXTERN GLboolean _GLEE_ARB_shadow; +GLEE_EXTERN GLboolean _GLEE_ARB_shadow_ambient; +GLEE_EXTERN GLboolean _GLEE_ARB_window_pos; +GLEE_EXTERN GLboolean _GLEE_ARB_vertex_program; +GLEE_EXTERN GLboolean _GLEE_ARB_fragment_program; +GLEE_EXTERN GLboolean _GLEE_ARB_vertex_buffer_object; +GLEE_EXTERN GLboolean _GLEE_ARB_occlusion_query; +GLEE_EXTERN GLboolean _GLEE_ARB_shader_objects; +GLEE_EXTERN GLboolean _GLEE_ARB_vertex_shader; +GLEE_EXTERN GLboolean _GLEE_ARB_fragment_shader; +GLEE_EXTERN GLboolean _GLEE_ARB_shading_language_100; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_non_power_of_two; +GLEE_EXTERN GLboolean _GLEE_ARB_point_sprite; +GLEE_EXTERN GLboolean _GLEE_ARB_fragment_program_shadow; +GLEE_EXTERN GLboolean _GLEE_ARB_draw_buffers; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_rectangle; +GLEE_EXTERN GLboolean _GLEE_ARB_color_buffer_float; +GLEE_EXTERN GLboolean _GLEE_ARB_half_float_pixel; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_float; +GLEE_EXTERN GLboolean _GLEE_ARB_pixel_buffer_object; +GLEE_EXTERN GLboolean _GLEE_ARB_depth_buffer_float; +GLEE_EXTERN GLboolean _GLEE_ARB_draw_instanced; +GLEE_EXTERN GLboolean _GLEE_ARB_framebuffer_object; +GLEE_EXTERN GLboolean _GLEE_ARB_framebuffer_sRGB; +GLEE_EXTERN GLboolean _GLEE_ARB_geometry_shader4; +GLEE_EXTERN GLboolean _GLEE_ARB_half_float_vertex; +GLEE_EXTERN GLboolean _GLEE_ARB_instanced_arrays; +GLEE_EXTERN GLboolean _GLEE_ARB_map_buffer_range; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_buffer_object; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_compression_rgtc; +GLEE_EXTERN GLboolean _GLEE_ARB_texture_rg; +GLEE_EXTERN GLboolean _GLEE_ARB_vertex_array_object; +GLEE_EXTERN GLboolean _GLEE_EXT_abgr; +GLEE_EXTERN GLboolean _GLEE_EXT_blend_color; +GLEE_EXTERN GLboolean _GLEE_EXT_polygon_offset; +GLEE_EXTERN GLboolean _GLEE_EXT_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_texture3D; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture_filter4; +GLEE_EXTERN GLboolean _GLEE_EXT_subtexture; +GLEE_EXTERN GLboolean _GLEE_EXT_copy_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_histogram; +GLEE_EXTERN GLboolean _GLEE_EXT_convolution; +GLEE_EXTERN GLboolean _GLEE_SGI_color_matrix; +GLEE_EXTERN GLboolean _GLEE_SGI_color_table; +GLEE_EXTERN GLboolean _GLEE_SGIS_pixel_texture; +GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_texture; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture4D; +GLEE_EXTERN GLboolean _GLEE_SGI_texture_color_table; +GLEE_EXTERN GLboolean _GLEE_EXT_cmyka; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_object; +GLEE_EXTERN GLboolean _GLEE_SGIS_detail_texture; +GLEE_EXTERN GLboolean _GLEE_SGIS_sharpen_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_packed_pixels; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture_lod; +GLEE_EXTERN GLboolean _GLEE_SGIS_multisample; +GLEE_EXTERN GLboolean _GLEE_EXT_rescale_normal; +GLEE_EXTERN GLboolean _GLEE_EXT_vertex_array; +GLEE_EXTERN GLboolean _GLEE_EXT_misc_attribute; +GLEE_EXTERN GLboolean _GLEE_SGIS_generate_mipmap; +GLEE_EXTERN GLboolean _GLEE_SGIX_clipmap; +GLEE_EXTERN GLboolean _GLEE_SGIX_shadow; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture_edge_clamp; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture_border_clamp; +GLEE_EXTERN GLboolean _GLEE_EXT_blend_minmax; +GLEE_EXTERN GLboolean _GLEE_EXT_blend_subtract; +GLEE_EXTERN GLboolean _GLEE_EXT_blend_logic_op; +GLEE_EXTERN GLboolean _GLEE_SGIX_interlace; +GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_tiles; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture_select; +GLEE_EXTERN GLboolean _GLEE_SGIX_sprite; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_multi_buffer; +GLEE_EXTERN GLboolean _GLEE_EXT_point_parameters; +GLEE_EXTERN GLboolean _GLEE_SGIS_point_parameters; +GLEE_EXTERN GLboolean _GLEE_SGIX_instruments; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_scale_bias; +GLEE_EXTERN GLboolean _GLEE_SGIX_framezoom; +GLEE_EXTERN GLboolean _GLEE_SGIX_tag_sample_buffer; +GLEE_EXTERN GLboolean _GLEE_FfdMaskSGIX; +GLEE_EXTERN GLboolean _GLEE_SGIX_polynomial_ffd; +GLEE_EXTERN GLboolean _GLEE_SGIX_reference_plane; +GLEE_EXTERN GLboolean _GLEE_SGIX_flush_raster; +GLEE_EXTERN GLboolean _GLEE_SGIX_depth_texture; +GLEE_EXTERN GLboolean _GLEE_SGIS_fog_function; +GLEE_EXTERN GLboolean _GLEE_SGIX_fog_offset; +GLEE_EXTERN GLboolean _GLEE_HP_image_transform; +GLEE_EXTERN GLboolean _GLEE_HP_convolution_border_modes; +GLEE_EXTERN GLboolean _GLEE_INGR_palette_buffer; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_add_env; +GLEE_EXTERN GLboolean _GLEE_EXT_color_subtable; +GLEE_EXTERN GLboolean _GLEE_PGI_vertex_hints; +GLEE_EXTERN GLboolean _GLEE_PGI_misc_hints; +GLEE_EXTERN GLboolean _GLEE_EXT_paletted_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_clip_volume_hint; +GLEE_EXTERN GLboolean _GLEE_SGIX_list_priority; +GLEE_EXTERN GLboolean _GLEE_SGIX_ir_instrument1; +GLEE_EXTERN GLboolean _GLEE_SGIX_calligraphic_fragment; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_lod_bias; +GLEE_EXTERN GLboolean _GLEE_SGIX_shadow_ambient; +GLEE_EXTERN GLboolean _GLEE_EXT_index_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_index_material; +GLEE_EXTERN GLboolean _GLEE_EXT_index_func; +GLEE_EXTERN GLboolean _GLEE_EXT_index_array_formats; +GLEE_EXTERN GLboolean _GLEE_EXT_compiled_vertex_array; +GLEE_EXTERN GLboolean _GLEE_EXT_cull_vertex; +GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcb; +GLEE_EXTERN GLboolean _GLEE_SGIX_fragment_lighting; +GLEE_EXTERN GLboolean _GLEE_IBM_rasterpos_clip; +GLEE_EXTERN GLboolean _GLEE_HP_texture_lighting; +GLEE_EXTERN GLboolean _GLEE_EXT_draw_range_elements; +GLEE_EXTERN GLboolean _GLEE_WIN_phong_shading; +GLEE_EXTERN GLboolean _GLEE_WIN_specular_fog; +GLEE_EXTERN GLboolean _GLEE_EXT_light_texture; +GLEE_EXTERN GLboolean _GLEE_SGIX_blend_alpha_minmax; +GLEE_EXTERN GLboolean _GLEE_SGIX_impact_pixel_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_bgra; +GLEE_EXTERN GLboolean _GLEE_SGIX_async; +GLEE_EXTERN GLboolean _GLEE_SGIX_async_pixel; +GLEE_EXTERN GLboolean _GLEE_SGIX_async_histogram; +GLEE_EXTERN GLboolean _GLEE_INTEL_texture_scissor; +GLEE_EXTERN GLboolean _GLEE_INTEL_parallel_arrays; +GLEE_EXTERN GLboolean _GLEE_HP_occlusion_test; +GLEE_EXTERN GLboolean _GLEE_EXT_pixel_transform; +GLEE_EXTERN GLboolean _GLEE_EXT_pixel_transform_color_table; +GLEE_EXTERN GLboolean _GLEE_EXT_shared_texture_palette; +GLEE_EXTERN GLboolean _GLEE_EXT_separate_specular_color; +GLEE_EXTERN GLboolean _GLEE_EXT_secondary_color; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_perturb_normal; +GLEE_EXTERN GLboolean _GLEE_EXT_multi_draw_arrays; +GLEE_EXTERN GLboolean _GLEE_EXT_fog_coord; +GLEE_EXTERN GLboolean _GLEE_REND_screen_coordinates; +GLEE_EXTERN GLboolean _GLEE_EXT_coordinate_frame; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_combine; +GLEE_EXTERN GLboolean _GLEE_APPLE_specular_vector; +GLEE_EXTERN GLboolean _GLEE_APPLE_transform_hint; +GLEE_EXTERN GLboolean _GLEE_SGIX_fog_scale; +GLEE_EXTERN GLboolean _GLEE_SUNX_constant_data; +GLEE_EXTERN GLboolean _GLEE_SUN_global_alpha; +GLEE_EXTERN GLboolean _GLEE_SUN_triangle_list; +GLEE_EXTERN GLboolean _GLEE_SUN_vertex; +GLEE_EXTERN GLboolean _GLEE_EXT_blend_func_separate; +GLEE_EXTERN GLboolean _GLEE_INGR_color_clamp; +GLEE_EXTERN GLboolean _GLEE_INGR_interlace_read; +GLEE_EXTERN GLboolean _GLEE_EXT_stencil_wrap; +GLEE_EXTERN GLboolean _GLEE_EXT_422_pixels; +GLEE_EXTERN GLboolean _GLEE_NV_texgen_reflection; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_cube_map; +GLEE_EXTERN GLboolean _GLEE_SUN_convolution_border_modes; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_add; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_lod_bias; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_filter_anisotropic; +GLEE_EXTERN GLboolean _GLEE_EXT_vertex_weighting; +GLEE_EXTERN GLboolean _GLEE_NV_light_max_exponent; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_array_range; +GLEE_EXTERN GLboolean _GLEE_NV_register_combiners; +GLEE_EXTERN GLboolean _GLEE_NV_fog_distance; +GLEE_EXTERN GLboolean _GLEE_NV_texgen_emboss; +GLEE_EXTERN GLboolean _GLEE_NV_blend_square; +GLEE_EXTERN GLboolean _GLEE_NV_texture_env_combine4; +GLEE_EXTERN GLboolean _GLEE_MESA_resize_buffers; +GLEE_EXTERN GLboolean _GLEE_MESA_window_pos; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_s3tc; +GLEE_EXTERN GLboolean _GLEE_IBM_cull_vertex; +GLEE_EXTERN GLboolean _GLEE_IBM_multimode_draw_arrays; +GLEE_EXTERN GLboolean _GLEE_IBM_vertex_array_lists; +GLEE_EXTERN GLboolean _GLEE_SGIX_subsample; +GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcb_subsample; +GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcba; +GLEE_EXTERN GLboolean _GLEE_SGI_depth_pass_instrument; +GLEE_EXTERN GLboolean _GLEE_3DFX_texture_compression_FXT1; +GLEE_EXTERN GLboolean _GLEE_3DFX_multisample; +GLEE_EXTERN GLboolean _GLEE_3DFX_tbuffer; +GLEE_EXTERN GLboolean _GLEE_EXT_multisample; +GLEE_EXTERN GLboolean _GLEE_SGIX_vertex_preclip; +GLEE_EXTERN GLboolean _GLEE_SGIX_convolution_accuracy; +GLEE_EXTERN GLboolean _GLEE_SGIX_resample; +GLEE_EXTERN GLboolean _GLEE_SGIS_point_line_texgen; +GLEE_EXTERN GLboolean _GLEE_SGIS_texture_color_mask; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_dot3; +GLEE_EXTERN GLboolean _GLEE_ATI_texture_mirror_once; +GLEE_EXTERN GLboolean _GLEE_NV_fence; +GLEE_EXTERN GLboolean _GLEE_IBM_texture_mirrored_repeat; +GLEE_EXTERN GLboolean _GLEE_NV_evaluators; +GLEE_EXTERN GLboolean _GLEE_NV_packed_depth_stencil; +GLEE_EXTERN GLboolean _GLEE_NV_register_combiners2; +GLEE_EXTERN GLboolean _GLEE_NV_texture_compression_vtc; +GLEE_EXTERN GLboolean _GLEE_NV_texture_rectangle; +GLEE_EXTERN GLboolean _GLEE_NV_texture_shader; +GLEE_EXTERN GLboolean _GLEE_NV_texture_shader2; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_array_range2; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_program; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_coordinate_clamp; +GLEE_EXTERN GLboolean _GLEE_SGIX_scalebias_hint; +GLEE_EXTERN GLboolean _GLEE_OML_interlace; +GLEE_EXTERN GLboolean _GLEE_OML_subsample; +GLEE_EXTERN GLboolean _GLEE_OML_resample; +GLEE_EXTERN GLboolean _GLEE_NV_copy_depth_to_color; +GLEE_EXTERN GLboolean _GLEE_ATI_envmap_bumpmap; +GLEE_EXTERN GLboolean _GLEE_ATI_fragment_shader; +GLEE_EXTERN GLboolean _GLEE_ATI_pn_triangles; +GLEE_EXTERN GLboolean _GLEE_ATI_vertex_array_object; +GLEE_EXTERN GLboolean _GLEE_EXT_vertex_shader; +GLEE_EXTERN GLboolean _GLEE_ATI_vertex_streams; +GLEE_EXTERN GLboolean _GLEE_ATI_element_array; +GLEE_EXTERN GLboolean _GLEE_SUN_mesh_array; +GLEE_EXTERN GLboolean _GLEE_SUN_slice_accum; +GLEE_EXTERN GLboolean _GLEE_NV_multisample_filter_hint; +GLEE_EXTERN GLboolean _GLEE_NV_depth_clamp; +GLEE_EXTERN GLboolean _GLEE_NV_occlusion_query; +GLEE_EXTERN GLboolean _GLEE_NV_point_sprite; +GLEE_EXTERN GLboolean _GLEE_NV_texture_shader3; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_program1_1; +GLEE_EXTERN GLboolean _GLEE_EXT_shadow_funcs; +GLEE_EXTERN GLboolean _GLEE_EXT_stencil_two_side; +GLEE_EXTERN GLboolean _GLEE_ATI_text_fragment_shader; +GLEE_EXTERN GLboolean _GLEE_APPLE_client_storage; +GLEE_EXTERN GLboolean _GLEE_APPLE_element_array; +GLEE_EXTERN GLboolean _GLEE_APPLE_fence; +GLEE_EXTERN GLboolean _GLEE_APPLE_vertex_array_object; +GLEE_EXTERN GLboolean _GLEE_APPLE_vertex_array_range; +GLEE_EXTERN GLboolean _GLEE_APPLE_ycbcr_422; +GLEE_EXTERN GLboolean _GLEE_S3_s3tc; +GLEE_EXTERN GLboolean _GLEE_ATI_draw_buffers; +GLEE_EXTERN GLboolean _GLEE_ATI_pixel_format_float; +GLEE_EXTERN GLboolean _GLEE_ATI_texture_env_combine3; +GLEE_EXTERN GLboolean _GLEE_ATI_texture_float; +GLEE_EXTERN GLboolean _GLEE_NV_float_buffer; +GLEE_EXTERN GLboolean _GLEE_NV_fragment_program; +GLEE_EXTERN GLboolean _GLEE_NV_half_float; +GLEE_EXTERN GLboolean _GLEE_NV_pixel_data_range; +GLEE_EXTERN GLboolean _GLEE_NV_primitive_restart; +GLEE_EXTERN GLboolean _GLEE_NV_texture_expand_normal; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_program2; +GLEE_EXTERN GLboolean _GLEE_ATI_map_object_buffer; +GLEE_EXTERN GLboolean _GLEE_ATI_separate_stencil; +GLEE_EXTERN GLboolean _GLEE_ATI_vertex_attrib_array_object; +GLEE_EXTERN GLboolean _GLEE_OES_read_format; +GLEE_EXTERN GLboolean _GLEE_EXT_depth_bounds_test; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_mirror_clamp; +GLEE_EXTERN GLboolean _GLEE_EXT_blend_equation_separate; +GLEE_EXTERN GLboolean _GLEE_MESA_pack_invert; +GLEE_EXTERN GLboolean _GLEE_MESA_ycbcr_texture; +GLEE_EXTERN GLboolean _GLEE_EXT_pixel_buffer_object; +GLEE_EXTERN GLboolean _GLEE_NV_fragment_program_option; +GLEE_EXTERN GLboolean _GLEE_NV_fragment_program2; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_program2_option; +GLEE_EXTERN GLboolean _GLEE_NV_vertex_program3; +GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_object; +GLEE_EXTERN GLboolean _GLEE_GREMEDY_string_marker; +GLEE_EXTERN GLboolean _GLEE_EXT_packed_depth_stencil; +GLEE_EXTERN GLboolean _GLEE_EXT_stencil_clear_tag; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_sRGB; +GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_blit; +GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_multisample; +GLEE_EXTERN GLboolean _GLEE_MESAX_texture_stack; +GLEE_EXTERN GLboolean _GLEE_EXT_timer_query; +GLEE_EXTERN GLboolean _GLEE_EXT_gpu_program_parameters; +GLEE_EXTERN GLboolean _GLEE_APPLE_flush_buffer_range; +GLEE_EXTERN GLboolean _GLEE_EXT_gpu_shader4; +GLEE_EXTERN GLboolean _GLEE_EXT_draw_instanced; +GLEE_EXTERN GLboolean _GLEE_EXT_packed_float; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_array; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_buffer_object; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_latc; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_rgtc; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_shared_exponent; +GLEE_EXTERN GLboolean _GLEE_NV_depth_buffer_float; +GLEE_EXTERN GLboolean _GLEE_NV_framebuffer_multisample_coverage; +GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_sRGB; +GLEE_EXTERN GLboolean _GLEE_NV_geometry_shader4; +GLEE_EXTERN GLboolean _GLEE_NV_parameter_buffer_object; +GLEE_EXTERN GLboolean _GLEE_EXT_draw_buffers2; +GLEE_EXTERN GLboolean _GLEE_NV_transform_feedback; +GLEE_EXTERN GLboolean _GLEE_EXT_bindable_uniform; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_integer; +GLEE_EXTERN GLboolean _GLEE_GREMEDY_frame_terminator; +GLEE_EXTERN GLboolean _GLEE_NV_conditional_render; +GLEE_EXTERN GLboolean _GLEE_NV_present_video; +GLEE_EXTERN GLboolean _GLEE_EXT_transform_feedback; +GLEE_EXTERN GLboolean _GLEE_EXT_direct_state_access; +GLEE_EXTERN GLboolean _GLEE_EXT_vertex_array_bgra; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_swizzle; +GLEE_EXTERN GLboolean _GLEE_NV_explicit_multisample; +GLEE_EXTERN GLboolean _GLEE_NV_transform_feedback2; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_select; +GLEE_EXTERN GLboolean _GLEE_INGR_blend_func_separate; +GLEE_EXTERN GLboolean _GLEE_SGIX_depth_pass_instrument; +GLEE_EXTERN GLboolean _GLEE_SGIX_igloo_interface; +GLEE_EXTERN GLboolean _GLEE_EXT_fragment_lighting; +GLEE_EXTERN GLboolean _GLEE_EXT_geometry_shader4; +GLEE_EXTERN GLboolean _GLEE_EXT_scene_marker; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_dxt1; +GLEE_EXTERN GLboolean _GLEE_EXT_texture_env; +GLEE_EXTERN GLboolean _GLEE_IBM_static_data; +GLEE_EXTERN GLboolean _GLEE_NV_gpu_program4; +GLEE_EXTERN GLboolean _GLEE_OES_byte_coordinates; +GLEE_EXTERN GLboolean _GLEE_OES_compressed_paletted_texture; +GLEE_EXTERN GLboolean _GLEE_OES_single_precision; +GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_texture_bits; +GLEE_EXTERN GLboolean _GLEE_SGIX_texture_range; + +/* Aliases for extension querying variables */ + +#define GLEE_VERSION_1_2 GLeeEnabled(&_GLEE_VERSION_1_2) +#define GLEE_ARB_imaging GLeeEnabled(&_GLEE_ARB_imaging) +#define GLEE_VERSION_1_3 GLeeEnabled(&_GLEE_VERSION_1_3) +#define GLEE_VERSION_1_4 GLeeEnabled(&_GLEE_VERSION_1_4) +#define GLEE_VERSION_1_5 GLeeEnabled(&_GLEE_VERSION_1_5) +#define GLEE_VERSION_2_0 GLeeEnabled(&_GLEE_VERSION_2_0) +#define GLEE_VERSION_2_1 GLeeEnabled(&_GLEE_VERSION_2_1) +#define GLEE_VERSION_3_0 GLeeEnabled(&_GLEE_VERSION_3_0) +#define GLEE_ARB_multitexture GLeeEnabled(&_GLEE_ARB_multitexture) +#define GLEE_ARB_transpose_matrix GLeeEnabled(&_GLEE_ARB_transpose_matrix) +#define GLEE_ARB_multisample GLeeEnabled(&_GLEE_ARB_multisample) +#define GLEE_ARB_texture_env_add GLeeEnabled(&_GLEE_ARB_texture_env_add) +#define GLEE_ARB_texture_cube_map GLeeEnabled(&_GLEE_ARB_texture_cube_map) +#define GLEE_ARB_texture_compression GLeeEnabled(&_GLEE_ARB_texture_compression) +#define GLEE_ARB_texture_border_clamp GLeeEnabled(&_GLEE_ARB_texture_border_clamp) +#define GLEE_ARB_point_parameters GLeeEnabled(&_GLEE_ARB_point_parameters) +#define GLEE_ARB_vertex_blend GLeeEnabled(&_GLEE_ARB_vertex_blend) +#define GLEE_ARB_matrix_palette GLeeEnabled(&_GLEE_ARB_matrix_palette) +#define GLEE_ARB_texture_env_combine GLeeEnabled(&_GLEE_ARB_texture_env_combine) +#define GLEE_ARB_texture_env_crossbar GLeeEnabled(&_GLEE_ARB_texture_env_crossbar) +#define GLEE_ARB_texture_env_dot3 GLeeEnabled(&_GLEE_ARB_texture_env_dot3) +#define GLEE_ARB_texture_mirrored_repeat GLeeEnabled(&_GLEE_ARB_texture_mirrored_repeat) +#define GLEE_ARB_depth_texture GLeeEnabled(&_GLEE_ARB_depth_texture) +#define GLEE_ARB_shadow GLeeEnabled(&_GLEE_ARB_shadow) +#define GLEE_ARB_shadow_ambient GLeeEnabled(&_GLEE_ARB_shadow_ambient) +#define GLEE_ARB_window_pos GLeeEnabled(&_GLEE_ARB_window_pos) +#define GLEE_ARB_vertex_program GLeeEnabled(&_GLEE_ARB_vertex_program) +#define GLEE_ARB_fragment_program GLeeEnabled(&_GLEE_ARB_fragment_program) +#define GLEE_ARB_vertex_buffer_object GLeeEnabled(&_GLEE_ARB_vertex_buffer_object) +#define GLEE_ARB_occlusion_query GLeeEnabled(&_GLEE_ARB_occlusion_query) +#define GLEE_ARB_shader_objects GLeeEnabled(&_GLEE_ARB_shader_objects) +#define GLEE_ARB_vertex_shader GLeeEnabled(&_GLEE_ARB_vertex_shader) +#define GLEE_ARB_fragment_shader GLeeEnabled(&_GLEE_ARB_fragment_shader) +#define GLEE_ARB_shading_language_100 GLeeEnabled(&_GLEE_ARB_shading_language_100) +#define GLEE_ARB_texture_non_power_of_two GLeeEnabled(&_GLEE_ARB_texture_non_power_of_two) +#define GLEE_ARB_point_sprite GLeeEnabled(&_GLEE_ARB_point_sprite) +#define GLEE_ARB_fragment_program_shadow GLeeEnabled(&_GLEE_ARB_fragment_program_shadow) +#define GLEE_ARB_draw_buffers GLeeEnabled(&_GLEE_ARB_draw_buffers) +#define GLEE_ARB_texture_rectangle GLeeEnabled(&_GLEE_ARB_texture_rectangle) +#define GLEE_ARB_color_buffer_float GLeeEnabled(&_GLEE_ARB_color_buffer_float) +#define GLEE_ARB_half_float_pixel GLeeEnabled(&_GLEE_ARB_half_float_pixel) +#define GLEE_ARB_texture_float GLeeEnabled(&_GLEE_ARB_texture_float) +#define GLEE_ARB_pixel_buffer_object GLeeEnabled(&_GLEE_ARB_pixel_buffer_object) +#define GLEE_ARB_depth_buffer_float GLeeEnabled(&_GLEE_ARB_depth_buffer_float) +#define GLEE_ARB_draw_instanced GLeeEnabled(&_GLEE_ARB_draw_instanced) +#define GLEE_ARB_framebuffer_object GLeeEnabled(&_GLEE_ARB_framebuffer_object) +#define GLEE_ARB_framebuffer_sRGB GLeeEnabled(&_GLEE_ARB_framebuffer_sRGB) +#define GLEE_ARB_geometry_shader4 GLeeEnabled(&_GLEE_ARB_geometry_shader4) +#define GLEE_ARB_half_float_vertex GLeeEnabled(&_GLEE_ARB_half_float_vertex) +#define GLEE_ARB_instanced_arrays GLeeEnabled(&_GLEE_ARB_instanced_arrays) +#define GLEE_ARB_map_buffer_range GLeeEnabled(&_GLEE_ARB_map_buffer_range) +#define GLEE_ARB_texture_buffer_object GLeeEnabled(&_GLEE_ARB_texture_buffer_object) +#define GLEE_ARB_texture_compression_rgtc GLeeEnabled(&_GLEE_ARB_texture_compression_rgtc) +#define GLEE_ARB_texture_rg GLeeEnabled(&_GLEE_ARB_texture_rg) +#define GLEE_ARB_vertex_array_object GLeeEnabled(&_GLEE_ARB_vertex_array_object) +#define GLEE_EXT_abgr GLeeEnabled(&_GLEE_EXT_abgr) +#define GLEE_EXT_blend_color GLeeEnabled(&_GLEE_EXT_blend_color) +#define GLEE_EXT_polygon_offset GLeeEnabled(&_GLEE_EXT_polygon_offset) +#define GLEE_EXT_texture GLeeEnabled(&_GLEE_EXT_texture) +#define GLEE_EXT_texture3D GLeeEnabled(&_GLEE_EXT_texture3D) +#define GLEE_SGIS_texture_filter4 GLeeEnabled(&_GLEE_SGIS_texture_filter4) +#define GLEE_EXT_subtexture GLeeEnabled(&_GLEE_EXT_subtexture) +#define GLEE_EXT_copy_texture GLeeEnabled(&_GLEE_EXT_copy_texture) +#define GLEE_EXT_histogram GLeeEnabled(&_GLEE_EXT_histogram) +#define GLEE_EXT_convolution GLeeEnabled(&_GLEE_EXT_convolution) +#define GLEE_SGI_color_matrix GLeeEnabled(&_GLEE_SGI_color_matrix) +#define GLEE_SGI_color_table GLeeEnabled(&_GLEE_SGI_color_table) +#define GLEE_SGIS_pixel_texture GLeeEnabled(&_GLEE_SGIS_pixel_texture) +#define GLEE_SGIX_pixel_texture GLeeEnabled(&_GLEE_SGIX_pixel_texture) +#define GLEE_SGIS_texture4D GLeeEnabled(&_GLEE_SGIS_texture4D) +#define GLEE_SGI_texture_color_table GLeeEnabled(&_GLEE_SGI_texture_color_table) +#define GLEE_EXT_cmyka GLeeEnabled(&_GLEE_EXT_cmyka) +#define GLEE_EXT_texture_object GLeeEnabled(&_GLEE_EXT_texture_object) +#define GLEE_SGIS_detail_texture GLeeEnabled(&_GLEE_SGIS_detail_texture) +#define GLEE_SGIS_sharpen_texture GLeeEnabled(&_GLEE_SGIS_sharpen_texture) +#define GLEE_EXT_packed_pixels GLeeEnabled(&_GLEE_EXT_packed_pixels) +#define GLEE_SGIS_texture_lod GLeeEnabled(&_GLEE_SGIS_texture_lod) +#define GLEE_SGIS_multisample GLeeEnabled(&_GLEE_SGIS_multisample) +#define GLEE_EXT_rescale_normal GLeeEnabled(&_GLEE_EXT_rescale_normal) +#define GLEE_EXT_vertex_array GLeeEnabled(&_GLEE_EXT_vertex_array) +#define GLEE_EXT_misc_attribute GLeeEnabled(&_GLEE_EXT_misc_attribute) +#define GLEE_SGIS_generate_mipmap GLeeEnabled(&_GLEE_SGIS_generate_mipmap) +#define GLEE_SGIX_clipmap GLeeEnabled(&_GLEE_SGIX_clipmap) +#define GLEE_SGIX_shadow GLeeEnabled(&_GLEE_SGIX_shadow) +#define GLEE_SGIS_texture_edge_clamp GLeeEnabled(&_GLEE_SGIS_texture_edge_clamp) +#define GLEE_SGIS_texture_border_clamp GLeeEnabled(&_GLEE_SGIS_texture_border_clamp) +#define GLEE_EXT_blend_minmax GLeeEnabled(&_GLEE_EXT_blend_minmax) +#define GLEE_EXT_blend_subtract GLeeEnabled(&_GLEE_EXT_blend_subtract) +#define GLEE_EXT_blend_logic_op GLeeEnabled(&_GLEE_EXT_blend_logic_op) +#define GLEE_SGIX_interlace GLeeEnabled(&_GLEE_SGIX_interlace) +#define GLEE_SGIX_pixel_tiles GLeeEnabled(&_GLEE_SGIX_pixel_tiles) +#define GLEE_SGIS_texture_select GLeeEnabled(&_GLEE_SGIS_texture_select) +#define GLEE_SGIX_sprite GLeeEnabled(&_GLEE_SGIX_sprite) +#define GLEE_SGIX_texture_multi_buffer GLeeEnabled(&_GLEE_SGIX_texture_multi_buffer) +#define GLEE_EXT_point_parameters GLeeEnabled(&_GLEE_EXT_point_parameters) +#define GLEE_SGIS_point_parameters GLeeEnabled(&_GLEE_SGIS_point_parameters) +#define GLEE_SGIX_instruments GLeeEnabled(&_GLEE_SGIX_instruments) +#define GLEE_SGIX_texture_scale_bias GLeeEnabled(&_GLEE_SGIX_texture_scale_bias) +#define GLEE_SGIX_framezoom GLeeEnabled(&_GLEE_SGIX_framezoom) +#define GLEE_SGIX_tag_sample_buffer GLeeEnabled(&_GLEE_SGIX_tag_sample_buffer) +#define GLEE_FfdMaskSGIX GLeeEnabled(&_GLEE_FfdMaskSGIX) +#define GLEE_SGIX_polynomial_ffd GLeeEnabled(&_GLEE_SGIX_polynomial_ffd) +#define GLEE_SGIX_reference_plane GLeeEnabled(&_GLEE_SGIX_reference_plane) +#define GLEE_SGIX_flush_raster GLeeEnabled(&_GLEE_SGIX_flush_raster) +#define GLEE_SGIX_depth_texture GLeeEnabled(&_GLEE_SGIX_depth_texture) +#define GLEE_SGIS_fog_function GLeeEnabled(&_GLEE_SGIS_fog_function) +#define GLEE_SGIX_fog_offset GLeeEnabled(&_GLEE_SGIX_fog_offset) +#define GLEE_HP_image_transform GLeeEnabled(&_GLEE_HP_image_transform) +#define GLEE_HP_convolution_border_modes GLeeEnabled(&_GLEE_HP_convolution_border_modes) +#define GLEE_INGR_palette_buffer GLeeEnabled(&_GLEE_INGR_palette_buffer) +#define GLEE_SGIX_texture_add_env GLeeEnabled(&_GLEE_SGIX_texture_add_env) +#define GLEE_EXT_color_subtable GLeeEnabled(&_GLEE_EXT_color_subtable) +#define GLEE_PGI_vertex_hints GLeeEnabled(&_GLEE_PGI_vertex_hints) +#define GLEE_PGI_misc_hints GLeeEnabled(&_GLEE_PGI_misc_hints) +#define GLEE_EXT_paletted_texture GLeeEnabled(&_GLEE_EXT_paletted_texture) +#define GLEE_EXT_clip_volume_hint GLeeEnabled(&_GLEE_EXT_clip_volume_hint) +#define GLEE_SGIX_list_priority GLeeEnabled(&_GLEE_SGIX_list_priority) +#define GLEE_SGIX_ir_instrument1 GLeeEnabled(&_GLEE_SGIX_ir_instrument1) +#define GLEE_SGIX_calligraphic_fragment GLeeEnabled(&_GLEE_SGIX_calligraphic_fragment) +#define GLEE_SGIX_texture_lod_bias GLeeEnabled(&_GLEE_SGIX_texture_lod_bias) +#define GLEE_SGIX_shadow_ambient GLeeEnabled(&_GLEE_SGIX_shadow_ambient) +#define GLEE_EXT_index_texture GLeeEnabled(&_GLEE_EXT_index_texture) +#define GLEE_EXT_index_material GLeeEnabled(&_GLEE_EXT_index_material) +#define GLEE_EXT_index_func GLeeEnabled(&_GLEE_EXT_index_func) +#define GLEE_EXT_index_array_formats GLeeEnabled(&_GLEE_EXT_index_array_formats) +#define GLEE_EXT_compiled_vertex_array GLeeEnabled(&_GLEE_EXT_compiled_vertex_array) +#define GLEE_EXT_cull_vertex GLeeEnabled(&_GLEE_EXT_cull_vertex) +#define GLEE_SGIX_ycrcb GLeeEnabled(&_GLEE_SGIX_ycrcb) +#define GLEE_SGIX_fragment_lighting GLeeEnabled(&_GLEE_SGIX_fragment_lighting) +#define GLEE_IBM_rasterpos_clip GLeeEnabled(&_GLEE_IBM_rasterpos_clip) +#define GLEE_HP_texture_lighting GLeeEnabled(&_GLEE_HP_texture_lighting) +#define GLEE_EXT_draw_range_elements GLeeEnabled(&_GLEE_EXT_draw_range_elements) +#define GLEE_WIN_phong_shading GLeeEnabled(&_GLEE_WIN_phong_shading) +#define GLEE_WIN_specular_fog GLeeEnabled(&_GLEE_WIN_specular_fog) +#define GLEE_EXT_light_texture GLeeEnabled(&_GLEE_EXT_light_texture) +#define GLEE_SGIX_blend_alpha_minmax GLeeEnabled(&_GLEE_SGIX_blend_alpha_minmax) +#define GLEE_SGIX_impact_pixel_texture GLeeEnabled(&_GLEE_SGIX_impact_pixel_texture) +#define GLEE_EXT_bgra GLeeEnabled(&_GLEE_EXT_bgra) +#define GLEE_SGIX_async GLeeEnabled(&_GLEE_SGIX_async) +#define GLEE_SGIX_async_pixel GLeeEnabled(&_GLEE_SGIX_async_pixel) +#define GLEE_SGIX_async_histogram GLeeEnabled(&_GLEE_SGIX_async_histogram) +#define GLEE_INTEL_texture_scissor GLeeEnabled(&_GLEE_INTEL_texture_scissor) +#define GLEE_INTEL_parallel_arrays GLeeEnabled(&_GLEE_INTEL_parallel_arrays) +#define GLEE_HP_occlusion_test GLeeEnabled(&_GLEE_HP_occlusion_test) +#define GLEE_EXT_pixel_transform GLeeEnabled(&_GLEE_EXT_pixel_transform) +#define GLEE_EXT_pixel_transform_color_table GLeeEnabled(&_GLEE_EXT_pixel_transform_color_table) +#define GLEE_EXT_shared_texture_palette GLeeEnabled(&_GLEE_EXT_shared_texture_palette) +#define GLEE_EXT_separate_specular_color GLeeEnabled(&_GLEE_EXT_separate_specular_color) +#define GLEE_EXT_secondary_color GLeeEnabled(&_GLEE_EXT_secondary_color) +#define GLEE_EXT_texture_perturb_normal GLeeEnabled(&_GLEE_EXT_texture_perturb_normal) +#define GLEE_EXT_multi_draw_arrays GLeeEnabled(&_GLEE_EXT_multi_draw_arrays) +#define GLEE_EXT_fog_coord GLeeEnabled(&_GLEE_EXT_fog_coord) +#define GLEE_REND_screen_coordinates GLeeEnabled(&_GLEE_REND_screen_coordinates) +#define GLEE_EXT_coordinate_frame GLeeEnabled(&_GLEE_EXT_coordinate_frame) +#define GLEE_EXT_texture_env_combine GLeeEnabled(&_GLEE_EXT_texture_env_combine) +#define GLEE_APPLE_specular_vector GLeeEnabled(&_GLEE_APPLE_specular_vector) +#define GLEE_APPLE_transform_hint GLeeEnabled(&_GLEE_APPLE_transform_hint) +#define GLEE_SGIX_fog_scale GLeeEnabled(&_GLEE_SGIX_fog_scale) +#define GLEE_SUNX_constant_data GLeeEnabled(&_GLEE_SUNX_constant_data) +#define GLEE_SUN_global_alpha GLeeEnabled(&_GLEE_SUN_global_alpha) +#define GLEE_SUN_triangle_list GLeeEnabled(&_GLEE_SUN_triangle_list) +#define GLEE_SUN_vertex GLeeEnabled(&_GLEE_SUN_vertex) +#define GLEE_EXT_blend_func_separate GLeeEnabled(&_GLEE_EXT_blend_func_separate) +#define GLEE_INGR_color_clamp GLeeEnabled(&_GLEE_INGR_color_clamp) +#define GLEE_INGR_interlace_read GLeeEnabled(&_GLEE_INGR_interlace_read) +#define GLEE_EXT_stencil_wrap GLeeEnabled(&_GLEE_EXT_stencil_wrap) +#define GLEE_EXT_422_pixels GLeeEnabled(&_GLEE_EXT_422_pixels) +#define GLEE_NV_texgen_reflection GLeeEnabled(&_GLEE_NV_texgen_reflection) +#define GLEE_EXT_texture_cube_map GLeeEnabled(&_GLEE_EXT_texture_cube_map) +#define GLEE_SUN_convolution_border_modes GLeeEnabled(&_GLEE_SUN_convolution_border_modes) +#define GLEE_EXT_texture_env_add GLeeEnabled(&_GLEE_EXT_texture_env_add) +#define GLEE_EXT_texture_lod_bias GLeeEnabled(&_GLEE_EXT_texture_lod_bias) +#define GLEE_EXT_texture_filter_anisotropic GLeeEnabled(&_GLEE_EXT_texture_filter_anisotropic) +#define GLEE_EXT_vertex_weighting GLeeEnabled(&_GLEE_EXT_vertex_weighting) +#define GLEE_NV_light_max_exponent GLeeEnabled(&_GLEE_NV_light_max_exponent) +#define GLEE_NV_vertex_array_range GLeeEnabled(&_GLEE_NV_vertex_array_range) +#define GLEE_NV_register_combiners GLeeEnabled(&_GLEE_NV_register_combiners) +#define GLEE_NV_fog_distance GLeeEnabled(&_GLEE_NV_fog_distance) +#define GLEE_NV_texgen_emboss GLeeEnabled(&_GLEE_NV_texgen_emboss) +#define GLEE_NV_blend_square GLeeEnabled(&_GLEE_NV_blend_square) +#define GLEE_NV_texture_env_combine4 GLeeEnabled(&_GLEE_NV_texture_env_combine4) +#define GLEE_MESA_resize_buffers GLeeEnabled(&_GLEE_MESA_resize_buffers) +#define GLEE_MESA_window_pos GLeeEnabled(&_GLEE_MESA_window_pos) +#define GLEE_EXT_texture_compression_s3tc GLeeEnabled(&_GLEE_EXT_texture_compression_s3tc) +#define GLEE_IBM_cull_vertex GLeeEnabled(&_GLEE_IBM_cull_vertex) +#define GLEE_IBM_multimode_draw_arrays GLeeEnabled(&_GLEE_IBM_multimode_draw_arrays) +#define GLEE_IBM_vertex_array_lists GLeeEnabled(&_GLEE_IBM_vertex_array_lists) +#define GLEE_SGIX_subsample GLeeEnabled(&_GLEE_SGIX_subsample) +#define GLEE_SGIX_ycrcb_subsample GLeeEnabled(&_GLEE_SGIX_ycrcb_subsample) +#define GLEE_SGIX_ycrcba GLeeEnabled(&_GLEE_SGIX_ycrcba) +#define GLEE_SGI_depth_pass_instrument GLeeEnabled(&_GLEE_SGI_depth_pass_instrument) +#define GLEE_3DFX_texture_compression_FXT1 GLeeEnabled(&_GLEE_3DFX_texture_compression_FXT1) +#define GLEE_3DFX_multisample GLeeEnabled(&_GLEE_3DFX_multisample) +#define GLEE_3DFX_tbuffer GLeeEnabled(&_GLEE_3DFX_tbuffer) +#define GLEE_EXT_multisample GLeeEnabled(&_GLEE_EXT_multisample) +#define GLEE_SGIX_vertex_preclip GLeeEnabled(&_GLEE_SGIX_vertex_preclip) +#define GLEE_SGIX_convolution_accuracy GLeeEnabled(&_GLEE_SGIX_convolution_accuracy) +#define GLEE_SGIX_resample GLeeEnabled(&_GLEE_SGIX_resample) +#define GLEE_SGIS_point_line_texgen GLeeEnabled(&_GLEE_SGIS_point_line_texgen) +#define GLEE_SGIS_texture_color_mask GLeeEnabled(&_GLEE_SGIS_texture_color_mask) +#define GLEE_EXT_texture_env_dot3 GLeeEnabled(&_GLEE_EXT_texture_env_dot3) +#define GLEE_ATI_texture_mirror_once GLeeEnabled(&_GLEE_ATI_texture_mirror_once) +#define GLEE_NV_fence GLeeEnabled(&_GLEE_NV_fence) +#define GLEE_IBM_texture_mirrored_repeat GLeeEnabled(&_GLEE_IBM_texture_mirrored_repeat) +#define GLEE_NV_evaluators GLeeEnabled(&_GLEE_NV_evaluators) +#define GLEE_NV_packed_depth_stencil GLeeEnabled(&_GLEE_NV_packed_depth_stencil) +#define GLEE_NV_register_combiners2 GLeeEnabled(&_GLEE_NV_register_combiners2) +#define GLEE_NV_texture_compression_vtc GLeeEnabled(&_GLEE_NV_texture_compression_vtc) +#define GLEE_NV_texture_rectangle GLeeEnabled(&_GLEE_NV_texture_rectangle) +#define GLEE_NV_texture_shader GLeeEnabled(&_GLEE_NV_texture_shader) +#define GLEE_NV_texture_shader2 GLeeEnabled(&_GLEE_NV_texture_shader2) +#define GLEE_NV_vertex_array_range2 GLeeEnabled(&_GLEE_NV_vertex_array_range2) +#define GLEE_NV_vertex_program GLeeEnabled(&_GLEE_NV_vertex_program) +#define GLEE_SGIX_texture_coordinate_clamp GLeeEnabled(&_GLEE_SGIX_texture_coordinate_clamp) +#define GLEE_SGIX_scalebias_hint GLeeEnabled(&_GLEE_SGIX_scalebias_hint) +#define GLEE_OML_interlace GLeeEnabled(&_GLEE_OML_interlace) +#define GLEE_OML_subsample GLeeEnabled(&_GLEE_OML_subsample) +#define GLEE_OML_resample GLeeEnabled(&_GLEE_OML_resample) +#define GLEE_NV_copy_depth_to_color GLeeEnabled(&_GLEE_NV_copy_depth_to_color) +#define GLEE_ATI_envmap_bumpmap GLeeEnabled(&_GLEE_ATI_envmap_bumpmap) +#define GLEE_ATI_fragment_shader GLeeEnabled(&_GLEE_ATI_fragment_shader) +#define GLEE_ATI_pn_triangles GLeeEnabled(&_GLEE_ATI_pn_triangles) +#define GLEE_ATI_vertex_array_object GLeeEnabled(&_GLEE_ATI_vertex_array_object) +#define GLEE_EXT_vertex_shader GLeeEnabled(&_GLEE_EXT_vertex_shader) +#define GLEE_ATI_vertex_streams GLeeEnabled(&_GLEE_ATI_vertex_streams) +#define GLEE_ATI_element_array GLeeEnabled(&_GLEE_ATI_element_array) +#define GLEE_SUN_mesh_array GLeeEnabled(&_GLEE_SUN_mesh_array) +#define GLEE_SUN_slice_accum GLeeEnabled(&_GLEE_SUN_slice_accum) +#define GLEE_NV_multisample_filter_hint GLeeEnabled(&_GLEE_NV_multisample_filter_hint) +#define GLEE_NV_depth_clamp GLeeEnabled(&_GLEE_NV_depth_clamp) +#define GLEE_NV_occlusion_query GLeeEnabled(&_GLEE_NV_occlusion_query) +#define GLEE_NV_point_sprite GLeeEnabled(&_GLEE_NV_point_sprite) +#define GLEE_NV_texture_shader3 GLeeEnabled(&_GLEE_NV_texture_shader3) +#define GLEE_NV_vertex_program1_1 GLeeEnabled(&_GLEE_NV_vertex_program1_1) +#define GLEE_EXT_shadow_funcs GLeeEnabled(&_GLEE_EXT_shadow_funcs) +#define GLEE_EXT_stencil_two_side GLeeEnabled(&_GLEE_EXT_stencil_two_side) +#define GLEE_ATI_text_fragment_shader GLeeEnabled(&_GLEE_ATI_text_fragment_shader) +#define GLEE_APPLE_client_storage GLeeEnabled(&_GLEE_APPLE_client_storage) +#define GLEE_APPLE_element_array GLeeEnabled(&_GLEE_APPLE_element_array) +#define GLEE_APPLE_fence GLeeEnabled(&_GLEE_APPLE_fence) +#define GLEE_APPLE_vertex_array_object GLeeEnabled(&_GLEE_APPLE_vertex_array_object) +#define GLEE_APPLE_vertex_array_range GLeeEnabled(&_GLEE_APPLE_vertex_array_range) +#define GLEE_APPLE_ycbcr_422 GLeeEnabled(&_GLEE_APPLE_ycbcr_422) +#define GLEE_S3_s3tc GLeeEnabled(&_GLEE_S3_s3tc) +#define GLEE_ATI_draw_buffers GLeeEnabled(&_GLEE_ATI_draw_buffers) +#define GLEE_ATI_pixel_format_float GLeeEnabled(&_GLEE_ATI_pixel_format_float) +#define GLEE_ATI_texture_env_combine3 GLeeEnabled(&_GLEE_ATI_texture_env_combine3) +#define GLEE_ATI_texture_float GLeeEnabled(&_GLEE_ATI_texture_float) +#define GLEE_NV_float_buffer GLeeEnabled(&_GLEE_NV_float_buffer) +#define GLEE_NV_fragment_program GLeeEnabled(&_GLEE_NV_fragment_program) +#define GLEE_NV_half_float GLeeEnabled(&_GLEE_NV_half_float) +#define GLEE_NV_pixel_data_range GLeeEnabled(&_GLEE_NV_pixel_data_range) +#define GLEE_NV_primitive_restart GLeeEnabled(&_GLEE_NV_primitive_restart) +#define GLEE_NV_texture_expand_normal GLeeEnabled(&_GLEE_NV_texture_expand_normal) +#define GLEE_NV_vertex_program2 GLeeEnabled(&_GLEE_NV_vertex_program2) +#define GLEE_ATI_map_object_buffer GLeeEnabled(&_GLEE_ATI_map_object_buffer) +#define GLEE_ATI_separate_stencil GLeeEnabled(&_GLEE_ATI_separate_stencil) +#define GLEE_ATI_vertex_attrib_array_object GLeeEnabled(&_GLEE_ATI_vertex_attrib_array_object) +#define GLEE_OES_read_format GLeeEnabled(&_GLEE_OES_read_format) +#define GLEE_EXT_depth_bounds_test GLeeEnabled(&_GLEE_EXT_depth_bounds_test) +#define GLEE_EXT_texture_mirror_clamp GLeeEnabled(&_GLEE_EXT_texture_mirror_clamp) +#define GLEE_EXT_blend_equation_separate GLeeEnabled(&_GLEE_EXT_blend_equation_separate) +#define GLEE_MESA_pack_invert GLeeEnabled(&_GLEE_MESA_pack_invert) +#define GLEE_MESA_ycbcr_texture GLeeEnabled(&_GLEE_MESA_ycbcr_texture) +#define GLEE_EXT_pixel_buffer_object GLeeEnabled(&_GLEE_EXT_pixel_buffer_object) +#define GLEE_NV_fragment_program_option GLeeEnabled(&_GLEE_NV_fragment_program_option) +#define GLEE_NV_fragment_program2 GLeeEnabled(&_GLEE_NV_fragment_program2) +#define GLEE_NV_vertex_program2_option GLeeEnabled(&_GLEE_NV_vertex_program2_option) +#define GLEE_NV_vertex_program3 GLeeEnabled(&_GLEE_NV_vertex_program3) +#define GLEE_EXT_framebuffer_object GLeeEnabled(&_GLEE_EXT_framebuffer_object) +#define GLEE_GREMEDY_string_marker GLeeEnabled(&_GLEE_GREMEDY_string_marker) +#define GLEE_EXT_packed_depth_stencil GLeeEnabled(&_GLEE_EXT_packed_depth_stencil) +#define GLEE_EXT_stencil_clear_tag GLeeEnabled(&_GLEE_EXT_stencil_clear_tag) +#define GLEE_EXT_texture_sRGB GLeeEnabled(&_GLEE_EXT_texture_sRGB) +#define GLEE_EXT_framebuffer_blit GLeeEnabled(&_GLEE_EXT_framebuffer_blit) +#define GLEE_EXT_framebuffer_multisample GLeeEnabled(&_GLEE_EXT_framebuffer_multisample) +#define GLEE_MESAX_texture_stack GLeeEnabled(&_GLEE_MESAX_texture_stack) +#define GLEE_EXT_timer_query GLeeEnabled(&_GLEE_EXT_timer_query) +#define GLEE_EXT_gpu_program_parameters GLeeEnabled(&_GLEE_EXT_gpu_program_parameters) +#define GLEE_APPLE_flush_buffer_range GLeeEnabled(&_GLEE_APPLE_flush_buffer_range) +#define GLEE_EXT_gpu_shader4 GLeeEnabled(&_GLEE_EXT_gpu_shader4) +#define GLEE_EXT_draw_instanced GLeeEnabled(&_GLEE_EXT_draw_instanced) +#define GLEE_EXT_packed_float GLeeEnabled(&_GLEE_EXT_packed_float) +#define GLEE_EXT_texture_array GLeeEnabled(&_GLEE_EXT_texture_array) +#define GLEE_EXT_texture_buffer_object GLeeEnabled(&_GLEE_EXT_texture_buffer_object) +#define GLEE_EXT_texture_compression_latc GLeeEnabled(&_GLEE_EXT_texture_compression_latc) +#define GLEE_EXT_texture_compression_rgtc GLeeEnabled(&_GLEE_EXT_texture_compression_rgtc) +#define GLEE_EXT_texture_shared_exponent GLeeEnabled(&_GLEE_EXT_texture_shared_exponent) +#define GLEE_NV_depth_buffer_float GLeeEnabled(&_GLEE_NV_depth_buffer_float) +#define GLEE_NV_framebuffer_multisample_coverage GLeeEnabled(&_GLEE_NV_framebuffer_multisample_coverage) +#define GLEE_EXT_framebuffer_sRGB GLeeEnabled(&_GLEE_EXT_framebuffer_sRGB) +#define GLEE_NV_geometry_shader4 GLeeEnabled(&_GLEE_NV_geometry_shader4) +#define GLEE_NV_parameter_buffer_object GLeeEnabled(&_GLEE_NV_parameter_buffer_object) +#define GLEE_EXT_draw_buffers2 GLeeEnabled(&_GLEE_EXT_draw_buffers2) +#define GLEE_NV_transform_feedback GLeeEnabled(&_GLEE_NV_transform_feedback) +#define GLEE_EXT_bindable_uniform GLeeEnabled(&_GLEE_EXT_bindable_uniform) +#define GLEE_EXT_texture_integer GLeeEnabled(&_GLEE_EXT_texture_integer) +#define GLEE_GREMEDY_frame_terminator GLeeEnabled(&_GLEE_GREMEDY_frame_terminator) +#define GLEE_NV_conditional_render GLeeEnabled(&_GLEE_NV_conditional_render) +#define GLEE_NV_present_video GLeeEnabled(&_GLEE_NV_present_video) +#define GLEE_EXT_transform_feedback GLeeEnabled(&_GLEE_EXT_transform_feedback) +#define GLEE_EXT_direct_state_access GLeeEnabled(&_GLEE_EXT_direct_state_access) +#define GLEE_EXT_vertex_array_bgra GLeeEnabled(&_GLEE_EXT_vertex_array_bgra) +#define GLEE_EXT_texture_swizzle GLeeEnabled(&_GLEE_EXT_texture_swizzle) +#define GLEE_NV_explicit_multisample GLeeEnabled(&_GLEE_NV_explicit_multisample) +#define GLEE_NV_transform_feedback2 GLeeEnabled(&_GLEE_NV_transform_feedback2) +#define GLEE_SGIX_texture_select GLeeEnabled(&_GLEE_SGIX_texture_select) +#define GLEE_INGR_blend_func_separate GLeeEnabled(&_GLEE_INGR_blend_func_separate) +#define GLEE_SGIX_depth_pass_instrument GLeeEnabled(&_GLEE_SGIX_depth_pass_instrument) +#define GLEE_SGIX_igloo_interface GLeeEnabled(&_GLEE_SGIX_igloo_interface) +#define GLEE_EXT_fragment_lighting GLeeEnabled(&_GLEE_EXT_fragment_lighting) +#define GLEE_EXT_geometry_shader4 GLeeEnabled(&_GLEE_EXT_geometry_shader4) +#define GLEE_EXT_scene_marker GLeeEnabled(&_GLEE_EXT_scene_marker) +#define GLEE_EXT_texture_compression_dxt1 GLeeEnabled(&_GLEE_EXT_texture_compression_dxt1) +#define GLEE_EXT_texture_env GLeeEnabled(&_GLEE_EXT_texture_env) +#define GLEE_IBM_static_data GLeeEnabled(&_GLEE_IBM_static_data) +#define GLEE_NV_gpu_program4 GLeeEnabled(&_GLEE_NV_gpu_program4) +#define GLEE_OES_byte_coordinates GLeeEnabled(&_GLEE_OES_byte_coordinates) +#define GLEE_OES_compressed_paletted_texture GLeeEnabled(&_GLEE_OES_compressed_paletted_texture) +#define GLEE_OES_single_precision GLeeEnabled(&_GLEE_OES_single_precision) +#define GLEE_SGIX_pixel_texture_bits GLeeEnabled(&_GLEE_SGIX_pixel_texture_bits) +#define GLEE_SGIX_texture_range GLeeEnabled(&_GLEE_SGIX_texture_range) + + +/***************************************************************** + * Additional types needed for extensions + *****************************************************************/ + +/* Used for GLSL shader text */ +#ifndef GL_VERSION_2_0 + typedef char GLchar; +#endif + +#include + +#ifndef GL_VERSION_1_5 + typedef ptrdiff_t GLintptr; + typedef ptrdiff_t GLsizeiptr; +#endif + +#ifndef GL_NV_half_float + typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_ARB_vertex_buffer_object + typedef ptrdiff_t GLintptrARB; + typedef ptrdiff_t GLsizeiptrARB; +#endif + +#ifndef GL_ARB_shader_objects + typedef int GLhandleARB; + typedef char GLcharARB; +#endif + +#ifndef GL_EXT_timer_query + typedef signed long long GLint64EXT; + typedef unsigned long long GLuint64EXT; +#endif + +/* Platform-specific */ + +#ifdef WIN32 + + /* WGL */ + + #ifndef WGL_ARB_pbuffer + DECLARE_HANDLE(HPBUFFERARB); + #endif + + #ifndef WGL_EXT_pbuffer + DECLARE_HANDLE(HPBUFFEREXT); + #endif + + #ifndef WGL_NV_video_output + DECLARE_HANDLE(HPVIDEODEV); + #endif + + #ifndef WGL_NV_present_video + DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + #endif + + #ifndef WGL_NV_gpu_affinity + DECLARE_HANDLE(HPGPUNV); + DECLARE_HANDLE(HGPUNV); + + typedef struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; + } GPU_DEVICE, *PGPU_DEVICE; + #endif + +#elif defined(__APPLE__) || defined(__APPLE_CC__) + + /* Mac OS X */ + +#else + + /* GLX */ + + typedef void (*__GLXextFuncPtr)(void); + + #ifndef GLX_ARB_get_proc_address + #define GLX_ARB_get_proc_address 1 + extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *); + extern void ( * glXGetProcAddressARB (const GLubyte *procName))(void); + typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName); + #endif + + #ifndef GLX_SGIX_fbconfig + typedef XID GLXFBConfigIDSGIX; + typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + #endif + + #ifndef GLX_SGIX_pbuffer + typedef XID GLXPbufferSGIX; + typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + GLXDrawable drawable; + int event_type; + int draw_type; + unsigned int mask; + int x, y; + int width, height; + int count; + } GLXBufferClobberEventSGIX; + #endif + + #ifndef GLX_SGIX_hyperpipe + #define _GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 + typedef struct + { + char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; + } GLXHyperpipeNetworkSGIX; + + typedef struct + { + char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int channel; + unsigned int participationType; + int timeSlice; + } GLXHyperpipeConfigSGIX; + + typedef struct + { + char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int srcXOrigin; + int srcYOrigin; + int srcWidth; + int srcHeight; + int destXOrigin; + int destYOrigin; + int destWidth; + int destHeight; + } GLXPipeRect; + + typedef struct + { + char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; + } GLXPipeRectLimits; + #endif + + #ifndef GLX_NV_video_output + typedef unsigned int GLXVideoDeviceNV; + #endif // GLX_NV_video_output + +#endif /* end platform specific */ + + + +/* GL_VERSION_1_2 */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#define __GLEE_GL_VERSION_1_2 1 +/* Constants */ +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#ifndef GLEE_H_DEFINED_glBlendColor +#define GLEE_H_DEFINED_glBlendColor + typedef void (APIENTRYP GLEEPFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + GLEE_EXTERN GLEEPFNGLBLENDCOLORPROC GLeeFuncPtr_glBlendColor; + #define glBlendColor GLeeFuncPtr_glBlendColor +#endif +#ifndef GLEE_H_DEFINED_glBlendEquation +#define GLEE_H_DEFINED_glBlendEquation + typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLBLENDEQUATIONPROC GLeeFuncPtr_glBlendEquation; + #define glBlendEquation GLeeFuncPtr_glBlendEquation +#endif +#ifndef GLEE_H_DEFINED_glDrawRangeElements +#define GLEE_H_DEFINED_glDrawRangeElements + typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); + GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTSPROC GLeeFuncPtr_glDrawRangeElements; + #define glDrawRangeElements GLeeFuncPtr_glDrawRangeElements +#endif +#ifndef GLEE_H_DEFINED_glColorTable +#define GLEE_H_DEFINED_glColorTable + typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); + GLEE_EXTERN GLEEPFNGLCOLORTABLEPROC GLeeFuncPtr_glColorTable; + #define glColorTable GLeeFuncPtr_glColorTable +#endif +#ifndef GLEE_H_DEFINED_glColorTableParameterfv +#define GLEE_H_DEFINED_glColorTableParameterfv + typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glColorTableParameterfv; + #define glColorTableParameterfv GLeeFuncPtr_glColorTableParameterfv +#endif +#ifndef GLEE_H_DEFINED_glColorTableParameteriv +#define GLEE_H_DEFINED_glColorTableParameteriv + typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glColorTableParameteriv; + #define glColorTableParameteriv GLeeFuncPtr_glColorTableParameteriv +#endif +#ifndef GLEE_H_DEFINED_glCopyColorTable +#define GLEE_H_DEFINED_glCopyColorTable + typedef void (APIENTRYP GLEEPFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYCOLORTABLEPROC GLeeFuncPtr_glCopyColorTable; + #define glCopyColorTable GLeeFuncPtr_glCopyColorTable +#endif +#ifndef GLEE_H_DEFINED_glGetColorTable +#define GLEE_H_DEFINED_glGetColorTable + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid * table); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPROC GLeeFuncPtr_glGetColorTable; + #define glGetColorTable GLeeFuncPtr_glGetColorTable +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableParameterfv +#define GLEE_H_DEFINED_glGetColorTableParameterfv + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glGetColorTableParameterfv; + #define glGetColorTableParameterfv GLeeFuncPtr_glGetColorTableParameterfv +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableParameteriv +#define GLEE_H_DEFINED_glGetColorTableParameteriv + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glGetColorTableParameteriv; + #define glGetColorTableParameteriv GLeeFuncPtr_glGetColorTableParameteriv +#endif +#ifndef GLEE_H_DEFINED_glColorSubTable +#define GLEE_H_DEFINED_glColorSubTable + typedef void (APIENTRYP GLEEPFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOLORSUBTABLEPROC GLeeFuncPtr_glColorSubTable; + #define glColorSubTable GLeeFuncPtr_glColorSubTable +#endif +#ifndef GLEE_H_DEFINED_glCopyColorSubTable +#define GLEE_H_DEFINED_glCopyColorSubTable + typedef void (APIENTRYP GLEEPFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYCOLORSUBTABLEPROC GLeeFuncPtr_glCopyColorSubTable; + #define glCopyColorSubTable GLeeFuncPtr_glCopyColorSubTable +#endif +#ifndef GLEE_H_DEFINED_glConvolutionFilter1D +#define GLEE_H_DEFINED_glConvolutionFilter1D + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glConvolutionFilter1D; + #define glConvolutionFilter1D GLeeFuncPtr_glConvolutionFilter1D +#endif +#ifndef GLEE_H_DEFINED_glConvolutionFilter2D +#define GLEE_H_DEFINED_glConvolutionFilter2D + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glConvolutionFilter2D; + #define glConvolutionFilter2D GLeeFuncPtr_glConvolutionFilter2D +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameterf +#define GLEE_H_DEFINED_glConvolutionParameterf + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFPROC GLeeFuncPtr_glConvolutionParameterf; + #define glConvolutionParameterf GLeeFuncPtr_glConvolutionParameterf +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameterfv +#define GLEE_H_DEFINED_glConvolutionParameterfv + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glConvolutionParameterfv; + #define glConvolutionParameterfv GLeeFuncPtr_glConvolutionParameterfv +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameteri +#define GLEE_H_DEFINED_glConvolutionParameteri + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIPROC GLeeFuncPtr_glConvolutionParameteri; + #define glConvolutionParameteri GLeeFuncPtr_glConvolutionParameteri +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameteriv +#define GLEE_H_DEFINED_glConvolutionParameteriv + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glConvolutionParameteriv; + #define glConvolutionParameteriv GLeeFuncPtr_glConvolutionParameteriv +#endif +#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter1D +#define GLEE_H_DEFINED_glCopyConvolutionFilter1D + typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glCopyConvolutionFilter1D; + #define glCopyConvolutionFilter1D GLeeFuncPtr_glCopyConvolutionFilter1D +#endif +#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter2D +#define GLEE_H_DEFINED_glCopyConvolutionFilter2D + typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glCopyConvolutionFilter2D; + #define glCopyConvolutionFilter2D GLeeFuncPtr_glCopyConvolutionFilter2D +#endif +#ifndef GLEE_H_DEFINED_glGetConvolutionFilter +#define GLEE_H_DEFINED_glGetConvolutionFilter + typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image); + GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONFILTERPROC GLeeFuncPtr_glGetConvolutionFilter; + #define glGetConvolutionFilter GLeeFuncPtr_glGetConvolutionFilter +#endif +#ifndef GLEE_H_DEFINED_glGetConvolutionParameterfv +#define GLEE_H_DEFINED_glGetConvolutionParameterfv + typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glGetConvolutionParameterfv; + #define glGetConvolutionParameterfv GLeeFuncPtr_glGetConvolutionParameterfv +#endif +#ifndef GLEE_H_DEFINED_glGetConvolutionParameteriv +#define GLEE_H_DEFINED_glGetConvolutionParameteriv + typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glGetConvolutionParameteriv; + #define glGetConvolutionParameteriv GLeeFuncPtr_glGetConvolutionParameteriv +#endif +#ifndef GLEE_H_DEFINED_glGetSeparableFilter +#define GLEE_H_DEFINED_glGetSeparableFilter + typedef void (APIENTRYP GLEEPFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); + GLEE_EXTERN GLEEPFNGLGETSEPARABLEFILTERPROC GLeeFuncPtr_glGetSeparableFilter; + #define glGetSeparableFilter GLeeFuncPtr_glGetSeparableFilter +#endif +#ifndef GLEE_H_DEFINED_glSeparableFilter2D +#define GLEE_H_DEFINED_glSeparableFilter2D + typedef void (APIENTRYP GLEEPFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); + GLEE_EXTERN GLEEPFNGLSEPARABLEFILTER2DPROC GLeeFuncPtr_glSeparableFilter2D; + #define glSeparableFilter2D GLeeFuncPtr_glSeparableFilter2D +#endif +#ifndef GLEE_H_DEFINED_glGetHistogram +#define GLEE_H_DEFINED_glGetHistogram + typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); + GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPROC GLeeFuncPtr_glGetHistogram; + #define glGetHistogram GLeeFuncPtr_glGetHistogram +#endif +#ifndef GLEE_H_DEFINED_glGetHistogramParameterfv +#define GLEE_H_DEFINED_glGetHistogramParameterfv + typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC GLeeFuncPtr_glGetHistogramParameterfv; + #define glGetHistogramParameterfv GLeeFuncPtr_glGetHistogramParameterfv +#endif +#ifndef GLEE_H_DEFINED_glGetHistogramParameteriv +#define GLEE_H_DEFINED_glGetHistogramParameteriv + typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC GLeeFuncPtr_glGetHistogramParameteriv; + #define glGetHistogramParameteriv GLeeFuncPtr_glGetHistogramParameteriv +#endif +#ifndef GLEE_H_DEFINED_glGetMinmax +#define GLEE_H_DEFINED_glGetMinmax + typedef void (APIENTRYP GLEEPFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); + GLEE_EXTERN GLEEPFNGLGETMINMAXPROC GLeeFuncPtr_glGetMinmax; + #define glGetMinmax GLeeFuncPtr_glGetMinmax +#endif +#ifndef GLEE_H_DEFINED_glGetMinmaxParameterfv +#define GLEE_H_DEFINED_glGetMinmaxParameterfv + typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERFVPROC GLeeFuncPtr_glGetMinmaxParameterfv; + #define glGetMinmaxParameterfv GLeeFuncPtr_glGetMinmaxParameterfv +#endif +#ifndef GLEE_H_DEFINED_glGetMinmaxParameteriv +#define GLEE_H_DEFINED_glGetMinmaxParameteriv + typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERIVPROC GLeeFuncPtr_glGetMinmaxParameteriv; + #define glGetMinmaxParameteriv GLeeFuncPtr_glGetMinmaxParameteriv +#endif +#ifndef GLEE_H_DEFINED_glHistogram +#define GLEE_H_DEFINED_glHistogram + typedef void (APIENTRYP GLEEPFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); + GLEE_EXTERN GLEEPFNGLHISTOGRAMPROC GLeeFuncPtr_glHistogram; + #define glHistogram GLeeFuncPtr_glHistogram +#endif +#ifndef GLEE_H_DEFINED_glMinmax +#define GLEE_H_DEFINED_glMinmax + typedef void (APIENTRYP GLEEPFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); + GLEE_EXTERN GLEEPFNGLMINMAXPROC GLeeFuncPtr_glMinmax; + #define glMinmax GLeeFuncPtr_glMinmax +#endif +#ifndef GLEE_H_DEFINED_glResetHistogram +#define GLEE_H_DEFINED_glResetHistogram + typedef void (APIENTRYP GLEEPFNGLRESETHISTOGRAMPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLRESETHISTOGRAMPROC GLeeFuncPtr_glResetHistogram; + #define glResetHistogram GLeeFuncPtr_glResetHistogram +#endif +#ifndef GLEE_H_DEFINED_glResetMinmax +#define GLEE_H_DEFINED_glResetMinmax + typedef void (APIENTRYP GLEEPFNGLRESETMINMAXPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLRESETMINMAXPROC GLeeFuncPtr_glResetMinmax; + #define glResetMinmax GLeeFuncPtr_glResetMinmax +#endif +#ifndef GLEE_H_DEFINED_glTexImage3D +#define GLEE_H_DEFINED_glTexImage3D + typedef void (APIENTRYP GLEEPFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXIMAGE3DPROC GLeeFuncPtr_glTexImage3D; + #define glTexImage3D GLeeFuncPtr_glTexImage3D +#endif +#ifndef GLEE_H_DEFINED_glTexSubImage3D +#define GLEE_H_DEFINED_glTexSubImage3D + typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE3DPROC GLeeFuncPtr_glTexSubImage3D; + #define glTexSubImage3D GLeeFuncPtr_glTexSubImage3D +#endif +#ifndef GLEE_H_DEFINED_glCopyTexSubImage3D +#define GLEE_H_DEFINED_glCopyTexSubImage3D + typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE3DPROC GLeeFuncPtr_glCopyTexSubImage3D; + #define glCopyTexSubImage3D GLeeFuncPtr_glCopyTexSubImage3D +#endif +#endif + +/* GL_ARB_imaging */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 +#define __GLEE_GL_ARB_imaging 1 +/* Constants */ +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +/* GL_VERSION_1_3 */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#define __GLEE_GL_VERSION_1_3 1 +/* Constants */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#ifndef GLEE_H_DEFINED_glActiveTexture +#define GLEE_H_DEFINED_glActiveTexture + typedef void (APIENTRYP GLEEPFNGLACTIVETEXTUREPROC) (GLenum texture); + GLEE_EXTERN GLEEPFNGLACTIVETEXTUREPROC GLeeFuncPtr_glActiveTexture; + #define glActiveTexture GLeeFuncPtr_glActiveTexture +#endif +#ifndef GLEE_H_DEFINED_glClientActiveTexture +#define GLEE_H_DEFINED_glClientActiveTexture + typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); + GLEE_EXTERN GLEEPFNGLCLIENTACTIVETEXTUREPROC GLeeFuncPtr_glClientActiveTexture; + #define glClientActiveTexture GLeeFuncPtr_glClientActiveTexture +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1d +#define GLEE_H_DEFINED_glMultiTexCoord1d + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DPROC GLeeFuncPtr_glMultiTexCoord1d; + #define glMultiTexCoord1d GLeeFuncPtr_glMultiTexCoord1d +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1dv +#define GLEE_H_DEFINED_glMultiTexCoord1dv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DVPROC GLeeFuncPtr_glMultiTexCoord1dv; + #define glMultiTexCoord1dv GLeeFuncPtr_glMultiTexCoord1dv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1f +#define GLEE_H_DEFINED_glMultiTexCoord1f + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FPROC GLeeFuncPtr_glMultiTexCoord1f; + #define glMultiTexCoord1f GLeeFuncPtr_glMultiTexCoord1f +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1fv +#define GLEE_H_DEFINED_glMultiTexCoord1fv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FVPROC GLeeFuncPtr_glMultiTexCoord1fv; + #define glMultiTexCoord1fv GLeeFuncPtr_glMultiTexCoord1fv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1i +#define GLEE_H_DEFINED_glMultiTexCoord1i + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IPROC GLeeFuncPtr_glMultiTexCoord1i; + #define glMultiTexCoord1i GLeeFuncPtr_glMultiTexCoord1i +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1iv +#define GLEE_H_DEFINED_glMultiTexCoord1iv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IVPROC GLeeFuncPtr_glMultiTexCoord1iv; + #define glMultiTexCoord1iv GLeeFuncPtr_glMultiTexCoord1iv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1s +#define GLEE_H_DEFINED_glMultiTexCoord1s + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SPROC GLeeFuncPtr_glMultiTexCoord1s; + #define glMultiTexCoord1s GLeeFuncPtr_glMultiTexCoord1s +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1sv +#define GLEE_H_DEFINED_glMultiTexCoord1sv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SVPROC GLeeFuncPtr_glMultiTexCoord1sv; + #define glMultiTexCoord1sv GLeeFuncPtr_glMultiTexCoord1sv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2d +#define GLEE_H_DEFINED_glMultiTexCoord2d + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DPROC GLeeFuncPtr_glMultiTexCoord2d; + #define glMultiTexCoord2d GLeeFuncPtr_glMultiTexCoord2d +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2dv +#define GLEE_H_DEFINED_glMultiTexCoord2dv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DVPROC GLeeFuncPtr_glMultiTexCoord2dv; + #define glMultiTexCoord2dv GLeeFuncPtr_glMultiTexCoord2dv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2f +#define GLEE_H_DEFINED_glMultiTexCoord2f + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FPROC GLeeFuncPtr_glMultiTexCoord2f; + #define glMultiTexCoord2f GLeeFuncPtr_glMultiTexCoord2f +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2fv +#define GLEE_H_DEFINED_glMultiTexCoord2fv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FVPROC GLeeFuncPtr_glMultiTexCoord2fv; + #define glMultiTexCoord2fv GLeeFuncPtr_glMultiTexCoord2fv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2i +#define GLEE_H_DEFINED_glMultiTexCoord2i + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IPROC GLeeFuncPtr_glMultiTexCoord2i; + #define glMultiTexCoord2i GLeeFuncPtr_glMultiTexCoord2i +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2iv +#define GLEE_H_DEFINED_glMultiTexCoord2iv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IVPROC GLeeFuncPtr_glMultiTexCoord2iv; + #define glMultiTexCoord2iv GLeeFuncPtr_glMultiTexCoord2iv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2s +#define GLEE_H_DEFINED_glMultiTexCoord2s + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SPROC GLeeFuncPtr_glMultiTexCoord2s; + #define glMultiTexCoord2s GLeeFuncPtr_glMultiTexCoord2s +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2sv +#define GLEE_H_DEFINED_glMultiTexCoord2sv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SVPROC GLeeFuncPtr_glMultiTexCoord2sv; + #define glMultiTexCoord2sv GLeeFuncPtr_glMultiTexCoord2sv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3d +#define GLEE_H_DEFINED_glMultiTexCoord3d + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DPROC GLeeFuncPtr_glMultiTexCoord3d; + #define glMultiTexCoord3d GLeeFuncPtr_glMultiTexCoord3d +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3dv +#define GLEE_H_DEFINED_glMultiTexCoord3dv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DVPROC GLeeFuncPtr_glMultiTexCoord3dv; + #define glMultiTexCoord3dv GLeeFuncPtr_glMultiTexCoord3dv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3f +#define GLEE_H_DEFINED_glMultiTexCoord3f + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FPROC GLeeFuncPtr_glMultiTexCoord3f; + #define glMultiTexCoord3f GLeeFuncPtr_glMultiTexCoord3f +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3fv +#define GLEE_H_DEFINED_glMultiTexCoord3fv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FVPROC GLeeFuncPtr_glMultiTexCoord3fv; + #define glMultiTexCoord3fv GLeeFuncPtr_glMultiTexCoord3fv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3i +#define GLEE_H_DEFINED_glMultiTexCoord3i + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IPROC GLeeFuncPtr_glMultiTexCoord3i; + #define glMultiTexCoord3i GLeeFuncPtr_glMultiTexCoord3i +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3iv +#define GLEE_H_DEFINED_glMultiTexCoord3iv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IVPROC GLeeFuncPtr_glMultiTexCoord3iv; + #define glMultiTexCoord3iv GLeeFuncPtr_glMultiTexCoord3iv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3s +#define GLEE_H_DEFINED_glMultiTexCoord3s + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SPROC GLeeFuncPtr_glMultiTexCoord3s; + #define glMultiTexCoord3s GLeeFuncPtr_glMultiTexCoord3s +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3sv +#define GLEE_H_DEFINED_glMultiTexCoord3sv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SVPROC GLeeFuncPtr_glMultiTexCoord3sv; + #define glMultiTexCoord3sv GLeeFuncPtr_glMultiTexCoord3sv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4d +#define GLEE_H_DEFINED_glMultiTexCoord4d + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DPROC GLeeFuncPtr_glMultiTexCoord4d; + #define glMultiTexCoord4d GLeeFuncPtr_glMultiTexCoord4d +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4dv +#define GLEE_H_DEFINED_glMultiTexCoord4dv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DVPROC GLeeFuncPtr_glMultiTexCoord4dv; + #define glMultiTexCoord4dv GLeeFuncPtr_glMultiTexCoord4dv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4f +#define GLEE_H_DEFINED_glMultiTexCoord4f + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FPROC GLeeFuncPtr_glMultiTexCoord4f; + #define glMultiTexCoord4f GLeeFuncPtr_glMultiTexCoord4f +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4fv +#define GLEE_H_DEFINED_glMultiTexCoord4fv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FVPROC GLeeFuncPtr_glMultiTexCoord4fv; + #define glMultiTexCoord4fv GLeeFuncPtr_glMultiTexCoord4fv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4i +#define GLEE_H_DEFINED_glMultiTexCoord4i + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IPROC GLeeFuncPtr_glMultiTexCoord4i; + #define glMultiTexCoord4i GLeeFuncPtr_glMultiTexCoord4i +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4iv +#define GLEE_H_DEFINED_glMultiTexCoord4iv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IVPROC GLeeFuncPtr_glMultiTexCoord4iv; + #define glMultiTexCoord4iv GLeeFuncPtr_glMultiTexCoord4iv +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4s +#define GLEE_H_DEFINED_glMultiTexCoord4s + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SPROC GLeeFuncPtr_glMultiTexCoord4s; + #define glMultiTexCoord4s GLeeFuncPtr_glMultiTexCoord4s +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4sv +#define GLEE_H_DEFINED_glMultiTexCoord4sv + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SVPROC GLeeFuncPtr_glMultiTexCoord4sv; + #define glMultiTexCoord4sv GLeeFuncPtr_glMultiTexCoord4sv +#endif +#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixf +#define GLEE_H_DEFINED_glLoadTransposeMatrixf + typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat * m); + GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXFPROC GLeeFuncPtr_glLoadTransposeMatrixf; + #define glLoadTransposeMatrixf GLeeFuncPtr_glLoadTransposeMatrixf +#endif +#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixd +#define GLEE_H_DEFINED_glLoadTransposeMatrixd + typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble * m); + GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXDPROC GLeeFuncPtr_glLoadTransposeMatrixd; + #define glLoadTransposeMatrixd GLeeFuncPtr_glLoadTransposeMatrixd +#endif +#ifndef GLEE_H_DEFINED_glMultTransposeMatrixf +#define GLEE_H_DEFINED_glMultTransposeMatrixf + typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat * m); + GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXFPROC GLeeFuncPtr_glMultTransposeMatrixf; + #define glMultTransposeMatrixf GLeeFuncPtr_glMultTransposeMatrixf +#endif +#ifndef GLEE_H_DEFINED_glMultTransposeMatrixd +#define GLEE_H_DEFINED_glMultTransposeMatrixd + typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble * m); + GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXDPROC GLeeFuncPtr_glMultTransposeMatrixd; + #define glMultTransposeMatrixd GLeeFuncPtr_glMultTransposeMatrixd +#endif +#ifndef GLEE_H_DEFINED_glSampleCoverage +#define GLEE_H_DEFINED_glSampleCoverage + typedef void (APIENTRYP GLEEPFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + GLEE_EXTERN GLEEPFNGLSAMPLECOVERAGEPROC GLeeFuncPtr_glSampleCoverage; + #define glSampleCoverage GLeeFuncPtr_glSampleCoverage +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexImage3D +#define GLEE_H_DEFINED_glCompressedTexImage3D + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC GLeeFuncPtr_glCompressedTexImage3D; + #define glCompressedTexImage3D GLeeFuncPtr_glCompressedTexImage3D +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexImage2D +#define GLEE_H_DEFINED_glCompressedTexImage2D + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC GLeeFuncPtr_glCompressedTexImage2D; + #define glCompressedTexImage2D GLeeFuncPtr_glCompressedTexImage2D +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexImage1D +#define GLEE_H_DEFINED_glCompressedTexImage1D + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC GLeeFuncPtr_glCompressedTexImage1D; + #define glCompressedTexImage1D GLeeFuncPtr_glCompressedTexImage1D +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexSubImage3D +#define GLEE_H_DEFINED_glCompressedTexSubImage3D + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLeeFuncPtr_glCompressedTexSubImage3D; + #define glCompressedTexSubImage3D GLeeFuncPtr_glCompressedTexSubImage3D +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexSubImage2D +#define GLEE_H_DEFINED_glCompressedTexSubImage2D + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLeeFuncPtr_glCompressedTexSubImage2D; + #define glCompressedTexSubImage2D GLeeFuncPtr_glCompressedTexSubImage2D +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexSubImage1D +#define GLEE_H_DEFINED_glCompressedTexSubImage1D + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLeeFuncPtr_glCompressedTexSubImage1D; + #define glCompressedTexSubImage1D GLeeFuncPtr_glCompressedTexSubImage1D +#endif +#ifndef GLEE_H_DEFINED_glGetCompressedTexImage +#define GLEE_H_DEFINED_glGetCompressedTexImage + typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid * img); + GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC GLeeFuncPtr_glGetCompressedTexImage; + #define glGetCompressedTexImage GLeeFuncPtr_glGetCompressedTexImage +#endif +#endif + +/* GL_VERSION_1_4 */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#define __GLEE_GL_VERSION_1_4 1 +/* Constants */ +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#ifndef GLEE_H_DEFINED_glBlendFuncSeparate +#define GLEE_H_DEFINED_glBlendFuncSeparate + typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEPROC GLeeFuncPtr_glBlendFuncSeparate; + #define glBlendFuncSeparate GLeeFuncPtr_glBlendFuncSeparate +#endif +#ifndef GLEE_H_DEFINED_glFogCoordf +#define GLEE_H_DEFINED_glFogCoordf + typedef void (APIENTRYP GLEEPFNGLFOGCOORDFPROC) (GLfloat coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDFPROC GLeeFuncPtr_glFogCoordf; + #define glFogCoordf GLeeFuncPtr_glFogCoordf +#endif +#ifndef GLEE_H_DEFINED_glFogCoordfv +#define GLEE_H_DEFINED_glFogCoordfv + typedef void (APIENTRYP GLEEPFNGLFOGCOORDFVPROC) (const GLfloat * coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDFVPROC GLeeFuncPtr_glFogCoordfv; + #define glFogCoordfv GLeeFuncPtr_glFogCoordfv +#endif +#ifndef GLEE_H_DEFINED_glFogCoordd +#define GLEE_H_DEFINED_glFogCoordd + typedef void (APIENTRYP GLEEPFNGLFOGCOORDDPROC) (GLdouble coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDDPROC GLeeFuncPtr_glFogCoordd; + #define glFogCoordd GLeeFuncPtr_glFogCoordd +#endif +#ifndef GLEE_H_DEFINED_glFogCoorddv +#define GLEE_H_DEFINED_glFogCoorddv + typedef void (APIENTRYP GLEEPFNGLFOGCOORDDVPROC) (const GLdouble * coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDDVPROC GLeeFuncPtr_glFogCoorddv; + #define glFogCoorddv GLeeFuncPtr_glFogCoorddv +#endif +#ifndef GLEE_H_DEFINED_glFogCoordPointer +#define GLEE_H_DEFINED_glFogCoordPointer + typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTERPROC GLeeFuncPtr_glFogCoordPointer; + #define glFogCoordPointer GLeeFuncPtr_glFogCoordPointer +#endif +#ifndef GLEE_H_DEFINED_glMultiDrawArrays +#define GLEE_H_DEFINED_glMultiDrawArrays + typedef void (APIENTRYP GLEEPFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLMULTIDRAWARRAYSPROC GLeeFuncPtr_glMultiDrawArrays; + #define glMultiDrawArrays GLeeFuncPtr_glMultiDrawArrays +#endif +#ifndef GLEE_H_DEFINED_glMultiDrawElements +#define GLEE_H_DEFINED_glMultiDrawElements + typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTSPROC GLeeFuncPtr_glMultiDrawElements; + #define glMultiDrawElements GLeeFuncPtr_glMultiDrawElements +#endif +#ifndef GLEE_H_DEFINED_glPointParameterf +#define GLEE_H_DEFINED_glPointParameterf + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFPROC GLeeFuncPtr_glPointParameterf; + #define glPointParameterf GLeeFuncPtr_glPointParameterf +#endif +#ifndef GLEE_H_DEFINED_glPointParameterfv +#define GLEE_H_DEFINED_glPointParameterfv + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVPROC GLeeFuncPtr_glPointParameterfv; + #define glPointParameterfv GLeeFuncPtr_glPointParameterfv +#endif +#ifndef GLEE_H_DEFINED_glPointParameteri +#define GLEE_H_DEFINED_glPointParameteri + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIPROC GLeeFuncPtr_glPointParameteri; + #define glPointParameteri GLeeFuncPtr_glPointParameteri +#endif +#ifndef GLEE_H_DEFINED_glPointParameteriv +#define GLEE_H_DEFINED_glPointParameteriv + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIVPROC GLeeFuncPtr_glPointParameteriv; + #define glPointParameteriv GLeeFuncPtr_glPointParameteriv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3b +#define GLEE_H_DEFINED_glSecondaryColor3b + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BPROC GLeeFuncPtr_glSecondaryColor3b; + #define glSecondaryColor3b GLeeFuncPtr_glSecondaryColor3b +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3bv +#define GLEE_H_DEFINED_glSecondaryColor3bv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BVPROC) (const GLbyte * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BVPROC GLeeFuncPtr_glSecondaryColor3bv; + #define glSecondaryColor3bv GLeeFuncPtr_glSecondaryColor3bv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3d +#define GLEE_H_DEFINED_glSecondaryColor3d + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DPROC GLeeFuncPtr_glSecondaryColor3d; + #define glSecondaryColor3d GLeeFuncPtr_glSecondaryColor3d +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3dv +#define GLEE_H_DEFINED_glSecondaryColor3dv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DVPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DVPROC GLeeFuncPtr_glSecondaryColor3dv; + #define glSecondaryColor3dv GLeeFuncPtr_glSecondaryColor3dv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3f +#define GLEE_H_DEFINED_glSecondaryColor3f + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FPROC GLeeFuncPtr_glSecondaryColor3f; + #define glSecondaryColor3f GLeeFuncPtr_glSecondaryColor3f +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3fv +#define GLEE_H_DEFINED_glSecondaryColor3fv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FVPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FVPROC GLeeFuncPtr_glSecondaryColor3fv; + #define glSecondaryColor3fv GLeeFuncPtr_glSecondaryColor3fv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3i +#define GLEE_H_DEFINED_glSecondaryColor3i + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IPROC GLeeFuncPtr_glSecondaryColor3i; + #define glSecondaryColor3i GLeeFuncPtr_glSecondaryColor3i +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3iv +#define GLEE_H_DEFINED_glSecondaryColor3iv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IVPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IVPROC GLeeFuncPtr_glSecondaryColor3iv; + #define glSecondaryColor3iv GLeeFuncPtr_glSecondaryColor3iv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3s +#define GLEE_H_DEFINED_glSecondaryColor3s + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SPROC GLeeFuncPtr_glSecondaryColor3s; + #define glSecondaryColor3s GLeeFuncPtr_glSecondaryColor3s +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3sv +#define GLEE_H_DEFINED_glSecondaryColor3sv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SVPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SVPROC GLeeFuncPtr_glSecondaryColor3sv; + #define glSecondaryColor3sv GLeeFuncPtr_glSecondaryColor3sv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3ub +#define GLEE_H_DEFINED_glSecondaryColor3ub + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBPROC GLeeFuncPtr_glSecondaryColor3ub; + #define glSecondaryColor3ub GLeeFuncPtr_glSecondaryColor3ub +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3ubv +#define GLEE_H_DEFINED_glSecondaryColor3ubv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBVPROC GLeeFuncPtr_glSecondaryColor3ubv; + #define glSecondaryColor3ubv GLeeFuncPtr_glSecondaryColor3ubv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3ui +#define GLEE_H_DEFINED_glSecondaryColor3ui + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIPROC GLeeFuncPtr_glSecondaryColor3ui; + #define glSecondaryColor3ui GLeeFuncPtr_glSecondaryColor3ui +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3uiv +#define GLEE_H_DEFINED_glSecondaryColor3uiv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIVPROC) (const GLuint * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIVPROC GLeeFuncPtr_glSecondaryColor3uiv; + #define glSecondaryColor3uiv GLeeFuncPtr_glSecondaryColor3uiv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3us +#define GLEE_H_DEFINED_glSecondaryColor3us + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USPROC GLeeFuncPtr_glSecondaryColor3us; + #define glSecondaryColor3us GLeeFuncPtr_glSecondaryColor3us +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3usv +#define GLEE_H_DEFINED_glSecondaryColor3usv + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USVPROC) (const GLushort * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USVPROC GLeeFuncPtr_glSecondaryColor3usv; + #define glSecondaryColor3usv GLeeFuncPtr_glSecondaryColor3usv +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColorPointer +#define GLEE_H_DEFINED_glSecondaryColorPointer + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTERPROC GLeeFuncPtr_glSecondaryColorPointer; + #define glSecondaryColorPointer GLeeFuncPtr_glSecondaryColorPointer +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2d +#define GLEE_H_DEFINED_glWindowPos2d + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2DPROC GLeeFuncPtr_glWindowPos2d; + #define glWindowPos2d GLeeFuncPtr_glWindowPos2d +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2dv +#define GLEE_H_DEFINED_glWindowPos2dv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVPROC GLeeFuncPtr_glWindowPos2dv; + #define glWindowPos2dv GLeeFuncPtr_glWindowPos2dv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2f +#define GLEE_H_DEFINED_glWindowPos2f + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2FPROC GLeeFuncPtr_glWindowPos2f; + #define glWindowPos2f GLeeFuncPtr_glWindowPos2f +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2fv +#define GLEE_H_DEFINED_glWindowPos2fv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVPROC GLeeFuncPtr_glWindowPos2fv; + #define glWindowPos2fv GLeeFuncPtr_glWindowPos2fv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2i +#define GLEE_H_DEFINED_glWindowPos2i + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IPROC) (GLint x, GLint y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2IPROC GLeeFuncPtr_glWindowPos2i; + #define glWindowPos2i GLeeFuncPtr_glWindowPos2i +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2iv +#define GLEE_H_DEFINED_glWindowPos2iv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVPROC GLeeFuncPtr_glWindowPos2iv; + #define glWindowPos2iv GLeeFuncPtr_glWindowPos2iv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2s +#define GLEE_H_DEFINED_glWindowPos2s + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2SPROC GLeeFuncPtr_glWindowPos2s; + #define glWindowPos2s GLeeFuncPtr_glWindowPos2s +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2sv +#define GLEE_H_DEFINED_glWindowPos2sv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVPROC GLeeFuncPtr_glWindowPos2sv; + #define glWindowPos2sv GLeeFuncPtr_glWindowPos2sv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3d +#define GLEE_H_DEFINED_glWindowPos3d + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3DPROC GLeeFuncPtr_glWindowPos3d; + #define glWindowPos3d GLeeFuncPtr_glWindowPos3d +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3dv +#define GLEE_H_DEFINED_glWindowPos3dv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVPROC GLeeFuncPtr_glWindowPos3dv; + #define glWindowPos3dv GLeeFuncPtr_glWindowPos3dv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3f +#define GLEE_H_DEFINED_glWindowPos3f + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3FPROC GLeeFuncPtr_glWindowPos3f; + #define glWindowPos3f GLeeFuncPtr_glWindowPos3f +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3fv +#define GLEE_H_DEFINED_glWindowPos3fv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVPROC GLeeFuncPtr_glWindowPos3fv; + #define glWindowPos3fv GLeeFuncPtr_glWindowPos3fv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3i +#define GLEE_H_DEFINED_glWindowPos3i + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3IPROC GLeeFuncPtr_glWindowPos3i; + #define glWindowPos3i GLeeFuncPtr_glWindowPos3i +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3iv +#define GLEE_H_DEFINED_glWindowPos3iv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVPROC GLeeFuncPtr_glWindowPos3iv; + #define glWindowPos3iv GLeeFuncPtr_glWindowPos3iv +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3s +#define GLEE_H_DEFINED_glWindowPos3s + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3SPROC GLeeFuncPtr_glWindowPos3s; + #define glWindowPos3s GLeeFuncPtr_glWindowPos3s +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3sv +#define GLEE_H_DEFINED_glWindowPos3sv + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVPROC GLeeFuncPtr_glWindowPos3sv; + #define glWindowPos3sv GLeeFuncPtr_glWindowPos3sv +#endif +#endif + +/* GL_VERSION_1_5 */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#define __GLEE_GL_VERSION_1_5 1 +/* Constants */ +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#ifndef GLEE_H_DEFINED_glGenQueries +#define GLEE_H_DEFINED_glGenQueries + typedef void (APIENTRYP GLEEPFNGLGENQUERIESPROC) (GLsizei n, GLuint * ids); + GLEE_EXTERN GLEEPFNGLGENQUERIESPROC GLeeFuncPtr_glGenQueries; + #define glGenQueries GLeeFuncPtr_glGenQueries +#endif +#ifndef GLEE_H_DEFINED_glDeleteQueries +#define GLEE_H_DEFINED_glDeleteQueries + typedef void (APIENTRYP GLEEPFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint * ids); + GLEE_EXTERN GLEEPFNGLDELETEQUERIESPROC GLeeFuncPtr_glDeleteQueries; + #define glDeleteQueries GLeeFuncPtr_glDeleteQueries +#endif +#ifndef GLEE_H_DEFINED_glIsQuery +#define GLEE_H_DEFINED_glIsQuery + typedef GLboolean (APIENTRYP GLEEPFNGLISQUERYPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLISQUERYPROC GLeeFuncPtr_glIsQuery; + #define glIsQuery GLeeFuncPtr_glIsQuery +#endif +#ifndef GLEE_H_DEFINED_glBeginQuery +#define GLEE_H_DEFINED_glBeginQuery + typedef void (APIENTRYP GLEEPFNGLBEGINQUERYPROC) (GLenum target, GLuint id); + GLEE_EXTERN GLEEPFNGLBEGINQUERYPROC GLeeFuncPtr_glBeginQuery; + #define glBeginQuery GLeeFuncPtr_glBeginQuery +#endif +#ifndef GLEE_H_DEFINED_glEndQuery +#define GLEE_H_DEFINED_glEndQuery + typedef void (APIENTRYP GLEEPFNGLENDQUERYPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLENDQUERYPROC GLeeFuncPtr_glEndQuery; + #define glEndQuery GLeeFuncPtr_glEndQuery +#endif +#ifndef GLEE_H_DEFINED_glGetQueryiv +#define GLEE_H_DEFINED_glGetQueryiv + typedef void (APIENTRYP GLEEPFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETQUERYIVPROC GLeeFuncPtr_glGetQueryiv; + #define glGetQueryiv GLeeFuncPtr_glGetQueryiv +#endif +#ifndef GLEE_H_DEFINED_glGetQueryObjectiv +#define GLEE_H_DEFINED_glGetQueryObjectiv + typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTIVPROC GLeeFuncPtr_glGetQueryObjectiv; + #define glGetQueryObjectiv GLeeFuncPtr_glGetQueryObjectiv +#endif +#ifndef GLEE_H_DEFINED_glGetQueryObjectuiv +#define GLEE_H_DEFINED_glGetQueryObjectuiv + typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUIVPROC GLeeFuncPtr_glGetQueryObjectuiv; + #define glGetQueryObjectuiv GLeeFuncPtr_glGetQueryObjectuiv +#endif +#ifndef GLEE_H_DEFINED_glBindBuffer +#define GLEE_H_DEFINED_glBindBuffer + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); + GLEE_EXTERN GLEEPFNGLBINDBUFFERPROC GLeeFuncPtr_glBindBuffer; + #define glBindBuffer GLeeFuncPtr_glBindBuffer +#endif +#ifndef GLEE_H_DEFINED_glDeleteBuffers +#define GLEE_H_DEFINED_glDeleteBuffers + typedef void (APIENTRYP GLEEPFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint * buffers); + GLEE_EXTERN GLEEPFNGLDELETEBUFFERSPROC GLeeFuncPtr_glDeleteBuffers; + #define glDeleteBuffers GLeeFuncPtr_glDeleteBuffers +#endif +#ifndef GLEE_H_DEFINED_glGenBuffers +#define GLEE_H_DEFINED_glGenBuffers + typedef void (APIENTRYP GLEEPFNGLGENBUFFERSPROC) (GLsizei n, GLuint * buffers); + GLEE_EXTERN GLEEPFNGLGENBUFFERSPROC GLeeFuncPtr_glGenBuffers; + #define glGenBuffers GLeeFuncPtr_glGenBuffers +#endif +#ifndef GLEE_H_DEFINED_glIsBuffer +#define GLEE_H_DEFINED_glIsBuffer + typedef GLboolean (APIENTRYP GLEEPFNGLISBUFFERPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLISBUFFERPROC GLeeFuncPtr_glIsBuffer; + #define glIsBuffer GLeeFuncPtr_glIsBuffer +#endif +#ifndef GLEE_H_DEFINED_glBufferData +#define GLEE_H_DEFINED_glBufferData + typedef void (APIENTRYP GLEEPFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); + GLEE_EXTERN GLEEPFNGLBUFFERDATAPROC GLeeFuncPtr_glBufferData; + #define glBufferData GLeeFuncPtr_glBufferData +#endif +#ifndef GLEE_H_DEFINED_glBufferSubData +#define GLEE_H_DEFINED_glBufferSubData + typedef void (APIENTRYP GLEEPFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLBUFFERSUBDATAPROC GLeeFuncPtr_glBufferSubData; + #define glBufferSubData GLeeFuncPtr_glBufferSubData +#endif +#ifndef GLEE_H_DEFINED_glGetBufferSubData +#define GLEE_H_DEFINED_glGetBufferSubData + typedef void (APIENTRYP GLEEPFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data); + GLEE_EXTERN GLEEPFNGLGETBUFFERSUBDATAPROC GLeeFuncPtr_glGetBufferSubData; + #define glGetBufferSubData GLeeFuncPtr_glGetBufferSubData +#endif +#ifndef GLEE_H_DEFINED_glMapBuffer +#define GLEE_H_DEFINED_glMapBuffer + typedef GLvoid* (APIENTRYP GLEEPFNGLMAPBUFFERPROC) (GLenum target, GLenum access); + GLEE_EXTERN GLEEPFNGLMAPBUFFERPROC GLeeFuncPtr_glMapBuffer; + #define glMapBuffer GLeeFuncPtr_glMapBuffer +#endif +#ifndef GLEE_H_DEFINED_glUnmapBuffer +#define GLEE_H_DEFINED_glUnmapBuffer + typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPBUFFERPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLUNMAPBUFFERPROC GLeeFuncPtr_glUnmapBuffer; + #define glUnmapBuffer GLeeFuncPtr_glUnmapBuffer +#endif +#ifndef GLEE_H_DEFINED_glGetBufferParameteriv +#define GLEE_H_DEFINED_glGetBufferParameteriv + typedef void (APIENTRYP GLEEPFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetBufferParameteriv; + #define glGetBufferParameteriv GLeeFuncPtr_glGetBufferParameteriv +#endif +#ifndef GLEE_H_DEFINED_glGetBufferPointerv +#define GLEE_H_DEFINED_glGetBufferPointerv + typedef void (APIENTRYP GLEEPFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* * params); + GLEE_EXTERN GLEEPFNGLGETBUFFERPOINTERVPROC GLeeFuncPtr_glGetBufferPointerv; + #define glGetBufferPointerv GLeeFuncPtr_glGetBufferPointerv +#endif +#endif + +/* GL_VERSION_2_0 */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#define __GLEE_GL_VERSION_2_0 1 +/* Constants */ +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#ifndef GLEE_H_DEFINED_glBlendEquationSeparate +#define GLEE_H_DEFINED_glBlendEquationSeparate + typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); + GLEE_EXTERN GLEEPFNGLBLENDEQUATIONSEPARATEPROC GLeeFuncPtr_glBlendEquationSeparate; + #define glBlendEquationSeparate GLeeFuncPtr_glBlendEquationSeparate +#endif +#ifndef GLEE_H_DEFINED_glDrawBuffers +#define GLEE_H_DEFINED_glDrawBuffers + typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum * bufs); + GLEE_EXTERN GLEEPFNGLDRAWBUFFERSPROC GLeeFuncPtr_glDrawBuffers; + #define glDrawBuffers GLeeFuncPtr_glDrawBuffers +#endif +#ifndef GLEE_H_DEFINED_glStencilOpSeparate +#define GLEE_H_DEFINED_glStencilOpSeparate + typedef void (APIENTRYP GLEEPFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + GLEE_EXTERN GLEEPFNGLSTENCILOPSEPARATEPROC GLeeFuncPtr_glStencilOpSeparate; + #define glStencilOpSeparate GLeeFuncPtr_glStencilOpSeparate +#endif +#ifndef GLEE_H_DEFINED_glStencilFuncSeparate +#define GLEE_H_DEFINED_glStencilFuncSeparate + typedef void (APIENTRYP GLEEPFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); + GLEE_EXTERN GLEEPFNGLSTENCILFUNCSEPARATEPROC GLeeFuncPtr_glStencilFuncSeparate; + #define glStencilFuncSeparate GLeeFuncPtr_glStencilFuncSeparate +#endif +#ifndef GLEE_H_DEFINED_glStencilMaskSeparate +#define GLEE_H_DEFINED_glStencilMaskSeparate + typedef void (APIENTRYP GLEEPFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); + GLEE_EXTERN GLEEPFNGLSTENCILMASKSEPARATEPROC GLeeFuncPtr_glStencilMaskSeparate; + #define glStencilMaskSeparate GLeeFuncPtr_glStencilMaskSeparate +#endif +#ifndef GLEE_H_DEFINED_glAttachShader +#define GLEE_H_DEFINED_glAttachShader + typedef void (APIENTRYP GLEEPFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); + GLEE_EXTERN GLEEPFNGLATTACHSHADERPROC GLeeFuncPtr_glAttachShader; + #define glAttachShader GLeeFuncPtr_glAttachShader +#endif +#ifndef GLEE_H_DEFINED_glBindAttribLocation +#define GLEE_H_DEFINED_glBindAttribLocation + typedef void (APIENTRYP GLEEPFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar * name); + GLEE_EXTERN GLEEPFNGLBINDATTRIBLOCATIONPROC GLeeFuncPtr_glBindAttribLocation; + #define glBindAttribLocation GLeeFuncPtr_glBindAttribLocation +#endif +#ifndef GLEE_H_DEFINED_glCompileShader +#define GLEE_H_DEFINED_glCompileShader + typedef void (APIENTRYP GLEEPFNGLCOMPILESHADERPROC) (GLuint shader); + GLEE_EXTERN GLEEPFNGLCOMPILESHADERPROC GLeeFuncPtr_glCompileShader; + #define glCompileShader GLeeFuncPtr_glCompileShader +#endif +#ifndef GLEE_H_DEFINED_glCreateProgram +#define GLEE_H_DEFINED_glCreateProgram + typedef GLuint (APIENTRYP GLEEPFNGLCREATEPROGRAMPROC) (); + GLEE_EXTERN GLEEPFNGLCREATEPROGRAMPROC GLeeFuncPtr_glCreateProgram; + #define glCreateProgram GLeeFuncPtr_glCreateProgram +#endif +#ifndef GLEE_H_DEFINED_glCreateShader +#define GLEE_H_DEFINED_glCreateShader + typedef GLuint (APIENTRYP GLEEPFNGLCREATESHADERPROC) (GLenum type); + GLEE_EXTERN GLEEPFNGLCREATESHADERPROC GLeeFuncPtr_glCreateShader; + #define glCreateShader GLeeFuncPtr_glCreateShader +#endif +#ifndef GLEE_H_DEFINED_glDeleteProgram +#define GLEE_H_DEFINED_glDeleteProgram + typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMPROC) (GLuint program); + GLEE_EXTERN GLEEPFNGLDELETEPROGRAMPROC GLeeFuncPtr_glDeleteProgram; + #define glDeleteProgram GLeeFuncPtr_glDeleteProgram +#endif +#ifndef GLEE_H_DEFINED_glDeleteShader +#define GLEE_H_DEFINED_glDeleteShader + typedef void (APIENTRYP GLEEPFNGLDELETESHADERPROC) (GLuint shader); + GLEE_EXTERN GLEEPFNGLDELETESHADERPROC GLeeFuncPtr_glDeleteShader; + #define glDeleteShader GLeeFuncPtr_glDeleteShader +#endif +#ifndef GLEE_H_DEFINED_glDetachShader +#define GLEE_H_DEFINED_glDetachShader + typedef void (APIENTRYP GLEEPFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); + GLEE_EXTERN GLEEPFNGLDETACHSHADERPROC GLeeFuncPtr_glDetachShader; + #define glDetachShader GLeeFuncPtr_glDetachShader +#endif +#ifndef GLEE_H_DEFINED_glDisableVertexAttribArray +#define GLEE_H_DEFINED_glDisableVertexAttribArray + typedef void (APIENTRYP GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); + GLEE_EXTERN GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glDisableVertexAttribArray; + #define glDisableVertexAttribArray GLeeFuncPtr_glDisableVertexAttribArray +#endif +#ifndef GLEE_H_DEFINED_glEnableVertexAttribArray +#define GLEE_H_DEFINED_glEnableVertexAttribArray + typedef void (APIENTRYP GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); + GLEE_EXTERN GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glEnableVertexAttribArray; + #define glEnableVertexAttribArray GLeeFuncPtr_glEnableVertexAttribArray +#endif +#ifndef GLEE_H_DEFINED_glGetActiveAttrib +#define GLEE_H_DEFINED_glGetActiveAttrib + typedef void (APIENTRYP GLEEPFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); + GLEE_EXTERN GLEEPFNGLGETACTIVEATTRIBPROC GLeeFuncPtr_glGetActiveAttrib; + #define glGetActiveAttrib GLeeFuncPtr_glGetActiveAttrib +#endif +#ifndef GLEE_H_DEFINED_glGetActiveUniform +#define GLEE_H_DEFINED_glGetActiveUniform + typedef void (APIENTRYP GLEEPFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); + GLEE_EXTERN GLEEPFNGLGETACTIVEUNIFORMPROC GLeeFuncPtr_glGetActiveUniform; + #define glGetActiveUniform GLeeFuncPtr_glGetActiveUniform +#endif +#ifndef GLEE_H_DEFINED_glGetAttachedShaders +#define GLEE_H_DEFINED_glGetAttachedShaders + typedef void (APIENTRYP GLEEPFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj); + GLEE_EXTERN GLEEPFNGLGETATTACHEDSHADERSPROC GLeeFuncPtr_glGetAttachedShaders; + #define glGetAttachedShaders GLeeFuncPtr_glGetAttachedShaders +#endif +#ifndef GLEE_H_DEFINED_glGetAttribLocation +#define GLEE_H_DEFINED_glGetAttribLocation + typedef GLint (APIENTRYP GLEEPFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar * name); + GLEE_EXTERN GLEEPFNGLGETATTRIBLOCATIONPROC GLeeFuncPtr_glGetAttribLocation; + #define glGetAttribLocation GLeeFuncPtr_glGetAttribLocation +#endif +#ifndef GLEE_H_DEFINED_glGetProgramiv +#define GLEE_H_DEFINED_glGetProgramiv + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMIVPROC GLeeFuncPtr_glGetProgramiv; + #define glGetProgramiv GLeeFuncPtr_glGetProgramiv +#endif +#ifndef GLEE_H_DEFINED_glGetProgramInfoLog +#define GLEE_H_DEFINED_glGetProgramInfoLog + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); + GLEE_EXTERN GLEEPFNGLGETPROGRAMINFOLOGPROC GLeeFuncPtr_glGetProgramInfoLog; + #define glGetProgramInfoLog GLeeFuncPtr_glGetProgramInfoLog +#endif +#ifndef GLEE_H_DEFINED_glGetShaderiv +#define GLEE_H_DEFINED_glGetShaderiv + typedef void (APIENTRYP GLEEPFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETSHADERIVPROC GLeeFuncPtr_glGetShaderiv; + #define glGetShaderiv GLeeFuncPtr_glGetShaderiv +#endif +#ifndef GLEE_H_DEFINED_glGetShaderInfoLog +#define GLEE_H_DEFINED_glGetShaderInfoLog + typedef void (APIENTRYP GLEEPFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); + GLEE_EXTERN GLEEPFNGLGETSHADERINFOLOGPROC GLeeFuncPtr_glGetShaderInfoLog; + #define glGetShaderInfoLog GLeeFuncPtr_glGetShaderInfoLog +#endif +#ifndef GLEE_H_DEFINED_glGetShaderSource +#define GLEE_H_DEFINED_glGetShaderSource + typedef void (APIENTRYP GLEEPFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); + GLEE_EXTERN GLEEPFNGLGETSHADERSOURCEPROC GLeeFuncPtr_glGetShaderSource; + #define glGetShaderSource GLeeFuncPtr_glGetShaderSource +#endif +#ifndef GLEE_H_DEFINED_glGetUniformLocation +#define GLEE_H_DEFINED_glGetUniformLocation + typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar * name); + GLEE_EXTERN GLEEPFNGLGETUNIFORMLOCATIONPROC GLeeFuncPtr_glGetUniformLocation; + #define glGetUniformLocation GLeeFuncPtr_glGetUniformLocation +#endif +#ifndef GLEE_H_DEFINED_glGetUniformfv +#define GLEE_H_DEFINED_glGetUniformfv + typedef void (APIENTRYP GLEEPFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETUNIFORMFVPROC GLeeFuncPtr_glGetUniformfv; + #define glGetUniformfv GLeeFuncPtr_glGetUniformfv +#endif +#ifndef GLEE_H_DEFINED_glGetUniformiv +#define GLEE_H_DEFINED_glGetUniformiv + typedef void (APIENTRYP GLEEPFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint * params); + GLEE_EXTERN GLEEPFNGLGETUNIFORMIVPROC GLeeFuncPtr_glGetUniformiv; + #define glGetUniformiv GLeeFuncPtr_glGetUniformiv +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribdv +#define GLEE_H_DEFINED_glGetVertexAttribdv + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVPROC GLeeFuncPtr_glGetVertexAttribdv; + #define glGetVertexAttribdv GLeeFuncPtr_glGetVertexAttribdv +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribfv +#define GLEE_H_DEFINED_glGetVertexAttribfv + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVPROC GLeeFuncPtr_glGetVertexAttribfv; + #define glGetVertexAttribfv GLeeFuncPtr_glGetVertexAttribfv +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribiv +#define GLEE_H_DEFINED_glGetVertexAttribiv + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVPROC GLeeFuncPtr_glGetVertexAttribiv; + #define glGetVertexAttribiv GLeeFuncPtr_glGetVertexAttribiv +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribPointerv +#define GLEE_H_DEFINED_glGetVertexAttribPointerv + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC GLeeFuncPtr_glGetVertexAttribPointerv; + #define glGetVertexAttribPointerv GLeeFuncPtr_glGetVertexAttribPointerv +#endif +#ifndef GLEE_H_DEFINED_glIsProgram +#define GLEE_H_DEFINED_glIsProgram + typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMPROC) (GLuint program); + GLEE_EXTERN GLEEPFNGLISPROGRAMPROC GLeeFuncPtr_glIsProgram; + #define glIsProgram GLeeFuncPtr_glIsProgram +#endif +#ifndef GLEE_H_DEFINED_glIsShader +#define GLEE_H_DEFINED_glIsShader + typedef GLboolean (APIENTRYP GLEEPFNGLISSHADERPROC) (GLuint shader); + GLEE_EXTERN GLEEPFNGLISSHADERPROC GLeeFuncPtr_glIsShader; + #define glIsShader GLeeFuncPtr_glIsShader +#endif +#ifndef GLEE_H_DEFINED_glLinkProgram +#define GLEE_H_DEFINED_glLinkProgram + typedef void (APIENTRYP GLEEPFNGLLINKPROGRAMPROC) (GLuint program); + GLEE_EXTERN GLEEPFNGLLINKPROGRAMPROC GLeeFuncPtr_glLinkProgram; + #define glLinkProgram GLeeFuncPtr_glLinkProgram +#endif +#ifndef GLEE_H_DEFINED_glShaderSource +#define GLEE_H_DEFINED_glShaderSource + typedef void (APIENTRYP GLEEPFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* * string, const GLint * length); + GLEE_EXTERN GLEEPFNGLSHADERSOURCEPROC GLeeFuncPtr_glShaderSource; + #define glShaderSource GLeeFuncPtr_glShaderSource +#endif +#ifndef GLEE_H_DEFINED_glUseProgram +#define GLEE_H_DEFINED_glUseProgram + typedef void (APIENTRYP GLEEPFNGLUSEPROGRAMPROC) (GLuint program); + GLEE_EXTERN GLEEPFNGLUSEPROGRAMPROC GLeeFuncPtr_glUseProgram; + #define glUseProgram GLeeFuncPtr_glUseProgram +#endif +#ifndef GLEE_H_DEFINED_glUniform1f +#define GLEE_H_DEFINED_glUniform1f + typedef void (APIENTRYP GLEEPFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); + GLEE_EXTERN GLEEPFNGLUNIFORM1FPROC GLeeFuncPtr_glUniform1f; + #define glUniform1f GLeeFuncPtr_glUniform1f +#endif +#ifndef GLEE_H_DEFINED_glUniform2f +#define GLEE_H_DEFINED_glUniform2f + typedef void (APIENTRYP GLEEPFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); + GLEE_EXTERN GLEEPFNGLUNIFORM2FPROC GLeeFuncPtr_glUniform2f; + #define glUniform2f GLeeFuncPtr_glUniform2f +#endif +#ifndef GLEE_H_DEFINED_glUniform3f +#define GLEE_H_DEFINED_glUniform3f + typedef void (APIENTRYP GLEEPFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + GLEE_EXTERN GLEEPFNGLUNIFORM3FPROC GLeeFuncPtr_glUniform3f; + #define glUniform3f GLeeFuncPtr_glUniform3f +#endif +#ifndef GLEE_H_DEFINED_glUniform4f +#define GLEE_H_DEFINED_glUniform4f + typedef void (APIENTRYP GLEEPFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + GLEE_EXTERN GLEEPFNGLUNIFORM4FPROC GLeeFuncPtr_glUniform4f; + #define glUniform4f GLeeFuncPtr_glUniform4f +#endif +#ifndef GLEE_H_DEFINED_glUniform1i +#define GLEE_H_DEFINED_glUniform1i + typedef void (APIENTRYP GLEEPFNGLUNIFORM1IPROC) (GLint location, GLint v0); + GLEE_EXTERN GLEEPFNGLUNIFORM1IPROC GLeeFuncPtr_glUniform1i; + #define glUniform1i GLeeFuncPtr_glUniform1i +#endif +#ifndef GLEE_H_DEFINED_glUniform2i +#define GLEE_H_DEFINED_glUniform2i + typedef void (APIENTRYP GLEEPFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); + GLEE_EXTERN GLEEPFNGLUNIFORM2IPROC GLeeFuncPtr_glUniform2i; + #define glUniform2i GLeeFuncPtr_glUniform2i +#endif +#ifndef GLEE_H_DEFINED_glUniform3i +#define GLEE_H_DEFINED_glUniform3i + typedef void (APIENTRYP GLEEPFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); + GLEE_EXTERN GLEEPFNGLUNIFORM3IPROC GLeeFuncPtr_glUniform3i; + #define glUniform3i GLeeFuncPtr_glUniform3i +#endif +#ifndef GLEE_H_DEFINED_glUniform4i +#define GLEE_H_DEFINED_glUniform4i + typedef void (APIENTRYP GLEEPFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + GLEE_EXTERN GLEEPFNGLUNIFORM4IPROC GLeeFuncPtr_glUniform4i; + #define glUniform4i GLeeFuncPtr_glUniform4i +#endif +#ifndef GLEE_H_DEFINED_glUniform1fv +#define GLEE_H_DEFINED_glUniform1fv + typedef void (APIENTRYP GLEEPFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM1FVPROC GLeeFuncPtr_glUniform1fv; + #define glUniform1fv GLeeFuncPtr_glUniform1fv +#endif +#ifndef GLEE_H_DEFINED_glUniform2fv +#define GLEE_H_DEFINED_glUniform2fv + typedef void (APIENTRYP GLEEPFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM2FVPROC GLeeFuncPtr_glUniform2fv; + #define glUniform2fv GLeeFuncPtr_glUniform2fv +#endif +#ifndef GLEE_H_DEFINED_glUniform3fv +#define GLEE_H_DEFINED_glUniform3fv + typedef void (APIENTRYP GLEEPFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM3FVPROC GLeeFuncPtr_glUniform3fv; + #define glUniform3fv GLeeFuncPtr_glUniform3fv +#endif +#ifndef GLEE_H_DEFINED_glUniform4fv +#define GLEE_H_DEFINED_glUniform4fv + typedef void (APIENTRYP GLEEPFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM4FVPROC GLeeFuncPtr_glUniform4fv; + #define glUniform4fv GLeeFuncPtr_glUniform4fv +#endif +#ifndef GLEE_H_DEFINED_glUniform1iv +#define GLEE_H_DEFINED_glUniform1iv + typedef void (APIENTRYP GLEEPFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM1IVPROC GLeeFuncPtr_glUniform1iv; + #define glUniform1iv GLeeFuncPtr_glUniform1iv +#endif +#ifndef GLEE_H_DEFINED_glUniform2iv +#define GLEE_H_DEFINED_glUniform2iv + typedef void (APIENTRYP GLEEPFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM2IVPROC GLeeFuncPtr_glUniform2iv; + #define glUniform2iv GLeeFuncPtr_glUniform2iv +#endif +#ifndef GLEE_H_DEFINED_glUniform3iv +#define GLEE_H_DEFINED_glUniform3iv + typedef void (APIENTRYP GLEEPFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM3IVPROC GLeeFuncPtr_glUniform3iv; + #define glUniform3iv GLeeFuncPtr_glUniform3iv +#endif +#ifndef GLEE_H_DEFINED_glUniform4iv +#define GLEE_H_DEFINED_glUniform4iv + typedef void (APIENTRYP GLEEPFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM4IVPROC GLeeFuncPtr_glUniform4iv; + #define glUniform4iv GLeeFuncPtr_glUniform4iv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix2fv +#define GLEE_H_DEFINED_glUniformMatrix2fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2FVPROC GLeeFuncPtr_glUniformMatrix2fv; + #define glUniformMatrix2fv GLeeFuncPtr_glUniformMatrix2fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix3fv +#define GLEE_H_DEFINED_glUniformMatrix3fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3FVPROC GLeeFuncPtr_glUniformMatrix3fv; + #define glUniformMatrix3fv GLeeFuncPtr_glUniformMatrix3fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix4fv +#define GLEE_H_DEFINED_glUniformMatrix4fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4FVPROC GLeeFuncPtr_glUniformMatrix4fv; + #define glUniformMatrix4fv GLeeFuncPtr_glUniformMatrix4fv +#endif +#ifndef GLEE_H_DEFINED_glValidateProgram +#define GLEE_H_DEFINED_glValidateProgram + typedef void (APIENTRYP GLEEPFNGLVALIDATEPROGRAMPROC) (GLuint program); + GLEE_EXTERN GLEEPFNGLVALIDATEPROGRAMPROC GLeeFuncPtr_glValidateProgram; + #define glValidateProgram GLeeFuncPtr_glValidateProgram +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1d +#define GLEE_H_DEFINED_glVertexAttrib1d + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DPROC GLeeFuncPtr_glVertexAttrib1d; + #define glVertexAttrib1d GLeeFuncPtr_glVertexAttrib1d +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1dv +#define GLEE_H_DEFINED_glVertexAttrib1dv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVPROC GLeeFuncPtr_glVertexAttrib1dv; + #define glVertexAttrib1dv GLeeFuncPtr_glVertexAttrib1dv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1f +#define GLEE_H_DEFINED_glVertexAttrib1f + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FPROC GLeeFuncPtr_glVertexAttrib1f; + #define glVertexAttrib1f GLeeFuncPtr_glVertexAttrib1f +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1fv +#define GLEE_H_DEFINED_glVertexAttrib1fv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVPROC GLeeFuncPtr_glVertexAttrib1fv; + #define glVertexAttrib1fv GLeeFuncPtr_glVertexAttrib1fv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1s +#define GLEE_H_DEFINED_glVertexAttrib1s + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SPROC GLeeFuncPtr_glVertexAttrib1s; + #define glVertexAttrib1s GLeeFuncPtr_glVertexAttrib1s +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1sv +#define GLEE_H_DEFINED_glVertexAttrib1sv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVPROC GLeeFuncPtr_glVertexAttrib1sv; + #define glVertexAttrib1sv GLeeFuncPtr_glVertexAttrib1sv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2d +#define GLEE_H_DEFINED_glVertexAttrib2d + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DPROC GLeeFuncPtr_glVertexAttrib2d; + #define glVertexAttrib2d GLeeFuncPtr_glVertexAttrib2d +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2dv +#define GLEE_H_DEFINED_glVertexAttrib2dv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVPROC GLeeFuncPtr_glVertexAttrib2dv; + #define glVertexAttrib2dv GLeeFuncPtr_glVertexAttrib2dv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2f +#define GLEE_H_DEFINED_glVertexAttrib2f + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FPROC GLeeFuncPtr_glVertexAttrib2f; + #define glVertexAttrib2f GLeeFuncPtr_glVertexAttrib2f +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2fv +#define GLEE_H_DEFINED_glVertexAttrib2fv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVPROC GLeeFuncPtr_glVertexAttrib2fv; + #define glVertexAttrib2fv GLeeFuncPtr_glVertexAttrib2fv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2s +#define GLEE_H_DEFINED_glVertexAttrib2s + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SPROC GLeeFuncPtr_glVertexAttrib2s; + #define glVertexAttrib2s GLeeFuncPtr_glVertexAttrib2s +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2sv +#define GLEE_H_DEFINED_glVertexAttrib2sv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVPROC GLeeFuncPtr_glVertexAttrib2sv; + #define glVertexAttrib2sv GLeeFuncPtr_glVertexAttrib2sv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3d +#define GLEE_H_DEFINED_glVertexAttrib3d + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DPROC GLeeFuncPtr_glVertexAttrib3d; + #define glVertexAttrib3d GLeeFuncPtr_glVertexAttrib3d +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3dv +#define GLEE_H_DEFINED_glVertexAttrib3dv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVPROC GLeeFuncPtr_glVertexAttrib3dv; + #define glVertexAttrib3dv GLeeFuncPtr_glVertexAttrib3dv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3f +#define GLEE_H_DEFINED_glVertexAttrib3f + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FPROC GLeeFuncPtr_glVertexAttrib3f; + #define glVertexAttrib3f GLeeFuncPtr_glVertexAttrib3f +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3fv +#define GLEE_H_DEFINED_glVertexAttrib3fv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVPROC GLeeFuncPtr_glVertexAttrib3fv; + #define glVertexAttrib3fv GLeeFuncPtr_glVertexAttrib3fv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3s +#define GLEE_H_DEFINED_glVertexAttrib3s + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SPROC GLeeFuncPtr_glVertexAttrib3s; + #define glVertexAttrib3s GLeeFuncPtr_glVertexAttrib3s +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3sv +#define GLEE_H_DEFINED_glVertexAttrib3sv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVPROC GLeeFuncPtr_glVertexAttrib3sv; + #define glVertexAttrib3sv GLeeFuncPtr_glVertexAttrib3sv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Nbv +#define GLEE_H_DEFINED_glVertexAttrib4Nbv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NBVPROC GLeeFuncPtr_glVertexAttrib4Nbv; + #define glVertexAttrib4Nbv GLeeFuncPtr_glVertexAttrib4Nbv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Niv +#define GLEE_H_DEFINED_glVertexAttrib4Niv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NIVPROC GLeeFuncPtr_glVertexAttrib4Niv; + #define glVertexAttrib4Niv GLeeFuncPtr_glVertexAttrib4Niv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Nsv +#define GLEE_H_DEFINED_glVertexAttrib4Nsv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NSVPROC GLeeFuncPtr_glVertexAttrib4Nsv; + #define glVertexAttrib4Nsv GLeeFuncPtr_glVertexAttrib4Nsv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Nub +#define GLEE_H_DEFINED_glVertexAttrib4Nub + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBPROC GLeeFuncPtr_glVertexAttrib4Nub; + #define glVertexAttrib4Nub GLeeFuncPtr_glVertexAttrib4Nub +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Nubv +#define GLEE_H_DEFINED_glVertexAttrib4Nubv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBVPROC GLeeFuncPtr_glVertexAttrib4Nubv; + #define glVertexAttrib4Nubv GLeeFuncPtr_glVertexAttrib4Nubv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Nuiv +#define GLEE_H_DEFINED_glVertexAttrib4Nuiv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUIVPROC GLeeFuncPtr_glVertexAttrib4Nuiv; + #define glVertexAttrib4Nuiv GLeeFuncPtr_glVertexAttrib4Nuiv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4Nusv +#define GLEE_H_DEFINED_glVertexAttrib4Nusv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUSVPROC GLeeFuncPtr_glVertexAttrib4Nusv; + #define glVertexAttrib4Nusv GLeeFuncPtr_glVertexAttrib4Nusv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4bv +#define GLEE_H_DEFINED_glVertexAttrib4bv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4BVPROC GLeeFuncPtr_glVertexAttrib4bv; + #define glVertexAttrib4bv GLeeFuncPtr_glVertexAttrib4bv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4d +#define GLEE_H_DEFINED_glVertexAttrib4d + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DPROC GLeeFuncPtr_glVertexAttrib4d; + #define glVertexAttrib4d GLeeFuncPtr_glVertexAttrib4d +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4dv +#define GLEE_H_DEFINED_glVertexAttrib4dv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVPROC GLeeFuncPtr_glVertexAttrib4dv; + #define glVertexAttrib4dv GLeeFuncPtr_glVertexAttrib4dv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4f +#define GLEE_H_DEFINED_glVertexAttrib4f + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FPROC GLeeFuncPtr_glVertexAttrib4f; + #define glVertexAttrib4f GLeeFuncPtr_glVertexAttrib4f +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4fv +#define GLEE_H_DEFINED_glVertexAttrib4fv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVPROC GLeeFuncPtr_glVertexAttrib4fv; + #define glVertexAttrib4fv GLeeFuncPtr_glVertexAttrib4fv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4iv +#define GLEE_H_DEFINED_glVertexAttrib4iv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4IVPROC GLeeFuncPtr_glVertexAttrib4iv; + #define glVertexAttrib4iv GLeeFuncPtr_glVertexAttrib4iv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4s +#define GLEE_H_DEFINED_glVertexAttrib4s + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SPROC GLeeFuncPtr_glVertexAttrib4s; + #define glVertexAttrib4s GLeeFuncPtr_glVertexAttrib4s +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4sv +#define GLEE_H_DEFINED_glVertexAttrib4sv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVPROC GLeeFuncPtr_glVertexAttrib4sv; + #define glVertexAttrib4sv GLeeFuncPtr_glVertexAttrib4sv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4ubv +#define GLEE_H_DEFINED_glVertexAttrib4ubv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVPROC GLeeFuncPtr_glVertexAttrib4ubv; + #define glVertexAttrib4ubv GLeeFuncPtr_glVertexAttrib4ubv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4uiv +#define GLEE_H_DEFINED_glVertexAttrib4uiv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UIVPROC GLeeFuncPtr_glVertexAttrib4uiv; + #define glVertexAttrib4uiv GLeeFuncPtr_glVertexAttrib4uiv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4usv +#define GLEE_H_DEFINED_glVertexAttrib4usv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4USVPROC GLeeFuncPtr_glVertexAttrib4usv; + #define glVertexAttrib4usv GLeeFuncPtr_glVertexAttrib4usv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribPointer +#define GLEE_H_DEFINED_glVertexAttribPointer + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERPROC GLeeFuncPtr_glVertexAttribPointer; + #define glVertexAttribPointer GLeeFuncPtr_glVertexAttribPointer +#endif +#endif + +/* GL_VERSION_2_1 */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#define __GLEE_GL_VERSION_2_1 1 +/* Constants */ +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +#ifndef GLEE_H_DEFINED_glUniformMatrix2x3fv +#define GLEE_H_DEFINED_glUniformMatrix2x3fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2X3FVPROC GLeeFuncPtr_glUniformMatrix2x3fv; + #define glUniformMatrix2x3fv GLeeFuncPtr_glUniformMatrix2x3fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix3x2fv +#define GLEE_H_DEFINED_glUniformMatrix3x2fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3X2FVPROC GLeeFuncPtr_glUniformMatrix3x2fv; + #define glUniformMatrix3x2fv GLeeFuncPtr_glUniformMatrix3x2fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix2x4fv +#define GLEE_H_DEFINED_glUniformMatrix2x4fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2X4FVPROC GLeeFuncPtr_glUniformMatrix2x4fv; + #define glUniformMatrix2x4fv GLeeFuncPtr_glUniformMatrix2x4fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix4x2fv +#define GLEE_H_DEFINED_glUniformMatrix4x2fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4X2FVPROC GLeeFuncPtr_glUniformMatrix4x2fv; + #define glUniformMatrix4x2fv GLeeFuncPtr_glUniformMatrix4x2fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix3x4fv +#define GLEE_H_DEFINED_glUniformMatrix3x4fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3X4FVPROC GLeeFuncPtr_glUniformMatrix3x4fv; + #define glUniformMatrix3x4fv GLeeFuncPtr_glUniformMatrix3x4fv +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix4x3fv +#define GLEE_H_DEFINED_glUniformMatrix4x3fv + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4X3FVPROC GLeeFuncPtr_glUniformMatrix4x3fv; + #define glUniformMatrix4x3fv GLeeFuncPtr_glUniformMatrix4x3fv +#endif +#endif + +/* GL_VERSION_3_0 */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +#define __GLEE_GL_VERSION_3_0 1 +/* Constants */ +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_DEPTH_BUFFER 0x8223 +#define GL_STENCIL_BUFFER 0x8224 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#ifndef GLEE_H_DEFINED_glColorMaski +#define GLEE_H_DEFINED_glColorMaski + typedef void (APIENTRYP GLEEPFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); + GLEE_EXTERN GLEEPFNGLCOLORMASKIPROC GLeeFuncPtr_glColorMaski; + #define glColorMaski GLeeFuncPtr_glColorMaski +#endif +#ifndef GLEE_H_DEFINED_glGetBooleani_v +#define GLEE_H_DEFINED_glGetBooleani_v + typedef void (APIENTRYP GLEEPFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean * data); + GLEE_EXTERN GLEEPFNGLGETBOOLEANI_VPROC GLeeFuncPtr_glGetBooleani_v; + #define glGetBooleani_v GLeeFuncPtr_glGetBooleani_v +#endif +#ifndef GLEE_H_DEFINED_glGetIntegeri_v +#define GLEE_H_DEFINED_glGetIntegeri_v + typedef void (APIENTRYP GLEEPFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint * data); + GLEE_EXTERN GLEEPFNGLGETINTEGERI_VPROC GLeeFuncPtr_glGetIntegeri_v; + #define glGetIntegeri_v GLeeFuncPtr_glGetIntegeri_v +#endif +#ifndef GLEE_H_DEFINED_glEnablei +#define GLEE_H_DEFINED_glEnablei + typedef void (APIENTRYP GLEEPFNGLENABLEIPROC) (GLenum target, GLuint index); + GLEE_EXTERN GLEEPFNGLENABLEIPROC GLeeFuncPtr_glEnablei; + #define glEnablei GLeeFuncPtr_glEnablei +#endif +#ifndef GLEE_H_DEFINED_glDisablei +#define GLEE_H_DEFINED_glDisablei + typedef void (APIENTRYP GLEEPFNGLDISABLEIPROC) (GLenum target, GLuint index); + GLEE_EXTERN GLEEPFNGLDISABLEIPROC GLeeFuncPtr_glDisablei; + #define glDisablei GLeeFuncPtr_glDisablei +#endif +#ifndef GLEE_H_DEFINED_glIsEnabledi +#define GLEE_H_DEFINED_glIsEnabledi + typedef GLboolean (APIENTRYP GLEEPFNGLISENABLEDIPROC) (GLenum target, GLuint index); + GLEE_EXTERN GLEEPFNGLISENABLEDIPROC GLeeFuncPtr_glIsEnabledi; + #define glIsEnabledi GLeeFuncPtr_glIsEnabledi +#endif +#ifndef GLEE_H_DEFINED_glBeginTransformFeedback +#define GLEE_H_DEFINED_glBeginTransformFeedback + typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); + GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC GLeeFuncPtr_glBeginTransformFeedback; + #define glBeginTransformFeedback GLeeFuncPtr_glBeginTransformFeedback +#endif +#ifndef GLEE_H_DEFINED_glEndTransformFeedback +#define GLEE_H_DEFINED_glEndTransformFeedback + typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKPROC) (); + GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKPROC GLeeFuncPtr_glEndTransformFeedback; + #define glEndTransformFeedback GLeeFuncPtr_glEndTransformFeedback +#endif +#ifndef GLEE_H_DEFINED_glBindBufferRange +#define GLEE_H_DEFINED_glBindBufferRange + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGEPROC GLeeFuncPtr_glBindBufferRange; + #define glBindBufferRange GLeeFuncPtr_glBindBufferRange +#endif +#ifndef GLEE_H_DEFINED_glBindBufferBase +#define GLEE_H_DEFINED_glBindBufferBase + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); + GLEE_EXTERN GLEEPFNGLBINDBUFFERBASEPROC GLeeFuncPtr_glBindBufferBase; + #define glBindBufferBase GLeeFuncPtr_glBindBufferBase +#endif +#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryings +#define GLEE_H_DEFINED_glTransformFeedbackVaryings + typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); + GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC GLeeFuncPtr_glTransformFeedbackVaryings; + #define glTransformFeedbackVaryings GLeeFuncPtr_glTransformFeedbackVaryings +#endif +#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVarying +#define GLEE_H_DEFINED_glGetTransformFeedbackVarying + typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLint * location); + GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC GLeeFuncPtr_glGetTransformFeedbackVarying; + #define glGetTransformFeedbackVarying GLeeFuncPtr_glGetTransformFeedbackVarying +#endif +#ifndef GLEE_H_DEFINED_glClampColor +#define GLEE_H_DEFINED_glClampColor + typedef void (APIENTRYP GLEEPFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); + GLEE_EXTERN GLEEPFNGLCLAMPCOLORPROC GLeeFuncPtr_glClampColor; + #define glClampColor GLeeFuncPtr_glClampColor +#endif +#ifndef GLEE_H_DEFINED_glBeginConditionalRender +#define GLEE_H_DEFINED_glBeginConditionalRender + typedef void (APIENTRYP GLEEPFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); + GLEE_EXTERN GLEEPFNGLBEGINCONDITIONALRENDERPROC GLeeFuncPtr_glBeginConditionalRender; + #define glBeginConditionalRender GLeeFuncPtr_glBeginConditionalRender +#endif +#ifndef GLEE_H_DEFINED_glEndConditionalRender +#define GLEE_H_DEFINED_glEndConditionalRender + typedef void (APIENTRYP GLEEPFNGLENDCONDITIONALRENDERPROC) (); + GLEE_EXTERN GLEEPFNGLENDCONDITIONALRENDERPROC GLeeFuncPtr_glEndConditionalRender; + #define glEndConditionalRender GLeeFuncPtr_glEndConditionalRender +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1i +#define GLEE_H_DEFINED_glVertexAttribI1i + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IPROC GLeeFuncPtr_glVertexAttribI1i; + #define glVertexAttribI1i GLeeFuncPtr_glVertexAttribI1i +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2i +#define GLEE_H_DEFINED_glVertexAttribI2i + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IPROC GLeeFuncPtr_glVertexAttribI2i; + #define glVertexAttribI2i GLeeFuncPtr_glVertexAttribI2i +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3i +#define GLEE_H_DEFINED_glVertexAttribI3i + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IPROC GLeeFuncPtr_glVertexAttribI3i; + #define glVertexAttribI3i GLeeFuncPtr_glVertexAttribI3i +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4i +#define GLEE_H_DEFINED_glVertexAttribI4i + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IPROC GLeeFuncPtr_glVertexAttribI4i; + #define glVertexAttribI4i GLeeFuncPtr_glVertexAttribI4i +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1ui +#define GLEE_H_DEFINED_glVertexAttribI1ui + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIPROC GLeeFuncPtr_glVertexAttribI1ui; + #define glVertexAttribI1ui GLeeFuncPtr_glVertexAttribI1ui +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2ui +#define GLEE_H_DEFINED_glVertexAttribI2ui + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIPROC GLeeFuncPtr_glVertexAttribI2ui; + #define glVertexAttribI2ui GLeeFuncPtr_glVertexAttribI2ui +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3ui +#define GLEE_H_DEFINED_glVertexAttribI3ui + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIPROC GLeeFuncPtr_glVertexAttribI3ui; + #define glVertexAttribI3ui GLeeFuncPtr_glVertexAttribI3ui +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4ui +#define GLEE_H_DEFINED_glVertexAttribI4ui + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIPROC GLeeFuncPtr_glVertexAttribI4ui; + #define glVertexAttribI4ui GLeeFuncPtr_glVertexAttribI4ui +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1iv +#define GLEE_H_DEFINED_glVertexAttribI1iv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IVPROC GLeeFuncPtr_glVertexAttribI1iv; + #define glVertexAttribI1iv GLeeFuncPtr_glVertexAttribI1iv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2iv +#define GLEE_H_DEFINED_glVertexAttribI2iv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IVPROC GLeeFuncPtr_glVertexAttribI2iv; + #define glVertexAttribI2iv GLeeFuncPtr_glVertexAttribI2iv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3iv +#define GLEE_H_DEFINED_glVertexAttribI3iv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IVPROC GLeeFuncPtr_glVertexAttribI3iv; + #define glVertexAttribI3iv GLeeFuncPtr_glVertexAttribI3iv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4iv +#define GLEE_H_DEFINED_glVertexAttribI4iv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IVPROC GLeeFuncPtr_glVertexAttribI4iv; + #define glVertexAttribI4iv GLeeFuncPtr_glVertexAttribI4iv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1uiv +#define GLEE_H_DEFINED_glVertexAttribI1uiv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIVPROC GLeeFuncPtr_glVertexAttribI1uiv; + #define glVertexAttribI1uiv GLeeFuncPtr_glVertexAttribI1uiv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2uiv +#define GLEE_H_DEFINED_glVertexAttribI2uiv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIVPROC GLeeFuncPtr_glVertexAttribI2uiv; + #define glVertexAttribI2uiv GLeeFuncPtr_glVertexAttribI2uiv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3uiv +#define GLEE_H_DEFINED_glVertexAttribI3uiv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIVPROC GLeeFuncPtr_glVertexAttribI3uiv; + #define glVertexAttribI3uiv GLeeFuncPtr_glVertexAttribI3uiv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4uiv +#define GLEE_H_DEFINED_glVertexAttribI4uiv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIVPROC GLeeFuncPtr_glVertexAttribI4uiv; + #define glVertexAttribI4uiv GLeeFuncPtr_glVertexAttribI4uiv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4bv +#define GLEE_H_DEFINED_glVertexAttribI4bv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4BVPROC GLeeFuncPtr_glVertexAttribI4bv; + #define glVertexAttribI4bv GLeeFuncPtr_glVertexAttribI4bv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4sv +#define GLEE_H_DEFINED_glVertexAttribI4sv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4SVPROC GLeeFuncPtr_glVertexAttribI4sv; + #define glVertexAttribI4sv GLeeFuncPtr_glVertexAttribI4sv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4ubv +#define GLEE_H_DEFINED_glVertexAttribI4ubv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UBVPROC GLeeFuncPtr_glVertexAttribI4ubv; + #define glVertexAttribI4ubv GLeeFuncPtr_glVertexAttribI4ubv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4usv +#define GLEE_H_DEFINED_glVertexAttribI4usv + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4USVPROC GLeeFuncPtr_glVertexAttribI4usv; + #define glVertexAttribI4usv GLeeFuncPtr_glVertexAttribI4usv +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribIPointer +#define GLEE_H_DEFINED_glVertexAttribIPointer + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBIPOINTERPROC GLeeFuncPtr_glVertexAttribIPointer; + #define glVertexAttribIPointer GLeeFuncPtr_glVertexAttribIPointer +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribIiv +#define GLEE_H_DEFINED_glGetVertexAttribIiv + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIIVPROC GLeeFuncPtr_glGetVertexAttribIiv; + #define glGetVertexAttribIiv GLeeFuncPtr_glGetVertexAttribIiv +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribIuiv +#define GLEE_H_DEFINED_glGetVertexAttribIuiv + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIUIVPROC GLeeFuncPtr_glGetVertexAttribIuiv; + #define glGetVertexAttribIuiv GLeeFuncPtr_glGetVertexAttribIuiv +#endif +#ifndef GLEE_H_DEFINED_glGetUniformuiv +#define GLEE_H_DEFINED_glGetUniformuiv + typedef void (APIENTRYP GLEEPFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETUNIFORMUIVPROC GLeeFuncPtr_glGetUniformuiv; + #define glGetUniformuiv GLeeFuncPtr_glGetUniformuiv +#endif +#ifndef GLEE_H_DEFINED_glBindFragDataLocation +#define GLEE_H_DEFINED_glBindFragDataLocation + typedef void (APIENTRYP GLEEPFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar * name); + GLEE_EXTERN GLEEPFNGLBINDFRAGDATALOCATIONPROC GLeeFuncPtr_glBindFragDataLocation; + #define glBindFragDataLocation GLeeFuncPtr_glBindFragDataLocation +#endif +#ifndef GLEE_H_DEFINED_glGetFragDataLocation +#define GLEE_H_DEFINED_glGetFragDataLocation + typedef GLint (APIENTRYP GLEEPFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar * name); + GLEE_EXTERN GLEEPFNGLGETFRAGDATALOCATIONPROC GLeeFuncPtr_glGetFragDataLocation; + #define glGetFragDataLocation GLeeFuncPtr_glGetFragDataLocation +#endif +#ifndef GLEE_H_DEFINED_glUniform1ui +#define GLEE_H_DEFINED_glUniform1ui + typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); + GLEE_EXTERN GLEEPFNGLUNIFORM1UIPROC GLeeFuncPtr_glUniform1ui; + #define glUniform1ui GLeeFuncPtr_glUniform1ui +#endif +#ifndef GLEE_H_DEFINED_glUniform2ui +#define GLEE_H_DEFINED_glUniform2ui + typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); + GLEE_EXTERN GLEEPFNGLUNIFORM2UIPROC GLeeFuncPtr_glUniform2ui; + #define glUniform2ui GLeeFuncPtr_glUniform2ui +#endif +#ifndef GLEE_H_DEFINED_glUniform3ui +#define GLEE_H_DEFINED_glUniform3ui + typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); + GLEE_EXTERN GLEEPFNGLUNIFORM3UIPROC GLeeFuncPtr_glUniform3ui; + #define glUniform3ui GLeeFuncPtr_glUniform3ui +#endif +#ifndef GLEE_H_DEFINED_glUniform4ui +#define GLEE_H_DEFINED_glUniform4ui + typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + GLEE_EXTERN GLEEPFNGLUNIFORM4UIPROC GLeeFuncPtr_glUniform4ui; + #define glUniform4ui GLeeFuncPtr_glUniform4ui +#endif +#ifndef GLEE_H_DEFINED_glUniform1uiv +#define GLEE_H_DEFINED_glUniform1uiv + typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM1UIVPROC GLeeFuncPtr_glUniform1uiv; + #define glUniform1uiv GLeeFuncPtr_glUniform1uiv +#endif +#ifndef GLEE_H_DEFINED_glUniform2uiv +#define GLEE_H_DEFINED_glUniform2uiv + typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM2UIVPROC GLeeFuncPtr_glUniform2uiv; + #define glUniform2uiv GLeeFuncPtr_glUniform2uiv +#endif +#ifndef GLEE_H_DEFINED_glUniform3uiv +#define GLEE_H_DEFINED_glUniform3uiv + typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM3UIVPROC GLeeFuncPtr_glUniform3uiv; + #define glUniform3uiv GLeeFuncPtr_glUniform3uiv +#endif +#ifndef GLEE_H_DEFINED_glUniform4uiv +#define GLEE_H_DEFINED_glUniform4uiv + typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM4UIVPROC GLeeFuncPtr_glUniform4uiv; + #define glUniform4uiv GLeeFuncPtr_glUniform4uiv +#endif +#ifndef GLEE_H_DEFINED_glTexParameterIiv +#define GLEE_H_DEFINED_glTexParameterIiv + typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLTEXPARAMETERIIVPROC GLeeFuncPtr_glTexParameterIiv; + #define glTexParameterIiv GLeeFuncPtr_glTexParameterIiv +#endif +#ifndef GLEE_H_DEFINED_glTexParameterIuiv +#define GLEE_H_DEFINED_glTexParameterIuiv + typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint * params); + GLEE_EXTERN GLEEPFNGLTEXPARAMETERIUIVPROC GLeeFuncPtr_glTexParameterIuiv; + #define glTexParameterIuiv GLeeFuncPtr_glTexParameterIuiv +#endif +#ifndef GLEE_H_DEFINED_glGetTexParameterIiv +#define GLEE_H_DEFINED_glGetTexParameterIiv + typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIIVPROC GLeeFuncPtr_glGetTexParameterIiv; + #define glGetTexParameterIiv GLeeFuncPtr_glGetTexParameterIiv +#endif +#ifndef GLEE_H_DEFINED_glGetTexParameterIuiv +#define GLEE_H_DEFINED_glGetTexParameterIuiv + typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIUIVPROC GLeeFuncPtr_glGetTexParameterIuiv; + #define glGetTexParameterIuiv GLeeFuncPtr_glGetTexParameterIuiv +#endif +#ifndef GLEE_H_DEFINED_glClearBufferiv +#define GLEE_H_DEFINED_glClearBufferiv + typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint * value); + GLEE_EXTERN GLEEPFNGLCLEARBUFFERIVPROC GLeeFuncPtr_glClearBufferiv; + #define glClearBufferiv GLeeFuncPtr_glClearBufferiv +#endif +#ifndef GLEE_H_DEFINED_glClearBufferuiv +#define GLEE_H_DEFINED_glClearBufferuiv + typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint * value); + GLEE_EXTERN GLEEPFNGLCLEARBUFFERUIVPROC GLeeFuncPtr_glClearBufferuiv; + #define glClearBufferuiv GLeeFuncPtr_glClearBufferuiv +#endif +#ifndef GLEE_H_DEFINED_glClearBufferfv +#define GLEE_H_DEFINED_glClearBufferfv + typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLCLEARBUFFERFVPROC GLeeFuncPtr_glClearBufferfv; + #define glClearBufferfv GLeeFuncPtr_glClearBufferfv +#endif +#ifndef GLEE_H_DEFINED_glClearBufferfi +#define GLEE_H_DEFINED_glClearBufferfi + typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); + GLEE_EXTERN GLEEPFNGLCLEARBUFFERFIPROC GLeeFuncPtr_glClearBufferfi; + #define glClearBufferfi GLeeFuncPtr_glClearBufferfi +#endif +#ifndef GLEE_H_DEFINED_glGetStringi +#define GLEE_H_DEFINED_glGetStringi + typedef const GLubyte * (APIENTRYP GLEEPFNGLGETSTRINGIPROC) (GLenum name, GLuint index); + GLEE_EXTERN GLEEPFNGLGETSTRINGIPROC GLeeFuncPtr_glGetStringi; + #define glGetStringi GLeeFuncPtr_glGetStringi +#endif +#endif + +/* GL_ARB_multitexture */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#define __GLEE_GL_ARB_multitexture 1 +/* Constants */ +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#ifndef GLEE_H_DEFINED_glActiveTextureARB +#define GLEE_H_DEFINED_glActiveTextureARB + typedef void (APIENTRYP GLEEPFNGLACTIVETEXTUREARBPROC) (GLenum texture); + GLEE_EXTERN GLEEPFNGLACTIVETEXTUREARBPROC GLeeFuncPtr_glActiveTextureARB; + #define glActiveTextureARB GLeeFuncPtr_glActiveTextureARB +#endif +#ifndef GLEE_H_DEFINED_glClientActiveTextureARB +#define GLEE_H_DEFINED_glClientActiveTextureARB + typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); + GLEE_EXTERN GLEEPFNGLCLIENTACTIVETEXTUREARBPROC GLeeFuncPtr_glClientActiveTextureARB; + #define glClientActiveTextureARB GLeeFuncPtr_glClientActiveTextureARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1dARB +#define GLEE_H_DEFINED_glMultiTexCoord1dARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DARBPROC GLeeFuncPtr_glMultiTexCoord1dARB; + #define glMultiTexCoord1dARB GLeeFuncPtr_glMultiTexCoord1dARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1dvARB +#define GLEE_H_DEFINED_glMultiTexCoord1dvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DVARBPROC GLeeFuncPtr_glMultiTexCoord1dvARB; + #define glMultiTexCoord1dvARB GLeeFuncPtr_glMultiTexCoord1dvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1fARB +#define GLEE_H_DEFINED_glMultiTexCoord1fARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FARBPROC GLeeFuncPtr_glMultiTexCoord1fARB; + #define glMultiTexCoord1fARB GLeeFuncPtr_glMultiTexCoord1fARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1fvARB +#define GLEE_H_DEFINED_glMultiTexCoord1fvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FVARBPROC GLeeFuncPtr_glMultiTexCoord1fvARB; + #define glMultiTexCoord1fvARB GLeeFuncPtr_glMultiTexCoord1fvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1iARB +#define GLEE_H_DEFINED_glMultiTexCoord1iARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IARBPROC GLeeFuncPtr_glMultiTexCoord1iARB; + #define glMultiTexCoord1iARB GLeeFuncPtr_glMultiTexCoord1iARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1ivARB +#define GLEE_H_DEFINED_glMultiTexCoord1ivARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IVARBPROC GLeeFuncPtr_glMultiTexCoord1ivARB; + #define glMultiTexCoord1ivARB GLeeFuncPtr_glMultiTexCoord1ivARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1sARB +#define GLEE_H_DEFINED_glMultiTexCoord1sARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SARBPROC GLeeFuncPtr_glMultiTexCoord1sARB; + #define glMultiTexCoord1sARB GLeeFuncPtr_glMultiTexCoord1sARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1svARB +#define GLEE_H_DEFINED_glMultiTexCoord1svARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SVARBPROC GLeeFuncPtr_glMultiTexCoord1svARB; + #define glMultiTexCoord1svARB GLeeFuncPtr_glMultiTexCoord1svARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2dARB +#define GLEE_H_DEFINED_glMultiTexCoord2dARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DARBPROC GLeeFuncPtr_glMultiTexCoord2dARB; + #define glMultiTexCoord2dARB GLeeFuncPtr_glMultiTexCoord2dARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2dvARB +#define GLEE_H_DEFINED_glMultiTexCoord2dvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DVARBPROC GLeeFuncPtr_glMultiTexCoord2dvARB; + #define glMultiTexCoord2dvARB GLeeFuncPtr_glMultiTexCoord2dvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2fARB +#define GLEE_H_DEFINED_glMultiTexCoord2fARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FARBPROC GLeeFuncPtr_glMultiTexCoord2fARB; + #define glMultiTexCoord2fARB GLeeFuncPtr_glMultiTexCoord2fARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2fvARB +#define GLEE_H_DEFINED_glMultiTexCoord2fvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FVARBPROC GLeeFuncPtr_glMultiTexCoord2fvARB; + #define glMultiTexCoord2fvARB GLeeFuncPtr_glMultiTexCoord2fvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2iARB +#define GLEE_H_DEFINED_glMultiTexCoord2iARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IARBPROC GLeeFuncPtr_glMultiTexCoord2iARB; + #define glMultiTexCoord2iARB GLeeFuncPtr_glMultiTexCoord2iARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2ivARB +#define GLEE_H_DEFINED_glMultiTexCoord2ivARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IVARBPROC GLeeFuncPtr_glMultiTexCoord2ivARB; + #define glMultiTexCoord2ivARB GLeeFuncPtr_glMultiTexCoord2ivARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2sARB +#define GLEE_H_DEFINED_glMultiTexCoord2sARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SARBPROC GLeeFuncPtr_glMultiTexCoord2sARB; + #define glMultiTexCoord2sARB GLeeFuncPtr_glMultiTexCoord2sARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2svARB +#define GLEE_H_DEFINED_glMultiTexCoord2svARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SVARBPROC GLeeFuncPtr_glMultiTexCoord2svARB; + #define glMultiTexCoord2svARB GLeeFuncPtr_glMultiTexCoord2svARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3dARB +#define GLEE_H_DEFINED_glMultiTexCoord3dARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DARBPROC GLeeFuncPtr_glMultiTexCoord3dARB; + #define glMultiTexCoord3dARB GLeeFuncPtr_glMultiTexCoord3dARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3dvARB +#define GLEE_H_DEFINED_glMultiTexCoord3dvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DVARBPROC GLeeFuncPtr_glMultiTexCoord3dvARB; + #define glMultiTexCoord3dvARB GLeeFuncPtr_glMultiTexCoord3dvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3fARB +#define GLEE_H_DEFINED_glMultiTexCoord3fARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FARBPROC GLeeFuncPtr_glMultiTexCoord3fARB; + #define glMultiTexCoord3fARB GLeeFuncPtr_glMultiTexCoord3fARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3fvARB +#define GLEE_H_DEFINED_glMultiTexCoord3fvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FVARBPROC GLeeFuncPtr_glMultiTexCoord3fvARB; + #define glMultiTexCoord3fvARB GLeeFuncPtr_glMultiTexCoord3fvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3iARB +#define GLEE_H_DEFINED_glMultiTexCoord3iARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IARBPROC GLeeFuncPtr_glMultiTexCoord3iARB; + #define glMultiTexCoord3iARB GLeeFuncPtr_glMultiTexCoord3iARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3ivARB +#define GLEE_H_DEFINED_glMultiTexCoord3ivARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IVARBPROC GLeeFuncPtr_glMultiTexCoord3ivARB; + #define glMultiTexCoord3ivARB GLeeFuncPtr_glMultiTexCoord3ivARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3sARB +#define GLEE_H_DEFINED_glMultiTexCoord3sARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SARBPROC GLeeFuncPtr_glMultiTexCoord3sARB; + #define glMultiTexCoord3sARB GLeeFuncPtr_glMultiTexCoord3sARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3svARB +#define GLEE_H_DEFINED_glMultiTexCoord3svARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SVARBPROC GLeeFuncPtr_glMultiTexCoord3svARB; + #define glMultiTexCoord3svARB GLeeFuncPtr_glMultiTexCoord3svARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4dARB +#define GLEE_H_DEFINED_glMultiTexCoord4dARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DARBPROC GLeeFuncPtr_glMultiTexCoord4dARB; + #define glMultiTexCoord4dARB GLeeFuncPtr_glMultiTexCoord4dARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4dvARB +#define GLEE_H_DEFINED_glMultiTexCoord4dvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DVARBPROC GLeeFuncPtr_glMultiTexCoord4dvARB; + #define glMultiTexCoord4dvARB GLeeFuncPtr_glMultiTexCoord4dvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4fARB +#define GLEE_H_DEFINED_glMultiTexCoord4fARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FARBPROC GLeeFuncPtr_glMultiTexCoord4fARB; + #define glMultiTexCoord4fARB GLeeFuncPtr_glMultiTexCoord4fARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4fvARB +#define GLEE_H_DEFINED_glMultiTexCoord4fvARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FVARBPROC GLeeFuncPtr_glMultiTexCoord4fvARB; + #define glMultiTexCoord4fvARB GLeeFuncPtr_glMultiTexCoord4fvARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4iARB +#define GLEE_H_DEFINED_glMultiTexCoord4iARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IARBPROC GLeeFuncPtr_glMultiTexCoord4iARB; + #define glMultiTexCoord4iARB GLeeFuncPtr_glMultiTexCoord4iARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4ivARB +#define GLEE_H_DEFINED_glMultiTexCoord4ivARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IVARBPROC GLeeFuncPtr_glMultiTexCoord4ivARB; + #define glMultiTexCoord4ivARB GLeeFuncPtr_glMultiTexCoord4ivARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4sARB +#define GLEE_H_DEFINED_glMultiTexCoord4sARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SARBPROC GLeeFuncPtr_glMultiTexCoord4sARB; + #define glMultiTexCoord4sARB GLeeFuncPtr_glMultiTexCoord4sARB +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4svARB +#define GLEE_H_DEFINED_glMultiTexCoord4svARB + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SVARBPROC GLeeFuncPtr_glMultiTexCoord4svARB; + #define glMultiTexCoord4svARB GLeeFuncPtr_glMultiTexCoord4svARB +#endif +#endif + +/* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define __GLEE_GL_ARB_transpose_matrix 1 +/* Constants */ +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixfARB +#define GLEE_H_DEFINED_glLoadTransposeMatrixfARB + typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat * m); + GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glLoadTransposeMatrixfARB; + #define glLoadTransposeMatrixfARB GLeeFuncPtr_glLoadTransposeMatrixfARB +#endif +#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixdARB +#define GLEE_H_DEFINED_glLoadTransposeMatrixdARB + typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble * m); + GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glLoadTransposeMatrixdARB; + #define glLoadTransposeMatrixdARB GLeeFuncPtr_glLoadTransposeMatrixdARB +#endif +#ifndef GLEE_H_DEFINED_glMultTransposeMatrixfARB +#define GLEE_H_DEFINED_glMultTransposeMatrixfARB + typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat * m); + GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glMultTransposeMatrixfARB; + #define glMultTransposeMatrixfARB GLeeFuncPtr_glMultTransposeMatrixfARB +#endif +#ifndef GLEE_H_DEFINED_glMultTransposeMatrixdARB +#define GLEE_H_DEFINED_glMultTransposeMatrixdARB + typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble * m); + GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glMultTransposeMatrixdARB; + #define glMultTransposeMatrixdARB GLeeFuncPtr_glMultTransposeMatrixdARB +#endif +#endif + +/* GL_ARB_multisample */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define __GLEE_GL_ARB_multisample 1 +/* Constants */ +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#ifndef GLEE_H_DEFINED_glSampleCoverageARB +#define GLEE_H_DEFINED_glSampleCoverageARB + typedef void (APIENTRYP GLEEPFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + GLEE_EXTERN GLEEPFNGLSAMPLECOVERAGEARBPROC GLeeFuncPtr_glSampleCoverageARB; + #define glSampleCoverageARB GLeeFuncPtr_glSampleCoverageARB +#endif +#endif + +/* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#define __GLEE_GL_ARB_texture_env_add 1 +/* Constants */ +#endif + +/* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#define __GLEE_GL_ARB_texture_cube_map 1 +/* Constants */ +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +/* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define __GLEE_GL_ARB_texture_compression 1 +/* Constants */ +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#ifndef GLEE_H_DEFINED_glCompressedTexImage3DARB +#define GLEE_H_DEFINED_glCompressedTexImage3DARB + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexImage3DARB; + #define glCompressedTexImage3DARB GLeeFuncPtr_glCompressedTexImage3DARB +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexImage2DARB +#define GLEE_H_DEFINED_glCompressedTexImage2DARB + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexImage2DARB; + #define glCompressedTexImage2DARB GLeeFuncPtr_glCompressedTexImage2DARB +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexImage1DARB +#define GLEE_H_DEFINED_glCompressedTexImage1DARB + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexImage1DARB; + #define glCompressedTexImage1DARB GLeeFuncPtr_glCompressedTexImage1DARB +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexSubImage3DARB +#define GLEE_H_DEFINED_glCompressedTexSubImage3DARB + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexSubImage3DARB; + #define glCompressedTexSubImage3DARB GLeeFuncPtr_glCompressedTexSubImage3DARB +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexSubImage2DARB +#define GLEE_H_DEFINED_glCompressedTexSubImage2DARB + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexSubImage2DARB; + #define glCompressedTexSubImage2DARB GLeeFuncPtr_glCompressedTexSubImage2DARB +#endif +#ifndef GLEE_H_DEFINED_glCompressedTexSubImage1DARB +#define GLEE_H_DEFINED_glCompressedTexSubImage1DARB + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexSubImage1DARB; + #define glCompressedTexSubImage1DARB GLeeFuncPtr_glCompressedTexSubImage1DARB +#endif +#ifndef GLEE_H_DEFINED_glGetCompressedTexImageARB +#define GLEE_H_DEFINED_glGetCompressedTexImageARB + typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid * img); + GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLeeFuncPtr_glGetCompressedTexImageARB; + #define glGetCompressedTexImageARB GLeeFuncPtr_glGetCompressedTexImageARB +#endif +#endif + +/* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define __GLEE_GL_ARB_texture_border_clamp 1 +/* Constants */ +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +/* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define __GLEE_GL_ARB_point_parameters 1 +/* Constants */ +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#ifndef GLEE_H_DEFINED_glPointParameterfARB +#define GLEE_H_DEFINED_glPointParameterfARB + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFARBPROC GLeeFuncPtr_glPointParameterfARB; + #define glPointParameterfARB GLeeFuncPtr_glPointParameterfARB +#endif +#ifndef GLEE_H_DEFINED_glPointParameterfvARB +#define GLEE_H_DEFINED_glPointParameterfvARB + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVARBPROC GLeeFuncPtr_glPointParameterfvARB; + #define glPointParameterfvARB GLeeFuncPtr_glPointParameterfvARB +#endif +#endif + +/* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define __GLEE_GL_ARB_vertex_blend 1 +/* Constants */ +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#ifndef GLEE_H_DEFINED_glWeightbvARB +#define GLEE_H_DEFINED_glWeightbvARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTBVARBPROC GLeeFuncPtr_glWeightbvARB; + #define glWeightbvARB GLeeFuncPtr_glWeightbvARB +#endif +#ifndef GLEE_H_DEFINED_glWeightsvARB +#define GLEE_H_DEFINED_glWeightsvARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTSVARBPROC) (GLint size, const GLshort * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTSVARBPROC GLeeFuncPtr_glWeightsvARB; + #define glWeightsvARB GLeeFuncPtr_glWeightsvARB +#endif +#ifndef GLEE_H_DEFINED_glWeightivARB +#define GLEE_H_DEFINED_glWeightivARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTIVARBPROC) (GLint size, const GLint * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTIVARBPROC GLeeFuncPtr_glWeightivARB; + #define glWeightivARB GLeeFuncPtr_glWeightivARB +#endif +#ifndef GLEE_H_DEFINED_glWeightfvARB +#define GLEE_H_DEFINED_glWeightfvARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTFVARBPROC GLeeFuncPtr_glWeightfvARB; + #define glWeightfvARB GLeeFuncPtr_glWeightfvARB +#endif +#ifndef GLEE_H_DEFINED_glWeightdvARB +#define GLEE_H_DEFINED_glWeightdvARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTDVARBPROC GLeeFuncPtr_glWeightdvARB; + #define glWeightdvARB GLeeFuncPtr_glWeightdvARB +#endif +#ifndef GLEE_H_DEFINED_glWeightubvARB +#define GLEE_H_DEFINED_glWeightubvARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTUBVARBPROC GLeeFuncPtr_glWeightubvARB; + #define glWeightubvARB GLeeFuncPtr_glWeightubvARB +#endif +#ifndef GLEE_H_DEFINED_glWeightusvARB +#define GLEE_H_DEFINED_glWeightusvARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTUSVARBPROC GLeeFuncPtr_glWeightusvARB; + #define glWeightusvARB GLeeFuncPtr_glWeightusvARB +#endif +#ifndef GLEE_H_DEFINED_glWeightuivARB +#define GLEE_H_DEFINED_glWeightuivARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint * weights); + GLEE_EXTERN GLEEPFNGLWEIGHTUIVARBPROC GLeeFuncPtr_glWeightuivARB; + #define glWeightuivARB GLeeFuncPtr_glWeightuivARB +#endif +#ifndef GLEE_H_DEFINED_glWeightPointerARB +#define GLEE_H_DEFINED_glWeightPointerARB + typedef void (APIENTRYP GLEEPFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLWEIGHTPOINTERARBPROC GLeeFuncPtr_glWeightPointerARB; + #define glWeightPointerARB GLeeFuncPtr_glWeightPointerARB +#endif +#ifndef GLEE_H_DEFINED_glVertexBlendARB +#define GLEE_H_DEFINED_glVertexBlendARB + typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDARBPROC) (GLint count); + GLEE_EXTERN GLEEPFNGLVERTEXBLENDARBPROC GLeeFuncPtr_glVertexBlendARB; + #define glVertexBlendARB GLeeFuncPtr_glVertexBlendARB +#endif +#endif + +/* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define __GLEE_GL_ARB_matrix_palette 1 +/* Constants */ +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#ifndef GLEE_H_DEFINED_glCurrentPaletteMatrixARB +#define GLEE_H_DEFINED_glCurrentPaletteMatrixARB + typedef void (APIENTRYP GLEEPFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); + GLEE_EXTERN GLEEPFNGLCURRENTPALETTEMATRIXARBPROC GLeeFuncPtr_glCurrentPaletteMatrixARB; + #define glCurrentPaletteMatrixARB GLeeFuncPtr_glCurrentPaletteMatrixARB +#endif +#ifndef GLEE_H_DEFINED_glMatrixIndexubvARB +#define GLEE_H_DEFINED_glMatrixIndexubvARB + typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte * indices); + GLEE_EXTERN GLEEPFNGLMATRIXINDEXUBVARBPROC GLeeFuncPtr_glMatrixIndexubvARB; + #define glMatrixIndexubvARB GLeeFuncPtr_glMatrixIndexubvARB +#endif +#ifndef GLEE_H_DEFINED_glMatrixIndexusvARB +#define GLEE_H_DEFINED_glMatrixIndexusvARB + typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort * indices); + GLEE_EXTERN GLEEPFNGLMATRIXINDEXUSVARBPROC GLeeFuncPtr_glMatrixIndexusvARB; + #define glMatrixIndexusvARB GLeeFuncPtr_glMatrixIndexusvARB +#endif +#ifndef GLEE_H_DEFINED_glMatrixIndexuivARB +#define GLEE_H_DEFINED_glMatrixIndexuivARB + typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint * indices); + GLEE_EXTERN GLEEPFNGLMATRIXINDEXUIVARBPROC GLeeFuncPtr_glMatrixIndexuivARB; + #define glMatrixIndexuivARB GLeeFuncPtr_glMatrixIndexuivARB +#endif +#ifndef GLEE_H_DEFINED_glMatrixIndexPointerARB +#define GLEE_H_DEFINED_glMatrixIndexPointerARB + typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLMATRIXINDEXPOINTERARBPROC GLeeFuncPtr_glMatrixIndexPointerARB; + #define glMatrixIndexPointerARB GLeeFuncPtr_glMatrixIndexPointerARB +#endif +#endif + +/* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define __GLEE_GL_ARB_texture_env_combine 1 +/* Constants */ +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +/* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#define __GLEE_GL_ARB_texture_env_crossbar 1 +/* Constants */ +#endif + +/* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define __GLEE_GL_ARB_texture_env_dot3 1 +/* Constants */ +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +/* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define __GLEE_GL_ARB_texture_mirrored_repeat 1 +/* Constants */ +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +/* GL_ARB_depth_texture */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define __GLEE_GL_ARB_depth_texture 1 +/* Constants */ +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +/* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define __GLEE_GL_ARB_shadow 1 +/* Constants */ +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +/* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define __GLEE_GL_ARB_shadow_ambient 1 +/* Constants */ +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +/* GL_ARB_window_pos */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#define __GLEE_GL_ARB_window_pos 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glWindowPos2dARB +#define GLEE_H_DEFINED_glWindowPos2dARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2DARBPROC GLeeFuncPtr_glWindowPos2dARB; + #define glWindowPos2dARB GLeeFuncPtr_glWindowPos2dARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2dvARB +#define GLEE_H_DEFINED_glWindowPos2dvARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVARBPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVARBPROC GLeeFuncPtr_glWindowPos2dvARB; + #define glWindowPos2dvARB GLeeFuncPtr_glWindowPos2dvARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2fARB +#define GLEE_H_DEFINED_glWindowPos2fARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2FARBPROC GLeeFuncPtr_glWindowPos2fARB; + #define glWindowPos2fARB GLeeFuncPtr_glWindowPos2fARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2fvARB +#define GLEE_H_DEFINED_glWindowPos2fvARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVARBPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVARBPROC GLeeFuncPtr_glWindowPos2fvARB; + #define glWindowPos2fvARB GLeeFuncPtr_glWindowPos2fvARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2iARB +#define GLEE_H_DEFINED_glWindowPos2iARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2IARBPROC GLeeFuncPtr_glWindowPos2iARB; + #define glWindowPos2iARB GLeeFuncPtr_glWindowPos2iARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2ivARB +#define GLEE_H_DEFINED_glWindowPos2ivARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVARBPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVARBPROC GLeeFuncPtr_glWindowPos2ivARB; + #define glWindowPos2ivARB GLeeFuncPtr_glWindowPos2ivARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2sARB +#define GLEE_H_DEFINED_glWindowPos2sARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2SARBPROC GLeeFuncPtr_glWindowPos2sARB; + #define glWindowPos2sARB GLeeFuncPtr_glWindowPos2sARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2svARB +#define GLEE_H_DEFINED_glWindowPos2svARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVARBPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVARBPROC GLeeFuncPtr_glWindowPos2svARB; + #define glWindowPos2svARB GLeeFuncPtr_glWindowPos2svARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3dARB +#define GLEE_H_DEFINED_glWindowPos3dARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3DARBPROC GLeeFuncPtr_glWindowPos3dARB; + #define glWindowPos3dARB GLeeFuncPtr_glWindowPos3dARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3dvARB +#define GLEE_H_DEFINED_glWindowPos3dvARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVARBPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVARBPROC GLeeFuncPtr_glWindowPos3dvARB; + #define glWindowPos3dvARB GLeeFuncPtr_glWindowPos3dvARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3fARB +#define GLEE_H_DEFINED_glWindowPos3fARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3FARBPROC GLeeFuncPtr_glWindowPos3fARB; + #define glWindowPos3fARB GLeeFuncPtr_glWindowPos3fARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3fvARB +#define GLEE_H_DEFINED_glWindowPos3fvARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVARBPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVARBPROC GLeeFuncPtr_glWindowPos3fvARB; + #define glWindowPos3fvARB GLeeFuncPtr_glWindowPos3fvARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3iARB +#define GLEE_H_DEFINED_glWindowPos3iARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3IARBPROC GLeeFuncPtr_glWindowPos3iARB; + #define glWindowPos3iARB GLeeFuncPtr_glWindowPos3iARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3ivARB +#define GLEE_H_DEFINED_glWindowPos3ivARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVARBPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVARBPROC GLeeFuncPtr_glWindowPos3ivARB; + #define glWindowPos3ivARB GLeeFuncPtr_glWindowPos3ivARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3sARB +#define GLEE_H_DEFINED_glWindowPos3sARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3SARBPROC GLeeFuncPtr_glWindowPos3sARB; + #define glWindowPos3sARB GLeeFuncPtr_glWindowPos3sARB +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3svARB +#define GLEE_H_DEFINED_glWindowPos3svARB + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVARBPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVARBPROC GLeeFuncPtr_glWindowPos3svARB; + #define glWindowPos3svARB GLeeFuncPtr_glWindowPos3svARB +#endif +#endif + +/* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define __GLEE_GL_ARB_vertex_program 1 +/* Constants */ +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#ifndef GLEE_H_DEFINED_glVertexAttrib1dARB +#define GLEE_H_DEFINED_glVertexAttrib1dARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DARBPROC GLeeFuncPtr_glVertexAttrib1dARB; + #define glVertexAttrib1dARB GLeeFuncPtr_glVertexAttrib1dARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1dvARB +#define GLEE_H_DEFINED_glVertexAttrib1dvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVARBPROC GLeeFuncPtr_glVertexAttrib1dvARB; + #define glVertexAttrib1dvARB GLeeFuncPtr_glVertexAttrib1dvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1fARB +#define GLEE_H_DEFINED_glVertexAttrib1fARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FARBPROC GLeeFuncPtr_glVertexAttrib1fARB; + #define glVertexAttrib1fARB GLeeFuncPtr_glVertexAttrib1fARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1fvARB +#define GLEE_H_DEFINED_glVertexAttrib1fvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVARBPROC GLeeFuncPtr_glVertexAttrib1fvARB; + #define glVertexAttrib1fvARB GLeeFuncPtr_glVertexAttrib1fvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1sARB +#define GLEE_H_DEFINED_glVertexAttrib1sARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SARBPROC GLeeFuncPtr_glVertexAttrib1sARB; + #define glVertexAttrib1sARB GLeeFuncPtr_glVertexAttrib1sARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1svARB +#define GLEE_H_DEFINED_glVertexAttrib1svARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVARBPROC GLeeFuncPtr_glVertexAttrib1svARB; + #define glVertexAttrib1svARB GLeeFuncPtr_glVertexAttrib1svARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2dARB +#define GLEE_H_DEFINED_glVertexAttrib2dARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DARBPROC GLeeFuncPtr_glVertexAttrib2dARB; + #define glVertexAttrib2dARB GLeeFuncPtr_glVertexAttrib2dARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2dvARB +#define GLEE_H_DEFINED_glVertexAttrib2dvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVARBPROC GLeeFuncPtr_glVertexAttrib2dvARB; + #define glVertexAttrib2dvARB GLeeFuncPtr_glVertexAttrib2dvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2fARB +#define GLEE_H_DEFINED_glVertexAttrib2fARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FARBPROC GLeeFuncPtr_glVertexAttrib2fARB; + #define glVertexAttrib2fARB GLeeFuncPtr_glVertexAttrib2fARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2fvARB +#define GLEE_H_DEFINED_glVertexAttrib2fvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVARBPROC GLeeFuncPtr_glVertexAttrib2fvARB; + #define glVertexAttrib2fvARB GLeeFuncPtr_glVertexAttrib2fvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2sARB +#define GLEE_H_DEFINED_glVertexAttrib2sARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SARBPROC GLeeFuncPtr_glVertexAttrib2sARB; + #define glVertexAttrib2sARB GLeeFuncPtr_glVertexAttrib2sARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2svARB +#define GLEE_H_DEFINED_glVertexAttrib2svARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVARBPROC GLeeFuncPtr_glVertexAttrib2svARB; + #define glVertexAttrib2svARB GLeeFuncPtr_glVertexAttrib2svARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3dARB +#define GLEE_H_DEFINED_glVertexAttrib3dARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DARBPROC GLeeFuncPtr_glVertexAttrib3dARB; + #define glVertexAttrib3dARB GLeeFuncPtr_glVertexAttrib3dARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3dvARB +#define GLEE_H_DEFINED_glVertexAttrib3dvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVARBPROC GLeeFuncPtr_glVertexAttrib3dvARB; + #define glVertexAttrib3dvARB GLeeFuncPtr_glVertexAttrib3dvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3fARB +#define GLEE_H_DEFINED_glVertexAttrib3fARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FARBPROC GLeeFuncPtr_glVertexAttrib3fARB; + #define glVertexAttrib3fARB GLeeFuncPtr_glVertexAttrib3fARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3fvARB +#define GLEE_H_DEFINED_glVertexAttrib3fvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVARBPROC GLeeFuncPtr_glVertexAttrib3fvARB; + #define glVertexAttrib3fvARB GLeeFuncPtr_glVertexAttrib3fvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3sARB +#define GLEE_H_DEFINED_glVertexAttrib3sARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SARBPROC GLeeFuncPtr_glVertexAttrib3sARB; + #define glVertexAttrib3sARB GLeeFuncPtr_glVertexAttrib3sARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3svARB +#define GLEE_H_DEFINED_glVertexAttrib3svARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVARBPROC GLeeFuncPtr_glVertexAttrib3svARB; + #define glVertexAttrib3svARB GLeeFuncPtr_glVertexAttrib3svARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NbvARB +#define GLEE_H_DEFINED_glVertexAttrib4NbvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NBVARBPROC GLeeFuncPtr_glVertexAttrib4NbvARB; + #define glVertexAttrib4NbvARB GLeeFuncPtr_glVertexAttrib4NbvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NivARB +#define GLEE_H_DEFINED_glVertexAttrib4NivARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NIVARBPROC GLeeFuncPtr_glVertexAttrib4NivARB; + #define glVertexAttrib4NivARB GLeeFuncPtr_glVertexAttrib4NivARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NsvARB +#define GLEE_H_DEFINED_glVertexAttrib4NsvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NSVARBPROC GLeeFuncPtr_glVertexAttrib4NsvARB; + #define glVertexAttrib4NsvARB GLeeFuncPtr_glVertexAttrib4NsvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NubARB +#define GLEE_H_DEFINED_glVertexAttrib4NubARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBARBPROC GLeeFuncPtr_glVertexAttrib4NubARB; + #define glVertexAttrib4NubARB GLeeFuncPtr_glVertexAttrib4NubARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NubvARB +#define GLEE_H_DEFINED_glVertexAttrib4NubvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBVARBPROC GLeeFuncPtr_glVertexAttrib4NubvARB; + #define glVertexAttrib4NubvARB GLeeFuncPtr_glVertexAttrib4NubvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NuivARB +#define GLEE_H_DEFINED_glVertexAttrib4NuivARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUIVARBPROC GLeeFuncPtr_glVertexAttrib4NuivARB; + #define glVertexAttrib4NuivARB GLeeFuncPtr_glVertexAttrib4NuivARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4NusvARB +#define GLEE_H_DEFINED_glVertexAttrib4NusvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUSVARBPROC GLeeFuncPtr_glVertexAttrib4NusvARB; + #define glVertexAttrib4NusvARB GLeeFuncPtr_glVertexAttrib4NusvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4bvARB +#define GLEE_H_DEFINED_glVertexAttrib4bvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4BVARBPROC GLeeFuncPtr_glVertexAttrib4bvARB; + #define glVertexAttrib4bvARB GLeeFuncPtr_glVertexAttrib4bvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4dARB +#define GLEE_H_DEFINED_glVertexAttrib4dARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DARBPROC GLeeFuncPtr_glVertexAttrib4dARB; + #define glVertexAttrib4dARB GLeeFuncPtr_glVertexAttrib4dARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4dvARB +#define GLEE_H_DEFINED_glVertexAttrib4dvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVARBPROC GLeeFuncPtr_glVertexAttrib4dvARB; + #define glVertexAttrib4dvARB GLeeFuncPtr_glVertexAttrib4dvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4fARB +#define GLEE_H_DEFINED_glVertexAttrib4fARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FARBPROC GLeeFuncPtr_glVertexAttrib4fARB; + #define glVertexAttrib4fARB GLeeFuncPtr_glVertexAttrib4fARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4fvARB +#define GLEE_H_DEFINED_glVertexAttrib4fvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVARBPROC GLeeFuncPtr_glVertexAttrib4fvARB; + #define glVertexAttrib4fvARB GLeeFuncPtr_glVertexAttrib4fvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4ivARB +#define GLEE_H_DEFINED_glVertexAttrib4ivARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4IVARBPROC GLeeFuncPtr_glVertexAttrib4ivARB; + #define glVertexAttrib4ivARB GLeeFuncPtr_glVertexAttrib4ivARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4sARB +#define GLEE_H_DEFINED_glVertexAttrib4sARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SARBPROC GLeeFuncPtr_glVertexAttrib4sARB; + #define glVertexAttrib4sARB GLeeFuncPtr_glVertexAttrib4sARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4svARB +#define GLEE_H_DEFINED_glVertexAttrib4svARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVARBPROC GLeeFuncPtr_glVertexAttrib4svARB; + #define glVertexAttrib4svARB GLeeFuncPtr_glVertexAttrib4svARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4ubvARB +#define GLEE_H_DEFINED_glVertexAttrib4ubvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVARBPROC GLeeFuncPtr_glVertexAttrib4ubvARB; + #define glVertexAttrib4ubvARB GLeeFuncPtr_glVertexAttrib4ubvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4uivARB +#define GLEE_H_DEFINED_glVertexAttrib4uivARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UIVARBPROC GLeeFuncPtr_glVertexAttrib4uivARB; + #define glVertexAttrib4uivARB GLeeFuncPtr_glVertexAttrib4uivARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4usvARB +#define GLEE_H_DEFINED_glVertexAttrib4usvARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4USVARBPROC GLeeFuncPtr_glVertexAttrib4usvARB; + #define glVertexAttrib4usvARB GLeeFuncPtr_glVertexAttrib4usvARB +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribPointerARB +#define GLEE_H_DEFINED_glVertexAttribPointerARB + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERARBPROC GLeeFuncPtr_glVertexAttribPointerARB; + #define glVertexAttribPointerARB GLeeFuncPtr_glVertexAttribPointerARB +#endif +#ifndef GLEE_H_DEFINED_glEnableVertexAttribArrayARB +#define GLEE_H_DEFINED_glEnableVertexAttribArrayARB + typedef void (APIENTRYP GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); + GLEE_EXTERN GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glEnableVertexAttribArrayARB; + #define glEnableVertexAttribArrayARB GLeeFuncPtr_glEnableVertexAttribArrayARB +#endif +#ifndef GLEE_H_DEFINED_glDisableVertexAttribArrayARB +#define GLEE_H_DEFINED_glDisableVertexAttribArrayARB + typedef void (APIENTRYP GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); + GLEE_EXTERN GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glDisableVertexAttribArrayARB; + #define glDisableVertexAttribArrayARB GLeeFuncPtr_glDisableVertexAttribArrayARB +#endif +#ifndef GLEE_H_DEFINED_glProgramStringARB +#define GLEE_H_DEFINED_glProgramStringARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid * string); + GLEE_EXTERN GLEEPFNGLPROGRAMSTRINGARBPROC GLeeFuncPtr_glProgramStringARB; + #define glProgramStringARB GLeeFuncPtr_glProgramStringARB +#endif +#ifndef GLEE_H_DEFINED_glBindProgramARB +#define GLEE_H_DEFINED_glBindProgramARB + typedef void (APIENTRYP GLEEPFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); + GLEE_EXTERN GLEEPFNGLBINDPROGRAMARBPROC GLeeFuncPtr_glBindProgramARB; + #define glBindProgramARB GLeeFuncPtr_glBindProgramARB +#endif +#ifndef GLEE_H_DEFINED_glDeleteProgramsARB +#define GLEE_H_DEFINED_glDeleteProgramsARB + typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint * programs); + GLEE_EXTERN GLEEPFNGLDELETEPROGRAMSARBPROC GLeeFuncPtr_glDeleteProgramsARB; + #define glDeleteProgramsARB GLeeFuncPtr_glDeleteProgramsARB +#endif +#ifndef GLEE_H_DEFINED_glGenProgramsARB +#define GLEE_H_DEFINED_glGenProgramsARB + typedef void (APIENTRYP GLEEPFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint * programs); + GLEE_EXTERN GLEEPFNGLGENPROGRAMSARBPROC GLeeFuncPtr_glGenProgramsARB; + #define glGenProgramsARB GLeeFuncPtr_glGenProgramsARB +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameter4dARB +#define GLEE_H_DEFINED_glProgramEnvParameter4dARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC GLeeFuncPtr_glProgramEnvParameter4dARB; + #define glProgramEnvParameter4dARB GLeeFuncPtr_glProgramEnvParameter4dARB +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameter4dvARB +#define GLEE_H_DEFINED_glProgramEnvParameter4dvARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC GLeeFuncPtr_glProgramEnvParameter4dvARB; + #define glProgramEnvParameter4dvARB GLeeFuncPtr_glProgramEnvParameter4dvARB +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameter4fARB +#define GLEE_H_DEFINED_glProgramEnvParameter4fARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC GLeeFuncPtr_glProgramEnvParameter4fARB; + #define glProgramEnvParameter4fARB GLeeFuncPtr_glProgramEnvParameter4fARB +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameter4fvARB +#define GLEE_H_DEFINED_glProgramEnvParameter4fvARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC GLeeFuncPtr_glProgramEnvParameter4fvARB; + #define glProgramEnvParameter4fvARB GLeeFuncPtr_glProgramEnvParameter4fvARB +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameter4dARB +#define GLEE_H_DEFINED_glProgramLocalParameter4dARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC GLeeFuncPtr_glProgramLocalParameter4dARB; + #define glProgramLocalParameter4dARB GLeeFuncPtr_glProgramLocalParameter4dARB +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameter4dvARB +#define GLEE_H_DEFINED_glProgramLocalParameter4dvARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLeeFuncPtr_glProgramLocalParameter4dvARB; + #define glProgramLocalParameter4dvARB GLeeFuncPtr_glProgramLocalParameter4dvARB +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameter4fARB +#define GLEE_H_DEFINED_glProgramLocalParameter4fARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC GLeeFuncPtr_glProgramLocalParameter4fARB; + #define glProgramLocalParameter4fARB GLeeFuncPtr_glProgramLocalParameter4fARB +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameter4fvARB +#define GLEE_H_DEFINED_glProgramLocalParameter4fvARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLeeFuncPtr_glProgramLocalParameter4fvARB; + #define glProgramLocalParameter4fvARB GLeeFuncPtr_glProgramLocalParameter4fvARB +#endif +#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterdvARB +#define GLEE_H_DEFINED_glGetProgramEnvParameterdvARB + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramEnvParameterdvARB; + #define glGetProgramEnvParameterdvARB GLeeFuncPtr_glGetProgramEnvParameterdvARB +#endif +#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterfvARB +#define GLEE_H_DEFINED_glGetProgramEnvParameterfvARB + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramEnvParameterfvARB; + #define glGetProgramEnvParameterfvARB GLeeFuncPtr_glGetProgramEnvParameterfvARB +#endif +#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterdvARB +#define GLEE_H_DEFINED_glGetProgramLocalParameterdvARB + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramLocalParameterdvARB; + #define glGetProgramLocalParameterdvARB GLeeFuncPtr_glGetProgramLocalParameterdvARB +#endif +#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterfvARB +#define GLEE_H_DEFINED_glGetProgramLocalParameterfvARB + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramLocalParameterfvARB; + #define glGetProgramLocalParameterfvARB GLeeFuncPtr_glGetProgramLocalParameterfvARB +#endif +#ifndef GLEE_H_DEFINED_glGetProgramivARB +#define GLEE_H_DEFINED_glGetProgramivARB + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMIVARBPROC GLeeFuncPtr_glGetProgramivARB; + #define glGetProgramivARB GLeeFuncPtr_glGetProgramivARB +#endif +#ifndef GLEE_H_DEFINED_glGetProgramStringARB +#define GLEE_H_DEFINED_glGetProgramStringARB + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid * string); + GLEE_EXTERN GLEEPFNGLGETPROGRAMSTRINGARBPROC GLeeFuncPtr_glGetProgramStringARB; + #define glGetProgramStringARB GLeeFuncPtr_glGetProgramStringARB +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribdvARB +#define GLEE_H_DEFINED_glGetVertexAttribdvARB + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVARBPROC GLeeFuncPtr_glGetVertexAttribdvARB; + #define glGetVertexAttribdvARB GLeeFuncPtr_glGetVertexAttribdvARB +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribfvARB +#define GLEE_H_DEFINED_glGetVertexAttribfvARB + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVARBPROC GLeeFuncPtr_glGetVertexAttribfvARB; + #define glGetVertexAttribfvARB GLeeFuncPtr_glGetVertexAttribfvARB +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribivARB +#define GLEE_H_DEFINED_glGetVertexAttribivARB + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVARBPROC GLeeFuncPtr_glGetVertexAttribivARB; + #define glGetVertexAttribivARB GLeeFuncPtr_glGetVertexAttribivARB +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribPointervARB +#define GLEE_H_DEFINED_glGetVertexAttribPointervARB + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC GLeeFuncPtr_glGetVertexAttribPointervARB; + #define glGetVertexAttribPointervARB GLeeFuncPtr_glGetVertexAttribPointervARB +#endif +#ifndef GLEE_H_DEFINED_glIsProgramARB +#define GLEE_H_DEFINED_glIsProgramARB + typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMARBPROC) (GLuint program); + GLEE_EXTERN GLEEPFNGLISPROGRAMARBPROC GLeeFuncPtr_glIsProgramARB; + #define glIsProgramARB GLeeFuncPtr_glIsProgramARB +#endif +#endif + +/* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define __GLEE_GL_ARB_fragment_program 1 +/* Constants */ +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +/* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#define __GLEE_GL_ARB_vertex_buffer_object 1 +/* Constants */ +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#ifndef GLEE_H_DEFINED_glBindBufferARB +#define GLEE_H_DEFINED_glBindBufferARB + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); + GLEE_EXTERN GLEEPFNGLBINDBUFFERARBPROC GLeeFuncPtr_glBindBufferARB; + #define glBindBufferARB GLeeFuncPtr_glBindBufferARB +#endif +#ifndef GLEE_H_DEFINED_glDeleteBuffersARB +#define GLEE_H_DEFINED_glDeleteBuffersARB + typedef void (APIENTRYP GLEEPFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint * buffers); + GLEE_EXTERN GLEEPFNGLDELETEBUFFERSARBPROC GLeeFuncPtr_glDeleteBuffersARB; + #define glDeleteBuffersARB GLeeFuncPtr_glDeleteBuffersARB +#endif +#ifndef GLEE_H_DEFINED_glGenBuffersARB +#define GLEE_H_DEFINED_glGenBuffersARB + typedef void (APIENTRYP GLEEPFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint * buffers); + GLEE_EXTERN GLEEPFNGLGENBUFFERSARBPROC GLeeFuncPtr_glGenBuffersARB; + #define glGenBuffersARB GLeeFuncPtr_glGenBuffersARB +#endif +#ifndef GLEE_H_DEFINED_glIsBufferARB +#define GLEE_H_DEFINED_glIsBufferARB + typedef GLboolean (APIENTRYP GLEEPFNGLISBUFFERARBPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLISBUFFERARBPROC GLeeFuncPtr_glIsBufferARB; + #define glIsBufferARB GLeeFuncPtr_glIsBufferARB +#endif +#ifndef GLEE_H_DEFINED_glBufferDataARB +#define GLEE_H_DEFINED_glBufferDataARB + typedef void (APIENTRYP GLEEPFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); + GLEE_EXTERN GLEEPFNGLBUFFERDATAARBPROC GLeeFuncPtr_glBufferDataARB; + #define glBufferDataARB GLeeFuncPtr_glBufferDataARB +#endif +#ifndef GLEE_H_DEFINED_glBufferSubDataARB +#define GLEE_H_DEFINED_glBufferSubDataARB + typedef void (APIENTRYP GLEEPFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLBUFFERSUBDATAARBPROC GLeeFuncPtr_glBufferSubDataARB; + #define glBufferSubDataARB GLeeFuncPtr_glBufferSubDataARB +#endif +#ifndef GLEE_H_DEFINED_glGetBufferSubDataARB +#define GLEE_H_DEFINED_glGetBufferSubDataARB + typedef void (APIENTRYP GLEEPFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data); + GLEE_EXTERN GLEEPFNGLGETBUFFERSUBDATAARBPROC GLeeFuncPtr_glGetBufferSubDataARB; + #define glGetBufferSubDataARB GLeeFuncPtr_glGetBufferSubDataARB +#endif +#ifndef GLEE_H_DEFINED_glMapBufferARB +#define GLEE_H_DEFINED_glMapBufferARB + typedef GLvoid* (APIENTRYP GLEEPFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); + GLEE_EXTERN GLEEPFNGLMAPBUFFERARBPROC GLeeFuncPtr_glMapBufferARB; + #define glMapBufferARB GLeeFuncPtr_glMapBufferARB +#endif +#ifndef GLEE_H_DEFINED_glUnmapBufferARB +#define GLEE_H_DEFINED_glUnmapBufferARB + typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPBUFFERARBPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLUNMAPBUFFERARBPROC GLeeFuncPtr_glUnmapBufferARB; + #define glUnmapBufferARB GLeeFuncPtr_glUnmapBufferARB +#endif +#ifndef GLEE_H_DEFINED_glGetBufferParameterivARB +#define GLEE_H_DEFINED_glGetBufferParameterivARB + typedef void (APIENTRYP GLEEPFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETBUFFERPARAMETERIVARBPROC GLeeFuncPtr_glGetBufferParameterivARB; + #define glGetBufferParameterivARB GLeeFuncPtr_glGetBufferParameterivARB +#endif +#ifndef GLEE_H_DEFINED_glGetBufferPointervARB +#define GLEE_H_DEFINED_glGetBufferPointervARB + typedef void (APIENTRYP GLEEPFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* * params); + GLEE_EXTERN GLEEPFNGLGETBUFFERPOINTERVARBPROC GLeeFuncPtr_glGetBufferPointervARB; + #define glGetBufferPointervARB GLeeFuncPtr_glGetBufferPointervARB +#endif +#endif + +/* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define __GLEE_GL_ARB_occlusion_query 1 +/* Constants */ +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#ifndef GLEE_H_DEFINED_glGenQueriesARB +#define GLEE_H_DEFINED_glGenQueriesARB + typedef void (APIENTRYP GLEEPFNGLGENQUERIESARBPROC) (GLsizei n, GLuint * ids); + GLEE_EXTERN GLEEPFNGLGENQUERIESARBPROC GLeeFuncPtr_glGenQueriesARB; + #define glGenQueriesARB GLeeFuncPtr_glGenQueriesARB +#endif +#ifndef GLEE_H_DEFINED_glDeleteQueriesARB +#define GLEE_H_DEFINED_glDeleteQueriesARB + typedef void (APIENTRYP GLEEPFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint * ids); + GLEE_EXTERN GLEEPFNGLDELETEQUERIESARBPROC GLeeFuncPtr_glDeleteQueriesARB; + #define glDeleteQueriesARB GLeeFuncPtr_glDeleteQueriesARB +#endif +#ifndef GLEE_H_DEFINED_glIsQueryARB +#define GLEE_H_DEFINED_glIsQueryARB + typedef GLboolean (APIENTRYP GLEEPFNGLISQUERYARBPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLISQUERYARBPROC GLeeFuncPtr_glIsQueryARB; + #define glIsQueryARB GLeeFuncPtr_glIsQueryARB +#endif +#ifndef GLEE_H_DEFINED_glBeginQueryARB +#define GLEE_H_DEFINED_glBeginQueryARB + typedef void (APIENTRYP GLEEPFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); + GLEE_EXTERN GLEEPFNGLBEGINQUERYARBPROC GLeeFuncPtr_glBeginQueryARB; + #define glBeginQueryARB GLeeFuncPtr_glBeginQueryARB +#endif +#ifndef GLEE_H_DEFINED_glEndQueryARB +#define GLEE_H_DEFINED_glEndQueryARB + typedef void (APIENTRYP GLEEPFNGLENDQUERYARBPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLENDQUERYARBPROC GLeeFuncPtr_glEndQueryARB; + #define glEndQueryARB GLeeFuncPtr_glEndQueryARB +#endif +#ifndef GLEE_H_DEFINED_glGetQueryivARB +#define GLEE_H_DEFINED_glGetQueryivARB + typedef void (APIENTRYP GLEEPFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETQUERYIVARBPROC GLeeFuncPtr_glGetQueryivARB; + #define glGetQueryivARB GLeeFuncPtr_glGetQueryivARB +#endif +#ifndef GLEE_H_DEFINED_glGetQueryObjectivARB +#define GLEE_H_DEFINED_glGetQueryObjectivARB + typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTIVARBPROC GLeeFuncPtr_glGetQueryObjectivARB; + #define glGetQueryObjectivARB GLeeFuncPtr_glGetQueryObjectivARB +#endif +#ifndef GLEE_H_DEFINED_glGetQueryObjectuivARB +#define GLEE_H_DEFINED_glGetQueryObjectuivARB + typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUIVARBPROC GLeeFuncPtr_glGetQueryObjectuivARB; + #define glGetQueryObjectuivARB GLeeFuncPtr_glGetQueryObjectuivARB +#endif +#endif + +/* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#define __GLEE_GL_ARB_shader_objects 1 +/* Constants */ +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#ifndef GLEE_H_DEFINED_glDeleteObjectARB +#define GLEE_H_DEFINED_glDeleteObjectARB + typedef void (APIENTRYP GLEEPFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); + GLEE_EXTERN GLEEPFNGLDELETEOBJECTARBPROC GLeeFuncPtr_glDeleteObjectARB; + #define glDeleteObjectARB GLeeFuncPtr_glDeleteObjectARB +#endif +#ifndef GLEE_H_DEFINED_glGetHandleARB +#define GLEE_H_DEFINED_glGetHandleARB + typedef GLhandleARB (APIENTRYP GLEEPFNGLGETHANDLEARBPROC) (GLenum pname); + GLEE_EXTERN GLEEPFNGLGETHANDLEARBPROC GLeeFuncPtr_glGetHandleARB; + #define glGetHandleARB GLeeFuncPtr_glGetHandleARB +#endif +#ifndef GLEE_H_DEFINED_glDetachObjectARB +#define GLEE_H_DEFINED_glDetachObjectARB + typedef void (APIENTRYP GLEEPFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); + GLEE_EXTERN GLEEPFNGLDETACHOBJECTARBPROC GLeeFuncPtr_glDetachObjectARB; + #define glDetachObjectARB GLeeFuncPtr_glDetachObjectARB +#endif +#ifndef GLEE_H_DEFINED_glCreateShaderObjectARB +#define GLEE_H_DEFINED_glCreateShaderObjectARB + typedef GLhandleARB (APIENTRYP GLEEPFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); + GLEE_EXTERN GLEEPFNGLCREATESHADEROBJECTARBPROC GLeeFuncPtr_glCreateShaderObjectARB; + #define glCreateShaderObjectARB GLeeFuncPtr_glCreateShaderObjectARB +#endif +#ifndef GLEE_H_DEFINED_glShaderSourceARB +#define GLEE_H_DEFINED_glShaderSourceARB + typedef void (APIENTRYP GLEEPFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* * string, const GLint * length); + GLEE_EXTERN GLEEPFNGLSHADERSOURCEARBPROC GLeeFuncPtr_glShaderSourceARB; + #define glShaderSourceARB GLeeFuncPtr_glShaderSourceARB +#endif +#ifndef GLEE_H_DEFINED_glCompileShaderARB +#define GLEE_H_DEFINED_glCompileShaderARB + typedef void (APIENTRYP GLEEPFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); + GLEE_EXTERN GLEEPFNGLCOMPILESHADERARBPROC GLeeFuncPtr_glCompileShaderARB; + #define glCompileShaderARB GLeeFuncPtr_glCompileShaderARB +#endif +#ifndef GLEE_H_DEFINED_glCreateProgramObjectARB +#define GLEE_H_DEFINED_glCreateProgramObjectARB + typedef GLhandleARB (APIENTRYP GLEEPFNGLCREATEPROGRAMOBJECTARBPROC) (); + GLEE_EXTERN GLEEPFNGLCREATEPROGRAMOBJECTARBPROC GLeeFuncPtr_glCreateProgramObjectARB; + #define glCreateProgramObjectARB GLeeFuncPtr_glCreateProgramObjectARB +#endif +#ifndef GLEE_H_DEFINED_glAttachObjectARB +#define GLEE_H_DEFINED_glAttachObjectARB + typedef void (APIENTRYP GLEEPFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); + GLEE_EXTERN GLEEPFNGLATTACHOBJECTARBPROC GLeeFuncPtr_glAttachObjectARB; + #define glAttachObjectARB GLeeFuncPtr_glAttachObjectARB +#endif +#ifndef GLEE_H_DEFINED_glLinkProgramARB +#define GLEE_H_DEFINED_glLinkProgramARB + typedef void (APIENTRYP GLEEPFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); + GLEE_EXTERN GLEEPFNGLLINKPROGRAMARBPROC GLeeFuncPtr_glLinkProgramARB; + #define glLinkProgramARB GLeeFuncPtr_glLinkProgramARB +#endif +#ifndef GLEE_H_DEFINED_glUseProgramObjectARB +#define GLEE_H_DEFINED_glUseProgramObjectARB + typedef void (APIENTRYP GLEEPFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); + GLEE_EXTERN GLEEPFNGLUSEPROGRAMOBJECTARBPROC GLeeFuncPtr_glUseProgramObjectARB; + #define glUseProgramObjectARB GLeeFuncPtr_glUseProgramObjectARB +#endif +#ifndef GLEE_H_DEFINED_glValidateProgramARB +#define GLEE_H_DEFINED_glValidateProgramARB + typedef void (APIENTRYP GLEEPFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + GLEE_EXTERN GLEEPFNGLVALIDATEPROGRAMARBPROC GLeeFuncPtr_glValidateProgramARB; + #define glValidateProgramARB GLeeFuncPtr_glValidateProgramARB +#endif +#ifndef GLEE_H_DEFINED_glUniform1fARB +#define GLEE_H_DEFINED_glUniform1fARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); + GLEE_EXTERN GLEEPFNGLUNIFORM1FARBPROC GLeeFuncPtr_glUniform1fARB; + #define glUniform1fARB GLeeFuncPtr_glUniform1fARB +#endif +#ifndef GLEE_H_DEFINED_glUniform2fARB +#define GLEE_H_DEFINED_glUniform2fARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); + GLEE_EXTERN GLEEPFNGLUNIFORM2FARBPROC GLeeFuncPtr_glUniform2fARB; + #define glUniform2fARB GLeeFuncPtr_glUniform2fARB +#endif +#ifndef GLEE_H_DEFINED_glUniform3fARB +#define GLEE_H_DEFINED_glUniform3fARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + GLEE_EXTERN GLEEPFNGLUNIFORM3FARBPROC GLeeFuncPtr_glUniform3fARB; + #define glUniform3fARB GLeeFuncPtr_glUniform3fARB +#endif +#ifndef GLEE_H_DEFINED_glUniform4fARB +#define GLEE_H_DEFINED_glUniform4fARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + GLEE_EXTERN GLEEPFNGLUNIFORM4FARBPROC GLeeFuncPtr_glUniform4fARB; + #define glUniform4fARB GLeeFuncPtr_glUniform4fARB +#endif +#ifndef GLEE_H_DEFINED_glUniform1iARB +#define GLEE_H_DEFINED_glUniform1iARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); + GLEE_EXTERN GLEEPFNGLUNIFORM1IARBPROC GLeeFuncPtr_glUniform1iARB; + #define glUniform1iARB GLeeFuncPtr_glUniform1iARB +#endif +#ifndef GLEE_H_DEFINED_glUniform2iARB +#define GLEE_H_DEFINED_glUniform2iARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); + GLEE_EXTERN GLEEPFNGLUNIFORM2IARBPROC GLeeFuncPtr_glUniform2iARB; + #define glUniform2iARB GLeeFuncPtr_glUniform2iARB +#endif +#ifndef GLEE_H_DEFINED_glUniform3iARB +#define GLEE_H_DEFINED_glUniform3iARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); + GLEE_EXTERN GLEEPFNGLUNIFORM3IARBPROC GLeeFuncPtr_glUniform3iARB; + #define glUniform3iARB GLeeFuncPtr_glUniform3iARB +#endif +#ifndef GLEE_H_DEFINED_glUniform4iARB +#define GLEE_H_DEFINED_glUniform4iARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + GLEE_EXTERN GLEEPFNGLUNIFORM4IARBPROC GLeeFuncPtr_glUniform4iARB; + #define glUniform4iARB GLeeFuncPtr_glUniform4iARB +#endif +#ifndef GLEE_H_DEFINED_glUniform1fvARB +#define GLEE_H_DEFINED_glUniform1fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM1FVARBPROC GLeeFuncPtr_glUniform1fvARB; + #define glUniform1fvARB GLeeFuncPtr_glUniform1fvARB +#endif +#ifndef GLEE_H_DEFINED_glUniform2fvARB +#define GLEE_H_DEFINED_glUniform2fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM2FVARBPROC GLeeFuncPtr_glUniform2fvARB; + #define glUniform2fvARB GLeeFuncPtr_glUniform2fvARB +#endif +#ifndef GLEE_H_DEFINED_glUniform3fvARB +#define GLEE_H_DEFINED_glUniform3fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM3FVARBPROC GLeeFuncPtr_glUniform3fvARB; + #define glUniform3fvARB GLeeFuncPtr_glUniform3fvARB +#endif +#ifndef GLEE_H_DEFINED_glUniform4fvARB +#define GLEE_H_DEFINED_glUniform4fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORM4FVARBPROC GLeeFuncPtr_glUniform4fvARB; + #define glUniform4fvARB GLeeFuncPtr_glUniform4fvARB +#endif +#ifndef GLEE_H_DEFINED_glUniform1ivARB +#define GLEE_H_DEFINED_glUniform1ivARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM1IVARBPROC GLeeFuncPtr_glUniform1ivARB; + #define glUniform1ivARB GLeeFuncPtr_glUniform1ivARB +#endif +#ifndef GLEE_H_DEFINED_glUniform2ivARB +#define GLEE_H_DEFINED_glUniform2ivARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM2IVARBPROC GLeeFuncPtr_glUniform2ivARB; + #define glUniform2ivARB GLeeFuncPtr_glUniform2ivARB +#endif +#ifndef GLEE_H_DEFINED_glUniform3ivARB +#define GLEE_H_DEFINED_glUniform3ivARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM3IVARBPROC GLeeFuncPtr_glUniform3ivARB; + #define glUniform3ivARB GLeeFuncPtr_glUniform3ivARB +#endif +#ifndef GLEE_H_DEFINED_glUniform4ivARB +#define GLEE_H_DEFINED_glUniform4ivARB + typedef void (APIENTRYP GLEEPFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM4IVARBPROC GLeeFuncPtr_glUniform4ivARB; + #define glUniform4ivARB GLeeFuncPtr_glUniform4ivARB +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix2fvARB +#define GLEE_H_DEFINED_glUniformMatrix2fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2FVARBPROC GLeeFuncPtr_glUniformMatrix2fvARB; + #define glUniformMatrix2fvARB GLeeFuncPtr_glUniformMatrix2fvARB +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix3fvARB +#define GLEE_H_DEFINED_glUniformMatrix3fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3FVARBPROC GLeeFuncPtr_glUniformMatrix3fvARB; + #define glUniformMatrix3fvARB GLeeFuncPtr_glUniformMatrix3fvARB +#endif +#ifndef GLEE_H_DEFINED_glUniformMatrix4fvARB +#define GLEE_H_DEFINED_glUniformMatrix4fvARB + typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4FVARBPROC GLeeFuncPtr_glUniformMatrix4fvARB; + #define glUniformMatrix4fvARB GLeeFuncPtr_glUniformMatrix4fvARB +#endif +#ifndef GLEE_H_DEFINED_glGetObjectParameterfvARB +#define GLEE_H_DEFINED_glGetObjectParameterfvARB + typedef void (APIENTRYP GLEEPFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETOBJECTPARAMETERFVARBPROC GLeeFuncPtr_glGetObjectParameterfvARB; + #define glGetObjectParameterfvARB GLeeFuncPtr_glGetObjectParameterfvARB +#endif +#ifndef GLEE_H_DEFINED_glGetObjectParameterivARB +#define GLEE_H_DEFINED_glGetObjectParameterivARB + typedef void (APIENTRYP GLEEPFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETOBJECTPARAMETERIVARBPROC GLeeFuncPtr_glGetObjectParameterivARB; + #define glGetObjectParameterivARB GLeeFuncPtr_glGetObjectParameterivARB +#endif +#ifndef GLEE_H_DEFINED_glGetInfoLogARB +#define GLEE_H_DEFINED_glGetInfoLogARB + typedef void (APIENTRYP GLEEPFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); + GLEE_EXTERN GLEEPFNGLGETINFOLOGARBPROC GLeeFuncPtr_glGetInfoLogARB; + #define glGetInfoLogARB GLeeFuncPtr_glGetInfoLogARB +#endif +#ifndef GLEE_H_DEFINED_glGetAttachedObjectsARB +#define GLEE_H_DEFINED_glGetAttachedObjectsARB + typedef void (APIENTRYP GLEEPFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj); + GLEE_EXTERN GLEEPFNGLGETATTACHEDOBJECTSARBPROC GLeeFuncPtr_glGetAttachedObjectsARB; + #define glGetAttachedObjectsARB GLeeFuncPtr_glGetAttachedObjectsARB +#endif +#ifndef GLEE_H_DEFINED_glGetUniformLocationARB +#define GLEE_H_DEFINED_glGetUniformLocationARB + typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB * name); + GLEE_EXTERN GLEEPFNGLGETUNIFORMLOCATIONARBPROC GLeeFuncPtr_glGetUniformLocationARB; + #define glGetUniformLocationARB GLeeFuncPtr_glGetUniformLocationARB +#endif +#ifndef GLEE_H_DEFINED_glGetActiveUniformARB +#define GLEE_H_DEFINED_glGetActiveUniformARB + typedef void (APIENTRYP GLEEPFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); + GLEE_EXTERN GLEEPFNGLGETACTIVEUNIFORMARBPROC GLeeFuncPtr_glGetActiveUniformARB; + #define glGetActiveUniformARB GLeeFuncPtr_glGetActiveUniformARB +#endif +#ifndef GLEE_H_DEFINED_glGetUniformfvARB +#define GLEE_H_DEFINED_glGetUniformfvARB + typedef void (APIENTRYP GLEEPFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETUNIFORMFVARBPROC GLeeFuncPtr_glGetUniformfvARB; + #define glGetUniformfvARB GLeeFuncPtr_glGetUniformfvARB +#endif +#ifndef GLEE_H_DEFINED_glGetUniformivARB +#define GLEE_H_DEFINED_glGetUniformivARB + typedef void (APIENTRYP GLEEPFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint * params); + GLEE_EXTERN GLEEPFNGLGETUNIFORMIVARBPROC GLeeFuncPtr_glGetUniformivARB; + #define glGetUniformivARB GLeeFuncPtr_glGetUniformivARB +#endif +#ifndef GLEE_H_DEFINED_glGetShaderSourceARB +#define GLEE_H_DEFINED_glGetShaderSourceARB + typedef void (APIENTRYP GLEEPFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source); + GLEE_EXTERN GLEEPFNGLGETSHADERSOURCEARBPROC GLeeFuncPtr_glGetShaderSourceARB; + #define glGetShaderSourceARB GLeeFuncPtr_glGetShaderSourceARB +#endif +#endif + +/* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define __GLEE_GL_ARB_vertex_shader 1 +/* Constants */ +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#ifndef GLEE_H_DEFINED_glBindAttribLocationARB +#define GLEE_H_DEFINED_glBindAttribLocationARB + typedef void (APIENTRYP GLEEPFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB * name); + GLEE_EXTERN GLEEPFNGLBINDATTRIBLOCATIONARBPROC GLeeFuncPtr_glBindAttribLocationARB; + #define glBindAttribLocationARB GLeeFuncPtr_glBindAttribLocationARB +#endif +#ifndef GLEE_H_DEFINED_glGetActiveAttribARB +#define GLEE_H_DEFINED_glGetActiveAttribARB + typedef void (APIENTRYP GLEEPFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); + GLEE_EXTERN GLEEPFNGLGETACTIVEATTRIBARBPROC GLeeFuncPtr_glGetActiveAttribARB; + #define glGetActiveAttribARB GLeeFuncPtr_glGetActiveAttribARB +#endif +#ifndef GLEE_H_DEFINED_glGetAttribLocationARB +#define GLEE_H_DEFINED_glGetAttribLocationARB + typedef GLint (APIENTRYP GLEEPFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB * name); + GLEE_EXTERN GLEEPFNGLGETATTRIBLOCATIONARBPROC GLeeFuncPtr_glGetAttribLocationARB; + #define glGetAttribLocationARB GLeeFuncPtr_glGetAttribLocationARB +#endif +#endif + +/* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define __GLEE_GL_ARB_fragment_shader 1 +/* Constants */ +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +/* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define __GLEE_GL_ARB_shading_language_100 1 +/* Constants */ +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +/* GL_ARB_texture_non_power_of_two */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#define __GLEE_GL_ARB_texture_non_power_of_two 1 +/* Constants */ +#endif + +/* GL_ARB_point_sprite */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define __GLEE_GL_ARB_point_sprite 1 +/* Constants */ +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +/* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#define __GLEE_GL_ARB_fragment_program_shadow 1 +/* Constants */ +#endif + +/* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define __GLEE_GL_ARB_draw_buffers 1 +/* Constants */ +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#ifndef GLEE_H_DEFINED_glDrawBuffersARB +#define GLEE_H_DEFINED_glDrawBuffersARB + typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum * bufs); + GLEE_EXTERN GLEEPFNGLDRAWBUFFERSARBPROC GLeeFuncPtr_glDrawBuffersARB; + #define glDrawBuffersARB GLeeFuncPtr_glDrawBuffersARB +#endif +#endif + +/* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define __GLEE_GL_ARB_texture_rectangle 1 +/* Constants */ +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +/* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define __GLEE_GL_ARB_color_buffer_float 1 +/* Constants */ +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#ifndef GLEE_H_DEFINED_glClampColorARB +#define GLEE_H_DEFINED_glClampColorARB + typedef void (APIENTRYP GLEEPFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + GLEE_EXTERN GLEEPFNGLCLAMPCOLORARBPROC GLeeFuncPtr_glClampColorARB; + #define glClampColorARB GLeeFuncPtr_glClampColorARB +#endif +#endif + +/* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#define __GLEE_GL_ARB_half_float_pixel 1 +/* Constants */ +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +/* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define __GLEE_GL_ARB_texture_float 1 +/* Constants */ +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +/* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define __GLEE_GL_ARB_pixel_buffer_object 1 +/* Constants */ +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +/* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#define __GLEE_GL_ARB_depth_buffer_float 1 +/* Constants */ +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#endif + +/* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +#define __GLEE_GL_ARB_draw_instanced 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glDrawArraysInstancedARB +#define GLEE_H_DEFINED_glDrawArraysInstancedARB + typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC GLeeFuncPtr_glDrawArraysInstancedARB; + #define glDrawArraysInstancedARB GLeeFuncPtr_glDrawArraysInstancedARB +#endif +#ifndef GLEE_H_DEFINED_glDrawElementsInstancedARB +#define GLEE_H_DEFINED_glDrawElementsInstancedARB + typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC GLeeFuncPtr_glDrawElementsInstancedARB; + #define glDrawElementsInstancedARB GLeeFuncPtr_glDrawElementsInstancedARB +#endif +#endif + +/* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#define __GLEE_GL_ARB_framebuffer_object 1 +/* Constants */ +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_INDEX 0x8222 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#ifndef GLEE_H_DEFINED_glIsRenderbuffer +#define GLEE_H_DEFINED_glIsRenderbuffer + typedef GLboolean (APIENTRYP GLEEPFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLISRENDERBUFFERPROC GLeeFuncPtr_glIsRenderbuffer; + #define glIsRenderbuffer GLeeFuncPtr_glIsRenderbuffer +#endif +#ifndef GLEE_H_DEFINED_glBindRenderbuffer +#define GLEE_H_DEFINED_glBindRenderbuffer + typedef void (APIENTRYP GLEEPFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLBINDRENDERBUFFERPROC GLeeFuncPtr_glBindRenderbuffer; + #define glBindRenderbuffer GLeeFuncPtr_glBindRenderbuffer +#endif +#ifndef GLEE_H_DEFINED_glDeleteRenderbuffers +#define GLEE_H_DEFINED_glDeleteRenderbuffers + typedef void (APIENTRYP GLEEPFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint * renderbuffers); + GLEE_EXTERN GLEEPFNGLDELETERENDERBUFFERSPROC GLeeFuncPtr_glDeleteRenderbuffers; + #define glDeleteRenderbuffers GLeeFuncPtr_glDeleteRenderbuffers +#endif +#ifndef GLEE_H_DEFINED_glGenRenderbuffers +#define GLEE_H_DEFINED_glGenRenderbuffers + typedef void (APIENTRYP GLEEPFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint * renderbuffers); + GLEE_EXTERN GLEEPFNGLGENRENDERBUFFERSPROC GLeeFuncPtr_glGenRenderbuffers; + #define glGenRenderbuffers GLeeFuncPtr_glGenRenderbuffers +#endif +#ifndef GLEE_H_DEFINED_glRenderbufferStorage +#define GLEE_H_DEFINED_glRenderbufferStorage + typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEPROC GLeeFuncPtr_glRenderbufferStorage; + #define glRenderbufferStorage GLeeFuncPtr_glRenderbufferStorage +#endif +#ifndef GLEE_H_DEFINED_glGetRenderbufferParameteriv +#define GLEE_H_DEFINED_glGetRenderbufferParameteriv + typedef void (APIENTRYP GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetRenderbufferParameteriv; + #define glGetRenderbufferParameteriv GLeeFuncPtr_glGetRenderbufferParameteriv +#endif +#ifndef GLEE_H_DEFINED_glIsFramebuffer +#define GLEE_H_DEFINED_glIsFramebuffer + typedef GLboolean (APIENTRYP GLEEPFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); + GLEE_EXTERN GLEEPFNGLISFRAMEBUFFERPROC GLeeFuncPtr_glIsFramebuffer; + #define glIsFramebuffer GLeeFuncPtr_glIsFramebuffer +#endif +#ifndef GLEE_H_DEFINED_glBindFramebuffer +#define GLEE_H_DEFINED_glBindFramebuffer + typedef void (APIENTRYP GLEEPFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); + GLEE_EXTERN GLEEPFNGLBINDFRAMEBUFFERPROC GLeeFuncPtr_glBindFramebuffer; + #define glBindFramebuffer GLeeFuncPtr_glBindFramebuffer +#endif +#ifndef GLEE_H_DEFINED_glDeleteFramebuffers +#define GLEE_H_DEFINED_glDeleteFramebuffers + typedef void (APIENTRYP GLEEPFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint * framebuffers); + GLEE_EXTERN GLEEPFNGLDELETEFRAMEBUFFERSPROC GLeeFuncPtr_glDeleteFramebuffers; + #define glDeleteFramebuffers GLeeFuncPtr_glDeleteFramebuffers +#endif +#ifndef GLEE_H_DEFINED_glGenFramebuffers +#define GLEE_H_DEFINED_glGenFramebuffers + typedef void (APIENTRYP GLEEPFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint * framebuffers); + GLEE_EXTERN GLEEPFNGLGENFRAMEBUFFERSPROC GLeeFuncPtr_glGenFramebuffers; + #define glGenFramebuffers GLeeFuncPtr_glGenFramebuffers +#endif +#ifndef GLEE_H_DEFINED_glCheckFramebufferStatus +#define GLEE_H_DEFINED_glCheckFramebufferStatus + typedef GLenum (APIENTRYP GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC GLeeFuncPtr_glCheckFramebufferStatus; + #define glCheckFramebufferStatus GLeeFuncPtr_glCheckFramebufferStatus +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTexture1D +#define GLEE_H_DEFINED_glFramebufferTexture1D + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC GLeeFuncPtr_glFramebufferTexture1D; + #define glFramebufferTexture1D GLeeFuncPtr_glFramebufferTexture1D +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTexture2D +#define GLEE_H_DEFINED_glFramebufferTexture2D + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC GLeeFuncPtr_glFramebufferTexture2D; + #define glFramebufferTexture2D GLeeFuncPtr_glFramebufferTexture2D +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTexture3D +#define GLEE_H_DEFINED_glFramebufferTexture3D + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC GLeeFuncPtr_glFramebufferTexture3D; + #define glFramebufferTexture3D GLeeFuncPtr_glFramebufferTexture3D +#endif +#ifndef GLEE_H_DEFINED_glFramebufferRenderbuffer +#define GLEE_H_DEFINED_glFramebufferRenderbuffer + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC GLeeFuncPtr_glFramebufferRenderbuffer; + #define glFramebufferRenderbuffer GLeeFuncPtr_glFramebufferRenderbuffer +#endif +#ifndef GLEE_H_DEFINED_glGetFramebufferAttachmentParameteriv +#define GLEE_H_DEFINED_glGetFramebufferAttachmentParameteriv + typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GLeeFuncPtr_glGetFramebufferAttachmentParameteriv; + #define glGetFramebufferAttachmentParameteriv GLeeFuncPtr_glGetFramebufferAttachmentParameteriv +#endif +#ifndef GLEE_H_DEFINED_glGenerateMipmap +#define GLEE_H_DEFINED_glGenerateMipmap + typedef void (APIENTRYP GLEEPFNGLGENERATEMIPMAPPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLGENERATEMIPMAPPROC GLeeFuncPtr_glGenerateMipmap; + #define glGenerateMipmap GLeeFuncPtr_glGenerateMipmap +#endif +#ifndef GLEE_H_DEFINED_glBlitFramebuffer +#define GLEE_H_DEFINED_glBlitFramebuffer + typedef void (APIENTRYP GLEEPFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + GLEE_EXTERN GLEEPFNGLBLITFRAMEBUFFERPROC GLeeFuncPtr_glBlitFramebuffer; + #define glBlitFramebuffer GLeeFuncPtr_glBlitFramebuffer +#endif +#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisample +#define GLEE_H_DEFINED_glRenderbufferStorageMultisample + typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC GLeeFuncPtr_glRenderbufferStorageMultisample; + #define glRenderbufferStorageMultisample GLeeFuncPtr_glRenderbufferStorageMultisample +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureLayer +#define GLEE_H_DEFINED_glFramebufferTextureLayer + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC GLeeFuncPtr_glFramebufferTextureLayer; + #define glFramebufferTextureLayer GLeeFuncPtr_glFramebufferTextureLayer +#endif +#endif + +/* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#define __GLEE_GL_ARB_framebuffer_sRGB 1 +/* Constants */ +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#endif + +/* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define __GLEE_GL_ARB_geometry_shader4 1 +/* Constants */ +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +#ifndef GLEE_H_DEFINED_glProgramParameteriARB +#define GLEE_H_DEFINED_glProgramParameteriARB + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERIARBPROC GLeeFuncPtr_glProgramParameteriARB; + #define glProgramParameteriARB GLeeFuncPtr_glProgramParameteriARB +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureARB +#define GLEE_H_DEFINED_glFramebufferTextureARB + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC GLeeFuncPtr_glFramebufferTextureARB; + #define glFramebufferTextureARB GLeeFuncPtr_glFramebufferTextureARB +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerARB +#define GLEE_H_DEFINED_glFramebufferTextureLayerARB + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC GLeeFuncPtr_glFramebufferTextureLayerARB; + #define glFramebufferTextureLayerARB GLeeFuncPtr_glFramebufferTextureLayerARB +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceARB +#define GLEE_H_DEFINED_glFramebufferTextureFaceARB + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC GLeeFuncPtr_glFramebufferTextureFaceARB; + #define glFramebufferTextureFaceARB GLeeFuncPtr_glFramebufferTextureFaceARB +#endif +#endif + +/* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#define __GLEE_GL_ARB_half_float_vertex 1 +/* Constants */ +#define GL_HALF_FLOAT 0x140B +#endif + +/* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define __GLEE_GL_ARB_instanced_arrays 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glVertexAttribDivisor +#define GLEE_H_DEFINED_glVertexAttribDivisor + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBDIVISORPROC GLeeFuncPtr_glVertexAttribDivisor; + #define glVertexAttribDivisor GLeeFuncPtr_glVertexAttribDivisor +#endif +#endif + +/* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#define __GLEE_GL_ARB_map_buffer_range 1 +/* Constants */ +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#ifndef GLEE_H_DEFINED_glMapBufferRange +#define GLEE_H_DEFINED_glMapBufferRange + typedef void (APIENTRYP GLEEPFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + GLEE_EXTERN GLEEPFNGLMAPBUFFERRANGEPROC GLeeFuncPtr_glMapBufferRange; + #define glMapBufferRange GLeeFuncPtr_glMapBufferRange +#endif +#ifndef GLEE_H_DEFINED_glFlushMappedBufferRange +#define GLEE_H_DEFINED_glFlushMappedBufferRange + typedef void (APIENTRYP GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); + GLEE_EXTERN GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC GLeeFuncPtr_glFlushMappedBufferRange; + #define glFlushMappedBufferRange GLeeFuncPtr_glFlushMappedBufferRange +#endif +#endif + +/* GL_ARB_texture_buffer_object */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define __GLEE_GL_ARB_texture_buffer_object 1 +/* Constants */ +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +#ifndef GLEE_H_DEFINED_glTexBufferARB +#define GLEE_H_DEFINED_glTexBufferARB + typedef void (APIENTRYP GLEEPFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); + GLEE_EXTERN GLEEPFNGLTEXBUFFERARBPROC GLeeFuncPtr_glTexBufferARB; + #define glTexBufferARB GLeeFuncPtr_glTexBufferARB +#endif +#endif + +/* GL_ARB_texture_compression_rgtc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#define __GLEE_GL_ARB_texture_compression_rgtc 1 +/* Constants */ +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#endif + +/* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#define __GLEE_GL_ARB_texture_rg 1 +/* Constants */ +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#endif + +/* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#define __GLEE_GL_ARB_vertex_array_object 1 +/* Constants */ +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#ifndef GLEE_H_DEFINED_glBindVertexArray +#define GLEE_H_DEFINED_glBindVertexArray + typedef void (APIENTRYP GLEEPFNGLBINDVERTEXARRAYPROC) (GLuint array); + GLEE_EXTERN GLEEPFNGLBINDVERTEXARRAYPROC GLeeFuncPtr_glBindVertexArray; + #define glBindVertexArray GLeeFuncPtr_glBindVertexArray +#endif +#ifndef GLEE_H_DEFINED_glDeleteVertexArrays +#define GLEE_H_DEFINED_glDeleteVertexArrays + typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint * arrays); + GLEE_EXTERN GLEEPFNGLDELETEVERTEXARRAYSPROC GLeeFuncPtr_glDeleteVertexArrays; + #define glDeleteVertexArrays GLeeFuncPtr_glDeleteVertexArrays +#endif +#ifndef GLEE_H_DEFINED_glGenVertexArrays +#define GLEE_H_DEFINED_glGenVertexArrays + typedef void (APIENTRYP GLEEPFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint * arrays); + GLEE_EXTERN GLEEPFNGLGENVERTEXARRAYSPROC GLeeFuncPtr_glGenVertexArrays; + #define glGenVertexArrays GLeeFuncPtr_glGenVertexArrays +#endif +#ifndef GLEE_H_DEFINED_glIsVertexArray +#define GLEE_H_DEFINED_glIsVertexArray + typedef GLboolean (APIENTRYP GLEEPFNGLISVERTEXARRAYPROC) (GLuint array); + GLEE_EXTERN GLEEPFNGLISVERTEXARRAYPROC GLeeFuncPtr_glIsVertexArray; + #define glIsVertexArray GLeeFuncPtr_glIsVertexArray +#endif +#endif + +/* GL_EXT_abgr */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define __GLEE_GL_EXT_abgr 1 +/* Constants */ +#define GL_ABGR_EXT 0x8000 +#endif + +/* GL_EXT_blend_color */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define __GLEE_GL_EXT_blend_color 1 +/* Constants */ +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#ifndef GLEE_H_DEFINED_glBlendColorEXT +#define GLEE_H_DEFINED_glBlendColorEXT + typedef void (APIENTRYP GLEEPFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + GLEE_EXTERN GLEEPFNGLBLENDCOLOREXTPROC GLeeFuncPtr_glBlendColorEXT; + #define glBlendColorEXT GLeeFuncPtr_glBlendColorEXT +#endif +#endif + +/* GL_EXT_polygon_offset */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#define __GLEE_GL_EXT_polygon_offset 1 +/* Constants */ +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#ifndef GLEE_H_DEFINED_glPolygonOffsetEXT +#define GLEE_H_DEFINED_glPolygonOffsetEXT + typedef void (APIENTRYP GLEEPFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + GLEE_EXTERN GLEEPFNGLPOLYGONOFFSETEXTPROC GLeeFuncPtr_glPolygonOffsetEXT; + #define glPolygonOffsetEXT GLeeFuncPtr_glPolygonOffsetEXT +#endif +#endif + +/* GL_EXT_texture */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define __GLEE_GL_EXT_texture 1 +/* Constants */ +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +/* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define __GLEE_GL_EXT_texture3D 1 +/* Constants */ +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#ifndef GLEE_H_DEFINED_glTexImage3DEXT +#define GLEE_H_DEFINED_glTexImage3DEXT + typedef void (APIENTRYP GLEEPFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXIMAGE3DEXTPROC GLeeFuncPtr_glTexImage3DEXT; + #define glTexImage3DEXT GLeeFuncPtr_glTexImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glTexSubImage3DEXT +#define GLEE_H_DEFINED_glTexSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glTexSubImage3DEXT; + #define glTexSubImage3DEXT GLeeFuncPtr_glTexSubImage3DEXT +#endif +#endif + +/* GL_SGIS_texture_filter4 */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define __GLEE_GL_SGIS_texture_filter4 1 +/* Constants */ +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#ifndef GLEE_H_DEFINED_glGetTexFilterFuncSGIS +#define GLEE_H_DEFINED_glGetTexFilterFuncSGIS + typedef void (APIENTRYP GLEEPFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat * weights); + GLEE_EXTERN GLEEPFNGLGETTEXFILTERFUNCSGISPROC GLeeFuncPtr_glGetTexFilterFuncSGIS; + #define glGetTexFilterFuncSGIS GLeeFuncPtr_glGetTexFilterFuncSGIS +#endif +#ifndef GLEE_H_DEFINED_glTexFilterFuncSGIS +#define GLEE_H_DEFINED_glTexFilterFuncSGIS + typedef void (APIENTRYP GLEEPFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat * weights); + GLEE_EXTERN GLEEPFNGLTEXFILTERFUNCSGISPROC GLeeFuncPtr_glTexFilterFuncSGIS; + #define glTexFilterFuncSGIS GLeeFuncPtr_glTexFilterFuncSGIS +#endif +#endif + +/* GL_EXT_subtexture */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#define __GLEE_GL_EXT_subtexture 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glTexSubImage1DEXT +#define GLEE_H_DEFINED_glTexSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glTexSubImage1DEXT; + #define glTexSubImage1DEXT GLeeFuncPtr_glTexSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glTexSubImage2DEXT +#define GLEE_H_DEFINED_glTexSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glTexSubImage2DEXT; + #define glTexSubImage2DEXT GLeeFuncPtr_glTexSubImage2DEXT +#endif +#endif + +/* GL_EXT_copy_texture */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#define __GLEE_GL_EXT_copy_texture 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glCopyTexImage1DEXT +#define GLEE_H_DEFINED_glCopyTexImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + GLEE_EXTERN GLEEPFNGLCOPYTEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexImage1DEXT; + #define glCopyTexImage1DEXT GLeeFuncPtr_glCopyTexImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTexImage2DEXT +#define GLEE_H_DEFINED_glCopyTexImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + GLEE_EXTERN GLEEPFNGLCOPYTEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexImage2DEXT; + #define glCopyTexImage2DEXT GLeeFuncPtr_glCopyTexImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTexSubImage1DEXT +#define GLEE_H_DEFINED_glCopyTexSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexSubImage1DEXT; + #define glCopyTexSubImage1DEXT GLeeFuncPtr_glCopyTexSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTexSubImage2DEXT +#define GLEE_H_DEFINED_glCopyTexSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexSubImage2DEXT; + #define glCopyTexSubImage2DEXT GLeeFuncPtr_glCopyTexSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTexSubImage3DEXT +#define GLEE_H_DEFINED_glCopyTexSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTexSubImage3DEXT; + #define glCopyTexSubImage3DEXT GLeeFuncPtr_glCopyTexSubImage3DEXT +#endif +#endif + +/* GL_EXT_histogram */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define __GLEE_GL_EXT_histogram 1 +/* Constants */ +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#ifndef GLEE_H_DEFINED_glGetHistogramEXT +#define GLEE_H_DEFINED_glGetHistogramEXT + typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); + GLEE_EXTERN GLEEPFNGLGETHISTOGRAMEXTPROC GLeeFuncPtr_glGetHistogramEXT; + #define glGetHistogramEXT GLeeFuncPtr_glGetHistogramEXT +#endif +#ifndef GLEE_H_DEFINED_glGetHistogramParameterfvEXT +#define GLEE_H_DEFINED_glGetHistogramParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC GLeeFuncPtr_glGetHistogramParameterfvEXT; + #define glGetHistogramParameterfvEXT GLeeFuncPtr_glGetHistogramParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetHistogramParameterivEXT +#define GLEE_H_DEFINED_glGetHistogramParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC GLeeFuncPtr_glGetHistogramParameterivEXT; + #define glGetHistogramParameterivEXT GLeeFuncPtr_glGetHistogramParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMinmaxEXT +#define GLEE_H_DEFINED_glGetMinmaxEXT + typedef void (APIENTRYP GLEEPFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); + GLEE_EXTERN GLEEPFNGLGETMINMAXEXTPROC GLeeFuncPtr_glGetMinmaxEXT; + #define glGetMinmaxEXT GLeeFuncPtr_glGetMinmaxEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMinmaxParameterfvEXT +#define GLEE_H_DEFINED_glGetMinmaxParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMinmaxParameterfvEXT; + #define glGetMinmaxParameterfvEXT GLeeFuncPtr_glGetMinmaxParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMinmaxParameterivEXT +#define GLEE_H_DEFINED_glGetMinmaxParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMinmaxParameterivEXT; + #define glGetMinmaxParameterivEXT GLeeFuncPtr_glGetMinmaxParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glHistogramEXT +#define GLEE_H_DEFINED_glHistogramEXT + typedef void (APIENTRYP GLEEPFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); + GLEE_EXTERN GLEEPFNGLHISTOGRAMEXTPROC GLeeFuncPtr_glHistogramEXT; + #define glHistogramEXT GLeeFuncPtr_glHistogramEXT +#endif +#ifndef GLEE_H_DEFINED_glMinmaxEXT +#define GLEE_H_DEFINED_glMinmaxEXT + typedef void (APIENTRYP GLEEPFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); + GLEE_EXTERN GLEEPFNGLMINMAXEXTPROC GLeeFuncPtr_glMinmaxEXT; + #define glMinmaxEXT GLeeFuncPtr_glMinmaxEXT +#endif +#ifndef GLEE_H_DEFINED_glResetHistogramEXT +#define GLEE_H_DEFINED_glResetHistogramEXT + typedef void (APIENTRYP GLEEPFNGLRESETHISTOGRAMEXTPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLRESETHISTOGRAMEXTPROC GLeeFuncPtr_glResetHistogramEXT; + #define glResetHistogramEXT GLeeFuncPtr_glResetHistogramEXT +#endif +#ifndef GLEE_H_DEFINED_glResetMinmaxEXT +#define GLEE_H_DEFINED_glResetMinmaxEXT + typedef void (APIENTRYP GLEEPFNGLRESETMINMAXEXTPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLRESETMINMAXEXTPROC GLeeFuncPtr_glResetMinmaxEXT; + #define glResetMinmaxEXT GLeeFuncPtr_glResetMinmaxEXT +#endif +#endif + +/* GL_EXT_convolution */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#define __GLEE_GL_EXT_convolution 1 +/* Constants */ +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#ifndef GLEE_H_DEFINED_glConvolutionFilter1DEXT +#define GLEE_H_DEFINED_glConvolutionFilter1DEXT + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glConvolutionFilter1DEXT; + #define glConvolutionFilter1DEXT GLeeFuncPtr_glConvolutionFilter1DEXT +#endif +#ifndef GLEE_H_DEFINED_glConvolutionFilter2DEXT +#define GLEE_H_DEFINED_glConvolutionFilter2DEXT + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glConvolutionFilter2DEXT; + #define glConvolutionFilter2DEXT GLeeFuncPtr_glConvolutionFilter2DEXT +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameterfEXT +#define GLEE_H_DEFINED_glConvolutionParameterfEXT + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC GLeeFuncPtr_glConvolutionParameterfEXT; + #define glConvolutionParameterfEXT GLeeFuncPtr_glConvolutionParameterfEXT +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameterfvEXT +#define GLEE_H_DEFINED_glConvolutionParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glConvolutionParameterfvEXT; + #define glConvolutionParameterfvEXT GLeeFuncPtr_glConvolutionParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameteriEXT +#define GLEE_H_DEFINED_glConvolutionParameteriEXT + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC GLeeFuncPtr_glConvolutionParameteriEXT; + #define glConvolutionParameteriEXT GLeeFuncPtr_glConvolutionParameteriEXT +#endif +#ifndef GLEE_H_DEFINED_glConvolutionParameterivEXT +#define GLEE_H_DEFINED_glConvolutionParameterivEXT + typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glConvolutionParameterivEXT; + #define glConvolutionParameterivEXT GLeeFuncPtr_glConvolutionParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter1DEXT +#define GLEE_H_DEFINED_glCopyConvolutionFilter1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter1DEXT; + #define glCopyConvolutionFilter1DEXT GLeeFuncPtr_glCopyConvolutionFilter1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter2DEXT +#define GLEE_H_DEFINED_glCopyConvolutionFilter2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter2DEXT; + #define glCopyConvolutionFilter2DEXT GLeeFuncPtr_glCopyConvolutionFilter2DEXT +#endif +#ifndef GLEE_H_DEFINED_glGetConvolutionFilterEXT +#define GLEE_H_DEFINED_glGetConvolutionFilterEXT + typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image); + GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC GLeeFuncPtr_glGetConvolutionFilterEXT; + #define glGetConvolutionFilterEXT GLeeFuncPtr_glGetConvolutionFilterEXT +#endif +#ifndef GLEE_H_DEFINED_glGetConvolutionParameterfvEXT +#define GLEE_H_DEFINED_glGetConvolutionParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glGetConvolutionParameterfvEXT; + #define glGetConvolutionParameterfvEXT GLeeFuncPtr_glGetConvolutionParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetConvolutionParameterivEXT +#define GLEE_H_DEFINED_glGetConvolutionParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glGetConvolutionParameterivEXT; + #define glGetConvolutionParameterivEXT GLeeFuncPtr_glGetConvolutionParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetSeparableFilterEXT +#define GLEE_H_DEFINED_glGetSeparableFilterEXT + typedef void (APIENTRYP GLEEPFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); + GLEE_EXTERN GLEEPFNGLGETSEPARABLEFILTEREXTPROC GLeeFuncPtr_glGetSeparableFilterEXT; + #define glGetSeparableFilterEXT GLeeFuncPtr_glGetSeparableFilterEXT +#endif +#ifndef GLEE_H_DEFINED_glSeparableFilter2DEXT +#define GLEE_H_DEFINED_glSeparableFilter2DEXT + typedef void (APIENTRYP GLEEPFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); + GLEE_EXTERN GLEEPFNGLSEPARABLEFILTER2DEXTPROC GLeeFuncPtr_glSeparableFilter2DEXT; + #define glSeparableFilter2DEXT GLeeFuncPtr_glSeparableFilter2DEXT +#endif +#endif + +/* GL_SGI_color_matrix */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define __GLEE_GL_SGI_color_matrix 1 +/* Constants */ +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +/* GL_SGI_color_table */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define __GLEE_GL_SGI_color_table 1 +/* Constants */ +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#ifndef GLEE_H_DEFINED_glColorTableSGI +#define GLEE_H_DEFINED_glColorTableSGI + typedef void (APIENTRYP GLEEPFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); + GLEE_EXTERN GLEEPFNGLCOLORTABLESGIPROC GLeeFuncPtr_glColorTableSGI; + #define glColorTableSGI GLeeFuncPtr_glColorTableSGI +#endif +#ifndef GLEE_H_DEFINED_glColorTableParameterfvSGI +#define GLEE_H_DEFINED_glColorTableParameterfvSGI + typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glColorTableParameterfvSGI; + #define glColorTableParameterfvSGI GLeeFuncPtr_glColorTableParameterfvSGI +#endif +#ifndef GLEE_H_DEFINED_glColorTableParameterivSGI +#define GLEE_H_DEFINED_glColorTableParameterivSGI + typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glColorTableParameterivSGI; + #define glColorTableParameterivSGI GLeeFuncPtr_glColorTableParameterivSGI +#endif +#ifndef GLEE_H_DEFINED_glCopyColorTableSGI +#define GLEE_H_DEFINED_glCopyColorTableSGI + typedef void (APIENTRYP GLEEPFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYCOLORTABLESGIPROC GLeeFuncPtr_glCopyColorTableSGI; + #define glCopyColorTableSGI GLeeFuncPtr_glCopyColorTableSGI +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableSGI +#define GLEE_H_DEFINED_glGetColorTableSGI + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid * table); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLESGIPROC GLeeFuncPtr_glGetColorTableSGI; + #define glGetColorTableSGI GLeeFuncPtr_glGetColorTableSGI +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableParameterfvSGI +#define GLEE_H_DEFINED_glGetColorTableParameterfvSGI + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glGetColorTableParameterfvSGI; + #define glGetColorTableParameterfvSGI GLeeFuncPtr_glGetColorTableParameterfvSGI +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableParameterivSGI +#define GLEE_H_DEFINED_glGetColorTableParameterivSGI + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glGetColorTableParameterivSGI; + #define glGetColorTableParameterivSGI GLeeFuncPtr_glGetColorTableParameterivSGI +#endif +#endif + +/* GL_SGIS_pixel_texture */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#define __GLEE_GL_SGIS_pixel_texture 1 +/* Constants */ +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#ifndef GLEE_H_DEFINED_glPixelTexGenParameteriSGIS +#define GLEE_H_DEFINED_glPixelTexGenParameteriSGIS + typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC GLeeFuncPtr_glPixelTexGenParameteriSGIS; + #define glPixelTexGenParameteriSGIS GLeeFuncPtr_glPixelTexGenParameteriSGIS +#endif +#ifndef GLEE_H_DEFINED_glPixelTexGenParameterivSGIS +#define GLEE_H_DEFINED_glPixelTexGenParameterivSGIS + typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glPixelTexGenParameterivSGIS; + #define glPixelTexGenParameterivSGIS GLeeFuncPtr_glPixelTexGenParameterivSGIS +#endif +#ifndef GLEE_H_DEFINED_glPixelTexGenParameterfSGIS +#define GLEE_H_DEFINED_glPixelTexGenParameterfSGIS + typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC GLeeFuncPtr_glPixelTexGenParameterfSGIS; + #define glPixelTexGenParameterfSGIS GLeeFuncPtr_glPixelTexGenParameterfSGIS +#endif +#ifndef GLEE_H_DEFINED_glPixelTexGenParameterfvSGIS +#define GLEE_H_DEFINED_glPixelTexGenParameterfvSGIS + typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glPixelTexGenParameterfvSGIS; + #define glPixelTexGenParameterfvSGIS GLeeFuncPtr_glPixelTexGenParameterfvSGIS +#endif +#ifndef GLEE_H_DEFINED_glGetPixelTexGenParameterivSGIS +#define GLEE_H_DEFINED_glGetPixelTexGenParameterivSGIS + typedef void (APIENTRYP GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterivSGIS; + #define glGetPixelTexGenParameterivSGIS GLeeFuncPtr_glGetPixelTexGenParameterivSGIS +#endif +#ifndef GLEE_H_DEFINED_glGetPixelTexGenParameterfvSGIS +#define GLEE_H_DEFINED_glGetPixelTexGenParameterfvSGIS + typedef void (APIENTRYP GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS; + #define glGetPixelTexGenParameterfvSGIS GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS +#endif +#endif + +/* GL_SGIX_pixel_texture */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define __GLEE_GL_SGIX_pixel_texture 1 +/* Constants */ +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#ifndef GLEE_H_DEFINED_glPixelTexGenSGIX +#define GLEE_H_DEFINED_glPixelTexGenSGIX + typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLPIXELTEXGENSGIXPROC GLeeFuncPtr_glPixelTexGenSGIX; + #define glPixelTexGenSGIX GLeeFuncPtr_glPixelTexGenSGIX +#endif +#endif + +/* GL_SGIS_texture4D */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define __GLEE_GL_SGIS_texture4D 1 +/* Constants */ +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#ifndef GLEE_H_DEFINED_glTexImage4DSGIS +#define GLEE_H_DEFINED_glTexImage4DSGIS + typedef void (APIENTRYP GLEEPFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXIMAGE4DSGISPROC GLeeFuncPtr_glTexImage4DSGIS; + #define glTexImage4DSGIS GLeeFuncPtr_glTexImage4DSGIS +#endif +#ifndef GLEE_H_DEFINED_glTexSubImage4DSGIS +#define GLEE_H_DEFINED_glTexSubImage4DSGIS + typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE4DSGISPROC GLeeFuncPtr_glTexSubImage4DSGIS; + #define glTexSubImage4DSGIS GLeeFuncPtr_glTexSubImage4DSGIS +#endif +#endif + +/* GL_SGI_texture_color_table */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define __GLEE_GL_SGI_texture_color_table 1 +/* Constants */ +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +/* GL_EXT_cmyka */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define __GLEE_GL_EXT_cmyka 1 +/* Constants */ +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +/* GL_EXT_texture_object */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#define __GLEE_GL_EXT_texture_object 1 +/* Constants */ +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#ifndef GLEE_H_DEFINED_glAreTexturesResidentEXT +#define GLEE_H_DEFINED_glAreTexturesResidentEXT + typedef GLboolean (APIENTRYP GLEEPFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint * textures, GLboolean * residences); + GLEE_EXTERN GLEEPFNGLARETEXTURESRESIDENTEXTPROC GLeeFuncPtr_glAreTexturesResidentEXT; + #define glAreTexturesResidentEXT GLeeFuncPtr_glAreTexturesResidentEXT +#endif +#ifndef GLEE_H_DEFINED_glBindTextureEXT +#define GLEE_H_DEFINED_glBindTextureEXT + typedef void (APIENTRYP GLEEPFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); + GLEE_EXTERN GLEEPFNGLBINDTEXTUREEXTPROC GLeeFuncPtr_glBindTextureEXT; + #define glBindTextureEXT GLeeFuncPtr_glBindTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glDeleteTexturesEXT +#define GLEE_H_DEFINED_glDeleteTexturesEXT + typedef void (APIENTRYP GLEEPFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint * textures); + GLEE_EXTERN GLEEPFNGLDELETETEXTURESEXTPROC GLeeFuncPtr_glDeleteTexturesEXT; + #define glDeleteTexturesEXT GLeeFuncPtr_glDeleteTexturesEXT +#endif +#ifndef GLEE_H_DEFINED_glGenTexturesEXT +#define GLEE_H_DEFINED_glGenTexturesEXT + typedef void (APIENTRYP GLEEPFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint * textures); + GLEE_EXTERN GLEEPFNGLGENTEXTURESEXTPROC GLeeFuncPtr_glGenTexturesEXT; + #define glGenTexturesEXT GLeeFuncPtr_glGenTexturesEXT +#endif +#ifndef GLEE_H_DEFINED_glIsTextureEXT +#define GLEE_H_DEFINED_glIsTextureEXT + typedef GLboolean (APIENTRYP GLEEPFNGLISTEXTUREEXTPROC) (GLuint texture); + GLEE_EXTERN GLEEPFNGLISTEXTUREEXTPROC GLeeFuncPtr_glIsTextureEXT; + #define glIsTextureEXT GLeeFuncPtr_glIsTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glPrioritizeTexturesEXT +#define GLEE_H_DEFINED_glPrioritizeTexturesEXT + typedef void (APIENTRYP GLEEPFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint * textures, const GLclampf * priorities); + GLEE_EXTERN GLEEPFNGLPRIORITIZETEXTURESEXTPROC GLeeFuncPtr_glPrioritizeTexturesEXT; + #define glPrioritizeTexturesEXT GLeeFuncPtr_glPrioritizeTexturesEXT +#endif +#endif + +/* GL_SGIS_detail_texture */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define __GLEE_GL_SGIS_detail_texture 1 +/* Constants */ +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#ifndef GLEE_H_DEFINED_glDetailTexFuncSGIS +#define GLEE_H_DEFINED_glDetailTexFuncSGIS + typedef void (APIENTRYP GLEEPFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat * points); + GLEE_EXTERN GLEEPFNGLDETAILTEXFUNCSGISPROC GLeeFuncPtr_glDetailTexFuncSGIS; + #define glDetailTexFuncSGIS GLeeFuncPtr_glDetailTexFuncSGIS +#endif +#ifndef GLEE_H_DEFINED_glGetDetailTexFuncSGIS +#define GLEE_H_DEFINED_glGetDetailTexFuncSGIS + typedef void (APIENTRYP GLEEPFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat * points); + GLEE_EXTERN GLEEPFNGLGETDETAILTEXFUNCSGISPROC GLeeFuncPtr_glGetDetailTexFuncSGIS; + #define glGetDetailTexFuncSGIS GLeeFuncPtr_glGetDetailTexFuncSGIS +#endif +#endif + +/* GL_SGIS_sharpen_texture */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define __GLEE_GL_SGIS_sharpen_texture 1 +/* Constants */ +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#ifndef GLEE_H_DEFINED_glSharpenTexFuncSGIS +#define GLEE_H_DEFINED_glSharpenTexFuncSGIS + typedef void (APIENTRYP GLEEPFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat * points); + GLEE_EXTERN GLEEPFNGLSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glSharpenTexFuncSGIS; + #define glSharpenTexFuncSGIS GLeeFuncPtr_glSharpenTexFuncSGIS +#endif +#ifndef GLEE_H_DEFINED_glGetSharpenTexFuncSGIS +#define GLEE_H_DEFINED_glGetSharpenTexFuncSGIS + typedef void (APIENTRYP GLEEPFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat * points); + GLEE_EXTERN GLEEPFNGLGETSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glGetSharpenTexFuncSGIS; + #define glGetSharpenTexFuncSGIS GLeeFuncPtr_glGetSharpenTexFuncSGIS +#endif +#endif + +/* GL_EXT_packed_pixels */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define __GLEE_GL_EXT_packed_pixels 1 +/* Constants */ +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +/* GL_SGIS_texture_lod */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define __GLEE_GL_SGIS_texture_lod 1 +/* Constants */ +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +/* GL_SGIS_multisample */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define __GLEE_GL_SGIS_multisample 1 +/* Constants */ +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#ifndef GLEE_H_DEFINED_glSampleMaskSGIS +#define GLEE_H_DEFINED_glSampleMaskSGIS + typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); + GLEE_EXTERN GLEEPFNGLSAMPLEMASKSGISPROC GLeeFuncPtr_glSampleMaskSGIS; + #define glSampleMaskSGIS GLeeFuncPtr_glSampleMaskSGIS +#endif +#ifndef GLEE_H_DEFINED_glSamplePatternSGIS +#define GLEE_H_DEFINED_glSamplePatternSGIS + typedef void (APIENTRYP GLEEPFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + GLEE_EXTERN GLEEPFNGLSAMPLEPATTERNSGISPROC GLeeFuncPtr_glSamplePatternSGIS; + #define glSamplePatternSGIS GLeeFuncPtr_glSamplePatternSGIS +#endif +#endif + +/* GL_EXT_rescale_normal */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define __GLEE_GL_EXT_rescale_normal 1 +/* Constants */ +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +/* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#define __GLEE_GL_EXT_vertex_array 1 +/* Constants */ +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#ifndef GLEE_H_DEFINED_glArrayElementEXT +#define GLEE_H_DEFINED_glArrayElementEXT + typedef void (APIENTRYP GLEEPFNGLARRAYELEMENTEXTPROC) (GLint i); + GLEE_EXTERN GLEEPFNGLARRAYELEMENTEXTPROC GLeeFuncPtr_glArrayElementEXT; + #define glArrayElementEXT GLeeFuncPtr_glArrayElementEXT +#endif +#ifndef GLEE_H_DEFINED_glColorPointerEXT +#define GLEE_H_DEFINED_glColorPointerEXT + typedef void (APIENTRYP GLEEPFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLCOLORPOINTEREXTPROC GLeeFuncPtr_glColorPointerEXT; + #define glColorPointerEXT GLeeFuncPtr_glColorPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glDrawArraysEXT +#define GLEE_H_DEFINED_glDrawArraysEXT + typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); + GLEE_EXTERN GLEEPFNGLDRAWARRAYSEXTPROC GLeeFuncPtr_glDrawArraysEXT; + #define glDrawArraysEXT GLeeFuncPtr_glDrawArraysEXT +#endif +#ifndef GLEE_H_DEFINED_glEdgeFlagPointerEXT +#define GLEE_H_DEFINED_glEdgeFlagPointerEXT + typedef void (APIENTRYP GLEEPFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean * pointer); + GLEE_EXTERN GLEEPFNGLEDGEFLAGPOINTEREXTPROC GLeeFuncPtr_glEdgeFlagPointerEXT; + #define glEdgeFlagPointerEXT GLeeFuncPtr_glEdgeFlagPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glGetPointervEXT +#define GLEE_H_DEFINED_glGetPointervEXT + typedef void (APIENTRYP GLEEPFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* * params); + GLEE_EXTERN GLEEPFNGLGETPOINTERVEXTPROC GLeeFuncPtr_glGetPointervEXT; + #define glGetPointervEXT GLeeFuncPtr_glGetPointervEXT +#endif +#ifndef GLEE_H_DEFINED_glIndexPointerEXT +#define GLEE_H_DEFINED_glIndexPointerEXT + typedef void (APIENTRYP GLEEPFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLINDEXPOINTEREXTPROC GLeeFuncPtr_glIndexPointerEXT; + #define glIndexPointerEXT GLeeFuncPtr_glIndexPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glNormalPointerEXT +#define GLEE_H_DEFINED_glNormalPointerEXT + typedef void (APIENTRYP GLEEPFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLNORMALPOINTEREXTPROC GLeeFuncPtr_glNormalPointerEXT; + #define glNormalPointerEXT GLeeFuncPtr_glNormalPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glTexCoordPointerEXT +#define GLEE_H_DEFINED_glTexCoordPointerEXT + typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTEREXTPROC GLeeFuncPtr_glTexCoordPointerEXT; + #define glTexCoordPointerEXT GLeeFuncPtr_glTexCoordPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexPointerEXT +#define GLEE_H_DEFINED_glVertexPointerEXT + typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXPOINTEREXTPROC GLeeFuncPtr_glVertexPointerEXT; + #define glVertexPointerEXT GLeeFuncPtr_glVertexPointerEXT +#endif +#endif + +/* GL_EXT_misc_attribute */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#define __GLEE_GL_EXT_misc_attribute 1 +/* Constants */ +#endif + +/* GL_SGIS_generate_mipmap */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define __GLEE_GL_SGIS_generate_mipmap 1 +/* Constants */ +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +/* GL_SGIX_clipmap */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define __GLEE_GL_SGIX_clipmap 1 +/* Constants */ +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +/* GL_SGIX_shadow */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define __GLEE_GL_SGIX_shadow 1 +/* Constants */ +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +/* GL_SGIS_texture_edge_clamp */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define __GLEE_GL_SGIS_texture_edge_clamp 1 +/* Constants */ +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +/* GL_SGIS_texture_border_clamp */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define __GLEE_GL_SGIS_texture_border_clamp 1 +/* Constants */ +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +/* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define __GLEE_GL_EXT_blend_minmax 1 +/* Constants */ +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#ifndef GLEE_H_DEFINED_glBlendEquationEXT +#define GLEE_H_DEFINED_glBlendEquationEXT + typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLBLENDEQUATIONEXTPROC GLeeFuncPtr_glBlendEquationEXT; + #define glBlendEquationEXT GLeeFuncPtr_glBlendEquationEXT +#endif +#endif + +/* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define __GLEE_GL_EXT_blend_subtract 1 +/* Constants */ +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +/* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#define __GLEE_GL_EXT_blend_logic_op 1 +/* Constants */ +#endif + +/* GL_SGIX_interlace */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define __GLEE_GL_SGIX_interlace 1 +/* Constants */ +#define GL_INTERLACE_SGIX 0x8094 +#endif + +/* GL_SGIX_pixel_tiles */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define __GLEE_GL_SGIX_pixel_tiles 1 +/* Constants */ +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +/* GL_SGIS_texture_select */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define __GLEE_GL_SGIS_texture_select 1 +/* Constants */ +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +/* GL_SGIX_sprite */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define __GLEE_GL_SGIX_sprite 1 +/* Constants */ +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#ifndef GLEE_H_DEFINED_glSpriteParameterfSGIX +#define GLEE_H_DEFINED_glSpriteParameterfSGIX + typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERFSGIXPROC GLeeFuncPtr_glSpriteParameterfSGIX; + #define glSpriteParameterfSGIX GLeeFuncPtr_glSpriteParameterfSGIX +#endif +#ifndef GLEE_H_DEFINED_glSpriteParameterfvSGIX +#define GLEE_H_DEFINED_glSpriteParameterfvSGIX + typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERFVSGIXPROC GLeeFuncPtr_glSpriteParameterfvSGIX; + #define glSpriteParameterfvSGIX GLeeFuncPtr_glSpriteParameterfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glSpriteParameteriSGIX +#define GLEE_H_DEFINED_glSpriteParameteriSGIX + typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERISGIXPROC GLeeFuncPtr_glSpriteParameteriSGIX; + #define glSpriteParameteriSGIX GLeeFuncPtr_glSpriteParameteriSGIX +#endif +#ifndef GLEE_H_DEFINED_glSpriteParameterivSGIX +#define GLEE_H_DEFINED_glSpriteParameterivSGIX + typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERIVSGIXPROC GLeeFuncPtr_glSpriteParameterivSGIX; + #define glSpriteParameterivSGIX GLeeFuncPtr_glSpriteParameterivSGIX +#endif +#endif + +/* GL_SGIX_texture_multi_buffer */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define __GLEE_GL_SGIX_texture_multi_buffer 1 +/* Constants */ +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +/* GL_EXT_point_parameters */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define __GLEE_GL_EXT_point_parameters 1 +/* Constants */ +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#ifndef GLEE_H_DEFINED_glPointParameterfEXT +#define GLEE_H_DEFINED_glPointParameterfEXT + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFEXTPROC GLeeFuncPtr_glPointParameterfEXT; + #define glPointParameterfEXT GLeeFuncPtr_glPointParameterfEXT +#endif +#ifndef GLEE_H_DEFINED_glPointParameterfvEXT +#define GLEE_H_DEFINED_glPointParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVEXTPROC GLeeFuncPtr_glPointParameterfvEXT; + #define glPointParameterfvEXT GLeeFuncPtr_glPointParameterfvEXT +#endif +#endif + +/* GL_SGIS_point_parameters */ + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#define __GLEE_GL_SGIS_point_parameters 1 +/* Constants */ +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#ifndef GLEE_H_DEFINED_glPointParameterfSGIS +#define GLEE_H_DEFINED_glPointParameterfSGIS + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFSGISPROC GLeeFuncPtr_glPointParameterfSGIS; + #define glPointParameterfSGIS GLeeFuncPtr_glPointParameterfSGIS +#endif +#ifndef GLEE_H_DEFINED_glPointParameterfvSGIS +#define GLEE_H_DEFINED_glPointParameterfvSGIS + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVSGISPROC GLeeFuncPtr_glPointParameterfvSGIS; + #define glPointParameterfvSGIS GLeeFuncPtr_glPointParameterfvSGIS +#endif +#endif + +/* GL_SGIX_instruments */ + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define __GLEE_GL_SGIX_instruments 1 +/* Constants */ +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#ifndef GLEE_H_DEFINED_glGetInstrumentsSGIX +#define GLEE_H_DEFINED_glGetInstrumentsSGIX + typedef GLint (APIENTRYP GLEEPFNGLGETINSTRUMENTSSGIXPROC) (); + GLEE_EXTERN GLEEPFNGLGETINSTRUMENTSSGIXPROC GLeeFuncPtr_glGetInstrumentsSGIX; + #define glGetInstrumentsSGIX GLeeFuncPtr_glGetInstrumentsSGIX +#endif +#ifndef GLEE_H_DEFINED_glInstrumentsBufferSGIX +#define GLEE_H_DEFINED_glInstrumentsBufferSGIX + typedef void (APIENTRYP GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint * buffer); + GLEE_EXTERN GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC GLeeFuncPtr_glInstrumentsBufferSGIX; + #define glInstrumentsBufferSGIX GLeeFuncPtr_glInstrumentsBufferSGIX +#endif +#ifndef GLEE_H_DEFINED_glPollInstrumentsSGIX +#define GLEE_H_DEFINED_glPollInstrumentsSGIX + typedef GLint (APIENTRYP GLEEPFNGLPOLLINSTRUMENTSSGIXPROC) (GLint * marker_p); + GLEE_EXTERN GLEEPFNGLPOLLINSTRUMENTSSGIXPROC GLeeFuncPtr_glPollInstrumentsSGIX; + #define glPollInstrumentsSGIX GLeeFuncPtr_glPollInstrumentsSGIX +#endif +#ifndef GLEE_H_DEFINED_glReadInstrumentsSGIX +#define GLEE_H_DEFINED_glReadInstrumentsSGIX + typedef void (APIENTRYP GLEEPFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); + GLEE_EXTERN GLEEPFNGLREADINSTRUMENTSSGIXPROC GLeeFuncPtr_glReadInstrumentsSGIX; + #define glReadInstrumentsSGIX GLeeFuncPtr_glReadInstrumentsSGIX +#endif +#ifndef GLEE_H_DEFINED_glStartInstrumentsSGIX +#define GLEE_H_DEFINED_glStartInstrumentsSGIX + typedef void (APIENTRYP GLEEPFNGLSTARTINSTRUMENTSSGIXPROC) (); + GLEE_EXTERN GLEEPFNGLSTARTINSTRUMENTSSGIXPROC GLeeFuncPtr_glStartInstrumentsSGIX; + #define glStartInstrumentsSGIX GLeeFuncPtr_glStartInstrumentsSGIX +#endif +#ifndef GLEE_H_DEFINED_glStopInstrumentsSGIX +#define GLEE_H_DEFINED_glStopInstrumentsSGIX + typedef void (APIENTRYP GLEEPFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); + GLEE_EXTERN GLEEPFNGLSTOPINSTRUMENTSSGIXPROC GLeeFuncPtr_glStopInstrumentsSGIX; + #define glStopInstrumentsSGIX GLeeFuncPtr_glStopInstrumentsSGIX +#endif +#endif + +/* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define __GLEE_GL_SGIX_texture_scale_bias 1 +/* Constants */ +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +/* GL_SGIX_framezoom */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define __GLEE_GL_SGIX_framezoom 1 +/* Constants */ +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#ifndef GLEE_H_DEFINED_glFrameZoomSGIX +#define GLEE_H_DEFINED_glFrameZoomSGIX + typedef void (APIENTRYP GLEEPFNGLFRAMEZOOMSGIXPROC) (GLint factor); + GLEE_EXTERN GLEEPFNGLFRAMEZOOMSGIXPROC GLeeFuncPtr_glFrameZoomSGIX; + #define glFrameZoomSGIX GLeeFuncPtr_glFrameZoomSGIX +#endif +#endif + +/* GL_SGIX_tag_sample_buffer */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#define __GLEE_GL_SGIX_tag_sample_buffer 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glTagSampleBufferSGIX +#define GLEE_H_DEFINED_glTagSampleBufferSGIX + typedef void (APIENTRYP GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC) (); + GLEE_EXTERN GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC GLeeFuncPtr_glTagSampleBufferSGIX; + #define glTagSampleBufferSGIX GLeeFuncPtr_glTagSampleBufferSGIX +#endif +#endif + +/* GL_FfdMaskSGIX */ + +#ifndef GL_FfdMaskSGIX +#define GL_FfdMaskSGIX 1 +#define __GLEE_GL_FfdMaskSGIX 1 +/* Constants */ +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +/* GL_SGIX_polynomial_ffd */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define __GLEE_GL_SGIX_polynomial_ffd 1 +/* Constants */ +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#ifndef GLEE_H_DEFINED_glDeformationMap3dSGIX +#define GLEE_H_DEFINED_glDeformationMap3dSGIX + typedef void (APIENTRYP GLEEPFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points); + GLEE_EXTERN GLEEPFNGLDEFORMATIONMAP3DSGIXPROC GLeeFuncPtr_glDeformationMap3dSGIX; + #define glDeformationMap3dSGIX GLeeFuncPtr_glDeformationMap3dSGIX +#endif +#ifndef GLEE_H_DEFINED_glDeformationMap3fSGIX +#define GLEE_H_DEFINED_glDeformationMap3fSGIX + typedef void (APIENTRYP GLEEPFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points); + GLEE_EXTERN GLEEPFNGLDEFORMATIONMAP3FSGIXPROC GLeeFuncPtr_glDeformationMap3fSGIX; + #define glDeformationMap3fSGIX GLeeFuncPtr_glDeformationMap3fSGIX +#endif +#ifndef GLEE_H_DEFINED_glDeformSGIX +#define GLEE_H_DEFINED_glDeformSGIX + typedef void (APIENTRYP GLEEPFNGLDEFORMSGIXPROC) (GLbitfield mask); + GLEE_EXTERN GLEEPFNGLDEFORMSGIXPROC GLeeFuncPtr_glDeformSGIX; + #define glDeformSGIX GLeeFuncPtr_glDeformSGIX +#endif +#ifndef GLEE_H_DEFINED_glLoadIdentityDeformationMapSGIX +#define GLEE_H_DEFINED_glLoadIdentityDeformationMapSGIX + typedef void (APIENTRYP GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); + GLEE_EXTERN GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC GLeeFuncPtr_glLoadIdentityDeformationMapSGIX; + #define glLoadIdentityDeformationMapSGIX GLeeFuncPtr_glLoadIdentityDeformationMapSGIX +#endif +#endif + +/* GL_SGIX_reference_plane */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define __GLEE_GL_SGIX_reference_plane 1 +/* Constants */ +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#ifndef GLEE_H_DEFINED_glReferencePlaneSGIX +#define GLEE_H_DEFINED_glReferencePlaneSGIX + typedef void (APIENTRYP GLEEPFNGLREFERENCEPLANESGIXPROC) (const GLdouble * equation); + GLEE_EXTERN GLEEPFNGLREFERENCEPLANESGIXPROC GLeeFuncPtr_glReferencePlaneSGIX; + #define glReferencePlaneSGIX GLeeFuncPtr_glReferencePlaneSGIX +#endif +#endif + +/* GL_SGIX_flush_raster */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#define __GLEE_GL_SGIX_flush_raster 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glFlushRasterSGIX +#define GLEE_H_DEFINED_glFlushRasterSGIX + typedef void (APIENTRYP GLEEPFNGLFLUSHRASTERSGIXPROC) (); + GLEE_EXTERN GLEEPFNGLFLUSHRASTERSGIXPROC GLeeFuncPtr_glFlushRasterSGIX; + #define glFlushRasterSGIX GLeeFuncPtr_glFlushRasterSGIX +#endif +#endif + +/* GL_SGIX_depth_texture */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define __GLEE_GL_SGIX_depth_texture 1 +/* Constants */ +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +/* GL_SGIS_fog_function */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define __GLEE_GL_SGIS_fog_function 1 +/* Constants */ +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#ifndef GLEE_H_DEFINED_glFogFuncSGIS +#define GLEE_H_DEFINED_glFogFuncSGIS + typedef void (APIENTRYP GLEEPFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat * points); + GLEE_EXTERN GLEEPFNGLFOGFUNCSGISPROC GLeeFuncPtr_glFogFuncSGIS; + #define glFogFuncSGIS GLeeFuncPtr_glFogFuncSGIS +#endif +#ifndef GLEE_H_DEFINED_glGetFogFuncSGIS +#define GLEE_H_DEFINED_glGetFogFuncSGIS + typedef void (APIENTRYP GLEEPFNGLGETFOGFUNCSGISPROC) (GLfloat * points); + GLEE_EXTERN GLEEPFNGLGETFOGFUNCSGISPROC GLeeFuncPtr_glGetFogFuncSGIS; + #define glGetFogFuncSGIS GLeeFuncPtr_glGetFogFuncSGIS +#endif +#endif + +/* GL_SGIX_fog_offset */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define __GLEE_GL_SGIX_fog_offset 1 +/* Constants */ +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +/* GL_HP_image_transform */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define __GLEE_GL_HP_image_transform 1 +/* Constants */ +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#ifndef GLEE_H_DEFINED_glImageTransformParameteriHP +#define GLEE_H_DEFINED_glImageTransformParameteriHP + typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC GLeeFuncPtr_glImageTransformParameteriHP; + #define glImageTransformParameteriHP GLeeFuncPtr_glImageTransformParameteriHP +#endif +#ifndef GLEE_H_DEFINED_glImageTransformParameterfHP +#define GLEE_H_DEFINED_glImageTransformParameterfHP + typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC GLeeFuncPtr_glImageTransformParameterfHP; + #define glImageTransformParameterfHP GLeeFuncPtr_glImageTransformParameterfHP +#endif +#ifndef GLEE_H_DEFINED_glImageTransformParameterivHP +#define GLEE_H_DEFINED_glImageTransformParameterivHP + typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glImageTransformParameterivHP; + #define glImageTransformParameterivHP GLeeFuncPtr_glImageTransformParameterivHP +#endif +#ifndef GLEE_H_DEFINED_glImageTransformParameterfvHP +#define GLEE_H_DEFINED_glImageTransformParameterfvHP + typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glImageTransformParameterfvHP; + #define glImageTransformParameterfvHP GLeeFuncPtr_glImageTransformParameterfvHP +#endif +#ifndef GLEE_H_DEFINED_glGetImageTransformParameterivHP +#define GLEE_H_DEFINED_glGetImageTransformParameterivHP + typedef void (APIENTRYP GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glGetImageTransformParameterivHP; + #define glGetImageTransformParameterivHP GLeeFuncPtr_glGetImageTransformParameterivHP +#endif +#ifndef GLEE_H_DEFINED_glGetImageTransformParameterfvHP +#define GLEE_H_DEFINED_glGetImageTransformParameterfvHP + typedef void (APIENTRYP GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glGetImageTransformParameterfvHP; + #define glGetImageTransformParameterfvHP GLeeFuncPtr_glGetImageTransformParameterfvHP +#endif +#endif + +/* GL_HP_convolution_border_modes */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#define __GLEE_GL_HP_convolution_border_modes 1 +/* Constants */ +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +/* GL_INGR_palette_buffer */ + +#ifndef GL_INGR_palette_buffer +#define GL_INGR_palette_buffer 1 +#define __GLEE_GL_INGR_palette_buffer 1 +/* Constants */ +#endif + +/* GL_SGIX_texture_add_env */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define __GLEE_GL_SGIX_texture_add_env 1 +/* Constants */ +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +/* GL_EXT_color_subtable */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#define __GLEE_GL_EXT_color_subtable 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glColorSubTableEXT +#define GLEE_H_DEFINED_glColorSubTableEXT + typedef void (APIENTRYP GLEEPFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLCOLORSUBTABLEEXTPROC GLeeFuncPtr_glColorSubTableEXT; + #define glColorSubTableEXT GLeeFuncPtr_glColorSubTableEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyColorSubTableEXT +#define GLEE_H_DEFINED_glCopyColorSubTableEXT + typedef void (APIENTRYP GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC GLeeFuncPtr_glCopyColorSubTableEXT; + #define glCopyColorSubTableEXT GLeeFuncPtr_glCopyColorSubTableEXT +#endif +#endif + +/* GL_PGI_vertex_hints */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define __GLEE_GL_PGI_vertex_hints 1 +/* Constants */ +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +/* GL_PGI_misc_hints */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define __GLEE_GL_PGI_misc_hints 1 +/* Constants */ +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#ifndef GLEE_H_DEFINED_glHintPGI +#define GLEE_H_DEFINED_glHintPGI + typedef void (APIENTRYP GLEEPFNGLHINTPGIPROC) (GLenum target, GLint mode); + GLEE_EXTERN GLEEPFNGLHINTPGIPROC GLeeFuncPtr_glHintPGI; + #define glHintPGI GLeeFuncPtr_glHintPGI +#endif +#endif + +/* GL_EXT_paletted_texture */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define __GLEE_GL_EXT_paletted_texture 1 +/* Constants */ +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#ifndef GLEE_H_DEFINED_glColorTableEXT +#define GLEE_H_DEFINED_glColorTableEXT + typedef void (APIENTRYP GLEEPFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); + GLEE_EXTERN GLEEPFNGLCOLORTABLEEXTPROC GLeeFuncPtr_glColorTableEXT; + #define glColorTableEXT GLeeFuncPtr_glColorTableEXT +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableEXT +#define GLEE_H_DEFINED_glGetColorTableEXT + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * data); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEEXTPROC GLeeFuncPtr_glGetColorTableEXT; + #define glGetColorTableEXT GLeeFuncPtr_glGetColorTableEXT +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableParameterivEXT +#define GLEE_H_DEFINED_glGetColorTableParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLeeFuncPtr_glGetColorTableParameterivEXT; + #define glGetColorTableParameterivEXT GLeeFuncPtr_glGetColorTableParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetColorTableParameterfvEXT +#define GLEE_H_DEFINED_glGetColorTableParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLeeFuncPtr_glGetColorTableParameterfvEXT; + #define glGetColorTableParameterfvEXT GLeeFuncPtr_glGetColorTableParameterfvEXT +#endif +#endif + +/* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define __GLEE_GL_EXT_clip_volume_hint 1 +/* Constants */ +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +/* GL_SGIX_list_priority */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define __GLEE_GL_SGIX_list_priority 1 +/* Constants */ +#define GL_LIST_PRIORITY_SGIX 0x8182 +#ifndef GLEE_H_DEFINED_glGetListParameterfvSGIX +#define GLEE_H_DEFINED_glGetListParameterfvSGIX + typedef void (APIENTRYP GLEEPFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glGetListParameterfvSGIX; + #define glGetListParameterfvSGIX GLeeFuncPtr_glGetListParameterfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glGetListParameterivSGIX +#define GLEE_H_DEFINED_glGetListParameterivSGIX + typedef void (APIENTRYP GLEEPFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glGetListParameterivSGIX; + #define glGetListParameterivSGIX GLeeFuncPtr_glGetListParameterivSGIX +#endif +#ifndef GLEE_H_DEFINED_glListParameterfSGIX +#define GLEE_H_DEFINED_glListParameterfSGIX + typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLLISTPARAMETERFSGIXPROC GLeeFuncPtr_glListParameterfSGIX; + #define glListParameterfSGIX GLeeFuncPtr_glListParameterfSGIX +#endif +#ifndef GLEE_H_DEFINED_glListParameterfvSGIX +#define GLEE_H_DEFINED_glListParameterfvSGIX + typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glListParameterfvSGIX; + #define glListParameterfvSGIX GLeeFuncPtr_glListParameterfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glListParameteriSGIX +#define GLEE_H_DEFINED_glListParameteriSGIX + typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLLISTPARAMETERISGIXPROC GLeeFuncPtr_glListParameteriSGIX; + #define glListParameteriSGIX GLeeFuncPtr_glListParameteriSGIX +#endif +#ifndef GLEE_H_DEFINED_glListParameterivSGIX +#define GLEE_H_DEFINED_glListParameterivSGIX + typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glListParameterivSGIX; + #define glListParameterivSGIX GLeeFuncPtr_glListParameterivSGIX +#endif +#endif + +/* GL_SGIX_ir_instrument1 */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define __GLEE_GL_SGIX_ir_instrument1 1 +/* Constants */ +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +/* GL_SGIX_calligraphic_fragment */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#define __GLEE_GL_SGIX_calligraphic_fragment 1 +/* Constants */ +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +/* GL_SGIX_texture_lod_bias */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define __GLEE_GL_SGIX_texture_lod_bias 1 +/* Constants */ +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +/* GL_SGIX_shadow_ambient */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define __GLEE_GL_SGIX_shadow_ambient 1 +/* Constants */ +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +/* GL_EXT_index_texture */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#define __GLEE_GL_EXT_index_texture 1 +/* Constants */ +#endif + +/* GL_EXT_index_material */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define __GLEE_GL_EXT_index_material 1 +/* Constants */ +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#ifndef GLEE_H_DEFINED_glIndexMaterialEXT +#define GLEE_H_DEFINED_glIndexMaterialEXT + typedef void (APIENTRYP GLEEPFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + GLEE_EXTERN GLEEPFNGLINDEXMATERIALEXTPROC GLeeFuncPtr_glIndexMaterialEXT; + #define glIndexMaterialEXT GLeeFuncPtr_glIndexMaterialEXT +#endif +#endif + +/* GL_EXT_index_func */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define __GLEE_GL_EXT_index_func 1 +/* Constants */ +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#ifndef GLEE_H_DEFINED_glIndexFuncEXT +#define GLEE_H_DEFINED_glIndexFuncEXT + typedef void (APIENTRYP GLEEPFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); + GLEE_EXTERN GLEEPFNGLINDEXFUNCEXTPROC GLeeFuncPtr_glIndexFuncEXT; + #define glIndexFuncEXT GLeeFuncPtr_glIndexFuncEXT +#endif +#endif + +/* GL_EXT_index_array_formats */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define __GLEE_GL_EXT_index_array_formats 1 +/* Constants */ +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +/* GL_EXT_compiled_vertex_array */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define __GLEE_GL_EXT_compiled_vertex_array 1 +/* Constants */ +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#ifndef GLEE_H_DEFINED_glLockArraysEXT +#define GLEE_H_DEFINED_glLockArraysEXT + typedef void (APIENTRYP GLEEPFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); + GLEE_EXTERN GLEEPFNGLLOCKARRAYSEXTPROC GLeeFuncPtr_glLockArraysEXT; + #define glLockArraysEXT GLeeFuncPtr_glLockArraysEXT +#endif +#ifndef GLEE_H_DEFINED_glUnlockArraysEXT +#define GLEE_H_DEFINED_glUnlockArraysEXT + typedef void (APIENTRYP GLEEPFNGLUNLOCKARRAYSEXTPROC) (); + GLEE_EXTERN GLEEPFNGLUNLOCKARRAYSEXTPROC GLeeFuncPtr_glUnlockArraysEXT; + #define glUnlockArraysEXT GLeeFuncPtr_glUnlockArraysEXT +#endif +#endif + +/* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define __GLEE_GL_EXT_cull_vertex 1 +/* Constants */ +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#ifndef GLEE_H_DEFINED_glCullParameterdvEXT +#define GLEE_H_DEFINED_glCullParameterdvEXT + typedef void (APIENTRYP GLEEPFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble * params); + GLEE_EXTERN GLEEPFNGLCULLPARAMETERDVEXTPROC GLeeFuncPtr_glCullParameterdvEXT; + #define glCullParameterdvEXT GLeeFuncPtr_glCullParameterdvEXT +#endif +#ifndef GLEE_H_DEFINED_glCullParameterfvEXT +#define GLEE_H_DEFINED_glCullParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLCULLPARAMETERFVEXTPROC GLeeFuncPtr_glCullParameterfvEXT; + #define glCullParameterfvEXT GLeeFuncPtr_glCullParameterfvEXT +#endif +#endif + +/* GL_SGIX_ycrcb */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define __GLEE_GL_SGIX_ycrcb 1 +/* Constants */ +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +/* GL_SGIX_fragment_lighting */ + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#define __GLEE_GL_SGIX_fragment_lighting 1 +/* Constants */ +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#ifndef GLEE_H_DEFINED_glFragmentColorMaterialSGIX +#define GLEE_H_DEFINED_glFragmentColorMaterialSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); + GLEE_EXTERN GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC GLeeFuncPtr_glFragmentColorMaterialSGIX; + #define glFragmentColorMaterialSGIX GLeeFuncPtr_glFragmentColorMaterialSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightfSGIX +#define GLEE_H_DEFINED_glFragmentLightfSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFSGIXPROC GLeeFuncPtr_glFragmentLightfSGIX; + #define glFragmentLightfSGIX GLeeFuncPtr_glFragmentLightfSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightfvSGIX +#define GLEE_H_DEFINED_glFragmentLightfvSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glFragmentLightfvSGIX; + #define glFragmentLightfvSGIX GLeeFuncPtr_glFragmentLightfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightiSGIX +#define GLEE_H_DEFINED_glFragmentLightiSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTISGIXPROC GLeeFuncPtr_glFragmentLightiSGIX; + #define glFragmentLightiSGIX GLeeFuncPtr_glFragmentLightiSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightivSGIX +#define GLEE_H_DEFINED_glFragmentLightivSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glFragmentLightivSGIX; + #define glFragmentLightivSGIX GLeeFuncPtr_glFragmentLightivSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModelfSGIX +#define GLEE_H_DEFINED_glFragmentLightModelfSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC GLeeFuncPtr_glFragmentLightModelfSGIX; + #define glFragmentLightModelfSGIX GLeeFuncPtr_glFragmentLightModelfSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModelfvSGIX +#define GLEE_H_DEFINED_glFragmentLightModelfvSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC GLeeFuncPtr_glFragmentLightModelfvSGIX; + #define glFragmentLightModelfvSGIX GLeeFuncPtr_glFragmentLightModelfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModeliSGIX +#define GLEE_H_DEFINED_glFragmentLightModeliSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC GLeeFuncPtr_glFragmentLightModeliSGIX; + #define glFragmentLightModeliSGIX GLeeFuncPtr_glFragmentLightModeliSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModelivSGIX +#define GLEE_H_DEFINED_glFragmentLightModelivSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC GLeeFuncPtr_glFragmentLightModelivSGIX; + #define glFragmentLightModelivSGIX GLeeFuncPtr_glFragmentLightModelivSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialfSGIX +#define GLEE_H_DEFINED_glFragmentMaterialfSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFSGIXPROC GLeeFuncPtr_glFragmentMaterialfSGIX; + #define glFragmentMaterialfSGIX GLeeFuncPtr_glFragmentMaterialfSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialfvSGIX +#define GLEE_H_DEFINED_glFragmentMaterialfvSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glFragmentMaterialfvSGIX; + #define glFragmentMaterialfvSGIX GLeeFuncPtr_glFragmentMaterialfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialiSGIX +#define GLEE_H_DEFINED_glFragmentMaterialiSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALISGIXPROC GLeeFuncPtr_glFragmentMaterialiSGIX; + #define glFragmentMaterialiSGIX GLeeFuncPtr_glFragmentMaterialiSGIX +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialivSGIX +#define GLEE_H_DEFINED_glFragmentMaterialivSGIX + typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glFragmentMaterialivSGIX; + #define glFragmentMaterialivSGIX GLeeFuncPtr_glFragmentMaterialivSGIX +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentLightfvSGIX +#define GLEE_H_DEFINED_glGetFragmentLightfvSGIX + typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glGetFragmentLightfvSGIX; + #define glGetFragmentLightfvSGIX GLeeFuncPtr_glGetFragmentLightfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentLightivSGIX +#define GLEE_H_DEFINED_glGetFragmentLightivSGIX + typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glGetFragmentLightivSGIX; + #define glGetFragmentLightivSGIX GLeeFuncPtr_glGetFragmentLightivSGIX +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentMaterialfvSGIX +#define GLEE_H_DEFINED_glGetFragmentMaterialfvSGIX + typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialfvSGIX; + #define glGetFragmentMaterialfvSGIX GLeeFuncPtr_glGetFragmentMaterialfvSGIX +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentMaterialivSGIX +#define GLEE_H_DEFINED_glGetFragmentMaterialivSGIX + typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialivSGIX; + #define glGetFragmentMaterialivSGIX GLeeFuncPtr_glGetFragmentMaterialivSGIX +#endif +#ifndef GLEE_H_DEFINED_glLightEnviSGIX +#define GLEE_H_DEFINED_glLightEnviSGIX + typedef void (APIENTRYP GLEEPFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLLIGHTENVISGIXPROC GLeeFuncPtr_glLightEnviSGIX; + #define glLightEnviSGIX GLeeFuncPtr_glLightEnviSGIX +#endif +#endif + +/* GL_IBM_rasterpos_clip */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define __GLEE_GL_IBM_rasterpos_clip 1 +/* Constants */ +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +/* GL_HP_texture_lighting */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define __GLEE_GL_HP_texture_lighting 1 +/* Constants */ +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +/* GL_EXT_draw_range_elements */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define __GLEE_GL_EXT_draw_range_elements 1 +/* Constants */ +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#ifndef GLEE_H_DEFINED_glDrawRangeElementsEXT +#define GLEE_H_DEFINED_glDrawRangeElementsEXT + typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); + GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTSEXTPROC GLeeFuncPtr_glDrawRangeElementsEXT; + #define glDrawRangeElementsEXT GLeeFuncPtr_glDrawRangeElementsEXT +#endif +#endif + +/* GL_WIN_phong_shading */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define __GLEE_GL_WIN_phong_shading 1 +/* Constants */ +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +/* GL_WIN_specular_fog */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define __GLEE_GL_WIN_specular_fog 1 +/* Constants */ +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +/* GL_EXT_light_texture */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define __GLEE_GL_EXT_light_texture 1 +/* Constants */ +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +#ifndef GLEE_H_DEFINED_glApplyTextureEXT +#define GLEE_H_DEFINED_glApplyTextureEXT + typedef void (APIENTRYP GLEEPFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLAPPLYTEXTUREEXTPROC GLeeFuncPtr_glApplyTextureEXT; + #define glApplyTextureEXT GLeeFuncPtr_glApplyTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureLightEXT +#define GLEE_H_DEFINED_glTextureLightEXT + typedef void (APIENTRYP GLEEPFNGLTEXTURELIGHTEXTPROC) (GLenum pname); + GLEE_EXTERN GLEEPFNGLTEXTURELIGHTEXTPROC GLeeFuncPtr_glTextureLightEXT; + #define glTextureLightEXT GLeeFuncPtr_glTextureLightEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureMaterialEXT +#define GLEE_H_DEFINED_glTextureMaterialEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + GLEE_EXTERN GLEEPFNGLTEXTUREMATERIALEXTPROC GLeeFuncPtr_glTextureMaterialEXT; + #define glTextureMaterialEXT GLeeFuncPtr_glTextureMaterialEXT +#endif +#endif + +/* GL_SGIX_blend_alpha_minmax */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define __GLEE_GL_SGIX_blend_alpha_minmax 1 +/* Constants */ +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +/* GL_SGIX_impact_pixel_texture */ + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_SGIX_impact_pixel_texture 1 +#define __GLEE_GL_SGIX_impact_pixel_texture 1 +/* Constants */ +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +/* GL_EXT_bgra */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define __GLEE_GL_EXT_bgra 1 +/* Constants */ +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_SGIX_async */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define __GLEE_GL_SGIX_async 1 +/* Constants */ +#define GL_ASYNC_MARKER_SGIX 0x8329 +#ifndef GLEE_H_DEFINED_glAsyncMarkerSGIX +#define GLEE_H_DEFINED_glAsyncMarkerSGIX + typedef void (APIENTRYP GLEEPFNGLASYNCMARKERSGIXPROC) (GLuint marker); + GLEE_EXTERN GLEEPFNGLASYNCMARKERSGIXPROC GLeeFuncPtr_glAsyncMarkerSGIX; + #define glAsyncMarkerSGIX GLeeFuncPtr_glAsyncMarkerSGIX +#endif +#ifndef GLEE_H_DEFINED_glFinishAsyncSGIX +#define GLEE_H_DEFINED_glFinishAsyncSGIX + typedef GLint (APIENTRYP GLEEPFNGLFINISHASYNCSGIXPROC) (GLuint * markerp); + GLEE_EXTERN GLEEPFNGLFINISHASYNCSGIXPROC GLeeFuncPtr_glFinishAsyncSGIX; + #define glFinishAsyncSGIX GLeeFuncPtr_glFinishAsyncSGIX +#endif +#ifndef GLEE_H_DEFINED_glPollAsyncSGIX +#define GLEE_H_DEFINED_glPollAsyncSGIX + typedef GLint (APIENTRYP GLEEPFNGLPOLLASYNCSGIXPROC) (GLuint * markerp); + GLEE_EXTERN GLEEPFNGLPOLLASYNCSGIXPROC GLeeFuncPtr_glPollAsyncSGIX; + #define glPollAsyncSGIX GLeeFuncPtr_glPollAsyncSGIX +#endif +#ifndef GLEE_H_DEFINED_glGenAsyncMarkersSGIX +#define GLEE_H_DEFINED_glGenAsyncMarkersSGIX + typedef GLuint (APIENTRYP GLEEPFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); + GLEE_EXTERN GLEEPFNGLGENASYNCMARKERSSGIXPROC GLeeFuncPtr_glGenAsyncMarkersSGIX; + #define glGenAsyncMarkersSGIX GLeeFuncPtr_glGenAsyncMarkersSGIX +#endif +#ifndef GLEE_H_DEFINED_glDeleteAsyncMarkersSGIX +#define GLEE_H_DEFINED_glDeleteAsyncMarkersSGIX + typedef void (APIENTRYP GLEEPFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); + GLEE_EXTERN GLEEPFNGLDELETEASYNCMARKERSSGIXPROC GLeeFuncPtr_glDeleteAsyncMarkersSGIX; + #define glDeleteAsyncMarkersSGIX GLeeFuncPtr_glDeleteAsyncMarkersSGIX +#endif +#ifndef GLEE_H_DEFINED_glIsAsyncMarkerSGIX +#define GLEE_H_DEFINED_glIsAsyncMarkerSGIX + typedef GLboolean (APIENTRYP GLEEPFNGLISASYNCMARKERSGIXPROC) (GLuint marker); + GLEE_EXTERN GLEEPFNGLISASYNCMARKERSGIXPROC GLeeFuncPtr_glIsAsyncMarkerSGIX; + #define glIsAsyncMarkerSGIX GLeeFuncPtr_glIsAsyncMarkerSGIX +#endif +#endif + +/* GL_SGIX_async_pixel */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define __GLEE_GL_SGIX_async_pixel 1 +/* Constants */ +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +/* GL_SGIX_async_histogram */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define __GLEE_GL_SGIX_async_histogram 1 +/* Constants */ +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +/* GL_INTEL_texture_scissor */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 +#define __GLEE_GL_INTEL_texture_scissor 1 +/* Constants */ +#endif + +/* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define __GLEE_GL_INTEL_parallel_arrays 1 +/* Constants */ +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#ifndef GLEE_H_DEFINED_glVertexPointervINTEL +#define GLEE_H_DEFINED_glVertexPointervINTEL + typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXPOINTERVINTELPROC GLeeFuncPtr_glVertexPointervINTEL; + #define glVertexPointervINTEL GLeeFuncPtr_glVertexPointervINTEL +#endif +#ifndef GLEE_H_DEFINED_glNormalPointervINTEL +#define GLEE_H_DEFINED_glNormalPointervINTEL + typedef void (APIENTRYP GLEEPFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLNORMALPOINTERVINTELPROC GLeeFuncPtr_glNormalPointervINTEL; + #define glNormalPointervINTEL GLeeFuncPtr_glNormalPointervINTEL +#endif +#ifndef GLEE_H_DEFINED_glColorPointervINTEL +#define GLEE_H_DEFINED_glColorPointervINTEL + typedef void (APIENTRYP GLEEPFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLCOLORPOINTERVINTELPROC GLeeFuncPtr_glColorPointervINTEL; + #define glColorPointervINTEL GLeeFuncPtr_glColorPointervINTEL +#endif +#ifndef GLEE_H_DEFINED_glTexCoordPointervINTEL +#define GLEE_H_DEFINED_glTexCoordPointervINTEL + typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTERVINTELPROC GLeeFuncPtr_glTexCoordPointervINTEL; + #define glTexCoordPointervINTEL GLeeFuncPtr_glTexCoordPointervINTEL +#endif +#endif + +/* GL_HP_occlusion_test */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define __GLEE_GL_HP_occlusion_test 1 +/* Constants */ +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +/* GL_EXT_pixel_transform */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define __GLEE_GL_EXT_pixel_transform 1 +/* Constants */ +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#ifndef GLEE_H_DEFINED_glPixelTransformParameteriEXT +#define GLEE_H_DEFINED_glPixelTransformParameteriEXT + typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC GLeeFuncPtr_glPixelTransformParameteriEXT; + #define glPixelTransformParameteriEXT GLeeFuncPtr_glPixelTransformParameteriEXT +#endif +#ifndef GLEE_H_DEFINED_glPixelTransformParameterfEXT +#define GLEE_H_DEFINED_glPixelTransformParameterfEXT + typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC GLeeFuncPtr_glPixelTransformParameterfEXT; + #define glPixelTransformParameterfEXT GLeeFuncPtr_glPixelTransformParameterfEXT +#endif +#ifndef GLEE_H_DEFINED_glPixelTransformParameterivEXT +#define GLEE_H_DEFINED_glPixelTransformParameterivEXT + typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC GLeeFuncPtr_glPixelTransformParameterivEXT; + #define glPixelTransformParameterivEXT GLeeFuncPtr_glPixelTransformParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glPixelTransformParameterfvEXT +#define GLEE_H_DEFINED_glPixelTransformParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC GLeeFuncPtr_glPixelTransformParameterfvEXT; + #define glPixelTransformParameterfvEXT GLeeFuncPtr_glPixelTransformParameterfvEXT +#endif +#endif + +/* GL_EXT_pixel_transform_color_table */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#define __GLEE_GL_EXT_pixel_transform_color_table 1 +/* Constants */ +#endif + +/* GL_EXT_shared_texture_palette */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define __GLEE_GL_EXT_shared_texture_palette 1 +/* Constants */ +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +/* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define __GLEE_GL_EXT_separate_specular_color 1 +/* Constants */ +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +/* GL_EXT_secondary_color */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define __GLEE_GL_EXT_secondary_color 1 +/* Constants */ +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#ifndef GLEE_H_DEFINED_glSecondaryColor3bEXT +#define GLEE_H_DEFINED_glSecondaryColor3bEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BEXTPROC GLeeFuncPtr_glSecondaryColor3bEXT; + #define glSecondaryColor3bEXT GLeeFuncPtr_glSecondaryColor3bEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3bvEXT +#define GLEE_H_DEFINED_glSecondaryColor3bvEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BVEXTPROC GLeeFuncPtr_glSecondaryColor3bvEXT; + #define glSecondaryColor3bvEXT GLeeFuncPtr_glSecondaryColor3bvEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3dEXT +#define GLEE_H_DEFINED_glSecondaryColor3dEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DEXTPROC GLeeFuncPtr_glSecondaryColor3dEXT; + #define glSecondaryColor3dEXT GLeeFuncPtr_glSecondaryColor3dEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3dvEXT +#define GLEE_H_DEFINED_glSecondaryColor3dvEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DVEXTPROC GLeeFuncPtr_glSecondaryColor3dvEXT; + #define glSecondaryColor3dvEXT GLeeFuncPtr_glSecondaryColor3dvEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3fEXT +#define GLEE_H_DEFINED_glSecondaryColor3fEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FEXTPROC GLeeFuncPtr_glSecondaryColor3fEXT; + #define glSecondaryColor3fEXT GLeeFuncPtr_glSecondaryColor3fEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3fvEXT +#define GLEE_H_DEFINED_glSecondaryColor3fvEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FVEXTPROC GLeeFuncPtr_glSecondaryColor3fvEXT; + #define glSecondaryColor3fvEXT GLeeFuncPtr_glSecondaryColor3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3iEXT +#define GLEE_H_DEFINED_glSecondaryColor3iEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IEXTPROC GLeeFuncPtr_glSecondaryColor3iEXT; + #define glSecondaryColor3iEXT GLeeFuncPtr_glSecondaryColor3iEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3ivEXT +#define GLEE_H_DEFINED_glSecondaryColor3ivEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IVEXTPROC GLeeFuncPtr_glSecondaryColor3ivEXT; + #define glSecondaryColor3ivEXT GLeeFuncPtr_glSecondaryColor3ivEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3sEXT +#define GLEE_H_DEFINED_glSecondaryColor3sEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SEXTPROC GLeeFuncPtr_glSecondaryColor3sEXT; + #define glSecondaryColor3sEXT GLeeFuncPtr_glSecondaryColor3sEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3svEXT +#define GLEE_H_DEFINED_glSecondaryColor3svEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SVEXTPROC GLeeFuncPtr_glSecondaryColor3svEXT; + #define glSecondaryColor3svEXT GLeeFuncPtr_glSecondaryColor3svEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3ubEXT +#define GLEE_H_DEFINED_glSecondaryColor3ubEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBEXTPROC GLeeFuncPtr_glSecondaryColor3ubEXT; + #define glSecondaryColor3ubEXT GLeeFuncPtr_glSecondaryColor3ubEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3ubvEXT +#define GLEE_H_DEFINED_glSecondaryColor3ubvEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC GLeeFuncPtr_glSecondaryColor3ubvEXT; + #define glSecondaryColor3ubvEXT GLeeFuncPtr_glSecondaryColor3ubvEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3uiEXT +#define GLEE_H_DEFINED_glSecondaryColor3uiEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIEXTPROC GLeeFuncPtr_glSecondaryColor3uiEXT; + #define glSecondaryColor3uiEXT GLeeFuncPtr_glSecondaryColor3uiEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3uivEXT +#define GLEE_H_DEFINED_glSecondaryColor3uivEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC GLeeFuncPtr_glSecondaryColor3uivEXT; + #define glSecondaryColor3uivEXT GLeeFuncPtr_glSecondaryColor3uivEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3usEXT +#define GLEE_H_DEFINED_glSecondaryColor3usEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USEXTPROC GLeeFuncPtr_glSecondaryColor3usEXT; + #define glSecondaryColor3usEXT GLeeFuncPtr_glSecondaryColor3usEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3usvEXT +#define GLEE_H_DEFINED_glSecondaryColor3usvEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USVEXTPROC GLeeFuncPtr_glSecondaryColor3usvEXT; + #define glSecondaryColor3usvEXT GLeeFuncPtr_glSecondaryColor3usvEXT +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColorPointerEXT +#define GLEE_H_DEFINED_glSecondaryColorPointerEXT + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC GLeeFuncPtr_glSecondaryColorPointerEXT; + #define glSecondaryColorPointerEXT GLeeFuncPtr_glSecondaryColorPointerEXT +#endif +#endif + +/* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define __GLEE_GL_EXT_texture_perturb_normal 1 +/* Constants */ +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#ifndef GLEE_H_DEFINED_glTextureNormalEXT +#define GLEE_H_DEFINED_glTextureNormalEXT + typedef void (APIENTRYP GLEEPFNGLTEXTURENORMALEXTPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLTEXTURENORMALEXTPROC GLeeFuncPtr_glTextureNormalEXT; + #define glTextureNormalEXT GLeeFuncPtr_glTextureNormalEXT +#endif +#endif + +/* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#define __GLEE_GL_EXT_multi_draw_arrays 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glMultiDrawArraysEXT +#define GLEE_H_DEFINED_glMultiDrawArraysEXT + typedef void (APIENTRYP GLEEPFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLMULTIDRAWARRAYSEXTPROC GLeeFuncPtr_glMultiDrawArraysEXT; + #define glMultiDrawArraysEXT GLeeFuncPtr_glMultiDrawArraysEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiDrawElementsEXT +#define GLEE_H_DEFINED_glMultiDrawElementsEXT + typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTSEXTPROC GLeeFuncPtr_glMultiDrawElementsEXT; + #define glMultiDrawElementsEXT GLeeFuncPtr_glMultiDrawElementsEXT +#endif +#endif + +/* GL_EXT_fog_coord */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define __GLEE_GL_EXT_fog_coord 1 +/* Constants */ +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#ifndef GLEE_H_DEFINED_glFogCoordfEXT +#define GLEE_H_DEFINED_glFogCoordfEXT + typedef void (APIENTRYP GLEEPFNGLFOGCOORDFEXTPROC) (GLfloat coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDFEXTPROC GLeeFuncPtr_glFogCoordfEXT; + #define glFogCoordfEXT GLeeFuncPtr_glFogCoordfEXT +#endif +#ifndef GLEE_H_DEFINED_glFogCoordfvEXT +#define GLEE_H_DEFINED_glFogCoordfvEXT + typedef void (APIENTRYP GLEEPFNGLFOGCOORDFVEXTPROC) (const GLfloat * coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDFVEXTPROC GLeeFuncPtr_glFogCoordfvEXT; + #define glFogCoordfvEXT GLeeFuncPtr_glFogCoordfvEXT +#endif +#ifndef GLEE_H_DEFINED_glFogCoorddEXT +#define GLEE_H_DEFINED_glFogCoorddEXT + typedef void (APIENTRYP GLEEPFNGLFOGCOORDDEXTPROC) (GLdouble coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDDEXTPROC GLeeFuncPtr_glFogCoorddEXT; + #define glFogCoorddEXT GLeeFuncPtr_glFogCoorddEXT +#endif +#ifndef GLEE_H_DEFINED_glFogCoorddvEXT +#define GLEE_H_DEFINED_glFogCoorddvEXT + typedef void (APIENTRYP GLEEPFNGLFOGCOORDDVEXTPROC) (const GLdouble * coord); + GLEE_EXTERN GLEEPFNGLFOGCOORDDVEXTPROC GLeeFuncPtr_glFogCoorddvEXT; + #define glFogCoorddvEXT GLeeFuncPtr_glFogCoorddvEXT +#endif +#ifndef GLEE_H_DEFINED_glFogCoordPointerEXT +#define GLEE_H_DEFINED_glFogCoordPointerEXT + typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTEREXTPROC GLeeFuncPtr_glFogCoordPointerEXT; + #define glFogCoordPointerEXT GLeeFuncPtr_glFogCoordPointerEXT +#endif +#endif + +/* GL_REND_screen_coordinates */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define __GLEE_GL_REND_screen_coordinates 1 +/* Constants */ +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +/* GL_EXT_coordinate_frame */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define __GLEE_GL_EXT_coordinate_frame 1 +/* Constants */ +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#ifndef GLEE_H_DEFINED_glTangent3bEXT +#define GLEE_H_DEFINED_glTangent3bEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); + GLEE_EXTERN GLEEPFNGLTANGENT3BEXTPROC GLeeFuncPtr_glTangent3bEXT; + #define glTangent3bEXT GLeeFuncPtr_glTangent3bEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3bvEXT +#define GLEE_H_DEFINED_glTangent3bvEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3BVEXTPROC) (const GLbyte * v); + GLEE_EXTERN GLEEPFNGLTANGENT3BVEXTPROC GLeeFuncPtr_glTangent3bvEXT; + #define glTangent3bvEXT GLeeFuncPtr_glTangent3bvEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3dEXT +#define GLEE_H_DEFINED_glTangent3dEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); + GLEE_EXTERN GLEEPFNGLTANGENT3DEXTPROC GLeeFuncPtr_glTangent3dEXT; + #define glTangent3dEXT GLeeFuncPtr_glTangent3dEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3dvEXT +#define GLEE_H_DEFINED_glTangent3dvEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3DVEXTPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLTANGENT3DVEXTPROC GLeeFuncPtr_glTangent3dvEXT; + #define glTangent3dvEXT GLeeFuncPtr_glTangent3dvEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3fEXT +#define GLEE_H_DEFINED_glTangent3fEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); + GLEE_EXTERN GLEEPFNGLTANGENT3FEXTPROC GLeeFuncPtr_glTangent3fEXT; + #define glTangent3fEXT GLeeFuncPtr_glTangent3fEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3fvEXT +#define GLEE_H_DEFINED_glTangent3fvEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3FVEXTPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTANGENT3FVEXTPROC GLeeFuncPtr_glTangent3fvEXT; + #define glTangent3fvEXT GLeeFuncPtr_glTangent3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3iEXT +#define GLEE_H_DEFINED_glTangent3iEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); + GLEE_EXTERN GLEEPFNGLTANGENT3IEXTPROC GLeeFuncPtr_glTangent3iEXT; + #define glTangent3iEXT GLeeFuncPtr_glTangent3iEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3ivEXT +#define GLEE_H_DEFINED_glTangent3ivEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3IVEXTPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLTANGENT3IVEXTPROC GLeeFuncPtr_glTangent3ivEXT; + #define glTangent3ivEXT GLeeFuncPtr_glTangent3ivEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3sEXT +#define GLEE_H_DEFINED_glTangent3sEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); + GLEE_EXTERN GLEEPFNGLTANGENT3SEXTPROC GLeeFuncPtr_glTangent3sEXT; + #define glTangent3sEXT GLeeFuncPtr_glTangent3sEXT +#endif +#ifndef GLEE_H_DEFINED_glTangent3svEXT +#define GLEE_H_DEFINED_glTangent3svEXT + typedef void (APIENTRYP GLEEPFNGLTANGENT3SVEXTPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLTANGENT3SVEXTPROC GLeeFuncPtr_glTangent3svEXT; + #define glTangent3svEXT GLeeFuncPtr_glTangent3svEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3bEXT +#define GLEE_H_DEFINED_glBinormal3bEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); + GLEE_EXTERN GLEEPFNGLBINORMAL3BEXTPROC GLeeFuncPtr_glBinormal3bEXT; + #define glBinormal3bEXT GLeeFuncPtr_glBinormal3bEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3bvEXT +#define GLEE_H_DEFINED_glBinormal3bvEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3BVEXTPROC) (const GLbyte * v); + GLEE_EXTERN GLEEPFNGLBINORMAL3BVEXTPROC GLeeFuncPtr_glBinormal3bvEXT; + #define glBinormal3bvEXT GLeeFuncPtr_glBinormal3bvEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3dEXT +#define GLEE_H_DEFINED_glBinormal3dEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); + GLEE_EXTERN GLEEPFNGLBINORMAL3DEXTPROC GLeeFuncPtr_glBinormal3dEXT; + #define glBinormal3dEXT GLeeFuncPtr_glBinormal3dEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3dvEXT +#define GLEE_H_DEFINED_glBinormal3dvEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3DVEXTPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLBINORMAL3DVEXTPROC GLeeFuncPtr_glBinormal3dvEXT; + #define glBinormal3dvEXT GLeeFuncPtr_glBinormal3dvEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3fEXT +#define GLEE_H_DEFINED_glBinormal3fEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); + GLEE_EXTERN GLEEPFNGLBINORMAL3FEXTPROC GLeeFuncPtr_glBinormal3fEXT; + #define glBinormal3fEXT GLeeFuncPtr_glBinormal3fEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3fvEXT +#define GLEE_H_DEFINED_glBinormal3fvEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3FVEXTPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLBINORMAL3FVEXTPROC GLeeFuncPtr_glBinormal3fvEXT; + #define glBinormal3fvEXT GLeeFuncPtr_glBinormal3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3iEXT +#define GLEE_H_DEFINED_glBinormal3iEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); + GLEE_EXTERN GLEEPFNGLBINORMAL3IEXTPROC GLeeFuncPtr_glBinormal3iEXT; + #define glBinormal3iEXT GLeeFuncPtr_glBinormal3iEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3ivEXT +#define GLEE_H_DEFINED_glBinormal3ivEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3IVEXTPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLBINORMAL3IVEXTPROC GLeeFuncPtr_glBinormal3ivEXT; + #define glBinormal3ivEXT GLeeFuncPtr_glBinormal3ivEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3sEXT +#define GLEE_H_DEFINED_glBinormal3sEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); + GLEE_EXTERN GLEEPFNGLBINORMAL3SEXTPROC GLeeFuncPtr_glBinormal3sEXT; + #define glBinormal3sEXT GLeeFuncPtr_glBinormal3sEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormal3svEXT +#define GLEE_H_DEFINED_glBinormal3svEXT + typedef void (APIENTRYP GLEEPFNGLBINORMAL3SVEXTPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLBINORMAL3SVEXTPROC GLeeFuncPtr_glBinormal3svEXT; + #define glBinormal3svEXT GLeeFuncPtr_glBinormal3svEXT +#endif +#ifndef GLEE_H_DEFINED_glTangentPointerEXT +#define GLEE_H_DEFINED_glTangentPointerEXT + typedef void (APIENTRYP GLEEPFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLTANGENTPOINTEREXTPROC GLeeFuncPtr_glTangentPointerEXT; + #define glTangentPointerEXT GLeeFuncPtr_glTangentPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glBinormalPointerEXT +#define GLEE_H_DEFINED_glBinormalPointerEXT + typedef void (APIENTRYP GLEEPFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLBINORMALPOINTEREXTPROC GLeeFuncPtr_glBinormalPointerEXT; + #define glBinormalPointerEXT GLeeFuncPtr_glBinormalPointerEXT +#endif +#endif + +/* GL_EXT_texture_env_combine */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define __GLEE_GL_EXT_texture_env_combine 1 +/* Constants */ +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +/* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define __GLEE_GL_APPLE_specular_vector 1 +/* Constants */ +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +/* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define __GLEE_GL_APPLE_transform_hint 1 +/* Constants */ +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +/* GL_SGIX_fog_scale */ + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#define __GLEE_GL_SGIX_fog_scale 1 +/* Constants */ +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +/* GL_SUNX_constant_data */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#define __GLEE_GL_SUNX_constant_data 1 +/* Constants */ +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#ifndef GLEE_H_DEFINED_glFinishTextureSUNX +#define GLEE_H_DEFINED_glFinishTextureSUNX + typedef void (APIENTRYP GLEEPFNGLFINISHTEXTURESUNXPROC) (); + GLEE_EXTERN GLEEPFNGLFINISHTEXTURESUNXPROC GLeeFuncPtr_glFinishTextureSUNX; + #define glFinishTextureSUNX GLeeFuncPtr_glFinishTextureSUNX +#endif +#endif + +/* GL_SUN_global_alpha */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#define __GLEE_GL_SUN_global_alpha 1 +/* Constants */ +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorbSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactorbSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorbSUN; + #define glGlobalAlphaFactorbSUN GLeeFuncPtr_glGlobalAlphaFactorbSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorsSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactorsSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorsSUN; + #define glGlobalAlphaFactorsSUN GLeeFuncPtr_glGlobalAlphaFactorsSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactoriSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactoriSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORISUNPROC GLeeFuncPtr_glGlobalAlphaFactoriSUN; + #define glGlobalAlphaFactoriSUN GLeeFuncPtr_glGlobalAlphaFactoriSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorfSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactorfSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORFSUNPROC GLeeFuncPtr_glGlobalAlphaFactorfSUN; + #define glGlobalAlphaFactorfSUN GLeeFuncPtr_glGlobalAlphaFactorfSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactordSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactordSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORDSUNPROC GLeeFuncPtr_glGlobalAlphaFactordSUN; + #define glGlobalAlphaFactordSUN GLeeFuncPtr_glGlobalAlphaFactordSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorubSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactorubSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorubSUN; + #define glGlobalAlphaFactorubSUN GLeeFuncPtr_glGlobalAlphaFactorubSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorusSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactorusSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorusSUN; + #define glGlobalAlphaFactorusSUN GLeeFuncPtr_glGlobalAlphaFactorusSUN +#endif +#ifndef GLEE_H_DEFINED_glGlobalAlphaFactoruiSUN +#define GLEE_H_DEFINED_glGlobalAlphaFactoruiSUN + typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); + GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUISUNPROC GLeeFuncPtr_glGlobalAlphaFactoruiSUN; + #define glGlobalAlphaFactoruiSUN GLeeFuncPtr_glGlobalAlphaFactoruiSUN +#endif +#endif + +/* GL_SUN_triangle_list */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#define __GLEE_GL_SUN_triangle_list 1 +/* Constants */ +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#ifndef GLEE_H_DEFINED_glReplacementCodeuiSUN +#define GLEE_H_DEFINED_glReplacementCodeuiSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUISUNPROC GLeeFuncPtr_glReplacementCodeuiSUN; + #define glReplacementCodeuiSUN GLeeFuncPtr_glReplacementCodeuiSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeusSUN +#define GLEE_H_DEFINED_glReplacementCodeusSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUSSUNPROC GLeeFuncPtr_glReplacementCodeusSUN; + #define glReplacementCodeusSUN GLeeFuncPtr_glReplacementCodeusSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeubSUN +#define GLEE_H_DEFINED_glReplacementCodeubSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUBSUNPROC GLeeFuncPtr_glReplacementCodeubSUN; + #define glReplacementCodeubSUN GLeeFuncPtr_glReplacementCodeubSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuivSUN +#define GLEE_H_DEFINED_glReplacementCodeuivSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint * code); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVSUNPROC GLeeFuncPtr_glReplacementCodeuivSUN; + #define glReplacementCodeuivSUN GLeeFuncPtr_glReplacementCodeuivSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeusvSUN +#define GLEE_H_DEFINED_glReplacementCodeusvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort * code); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUSVSUNPROC GLeeFuncPtr_glReplacementCodeusvSUN; + #define glReplacementCodeusvSUN GLeeFuncPtr_glReplacementCodeusvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeubvSUN +#define GLEE_H_DEFINED_glReplacementCodeubvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte * code); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUBVSUNPROC GLeeFuncPtr_glReplacementCodeubvSUN; + #define glReplacementCodeubvSUN GLeeFuncPtr_glReplacementCodeubvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodePointerSUN +#define GLEE_H_DEFINED_glReplacementCodePointerSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC GLeeFuncPtr_glReplacementCodePointerSUN; + #define glReplacementCodePointerSUN GLeeFuncPtr_glReplacementCodePointerSUN +#endif +#endif + +/* GL_SUN_vertex */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#define __GLEE_GL_SUN_vertex 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glColor4ubVertex2fSUN +#define GLEE_H_DEFINED_glColor4ubVertex2fSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC GLeeFuncPtr_glColor4ubVertex2fSUN; + #define glColor4ubVertex2fSUN GLeeFuncPtr_glColor4ubVertex2fSUN +#endif +#ifndef GLEE_H_DEFINED_glColor4ubVertex2fvSUN +#define GLEE_H_DEFINED_glColor4ubVertex2fvSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC GLeeFuncPtr_glColor4ubVertex2fvSUN; + #define glColor4ubVertex2fvSUN GLeeFuncPtr_glColor4ubVertex2fvSUN +#endif +#ifndef GLEE_H_DEFINED_glColor4ubVertex3fSUN +#define GLEE_H_DEFINED_glColor4ubVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glColor4ubVertex3fSUN; + #define glColor4ubVertex3fSUN GLeeFuncPtr_glColor4ubVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glColor4ubVertex3fvSUN +#define GLEE_H_DEFINED_glColor4ubVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glColor4ubVertex3fvSUN; + #define glColor4ubVertex3fvSUN GLeeFuncPtr_glColor4ubVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glColor3fVertex3fSUN +#define GLEE_H_DEFINED_glColor3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glColor3fVertex3fSUN; + #define glColor3fVertex3fSUN GLeeFuncPtr_glColor3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glColor3fVertex3fvSUN +#define GLEE_H_DEFINED_glColor3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor3fVertex3fvSUN; + #define glColor3fVertex3fvSUN GLeeFuncPtr_glColor3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glNormal3fVertex3fSUN; + #define glNormal3fVertex3fSUN GLeeFuncPtr_glNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glNormal3fVertex3fvSUN; + #define glNormal3fVertex3fvSUN GLeeFuncPtr_glNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glColor4fNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glColor4fNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fSUN; + #define glColor4fNormal3fVertex3fSUN GLeeFuncPtr_glColor4fNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glColor4fNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glColor4fNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * c, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN; + #define glColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fVertex3fSUN +#define GLEE_H_DEFINED_glTexCoord2fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fSUN; + #define glTexCoord2fVertex3fSUN GLeeFuncPtr_glTexCoord2fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fVertex3fvSUN +#define GLEE_H_DEFINED_glTexCoord2fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fvSUN; + #define glTexCoord2fVertex3fvSUN GLeeFuncPtr_glTexCoord2fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord4fVertex4fSUN +#define GLEE_H_DEFINED_glTexCoord4fVertex4fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fSUN; + #define glTexCoord4fVertex4fSUN GLeeFuncPtr_glTexCoord4fVertex4fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord4fVertex4fvSUN +#define GLEE_H_DEFINED_glTexCoord4fVertex4fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat * tc, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fvSUN; + #define glTexCoord4fVertex4fvSUN GLeeFuncPtr_glTexCoord4fVertex4fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fSUN +#define GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN; + #define glTexCoord2fColor4ubVertex3fSUN GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fvSUN +#define GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat * tc, const GLubyte * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN; + #define glTexCoord2fColor4ubVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fSUN +#define GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN; + #define glTexCoord2fColor3fVertex3fSUN GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fvSUN +#define GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN; + #define glTexCoord2fColor3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN; + #define glTexCoord2fNormal3fVertex3fSUN GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN; + #define glTexCoord2fNormal3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN; + #define glTexCoord2fColor4fNormal3fVertex3fSUN GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN; + #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN +#define GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN; + #define glTexCoord4fColor4fNormal3fVertex4fSUN GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN +#endif +#ifndef GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN +#define GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN + typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN; + #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fSUN; + #define glReplacementCodeuiVertex3fSUN GLeeFuncPtr_glReplacementCodeuiVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN; + #define glReplacementCodeuiVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN; + #define glReplacementCodeuiColor4ubVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint * rc, const GLubyte * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN; + #define glReplacementCodeuiColor4ubVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN; + #define glReplacementCodeuiColor3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * c, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN; + #define glReplacementCodeuiColor3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN; + #define glReplacementCodeuiNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN; + #define glReplacementCodeuiNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN; + #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; + #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN; + #define glReplacementCodeuiTexCoord2fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN; + #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; + #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; + #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; + #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +#endif +#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN + typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; + #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +#endif +#endif + +/* GL_EXT_blend_func_separate */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define __GLEE_GL_EXT_blend_func_separate 1 +/* Constants */ +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#ifndef GLEE_H_DEFINED_glBlendFuncSeparateEXT +#define GLEE_H_DEFINED_glBlendFuncSeparateEXT + typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEEXTPROC GLeeFuncPtr_glBlendFuncSeparateEXT; + #define glBlendFuncSeparateEXT GLeeFuncPtr_glBlendFuncSeparateEXT +#endif +#endif + +/* GL_INGR_color_clamp */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define __GLEE_GL_INGR_color_clamp 1 +/* Constants */ +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +/* GL_INGR_interlace_read */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define __GLEE_GL_INGR_interlace_read 1 +/* Constants */ +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +/* GL_EXT_stencil_wrap */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define __GLEE_GL_EXT_stencil_wrap 1 +/* Constants */ +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +/* GL_EXT_422_pixels */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define __GLEE_GL_EXT_422_pixels 1 +/* Constants */ +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +/* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define __GLEE_GL_NV_texgen_reflection 1 +/* Constants */ +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +/* GL_EXT_texture_cube_map */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define __GLEE_GL_EXT_texture_cube_map 1 +/* Constants */ +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +/* GL_SUN_convolution_border_modes */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define __GLEE_GL_SUN_convolution_border_modes 1 +/* Constants */ +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +/* GL_EXT_texture_env_add */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#define __GLEE_GL_EXT_texture_env_add 1 +/* Constants */ +#endif + +/* GL_EXT_texture_lod_bias */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define __GLEE_GL_EXT_texture_lod_bias 1 +/* Constants */ +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +/* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define __GLEE_GL_EXT_texture_filter_anisotropic 1 +/* Constants */ +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +/* GL_EXT_vertex_weighting */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define __GLEE_GL_EXT_vertex_weighting 1 +/* Constants */ +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#ifndef GLEE_H_DEFINED_glVertexWeightfEXT +#define GLEE_H_DEFINED_glVertexWeightfEXT + typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); + GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTFEXTPROC GLeeFuncPtr_glVertexWeightfEXT; + #define glVertexWeightfEXT GLeeFuncPtr_glVertexWeightfEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexWeightfvEXT +#define GLEE_H_DEFINED_glVertexWeightfvEXT + typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat * weight); + GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTFVEXTPROC GLeeFuncPtr_glVertexWeightfvEXT; + #define glVertexWeightfvEXT GLeeFuncPtr_glVertexWeightfvEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexWeightPointerEXT +#define GLEE_H_DEFINED_glVertexWeightPointerEXT + typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC GLeeFuncPtr_glVertexWeightPointerEXT; + #define glVertexWeightPointerEXT GLeeFuncPtr_glVertexWeightPointerEXT +#endif +#endif + +/* GL_NV_light_max_exponent */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define __GLEE_GL_NV_light_max_exponent 1 +/* Constants */ +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +/* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define __GLEE_GL_NV_vertex_array_range 1 +/* Constants */ +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#ifndef GLEE_H_DEFINED_glFlushVertexArrayRangeNV +#define GLEE_H_DEFINED_glFlushVertexArrayRangeNV + typedef void (APIENTRYP GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC) (); + GLEE_EXTERN GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC GLeeFuncPtr_glFlushVertexArrayRangeNV; + #define glFlushVertexArrayRangeNV GLeeFuncPtr_glFlushVertexArrayRangeNV +#endif +#ifndef GLEE_H_DEFINED_glVertexArrayRangeNV +#define GLEE_H_DEFINED_glVertexArrayRangeNV + typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXARRAYRANGENVPROC GLeeFuncPtr_glVertexArrayRangeNV; + #define glVertexArrayRangeNV GLeeFuncPtr_glVertexArrayRangeNV +#endif +#endif + +/* GL_NV_register_combiners */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define __GLEE_GL_NV_register_combiners 1 +/* Constants */ +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +#ifndef GLEE_H_DEFINED_glCombinerParameterfvNV +#define GLEE_H_DEFINED_glCombinerParameterfvNV + typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERFVNVPROC GLeeFuncPtr_glCombinerParameterfvNV; + #define glCombinerParameterfvNV GLeeFuncPtr_glCombinerParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glCombinerParameterfNV +#define GLEE_H_DEFINED_glCombinerParameterfNV + typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERFNVPROC GLeeFuncPtr_glCombinerParameterfNV; + #define glCombinerParameterfNV GLeeFuncPtr_glCombinerParameterfNV +#endif +#ifndef GLEE_H_DEFINED_glCombinerParameterivNV +#define GLEE_H_DEFINED_glCombinerParameterivNV + typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERIVNVPROC GLeeFuncPtr_glCombinerParameterivNV; + #define glCombinerParameterivNV GLeeFuncPtr_glCombinerParameterivNV +#endif +#ifndef GLEE_H_DEFINED_glCombinerParameteriNV +#define GLEE_H_DEFINED_glCombinerParameteriNV + typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERINVPROC GLeeFuncPtr_glCombinerParameteriNV; + #define glCombinerParameteriNV GLeeFuncPtr_glCombinerParameteriNV +#endif +#ifndef GLEE_H_DEFINED_glCombinerInputNV +#define GLEE_H_DEFINED_glCombinerInputNV + typedef void (APIENTRYP GLEEPFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); + GLEE_EXTERN GLEEPFNGLCOMBINERINPUTNVPROC GLeeFuncPtr_glCombinerInputNV; + #define glCombinerInputNV GLeeFuncPtr_glCombinerInputNV +#endif +#ifndef GLEE_H_DEFINED_glCombinerOutputNV +#define GLEE_H_DEFINED_glCombinerOutputNV + typedef void (APIENTRYP GLEEPFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); + GLEE_EXTERN GLEEPFNGLCOMBINEROUTPUTNVPROC GLeeFuncPtr_glCombinerOutputNV; + #define glCombinerOutputNV GLeeFuncPtr_glCombinerOutputNV +#endif +#ifndef GLEE_H_DEFINED_glFinalCombinerInputNV +#define GLEE_H_DEFINED_glFinalCombinerInputNV + typedef void (APIENTRYP GLEEPFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); + GLEE_EXTERN GLEEPFNGLFINALCOMBINERINPUTNVPROC GLeeFuncPtr_glFinalCombinerInputNV; + #define glFinalCombinerInputNV GLeeFuncPtr_glFinalCombinerInputNV +#endif +#ifndef GLEE_H_DEFINED_glGetCombinerInputParameterfvNV +#define GLEE_H_DEFINED_glGetCombinerInputParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerInputParameterfvNV; + #define glGetCombinerInputParameterfvNV GLeeFuncPtr_glGetCombinerInputParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetCombinerInputParameterivNV +#define GLEE_H_DEFINED_glGetCombinerInputParameterivNV + typedef void (APIENTRYP GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerInputParameterivNV; + #define glGetCombinerInputParameterivNV GLeeFuncPtr_glGetCombinerInputParameterivNV +#endif +#ifndef GLEE_H_DEFINED_glGetCombinerOutputParameterfvNV +#define GLEE_H_DEFINED_glGetCombinerOutputParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterfvNV; + #define glGetCombinerOutputParameterfvNV GLeeFuncPtr_glGetCombinerOutputParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetCombinerOutputParameterivNV +#define GLEE_H_DEFINED_glGetCombinerOutputParameterivNV + typedef void (APIENTRYP GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterivNV; + #define glGetCombinerOutputParameterivNV GLeeFuncPtr_glGetCombinerOutputParameterivNV +#endif +#ifndef GLEE_H_DEFINED_glGetFinalCombinerInputParameterfvNV +#define GLEE_H_DEFINED_glGetFinalCombinerInputParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV; + #define glGetFinalCombinerInputParameterfvNV GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetFinalCombinerInputParameterivNV +#define GLEE_H_DEFINED_glGetFinalCombinerInputParameterivNV + typedef void (APIENTRYP GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterivNV; + #define glGetFinalCombinerInputParameterivNV GLeeFuncPtr_glGetFinalCombinerInputParameterivNV +#endif +#endif + +/* GL_NV_fog_distance */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define __GLEE_GL_NV_fog_distance 1 +/* Constants */ +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif + +/* GL_NV_texgen_emboss */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define __GLEE_GL_NV_texgen_emboss 1 +/* Constants */ +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +/* GL_NV_blend_square */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#define __GLEE_GL_NV_blend_square 1 +/* Constants */ +#endif + +/* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define __GLEE_GL_NV_texture_env_combine4 1 +/* Constants */ +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +/* GL_MESA_resize_buffers */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#define __GLEE_GL_MESA_resize_buffers 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glResizeBuffersMESA +#define GLEE_H_DEFINED_glResizeBuffersMESA + typedef void (APIENTRYP GLEEPFNGLRESIZEBUFFERSMESAPROC) (); + GLEE_EXTERN GLEEPFNGLRESIZEBUFFERSMESAPROC GLeeFuncPtr_glResizeBuffersMESA; + #define glResizeBuffersMESA GLeeFuncPtr_glResizeBuffersMESA +#endif +#endif + +/* GL_MESA_window_pos */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#define __GLEE_GL_MESA_window_pos 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glWindowPos2dMESA +#define GLEE_H_DEFINED_glWindowPos2dMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2DMESAPROC GLeeFuncPtr_glWindowPos2dMESA; + #define glWindowPos2dMESA GLeeFuncPtr_glWindowPos2dMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2dvMESA +#define GLEE_H_DEFINED_glWindowPos2dvMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVMESAPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVMESAPROC GLeeFuncPtr_glWindowPos2dvMESA; + #define glWindowPos2dvMESA GLeeFuncPtr_glWindowPos2dvMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2fMESA +#define GLEE_H_DEFINED_glWindowPos2fMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2FMESAPROC GLeeFuncPtr_glWindowPos2fMESA; + #define glWindowPos2fMESA GLeeFuncPtr_glWindowPos2fMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2fvMESA +#define GLEE_H_DEFINED_glWindowPos2fvMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVMESAPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVMESAPROC GLeeFuncPtr_glWindowPos2fvMESA; + #define glWindowPos2fvMESA GLeeFuncPtr_glWindowPos2fvMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2iMESA +#define GLEE_H_DEFINED_glWindowPos2iMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2IMESAPROC GLeeFuncPtr_glWindowPos2iMESA; + #define glWindowPos2iMESA GLeeFuncPtr_glWindowPos2iMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2ivMESA +#define GLEE_H_DEFINED_glWindowPos2ivMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVMESAPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVMESAPROC GLeeFuncPtr_glWindowPos2ivMESA; + #define glWindowPos2ivMESA GLeeFuncPtr_glWindowPos2ivMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2sMESA +#define GLEE_H_DEFINED_glWindowPos2sMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2SMESAPROC GLeeFuncPtr_glWindowPos2sMESA; + #define glWindowPos2sMESA GLeeFuncPtr_glWindowPos2sMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos2svMESA +#define GLEE_H_DEFINED_glWindowPos2svMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVMESAPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVMESAPROC GLeeFuncPtr_glWindowPos2svMESA; + #define glWindowPos2svMESA GLeeFuncPtr_glWindowPos2svMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3dMESA +#define GLEE_H_DEFINED_glWindowPos3dMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3DMESAPROC GLeeFuncPtr_glWindowPos3dMESA; + #define glWindowPos3dMESA GLeeFuncPtr_glWindowPos3dMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3dvMESA +#define GLEE_H_DEFINED_glWindowPos3dvMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVMESAPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVMESAPROC GLeeFuncPtr_glWindowPos3dvMESA; + #define glWindowPos3dvMESA GLeeFuncPtr_glWindowPos3dvMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3fMESA +#define GLEE_H_DEFINED_glWindowPos3fMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3FMESAPROC GLeeFuncPtr_glWindowPos3fMESA; + #define glWindowPos3fMESA GLeeFuncPtr_glWindowPos3fMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3fvMESA +#define GLEE_H_DEFINED_glWindowPos3fvMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVMESAPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVMESAPROC GLeeFuncPtr_glWindowPos3fvMESA; + #define glWindowPos3fvMESA GLeeFuncPtr_glWindowPos3fvMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3iMESA +#define GLEE_H_DEFINED_glWindowPos3iMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3IMESAPROC GLeeFuncPtr_glWindowPos3iMESA; + #define glWindowPos3iMESA GLeeFuncPtr_glWindowPos3iMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3ivMESA +#define GLEE_H_DEFINED_glWindowPos3ivMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVMESAPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVMESAPROC GLeeFuncPtr_glWindowPos3ivMESA; + #define glWindowPos3ivMESA GLeeFuncPtr_glWindowPos3ivMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3sMESA +#define GLEE_H_DEFINED_glWindowPos3sMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3SMESAPROC GLeeFuncPtr_glWindowPos3sMESA; + #define glWindowPos3sMESA GLeeFuncPtr_glWindowPos3sMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos3svMESA +#define GLEE_H_DEFINED_glWindowPos3svMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVMESAPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVMESAPROC GLeeFuncPtr_glWindowPos3svMESA; + #define glWindowPos3svMESA GLeeFuncPtr_glWindowPos3svMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4dMESA +#define GLEE_H_DEFINED_glWindowPos4dMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4DMESAPROC GLeeFuncPtr_glWindowPos4dMESA; + #define glWindowPos4dMESA GLeeFuncPtr_glWindowPos4dMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4dvMESA +#define GLEE_H_DEFINED_glWindowPos4dvMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4DVMESAPROC) (const GLdouble * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4DVMESAPROC GLeeFuncPtr_glWindowPos4dvMESA; + #define glWindowPos4dvMESA GLeeFuncPtr_glWindowPos4dvMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4fMESA +#define GLEE_H_DEFINED_glWindowPos4fMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4FMESAPROC GLeeFuncPtr_glWindowPos4fMESA; + #define glWindowPos4fMESA GLeeFuncPtr_glWindowPos4fMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4fvMESA +#define GLEE_H_DEFINED_glWindowPos4fvMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4FVMESAPROC) (const GLfloat * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4FVMESAPROC GLeeFuncPtr_glWindowPos4fvMESA; + #define glWindowPos4fvMESA GLeeFuncPtr_glWindowPos4fvMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4iMESA +#define GLEE_H_DEFINED_glWindowPos4iMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4IMESAPROC GLeeFuncPtr_glWindowPos4iMESA; + #define glWindowPos4iMESA GLeeFuncPtr_glWindowPos4iMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4ivMESA +#define GLEE_H_DEFINED_glWindowPos4ivMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4IVMESAPROC) (const GLint * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4IVMESAPROC GLeeFuncPtr_glWindowPos4ivMESA; + #define glWindowPos4ivMESA GLeeFuncPtr_glWindowPos4ivMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4sMESA +#define GLEE_H_DEFINED_glWindowPos4sMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4SMESAPROC GLeeFuncPtr_glWindowPos4sMESA; + #define glWindowPos4sMESA GLeeFuncPtr_glWindowPos4sMESA +#endif +#ifndef GLEE_H_DEFINED_glWindowPos4svMESA +#define GLEE_H_DEFINED_glWindowPos4svMESA + typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4SVMESAPROC) (const GLshort * v); + GLEE_EXTERN GLEEPFNGLWINDOWPOS4SVMESAPROC GLeeFuncPtr_glWindowPos4svMESA; + #define glWindowPos4svMESA GLeeFuncPtr_glWindowPos4svMESA +#endif +#endif + +/* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define __GLEE_GL_EXT_texture_compression_s3tc 1 +/* Constants */ +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +/* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define __GLEE_GL_IBM_cull_vertex 1 +/* Constants */ +#define GL_CULL_VERTEX_IBM 103050 +#endif + +/* GL_IBM_multimode_draw_arrays */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#define __GLEE_GL_IBM_multimode_draw_arrays 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glMultiModeDrawArraysIBM +#define GLEE_H_DEFINED_glMultiModeDrawArraysIBM + typedef void (APIENTRYP GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); + GLEE_EXTERN GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC GLeeFuncPtr_glMultiModeDrawArraysIBM; + #define glMultiModeDrawArraysIBM GLeeFuncPtr_glMultiModeDrawArraysIBM +#endif +#ifndef GLEE_H_DEFINED_glMultiModeDrawElementsIBM +#define GLEE_H_DEFINED_glMultiModeDrawElementsIBM + typedef void (APIENTRYP GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid* const * indices, GLsizei primcount, GLint modestride); + GLEE_EXTERN GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC GLeeFuncPtr_glMultiModeDrawElementsIBM; + #define glMultiModeDrawElementsIBM GLeeFuncPtr_glMultiModeDrawElementsIBM +#endif +#endif + +/* GL_IBM_vertex_array_lists */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define __GLEE_GL_IBM_vertex_array_lists 1 +/* Constants */ +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#ifndef GLEE_H_DEFINED_glColorPointerListIBM +#define GLEE_H_DEFINED_glColorPointerListIBM + typedef void (APIENTRYP GLEEPFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glColorPointerListIBM; + #define glColorPointerListIBM GLeeFuncPtr_glColorPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColorPointerListIBM +#define GLEE_H_DEFINED_glSecondaryColorPointerListIBM + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glSecondaryColorPointerListIBM; + #define glSecondaryColorPointerListIBM GLeeFuncPtr_glSecondaryColorPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glEdgeFlagPointerListIBM +#define GLEE_H_DEFINED_glEdgeFlagPointerListIBM + typedef void (APIENTRYP GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC GLeeFuncPtr_glEdgeFlagPointerListIBM; + #define glEdgeFlagPointerListIBM GLeeFuncPtr_glEdgeFlagPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glFogCoordPointerListIBM +#define GLEE_H_DEFINED_glFogCoordPointerListIBM + typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glFogCoordPointerListIBM; + #define glFogCoordPointerListIBM GLeeFuncPtr_glFogCoordPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glIndexPointerListIBM +#define GLEE_H_DEFINED_glIndexPointerListIBM + typedef void (APIENTRYP GLEEPFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLINDEXPOINTERLISTIBMPROC GLeeFuncPtr_glIndexPointerListIBM; + #define glIndexPointerListIBM GLeeFuncPtr_glIndexPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glNormalPointerListIBM +#define GLEE_H_DEFINED_glNormalPointerListIBM + typedef void (APIENTRYP GLEEPFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLNORMALPOINTERLISTIBMPROC GLeeFuncPtr_glNormalPointerListIBM; + #define glNormalPointerListIBM GLeeFuncPtr_glNormalPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glTexCoordPointerListIBM +#define GLEE_H_DEFINED_glTexCoordPointerListIBM + typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glTexCoordPointerListIBM; + #define glTexCoordPointerListIBM GLeeFuncPtr_glTexCoordPointerListIBM +#endif +#ifndef GLEE_H_DEFINED_glVertexPointerListIBM +#define GLEE_H_DEFINED_glVertexPointerListIBM + typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride); + GLEE_EXTERN GLEEPFNGLVERTEXPOINTERLISTIBMPROC GLeeFuncPtr_glVertexPointerListIBM; + #define glVertexPointerListIBM GLeeFuncPtr_glVertexPointerListIBM +#endif +#endif + +/* GL_SGIX_subsample */ + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#define __GLEE_GL_SGIX_subsample 1 +/* Constants */ +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +/* GL_SGIX_ycrcb_subsample */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#define __GLEE_GL_SGIX_ycrcb_subsample 1 +/* Constants */ +#endif + +/* GL_SGIX_ycrcba */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define __GLEE_GL_SGIX_ycrcba 1 +/* Constants */ +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +/* GL_SGI_depth_pass_instrument */ + +#ifndef GL_SGI_depth_pass_instrument +#define GL_SGI_depth_pass_instrument 1 +#define __GLEE_GL_SGI_depth_pass_instrument 1 +/* Constants */ +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +/* GL_3DFX_texture_compression_FXT1 */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define __GLEE_GL_3DFX_texture_compression_FXT1 1 +/* Constants */ +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +/* GL_3DFX_multisample */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#define __GLEE_GL_3DFX_multisample 1 +/* Constants */ +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +/* GL_3DFX_tbuffer */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#define __GLEE_GL_3DFX_tbuffer 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glTbufferMask3DFX +#define GLEE_H_DEFINED_glTbufferMask3DFX + typedef void (APIENTRYP GLEEPFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + GLEE_EXTERN GLEEPFNGLTBUFFERMASK3DFXPROC GLeeFuncPtr_glTbufferMask3DFX; + #define glTbufferMask3DFX GLeeFuncPtr_glTbufferMask3DFX +#endif +#endif + +/* GL_EXT_multisample */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#define __GLEE_GL_EXT_multisample 1 +/* Constants */ +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#ifndef GLEE_H_DEFINED_glSampleMaskEXT +#define GLEE_H_DEFINED_glSampleMaskEXT + typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); + GLEE_EXTERN GLEEPFNGLSAMPLEMASKEXTPROC GLeeFuncPtr_glSampleMaskEXT; + #define glSampleMaskEXT GLeeFuncPtr_glSampleMaskEXT +#endif +#ifndef GLEE_H_DEFINED_glSamplePatternEXT +#define GLEE_H_DEFINED_glSamplePatternEXT + typedef void (APIENTRYP GLEEPFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + GLEE_EXTERN GLEEPFNGLSAMPLEPATTERNEXTPROC GLeeFuncPtr_glSamplePatternEXT; + #define glSamplePatternEXT GLeeFuncPtr_glSamplePatternEXT +#endif +#endif + +/* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define __GLEE_GL_SGIX_vertex_preclip 1 +/* Constants */ +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +/* GL_SGIX_convolution_accuracy */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define __GLEE_GL_SGIX_convolution_accuracy 1 +/* Constants */ +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +/* GL_SGIX_resample */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define __GLEE_GL_SGIX_resample 1 +/* Constants */ +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +/* GL_SGIS_point_line_texgen */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define __GLEE_GL_SGIS_point_line_texgen 1 +/* Constants */ +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +/* GL_SGIS_texture_color_mask */ + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define __GLEE_GL_SGIS_texture_color_mask 1 +/* Constants */ +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#ifndef GLEE_H_DEFINED_glTextureColorMaskSGIS +#define GLEE_H_DEFINED_glTextureColorMaskSGIS + typedef void (APIENTRYP GLEEPFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + GLEE_EXTERN GLEEPFNGLTEXTURECOLORMASKSGISPROC GLeeFuncPtr_glTextureColorMaskSGIS; + #define glTextureColorMaskSGIS GLeeFuncPtr_glTextureColorMaskSGIS +#endif +#endif + +/* GL_EXT_texture_env_dot3 */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define __GLEE_GL_EXT_texture_env_dot3 1 +/* Constants */ +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +/* GL_ATI_texture_mirror_once */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define __GLEE_GL_ATI_texture_mirror_once 1 +/* Constants */ +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +/* GL_NV_fence */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define __GLEE_GL_NV_fence 1 +/* Constants */ +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#ifndef GLEE_H_DEFINED_glDeleteFencesNV +#define GLEE_H_DEFINED_glDeleteFencesNV + typedef void (APIENTRYP GLEEPFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint * fences); + GLEE_EXTERN GLEEPFNGLDELETEFENCESNVPROC GLeeFuncPtr_glDeleteFencesNV; + #define glDeleteFencesNV GLeeFuncPtr_glDeleteFencesNV +#endif +#ifndef GLEE_H_DEFINED_glGenFencesNV +#define GLEE_H_DEFINED_glGenFencesNV + typedef void (APIENTRYP GLEEPFNGLGENFENCESNVPROC) (GLsizei n, GLuint * fences); + GLEE_EXTERN GLEEPFNGLGENFENCESNVPROC GLeeFuncPtr_glGenFencesNV; + #define glGenFencesNV GLeeFuncPtr_glGenFencesNV +#endif +#ifndef GLEE_H_DEFINED_glIsFenceNV +#define GLEE_H_DEFINED_glIsFenceNV + typedef GLboolean (APIENTRYP GLEEPFNGLISFENCENVPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLISFENCENVPROC GLeeFuncPtr_glIsFenceNV; + #define glIsFenceNV GLeeFuncPtr_glIsFenceNV +#endif +#ifndef GLEE_H_DEFINED_glTestFenceNV +#define GLEE_H_DEFINED_glTestFenceNV + typedef GLboolean (APIENTRYP GLEEPFNGLTESTFENCENVPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLTESTFENCENVPROC GLeeFuncPtr_glTestFenceNV; + #define glTestFenceNV GLeeFuncPtr_glTestFenceNV +#endif +#ifndef GLEE_H_DEFINED_glGetFenceivNV +#define GLEE_H_DEFINED_glGetFenceivNV + typedef void (APIENTRYP GLEEPFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFENCEIVNVPROC GLeeFuncPtr_glGetFenceivNV; + #define glGetFenceivNV GLeeFuncPtr_glGetFenceivNV +#endif +#ifndef GLEE_H_DEFINED_glFinishFenceNV +#define GLEE_H_DEFINED_glFinishFenceNV + typedef void (APIENTRYP GLEEPFNGLFINISHFENCENVPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLFINISHFENCENVPROC GLeeFuncPtr_glFinishFenceNV; + #define glFinishFenceNV GLeeFuncPtr_glFinishFenceNV +#endif +#ifndef GLEE_H_DEFINED_glSetFenceNV +#define GLEE_H_DEFINED_glSetFenceNV + typedef void (APIENTRYP GLEEPFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); + GLEE_EXTERN GLEEPFNGLSETFENCENVPROC GLeeFuncPtr_glSetFenceNV; + #define glSetFenceNV GLeeFuncPtr_glSetFenceNV +#endif +#endif + +/* GL_IBM_texture_mirrored_repeat */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define __GLEE_GL_IBM_texture_mirrored_repeat 1 +/* Constants */ +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +/* GL_NV_evaluators */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define __GLEE_GL_NV_evaluators 1 +/* Constants */ +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#ifndef GLEE_H_DEFINED_glMapControlPointsNV +#define GLEE_H_DEFINED_glMapControlPointsNV + typedef void (APIENTRYP GLEEPFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * points); + GLEE_EXTERN GLEEPFNGLMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glMapControlPointsNV; + #define glMapControlPointsNV GLeeFuncPtr_glMapControlPointsNV +#endif +#ifndef GLEE_H_DEFINED_glMapParameterivNV +#define GLEE_H_DEFINED_glMapParameterivNV + typedef void (APIENTRYP GLEEPFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLMAPPARAMETERIVNVPROC GLeeFuncPtr_glMapParameterivNV; + #define glMapParameterivNV GLeeFuncPtr_glMapParameterivNV +#endif +#ifndef GLEE_H_DEFINED_glMapParameterfvNV +#define GLEE_H_DEFINED_glMapParameterfvNV + typedef void (APIENTRYP GLEEPFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLMAPPARAMETERFVNVPROC GLeeFuncPtr_glMapParameterfvNV; + #define glMapParameterfvNV GLeeFuncPtr_glMapParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetMapControlPointsNV +#define GLEE_H_DEFINED_glGetMapControlPointsNV + typedef void (APIENTRYP GLEEPFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid * points); + GLEE_EXTERN GLEEPFNGLGETMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glGetMapControlPointsNV; + #define glGetMapControlPointsNV GLeeFuncPtr_glGetMapControlPointsNV +#endif +#ifndef GLEE_H_DEFINED_glGetMapParameterivNV +#define GLEE_H_DEFINED_glGetMapParameterivNV + typedef void (APIENTRYP GLEEPFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMAPPARAMETERIVNVPROC GLeeFuncPtr_glGetMapParameterivNV; + #define glGetMapParameterivNV GLeeFuncPtr_glGetMapParameterivNV +#endif +#ifndef GLEE_H_DEFINED_glGetMapParameterfvNV +#define GLEE_H_DEFINED_glGetMapParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMAPPARAMETERFVNVPROC GLeeFuncPtr_glGetMapParameterfvNV; + #define glGetMapParameterfvNV GLeeFuncPtr_glGetMapParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetMapAttribParameterivNV +#define GLEE_H_DEFINED_glGetMapAttribParameterivNV + typedef void (APIENTRYP GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC GLeeFuncPtr_glGetMapAttribParameterivNV; + #define glGetMapAttribParameterivNV GLeeFuncPtr_glGetMapAttribParameterivNV +#endif +#ifndef GLEE_H_DEFINED_glGetMapAttribParameterfvNV +#define GLEE_H_DEFINED_glGetMapAttribParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC GLeeFuncPtr_glGetMapAttribParameterfvNV; + #define glGetMapAttribParameterfvNV GLeeFuncPtr_glGetMapAttribParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glEvalMapsNV +#define GLEE_H_DEFINED_glEvalMapsNV + typedef void (APIENTRYP GLEEPFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); + GLEE_EXTERN GLEEPFNGLEVALMAPSNVPROC GLeeFuncPtr_glEvalMapsNV; + #define glEvalMapsNV GLeeFuncPtr_glEvalMapsNV +#endif +#endif + +/* GL_NV_packed_depth_stencil */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define __GLEE_GL_NV_packed_depth_stencil 1 +/* Constants */ +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +/* GL_NV_register_combiners2 */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define __GLEE_GL_NV_register_combiners2 1 +/* Constants */ +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#ifndef GLEE_H_DEFINED_glCombinerStageParameterfvNV +#define GLEE_H_DEFINED_glCombinerStageParameterfvNV + typedef void (APIENTRYP GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glCombinerStageParameterfvNV; + #define glCombinerStageParameterfvNV GLeeFuncPtr_glCombinerStageParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetCombinerStageParameterfvNV +#define GLEE_H_DEFINED_glGetCombinerStageParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerStageParameterfvNV; + #define glGetCombinerStageParameterfvNV GLeeFuncPtr_glGetCombinerStageParameterfvNV +#endif +#endif + +/* GL_NV_texture_compression_vtc */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#define __GLEE_GL_NV_texture_compression_vtc 1 +/* Constants */ +#endif + +/* GL_NV_texture_rectangle */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define __GLEE_GL_NV_texture_rectangle 1 +/* Constants */ +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +/* GL_NV_texture_shader */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define __GLEE_GL_NV_texture_shader 1 +/* Constants */ +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +/* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define __GLEE_GL_NV_texture_shader2 1 +/* Constants */ +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +/* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define __GLEE_GL_NV_vertex_array_range2 1 +/* Constants */ +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +/* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define __GLEE_GL_NV_vertex_program 1 +/* Constants */ +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#ifndef GLEE_H_DEFINED_glAreProgramsResidentNV +#define GLEE_H_DEFINED_glAreProgramsResidentNV + typedef GLboolean (APIENTRYP GLEEPFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint * programs, GLboolean * residences); + GLEE_EXTERN GLEEPFNGLAREPROGRAMSRESIDENTNVPROC GLeeFuncPtr_glAreProgramsResidentNV; + #define glAreProgramsResidentNV GLeeFuncPtr_glAreProgramsResidentNV +#endif +#ifndef GLEE_H_DEFINED_glBindProgramNV +#define GLEE_H_DEFINED_glBindProgramNV + typedef void (APIENTRYP GLEEPFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); + GLEE_EXTERN GLEEPFNGLBINDPROGRAMNVPROC GLeeFuncPtr_glBindProgramNV; + #define glBindProgramNV GLeeFuncPtr_glBindProgramNV +#endif +#ifndef GLEE_H_DEFINED_glDeleteProgramsNV +#define GLEE_H_DEFINED_glDeleteProgramsNV + typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint * programs); + GLEE_EXTERN GLEEPFNGLDELETEPROGRAMSNVPROC GLeeFuncPtr_glDeleteProgramsNV; + #define glDeleteProgramsNV GLeeFuncPtr_glDeleteProgramsNV +#endif +#ifndef GLEE_H_DEFINED_glExecuteProgramNV +#define GLEE_H_DEFINED_glExecuteProgramNV + typedef void (APIENTRYP GLEEPFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLEXECUTEPROGRAMNVPROC GLeeFuncPtr_glExecuteProgramNV; + #define glExecuteProgramNV GLeeFuncPtr_glExecuteProgramNV +#endif +#ifndef GLEE_H_DEFINED_glGenProgramsNV +#define GLEE_H_DEFINED_glGenProgramsNV + typedef void (APIENTRYP GLEEPFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint * programs); + GLEE_EXTERN GLEEPFNGLGENPROGRAMSNVPROC GLeeFuncPtr_glGenProgramsNV; + #define glGenProgramsNV GLeeFuncPtr_glGenProgramsNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramParameterdvNV +#define GLEE_H_DEFINED_glGetProgramParameterdvNV + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramParameterdvNV; + #define glGetProgramParameterdvNV GLeeFuncPtr_glGetProgramParameterdvNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramParameterfvNV +#define GLEE_H_DEFINED_glGetProgramParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramParameterfvNV; + #define glGetProgramParameterfvNV GLeeFuncPtr_glGetProgramParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramivNV +#define GLEE_H_DEFINED_glGetProgramivNV + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMIVNVPROC GLeeFuncPtr_glGetProgramivNV; + #define glGetProgramivNV GLeeFuncPtr_glGetProgramivNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramStringNV +#define GLEE_H_DEFINED_glGetProgramStringNV + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte * program); + GLEE_EXTERN GLEEPFNGLGETPROGRAMSTRINGNVPROC GLeeFuncPtr_glGetProgramStringNV; + #define glGetProgramStringNV GLeeFuncPtr_glGetProgramStringNV +#endif +#ifndef GLEE_H_DEFINED_glGetTrackMatrixivNV +#define GLEE_H_DEFINED_glGetTrackMatrixivNV + typedef void (APIENTRYP GLEEPFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETTRACKMATRIXIVNVPROC GLeeFuncPtr_glGetTrackMatrixivNV; + #define glGetTrackMatrixivNV GLeeFuncPtr_glGetTrackMatrixivNV +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribdvNV +#define GLEE_H_DEFINED_glGetVertexAttribdvNV + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVNVPROC GLeeFuncPtr_glGetVertexAttribdvNV; + #define glGetVertexAttribdvNV GLeeFuncPtr_glGetVertexAttribdvNV +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribfvNV +#define GLEE_H_DEFINED_glGetVertexAttribfvNV + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVNVPROC GLeeFuncPtr_glGetVertexAttribfvNV; + #define glGetVertexAttribfvNV GLeeFuncPtr_glGetVertexAttribfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribivNV +#define GLEE_H_DEFINED_glGetVertexAttribivNV + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVNVPROC GLeeFuncPtr_glGetVertexAttribivNV; + #define glGetVertexAttribivNV GLeeFuncPtr_glGetVertexAttribivNV +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribPointervNV +#define GLEE_H_DEFINED_glGetVertexAttribPointervNV + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* * pointer); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC GLeeFuncPtr_glGetVertexAttribPointervNV; + #define glGetVertexAttribPointervNV GLeeFuncPtr_glGetVertexAttribPointervNV +#endif +#ifndef GLEE_H_DEFINED_glIsProgramNV +#define GLEE_H_DEFINED_glIsProgramNV + typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMNVPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLISPROGRAMNVPROC GLeeFuncPtr_glIsProgramNV; + #define glIsProgramNV GLeeFuncPtr_glIsProgramNV +#endif +#ifndef GLEE_H_DEFINED_glLoadProgramNV +#define GLEE_H_DEFINED_glLoadProgramNV + typedef void (APIENTRYP GLEEPFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte * program); + GLEE_EXTERN GLEEPFNGLLOADPROGRAMNVPROC GLeeFuncPtr_glLoadProgramNV; + #define glLoadProgramNV GLeeFuncPtr_glLoadProgramNV +#endif +#ifndef GLEE_H_DEFINED_glProgramParameter4dNV +#define GLEE_H_DEFINED_glProgramParameter4dNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4DNVPROC GLeeFuncPtr_glProgramParameter4dNV; + #define glProgramParameter4dNV GLeeFuncPtr_glProgramParameter4dNV +#endif +#ifndef GLEE_H_DEFINED_glProgramParameter4dvNV +#define GLEE_H_DEFINED_glProgramParameter4dvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4DVNVPROC GLeeFuncPtr_glProgramParameter4dvNV; + #define glProgramParameter4dvNV GLeeFuncPtr_glProgramParameter4dvNV +#endif +#ifndef GLEE_H_DEFINED_glProgramParameter4fNV +#define GLEE_H_DEFINED_glProgramParameter4fNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4FNVPROC GLeeFuncPtr_glProgramParameter4fNV; + #define glProgramParameter4fNV GLeeFuncPtr_glProgramParameter4fNV +#endif +#ifndef GLEE_H_DEFINED_glProgramParameter4fvNV +#define GLEE_H_DEFINED_glProgramParameter4fvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4FVNVPROC GLeeFuncPtr_glProgramParameter4fvNV; + #define glProgramParameter4fvNV GLeeFuncPtr_glProgramParameter4fvNV +#endif +#ifndef GLEE_H_DEFINED_glProgramParameters4dvNV +#define GLEE_H_DEFINED_glProgramParameters4dvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC GLeeFuncPtr_glProgramParameters4dvNV; + #define glProgramParameters4dvNV GLeeFuncPtr_glProgramParameters4dvNV +#endif +#ifndef GLEE_H_DEFINED_glProgramParameters4fvNV +#define GLEE_H_DEFINED_glProgramParameters4fvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC GLeeFuncPtr_glProgramParameters4fvNV; + #define glProgramParameters4fvNV GLeeFuncPtr_glProgramParameters4fvNV +#endif +#ifndef GLEE_H_DEFINED_glRequestResidentProgramsNV +#define GLEE_H_DEFINED_glRequestResidentProgramsNV + typedef void (APIENTRYP GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint * programs); + GLEE_EXTERN GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC GLeeFuncPtr_glRequestResidentProgramsNV; + #define glRequestResidentProgramsNV GLeeFuncPtr_glRequestResidentProgramsNV +#endif +#ifndef GLEE_H_DEFINED_glTrackMatrixNV +#define GLEE_H_DEFINED_glTrackMatrixNV + typedef void (APIENTRYP GLEEPFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); + GLEE_EXTERN GLEEPFNGLTRACKMATRIXNVPROC GLeeFuncPtr_glTrackMatrixNV; + #define glTrackMatrixNV GLeeFuncPtr_glTrackMatrixNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribPointerNV +#define GLEE_H_DEFINED_glVertexAttribPointerNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERNVPROC GLeeFuncPtr_glVertexAttribPointerNV; + #define glVertexAttribPointerNV GLeeFuncPtr_glVertexAttribPointerNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1dNV +#define GLEE_H_DEFINED_glVertexAttrib1dNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DNVPROC GLeeFuncPtr_glVertexAttrib1dNV; + #define glVertexAttrib1dNV GLeeFuncPtr_glVertexAttrib1dNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1dvNV +#define GLEE_H_DEFINED_glVertexAttrib1dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVNVPROC GLeeFuncPtr_glVertexAttrib1dvNV; + #define glVertexAttrib1dvNV GLeeFuncPtr_glVertexAttrib1dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1fNV +#define GLEE_H_DEFINED_glVertexAttrib1fNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FNVPROC GLeeFuncPtr_glVertexAttrib1fNV; + #define glVertexAttrib1fNV GLeeFuncPtr_glVertexAttrib1fNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1fvNV +#define GLEE_H_DEFINED_glVertexAttrib1fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVNVPROC GLeeFuncPtr_glVertexAttrib1fvNV; + #define glVertexAttrib1fvNV GLeeFuncPtr_glVertexAttrib1fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1sNV +#define GLEE_H_DEFINED_glVertexAttrib1sNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SNVPROC GLeeFuncPtr_glVertexAttrib1sNV; + #define glVertexAttrib1sNV GLeeFuncPtr_glVertexAttrib1sNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1svNV +#define GLEE_H_DEFINED_glVertexAttrib1svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVNVPROC GLeeFuncPtr_glVertexAttrib1svNV; + #define glVertexAttrib1svNV GLeeFuncPtr_glVertexAttrib1svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2dNV +#define GLEE_H_DEFINED_glVertexAttrib2dNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DNVPROC GLeeFuncPtr_glVertexAttrib2dNV; + #define glVertexAttrib2dNV GLeeFuncPtr_glVertexAttrib2dNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2dvNV +#define GLEE_H_DEFINED_glVertexAttrib2dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVNVPROC GLeeFuncPtr_glVertexAttrib2dvNV; + #define glVertexAttrib2dvNV GLeeFuncPtr_glVertexAttrib2dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2fNV +#define GLEE_H_DEFINED_glVertexAttrib2fNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FNVPROC GLeeFuncPtr_glVertexAttrib2fNV; + #define glVertexAttrib2fNV GLeeFuncPtr_glVertexAttrib2fNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2fvNV +#define GLEE_H_DEFINED_glVertexAttrib2fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVNVPROC GLeeFuncPtr_glVertexAttrib2fvNV; + #define glVertexAttrib2fvNV GLeeFuncPtr_glVertexAttrib2fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2sNV +#define GLEE_H_DEFINED_glVertexAttrib2sNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SNVPROC GLeeFuncPtr_glVertexAttrib2sNV; + #define glVertexAttrib2sNV GLeeFuncPtr_glVertexAttrib2sNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2svNV +#define GLEE_H_DEFINED_glVertexAttrib2svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVNVPROC GLeeFuncPtr_glVertexAttrib2svNV; + #define glVertexAttrib2svNV GLeeFuncPtr_glVertexAttrib2svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3dNV +#define GLEE_H_DEFINED_glVertexAttrib3dNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DNVPROC GLeeFuncPtr_glVertexAttrib3dNV; + #define glVertexAttrib3dNV GLeeFuncPtr_glVertexAttrib3dNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3dvNV +#define GLEE_H_DEFINED_glVertexAttrib3dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVNVPROC GLeeFuncPtr_glVertexAttrib3dvNV; + #define glVertexAttrib3dvNV GLeeFuncPtr_glVertexAttrib3dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3fNV +#define GLEE_H_DEFINED_glVertexAttrib3fNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FNVPROC GLeeFuncPtr_glVertexAttrib3fNV; + #define glVertexAttrib3fNV GLeeFuncPtr_glVertexAttrib3fNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3fvNV +#define GLEE_H_DEFINED_glVertexAttrib3fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVNVPROC GLeeFuncPtr_glVertexAttrib3fvNV; + #define glVertexAttrib3fvNV GLeeFuncPtr_glVertexAttrib3fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3sNV +#define GLEE_H_DEFINED_glVertexAttrib3sNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SNVPROC GLeeFuncPtr_glVertexAttrib3sNV; + #define glVertexAttrib3sNV GLeeFuncPtr_glVertexAttrib3sNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3svNV +#define GLEE_H_DEFINED_glVertexAttrib3svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVNVPROC GLeeFuncPtr_glVertexAttrib3svNV; + #define glVertexAttrib3svNV GLeeFuncPtr_glVertexAttrib3svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4dNV +#define GLEE_H_DEFINED_glVertexAttrib4dNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DNVPROC GLeeFuncPtr_glVertexAttrib4dNV; + #define glVertexAttrib4dNV GLeeFuncPtr_glVertexAttrib4dNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4dvNV +#define GLEE_H_DEFINED_glVertexAttrib4dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVNVPROC GLeeFuncPtr_glVertexAttrib4dvNV; + #define glVertexAttrib4dvNV GLeeFuncPtr_glVertexAttrib4dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4fNV +#define GLEE_H_DEFINED_glVertexAttrib4fNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FNVPROC GLeeFuncPtr_glVertexAttrib4fNV; + #define glVertexAttrib4fNV GLeeFuncPtr_glVertexAttrib4fNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4fvNV +#define GLEE_H_DEFINED_glVertexAttrib4fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVNVPROC GLeeFuncPtr_glVertexAttrib4fvNV; + #define glVertexAttrib4fvNV GLeeFuncPtr_glVertexAttrib4fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4sNV +#define GLEE_H_DEFINED_glVertexAttrib4sNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SNVPROC GLeeFuncPtr_glVertexAttrib4sNV; + #define glVertexAttrib4sNV GLeeFuncPtr_glVertexAttrib4sNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4svNV +#define GLEE_H_DEFINED_glVertexAttrib4svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVNVPROC GLeeFuncPtr_glVertexAttrib4svNV; + #define glVertexAttrib4svNV GLeeFuncPtr_glVertexAttrib4svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4ubNV +#define GLEE_H_DEFINED_glVertexAttrib4ubNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBNVPROC GLeeFuncPtr_glVertexAttrib4ubNV; + #define glVertexAttrib4ubNV GLeeFuncPtr_glVertexAttrib4ubNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4ubvNV +#define GLEE_H_DEFINED_glVertexAttrib4ubvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVNVPROC GLeeFuncPtr_glVertexAttrib4ubvNV; + #define glVertexAttrib4ubvNV GLeeFuncPtr_glVertexAttrib4ubvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs1dvNV +#define GLEE_H_DEFINED_glVertexAttribs1dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1DVNVPROC GLeeFuncPtr_glVertexAttribs1dvNV; + #define glVertexAttribs1dvNV GLeeFuncPtr_glVertexAttribs1dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs1fvNV +#define GLEE_H_DEFINED_glVertexAttribs1fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1FVNVPROC GLeeFuncPtr_glVertexAttribs1fvNV; + #define glVertexAttribs1fvNV GLeeFuncPtr_glVertexAttribs1fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs1svNV +#define GLEE_H_DEFINED_glVertexAttribs1svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1SVNVPROC GLeeFuncPtr_glVertexAttribs1svNV; + #define glVertexAttribs1svNV GLeeFuncPtr_glVertexAttribs1svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs2dvNV +#define GLEE_H_DEFINED_glVertexAttribs2dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2DVNVPROC GLeeFuncPtr_glVertexAttribs2dvNV; + #define glVertexAttribs2dvNV GLeeFuncPtr_glVertexAttribs2dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs2fvNV +#define GLEE_H_DEFINED_glVertexAttribs2fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2FVNVPROC GLeeFuncPtr_glVertexAttribs2fvNV; + #define glVertexAttribs2fvNV GLeeFuncPtr_glVertexAttribs2fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs2svNV +#define GLEE_H_DEFINED_glVertexAttribs2svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2SVNVPROC GLeeFuncPtr_glVertexAttribs2svNV; + #define glVertexAttribs2svNV GLeeFuncPtr_glVertexAttribs2svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs3dvNV +#define GLEE_H_DEFINED_glVertexAttribs3dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3DVNVPROC GLeeFuncPtr_glVertexAttribs3dvNV; + #define glVertexAttribs3dvNV GLeeFuncPtr_glVertexAttribs3dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs3fvNV +#define GLEE_H_DEFINED_glVertexAttribs3fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3FVNVPROC GLeeFuncPtr_glVertexAttribs3fvNV; + #define glVertexAttribs3fvNV GLeeFuncPtr_glVertexAttribs3fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs3svNV +#define GLEE_H_DEFINED_glVertexAttribs3svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3SVNVPROC GLeeFuncPtr_glVertexAttribs3svNV; + #define glVertexAttribs3svNV GLeeFuncPtr_glVertexAttribs3svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs4dvNV +#define GLEE_H_DEFINED_glVertexAttribs4dvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4DVNVPROC GLeeFuncPtr_glVertexAttribs4dvNV; + #define glVertexAttribs4dvNV GLeeFuncPtr_glVertexAttribs4dvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs4fvNV +#define GLEE_H_DEFINED_glVertexAttribs4fvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4FVNVPROC GLeeFuncPtr_glVertexAttribs4fvNV; + #define glVertexAttribs4fvNV GLeeFuncPtr_glVertexAttribs4fvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs4svNV +#define GLEE_H_DEFINED_glVertexAttribs4svNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4SVNVPROC GLeeFuncPtr_glVertexAttribs4svNV; + #define glVertexAttribs4svNV GLeeFuncPtr_glVertexAttribs4svNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs4ubvNV +#define GLEE_H_DEFINED_glVertexAttribs4ubvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4UBVNVPROC GLeeFuncPtr_glVertexAttribs4ubvNV; + #define glVertexAttribs4ubvNV GLeeFuncPtr_glVertexAttribs4ubvNV +#endif +#endif + +/* GL_SGIX_texture_coordinate_clamp */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define __GLEE_GL_SGIX_texture_coordinate_clamp 1 +/* Constants */ +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +/* GL_SGIX_scalebias_hint */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define __GLEE_GL_SGIX_scalebias_hint 1 +/* Constants */ +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +/* GL_OML_interlace */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define __GLEE_GL_OML_interlace 1 +/* Constants */ +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +/* GL_OML_subsample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define __GLEE_GL_OML_subsample 1 +/* Constants */ +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +/* GL_OML_resample */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define __GLEE_GL_OML_resample 1 +/* Constants */ +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +/* GL_NV_copy_depth_to_color */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define __GLEE_GL_NV_copy_depth_to_color 1 +/* Constants */ +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +/* GL_ATI_envmap_bumpmap */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#define __GLEE_GL_ATI_envmap_bumpmap 1 +/* Constants */ +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#ifndef GLEE_H_DEFINED_glTexBumpParameterivATI +#define GLEE_H_DEFINED_glTexBumpParameterivATI + typedef void (APIENTRYP GLEEPFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint * param); + GLEE_EXTERN GLEEPFNGLTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glTexBumpParameterivATI; + #define glTexBumpParameterivATI GLeeFuncPtr_glTexBumpParameterivATI +#endif +#ifndef GLEE_H_DEFINED_glTexBumpParameterfvATI +#define GLEE_H_DEFINED_glTexBumpParameterfvATI + typedef void (APIENTRYP GLEEPFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat * param); + GLEE_EXTERN GLEEPFNGLTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glTexBumpParameterfvATI; + #define glTexBumpParameterfvATI GLeeFuncPtr_glTexBumpParameterfvATI +#endif +#ifndef GLEE_H_DEFINED_glGetTexBumpParameterivATI +#define GLEE_H_DEFINED_glGetTexBumpParameterivATI + typedef void (APIENTRYP GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint * param); + GLEE_EXTERN GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glGetTexBumpParameterivATI; + #define glGetTexBumpParameterivATI GLeeFuncPtr_glGetTexBumpParameterivATI +#endif +#ifndef GLEE_H_DEFINED_glGetTexBumpParameterfvATI +#define GLEE_H_DEFINED_glGetTexBumpParameterfvATI + typedef void (APIENTRYP GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat * param); + GLEE_EXTERN GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glGetTexBumpParameterfvATI; + #define glGetTexBumpParameterfvATI GLeeFuncPtr_glGetTexBumpParameterfvATI +#endif +#endif + +/* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define __GLEE_GL_ATI_fragment_shader 1 +/* Constants */ +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#ifndef GLEE_H_DEFINED_glGenFragmentShadersATI +#define GLEE_H_DEFINED_glGenFragmentShadersATI + typedef GLuint (APIENTRYP GLEEPFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); + GLEE_EXTERN GLEEPFNGLGENFRAGMENTSHADERSATIPROC GLeeFuncPtr_glGenFragmentShadersATI; + #define glGenFragmentShadersATI GLeeFuncPtr_glGenFragmentShadersATI +#endif +#ifndef GLEE_H_DEFINED_glBindFragmentShaderATI +#define GLEE_H_DEFINED_glBindFragmentShaderATI + typedef void (APIENTRYP GLEEPFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLBINDFRAGMENTSHADERATIPROC GLeeFuncPtr_glBindFragmentShaderATI; + #define glBindFragmentShaderATI GLeeFuncPtr_glBindFragmentShaderATI +#endif +#ifndef GLEE_H_DEFINED_glDeleteFragmentShaderATI +#define GLEE_H_DEFINED_glDeleteFragmentShaderATI + typedef void (APIENTRYP GLEEPFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLDELETEFRAGMENTSHADERATIPROC GLeeFuncPtr_glDeleteFragmentShaderATI; + #define glDeleteFragmentShaderATI GLeeFuncPtr_glDeleteFragmentShaderATI +#endif +#ifndef GLEE_H_DEFINED_glBeginFragmentShaderATI +#define GLEE_H_DEFINED_glBeginFragmentShaderATI + typedef void (APIENTRYP GLEEPFNGLBEGINFRAGMENTSHADERATIPROC) (); + GLEE_EXTERN GLEEPFNGLBEGINFRAGMENTSHADERATIPROC GLeeFuncPtr_glBeginFragmentShaderATI; + #define glBeginFragmentShaderATI GLeeFuncPtr_glBeginFragmentShaderATI +#endif +#ifndef GLEE_H_DEFINED_glEndFragmentShaderATI +#define GLEE_H_DEFINED_glEndFragmentShaderATI + typedef void (APIENTRYP GLEEPFNGLENDFRAGMENTSHADERATIPROC) (); + GLEE_EXTERN GLEEPFNGLENDFRAGMENTSHADERATIPROC GLeeFuncPtr_glEndFragmentShaderATI; + #define glEndFragmentShaderATI GLeeFuncPtr_glEndFragmentShaderATI +#endif +#ifndef GLEE_H_DEFINED_glPassTexCoordATI +#define GLEE_H_DEFINED_glPassTexCoordATI + typedef void (APIENTRYP GLEEPFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); + GLEE_EXTERN GLEEPFNGLPASSTEXCOORDATIPROC GLeeFuncPtr_glPassTexCoordATI; + #define glPassTexCoordATI GLeeFuncPtr_glPassTexCoordATI +#endif +#ifndef GLEE_H_DEFINED_glSampleMapATI +#define GLEE_H_DEFINED_glSampleMapATI + typedef void (APIENTRYP GLEEPFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); + GLEE_EXTERN GLEEPFNGLSAMPLEMAPATIPROC GLeeFuncPtr_glSampleMapATI; + #define glSampleMapATI GLeeFuncPtr_glSampleMapATI +#endif +#ifndef GLEE_H_DEFINED_glColorFragmentOp1ATI +#define GLEE_H_DEFINED_glColorFragmentOp1ATI + typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); + GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP1ATIPROC GLeeFuncPtr_glColorFragmentOp1ATI; + #define glColorFragmentOp1ATI GLeeFuncPtr_glColorFragmentOp1ATI +#endif +#ifndef GLEE_H_DEFINED_glColorFragmentOp2ATI +#define GLEE_H_DEFINED_glColorFragmentOp2ATI + typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); + GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP2ATIPROC GLeeFuncPtr_glColorFragmentOp2ATI; + #define glColorFragmentOp2ATI GLeeFuncPtr_glColorFragmentOp2ATI +#endif +#ifndef GLEE_H_DEFINED_glColorFragmentOp3ATI +#define GLEE_H_DEFINED_glColorFragmentOp3ATI + typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); + GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP3ATIPROC GLeeFuncPtr_glColorFragmentOp3ATI; + #define glColorFragmentOp3ATI GLeeFuncPtr_glColorFragmentOp3ATI +#endif +#ifndef GLEE_H_DEFINED_glAlphaFragmentOp1ATI +#define GLEE_H_DEFINED_glAlphaFragmentOp1ATI + typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); + GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP1ATIPROC GLeeFuncPtr_glAlphaFragmentOp1ATI; + #define glAlphaFragmentOp1ATI GLeeFuncPtr_glAlphaFragmentOp1ATI +#endif +#ifndef GLEE_H_DEFINED_glAlphaFragmentOp2ATI +#define GLEE_H_DEFINED_glAlphaFragmentOp2ATI + typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); + GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP2ATIPROC GLeeFuncPtr_glAlphaFragmentOp2ATI; + #define glAlphaFragmentOp2ATI GLeeFuncPtr_glAlphaFragmentOp2ATI +#endif +#ifndef GLEE_H_DEFINED_glAlphaFragmentOp3ATI +#define GLEE_H_DEFINED_glAlphaFragmentOp3ATI + typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); + GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP3ATIPROC GLeeFuncPtr_glAlphaFragmentOp3ATI; + #define glAlphaFragmentOp3ATI GLeeFuncPtr_glAlphaFragmentOp3ATI +#endif +#ifndef GLEE_H_DEFINED_glSetFragmentShaderConstantATI +#define GLEE_H_DEFINED_glSetFragmentShaderConstantATI + typedef void (APIENTRYP GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC GLeeFuncPtr_glSetFragmentShaderConstantATI; + #define glSetFragmentShaderConstantATI GLeeFuncPtr_glSetFragmentShaderConstantATI +#endif +#endif + +/* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#define __GLEE_GL_ATI_pn_triangles 1 +/* Constants */ +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#ifndef GLEE_H_DEFINED_glPNTrianglesiATI +#define GLEE_H_DEFINED_glPNTrianglesiATI + typedef void (APIENTRYP GLEEPFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLPNTRIANGLESIATIPROC GLeeFuncPtr_glPNTrianglesiATI; + #define glPNTrianglesiATI GLeeFuncPtr_glPNTrianglesiATI +#endif +#ifndef GLEE_H_DEFINED_glPNTrianglesfATI +#define GLEE_H_DEFINED_glPNTrianglesfATI + typedef void (APIENTRYP GLEEPFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLPNTRIANGLESFATIPROC GLeeFuncPtr_glPNTrianglesfATI; + #define glPNTrianglesfATI GLeeFuncPtr_glPNTrianglesfATI +#endif +#endif + +/* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#define __GLEE_GL_ATI_vertex_array_object 1 +/* Constants */ +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#ifndef GLEE_H_DEFINED_glNewObjectBufferATI +#define GLEE_H_DEFINED_glNewObjectBufferATI + typedef GLuint (APIENTRYP GLEEPFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid * pointer, GLenum usage); + GLEE_EXTERN GLEEPFNGLNEWOBJECTBUFFERATIPROC GLeeFuncPtr_glNewObjectBufferATI; + #define glNewObjectBufferATI GLeeFuncPtr_glNewObjectBufferATI +#endif +#ifndef GLEE_H_DEFINED_glIsObjectBufferATI +#define GLEE_H_DEFINED_glIsObjectBufferATI + typedef GLboolean (APIENTRYP GLEEPFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLISOBJECTBUFFERATIPROC GLeeFuncPtr_glIsObjectBufferATI; + #define glIsObjectBufferATI GLeeFuncPtr_glIsObjectBufferATI +#endif +#ifndef GLEE_H_DEFINED_glUpdateObjectBufferATI +#define GLEE_H_DEFINED_glUpdateObjectBufferATI + typedef void (APIENTRYP GLEEPFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pointer, GLenum preserve); + GLEE_EXTERN GLEEPFNGLUPDATEOBJECTBUFFERATIPROC GLeeFuncPtr_glUpdateObjectBufferATI; + #define glUpdateObjectBufferATI GLeeFuncPtr_glUpdateObjectBufferATI +#endif +#ifndef GLEE_H_DEFINED_glGetObjectBufferfvATI +#define GLEE_H_DEFINED_glGetObjectBufferfvATI + typedef void (APIENTRYP GLEEPFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETOBJECTBUFFERFVATIPROC GLeeFuncPtr_glGetObjectBufferfvATI; + #define glGetObjectBufferfvATI GLeeFuncPtr_glGetObjectBufferfvATI +#endif +#ifndef GLEE_H_DEFINED_glGetObjectBufferivATI +#define GLEE_H_DEFINED_glGetObjectBufferivATI + typedef void (APIENTRYP GLEEPFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETOBJECTBUFFERIVATIPROC GLeeFuncPtr_glGetObjectBufferivATI; + #define glGetObjectBufferivATI GLeeFuncPtr_glGetObjectBufferivATI +#endif +#ifndef GLEE_H_DEFINED_glFreeObjectBufferATI +#define GLEE_H_DEFINED_glFreeObjectBufferATI + typedef void (APIENTRYP GLEEPFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLFREEOBJECTBUFFERATIPROC GLeeFuncPtr_glFreeObjectBufferATI; + #define glFreeObjectBufferATI GLeeFuncPtr_glFreeObjectBufferATI +#endif +#ifndef GLEE_H_DEFINED_glArrayObjectATI +#define GLEE_H_DEFINED_glArrayObjectATI + typedef void (APIENTRYP GLEEPFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + GLEE_EXTERN GLEEPFNGLARRAYOBJECTATIPROC GLeeFuncPtr_glArrayObjectATI; + #define glArrayObjectATI GLeeFuncPtr_glArrayObjectATI +#endif +#ifndef GLEE_H_DEFINED_glGetArrayObjectfvATI +#define GLEE_H_DEFINED_glGetArrayObjectfvATI + typedef void (APIENTRYP GLEEPFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetArrayObjectfvATI; + #define glGetArrayObjectfvATI GLeeFuncPtr_glGetArrayObjectfvATI +#endif +#ifndef GLEE_H_DEFINED_glGetArrayObjectivATI +#define GLEE_H_DEFINED_glGetArrayObjectivATI + typedef void (APIENTRYP GLEEPFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetArrayObjectivATI; + #define glGetArrayObjectivATI GLeeFuncPtr_glGetArrayObjectivATI +#endif +#ifndef GLEE_H_DEFINED_glVariantArrayObjectATI +#define GLEE_H_DEFINED_glVariantArrayObjectATI + typedef void (APIENTRYP GLEEPFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + GLEE_EXTERN GLEEPFNGLVARIANTARRAYOBJECTATIPROC GLeeFuncPtr_glVariantArrayObjectATI; + #define glVariantArrayObjectATI GLeeFuncPtr_glVariantArrayObjectATI +#endif +#ifndef GLEE_H_DEFINED_glGetVariantArrayObjectfvATI +#define GLEE_H_DEFINED_glGetVariantArrayObjectfvATI + typedef void (APIENTRYP GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVariantArrayObjectfvATI; + #define glGetVariantArrayObjectfvATI GLeeFuncPtr_glGetVariantArrayObjectfvATI +#endif +#ifndef GLEE_H_DEFINED_glGetVariantArrayObjectivATI +#define GLEE_H_DEFINED_glGetVariantArrayObjectivATI + typedef void (APIENTRYP GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVariantArrayObjectivATI; + #define glGetVariantArrayObjectivATI GLeeFuncPtr_glGetVariantArrayObjectivATI +#endif +#endif + +/* GL_EXT_vertex_shader */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#define __GLEE_GL_EXT_vertex_shader 1 +/* Constants */ +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#ifndef GLEE_H_DEFINED_glBeginVertexShaderEXT +#define GLEE_H_DEFINED_glBeginVertexShaderEXT + typedef void (APIENTRYP GLEEPFNGLBEGINVERTEXSHADEREXTPROC) (); + GLEE_EXTERN GLEEPFNGLBEGINVERTEXSHADEREXTPROC GLeeFuncPtr_glBeginVertexShaderEXT; + #define glBeginVertexShaderEXT GLeeFuncPtr_glBeginVertexShaderEXT +#endif +#ifndef GLEE_H_DEFINED_glEndVertexShaderEXT +#define GLEE_H_DEFINED_glEndVertexShaderEXT + typedef void (APIENTRYP GLEEPFNGLENDVERTEXSHADEREXTPROC) (); + GLEE_EXTERN GLEEPFNGLENDVERTEXSHADEREXTPROC GLeeFuncPtr_glEndVertexShaderEXT; + #define glEndVertexShaderEXT GLeeFuncPtr_glEndVertexShaderEXT +#endif +#ifndef GLEE_H_DEFINED_glBindVertexShaderEXT +#define GLEE_H_DEFINED_glBindVertexShaderEXT + typedef void (APIENTRYP GLEEPFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLBINDVERTEXSHADEREXTPROC GLeeFuncPtr_glBindVertexShaderEXT; + #define glBindVertexShaderEXT GLeeFuncPtr_glBindVertexShaderEXT +#endif +#ifndef GLEE_H_DEFINED_glGenVertexShadersEXT +#define GLEE_H_DEFINED_glGenVertexShadersEXT + typedef GLuint (APIENTRYP GLEEPFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); + GLEE_EXTERN GLEEPFNGLGENVERTEXSHADERSEXTPROC GLeeFuncPtr_glGenVertexShadersEXT; + #define glGenVertexShadersEXT GLeeFuncPtr_glGenVertexShadersEXT +#endif +#ifndef GLEE_H_DEFINED_glDeleteVertexShaderEXT +#define GLEE_H_DEFINED_glDeleteVertexShaderEXT + typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLDELETEVERTEXSHADEREXTPROC GLeeFuncPtr_glDeleteVertexShaderEXT; + #define glDeleteVertexShaderEXT GLeeFuncPtr_glDeleteVertexShaderEXT +#endif +#ifndef GLEE_H_DEFINED_glShaderOp1EXT +#define GLEE_H_DEFINED_glShaderOp1EXT + typedef void (APIENTRYP GLEEPFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); + GLEE_EXTERN GLEEPFNGLSHADEROP1EXTPROC GLeeFuncPtr_glShaderOp1EXT; + #define glShaderOp1EXT GLeeFuncPtr_glShaderOp1EXT +#endif +#ifndef GLEE_H_DEFINED_glShaderOp2EXT +#define GLEE_H_DEFINED_glShaderOp2EXT + typedef void (APIENTRYP GLEEPFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); + GLEE_EXTERN GLEEPFNGLSHADEROP2EXTPROC GLeeFuncPtr_glShaderOp2EXT; + #define glShaderOp2EXT GLeeFuncPtr_glShaderOp2EXT +#endif +#ifndef GLEE_H_DEFINED_glShaderOp3EXT +#define GLEE_H_DEFINED_glShaderOp3EXT + typedef void (APIENTRYP GLEEPFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); + GLEE_EXTERN GLEEPFNGLSHADEROP3EXTPROC GLeeFuncPtr_glShaderOp3EXT; + #define glShaderOp3EXT GLeeFuncPtr_glShaderOp3EXT +#endif +#ifndef GLEE_H_DEFINED_glSwizzleEXT +#define GLEE_H_DEFINED_glSwizzleEXT + typedef void (APIENTRYP GLEEPFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + GLEE_EXTERN GLEEPFNGLSWIZZLEEXTPROC GLeeFuncPtr_glSwizzleEXT; + #define glSwizzleEXT GLeeFuncPtr_glSwizzleEXT +#endif +#ifndef GLEE_H_DEFINED_glWriteMaskEXT +#define GLEE_H_DEFINED_glWriteMaskEXT + typedef void (APIENTRYP GLEEPFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + GLEE_EXTERN GLEEPFNGLWRITEMASKEXTPROC GLeeFuncPtr_glWriteMaskEXT; + #define glWriteMaskEXT GLeeFuncPtr_glWriteMaskEXT +#endif +#ifndef GLEE_H_DEFINED_glInsertComponentEXT +#define GLEE_H_DEFINED_glInsertComponentEXT + typedef void (APIENTRYP GLEEPFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); + GLEE_EXTERN GLEEPFNGLINSERTCOMPONENTEXTPROC GLeeFuncPtr_glInsertComponentEXT; + #define glInsertComponentEXT GLeeFuncPtr_glInsertComponentEXT +#endif +#ifndef GLEE_H_DEFINED_glExtractComponentEXT +#define GLEE_H_DEFINED_glExtractComponentEXT + typedef void (APIENTRYP GLEEPFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); + GLEE_EXTERN GLEEPFNGLEXTRACTCOMPONENTEXTPROC GLeeFuncPtr_glExtractComponentEXT; + #define glExtractComponentEXT GLeeFuncPtr_glExtractComponentEXT +#endif +#ifndef GLEE_H_DEFINED_glGenSymbolsEXT +#define GLEE_H_DEFINED_glGenSymbolsEXT + typedef GLuint (APIENTRYP GLEEPFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); + GLEE_EXTERN GLEEPFNGLGENSYMBOLSEXTPROC GLeeFuncPtr_glGenSymbolsEXT; + #define glGenSymbolsEXT GLeeFuncPtr_glGenSymbolsEXT +#endif +#ifndef GLEE_H_DEFINED_glSetInvariantEXT +#define GLEE_H_DEFINED_glSetInvariantEXT + typedef void (APIENTRYP GLEEPFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid * addr); + GLEE_EXTERN GLEEPFNGLSETINVARIANTEXTPROC GLeeFuncPtr_glSetInvariantEXT; + #define glSetInvariantEXT GLeeFuncPtr_glSetInvariantEXT +#endif +#ifndef GLEE_H_DEFINED_glSetLocalConstantEXT +#define GLEE_H_DEFINED_glSetLocalConstantEXT + typedef void (APIENTRYP GLEEPFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid * addr); + GLEE_EXTERN GLEEPFNGLSETLOCALCONSTANTEXTPROC GLeeFuncPtr_glSetLocalConstantEXT; + #define glSetLocalConstantEXT GLeeFuncPtr_glSetLocalConstantEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantbvEXT +#define GLEE_H_DEFINED_glVariantbvEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte * addr); + GLEE_EXTERN GLEEPFNGLVARIANTBVEXTPROC GLeeFuncPtr_glVariantbvEXT; + #define glVariantbvEXT GLeeFuncPtr_glVariantbvEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantsvEXT +#define GLEE_H_DEFINED_glVariantsvEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort * addr); + GLEE_EXTERN GLEEPFNGLVARIANTSVEXTPROC GLeeFuncPtr_glVariantsvEXT; + #define glVariantsvEXT GLeeFuncPtr_glVariantsvEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantivEXT +#define GLEE_H_DEFINED_glVariantivEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTIVEXTPROC) (GLuint id, const GLint * addr); + GLEE_EXTERN GLEEPFNGLVARIANTIVEXTPROC GLeeFuncPtr_glVariantivEXT; + #define glVariantivEXT GLeeFuncPtr_glVariantivEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantfvEXT +#define GLEE_H_DEFINED_glVariantfvEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat * addr); + GLEE_EXTERN GLEEPFNGLVARIANTFVEXTPROC GLeeFuncPtr_glVariantfvEXT; + #define glVariantfvEXT GLeeFuncPtr_glVariantfvEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantdvEXT +#define GLEE_H_DEFINED_glVariantdvEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble * addr); + GLEE_EXTERN GLEEPFNGLVARIANTDVEXTPROC GLeeFuncPtr_glVariantdvEXT; + #define glVariantdvEXT GLeeFuncPtr_glVariantdvEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantubvEXT +#define GLEE_H_DEFINED_glVariantubvEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte * addr); + GLEE_EXTERN GLEEPFNGLVARIANTUBVEXTPROC GLeeFuncPtr_glVariantubvEXT; + #define glVariantubvEXT GLeeFuncPtr_glVariantubvEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantusvEXT +#define GLEE_H_DEFINED_glVariantusvEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort * addr); + GLEE_EXTERN GLEEPFNGLVARIANTUSVEXTPROC GLeeFuncPtr_glVariantusvEXT; + #define glVariantusvEXT GLeeFuncPtr_glVariantusvEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantuivEXT +#define GLEE_H_DEFINED_glVariantuivEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint * addr); + GLEE_EXTERN GLEEPFNGLVARIANTUIVEXTPROC GLeeFuncPtr_glVariantuivEXT; + #define glVariantuivEXT GLeeFuncPtr_glVariantuivEXT +#endif +#ifndef GLEE_H_DEFINED_glVariantPointerEXT +#define GLEE_H_DEFINED_glVariantPointerEXT + typedef void (APIENTRYP GLEEPFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid * addr); + GLEE_EXTERN GLEEPFNGLVARIANTPOINTEREXTPROC GLeeFuncPtr_glVariantPointerEXT; + #define glVariantPointerEXT GLeeFuncPtr_glVariantPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glEnableVariantClientStateEXT +#define GLEE_H_DEFINED_glEnableVariantClientStateEXT + typedef void (APIENTRYP GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glEnableVariantClientStateEXT; + #define glEnableVariantClientStateEXT GLeeFuncPtr_glEnableVariantClientStateEXT +#endif +#ifndef GLEE_H_DEFINED_glDisableVariantClientStateEXT +#define GLEE_H_DEFINED_glDisableVariantClientStateEXT + typedef void (APIENTRYP GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glDisableVariantClientStateEXT; + #define glDisableVariantClientStateEXT GLeeFuncPtr_glDisableVariantClientStateEXT +#endif +#ifndef GLEE_H_DEFINED_glBindLightParameterEXT +#define GLEE_H_DEFINED_glBindLightParameterEXT + typedef GLuint (APIENTRYP GLEEPFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); + GLEE_EXTERN GLEEPFNGLBINDLIGHTPARAMETEREXTPROC GLeeFuncPtr_glBindLightParameterEXT; + #define glBindLightParameterEXT GLeeFuncPtr_glBindLightParameterEXT +#endif +#ifndef GLEE_H_DEFINED_glBindMaterialParameterEXT +#define GLEE_H_DEFINED_glBindMaterialParameterEXT + typedef GLuint (APIENTRYP GLEEPFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); + GLEE_EXTERN GLEEPFNGLBINDMATERIALPARAMETEREXTPROC GLeeFuncPtr_glBindMaterialParameterEXT; + #define glBindMaterialParameterEXT GLeeFuncPtr_glBindMaterialParameterEXT +#endif +#ifndef GLEE_H_DEFINED_glBindTexGenParameterEXT +#define GLEE_H_DEFINED_glBindTexGenParameterEXT + typedef GLuint (APIENTRYP GLEEPFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); + GLEE_EXTERN GLEEPFNGLBINDTEXGENPARAMETEREXTPROC GLeeFuncPtr_glBindTexGenParameterEXT; + #define glBindTexGenParameterEXT GLeeFuncPtr_glBindTexGenParameterEXT +#endif +#ifndef GLEE_H_DEFINED_glBindTextureUnitParameterEXT +#define GLEE_H_DEFINED_glBindTextureUnitParameterEXT + typedef GLuint (APIENTRYP GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); + GLEE_EXTERN GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC GLeeFuncPtr_glBindTextureUnitParameterEXT; + #define glBindTextureUnitParameterEXT GLeeFuncPtr_glBindTextureUnitParameterEXT +#endif +#ifndef GLEE_H_DEFINED_glBindParameterEXT +#define GLEE_H_DEFINED_glBindParameterEXT + typedef GLuint (APIENTRYP GLEEPFNGLBINDPARAMETEREXTPROC) (GLenum value); + GLEE_EXTERN GLEEPFNGLBINDPARAMETEREXTPROC GLeeFuncPtr_glBindParameterEXT; + #define glBindParameterEXT GLeeFuncPtr_glBindParameterEXT +#endif +#ifndef GLEE_H_DEFINED_glIsVariantEnabledEXT +#define GLEE_H_DEFINED_glIsVariantEnabledEXT + typedef GLboolean (APIENTRYP GLEEPFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); + GLEE_EXTERN GLEEPFNGLISVARIANTENABLEDEXTPROC GLeeFuncPtr_glIsVariantEnabledEXT; + #define glIsVariantEnabledEXT GLeeFuncPtr_glIsVariantEnabledEXT +#endif +#ifndef GLEE_H_DEFINED_glGetVariantBooleanvEXT +#define GLEE_H_DEFINED_glGetVariantBooleanvEXT + typedef void (APIENTRYP GLEEPFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data); + GLEE_EXTERN GLEEPFNGLGETVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetVariantBooleanvEXT; + #define glGetVariantBooleanvEXT GLeeFuncPtr_glGetVariantBooleanvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetVariantIntegervEXT +#define GLEE_H_DEFINED_glGetVariantIntegervEXT + typedef void (APIENTRYP GLEEPFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data); + GLEE_EXTERN GLEEPFNGLGETVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetVariantIntegervEXT; + #define glGetVariantIntegervEXT GLeeFuncPtr_glGetVariantIntegervEXT +#endif +#ifndef GLEE_H_DEFINED_glGetVariantFloatvEXT +#define GLEE_H_DEFINED_glGetVariantFloatvEXT + typedef void (APIENTRYP GLEEPFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data); + GLEE_EXTERN GLEEPFNGLGETVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetVariantFloatvEXT; + #define glGetVariantFloatvEXT GLeeFuncPtr_glGetVariantFloatvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetVariantPointervEXT +#define GLEE_H_DEFINED_glGetVariantPointervEXT + typedef void (APIENTRYP GLEEPFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* * data); + GLEE_EXTERN GLEEPFNGLGETVARIANTPOINTERVEXTPROC GLeeFuncPtr_glGetVariantPointervEXT; + #define glGetVariantPointervEXT GLeeFuncPtr_glGetVariantPointervEXT +#endif +#ifndef GLEE_H_DEFINED_glGetInvariantBooleanvEXT +#define GLEE_H_DEFINED_glGetInvariantBooleanvEXT + typedef void (APIENTRYP GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data); + GLEE_EXTERN GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetInvariantBooleanvEXT; + #define glGetInvariantBooleanvEXT GLeeFuncPtr_glGetInvariantBooleanvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetInvariantIntegervEXT +#define GLEE_H_DEFINED_glGetInvariantIntegervEXT + typedef void (APIENTRYP GLEEPFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data); + GLEE_EXTERN GLEEPFNGLGETINVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetInvariantIntegervEXT; + #define glGetInvariantIntegervEXT GLeeFuncPtr_glGetInvariantIntegervEXT +#endif +#ifndef GLEE_H_DEFINED_glGetInvariantFloatvEXT +#define GLEE_H_DEFINED_glGetInvariantFloatvEXT + typedef void (APIENTRYP GLEEPFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data); + GLEE_EXTERN GLEEPFNGLGETINVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetInvariantFloatvEXT; + #define glGetInvariantFloatvEXT GLeeFuncPtr_glGetInvariantFloatvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetLocalConstantBooleanvEXT +#define GLEE_H_DEFINED_glGetLocalConstantBooleanvEXT + typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data); + GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC GLeeFuncPtr_glGetLocalConstantBooleanvEXT; + #define glGetLocalConstantBooleanvEXT GLeeFuncPtr_glGetLocalConstantBooleanvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetLocalConstantIntegervEXT +#define GLEE_H_DEFINED_glGetLocalConstantIntegervEXT + typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data); + GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC GLeeFuncPtr_glGetLocalConstantIntegervEXT; + #define glGetLocalConstantIntegervEXT GLeeFuncPtr_glGetLocalConstantIntegervEXT +#endif +#ifndef GLEE_H_DEFINED_glGetLocalConstantFloatvEXT +#define GLEE_H_DEFINED_glGetLocalConstantFloatvEXT + typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data); + GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC GLeeFuncPtr_glGetLocalConstantFloatvEXT; + #define glGetLocalConstantFloatvEXT GLeeFuncPtr_glGetLocalConstantFloatvEXT +#endif +#endif + +/* GL_ATI_vertex_streams */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define __GLEE_GL_ATI_vertex_streams 1 +/* Constants */ +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#ifndef GLEE_H_DEFINED_glVertexStream1sATI +#define GLEE_H_DEFINED_glVertexStream1sATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1SATIPROC GLeeFuncPtr_glVertexStream1sATI; + #define glVertexStream1sATI GLeeFuncPtr_glVertexStream1sATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1svATI +#define GLEE_H_DEFINED_glVertexStream1svATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1SVATIPROC GLeeFuncPtr_glVertexStream1svATI; + #define glVertexStream1svATI GLeeFuncPtr_glVertexStream1svATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1iATI +#define GLEE_H_DEFINED_glVertexStream1iATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1IATIPROC GLeeFuncPtr_glVertexStream1iATI; + #define glVertexStream1iATI GLeeFuncPtr_glVertexStream1iATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1ivATI +#define GLEE_H_DEFINED_glVertexStream1ivATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1IVATIPROC GLeeFuncPtr_glVertexStream1ivATI; + #define glVertexStream1ivATI GLeeFuncPtr_glVertexStream1ivATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1fATI +#define GLEE_H_DEFINED_glVertexStream1fATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1FATIPROC GLeeFuncPtr_glVertexStream1fATI; + #define glVertexStream1fATI GLeeFuncPtr_glVertexStream1fATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1fvATI +#define GLEE_H_DEFINED_glVertexStream1fvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1FVATIPROC GLeeFuncPtr_glVertexStream1fvATI; + #define glVertexStream1fvATI GLeeFuncPtr_glVertexStream1fvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1dATI +#define GLEE_H_DEFINED_glVertexStream1dATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1DATIPROC GLeeFuncPtr_glVertexStream1dATI; + #define glVertexStream1dATI GLeeFuncPtr_glVertexStream1dATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream1dvATI +#define GLEE_H_DEFINED_glVertexStream1dvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1DVATIPROC GLeeFuncPtr_glVertexStream1dvATI; + #define glVertexStream1dvATI GLeeFuncPtr_glVertexStream1dvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2sATI +#define GLEE_H_DEFINED_glVertexStream2sATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2SATIPROC GLeeFuncPtr_glVertexStream2sATI; + #define glVertexStream2sATI GLeeFuncPtr_glVertexStream2sATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2svATI +#define GLEE_H_DEFINED_glVertexStream2svATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2SVATIPROC GLeeFuncPtr_glVertexStream2svATI; + #define glVertexStream2svATI GLeeFuncPtr_glVertexStream2svATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2iATI +#define GLEE_H_DEFINED_glVertexStream2iATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2IATIPROC GLeeFuncPtr_glVertexStream2iATI; + #define glVertexStream2iATI GLeeFuncPtr_glVertexStream2iATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2ivATI +#define GLEE_H_DEFINED_glVertexStream2ivATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2IVATIPROC GLeeFuncPtr_glVertexStream2ivATI; + #define glVertexStream2ivATI GLeeFuncPtr_glVertexStream2ivATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2fATI +#define GLEE_H_DEFINED_glVertexStream2fATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2FATIPROC GLeeFuncPtr_glVertexStream2fATI; + #define glVertexStream2fATI GLeeFuncPtr_glVertexStream2fATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2fvATI +#define GLEE_H_DEFINED_glVertexStream2fvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2FVATIPROC GLeeFuncPtr_glVertexStream2fvATI; + #define glVertexStream2fvATI GLeeFuncPtr_glVertexStream2fvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2dATI +#define GLEE_H_DEFINED_glVertexStream2dATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2DATIPROC GLeeFuncPtr_glVertexStream2dATI; + #define glVertexStream2dATI GLeeFuncPtr_glVertexStream2dATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream2dvATI +#define GLEE_H_DEFINED_glVertexStream2dvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2DVATIPROC GLeeFuncPtr_glVertexStream2dvATI; + #define glVertexStream2dvATI GLeeFuncPtr_glVertexStream2dvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3sATI +#define GLEE_H_DEFINED_glVertexStream3sATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3SATIPROC GLeeFuncPtr_glVertexStream3sATI; + #define glVertexStream3sATI GLeeFuncPtr_glVertexStream3sATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3svATI +#define GLEE_H_DEFINED_glVertexStream3svATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3SVATIPROC GLeeFuncPtr_glVertexStream3svATI; + #define glVertexStream3svATI GLeeFuncPtr_glVertexStream3svATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3iATI +#define GLEE_H_DEFINED_glVertexStream3iATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3IATIPROC GLeeFuncPtr_glVertexStream3iATI; + #define glVertexStream3iATI GLeeFuncPtr_glVertexStream3iATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3ivATI +#define GLEE_H_DEFINED_glVertexStream3ivATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3IVATIPROC GLeeFuncPtr_glVertexStream3ivATI; + #define glVertexStream3ivATI GLeeFuncPtr_glVertexStream3ivATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3fATI +#define GLEE_H_DEFINED_glVertexStream3fATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3FATIPROC GLeeFuncPtr_glVertexStream3fATI; + #define glVertexStream3fATI GLeeFuncPtr_glVertexStream3fATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3fvATI +#define GLEE_H_DEFINED_glVertexStream3fvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3FVATIPROC GLeeFuncPtr_glVertexStream3fvATI; + #define glVertexStream3fvATI GLeeFuncPtr_glVertexStream3fvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3dATI +#define GLEE_H_DEFINED_glVertexStream3dATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3DATIPROC GLeeFuncPtr_glVertexStream3dATI; + #define glVertexStream3dATI GLeeFuncPtr_glVertexStream3dATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream3dvATI +#define GLEE_H_DEFINED_glVertexStream3dvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3DVATIPROC GLeeFuncPtr_glVertexStream3dvATI; + #define glVertexStream3dvATI GLeeFuncPtr_glVertexStream3dvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4sATI +#define GLEE_H_DEFINED_glVertexStream4sATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4SATIPROC GLeeFuncPtr_glVertexStream4sATI; + #define glVertexStream4sATI GLeeFuncPtr_glVertexStream4sATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4svATI +#define GLEE_H_DEFINED_glVertexStream4svATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4SVATIPROC GLeeFuncPtr_glVertexStream4svATI; + #define glVertexStream4svATI GLeeFuncPtr_glVertexStream4svATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4iATI +#define GLEE_H_DEFINED_glVertexStream4iATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4IATIPROC GLeeFuncPtr_glVertexStream4iATI; + #define glVertexStream4iATI GLeeFuncPtr_glVertexStream4iATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4ivATI +#define GLEE_H_DEFINED_glVertexStream4ivATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4IVATIPROC GLeeFuncPtr_glVertexStream4ivATI; + #define glVertexStream4ivATI GLeeFuncPtr_glVertexStream4ivATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4fATI +#define GLEE_H_DEFINED_glVertexStream4fATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4FATIPROC GLeeFuncPtr_glVertexStream4fATI; + #define glVertexStream4fATI GLeeFuncPtr_glVertexStream4fATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4fvATI +#define GLEE_H_DEFINED_glVertexStream4fvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4FVATIPROC GLeeFuncPtr_glVertexStream4fvATI; + #define glVertexStream4fvATI GLeeFuncPtr_glVertexStream4fvATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4dATI +#define GLEE_H_DEFINED_glVertexStream4dATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4DATIPROC GLeeFuncPtr_glVertexStream4dATI; + #define glVertexStream4dATI GLeeFuncPtr_glVertexStream4dATI +#endif +#ifndef GLEE_H_DEFINED_glVertexStream4dvATI +#define GLEE_H_DEFINED_glVertexStream4dvATI + typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble * coords); + GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4DVATIPROC GLeeFuncPtr_glVertexStream4dvATI; + #define glVertexStream4dvATI GLeeFuncPtr_glVertexStream4dvATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3bATI +#define GLEE_H_DEFINED_glNormalStream3bATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3BATIPROC GLeeFuncPtr_glNormalStream3bATI; + #define glNormalStream3bATI GLeeFuncPtr_glNormalStream3bATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3bvATI +#define GLEE_H_DEFINED_glNormalStream3bvATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte * coords); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3BVATIPROC GLeeFuncPtr_glNormalStream3bvATI; + #define glNormalStream3bvATI GLeeFuncPtr_glNormalStream3bvATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3sATI +#define GLEE_H_DEFINED_glNormalStream3sATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3SATIPROC GLeeFuncPtr_glNormalStream3sATI; + #define glNormalStream3sATI GLeeFuncPtr_glNormalStream3sATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3svATI +#define GLEE_H_DEFINED_glNormalStream3svATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort * coords); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3SVATIPROC GLeeFuncPtr_glNormalStream3svATI; + #define glNormalStream3svATI GLeeFuncPtr_glNormalStream3svATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3iATI +#define GLEE_H_DEFINED_glNormalStream3iATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3IATIPROC GLeeFuncPtr_glNormalStream3iATI; + #define glNormalStream3iATI GLeeFuncPtr_glNormalStream3iATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3ivATI +#define GLEE_H_DEFINED_glNormalStream3ivATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint * coords); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3IVATIPROC GLeeFuncPtr_glNormalStream3ivATI; + #define glNormalStream3ivATI GLeeFuncPtr_glNormalStream3ivATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3fATI +#define GLEE_H_DEFINED_glNormalStream3fATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3FATIPROC GLeeFuncPtr_glNormalStream3fATI; + #define glNormalStream3fATI GLeeFuncPtr_glNormalStream3fATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3fvATI +#define GLEE_H_DEFINED_glNormalStream3fvATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat * coords); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3FVATIPROC GLeeFuncPtr_glNormalStream3fvATI; + #define glNormalStream3fvATI GLeeFuncPtr_glNormalStream3fvATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3dATI +#define GLEE_H_DEFINED_glNormalStream3dATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3DATIPROC GLeeFuncPtr_glNormalStream3dATI; + #define glNormalStream3dATI GLeeFuncPtr_glNormalStream3dATI +#endif +#ifndef GLEE_H_DEFINED_glNormalStream3dvATI +#define GLEE_H_DEFINED_glNormalStream3dvATI + typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble * coords); + GLEE_EXTERN GLEEPFNGLNORMALSTREAM3DVATIPROC GLeeFuncPtr_glNormalStream3dvATI; + #define glNormalStream3dvATI GLeeFuncPtr_glNormalStream3dvATI +#endif +#ifndef GLEE_H_DEFINED_glClientActiveVertexStreamATI +#define GLEE_H_DEFINED_glClientActiveVertexStreamATI + typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); + GLEE_EXTERN GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC GLeeFuncPtr_glClientActiveVertexStreamATI; + #define glClientActiveVertexStreamATI GLeeFuncPtr_glClientActiveVertexStreamATI +#endif +#ifndef GLEE_H_DEFINED_glVertexBlendEnviATI +#define GLEE_H_DEFINED_glVertexBlendEnviATI + typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLVERTEXBLENDENVIATIPROC GLeeFuncPtr_glVertexBlendEnviATI; + #define glVertexBlendEnviATI GLeeFuncPtr_glVertexBlendEnviATI +#endif +#ifndef GLEE_H_DEFINED_glVertexBlendEnvfATI +#define GLEE_H_DEFINED_glVertexBlendEnvfATI + typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLVERTEXBLENDENVFATIPROC GLeeFuncPtr_glVertexBlendEnvfATI; + #define glVertexBlendEnvfATI GLeeFuncPtr_glVertexBlendEnvfATI +#endif +#endif + +/* GL_ATI_element_array */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define __GLEE_GL_ATI_element_array 1 +/* Constants */ +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#ifndef GLEE_H_DEFINED_glElementPointerATI +#define GLEE_H_DEFINED_glElementPointerATI + typedef void (APIENTRYP GLEEPFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLELEMENTPOINTERATIPROC GLeeFuncPtr_glElementPointerATI; + #define glElementPointerATI GLeeFuncPtr_glElementPointerATI +#endif +#ifndef GLEE_H_DEFINED_glDrawElementArrayATI +#define GLEE_H_DEFINED_glDrawElementArrayATI + typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); + GLEE_EXTERN GLEEPFNGLDRAWELEMENTARRAYATIPROC GLeeFuncPtr_glDrawElementArrayATI; + #define glDrawElementArrayATI GLeeFuncPtr_glDrawElementArrayATI +#endif +#ifndef GLEE_H_DEFINED_glDrawRangeElementArrayATI +#define GLEE_H_DEFINED_glDrawRangeElementArrayATI + typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); + GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC GLeeFuncPtr_glDrawRangeElementArrayATI; + #define glDrawRangeElementArrayATI GLeeFuncPtr_glDrawRangeElementArrayATI +#endif +#endif + +/* GL_SUN_mesh_array */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define __GLEE_GL_SUN_mesh_array 1 +/* Constants */ +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#ifndef GLEE_H_DEFINED_glDrawMeshArraysSUN +#define GLEE_H_DEFINED_glDrawMeshArraysSUN + typedef void (APIENTRYP GLEEPFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); + GLEE_EXTERN GLEEPFNGLDRAWMESHARRAYSSUNPROC GLeeFuncPtr_glDrawMeshArraysSUN; + #define glDrawMeshArraysSUN GLeeFuncPtr_glDrawMeshArraysSUN +#endif +#endif + +/* GL_SUN_slice_accum */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define __GLEE_GL_SUN_slice_accum 1 +/* Constants */ +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +/* GL_NV_multisample_filter_hint */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define __GLEE_GL_NV_multisample_filter_hint 1 +/* Constants */ +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +/* GL_NV_depth_clamp */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define __GLEE_GL_NV_depth_clamp 1 +/* Constants */ +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +/* GL_NV_occlusion_query */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define __GLEE_GL_NV_occlusion_query 1 +/* Constants */ +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#ifndef GLEE_H_DEFINED_glGenOcclusionQueriesNV +#define GLEE_H_DEFINED_glGenOcclusionQueriesNV + typedef void (APIENTRYP GLEEPFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint * ids); + GLEE_EXTERN GLEEPFNGLGENOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glGenOcclusionQueriesNV; + #define glGenOcclusionQueriesNV GLeeFuncPtr_glGenOcclusionQueriesNV +#endif +#ifndef GLEE_H_DEFINED_glDeleteOcclusionQueriesNV +#define GLEE_H_DEFINED_glDeleteOcclusionQueriesNV + typedef void (APIENTRYP GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint * ids); + GLEE_EXTERN GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glDeleteOcclusionQueriesNV; + #define glDeleteOcclusionQueriesNV GLeeFuncPtr_glDeleteOcclusionQueriesNV +#endif +#ifndef GLEE_H_DEFINED_glIsOcclusionQueryNV +#define GLEE_H_DEFINED_glIsOcclusionQueryNV + typedef GLboolean (APIENTRYP GLEEPFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLISOCCLUSIONQUERYNVPROC GLeeFuncPtr_glIsOcclusionQueryNV; + #define glIsOcclusionQueryNV GLeeFuncPtr_glIsOcclusionQueryNV +#endif +#ifndef GLEE_H_DEFINED_glBeginOcclusionQueryNV +#define GLEE_H_DEFINED_glBeginOcclusionQueryNV + typedef void (APIENTRYP GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC GLeeFuncPtr_glBeginOcclusionQueryNV; + #define glBeginOcclusionQueryNV GLeeFuncPtr_glBeginOcclusionQueryNV +#endif +#ifndef GLEE_H_DEFINED_glEndOcclusionQueryNV +#define GLEE_H_DEFINED_glEndOcclusionQueryNV + typedef void (APIENTRYP GLEEPFNGLENDOCCLUSIONQUERYNVPROC) (); + GLEE_EXTERN GLEEPFNGLENDOCCLUSIONQUERYNVPROC GLeeFuncPtr_glEndOcclusionQueryNV; + #define glEndOcclusionQueryNV GLeeFuncPtr_glEndOcclusionQueryNV +#endif +#ifndef GLEE_H_DEFINED_glGetOcclusionQueryivNV +#define GLEE_H_DEFINED_glGetOcclusionQueryivNV + typedef void (APIENTRYP GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC GLeeFuncPtr_glGetOcclusionQueryivNV; + #define glGetOcclusionQueryivNV GLeeFuncPtr_glGetOcclusionQueryivNV +#endif +#ifndef GLEE_H_DEFINED_glGetOcclusionQueryuivNV +#define GLEE_H_DEFINED_glGetOcclusionQueryuivNV + typedef void (APIENTRYP GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC GLeeFuncPtr_glGetOcclusionQueryuivNV; + #define glGetOcclusionQueryuivNV GLeeFuncPtr_glGetOcclusionQueryuivNV +#endif +#endif + +/* GL_NV_point_sprite */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define __GLEE_GL_NV_point_sprite 1 +/* Constants */ +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#ifndef GLEE_H_DEFINED_glPointParameteriNV +#define GLEE_H_DEFINED_glPointParameteriNV + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERINVPROC GLeeFuncPtr_glPointParameteriNV; + #define glPointParameteriNV GLeeFuncPtr_glPointParameteriNV +#endif +#ifndef GLEE_H_DEFINED_glPointParameterivNV +#define GLEE_H_DEFINED_glPointParameterivNV + typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIVNVPROC GLeeFuncPtr_glPointParameterivNV; + #define glPointParameterivNV GLeeFuncPtr_glPointParameterivNV +#endif +#endif + +/* GL_NV_texture_shader3 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define __GLEE_GL_NV_texture_shader3 1 +/* Constants */ +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +/* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#define __GLEE_GL_NV_vertex_program1_1 1 +/* Constants */ +#endif + +/* GL_EXT_shadow_funcs */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#define __GLEE_GL_EXT_shadow_funcs 1 +/* Constants */ +#endif + +/* GL_EXT_stencil_two_side */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define __GLEE_GL_EXT_stencil_two_side 1 +/* Constants */ +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#ifndef GLEE_H_DEFINED_glActiveStencilFaceEXT +#define GLEE_H_DEFINED_glActiveStencilFaceEXT + typedef void (APIENTRYP GLEEPFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + GLEE_EXTERN GLEEPFNGLACTIVESTENCILFACEEXTPROC GLeeFuncPtr_glActiveStencilFaceEXT; + #define glActiveStencilFaceEXT GLeeFuncPtr_glActiveStencilFaceEXT +#endif +#endif + +/* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define __GLEE_GL_ATI_text_fragment_shader 1 +/* Constants */ +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +/* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define __GLEE_GL_APPLE_client_storage 1 +/* Constants */ +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +/* GL_APPLE_element_array */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define __GLEE_GL_APPLE_element_array 1 +/* Constants */ +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#ifndef GLEE_H_DEFINED_glElementPointerAPPLE +#define GLEE_H_DEFINED_glElementPointerAPPLE + typedef void (APIENTRYP GLEEPFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLELEMENTPOINTERAPPLEPROC GLeeFuncPtr_glElementPointerAPPLE; + #define glElementPointerAPPLE GLeeFuncPtr_glElementPointerAPPLE +#endif +#ifndef GLEE_H_DEFINED_glDrawElementArrayAPPLE +#define GLEE_H_DEFINED_glDrawElementArrayAPPLE + typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); + GLEE_EXTERN GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawElementArrayAPPLE; + #define glDrawElementArrayAPPLE GLeeFuncPtr_glDrawElementArrayAPPLE +#endif +#ifndef GLEE_H_DEFINED_glDrawRangeElementArrayAPPLE +#define GLEE_H_DEFINED_glDrawRangeElementArrayAPPLE + typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); + GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawRangeElementArrayAPPLE; + #define glDrawRangeElementArrayAPPLE GLeeFuncPtr_glDrawRangeElementArrayAPPLE +#endif +#ifndef GLEE_H_DEFINED_glMultiDrawElementArrayAPPLE +#define GLEE_H_DEFINED_glMultiDrawElementArrayAPPLE + typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawElementArrayAPPLE; + #define glMultiDrawElementArrayAPPLE GLeeFuncPtr_glMultiDrawElementArrayAPPLE +#endif +#ifndef GLEE_H_DEFINED_glMultiDrawRangeElementArrayAPPLE +#define GLEE_H_DEFINED_glMultiDrawRangeElementArrayAPPLE + typedef void (APIENTRYP GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE; + #define glMultiDrawRangeElementArrayAPPLE GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE +#endif +#endif + +/* GL_APPLE_fence */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define __GLEE_GL_APPLE_fence 1 +/* Constants */ +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#ifndef GLEE_H_DEFINED_glGenFencesAPPLE +#define GLEE_H_DEFINED_glGenFencesAPPLE + typedef void (APIENTRYP GLEEPFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint * fences); + GLEE_EXTERN GLEEPFNGLGENFENCESAPPLEPROC GLeeFuncPtr_glGenFencesAPPLE; + #define glGenFencesAPPLE GLeeFuncPtr_glGenFencesAPPLE +#endif +#ifndef GLEE_H_DEFINED_glDeleteFencesAPPLE +#define GLEE_H_DEFINED_glDeleteFencesAPPLE + typedef void (APIENTRYP GLEEPFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint * fences); + GLEE_EXTERN GLEEPFNGLDELETEFENCESAPPLEPROC GLeeFuncPtr_glDeleteFencesAPPLE; + #define glDeleteFencesAPPLE GLeeFuncPtr_glDeleteFencesAPPLE +#endif +#ifndef GLEE_H_DEFINED_glSetFenceAPPLE +#define GLEE_H_DEFINED_glSetFenceAPPLE + typedef void (APIENTRYP GLEEPFNGLSETFENCEAPPLEPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLSETFENCEAPPLEPROC GLeeFuncPtr_glSetFenceAPPLE; + #define glSetFenceAPPLE GLeeFuncPtr_glSetFenceAPPLE +#endif +#ifndef GLEE_H_DEFINED_glIsFenceAPPLE +#define GLEE_H_DEFINED_glIsFenceAPPLE + typedef GLboolean (APIENTRYP GLEEPFNGLISFENCEAPPLEPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLISFENCEAPPLEPROC GLeeFuncPtr_glIsFenceAPPLE; + #define glIsFenceAPPLE GLeeFuncPtr_glIsFenceAPPLE +#endif +#ifndef GLEE_H_DEFINED_glTestFenceAPPLE +#define GLEE_H_DEFINED_glTestFenceAPPLE + typedef GLboolean (APIENTRYP GLEEPFNGLTESTFENCEAPPLEPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLTESTFENCEAPPLEPROC GLeeFuncPtr_glTestFenceAPPLE; + #define glTestFenceAPPLE GLeeFuncPtr_glTestFenceAPPLE +#endif +#ifndef GLEE_H_DEFINED_glFinishFenceAPPLE +#define GLEE_H_DEFINED_glFinishFenceAPPLE + typedef void (APIENTRYP GLEEPFNGLFINISHFENCEAPPLEPROC) (GLuint fence); + GLEE_EXTERN GLEEPFNGLFINISHFENCEAPPLEPROC GLeeFuncPtr_glFinishFenceAPPLE; + #define glFinishFenceAPPLE GLeeFuncPtr_glFinishFenceAPPLE +#endif +#ifndef GLEE_H_DEFINED_glTestObjectAPPLE +#define GLEE_H_DEFINED_glTestObjectAPPLE + typedef GLboolean (APIENTRYP GLEEPFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + GLEE_EXTERN GLEEPFNGLTESTOBJECTAPPLEPROC GLeeFuncPtr_glTestObjectAPPLE; + #define glTestObjectAPPLE GLeeFuncPtr_glTestObjectAPPLE +#endif +#ifndef GLEE_H_DEFINED_glFinishObjectAPPLE +#define GLEE_H_DEFINED_glFinishObjectAPPLE + typedef void (APIENTRYP GLEEPFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); + GLEE_EXTERN GLEEPFNGLFINISHOBJECTAPPLEPROC GLeeFuncPtr_glFinishObjectAPPLE; + #define glFinishObjectAPPLE GLeeFuncPtr_glFinishObjectAPPLE +#endif +#endif + +/* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define __GLEE_GL_APPLE_vertex_array_object 1 +/* Constants */ +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#ifndef GLEE_H_DEFINED_glBindVertexArrayAPPLE +#define GLEE_H_DEFINED_glBindVertexArrayAPPLE + typedef void (APIENTRYP GLEEPFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); + GLEE_EXTERN GLEEPFNGLBINDVERTEXARRAYAPPLEPROC GLeeFuncPtr_glBindVertexArrayAPPLE; + #define glBindVertexArrayAPPLE GLeeFuncPtr_glBindVertexArrayAPPLE +#endif +#ifndef GLEE_H_DEFINED_glDeleteVertexArraysAPPLE +#define GLEE_H_DEFINED_glDeleteVertexArraysAPPLE + typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint * arrays); + GLEE_EXTERN GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glDeleteVertexArraysAPPLE; + #define glDeleteVertexArraysAPPLE GLeeFuncPtr_glDeleteVertexArraysAPPLE +#endif +#ifndef GLEE_H_DEFINED_glGenVertexArraysAPPLE +#define GLEE_H_DEFINED_glGenVertexArraysAPPLE + typedef void (APIENTRYP GLEEPFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint * arrays); + GLEE_EXTERN GLEEPFNGLGENVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glGenVertexArraysAPPLE; + #define glGenVertexArraysAPPLE GLeeFuncPtr_glGenVertexArraysAPPLE +#endif +#ifndef GLEE_H_DEFINED_glIsVertexArrayAPPLE +#define GLEE_H_DEFINED_glIsVertexArrayAPPLE + typedef GLboolean (APIENTRYP GLEEPFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + GLEE_EXTERN GLEEPFNGLISVERTEXARRAYAPPLEPROC GLeeFuncPtr_glIsVertexArrayAPPLE; + #define glIsVertexArrayAPPLE GLeeFuncPtr_glIsVertexArrayAPPLE +#endif +#endif + +/* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define __GLEE_GL_APPLE_vertex_array_range 1 +/* Constants */ +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#ifndef GLEE_H_DEFINED_glVertexArrayRangeAPPLE +#define GLEE_H_DEFINED_glVertexArrayRangeAPPLE + typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glVertexArrayRangeAPPLE; + #define glVertexArrayRangeAPPLE GLeeFuncPtr_glVertexArrayRangeAPPLE +#endif +#ifndef GLEE_H_DEFINED_glFlushVertexArrayRangeAPPLE +#define GLEE_H_DEFINED_glFlushVertexArrayRangeAPPLE + typedef void (APIENTRYP GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glFlushVertexArrayRangeAPPLE; + #define glFlushVertexArrayRangeAPPLE GLeeFuncPtr_glFlushVertexArrayRangeAPPLE +#endif +#ifndef GLEE_H_DEFINED_glVertexArrayParameteriAPPLE +#define GLEE_H_DEFINED_glVertexArrayParameteriAPPLE + typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC GLeeFuncPtr_glVertexArrayParameteriAPPLE; + #define glVertexArrayParameteriAPPLE GLeeFuncPtr_glVertexArrayParameteriAPPLE +#endif +#endif + +/* GL_APPLE_ycbcr_422 */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define __GLEE_GL_APPLE_ycbcr_422 1 +/* Constants */ +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +/* GL_S3_s3tc */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define __GLEE_GL_S3_s3tc 1 +/* Constants */ +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +/* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define __GLEE_GL_ATI_draw_buffers 1 +/* Constants */ +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#ifndef GLEE_H_DEFINED_glDrawBuffersATI +#define GLEE_H_DEFINED_glDrawBuffersATI + typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum * bufs); + GLEE_EXTERN GLEEPFNGLDRAWBUFFERSATIPROC GLeeFuncPtr_glDrawBuffersATI; + #define glDrawBuffersATI GLeeFuncPtr_glDrawBuffersATI +#endif +#endif + +/* GL_ATI_pixel_format_float */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define __GLEE_GL_ATI_pixel_format_float 1 +/* Constants */ +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +/* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define __GLEE_GL_ATI_texture_env_combine3 1 +/* Constants */ +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +/* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define __GLEE_GL_ATI_texture_float 1 +/* Constants */ +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +/* GL_NV_float_buffer */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#define __GLEE_GL_NV_float_buffer 1 +/* Constants */ +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +/* GL_NV_fragment_program */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +#define __GLEE_GL_NV_fragment_program 1 +/* Constants */ +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#ifndef GLEE_H_DEFINED_glProgramNamedParameter4fNV +#define GLEE_H_DEFINED_glProgramNamedParameter4fNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLeeFuncPtr_glProgramNamedParameter4fNV; + #define glProgramNamedParameter4fNV GLeeFuncPtr_glProgramNamedParameter4fNV +#endif +#ifndef GLEE_H_DEFINED_glProgramNamedParameter4dNV +#define GLEE_H_DEFINED_glProgramNamedParameter4dNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLeeFuncPtr_glProgramNamedParameter4dNV; + #define glProgramNamedParameter4dNV GLeeFuncPtr_glProgramNamedParameter4dNV +#endif +#ifndef GLEE_H_DEFINED_glProgramNamedParameter4fvNV +#define GLEE_H_DEFINED_glProgramNamedParameter4fvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); + GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLeeFuncPtr_glProgramNamedParameter4fvNV; + #define glProgramNamedParameter4fvNV GLeeFuncPtr_glProgramNamedParameter4fvNV +#endif +#ifndef GLEE_H_DEFINED_glProgramNamedParameter4dvNV +#define GLEE_H_DEFINED_glProgramNamedParameter4dvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); + GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLeeFuncPtr_glProgramNamedParameter4dvNV; + #define glProgramNamedParameter4dvNV GLeeFuncPtr_glProgramNamedParameter4dvNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramNamedParameterfvNV +#define GLEE_H_DEFINED_glGetProgramNamedParameterfvNV + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramNamedParameterfvNV; + #define glGetProgramNamedParameterfvNV GLeeFuncPtr_glGetProgramNamedParameterfvNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramNamedParameterdvNV +#define GLEE_H_DEFINED_glGetProgramNamedParameterdvNV + typedef void (APIENTRYP GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramNamedParameterdvNV; + #define glGetProgramNamedParameterdvNV GLeeFuncPtr_glGetProgramNamedParameterdvNV +#endif +#endif + +/* GL_NV_half_float */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#define __GLEE_GL_NV_half_float 1 +/* Constants */ +#define GL_HALF_FLOAT_NV 0x140B +#ifndef GLEE_H_DEFINED_glVertex2hNV +#define GLEE_H_DEFINED_glVertex2hNV + typedef void (APIENTRYP GLEEPFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); + GLEE_EXTERN GLEEPFNGLVERTEX2HNVPROC GLeeFuncPtr_glVertex2hNV; + #define glVertex2hNV GLeeFuncPtr_glVertex2hNV +#endif +#ifndef GLEE_H_DEFINED_glVertex2hvNV +#define GLEE_H_DEFINED_glVertex2hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEX2HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEX2HVNVPROC GLeeFuncPtr_glVertex2hvNV; + #define glVertex2hvNV GLeeFuncPtr_glVertex2hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertex3hNV +#define GLEE_H_DEFINED_glVertex3hNV + typedef void (APIENTRYP GLEEPFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); + GLEE_EXTERN GLEEPFNGLVERTEX3HNVPROC GLeeFuncPtr_glVertex3hNV; + #define glVertex3hNV GLeeFuncPtr_glVertex3hNV +#endif +#ifndef GLEE_H_DEFINED_glVertex3hvNV +#define GLEE_H_DEFINED_glVertex3hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEX3HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEX3HVNVPROC GLeeFuncPtr_glVertex3hvNV; + #define glVertex3hvNV GLeeFuncPtr_glVertex3hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertex4hNV +#define GLEE_H_DEFINED_glVertex4hNV + typedef void (APIENTRYP GLEEPFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); + GLEE_EXTERN GLEEPFNGLVERTEX4HNVPROC GLeeFuncPtr_glVertex4hNV; + #define glVertex4hNV GLeeFuncPtr_glVertex4hNV +#endif +#ifndef GLEE_H_DEFINED_glVertex4hvNV +#define GLEE_H_DEFINED_glVertex4hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEX4HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEX4HVNVPROC GLeeFuncPtr_glVertex4hvNV; + #define glVertex4hvNV GLeeFuncPtr_glVertex4hvNV +#endif +#ifndef GLEE_H_DEFINED_glNormal3hNV +#define GLEE_H_DEFINED_glNormal3hNV + typedef void (APIENTRYP GLEEPFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); + GLEE_EXTERN GLEEPFNGLNORMAL3HNVPROC GLeeFuncPtr_glNormal3hNV; + #define glNormal3hNV GLeeFuncPtr_glNormal3hNV +#endif +#ifndef GLEE_H_DEFINED_glNormal3hvNV +#define GLEE_H_DEFINED_glNormal3hvNV + typedef void (APIENTRYP GLEEPFNGLNORMAL3HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLNORMAL3HVNVPROC GLeeFuncPtr_glNormal3hvNV; + #define glNormal3hvNV GLeeFuncPtr_glNormal3hvNV +#endif +#ifndef GLEE_H_DEFINED_glColor3hNV +#define GLEE_H_DEFINED_glColor3hNV + typedef void (APIENTRYP GLEEPFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); + GLEE_EXTERN GLEEPFNGLCOLOR3HNVPROC GLeeFuncPtr_glColor3hNV; + #define glColor3hNV GLeeFuncPtr_glColor3hNV +#endif +#ifndef GLEE_H_DEFINED_glColor3hvNV +#define GLEE_H_DEFINED_glColor3hvNV + typedef void (APIENTRYP GLEEPFNGLCOLOR3HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLCOLOR3HVNVPROC GLeeFuncPtr_glColor3hvNV; + #define glColor3hvNV GLeeFuncPtr_glColor3hvNV +#endif +#ifndef GLEE_H_DEFINED_glColor4hNV +#define GLEE_H_DEFINED_glColor4hNV + typedef void (APIENTRYP GLEEPFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); + GLEE_EXTERN GLEEPFNGLCOLOR4HNVPROC GLeeFuncPtr_glColor4hNV; + #define glColor4hNV GLeeFuncPtr_glColor4hNV +#endif +#ifndef GLEE_H_DEFINED_glColor4hvNV +#define GLEE_H_DEFINED_glColor4hvNV + typedef void (APIENTRYP GLEEPFNGLCOLOR4HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLCOLOR4HVNVPROC GLeeFuncPtr_glColor4hvNV; + #define glColor4hvNV GLeeFuncPtr_glColor4hvNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord1hNV +#define GLEE_H_DEFINED_glTexCoord1hNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD1HNVPROC) (GLhalfNV s); + GLEE_EXTERN GLEEPFNGLTEXCOORD1HNVPROC GLeeFuncPtr_glTexCoord1hNV; + #define glTexCoord1hNV GLeeFuncPtr_glTexCoord1hNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord1hvNV +#define GLEE_H_DEFINED_glTexCoord1hvNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD1HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD1HVNVPROC GLeeFuncPtr_glTexCoord1hvNV; + #define glTexCoord1hvNV GLeeFuncPtr_glTexCoord1hvNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2hNV +#define GLEE_H_DEFINED_glTexCoord2hNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); + GLEE_EXTERN GLEEPFNGLTEXCOORD2HNVPROC GLeeFuncPtr_glTexCoord2hNV; + #define glTexCoord2hNV GLeeFuncPtr_glTexCoord2hNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord2hvNV +#define GLEE_H_DEFINED_glTexCoord2hvNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD2HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD2HVNVPROC GLeeFuncPtr_glTexCoord2hvNV; + #define glTexCoord2hvNV GLeeFuncPtr_glTexCoord2hvNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord3hNV +#define GLEE_H_DEFINED_glTexCoord3hNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); + GLEE_EXTERN GLEEPFNGLTEXCOORD3HNVPROC GLeeFuncPtr_glTexCoord3hNV; + #define glTexCoord3hNV GLeeFuncPtr_glTexCoord3hNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord3hvNV +#define GLEE_H_DEFINED_glTexCoord3hvNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD3HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD3HVNVPROC GLeeFuncPtr_glTexCoord3hvNV; + #define glTexCoord3hvNV GLeeFuncPtr_glTexCoord3hvNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord4hNV +#define GLEE_H_DEFINED_glTexCoord4hNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); + GLEE_EXTERN GLEEPFNGLTEXCOORD4HNVPROC GLeeFuncPtr_glTexCoord4hNV; + #define glTexCoord4hNV GLeeFuncPtr_glTexCoord4hNV +#endif +#ifndef GLEE_H_DEFINED_glTexCoord4hvNV +#define GLEE_H_DEFINED_glTexCoord4hvNV + typedef void (APIENTRYP GLEEPFNGLTEXCOORD4HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLTEXCOORD4HVNVPROC GLeeFuncPtr_glTexCoord4hvNV; + #define glTexCoord4hvNV GLeeFuncPtr_glTexCoord4hvNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1hNV +#define GLEE_H_DEFINED_glMultiTexCoord1hNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1HNVPROC GLeeFuncPtr_glMultiTexCoord1hNV; + #define glMultiTexCoord1hNV GLeeFuncPtr_glMultiTexCoord1hNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord1hvNV +#define GLEE_H_DEFINED_glMultiTexCoord1hvNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1HVNVPROC GLeeFuncPtr_glMultiTexCoord1hvNV; + #define glMultiTexCoord1hvNV GLeeFuncPtr_glMultiTexCoord1hvNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2hNV +#define GLEE_H_DEFINED_glMultiTexCoord2hNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2HNVPROC GLeeFuncPtr_glMultiTexCoord2hNV; + #define glMultiTexCoord2hNV GLeeFuncPtr_glMultiTexCoord2hNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord2hvNV +#define GLEE_H_DEFINED_glMultiTexCoord2hvNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2HVNVPROC GLeeFuncPtr_glMultiTexCoord2hvNV; + #define glMultiTexCoord2hvNV GLeeFuncPtr_glMultiTexCoord2hvNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3hNV +#define GLEE_H_DEFINED_glMultiTexCoord3hNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3HNVPROC GLeeFuncPtr_glMultiTexCoord3hNV; + #define glMultiTexCoord3hNV GLeeFuncPtr_glMultiTexCoord3hNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord3hvNV +#define GLEE_H_DEFINED_glMultiTexCoord3hvNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3HVNVPROC GLeeFuncPtr_glMultiTexCoord3hvNV; + #define glMultiTexCoord3hvNV GLeeFuncPtr_glMultiTexCoord3hvNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4hNV +#define GLEE_H_DEFINED_glMultiTexCoord4hNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4HNVPROC GLeeFuncPtr_glMultiTexCoord4hNV; + #define glMultiTexCoord4hNV GLeeFuncPtr_glMultiTexCoord4hNV +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoord4hvNV +#define GLEE_H_DEFINED_glMultiTexCoord4hvNV + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4HVNVPROC GLeeFuncPtr_glMultiTexCoord4hvNV; + #define glMultiTexCoord4hvNV GLeeFuncPtr_glMultiTexCoord4hvNV +#endif +#ifndef GLEE_H_DEFINED_glFogCoordhNV +#define GLEE_H_DEFINED_glFogCoordhNV + typedef void (APIENTRYP GLEEPFNGLFOGCOORDHNVPROC) (GLhalfNV fog); + GLEE_EXTERN GLEEPFNGLFOGCOORDHNVPROC GLeeFuncPtr_glFogCoordhNV; + #define glFogCoordhNV GLeeFuncPtr_glFogCoordhNV +#endif +#ifndef GLEE_H_DEFINED_glFogCoordhvNV +#define GLEE_H_DEFINED_glFogCoordhvNV + typedef void (APIENTRYP GLEEPFNGLFOGCOORDHVNVPROC) (const GLhalfNV * fog); + GLEE_EXTERN GLEEPFNGLFOGCOORDHVNVPROC GLeeFuncPtr_glFogCoordhvNV; + #define glFogCoordhvNV GLeeFuncPtr_glFogCoordhvNV +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3hNV +#define GLEE_H_DEFINED_glSecondaryColor3hNV + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3HNVPROC GLeeFuncPtr_glSecondaryColor3hNV; + #define glSecondaryColor3hNV GLeeFuncPtr_glSecondaryColor3hNV +#endif +#ifndef GLEE_H_DEFINED_glSecondaryColor3hvNV +#define GLEE_H_DEFINED_glSecondaryColor3hvNV + typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3HVNVPROC GLeeFuncPtr_glSecondaryColor3hvNV; + #define glSecondaryColor3hvNV GLeeFuncPtr_glSecondaryColor3hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexWeighthNV +#define GLEE_H_DEFINED_glVertexWeighthNV + typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); + GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTHNVPROC GLeeFuncPtr_glVertexWeighthNV; + #define glVertexWeighthNV GLeeFuncPtr_glVertexWeighthNV +#endif +#ifndef GLEE_H_DEFINED_glVertexWeighthvNV +#define GLEE_H_DEFINED_glVertexWeighthvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV * weight); + GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTHVNVPROC GLeeFuncPtr_glVertexWeighthvNV; + #define glVertexWeighthvNV GLeeFuncPtr_glVertexWeighthvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1hNV +#define GLEE_H_DEFINED_glVertexAttrib1hNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1HNVPROC GLeeFuncPtr_glVertexAttrib1hNV; + #define glVertexAttrib1hNV GLeeFuncPtr_glVertexAttrib1hNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib1hvNV +#define GLEE_H_DEFINED_glVertexAttrib1hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1HVNVPROC GLeeFuncPtr_glVertexAttrib1hvNV; + #define glVertexAttrib1hvNV GLeeFuncPtr_glVertexAttrib1hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2hNV +#define GLEE_H_DEFINED_glVertexAttrib2hNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2HNVPROC GLeeFuncPtr_glVertexAttrib2hNV; + #define glVertexAttrib2hNV GLeeFuncPtr_glVertexAttrib2hNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib2hvNV +#define GLEE_H_DEFINED_glVertexAttrib2hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2HVNVPROC GLeeFuncPtr_glVertexAttrib2hvNV; + #define glVertexAttrib2hvNV GLeeFuncPtr_glVertexAttrib2hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3hNV +#define GLEE_H_DEFINED_glVertexAttrib3hNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3HNVPROC GLeeFuncPtr_glVertexAttrib3hNV; + #define glVertexAttrib3hNV GLeeFuncPtr_glVertexAttrib3hNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib3hvNV +#define GLEE_H_DEFINED_glVertexAttrib3hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3HVNVPROC GLeeFuncPtr_glVertexAttrib3hvNV; + #define glVertexAttrib3hvNV GLeeFuncPtr_glVertexAttrib3hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4hNV +#define GLEE_H_DEFINED_glVertexAttrib4hNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4HNVPROC GLeeFuncPtr_glVertexAttrib4hNV; + #define glVertexAttrib4hNV GLeeFuncPtr_glVertexAttrib4hNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttrib4hvNV +#define GLEE_H_DEFINED_glVertexAttrib4hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4HVNVPROC GLeeFuncPtr_glVertexAttrib4hvNV; + #define glVertexAttrib4hvNV GLeeFuncPtr_glVertexAttrib4hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs1hvNV +#define GLEE_H_DEFINED_glVertexAttribs1hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1HVNVPROC GLeeFuncPtr_glVertexAttribs1hvNV; + #define glVertexAttribs1hvNV GLeeFuncPtr_glVertexAttribs1hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs2hvNV +#define GLEE_H_DEFINED_glVertexAttribs2hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2HVNVPROC GLeeFuncPtr_glVertexAttribs2hvNV; + #define glVertexAttribs2hvNV GLeeFuncPtr_glVertexAttribs2hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs3hvNV +#define GLEE_H_DEFINED_glVertexAttribs3hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3HVNVPROC GLeeFuncPtr_glVertexAttribs3hvNV; + #define glVertexAttribs3hvNV GLeeFuncPtr_glVertexAttribs3hvNV +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribs4hvNV +#define GLEE_H_DEFINED_glVertexAttribs4hvNV + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4HVNVPROC GLeeFuncPtr_glVertexAttribs4hvNV; + #define glVertexAttribs4hvNV GLeeFuncPtr_glVertexAttribs4hvNV +#endif +#endif + +/* GL_NV_pixel_data_range */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define __GLEE_GL_NV_pixel_data_range 1 +/* Constants */ +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#ifndef GLEE_H_DEFINED_glPixelDataRangeNV +#define GLEE_H_DEFINED_glPixelDataRangeNV + typedef void (APIENTRYP GLEEPFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLPIXELDATARANGENVPROC GLeeFuncPtr_glPixelDataRangeNV; + #define glPixelDataRangeNV GLeeFuncPtr_glPixelDataRangeNV +#endif +#ifndef GLEE_H_DEFINED_glFlushPixelDataRangeNV +#define GLEE_H_DEFINED_glFlushPixelDataRangeNV + typedef void (APIENTRYP GLEEPFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLFLUSHPIXELDATARANGENVPROC GLeeFuncPtr_glFlushPixelDataRangeNV; + #define glFlushPixelDataRangeNV GLeeFuncPtr_glFlushPixelDataRangeNV +#endif +#endif + +/* GL_NV_primitive_restart */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define __GLEE_GL_NV_primitive_restart 1 +/* Constants */ +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#ifndef GLEE_H_DEFINED_glPrimitiveRestartNV +#define GLEE_H_DEFINED_glPrimitiveRestartNV + typedef void (APIENTRYP GLEEPFNGLPRIMITIVERESTARTNVPROC) (); + GLEE_EXTERN GLEEPFNGLPRIMITIVERESTARTNVPROC GLeeFuncPtr_glPrimitiveRestartNV; + #define glPrimitiveRestartNV GLeeFuncPtr_glPrimitiveRestartNV +#endif +#ifndef GLEE_H_DEFINED_glPrimitiveRestartIndexNV +#define GLEE_H_DEFINED_glPrimitiveRestartIndexNV + typedef void (APIENTRYP GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); + GLEE_EXTERN GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC GLeeFuncPtr_glPrimitiveRestartIndexNV; + #define glPrimitiveRestartIndexNV GLeeFuncPtr_glPrimitiveRestartIndexNV +#endif +#endif + +/* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define __GLEE_GL_NV_texture_expand_normal 1 +/* Constants */ +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +/* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#define __GLEE_GL_NV_vertex_program2 1 +/* Constants */ +#endif + +/* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#define __GLEE_GL_ATI_map_object_buffer 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glMapObjectBufferATI +#define GLEE_H_DEFINED_glMapObjectBufferATI + typedef GLvoid* (APIENTRYP GLEEPFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glMapObjectBufferATI; + #define glMapObjectBufferATI GLeeFuncPtr_glMapObjectBufferATI +#endif +#ifndef GLEE_H_DEFINED_glUnmapObjectBufferATI +#define GLEE_H_DEFINED_glUnmapObjectBufferATI + typedef void (APIENTRYP GLEEPFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLUNMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glUnmapObjectBufferATI; + #define glUnmapObjectBufferATI GLeeFuncPtr_glUnmapObjectBufferATI +#endif +#endif + +/* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define __GLEE_GL_ATI_separate_stencil 1 +/* Constants */ +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#ifndef GLEE_H_DEFINED_glStencilOpSeparateATI +#define GLEE_H_DEFINED_glStencilOpSeparateATI + typedef void (APIENTRYP GLEEPFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + GLEE_EXTERN GLEEPFNGLSTENCILOPSEPARATEATIPROC GLeeFuncPtr_glStencilOpSeparateATI; + #define glStencilOpSeparateATI GLeeFuncPtr_glStencilOpSeparateATI +#endif +#ifndef GLEE_H_DEFINED_glStencilFuncSeparateATI +#define GLEE_H_DEFINED_glStencilFuncSeparateATI + typedef void (APIENTRYP GLEEPFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); + GLEE_EXTERN GLEEPFNGLSTENCILFUNCSEPARATEATIPROC GLeeFuncPtr_glStencilFuncSeparateATI; + #define glStencilFuncSeparateATI GLeeFuncPtr_glStencilFuncSeparateATI +#endif +#endif + +/* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#define __GLEE_GL_ATI_vertex_attrib_array_object 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glVertexAttribArrayObjectATI +#define GLEE_H_DEFINED_glVertexAttribArrayObjectATI + typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC GLeeFuncPtr_glVertexAttribArrayObjectATI; + #define glVertexAttribArrayObjectATI GLeeFuncPtr_glVertexAttribArrayObjectATI +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribArrayObjectfvATI +#define GLEE_H_DEFINED_glGetVertexAttribArrayObjectfvATI + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI; + #define glGetVertexAttribArrayObjectfvATI GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribArrayObjectivATI +#define GLEE_H_DEFINED_glGetVertexAttribArrayObjectivATI + typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectivATI; + #define glGetVertexAttribArrayObjectivATI GLeeFuncPtr_glGetVertexAttribArrayObjectivATI +#endif +#endif + +/* GL_OES_read_format */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define __GLEE_GL_OES_read_format 1 +/* Constants */ +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +/* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define __GLEE_GL_EXT_depth_bounds_test 1 +/* Constants */ +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#ifndef GLEE_H_DEFINED_glDepthBoundsEXT +#define GLEE_H_DEFINED_glDepthBoundsEXT + typedef void (APIENTRYP GLEEPFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + GLEE_EXTERN GLEEPFNGLDEPTHBOUNDSEXTPROC GLeeFuncPtr_glDepthBoundsEXT; + #define glDepthBoundsEXT GLeeFuncPtr_glDepthBoundsEXT +#endif +#endif + +/* GL_EXT_texture_mirror_clamp */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define __GLEE_GL_EXT_texture_mirror_clamp 1 +/* Constants */ +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +/* GL_EXT_blend_equation_separate */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define __GLEE_GL_EXT_blend_equation_separate 1 +/* Constants */ +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#ifndef GLEE_H_DEFINED_glBlendEquationSeparateEXT +#define GLEE_H_DEFINED_glBlendEquationSeparateEXT + typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + GLEE_EXTERN GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC GLeeFuncPtr_glBlendEquationSeparateEXT; + #define glBlendEquationSeparateEXT GLeeFuncPtr_glBlendEquationSeparateEXT +#endif +#endif + +/* GL_MESA_pack_invert */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define __GLEE_GL_MESA_pack_invert 1 +/* Constants */ +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +/* GL_MESA_ycbcr_texture */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define __GLEE_GL_MESA_ycbcr_texture 1 +/* Constants */ +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +/* GL_EXT_pixel_buffer_object */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define __GLEE_GL_EXT_pixel_buffer_object 1 +/* Constants */ +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +/* GL_NV_fragment_program_option */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#define __GLEE_GL_NV_fragment_program_option 1 +/* Constants */ +#endif + +/* GL_NV_fragment_program2 */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#define __GLEE_GL_NV_fragment_program2 1 +/* Constants */ +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +/* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#define __GLEE_GL_NV_vertex_program2_option 1 +/* Constants */ +#endif + +/* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#define __GLEE_GL_NV_vertex_program3 1 +/* Constants */ +#endif + +/* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define __GLEE_GL_EXT_framebuffer_object 1 +/* Constants */ +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#ifndef GLEE_H_DEFINED_glIsRenderbufferEXT +#define GLEE_H_DEFINED_glIsRenderbufferEXT + typedef GLboolean (APIENTRYP GLEEPFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLISRENDERBUFFEREXTPROC GLeeFuncPtr_glIsRenderbufferEXT; + #define glIsRenderbufferEXT GLeeFuncPtr_glIsRenderbufferEXT +#endif +#ifndef GLEE_H_DEFINED_glBindRenderbufferEXT +#define GLEE_H_DEFINED_glBindRenderbufferEXT + typedef void (APIENTRYP GLEEPFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLBINDRENDERBUFFEREXTPROC GLeeFuncPtr_glBindRenderbufferEXT; + #define glBindRenderbufferEXT GLeeFuncPtr_glBindRenderbufferEXT +#endif +#ifndef GLEE_H_DEFINED_glDeleteRenderbuffersEXT +#define GLEE_H_DEFINED_glDeleteRenderbuffersEXT + typedef void (APIENTRYP GLEEPFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint * renderbuffers); + GLEE_EXTERN GLEEPFNGLDELETERENDERBUFFERSEXTPROC GLeeFuncPtr_glDeleteRenderbuffersEXT; + #define glDeleteRenderbuffersEXT GLeeFuncPtr_glDeleteRenderbuffersEXT +#endif +#ifndef GLEE_H_DEFINED_glGenRenderbuffersEXT +#define GLEE_H_DEFINED_glGenRenderbuffersEXT + typedef void (APIENTRYP GLEEPFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint * renderbuffers); + GLEE_EXTERN GLEEPFNGLGENRENDERBUFFERSEXTPROC GLeeFuncPtr_glGenRenderbuffersEXT; + #define glGenRenderbuffersEXT GLeeFuncPtr_glGenRenderbuffersEXT +#endif +#ifndef GLEE_H_DEFINED_glRenderbufferStorageEXT +#define GLEE_H_DEFINED_glRenderbufferStorageEXT + typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glRenderbufferStorageEXT; + #define glRenderbufferStorageEXT GLeeFuncPtr_glRenderbufferStorageEXT +#endif +#ifndef GLEE_H_DEFINED_glGetRenderbufferParameterivEXT +#define GLEE_H_DEFINED_glGetRenderbufferParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetRenderbufferParameterivEXT; + #define glGetRenderbufferParameterivEXT GLeeFuncPtr_glGetRenderbufferParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glIsFramebufferEXT +#define GLEE_H_DEFINED_glIsFramebufferEXT + typedef GLboolean (APIENTRYP GLEEPFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); + GLEE_EXTERN GLEEPFNGLISFRAMEBUFFEREXTPROC GLeeFuncPtr_glIsFramebufferEXT; + #define glIsFramebufferEXT GLeeFuncPtr_glIsFramebufferEXT +#endif +#ifndef GLEE_H_DEFINED_glBindFramebufferEXT +#define GLEE_H_DEFINED_glBindFramebufferEXT + typedef void (APIENTRYP GLEEPFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); + GLEE_EXTERN GLEEPFNGLBINDFRAMEBUFFEREXTPROC GLeeFuncPtr_glBindFramebufferEXT; + #define glBindFramebufferEXT GLeeFuncPtr_glBindFramebufferEXT +#endif +#ifndef GLEE_H_DEFINED_glDeleteFramebuffersEXT +#define GLEE_H_DEFINED_glDeleteFramebuffersEXT + typedef void (APIENTRYP GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint * framebuffers); + GLEE_EXTERN GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC GLeeFuncPtr_glDeleteFramebuffersEXT; + #define glDeleteFramebuffersEXT GLeeFuncPtr_glDeleteFramebuffersEXT +#endif +#ifndef GLEE_H_DEFINED_glGenFramebuffersEXT +#define GLEE_H_DEFINED_glGenFramebuffersEXT + typedef void (APIENTRYP GLEEPFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint * framebuffers); + GLEE_EXTERN GLEEPFNGLGENFRAMEBUFFERSEXTPROC GLeeFuncPtr_glGenFramebuffersEXT; + #define glGenFramebuffersEXT GLeeFuncPtr_glGenFramebuffersEXT +#endif +#ifndef GLEE_H_DEFINED_glCheckFramebufferStatusEXT +#define GLEE_H_DEFINED_glCheckFramebufferStatusEXT + typedef GLenum (APIENTRYP GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckFramebufferStatusEXT; + #define glCheckFramebufferStatusEXT GLeeFuncPtr_glCheckFramebufferStatusEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTexture1DEXT +#define GLEE_H_DEFINED_glFramebufferTexture1DEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glFramebufferTexture1DEXT; + #define glFramebufferTexture1DEXT GLeeFuncPtr_glFramebufferTexture1DEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTexture2DEXT +#define GLEE_H_DEFINED_glFramebufferTexture2DEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glFramebufferTexture2DEXT; + #define glFramebufferTexture2DEXT GLeeFuncPtr_glFramebufferTexture2DEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTexture3DEXT +#define GLEE_H_DEFINED_glFramebufferTexture3DEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glFramebufferTexture3DEXT; + #define glFramebufferTexture3DEXT GLeeFuncPtr_glFramebufferTexture3DEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferRenderbufferEXT +#define GLEE_H_DEFINED_glFramebufferRenderbufferEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glFramebufferRenderbufferEXT; + #define glFramebufferRenderbufferEXT GLeeFuncPtr_glFramebufferRenderbufferEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFramebufferAttachmentParameterivEXT +#define GLEE_H_DEFINED_glGetFramebufferAttachmentParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT; + #define glGetFramebufferAttachmentParameterivEXT GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGenerateMipmapEXT +#define GLEE_H_DEFINED_glGenerateMipmapEXT + typedef void (APIENTRYP GLEEPFNGLGENERATEMIPMAPEXTPROC) (GLenum target); + GLEE_EXTERN GLEEPFNGLGENERATEMIPMAPEXTPROC GLeeFuncPtr_glGenerateMipmapEXT; + #define glGenerateMipmapEXT GLeeFuncPtr_glGenerateMipmapEXT +#endif +#endif + +/* GL_GREMEDY_string_marker */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#define __GLEE_GL_GREMEDY_string_marker 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glStringMarkerGREMEDY +#define GLEE_H_DEFINED_glStringMarkerGREMEDY + typedef void (APIENTRYP GLEEPFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid * string); + GLEE_EXTERN GLEEPFNGLSTRINGMARKERGREMEDYPROC GLeeFuncPtr_glStringMarkerGREMEDY; + #define glStringMarkerGREMEDY GLeeFuncPtr_glStringMarkerGREMEDY +#endif +#endif + +/* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define __GLEE_GL_EXT_packed_depth_stencil 1 +/* Constants */ +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif + +/* GL_EXT_stencil_clear_tag */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define __GLEE_GL_EXT_stencil_clear_tag 1 +/* Constants */ +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +#ifndef GLEE_H_DEFINED_glStencilClearTagEXT +#define GLEE_H_DEFINED_glStencilClearTagEXT + typedef void (APIENTRYP GLEEPFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); + GLEE_EXTERN GLEEPFNGLSTENCILCLEARTAGEXTPROC GLeeFuncPtr_glStencilClearTagEXT; + #define glStencilClearTagEXT GLeeFuncPtr_glStencilClearTagEXT +#endif +#endif + +/* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define __GLEE_GL_EXT_texture_sRGB 1 +/* Constants */ +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif + +/* GL_EXT_framebuffer_blit */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define __GLEE_GL_EXT_framebuffer_blit 1 +/* Constants */ +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +#ifndef GLEE_H_DEFINED_glBlitFramebufferEXT +#define GLEE_H_DEFINED_glBlitFramebufferEXT + typedef void (APIENTRYP GLEEPFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + GLEE_EXTERN GLEEPFNGLBLITFRAMEBUFFEREXTPROC GLeeFuncPtr_glBlitFramebufferEXT; + #define glBlitFramebufferEXT GLeeFuncPtr_glBlitFramebufferEXT +#endif +#endif + +/* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define __GLEE_GL_EXT_framebuffer_multisample 1 +/* Constants */ +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisampleEXT +#define GLEE_H_DEFINED_glRenderbufferStorageMultisampleEXT + typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glRenderbufferStorageMultisampleEXT; + #define glRenderbufferStorageMultisampleEXT GLeeFuncPtr_glRenderbufferStorageMultisampleEXT +#endif +#endif + +/* GL_MESAX_texture_stack */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define __GLEE_GL_MESAX_texture_stack 1 +/* Constants */ +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif + +/* GL_EXT_timer_query */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define __GLEE_GL_EXT_timer_query 1 +/* Constants */ +#define GL_TIME_ELAPSED_EXT 0x88BF +#ifndef GLEE_H_DEFINED_glGetQueryObjecti64vEXT +#define GLEE_H_DEFINED_glGetQueryObjecti64vEXT + typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT * params); + GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTI64VEXTPROC GLeeFuncPtr_glGetQueryObjecti64vEXT; + #define glGetQueryObjecti64vEXT GLeeFuncPtr_glGetQueryObjecti64vEXT +#endif +#ifndef GLEE_H_DEFINED_glGetQueryObjectui64vEXT +#define GLEE_H_DEFINED_glGetQueryObjectui64vEXT + typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT * params); + GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC GLeeFuncPtr_glGetQueryObjectui64vEXT; + #define glGetQueryObjectui64vEXT GLeeFuncPtr_glGetQueryObjectui64vEXT +#endif +#endif + +/* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +#define __GLEE_GL_EXT_gpu_program_parameters 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glProgramEnvParameters4fvEXT +#define GLEE_H_DEFINED_glProgramEnvParameters4fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramEnvParameters4fvEXT; + #define glProgramEnvParameters4fvEXT GLeeFuncPtr_glProgramEnvParameters4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameters4fvEXT +#define GLEE_H_DEFINED_glProgramLocalParameters4fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramLocalParameters4fvEXT; + #define glProgramLocalParameters4fvEXT GLeeFuncPtr_glProgramLocalParameters4fvEXT +#endif +#endif + +/* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define __GLEE_GL_APPLE_flush_buffer_range 1 +/* Constants */ +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +#ifndef GLEE_H_DEFINED_glBufferParameteriAPPLE +#define GLEE_H_DEFINED_glBufferParameteriAPPLE + typedef void (APIENTRYP GLEEPFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLBUFFERPARAMETERIAPPLEPROC GLeeFuncPtr_glBufferParameteriAPPLE; + #define glBufferParameteriAPPLE GLeeFuncPtr_glBufferParameteriAPPLE +#endif +#ifndef GLEE_H_DEFINED_glFlushMappedBufferRangeAPPLE +#define GLEE_H_DEFINED_glFlushMappedBufferRangeAPPLE + typedef void (APIENTRYP GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + GLEE_EXTERN GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC GLeeFuncPtr_glFlushMappedBufferRangeAPPLE; + #define glFlushMappedBufferRangeAPPLE GLeeFuncPtr_glFlushMappedBufferRangeAPPLE +#endif +#endif + +/* GL_EXT_gpu_shader4 */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define __GLEE_GL_EXT_gpu_shader4 1 +/* Constants */ +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#ifndef GLEE_H_DEFINED_glGetUniformuivEXT +#define GLEE_H_DEFINED_glGetUniformuivEXT + typedef void (APIENTRYP GLEEPFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETUNIFORMUIVEXTPROC GLeeFuncPtr_glGetUniformuivEXT; + #define glGetUniformuivEXT GLeeFuncPtr_glGetUniformuivEXT +#endif +#ifndef GLEE_H_DEFINED_glBindFragDataLocationEXT +#define GLEE_H_DEFINED_glBindFragDataLocationEXT + typedef void (APIENTRYP GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar * name); + GLEE_EXTERN GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glBindFragDataLocationEXT; + #define glBindFragDataLocationEXT GLeeFuncPtr_glBindFragDataLocationEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFragDataLocationEXT +#define GLEE_H_DEFINED_glGetFragDataLocationEXT + typedef GLint (APIENTRYP GLEEPFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar * name); + GLEE_EXTERN GLEEPFNGLGETFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glGetFragDataLocationEXT; + #define glGetFragDataLocationEXT GLeeFuncPtr_glGetFragDataLocationEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform1uiEXT +#define GLEE_H_DEFINED_glUniform1uiEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); + GLEE_EXTERN GLEEPFNGLUNIFORM1UIEXTPROC GLeeFuncPtr_glUniform1uiEXT; + #define glUniform1uiEXT GLeeFuncPtr_glUniform1uiEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform2uiEXT +#define GLEE_H_DEFINED_glUniform2uiEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); + GLEE_EXTERN GLEEPFNGLUNIFORM2UIEXTPROC GLeeFuncPtr_glUniform2uiEXT; + #define glUniform2uiEXT GLeeFuncPtr_glUniform2uiEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform3uiEXT +#define GLEE_H_DEFINED_glUniform3uiEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); + GLEE_EXTERN GLEEPFNGLUNIFORM3UIEXTPROC GLeeFuncPtr_glUniform3uiEXT; + #define glUniform3uiEXT GLeeFuncPtr_glUniform3uiEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform4uiEXT +#define GLEE_H_DEFINED_glUniform4uiEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + GLEE_EXTERN GLEEPFNGLUNIFORM4UIEXTPROC GLeeFuncPtr_glUniform4uiEXT; + #define glUniform4uiEXT GLeeFuncPtr_glUniform4uiEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform1uivEXT +#define GLEE_H_DEFINED_glUniform1uivEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM1UIVEXTPROC GLeeFuncPtr_glUniform1uivEXT; + #define glUniform1uivEXT GLeeFuncPtr_glUniform1uivEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform2uivEXT +#define GLEE_H_DEFINED_glUniform2uivEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM2UIVEXTPROC GLeeFuncPtr_glUniform2uivEXT; + #define glUniform2uivEXT GLeeFuncPtr_glUniform2uivEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform3uivEXT +#define GLEE_H_DEFINED_glUniform3uivEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM3UIVEXTPROC GLeeFuncPtr_glUniform3uivEXT; + #define glUniform3uivEXT GLeeFuncPtr_glUniform3uivEXT +#endif +#ifndef GLEE_H_DEFINED_glUniform4uivEXT +#define GLEE_H_DEFINED_glUniform4uivEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLUNIFORM4UIVEXTPROC GLeeFuncPtr_glUniform4uivEXT; + #define glUniform4uivEXT GLeeFuncPtr_glUniform4uivEXT +#endif +#endif + +/* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +#define __GLEE_GL_EXT_draw_instanced 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glDrawArraysInstancedEXT +#define GLEE_H_DEFINED_glDrawArraysInstancedEXT + typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC GLeeFuncPtr_glDrawArraysInstancedEXT; + #define glDrawArraysInstancedEXT GLeeFuncPtr_glDrawArraysInstancedEXT +#endif +#ifndef GLEE_H_DEFINED_glDrawElementsInstancedEXT +#define GLEE_H_DEFINED_glDrawElementsInstancedEXT + typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); + GLEE_EXTERN GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC GLeeFuncPtr_glDrawElementsInstancedEXT; + #define glDrawElementsInstancedEXT GLeeFuncPtr_glDrawElementsInstancedEXT +#endif +#endif + +/* GL_EXT_packed_float */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define __GLEE_GL_EXT_packed_float 1 +/* Constants */ +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif + +/* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define __GLEE_GL_EXT_texture_array 1 +/* Constants */ +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#endif + +/* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define __GLEE_GL_EXT_texture_buffer_object 1 +/* Constants */ +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +#ifndef GLEE_H_DEFINED_glTexBufferEXT +#define GLEE_H_DEFINED_glTexBufferEXT + typedef void (APIENTRYP GLEEPFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + GLEE_EXTERN GLEEPFNGLTEXBUFFEREXTPROC GLeeFuncPtr_glTexBufferEXT; + #define glTexBufferEXT GLeeFuncPtr_glTexBufferEXT +#endif +#endif + +/* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define __GLEE_GL_EXT_texture_compression_latc 1 +/* Constants */ +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif + +/* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define __GLEE_GL_EXT_texture_compression_rgtc 1 +/* Constants */ +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif + +/* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define __GLEE_GL_EXT_texture_shared_exponent 1 +/* Constants */ +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif + +/* GL_NV_depth_buffer_float */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define __GLEE_GL_NV_depth_buffer_float 1 +/* Constants */ +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +#ifndef GLEE_H_DEFINED_glDepthRangedNV +#define GLEE_H_DEFINED_glDepthRangedNV + typedef void (APIENTRYP GLEEPFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + GLEE_EXTERN GLEEPFNGLDEPTHRANGEDNVPROC GLeeFuncPtr_glDepthRangedNV; + #define glDepthRangedNV GLeeFuncPtr_glDepthRangedNV +#endif +#ifndef GLEE_H_DEFINED_glClearDepthdNV +#define GLEE_H_DEFINED_glClearDepthdNV + typedef void (APIENTRYP GLEEPFNGLCLEARDEPTHDNVPROC) (GLdouble depth); + GLEE_EXTERN GLEEPFNGLCLEARDEPTHDNVPROC GLeeFuncPtr_glClearDepthdNV; + #define glClearDepthdNV GLeeFuncPtr_glClearDepthdNV +#endif +#ifndef GLEE_H_DEFINED_glDepthBoundsdNV +#define GLEE_H_DEFINED_glDepthBoundsdNV + typedef void (APIENTRYP GLEEPFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); + GLEE_EXTERN GLEEPFNGLDEPTHBOUNDSDNVPROC GLeeFuncPtr_glDepthBoundsdNV; + #define glDepthBoundsdNV GLeeFuncPtr_glDepthBoundsdNV +#endif +#endif + +/* GL_NV_framebuffer_multisample_coverage */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define __GLEE_GL_NV_framebuffer_multisample_coverage 1 +/* Constants */ +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisampleCoverageNV +#define GLEE_H_DEFINED_glRenderbufferStorageMultisampleCoverageNV + typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV; + #define glRenderbufferStorageMultisampleCoverageNV GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV +#endif +#endif + +/* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define __GLEE_GL_EXT_framebuffer_sRGB 1 +/* Constants */ +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif + +/* GL_NV_geometry_shader4 */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#define __GLEE_GL_NV_geometry_shader4 1 +/* Constants */ +#endif + +/* GL_NV_parameter_buffer_object */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define __GLEE_GL_NV_parameter_buffer_object 1 +/* Constants */ +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +#ifndef GLEE_H_DEFINED_glProgramBufferParametersfvNV +#define GLEE_H_DEFINED_glProgramBufferParametersfvNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC GLeeFuncPtr_glProgramBufferParametersfvNV; + #define glProgramBufferParametersfvNV GLeeFuncPtr_glProgramBufferParametersfvNV +#endif +#ifndef GLEE_H_DEFINED_glProgramBufferParametersIivNV +#define GLEE_H_DEFINED_glProgramBufferParametersIivNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC GLeeFuncPtr_glProgramBufferParametersIivNV; + #define glProgramBufferParametersIivNV GLeeFuncPtr_glProgramBufferParametersIivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramBufferParametersIuivNV +#define GLEE_H_DEFINED_glProgramBufferParametersIuivNV + typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC GLeeFuncPtr_glProgramBufferParametersIuivNV; + #define glProgramBufferParametersIuivNV GLeeFuncPtr_glProgramBufferParametersIuivNV +#endif +#endif + +/* GL_EXT_draw_buffers2 */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +#define __GLEE_GL_EXT_draw_buffers2 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glColorMaskIndexedEXT +#define GLEE_H_DEFINED_glColorMaskIndexedEXT + typedef void (APIENTRYP GLEEPFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); + GLEE_EXTERN GLEEPFNGLCOLORMASKINDEXEDEXTPROC GLeeFuncPtr_glColorMaskIndexedEXT; + #define glColorMaskIndexedEXT GLeeFuncPtr_glColorMaskIndexedEXT +#endif +#ifndef GLEE_H_DEFINED_glGetBooleanIndexedvEXT +#define GLEE_H_DEFINED_glGetBooleanIndexedvEXT + typedef void (APIENTRYP GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean * data); + GLEE_EXTERN GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC GLeeFuncPtr_glGetBooleanIndexedvEXT; + #define glGetBooleanIndexedvEXT GLeeFuncPtr_glGetBooleanIndexedvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetIntegerIndexedvEXT +#define GLEE_H_DEFINED_glGetIntegerIndexedvEXT + typedef void (APIENTRYP GLEEPFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint * data); + GLEE_EXTERN GLEEPFNGLGETINTEGERINDEXEDVEXTPROC GLeeFuncPtr_glGetIntegerIndexedvEXT; + #define glGetIntegerIndexedvEXT GLeeFuncPtr_glGetIntegerIndexedvEXT +#endif +#ifndef GLEE_H_DEFINED_glEnableIndexedEXT +#define GLEE_H_DEFINED_glEnableIndexedEXT + typedef void (APIENTRYP GLEEPFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); + GLEE_EXTERN GLEEPFNGLENABLEINDEXEDEXTPROC GLeeFuncPtr_glEnableIndexedEXT; + #define glEnableIndexedEXT GLeeFuncPtr_glEnableIndexedEXT +#endif +#ifndef GLEE_H_DEFINED_glDisableIndexedEXT +#define GLEE_H_DEFINED_glDisableIndexedEXT + typedef void (APIENTRYP GLEEPFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); + GLEE_EXTERN GLEEPFNGLDISABLEINDEXEDEXTPROC GLeeFuncPtr_glDisableIndexedEXT; + #define glDisableIndexedEXT GLeeFuncPtr_glDisableIndexedEXT +#endif +#ifndef GLEE_H_DEFINED_glIsEnabledIndexedEXT +#define GLEE_H_DEFINED_glIsEnabledIndexedEXT + typedef GLboolean (APIENTRYP GLEEPFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + GLEE_EXTERN GLEEPFNGLISENABLEDINDEXEDEXTPROC GLeeFuncPtr_glIsEnabledIndexedEXT; + #define glIsEnabledIndexedEXT GLeeFuncPtr_glIsEnabledIndexedEXT +#endif +#endif + +/* GL_NV_transform_feedback */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define __GLEE_GL_NV_transform_feedback 1 +/* Constants */ +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#ifndef GLEE_H_DEFINED_glBeginTransformFeedbackNV +#define GLEE_H_DEFINED_glBeginTransformFeedbackNV + typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); + GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBeginTransformFeedbackNV; + #define glBeginTransformFeedbackNV GLeeFuncPtr_glBeginTransformFeedbackNV +#endif +#ifndef GLEE_H_DEFINED_glEndTransformFeedbackNV +#define GLEE_H_DEFINED_glEndTransformFeedbackNV + typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC) (); + GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glEndTransformFeedbackNV; + #define glEndTransformFeedbackNV GLeeFuncPtr_glEndTransformFeedbackNV +#endif +#ifndef GLEE_H_DEFINED_glTransformFeedbackAttribsNV +#define GLEE_H_DEFINED_glTransformFeedbackAttribsNV + typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint * attribs, GLenum bufferMode); + GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC GLeeFuncPtr_glTransformFeedbackAttribsNV; + #define glTransformFeedbackAttribsNV GLeeFuncPtr_glTransformFeedbackAttribsNV +#endif +#ifndef GLEE_H_DEFINED_glBindBufferRangeNV +#define GLEE_H_DEFINED_glBindBufferRangeNV + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGENVPROC GLeeFuncPtr_glBindBufferRangeNV; + #define glBindBufferRangeNV GLeeFuncPtr_glBindBufferRangeNV +#endif +#ifndef GLEE_H_DEFINED_glBindBufferOffsetNV +#define GLEE_H_DEFINED_glBindBufferOffsetNV + typedef void (APIENTRYP GLEEPFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); + GLEE_EXTERN GLEEPFNGLBINDBUFFEROFFSETNVPROC GLeeFuncPtr_glBindBufferOffsetNV; + #define glBindBufferOffsetNV GLeeFuncPtr_glBindBufferOffsetNV +#endif +#ifndef GLEE_H_DEFINED_glBindBufferBaseNV +#define GLEE_H_DEFINED_glBindBufferBaseNV + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); + GLEE_EXTERN GLEEPFNGLBINDBUFFERBASENVPROC GLeeFuncPtr_glBindBufferBaseNV; + #define glBindBufferBaseNV GLeeFuncPtr_glBindBufferBaseNV +#endif +#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryingsNV +#define GLEE_H_DEFINED_glTransformFeedbackVaryingsNV + typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); + GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC GLeeFuncPtr_glTransformFeedbackVaryingsNV; + #define glTransformFeedbackVaryingsNV GLeeFuncPtr_glTransformFeedbackVaryingsNV +#endif +#ifndef GLEE_H_DEFINED_glActiveVaryingNV +#define GLEE_H_DEFINED_glActiveVaryingNV + typedef void (APIENTRYP GLEEPFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar * name); + GLEE_EXTERN GLEEPFNGLACTIVEVARYINGNVPROC GLeeFuncPtr_glActiveVaryingNV; + #define glActiveVaryingNV GLeeFuncPtr_glActiveVaryingNV +#endif +#ifndef GLEE_H_DEFINED_glGetVaryingLocationNV +#define GLEE_H_DEFINED_glGetVaryingLocationNV + typedef GLint (APIENTRYP GLEEPFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar * name); + GLEE_EXTERN GLEEPFNGLGETVARYINGLOCATIONNVPROC GLeeFuncPtr_glGetVaryingLocationNV; + #define glGetVaryingLocationNV GLeeFuncPtr_glGetVaryingLocationNV +#endif +#ifndef GLEE_H_DEFINED_glGetActiveVaryingNV +#define GLEE_H_DEFINED_glGetActiveVaryingNV + typedef void (APIENTRYP GLEEPFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); + GLEE_EXTERN GLEEPFNGLGETACTIVEVARYINGNVPROC GLeeFuncPtr_glGetActiveVaryingNV; + #define glGetActiveVaryingNV GLeeFuncPtr_glGetActiveVaryingNV +#endif +#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVaryingNV +#define GLEE_H_DEFINED_glGetTransformFeedbackVaryingNV + typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint * location); + GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC GLeeFuncPtr_glGetTransformFeedbackVaryingNV; + #define glGetTransformFeedbackVaryingNV GLeeFuncPtr_glGetTransformFeedbackVaryingNV +#endif +#endif + +/* GL_EXT_bindable_uniform */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define __GLEE_GL_EXT_bindable_uniform 1 +/* Constants */ +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +#ifndef GLEE_H_DEFINED_glUniformBufferEXT +#define GLEE_H_DEFINED_glUniformBufferEXT + typedef void (APIENTRYP GLEEPFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + GLEE_EXTERN GLEEPFNGLUNIFORMBUFFEREXTPROC GLeeFuncPtr_glUniformBufferEXT; + #define glUniformBufferEXT GLeeFuncPtr_glUniformBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glGetUniformBufferSizeEXT +#define GLEE_H_DEFINED_glGetUniformBufferSizeEXT + typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); + GLEE_EXTERN GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC GLeeFuncPtr_glGetUniformBufferSizeEXT; + #define glGetUniformBufferSizeEXT GLeeFuncPtr_glGetUniformBufferSizeEXT +#endif +#ifndef GLEE_H_DEFINED_glGetUniformOffsetEXT +#define GLEE_H_DEFINED_glGetUniformOffsetEXT + typedef GLintptr (APIENTRYP GLEEPFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); + GLEE_EXTERN GLEEPFNGLGETUNIFORMOFFSETEXTPROC GLeeFuncPtr_glGetUniformOffsetEXT; + #define glGetUniformOffsetEXT GLeeFuncPtr_glGetUniformOffsetEXT +#endif +#endif + +/* GL_EXT_texture_integer */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define __GLEE_GL_EXT_texture_integer 1 +/* Constants */ +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +#ifndef GLEE_H_DEFINED_glTexParameterIivEXT +#define GLEE_H_DEFINED_glTexParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glTexParameterIivEXT; + #define glTexParameterIivEXT GLeeFuncPtr_glTexParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glTexParameterIuivEXT +#define GLEE_H_DEFINED_glTexParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint * params); + GLEE_EXTERN GLEEPFNGLTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glTexParameterIuivEXT; + #define glTexParameterIuivEXT GLeeFuncPtr_glTexParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTexParameterIivEXT +#define GLEE_H_DEFINED_glGetTexParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTexParameterIivEXT; + #define glGetTexParameterIivEXT GLeeFuncPtr_glGetTexParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTexParameterIuivEXT +#define GLEE_H_DEFINED_glGetTexParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTexParameterIuivEXT; + #define glGetTexParameterIuivEXT GLeeFuncPtr_glGetTexParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glClearColorIiEXT +#define GLEE_H_DEFINED_glClearColorIiEXT + typedef void (APIENTRYP GLEEPFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); + GLEE_EXTERN GLEEPFNGLCLEARCOLORIIEXTPROC GLeeFuncPtr_glClearColorIiEXT; + #define glClearColorIiEXT GLeeFuncPtr_glClearColorIiEXT +#endif +#ifndef GLEE_H_DEFINED_glClearColorIuiEXT +#define GLEE_H_DEFINED_glClearColorIuiEXT + typedef void (APIENTRYP GLEEPFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); + GLEE_EXTERN GLEEPFNGLCLEARCOLORIUIEXTPROC GLeeFuncPtr_glClearColorIuiEXT; + #define glClearColorIuiEXT GLeeFuncPtr_glClearColorIuiEXT +#endif +#endif + +/* GL_GREMEDY_frame_terminator */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +#define __GLEE_GL_GREMEDY_frame_terminator 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glFrameTerminatorGREMEDY +#define GLEE_H_DEFINED_glFrameTerminatorGREMEDY + typedef void (APIENTRYP GLEEPFNGLFRAMETERMINATORGREMEDYPROC) (); + GLEE_EXTERN GLEEPFNGLFRAMETERMINATORGREMEDYPROC GLeeFuncPtr_glFrameTerminatorGREMEDY; + #define glFrameTerminatorGREMEDY GLeeFuncPtr_glFrameTerminatorGREMEDY +#endif +#endif + +/* GL_NV_conditional_render */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define __GLEE_GL_NV_conditional_render 1 +/* Constants */ +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +#ifndef GLEE_H_DEFINED_glBeginConditionalRenderNV +#define GLEE_H_DEFINED_glBeginConditionalRenderNV + typedef void (APIENTRYP GLEEPFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); + GLEE_EXTERN GLEEPFNGLBEGINCONDITIONALRENDERNVPROC GLeeFuncPtr_glBeginConditionalRenderNV; + #define glBeginConditionalRenderNV GLeeFuncPtr_glBeginConditionalRenderNV +#endif +#ifndef GLEE_H_DEFINED_glEndConditionalRenderNV +#define GLEE_H_DEFINED_glEndConditionalRenderNV + typedef void (APIENTRYP GLEEPFNGLENDCONDITIONALRENDERNVPROC) (); + GLEE_EXTERN GLEEPFNGLENDCONDITIONALRENDERNVPROC GLeeFuncPtr_glEndConditionalRenderNV; + #define glEndConditionalRenderNV GLeeFuncPtr_glEndConditionalRenderNV +#endif +#endif + +/* GL_NV_present_video */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define __GLEE_GL_NV_present_video 1 +/* Constants */ +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +#endif + +/* GL_EXT_transform_feedback */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define __GLEE_GL_EXT_transform_feedback 1 +/* Constants */ +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#ifndef GLEE_H_DEFINED_glBeginTransformFeedbackEXT +#define GLEE_H_DEFINED_glBeginTransformFeedbackEXT + typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); + GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glBeginTransformFeedbackEXT; + #define glBeginTransformFeedbackEXT GLeeFuncPtr_glBeginTransformFeedbackEXT +#endif +#ifndef GLEE_H_DEFINED_glEndTransformFeedbackEXT +#define GLEE_H_DEFINED_glEndTransformFeedbackEXT + typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC) (); + GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glEndTransformFeedbackEXT; + #define glEndTransformFeedbackEXT GLeeFuncPtr_glEndTransformFeedbackEXT +#endif +#ifndef GLEE_H_DEFINED_glBindBufferRangeEXT +#define GLEE_H_DEFINED_glBindBufferRangeEXT + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGEEXTPROC GLeeFuncPtr_glBindBufferRangeEXT; + #define glBindBufferRangeEXT GLeeFuncPtr_glBindBufferRangeEXT +#endif +#ifndef GLEE_H_DEFINED_glBindBufferOffsetEXT +#define GLEE_H_DEFINED_glBindBufferOffsetEXT + typedef void (APIENTRYP GLEEPFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); + GLEE_EXTERN GLEEPFNGLBINDBUFFEROFFSETEXTPROC GLeeFuncPtr_glBindBufferOffsetEXT; + #define glBindBufferOffsetEXT GLeeFuncPtr_glBindBufferOffsetEXT +#endif +#ifndef GLEE_H_DEFINED_glBindBufferBaseEXT +#define GLEE_H_DEFINED_glBindBufferBaseEXT + typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); + GLEE_EXTERN GLEEPFNGLBINDBUFFERBASEEXTPROC GLeeFuncPtr_glBindBufferBaseEXT; + #define glBindBufferBaseEXT GLeeFuncPtr_glBindBufferBaseEXT +#endif +#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryingsEXT +#define GLEE_H_DEFINED_glTransformFeedbackVaryingsEXT + typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); + GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC GLeeFuncPtr_glTransformFeedbackVaryingsEXT; + #define glTransformFeedbackVaryingsEXT GLeeFuncPtr_glTransformFeedbackVaryingsEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVaryingEXT +#define GLEE_H_DEFINED_glGetTransformFeedbackVaryingEXT + typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLint * location); + GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC GLeeFuncPtr_glGetTransformFeedbackVaryingEXT; + #define glGetTransformFeedbackVaryingEXT GLeeFuncPtr_glGetTransformFeedbackVaryingEXT +#endif +#endif + +/* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define __GLEE_GL_EXT_direct_state_access 1 +/* Constants */ +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +#ifndef GLEE_H_DEFINED_glClientAttribDefaultEXT +#define GLEE_H_DEFINED_glClientAttribDefaultEXT + typedef void (APIENTRYP GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); + GLEE_EXTERN GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glClientAttribDefaultEXT; + #define glClientAttribDefaultEXT GLeeFuncPtr_glClientAttribDefaultEXT +#endif +#ifndef GLEE_H_DEFINED_glPushClientAttribDefaultEXT +#define GLEE_H_DEFINED_glPushClientAttribDefaultEXT + typedef void (APIENTRYP GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); + GLEE_EXTERN GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glPushClientAttribDefaultEXT; + #define glPushClientAttribDefaultEXT GLeeFuncPtr_glPushClientAttribDefaultEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixLoadfEXT +#define GLEE_H_DEFINED_glMatrixLoadfEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat * m); + GLEE_EXTERN GLEEPFNGLMATRIXLOADFEXTPROC GLeeFuncPtr_glMatrixLoadfEXT; + #define glMatrixLoadfEXT GLeeFuncPtr_glMatrixLoadfEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixLoaddEXT +#define GLEE_H_DEFINED_glMatrixLoaddEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble * m); + GLEE_EXTERN GLEEPFNGLMATRIXLOADDEXTPROC GLeeFuncPtr_glMatrixLoaddEXT; + #define glMatrixLoaddEXT GLeeFuncPtr_glMatrixLoaddEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixMultfEXT +#define GLEE_H_DEFINED_glMatrixMultfEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat * m); + GLEE_EXTERN GLEEPFNGLMATRIXMULTFEXTPROC GLeeFuncPtr_glMatrixMultfEXT; + #define glMatrixMultfEXT GLeeFuncPtr_glMatrixMultfEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixMultdEXT +#define GLEE_H_DEFINED_glMatrixMultdEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble * m); + GLEE_EXTERN GLEEPFNGLMATRIXMULTDEXTPROC GLeeFuncPtr_glMatrixMultdEXT; + #define glMatrixMultdEXT GLeeFuncPtr_glMatrixMultdEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixLoadIdentityEXT +#define GLEE_H_DEFINED_glMatrixLoadIdentityEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLMATRIXLOADIDENTITYEXTPROC GLeeFuncPtr_glMatrixLoadIdentityEXT; + #define glMatrixLoadIdentityEXT GLeeFuncPtr_glMatrixLoadIdentityEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixRotatefEXT +#define GLEE_H_DEFINED_glMatrixRotatefEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLMATRIXROTATEFEXTPROC GLeeFuncPtr_glMatrixRotatefEXT; + #define glMatrixRotatefEXT GLeeFuncPtr_glMatrixRotatefEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixRotatedEXT +#define GLEE_H_DEFINED_glMatrixRotatedEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLMATRIXROTATEDEXTPROC GLeeFuncPtr_glMatrixRotatedEXT; + #define glMatrixRotatedEXT GLeeFuncPtr_glMatrixRotatedEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixScalefEXT +#define GLEE_H_DEFINED_glMatrixScalefEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLMATRIXSCALEFEXTPROC GLeeFuncPtr_glMatrixScalefEXT; + #define glMatrixScalefEXT GLeeFuncPtr_glMatrixScalefEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixScaledEXT +#define GLEE_H_DEFINED_glMatrixScaledEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLMATRIXSCALEDEXTPROC GLeeFuncPtr_glMatrixScaledEXT; + #define glMatrixScaledEXT GLeeFuncPtr_glMatrixScaledEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixTranslatefEXT +#define GLEE_H_DEFINED_glMatrixTranslatefEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); + GLEE_EXTERN GLEEPFNGLMATRIXTRANSLATEFEXTPROC GLeeFuncPtr_glMatrixTranslatefEXT; + #define glMatrixTranslatefEXT GLeeFuncPtr_glMatrixTranslatefEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixTranslatedEXT +#define GLEE_H_DEFINED_glMatrixTranslatedEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); + GLEE_EXTERN GLEEPFNGLMATRIXTRANSLATEDEXTPROC GLeeFuncPtr_glMatrixTranslatedEXT; + #define glMatrixTranslatedEXT GLeeFuncPtr_glMatrixTranslatedEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixFrustumEXT +#define GLEE_H_DEFINED_glMatrixFrustumEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); + GLEE_EXTERN GLEEPFNGLMATRIXFRUSTUMEXTPROC GLeeFuncPtr_glMatrixFrustumEXT; + #define glMatrixFrustumEXT GLeeFuncPtr_glMatrixFrustumEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixOrthoEXT +#define GLEE_H_DEFINED_glMatrixOrthoEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); + GLEE_EXTERN GLEEPFNGLMATRIXORTHOEXTPROC GLeeFuncPtr_glMatrixOrthoEXT; + #define glMatrixOrthoEXT GLeeFuncPtr_glMatrixOrthoEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixPopEXT +#define GLEE_H_DEFINED_glMatrixPopEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXPOPEXTPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLMATRIXPOPEXTPROC GLeeFuncPtr_glMatrixPopEXT; + #define glMatrixPopEXT GLeeFuncPtr_glMatrixPopEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixPushEXT +#define GLEE_H_DEFINED_glMatrixPushEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXPUSHEXTPROC) (GLenum mode); + GLEE_EXTERN GLEEPFNGLMATRIXPUSHEXTPROC GLeeFuncPtr_glMatrixPushEXT; + #define glMatrixPushEXT GLeeFuncPtr_glMatrixPushEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixLoadTransposefEXT +#define GLEE_H_DEFINED_glMatrixLoadTransposefEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat * m); + GLEE_EXTERN GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixLoadTransposefEXT; + #define glMatrixLoadTransposefEXT GLeeFuncPtr_glMatrixLoadTransposefEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixLoadTransposedEXT +#define GLEE_H_DEFINED_glMatrixLoadTransposedEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble * m); + GLEE_EXTERN GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixLoadTransposedEXT; + #define glMatrixLoadTransposedEXT GLeeFuncPtr_glMatrixLoadTransposedEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixMultTransposefEXT +#define GLEE_H_DEFINED_glMatrixMultTransposefEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat * m); + GLEE_EXTERN GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixMultTransposefEXT; + #define glMatrixMultTransposefEXT GLeeFuncPtr_glMatrixMultTransposefEXT +#endif +#ifndef GLEE_H_DEFINED_glMatrixMultTransposedEXT +#define GLEE_H_DEFINED_glMatrixMultTransposedEXT + typedef void (APIENTRYP GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble * m); + GLEE_EXTERN GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixMultTransposedEXT; + #define glMatrixMultTransposedEXT GLeeFuncPtr_glMatrixMultTransposedEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureParameterfEXT +#define GLEE_H_DEFINED_glTextureParameterfEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERFEXTPROC GLeeFuncPtr_glTextureParameterfEXT; + #define glTextureParameterfEXT GLeeFuncPtr_glTextureParameterfEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureParameterfvEXT +#define GLEE_H_DEFINED_glTextureParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glTextureParameterfvEXT; + #define glTextureParameterfvEXT GLeeFuncPtr_glTextureParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureParameteriEXT +#define GLEE_H_DEFINED_glTextureParameteriEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIEXTPROC GLeeFuncPtr_glTextureParameteriEXT; + #define glTextureParameteriEXT GLeeFuncPtr_glTextureParameteriEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureParameterivEXT +#define GLEE_H_DEFINED_glTextureParameterivEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glTextureParameterivEXT; + #define glTextureParameterivEXT GLeeFuncPtr_glTextureParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureImage1DEXT +#define GLEE_H_DEFINED_glTextureImage1DEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glTextureImage1DEXT; + #define glTextureImage1DEXT GLeeFuncPtr_glTextureImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureImage2DEXT +#define GLEE_H_DEFINED_glTextureImage2DEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glTextureImage2DEXT; + #define glTextureImage2DEXT GLeeFuncPtr_glTextureImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureSubImage1DEXT +#define GLEE_H_DEFINED_glTextureSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glTextureSubImage1DEXT; + #define glTextureSubImage1DEXT GLeeFuncPtr_glTextureSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureSubImage2DEXT +#define GLEE_H_DEFINED_glTextureSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glTextureSubImage2DEXT; + #define glTextureSubImage2DEXT GLeeFuncPtr_glTextureSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTextureImage1DEXT +#define GLEE_H_DEFINED_glCopyTextureImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + GLEE_EXTERN GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureImage1DEXT; + #define glCopyTextureImage1DEXT GLeeFuncPtr_glCopyTextureImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTextureImage2DEXT +#define GLEE_H_DEFINED_glCopyTextureImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + GLEE_EXTERN GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureImage2DEXT; + #define glCopyTextureImage2DEXT GLeeFuncPtr_glCopyTextureImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTextureSubImage1DEXT +#define GLEE_H_DEFINED_glCopyTextureSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureSubImage1DEXT; + #define glCopyTextureSubImage1DEXT GLeeFuncPtr_glCopyTextureSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTextureSubImage2DEXT +#define GLEE_H_DEFINED_glCopyTextureSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureSubImage2DEXT; + #define glCopyTextureSubImage2DEXT GLeeFuncPtr_glCopyTextureSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureImageEXT +#define GLEE_H_DEFINED_glGetTextureImageEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLGETTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetTextureImageEXT; + #define glGetTextureImageEXT GLeeFuncPtr_glGetTextureImageEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureParameterfvEXT +#define GLEE_H_DEFINED_glGetTextureParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureParameterfvEXT; + #define glGetTextureParameterfvEXT GLeeFuncPtr_glGetTextureParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureParameterivEXT +#define GLEE_H_DEFINED_glGetTextureParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureParameterivEXT; + #define glGetTextureParameterivEXT GLeeFuncPtr_glGetTextureParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureLevelParameterfvEXT +#define GLEE_H_DEFINED_glGetTextureLevelParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterfvEXT; + #define glGetTextureLevelParameterfvEXT GLeeFuncPtr_glGetTextureLevelParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureLevelParameterivEXT +#define GLEE_H_DEFINED_glGetTextureLevelParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterivEXT; + #define glGetTextureLevelParameterivEXT GLeeFuncPtr_glGetTextureLevelParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureImage3DEXT +#define GLEE_H_DEFINED_glTextureImage3DEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glTextureImage3DEXT; + #define glTextureImage3DEXT GLeeFuncPtr_glTextureImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureSubImage3DEXT +#define GLEE_H_DEFINED_glTextureSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glTextureSubImage3DEXT; + #define glTextureSubImage3DEXT GLeeFuncPtr_glTextureSubImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyTextureSubImage3DEXT +#define GLEE_H_DEFINED_glCopyTextureSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTextureSubImage3DEXT; + #define glCopyTextureSubImage3DEXT GLeeFuncPtr_glCopyTextureSubImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexParameterfEXT +#define GLEE_H_DEFINED_glMultiTexParameterfEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERFEXTPROC GLeeFuncPtr_glMultiTexParameterfEXT; + #define glMultiTexParameterfEXT GLeeFuncPtr_glMultiTexParameterfEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexParameterfvEXT +#define GLEE_H_DEFINED_glMultiTexParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glMultiTexParameterfvEXT; + #define glMultiTexParameterfvEXT GLeeFuncPtr_glMultiTexParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexParameteriEXT +#define GLEE_H_DEFINED_glMultiTexParameteriEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIEXTPROC GLeeFuncPtr_glMultiTexParameteriEXT; + #define glMultiTexParameteriEXT GLeeFuncPtr_glMultiTexParameteriEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexParameterivEXT +#define GLEE_H_DEFINED_glMultiTexParameterivEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glMultiTexParameterivEXT; + #define glMultiTexParameterivEXT GLeeFuncPtr_glMultiTexParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexImage1DEXT +#define GLEE_H_DEFINED_glMultiTexImage1DEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexImage1DEXT; + #define glMultiTexImage1DEXT GLeeFuncPtr_glMultiTexImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexImage2DEXT +#define GLEE_H_DEFINED_glMultiTexImage2DEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexImage2DEXT; + #define glMultiTexImage2DEXT GLeeFuncPtr_glMultiTexImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexSubImage1DEXT +#define GLEE_H_DEFINED_glMultiTexSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexSubImage1DEXT; + #define glMultiTexSubImage1DEXT GLeeFuncPtr_glMultiTexSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexSubImage2DEXT +#define GLEE_H_DEFINED_glMultiTexSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexSubImage2DEXT; + #define glMultiTexSubImage2DEXT GLeeFuncPtr_glMultiTexSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyMultiTexImage1DEXT +#define GLEE_H_DEFINED_glCopyMultiTexImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + GLEE_EXTERN GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexImage1DEXT; + #define glCopyMultiTexImage1DEXT GLeeFuncPtr_glCopyMultiTexImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyMultiTexImage2DEXT +#define GLEE_H_DEFINED_glCopyMultiTexImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + GLEE_EXTERN GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexImage2DEXT; + #define glCopyMultiTexImage2DEXT GLeeFuncPtr_glCopyMultiTexImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage1DEXT +#define GLEE_H_DEFINED_glCopyMultiTexSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage1DEXT; + #define glCopyMultiTexSubImage1DEXT GLeeFuncPtr_glCopyMultiTexSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage2DEXT +#define GLEE_H_DEFINED_glCopyMultiTexSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage2DEXT; + #define glCopyMultiTexSubImage2DEXT GLeeFuncPtr_glCopyMultiTexSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexImageEXT +#define GLEE_H_DEFINED_glGetMultiTexImageEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLGETMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetMultiTexImageEXT; + #define glGetMultiTexImageEXT GLeeFuncPtr_glGetMultiTexImageEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexParameterfvEXT +#define GLEE_H_DEFINED_glGetMultiTexParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexParameterfvEXT; + #define glGetMultiTexParameterfvEXT GLeeFuncPtr_glGetMultiTexParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexParameterivEXT +#define GLEE_H_DEFINED_glGetMultiTexParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterivEXT; + #define glGetMultiTexParameterivEXT GLeeFuncPtr_glGetMultiTexParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexLevelParameterfvEXT +#define GLEE_H_DEFINED_glGetMultiTexLevelParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT; + #define glGetMultiTexLevelParameterfvEXT GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexLevelParameterivEXT +#define GLEE_H_DEFINED_glGetMultiTexLevelParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterivEXT; + #define glGetMultiTexLevelParameterivEXT GLeeFuncPtr_glGetMultiTexLevelParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexImage3DEXT +#define GLEE_H_DEFINED_glMultiTexImage3DEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexImage3DEXT; + #define glMultiTexImage3DEXT GLeeFuncPtr_glMultiTexImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexSubImage3DEXT +#define GLEE_H_DEFINED_glMultiTexSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); + GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexSubImage3DEXT; + #define glMultiTexSubImage3DEXT GLeeFuncPtr_glMultiTexSubImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage3DEXT +#define GLEE_H_DEFINED_glCopyMultiTexSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage3DEXT; + #define glCopyMultiTexSubImage3DEXT GLeeFuncPtr_glCopyMultiTexSubImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glBindMultiTextureEXT +#define GLEE_H_DEFINED_glBindMultiTextureEXT + typedef void (APIENTRYP GLEEPFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); + GLEE_EXTERN GLEEPFNGLBINDMULTITEXTUREEXTPROC GLeeFuncPtr_glBindMultiTextureEXT; + #define glBindMultiTextureEXT GLeeFuncPtr_glBindMultiTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glEnableClientStateIndexedEXT +#define GLEE_H_DEFINED_glEnableClientStateIndexedEXT + typedef void (APIENTRYP GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); + GLEE_EXTERN GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glEnableClientStateIndexedEXT; + #define glEnableClientStateIndexedEXT GLeeFuncPtr_glEnableClientStateIndexedEXT +#endif +#ifndef GLEE_H_DEFINED_glDisableClientStateIndexedEXT +#define GLEE_H_DEFINED_glDisableClientStateIndexedEXT + typedef void (APIENTRYP GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); + GLEE_EXTERN GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glDisableClientStateIndexedEXT; + #define glDisableClientStateIndexedEXT GLeeFuncPtr_glDisableClientStateIndexedEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexCoordPointerEXT +#define GLEE_H_DEFINED_glMultiTexCoordPointerEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC GLeeFuncPtr_glMultiTexCoordPointerEXT; + #define glMultiTexCoordPointerEXT GLeeFuncPtr_glMultiTexCoordPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexEnvfEXT +#define GLEE_H_DEFINED_glMultiTexEnvfEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLMULTITEXENVFEXTPROC GLeeFuncPtr_glMultiTexEnvfEXT; + #define glMultiTexEnvfEXT GLeeFuncPtr_glMultiTexEnvfEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexEnvfvEXT +#define GLEE_H_DEFINED_glMultiTexEnvfvEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLMULTITEXENVFVEXTPROC GLeeFuncPtr_glMultiTexEnvfvEXT; + #define glMultiTexEnvfvEXT GLeeFuncPtr_glMultiTexEnvfvEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexEnviEXT +#define GLEE_H_DEFINED_glMultiTexEnviEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLMULTITEXENVIEXTPROC GLeeFuncPtr_glMultiTexEnviEXT; + #define glMultiTexEnviEXT GLeeFuncPtr_glMultiTexEnviEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexEnvivEXT +#define GLEE_H_DEFINED_glMultiTexEnvivEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLMULTITEXENVIVEXTPROC GLeeFuncPtr_glMultiTexEnvivEXT; + #define glMultiTexEnvivEXT GLeeFuncPtr_glMultiTexEnvivEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexGendEXT +#define GLEE_H_DEFINED_glMultiTexGendEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); + GLEE_EXTERN GLEEPFNGLMULTITEXGENDEXTPROC GLeeFuncPtr_glMultiTexGendEXT; + #define glMultiTexGendEXT GLeeFuncPtr_glMultiTexGendEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexGendvEXT +#define GLEE_H_DEFINED_glMultiTexGendvEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params); + GLEE_EXTERN GLEEPFNGLMULTITEXGENDVEXTPROC GLeeFuncPtr_glMultiTexGendvEXT; + #define glMultiTexGendvEXT GLeeFuncPtr_glMultiTexGendvEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexGenfEXT +#define GLEE_H_DEFINED_glMultiTexGenfEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLMULTITEXGENFEXTPROC GLeeFuncPtr_glMultiTexGenfEXT; + #define glMultiTexGenfEXT GLeeFuncPtr_glMultiTexGenfEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexGenfvEXT +#define GLEE_H_DEFINED_glMultiTexGenfvEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLMULTITEXGENFVEXTPROC GLeeFuncPtr_glMultiTexGenfvEXT; + #define glMultiTexGenfvEXT GLeeFuncPtr_glMultiTexGenfvEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexGeniEXT +#define GLEE_H_DEFINED_glMultiTexGeniEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLMULTITEXGENIEXTPROC GLeeFuncPtr_glMultiTexGeniEXT; + #define glMultiTexGeniEXT GLeeFuncPtr_glMultiTexGeniEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexGenivEXT +#define GLEE_H_DEFINED_glMultiTexGenivEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLMULTITEXGENIVEXTPROC GLeeFuncPtr_glMultiTexGenivEXT; + #define glMultiTexGenivEXT GLeeFuncPtr_glMultiTexGenivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexEnvfvEXT +#define GLEE_H_DEFINED_glGetMultiTexEnvfvEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXENVFVEXTPROC GLeeFuncPtr_glGetMultiTexEnvfvEXT; + #define glGetMultiTexEnvfvEXT GLeeFuncPtr_glGetMultiTexEnvfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexEnvivEXT +#define GLEE_H_DEFINED_glGetMultiTexEnvivEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXENVIVEXTPROC GLeeFuncPtr_glGetMultiTexEnvivEXT; + #define glGetMultiTexEnvivEXT GLeeFuncPtr_glGetMultiTexEnvivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexGendvEXT +#define GLEE_H_DEFINED_glGetMultiTexGendvEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXGENDVEXTPROC GLeeFuncPtr_glGetMultiTexGendvEXT; + #define glGetMultiTexGendvEXT GLeeFuncPtr_glGetMultiTexGendvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexGenfvEXT +#define GLEE_H_DEFINED_glGetMultiTexGenfvEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXGENFVEXTPROC GLeeFuncPtr_glGetMultiTexGenfvEXT; + #define glGetMultiTexGenfvEXT GLeeFuncPtr_glGetMultiTexGenfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexGenivEXT +#define GLEE_H_DEFINED_glGetMultiTexGenivEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXGENIVEXTPROC GLeeFuncPtr_glGetMultiTexGenivEXT; + #define glGetMultiTexGenivEXT GLeeFuncPtr_glGetMultiTexGenivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFloatIndexedvEXT +#define GLEE_H_DEFINED_glGetFloatIndexedvEXT + typedef void (APIENTRYP GLEEPFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat * data); + GLEE_EXTERN GLEEPFNGLGETFLOATINDEXEDVEXTPROC GLeeFuncPtr_glGetFloatIndexedvEXT; + #define glGetFloatIndexedvEXT GLeeFuncPtr_glGetFloatIndexedvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetDoubleIndexedvEXT +#define GLEE_H_DEFINED_glGetDoubleIndexedvEXT + typedef void (APIENTRYP GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble * data); + GLEE_EXTERN GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC GLeeFuncPtr_glGetDoubleIndexedvEXT; + #define glGetDoubleIndexedvEXT GLeeFuncPtr_glGetDoubleIndexedvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetPointerIndexedvEXT +#define GLEE_H_DEFINED_glGetPointerIndexedvEXT + typedef void (APIENTRYP GLEEPFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* * data); + GLEE_EXTERN GLEEPFNGLGETPOINTERINDEXEDVEXTPROC GLeeFuncPtr_glGetPointerIndexedvEXT; + #define glGetPointerIndexedvEXT GLeeFuncPtr_glGetPointerIndexedvEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedTextureImage3DEXT +#define GLEE_H_DEFINED_glCompressedTextureImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureImage3DEXT; + #define glCompressedTextureImage3DEXT GLeeFuncPtr_glCompressedTextureImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedTextureImage2DEXT +#define GLEE_H_DEFINED_glCompressedTextureImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureImage2DEXT; + #define glCompressedTextureImage2DEXT GLeeFuncPtr_glCompressedTextureImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedTextureImage1DEXT +#define GLEE_H_DEFINED_glCompressedTextureImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureImage1DEXT; + #define glCompressedTextureImage1DEXT GLeeFuncPtr_glCompressedTextureImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage3DEXT +#define GLEE_H_DEFINED_glCompressedTextureSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage3DEXT; + #define glCompressedTextureSubImage3DEXT GLeeFuncPtr_glCompressedTextureSubImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage2DEXT +#define GLEE_H_DEFINED_glCompressedTextureSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage2DEXT; + #define glCompressedTextureSubImage2DEXT GLeeFuncPtr_glCompressedTextureSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage1DEXT +#define GLEE_H_DEFINED_glCompressedTextureSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage1DEXT; + #define glCompressedTextureSubImage1DEXT GLeeFuncPtr_glCompressedTextureSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glGetCompressedTextureImageEXT +#define GLEE_H_DEFINED_glGetCompressedTextureImageEXT + typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid * img); + GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetCompressedTextureImageEXT; + #define glGetCompressedTextureImageEXT GLeeFuncPtr_glGetCompressedTextureImageEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage3DEXT +#define GLEE_H_DEFINED_glCompressedMultiTexImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage3DEXT; + #define glCompressedMultiTexImage3DEXT GLeeFuncPtr_glCompressedMultiTexImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage2DEXT +#define GLEE_H_DEFINED_glCompressedMultiTexImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage2DEXT; + #define glCompressedMultiTexImage2DEXT GLeeFuncPtr_glCompressedMultiTexImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage1DEXT +#define GLEE_H_DEFINED_glCompressedMultiTexImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage1DEXT; + #define glCompressedMultiTexImage1DEXT GLeeFuncPtr_glCompressedMultiTexImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage3DEXT +#define GLEE_H_DEFINED_glCompressedMultiTexSubImage3DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT; + #define glCompressedMultiTexSubImage3DEXT GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage2DEXT +#define GLEE_H_DEFINED_glCompressedMultiTexSubImage2DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT; + #define glCompressedMultiTexSubImage2DEXT GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT +#endif +#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage1DEXT +#define GLEE_H_DEFINED_glCompressedMultiTexSubImage1DEXT + typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits); + GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT; + #define glCompressedMultiTexSubImage1DEXT GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT +#endif +#ifndef GLEE_H_DEFINED_glGetCompressedMultiTexImageEXT +#define GLEE_H_DEFINED_glGetCompressedMultiTexImageEXT + typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid * img); + GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetCompressedMultiTexImageEXT; + #define glGetCompressedMultiTexImageEXT GLeeFuncPtr_glGetCompressedMultiTexImageEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramStringEXT +#define GLEE_H_DEFINED_glNamedProgramStringEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glNamedProgramStringEXT; + #define glNamedProgramStringEXT GLeeFuncPtr_glNamedProgramStringEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4dEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameter4dEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dEXT; + #define glNamedProgramLocalParameter4dEXT GLeeFuncPtr_glNamedProgramLocalParameter4dEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4dvEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameter4dvEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT; + #define glNamedProgramLocalParameter4dvEXT GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4fEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameter4fEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fEXT; + #define glNamedProgramLocalParameter4fEXT GLeeFuncPtr_glNamedProgramLocalParameter4fEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4fvEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameter4fvEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT; + #define glNamedProgramLocalParameter4fvEXT GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterdvEXT +#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterdvEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT; + #define glGetNamedProgramLocalParameterdvEXT GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterfvEXT +#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterfvEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT; + #define glGetNamedProgramLocalParameterfvEXT GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedProgramivEXT +#define GLEE_H_DEFINED_glGetNamedProgramivEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC GLeeFuncPtr_glGetNamedProgramivEXT; + #define glGetNamedProgramivEXT GLeeFuncPtr_glGetNamedProgramivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedProgramStringEXT +#define GLEE_H_DEFINED_glGetNamedProgramStringEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid * string); + GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glGetNamedProgramStringEXT; + #define glGetNamedProgramStringEXT GLeeFuncPtr_glGetNamedProgramStringEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameters4fvEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameters4fvEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT; + #define glNamedProgramLocalParameters4fvEXT GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4iEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4iEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT; + #define glNamedProgramLocalParameterI4iEXT GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4ivEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4ivEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT; + #define glNamedProgramLocalParameterI4ivEXT GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParametersI4ivEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParametersI4ivEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT; + #define glNamedProgramLocalParametersI4ivEXT GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4uiEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4uiEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT; + #define glNamedProgramLocalParameterI4uiEXT GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4uivEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4uivEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT; + #define glNamedProgramLocalParameterI4uivEXT GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedProgramLocalParametersI4uivEXT +#define GLEE_H_DEFINED_glNamedProgramLocalParametersI4uivEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params); + GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT; + #define glNamedProgramLocalParametersI4uivEXT GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterIivEXT +#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT; + #define glGetNamedProgramLocalParameterIivEXT GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterIuivEXT +#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT; + #define glGetNamedProgramLocalParameterIuivEXT GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureParameterIivEXT +#define GLEE_H_DEFINED_glTextureParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glTextureParameterIivEXT; + #define glTextureParameterIivEXT GLeeFuncPtr_glTextureParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureParameterIuivEXT +#define GLEE_H_DEFINED_glTextureParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint * params); + GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glTextureParameterIuivEXT; + #define glTextureParameterIuivEXT GLeeFuncPtr_glTextureParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureParameterIivEXT +#define GLEE_H_DEFINED_glGetTextureParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTextureParameterIivEXT; + #define glGetTextureParameterIivEXT GLeeFuncPtr_glGetTextureParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetTextureParameterIuivEXT +#define GLEE_H_DEFINED_glGetTextureParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTextureParameterIuivEXT; + #define glGetTextureParameterIuivEXT GLeeFuncPtr_glGetTextureParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexParameterIivEXT +#define GLEE_H_DEFINED_glMultiTexParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glMultiTexParameterIivEXT; + #define glMultiTexParameterIivEXT GLeeFuncPtr_glMultiTexParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexParameterIuivEXT +#define GLEE_H_DEFINED_glMultiTexParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint * params); + GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glMultiTexParameterIuivEXT; + #define glMultiTexParameterIuivEXT GLeeFuncPtr_glMultiTexParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexParameterIivEXT +#define GLEE_H_DEFINED_glGetMultiTexParameterIivEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIivEXT; + #define glGetMultiTexParameterIivEXT GLeeFuncPtr_glGetMultiTexParameterIivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetMultiTexParameterIuivEXT +#define GLEE_H_DEFINED_glGetMultiTexParameterIuivEXT + typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIuivEXT; + #define glGetMultiTexParameterIuivEXT GLeeFuncPtr_glGetMultiTexParameterIuivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform1fEXT +#define GLEE_H_DEFINED_glProgramUniform1fEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1FEXTPROC GLeeFuncPtr_glProgramUniform1fEXT; + #define glProgramUniform1fEXT GLeeFuncPtr_glProgramUniform1fEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform2fEXT +#define GLEE_H_DEFINED_glProgramUniform2fEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2FEXTPROC GLeeFuncPtr_glProgramUniform2fEXT; + #define glProgramUniform2fEXT GLeeFuncPtr_glProgramUniform2fEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform3fEXT +#define GLEE_H_DEFINED_glProgramUniform3fEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3FEXTPROC GLeeFuncPtr_glProgramUniform3fEXT; + #define glProgramUniform3fEXT GLeeFuncPtr_glProgramUniform3fEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform4fEXT +#define GLEE_H_DEFINED_glProgramUniform4fEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4FEXTPROC GLeeFuncPtr_glProgramUniform4fEXT; + #define glProgramUniform4fEXT GLeeFuncPtr_glProgramUniform4fEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform1iEXT +#define GLEE_H_DEFINED_glProgramUniform1iEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1IEXTPROC GLeeFuncPtr_glProgramUniform1iEXT; + #define glProgramUniform1iEXT GLeeFuncPtr_glProgramUniform1iEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform2iEXT +#define GLEE_H_DEFINED_glProgramUniform2iEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2IEXTPROC GLeeFuncPtr_glProgramUniform2iEXT; + #define glProgramUniform2iEXT GLeeFuncPtr_glProgramUniform2iEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform3iEXT +#define GLEE_H_DEFINED_glProgramUniform3iEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3IEXTPROC GLeeFuncPtr_glProgramUniform3iEXT; + #define glProgramUniform3iEXT GLeeFuncPtr_glProgramUniform3iEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform4iEXT +#define GLEE_H_DEFINED_glProgramUniform4iEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4IEXTPROC GLeeFuncPtr_glProgramUniform4iEXT; + #define glProgramUniform4iEXT GLeeFuncPtr_glProgramUniform4iEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform1fvEXT +#define GLEE_H_DEFINED_glProgramUniform1fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC GLeeFuncPtr_glProgramUniform1fvEXT; + #define glProgramUniform1fvEXT GLeeFuncPtr_glProgramUniform1fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform2fvEXT +#define GLEE_H_DEFINED_glProgramUniform2fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC GLeeFuncPtr_glProgramUniform2fvEXT; + #define glProgramUniform2fvEXT GLeeFuncPtr_glProgramUniform2fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform3fvEXT +#define GLEE_H_DEFINED_glProgramUniform3fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC GLeeFuncPtr_glProgramUniform3fvEXT; + #define glProgramUniform3fvEXT GLeeFuncPtr_glProgramUniform3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform4fvEXT +#define GLEE_H_DEFINED_glProgramUniform4fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC GLeeFuncPtr_glProgramUniform4fvEXT; + #define glProgramUniform4fvEXT GLeeFuncPtr_glProgramUniform4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform1ivEXT +#define GLEE_H_DEFINED_glProgramUniform1ivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC GLeeFuncPtr_glProgramUniform1ivEXT; + #define glProgramUniform1ivEXT GLeeFuncPtr_glProgramUniform1ivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform2ivEXT +#define GLEE_H_DEFINED_glProgramUniform2ivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC GLeeFuncPtr_glProgramUniform2ivEXT; + #define glProgramUniform2ivEXT GLeeFuncPtr_glProgramUniform2ivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform3ivEXT +#define GLEE_H_DEFINED_glProgramUniform3ivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC GLeeFuncPtr_glProgramUniform3ivEXT; + #define glProgramUniform3ivEXT GLeeFuncPtr_glProgramUniform3ivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform4ivEXT +#define GLEE_H_DEFINED_glProgramUniform4ivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC GLeeFuncPtr_glProgramUniform4ivEXT; + #define glProgramUniform4ivEXT GLeeFuncPtr_glProgramUniform4ivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix2fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2fvEXT; + #define glProgramUniformMatrix2fvEXT GLeeFuncPtr_glProgramUniformMatrix2fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix3fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3fvEXT; + #define glProgramUniformMatrix3fvEXT GLeeFuncPtr_glProgramUniformMatrix3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix4fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4fvEXT; + #define glProgramUniformMatrix4fvEXT GLeeFuncPtr_glProgramUniformMatrix4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2x3fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix2x3fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT; + #define glProgramUniformMatrix2x3fvEXT GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3x2fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix3x2fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT; + #define glProgramUniformMatrix3x2fvEXT GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2x4fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix2x4fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT; + #define glProgramUniformMatrix2x4fvEXT GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4x2fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix4x2fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT; + #define glProgramUniformMatrix4x2fvEXT GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3x4fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix3x4fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT; + #define glProgramUniformMatrix3x4fvEXT GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4x3fvEXT +#define GLEE_H_DEFINED_glProgramUniformMatrix4x3fvEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT; + #define glProgramUniformMatrix4x3fvEXT GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform1uiEXT +#define GLEE_H_DEFINED_glProgramUniform1uiEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC GLeeFuncPtr_glProgramUniform1uiEXT; + #define glProgramUniform1uiEXT GLeeFuncPtr_glProgramUniform1uiEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform2uiEXT +#define GLEE_H_DEFINED_glProgramUniform2uiEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC GLeeFuncPtr_glProgramUniform2uiEXT; + #define glProgramUniform2uiEXT GLeeFuncPtr_glProgramUniform2uiEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform3uiEXT +#define GLEE_H_DEFINED_glProgramUniform3uiEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC GLeeFuncPtr_glProgramUniform3uiEXT; + #define glProgramUniform3uiEXT GLeeFuncPtr_glProgramUniform3uiEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform4uiEXT +#define GLEE_H_DEFINED_glProgramUniform4uiEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC GLeeFuncPtr_glProgramUniform4uiEXT; + #define glProgramUniform4uiEXT GLeeFuncPtr_glProgramUniform4uiEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform1uivEXT +#define GLEE_H_DEFINED_glProgramUniform1uivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC GLeeFuncPtr_glProgramUniform1uivEXT; + #define glProgramUniform1uivEXT GLeeFuncPtr_glProgramUniform1uivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform2uivEXT +#define GLEE_H_DEFINED_glProgramUniform2uivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC GLeeFuncPtr_glProgramUniform2uivEXT; + #define glProgramUniform2uivEXT GLeeFuncPtr_glProgramUniform2uivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform3uivEXT +#define GLEE_H_DEFINED_glProgramUniform3uivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC GLeeFuncPtr_glProgramUniform3uivEXT; + #define glProgramUniform3uivEXT GLeeFuncPtr_glProgramUniform3uivEXT +#endif +#ifndef GLEE_H_DEFINED_glProgramUniform4uivEXT +#define GLEE_H_DEFINED_glProgramUniform4uivEXT + typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); + GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC GLeeFuncPtr_glProgramUniform4uivEXT; + #define glProgramUniform4uivEXT GLeeFuncPtr_glProgramUniform4uivEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedBufferDataEXT +#define GLEE_H_DEFINED_glNamedBufferDataEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage); + GLEE_EXTERN GLEEPFNGLNAMEDBUFFERDATAEXTPROC GLeeFuncPtr_glNamedBufferDataEXT; + #define glNamedBufferDataEXT GLeeFuncPtr_glNamedBufferDataEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedBufferSubDataEXT +#define GLEE_H_DEFINED_glNamedBufferSubDataEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data); + GLEE_EXTERN GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glNamedBufferSubDataEXT; + #define glNamedBufferSubDataEXT GLeeFuncPtr_glNamedBufferSubDataEXT +#endif +#ifndef GLEE_H_DEFINED_glMapNamedBufferEXT +#define GLEE_H_DEFINED_glMapNamedBufferEXT + typedef GLvoid* (APIENTRYP GLEEPFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); + GLEE_EXTERN GLEEPFNGLMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glMapNamedBufferEXT; + #define glMapNamedBufferEXT GLeeFuncPtr_glMapNamedBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glUnmapNamedBufferEXT +#define GLEE_H_DEFINED_glUnmapNamedBufferEXT + typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); + GLEE_EXTERN GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glUnmapNamedBufferEXT; + #define glUnmapNamedBufferEXT GLeeFuncPtr_glUnmapNamedBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedBufferParameterivEXT +#define GLEE_H_DEFINED_glGetNamedBufferParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedBufferParameterivEXT; + #define glGetNamedBufferParameterivEXT GLeeFuncPtr_glGetNamedBufferParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedBufferPointervEXT +#define GLEE_H_DEFINED_glGetNamedBufferPointervEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC GLeeFuncPtr_glGetNamedBufferPointervEXT; + #define glGetNamedBufferPointervEXT GLeeFuncPtr_glGetNamedBufferPointervEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedBufferSubDataEXT +#define GLEE_H_DEFINED_glGetNamedBufferSubDataEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data); + GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glGetNamedBufferSubDataEXT; + #define glGetNamedBufferSubDataEXT GLeeFuncPtr_glGetNamedBufferSubDataEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureBufferEXT +#define GLEE_H_DEFINED_glTextureBufferEXT + typedef void (APIENTRYP GLEEPFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); + GLEE_EXTERN GLEEPFNGLTEXTUREBUFFEREXTPROC GLeeFuncPtr_glTextureBufferEXT; + #define glTextureBufferEXT GLeeFuncPtr_glTextureBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexBufferEXT +#define GLEE_H_DEFINED_glMultiTexBufferEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); + GLEE_EXTERN GLEEPFNGLMULTITEXBUFFEREXTPROC GLeeFuncPtr_glMultiTexBufferEXT; + #define glMultiTexBufferEXT GLeeFuncPtr_glMultiTexBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageEXT +#define GLEE_H_DEFINED_glNamedRenderbufferStorageEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageEXT; + #define glNamedRenderbufferStorageEXT GLeeFuncPtr_glNamedRenderbufferStorageEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedRenderbufferParameterivEXT +#define GLEE_H_DEFINED_glGetNamedRenderbufferParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT; + #define glGetNamedRenderbufferParameterivEXT GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glCheckNamedFramebufferStatusEXT +#define GLEE_H_DEFINED_glCheckNamedFramebufferStatusEXT + typedef GLenum (APIENTRYP GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); + GLEE_EXTERN GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckNamedFramebufferStatusEXT; + #define glCheckNamedFramebufferStatusEXT GLeeFuncPtr_glCheckNamedFramebufferStatusEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture1DEXT +#define GLEE_H_DEFINED_glNamedFramebufferTexture1DEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture1DEXT; + #define glNamedFramebufferTexture1DEXT GLeeFuncPtr_glNamedFramebufferTexture1DEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture2DEXT +#define GLEE_H_DEFINED_glNamedFramebufferTexture2DEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture2DEXT; + #define glNamedFramebufferTexture2DEXT GLeeFuncPtr_glNamedFramebufferTexture2DEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture3DEXT +#define GLEE_H_DEFINED_glNamedFramebufferTexture3DEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture3DEXT; + #define glNamedFramebufferTexture3DEXT GLeeFuncPtr_glNamedFramebufferTexture3DEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferRenderbufferEXT +#define GLEE_H_DEFINED_glNamedFramebufferRenderbufferEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glNamedFramebufferRenderbufferEXT; + #define glNamedFramebufferRenderbufferEXT GLeeFuncPtr_glNamedFramebufferRenderbufferEXT +#endif +#ifndef GLEE_H_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT +#define GLEE_H_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT; + #define glGetNamedFramebufferAttachmentParameterivEXT GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glGenerateTextureMipmapEXT +#define GLEE_H_DEFINED_glGenerateTextureMipmapEXT + typedef void (APIENTRYP GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); + GLEE_EXTERN GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC GLeeFuncPtr_glGenerateTextureMipmapEXT; + #define glGenerateTextureMipmapEXT GLeeFuncPtr_glGenerateTextureMipmapEXT +#endif +#ifndef GLEE_H_DEFINED_glGenerateMultiTexMipmapEXT +#define GLEE_H_DEFINED_glGenerateMultiTexMipmapEXT + typedef void (APIENTRYP GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); + GLEE_EXTERN GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC GLeeFuncPtr_glGenerateMultiTexMipmapEXT; + #define glGenerateMultiTexMipmapEXT GLeeFuncPtr_glGenerateMultiTexMipmapEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferDrawBufferEXT +#define GLEE_H_DEFINED_glFramebufferDrawBufferEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC GLeeFuncPtr_glFramebufferDrawBufferEXT; + #define glFramebufferDrawBufferEXT GLeeFuncPtr_glFramebufferDrawBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferDrawBuffersEXT +#define GLEE_H_DEFINED_glFramebufferDrawBuffersEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum * bufs); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC GLeeFuncPtr_glFramebufferDrawBuffersEXT; + #define glFramebufferDrawBuffersEXT GLeeFuncPtr_glFramebufferDrawBuffersEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferReadBufferEXT +#define GLEE_H_DEFINED_glFramebufferReadBufferEXT + typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC GLeeFuncPtr_glFramebufferReadBufferEXT; + #define glFramebufferReadBufferEXT GLeeFuncPtr_glFramebufferReadBufferEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFramebufferParameterivEXT +#define GLEE_H_DEFINED_glGetFramebufferParameterivEXT + typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferParameterivEXT; + #define glGetFramebufferParameterivEXT GLeeFuncPtr_glGetFramebufferParameterivEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleEXT +#define GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT; + #define glNamedRenderbufferStorageMultisampleEXT GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT +#define GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT; + #define glNamedRenderbufferStorageMultisampleCoverageEXT GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureEXT +#define GLEE_H_DEFINED_glNamedFramebufferTextureEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glNamedFramebufferTextureEXT; + #define glNamedFramebufferTextureEXT GLeeFuncPtr_glNamedFramebufferTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureLayerEXT +#define GLEE_H_DEFINED_glNamedFramebufferTextureLayerEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glNamedFramebufferTextureLayerEXT; + #define glNamedFramebufferTextureLayerEXT GLeeFuncPtr_glNamedFramebufferTextureLayerEXT +#endif +#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureFaceEXT +#define GLEE_H_DEFINED_glNamedFramebufferTextureFaceEXT + typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); + GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glNamedFramebufferTextureFaceEXT; + #define glNamedFramebufferTextureFaceEXT GLeeFuncPtr_glNamedFramebufferTextureFaceEXT +#endif +#ifndef GLEE_H_DEFINED_glTextureRenderbufferEXT +#define GLEE_H_DEFINED_glTextureRenderbufferEXT + typedef void (APIENTRYP GLEEPFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLTEXTURERENDERBUFFEREXTPROC GLeeFuncPtr_glTextureRenderbufferEXT; + #define glTextureRenderbufferEXT GLeeFuncPtr_glTextureRenderbufferEXT +#endif +#ifndef GLEE_H_DEFINED_glMultiTexRenderbufferEXT +#define GLEE_H_DEFINED_glMultiTexRenderbufferEXT + typedef void (APIENTRYP GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC GLeeFuncPtr_glMultiTexRenderbufferEXT; + #define glMultiTexRenderbufferEXT GLeeFuncPtr_glMultiTexRenderbufferEXT +#endif +#endif + +/* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#define __GLEE_GL_EXT_vertex_array_bgra 1 +/* Constants */ +#endif + +/* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define __GLEE_GL_EXT_texture_swizzle 1 +/* Constants */ +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif + +/* GL_NV_explicit_multisample */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define __GLEE_GL_NV_explicit_multisample 1 +/* Constants */ +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#ifndef GLEE_H_DEFINED_glGetMultisamplefvNV +#define GLEE_H_DEFINED_glGetMultisamplefvNV + typedef void (APIENTRYP GLEEPFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat * val); + GLEE_EXTERN GLEEPFNGLGETMULTISAMPLEFVNVPROC GLeeFuncPtr_glGetMultisamplefvNV; + #define glGetMultisamplefvNV GLeeFuncPtr_glGetMultisamplefvNV +#endif +#ifndef GLEE_H_DEFINED_glSampleMaskIndexedNV +#define GLEE_H_DEFINED_glSampleMaskIndexedNV + typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); + GLEE_EXTERN GLEEPFNGLSAMPLEMASKINDEXEDNVPROC GLeeFuncPtr_glSampleMaskIndexedNV; + #define glSampleMaskIndexedNV GLeeFuncPtr_glSampleMaskIndexedNV +#endif +#ifndef GLEE_H_DEFINED_glTexRenderbufferNV +#define GLEE_H_DEFINED_glTexRenderbufferNV + typedef void (APIENTRYP GLEEPFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); + GLEE_EXTERN GLEEPFNGLTEXRENDERBUFFERNVPROC GLeeFuncPtr_glTexRenderbufferNV; + #define glTexRenderbufferNV GLeeFuncPtr_glTexRenderbufferNV +#endif +#endif + +/* GL_NV_transform_feedback2 */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define __GLEE_GL_NV_transform_feedback2 1 +/* Constants */ +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +#ifndef GLEE_H_DEFINED_glBindTransformFeedbackNV +#define GLEE_H_DEFINED_glBindTransformFeedbackNV + typedef void (APIENTRYP GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); + GLEE_EXTERN GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBindTransformFeedbackNV; + #define glBindTransformFeedbackNV GLeeFuncPtr_glBindTransformFeedbackNV +#endif +#ifndef GLEE_H_DEFINED_glDeleteTransformFeedbacksNV +#define GLEE_H_DEFINED_glDeleteTransformFeedbacksNV + typedef void (APIENTRYP GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint * ids); + GLEE_EXTERN GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glDeleteTransformFeedbacksNV; + #define glDeleteTransformFeedbacksNV GLeeFuncPtr_glDeleteTransformFeedbacksNV +#endif +#ifndef GLEE_H_DEFINED_glGenTransformFeedbacksNV +#define GLEE_H_DEFINED_glGenTransformFeedbacksNV + typedef void (APIENTRYP GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint * ids); + GLEE_EXTERN GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glGenTransformFeedbacksNV; + #define glGenTransformFeedbacksNV GLeeFuncPtr_glGenTransformFeedbacksNV +#endif +#ifndef GLEE_H_DEFINED_glIsTransformFeedbackNV +#define GLEE_H_DEFINED_glIsTransformFeedbackNV + typedef GLboolean (APIENTRYP GLEEPFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); + GLEE_EXTERN GLEEPFNGLISTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glIsTransformFeedbackNV; + #define glIsTransformFeedbackNV GLeeFuncPtr_glIsTransformFeedbackNV +#endif +#ifndef GLEE_H_DEFINED_glPauseTransformFeedbackNV +#define GLEE_H_DEFINED_glPauseTransformFeedbackNV + typedef void (APIENTRYP GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC) (); + GLEE_EXTERN GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glPauseTransformFeedbackNV; + #define glPauseTransformFeedbackNV GLeeFuncPtr_glPauseTransformFeedbackNV +#endif +#ifndef GLEE_H_DEFINED_glResumeTransformFeedbackNV +#define GLEE_H_DEFINED_glResumeTransformFeedbackNV + typedef void (APIENTRYP GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC) (); + GLEE_EXTERN GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glResumeTransformFeedbackNV; + #define glResumeTransformFeedbackNV GLeeFuncPtr_glResumeTransformFeedbackNV +#endif +#ifndef GLEE_H_DEFINED_glDrawTransformFeedbackNV +#define GLEE_H_DEFINED_glDrawTransformFeedbackNV + typedef void (APIENTRYP GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); + GLEE_EXTERN GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glDrawTransformFeedbackNV; + #define glDrawTransformFeedbackNV GLeeFuncPtr_glDrawTransformFeedbackNV +#endif +#endif + +/* GL_SGIX_texture_select */ + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#define __GLEE_GL_SGIX_texture_select 1 +/* Constants */ +#endif + +/* GL_INGR_blend_func_separate */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#define __GLEE_GL_INGR_blend_func_separate 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glBlendFuncSeparateINGR +#define GLEE_H_DEFINED_glBlendFuncSeparateINGR + typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEINGRPROC GLeeFuncPtr_glBlendFuncSeparateINGR; + #define glBlendFuncSeparateINGR GLeeFuncPtr_glBlendFuncSeparateINGR +#endif +#endif + +/* GL_SGIX_depth_pass_instrument */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#define __GLEE_GL_SGIX_depth_pass_instrument 1 +/* Constants */ +#endif + +/* GL_SGIX_igloo_interface */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#define __GLEE_GL_SGIX_igloo_interface 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glIglooInterfaceSGIX +#define GLEE_H_DEFINED_glIglooInterfaceSGIX + typedef void (APIENTRYP GLEEPFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid * params); + GLEE_EXTERN GLEEPFNGLIGLOOINTERFACESGIXPROC GLeeFuncPtr_glIglooInterfaceSGIX; + #define glIglooInterfaceSGIX GLeeFuncPtr_glIglooInterfaceSGIX +#endif +#endif + +/* GL_EXT_fragment_lighting */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 +#define __GLEE_GL_EXT_fragment_lighting 1 +/* Constants */ +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 +#ifndef GLEE_H_DEFINED_glFragmentLightModeliEXT +#define GLEE_H_DEFINED_glFragmentLightModeliEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC GLeeFuncPtr_glFragmentLightModeliEXT; + #define glFragmentLightModeliEXT GLeeFuncPtr_glFragmentLightModeliEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModelfEXT +#define GLEE_H_DEFINED_glFragmentLightModelfEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC GLeeFuncPtr_glFragmentLightModelfEXT; + #define glFragmentLightModelfEXT GLeeFuncPtr_glFragmentLightModelfEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModelivEXT +#define GLEE_H_DEFINED_glFragmentLightModelivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC GLeeFuncPtr_glFragmentLightModelivEXT; + #define glFragmentLightModelivEXT GLeeFuncPtr_glFragmentLightModelivEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightModelfvEXT +#define GLEE_H_DEFINED_glFragmentLightModelfvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC GLeeFuncPtr_glFragmentLightModelfvEXT; + #define glFragmentLightModelfvEXT GLeeFuncPtr_glFragmentLightModelfvEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightiEXT +#define GLEE_H_DEFINED_glFragmentLightiEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIEXTPROC GLeeFuncPtr_glFragmentLightiEXT; + #define glFragmentLightiEXT GLeeFuncPtr_glFragmentLightiEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightfEXT +#define GLEE_H_DEFINED_glFragmentLightfEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFEXTPROC GLeeFuncPtr_glFragmentLightfEXT; + #define glFragmentLightfEXT GLeeFuncPtr_glFragmentLightfEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightivEXT +#define GLEE_H_DEFINED_glFragmentLightivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glFragmentLightivEXT; + #define glFragmentLightivEXT GLeeFuncPtr_glFragmentLightivEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentLightfvEXT +#define GLEE_H_DEFINED_glFragmentLightfvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glFragmentLightfvEXT; + #define glFragmentLightfvEXT GLeeFuncPtr_glFragmentLightfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentLightivEXT +#define GLEE_H_DEFINED_glGetFragmentLightivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glGetFragmentLightivEXT; + #define glGetFragmentLightivEXT GLeeFuncPtr_glGetFragmentLightivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentLightfvEXT +#define GLEE_H_DEFINED_glGetFragmentLightfvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glGetFragmentLightfvEXT; + #define glGetFragmentLightfvEXT GLeeFuncPtr_glGetFragmentLightfvEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialfEXT +#define GLEE_H_DEFINED_glFragmentMaterialfEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFEXTPROC GLeeFuncPtr_glFragmentMaterialfEXT; + #define glFragmentMaterialfEXT GLeeFuncPtr_glFragmentMaterialfEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialiEXT +#define GLEE_H_DEFINED_glFragmentMaterialiEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIEXTPROC GLeeFuncPtr_glFragmentMaterialiEXT; + #define glFragmentMaterialiEXT GLeeFuncPtr_glFragmentMaterialiEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialfvEXT +#define GLEE_H_DEFINED_glFragmentMaterialfvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glFragmentMaterialfvEXT; + #define glFragmentMaterialfvEXT GLeeFuncPtr_glFragmentMaterialfvEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentMaterialivEXT +#define GLEE_H_DEFINED_glFragmentMaterialivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glFragmentMaterialivEXT; + #define glFragmentMaterialivEXT GLeeFuncPtr_glFragmentMaterialivEXT +#endif +#ifndef GLEE_H_DEFINED_glFragmentColorMaterialEXT +#define GLEE_H_DEFINED_glFragmentColorMaterialEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); + GLEE_EXTERN GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC GLeeFuncPtr_glFragmentColorMaterialEXT; + #define glFragmentColorMaterialEXT GLeeFuncPtr_glFragmentColorMaterialEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentMaterialfvEXT +#define GLEE_H_DEFINED_glGetFragmentMaterialfvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glGetFragmentMaterialfvEXT; + #define glGetFragmentMaterialfvEXT GLeeFuncPtr_glGetFragmentMaterialfvEXT +#endif +#ifndef GLEE_H_DEFINED_glGetFragmentMaterialivEXT +#define GLEE_H_DEFINED_glGetFragmentMaterialivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint * params); + GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glGetFragmentMaterialivEXT; + #define glGetFragmentMaterialivEXT GLeeFuncPtr_glGetFragmentMaterialivEXT +#endif +#ifndef GLEE_H_DEFINED_glLightEnviEXT +#define GLEE_H_DEFINED_glLightEnviEXT + typedef GLvoid (APIENTRYP GLEEPFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + GLEE_EXTERN GLEEPFNGLLIGHTENVIEXTPROC GLeeFuncPtr_glLightEnviEXT; + #define glLightEnviEXT GLeeFuncPtr_glLightEnviEXT +#endif +#endif + +/* GL_EXT_geometry_shader4 */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define __GLEE_GL_EXT_geometry_shader4 1 +/* Constants */ +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#ifndef GLEE_H_DEFINED_glProgramParameteriEXT +#define GLEE_H_DEFINED_glProgramParameteriEXT + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERIEXTPROC GLeeFuncPtr_glProgramParameteriEXT; + #define glProgramParameteriEXT GLeeFuncPtr_glProgramParameteriEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureEXT +#define GLEE_H_DEFINED_glFramebufferTextureEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT; + #define glFramebufferTextureEXT GLeeFuncPtr_glFramebufferTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerEXT +#define GLEE_H_DEFINED_glFramebufferTextureLayerEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT; + #define glFramebufferTextureLayerEXT GLeeFuncPtr_glFramebufferTextureLayerEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceEXT +#define GLEE_H_DEFINED_glFramebufferTextureFaceEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT; + #define glFramebufferTextureFaceEXT GLeeFuncPtr_glFramebufferTextureFaceEXT +#endif +#endif + +/* GL_EXT_scene_marker */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 +#define __GLEE_GL_EXT_scene_marker 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glBeginSceneEXT +#define GLEE_H_DEFINED_glBeginSceneEXT + typedef GLvoid (APIENTRYP GLEEPFNGLBEGINSCENEEXTPROC) (); + GLEE_EXTERN GLEEPFNGLBEGINSCENEEXTPROC GLeeFuncPtr_glBeginSceneEXT; + #define glBeginSceneEXT GLeeFuncPtr_glBeginSceneEXT +#endif +#ifndef GLEE_H_DEFINED_glEndSceneEXT +#define GLEE_H_DEFINED_glEndSceneEXT + typedef GLvoid (APIENTRYP GLEEPFNGLENDSCENEEXTPROC) (); + GLEE_EXTERN GLEEPFNGLENDSCENEEXTPROC GLeeFuncPtr_glEndSceneEXT; + #define glEndSceneEXT GLeeFuncPtr_glEndSceneEXT +#endif +#endif + +/* GL_EXT_texture_compression_dxt1 */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 +#define __GLEE_GL_EXT_texture_compression_dxt1 1 +/* Constants */ +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif + +/* GL_EXT_texture_env */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 +#define __GLEE_GL_EXT_texture_env 1 +/* Constants */ +#define GL_TEXTURE_ENV0_EXT 0 +#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 +#define GL_ENV_COPY_EXT 0 +#define GL_ENV_REPLACE_EXT 0 +#define GL_ENV_MODULATE_EXT 0 +#define GL_ENV_ADD_EXT 0 +#define GL_ENV_SUBTRACT_EXT 0 +#define GL_ENV_REVERSE_SUBTRACT_EXT 0 +#define GL_ENV_BLEND_EXT 0 +#define GL_ENV_REVERSE_BLEND_EXT 0 +#define GL_TEXTURE_ENV_SHIFT_EXT 0 +#endif + +/* GL_IBM_static_data */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define __GLEE_GL_IBM_static_data 1 +/* Constants */ +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +#endif + +/* GL_NV_gpu_program4 */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#define __GLEE_GL_NV_gpu_program4 1 +/* Constants */ +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4iNV +#define GLEE_H_DEFINED_glProgramLocalParameterI4iNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC GLeeFuncPtr_glProgramLocalParameterI4iNV; + #define glProgramLocalParameterI4iNV GLeeFuncPtr_glProgramLocalParameterI4iNV +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4ivNV +#define GLEE_H_DEFINED_glProgramLocalParameterI4ivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramLocalParameterI4ivNV; + #define glProgramLocalParameterI4ivNV GLeeFuncPtr_glProgramLocalParameterI4ivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParametersI4ivNV +#define GLEE_H_DEFINED_glProgramLocalParametersI4ivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramLocalParametersI4ivNV; + #define glProgramLocalParametersI4ivNV GLeeFuncPtr_glProgramLocalParametersI4ivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4uiNV +#define GLEE_H_DEFINED_glProgramLocalParameterI4uiNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC GLeeFuncPtr_glProgramLocalParameterI4uiNV; + #define glProgramLocalParameterI4uiNV GLeeFuncPtr_glProgramLocalParameterI4uiNV +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4uivNV +#define GLEE_H_DEFINED_glProgramLocalParameterI4uivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramLocalParameterI4uivNV; + #define glProgramLocalParameterI4uivNV GLeeFuncPtr_glProgramLocalParameterI4uivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramLocalParametersI4uivNV +#define GLEE_H_DEFINED_glProgramLocalParametersI4uivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramLocalParametersI4uivNV; + #define glProgramLocalParametersI4uivNV GLeeFuncPtr_glProgramLocalParametersI4uivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4iNV +#define GLEE_H_DEFINED_glProgramEnvParameterI4iNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC GLeeFuncPtr_glProgramEnvParameterI4iNV; + #define glProgramEnvParameterI4iNV GLeeFuncPtr_glProgramEnvParameterI4iNV +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4ivNV +#define GLEE_H_DEFINED_glProgramEnvParameterI4ivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramEnvParameterI4ivNV; + #define glProgramEnvParameterI4ivNV GLeeFuncPtr_glProgramEnvParameterI4ivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParametersI4ivNV +#define GLEE_H_DEFINED_glProgramEnvParametersI4ivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramEnvParametersI4ivNV; + #define glProgramEnvParametersI4ivNV GLeeFuncPtr_glProgramEnvParametersI4ivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4uiNV +#define GLEE_H_DEFINED_glProgramEnvParameterI4uiNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC GLeeFuncPtr_glProgramEnvParameterI4uiNV; + #define glProgramEnvParameterI4uiNV GLeeFuncPtr_glProgramEnvParameterI4uiNV +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4uivNV +#define GLEE_H_DEFINED_glProgramEnvParameterI4uivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramEnvParameterI4uivNV; + #define glProgramEnvParameterI4uivNV GLeeFuncPtr_glProgramEnvParameterI4uivNV +#endif +#ifndef GLEE_H_DEFINED_glProgramEnvParametersI4uivNV +#define GLEE_H_DEFINED_glProgramEnvParametersI4uivNV + typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params); + GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramEnvParametersI4uivNV; + #define glProgramEnvParametersI4uivNV GLeeFuncPtr_glProgramEnvParametersI4uivNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterIivNV +#define GLEE_H_DEFINED_glGetProgramLocalParameterIivNV + typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIivNV; + #define glGetProgramLocalParameterIivNV GLeeFuncPtr_glGetProgramLocalParameterIivNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterIuivNV +#define GLEE_H_DEFINED_glGetProgramLocalParameterIuivNV + typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIuivNV; + #define glGetProgramLocalParameterIuivNV GLeeFuncPtr_glGetProgramLocalParameterIuivNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterIivNV +#define GLEE_H_DEFINED_glGetProgramEnvParameterIivNV + typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIivNV; + #define glGetProgramEnvParameterIivNV GLeeFuncPtr_glGetProgramEnvParameterIivNV +#endif +#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterIuivNV +#define GLEE_H_DEFINED_glGetProgramEnvParameterIuivNV + typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIuivNV; + #define glGetProgramEnvParameterIuivNV GLeeFuncPtr_glGetProgramEnvParameterIuivNV +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureEXT +#define GLEE_H_DEFINED_glFramebufferTextureEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT; + #define glFramebufferTextureEXT GLeeFuncPtr_glFramebufferTextureEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerEXT +#define GLEE_H_DEFINED_glFramebufferTextureLayerEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT; + #define glFramebufferTextureLayerEXT GLeeFuncPtr_glFramebufferTextureLayerEXT +#endif +#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceEXT +#define GLEE_H_DEFINED_glFramebufferTextureFaceEXT + typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT; + #define glFramebufferTextureFaceEXT GLeeFuncPtr_glFramebufferTextureFaceEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2iEXT +#define GLEE_H_DEFINED_glVertexAttribI2iEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IEXTPROC GLeeFuncPtr_glVertexAttribI2iEXT; + #define glVertexAttribI2iEXT GLeeFuncPtr_glVertexAttribI2iEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3iEXT +#define GLEE_H_DEFINED_glVertexAttribI3iEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IEXTPROC GLeeFuncPtr_glVertexAttribI3iEXT; + #define glVertexAttribI3iEXT GLeeFuncPtr_glVertexAttribI3iEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4iEXT +#define GLEE_H_DEFINED_glVertexAttribI4iEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IEXTPROC GLeeFuncPtr_glVertexAttribI4iEXT; + #define glVertexAttribI4iEXT GLeeFuncPtr_glVertexAttribI4iEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1uiEXT +#define GLEE_H_DEFINED_glVertexAttribI1uiEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIEXTPROC GLeeFuncPtr_glVertexAttribI1uiEXT; + #define glVertexAttribI1uiEXT GLeeFuncPtr_glVertexAttribI1uiEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2uiEXT +#define GLEE_H_DEFINED_glVertexAttribI2uiEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIEXTPROC GLeeFuncPtr_glVertexAttribI2uiEXT; + #define glVertexAttribI2uiEXT GLeeFuncPtr_glVertexAttribI2uiEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3uiEXT +#define GLEE_H_DEFINED_glVertexAttribI3uiEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIEXTPROC GLeeFuncPtr_glVertexAttribI3uiEXT; + #define glVertexAttribI3uiEXT GLeeFuncPtr_glVertexAttribI3uiEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4uiEXT +#define GLEE_H_DEFINED_glVertexAttribI4uiEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIEXTPROC GLeeFuncPtr_glVertexAttribI4uiEXT; + #define glVertexAttribI4uiEXT GLeeFuncPtr_glVertexAttribI4uiEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1ivEXT +#define GLEE_H_DEFINED_glVertexAttribI1ivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IVEXTPROC GLeeFuncPtr_glVertexAttribI1ivEXT; + #define glVertexAttribI1ivEXT GLeeFuncPtr_glVertexAttribI1ivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2ivEXT +#define GLEE_H_DEFINED_glVertexAttribI2ivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IVEXTPROC GLeeFuncPtr_glVertexAttribI2ivEXT; + #define glVertexAttribI2ivEXT GLeeFuncPtr_glVertexAttribI2ivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3ivEXT +#define GLEE_H_DEFINED_glVertexAttribI3ivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IVEXTPROC GLeeFuncPtr_glVertexAttribI3ivEXT; + #define glVertexAttribI3ivEXT GLeeFuncPtr_glVertexAttribI3ivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4ivEXT +#define GLEE_H_DEFINED_glVertexAttribI4ivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IVEXTPROC GLeeFuncPtr_glVertexAttribI4ivEXT; + #define glVertexAttribI4ivEXT GLeeFuncPtr_glVertexAttribI4ivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI1uivEXT +#define GLEE_H_DEFINED_glVertexAttribI1uivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC GLeeFuncPtr_glVertexAttribI1uivEXT; + #define glVertexAttribI1uivEXT GLeeFuncPtr_glVertexAttribI1uivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI2uivEXT +#define GLEE_H_DEFINED_glVertexAttribI2uivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC GLeeFuncPtr_glVertexAttribI2uivEXT; + #define glVertexAttribI2uivEXT GLeeFuncPtr_glVertexAttribI2uivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI3uivEXT +#define GLEE_H_DEFINED_glVertexAttribI3uivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC GLeeFuncPtr_glVertexAttribI3uivEXT; + #define glVertexAttribI3uivEXT GLeeFuncPtr_glVertexAttribI3uivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4uivEXT +#define GLEE_H_DEFINED_glVertexAttribI4uivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC GLeeFuncPtr_glVertexAttribI4uivEXT; + #define glVertexAttribI4uivEXT GLeeFuncPtr_glVertexAttribI4uivEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4bvEXT +#define GLEE_H_DEFINED_glVertexAttribI4bvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4BVEXTPROC GLeeFuncPtr_glVertexAttribI4bvEXT; + #define glVertexAttribI4bvEXT GLeeFuncPtr_glVertexAttribI4bvEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4svEXT +#define GLEE_H_DEFINED_glVertexAttribI4svEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4SVEXTPROC GLeeFuncPtr_glVertexAttribI4svEXT; + #define glVertexAttribI4svEXT GLeeFuncPtr_glVertexAttribI4svEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4ubvEXT +#define GLEE_H_DEFINED_glVertexAttribI4ubvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC GLeeFuncPtr_glVertexAttribI4ubvEXT; + #define glVertexAttribI4ubvEXT GLeeFuncPtr_glVertexAttribI4ubvEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribI4usvEXT +#define GLEE_H_DEFINED_glVertexAttribI4usvEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort * v); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4USVEXTPROC GLeeFuncPtr_glVertexAttribI4usvEXT; + #define glVertexAttribI4usvEXT GLeeFuncPtr_glVertexAttribI4usvEXT +#endif +#ifndef GLEE_H_DEFINED_glVertexAttribIPointerEXT +#define GLEE_H_DEFINED_glVertexAttribIPointerEXT + typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); + GLEE_EXTERN GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC GLeeFuncPtr_glVertexAttribIPointerEXT; + #define glVertexAttribIPointerEXT GLeeFuncPtr_glVertexAttribIPointerEXT +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribIivEXT +#define GLEE_H_DEFINED_glGetVertexAttribIivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC GLeeFuncPtr_glGetVertexAttribIivEXT; + #define glGetVertexAttribIivEXT GLeeFuncPtr_glGetVertexAttribIivEXT +#endif +#ifndef GLEE_H_DEFINED_glGetVertexAttribIuivEXT +#define GLEE_H_DEFINED_glGetVertexAttribIuivEXT + typedef GLvoid (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint * params); + GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC GLeeFuncPtr_glGetVertexAttribIuivEXT; + #define glGetVertexAttribIuivEXT GLeeFuncPtr_glGetVertexAttribIuivEXT +#endif +#endif + +/* GL_OES_byte_coordinates */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +#define __GLEE_GL_OES_byte_coordinates 1 +/* Constants */ +#define GL_BYTE 0x1400 +#endif + +/* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define __GLEE_GL_OES_compressed_paletted_texture 1 +/* Constants */ +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif + +/* GL_OES_single_precision */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +#define __GLEE_GL_OES_single_precision 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glDepthRangefOES +#define GLEE_H_DEFINED_glDepthRangefOES + typedef GLvoid (APIENTRYP GLEEPFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); + GLEE_EXTERN GLEEPFNGLDEPTHRANGEFOESPROC GLeeFuncPtr_glDepthRangefOES; + #define glDepthRangefOES GLeeFuncPtr_glDepthRangefOES +#endif +#ifndef GLEE_H_DEFINED_glFrustumfOES +#define GLEE_H_DEFINED_glFrustumfOES + typedef GLvoid (APIENTRYP GLEEPFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + GLEE_EXTERN GLEEPFNGLFRUSTUMFOESPROC GLeeFuncPtr_glFrustumfOES; + #define glFrustumfOES GLeeFuncPtr_glFrustumfOES +#endif +#ifndef GLEE_H_DEFINED_glOrthofOES +#define GLEE_H_DEFINED_glOrthofOES + typedef GLvoid (APIENTRYP GLEEPFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + GLEE_EXTERN GLEEPFNGLORTHOFOESPROC GLeeFuncPtr_glOrthofOES; + #define glOrthofOES GLeeFuncPtr_glOrthofOES +#endif +#ifndef GLEE_H_DEFINED_glClipPlanefOES +#define GLEE_H_DEFINED_glClipPlanefOES + typedef GLvoid (APIENTRYP GLEEPFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); + GLEE_EXTERN GLEEPFNGLCLIPPLANEFOESPROC GLeeFuncPtr_glClipPlanefOES; + #define glClipPlanefOES GLeeFuncPtr_glClipPlanefOES +#endif +#ifndef GLEE_H_DEFINED_glGetClipPlanefOES +#define GLEE_H_DEFINED_glGetClipPlanefOES + typedef GLvoid (APIENTRYP GLEEPFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); + GLEE_EXTERN GLEEPFNGLGETCLIPPLANEFOESPROC GLeeFuncPtr_glGetClipPlanefOES; + #define glGetClipPlanefOES GLeeFuncPtr_glGetClipPlanefOES +#endif +#ifndef GLEE_H_DEFINED_glClearDepthfOES +#define GLEE_H_DEFINED_glClearDepthfOES + typedef GLvoid (APIENTRYP GLEEPFNGLCLEARDEPTHFOESPROC) (GLclampd depth); + GLEE_EXTERN GLEEPFNGLCLEARDEPTHFOESPROC GLeeFuncPtr_glClearDepthfOES; + #define glClearDepthfOES GLeeFuncPtr_glClearDepthfOES +#endif +#endif + +/* GL_SGIX_pixel_texture_bits */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 +#define __GLEE_GL_SGIX_pixel_texture_bits 1 +/* Constants */ +#endif + +/* GL_SGIX_texture_range */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 +#define __GLEE_GL_SGIX_texture_range 1 +/* Constants */ +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB +#endif + +/* WGL */ + +#ifdef WIN32 + +/* Extension querying variables */ + +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_buffer_region; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_multisample; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_extensions_string; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pixel_format; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_make_current_read; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pbuffer; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_render_texture; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pixel_format_float; +GLEE_EXTERN GLboolean _GLEE_WGL_ARB_create_context; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_make_current_read; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pixel_format; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pbuffer; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_depth_float; +GLEE_EXTERN GLboolean _GLEE_WGL_3DFX_multisample; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_multisample; +GLEE_EXTERN GLboolean _GLEE_WGL_I3D_digital_video_control; +GLEE_EXTERN GLboolean _GLEE_WGL_I3D_gamma; +GLEE_EXTERN GLboolean _GLEE_WGL_I3D_genlock; +GLEE_EXTERN GLboolean _GLEE_WGL_I3D_image_buffer; +GLEE_EXTERN GLboolean _GLEE_WGL_I3D_swap_frame_lock; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_render_depth_texture; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_render_texture_rectangle; +GLEE_EXTERN GLboolean _GLEE_WGL_ATI_pixel_format_float; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_float_buffer; +GLEE_EXTERN GLboolean _GLEE_WGL_3DL_stereo_control; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pixel_format_packed_float; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_framebuffer_sRGB; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_present_video; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_swap_group; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_gpu_affinity; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_display_color_table; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_extensions_string; +GLEE_EXTERN GLboolean _GLEE_WGL_EXT_swap_control; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_vertex_array_range; +GLEE_EXTERN GLboolean _GLEE_WGL_OML_sync_control; +GLEE_EXTERN GLboolean _GLEE_WGL_I3D_swap_frame_usage; +GLEE_EXTERN GLboolean _GLEE_WGL_NV_video_output; + +/* Aliases for extension querying variables */ + +#define GLEE_WGL_ARB_buffer_region GLeeEnabled(&_GLEE_WGL_ARB_buffer_region) +#define GLEE_WGL_ARB_multisample GLeeEnabled(&_GLEE_WGL_ARB_multisample) +#define GLEE_WGL_ARB_extensions_string GLeeEnabled(&_GLEE_WGL_ARB_extensions_string) +#define GLEE_WGL_ARB_pixel_format GLeeEnabled(&_GLEE_WGL_ARB_pixel_format) +#define GLEE_WGL_ARB_make_current_read GLeeEnabled(&_GLEE_WGL_ARB_make_current_read) +#define GLEE_WGL_ARB_pbuffer GLeeEnabled(&_GLEE_WGL_ARB_pbuffer) +#define GLEE_WGL_ARB_render_texture GLeeEnabled(&_GLEE_WGL_ARB_render_texture) +#define GLEE_WGL_ARB_pixel_format_float GLeeEnabled(&_GLEE_WGL_ARB_pixel_format_float) +#define GLEE_WGL_ARB_create_context GLeeEnabled(&_GLEE_WGL_ARB_create_context) +#define GLEE_WGL_EXT_make_current_read GLeeEnabled(&_GLEE_WGL_EXT_make_current_read) +#define GLEE_WGL_EXT_pixel_format GLeeEnabled(&_GLEE_WGL_EXT_pixel_format) +#define GLEE_WGL_EXT_pbuffer GLeeEnabled(&_GLEE_WGL_EXT_pbuffer) +#define GLEE_WGL_EXT_depth_float GLeeEnabled(&_GLEE_WGL_EXT_depth_float) +#define GLEE_WGL_3DFX_multisample GLeeEnabled(&_GLEE_WGL_3DFX_multisample) +#define GLEE_WGL_EXT_multisample GLeeEnabled(&_GLEE_WGL_EXT_multisample) +#define GLEE_WGL_I3D_digital_video_control GLeeEnabled(&_GLEE_WGL_I3D_digital_video_control) +#define GLEE_WGL_I3D_gamma GLeeEnabled(&_GLEE_WGL_I3D_gamma) +#define GLEE_WGL_I3D_genlock GLeeEnabled(&_GLEE_WGL_I3D_genlock) +#define GLEE_WGL_I3D_image_buffer GLeeEnabled(&_GLEE_WGL_I3D_image_buffer) +#define GLEE_WGL_I3D_swap_frame_lock GLeeEnabled(&_GLEE_WGL_I3D_swap_frame_lock) +#define GLEE_WGL_NV_render_depth_texture GLeeEnabled(&_GLEE_WGL_NV_render_depth_texture) +#define GLEE_WGL_NV_render_texture_rectangle GLeeEnabled(&_GLEE_WGL_NV_render_texture_rectangle) +#define GLEE_WGL_ATI_pixel_format_float GLeeEnabled(&_GLEE_WGL_ATI_pixel_format_float) +#define GLEE_WGL_NV_float_buffer GLeeEnabled(&_GLEE_WGL_NV_float_buffer) +#define GLEE_WGL_3DL_stereo_control GLeeEnabled(&_GLEE_WGL_3DL_stereo_control) +#define GLEE_WGL_EXT_pixel_format_packed_float GLeeEnabled(&_GLEE_WGL_EXT_pixel_format_packed_float) +#define GLEE_WGL_EXT_framebuffer_sRGB GLeeEnabled(&_GLEE_WGL_EXT_framebuffer_sRGB) +#define GLEE_WGL_NV_present_video GLeeEnabled(&_GLEE_WGL_NV_present_video) +#define GLEE_WGL_NV_swap_group GLeeEnabled(&_GLEE_WGL_NV_swap_group) +#define GLEE_WGL_NV_gpu_affinity GLeeEnabled(&_GLEE_WGL_NV_gpu_affinity) +#define GLEE_WGL_EXT_display_color_table GLeeEnabled(&_GLEE_WGL_EXT_display_color_table) +#define GLEE_WGL_EXT_extensions_string GLeeEnabled(&_GLEE_WGL_EXT_extensions_string) +#define GLEE_WGL_EXT_swap_control GLeeEnabled(&_GLEE_WGL_EXT_swap_control) +#define GLEE_WGL_NV_vertex_array_range GLeeEnabled(&_GLEE_WGL_NV_vertex_array_range) +#define GLEE_WGL_OML_sync_control GLeeEnabled(&_GLEE_WGL_OML_sync_control) +#define GLEE_WGL_I3D_swap_frame_usage GLeeEnabled(&_GLEE_WGL_I3D_swap_frame_usage) +#define GLEE_WGL_NV_video_output GLeeEnabled(&_GLEE_WGL_NV_video_output) + +/* WGL_ARB_buffer_region */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 +#define __GLEE_WGL_ARB_buffer_region 1 +/* Constants */ +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 +#ifndef GLEE_H_DEFINED_wglCreateBufferRegionARB +#define GLEE_H_DEFINED_wglCreateBufferRegionARB + typedef HANDLE (APIENTRYP GLEEPFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); + GLEE_EXTERN GLEEPFNWGLCREATEBUFFERREGIONARBPROC GLeeFuncPtr_wglCreateBufferRegionARB; + #define wglCreateBufferRegionARB GLeeFuncPtr_wglCreateBufferRegionARB +#endif +#ifndef GLEE_H_DEFINED_wglDeleteBufferRegionARB +#define GLEE_H_DEFINED_wglDeleteBufferRegionARB + typedef VOID (APIENTRYP GLEEPFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); + GLEE_EXTERN GLEEPFNWGLDELETEBUFFERREGIONARBPROC GLeeFuncPtr_wglDeleteBufferRegionARB; + #define wglDeleteBufferRegionARB GLeeFuncPtr_wglDeleteBufferRegionARB +#endif +#ifndef GLEE_H_DEFINED_wglSaveBufferRegionARB +#define GLEE_H_DEFINED_wglSaveBufferRegionARB + typedef BOOL (APIENTRYP GLEEPFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + GLEE_EXTERN GLEEPFNWGLSAVEBUFFERREGIONARBPROC GLeeFuncPtr_wglSaveBufferRegionARB; + #define wglSaveBufferRegionARB GLeeFuncPtr_wglSaveBufferRegionARB +#endif +#ifndef GLEE_H_DEFINED_wglRestoreBufferRegionARB +#define GLEE_H_DEFINED_wglRestoreBufferRegionARB + typedef BOOL (APIENTRYP GLEEPFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); + GLEE_EXTERN GLEEPFNWGLRESTOREBUFFERREGIONARBPROC GLeeFuncPtr_wglRestoreBufferRegionARB; + #define wglRestoreBufferRegionARB GLeeFuncPtr_wglRestoreBufferRegionARB +#endif +#endif + +/* WGL_ARB_multisample */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 +#define __GLEE_WGL_ARB_multisample 1 +/* Constants */ +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 +#endif + +/* WGL_ARB_extensions_string */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 +#define __GLEE_WGL_ARB_extensions_string 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglGetExtensionsStringARB +#define GLEE_H_DEFINED_wglGetExtensionsStringARB + typedef const char * (APIENTRYP GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + GLEE_EXTERN GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC GLeeFuncPtr_wglGetExtensionsStringARB; + #define wglGetExtensionsStringARB GLeeFuncPtr_wglGetExtensionsStringARB +#endif +#endif + +/* WGL_ARB_pixel_format */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 +#define __GLEE_WGL_ARB_pixel_format 1 +/* Constants */ +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribivARB +#define GLEE_H_DEFINED_wglGetPixelFormatAttribivARB + typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues); + GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribivARB; + #define wglGetPixelFormatAttribivARB GLeeFuncPtr_wglGetPixelFormatAttribivARB +#endif +#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribfvARB +#define GLEE_H_DEFINED_wglGetPixelFormatAttribfvARB + typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues); + GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribfvARB; + #define wglGetPixelFormatAttribfvARB GLeeFuncPtr_wglGetPixelFormatAttribfvARB +#endif +#ifndef GLEE_H_DEFINED_wglChoosePixelFormatARB +#define GLEE_H_DEFINED_wglChoosePixelFormatARB + typedef BOOL (APIENTRYP GLEEPFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats); + GLEE_EXTERN GLEEPFNWGLCHOOSEPIXELFORMATARBPROC GLeeFuncPtr_wglChoosePixelFormatARB; + #define wglChoosePixelFormatARB GLeeFuncPtr_wglChoosePixelFormatARB +#endif +#endif + +/* WGL_ARB_make_current_read */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 +#define __GLEE_WGL_ARB_make_current_read 1 +/* Constants */ +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 +#ifndef GLEE_H_DEFINED_wglMakeContextCurrentARB +#define GLEE_H_DEFINED_wglMakeContextCurrentARB + typedef BOOL (APIENTRYP GLEEPFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + GLEE_EXTERN GLEEPFNWGLMAKECONTEXTCURRENTARBPROC GLeeFuncPtr_wglMakeContextCurrentARB; + #define wglMakeContextCurrentARB GLeeFuncPtr_wglMakeContextCurrentARB +#endif +#ifndef GLEE_H_DEFINED_wglGetCurrentReadDCARB +#define GLEE_H_DEFINED_wglGetCurrentReadDCARB + typedef HDC (APIENTRYP GLEEPFNWGLGETCURRENTREADDCARBPROC) (); + GLEE_EXTERN GLEEPFNWGLGETCURRENTREADDCARBPROC GLeeFuncPtr_wglGetCurrentReadDCARB; + #define wglGetCurrentReadDCARB GLeeFuncPtr_wglGetCurrentReadDCARB +#endif +#endif + +/* WGL_ARB_pbuffer */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 +#define __GLEE_WGL_ARB_pbuffer 1 +/* Constants */ +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 +#ifndef GLEE_H_DEFINED_wglCreatePbufferARB +#define GLEE_H_DEFINED_wglCreatePbufferARB + typedef HPBUFFERARB (APIENTRYP GLEEPFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList); + GLEE_EXTERN GLEEPFNWGLCREATEPBUFFERARBPROC GLeeFuncPtr_wglCreatePbufferARB; + #define wglCreatePbufferARB GLeeFuncPtr_wglCreatePbufferARB +#endif +#ifndef GLEE_H_DEFINED_wglGetPbufferDCARB +#define GLEE_H_DEFINED_wglGetPbufferDCARB + typedef HDC (APIENTRYP GLEEPFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); + GLEE_EXTERN GLEEPFNWGLGETPBUFFERDCARBPROC GLeeFuncPtr_wglGetPbufferDCARB; + #define wglGetPbufferDCARB GLeeFuncPtr_wglGetPbufferDCARB +#endif +#ifndef GLEE_H_DEFINED_wglReleasePbufferDCARB +#define GLEE_H_DEFINED_wglReleasePbufferDCARB + typedef int (APIENTRYP GLEEPFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + GLEE_EXTERN GLEEPFNWGLRELEASEPBUFFERDCARBPROC GLeeFuncPtr_wglReleasePbufferDCARB; + #define wglReleasePbufferDCARB GLeeFuncPtr_wglReleasePbufferDCARB +#endif +#ifndef GLEE_H_DEFINED_wglDestroyPbufferARB +#define GLEE_H_DEFINED_wglDestroyPbufferARB + typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); + GLEE_EXTERN GLEEPFNWGLDESTROYPBUFFERARBPROC GLeeFuncPtr_wglDestroyPbufferARB; + #define wglDestroyPbufferARB GLeeFuncPtr_wglDestroyPbufferARB +#endif +#ifndef GLEE_H_DEFINED_wglQueryPbufferARB +#define GLEE_H_DEFINED_wglQueryPbufferARB + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int * piValue); + GLEE_EXTERN GLEEPFNWGLQUERYPBUFFERARBPROC GLeeFuncPtr_wglQueryPbufferARB; + #define wglQueryPbufferARB GLeeFuncPtr_wglQueryPbufferARB +#endif +#endif + +/* WGL_ARB_render_texture */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 +#define __GLEE_WGL_ARB_render_texture 1 +/* Constants */ +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 +#ifndef GLEE_H_DEFINED_wglBindTexImageARB +#define GLEE_H_DEFINED_wglBindTexImageARB + typedef BOOL (APIENTRYP GLEEPFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); + GLEE_EXTERN GLEEPFNWGLBINDTEXIMAGEARBPROC GLeeFuncPtr_wglBindTexImageARB; + #define wglBindTexImageARB GLeeFuncPtr_wglBindTexImageARB +#endif +#ifndef GLEE_H_DEFINED_wglReleaseTexImageARB +#define GLEE_H_DEFINED_wglReleaseTexImageARB + typedef BOOL (APIENTRYP GLEEPFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); + GLEE_EXTERN GLEEPFNWGLRELEASETEXIMAGEARBPROC GLeeFuncPtr_wglReleaseTexImageARB; + #define wglReleaseTexImageARB GLeeFuncPtr_wglReleaseTexImageARB +#endif +#ifndef GLEE_H_DEFINED_wglSetPbufferAttribARB +#define GLEE_H_DEFINED_wglSetPbufferAttribARB + typedef BOOL (APIENTRYP GLEEPFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList); + GLEE_EXTERN GLEEPFNWGLSETPBUFFERATTRIBARBPROC GLeeFuncPtr_wglSetPbufferAttribARB; + #define wglSetPbufferAttribARB GLeeFuncPtr_wglSetPbufferAttribARB +#endif +#endif + +/* WGL_ARB_pixel_format_float */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 +#define __GLEE_WGL_ARB_pixel_format_float 1 +/* Constants */ +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 +#endif + +/* WGL_ARB_create_context */ + +#ifndef WGL_ARB_create_context +#define WGL_ARB_create_context 1 +#define __GLEE_WGL_ARB_create_context 1 +/* Constants */ +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define ERROR_INVALID_VERSION_ARB 0x2095 +#ifndef GLEE_H_DEFINED_wglCreateContextAttribsARB +#define GLEE_H_DEFINED_wglCreateContextAttribsARB + typedef HGLRC (APIENTRYP GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int * attribList); + GLEE_EXTERN GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_wglCreateContextAttribsARB; + #define wglCreateContextAttribsARB GLeeFuncPtr_wglCreateContextAttribsARB +#endif +#endif + +/* WGL_EXT_make_current_read */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 +#define __GLEE_WGL_EXT_make_current_read 1 +/* Constants */ +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 +#ifndef GLEE_H_DEFINED_wglMakeContextCurrentEXT +#define GLEE_H_DEFINED_wglMakeContextCurrentEXT + typedef BOOL (APIENTRYP GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + GLEE_EXTERN GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC GLeeFuncPtr_wglMakeContextCurrentEXT; + #define wglMakeContextCurrentEXT GLeeFuncPtr_wglMakeContextCurrentEXT +#endif +#ifndef GLEE_H_DEFINED_wglGetCurrentReadDCEXT +#define GLEE_H_DEFINED_wglGetCurrentReadDCEXT + typedef HDC (APIENTRYP GLEEPFNWGLGETCURRENTREADDCEXTPROC) (); + GLEE_EXTERN GLEEPFNWGLGETCURRENTREADDCEXTPROC GLeeFuncPtr_wglGetCurrentReadDCEXT; + #define wglGetCurrentReadDCEXT GLeeFuncPtr_wglGetCurrentReadDCEXT +#endif +#endif + +/* WGL_EXT_pixel_format */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 +#define __GLEE_WGL_EXT_pixel_format 1 +/* Constants */ +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C +#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribivEXT +#define GLEE_H_DEFINED_wglGetPixelFormatAttribivEXT + typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, int * piValues); + GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribivEXT; + #define wglGetPixelFormatAttribivEXT GLeeFuncPtr_wglGetPixelFormatAttribivEXT +#endif +#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribfvEXT +#define GLEE_H_DEFINED_wglGetPixelFormatAttribfvEXT + typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, FLOAT * pfValues); + GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribfvEXT; + #define wglGetPixelFormatAttribfvEXT GLeeFuncPtr_wglGetPixelFormatAttribfvEXT +#endif +#ifndef GLEE_H_DEFINED_wglChoosePixelFormatEXT +#define GLEE_H_DEFINED_wglChoosePixelFormatEXT + typedef BOOL (APIENTRYP GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats); + GLEE_EXTERN GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC GLeeFuncPtr_wglChoosePixelFormatEXT; + #define wglChoosePixelFormatEXT GLeeFuncPtr_wglChoosePixelFormatEXT +#endif +#endif + +/* WGL_EXT_pbuffer */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 +#define __GLEE_WGL_EXT_pbuffer 1 +/* Constants */ +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 +#ifndef GLEE_H_DEFINED_wglCreatePbufferEXT +#define GLEE_H_DEFINED_wglCreatePbufferEXT + typedef HPBUFFEREXT (APIENTRYP GLEEPFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList); + GLEE_EXTERN GLEEPFNWGLCREATEPBUFFEREXTPROC GLeeFuncPtr_wglCreatePbufferEXT; + #define wglCreatePbufferEXT GLeeFuncPtr_wglCreatePbufferEXT +#endif +#ifndef GLEE_H_DEFINED_wglGetPbufferDCEXT +#define GLEE_H_DEFINED_wglGetPbufferDCEXT + typedef HDC (APIENTRYP GLEEPFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); + GLEE_EXTERN GLEEPFNWGLGETPBUFFERDCEXTPROC GLeeFuncPtr_wglGetPbufferDCEXT; + #define wglGetPbufferDCEXT GLeeFuncPtr_wglGetPbufferDCEXT +#endif +#ifndef GLEE_H_DEFINED_wglReleasePbufferDCEXT +#define GLEE_H_DEFINED_wglReleasePbufferDCEXT + typedef int (APIENTRYP GLEEPFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + GLEE_EXTERN GLEEPFNWGLRELEASEPBUFFERDCEXTPROC GLeeFuncPtr_wglReleasePbufferDCEXT; + #define wglReleasePbufferDCEXT GLeeFuncPtr_wglReleasePbufferDCEXT +#endif +#ifndef GLEE_H_DEFINED_wglDestroyPbufferEXT +#define GLEE_H_DEFINED_wglDestroyPbufferEXT + typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); + GLEE_EXTERN GLEEPFNWGLDESTROYPBUFFEREXTPROC GLeeFuncPtr_wglDestroyPbufferEXT; + #define wglDestroyPbufferEXT GLeeFuncPtr_wglDestroyPbufferEXT +#endif +#ifndef GLEE_H_DEFINED_wglQueryPbufferEXT +#define GLEE_H_DEFINED_wglQueryPbufferEXT + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int * piValue); + GLEE_EXTERN GLEEPFNWGLQUERYPBUFFEREXTPROC GLeeFuncPtr_wglQueryPbufferEXT; + #define wglQueryPbufferEXT GLeeFuncPtr_wglQueryPbufferEXT +#endif +#endif + +/* WGL_EXT_depth_float */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 +#define __GLEE_WGL_EXT_depth_float 1 +/* Constants */ +#define WGL_DEPTH_FLOAT_EXT 0x2040 +#endif + +/* WGL_3DFX_multisample */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 +#define __GLEE_WGL_3DFX_multisample 1 +/* Constants */ +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 +#endif + +/* WGL_EXT_multisample */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 +#define __GLEE_WGL_EXT_multisample 1 +/* Constants */ +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 +#endif + +/* WGL_I3D_digital_video_control */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 +#define __GLEE_WGL_I3D_digital_video_control 1 +/* Constants */ +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 +#ifndef GLEE_H_DEFINED_wglGetDigitalVideoParametersI3D +#define GLEE_H_DEFINED_wglGetDigitalVideoParametersI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int * piValue); + GLEE_EXTERN GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglGetDigitalVideoParametersI3D; + #define wglGetDigitalVideoParametersI3D GLeeFuncPtr_wglGetDigitalVideoParametersI3D +#endif +#ifndef GLEE_H_DEFINED_wglSetDigitalVideoParametersI3D +#define GLEE_H_DEFINED_wglSetDigitalVideoParametersI3D + typedef BOOL (APIENTRYP GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int * piValue); + GLEE_EXTERN GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglSetDigitalVideoParametersI3D; + #define wglSetDigitalVideoParametersI3D GLeeFuncPtr_wglSetDigitalVideoParametersI3D +#endif +#endif + +/* WGL_I3D_gamma */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 +#define __GLEE_WGL_I3D_gamma 1 +/* Constants */ +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F +#ifndef GLEE_H_DEFINED_wglGetGammaTableParametersI3D +#define GLEE_H_DEFINED_wglGetGammaTableParametersI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int * piValue); + GLEE_EXTERN GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglGetGammaTableParametersI3D; + #define wglGetGammaTableParametersI3D GLeeFuncPtr_wglGetGammaTableParametersI3D +#endif +#ifndef GLEE_H_DEFINED_wglSetGammaTableParametersI3D +#define GLEE_H_DEFINED_wglSetGammaTableParametersI3D + typedef BOOL (APIENTRYP GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int * piValue); + GLEE_EXTERN GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglSetGammaTableParametersI3D; + #define wglSetGammaTableParametersI3D GLeeFuncPtr_wglSetGammaTableParametersI3D +#endif +#ifndef GLEE_H_DEFINED_wglGetGammaTableI3D +#define GLEE_H_DEFINED_wglGetGammaTableI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT * puRed, USHORT * puGreen, USHORT * puBlue); + GLEE_EXTERN GLEEPFNWGLGETGAMMATABLEI3DPROC GLeeFuncPtr_wglGetGammaTableI3D; + #define wglGetGammaTableI3D GLeeFuncPtr_wglGetGammaTableI3D +#endif +#ifndef GLEE_H_DEFINED_wglSetGammaTableI3D +#define GLEE_H_DEFINED_wglSetGammaTableI3D + typedef BOOL (APIENTRYP GLEEPFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT * puRed, const USHORT * puGreen, const USHORT * puBlue); + GLEE_EXTERN GLEEPFNWGLSETGAMMATABLEI3DPROC GLeeFuncPtr_wglSetGammaTableI3D; + #define wglSetGammaTableI3D GLeeFuncPtr_wglSetGammaTableI3D +#endif +#endif + +/* WGL_I3D_genlock */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 +#define __GLEE_WGL_I3D_genlock 1 +/* Constants */ +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C +#ifndef GLEE_H_DEFINED_wglEnableGenlockI3D +#define GLEE_H_DEFINED_wglEnableGenlockI3D + typedef BOOL (APIENTRYP GLEEPFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); + GLEE_EXTERN GLEEPFNWGLENABLEGENLOCKI3DPROC GLeeFuncPtr_wglEnableGenlockI3D; + #define wglEnableGenlockI3D GLeeFuncPtr_wglEnableGenlockI3D +#endif +#ifndef GLEE_H_DEFINED_wglDisableGenlockI3D +#define GLEE_H_DEFINED_wglDisableGenlockI3D + typedef BOOL (APIENTRYP GLEEPFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); + GLEE_EXTERN GLEEPFNWGLDISABLEGENLOCKI3DPROC GLeeFuncPtr_wglDisableGenlockI3D; + #define wglDisableGenlockI3D GLeeFuncPtr_wglDisableGenlockI3D +#endif +#ifndef GLEE_H_DEFINED_wglIsEnabledGenlockI3D +#define GLEE_H_DEFINED_wglIsEnabledGenlockI3D + typedef BOOL (APIENTRYP GLEEPFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL * pFlag); + GLEE_EXTERN GLEEPFNWGLISENABLEDGENLOCKI3DPROC GLeeFuncPtr_wglIsEnabledGenlockI3D; + #define wglIsEnabledGenlockI3D GLeeFuncPtr_wglIsEnabledGenlockI3D +#endif +#ifndef GLEE_H_DEFINED_wglGenlockSourceI3D +#define GLEE_H_DEFINED_wglGenlockSourceI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); + GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGenlockSourceI3D; + #define wglGenlockSourceI3D GLeeFuncPtr_wglGenlockSourceI3D +#endif +#ifndef GLEE_H_DEFINED_wglGetGenlockSourceI3D +#define GLEE_H_DEFINED_wglGetGenlockSourceI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT * uSource); + GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGetGenlockSourceI3D; + #define wglGetGenlockSourceI3D GLeeFuncPtr_wglGetGenlockSourceI3D +#endif +#ifndef GLEE_H_DEFINED_wglGenlockSourceEdgeI3D +#define GLEE_H_DEFINED_wglGenlockSourceEdgeI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); + GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGenlockSourceEdgeI3D; + #define wglGenlockSourceEdgeI3D GLeeFuncPtr_wglGenlockSourceEdgeI3D +#endif +#ifndef GLEE_H_DEFINED_wglGetGenlockSourceEdgeI3D +#define GLEE_H_DEFINED_wglGetGenlockSourceEdgeI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT * uEdge); + GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGetGenlockSourceEdgeI3D; + #define wglGetGenlockSourceEdgeI3D GLeeFuncPtr_wglGetGenlockSourceEdgeI3D +#endif +#ifndef GLEE_H_DEFINED_wglGenlockSampleRateI3D +#define GLEE_H_DEFINED_wglGenlockSampleRateI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); + GLEE_EXTERN GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGenlockSampleRateI3D; + #define wglGenlockSampleRateI3D GLeeFuncPtr_wglGenlockSampleRateI3D +#endif +#ifndef GLEE_H_DEFINED_wglGetGenlockSampleRateI3D +#define GLEE_H_DEFINED_wglGetGenlockSampleRateI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT * uRate); + GLEE_EXTERN GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGetGenlockSampleRateI3D; + #define wglGetGenlockSampleRateI3D GLeeFuncPtr_wglGetGenlockSampleRateI3D +#endif +#ifndef GLEE_H_DEFINED_wglGenlockSourceDelayI3D +#define GLEE_H_DEFINED_wglGenlockSourceDelayI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); + GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGenlockSourceDelayI3D; + #define wglGenlockSourceDelayI3D GLeeFuncPtr_wglGenlockSourceDelayI3D +#endif +#ifndef GLEE_H_DEFINED_wglGetGenlockSourceDelayI3D +#define GLEE_H_DEFINED_wglGetGenlockSourceDelayI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT * uDelay); + GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGetGenlockSourceDelayI3D; + #define wglGetGenlockSourceDelayI3D GLeeFuncPtr_wglGetGenlockSourceDelayI3D +#endif +#ifndef GLEE_H_DEFINED_wglQueryGenlockMaxSourceDelayI3D +#define GLEE_H_DEFINED_wglQueryGenlockMaxSourceDelayI3D + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT * uMaxLineDelay, UINT * uMaxPixelDelay); + GLEE_EXTERN GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D; + #define wglQueryGenlockMaxSourceDelayI3D GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D +#endif +#endif + +/* WGL_I3D_image_buffer */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 +#define __GLEE_WGL_I3D_image_buffer 1 +/* Constants */ +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 +#ifndef GLEE_H_DEFINED_wglCreateImageBufferI3D +#define GLEE_H_DEFINED_wglCreateImageBufferI3D + typedef LPVOID (APIENTRYP GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); + GLEE_EXTERN GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC GLeeFuncPtr_wglCreateImageBufferI3D; + #define wglCreateImageBufferI3D GLeeFuncPtr_wglCreateImageBufferI3D +#endif +#ifndef GLEE_H_DEFINED_wglDestroyImageBufferI3D +#define GLEE_H_DEFINED_wglDestroyImageBufferI3D + typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); + GLEE_EXTERN GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC GLeeFuncPtr_wglDestroyImageBufferI3D; + #define wglDestroyImageBufferI3D GLeeFuncPtr_wglDestroyImageBufferI3D +#endif +#ifndef GLEE_H_DEFINED_wglAssociateImageBufferEventsI3D +#define GLEE_H_DEFINED_wglAssociateImageBufferEventsI3D + typedef BOOL (APIENTRYP GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE * pEvent, const LPVOID * pAddress, const DWORD * pSize, UINT count); + GLEE_EXTERN GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglAssociateImageBufferEventsI3D; + #define wglAssociateImageBufferEventsI3D GLeeFuncPtr_wglAssociateImageBufferEventsI3D +#endif +#ifndef GLEE_H_DEFINED_wglReleaseImageBufferEventsI3D +#define GLEE_H_DEFINED_wglReleaseImageBufferEventsI3D + typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID * pAddress, UINT count); + GLEE_EXTERN GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglReleaseImageBufferEventsI3D; + #define wglReleaseImageBufferEventsI3D GLeeFuncPtr_wglReleaseImageBufferEventsI3D +#endif +#endif + +/* WGL_I3D_swap_frame_lock */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 +#define __GLEE_WGL_I3D_swap_frame_lock 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglEnableFrameLockI3D +#define GLEE_H_DEFINED_wglEnableFrameLockI3D + typedef BOOL (APIENTRYP GLEEPFNWGLENABLEFRAMELOCKI3DPROC) (); + GLEE_EXTERN GLEEPFNWGLENABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglEnableFrameLockI3D; + #define wglEnableFrameLockI3D GLeeFuncPtr_wglEnableFrameLockI3D +#endif +#ifndef GLEE_H_DEFINED_wglDisableFrameLockI3D +#define GLEE_H_DEFINED_wglDisableFrameLockI3D + typedef BOOL (APIENTRYP GLEEPFNWGLDISABLEFRAMELOCKI3DPROC) (); + GLEE_EXTERN GLEEPFNWGLDISABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglDisableFrameLockI3D; + #define wglDisableFrameLockI3D GLeeFuncPtr_wglDisableFrameLockI3D +#endif +#ifndef GLEE_H_DEFINED_wglIsEnabledFrameLockI3D +#define GLEE_H_DEFINED_wglIsEnabledFrameLockI3D + typedef BOOL (APIENTRYP GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL * pFlag); + GLEE_EXTERN GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC GLeeFuncPtr_wglIsEnabledFrameLockI3D; + #define wglIsEnabledFrameLockI3D GLeeFuncPtr_wglIsEnabledFrameLockI3D +#endif +#ifndef GLEE_H_DEFINED_wglQueryFrameLockMasterI3D +#define GLEE_H_DEFINED_wglQueryFrameLockMasterI3D + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL * pFlag); + GLEE_EXTERN GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC GLeeFuncPtr_wglQueryFrameLockMasterI3D; + #define wglQueryFrameLockMasterI3D GLeeFuncPtr_wglQueryFrameLockMasterI3D +#endif +#endif + +/* WGL_NV_render_depth_texture */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 +#define __GLEE_WGL_NV_render_depth_texture 1 +/* Constants */ +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 +#endif + +/* WGL_NV_render_texture_rectangle */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 +#define __GLEE_WGL_NV_render_texture_rectangle 1 +/* Constants */ +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 +#endif + +/* WGL_ATI_pixel_format_float */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 +#define __GLEE_WGL_ATI_pixel_format_float 1 +/* Constants */ +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#endif + +/* WGL_NV_float_buffer */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 +#define __GLEE_WGL_NV_float_buffer 1 +/* Constants */ +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 +#endif + +/* WGL_3DL_stereo_control */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 +#define __GLEE_WGL_3DL_stereo_control 1 +/* Constants */ +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 +#endif + +/* WGL_EXT_pixel_format_packed_float */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 +#define __GLEE_WGL_EXT_pixel_format_packed_float 1 +/* Constants */ +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 +#endif + +/* WGL_EXT_framebuffer_sRGB */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 +#define __GLEE_WGL_EXT_framebuffer_sRGB 1 +/* Constants */ +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 +#endif + +/* WGL_NV_present_video */ + +#ifndef WGL_NV_present_video +#define WGL_NV_present_video 1 +#define __GLEE_WGL_NV_present_video 1 +/* Constants */ +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 +#ifndef GLEE_H_DEFINED_wglEnumerateVideoDevicesNV +#define GLEE_H_DEFINED_wglEnumerateVideoDevicesNV + typedef int (APIENTRYP GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV * phDeviceList); + GLEE_EXTERN GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC GLeeFuncPtr_wglEnumerateVideoDevicesNV; + #define wglEnumerateVideoDevicesNV GLeeFuncPtr_wglEnumerateVideoDevicesNV +#endif +#ifndef GLEE_H_DEFINED_wglBindVideoDeviceNV +#define GLEE_H_DEFINED_wglBindVideoDeviceNV + typedef BOOL (APIENTRYP GLEEPFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList); + GLEE_EXTERN GLEEPFNWGLBINDVIDEODEVICENVPROC GLeeFuncPtr_wglBindVideoDeviceNV; + #define wglBindVideoDeviceNV GLeeFuncPtr_wglBindVideoDeviceNV +#endif +#ifndef GLEE_H_DEFINED_wglQueryCurrentContextNV +#define GLEE_H_DEFINED_wglQueryCurrentContextNV + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int * piValue); + GLEE_EXTERN GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC GLeeFuncPtr_wglQueryCurrentContextNV; + #define wglQueryCurrentContextNV GLeeFuncPtr_wglQueryCurrentContextNV +#endif +#endif + +/* WGL_NV_swap_group */ + +#ifndef WGL_NV_swap_group +#define WGL_NV_swap_group 1 +#define __GLEE_WGL_NV_swap_group 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglJoinSwapGroupNV +#define GLEE_H_DEFINED_wglJoinSwapGroupNV + typedef BOOL (APIENTRYP GLEEPFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); + GLEE_EXTERN GLEEPFNWGLJOINSWAPGROUPNVPROC GLeeFuncPtr_wglJoinSwapGroupNV; + #define wglJoinSwapGroupNV GLeeFuncPtr_wglJoinSwapGroupNV +#endif +#ifndef GLEE_H_DEFINED_wglBindSwapBarrierNV +#define GLEE_H_DEFINED_wglBindSwapBarrierNV + typedef BOOL (APIENTRYP GLEEPFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); + GLEE_EXTERN GLEEPFNWGLBINDSWAPBARRIERNVPROC GLeeFuncPtr_wglBindSwapBarrierNV; + #define wglBindSwapBarrierNV GLeeFuncPtr_wglBindSwapBarrierNV +#endif +#ifndef GLEE_H_DEFINED_wglQuerySwapGroupNV +#define GLEE_H_DEFINED_wglQuerySwapGroupNV + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint * group, GLuint * barrier); + GLEE_EXTERN GLEEPFNWGLQUERYSWAPGROUPNVPROC GLeeFuncPtr_wglQuerySwapGroupNV; + #define wglQuerySwapGroupNV GLeeFuncPtr_wglQuerySwapGroupNV +#endif +#ifndef GLEE_H_DEFINED_wglQueryMaxSwapGroupsNV +#define GLEE_H_DEFINED_wglQueryMaxSwapGroupsNV + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint * maxGroups, GLuint * maxBarriers); + GLEE_EXTERN GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC GLeeFuncPtr_wglQueryMaxSwapGroupsNV; + #define wglQueryMaxSwapGroupsNV GLeeFuncPtr_wglQueryMaxSwapGroupsNV +#endif +#ifndef GLEE_H_DEFINED_wglQueryFrameCountNV +#define GLEE_H_DEFINED_wglQueryFrameCountNV + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint * count); + GLEE_EXTERN GLEEPFNWGLQUERYFRAMECOUNTNVPROC GLeeFuncPtr_wglQueryFrameCountNV; + #define wglQueryFrameCountNV GLeeFuncPtr_wglQueryFrameCountNV +#endif +#ifndef GLEE_H_DEFINED_wglResetFrameCountNV +#define GLEE_H_DEFINED_wglResetFrameCountNV + typedef BOOL (APIENTRYP GLEEPFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); + GLEE_EXTERN GLEEPFNWGLRESETFRAMECOUNTNVPROC GLeeFuncPtr_wglResetFrameCountNV; + #define wglResetFrameCountNV GLeeFuncPtr_wglResetFrameCountNV +#endif +#endif + +/* WGL_NV_gpu_affinity */ + +#ifndef WGL_NV_gpu_affinity +#define WGL_NV_gpu_affinity 1 +#define __GLEE_WGL_NV_gpu_affinity 1 +/* Constants */ +#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 +#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 +#ifndef GLEE_H_DEFINED_wglEnumGpusNV +#define GLEE_H_DEFINED_wglEnumGpusNV + typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV * phGpu); + GLEE_EXTERN GLEEPFNWGLENUMGPUSNVPROC GLeeFuncPtr_wglEnumGpusNV; + #define wglEnumGpusNV GLeeFuncPtr_wglEnumGpusNV +#endif +#ifndef GLEE_H_DEFINED_wglEnumGpuDevicesNV +#define GLEE_H_DEFINED_wglEnumGpuDevicesNV + typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); + GLEE_EXTERN GLEEPFNWGLENUMGPUDEVICESNVPROC GLeeFuncPtr_wglEnumGpuDevicesNV; + #define wglEnumGpuDevicesNV GLeeFuncPtr_wglEnumGpuDevicesNV +#endif +#ifndef GLEE_H_DEFINED_wglCreateAffinityDCNV +#define GLEE_H_DEFINED_wglCreateAffinityDCNV + typedef HDC (APIENTRYP GLEEPFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV * phGpuList); + GLEE_EXTERN GLEEPFNWGLCREATEAFFINITYDCNVPROC GLeeFuncPtr_wglCreateAffinityDCNV; + #define wglCreateAffinityDCNV GLeeFuncPtr_wglCreateAffinityDCNV +#endif +#ifndef GLEE_H_DEFINED_wglEnumGpusFromAffinityDCNV +#define GLEE_H_DEFINED_wglEnumGpusFromAffinityDCNV + typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV * hGpu); + GLEE_EXTERN GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC GLeeFuncPtr_wglEnumGpusFromAffinityDCNV; + #define wglEnumGpusFromAffinityDCNV GLeeFuncPtr_wglEnumGpusFromAffinityDCNV +#endif +#ifndef GLEE_H_DEFINED_wglDeleteDCNV +#define GLEE_H_DEFINED_wglDeleteDCNV + typedef BOOL (APIENTRYP GLEEPFNWGLDELETEDCNVPROC) (HDC hdc); + GLEE_EXTERN GLEEPFNWGLDELETEDCNVPROC GLeeFuncPtr_wglDeleteDCNV; + #define wglDeleteDCNV GLeeFuncPtr_wglDeleteDCNV +#endif +#endif + +/* WGL_EXT_display_color_table */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 +#define __GLEE_WGL_EXT_display_color_table 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglCreateDisplayColorTableEXT +#define GLEE_H_DEFINED_wglCreateDisplayColorTableEXT + typedef GLboolean (APIENTRYP GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); + GLEE_EXTERN GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglCreateDisplayColorTableEXT; + #define wglCreateDisplayColorTableEXT GLeeFuncPtr_wglCreateDisplayColorTableEXT +#endif +#ifndef GLEE_H_DEFINED_wglLoadDisplayColorTableEXT +#define GLEE_H_DEFINED_wglLoadDisplayColorTableEXT + typedef GLboolean (APIENTRYP GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort * table, GLuint length); + GLEE_EXTERN GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglLoadDisplayColorTableEXT; + #define wglLoadDisplayColorTableEXT GLeeFuncPtr_wglLoadDisplayColorTableEXT +#endif +#ifndef GLEE_H_DEFINED_wglBindDisplayColorTableEXT +#define GLEE_H_DEFINED_wglBindDisplayColorTableEXT + typedef GLboolean (APIENTRYP GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); + GLEE_EXTERN GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglBindDisplayColorTableEXT; + #define wglBindDisplayColorTableEXT GLeeFuncPtr_wglBindDisplayColorTableEXT +#endif +#ifndef GLEE_H_DEFINED_wglDestroyDisplayColorTableEXT +#define GLEE_H_DEFINED_wglDestroyDisplayColorTableEXT + typedef VOID (APIENTRYP GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); + GLEE_EXTERN GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglDestroyDisplayColorTableEXT; + #define wglDestroyDisplayColorTableEXT GLeeFuncPtr_wglDestroyDisplayColorTableEXT +#endif +#endif + +/* WGL_EXT_extensions_string */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 +#define __GLEE_WGL_EXT_extensions_string 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglGetExtensionsStringEXT +#define GLEE_H_DEFINED_wglGetExtensionsStringEXT + typedef const char * (APIENTRYP GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC) (); + GLEE_EXTERN GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC GLeeFuncPtr_wglGetExtensionsStringEXT; + #define wglGetExtensionsStringEXT GLeeFuncPtr_wglGetExtensionsStringEXT +#endif +#endif + +/* WGL_EXT_swap_control */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 +#define __GLEE_WGL_EXT_swap_control 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglSwapIntervalEXT +#define GLEE_H_DEFINED_wglSwapIntervalEXT + typedef BOOL (APIENTRYP GLEEPFNWGLSWAPINTERVALEXTPROC) (int interval); + GLEE_EXTERN GLEEPFNWGLSWAPINTERVALEXTPROC GLeeFuncPtr_wglSwapIntervalEXT; + #define wglSwapIntervalEXT GLeeFuncPtr_wglSwapIntervalEXT +#endif +#ifndef GLEE_H_DEFINED_wglGetSwapIntervalEXT +#define GLEE_H_DEFINED_wglGetSwapIntervalEXT + typedef int (APIENTRYP GLEEPFNWGLGETSWAPINTERVALEXTPROC) (); + GLEE_EXTERN GLEEPFNWGLGETSWAPINTERVALEXTPROC GLeeFuncPtr_wglGetSwapIntervalEXT; + #define wglGetSwapIntervalEXT GLeeFuncPtr_wglGetSwapIntervalEXT +#endif +#endif + +/* WGL_NV_vertex_array_range */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 +#define __GLEE_WGL_NV_vertex_array_range 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglAllocateMemoryNV +#define GLEE_H_DEFINED_wglAllocateMemoryNV + typedef void* (APIENTRYP GLEEPFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); + GLEE_EXTERN GLEEPFNWGLALLOCATEMEMORYNVPROC GLeeFuncPtr_wglAllocateMemoryNV; + #define wglAllocateMemoryNV GLeeFuncPtr_wglAllocateMemoryNV +#endif +#ifndef GLEE_H_DEFINED_wglFreeMemoryNV +#define GLEE_H_DEFINED_wglFreeMemoryNV + typedef void (APIENTRYP GLEEPFNWGLFREEMEMORYNVPROC) (void * pointer); + GLEE_EXTERN GLEEPFNWGLFREEMEMORYNVPROC GLeeFuncPtr_wglFreeMemoryNV; + #define wglFreeMemoryNV GLeeFuncPtr_wglFreeMemoryNV +#endif +#endif + +/* WGL_OML_sync_control */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 +#define __GLEE_WGL_OML_sync_control 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglGetSyncValuesOML +#define GLEE_H_DEFINED_wglGetSyncValuesOML + typedef BOOL (APIENTRYP GLEEPFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 * ust, INT64 * msc, INT64 * sbc); + GLEE_EXTERN GLEEPFNWGLGETSYNCVALUESOMLPROC GLeeFuncPtr_wglGetSyncValuesOML; + #define wglGetSyncValuesOML GLeeFuncPtr_wglGetSyncValuesOML +#endif +#ifndef GLEE_H_DEFINED_wglGetMscRateOML +#define GLEE_H_DEFINED_wglGetMscRateOML + typedef BOOL (APIENTRYP GLEEPFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 * numerator, INT32 * denominator); + GLEE_EXTERN GLEEPFNWGLGETMSCRATEOMLPROC GLeeFuncPtr_wglGetMscRateOML; + #define wglGetMscRateOML GLeeFuncPtr_wglGetMscRateOML +#endif +#ifndef GLEE_H_DEFINED_wglSwapBuffersMscOML +#define GLEE_H_DEFINED_wglSwapBuffersMscOML + typedef INT64 (APIENTRYP GLEEPFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); + GLEE_EXTERN GLEEPFNWGLSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapBuffersMscOML; + #define wglSwapBuffersMscOML GLeeFuncPtr_wglSwapBuffersMscOML +#endif +#ifndef GLEE_H_DEFINED_wglSwapLayerBuffersMscOML +#define GLEE_H_DEFINED_wglSwapLayerBuffersMscOML + typedef INT64 (APIENTRYP GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); + GLEE_EXTERN GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapLayerBuffersMscOML; + #define wglSwapLayerBuffersMscOML GLeeFuncPtr_wglSwapLayerBuffersMscOML +#endif +#ifndef GLEE_H_DEFINED_wglWaitForMscOML +#define GLEE_H_DEFINED_wglWaitForMscOML + typedef BOOL (APIENTRYP GLEEPFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 * ust, INT64 * msc, INT64 * sbc); + GLEE_EXTERN GLEEPFNWGLWAITFORMSCOMLPROC GLeeFuncPtr_wglWaitForMscOML; + #define wglWaitForMscOML GLeeFuncPtr_wglWaitForMscOML +#endif +#ifndef GLEE_H_DEFINED_wglWaitForSbcOML +#define GLEE_H_DEFINED_wglWaitForSbcOML + typedef BOOL (APIENTRYP GLEEPFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 * ust, INT64 * msc, INT64 * sbc); + GLEE_EXTERN GLEEPFNWGLWAITFORSBCOMLPROC GLeeFuncPtr_wglWaitForSbcOML; + #define wglWaitForSbcOML GLeeFuncPtr_wglWaitForSbcOML +#endif +#endif + +/* WGL_I3D_swap_frame_usage */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 +#define __GLEE_WGL_I3D_swap_frame_usage 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_wglGetFrameUsageI3D +#define GLEE_H_DEFINED_wglGetFrameUsageI3D + typedef BOOL (APIENTRYP GLEEPFNWGLGETFRAMEUSAGEI3DPROC) (float * pUsage); + GLEE_EXTERN GLEEPFNWGLGETFRAMEUSAGEI3DPROC GLeeFuncPtr_wglGetFrameUsageI3D; + #define wglGetFrameUsageI3D GLeeFuncPtr_wglGetFrameUsageI3D +#endif +#ifndef GLEE_H_DEFINED_wglBeginFrameTrackingI3D +#define GLEE_H_DEFINED_wglBeginFrameTrackingI3D + typedef BOOL (APIENTRYP GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC) (); + GLEE_EXTERN GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC GLeeFuncPtr_wglBeginFrameTrackingI3D; + #define wglBeginFrameTrackingI3D GLeeFuncPtr_wglBeginFrameTrackingI3D +#endif +#ifndef GLEE_H_DEFINED_wglEndFrameTrackingI3D +#define GLEE_H_DEFINED_wglEndFrameTrackingI3D + typedef BOOL (APIENTRYP GLEEPFNWGLENDFRAMETRACKINGI3DPROC) (); + GLEE_EXTERN GLEEPFNWGLENDFRAMETRACKINGI3DPROC GLeeFuncPtr_wglEndFrameTrackingI3D; + #define wglEndFrameTrackingI3D GLeeFuncPtr_wglEndFrameTrackingI3D +#endif +#ifndef GLEE_H_DEFINED_wglQueryFrameTrackingI3D +#define GLEE_H_DEFINED_wglQueryFrameTrackingI3D + typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD * pFrameCount, DWORD * pMissedFrames, float * pLastMissedUsage); + GLEE_EXTERN GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC GLeeFuncPtr_wglQueryFrameTrackingI3D; + #define wglQueryFrameTrackingI3D GLeeFuncPtr_wglQueryFrameTrackingI3D +#endif +#endif + +/* WGL_NV_video_output */ + +#ifndef WGL_NV_video_output +#define WGL_NV_video_output 1 +#define __GLEE_WGL_NV_video_output 1 +/* Constants */ +#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 +#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 +#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 +#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 +#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 +#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 +#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define WGL_VIDEO_OUT_FRAME 0x20C8 +#define WGL_VIDEO_OUT_FIELD_1 0x20C9 +#define WGL_VIDEO_OUT_FIELD_2 0x20CA +#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB +#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC +#ifndef GLEE_H_DEFINED_wglGetVideoDeviceNV +#define GLEE_H_DEFINED_wglGetVideoDeviceNV + typedef BOOL (APIENTRYP GLEEPFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV * hVideoDevice); + GLEE_EXTERN GLEEPFNWGLGETVIDEODEVICENVPROC GLeeFuncPtr_wglGetVideoDeviceNV; + #define wglGetVideoDeviceNV GLeeFuncPtr_wglGetVideoDeviceNV +#endif +#ifndef GLEE_H_DEFINED_wglReleaseVideoDeviceNV +#define GLEE_H_DEFINED_wglReleaseVideoDeviceNV + typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); + GLEE_EXTERN GLEEPFNWGLRELEASEVIDEODEVICENVPROC GLeeFuncPtr_wglReleaseVideoDeviceNV; + #define wglReleaseVideoDeviceNV GLeeFuncPtr_wglReleaseVideoDeviceNV +#endif +#ifndef GLEE_H_DEFINED_wglBindVideoImageNV +#define GLEE_H_DEFINED_wglBindVideoImageNV + typedef BOOL (APIENTRYP GLEEPFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); + GLEE_EXTERN GLEEPFNWGLBINDVIDEOIMAGENVPROC GLeeFuncPtr_wglBindVideoImageNV; + #define wglBindVideoImageNV GLeeFuncPtr_wglBindVideoImageNV +#endif +#ifndef GLEE_H_DEFINED_wglReleaseVideoImageNV +#define GLEE_H_DEFINED_wglReleaseVideoImageNV + typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); + GLEE_EXTERN GLEEPFNWGLRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_wglReleaseVideoImageNV; + #define wglReleaseVideoImageNV GLeeFuncPtr_wglReleaseVideoImageNV +#endif +#ifndef GLEE_H_DEFINED_wglSendPbufferToVideoNV +#define GLEE_H_DEFINED_wglSendPbufferToVideoNV + typedef BOOL (APIENTRYP GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock); + GLEE_EXTERN GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_wglSendPbufferToVideoNV; + #define wglSendPbufferToVideoNV GLeeFuncPtr_wglSendPbufferToVideoNV +#endif +#ifndef GLEE_H_DEFINED_wglGetVideoInfoNV +#define GLEE_H_DEFINED_wglGetVideoInfoNV + typedef BOOL (APIENTRYP GLEEPFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo); + GLEE_EXTERN GLEEPFNWGLGETVIDEOINFONVPROC GLeeFuncPtr_wglGetVideoInfoNV; + #define wglGetVideoInfoNV GLeeFuncPtr_wglGetVideoInfoNV +#endif +#endif +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else /* GLX */ + +/* Extension querying variables */ + +GLEE_EXTERN GLboolean _GLEE_GLX_VERSION_1_3; +GLEE_EXTERN GLboolean _GLEE_GLX_VERSION_1_4; +GLEE_EXTERN GLboolean _GLEE_GLX_ARB_multisample; +GLEE_EXTERN GLboolean _GLEE_GLX_ARB_fbconfig_float; +GLEE_EXTERN GLboolean _GLEE_GLX_ARB_create_context; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_multisample; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_visual_info; +GLEE_EXTERN GLboolean _GLEE_GLX_SGI_swap_control; +GLEE_EXTERN GLboolean _GLEE_GLX_SGI_video_sync; +GLEE_EXTERN GLboolean _GLEE_GLX_SGI_make_current_read; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_visual_rating; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_import_context; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_fbconfig; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_pbuffer; +GLEE_EXTERN GLboolean _GLEE_GLX_SGI_cushion; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_video_resize; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_swap_group; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_swap_barrier; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_blended_overlay; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_shared_multisample; +GLEE_EXTERN GLboolean _GLEE_GLX_SUN_get_transparent_index; +GLEE_EXTERN GLboolean _GLEE_GLX_3DFX_multisample; +GLEE_EXTERN GLboolean _GLEE_GLX_MESA_copy_sub_buffer; +GLEE_EXTERN GLboolean _GLEE_GLX_MESA_pixmap_colormap; +GLEE_EXTERN GLboolean _GLEE_GLX_MESA_release_buffers; +GLEE_EXTERN GLboolean _GLEE_GLX_MESA_set_3dfx_mode; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_visual_select_group; +GLEE_EXTERN GLboolean _GLEE_GLX_OML_swap_method; +GLEE_EXTERN GLboolean _GLEE_GLX_OML_sync_control; +GLEE_EXTERN GLboolean _GLEE_GLX_NV_float_buffer; +GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_hyperpipe; +GLEE_EXTERN GLboolean _GLEE_GLX_MESA_agp_offset; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_fbconfig_packed_float; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_framebuffer_sRGB; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_texture_from_pixmap; +GLEE_EXTERN GLboolean _GLEE_GLX_NV_present_video; +GLEE_EXTERN GLboolean _GLEE_GLX_NV_video_out; +GLEE_EXTERN GLboolean _GLEE_GLX_NV_swap_group; +GLEE_EXTERN GLboolean _GLEE_GLX_EXT_scene_marker; +GLEE_EXTERN GLboolean _GLEE_GLX_NV_video_output; + +/* Aliases for extension querying variables */ + +#define GLEE_GLX_VERSION_1_3 GLeeEnabled(&_GLEE_GLX_VERSION_1_3) +#define GLEE_GLX_VERSION_1_4 GLeeEnabled(&_GLEE_GLX_VERSION_1_4) +#define GLEE_GLX_ARB_multisample GLeeEnabled(&_GLEE_GLX_ARB_multisample) +#define GLEE_GLX_ARB_fbconfig_float GLeeEnabled(&_GLEE_GLX_ARB_fbconfig_float) +#define GLEE_GLX_ARB_create_context GLeeEnabled(&_GLEE_GLX_ARB_create_context) +#define GLEE_GLX_SGIS_multisample GLeeEnabled(&_GLEE_GLX_SGIS_multisample) +#define GLEE_GLX_EXT_visual_info GLeeEnabled(&_GLEE_GLX_EXT_visual_info) +#define GLEE_GLX_SGI_swap_control GLeeEnabled(&_GLEE_GLX_SGI_swap_control) +#define GLEE_GLX_SGI_video_sync GLeeEnabled(&_GLEE_GLX_SGI_video_sync) +#define GLEE_GLX_SGI_make_current_read GLeeEnabled(&_GLEE_GLX_SGI_make_current_read) +#define GLEE_GLX_EXT_visual_rating GLeeEnabled(&_GLEE_GLX_EXT_visual_rating) +#define GLEE_GLX_EXT_import_context GLeeEnabled(&_GLEE_GLX_EXT_import_context) +#define GLEE_GLX_SGIX_fbconfig GLeeEnabled(&_GLEE_GLX_SGIX_fbconfig) +#define GLEE_GLX_SGIX_pbuffer GLeeEnabled(&_GLEE_GLX_SGIX_pbuffer) +#define GLEE_GLX_SGI_cushion GLeeEnabled(&_GLEE_GLX_SGI_cushion) +#define GLEE_GLX_SGIX_video_resize GLeeEnabled(&_GLEE_GLX_SGIX_video_resize) +#define GLEE_GLX_SGIX_swap_group GLeeEnabled(&_GLEE_GLX_SGIX_swap_group) +#define GLEE_GLX_SGIX_swap_barrier GLeeEnabled(&_GLEE_GLX_SGIX_swap_barrier) +#define GLEE_GLX_SGIS_blended_overlay GLeeEnabled(&_GLEE_GLX_SGIS_blended_overlay) +#define GLEE_GLX_SGIS_shared_multisample GLeeEnabled(&_GLEE_GLX_SGIS_shared_multisample) +#define GLEE_GLX_SUN_get_transparent_index GLeeEnabled(&_GLEE_GLX_SUN_get_transparent_index) +#define GLEE_GLX_3DFX_multisample GLeeEnabled(&_GLEE_GLX_3DFX_multisample) +#define GLEE_GLX_MESA_copy_sub_buffer GLeeEnabled(&_GLEE_GLX_MESA_copy_sub_buffer) +#define GLEE_GLX_MESA_pixmap_colormap GLeeEnabled(&_GLEE_GLX_MESA_pixmap_colormap) +#define GLEE_GLX_MESA_release_buffers GLeeEnabled(&_GLEE_GLX_MESA_release_buffers) +#define GLEE_GLX_MESA_set_3dfx_mode GLeeEnabled(&_GLEE_GLX_MESA_set_3dfx_mode) +#define GLEE_GLX_SGIX_visual_select_group GLeeEnabled(&_GLEE_GLX_SGIX_visual_select_group) +#define GLEE_GLX_OML_swap_method GLeeEnabled(&_GLEE_GLX_OML_swap_method) +#define GLEE_GLX_OML_sync_control GLeeEnabled(&_GLEE_GLX_OML_sync_control) +#define GLEE_GLX_NV_float_buffer GLeeEnabled(&_GLEE_GLX_NV_float_buffer) +#define GLEE_GLX_SGIX_hyperpipe GLeeEnabled(&_GLEE_GLX_SGIX_hyperpipe) +#define GLEE_GLX_MESA_agp_offset GLeeEnabled(&_GLEE_GLX_MESA_agp_offset) +#define GLEE_GLX_EXT_fbconfig_packed_float GLeeEnabled(&_GLEE_GLX_EXT_fbconfig_packed_float) +#define GLEE_GLX_EXT_framebuffer_sRGB GLeeEnabled(&_GLEE_GLX_EXT_framebuffer_sRGB) +#define GLEE_GLX_EXT_texture_from_pixmap GLeeEnabled(&_GLEE_GLX_EXT_texture_from_pixmap) +#define GLEE_GLX_NV_present_video GLeeEnabled(&_GLEE_GLX_NV_present_video) +#define GLEE_GLX_NV_video_out GLeeEnabled(&_GLEE_GLX_NV_video_out) +#define GLEE_GLX_NV_swap_group GLeeEnabled(&_GLEE_GLX_NV_swap_group) +#define GLEE_GLX_EXT_scene_marker GLeeEnabled(&_GLEE_GLX_EXT_scene_marker) +#define GLEE_GLX_NV_video_output GLeeEnabled(&_GLEE_GLX_NV_video_output) + +/* GLX_VERSION_1_3 */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 +#define __GLEE_GLX_VERSION_1_3 1 +/* Constants */ +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#ifndef GLEE_H_DEFINED_glXGetFBConfigs +#define GLEE_H_DEFINED_glXGetFBConfigs + typedef GLXFBConfig * (APIENTRYP GLEEPFNGLXGETFBCONFIGSPROC) (Display * dpy, int screen, int * nelements); + GLEE_EXTERN GLEEPFNGLXGETFBCONFIGSPROC GLeeFuncPtr_glXGetFBConfigs; + #define glXGetFBConfigs GLeeFuncPtr_glXGetFBConfigs +#endif +#ifndef GLEE_H_DEFINED_glXChooseFBConfig +#define GLEE_H_DEFINED_glXChooseFBConfig + typedef GLXFBConfig * (APIENTRYP GLEEPFNGLXCHOOSEFBCONFIGPROC) (Display * dpy, int screen, const int * attrib_list, int * nelements); + GLEE_EXTERN GLEEPFNGLXCHOOSEFBCONFIGPROC GLeeFuncPtr_glXChooseFBConfig; + #define glXChooseFBConfig GLeeFuncPtr_glXChooseFBConfig +#endif +#ifndef GLEE_H_DEFINED_glXGetFBConfigAttrib +#define GLEE_H_DEFINED_glXGetFBConfigAttrib + typedef int (APIENTRYP GLEEPFNGLXGETFBCONFIGATTRIBPROC) (Display * dpy, GLXFBConfig config, int attribute, int * value); + GLEE_EXTERN GLEEPFNGLXGETFBCONFIGATTRIBPROC GLeeFuncPtr_glXGetFBConfigAttrib; + #define glXGetFBConfigAttrib GLeeFuncPtr_glXGetFBConfigAttrib +#endif +#ifndef GLEE_H_DEFINED_glXGetVisualFromFBConfig +#define GLEE_H_DEFINED_glXGetVisualFromFBConfig + typedef XVisualInfo * (APIENTRYP GLEEPFNGLXGETVISUALFROMFBCONFIGPROC) (Display * dpy, GLXFBConfig config); + GLEE_EXTERN GLEEPFNGLXGETVISUALFROMFBCONFIGPROC GLeeFuncPtr_glXGetVisualFromFBConfig; + #define glXGetVisualFromFBConfig GLeeFuncPtr_glXGetVisualFromFBConfig +#endif +#ifndef GLEE_H_DEFINED_glXCreateWindow +#define GLEE_H_DEFINED_glXCreateWindow + typedef GLXWindow (APIENTRYP GLEEPFNGLXCREATEWINDOWPROC) (Display * dpy, GLXFBConfig config, Window win, const int * attrib_list); + GLEE_EXTERN GLEEPFNGLXCREATEWINDOWPROC GLeeFuncPtr_glXCreateWindow; + #define glXCreateWindow GLeeFuncPtr_glXCreateWindow +#endif +#ifndef GLEE_H_DEFINED_glXDestroyWindow +#define GLEE_H_DEFINED_glXDestroyWindow + typedef void (APIENTRYP GLEEPFNGLXDESTROYWINDOWPROC) (Display * dpy, GLXWindow win); + GLEE_EXTERN GLEEPFNGLXDESTROYWINDOWPROC GLeeFuncPtr_glXDestroyWindow; + #define glXDestroyWindow GLeeFuncPtr_glXDestroyWindow +#endif +#ifndef GLEE_H_DEFINED_glXCreatePixmap +#define GLEE_H_DEFINED_glXCreatePixmap + typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEPIXMAPPROC) (Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list); + GLEE_EXTERN GLEEPFNGLXCREATEPIXMAPPROC GLeeFuncPtr_glXCreatePixmap; + #define glXCreatePixmap GLeeFuncPtr_glXCreatePixmap +#endif +#ifndef GLEE_H_DEFINED_glXDestroyPixmap +#define GLEE_H_DEFINED_glXDestroyPixmap + typedef void (APIENTRYP GLEEPFNGLXDESTROYPIXMAPPROC) (Display * dpy, GLXPixmap pixmap); + GLEE_EXTERN GLEEPFNGLXDESTROYPIXMAPPROC GLeeFuncPtr_glXDestroyPixmap; + #define glXDestroyPixmap GLeeFuncPtr_glXDestroyPixmap +#endif +#ifndef GLEE_H_DEFINED_glXCreatePbuffer +#define GLEE_H_DEFINED_glXCreatePbuffer + typedef GLXPbuffer (APIENTRYP GLEEPFNGLXCREATEPBUFFERPROC) (Display * dpy, GLXFBConfig config, const int * attrib_list); + GLEE_EXTERN GLEEPFNGLXCREATEPBUFFERPROC GLeeFuncPtr_glXCreatePbuffer; + #define glXCreatePbuffer GLeeFuncPtr_glXCreatePbuffer +#endif +#ifndef GLEE_H_DEFINED_glXDestroyPbuffer +#define GLEE_H_DEFINED_glXDestroyPbuffer + typedef void (APIENTRYP GLEEPFNGLXDESTROYPBUFFERPROC) (Display * dpy, GLXPbuffer pbuf); + GLEE_EXTERN GLEEPFNGLXDESTROYPBUFFERPROC GLeeFuncPtr_glXDestroyPbuffer; + #define glXDestroyPbuffer GLeeFuncPtr_glXDestroyPbuffer +#endif +#ifndef GLEE_H_DEFINED_glXQueryDrawable +#define GLEE_H_DEFINED_glXQueryDrawable + typedef void (APIENTRYP GLEEPFNGLXQUERYDRAWABLEPROC) (Display * dpy, GLXDrawable draw, int attribute, unsigned int * value); + GLEE_EXTERN GLEEPFNGLXQUERYDRAWABLEPROC GLeeFuncPtr_glXQueryDrawable; + #define glXQueryDrawable GLeeFuncPtr_glXQueryDrawable +#endif +#ifndef GLEE_H_DEFINED_glXCreateNewContext +#define GLEE_H_DEFINED_glXCreateNewContext + typedef GLXContext (APIENTRYP GLEEPFNGLXCREATENEWCONTEXTPROC) (Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); + GLEE_EXTERN GLEEPFNGLXCREATENEWCONTEXTPROC GLeeFuncPtr_glXCreateNewContext; + #define glXCreateNewContext GLeeFuncPtr_glXCreateNewContext +#endif +#ifndef GLEE_H_DEFINED_glXMakeContextCurrent +#define GLEE_H_DEFINED_glXMakeContextCurrent + typedef Bool (APIENTRYP GLEEPFNGLXMAKECONTEXTCURRENTPROC) (Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + GLEE_EXTERN GLEEPFNGLXMAKECONTEXTCURRENTPROC GLeeFuncPtr_glXMakeContextCurrent; + #define glXMakeContextCurrent GLeeFuncPtr_glXMakeContextCurrent +#endif +#ifndef GLEE_H_DEFINED_glXGetCurrentReadDrawable +#define GLEE_H_DEFINED_glXGetCurrentReadDrawable + typedef GLXDrawable (APIENTRYP GLEEPFNGLXGETCURRENTREADDRAWABLEPROC) (); + GLEE_EXTERN GLEEPFNGLXGETCURRENTREADDRAWABLEPROC GLeeFuncPtr_glXGetCurrentReadDrawable; + #define glXGetCurrentReadDrawable GLeeFuncPtr_glXGetCurrentReadDrawable +#endif +#ifndef GLEE_H_DEFINED_glXGetCurrentDisplay +#define GLEE_H_DEFINED_glXGetCurrentDisplay + typedef Display * (APIENTRYP GLEEPFNGLXGETCURRENTDISPLAYPROC) (); + GLEE_EXTERN GLEEPFNGLXGETCURRENTDISPLAYPROC GLeeFuncPtr_glXGetCurrentDisplay; + #define glXGetCurrentDisplay GLeeFuncPtr_glXGetCurrentDisplay +#endif +#ifndef GLEE_H_DEFINED_glXQueryContext +#define GLEE_H_DEFINED_glXQueryContext + typedef int (APIENTRYP GLEEPFNGLXQUERYCONTEXTPROC) (Display * dpy, GLXContext ctx, int attribute, int * value); + GLEE_EXTERN GLEEPFNGLXQUERYCONTEXTPROC GLeeFuncPtr_glXQueryContext; + #define glXQueryContext GLeeFuncPtr_glXQueryContext +#endif +#ifndef GLEE_H_DEFINED_glXSelectEvent +#define GLEE_H_DEFINED_glXSelectEvent + typedef void (APIENTRYP GLEEPFNGLXSELECTEVENTPROC) (Display * dpy, GLXDrawable draw, unsigned long event_mask); + GLEE_EXTERN GLEEPFNGLXSELECTEVENTPROC GLeeFuncPtr_glXSelectEvent; + #define glXSelectEvent GLeeFuncPtr_glXSelectEvent +#endif +#ifndef GLEE_H_DEFINED_glXGetSelectedEvent +#define GLEE_H_DEFINED_glXGetSelectedEvent + typedef void (APIENTRYP GLEEPFNGLXGETSELECTEDEVENTPROC) (Display * dpy, GLXDrawable draw, unsigned long * event_mask); + GLEE_EXTERN GLEEPFNGLXGETSELECTEDEVENTPROC GLeeFuncPtr_glXGetSelectedEvent; + #define glXGetSelectedEvent GLeeFuncPtr_glXGetSelectedEvent +#endif +#endif + +/* GLX_VERSION_1_4 */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 +#define __GLEE_GLX_VERSION_1_4 1 +/* Constants */ +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 +#ifndef GLEE_H_DEFINED_glXGetProcAddress +#define GLEE_H_DEFINED_glXGetProcAddress + typedef __GLXextFuncPtr (APIENTRYP GLEEPFNGLXGETPROCADDRESSPROC) (const GLubyte * procName); + GLEE_EXTERN GLEEPFNGLXGETPROCADDRESSPROC GLeeFuncPtr_glXGetProcAddress; + #define glXGetProcAddress GLeeFuncPtr_glXGetProcAddress +#endif +#endif + +/* GLX_ARB_multisample */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 +#define __GLEE_GLX_ARB_multisample 1 +/* Constants */ +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 +#endif + +/* GLX_ARB_fbconfig_float */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 +#define __GLEE_GLX_ARB_fbconfig_float 1 +/* Constants */ +#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 +#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 +#endif + +/* GLX_ARB_create_context */ + +#ifndef GLX_ARB_create_context +#define GLX_ARB_create_context 1 +#define __GLEE_GLX_ARB_create_context 1 +/* Constants */ +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 +#ifndef GLEE_H_DEFINED_glXCreateContextAttribsARB +#define GLEE_H_DEFINED_glXCreateContextAttribsARB + typedef GLXContext (APIENTRYP GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC) (Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list); + GLEE_EXTERN GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_glXCreateContextAttribsARB; + #define glXCreateContextAttribsARB GLeeFuncPtr_glXCreateContextAttribsARB +#endif +#endif + +/* GLX_SGIS_multisample */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 +#define __GLEE_GLX_SGIS_multisample 1 +/* Constants */ +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 +#endif + +/* GLX_EXT_visual_info */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 +#define __GLEE_GLX_EXT_visual_info 1 +/* Constants */ +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 +#endif + +/* GLX_SGI_swap_control */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 +#define __GLEE_GLX_SGI_swap_control 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXSwapIntervalSGI +#define GLEE_H_DEFINED_glXSwapIntervalSGI + typedef int (APIENTRYP GLEEPFNGLXSWAPINTERVALSGIPROC) (int interval); + GLEE_EXTERN GLEEPFNGLXSWAPINTERVALSGIPROC GLeeFuncPtr_glXSwapIntervalSGI; + #define glXSwapIntervalSGI GLeeFuncPtr_glXSwapIntervalSGI +#endif +#endif + +/* GLX_SGI_video_sync */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 +#define __GLEE_GLX_SGI_video_sync 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXGetVideoSyncSGI +#define GLEE_H_DEFINED_glXGetVideoSyncSGI + typedef int (APIENTRYP GLEEPFNGLXGETVIDEOSYNCSGIPROC) (unsigned int * count); + GLEE_EXTERN GLEEPFNGLXGETVIDEOSYNCSGIPROC GLeeFuncPtr_glXGetVideoSyncSGI; + #define glXGetVideoSyncSGI GLeeFuncPtr_glXGetVideoSyncSGI +#endif +#ifndef GLEE_H_DEFINED_glXWaitVideoSyncSGI +#define GLEE_H_DEFINED_glXWaitVideoSyncSGI + typedef int (APIENTRYP GLEEPFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int * count); + GLEE_EXTERN GLEEPFNGLXWAITVIDEOSYNCSGIPROC GLeeFuncPtr_glXWaitVideoSyncSGI; + #define glXWaitVideoSyncSGI GLeeFuncPtr_glXWaitVideoSyncSGI +#endif +#endif + +/* GLX_SGI_make_current_read */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 +#define __GLEE_GLX_SGI_make_current_read 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXMakeCurrentReadSGI +#define GLEE_H_DEFINED_glXMakeCurrentReadSGI + typedef Bool (APIENTRYP GLEEPFNGLXMAKECURRENTREADSGIPROC) (Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + GLEE_EXTERN GLEEPFNGLXMAKECURRENTREADSGIPROC GLeeFuncPtr_glXMakeCurrentReadSGI; + #define glXMakeCurrentReadSGI GLeeFuncPtr_glXMakeCurrentReadSGI +#endif +#ifndef GLEE_H_DEFINED_glXGetCurrentReadDrawableSGI +#define GLEE_H_DEFINED_glXGetCurrentReadDrawableSGI + typedef GLXDrawable (APIENTRYP GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC) (); + GLEE_EXTERN GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC GLeeFuncPtr_glXGetCurrentReadDrawableSGI; + #define glXGetCurrentReadDrawableSGI GLeeFuncPtr_glXGetCurrentReadDrawableSGI +#endif +#endif + +/* GLX_EXT_visual_rating */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 +#define __GLEE_GLX_EXT_visual_rating 1 +/* Constants */ +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D +#endif + +/* GLX_EXT_import_context */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 +#define __GLEE_GLX_EXT_import_context 1 +/* Constants */ +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C +#ifndef GLEE_H_DEFINED_glXGetCurrentDisplayEXT +#define GLEE_H_DEFINED_glXGetCurrentDisplayEXT + typedef Display * (APIENTRYP GLEEPFNGLXGETCURRENTDISPLAYEXTPROC) (); + GLEE_EXTERN GLEEPFNGLXGETCURRENTDISPLAYEXTPROC GLeeFuncPtr_glXGetCurrentDisplayEXT; + #define glXGetCurrentDisplayEXT GLeeFuncPtr_glXGetCurrentDisplayEXT +#endif +#ifndef GLEE_H_DEFINED_glXQueryContextInfoEXT +#define GLEE_H_DEFINED_glXQueryContextInfoEXT + typedef int (APIENTRYP GLEEPFNGLXQUERYCONTEXTINFOEXTPROC) (Display * dpy, GLXContext context, int attribute, int * value); + GLEE_EXTERN GLEEPFNGLXQUERYCONTEXTINFOEXTPROC GLeeFuncPtr_glXQueryContextInfoEXT; + #define glXQueryContextInfoEXT GLeeFuncPtr_glXQueryContextInfoEXT +#endif +#ifndef GLEE_H_DEFINED_glXGetContextIDEXT +#define GLEE_H_DEFINED_glXGetContextIDEXT + typedef GLXContextID (APIENTRYP GLEEPFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); + GLEE_EXTERN GLEEPFNGLXGETCONTEXTIDEXTPROC GLeeFuncPtr_glXGetContextIDEXT; + #define glXGetContextIDEXT GLeeFuncPtr_glXGetContextIDEXT +#endif +#ifndef GLEE_H_DEFINED_glXImportContextEXT +#define GLEE_H_DEFINED_glXImportContextEXT + typedef GLXContext (APIENTRYP GLEEPFNGLXIMPORTCONTEXTEXTPROC) (Display * dpy, GLXContextID contextID); + GLEE_EXTERN GLEEPFNGLXIMPORTCONTEXTEXTPROC GLeeFuncPtr_glXImportContextEXT; + #define glXImportContextEXT GLeeFuncPtr_glXImportContextEXT +#endif +#ifndef GLEE_H_DEFINED_glXFreeContextEXT +#define GLEE_H_DEFINED_glXFreeContextEXT + typedef void (APIENTRYP GLEEPFNGLXFREECONTEXTEXTPROC) (Display * dpy, GLXContext context); + GLEE_EXTERN GLEEPFNGLXFREECONTEXTEXTPROC GLeeFuncPtr_glXFreeContextEXT; + #define glXFreeContextEXT GLeeFuncPtr_glXFreeContextEXT +#endif +#endif + +/* GLX_SGIX_fbconfig */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 +#define __GLEE_GLX_SGIX_fbconfig 1 +/* Constants */ +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 +#ifndef GLEE_H_DEFINED_glXGetFBConfigAttribSGIX +#define GLEE_H_DEFINED_glXGetFBConfigAttribSGIX + typedef int (APIENTRYP GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, int attribute, int * value); + GLEE_EXTERN GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC GLeeFuncPtr_glXGetFBConfigAttribSGIX; + #define glXGetFBConfigAttribSGIX GLeeFuncPtr_glXGetFBConfigAttribSGIX +#endif +#ifndef GLEE_H_DEFINED_glXChooseFBConfigSGIX +#define GLEE_H_DEFINED_glXChooseFBConfigSGIX + typedef GLXFBConfigSGIX * (APIENTRYP GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC) (Display * dpy, int screen, int * attrib_list, int * nelements); + GLEE_EXTERN GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC GLeeFuncPtr_glXChooseFBConfigSGIX; + #define glXChooseFBConfigSGIX GLeeFuncPtr_glXChooseFBConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXCreateGLXPixmapWithConfigSGIX +#define GLEE_H_DEFINED_glXCreateGLXPixmapWithConfigSGIX + typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap); + GLEE_EXTERN GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX; + #define glXCreateGLXPixmapWithConfigSGIX GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXCreateContextWithConfigSGIX +#define GLEE_H_DEFINED_glXCreateContextWithConfigSGIX + typedef GLXContext (APIENTRYP GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); + GLEE_EXTERN GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateContextWithConfigSGIX; + #define glXCreateContextWithConfigSGIX GLeeFuncPtr_glXCreateContextWithConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXGetVisualFromFBConfigSGIX +#define GLEE_H_DEFINED_glXGetVisualFromFBConfigSGIX + typedef XVisualInfo * (APIENTRYP GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config); + GLEE_EXTERN GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLeeFuncPtr_glXGetVisualFromFBConfigSGIX; + #define glXGetVisualFromFBConfigSGIX GLeeFuncPtr_glXGetVisualFromFBConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXGetFBConfigFromVisualSGIX +#define GLEE_H_DEFINED_glXGetFBConfigFromVisualSGIX + typedef GLXFBConfigSGIX (APIENTRYP GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display * dpy, XVisualInfo * vis); + GLEE_EXTERN GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLeeFuncPtr_glXGetFBConfigFromVisualSGIX; + #define glXGetFBConfigFromVisualSGIX GLeeFuncPtr_glXGetFBConfigFromVisualSGIX +#endif +#endif + +/* GLX_SGIX_pbuffer */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 +#define __GLEE_GLX_SGIX_pbuffer 1 +/* Constants */ +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#ifndef GLEE_H_DEFINED_glXCreateGLXPbufferSGIX +#define GLEE_H_DEFINED_glXCreateGLXPbufferSGIX + typedef GLXPbufferSGIX (APIENTRYP GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list); + GLEE_EXTERN GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC GLeeFuncPtr_glXCreateGLXPbufferSGIX; + #define glXCreateGLXPbufferSGIX GLeeFuncPtr_glXCreateGLXPbufferSGIX +#endif +#ifndef GLEE_H_DEFINED_glXDestroyGLXPbufferSGIX +#define GLEE_H_DEFINED_glXDestroyGLXPbufferSGIX + typedef void (APIENTRYP GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display * dpy, GLXPbufferSGIX pbuf); + GLEE_EXTERN GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXDestroyGLXPbufferSGIX; + #define glXDestroyGLXPbufferSGIX GLeeFuncPtr_glXDestroyGLXPbufferSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryGLXPbufferSGIX +#define GLEE_H_DEFINED_glXQueryGLXPbufferSGIX + typedef int (APIENTRYP GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC) (Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value); + GLEE_EXTERN GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXQueryGLXPbufferSGIX; + #define glXQueryGLXPbufferSGIX GLeeFuncPtr_glXQueryGLXPbufferSGIX +#endif +#ifndef GLEE_H_DEFINED_glXSelectEventSGIX +#define GLEE_H_DEFINED_glXSelectEventSGIX + typedef void (APIENTRYP GLEEPFNGLXSELECTEVENTSGIXPROC) (Display * dpy, GLXDrawable drawable, unsigned long mask); + GLEE_EXTERN GLEEPFNGLXSELECTEVENTSGIXPROC GLeeFuncPtr_glXSelectEventSGIX; + #define glXSelectEventSGIX GLeeFuncPtr_glXSelectEventSGIX +#endif +#ifndef GLEE_H_DEFINED_glXGetSelectedEventSGIX +#define GLEE_H_DEFINED_glXGetSelectedEventSGIX + typedef void (APIENTRYP GLEEPFNGLXGETSELECTEDEVENTSGIXPROC) (Display * dpy, GLXDrawable drawable, unsigned long * mask); + GLEE_EXTERN GLEEPFNGLXGETSELECTEDEVENTSGIXPROC GLeeFuncPtr_glXGetSelectedEventSGIX; + #define glXGetSelectedEventSGIX GLeeFuncPtr_glXGetSelectedEventSGIX +#endif +#endif + +/* GLX_SGI_cushion */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 +#define __GLEE_GLX_SGI_cushion 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXCushionSGI +#define GLEE_H_DEFINED_glXCushionSGI + typedef void (APIENTRYP GLEEPFNGLXCUSHIONSGIPROC) (Display * dpy, Window window, float cushion); + GLEE_EXTERN GLEEPFNGLXCUSHIONSGIPROC GLeeFuncPtr_glXCushionSGI; + #define glXCushionSGI GLeeFuncPtr_glXCushionSGI +#endif +#endif + +/* GLX_SGIX_video_resize */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 +#define __GLEE_GLX_SGIX_video_resize 1 +/* Constants */ +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 +#ifndef GLEE_H_DEFINED_glXBindChannelToWindowSGIX +#define GLEE_H_DEFINED_glXBindChannelToWindowSGIX + typedef int (APIENTRYP GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display * display, int screen, int channel, Window window); + GLEE_EXTERN GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC GLeeFuncPtr_glXBindChannelToWindowSGIX; + #define glXBindChannelToWindowSGIX GLeeFuncPtr_glXBindChannelToWindowSGIX +#endif +#ifndef GLEE_H_DEFINED_glXChannelRectSGIX +#define GLEE_H_DEFINED_glXChannelRectSGIX + typedef int (APIENTRYP GLEEPFNGLXCHANNELRECTSGIXPROC) (Display * display, int screen, int channel, int x, int y, int w, int h); + GLEE_EXTERN GLEEPFNGLXCHANNELRECTSGIXPROC GLeeFuncPtr_glXChannelRectSGIX; + #define glXChannelRectSGIX GLeeFuncPtr_glXChannelRectSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryChannelRectSGIX +#define GLEE_H_DEFINED_glXQueryChannelRectSGIX + typedef int (APIENTRYP GLEEPFNGLXQUERYCHANNELRECTSGIXPROC) (Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh); + GLEE_EXTERN GLEEPFNGLXQUERYCHANNELRECTSGIXPROC GLeeFuncPtr_glXQueryChannelRectSGIX; + #define glXQueryChannelRectSGIX GLeeFuncPtr_glXQueryChannelRectSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryChannelDeltasSGIX +#define GLEE_H_DEFINED_glXQueryChannelDeltasSGIX + typedef int (APIENTRYP GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC) (Display * display, int screen, int channel, int * x, int * y, int * w, int * h); + GLEE_EXTERN GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC GLeeFuncPtr_glXQueryChannelDeltasSGIX; + #define glXQueryChannelDeltasSGIX GLeeFuncPtr_glXQueryChannelDeltasSGIX +#endif +#ifndef GLEE_H_DEFINED_glXChannelRectSyncSGIX +#define GLEE_H_DEFINED_glXChannelRectSyncSGIX + typedef int (APIENTRYP GLEEPFNGLXCHANNELRECTSYNCSGIXPROC) (Display * display, int screen, int channel, GLenum synctype); + GLEE_EXTERN GLEEPFNGLXCHANNELRECTSYNCSGIXPROC GLeeFuncPtr_glXChannelRectSyncSGIX; + #define glXChannelRectSyncSGIX GLeeFuncPtr_glXChannelRectSyncSGIX +#endif +#endif + +/* GLX_SGIX_swap_group */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 +#define __GLEE_GLX_SGIX_swap_group 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXJoinSwapGroupSGIX +#define GLEE_H_DEFINED_glXJoinSwapGroupSGIX + typedef void (APIENTRYP GLEEPFNGLXJOINSWAPGROUPSGIXPROC) (Display * dpy, GLXDrawable drawable, GLXDrawable member); + GLEE_EXTERN GLEEPFNGLXJOINSWAPGROUPSGIXPROC GLeeFuncPtr_glXJoinSwapGroupSGIX; + #define glXJoinSwapGroupSGIX GLeeFuncPtr_glXJoinSwapGroupSGIX +#endif +#endif + +/* GLX_SGIX_swap_barrier */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 +#define __GLEE_GLX_SGIX_swap_barrier 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXBindSwapBarrierSGIX +#define GLEE_H_DEFINED_glXBindSwapBarrierSGIX + typedef void (APIENTRYP GLEEPFNGLXBINDSWAPBARRIERSGIXPROC) (Display * dpy, GLXDrawable drawable, int barrier); + GLEE_EXTERN GLEEPFNGLXBINDSWAPBARRIERSGIXPROC GLeeFuncPtr_glXBindSwapBarrierSGIX; + #define glXBindSwapBarrierSGIX GLeeFuncPtr_glXBindSwapBarrierSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryMaxSwapBarriersSGIX +#define GLEE_H_DEFINED_glXQueryMaxSwapBarriersSGIX + typedef Bool (APIENTRYP GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display * dpy, int screen, int * max); + GLEE_EXTERN GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX; + #define glXQueryMaxSwapBarriersSGIX GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX +#endif +#endif + +/* GLX_SGIS_blended_overlay */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 +#define __GLEE_GLX_SGIS_blended_overlay 1 +/* Constants */ +#define GLX_BLENDED_RGBA_SGIS 0x8025 +#endif + +/* GLX_SGIS_shared_multisample */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 +#define __GLEE_GLX_SGIS_shared_multisample 1 +/* Constants */ +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 +#endif + +/* GLX_SUN_get_transparent_index */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 +#define __GLEE_GLX_SUN_get_transparent_index 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXGetTransparentIndexSUN +#define GLEE_H_DEFINED_glXGetTransparentIndexSUN + typedef Status (APIENTRYP GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC) (Display * dpy, Window overlay, Window underlay, long * pTransparentIndex); + GLEE_EXTERN GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC GLeeFuncPtr_glXGetTransparentIndexSUN; + #define glXGetTransparentIndexSUN GLeeFuncPtr_glXGetTransparentIndexSUN +#endif +#endif + +/* GLX_3DFX_multisample */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 +#define __GLEE_GLX_3DFX_multisample 1 +/* Constants */ +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 +#endif + +/* GLX_MESA_copy_sub_buffer */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 +#define __GLEE_GLX_MESA_copy_sub_buffer 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXCopySubBufferMESA +#define GLEE_H_DEFINED_glXCopySubBufferMESA + typedef void (APIENTRYP GLEEPFNGLXCOPYSUBBUFFERMESAPROC) (Display * dpy, GLXDrawable drawable, int x, int y, int width, int height); + GLEE_EXTERN GLEEPFNGLXCOPYSUBBUFFERMESAPROC GLeeFuncPtr_glXCopySubBufferMESA; + #define glXCopySubBufferMESA GLeeFuncPtr_glXCopySubBufferMESA +#endif +#endif + +/* GLX_MESA_pixmap_colormap */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 +#define __GLEE_GLX_MESA_pixmap_colormap 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXCreateGLXPixmapMESA +#define GLEE_H_DEFINED_glXCreateGLXPixmapMESA + typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEGLXPIXMAPMESAPROC) (Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap); + GLEE_EXTERN GLEEPFNGLXCREATEGLXPIXMAPMESAPROC GLeeFuncPtr_glXCreateGLXPixmapMESA; + #define glXCreateGLXPixmapMESA GLeeFuncPtr_glXCreateGLXPixmapMESA +#endif +#endif + +/* GLX_MESA_release_buffers */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 +#define __GLEE_GLX_MESA_release_buffers 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXReleaseBuffersMESA +#define GLEE_H_DEFINED_glXReleaseBuffersMESA + typedef Bool (APIENTRYP GLEEPFNGLXRELEASEBUFFERSMESAPROC) (Display * dpy, GLXDrawable drawable); + GLEE_EXTERN GLEEPFNGLXRELEASEBUFFERSMESAPROC GLeeFuncPtr_glXReleaseBuffersMESA; + #define glXReleaseBuffersMESA GLeeFuncPtr_glXReleaseBuffersMESA +#endif +#endif + +/* GLX_MESA_set_3dfx_mode */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 +#define __GLEE_GLX_MESA_set_3dfx_mode 1 +/* Constants */ +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 +#ifndef GLEE_H_DEFINED_glXSet3DfxModeMESA +#define GLEE_H_DEFINED_glXSet3DfxModeMESA + typedef Bool (APIENTRYP GLEEPFNGLXSET3DFXMODEMESAPROC) (int mode); + GLEE_EXTERN GLEEPFNGLXSET3DFXMODEMESAPROC GLeeFuncPtr_glXSet3DfxModeMESA; + #define glXSet3DfxModeMESA GLeeFuncPtr_glXSet3DfxModeMESA +#endif +#endif + +/* GLX_SGIX_visual_select_group */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 +#define __GLEE_GLX_SGIX_visual_select_group 1 +/* Constants */ +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 +#endif + +/* GLX_OML_swap_method */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 +#define __GLEE_GLX_OML_swap_method 1 +/* Constants */ +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 +#endif + +/* GLX_OML_sync_control */ + +#ifndef GLX_OML_sync_control +#define GLX_OML_sync_control 1 +#define __GLEE_GLX_OML_sync_control 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXGetSyncValuesOML +#define GLEE_H_DEFINED_glXGetSyncValuesOML + typedef Bool (APIENTRYP GLEEPFNGLXGETSYNCVALUESOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc); + GLEE_EXTERN GLEEPFNGLXGETSYNCVALUESOMLPROC GLeeFuncPtr_glXGetSyncValuesOML; + #define glXGetSyncValuesOML GLeeFuncPtr_glXGetSyncValuesOML +#endif +#ifndef GLEE_H_DEFINED_glXGetMscRateOML +#define GLEE_H_DEFINED_glXGetMscRateOML + typedef Bool (APIENTRYP GLEEPFNGLXGETMSCRATEOMLPROC) (Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator); + GLEE_EXTERN GLEEPFNGLXGETMSCRATEOMLPROC GLeeFuncPtr_glXGetMscRateOML; + #define glXGetMscRateOML GLeeFuncPtr_glXGetMscRateOML +#endif +#ifndef GLEE_H_DEFINED_glXSwapBuffersMscOML +#define GLEE_H_DEFINED_glXSwapBuffersMscOML + typedef int64_t (APIENTRYP GLEEPFNGLXSWAPBUFFERSMSCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); + GLEE_EXTERN GLEEPFNGLXSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_glXSwapBuffersMscOML; + #define glXSwapBuffersMscOML GLeeFuncPtr_glXSwapBuffersMscOML +#endif +#ifndef GLEE_H_DEFINED_glXWaitForMscOML +#define GLEE_H_DEFINED_glXWaitForMscOML + typedef Bool (APIENTRYP GLEEPFNGLXWAITFORMSCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * ust, int64_t * msc, int64_t * sbc); + GLEE_EXTERN GLEEPFNGLXWAITFORMSCOMLPROC GLeeFuncPtr_glXWaitForMscOML; + #define glXWaitForMscOML GLeeFuncPtr_glXWaitForMscOML +#endif +#ifndef GLEE_H_DEFINED_glXWaitForSbcOML +#define GLEE_H_DEFINED_glXWaitForSbcOML + typedef Bool (APIENTRYP GLEEPFNGLXWAITFORSBCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc); + GLEE_EXTERN GLEEPFNGLXWAITFORSBCOMLPROC GLeeFuncPtr_glXWaitForSbcOML; + #define glXWaitForSbcOML GLeeFuncPtr_glXWaitForSbcOML +#endif +#endif + +/* GLX_NV_float_buffer */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 +#define __GLEE_GLX_NV_float_buffer 1 +/* Constants */ +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 +#endif + +/* GLX_SGIX_hyperpipe */ + +#ifndef GLX_SGIX_hyperpipe +#define GLX_SGIX_hyperpipe 1 +#define __GLEE_GLX_SGIX_hyperpipe 1 +/* Constants */ +#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 +#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 +#define GLX_BAD_HYPERPIPE_SGIX 92 +#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_PIPE_RECT_SGIX 0x00000001 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 +#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 +#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 +#define GLX_HYPERPIPE_ID_SGIX 0x8030 +#ifndef GLEE_H_DEFINED_glXQueryHyperpipeNetworkSGIX +#define GLEE_H_DEFINED_glXQueryHyperpipeNetworkSGIX + typedef GLXHyperpipeNetworkSGIX * (APIENTRYP GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display * dpy, int * npipes); + GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX; + #define glXQueryHyperpipeNetworkSGIX GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX +#endif +#ifndef GLEE_H_DEFINED_glXHyperpipeConfigSGIX +#define GLEE_H_DEFINED_glXHyperpipeConfigSGIX + typedef int (APIENTRYP GLEEPFNGLXHYPERPIPECONFIGSGIXPROC) (Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId); + GLEE_EXTERN GLEEPFNGLXHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXHyperpipeConfigSGIX; + #define glXHyperpipeConfigSGIX GLeeFuncPtr_glXHyperpipeConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryHyperpipeConfigSGIX +#define GLEE_H_DEFINED_glXQueryHyperpipeConfigSGIX + typedef GLXHyperpipeConfigSGIX * (APIENTRYP GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display * dpy, int hpId, int * npipes); + GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXQueryHyperpipeConfigSGIX; + #define glXQueryHyperpipeConfigSGIX GLeeFuncPtr_glXQueryHyperpipeConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXDestroyHyperpipeConfigSGIX +#define GLEE_H_DEFINED_glXDestroyHyperpipeConfigSGIX + typedef int (APIENTRYP GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display * dpy, int hpId); + GLEE_EXTERN GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX; + #define glXDestroyHyperpipeConfigSGIX GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX +#endif +#ifndef GLEE_H_DEFINED_glXBindHyperpipeSGIX +#define GLEE_H_DEFINED_glXBindHyperpipeSGIX + typedef int (APIENTRYP GLEEPFNGLXBINDHYPERPIPESGIXPROC) (Display * dpy, int hpId); + GLEE_EXTERN GLEEPFNGLXBINDHYPERPIPESGIXPROC GLeeFuncPtr_glXBindHyperpipeSGIX; + #define glXBindHyperpipeSGIX GLeeFuncPtr_glXBindHyperpipeSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryHyperpipeBestAttribSGIX +#define GLEE_H_DEFINED_glXQueryHyperpipeBestAttribSGIX + typedef int (APIENTRYP GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList); + GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX; + #define glXQueryHyperpipeBestAttribSGIX GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX +#endif +#ifndef GLEE_H_DEFINED_glXHyperpipeAttribSGIX +#define GLEE_H_DEFINED_glXHyperpipeAttribSGIX + typedef int (APIENTRYP GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * attribList); + GLEE_EXTERN GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXHyperpipeAttribSGIX; + #define glXHyperpipeAttribSGIX GLeeFuncPtr_glXHyperpipeAttribSGIX +#endif +#ifndef GLEE_H_DEFINED_glXQueryHyperpipeAttribSGIX +#define GLEE_H_DEFINED_glXQueryHyperpipeAttribSGIX + typedef int (APIENTRYP GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList); + GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeAttribSGIX; + #define glXQueryHyperpipeAttribSGIX GLeeFuncPtr_glXQueryHyperpipeAttribSGIX +#endif +#endif + +/* GLX_MESA_agp_offset */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 +#define __GLEE_GLX_MESA_agp_offset 1 +/* Constants */ +#ifndef GLEE_H_DEFINED_glXGetAGPOffsetMESA +#define GLEE_H_DEFINED_glXGetAGPOffsetMESA + typedef unsigned int (APIENTRYP GLEEPFNGLXGETAGPOFFSETMESAPROC) (const void * pointer); + GLEE_EXTERN GLEEPFNGLXGETAGPOFFSETMESAPROC GLeeFuncPtr_glXGetAGPOffsetMESA; + #define glXGetAGPOffsetMESA GLeeFuncPtr_glXGetAGPOffsetMESA +#endif +#endif + +/* GLX_EXT_fbconfig_packed_float */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 +#define __GLEE_GLX_EXT_fbconfig_packed_float 1 +/* Constants */ +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#endif + +/* GLX_EXT_framebuffer_sRGB */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 +#define __GLEE_GLX_EXT_framebuffer_sRGB 1 +/* Constants */ +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 +#endif + +/* GLX_EXT_texture_from_pixmap */ + +#ifndef GLX_EXT_texture_from_pixmap +#define GLX_EXT_texture_from_pixmap 1 +#define __GLEE_GLX_EXT_texture_from_pixmap 1 +/* Constants */ +#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 +#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 +#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 +#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 +#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 +#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 +#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 +#define GLX_Y_INVERTED_EXT 0x20D4 +#define GLX_TEXTURE_FORMAT_EXT 0x20D5 +#define GLX_TEXTURE_TARGET_EXT 0x20D6 +#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 +#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 +#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 +#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA +#define GLX_TEXTURE_1D_EXT 0x20DB +#define GLX_TEXTURE_2D_EXT 0x20DC +#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD +#define GLX_FRONT_LEFT_EXT 0x20DE +#define GLX_FRONT_RIGHT_EXT 0x20DF +#define GLX_BACK_LEFT_EXT 0x20E0 +#define GLX_BACK_RIGHT_EXT 0x20E1 +#define GLX_FRONT_EXT GLX_FRONT_LEFT_EXT +#define GLX_BACK_EXT GLX_BACK_LEFT_EXT +#define GLX_AUX0_EXT 0x20E2 +#define GLX_AUX1_EXT 0x20E3 +#define GLX_AUX2_EXT 0x20E4 +#define GLX_AUX3_EXT 0x20E5 +#define GLX_AUX4_EXT 0x20E6 +#define GLX_AUX5_EXT 0x20E7 +#define GLX_AUX6_EXT 0x20E8 +#define GLX_AUX7_EXT 0x20E9 +#define GLX_AUX8_EXT 0x20EA +#define GLX_AUX9_EXT 0x20EB +#ifndef GLEE_H_DEFINED_glXBindTexImageEXT +#define GLEE_H_DEFINED_glXBindTexImageEXT + typedef void (APIENTRYP GLEEPFNGLXBINDTEXIMAGEEXTPROC) (Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list); + GLEE_EXTERN GLEEPFNGLXBINDTEXIMAGEEXTPROC GLeeFuncPtr_glXBindTexImageEXT; + #define glXBindTexImageEXT GLeeFuncPtr_glXBindTexImageEXT +#endif +#ifndef GLEE_H_DEFINED_glXReleaseTexImageEXT +#define GLEE_H_DEFINED_glXReleaseTexImageEXT + typedef void (APIENTRYP GLEEPFNGLXRELEASETEXIMAGEEXTPROC) (Display * dpy, GLXDrawable drawable, int buffer); + GLEE_EXTERN GLEEPFNGLXRELEASETEXIMAGEEXTPROC GLeeFuncPtr_glXReleaseTexImageEXT; + #define glXReleaseTexImageEXT GLeeFuncPtr_glXReleaseTexImageEXT +#endif +#endif + +/* GLX_NV_present_video */ + +#ifndef GLX_NV_present_video +#define GLX_NV_present_video 1 +#define __GLEE_GLX_NV_present_video 1 +/* Constants */ +#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 +#endif + +/* GLX_NV_video_out */ + +#ifndef GLX_NV_video_out +#define GLX_NV_video_out 1 +#define __GLEE_GLX_NV_video_out 1 +/* Constants */ +#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 +#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 +#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 +#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 +#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 +#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA +#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB +#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC +#endif + +/* GLX_NV_swap_group */ + +#ifndef GLX_NV_swap_group +#define GLX_NV_swap_group 1 +#define __GLEE_GLX_NV_swap_group 1 +/* Constants */ +#endif + +/* GLX_EXT_scene_marker */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 +#define __GLEE_GLX_EXT_scene_marker 1 +/* Constants */ +#endif + +/* GLX_NV_video_output */ + +#ifndef GLX_NV_video_output +#define GLX_NV_video_output 1 +#define __GLEE_GLX_NV_video_output 1 +/* Constants */ +#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 +#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 +#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 +#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 +#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 +#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA +#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB +#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC +#ifndef GLEE_H_DEFINED_glXGetVideoDeviceNV +#define GLEE_H_DEFINED_glXGetVideoDeviceNV + typedef int (APIENTRYP GLEEPFNGLXGETVIDEODEVICENVPROC) (Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice); + GLEE_EXTERN GLEEPFNGLXGETVIDEODEVICENVPROC GLeeFuncPtr_glXGetVideoDeviceNV; + #define glXGetVideoDeviceNV GLeeFuncPtr_glXGetVideoDeviceNV +#endif +#ifndef GLEE_H_DEFINED_glXReleaseVideoDeviceNV +#define GLEE_H_DEFINED_glXReleaseVideoDeviceNV + typedef int (APIENTRYP GLEEPFNGLXRELEASEVIDEODEVICENVPROC) (Display * dpy, int screen, GLXVideoDeviceNV VideoDevice); + GLEE_EXTERN GLEEPFNGLXRELEASEVIDEODEVICENVPROC GLeeFuncPtr_glXReleaseVideoDeviceNV; + #define glXReleaseVideoDeviceNV GLeeFuncPtr_glXReleaseVideoDeviceNV +#endif +#ifndef GLEE_H_DEFINED_glXBindVideoImageNV +#define GLEE_H_DEFINED_glXBindVideoImageNV + typedef int (APIENTRYP GLEEPFNGLXBINDVIDEOIMAGENVPROC) (Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); + GLEE_EXTERN GLEEPFNGLXBINDVIDEOIMAGENVPROC GLeeFuncPtr_glXBindVideoImageNV; + #define glXBindVideoImageNV GLeeFuncPtr_glXBindVideoImageNV +#endif +#ifndef GLEE_H_DEFINED_glXReleaseVideoImageNV +#define GLEE_H_DEFINED_glXReleaseVideoImageNV + typedef int (APIENTRYP GLEEPFNGLXRELEASEVIDEOIMAGENVPROC) (Display * dpy, GLXPbuffer pbuf); + GLEE_EXTERN GLEEPFNGLXRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_glXReleaseVideoImageNV; + #define glXReleaseVideoImageNV GLeeFuncPtr_glXReleaseVideoImageNV +#endif +#ifndef GLEE_H_DEFINED_glXSendPbufferToVideoNV +#define GLEE_H_DEFINED_glXSendPbufferToVideoNV + typedef int (APIENTRYP GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC) (Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock); + GLEE_EXTERN GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_glXSendPbufferToVideoNV; + #define glXSendPbufferToVideoNV GLeeFuncPtr_glXSendPbufferToVideoNV +#endif +#ifndef GLEE_H_DEFINED_glXGetVideoInfoNV +#define GLEE_H_DEFINED_glXGetVideoInfoNV + typedef int (APIENTRYP GLEEPFNGLXGETVIDEOINFONVPROC) (Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo); + GLEE_EXTERN GLEEPFNGLXGETVIDEOINFONVPROC GLeeFuncPtr_glXGetVideoInfoNV; + #define glXGetVideoInfoNV GLeeFuncPtr_glXGetVideoInfoNV +#endif +#endif +#endif /*end GLX */ + +/***************************************************************** + * GLee functions + *****************************************************************/ + +GLEE_EXTERN GLboolean GLeeInit( void ); +GLEE_EXTERN GLint GLeeForceLink(const char * extensionName); +GLEE_EXTERN const char * GLeeGetErrorString( void ); +GLEE_EXTERN const char * GLeeGetExtStrGL( void ); +GLEE_EXTERN GLboolean GLeeEnabled(GLboolean * extensionQueryingVariable); + +#ifdef WIN32 +GLEE_EXTERN const char * GLeeGetExtStrWGL( void ); +#elif defined(__APPLE__) || defined(__APPLE_CC__) +#else +GLEE_EXTERN const char * GLeeGetExtStrGLX( void ); +#endif + +#ifdef __cplusplus +} /* end C linkage */ +#endif + +#endif /* __glee_h_ defined */ diff --git a/Extras/sph/common/common_defs.h b/Extras/sph/common/common_defs.h index f4509ae3c..0f1628c61 100644 --- a/Extras/sph/common/common_defs.h +++ b/Extras/sph/common/common_defs.h @@ -1,52 +1,52 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 COMMON_DEF - #define COMMON_DEF - - // Global defs - - //#define USE_SHADOWS // Disable if you don't have FBOs, or to greatly speed up demo. - -// #define USE_JPEG - - #define BUILD_CUDA // CUDA - Visual Studio 2005 only (as of April 2009) - - #define TEX_SIZE 2048 - #define LIGHT_NEAR 0.5 - #define LIGHT_FAR 300.0 - #define DEGtoRAD (3.141592/180.0) - - #ifdef _MSC_VER - #include - #else - typedef unsigned int DWORD; - #endif - typedef unsigned int uint; - - #define COLOR(r,g,b) ( (DWORD(r*255.0f)<<24) | (DWORD(g*255.0f)<<16) | (DWORD(b*255.0f)<<8) ) - #define COLORA(r,g,b,a) ( (DWORD(r*255.0f)<<24) | (DWORD(g*255.0f)<<16) | (DWORD(b*255.0f)<<8) | DWORD(a*255.0f) ) - #define RED(c) (float((c>>24) & 0xFF)/255.0) - #define GRN(c) (float((c>>16) & 0xFF)/255.0) - #define BLUE(c) (float((c>>8) & 0xFF)/255.0) - #define ALPH(c) (float(c & 0xFF)/255.0) +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 COMMON_DEF + #define COMMON_DEF + + // Global defs + + //#define USE_SHADOWS // Disable if you don't have FBOs, or to greatly speed up demo. + +// #define USE_JPEG + + #define BUILD_CUDA // CUDA - Visual Studio 2005 only (as of April 2009) + + #define TEX_SIZE 2048 + #define LIGHT_NEAR 0.5 + #define LIGHT_FAR 300.0 + #define DEGtoRAD (3.141592/180.0) + + #ifdef _MSC_VER + #include + #else + typedef unsigned int DWORD; + #endif + typedef unsigned int uint; + + #define COLOR(r,g,b) ( (DWORD(r*255.0f)<<24) | (DWORD(g*255.0f)<<16) | (DWORD(b*255.0f)<<8) ) + #define COLORA(r,g,b,a) ( (DWORD(r*255.0f)<<24) | (DWORD(g*255.0f)<<16) | (DWORD(b*255.0f)<<8) | DWORD(a*255.0f) ) + #define RED(c) (float((c>>24) & 0xFF)/255.0) + #define GRN(c) (float((c>>16) & 0xFF)/255.0) + #define BLUE(c) (float((c>>8) & 0xFF)/255.0) + #define ALPH(c) (float(c & 0xFF)/255.0) #endif \ No newline at end of file diff --git a/Extras/sph/common/geomx.cpp b/Extras/sph/common/geomx.cpp index 14b0d9a60..4503feed7 100644 --- a/Extras/sph/common/geomx.cpp +++ b/Extras/sph/common/geomx.cpp @@ -1,443 +1,443 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "geomx.h" -#include "mdebug.h" - -#include - -GeomX::GeomX () -{ - mHeap = 0x0; -} - -void GeomX::FreeBuffers () -{ - for (int n=0; n < (int) mBuf.size(); n++) { - free ( mBuf[n].data ); - mBuf[n].data = 0x0; - } - mBuf.clear (); - - if ( mHeap != 0x0 ) free ( mHeap ); - mHeap = 0x0; - mHeapNum = 0; - mHeapMax = 0; -} - -void GeomX::ResetHeap () -{ - mHeapNum = 0; - mHeapFree = -1; -} - -int GeomX::GetSize () -{ - int sum = mHeapNum * sizeof(hval) ; - for (int n=0; n < (int) mBuf.size(); n++) - sum += mBuf[n].size; - sum += (int) mAttribute.size() * sizeof(GeomAttr); - return sum; -} - -void GeomX::ClearAttributes () -{ - mAttribute.clear (); -} - -int GeomX::CopyBuffer ( uchar bdest, uchar bsrc, GeomX& src ) -{ - if ( bsrc >= src.GetNumBuf() ) return -1; - - if ( bdest >= GetNumBuf() ) { - for (int n=0; n <= bdest - GetNumBuf(); n++ ) - AddBuffer ( 0, 0, 0 ); - } - if ( mBuf[bdest].data != 0x0 ) { - free ( mBuf[bdest].data ); - mBuf[bdest].data = 0x0; - } - - GeomBuf* buf = src.GetBuffer( bsrc ); - mBuf[bdest].dtype = buf->dtype; - mBuf[bdest].max = buf->max; - mBuf[bdest].num = buf->num; - mBuf[bdest].stride = buf->stride; - mBuf[bdest].size = buf->size; - mBuf[bdest].data = (char*) malloc ( mBuf[bdest].max * mBuf[bdest].stride ); - memcpy ( mBuf[bdest].data, buf->data, mBuf[bdest].num * mBuf[bdest].stride ); - - return bdest; -} - - -void GeomX::CopyBuffers ( GeomX& src ) -{ - FreeBuffers (); - for (int n = 0; n < src.GetNumBuf(); n++) - CopyBuffer ( n, n, src ); - CopyHeap ( src ); -} - -void GeomX::CopyHeap ( GeomX& src ) -{ - hpos num, max, freepos; - hval* src_data = src.GetHeap ( num, max, freepos ); - - if ( mHeap != 0x0 ) { - free ( mHeap ); - mHeap = 0x0; - } - - mHeap = (hval*) malloc ( max * sizeof(hval) ); - mHeapMax = max; - mHeapNum = num; - mHeapFree = freepos; - - memcpy ( mHeap, src_data, mHeapNum * sizeof(hval) ); -} - -hval* GeomX::GetHeap ( hpos& num, hpos& max, hpos& free ) -{ - num = mHeapNum; - max = mHeapMax; - free = mHeapFree; - return mHeap; -} - -void GeomX::CopyAttributes ( GeomX& src ) -{ - GeomAttr* attr; - ClearAttributes (); - int a; - for (int n = 0; n < src.GetNumAttr(); n++) { - attr = src.GetAttribute ( n ); - a = AddAttribute ( (uchar) attr->buf, attr->name, attr->stride, false ); - mAttribute[a].offset = attr->offset; - } -} - - -void GeomX::AddHeap ( int max ) -{ - mHeap = (hval*) malloc ( max * sizeof(hval ) ); - mHeapMax = max; - mHeapNum = 0; - mHeapFree = -1; -} - -int GeomX::AddAttribute ( uchar b, std::string name, ushort stride ) -{ - return AddAttribute ( b, name, stride, true ); -} - -int GeomX::AddAttribute ( uchar b, std::string name, ushort stride, bool bExtend ) -{ - GeomBuf* buf = &mBuf[b]; - GeomAttr attr; - - attr.buf = b; - attr.name = name; - attr.offset = buf->stride; - attr.stride = stride; - - if ( bExtend ) { - int new_stride = buf->stride + attr.stride; - char* new_data = (char*) malloc ( buf->max * new_stride ); - char* old_data = buf->data; - for (int n=0; n < buf->num; n++) { - memcpy ( new_data, old_data, buf->stride ); - old_data += buf->stride; - new_data += new_stride; - } - free ( buf->data ); - buf->data = new_data; - buf->stride = new_stride; - } - mAttribute.push_back ( attr ); - return (int) mAttribute.size()-1; -} - -int GeomX::GetAttribute ( std::string name ) -{ - for (int n=0; n < (int) mAttribute.size(); n++) { - if ( mAttribute[n].name.compare ( name ) == 0 ) - return n; - } - return -1; -} - -int GeomX::GetAttrOffset ( std::string name ) -{ - for (int n=0; n < (int) mAttribute.size(); n++) { - if ( mAttribute[n].name.compare ( name ) == 0 ) - return mAttribute[n].offset; - } - return -1; -} - -int GeomX::AddBuffer ( uchar typ, ushort stride, int max ) -{ - GeomBuf buf; - buf.dtype = typ; - buf.stride = stride; - buf.max = max; - buf.num = 0; - buf.size = 0; - buf.data = (char*) malloc ( buf.max * buf.stride ); - mBuf.push_back ( buf ); - return (int) mBuf.size()-1; -} -void GeomX::ResetBuffer ( uchar b, int n ) -{ - mBuf[b].max = n; - - if ( mBuf[b].data != 0x0 ) free ( mBuf[b].data ); - - char* new_data = (char*) malloc ( mBuf[b].max * mBuf[b].stride ); - - mBuf[b].data = new_data; - - mBuf[b].num = 0; - mBuf[b].size = mBuf[b].num*mBuf[b].stride; -} - -char* GeomX::AddElem ( uchar b, href& ndx ) -{ - if ( mBuf[b].num >= mBuf[b].max ) { - if ( long(mBuf[b].max) * 2 > ELEM_MAX ) { - error.PrintF ( "geom", "Maximum number of elements reached.\n" ); - error.Exit (); - } - mBuf[b].max *= 2; - char* new_data = (char*) malloc ( mBuf[b].max * mBuf[b].stride ); - memcpy ( new_data, mBuf[b].data, mBuf[b].num*mBuf[b].stride ); - free ( mBuf[b].data ); - mBuf[b].data = new_data; - } - mBuf[b].num++; - mBuf[b].size += mBuf[b].stride; - ndx = mBuf[b].num-1; - return mBuf[b].data + ndx*mBuf[b].stride; -} - -char* GeomX::RandomElem ( uchar b, href& ndx ) -{ - ndx = mBuf[b].num * rand() / RAND_MAX; - return mBuf[b].data + ndx*mBuf[b].stride; -} - -int GeomX::AddElem ( uchar b, char* data ) -{ - if ( mBuf[b].num >= mBuf[b].max ) { - mBuf[b].max *= 2; - char* new_data = (char*) malloc ( mBuf[b].max * mBuf[b].stride ); - memcpy ( new_data, mBuf[b].data, mBuf[b].num*mBuf[b].stride ); - free ( mBuf[b].data ); - mBuf[b].data = new_data; - } - memcpy ( mBuf[b].data + mBuf[b].num*mBuf[b].stride, data, mBuf[b].stride ); - mBuf[b].num++; - mBuf[b].size += mBuf[b].stride; - return mBuf[b].num-1; -} - -bool GeomX::DelElem ( uchar b, int n ) -{ - if ( n >= 0 && n < mBuf[b].num ) { - memcpy ( mBuf[b].data + n*mBuf[b].stride, mBuf[b].data + (mBuf[b].num-1)*mBuf[b].stride, mBuf[b].stride ); - mBuf[b].num--; - mBuf[b].size -= mBuf[b].stride; - return true; - } - return false; -} - -hpos GeomX::HeapExpand ( ushort size, ushort& ret ) -{ - mHeapMax *= 2; - if ( mHeapMax > HEAP_MAX ) { - error.PrintF ( "geom", "Geom heap size exceeds range of index.\n" ); - error.Exit (); - } - hval* pNewHeap = (hval*) malloc ( mHeapMax * sizeof(hval) ); - if ( pNewHeap == 0x0 ) { - error.PrintF ( "geom", "Geom heap out of memory.\n" ); - error.Exit (); - } - memcpy ( pNewHeap, mHeap, mHeapNum*sizeof(hval) ); - free ( mHeap ); - mHeap = pNewHeap; - ret = size; - assert ( mHeapNum >= 0 && mHeapNum < mHeapMax ); - return mHeapNum; -} - -#define LIST_INIT 4 - -hpos GeomX::HeapAlloc ( ushort size, ushort& ret ) -{ - hval* pPrev = 0x0; - hval* pCurr = mHeap + mHeapFree; - hpos pos = -1; - - if ( mHeapNum + size < mHeapMax ) { - // Heap not yet full. - pos = mHeapNum; - ret = size; - mHeapNum += size; - } else { - // Heap full, search free space - if ( mHeapFree == -1 ) { - pos = HeapExpand ( size, ret ); - mHeapNum += ret; - } else { - while ( *pCurr < size && pCurr != mHeap-1 ) { - pPrev = pCurr; - pCurr = mHeap + * (hpos*) (pCurr + FPOS); - } - if ( pCurr != mHeap-1 ) { - // Found free space. - if ( pPrev == 0x0 ) { - mHeapFree = * (hpos*) (pCurr + FPOS); - assert ( mHeapFree >= -1 ); - } else { - * (hpos*) (pPrev+FPOS) = * (hpos*) (pCurr+FPOS); - } - pos = pCurr-mHeap; - ret = *pCurr; - } else { - // Heap full, no free space. Expand heap. - pos = HeapExpand ( size, ret ); - mHeapNum += ret; - } - } - } - - assert ( pos >= 0 && pos <= mHeapNum ); - memset ( mHeap+pos, 0, size*sizeof(hval) ); - return pos; -} - -void GeomX::HeapAddFree ( hpos pos, int size ) -{ - // memset ( mHeap+pos, 0xFF, size*sizeof(hval) ); - - if ( pos < mHeapFree || mHeapFree == -1 ) { - // Lowest position. Insert at head of heap. - * (hpos*) (mHeap+pos) = size; - * (hpos*) (mHeap+pos + FPOS) = mHeapFree; - mHeapFree = pos; - if ( mHeapFree != -1 && *(hpos*) (mHeap+mHeapFree+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pHeapFree, %d\n", pos ); error.Exit (); } - - assert ( mHeapFree >= -1 ); - } else { - hval* pCurr = mHeap + pos; - hval* pPrev = 0x0; - hval* pNext = mHeap + mHeapFree; - - if ( pCurr == pNext ) { // Freeing the first block - mHeapFree = * (hpos*) (pCurr + FPOS); - * (hpos*) (mHeap+mHeapFree + FPOS) = 0xFFFFFFFF; - * (hpos*) (pCurr + FPOS) = 0xFFFFFFFF; - * (hpos*) pCurr = 0xFFFFFFFF; - return; - - } - - // Find first block greater than new free pos. - while ( pNext < pCurr && pNext != mHeap-1 ) { - pPrev = pNext; - pNext = mHeap + * (hpos*) (pNext + FPOS); - } - - int x = 0; - if ( pPrev + *(pPrev) == pCurr ) { // Prev block touches current one (expand previous) - * (hpos*) pPrev += size; // - prev.size = prev.size + curr.size - x=1; - - } else if ( pCurr + size == pNext && pNext != mHeap-1 ) { // Curr block touches next one (expand current block) - * (hpos*) (pPrev + FPOS) = pos; // - prev.next = curr - * (hpos*) (pCurr + FPOS) = * (hpos*) (pNext + FPOS); // - curr.next = next.next - * (hpos*) pCurr = size + * (hpos*) pNext; // - curr.size = size + next.size - * (hpos*) (pNext) = 0xFFFFFFFF; // - curr = null - * (hpos*) (pNext + FPOS) = 0xFFFFFFFF; // - curr.next = null - x=2; - - } else { // Otherwise (linked list insert) - * (hpos*) (pPrev + FPOS) = pos; // - prev.next = curr - if ( pNext != mHeap-1 ) - * (hpos*) (pCurr + FPOS) = pNext - mHeap; // - curr.next = next - else - * (hpos*) (pCurr + FPOS) = 0xFFFFFFFF; // - curr.next = null (no next node) - * (hpos*) pCurr = size; // - curr.size = size - x=3; - } - if ( pCurr !=mHeap-1 && *(hpos*) (pCurr+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pCurr, %d, %d\n", x, pos ); error.Exit (); } - if ( pPrev !=mHeap-1 && *(hpos*) (pPrev+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pPrev, %d, %d\n", x, pos ); error.Exit (); } - if ( pNext !=mHeap-1 && *(hpos*) (pNext+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pNext, %d, %d\n", x, pos ); error.Exit (); } - if ( *(hpos*) (mHeap+mHeapFree+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pHeapFree, %d, %d\n", x, pos ); error.Exit (); } - - // -- check for bugs (remove eventually) - pNext = mHeap + mHeapFree; - while ( pNext != mHeap-1 ) { - pPrev = pNext; - pNext = mHeap + * (hpos*) (pNext + FPOS); - if ( pNext < pPrev && pNext != mHeap-1 ) { - error.PrintF ( "geomx", "ERROR: Heap free space out of order. %d, %d\n", x, pos ); - error.Exit (); - } - } - //--- - } - } - -void GeomX::ClearRefs ( hList& list ) -{ - list.cnt = 0; - list.max = 0; - list.pos = 0; -} - -hval GeomX::AddRef ( hval r, hList& list, hval delta ) -{ - if ( list.max == 0 ) { - list.cnt = 1; - list.pos = HeapAlloc ( LIST_INIT, list.max ); - *(mHeap + list.pos) = r+delta; - } else { - if ( list.cnt >= list.max ) { - int siz = list.max; - hpos new_pos = HeapAlloc ( siz+LIST_INIT, list.max ); // Alloc new location - //printf ( "MOVE %d -> %d\n", list.pos, new_pos ); - memcpy ( mHeap+new_pos, mHeap+list.pos, list.cnt*sizeof(hval) ); // Copy data to new location - HeapAddFree ( list.pos, siz ); // Free old location - list.pos = new_pos; - - } - *(mHeap + list.pos + list.cnt) = r+delta; - list.cnt++; - } - return list.pos; +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "geomx.h" +#include "mdebug.h" + +#include + +GeomX::GeomX () +{ + mHeap = 0x0; +} + +void GeomX::FreeBuffers () +{ + for (int n=0; n < (int) mBuf.size(); n++) { + free ( mBuf[n].data ); + mBuf[n].data = 0x0; + } + mBuf.clear (); + + if ( mHeap != 0x0 ) free ( mHeap ); + mHeap = 0x0; + mHeapNum = 0; + mHeapMax = 0; +} + +void GeomX::ResetHeap () +{ + mHeapNum = 0; + mHeapFree = -1; +} + +int GeomX::GetSize () +{ + int sum = mHeapNum * sizeof(hval) ; + for (int n=0; n < (int) mBuf.size(); n++) + sum += mBuf[n].size; + sum += (int) mAttribute.size() * sizeof(GeomAttr); + return sum; +} + +void GeomX::ClearAttributes () +{ + mAttribute.clear (); +} + +int GeomX::CopyBuffer ( uchar bdest, uchar bsrc, GeomX& src ) +{ + if ( bsrc >= src.GetNumBuf() ) return -1; + + if ( bdest >= GetNumBuf() ) { + for (int n=0; n <= bdest - GetNumBuf(); n++ ) + AddBuffer ( 0, 0, 0 ); + } + if ( mBuf[bdest].data != 0x0 ) { + free ( mBuf[bdest].data ); + mBuf[bdest].data = 0x0; + } + + GeomBuf* buf = src.GetBuffer( bsrc ); + mBuf[bdest].dtype = buf->dtype; + mBuf[bdest].max = buf->max; + mBuf[bdest].num = buf->num; + mBuf[bdest].stride = buf->stride; + mBuf[bdest].size = buf->size; + mBuf[bdest].data = (char*) malloc ( mBuf[bdest].max * mBuf[bdest].stride ); + memcpy ( mBuf[bdest].data, buf->data, mBuf[bdest].num * mBuf[bdest].stride ); + + return bdest; +} + + +void GeomX::CopyBuffers ( GeomX& src ) +{ + FreeBuffers (); + for (int n = 0; n < src.GetNumBuf(); n++) + CopyBuffer ( n, n, src ); + CopyHeap ( src ); +} + +void GeomX::CopyHeap ( GeomX& src ) +{ + hpos num, max, freepos; + hval* src_data = src.GetHeap ( num, max, freepos ); + + if ( mHeap != 0x0 ) { + free ( mHeap ); + mHeap = 0x0; + } + + mHeap = (hval*) malloc ( max * sizeof(hval) ); + mHeapMax = max; + mHeapNum = num; + mHeapFree = freepos; + + memcpy ( mHeap, src_data, mHeapNum * sizeof(hval) ); +} + +hval* GeomX::GetHeap ( hpos& num, hpos& max, hpos& free ) +{ + num = mHeapNum; + max = mHeapMax; + free = mHeapFree; + return mHeap; +} + +void GeomX::CopyAttributes ( GeomX& src ) +{ + GeomAttr* attr; + ClearAttributes (); + int a; + for (int n = 0; n < src.GetNumAttr(); n++) { + attr = src.GetAttribute ( n ); + a = AddAttribute ( (uchar) attr->buf, attr->name, attr->stride, false ); + mAttribute[a].offset = attr->offset; + } +} + + +void GeomX::AddHeap ( int max ) +{ + mHeap = (hval*) malloc ( max * sizeof(hval ) ); + mHeapMax = max; + mHeapNum = 0; + mHeapFree = -1; +} + +int GeomX::AddAttribute ( uchar b, std::string name, ushort stride ) +{ + return AddAttribute ( b, name, stride, true ); +} + +int GeomX::AddAttribute ( uchar b, std::string name, ushort stride, bool bExtend ) +{ + GeomBuf* buf = &mBuf[b]; + GeomAttr attr; + + attr.buf = b; + attr.name = name; + attr.offset = buf->stride; + attr.stride = stride; + + if ( bExtend ) { + int new_stride = buf->stride + attr.stride; + char* new_data = (char*) malloc ( buf->max * new_stride ); + char* old_data = buf->data; + for (int n=0; n < buf->num; n++) { + memcpy ( new_data, old_data, buf->stride ); + old_data += buf->stride; + new_data += new_stride; + } + free ( buf->data ); + buf->data = new_data; + buf->stride = new_stride; + } + mAttribute.push_back ( attr ); + return (int) mAttribute.size()-1; +} + +int GeomX::GetAttribute ( std::string name ) +{ + for (int n=0; n < (int) mAttribute.size(); n++) { + if ( mAttribute[n].name.compare ( name ) == 0 ) + return n; + } + return -1; +} + +int GeomX::GetAttrOffset ( std::string name ) +{ + for (int n=0; n < (int) mAttribute.size(); n++) { + if ( mAttribute[n].name.compare ( name ) == 0 ) + return mAttribute[n].offset; + } + return -1; +} + +int GeomX::AddBuffer ( uchar typ, ushort stride, int max ) +{ + GeomBuf buf; + buf.dtype = typ; + buf.stride = stride; + buf.max = max; + buf.num = 0; + buf.size = 0; + buf.data = (char*) malloc ( buf.max * buf.stride ); + mBuf.push_back ( buf ); + return (int) mBuf.size()-1; +} +void GeomX::ResetBuffer ( uchar b, int n ) +{ + mBuf[b].max = n; + + if ( mBuf[b].data != 0x0 ) free ( mBuf[b].data ); + + char* new_data = (char*) malloc ( mBuf[b].max * mBuf[b].stride ); + + mBuf[b].data = new_data; + + mBuf[b].num = 0; + mBuf[b].size = mBuf[b].num*mBuf[b].stride; +} + +char* GeomX::AddElem ( uchar b, href& ndx ) +{ + if ( mBuf[b].num >= mBuf[b].max ) { + if ( long(mBuf[b].max) * 2 > ELEM_MAX ) { + error.PrintF ( "geom", "Maximum number of elements reached.\n" ); + error.Exit (); + } + mBuf[b].max *= 2; + char* new_data = (char*) malloc ( mBuf[b].max * mBuf[b].stride ); + memcpy ( new_data, mBuf[b].data, mBuf[b].num*mBuf[b].stride ); + free ( mBuf[b].data ); + mBuf[b].data = new_data; + } + mBuf[b].num++; + mBuf[b].size += mBuf[b].stride; + ndx = mBuf[b].num-1; + return mBuf[b].data + ndx*mBuf[b].stride; +} + +char* GeomX::RandomElem ( uchar b, href& ndx ) +{ + ndx = mBuf[b].num * rand() / RAND_MAX; + return mBuf[b].data + ndx*mBuf[b].stride; +} + +int GeomX::AddElem ( uchar b, char* data ) +{ + if ( mBuf[b].num >= mBuf[b].max ) { + mBuf[b].max *= 2; + char* new_data = (char*) malloc ( mBuf[b].max * mBuf[b].stride ); + memcpy ( new_data, mBuf[b].data, mBuf[b].num*mBuf[b].stride ); + free ( mBuf[b].data ); + mBuf[b].data = new_data; + } + memcpy ( mBuf[b].data + mBuf[b].num*mBuf[b].stride, data, mBuf[b].stride ); + mBuf[b].num++; + mBuf[b].size += mBuf[b].stride; + return mBuf[b].num-1; +} + +bool GeomX::DelElem ( uchar b, int n ) +{ + if ( n >= 0 && n < mBuf[b].num ) { + memcpy ( mBuf[b].data + n*mBuf[b].stride, mBuf[b].data + (mBuf[b].num-1)*mBuf[b].stride, mBuf[b].stride ); + mBuf[b].num--; + mBuf[b].size -= mBuf[b].stride; + return true; + } + return false; +} + +hpos GeomX::HeapExpand ( ushort size, ushort& ret ) +{ + mHeapMax *= 2; + if ( mHeapMax > HEAP_MAX ) { + error.PrintF ( "geom", "Geom heap size exceeds range of index.\n" ); + error.Exit (); + } + hval* pNewHeap = (hval*) malloc ( mHeapMax * sizeof(hval) ); + if ( pNewHeap == 0x0 ) { + error.PrintF ( "geom", "Geom heap out of memory.\n" ); + error.Exit (); + } + memcpy ( pNewHeap, mHeap, mHeapNum*sizeof(hval) ); + free ( mHeap ); + mHeap = pNewHeap; + ret = size; + assert ( mHeapNum >= 0 && mHeapNum < mHeapMax ); + return mHeapNum; +} + +#define LIST_INIT 4 + +hpos GeomX::HeapAlloc ( ushort size, ushort& ret ) +{ + hval* pPrev = 0x0; + hval* pCurr = mHeap + mHeapFree; + hpos pos = -1; + + if ( mHeapNum + size < mHeapMax ) { + // Heap not yet full. + pos = mHeapNum; + ret = size; + mHeapNum += size; + } else { + // Heap full, search free space + if ( mHeapFree == -1 ) { + pos = HeapExpand ( size, ret ); + mHeapNum += ret; + } else { + while ( *pCurr < size && pCurr != mHeap-1 ) { + pPrev = pCurr; + pCurr = mHeap + * (hpos*) (pCurr + FPOS); + } + if ( pCurr != mHeap-1 ) { + // Found free space. + if ( pPrev == 0x0 ) { + mHeapFree = * (hpos*) (pCurr + FPOS); + assert ( mHeapFree >= -1 ); + } else { + * (hpos*) (pPrev+FPOS) = * (hpos*) (pCurr+FPOS); + } + pos = pCurr-mHeap; + ret = *pCurr; + } else { + // Heap full, no free space. Expand heap. + pos = HeapExpand ( size, ret ); + mHeapNum += ret; + } + } + } + + assert ( pos >= 0 && pos <= mHeapNum ); + memset ( mHeap+pos, 0, size*sizeof(hval) ); + return pos; +} + +void GeomX::HeapAddFree ( hpos pos, int size ) +{ + // memset ( mHeap+pos, 0xFF, size*sizeof(hval) ); + + if ( pos < mHeapFree || mHeapFree == -1 ) { + // Lowest position. Insert at head of heap. + * (hpos*) (mHeap+pos) = size; + * (hpos*) (mHeap+pos + FPOS) = mHeapFree; + mHeapFree = pos; + if ( mHeapFree != -1 && *(hpos*) (mHeap+mHeapFree+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pHeapFree, %d\n", pos ); error.Exit (); } + + assert ( mHeapFree >= -1 ); + } else { + hval* pCurr = mHeap + pos; + hval* pPrev = 0x0; + hval* pNext = mHeap + mHeapFree; + + if ( pCurr == pNext ) { // Freeing the first block + mHeapFree = * (hpos*) (pCurr + FPOS); + * (hpos*) (mHeap+mHeapFree + FPOS) = 0xFFFFFFFF; + * (hpos*) (pCurr + FPOS) = 0xFFFFFFFF; + * (hpos*) pCurr = 0xFFFFFFFF; + return; + + } + + // Find first block greater than new free pos. + while ( pNext < pCurr && pNext != mHeap-1 ) { + pPrev = pNext; + pNext = mHeap + * (hpos*) (pNext + FPOS); + } + + int x = 0; + if ( pPrev + *(pPrev) == pCurr ) { // Prev block touches current one (expand previous) + * (hpos*) pPrev += size; // - prev.size = prev.size + curr.size + x=1; + + } else if ( pCurr + size == pNext && pNext != mHeap-1 ) { // Curr block touches next one (expand current block) + * (hpos*) (pPrev + FPOS) = pos; // - prev.next = curr + * (hpos*) (pCurr + FPOS) = * (hpos*) (pNext + FPOS); // - curr.next = next.next + * (hpos*) pCurr = size + * (hpos*) pNext; // - curr.size = size + next.size + * (hpos*) (pNext) = 0xFFFFFFFF; // - curr = null + * (hpos*) (pNext + FPOS) = 0xFFFFFFFF; // - curr.next = null + x=2; + + } else { // Otherwise (linked list insert) + * (hpos*) (pPrev + FPOS) = pos; // - prev.next = curr + if ( pNext != mHeap-1 ) + * (hpos*) (pCurr + FPOS) = pNext - mHeap; // - curr.next = next + else + * (hpos*) (pCurr + FPOS) = 0xFFFFFFFF; // - curr.next = null (no next node) + * (hpos*) pCurr = size; // - curr.size = size + x=3; + } + if ( pCurr !=mHeap-1 && *(hpos*) (pCurr+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pCurr, %d, %d\n", x, pos ); error.Exit (); } + if ( pPrev !=mHeap-1 && *(hpos*) (pPrev+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pPrev, %d, %d\n", x, pos ); error.Exit (); } + if ( pNext !=mHeap-1 && *(hpos*) (pNext+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pNext, %d, %d\n", x, pos ); error.Exit (); } + if ( *(hpos*) (mHeap+mHeapFree+FPOS) == 0x0 ) { error.PrintF ( "geomx", "ERROR: Heap pointer 0. pHeapFree, %d, %d\n", x, pos ); error.Exit (); } + + // -- check for bugs (remove eventually) + pNext = mHeap + mHeapFree; + while ( pNext != mHeap-1 ) { + pPrev = pNext; + pNext = mHeap + * (hpos*) (pNext + FPOS); + if ( pNext < pPrev && pNext != mHeap-1 ) { + error.PrintF ( "geomx", "ERROR: Heap free space out of order. %d, %d\n", x, pos ); + error.Exit (); + } + } + //--- + } + } + +void GeomX::ClearRefs ( hList& list ) +{ + list.cnt = 0; + list.max = 0; + list.pos = 0; +} + +hval GeomX::AddRef ( hval r, hList& list, hval delta ) +{ + if ( list.max == 0 ) { + list.cnt = 1; + list.pos = HeapAlloc ( LIST_INIT, list.max ); + *(mHeap + list.pos) = r+delta; + } else { + if ( list.cnt >= list.max ) { + int siz = list.max; + hpos new_pos = HeapAlloc ( siz+LIST_INIT, list.max ); // Alloc new location + //printf ( "MOVE %d -> %d\n", list.pos, new_pos ); + memcpy ( mHeap+new_pos, mHeap+list.pos, list.cnt*sizeof(hval) ); // Copy data to new location + HeapAddFree ( list.pos, siz ); // Free old location + list.pos = new_pos; + + } + *(mHeap + list.pos + list.cnt) = r+delta; + list.cnt++; + } + return list.pos; } \ No newline at end of file diff --git a/Extras/sph/common/geomx.h b/Extras/sph/common/geomx.h index 2c272d7ae..e1f20f6d1 100644 --- a/Extras/sph/common/geomx.h +++ b/Extras/sph/common/geomx.h @@ -1,125 +1,125 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 DEF_GEOM - #define DEF_GEOM - - #include - - #define HEAP_MAX 2147483640 // largest heap size (range of hpos) - - #define ELEM_MAX 2147483640 // largest number of elements in a buffer (range of hval) - //#define ELEM_MAX 32768 // largest number of elements in a buffer (range of hval) - - #define BUF_UNDEF 255 - - #define FPOS 2 // free position offsets - typedef unsigned char uchar; - typedef unsigned short ushort; - typedef signed int hpos; // pointers into heap - typedef signed int hval; // values in heap - typedef hval href; // values are typically references - struct hList { - ushort cnt; - ushort max; - hpos pos; - }; - - class GeomAttr { - public: - GeomAttr() { name = ""; buf = 0; stride = 0; offset = 0; } - std::string name; - ushort buf; - ushort stride; - ushort offset; - }; - - class GeomBuf { - public: - GeomBuf() { dtype = 0; num = 0; max = 0; stride = 0; data = 0x0; } - uchar dtype; - hval num; - hval max; - long size; - ushort stride; - char* data; - }; - - class GeomX { - public: - GeomX (); - - // virtual objType GetType () { return 'geom'; } - - // Basic geometry setup - void FreeBuffers (); - void ClearAttributes (); - void AddHeap ( int max ); - int CopyBuffer ( uchar bdest, uchar bsrc, GeomX& src ); - void CopyBuffers ( GeomX& src ); - void CopyAttributes ( GeomX& src ); - void CopyHeap ( GeomX& src ); - void ResetBuffer ( uchar b, int n ); - void ResetHeap (); - int AddBuffer ( uchar typ, ushort stride, int max ); - int AddAttribute ( uchar b, std::string name, ushort stride ); - int AddAttribute ( uchar b, std::string name, ushort stride, bool bExtend ); - int GetAttribute ( std::string name ); - int GetAttrOffset ( std::string name ); - int NumElem ( uchar b ) { if ( b==BUF_UNDEF) return 0; else return mBuf[b].num; } - int MaxElem ( uchar b ) { if ( b==BUF_UNDEF) return 0; else return mBuf[b].max; } - int GetStride ( uchar b ) { return mBuf[b].stride; } - char* GetElem ( uchar b, int n ) { return mBuf[b].data + n*mBuf[b].stride; } - char* RandomElem ( uchar b, href& ndx ); - char* AddElem ( uchar b, href& pos ); - int AddElem ( uchar b, char* data ); - bool DelElem ( uchar b, int n ); - char* GetStart ( uchar b ) { return mBuf[b].data; } - char* GetEnd ( uchar b ) { return mBuf[b].data + mBuf[b].num*mBuf[b].stride; } - GeomBuf* GetBuffer ( uchar b ) { return &mBuf[b]; } - GeomAttr* GetAttribute ( int n ) { return &mAttribute[n]; } - int GetNumBuf () { return (int) mBuf.size(); } - int GetNumAttr () { return (int) mAttribute.size(); } - hval* GetHeap ( hpos& num, hpos& max, hpos& free ); - - int GetSize (); - - /*int AddRef ( int b, int n, int ref, ushort listpos ); - int AddRef ( int b, int n, int ref, bool bUseHeap, ushort listpos, ushort width );*/ - void ClearRefs ( hList& list ); - hval AddRef ( hval r, hList& list, hval delta ); - hpos HeapAlloc ( ushort size, ushort& ret ); - hpos HeapExpand ( ushort size, ushort& ret ); - void HeapAddFree ( hpos pos, int size ); - - - protected: - std::vector< GeomBuf > mBuf; - std::vector< GeomAttr > mAttribute; - - hpos mHeapNum; - hpos mHeapMax; - hpos mHeapFree; - hval* mHeap; - }; - -#endif +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 DEF_GEOM + #define DEF_GEOM + + #include + + #define HEAP_MAX 2147483640 // largest heap size (range of hpos) + + #define ELEM_MAX 2147483640 // largest number of elements in a buffer (range of hval) + //#define ELEM_MAX 32768 // largest number of elements in a buffer (range of hval) + + #define BUF_UNDEF 255 + + #define FPOS 2 // free position offsets + typedef unsigned char uchar; + typedef unsigned short ushort; + typedef signed int hpos; // pointers into heap + typedef signed int hval; // values in heap + typedef hval href; // values are typically references + struct hList { + ushort cnt; + ushort max; + hpos pos; + }; + + class GeomAttr { + public: + GeomAttr() { name = ""; buf = 0; stride = 0; offset = 0; } + std::string name; + ushort buf; + ushort stride; + ushort offset; + }; + + class GeomBuf { + public: + GeomBuf() { dtype = 0; num = 0; max = 0; stride = 0; data = 0x0; } + uchar dtype; + hval num; + hval max; + long size; + ushort stride; + char* data; + }; + + class GeomX { + public: + GeomX (); + + // virtual objType GetType () { return 'geom'; } + + // Basic geometry setup + void FreeBuffers (); + void ClearAttributes (); + void AddHeap ( int max ); + int CopyBuffer ( uchar bdest, uchar bsrc, GeomX& src ); + void CopyBuffers ( GeomX& src ); + void CopyAttributes ( GeomX& src ); + void CopyHeap ( GeomX& src ); + void ResetBuffer ( uchar b, int n ); + void ResetHeap (); + int AddBuffer ( uchar typ, ushort stride, int max ); + int AddAttribute ( uchar b, std::string name, ushort stride ); + int AddAttribute ( uchar b, std::string name, ushort stride, bool bExtend ); + int GetAttribute ( std::string name ); + int GetAttrOffset ( std::string name ); + int NumElem ( uchar b ) { if ( b==BUF_UNDEF) return 0; else return mBuf[b].num; } + int MaxElem ( uchar b ) { if ( b==BUF_UNDEF) return 0; else return mBuf[b].max; } + int GetStride ( uchar b ) { return mBuf[b].stride; } + char* GetElem ( uchar b, int n ) { return mBuf[b].data + n*mBuf[b].stride; } + char* RandomElem ( uchar b, href& ndx ); + char* AddElem ( uchar b, href& pos ); + int AddElem ( uchar b, char* data ); + bool DelElem ( uchar b, int n ); + char* GetStart ( uchar b ) { return mBuf[b].data; } + char* GetEnd ( uchar b ) { return mBuf[b].data + mBuf[b].num*mBuf[b].stride; } + GeomBuf* GetBuffer ( uchar b ) { return &mBuf[b]; } + GeomAttr* GetAttribute ( int n ) { return &mAttribute[n]; } + int GetNumBuf () { return (int) mBuf.size(); } + int GetNumAttr () { return (int) mAttribute.size(); } + hval* GetHeap ( hpos& num, hpos& max, hpos& free ); + + int GetSize (); + + /*int AddRef ( int b, int n, int ref, ushort listpos ); + int AddRef ( int b, int n, int ref, bool bUseHeap, ushort listpos, ushort width );*/ + void ClearRefs ( hList& list ); + hval AddRef ( hval r, hList& list, hval delta ); + hpos HeapAlloc ( ushort size, ushort& ret ); + hpos HeapExpand ( ushort size, ushort& ret ); + void HeapAddFree ( hpos pos, int size ); + + + protected: + std::vector< GeomBuf > mBuf; + std::vector< GeomAttr > mAttribute; + + hpos mHeapNum; + hpos mHeapMax; + hpos mHeapFree; + hval* mHeap; + }; + +#endif diff --git a/Extras/sph/common/gl_helper.cpp b/Extras/sph/common/gl_helper.cpp index 922d5583f..dce10d15d 100644 --- a/Extras/sph/common/gl_helper.cpp +++ b/Extras/sph/common/gl_helper.cpp @@ -1,402 +1,402 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "common_defs.h" -#include "gl_helper.h" - -#include - - -// Shadow Light -float light_proj[16]; -float light_x, light_y, light_z; -float light_tox, light_toy, light_toz; -float light_mfov; - -// Fonts -void *font = GLUT_BITMAP_8_BY_13; -void *fonts[] = {GLUT_BITMAP_9_BY_15, - GLUT_BITMAP_TIMES_ROMAN_10, - GLUT_BITMAP_TIMES_ROMAN_24}; -// Timing -mint::Time tm_last; -int tm_cnt; -float tm_fps; - -GLuint glSphere = 65535; -float glRadius = 0.0; - -void setSphereRadius ( float r ) -{ - if ( glRadius == r ) return; - glRadius = r; - - // GL sphere - if ( glSphere != 65535 ) glDeleteLists ( glSphere, 1 ); - glSphere = glGenLists ( 1 ); - float x, y, z, x1, y1, z1; - glNewList ( glSphere, GL_COMPILE ); - glBegin ( GL_TRIANGLE_STRIP ); - for ( float tilt=-90; tilt <= 90; tilt += 10.0) { - for ( float ang=0; ang <= 360; ang += 30.0) { - x = sin ( ang*DEGtoRAD) * cos ( tilt*DEGtoRAD ); - y = cos ( ang*DEGtoRAD) * cos ( tilt*DEGtoRAD ); - z = sin ( tilt*DEGtoRAD ) ; - x1 = sin ( ang*DEGtoRAD) * cos ( (tilt+10.0)*DEGtoRAD ) ; - y1 = cos ( ang*DEGtoRAD) * cos ( (tilt+10.0)*DEGtoRAD ) ; - z1 = sin ( (tilt+10.0)*DEGtoRAD ); - glNormal3f ( x, y, z ); glVertex3f ( x*r, y*r, z*r ); - glNormal3f ( x1, y1, z1 ); glVertex3f ( x1*r, y1*r, z1*r ); - } - } - glEnd (); - glEndList (); -} - -void drawSphere () -{ - if ( glRadius == 0.0 ) setSphereRadius ( 1.0 ); - glCallList ( glSphere ); -} - -// Check if there have been any openGL problems -void checkOpenGL () -{ - GLenum errCode = glGetError(); - if (errCode != GL_NO_ERROR) { - const GLubyte* errString = gluErrorString(errCode); - fprintf( stderr, "OpenGL error: %s\n", errString ); - } -} - -void drawText ( int x, int y, char* msg) -{ - int len, i; - glRasterPos2f(x, y); - len = (int) strlen(msg); - for (i = 0; i < len; i++) - glutBitmapCharacter(font, msg[i]); -} - -void drawGrid () -{ - glColor3f ( 0.3, 0.3, 0.3 ); - glBegin ( GL_LINES ); - for (float x=-40; x<=40.0; x+=10.0 ) { - glVertex3f ( x, -40.0, 0 ); - glVertex3f ( x, 40.0, 0 ); - } - for (float y=-40; y<=40.0; y+=10.0 ) { - glVertex3f ( -40.0, y, 0 ); - glVertex3f ( 40.0, y, 0 ); - } - glEnd (); -} - -void measureFPS () -{ - // Measure FPS - mint::Time tm_elaps; - if ( ++tm_cnt > 5 ) { - tm_elaps.SetSystemTime ( ACC_NSEC ); // get current sytem time - accurate to 1 ns - tm_elaps = tm_elaps - tm_last; // get elapsed time from 5 frames ago - tm_fps = 5.0 * 1000.0 / tm_elaps.GetMSec (); // compute fps - tm_cnt = 0; // reset frame counter - tm_last.SetSystemTime ( ACC_NSEC ); - } -} - -void checkFrameBuffers () -{ - GLenum status; - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - switch(status) { - case GL_FRAMEBUFFER_COMPLETE_EXT: printf ( "FBO complete\n" ); break; - case GL_FRAMEBUFFER_UNSUPPORTED_EXT: printf ( "FBO format unsupported\n"); break; - default: printf ( "Unknown FBO error\n"); - } -} - -void disableShadows () - { - glDisable ( GL_TEXTURE_2D ); - - glActiveTextureARB( GL_TEXTURE1_ARB ); - glBindTexture ( GL_TEXTURE_2D, 0 ); - glDisable ( GL_TEXTURE_GEN_S ); - glDisable ( GL_TEXTURE_GEN_T ); - glDisable ( GL_TEXTURE_GEN_R ); - glDisable ( GL_TEXTURE_GEN_Q ); - - glActiveTextureARB( GL_TEXTURE2_ARB ); - glBindTexture ( GL_TEXTURE_2D, 0 ); - glDisable ( GL_TEXTURE_GEN_S ); - glDisable ( GL_TEXTURE_GEN_T ); - glDisable ( GL_TEXTURE_GEN_R ); - glDisable ( GL_TEXTURE_GEN_Q ); - } - -#ifdef USE_SHADOWS - // Materials & Textures - GLuint shadow1_id = 0; // display buffer shadows - GLuint shadow2_id = 0; // display buffer shadows - - // Frame buffer - GLuint frameBufferObject = 0; // frame buffer shadows - - void createFrameBuffer () - { - //Generate the frame buffer object - glGenFramebuffersEXT (1, &frameBufferObject); - glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferObject); // Turn on frame buffer object - glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow1_id, 0); - glDrawBuffer (GL_NONE); // Set Draw & ReadBuffer to none since we're rendering depth only - glReadBuffer (GL_NONE); - checkFrameBuffers (); // Check completeness of frame buffer object (no need for stencil and depth attachement) - glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); // Turn off frame buffer object - } - - void createShadowTextures () - { - // Create depth texture maps - glActiveTextureARB( GL_TEXTURE1_ARB ); - glGenTextures( 1, &shadow1_id ); - glBindTexture ( GL_TEXTURE_2D, shadow1_id ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - - //-- sets region outside shadow to 0 - //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB ); - //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB ); - - //-- sets region outside shadow to 1 (border edge color) - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - - glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); - glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB, TEX_SIZE, TEX_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0); - - glActiveTextureARB( GL_TEXTURE2_ARB ); - glGenTextures( 1, &shadow2_id ); - glBindTexture ( GL_TEXTURE_2D, shadow2_id ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB ); - //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); - glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB, TEX_SIZE, TEX_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0); - } - - void computeLightMatrix ( int n, int tx, int ty ) - { - int lnum = n; - // Construct projective texturing matrix - - // S - light bias matrix - glMatrixMode ( GL_MODELVIEW ); - glLoadIdentity (); - glTranslatef ( 0.5, 0.5, 0.5 ); - glScalef ( 0.5, 0.5, 0.5 ); - // Plight - light projection matrix - gluPerspective ( light_mfov*2.0, float(tx) / ty, LIGHT_NEAR, LIGHT_FAR ); - // L^-1 - light view inverse matrix - gluLookAt ( light_x, light_y, light_z, light_tox, light_toy, light_toz, 0, 0, 1); - glPushMatrix (); - glGetFloatv ( GL_MODELVIEW_MATRIX, light_proj ); - glPopMatrix (); - - } - - void renderDepthMap_Clear ( float wx, float wy ) - { - glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferObject); - glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow1_id, 0); - glActiveTextureARB( GL_TEXTURE1_ARB ); // TEXTURE1 = shadow map stage - glViewport (1, 1, TEX_SIZE-2, TEX_SIZE-2); // Note: Avoid artifact cause by drawing into border pixels - glClear ( GL_DEPTH_BUFFER_BIT ); - glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); - glViewport ( 0, 0, (GLsizei) wx, (GLsizei) wy ); - } - - void renderDepthMap_FrameBuffer ( int n, float wx, float wy ) - { - float vmat[16]; - - computeLightMatrix ( n, TEX_SIZE, TEX_SIZE ); - - glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferObject); - - if ( n == 0 ) { - glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow1_id, 0); - } else { - glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow2_id, 0); - } - - if ( n == 0 ) glActiveTextureARB( GL_TEXTURE1_ARB ); // TEXTURE1 = shadow map stage - else glActiveTextureARB( GL_TEXTURE2_ARB ); // TEXTURE2 = shadow map stage - - glViewport (1, 1, TEX_SIZE-2, TEX_SIZE-2); // Note: Avoid artifact cause by drawing into border pixels - glClear ( GL_DEPTH_BUFFER_BIT ); - glLoadIdentity(); - - // Plight - projection matrix of light - glMatrixMode ( GL_PROJECTION ); // Setup projection for depth-map rendering - glLoadIdentity (); - gluPerspective ( light_mfov*2.0, float(TEX_SIZE) / TEX_SIZE, LIGHT_NEAR, LIGHT_FAR ); - - // L^-1 - light view matrix (gluLookAt computes inverse) - glMatrixMode ( GL_MODELVIEW); // Setup view for depth-map rendering - glLoadIdentity (); - gluLookAt ( light_x, light_y, light_z, light_tox, light_toy, light_toz, 0, 0, 1); - glPushMatrix (); // Save view matrix for later - glGetFloatv ( GL_MODELVIEW_MATRIX, vmat ); - glPopMatrix (); - - glDisable ( GL_LIGHTING ); - glColor4f ( 1, 1, 1, 1 ); - glShadeModel (GL_FLAT); // No shading (faster) - - glEnable ( GL_CULL_FACE ); - glCullFace ( GL_FRONT ); - - glEnable ( GL_POLYGON_OFFSET_FILL ); - glPolygonOffset ( 50.0, 0.1 ); // Depth bias - - drawScene ( &vmat[0], false ); // Draw scene. - - glDisable ( GL_POLYGON_OFFSET_FILL ); - glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); - glViewport ( 0, 0, (GLsizei) wx, (GLsizei) wy ); - - //glCullFace (GL_BACK); // Restore render states - //glBindTexture ( GL_TEXTURE_2D, 0); - } - - void renderShadowStage ( int n, float* vmat ) - { - GLfloat pos[4]; - GLfloat row[4]; - - computeLightMatrix ( n, TEX_SIZE, TEX_SIZE ); - if ( n == 0 ) { - glActiveTextureARB( GL_TEXTURE1_ARB ); // TEXTURE1 = shadow map stage #1 - } else { - glActiveTextureARB( GL_TEXTURE2_ARB ); // TEXTURE2 = shadow map stage #2 - } - glEnable ( GL_TEXTURE_2D ); - if ( n == 0 ) glBindTexture ( GL_TEXTURE_2D, shadow1_id ); - else glBindTexture ( GL_TEXTURE_2D, shadow2_id ); - - glMatrixMode( GL_MODELVIEW ); - glLoadMatrixf ( vmat ); - - row[0] = light_proj[0]; row[1] = light_proj[4]; row[2] = light_proj[8]; row[3] = light_proj[12]; - glTexGenfv(GL_S, GL_EYE_PLANE, &row[0] ); - row[0] = light_proj[1]; row[1] = light_proj[5]; row[2] = light_proj[9]; row[3] = light_proj[13]; - glTexGenfv(GL_T, GL_EYE_PLANE, &row[0] ); - row[0] = light_proj[2]; row[1] = light_proj[6]; row[2] = light_proj[10]; row[3] = light_proj[14]; - glTexGenfv(GL_R, GL_EYE_PLANE, &row[0] ); - row[0] = light_proj[3]; row[1] = light_proj[7]; row[2] = light_proj[11]; row[3] = light_proj[15]; - glTexGenfv(GL_Q, GL_EYE_PLANE, &row[0] ); - glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_GEN_R); - glEnable(GL_TEXTURE_GEN_Q); - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE ); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE ) ; - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE ) ; - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS ) ; - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT ) ; - - pos[0] = 0.20; - pos[1] = 0.20; - pos[2] = 0.20; - pos[3] = 0.20; - glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &pos[0] ); - } - - void renderShadows ( float* vmat ) - { - GLfloat pos[4]; - - renderShadowStage ( 0, vmat ); - // renderShadowStage ( 1, vmat ); - - glActiveTextureARB( GL_TEXTURE0_ARB ); // Render Tex 0 - Base render - glDisable ( GL_TEXTURE_GEN_S ); - glDisable ( GL_TEXTURE_GEN_T ); - glDisable ( GL_TEXTURE_GEN_R ); - glDisable ( GL_TEXTURE_GEN_Q ); - glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glEnable ( GL_LIGHTING ); - glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL_EXT, GL_SEPARATE_SPECULAR_COLOR_EXT); - - glEnable ( GL_LIGHT0 ); - pos[0] = light_x; pos[1] = light_y; pos[2] = light_z; pos[3] = 1.0; - glLightfv ( GL_LIGHT0, GL_POSITION, &pos[0] ); - - /* glEnable ( GL_LIGHT1 ); - pos[0] = light[1].x; pos[1] = light[1].y; pos[2] = light[1].z; pos[3] = 1.0; - glLightfv ( GL_LIGHT1, GL_POSITION, &pos[0] );*/ - } - - - - void setShadowLight ( float fx, float fy, float fz, float tx, float ty, float tz, float fov ) - { - light_x = fx; - light_y = fy; - light_z = fz; - light_tox = tx; - light_toy = ty; - light_toz = tz; - light_mfov = fov; - } - - void setShadowLightColor ( float dr, float dg, float db, float sr, float sg, float sb ) - { - GLfloat amb[4] = {0.0,0.0,0.0,1}; - GLfloat dif[4]; - GLfloat spec[4]; - GLfloat pos[4] = {0.0,0.0,0.0, 100.0}; - - glEnable(GL_LIGHT0); - dif[0] = dr; dif[1] = dg; dif[2] = db; dif[3] = 1; - spec[0] = sr; spec[1] = sg; spec[2] = sb; spec[3] = 1; - glLightfv(GL_LIGHT0, GL_AMBIENT, &amb[0] ); - glLightfv(GL_LIGHT0, GL_DIFFUSE, &dif[0] ); - glLightfv(GL_LIGHT0, GL_SPECULAR, &spec[0] ); - } - -#endif +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "common_defs.h" +#include "gl_helper.h" + +#include + + +// Shadow Light +float light_proj[16]; +float light_x, light_y, light_z; +float light_tox, light_toy, light_toz; +float light_mfov; + +// Fonts +void *font = GLUT_BITMAP_8_BY_13; +void *fonts[] = {GLUT_BITMAP_9_BY_15, + GLUT_BITMAP_TIMES_ROMAN_10, + GLUT_BITMAP_TIMES_ROMAN_24}; +// Timing +mint::Time tm_last; +int tm_cnt; +float tm_fps; + +GLuint glSphere = 65535; +float glRadius = 0.0; + +void setSphereRadius ( float r ) +{ + if ( glRadius == r ) return; + glRadius = r; + + // GL sphere + if ( glSphere != 65535 ) glDeleteLists ( glSphere, 1 ); + glSphere = glGenLists ( 1 ); + float x, y, z, x1, y1, z1; + glNewList ( glSphere, GL_COMPILE ); + glBegin ( GL_TRIANGLE_STRIP ); + for ( float tilt=-90; tilt <= 90; tilt += 10.0) { + for ( float ang=0; ang <= 360; ang += 30.0) { + x = sin ( ang*DEGtoRAD) * cos ( tilt*DEGtoRAD ); + y = cos ( ang*DEGtoRAD) * cos ( tilt*DEGtoRAD ); + z = sin ( tilt*DEGtoRAD ) ; + x1 = sin ( ang*DEGtoRAD) * cos ( (tilt+10.0)*DEGtoRAD ) ; + y1 = cos ( ang*DEGtoRAD) * cos ( (tilt+10.0)*DEGtoRAD ) ; + z1 = sin ( (tilt+10.0)*DEGtoRAD ); + glNormal3f ( x, y, z ); glVertex3f ( x*r, y*r, z*r ); + glNormal3f ( x1, y1, z1 ); glVertex3f ( x1*r, y1*r, z1*r ); + } + } + glEnd (); + glEndList (); +} + +void drawSphere () +{ + if ( glRadius == 0.0 ) setSphereRadius ( 1.0 ); + glCallList ( glSphere ); +} + +// Check if there have been any openGL problems +void checkOpenGL () +{ + GLenum errCode = glGetError(); + if (errCode != GL_NO_ERROR) { + const GLubyte* errString = gluErrorString(errCode); + fprintf( stderr, "OpenGL error: %s\n", errString ); + } +} + +void drawText ( int x, int y, char* msg) +{ + int len, i; + glRasterPos2f(x, y); + len = (int) strlen(msg); + for (i = 0; i < len; i++) + glutBitmapCharacter(font, msg[i]); +} + +void drawGrid () +{ + glColor3f ( 0.3, 0.3, 0.3 ); + glBegin ( GL_LINES ); + for (float x=-40; x<=40.0; x+=10.0 ) { + glVertex3f ( x, -40.0, 0 ); + glVertex3f ( x, 40.0, 0 ); + } + for (float y=-40; y<=40.0; y+=10.0 ) { + glVertex3f ( -40.0, y, 0 ); + glVertex3f ( 40.0, y, 0 ); + } + glEnd (); +} + +void measureFPS () +{ + // Measure FPS + mint::Time tm_elaps; + if ( ++tm_cnt > 5 ) { + tm_elaps.SetSystemTime ( ACC_NSEC ); // get current sytem time - accurate to 1 ns + tm_elaps = tm_elaps - tm_last; // get elapsed time from 5 frames ago + tm_fps = 5.0 * 1000.0 / tm_elaps.GetMSec (); // compute fps + tm_cnt = 0; // reset frame counter + tm_last.SetSystemTime ( ACC_NSEC ); + } +} + +void checkFrameBuffers () +{ + GLenum status; + status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + switch(status) { + case GL_FRAMEBUFFER_COMPLETE_EXT: printf ( "FBO complete\n" ); break; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: printf ( "FBO format unsupported\n"); break; + default: printf ( "Unknown FBO error\n"); + } +} + +void disableShadows () + { + glDisable ( GL_TEXTURE_2D ); + + glActiveTextureARB( GL_TEXTURE1_ARB ); + glBindTexture ( GL_TEXTURE_2D, 0 ); + glDisable ( GL_TEXTURE_GEN_S ); + glDisable ( GL_TEXTURE_GEN_T ); + glDisable ( GL_TEXTURE_GEN_R ); + glDisable ( GL_TEXTURE_GEN_Q ); + + glActiveTextureARB( GL_TEXTURE2_ARB ); + glBindTexture ( GL_TEXTURE_2D, 0 ); + glDisable ( GL_TEXTURE_GEN_S ); + glDisable ( GL_TEXTURE_GEN_T ); + glDisable ( GL_TEXTURE_GEN_R ); + glDisable ( GL_TEXTURE_GEN_Q ); + } + +#ifdef USE_SHADOWS + // Materials & Textures + GLuint shadow1_id = 0; // display buffer shadows + GLuint shadow2_id = 0; // display buffer shadows + + // Frame buffer + GLuint frameBufferObject = 0; // frame buffer shadows + + void createFrameBuffer () + { + //Generate the frame buffer object + glGenFramebuffersEXT (1, &frameBufferObject); + glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferObject); // Turn on frame buffer object + glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow1_id, 0); + glDrawBuffer (GL_NONE); // Set Draw & ReadBuffer to none since we're rendering depth only + glReadBuffer (GL_NONE); + checkFrameBuffers (); // Check completeness of frame buffer object (no need for stencil and depth attachement) + glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); // Turn off frame buffer object + } + + void createShadowTextures () + { + // Create depth texture maps + glActiveTextureARB( GL_TEXTURE1_ARB ); + glGenTextures( 1, &shadow1_id ); + glBindTexture ( GL_TEXTURE_2D, shadow1_id ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + + //-- sets region outside shadow to 0 + //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB ); + //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB ); + + //-- sets region outside shadow to 1 (border edge color) + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + + glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); + glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB, TEX_SIZE, TEX_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0); + + glActiveTextureARB( GL_TEXTURE2_ARB ); + glGenTextures( 1, &shadow2_id ); + glBindTexture ( GL_TEXTURE_2D, shadow2_id ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB ); + //glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); + glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB, TEX_SIZE, TEX_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0); + } + + void computeLightMatrix ( int n, int tx, int ty ) + { + int lnum = n; + // Construct projective texturing matrix + + // S - light bias matrix + glMatrixMode ( GL_MODELVIEW ); + glLoadIdentity (); + glTranslatef ( 0.5, 0.5, 0.5 ); + glScalef ( 0.5, 0.5, 0.5 ); + // Plight - light projection matrix + gluPerspective ( light_mfov*2.0, float(tx) / ty, LIGHT_NEAR, LIGHT_FAR ); + // L^-1 - light view inverse matrix + gluLookAt ( light_x, light_y, light_z, light_tox, light_toy, light_toz, 0, 0, 1); + glPushMatrix (); + glGetFloatv ( GL_MODELVIEW_MATRIX, light_proj ); + glPopMatrix (); + + } + + void renderDepthMap_Clear ( float wx, float wy ) + { + glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferObject); + glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow1_id, 0); + glActiveTextureARB( GL_TEXTURE1_ARB ); // TEXTURE1 = shadow map stage + glViewport (1, 1, TEX_SIZE-2, TEX_SIZE-2); // Note: Avoid artifact cause by drawing into border pixels + glClear ( GL_DEPTH_BUFFER_BIT ); + glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); + glViewport ( 0, 0, (GLsizei) wx, (GLsizei) wy ); + } + + void renderDepthMap_FrameBuffer ( int n, float wx, float wy ) + { + float vmat[16]; + + computeLightMatrix ( n, TEX_SIZE, TEX_SIZE ); + + glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferObject); + + if ( n == 0 ) { + glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow1_id, 0); + } else { + glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow2_id, 0); + } + + if ( n == 0 ) glActiveTextureARB( GL_TEXTURE1_ARB ); // TEXTURE1 = shadow map stage + else glActiveTextureARB( GL_TEXTURE2_ARB ); // TEXTURE2 = shadow map stage + + glViewport (1, 1, TEX_SIZE-2, TEX_SIZE-2); // Note: Avoid artifact cause by drawing into border pixels + glClear ( GL_DEPTH_BUFFER_BIT ); + glLoadIdentity(); + + // Plight - projection matrix of light + glMatrixMode ( GL_PROJECTION ); // Setup projection for depth-map rendering + glLoadIdentity (); + gluPerspective ( light_mfov*2.0, float(TEX_SIZE) / TEX_SIZE, LIGHT_NEAR, LIGHT_FAR ); + + // L^-1 - light view matrix (gluLookAt computes inverse) + glMatrixMode ( GL_MODELVIEW); // Setup view for depth-map rendering + glLoadIdentity (); + gluLookAt ( light_x, light_y, light_z, light_tox, light_toy, light_toz, 0, 0, 1); + glPushMatrix (); // Save view matrix for later + glGetFloatv ( GL_MODELVIEW_MATRIX, vmat ); + glPopMatrix (); + + glDisable ( GL_LIGHTING ); + glColor4f ( 1, 1, 1, 1 ); + glShadeModel (GL_FLAT); // No shading (faster) + + glEnable ( GL_CULL_FACE ); + glCullFace ( GL_FRONT ); + + glEnable ( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset ( 50.0, 0.1 ); // Depth bias + + drawScene ( &vmat[0], false ); // Draw scene. + + glDisable ( GL_POLYGON_OFFSET_FILL ); + glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); + glViewport ( 0, 0, (GLsizei) wx, (GLsizei) wy ); + + //glCullFace (GL_BACK); // Restore render states + //glBindTexture ( GL_TEXTURE_2D, 0); + } + + void renderShadowStage ( int n, float* vmat ) + { + GLfloat pos[4]; + GLfloat row[4]; + + computeLightMatrix ( n, TEX_SIZE, TEX_SIZE ); + if ( n == 0 ) { + glActiveTextureARB( GL_TEXTURE1_ARB ); // TEXTURE1 = shadow map stage #1 + } else { + glActiveTextureARB( GL_TEXTURE2_ARB ); // TEXTURE2 = shadow map stage #2 + } + glEnable ( GL_TEXTURE_2D ); + if ( n == 0 ) glBindTexture ( GL_TEXTURE_2D, shadow1_id ); + else glBindTexture ( GL_TEXTURE_2D, shadow2_id ); + + glMatrixMode( GL_MODELVIEW ); + glLoadMatrixf ( vmat ); + + row[0] = light_proj[0]; row[1] = light_proj[4]; row[2] = light_proj[8]; row[3] = light_proj[12]; + glTexGenfv(GL_S, GL_EYE_PLANE, &row[0] ); + row[0] = light_proj[1]; row[1] = light_proj[5]; row[2] = light_proj[9]; row[3] = light_proj[13]; + glTexGenfv(GL_T, GL_EYE_PLANE, &row[0] ); + row[0] = light_proj[2]; row[1] = light_proj[6]; row[2] = light_proj[10]; row[3] = light_proj[14]; + glTexGenfv(GL_R, GL_EYE_PLANE, &row[0] ); + row[0] = light_proj[3]; row[1] = light_proj[7]; row[2] = light_proj[11]; row[3] = light_proj[15]; + glTexGenfv(GL_Q, GL_EYE_PLANE, &row[0] ); + glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + glEnable(GL_TEXTURE_GEN_Q); + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE ); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE ) ; + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE ) ; + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS ) ; + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT ) ; + + pos[0] = 0.20; + pos[1] = 0.20; + pos[2] = 0.20; + pos[3] = 0.20; + glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &pos[0] ); + } + + void renderShadows ( float* vmat ) + { + GLfloat pos[4]; + + renderShadowStage ( 0, vmat ); + // renderShadowStage ( 1, vmat ); + + glActiveTextureARB( GL_TEXTURE0_ARB ); // Render Tex 0 - Base render + glDisable ( GL_TEXTURE_GEN_S ); + glDisable ( GL_TEXTURE_GEN_T ); + glDisable ( GL_TEXTURE_GEN_R ); + glDisable ( GL_TEXTURE_GEN_Q ); + glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + glEnable ( GL_LIGHTING ); + glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL_EXT, GL_SEPARATE_SPECULAR_COLOR_EXT); + + glEnable ( GL_LIGHT0 ); + pos[0] = light_x; pos[1] = light_y; pos[2] = light_z; pos[3] = 1.0; + glLightfv ( GL_LIGHT0, GL_POSITION, &pos[0] ); + + /* glEnable ( GL_LIGHT1 ); + pos[0] = light[1].x; pos[1] = light[1].y; pos[2] = light[1].z; pos[3] = 1.0; + glLightfv ( GL_LIGHT1, GL_POSITION, &pos[0] );*/ + } + + + + void setShadowLight ( float fx, float fy, float fz, float tx, float ty, float tz, float fov ) + { + light_x = fx; + light_y = fy; + light_z = fz; + light_tox = tx; + light_toy = ty; + light_toz = tz; + light_mfov = fov; + } + + void setShadowLightColor ( float dr, float dg, float db, float sr, float sg, float sb ) + { + GLfloat amb[4] = {0.0,0.0,0.0,1}; + GLfloat dif[4]; + GLfloat spec[4]; + GLfloat pos[4] = {0.0,0.0,0.0, 100.0}; + + glEnable(GL_LIGHT0); + dif[0] = dr; dif[1] = dg; dif[2] = db; dif[3] = 1; + spec[0] = sr; spec[1] = sg; spec[2] = sb; spec[3] = 1; + glLightfv(GL_LIGHT0, GL_AMBIENT, &amb[0] ); + glLightfv(GL_LIGHT0, GL_DIFFUSE, &dif[0] ); + glLightfv(GL_LIGHT0, GL_SPECULAR, &spec[0] ); + } + +#endif diff --git a/Extras/sph/common/gl_helper.h b/Extras/sph/common/gl_helper.h index 6d471a947..ccf402ec8 100644 --- a/Extras/sph/common/gl_helper.h +++ b/Extras/sph/common/gl_helper.h @@ -1,89 +1,89 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 GL_HELPER - #define GL_HELPER - - #include "common_defs.h" - - #include - #include - - #ifdef _MSC_VER // Windows - #ifdef USE_SHADOWS - #include - #include - #endif - #include - #else // Linux - #ifdef USE_SHADOWS - #include "GLee.h" - #endif - #include - #include - #endif - - #include "image.h" - #include "mtime.h" - - extern void checkOpenGL (); - extern void drawText ( int x, int y, char* msg); - extern void drawGrid (); - extern void measureFPS (); - - extern mint::Time tm_last; - extern int tm_cnt; - extern float tm_fps; - - - extern void disableShadows (); - extern void checkFrameBuffers (); - - extern GLuint glSphere; - extern float glRadius; - extern void setSphereRadius ( float f ); - extern void drawSphere (); - - #ifdef USE_SHADOWS - extern void setShadowLight ( float fx, float fy, float fz, float tx, float ty, float tz, float fov ); - extern void setShadowLightColor ( float dr, float dg, float db, float sr, float sg, float sb ); - - extern void createFrameBuffer (); - extern void createShadowTextures (); - extern void computeLightMatrix ( int n, int tx, int ty ); - extern void renderDepthMap_Clear ( float wx, float wy ); - extern void renderDepthMap_FrameBuffer ( int n, float wx, float wy ); - extern void renderShadowStage ( int n, float* vmat ); - extern void renderShadows ( float* vmat ); - extern void drawScene ( float* view_mat, bool bShaders ); // provided by user - - extern float light_proj[16]; - extern float light_x, light_y, light_z; - extern float light_tox, light_toy, light_toz; - extern float light_mfov; - - extern GLuint shadow1_id; - extern GLuint shadow2_id; - #endif - - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 GL_HELPER + #define GL_HELPER + + #include "common_defs.h" + + #include + #include + + #ifdef _MSC_VER // Windows + #ifdef USE_SHADOWS + #include + #include + #endif + #include + #else // Linux + #ifdef USE_SHADOWS + #include "GLee.h" + #endif + #include + #include + #endif + + #include "image.h" + #include "mtime.h" + + extern void checkOpenGL (); + extern void drawText ( int x, int y, char* msg); + extern void drawGrid (); + extern void measureFPS (); + + extern mint::Time tm_last; + extern int tm_cnt; + extern float tm_fps; + + + extern void disableShadows (); + extern void checkFrameBuffers (); + + extern GLuint glSphere; + extern float glRadius; + extern void setSphereRadius ( float f ); + extern void drawSphere (); + + #ifdef USE_SHADOWS + extern void setShadowLight ( float fx, float fy, float fz, float tx, float ty, float tz, float fov ); + extern void setShadowLightColor ( float dr, float dg, float db, float sr, float sg, float sb ); + + extern void createFrameBuffer (); + extern void createShadowTextures (); + extern void computeLightMatrix ( int n, int tx, int ty ); + extern void renderDepthMap_Clear ( float wx, float wy ); + extern void renderDepthMap_FrameBuffer ( int n, float wx, float wy ); + extern void renderShadowStage ( int n, float* vmat ); + extern void renderShadows ( float* vmat ); + extern void drawScene ( float* view_mat, bool bShaders ); // provided by user + + extern float light_proj[16]; + extern float light_x, light_y, light_z; + extern float light_tox, light_toy, light_toz; + extern float light_mfov; + + extern GLuint shadow1_id; + extern GLuint shadow2_id; + #endif + + #endif \ No newline at end of file diff --git a/Extras/sph/common/glext.h b/Extras/sph/common/glext.h index e67abe6ba..7a92b5748 100644 --- a/Extras/sph/common/glext.h +++ b/Extras/sph/common/glext.h @@ -1,7139 +1,7139 @@ -#ifndef __glext_h_ -#define __glext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************************************** - - Copyright NVIDIA Corporation 2006 - - TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED - *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS - OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL - NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR - CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR - LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, - OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE - THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES. - -******************************************************************************/ - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#ifndef GLAPIENTRY -# ifdef _WIN32 -# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) /* Mimic */ -# define GLAPIENTRY __stdcall -# else -# define GLAPIENTRY -# endif -# else -# define GLAPIENTRY -# endif -#endif - -#ifndef GLAPI -# define GLAPI extern -#endif - -#ifndef GLAPIENTRYP -# define GLAPIENTRYP GLAPIENTRY * -#endif - -/*************************************************************/ - -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated 2005/06/06 */ -/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ -#define GL_GLEXT_VERSION 28 - -#ifndef GL_VERSION_1_2 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#endif - -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#endif - -#ifndef GL_VERSION_1_3 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#endif - -#ifndef GL_VERSION_1_4 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#endif - -#ifndef GL_VERSION_1_5 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#endif - -#ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#endif - -#ifndef GL_VERSION_2_1 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#endif - -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif - -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif - -#ifndef GL_ARB_texture_env_add -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif - -#ifndef GL_ARB_point_parameters -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif - -#ifndef GL_ARB_shadow -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif - -#ifndef GL_ARB_window_pos -#endif - -#ifndef GL_ARB_vertex_program -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif - -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#endif - -#ifndef GL_ARB_shader_objects -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#endif - -#ifndef GL_ARB_point_sprite -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif - -#ifndef GL_ARB_texture_float -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif - -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif - -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif - -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif - -#ifndef GL_EXT_subtexture -#endif - -#ifndef GL_EXT_copy_texture -#endif - -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif - -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif - -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif - -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_EXT_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 -#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 -#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 -#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 -#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 -#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 -#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -#ifndef GL_3DFX_tbuffer -#endif - -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif - -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif - -#ifndef GL_NV_evaluators -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#endif - -#ifndef GL_NV_texture_compression_vtc -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif - -#ifndef GL_NV_texture_shader -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif - -#ifndef GL_NV_vertex_program -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif - -#ifndef GL_OML_interlace -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif - -#ifndef GL_OML_subsample -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif - -#ifndef GL_OML_resample -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -#endif - -#ifndef GL_ATI_element_array -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -#endif - -#ifndef GL_SUN_mesh_array -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_DEPTH_CLAMP_NV 0x864F -#endif - -#ifndef GL_NV_occlusion_query -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#endif - -#ifndef GL_NV_point_sprite -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif - -#ifndef GL_NV_vertex_program1_1 -#endif - -#ifndef GL_EXT_shadow_funcs -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif - -#ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A -#endif - -#ifndef GL_APPLE_fence -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -#ifndef GL_S3_s3tc -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif - -#ifndef GL_ATI_texture_float -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif - -#ifndef GL_NV_float_buffer -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif - -#ifndef GL_NV_fragment_program -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -#endif - -#ifndef GL_NV_half_float -#define GL_HALF_FLOAT_NV 0x140B -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#endif - -#ifndef GL_NV_primitive_restart -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif - -#ifndef GL_NV_vertex_program2 -#endif - -#ifndef GL_ATI_map_object_buffer -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#endif - -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#endif - -#ifndef GL_MESA_pack_invert -#define GL_PACK_INVERT_MESA 0x8758 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif - -#ifndef GL_NV_fragment_program_option -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif - -#ifndef GL_NV_vertex_program2_option -/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ -/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ -#endif - -#ifndef GL_NV_vertex_program3 -/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX_EXT 0x8D45 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#endif - -#ifndef GL_GREMEDY_string_marker -#endif - -#ifndef GL_EXT_Cg_shader -#define GL_CG_VERTEX_SHADER_EXT 0x890E -#define GL_CG_FRAGMENT_SHADER_EXT 0x890F -#endif - -#ifndef GL_EXT_timer_query -#define GL_TIME_ELAPSED_EXT 0x88BF -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#endif - -#ifndef GL_EXT_geometry_shader4 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F -#endif - -#ifndef GL_EXT_packed_float -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C -#endif - -#ifndef GL_EXT_texture_array -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -/* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -#endif - -#ifndef GL_EXT_texture_integer -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif - -#ifndef GL_NV_transform_feedback -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F -#endif - -#ifndef GL_NV_geometry_program4 -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 -#endif - -#ifndef GL_NV_gpu_program4 -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8D57 -#define GL_MAX_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E11 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E13 -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#endif - -#ifndef GL_EXT_framebuffer_blit -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif - -/*************************************************************/ - -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; /* native character */ -#endif - -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; -#endif - -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for handling shader object handles and program/shader text */ -typedef char GLcharARB; /* native character */ -typedef unsigned int GLhandleARB; /* shader object handle */ -#endif - -/* GL types for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GL_EXT_timer_query -#ifndef GL_COMPILER_LACKS_64BIT_INT -#if defined(__GNUC__) || defined(__arm) || defined(__IAR_SYSTEMS_ICC__) || defined(__ghs__) || defined(_WIN64) -typedef signed long long GLint64EXT; -typedef unsigned long long GLuint64EXT; -#else -typedef signed __int64 GLint64EXT; -typedef unsigned __int64 GLuint64EXT; -#endif -#endif -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -GLAPI void GLAPIENTRY glBlendEquation (GLenum); -GLAPI void GLAPIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void GLAPIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -GLAPI void GLAPIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -GLAPI void GLAPIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -GLAPI void GLAPIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void GLAPIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void GLAPIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void GLAPIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -GLAPI void GLAPIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void GLAPIENTRY glMinmax (GLenum, GLenum, GLboolean); -GLAPI void GLAPIENTRY glResetHistogram (GLenum); -GLAPI void GLAPIENTRY glResetMinmax (GLenum); -GLAPI void GLAPIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (GLAPIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (GLAPIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glActiveTexture (GLenum); -GLAPI void GLAPIENTRY glClientActiveTexture (GLenum); -GLAPI void GLAPIENTRY glMultiTexCoord1d (GLenum, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord1f (GLenum, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord1i (GLenum, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord1iv (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord1s (GLenum, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord2iv (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord3iv (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord4iv (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glLoadTransposeMatrixf (const GLfloat *); -GLAPI void GLAPIENTRY glLoadTransposeMatrixd (const GLdouble *); -GLAPI void GLAPIENTRY glMultTransposeMatrixf (const GLfloat *); -GLAPI void GLAPIENTRY glMultTransposeMatrixd (const GLdouble *); -GLAPI void GLAPIENTRY glSampleCoverage (GLclampf, GLboolean); -GLAPI void GLAPIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (GLAPIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glFogCoordf (GLfloat); -GLAPI void GLAPIENTRY glFogCoordfv (const GLfloat *); -GLAPI void GLAPIENTRY glFogCoordd (GLdouble); -GLAPI void GLAPIENTRY glFogCoorddv (const GLdouble *); -GLAPI void GLAPIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void GLAPIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -GLAPI void GLAPIENTRY glPointParameterf (GLenum, GLfloat); -GLAPI void GLAPIENTRY glPointParameterfv (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glPointParameteri (GLenum, GLint); -GLAPI void GLAPIENTRY glPointParameteriv (GLenum, const GLint *); -GLAPI void GLAPIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); -GLAPI void GLAPIENTRY glSecondaryColor3bv (const GLbyte *); -GLAPI void GLAPIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glSecondaryColor3dv (const GLdouble *); -GLAPI void GLAPIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glSecondaryColor3fv (const GLfloat *); -GLAPI void GLAPIENTRY glSecondaryColor3i (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glSecondaryColor3iv (const GLint *); -GLAPI void GLAPIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glSecondaryColor3sv (const GLshort *); -GLAPI void GLAPIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); -GLAPI void GLAPIENTRY glSecondaryColor3ubv (const GLubyte *); -GLAPI void GLAPIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glSecondaryColor3uiv (const GLuint *); -GLAPI void GLAPIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); -GLAPI void GLAPIENTRY glSecondaryColor3usv (const GLushort *); -GLAPI void GLAPIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glWindowPos2d (GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos2dv (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos2f (GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos2fv (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos2i (GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos2iv (const GLint *); -GLAPI void GLAPIENTRY glWindowPos2s (GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos2sv (const GLshort *); -GLAPI void GLAPIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos3dv (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos3fv (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos3i (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos3iv (const GLint *); -GLAPI void GLAPIENTRY glWindowPos3s (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos3sv (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GLAPIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGenQueries (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glDeleteQueries (GLsizei, const GLuint *); -GLAPI GLboolean GLAPIENTRY glIsQuery (GLuint); -GLAPI void GLAPIENTRY glBeginQuery (GLenum, GLuint); -GLAPI void GLAPIENTRY glEndQuery (GLenum); -GLAPI void GLAPIENTRY glGetQueryiv (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); -GLAPI void GLAPIENTRY glBindBuffer (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteBuffers (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenBuffers (GLsizei, GLuint *); -GLAPI GLboolean GLAPIENTRY glIsBuffer (GLuint); -GLAPI void GLAPIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); -GLAPI void GLAPIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); -GLAPI void GLAPIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); -GLAPI GLvoid* GLAPIENTRY glMapBuffer (GLenum, GLenum); -GLAPI GLboolean GLAPIENTRY glUnmapBuffer (GLenum); -GLAPI void GLAPIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (GLAPIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GLAPIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (GLAPIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (GLAPIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (GLAPIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (GLAPIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (GLAPIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (GLAPIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendEquationSeparate (GLenum, GLenum); -GLAPI void GLAPIENTRY glDrawBuffers (GLsizei, const GLenum *); -GLAPI void GLAPIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); -GLAPI void GLAPIENTRY glStencilMaskSeparate (GLenum, GLuint); -GLAPI void GLAPIENTRY glAttachShader (GLuint, GLuint); -GLAPI void GLAPIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); -GLAPI void GLAPIENTRY glCompileShader (GLuint); -GLAPI GLuint GLAPIENTRY glCreateProgram (void); -GLAPI GLuint GLAPIENTRY glCreateShader (GLenum); -GLAPI void GLAPIENTRY glDeleteProgram (GLuint); -GLAPI void GLAPIENTRY glDeleteShader (GLuint); -GLAPI void GLAPIENTRY glDetachShader (GLuint, GLuint); -GLAPI void GLAPIENTRY glDisableVertexAttribArray (GLuint); -GLAPI void GLAPIENTRY glEnableVertexAttribArray (GLuint); -GLAPI void GLAPIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void GLAPIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void GLAPIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); -GLAPI GLint GLAPIENTRY glGetAttribLocation (GLuint, const GLchar *); -GLAPI void GLAPIENTRY glGetProgramiv (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void GLAPIENTRY glGetShaderiv (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void GLAPIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI GLint GLAPIENTRY glGetUniformLocation (GLuint, const GLchar *); -GLAPI void GLAPIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); -GLAPI void GLAPIENTRY glGetUniformiv (GLuint, GLint, GLint *); -GLAPI void GLAPIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); -GLAPI void GLAPIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean GLAPIENTRY glIsProgram (GLuint); -GLAPI GLboolean GLAPIENTRY glIsShader (GLuint); -GLAPI void GLAPIENTRY glLinkProgram (GLuint); -GLAPI void GLAPIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); -GLAPI void GLAPIENTRY glUseProgram (GLuint); -GLAPI void GLAPIENTRY glUniform1f (GLint, GLfloat); -GLAPI void GLAPIENTRY glUniform2f (GLint, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glUniform1i (GLint, GLint); -GLAPI void GLAPIENTRY glUniform2i (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glUniform3i (GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform1iv (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniform2iv (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniform3iv (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniform4iv (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void GLAPIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void GLAPIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void GLAPIENTRY glValidateProgram (GLuint); -GLAPI void GLAPIENTRY glVertexAttrib1d (GLuint, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib1f (GLuint, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib1s (GLuint, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib1sv (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib2sv (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib3sv (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); -GLAPI void GLAPIENTRY glVertexAttrib4Niv (GLuint, const GLint *); -GLAPI void GLAPIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void GLAPIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); -GLAPI void GLAPIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); -GLAPI void GLAPIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); -GLAPI void GLAPIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); -GLAPI void GLAPIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib4iv (GLuint, const GLint *); -GLAPI void GLAPIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib4sv (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); -GLAPI void GLAPIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); -GLAPI void GLAPIENTRY glVertexAttrib4usv (GLuint, const GLushort *); -GLAPI void GLAPIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (GLAPIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAPIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GLAPIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (GLAPIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (GLAPIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GLAPIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GLAPIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GLAPIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (GLAPIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GLAPIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GLAPIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (GLAPIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (GLAPIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GLAPIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (GLAPIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -typedef void (GLAPIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void GLAPIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void GLAPIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void GLAPIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void GLAPIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void GLAPIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glActiveTextureARB (GLenum); -GLAPI void GLAPIENTRY glClientActiveTextureARB (GLenum); -GLAPI void GLAPIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord1iARB (GLenum, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -GLAPI void GLAPIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -GLAPI void GLAPIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -GLAPI void GLAPIENTRY glMultTransposeMatrixfARB (const GLfloat *); -GLAPI void GLAPIENTRY glMultTransposeMatrixdARB (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glSampleCoverageARB (GLclampf, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#endif - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPointParameterfARB (GLenum, GLfloat); -GLAPI void GLAPIENTRY glPointParameterfvARB (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glWeightbvARB (GLint, const GLbyte *); -GLAPI void GLAPIENTRY glWeightsvARB (GLint, const GLshort *); -GLAPI void GLAPIENTRY glWeightivARB (GLint, const GLint *); -GLAPI void GLAPIENTRY glWeightfvARB (GLint, const GLfloat *); -GLAPI void GLAPIENTRY glWeightdvARB (GLint, const GLdouble *); -GLAPI void GLAPIENTRY glWeightubvARB (GLint, const GLubyte *); -GLAPI void GLAPIENTRY glWeightusvARB (GLint, const GLushort *); -GLAPI void GLAPIENTRY glWeightuivARB (GLint, const GLuint *); -GLAPI void GLAPIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glVertexBlendARB (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (GLAPIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glCurrentPaletteMatrixARB (GLint); -GLAPI void GLAPIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); -GLAPI void GLAPIENTRY glMatrixIndexusvARB (GLint, const GLushort *); -GLAPI void GLAPIENTRY glMatrixIndexuivARB (GLint, const GLuint *); -GLAPI void GLAPIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (GLAPIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (GLAPIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (GLAPIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (GLAPIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#endif - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#endif - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glWindowPos2dARB (GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos2dvARB (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos2fARB (GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos2fvARB (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos2iARB (GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos2ivARB (const GLint *); -GLAPI void GLAPIENTRY glWindowPos2sARB (GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos2svARB (const GLshort *); -GLAPI void GLAPIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos3dvARB (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos3fvARB (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos3iARB (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos3ivARB (const GLint *); -GLAPI void GLAPIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos3svARB (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#endif - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertexAttrib1dARB (GLuint, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib1fARB (GLuint, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib1sARB (GLuint, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); -GLAPI void GLAPIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); -GLAPI void GLAPIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void GLAPIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); -GLAPI void GLAPIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); -GLAPI void GLAPIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); -GLAPI void GLAPIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); -GLAPI void GLAPIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); -GLAPI void GLAPIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); -GLAPI void GLAPIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); -GLAPI void GLAPIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); -GLAPI void GLAPIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glEnableVertexAttribArrayARB (GLuint); -GLAPI void GLAPIENTRY glDisableVertexAttribArrayARB (GLuint); -GLAPI void GLAPIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glBindProgramARB (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenProgramsARB (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void GLAPIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void GLAPIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void GLAPIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void GLAPIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); -GLAPI void GLAPIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean GLAPIENTRY glIsProgramARB (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (GLAPIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (GLAPIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (GLAPIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (GLAPIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#endif - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBindBufferARB (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenBuffersARB (GLsizei, GLuint *); -GLAPI GLboolean GLAPIENTRY glIsBufferARB (GLuint); -GLAPI void GLAPIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); -GLAPI void GLAPIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); -GLAPI void GLAPIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); -GLAPI GLvoid* GLAPIENTRY glMapBufferARB (GLenum, GLenum); -GLAPI GLboolean GLAPIENTRY glUnmapBufferARB (GLenum); -GLAPI void GLAPIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (GLAPIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (GLAPIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (GLAPIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -typedef void (GLAPIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -typedef GLvoid* (GLAPIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGenQueriesARB (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); -GLAPI GLboolean GLAPIENTRY glIsQueryARB (GLuint); -GLAPI void GLAPIENTRY glBeginQueryARB (GLenum, GLuint); -GLAPI void GLAPIENTRY glEndQueryARB (GLenum); -GLAPI void GLAPIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (GLAPIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GLAPIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDeleteObjectARB (GLhandleARB); -GLAPI GLhandleARB GLAPIENTRY glGetHandleARB (GLenum); -GLAPI void GLAPIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); -GLAPI GLhandleARB GLAPIENTRY glCreateShaderObjectARB (GLenum); -GLAPI void GLAPIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); -GLAPI void GLAPIENTRY glCompileShaderARB (GLhandleARB); -GLAPI GLhandleARB GLAPIENTRY glCreateProgramObjectARB (void); -GLAPI void GLAPIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); -GLAPI void GLAPIENTRY glLinkProgramARB (GLhandleARB); -GLAPI void GLAPIENTRY glUseProgramObjectARB (GLhandleARB); -GLAPI void GLAPIENTRY glValidateProgramARB (GLhandleARB); -GLAPI void GLAPIENTRY glUniform1fARB (GLint, GLfloat); -GLAPI void GLAPIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glUniform1iARB (GLint, GLint); -GLAPI void GLAPIENTRY glUniform2iARB (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); -GLAPI void GLAPIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void GLAPIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void GLAPIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void GLAPIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -GLAPI void GLAPIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); -GLAPI GLint GLAPIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); -GLAPI void GLAPIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI void GLAPIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); -GLAPI void GLAPIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); -GLAPI void GLAPIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (GLAPIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (GLAPIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (GLAPIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (GLAPIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (GLAPIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (GLAPIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (GLAPIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (GLAPIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (GLAPIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (GLAPIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (GLAPIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (GLAPIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); -GLAPI void GLAPIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI GLint GLAPIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (GLAPIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (GLAPIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDrawBuffersARB (GLsizei, const GLenum *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glClampColorARB (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#endif - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (GLAPIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -GLAPI void GLAPIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -GLAPI void GLAPIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -GLAPI void GLAPIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void GLAPIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void GLAPIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -GLAPI void GLAPIENTRY glResetHistogramEXT (GLenum); -GLAPI void GLAPIENTRY glResetMinmaxEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void GLAPIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -GLAPI void GLAPIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void GLAPIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void GLAPIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void GLAPIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (GLAPIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_EXT_color_matrix -#define GL_EXT_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void GLAPIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPixelTexGenSGIX (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -GLAPI void GLAPIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -GLAPI void GLAPIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -GLAPI void GLAPIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -GLAPI void GLAPIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean GLAPIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -GLAPI void GLAPIENTRY glBindTextureEXT (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenTexturesEXT (GLsizei, GLuint *); -GLAPI GLboolean GLAPIENTRY glIsTextureEXT (GLuint); -GLAPI void GLAPIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (GLAPIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (GLAPIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (GLAPIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (GLAPIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (GLAPIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (GLAPIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (GLAPIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (GLAPIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -GLAPI void GLAPIENTRY glSamplePatternSGIS (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glArrayElementEXT (GLint); -GLAPI void GLAPIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -GLAPI void GLAPIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -GLAPI void GLAPIENTRY glGetPointervEXT (GLenum, GLvoid* *); -GLAPI void GLAPIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (GLAPIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (GLAPIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (GLAPIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendEquationEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -GLAPI void GLAPIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glSpriteParameteriSGIX (GLenum, GLint); -GLAPI void GLAPIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPointParameterfEXT (GLenum, GLfloat); -GLAPI void GLAPIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPointParameterfSGIS (GLenum, GLfloat); -GLAPI void GLAPIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint GLAPIENTRY glGetInstrumentsSGIX (void); -GLAPI void GLAPIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -GLAPI GLint GLAPIENTRY glPollInstrumentsSGIX (GLint *); -GLAPI void GLAPIENTRY glReadInstrumentsSGIX (GLint); -GLAPI void GLAPIENTRY glStartInstrumentsSGIX (void); -GLAPI void GLAPIENTRY glStopInstrumentsSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (GLAPIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (GLAPIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (GLAPIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (GLAPIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (GLAPIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (GLAPIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFrameZoomSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); -GLAPI void GLAPIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); -GLAPI void GLAPIENTRY glDeformSGIX (GLbitfield); -GLAPI void GLAPIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (GLAPIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (GLAPIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (GLAPIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glReferencePlaneSGIX (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glGetFogFuncSGIS (GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (GLAPIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -GLAPI void GLAPIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -GLAPI void GLAPIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (GLAPIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glHintPGI (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void GLAPIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -GLAPI void GLAPIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -GLAPI void GLAPIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glIndexMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glIndexFuncEXT (GLenum, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glLockArraysEXT (GLint, GLsizei); -GLAPI void GLAPIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (GLAPIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -GLAPI void GLAPIENTRY glCullParameterfvEXT (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -GLAPI void GLAPIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -GLAPI void GLAPIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -GLAPI void GLAPIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -GLAPI void GLAPIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -GLAPI void GLAPIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -GLAPI void GLAPIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -GLAPI void GLAPIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -GLAPI void GLAPIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glLightEnviSGIX (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glApplyTextureEXT (GLenum); -GLAPI void GLAPIENTRY glTextureLightEXT (GLenum); -GLAPI void GLAPIENTRY glTextureMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (GLAPIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (GLAPIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glAsyncMarkerSGIX (GLuint); -GLAPI GLint GLAPIENTRY glFinishAsyncSGIX (GLuint *); -GLAPI GLint GLAPIENTRY glPollAsyncSGIX (GLuint *); -GLAPI GLuint GLAPIENTRY glGenAsyncMarkersSGIX (GLsizei); -GLAPI void GLAPIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); -GLAPI GLboolean GLAPIENTRY glIsAsyncMarkerSGIX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (GLAPIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (GLAPIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (GLAPIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (GLAPIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (GLAPIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void GLAPIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -GLAPI void GLAPIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void GLAPIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (GLAPIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (GLAPIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (GLAPIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -#endif - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -GLAPI void GLAPIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void GLAPIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void GLAPIENTRY glSecondaryColor3bvEXT (const GLbyte *); -GLAPI void GLAPIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glSecondaryColor3dvEXT (const GLdouble *); -GLAPI void GLAPIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glSecondaryColor3fvEXT (const GLfloat *); -GLAPI void GLAPIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glSecondaryColor3ivEXT (const GLint *); -GLAPI void GLAPIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glSecondaryColor3svEXT (const GLshort *); -GLAPI void GLAPIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -GLAPI void GLAPIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -GLAPI void GLAPIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glSecondaryColor3uivEXT (const GLuint *); -GLAPI void GLAPIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -GLAPI void GLAPIENTRY glSecondaryColor3usvEXT (const GLushort *); -GLAPI void GLAPIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTextureNormalEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void GLAPIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFogCoordfEXT (GLfloat); -GLAPI void GLAPIENTRY glFogCoordfvEXT (const GLfloat *); -GLAPI void GLAPIENTRY glFogCoorddEXT (GLdouble); -GLAPI void GLAPIENTRY glFogCoorddvEXT (const GLdouble *); -GLAPI void GLAPIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (GLAPIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void GLAPIENTRY glTangent3bvEXT (const GLbyte *); -GLAPI void GLAPIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glTangent3dvEXT (const GLdouble *); -GLAPI void GLAPIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTangent3fvEXT (const GLfloat *); -GLAPI void GLAPIENTRY glTangent3iEXT (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glTangent3ivEXT (const GLint *); -GLAPI void GLAPIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glTangent3svEXT (const GLshort *); -GLAPI void GLAPIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void GLAPIENTRY glBinormal3bvEXT (const GLbyte *); -GLAPI void GLAPIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glBinormal3dvEXT (const GLdouble *); -GLAPI void GLAPIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glBinormal3fvEXT (const GLfloat *); -GLAPI void GLAPIENTRY glBinormal3iEXT (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glBinormal3ivEXT (const GLint *); -GLAPI void GLAPIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glBinormal3svEXT (const GLshort *); -GLAPI void GLAPIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (GLAPIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (GLAPIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (GLAPIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (GLAPIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (GLAPIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (GLAPIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (GLAPIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (GLAPIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (GLAPIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (GLAPIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); -#endif - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGlobalAlphaFactorbSUN (GLbyte); -GLAPI void GLAPIENTRY glGlobalAlphaFactorsSUN (GLshort); -GLAPI void GLAPIENTRY glGlobalAlphaFactoriSUN (GLint); -GLAPI void GLAPIENTRY glGlobalAlphaFactorfSUN (GLfloat); -GLAPI void GLAPIENTRY glGlobalAlphaFactordSUN (GLdouble); -GLAPI void GLAPIENTRY glGlobalAlphaFactorubSUN (GLubyte); -GLAPI void GLAPIENTRY glGlobalAlphaFactorusSUN (GLushort); -GLAPI void GLAPIENTRY glGlobalAlphaFactoruiSUN (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glReplacementCodeuiSUN (GLuint); -GLAPI void GLAPIENTRY glReplacementCodeusSUN (GLushort); -GLAPI void GLAPIENTRY glReplacementCodeubSUN (GLubyte); -GLAPI void GLAPIENTRY glReplacementCodeuivSUN (const GLuint *); -GLAPI void GLAPIENTRY glReplacementCodeusvSUN (const GLushort *); -GLAPI void GLAPIENTRY glReplacementCodeubvSUN (const GLubyte *); -GLAPI void GLAPIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -GLAPI void GLAPIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -GLAPI void GLAPIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertexWeightfEXT (GLfloat); -GLAPI void GLAPIENTRY glVertexWeightfvEXT (const GLfloat *); -GLAPI void GLAPIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void GLAPIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glCombinerParameterfNV (GLenum, GLfloat); -GLAPI void GLAPIENTRY glCombinerParameterivNV (GLenum, const GLint *); -GLAPI void GLAPIENTRY glCombinerParameteriNV (GLenum, GLint); -GLAPI void GLAPIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -GLAPI void GLAPIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (GLAPIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos2dvMESA (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos2fvMESA (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos2iMESA (GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos2ivMESA (const GLint *); -GLAPI void GLAPIENTRY glWindowPos2sMESA (GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos2svMESA (const GLshort *); -GLAPI void GLAPIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos3dvMESA (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos3fvMESA (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos3ivMESA (const GLint *); -GLAPI void GLAPIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos3svMESA (const GLshort *); -GLAPI void GLAPIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glWindowPos4dvMESA (const GLdouble *); -GLAPI void GLAPIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glWindowPos4fvMESA (const GLfloat *); -GLAPI void GLAPIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glWindowPos4ivMESA (const GLint *); -GLAPI void GLAPIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glWindowPos4svMESA (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); -GLAPI void GLAPIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (GLAPIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void GLAPIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void GLAPIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -GLAPI void GLAPIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void GLAPIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void GLAPIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void GLAPIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void GLAPIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (GLAPIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTbufferMask3DFX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glSampleMaskEXT (GLclampf, GLboolean); -GLAPI void GLAPIENTRY glSamplePatternEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#endif - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDeleteFencesNV (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenFencesNV (GLsizei, GLuint *); -GLAPI GLboolean GLAPIENTRY glIsFenceNV (GLuint); -GLAPI GLboolean GLAPIENTRY glTestFenceNV (GLuint); -GLAPI void GLAPIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glFinishFenceNV (GLuint); -GLAPI void GLAPIENTRY glSetFenceNV (GLuint, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (GLAPIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (GLAPIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); -GLAPI void GLAPIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); -GLAPI void GLAPIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); -GLAPI void GLAPIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glEvalMapsNV (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -typedef void (GLAPIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -typedef void (GLAPIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#endif - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#endif - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean GLAPIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); -GLAPI void GLAPIENTRY glBindProgramNV (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glGenProgramsNV (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); -GLAPI void GLAPIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); -GLAPI void GLAPIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); -GLAPI void GLAPIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean GLAPIENTRY glIsProgramNV (GLuint); -GLAPI void GLAPIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); -GLAPI void GLAPIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); -GLAPI void GLAPIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void GLAPIENTRY glVertexAttrib1dNV (GLuint, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib1fNV (GLuint, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib1sNV (GLuint, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void GLAPIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); -GLAPI void GLAPIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void GLAPIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void GLAPIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); -GLAPI void GLAPIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (GLAPIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (GLAPIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (GLAPIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (GLAPIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (GLAPIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (GLAPIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#endif - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#endif - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#endif - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTexBumpParameterivATI (GLenum, const GLint *); -GLAPI void GLAPIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); -GLAPI void GLAPIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (GLAPIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (GLAPIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (GLAPIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint GLAPIENTRY glGenFragmentShadersATI (GLuint); -GLAPI void GLAPIENTRY glBindFragmentShaderATI (GLuint); -GLAPI void GLAPIENTRY glDeleteFragmentShaderATI (GLuint); -GLAPI void GLAPIENTRY glBeginFragmentShaderATI (void); -GLAPI void GLAPIENTRY glEndFragmentShaderATI (void); -GLAPI void GLAPIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); -GLAPI void GLAPIENTRY glSampleMapATI (GLuint, GLuint, GLenum); -GLAPI void GLAPIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (GLAPIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (GLAPIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (GLAPIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (GLAPIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (GLAPIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (GLAPIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPNTrianglesiATI (GLenum, GLint); -GLAPI void GLAPIENTRY glPNTrianglesfATI (GLenum, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint GLAPIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); -GLAPI GLboolean GLAPIENTRY glIsObjectBufferATI (GLuint); -GLAPI void GLAPIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); -GLAPI void GLAPIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glFreeObjectBufferATI (GLuint); -GLAPI void GLAPIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void GLAPIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void GLAPIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (GLAPIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); -typedef GLboolean (GLAPIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -typedef void (GLAPIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBeginVertexShaderEXT (void); -GLAPI void GLAPIENTRY glEndVertexShaderEXT (void); -GLAPI void GLAPIENTRY glBindVertexShaderEXT (GLuint); -GLAPI GLuint GLAPIENTRY glGenVertexShadersEXT (GLuint); -GLAPI void GLAPIENTRY glDeleteVertexShaderEXT (GLuint); -GLAPI void GLAPIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); -GLAPI void GLAPIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); -GLAPI void GLAPIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); -GLAPI GLuint GLAPIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void GLAPIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glVariantbvEXT (GLuint, const GLbyte *); -GLAPI void GLAPIENTRY glVariantsvEXT (GLuint, const GLshort *); -GLAPI void GLAPIENTRY glVariantivEXT (GLuint, const GLint *); -GLAPI void GLAPIENTRY glVariantfvEXT (GLuint, const GLfloat *); -GLAPI void GLAPIENTRY glVariantdvEXT (GLuint, const GLdouble *); -GLAPI void GLAPIENTRY glVariantubvEXT (GLuint, const GLubyte *); -GLAPI void GLAPIENTRY glVariantusvEXT (GLuint, const GLushort *); -GLAPI void GLAPIENTRY glVariantuivEXT (GLuint, const GLuint *); -GLAPI void GLAPIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); -GLAPI void GLAPIENTRY glEnableVariantClientStateEXT (GLuint); -GLAPI void GLAPIENTRY glDisableVariantClientStateEXT (GLuint); -GLAPI GLuint GLAPIENTRY glBindLightParameterEXT (GLenum, GLenum); -GLAPI GLuint GLAPIENTRY glBindMaterialParameterEXT (GLenum, GLenum); -GLAPI GLuint GLAPIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); -GLAPI GLuint GLAPIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); -GLAPI GLuint GLAPIENTRY glBindParameterEXT (GLenum); -GLAPI GLboolean GLAPIENTRY glIsVariantEnabledEXT (GLuint, GLenum); -GLAPI void GLAPIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void GLAPIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); -GLAPI void GLAPIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void GLAPIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void GLAPIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (GLAPIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (GLAPIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (GLAPIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (GLAPIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (GLAPIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (GLAPIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (GLAPIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (GLAPIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (GLAPIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (GLAPIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (GLAPIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (GLAPIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (GLAPIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (GLAPIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -typedef void (GLAPIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (GLAPIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (GLAPIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (GLAPIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (GLAPIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (GLAPIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (GLAPIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (GLAPIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); -typedef void (GLAPIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertexStream1sATI (GLenum, GLshort); -GLAPI void GLAPIENTRY glVertexStream1svATI (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glVertexStream1iATI (GLenum, GLint); -GLAPI void GLAPIENTRY glVertexStream1ivATI (GLenum, const GLint *); -GLAPI void GLAPIENTRY glVertexStream1fATI (GLenum, GLfloat); -GLAPI void GLAPIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glVertexStream1dATI (GLenum, GLdouble); -GLAPI void GLAPIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexStream2svATI (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glVertexStream2iATI (GLenum, GLint, GLint); -GLAPI void GLAPIENTRY glVertexStream2ivATI (GLenum, const GLint *); -GLAPI void GLAPIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexStream3svATI (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glVertexStream3ivATI (GLenum, const GLint *); -GLAPI void GLAPIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glVertexStream4svATI (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glVertexStream4ivATI (GLenum, const GLint *); -GLAPI void GLAPIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); -GLAPI void GLAPIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); -GLAPI void GLAPIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void GLAPIENTRY glNormalStream3svATI (GLenum, const GLshort *); -GLAPI void GLAPIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void GLAPIENTRY glNormalStream3ivATI (GLenum, const GLint *); -GLAPI void GLAPIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); -GLAPI void GLAPIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); -GLAPI void GLAPIENTRY glClientActiveVertexStreamATI (GLenum); -GLAPI void GLAPIENTRY glVertexBlendEnviATI (GLenum, GLint); -GLAPI void GLAPIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (GLAPIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glElementPointerATI (GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glDrawElementArrayATI (GLenum, GLsizei); -GLAPI void GLAPIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#endif - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); -GLAPI GLboolean GLAPIENTRY glIsOcclusionQueryNV (GLuint); -GLAPI void GLAPIENTRY glBeginOcclusionQueryNV (GLuint); -GLAPI void GLAPIENTRY glEndOcclusionQueryNV (void); -GLAPI void GLAPIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); -GLAPI void GLAPIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (GLAPIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GLAPIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (GLAPIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (GLAPIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPointParameteriNV (GLenum, GLint); -GLAPI void GLAPIENTRY glPointParameterivNV (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#endif - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glActiveStencilFaceEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#endif - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); -GLAPI void GLAPIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); -GLAPI void GLAPIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); -GLAPI void GLAPIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); -GLAPI void GLAPIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (GLAPIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGenFencesAPPLE (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glSetFenceAPPLE (GLuint); -GLAPI GLboolean GLAPIENTRY glIsFenceAPPLE (GLuint); -GLAPI GLboolean GLAPIENTRY glTestFenceAPPLE (GLuint); -GLAPI void GLAPIENTRY glFinishFenceAPPLE (GLuint); -GLAPI GLboolean GLAPIENTRY glTestObjectAPPLE (GLenum, GLuint); -GLAPI void GLAPIENTRY glFinishObjectAPPLE (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (GLAPIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (GLAPIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (GLAPIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBindVertexArrayAPPLE (GLuint); -GLAPI void GLAPIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI GLboolean GLAPIENTRY glIsVertexArrayAPPLE (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (GLAPIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (GLAPIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef GLboolean (GLAPIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void GLAPIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void GLAPIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#endif - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDrawBuffersATI (GLsizei, const GLenum *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -/* This is really a WGL extension, but defines some associated GL enums. - * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. - */ -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#endif - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#endif - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#endif - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void GLAPIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void GLAPIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); -GLAPI void GLAPIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); -GLAPI void GLAPIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); -GLAPI void GLAPIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glVertex2hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glVertex3hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glVertex4hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glNormal3hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glColor3hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glColor4hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glTexCoord1hNV (GLhalfNV); -GLAPI void GLAPIENTRY glTexCoord1hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glTexCoord2hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glTexCoord3hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glTexCoord4hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); -GLAPI void GLAPIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); -GLAPI void GLAPIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); -GLAPI void GLAPIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); -GLAPI void GLAPIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); -GLAPI void GLAPIENTRY glFogCoordhNV (GLhalfNV); -GLAPI void GLAPIENTRY glFogCoordhvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glSecondaryColor3hvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexWeighthNV (GLhalfNV); -GLAPI void GLAPIENTRY glVertexWeighthvNV (const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); -GLAPI void GLAPIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void GLAPIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void GLAPIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (GLAPIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (GLAPIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (GLAPIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (GLAPIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (GLAPIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (GLAPIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (GLAPIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (GLAPIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (GLAPIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (GLAPIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (GLAPIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); -GLAPI void GLAPIENTRY glFlushPixelDataRangeNV (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#endif - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glPrimitiveRestartNV (void); -GLAPI void GLAPIENTRY glPrimitiveRestartIndexNV (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (GLAPIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#endif - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* GLAPIENTRY glMapObjectBufferATI (GLuint); -GLAPI void GLAPIENTRY glUnmapObjectBufferATI (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (GLAPIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); -GLAPI void GLAPIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAPIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); -GLAPI void GLAPIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void GLAPIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDepthBoundsEXT (GLclampd, GLclampd); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#endif - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#endif - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean GLAPIENTRY glIsRenderbufferEXT (GLuint); -GLAPI void GLAPIENTRY glBindRenderbufferEXT (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); -GLAPI void GLAPIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); -GLAPI void GLAPIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); -GLAPI GLboolean GLAPIENTRY glIsFramebufferEXT (GLuint); -GLAPI void GLAPIENTRY glBindFramebufferEXT (GLenum, GLuint); -GLAPI void GLAPIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); -GLAPI void GLAPIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); -GLAPI GLenum GLAPIENTRY glCheckFramebufferStatusEXT (GLenum); -GLAPI void GLAPIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void GLAPIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void GLAPIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void GLAPIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void GLAPIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void GLAPIENTRY glGenerateMipmapEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (GLAPIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (GLAPIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (GLAPIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (GLAPIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (GLAPIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (GLAPIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (GLAPIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#endif - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); -#endif - -#ifndef GL_EXT_Cg_shader -#define GL_EXT_Cg_shader 1 -#endif - -#ifndef GL_EXT_timer_query -#ifndef GL_COMPILER_LACKS_64BIT_INT -#define GL_EXT_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); -GLAPI void GLAPIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); -#endif -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); -GLAPI void GLAPIENTRY glEndTransformFeedbackNV (void); -GLAPI void GLAPIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); -GLAPI void GLAPIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void GLAPIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void GLAPIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); -GLAPI void GLAPIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -GLAPI void GLAPIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); -GLAPI GLint GLAPIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); -GLAPI void GLAPIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void GLAPIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (GLAPIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (GLAPIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef GLint (GLAPIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -#endif - - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); -GLAPI void GLAPIENTRY glClearDepthdNV (GLdouble depth); -GLAPI void GLAPIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); -typedef void (GLAPIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (GLAPIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 -#endif - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 -#endif - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 -#endif - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void GLAPIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); -GLAPI void GLAPIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); -GLAPI void GLAPIENTRY glEnableIndexedEXT (GLenum target, GLuint index); -GLAPI void GLAPIENTRY glDisableIndexedEXT (GLenum target, GLuint index); -GLAPI GLboolean GLAPIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (GLAPIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (GLAPIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (GLAPIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); -#endif - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); -GLAPI void GLAPIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); -GLAPI void GLAPIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void GLAPIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GLAPIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GLAPIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (GLAPIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); -GLAPI GLint GLAPIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); -GLAPI GLintptr GLAPIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); -typedef GLint (GLAPIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (GLAPIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); -GLAPI void GLAPIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint GLAPIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); -GLAPI void GLAPIENTRY glUniform1uiEXT (GLint location, GLuint v0); -GLAPI void GLAPIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); -GLAPI void GLAPIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void GLAPIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void GLAPIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void GLAPIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void GLAPIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void GLAPIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void GLAPIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); -GLAPI void GLAPIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); -GLAPI void GLAPIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); -GLAPI void GLAPIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); -GLAPI void GLAPIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void GLAPIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void GLAPIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); -GLAPI void GLAPIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); -GLAPI void GLAPIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); -GLAPI void GLAPIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); -GLAPI void GLAPIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); -GLAPI void GLAPIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); -GLAPI void GLAPIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); -GLAPI void GLAPIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); -GLAPI void GLAPIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); -GLAPI void GLAPIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); -GLAPI void GLAPIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); -GLAPI void GLAPIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); -GLAPI void GLAPIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (GLAPIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GLAPIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -#endif - - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -GLAPI void GLAPIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void GLAPIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void GLAPIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); -#endif - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void GLAPIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void GLAPIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void GLAPIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void GLAPIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void GLAPIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void GLAPIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void GLAPIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void GLAPIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void GLAPIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void GLAPIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void GLAPIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); -GLAPI void GLAPIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void GLAPIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void GLAPIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -GLAPI void GLAPIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void GLAPIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GLAPI void GLAPIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GLAPIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#endif - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef __glext_h_ +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + + Copyright NVIDIA Corporation 2006 + + TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED + *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR + CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR + LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, + OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE + THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + +******************************************************************************/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#ifndef GLAPIENTRY +# ifdef _WIN32 +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) /* Mimic */ +# define GLAPIENTRY __stdcall +# else +# define GLAPIENTRY +# endif +# else +# define GLAPIENTRY +# endif +#endif + +#ifndef GLAPI +# define GLAPI extern +#endif + +#ifndef GLAPIENTRYP +# define GLAPIENTRYP GLAPIENTRY * +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2005/06/06 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 28 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_VERSION_2_1 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX_EXT 0x8D45 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + +#ifndef GL_EXT_Cg_shader +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F +#endif + +#ifndef GL_EXT_timer_query +#define GL_TIME_ELAPSED_EXT 0x88BF +#endif + +#ifndef GL_EXT_texture_buffer_object +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +#endif + +#ifndef GL_EXT_gpu_shader4 +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#endif + +#ifndef GL_EXT_geometry_shader4 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#endif + +#ifndef GL_EXT_bindable_uniform +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +#endif + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif + +#ifndef GL_EXT_texture_shared_exponent +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif + +#ifndef GL_EXT_packed_float +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif + +#ifndef GL_EXT_texture_array +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +/* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ +#endif + +#ifndef GL_EXT_texture_integer +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +#endif + +#ifndef GL_NV_depth_buffer_float +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +#endif + +#ifndef GL_EXT_texture_compression_latc +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif + +#ifndef GL_NV_transform_feedback +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#endif + +#ifndef GL_NV_geometry_program4 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +#endif + +#ifndef GL_NV_gpu_program4 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +#endif + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8D57 +#define GL_MAX_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E11 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E13 +#endif + +#ifndef GL_EXT_framebuffer_multisample +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#endif + +#ifndef GL_EXT_framebuffer_blit +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +#endif + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; /* native character */ +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and program/shader text */ +typedef char GLcharARB; /* native character */ +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif + +/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_EXT_timer_query +#ifndef GL_COMPILER_LACKS_64BIT_INT +#if defined(__GNUC__) || defined(__arm) || defined(__IAR_SYSTEMS_ICC__) || defined(__ghs__) || defined(_WIN64) +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#else +typedef signed __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +#endif +#endif +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void GLAPIENTRY glBlendEquation (GLenum); +GLAPI void GLAPIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void GLAPIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void GLAPIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void GLAPIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void GLAPIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void GLAPIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void GLAPIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void GLAPIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void GLAPIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void GLAPIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void GLAPIENTRY glResetHistogram (GLenum); +GLAPI void GLAPIENTRY glResetMinmax (GLenum); +GLAPI void GLAPIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (GLAPIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glActiveTexture (GLenum); +GLAPI void GLAPIENTRY glClientActiveTexture (GLenum); +GLAPI void GLAPIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void GLAPIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void GLAPIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void GLAPIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void GLAPIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void GLAPIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (GLAPIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glFogCoordf (GLfloat); +GLAPI void GLAPIENTRY glFogCoordfv (const GLfloat *); +GLAPI void GLAPIENTRY glFogCoordd (GLdouble); +GLAPI void GLAPIENTRY glFogCoorddv (const GLdouble *); +GLAPI void GLAPIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void GLAPIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void GLAPIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void GLAPIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glPointParameteri (GLenum, GLint); +GLAPI void GLAPIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void GLAPIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void GLAPIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void GLAPIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void GLAPIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void GLAPIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void GLAPIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void GLAPIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void GLAPIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void GLAPIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void GLAPIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void GLAPIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void GLAPIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos2i (GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos2iv (const GLint *); +GLAPI void GLAPIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos2sv (const GLshort *); +GLAPI void GLAPIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos3iv (const GLint *); +GLAPI void GLAPIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean GLAPIENTRY glIsQuery (GLuint); +GLAPI void GLAPIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void GLAPIENTRY glEndQuery (GLenum); +GLAPI void GLAPIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void GLAPIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean GLAPIENTRY glIsBuffer (GLuint); +GLAPI void GLAPIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void GLAPIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void GLAPIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* GLAPIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean GLAPIENTRY glUnmapBuffer (GLenum); +GLAPI void GLAPIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (GLAPIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GLAPIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (GLAPIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (GLAPIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (GLAPIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (GLAPIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (GLAPIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (GLAPIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendEquationSeparate (GLenum, GLenum); +GLAPI void GLAPIENTRY glDrawBuffers (GLsizei, const GLenum *); +GLAPI void GLAPIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); +GLAPI void GLAPIENTRY glStencilMaskSeparate (GLenum, GLuint); +GLAPI void GLAPIENTRY glAttachShader (GLuint, GLuint); +GLAPI void GLAPIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); +GLAPI void GLAPIENTRY glCompileShader (GLuint); +GLAPI GLuint GLAPIENTRY glCreateProgram (void); +GLAPI GLuint GLAPIENTRY glCreateShader (GLenum); +GLAPI void GLAPIENTRY glDeleteProgram (GLuint); +GLAPI void GLAPIENTRY glDeleteShader (GLuint); +GLAPI void GLAPIENTRY glDetachShader (GLuint, GLuint); +GLAPI void GLAPIENTRY glDisableVertexAttribArray (GLuint); +GLAPI void GLAPIENTRY glEnableVertexAttribArray (GLuint); +GLAPI void GLAPIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void GLAPIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void GLAPIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); +GLAPI GLint GLAPIENTRY glGetAttribLocation (GLuint, const GLchar *); +GLAPI void GLAPIENTRY glGetProgramiv (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void GLAPIENTRY glGetShaderiv (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void GLAPIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI GLint GLAPIENTRY glGetUniformLocation (GLuint, const GLchar *); +GLAPI void GLAPIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); +GLAPI void GLAPIENTRY glGetUniformiv (GLuint, GLint, GLint *); +GLAPI void GLAPIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); +GLAPI void GLAPIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean GLAPIENTRY glIsProgram (GLuint); +GLAPI GLboolean GLAPIENTRY glIsShader (GLuint); +GLAPI void GLAPIENTRY glLinkProgram (GLuint); +GLAPI void GLAPIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); +GLAPI void GLAPIENTRY glUseProgram (GLuint); +GLAPI void GLAPIENTRY glUniform1f (GLint, GLfloat); +GLAPI void GLAPIENTRY glUniform2f (GLint, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glUniform1i (GLint, GLint); +GLAPI void GLAPIENTRY glUniform2i (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glUniform3i (GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform1iv (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniform2iv (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniform3iv (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniform4iv (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void GLAPIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void GLAPIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void GLAPIENTRY glValidateProgram (GLuint); +GLAPI void GLAPIENTRY glVertexAttrib1d (GLuint, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib1f (GLuint, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib1s (GLuint, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib1sv (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib2sv (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib3sv (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); +GLAPI void GLAPIENTRY glVertexAttrib4Niv (GLuint, const GLint *); +GLAPI void GLAPIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void GLAPIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); +GLAPI void GLAPIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); +GLAPI void GLAPIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); +GLAPI void GLAPIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); +GLAPI void GLAPIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib4iv (GLuint, const GLint *); +GLAPI void GLAPIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib4sv (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); +GLAPI void GLAPIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); +GLAPI void GLAPIENTRY glVertexAttrib4usv (GLuint, const GLushort *); +GLAPI void GLAPIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (GLAPIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GLAPIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (GLAPIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (GLAPIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GLAPIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GLAPIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (GLAPIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (GLAPIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (GLAPIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void GLAPIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void GLAPIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void GLAPIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void GLAPIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void GLAPIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glActiveTextureARB (GLenum); +GLAPI void GLAPIENTRY glClientActiveTextureARB (GLenum); +GLAPI void GLAPIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void GLAPIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void GLAPIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void GLAPIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void GLAPIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (GLAPIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (GLAPIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void GLAPIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void GLAPIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void GLAPIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void GLAPIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void GLAPIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void GLAPIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void GLAPIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void GLAPIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void GLAPIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (GLAPIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void GLAPIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void GLAPIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void GLAPIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void GLAPIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (GLAPIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (GLAPIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (GLAPIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void GLAPIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void GLAPIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void GLAPIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void GLAPIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void GLAPIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void GLAPIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void GLAPIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void GLAPIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void GLAPIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void GLAPIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void GLAPIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void GLAPIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void GLAPIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void GLAPIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void GLAPIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void GLAPIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void GLAPIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void GLAPIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void GLAPIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void GLAPIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void GLAPIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean GLAPIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (GLAPIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (GLAPIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (GLAPIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean GLAPIENTRY glIsBufferARB (GLuint); +GLAPI void GLAPIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void GLAPIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void GLAPIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* GLAPIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean GLAPIENTRY glUnmapBufferARB (GLenum); +GLAPI void GLAPIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (GLAPIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (GLAPIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (GLAPIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (GLAPIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (GLAPIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean GLAPIENTRY glIsQueryARB (GLuint); +GLAPI void GLAPIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void GLAPIENTRY glEndQueryARB (GLenum); +GLAPI void GLAPIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (GLAPIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GLAPIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB GLAPIENTRY glGetHandleARB (GLenum); +GLAPI void GLAPIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB GLAPIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void GLAPIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void GLAPIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB GLAPIENTRY glCreateProgramObjectARB (void); +GLAPI void GLAPIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void GLAPIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void GLAPIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void GLAPIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void GLAPIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void GLAPIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glUniform1iARB (GLint, GLint); +GLAPI void GLAPIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void GLAPIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void GLAPIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void GLAPIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void GLAPIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void GLAPIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint GLAPIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void GLAPIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void GLAPIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void GLAPIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void GLAPIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (GLAPIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (GLAPIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (GLAPIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (GLAPIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (GLAPIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (GLAPIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (GLAPIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void GLAPIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint GLAPIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (GLAPIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glClampColorARB (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (GLAPIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void GLAPIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void GLAPIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void GLAPIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void GLAPIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void GLAPIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void GLAPIENTRY glResetHistogramEXT (GLenum); +GLAPI void GLAPIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void GLAPIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void GLAPIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void GLAPIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void GLAPIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void GLAPIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void GLAPIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void GLAPIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void GLAPIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void GLAPIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void GLAPIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean GLAPIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void GLAPIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean GLAPIENTRY glIsTextureEXT (GLuint); +GLAPI void GLAPIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (GLAPIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (GLAPIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (GLAPIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (GLAPIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (GLAPIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (GLAPIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void GLAPIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glArrayElementEXT (GLint); +GLAPI void GLAPIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void GLAPIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void GLAPIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void GLAPIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (GLAPIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (GLAPIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void GLAPIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void GLAPIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void GLAPIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void GLAPIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint GLAPIENTRY glGetInstrumentsSGIX (void); +GLAPI void GLAPIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint GLAPIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void GLAPIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void GLAPIENTRY glStartInstrumentsSGIX (void); +GLAPI void GLAPIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (GLAPIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (GLAPIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (GLAPIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (GLAPIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (GLAPIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (GLAPIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void GLAPIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void GLAPIENTRY glDeformSGIX (GLbitfield); +GLAPI void GLAPIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (GLAPIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (GLAPIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (GLAPIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (GLAPIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void GLAPIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void GLAPIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void GLAPIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void GLAPIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void GLAPIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void GLAPIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void GLAPIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void GLAPIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void GLAPIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void GLAPIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void GLAPIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void GLAPIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void GLAPIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void GLAPIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void GLAPIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glApplyTextureEXT (GLenum); +GLAPI void GLAPIENTRY glTextureLightEXT (GLenum); +GLAPI void GLAPIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint GLAPIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint GLAPIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint GLAPIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void GLAPIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean GLAPIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (GLAPIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (GLAPIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (GLAPIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (GLAPIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void GLAPIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void GLAPIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void GLAPIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (GLAPIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (GLAPIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (GLAPIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void GLAPIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void GLAPIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void GLAPIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void GLAPIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void GLAPIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void GLAPIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void GLAPIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void GLAPIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void GLAPIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void GLAPIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void GLAPIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void GLAPIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void GLAPIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void GLAPIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFogCoordfEXT (GLfloat); +GLAPI void GLAPIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void GLAPIENTRY glFogCoorddEXT (GLdouble); +GLAPI void GLAPIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void GLAPIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void GLAPIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void GLAPIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void GLAPIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void GLAPIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glTangent3ivEXT (const GLint *); +GLAPI void GLAPIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glTangent3svEXT (const GLshort *); +GLAPI void GLAPIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void GLAPIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void GLAPIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void GLAPIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void GLAPIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void GLAPIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void GLAPIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (GLAPIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (GLAPIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (GLAPIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (GLAPIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (GLAPIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (GLAPIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (GLAPIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (GLAPIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (GLAPIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (GLAPIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void GLAPIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void GLAPIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void GLAPIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void GLAPIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void GLAPIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void GLAPIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void GLAPIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (GLAPIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void GLAPIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void GLAPIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void GLAPIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void GLAPIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void GLAPIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void GLAPIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void GLAPIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void GLAPIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void GLAPIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void GLAPIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void GLAPIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void GLAPIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void GLAPIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void GLAPIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void GLAPIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void GLAPIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void GLAPIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void GLAPIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void GLAPIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void GLAPIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void GLAPIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void GLAPIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void GLAPIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void GLAPIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void GLAPIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void GLAPIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void GLAPIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void GLAPIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void GLAPIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void GLAPIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (GLAPIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void GLAPIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean GLAPIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean GLAPIENTRY glTestFenceNV (GLuint); +GLAPI void GLAPIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glFinishFenceNV (GLuint); +GLAPI void GLAPIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GLAPIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GLAPIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void GLAPIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void GLAPIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void GLAPIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (GLAPIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (GLAPIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean GLAPIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void GLAPIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void GLAPIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void GLAPIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void GLAPIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean GLAPIENTRY glIsProgramNV (GLuint); +GLAPI void GLAPIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void GLAPIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void GLAPIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void GLAPIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void GLAPIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void GLAPIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void GLAPIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void GLAPIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void GLAPIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (GLAPIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (GLAPIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (GLAPIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (GLAPIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (GLAPIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (GLAPIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void GLAPIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void GLAPIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (GLAPIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (GLAPIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint GLAPIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void GLAPIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void GLAPIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void GLAPIENTRY glBeginFragmentShaderATI (void); +GLAPI void GLAPIENTRY glEndFragmentShaderATI (void); +GLAPI void GLAPIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void GLAPIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void GLAPIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (GLAPIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void GLAPIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint GLAPIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean GLAPIENTRY glIsObjectBufferATI (GLuint); +GLAPI void GLAPIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void GLAPIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void GLAPIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void GLAPIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void GLAPIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (GLAPIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (GLAPIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (GLAPIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBeginVertexShaderEXT (void); +GLAPI void GLAPIENTRY glEndVertexShaderEXT (void); +GLAPI void GLAPIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint GLAPIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void GLAPIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void GLAPIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void GLAPIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void GLAPIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint GLAPIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void GLAPIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void GLAPIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void GLAPIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void GLAPIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void GLAPIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void GLAPIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void GLAPIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void GLAPIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void GLAPIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void GLAPIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void GLAPIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint GLAPIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint GLAPIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint GLAPIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint GLAPIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint GLAPIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean GLAPIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void GLAPIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void GLAPIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void GLAPIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void GLAPIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void GLAPIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (GLAPIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (GLAPIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (GLAPIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (GLAPIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (GLAPIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (GLAPIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (GLAPIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (GLAPIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (GLAPIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (GLAPIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void GLAPIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void GLAPIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void GLAPIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void GLAPIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void GLAPIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void GLAPIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void GLAPIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void GLAPIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void GLAPIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void GLAPIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void GLAPIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void GLAPIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void GLAPIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void GLAPIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void GLAPIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void GLAPIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void GLAPIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void GLAPIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void GLAPIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (GLAPIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void GLAPIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean GLAPIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void GLAPIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void GLAPIENTRY glEndOcclusionQueryNV (void); +GLAPI void GLAPIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void GLAPIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (GLAPIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GLAPIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void GLAPIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void GLAPIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void GLAPIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void GLAPIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void GLAPIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean GLAPIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean GLAPIENTRY glTestFenceAPPLE (GLuint); +GLAPI void GLAPIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean GLAPIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void GLAPIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (GLAPIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (GLAPIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (GLAPIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void GLAPIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean GLAPIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (GLAPIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (GLAPIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void GLAPIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void GLAPIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void GLAPIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void GLAPIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void GLAPIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void GLAPIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void GLAPIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (GLAPIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void GLAPIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void GLAPIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void GLAPIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void GLAPIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void GLAPIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void GLAPIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void GLAPIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void GLAPIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void GLAPIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void GLAPIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void GLAPIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (GLAPIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (GLAPIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (GLAPIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (GLAPIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (GLAPIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (GLAPIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (GLAPIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (GLAPIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (GLAPIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (GLAPIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (GLAPIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (GLAPIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (GLAPIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (GLAPIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void GLAPIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glPrimitiveRestartNV (void); +GLAPI void GLAPIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (GLAPIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* GLAPIENTRY glMapObjectBufferATI (GLuint); +GLAPI void GLAPIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (GLAPIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void GLAPIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void GLAPIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void GLAPIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean GLAPIENTRY glIsRenderbufferEXT (GLuint); +GLAPI void GLAPIENTRY glBindRenderbufferEXT (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); +GLAPI void GLAPIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); +GLAPI void GLAPIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); +GLAPI GLboolean GLAPIENTRY glIsFramebufferEXT (GLuint); +GLAPI void GLAPIENTRY glBindFramebufferEXT (GLenum, GLuint); +GLAPI void GLAPIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); +GLAPI void GLAPIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); +GLAPI GLenum GLAPIENTRY glCheckFramebufferStatusEXT (GLenum); +GLAPI void GLAPIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void GLAPIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void GLAPIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +GLAPI void GLAPIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void GLAPIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); +GLAPI void GLAPIENTRY glGenerateMipmapEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (GLAPIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (GLAPIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (GLAPIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (GLAPIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (GLAPIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (GLAPIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (GLAPIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 +#endif + +#ifndef GL_EXT_timer_query +#ifndef GL_COMPILER_LACKS_64BIT_INT +#define GL_EXT_timer_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); +GLAPI void GLAPIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); +#endif +#endif + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#endif + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void GLAPIENTRY glEndTransformFeedbackNV (void); +GLAPI void GLAPIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); +GLAPI void GLAPIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void GLAPIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void GLAPIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void GLAPIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void GLAPIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint GLAPIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void GLAPIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void GLAPIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (GLAPIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (GLAPIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +#endif + + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void GLAPIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (GLAPIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#endif + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#endif + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#endif + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#endif + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#endif + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#endif + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void GLAPIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void GLAPIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void GLAPIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void GLAPIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean GLAPIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (GLAPIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (GLAPIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (GLAPIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +#endif + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void GLAPIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void GLAPIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GLAPIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint GLAPIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr GLAPIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (GLAPIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#endif + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void GLAPIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint GLAPIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void GLAPIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void GLAPIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void GLAPIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void GLAPIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void GLAPIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void GLAPIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void GLAPIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void GLAPIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void GLAPIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void GLAPIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void GLAPIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void GLAPIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void GLAPIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void GLAPIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void GLAPIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void GLAPIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void GLAPIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void GLAPIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void GLAPIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void GLAPIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void GLAPIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void GLAPIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void GLAPIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void GLAPIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void GLAPIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void GLAPIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void GLAPIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#endif + + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +GLAPI void GLAPIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void GLAPIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void GLAPIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +#endif + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void GLAPIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void GLAPIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void GLAPIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void GLAPIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void GLAPIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void GLAPIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void GLAPIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void GLAPIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void GLAPIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void GLAPIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void GLAPIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void GLAPIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void GLAPIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (GLAPIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#endif + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void GLAPIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +GLAPI void GLAPIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +#endif + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void GLAPIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void GLAPIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GLAPIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Extras/sph/common/glut.h b/Extras/sph/common/glut.h index 752ba0252..11735a140 100644 --- a/Extras/sph/common/glut.h +++ b/Extras/sph/common/glut.h @@ -1,791 +1,791 @@ -#ifndef __glut_h__ -#define __glut_h__ - -/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998, 2000, 2006. */ - -/* This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. */ - -#if defined(_WIN32) || defined(__CYGWIN__) - -/* GLUT 3.7 now tries to avoid including - to avoid name space pollution, but Win32's - needs APIENTRY and WINGDIAPI defined properly. */ -# if 0 - /* This would put tons of macros and crap in our clean name space. */ -# define WIN32_LEAN_AND_MEAN -# include -# else - /* XXX This is from Win32's */ -# ifndef APIENTRY -# define GLUT_APIENTRY_DEFINED - /* Cygwin and MingW32 are two free GNU-based Open Source compilation - environments for Win32. Note that __CYGWIN32__ is deprecated - in favor of simply __CYGWIN__. */ -# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) -# if defined(__CYGWIN__) -# define APIENTRY __stdcall -# else -# ifdef i386 -# define APIENTRY __attribute__((stdcall)) -# else -# define APIENTRY -# endif -# endif -# else -# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) -# define APIENTRY __stdcall -# else -# define APIENTRY -# endif -# endif -# endif - /* XXX This is from Win32's */ -# ifndef CALLBACK -# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) -# ifndef __stdcall -# define __stdcall __attribute__((stdcall)) -# endif -# define CALLBACK __stdcall -# else -# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -# endif -# endif - /* XXX This is from Win32's and */ -# ifndef WINGDIAPI -# define GLUT_WINGDIAPI_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) -# define WINGDIAPI -# else -# define WINGDIAPI __declspec(dllimport) -# endif -# endif -# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) - /* Rely on Cygwin32/MingW32 to set wchar_t. */ - /* XXX Warning. The Cygwin32/MingW32 definition for wchar_t - is an "int" instead of the "short" used by Windows. */ -# include -# else - /* XXX This is from Win32's */ -# ifndef _WCHAR_T_DEFINED -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -# endif -# endif -# endif - -/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA - in your compile preprocessor options (Microsoft Visual C only). */ -# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA) && defined(_MSC_VER) -# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */ -# pragma comment (lib, "user32.lib") /* link with Windows User lib */ -# pragma comment (lib, "gdi32.lib") /* link with Windows GDI lib */ -/* To enable automatic SGI OpenGL for Windows library usage for GLUT, - define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */ -# ifdef GLUT_USE_SGI_OPENGL -# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */ -# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */ -# if defined(GLUT_STATIC_LIB) -# pragma comment (lib, "glutstatic.lib") /* link with static Win32 GLUT lib */ -# else -# pragma comment (lib, "glut.lib") /* link with Win32 GLUT lib */ -# endif -# else -# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */ -# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */ -# if defined(GLUT_STATIC_LIB) -# pragma comment (lib, "glutstatic.lib") /* link with static Win32 GLUT lib */ -# else -# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */ -# endif -# endif -# endif - -/* To disable supression of annoying warnings about floats being promoted - to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor - options. */ -# if defined(_MSC_VER) && !defined(GLUT_NO_WARNING_DISABLE) -# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */ -# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */ -# endif - -/* Win32 has an annoying issue where there are multiple C run-time - libraries (CRTs). If the executable is linked with a different CRT - from the GLUT DLL, the GLUT DLL will not share the same CRT static - data seen by the executable. In particular, atexit callbacks registered - in the executable will not be called if GLUT calls its (different) - exit routine). GLUT is typically built with the - "/MD" option (the CRT with multithreading DLL support), but the Visual - C++ linker default is "/ML" (the single threaded CRT). - - One workaround to this issue is requiring users to always link with - the same CRT as GLUT is compiled with. That requires users supply a - non-standard option. GLUT 3.7 has its own built-in workaround where - the executable's "exit" function pointer is covertly passed to GLUT. - GLUT then calls the executable's exit function pointer to ensure that - any "atexit" calls registered by the application are called if GLUT - needs to exit. - - Note that the __glut*WithExit routines should NEVER be called directly. - To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ - -/* XXX This is from Win32's */ -# if !defined(_MSC_VER) && !defined(__cdecl) - /* Define __cdecl for non-Microsoft compilers. */ -# define __cdecl -# define GLUT_DEFINED___CDECL -# endif -# ifndef _CRTIMP -# ifdef _NTSDK - /* Definition compatible with NT SDK */ -# define _CRTIMP -# else - /* Current definition */ -# ifdef _DLL -# define _CRTIMP __declspec(dllimport) -# else -# define _CRTIMP -# endif -# endif -# define GLUT_DEFINED__CRTIMP -# endif - -/* GLUT API entry point declarations for Win32. */ -# ifdef GLUT_BUILDING_LIB -/* MSDN article 835326 says "When you build a DLL by using the 64-bit - version of the Microsoft Visual C++ Compiler and Linker, you may - receive Linker error number LNK4197 if a function has been declared - for export more than one time." GLUT builds with glut.def that - declares GLUT's EXPORTS list so do not use __declspec(dllexport) - to keep 64-bit compiler happy. */ -# define GLUTAPI /*__declspec(dllexport)*/ -# else -# ifdef _DLL -# define GLUTAPI __declspec(dllimport) -# else -# define GLUTAPI extern -# endif -# endif - -/* GLUT callback calling convention for Win32. */ -# define GLUTCALLBACK __cdecl - -# if (_MSC_VER >= 800) || defined(__MINGW32__) || defined(_STDCALL_SUPPORTED) || defined(__CYGWIN32__) -# define GLUTAPIENTRY __stdcall -# else -# define GLUTAPIENTRY -# endif - -#endif /* _WIN32 */ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(_WIN32) || defined(__CYGWIN__) -# ifndef GLUT_BUILDING_LIB -# if __BORLANDC__ -# if defined(_BUILDRTLDLL) -void __cdecl __export exit(int __status); -# else -void __cdecl exit(int __status); -# endif -# else -# if _MSC_VER >= 1200 - extern _CRTIMP __declspec(noreturn) void __cdecl exit(int); -# else - extern _CRTIMP void __cdecl exit(int); -# endif -# endif -# endif -#else -/* non-Win32 case. */ -/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */ -# define APIENTRY -# define GLUT_APIENTRY_DEFINED -# define CALLBACK -/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */ -# define GLUTAPI extern -# define GLUTAPIENTRY -# define GLUTCALLBACK -/* Prototype exit for the non-Win32 case (see above). */ -# ifdef __GNUC__ -extern void exit(int __status) __attribute__((__noreturn__)); -# else -extern void exit(int); -# endif -#endif - -/** - GLUT API revision history: - - GLUT_API_VERSION is updated to reflect incompatible GLUT - API changes (interface changes, semantic changes, deletions, - or additions). - - GLUT_API_VERSION=1 First public release of GLUT. 11/29/94 - - GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling, - extension. Supports new input devices like tablet, dial and button - box, and Spaceball. Easy to query OpenGL extensions. - - GLUT_API_VERSION=3 glutMenuStatus added. - - GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer, - glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic - video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc, - glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat, - glutJoystickFunc, glutForceJoystickFunc, glutStrokeWidthf, - glutStrokeLengthf (NOT FINALIZED!). -**/ -#ifndef GLUT_API_VERSION /* allow this to be overriden */ -#define GLUT_API_VERSION 3 -#endif - -/** - GLUT implementation revision history: - - GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT - API revisions and implementation revisions (ie, bug fixes). - - GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of - GLUT Xlib-based implementation. 11/29/94 - - GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of - GLUT Xlib-based implementation providing GLUT version 2 - interfaces. - - GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95 - - GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95 - - GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95 - - GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96 - - GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner - and video resize. 1/3/97 - - GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines. - - GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release. - - GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling. - - GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support. - - GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface. - - GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa - - GLUT_XLIB_IMPLEMENTATION=16 mjk's early GLUT 3.8 - - GLUT_XLIB_IMPLEMENTATION=17 mjk's GLUT 3.8 with glutStrokeWidthf and glutStrokeLengthf -**/ -#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */ -#define GLUT_XLIB_IMPLEMENTATION 17 -#endif - -/* Display mode bit masks. */ -#define GLUT_RGB 0 -#define GLUT_RGBA GLUT_RGB -#define GLUT_INDEX 1 -#define GLUT_SINGLE 0 -#define GLUT_DOUBLE 2 -#define GLUT_ACCUM 4 -#define GLUT_ALPHA 8 -#define GLUT_DEPTH 16 -#define GLUT_STENCIL 32 -#if (GLUT_API_VERSION >= 2) -#define GLUT_MULTISAMPLE 128 -#define GLUT_STEREO 256 -#endif -#if (GLUT_API_VERSION >= 3) -#define GLUT_LUMINANCE 512 -#endif - -/* Mouse buttons. */ -#define GLUT_LEFT_BUTTON 0 -#define GLUT_MIDDLE_BUTTON 1 -#define GLUT_RIGHT_BUTTON 2 - -/* Mouse button state. */ -#define GLUT_DOWN 0 -#define GLUT_UP 1 - -#if (GLUT_API_VERSION >= 2) -/* function keys */ -#define GLUT_KEY_F1 1 -#define GLUT_KEY_F2 2 -#define GLUT_KEY_F3 3 -#define GLUT_KEY_F4 4 -#define GLUT_KEY_F5 5 -#define GLUT_KEY_F6 6 -#define GLUT_KEY_F7 7 -#define GLUT_KEY_F8 8 -#define GLUT_KEY_F9 9 -#define GLUT_KEY_F10 10 -#define GLUT_KEY_F11 11 -#define GLUT_KEY_F12 12 -/* directional keys */ -#define GLUT_KEY_LEFT 100 -#define GLUT_KEY_UP 101 -#define GLUT_KEY_RIGHT 102 -#define GLUT_KEY_DOWN 103 -#define GLUT_KEY_PAGE_UP 104 -#define GLUT_KEY_PAGE_DOWN 105 -#define GLUT_KEY_HOME 106 -#define GLUT_KEY_END 107 -#define GLUT_KEY_INSERT 108 -#endif - -/* Entry/exit state. */ -#define GLUT_LEFT 0 -#define GLUT_ENTERED 1 - -/* Menu usage state. */ -#define GLUT_MENU_NOT_IN_USE 0 -#define GLUT_MENU_IN_USE 1 - -/* Visibility state. */ -#define GLUT_NOT_VISIBLE 0 -#define GLUT_VISIBLE 1 - -/* Window status state. */ -#define GLUT_HIDDEN 0 -#define GLUT_FULLY_RETAINED 1 -#define GLUT_PARTIALLY_RETAINED 2 -#define GLUT_FULLY_COVERED 3 - -/* Color index component selection values. */ -#define GLUT_RED 0 -#define GLUT_GREEN 1 -#define GLUT_BLUE 2 - -#ifdef _WIN32 -/* Stroke font constants (use these in GLUT program). */ -#define GLUT_STROKE_ROMAN ((void*)0) -#define GLUT_STROKE_MONO_ROMAN ((void*)1) - -/* Bitmap font constants (use these in GLUT program). */ -#define GLUT_BITMAP_9_BY_15 ((void*)2) -#define GLUT_BITMAP_8_BY_13 ((void*)3) -#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4) -#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5) -#if (GLUT_API_VERSION >= 3) -#define GLUT_BITMAP_HELVETICA_10 ((void*)6) -#define GLUT_BITMAP_HELVETICA_12 ((void*)7) -#define GLUT_BITMAP_HELVETICA_18 ((void*)8) -#endif -#else -/* Stroke font opaque addresses (use constants instead in source code). */ -GLUTAPI void *glutStrokeRoman; -GLUTAPI void *glutStrokeMonoRoman; - -/* Stroke font constants (use these in GLUT program). */ -#define GLUT_STROKE_ROMAN (&glutStrokeRoman) -#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman) - -/* Bitmap font opaque addresses (use constants instead in source code). */ -GLUTAPI void *glutBitmap9By15; -GLUTAPI void *glutBitmap8By13; -GLUTAPI void *glutBitmapTimesRoman10; -GLUTAPI void *glutBitmapTimesRoman24; -GLUTAPI void *glutBitmapHelvetica10; -GLUTAPI void *glutBitmapHelvetica12; -GLUTAPI void *glutBitmapHelvetica18; - -/* Bitmap font constants (use these in GLUT program). */ -#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) -#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13) -#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10) -#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24) -#if (GLUT_API_VERSION >= 3) -#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10) -#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12) -#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18) -#endif -#endif - -/* glutGet parameters. */ -#define GLUT_WINDOW_X ((GLenum) 100) -#define GLUT_WINDOW_Y ((GLenum) 101) -#define GLUT_WINDOW_WIDTH ((GLenum) 102) -#define GLUT_WINDOW_HEIGHT ((GLenum) 103) -#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104) -#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105) -#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106) -#define GLUT_WINDOW_RED_SIZE ((GLenum) 107) -#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108) -#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109) -#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110) -#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111) -#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112) -#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113) -#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114) -#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115) -#define GLUT_WINDOW_RGBA ((GLenum) 116) -#define GLUT_WINDOW_PARENT ((GLenum) 117) -#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118) -#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119) -#if (GLUT_API_VERSION >= 2) -#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120) -#define GLUT_WINDOW_STEREO ((GLenum) 121) -#endif -#if (GLUT_API_VERSION >= 3) -#define GLUT_WINDOW_CURSOR ((GLenum) 122) -#endif -#define GLUT_SCREEN_WIDTH ((GLenum) 200) -#define GLUT_SCREEN_HEIGHT ((GLenum) 201) -#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202) -#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203) -#define GLUT_MENU_NUM_ITEMS ((GLenum) 300) -#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400) -#define GLUT_INIT_WINDOW_X ((GLenum) 500) -#define GLUT_INIT_WINDOW_Y ((GLenum) 501) -#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502) -#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503) -#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504) -#if (GLUT_API_VERSION >= 2) -#define GLUT_ELAPSED_TIME ((GLenum) 700) -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123) -#endif - -#if (GLUT_API_VERSION >= 2) -/* glutDeviceGet parameters. */ -#define GLUT_HAS_KEYBOARD ((GLenum) 600) -#define GLUT_HAS_MOUSE ((GLenum) 601) -#define GLUT_HAS_SPACEBALL ((GLenum) 602) -#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603) -#define GLUT_HAS_TABLET ((GLenum) 604) -#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605) -#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606) -#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607) -#define GLUT_NUM_DIALS ((GLenum) 608) -#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609) -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610) -#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611) -#define GLUT_HAS_JOYSTICK ((GLenum) 612) -#define GLUT_OWNS_JOYSTICK ((GLenum) 613) -#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614) -#define GLUT_JOYSTICK_AXES ((GLenum) 615) -#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616) -#endif - -#if (GLUT_API_VERSION >= 3) -/* glutLayerGet parameters. */ -#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800) -#define GLUT_LAYER_IN_USE ((GLenum) 801) -#define GLUT_HAS_OVERLAY ((GLenum) 802) -#define GLUT_TRANSPARENT_INDEX ((GLenum) 803) -#define GLUT_NORMAL_DAMAGED ((GLenum) 804) -#define GLUT_OVERLAY_DAMAGED ((GLenum) 805) - -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -/* glutVideoResizeGet parameters. */ -#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900) -#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901) -#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902) -#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903) -#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904) -#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905) -#define GLUT_VIDEO_RESIZE_X ((GLenum) 906) -#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907) -#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908) -#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909) -#endif - -/* glutUseLayer parameters. */ -#define GLUT_NORMAL ((GLenum) 0) -#define GLUT_OVERLAY ((GLenum) 1) - -/* glutGetModifiers return mask. */ -#define GLUT_ACTIVE_SHIFT 1 -#define GLUT_ACTIVE_CTRL 2 -#define GLUT_ACTIVE_ALT 4 - -/* glutSetCursor parameters. */ -/* Basic arrows. */ -#define GLUT_CURSOR_RIGHT_ARROW 0 -#define GLUT_CURSOR_LEFT_ARROW 1 -/* Symbolic cursor shapes. */ -#define GLUT_CURSOR_INFO 2 -#define GLUT_CURSOR_DESTROY 3 -#define GLUT_CURSOR_HELP 4 -#define GLUT_CURSOR_CYCLE 5 -#define GLUT_CURSOR_SPRAY 6 -#define GLUT_CURSOR_WAIT 7 -#define GLUT_CURSOR_TEXT 8 -#define GLUT_CURSOR_CROSSHAIR 9 -/* Directional cursors. */ -#define GLUT_CURSOR_UP_DOWN 10 -#define GLUT_CURSOR_LEFT_RIGHT 11 -/* Sizing cursors. */ -#define GLUT_CURSOR_TOP_SIDE 12 -#define GLUT_CURSOR_BOTTOM_SIDE 13 -#define GLUT_CURSOR_LEFT_SIDE 14 -#define GLUT_CURSOR_RIGHT_SIDE 15 -#define GLUT_CURSOR_TOP_LEFT_CORNER 16 -#define GLUT_CURSOR_TOP_RIGHT_CORNER 17 -#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18 -#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19 -/* Inherit from parent window. */ -#define GLUT_CURSOR_INHERIT 100 -/* Blank cursor. */ -#define GLUT_CURSOR_NONE 101 -/* Fullscreen crosshair (if available). */ -#define GLUT_CURSOR_FULL_CROSSHAIR 102 -#endif - -/* GLUT initialization sub-API. */ -GLUTAPI void GLUTAPIENTRY glutInit(int *argcp, char **argv); -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) -GLUTAPI void GLUTAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); -#ifndef GLUT_BUILDING_LIB -static void GLUTAPIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } -#define glutInit glutInit_ATEXIT_HACK -#endif -#endif -GLUTAPI void GLUTAPIENTRY glutInitDisplayMode(unsigned int mode); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI void GLUTAPIENTRY glutInitDisplayString(const char *string); -#endif -GLUTAPI void GLUTAPIENTRY glutInitWindowPosition(int x, int y); -GLUTAPI void GLUTAPIENTRY glutInitWindowSize(int width, int height); -GLUTAPI void GLUTAPIENTRY glutMainLoop(void); - -/* GLUT window sub-API. */ -GLUTAPI int GLUTAPIENTRY glutCreateWindow(const char *title); -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) -GLUTAPI int GLUTAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); -#ifndef GLUT_BUILDING_LIB -static int GLUTAPIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } -#define glutCreateWindow glutCreateWindow_ATEXIT_HACK -#endif -#endif -GLUTAPI int GLUTAPIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height); -GLUTAPI void GLUTAPIENTRY glutDestroyWindow(int win); -GLUTAPI void GLUTAPIENTRY glutPostRedisplay(void); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) -GLUTAPI void GLUTAPIENTRY glutPostWindowRedisplay(int win); -#endif -GLUTAPI void GLUTAPIENTRY glutSwapBuffers(void); -GLUTAPI int GLUTAPIENTRY glutGetWindow(void); -GLUTAPI void GLUTAPIENTRY glutSetWindow(int win); -GLUTAPI void GLUTAPIENTRY glutSetWindowTitle(const char *title); -GLUTAPI void GLUTAPIENTRY glutSetIconTitle(const char *title); -GLUTAPI void GLUTAPIENTRY glutPositionWindow(int x, int y); -GLUTAPI void GLUTAPIENTRY glutReshapeWindow(int width, int height); -GLUTAPI void GLUTAPIENTRY glutPopWindow(void); -GLUTAPI void GLUTAPIENTRY glutPushWindow(void); -GLUTAPI void GLUTAPIENTRY glutIconifyWindow(void); -GLUTAPI void GLUTAPIENTRY glutShowWindow(void); -GLUTAPI void GLUTAPIENTRY glutHideWindow(void); -#if (GLUT_API_VERSION >= 3) -GLUTAPI void GLUTAPIENTRY glutFullScreen(void); -GLUTAPI void GLUTAPIENTRY glutSetCursor(int cursor); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI void GLUTAPIENTRY glutWarpPointer(int x, int y); -#endif - -/* GLUT overlay sub-API. */ -GLUTAPI void GLUTAPIENTRY glutEstablishOverlay(void); -GLUTAPI void GLUTAPIENTRY glutRemoveOverlay(void); -GLUTAPI void GLUTAPIENTRY glutUseLayer(GLenum layer); -GLUTAPI void GLUTAPIENTRY glutPostOverlayRedisplay(void); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) -GLUTAPI void GLUTAPIENTRY glutPostWindowOverlayRedisplay(int win); -#endif -GLUTAPI void GLUTAPIENTRY glutShowOverlay(void); -GLUTAPI void GLUTAPIENTRY glutHideOverlay(void); -#endif - -/* GLUT menu sub-API. */ -GLUTAPI int GLUTAPIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int)); -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) -GLUTAPI int GLUTAPIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int)); -#ifndef GLUT_BUILDING_LIB -static int GLUTAPIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); } -#define glutCreateMenu glutCreateMenu_ATEXIT_HACK -#endif -#endif -GLUTAPI void GLUTAPIENTRY glutDestroyMenu(int menu); -GLUTAPI int GLUTAPIENTRY glutGetMenu(void); -GLUTAPI void GLUTAPIENTRY glutSetMenu(int menu); -GLUTAPI void GLUTAPIENTRY glutAddMenuEntry(const char *label, int value); -GLUTAPI void GLUTAPIENTRY glutAddSubMenu(const char *label, int submenu); -GLUTAPI void GLUTAPIENTRY glutChangeToMenuEntry(int item, const char *label, int value); -GLUTAPI void GLUTAPIENTRY glutChangeToSubMenu(int item, const char *label, int submenu); -GLUTAPI void GLUTAPIENTRY glutRemoveMenuItem(int item); -GLUTAPI void GLUTAPIENTRY glutAttachMenu(int button); -GLUTAPI void GLUTAPIENTRY glutDetachMenu(int button); - -/* GLUT window callback sub-API. */ -GLUTAPI void GLUTAPIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void)); -GLUTAPI void GLUTAPIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height)); -GLUTAPI void GLUTAPIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); -GLUTAPI void GLUTAPIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); -GLUTAPI void GLUTAPIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); -GLUTAPI void GLUTAPIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); -GLUTAPI void GLUTAPIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state)); -GLUTAPI void GLUTAPIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state)); -GLUTAPI void GLUTAPIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void)); -GLUTAPI void GLUTAPIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value); -GLUTAPI void GLUTAPIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state)); -#if (GLUT_API_VERSION >= 2) -GLUTAPI void GLUTAPIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); -GLUTAPI void GLUTAPIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); -GLUTAPI void GLUTAPIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); -GLUTAPI void GLUTAPIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state)); -GLUTAPI void GLUTAPIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state)); -GLUTAPI void GLUTAPIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value)); -GLUTAPI void GLUTAPIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); -GLUTAPI void GLUTAPIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); -#if (GLUT_API_VERSION >= 3) -GLUTAPI void GLUTAPIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y)); -GLUTAPI void GLUTAPIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void)); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI void GLUTAPIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state)); -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -GLUTAPI void GLUTAPIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); -GLUTAPI void GLUTAPIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); -GLUTAPI void GLUTAPIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval); -#endif -#endif -#endif - -/* GLUT color index sub-API. */ -GLUTAPI void GLUTAPIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue); -GLUTAPI GLfloat GLUTAPIENTRY glutGetColor(int ndx, int component); -GLUTAPI void GLUTAPIENTRY glutCopyColormap(int win); - -/* GLUT state retrieval sub-API. */ -GLUTAPI int GLUTAPIENTRY glutGet(GLenum type); -GLUTAPI int GLUTAPIENTRY glutDeviceGet(GLenum type); -#if (GLUT_API_VERSION >= 2) -/* GLUT extension support sub-API */ -GLUTAPI int GLUTAPIENTRY glutExtensionSupported(const char *name); -#endif -#if (GLUT_API_VERSION >= 3) -GLUTAPI int GLUTAPIENTRY glutGetModifiers(void); -GLUTAPI int GLUTAPIENTRY glutLayerGet(GLenum type); -#endif - -/* GLUT font sub-API */ -GLUTAPI void GLUTAPIENTRY glutBitmapCharacter(void *font, int character); -GLUTAPI int GLUTAPIENTRY glutBitmapWidth(void *font, int character); -GLUTAPI void GLUTAPIENTRY glutStrokeCharacter(void *font, int character); -GLUTAPI int GLUTAPIENTRY glutStrokeWidth(void *font, int character); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI int GLUTAPIENTRY glutBitmapLength(void *font, const unsigned char *string); -GLUTAPI int GLUTAPIENTRY glutStrokeLength(void *font, const unsigned char *string); -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 17) -GLUTAPI float GLUTAPIENTRY glutStrokeWidthf(void *font, int character); -GLUTAPI float GLUTAPIENTRY glutStrokeLengthf(void *font, const unsigned char *string); -#endif - -/* GLUT pre-built models sub-API */ -GLUTAPI void GLUTAPIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks); -GLUTAPI void GLUTAPIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); -GLUTAPI void GLUTAPIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); -GLUTAPI void GLUTAPIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); -GLUTAPI void GLUTAPIENTRY glutWireCube(GLdouble size); -GLUTAPI void GLUTAPIENTRY glutSolidCube(GLdouble size); -GLUTAPI void GLUTAPIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); -GLUTAPI void GLUTAPIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); -GLUTAPI void GLUTAPIENTRY glutWireDodecahedron(void); -GLUTAPI void GLUTAPIENTRY glutSolidDodecahedron(void); -GLUTAPI void GLUTAPIENTRY glutWireTeapot(GLdouble size); -GLUTAPI void GLUTAPIENTRY glutSolidTeapot(GLdouble size); -GLUTAPI void GLUTAPIENTRY glutWireOctahedron(void); -GLUTAPI void GLUTAPIENTRY glutSolidOctahedron(void); -GLUTAPI void GLUTAPIENTRY glutWireTetrahedron(void); -GLUTAPI void GLUTAPIENTRY glutSolidTetrahedron(void); -GLUTAPI void GLUTAPIENTRY glutWireIcosahedron(void); -GLUTAPI void GLUTAPIENTRY glutSolidIcosahedron(void); - -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -/* GLUT video resize sub-API. */ -GLUTAPI int GLUTAPIENTRY glutVideoResizeGet(GLenum param); -GLUTAPI void GLUTAPIENTRY glutSetupVideoResizing(void); -GLUTAPI void GLUTAPIENTRY glutStopVideoResizing(void); -GLUTAPI void GLUTAPIENTRY glutVideoResize(int x, int y, int width, int height); -GLUTAPI void GLUTAPIENTRY glutVideoPan(int x, int y, int width, int height); - -/* GLUT debugging sub-API. */ -GLUTAPI void GLUTAPIENTRY glutReportErrors(void); -#endif - -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -/* GLUT device control sub-API. */ -/* glutSetKeyRepeat modes. */ -#define GLUT_KEY_REPEAT_OFF 0 -#define GLUT_KEY_REPEAT_ON 1 -#define GLUT_KEY_REPEAT_DEFAULT 2 - -/* Joystick button masks. */ -#define GLUT_JOYSTICK_BUTTON_A 1 -#define GLUT_JOYSTICK_BUTTON_B 2 -#define GLUT_JOYSTICK_BUTTON_C 4 -#define GLUT_JOYSTICK_BUTTON_D 8 - -GLUTAPI void GLUTAPIENTRY glutIgnoreKeyRepeat(int ignore); -GLUTAPI void GLUTAPIENTRY glutSetKeyRepeat(int repeatMode); -GLUTAPI void GLUTAPIENTRY glutForceJoystickFunc(void); - -/* GLUT game mode sub-API. */ -/* glutGameModeGet. */ -#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0) -#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1) -#define GLUT_GAME_MODE_WIDTH ((GLenum) 2) -#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3) -#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4) -#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5) -#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6) - -GLUTAPI void GLUTAPIENTRY glutGameModeString(const char *string); -GLUTAPI int GLUTAPIENTRY glutEnterGameMode(void); -GLUTAPI void GLUTAPIENTRY glutLeaveGameMode(void); -GLUTAPI int GLUTAPIENTRY glutGameModeGet(GLenum mode); -#endif - -#ifdef __cplusplus -} - -#endif - -#ifdef GLUT_APIENTRY_DEFINED -# undef GLUT_APIENTRY_DEFINED -# undef APIENTRY -#endif - -#ifdef GLUT_WINGDIAPI_DEFINED -# undef GLUT_WINGDIAPI_DEFINED -# undef WINGDIAPI -#endif - -#ifdef GLUT_DEFINED___CDECL -# undef GLUT_DEFINED___CDECL -# undef __cdecl -#endif - -#ifdef GLUT_DEFINED__CRTIMP -# undef GLUT_DEFINED__CRTIMP -# undef _CRTIMP -#endif - -#endif /* __glut_h__ */ +#ifndef __glut_h__ +#define __glut_h__ + +/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998, 2000, 2006. */ + +/* This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. */ + +#if defined(_WIN32) || defined(__CYGWIN__) + +/* GLUT 3.7 now tries to avoid including + to avoid name space pollution, but Win32's + needs APIENTRY and WINGDIAPI defined properly. */ +# if 0 + /* This would put tons of macros and crap in our clean name space. */ +# define WIN32_LEAN_AND_MEAN +# include +# else + /* XXX This is from Win32's */ +# ifndef APIENTRY +# define GLUT_APIENTRY_DEFINED + /* Cygwin and MingW32 are two free GNU-based Open Source compilation + environments for Win32. Note that __CYGWIN32__ is deprecated + in favor of simply __CYGWIN__. */ +# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) +# if defined(__CYGWIN__) +# define APIENTRY __stdcall +# else +# ifdef i386 +# define APIENTRY __attribute__((stdcall)) +# else +# define APIENTRY +# endif +# endif +# else +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +# endif +# endif + /* XXX This is from Win32's */ +# ifndef CALLBACK +# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) +# ifndef __stdcall +# define __stdcall __attribute__((stdcall)) +# endif +# define CALLBACK __stdcall +# else +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +# endif +# endif + /* XXX This is from Win32's and */ +# ifndef WINGDIAPI +# define GLUT_WINGDIAPI_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) +# define WINGDIAPI +# else +# define WINGDIAPI __declspec(dllimport) +# endif +# endif +# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) + /* Rely on Cygwin32/MingW32 to set wchar_t. */ + /* XXX Warning. The Cygwin32/MingW32 definition for wchar_t + is an "int" instead of the "short" used by Windows. */ +# include +# else + /* XXX This is from Win32's */ +# ifndef _WCHAR_T_DEFINED +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +# endif +# endif +# endif + +/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA + in your compile preprocessor options (Microsoft Visual C only). */ +# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA) && defined(_MSC_VER) +# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */ +# pragma comment (lib, "user32.lib") /* link with Windows User lib */ +# pragma comment (lib, "gdi32.lib") /* link with Windows GDI lib */ +/* To enable automatic SGI OpenGL for Windows library usage for GLUT, + define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */ +# ifdef GLUT_USE_SGI_OPENGL +# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */ +# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */ +# if defined(GLUT_STATIC_LIB) +# pragma comment (lib, "glutstatic.lib") /* link with static Win32 GLUT lib */ +# else +# pragma comment (lib, "glut.lib") /* link with Win32 GLUT lib */ +# endif +# else +# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */ +# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */ +# if defined(GLUT_STATIC_LIB) +# pragma comment (lib, "glutstatic.lib") /* link with static Win32 GLUT lib */ +# else +# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */ +# endif +# endif +# endif + +/* To disable supression of annoying warnings about floats being promoted + to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor + options. */ +# if defined(_MSC_VER) && !defined(GLUT_NO_WARNING_DISABLE) +# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */ +# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */ +# endif + +/* Win32 has an annoying issue where there are multiple C run-time + libraries (CRTs). If the executable is linked with a different CRT + from the GLUT DLL, the GLUT DLL will not share the same CRT static + data seen by the executable. In particular, atexit callbacks registered + in the executable will not be called if GLUT calls its (different) + exit routine). GLUT is typically built with the + "/MD" option (the CRT with multithreading DLL support), but the Visual + C++ linker default is "/ML" (the single threaded CRT). + + One workaround to this issue is requiring users to always link with + the same CRT as GLUT is compiled with. That requires users supply a + non-standard option. GLUT 3.7 has its own built-in workaround where + the executable's "exit" function pointer is covertly passed to GLUT. + GLUT then calls the executable's exit function pointer to ensure that + any "atexit" calls registered by the application are called if GLUT + needs to exit. + + Note that the __glut*WithExit routines should NEVER be called directly. + To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ + +/* XXX This is from Win32's */ +# if !defined(_MSC_VER) && !defined(__cdecl) + /* Define __cdecl for non-Microsoft compilers. */ +# define __cdecl +# define GLUT_DEFINED___CDECL +# endif +# ifndef _CRTIMP +# ifdef _NTSDK + /* Definition compatible with NT SDK */ +# define _CRTIMP +# else + /* Current definition */ +# ifdef _DLL +# define _CRTIMP __declspec(dllimport) +# else +# define _CRTIMP +# endif +# endif +# define GLUT_DEFINED__CRTIMP +# endif + +/* GLUT API entry point declarations for Win32. */ +# ifdef GLUT_BUILDING_LIB +/* MSDN article 835326 says "When you build a DLL by using the 64-bit + version of the Microsoft Visual C++ Compiler and Linker, you may + receive Linker error number LNK4197 if a function has been declared + for export more than one time." GLUT builds with glut.def that + declares GLUT's EXPORTS list so do not use __declspec(dllexport) + to keep 64-bit compiler happy. */ +# define GLUTAPI /*__declspec(dllexport)*/ +# else +# ifdef _DLL +# define GLUTAPI __declspec(dllimport) +# else +# define GLUTAPI extern +# endif +# endif + +/* GLUT callback calling convention for Win32. */ +# define GLUTCALLBACK __cdecl + +# if (_MSC_VER >= 800) || defined(__MINGW32__) || defined(_STDCALL_SUPPORTED) || defined(__CYGWIN32__) +# define GLUTAPIENTRY __stdcall +# else +# define GLUTAPIENTRY +# endif + +#endif /* _WIN32 */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# ifndef GLUT_BUILDING_LIB +# if __BORLANDC__ +# if defined(_BUILDRTLDLL) +void __cdecl __export exit(int __status); +# else +void __cdecl exit(int __status); +# endif +# else +# if _MSC_VER >= 1200 + extern _CRTIMP __declspec(noreturn) void __cdecl exit(int); +# else + extern _CRTIMP void __cdecl exit(int); +# endif +# endif +# endif +#else +/* non-Win32 case. */ +/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */ +# define APIENTRY +# define GLUT_APIENTRY_DEFINED +# define CALLBACK +/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */ +# define GLUTAPI extern +# define GLUTAPIENTRY +# define GLUTCALLBACK +/* Prototype exit for the non-Win32 case (see above). */ +# ifdef __GNUC__ +extern void exit(int __status) __attribute__((__noreturn__)); +# else +extern void exit(int); +# endif +#endif + +/** + GLUT API revision history: + + GLUT_API_VERSION is updated to reflect incompatible GLUT + API changes (interface changes, semantic changes, deletions, + or additions). + + GLUT_API_VERSION=1 First public release of GLUT. 11/29/94 + + GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling, + extension. Supports new input devices like tablet, dial and button + box, and Spaceball. Easy to query OpenGL extensions. + + GLUT_API_VERSION=3 glutMenuStatus added. + + GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer, + glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic + video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc, + glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat, + glutJoystickFunc, glutForceJoystickFunc, glutStrokeWidthf, + glutStrokeLengthf (NOT FINALIZED!). +**/ +#ifndef GLUT_API_VERSION /* allow this to be overriden */ +#define GLUT_API_VERSION 3 +#endif + +/** + GLUT implementation revision history: + + GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT + API revisions and implementation revisions (ie, bug fixes). + + GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of + GLUT Xlib-based implementation. 11/29/94 + + GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of + GLUT Xlib-based implementation providing GLUT version 2 + interfaces. + + GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95 + + GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95 + + GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95 + + GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96 + + GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner + and video resize. 1/3/97 + + GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines. + + GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release. + + GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling. + + GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support. + + GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface. + + GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa + + GLUT_XLIB_IMPLEMENTATION=16 mjk's early GLUT 3.8 + + GLUT_XLIB_IMPLEMENTATION=17 mjk's GLUT 3.8 with glutStrokeWidthf and glutStrokeLengthf +**/ +#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */ +#define GLUT_XLIB_IMPLEMENTATION 17 +#endif + +/* Display mode bit masks. */ +#define GLUT_RGB 0 +#define GLUT_RGBA GLUT_RGB +#define GLUT_INDEX 1 +#define GLUT_SINGLE 0 +#define GLUT_DOUBLE 2 +#define GLUT_ACCUM 4 +#define GLUT_ALPHA 8 +#define GLUT_DEPTH 16 +#define GLUT_STENCIL 32 +#if (GLUT_API_VERSION >= 2) +#define GLUT_MULTISAMPLE 128 +#define GLUT_STEREO 256 +#endif +#if (GLUT_API_VERSION >= 3) +#define GLUT_LUMINANCE 512 +#endif + +/* Mouse buttons. */ +#define GLUT_LEFT_BUTTON 0 +#define GLUT_MIDDLE_BUTTON 1 +#define GLUT_RIGHT_BUTTON 2 + +/* Mouse button state. */ +#define GLUT_DOWN 0 +#define GLUT_UP 1 + +#if (GLUT_API_VERSION >= 2) +/* function keys */ +#define GLUT_KEY_F1 1 +#define GLUT_KEY_F2 2 +#define GLUT_KEY_F3 3 +#define GLUT_KEY_F4 4 +#define GLUT_KEY_F5 5 +#define GLUT_KEY_F6 6 +#define GLUT_KEY_F7 7 +#define GLUT_KEY_F8 8 +#define GLUT_KEY_F9 9 +#define GLUT_KEY_F10 10 +#define GLUT_KEY_F11 11 +#define GLUT_KEY_F12 12 +/* directional keys */ +#define GLUT_KEY_LEFT 100 +#define GLUT_KEY_UP 101 +#define GLUT_KEY_RIGHT 102 +#define GLUT_KEY_DOWN 103 +#define GLUT_KEY_PAGE_UP 104 +#define GLUT_KEY_PAGE_DOWN 105 +#define GLUT_KEY_HOME 106 +#define GLUT_KEY_END 107 +#define GLUT_KEY_INSERT 108 +#endif + +/* Entry/exit state. */ +#define GLUT_LEFT 0 +#define GLUT_ENTERED 1 + +/* Menu usage state. */ +#define GLUT_MENU_NOT_IN_USE 0 +#define GLUT_MENU_IN_USE 1 + +/* Visibility state. */ +#define GLUT_NOT_VISIBLE 0 +#define GLUT_VISIBLE 1 + +/* Window status state. */ +#define GLUT_HIDDEN 0 +#define GLUT_FULLY_RETAINED 1 +#define GLUT_PARTIALLY_RETAINED 2 +#define GLUT_FULLY_COVERED 3 + +/* Color index component selection values. */ +#define GLUT_RED 0 +#define GLUT_GREEN 1 +#define GLUT_BLUE 2 + +#ifdef _WIN32 +/* Stroke font constants (use these in GLUT program). */ +#define GLUT_STROKE_ROMAN ((void*)0) +#define GLUT_STROKE_MONO_ROMAN ((void*)1) + +/* Bitmap font constants (use these in GLUT program). */ +#define GLUT_BITMAP_9_BY_15 ((void*)2) +#define GLUT_BITMAP_8_BY_13 ((void*)3) +#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4) +#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5) +#if (GLUT_API_VERSION >= 3) +#define GLUT_BITMAP_HELVETICA_10 ((void*)6) +#define GLUT_BITMAP_HELVETICA_12 ((void*)7) +#define GLUT_BITMAP_HELVETICA_18 ((void*)8) +#endif +#else +/* Stroke font opaque addresses (use constants instead in source code). */ +GLUTAPI void *glutStrokeRoman; +GLUTAPI void *glutStrokeMonoRoman; + +/* Stroke font constants (use these in GLUT program). */ +#define GLUT_STROKE_ROMAN (&glutStrokeRoman) +#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman) + +/* Bitmap font opaque addresses (use constants instead in source code). */ +GLUTAPI void *glutBitmap9By15; +GLUTAPI void *glutBitmap8By13; +GLUTAPI void *glutBitmapTimesRoman10; +GLUTAPI void *glutBitmapTimesRoman24; +GLUTAPI void *glutBitmapHelvetica10; +GLUTAPI void *glutBitmapHelvetica12; +GLUTAPI void *glutBitmapHelvetica18; + +/* Bitmap font constants (use these in GLUT program). */ +#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) +#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13) +#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10) +#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24) +#if (GLUT_API_VERSION >= 3) +#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10) +#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12) +#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18) +#endif +#endif + +/* glutGet parameters. */ +#define GLUT_WINDOW_X ((GLenum) 100) +#define GLUT_WINDOW_Y ((GLenum) 101) +#define GLUT_WINDOW_WIDTH ((GLenum) 102) +#define GLUT_WINDOW_HEIGHT ((GLenum) 103) +#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104) +#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105) +#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106) +#define GLUT_WINDOW_RED_SIZE ((GLenum) 107) +#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108) +#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109) +#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110) +#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111) +#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112) +#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113) +#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114) +#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115) +#define GLUT_WINDOW_RGBA ((GLenum) 116) +#define GLUT_WINDOW_PARENT ((GLenum) 117) +#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118) +#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119) +#if (GLUT_API_VERSION >= 2) +#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120) +#define GLUT_WINDOW_STEREO ((GLenum) 121) +#endif +#if (GLUT_API_VERSION >= 3) +#define GLUT_WINDOW_CURSOR ((GLenum) 122) +#endif +#define GLUT_SCREEN_WIDTH ((GLenum) 200) +#define GLUT_SCREEN_HEIGHT ((GLenum) 201) +#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202) +#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203) +#define GLUT_MENU_NUM_ITEMS ((GLenum) 300) +#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400) +#define GLUT_INIT_WINDOW_X ((GLenum) 500) +#define GLUT_INIT_WINDOW_Y ((GLenum) 501) +#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502) +#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503) +#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504) +#if (GLUT_API_VERSION >= 2) +#define GLUT_ELAPSED_TIME ((GLenum) 700) +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123) +#endif + +#if (GLUT_API_VERSION >= 2) +/* glutDeviceGet parameters. */ +#define GLUT_HAS_KEYBOARD ((GLenum) 600) +#define GLUT_HAS_MOUSE ((GLenum) 601) +#define GLUT_HAS_SPACEBALL ((GLenum) 602) +#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603) +#define GLUT_HAS_TABLET ((GLenum) 604) +#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605) +#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606) +#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607) +#define GLUT_NUM_DIALS ((GLenum) 608) +#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609) +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610) +#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611) +#define GLUT_HAS_JOYSTICK ((GLenum) 612) +#define GLUT_OWNS_JOYSTICK ((GLenum) 613) +#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614) +#define GLUT_JOYSTICK_AXES ((GLenum) 615) +#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616) +#endif + +#if (GLUT_API_VERSION >= 3) +/* glutLayerGet parameters. */ +#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800) +#define GLUT_LAYER_IN_USE ((GLenum) 801) +#define GLUT_HAS_OVERLAY ((GLenum) 802) +#define GLUT_TRANSPARENT_INDEX ((GLenum) 803) +#define GLUT_NORMAL_DAMAGED ((GLenum) 804) +#define GLUT_OVERLAY_DAMAGED ((GLenum) 805) + +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +/* glutVideoResizeGet parameters. */ +#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900) +#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901) +#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902) +#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903) +#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904) +#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905) +#define GLUT_VIDEO_RESIZE_X ((GLenum) 906) +#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907) +#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908) +#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909) +#endif + +/* glutUseLayer parameters. */ +#define GLUT_NORMAL ((GLenum) 0) +#define GLUT_OVERLAY ((GLenum) 1) + +/* glutGetModifiers return mask. */ +#define GLUT_ACTIVE_SHIFT 1 +#define GLUT_ACTIVE_CTRL 2 +#define GLUT_ACTIVE_ALT 4 + +/* glutSetCursor parameters. */ +/* Basic arrows. */ +#define GLUT_CURSOR_RIGHT_ARROW 0 +#define GLUT_CURSOR_LEFT_ARROW 1 +/* Symbolic cursor shapes. */ +#define GLUT_CURSOR_INFO 2 +#define GLUT_CURSOR_DESTROY 3 +#define GLUT_CURSOR_HELP 4 +#define GLUT_CURSOR_CYCLE 5 +#define GLUT_CURSOR_SPRAY 6 +#define GLUT_CURSOR_WAIT 7 +#define GLUT_CURSOR_TEXT 8 +#define GLUT_CURSOR_CROSSHAIR 9 +/* Directional cursors. */ +#define GLUT_CURSOR_UP_DOWN 10 +#define GLUT_CURSOR_LEFT_RIGHT 11 +/* Sizing cursors. */ +#define GLUT_CURSOR_TOP_SIDE 12 +#define GLUT_CURSOR_BOTTOM_SIDE 13 +#define GLUT_CURSOR_LEFT_SIDE 14 +#define GLUT_CURSOR_RIGHT_SIDE 15 +#define GLUT_CURSOR_TOP_LEFT_CORNER 16 +#define GLUT_CURSOR_TOP_RIGHT_CORNER 17 +#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18 +#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19 +/* Inherit from parent window. */ +#define GLUT_CURSOR_INHERIT 100 +/* Blank cursor. */ +#define GLUT_CURSOR_NONE 101 +/* Fullscreen crosshair (if available). */ +#define GLUT_CURSOR_FULL_CROSSHAIR 102 +#endif + +/* GLUT initialization sub-API. */ +GLUTAPI void GLUTAPIENTRY glutInit(int *argcp, char **argv); +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) +GLUTAPI void GLUTAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); +#ifndef GLUT_BUILDING_LIB +static void GLUTAPIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } +#define glutInit glutInit_ATEXIT_HACK +#endif +#endif +GLUTAPI void GLUTAPIENTRY glutInitDisplayMode(unsigned int mode); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI void GLUTAPIENTRY glutInitDisplayString(const char *string); +#endif +GLUTAPI void GLUTAPIENTRY glutInitWindowPosition(int x, int y); +GLUTAPI void GLUTAPIENTRY glutInitWindowSize(int width, int height); +GLUTAPI void GLUTAPIENTRY glutMainLoop(void); + +/* GLUT window sub-API. */ +GLUTAPI int GLUTAPIENTRY glutCreateWindow(const char *title); +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) +GLUTAPI int GLUTAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); +#ifndef GLUT_BUILDING_LIB +static int GLUTAPIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } +#define glutCreateWindow glutCreateWindow_ATEXIT_HACK +#endif +#endif +GLUTAPI int GLUTAPIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height); +GLUTAPI void GLUTAPIENTRY glutDestroyWindow(int win); +GLUTAPI void GLUTAPIENTRY glutPostRedisplay(void); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) +GLUTAPI void GLUTAPIENTRY glutPostWindowRedisplay(int win); +#endif +GLUTAPI void GLUTAPIENTRY glutSwapBuffers(void); +GLUTAPI int GLUTAPIENTRY glutGetWindow(void); +GLUTAPI void GLUTAPIENTRY glutSetWindow(int win); +GLUTAPI void GLUTAPIENTRY glutSetWindowTitle(const char *title); +GLUTAPI void GLUTAPIENTRY glutSetIconTitle(const char *title); +GLUTAPI void GLUTAPIENTRY glutPositionWindow(int x, int y); +GLUTAPI void GLUTAPIENTRY glutReshapeWindow(int width, int height); +GLUTAPI void GLUTAPIENTRY glutPopWindow(void); +GLUTAPI void GLUTAPIENTRY glutPushWindow(void); +GLUTAPI void GLUTAPIENTRY glutIconifyWindow(void); +GLUTAPI void GLUTAPIENTRY glutShowWindow(void); +GLUTAPI void GLUTAPIENTRY glutHideWindow(void); +#if (GLUT_API_VERSION >= 3) +GLUTAPI void GLUTAPIENTRY glutFullScreen(void); +GLUTAPI void GLUTAPIENTRY glutSetCursor(int cursor); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI void GLUTAPIENTRY glutWarpPointer(int x, int y); +#endif + +/* GLUT overlay sub-API. */ +GLUTAPI void GLUTAPIENTRY glutEstablishOverlay(void); +GLUTAPI void GLUTAPIENTRY glutRemoveOverlay(void); +GLUTAPI void GLUTAPIENTRY glutUseLayer(GLenum layer); +GLUTAPI void GLUTAPIENTRY glutPostOverlayRedisplay(void); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) +GLUTAPI void GLUTAPIENTRY glutPostWindowOverlayRedisplay(int win); +#endif +GLUTAPI void GLUTAPIENTRY glutShowOverlay(void); +GLUTAPI void GLUTAPIENTRY glutHideOverlay(void); +#endif + +/* GLUT menu sub-API. */ +GLUTAPI int GLUTAPIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int)); +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) +GLUTAPI int GLUTAPIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int)); +#ifndef GLUT_BUILDING_LIB +static int GLUTAPIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); } +#define glutCreateMenu glutCreateMenu_ATEXIT_HACK +#endif +#endif +GLUTAPI void GLUTAPIENTRY glutDestroyMenu(int menu); +GLUTAPI int GLUTAPIENTRY glutGetMenu(void); +GLUTAPI void GLUTAPIENTRY glutSetMenu(int menu); +GLUTAPI void GLUTAPIENTRY glutAddMenuEntry(const char *label, int value); +GLUTAPI void GLUTAPIENTRY glutAddSubMenu(const char *label, int submenu); +GLUTAPI void GLUTAPIENTRY glutChangeToMenuEntry(int item, const char *label, int value); +GLUTAPI void GLUTAPIENTRY glutChangeToSubMenu(int item, const char *label, int submenu); +GLUTAPI void GLUTAPIENTRY glutRemoveMenuItem(int item); +GLUTAPI void GLUTAPIENTRY glutAttachMenu(int button); +GLUTAPI void GLUTAPIENTRY glutDetachMenu(int button); + +/* GLUT window callback sub-API. */ +GLUTAPI void GLUTAPIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void)); +GLUTAPI void GLUTAPIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height)); +GLUTAPI void GLUTAPIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); +GLUTAPI void GLUTAPIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); +GLUTAPI void GLUTAPIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); +GLUTAPI void GLUTAPIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); +GLUTAPI void GLUTAPIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state)); +GLUTAPI void GLUTAPIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state)); +GLUTAPI void GLUTAPIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void)); +GLUTAPI void GLUTAPIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value); +GLUTAPI void GLUTAPIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state)); +#if (GLUT_API_VERSION >= 2) +GLUTAPI void GLUTAPIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); +GLUTAPI void GLUTAPIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); +GLUTAPI void GLUTAPIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); +GLUTAPI void GLUTAPIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state)); +GLUTAPI void GLUTAPIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state)); +GLUTAPI void GLUTAPIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value)); +GLUTAPI void GLUTAPIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); +GLUTAPI void GLUTAPIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); +#if (GLUT_API_VERSION >= 3) +GLUTAPI void GLUTAPIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y)); +GLUTAPI void GLUTAPIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void)); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI void GLUTAPIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state)); +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +GLUTAPI void GLUTAPIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); +GLUTAPI void GLUTAPIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); +GLUTAPI void GLUTAPIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval); +#endif +#endif +#endif + +/* GLUT color index sub-API. */ +GLUTAPI void GLUTAPIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue); +GLUTAPI GLfloat GLUTAPIENTRY glutGetColor(int ndx, int component); +GLUTAPI void GLUTAPIENTRY glutCopyColormap(int win); + +/* GLUT state retrieval sub-API. */ +GLUTAPI int GLUTAPIENTRY glutGet(GLenum type); +GLUTAPI int GLUTAPIENTRY glutDeviceGet(GLenum type); +#if (GLUT_API_VERSION >= 2) +/* GLUT extension support sub-API */ +GLUTAPI int GLUTAPIENTRY glutExtensionSupported(const char *name); +#endif +#if (GLUT_API_VERSION >= 3) +GLUTAPI int GLUTAPIENTRY glutGetModifiers(void); +GLUTAPI int GLUTAPIENTRY glutLayerGet(GLenum type); +#endif + +/* GLUT font sub-API */ +GLUTAPI void GLUTAPIENTRY glutBitmapCharacter(void *font, int character); +GLUTAPI int GLUTAPIENTRY glutBitmapWidth(void *font, int character); +GLUTAPI void GLUTAPIENTRY glutStrokeCharacter(void *font, int character); +GLUTAPI int GLUTAPIENTRY glutStrokeWidth(void *font, int character); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI int GLUTAPIENTRY glutBitmapLength(void *font, const unsigned char *string); +GLUTAPI int GLUTAPIENTRY glutStrokeLength(void *font, const unsigned char *string); +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 17) +GLUTAPI float GLUTAPIENTRY glutStrokeWidthf(void *font, int character); +GLUTAPI float GLUTAPIENTRY glutStrokeLengthf(void *font, const unsigned char *string); +#endif + +/* GLUT pre-built models sub-API */ +GLUTAPI void GLUTAPIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks); +GLUTAPI void GLUTAPIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); +GLUTAPI void GLUTAPIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +GLUTAPI void GLUTAPIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +GLUTAPI void GLUTAPIENTRY glutWireCube(GLdouble size); +GLUTAPI void GLUTAPIENTRY glutSolidCube(GLdouble size); +GLUTAPI void GLUTAPIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +GLUTAPI void GLUTAPIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +GLUTAPI void GLUTAPIENTRY glutWireDodecahedron(void); +GLUTAPI void GLUTAPIENTRY glutSolidDodecahedron(void); +GLUTAPI void GLUTAPIENTRY glutWireTeapot(GLdouble size); +GLUTAPI void GLUTAPIENTRY glutSolidTeapot(GLdouble size); +GLUTAPI void GLUTAPIENTRY glutWireOctahedron(void); +GLUTAPI void GLUTAPIENTRY glutSolidOctahedron(void); +GLUTAPI void GLUTAPIENTRY glutWireTetrahedron(void); +GLUTAPI void GLUTAPIENTRY glutSolidTetrahedron(void); +GLUTAPI void GLUTAPIENTRY glutWireIcosahedron(void); +GLUTAPI void GLUTAPIENTRY glutSolidIcosahedron(void); + +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +/* GLUT video resize sub-API. */ +GLUTAPI int GLUTAPIENTRY glutVideoResizeGet(GLenum param); +GLUTAPI void GLUTAPIENTRY glutSetupVideoResizing(void); +GLUTAPI void GLUTAPIENTRY glutStopVideoResizing(void); +GLUTAPI void GLUTAPIENTRY glutVideoResize(int x, int y, int width, int height); +GLUTAPI void GLUTAPIENTRY glutVideoPan(int x, int y, int width, int height); + +/* GLUT debugging sub-API. */ +GLUTAPI void GLUTAPIENTRY glutReportErrors(void); +#endif + +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +/* GLUT device control sub-API. */ +/* glutSetKeyRepeat modes. */ +#define GLUT_KEY_REPEAT_OFF 0 +#define GLUT_KEY_REPEAT_ON 1 +#define GLUT_KEY_REPEAT_DEFAULT 2 + +/* Joystick button masks. */ +#define GLUT_JOYSTICK_BUTTON_A 1 +#define GLUT_JOYSTICK_BUTTON_B 2 +#define GLUT_JOYSTICK_BUTTON_C 4 +#define GLUT_JOYSTICK_BUTTON_D 8 + +GLUTAPI void GLUTAPIENTRY glutIgnoreKeyRepeat(int ignore); +GLUTAPI void GLUTAPIENTRY glutSetKeyRepeat(int repeatMode); +GLUTAPI void GLUTAPIENTRY glutForceJoystickFunc(void); + +/* GLUT game mode sub-API. */ +/* glutGameModeGet. */ +#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0) +#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1) +#define GLUT_GAME_MODE_WIDTH ((GLenum) 2) +#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3) +#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4) +#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5) +#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6) + +GLUTAPI void GLUTAPIENTRY glutGameModeString(const char *string); +GLUTAPI int GLUTAPIENTRY glutEnterGameMode(void); +GLUTAPI void GLUTAPIENTRY glutLeaveGameMode(void); +GLUTAPI int GLUTAPIENTRY glutGameModeGet(GLenum mode); +#endif + +#ifdef __cplusplus +} + +#endif + +#ifdef GLUT_APIENTRY_DEFINED +# undef GLUT_APIENTRY_DEFINED +# undef APIENTRY +#endif + +#ifdef GLUT_WINGDIAPI_DEFINED +# undef GLUT_WINGDIAPI_DEFINED +# undef WINGDIAPI +#endif + +#ifdef GLUT_DEFINED___CDECL +# undef GLUT_DEFINED___CDECL +# undef __cdecl +#endif + +#ifdef GLUT_DEFINED__CRTIMP +# undef GLUT_DEFINED__CRTIMP +# undef _CRTIMP +#endif + +#endif /* __glut_h__ */ diff --git a/Extras/sph/common/matrix-inline.h b/Extras/sph/common/matrix-inline.h index 07742d68b..1de585ce8 100644 --- a/Extras/sph/common/matrix-inline.h +++ b/Extras/sph/common/matrix-inline.h @@ -1,1879 +1,1879 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "matrix.h" - -// MatrixC Code Definition -#define VNAME C -#define VTYPE unsigned char - -// Constructors/Destructors - -inline MatrixC::MatrixC (void) {data = NULL; Resize (0,0);} -inline MatrixC::~MatrixC (void) {if (data!=NULL) delete[] data;} -inline MatrixC::MatrixC (int r, int c) {data = NULL; Resize (c,r);} - -// Member Functions - - -inline VTYPE &MatrixC::operator () (int c, int r) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); - if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); - if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); - #endif - return *(data + (r*cols+c)); -} -inline MatrixC &MatrixC::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n255) { - *n = (VTYPE) 255; - } else if (*b<=0) { - *n = (VTYPE) 0; - } else { - *n = (VTYPE) *b; - } - } - return *this; -} - -inline MatrixC &MatrixC::operator+= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. - bs = op.data; // Go back to first column in B - as += cols; // Goto next row in A - } - n++; // Goto next element in C - } - delete[] data; // Destroy old A matrix - data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix - } - return *this; -} - -inline MatrixC &MatrixC::Resize (int x, int y) -{ - if (data!=NULL) { - if (rows!=y || cols!=x) { - delete[] data; - len = (rows = y) * (cols = x); - data = new VTYPE[len]; - } - } else { - len = (rows = y) * (cols = x); data = new VTYPE[len]; - } - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Resize: Out of memory for construction.\n"); - #endif - #ifdef MATRIX_INITIALIZE - memset (data, 0, sizeof(VTYPE)*len); - #endif - return *this; -} -inline MatrixC &MatrixC::ResizeSafe (int x, int y) -{ - VTYPE *newdata; - int newlen; - VTYPE *n, *ne; - VTYPE *b, *be; - int bskip; - - - if (data!=NULL) { - newlen = x*y; - newdata = new VTYPE[newlen]; - #ifdef DEBUG_MATRIX - if (newdata==NULL) - Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); - #endif - if (y>=rows && x>=cols) { // New size is larger (in both r and c) - memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix - ne = data + len; // Calculate end of current matrix - b = newdata; // Start of new matrix - be = newdata + cols; // Last filled column+1 in new matrix - bskip = x-cols; - for (n = data; n0) { - n = data; // Copy columns to left of c - ne = data + len; - nskip = (cols-c); - b = newdata; - be = newdata + c; - bskip = (cols-c)+1; - for (; n Ainv - // b -> solution x - // - - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixC::GaussJordan: Not implemented for char matrix\n"); - #endif - return *this; -} -inline int MatrixC::GetX() {return cols;} -inline int MatrixC::GetY() {return rows;} -inline int MatrixC::GetRows(void) {return rows;} -inline int MatrixC::GetCols(void) {return cols;} -inline int MatrixC::GetLength(void) {return len;} -inline VTYPE *MatrixC::GetData(void) {return data;} - -inline double MatrixC::GetF (int r, int c) {return (double) (*(data + r*cols + c));} - -#undef VTYPE -#undef VNAME - -// MatrixI Code Definition -#define VNAME I -#define VTYPE int - -// Constructors/Destructors - -inline MatrixI::MatrixI (void) {data = NULL; Resize (0,0);} -inline MatrixI::~MatrixI (void) {if (data!=NULL) delete[] data;} -inline MatrixI::MatrixI (int r, int c) {data = NULL; Resize (c,r);} - -// Member Functions - -inline VTYPE &MatrixI::operator () (int c, int r) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixI::op(): Matrix data is null\n"); - if (r<0 || r>=rows) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Row is out of bounds\n"); - if (c<0 || c>=cols) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Col is out of bounds\n"); - #endif - return *(data + (r*cols+c)); -} -inline MatrixI &MatrixI::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. - bs = op.data; // Go back to first column in B - as += cols; // Goto next row in A - } - n++; // Goto next element in C - } - delete[] data; // Destroy old A matrix - data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix - } - return *this; -} - -inline MatrixI &MatrixI::Resize (int x, int y) -{ - if (data!=NULL) { - if (rows!=y || cols!=x) {delete[] data; len = (rows = y) * (cols = x); data = new VTYPE[len];} - } else { - len = (rows = y) * (cols = x); data = new VTYPE[len]; - } - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Size: Out of memory for construction.\n"); - #endif - #ifdef MATRIX_INITIALIZE - memset (data, 0, sizeof(VTYPE)*len); - #endif - return *this; -} -inline MatrixI &MatrixI::ResizeSafe (int x, int y) -{ - VTYPE *newdata; - int newlen; - VTYPE *n, *ne; - VTYPE *b, *be; - int bskip; - - - if (data!=NULL) { - newlen = x*y; - newdata = new VTYPE[newlen]; - #ifdef DEBUG_MATRIX - if (newdata==NULL) - Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); - #endif - if (y>=rows && x>=cols) { // New size is larger (in both r and c) - memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix - ne = data + len; // Calculate end of current matrix - b = newdata; // Start of new matrix - be = newdata + cols; // Last filled column+1 in new matrix - bskip = x-cols; - for (n = data; n0) { - n = data; // Copy columns to left of c - ne = data + len; - nskip = (cols-c); - b = newdata; - be = newdata + c; - bskip = (cols-c)+1; - for (; n Ainv - // b -> solution x - // - - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixI::GaussJordan: Not implemented for int matrix\n"); - #endif - return *this; -} -inline int MatrixI::GetX() {return cols;} -inline int MatrixI::GetY() {return rows;} -inline int MatrixI::GetRows(void) {return rows;} -inline int MatrixI::GetCols(void) {return cols;} -inline int MatrixI::GetLength(void) {return len;} -inline VTYPE *MatrixI::GetData(void) {return data;} - -inline double MatrixI::GetF (int r, int c) {return (double) (*(data + r*cols + c));} - -#undef VTYPE -#undef VNAME - - -// MatrixF Code Definition -#define VNAME F -#define VTYPE double - -// Constructors/Destructors - -inline MatrixF::MatrixF (void) {data = NULL; Resize (0,0);} - -inline MatrixF::~MatrixF (void) { - if (data!=NULL) - delete [] data; -} -inline MatrixF::MatrixF (const int r, const int c) {data = NULL; Resize (r,c);} - -// Member Functions - -inline VTYPE MatrixF::GetVal ( int c, int r ) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); - if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); - if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); - #endif - return *(data + (r*cols+c)); -} - -inline VTYPE &MatrixF::operator () (const int c, const int r) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) - Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); - if (r<0 || r>=rows) - Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); - if (c<0 || c>=cols) - Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); - #endif - return *(data + (r*cols+c)); -} -inline MatrixF &MatrixF::operator= (const unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. - bs = op.data; // Go back to first column in B - as += cols; // Goto next row in A - } - n++; // Goto next element in C - } - delete[] data; // Destroy old A matrix - data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix - } - return *this; -} - -inline MatrixF &MatrixF::Multiply4x4 (const MatrixF &op) { - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix data is null\n"); - if (op.data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Operand matrix (op) data is null\n"); - if (rows!=4 || cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix m is not 4x4"); - if (op.rows!=4 || op.cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix op is not 4x4"); - #endif - register double c1, c2, c3, c4; // Temporary storage - VTYPE *n, *a, *b1, *b2, *b3, *b4; - a = data; n = data; - b1 = op.data; b2 = op.data + 4; b3 = op.data + 8; b4 = op.data + 12; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate First Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Second Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Third Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a; // Calculate Four Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - - return *this; -} - - -inline MatrixF &MatrixF::Resize (const int x, const int y) -{ - if (data!=NULL) { - if (rows==y && cols==x) return *this; - delete[] data; - } - rows = y; cols = x; - if (y>0 && x>0) { - len = rows * cols; - if (len!=0) { - data = new VTYPE[len]; - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Size: Out of memory for construction.\n"); - #endif - } - } - - #ifdef MATRIX_INITIALIZE - if (data!=NULL) memset (data, 0, sizeof(VTYPE)*len); - #endif - return *this; -} -inline MatrixF &MatrixF::ResizeSafe (const int x, const int y) -{ - VTYPE *newdata; - int newlen; - VTYPE *n, *ne; - VTYPE *b, *be; - int bskip; - - if (data!=NULL) { - newlen = x*y; - newdata = new VTYPE[newlen]; - #ifdef DEBUG_MATRIX - if (newdata==NULL) - Debug.Print (DEBUG_MATRIX, "MatrixF::SizeSafe: Out of memory for construction.\n"); - #endif - if (y>=rows && x>=cols) { // New size is larger (in both r and c) - memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix - ne = data + len; // Calculate end of current matrix - b = newdata; // Start of new matrix - be = newdata + cols; // Last filled column+1 in new matrix - bskip = x-cols; - for (n = data; n0) { - n = data; // Copy columns to left of c - ne = data + len; - nskip = (cols-c); - b = newdata; - be = newdata + c; - bskip = (cols-c)+1; - for (; n>counter-clockwise<< when looking down the X+ axis toward the origin -inline MatrixF &MatrixF::RotateX (const double ang) -{ - Resize (4,4); - VTYPE *n = data; - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - *n = 1; n += 5; - *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; - *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; - *n = 1; - return *this; -} - -// rotates points >>counter-clockwise<< when looking down the Y+ axis toward the origin -inline MatrixF &MatrixF::RotateY (const double ang) -{ - Resize (4,4); - VTYPE *n = data; - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - *n = (VTYPE) c; n+=2; - *n = (VTYPE) -s; n+=3; - *n = 1; n+=3; - *n = (VTYPE) s; n+=2; - *n = (VTYPE) c; n+=5; - *n = 1; - return *this; -} - -// rotates points >>counter-clockwise<< when looking down the Z+ axis toward the origin -inline MatrixF &MatrixF::RotateZ (const double ang) -{ - Resize (4,4); - VTYPE *n = data; - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; - *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; - *n = 1; n+=5; *n = 1; - return *this; -} -inline MatrixF &MatrixF::Ortho (double sx, double sy, double vn, double vf) -{ - // simplified version of OpenGL's glOrtho function - VTYPE *n = data; - *n++ = (VTYPE) (1.0/sx); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (1.0/sy); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (-2.0/(vf-vn)); *n++ = (VTYPE) (-(vf+vn)/(vf-vn)); - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 1.0; -} - -inline MatrixF &MatrixF::Translate (double tx, double ty, double tz) -{ - Resize (4,4); - VTYPE *n = data; - *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) tx; *n++ = (VTYPE) ty; *n++ = (VTYPE) tz; *n++ = (VTYPE) 1.0; - return *this; -} - -inline MatrixF &MatrixF::Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3) -{ - Resize (4,4); - VTYPE *n = data; - *n++ = (VTYPE) c1.X(); *n++ = (VTYPE) c2.X(); *n++ = (VTYPE) c3.X(); *n++ = (VTYPE) 0; - *n++ = (VTYPE) c1.Y(); *n++ = (VTYPE) c2.Y(); *n++ = (VTYPE) c3.Y(); *n++ = (VTYPE) 0; - *n++ = (VTYPE) c1.Z(); *n++ = (VTYPE) c2.Z(); *n++ = (VTYPE) c3.Z(); *n++ = (VTYPE) 0; - *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; - return *this; -} - -#define SWAP(a, b) {temp=(a); (a)=(b); (b)=temp;} - -inline MatrixF &MatrixF::GaussJordan (MatrixF &b) -{ - // Gauss-Jordan solves the matrix equation Ax = b - // Given the problem: - // A*x = b (where A is 'this' matrix and b is provided) - // The solution is: - // Ainv*b = x - // This function returns Ainv in A and x in b... that is: - // A (this) -> Ainv - // b -> solution x - // - - MatrixI index_col, index_row; - MatrixI piv_flag; - int r, c, c2, rs, cs; - double piv_val; - int piv_row, piv_col; - double pivinv, dummy, temp; - - #ifdef DEBUG_MATRIX - if (rows!=cols) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows and cols of A must be equal.\n"); - if (rows!=b.rows) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows of A and rows of b must be equal.\n"); - if (b.cols!=1) Debug.Print ( DEBUG_MATRIX, "MatrixF::GaussJordan: Number of cols of b must be 1.\n"); - #endif - - index_col.Resize (cols, 1); - index_row.Resize (cols, 1); - piv_flag.Resize (cols, 1); - piv_flag = 0; - for (c = 0; c < cols; c++) { - piv_val = 0.0; - for (rs = 0; rs < rows; rs++) { - if (piv_flag(rs, 0) != 1 ) - for (cs = 0; cs < cols; cs++) { - if (piv_flag(cs, 0) == 0) { - if (fabs((*this) (cs, rs)) >= piv_val) { - piv_val = fabs((*this) (cs, rs)); - piv_row = rs; - piv_col = cs; - } - } else if (piv_flag(cs, 0)>1) { - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (dbl pivs).\n"); - //Print (); - #endif - } - } - } - piv_flag(piv_col, 0)++; - if (piv_row != piv_col) { - for (c2 = 0; c2 < cols; c2++) SWAP ((*this) (c2, piv_row), (*this) (c2, piv_col)); - for (c2 = 0; c2 < b.cols; c2++) SWAP (b(c2, piv_row), b(c2, piv_col)); - } - index_row (c, 0) = piv_row; - index_col (c, 0) = piv_col; - if ((*this) (piv_col, piv_col) == 0.0) { - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (0 piv).\n"); - //Print (); - #endif - } - pivinv = 1.0 / ((*this) (piv_col, piv_col)); - (*this) (piv_col, piv_col) = 1.0; - for (c2 = 0; c2 < cols; c2++) (*this) (c2, piv_col) *= pivinv; - for (c2 = 0; c2 < b.cols; c2++) b(c2, piv_col) *= pivinv; - for (r = 0; r < rows; r++) { - if (r != piv_col) { - dummy = (*this) (piv_col, r); - (*this) (piv_col, r) = 0.0; - for (c2 = 0; c2 < cols; c2++) (*this) (c2, r) -= (*this) (c2, piv_col)*dummy; - for (c2 = 0; c2 < b.cols; c2++) b(c2, r) -= b(c2, piv_col)*dummy; - } - } - } - for (c = cols-1; c >= 0; c--) { - if (index_row(c, 0) != index_col(c, 0)) - for (r = 0; r < rows; r++) - SWAP ((*this) (index_row(c,0), r), (*this) (index_col(c,0), r) ); - } - return *this; -} -inline MatrixF &MatrixF::Submatrix ( MatrixF& b, int mx, int my) -{ - VTYPE* pEnd = data + rows*cols; // end of matrix - VTYPE* pVal = data; - VTYPE* pNewVal = b.data; - VTYPE* pNewEnd = pNewVal + mx; - int pNewSkip = cols - mx; - - for (pVal = data; pVal < pEnd;) { - for (; pNewVal < pNewEnd;) *pVal++ = *pNewVal++; - pNewVal += pNewSkip; - pNewEnd += mx; - } - return *this; -} - -// N-Vector Dot Product -// Elements may be in rows or columns, but: -// - If in rows, number of columns must be one and number of rows must match. -// - If in cols, number of rows must be one and number of cols must match. -inline double MatrixF::Dot ( MatrixF& b ) -{ - double d = 0.0; - VTYPE* pA = data; - VTYPE* pB = b.data; - - if ( rows==1 && b.rows==1 && cols == b.cols ) { - VTYPE* pAEnd = data + cols; - d = 0.0; - for (; pA < pAEnd;) - d += (*pA++) * (*pB++); - } else if ( cols==1 && b.cols==1 && rows == b.rows) { - VTYPE* pAEnd = data + rows; - d = 0.0; - for (; pA < pAEnd;) - d += (*pA++) * (*pB++); - } - return d; -} - -#define I(x, y) ( (y*xres) + x ) -#define Ix(r) ( r % xres ) // X coordinate from row -#define Iy(r) ( r / xres ) // Y coordinate from row - -inline MatrixF &MatrixF::MatrixVector5 (MatrixF& x, int mrows, MatrixF& b) -{ - double v; - - // A( 2, r ) * B ( r ) + A(1,r)*B(r-1) + A(3,r)*B(r+1) + A(0, r)*B( R-( r ) ) + A(4, r)*B( R+( r ) ) - for (int r = 0; r < mrows; r++) { - v = GetVal(2, r) * x(0,r); - if ( r > 0 ) v += GetVal(1,r) * x(0,r-1); - if ( r < mrows-1) v += GetVal(3,r) * x(0,r+1); - if ( (int) GetVal(5, r) >= 0) v += GetVal(0,r) * x(0, (int) GetVal(5,r)); - if ( (int) GetVal(6, r) >= 0) v += GetVal(4,r) * x(0, (int) GetVal(6,r)); - b(0,r) = v; - } - return *this; -} - -inline MatrixF &MatrixF::ConjugateGradient (MatrixF &b) -{ - return *this; -} - -// Sparse Conjugate Gradient 2D (special case) -// This compute conjugate gradients on a -// sparse "5-7" x N positive definite matrix. -// Only 'mrows' subset of the row-size of A and b will be used. -inline MatrixF &MatrixF::ConjugateGradient5 (MatrixF &b, int mrows ) -{ - double a, g, rdot; - int i, imax; - MatrixF x, xnew; // solution vector - MatrixF r, rnew; // residual - MatrixF p, ptemp; // search direction - MatrixF v; - - x.Resize ( 1, mrows ); - xnew.Resize ( 1, mrows ); - r.Resize ( 1, mrows ); - rnew.Resize ( 1, mrows ); - p.Resize ( 1, mrows ); - ptemp.Resize ( 1, mrows ); - v.Resize ( 1, mrows ); - - r.Submatrix ( b, 1, mrows); - MatrixVector5 ( x, mrows, v ); // (Ax -> v) - r -= v; // r = b - Ax - p = r; - - imax = 20; - for (i=0; i < imax; i++) { - MatrixVector5 ( p, mrows, v ); // v = Ap - rdot = r.Dot ( r ); - a = rdot / p.Dot ( v ); // a = (r . r) / (p . v) - xnew = p; - xnew *= a; - xnew += x; // x = x + p*a - v *= a; - rnew = r; // rnew = r - v*a - rnew -= v; - g = rnew.Dot ( rnew ) / rdot; // g = (rnew . rnew) / (r . r) - p *= g; - p += rnew; // p = rnew + p*g - r = rnew; - x = xnew; - } - for (int rx=0; rx < mrows; rx++) - b(0, rx) = x(0, rx); - return *this; -} - -inline int MatrixF::GetX() {return cols;} -inline int MatrixF::GetY() {return rows;} -inline int MatrixF::GetRows(void) {return rows;} -inline int MatrixF::GetCols(void) {return cols;} -inline int MatrixF::GetLength(void) {return len;} -inline VTYPE *MatrixF::GetData(void) {return data;} - -inline double MatrixF::GetF (const int r, const int c) {return (double) (*(data + r*cols + c));} - -inline void MatrixF::GetRowVec (int r, Vector3DF &v) -{ - VTYPE *n = data + r*cols; - v.x = *n++; v.y = *n++; v.z= *n++; -} - -inline void MatrixF::Print ( char* fname ) -{ - char buf[2000]; - - FILE* fp = fopen ( fname, "w+" ); - - for (int r=0; r < rows; r++) { - buf[0] = '\0'; - for (int c =0; c < cols; c++) { - sprintf ( buf, "%s %04.3f", buf, GetVal(c, r) ); - } - fprintf ( fp, "%s\n", buf); - } - fprintf ( fp, "---------------------------------------\n", buf); - fflush ( fp ); - fclose ( fp ); -} - -#undef VTYPE +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "matrix.h" + +// MatrixC Code Definition +#define VNAME C +#define VTYPE unsigned char + +// Constructors/Destructors + +inline MatrixC::MatrixC (void) {data = NULL; Resize (0,0);} +inline MatrixC::~MatrixC (void) {if (data!=NULL) delete[] data;} +inline MatrixC::MatrixC (int r, int c) {data = NULL; Resize (c,r);} + +// Member Functions + + +inline VTYPE &MatrixC::operator () (int c, int r) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); + if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); + if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); + #endif + return *(data + (r*cols+c)); +} +inline MatrixC &MatrixC::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n255) { + *n = (VTYPE) 255; + } else if (*b<=0) { + *n = (VTYPE) 0; + } else { + *n = (VTYPE) *b; + } + } + return *this; +} + +inline MatrixC &MatrixC::operator+= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. + bs = op.data; // Go back to first column in B + as += cols; // Goto next row in A + } + n++; // Goto next element in C + } + delete[] data; // Destroy old A matrix + data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix + } + return *this; +} + +inline MatrixC &MatrixC::Resize (int x, int y) +{ + if (data!=NULL) { + if (rows!=y || cols!=x) { + delete[] data; + len = (rows = y) * (cols = x); + data = new VTYPE[len]; + } + } else { + len = (rows = y) * (cols = x); data = new VTYPE[len]; + } + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Resize: Out of memory for construction.\n"); + #endif + #ifdef MATRIX_INITIALIZE + memset (data, 0, sizeof(VTYPE)*len); + #endif + return *this; +} +inline MatrixC &MatrixC::ResizeSafe (int x, int y) +{ + VTYPE *newdata; + int newlen; + VTYPE *n, *ne; + VTYPE *b, *be; + int bskip; + + + if (data!=NULL) { + newlen = x*y; + newdata = new VTYPE[newlen]; + #ifdef DEBUG_MATRIX + if (newdata==NULL) + Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); + #endif + if (y>=rows && x>=cols) { // New size is larger (in both r and c) + memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix + ne = data + len; // Calculate end of current matrix + b = newdata; // Start of new matrix + be = newdata + cols; // Last filled column+1 in new matrix + bskip = x-cols; + for (n = data; n0) { + n = data; // Copy columns to left of c + ne = data + len; + nskip = (cols-c); + b = newdata; + be = newdata + c; + bskip = (cols-c)+1; + for (; n Ainv + // b -> solution x + // + + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixC::GaussJordan: Not implemented for char matrix\n"); + #endif + return *this; +} +inline int MatrixC::GetX() {return cols;} +inline int MatrixC::GetY() {return rows;} +inline int MatrixC::GetRows(void) {return rows;} +inline int MatrixC::GetCols(void) {return cols;} +inline int MatrixC::GetLength(void) {return len;} +inline VTYPE *MatrixC::GetData(void) {return data;} + +inline double MatrixC::GetF (int r, int c) {return (double) (*(data + r*cols + c));} + +#undef VTYPE +#undef VNAME + +// MatrixI Code Definition +#define VNAME I +#define VTYPE int + +// Constructors/Destructors + +inline MatrixI::MatrixI (void) {data = NULL; Resize (0,0);} +inline MatrixI::~MatrixI (void) {if (data!=NULL) delete[] data;} +inline MatrixI::MatrixI (int r, int c) {data = NULL; Resize (c,r);} + +// Member Functions + +inline VTYPE &MatrixI::operator () (int c, int r) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixI::op(): Matrix data is null\n"); + if (r<0 || r>=rows) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Row is out of bounds\n"); + if (c<0 || c>=cols) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Col is out of bounds\n"); + #endif + return *(data + (r*cols+c)); +} +inline MatrixI &MatrixI::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. + bs = op.data; // Go back to first column in B + as += cols; // Goto next row in A + } + n++; // Goto next element in C + } + delete[] data; // Destroy old A matrix + data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix + } + return *this; +} + +inline MatrixI &MatrixI::Resize (int x, int y) +{ + if (data!=NULL) { + if (rows!=y || cols!=x) {delete[] data; len = (rows = y) * (cols = x); data = new VTYPE[len];} + } else { + len = (rows = y) * (cols = x); data = new VTYPE[len]; + } + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Size: Out of memory for construction.\n"); + #endif + #ifdef MATRIX_INITIALIZE + memset (data, 0, sizeof(VTYPE)*len); + #endif + return *this; +} +inline MatrixI &MatrixI::ResizeSafe (int x, int y) +{ + VTYPE *newdata; + int newlen; + VTYPE *n, *ne; + VTYPE *b, *be; + int bskip; + + + if (data!=NULL) { + newlen = x*y; + newdata = new VTYPE[newlen]; + #ifdef DEBUG_MATRIX + if (newdata==NULL) + Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); + #endif + if (y>=rows && x>=cols) { // New size is larger (in both r and c) + memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix + ne = data + len; // Calculate end of current matrix + b = newdata; // Start of new matrix + be = newdata + cols; // Last filled column+1 in new matrix + bskip = x-cols; + for (n = data; n0) { + n = data; // Copy columns to left of c + ne = data + len; + nskip = (cols-c); + b = newdata; + be = newdata + c; + bskip = (cols-c)+1; + for (; n Ainv + // b -> solution x + // + + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixI::GaussJordan: Not implemented for int matrix\n"); + #endif + return *this; +} +inline int MatrixI::GetX() {return cols;} +inline int MatrixI::GetY() {return rows;} +inline int MatrixI::GetRows(void) {return rows;} +inline int MatrixI::GetCols(void) {return cols;} +inline int MatrixI::GetLength(void) {return len;} +inline VTYPE *MatrixI::GetData(void) {return data;} + +inline double MatrixI::GetF (int r, int c) {return (double) (*(data + r*cols + c));} + +#undef VTYPE +#undef VNAME + + +// MatrixF Code Definition +#define VNAME F +#define VTYPE double + +// Constructors/Destructors + +inline MatrixF::MatrixF (void) {data = NULL; Resize (0,0);} + +inline MatrixF::~MatrixF (void) { + if (data!=NULL) + delete [] data; +} +inline MatrixF::MatrixF (const int r, const int c) {data = NULL; Resize (r,c);} + +// Member Functions + +inline VTYPE MatrixF::GetVal ( int c, int r ) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); + if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); + if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); + #endif + return *(data + (r*cols+c)); +} + +inline VTYPE &MatrixF::operator () (const int c, const int r) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) + Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); + if (r<0 || r>=rows) + Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); + if (c<0 || c>=cols) + Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); + #endif + return *(data + (r*cols+c)); +} +inline MatrixF &MatrixF::operator= (const unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. + bs = op.data; // Go back to first column in B + as += cols; // Goto next row in A + } + n++; // Goto next element in C + } + delete[] data; // Destroy old A matrix + data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix + } + return *this; +} + +inline MatrixF &MatrixF::Multiply4x4 (const MatrixF &op) { + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix data is null\n"); + if (op.data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Operand matrix (op) data is null\n"); + if (rows!=4 || cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix m is not 4x4"); + if (op.rows!=4 || op.cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix op is not 4x4"); + #endif + register double c1, c2, c3, c4; // Temporary storage + VTYPE *n, *a, *b1, *b2, *b3, *b4; + a = data; n = data; + b1 = op.data; b2 = op.data + 4; b3 = op.data + 8; b4 = op.data + 12; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate First Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Second Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Third Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a; // Calculate Four Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + + return *this; +} + + +inline MatrixF &MatrixF::Resize (const int x, const int y) +{ + if (data!=NULL) { + if (rows==y && cols==x) return *this; + delete[] data; + } + rows = y; cols = x; + if (y>0 && x>0) { + len = rows * cols; + if (len!=0) { + data = new VTYPE[len]; + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Size: Out of memory for construction.\n"); + #endif + } + } + + #ifdef MATRIX_INITIALIZE + if (data!=NULL) memset (data, 0, sizeof(VTYPE)*len); + #endif + return *this; +} +inline MatrixF &MatrixF::ResizeSafe (const int x, const int y) +{ + VTYPE *newdata; + int newlen; + VTYPE *n, *ne; + VTYPE *b, *be; + int bskip; + + if (data!=NULL) { + newlen = x*y; + newdata = new VTYPE[newlen]; + #ifdef DEBUG_MATRIX + if (newdata==NULL) + Debug.Print (DEBUG_MATRIX, "MatrixF::SizeSafe: Out of memory for construction.\n"); + #endif + if (y>=rows && x>=cols) { // New size is larger (in both r and c) + memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix + ne = data + len; // Calculate end of current matrix + b = newdata; // Start of new matrix + be = newdata + cols; // Last filled column+1 in new matrix + bskip = x-cols; + for (n = data; n0) { + n = data; // Copy columns to left of c + ne = data + len; + nskip = (cols-c); + b = newdata; + be = newdata + c; + bskip = (cols-c)+1; + for (; n>counter-clockwise<< when looking down the X+ axis toward the origin +inline MatrixF &MatrixF::RotateX (const double ang) +{ + Resize (4,4); + VTYPE *n = data; + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + *n = 1; n += 5; + *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; + *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; + *n = 1; + return *this; +} + +// rotates points >>counter-clockwise<< when looking down the Y+ axis toward the origin +inline MatrixF &MatrixF::RotateY (const double ang) +{ + Resize (4,4); + VTYPE *n = data; + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + *n = (VTYPE) c; n+=2; + *n = (VTYPE) -s; n+=3; + *n = 1; n+=3; + *n = (VTYPE) s; n+=2; + *n = (VTYPE) c; n+=5; + *n = 1; + return *this; +} + +// rotates points >>counter-clockwise<< when looking down the Z+ axis toward the origin +inline MatrixF &MatrixF::RotateZ (const double ang) +{ + Resize (4,4); + VTYPE *n = data; + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; + *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; + *n = 1; n+=5; *n = 1; + return *this; +} +inline MatrixF &MatrixF::Ortho (double sx, double sy, double vn, double vf) +{ + // simplified version of OpenGL's glOrtho function + VTYPE *n = data; + *n++ = (VTYPE) (1.0/sx); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (1.0/sy); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (-2.0/(vf-vn)); *n++ = (VTYPE) (-(vf+vn)/(vf-vn)); + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 1.0; +} + +inline MatrixF &MatrixF::Translate (double tx, double ty, double tz) +{ + Resize (4,4); + VTYPE *n = data; + *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) tx; *n++ = (VTYPE) ty; *n++ = (VTYPE) tz; *n++ = (VTYPE) 1.0; + return *this; +} + +inline MatrixF &MatrixF::Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3) +{ + Resize (4,4); + VTYPE *n = data; + *n++ = (VTYPE) c1.X(); *n++ = (VTYPE) c2.X(); *n++ = (VTYPE) c3.X(); *n++ = (VTYPE) 0; + *n++ = (VTYPE) c1.Y(); *n++ = (VTYPE) c2.Y(); *n++ = (VTYPE) c3.Y(); *n++ = (VTYPE) 0; + *n++ = (VTYPE) c1.Z(); *n++ = (VTYPE) c2.Z(); *n++ = (VTYPE) c3.Z(); *n++ = (VTYPE) 0; + *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; + return *this; +} + +#define SWAP(a, b) {temp=(a); (a)=(b); (b)=temp;} + +inline MatrixF &MatrixF::GaussJordan (MatrixF &b) +{ + // Gauss-Jordan solves the matrix equation Ax = b + // Given the problem: + // A*x = b (where A is 'this' matrix and b is provided) + // The solution is: + // Ainv*b = x + // This function returns Ainv in A and x in b... that is: + // A (this) -> Ainv + // b -> solution x + // + + MatrixI index_col, index_row; + MatrixI piv_flag; + int r, c, c2, rs, cs; + double piv_val; + int piv_row, piv_col; + double pivinv, dummy, temp; + + #ifdef DEBUG_MATRIX + if (rows!=cols) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows and cols of A must be equal.\n"); + if (rows!=b.rows) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows of A and rows of b must be equal.\n"); + if (b.cols!=1) Debug.Print ( DEBUG_MATRIX, "MatrixF::GaussJordan: Number of cols of b must be 1.\n"); + #endif + + index_col.Resize (cols, 1); + index_row.Resize (cols, 1); + piv_flag.Resize (cols, 1); + piv_flag = 0; + for (c = 0; c < cols; c++) { + piv_val = 0.0; + for (rs = 0; rs < rows; rs++) { + if (piv_flag(rs, 0) != 1 ) + for (cs = 0; cs < cols; cs++) { + if (piv_flag(cs, 0) == 0) { + if (fabs((*this) (cs, rs)) >= piv_val) { + piv_val = fabs((*this) (cs, rs)); + piv_row = rs; + piv_col = cs; + } + } else if (piv_flag(cs, 0)>1) { + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (dbl pivs).\n"); + //Print (); + #endif + } + } + } + piv_flag(piv_col, 0)++; + if (piv_row != piv_col) { + for (c2 = 0; c2 < cols; c2++) SWAP ((*this) (c2, piv_row), (*this) (c2, piv_col)); + for (c2 = 0; c2 < b.cols; c2++) SWAP (b(c2, piv_row), b(c2, piv_col)); + } + index_row (c, 0) = piv_row; + index_col (c, 0) = piv_col; + if ((*this) (piv_col, piv_col) == 0.0) { + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (0 piv).\n"); + //Print (); + #endif + } + pivinv = 1.0 / ((*this) (piv_col, piv_col)); + (*this) (piv_col, piv_col) = 1.0; + for (c2 = 0; c2 < cols; c2++) (*this) (c2, piv_col) *= pivinv; + for (c2 = 0; c2 < b.cols; c2++) b(c2, piv_col) *= pivinv; + for (r = 0; r < rows; r++) { + if (r != piv_col) { + dummy = (*this) (piv_col, r); + (*this) (piv_col, r) = 0.0; + for (c2 = 0; c2 < cols; c2++) (*this) (c2, r) -= (*this) (c2, piv_col)*dummy; + for (c2 = 0; c2 < b.cols; c2++) b(c2, r) -= b(c2, piv_col)*dummy; + } + } + } + for (c = cols-1; c >= 0; c--) { + if (index_row(c, 0) != index_col(c, 0)) + for (r = 0; r < rows; r++) + SWAP ((*this) (index_row(c,0), r), (*this) (index_col(c,0), r) ); + } + return *this; +} +inline MatrixF &MatrixF::Submatrix ( MatrixF& b, int mx, int my) +{ + VTYPE* pEnd = data + rows*cols; // end of matrix + VTYPE* pVal = data; + VTYPE* pNewVal = b.data; + VTYPE* pNewEnd = pNewVal + mx; + int pNewSkip = cols - mx; + + for (pVal = data; pVal < pEnd;) { + for (; pNewVal < pNewEnd;) *pVal++ = *pNewVal++; + pNewVal += pNewSkip; + pNewEnd += mx; + } + return *this; +} + +// N-Vector Dot Product +// Elements may be in rows or columns, but: +// - If in rows, number of columns must be one and number of rows must match. +// - If in cols, number of rows must be one and number of cols must match. +inline double MatrixF::Dot ( MatrixF& b ) +{ + double d = 0.0; + VTYPE* pA = data; + VTYPE* pB = b.data; + + if ( rows==1 && b.rows==1 && cols == b.cols ) { + VTYPE* pAEnd = data + cols; + d = 0.0; + for (; pA < pAEnd;) + d += (*pA++) * (*pB++); + } else if ( cols==1 && b.cols==1 && rows == b.rows) { + VTYPE* pAEnd = data + rows; + d = 0.0; + for (; pA < pAEnd;) + d += (*pA++) * (*pB++); + } + return d; +} + +#define I(x, y) ( (y*xres) + x ) +#define Ix(r) ( r % xres ) // X coordinate from row +#define Iy(r) ( r / xres ) // Y coordinate from row + +inline MatrixF &MatrixF::MatrixVector5 (MatrixF& x, int mrows, MatrixF& b) +{ + double v; + + // A( 2, r ) * B ( r ) + A(1,r)*B(r-1) + A(3,r)*B(r+1) + A(0, r)*B( R-( r ) ) + A(4, r)*B( R+( r ) ) + for (int r = 0; r < mrows; r++) { + v = GetVal(2, r) * x(0,r); + if ( r > 0 ) v += GetVal(1,r) * x(0,r-1); + if ( r < mrows-1) v += GetVal(3,r) * x(0,r+1); + if ( (int) GetVal(5, r) >= 0) v += GetVal(0,r) * x(0, (int) GetVal(5,r)); + if ( (int) GetVal(6, r) >= 0) v += GetVal(4,r) * x(0, (int) GetVal(6,r)); + b(0,r) = v; + } + return *this; +} + +inline MatrixF &MatrixF::ConjugateGradient (MatrixF &b) +{ + return *this; +} + +// Sparse Conjugate Gradient 2D (special case) +// This compute conjugate gradients on a +// sparse "5-7" x N positive definite matrix. +// Only 'mrows' subset of the row-size of A and b will be used. +inline MatrixF &MatrixF::ConjugateGradient5 (MatrixF &b, int mrows ) +{ + double a, g, rdot; + int i, imax; + MatrixF x, xnew; // solution vector + MatrixF r, rnew; // residual + MatrixF p, ptemp; // search direction + MatrixF v; + + x.Resize ( 1, mrows ); + xnew.Resize ( 1, mrows ); + r.Resize ( 1, mrows ); + rnew.Resize ( 1, mrows ); + p.Resize ( 1, mrows ); + ptemp.Resize ( 1, mrows ); + v.Resize ( 1, mrows ); + + r.Submatrix ( b, 1, mrows); + MatrixVector5 ( x, mrows, v ); // (Ax -> v) + r -= v; // r = b - Ax + p = r; + + imax = 20; + for (i=0; i < imax; i++) { + MatrixVector5 ( p, mrows, v ); // v = Ap + rdot = r.Dot ( r ); + a = rdot / p.Dot ( v ); // a = (r . r) / (p . v) + xnew = p; + xnew *= a; + xnew += x; // x = x + p*a + v *= a; + rnew = r; // rnew = r - v*a + rnew -= v; + g = rnew.Dot ( rnew ) / rdot; // g = (rnew . rnew) / (r . r) + p *= g; + p += rnew; // p = rnew + p*g + r = rnew; + x = xnew; + } + for (int rx=0; rx < mrows; rx++) + b(0, rx) = x(0, rx); + return *this; +} + +inline int MatrixF::GetX() {return cols;} +inline int MatrixF::GetY() {return rows;} +inline int MatrixF::GetRows(void) {return rows;} +inline int MatrixF::GetCols(void) {return cols;} +inline int MatrixF::GetLength(void) {return len;} +inline VTYPE *MatrixF::GetData(void) {return data;} + +inline double MatrixF::GetF (const int r, const int c) {return (double) (*(data + r*cols + c));} + +inline void MatrixF::GetRowVec (int r, Vector3DF &v) +{ + VTYPE *n = data + r*cols; + v.x = *n++; v.y = *n++; v.z= *n++; +} + +inline void MatrixF::Print ( char* fname ) +{ + char buf[2000]; + + FILE* fp = fopen ( fname, "w+" ); + + for (int r=0; r < rows; r++) { + buf[0] = '\0'; + for (int c =0; c < cols; c++) { + sprintf ( buf, "%s %04.3f", buf, GetVal(c, r) ); + } + fprintf ( fp, "%s\n", buf); + } + fprintf ( fp, "---------------------------------------\n", buf); + fflush ( fp ); + fclose ( fp ); +} + +#undef VTYPE #undef VNAME \ No newline at end of file diff --git a/Extras/sph/common/matrix.cci b/Extras/sph/common/matrix.cci index 830d123f3..37b7e0bad 100644 --- a/Extras/sph/common/matrix.cci +++ b/Extras/sph/common/matrix.cci @@ -1,2046 +1,2046 @@ - -// MatrixC Code Definition -#define VNAME C -#define VTYPE unsigned char - -// Constructors/Destructors - -inline MatrixC::MatrixC (void) {data = NULL; Resize (0,0);} -inline MatrixC::~MatrixC (void) {if (data!=NULL) delete[] data;} -inline MatrixC::MatrixC (int r, int c) {data = NULL; Resize (c,r);} - -// Member Functions - - -inline VTYPE &MatrixC::operator () (int c, int r) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); - if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); - if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); - #endif - return *(data + (r*cols+c)); -} -inline MatrixC &MatrixC::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n255) { - *n = (VTYPE) 255; - } else if (*b<=0) { - *n = (VTYPE) 0; - } else { - *n = (VTYPE) *b; - } - } - return *this; -} - -inline MatrixC &MatrixC::operator+= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. - bs = op.data; // Go back to first column in B - as += cols; // Goto next row in A - } - n++; // Goto next element in C - } - delete[] data; // Destroy old A matrix - data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix - } - return *this; -} - -inline MatrixC &MatrixC::Resize (int x, int y) -{ - if (data!=NULL) { - if (rows!=y || cols!=x) { - delete[] data; - len = (rows = y) * (cols = x); - data = new VTYPE[len]; - } - } else { - len = (rows = y) * (cols = x); data = new VTYPE[len]; - } - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Resize: Out of memory for construction.\n"); - #endif - #ifdef MATRIX_INITIALIZE - memset (data, 0, sizeof(VTYPE)*len); - #endif - return *this; -} -inline MatrixC &MatrixC::ResizeSafe (int x, int y) -{ - VTYPE *newdata; - int newlen; - VTYPE *n, *ne; - VTYPE *b, *be; - int bskip; - - - if (data!=NULL) { - newlen = x*y; - newdata = new VTYPE[newlen]; - #ifdef DEBUG_MATRIX - if (newdata==NULL) - Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); - #endif - if (y>=rows && x>=cols) { // New size is larger (in both r and c) - memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix - ne = data + len; // Calculate end of current matrix - b = newdata; // Start of new matrix - be = newdata + cols; // Last filled column+1 in new matrix - bskip = x-cols; - for (n = data; n0) { - n = data; // Copy columns to left of c - ne = data + len; - nskip = (cols-c); - b = newdata; - be = newdata + c; - bskip = (cols-c)+1; - for (; n Ainv - // b -> solution x - // - - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixC::GaussJordan: Not implemented for char matrix\n"); - #endif - return *this; -} -inline int MatrixC::GetX() {return cols;} -inline int MatrixC::GetY() {return rows;} -inline int MatrixC::GetRows(void) {return rows;} -inline int MatrixC::GetCols(void) {return cols;} -inline int MatrixC::GetLength(void) {return len;} -inline VTYPE *MatrixC::GetData(void) {return data;} - -inline double MatrixC::GetF (int r, int c) {return (double) (*(data + r*cols + c));} - -#undef VTYPE -#undef VNAME - -// MatrixI Code Definition -#define VNAME I -#define VTYPE int - -// Constructors/Destructors - -inline MatrixI::MatrixI (void) {data = NULL; Resize (0,0);} -inline MatrixI::~MatrixI (void) {if (data!=NULL) delete[] data;} -inline MatrixI::MatrixI (int r, int c) {data = NULL; Resize (c,r);} - -// Member Functions - -inline VTYPE &MatrixI::operator () (int c, int r) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixI::op(): Matrix data is null\n"); - if (r<0 || r>=rows) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Row is out of bounds\n"); - if (c<0 || c>=cols) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Col is out of bounds\n"); - #endif - return *(data + (r*cols+c)); -} -inline MatrixI &MatrixI::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. - bs = op.data; // Go back to first column in B - as += cols; // Goto next row in A - } - n++; // Goto next element in C - } - delete[] data; // Destroy old A matrix - data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix - } - return *this; -} - -inline MatrixI &MatrixI::Resize (int x, int y) -{ - if (data!=NULL) { - if (rows!=y || cols!=x) {delete[] data; len = (rows = y) * (cols = x); data = new VTYPE[len];} - } else { - len = (rows = y) * (cols = x); data = new VTYPE[len]; - } - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Size: Out of memory for construction.\n"); - #endif - #ifdef MATRIX_INITIALIZE - memset (data, 0, sizeof(VTYPE)*len); - #endif - return *this; -} -inline MatrixI &MatrixI::ResizeSafe (int x, int y) -{ - VTYPE *newdata; - int newlen; - VTYPE *n, *ne; - VTYPE *b, *be; - int bskip; - - - if (data!=NULL) { - newlen = x*y; - newdata = new VTYPE[newlen]; - #ifdef DEBUG_MATRIX - if (newdata==NULL) - Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); - #endif - if (y>=rows && x>=cols) { // New size is larger (in both r and c) - memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix - ne = data + len; // Calculate end of current matrix - b = newdata; // Start of new matrix - be = newdata + cols; // Last filled column+1 in new matrix - bskip = x-cols; - for (n = data; n0) { - n = data; // Copy columns to left of c - ne = data + len; - nskip = (cols-c); - b = newdata; - be = newdata + c; - bskip = (cols-c)+1; - for (; n Ainv - // b -> solution x - // - - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixI::GaussJordan: Not implemented for int matrix\n"); - #endif - return *this; -} -inline int MatrixI::GetX() {return cols;} -inline int MatrixI::GetY() {return rows;} -inline int MatrixI::GetRows(void) {return rows;} -inline int MatrixI::GetCols(void) {return cols;} -inline int MatrixI::GetLength(void) {return len;} -inline VTYPE *MatrixI::GetData(void) {return data;} - -inline double MatrixI::GetF (int r, int c) {return (double) (*(data + r*cols + c));} - -#undef VTYPE -#undef VNAME - - -// MatrixF Code Definition -#define VNAME F -#define VTYPE double - -// Constructors/Destructors - -inline MatrixF::MatrixF (void) {data = NULL; Resize (0,0);} - -inline MatrixF::~MatrixF (void) { - if (data!=NULL) - delete [] data; -} -inline MatrixF::MatrixF (const int r, const int c) {data = NULL; Resize (r,c);} - -// Member Functions - -inline VTYPE MatrixF::GetVal ( int c, int r ) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); - if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); - if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); - #endif - return *(data + (r*cols+c)); -} - -inline VTYPE &MatrixF::operator () (const int c, const int r) -{ - #ifdef DEBUG_MATRIX - if (data==NULL) - Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); - if (r<0 || r>=rows) - Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); - if (c<0 || c>=cols) - Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); - #endif - return *(data + (r*cols+c)); -} -inline MatrixF &MatrixF::operator= (const unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. - bs = op.data; // Go back to first column in B - as += cols; // Goto next row in A - } - n++; // Goto next element in C - } - delete[] data; // Destroy old A matrix - data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix - } - return *this; -} - -inline MatrixF &MatrixF::Multiply4x4 (const MatrixF &op) { - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix data is null\n"); - if (op.data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Operand matrix (op) data is null\n"); - if (rows!=4 || cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix m is not 4x4"); - if (op.rows!=4 || op.cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix op is not 4x4"); - #endif - register double c1, c2, c3, c4; // Temporary storage - VTYPE *n, *a, *b1, *b2, *b3, *b4; - a = data; n = data; - b1 = op.data; b2 = op.data + 4; b3 = op.data + 8; b4 = op.data + 12; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate First Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Second Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Third Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; - - c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a; // Calculate Four Row - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); - *n = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); - - return *this; -} - - -inline MatrixF &MatrixF::Resize (const int x, const int y) -{ - if (data!=NULL) { - if (rows==y && cols==x) return *this; - delete[] data; - } - rows = y; cols = x; - if (y>0 && x>0) { - len = rows * cols; - if (len!=0) { - data = new VTYPE[len]; - #ifdef DEBUG_MATRIX - if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Size: Out of memory for construction.\n"); - #endif - } - } - - #ifdef MATRIX_INITIALIZE - if (data!=NULL) memset (data, 0, sizeof(VTYPE)*len); - #endif - return *this; -} -inline MatrixF &MatrixF::ResizeSafe (const int x, const int y) -{ - VTYPE *newdata; - int newlen; - VTYPE *n, *ne; - VTYPE *b, *be; - int bskip; - - if (data!=NULL) { - newlen = x*y; - newdata = new VTYPE[newlen]; - #ifdef DEBUG_MATRIX - if (newdata==NULL) - Debug.Print (DEBUG_MATRIX, "MatrixF::SizeSafe: Out of memory for construction.\n"); - #endif - if (y>=rows && x>=cols) { // New size is larger (in both r and c) - memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix - ne = data + len; // Calculate end of current matrix - b = newdata; // Start of new matrix - be = newdata + cols; // Last filled column+1 in new matrix - bskip = x-cols; - for (n = data; n0) { - n = data; // Copy columns to left of c - ne = data + len; - nskip = (cols-c); - b = newdata; - be = newdata + c; - bskip = (cols-c)+1; - for (; n>counter-clockwise<< when looking down the X+ axis toward the origin -inline MatrixF &MatrixF::RotateX (const double ang) -{ - Resize (4,4); - VTYPE *n = data; - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - *n = 1; n += 5; - *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; - *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; - *n = 1; - return *this; -} - -// rotates points >>counter-clockwise<< when looking down the Y+ axis toward the origin -inline MatrixF &MatrixF::RotateY (const double ang) -{ - Resize (4,4); - VTYPE *n = data; - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - *n = (VTYPE) c; n+=2; - *n = (VTYPE) -s; n+=3; - *n = 1; n+=3; - *n = (VTYPE) s; n+=2; - *n = (VTYPE) c; n+=5; - *n = 1; - return *this; -} - -// rotates points >>counter-clockwise<< when looking down the Z+ axis toward the origin -inline MatrixF &MatrixF::RotateZ (const double ang) -{ - Resize (4,4); - VTYPE *n = data; - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; - *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; - *n = 1; n+=5; *n = 1; - return *this; -} -inline MatrixF &MatrixF::Ortho (double sx, double sy, double vn, double vf) -{ - // simplified version of OpenGL's glOrtho function - VTYPE *n = data; - *n++ = (VTYPE) (1.0/sx); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (1.0/sy); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (-2.0/(vf-vn)); *n++ = (VTYPE) (-(vf+vn)/(vf-vn)); - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 1.0; -} - -inline MatrixF &MatrixF::Translate (double tx, double ty, double tz) -{ - Resize (4,4); - VTYPE *n = data; - *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; - *n++ = (VTYPE) tx; *n++ = (VTYPE) ty; *n++ = (VTYPE) tz; *n++ = (VTYPE) 1.0; - return *this; -} - -inline MatrixF &MatrixF::Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3) -{ - Resize (4,4); - VTYPE *n = data; - *n++ = (VTYPE) c1.X(); *n++ = (VTYPE) c2.X(); *n++ = (VTYPE) c3.X(); *n++ = (VTYPE) 0; - *n++ = (VTYPE) c1.Y(); *n++ = (VTYPE) c2.Y(); *n++ = (VTYPE) c3.Y(); *n++ = (VTYPE) 0; - *n++ = (VTYPE) c1.Z(); *n++ = (VTYPE) c2.Z(); *n++ = (VTYPE) c3.Z(); *n++ = (VTYPE) 0; - *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; - return *this; -} - -#define SWAP(a, b) {temp=(a); (a)=(b); (b)=temp;} - -inline MatrixF &MatrixF::GaussJordan (MatrixF &b) -{ - // Gauss-Jordan solves the matrix equation Ax = b - // Given the problem: - // A*x = b (where A is 'this' matrix and b is provided) - // The solution is: - // Ainv*b = x - // This function returns Ainv in A and x in b... that is: - // A (this) -> Ainv - // b -> solution x - // - - MatrixI index_col, index_row; - MatrixI piv_flag; - int r, c, c2, rs, cs; - double piv_val; - int piv_row, piv_col; - double pivinv, dummy, temp; - - #ifdef DEBUG_MATRIX - if (rows!=cols) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows and cols of A must be equal.\n"); - if (rows!=b.rows) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows of A and rows of b must be equal.\n"); - if (b.cols!=1) Debug.Print ( DEBUG_MATRIX, "MatrixF::GaussJordan: Number of cols of b must be 1.\n"); - #endif - - index_col.Resize (cols, 1); - index_row.Resize (cols, 1); - piv_flag.Resize (cols, 1); - piv_flag = 0; - for (c = 0; c < cols; c++) { - piv_val = 0.0; - for (rs = 0; rs < rows; rs++) { - if (piv_flag(rs, 0) != 1 ) - for (cs = 0; cs < cols; cs++) { - if (piv_flag(cs, 0) == 0) { - if (fabs((*this) (cs, rs)) >= piv_val) { - piv_val = fabs((*this) (cs, rs)); - piv_row = rs; - piv_col = cs; - } - } else if (piv_flag(cs, 0)>1) { - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (dbl pivs).\n"); - //Print (); - #endif - } - } - } - piv_flag(piv_col, 0)++; - if (piv_row != piv_col) { - for (c2 = 0; c2 < cols; c2++) SWAP ((*this) (c2, piv_row), (*this) (c2, piv_col)); - for (c2 = 0; c2 < b.cols; c2++) SWAP (b(c2, piv_row), b(c2, piv_col)); - } - index_row (c, 0) = piv_row; - index_col (c, 0) = piv_col; - if ((*this) (piv_col, piv_col) == 0.0) { - #ifdef DEBUG_MATRIX - Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (0 piv).\n"); - //Print (); - #endif - } - pivinv = 1.0 / ((*this) (piv_col, piv_col)); - (*this) (piv_col, piv_col) = 1.0; - for (c2 = 0; c2 < cols; c2++) (*this) (c2, piv_col) *= pivinv; - for (c2 = 0; c2 < b.cols; c2++) b(c2, piv_col) *= pivinv; - for (r = 0; r < rows; r++) { - if (r != piv_col) { - dummy = (*this) (piv_col, r); - (*this) (piv_col, r) = 0.0; - for (c2 = 0; c2 < cols; c2++) (*this) (c2, r) -= (*this) (c2, piv_col)*dummy; - for (c2 = 0; c2 < b.cols; c2++) b(c2, r) -= b(c2, piv_col)*dummy; - } - } - } - for (c = cols-1; c >= 0; c--) { - if (index_row(c, 0) != index_col(c, 0)) - for (r = 0; r < rows; r++) - SWAP ((*this) (index_row(c,0), r), (*this) (index_col(c,0), r) ); - } - return *this; -} -inline MatrixF &MatrixF::Submatrix ( MatrixF& b, int mx, int my) -{ - VTYPE* pEnd = data + rows*cols; // end of matrix - VTYPE* pVal = data; - VTYPE* pNewVal = b.data; - VTYPE* pNewEnd = pNewVal + mx; - int pNewSkip = cols - mx; - - for (pVal = data; pVal < pEnd;) { - for (; pNewVal < pNewEnd;) *pVal++ = *pNewVal++; - pNewVal += pNewSkip; - pNewEnd += mx; - } - return *this; -} - -// N-Vector Dot Product -// Elements may be in rows or columns, but: -// - If in rows, number of columns must be one and number of rows must match. -// - If in cols, number of rows must be one and number of cols must match. -inline double MatrixF::Dot ( MatrixF& b ) -{ - double d = 0.0; - VTYPE* pA = data; - VTYPE* pB = b.data; - - if ( rows==1 && b.rows==1 && cols == b.cols ) { - VTYPE* pAEnd = data + cols; - d = 0.0; - for (; pA < pAEnd;) - d += (*pA++) * (*pB++); - } else if ( cols==1 && b.cols==1 && rows == b.rows) { - VTYPE* pAEnd = data + rows; - d = 0.0; - for (; pA < pAEnd;) - d += (*pA++) * (*pB++); - } - return d; -} - -#define I(x, y) ( (y*xres) + x ) -#define Ix(r) ( r % xres ) // X coordinate from row -#define Iy(r) ( r / xres ) // Y coordinate from row - -inline MatrixF &MatrixF::MatrixVector5 (MatrixF& x, int mrows, MatrixF& b) -{ - double v; - - // A( 2, r ) * B ( r ) + A(1,r)*B(r-1) + A(3,r)*B(r+1) + A(0, r)*B( R-( r ) ) + A(4, r)*B( R+( r ) ) - for (int r = 0; r < mrows; r++) { - v = GetVal(2, r) * x(0,r); - if ( r > 0 ) v += GetVal(1,r) * x(0,r-1); - if ( r < mrows-1) v += GetVal(3,r) * x(0,r+1); - if ( (int) GetVal(5, r) >= 0) v += GetVal(0,r) * x(0, (int) GetVal(5,r)); - if ( (int) GetVal(6, r) >= 0) v += GetVal(4,r) * x(0, (int) GetVal(6,r)); - b(0,r) = v; - } - return *this; -} - -inline MatrixF &MatrixF::ConjugateGradient (MatrixF &b) -{ - return *this; -} - -// Sparse Conjugate Gradient 2D (special case) -// This compute conjugate gradients on a -// sparse "5-7" x N positive definite matrix. -// Only 'mrows' subset of the row-size of A and b will be used. -inline MatrixF &MatrixF::ConjugateGradient5 (MatrixF &b, int mrows ) -{ - double a, g, rdot; - int i, imax; - MatrixF x, xnew; // solution vector - MatrixF r, rnew; // residual - MatrixF p, ptemp; // search direction - MatrixF v; - - x.Resize ( 1, mrows ); - xnew.Resize ( 1, mrows ); - r.Resize ( 1, mrows ); - rnew.Resize ( 1, mrows ); - p.Resize ( 1, mrows ); - ptemp.Resize ( 1, mrows ); - v.Resize ( 1, mrows ); - - r.Submatrix ( b, 1, mrows); - MatrixVector5 ( x, mrows, v ); // (Ax -> v) - r -= v; // r = b - Ax - p = r; - - imax = 20; - for (i=0; i < imax; i++) { - MatrixVector5 ( p, mrows, v ); // v = Ap - rdot = r.Dot ( r ); - a = rdot / p.Dot ( v ); // a = (r . r) / (p . v) - xnew = p; - xnew *= a; - xnew += x; // x = x + p*a - v *= a; - rnew = r; // rnew = r - v*a - rnew -= v; - g = rnew.Dot ( rnew ) / rdot; // g = (rnew . rnew) / (r . r) - p *= g; - p += rnew; // p = rnew + p*g - r = rnew; - x = xnew; - } - for (int rx=0; rx < mrows; rx++) - b(0, rx) = x(0, rx); - return *this; -} - -inline int MatrixF::GetX() {return cols;} -inline int MatrixF::GetY() {return rows;} -inline int MatrixF::GetRows(void) {return rows;} -inline int MatrixF::GetCols(void) {return cols;} -inline int MatrixF::GetLength(void) {return len;} -inline VTYPE *MatrixF::GetData(void) {return data;} - -inline double MatrixF::GetF (const int r, const int c) {return (double) (*(data + r*cols + c));} - -inline void MatrixF::GetRowVec (int r, Vector3DF &v) -{ - VTYPE *n = data + r*cols; - v.x = (float) *n++; v.y = (float) *n++; v.z= (float) *n++; -} - -inline void MatrixF::Print ( char* fname ) -{ - char buf[2000]; - - FILE* fp = fopen ( fname, "w+" ); - - for (int r=0; r < rows; r++) { - buf[0] = '\0'; - for (int c =0; c < cols; c++) { - sprintf ( buf, "%s %04.3f", buf, GetVal(c, r) ); - } - fprintf ( fp, "%s\n", buf); - } - fprintf ( fp, "---------------------------------------\n", buf); - fflush ( fp ); - fclose ( fp ); -} - - -// MatrixF Code Definition -#undef VTYPE -#define VNAME F -#define VTYPE float - -// Constructors/Destructors - -inline Matrix4F::Matrix4F (void) { for (int n=0; n < 16; n++) data[n] = 0.0; } - -inline Matrix4F &Matrix4F::operator= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] = (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator= (const int op) {for ( int n=0; n<16; n++) data[n] = (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator= (const double op) {for ( int n=0; n<16; n++) data[n] = (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator+= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] += (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator+= (const int op) {for ( int n=0; n<16; n++) data[n] += (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator+= (const double op) {for ( int n=0; n<16; n++) data[n] += (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator-= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] -= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator-= (const int op) {for ( int n=0; n<16; n++) data[n] -= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator-= (const double op) {for ( int n=0; n<16; n++) data[n] -= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator*= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] *= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator*= (const int op) {for ( int n=0; n<16; n++) data[n] *= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator*= (const double op) {for ( int n=0; n<16; n++) data[n] *= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator/= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] /= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator/= (const int op) {for ( int n=0; n<16; n++) data[n] /= (VTYPE) op; return *this;} -inline Matrix4F &Matrix4F::operator/= (const double op) {for ( int n=0; n<16; n++) data[n] /= (VTYPE) op; return *this;} - -inline Matrix4F &Matrix4F::Multiply (const Matrix4F &op) { - register float orig[16]; // Temporary storage - memcpy ( orig, data, 16*sizeof(float) ); - - // Calculate First Row - data[0] = orig[0]*op.data[0] + orig[1]*op.data[4] + orig[2]*op.data[8] + orig[3]*op.data[12]; - data[1] = orig[0]*op.data[1] + orig[1]*op.data[5] + orig[2]*op.data[9] + orig[3]*op.data[13]; - data[2] = orig[0]*op.data[2] + orig[1]*op.data[6] + orig[2]*op.data[10] + orig[3]*op.data[14]; - data[3] = orig[0]*op.data[3] + orig[1]*op.data[7] + orig[2]*op.data[11] + orig[3]*op.data[15]; - - // Calculate Second Row - data[4] = orig[4]*op.data[0] + orig[5]*op.data[4] + orig[6]*op.data[8] + orig[7]*op.data[12]; - data[5] = orig[4]*op.data[1] + orig[5]*op.data[5] + orig[6]*op.data[9] + orig[7]*op.data[13]; - data[6] = orig[4]*op.data[2] + orig[5]*op.data[6] + orig[6]*op.data[10] + orig[7]*op.data[14]; - data[7] = orig[4]*op.data[3] + orig[5]*op.data[7] + orig[6]*op.data[11] + orig[7]*op.data[15]; - - // Calculate Third Row - data[8] = orig[8]*op.data[0] + orig[9]*op.data[4] + orig[10]*op.data[8] + orig[11]*op.data[12]; - data[9] = orig[8]*op.data[1] + orig[9]*op.data[5] + orig[10]*op.data[9] + orig[11]*op.data[13]; - data[10] = orig[8]*op.data[2] + orig[9]*op.data[6] + orig[10]*op.data[10] + orig[11]*op.data[14]; - data[11] = orig[8]*op.data[3] + orig[9]*op.data[7] + orig[10]*op.data[11] + orig[11]*op.data[15]; - - // Calculate Four Row - data[12] = orig[12]*op.data[0] + orig[13]*op.data[4] + orig[14]*op.data[8] + orig[15]*op.data[12]; - data[13] = orig[12]*op.data[1] + orig[13]*op.data[5] + orig[14]*op.data[9] + orig[15]*op.data[13]; - data[14] = orig[12]*op.data[2] + orig[13]*op.data[6] + orig[14]*op.data[10] + orig[15]*op.data[14]; - data[15] = orig[12]*op.data[3] + orig[13]*op.data[7] + orig[14]*op.data[11] + orig[15]*op.data[15]; - - return *this; -} - -inline Matrix4F &Matrix4F::Transpose (void) -{ - register float orig[16]; // Temporary storage - memcpy ( orig, data, 16*sizeof(VTYPE) ); - - data[0] = orig[0]; data[1] = orig[4]; data[2] = orig[8]; data[3] = orig[12]; - data[4] = orig[1]; data[5] = orig[5]; data[6] = orig[9]; data[7] = orig[13]; - data[8] = orig[2]; data[9] = orig[6]; data[10] = orig[10];data[11] = orig[14]; - data[12] = orig[3]; data[13] = orig[7]; data[14] = orig[11];data[15] = orig[15]; - return *this; -} - -inline Matrix4F &Matrix4F::Identity (const int order) -{ - memset (data, 0, 16*sizeof(VTYPE)); - data[0] = 1.0; - data[5] = 1.0; - data[10] = 1.0; - data[15] = 1.0; - return *this; -} - -inline Matrix4F &Matrix4F::RotateX (const double ang) -{ - memset (data, 0, 16*sizeof(VTYPE)); - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - data[0] = 1; - data[5] = (VTYPE) c; data[6] = (VTYPE) s; - data[9] = (VTYPE) -s; data[10] = (VTYPE) c; - data[15] = 1; - return *this; -} - -// rotates points >>counter-clockwise<< when looking down the Y+ axis toward the origin -inline Matrix4F &Matrix4F::RotateY (const double ang) -{ - memset (data, 0, 16*sizeof(VTYPE)); - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - data[0] = (VTYPE) c; - data[2] = (VTYPE) -s; - data[5] = 1; - data[8] = (VTYPE) s; - data[10] = (VTYPE) c; - data[15] = 1; - return *this; -} - -// rotates points >>counter-clockwise<< when looking down the Z+ axis toward the origin -inline Matrix4F &Matrix4F::RotateZ (const double ang) -{ - memset (data, 0, 16*sizeof(VTYPE)); - double c,s; - c = cos(ang * 3.141592/180); - s = sin(ang * 3.141592/180); - data[0] = (VTYPE) c; data[1] = (VTYPE) s; - data[4] = (VTYPE) -s; data[5] = (VTYPE) c; - data[10] = 1; - data[15] = 1; - return *this; -} -inline Matrix4F &Matrix4F::Ortho (double sx, double sy, double vn, double vf) -{ - // simplified version of OpenGL's glOrtho function - data[ 0] = (VTYPE) (1.0/sx);data[ 1] = (VTYPE) 0.0; data[ 2] = (VTYPE) 0.0; data[ 3]= (VTYPE) 0.0; - data[ 4] = (VTYPE) 0.0; data[ 5] = (VTYPE) (1.0/sy);data[ 6] = (VTYPE) 0.0; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) 0.0; data[ 9] = (VTYPE) 0.0; data[10]= (VTYPE) (-2.0/(vf-vn)); data[11] = (VTYPE) (-(vf+vn)/(vf-vn)); - data[12] = (VTYPE) 0.0; data[13] = (VTYPE) 0.0; data[14] = (VTYPE) 0; data[15] = (VTYPE) 1.0; -} - -inline Matrix4F &Matrix4F::Translate (double tx, double ty, double tz) -{ - data[ 0] = (VTYPE) 1.0; data[ 1] = (VTYPE) 0.0; data[ 2] = (VTYPE) 0.0; data[ 3] = (VTYPE) 0.0; - data[ 4] = (VTYPE) 0.0; data[ 5] = (VTYPE) 1.0; data[ 6] = (VTYPE) 0.0; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) 0.0; data[ 9] = (VTYPE) 0.0; data[10] = (VTYPE) 1.0; data[11] = (VTYPE) 0.0; - data[12] = (VTYPE) tx; data[13] = (VTYPE) ty; data[14] = (VTYPE) tz; data[15] = (VTYPE) 1.0; - return *this; -} - -inline Matrix4F &Matrix4F::Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3) -{ - data[ 0] = (VTYPE) c1.x; data[ 1] = (VTYPE) c2.x; data[ 2] = (VTYPE) c3.x; data[ 3] = (VTYPE) 0.0; - data[ 4] = (VTYPE) c1.y; data[ 5] = (VTYPE) c2.y; data[ 6] = (VTYPE) c3.y; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) c1.z; data[ 9] = (VTYPE) c2.z; data[10] = (VTYPE) c3.z; data[11] = (VTYPE) 0.0; - data[12] = (VTYPE) 0.0; data[13] = (VTYPE) 0.0; data[14] = (VTYPE) 0.0; data[15] = (VTYPE) 1.0; - return *this; -} - -inline Matrix4F &Matrix4F::SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s) -{ - data[ 0] = (VTYPE) c1.x*s.x; data[ 1] = (VTYPE) c2.x*s.x; data[ 2] = (VTYPE) c3.x*s.x; data[ 3] = (VTYPE) 0.0; - data[ 4] = (VTYPE) c1.y*s.y; data[ 5] = (VTYPE) c2.y*s.y; data[ 6] = (VTYPE) c3.y*s.y; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) c1.z*s.z; data[ 9] = (VTYPE) c2.z*s.z; data[10] = (VTYPE) c3.z*s.z; data[11] = (VTYPE) 0.0; - data[12] = (VTYPE) t.x; data[13] = (VTYPE) t.y; data[14] = (VTYPE) t.z; data[15] = (VTYPE) 1.0; -} -inline Matrix4F &Matrix4F::SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s) -{ - data[ 0] = (VTYPE) c1.x*s; data[ 1] = (VTYPE) c1.y*s; data[ 2] = (VTYPE) c1.z*s; data[ 3] = (VTYPE) 0.0; - data[ 4] = (VTYPE) c2.x*s; data[ 5] = (VTYPE) c2.y*s; data[ 6] = (VTYPE) c2.z*s; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) c3.x*s; data[ 9] = (VTYPE) c3.y*s; data[10] = (VTYPE) c3.z*s; data[11] = (VTYPE) 0.0; - data[12] = (VTYPE) t.x; data[13] = (VTYPE) t.y; data[14] = (VTYPE) t.z; data[15] = (VTYPE) 1.0; - return *this; -} - -inline Matrix4F &Matrix4F::InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s) -{ - data[ 0] = (VTYPE) c1.x/s.x; data[ 1] = (VTYPE) c1.y/s.y; data[ 2] = (VTYPE) c1.z/s.z; data[ 3] = (VTYPE) 0.0; - data[ 4] = (VTYPE) c2.x/s.x; data[ 5] = (VTYPE) c2.y/s.y; data[ 6] = (VTYPE) c2.z/s.z; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) c3.x/s.x; data[ 9] = (VTYPE) c3.y/s.y; data[10] = (VTYPE) c3.z/s.z; data[11] = (VTYPE) 0.0; - data[12] = (VTYPE) -t.x/s.x; data[13] = (VTYPE) -t.y/s.y; data[14] = (VTYPE) -t.z/s.z; data[15] = (VTYPE) 1.0; -} -inline Matrix4F &Matrix4F::InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s) -{ - data[ 0] = (VTYPE) c1.x/s; data[ 1] = (VTYPE) c1.y/s; data[ 2] = (VTYPE) c1.z/s; data[ 3] = (VTYPE) 0.0; - data[ 4] = (VTYPE) c2.x/s; data[ 5] = (VTYPE) c2.y/s; data[ 6] = (VTYPE) c2.z/s; data[ 7] = (VTYPE) 0.0; - data[ 8] = (VTYPE) c3.x/s; data[ 9] = (VTYPE) c3.y/s; data[10] = (VTYPE) c3.z/s; data[11] = (VTYPE) 0.0; - data[12] = (VTYPE) -t.x/s; data[13] = (VTYPE) -t.y/s; data[14] = (VTYPE) -t.z/s; data[15] = (VTYPE) 1.0; -} - -inline float Matrix4F::GetF (const int r, const int c) {return (float) data[ (r<<2) + c];} - -inline void Matrix4F::GetRowVec (int r, Vector3DF &v) -{ - v.x = data[ (r<<2) ]; - v.y = data[ (r<<2)+1 ]; - v.z = data[ (r<<2)+2 ]; -} - -#undef VTYPE -#undef VNAME - + +// MatrixC Code Definition +#define VNAME C +#define VTYPE unsigned char + +// Constructors/Destructors + +inline MatrixC::MatrixC (void) {data = NULL; Resize (0,0);} +inline MatrixC::~MatrixC (void) {if (data!=NULL) delete[] data;} +inline MatrixC::MatrixC (int r, int c) {data = NULL; Resize (c,r);} + +// Member Functions + + +inline VTYPE &MatrixC::operator () (int c, int r) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); + if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); + if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); + #endif + return *(data + (r*cols+c)); +} +inline MatrixC &MatrixC::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n255) { + *n = (VTYPE) 255; + } else if (*b<=0) { + *n = (VTYPE) 0; + } else { + *n = (VTYPE) *b; + } + } + return *this; +} + +inline MatrixC &MatrixC::operator+= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. + bs = op.data; // Go back to first column in B + as += cols; // Goto next row in A + } + n++; // Goto next element in C + } + delete[] data; // Destroy old A matrix + data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix + } + return *this; +} + +inline MatrixC &MatrixC::Resize (int x, int y) +{ + if (data!=NULL) { + if (rows!=y || cols!=x) { + delete[] data; + len = (rows = y) * (cols = x); + data = new VTYPE[len]; + } + } else { + len = (rows = y) * (cols = x); data = new VTYPE[len]; + } + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Resize: Out of memory for construction.\n"); + #endif + #ifdef MATRIX_INITIALIZE + memset (data, 0, sizeof(VTYPE)*len); + #endif + return *this; +} +inline MatrixC &MatrixC::ResizeSafe (int x, int y) +{ + VTYPE *newdata; + int newlen; + VTYPE *n, *ne; + VTYPE *b, *be; + int bskip; + + + if (data!=NULL) { + newlen = x*y; + newdata = new VTYPE[newlen]; + #ifdef DEBUG_MATRIX + if (newdata==NULL) + Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); + #endif + if (y>=rows && x>=cols) { // New size is larger (in both r and c) + memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix + ne = data + len; // Calculate end of current matrix + b = newdata; // Start of new matrix + be = newdata + cols; // Last filled column+1 in new matrix + bskip = x-cols; + for (n = data; n0) { + n = data; // Copy columns to left of c + ne = data + len; + nskip = (cols-c); + b = newdata; + be = newdata + c; + bskip = (cols-c)+1; + for (; n Ainv + // b -> solution x + // + + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixC::GaussJordan: Not implemented for char matrix\n"); + #endif + return *this; +} +inline int MatrixC::GetX() {return cols;} +inline int MatrixC::GetY() {return rows;} +inline int MatrixC::GetRows(void) {return rows;} +inline int MatrixC::GetCols(void) {return cols;} +inline int MatrixC::GetLength(void) {return len;} +inline VTYPE *MatrixC::GetData(void) {return data;} + +inline double MatrixC::GetF (int r, int c) {return (double) (*(data + r*cols + c));} + +#undef VTYPE +#undef VNAME + +// MatrixI Code Definition +#define VNAME I +#define VTYPE int + +// Constructors/Destructors + +inline MatrixI::MatrixI (void) {data = NULL; Resize (0,0);} +inline MatrixI::~MatrixI (void) {if (data!=NULL) delete[] data;} +inline MatrixI::MatrixI (int r, int c) {data = NULL; Resize (c,r);} + +// Member Functions + +inline VTYPE &MatrixI::operator () (int c, int r) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixI::op(): Matrix data is null\n"); + if (r<0 || r>=rows) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Row is out of bounds\n"); + if (c<0 || c>=cols) Debug.Print (DEBUG_MATRIX, "MatrixI:op(): Col is out of bounds\n"); + #endif + return *(data + (r*cols+c)); +} +inline MatrixI &MatrixI::operator= (unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. + bs = op.data; // Go back to first column in B + as += cols; // Goto next row in A + } + n++; // Goto next element in C + } + delete[] data; // Destroy old A matrix + data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix + } + return *this; +} + +inline MatrixI &MatrixI::Resize (int x, int y) +{ + if (data!=NULL) { + if (rows!=y || cols!=x) {delete[] data; len = (rows = y) * (cols = x); data = new VTYPE[len];} + } else { + len = (rows = y) * (cols = x); data = new VTYPE[len]; + } + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixC::Size: Out of memory for construction.\n"); + #endif + #ifdef MATRIX_INITIALIZE + memset (data, 0, sizeof(VTYPE)*len); + #endif + return *this; +} +inline MatrixI &MatrixI::ResizeSafe (int x, int y) +{ + VTYPE *newdata; + int newlen; + VTYPE *n, *ne; + VTYPE *b, *be; + int bskip; + + + if (data!=NULL) { + newlen = x*y; + newdata = new VTYPE[newlen]; + #ifdef DEBUG_MATRIX + if (newdata==NULL) + Debug.Print (DEBUG_MATRIX, "MatrixC::SizeSafe: Out of memory for construction.\n"); + #endif + if (y>=rows && x>=cols) { // New size is larger (in both r and c) + memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix + ne = data + len; // Calculate end of current matrix + b = newdata; // Start of new matrix + be = newdata + cols; // Last filled column+1 in new matrix + bskip = x-cols; + for (n = data; n0) { + n = data; // Copy columns to left of c + ne = data + len; + nskip = (cols-c); + b = newdata; + be = newdata + c; + bskip = (cols-c)+1; + for (; n Ainv + // b -> solution x + // + + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixI::GaussJordan: Not implemented for int matrix\n"); + #endif + return *this; +} +inline int MatrixI::GetX() {return cols;} +inline int MatrixI::GetY() {return rows;} +inline int MatrixI::GetRows(void) {return rows;} +inline int MatrixI::GetCols(void) {return cols;} +inline int MatrixI::GetLength(void) {return len;} +inline VTYPE *MatrixI::GetData(void) {return data;} + +inline double MatrixI::GetF (int r, int c) {return (double) (*(data + r*cols + c));} + +#undef VTYPE +#undef VNAME + + +// MatrixF Code Definition +#define VNAME F +#define VTYPE double + +// Constructors/Destructors + +inline MatrixF::MatrixF (void) {data = NULL; Resize (0,0);} + +inline MatrixF::~MatrixF (void) { + if (data!=NULL) + delete [] data; +} +inline MatrixF::MatrixF (const int r, const int c) {data = NULL; Resize (r,c);} + +// Member Functions + +inline VTYPE MatrixF::GetVal ( int c, int r ) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); + if (r<0 || r>=rows) Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); + if (c<0 || c>=cols) Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); + #endif + return *(data + (r*cols+c)); +} + +inline VTYPE &MatrixF::operator () (const int c, const int r) +{ + #ifdef DEBUG_MATRIX + if (data==NULL) + Error.Print ( ErrorLev::Matrix, ErrorDef::MatrixIsNull, true ); + if (r<0 || r>=rows) + Error.Print ( ErrorLev::Matrix, ErrorDef::RowOutOfBounds, true ); + if (c<0 || c>=cols) + Error.Print ( ErrorLev::Matrix, ErrorDef::ColOutOfBounds, true ); + #endif + return *(data + (r*cols+c)); +} +inline MatrixF &MatrixF::operator= (const unsigned char op) {VTYPE *n = data, *nlen = data + len; for (;n= bce) { // If last col in B.. + bs = op.data; // Go back to first column in B + as += cols; // Goto next row in A + } + n++; // Goto next element in C + } + delete[] data; // Destroy old A matrix + data = newdata; rows = newr; cols = newc; len = newlen; // Replace with new A matrix + } + return *this; +} + +inline MatrixF &MatrixF::Multiply4x4 (const MatrixF &op) { + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix data is null\n"); + if (op.data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Operand matrix (op) data is null\n"); + if (rows!=4 || cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix m is not 4x4"); + if (op.rows!=4 || op.cols!=4) Debug.Print (DEBUG_MATRIX, "MatrixF::Multiply4x4 m*=op: Matrix op is not 4x4"); + #endif + register double c1, c2, c3, c4; // Temporary storage + VTYPE *n, *a, *b1, *b2, *b3, *b4; + a = data; n = data; + b1 = op.data; b2 = op.data + 4; b3 = op.data + 8; b4 = op.data + 12; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate First Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Second Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a++; // Calculate Third Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + b1 -= 3 ; b2 -= 3; b3 -= 3; b4 -= 3; + + c1 = *a++; c2 = *a++; c3 = *a++; c4 = *a; // Calculate Four Row + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n++ = c1*(*b1++) + c2*(*b2++) + c3*(*b3++) + c4*(*b4++); + *n = c1*(*b1) + c2*(*b2) + c3*(*b3) + c4*(*b4); + + return *this; +} + + +inline MatrixF &MatrixF::Resize (const int x, const int y) +{ + if (data!=NULL) { + if (rows==y && cols==x) return *this; + delete[] data; + } + rows = y; cols = x; + if (y>0 && x>0) { + len = rows * cols; + if (len!=0) { + data = new VTYPE[len]; + #ifdef DEBUG_MATRIX + if (data==NULL) Debug.Print (DEBUG_MATRIX, "MatrixF::Size: Out of memory for construction.\n"); + #endif + } + } + + #ifdef MATRIX_INITIALIZE + if (data!=NULL) memset (data, 0, sizeof(VTYPE)*len); + #endif + return *this; +} +inline MatrixF &MatrixF::ResizeSafe (const int x, const int y) +{ + VTYPE *newdata; + int newlen; + VTYPE *n, *ne; + VTYPE *b, *be; + int bskip; + + if (data!=NULL) { + newlen = x*y; + newdata = new VTYPE[newlen]; + #ifdef DEBUG_MATRIX + if (newdata==NULL) + Debug.Print (DEBUG_MATRIX, "MatrixF::SizeSafe: Out of memory for construction.\n"); + #endif + if (y>=rows && x>=cols) { // New size is larger (in both r and c) + memset (newdata, 0, newlen*sizeof(VTYPE)); // Clear new matrix + ne = data + len; // Calculate end of current matrix + b = newdata; // Start of new matrix + be = newdata + cols; // Last filled column+1 in new matrix + bskip = x-cols; + for (n = data; n0) { + n = data; // Copy columns to left of c + ne = data + len; + nskip = (cols-c); + b = newdata; + be = newdata + c; + bskip = (cols-c)+1; + for (; n>counter-clockwise<< when looking down the X+ axis toward the origin +inline MatrixF &MatrixF::RotateX (const double ang) +{ + Resize (4,4); + VTYPE *n = data; + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + *n = 1; n += 5; + *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; + *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; + *n = 1; + return *this; +} + +// rotates points >>counter-clockwise<< when looking down the Y+ axis toward the origin +inline MatrixF &MatrixF::RotateY (const double ang) +{ + Resize (4,4); + VTYPE *n = data; + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + *n = (VTYPE) c; n+=2; + *n = (VTYPE) -s; n+=3; + *n = 1; n+=3; + *n = (VTYPE) s; n+=2; + *n = (VTYPE) c; n+=5; + *n = 1; + return *this; +} + +// rotates points >>counter-clockwise<< when looking down the Z+ axis toward the origin +inline MatrixF &MatrixF::RotateZ (const double ang) +{ + Resize (4,4); + VTYPE *n = data; + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + *n++ = (VTYPE) c; *n = (VTYPE) s; n+=3; + *n++ = (VTYPE) -s; *n = (VTYPE) c; n+=5; + *n = 1; n+=5; *n = 1; + return *this; +} +inline MatrixF &MatrixF::Ortho (double sx, double sy, double vn, double vf) +{ + // simplified version of OpenGL's glOrtho function + VTYPE *n = data; + *n++ = (VTYPE) (1.0/sx); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (1.0/sy); *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) (-2.0/(vf-vn)); *n++ = (VTYPE) (-(vf+vn)/(vf-vn)); + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 1.0; +} + +inline MatrixF &MatrixF::Translate (double tx, double ty, double tz) +{ + Resize (4,4); + VTYPE *n = data; + *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 0.0; *n++ = (VTYPE) 1.0; *n++ = (VTYPE) 0.0; + *n++ = (VTYPE) tx; *n++ = (VTYPE) ty; *n++ = (VTYPE) tz; *n++ = (VTYPE) 1.0; + return *this; +} + +inline MatrixF &MatrixF::Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3) +{ + Resize (4,4); + VTYPE *n = data; + *n++ = (VTYPE) c1.X(); *n++ = (VTYPE) c2.X(); *n++ = (VTYPE) c3.X(); *n++ = (VTYPE) 0; + *n++ = (VTYPE) c1.Y(); *n++ = (VTYPE) c2.Y(); *n++ = (VTYPE) c3.Y(); *n++ = (VTYPE) 0; + *n++ = (VTYPE) c1.Z(); *n++ = (VTYPE) c2.Z(); *n++ = (VTYPE) c3.Z(); *n++ = (VTYPE) 0; + *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; *n++ = (VTYPE) 0; + return *this; +} + +#define SWAP(a, b) {temp=(a); (a)=(b); (b)=temp;} + +inline MatrixF &MatrixF::GaussJordan (MatrixF &b) +{ + // Gauss-Jordan solves the matrix equation Ax = b + // Given the problem: + // A*x = b (where A is 'this' matrix and b is provided) + // The solution is: + // Ainv*b = x + // This function returns Ainv in A and x in b... that is: + // A (this) -> Ainv + // b -> solution x + // + + MatrixI index_col, index_row; + MatrixI piv_flag; + int r, c, c2, rs, cs; + double piv_val; + int piv_row, piv_col; + double pivinv, dummy, temp; + + #ifdef DEBUG_MATRIX + if (rows!=cols) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows and cols of A must be equal.\n"); + if (rows!=b.rows) Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Number of rows of A and rows of b must be equal.\n"); + if (b.cols!=1) Debug.Print ( DEBUG_MATRIX, "MatrixF::GaussJordan: Number of cols of b must be 1.\n"); + #endif + + index_col.Resize (cols, 1); + index_row.Resize (cols, 1); + piv_flag.Resize (cols, 1); + piv_flag = 0; + for (c = 0; c < cols; c++) { + piv_val = 0.0; + for (rs = 0; rs < rows; rs++) { + if (piv_flag(rs, 0) != 1 ) + for (cs = 0; cs < cols; cs++) { + if (piv_flag(cs, 0) == 0) { + if (fabs((*this) (cs, rs)) >= piv_val) { + piv_val = fabs((*this) (cs, rs)); + piv_row = rs; + piv_col = cs; + } + } else if (piv_flag(cs, 0)>1) { + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (dbl pivs).\n"); + //Print (); + #endif + } + } + } + piv_flag(piv_col, 0)++; + if (piv_row != piv_col) { + for (c2 = 0; c2 < cols; c2++) SWAP ((*this) (c2, piv_row), (*this) (c2, piv_col)); + for (c2 = 0; c2 < b.cols; c2++) SWAP (b(c2, piv_row), b(c2, piv_col)); + } + index_row (c, 0) = piv_row; + index_col (c, 0) = piv_col; + if ((*this) (piv_col, piv_col) == 0.0) { + #ifdef DEBUG_MATRIX + Debug.Print (DEBUG_MATRIX, "MatrixF::GaussJordan: Singular matrix (0 piv).\n"); + //Print (); + #endif + } + pivinv = 1.0 / ((*this) (piv_col, piv_col)); + (*this) (piv_col, piv_col) = 1.0; + for (c2 = 0; c2 < cols; c2++) (*this) (c2, piv_col) *= pivinv; + for (c2 = 0; c2 < b.cols; c2++) b(c2, piv_col) *= pivinv; + for (r = 0; r < rows; r++) { + if (r != piv_col) { + dummy = (*this) (piv_col, r); + (*this) (piv_col, r) = 0.0; + for (c2 = 0; c2 < cols; c2++) (*this) (c2, r) -= (*this) (c2, piv_col)*dummy; + for (c2 = 0; c2 < b.cols; c2++) b(c2, r) -= b(c2, piv_col)*dummy; + } + } + } + for (c = cols-1; c >= 0; c--) { + if (index_row(c, 0) != index_col(c, 0)) + for (r = 0; r < rows; r++) + SWAP ((*this) (index_row(c,0), r), (*this) (index_col(c,0), r) ); + } + return *this; +} +inline MatrixF &MatrixF::Submatrix ( MatrixF& b, int mx, int my) +{ + VTYPE* pEnd = data + rows*cols; // end of matrix + VTYPE* pVal = data; + VTYPE* pNewVal = b.data; + VTYPE* pNewEnd = pNewVal + mx; + int pNewSkip = cols - mx; + + for (pVal = data; pVal < pEnd;) { + for (; pNewVal < pNewEnd;) *pVal++ = *pNewVal++; + pNewVal += pNewSkip; + pNewEnd += mx; + } + return *this; +} + +// N-Vector Dot Product +// Elements may be in rows or columns, but: +// - If in rows, number of columns must be one and number of rows must match. +// - If in cols, number of rows must be one and number of cols must match. +inline double MatrixF::Dot ( MatrixF& b ) +{ + double d = 0.0; + VTYPE* pA = data; + VTYPE* pB = b.data; + + if ( rows==1 && b.rows==1 && cols == b.cols ) { + VTYPE* pAEnd = data + cols; + d = 0.0; + for (; pA < pAEnd;) + d += (*pA++) * (*pB++); + } else if ( cols==1 && b.cols==1 && rows == b.rows) { + VTYPE* pAEnd = data + rows; + d = 0.0; + for (; pA < pAEnd;) + d += (*pA++) * (*pB++); + } + return d; +} + +#define I(x, y) ( (y*xres) + x ) +#define Ix(r) ( r % xres ) // X coordinate from row +#define Iy(r) ( r / xres ) // Y coordinate from row + +inline MatrixF &MatrixF::MatrixVector5 (MatrixF& x, int mrows, MatrixF& b) +{ + double v; + + // A( 2, r ) * B ( r ) + A(1,r)*B(r-1) + A(3,r)*B(r+1) + A(0, r)*B( R-( r ) ) + A(4, r)*B( R+( r ) ) + for (int r = 0; r < mrows; r++) { + v = GetVal(2, r) * x(0,r); + if ( r > 0 ) v += GetVal(1,r) * x(0,r-1); + if ( r < mrows-1) v += GetVal(3,r) * x(0,r+1); + if ( (int) GetVal(5, r) >= 0) v += GetVal(0,r) * x(0, (int) GetVal(5,r)); + if ( (int) GetVal(6, r) >= 0) v += GetVal(4,r) * x(0, (int) GetVal(6,r)); + b(0,r) = v; + } + return *this; +} + +inline MatrixF &MatrixF::ConjugateGradient (MatrixF &b) +{ + return *this; +} + +// Sparse Conjugate Gradient 2D (special case) +// This compute conjugate gradients on a +// sparse "5-7" x N positive definite matrix. +// Only 'mrows' subset of the row-size of A and b will be used. +inline MatrixF &MatrixF::ConjugateGradient5 (MatrixF &b, int mrows ) +{ + double a, g, rdot; + int i, imax; + MatrixF x, xnew; // solution vector + MatrixF r, rnew; // residual + MatrixF p, ptemp; // search direction + MatrixF v; + + x.Resize ( 1, mrows ); + xnew.Resize ( 1, mrows ); + r.Resize ( 1, mrows ); + rnew.Resize ( 1, mrows ); + p.Resize ( 1, mrows ); + ptemp.Resize ( 1, mrows ); + v.Resize ( 1, mrows ); + + r.Submatrix ( b, 1, mrows); + MatrixVector5 ( x, mrows, v ); // (Ax -> v) + r -= v; // r = b - Ax + p = r; + + imax = 20; + for (i=0; i < imax; i++) { + MatrixVector5 ( p, mrows, v ); // v = Ap + rdot = r.Dot ( r ); + a = rdot / p.Dot ( v ); // a = (r . r) / (p . v) + xnew = p; + xnew *= a; + xnew += x; // x = x + p*a + v *= a; + rnew = r; // rnew = r - v*a + rnew -= v; + g = rnew.Dot ( rnew ) / rdot; // g = (rnew . rnew) / (r . r) + p *= g; + p += rnew; // p = rnew + p*g + r = rnew; + x = xnew; + } + for (int rx=0; rx < mrows; rx++) + b(0, rx) = x(0, rx); + return *this; +} + +inline int MatrixF::GetX() {return cols;} +inline int MatrixF::GetY() {return rows;} +inline int MatrixF::GetRows(void) {return rows;} +inline int MatrixF::GetCols(void) {return cols;} +inline int MatrixF::GetLength(void) {return len;} +inline VTYPE *MatrixF::GetData(void) {return data;} + +inline double MatrixF::GetF (const int r, const int c) {return (double) (*(data + r*cols + c));} + +inline void MatrixF::GetRowVec (int r, Vector3DF &v) +{ + VTYPE *n = data + r*cols; + v.x = (float) *n++; v.y = (float) *n++; v.z= (float) *n++; +} + +inline void MatrixF::Print ( char* fname ) +{ + char buf[2000]; + + FILE* fp = fopen ( fname, "w+" ); + + for (int r=0; r < rows; r++) { + buf[0] = '\0'; + for (int c =0; c < cols; c++) { + sprintf ( buf, "%s %04.3f", buf, GetVal(c, r) ); + } + fprintf ( fp, "%s\n", buf); + } + fprintf ( fp, "---------------------------------------\n", buf); + fflush ( fp ); + fclose ( fp ); +} + + +// MatrixF Code Definition +#undef VTYPE +#define VNAME F +#define VTYPE float + +// Constructors/Destructors + +inline Matrix4F::Matrix4F (void) { for (int n=0; n < 16; n++) data[n] = 0.0; } + +inline Matrix4F &Matrix4F::operator= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] = (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator= (const int op) {for ( int n=0; n<16; n++) data[n] = (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator= (const double op) {for ( int n=0; n<16; n++) data[n] = (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator+= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] += (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator+= (const int op) {for ( int n=0; n<16; n++) data[n] += (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator+= (const double op) {for ( int n=0; n<16; n++) data[n] += (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator-= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] -= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator-= (const int op) {for ( int n=0; n<16; n++) data[n] -= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator-= (const double op) {for ( int n=0; n<16; n++) data[n] -= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator*= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] *= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator*= (const int op) {for ( int n=0; n<16; n++) data[n] *= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator*= (const double op) {for ( int n=0; n<16; n++) data[n] *= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator/= (const unsigned char op) {for ( int n=0; n<16; n++) data[n] /= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator/= (const int op) {for ( int n=0; n<16; n++) data[n] /= (VTYPE) op; return *this;} +inline Matrix4F &Matrix4F::operator/= (const double op) {for ( int n=0; n<16; n++) data[n] /= (VTYPE) op; return *this;} + +inline Matrix4F &Matrix4F::Multiply (const Matrix4F &op) { + register float orig[16]; // Temporary storage + memcpy ( orig, data, 16*sizeof(float) ); + + // Calculate First Row + data[0] = orig[0]*op.data[0] + orig[1]*op.data[4] + orig[2]*op.data[8] + orig[3]*op.data[12]; + data[1] = orig[0]*op.data[1] + orig[1]*op.data[5] + orig[2]*op.data[9] + orig[3]*op.data[13]; + data[2] = orig[0]*op.data[2] + orig[1]*op.data[6] + orig[2]*op.data[10] + orig[3]*op.data[14]; + data[3] = orig[0]*op.data[3] + orig[1]*op.data[7] + orig[2]*op.data[11] + orig[3]*op.data[15]; + + // Calculate Second Row + data[4] = orig[4]*op.data[0] + orig[5]*op.data[4] + orig[6]*op.data[8] + orig[7]*op.data[12]; + data[5] = orig[4]*op.data[1] + orig[5]*op.data[5] + orig[6]*op.data[9] + orig[7]*op.data[13]; + data[6] = orig[4]*op.data[2] + orig[5]*op.data[6] + orig[6]*op.data[10] + orig[7]*op.data[14]; + data[7] = orig[4]*op.data[3] + orig[5]*op.data[7] + orig[6]*op.data[11] + orig[7]*op.data[15]; + + // Calculate Third Row + data[8] = orig[8]*op.data[0] + orig[9]*op.data[4] + orig[10]*op.data[8] + orig[11]*op.data[12]; + data[9] = orig[8]*op.data[1] + orig[9]*op.data[5] + orig[10]*op.data[9] + orig[11]*op.data[13]; + data[10] = orig[8]*op.data[2] + orig[9]*op.data[6] + orig[10]*op.data[10] + orig[11]*op.data[14]; + data[11] = orig[8]*op.data[3] + orig[9]*op.data[7] + orig[10]*op.data[11] + orig[11]*op.data[15]; + + // Calculate Four Row + data[12] = orig[12]*op.data[0] + orig[13]*op.data[4] + orig[14]*op.data[8] + orig[15]*op.data[12]; + data[13] = orig[12]*op.data[1] + orig[13]*op.data[5] + orig[14]*op.data[9] + orig[15]*op.data[13]; + data[14] = orig[12]*op.data[2] + orig[13]*op.data[6] + orig[14]*op.data[10] + orig[15]*op.data[14]; + data[15] = orig[12]*op.data[3] + orig[13]*op.data[7] + orig[14]*op.data[11] + orig[15]*op.data[15]; + + return *this; +} + +inline Matrix4F &Matrix4F::Transpose (void) +{ + register float orig[16]; // Temporary storage + memcpy ( orig, data, 16*sizeof(VTYPE) ); + + data[0] = orig[0]; data[1] = orig[4]; data[2] = orig[8]; data[3] = orig[12]; + data[4] = orig[1]; data[5] = orig[5]; data[6] = orig[9]; data[7] = orig[13]; + data[8] = orig[2]; data[9] = orig[6]; data[10] = orig[10];data[11] = orig[14]; + data[12] = orig[3]; data[13] = orig[7]; data[14] = orig[11];data[15] = orig[15]; + return *this; +} + +inline Matrix4F &Matrix4F::Identity (const int order) +{ + memset (data, 0, 16*sizeof(VTYPE)); + data[0] = 1.0; + data[5] = 1.0; + data[10] = 1.0; + data[15] = 1.0; + return *this; +} + +inline Matrix4F &Matrix4F::RotateX (const double ang) +{ + memset (data, 0, 16*sizeof(VTYPE)); + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + data[0] = 1; + data[5] = (VTYPE) c; data[6] = (VTYPE) s; + data[9] = (VTYPE) -s; data[10] = (VTYPE) c; + data[15] = 1; + return *this; +} + +// rotates points >>counter-clockwise<< when looking down the Y+ axis toward the origin +inline Matrix4F &Matrix4F::RotateY (const double ang) +{ + memset (data, 0, 16*sizeof(VTYPE)); + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + data[0] = (VTYPE) c; + data[2] = (VTYPE) -s; + data[5] = 1; + data[8] = (VTYPE) s; + data[10] = (VTYPE) c; + data[15] = 1; + return *this; +} + +// rotates points >>counter-clockwise<< when looking down the Z+ axis toward the origin +inline Matrix4F &Matrix4F::RotateZ (const double ang) +{ + memset (data, 0, 16*sizeof(VTYPE)); + double c,s; + c = cos(ang * 3.141592/180); + s = sin(ang * 3.141592/180); + data[0] = (VTYPE) c; data[1] = (VTYPE) s; + data[4] = (VTYPE) -s; data[5] = (VTYPE) c; + data[10] = 1; + data[15] = 1; + return *this; +} +inline Matrix4F &Matrix4F::Ortho (double sx, double sy, double vn, double vf) +{ + // simplified version of OpenGL's glOrtho function + data[ 0] = (VTYPE) (1.0/sx);data[ 1] = (VTYPE) 0.0; data[ 2] = (VTYPE) 0.0; data[ 3]= (VTYPE) 0.0; + data[ 4] = (VTYPE) 0.0; data[ 5] = (VTYPE) (1.0/sy);data[ 6] = (VTYPE) 0.0; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) 0.0; data[ 9] = (VTYPE) 0.0; data[10]= (VTYPE) (-2.0/(vf-vn)); data[11] = (VTYPE) (-(vf+vn)/(vf-vn)); + data[12] = (VTYPE) 0.0; data[13] = (VTYPE) 0.0; data[14] = (VTYPE) 0; data[15] = (VTYPE) 1.0; +} + +inline Matrix4F &Matrix4F::Translate (double tx, double ty, double tz) +{ + data[ 0] = (VTYPE) 1.0; data[ 1] = (VTYPE) 0.0; data[ 2] = (VTYPE) 0.0; data[ 3] = (VTYPE) 0.0; + data[ 4] = (VTYPE) 0.0; data[ 5] = (VTYPE) 1.0; data[ 6] = (VTYPE) 0.0; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) 0.0; data[ 9] = (VTYPE) 0.0; data[10] = (VTYPE) 1.0; data[11] = (VTYPE) 0.0; + data[12] = (VTYPE) tx; data[13] = (VTYPE) ty; data[14] = (VTYPE) tz; data[15] = (VTYPE) 1.0; + return *this; +} + +inline Matrix4F &Matrix4F::Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3) +{ + data[ 0] = (VTYPE) c1.x; data[ 1] = (VTYPE) c2.x; data[ 2] = (VTYPE) c3.x; data[ 3] = (VTYPE) 0.0; + data[ 4] = (VTYPE) c1.y; data[ 5] = (VTYPE) c2.y; data[ 6] = (VTYPE) c3.y; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) c1.z; data[ 9] = (VTYPE) c2.z; data[10] = (VTYPE) c3.z; data[11] = (VTYPE) 0.0; + data[12] = (VTYPE) 0.0; data[13] = (VTYPE) 0.0; data[14] = (VTYPE) 0.0; data[15] = (VTYPE) 1.0; + return *this; +} + +inline Matrix4F &Matrix4F::SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s) +{ + data[ 0] = (VTYPE) c1.x*s.x; data[ 1] = (VTYPE) c2.x*s.x; data[ 2] = (VTYPE) c3.x*s.x; data[ 3] = (VTYPE) 0.0; + data[ 4] = (VTYPE) c1.y*s.y; data[ 5] = (VTYPE) c2.y*s.y; data[ 6] = (VTYPE) c3.y*s.y; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) c1.z*s.z; data[ 9] = (VTYPE) c2.z*s.z; data[10] = (VTYPE) c3.z*s.z; data[11] = (VTYPE) 0.0; + data[12] = (VTYPE) t.x; data[13] = (VTYPE) t.y; data[14] = (VTYPE) t.z; data[15] = (VTYPE) 1.0; +} +inline Matrix4F &Matrix4F::SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s) +{ + data[ 0] = (VTYPE) c1.x*s; data[ 1] = (VTYPE) c1.y*s; data[ 2] = (VTYPE) c1.z*s; data[ 3] = (VTYPE) 0.0; + data[ 4] = (VTYPE) c2.x*s; data[ 5] = (VTYPE) c2.y*s; data[ 6] = (VTYPE) c2.z*s; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) c3.x*s; data[ 9] = (VTYPE) c3.y*s; data[10] = (VTYPE) c3.z*s; data[11] = (VTYPE) 0.0; + data[12] = (VTYPE) t.x; data[13] = (VTYPE) t.y; data[14] = (VTYPE) t.z; data[15] = (VTYPE) 1.0; + return *this; +} + +inline Matrix4F &Matrix4F::InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s) +{ + data[ 0] = (VTYPE) c1.x/s.x; data[ 1] = (VTYPE) c1.y/s.y; data[ 2] = (VTYPE) c1.z/s.z; data[ 3] = (VTYPE) 0.0; + data[ 4] = (VTYPE) c2.x/s.x; data[ 5] = (VTYPE) c2.y/s.y; data[ 6] = (VTYPE) c2.z/s.z; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) c3.x/s.x; data[ 9] = (VTYPE) c3.y/s.y; data[10] = (VTYPE) c3.z/s.z; data[11] = (VTYPE) 0.0; + data[12] = (VTYPE) -t.x/s.x; data[13] = (VTYPE) -t.y/s.y; data[14] = (VTYPE) -t.z/s.z; data[15] = (VTYPE) 1.0; +} +inline Matrix4F &Matrix4F::InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s) +{ + data[ 0] = (VTYPE) c1.x/s; data[ 1] = (VTYPE) c1.y/s; data[ 2] = (VTYPE) c1.z/s; data[ 3] = (VTYPE) 0.0; + data[ 4] = (VTYPE) c2.x/s; data[ 5] = (VTYPE) c2.y/s; data[ 6] = (VTYPE) c2.z/s; data[ 7] = (VTYPE) 0.0; + data[ 8] = (VTYPE) c3.x/s; data[ 9] = (VTYPE) c3.y/s; data[10] = (VTYPE) c3.z/s; data[11] = (VTYPE) 0.0; + data[12] = (VTYPE) -t.x/s; data[13] = (VTYPE) -t.y/s; data[14] = (VTYPE) -t.z/s; data[15] = (VTYPE) 1.0; +} + +inline float Matrix4F::GetF (const int r, const int c) {return (float) data[ (r<<2) + c];} + +inline void Matrix4F::GetRowVec (int r, Vector3DF &v) +{ + v.x = data[ (r<<2) ]; + v.y = data[ (r<<2)+1 ]; + v.z = data[ (r<<2)+2 ]; +} + +#undef VTYPE +#undef VNAME + diff --git a/Extras/sph/common/matrix.cpp b/Extras/sph/common/matrix.cpp index 75d4ca524..35d56aa6d 100644 --- a/Extras/sph/common/matrix.cpp +++ b/Extras/sph/common/matrix.cpp @@ -1,23 +1,23 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "matrix.h" - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "matrix.h" + diff --git a/Extras/sph/common/matrix.h b/Extras/sph/common/matrix.h index 20ab97fdf..956bfe44c 100644 --- a/Extras/sph/common/matrix.h +++ b/Extras/sph/common/matrix.h @@ -1,429 +1,429 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 -#include -#include -#include - -//*********** NOTE -// -// LOOK AT MovieTrackPoint. IN ORDER FOR VECTORS AND MATRICIES TO BE USED IN OBJECTS -// THAT WILL BE USED IN stl::vectors, THEIR CONSTRUCTORS AND OPERATORS MUST TAKE ONLY -// const PARAMETERS. LOOK AT MatrixF and Vector2DF.. THIS WAS NOT YET DONE WITH -// THE OTHER MATRIX AND VECTOR CLASSES (Vector2DC, Vector2DI, MatrixC, MatrixI, ...) -// - - -#ifndef MATRIX_DEF - #define MATRIX_DEF - - #include "vector.h" - #include "mdebug.h" - - //#define MATRIX_INITIALIZE // Initializes vectors - - class MatrixC; // Forward Referencing - class MatrixI; - class MatrixF; - - class Matrix { - public: - // Member Virtual Functions - virtual Matrix &operator= (unsigned char c)=0; - virtual Matrix &operator= (int c)=0; - virtual Matrix &operator= (double c)=0; - virtual Matrix &operator= (MatrixC &op)=0; - virtual Matrix &operator= (MatrixI &op)=0; - virtual Matrix &operator= (MatrixF &op)=0; - - virtual Matrix &operator+= (unsigned char c)=0; - virtual Matrix &operator+= (int c)=0; - virtual Matrix &operator+= (double c)=0; - virtual Matrix &operator+= (MatrixC &op)=0; - virtual Matrix &operator+= (MatrixI &op)=0; - virtual Matrix &operator+= (MatrixF &op)=0; - - virtual Matrix &operator-= (unsigned char c)=0; - virtual Matrix &operator-= (int c)=0; - virtual Matrix &operator-= (double c)=0; - virtual Matrix &operator-= (MatrixC &op)=0; - virtual Matrix &operator-= (MatrixI &op)=0; - virtual Matrix &operator-= (MatrixF &op)=0; - - virtual Matrix &operator*= (unsigned char c)=0; - virtual Matrix &operator*= (int c)=0; - virtual Matrix &operator*= (double c)=0; - virtual Matrix &operator*= (MatrixC &op)=0; - virtual Matrix &operator*= (MatrixI &op)=0; - virtual Matrix &operator*= (MatrixF &op)=0; - - virtual Matrix &operator/= (unsigned char c)=0; - virtual Matrix &operator/= (int c)=0; - virtual Matrix &operator/= (double c)=0; - virtual Matrix &operator/= (MatrixC &op)=0; - virtual Matrix &operator/= (MatrixI &op)=0; - virtual Matrix &operator/= (MatrixF &op)=0; - - virtual Matrix &Multiply (MatrixF &op)=0; - virtual Matrix &Resize (int x, int y)=0; - virtual Matrix &ResizeSafe (int x, int y)=0; - virtual Matrix &InsertRow (int r)=0; - virtual Matrix &InsertCol (int c)=0; - virtual Matrix &Transpose (void)=0; - virtual Matrix &Identity (int order)=0; - /*inline Matrix &RotateX (double ang); - inline Matrix &RotateY (double ang); - inline Matrix &RotateZ (double ang); */ - virtual Matrix &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3)=0; - virtual Matrix &GaussJordan (MatrixF &b) { return *this; } - virtual Matrix &ConjugateGradient (MatrixF &b) { return *this; } - - virtual int GetRows(void)=0; - virtual int GetCols(void)=0; - virtual int GetLength(void)=0; - - virtual unsigned char *GetDataC (void)=0; - virtual int *GetDataI (void)=0; - virtual double *GetDataF (void)=0; - - virtual double GetF (int r, int c); - }; - - // MatrixC Declaration - #define VNAME C - #define VTYPE unsigned char - - class MatrixC { - public: - VTYPE *data; - int rows, cols, len; - - // Constructors/Destructors - inline MatrixC (); - inline ~MatrixC (); - inline MatrixC (int r, int c); - - // Member Functions - inline VTYPE &operator () (int c, int r); - inline MatrixC &operator= (unsigned char c); - inline MatrixC &operator= (int c); - inline MatrixC &operator= (double c); - inline MatrixC &operator= (MatrixC &op); - inline MatrixC &operator= (MatrixI &op); - inline MatrixC &operator= (MatrixF &op); - - inline MatrixC &operator+= (unsigned char c); - inline MatrixC &operator+= (int c); - inline MatrixC &operator+= (double c); - inline MatrixC &operator+= (MatrixC &op); - inline MatrixC &operator+= (MatrixI &op); - inline MatrixC &operator+= (MatrixF &op); - - inline MatrixC &operator-= (unsigned char c); - inline MatrixC &operator-= (int c); - inline MatrixC &operator-= (double c); - inline MatrixC &operator-= (MatrixC &op); - inline MatrixC &operator-= (MatrixI &op); - inline MatrixC &operator-= (MatrixF &op); - - inline MatrixC &operator*= (unsigned char c); - inline MatrixC &operator*= (int c); - inline MatrixC &operator*= (double c); - inline MatrixC &operator*= (MatrixC &op); - inline MatrixC &operator*= (MatrixI &op); - inline MatrixC &operator*= (MatrixF &op); - - inline MatrixC &operator/= (unsigned char c); - inline MatrixC &operator/= (int c); - inline MatrixC &operator/= (double c); - inline MatrixC &operator/= (MatrixC &op); - inline MatrixC &operator/= (MatrixI &op); - inline MatrixC &operator/= (MatrixF &op); - - inline MatrixC &Multiply (MatrixF &op); - inline MatrixC &Resize (int x, int y); - inline MatrixC &ResizeSafe (int x, int y); - inline MatrixC &InsertRow (int r); - inline MatrixC &InsertCol (int c); - inline MatrixC &Transpose (void); - inline MatrixC &Identity (int order); - inline MatrixC &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3); - inline MatrixC &GaussJordan (MatrixF &b); - - inline int GetX(); - inline int GetY(); - inline int GetRows(void); - inline int GetCols(void); - inline int GetLength(void); - inline VTYPE *GetData(void); - - inline unsigned char *GetDataC (void) {return data;} - inline int *GetDataI (void) {return NULL;} - inline double *GetDataF (void) {return NULL;} - - inline double GetF (int r, int c); - }; - #undef VNAME - #undef VTYPE - - // MatrixI Declaration - #define VNAME I - #define VTYPE int - - class MatrixI { - public: - VTYPE *data; - int rows, cols, len; - - // Constructors/Destructors - inline MatrixI (); - inline ~MatrixI (); - inline MatrixI (int r, int c); - - // Member Functions - inline VTYPE &operator () (int c, int r); - inline MatrixI &operator= (unsigned char c); - inline MatrixI &operator= (int c); - inline MatrixI &operator= (double c); - inline MatrixI &operator= (MatrixC &op); - inline MatrixI &operator= (MatrixI &op); - inline MatrixI &operator= (MatrixF &op); - - inline MatrixI &operator+= (unsigned char c); - inline MatrixI &operator+= (int c); - inline MatrixI &operator+= (double c); - inline MatrixI &operator+= (MatrixC &op); - inline MatrixI &operator+= (MatrixI &op); - inline MatrixI &operator+= (MatrixF &op); - - inline MatrixI &operator-= (unsigned char c); - inline MatrixI &operator-= (int c); - inline MatrixI &operator-= (double c); - inline MatrixI &operator-= (MatrixC &op); - inline MatrixI &operator-= (MatrixI &op); - inline MatrixI &operator-= (MatrixF &op); - - inline MatrixI &operator*= (unsigned char c); - inline MatrixI &operator*= (int c); - inline MatrixI &operator*= (double c); - inline MatrixI &operator*= (MatrixC &op); - inline MatrixI &operator*= (MatrixI &op); - inline MatrixI &operator*= (MatrixF &op); - - inline MatrixI &operator/= (unsigned char c); - inline MatrixI &operator/= (int c); - inline MatrixI &operator/= (double c); - inline MatrixI &operator/= (MatrixC &op); - inline MatrixI &operator/= (MatrixI &op); - inline MatrixI &operator/= (MatrixF &op); - - inline MatrixI &Multiply (MatrixF &op); - inline MatrixI &Resize (int x, int y); - inline MatrixI &ResizeSafe (int x, int y); - inline MatrixI &InsertRow (int r); - inline MatrixI &InsertCol (int c); - inline MatrixI &Transpose (void); - inline MatrixI &Identity (int order); - inline MatrixI &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3); - inline MatrixI &GaussJordan (MatrixF &b); - - inline int GetX(); - inline int GetY(); - inline int GetRows(void); - inline int GetCols(void); - inline int GetLength(void); - inline VTYPE *GetData(void); - - inline unsigned char *GetDataC (void) {return NULL;} - inline int *GetDataI (void) {return data;} - inline double *GetDataF (void) {return NULL;} - - inline double GetF (int r, int c); - }; - #undef VNAME - #undef VTYPE - - // MatrixF Declaration - #define VNAME F - #define VTYPE double - - class MatrixF { - public: - VTYPE *data; - int rows, cols, len; - - // Constructors/Destructors - inline MatrixF (); - inline ~MatrixF (); - inline MatrixF (const int r, const int c); - - // Member Functions - inline VTYPE GetVal ( int c, int r ); - inline VTYPE &operator () (const int c, const int r); - inline MatrixF &operator= (const unsigned char c); - inline MatrixF &operator= (const int c); - inline MatrixF &operator= (const double c); - inline MatrixF &operator= (const MatrixC &op); - inline MatrixF &operator= (const MatrixI &op); - inline MatrixF &operator= (const MatrixF &op); - - inline MatrixF &operator+= (const unsigned char c); - inline MatrixF &operator+= (const int c); - inline MatrixF &operator+= (const double c); - inline MatrixF &operator+= (const MatrixC &op); - inline MatrixF &operator+= (const MatrixI &op); - inline MatrixF &operator+= (const MatrixF &op); - - inline MatrixF &operator-= (const unsigned char c); - inline MatrixF &operator-= (const int c); - inline MatrixF &operator-= (const double c); - inline MatrixF &operator-= (const MatrixC &op); - inline MatrixF &operator-= (const MatrixI &op); - inline MatrixF &operator-= (const MatrixF &op); - - inline MatrixF &operator*= (const unsigned char c); - inline MatrixF &operator*= (const int c); - inline MatrixF &operator*= (const double c); - inline MatrixF &operator*= (const MatrixC &op); - inline MatrixF &operator*= (const MatrixI &op); - inline MatrixF &operator*= (const MatrixF &op); - - inline MatrixF &operator/= (const unsigned char c); - inline MatrixF &operator/= (const int c); - inline MatrixF &operator/= (const double c); - inline MatrixF &operator/= (const MatrixC &op); - inline MatrixF &operator/= (const MatrixI &op); - inline MatrixF &operator/= (const MatrixF &op); - - inline MatrixF &Multiply4x4 (const MatrixF &op); - inline MatrixF &Multiply (const MatrixF &op); - inline MatrixF &Resize (const int x, const int y); - inline MatrixF &ResizeSafe (const int x, const int y); - inline MatrixF &InsertRow (const int r); - inline MatrixF &InsertCol (const int c); - inline MatrixF &Transpose (void); - inline MatrixF &Identity (const int order); - inline MatrixF &RotateX (const double ang); - inline MatrixF &RotateY (const double ang); - inline MatrixF &RotateZ (const double ang); - inline MatrixF &Ortho (double sx, double sy, double n, double f); - inline MatrixF &Translate (double tx, double ty, double tz); - inline MatrixF &Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3); - inline MatrixF &GaussJordan (MatrixF &b); - inline MatrixF &ConjugateGradient (MatrixF &b); - inline MatrixF &Submatrix ( MatrixF& b, int mx, int my); - inline MatrixF &MatrixVector5 (MatrixF& x, int mrows, MatrixF& b ); - inline MatrixF &ConjugateGradient5 (MatrixF &b, int mrows ); - inline double Dot ( MatrixF& b ); - - inline void Print ( char* fname ); - - inline int GetX(); - inline int GetY(); - inline int GetRows(void); - inline int GetCols(void); - inline int GetLength(void); - inline VTYPE *GetData(void); - inline void GetRowVec (int r, Vector3DF &v); - - inline unsigned char *GetDataC (void) const {return NULL;} - inline int *GetDataI (void) const {return NULL;} - inline double *GetDataF (void) const {return data;} - - inline double GetF (const int r, const int c); - }; - #undef VNAME - #undef VTYPE - - // MatrixF Declaration - #define VNAME F - #define VTYPE float - - class Matrix4F { - public: - VTYPE data[16]; - - // Constructors/Destructors - inline Matrix4F (); - - // Member Functions - inline VTYPE &operator () (const int n) { return data[n]; } - inline VTYPE &operator () (const int c, const int r) { return data[ (r<<2)+c ]; } - inline Matrix4F &operator= (const unsigned char c); - inline Matrix4F &operator= (const int c); - inline Matrix4F &operator= (const double c); - inline Matrix4F &operator+= (const unsigned char c); - inline Matrix4F &operator+= (const int c); - inline Matrix4F &operator+= (const double c); - inline Matrix4F &operator-= (const unsigned char c); - inline Matrix4F &operator-= (const int c); - inline Matrix4F &operator-= (const double c); - inline Matrix4F &operator*= (const unsigned char c); - inline Matrix4F &operator*= (const int c); - inline Matrix4F &operator*= (const double c); - inline Matrix4F &operator/= (const unsigned char c); - inline Matrix4F &operator/= (const int c); - inline Matrix4F &operator/= (const double c); - - inline Matrix4F &Multiply (const Matrix4F &op); - inline Matrix4F &Transpose (void); - inline Matrix4F &Identity (const int order); - inline Matrix4F &RotateX (const double ang); - inline Matrix4F &RotateY (const double ang); - inline Matrix4F &RotateZ (const double ang); - inline Matrix4F &Ortho (double sx, double sy, double n, double f); - inline Matrix4F &Translate (double tx, double ty, double tz); - inline Matrix4F &Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3); - - // Scale-Rotate-Translate (compound matrix) - inline Matrix4F &SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s); - inline Matrix4F &SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s); - - // invTranslate-invRotate-invScale (compound matrix) - inline Matrix4F &InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s); - inline Matrix4F &InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s); - - inline int GetX() { return 4; } - inline int GetY() { return 4; } - inline int GetRows(void) { return 4; } - inline int GetCols(void) { return 4; } - inline int GetLength(void) { return 16; } - inline VTYPE *GetData(void) { return data; } - inline void GetRowVec (int r, Vector3DF &v); - - inline unsigned char *GetDataC (void) const {return NULL;} - inline int *GetDataI (void) const {return NULL;} - inline float *GetDataF (void) const {return (float*) data;} - - inline float GetF (const int r, const int c); - }; - #undef VNAME - #undef VTYPE - - - // Matrix Code Definitions (Inlined) - - #include "matrix.cci" - -#endif - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 +#include +#include +#include + +//*********** NOTE +// +// LOOK AT MovieTrackPoint. IN ORDER FOR VECTORS AND MATRICIES TO BE USED IN OBJECTS +// THAT WILL BE USED IN stl::vectors, THEIR CONSTRUCTORS AND OPERATORS MUST TAKE ONLY +// const PARAMETERS. LOOK AT MatrixF and Vector2DF.. THIS WAS NOT YET DONE WITH +// THE OTHER MATRIX AND VECTOR CLASSES (Vector2DC, Vector2DI, MatrixC, MatrixI, ...) +// + + +#ifndef MATRIX_DEF + #define MATRIX_DEF + + #include "vector.h" + #include "mdebug.h" + + //#define MATRIX_INITIALIZE // Initializes vectors + + class MatrixC; // Forward Referencing + class MatrixI; + class MatrixF; + + class Matrix { + public: + // Member Virtual Functions + virtual Matrix &operator= (unsigned char c)=0; + virtual Matrix &operator= (int c)=0; + virtual Matrix &operator= (double c)=0; + virtual Matrix &operator= (MatrixC &op)=0; + virtual Matrix &operator= (MatrixI &op)=0; + virtual Matrix &operator= (MatrixF &op)=0; + + virtual Matrix &operator+= (unsigned char c)=0; + virtual Matrix &operator+= (int c)=0; + virtual Matrix &operator+= (double c)=0; + virtual Matrix &operator+= (MatrixC &op)=0; + virtual Matrix &operator+= (MatrixI &op)=0; + virtual Matrix &operator+= (MatrixF &op)=0; + + virtual Matrix &operator-= (unsigned char c)=0; + virtual Matrix &operator-= (int c)=0; + virtual Matrix &operator-= (double c)=0; + virtual Matrix &operator-= (MatrixC &op)=0; + virtual Matrix &operator-= (MatrixI &op)=0; + virtual Matrix &operator-= (MatrixF &op)=0; + + virtual Matrix &operator*= (unsigned char c)=0; + virtual Matrix &operator*= (int c)=0; + virtual Matrix &operator*= (double c)=0; + virtual Matrix &operator*= (MatrixC &op)=0; + virtual Matrix &operator*= (MatrixI &op)=0; + virtual Matrix &operator*= (MatrixF &op)=0; + + virtual Matrix &operator/= (unsigned char c)=0; + virtual Matrix &operator/= (int c)=0; + virtual Matrix &operator/= (double c)=0; + virtual Matrix &operator/= (MatrixC &op)=0; + virtual Matrix &operator/= (MatrixI &op)=0; + virtual Matrix &operator/= (MatrixF &op)=0; + + virtual Matrix &Multiply (MatrixF &op)=0; + virtual Matrix &Resize (int x, int y)=0; + virtual Matrix &ResizeSafe (int x, int y)=0; + virtual Matrix &InsertRow (int r)=0; + virtual Matrix &InsertCol (int c)=0; + virtual Matrix &Transpose (void)=0; + virtual Matrix &Identity (int order)=0; + /*inline Matrix &RotateX (double ang); + inline Matrix &RotateY (double ang); + inline Matrix &RotateZ (double ang); */ + virtual Matrix &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3)=0; + virtual Matrix &GaussJordan (MatrixF &b) { return *this; } + virtual Matrix &ConjugateGradient (MatrixF &b) { return *this; } + + virtual int GetRows(void)=0; + virtual int GetCols(void)=0; + virtual int GetLength(void)=0; + + virtual unsigned char *GetDataC (void)=0; + virtual int *GetDataI (void)=0; + virtual double *GetDataF (void)=0; + + virtual double GetF (int r, int c); + }; + + // MatrixC Declaration + #define VNAME C + #define VTYPE unsigned char + + class MatrixC { + public: + VTYPE *data; + int rows, cols, len; + + // Constructors/Destructors + inline MatrixC (); + inline ~MatrixC (); + inline MatrixC (int r, int c); + + // Member Functions + inline VTYPE &operator () (int c, int r); + inline MatrixC &operator= (unsigned char c); + inline MatrixC &operator= (int c); + inline MatrixC &operator= (double c); + inline MatrixC &operator= (MatrixC &op); + inline MatrixC &operator= (MatrixI &op); + inline MatrixC &operator= (MatrixF &op); + + inline MatrixC &operator+= (unsigned char c); + inline MatrixC &operator+= (int c); + inline MatrixC &operator+= (double c); + inline MatrixC &operator+= (MatrixC &op); + inline MatrixC &operator+= (MatrixI &op); + inline MatrixC &operator+= (MatrixF &op); + + inline MatrixC &operator-= (unsigned char c); + inline MatrixC &operator-= (int c); + inline MatrixC &operator-= (double c); + inline MatrixC &operator-= (MatrixC &op); + inline MatrixC &operator-= (MatrixI &op); + inline MatrixC &operator-= (MatrixF &op); + + inline MatrixC &operator*= (unsigned char c); + inline MatrixC &operator*= (int c); + inline MatrixC &operator*= (double c); + inline MatrixC &operator*= (MatrixC &op); + inline MatrixC &operator*= (MatrixI &op); + inline MatrixC &operator*= (MatrixF &op); + + inline MatrixC &operator/= (unsigned char c); + inline MatrixC &operator/= (int c); + inline MatrixC &operator/= (double c); + inline MatrixC &operator/= (MatrixC &op); + inline MatrixC &operator/= (MatrixI &op); + inline MatrixC &operator/= (MatrixF &op); + + inline MatrixC &Multiply (MatrixF &op); + inline MatrixC &Resize (int x, int y); + inline MatrixC &ResizeSafe (int x, int y); + inline MatrixC &InsertRow (int r); + inline MatrixC &InsertCol (int c); + inline MatrixC &Transpose (void); + inline MatrixC &Identity (int order); + inline MatrixC &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3); + inline MatrixC &GaussJordan (MatrixF &b); + + inline int GetX(); + inline int GetY(); + inline int GetRows(void); + inline int GetCols(void); + inline int GetLength(void); + inline VTYPE *GetData(void); + + inline unsigned char *GetDataC (void) {return data;} + inline int *GetDataI (void) {return NULL;} + inline double *GetDataF (void) {return NULL;} + + inline double GetF (int r, int c); + }; + #undef VNAME + #undef VTYPE + + // MatrixI Declaration + #define VNAME I + #define VTYPE int + + class MatrixI { + public: + VTYPE *data; + int rows, cols, len; + + // Constructors/Destructors + inline MatrixI (); + inline ~MatrixI (); + inline MatrixI (int r, int c); + + // Member Functions + inline VTYPE &operator () (int c, int r); + inline MatrixI &operator= (unsigned char c); + inline MatrixI &operator= (int c); + inline MatrixI &operator= (double c); + inline MatrixI &operator= (MatrixC &op); + inline MatrixI &operator= (MatrixI &op); + inline MatrixI &operator= (MatrixF &op); + + inline MatrixI &operator+= (unsigned char c); + inline MatrixI &operator+= (int c); + inline MatrixI &operator+= (double c); + inline MatrixI &operator+= (MatrixC &op); + inline MatrixI &operator+= (MatrixI &op); + inline MatrixI &operator+= (MatrixF &op); + + inline MatrixI &operator-= (unsigned char c); + inline MatrixI &operator-= (int c); + inline MatrixI &operator-= (double c); + inline MatrixI &operator-= (MatrixC &op); + inline MatrixI &operator-= (MatrixI &op); + inline MatrixI &operator-= (MatrixF &op); + + inline MatrixI &operator*= (unsigned char c); + inline MatrixI &operator*= (int c); + inline MatrixI &operator*= (double c); + inline MatrixI &operator*= (MatrixC &op); + inline MatrixI &operator*= (MatrixI &op); + inline MatrixI &operator*= (MatrixF &op); + + inline MatrixI &operator/= (unsigned char c); + inline MatrixI &operator/= (int c); + inline MatrixI &operator/= (double c); + inline MatrixI &operator/= (MatrixC &op); + inline MatrixI &operator/= (MatrixI &op); + inline MatrixI &operator/= (MatrixF &op); + + inline MatrixI &Multiply (MatrixF &op); + inline MatrixI &Resize (int x, int y); + inline MatrixI &ResizeSafe (int x, int y); + inline MatrixI &InsertRow (int r); + inline MatrixI &InsertCol (int c); + inline MatrixI &Transpose (void); + inline MatrixI &Identity (int order); + inline MatrixI &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3); + inline MatrixI &GaussJordan (MatrixF &b); + + inline int GetX(); + inline int GetY(); + inline int GetRows(void); + inline int GetCols(void); + inline int GetLength(void); + inline VTYPE *GetData(void); + + inline unsigned char *GetDataC (void) {return NULL;} + inline int *GetDataI (void) {return data;} + inline double *GetDataF (void) {return NULL;} + + inline double GetF (int r, int c); + }; + #undef VNAME + #undef VTYPE + + // MatrixF Declaration + #define VNAME F + #define VTYPE double + + class MatrixF { + public: + VTYPE *data; + int rows, cols, len; + + // Constructors/Destructors + inline MatrixF (); + inline ~MatrixF (); + inline MatrixF (const int r, const int c); + + // Member Functions + inline VTYPE GetVal ( int c, int r ); + inline VTYPE &operator () (const int c, const int r); + inline MatrixF &operator= (const unsigned char c); + inline MatrixF &operator= (const int c); + inline MatrixF &operator= (const double c); + inline MatrixF &operator= (const MatrixC &op); + inline MatrixF &operator= (const MatrixI &op); + inline MatrixF &operator= (const MatrixF &op); + + inline MatrixF &operator+= (const unsigned char c); + inline MatrixF &operator+= (const int c); + inline MatrixF &operator+= (const double c); + inline MatrixF &operator+= (const MatrixC &op); + inline MatrixF &operator+= (const MatrixI &op); + inline MatrixF &operator+= (const MatrixF &op); + + inline MatrixF &operator-= (const unsigned char c); + inline MatrixF &operator-= (const int c); + inline MatrixF &operator-= (const double c); + inline MatrixF &operator-= (const MatrixC &op); + inline MatrixF &operator-= (const MatrixI &op); + inline MatrixF &operator-= (const MatrixF &op); + + inline MatrixF &operator*= (const unsigned char c); + inline MatrixF &operator*= (const int c); + inline MatrixF &operator*= (const double c); + inline MatrixF &operator*= (const MatrixC &op); + inline MatrixF &operator*= (const MatrixI &op); + inline MatrixF &operator*= (const MatrixF &op); + + inline MatrixF &operator/= (const unsigned char c); + inline MatrixF &operator/= (const int c); + inline MatrixF &operator/= (const double c); + inline MatrixF &operator/= (const MatrixC &op); + inline MatrixF &operator/= (const MatrixI &op); + inline MatrixF &operator/= (const MatrixF &op); + + inline MatrixF &Multiply4x4 (const MatrixF &op); + inline MatrixF &Multiply (const MatrixF &op); + inline MatrixF &Resize (const int x, const int y); + inline MatrixF &ResizeSafe (const int x, const int y); + inline MatrixF &InsertRow (const int r); + inline MatrixF &InsertCol (const int c); + inline MatrixF &Transpose (void); + inline MatrixF &Identity (const int order); + inline MatrixF &RotateX (const double ang); + inline MatrixF &RotateY (const double ang); + inline MatrixF &RotateZ (const double ang); + inline MatrixF &Ortho (double sx, double sy, double n, double f); + inline MatrixF &Translate (double tx, double ty, double tz); + inline MatrixF &Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3); + inline MatrixF &GaussJordan (MatrixF &b); + inline MatrixF &ConjugateGradient (MatrixF &b); + inline MatrixF &Submatrix ( MatrixF& b, int mx, int my); + inline MatrixF &MatrixVector5 (MatrixF& x, int mrows, MatrixF& b ); + inline MatrixF &ConjugateGradient5 (MatrixF &b, int mrows ); + inline double Dot ( MatrixF& b ); + + inline void Print ( char* fname ); + + inline int GetX(); + inline int GetY(); + inline int GetRows(void); + inline int GetCols(void); + inline int GetLength(void); + inline VTYPE *GetData(void); + inline void GetRowVec (int r, Vector3DF &v); + + inline unsigned char *GetDataC (void) const {return NULL;} + inline int *GetDataI (void) const {return NULL;} + inline double *GetDataF (void) const {return data;} + + inline double GetF (const int r, const int c); + }; + #undef VNAME + #undef VTYPE + + // MatrixF Declaration + #define VNAME F + #define VTYPE float + + class Matrix4F { + public: + VTYPE data[16]; + + // Constructors/Destructors + inline Matrix4F (); + + // Member Functions + inline VTYPE &operator () (const int n) { return data[n]; } + inline VTYPE &operator () (const int c, const int r) { return data[ (r<<2)+c ]; } + inline Matrix4F &operator= (const unsigned char c); + inline Matrix4F &operator= (const int c); + inline Matrix4F &operator= (const double c); + inline Matrix4F &operator+= (const unsigned char c); + inline Matrix4F &operator+= (const int c); + inline Matrix4F &operator+= (const double c); + inline Matrix4F &operator-= (const unsigned char c); + inline Matrix4F &operator-= (const int c); + inline Matrix4F &operator-= (const double c); + inline Matrix4F &operator*= (const unsigned char c); + inline Matrix4F &operator*= (const int c); + inline Matrix4F &operator*= (const double c); + inline Matrix4F &operator/= (const unsigned char c); + inline Matrix4F &operator/= (const int c); + inline Matrix4F &operator/= (const double c); + + inline Matrix4F &Multiply (const Matrix4F &op); + inline Matrix4F &Transpose (void); + inline Matrix4F &Identity (const int order); + inline Matrix4F &RotateX (const double ang); + inline Matrix4F &RotateY (const double ang); + inline Matrix4F &RotateZ (const double ang); + inline Matrix4F &Ortho (double sx, double sy, double n, double f); + inline Matrix4F &Translate (double tx, double ty, double tz); + inline Matrix4F &Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3); + + // Scale-Rotate-Translate (compound matrix) + inline Matrix4F &SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s); + inline Matrix4F &SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s); + + // invTranslate-invRotate-invScale (compound matrix) + inline Matrix4F &InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s); + inline Matrix4F &InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s); + + inline int GetX() { return 4; } + inline int GetY() { return 4; } + inline int GetRows(void) { return 4; } + inline int GetCols(void) { return 4; } + inline int GetLength(void) { return 16; } + inline VTYPE *GetData(void) { return data; } + inline void GetRowVec (int r, Vector3DF &v); + + inline unsigned char *GetDataC (void) const {return NULL;} + inline int *GetDataI (void) const {return NULL;} + inline float *GetDataF (void) const {return (float*) data;} + + inline float GetF (const int r, const int c); + }; + #undef VNAME + #undef VTYPE + + + // Matrix Code Definitions (Inlined) + + #include "matrix.cci" + +#endif + diff --git a/Extras/sph/common/mdebug.cpp b/Extras/sph/common/mdebug.cpp index fb3829f80..b0b868b22 100644 --- a/Extras/sph/common/mdebug.cpp +++ b/Extras/sph/common/mdebug.cpp @@ -1,583 +1,583 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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. -*/ - - - -//#define MEMORY_DEBUG // Overloads the new and delete operators - -#include -#include -#include - -#include "mdebug.h" - -#ifdef _MSC_VER - #include - #include - #include - #include -#endif - -CDebug debug; -CError error; - -//------------------------------------------------- DEBUG CLASS -CDebug::CDebug () -{ - m_OutName = "debug.txt"; - m_bStarted = false; - m_bToFile = true; - m_bToSysbox = true; - m_bToCons = false; - m_OutFile = NULL; - m_OutCons = NULL; - Start (); -} - -CDebug::~CDebug (void) -{ - Stop (); -} - -void CDebug::Start () -{ - if ( m_bStarted ) Stop (); - - if ( m_bToFile ) { - char fn[200]; - -#ifdef _MSC_VER - strcpy_s ( fn, 200, m_OutName.c_str () ); - fopen_s ( &m_OutFile, fn, "w+t" ); -#else - strncpy ( fn, m_OutName.c_str(), 200 ); - m_OutFile = fopen( fn, "w+" ); -#endif - - if ( m_OutFile == 0x0 ) { - exit ( EXIT_FAILURE ); // error: Cannot create debug file - } - m_bStarted = true; - Print ( "debug", "CDebug started to file.\n"); - } - m_bStarted = true; -} - -void CDebug::Exit ( int code ) -{ - if ( !m_bToSysbox ) { - #ifdef _MSC_VER - _getch(); - #endif - } - exit ( code ); -} - -void CDebug::Stop () -{ - if ( m_bStarted ) { - if ( m_bToFile ) { - Print ( "debug", "CDebug stopped."); - fclose ( m_OutFile ); - } - } - m_bStarted = false; -} - -void CDebug::SendToFile ( char* fname ) -{ - if (m_bStarted) Stop (); - m_bToFile = true; - m_OutName = fname; -} - -void CDebug::SendToConsole ( bool tf ) -{ - m_bToCons = tf; - if ( tf ) { - #ifdef _MSC_VER - AllocConsole (); - long lStdHandle = (long) GetStdHandle( STD_OUTPUT_HANDLE ); - int hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); - m_OutCons = _fdopen( hConHandle, "w" ); - #endif - } -} - -void CDebug::SendToSysbox ( bool tf ) -{ - m_bToSysbox = tf; -} - -void CDebug::Print ( std::string subsys, std::string msg ) -{ - if ( m_bStarted ) { - if ( m_bToFile ) { - fprintf ( m_OutFile, "%s: %s\n", subsys.c_str(), msg.c_str() ); - fflush ( m_OutFile); - } - if ( m_bToCons ) { - #ifdef _MSC_VER - fprintf ( m_OutCons, "%s: %s\n", subsys.c_str(), msg.c_str() ); - fflush ( m_OutCons ); - #else - printf ( "%s: %s\n", subsys.c_str(), msg.c_str() ); - #endif - } - } -} - -void CDebug::Print (char* msg) -{ - if ( m_bStarted ) { - if ( m_bToFile ) { - fprintf ( m_OutFile, "%s", msg ); - fflush ( m_OutFile ); - } - if ( m_bToCons ) { - #ifdef _MSC_VER - fprintf ( m_OutCons, "%s", msg ); - fflush ( m_OutCons ); - #else - printf ( "%s", msg ); - #endif - } - } -} - -void CDebug::Print ( std::string msg ) -{ - if ( m_bStarted ) { - if ( m_bToFile ) { - fprintf ( m_OutFile, "%s", msg.c_str() ); - fflush ( m_OutFile ); - } - if ( m_bToCons ) { - #ifdef _MSC_VER - fprintf ( m_OutCons, "%s", msg.c_str() ); - fflush ( m_OutCons ); - #else - printf ( "%s", msg.c_str() ); - #endif - } - } -} - -void CDebug::PrintF ( std::string substr, char* format, ... ) -{ - // Note: This is the >only< way to do this. There is no general way to - // pass on all the arguments from one ellipsis function to another. - // The function vfprintf was specially designed to allow this. - - if ( m_bStarted ) { - if ( m_bToFile ) { - va_list argptr; - va_start (argptr, format); - fprintf ( m_OutFile, "%s: ", substr.c_str() ); - vfprintf ( m_OutFile, format, argptr); - va_end (argptr); - fflush ( m_OutFile ); - } - if ( m_bToCons ) { - #ifdef _MSC_VER - va_list argptr; - va_start (argptr, format); - fprintf ( m_OutCons, "%s: ", substr.c_str() ); - vfprintf ( m_OutCons, format, argptr); - va_end (argptr); - fflush ( m_OutCons ); - #else - va_list argptr; - va_start (argptr, format); - printf ( "%s: ", substr.c_str() ); - vprintf ( format, argptr); - va_end (argptr); - #endif - } - } -} - - -void CDebug::Printf ( char* format, ... ) -{ - // Note: This is the >only< way to do this. There is no general way to - // pass on all the arguments from one ellipsis function to another. - // The function vfprintf was specially designed to allow this. - - if ( m_bStarted ) { - if ( m_bToFile ) { - va_list argptr; - va_start (argptr, format); - vfprintf ( m_OutFile, format, argptr); - va_end (argptr); - fflush ( m_OutFile ); - } - if ( m_bToCons ) { - #ifdef _MSC_VER - va_list argptr; - va_start (argptr, format); - vfprintf ( m_OutCons, format, argptr); - va_end (argptr); - fflush ( m_OutCons ); - #else - va_list argptr; - va_start (argptr, format); - vprintf ( format, argptr); - va_end (argptr); - #endif - } - } -} - -void CDebug::PrintErr ( std::string errid, std::string subsys, std::string msg, std::string sysbox ) -{ - if ( m_bStarted ) { - if ( m_bToFile ) { - fprintf ( m_OutFile, "%s: ERROR: %s\n", subsys.c_str(), msg.c_str() ); - fflush ( m_OutFile ); - } - if ( m_bToCons ) { - #ifdef _MSC_VER - fprintf ( m_OutCons, "%s: ERROR: %s\n", subsys.c_str(), msg.c_str() ); - fflush ( m_OutCons ); - #else - printf ( "%s: ERROR[%s] %s\n", subsys.c_str(), errid.c_str(), msg.c_str() ); - #endif - } - if ( m_bToSysbox ) { - char disp[4000]; - char caption[200]; - - #ifdef _MSC_VER - // Message boxes for Windows - strcpy_s ( caption, 200, "Mint - Error" ); - strcpy_s ( disp, 4000, sysbox.c_str()); - #include - int hr = MessageBoxA ( 0x0, disp, caption, MB_OK); - #else - strncpy ( caption, m_ErrorSubsys.c_str(), 200 ); - strncpy ( disp, msg.c_str(), 4000 ); - #endif - } - } -} - - -//-------------------------------------------------------------------- Error Class Code -// -// This software is released under the LGPL Open Source Liscense. -// See the documentation included with this source code for terms of modification, -// distribution and re-release. -// -// Original Copyright (C) 2002 Rama C. Hoetzlein, GameX R4 -// - -CError::CError () -{ - m_Errors.clear (); - m_ErrorID = ""; - m_ErrorSubsys = ""; - m_ErrorMsg = ""; - m_ErrorFunc = ""; - m_ErrorFix = ""; - m_ErrorExtra = ""; -} - -void CError::Start () -{ - Start ( "" ); -} - -void CError::Start ( char* fname ) -{ - if ( fname != 0x0 && strlen(fname) > 0 ) { - // Read error message file. NOT YET IMPLEMENTED - } else { - debug.Print ( "error", "No error file loaded." ); - } - debug.Print ( "error", "Error handler started." ); - m_bStarted = true; -} - -void CError::OutputMessage () -{ - // Create sysbox message - std::string box_msg; - box_msg = "Subsystem: " + m_ErrorSubsys + "\n\n"; - box_msg += "Error: " + m_ErrorMsg + "\n"; - if ( m_ErrorExtra.length() > 0) box_msg += "Info: " + m_ErrorExtra + "\n"; - if ( m_ErrorFix.length() > 0) box_msg += "\nFix: " + m_ErrorFix + "\n"; - if ( m_ErrorID.length() > 0 ) box_msg += "Error ID: " + m_ErrorID + "\n"; - if ( m_ErrorFunc.length() > 0 ) box_msg += "Function: " + m_ErrorFunc + "\n"; - - // Error output to debug file - debug.PrintErr ( m_ErrorID, m_ErrorSubsys, m_ErrorMsg, box_msg ); -} - -void CError::Exit ( int code ) -{ - debug.Exit ( code ); -} - -void CError::Print ( char* msg) -{ - // User-level error (no additional info) - m_ErrorID = ""; - m_ErrorSubsys = "undef"; - m_ErrorMsg = msg; - m_ErrorFunc = ""; - m_ErrorFix = ""; - m_ErrorExtra = ""; - OutputMessage (); -} - -void CError::Print ( std::string msg ) -{ - // User-level error (no additional info) - m_ErrorID = ""; - m_ErrorSubsys = "undef"; - m_ErrorMsg = msg; - m_ErrorFunc = ""; - m_ErrorFix = ""; - m_ErrorExtra = ""; - OutputMessage (); -} - -void CError::Print ( std::string subsys, std::string msg ){ - // Unregistered error - m_ErrorID = ""; - m_ErrorSubsys = subsys; - m_ErrorMsg = msg; - m_ErrorFunc = ""; - m_ErrorFix = ""; - m_ErrorExtra = ""; - OutputMessage (); -} - -void CError::PrintF ( std::string subsys, char* msg, ... ) -{ - char buf[2000]; - va_list argptr; - m_ErrorID = ""; - m_ErrorSubsys = subsys; - va_start(argptr, msg); - #ifdef _MSC_VER - vsprintf_s (buf, 2000, msg, argptr); - #else - vsnprintf(buf, 2000, msg, argptr); - #endif - va_end (argptr); - m_ErrorMsg = buf; - m_ErrorFunc = ""; - m_ErrorFix = ""; - m_ErrorExtra = ""; - OutputMessage (); -} - - -void CError::PrintErr ( std::string err ) -{ - // Registered error - NOT YET IMPLEMENTED - // CErrorMsg* msg = m_ -} - -void CError::PrintErrDX ( std::string err, int result ) -{ -// -// #ifdef BUILD_DX -// m_ErrorExtra = DXGetErrorString9 ( result ); -// #endif - OutputMessage (); - m_ErrorExtra = ""; -} - -void CError::PrintErrGL ( std::string err, int result ) -{ - OutputMessage (); - m_ErrorExtra = ""; -} - -void CError::PrintErrW ( std::string err, int result ) -{ - - OutputMessage (); - m_ErrorExtra = ""; -} - - -/* -void CError::GetErrorMessage ( ErrorDef::Errors err ) -{ - switch (err) { - //----------------------------------------------------- MATRIX Errors - case ErrorDef::MatrixIsNull: - m_strDescription = "Matrix data is null\n"; - m_strFunction = "Matrix::op()"; - m_strFix = ""; - break; - case ErrorDef::ColOutOfBounds: - m_strDescription = "Column index out of bounds\n"; - m_strFunction = "Matrix::op()"; - m_strFix = ""; - break; - case ErrorDef::RowOutOfBounds: - m_strDescription = "Row index out of bounds\n"; - m_strFunction = "Matrix::op()"; - m_strFix = ""; - break; - //----------------------------------------------------- WinDX Errors - case ErrorDef::DXInitFail: - m_strDescription = "Initialization of DirectX failed."; - m_strFunction = "GameX::InitDirect3D"; - m_strFix = "Reinstall DirectX 9.0. Confirm DirectX hardware support."; - break; - case ErrorDef::DXCannotGetMode: - m_strDescription = "Cannot get current display mode."; - m_strFunction = "GameX::SysGetCurrentMode"; - m_strFix = ""; - break; - case ErrorDef::DXCannotSetMode: - m_strDescription = "Cannot select display mode."; - m_strFunction = "GameX::SysSelectMode"; - m_strFix = "Try requesting a different display mode and options."; - break; - case ErrorDef::WinCannotCreateClass: - m_strDescription = "Cannot create Windows class."; - m_strFunction = "GameX::SysCreateWindowsClass"; - m_strFix = "Close other applications. Restart system."; - break; - case ErrorDef::WinCannotCreateWindow: - m_strDescription = "Cannot create Window."; - m_strFunction = "GameX::SysCreateWindow"; - m_strFix = "Try requesting a different display mode and options.\nClose other applications. Restart system. Possibly unsupported display hardware."; - break; - case ErrorDef::DXCannotCreateDevice: - m_strDescription = "Cannot create DirectX Device."; - m_strFunction = "GameX::SysCreateDevice3D"; - m_strFix = "Try requesting a different display mode and options."; - break; - case ErrorDef::DXCannotCreateDepthStencils: - m_strDescription = "Cannot create DirectX Depth Stencils."; - m_strFunction = "GameX::SysCreateDepthStencils"; - m_strFix = "Try requesting a different display mode and options."; - break; - //---------------------------------------------------------------- File Errors - case ErrorDef::CannotAppendAndRead: - m_strDescription = "Cannot open a file in both APPEND and READ mode."; - m_strFunction = "File::Open"; - m_strFix = "Use either APPEND, READ or WRITE when opening file."; - break; - case ErrorDef::CannotAppendAndWrite: - m_strDescription = "Cannot open a file in both APPEND and WRITE mode."; - m_strFunction = "File::Open"; - m_strFix = "Use either APPEND, READ or WRITE when opening file."; - break; - case ErrorDef::FileNotFound: - m_strDescription = "File not found."; - m_strFunction = "File::Open"; - m_strFix = "Use AUTOCREATE if you would like to create a new file."; - break; - case ErrorDef::LeaveEofOnlyOnAppend: - m_strDescription = "Warning:LEAVEEOF flag can only be used in APPEND mode."; - m_strFunction = "File::Open"; - m_strFix = "Remove the LEAVEEOF flag or open file in APPEND mode."; - break; - case ErrorDef::NoModeSpecified: - m_strDescription = "No open mode specified."; - m_strFunction = "File::Open"; - m_strFix = "You must specify READ, WRITE or APPEND to open a file."; - break; - case ErrorDef::NoNotOpenCmd: - m_strDescription = "NOTOPEN cannot be used as an open file flag."; - m_strFunction = "File::Open"; - m_strFix = "Remove the NOTOPEN flag."; - break; - case ErrorDef::NoSeqAndRandom: - m_strDescription = "Cannot open file in both SEQUENTIAL and RANDOM access modes."; - m_strFunction = "File::Open"; - m_strFix = "Choose either SEQUENTIAL or RANDOM mode to open file in."; - break; - case ErrorDef::CannotCreateFont: - m_strDescription = "Cannot create default font."; - m_strFunction = "RenderDX::Initialize"; - m_strFix = "DirectX fonts are not supported for some reason."; - break; - case ErrorDef::CannotCreateSprite: - m_strDescription = "Cannot create default sprite."; - m_strFunction = "RenderDX::Initialize"; - m_strFix = "DirectX sprites are not supported for some reason."; - break; - case ErrorDef::CannotAddImage: - m_strDescription = "Cannot create image on video memory."; - m_strFunction = "RenderDX::AddImage"; - m_strFix = "DirectX was unable to create hardware texture for the image."; - break; - case ErrorDef::CannotUpdateImage: - m_strDescription = "Cannot update image data on video memory."; - m_strFunction = "RenderDX::UpdateImage"; - m_strFix = "DirectX was unable to modify hardware texture for the image."; - break; - case ErrorDef::CannotOpenFile: - #if defined(BUILD_VSNET) - m_strDescription = strerror( errno ); - #else - m_strDescription = ""; // should replace with Mac general error code - #endif - m_strFunction = "File::Open"; - m_strFix = ""; - break; - case ErrorDef::ImageLoadError: - m_strDescription = "Unable to load image."; - m_strFunction = "ImageX::Load"; - m_strFix = ""; - break; - default: - char msg[500]; - sprintf (msg, "%d", (int) err ); - m_strDescription = "Undefined error: "; - m_strDescription += msg; - m_strSubsystem = "Undefined error."; - m_strFix = "Error must be given a description and fix message."; - break; - }; -} -*/ - - - -#ifdef MEMORY_DEBUG - - // User-defined operator new. - void *operator new( size_t stSize ) - { - void* pvMem = malloc( stSize ); - debug.Printf ( "NEW %p (%d bytes)\n", pvMem, stSize ); - return pvMem; - } - - // User-defined operator delete. - void operator delete( void *pvMem ) - { - debug.Printf ( "DELETE %p\n", pvMem ); - free ( pvMem ); - } +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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. +*/ + + + +//#define MEMORY_DEBUG // Overloads the new and delete operators + +#include +#include +#include + +#include "mdebug.h" + +#ifdef _MSC_VER + #include + #include + #include + #include +#endif + +CDebug debug; +CError error; + +//------------------------------------------------- DEBUG CLASS +CDebug::CDebug () +{ + m_OutName = "debug.txt"; + m_bStarted = false; + m_bToFile = true; + m_bToSysbox = true; + m_bToCons = false; + m_OutFile = NULL; + m_OutCons = NULL; + Start (); +} + +CDebug::~CDebug (void) +{ + Stop (); +} + +void CDebug::Start () +{ + if ( m_bStarted ) Stop (); + + if ( m_bToFile ) { + char fn[200]; + +#ifdef _MSC_VER + strcpy_s ( fn, 200, m_OutName.c_str () ); + fopen_s ( &m_OutFile, fn, "w+t" ); +#else + strncpy ( fn, m_OutName.c_str(), 200 ); + m_OutFile = fopen( fn, "w+" ); +#endif + + if ( m_OutFile == 0x0 ) { + exit ( EXIT_FAILURE ); // error: Cannot create debug file + } + m_bStarted = true; + Print ( "debug", "CDebug started to file.\n"); + } + m_bStarted = true; +} + +void CDebug::Exit ( int code ) +{ + if ( !m_bToSysbox ) { + #ifdef _MSC_VER + _getch(); + #endif + } + exit ( code ); +} + +void CDebug::Stop () +{ + if ( m_bStarted ) { + if ( m_bToFile ) { + Print ( "debug", "CDebug stopped."); + fclose ( m_OutFile ); + } + } + m_bStarted = false; +} + +void CDebug::SendToFile ( char* fname ) +{ + if (m_bStarted) Stop (); + m_bToFile = true; + m_OutName = fname; +} + +void CDebug::SendToConsole ( bool tf ) +{ + m_bToCons = tf; + if ( tf ) { + #ifdef _MSC_VER + AllocConsole (); + long lStdHandle = (long) GetStdHandle( STD_OUTPUT_HANDLE ); + int hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + m_OutCons = _fdopen( hConHandle, "w" ); + #endif + } +} + +void CDebug::SendToSysbox ( bool tf ) +{ + m_bToSysbox = tf; +} + +void CDebug::Print ( std::string subsys, std::string msg ) +{ + if ( m_bStarted ) { + if ( m_bToFile ) { + fprintf ( m_OutFile, "%s: %s\n", subsys.c_str(), msg.c_str() ); + fflush ( m_OutFile); + } + if ( m_bToCons ) { + #ifdef _MSC_VER + fprintf ( m_OutCons, "%s: %s\n", subsys.c_str(), msg.c_str() ); + fflush ( m_OutCons ); + #else + printf ( "%s: %s\n", subsys.c_str(), msg.c_str() ); + #endif + } + } +} + +void CDebug::Print (char* msg) +{ + if ( m_bStarted ) { + if ( m_bToFile ) { + fprintf ( m_OutFile, "%s", msg ); + fflush ( m_OutFile ); + } + if ( m_bToCons ) { + #ifdef _MSC_VER + fprintf ( m_OutCons, "%s", msg ); + fflush ( m_OutCons ); + #else + printf ( "%s", msg ); + #endif + } + } +} + +void CDebug::Print ( std::string msg ) +{ + if ( m_bStarted ) { + if ( m_bToFile ) { + fprintf ( m_OutFile, "%s", msg.c_str() ); + fflush ( m_OutFile ); + } + if ( m_bToCons ) { + #ifdef _MSC_VER + fprintf ( m_OutCons, "%s", msg.c_str() ); + fflush ( m_OutCons ); + #else + printf ( "%s", msg.c_str() ); + #endif + } + } +} + +void CDebug::PrintF ( std::string substr, char* format, ... ) +{ + // Note: This is the >only< way to do this. There is no general way to + // pass on all the arguments from one ellipsis function to another. + // The function vfprintf was specially designed to allow this. + + if ( m_bStarted ) { + if ( m_bToFile ) { + va_list argptr; + va_start (argptr, format); + fprintf ( m_OutFile, "%s: ", substr.c_str() ); + vfprintf ( m_OutFile, format, argptr); + va_end (argptr); + fflush ( m_OutFile ); + } + if ( m_bToCons ) { + #ifdef _MSC_VER + va_list argptr; + va_start (argptr, format); + fprintf ( m_OutCons, "%s: ", substr.c_str() ); + vfprintf ( m_OutCons, format, argptr); + va_end (argptr); + fflush ( m_OutCons ); + #else + va_list argptr; + va_start (argptr, format); + printf ( "%s: ", substr.c_str() ); + vprintf ( format, argptr); + va_end (argptr); + #endif + } + } +} + + +void CDebug::Printf ( char* format, ... ) +{ + // Note: This is the >only< way to do this. There is no general way to + // pass on all the arguments from one ellipsis function to another. + // The function vfprintf was specially designed to allow this. + + if ( m_bStarted ) { + if ( m_bToFile ) { + va_list argptr; + va_start (argptr, format); + vfprintf ( m_OutFile, format, argptr); + va_end (argptr); + fflush ( m_OutFile ); + } + if ( m_bToCons ) { + #ifdef _MSC_VER + va_list argptr; + va_start (argptr, format); + vfprintf ( m_OutCons, format, argptr); + va_end (argptr); + fflush ( m_OutCons ); + #else + va_list argptr; + va_start (argptr, format); + vprintf ( format, argptr); + va_end (argptr); + #endif + } + } +} + +void CDebug::PrintErr ( std::string errid, std::string subsys, std::string msg, std::string sysbox ) +{ + if ( m_bStarted ) { + if ( m_bToFile ) { + fprintf ( m_OutFile, "%s: ERROR: %s\n", subsys.c_str(), msg.c_str() ); + fflush ( m_OutFile ); + } + if ( m_bToCons ) { + #ifdef _MSC_VER + fprintf ( m_OutCons, "%s: ERROR: %s\n", subsys.c_str(), msg.c_str() ); + fflush ( m_OutCons ); + #else + printf ( "%s: ERROR[%s] %s\n", subsys.c_str(), errid.c_str(), msg.c_str() ); + #endif + } + if ( m_bToSysbox ) { + char disp[4000]; + char caption[200]; + + #ifdef _MSC_VER + // Message boxes for Windows + strcpy_s ( caption, 200, "Mint - Error" ); + strcpy_s ( disp, 4000, sysbox.c_str()); + #include + int hr = MessageBoxA ( 0x0, disp, caption, MB_OK); + #else + strncpy ( caption, m_ErrorSubsys.c_str(), 200 ); + strncpy ( disp, msg.c_str(), 4000 ); + #endif + } + } +} + + +//-------------------------------------------------------------------- Error Class Code +// +// This software is released under the LGPL Open Source Liscense. +// See the documentation included with this source code for terms of modification, +// distribution and re-release. +// +// Original Copyright (C) 2002 Rama C. Hoetzlein, GameX R4 +// + +CError::CError () +{ + m_Errors.clear (); + m_ErrorID = ""; + m_ErrorSubsys = ""; + m_ErrorMsg = ""; + m_ErrorFunc = ""; + m_ErrorFix = ""; + m_ErrorExtra = ""; +} + +void CError::Start () +{ + Start ( "" ); +} + +void CError::Start ( char* fname ) +{ + if ( fname != 0x0 && strlen(fname) > 0 ) { + // Read error message file. NOT YET IMPLEMENTED + } else { + debug.Print ( "error", "No error file loaded." ); + } + debug.Print ( "error", "Error handler started." ); + m_bStarted = true; +} + +void CError::OutputMessage () +{ + // Create sysbox message + std::string box_msg; + box_msg = "Subsystem: " + m_ErrorSubsys + "\n\n"; + box_msg += "Error: " + m_ErrorMsg + "\n"; + if ( m_ErrorExtra.length() > 0) box_msg += "Info: " + m_ErrorExtra + "\n"; + if ( m_ErrorFix.length() > 0) box_msg += "\nFix: " + m_ErrorFix + "\n"; + if ( m_ErrorID.length() > 0 ) box_msg += "Error ID: " + m_ErrorID + "\n"; + if ( m_ErrorFunc.length() > 0 ) box_msg += "Function: " + m_ErrorFunc + "\n"; + + // Error output to debug file + debug.PrintErr ( m_ErrorID, m_ErrorSubsys, m_ErrorMsg, box_msg ); +} + +void CError::Exit ( int code ) +{ + debug.Exit ( code ); +} + +void CError::Print ( char* msg) +{ + // User-level error (no additional info) + m_ErrorID = ""; + m_ErrorSubsys = "undef"; + m_ErrorMsg = msg; + m_ErrorFunc = ""; + m_ErrorFix = ""; + m_ErrorExtra = ""; + OutputMessage (); +} + +void CError::Print ( std::string msg ) +{ + // User-level error (no additional info) + m_ErrorID = ""; + m_ErrorSubsys = "undef"; + m_ErrorMsg = msg; + m_ErrorFunc = ""; + m_ErrorFix = ""; + m_ErrorExtra = ""; + OutputMessage (); +} + +void CError::Print ( std::string subsys, std::string msg ){ + // Unregistered error + m_ErrorID = ""; + m_ErrorSubsys = subsys; + m_ErrorMsg = msg; + m_ErrorFunc = ""; + m_ErrorFix = ""; + m_ErrorExtra = ""; + OutputMessage (); +} + +void CError::PrintF ( std::string subsys, char* msg, ... ) +{ + char buf[2000]; + va_list argptr; + m_ErrorID = ""; + m_ErrorSubsys = subsys; + va_start(argptr, msg); + #ifdef _MSC_VER + vsprintf_s (buf, 2000, msg, argptr); + #else + vsnprintf(buf, 2000, msg, argptr); + #endif + va_end (argptr); + m_ErrorMsg = buf; + m_ErrorFunc = ""; + m_ErrorFix = ""; + m_ErrorExtra = ""; + OutputMessage (); +} + + +void CError::PrintErr ( std::string err ) +{ + // Registered error - NOT YET IMPLEMENTED + // CErrorMsg* msg = m_ +} + +void CError::PrintErrDX ( std::string err, int result ) +{ +// +// #ifdef BUILD_DX +// m_ErrorExtra = DXGetErrorString9 ( result ); +// #endif + OutputMessage (); + m_ErrorExtra = ""; +} + +void CError::PrintErrGL ( std::string err, int result ) +{ + OutputMessage (); + m_ErrorExtra = ""; +} + +void CError::PrintErrW ( std::string err, int result ) +{ + + OutputMessage (); + m_ErrorExtra = ""; +} + + +/* +void CError::GetErrorMessage ( ErrorDef::Errors err ) +{ + switch (err) { + //----------------------------------------------------- MATRIX Errors + case ErrorDef::MatrixIsNull: + m_strDescription = "Matrix data is null\n"; + m_strFunction = "Matrix::op()"; + m_strFix = ""; + break; + case ErrorDef::ColOutOfBounds: + m_strDescription = "Column index out of bounds\n"; + m_strFunction = "Matrix::op()"; + m_strFix = ""; + break; + case ErrorDef::RowOutOfBounds: + m_strDescription = "Row index out of bounds\n"; + m_strFunction = "Matrix::op()"; + m_strFix = ""; + break; + //----------------------------------------------------- WinDX Errors + case ErrorDef::DXInitFail: + m_strDescription = "Initialization of DirectX failed."; + m_strFunction = "GameX::InitDirect3D"; + m_strFix = "Reinstall DirectX 9.0. Confirm DirectX hardware support."; + break; + case ErrorDef::DXCannotGetMode: + m_strDescription = "Cannot get current display mode."; + m_strFunction = "GameX::SysGetCurrentMode"; + m_strFix = ""; + break; + case ErrorDef::DXCannotSetMode: + m_strDescription = "Cannot select display mode."; + m_strFunction = "GameX::SysSelectMode"; + m_strFix = "Try requesting a different display mode and options."; + break; + case ErrorDef::WinCannotCreateClass: + m_strDescription = "Cannot create Windows class."; + m_strFunction = "GameX::SysCreateWindowsClass"; + m_strFix = "Close other applications. Restart system."; + break; + case ErrorDef::WinCannotCreateWindow: + m_strDescription = "Cannot create Window."; + m_strFunction = "GameX::SysCreateWindow"; + m_strFix = "Try requesting a different display mode and options.\nClose other applications. Restart system. Possibly unsupported display hardware."; + break; + case ErrorDef::DXCannotCreateDevice: + m_strDescription = "Cannot create DirectX Device."; + m_strFunction = "GameX::SysCreateDevice3D"; + m_strFix = "Try requesting a different display mode and options."; + break; + case ErrorDef::DXCannotCreateDepthStencils: + m_strDescription = "Cannot create DirectX Depth Stencils."; + m_strFunction = "GameX::SysCreateDepthStencils"; + m_strFix = "Try requesting a different display mode and options."; + break; + //---------------------------------------------------------------- File Errors + case ErrorDef::CannotAppendAndRead: + m_strDescription = "Cannot open a file in both APPEND and READ mode."; + m_strFunction = "File::Open"; + m_strFix = "Use either APPEND, READ or WRITE when opening file."; + break; + case ErrorDef::CannotAppendAndWrite: + m_strDescription = "Cannot open a file in both APPEND and WRITE mode."; + m_strFunction = "File::Open"; + m_strFix = "Use either APPEND, READ or WRITE when opening file."; + break; + case ErrorDef::FileNotFound: + m_strDescription = "File not found."; + m_strFunction = "File::Open"; + m_strFix = "Use AUTOCREATE if you would like to create a new file."; + break; + case ErrorDef::LeaveEofOnlyOnAppend: + m_strDescription = "Warning:LEAVEEOF flag can only be used in APPEND mode."; + m_strFunction = "File::Open"; + m_strFix = "Remove the LEAVEEOF flag or open file in APPEND mode."; + break; + case ErrorDef::NoModeSpecified: + m_strDescription = "No open mode specified."; + m_strFunction = "File::Open"; + m_strFix = "You must specify READ, WRITE or APPEND to open a file."; + break; + case ErrorDef::NoNotOpenCmd: + m_strDescription = "NOTOPEN cannot be used as an open file flag."; + m_strFunction = "File::Open"; + m_strFix = "Remove the NOTOPEN flag."; + break; + case ErrorDef::NoSeqAndRandom: + m_strDescription = "Cannot open file in both SEQUENTIAL and RANDOM access modes."; + m_strFunction = "File::Open"; + m_strFix = "Choose either SEQUENTIAL or RANDOM mode to open file in."; + break; + case ErrorDef::CannotCreateFont: + m_strDescription = "Cannot create default font."; + m_strFunction = "RenderDX::Initialize"; + m_strFix = "DirectX fonts are not supported for some reason."; + break; + case ErrorDef::CannotCreateSprite: + m_strDescription = "Cannot create default sprite."; + m_strFunction = "RenderDX::Initialize"; + m_strFix = "DirectX sprites are not supported for some reason."; + break; + case ErrorDef::CannotAddImage: + m_strDescription = "Cannot create image on video memory."; + m_strFunction = "RenderDX::AddImage"; + m_strFix = "DirectX was unable to create hardware texture for the image."; + break; + case ErrorDef::CannotUpdateImage: + m_strDescription = "Cannot update image data on video memory."; + m_strFunction = "RenderDX::UpdateImage"; + m_strFix = "DirectX was unable to modify hardware texture for the image."; + break; + case ErrorDef::CannotOpenFile: + #if defined(BUILD_VSNET) + m_strDescription = strerror( errno ); + #else + m_strDescription = ""; // should replace with Mac general error code + #endif + m_strFunction = "File::Open"; + m_strFix = ""; + break; + case ErrorDef::ImageLoadError: + m_strDescription = "Unable to load image."; + m_strFunction = "ImageX::Load"; + m_strFix = ""; + break; + default: + char msg[500]; + sprintf (msg, "%d", (int) err ); + m_strDescription = "Undefined error: "; + m_strDescription += msg; + m_strSubsystem = "Undefined error."; + m_strFix = "Error must be given a description and fix message."; + break; + }; +} +*/ + + + +#ifdef MEMORY_DEBUG + + // User-defined operator new. + void *operator new( size_t stSize ) + { + void* pvMem = malloc( stSize ); + debug.Printf ( "NEW %p (%d bytes)\n", pvMem, stSize ); + return pvMem; + } + + // User-defined operator delete. + void operator delete( void *pvMem ) + { + debug.Printf ( "DELETE %p\n", pvMem ); + free ( pvMem ); + } #endif \ No newline at end of file diff --git a/Extras/sph/common/mesh.cpp b/Extras/sph/common/mesh.cpp index 46b204528..af3849c6d 100644 --- a/Extras/sph/common/mesh.cpp +++ b/Extras/sph/common/mesh.cpp @@ -1,955 +1,955 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 -#include "mesh.h" -#include "mdebug.h" -//#include "mfile.h" - -//#include "event.h" - -#include - -#define DEGtoRAD (3.141592/180.0) - -bool Mesh::mbInitStatic = false; -int Mesh::miBufSize[MAX_MFORMAT][MAX_BFORMAT]; - -Mesh::Mesh () -{ - debug.SendToConsole ( true ); - - m_Mform = MFormat::UDef; - m_CurrF = 0; - m_Vbuf = BUF_UNDEF; - m_Ebuf = BUF_UNDEF; - m_Fbuf = BUF_UNDEF; -} - -Mesh& Mesh::operator= ( Mesh& src ) -{ - CopyBuffers ( src ); - CopyAttributes ( src ); - m_Mform = src.GetMeshBufs ( m_Vbuf, m_Ebuf, m_Fbuf ); - return *this; -} - -void Mesh::InitStatic () -{ - mbInitStatic = true; - miBufSize[ (int) FVF ][ (int) BVert ] = sizeof ( VertFVF ); - miBufSize[ (int) FVF ][ (int) BFace ] = sizeof ( FaceFVF ); - miBufSize[ (int) FVF ][ (int) BEdge ] = 0; - miBufSize[ (int) CM ][ (int) BVert ] = sizeof ( VertCM ); - miBufSize[ (int) CM ][ (int) BEdge ] = sizeof ( EdgeCM ); - miBufSize[ (int) CM ][ (int) BFace ] = sizeof ( FaceCM ); - -} - -/*void Mesh::onUpdate ( objData dat, mint::Event* e ) -{ - uchar dtype; - hval num; - hval max; - long size; - ushort stride; - int num_buf; - - switch ( dat ) { - case 'full': - ClearBuffers (); - ClearAttributes (); - - m_Mform = (MFormat) e->getUChar (); - m_Vbuf = e->getUChar (); - m_Ebuf = e->getUChar (); - m_Fbuf = e->getUChar (); - num_buf = e->getInt (); - for (int b=0; b < num_buf; b++) { - dtype = e->getUChar (); - stride = e->getUShort (); - num = e->getInt (); - max = e->getInt (); - AddBuffer ( dtype, stride, max ); - e->getMem ( mBuf[b].data, num * mBuf[b].stride ); - mBuf[b].num = num; - } - - mHeapNum = e->getInt (); - mHeapMax = e->getInt (); - mHeapFree = e->getInt (); - mHeap = new hval[mHeapMax]; - e->getMem ( (char*) mHeap, mHeapNum * sizeof(hval) ); - break; - }; -} - -void Mesh::UpdateMesh () -{ - int s = GetSize () + (mBuf.size()+1)*4*sizeof(int); - mint::Event* e = updateStart ( 'full', s ); - - e->attachUChar ( (char) m_Mform ) ; - e->attachUChar ( (char) m_Vbuf ); - e->attachUChar ( (char) m_Ebuf ); - e->attachUChar ( (char) m_Fbuf ); - e->attachInt ( mBuf.size() ); - for (int b=0; b < mBuf.size(); b++) { - e->attachUChar ( mBuf[b].dtype ); - e->attachUShort ( mBuf[b].stride ); - e->attachInt ( mBuf[b].num ); - e->attachInt ( mBuf[b].max ); - e->attachMem ( mBuf[b].data, mBuf[b].num * mBuf[b].stride ); - } - e->attachInt ( mHeapNum ); - e->attachInt ( mHeapMax ); - e->attachInt ( mHeapFree ); - e->attachMem ( (char*) mHeap, mHeapNum * sizeof(hval) ); - - updateEnd ( e ); -} -*/ - -//------------------------------------------------------------------ FVF - Face-vertex-face Mesh -void Mesh::CreateFVF () -{ - if ( !mbInitStatic ) InitStatic (); - SetFuncFVF (); - - m_Mform = FVF; - m_Vbuf = AddBuffer ( (uchar) BVert, BufSize( FVF, BVert ), 64 ); - m_Fbuf = AddBuffer ( (uchar) BFace, BufSize( FVF, BFace ), 64 ); - AddAttribute ( m_Vbuf, "pos", sizeof ( AttrPos ), false ); - AddAttribute ( m_Vbuf, "norm", sizeof ( AttrNorm ) ); - - AddHeap ( 128 ); -} - -void Mesh::ClearFVF () -{ - ResetBuffer ( 0, mBuf[0].max ); - ResetBuffer ( 1, mBuf[0].max ); - - ResetHeap (); -} - -void Mesh::SmoothFVF ( int iter ) -{ - Vector3DF norm, side; - int cnt; - FaceFVF* f; - VertFVF *v1, *v2, *v3; - AttrPos* face_pos; - face_pos = new AttrPos[ NumFace() ]; - - for (int j=0; j < iter; j++) { - // Compute centroid of all faces - for (int n=0; n < NumFace(); n++) { - f = GetFaceFVF ( n ); - v1 = GetVertFVF(f->v1); v2 = GetVertFVF(f->v2); v3 = GetVertFVF(f->v3); - face_pos[n].x = ( v1->x + v2->x + v3->x ) / 3.0; - face_pos[n].y = ( v1->y + v2->y + v3->y ) / 3.0; - face_pos[n].z = ( v1->z + v2->z + v3->z ) / 3.0; - } - // Compute new vertex positions - int cnt; - Vector3DF vec; - for (int n=0; n < NumVert(); n++) { - v1 = GetVertFVF ( n ); - vec.Set (0,0,0); - hval* fptr = mHeap + v1->flist.pos; - for (int j=0; j < v1->flist.cnt; j++) { - vec.x += face_pos[ (*fptr) ].x; - vec.y += face_pos[ (*fptr) ].y; - vec.z += face_pos[ (*fptr) ].z; - fptr++; - } - v1->x = vec.x / (float) v1->flist.cnt; - v1->y = vec.y / (float) v1->flist.cnt; - v1->z = vec.z / (float) v1->flist.cnt; - } - } - delete face_pos; -} - -void Mesh::SetNormalFVF ( int n, Vector3DF norm ) -{ - VertFVF* v1; - AttrNorm* vn; - int noff = GetAttrOffset ( "norm" ); - v1 = GetVertFVF ( n ); - vn = (AttrNorm* ) ((char*) v1 + noff ); - vn->nx = norm.x; - vn->ny = norm.y; - vn->nz = norm.z; -} - - -void Mesh::SetColorFVF ( int n, DWORD clr ) -{ - VertFVF* v1; - AttrClr* vc; - int coff = GetAttrOffset ( "color" ); - if ( coff == -1 ) return; - v1 = GetVertFVF ( n ); - vc = (AttrClr* ) ((char*) v1 + coff ); - vc->clr = clr; -} -void Mesh::ComputeNormalsFVF () -{ - Vector3DF norm, side; - FaceFVF* f; - VertFVF *v1, *v2, *v3, *v4; - AttrNorm* vn; - AttrNorm* face_norms; - face_norms = new AttrNorm[ NumFace() ]; - - // Clear vertex normals - int noff = GetAttrOffset ( "norm" ); - for (int n=0; n < NumVert(); n++) { - v1 = GetVertFVF ( n ); - vn = (AttrNorm*) ((char*) v1 + noff); - vn->nx = 0; - vn->ny = 0; - vn->nz = 0; - } - - // Compute normals of all faces - for (int n=0; n < NumFace(); n++) { - f = GetFaceFVF ( n ); - v1 = GetVertFVF(f->v1); v2 = GetVertFVF(f->v2); v3 = GetVertFVF(f->v3); - side = Vector3DF ( v2->x, v2->y, v2->z ); - side -= Vector3DF ( v1->x, v1->y, v1->z ); - side.Normalize (); - norm = Vector3DF ( v3->x, v3->y, v3->z ); - norm -= Vector3DF ( v1->x, v1->y, v1->z ); - norm.Normalize (); - norm.Cross ( side ); - face_norms[n].nx = norm.x; - face_norms[n].ny = norm.y; - face_norms[n].nz = norm.z; - vn = (AttrNorm*) ((char*) v1 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; - vn = (AttrNorm*) ((char*) v2 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; - vn = (AttrNorm*) ((char*) v3 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; - if ( f->v4 != -1 ) { - v4 = GetVertFVF(f->v4); - vn = (AttrNorm*) ((char*) v4 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; - } - } - - // Normalize vertex normals - Vector3DF vec; - for (int n=0; n < NumVert(); n++) { - v1 = GetVertFVF ( n ); - vn = (AttrNorm*) ((char*) v1 + noff); - vec.Set ( vn->nx, vn->ny, vn->nz ); - vec.Normalize (); - vn->nx = vec.x; - vn->ny = vec.y; - vn->nz = vec.z; - } - - // Compute normal of a vertex from surrounding faces (slow method) - /*int cnt; - for (int n=0; n < NumVert(); n++) { - v1 = GetVertFVF ( n ); - vn = (VertNorm*) GetExtraFVF ( v1 ); - cnt = 0; - vn->nx = 0; vn->ny = 0; vn->nz = 0; - hval* fptr = mHeap + v1->flist.pos; - for (int j=0; j < v1->flist.cnt; j++) { - vn->nx += face_norms[ (*fptr) ].nx; - vn->ny += face_norms[ (*fptr) ].ny; - vn->nz += face_norms[ (*fptr) ].nz; - cnt++; - fptr++; - } - vn->nx /= (float) cnt; - vn->ny /= (float) cnt; - vn->nz /= (float) cnt; - }*/ - - delete face_norms; -} - -void Mesh::SetFuncFVF () -{ - m_AddVertFunc = &Mesh::AddVertFVF; - m_AddFaceFast3Func = &Mesh::AddFaceFast3FVF; - m_AddFaceFast4Func = &Mesh::AddFaceFast4FVF; -} - -xref Mesh::AddFaceFast3FVF ( xref v1, xref v2, xref v3 ) -{ - xref fNdx; - FaceFVF* f = (FaceFVF*) AddElem ( m_Fbuf, fNdx ); - f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = -1; - AddRef ( fNdx, GetVertFVF(v1)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertFVF(v2)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertFVF(v3)->flist, FACE_DELTA ); - return fNdx; -} -xref Mesh::AddFaceFast4FVF ( xref v1, xref v2, xref v3, xref v4 ) -{ - xref fNdx; - FaceFVF* f = (FaceFVF*) AddElem ( m_Fbuf, fNdx ); - f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = v4; - AddRef ( fNdx, GetVertFVF(v1)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertFVF(v2)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertFVF(v3)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertFVF(v4)->flist, FACE_DELTA ); - return fNdx; -} -xref Mesh::AddVertFVF ( float x, float y, float z ) -{ - xref ndx; - VertFVF* v = (VertFVF*) AddElem ( m_Vbuf, ndx ); - v->x = x; v->y = y; v->z = z; - ClearRefs ( v->flist ); - return ndx; -} - -void Mesh::DebugFVF () -{ - int n; - int j; - VertFVF* v; - FaceFVF* f; - debug.Printf ( "-- MESH --\n"); - - debug.Printf ( "-- verts\n" ); - for (n=0; n < NumVert(); n++) { - v = GetVertFVF(n); - debug.Printf ( "%d: (%2.1f,%2.1f,%2.1f) f:%d %d{", n, v->x, v->y, v->z, v->flist.cnt, v->flist.pos); - if ( v->flist.cnt > 0 ) { - for (j=0; j < v->flist.cnt; j++) - debug.Printf ( "%d ", *(mHeap+v->flist.pos+j) - FACE_DELTA ); - } - debug.Printf ( "}\n" ); - } - debug.Printf ( "-- faces\n" ); - for (n=0; n < NumFace(); n++) { - f = GetFaceFVF(n); - debug.Printf ( "%d: v:%d %d %d\n", n, f->v1, f->v2, f->v3); - } - - DebugHeap (); - - debug.Printf ("\n\n"); - //_getch(); -} - - -//------------------------------------------------------------------ CM - Connected Mesh -// Create Connected Mesh (CM) -void Mesh::CreateCM () -{ - if ( !mbInitStatic ) InitStatic (); - SetFuncCM (); - - m_Mform = CM; - m_Vbuf = AddBuffer ( (uchar) BVert, BufSize( CM, BVert ), 64 ); - m_Ebuf = AddBuffer ( (uchar) BEdge, BufSize ( CM, BEdge), 64 ); - m_Fbuf = AddBuffer ( (uchar) BFace, BufSize ( CM, BFace), 64 ); - AddAttribute ( m_Vbuf, "pos", sizeof(AttrPos), false ); - AddAttribute ( m_Vbuf, "norm", sizeof(AttrNorm) ); - - AddHeap ( 128 ); -} - -void Mesh::SetFuncCM () -{ - m_AddVertFunc = &Mesh::AddVertCM; - m_AddFaceFast3Func = &Mesh::AddFaceFast3CM; - m_AddFaceFast4Func = &Mesh::AddFaceFast4CM; -} - - -xref Mesh::AddVertCM ( float x, float y, float z ) -{ - xref ndx; - VertCM* v = (VertCM*) AddElem ( m_Vbuf, ndx ); - v->x = x; v->y = y; v->z = z; - ClearRefs ( v->elist ); - ClearRefs ( v->flist ); - return ndx; -} - -xref Mesh::AddFaceFast3CM ( xref v1, xref v2, xref v3 ) -{ - xref fNdx; - FaceCM* f = (FaceCM*) AddElem ( m_Fbuf, fNdx ); - f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = -1; - xref eNdx; - eNdx = AddEdgeCM ( f->v1, f->v2 ); f->e1 = eNdx; - eNdx = AddEdgeCM ( f->v2, f->v3 ); f->e2 = eNdx; - eNdx = AddEdgeCM ( f->v3, f->v1 ); f->e3 = eNdx; - AddRef ( fNdx, GetVertCM(v1)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertCM(v2)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertCM(v3)->flist, FACE_DELTA ); - return fNdx; -} -xref Mesh::AddFaceFast4CM ( xref v1, xref v2, xref v3, xref v4 ) -{ - xref fNdx; - FaceCM* f = (FaceCM*) AddElem ( m_Fbuf, fNdx ); - f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = v4; - xref eNdx; - eNdx = AddEdgeCM ( f->v1, f->v2 ); f->e1 = eNdx; - eNdx = AddEdgeCM ( f->v2, f->v3 ); f->e2 = eNdx; - eNdx = AddEdgeCM ( f->v3, f->v4 ); f->e3 = eNdx; - eNdx = AddEdgeCM ( f->v4, f->v1 ); f->e4 = eNdx; - AddRef ( fNdx, GetVertCM(v1)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertCM(v2)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertCM(v3)->flist, FACE_DELTA ); - AddRef ( fNdx, GetVertCM(v4)->flist, FACE_DELTA ); - return fNdx; -} - -xref Mesh::FindEdgeCM ( xref v1, xref v2 ) -{ - EdgeCM *pE; - VertCM *pV1; - pV1 = GetVertCM(v1); - if ( pV1->elist.cnt == 0 ) return -1; - hval* e = mHeap + pV1->elist.pos; - #ifdef MESH_DEBUG - for (int n=0; n < pV1->elist.cnt; n++) { - pE = GetEdgeCM( (*e)-EDGE_DELTA ); - if ( pE->v1 == v2 || pE->v2 == v2 ) return (*e)-EDGE_DELTA; - e++; - } - #else - for (int n=0; n < pV1->elist.cnt; n++) { - pE = GetEdgeCM( *e ); - if ( pE->v1 == v2 || pE->v2 == v2 ) return *e; - e++; - } - #endif - return -1; -} - -xref Mesh::AddEdgeCM ( xref v1, xref v2 ) -{ - xref eNdx = FindEdgeCM ( v1, v2 ); - EdgeCM* e = GetEdgeCM(eNdx); - if ( eNdx == -1 ) { - e = (EdgeCM*) AddElem ( m_Ebuf, eNdx ); - e->f1 = 0; - e->f2 = 0; - e->v1 = v1; - e->v2 = v2; - AddRef ( eNdx, GetVertCM(v1)->elist, EDGE_DELTA ); - AddRef ( eNdx, GetVertCM(v2)->elist, EDGE_DELTA ); - } - return eNdx; -} - -void Mesh::DebugCM () -{ - int n; - int j; - VertCM* v; - EdgeCM* e; - FaceCM* f; - debug.Printf ( "-- MESH --\n"); - - debug.Printf ( "-- verts\n" ); - for (n=0; n < NumVert(); n++) { - v = GetVertCM(n); - debug.Printf ( "%d: (%2.1f,%2.1f,%2.1f) e:%d %d{", n, v->x, v->y, v->z, v->elist.cnt, v->elist.pos); - if ( v->elist.cnt > 0 ) { - for (j=0; j < v->elist.cnt; j++) - debug.Printf ( "%d ", *(mHeap+v->elist.pos+j) - EDGE_DELTA ); - } - debug.Printf ( "}, f:%d %d{", v->flist.cnt, v->flist.pos); - if ( v->flist.cnt > 0 ) { - for (j=0; j < v->flist.cnt; j++) - debug.Printf ( "%d ", *(mHeap+v->flist.pos+j) - FACE_DELTA ); - } - debug.Printf ( "}\n" ); - } - - debug.Printf ( "-- edges\n" ); - for (n=0; n < NumEdge(); n++) { - e = GetEdgeCM (n); - debug.Printf ( "%d: v:%d %d, f:%d %d\n", n, e->v1, e->v2, e->f1, e->f2 ); - } - - debug.Printf ( "-- faces\n" ); - for (n=0; n < NumFace(); n++) { - f = GetFaceCM(n); - debug.Printf ( "%d: v:%d %d %d, e:%d %d %d\n", n, f->v1, f->v2, f->v3, f->e1, f->e2, f->e3 ); - } - - - hval* pVal = mHeap; - debug.Printf ( "-- heap (size: %d, max: %d, free: %04d)\n", mHeapNum, mHeapMax, mHeapFree ); - for (n=0; n < mHeapNum; n++) { - if ( (n % 8) == 0 ) debug.Printf ( "\n[%04d] ", n ); - #ifdef MESH_DEBUG - if ( *pVal == 0 ) { - debug.Printf ( "00000 "); - } else if ( *pVal == (hval) 0xFFFF ) { - debug.Printf ( "----- "); - } else if ( *pVal >= VERT_DELTA && *pVal < EDGE_DELTA ) { - debug.Printf ( "v%04d ", *pVal - VERT_DELTA ); - } else if ( *pVal >= EDGE_DELTA && *pVal < FACE_DELTA ) { - debug.Printf ( "e%04d ", *pVal - EDGE_DELTA ); - } else if ( *pVal >= FACE_DELTA ) { - debug.Printf ( "f%04d ", *pVal - FACE_DELTA ); - } else { - debug.Printf ( "H%04d ", (int) *pVal ); - } - #else - debug.Printf ( "%05d ", (int) *pVal ); - #endif - pVal++; - } - - debug.Printf ("\n\n"); - //_getch(); -} - -void Mesh::DebugHeap () -{ - hval* pVal = mHeap; - debug.Printf ( "-- heap (size: %d, max: %d, free: %04d)\n", mHeapNum, mHeapMax, mHeapFree ); - for (int n=0; n < mHeapNum; n++) { - if ( (n % 8) == 0 ) debug.Printf ( "\n[%04d] ", n ); - #ifdef MESH_DEBUG - if ( *pVal == 0 ) { - debug.Printf ( "00000 "); - } else if ( *pVal == (hval) 0xFFFF ) { - debug.Printf ( "----- "); - } else if ( *pVal >= VERT_DELTA && *pVal < EDGE_DELTA ) { - debug.Printf ( "v%04d ", *pVal - VERT_DELTA ); - } else if ( *pVal >= EDGE_DELTA && *pVal < FACE_DELTA ) { - debug.Printf ( "e%04d ", *pVal - EDGE_DELTA ); - } else if ( *pVal >= FACE_DELTA ) { - debug.Printf ( "f%04d ", *pVal - FACE_DELTA ); - } else { - debug.Printf ( "H%04d ", (int) *pVal ); - } - #else - debug.Printf ( "%05d ", (int) *pVal ); - #endif - pVal++; - } -} - -void Mesh::DrawVertsCM ( float* viewmat, int a, int b ) -{ - VertCM* v; - - glColor3f (1,0,0); - glLoadMatrixf ( viewmat ); - glTranslatef ( mT.x, mT.y, mT.z ); - glBegin ( GL_POINTS ); - for (int n = a; n <= b; n++) { - v = GetVertCM (n); - glVertex3f ( v->x, v->y, v->z ); - //glCallList ( m_GLObj ); - } - glEnd (); -} - -void Mesh::DrawVertsFVF ( float* viewmat, int a, int b ) -{ - VertFVF* v; - glColor3f (1,0,0); - glLoadMatrixf ( viewmat ); - glTranslatef ( mT.x, mT.y, mT.z ); - glBegin ( GL_POINTS ); - for (int n = a; n <= b; n++) { - v = GetVertFVF (n); - glVertex3f ( v->x, v->y, v->z ); - //glCallList ( m_GLObj ); - } - glEnd (); -} - -void Mesh::DrawFacesCM ( float* viewmat, int a, int b ) -{ - FaceCM* f; - VertCM* v; - AttrNorm* vn; - int noff = GetAttrOffset ( "norm" ); - glLoadMatrixf ( viewmat ); - glTranslatef ( mT.x, mT.y, mT.z ); - GLenum dm = GL_TRIANGLES; - glBegin ( dm ); - f = GetFaceCM ( a ); - for (int n = a; n <= b; n++) { - if ( f->v4 == -1 ) { - if ( dm != GL_TRIANGLES ) { glEnd (); glBegin ( GL_TRIANGLES ); dm = GL_TRIANGLES; } - v = GetVertCM(f->v1); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - v = GetVertCM(f->v2); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - v = GetVertCM(f->v3); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - } else { - if ( dm != GL_QUADS ) { glEnd (); glBegin ( GL_QUADS ); dm = GL_QUADS; } - v = GetVertCM(f->v1); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - v = GetVertCM(f->v2); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - v = GetVertCM(f->v3); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - v = GetVertCM(f->v4); vn = (AttrNorm*) ((char*) v + noff); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - } - f++; - } - glEnd (); -} - -void Mesh::DrawFacesFVF ( float* viewmat, int a, int b ) -{ - FaceFVF* f; - VertFVF* v; - AttrNorm* vn; - AttrClr* vc; - int noff = GetAttrOffset ( "norm" ); - int coff = GetAttrOffset ( "color" ); - coff = -1; - - //glLoadMatrixf ( viewmat ); - //glTranslatef ( mT.x, mT.y, mT.z ); - GLenum dm = GL_TRIANGLES; - glBegin ( dm ); - f = GetFaceFVF ( a ); - for (int n = a; n <= b; n++) { - if ( f->v4 == -1 ) { - if ( dm != GL_TRIANGLES ) { glEnd (); glBegin ( GL_TRIANGLES ); dm = GL_TRIANGLES; } - v = GetVertFVF(f->v1); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - - v = GetVertFVF(f->v2); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - - v = GetVertFVF(f->v3); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - } else { - if ( dm != GL_QUADS ) { glEnd (); glBegin ( GL_QUADS ); dm = GL_QUADS; } - v = GetVertFVF(f->v1); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - - v = GetVertFVF(f->v2); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - - v = GetVertFVF(f->v3); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - - v = GetVertFVF(f->v4); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); - if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); - glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); - } - f++; - } - glEnd (); -} - -void Mesh::DrawEdgesCM ( float* viewmat, int a, int b ) -{ - EdgeCM* e; - - glLoadMatrixf ( viewmat ); - glTranslatef ( mT.x, mT.y, mT.z ); - glBegin ( GL_LINES ); - e = GetEdgeCM ( a ); - for (int n = a; n <= b; n++) { - glVertex3f ( GetVertCM(e->v1)->x, GetVertCM(e->v1)->y, GetVertCM(e->v1)->z ); - glVertex3f ( GetVertCM(e->v2)->x, GetVertCM(e->v2)->y, GetVertCM(e->v2)->z ); - e++; - } - glEnd (); -} - -void Mesh::DrawGL ( float* viewmat ) -{ - mT.Set(0,0,0); - - switch ( m_Mform ) { - case CM: { - glDepthRange (0.001, 1.001); - //glColor3f ( 1, 0, 0 ); DrawVertsCM ( viewmat, 0, NumVert()-1 ); - glColor3f ( .6, .6, .6 ); DrawFacesCM ( viewmat, 0, NumFace()-1 ); - //glDepthRange (0.0005, 1.0005); - //glColor3f ( 1, 1, 1); DrawEdgesCM ( viewmat, 0, NumEdge()-1 ); - } break; - case FVF: { - //glColor3f (1,0,0); DrawVertsFVF ( viewmat, 0, NumVert()-1 ); - //glEnable (GL_LIGHTING); - - glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL ); - glColor4f ( .9, .9, .9, 0.75 ); DrawFacesFVF ( viewmat, 0, NumFace()-1 ); - - /*glDisable (GL_LIGHTING ); - glDepthRange (0.000, 1.00); - glPolygonMode ( GL_FRONT_AND_BACK, GL_LINE ); - glLineWidth ( 3 ); - glColor4f ( 0, 0, 0, 1.0 ); DrawFacesFVF ( viewmat, 0, NumFace()-1 ); - glEnable ( GL_LIGHTING ); - - glLineWidth ( 1); - - glDepthRange (0.0, 1.0); - glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL );*/ - - } break; - } -} - -void Mesh::DrawFaceGL ( float* viewmat ) -{ - mT.Set (0,0,0); - if ( m_CurrF < 0 ) m_CurrF = NumFace()-1; - if ( m_CurrF >= NumFace() ) m_CurrF = 0; - - switch ( m_Mform ) { - case FVF: - glDepthRange (0.0, 1.0); glColor3f (1.0, 1.0, 1.0 ); - DrawFacesFVF ( viewmat, m_CurrF, m_CurrF ); - break; - case CM: - glDepthRange (0.0, 1.0); glColor3f (1.0, 1.0, 1.0 ); - DrawFacesCM ( viewmat, m_CurrF, m_CurrF ); - break; - }; -} - -void Mesh::Measure () -{ - hval* pCurr = mHeap + mHeapFree; - int vs, es, fs, hs, hm, as, frees = 0; - vs = NumVert(); if ( vs !=0 ) vs *= GetStride(m_Vbuf); - es = NumEdge(); if ( es !=0 ) es *= GetStride(m_Ebuf); - fs = NumFace(); if ( fs !=0 ) fs *= GetStride(m_Fbuf); - hs = mHeapNum*sizeof(hval); - hm = mHeapMax*sizeof(hval); - - while ( pCurr != mHeap-1 ) { - frees += *(pCurr); - pCurr = mHeap + * (hpos*) (pCurr + FPOS); - } - frees *= sizeof(hval); - as = 0; - if ( m_Vbuf!=-1 ) as += mBuf[m_Vbuf].max * GetStride(m_Vbuf); - if ( m_Fbuf!=-1 ) as += mBuf[m_Fbuf].max * GetStride(m_Fbuf); - if ( m_Ebuf!=-1 ) as += mBuf[m_Ebuf].max * GetStride(m_Ebuf); - as += hm; - - debug.Printf ( "NumVert: %07.1fk (%d)\n", vs/1000.0, NumVert() ); - debug.Printf ( "NumFace: %07.1fk (%d)\n", fs/1000.0, NumFace() ); - debug.Printf ( "NumEdge: %07.1fk (%d)\n", es/1000.0, NumEdge() ); - debug.Printf ( "Heap Size: %07.1fk (%d)\n", hs/1000.0, mHeapNum ); - debug.Printf ( "Free Size: %07.1fk\n", frees/1000.0 ); - debug.Printf ( "Heap Used: %07.1fk (%5.1f%%)\n", (hs-frees)/1000.0, (hs-frees)*100.0/(vs+es+fs+hs-frees) ); - debug.Printf ( "Heap Max: %07.1fk\n", hm/1000.0 ); - debug.Printf ( "Total Used: %07.1fk\n", (vs+es+fs+hs-frees)/1000.0 ); - debug.Printf ( "Total Alloc: %07.1fk\n", as/1000.0 ); - debug.Printf ( "Fragmentation: %f%%\n", (hm-(hs-frees))*100.0 / hm ); -} - - -/*int Mesh::GetIndex ( int b, void* v ) -{ - if ( v == 0x0 ) return -1; - return ((char*) v - (char*) mBuf[b].data) / mBuf[b].stride; -}*/ - -int Mesh::FindPlyElem ( char typ ) -{ - for (int n=0; n < m_Ply.size(); n++) { - if ( m_Ply[n]->type == typ ) return n; - } - return -1; -} - -int Mesh::FindPlyProp ( int elem, std::string name ) -{ - for (int n=0; n < m_Ply[elem]->prop_list.size(); n++) { - if ( m_Ply[elem]->prop_list[n].name.compare ( name)==0 ) - return n; - } - return -1; -} - -void Mesh::LoadPly ( char* fname, float s ) -{ -/* int m_PlyCnt; - float m_PlyData[40]; - char buf[1000]; - char bword[1000]; - std::string word; - Buffer b(1000); - int vnum, fnum, elem, cnt; - char typ; - - if ( m_Mform == MFormat::UDef ) - CreateFVF (); - - m_File.Open ( fname, FILE_READ | FILE_SEQUENTIAL ); - if ( !m_File.Valid() ) { - error.PrintF ( "mesh", "Could not find file: %s\n", fname ); - error.Exit (); - } - - // Read header - m_File.ReadLine ( buf, 1000 ); - b.ReadWord ( buf, bword ); word = bword; - if ( word.compare("ply" )!=0 ) { - error.PrintF ( "Not a ply file. %s\n", fname ); - error.Exit (); - } - - debug.Printf ( "Reading PLY.\n" ); - while ( m_File.ReadLine ( buf, 1000 ) == FILE_STATUS_OK ) { - b.ReadWord ( buf, bword ); - word = bword; - if ( word.compare("comment" )!=0 ) { - if ( word.compare("end_header")==0 ) break; - if ( word.compare("property")==0 ) { - b.ReadWord ( buf, bword ); - word = bword; - if ( word.compare("float")==0 ) typ = PLY_FLOAT; - if ( word.compare("float16")==0 ) typ = PLY_FLOAT; - if ( word.compare("float32")==0 ) typ = PLY_FLOAT; - if ( word.compare("int8")==0 ) typ = PLY_INT; - if ( word.compare("uint8")==0 ) typ = PLY_UINT; - if ( word.compare("list")==0) { - typ = PLY_LIST; - b.ReadWord ( buf, bword ); - b.ReadWord ( buf, bword ); - } - b.ReadWord ( buf, bword ); - word = bword; - AddPlyProperty ( typ, word ); - } - if ( word.compare("element" )==0 ) { - b.ReadWord ( buf, bword); word = bword; - if ( word.compare("vertex")==0 ) { - b.ReadWord ( buf, bword); - vnum = atoi ( bword ); - debug.Printf ( " Verts: %d\n", vnum ); - AddPlyElement ( PLY_VERTS, vnum ); - } - if ( word.compare("face")==0 ) { - b.ReadWord ( buf, bword); - fnum = atoi ( bword ); - debug.Printf ( " Faces: %d\n", fnum ); - AddPlyElement ( PLY_FACES, fnum ); - } - } - } - } - - // Read data - int xi, yi, zi; - debug.Printf ( " Reading verts..\n" ); - elem = FindPlyElem ( PLY_VERTS ); - xi = FindPlyProp ( elem, "x" ); - yi = FindPlyProp ( elem, "y" ); - zi = FindPlyProp ( elem, "z" ); - if ( elem == -1 || xi == -1 || yi == -1 || zi == -1 ) { - debug.Printf ( "ERROR: Vertex data not found.\n" ); - exit(-1); - } - for (int n=0; n < m_Ply[elem]->num; n++) { - m_File.ReadLine ( buf, 1000 ); - for (int j=0; j < m_Ply[elem]->prop_list.size(); j++) { - b.ReadWord ( buf, bword ); - m_PlyData[ j ] = atof ( bword ); - } - AddVert ( m_PlyData[xi]*s, m_PlyData[zi]*s, m_PlyData[yi]*s ); - } - - debug.Printf ( " Reading faces..\n" ); - elem = FindPlyElem ( PLY_FACES ); - xi = FindPlyProp ( elem, "vertex_indices" ); - if ( elem == -1 || xi == -1 ) { - debug.Printf ( "ERROR: Face data not found.\n" ); - exit(-1); - } - for (int n=0; n < m_Ply[elem]->num; n++) { - m_File.ReadLine ( buf, 1000 ); - m_PlyCnt = 0; - for (int j=0; j < m_Ply[elem]->prop_list.size(); j++) { - if ( m_Ply[elem]->prop_list[j].type == PLY_LIST ) { - b.ReadWord ( buf, bword ); - cnt = atoi ( bword ); - m_PlyData[ m_PlyCnt++ ] = cnt; - for (int c =0; c < cnt; c++) { - b.ReadWord ( buf, bword ); - m_PlyData[ m_PlyCnt++ ] = atof ( bword ); - } - } else { - b.ReadWord ( buf, bword ); - m_PlyData[ m_PlyCnt++ ] = atof ( bword ); - } - } - if ( m_PlyData[xi] == 3 ) { - //debug.Printf ( " Face: %d, %d, %d\n", (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3] ); - AddFaceFast ( (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3] ); - } - - if ( m_PlyData[xi] == 4 ) { - //debug.Printf ( " Face: %d, %d, %d, %d\n", (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3], (int) m_PlyData[xi+4]); - AddFaceFast ( (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3], (int) m_PlyData[xi+4] ); - } - } - - Measure (); - ComputeNormalsFVF (); // !-- should be abstracted -*/ - - // UpdateMesh (); -} - -void Mesh::AddPlyElement ( char typ, int n ) -{ - debug.Printf ( " Element: %d, %d\n", typ, n ); - PlyElement* p = new PlyElement; - p->num = n; - p->type = typ; - p->prop_list.clear (); - m_PlyCurrElem = m_Ply.size(); - m_Ply.push_back ( p ); -} - -void Mesh::AddPlyProperty ( char typ, std::string name ) -{ - debug.Printf ( " Property: %d, %s\n", typ, name.c_str() ); - PlyProperty p; - p.name = name; - p.type = typ; - m_Ply [ m_PlyCurrElem ]->prop_list.push_back ( p ); +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 +#include "mesh.h" +#include "mdebug.h" +//#include "mfile.h" + +//#include "event.h" + +#include + +#define DEGtoRAD (3.141592/180.0) + +bool Mesh::mbInitStatic = false; +int Mesh::miBufSize[MAX_MFORMAT][MAX_BFORMAT]; + +Mesh::Mesh () +{ + debug.SendToConsole ( true ); + + m_Mform = MFormat::UDef; + m_CurrF = 0; + m_Vbuf = BUF_UNDEF; + m_Ebuf = BUF_UNDEF; + m_Fbuf = BUF_UNDEF; +} + +Mesh& Mesh::operator= ( Mesh& src ) +{ + CopyBuffers ( src ); + CopyAttributes ( src ); + m_Mform = src.GetMeshBufs ( m_Vbuf, m_Ebuf, m_Fbuf ); + return *this; +} + +void Mesh::InitStatic () +{ + mbInitStatic = true; + miBufSize[ (int) FVF ][ (int) BVert ] = sizeof ( VertFVF ); + miBufSize[ (int) FVF ][ (int) BFace ] = sizeof ( FaceFVF ); + miBufSize[ (int) FVF ][ (int) BEdge ] = 0; + miBufSize[ (int) CM ][ (int) BVert ] = sizeof ( VertCM ); + miBufSize[ (int) CM ][ (int) BEdge ] = sizeof ( EdgeCM ); + miBufSize[ (int) CM ][ (int) BFace ] = sizeof ( FaceCM ); + +} + +/*void Mesh::onUpdate ( objData dat, mint::Event* e ) +{ + uchar dtype; + hval num; + hval max; + long size; + ushort stride; + int num_buf; + + switch ( dat ) { + case 'full': + ClearBuffers (); + ClearAttributes (); + + m_Mform = (MFormat) e->getUChar (); + m_Vbuf = e->getUChar (); + m_Ebuf = e->getUChar (); + m_Fbuf = e->getUChar (); + num_buf = e->getInt (); + for (int b=0; b < num_buf; b++) { + dtype = e->getUChar (); + stride = e->getUShort (); + num = e->getInt (); + max = e->getInt (); + AddBuffer ( dtype, stride, max ); + e->getMem ( mBuf[b].data, num * mBuf[b].stride ); + mBuf[b].num = num; + } + + mHeapNum = e->getInt (); + mHeapMax = e->getInt (); + mHeapFree = e->getInt (); + mHeap = new hval[mHeapMax]; + e->getMem ( (char*) mHeap, mHeapNum * sizeof(hval) ); + break; + }; +} + +void Mesh::UpdateMesh () +{ + int s = GetSize () + (mBuf.size()+1)*4*sizeof(int); + mint::Event* e = updateStart ( 'full', s ); + + e->attachUChar ( (char) m_Mform ) ; + e->attachUChar ( (char) m_Vbuf ); + e->attachUChar ( (char) m_Ebuf ); + e->attachUChar ( (char) m_Fbuf ); + e->attachInt ( mBuf.size() ); + for (int b=0; b < mBuf.size(); b++) { + e->attachUChar ( mBuf[b].dtype ); + e->attachUShort ( mBuf[b].stride ); + e->attachInt ( mBuf[b].num ); + e->attachInt ( mBuf[b].max ); + e->attachMem ( mBuf[b].data, mBuf[b].num * mBuf[b].stride ); + } + e->attachInt ( mHeapNum ); + e->attachInt ( mHeapMax ); + e->attachInt ( mHeapFree ); + e->attachMem ( (char*) mHeap, mHeapNum * sizeof(hval) ); + + updateEnd ( e ); +} +*/ + +//------------------------------------------------------------------ FVF - Face-vertex-face Mesh +void Mesh::CreateFVF () +{ + if ( !mbInitStatic ) InitStatic (); + SetFuncFVF (); + + m_Mform = FVF; + m_Vbuf = AddBuffer ( (uchar) BVert, BufSize( FVF, BVert ), 64 ); + m_Fbuf = AddBuffer ( (uchar) BFace, BufSize( FVF, BFace ), 64 ); + AddAttribute ( m_Vbuf, "pos", sizeof ( AttrPos ), false ); + AddAttribute ( m_Vbuf, "norm", sizeof ( AttrNorm ) ); + + AddHeap ( 128 ); +} + +void Mesh::ClearFVF () +{ + ResetBuffer ( 0, mBuf[0].max ); + ResetBuffer ( 1, mBuf[0].max ); + + ResetHeap (); +} + +void Mesh::SmoothFVF ( int iter ) +{ + Vector3DF norm, side; + int cnt; + FaceFVF* f; + VertFVF *v1, *v2, *v3; + AttrPos* face_pos; + face_pos = new AttrPos[ NumFace() ]; + + for (int j=0; j < iter; j++) { + // Compute centroid of all faces + for (int n=0; n < NumFace(); n++) { + f = GetFaceFVF ( n ); + v1 = GetVertFVF(f->v1); v2 = GetVertFVF(f->v2); v3 = GetVertFVF(f->v3); + face_pos[n].x = ( v1->x + v2->x + v3->x ) / 3.0; + face_pos[n].y = ( v1->y + v2->y + v3->y ) / 3.0; + face_pos[n].z = ( v1->z + v2->z + v3->z ) / 3.0; + } + // Compute new vertex positions + int cnt; + Vector3DF vec; + for (int n=0; n < NumVert(); n++) { + v1 = GetVertFVF ( n ); + vec.Set (0,0,0); + hval* fptr = mHeap + v1->flist.pos; + for (int j=0; j < v1->flist.cnt; j++) { + vec.x += face_pos[ (*fptr) ].x; + vec.y += face_pos[ (*fptr) ].y; + vec.z += face_pos[ (*fptr) ].z; + fptr++; + } + v1->x = vec.x / (float) v1->flist.cnt; + v1->y = vec.y / (float) v1->flist.cnt; + v1->z = vec.z / (float) v1->flist.cnt; + } + } + delete face_pos; +} + +void Mesh::SetNormalFVF ( int n, Vector3DF norm ) +{ + VertFVF* v1; + AttrNorm* vn; + int noff = GetAttrOffset ( "norm" ); + v1 = GetVertFVF ( n ); + vn = (AttrNorm* ) ((char*) v1 + noff ); + vn->nx = norm.x; + vn->ny = norm.y; + vn->nz = norm.z; +} + + +void Mesh::SetColorFVF ( int n, DWORD clr ) +{ + VertFVF* v1; + AttrClr* vc; + int coff = GetAttrOffset ( "color" ); + if ( coff == -1 ) return; + v1 = GetVertFVF ( n ); + vc = (AttrClr* ) ((char*) v1 + coff ); + vc->clr = clr; +} +void Mesh::ComputeNormalsFVF () +{ + Vector3DF norm, side; + FaceFVF* f; + VertFVF *v1, *v2, *v3, *v4; + AttrNorm* vn; + AttrNorm* face_norms; + face_norms = new AttrNorm[ NumFace() ]; + + // Clear vertex normals + int noff = GetAttrOffset ( "norm" ); + for (int n=0; n < NumVert(); n++) { + v1 = GetVertFVF ( n ); + vn = (AttrNorm*) ((char*) v1 + noff); + vn->nx = 0; + vn->ny = 0; + vn->nz = 0; + } + + // Compute normals of all faces + for (int n=0; n < NumFace(); n++) { + f = GetFaceFVF ( n ); + v1 = GetVertFVF(f->v1); v2 = GetVertFVF(f->v2); v3 = GetVertFVF(f->v3); + side = Vector3DF ( v2->x, v2->y, v2->z ); + side -= Vector3DF ( v1->x, v1->y, v1->z ); + side.Normalize (); + norm = Vector3DF ( v3->x, v3->y, v3->z ); + norm -= Vector3DF ( v1->x, v1->y, v1->z ); + norm.Normalize (); + norm.Cross ( side ); + face_norms[n].nx = norm.x; + face_norms[n].ny = norm.y; + face_norms[n].nz = norm.z; + vn = (AttrNorm*) ((char*) v1 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; + vn = (AttrNorm*) ((char*) v2 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; + vn = (AttrNorm*) ((char*) v3 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; + if ( f->v4 != -1 ) { + v4 = GetVertFVF(f->v4); + vn = (AttrNorm*) ((char*) v4 + noff); vn->nx += norm.x; vn->ny += norm.y; vn->nz += norm.z; + } + } + + // Normalize vertex normals + Vector3DF vec; + for (int n=0; n < NumVert(); n++) { + v1 = GetVertFVF ( n ); + vn = (AttrNorm*) ((char*) v1 + noff); + vec.Set ( vn->nx, vn->ny, vn->nz ); + vec.Normalize (); + vn->nx = vec.x; + vn->ny = vec.y; + vn->nz = vec.z; + } + + // Compute normal of a vertex from surrounding faces (slow method) + /*int cnt; + for (int n=0; n < NumVert(); n++) { + v1 = GetVertFVF ( n ); + vn = (VertNorm*) GetExtraFVF ( v1 ); + cnt = 0; + vn->nx = 0; vn->ny = 0; vn->nz = 0; + hval* fptr = mHeap + v1->flist.pos; + for (int j=0; j < v1->flist.cnt; j++) { + vn->nx += face_norms[ (*fptr) ].nx; + vn->ny += face_norms[ (*fptr) ].ny; + vn->nz += face_norms[ (*fptr) ].nz; + cnt++; + fptr++; + } + vn->nx /= (float) cnt; + vn->ny /= (float) cnt; + vn->nz /= (float) cnt; + }*/ + + delete face_norms; +} + +void Mesh::SetFuncFVF () +{ + m_AddVertFunc = &Mesh::AddVertFVF; + m_AddFaceFast3Func = &Mesh::AddFaceFast3FVF; + m_AddFaceFast4Func = &Mesh::AddFaceFast4FVF; +} + +xref Mesh::AddFaceFast3FVF ( xref v1, xref v2, xref v3 ) +{ + xref fNdx; + FaceFVF* f = (FaceFVF*) AddElem ( m_Fbuf, fNdx ); + f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = -1; + AddRef ( fNdx, GetVertFVF(v1)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertFVF(v2)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertFVF(v3)->flist, FACE_DELTA ); + return fNdx; +} +xref Mesh::AddFaceFast4FVF ( xref v1, xref v2, xref v3, xref v4 ) +{ + xref fNdx; + FaceFVF* f = (FaceFVF*) AddElem ( m_Fbuf, fNdx ); + f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = v4; + AddRef ( fNdx, GetVertFVF(v1)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertFVF(v2)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertFVF(v3)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertFVF(v4)->flist, FACE_DELTA ); + return fNdx; +} +xref Mesh::AddVertFVF ( float x, float y, float z ) +{ + xref ndx; + VertFVF* v = (VertFVF*) AddElem ( m_Vbuf, ndx ); + v->x = x; v->y = y; v->z = z; + ClearRefs ( v->flist ); + return ndx; +} + +void Mesh::DebugFVF () +{ + int n; + int j; + VertFVF* v; + FaceFVF* f; + debug.Printf ( "-- MESH --\n"); + + debug.Printf ( "-- verts\n" ); + for (n=0; n < NumVert(); n++) { + v = GetVertFVF(n); + debug.Printf ( "%d: (%2.1f,%2.1f,%2.1f) f:%d %d{", n, v->x, v->y, v->z, v->flist.cnt, v->flist.pos); + if ( v->flist.cnt > 0 ) { + for (j=0; j < v->flist.cnt; j++) + debug.Printf ( "%d ", *(mHeap+v->flist.pos+j) - FACE_DELTA ); + } + debug.Printf ( "}\n" ); + } + debug.Printf ( "-- faces\n" ); + for (n=0; n < NumFace(); n++) { + f = GetFaceFVF(n); + debug.Printf ( "%d: v:%d %d %d\n", n, f->v1, f->v2, f->v3); + } + + DebugHeap (); + + debug.Printf ("\n\n"); + //_getch(); +} + + +//------------------------------------------------------------------ CM - Connected Mesh +// Create Connected Mesh (CM) +void Mesh::CreateCM () +{ + if ( !mbInitStatic ) InitStatic (); + SetFuncCM (); + + m_Mform = CM; + m_Vbuf = AddBuffer ( (uchar) BVert, BufSize( CM, BVert ), 64 ); + m_Ebuf = AddBuffer ( (uchar) BEdge, BufSize ( CM, BEdge), 64 ); + m_Fbuf = AddBuffer ( (uchar) BFace, BufSize ( CM, BFace), 64 ); + AddAttribute ( m_Vbuf, "pos", sizeof(AttrPos), false ); + AddAttribute ( m_Vbuf, "norm", sizeof(AttrNorm) ); + + AddHeap ( 128 ); +} + +void Mesh::SetFuncCM () +{ + m_AddVertFunc = &Mesh::AddVertCM; + m_AddFaceFast3Func = &Mesh::AddFaceFast3CM; + m_AddFaceFast4Func = &Mesh::AddFaceFast4CM; +} + + +xref Mesh::AddVertCM ( float x, float y, float z ) +{ + xref ndx; + VertCM* v = (VertCM*) AddElem ( m_Vbuf, ndx ); + v->x = x; v->y = y; v->z = z; + ClearRefs ( v->elist ); + ClearRefs ( v->flist ); + return ndx; +} + +xref Mesh::AddFaceFast3CM ( xref v1, xref v2, xref v3 ) +{ + xref fNdx; + FaceCM* f = (FaceCM*) AddElem ( m_Fbuf, fNdx ); + f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = -1; + xref eNdx; + eNdx = AddEdgeCM ( f->v1, f->v2 ); f->e1 = eNdx; + eNdx = AddEdgeCM ( f->v2, f->v3 ); f->e2 = eNdx; + eNdx = AddEdgeCM ( f->v3, f->v1 ); f->e3 = eNdx; + AddRef ( fNdx, GetVertCM(v1)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertCM(v2)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertCM(v3)->flist, FACE_DELTA ); + return fNdx; +} +xref Mesh::AddFaceFast4CM ( xref v1, xref v2, xref v3, xref v4 ) +{ + xref fNdx; + FaceCM* f = (FaceCM*) AddElem ( m_Fbuf, fNdx ); + f->v1 = v1; f->v2 = v2; f->v3 = v3; f->v4 = v4; + xref eNdx; + eNdx = AddEdgeCM ( f->v1, f->v2 ); f->e1 = eNdx; + eNdx = AddEdgeCM ( f->v2, f->v3 ); f->e2 = eNdx; + eNdx = AddEdgeCM ( f->v3, f->v4 ); f->e3 = eNdx; + eNdx = AddEdgeCM ( f->v4, f->v1 ); f->e4 = eNdx; + AddRef ( fNdx, GetVertCM(v1)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertCM(v2)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertCM(v3)->flist, FACE_DELTA ); + AddRef ( fNdx, GetVertCM(v4)->flist, FACE_DELTA ); + return fNdx; +} + +xref Mesh::FindEdgeCM ( xref v1, xref v2 ) +{ + EdgeCM *pE; + VertCM *pV1; + pV1 = GetVertCM(v1); + if ( pV1->elist.cnt == 0 ) return -1; + hval* e = mHeap + pV1->elist.pos; + #ifdef MESH_DEBUG + for (int n=0; n < pV1->elist.cnt; n++) { + pE = GetEdgeCM( (*e)-EDGE_DELTA ); + if ( pE->v1 == v2 || pE->v2 == v2 ) return (*e)-EDGE_DELTA; + e++; + } + #else + for (int n=0; n < pV1->elist.cnt; n++) { + pE = GetEdgeCM( *e ); + if ( pE->v1 == v2 || pE->v2 == v2 ) return *e; + e++; + } + #endif + return -1; +} + +xref Mesh::AddEdgeCM ( xref v1, xref v2 ) +{ + xref eNdx = FindEdgeCM ( v1, v2 ); + EdgeCM* e = GetEdgeCM(eNdx); + if ( eNdx == -1 ) { + e = (EdgeCM*) AddElem ( m_Ebuf, eNdx ); + e->f1 = 0; + e->f2 = 0; + e->v1 = v1; + e->v2 = v2; + AddRef ( eNdx, GetVertCM(v1)->elist, EDGE_DELTA ); + AddRef ( eNdx, GetVertCM(v2)->elist, EDGE_DELTA ); + } + return eNdx; +} + +void Mesh::DebugCM () +{ + int n; + int j; + VertCM* v; + EdgeCM* e; + FaceCM* f; + debug.Printf ( "-- MESH --\n"); + + debug.Printf ( "-- verts\n" ); + for (n=0; n < NumVert(); n++) { + v = GetVertCM(n); + debug.Printf ( "%d: (%2.1f,%2.1f,%2.1f) e:%d %d{", n, v->x, v->y, v->z, v->elist.cnt, v->elist.pos); + if ( v->elist.cnt > 0 ) { + for (j=0; j < v->elist.cnt; j++) + debug.Printf ( "%d ", *(mHeap+v->elist.pos+j) - EDGE_DELTA ); + } + debug.Printf ( "}, f:%d %d{", v->flist.cnt, v->flist.pos); + if ( v->flist.cnt > 0 ) { + for (j=0; j < v->flist.cnt; j++) + debug.Printf ( "%d ", *(mHeap+v->flist.pos+j) - FACE_DELTA ); + } + debug.Printf ( "}\n" ); + } + + debug.Printf ( "-- edges\n" ); + for (n=0; n < NumEdge(); n++) { + e = GetEdgeCM (n); + debug.Printf ( "%d: v:%d %d, f:%d %d\n", n, e->v1, e->v2, e->f1, e->f2 ); + } + + debug.Printf ( "-- faces\n" ); + for (n=0; n < NumFace(); n++) { + f = GetFaceCM(n); + debug.Printf ( "%d: v:%d %d %d, e:%d %d %d\n", n, f->v1, f->v2, f->v3, f->e1, f->e2, f->e3 ); + } + + + hval* pVal = mHeap; + debug.Printf ( "-- heap (size: %d, max: %d, free: %04d)\n", mHeapNum, mHeapMax, mHeapFree ); + for (n=0; n < mHeapNum; n++) { + if ( (n % 8) == 0 ) debug.Printf ( "\n[%04d] ", n ); + #ifdef MESH_DEBUG + if ( *pVal == 0 ) { + debug.Printf ( "00000 "); + } else if ( *pVal == (hval) 0xFFFF ) { + debug.Printf ( "----- "); + } else if ( *pVal >= VERT_DELTA && *pVal < EDGE_DELTA ) { + debug.Printf ( "v%04d ", *pVal - VERT_DELTA ); + } else if ( *pVal >= EDGE_DELTA && *pVal < FACE_DELTA ) { + debug.Printf ( "e%04d ", *pVal - EDGE_DELTA ); + } else if ( *pVal >= FACE_DELTA ) { + debug.Printf ( "f%04d ", *pVal - FACE_DELTA ); + } else { + debug.Printf ( "H%04d ", (int) *pVal ); + } + #else + debug.Printf ( "%05d ", (int) *pVal ); + #endif + pVal++; + } + + debug.Printf ("\n\n"); + //_getch(); +} + +void Mesh::DebugHeap () +{ + hval* pVal = mHeap; + debug.Printf ( "-- heap (size: %d, max: %d, free: %04d)\n", mHeapNum, mHeapMax, mHeapFree ); + for (int n=0; n < mHeapNum; n++) { + if ( (n % 8) == 0 ) debug.Printf ( "\n[%04d] ", n ); + #ifdef MESH_DEBUG + if ( *pVal == 0 ) { + debug.Printf ( "00000 "); + } else if ( *pVal == (hval) 0xFFFF ) { + debug.Printf ( "----- "); + } else if ( *pVal >= VERT_DELTA && *pVal < EDGE_DELTA ) { + debug.Printf ( "v%04d ", *pVal - VERT_DELTA ); + } else if ( *pVal >= EDGE_DELTA && *pVal < FACE_DELTA ) { + debug.Printf ( "e%04d ", *pVal - EDGE_DELTA ); + } else if ( *pVal >= FACE_DELTA ) { + debug.Printf ( "f%04d ", *pVal - FACE_DELTA ); + } else { + debug.Printf ( "H%04d ", (int) *pVal ); + } + #else + debug.Printf ( "%05d ", (int) *pVal ); + #endif + pVal++; + } +} + +void Mesh::DrawVertsCM ( float* viewmat, int a, int b ) +{ + VertCM* v; + + glColor3f (1,0,0); + glLoadMatrixf ( viewmat ); + glTranslatef ( mT.x, mT.y, mT.z ); + glBegin ( GL_POINTS ); + for (int n = a; n <= b; n++) { + v = GetVertCM (n); + glVertex3f ( v->x, v->y, v->z ); + //glCallList ( m_GLObj ); + } + glEnd (); +} + +void Mesh::DrawVertsFVF ( float* viewmat, int a, int b ) +{ + VertFVF* v; + glColor3f (1,0,0); + glLoadMatrixf ( viewmat ); + glTranslatef ( mT.x, mT.y, mT.z ); + glBegin ( GL_POINTS ); + for (int n = a; n <= b; n++) { + v = GetVertFVF (n); + glVertex3f ( v->x, v->y, v->z ); + //glCallList ( m_GLObj ); + } + glEnd (); +} + +void Mesh::DrawFacesCM ( float* viewmat, int a, int b ) +{ + FaceCM* f; + VertCM* v; + AttrNorm* vn; + int noff = GetAttrOffset ( "norm" ); + glLoadMatrixf ( viewmat ); + glTranslatef ( mT.x, mT.y, mT.z ); + GLenum dm = GL_TRIANGLES; + glBegin ( dm ); + f = GetFaceCM ( a ); + for (int n = a; n <= b; n++) { + if ( f->v4 == -1 ) { + if ( dm != GL_TRIANGLES ) { glEnd (); glBegin ( GL_TRIANGLES ); dm = GL_TRIANGLES; } + v = GetVertCM(f->v1); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + v = GetVertCM(f->v2); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + v = GetVertCM(f->v3); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + } else { + if ( dm != GL_QUADS ) { glEnd (); glBegin ( GL_QUADS ); dm = GL_QUADS; } + v = GetVertCM(f->v1); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + v = GetVertCM(f->v2); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + v = GetVertCM(f->v3); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + v = GetVertCM(f->v4); vn = (AttrNorm*) ((char*) v + noff); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + } + f++; + } + glEnd (); +} + +void Mesh::DrawFacesFVF ( float* viewmat, int a, int b ) +{ + FaceFVF* f; + VertFVF* v; + AttrNorm* vn; + AttrClr* vc; + int noff = GetAttrOffset ( "norm" ); + int coff = GetAttrOffset ( "color" ); + coff = -1; + + //glLoadMatrixf ( viewmat ); + //glTranslatef ( mT.x, mT.y, mT.z ); + GLenum dm = GL_TRIANGLES; + glBegin ( dm ); + f = GetFaceFVF ( a ); + for (int n = a; n <= b; n++) { + if ( f->v4 == -1 ) { + if ( dm != GL_TRIANGLES ) { glEnd (); glBegin ( GL_TRIANGLES ); dm = GL_TRIANGLES; } + v = GetVertFVF(f->v1); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + + v = GetVertFVF(f->v2); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + + v = GetVertFVF(f->v3); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + } else { + if ( dm != GL_QUADS ) { glEnd (); glBegin ( GL_QUADS ); dm = GL_QUADS; } + v = GetVertFVF(f->v1); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + + v = GetVertFVF(f->v2); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + + v = GetVertFVF(f->v3); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + + v = GetVertFVF(f->v4); vn = (AttrNorm*) ((char*) v + noff); vc = (AttrClr*) ((char*) v +coff); + if ( coff != -1 ) glColor4f ( RED(vc->clr), GRN(vc->clr), BLUE(vc->clr), ALPH(vc->clr) ); + glNormal3f ( vn->nx, vn->ny, vn->nz ); glVertex3f ( v->x, v->y, v->z ); + } + f++; + } + glEnd (); +} + +void Mesh::DrawEdgesCM ( float* viewmat, int a, int b ) +{ + EdgeCM* e; + + glLoadMatrixf ( viewmat ); + glTranslatef ( mT.x, mT.y, mT.z ); + glBegin ( GL_LINES ); + e = GetEdgeCM ( a ); + for (int n = a; n <= b; n++) { + glVertex3f ( GetVertCM(e->v1)->x, GetVertCM(e->v1)->y, GetVertCM(e->v1)->z ); + glVertex3f ( GetVertCM(e->v2)->x, GetVertCM(e->v2)->y, GetVertCM(e->v2)->z ); + e++; + } + glEnd (); +} + +void Mesh::DrawGL ( float* viewmat ) +{ + mT.Set(0,0,0); + + switch ( m_Mform ) { + case CM: { + glDepthRange (0.001, 1.001); + //glColor3f ( 1, 0, 0 ); DrawVertsCM ( viewmat, 0, NumVert()-1 ); + glColor3f ( .6, .6, .6 ); DrawFacesCM ( viewmat, 0, NumFace()-1 ); + //glDepthRange (0.0005, 1.0005); + //glColor3f ( 1, 1, 1); DrawEdgesCM ( viewmat, 0, NumEdge()-1 ); + } break; + case FVF: { + //glColor3f (1,0,0); DrawVertsFVF ( viewmat, 0, NumVert()-1 ); + //glEnable (GL_LIGHTING); + + glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL ); + glColor4f ( .9, .9, .9, 0.75 ); DrawFacesFVF ( viewmat, 0, NumFace()-1 ); + + /*glDisable (GL_LIGHTING ); + glDepthRange (0.000, 1.00); + glPolygonMode ( GL_FRONT_AND_BACK, GL_LINE ); + glLineWidth ( 3 ); + glColor4f ( 0, 0, 0, 1.0 ); DrawFacesFVF ( viewmat, 0, NumFace()-1 ); + glEnable ( GL_LIGHTING ); + + glLineWidth ( 1); + + glDepthRange (0.0, 1.0); + glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL );*/ + + } break; + } +} + +void Mesh::DrawFaceGL ( float* viewmat ) +{ + mT.Set (0,0,0); + if ( m_CurrF < 0 ) m_CurrF = NumFace()-1; + if ( m_CurrF >= NumFace() ) m_CurrF = 0; + + switch ( m_Mform ) { + case FVF: + glDepthRange (0.0, 1.0); glColor3f (1.0, 1.0, 1.0 ); + DrawFacesFVF ( viewmat, m_CurrF, m_CurrF ); + break; + case CM: + glDepthRange (0.0, 1.0); glColor3f (1.0, 1.0, 1.0 ); + DrawFacesCM ( viewmat, m_CurrF, m_CurrF ); + break; + }; +} + +void Mesh::Measure () +{ + hval* pCurr = mHeap + mHeapFree; + int vs, es, fs, hs, hm, as, frees = 0; + vs = NumVert(); if ( vs !=0 ) vs *= GetStride(m_Vbuf); + es = NumEdge(); if ( es !=0 ) es *= GetStride(m_Ebuf); + fs = NumFace(); if ( fs !=0 ) fs *= GetStride(m_Fbuf); + hs = mHeapNum*sizeof(hval); + hm = mHeapMax*sizeof(hval); + + while ( pCurr != mHeap-1 ) { + frees += *(pCurr); + pCurr = mHeap + * (hpos*) (pCurr + FPOS); + } + frees *= sizeof(hval); + as = 0; + if ( m_Vbuf!=-1 ) as += mBuf[m_Vbuf].max * GetStride(m_Vbuf); + if ( m_Fbuf!=-1 ) as += mBuf[m_Fbuf].max * GetStride(m_Fbuf); + if ( m_Ebuf!=-1 ) as += mBuf[m_Ebuf].max * GetStride(m_Ebuf); + as += hm; + + debug.Printf ( "NumVert: %07.1fk (%d)\n", vs/1000.0, NumVert() ); + debug.Printf ( "NumFace: %07.1fk (%d)\n", fs/1000.0, NumFace() ); + debug.Printf ( "NumEdge: %07.1fk (%d)\n", es/1000.0, NumEdge() ); + debug.Printf ( "Heap Size: %07.1fk (%d)\n", hs/1000.0, mHeapNum ); + debug.Printf ( "Free Size: %07.1fk\n", frees/1000.0 ); + debug.Printf ( "Heap Used: %07.1fk (%5.1f%%)\n", (hs-frees)/1000.0, (hs-frees)*100.0/(vs+es+fs+hs-frees) ); + debug.Printf ( "Heap Max: %07.1fk\n", hm/1000.0 ); + debug.Printf ( "Total Used: %07.1fk\n", (vs+es+fs+hs-frees)/1000.0 ); + debug.Printf ( "Total Alloc: %07.1fk\n", as/1000.0 ); + debug.Printf ( "Fragmentation: %f%%\n", (hm-(hs-frees))*100.0 / hm ); +} + + +/*int Mesh::GetIndex ( int b, void* v ) +{ + if ( v == 0x0 ) return -1; + return ((char*) v - (char*) mBuf[b].data) / mBuf[b].stride; +}*/ + +int Mesh::FindPlyElem ( char typ ) +{ + for (int n=0; n < m_Ply.size(); n++) { + if ( m_Ply[n]->type == typ ) return n; + } + return -1; +} + +int Mesh::FindPlyProp ( int elem, std::string name ) +{ + for (int n=0; n < m_Ply[elem]->prop_list.size(); n++) { + if ( m_Ply[elem]->prop_list[n].name.compare ( name)==0 ) + return n; + } + return -1; +} + +void Mesh::LoadPly ( char* fname, float s ) +{ +/* int m_PlyCnt; + float m_PlyData[40]; + char buf[1000]; + char bword[1000]; + std::string word; + Buffer b(1000); + int vnum, fnum, elem, cnt; + char typ; + + if ( m_Mform == MFormat::UDef ) + CreateFVF (); + + m_File.Open ( fname, FILE_READ | FILE_SEQUENTIAL ); + if ( !m_File.Valid() ) { + error.PrintF ( "mesh", "Could not find file: %s\n", fname ); + error.Exit (); + } + + // Read header + m_File.ReadLine ( buf, 1000 ); + b.ReadWord ( buf, bword ); word = bword; + if ( word.compare("ply" )!=0 ) { + error.PrintF ( "Not a ply file. %s\n", fname ); + error.Exit (); + } + + debug.Printf ( "Reading PLY.\n" ); + while ( m_File.ReadLine ( buf, 1000 ) == FILE_STATUS_OK ) { + b.ReadWord ( buf, bword ); + word = bword; + if ( word.compare("comment" )!=0 ) { + if ( word.compare("end_header")==0 ) break; + if ( word.compare("property")==0 ) { + b.ReadWord ( buf, bword ); + word = bword; + if ( word.compare("float")==0 ) typ = PLY_FLOAT; + if ( word.compare("float16")==0 ) typ = PLY_FLOAT; + if ( word.compare("float32")==0 ) typ = PLY_FLOAT; + if ( word.compare("int8")==0 ) typ = PLY_INT; + if ( word.compare("uint8")==0 ) typ = PLY_UINT; + if ( word.compare("list")==0) { + typ = PLY_LIST; + b.ReadWord ( buf, bword ); + b.ReadWord ( buf, bword ); + } + b.ReadWord ( buf, bword ); + word = bword; + AddPlyProperty ( typ, word ); + } + if ( word.compare("element" )==0 ) { + b.ReadWord ( buf, bword); word = bword; + if ( word.compare("vertex")==0 ) { + b.ReadWord ( buf, bword); + vnum = atoi ( bword ); + debug.Printf ( " Verts: %d\n", vnum ); + AddPlyElement ( PLY_VERTS, vnum ); + } + if ( word.compare("face")==0 ) { + b.ReadWord ( buf, bword); + fnum = atoi ( bword ); + debug.Printf ( " Faces: %d\n", fnum ); + AddPlyElement ( PLY_FACES, fnum ); + } + } + } + } + + // Read data + int xi, yi, zi; + debug.Printf ( " Reading verts..\n" ); + elem = FindPlyElem ( PLY_VERTS ); + xi = FindPlyProp ( elem, "x" ); + yi = FindPlyProp ( elem, "y" ); + zi = FindPlyProp ( elem, "z" ); + if ( elem == -1 || xi == -1 || yi == -1 || zi == -1 ) { + debug.Printf ( "ERROR: Vertex data not found.\n" ); + exit(-1); + } + for (int n=0; n < m_Ply[elem]->num; n++) { + m_File.ReadLine ( buf, 1000 ); + for (int j=0; j < m_Ply[elem]->prop_list.size(); j++) { + b.ReadWord ( buf, bword ); + m_PlyData[ j ] = atof ( bword ); + } + AddVert ( m_PlyData[xi]*s, m_PlyData[zi]*s, m_PlyData[yi]*s ); + } + + debug.Printf ( " Reading faces..\n" ); + elem = FindPlyElem ( PLY_FACES ); + xi = FindPlyProp ( elem, "vertex_indices" ); + if ( elem == -1 || xi == -1 ) { + debug.Printf ( "ERROR: Face data not found.\n" ); + exit(-1); + } + for (int n=0; n < m_Ply[elem]->num; n++) { + m_File.ReadLine ( buf, 1000 ); + m_PlyCnt = 0; + for (int j=0; j < m_Ply[elem]->prop_list.size(); j++) { + if ( m_Ply[elem]->prop_list[j].type == PLY_LIST ) { + b.ReadWord ( buf, bword ); + cnt = atoi ( bword ); + m_PlyData[ m_PlyCnt++ ] = cnt; + for (int c =0; c < cnt; c++) { + b.ReadWord ( buf, bword ); + m_PlyData[ m_PlyCnt++ ] = atof ( bword ); + } + } else { + b.ReadWord ( buf, bword ); + m_PlyData[ m_PlyCnt++ ] = atof ( bword ); + } + } + if ( m_PlyData[xi] == 3 ) { + //debug.Printf ( " Face: %d, %d, %d\n", (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3] ); + AddFaceFast ( (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3] ); + } + + if ( m_PlyData[xi] == 4 ) { + //debug.Printf ( " Face: %d, %d, %d, %d\n", (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3], (int) m_PlyData[xi+4]); + AddFaceFast ( (int) m_PlyData[xi+1], (int) m_PlyData[xi+2], (int) m_PlyData[xi+3], (int) m_PlyData[xi+4] ); + } + } + + Measure (); + ComputeNormalsFVF (); // !-- should be abstracted +*/ + + // UpdateMesh (); +} + +void Mesh::AddPlyElement ( char typ, int n ) +{ + debug.Printf ( " Element: %d, %d\n", typ, n ); + PlyElement* p = new PlyElement; + p->num = n; + p->type = typ; + p->prop_list.clear (); + m_PlyCurrElem = m_Ply.size(); + m_Ply.push_back ( p ); +} + +void Mesh::AddPlyProperty ( char typ, std::string name ) +{ + debug.Printf ( " Property: %d, %s\n", typ, name.c_str() ); + PlyProperty p; + p.name = name; + p.type = typ; + m_Ply [ m_PlyCurrElem ]->prop_list.push_back ( p ); } \ No newline at end of file diff --git a/Extras/sph/common/mesh.h b/Extras/sph/common/mesh.h index d97235fd1..71032f997 100644 --- a/Extras/sph/common/mesh.h +++ b/Extras/sph/common/mesh.h @@ -1,160 +1,160 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 DEF_MESH - #define DEF_MESH - - #include - #include - - #include "geomx.h" - #include "mesh_info.h" - #include "vector.h" - - //#include "mfile.h" - - //#define MESH_DEBUG - - #ifdef MESH_DEBUG - #define VERT_DELTA 10000 - #define EDGE_DELTA 20000 - #define FACE_DELTA 30000 - #else - #define VERT_DELTA 0 - #define EDGE_DELTA 0 - #define FACE_DELTA 0 - #endif - - #define PLY_UINT 0 - #define PLY_INT 1 - #define PLY_FLOAT 2 - #define PLY_LIST 3 - #define PLY_VERTS 4 - #define PLY_FACES 5 - - struct PlyProperty { - char type; - std::string name; - }; - struct PlyElement { - int num; - char type; // 0 = vert, 1 = face - std::vector prop_list; - }; - - class Mesh : public GeomX, public MeshInfo { - public: - Mesh (); - - //virtual objType GetType () { return 'mesh'; } - - // Distributed functions - //virtual void onUpdate ( objData dat, mint::Event* e ); - //void UpdateMesh (); - - // Generic functions - void InitStatic (); - void DrawGL ( float* viewmat ); - void DrawFaceGL ( float* viewmat ); - void Measure (); - Mesh& operator= ( Mesh& op2 ); - - // Load PLY mesh - void LoadPly ( char* fname, float s ); - void AddPlyElement ( char typ, int n ); - void AddPlyProperty ( char typ, std::string name ); - void LoadPlyVerts (); - void LoadPlyFaces (); - int FindPlyElem ( char typ ); - int FindPlyProp ( int elem, std::string name ); - - // Vertex, Face, Edge functions - xref AddVert (float x, float y, float z ) { return (this->*m_AddVertFunc) (x, y, z); } - xref AddFaceFast (xref v1, xref v2, xref v3 ) { return (this->*m_AddFaceFast3Func) (v1, v2, v3); } - xref AddFaceFast (xref v1, xref v2, xref v3, xref v4 ) { return (this->*m_AddFaceFast4Func) (v1, v2, v3, v4); } - xref (Mesh::*m_AddVertFunc) (float x, float y, float z); - xref (Mesh::*m_AddFaceFast3Func) (xref v1, xref v2, xref v3); - xref (Mesh::*m_AddFaceFast4Func) (xref v1, xref v2, xref v3, xref v4); - - int NumVert () { return NumElem ( m_Vbuf ); } - int NumEdge () { return NumElem ( m_Ebuf ); } - int NumFace () { return NumElem ( m_Fbuf ); } - - void IncFace ( int n ) { m_CurrF += n; } - void DebugHeap (); - - // FVF - Face-Vertex-Face Mesh - void CreateFVF (); - void ClearFVF (); - void SetFuncFVF (); - xref AddVertFVF ( float x, float y, float z ); - xref AddFaceFast3FVF ( xref v1, xref v2, xref v3 ); - xref AddFaceFast4FVF ( xref v1, xref v2, xref v3, xref v4 ); - VertFVF* GetVertFVF ( int n ) { return (VertFVF*) (mBuf[m_Vbuf].data + n*mBuf[m_Vbuf].stride); } - FaceFVF* GetFaceFVF ( int n ) { return (FaceFVF*) (mBuf[m_Fbuf].data + n*mBuf[m_Fbuf].stride); } - void* GetExtraFVF ( VertFVF* v ) { return ((char*) v + miBufSize[(int) FVF][BVert]); } - void ComputeNormalsFVF (); - void SetNormalFVF ( int n, Vector3DF norm ); - void SetColorFVF ( int n, DWORD clr ); - void SmoothFVF ( int iter ); - void DebugFVF (); - void DrawVertsFVF ( float* viewmat, int a, int b ); - void DrawFacesFVF ( float* viewmat, int a, int b ); - - // CM - Connected Mesh - void CreateCM (); - void SetFuncCM (); - xref AddVertCM ( float x, float y, float z ); - xref AddFaceFast3CM ( xref v1, xref v2, xref v3 ); - xref AddFaceFast4CM ( xref v1, xref v2, xref v3, xref v4 ); - xref AddEdgeCM ( xref v1, xref v2 ); - xref FindEdgeCM ( xref v1, xref v2 ); - VertCM* GetVertCM ( int n ) { return (VertCM*) (mBuf[m_Vbuf].data + n*mBuf[m_Vbuf].stride); } - EdgeCM* GetEdgeCM ( int n ) { return (EdgeCM*) (mBuf[m_Ebuf].data + n*mBuf[m_Ebuf].stride); } - FaceCM* GetFaceCM ( int n ) { return (FaceCM*) (mBuf[m_Fbuf].data + n*mBuf[m_Fbuf].stride); } - void* GetExtraCM ( VertCM* v ) { return ((char*) v + miBufSize[(int) CM][BVert] ); } - void DebugCM (); - void DrawVertsCM ( float* viewmat, int a, int b ); - void DrawFacesCM ( float* viewmat, int a, int b ); - void DrawEdgesCM ( float* viewmat, int a, int b ); - - MFormat GetMeshBufs ( char& v, char& e, char& f ) { v = m_Vbuf; e = m_Ebuf; f = m_Fbuf; return m_Mform; } - - protected: - MFormat m_Mform; // Mesh format - char m_Vbuf; - char m_Ebuf; - char m_Fbuf; - - int m_CurrF; - - std::vector< PlyElement* > m_Ply; - //File m_File; - int m_PlyCurrElem; - - static bool mbInitStatic; - - Vector3DF mT; - }; - -#endif - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 DEF_MESH + #define DEF_MESH + + #include + #include + + #include "geomx.h" + #include "mesh_info.h" + #include "vector.h" + + //#include "mfile.h" + + //#define MESH_DEBUG + + #ifdef MESH_DEBUG + #define VERT_DELTA 10000 + #define EDGE_DELTA 20000 + #define FACE_DELTA 30000 + #else + #define VERT_DELTA 0 + #define EDGE_DELTA 0 + #define FACE_DELTA 0 + #endif + + #define PLY_UINT 0 + #define PLY_INT 1 + #define PLY_FLOAT 2 + #define PLY_LIST 3 + #define PLY_VERTS 4 + #define PLY_FACES 5 + + struct PlyProperty { + char type; + std::string name; + }; + struct PlyElement { + int num; + char type; // 0 = vert, 1 = face + std::vector prop_list; + }; + + class Mesh : public GeomX, public MeshInfo { + public: + Mesh (); + + //virtual objType GetType () { return 'mesh'; } + + // Distributed functions + //virtual void onUpdate ( objData dat, mint::Event* e ); + //void UpdateMesh (); + + // Generic functions + void InitStatic (); + void DrawGL ( float* viewmat ); + void DrawFaceGL ( float* viewmat ); + void Measure (); + Mesh& operator= ( Mesh& op2 ); + + // Load PLY mesh + void LoadPly ( char* fname, float s ); + void AddPlyElement ( char typ, int n ); + void AddPlyProperty ( char typ, std::string name ); + void LoadPlyVerts (); + void LoadPlyFaces (); + int FindPlyElem ( char typ ); + int FindPlyProp ( int elem, std::string name ); + + // Vertex, Face, Edge functions + xref AddVert (float x, float y, float z ) { return (this->*m_AddVertFunc) (x, y, z); } + xref AddFaceFast (xref v1, xref v2, xref v3 ) { return (this->*m_AddFaceFast3Func) (v1, v2, v3); } + xref AddFaceFast (xref v1, xref v2, xref v3, xref v4 ) { return (this->*m_AddFaceFast4Func) (v1, v2, v3, v4); } + xref (Mesh::*m_AddVertFunc) (float x, float y, float z); + xref (Mesh::*m_AddFaceFast3Func) (xref v1, xref v2, xref v3); + xref (Mesh::*m_AddFaceFast4Func) (xref v1, xref v2, xref v3, xref v4); + + int NumVert () { return NumElem ( m_Vbuf ); } + int NumEdge () { return NumElem ( m_Ebuf ); } + int NumFace () { return NumElem ( m_Fbuf ); } + + void IncFace ( int n ) { m_CurrF += n; } + void DebugHeap (); + + // FVF - Face-Vertex-Face Mesh + void CreateFVF (); + void ClearFVF (); + void SetFuncFVF (); + xref AddVertFVF ( float x, float y, float z ); + xref AddFaceFast3FVF ( xref v1, xref v2, xref v3 ); + xref AddFaceFast4FVF ( xref v1, xref v2, xref v3, xref v4 ); + VertFVF* GetVertFVF ( int n ) { return (VertFVF*) (mBuf[m_Vbuf].data + n*mBuf[m_Vbuf].stride); } + FaceFVF* GetFaceFVF ( int n ) { return (FaceFVF*) (mBuf[m_Fbuf].data + n*mBuf[m_Fbuf].stride); } + void* GetExtraFVF ( VertFVF* v ) { return ((char*) v + miBufSize[(int) FVF][BVert]); } + void ComputeNormalsFVF (); + void SetNormalFVF ( int n, Vector3DF norm ); + void SetColorFVF ( int n, DWORD clr ); + void SmoothFVF ( int iter ); + void DebugFVF (); + void DrawVertsFVF ( float* viewmat, int a, int b ); + void DrawFacesFVF ( float* viewmat, int a, int b ); + + // CM - Connected Mesh + void CreateCM (); + void SetFuncCM (); + xref AddVertCM ( float x, float y, float z ); + xref AddFaceFast3CM ( xref v1, xref v2, xref v3 ); + xref AddFaceFast4CM ( xref v1, xref v2, xref v3, xref v4 ); + xref AddEdgeCM ( xref v1, xref v2 ); + xref FindEdgeCM ( xref v1, xref v2 ); + VertCM* GetVertCM ( int n ) { return (VertCM*) (mBuf[m_Vbuf].data + n*mBuf[m_Vbuf].stride); } + EdgeCM* GetEdgeCM ( int n ) { return (EdgeCM*) (mBuf[m_Ebuf].data + n*mBuf[m_Ebuf].stride); } + FaceCM* GetFaceCM ( int n ) { return (FaceCM*) (mBuf[m_Fbuf].data + n*mBuf[m_Fbuf].stride); } + void* GetExtraCM ( VertCM* v ) { return ((char*) v + miBufSize[(int) CM][BVert] ); } + void DebugCM (); + void DrawVertsCM ( float* viewmat, int a, int b ); + void DrawFacesCM ( float* viewmat, int a, int b ); + void DrawEdgesCM ( float* viewmat, int a, int b ); + + MFormat GetMeshBufs ( char& v, char& e, char& f ) { v = m_Vbuf; e = m_Ebuf; f = m_Fbuf; return m_Mform; } + + protected: + MFormat m_Mform; // Mesh format + char m_Vbuf; + char m_Ebuf; + char m_Fbuf; + + int m_CurrF; + + std::vector< PlyElement* > m_Ply; + //File m_File; + int m_PlyCurrElem; + + static bool mbInitStatic; + + Vector3DF mT; + }; + +#endif + diff --git a/Extras/sph/common/mesh_info.h b/Extras/sph/common/mesh_info.h index 991c59035..745709abb 100644 --- a/Extras/sph/common/mesh_info.h +++ b/Extras/sph/common/mesh_info.h @@ -1,97 +1,97 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 DEF_MESH_INFO - #define DEF_MESH_INFO - - #include "common_defs.h" - //#include "mint_config.h" - typedef signed int xref; - - #define MAX_MFORMAT 10 - #define MAX_BFORMAT 5 - - // CM - Connected mesh - struct FaceCM { - xref e1, e2, e3, e4; - xref v1, v2, v3, v4; - }; - struct EdgeCM { - xref v1, v2; - xref f1, f2; - }; - struct VertCM { - hList elist; - hList flist; - float x, y, z; - }; - // FVF - Face-vertex-face mesh - struct FaceFVF { - xref v1, v2, v3, v4; - }; - struct VertFVF { - hList flist; - float x, y, z; - }; - - // Extra attributes - struct AttrPos { - float x, y, z; - }; - struct AttrClr { - DWORD clr; - }; - struct AttrNorm { - float nx, ny, nz; - }; - struct AttrTex { - float tu, tv; - }; - - class MeshInfo { - public: - enum MFormat { // Mesh format - UDef = 0, - VV = 1, // Vertex-Vertex - FV = 2, // Face-Vertex - FVF = 3, - WE = 4, // Winged-Edge - CM = 5 // Connected-Mesh - }; - enum BFormat { // Buffer format - BVert = 0, - BEdge = 1, - BFace = 2, - }; - enum AFormat { // Extra Attribute formats - APos = 0, - AClr = 1, - ANorm = 2, - ATex = 3 - }; - static int BufSize ( MFormat m, BFormat b ) { return miBufSize[(int) m][(int) b]; } - static int miBufSize [MAX_MFORMAT][MAX_BFORMAT]; - }; - -#endif - - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 DEF_MESH_INFO + #define DEF_MESH_INFO + + #include "common_defs.h" + //#include "mint_config.h" + typedef signed int xref; + + #define MAX_MFORMAT 10 + #define MAX_BFORMAT 5 + + // CM - Connected mesh + struct FaceCM { + xref e1, e2, e3, e4; + xref v1, v2, v3, v4; + }; + struct EdgeCM { + xref v1, v2; + xref f1, f2; + }; + struct VertCM { + hList elist; + hList flist; + float x, y, z; + }; + // FVF - Face-vertex-face mesh + struct FaceFVF { + xref v1, v2, v3, v4; + }; + struct VertFVF { + hList flist; + float x, y, z; + }; + + // Extra attributes + struct AttrPos { + float x, y, z; + }; + struct AttrClr { + DWORD clr; + }; + struct AttrNorm { + float nx, ny, nz; + }; + struct AttrTex { + float tu, tv; + }; + + class MeshInfo { + public: + enum MFormat { // Mesh format + UDef = 0, + VV = 1, // Vertex-Vertex + FV = 2, // Face-Vertex + FVF = 3, + WE = 4, // Winged-Edge + CM = 5 // Connected-Mesh + }; + enum BFormat { // Buffer format + BVert = 0, + BEdge = 1, + BFace = 2, + }; + enum AFormat { // Extra Attribute formats + APos = 0, + AClr = 1, + ANorm = 2, + ATex = 3 + }; + static int BufSize ( MFormat m, BFormat b ) { return miBufSize[(int) m][(int) b]; } + static int miBufSize [MAX_MFORMAT][MAX_BFORMAT]; + }; + +#endif + + diff --git a/Extras/sph/common/point_set.cpp b/Extras/sph/common/point_set.cpp index 921cb5178..d343cda46 100644 --- a/Extras/sph/common/point_set.cpp +++ b/Extras/sph/common/point_set.cpp @@ -1,539 +1,539 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "gl_helper.h" - -#include "point_set.h" - -int PointSet::m_pcurr = -1; - -PointSet::PointSet () -{ - m_GridRes.Set ( 0, 0, 0 ); - m_pcurr = -1; - Reset (); -} - -int PointSet::GetGridCell ( int x, int y, int z ) -{ - return (int) ( (z*m_GridRes.y + y)*m_GridRes.x + x); -} - -Point* PointSet::firstGridParticle ( int gc, int& p ) -{ - m_pcurr = m_Grid [ gc ]; - if ( m_pcurr == -1 ) return 0x0; - p = m_pcurr; - return (Point*) (mBuf[0].data + m_pcurr * mBuf[0].stride); -} - -Point* PointSet::nextGridParticle ( int& p ) -{ - Point* pnt = 0x0; - if ( m_pcurr != -1 ) { - pnt = (Point*) (mBuf[0].data + m_pcurr * mBuf[0].stride); - p = m_pcurr; - m_pcurr = pnt->next; - } - return pnt; -} - -unsigned short* PointSet::getNeighborTable ( int n, int& cnt ) -{ - cnt = m_NC[n]; - if ( cnt == 0 ) return 0x0; - return &m_Neighbor[n][0]; -} - -float PointSet::GetValue ( float x, float y, float z ) -{ - float dx, dy, dz, dsq; - float sum; - int pndx; - Point* pcurr; - float R2 = 1.8*1.8; - - Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); - - int cnt = 0; - sum = 0.0; - for (int cell=0; cell < 8; cell++ ) { - if ( m_GridCell[cell] != -1 ) { - pndx = m_Grid [ m_GridCell[cell] ]; - while ( pndx != -1 ) { - pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); - dx = x - pcurr->pos.x; - dy = y - pcurr->pos.y; - dz = z - pcurr->pos.z; - dsq = dx*dx+dy*dy+dz*dz; - if ( dsq < R2 ) sum += R2 / dsq; - pndx = pcurr->next; - } - } - } - return sum; -} -Vector3DF PointSet::GetGradient ( float x, float y, float z ) -{ - Vector3DF norm; - float dx, dy, dz, dsq; - float sum; - int pndx; - Point* pcurr; - float R2 = (m_GridCellsize/2.0)*(m_GridCellsize/2.0); - - Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); - - int cnt = 0; - sum = 0.0; - norm.Set (0,0,0); - for (int cell=0; cell < 8; cell++ ) { - if ( m_GridCell[cell] != -1 ) { - pndx = m_Grid [ m_GridCell[cell] ]; - while ( pndx != -1 ) { - pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); - dx = x - pcurr->pos.x; - dy = y - pcurr->pos.y; - dz = z - pcurr->pos.z; - dsq = dx*dx+dy*dy+dz*dz; - if ( dsq > 0 && dsq < R2 ) { - dsq = 2.0*R2 / (dsq*dsq); - norm.x += dx * dsq; - norm.y += dy * dsq; - norm.z += dz * dsq; - } - pndx = pcurr->next; - } - } - } - norm.Normalize (); - return norm; -} - -DWORD PointSet::GetColor ( float x, float y, float z ) -{ - Vector3DF clr; - float dx, dy, dz, dsq; - float sum; - int pndx; - Point* pcurr; - float R2 = (m_GridCellsize/2.0)*(m_GridCellsize/2.0); - - Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); - - int cnt = 0; - sum = 0.0; - clr.Set (0,0,0); - for (int cell=0; cell < 8; cell++ ) { - if ( m_GridCell[cell] != -1 ) { - pndx = m_Grid [ m_GridCell[cell] ]; - while ( pndx != -1 ) { - pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); - dx = x - pcurr->pos.x; - dy = y - pcurr->pos.y; - dz = z - pcurr->pos.z; - dsq = dx*dx+dy*dy+dz*dz; - if ( dsq < R2 ) { - dsq = 2.0*R2 / (dsq*dsq); - clr.x += RED(pcurr->clr) * dsq; - clr.y += GRN(pcurr->clr) * dsq; - clr.z += BLUE(pcurr->clr) * dsq; - } - pndx = pcurr->next; - } - } - } - clr.Normalize (); - return COLORA(clr.x, clr.y, clr.z, 1.0); -} - -void PointSet::Reset () -{ - // Reset number of particles -// ResetBuffer ( 0 ); - - m_Time = 0; - m_DT = 0.1; - m_Param[POINT_GRAV] = 100.0; - m_Param[PLANE_GRAV] = 0.0; - - m_Vec[ POINT_GRAV_POS].Set(0,0,50.0); - m_Vec[ PLANE_GRAV_DIR].Set(0,0,-9.8); - m_Vec[ EMIT_RATE ].Set ( 1, 10, 0 ); - m_Vec[ EMIT_POS ].Set ( 50, 0, 35 ); - m_Vec[ EMIT_ANG ].Set ( 90, 45, 50.0 ); - m_Vec[ EMIT_DANG ].Set ( 0, 0, 0 ); - m_Vec[ EMIT_SPREAD ].Set ( 4, 4, 1 ); -} - -void PointSet::Initialize ( int mode, int total ) -{ - switch (mode) { - case BPOINT: { - FreeBuffers (); - AddBuffer ( BPOINT, sizeof ( Point ), total ); - AddAttribute ( 0, "pos", sizeof ( Vector3DF ), false ); - AddAttribute ( 0, "color", sizeof ( DWORD ), false ); - Reset (); - } break; - - case BPARTICLE: { - FreeBuffers (); - AddBuffer ( BPARTICLE, sizeof ( Particle ), total ); - AddAttribute ( 0, "pos", sizeof ( Vector3DF ), false ); - AddAttribute ( 0, "color", sizeof ( DWORD ), false ); - AddAttribute ( 0, "vel", sizeof ( Vector3DF ), false ); - AddAttribute ( 0, "ndx", sizeof ( unsigned short ), false ); - AddAttribute ( 0, "age", sizeof ( unsigned short ), false ); - Reset (); - } break; - } - - -} - -int PointSet::AddPoint () -{ - xref ndx; - AddElem ( 0, ndx ); - return ndx; -} - -int PointSet::AddPointReuse () -{ - xref ndx; - if ( NumPoints() < mBuf[0].max-1 ) - AddElem ( 0, ndx ); - else - RandomElem ( 0, ndx ); - return ndx; -} - -void PointSet::AddVolume ( Vector3DF min, Vector3DF max, float spacing ) -{ - Vector3DF pos; - Point* p; - float dx, dy, dz; - dx = max.x-min.x; - dy = max.y-min.y; - dz = max.z-min.z; - for (float z = max.z; z >= min.z; z -= spacing ) { - for (float y = min.y; y <= max.y; y += spacing ) { - for (float x = min.x; x <= max.x; x += spacing ) { - p = GetPoint ( AddPointReuse () ); - pos.Set ( x, y, z); - //pos.x += -0.05 + float( rand() * 0.1 ) / RAND_MAX; - //pos.y += -0.05 + float( rand() * 0.1 ) / RAND_MAX; - //pos.z += -0.05 + float( rand() * 0.1 ) / RAND_MAX; - p->pos = pos; - p->clr = COLORA( (x-min.x)/dx, (y-min.y)/dy, (z-min.z)/dz, 1); - } - } - } -} - -void PointSet::Draw ( float* view_mat, float rad ) -{ - char* dat; - Point* p; - glEnable ( GL_NORMALIZE ); - - if ( m_Param[PNT_DRAWMODE] == 0 ) { - glLoadMatrixf ( view_mat ); - dat = mBuf[0].data; - for (int n = 0; n < NumPoints(); n++) { - p = (Point*) dat; - glPushMatrix (); - glTranslatef ( p->pos.x, p->pos.y, p->pos.z ); - glScalef ( 0.2, 0.2, 0.2 ); - glColor4f ( RED(p->clr), GRN(p->clr), BLUE(p->clr), ALPH(p->clr) ); - drawSphere (); - glPopMatrix (); - dat += mBuf[0].stride; - } - } else if ( m_Param[PNT_DRAWMODE] == 1 ) { - glLoadMatrixf ( view_mat ); - dat = mBuf[0].data; - glBegin ( GL_POINTS ); - for (int n=0; n < NumPoints(); n++) { - p = (Point*) dat; - glColor3f ( RED(p->clr), GRN(p->clr), BLUE(p->clr) ); - glVertex3f ( p->pos.x, p->pos.y, p->pos.z ); - dat += mBuf[0].stride; - } - glEnd (); - } -} - -void PointSet::Emit ( float spacing ) -{ - Particle* p; - Vector3DF dir; - Vector3DF pos; - float ang_rand, tilt_rand; - float rnd = m_Vec[EMIT_RATE].y * 0.15; - int x = (int) sqrt(m_Vec[EMIT_RATE].y); - - for ( int n = 0; n < m_Vec[EMIT_RATE].y; n++ ) { - ang_rand = (float(rand()*2.0/RAND_MAX) - 1.0) * m_Vec[EMIT_SPREAD].x; - tilt_rand = (float(rand()*2.0/RAND_MAX) - 1.0) * m_Vec[EMIT_SPREAD].y; - dir.x = cos ( ( m_Vec[EMIT_ANG].x + ang_rand) * DEGtoRAD ) * sin( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; - dir.y = sin ( ( m_Vec[EMIT_ANG].x + ang_rand) * DEGtoRAD ) * sin( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; - dir.z = cos ( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; - pos = m_Vec[EMIT_POS]; - pos.x += spacing * (n/x); - pos.y += spacing * (n%x); - - p = (Particle*) GetElem( 0, AddPointReuse () ); - p->pos = pos; - p->vel = dir; - p->vel_eval = dir; - p->age = 0; - p->clr = COLORA ( m_Time/10.0, m_Time/5.0, m_Time /4.0, 1 ); - } -} - - -void PointSet::Run () -{ - if ( m_Vec[EMIT_RATE].x > 0 && ++m_Frame >= (int) m_Vec[EMIT_RATE].x ) { - m_Frame = 0; - Emit ( 1.0 ); - } - Advance(); -} - -void PointSet::Advance () -{ - char* dat; - Particle* p; - Vector3DF vnext, accel, norm; - - vnext = m_Vec[EMIT_DANG]; - vnext *= m_DT; - m_Vec[EMIT_ANG] += vnext; - - dat = mBuf[0].data; - for ( int c = 0; c < NumPoints(); c++ ) { - p = (Particle*) dat; - - accel.Set (0, 0, 0); - - // Plane gravity - if ( m_Param[PLANE_GRAV] > 0) - accel += m_Vec[PLANE_GRAV_DIR]; - - // Point gravity - if ( m_Param[POINT_GRAV] > 0 ) { - norm.x = ( p->pos.x - m_Vec[POINT_GRAV_POS].x ); - norm.y = ( p->pos.y - m_Vec[POINT_GRAV_POS].y ); - norm.z = ( p->pos.z - m_Vec[POINT_GRAV_POS].z ); - norm.Normalize (); - norm *= m_Param[POINT_GRAV]; - accel -= norm; - } - - // Leapfrog Integration ---------------------------- - vnext = accel; - vnext *= m_DT; - vnext += p->vel; // v(t+1/2) = v(t-1/2) + a(t) dt - p->vel_eval = p->vel; - p->vel_eval += vnext; - p->vel_eval *= 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later - p->vel = vnext; - vnext *= m_DT; - p->pos += vnext; // p(t+1) = p(t) + v(t+1/2) dt - - // Euler integration ------------------------------- - // accel += m_Gravity; - // accel *= m_DT; - // mParticles[c].vel += accel; // v(t+1) = v(t) + a(t) dt - // mParticles[c].vel_eval += accel; - // mParticles[c].vel_eval *= m_DT/d; - // mParticles[c].pos += mParticles[c].vel_eval; - // mParticles[c].vel_eval = mParticles[c].vel; - - dat += mBuf[0].stride; - } - - m_Time += m_DT; -} - -// Ideal grid cell size (gs) = 2 * smoothing radius = 0.02*2 = 0.04 -// Ideal domain size = k*gs/d = k*0.02*2/0.005 = k*8 = {8, 16, 24, 32, 40, 48, ..} -// (k = number of cells, gs = cell size, d = simulation scale) -void PointSet::Grid_Setup ( Vector3DF min, Vector3DF max, float sim_scale, float cell_size, float border ) -{ - float world_cellsize = cell_size / sim_scale; - m_Grid.clear (); - m_GridMin = min; m_GridMin -= border; - m_GridMax = max; m_GridMax += border; - m_GridSize = m_GridMax; - m_GridSize -= m_GridMin; - m_GridCellsize = world_cellsize; - m_GridRes.x = ceil ( m_GridSize.x / world_cellsize ); // Determine grid resolution - m_GridRes.y = ceil ( m_GridSize.y / world_cellsize ); - m_GridRes.z = ceil ( m_GridSize.z / world_cellsize ); - m_GridSize.x = m_GridRes.x * cell_size / sim_scale; // Adjust grid size to multiple of cell size - m_GridSize.y = m_GridRes.y * cell_size / sim_scale; - m_GridSize.z = m_GridRes.z * cell_size / sim_scale; - m_GridDelta = m_GridRes; // delta = translate from world space to cell # - m_GridDelta /= m_GridSize; - m_GridTotal = (int)(m_GridSize.x * m_GridSize.y * m_GridSize.z); - - m_Grid.clear (); - m_GridCnt.clear (); - - m_Grid.reserve ( m_GridTotal ); - m_GridCnt.reserve ( m_GridTotal ); - for (int n=0; n < m_GridTotal; n++) { - m_Grid.push_back ( -1 ); - m_GridCnt.push_back ( 0 ); - } - -} - -void PointSet::Grid_Draw ( float* view_mat ) -{ - float clr; - int cx, cy, cz; - float x1, y1, z1; - float x2, y2, z2; - int g = 0; - - glLoadMatrixf ( view_mat ); - glColor3f ( 0.7, 0.7, 0.7 ); - - glBegin ( GL_LINES ); - - cz = 0; - //for ( cz = 0; cz < m_GridRes.z; cz++ ) { - for ( cy = 0; cy < m_GridRes.y; cy++ ) { - for ( cx = 0; cx < m_GridRes.x; cx++ ) { - // Cell is not empty. Process it. - //if ( m_Grid[g] != 0x0 ) { - // clr = m_GridCnt[g]/30.0; - clr = 0.25; - if ( clr <0.25) clr =0.25; - if ( clr >1) clr =1 ; - glColor3f ( clr, clr, clr ); - x1 = (cx * m_GridDelta.x) + m_GridMin.x; x2 = ((cx+1) * m_GridDelta.x) + m_GridMin.x; - y1 = (cy * m_GridDelta.y) + m_GridMin.y; y2 = ((cy+1) * m_GridDelta.y) + m_GridMin.y; - z1 = (cz * m_GridDelta.z) + m_GridMin.z; z2 = ((cz+1) * m_GridDelta.z) + m_GridMin.z; - glVertex3f ( x1, y1, z1 ); glVertex3f ( x2, y1, z1 ); - glVertex3f ( x2, y1, z1 ); glVertex3f ( x2, y2, z1 ); - glVertex3f ( x2, y2, z1 ); glVertex3f ( x1, y2, z1 ); - glVertex3f ( x1, y2, z1 ); glVertex3f ( x1, y1, z1 ); - glVertex3f ( x1, y1, z2 ); glVertex3f ( x2, y1, z2 ); - glVertex3f ( x2, y1, z2 ); glVertex3f ( x2, y2, z2 ); - glVertex3f ( x2, y2, z2 ); glVertex3f ( x1, y2, z2 ); - glVertex3f ( x1, y2, z2 ); glVertex3f ( x1, y1, z2 ); - glVertex3f ( x1, y1, z1 ); glVertex3f ( x1, y1, z2 ); - glVertex3f ( x1, y2, z1 ); glVertex3f ( x1, y2, z2 ); - glVertex3f ( x2, y2, z1 ); glVertex3f ( x2, y2, z2 ); - glVertex3f ( x2, y1, z1 ); glVertex3f ( x2, y1, z2 ); - //} - g++; - } - } - //} - - glEnd (); -} - -void PointSet::Grid_InsertParticles () -{ - char *dat1, *dat1_end; - Point *p; - int gs; - int gx, gy, gz; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) - ((Point*) dat1)->next = -1; - - for (int n=0; n < m_GridTotal; n++) { - m_Grid[n] = -1; - m_GridCnt[n] = 0; - } - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - int n = 0; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { - p = (Point*) dat1; - gx = (int)( (p->pos.x - m_GridMin.x) * m_GridDelta.x); // Determine grid cell - gy = (int)( (p->pos.y - m_GridMin.y) * m_GridDelta.y); - gz = (int)( (p->pos.z - m_GridMin.z) * m_GridDelta.z); - gs = (int)( (gz*m_GridRes.y + gy)*m_GridRes.x + gx); - if ( gs >= 0 && gs < m_GridTotal ) { - p->next = m_Grid[gs]; - m_Grid[gs] = n; - m_GridCnt[gs]++; - } - n++; - } -} - -int PointSet::Grid_FindCell ( Vector3DF p ) -{ - int gc; - Vector3DI cell; - cell.x = (int) (p.x - m_GridMin.x) * m_GridDelta.x; - cell.y = (int) (p.y - m_GridMin.y) * m_GridDelta.y; - cell.z = (int) (p.z - m_GridMin.z) * m_GridDelta.z; - gc = (int)( (cell.z*m_GridRes.y + cell.y)*m_GridRes.x + cell.x); - if ( gc < 0 || gc > m_GridTotal ) return -1; - return gc; -} - -void PointSet::Grid_FindCells ( Vector3DF p, float radius ) -{ - Vector3DI sph_min; - - // Compute sphere range - sph_min.x = (int)((-radius + p.x - m_GridMin.x) * m_GridDelta.x); - sph_min.y = (int)((-radius + p.y - m_GridMin.y) * m_GridDelta.y); - sph_min.z = (int)((-radius + p.z - m_GridMin.z) * m_GridDelta.z); - if ( sph_min.x < 0 ) sph_min.x = 0; - if ( sph_min.y < 0 ) sph_min.y = 0; - if ( sph_min.z < 0 ) sph_min.z = 0; - - m_GridCell[0] = (int)((sph_min.z * m_GridRes.y + sph_min.y) * m_GridRes.x + sph_min.x); - m_GridCell[1] = m_GridCell[0] + 1; - m_GridCell[2] = (int)(m_GridCell[0] + m_GridRes.x); - m_GridCell[3] = m_GridCell[2] + 1; - - if ( sph_min.z+1 < m_GridRes.z ) { - m_GridCell[4] = (int)(m_GridCell[0] + m_GridRes.y*m_GridRes.x); - m_GridCell[5] = m_GridCell[4] + 1; - m_GridCell[6] = (int)(m_GridCell[4] + m_GridRes.x); - m_GridCell[7] = m_GridCell[6] + 1; - } - if ( sph_min.x+1 >= m_GridRes.x ) { - m_GridCell[1] = -1; m_GridCell[3] = -1; - m_GridCell[5] = -1; m_GridCell[7] = -1; - } - if ( sph_min.y+1 >= m_GridRes.y ) { - m_GridCell[2] = -1; m_GridCell[3] = -1; - m_GridCell[6] = -1; m_GridCell[7] = -1; - } -} +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "gl_helper.h" + +#include "point_set.h" + +int PointSet::m_pcurr = -1; + +PointSet::PointSet () +{ + m_GridRes.Set ( 0, 0, 0 ); + m_pcurr = -1; + Reset (); +} + +int PointSet::GetGridCell ( int x, int y, int z ) +{ + return (int) ( (z*m_GridRes.y + y)*m_GridRes.x + x); +} + +Point* PointSet::firstGridParticle ( int gc, int& p ) +{ + m_pcurr = m_Grid [ gc ]; + if ( m_pcurr == -1 ) return 0x0; + p = m_pcurr; + return (Point*) (mBuf[0].data + m_pcurr * mBuf[0].stride); +} + +Point* PointSet::nextGridParticle ( int& p ) +{ + Point* pnt = 0x0; + if ( m_pcurr != -1 ) { + pnt = (Point*) (mBuf[0].data + m_pcurr * mBuf[0].stride); + p = m_pcurr; + m_pcurr = pnt->next; + } + return pnt; +} + +unsigned short* PointSet::getNeighborTable ( int n, int& cnt ) +{ + cnt = m_NC[n]; + if ( cnt == 0 ) return 0x0; + return &m_Neighbor[n][0]; +} + +float PointSet::GetValue ( float x, float y, float z ) +{ + float dx, dy, dz, dsq; + float sum; + int pndx; + Point* pcurr; + float R2 = 1.8*1.8; + + Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); + + int cnt = 0; + sum = 0.0; + for (int cell=0; cell < 8; cell++ ) { + if ( m_GridCell[cell] != -1 ) { + pndx = m_Grid [ m_GridCell[cell] ]; + while ( pndx != -1 ) { + pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); + dx = x - pcurr->pos.x; + dy = y - pcurr->pos.y; + dz = z - pcurr->pos.z; + dsq = dx*dx+dy*dy+dz*dz; + if ( dsq < R2 ) sum += R2 / dsq; + pndx = pcurr->next; + } + } + } + return sum; +} +Vector3DF PointSet::GetGradient ( float x, float y, float z ) +{ + Vector3DF norm; + float dx, dy, dz, dsq; + float sum; + int pndx; + Point* pcurr; + float R2 = (m_GridCellsize/2.0)*(m_GridCellsize/2.0); + + Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); + + int cnt = 0; + sum = 0.0; + norm.Set (0,0,0); + for (int cell=0; cell < 8; cell++ ) { + if ( m_GridCell[cell] != -1 ) { + pndx = m_Grid [ m_GridCell[cell] ]; + while ( pndx != -1 ) { + pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); + dx = x - pcurr->pos.x; + dy = y - pcurr->pos.y; + dz = z - pcurr->pos.z; + dsq = dx*dx+dy*dy+dz*dz; + if ( dsq > 0 && dsq < R2 ) { + dsq = 2.0*R2 / (dsq*dsq); + norm.x += dx * dsq; + norm.y += dy * dsq; + norm.z += dz * dsq; + } + pndx = pcurr->next; + } + } + } + norm.Normalize (); + return norm; +} + +DWORD PointSet::GetColor ( float x, float y, float z ) +{ + Vector3DF clr; + float dx, dy, dz, dsq; + float sum; + int pndx; + Point* pcurr; + float R2 = (m_GridCellsize/2.0)*(m_GridCellsize/2.0); + + Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); + + int cnt = 0; + sum = 0.0; + clr.Set (0,0,0); + for (int cell=0; cell < 8; cell++ ) { + if ( m_GridCell[cell] != -1 ) { + pndx = m_Grid [ m_GridCell[cell] ]; + while ( pndx != -1 ) { + pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); + dx = x - pcurr->pos.x; + dy = y - pcurr->pos.y; + dz = z - pcurr->pos.z; + dsq = dx*dx+dy*dy+dz*dz; + if ( dsq < R2 ) { + dsq = 2.0*R2 / (dsq*dsq); + clr.x += RED(pcurr->clr) * dsq; + clr.y += GRN(pcurr->clr) * dsq; + clr.z += BLUE(pcurr->clr) * dsq; + } + pndx = pcurr->next; + } + } + } + clr.Normalize (); + return COLORA(clr.x, clr.y, clr.z, 1.0); +} + +void PointSet::Reset () +{ + // Reset number of particles +// ResetBuffer ( 0 ); + + m_Time = 0; + m_DT = 0.1; + m_Param[POINT_GRAV] = 100.0; + m_Param[PLANE_GRAV] = 0.0; + + m_Vec[ POINT_GRAV_POS].Set(0,0,50.0); + m_Vec[ PLANE_GRAV_DIR].Set(0,0,-9.8); + m_Vec[ EMIT_RATE ].Set ( 1, 10, 0 ); + m_Vec[ EMIT_POS ].Set ( 50, 0, 35 ); + m_Vec[ EMIT_ANG ].Set ( 90, 45, 50.0 ); + m_Vec[ EMIT_DANG ].Set ( 0, 0, 0 ); + m_Vec[ EMIT_SPREAD ].Set ( 4, 4, 1 ); +} + +void PointSet::Initialize ( int mode, int total ) +{ + switch (mode) { + case BPOINT: { + FreeBuffers (); + AddBuffer ( BPOINT, sizeof ( Point ), total ); + AddAttribute ( 0, "pos", sizeof ( Vector3DF ), false ); + AddAttribute ( 0, "color", sizeof ( DWORD ), false ); + Reset (); + } break; + + case BPARTICLE: { + FreeBuffers (); + AddBuffer ( BPARTICLE, sizeof ( Particle ), total ); + AddAttribute ( 0, "pos", sizeof ( Vector3DF ), false ); + AddAttribute ( 0, "color", sizeof ( DWORD ), false ); + AddAttribute ( 0, "vel", sizeof ( Vector3DF ), false ); + AddAttribute ( 0, "ndx", sizeof ( unsigned short ), false ); + AddAttribute ( 0, "age", sizeof ( unsigned short ), false ); + Reset (); + } break; + } + + +} + +int PointSet::AddPoint () +{ + xref ndx; + AddElem ( 0, ndx ); + return ndx; +} + +int PointSet::AddPointReuse () +{ + xref ndx; + if ( NumPoints() < mBuf[0].max-1 ) + AddElem ( 0, ndx ); + else + RandomElem ( 0, ndx ); + return ndx; +} + +void PointSet::AddVolume ( Vector3DF min, Vector3DF max, float spacing ) +{ + Vector3DF pos; + Point* p; + float dx, dy, dz; + dx = max.x-min.x; + dy = max.y-min.y; + dz = max.z-min.z; + for (float z = max.z; z >= min.z; z -= spacing ) { + for (float y = min.y; y <= max.y; y += spacing ) { + for (float x = min.x; x <= max.x; x += spacing ) { + p = GetPoint ( AddPointReuse () ); + pos.Set ( x, y, z); + //pos.x += -0.05 + float( rand() * 0.1 ) / RAND_MAX; + //pos.y += -0.05 + float( rand() * 0.1 ) / RAND_MAX; + //pos.z += -0.05 + float( rand() * 0.1 ) / RAND_MAX; + p->pos = pos; + p->clr = COLORA( (x-min.x)/dx, (y-min.y)/dy, (z-min.z)/dz, 1); + } + } + } +} + +void PointSet::Draw ( float* view_mat, float rad ) +{ + char* dat; + Point* p; + glEnable ( GL_NORMALIZE ); + + if ( m_Param[PNT_DRAWMODE] == 0 ) { + glLoadMatrixf ( view_mat ); + dat = mBuf[0].data; + for (int n = 0; n < NumPoints(); n++) { + p = (Point*) dat; + glPushMatrix (); + glTranslatef ( p->pos.x, p->pos.y, p->pos.z ); + glScalef ( 0.2, 0.2, 0.2 ); + glColor4f ( RED(p->clr), GRN(p->clr), BLUE(p->clr), ALPH(p->clr) ); + drawSphere (); + glPopMatrix (); + dat += mBuf[0].stride; + } + } else if ( m_Param[PNT_DRAWMODE] == 1 ) { + glLoadMatrixf ( view_mat ); + dat = mBuf[0].data; + glBegin ( GL_POINTS ); + for (int n=0; n < NumPoints(); n++) { + p = (Point*) dat; + glColor3f ( RED(p->clr), GRN(p->clr), BLUE(p->clr) ); + glVertex3f ( p->pos.x, p->pos.y, p->pos.z ); + dat += mBuf[0].stride; + } + glEnd (); + } +} + +void PointSet::Emit ( float spacing ) +{ + Particle* p; + Vector3DF dir; + Vector3DF pos; + float ang_rand, tilt_rand; + float rnd = m_Vec[EMIT_RATE].y * 0.15; + int x = (int) sqrt(m_Vec[EMIT_RATE].y); + + for ( int n = 0; n < m_Vec[EMIT_RATE].y; n++ ) { + ang_rand = (float(rand()*2.0/RAND_MAX) - 1.0) * m_Vec[EMIT_SPREAD].x; + tilt_rand = (float(rand()*2.0/RAND_MAX) - 1.0) * m_Vec[EMIT_SPREAD].y; + dir.x = cos ( ( m_Vec[EMIT_ANG].x + ang_rand) * DEGtoRAD ) * sin( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; + dir.y = sin ( ( m_Vec[EMIT_ANG].x + ang_rand) * DEGtoRAD ) * sin( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; + dir.z = cos ( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; + pos = m_Vec[EMIT_POS]; + pos.x += spacing * (n/x); + pos.y += spacing * (n%x); + + p = (Particle*) GetElem( 0, AddPointReuse () ); + p->pos = pos; + p->vel = dir; + p->vel_eval = dir; + p->age = 0; + p->clr = COLORA ( m_Time/10.0, m_Time/5.0, m_Time /4.0, 1 ); + } +} + + +void PointSet::Run () +{ + if ( m_Vec[EMIT_RATE].x > 0 && ++m_Frame >= (int) m_Vec[EMIT_RATE].x ) { + m_Frame = 0; + Emit ( 1.0 ); + } + Advance(); +} + +void PointSet::Advance () +{ + char* dat; + Particle* p; + Vector3DF vnext, accel, norm; + + vnext = m_Vec[EMIT_DANG]; + vnext *= m_DT; + m_Vec[EMIT_ANG] += vnext; + + dat = mBuf[0].data; + for ( int c = 0; c < NumPoints(); c++ ) { + p = (Particle*) dat; + + accel.Set (0, 0, 0); + + // Plane gravity + if ( m_Param[PLANE_GRAV] > 0) + accel += m_Vec[PLANE_GRAV_DIR]; + + // Point gravity + if ( m_Param[POINT_GRAV] > 0 ) { + norm.x = ( p->pos.x - m_Vec[POINT_GRAV_POS].x ); + norm.y = ( p->pos.y - m_Vec[POINT_GRAV_POS].y ); + norm.z = ( p->pos.z - m_Vec[POINT_GRAV_POS].z ); + norm.Normalize (); + norm *= m_Param[POINT_GRAV]; + accel -= norm; + } + + // Leapfrog Integration ---------------------------- + vnext = accel; + vnext *= m_DT; + vnext += p->vel; // v(t+1/2) = v(t-1/2) + a(t) dt + p->vel_eval = p->vel; + p->vel_eval += vnext; + p->vel_eval *= 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later + p->vel = vnext; + vnext *= m_DT; + p->pos += vnext; // p(t+1) = p(t) + v(t+1/2) dt + + // Euler integration ------------------------------- + // accel += m_Gravity; + // accel *= m_DT; + // mParticles[c].vel += accel; // v(t+1) = v(t) + a(t) dt + // mParticles[c].vel_eval += accel; + // mParticles[c].vel_eval *= m_DT/d; + // mParticles[c].pos += mParticles[c].vel_eval; + // mParticles[c].vel_eval = mParticles[c].vel; + + dat += mBuf[0].stride; + } + + m_Time += m_DT; +} + +// Ideal grid cell size (gs) = 2 * smoothing radius = 0.02*2 = 0.04 +// Ideal domain size = k*gs/d = k*0.02*2/0.005 = k*8 = {8, 16, 24, 32, 40, 48, ..} +// (k = number of cells, gs = cell size, d = simulation scale) +void PointSet::Grid_Setup ( Vector3DF min, Vector3DF max, float sim_scale, float cell_size, float border ) +{ + float world_cellsize = cell_size / sim_scale; + m_Grid.clear (); + m_GridMin = min; m_GridMin -= border; + m_GridMax = max; m_GridMax += border; + m_GridSize = m_GridMax; + m_GridSize -= m_GridMin; + m_GridCellsize = world_cellsize; + m_GridRes.x = ceil ( m_GridSize.x / world_cellsize ); // Determine grid resolution + m_GridRes.y = ceil ( m_GridSize.y / world_cellsize ); + m_GridRes.z = ceil ( m_GridSize.z / world_cellsize ); + m_GridSize.x = m_GridRes.x * cell_size / sim_scale; // Adjust grid size to multiple of cell size + m_GridSize.y = m_GridRes.y * cell_size / sim_scale; + m_GridSize.z = m_GridRes.z * cell_size / sim_scale; + m_GridDelta = m_GridRes; // delta = translate from world space to cell # + m_GridDelta /= m_GridSize; + m_GridTotal = (int)(m_GridSize.x * m_GridSize.y * m_GridSize.z); + + m_Grid.clear (); + m_GridCnt.clear (); + + m_Grid.reserve ( m_GridTotal ); + m_GridCnt.reserve ( m_GridTotal ); + for (int n=0; n < m_GridTotal; n++) { + m_Grid.push_back ( -1 ); + m_GridCnt.push_back ( 0 ); + } + +} + +void PointSet::Grid_Draw ( float* view_mat ) +{ + float clr; + int cx, cy, cz; + float x1, y1, z1; + float x2, y2, z2; + int g = 0; + + glLoadMatrixf ( view_mat ); + glColor3f ( 0.7, 0.7, 0.7 ); + + glBegin ( GL_LINES ); + + cz = 0; + //for ( cz = 0; cz < m_GridRes.z; cz++ ) { + for ( cy = 0; cy < m_GridRes.y; cy++ ) { + for ( cx = 0; cx < m_GridRes.x; cx++ ) { + // Cell is not empty. Process it. + //if ( m_Grid[g] != 0x0 ) { + // clr = m_GridCnt[g]/30.0; + clr = 0.25; + if ( clr <0.25) clr =0.25; + if ( clr >1) clr =1 ; + glColor3f ( clr, clr, clr ); + x1 = (cx * m_GridDelta.x) + m_GridMin.x; x2 = ((cx+1) * m_GridDelta.x) + m_GridMin.x; + y1 = (cy * m_GridDelta.y) + m_GridMin.y; y2 = ((cy+1) * m_GridDelta.y) + m_GridMin.y; + z1 = (cz * m_GridDelta.z) + m_GridMin.z; z2 = ((cz+1) * m_GridDelta.z) + m_GridMin.z; + glVertex3f ( x1, y1, z1 ); glVertex3f ( x2, y1, z1 ); + glVertex3f ( x2, y1, z1 ); glVertex3f ( x2, y2, z1 ); + glVertex3f ( x2, y2, z1 ); glVertex3f ( x1, y2, z1 ); + glVertex3f ( x1, y2, z1 ); glVertex3f ( x1, y1, z1 ); + glVertex3f ( x1, y1, z2 ); glVertex3f ( x2, y1, z2 ); + glVertex3f ( x2, y1, z2 ); glVertex3f ( x2, y2, z2 ); + glVertex3f ( x2, y2, z2 ); glVertex3f ( x1, y2, z2 ); + glVertex3f ( x1, y2, z2 ); glVertex3f ( x1, y1, z2 ); + glVertex3f ( x1, y1, z1 ); glVertex3f ( x1, y1, z2 ); + glVertex3f ( x1, y2, z1 ); glVertex3f ( x1, y2, z2 ); + glVertex3f ( x2, y2, z1 ); glVertex3f ( x2, y2, z2 ); + glVertex3f ( x2, y1, z1 ); glVertex3f ( x2, y1, z2 ); + //} + g++; + } + } + //} + + glEnd (); +} + +void PointSet::Grid_InsertParticles () +{ + char *dat1, *dat1_end; + Point *p; + int gs; + int gx, gy, gz; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) + ((Point*) dat1)->next = -1; + + for (int n=0; n < m_GridTotal; n++) { + m_Grid[n] = -1; + m_GridCnt[n] = 0; + } + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + int n = 0; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { + p = (Point*) dat1; + gx = (int)( (p->pos.x - m_GridMin.x) * m_GridDelta.x); // Determine grid cell + gy = (int)( (p->pos.y - m_GridMin.y) * m_GridDelta.y); + gz = (int)( (p->pos.z - m_GridMin.z) * m_GridDelta.z); + gs = (int)( (gz*m_GridRes.y + gy)*m_GridRes.x + gx); + if ( gs >= 0 && gs < m_GridTotal ) { + p->next = m_Grid[gs]; + m_Grid[gs] = n; + m_GridCnt[gs]++; + } + n++; + } +} + +int PointSet::Grid_FindCell ( Vector3DF p ) +{ + int gc; + Vector3DI cell; + cell.x = (int) (p.x - m_GridMin.x) * m_GridDelta.x; + cell.y = (int) (p.y - m_GridMin.y) * m_GridDelta.y; + cell.z = (int) (p.z - m_GridMin.z) * m_GridDelta.z; + gc = (int)( (cell.z*m_GridRes.y + cell.y)*m_GridRes.x + cell.x); + if ( gc < 0 || gc > m_GridTotal ) return -1; + return gc; +} + +void PointSet::Grid_FindCells ( Vector3DF p, float radius ) +{ + Vector3DI sph_min; + + // Compute sphere range + sph_min.x = (int)((-radius + p.x - m_GridMin.x) * m_GridDelta.x); + sph_min.y = (int)((-radius + p.y - m_GridMin.y) * m_GridDelta.y); + sph_min.z = (int)((-radius + p.z - m_GridMin.z) * m_GridDelta.z); + if ( sph_min.x < 0 ) sph_min.x = 0; + if ( sph_min.y < 0 ) sph_min.y = 0; + if ( sph_min.z < 0 ) sph_min.z = 0; + + m_GridCell[0] = (int)((sph_min.z * m_GridRes.y + sph_min.y) * m_GridRes.x + sph_min.x); + m_GridCell[1] = m_GridCell[0] + 1; + m_GridCell[2] = (int)(m_GridCell[0] + m_GridRes.x); + m_GridCell[3] = m_GridCell[2] + 1; + + if ( sph_min.z+1 < m_GridRes.z ) { + m_GridCell[4] = (int)(m_GridCell[0] + m_GridRes.y*m_GridRes.x); + m_GridCell[5] = m_GridCell[4] + 1; + m_GridCell[6] = (int)(m_GridCell[4] + m_GridRes.x); + m_GridCell[7] = m_GridCell[6] + 1; + } + if ( sph_min.x+1 >= m_GridRes.x ) { + m_GridCell[1] = -1; m_GridCell[3] = -1; + m_GridCell[5] = -1; m_GridCell[7] = -1; + } + if ( sph_min.y+1 >= m_GridRes.y ) { + m_GridCell[2] = -1; m_GridCell[3] = -1; + m_GridCell[6] = -1; m_GridCell[7] = -1; + } +} diff --git a/Extras/sph/common/point_set.h b/Extras/sph/common/point_set.h index 3fc683e2d..c9fe29377 100644 --- a/Extras/sph/common/point_set.h +++ b/Extras/sph/common/point_set.h @@ -1,165 +1,165 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 DEF_POINT_SET - #define DEF_POINT_SET - - #include - #include - #include - #include - #include - - #include "common_defs.h" - #include "geomx.h" - #include "vector.h" - - typedef signed int xref; - - #define MAX_NEIGHBOR 80 - - #define MAX_PARAM 21 - - // Scalar params - #define PNT_DRAWMODE 0 - #define PNT_SPHERE 0 - #define PNT_POINT 1 - #define PNT_DRAWSIZE 1 - #define POINT_GRAV 2 - #define PLANE_GRAV 3 - - // Vector params - #define EMIT_POS 0 - #define EMIT_ANG 1 - #define EMIT_DANG 2 - #define EMIT_SPREAD 3 - #define EMIT_RATE 4 - #define POINT_GRAV_POS 5 - #define PLANE_GRAV_DIR 6 - - - #define BPOINT 0 - #define BPARTICLE 1 - - struct Point { - Vector3DF pos; - DWORD clr; - int next; - }; - - struct Particle { - Vector3DF pos; - DWORD clr; - int next; - Vector3DF vel; - Vector3DF vel_eval; - unsigned short age; - }; - - class PointSet : public GeomX { - public: - PointSet (); - - // Point Sets - - virtual void Initialize ( int mode, int max ); - virtual void Draw ( float* view_mat, float rad ); - virtual void Reset (); - virtual int AddPoint (); - virtual int AddPointReuse (); - Point* GetPoint ( int n ) { return (Point*) GetElem(0, n); } - int NumPoints () { return NumElem(0); } - - // Metablobs - virtual float GetValue ( float x, float y, float z ); - virtual Vector3DF GetGradient ( float x, float y, float z ); - // virtual float GetValue ( float x, float y, float z, Vector3DF& dir ); - virtual DWORD GetColor ( float x, float y, float z ); - - // Particle system - virtual void Run (); - virtual void Advance (); - virtual void Emit ( float spacing ); - - // Misc - virtual void AddVolume ( Vector3DF min, Vector3DF max, float spacing ); - - // Parameters - void SetParam (int p, float v ) { m_Param[p] = v; } - void SetParam (int p, int v ) { m_Param[p] = (float) v; } - float GetParam ( int p ) { return (float) m_Param[p]; } - Vector3DF GetVec ( int p ) { return m_Vec[p]; } - void SetVec ( int p, Vector3DF v ) { m_Vec[p] = v; } - void Toggle ( int p ) { m_Toggle[p] = !m_Toggle[p]; } - bool GetToggle ( int p ) { return m_Toggle[p]; } - - float GetDT() { return (float) m_DT; } - - // Spatial Subdivision - void Grid_Setup ( Vector3DF min, Vector3DF max, float sim_scale, float cell_size, float border ); - void Grid_Create (); - void Grid_InsertParticles (); - void Grid_Draw ( float* view_mat ); - void Grid_FindCells ( Vector3DF p, float radius ); - int Grid_FindCell ( Vector3DF p ); - Vector3DF GetGridRes () { return m_GridRes; } - Vector3DF GetGridMin () { return m_GridMin; } - Vector3DF GetGridMax () { return m_GridMax; } - Vector3DF GetGridDelta () { return m_GridDelta; } - int GetGridCell ( int x, int y, int z ); - Point* firstGridParticle ( int gc, int& p ); - Point* nextGridParticle ( int& p ); - unsigned short* getNeighborTable ( int n, int& cnt ); - - protected: - int m_Frame; - - // Parameters - double m_Param [ MAX_PARAM ]; // see defines above - Vector3DF m_Vec [ MAX_PARAM ]; - bool m_Toggle [ MAX_PARAM ]; - - // Particle System - double m_DT; - double m_Time; - - // Spatial Grid - std::vector< int > m_Grid; - std::vector< int > m_GridCnt; - int m_GridTotal; // total # cells - Vector3DF m_GridMin; // volume of grid (may not match domain volume exactly) - Vector3DF m_GridMax; - Vector3DF m_GridRes; // resolution in each axis - Vector3DF m_GridSize; // physical size in each axis - Vector3DF m_GridDelta; - float m_GridCellsize; - int m_GridCell[27]; - - // Neighbor Table - unsigned short m_NC[65536]; // neighbor table (600k) - unsigned short m_Neighbor[65536][MAX_NEIGHBOR]; - float m_NDist[65536][MAX_NEIGHBOR]; - - static int m_pcurr; - }; - -#endif +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 DEF_POINT_SET + #define DEF_POINT_SET + + #include + #include + #include + #include + #include + + #include "common_defs.h" + #include "geomx.h" + #include "vector.h" + + typedef signed int xref; + + #define MAX_NEIGHBOR 80 + + #define MAX_PARAM 21 + + // Scalar params + #define PNT_DRAWMODE 0 + #define PNT_SPHERE 0 + #define PNT_POINT 1 + #define PNT_DRAWSIZE 1 + #define POINT_GRAV 2 + #define PLANE_GRAV 3 + + // Vector params + #define EMIT_POS 0 + #define EMIT_ANG 1 + #define EMIT_DANG 2 + #define EMIT_SPREAD 3 + #define EMIT_RATE 4 + #define POINT_GRAV_POS 5 + #define PLANE_GRAV_DIR 6 + + + #define BPOINT 0 + #define BPARTICLE 1 + + struct Point { + Vector3DF pos; + DWORD clr; + int next; + }; + + struct Particle { + Vector3DF pos; + DWORD clr; + int next; + Vector3DF vel; + Vector3DF vel_eval; + unsigned short age; + }; + + class PointSet : public GeomX { + public: + PointSet (); + + // Point Sets + + virtual void Initialize ( int mode, int max ); + virtual void Draw ( float* view_mat, float rad ); + virtual void Reset (); + virtual int AddPoint (); + virtual int AddPointReuse (); + Point* GetPoint ( int n ) { return (Point*) GetElem(0, n); } + int NumPoints () { return NumElem(0); } + + // Metablobs + virtual float GetValue ( float x, float y, float z ); + virtual Vector3DF GetGradient ( float x, float y, float z ); + // virtual float GetValue ( float x, float y, float z, Vector3DF& dir ); + virtual DWORD GetColor ( float x, float y, float z ); + + // Particle system + virtual void Run (); + virtual void Advance (); + virtual void Emit ( float spacing ); + + // Misc + virtual void AddVolume ( Vector3DF min, Vector3DF max, float spacing ); + + // Parameters + void SetParam (int p, float v ) { m_Param[p] = v; } + void SetParam (int p, int v ) { m_Param[p] = (float) v; } + float GetParam ( int p ) { return (float) m_Param[p]; } + Vector3DF GetVec ( int p ) { return m_Vec[p]; } + void SetVec ( int p, Vector3DF v ) { m_Vec[p] = v; } + void Toggle ( int p ) { m_Toggle[p] = !m_Toggle[p]; } + bool GetToggle ( int p ) { return m_Toggle[p]; } + + float GetDT() { return (float) m_DT; } + + // Spatial Subdivision + void Grid_Setup ( Vector3DF min, Vector3DF max, float sim_scale, float cell_size, float border ); + void Grid_Create (); + void Grid_InsertParticles (); + void Grid_Draw ( float* view_mat ); + void Grid_FindCells ( Vector3DF p, float radius ); + int Grid_FindCell ( Vector3DF p ); + Vector3DF GetGridRes () { return m_GridRes; } + Vector3DF GetGridMin () { return m_GridMin; } + Vector3DF GetGridMax () { return m_GridMax; } + Vector3DF GetGridDelta () { return m_GridDelta; } + int GetGridCell ( int x, int y, int z ); + Point* firstGridParticle ( int gc, int& p ); + Point* nextGridParticle ( int& p ); + unsigned short* getNeighborTable ( int n, int& cnt ); + + protected: + int m_Frame; + + // Parameters + double m_Param [ MAX_PARAM ]; // see defines above + Vector3DF m_Vec [ MAX_PARAM ]; + bool m_Toggle [ MAX_PARAM ]; + + // Particle System + double m_DT; + double m_Time; + + // Spatial Grid + std::vector< int > m_Grid; + std::vector< int > m_GridCnt; + int m_GridTotal; // total # cells + Vector3DF m_GridMin; // volume of grid (may not match domain volume exactly) + Vector3DF m_GridMax; + Vector3DF m_GridRes; // resolution in each axis + Vector3DF m_GridSize; // physical size in each axis + Vector3DF m_GridDelta; + float m_GridCellsize; + int m_GridCell[27]; + + // Neighbor Table + unsigned short m_NC[65536]; // neighbor table (600k) + unsigned short m_Neighbor[65536][MAX_NEIGHBOR]; + float m_NDist[65536][MAX_NEIGHBOR]; + + static int m_pcurr; + }; + +#endif diff --git a/Extras/sph/common/vector-inline.h b/Extras/sph/common/vector-inline.h index 08bd05fb0..9d5865da5 100644 --- a/Extras/sph/common/vector-inline.h +++ b/Extras/sph/common/vector-inline.h @@ -1,782 +1,782 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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. -*/ -// Vector Operations Implemented: -// =, +, -, *, / (on vectors and scalars) -// Cross Cross product vector with op -// Dot Dot product vector with op -// Dist (op) Distance from vector to op -// DistSq Distance^2 from vector to op -// Length () Length of vector -// Normalize () Normalizes vector -// - -#include "vector.h" - -// Vector2DC Code Definition - -#define VTYPE unsigned char -#define VNAME 2DC - -// Constructors/Destructors -inline Vector2DC::Vector2DC() {x=0; y=0;} -inline Vector2DC::~Vector2DC() {} -inline Vector2DC::Vector2DC (VTYPE xa, VTYPE ya) {x=xa; y=ya;} -inline Vector2DC::Vector2DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} - -// Member Functions -inline Vector2DC &Vector2DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} - -// Note: Cross product does not exist for 2D vectors (only 3D) - -inline double Vector2DC::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DC::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DC::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} - -inline double Vector2DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} - -inline Vector2DC &Vector2DC::Normalize (void) { - double n = (double) x*x + (double) y*y; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - } - return *this; -} -inline double Vector2DC::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector2DC::X(void) {return x;} -inline VTYPE &Vector2DC::Y(void) {return y;} -inline VTYPE Vector2DC::Z(void) {return 0;} -inline VTYPE Vector2DC::W(void) {return 0;} -inline const VTYPE &Vector2DC::X(void) const {return x;} -inline const VTYPE &Vector2DC::Y(void) const {return y;} -inline const VTYPE Vector2DC::Z(void) const {return 0;} -inline const VTYPE Vector2DC::W(void) const {return 0;} -inline VTYPE *Vector2DC::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector2DI Code Definition - -#define VNAME 2DI -#define VTYPE int - -// Constructors/Destructors -inline Vector2DI::Vector2DI() {x=0; y=0;} -inline Vector2DI::~Vector2DI() {} -inline Vector2DI::Vector2DI (VTYPE xa, VTYPE ya) {x=xa; y=ya;} -inline Vector2DI::Vector2DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} - -// Member Functions -inline Vector2DI &Vector2DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} - -// Note: Cross product does not exist for 2D vectors (only 3D) - -inline double Vector2DI::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DI::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DI::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} - -inline double Vector2DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} - -inline Vector2DI &Vector2DI::Normalize (void) { - double n = (double) x*x + (double) y*y; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - } - return *this; -} -inline double Vector2DI::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector2DI::X(void) {return x;} -inline VTYPE &Vector2DI::Y(void) {return y;} -inline VTYPE Vector2DI::Z(void) {return 0;} -inline VTYPE Vector2DI::W(void) {return 0;} -inline const VTYPE &Vector2DI::X(void) const {return x;} -inline const VTYPE &Vector2DI::Y(void) const {return y;} -inline const VTYPE Vector2DI::Z(void) const {return 0;} -inline const VTYPE Vector2DI::W(void) const {return 0;} -inline VTYPE *Vector2DI::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector2DF Code Definition - -#define VNAME 2DF -#define VTYPE double - -// Constructors/Destructors -inline Vector2DF::Vector2DF() {x=0; y=0;} -inline Vector2DF::~Vector2DF() {} -inline Vector2DF::Vector2DF (const VTYPE xa, const VTYPE ya) {x=xa; y=ya;} -inline Vector2DF::Vector2DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} - -// Member Functions -inline Vector2DF &Vector2DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} - -// Note: Cross product does not exist for 2D vectors (only 3D) - -inline double Vector2DF::Dot(const Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DF::Dot(const Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DF::Dot(const Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} - -inline double Vector2DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::DistSq (const Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} - -inline Vector2DF &Vector2DF::Normalize (void) { - double n = (double) x*x + (double) y*y; - if (n!=0.0) { - n = sqrt(n); - x /= n; - y /= n; - } - return *this; -} -inline double Vector2DF::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector2DF::X(void) {return x;} -inline VTYPE &Vector2DF::Y(void) {return y;} -inline VTYPE Vector2DF::Z(void) {return 0;} -inline VTYPE Vector2DF::W(void) {return 0;} -inline const VTYPE &Vector2DF::X(void) const {return x;} -inline const VTYPE &Vector2DF::Y(void) const {return y;} -inline const VTYPE Vector2DF::Z(void) const {return 0;} -inline const VTYPE Vector2DF::W(void) const {return 0;} -inline VTYPE *Vector2DF::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector3DC Code Definition - -#define VNAME 3DC -#define VTYPE unsigned char - -// Constructors/Destructors -inline Vector3DC::Vector3DC() {x=0; y=0; z=0;} -inline Vector3DC::~Vector3DC() {} -inline Vector3DC::Vector3DC (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} -inline Vector3DC::Vector3DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DC::Vector3DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DC::Vector3DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DC::Vector3DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DC::Vector3DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DC::Vector3DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DC::Vector3DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} - -// Member Functions -inline Vector3DC &Vector3DC::Set (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za; return *this;} - -inline Vector3DC &Vector3DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DC &Vector3DC::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DC &Vector3DC::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} - -inline double Vector3DC::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DC::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DC::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} - -inline double Vector3DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} - -inline Vector3DC &Vector3DC::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - z = (VTYPE) (((double) z*255)/n); - } - return *this; -} -inline double Vector3DC::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector3DC::X(void) {return x;} -inline VTYPE &Vector3DC::Y(void) {return y;} -inline VTYPE &Vector3DC::Z(void) {return z;} -inline VTYPE Vector3DC::W(void) {return 0;} -inline const VTYPE &Vector3DC::X(void) const {return x;} -inline const VTYPE &Vector3DC::Y(void) const {return y;} -inline const VTYPE &Vector3DC::Z(void) const {return z;} -inline const VTYPE Vector3DC::W(void) const {return 0;} -inline VTYPE *Vector3DC::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector3DI Code Definition - -#define VNAME 3DI -#define VTYPE int - -// Constructors/Destructors -inline Vector3DI::Vector3DI() {x=0; y=0; z=0;} -inline Vector3DI::~Vector3DI() {} -inline Vector3DI::Vector3DI (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} -inline Vector3DI::Vector3DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DI::Vector3DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DI::Vector3DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DI::Vector3DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DI::Vector3DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DI::Vector3DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DI::Vector3DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} - -// Set Functions -inline Vector3DI &Vector3DI::Set (const int xa, const int ya, const int za) -{ - x = xa; y = ya; z = za; - return *this; -} - -// Member Functions -inline Vector3DI &Vector3DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DI &Vector3DI::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DI &Vector3DI::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} - -inline double Vector3DI::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DI::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DI::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} - -inline double Vector3DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} - -inline Vector3DI &Vector3DI::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - z = (VTYPE) (((double) z*255)/n); - } - return *this; -} -inline double Vector3DI::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector3DI::X(void) {return x;} -inline VTYPE &Vector3DI::Y(void) {return y;} -inline VTYPE &Vector3DI::Z(void) {return z;} -inline VTYPE Vector3DI::W(void) {return 0;} -inline const VTYPE &Vector3DI::X(void) const {return x;} -inline const VTYPE &Vector3DI::Y(void) const {return y;} -inline const VTYPE &Vector3DI::Z(void) const {return z;} -inline const VTYPE Vector3DI::W(void) const {return 0;} -inline VTYPE *Vector3DI::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector3DF Code Definition - -#define VNAME 3DF -#define VTYPE double - -// Constructors/Destructors -inline Vector3DF::Vector3DF() {x=0; y=0; z=0;} -inline Vector3DF::~Vector3DF() {} -inline Vector3DF::Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za) {x=xa; y=ya; z=za;} -inline Vector3DF::Vector3DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DF::Vector3DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DF::Vector3DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DF::Vector3DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DF::Vector3DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DF::Vector3DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DF::Vector3DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} - -// Set Functions -inline Vector3DF &Vector3DF::Set (const double xa, const double ya, const double za) -{ - x = xa; y = ya; z = za; - return *this; -} - -// Member Functions -inline Vector3DF &Vector3DF::operator= (const int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator= (const double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator+= (const int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator+= (const double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator-= (const int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator-= (const double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator*= (const int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator*= (const double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator/= (const int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator/= (const double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::Cross (const Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DF &Vector3DF::Cross (const Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DF &Vector3DF::Cross (const Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} - -inline double Vector3DF::Dot(const Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DF::Dot(const Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DF::Dot(const Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} - -inline double Vector3DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::DistSq (const Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} - -inline Vector3DF &Vector3DF::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z; - if (n!=0.0) { - n = sqrt(n); - x /= n; y /= n; z /= n; - } - return *this; -} -inline double Vector3DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector3DF::X() {return x;} -inline VTYPE &Vector3DF::Y() {return y;} -inline VTYPE &Vector3DF::Z() {return z;} -inline VTYPE Vector3DF::W() {return 0;} -inline const VTYPE &Vector3DF::X() const {return x;} -inline const VTYPE &Vector3DF::Y() const {return y;} -inline const VTYPE &Vector3DF::Z() const {return z;} -inline const VTYPE Vector3DF::W() const {return 0;} -inline VTYPE *Vector3DF::Data () {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector4DF Code Definition - -#define VNAME 4DF -#define VTYPE double - -// Constructors/Destructors -inline Vector4DF::Vector4DF() {x=0; y=0; z=0; w=0;} -inline Vector4DF::~Vector4DF() {} -inline Vector4DF::Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa) {x=xa; y=ya; z=za; w=wa;} -inline Vector4DF::Vector4DF (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w;} - -// Member Functions -inline Vector4DF &Vector4DF::operator= (int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator= (double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator+= (int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator+= (double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; w+=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator-= (int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator-= (double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; w-=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator*= (int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator*= (double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; w*=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator/= (int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator/= (double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; w/=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::Cross (Vector4DF &v) {double ax = x, ay = y, az = z, aw = w; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); w = (VTYPE) 0; return *this;} - -inline double Vector4DF::Dot(Vector4DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z + (double) w*v.w; return dot;} - -inline double Vector4DF::Dist (Vector4DF &v) {double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} - -inline double Vector4DF::DistSq (Vector4DF &v) {double a,b,c,d; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; d = (double) w - (double) v.w; return (a*a + b*b + c*c + d*d);} - -inline Vector4DF &Vector4DF::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; - if (n!=0.0) { - n = sqrt(n); - x /= n; y /= n; z /= n; w /= n; - } - return *this; -} -inline double Vector4DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector4DF::X(void) {return x;} -inline VTYPE &Vector4DF::Y(void) {return y;} -inline VTYPE &Vector4DF::Z(void) {return z;} -inline VTYPE &Vector4DF::W(void) {return w;} -inline const VTYPE &Vector4DF::X(void) const {return x;} -inline const VTYPE &Vector4DF::Y(void) const {return y;} -inline const VTYPE &Vector4DF::Z(void) const {return z;} -inline const VTYPE &Vector4DF::W(void) const {return w;} -inline VTYPE *Vector4DF::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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. +*/ +// Vector Operations Implemented: +// =, +, -, *, / (on vectors and scalars) +// Cross Cross product vector with op +// Dot Dot product vector with op +// Dist (op) Distance from vector to op +// DistSq Distance^2 from vector to op +// Length () Length of vector +// Normalize () Normalizes vector +// + +#include "vector.h" + +// Vector2DC Code Definition + +#define VTYPE unsigned char +#define VNAME 2DC + +// Constructors/Destructors +inline Vector2DC::Vector2DC() {x=0; y=0;} +inline Vector2DC::~Vector2DC() {} +inline Vector2DC::Vector2DC (VTYPE xa, VTYPE ya) {x=xa; y=ya;} +inline Vector2DC::Vector2DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} + +// Member Functions +inline Vector2DC &Vector2DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} + +// Note: Cross product does not exist for 2D vectors (only 3D) + +inline double Vector2DC::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DC::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DC::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} + +inline double Vector2DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} + +inline Vector2DC &Vector2DC::Normalize (void) { + double n = (double) x*x + (double) y*y; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + } + return *this; +} +inline double Vector2DC::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector2DC::X(void) {return x;} +inline VTYPE &Vector2DC::Y(void) {return y;} +inline VTYPE Vector2DC::Z(void) {return 0;} +inline VTYPE Vector2DC::W(void) {return 0;} +inline const VTYPE &Vector2DC::X(void) const {return x;} +inline const VTYPE &Vector2DC::Y(void) const {return y;} +inline const VTYPE Vector2DC::Z(void) const {return 0;} +inline const VTYPE Vector2DC::W(void) const {return 0;} +inline VTYPE *Vector2DC::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector2DI Code Definition + +#define VNAME 2DI +#define VTYPE int + +// Constructors/Destructors +inline Vector2DI::Vector2DI() {x=0; y=0;} +inline Vector2DI::~Vector2DI() {} +inline Vector2DI::Vector2DI (VTYPE xa, VTYPE ya) {x=xa; y=ya;} +inline Vector2DI::Vector2DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} + +// Member Functions +inline Vector2DI &Vector2DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} + +// Note: Cross product does not exist for 2D vectors (only 3D) + +inline double Vector2DI::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DI::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DI::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} + +inline double Vector2DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} + +inline Vector2DI &Vector2DI::Normalize (void) { + double n = (double) x*x + (double) y*y; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + } + return *this; +} +inline double Vector2DI::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector2DI::X(void) {return x;} +inline VTYPE &Vector2DI::Y(void) {return y;} +inline VTYPE Vector2DI::Z(void) {return 0;} +inline VTYPE Vector2DI::W(void) {return 0;} +inline const VTYPE &Vector2DI::X(void) const {return x;} +inline const VTYPE &Vector2DI::Y(void) const {return y;} +inline const VTYPE Vector2DI::Z(void) const {return 0;} +inline const VTYPE Vector2DI::W(void) const {return 0;} +inline VTYPE *Vector2DI::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector2DF Code Definition + +#define VNAME 2DF +#define VTYPE double + +// Constructors/Destructors +inline Vector2DF::Vector2DF() {x=0; y=0;} +inline Vector2DF::~Vector2DF() {} +inline Vector2DF::Vector2DF (const VTYPE xa, const VTYPE ya) {x=xa; y=ya;} +inline Vector2DF::Vector2DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} + +// Member Functions +inline Vector2DF &Vector2DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} + +// Note: Cross product does not exist for 2D vectors (only 3D) + +inline double Vector2DF::Dot(const Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DF::Dot(const Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DF::Dot(const Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} + +inline double Vector2DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::DistSq (const Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} + +inline Vector2DF &Vector2DF::Normalize (void) { + double n = (double) x*x + (double) y*y; + if (n!=0.0) { + n = sqrt(n); + x /= n; + y /= n; + } + return *this; +} +inline double Vector2DF::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector2DF::X(void) {return x;} +inline VTYPE &Vector2DF::Y(void) {return y;} +inline VTYPE Vector2DF::Z(void) {return 0;} +inline VTYPE Vector2DF::W(void) {return 0;} +inline const VTYPE &Vector2DF::X(void) const {return x;} +inline const VTYPE &Vector2DF::Y(void) const {return y;} +inline const VTYPE Vector2DF::Z(void) const {return 0;} +inline const VTYPE Vector2DF::W(void) const {return 0;} +inline VTYPE *Vector2DF::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector3DC Code Definition + +#define VNAME 3DC +#define VTYPE unsigned char + +// Constructors/Destructors +inline Vector3DC::Vector3DC() {x=0; y=0; z=0;} +inline Vector3DC::~Vector3DC() {} +inline Vector3DC::Vector3DC (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} +inline Vector3DC::Vector3DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DC::Vector3DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DC::Vector3DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DC::Vector3DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DC::Vector3DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DC::Vector3DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DC::Vector3DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} + +// Member Functions +inline Vector3DC &Vector3DC::Set (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za; return *this;} + +inline Vector3DC &Vector3DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DC &Vector3DC::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DC &Vector3DC::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} + +inline double Vector3DC::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DC::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DC::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} + +inline double Vector3DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} + +inline Vector3DC &Vector3DC::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + z = (VTYPE) (((double) z*255)/n); + } + return *this; +} +inline double Vector3DC::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector3DC::X(void) {return x;} +inline VTYPE &Vector3DC::Y(void) {return y;} +inline VTYPE &Vector3DC::Z(void) {return z;} +inline VTYPE Vector3DC::W(void) {return 0;} +inline const VTYPE &Vector3DC::X(void) const {return x;} +inline const VTYPE &Vector3DC::Y(void) const {return y;} +inline const VTYPE &Vector3DC::Z(void) const {return z;} +inline const VTYPE Vector3DC::W(void) const {return 0;} +inline VTYPE *Vector3DC::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector3DI Code Definition + +#define VNAME 3DI +#define VTYPE int + +// Constructors/Destructors +inline Vector3DI::Vector3DI() {x=0; y=0; z=0;} +inline Vector3DI::~Vector3DI() {} +inline Vector3DI::Vector3DI (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} +inline Vector3DI::Vector3DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DI::Vector3DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DI::Vector3DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DI::Vector3DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DI::Vector3DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DI::Vector3DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DI::Vector3DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} + +// Set Functions +inline Vector3DI &Vector3DI::Set (const int xa, const int ya, const int za) +{ + x = xa; y = ya; z = za; + return *this; +} + +// Member Functions +inline Vector3DI &Vector3DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DI &Vector3DI::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DI &Vector3DI::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} + +inline double Vector3DI::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DI::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DI::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} + +inline double Vector3DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} + +inline Vector3DI &Vector3DI::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + z = (VTYPE) (((double) z*255)/n); + } + return *this; +} +inline double Vector3DI::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector3DI::X(void) {return x;} +inline VTYPE &Vector3DI::Y(void) {return y;} +inline VTYPE &Vector3DI::Z(void) {return z;} +inline VTYPE Vector3DI::W(void) {return 0;} +inline const VTYPE &Vector3DI::X(void) const {return x;} +inline const VTYPE &Vector3DI::Y(void) const {return y;} +inline const VTYPE &Vector3DI::Z(void) const {return z;} +inline const VTYPE Vector3DI::W(void) const {return 0;} +inline VTYPE *Vector3DI::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector3DF Code Definition + +#define VNAME 3DF +#define VTYPE double + +// Constructors/Destructors +inline Vector3DF::Vector3DF() {x=0; y=0; z=0;} +inline Vector3DF::~Vector3DF() {} +inline Vector3DF::Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za) {x=xa; y=ya; z=za;} +inline Vector3DF::Vector3DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DF::Vector3DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DF::Vector3DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DF::Vector3DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DF::Vector3DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DF::Vector3DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DF::Vector3DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} + +// Set Functions +inline Vector3DF &Vector3DF::Set (const double xa, const double ya, const double za) +{ + x = xa; y = ya; z = za; + return *this; +} + +// Member Functions +inline Vector3DF &Vector3DF::operator= (const int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator= (const double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator+= (const int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator+= (const double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator-= (const int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator-= (const double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator*= (const int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator*= (const double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator/= (const int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator/= (const double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::Cross (const Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DF &Vector3DF::Cross (const Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DF &Vector3DF::Cross (const Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} + +inline double Vector3DF::Dot(const Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DF::Dot(const Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DF::Dot(const Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} + +inline double Vector3DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::DistSq (const Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} + +inline Vector3DF &Vector3DF::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z; + if (n!=0.0) { + n = sqrt(n); + x /= n; y /= n; z /= n; + } + return *this; +} +inline double Vector3DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector3DF::X() {return x;} +inline VTYPE &Vector3DF::Y() {return y;} +inline VTYPE &Vector3DF::Z() {return z;} +inline VTYPE Vector3DF::W() {return 0;} +inline const VTYPE &Vector3DF::X() const {return x;} +inline const VTYPE &Vector3DF::Y() const {return y;} +inline const VTYPE &Vector3DF::Z() const {return z;} +inline const VTYPE Vector3DF::W() const {return 0;} +inline VTYPE *Vector3DF::Data () {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector4DF Code Definition + +#define VNAME 4DF +#define VTYPE double + +// Constructors/Destructors +inline Vector4DF::Vector4DF() {x=0; y=0; z=0; w=0;} +inline Vector4DF::~Vector4DF() {} +inline Vector4DF::Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa) {x=xa; y=ya; z=za; w=wa;} +inline Vector4DF::Vector4DF (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w;} + +// Member Functions +inline Vector4DF &Vector4DF::operator= (int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator= (double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator+= (int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator+= (double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; w+=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator-= (int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator-= (double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; w-=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator*= (int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator*= (double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; w*=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator/= (int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator/= (double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; w/=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::Cross (Vector4DF &v) {double ax = x, ay = y, az = z, aw = w; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); w = (VTYPE) 0; return *this;} + +inline double Vector4DF::Dot(Vector4DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z + (double) w*v.w; return dot;} + +inline double Vector4DF::Dist (Vector4DF &v) {double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} + +inline double Vector4DF::DistSq (Vector4DF &v) {double a,b,c,d; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; d = (double) w - (double) v.w; return (a*a + b*b + c*c + d*d);} + +inline Vector4DF &Vector4DF::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; + if (n!=0.0) { + n = sqrt(n); + x /= n; y /= n; z /= n; w /= n; + } + return *this; +} +inline double Vector4DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector4DF::X(void) {return x;} +inline VTYPE &Vector4DF::Y(void) {return y;} +inline VTYPE &Vector4DF::Z(void) {return z;} +inline VTYPE &Vector4DF::W(void) {return w;} +inline const VTYPE &Vector4DF::X(void) const {return x;} +inline const VTYPE &Vector4DF::Y(void) const {return y;} +inline const VTYPE &Vector4DF::Z(void) const {return z;} +inline const VTYPE &Vector4DF::W(void) const {return w;} +inline VTYPE *Vector4DF::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME diff --git a/Extras/sph/common/vector.cci b/Extras/sph/common/vector.cci index a4c9fc575..2a548f340 100644 --- a/Extras/sph/common/vector.cci +++ b/Extras/sph/common/vector.cci @@ -1,761 +1,761 @@ -// Vector Operations Implemented: -// =, +, -, *, / (on vectors and scalars) -// Cross Cross product vector with op -// Dot Dot product vector with op -// Dist (op) Distance from vector to op -// DistSq Distance^2 from vector to op -// Length () Length of vector -// Normalize () Normalizes vector -// - -#include - -// Vector2DC Code Definition - -#define VTYPE unsigned char -#define VNAME 2DC - -// Constructors/Destructors -inline Vector2DC::Vector2DC() {x=0; y=0;} -inline Vector2DC::~Vector2DC() {} -inline Vector2DC::Vector2DC (VTYPE xa, VTYPE ya) {x=xa; y=ya;} -inline Vector2DC::Vector2DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DC::Vector2DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} - -// Member Functions -inline Vector2DC &Vector2DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} - -inline Vector2DC &Vector2DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DC &Vector2DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} - -// Note: Cross product does not exist for 2D vectors (only 3D) - -inline double Vector2DC::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DC::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DC::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} - -inline double Vector2DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DC::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DC::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} - -inline Vector2DC &Vector2DC::Normalize (void) { - double n = (double) x*x + (double) y*y; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - } - return *this; -} -inline double Vector2DC::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector2DC::X(void) {return x;} -inline VTYPE &Vector2DC::Y(void) {return y;} -inline VTYPE Vector2DC::Z(void) {return 0;} -inline VTYPE Vector2DC::W(void) {return 0;} -inline const VTYPE &Vector2DC::X(void) const {return x;} -inline const VTYPE &Vector2DC::Y(void) const {return y;} -inline const VTYPE Vector2DC::Z(void) const {return 0;} -inline const VTYPE Vector2DC::W(void) const {return 0;} -inline VTYPE *Vector2DC::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector2DI Code Definition - -#define VNAME 2DI -#define VTYPE int - -// Constructors/Destructors -inline Vector2DI::Vector2DI() {x=0; y=0;} -inline Vector2DI::~Vector2DI() {} -inline Vector2DI::Vector2DI (VTYPE xa, VTYPE ya) {x=xa; y=ya;} -inline Vector2DI::Vector2DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DI::Vector2DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} - -// Member Functions -inline Vector2DI &Vector2DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} - -inline Vector2DI &Vector2DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DI &Vector2DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} - -// Note: Cross product does not exist for 2D vectors (only 3D) - -inline double Vector2DI::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DI::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DI::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} - -inline double Vector2DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DI::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DI::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} - -inline Vector2DI &Vector2DI::Normalize (void) { - double n = (double) x*x + (double) y*y; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - } - return *this; -} -inline double Vector2DI::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector2DI::X(void) {return x;} -inline VTYPE &Vector2DI::Y(void) {return y;} -inline VTYPE Vector2DI::Z(void) {return 0;} -inline VTYPE Vector2DI::W(void) {return 0;} -inline const VTYPE &Vector2DI::X(void) const {return x;} -inline const VTYPE &Vector2DI::Y(void) const {return y;} -inline const VTYPE Vector2DI::Z(void) const {return 0;} -inline const VTYPE Vector2DI::W(void) const {return 0;} -inline VTYPE *Vector2DI::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector2DF Code Definition - -#define VNAME 2DF -#define VTYPE double - -// Constructors/Destructors -inline Vector2DF::Vector2DF() {x=0; y=0;} -inline Vector2DF::~Vector2DF() {} -inline Vector2DF::Vector2DF (const VTYPE xa, const VTYPE ya) {x=xa; y=ya;} -inline Vector2DF::Vector2DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} -inline Vector2DF::Vector2DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} - -// Member Functions -inline Vector2DF &Vector2DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} - -inline Vector2DF &Vector2DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector2DF &Vector2DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} - -// Note: Cross product does not exist for 2D vectors (only 3D) - -inline double Vector2DF::Dot(const Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DF::Dot(const Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} -inline double Vector2DF::Dot(const Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} - -inline double Vector2DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector2DF::DistSq (const Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} -inline double Vector2DF::DistSq (const Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} - -inline Vector2DF &Vector2DF::Normalize (void) { - double n = (double) x*x + (double) y*y; - if (n!=0.0) { - n = sqrt(n); - x /= n; - y /= n; - } - return *this; -} -inline double Vector2DF::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector2DF::X(void) {return x;} -inline VTYPE &Vector2DF::Y(void) {return y;} -inline VTYPE Vector2DF::Z(void) {return 0;} -inline VTYPE Vector2DF::W(void) {return 0;} -inline const VTYPE &Vector2DF::X(void) const {return x;} -inline const VTYPE &Vector2DF::Y(void) const {return y;} -inline const VTYPE Vector2DF::Z(void) const {return 0;} -inline const VTYPE Vector2DF::W(void) const {return 0;} -inline VTYPE *Vector2DF::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector3DC Code Definition - -#define VNAME 3DC -#define VTYPE unsigned char - -// Constructors/Destructors -inline Vector3DC::Vector3DC() {x=0; y=0; z=0;} -inline Vector3DC::~Vector3DC() {} -inline Vector3DC::Vector3DC (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} -inline Vector3DC::Vector3DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DC::Vector3DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DC::Vector3DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DC::Vector3DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DC::Vector3DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DC::Vector3DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DC::Vector3DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} - -// Member Functions -inline Vector3DC &Vector3DC::Set (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za; return *this;} - -inline Vector3DC &Vector3DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DC &Vector3DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} - -inline Vector3DC &Vector3DC::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DC &Vector3DC::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DC &Vector3DC::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} - -inline double Vector3DC::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DC::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DC::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} - -inline double Vector3DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DC::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DC::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} - -inline Vector3DC &Vector3DC::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - z = (VTYPE) (((double) z*255)/n); - } - return *this; -} -inline double Vector3DC::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector3DC::X(void) {return x;} -inline VTYPE &Vector3DC::Y(void) {return y;} -inline VTYPE &Vector3DC::Z(void) {return z;} -inline VTYPE Vector3DC::W(void) {return 0;} -inline const VTYPE &Vector3DC::X(void) const {return x;} -inline const VTYPE &Vector3DC::Y(void) const {return y;} -inline const VTYPE &Vector3DC::Z(void) const {return z;} -inline const VTYPE Vector3DC::W(void) const {return 0;} -inline VTYPE *Vector3DC::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector3DI Code Definition - -#define VNAME 3DI -#define VTYPE int - -// Constructors/Destructors -inline Vector3DI::Vector3DI() {x=0; y=0; z=0;} -inline Vector3DI::~Vector3DI() {} -inline Vector3DI::Vector3DI (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} -inline Vector3DI::Vector3DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DI::Vector3DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DI::Vector3DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DI::Vector3DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DI::Vector3DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DI::Vector3DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DI::Vector3DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} - -// Set Functions -inline Vector3DI &Vector3DI::Set (const int xa, const int ya, const int za) -{ - x = xa; y = ya; z = za; - return *this; -} - -// Member Functions -inline Vector3DI &Vector3DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DI &Vector3DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} - -inline Vector3DI &Vector3DI::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DI &Vector3DI::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DI &Vector3DI::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} - -inline double Vector3DI::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DI::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DI::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} - -inline double Vector3DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DI::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DI::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} - -inline Vector3DI &Vector3DI::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z; - if (n!=0.0) { - n = sqrt(n); - x = (VTYPE) (((double) x*255)/n); - y = (VTYPE) (((double) y*255)/n); - z = (VTYPE) (((double) z*255)/n); - } - return *this; -} -inline double Vector3DI::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector3DI::X(void) {return x;} -inline VTYPE &Vector3DI::Y(void) {return y;} -inline VTYPE &Vector3DI::Z(void) {return z;} -inline VTYPE Vector3DI::W(void) {return 0;} -inline const VTYPE &Vector3DI::X(void) const {return x;} -inline const VTYPE &Vector3DI::Y(void) const {return y;} -inline const VTYPE &Vector3DI::Z(void) const {return z;} -inline const VTYPE Vector3DI::W(void) const {return 0;} -inline VTYPE *Vector3DI::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector3DF Code Definition - -#define VNAME 3DF -#define VTYPE float - -// Constructors/Destructors -inline Vector3DF::Vector3DF() {x=0; y=0; z=0;} -inline Vector3DF::~Vector3DF() {} -inline Vector3DF::Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za) {x=xa; y=ya; z=za;} -inline Vector3DF::Vector3DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DF::Vector3DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DF::Vector3DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} -inline Vector3DF::Vector3DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DF::Vector3DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DF::Vector3DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} -inline Vector3DF::Vector3DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} - -// Set Functions -inline Vector3DF &Vector3DF::Set (const double xa, const double ya, const double za) -{ - x = (float) xa; y = (float) ya; z = (float) za; - return *this; -} - -// Member Functions -inline Vector3DF &Vector3DF::operator= (const int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator= (const double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator+= (const int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator+= (const double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator-= (const int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator-= (const double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator*= (const int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator*= (const double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::operator/= (const int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator/= (const double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector3DF &Vector3DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} - -inline Vector3DF &Vector3DF::Cross (const Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DF &Vector3DF::Cross (const Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} -inline Vector3DF &Vector3DF::Cross (const Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} - -inline double Vector3DF::Dot(const Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DF::Dot(const Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} -inline double Vector3DF::Dot(const Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} - -inline double Vector3DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} -inline double Vector3DF::DistSq (const Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} -inline double Vector3DF::DistSq (const Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} - -inline Vector3DF &Vector3DF::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z; - if (n!=0.0) { - n = sqrt(n); - x /= (float) n; y /= (float) n; z /= (float) n; - } - return *this; -} -inline double Vector3DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector3DF::X() {return x;} -inline VTYPE &Vector3DF::Y() {return y;} -inline VTYPE &Vector3DF::Z() {return z;} -inline VTYPE Vector3DF::W() {return 0;} -inline const VTYPE &Vector3DF::X() const {return x;} -inline const VTYPE &Vector3DF::Y() const {return y;} -inline const VTYPE &Vector3DF::Z() const {return z;} -inline const VTYPE Vector3DF::W() const {return 0;} -inline VTYPE *Vector3DF::Data () {return &x;} - -#undef VTYPE -#undef VNAME - -// Vector4DF Code Definition - -#define VNAME 4DF -#define VTYPE double - -// Constructors/Destructors -inline Vector4DF::Vector4DF() {x=0; y=0; z=0; w=0;} -inline Vector4DF::~Vector4DF() {} -inline Vector4DF::Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa) {x=xa; y=ya; z=za; w=wa;} -inline Vector4DF::Vector4DF (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} -inline Vector4DF::Vector4DF (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w;} - -// Member Functions -inline Vector4DF &Vector4DF::operator= (int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator= (double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} -inline Vector4DF &Vector4DF::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator+= (int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator+= (double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; w+=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator-= (int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator-= (double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; w-=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator*= (int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator*= (double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; w*=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::operator/= (int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator/= (double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} -inline Vector4DF &Vector4DF::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; w/=(VTYPE) op.w; return *this;} - -inline Vector4DF &Vector4DF::Cross (Vector4DF &v) {double ax = x, ay = y, az = z, aw = w; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); w = (VTYPE) 0; return *this;} - -inline double Vector4DF::Dot(Vector4DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z + (double) w*v.w; return dot;} - -inline double Vector4DF::Dist (Vector4DF &v) {double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} - -inline double Vector4DF::DistSq (Vector4DF &v) {double a,b,c,d; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; d = (double) w - (double) v.w; return (a*a + b*b + c*c + d*d);} - -inline Vector4DF &Vector4DF::Normalize (void) { - double n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; - if (n!=0.0) { - n = sqrt(n); - x /= n; y /= n; z /= n; w /= n; - } - return *this; -} -inline double Vector4DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; if (n != 0.0) return sqrt(n); return 0.0; } - -inline VTYPE &Vector4DF::X(void) {return x;} -inline VTYPE &Vector4DF::Y(void) {return y;} -inline VTYPE &Vector4DF::Z(void) {return z;} -inline VTYPE &Vector4DF::W(void) {return w;} -inline const VTYPE &Vector4DF::X(void) const {return x;} -inline const VTYPE &Vector4DF::Y(void) const {return y;} -inline const VTYPE &Vector4DF::Z(void) const {return z;} -inline const VTYPE &Vector4DF::W(void) const {return w;} -inline VTYPE *Vector4DF::Data (void) {return &x;} - -#undef VTYPE -#undef VNAME +// Vector Operations Implemented: +// =, +, -, *, / (on vectors and scalars) +// Cross Cross product vector with op +// Dot Dot product vector with op +// Dist (op) Distance from vector to op +// DistSq Distance^2 from vector to op +// Length () Length of vector +// Normalize () Normalizes vector +// + +#include + +// Vector2DC Code Definition + +#define VTYPE unsigned char +#define VNAME 2DC + +// Constructors/Destructors +inline Vector2DC::Vector2DC() {x=0; y=0;} +inline Vector2DC::~Vector2DC() {} +inline Vector2DC::Vector2DC (VTYPE xa, VTYPE ya) {x=xa; y=ya;} +inline Vector2DC::Vector2DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DC::Vector2DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} + +// Member Functions +inline Vector2DC &Vector2DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} + +inline Vector2DC &Vector2DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DC &Vector2DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} + +// Note: Cross product does not exist for 2D vectors (only 3D) + +inline double Vector2DC::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DC::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DC::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} + +inline double Vector2DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DC::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DC::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} + +inline Vector2DC &Vector2DC::Normalize (void) { + double n = (double) x*x + (double) y*y; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + } + return *this; +} +inline double Vector2DC::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector2DC::X(void) {return x;} +inline VTYPE &Vector2DC::Y(void) {return y;} +inline VTYPE Vector2DC::Z(void) {return 0;} +inline VTYPE Vector2DC::W(void) {return 0;} +inline const VTYPE &Vector2DC::X(void) const {return x;} +inline const VTYPE &Vector2DC::Y(void) const {return y;} +inline const VTYPE Vector2DC::Z(void) const {return 0;} +inline const VTYPE Vector2DC::W(void) const {return 0;} +inline VTYPE *Vector2DC::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector2DI Code Definition + +#define VNAME 2DI +#define VTYPE int + +// Constructors/Destructors +inline Vector2DI::Vector2DI() {x=0; y=0;} +inline Vector2DI::~Vector2DI() {} +inline Vector2DI::Vector2DI (VTYPE xa, VTYPE ya) {x=xa; y=ya;} +inline Vector2DI::Vector2DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DI::Vector2DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} + +// Member Functions +inline Vector2DI &Vector2DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} + +inline Vector2DI &Vector2DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DI &Vector2DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} + +// Note: Cross product does not exist for 2D vectors (only 3D) + +inline double Vector2DI::Dot(Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DI::Dot(Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DI::Dot(Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} + +inline double Vector2DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DI::DistSq (Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DI::DistSq (Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} + +inline Vector2DI &Vector2DI::Normalize (void) { + double n = (double) x*x + (double) y*y; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + } + return *this; +} +inline double Vector2DI::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector2DI::X(void) {return x;} +inline VTYPE &Vector2DI::Y(void) {return y;} +inline VTYPE Vector2DI::Z(void) {return 0;} +inline VTYPE Vector2DI::W(void) {return 0;} +inline const VTYPE &Vector2DI::X(void) const {return x;} +inline const VTYPE &Vector2DI::Y(void) const {return y;} +inline const VTYPE Vector2DI::Z(void) const {return 0;} +inline const VTYPE Vector2DI::W(void) const {return 0;} +inline VTYPE *Vector2DI::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector2DF Code Definition + +#define VNAME 2DF +#define VTYPE double + +// Constructors/Destructors +inline Vector2DF::Vector2DF() {x=0; y=0;} +inline Vector2DF::~Vector2DF() {} +inline Vector2DF::Vector2DF (const VTYPE xa, const VTYPE ya) {x=xa; y=ya;} +inline Vector2DF::Vector2DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} +inline Vector2DF::Vector2DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y;} + +// Member Functions +inline Vector2DF &Vector2DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} + +inline Vector2DF &Vector2DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector2DF &Vector2DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} + +// Note: Cross product does not exist for 2D vectors (only 3D) + +inline double Vector2DF::Dot(const Vector2DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DF::Dot(const Vector2DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} +inline double Vector2DF::Dot(const Vector2DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y; return dot;} + +inline double Vector2DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector2DF::DistSq (const Vector2DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector2DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector2DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector3DC &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector3DI &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector3DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} +inline double Vector2DF::DistSq (const Vector4DF &v) { double a,b; a = (double) x - (double) v.x; b = (double) y - (double) v.y; return (a*a + b*b);} + +inline Vector2DF &Vector2DF::Normalize (void) { + double n = (double) x*x + (double) y*y; + if (n!=0.0) { + n = sqrt(n); + x /= n; + y /= n; + } + return *this; +} +inline double Vector2DF::Length (void) { double n; n = (double) x*x + (double) y*y; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector2DF::X(void) {return x;} +inline VTYPE &Vector2DF::Y(void) {return y;} +inline VTYPE Vector2DF::Z(void) {return 0;} +inline VTYPE Vector2DF::W(void) {return 0;} +inline const VTYPE &Vector2DF::X(void) const {return x;} +inline const VTYPE &Vector2DF::Y(void) const {return y;} +inline const VTYPE Vector2DF::Z(void) const {return 0;} +inline const VTYPE Vector2DF::W(void) const {return 0;} +inline VTYPE *Vector2DF::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector3DC Code Definition + +#define VNAME 3DC +#define VTYPE unsigned char + +// Constructors/Destructors +inline Vector3DC::Vector3DC() {x=0; y=0; z=0;} +inline Vector3DC::~Vector3DC() {} +inline Vector3DC::Vector3DC (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} +inline Vector3DC::Vector3DC (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DC::Vector3DC (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DC::Vector3DC (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DC::Vector3DC (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DC::Vector3DC (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DC::Vector3DC (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DC::Vector3DC (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} + +// Member Functions +inline Vector3DC &Vector3DC::Set (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za; return *this;} + +inline Vector3DC &Vector3DC::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DC &Vector3DC::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} + +inline Vector3DC &Vector3DC::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DC &Vector3DC::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DC &Vector3DC::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} + +inline double Vector3DC::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DC::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DC::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} + +inline double Vector3DC::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DC::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DC::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} + +inline Vector3DC &Vector3DC::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + z = (VTYPE) (((double) z*255)/n); + } + return *this; +} +inline double Vector3DC::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector3DC::X(void) {return x;} +inline VTYPE &Vector3DC::Y(void) {return y;} +inline VTYPE &Vector3DC::Z(void) {return z;} +inline VTYPE Vector3DC::W(void) {return 0;} +inline const VTYPE &Vector3DC::X(void) const {return x;} +inline const VTYPE &Vector3DC::Y(void) const {return y;} +inline const VTYPE &Vector3DC::Z(void) const {return z;} +inline const VTYPE Vector3DC::W(void) const {return 0;} +inline VTYPE *Vector3DC::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector3DI Code Definition + +#define VNAME 3DI +#define VTYPE int + +// Constructors/Destructors +inline Vector3DI::Vector3DI() {x=0; y=0; z=0;} +inline Vector3DI::~Vector3DI() {} +inline Vector3DI::Vector3DI (VTYPE xa, VTYPE ya, VTYPE za) {x=xa; y=ya; z=za;} +inline Vector3DI::Vector3DI (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DI::Vector3DI (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DI::Vector3DI (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DI::Vector3DI (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DI::Vector3DI (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DI::Vector3DI (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DI::Vector3DI (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} + +// Set Functions +inline Vector3DI &Vector3DI::Set (const int xa, const int ya, const int za) +{ + x = xa; y = ya; z = za; + return *this; +} + +// Member Functions +inline Vector3DI &Vector3DI::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DI &Vector3DI::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} + +inline Vector3DI &Vector3DI::Cross (Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DI &Vector3DI::Cross (Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DI &Vector3DI::Cross (Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} + +inline double Vector3DI::Dot(Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DI::Dot(Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DI::Dot(Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} + +inline double Vector3DI::Dist (Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::Dist (Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DI::DistSq (Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DI::DistSq (Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} + +inline Vector3DI &Vector3DI::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z; + if (n!=0.0) { + n = sqrt(n); + x = (VTYPE) (((double) x*255)/n); + y = (VTYPE) (((double) y*255)/n); + z = (VTYPE) (((double) z*255)/n); + } + return *this; +} +inline double Vector3DI::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector3DI::X(void) {return x;} +inline VTYPE &Vector3DI::Y(void) {return y;} +inline VTYPE &Vector3DI::Z(void) {return z;} +inline VTYPE Vector3DI::W(void) {return 0;} +inline const VTYPE &Vector3DI::X(void) const {return x;} +inline const VTYPE &Vector3DI::Y(void) const {return y;} +inline const VTYPE &Vector3DI::Z(void) const {return z;} +inline const VTYPE Vector3DI::W(void) const {return 0;} +inline VTYPE *Vector3DI::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector3DF Code Definition + +#define VNAME 3DF +#define VTYPE float + +// Constructors/Destructors +inline Vector3DF::Vector3DF() {x=0; y=0; z=0;} +inline Vector3DF::~Vector3DF() {} +inline Vector3DF::Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za) {x=xa; y=ya; z=za;} +inline Vector3DF::Vector3DF (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DF::Vector3DF (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DF::Vector3DF (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0;} +inline Vector3DF::Vector3DF (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DF::Vector3DF (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DF::Vector3DF (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} +inline Vector3DF::Vector3DF (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z;} + +// Set Functions +inline Vector3DF &Vector3DF::Set (const double xa, const double ya, const double za) +{ + x = (float) xa; y = (float) ya; z = (float) za; + return *this; +} + +// Member Functions +inline Vector3DF &Vector3DF::operator= (const int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator= (const double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator= (const Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator+= (const int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator+= (const double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator+= (const Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator-= (const int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator-= (const double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator-= (const Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator*= (const int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator*= (const double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator*= (const Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::operator/= (const int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator/= (const double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector3DF &Vector3DF::operator/= (const Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} + +inline Vector3DF &Vector3DF::Cross (const Vector3DC &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DF &Vector3DF::Cross (const Vector3DI &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} +inline Vector3DF &Vector3DF::Cross (const Vector3DF &v) {double ax = x, ay = y, az = z; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); return *this;} + +inline double Vector3DF::Dot(const Vector3DC &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DF::Dot(const Vector3DI &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} +inline double Vector3DF::Dot(const Vector3DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z; return dot;} + +inline double Vector3DF::Dist (const Vector2DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector2DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector2DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector3DC &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector3DI &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector3DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::Dist (const Vector4DF &v) { double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} +inline double Vector3DF::DistSq (const Vector2DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector2DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector2DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector3DC &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector3DI &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector3DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} +inline double Vector3DF::DistSq (const Vector4DF &v) { double a,b,c; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; return (a*a + b*b + c*c);} + +inline Vector3DF &Vector3DF::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z; + if (n!=0.0) { + n = sqrt(n); + x /= (float) n; y /= (float) n; z /= (float) n; + } + return *this; +} +inline double Vector3DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector3DF::X() {return x;} +inline VTYPE &Vector3DF::Y() {return y;} +inline VTYPE &Vector3DF::Z() {return z;} +inline VTYPE Vector3DF::W() {return 0;} +inline const VTYPE &Vector3DF::X() const {return x;} +inline const VTYPE &Vector3DF::Y() const {return y;} +inline const VTYPE &Vector3DF::Z() const {return z;} +inline const VTYPE Vector3DF::W() const {return 0;} +inline VTYPE *Vector3DF::Data () {return &x;} + +#undef VTYPE +#undef VNAME + +// Vector4DF Code Definition + +#define VNAME 4DF +#define VTYPE double + +// Constructors/Destructors +inline Vector4DF::Vector4DF() {x=0; y=0; z=0; w=0;} +inline Vector4DF::~Vector4DF() {} +inline Vector4DF::Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa) {x=xa; y=ya; z=za; w=wa;} +inline Vector4DF::Vector4DF (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0;} +inline Vector4DF::Vector4DF (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w;} + +// Member Functions +inline Vector4DF &Vector4DF::operator= (int op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator= (double op) {x= (VTYPE) op; y= (VTYPE) op; z= (VTYPE) op; w = (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector2DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector2DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector2DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) 0; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector3DC &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector3DI &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector3DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) 0; return *this;} +inline Vector4DF &Vector4DF::operator= (Vector4DF &op) {x=(VTYPE) op.x; y=(VTYPE) op.y; z=(VTYPE) op.z; w=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator+= (int op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator+= (double op) {x+= (VTYPE) op; y+= (VTYPE) op; z+= (VTYPE) op; w += (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector2DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector2DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector2DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector3DC &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector3DI &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector3DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator+= (Vector4DF &op) {x+=(VTYPE) op.x; y+=(VTYPE) op.y; z+=(VTYPE) op.z; w+=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator-= (int op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator-= (double op) {x-= (VTYPE) op; y-= (VTYPE) op; z-= (VTYPE) op; w -= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector2DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector2DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector2DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector3DC &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector3DI &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector3DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator-= (Vector4DF &op) {x-=(VTYPE) op.x; y-=(VTYPE) op.y; z-=(VTYPE) op.z; w-=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator*= (int op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator*= (double op) {x*= (VTYPE) op; y*= (VTYPE) op; z*= (VTYPE) op; w *= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector2DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector2DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector2DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector3DC &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector3DI &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector3DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator*= (Vector4DF &op) {x*=(VTYPE) op.x; y*=(VTYPE) op.y; z*=(VTYPE) op.z; w*=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::operator/= (int op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator/= (double op) {x/= (VTYPE) op; y/= (VTYPE) op; z/= (VTYPE) op; w /= (VTYPE) op; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector2DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector2DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector2DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector3DC &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector3DI &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector3DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; return *this;} +inline Vector4DF &Vector4DF::operator/= (Vector4DF &op) {x/=(VTYPE) op.x; y/=(VTYPE) op.y; z/=(VTYPE) op.z; w/=(VTYPE) op.w; return *this;} + +inline Vector4DF &Vector4DF::Cross (Vector4DF &v) {double ax = x, ay = y, az = z, aw = w; x = (VTYPE) (ay * (double) v.z - az * (double) v.y); y = (VTYPE) (-ax * (double) v.z + az * (double) v.x); z = (VTYPE) (ax * (double) v.y - ay * (double) v.x); w = (VTYPE) 0; return *this;} + +inline double Vector4DF::Dot(Vector4DF &v) {double dot; dot = (double) x*v.x + (double) y*v.y + (double) z*v.z + (double) w*v.w; return dot;} + +inline double Vector4DF::Dist (Vector4DF &v) {double distsq = DistSq (v); if (distsq!=0) return sqrt(distsq); return 0.0;} + +inline double Vector4DF::DistSq (Vector4DF &v) {double a,b,c,d; a = (double) x - (double) v.x; b = (double) y - (double) v.y; c = (double) z - (double) v.z; d = (double) w - (double) v.w; return (a*a + b*b + c*c + d*d);} + +inline Vector4DF &Vector4DF::Normalize (void) { + double n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; + if (n!=0.0) { + n = sqrt(n); + x /= n; y /= n; z /= n; w /= n; + } + return *this; +} +inline double Vector4DF::Length (void) { double n; n = (double) x*x + (double) y*y + (double) z*z + (double) w*w; if (n != 0.0) return sqrt(n); return 0.0; } + +inline VTYPE &Vector4DF::X(void) {return x;} +inline VTYPE &Vector4DF::Y(void) {return y;} +inline VTYPE &Vector4DF::Z(void) {return z;} +inline VTYPE &Vector4DF::W(void) {return w;} +inline const VTYPE &Vector4DF::X(void) const {return x;} +inline const VTYPE &Vector4DF::Y(void) const {return y;} +inline const VTYPE &Vector4DF::Z(void) const {return z;} +inline const VTYPE &Vector4DF::W(void) const {return w;} +inline VTYPE *Vector4DF::Data (void) {return &x;} + +#undef VTYPE +#undef VNAME diff --git a/Extras/sph/common/vector.cpp b/Extras/sph/common/vector.cpp index cc9609e54..4cfc7b9e3 100644 --- a/Extras/sph/common/vector.cpp +++ b/Extras/sph/common/vector.cpp @@ -1,70 +1,70 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "vector.h" -#include "matrix.h" - -Vector3DF &Vector3DF::operator*= (const MatrixF &op) -{ - double *m = op.GetDataF (); - double xa, ya, za; - xa = x * (*m++); ya = x * (*m++); za = x * (*m++); m++; - xa += y * (*m++); ya += y * (*m++); za += y * (*m++); m++; - xa += z * (*m++); ya += z * (*m++); za += z * (*m++); m++; - xa += (*m++); ya += (*m++); za += (*m++); - x = (float) xa; y = (float) ya; z = (float) za; - return *this; -} - -Vector3DF &Vector3DF::operator*= (const Matrix4F &op) -{ - float xa, ya, za; - xa = x * op.data[0] + y * op.data[4] + z * op.data[8] + op.data[12]; - ya = x * op.data[1] + y * op.data[5] + z * op.data[9] + op.data[13]; - za = x * op.data[2] + y * op.data[6] + z * op.data[10] + op.data[14]; - x = xa; y = ya; z = za; - return *this; -} - -Vector4DF &Vector4DF::operator*= (const MatrixF &op) -{ - double *m = op.GetDataF (); - double xa, ya, za, wa; - xa = x * (*m++); ya = x * (*m++); za = x * (*m++); wa = x * (*m++); - xa += y * (*m++); ya += y * (*m++); za += y * (*m++); wa += y * (*m++); - xa += z * (*m++); ya += z * (*m++); za += z * (*m++); wa += z * (*m++); - xa += w * (*m++); ya += w * (*m++); za += w * (*m++); wa += w * (*m++); - x = xa; y = ya; z = za; w = wa; - return *this; -} - -Vector4DF &Vector4DF::operator*= (const Matrix4F &op) -{ - double xa, ya, za, wa; - xa = x * op.data[0] + y * op.data[4] + z * op.data[8] + w * op.data[12]; - ya = x * op.data[1] + y * op.data[5] + z * op.data[9] + w * op.data[13]; - za = x * op.data[2] + y * op.data[6] + z * op.data[10] + w * op.data[14]; - wa = x * op.data[3] + y * op.data[7] + z * op.data[11] + w * op.data[15]; - x = xa; y = ya; z = za; w = wa; - return *this; -} - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "vector.h" +#include "matrix.h" + +Vector3DF &Vector3DF::operator*= (const MatrixF &op) +{ + double *m = op.GetDataF (); + double xa, ya, za; + xa = x * (*m++); ya = x * (*m++); za = x * (*m++); m++; + xa += y * (*m++); ya += y * (*m++); za += y * (*m++); m++; + xa += z * (*m++); ya += z * (*m++); za += z * (*m++); m++; + xa += (*m++); ya += (*m++); za += (*m++); + x = (float) xa; y = (float) ya; z = (float) za; + return *this; +} + +Vector3DF &Vector3DF::operator*= (const Matrix4F &op) +{ + float xa, ya, za; + xa = x * op.data[0] + y * op.data[4] + z * op.data[8] + op.data[12]; + ya = x * op.data[1] + y * op.data[5] + z * op.data[9] + op.data[13]; + za = x * op.data[2] + y * op.data[6] + z * op.data[10] + op.data[14]; + x = xa; y = ya; z = za; + return *this; +} + +Vector4DF &Vector4DF::operator*= (const MatrixF &op) +{ + double *m = op.GetDataF (); + double xa, ya, za, wa; + xa = x * (*m++); ya = x * (*m++); za = x * (*m++); wa = x * (*m++); + xa += y * (*m++); ya += y * (*m++); za += y * (*m++); wa += y * (*m++); + xa += z * (*m++); ya += z * (*m++); za += z * (*m++); wa += z * (*m++); + xa += w * (*m++); ya += w * (*m++); za += w * (*m++); wa += w * (*m++); + x = xa; y = ya; z = za; w = wa; + return *this; +} + +Vector4DF &Vector4DF::operator*= (const Matrix4F &op) +{ + double xa, ya, za, wa; + xa = x * op.data[0] + y * op.data[4] + z * op.data[8] + w * op.data[12]; + ya = x * op.data[1] + y * op.data[5] + z * op.data[9] + w * op.data[13]; + za = x * op.data[2] + y * op.data[6] + z * op.data[10] + w * op.data[14]; + wa = x * op.data[3] + y * op.data[7] + z * op.data[11] + w * op.data[15]; + x = xa; y = ya; z = za; w = wa; + return *this; +} + diff --git a/Extras/sph/common/vector.h b/Extras/sph/common/vector.h index b0e36b467..2c8c0bfe1 100644 --- a/Extras/sph/common/vector.h +++ b/Extras/sph/common/vector.h @@ -1,785 +1,785 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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. -*/ -// ** NOTES ** -// Vector code CANNOT be inlined in header file because of dependencies -// across vector classes (error generated: "Use of undeclared class..") -// -#include -#include -#include -#include -#include - -#ifndef VECTOR_DEF - #define VECTOR_DEF - - //#define VECTOR_INITIALIZE // Initializes vectors - - class Vector2DC; // Forward Referencing - class Vector2DI; - class Vector2DF; - class Vector3DC; - class Vector3DI; - class Vector3DF; - class Vector4DF; - class MatrixF; - class Matrix4F; - - // Vector2DC Declaration - - #define VNAME 2DC - #define VTYPE unsigned char - - class Vector2DC { - public: - VTYPE x, y; - - // Constructors/Destructors - inline Vector2DC(); - inline ~Vector2DC(); - inline Vector2DC (VTYPE xa, VTYPE ya); - inline Vector2DC (Vector2DC &op); - inline Vector2DC (Vector2DI &op); - inline Vector2DC (Vector2DF &op); - inline Vector2DC (Vector3DC &op); - inline Vector2DC (Vector3DI &op); - inline Vector2DC (Vector3DF &op); - inline Vector2DC (Vector4DF &op); - - // Member Functions - inline Vector2DC &operator= (Vector2DC &op); - inline Vector2DC &operator= (Vector2DI &op); - inline Vector2DC &operator= (Vector2DF &op); - inline Vector2DC &operator= (Vector3DC &op); - inline Vector2DC &operator= (Vector3DI &op); - inline Vector2DC &operator= (Vector3DF &op); - inline Vector2DC &operator= (Vector4DF &op); - - inline Vector2DC &operator+= (Vector2DC &op); - inline Vector2DC &operator+= (Vector2DI &op); - inline Vector2DC &operator+= (Vector2DF &op); - inline Vector2DC &operator+= (Vector3DC &op); - inline Vector2DC &operator+= (Vector3DI &op); - inline Vector2DC &operator+= (Vector3DF &op); - inline Vector2DC &operator+= (Vector4DF &op); - - inline Vector2DC &operator-= (Vector2DC &op); - inline Vector2DC &operator-= (Vector2DI &op); - inline Vector2DC &operator-= (Vector2DF &op); - inline Vector2DC &operator-= (Vector3DC &op); - inline Vector2DC &operator-= (Vector3DI &op); - inline Vector2DC &operator-= (Vector3DF &op); - inline Vector2DC &operator-= (Vector4DF &op); - - inline Vector2DC &operator*= (Vector2DC &op); - inline Vector2DC &operator*= (Vector2DI &op); - inline Vector2DC &operator*= (Vector2DF &op); - inline Vector2DC &operator*= (Vector3DC &op); - inline Vector2DC &operator*= (Vector3DI &op); - inline Vector2DC &operator*= (Vector3DF &op); - inline Vector2DC &operator*= (Vector4DF &op); - - inline Vector2DC &operator/= (Vector2DC &op); - inline Vector2DC &operator/= (Vector2DI &op); - inline Vector2DC &operator/= (Vector2DF &op); - inline Vector2DC &operator/= (Vector3DC &op); - inline Vector2DC &operator/= (Vector3DI &op); - inline Vector2DC &operator/= (Vector3DF &op); - inline Vector2DC &operator/= (Vector4DF &op); - - // Note: Cross product does not exist for 2D vectors (only 3D) - - inline double Dot(Vector2DC &v); - inline double Dot(Vector2DI &v); - inline double Dot(Vector2DF &v); - - inline double Dist (Vector2DC &v); - inline double Dist (Vector2DI &v); - inline double Dist (Vector2DF &v); - inline double Dist (Vector3DC &v); - inline double Dist (Vector3DI &v); - inline double Dist (Vector3DF &v); - inline double Dist (Vector4DF &v); - - inline double DistSq (Vector2DC &v); - inline double DistSq (Vector2DI &v); - inline double DistSq (Vector2DF &v); - inline double DistSq (Vector3DC &v); - inline double DistSq (Vector3DI &v); - inline double DistSq (Vector3DF &v); - inline double DistSq (Vector4DF &v); - - inline Vector2DC &Normalize (void); - inline double Length (void); - - inline VTYPE &X(void); - inline VTYPE &Y(void); - inline VTYPE Z(void); - inline VTYPE W(void); - inline const VTYPE &X(void) const; - inline const VTYPE &Y(void) const; - inline const VTYPE Z(void) const; - inline const VTYPE W(void) const; - inline VTYPE *Data (void); - }; - - #undef VNAME - #undef VTYPE - - // Vector2DI Declaration - - #define VNAME 2DI - #define VTYPE int - - class Vector2DI { - public: - VTYPE x, y; - - // Constructors/Destructors - inline Vector2DI(); - inline ~Vector2DI(); - inline Vector2DI (VTYPE xa, VTYPE ya); - inline Vector2DI (Vector2DC &op); - inline Vector2DI (Vector2DI &op); - inline Vector2DI (Vector2DF &op); - inline Vector2DI (Vector3DC &op); - inline Vector2DI (Vector3DI &op); - inline Vector2DI (Vector3DF &op); - inline Vector2DI (Vector4DF &op); - - // Member Functions - inline Vector2DI &operator= (Vector2DC &op); - inline Vector2DI &operator= (Vector2DI &op); - inline Vector2DI &operator= (Vector2DF &op); - inline Vector2DI &operator= (Vector3DC &op); - inline Vector2DI &operator= (Vector3DI &op); - inline Vector2DI &operator= (Vector3DF &op); - inline Vector2DI &operator= (Vector4DF &op); - - inline Vector2DI &operator+= (Vector2DC &op); - inline Vector2DI &operator+= (Vector2DI &op); - inline Vector2DI &operator+= (Vector2DF &op); - inline Vector2DI &operator+= (Vector3DC &op); - inline Vector2DI &operator+= (Vector3DI &op); - inline Vector2DI &operator+= (Vector3DF &op); - inline Vector2DI &operator+= (Vector4DF &op); - - inline Vector2DI &operator-= (Vector2DC &op); - inline Vector2DI &operator-= (Vector2DI &op); - inline Vector2DI &operator-= (Vector2DF &op); - inline Vector2DI &operator-= (Vector3DC &op); - inline Vector2DI &operator-= (Vector3DI &op); - inline Vector2DI &operator-= (Vector3DF &op); - inline Vector2DI &operator-= (Vector4DF &op); - - inline Vector2DI &operator*= (Vector2DC &op); - inline Vector2DI &operator*= (Vector2DI &op); - inline Vector2DI &operator*= (Vector2DF &op); - inline Vector2DI &operator*= (Vector3DC &op); - inline Vector2DI &operator*= (Vector3DI &op); - inline Vector2DI &operator*= (Vector3DF &op); - inline Vector2DI &operator*= (Vector4DF &op); - - inline Vector2DI &operator/= (Vector2DC &op); - inline Vector2DI &operator/= (Vector2DI &op); - inline Vector2DI &operator/= (Vector2DF &op); - inline Vector2DI &operator/= (Vector3DC &op); - inline Vector2DI &operator/= (Vector3DI &op); - inline Vector2DI &operator/= (Vector3DF &op); - inline Vector2DI &operator/= (Vector4DF &op); - - - // Note: Cross product does not exist for 2D vectors (only 3D) - - inline double Dot(Vector2DC &v); - inline double Dot(Vector2DI &v); - inline double Dot(Vector2DF &v); - - inline double Dist (Vector2DC &v); - inline double Dist (Vector2DI &v); - inline double Dist (Vector2DF &v); - inline double Dist (Vector3DC &v); - inline double Dist (Vector3DI &v); - inline double Dist (Vector3DF &v); - inline double Dist (Vector4DF &v); - - inline double DistSq (Vector2DC &v); - inline double DistSq (Vector2DI &v); - inline double DistSq (Vector2DF &v); - inline double DistSq (Vector3DC &v); - inline double DistSq (Vector3DI &v); - inline double DistSq (Vector3DF &v); - inline double DistSq (Vector4DF &v); - - inline Vector2DI &Normalize (void); - inline double Length (void); - - inline VTYPE &X(void); - inline VTYPE &Y(void); - inline VTYPE Z(void); - inline VTYPE W(void); - inline const VTYPE &X(void) const; - inline const VTYPE &Y(void) const; - inline const VTYPE Z(void) const; - inline const VTYPE W(void) const; - inline VTYPE *Data (void); - }; - - #undef VNAME - #undef VTYPE - - // Vector2DF Declarations - - #define VNAME 2DF - #define VTYPE double - - class Vector2DF { - public: - VTYPE x, y; - - // Constructors/Destructors - Vector2DF (); - ~Vector2DF (); - Vector2DF (const VTYPE xa, const VTYPE ya); - Vector2DF (const Vector2DC &op); - Vector2DF (const Vector2DI &op); - Vector2DF (const Vector2DF &op); - Vector2DF (const Vector3DC &op); - Vector2DF (const Vector3DI &op); - Vector2DF (const Vector3DF &op); - Vector2DF (const Vector4DF &op); - - // Member Functions - Vector2DF &operator= (const Vector2DC &op); - Vector2DF &operator= (const Vector2DI &op); - Vector2DF &operator= (const Vector2DF &op); - Vector2DF &operator= (const Vector3DC &op); - Vector2DF &operator= (const Vector3DI &op); - Vector2DF &operator= (const Vector3DF &op); - Vector2DF &operator= (const Vector4DF &op); - - Vector2DF &operator+= (const Vector2DC &op); - Vector2DF &operator+= (const Vector2DI &op); - Vector2DF &operator+= (const Vector2DF &op); - Vector2DF &operator+= (const Vector3DC &op); - Vector2DF &operator+= (const Vector3DI &op); - Vector2DF &operator+= (const Vector3DF &op); - Vector2DF &operator+= (const Vector4DF &op); - - Vector2DF &operator-= (const Vector2DC &op); - Vector2DF &operator-= (const Vector2DI &op); - Vector2DF &operator-= (const Vector2DF &op); - Vector2DF &operator-= (const Vector3DC &op); - Vector2DF &operator-= (const Vector3DI &op); - Vector2DF &operator-= (const Vector3DF &op); - Vector2DF &operator-= (const Vector4DF &op); - - Vector2DF &operator*= (const Vector2DC &op); - Vector2DF &operator*= (const Vector2DI &op); - Vector2DF &operator*= (const Vector2DF &op); - Vector2DF &operator*= (const Vector3DC &op); - Vector2DF &operator*= (const Vector3DI &op); - Vector2DF &operator*= (const Vector3DF &op); - Vector2DF &operator*= (const Vector4DF &op); - - Vector2DF &operator/= (const Vector2DC &op); - Vector2DF &operator/= (const Vector2DI &op); - Vector2DF &operator/= (const Vector2DF &op); - Vector2DF &operator/= (const Vector3DC &op); - Vector2DF &operator/= (const Vector3DI &op); - Vector2DF &operator/= (const Vector3DF &op); - Vector2DF &operator/= (const Vector4DF &op); - - Vector2DF &operator/= (const double v) {x /= v; y /= v; return *this;} - - // Note: Cross product does not exist for 2D vectors (only 3D) - - double Dot(const Vector2DC &v); - double Dot(const Vector2DI &v); - double Dot(const Vector2DF &v); - - double Dist (const Vector2DC &v); - double Dist (const Vector2DI &v); - double Dist (const Vector2DF &v); - double Dist (const Vector3DC &v); - double Dist (const Vector3DI &v); - double Dist (const Vector3DF &v); - double Dist (const Vector4DF &v); - - double DistSq (const Vector2DC &v); - double DistSq (const Vector2DI &v); - double DistSq (const Vector2DF &v); - double DistSq (const Vector3DC &v); - double DistSq (const Vector3DI &v); - double DistSq (const Vector3DF &v); - double DistSq (const Vector4DF &v); - - Vector2DF &Normalize (void); - double Length (void); - - VTYPE &X(void); - VTYPE &Y(void); - VTYPE Z(void); - VTYPE W(void); - const VTYPE &X(void) const; - const VTYPE &Y(void) const; - const VTYPE Z(void) const; - const VTYPE W(void) const; - VTYPE *Data (void); - }; - - #undef VNAME - #undef VTYPE - - // Vector3DC Declaration - - #define VNAME 3DC - #define VTYPE unsigned char - - class Vector3DC { - public: - VTYPE x, y, z; - - // Constructors/Destructors - inline Vector3DC(); - inline ~Vector3DC(); - inline Vector3DC (VTYPE xa, VTYPE ya, VTYPE za); - inline Vector3DC (Vector2DC &op); - inline Vector3DC (Vector2DI &op); - inline Vector3DC (Vector2DF &op); - inline Vector3DC (Vector3DC &op); - inline Vector3DC (Vector3DI &op); - inline Vector3DC (Vector3DF &op); - inline Vector3DC (Vector4DF &op); - - // Member Functions - inline Vector3DC &Set (VTYPE xa, VTYPE ya, VTYPE za); - - inline Vector3DC &operator= (Vector2DC &op); - inline Vector3DC &operator= (Vector2DI &op); - inline Vector3DC &operator= (Vector2DF &op); - inline Vector3DC &operator= (Vector3DC &op); - inline Vector3DC &operator= (Vector3DI &op); - inline Vector3DC &operator= (Vector3DF &op); - inline Vector3DC &operator= (Vector4DF &op); - - inline Vector3DC &operator+= (Vector2DC &op); - inline Vector3DC &operator+= (Vector2DI &op); - inline Vector3DC &operator+= (Vector2DF &op); - inline Vector3DC &operator+= (Vector3DC &op); - inline Vector3DC &operator+= (Vector3DI &op); - inline Vector3DC &operator+= (Vector3DF &op); - inline Vector3DC &operator+= (Vector4DF &op); - - inline Vector3DC &operator-= (Vector2DC &op); - inline Vector3DC &operator-= (Vector2DI &op); - inline Vector3DC &operator-= (Vector2DF &op); - inline Vector3DC &operator-= (Vector3DC &op); - inline Vector3DC &operator-= (Vector3DI &op); - inline Vector3DC &operator-= (Vector3DF &op); - inline Vector3DC &operator-= (Vector4DF &op); - - inline Vector3DC &operator*= (Vector2DC &op); - inline Vector3DC &operator*= (Vector2DI &op); - inline Vector3DC &operator*= (Vector2DF &op); - inline Vector3DC &operator*= (Vector3DC &op); - inline Vector3DC &operator*= (Vector3DI &op); - inline Vector3DC &operator*= (Vector3DF &op); - inline Vector3DC &operator*= (Vector4DF &op); - - inline Vector3DC &operator/= (Vector2DC &op); - inline Vector3DC &operator/= (Vector2DI &op); - inline Vector3DC &operator/= (Vector2DF &op); - inline Vector3DC &operator/= (Vector3DC &op); - inline Vector3DC &operator/= (Vector3DI &op); - inline Vector3DC &operator/= (Vector3DF &op); - inline Vector3DC &operator/= (Vector4DF &op); - - inline Vector3DC &Cross (Vector3DC &v); - inline Vector3DC &Cross (Vector3DI &v); - inline Vector3DC &Cross (Vector3DF &v); - - inline double Dot(Vector3DC &v); - inline double Dot(Vector3DI &v); - inline double Dot(Vector3DF &v); - - inline double Dist (Vector2DC &v); - inline double Dist (Vector2DI &v); - inline double Dist (Vector2DF &v); - inline double Dist (Vector3DC &v); - inline double Dist (Vector3DI &v); - inline double Dist (Vector3DF &v); - inline double Dist (Vector4DF &v); - - inline double DistSq (Vector2DC &v); - inline double DistSq (Vector2DI &v); - inline double DistSq (Vector2DF &v); - inline double DistSq (Vector3DC &v); - inline double DistSq (Vector3DI &v); - inline double DistSq (Vector3DF &v); - inline double DistSq (Vector4DF &v); - - inline Vector3DC &Normalize (void); - inline double Length (void); - - inline VTYPE &X(void); - inline VTYPE &Y(void); - inline VTYPE &Z(void); - inline VTYPE W(void); - inline const VTYPE &X(void) const; - inline const VTYPE &Y(void) const; - inline const VTYPE &Z(void) const; - inline const VTYPE W(void) const; - inline VTYPE *Data (void); - }; - - #undef VNAME - #undef VTYPE - - // Vector3DI Declaration - - #define VNAME 3DI - #define VTYPE int - - class Vector3DI { - public: - VTYPE x, y, z; - - // Constructors/Destructors - inline Vector3DI(); - inline ~Vector3DI(); - inline Vector3DI (VTYPE xa, VTYPE ya, VTYPE za); - inline Vector3DI (Vector2DC &op); - inline Vector3DI (Vector2DI &op); - inline Vector3DI (Vector2DF &op); - inline Vector3DI (Vector3DC &op); - inline Vector3DI (Vector3DI &op); - inline Vector3DI (Vector3DF &op); - inline Vector3DI (Vector4DF &op); - - // Set Functions - inline Vector3DI &Set (const int xa, const int ya, const int za); - - // Member Functions - inline Vector3DI &operator= (Vector2DC &op); - inline Vector3DI &operator= (Vector2DI &op); - inline Vector3DI &operator= (Vector2DF &op); - inline Vector3DI &operator= (Vector3DC &op); - inline Vector3DI &operator= (Vector3DI &op); - inline Vector3DI &operator= (Vector3DF &op); - inline Vector3DI &operator= (Vector4DF &op); - - inline Vector3DI &operator+= (Vector2DC &op); - inline Vector3DI &operator+= (Vector2DI &op); - inline Vector3DI &operator+= (Vector2DF &op); - inline Vector3DI &operator+= (Vector3DC &op); - inline Vector3DI &operator+= (Vector3DI &op); - inline Vector3DI &operator+= (Vector3DF &op); - inline Vector3DI &operator+= (Vector4DF &op); - - inline Vector3DI &operator-= (Vector2DC &op); - inline Vector3DI &operator-= (Vector2DI &op); - inline Vector3DI &operator-= (Vector2DF &op); - inline Vector3DI &operator-= (Vector3DC &op); - inline Vector3DI &operator-= (Vector3DI &op); - inline Vector3DI &operator-= (Vector3DF &op); - inline Vector3DI &operator-= (Vector4DF &op); - - inline Vector3DI &operator*= (Vector2DC &op); - inline Vector3DI &operator*= (Vector2DI &op); - inline Vector3DI &operator*= (Vector2DF &op); - inline Vector3DI &operator*= (Vector3DC &op); - inline Vector3DI &operator*= (Vector3DI &op); - inline Vector3DI &operator*= (Vector3DF &op); - inline Vector3DI &operator*= (Vector4DF &op); - - inline Vector3DI &operator/= (Vector2DC &op); - inline Vector3DI &operator/= (Vector2DI &op); - inline Vector3DI &operator/= (Vector2DF &op); - inline Vector3DI &operator/= (Vector3DC &op); - inline Vector3DI &operator/= (Vector3DI &op); - inline Vector3DI &operator/= (Vector3DF &op); - inline Vector3DI &operator/= (Vector4DF &op); - - inline Vector3DI &Cross (Vector3DC &v); - inline Vector3DI &Cross (Vector3DI &v); - inline Vector3DI &Cross (Vector3DF &v); - - inline double Dot(Vector3DC &v); - inline double Dot(Vector3DI &v); - inline double Dot(Vector3DF &v); - - inline double Dist (Vector2DC &v); - inline double Dist (Vector2DI &v); - inline double Dist (Vector2DF &v); - inline double Dist (Vector3DC &v); - inline double Dist (Vector3DI &v); - inline double Dist (Vector3DF &v); - inline double Dist (Vector4DF &v); - - inline double DistSq (Vector2DC &v); - inline double DistSq (Vector2DI &v); - inline double DistSq (Vector2DF &v); - inline double DistSq (Vector3DC &v); - inline double DistSq (Vector3DI &v); - inline double DistSq (Vector3DF &v); - inline double DistSq (Vector4DF &v); - - inline Vector3DI &Normalize (void); - inline double Length (void); - - inline VTYPE &X(void); - inline VTYPE &Y(void); - inline VTYPE &Z(void); - inline VTYPE W(void); - inline const VTYPE &X(void) const; - inline const VTYPE &Y(void) const; - inline const VTYPE &Z(void) const; - inline const VTYPE W(void) const; - inline VTYPE *Data (void); - }; - - #undef VNAME - #undef VTYPE - - // Vector3DF Declarations - - #define VNAME 3DF - #define VTYPE float - - class Vector3DF { - public: - VTYPE x, y, z; - - // Constructors/Destructors - inline Vector3DF(); - inline ~Vector3DF(); - inline Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za); - inline Vector3DF (const Vector2DC &op); - inline Vector3DF (const Vector2DI &op); - inline Vector3DF (const Vector2DF &op); - inline Vector3DF (const Vector3DC &op); - inline Vector3DF (const Vector3DI &op); - inline Vector3DF (const Vector3DF &op); - inline Vector3DF (const Vector4DF &op); - - // Set Functions - inline Vector3DF &Set (const double xa, const double ya, const double za); - - // Member Functions - inline Vector3DF &operator= (const int op); - inline Vector3DF &operator= (const double op); - inline Vector3DF &operator= (const Vector2DC &op); - inline Vector3DF &operator= (const Vector2DI &op); - inline Vector3DF &operator= (const Vector2DF &op); - inline Vector3DF &operator= (const Vector3DC &op); - inline Vector3DF &operator= (const Vector3DI &op); - inline Vector3DF &operator= (const Vector3DF &op); - inline Vector3DF &operator= (const Vector4DF &op); - - inline Vector3DF &operator+= (const int op); - inline Vector3DF &operator+= (const double op); - inline Vector3DF &operator+= (const Vector2DC &op); - inline Vector3DF &operator+= (const Vector2DI &op); - inline Vector3DF &operator+= (const Vector2DF &op); - inline Vector3DF &operator+= (const Vector3DC &op); - inline Vector3DF &operator+= (const Vector3DI &op); - inline Vector3DF &operator+= (const Vector3DF &op); - inline Vector3DF &operator+= (const Vector4DF &op); - - inline Vector3DF &operator-= (const int op); - inline Vector3DF &operator-= (const double op); - inline Vector3DF &operator-= (const Vector2DC &op); - inline Vector3DF &operator-= (const Vector2DI &op); - inline Vector3DF &operator-= (const Vector2DF &op); - inline Vector3DF &operator-= (const Vector3DC &op); - inline Vector3DF &operator-= (const Vector3DI &op); - inline Vector3DF &operator-= (const Vector3DF &op); - inline Vector3DF &operator-= (const Vector4DF &op); - - inline Vector3DF &operator*= (const int op); - inline Vector3DF &operator*= (const double op); - inline Vector3DF &operator*= (const Vector2DC &op); - inline Vector3DF &operator*= (const Vector2DI &op); - inline Vector3DF &operator*= (const Vector2DF &op); - inline Vector3DF &operator*= (const Vector3DC &op); - inline Vector3DF &operator*= (const Vector3DI &op); - inline Vector3DF &operator*= (const Vector3DF &op); - inline Vector3DF &operator*= (const Vector4DF &op); - Vector3DF &operator*= (const Matrix4F &op); - Vector3DF &operator*= (const MatrixF &op); // see vector.cpp - - inline Vector3DF &operator/= (const int op); - inline Vector3DF &operator/= (const double op); - inline Vector3DF &operator/= (const Vector2DC &op); - inline Vector3DF &operator/= (const Vector2DI &op); - inline Vector3DF &operator/= (const Vector2DF &op); - inline Vector3DF &operator/= (const Vector3DC &op); - inline Vector3DF &operator/= (const Vector3DI &op); - inline Vector3DF &operator/= (const Vector3DF &op); - inline Vector3DF &operator/= (const Vector4DF &op); - - inline Vector3DF &Cross (const Vector3DC &v); - inline Vector3DF &Cross (const Vector3DI &v); - inline Vector3DF &Cross (const Vector3DF &v); - - inline double Dot(const Vector3DC &v); - inline double Dot(const Vector3DI &v); - inline double Dot(const Vector3DF &v); - - inline double Dist (const Vector2DC &v); - inline double Dist (const Vector2DI &v); - inline double Dist (const Vector2DF &v); - inline double Dist (const Vector3DC &v); - inline double Dist (const Vector3DI &v); - inline double Dist (const Vector3DF &v); - inline double Dist (const Vector4DF &v); - - inline double DistSq (const Vector2DC &v); - inline double DistSq (const Vector2DI &v); - inline double DistSq (const Vector2DF &v); - inline double DistSq (const Vector3DC &v); - inline double DistSq (const Vector3DI &v); - inline double DistSq (const Vector3DF &v); - inline double DistSq (const Vector4DF &v); - - inline Vector3DF &Normalize (void); - inline double Length (void); - - inline VTYPE &X(); - inline VTYPE &Y(); - inline VTYPE &Z(); - inline VTYPE W(); - inline const VTYPE &X() const; - inline const VTYPE &Y() const; - inline const VTYPE &Z() const; - inline const VTYPE W() const; - inline VTYPE *Data (); - }; - - #undef VNAME - #undef VTYPE - - // Vector4DF Declarations - - #define VNAME 4DF - #define VTYPE double - - class Vector4DF { - public: - VTYPE x, y, z, w; - - // Constructors/Destructors - inline Vector4DF(); - inline ~Vector4DF(); - inline Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa); - inline Vector4DF (Vector2DC &op); - inline Vector4DF (Vector2DI &op); - inline Vector4DF (Vector2DF &op); - inline Vector4DF (Vector3DC &op); - inline Vector4DF (Vector3DI &op); - inline Vector4DF (Vector3DF &op); - inline Vector4DF (Vector4DF &op); - - // Member Functions - inline Vector4DF &operator= (int op); - inline Vector4DF &operator= (double op); - inline Vector4DF &operator= (Vector2DC &op); - inline Vector4DF &operator= (Vector2DI &op); - inline Vector4DF &operator= (Vector2DF &op); - inline Vector4DF &operator= (Vector3DC &op); - inline Vector4DF &operator= (Vector3DI &op); - inline Vector4DF &operator= (Vector3DF &op); - inline Vector4DF &operator= (Vector4DF &op); - - inline Vector4DF &operator+= (int op); - inline Vector4DF &operator+= (double op); - inline Vector4DF &operator+= (Vector2DC &op); - inline Vector4DF &operator+= (Vector2DI &op); - inline Vector4DF &operator+= (Vector2DF &op); - inline Vector4DF &operator+= (Vector3DC &op); - inline Vector4DF &operator+= (Vector3DI &op); - inline Vector4DF &operator+= (Vector3DF &op); - inline Vector4DF &operator+= (Vector4DF &op); - - inline Vector4DF &operator-= (int op); - inline Vector4DF &operator-= (double op); - inline Vector4DF &operator-= (Vector2DC &op); - inline Vector4DF &operator-= (Vector2DI &op); - inline Vector4DF &operator-= (Vector2DF &op); - inline Vector4DF &operator-= (Vector3DC &op); - inline Vector4DF &operator-= (Vector3DI &op); - inline Vector4DF &operator-= (Vector3DF &op); - inline Vector4DF &operator-= (Vector4DF &op); - - inline Vector4DF &operator*= (int op); - inline Vector4DF &operator*= (double op); - inline Vector4DF &operator*= (Vector2DC &op); - inline Vector4DF &operator*= (Vector2DI &op); - inline Vector4DF &operator*= (Vector2DF &op); - inline Vector4DF &operator*= (Vector3DC &op); - inline Vector4DF &operator*= (Vector3DI &op); - inline Vector4DF &operator*= (Vector3DF &op); - inline Vector4DF &operator*= (Vector4DF &op); - Vector4DF &operator*= (const Matrix4F &op); - Vector4DF &operator*= (const MatrixF &op); // see vector.cpp - - inline Vector4DF &operator/= (int op); - inline Vector4DF &operator/= (double op); - inline Vector4DF &operator/= (Vector2DC &op); - inline Vector4DF &operator/= (Vector2DI &op); - inline Vector4DF &operator/= (Vector2DF &op); - inline Vector4DF &operator/= (Vector3DC &op); - inline Vector4DF &operator/= (Vector3DI &op); - inline Vector4DF &operator/= (Vector3DF &op); - inline Vector4DF &operator/= (Vector4DF &op); - - inline Vector4DF &Cross (Vector4DF &v); - - inline double Dot(Vector4DF &v); - - inline double Dist (Vector4DF &v); - - inline double DistSq (Vector4DF &v); - - inline Vector4DF &Normalize (void); - inline double Length (void); - - inline VTYPE &X(void); - inline VTYPE &Y(void); - inline VTYPE &Z(void); - inline VTYPE &W(void); - inline const VTYPE &X(void) const; - inline const VTYPE &Y(void) const; - inline const VTYPE &Z(void) const; - inline const VTYPE &W(void) const; - inline VTYPE *Data (void); - }; - - #undef VNAME - #undef VTYPE - - // Vector Code Definitions (Inlined) - #include "vector.cci" - -#endif - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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. +*/ +// ** NOTES ** +// Vector code CANNOT be inlined in header file because of dependencies +// across vector classes (error generated: "Use of undeclared class..") +// +#include +#include +#include +#include +#include + +#ifndef VECTOR_DEF + #define VECTOR_DEF + + //#define VECTOR_INITIALIZE // Initializes vectors + + class Vector2DC; // Forward Referencing + class Vector2DI; + class Vector2DF; + class Vector3DC; + class Vector3DI; + class Vector3DF; + class Vector4DF; + class MatrixF; + class Matrix4F; + + // Vector2DC Declaration + + #define VNAME 2DC + #define VTYPE unsigned char + + class Vector2DC { + public: + VTYPE x, y; + + // Constructors/Destructors + inline Vector2DC(); + inline ~Vector2DC(); + inline Vector2DC (VTYPE xa, VTYPE ya); + inline Vector2DC (Vector2DC &op); + inline Vector2DC (Vector2DI &op); + inline Vector2DC (Vector2DF &op); + inline Vector2DC (Vector3DC &op); + inline Vector2DC (Vector3DI &op); + inline Vector2DC (Vector3DF &op); + inline Vector2DC (Vector4DF &op); + + // Member Functions + inline Vector2DC &operator= (Vector2DC &op); + inline Vector2DC &operator= (Vector2DI &op); + inline Vector2DC &operator= (Vector2DF &op); + inline Vector2DC &operator= (Vector3DC &op); + inline Vector2DC &operator= (Vector3DI &op); + inline Vector2DC &operator= (Vector3DF &op); + inline Vector2DC &operator= (Vector4DF &op); + + inline Vector2DC &operator+= (Vector2DC &op); + inline Vector2DC &operator+= (Vector2DI &op); + inline Vector2DC &operator+= (Vector2DF &op); + inline Vector2DC &operator+= (Vector3DC &op); + inline Vector2DC &operator+= (Vector3DI &op); + inline Vector2DC &operator+= (Vector3DF &op); + inline Vector2DC &operator+= (Vector4DF &op); + + inline Vector2DC &operator-= (Vector2DC &op); + inline Vector2DC &operator-= (Vector2DI &op); + inline Vector2DC &operator-= (Vector2DF &op); + inline Vector2DC &operator-= (Vector3DC &op); + inline Vector2DC &operator-= (Vector3DI &op); + inline Vector2DC &operator-= (Vector3DF &op); + inline Vector2DC &operator-= (Vector4DF &op); + + inline Vector2DC &operator*= (Vector2DC &op); + inline Vector2DC &operator*= (Vector2DI &op); + inline Vector2DC &operator*= (Vector2DF &op); + inline Vector2DC &operator*= (Vector3DC &op); + inline Vector2DC &operator*= (Vector3DI &op); + inline Vector2DC &operator*= (Vector3DF &op); + inline Vector2DC &operator*= (Vector4DF &op); + + inline Vector2DC &operator/= (Vector2DC &op); + inline Vector2DC &operator/= (Vector2DI &op); + inline Vector2DC &operator/= (Vector2DF &op); + inline Vector2DC &operator/= (Vector3DC &op); + inline Vector2DC &operator/= (Vector3DI &op); + inline Vector2DC &operator/= (Vector3DF &op); + inline Vector2DC &operator/= (Vector4DF &op); + + // Note: Cross product does not exist for 2D vectors (only 3D) + + inline double Dot(Vector2DC &v); + inline double Dot(Vector2DI &v); + inline double Dot(Vector2DF &v); + + inline double Dist (Vector2DC &v); + inline double Dist (Vector2DI &v); + inline double Dist (Vector2DF &v); + inline double Dist (Vector3DC &v); + inline double Dist (Vector3DI &v); + inline double Dist (Vector3DF &v); + inline double Dist (Vector4DF &v); + + inline double DistSq (Vector2DC &v); + inline double DistSq (Vector2DI &v); + inline double DistSq (Vector2DF &v); + inline double DistSq (Vector3DC &v); + inline double DistSq (Vector3DI &v); + inline double DistSq (Vector3DF &v); + inline double DistSq (Vector4DF &v); + + inline Vector2DC &Normalize (void); + inline double Length (void); + + inline VTYPE &X(void); + inline VTYPE &Y(void); + inline VTYPE Z(void); + inline VTYPE W(void); + inline const VTYPE &X(void) const; + inline const VTYPE &Y(void) const; + inline const VTYPE Z(void) const; + inline const VTYPE W(void) const; + inline VTYPE *Data (void); + }; + + #undef VNAME + #undef VTYPE + + // Vector2DI Declaration + + #define VNAME 2DI + #define VTYPE int + + class Vector2DI { + public: + VTYPE x, y; + + // Constructors/Destructors + inline Vector2DI(); + inline ~Vector2DI(); + inline Vector2DI (VTYPE xa, VTYPE ya); + inline Vector2DI (Vector2DC &op); + inline Vector2DI (Vector2DI &op); + inline Vector2DI (Vector2DF &op); + inline Vector2DI (Vector3DC &op); + inline Vector2DI (Vector3DI &op); + inline Vector2DI (Vector3DF &op); + inline Vector2DI (Vector4DF &op); + + // Member Functions + inline Vector2DI &operator= (Vector2DC &op); + inline Vector2DI &operator= (Vector2DI &op); + inline Vector2DI &operator= (Vector2DF &op); + inline Vector2DI &operator= (Vector3DC &op); + inline Vector2DI &operator= (Vector3DI &op); + inline Vector2DI &operator= (Vector3DF &op); + inline Vector2DI &operator= (Vector4DF &op); + + inline Vector2DI &operator+= (Vector2DC &op); + inline Vector2DI &operator+= (Vector2DI &op); + inline Vector2DI &operator+= (Vector2DF &op); + inline Vector2DI &operator+= (Vector3DC &op); + inline Vector2DI &operator+= (Vector3DI &op); + inline Vector2DI &operator+= (Vector3DF &op); + inline Vector2DI &operator+= (Vector4DF &op); + + inline Vector2DI &operator-= (Vector2DC &op); + inline Vector2DI &operator-= (Vector2DI &op); + inline Vector2DI &operator-= (Vector2DF &op); + inline Vector2DI &operator-= (Vector3DC &op); + inline Vector2DI &operator-= (Vector3DI &op); + inline Vector2DI &operator-= (Vector3DF &op); + inline Vector2DI &operator-= (Vector4DF &op); + + inline Vector2DI &operator*= (Vector2DC &op); + inline Vector2DI &operator*= (Vector2DI &op); + inline Vector2DI &operator*= (Vector2DF &op); + inline Vector2DI &operator*= (Vector3DC &op); + inline Vector2DI &operator*= (Vector3DI &op); + inline Vector2DI &operator*= (Vector3DF &op); + inline Vector2DI &operator*= (Vector4DF &op); + + inline Vector2DI &operator/= (Vector2DC &op); + inline Vector2DI &operator/= (Vector2DI &op); + inline Vector2DI &operator/= (Vector2DF &op); + inline Vector2DI &operator/= (Vector3DC &op); + inline Vector2DI &operator/= (Vector3DI &op); + inline Vector2DI &operator/= (Vector3DF &op); + inline Vector2DI &operator/= (Vector4DF &op); + + + // Note: Cross product does not exist for 2D vectors (only 3D) + + inline double Dot(Vector2DC &v); + inline double Dot(Vector2DI &v); + inline double Dot(Vector2DF &v); + + inline double Dist (Vector2DC &v); + inline double Dist (Vector2DI &v); + inline double Dist (Vector2DF &v); + inline double Dist (Vector3DC &v); + inline double Dist (Vector3DI &v); + inline double Dist (Vector3DF &v); + inline double Dist (Vector4DF &v); + + inline double DistSq (Vector2DC &v); + inline double DistSq (Vector2DI &v); + inline double DistSq (Vector2DF &v); + inline double DistSq (Vector3DC &v); + inline double DistSq (Vector3DI &v); + inline double DistSq (Vector3DF &v); + inline double DistSq (Vector4DF &v); + + inline Vector2DI &Normalize (void); + inline double Length (void); + + inline VTYPE &X(void); + inline VTYPE &Y(void); + inline VTYPE Z(void); + inline VTYPE W(void); + inline const VTYPE &X(void) const; + inline const VTYPE &Y(void) const; + inline const VTYPE Z(void) const; + inline const VTYPE W(void) const; + inline VTYPE *Data (void); + }; + + #undef VNAME + #undef VTYPE + + // Vector2DF Declarations + + #define VNAME 2DF + #define VTYPE double + + class Vector2DF { + public: + VTYPE x, y; + + // Constructors/Destructors + Vector2DF (); + ~Vector2DF (); + Vector2DF (const VTYPE xa, const VTYPE ya); + Vector2DF (const Vector2DC &op); + Vector2DF (const Vector2DI &op); + Vector2DF (const Vector2DF &op); + Vector2DF (const Vector3DC &op); + Vector2DF (const Vector3DI &op); + Vector2DF (const Vector3DF &op); + Vector2DF (const Vector4DF &op); + + // Member Functions + Vector2DF &operator= (const Vector2DC &op); + Vector2DF &operator= (const Vector2DI &op); + Vector2DF &operator= (const Vector2DF &op); + Vector2DF &operator= (const Vector3DC &op); + Vector2DF &operator= (const Vector3DI &op); + Vector2DF &operator= (const Vector3DF &op); + Vector2DF &operator= (const Vector4DF &op); + + Vector2DF &operator+= (const Vector2DC &op); + Vector2DF &operator+= (const Vector2DI &op); + Vector2DF &operator+= (const Vector2DF &op); + Vector2DF &operator+= (const Vector3DC &op); + Vector2DF &operator+= (const Vector3DI &op); + Vector2DF &operator+= (const Vector3DF &op); + Vector2DF &operator+= (const Vector4DF &op); + + Vector2DF &operator-= (const Vector2DC &op); + Vector2DF &operator-= (const Vector2DI &op); + Vector2DF &operator-= (const Vector2DF &op); + Vector2DF &operator-= (const Vector3DC &op); + Vector2DF &operator-= (const Vector3DI &op); + Vector2DF &operator-= (const Vector3DF &op); + Vector2DF &operator-= (const Vector4DF &op); + + Vector2DF &operator*= (const Vector2DC &op); + Vector2DF &operator*= (const Vector2DI &op); + Vector2DF &operator*= (const Vector2DF &op); + Vector2DF &operator*= (const Vector3DC &op); + Vector2DF &operator*= (const Vector3DI &op); + Vector2DF &operator*= (const Vector3DF &op); + Vector2DF &operator*= (const Vector4DF &op); + + Vector2DF &operator/= (const Vector2DC &op); + Vector2DF &operator/= (const Vector2DI &op); + Vector2DF &operator/= (const Vector2DF &op); + Vector2DF &operator/= (const Vector3DC &op); + Vector2DF &operator/= (const Vector3DI &op); + Vector2DF &operator/= (const Vector3DF &op); + Vector2DF &operator/= (const Vector4DF &op); + + Vector2DF &operator/= (const double v) {x /= v; y /= v; return *this;} + + // Note: Cross product does not exist for 2D vectors (only 3D) + + double Dot(const Vector2DC &v); + double Dot(const Vector2DI &v); + double Dot(const Vector2DF &v); + + double Dist (const Vector2DC &v); + double Dist (const Vector2DI &v); + double Dist (const Vector2DF &v); + double Dist (const Vector3DC &v); + double Dist (const Vector3DI &v); + double Dist (const Vector3DF &v); + double Dist (const Vector4DF &v); + + double DistSq (const Vector2DC &v); + double DistSq (const Vector2DI &v); + double DistSq (const Vector2DF &v); + double DistSq (const Vector3DC &v); + double DistSq (const Vector3DI &v); + double DistSq (const Vector3DF &v); + double DistSq (const Vector4DF &v); + + Vector2DF &Normalize (void); + double Length (void); + + VTYPE &X(void); + VTYPE &Y(void); + VTYPE Z(void); + VTYPE W(void); + const VTYPE &X(void) const; + const VTYPE &Y(void) const; + const VTYPE Z(void) const; + const VTYPE W(void) const; + VTYPE *Data (void); + }; + + #undef VNAME + #undef VTYPE + + // Vector3DC Declaration + + #define VNAME 3DC + #define VTYPE unsigned char + + class Vector3DC { + public: + VTYPE x, y, z; + + // Constructors/Destructors + inline Vector3DC(); + inline ~Vector3DC(); + inline Vector3DC (VTYPE xa, VTYPE ya, VTYPE za); + inline Vector3DC (Vector2DC &op); + inline Vector3DC (Vector2DI &op); + inline Vector3DC (Vector2DF &op); + inline Vector3DC (Vector3DC &op); + inline Vector3DC (Vector3DI &op); + inline Vector3DC (Vector3DF &op); + inline Vector3DC (Vector4DF &op); + + // Member Functions + inline Vector3DC &Set (VTYPE xa, VTYPE ya, VTYPE za); + + inline Vector3DC &operator= (Vector2DC &op); + inline Vector3DC &operator= (Vector2DI &op); + inline Vector3DC &operator= (Vector2DF &op); + inline Vector3DC &operator= (Vector3DC &op); + inline Vector3DC &operator= (Vector3DI &op); + inline Vector3DC &operator= (Vector3DF &op); + inline Vector3DC &operator= (Vector4DF &op); + + inline Vector3DC &operator+= (Vector2DC &op); + inline Vector3DC &operator+= (Vector2DI &op); + inline Vector3DC &operator+= (Vector2DF &op); + inline Vector3DC &operator+= (Vector3DC &op); + inline Vector3DC &operator+= (Vector3DI &op); + inline Vector3DC &operator+= (Vector3DF &op); + inline Vector3DC &operator+= (Vector4DF &op); + + inline Vector3DC &operator-= (Vector2DC &op); + inline Vector3DC &operator-= (Vector2DI &op); + inline Vector3DC &operator-= (Vector2DF &op); + inline Vector3DC &operator-= (Vector3DC &op); + inline Vector3DC &operator-= (Vector3DI &op); + inline Vector3DC &operator-= (Vector3DF &op); + inline Vector3DC &operator-= (Vector4DF &op); + + inline Vector3DC &operator*= (Vector2DC &op); + inline Vector3DC &operator*= (Vector2DI &op); + inline Vector3DC &operator*= (Vector2DF &op); + inline Vector3DC &operator*= (Vector3DC &op); + inline Vector3DC &operator*= (Vector3DI &op); + inline Vector3DC &operator*= (Vector3DF &op); + inline Vector3DC &operator*= (Vector4DF &op); + + inline Vector3DC &operator/= (Vector2DC &op); + inline Vector3DC &operator/= (Vector2DI &op); + inline Vector3DC &operator/= (Vector2DF &op); + inline Vector3DC &operator/= (Vector3DC &op); + inline Vector3DC &operator/= (Vector3DI &op); + inline Vector3DC &operator/= (Vector3DF &op); + inline Vector3DC &operator/= (Vector4DF &op); + + inline Vector3DC &Cross (Vector3DC &v); + inline Vector3DC &Cross (Vector3DI &v); + inline Vector3DC &Cross (Vector3DF &v); + + inline double Dot(Vector3DC &v); + inline double Dot(Vector3DI &v); + inline double Dot(Vector3DF &v); + + inline double Dist (Vector2DC &v); + inline double Dist (Vector2DI &v); + inline double Dist (Vector2DF &v); + inline double Dist (Vector3DC &v); + inline double Dist (Vector3DI &v); + inline double Dist (Vector3DF &v); + inline double Dist (Vector4DF &v); + + inline double DistSq (Vector2DC &v); + inline double DistSq (Vector2DI &v); + inline double DistSq (Vector2DF &v); + inline double DistSq (Vector3DC &v); + inline double DistSq (Vector3DI &v); + inline double DistSq (Vector3DF &v); + inline double DistSq (Vector4DF &v); + + inline Vector3DC &Normalize (void); + inline double Length (void); + + inline VTYPE &X(void); + inline VTYPE &Y(void); + inline VTYPE &Z(void); + inline VTYPE W(void); + inline const VTYPE &X(void) const; + inline const VTYPE &Y(void) const; + inline const VTYPE &Z(void) const; + inline const VTYPE W(void) const; + inline VTYPE *Data (void); + }; + + #undef VNAME + #undef VTYPE + + // Vector3DI Declaration + + #define VNAME 3DI + #define VTYPE int + + class Vector3DI { + public: + VTYPE x, y, z; + + // Constructors/Destructors + inline Vector3DI(); + inline ~Vector3DI(); + inline Vector3DI (VTYPE xa, VTYPE ya, VTYPE za); + inline Vector3DI (Vector2DC &op); + inline Vector3DI (Vector2DI &op); + inline Vector3DI (Vector2DF &op); + inline Vector3DI (Vector3DC &op); + inline Vector3DI (Vector3DI &op); + inline Vector3DI (Vector3DF &op); + inline Vector3DI (Vector4DF &op); + + // Set Functions + inline Vector3DI &Set (const int xa, const int ya, const int za); + + // Member Functions + inline Vector3DI &operator= (Vector2DC &op); + inline Vector3DI &operator= (Vector2DI &op); + inline Vector3DI &operator= (Vector2DF &op); + inline Vector3DI &operator= (Vector3DC &op); + inline Vector3DI &operator= (Vector3DI &op); + inline Vector3DI &operator= (Vector3DF &op); + inline Vector3DI &operator= (Vector4DF &op); + + inline Vector3DI &operator+= (Vector2DC &op); + inline Vector3DI &operator+= (Vector2DI &op); + inline Vector3DI &operator+= (Vector2DF &op); + inline Vector3DI &operator+= (Vector3DC &op); + inline Vector3DI &operator+= (Vector3DI &op); + inline Vector3DI &operator+= (Vector3DF &op); + inline Vector3DI &operator+= (Vector4DF &op); + + inline Vector3DI &operator-= (Vector2DC &op); + inline Vector3DI &operator-= (Vector2DI &op); + inline Vector3DI &operator-= (Vector2DF &op); + inline Vector3DI &operator-= (Vector3DC &op); + inline Vector3DI &operator-= (Vector3DI &op); + inline Vector3DI &operator-= (Vector3DF &op); + inline Vector3DI &operator-= (Vector4DF &op); + + inline Vector3DI &operator*= (Vector2DC &op); + inline Vector3DI &operator*= (Vector2DI &op); + inline Vector3DI &operator*= (Vector2DF &op); + inline Vector3DI &operator*= (Vector3DC &op); + inline Vector3DI &operator*= (Vector3DI &op); + inline Vector3DI &operator*= (Vector3DF &op); + inline Vector3DI &operator*= (Vector4DF &op); + + inline Vector3DI &operator/= (Vector2DC &op); + inline Vector3DI &operator/= (Vector2DI &op); + inline Vector3DI &operator/= (Vector2DF &op); + inline Vector3DI &operator/= (Vector3DC &op); + inline Vector3DI &operator/= (Vector3DI &op); + inline Vector3DI &operator/= (Vector3DF &op); + inline Vector3DI &operator/= (Vector4DF &op); + + inline Vector3DI &Cross (Vector3DC &v); + inline Vector3DI &Cross (Vector3DI &v); + inline Vector3DI &Cross (Vector3DF &v); + + inline double Dot(Vector3DC &v); + inline double Dot(Vector3DI &v); + inline double Dot(Vector3DF &v); + + inline double Dist (Vector2DC &v); + inline double Dist (Vector2DI &v); + inline double Dist (Vector2DF &v); + inline double Dist (Vector3DC &v); + inline double Dist (Vector3DI &v); + inline double Dist (Vector3DF &v); + inline double Dist (Vector4DF &v); + + inline double DistSq (Vector2DC &v); + inline double DistSq (Vector2DI &v); + inline double DistSq (Vector2DF &v); + inline double DistSq (Vector3DC &v); + inline double DistSq (Vector3DI &v); + inline double DistSq (Vector3DF &v); + inline double DistSq (Vector4DF &v); + + inline Vector3DI &Normalize (void); + inline double Length (void); + + inline VTYPE &X(void); + inline VTYPE &Y(void); + inline VTYPE &Z(void); + inline VTYPE W(void); + inline const VTYPE &X(void) const; + inline const VTYPE &Y(void) const; + inline const VTYPE &Z(void) const; + inline const VTYPE W(void) const; + inline VTYPE *Data (void); + }; + + #undef VNAME + #undef VTYPE + + // Vector3DF Declarations + + #define VNAME 3DF + #define VTYPE float + + class Vector3DF { + public: + VTYPE x, y, z; + + // Constructors/Destructors + inline Vector3DF(); + inline ~Vector3DF(); + inline Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za); + inline Vector3DF (const Vector2DC &op); + inline Vector3DF (const Vector2DI &op); + inline Vector3DF (const Vector2DF &op); + inline Vector3DF (const Vector3DC &op); + inline Vector3DF (const Vector3DI &op); + inline Vector3DF (const Vector3DF &op); + inline Vector3DF (const Vector4DF &op); + + // Set Functions + inline Vector3DF &Set (const double xa, const double ya, const double za); + + // Member Functions + inline Vector3DF &operator= (const int op); + inline Vector3DF &operator= (const double op); + inline Vector3DF &operator= (const Vector2DC &op); + inline Vector3DF &operator= (const Vector2DI &op); + inline Vector3DF &operator= (const Vector2DF &op); + inline Vector3DF &operator= (const Vector3DC &op); + inline Vector3DF &operator= (const Vector3DI &op); + inline Vector3DF &operator= (const Vector3DF &op); + inline Vector3DF &operator= (const Vector4DF &op); + + inline Vector3DF &operator+= (const int op); + inline Vector3DF &operator+= (const double op); + inline Vector3DF &operator+= (const Vector2DC &op); + inline Vector3DF &operator+= (const Vector2DI &op); + inline Vector3DF &operator+= (const Vector2DF &op); + inline Vector3DF &operator+= (const Vector3DC &op); + inline Vector3DF &operator+= (const Vector3DI &op); + inline Vector3DF &operator+= (const Vector3DF &op); + inline Vector3DF &operator+= (const Vector4DF &op); + + inline Vector3DF &operator-= (const int op); + inline Vector3DF &operator-= (const double op); + inline Vector3DF &operator-= (const Vector2DC &op); + inline Vector3DF &operator-= (const Vector2DI &op); + inline Vector3DF &operator-= (const Vector2DF &op); + inline Vector3DF &operator-= (const Vector3DC &op); + inline Vector3DF &operator-= (const Vector3DI &op); + inline Vector3DF &operator-= (const Vector3DF &op); + inline Vector3DF &operator-= (const Vector4DF &op); + + inline Vector3DF &operator*= (const int op); + inline Vector3DF &operator*= (const double op); + inline Vector3DF &operator*= (const Vector2DC &op); + inline Vector3DF &operator*= (const Vector2DI &op); + inline Vector3DF &operator*= (const Vector2DF &op); + inline Vector3DF &operator*= (const Vector3DC &op); + inline Vector3DF &operator*= (const Vector3DI &op); + inline Vector3DF &operator*= (const Vector3DF &op); + inline Vector3DF &operator*= (const Vector4DF &op); + Vector3DF &operator*= (const Matrix4F &op); + Vector3DF &operator*= (const MatrixF &op); // see vector.cpp + + inline Vector3DF &operator/= (const int op); + inline Vector3DF &operator/= (const double op); + inline Vector3DF &operator/= (const Vector2DC &op); + inline Vector3DF &operator/= (const Vector2DI &op); + inline Vector3DF &operator/= (const Vector2DF &op); + inline Vector3DF &operator/= (const Vector3DC &op); + inline Vector3DF &operator/= (const Vector3DI &op); + inline Vector3DF &operator/= (const Vector3DF &op); + inline Vector3DF &operator/= (const Vector4DF &op); + + inline Vector3DF &Cross (const Vector3DC &v); + inline Vector3DF &Cross (const Vector3DI &v); + inline Vector3DF &Cross (const Vector3DF &v); + + inline double Dot(const Vector3DC &v); + inline double Dot(const Vector3DI &v); + inline double Dot(const Vector3DF &v); + + inline double Dist (const Vector2DC &v); + inline double Dist (const Vector2DI &v); + inline double Dist (const Vector2DF &v); + inline double Dist (const Vector3DC &v); + inline double Dist (const Vector3DI &v); + inline double Dist (const Vector3DF &v); + inline double Dist (const Vector4DF &v); + + inline double DistSq (const Vector2DC &v); + inline double DistSq (const Vector2DI &v); + inline double DistSq (const Vector2DF &v); + inline double DistSq (const Vector3DC &v); + inline double DistSq (const Vector3DI &v); + inline double DistSq (const Vector3DF &v); + inline double DistSq (const Vector4DF &v); + + inline Vector3DF &Normalize (void); + inline double Length (void); + + inline VTYPE &X(); + inline VTYPE &Y(); + inline VTYPE &Z(); + inline VTYPE W(); + inline const VTYPE &X() const; + inline const VTYPE &Y() const; + inline const VTYPE &Z() const; + inline const VTYPE W() const; + inline VTYPE *Data (); + }; + + #undef VNAME + #undef VTYPE + + // Vector4DF Declarations + + #define VNAME 4DF + #define VTYPE double + + class Vector4DF { + public: + VTYPE x, y, z, w; + + // Constructors/Destructors + inline Vector4DF(); + inline ~Vector4DF(); + inline Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa); + inline Vector4DF (Vector2DC &op); + inline Vector4DF (Vector2DI &op); + inline Vector4DF (Vector2DF &op); + inline Vector4DF (Vector3DC &op); + inline Vector4DF (Vector3DI &op); + inline Vector4DF (Vector3DF &op); + inline Vector4DF (Vector4DF &op); + + // Member Functions + inline Vector4DF &operator= (int op); + inline Vector4DF &operator= (double op); + inline Vector4DF &operator= (Vector2DC &op); + inline Vector4DF &operator= (Vector2DI &op); + inline Vector4DF &operator= (Vector2DF &op); + inline Vector4DF &operator= (Vector3DC &op); + inline Vector4DF &operator= (Vector3DI &op); + inline Vector4DF &operator= (Vector3DF &op); + inline Vector4DF &operator= (Vector4DF &op); + + inline Vector4DF &operator+= (int op); + inline Vector4DF &operator+= (double op); + inline Vector4DF &operator+= (Vector2DC &op); + inline Vector4DF &operator+= (Vector2DI &op); + inline Vector4DF &operator+= (Vector2DF &op); + inline Vector4DF &operator+= (Vector3DC &op); + inline Vector4DF &operator+= (Vector3DI &op); + inline Vector4DF &operator+= (Vector3DF &op); + inline Vector4DF &operator+= (Vector4DF &op); + + inline Vector4DF &operator-= (int op); + inline Vector4DF &operator-= (double op); + inline Vector4DF &operator-= (Vector2DC &op); + inline Vector4DF &operator-= (Vector2DI &op); + inline Vector4DF &operator-= (Vector2DF &op); + inline Vector4DF &operator-= (Vector3DC &op); + inline Vector4DF &operator-= (Vector3DI &op); + inline Vector4DF &operator-= (Vector3DF &op); + inline Vector4DF &operator-= (Vector4DF &op); + + inline Vector4DF &operator*= (int op); + inline Vector4DF &operator*= (double op); + inline Vector4DF &operator*= (Vector2DC &op); + inline Vector4DF &operator*= (Vector2DI &op); + inline Vector4DF &operator*= (Vector2DF &op); + inline Vector4DF &operator*= (Vector3DC &op); + inline Vector4DF &operator*= (Vector3DI &op); + inline Vector4DF &operator*= (Vector3DF &op); + inline Vector4DF &operator*= (Vector4DF &op); + Vector4DF &operator*= (const Matrix4F &op); + Vector4DF &operator*= (const MatrixF &op); // see vector.cpp + + inline Vector4DF &operator/= (int op); + inline Vector4DF &operator/= (double op); + inline Vector4DF &operator/= (Vector2DC &op); + inline Vector4DF &operator/= (Vector2DI &op); + inline Vector4DF &operator/= (Vector2DF &op); + inline Vector4DF &operator/= (Vector3DC &op); + inline Vector4DF &operator/= (Vector3DI &op); + inline Vector4DF &operator/= (Vector3DF &op); + inline Vector4DF &operator/= (Vector4DF &op); + + inline Vector4DF &Cross (Vector4DF &v); + + inline double Dot(Vector4DF &v); + + inline double Dist (Vector4DF &v); + + inline double DistSq (Vector4DF &v); + + inline Vector4DF &Normalize (void); + inline double Length (void); + + inline VTYPE &X(void); + inline VTYPE &Y(void); + inline VTYPE &Z(void); + inline VTYPE &W(void); + inline const VTYPE &X(void) const; + inline const VTYPE &Y(void) const; + inline const VTYPE &Z(void) const; + inline const VTYPE &W(void) const; + inline VTYPE *Data (void); + }; + + #undef VNAME + #undef VTYPE + + // Vector Code Definitions (Inlined) + #include "vector.cci" + +#endif + diff --git a/Extras/sph/fluids.vcproj b/Extras/sph/fluids.vcproj index 9d3115726..e9060ec6a 100644 --- a/Extras/sph/fluids.vcproj +++ b/Extras/sph/fluids.vcproj @@ -1,306 +1,306 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/sph/fluids/fluid.h b/Extras/sph/fluids/fluid.h index f049ec470..2ed620212 100644 --- a/Extras/sph/fluids/fluid.h +++ b/Extras/sph/fluids/fluid.h @@ -1,44 +1,44 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 DEF_FLUID - #define DEF_FLUID - - #include "vector.h" - - #include "common_defs.h" - - struct Fluid { - public: - Vector3DF pos; // Basic particle (must match Particle class) - DWORD clr; - int next; - Vector3DF vel; - Vector3DF vel_eval; - unsigned short age; - - float pressure; // Smoothed Particle Hydrodynamics - float density; - Vector3DF sph_force; - }; - -#endif /*PARTICLE_H_*/ +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 DEF_FLUID + #define DEF_FLUID + + #include "vector.h" + + #include "common_defs.h" + + struct Fluid { + public: + Vector3DF pos; // Basic particle (must match Particle class) + DWORD clr; + int next; + Vector3DF vel; + Vector3DF vel_eval; + unsigned short age; + + float pressure; // Smoothed Particle Hydrodynamics + float density; + Vector3DF sph_force; + }; + +#endif /*PARTICLE_H_*/ diff --git a/Extras/sph/fluids/fluid_system.cpp b/Extras/sph/fluids/fluid_system.cpp index 910d1936c..966a2ce15 100644 --- a/Extras/sph/fluids/fluid_system.cpp +++ b/Extras/sph/fluids/fluid_system.cpp @@ -1,869 +1,869 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 - -#ifdef _MSC_VER - #include -#else - #include -#endif - -#include "common_defs.h" -#include "mtime.h" -#include "fluid_system.h" - -#ifdef BUILD_CUDA - #include "fluid_system_host.cuh" -#endif - -#define EPSILON 0.00001f //for collision detection - -FluidSystem::FluidSystem () -{ -} - -void FluidSystem::Initialize ( int mode, int total ) -{ - if ( mode != BFLUID ) { - printf ( "ERROR: FluidSystem not initialized as BFLUID.\n"); - } - PointSet::Initialize ( mode, total ); - - FreeBuffers (); - AddBuffer ( BFLUID, sizeof ( Fluid ), total ); - AddAttribute ( 0, "pos", sizeof ( Vector3DF ), false ); - AddAttribute ( 0, "color", sizeof ( DWORD ), false ); - AddAttribute ( 0, "vel", sizeof ( Vector3DF ), false ); - AddAttribute ( 0, "ndx", sizeof ( unsigned short ), false ); - AddAttribute ( 0, "age", sizeof ( unsigned short ), false ); - - AddAttribute ( 0, "pressure", sizeof ( double ), false ); - AddAttribute ( 0, "density", sizeof ( double ), false ); - AddAttribute ( 0, "sph_force", sizeof ( Vector3DF ), false ); - AddAttribute ( 0, "next", sizeof ( Fluid* ), false ); - AddAttribute ( 0, "tag", sizeof ( bool ), false ); - - SPH_Setup (); - Reset ( total ); -} - -void FluidSystem::Reset ( int nmax ) -{ - ResetBuffer ( 0, nmax ); - - m_DT = 0.003; // 0.001; // .001 = for point grav - - // Reset parameters - m_Param [ MAX_FRAC ] = 1.0; - m_Param [ POINT_GRAV ] = 0.0; - m_Param [ PLANE_GRAV ] = 1.0; - - m_Param [ BOUND_ZMIN_SLOPE ] = 0.0; - m_Param [ FORCE_XMAX_SIN ] = 0.0; - m_Param [ FORCE_XMIN_SIN ] = 0.0; - m_Toggle [ WRAP_X ] = false; - m_Toggle [ WALL_BARRIER ] = false; - m_Toggle [ LEVY_BARRIER ] = false; - m_Toggle [ DRAIN_BARRIER ] = false; - m_Param [ SPH_INTSTIFF ] = 1.00; - m_Param [ SPH_VISC ] = 0.2; - m_Param [ SPH_INTSTIFF ] = 0.50; - m_Param [ SPH_EXTSTIFF ] = 20000; - m_Param [ SPH_SMOOTHRADIUS ] = 0.01; - - m_Vec [ POINT_GRAV_POS ].Set ( 0, 0, 50 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0, 0, -9.8 ); - m_Vec [ EMIT_POS ].Set ( 0, 0, 0 ); - m_Vec [ EMIT_RATE ].Set ( 0, 0, 0 ); - m_Vec [ EMIT_ANG ].Set ( 0, 90, 1.0 ); - m_Vec [ EMIT_DANG ].Set ( 0, 0, 0 ); -} - -int FluidSystem::AddPoint () -{ - xref ndx; - Fluid* f = (Fluid*) AddElem ( 0, ndx ); - f->sph_force.Set(0,0,0); - f->vel.Set(0,0,0); - f->vel_eval.Set(0,0,0); - f->next = 0x0; - f->pressure = 0; - f->density = 0; - return ndx; -} - -int FluidSystem::AddPointReuse () -{ - xref ndx; - Fluid* f; - if ( NumPoints() <= mBuf[0].max-2 ) - f = (Fluid*) AddElem ( 0, ndx ); - else - f = (Fluid*) RandomElem ( 0, ndx ); - - f->sph_force.Set(0,0,0); - f->vel.Set(0,0,0); - f->vel_eval.Set(0,0,0); - f->next = 0x0; - f->pressure = 0; - f->density = 0; - return ndx; -} - -void FluidSystem::Run () -{ - bool bTiming = false;//true; - - mint::Time start, stop; - - float ss = m_Param [ SPH_PDIST ] / m_Param[ SPH_SIMSCALE ]; // simulation scale (not Schutzstaffel) - - if ( m_Vec[EMIT_RATE].x > 0 && (++m_Frame) % (int) m_Vec[EMIT_RATE].x == 0 ) { - //m_Frame = 0; - Emit ( ss ); - } - - #ifdef NOGRID - // Slow method - O(n^2) - SPH_ComputePressureSlow (); - SPH_ComputeForceSlow (); - #else - - if ( m_Toggle[USE_CUDA] ) { - - #ifdef BUILD_CUDA - // -- GPU -- - start.SetSystemTime ( ACC_NSEC ); - TransferToCUDA ( mBuf[0].data, (int*) &m_Grid[0], NumPoints() ); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "TO: %s\n", stop.GetReadableTime().c_str() ); } - - start.SetSystemTime ( ACC_NSEC ); - Grid_InsertParticlesCUDA (); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "INSERT (CUDA): %s\n", stop.GetReadableTime().c_str() ); } - - start.SetSystemTime ( ACC_NSEC ); - SPH_ComputePressureCUDA (); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "PRESS (CUDA): %s\n", stop.GetReadableTime().c_str() ); } - - start.SetSystemTime ( ACC_NSEC ); - SPH_ComputeForceCUDA (); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "FORCE (CUDA): %s\n", stop.GetReadableTime().c_str() ); } - - //** CUDA integrator is incomplete.. - // Once integrator is done, we can remove TransferTo/From steps - /*start.SetSystemTime ( ACC_NSEC ); - SPH_AdvanceCUDA( m_DT, m_DT/m_Param[SPH_SIMSCALE] ); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "ADV (CUDA): %s\n", stop.GetReadableTime().c_str() ); }*/ - - start.SetSystemTime ( ACC_NSEC ); - TransferFromCUDA ( mBuf[0].data, (int*) &m_Grid[0], NumPoints() ); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "FROM: %s\n", stop.GetReadableTime().c_str() ); } - - // .. Do advance on CPU - Advance(); - - #endif - - } else { - // -- CPU only -- - - start.SetSystemTime ( ACC_NSEC ); - Grid_InsertParticles (); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "INSERT: %s\n", stop.GetReadableTime().c_str() ); } - - start.SetSystemTime ( ACC_NSEC ); - SPH_ComputePressureGrid (); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "PRESS: %s\n", stop.GetReadableTime().c_str() ); } - - start.SetSystemTime ( ACC_NSEC ); - SPH_ComputeForceGridNC (); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "FORCE: %s\n", stop.GetReadableTime().c_str() ); } - - start.SetSystemTime ( ACC_NSEC ); - Advance(); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "ADV: %s\n", stop.GetReadableTime().c_str() ); } - } - - #endif -} - - - -void FluidSystem::SPH_DrawDomain () -{ - Vector3DF min, max; - min = m_Vec[SPH_VOLMIN]; - max = m_Vec[SPH_VOLMAX]; - min.z += 0.5; - - glColor3f ( 0.0, 0.0, 1.0 ); - glBegin ( GL_LINES ); - glVertex3f ( min.x, min.y, min.z ); glVertex3f ( max.x, min.y, min.z ); - glVertex3f ( min.x, max.y, min.z ); glVertex3f ( max.x, max.y, min.z ); - glVertex3f ( min.x, min.y, min.z ); glVertex3f ( min.x, max.y, min.z ); - glVertex3f ( max.x, min.y, min.z ); glVertex3f ( max.x, max.y, min.z ); - glEnd (); -} - -void FluidSystem::Advance () -{ - char *dat1, *dat1_end; - Fluid* p; - Vector3DF norm, z; - Vector3DF dir, accel; - Vector3DF vnext; - Vector3DF min, max; - double adj; - float SL, SL2, ss, radius; - float stiff, damp, speed, diff; - SL = m_Param[SPH_LIMIT]; - SL2 = SL*SL; - - stiff = m_Param[SPH_EXTSTIFF]; - damp = m_Param[SPH_EXTDAMP]; - radius = m_Param[SPH_PRADIUS]; - min = m_Vec[SPH_VOLMIN]; - max = m_Vec[SPH_VOLMAX]; - ss = m_Param[SPH_SIMSCALE]; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { - p = (Fluid*) dat1; - - // Compute Acceleration - accel = p->sph_force; - accel *= m_Param[SPH_PMASS]; - - // Velocity limiting - speed = accel.x*accel.x + accel.y*accel.y + accel.z*accel.z; - if ( speed > SL2 ) { - accel *= SL / sqrt(speed); - } - - // Boundary Conditions - - // Z-axis walls - diff = 2 * radius - ( p->pos.z - min.z - (p->pos.x - m_Vec[SPH_VOLMIN].x) * m_Param[BOUND_ZMIN_SLOPE] )*ss; - if (diff > EPSILON ) { - norm.Set ( -m_Param[BOUND_ZMIN_SLOPE], 0, 1.0 - m_Param[BOUND_ZMIN_SLOPE] ); - adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - - diff = 2 * radius - ( max.z - p->pos.z )*ss; - if (diff > EPSILON) { - norm.Set ( 0, 0, -1 ); - adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - - // X-axis walls - if ( !m_Toggle[WRAP_X] ) { - diff = 2 * radius - ( p->pos.x - min.x + (sin(m_Time*10.0)-1+(p->pos.y*0.025)*0.25) * m_Param[FORCE_XMIN_SIN] )*ss; - //diff = 2 * radius - ( p->pos.x - min.x + (sin(m_Time*10.0)-1) * m_Param[FORCE_XMIN_SIN] )*ss; - if (diff > EPSILON ) { - norm.Set ( 1.0, 0, 0 ); - adj = (m_Param[ FORCE_XMIN_SIN ] + 1) * stiff * diff - damp * norm.Dot ( p->vel_eval ) ; - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - - diff = 2 * radius - ( max.x - p->pos.x + (sin(m_Time*10.0)-1) * m_Param[FORCE_XMAX_SIN] )*ss; - if (diff > EPSILON) { - norm.Set ( -1, 0, 0 ); - adj = (m_Param[ FORCE_XMAX_SIN ]+1) * stiff * diff - damp * norm.Dot ( p->vel_eval ); - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - } - - // Y-axis walls - diff = 2 * radius - ( p->pos.y - min.y )*ss; - if (diff > EPSILON) { - norm.Set ( 0, 1, 0 ); - adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - diff = 2 * radius - ( max.y - p->pos.y )*ss; - if (diff > EPSILON) { - norm.Set ( 0, -1, 0 ); - adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - - // Wall barrier - if ( m_Toggle[WALL_BARRIER] ) { - diff = 2 * radius - ( p->pos.x - 0 )*ss; - if (diff < 2*radius && diff > EPSILON && fabs(p->pos.y) < 3 && p->pos.z < 10) { - norm.Set ( 1.0, 0, 0 ); - adj = 2*stiff * diff - damp * norm.Dot ( p->vel_eval ) ; - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - } - - // Levy barrier - if ( m_Toggle[LEVY_BARRIER] ) { - diff = 2 * radius - ( p->pos.x - 0 )*ss; - if (diff < 2*radius && diff > EPSILON && fabs(p->pos.y) > 5 && p->pos.z < 10) { - norm.Set ( 1.0, 0, 0 ); - adj = 2*stiff * diff - damp * norm.Dot ( p->vel_eval ) ; - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - } - // Drain barrier - if ( m_Toggle[DRAIN_BARRIER] ) { - diff = 2 * radius - ( p->pos.z - min.z-15 )*ss; - if (diff < 2*radius && diff > EPSILON && (fabs(p->pos.x)>3 || fabs(p->pos.y)>3) ) { - norm.Set ( 0, 0, 1); - adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); - accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; - } - } - - // Plane gravity - if ( m_Param[PLANE_GRAV] > 0) - accel += m_Vec[PLANE_GRAV_DIR]; - - // Point gravity - if ( m_Param[POINT_GRAV] > 0 ) { - norm.x = ( p->pos.x - m_Vec[POINT_GRAV_POS].x ); - norm.y = ( p->pos.y - m_Vec[POINT_GRAV_POS].y ); - norm.z = ( p->pos.z - m_Vec[POINT_GRAV_POS].z ); - norm.Normalize (); - norm *= m_Param[POINT_GRAV]; - accel -= norm; - } - - // Leapfrog Integration ---------------------------- - vnext = accel; - vnext *= m_DT; - vnext += p->vel; // v(t+1/2) = v(t-1/2) + a(t) dt - p->vel_eval = p->vel; - p->vel_eval += vnext; - p->vel_eval *= 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later - p->vel = vnext; - vnext *= m_DT/ss; - p->pos += vnext; // p(t+1) = p(t) + v(t+1/2) dt - - if ( m_Param[CLR_MODE]==1.0 ) { - adj = fabs(vnext.x)+fabs(vnext.y)+fabs(vnext.z) / 7000.0; - adj = (adj > 1.0) ? 1.0 : adj; - p->clr = COLORA( 0, adj, adj, 1 ); - } - if ( m_Param[CLR_MODE]==2.0 ) { - float v = 0.5 + ( p->pressure / 1500.0); - if ( v < 0.1 ) v = 0.1; - if ( v > 1.0 ) v = 1.0; - p->clr = COLORA ( v, 1-v, 0, 1 ); - } - - - // Euler integration ------------------------------- - /* accel += m_Gravity; - accel *= m_DT; - p->vel += accel; // v(t+1) = v(t) + a(t) dt - p->vel_eval += accel; - p->vel_eval *= m_DT/d; - p->pos += p->vel_eval; - p->vel_eval = p->vel; */ - - - if ( m_Toggle[WRAP_X] ) { - diff = p->pos.x - (m_Vec[SPH_VOLMIN].x + 2); // -- Simulates object in center of flow - if ( diff <= 0 ) { - p->pos.x = (m_Vec[SPH_VOLMAX].x - 2) + diff*2; - p->pos.z = 10; - } - } - } - - m_Time += m_DT; -} - -//------------------------------------------------------ SPH Setup -// -// Range = +/- 10.0 * 0.006 (r) = 0.12 m (= 120 mm = 4.7 inch) -// Container Volume (Vc) = 0.001728 m^3 -// Rest Density (D) = 1000.0 kg / m^3 -// Particle Mass (Pm) = 0.00020543 kg (mass = vol * density) -// Number of Particles (N) = 4000.0 -// Water Mass (M) = 0.821 kg (= 821 grams) -// Water Volume (V) = 0.000821 m^3 (= 3.4 cups, .21 gals) -// Smoothing Radius (R) = 0.02 m (= 20 mm = ~3/4 inch) -// Particle Radius (Pr) = 0.00366 m (= 4 mm = ~1/8 inch) -// Particle Volume (Pv) = 2.054e-7 m^3 (= .268 milliliters) -// Rest Distance (Pd) = 0.0059 m -// -// Given: D, Pm, N -// Pv = Pm / D 0.00020543 kg / 1000 kg/m^3 = 2.054e-7 m^3 -// Pv = 4/3*pi*Pr^3 cuberoot( 2.054e-7 m^3 * 3/(4pi) ) = 0.00366 m -// M = Pm * N 0.00020543 kg * 4000.0 = 0.821 kg -// V = M / D 0.821 kg / 1000 kg/m^3 = 0.000821 m^3 -// V = Pv * N 2.054e-7 m^3 * 4000 = 0.000821 m^3 -// Pd = cuberoot(Pm/D) cuberoot(0.00020543/1000) = 0.0059 m -// -// Ideal grid cell size (gs) = 2 * smoothing radius = 0.02*2 = 0.04 -// Ideal domain size = k*gs/d = k*0.02*2/0.005 = k*8 = {8, 16, 24, 32, 40, 48, ..} -// (k = number of cells, gs = cell size, d = simulation scale) - -void FluidSystem::SPH_Setup () -{ - m_Param [ SPH_SIMSCALE ] = 0.004; // unit size - m_Param [ SPH_VISC ] = 0.2; // pascal-second (Pa.s) = 1 kg m^-1 s^-1 (see wikipedia page on viscosity) - m_Param [ SPH_RESTDENSITY ] = 600.0; // kg / m^3 - m_Param [ SPH_PMASS ] = 0.00020543; // kg - m_Param [ SPH_PRADIUS ] = 0.004; // m - m_Param [ SPH_PDIST ] = 0.0059; // m - m_Param [ SPH_SMOOTHRADIUS ] = 0.01; // m - m_Param [ SPH_INTSTIFF ] = 1.00; - m_Param [ SPH_EXTSTIFF ] = 10000.0; - m_Param [ SPH_EXTDAMP ] = 256.0; - m_Param [ SPH_LIMIT ] = 200.0; // m / s - - m_Toggle [ SPH_GRID ] = false; - m_Toggle [ SPH_DEBUG ] = false; - - SPH_ComputeKernels (); -} - -void FluidSystem::SPH_ComputeKernels () -{ - m_Param [ SPH_PDIST ] = pow ( m_Param[SPH_PMASS] / m_Param[SPH_RESTDENSITY], 1/3.0 ); - m_R2 = m_Param [SPH_SMOOTHRADIUS] * m_Param[SPH_SMOOTHRADIUS]; - m_Poly6Kern = 315.0f / (64.0f * 3.141592 * pow( m_Param[SPH_SMOOTHRADIUS], 9) ); // Wpoly6 kernel (denominator part) - 2003 Muller, p.4 - m_SpikyKern = -45.0f / (3.141592 * pow( m_Param[SPH_SMOOTHRADIUS], 6) ); // Laplacian of viscocity (denominator): PI h^6 - m_LapKern = 45.0f / (3.141592 * pow( m_Param[SPH_SMOOTHRADIUS], 6) ); -} - -void FluidSystem::SPH_CreateExample ( int n, int nmax ) -{ - Vector3DF pos; - Vector3DF min, max; - - Reset ( nmax ); - - switch ( n ) { - case 0: // Wave pool - - //-- TEST CASE: 2x2x2 grid, 32 particles. NOTE: Set PRADIUS to 0.0004 to reduce wall influence - // grid 0: 3*3*2 = 18 particles - // grid 1,2: 3*1*2 = 6 particles - // grid 3: 1*1*2 = 2 particles - // grid 4,5,6: 0 = 0 particles - /*m_Vec [ SPH_VOLMIN ].Set ( -2.5, -2.5, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 2.5, 2.5, 5.0 ); - m_Vec [ SPH_INITMIN ].Set ( -2.5, -2.5, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 2.5, 2.5, 1.6 );*/ - - m_Vec [ SPH_VOLMIN ].Set ( -30, -30, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 30, 30, 40 ); - - //m_Vec [ SPH_INITMIN ].Set ( -5, -5, 10 ); - //m_Vec [ SPH_INITMAX ].Set ( 5, 5, 20 ); - - m_Vec [ SPH_INITMIN ].Set ( -20, -26, 10 ); - m_Vec [ SPH_INITMAX ].Set ( 20, 26, 40 ); - - m_Param [ FORCE_XMIN_SIN ] = 12.0; - m_Param [ BOUND_ZMIN_SLOPE ] = 0.05; - break; - case 1: // Dam break - m_Vec [ SPH_VOLMIN ].Set ( -30, -14, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 30, 14, 60 ); - m_Vec [ SPH_INITMIN ].Set ( 0, -13, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 29, 13, 30 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - case 2: // Dual-Wave pool - m_Vec [ SPH_VOLMIN ].Set ( -60, -5, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 60, 5, 50 ); - m_Vec [ SPH_INITMIN ].Set ( -46, -5, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 46, 5, 15 ); - m_Param [ FORCE_XMIN_SIN ] = 8.0; - m_Param [ FORCE_XMAX_SIN ] = 8.0; - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - case 3: // Swirl Stream - m_Vec [ SPH_VOLMIN ].Set ( -30, -30, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 30, 30, 50 ); - m_Vec [ SPH_INITMIN ].Set ( -30, -30, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 30, 30, 40 ); - m_Vec [ EMIT_POS ].Set ( -20, -20, 22 ); - m_Vec [ EMIT_RATE ].Set ( 1, 4, 0 ); - m_Vec [ EMIT_ANG ].Set ( 0, 120, 1.5 ); - m_Vec [ EMIT_DANG ].Set ( 0, 0, 0 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - case 4: // Shockwave - m_Vec [ SPH_VOLMIN ].Set ( -60, -15, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 60, 15, 50 ); - m_Vec [ SPH_INITMIN ].Set ( -59, -14, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 59, 14, 30 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - m_Toggle [ WALL_BARRIER ] = true; - m_Toggle [ WRAP_X ] = true; - break; - case 5: // Zero gravity - m_Vec [ SPH_VOLMIN ].Set ( -40, -40, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 40, 40, 50 ); - m_Vec [ SPH_INITMIN ].Set ( -20, -20, 20 ); - m_Vec [ SPH_INITMAX ].Set ( 20, 20, 40 ); - m_Vec [ EMIT_POS ].Set ( -20, 0, 40 ); - m_Vec [ EMIT_RATE ].Set ( 2, 1, 0 ); - m_Vec [ EMIT_ANG ].Set ( 0, 120, 0.25 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0, 0, 0 ); - m_Param [ SPH_INTSTIFF ] = 0.20; - break; - case 6: // Point gravity - m_Vec [ SPH_VOLMIN ].Set ( -40, -40, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 40, 40, 50 ); - m_Vec [ SPH_INITMIN ].Set ( -20, -20, 20 ); - m_Vec [ SPH_INITMAX ].Set ( 20, 20, 40 ); - m_Param [ SPH_INTSTIFF ] = 0.50; - m_Vec [ EMIT_POS ].Set ( -20, 20, 25 ); - m_Vec [ EMIT_RATE ].Set ( 1, 4, 0 ); - m_Vec [ EMIT_ANG ].Set ( -20, 100, 2.0 ); - m_Vec [ POINT_GRAV_POS ].Set ( 0, 0, 25 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0, 0, 0 ); - m_Param [ POINT_GRAV ] = 3.5; - break; - case 7: // Levy break - m_Vec [ SPH_VOLMIN ].Set ( -40, -40, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 40, 40, 50 ); - m_Vec [ SPH_INITMIN ].Set ( 10, -40, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 40, 40, 50 ); - m_Vec [ EMIT_POS ].Set ( 34, 27, 16.6 ); - m_Vec [ EMIT_RATE ].Set ( 2, 9, 0 ); - m_Vec [ EMIT_ANG ].Set ( 118, 200, 1.0 ); - m_Toggle [ LEVY_BARRIER ] = true; - m_Param [ BOUND_ZMIN_SLOPE ] = 0.1; - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - case 8: // Drain - m_Vec [ SPH_VOLMIN ].Set ( -20, -20, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 20, 20, 50 ); - m_Vec [ SPH_INITMIN ].Set ( -15, -20, 20 ); - m_Vec [ SPH_INITMAX ].Set ( 20, 20, 50 ); - m_Vec [ EMIT_POS ].Set ( -16, -16, 30 ); - m_Vec [ EMIT_RATE ].Set ( 1, 4, 0 ); - m_Vec [ EMIT_ANG ].Set ( -20, 140, 1.8 ); - m_Toggle [ DRAIN_BARRIER ] = true; - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - case 9: // Tumbler - m_Vec [ SPH_VOLMIN ].Set ( -30, -30, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 30, 30, 50 ); - m_Vec [ SPH_INITMIN ].Set ( 24, -29, 20 ); - m_Vec [ SPH_INITMAX ].Set ( 29, 29, 40 ); - m_Param [ SPH_VISC ] = 0.1; - m_Param [ SPH_INTSTIFF ] = 0.50; - m_Param [ SPH_EXTSTIFF ] = 8000; - //m_Param [ SPH_SMOOTHRADIUS ] = 0.01; - m_Param [ BOUND_ZMIN_SLOPE ] = 0.4; - m_Param [ FORCE_XMIN_SIN ] = 12.00; - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - case 10: // Large sim - m_Vec [ SPH_VOLMIN ].Set ( -35, -35, 0 ); - m_Vec [ SPH_VOLMAX ].Set ( 35, 35, 60 ); - m_Vec [ SPH_INITMIN ].Set ( -5, -35, 0 ); - m_Vec [ SPH_INITMAX ].Set ( 30, 0, 60 ); - m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); - break; - } - - SPH_ComputeKernels (); - - m_Param [ SPH_SIMSIZE ] = m_Param [ SPH_SIMSCALE ] * (m_Vec[SPH_VOLMAX].z - m_Vec[SPH_VOLMIN].z); - m_Param [ SPH_PDIST ] = pow ( m_Param[SPH_PMASS] / m_Param[SPH_RESTDENSITY], 1/3.0 ); - - float ss = m_Param [ SPH_PDIST ]*0.87 / m_Param[ SPH_SIMSCALE ]; - printf ( "Spacing: %f\n", ss); - AddVolume ( m_Vec[SPH_INITMIN], m_Vec[SPH_INITMAX], ss ); // Create the particles - - float cell_size = m_Param[SPH_SMOOTHRADIUS]*2.0; // Grid cell size (2r) - Grid_Setup ( m_Vec[SPH_VOLMIN], m_Vec[SPH_VOLMAX], m_Param[SPH_SIMSCALE], cell_size, 1.0 ); // Setup grid - Grid_InsertParticles (); // Insert particles - - Vector3DF vmin, vmax; - vmin = m_Vec[SPH_VOLMIN]; - vmin -= Vector3DF(2,2,2); - vmax = m_Vec[SPH_VOLMAX]; - vmax += Vector3DF(2,2,-2); - - #ifdef BUILD_CUDA - FluidClearCUDA (); - Sleep ( 500 ); - - FluidSetupCUDA ( NumPoints(), sizeof(Fluid), *(float3*)& m_GridMin, *(float3*)& m_GridMax, *(float3*)& m_GridRes, *(float3*)& m_GridSize, (int) m_Vec[EMIT_RATE].x ); - - Sleep ( 500 ); - - FluidParamCUDA ( m_Param[SPH_SIMSCALE], m_Param[SPH_SMOOTHRADIUS], m_Param[SPH_PMASS], m_Param[SPH_RESTDENSITY], m_Param[SPH_INTSTIFF], m_Param[SPH_VISC] ); - #endif - -} - -// Compute Pressures - Very slow yet simple. O(n^2) -void FluidSystem::SPH_ComputePressureSlow () -{ - char *dat1, *dat1_end; - char *dat2, *dat2_end; - Fluid *p, *q; - int cnt = 0; - double dx, dy, dz, sum, dsq, c; - double d, d2, mR, mR2; - d = m_Param[SPH_SIMSCALE]; - d2 = d*d; - mR = m_Param[SPH_SMOOTHRADIUS]; - mR2 = mR*mR; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { - p = (Fluid*) dat1; - - sum = 0.0; - cnt = 0; - - dat2_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat2 = mBuf[0].data; dat2 < dat2_end; dat2 += mBuf[0].stride ) { - q = (Fluid*) dat2; - - if ( p==q ) continue; - dx = ( p->pos.x - q->pos.x)*d; // dist in cm - dy = ( p->pos.y - q->pos.y)*d; - dz = ( p->pos.z - q->pos.z)*d; - dsq = (dx*dx + dy*dy + dz*dz); - if ( mR2 > dsq ) { - c = m_R2 - dsq; - sum += c * c * c; - cnt++; - //if ( p == m_CurrP ) q->tag = true; - } - } - p->density = sum * m_Param[SPH_PMASS] * m_Poly6Kern ; - p->pressure = ( p->density - m_Param[SPH_RESTDENSITY] ) * m_Param[SPH_INTSTIFF]; - p->density = 1.0f / p->density; - } -} - -// Compute Pressures - Using spatial grid, and also create neighbor table -void FluidSystem::SPH_ComputePressureGrid () -{ - char *dat1, *dat1_end; - Fluid* p; - Fluid* pcurr; - int pndx; - int i, cnt = 0; - float dx, dy, dz, sum, dsq, c; - float d, d2, mR, mR2; - float radius = m_Param[SPH_SMOOTHRADIUS] / m_Param[SPH_SIMSCALE]; - d = m_Param[SPH_SIMSCALE]; - d2 = d*d; - mR = m_Param[SPH_SMOOTHRADIUS]; - mR2 = mR*mR; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - i = 0; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride, i++ ) { - p = (Fluid*) dat1; - - sum = 0.0; - m_NC[i] = 0; - - Grid_FindCells ( p->pos, radius ); - for (int cell=0; cell < 8; cell++) { - if ( m_GridCell[cell] != -1 ) { - pndx = m_Grid [ m_GridCell[cell] ]; - while ( pndx != -1 ) { - pcurr = (Fluid*) (mBuf[0].data + pndx*mBuf[0].stride); - if ( pcurr == p ) {pndx = pcurr->next; continue; } - dx = ( p->pos.x - pcurr->pos.x)*d; // dist in cm - dy = ( p->pos.y - pcurr->pos.y)*d; - dz = ( p->pos.z - pcurr->pos.z)*d; - dsq = (dx*dx + dy*dy + dz*dz); - if ( mR2 > dsq ) { - c = m_R2 - dsq; - sum += c * c * c; - if ( m_NC[i] < MAX_NEIGHBOR ) { - m_Neighbor[i][ m_NC[i] ] = pndx; - m_NDist[i][ m_NC[i] ] = sqrt(dsq); - m_NC[i]++; - } - } - pndx = pcurr->next; - } - } - m_GridCell[cell] = -1; - } - p->density = sum * m_Param[SPH_PMASS] * m_Poly6Kern ; - p->pressure = ( p->density - m_Param[SPH_RESTDENSITY] ) * m_Param[SPH_INTSTIFF]; - p->density = 1.0f / p->density; - } -} - -// Compute Forces - Very slow, but simple. O(n^2) -void FluidSystem::SPH_ComputeForceSlow () -{ - char *dat1, *dat1_end; - char *dat2, *dat2_end; - Fluid *p, *q; - Vector3DF force, fcurr; - register double pterm, vterm, dterm; - double c, r, d, sum, dsq; - double dx, dy, dz; - double mR, mR2, visc; - - d = m_Param[SPH_SIMSCALE]; - mR = m_Param[SPH_SMOOTHRADIUS]; - mR2 = (mR*mR); - visc = m_Param[SPH_VISC]; - vterm = m_LapKern * visc; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { - p = (Fluid*) dat1; - - sum = 0.0; - force.Set ( 0, 0, 0 ); - - dat2_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat2 = mBuf[0].data; dat2 < dat2_end; dat2 += mBuf[0].stride ) { - q = (Fluid*) dat2; - - if ( p == q ) continue; - dx = ( p->pos.x - q->pos.x )*d; // dist in cm - dy = ( p->pos.y - q->pos.y )*d; - dz = ( p->pos.z - q->pos.z )*d; - dsq = (dx*dx + dy*dy + dz*dz); - if ( mR2 > dsq ) { - r = sqrt ( dsq ); - c = (mR - r); - pterm = -0.5f * c * m_SpikyKern * ( p->pressure + q->pressure) / r; - dterm = c * p->density * q->density; - force.x += ( pterm * dx + vterm * (q->vel_eval.x - p->vel_eval.x) ) * dterm; - force.y += ( pterm * dy + vterm * (q->vel_eval.y - p->vel_eval.y) ) * dterm; - force.z += ( pterm * dz + vterm * (q->vel_eval.z - p->vel_eval.z) ) * dterm; - } - } - p->sph_force = force; - } -} - -// Compute Forces - Using spatial grid. Faster. -void FluidSystem::SPH_ComputeForceGrid () -{ - char *dat1, *dat1_end; - Fluid *p; - Fluid *pcurr; - int pndx; - Vector3DF force, fcurr; - register double pterm, vterm, dterm; - double c, d, dsq, r; - double dx, dy, dz; - double mR, mR2, visc; - float radius = m_Param[SPH_SMOOTHRADIUS] / m_Param[SPH_SIMSCALE]; - - d = m_Param[SPH_SIMSCALE]; - mR = m_Param[SPH_SMOOTHRADIUS]; - mR2 = (mR*mR); - visc = m_Param[SPH_VISC]; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { - p = (Fluid*) dat1; - - force.Set ( 0, 0, 0 ); - - Grid_FindCells ( p->pos, radius ); - for (int cell=0; cell < 8; cell++) { - if ( m_GridCell[cell] != -1 ) { - pndx = m_Grid [ m_GridCell[cell] ]; - while ( pndx != -1 ) { - pcurr = (Fluid*) (mBuf[0].data + pndx*mBuf[0].stride); - if ( pcurr == p ) {pndx = pcurr->next; continue; } - - dx = ( p->pos.x - pcurr->pos.x)*d; // dist in cm - dy = ( p->pos.y - pcurr->pos.y)*d; - dz = ( p->pos.z - pcurr->pos.z)*d; - dsq = (dx*dx + dy*dy + dz*dz); - if ( mR2 > dsq ) { - r = sqrt ( dsq ); - c = (mR - r); - pterm = -0.5f * c * m_SpikyKern * ( p->pressure + pcurr->pressure) / r; - dterm = c * p->density * pcurr->density; - vterm = m_LapKern * visc; - force.x += ( pterm * dx + vterm * (pcurr->vel_eval.x - p->vel_eval.x) ) * dterm; - force.y += ( pterm * dy + vterm * (pcurr->vel_eval.y - p->vel_eval.y) ) * dterm; - force.z += ( pterm * dz + vterm * (pcurr->vel_eval.z - p->vel_eval.z) ) * dterm; - } - pndx = pcurr->next; - } - } - } - p->sph_force = force; - } -} - -// Compute Forces - Using spatial grid with saved neighbor table. Fastest. -void FluidSystem::SPH_ComputeForceGridNC () -{ - char *dat1, *dat1_end; - Fluid *p; - Fluid *pcurr; - Vector3DF force, fcurr; - register float pterm, vterm, dterm; - int i; - float c, d; - float dx, dy, dz; - float mR, mR2, visc; - - d = m_Param[SPH_SIMSCALE]; - mR = m_Param[SPH_SMOOTHRADIUS]; - mR2 = (mR*mR); - visc = m_Param[SPH_VISC]; - - dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; - i = 0; - - for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride, i++ ) { - p = (Fluid*) dat1; - - force.Set ( 0, 0, 0 ); - for (int j=0; j < m_NC[i]; j++ ) { - pcurr = (Fluid*) (mBuf[0].data + m_Neighbor[i][j]*mBuf[0].stride); - dx = ( p->pos.x - pcurr->pos.x)*d; // dist in cm - dy = ( p->pos.y - pcurr->pos.y)*d; - dz = ( p->pos.z - pcurr->pos.z)*d; - c = ( mR - m_NDist[i][j] ); - pterm = -0.5f * c * m_SpikyKern * ( p->pressure + pcurr->pressure) / m_NDist[i][j]; - dterm = c * p->density * pcurr->density; - vterm = m_LapKern * visc; - force.x += ( pterm * dx + vterm * (pcurr->vel_eval.x - p->vel_eval.x) ) * dterm; - force.y += ( pterm * dy + vterm * (pcurr->vel_eval.y - p->vel_eval.y) ) * dterm; - force.z += ( pterm * dz + vterm * (pcurr->vel_eval.z - p->vel_eval.z) ) * dterm; - } - p->sph_force = force; - } -} - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 + +#ifdef _MSC_VER + #include +#else + #include +#endif + +#include "common_defs.h" +#include "mtime.h" +#include "fluid_system.h" + +#ifdef BUILD_CUDA + #include "fluid_system_host.cuh" +#endif + +#define EPSILON 0.00001f //for collision detection + +FluidSystem::FluidSystem () +{ +} + +void FluidSystem::Initialize ( int mode, int total ) +{ + if ( mode != BFLUID ) { + printf ( "ERROR: FluidSystem not initialized as BFLUID.\n"); + } + PointSet::Initialize ( mode, total ); + + FreeBuffers (); + AddBuffer ( BFLUID, sizeof ( Fluid ), total ); + AddAttribute ( 0, "pos", sizeof ( Vector3DF ), false ); + AddAttribute ( 0, "color", sizeof ( DWORD ), false ); + AddAttribute ( 0, "vel", sizeof ( Vector3DF ), false ); + AddAttribute ( 0, "ndx", sizeof ( unsigned short ), false ); + AddAttribute ( 0, "age", sizeof ( unsigned short ), false ); + + AddAttribute ( 0, "pressure", sizeof ( double ), false ); + AddAttribute ( 0, "density", sizeof ( double ), false ); + AddAttribute ( 0, "sph_force", sizeof ( Vector3DF ), false ); + AddAttribute ( 0, "next", sizeof ( Fluid* ), false ); + AddAttribute ( 0, "tag", sizeof ( bool ), false ); + + SPH_Setup (); + Reset ( total ); +} + +void FluidSystem::Reset ( int nmax ) +{ + ResetBuffer ( 0, nmax ); + + m_DT = 0.003; // 0.001; // .001 = for point grav + + // Reset parameters + m_Param [ MAX_FRAC ] = 1.0; + m_Param [ POINT_GRAV ] = 0.0; + m_Param [ PLANE_GRAV ] = 1.0; + + m_Param [ BOUND_ZMIN_SLOPE ] = 0.0; + m_Param [ FORCE_XMAX_SIN ] = 0.0; + m_Param [ FORCE_XMIN_SIN ] = 0.0; + m_Toggle [ WRAP_X ] = false; + m_Toggle [ WALL_BARRIER ] = false; + m_Toggle [ LEVY_BARRIER ] = false; + m_Toggle [ DRAIN_BARRIER ] = false; + m_Param [ SPH_INTSTIFF ] = 1.00; + m_Param [ SPH_VISC ] = 0.2; + m_Param [ SPH_INTSTIFF ] = 0.50; + m_Param [ SPH_EXTSTIFF ] = 20000; + m_Param [ SPH_SMOOTHRADIUS ] = 0.01; + + m_Vec [ POINT_GRAV_POS ].Set ( 0, 0, 50 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0, 0, -9.8 ); + m_Vec [ EMIT_POS ].Set ( 0, 0, 0 ); + m_Vec [ EMIT_RATE ].Set ( 0, 0, 0 ); + m_Vec [ EMIT_ANG ].Set ( 0, 90, 1.0 ); + m_Vec [ EMIT_DANG ].Set ( 0, 0, 0 ); +} + +int FluidSystem::AddPoint () +{ + xref ndx; + Fluid* f = (Fluid*) AddElem ( 0, ndx ); + f->sph_force.Set(0,0,0); + f->vel.Set(0,0,0); + f->vel_eval.Set(0,0,0); + f->next = 0x0; + f->pressure = 0; + f->density = 0; + return ndx; +} + +int FluidSystem::AddPointReuse () +{ + xref ndx; + Fluid* f; + if ( NumPoints() <= mBuf[0].max-2 ) + f = (Fluid*) AddElem ( 0, ndx ); + else + f = (Fluid*) RandomElem ( 0, ndx ); + + f->sph_force.Set(0,0,0); + f->vel.Set(0,0,0); + f->vel_eval.Set(0,0,0); + f->next = 0x0; + f->pressure = 0; + f->density = 0; + return ndx; +} + +void FluidSystem::Run () +{ + bool bTiming = false;//true; + + mint::Time start, stop; + + float ss = m_Param [ SPH_PDIST ] / m_Param[ SPH_SIMSCALE ]; // simulation scale (not Schutzstaffel) + + if ( m_Vec[EMIT_RATE].x > 0 && (++m_Frame) % (int) m_Vec[EMIT_RATE].x == 0 ) { + //m_Frame = 0; + Emit ( ss ); + } + + #ifdef NOGRID + // Slow method - O(n^2) + SPH_ComputePressureSlow (); + SPH_ComputeForceSlow (); + #else + + if ( m_Toggle[USE_CUDA] ) { + + #ifdef BUILD_CUDA + // -- GPU -- + start.SetSystemTime ( ACC_NSEC ); + TransferToCUDA ( mBuf[0].data, (int*) &m_Grid[0], NumPoints() ); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "TO: %s\n", stop.GetReadableTime().c_str() ); } + + start.SetSystemTime ( ACC_NSEC ); + Grid_InsertParticlesCUDA (); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "INSERT (CUDA): %s\n", stop.GetReadableTime().c_str() ); } + + start.SetSystemTime ( ACC_NSEC ); + SPH_ComputePressureCUDA (); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "PRESS (CUDA): %s\n", stop.GetReadableTime().c_str() ); } + + start.SetSystemTime ( ACC_NSEC ); + SPH_ComputeForceCUDA (); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "FORCE (CUDA): %s\n", stop.GetReadableTime().c_str() ); } + + //** CUDA integrator is incomplete.. + // Once integrator is done, we can remove TransferTo/From steps + /*start.SetSystemTime ( ACC_NSEC ); + SPH_AdvanceCUDA( m_DT, m_DT/m_Param[SPH_SIMSCALE] ); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "ADV (CUDA): %s\n", stop.GetReadableTime().c_str() ); }*/ + + start.SetSystemTime ( ACC_NSEC ); + TransferFromCUDA ( mBuf[0].data, (int*) &m_Grid[0], NumPoints() ); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "FROM: %s\n", stop.GetReadableTime().c_str() ); } + + // .. Do advance on CPU + Advance(); + + #endif + + } else { + // -- CPU only -- + + start.SetSystemTime ( ACC_NSEC ); + Grid_InsertParticles (); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "INSERT: %s\n", stop.GetReadableTime().c_str() ); } + + start.SetSystemTime ( ACC_NSEC ); + SPH_ComputePressureGrid (); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "PRESS: %s\n", stop.GetReadableTime().c_str() ); } + + start.SetSystemTime ( ACC_NSEC ); + SPH_ComputeForceGridNC (); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "FORCE: %s\n", stop.GetReadableTime().c_str() ); } + + start.SetSystemTime ( ACC_NSEC ); + Advance(); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "ADV: %s\n", stop.GetReadableTime().c_str() ); } + } + + #endif +} + + + +void FluidSystem::SPH_DrawDomain () +{ + Vector3DF min, max; + min = m_Vec[SPH_VOLMIN]; + max = m_Vec[SPH_VOLMAX]; + min.z += 0.5; + + glColor3f ( 0.0, 0.0, 1.0 ); + glBegin ( GL_LINES ); + glVertex3f ( min.x, min.y, min.z ); glVertex3f ( max.x, min.y, min.z ); + glVertex3f ( min.x, max.y, min.z ); glVertex3f ( max.x, max.y, min.z ); + glVertex3f ( min.x, min.y, min.z ); glVertex3f ( min.x, max.y, min.z ); + glVertex3f ( max.x, min.y, min.z ); glVertex3f ( max.x, max.y, min.z ); + glEnd (); +} + +void FluidSystem::Advance () +{ + char *dat1, *dat1_end; + Fluid* p; + Vector3DF norm, z; + Vector3DF dir, accel; + Vector3DF vnext; + Vector3DF min, max; + double adj; + float SL, SL2, ss, radius; + float stiff, damp, speed, diff; + SL = m_Param[SPH_LIMIT]; + SL2 = SL*SL; + + stiff = m_Param[SPH_EXTSTIFF]; + damp = m_Param[SPH_EXTDAMP]; + radius = m_Param[SPH_PRADIUS]; + min = m_Vec[SPH_VOLMIN]; + max = m_Vec[SPH_VOLMAX]; + ss = m_Param[SPH_SIMSCALE]; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { + p = (Fluid*) dat1; + + // Compute Acceleration + accel = p->sph_force; + accel *= m_Param[SPH_PMASS]; + + // Velocity limiting + speed = accel.x*accel.x + accel.y*accel.y + accel.z*accel.z; + if ( speed > SL2 ) { + accel *= SL / sqrt(speed); + } + + // Boundary Conditions + + // Z-axis walls + diff = 2 * radius - ( p->pos.z - min.z - (p->pos.x - m_Vec[SPH_VOLMIN].x) * m_Param[BOUND_ZMIN_SLOPE] )*ss; + if (diff > EPSILON ) { + norm.Set ( -m_Param[BOUND_ZMIN_SLOPE], 0, 1.0 - m_Param[BOUND_ZMIN_SLOPE] ); + adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + + diff = 2 * radius - ( max.z - p->pos.z )*ss; + if (diff > EPSILON) { + norm.Set ( 0, 0, -1 ); + adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + + // X-axis walls + if ( !m_Toggle[WRAP_X] ) { + diff = 2 * radius - ( p->pos.x - min.x + (sin(m_Time*10.0)-1+(p->pos.y*0.025)*0.25) * m_Param[FORCE_XMIN_SIN] )*ss; + //diff = 2 * radius - ( p->pos.x - min.x + (sin(m_Time*10.0)-1) * m_Param[FORCE_XMIN_SIN] )*ss; + if (diff > EPSILON ) { + norm.Set ( 1.0, 0, 0 ); + adj = (m_Param[ FORCE_XMIN_SIN ] + 1) * stiff * diff - damp * norm.Dot ( p->vel_eval ) ; + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + + diff = 2 * radius - ( max.x - p->pos.x + (sin(m_Time*10.0)-1) * m_Param[FORCE_XMAX_SIN] )*ss; + if (diff > EPSILON) { + norm.Set ( -1, 0, 0 ); + adj = (m_Param[ FORCE_XMAX_SIN ]+1) * stiff * diff - damp * norm.Dot ( p->vel_eval ); + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + } + + // Y-axis walls + diff = 2 * radius - ( p->pos.y - min.y )*ss; + if (diff > EPSILON) { + norm.Set ( 0, 1, 0 ); + adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + diff = 2 * radius - ( max.y - p->pos.y )*ss; + if (diff > EPSILON) { + norm.Set ( 0, -1, 0 ); + adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + + // Wall barrier + if ( m_Toggle[WALL_BARRIER] ) { + diff = 2 * radius - ( p->pos.x - 0 )*ss; + if (diff < 2*radius && diff > EPSILON && fabs(p->pos.y) < 3 && p->pos.z < 10) { + norm.Set ( 1.0, 0, 0 ); + adj = 2*stiff * diff - damp * norm.Dot ( p->vel_eval ) ; + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + } + + // Levy barrier + if ( m_Toggle[LEVY_BARRIER] ) { + diff = 2 * radius - ( p->pos.x - 0 )*ss; + if (diff < 2*radius && diff > EPSILON && fabs(p->pos.y) > 5 && p->pos.z < 10) { + norm.Set ( 1.0, 0, 0 ); + adj = 2*stiff * diff - damp * norm.Dot ( p->vel_eval ) ; + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + } + // Drain barrier + if ( m_Toggle[DRAIN_BARRIER] ) { + diff = 2 * radius - ( p->pos.z - min.z-15 )*ss; + if (diff < 2*radius && diff > EPSILON && (fabs(p->pos.x)>3 || fabs(p->pos.y)>3) ) { + norm.Set ( 0, 0, 1); + adj = stiff * diff - damp * norm.Dot ( p->vel_eval ); + accel.x += adj * norm.x; accel.y += adj * norm.y; accel.z += adj * norm.z; + } + } + + // Plane gravity + if ( m_Param[PLANE_GRAV] > 0) + accel += m_Vec[PLANE_GRAV_DIR]; + + // Point gravity + if ( m_Param[POINT_GRAV] > 0 ) { + norm.x = ( p->pos.x - m_Vec[POINT_GRAV_POS].x ); + norm.y = ( p->pos.y - m_Vec[POINT_GRAV_POS].y ); + norm.z = ( p->pos.z - m_Vec[POINT_GRAV_POS].z ); + norm.Normalize (); + norm *= m_Param[POINT_GRAV]; + accel -= norm; + } + + // Leapfrog Integration ---------------------------- + vnext = accel; + vnext *= m_DT; + vnext += p->vel; // v(t+1/2) = v(t-1/2) + a(t) dt + p->vel_eval = p->vel; + p->vel_eval += vnext; + p->vel_eval *= 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later + p->vel = vnext; + vnext *= m_DT/ss; + p->pos += vnext; // p(t+1) = p(t) + v(t+1/2) dt + + if ( m_Param[CLR_MODE]==1.0 ) { + adj = fabs(vnext.x)+fabs(vnext.y)+fabs(vnext.z) / 7000.0; + adj = (adj > 1.0) ? 1.0 : adj; + p->clr = COLORA( 0, adj, adj, 1 ); + } + if ( m_Param[CLR_MODE]==2.0 ) { + float v = 0.5 + ( p->pressure / 1500.0); + if ( v < 0.1 ) v = 0.1; + if ( v > 1.0 ) v = 1.0; + p->clr = COLORA ( v, 1-v, 0, 1 ); + } + + + // Euler integration ------------------------------- + /* accel += m_Gravity; + accel *= m_DT; + p->vel += accel; // v(t+1) = v(t) + a(t) dt + p->vel_eval += accel; + p->vel_eval *= m_DT/d; + p->pos += p->vel_eval; + p->vel_eval = p->vel; */ + + + if ( m_Toggle[WRAP_X] ) { + diff = p->pos.x - (m_Vec[SPH_VOLMIN].x + 2); // -- Simulates object in center of flow + if ( diff <= 0 ) { + p->pos.x = (m_Vec[SPH_VOLMAX].x - 2) + diff*2; + p->pos.z = 10; + } + } + } + + m_Time += m_DT; +} + +//------------------------------------------------------ SPH Setup +// +// Range = +/- 10.0 * 0.006 (r) = 0.12 m (= 120 mm = 4.7 inch) +// Container Volume (Vc) = 0.001728 m^3 +// Rest Density (D) = 1000.0 kg / m^3 +// Particle Mass (Pm) = 0.00020543 kg (mass = vol * density) +// Number of Particles (N) = 4000.0 +// Water Mass (M) = 0.821 kg (= 821 grams) +// Water Volume (V) = 0.000821 m^3 (= 3.4 cups, .21 gals) +// Smoothing Radius (R) = 0.02 m (= 20 mm = ~3/4 inch) +// Particle Radius (Pr) = 0.00366 m (= 4 mm = ~1/8 inch) +// Particle Volume (Pv) = 2.054e-7 m^3 (= .268 milliliters) +// Rest Distance (Pd) = 0.0059 m +// +// Given: D, Pm, N +// Pv = Pm / D 0.00020543 kg / 1000 kg/m^3 = 2.054e-7 m^3 +// Pv = 4/3*pi*Pr^3 cuberoot( 2.054e-7 m^3 * 3/(4pi) ) = 0.00366 m +// M = Pm * N 0.00020543 kg * 4000.0 = 0.821 kg +// V = M / D 0.821 kg / 1000 kg/m^3 = 0.000821 m^3 +// V = Pv * N 2.054e-7 m^3 * 4000 = 0.000821 m^3 +// Pd = cuberoot(Pm/D) cuberoot(0.00020543/1000) = 0.0059 m +// +// Ideal grid cell size (gs) = 2 * smoothing radius = 0.02*2 = 0.04 +// Ideal domain size = k*gs/d = k*0.02*2/0.005 = k*8 = {8, 16, 24, 32, 40, 48, ..} +// (k = number of cells, gs = cell size, d = simulation scale) + +void FluidSystem::SPH_Setup () +{ + m_Param [ SPH_SIMSCALE ] = 0.004; // unit size + m_Param [ SPH_VISC ] = 0.2; // pascal-second (Pa.s) = 1 kg m^-1 s^-1 (see wikipedia page on viscosity) + m_Param [ SPH_RESTDENSITY ] = 600.0; // kg / m^3 + m_Param [ SPH_PMASS ] = 0.00020543; // kg + m_Param [ SPH_PRADIUS ] = 0.004; // m + m_Param [ SPH_PDIST ] = 0.0059; // m + m_Param [ SPH_SMOOTHRADIUS ] = 0.01; // m + m_Param [ SPH_INTSTIFF ] = 1.00; + m_Param [ SPH_EXTSTIFF ] = 10000.0; + m_Param [ SPH_EXTDAMP ] = 256.0; + m_Param [ SPH_LIMIT ] = 200.0; // m / s + + m_Toggle [ SPH_GRID ] = false; + m_Toggle [ SPH_DEBUG ] = false; + + SPH_ComputeKernels (); +} + +void FluidSystem::SPH_ComputeKernels () +{ + m_Param [ SPH_PDIST ] = pow ( m_Param[SPH_PMASS] / m_Param[SPH_RESTDENSITY], 1/3.0 ); + m_R2 = m_Param [SPH_SMOOTHRADIUS] * m_Param[SPH_SMOOTHRADIUS]; + m_Poly6Kern = 315.0f / (64.0f * 3.141592 * pow( m_Param[SPH_SMOOTHRADIUS], 9) ); // Wpoly6 kernel (denominator part) - 2003 Muller, p.4 + m_SpikyKern = -45.0f / (3.141592 * pow( m_Param[SPH_SMOOTHRADIUS], 6) ); // Laplacian of viscocity (denominator): PI h^6 + m_LapKern = 45.0f / (3.141592 * pow( m_Param[SPH_SMOOTHRADIUS], 6) ); +} + +void FluidSystem::SPH_CreateExample ( int n, int nmax ) +{ + Vector3DF pos; + Vector3DF min, max; + + Reset ( nmax ); + + switch ( n ) { + case 0: // Wave pool + + //-- TEST CASE: 2x2x2 grid, 32 particles. NOTE: Set PRADIUS to 0.0004 to reduce wall influence + // grid 0: 3*3*2 = 18 particles + // grid 1,2: 3*1*2 = 6 particles + // grid 3: 1*1*2 = 2 particles + // grid 4,5,6: 0 = 0 particles + /*m_Vec [ SPH_VOLMIN ].Set ( -2.5, -2.5, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 2.5, 2.5, 5.0 ); + m_Vec [ SPH_INITMIN ].Set ( -2.5, -2.5, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 2.5, 2.5, 1.6 );*/ + + m_Vec [ SPH_VOLMIN ].Set ( -30, -30, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 30, 30, 40 ); + + //m_Vec [ SPH_INITMIN ].Set ( -5, -5, 10 ); + //m_Vec [ SPH_INITMAX ].Set ( 5, 5, 20 ); + + m_Vec [ SPH_INITMIN ].Set ( -20, -26, 10 ); + m_Vec [ SPH_INITMAX ].Set ( 20, 26, 40 ); + + m_Param [ FORCE_XMIN_SIN ] = 12.0; + m_Param [ BOUND_ZMIN_SLOPE ] = 0.05; + break; + case 1: // Dam break + m_Vec [ SPH_VOLMIN ].Set ( -30, -14, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 30, 14, 60 ); + m_Vec [ SPH_INITMIN ].Set ( 0, -13, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 29, 13, 30 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + case 2: // Dual-Wave pool + m_Vec [ SPH_VOLMIN ].Set ( -60, -5, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 60, 5, 50 ); + m_Vec [ SPH_INITMIN ].Set ( -46, -5, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 46, 5, 15 ); + m_Param [ FORCE_XMIN_SIN ] = 8.0; + m_Param [ FORCE_XMAX_SIN ] = 8.0; + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + case 3: // Swirl Stream + m_Vec [ SPH_VOLMIN ].Set ( -30, -30, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 30, 30, 50 ); + m_Vec [ SPH_INITMIN ].Set ( -30, -30, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 30, 30, 40 ); + m_Vec [ EMIT_POS ].Set ( -20, -20, 22 ); + m_Vec [ EMIT_RATE ].Set ( 1, 4, 0 ); + m_Vec [ EMIT_ANG ].Set ( 0, 120, 1.5 ); + m_Vec [ EMIT_DANG ].Set ( 0, 0, 0 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + case 4: // Shockwave + m_Vec [ SPH_VOLMIN ].Set ( -60, -15, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 60, 15, 50 ); + m_Vec [ SPH_INITMIN ].Set ( -59, -14, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 59, 14, 30 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + m_Toggle [ WALL_BARRIER ] = true; + m_Toggle [ WRAP_X ] = true; + break; + case 5: // Zero gravity + m_Vec [ SPH_VOLMIN ].Set ( -40, -40, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 40, 40, 50 ); + m_Vec [ SPH_INITMIN ].Set ( -20, -20, 20 ); + m_Vec [ SPH_INITMAX ].Set ( 20, 20, 40 ); + m_Vec [ EMIT_POS ].Set ( -20, 0, 40 ); + m_Vec [ EMIT_RATE ].Set ( 2, 1, 0 ); + m_Vec [ EMIT_ANG ].Set ( 0, 120, 0.25 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0, 0, 0 ); + m_Param [ SPH_INTSTIFF ] = 0.20; + break; + case 6: // Point gravity + m_Vec [ SPH_VOLMIN ].Set ( -40, -40, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 40, 40, 50 ); + m_Vec [ SPH_INITMIN ].Set ( -20, -20, 20 ); + m_Vec [ SPH_INITMAX ].Set ( 20, 20, 40 ); + m_Param [ SPH_INTSTIFF ] = 0.50; + m_Vec [ EMIT_POS ].Set ( -20, 20, 25 ); + m_Vec [ EMIT_RATE ].Set ( 1, 4, 0 ); + m_Vec [ EMIT_ANG ].Set ( -20, 100, 2.0 ); + m_Vec [ POINT_GRAV_POS ].Set ( 0, 0, 25 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0, 0, 0 ); + m_Param [ POINT_GRAV ] = 3.5; + break; + case 7: // Levy break + m_Vec [ SPH_VOLMIN ].Set ( -40, -40, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 40, 40, 50 ); + m_Vec [ SPH_INITMIN ].Set ( 10, -40, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 40, 40, 50 ); + m_Vec [ EMIT_POS ].Set ( 34, 27, 16.6 ); + m_Vec [ EMIT_RATE ].Set ( 2, 9, 0 ); + m_Vec [ EMIT_ANG ].Set ( 118, 200, 1.0 ); + m_Toggle [ LEVY_BARRIER ] = true; + m_Param [ BOUND_ZMIN_SLOPE ] = 0.1; + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + case 8: // Drain + m_Vec [ SPH_VOLMIN ].Set ( -20, -20, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 20, 20, 50 ); + m_Vec [ SPH_INITMIN ].Set ( -15, -20, 20 ); + m_Vec [ SPH_INITMAX ].Set ( 20, 20, 50 ); + m_Vec [ EMIT_POS ].Set ( -16, -16, 30 ); + m_Vec [ EMIT_RATE ].Set ( 1, 4, 0 ); + m_Vec [ EMIT_ANG ].Set ( -20, 140, 1.8 ); + m_Toggle [ DRAIN_BARRIER ] = true; + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + case 9: // Tumbler + m_Vec [ SPH_VOLMIN ].Set ( -30, -30, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 30, 30, 50 ); + m_Vec [ SPH_INITMIN ].Set ( 24, -29, 20 ); + m_Vec [ SPH_INITMAX ].Set ( 29, 29, 40 ); + m_Param [ SPH_VISC ] = 0.1; + m_Param [ SPH_INTSTIFF ] = 0.50; + m_Param [ SPH_EXTSTIFF ] = 8000; + //m_Param [ SPH_SMOOTHRADIUS ] = 0.01; + m_Param [ BOUND_ZMIN_SLOPE ] = 0.4; + m_Param [ FORCE_XMIN_SIN ] = 12.00; + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + case 10: // Large sim + m_Vec [ SPH_VOLMIN ].Set ( -35, -35, 0 ); + m_Vec [ SPH_VOLMAX ].Set ( 35, 35, 60 ); + m_Vec [ SPH_INITMIN ].Set ( -5, -35, 0 ); + m_Vec [ SPH_INITMAX ].Set ( 30, 0, 60 ); + m_Vec [ PLANE_GRAV_DIR ].Set ( 0.0, 0, -9.8 ); + break; + } + + SPH_ComputeKernels (); + + m_Param [ SPH_SIMSIZE ] = m_Param [ SPH_SIMSCALE ] * (m_Vec[SPH_VOLMAX].z - m_Vec[SPH_VOLMIN].z); + m_Param [ SPH_PDIST ] = pow ( m_Param[SPH_PMASS] / m_Param[SPH_RESTDENSITY], 1/3.0 ); + + float ss = m_Param [ SPH_PDIST ]*0.87 / m_Param[ SPH_SIMSCALE ]; + printf ( "Spacing: %f\n", ss); + AddVolume ( m_Vec[SPH_INITMIN], m_Vec[SPH_INITMAX], ss ); // Create the particles + + float cell_size = m_Param[SPH_SMOOTHRADIUS]*2.0; // Grid cell size (2r) + Grid_Setup ( m_Vec[SPH_VOLMIN], m_Vec[SPH_VOLMAX], m_Param[SPH_SIMSCALE], cell_size, 1.0 ); // Setup grid + Grid_InsertParticles (); // Insert particles + + Vector3DF vmin, vmax; + vmin = m_Vec[SPH_VOLMIN]; + vmin -= Vector3DF(2,2,2); + vmax = m_Vec[SPH_VOLMAX]; + vmax += Vector3DF(2,2,-2); + + #ifdef BUILD_CUDA + FluidClearCUDA (); + Sleep ( 500 ); + + FluidSetupCUDA ( NumPoints(), sizeof(Fluid), *(float3*)& m_GridMin, *(float3*)& m_GridMax, *(float3*)& m_GridRes, *(float3*)& m_GridSize, (int) m_Vec[EMIT_RATE].x ); + + Sleep ( 500 ); + + FluidParamCUDA ( m_Param[SPH_SIMSCALE], m_Param[SPH_SMOOTHRADIUS], m_Param[SPH_PMASS], m_Param[SPH_RESTDENSITY], m_Param[SPH_INTSTIFF], m_Param[SPH_VISC] ); + #endif + +} + +// Compute Pressures - Very slow yet simple. O(n^2) +void FluidSystem::SPH_ComputePressureSlow () +{ + char *dat1, *dat1_end; + char *dat2, *dat2_end; + Fluid *p, *q; + int cnt = 0; + double dx, dy, dz, sum, dsq, c; + double d, d2, mR, mR2; + d = m_Param[SPH_SIMSCALE]; + d2 = d*d; + mR = m_Param[SPH_SMOOTHRADIUS]; + mR2 = mR*mR; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { + p = (Fluid*) dat1; + + sum = 0.0; + cnt = 0; + + dat2_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat2 = mBuf[0].data; dat2 < dat2_end; dat2 += mBuf[0].stride ) { + q = (Fluid*) dat2; + + if ( p==q ) continue; + dx = ( p->pos.x - q->pos.x)*d; // dist in cm + dy = ( p->pos.y - q->pos.y)*d; + dz = ( p->pos.z - q->pos.z)*d; + dsq = (dx*dx + dy*dy + dz*dz); + if ( mR2 > dsq ) { + c = m_R2 - dsq; + sum += c * c * c; + cnt++; + //if ( p == m_CurrP ) q->tag = true; + } + } + p->density = sum * m_Param[SPH_PMASS] * m_Poly6Kern ; + p->pressure = ( p->density - m_Param[SPH_RESTDENSITY] ) * m_Param[SPH_INTSTIFF]; + p->density = 1.0f / p->density; + } +} + +// Compute Pressures - Using spatial grid, and also create neighbor table +void FluidSystem::SPH_ComputePressureGrid () +{ + char *dat1, *dat1_end; + Fluid* p; + Fluid* pcurr; + int pndx; + int i, cnt = 0; + float dx, dy, dz, sum, dsq, c; + float d, d2, mR, mR2; + float radius = m_Param[SPH_SMOOTHRADIUS] / m_Param[SPH_SIMSCALE]; + d = m_Param[SPH_SIMSCALE]; + d2 = d*d; + mR = m_Param[SPH_SMOOTHRADIUS]; + mR2 = mR*mR; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + i = 0; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride, i++ ) { + p = (Fluid*) dat1; + + sum = 0.0; + m_NC[i] = 0; + + Grid_FindCells ( p->pos, radius ); + for (int cell=0; cell < 8; cell++) { + if ( m_GridCell[cell] != -1 ) { + pndx = m_Grid [ m_GridCell[cell] ]; + while ( pndx != -1 ) { + pcurr = (Fluid*) (mBuf[0].data + pndx*mBuf[0].stride); + if ( pcurr == p ) {pndx = pcurr->next; continue; } + dx = ( p->pos.x - pcurr->pos.x)*d; // dist in cm + dy = ( p->pos.y - pcurr->pos.y)*d; + dz = ( p->pos.z - pcurr->pos.z)*d; + dsq = (dx*dx + dy*dy + dz*dz); + if ( mR2 > dsq ) { + c = m_R2 - dsq; + sum += c * c * c; + if ( m_NC[i] < MAX_NEIGHBOR ) { + m_Neighbor[i][ m_NC[i] ] = pndx; + m_NDist[i][ m_NC[i] ] = sqrt(dsq); + m_NC[i]++; + } + } + pndx = pcurr->next; + } + } + m_GridCell[cell] = -1; + } + p->density = sum * m_Param[SPH_PMASS] * m_Poly6Kern ; + p->pressure = ( p->density - m_Param[SPH_RESTDENSITY] ) * m_Param[SPH_INTSTIFF]; + p->density = 1.0f / p->density; + } +} + +// Compute Forces - Very slow, but simple. O(n^2) +void FluidSystem::SPH_ComputeForceSlow () +{ + char *dat1, *dat1_end; + char *dat2, *dat2_end; + Fluid *p, *q; + Vector3DF force, fcurr; + register double pterm, vterm, dterm; + double c, r, d, sum, dsq; + double dx, dy, dz; + double mR, mR2, visc; + + d = m_Param[SPH_SIMSCALE]; + mR = m_Param[SPH_SMOOTHRADIUS]; + mR2 = (mR*mR); + visc = m_Param[SPH_VISC]; + vterm = m_LapKern * visc; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { + p = (Fluid*) dat1; + + sum = 0.0; + force.Set ( 0, 0, 0 ); + + dat2_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat2 = mBuf[0].data; dat2 < dat2_end; dat2 += mBuf[0].stride ) { + q = (Fluid*) dat2; + + if ( p == q ) continue; + dx = ( p->pos.x - q->pos.x )*d; // dist in cm + dy = ( p->pos.y - q->pos.y )*d; + dz = ( p->pos.z - q->pos.z )*d; + dsq = (dx*dx + dy*dy + dz*dz); + if ( mR2 > dsq ) { + r = sqrt ( dsq ); + c = (mR - r); + pterm = -0.5f * c * m_SpikyKern * ( p->pressure + q->pressure) / r; + dterm = c * p->density * q->density; + force.x += ( pterm * dx + vterm * (q->vel_eval.x - p->vel_eval.x) ) * dterm; + force.y += ( pterm * dy + vterm * (q->vel_eval.y - p->vel_eval.y) ) * dterm; + force.z += ( pterm * dz + vterm * (q->vel_eval.z - p->vel_eval.z) ) * dterm; + } + } + p->sph_force = force; + } +} + +// Compute Forces - Using spatial grid. Faster. +void FluidSystem::SPH_ComputeForceGrid () +{ + char *dat1, *dat1_end; + Fluid *p; + Fluid *pcurr; + int pndx; + Vector3DF force, fcurr; + register double pterm, vterm, dterm; + double c, d, dsq, r; + double dx, dy, dz; + double mR, mR2, visc; + float radius = m_Param[SPH_SMOOTHRADIUS] / m_Param[SPH_SIMSCALE]; + + d = m_Param[SPH_SIMSCALE]; + mR = m_Param[SPH_SMOOTHRADIUS]; + mR2 = (mR*mR); + visc = m_Param[SPH_VISC]; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride ) { + p = (Fluid*) dat1; + + force.Set ( 0, 0, 0 ); + + Grid_FindCells ( p->pos, radius ); + for (int cell=0; cell < 8; cell++) { + if ( m_GridCell[cell] != -1 ) { + pndx = m_Grid [ m_GridCell[cell] ]; + while ( pndx != -1 ) { + pcurr = (Fluid*) (mBuf[0].data + pndx*mBuf[0].stride); + if ( pcurr == p ) {pndx = pcurr->next; continue; } + + dx = ( p->pos.x - pcurr->pos.x)*d; // dist in cm + dy = ( p->pos.y - pcurr->pos.y)*d; + dz = ( p->pos.z - pcurr->pos.z)*d; + dsq = (dx*dx + dy*dy + dz*dz); + if ( mR2 > dsq ) { + r = sqrt ( dsq ); + c = (mR - r); + pterm = -0.5f * c * m_SpikyKern * ( p->pressure + pcurr->pressure) / r; + dterm = c * p->density * pcurr->density; + vterm = m_LapKern * visc; + force.x += ( pterm * dx + vterm * (pcurr->vel_eval.x - p->vel_eval.x) ) * dterm; + force.y += ( pterm * dy + vterm * (pcurr->vel_eval.y - p->vel_eval.y) ) * dterm; + force.z += ( pterm * dz + vterm * (pcurr->vel_eval.z - p->vel_eval.z) ) * dterm; + } + pndx = pcurr->next; + } + } + } + p->sph_force = force; + } +} + +// Compute Forces - Using spatial grid with saved neighbor table. Fastest. +void FluidSystem::SPH_ComputeForceGridNC () +{ + char *dat1, *dat1_end; + Fluid *p; + Fluid *pcurr; + Vector3DF force, fcurr; + register float pterm, vterm, dterm; + int i; + float c, d; + float dx, dy, dz; + float mR, mR2, visc; + + d = m_Param[SPH_SIMSCALE]; + mR = m_Param[SPH_SMOOTHRADIUS]; + mR2 = (mR*mR); + visc = m_Param[SPH_VISC]; + + dat1_end = mBuf[0].data + NumPoints()*mBuf[0].stride; + i = 0; + + for ( dat1 = mBuf[0].data; dat1 < dat1_end; dat1 += mBuf[0].stride, i++ ) { + p = (Fluid*) dat1; + + force.Set ( 0, 0, 0 ); + for (int j=0; j < m_NC[i]; j++ ) { + pcurr = (Fluid*) (mBuf[0].data + m_Neighbor[i][j]*mBuf[0].stride); + dx = ( p->pos.x - pcurr->pos.x)*d; // dist in cm + dy = ( p->pos.y - pcurr->pos.y)*d; + dz = ( p->pos.z - pcurr->pos.z)*d; + c = ( mR - m_NDist[i][j] ); + pterm = -0.5f * c * m_SpikyKern * ( p->pressure + pcurr->pressure) / m_NDist[i][j]; + dterm = c * p->density * pcurr->density; + vterm = m_LapKern * visc; + force.x += ( pterm * dx + vterm * (pcurr->vel_eval.x - p->vel_eval.x) ) * dterm; + force.y += ( pterm * dy + vterm * (pcurr->vel_eval.y - p->vel_eval.y) ) * dterm; + force.z += ( pterm * dz + vterm * (pcurr->vel_eval.z - p->vel_eval.z) ) * dterm; + } + p->sph_force = force; + } +} + diff --git a/Extras/sph/fluids/fluid_system.cu b/Extras/sph/fluids/fluid_system.cu index 1c924ab37..f67eda7f0 100644 --- a/Extras/sph/fluids/fluid_system.cu +++ b/Extras/sph/fluids/fluid_system.cu @@ -1,71 +1,71 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 -#include -#include - -#if defined(__APPLE__) || defined(MACOSX) - #include -#else - #include -#endif -#include - -#include "fluid_system_kern.cu" - -extern "C" -{ - -// Compute number of blocks to create -int iDivUp (int a, int b) { - return (a % b != 0) ? (a / b + 1) : (a / b); -} -void computeNumBlocks (int numPnts, int minThreads, int &numBlocks, int &numThreads) -{ - numThreads = min( minThreads, numPnts ); - numBlocks = iDivUp ( numPnts, numThreads ); -} - - -void Grid_InsertParticlesCUDA ( uchar* data, uint stride, uint numPoints ) -{ - int numThreads, numBlocks; - computeNumBlocks (numPoints, 256, numBlocks, numThreads); - - // transfer point data to device - char* pntData; - size = numPoints * stride; - cudaMalloc( (void**) &pntData, size); - cudaMemcpy( pntData, data, size, cudaMemcpyHostToDevice); - - // execute the kernel - insertParticles<<< numBlocks, numThreads >>> ( pntData, stride ); - - // transfer data back to host - cudaMemcpy( data, pntData, cudaMemcpyDeviceToHost); - - // check if kernel invocation generated an error - CUT_CHECK_ERROR("Kernel execution failed"); - CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboPos)); +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 +#include +#include + +#if defined(__APPLE__) || defined(MACOSX) + #include +#else + #include +#endif +#include + +#include "fluid_system_kern.cu" + +extern "C" +{ + +// Compute number of blocks to create +int iDivUp (int a, int b) { + return (a % b != 0) ? (a / b + 1) : (a / b); +} +void computeNumBlocks (int numPnts, int minThreads, int &numBlocks, int &numThreads) +{ + numThreads = min( minThreads, numPnts ); + numBlocks = iDivUp ( numPnts, numThreads ); +} + + +void Grid_InsertParticlesCUDA ( uchar* data, uint stride, uint numPoints ) +{ + int numThreads, numBlocks; + computeNumBlocks (numPoints, 256, numBlocks, numThreads); + + // transfer point data to device + char* pntData; + size = numPoints * stride; + cudaMalloc( (void**) &pntData, size); + cudaMemcpy( pntData, data, size, cudaMemcpyHostToDevice); + + // execute the kernel + insertParticles<<< numBlocks, numThreads >>> ( pntData, stride ); + + // transfer data back to host + cudaMemcpy( data, pntData, cudaMemcpyDeviceToHost); + + // check if kernel invocation generated an error + CUT_CHECK_ERROR("Kernel execution failed"); + CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboPos)); } \ No newline at end of file diff --git a/Extras/sph/fluids/fluid_system.h b/Extras/sph/fluids/fluid_system.h index 0fc31b845..ddc1de31d 100644 --- a/Extras/sph/fluids/fluid_system.h +++ b/Extras/sph/fluids/fluid_system.h @@ -1,106 +1,106 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 DEF_FLUID_SYS - #define DEF_FLUID_SYS - - #include - #include - #include - #include - #include - - #include "point_set.h" - #include "fluid.h" - - // Scalar params - #define SPH_SIMSIZE 4 - #define SPH_SIMSCALE 5 - #define SPH_VISC 6 - #define SPH_RESTDENSITY 7 - #define SPH_PMASS 8 - #define SPH_PRADIUS 9 - #define SPH_PDIST 10 - #define SPH_SMOOTHRADIUS 11 - #define SPH_INTSTIFF 12 - #define SPH_EXTSTIFF 13 - #define SPH_EXTDAMP 14 - #define SPH_LIMIT 15 - #define BOUND_ZMIN_SLOPE 16 - #define FORCE_XMAX_SIN 17 - #define FORCE_XMIN_SIN 18 - #define MAX_FRAC 19 - #define CLR_MODE 20 - - // Vector params - #define SPH_VOLMIN 7 - #define SPH_VOLMAX 8 - #define SPH_INITMIN 9 - #define SPH_INITMAX 10 - - // Toggles - #define SPH_GRID 0 - #define SPH_DEBUG 1 - #define WRAP_X 2 - #define WALL_BARRIER 3 - #define LEVY_BARRIER 4 - #define DRAIN_BARRIER 5 - #define USE_CUDA 6 - - #define MAX_PARAM 21 - #define BFLUID 2 - - class FluidSystem : public PointSet { - public: - FluidSystem (); - - // Basic Particle System - virtual void Initialize ( int mode, int nmax ); - virtual void Reset ( int nmax ); - virtual void Run (); - virtual void Advance (); - virtual int AddPoint (); - virtual int AddPointReuse (); - Fluid* AddFluid () { return (Fluid*) GetElem(0, AddPointReuse()); } - Fluid* GetFluid (int n) { return (Fluid*) GetElem(0, n); } - - // Smoothed Particle Hydrodynamics - void SPH_Setup (); - void SPH_CreateExample ( int n, int nmax ); - void SPH_DrawDomain (); - void SPH_ComputeKernels (); - - void SPH_ComputePressureSlow (); // O(n^2) - void SPH_ComputePressureGrid (); // O(kn) - spatial grid - - void SPH_ComputeForceSlow (); // O(n^2) - void SPH_ComputeForceGrid (); // O(kn) - spatial grid - void SPH_ComputeForceGridNC (); // O(cn) - neighbor table - - private: - - // Smoothed Particle Hydrodynamics - double m_R2, m_Poly6Kern, m_LapKern, m_SpikyKern; // Kernel functions - }; - -#endif +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 DEF_FLUID_SYS + #define DEF_FLUID_SYS + + #include + #include + #include + #include + #include + + #include "point_set.h" + #include "fluid.h" + + // Scalar params + #define SPH_SIMSIZE 4 + #define SPH_SIMSCALE 5 + #define SPH_VISC 6 + #define SPH_RESTDENSITY 7 + #define SPH_PMASS 8 + #define SPH_PRADIUS 9 + #define SPH_PDIST 10 + #define SPH_SMOOTHRADIUS 11 + #define SPH_INTSTIFF 12 + #define SPH_EXTSTIFF 13 + #define SPH_EXTDAMP 14 + #define SPH_LIMIT 15 + #define BOUND_ZMIN_SLOPE 16 + #define FORCE_XMAX_SIN 17 + #define FORCE_XMIN_SIN 18 + #define MAX_FRAC 19 + #define CLR_MODE 20 + + // Vector params + #define SPH_VOLMIN 7 + #define SPH_VOLMAX 8 + #define SPH_INITMIN 9 + #define SPH_INITMAX 10 + + // Toggles + #define SPH_GRID 0 + #define SPH_DEBUG 1 + #define WRAP_X 2 + #define WALL_BARRIER 3 + #define LEVY_BARRIER 4 + #define DRAIN_BARRIER 5 + #define USE_CUDA 6 + + #define MAX_PARAM 21 + #define BFLUID 2 + + class FluidSystem : public PointSet { + public: + FluidSystem (); + + // Basic Particle System + virtual void Initialize ( int mode, int nmax ); + virtual void Reset ( int nmax ); + virtual void Run (); + virtual void Advance (); + virtual int AddPoint (); + virtual int AddPointReuse (); + Fluid* AddFluid () { return (Fluid*) GetElem(0, AddPointReuse()); } + Fluid* GetFluid (int n) { return (Fluid*) GetElem(0, n); } + + // Smoothed Particle Hydrodynamics + void SPH_Setup (); + void SPH_CreateExample ( int n, int nmax ); + void SPH_DrawDomain (); + void SPH_ComputeKernels (); + + void SPH_ComputePressureSlow (); // O(n^2) + void SPH_ComputePressureGrid (); // O(kn) - spatial grid + + void SPH_ComputeForceSlow (); // O(n^2) + void SPH_ComputeForceGrid (); // O(kn) - spatial grid + void SPH_ComputeForceGridNC (); // O(cn) - neighbor table + + private: + + // Smoothed Particle Hydrodynamics + double m_R2, m_Poly6Kern, m_LapKern, m_SpikyKern; // Kernel functions + }; + +#endif diff --git a/Extras/sph/fluids/fluid_system_host.cu b/Extras/sph/fluids/fluid_system_host.cu index 71e396076..07c5747d6 100644 --- a/Extras/sph/fluids/fluid_system_host.cu +++ b/Extras/sph/fluids/fluid_system_host.cu @@ -1,250 +1,250 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 "C:\CUDA\common\inc\cutil.h" // cutil32.lib -#include -#include "../CUDA/btCudaDefines.h" - - - -#if defined(__APPLE__) || defined(MACOSX) - #include -#else - #include -#endif -#include - -#include "radixsort.cu" -#include "fluid_system_kern.cu" // build kernel - -FluidParams fcuda; - -__device__ char* bufPnts; // point data (array of Fluid structs) -__device__ char* bufPntSort; // point data (array of Fluid structs) -__device__ uint* bufHash[2]; // point grid hash -__device__ int* bufGrid; - - - -extern "C" -{ -// Initialize CUDA -void cudaInit(int argc, char **argv) -{ - //CUT_DEVICE_INIT(argc, argv); - - cudaDeviceProp p; - cudaGetDeviceProperties ( &p, 0); - - printf ( "-- CUDA --\n" ); - printf ( "Name: %s\n", p.name ); - printf ( "Revision: %d.%d\n", p.major, p.minor ); - printf ( "Global Mem: %d\n", p.totalGlobalMem ); - printf ( "Shared/Blk: %d\n", p.sharedMemPerBlock ); - printf ( "Regs/Blk: %d\n", p.regsPerBlock ); - printf ( "Warp Size: %d\n", p.warpSize ); - printf ( "Mem Pitch: %d\n", p.memPitch ); - printf ( "Thrds/Blk: %d\n", p.maxThreadsPerBlock ); - printf ( "Const Mem: %d\n", p.totalConstMem ); - printf ( "Clock Rate: %d\n", p.clockRate ); - - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPnts, 10 ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPntSort, 10 ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufHash, 10 ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufGrid, 10 ) ); -}; - -// Compute number of blocks to create -int iDivUp (int a, int b) { - return (a % b != 0) ? (a / b + 1) : (a / b); -} -void computeNumBlocks (int numPnts, int maxThreads, int &numBlocks, int &numThreads) -{ - numThreads = min( maxThreads, numPnts ); - numBlocks = iDivUp ( numPnts, numThreads ); -} - -void FluidClearCUDA () -{ - BT_GPU_SAFE_CALL ( cudaFree ( bufPnts ) ); - BT_GPU_SAFE_CALL ( cudaFree ( bufPntSort ) ); - BT_GPU_SAFE_CALL ( cudaFree ( bufHash[0] ) ); - BT_GPU_SAFE_CALL ( cudaFree ( bufHash[1] ) ); - BT_GPU_SAFE_CALL ( cudaFree ( bufGrid ) ); -} - - -void FluidSetupCUDA ( int num, int stride, float3 min, float3 max, float3 res, float3 size, int chk ) -{ - fcuda.min = make_float3(min.x, min.y, min.z); - fcuda.max = make_float3(max.x, max.y, max.z); - fcuda.res = make_float3(res.x, res.y, res.z); - fcuda.size = make_float3(size.x, size.y, size.z); - fcuda.pnts = num; - fcuda.delta.x = res.x / size.x; - fcuda.delta.y = res.y / size.y; - fcuda.delta.z = res.z / size.z; - fcuda.cells = res.x*res.y*res.z; - fcuda.chk = chk; - - computeNumBlocks ( fcuda.pnts, 256, fcuda.numBlocks, fcuda.numThreads); // particles - computeNumBlocks ( fcuda.cells, 256, fcuda.gridBlocks, fcuda.gridThreads); // grid cell - - fcuda.szPnts = (fcuda.numBlocks * fcuda.numThreads) * stride; - fcuda.szHash = (fcuda.numBlocks * fcuda.numThreads) * sizeof(uint2); // pairs - fcuda.szGrid = (fcuda.gridBlocks * fcuda.gridThreads) * sizeof(uint); - fcuda.stride = stride; - printf ( "pnts: %d, t:%dx%d=%d, bufPnts:%d, bufHash:%d\n", fcuda.pnts, fcuda.numBlocks, fcuda.numThreads, fcuda.numBlocks*fcuda.numThreads, fcuda.szPnts, fcuda.szHash ); - printf ( "grds: %d, t:%dx%d=%d, bufGrid:%d, Res: %dx%dx%d\n", fcuda.cells, fcuda.gridBlocks, fcuda.gridThreads, fcuda.gridBlocks*fcuda.gridThreads, fcuda.szGrid, (int) fcuda.res.x, (int) fcuda.res.y, (int) fcuda.res.z ); - - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPnts, fcuda.szPnts ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPntSort, fcuda.szPnts ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufHash[0], fcuda.szHash ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufHash[1], fcuda.szHash ) ); - BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufGrid, fcuda.szGrid ) ); - - printf ( "POINTERS\n"); - printf ( "bufPnts: %p\n", bufPnts ); - printf ( "bufPntSort: %p\n", bufPntSort ); - printf ( "bufHash0: %p\n", bufHash[0] ); - printf ( "bufHash1: %p\n", bufHash[1] ); - printf ( "bufGrid: %p\n", bufGrid ); - - BT_GPU_SAFE_CALL ( cudaMemcpyToSymbol ( simData, &fcuda, sizeof(FluidParams) ) ); - cudaThreadSynchronize (); -} - -void FluidParamCUDA ( float sim_scale, float smooth_rad, float mass, float rest, float stiff, float visc ) -{ - fcuda.sim_scale = sim_scale; - fcuda.smooth_rad = smooth_rad; - fcuda.r2 = smooth_rad * smooth_rad; - fcuda.pmass = mass; - fcuda.rest_dens = rest; - fcuda.stiffness = stiff; - fcuda.visc = visc; - - fcuda.pdist = pow ( fcuda.pmass / fcuda.rest_dens, 1/3.0f ); - fcuda.poly6kern = 315.0f / (64.0f * 3.141592 * pow( smooth_rad, 9.0f) ); - fcuda.spikykern = -45.0f / (3.141592 * pow( smooth_rad, 6.0f) ); - fcuda.lapkern = 45.0f / (3.141592 * pow( smooth_rad, 6.0f) ); - - BT_GPU_SAFE_CALL( cudaMemcpyToSymbol ( simData, &fcuda, sizeof(FluidParams) ) ); - cudaThreadSynchronize (); -} - -void TransferToCUDA ( char* data, int* grid, int numPoints ) -{ - BT_GPU_SAFE_CALL( cudaMemcpy ( bufPnts, data, numPoints * fcuda.stride, cudaMemcpyHostToDevice ) ); - cudaThreadSynchronize (); -} - -void TransferFromCUDA ( char* data, int* grid, int numPoints ) -{ - BT_GPU_SAFE_CALL( cudaMemcpy ( data, bufPntSort, numPoints * fcuda.stride, cudaMemcpyDeviceToHost ) ); - cudaThreadSynchronize (); - - BT_GPU_SAFE_CALL( cudaMemcpy ( grid, bufGrid, fcuda.cells * sizeof(uint), cudaMemcpyDeviceToHost ) ); -} - -void Grid_InsertParticlesCUDA () -{ - BT_GPU_SAFE_CALL( cudaMemset ( bufHash[0], 0, fcuda.szHash ) ); - - hashParticles<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPnts, (uint2*) bufHash[0], fcuda.pnts ); - BT_GPU_CHECK_ERROR( "Kernel execution failed"); - cudaThreadSynchronize (); - - //int buf[20000]; - /*printf ( "HASH: %d (%d)\n", fcuda.pnts, fcuda.numBlocks*fcuda.numThreads ); - BT_GPU_SAFE_CALL( cudaMemcpy ( buf, bufHash[0], fcuda.pnts * 2*sizeof(uint), cudaMemcpyDeviceToHost ) ); - //for (int n=0; n < fcuda.numBlocks*fcuda.numThreads; n++) { - for (int n=0; n < 100; n++) { - printf ( "%d: <%d,%d>\n", n, buf[n*2], buf[n*2+1] ); - }*/ - - RadixSort( (KeyValuePair *) bufHash[0], (KeyValuePair *) bufHash[1], fcuda.pnts, 32); - BT_GPU_CHECK_ERROR( "Kernel execution failed"); - cudaThreadSynchronize (); - - /*printf ( "HASH: %d (%d)\n", fcuda.pnts, fcuda.numBlocks*fcuda.numThreads ); - BT_GPU_SAFE_CALL( cudaMemcpy ( buf, bufHash[0], fcuda.pnts * 2*sizeof(uint), cudaMemcpyDeviceToHost ) ); - //for (int n=0; n < fcuda.numBlocks*fcuda.numThreads; n++) { - for (int n=0; n < 100; n++) { - printf ( "%d: <%d,%d>\n", n, buf[n*2], buf[n*2+1] ); - }*/ - - // insertParticles<<< fcuda.gridBlocks, fcuda.gridThreads>>> ( bufPnts, (uint2*) bufHash[0], bufGrid, fcuda.pnts, fcuda.cells ); - - BT_GPU_SAFE_CALL( cudaMemset ( bufGrid, NULL_HASH, fcuda.cells * sizeof(uint) ) ); - - insertParticlesRadix<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPnts, (uint2*) bufHash[0], bufGrid, bufPntSort, fcuda.pnts, fcuda.cells ); - BT_GPU_CHECK_ERROR( "Kernel execution failed"); - cudaThreadSynchronize (); - - /*printf ( "GRID: %d\n", fcuda.cells ); - BT_GPU_SAFE_CALL( cudaMemcpy ( buf, bufGrid, fcuda.cells * sizeof(uint), cudaMemcpyDeviceToHost ) ); - *for (int n=0; n < 100; n++) { - printf ( "%d: %d\n", n, buf[n]); - }*/ -} - -void SPH_ComputePressureCUDA () -{ - computePressure<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, bufGrid, (uint2*) bufHash[0], fcuda.pnts ); - BT_GPU_CHECK_ERROR( "Kernel execution failed"); - cudaThreadSynchronize (); -} - -void SPH_ComputeForceCUDA () -{ - //-- standard force - //computeForce<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, bufGrid, (uint2*) bufHash[0], fcuda.pnts ); - - // Force using neighbor table - computeForceNbr<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, fcuda.pnts ); - BT_GPU_CHECK_ERROR( "Kernel execution failed"); - cudaThreadSynchronize (); -} - -void SPH_AdvanceCUDA ( float dt, float ss ) -{ - advanceParticles<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, fcuda.pnts, dt, ss ); - BT_GPU_CHECK_ERROR( "Kernel execution failed"); - cudaThreadSynchronize (); -} - -} // extern C - - - - - //----------- Per frame: Malloc/Free, Host<->Device - // transfer point data to device - /*char* pntData; - int size = (fcuda.numBlocks*fcuda.numThreads) * stride; - cudaMalloc( (void**) &pntData, size); - cudaMemcpy( pntData, data, numPoints*stride, cudaMemcpyHostToDevice); - insertParticles<<< fcuda.numBlocks, fcuda.numThreads >>> ( pntData, stride, numPoints ); - cudaMemcpy( data, pntData, numPoints*stride, cudaMemcpyDeviceToHost); - cudaFree( pntData );*/ +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 "C:\CUDA\common\inc\cutil.h" // cutil32.lib +#include +#include "../CUDA/btCudaDefines.h" + + + +#if defined(__APPLE__) || defined(MACOSX) + #include +#else + #include +#endif +#include + +#include "radixsort.cu" +#include "fluid_system_kern.cu" // build kernel + +FluidParams fcuda; + +__device__ char* bufPnts; // point data (array of Fluid structs) +__device__ char* bufPntSort; // point data (array of Fluid structs) +__device__ uint* bufHash[2]; // point grid hash +__device__ int* bufGrid; + + + +extern "C" +{ +// Initialize CUDA +void cudaInit(int argc, char **argv) +{ + //CUT_DEVICE_INIT(argc, argv); + + cudaDeviceProp p; + cudaGetDeviceProperties ( &p, 0); + + printf ( "-- CUDA --\n" ); + printf ( "Name: %s\n", p.name ); + printf ( "Revision: %d.%d\n", p.major, p.minor ); + printf ( "Global Mem: %d\n", p.totalGlobalMem ); + printf ( "Shared/Blk: %d\n", p.sharedMemPerBlock ); + printf ( "Regs/Blk: %d\n", p.regsPerBlock ); + printf ( "Warp Size: %d\n", p.warpSize ); + printf ( "Mem Pitch: %d\n", p.memPitch ); + printf ( "Thrds/Blk: %d\n", p.maxThreadsPerBlock ); + printf ( "Const Mem: %d\n", p.totalConstMem ); + printf ( "Clock Rate: %d\n", p.clockRate ); + + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPnts, 10 ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPntSort, 10 ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufHash, 10 ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufGrid, 10 ) ); +}; + +// Compute number of blocks to create +int iDivUp (int a, int b) { + return (a % b != 0) ? (a / b + 1) : (a / b); +} +void computeNumBlocks (int numPnts, int maxThreads, int &numBlocks, int &numThreads) +{ + numThreads = min( maxThreads, numPnts ); + numBlocks = iDivUp ( numPnts, numThreads ); +} + +void FluidClearCUDA () +{ + BT_GPU_SAFE_CALL ( cudaFree ( bufPnts ) ); + BT_GPU_SAFE_CALL ( cudaFree ( bufPntSort ) ); + BT_GPU_SAFE_CALL ( cudaFree ( bufHash[0] ) ); + BT_GPU_SAFE_CALL ( cudaFree ( bufHash[1] ) ); + BT_GPU_SAFE_CALL ( cudaFree ( bufGrid ) ); +} + + +void FluidSetupCUDA ( int num, int stride, float3 min, float3 max, float3 res, float3 size, int chk ) +{ + fcuda.min = make_float3(min.x, min.y, min.z); + fcuda.max = make_float3(max.x, max.y, max.z); + fcuda.res = make_float3(res.x, res.y, res.z); + fcuda.size = make_float3(size.x, size.y, size.z); + fcuda.pnts = num; + fcuda.delta.x = res.x / size.x; + fcuda.delta.y = res.y / size.y; + fcuda.delta.z = res.z / size.z; + fcuda.cells = res.x*res.y*res.z; + fcuda.chk = chk; + + computeNumBlocks ( fcuda.pnts, 256, fcuda.numBlocks, fcuda.numThreads); // particles + computeNumBlocks ( fcuda.cells, 256, fcuda.gridBlocks, fcuda.gridThreads); // grid cell + + fcuda.szPnts = (fcuda.numBlocks * fcuda.numThreads) * stride; + fcuda.szHash = (fcuda.numBlocks * fcuda.numThreads) * sizeof(uint2); // pairs + fcuda.szGrid = (fcuda.gridBlocks * fcuda.gridThreads) * sizeof(uint); + fcuda.stride = stride; + printf ( "pnts: %d, t:%dx%d=%d, bufPnts:%d, bufHash:%d\n", fcuda.pnts, fcuda.numBlocks, fcuda.numThreads, fcuda.numBlocks*fcuda.numThreads, fcuda.szPnts, fcuda.szHash ); + printf ( "grds: %d, t:%dx%d=%d, bufGrid:%d, Res: %dx%dx%d\n", fcuda.cells, fcuda.gridBlocks, fcuda.gridThreads, fcuda.gridBlocks*fcuda.gridThreads, fcuda.szGrid, (int) fcuda.res.x, (int) fcuda.res.y, (int) fcuda.res.z ); + + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPnts, fcuda.szPnts ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufPntSort, fcuda.szPnts ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufHash[0], fcuda.szHash ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufHash[1], fcuda.szHash ) ); + BT_GPU_SAFE_CALL ( cudaMalloc ( (void**) &bufGrid, fcuda.szGrid ) ); + + printf ( "POINTERS\n"); + printf ( "bufPnts: %p\n", bufPnts ); + printf ( "bufPntSort: %p\n", bufPntSort ); + printf ( "bufHash0: %p\n", bufHash[0] ); + printf ( "bufHash1: %p\n", bufHash[1] ); + printf ( "bufGrid: %p\n", bufGrid ); + + BT_GPU_SAFE_CALL ( cudaMemcpyToSymbol ( simData, &fcuda, sizeof(FluidParams) ) ); + cudaThreadSynchronize (); +} + +void FluidParamCUDA ( float sim_scale, float smooth_rad, float mass, float rest, float stiff, float visc ) +{ + fcuda.sim_scale = sim_scale; + fcuda.smooth_rad = smooth_rad; + fcuda.r2 = smooth_rad * smooth_rad; + fcuda.pmass = mass; + fcuda.rest_dens = rest; + fcuda.stiffness = stiff; + fcuda.visc = visc; + + fcuda.pdist = pow ( fcuda.pmass / fcuda.rest_dens, 1/3.0f ); + fcuda.poly6kern = 315.0f / (64.0f * 3.141592 * pow( smooth_rad, 9.0f) ); + fcuda.spikykern = -45.0f / (3.141592 * pow( smooth_rad, 6.0f) ); + fcuda.lapkern = 45.0f / (3.141592 * pow( smooth_rad, 6.0f) ); + + BT_GPU_SAFE_CALL( cudaMemcpyToSymbol ( simData, &fcuda, sizeof(FluidParams) ) ); + cudaThreadSynchronize (); +} + +void TransferToCUDA ( char* data, int* grid, int numPoints ) +{ + BT_GPU_SAFE_CALL( cudaMemcpy ( bufPnts, data, numPoints * fcuda.stride, cudaMemcpyHostToDevice ) ); + cudaThreadSynchronize (); +} + +void TransferFromCUDA ( char* data, int* grid, int numPoints ) +{ + BT_GPU_SAFE_CALL( cudaMemcpy ( data, bufPntSort, numPoints * fcuda.stride, cudaMemcpyDeviceToHost ) ); + cudaThreadSynchronize (); + + BT_GPU_SAFE_CALL( cudaMemcpy ( grid, bufGrid, fcuda.cells * sizeof(uint), cudaMemcpyDeviceToHost ) ); +} + +void Grid_InsertParticlesCUDA () +{ + BT_GPU_SAFE_CALL( cudaMemset ( bufHash[0], 0, fcuda.szHash ) ); + + hashParticles<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPnts, (uint2*) bufHash[0], fcuda.pnts ); + BT_GPU_CHECK_ERROR( "Kernel execution failed"); + cudaThreadSynchronize (); + + //int buf[20000]; + /*printf ( "HASH: %d (%d)\n", fcuda.pnts, fcuda.numBlocks*fcuda.numThreads ); + BT_GPU_SAFE_CALL( cudaMemcpy ( buf, bufHash[0], fcuda.pnts * 2*sizeof(uint), cudaMemcpyDeviceToHost ) ); + //for (int n=0; n < fcuda.numBlocks*fcuda.numThreads; n++) { + for (int n=0; n < 100; n++) { + printf ( "%d: <%d,%d>\n", n, buf[n*2], buf[n*2+1] ); + }*/ + + RadixSort( (KeyValuePair *) bufHash[0], (KeyValuePair *) bufHash[1], fcuda.pnts, 32); + BT_GPU_CHECK_ERROR( "Kernel execution failed"); + cudaThreadSynchronize (); + + /*printf ( "HASH: %d (%d)\n", fcuda.pnts, fcuda.numBlocks*fcuda.numThreads ); + BT_GPU_SAFE_CALL( cudaMemcpy ( buf, bufHash[0], fcuda.pnts * 2*sizeof(uint), cudaMemcpyDeviceToHost ) ); + //for (int n=0; n < fcuda.numBlocks*fcuda.numThreads; n++) { + for (int n=0; n < 100; n++) { + printf ( "%d: <%d,%d>\n", n, buf[n*2], buf[n*2+1] ); + }*/ + + // insertParticles<<< fcuda.gridBlocks, fcuda.gridThreads>>> ( bufPnts, (uint2*) bufHash[0], bufGrid, fcuda.pnts, fcuda.cells ); + + BT_GPU_SAFE_CALL( cudaMemset ( bufGrid, NULL_HASH, fcuda.cells * sizeof(uint) ) ); + + insertParticlesRadix<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPnts, (uint2*) bufHash[0], bufGrid, bufPntSort, fcuda.pnts, fcuda.cells ); + BT_GPU_CHECK_ERROR( "Kernel execution failed"); + cudaThreadSynchronize (); + + /*printf ( "GRID: %d\n", fcuda.cells ); + BT_GPU_SAFE_CALL( cudaMemcpy ( buf, bufGrid, fcuda.cells * sizeof(uint), cudaMemcpyDeviceToHost ) ); + *for (int n=0; n < 100; n++) { + printf ( "%d: %d\n", n, buf[n]); + }*/ +} + +void SPH_ComputePressureCUDA () +{ + computePressure<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, bufGrid, (uint2*) bufHash[0], fcuda.pnts ); + BT_GPU_CHECK_ERROR( "Kernel execution failed"); + cudaThreadSynchronize (); +} + +void SPH_ComputeForceCUDA () +{ + //-- standard force + //computeForce<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, bufGrid, (uint2*) bufHash[0], fcuda.pnts ); + + // Force using neighbor table + computeForceNbr<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, fcuda.pnts ); + BT_GPU_CHECK_ERROR( "Kernel execution failed"); + cudaThreadSynchronize (); +} + +void SPH_AdvanceCUDA ( float dt, float ss ) +{ + advanceParticles<<< fcuda.numBlocks, fcuda.numThreads>>> ( bufPntSort, fcuda.pnts, dt, ss ); + BT_GPU_CHECK_ERROR( "Kernel execution failed"); + cudaThreadSynchronize (); +} + +} // extern C + + + + + //----------- Per frame: Malloc/Free, Host<->Device + // transfer point data to device + /*char* pntData; + int size = (fcuda.numBlocks*fcuda.numThreads) * stride; + cudaMalloc( (void**) &pntData, size); + cudaMemcpy( pntData, data, numPoints*stride, cudaMemcpyHostToDevice); + insertParticles<<< fcuda.numBlocks, fcuda.numThreads >>> ( pntData, stride, numPoints ); + cudaMemcpy( data, pntData, numPoints*stride, cudaMemcpyDeviceToHost); + cudaFree( pntData );*/ diff --git a/Extras/sph/fluids/fluid_system_host.cuh b/Extras/sph/fluids/fluid_system_host.cuh index 32b821431..355b57db5 100644 --- a/Extras/sph/fluids/fluid_system_host.cuh +++ b/Extras/sph/fluids/fluid_system_host.cuh @@ -1,63 +1,63 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 // for cudaStream_t - -typedef unsigned int uint; // should be 4-bytes on CUDA -typedef unsigned char uchar; // should be 1-bytes on CUDA - -struct FluidParams { - int numThreads, numBlocks; - int gridThreads, gridBlocks; - int szPnts, szHash, szGrid; - int stride, pnts, cells; - int chk; - float smooth_rad, r2, sim_scale, visc; - float3 min, max, res, size, delta; - - float pdist, pmass, rest_dens, stiffness; - float poly6kern, spikykern, lapkern; - -}; - -extern "C" -{ - -void cudaInit(int argc, char **argv); - -void FluidClearCUDA (); -void FluidSetupCUDA ( int num, int stride, float3 min, float3 max, float3 res, float3 size, int chk ); -void FluidParamCUDA ( float sim_scale, float smooth_rad, float mass, float rest, float stiff, float visc ); - -void TransferToCUDA ( char* data, int* grid, int numPoints ); -void TransferFromCUDA ( char* data, int* grid, int numPoints ); - -void Grid_InsertParticlesCUDA (); -void SPH_ComputePressureCUDA (); -void SPH_ComputeForceCUDA (); -void SPH_AdvanceCUDA ( float dt, float ss ); - -} - - +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 // for cudaStream_t + +typedef unsigned int uint; // should be 4-bytes on CUDA +typedef unsigned char uchar; // should be 1-bytes on CUDA + +struct FluidParams { + int numThreads, numBlocks; + int gridThreads, gridBlocks; + int szPnts, szHash, szGrid; + int stride, pnts, cells; + int chk; + float smooth_rad, r2, sim_scale, visc; + float3 min, max, res, size, delta; + + float pdist, pmass, rest_dens, stiffness; + float poly6kern, spikykern, lapkern; + +}; + +extern "C" +{ + +void cudaInit(int argc, char **argv); + +void FluidClearCUDA (); +void FluidSetupCUDA ( int num, int stride, float3 min, float3 max, float3 res, float3 size, int chk ); +void FluidParamCUDA ( float sim_scale, float smooth_rad, float mass, float rest, float stiff, float visc ); + +void TransferToCUDA ( char* data, int* grid, int numPoints ); +void TransferFromCUDA ( char* data, int* grid, int numPoints ); + +void Grid_InsertParticlesCUDA (); +void SPH_ComputePressureCUDA (); +void SPH_ComputeForceCUDA (); +void SPH_AdvanceCUDA ( float dt, float ss ); + +} + + diff --git a/Extras/sph/fluids/fluid_system_kern.cu b/Extras/sph/fluids/fluid_system_kern.cu index 91ff338ac..235b46312 100644 --- a/Extras/sph/fluids/fluid_system_kern.cu +++ b/Extras/sph/fluids/fluid_system_kern.cu @@ -1,402 +1,402 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 _PARTICLES_KERNEL_H_ - #define _PARTICLES_KERNEL_H_ - - #include - #include - - #include "fluid_system_host.cuh" - - #define TOTAL_THREADS 65536 - #define BLOCK_THREADS 256 - #define MAX_NBR 80 - - __constant__ FluidParams simData; // simulation data (on device) - - __device__ int bufNeighbor[ TOTAL_THREADS*MAX_NBR ]; - __device__ float bufNdist[ TOTAL_THREADS*MAX_NBR ]; - - #define COLOR(r,g,b) ( (uint((r)*255.0f)<<24) | (uint((g)*255.0f)<<16) | (uint((b)*255.0f)<<8) ) - #define COLORA(r,g,b,a) ( (uint((r)*255.0f)<<24) | (uint((g)*255.0f)<<16) | (uint((b)*255.0f)<<8) | uint((a)*255.0f) ) - - #define NULL_HASH 333333 - - #define OFFSET_CLR 12 - #define OFFSET_NEXT 16 - #define OFFSET_VEL 20 - #define OFFSET_VEVAL 32 - #define OFFSET_PRESS 48 - #define OFFSET_DENS 52 - #define OFFSET_FORCE 56 - - - __global__ void hashParticles ( char* bufPnts, uint2* bufHash, int numPnt ) - { - uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index - float3* pos = (float3*) (bufPnts + __mul24(ndx, simData.stride) ); - int gz = (pos->z - simData.min.z) * simData.delta.z ; - int gy = (pos->y - simData.min.y) * simData.delta.y ; - int gx = (pos->x - simData.min.x) * simData.delta.x ; - if ( ndx >= numPnt || gx < 0 || gz > simData.res.x-1 || gy < 0 || gy > simData.res.y-1 || gz < 0 || gz > simData.res.z-1 ) - bufHash[ndx] = make_uint2( NULL_HASH, ndx ); - else - bufHash[ndx] = make_uint2( __mul24(__mul24(gz, (int) simData.res.y)+gy, (int) simData.res.x) + gx, ndx ); - - __syncthreads (); - } - - __global__ void insertParticles ( char* bufPnts, uint2* bufHash, int* bufGrid, int numPnt, int numGrid ) - { - uint grid_ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // grid cell index - - bufPnts += OFFSET_NEXT; - bufGrid[grid_ndx] = -1; - for (int n=0; n < numPnt; n++) { - if ( bufHash[n].x == grid_ndx ) { - *(int*) (bufPnts + __mul24(bufHash[n].y, simData.stride)) = bufGrid[grid_ndx]; - bufGrid[grid_ndx] = bufHash[n].y; - } - } - __syncthreads (); - } - - __global__ void insertParticlesRadix ( char* bufPnts, uint2* bufHash, int* bufGrid, char* bufPntSort, int numPnt, int numGrid ) - { - uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index - - uint2 bufHashSort = bufHash[ndx]; - - __shared__ uint sharedHash[257]; - sharedHash[threadIdx.x+1] = bufHashSort.x; - if ( ndx > 0 && threadIdx.x == 0 ) { - volatile uint2 prevData = bufHash[ndx-1]; - sharedHash[0] = prevData.x; - } - __syncthreads (); - - if ( (ndx == 0 || bufHashSort.x != sharedHash[threadIdx.x]) && bufHashSort.x != NULL_HASH ) { - bufGrid [ bufHashSort.x ] = ndx; - } - if ( ndx < numPnt ) { - char* src = bufPnts + __mul24( bufHashSort.y, simData.stride ); - char* dest = bufPntSort + __mul24( ndx, simData.stride ); - - *(float3*)(dest) = *(float3*)(src); - *(uint*) (dest + OFFSET_CLR) = *(uint*) (src + OFFSET_CLR); - *(float3*)(dest + OFFSET_VEL) = *(float3*)(src + OFFSET_VEL); - *(float3*)(dest + OFFSET_VEVAL) = *(float3*)(src + OFFSET_VEVAL); - - *(float*) (dest + OFFSET_DENS) = 0.0; - *(float*) (dest + OFFSET_PRESS) = 0.0; - *(float3*) (dest + OFFSET_FORCE)= make_float3(0,0,0); - *(int*) (dest + OFFSET_NEXT) = bufHashSort.x; - } - - __syncthreads (); - - } - - //__shared__ int ncount [ BLOCK_THREADS ]; - - __device__ float contributePressure ( int pndx, float3* p, int qndx, int grid_ndx, char* bufPnts, uint2* bufHash ) - { - float3* qpos; - float3 dist; - float dsq, c, sum; - float d = simData.sim_scale; - int nbr = __mul24(pndx, MAX_NBR); - - sum = 0.0; - for ( ; qndx < simData.pnts; qndx++ ) { - - if ( bufHash[qndx].x != grid_ndx || qndx == NULL_HASH) break; - - if ( qndx != pndx ) { - qpos = (float3*) ( bufPnts + __mul24(qndx, simData.stride )); - - dist.x = ( p->x - qpos->x )*d; // dist in cm - dist.y = ( p->y - qpos->y )*d; - dist.z = ( p->z - qpos->z )*d; - dsq = (dist.x*dist.x + dist.y*dist.y + dist.z*dist.z); - if ( dsq < simData.r2 ) { - c = simData.r2 - dsq; - sum += c * c * c; - if ( bufNeighbor[nbr] < MAX_NBR ) { - bufNeighbor[ nbr+bufNeighbor[nbr] ] = qndx; - bufNdist[ nbr+bufNeighbor[nbr] ] = sqrt(dsq); - bufNeighbor[nbr]++; - } - } - } - //curr = *(int*) (bufPnts + __mul24(curr, simData.stride) + OFFSET_NEXT); - } - return sum; - } - - /*if ( ncount[threadIdx.x] < MAX_NBR ) { - bufNeighbor [ nbr + ncount[threadIdx.x] ] = curr; - bufNdist [ nbr + ncount[threadIdx.x] ] = sqrt(dsq); - ncount[threadIdx.x]++; - }*/ - - __global__ void computePressure ( char* bufPntSort, int* bufGrid, uint2* bufHash, int numPnt ) - { - uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index - - //if ( ndx < 1024 ) { - - float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); - - // Find 2x2x2 grid cells - // - Use registers only, no arrays (local-memory too slow) - int3 cell; - int gc0, gc1, gc2, gc3, gc4, gc5, gc6, gc7; - float gs = simData.smooth_rad / simData.sim_scale; - - cell.x = max(0, (int)((-gs + pos->x - simData.min.x) * simData.delta.x)); - cell.y = max(0, (int)((-gs + pos->y - simData.min.y) * simData.delta.y)); - cell.z = max(0, (int)((-gs + pos->z - simData.min.z) * simData.delta.z)); - gc0 = __mul24(__mul24(cell.z, simData.res.y) + cell.y, simData.res.x) + cell.x; - gc1 = gc0 + 1; - gc2 = gc0 + simData.res.x; - gc3 = gc2 + 1; - if ( cell.z+1 < simData.res.z ) { - gc4 = gc0 + __mul24(simData.res.x, simData.res.y); - gc5 = gc4 + 1; - gc6 = gc4 + simData.res.x; - gc7 = gc6 + 1; - } - if ( cell.x+1 >= simData.res.x ) { - gc1 = -1; gc3 = -1; - gc5 = -1; gc7 = -1; - } - if ( cell.y+1 >= simData.res.y ) { - gc2 = -1; gc3 = -1; - gc6 = -1; gc7 = -1; - } - // Sum Pressure - float sum = 0.0; - bufNeighbor[ __mul24(ndx, MAX_NBR) ] = 1; - if (gc0 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc0], gc0, bufPntSort, bufHash ); - if (gc1 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc1], gc1, bufPntSort, bufHash ); - if (gc2 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc2], gc2, bufPntSort, bufHash ); - if (gc3 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc3], gc3, bufPntSort, bufHash ); - if (gc4 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc4], gc4, bufPntSort, bufHash ); - if (gc5 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc5], gc5, bufPntSort, bufHash ); - if (gc6 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc6], gc6, bufPntSort, bufHash ); - if (gc7 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc7], gc7, bufPntSort, bufHash ); - - // Compute Density & Pressure - sum = sum * simData.pmass * simData.poly6kern; - if ( sum == 0.0 ) sum = 1.0; - *(float*) ((char*)pos + OFFSET_PRESS) = ( sum - simData.rest_dens ) * simData.stiffness; - *(float*) ((char*)pos + OFFSET_DENS) = 1.0f / sum; - - //} - //__syncthreads (); - } - - __device__ void contributeForce ( float3& force, int pndx, float3* p, int qndx, int grid_ndx, char* bufPnts, uint2* bufHash ) - { - float press = *(float*) ((char*)p + OFFSET_PRESS); - float dens = *(float*) ((char*)p + OFFSET_DENS); - float3 veval = *(float3*) ((char*)p + OFFSET_VEVAL ); - float3 qeval, dist; - float c, ndistj, dsq; - float pterm, dterm, vterm; - float3* qpos; - float d = simData.sim_scale; - - vterm = simData.lapkern * simData.visc; - - for ( ; qndx < simData.pnts; qndx++ ) { - - if ( bufHash[qndx].x != grid_ndx || qndx == NULL_HASH) break; - - if ( qndx != pndx ) { - qpos = (float3*) ( bufPnts + __mul24(qndx, simData.stride )); - - dist.x = ( p->x - qpos->x )*d; // dist in cm - dist.y = ( p->y - qpos->y )*d; - dist.z = ( p->z - qpos->z )*d; - dsq = (dist.x*dist.x + dist.y*dist.y + dist.z*dist.z); - if ( dsq < simData.r2 ) { - ndistj = sqrt(dsq); - c = ( simData.smooth_rad - ndistj ); - dist.x = ( p->x - qpos->x )*d; // dist in cm - dist.y = ( p->y - qpos->y )*d; - dist.z = ( p->z - qpos->z )*d; - pterm = -0.5f * c * simData.spikykern * ( press + *(float*)((char*)qpos+OFFSET_PRESS) ) / ndistj; - dterm = c * dens * *(float*)((char*)qpos+OFFSET_DENS); - qeval = *(float3*)((char*)qpos+OFFSET_VEVAL); - force.x += ( pterm * dist.x + vterm * ( qeval.x - veval.x )) * dterm; - force.y += ( pterm * dist.y + vterm * ( qeval.y - veval.y )) * dterm; - force.z += ( pterm * dist.z + vterm * ( qeval.z - veval.z )) * dterm; - } - } - } - } - - - - __global__ void computeForce ( char* bufPntSort, int* bufGrid, uint2* bufHash, int numPnt ) - { - uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index - - //if ( ndx < numPnt ) { - - float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); - - // Find 2x2x2 grid cells - // - Use registers only, no arrays (local-memory too slow) - int3 cell; - int gc0, gc1, gc2, gc3, gc4, gc5, gc6, gc7; - float gs = simData.smooth_rad / simData.sim_scale; - - cell.x = max(0, (int)((-gs + pos->x - simData.min.x) * simData.delta.x)); - cell.y = max(0, (int)((-gs + pos->y - simData.min.y) * simData.delta.y)); - cell.z = max(0, (int)((-gs + pos->z - simData.min.z) * simData.delta.z)); - gc0 = __mul24(__mul24(cell.z, simData.res.y) + cell.y, simData.res.x) + cell.x; - gc1 = gc0 + 1; - gc2 = gc0 + simData.res.x; - gc3 = gc2 + 1; - if ( cell.z+1 < simData.res.z ) { - gc4 = gc0 + __mul24(simData.res.x, simData.res.y); - gc5 = gc4 + 1; - gc6 = gc4 + simData.res.x; - gc7 = gc6 + 1; - } - if ( cell.x+1 >= simData.res.x ) { - gc1 = -1; gc3 = -1; - gc5 = -1; gc7 = -1; - } - if ( cell.y+1 >= simData.res.y ) { - gc2 = -1; gc3 = -1; - gc6 = -1; gc7 = -1; - } - // Sum Pressure - float3 force = make_float3(0,0,0); - if (gc0 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc0], gc0, bufPntSort, bufHash ); - if (gc1 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc1], gc1, bufPntSort, bufHash ); - if (gc2 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc2], gc2, bufPntSort, bufHash ); - if (gc3 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc3], gc3, bufPntSort, bufHash ); - if (gc4 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc4], gc4, bufPntSort, bufHash ); - if (gc5 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc5], gc5, bufPntSort, bufHash ); - if (gc6 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc6], gc6, bufPntSort, bufHash ); - if (gc7 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc7], gc7, bufPntSort, bufHash ); - - // Update Force - *(float3*) ((char*)pos + OFFSET_FORCE ) = force; - - //} - //__syncthreads (); - } - - - __global__ void computeForceNbr ( char* bufPntSort, int numPnt ) - { - uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index - - if ( ndx < numPnt ) { - - float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); - - float3* qpos; - float press = *(float*) ((char*)pos + OFFSET_PRESS); - float dens = *(float*) ((char*)pos + OFFSET_DENS); - float3 veval = *(float3*) ((char*)pos + OFFSET_VEVAL ); - float3 qeval, dist, force; - float d = simData.sim_scale; - float c, ndistj; - float pterm, dterm, vterm; - vterm = simData.lapkern * simData.visc; - int nbr = __mul24(ndx, MAX_NBR); - - int ncnt = bufNeighbor[ nbr ]; - - force = make_float3(0,0,0); - for (int j=1; j < ncnt; j++) { // base 1, n[0] = count - ndistj = bufNdist[ nbr+j ]; - qpos = (float3*) (bufPntSort + __mul24( bufNeighbor[ nbr+j ], simData.stride) ); - c = ( simData.smooth_rad - ndistj ); - dist.x = ( pos->x - qpos->x )*d; // dist in cm - dist.y = ( pos->y - qpos->y )*d; - dist.z = ( pos->z - qpos->z )*d; - pterm = -0.5f * c * simData.spikykern * ( press + *(float*)((char*)qpos+OFFSET_PRESS) ) / ndistj; - dterm = c * dens * *(float*)((char*)qpos+OFFSET_DENS); - qeval = *(float3*)((char*)qpos+OFFSET_VEVAL); - force.x += ( pterm * dist.x + vterm * ( qeval.x - veval.x )) * dterm; - force.y += ( pterm * dist.y + vterm * ( qeval.y - veval.y )) * dterm; - force.z += ( pterm * dist.z + vterm * ( qeval.z - veval.z )) * dterm; - } - *(float3*) ((char*)pos + OFFSET_FORCE ) = force; - - } - - } - - __global__ void advanceParticles ( char* bufPntSort, int numPnt, float dt, float ss ) - { - uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index - - if ( ndx < numPnt ) { - - // Get particle vars - float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); - float3* vel = (float3*) ((char*)pos + OFFSET_VEL ); - float3* vel_eval = (float3*) ((char*)pos + OFFSET_VEVAL ); - float3 accel = *(float3*) ((char*)pos + OFFSET_FORCE ); - float3 vcurr, vnext; - - // Leapfrog integration - accel.x *= 0.00020543; // NOTE - To do: SPH_PMASS should be passed in - accel.y *= 0.00020543; - accel.z *= 0.00020543; - accel.z -= 9.8; - - vcurr = *vel; - vnext.x = accel.x*dt + vcurr.x; - vnext.y = accel.y*dt + vcurr.y; - vnext.z = accel.z*dt + vcurr.z; // v(t+1/2) = v(t-1/2) + a(t) dt - - accel.x = (vcurr.x + vnext.x) * 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later - accel.y = (vcurr.y + vnext.y) * 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later - accel.z = (vcurr.z + vnext.z) * 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later - - *vel_eval = accel; - *vel = vnext; - - dt /= simData.sim_scale; - vnext.x = pos->x + vnext.x*dt; - vnext.y = pos->y + vnext.y*dt; - vnext.z = pos->z + vnext.z*dt; - *pos = vnext; // p(t+1) = p(t) + v(t+1/2) dt - } - - __syncthreads (); - } - -#endif +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2008. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 _PARTICLES_KERNEL_H_ + #define _PARTICLES_KERNEL_H_ + + #include + #include + + #include "fluid_system_host.cuh" + + #define TOTAL_THREADS 65536 + #define BLOCK_THREADS 256 + #define MAX_NBR 80 + + __constant__ FluidParams simData; // simulation data (on device) + + __device__ int bufNeighbor[ TOTAL_THREADS*MAX_NBR ]; + __device__ float bufNdist[ TOTAL_THREADS*MAX_NBR ]; + + #define COLOR(r,g,b) ( (uint((r)*255.0f)<<24) | (uint((g)*255.0f)<<16) | (uint((b)*255.0f)<<8) ) + #define COLORA(r,g,b,a) ( (uint((r)*255.0f)<<24) | (uint((g)*255.0f)<<16) | (uint((b)*255.0f)<<8) | uint((a)*255.0f) ) + + #define NULL_HASH 333333 + + #define OFFSET_CLR 12 + #define OFFSET_NEXT 16 + #define OFFSET_VEL 20 + #define OFFSET_VEVAL 32 + #define OFFSET_PRESS 48 + #define OFFSET_DENS 52 + #define OFFSET_FORCE 56 + + + __global__ void hashParticles ( char* bufPnts, uint2* bufHash, int numPnt ) + { + uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index + float3* pos = (float3*) (bufPnts + __mul24(ndx, simData.stride) ); + int gz = (pos->z - simData.min.z) * simData.delta.z ; + int gy = (pos->y - simData.min.y) * simData.delta.y ; + int gx = (pos->x - simData.min.x) * simData.delta.x ; + if ( ndx >= numPnt || gx < 0 || gz > simData.res.x-1 || gy < 0 || gy > simData.res.y-1 || gz < 0 || gz > simData.res.z-1 ) + bufHash[ndx] = make_uint2( NULL_HASH, ndx ); + else + bufHash[ndx] = make_uint2( __mul24(__mul24(gz, (int) simData.res.y)+gy, (int) simData.res.x) + gx, ndx ); + + __syncthreads (); + } + + __global__ void insertParticles ( char* bufPnts, uint2* bufHash, int* bufGrid, int numPnt, int numGrid ) + { + uint grid_ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // grid cell index + + bufPnts += OFFSET_NEXT; + bufGrid[grid_ndx] = -1; + for (int n=0; n < numPnt; n++) { + if ( bufHash[n].x == grid_ndx ) { + *(int*) (bufPnts + __mul24(bufHash[n].y, simData.stride)) = bufGrid[grid_ndx]; + bufGrid[grid_ndx] = bufHash[n].y; + } + } + __syncthreads (); + } + + __global__ void insertParticlesRadix ( char* bufPnts, uint2* bufHash, int* bufGrid, char* bufPntSort, int numPnt, int numGrid ) + { + uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index + + uint2 bufHashSort = bufHash[ndx]; + + __shared__ uint sharedHash[257]; + sharedHash[threadIdx.x+1] = bufHashSort.x; + if ( ndx > 0 && threadIdx.x == 0 ) { + volatile uint2 prevData = bufHash[ndx-1]; + sharedHash[0] = prevData.x; + } + __syncthreads (); + + if ( (ndx == 0 || bufHashSort.x != sharedHash[threadIdx.x]) && bufHashSort.x != NULL_HASH ) { + bufGrid [ bufHashSort.x ] = ndx; + } + if ( ndx < numPnt ) { + char* src = bufPnts + __mul24( bufHashSort.y, simData.stride ); + char* dest = bufPntSort + __mul24( ndx, simData.stride ); + + *(float3*)(dest) = *(float3*)(src); + *(uint*) (dest + OFFSET_CLR) = *(uint*) (src + OFFSET_CLR); + *(float3*)(dest + OFFSET_VEL) = *(float3*)(src + OFFSET_VEL); + *(float3*)(dest + OFFSET_VEVAL) = *(float3*)(src + OFFSET_VEVAL); + + *(float*) (dest + OFFSET_DENS) = 0.0; + *(float*) (dest + OFFSET_PRESS) = 0.0; + *(float3*) (dest + OFFSET_FORCE)= make_float3(0,0,0); + *(int*) (dest + OFFSET_NEXT) = bufHashSort.x; + } + + __syncthreads (); + + } + + //__shared__ int ncount [ BLOCK_THREADS ]; + + __device__ float contributePressure ( int pndx, float3* p, int qndx, int grid_ndx, char* bufPnts, uint2* bufHash ) + { + float3* qpos; + float3 dist; + float dsq, c, sum; + float d = simData.sim_scale; + int nbr = __mul24(pndx, MAX_NBR); + + sum = 0.0; + for ( ; qndx < simData.pnts; qndx++ ) { + + if ( bufHash[qndx].x != grid_ndx || qndx == NULL_HASH) break; + + if ( qndx != pndx ) { + qpos = (float3*) ( bufPnts + __mul24(qndx, simData.stride )); + + dist.x = ( p->x - qpos->x )*d; // dist in cm + dist.y = ( p->y - qpos->y )*d; + dist.z = ( p->z - qpos->z )*d; + dsq = (dist.x*dist.x + dist.y*dist.y + dist.z*dist.z); + if ( dsq < simData.r2 ) { + c = simData.r2 - dsq; + sum += c * c * c; + if ( bufNeighbor[nbr] < MAX_NBR ) { + bufNeighbor[ nbr+bufNeighbor[nbr] ] = qndx; + bufNdist[ nbr+bufNeighbor[nbr] ] = sqrt(dsq); + bufNeighbor[nbr]++; + } + } + } + //curr = *(int*) (bufPnts + __mul24(curr, simData.stride) + OFFSET_NEXT); + } + return sum; + } + + /*if ( ncount[threadIdx.x] < MAX_NBR ) { + bufNeighbor [ nbr + ncount[threadIdx.x] ] = curr; + bufNdist [ nbr + ncount[threadIdx.x] ] = sqrt(dsq); + ncount[threadIdx.x]++; + }*/ + + __global__ void computePressure ( char* bufPntSort, int* bufGrid, uint2* bufHash, int numPnt ) + { + uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index + + //if ( ndx < 1024 ) { + + float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); + + // Find 2x2x2 grid cells + // - Use registers only, no arrays (local-memory too slow) + int3 cell; + int gc0, gc1, gc2, gc3, gc4, gc5, gc6, gc7; + float gs = simData.smooth_rad / simData.sim_scale; + + cell.x = max(0, (int)((-gs + pos->x - simData.min.x) * simData.delta.x)); + cell.y = max(0, (int)((-gs + pos->y - simData.min.y) * simData.delta.y)); + cell.z = max(0, (int)((-gs + pos->z - simData.min.z) * simData.delta.z)); + gc0 = __mul24(__mul24(cell.z, simData.res.y) + cell.y, simData.res.x) + cell.x; + gc1 = gc0 + 1; + gc2 = gc0 + simData.res.x; + gc3 = gc2 + 1; + if ( cell.z+1 < simData.res.z ) { + gc4 = gc0 + __mul24(simData.res.x, simData.res.y); + gc5 = gc4 + 1; + gc6 = gc4 + simData.res.x; + gc7 = gc6 + 1; + } + if ( cell.x+1 >= simData.res.x ) { + gc1 = -1; gc3 = -1; + gc5 = -1; gc7 = -1; + } + if ( cell.y+1 >= simData.res.y ) { + gc2 = -1; gc3 = -1; + gc6 = -1; gc7 = -1; + } + // Sum Pressure + float sum = 0.0; + bufNeighbor[ __mul24(ndx, MAX_NBR) ] = 1; + if (gc0 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc0], gc0, bufPntSort, bufHash ); + if (gc1 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc1], gc1, bufPntSort, bufHash ); + if (gc2 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc2], gc2, bufPntSort, bufHash ); + if (gc3 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc3], gc3, bufPntSort, bufHash ); + if (gc4 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc4], gc4, bufPntSort, bufHash ); + if (gc5 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc5], gc5, bufPntSort, bufHash ); + if (gc6 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc6], gc6, bufPntSort, bufHash ); + if (gc7 != -1 ) sum += contributePressure ( ndx, pos, bufGrid[gc7], gc7, bufPntSort, bufHash ); + + // Compute Density & Pressure + sum = sum * simData.pmass * simData.poly6kern; + if ( sum == 0.0 ) sum = 1.0; + *(float*) ((char*)pos + OFFSET_PRESS) = ( sum - simData.rest_dens ) * simData.stiffness; + *(float*) ((char*)pos + OFFSET_DENS) = 1.0f / sum; + + //} + //__syncthreads (); + } + + __device__ void contributeForce ( float3& force, int pndx, float3* p, int qndx, int grid_ndx, char* bufPnts, uint2* bufHash ) + { + float press = *(float*) ((char*)p + OFFSET_PRESS); + float dens = *(float*) ((char*)p + OFFSET_DENS); + float3 veval = *(float3*) ((char*)p + OFFSET_VEVAL ); + float3 qeval, dist; + float c, ndistj, dsq; + float pterm, dterm, vterm; + float3* qpos; + float d = simData.sim_scale; + + vterm = simData.lapkern * simData.visc; + + for ( ; qndx < simData.pnts; qndx++ ) { + + if ( bufHash[qndx].x != grid_ndx || qndx == NULL_HASH) break; + + if ( qndx != pndx ) { + qpos = (float3*) ( bufPnts + __mul24(qndx, simData.stride )); + + dist.x = ( p->x - qpos->x )*d; // dist in cm + dist.y = ( p->y - qpos->y )*d; + dist.z = ( p->z - qpos->z )*d; + dsq = (dist.x*dist.x + dist.y*dist.y + dist.z*dist.z); + if ( dsq < simData.r2 ) { + ndistj = sqrt(dsq); + c = ( simData.smooth_rad - ndistj ); + dist.x = ( p->x - qpos->x )*d; // dist in cm + dist.y = ( p->y - qpos->y )*d; + dist.z = ( p->z - qpos->z )*d; + pterm = -0.5f * c * simData.spikykern * ( press + *(float*)((char*)qpos+OFFSET_PRESS) ) / ndistj; + dterm = c * dens * *(float*)((char*)qpos+OFFSET_DENS); + qeval = *(float3*)((char*)qpos+OFFSET_VEVAL); + force.x += ( pterm * dist.x + vterm * ( qeval.x - veval.x )) * dterm; + force.y += ( pterm * dist.y + vterm * ( qeval.y - veval.y )) * dterm; + force.z += ( pterm * dist.z + vterm * ( qeval.z - veval.z )) * dterm; + } + } + } + } + + + + __global__ void computeForce ( char* bufPntSort, int* bufGrid, uint2* bufHash, int numPnt ) + { + uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index + + //if ( ndx < numPnt ) { + + float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); + + // Find 2x2x2 grid cells + // - Use registers only, no arrays (local-memory too slow) + int3 cell; + int gc0, gc1, gc2, gc3, gc4, gc5, gc6, gc7; + float gs = simData.smooth_rad / simData.sim_scale; + + cell.x = max(0, (int)((-gs + pos->x - simData.min.x) * simData.delta.x)); + cell.y = max(0, (int)((-gs + pos->y - simData.min.y) * simData.delta.y)); + cell.z = max(0, (int)((-gs + pos->z - simData.min.z) * simData.delta.z)); + gc0 = __mul24(__mul24(cell.z, simData.res.y) + cell.y, simData.res.x) + cell.x; + gc1 = gc0 + 1; + gc2 = gc0 + simData.res.x; + gc3 = gc2 + 1; + if ( cell.z+1 < simData.res.z ) { + gc4 = gc0 + __mul24(simData.res.x, simData.res.y); + gc5 = gc4 + 1; + gc6 = gc4 + simData.res.x; + gc7 = gc6 + 1; + } + if ( cell.x+1 >= simData.res.x ) { + gc1 = -1; gc3 = -1; + gc5 = -1; gc7 = -1; + } + if ( cell.y+1 >= simData.res.y ) { + gc2 = -1; gc3 = -1; + gc6 = -1; gc7 = -1; + } + // Sum Pressure + float3 force = make_float3(0,0,0); + if (gc0 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc0], gc0, bufPntSort, bufHash ); + if (gc1 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc1], gc1, bufPntSort, bufHash ); + if (gc2 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc2], gc2, bufPntSort, bufHash ); + if (gc3 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc3], gc3, bufPntSort, bufHash ); + if (gc4 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc4], gc4, bufPntSort, bufHash ); + if (gc5 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc5], gc5, bufPntSort, bufHash ); + if (gc6 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc6], gc6, bufPntSort, bufHash ); + if (gc7 != -1 ) contributeForce ( force, ndx, pos, bufGrid[gc7], gc7, bufPntSort, bufHash ); + + // Update Force + *(float3*) ((char*)pos + OFFSET_FORCE ) = force; + + //} + //__syncthreads (); + } + + + __global__ void computeForceNbr ( char* bufPntSort, int numPnt ) + { + uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index + + if ( ndx < numPnt ) { + + float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); + + float3* qpos; + float press = *(float*) ((char*)pos + OFFSET_PRESS); + float dens = *(float*) ((char*)pos + OFFSET_DENS); + float3 veval = *(float3*) ((char*)pos + OFFSET_VEVAL ); + float3 qeval, dist, force; + float d = simData.sim_scale; + float c, ndistj; + float pterm, dterm, vterm; + vterm = simData.lapkern * simData.visc; + int nbr = __mul24(ndx, MAX_NBR); + + int ncnt = bufNeighbor[ nbr ]; + + force = make_float3(0,0,0); + for (int j=1; j < ncnt; j++) { // base 1, n[0] = count + ndistj = bufNdist[ nbr+j ]; + qpos = (float3*) (bufPntSort + __mul24( bufNeighbor[ nbr+j ], simData.stride) ); + c = ( simData.smooth_rad - ndistj ); + dist.x = ( pos->x - qpos->x )*d; // dist in cm + dist.y = ( pos->y - qpos->y )*d; + dist.z = ( pos->z - qpos->z )*d; + pterm = -0.5f * c * simData.spikykern * ( press + *(float*)((char*)qpos+OFFSET_PRESS) ) / ndistj; + dterm = c * dens * *(float*)((char*)qpos+OFFSET_DENS); + qeval = *(float3*)((char*)qpos+OFFSET_VEVAL); + force.x += ( pterm * dist.x + vterm * ( qeval.x - veval.x )) * dterm; + force.y += ( pterm * dist.y + vterm * ( qeval.y - veval.y )) * dterm; + force.z += ( pterm * dist.z + vterm * ( qeval.z - veval.z )) * dterm; + } + *(float3*) ((char*)pos + OFFSET_FORCE ) = force; + + } + + } + + __global__ void advanceParticles ( char* bufPntSort, int numPnt, float dt, float ss ) + { + uint ndx = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; // particle index + + if ( ndx < numPnt ) { + + // Get particle vars + float3* pos = (float3*) (bufPntSort + __mul24(ndx, simData.stride)); + float3* vel = (float3*) ((char*)pos + OFFSET_VEL ); + float3* vel_eval = (float3*) ((char*)pos + OFFSET_VEVAL ); + float3 accel = *(float3*) ((char*)pos + OFFSET_FORCE ); + float3 vcurr, vnext; + + // Leapfrog integration + accel.x *= 0.00020543; // NOTE - To do: SPH_PMASS should be passed in + accel.y *= 0.00020543; + accel.z *= 0.00020543; + accel.z -= 9.8; + + vcurr = *vel; + vnext.x = accel.x*dt + vcurr.x; + vnext.y = accel.y*dt + vcurr.y; + vnext.z = accel.z*dt + vcurr.z; // v(t+1/2) = v(t-1/2) + a(t) dt + + accel.x = (vcurr.x + vnext.x) * 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later + accel.y = (vcurr.y + vnext.y) * 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later + accel.z = (vcurr.z + vnext.z) * 0.5; // v(t+1) = [v(t-1/2) + v(t+1/2)] * 0.5 used to compute forces later + + *vel_eval = accel; + *vel = vnext; + + dt /= simData.sim_scale; + vnext.x = pos->x + vnext.x*dt; + vnext.y = pos->y + vnext.y*dt; + vnext.z = pos->z + vnext.z*dt; + *pos = vnext; // p(t+1) = p(t) + v(t+1/2) dt + } + + __syncthreads (); + } + +#endif diff --git a/Extras/sph/fluids/fluid_system_kern.cuh b/Extras/sph/fluids/fluid_system_kern.cuh index e40d478fa..c1f0d81c0 100644 --- a/Extras/sph/fluids/fluid_system_kern.cuh +++ b/Extras/sph/fluids/fluid_system_kern.cuh @@ -1,45 +1,45 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 _PARTICLES_KERNEL_H_ - #define _PARTICLES_KERNEL_H_ - - #include - #include - #include "cutil_math.h" - #include "math_constants.h" - - // Insert particles in grid - - __global__ void insertParticles ( char* pntData, uint pntStride ) - { - int index = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; - float4 p = *(float4*) (pntData + index*pntStride); - - // get address in grid - int3 gridPos = calcGridPos(p); - - addParticleToCell(gridPos, index, gridCounters, gridCells); - } - - -#endif +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 _PARTICLES_KERNEL_H_ + #define _PARTICLES_KERNEL_H_ + + #include + #include + #include "cutil_math.h" + #include "math_constants.h" + + // Insert particles in grid + + __global__ void insertParticles ( char* pntData, uint pntStride ) + { + int index = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; + float4 p = *(float4*) (pntData + index*pntStride); + + // get address in grid + int3 gridPos = calcGridPos(p); + + addParticleToCell(gridPos, index, gridCounters, gridCells); + } + + +#endif diff --git a/Extras/sph/fluids/radixsort.cu b/Extras/sph/fluids/radixsort.cu index 7e7bbcf7e..24c85c653 100644 --- a/Extras/sph/fluids/radixsort.cu +++ b/Extras/sph/fluids/radixsort.cu @@ -1,79 +1,79 @@ -/* - * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - */ - -/* Radixsort project with key/value and arbitrary datset size support - * which demonstrates the use of CUDA in a multi phase sorting - * computation. - * Host code. - */ - -#include "radixsort.cuh" -#include "radixsort_kernel.cu" - -extern "C" -{ - -//////////////////////////////////////////////////////////////////////////////// -//! Perform a radix sort -//! Sorting performed in place on passed arrays. -//! -//! @param pData0 input and output array - data will be sorted -//! @param pData1 additional array to allow ping pong computation -//! @param elements number of elements to sort -//////////////////////////////////////////////////////////////////////////////// -void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits) -{ - // Round element count to total number of threads for efficiency - uint elements_rounded_to_3072; - int modval = elements % 3072; - if( modval == 0 ) - elements_rounded_to_3072 = elements; - else - elements_rounded_to_3072 = elements + (3072 - (modval)); - - // Iterate over n bytes of y bit word, using each byte to sort the list in turn - for (uint shift = 0; shift < bits; shift += RADIX) - { - // Perform one round of radix sorting - - // Generate per radix group sums radix counts across a radix group - RadixSum<<>>(pData0, elements, elements_rounded_to_3072, shift); - // Prefix sum in radix groups, and then between groups throughout a block - RadixPrefixSum<<>>(); - // Sum the block offsets and then shuffle data into bins - RadixAddOffsetsAndShuffle<<>>(pData0, pData1, elements, elements_rounded_to_3072, shift); - - // Exchange data pointers - KeyValuePair* pTemp = pData0; - pData0 = pData1; - pData1 = pTemp; - } -} - -} +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project with key/value and arbitrary datset size support + * which demonstrates the use of CUDA in a multi phase sorting + * computation. + * Host code. + */ + +#include "radixsort.cuh" +#include "radixsort_kernel.cu" + +extern "C" +{ + +//////////////////////////////////////////////////////////////////////////////// +//! Perform a radix sort +//! Sorting performed in place on passed arrays. +//! +//! @param pData0 input and output array - data will be sorted +//! @param pData1 additional array to allow ping pong computation +//! @param elements number of elements to sort +//////////////////////////////////////////////////////////////////////////////// +void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits) +{ + // Round element count to total number of threads for efficiency + uint elements_rounded_to_3072; + int modval = elements % 3072; + if( modval == 0 ) + elements_rounded_to_3072 = elements; + else + elements_rounded_to_3072 = elements + (3072 - (modval)); + + // Iterate over n bytes of y bit word, using each byte to sort the list in turn + for (uint shift = 0; shift < bits; shift += RADIX) + { + // Perform one round of radix sorting + + // Generate per radix group sums radix counts across a radix group + RadixSum<<>>(pData0, elements, elements_rounded_to_3072, shift); + // Prefix sum in radix groups, and then between groups throughout a block + RadixPrefixSum<<>>(); + // Sum the block offsets and then shuffle data into bins + RadixAddOffsetsAndShuffle<<>>(pData0, pData1, elements, elements_rounded_to_3072, shift); + + // Exchange data pointers + KeyValuePair* pTemp = pData0; + pData0 = pData1; + pData1 = pTemp; + } +} + +} diff --git a/Extras/sph/fluids/radixsort.cuh b/Extras/sph/fluids/radixsort.cuh index f0e038d35..538bb11f0 100644 --- a/Extras/sph/fluids/radixsort.cuh +++ b/Extras/sph/fluids/radixsort.cuh @@ -1,63 +1,63 @@ -/* - * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - */ - -/* Radixsort project which demonstrates the use of CUDA in a multi phase - * sorting computation. - * Type definitions. - */ - -#ifndef _RADIXSORT_H_ -#define _RADIXSORT_H_ - -#include - -#define SYNCIT __syncthreads() - -// Use 16 bit keys/values -#define SIXTEEN 0 - -typedef unsigned int uint; -typedef unsigned short ushort; - -#if SIXTEEN -typedef struct __align__(4) { - ushort key; - ushort value; -#else -typedef struct __align__(8) { - uint key; - uint value; -#endif -} KeyValuePair; - -extern "C" { - void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits); -} - -#endif // #ifndef _RADIXSORT_H_ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project which demonstrates the use of CUDA in a multi phase + * sorting computation. + * Type definitions. + */ + +#ifndef _RADIXSORT_H_ +#define _RADIXSORT_H_ + +#include + +#define SYNCIT __syncthreads() + +// Use 16 bit keys/values +#define SIXTEEN 0 + +typedef unsigned int uint; +typedef unsigned short ushort; + +#if SIXTEEN +typedef struct __align__(4) { + ushort key; + ushort value; +#else +typedef struct __align__(8) { + uint key; + uint value; +#endif +} KeyValuePair; + +extern "C" { + void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits); +} + +#endif // #ifndef _RADIXSORT_H_ diff --git a/Extras/sph/fluids/radixsort_kernel.cu b/Extras/sph/fluids/radixsort_kernel.cu index c29aa530c..dad689b8c 100644 --- a/Extras/sph/fluids/radixsort_kernel.cu +++ b/Extras/sph/fluids/radixsort_kernel.cu @@ -1,577 +1,577 @@ -/* - * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - */ - -/* Radixsort project with key/value and arbitrary datset size support - * which demonstrates the use of CUDA in a multi phase sorting - * computation. - * Device code. - */ - -#ifndef _RADIXSORT_KERNEL_H_ -#define _RADIXSORT_KERNEL_H_ - -#include -#include "radixsort.cuh" - -#define SYNCIT __syncthreads() - -static const int NUM_SMS = 16; -static const int NUM_THREADS_PER_SM = 192; -static const int NUM_THREADS_PER_BLOCK = 64; -//static const int NUM_THREADS = NUM_THREADS_PER_SM * NUM_SMS; -static const int NUM_BLOCKS = (NUM_THREADS_PER_SM / NUM_THREADS_PER_BLOCK) * NUM_SMS; -static const int RADIX = 8; // Number of bits per radix sort pass -static const int RADICES = 1 << RADIX; // Number of radices -static const int RADIXMASK = RADICES - 1; // Mask for each radix sort pass -#if SIXTEEN -static const int RADIXBITS = 16; // Number of bits to sort over -#else -static const int RADIXBITS = 32; // Number of bits to sort over -#endif -static const int RADIXTHREADS = 16; // Number of threads sharing each radix counter -static const int RADIXGROUPS = NUM_THREADS_PER_BLOCK / RADIXTHREADS; // Number of radix groups per CTA -static const int TOTALRADIXGROUPS = NUM_BLOCKS * RADIXGROUPS; // Number of radix groups for each radix -static const int SORTRADIXGROUPS = TOTALRADIXGROUPS * RADICES; // Total radix count -static const int GRFELEMENTS = (NUM_THREADS_PER_BLOCK / RADIXTHREADS) * RADICES; -static const int GRFSIZE = GRFELEMENTS * sizeof(uint); - -// Prefix sum variables -static const int PREFIX_NUM_THREADS_PER_SM = NUM_THREADS_PER_SM; -static const int PREFIX_NUM_THREADS_PER_BLOCK = PREFIX_NUM_THREADS_PER_SM; -static const int PREFIX_NUM_BLOCKS = (PREFIX_NUM_THREADS_PER_SM / PREFIX_NUM_THREADS_PER_BLOCK) * NUM_SMS; -static const int PREFIX_BLOCKSIZE = SORTRADIXGROUPS / PREFIX_NUM_BLOCKS; -static const int PREFIX_GRFELEMENTS = PREFIX_BLOCKSIZE + 2 * PREFIX_NUM_THREADS_PER_BLOCK; -static const int PREFIX_GRFSIZE = PREFIX_GRFELEMENTS * sizeof(uint); - -// Shuffle variables -static const int SHUFFLE_GRFOFFSET = RADIXGROUPS * RADICES; -static const int SHUFFLE_GRFELEMENTS = SHUFFLE_GRFOFFSET + PREFIX_NUM_BLOCKS; -static const int SHUFFLE_GRFSIZE = SHUFFLE_GRFELEMENTS * sizeof(uint); - - -#define SDATA( index) CUT_BANK_CHECKER(sdata, index) - -// Prefix sum data -uint gRadixSum[TOTALRADIXGROUPS * RADICES]; -__device__ uint dRadixSum[TOTALRADIXGROUPS * RADICES]; -uint gRadixBlockSum[PREFIX_NUM_BLOCKS]; -__device__ uint dRadixBlockSum[PREFIX_NUM_BLOCKS]; - -extern __shared__ uint sRadixSum[]; - - - -//////////////////////////////////////////////////////////////////////////////// -//! Perform a radix sum on the list to be sorted. Each SM holds a set of -//! radix counters for each group of RADIXGROUPS thread in the GRF. -//! -//! @param pData input data -//! @param elements total number of elements -//! @param elements_rounded_to_3072 total number of elements rounded up to the -//! nearest multiple of 3072 -//! @param shift the shift (0 to 24) that we are using to obtain the correct -//! byte -//////////////////////////////////////////////////////////////////////////////// -__global__ void RadixSum(KeyValuePair *pData, uint elements, uint elements_rounded_to_3072, uint shift) -{ - uint pos = threadIdx.x; - - // Zero radix counts - while (pos < GRFELEMENTS) - { - sRadixSum[pos] = 0; - pos += NUM_THREADS_PER_BLOCK; - } - - // Sum up data - // Source addresses computed so that each thread is reading from a block of - // consecutive addresses so there are no conflicts between threads - // They then loop over their combined region and the next batch works elsewhere. - // So threads 0 to 16 work on memory 0 to 320. - // First reading 0,1,2,3...15 then 16,17,18,19...31 and so on - // optimising parallel access to shared memory by a thread accessing 16*threadID - // The next radix group runs from 320 to 640 and the same applies in that region - uint tmod = threadIdx.x % RADIXTHREADS; - uint tpos = threadIdx.x / RADIXTHREADS; - - // Take the rounded element list size so that all threads have a certain size dataset to work with - // and no zero size datasets confusing the issue - // By using a multiple of 3072 we ensure that all threads have elements - // to work with until the last phase, at which point we individually test - uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; - - // Generate range - // Note that it is possible for both pos and end to be past the end of the element set - // which will be caught later. - pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; - uint end = pos + element_fraction; - pos += tmod; - //printf("pos: %d\n", pos); - __syncthreads(); - - while (pos < end ) - { - uint key = 0; - - // Read first data element if we are in the set of elements - //if( pos < elements ) - //key = pData[pos].key; - KeyValuePair kvp; - // Read first data element, both items at once as the memory will want to coalesce like that anyway - if (pos < elements) - kvp = pData[pos]; - else - kvp.key = 0; - key = kvp.key; - - - // Calculate position of radix counter to increment - // There are RADICES radices in each pass (256) - // and hence this many counters for bin grouping - // Multiply by RADIXGROUPS (4) to spread through memory - // and into 4 radix groups - uint p = ((key >> shift) & RADIXMASK) * RADIXGROUPS; - - // Increment radix counters - // Each radix group has its own set of counters - // so we add the thread position [0-3], ie the group index. - // We slow down here and take at least 16 cycles to write to the summation boxes - // but other groups will only conflict with themselves and so can also be writing - // 16 cycles here at least avoids retries. - uint ppos = p + tpos; - - // If we are past the last element we don't want to do anything - // We do have to check each time, however, to ensure that all - // threads sync on each sync here. - if (tmod == 0 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 1 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 2 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 3 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 4 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 5 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 6 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 7 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 8 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 9 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 10 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 11 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 12 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 13 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 14 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - if (tmod == 15 && pos < elements) - sRadixSum[ppos]++; - SYNCIT; - - pos += RADIXTHREADS; - - } - - __syncthreads(); - - __syncthreads(); - - // Output radix sums into separate memory regions for each radix group - // So this memory then is layed out: - // 0...... 192..... 384 ................ 192*256 - // ie all 256 bins for each radix group - // in there: - // 0.............192 - // 0 4 8 12... - block idx * 4 - // And in the block boxes we see the 4 radix groups for that block - // So 0-192 should contain bin 0 for each radix group, and so on - uint offset = blockIdx.x * RADIXGROUPS; - uint row = threadIdx.x / RADIXGROUPS; - uint column = threadIdx.x % RADIXGROUPS; - while (row < RADICES) - { - dRadixSum[offset + row * TOTALRADIXGROUPS + column] = sRadixSum[row * RADIXGROUPS + column]; - row += NUM_THREADS_PER_BLOCK / RADIXGROUPS; - } -} - -//////////////////////////////////////////////////////////////////////////////// -//! Performs first part of parallel prefix sum - individual sums of each radix -//! count. By the end of this we have prefix sums on a block level in dRadixSum -//! and totals for blocks in dRadixBlockSum. -//////////////////////////////////////////////////////////////////////////////// -__global__ void RadixPrefixSum() -{ - // Read radix groups in offset by one in the GRF so a zero can be inserted at the beginning - // and the final sum of all radix counts summed here is tacked onto the end for reading by - // the next stage - // Each block in this case is the full number of threads per SM (and hence the total number - // of radix groups), 192. We should then have the total set of offsets for an entire radix - // group by the end of this stage - // Device mem addressing - - uint brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); - uint drow = threadIdx.x / TOTALRADIXGROUPS; // In default parameterisation this is always 0 - uint dcolumn = threadIdx.x % TOTALRADIXGROUPS; // And similarly this is always the same as threadIdx.x - uint dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn; - uint end = ((blockIdx.x + 1) * (RADICES / PREFIX_NUM_BLOCKS)) * TOTALRADIXGROUPS; - // Shared mem addressing - uint srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - uint scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - uint spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; - - // Read (RADICES / PREFIX_NUM_BLOCKS) radix counts into the GRF alongside each other - while (dpos < end) - { - sRadixSum[spos] = dRadixSum[dpos]; - spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * - (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; - } - __syncthreads(); - - // Perform preliminary sum on each thread's stretch of data - // Each thread having a block of 16, with spacers between 0...16 18...33 and so on - int pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - uint sum = 0; - while (pos < end) - { - sum += sRadixSum[pos]; - sRadixSum[pos] = sum; - pos++; - } - __syncthreads(); - - - // Calculate internal offsets by performing a more traditional parallel - // prefix sum of the topmost member of each thread's work data. Right now, - // these are stored between the work data for each thread, allowing us to - // eliminate GRF conflicts as well as hold the offsets needed to complete the sum - // In other words we have: - // 0....15 16 17....32 33 34.... - // Where this first stage updates the intermediate values (so 16=15, 33=32 etc) - int m = (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + - (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - sRadixSum[pos] = sRadixSum[pos - 1]; - __syncthreads(); - // This stage then performs a parallel prefix sum (ie use powers of 2 to propagate in log n stages) - // to update 17, 34 etc with the totals to that point (so 34 becomes [34] + [17]) and so on. - while (m < PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1)) - { - int p = pos - m; - uint t = ((p > 0) ? sRadixSum[p] : 0); - __syncthreads(); - sRadixSum[pos] += t; - __syncthreads(); - m *= 2; - } - __syncthreads(); - - - - // Add internal offsets to each thread's work data. - // So now we take 17 and add it to all values 18 to 33 so all offsets for that block - // are updated. - pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - int p = pos - 1; - sum = ((p > 0) ? sRadixSum[p] : 0); - while (pos < end) - { - sRadixSum[pos] += sum; - pos++; - } - __syncthreads(); - - // Write summed data back out to global memory in the same way as we read it in - // We now have prefix sum values internal to groups - brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); - drow = threadIdx.x / TOTALRADIXGROUPS; - dcolumn = threadIdx.x % TOTALRADIXGROUPS; - srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); - dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn + 1; - spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; - end = ((blockIdx.x + 1) * RADICES / PREFIX_NUM_BLOCKS) * TOTALRADIXGROUPS; - while (dpos < end) - { - dRadixSum[dpos] = sRadixSum[spos]; - dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; - spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * - (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); - } - - // Write last element to summation - // Storing block sums in a separate array - if (threadIdx.x == 0) { - dRadixBlockSum[blockIdx.x] = sRadixSum[PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) - 1]; - dRadixSum[blockIdx.x * PREFIX_BLOCKSIZE] = 0; - } -} - - -//////////////////////////////////////////////////////////////////////////////// -//! Initially perform prefix sum of block totals to obtain final set of offsets. -//! Then make use of radix sums to perform a shuffling of the data into the -//! correct bins. -//! -//! @param pSrc input data -//! @param pDst output data -//! @param elements total number of elements -//! @param shift the shift (0 to 24) that we are using to obtain the correct -//! byte -//////////////////////////////////////////////////////////////////////////////// -__global__ void RadixAddOffsetsAndShuffle(KeyValuePair* pSrc, KeyValuePair* pDst, uint elements, uint elements_rounded_to_3072, int shift) -{ - // Read offsets from previous blocks - if (threadIdx.x == 0) - sRadixSum[SHUFFLE_GRFOFFSET] = 0; - - if (threadIdx.x < PREFIX_NUM_BLOCKS - 1) - sRadixSum[SHUFFLE_GRFOFFSET + threadIdx.x + 1] = dRadixBlockSum[threadIdx.x]; - __syncthreads(); - - // Parallel prefix sum over block sums - int pos = threadIdx.x; - int n = 1; - while (n < PREFIX_NUM_BLOCKS) - { - int ppos = pos - n; - uint t0 = ((pos < PREFIX_NUM_BLOCKS) && (ppos >= 0)) ? sRadixSum[SHUFFLE_GRFOFFSET + ppos] : 0; - __syncthreads(); - if (pos < PREFIX_NUM_BLOCKS) - sRadixSum[SHUFFLE_GRFOFFSET + pos] += t0; - __syncthreads(); - n *= 2; - } - - // Read radix count data and add appropriate block offset - // for each radix at the memory location for this thread - // (where the other threads in the block will be reading - // as well, hence the large stride). - // There is one counter box per radix group per radix - // per block (4*256*3) - // We use 64 threads to read the 4 radix groups set of radices - // for the block. - int row = threadIdx.x / RADIXGROUPS; - int column = threadIdx.x % RADIXGROUPS; - int spos = row * RADIXGROUPS + column; - int dpos = row * TOTALRADIXGROUPS + column + blockIdx.x * RADIXGROUPS; - while (spos < SHUFFLE_GRFOFFSET) - { - sRadixSum[spos] = dRadixSum[dpos] + sRadixSum[SHUFFLE_GRFOFFSET + dpos / (TOTALRADIXGROUPS * RADICES / PREFIX_NUM_BLOCKS)]; - spos += NUM_THREADS_PER_BLOCK; - dpos += (NUM_THREADS_PER_BLOCK / RADIXGROUPS) * TOTALRADIXGROUPS; - } - __syncthreads(); - - //int pos; - // Shuffle data - // Each of the subbins for a block should be filled via the counters, properly interleaved - // Then, as we now iterate over each data value, we increment the subbins (each thread in the - // radix group in turn to avoid miss writes due to conflicts) and set locations correctly. - uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; - int tmod = threadIdx.x % RADIXTHREADS; - int tpos = threadIdx.x / RADIXTHREADS; - - pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; - uint end = pos + element_fraction; //(blockIdx.x * RADIXGROUPS + tpos + 1) * element_fraction; - pos += tmod; - - __syncthreads(); - - while (pos < end ) - { - KeyValuePair kvp; -#if 1 // old load - // Read first data element, both items at once as the memory will want to coalesce like that anyway - if (pos < elements) - { - kvp = pSrc[pos]; - } - else - kvp.key = 0; - -#else // casting to float2 to get it to combine loads - int2 kvpf2; - - // Read first data element, both items at once as the memory will want to coalesce like that anyway - if (pos < elements) - { - // kvp = pSrc[pos]; - kvpf2 = ((int2*)pSrc)[pos]; - // printf("kvp: %f %f kvpf2: %f %f\n", kvp.key, kvp.value, kvpf2.x, kvpf2.y); - } - else - //kvp.key = 0; - kvpf2.x = 0; - - kvp.key = kvpf2.x; - kvp.value = kvpf2.y; -#endif - - uint index; - - // Calculate position of radix counter to increment - uint p = ((kvp.key >> shift) & RADIXMASK) * RADIXGROUPS; - - // Move data, keeping counts updated. - // Increment radix counters, relying on hexadecathread - // warp to prevent this code from stepping all over itself. - uint ppos = p + tpos; - if (tmod == 0 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 1 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 2 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 3 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 4 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 5 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 6 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 7 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 8 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 9 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 10 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 11 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 12 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 13 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 14 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - if (tmod == 15 && pos < elements) - { - index = sRadixSum[ppos]++; - pDst[index] = kvp; - } - SYNCIT; - - pos += RADIXTHREADS; - } - - __syncthreads(); -} - -#endif // #ifndef _RADIXSORT_KERNEL_H_ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project with key/value and arbitrary datset size support + * which demonstrates the use of CUDA in a multi phase sorting + * computation. + * Device code. + */ + +#ifndef _RADIXSORT_KERNEL_H_ +#define _RADIXSORT_KERNEL_H_ + +#include +#include "radixsort.cuh" + +#define SYNCIT __syncthreads() + +static const int NUM_SMS = 16; +static const int NUM_THREADS_PER_SM = 192; +static const int NUM_THREADS_PER_BLOCK = 64; +//static const int NUM_THREADS = NUM_THREADS_PER_SM * NUM_SMS; +static const int NUM_BLOCKS = (NUM_THREADS_PER_SM / NUM_THREADS_PER_BLOCK) * NUM_SMS; +static const int RADIX = 8; // Number of bits per radix sort pass +static const int RADICES = 1 << RADIX; // Number of radices +static const int RADIXMASK = RADICES - 1; // Mask for each radix sort pass +#if SIXTEEN +static const int RADIXBITS = 16; // Number of bits to sort over +#else +static const int RADIXBITS = 32; // Number of bits to sort over +#endif +static const int RADIXTHREADS = 16; // Number of threads sharing each radix counter +static const int RADIXGROUPS = NUM_THREADS_PER_BLOCK / RADIXTHREADS; // Number of radix groups per CTA +static const int TOTALRADIXGROUPS = NUM_BLOCKS * RADIXGROUPS; // Number of radix groups for each radix +static const int SORTRADIXGROUPS = TOTALRADIXGROUPS * RADICES; // Total radix count +static const int GRFELEMENTS = (NUM_THREADS_PER_BLOCK / RADIXTHREADS) * RADICES; +static const int GRFSIZE = GRFELEMENTS * sizeof(uint); + +// Prefix sum variables +static const int PREFIX_NUM_THREADS_PER_SM = NUM_THREADS_PER_SM; +static const int PREFIX_NUM_THREADS_PER_BLOCK = PREFIX_NUM_THREADS_PER_SM; +static const int PREFIX_NUM_BLOCKS = (PREFIX_NUM_THREADS_PER_SM / PREFIX_NUM_THREADS_PER_BLOCK) * NUM_SMS; +static const int PREFIX_BLOCKSIZE = SORTRADIXGROUPS / PREFIX_NUM_BLOCKS; +static const int PREFIX_GRFELEMENTS = PREFIX_BLOCKSIZE + 2 * PREFIX_NUM_THREADS_PER_BLOCK; +static const int PREFIX_GRFSIZE = PREFIX_GRFELEMENTS * sizeof(uint); + +// Shuffle variables +static const int SHUFFLE_GRFOFFSET = RADIXGROUPS * RADICES; +static const int SHUFFLE_GRFELEMENTS = SHUFFLE_GRFOFFSET + PREFIX_NUM_BLOCKS; +static const int SHUFFLE_GRFSIZE = SHUFFLE_GRFELEMENTS * sizeof(uint); + + +#define SDATA( index) CUT_BANK_CHECKER(sdata, index) + +// Prefix sum data +uint gRadixSum[TOTALRADIXGROUPS * RADICES]; +__device__ uint dRadixSum[TOTALRADIXGROUPS * RADICES]; +uint gRadixBlockSum[PREFIX_NUM_BLOCKS]; +__device__ uint dRadixBlockSum[PREFIX_NUM_BLOCKS]; + +extern __shared__ uint sRadixSum[]; + + + +//////////////////////////////////////////////////////////////////////////////// +//! Perform a radix sum on the list to be sorted. Each SM holds a set of +//! radix counters for each group of RADIXGROUPS thread in the GRF. +//! +//! @param pData input data +//! @param elements total number of elements +//! @param elements_rounded_to_3072 total number of elements rounded up to the +//! nearest multiple of 3072 +//! @param shift the shift (0 to 24) that we are using to obtain the correct +//! byte +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixSum(KeyValuePair *pData, uint elements, uint elements_rounded_to_3072, uint shift) +{ + uint pos = threadIdx.x; + + // Zero radix counts + while (pos < GRFELEMENTS) + { + sRadixSum[pos] = 0; + pos += NUM_THREADS_PER_BLOCK; + } + + // Sum up data + // Source addresses computed so that each thread is reading from a block of + // consecutive addresses so there are no conflicts between threads + // They then loop over their combined region and the next batch works elsewhere. + // So threads 0 to 16 work on memory 0 to 320. + // First reading 0,1,2,3...15 then 16,17,18,19...31 and so on + // optimising parallel access to shared memory by a thread accessing 16*threadID + // The next radix group runs from 320 to 640 and the same applies in that region + uint tmod = threadIdx.x % RADIXTHREADS; + uint tpos = threadIdx.x / RADIXTHREADS; + + // Take the rounded element list size so that all threads have a certain size dataset to work with + // and no zero size datasets confusing the issue + // By using a multiple of 3072 we ensure that all threads have elements + // to work with until the last phase, at which point we individually test + uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; + + // Generate range + // Note that it is possible for both pos and end to be past the end of the element set + // which will be caught later. + pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; + uint end = pos + element_fraction; + pos += tmod; + //printf("pos: %d\n", pos); + __syncthreads(); + + while (pos < end ) + { + uint key = 0; + + // Read first data element if we are in the set of elements + //if( pos < elements ) + //key = pData[pos].key; + KeyValuePair kvp; + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + kvp = pData[pos]; + else + kvp.key = 0; + key = kvp.key; + + + // Calculate position of radix counter to increment + // There are RADICES radices in each pass (256) + // and hence this many counters for bin grouping + // Multiply by RADIXGROUPS (4) to spread through memory + // and into 4 radix groups + uint p = ((key >> shift) & RADIXMASK) * RADIXGROUPS; + + // Increment radix counters + // Each radix group has its own set of counters + // so we add the thread position [0-3], ie the group index. + // We slow down here and take at least 16 cycles to write to the summation boxes + // but other groups will only conflict with themselves and so can also be writing + // 16 cycles here at least avoids retries. + uint ppos = p + tpos; + + // If we are past the last element we don't want to do anything + // We do have to check each time, however, to ensure that all + // threads sync on each sync here. + if (tmod == 0 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 1 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 2 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 3 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 4 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 5 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 6 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 7 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 8 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 9 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 10 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 11 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 12 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 13 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 14 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 15 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + + pos += RADIXTHREADS; + + } + + __syncthreads(); + + __syncthreads(); + + // Output radix sums into separate memory regions for each radix group + // So this memory then is layed out: + // 0...... 192..... 384 ................ 192*256 + // ie all 256 bins for each radix group + // in there: + // 0.............192 + // 0 4 8 12... - block idx * 4 + // And in the block boxes we see the 4 radix groups for that block + // So 0-192 should contain bin 0 for each radix group, and so on + uint offset = blockIdx.x * RADIXGROUPS; + uint row = threadIdx.x / RADIXGROUPS; + uint column = threadIdx.x % RADIXGROUPS; + while (row < RADICES) + { + dRadixSum[offset + row * TOTALRADIXGROUPS + column] = sRadixSum[row * RADIXGROUPS + column]; + row += NUM_THREADS_PER_BLOCK / RADIXGROUPS; + } +} + +//////////////////////////////////////////////////////////////////////////////// +//! Performs first part of parallel prefix sum - individual sums of each radix +//! count. By the end of this we have prefix sums on a block level in dRadixSum +//! and totals for blocks in dRadixBlockSum. +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixPrefixSum() +{ + // Read radix groups in offset by one in the GRF so a zero can be inserted at the beginning + // and the final sum of all radix counts summed here is tacked onto the end for reading by + // the next stage + // Each block in this case is the full number of threads per SM (and hence the total number + // of radix groups), 192. We should then have the total set of offsets for an entire radix + // group by the end of this stage + // Device mem addressing + + uint brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); + uint drow = threadIdx.x / TOTALRADIXGROUPS; // In default parameterisation this is always 0 + uint dcolumn = threadIdx.x % TOTALRADIXGROUPS; // And similarly this is always the same as threadIdx.x + uint dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn; + uint end = ((blockIdx.x + 1) * (RADICES / PREFIX_NUM_BLOCKS)) * TOTALRADIXGROUPS; + // Shared mem addressing + uint srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; + + // Read (RADICES / PREFIX_NUM_BLOCKS) radix counts into the GRF alongside each other + while (dpos < end) + { + sRadixSum[spos] = dRadixSum[dpos]; + spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; + } + __syncthreads(); + + // Perform preliminary sum on each thread's stretch of data + // Each thread having a block of 16, with spacers between 0...16 18...33 and so on + int pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint sum = 0; + while (pos < end) + { + sum += sRadixSum[pos]; + sRadixSum[pos] = sum; + pos++; + } + __syncthreads(); + + + // Calculate internal offsets by performing a more traditional parallel + // prefix sum of the topmost member of each thread's work data. Right now, + // these are stored between the work data for each thread, allowing us to + // eliminate GRF conflicts as well as hold the offsets needed to complete the sum + // In other words we have: + // 0....15 16 17....32 33 34.... + // Where this first stage updates the intermediate values (so 16=15, 33=32 etc) + int m = (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + sRadixSum[pos] = sRadixSum[pos - 1]; + __syncthreads(); + // This stage then performs a parallel prefix sum (ie use powers of 2 to propagate in log n stages) + // to update 17, 34 etc with the totals to that point (so 34 becomes [34] + [17]) and so on. + while (m < PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1)) + { + int p = pos - m; + uint t = ((p > 0) ? sRadixSum[p] : 0); + __syncthreads(); + sRadixSum[pos] += t; + __syncthreads(); + m *= 2; + } + __syncthreads(); + + + + // Add internal offsets to each thread's work data. + // So now we take 17 and add it to all values 18 to 33 so all offsets for that block + // are updated. + pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + int p = pos - 1; + sum = ((p > 0) ? sRadixSum[p] : 0); + while (pos < end) + { + sRadixSum[pos] += sum; + pos++; + } + __syncthreads(); + + // Write summed data back out to global memory in the same way as we read it in + // We now have prefix sum values internal to groups + brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); + drow = threadIdx.x / TOTALRADIXGROUPS; + dcolumn = threadIdx.x % TOTALRADIXGROUPS; + srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn + 1; + spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; + end = ((blockIdx.x + 1) * RADICES / PREFIX_NUM_BLOCKS) * TOTALRADIXGROUPS; + while (dpos < end) + { + dRadixSum[dpos] = sRadixSum[spos]; + dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; + spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + } + + // Write last element to summation + // Storing block sums in a separate array + if (threadIdx.x == 0) { + dRadixBlockSum[blockIdx.x] = sRadixSum[PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) - 1]; + dRadixSum[blockIdx.x * PREFIX_BLOCKSIZE] = 0; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +//! Initially perform prefix sum of block totals to obtain final set of offsets. +//! Then make use of radix sums to perform a shuffling of the data into the +//! correct bins. +//! +//! @param pSrc input data +//! @param pDst output data +//! @param elements total number of elements +//! @param shift the shift (0 to 24) that we are using to obtain the correct +//! byte +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixAddOffsetsAndShuffle(KeyValuePair* pSrc, KeyValuePair* pDst, uint elements, uint elements_rounded_to_3072, int shift) +{ + // Read offsets from previous blocks + if (threadIdx.x == 0) + sRadixSum[SHUFFLE_GRFOFFSET] = 0; + + if (threadIdx.x < PREFIX_NUM_BLOCKS - 1) + sRadixSum[SHUFFLE_GRFOFFSET + threadIdx.x + 1] = dRadixBlockSum[threadIdx.x]; + __syncthreads(); + + // Parallel prefix sum over block sums + int pos = threadIdx.x; + int n = 1; + while (n < PREFIX_NUM_BLOCKS) + { + int ppos = pos - n; + uint t0 = ((pos < PREFIX_NUM_BLOCKS) && (ppos >= 0)) ? sRadixSum[SHUFFLE_GRFOFFSET + ppos] : 0; + __syncthreads(); + if (pos < PREFIX_NUM_BLOCKS) + sRadixSum[SHUFFLE_GRFOFFSET + pos] += t0; + __syncthreads(); + n *= 2; + } + + // Read radix count data and add appropriate block offset + // for each radix at the memory location for this thread + // (where the other threads in the block will be reading + // as well, hence the large stride). + // There is one counter box per radix group per radix + // per block (4*256*3) + // We use 64 threads to read the 4 radix groups set of radices + // for the block. + int row = threadIdx.x / RADIXGROUPS; + int column = threadIdx.x % RADIXGROUPS; + int spos = row * RADIXGROUPS + column; + int dpos = row * TOTALRADIXGROUPS + column + blockIdx.x * RADIXGROUPS; + while (spos < SHUFFLE_GRFOFFSET) + { + sRadixSum[spos] = dRadixSum[dpos] + sRadixSum[SHUFFLE_GRFOFFSET + dpos / (TOTALRADIXGROUPS * RADICES / PREFIX_NUM_BLOCKS)]; + spos += NUM_THREADS_PER_BLOCK; + dpos += (NUM_THREADS_PER_BLOCK / RADIXGROUPS) * TOTALRADIXGROUPS; + } + __syncthreads(); + + //int pos; + // Shuffle data + // Each of the subbins for a block should be filled via the counters, properly interleaved + // Then, as we now iterate over each data value, we increment the subbins (each thread in the + // radix group in turn to avoid miss writes due to conflicts) and set locations correctly. + uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; + int tmod = threadIdx.x % RADIXTHREADS; + int tpos = threadIdx.x / RADIXTHREADS; + + pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; + uint end = pos + element_fraction; //(blockIdx.x * RADIXGROUPS + tpos + 1) * element_fraction; + pos += tmod; + + __syncthreads(); + + while (pos < end ) + { + KeyValuePair kvp; +#if 1 // old load + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + { + kvp = pSrc[pos]; + } + else + kvp.key = 0; + +#else // casting to float2 to get it to combine loads + int2 kvpf2; + + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + { + // kvp = pSrc[pos]; + kvpf2 = ((int2*)pSrc)[pos]; + // printf("kvp: %f %f kvpf2: %f %f\n", kvp.key, kvp.value, kvpf2.x, kvpf2.y); + } + else + //kvp.key = 0; + kvpf2.x = 0; + + kvp.key = kvpf2.x; + kvp.value = kvpf2.y; +#endif + + uint index; + + // Calculate position of radix counter to increment + uint p = ((kvp.key >> shift) & RADIXMASK) * RADIXGROUPS; + + // Move data, keeping counts updated. + // Increment radix counters, relying on hexadecathread + // warp to prevent this code from stepping all over itself. + uint ppos = p + tpos; + if (tmod == 0 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 1 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 2 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 3 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 4 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 5 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 6 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 7 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 8 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 9 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 10 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 11 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 12 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 13 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 14 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 15 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + + pos += RADIXTHREADS; + } + + __syncthreads(); +} + +#endif // #ifndef _RADIXSORT_KERNEL_H_ diff --git a/Extras/sph/fluids_2005.sln b/Extras/sph/fluids_2005.sln index 571b06ff0..a49be243d 100644 --- a/Extras/sph/fluids_2005.sln +++ b/Extras/sph/fluids_2005.sln @@ -1,23 +1,23 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fluids_2005", "fluids_2005.vcproj", "{644E4AC1-416D-4567-A68B-D66CA9FCFD9C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - EmuDebug|Win32 = EmuDebug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Debug|Win32.ActiveCfg = Debug|Win32 - {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Debug|Win32.Build.0 = Debug|Win32 - {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.EmuDebug|Win32.ActiveCfg = EmuDebug|Win32 - {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.EmuDebug|Win32.Build.0 = EmuDebug|Win32 - {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Release|Win32.ActiveCfg = Release|Win32 - {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fluids_2005", "fluids_2005.vcproj", "{644E4AC1-416D-4567-A68B-D66CA9FCFD9C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + EmuDebug|Win32 = EmuDebug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Debug|Win32.ActiveCfg = Debug|Win32 + {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Debug|Win32.Build.0 = Debug|Win32 + {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.EmuDebug|Win32.ActiveCfg = EmuDebug|Win32 + {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.EmuDebug|Win32.Build.0 = EmuDebug|Win32 + {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Release|Win32.ActiveCfg = Release|Win32 + {644E4AC1-416D-4567-A68B-D66CA9FCFD9C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Extras/sph/fluids_2005.vcproj b/Extras/sph/fluids_2005.vcproj index 548dce016..b0b7a4d95 100644 --- a/Extras/sph/fluids_2005.vcproj +++ b/Extras/sph/fluids_2005.vcproj @@ -1,447 +1,447 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extras/sph/main.cpp b/Extras/sph/main.cpp index 8feefbd4a..21336d261 100644 --- a/Extras/sph/main.cpp +++ b/Extras/sph/main.cpp @@ -1,594 +1,594 @@ -/* - FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU - Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com - - ZLib license - 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 -#include -#include -#include - -#include "common_defs.h" - -#ifdef BUILD_CUDA - #include "fluid_system_host.cuh" -#endif -#include "fluid_system.h" -#include "gl_helper.h" - -#ifdef _MSC_VER // Windows - #include -#else // Linux - #include -#endif - -bool bTiming = false; -bool bRec = false; -int mFrame = 0; - -// Globals -FluidSystem psys; - -float window_width = 1024; -float window_height = 768; - -Vector3DF cam_from, cam_angs, cam_to; // Camera stuff -Vector3DF obj_from, obj_angs, obj_dang; -Vector3DF light[2], light_to[2]; // Light stuff -float light_fov, cam_fov; - -int psys_rate = 0; // Particle stuff -int psys_freq = 1; -int psys_demo = 0; -int psys_nmax = 4096; - -bool bHelp = false; // Toggles -int iShade = 1; -int iClrMode = 0; -bool bPntDraw = false; -bool bPause = false; - -// View matricies -float view_matrix[16]; // View matrix (V) -float model_matrix[16]; // Model matrix (M) -float proj_matrix[16]; // Projective matrix - -// Mouse control -#define DRAG_OFF 0 // mouse states -#define DRAG_LEFT 1 -#define DRAG_RIGHT 2 -int last_x = -1, last_y = -1; // mouse vars -int mode = 0; -int dragging = 0; -int psel; - -GLuint screen_id; -GLuint depth_id; - - -// Different things we can move around -#define MODE_CAM 0 -#define MODE_CAM_TO 1 -#define MODE_OBJ 2 -#define MODE_OBJPOS 3 -#define MODE_OBJGRP 4 -#define MODE_LIGHTPOS 5 - -#define MODE_DOF 6 - -GLuint screenBufferObject; -GLuint depthBufferObject; -GLuint envid; - -void drawScene ( float* viewmat, bool bShade ) -{ - if ( iShade <= 1 && bShade ) { - glEnable ( GL_LIGHT0 ); - GLfloat diff[4]; - GLfloat spec[4]; - GLfloat shininess = 60.0; - - diff[0] = 0.8f; diff[1] = 0.8f; diff[2] = 0.8f; diff[3] = 1.0f; - spec[0] = 1.0f; spec[1] = 1.0f; spec[2] = 1.0f; spec[3] = 1.0f; - glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, &diff[0]); - glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, &spec[0]); - glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, &shininess); - glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); - - glColor3f ( 1, 1, 1 ); - glLoadMatrixf ( viewmat ); - glBegin ( GL_QUADS ); - glNormal3f ( 0, 0, 1 ); - glVertex3f ( -1000, -1000, 0.0 ); - glVertex3f ( 1000, -1000, 0.0 ); - glVertex3f ( 1000, 1000, 0.0 ); - glVertex3f ( -1000, 1000, 0.0 ); - glEnd (); - glBegin ( GL_LINES ); - for (float n=-100; n <= 100; n += 20.0 ) { - glVertex3f ( -100, n, 0.1 ); - glVertex3f ( 100, n, 0.1 ); - glVertex3f ( n, -100, 0.1 ); - glVertex3f ( n, 100, 0.1 ); - } - glEnd (); - - psys.Draw ( &viewmat[0], 0.8 ); // Draw particles - - } else { - glDisable ( GL_LIGHTING ); - psys.Draw ( &viewmat[0], 0.55 ); // Draw particles - } -} - -void draw2D () -{ - - mint::Time start, stop; - - #ifdef USE_SHADOWS - disableShadows (); - #endif - glDisable ( GL_LIGHTING ); - glDisable ( GL_DEPTH_TEST ); - - glMatrixMode ( GL_PROJECTION ); - glLoadIdentity (); - glScalef ( 2.0/window_width, -2.0/window_height, 1 ); // Setup view (0,0) to (800,600) - glTranslatef ( -window_width/2.0, -window_height/2, 0.0); - - glMatrixMode ( GL_MODELVIEW ); - glLoadIdentity (); - glPushMatrix (); - glGetFloatv ( GL_MODELVIEW_MATRIX, view_matrix ); - glPopMatrix (); - - char disp[200]; - glColor4f ( 1.0, 1.0, 1.0, 1.0 ); - - strcpy ( disp, "Press H for help." ); drawText ( 10, 20, disp ); - - if ( bHelp ) { - - if ( psys.GetToggle ( USE_CUDA ) ) { - sprintf ( disp, "Kernel: USING CUDA (GPU)" ); drawText ( 20, 40, disp ); - } else { - sprintf ( disp, "Kernel: USING CPU" ); drawText ( 20, 40, disp ); - } - - sprintf ( disp, "KEYBOARD" ); drawText ( 20, 60, disp ); - sprintf ( disp, "[ ] Next/Prev Demo" ); drawText ( 20, 70, disp ); - sprintf ( disp, "N M Adjust Max Particles" ); drawText ( 20, 80, disp ); - sprintf ( disp, "space Pause" ); drawText ( 20, 90, disp ); - sprintf ( disp, "S Shading mode" ); drawText ( 20, 100, disp ); - sprintf ( disp, "G Toggle CUDA vs CPU" ); drawText ( 20, 110, disp ); - sprintf ( disp, "< > Change emitter rate" ); drawText ( 20, 120, disp ); - sprintf ( disp, "C Move camera /w mouse" ); drawText ( 20, 130, disp ); - sprintf ( disp, "I Move emitter /w mouse" ); drawText ( 20, 140, disp ); - sprintf ( disp, "O Change emitter angle" ); drawText ( 20, 150, disp ); - sprintf ( disp, "L Move light /w mouse" ); drawText ( 20, 160, disp ); - sprintf ( disp, "X Draw velocity/pressure/color" ); drawText ( 20, 170, disp ); - - Vector3DF vol = psys.GetVec(SPH_VOLMAX); - vol -= psys.GetVec(SPH_VOLMIN); - sprintf ( disp, "Volume Size: %3.5f %3.2f %3.2f", vol.x, vol.y, vol.z ); drawText ( 20, 190, disp ); - sprintf ( disp, "Time Step (dt): %3.5f", psys.GetDT () ); drawText ( 20, 200, disp ); - sprintf ( disp, "Num Particles: %d", psys.NumPoints() ); drawText ( 20, 210, disp ); - sprintf ( disp, "Simulation Scale: %3.5f", psys.GetParam(SPH_SIMSIZE) ); drawText ( 20, 220, disp ); - sprintf ( disp, "Simulation Size (m): %3.5f", psys.GetParam(SPH_SIMSCALE) ); drawText ( 20, 230, disp ); - sprintf ( disp, "Smooth Radius (m): %3.3f", psys.GetParam(SPH_SMOOTHRADIUS) ); drawText ( 20, 240, disp ); - sprintf ( disp, "Particle Radius (m): %3.3f", psys.GetParam(SPH_PRADIUS) ); drawText ( 20, 250, disp ); - sprintf ( disp, "Particle Mass (kg): %0.8f", psys.GetParam(SPH_PMASS) ); drawText ( 20, 260, disp ); - sprintf ( disp, "Rest Density (kg/m^3): %3.3f", psys.GetParam(SPH_RESTDENSITY) ); drawText ( 20, 270, disp ); - sprintf ( disp, "Viscosity: %3.3f", psys.GetParam(SPH_VISC) ); drawText ( 20, 280, disp ); - sprintf ( disp, "Internal Stiffness: %3.3f", psys.GetParam(SPH_INTSTIFF) ); drawText ( 20, 290, disp ); - sprintf ( disp, "Boundary Stiffness: %6.0f", psys.GetParam(SPH_EXTSTIFF) ); drawText ( 20, 300, disp ); - sprintf ( disp, "Boundary Dampening: %4.3f", psys.GetParam(SPH_EXTDAMP) ); drawText ( 20, 310, disp ); - sprintf ( disp, "Speed Limiting: %4.3f", psys.GetParam(SPH_LIMIT) ); drawText ( 20, 320, disp ); - vol = psys.GetVec ( PLANE_GRAV_DIR ); - sprintf ( disp, "Gravity: %3.2f %3.2f %3.2f", vol.x, vol.y, vol.z ); drawText ( 20, 330, disp ); - } -} - -void computeFromPositions () -{ - cam_from.x = cam_to.x + sin( cam_angs.x * DEGtoRAD) * sin( cam_angs.y * DEGtoRAD) * cam_angs.z; - cam_from.y = cam_to.y + -cos( cam_angs.x * DEGtoRAD) * sin( cam_angs.y * DEGtoRAD) * cam_angs.z; - cam_from.z = cam_to.z + cos( cam_angs.y * DEGtoRAD) * cam_angs.z; -} - -void computeProjection () -{ - // ---- Create projection matrix for eye-coordinate transformations - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - gluPerspective ( cam_fov, window_width / ( float ) window_height, 10.0, 800.0 ); - glPushMatrix (); - glGetFloatv ( GL_MODELVIEW_MATRIX, proj_matrix ); - glPopMatrix (); -} - -void computeView () -{ - glMatrixMode ( GL_MODELVIEW ); - glLoadIdentity (); - gluLookAt ( cam_from.x, cam_from.y, cam_from.z, cam_to.x, cam_to.y, cam_to.z, 0, 0, 1 ); - glPushMatrix (); - glGetFloatv ( GL_MODELVIEW_MATRIX, view_matrix ); - glPopMatrix (); -} - -int frame; - -void display () -{ - mint::Time start, stop; - -// iso = sin(frame*0.01f ); - - // Do simulation! - if ( !bPause ) psys.Run (); - - frame++; - measureFPS (); - - glEnable ( GL_DEPTH_TEST ); - - // Render depth map shadows - start.SetSystemTime ( ACC_NSEC ); - disableShadows (); - #ifdef USE_SHADOWS - if ( iShade==1 ) { - renderDepthMap_FrameBuffer ( 0, window_width, window_height ); - } else { - renderDepthMap_Clear ( window_width, window_height ); - } - #endif - - // Clear frame buffer - if ( iShade<=1 ) glClearColor( 0.29, 0.29, 0.29, 1.0 ); - else glClearColor ( 0, 0, 0, 0 ); - glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - glDisable ( GL_CULL_FACE ); - glShadeModel ( GL_SMOOTH ); - - // Compute camera view - computeFromPositions (); - computeProjection (); - computeView (); - - // Draw Shadows (if on) - #ifdef USE_SHADOWS - if ( iShade==1 ) renderShadows ( view_matrix ); - #endif - - // Draw 3D - start.SetSystemTime ( ACC_NSEC ); - glEnable ( GL_LIGHTING ); - glLoadMatrixf ( view_matrix ); - drawScene ( view_matrix, true ); - if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "SCENE: %s\n", stop.GetReadableTime().c_str() ); } - - // Draw 2D overlay - draw2D (); - - // Swap buffers - glutSwapBuffers(); - glutPostRedisplay(); -} - -void reshape ( int width, int height ) -{ - // set window height and width - window_width = (float) width; - window_height = (float) height; - glViewport( 0, 0, width, height ); -} - -void UpdateEmit () -{ - obj_from = psys.GetVec ( EMIT_POS ); - obj_angs = psys.GetVec ( EMIT_ANG ); - obj_dang = psys.GetVec ( EMIT_RATE ); -} - - -void keyboard_func ( unsigned char key, int x, int y ) -{ - switch( key ) { - case 'M': case 'm': { - psys_nmax *= 2; - if ( psys_nmax > 65535 ) psys_nmax = 65535; - psys.SPH_CreateExample ( psys_demo, psys_nmax ); - } break; - case 'N': case 'n': { - psys_nmax /= 2; - if ( psys_nmax < 64 ) psys_nmax = 64; - psys.SPH_CreateExample ( psys_demo, psys_nmax ); - } break; - case '0': - UpdateEmit (); - psys_freq++; - psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); - break; - case '9': - UpdateEmit (); - psys_freq--; if ( psys_freq < 0 ) psys_freq = 0; - psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); - break; - case '.': case '>': - UpdateEmit (); - if ( ++psys_rate > 100 ) psys_rate = 100; - psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); - break; - case ',': case '<': - UpdateEmit (); - if ( --psys_rate < 0 ) psys_rate = 0; - psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); - break; - case 'g': case 'G': psys.Toggle ( USE_CUDA ); break; - case 'f': case 'F': mode = MODE_DOF; break; - - case 'z': case 'Z': mode = MODE_CAM_TO; break; - case 'c': case 'C': mode = MODE_CAM; break; - case 'h': case 'H': bHelp = !bHelp; break; - case 'i': case 'I': - UpdateEmit (); - mode = MODE_OBJPOS; - break; - case 'o': case 'O': - UpdateEmit (); - mode = MODE_OBJ; - break; - case 'x': case 'X': - if ( ++iClrMode > 2) iClrMode = 0; - psys.SetParam ( CLR_MODE, iClrMode ); - break; - case 'l': case 'L': mode = MODE_LIGHTPOS; break; - case 'd': case 'D': { - int d = psys.GetParam ( PNT_DRAWMODE ) + 1; - if ( d > 2 ) d = 0; - psys.SetParam ( PNT_DRAWMODE, d ); - } break; - case 's': case 'S': if ( ++iShade > 2 ) iShade = 0; break; - case 27: exit( 0 ); break; - - case '`': - bRec = !bRec; break; - - case ' ': - //psys.Run (); ptris.Rebuild (); break; - bPause = !bPause; break; - - case '\'': case ';': psys.SPH_CreateExample ( psys_demo, psys_nmax ); break; - case 'r': case 'R': psys.SPH_CreateExample ( psys_demo, psys_nmax ); break; - case '[': - psys_demo--; - if (psys_demo < 0 ) psys_demo = 10; - psys.SPH_CreateExample ( psys_demo, psys_nmax ); - UpdateEmit (); - break; - case ']': - psys_demo++; - if (psys_demo > 10 ) psys_demo = 0; - psys.SPH_CreateExample ( psys_demo, psys_nmax ); - UpdateEmit (); - break; - default: - break; - } -} - - -void mouse_click_func ( int button, int state, int x, int y ) -{ - if( state == GLUT_DOWN ) { - if ( button == GLUT_LEFT_BUTTON ) dragging = DRAG_LEFT; - else if ( button == GLUT_RIGHT_BUTTON ) dragging = DRAG_RIGHT; - last_x = x; - last_y = y; - } else { - dragging = DRAG_OFF; - } -} - -void mouse_move_func ( int x, int y ) -{ - int dx = x - last_x; - int dy = y - last_y; - - switch ( mode ) { - case MODE_CAM: - if ( dragging == DRAG_LEFT ) { - cam_angs.x += dx; - cam_angs.y += dy; - if ( cam_angs.x >= 360.0 ) cam_angs.x -= 360.0; - if ( cam_angs.x < 0 ) cam_angs.x += 360.0; - if ( cam_angs.y >= 180.0 ) cam_angs.y = 180.0; - if ( cam_angs.y <= -180.0 ) cam_angs.y = -180.0; - printf ( "Cam Ang: %f %f %f\n", cam_angs.x, cam_angs.y, cam_angs.z ); - printf ( "Cam To: %f %f %f\n", cam_to.x, cam_to.y, cam_to.z ); - printf ( "Cam FOV: %f\n", cam_fov); - } else if ( dragging == DRAG_RIGHT ) { - cam_angs.z += dy*.15; - if ( cam_angs.z < 0) cam_angs.z = 0; - printf ( "Cam Ang: %f %f %f\n", cam_angs.x, cam_angs.y, cam_angs.z ); - printf ( "Cam To: %f %f %f\n", cam_to.x, cam_to.y, cam_to.z ); - printf ( "Cam FOV: %f\n", cam_fov ); - } - break; - case MODE_CAM_TO: - if ( dragging == DRAG_LEFT ) { - cam_to.x += dx; - cam_to.y += dy; - } else if ( dragging == DRAG_RIGHT ) { - cam_to.z += dy*.05; - if ( cam_to.z < 0) cam_to.z = 0; - } - break; - case MODE_OBJ: - if ( dragging == DRAG_LEFT ) { - obj_angs.x -= dx*0.1; - obj_angs.y += dy*0.1; - printf ( "Obj Angs: %f %f %f\n", obj_angs.x, obj_angs.y, obj_angs.z ); - //force_x += dx*.1; - //force_y += dy*.1; - } else if (dragging == DRAG_RIGHT) { - obj_angs.z -= dy*.005; - printf ( "Obj Angs: %f %f %f\n", obj_angs.x, obj_angs.y, obj_angs.z ); - } - psys.SetVec ( EMIT_ANG, Vector3DF ( obj_angs.x, obj_angs.y, obj_angs.z ) ); - break; - case MODE_OBJPOS: - if ( dragging == DRAG_LEFT ) { - obj_from.x -= dx*.1; - obj_from.y += dy*.1; - printf ( "Obj: %f %f %f\n", obj_from.x, obj_from.y, obj_from.z ); - } else if (dragging == DRAG_RIGHT) { - obj_from.z -= dy*.1; - printf ( "Obj: %f %f %f\n", obj_from.x, obj_from.y, obj_from.z ); - } - psys.SetVec ( EMIT_POS, Vector3DF ( obj_from.x, obj_from.y, obj_from.z ) ); - //psys.setPos ( obj_x, obj_y, obj_z, obj_ang, obj_tilt, obj_dist ); - break; - case MODE_LIGHTPOS: - if ( dragging == DRAG_LEFT ) { - light[0].x -= dx*.1; - light[0].y += dy*.1; - printf ( "Light: %f %f %f\n", light[0].x, light[0].y, light[0].z ); - } else if (dragging == DRAG_RIGHT) { - light[0].z -= dy*.1; - printf ( "Light: %f %f %f\n", light[0].x, light[0].y, light[0].z ); - } - #ifdef USE_SHADOWS - setShadowLight ( light[0].x, light[0].y, light[0].z, light_to[0].x, light_to[0].y, light_to[0].z, light_fov ); - #endif - break; - } - - if ( x < 10 || y < 10 || x > 1000 || y > 700 ) { - glutWarpPointer ( 1024/2, 768/2 ); - last_x = 1024/2; - last_y = 768/2; - } else { - last_x = x; - last_y = y; - } -} - - -void idle_func () -{ -} - -void init () -{ - - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); - - srand ( time ( 0x0 ) ); - - glClearColor( 0.49, 0.49, 0.49, 1.0 ); - glShadeModel( GL_SMOOTH ); - - glEnable ( GL_COLOR_MATERIAL ); - glEnable (GL_DEPTH_TEST); - glEnable (GL_BLEND); - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDepthMask ( 1 ); - glEnable ( GL_TEXTURE_2D ); - - // callbacks - glutDisplayFunc( display ); - glutReshapeFunc( reshape ); - glutKeyboardFunc( keyboard_func ); - glutMouseFunc( mouse_click_func ); - glutMotionFunc( mouse_move_func ); - glutIdleFunc( idle_func ); - glutSetCursor ( GLUT_CURSOR_NONE ); - - cam_angs.x = 29; cam_angs.y = 75; cam_angs.z = 80.0; - cam_to.x = 0; cam_to.y = 0; cam_to.z = 5; - cam_fov = 35.0; - - light[0].x = 39; light[0].y = -60; light[0].z = 43; - light_to[0].x = 0; light_to[0].y = 0; light_to[0].z = 0; - - light[1].x = 15; light[1].y = -5; light[1].z = 145; - light_to[1].x = 0; light_to[1].y = 0; light_to[1].z = 0; - - light_fov = 45; - - #ifdef USE_SHADOWS - createShadowTextures(); - createFrameBuffer (); - setShadowLight ( light[0].x, light[0].y, light[0].z, light_to[0].x, light_to[0].y, light_to[0].z, light_fov ); - setShadowLightColor ( .7, .7, .7, 0.2, 0.2, 0.2 ); - #endif - - obj_from.x = 0; obj_from.y = 0; obj_from.z = 20; // emitter - obj_angs.x = 118.7; obj_angs.y = 200; obj_angs.z = 1.0; - obj_dang.x = 1; obj_dang.y = 1; obj_dang.z = 0; - - psys.Initialize ( BFLUID, psys_nmax ); - psys.SPH_CreateExample ( 0, psys_nmax ); - psys.SetVec ( EMIT_ANG, Vector3DF ( obj_angs.x, obj_angs.y, obj_angs.z ) ); - psys.SetVec ( EMIT_POS, Vector3DF ( obj_from.x, obj_from.y, obj_from.z ) ); - - psys.SetParam ( PNT_DRAWMODE, int(bPntDraw ? 1:0) ); - psys.SetParam ( CLR_MODE, iClrMode ); -} - - -int main ( int argc, char **argv ) -{ - #ifdef BUILD_CUDA - // Initialize CUDA - cudaInit( argc, argv ); - #endif - - // set up the window - glutInit( &argc, &argv[0] ); - glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); - glutInitWindowPosition( 100, 100 ); - glutInitWindowSize( (int) window_width, (int) window_height ); - glutCreateWindow ( "Fluids v.1 (c) 2008, R. Hoetzlein (ZLib)" ); - -// glutFullScreen (); - - // initialize parameters - init(); - - // wait for something to happen - glutMainLoop(); - - return 0; -} - -extern "C" { - void btCuda_exit(int val) - { - fprintf(stderr, "Press ENTER key to terminate the program\n"); - getchar(); - exit(val); - } +/* + FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU + Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com + + ZLib license + 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 +#include +#include +#include + +#include "common_defs.h" + +#ifdef BUILD_CUDA + #include "fluid_system_host.cuh" +#endif +#include "fluid_system.h" +#include "gl_helper.h" + +#ifdef _MSC_VER // Windows + #include +#else // Linux + #include +#endif + +bool bTiming = false; +bool bRec = false; +int mFrame = 0; + +// Globals +FluidSystem psys; + +float window_width = 1024; +float window_height = 768; + +Vector3DF cam_from, cam_angs, cam_to; // Camera stuff +Vector3DF obj_from, obj_angs, obj_dang; +Vector3DF light[2], light_to[2]; // Light stuff +float light_fov, cam_fov; + +int psys_rate = 0; // Particle stuff +int psys_freq = 1; +int psys_demo = 0; +int psys_nmax = 4096; + +bool bHelp = false; // Toggles +int iShade = 1; +int iClrMode = 0; +bool bPntDraw = false; +bool bPause = false; + +// View matricies +float view_matrix[16]; // View matrix (V) +float model_matrix[16]; // Model matrix (M) +float proj_matrix[16]; // Projective matrix + +// Mouse control +#define DRAG_OFF 0 // mouse states +#define DRAG_LEFT 1 +#define DRAG_RIGHT 2 +int last_x = -1, last_y = -1; // mouse vars +int mode = 0; +int dragging = 0; +int psel; + +GLuint screen_id; +GLuint depth_id; + + +// Different things we can move around +#define MODE_CAM 0 +#define MODE_CAM_TO 1 +#define MODE_OBJ 2 +#define MODE_OBJPOS 3 +#define MODE_OBJGRP 4 +#define MODE_LIGHTPOS 5 + +#define MODE_DOF 6 + +GLuint screenBufferObject; +GLuint depthBufferObject; +GLuint envid; + +void drawScene ( float* viewmat, bool bShade ) +{ + if ( iShade <= 1 && bShade ) { + glEnable ( GL_LIGHT0 ); + GLfloat diff[4]; + GLfloat spec[4]; + GLfloat shininess = 60.0; + + diff[0] = 0.8f; diff[1] = 0.8f; diff[2] = 0.8f; diff[3] = 1.0f; + spec[0] = 1.0f; spec[1] = 1.0f; spec[2] = 1.0f; spec[3] = 1.0f; + glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, &diff[0]); + glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, &spec[0]); + glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, &shininess); + glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); + + glColor3f ( 1, 1, 1 ); + glLoadMatrixf ( viewmat ); + glBegin ( GL_QUADS ); + glNormal3f ( 0, 0, 1 ); + glVertex3f ( -1000, -1000, 0.0 ); + glVertex3f ( 1000, -1000, 0.0 ); + glVertex3f ( 1000, 1000, 0.0 ); + glVertex3f ( -1000, 1000, 0.0 ); + glEnd (); + glBegin ( GL_LINES ); + for (float n=-100; n <= 100; n += 20.0 ) { + glVertex3f ( -100, n, 0.1 ); + glVertex3f ( 100, n, 0.1 ); + glVertex3f ( n, -100, 0.1 ); + glVertex3f ( n, 100, 0.1 ); + } + glEnd (); + + psys.Draw ( &viewmat[0], 0.8 ); // Draw particles + + } else { + glDisable ( GL_LIGHTING ); + psys.Draw ( &viewmat[0], 0.55 ); // Draw particles + } +} + +void draw2D () +{ + + mint::Time start, stop; + + #ifdef USE_SHADOWS + disableShadows (); + #endif + glDisable ( GL_LIGHTING ); + glDisable ( GL_DEPTH_TEST ); + + glMatrixMode ( GL_PROJECTION ); + glLoadIdentity (); + glScalef ( 2.0/window_width, -2.0/window_height, 1 ); // Setup view (0,0) to (800,600) + glTranslatef ( -window_width/2.0, -window_height/2, 0.0); + + glMatrixMode ( GL_MODELVIEW ); + glLoadIdentity (); + glPushMatrix (); + glGetFloatv ( GL_MODELVIEW_MATRIX, view_matrix ); + glPopMatrix (); + + char disp[200]; + glColor4f ( 1.0, 1.0, 1.0, 1.0 ); + + strcpy ( disp, "Press H for help." ); drawText ( 10, 20, disp ); + + if ( bHelp ) { + + if ( psys.GetToggle ( USE_CUDA ) ) { + sprintf ( disp, "Kernel: USING CUDA (GPU)" ); drawText ( 20, 40, disp ); + } else { + sprintf ( disp, "Kernel: USING CPU" ); drawText ( 20, 40, disp ); + } + + sprintf ( disp, "KEYBOARD" ); drawText ( 20, 60, disp ); + sprintf ( disp, "[ ] Next/Prev Demo" ); drawText ( 20, 70, disp ); + sprintf ( disp, "N M Adjust Max Particles" ); drawText ( 20, 80, disp ); + sprintf ( disp, "space Pause" ); drawText ( 20, 90, disp ); + sprintf ( disp, "S Shading mode" ); drawText ( 20, 100, disp ); + sprintf ( disp, "G Toggle CUDA vs CPU" ); drawText ( 20, 110, disp ); + sprintf ( disp, "< > Change emitter rate" ); drawText ( 20, 120, disp ); + sprintf ( disp, "C Move camera /w mouse" ); drawText ( 20, 130, disp ); + sprintf ( disp, "I Move emitter /w mouse" ); drawText ( 20, 140, disp ); + sprintf ( disp, "O Change emitter angle" ); drawText ( 20, 150, disp ); + sprintf ( disp, "L Move light /w mouse" ); drawText ( 20, 160, disp ); + sprintf ( disp, "X Draw velocity/pressure/color" ); drawText ( 20, 170, disp ); + + Vector3DF vol = psys.GetVec(SPH_VOLMAX); + vol -= psys.GetVec(SPH_VOLMIN); + sprintf ( disp, "Volume Size: %3.5f %3.2f %3.2f", vol.x, vol.y, vol.z ); drawText ( 20, 190, disp ); + sprintf ( disp, "Time Step (dt): %3.5f", psys.GetDT () ); drawText ( 20, 200, disp ); + sprintf ( disp, "Num Particles: %d", psys.NumPoints() ); drawText ( 20, 210, disp ); + sprintf ( disp, "Simulation Scale: %3.5f", psys.GetParam(SPH_SIMSIZE) ); drawText ( 20, 220, disp ); + sprintf ( disp, "Simulation Size (m): %3.5f", psys.GetParam(SPH_SIMSCALE) ); drawText ( 20, 230, disp ); + sprintf ( disp, "Smooth Radius (m): %3.3f", psys.GetParam(SPH_SMOOTHRADIUS) ); drawText ( 20, 240, disp ); + sprintf ( disp, "Particle Radius (m): %3.3f", psys.GetParam(SPH_PRADIUS) ); drawText ( 20, 250, disp ); + sprintf ( disp, "Particle Mass (kg): %0.8f", psys.GetParam(SPH_PMASS) ); drawText ( 20, 260, disp ); + sprintf ( disp, "Rest Density (kg/m^3): %3.3f", psys.GetParam(SPH_RESTDENSITY) ); drawText ( 20, 270, disp ); + sprintf ( disp, "Viscosity: %3.3f", psys.GetParam(SPH_VISC) ); drawText ( 20, 280, disp ); + sprintf ( disp, "Internal Stiffness: %3.3f", psys.GetParam(SPH_INTSTIFF) ); drawText ( 20, 290, disp ); + sprintf ( disp, "Boundary Stiffness: %6.0f", psys.GetParam(SPH_EXTSTIFF) ); drawText ( 20, 300, disp ); + sprintf ( disp, "Boundary Dampening: %4.3f", psys.GetParam(SPH_EXTDAMP) ); drawText ( 20, 310, disp ); + sprintf ( disp, "Speed Limiting: %4.3f", psys.GetParam(SPH_LIMIT) ); drawText ( 20, 320, disp ); + vol = psys.GetVec ( PLANE_GRAV_DIR ); + sprintf ( disp, "Gravity: %3.2f %3.2f %3.2f", vol.x, vol.y, vol.z ); drawText ( 20, 330, disp ); + } +} + +void computeFromPositions () +{ + cam_from.x = cam_to.x + sin( cam_angs.x * DEGtoRAD) * sin( cam_angs.y * DEGtoRAD) * cam_angs.z; + cam_from.y = cam_to.y + -cos( cam_angs.x * DEGtoRAD) * sin( cam_angs.y * DEGtoRAD) * cam_angs.z; + cam_from.z = cam_to.z + cos( cam_angs.y * DEGtoRAD) * cam_angs.z; +} + +void computeProjection () +{ + // ---- Create projection matrix for eye-coordinate transformations + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + gluPerspective ( cam_fov, window_width / ( float ) window_height, 10.0, 800.0 ); + glPushMatrix (); + glGetFloatv ( GL_MODELVIEW_MATRIX, proj_matrix ); + glPopMatrix (); +} + +void computeView () +{ + glMatrixMode ( GL_MODELVIEW ); + glLoadIdentity (); + gluLookAt ( cam_from.x, cam_from.y, cam_from.z, cam_to.x, cam_to.y, cam_to.z, 0, 0, 1 ); + glPushMatrix (); + glGetFloatv ( GL_MODELVIEW_MATRIX, view_matrix ); + glPopMatrix (); +} + +int frame; + +void display () +{ + mint::Time start, stop; + +// iso = sin(frame*0.01f ); + + // Do simulation! + if ( !bPause ) psys.Run (); + + frame++; + measureFPS (); + + glEnable ( GL_DEPTH_TEST ); + + // Render depth map shadows + start.SetSystemTime ( ACC_NSEC ); + disableShadows (); + #ifdef USE_SHADOWS + if ( iShade==1 ) { + renderDepthMap_FrameBuffer ( 0, window_width, window_height ); + } else { + renderDepthMap_Clear ( window_width, window_height ); + } + #endif + + // Clear frame buffer + if ( iShade<=1 ) glClearColor( 0.29, 0.29, 0.29, 1.0 ); + else glClearColor ( 0, 0, 0, 0 ); + glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glDisable ( GL_CULL_FACE ); + glShadeModel ( GL_SMOOTH ); + + // Compute camera view + computeFromPositions (); + computeProjection (); + computeView (); + + // Draw Shadows (if on) + #ifdef USE_SHADOWS + if ( iShade==1 ) renderShadows ( view_matrix ); + #endif + + // Draw 3D + start.SetSystemTime ( ACC_NSEC ); + glEnable ( GL_LIGHTING ); + glLoadMatrixf ( view_matrix ); + drawScene ( view_matrix, true ); + if ( bTiming) { stop.SetSystemTime ( ACC_NSEC ); stop = stop - start; printf ( "SCENE: %s\n", stop.GetReadableTime().c_str() ); } + + // Draw 2D overlay + draw2D (); + + // Swap buffers + glutSwapBuffers(); + glutPostRedisplay(); +} + +void reshape ( int width, int height ) +{ + // set window height and width + window_width = (float) width; + window_height = (float) height; + glViewport( 0, 0, width, height ); +} + +void UpdateEmit () +{ + obj_from = psys.GetVec ( EMIT_POS ); + obj_angs = psys.GetVec ( EMIT_ANG ); + obj_dang = psys.GetVec ( EMIT_RATE ); +} + + +void keyboard_func ( unsigned char key, int x, int y ) +{ + switch( key ) { + case 'M': case 'm': { + psys_nmax *= 2; + if ( psys_nmax > 65535 ) psys_nmax = 65535; + psys.SPH_CreateExample ( psys_demo, psys_nmax ); + } break; + case 'N': case 'n': { + psys_nmax /= 2; + if ( psys_nmax < 64 ) psys_nmax = 64; + psys.SPH_CreateExample ( psys_demo, psys_nmax ); + } break; + case '0': + UpdateEmit (); + psys_freq++; + psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); + break; + case '9': + UpdateEmit (); + psys_freq--; if ( psys_freq < 0 ) psys_freq = 0; + psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); + break; + case '.': case '>': + UpdateEmit (); + if ( ++psys_rate > 100 ) psys_rate = 100; + psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); + break; + case ',': case '<': + UpdateEmit (); + if ( --psys_rate < 0 ) psys_rate = 0; + psys.SetVec ( EMIT_RATE, Vector3DF(psys_freq, psys_rate, 0) ); + break; + case 'g': case 'G': psys.Toggle ( USE_CUDA ); break; + case 'f': case 'F': mode = MODE_DOF; break; + + case 'z': case 'Z': mode = MODE_CAM_TO; break; + case 'c': case 'C': mode = MODE_CAM; break; + case 'h': case 'H': bHelp = !bHelp; break; + case 'i': case 'I': + UpdateEmit (); + mode = MODE_OBJPOS; + break; + case 'o': case 'O': + UpdateEmit (); + mode = MODE_OBJ; + break; + case 'x': case 'X': + if ( ++iClrMode > 2) iClrMode = 0; + psys.SetParam ( CLR_MODE, iClrMode ); + break; + case 'l': case 'L': mode = MODE_LIGHTPOS; break; + case 'd': case 'D': { + int d = psys.GetParam ( PNT_DRAWMODE ) + 1; + if ( d > 2 ) d = 0; + psys.SetParam ( PNT_DRAWMODE, d ); + } break; + case 's': case 'S': if ( ++iShade > 2 ) iShade = 0; break; + case 27: exit( 0 ); break; + + case '`': + bRec = !bRec; break; + + case ' ': + //psys.Run (); ptris.Rebuild (); break; + bPause = !bPause; break; + + case '\'': case ';': psys.SPH_CreateExample ( psys_demo, psys_nmax ); break; + case 'r': case 'R': psys.SPH_CreateExample ( psys_demo, psys_nmax ); break; + case '[': + psys_demo--; + if (psys_demo < 0 ) psys_demo = 10; + psys.SPH_CreateExample ( psys_demo, psys_nmax ); + UpdateEmit (); + break; + case ']': + psys_demo++; + if (psys_demo > 10 ) psys_demo = 0; + psys.SPH_CreateExample ( psys_demo, psys_nmax ); + UpdateEmit (); + break; + default: + break; + } +} + + +void mouse_click_func ( int button, int state, int x, int y ) +{ + if( state == GLUT_DOWN ) { + if ( button == GLUT_LEFT_BUTTON ) dragging = DRAG_LEFT; + else if ( button == GLUT_RIGHT_BUTTON ) dragging = DRAG_RIGHT; + last_x = x; + last_y = y; + } else { + dragging = DRAG_OFF; + } +} + +void mouse_move_func ( int x, int y ) +{ + int dx = x - last_x; + int dy = y - last_y; + + switch ( mode ) { + case MODE_CAM: + if ( dragging == DRAG_LEFT ) { + cam_angs.x += dx; + cam_angs.y += dy; + if ( cam_angs.x >= 360.0 ) cam_angs.x -= 360.0; + if ( cam_angs.x < 0 ) cam_angs.x += 360.0; + if ( cam_angs.y >= 180.0 ) cam_angs.y = 180.0; + if ( cam_angs.y <= -180.0 ) cam_angs.y = -180.0; + printf ( "Cam Ang: %f %f %f\n", cam_angs.x, cam_angs.y, cam_angs.z ); + printf ( "Cam To: %f %f %f\n", cam_to.x, cam_to.y, cam_to.z ); + printf ( "Cam FOV: %f\n", cam_fov); + } else if ( dragging == DRAG_RIGHT ) { + cam_angs.z += dy*.15; + if ( cam_angs.z < 0) cam_angs.z = 0; + printf ( "Cam Ang: %f %f %f\n", cam_angs.x, cam_angs.y, cam_angs.z ); + printf ( "Cam To: %f %f %f\n", cam_to.x, cam_to.y, cam_to.z ); + printf ( "Cam FOV: %f\n", cam_fov ); + } + break; + case MODE_CAM_TO: + if ( dragging == DRAG_LEFT ) { + cam_to.x += dx; + cam_to.y += dy; + } else if ( dragging == DRAG_RIGHT ) { + cam_to.z += dy*.05; + if ( cam_to.z < 0) cam_to.z = 0; + } + break; + case MODE_OBJ: + if ( dragging == DRAG_LEFT ) { + obj_angs.x -= dx*0.1; + obj_angs.y += dy*0.1; + printf ( "Obj Angs: %f %f %f\n", obj_angs.x, obj_angs.y, obj_angs.z ); + //force_x += dx*.1; + //force_y += dy*.1; + } else if (dragging == DRAG_RIGHT) { + obj_angs.z -= dy*.005; + printf ( "Obj Angs: %f %f %f\n", obj_angs.x, obj_angs.y, obj_angs.z ); + } + psys.SetVec ( EMIT_ANG, Vector3DF ( obj_angs.x, obj_angs.y, obj_angs.z ) ); + break; + case MODE_OBJPOS: + if ( dragging == DRAG_LEFT ) { + obj_from.x -= dx*.1; + obj_from.y += dy*.1; + printf ( "Obj: %f %f %f\n", obj_from.x, obj_from.y, obj_from.z ); + } else if (dragging == DRAG_RIGHT) { + obj_from.z -= dy*.1; + printf ( "Obj: %f %f %f\n", obj_from.x, obj_from.y, obj_from.z ); + } + psys.SetVec ( EMIT_POS, Vector3DF ( obj_from.x, obj_from.y, obj_from.z ) ); + //psys.setPos ( obj_x, obj_y, obj_z, obj_ang, obj_tilt, obj_dist ); + break; + case MODE_LIGHTPOS: + if ( dragging == DRAG_LEFT ) { + light[0].x -= dx*.1; + light[0].y += dy*.1; + printf ( "Light: %f %f %f\n", light[0].x, light[0].y, light[0].z ); + } else if (dragging == DRAG_RIGHT) { + light[0].z -= dy*.1; + printf ( "Light: %f %f %f\n", light[0].x, light[0].y, light[0].z ); + } + #ifdef USE_SHADOWS + setShadowLight ( light[0].x, light[0].y, light[0].z, light_to[0].x, light_to[0].y, light_to[0].z, light_fov ); + #endif + break; + } + + if ( x < 10 || y < 10 || x > 1000 || y > 700 ) { + glutWarpPointer ( 1024/2, 768/2 ); + last_x = 1024/2; + last_y = 768/2; + } else { + last_x = x; + last_y = y; + } +} + + +void idle_func () +{ +} + +void init () +{ + + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + srand ( time ( 0x0 ) ); + + glClearColor( 0.49, 0.49, 0.49, 1.0 ); + glShadeModel( GL_SMOOTH ); + + glEnable ( GL_COLOR_MATERIAL ); + glEnable (GL_DEPTH_TEST); + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthMask ( 1 ); + glEnable ( GL_TEXTURE_2D ); + + // callbacks + glutDisplayFunc( display ); + glutReshapeFunc( reshape ); + glutKeyboardFunc( keyboard_func ); + glutMouseFunc( mouse_click_func ); + glutMotionFunc( mouse_move_func ); + glutIdleFunc( idle_func ); + glutSetCursor ( GLUT_CURSOR_NONE ); + + cam_angs.x = 29; cam_angs.y = 75; cam_angs.z = 80.0; + cam_to.x = 0; cam_to.y = 0; cam_to.z = 5; + cam_fov = 35.0; + + light[0].x = 39; light[0].y = -60; light[0].z = 43; + light_to[0].x = 0; light_to[0].y = 0; light_to[0].z = 0; + + light[1].x = 15; light[1].y = -5; light[1].z = 145; + light_to[1].x = 0; light_to[1].y = 0; light_to[1].z = 0; + + light_fov = 45; + + #ifdef USE_SHADOWS + createShadowTextures(); + createFrameBuffer (); + setShadowLight ( light[0].x, light[0].y, light[0].z, light_to[0].x, light_to[0].y, light_to[0].z, light_fov ); + setShadowLightColor ( .7, .7, .7, 0.2, 0.2, 0.2 ); + #endif + + obj_from.x = 0; obj_from.y = 0; obj_from.z = 20; // emitter + obj_angs.x = 118.7; obj_angs.y = 200; obj_angs.z = 1.0; + obj_dang.x = 1; obj_dang.y = 1; obj_dang.z = 0; + + psys.Initialize ( BFLUID, psys_nmax ); + psys.SPH_CreateExample ( 0, psys_nmax ); + psys.SetVec ( EMIT_ANG, Vector3DF ( obj_angs.x, obj_angs.y, obj_angs.z ) ); + psys.SetVec ( EMIT_POS, Vector3DF ( obj_from.x, obj_from.y, obj_from.z ) ); + + psys.SetParam ( PNT_DRAWMODE, int(bPntDraw ? 1:0) ); + psys.SetParam ( CLR_MODE, iClrMode ); +} + + +int main ( int argc, char **argv ) +{ + #ifdef BUILD_CUDA + // Initialize CUDA + cudaInit( argc, argv ); + #endif + + // set up the window + glutInit( &argc, &argv[0] ); + glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); + glutInitWindowPosition( 100, 100 ); + glutInitWindowSize( (int) window_width, (int) window_height ); + glutCreateWindow ( "Fluids v.1 (c) 2008, R. Hoetzlein (ZLib)" ); + +// glutFullScreen (); + + // initialize parameters + init(); + + // wait for something to happen + glutMainLoop(); + + return 0; +} + +extern "C" { + void btCuda_exit(int val) + { + fprintf(stderr, "Press ENTER key to terminate the program\n"); + getchar(); + exit(val); + } } \ No newline at end of file diff --git a/Glut/EmptyGL/GL/egl_cpx.h b/Glut/EmptyGL/GL/egl_cpx.h index 38f2383fc..16a685aa0 100644 --- a/Glut/EmptyGL/GL/egl_cpx.h +++ b/Glut/EmptyGL/GL/egl_cpx.h @@ -1,13 +1,13 @@ -// todo - implement these as you see fit. -inline GLint glRenderMode(GLenum a0) { return GL_RENDER; }; // ymmv. should return previous mode -inline GLenum glGetError() { return GL_NO_ERROR; }; -inline GLboolean glIsList(GLuint a0) { return GL_TRUE; }; -inline GLuint glGenLists(GLsizei a0) { return (GLuint)a0; }; -inline const GLubyte* glGetString(GLenum a0) { return (const GLubyte *)"egl-xyzzy"; }; -inline GLboolean glIsEnabled(GLenum a0) { return GL_TRUE; }; -inline GLboolean glAreTexturesResident(GLsizei a0,const GLuint * a1,GLboolean * a2) { return GL_TRUE; }; -inline GLboolean glIsTexture(GLuint a0) { return GL_TRUE; }; -inline void glGetBooleanv(GLenum a0,GLboolean * a1) { *a1 = GL_TRUE; }; -inline void glGetDoublev(GLenum a0,GLdouble * a1) { *a1 = 0.0; }; -inline void glGetFloatv(GLenum a0,GLfloat * a1) { *a1 = 0.0f; }; -inline void glGetIntegerv(GLenum a0,GLint * a1) { *a1 = 0; }; +// todo - implement these as you see fit. +inline GLint glRenderMode(GLenum a0) { return GL_RENDER; }; // ymmv. should return previous mode +inline GLenum glGetError() { return GL_NO_ERROR; }; +inline GLboolean glIsList(GLuint a0) { return GL_TRUE; }; +inline GLuint glGenLists(GLsizei a0) { return (GLuint)a0; }; +inline const GLubyte* glGetString(GLenum a0) { return (const GLubyte *)"egl-xyzzy"; }; +inline GLboolean glIsEnabled(GLenum a0) { return GL_TRUE; }; +inline GLboolean glAreTexturesResident(GLsizei a0,const GLuint * a1,GLboolean * a2) { return GL_TRUE; }; +inline GLboolean glIsTexture(GLuint a0) { return GL_TRUE; }; +inline void glGetBooleanv(GLenum a0,GLboolean * a1) { *a1 = GL_TRUE; }; +inline void glGetDoublev(GLenum a0,GLdouble * a1) { *a1 = 0.0; }; +inline void glGetFloatv(GLenum a0,GLfloat * a1) { *a1 = 0.0f; }; +inline void glGetIntegerv(GLenum a0,GLint * a1) { *a1 = 0; }; diff --git a/Glut/EmptyGL/GL/egl_defs.h b/Glut/EmptyGL/GL/egl_defs.h index 3c03f918e..cbd57114a 100644 --- a/Glut/EmptyGL/GL/egl_defs.h +++ b/Glut/EmptyGL/GL/egl_defs.h @@ -1,706 +1,706 @@ -#ifndef EGL_DEFS_H -#define EGL_DEFS_H - -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef void GLvoid; -typedef signed char GLbyte; -typedef short GLshort; -typedef int GLint; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef unsigned int GLuint; -typedef int GLsizei; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; - -#define __gl_h_ -#define GL_VERSION_1_1 1 -#define GL_VERSION_1_2 1 -#define GL_VERSION_1_3 1 -#define GL_ARB_imaging 1 -#define GL_FALSE 0x0 -#define GL_TRUE 0x1 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON 0x0009 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D -#define GL_MATRIX_MODE 0x0BA0 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_LIST_MODE 0x0B30 -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_BITS 0x0D56 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT0 0x4000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_SHININESS 0x1601 -#define GL_EMISSION 0x1600 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_SHADE_MODEL 0x0B54 -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_NORMALIZE 0x0BA1 -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_ACCUM 0x0100 -#define GL_ADD 0x0104 -#define GL_LOAD 0x0101 -#define GL_MULT 0x0103 -#define GL_RETURN 0x0102 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_BLEND 0x0BE2 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND_DST 0x0BE0 -#define GL_ZERO 0x0 -#define GL_ONE 0x1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_FEEDBACK 0x1C01 -#define GL_RENDER 0x1C00 -#define GL_SELECT 0x1C02 -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_LINE_RESET_TOKEN 0x0707 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 -#define GL_FOG 0x0B60 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_COLOR 0x0B66 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_LINEAR 0x2601 -#define GL_EXP 0x0800 -#define GL_EXP2 0x0801 -#define GL_LOGIC_OP 0x0BF1 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_CLEAR 0x1500 -#define GL_SET 0x150F -#define GL_COPY 0x1503 -#define GL_COPY_INVERTED 0x150C -#define GL_NOOP 0x1505 -#define GL_INVERT 0x150A -#define GL_AND 0x1501 -#define GL_NAND 0x150E -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_XOR 0x1506 -#define GL_EQUIV 0x1509 -#define GL_AND_REVERSE 0x1502 -#define GL_AND_INVERTED 0x1504 -#define GL_OR_REVERSE 0x150B -#define GL_OR_INVERTED 0x150D -#define GL_STENCIL_BITS 0x0D57 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_INDEX 0x1901 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_NONE 0x0 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C -#define GL_COLOR_INDEX 0x1900 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_ALPHA_BITS 0x0D55 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_INDEX_BITS 0x0D51 -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_READ_BUFFER 0x0C02 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_BITMAP 0x1A00 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_DITHER 0x0BD0 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_MODE 0x0C30 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_RENDER_MODE 0x0C40 -#define GL_RGBA_MODE 0x0C31 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_VIEWPORT 0x0BA2 -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_COEFF 0x0A00 -#define GL_ORDER 0x0A01 -#define GL_DOMAIN 0x0A02 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_FOG_HINT 0x0C54 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 -#define GL_TEXTURE_ENV 0x2300 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_TEXTURE_COMPONENTS 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_LINEAR 0x2400 -#define GL_EYE_PLANE 0x2502 -#define GL_SPHERE_MAP 0x2402 -#define GL_DECAL 0x2101 -#define GL_MODULATE 0x2100 -#define GL_NEAREST 0x2600 -#define GL_REPEAT 0x2901 -#define GL_CLAMP 0x2900 -#define GL_S 0x2000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NO_ERROR 0x0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CURRENT_BIT 0x00000001 -#define GL_POINT_BIT 0x00000002 -#define GL_LINE_BIT 0x00000004 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_HINT_BIT 0x00008000 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000FFFFF -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF -#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF -#define GL_RESCALE_NORMAL 0x803A -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_BLEND_EQUATION 0x8009 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_BLEND_COLOR 0x8005 -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 - -#endif +#ifndef EGL_DEFS_H +#define EGL_DEFS_H + +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; +typedef short GLshort; +typedef int GLint; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef int GLsizei; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; + +#define __gl_h_ +#define GL_VERSION_1_1 1 +#define GL_VERSION_1_2 1 +#define GL_VERSION_1_3 1 +#define GL_ARB_imaging 1 +#define GL_FALSE 0x0 +#define GL_TRUE 0x1 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_SHININESS 0x1601 +#define GL_EMISSION 0x1600 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_SHADE_MODEL 0x0B54 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_NORMALIZE 0x0BA1 +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM 0x0100 +#define GL_ADD 0x0104 +#define GL_LOAD 0x0101 +#define GL_MULT 0x0103 +#define GL_RETURN 0x0102 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_BLEND 0x0BE2 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_DST 0x0BE0 +#define GL_ZERO 0x0 +#define GL_ONE 0x1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_FEEDBACK 0x1C01 +#define GL_RENDER 0x1C00 +#define GL_SELECT 0x1C02 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_FOG 0x0B60 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_LINEAR 0x2601 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_INDEX 0x1901 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_NONE 0x0 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_COLOR_INDEX 0x1900 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_ALPHA_BITS 0x0D55 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_INDEX_BITS 0x0D51 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_READ_BUFFER 0x0C02 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_BITMAP 0x1A00 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_DITHER 0x0BD0 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_RENDER_MODE 0x0C40 +#define GL_RGBA_MODE 0x0C31 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_SPHERE_MAP 0x2402 +#define GL_DECAL 0x2101 +#define GL_MODULATE 0x2100 +#define GL_NEAREST 0x2600 +#define GL_REPEAT 0x2901 +#define GL_CLAMP 0x2900 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NO_ERROR 0x0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000FFFFF +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_RESCALE_NORMAL 0x803A +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_BLEND_EQUATION 0x8009 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_COLOR 0x8005 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +#endif diff --git a/Glut/EmptyGL/GL/egl_logged.h b/Glut/EmptyGL/GL/egl_logged.h index 09481034d..67efcafea 100644 --- a/Glut/EmptyGL/GL/egl_logged.h +++ b/Glut/EmptyGL/GL/egl_logged.h @@ -1,20 +1,20 @@ -inline void glFinish() {xGLL(EGL_TOKEN_glFinish);}; -inline void glClear(GLbitfield a0) {xGLL(EGL_TOKEN_glClear);xGLL(a0);}; -inline void glFlush() {xGLL(EGL_TOKEN_glFlush);}; -inline void glMatrixMode(GLenum a0) {xGLL(EGL_TOKEN_glMatrixMode);xGLL(a0);}; -inline void glOrtho(GLdouble a0,GLdouble a1,GLdouble a2,GLdouble a3,GLdouble a4,GLdouble a5) {xGLL(EGL_TOKEN_glOrtho);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);xGLL(a4);xGLL(a5);}; -inline void glFrustum(GLdouble a0,GLdouble a1,GLdouble a2,GLdouble a3,GLdouble a4,GLdouble a5) {xGLL(EGL_TOKEN_glFrustum);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);xGLL(a4);xGLL(a5);}; -inline void glViewport(GLint a0,GLint a1,GLsizei a2,GLsizei a3) {xGLL(EGL_TOKEN_glViewport);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);}; -inline void glPushMatrix() {xGLL(EGL_TOKEN_glPushMatrix);}; -inline void glPopMatrix() {xGLL(EGL_TOKEN_glPopMatrix);}; -inline void glLoadIdentity() {xGLL(EGL_TOKEN_glLoadIdentity);}; -inline void glLoadMatrixd(const GLdouble * a0) {xGLL(EGL_TOKEN_glLoadMatrixd);xGLL(a0);}; -inline void glLoadMatrixf(const GLfloat * a0) {xGLL(EGL_TOKEN_glLoadMatrixf);xGLL(a0);}; -inline void glMultMatrixd(const GLdouble * a0) {xGLL(EGL_TOKEN_glMultMatrixd);xGLL(a0);}; -inline void glMultMatrixf(const GLfloat * a0) {xGLL(EGL_TOKEN_glMultMatrixf);xGLL(a0);}; -inline void glRotated(GLdouble a0,GLdouble a1,GLdouble a2,GLdouble a3) {xGLL(EGL_TOKEN_glRotated);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);}; -inline void glRotatef(GLfloat a0,GLfloat a1,GLfloat a2,GLfloat a3) {xGLL(EGL_TOKEN_glRotatef);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);}; -inline void glScaled(GLdouble a0,GLdouble a1,GLdouble a2) {xGLL(EGL_TOKEN_glScaled);xGLL(a0);xGLL(a1);xGLL(a2);}; -inline void glScalef(GLfloat a0,GLfloat a1,GLfloat a2) {xGLL(EGL_TOKEN_glScalef);xGLL(a0);xGLL(a1);xGLL(a2);}; -inline void glTranslated(GLdouble a0,GLdouble a1,GLdouble a2) {xGLL(EGL_TOKEN_glTranslated);xGLL(a0);xGLL(a1);xGLL(a2);}; -inline void glTranslatef(GLfloat a0,GLfloat a1,GLfloat a2) {xGLL(EGL_TOKEN_glTranslatef);xGLL(a0);xGLL(a1);xGLL(a2);}; +inline void glFinish() {xGLL(EGL_TOKEN_glFinish);}; +inline void glClear(GLbitfield a0) {xGLL(EGL_TOKEN_glClear);xGLL(a0);}; +inline void glFlush() {xGLL(EGL_TOKEN_glFlush);}; +inline void glMatrixMode(GLenum a0) {xGLL(EGL_TOKEN_glMatrixMode);xGLL(a0);}; +inline void glOrtho(GLdouble a0,GLdouble a1,GLdouble a2,GLdouble a3,GLdouble a4,GLdouble a5) {xGLL(EGL_TOKEN_glOrtho);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);xGLL(a4);xGLL(a5);}; +inline void glFrustum(GLdouble a0,GLdouble a1,GLdouble a2,GLdouble a3,GLdouble a4,GLdouble a5) {xGLL(EGL_TOKEN_glFrustum);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);xGLL(a4);xGLL(a5);}; +inline void glViewport(GLint a0,GLint a1,GLsizei a2,GLsizei a3) {xGLL(EGL_TOKEN_glViewport);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);}; +inline void glPushMatrix() {xGLL(EGL_TOKEN_glPushMatrix);}; +inline void glPopMatrix() {xGLL(EGL_TOKEN_glPopMatrix);}; +inline void glLoadIdentity() {xGLL(EGL_TOKEN_glLoadIdentity);}; +inline void glLoadMatrixd(const GLdouble * a0) {xGLL(EGL_TOKEN_glLoadMatrixd);xGLL(a0);}; +inline void glLoadMatrixf(const GLfloat * a0) {xGLL(EGL_TOKEN_glLoadMatrixf);xGLL(a0);}; +inline void glMultMatrixd(const GLdouble * a0) {xGLL(EGL_TOKEN_glMultMatrixd);xGLL(a0);}; +inline void glMultMatrixf(const GLfloat * a0) {xGLL(EGL_TOKEN_glMultMatrixf);xGLL(a0);}; +inline void glRotated(GLdouble a0,GLdouble a1,GLdouble a2,GLdouble a3) {xGLL(EGL_TOKEN_glRotated);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);}; +inline void glRotatef(GLfloat a0,GLfloat a1,GLfloat a2,GLfloat a3) {xGLL(EGL_TOKEN_glRotatef);xGLL(a0);xGLL(a1);xGLL(a2);xGLL(a3);}; +inline void glScaled(GLdouble a0,GLdouble a1,GLdouble a2) {xGLL(EGL_TOKEN_glScaled);xGLL(a0);xGLL(a1);xGLL(a2);}; +inline void glScalef(GLfloat a0,GLfloat a1,GLfloat a2) {xGLL(EGL_TOKEN_glScalef);xGLL(a0);xGLL(a1);xGLL(a2);}; +inline void glTranslated(GLdouble a0,GLdouble a1,GLdouble a2) {xGLL(EGL_TOKEN_glTranslated);xGLL(a0);xGLL(a1);xGLL(a2);}; +inline void glTranslatef(GLfloat a0,GLfloat a1,GLfloat a2) {xGLL(EGL_TOKEN_glTranslatef);xGLL(a0);xGLL(a1);xGLL(a2);}; diff --git a/Glut/EmptyGL/GL/egl_tokens.h b/Glut/EmptyGL/GL/egl_tokens.h index f6e9e6616..9678adcd4 100644 --- a/Glut/EmptyGL/GL/egl_tokens.h +++ b/Glut/EmptyGL/GL/egl_tokens.h @@ -1,459 +1,459 @@ -#ifndef EGL_TOKENS_H -#define EGL_TOKENS_H - -#define EGL_TOKEN_glClearIndex 0x0 -#define EGL_TOKEN_glClearColor 0x1 -#define EGL_TOKEN_glClear 0x2 -#define EGL_TOKEN_glIndexMask 0x3 -#define EGL_TOKEN_glColorMask 0x4 -#define EGL_TOKEN_glAlphaFunc 0x5 -#define EGL_TOKEN_glBlendFunc 0x6 -#define EGL_TOKEN_glLogicOp 0x7 -#define EGL_TOKEN_glCullFace 0x8 -#define EGL_TOKEN_glFrontFace 0x9 -#define EGL_TOKEN_glPointSize 0xa -#define EGL_TOKEN_glLineWidth 0xb -#define EGL_TOKEN_glLineStipple 0xc -#define EGL_TOKEN_glPolygonMode 0xd -#define EGL_TOKEN_glPolygonOffset 0xe -#define EGL_TOKEN_glPolygonStipple 0xf -#define EGL_TOKEN_glGetPolygonStipple 0x10 -#define EGL_TOKEN_glEdgeFlag 0x11 -#define EGL_TOKEN_glEdgeFlagv 0x12 -#define EGL_TOKEN_glScissor 0x13 -#define EGL_TOKEN_glClipPlane 0x14 -#define EGL_TOKEN_glGetClipPlane 0x15 -#define EGL_TOKEN_glDrawBuffer 0x16 -#define EGL_TOKEN_glReadBuffer 0x17 -#define EGL_TOKEN_glEnable 0x18 -#define EGL_TOKEN_glDisable 0x19 -#define EGL_TOKEN_glIsEnabled 0x1a -#define EGL_TOKEN_glEnableClientState 0x1b -#define EGL_TOKEN_glDisableClientState 0x1c -#define EGL_TOKEN_glGetBooleanv 0x1d -#define EGL_TOKEN_glGetDoublev 0x1e -#define EGL_TOKEN_glGetFloatv 0x1f -#define EGL_TOKEN_glGetIntegerv 0x20 -#define EGL_TOKEN_glPushAttrib 0x21 -#define EGL_TOKEN_glPopAttrib 0x22 -#define EGL_TOKEN_glPushClientAttrib 0x23 -#define EGL_TOKEN_glPopClientAttrib 0x24 -#define EGL_TOKEN_glRenderMode 0x25 -#define EGL_TOKEN_glGetError 0x26 -#define EGL_TOKEN_glGetString 0x27 -#define EGL_TOKEN_glFinish 0x28 -#define EGL_TOKEN_glFlush 0x29 -#define EGL_TOKEN_glHint 0x2a -#define EGL_TOKEN_glClearDepth 0x2b -#define EGL_TOKEN_glDepthFunc 0x2c -#define EGL_TOKEN_glDepthMask 0x2d -#define EGL_TOKEN_glDepthRange 0x2e -#define EGL_TOKEN_glClearAccum 0x2f -#define EGL_TOKEN_glAccum 0x30 -#define EGL_TOKEN_glMatrixMode 0x31 -#define EGL_TOKEN_glOrtho 0x32 -#define EGL_TOKEN_glFrustum 0x33 -#define EGL_TOKEN_glViewport 0x34 -#define EGL_TOKEN_glPushMatrix 0x35 -#define EGL_TOKEN_glPopMatrix 0x36 -#define EGL_TOKEN_glLoadIdentity 0x37 -#define EGL_TOKEN_glLoadMatrixd 0x38 -#define EGL_TOKEN_glLoadMatrixf 0x39 -#define EGL_TOKEN_glMultMatrixd 0x3a -#define EGL_TOKEN_glMultMatrixf 0x3b -#define EGL_TOKEN_glRotated 0x3c -#define EGL_TOKEN_glRotatef 0x3d -#define EGL_TOKEN_glScaled 0x3e -#define EGL_TOKEN_glScalef 0x3f -#define EGL_TOKEN_glTranslated 0x40 -#define EGL_TOKEN_glTranslatef 0x41 -#define EGL_TOKEN_glIsList 0x42 -#define EGL_TOKEN_glDeleteLists 0x43 -#define EGL_TOKEN_glGenLists 0x44 -#define EGL_TOKEN_glNewList 0x45 -#define EGL_TOKEN_glEndList 0x46 -#define EGL_TOKEN_glCallList 0x47 -#define EGL_TOKEN_glCallLists 0x48 -#define EGL_TOKEN_glListBase 0x49 -#define EGL_TOKEN_glBegin 0x4a -#define EGL_TOKEN_glEnd 0x4b -#define EGL_TOKEN_glVertex2d 0x4c -#define EGL_TOKEN_glVertex2f 0x4d -#define EGL_TOKEN_glVertex2i 0x4e -#define EGL_TOKEN_glVertex2s 0x4f -#define EGL_TOKEN_glVertex3d 0x50 -#define EGL_TOKEN_glVertex3f 0x51 -#define EGL_TOKEN_glVertex3i 0x52 -#define EGL_TOKEN_glVertex3s 0x53 -#define EGL_TOKEN_glVertex4d 0x54 -#define EGL_TOKEN_glVertex4f 0x55 -#define EGL_TOKEN_glVertex4i 0x56 -#define EGL_TOKEN_glVertex4s 0x57 -#define EGL_TOKEN_glVertex2dv 0x58 -#define EGL_TOKEN_glVertex2fv 0x59 -#define EGL_TOKEN_glVertex2iv 0x5a -#define EGL_TOKEN_glVertex2sv 0x5b -#define EGL_TOKEN_glVertex3dv 0x5c -#define EGL_TOKEN_glVertex3fv 0x5d -#define EGL_TOKEN_glVertex3iv 0x5e -#define EGL_TOKEN_glVertex3sv 0x5f -#define EGL_TOKEN_glVertex4dv 0x60 -#define EGL_TOKEN_glVertex4fv 0x61 -#define EGL_TOKEN_glVertex4iv 0x62 -#define EGL_TOKEN_glVertex4sv 0x63 -#define EGL_TOKEN_glNormal3b 0x64 -#define EGL_TOKEN_glNormal3d 0x65 -#define EGL_TOKEN_glNormal3f 0x66 -#define EGL_TOKEN_glNormal3i 0x67 -#define EGL_TOKEN_glNormal3s 0x68 -#define EGL_TOKEN_glNormal3bv 0x69 -#define EGL_TOKEN_glNormal3dv 0x6a -#define EGL_TOKEN_glNormal3fv 0x6b -#define EGL_TOKEN_glNormal3iv 0x6c -#define EGL_TOKEN_glNormal3sv 0x6d -#define EGL_TOKEN_glIndexd 0x6e -#define EGL_TOKEN_glIndexf 0x6f -#define EGL_TOKEN_glIndexi 0x70 -#define EGL_TOKEN_glIndexs 0x71 -#define EGL_TOKEN_glIndexub 0x72 -#define EGL_TOKEN_glIndexdv 0x73 -#define EGL_TOKEN_glIndexfv 0x74 -#define EGL_TOKEN_glIndexiv 0x75 -#define EGL_TOKEN_glIndexsv 0x76 -#define EGL_TOKEN_glIndexubv 0x77 -#define EGL_TOKEN_glColor3b 0x78 -#define EGL_TOKEN_glColor3d 0x79 -#define EGL_TOKEN_glColor3f 0x7a -#define EGL_TOKEN_glColor3i 0x7b -#define EGL_TOKEN_glColor3s 0x7c -#define EGL_TOKEN_glColor3ub 0x7d -#define EGL_TOKEN_glColor3ui 0x7e -#define EGL_TOKEN_glColor3us 0x7f -#define EGL_TOKEN_glColor4b 0x80 -#define EGL_TOKEN_glColor4d 0x81 -#define EGL_TOKEN_glColor4f 0x82 -#define EGL_TOKEN_glColor4i 0x83 -#define EGL_TOKEN_glColor4s 0x84 -#define EGL_TOKEN_glColor4ub 0x85 -#define EGL_TOKEN_glColor4ui 0x86 -#define EGL_TOKEN_glColor4us 0x87 -#define EGL_TOKEN_glColor3bv 0x88 -#define EGL_TOKEN_glColor3dv 0x89 -#define EGL_TOKEN_glColor3fv 0x8a -#define EGL_TOKEN_glColor3iv 0x8b -#define EGL_TOKEN_glColor3sv 0x8c -#define EGL_TOKEN_glColor3ubv 0x8d -#define EGL_TOKEN_glColor3uiv 0x8e -#define EGL_TOKEN_glColor3usv 0x8f -#define EGL_TOKEN_glColor4bv 0x90 -#define EGL_TOKEN_glColor4dv 0x91 -#define EGL_TOKEN_glColor4fv 0x92 -#define EGL_TOKEN_glColor4iv 0x93 -#define EGL_TOKEN_glColor4sv 0x94 -#define EGL_TOKEN_glColor4ubv 0x95 -#define EGL_TOKEN_glColor4uiv 0x96 -#define EGL_TOKEN_glColor4usv 0x97 -#define EGL_TOKEN_glTexCoord1d 0x98 -#define EGL_TOKEN_glTexCoord1f 0x99 -#define EGL_TOKEN_glTexCoord1i 0x9a -#define EGL_TOKEN_glTexCoord1s 0x9b -#define EGL_TOKEN_glTexCoord2d 0x9c -#define EGL_TOKEN_glTexCoord2f 0x9d -#define EGL_TOKEN_glTexCoord2i 0x9e -#define EGL_TOKEN_glTexCoord2s 0x9f -#define EGL_TOKEN_glTexCoord3d 0xa0 -#define EGL_TOKEN_glTexCoord3f 0xa1 -#define EGL_TOKEN_glTexCoord3i 0xa2 -#define EGL_TOKEN_glTexCoord3s 0xa3 -#define EGL_TOKEN_glTexCoord4d 0xa4 -#define EGL_TOKEN_glTexCoord4f 0xa5 -#define EGL_TOKEN_glTexCoord4i 0xa6 -#define EGL_TOKEN_glTexCoord4s 0xa7 -#define EGL_TOKEN_glTexCoord1dv 0xa8 -#define EGL_TOKEN_glTexCoord1fv 0xa9 -#define EGL_TOKEN_glTexCoord1iv 0xaa -#define EGL_TOKEN_glTexCoord1sv 0xab -#define EGL_TOKEN_glTexCoord2dv 0xac -#define EGL_TOKEN_glTexCoord2fv 0xad -#define EGL_TOKEN_glTexCoord2iv 0xae -#define EGL_TOKEN_glTexCoord2sv 0xaf -#define EGL_TOKEN_glTexCoord3dv 0xb0 -#define EGL_TOKEN_glTexCoord3fv 0xb1 -#define EGL_TOKEN_glTexCoord3iv 0xb2 -#define EGL_TOKEN_glTexCoord3sv 0xb3 -#define EGL_TOKEN_glTexCoord4dv 0xb4 -#define EGL_TOKEN_glTexCoord4fv 0xb5 -#define EGL_TOKEN_glTexCoord4iv 0xb6 -#define EGL_TOKEN_glTexCoord4sv 0xb7 -#define EGL_TOKEN_glRasterPos2d 0xb8 -#define EGL_TOKEN_glRasterPos2f 0xb9 -#define EGL_TOKEN_glRasterPos2i 0xba -#define EGL_TOKEN_glRasterPos2s 0xbb -#define EGL_TOKEN_glRasterPos3d 0xbc -#define EGL_TOKEN_glRasterPos3f 0xbd -#define EGL_TOKEN_glRasterPos3i 0xbe -#define EGL_TOKEN_glRasterPos3s 0xbf -#define EGL_TOKEN_glRasterPos4d 0xc0 -#define EGL_TOKEN_glRasterPos4f 0xc1 -#define EGL_TOKEN_glRasterPos4i 0xc2 -#define EGL_TOKEN_glRasterPos4s 0xc3 -#define EGL_TOKEN_glRasterPos2dv 0xc4 -#define EGL_TOKEN_glRasterPos2fv 0xc5 -#define EGL_TOKEN_glRasterPos2iv 0xc6 -#define EGL_TOKEN_glRasterPos2sv 0xc7 -#define EGL_TOKEN_glRasterPos3dv 0xc8 -#define EGL_TOKEN_glRasterPos3fv 0xc9 -#define EGL_TOKEN_glRasterPos3iv 0xca -#define EGL_TOKEN_glRasterPos3sv 0xcb -#define EGL_TOKEN_glRasterPos4dv 0xcc -#define EGL_TOKEN_glRasterPos4fv 0xcd -#define EGL_TOKEN_glRasterPos4iv 0xce -#define EGL_TOKEN_glRasterPos4sv 0xcf -#define EGL_TOKEN_glRectd 0xd0 -#define EGL_TOKEN_glRectf 0xd1 -#define EGL_TOKEN_glRecti 0xd2 -#define EGL_TOKEN_glRects 0xd3 -#define EGL_TOKEN_glRectdv 0xd4 -#define EGL_TOKEN_glRectfv 0xd5 -#define EGL_TOKEN_glRectiv 0xd6 -#define EGL_TOKEN_glRectsv 0xd7 -#define EGL_TOKEN_glVertexPointer 0xd8 -#define EGL_TOKEN_glNormalPointer 0xd9 -#define EGL_TOKEN_glColorPointer 0xda -#define EGL_TOKEN_glIndexPointer 0xdb -#define EGL_TOKEN_glTexCoordPointer 0xdc -#define EGL_TOKEN_glEdgeFlagPointer 0xdd -#define EGL_TOKEN_glGetPointerv 0xde -#define EGL_TOKEN_glArrayElement 0xdf -#define EGL_TOKEN_glDrawArrays 0xe0 -#define EGL_TOKEN_glDrawElements 0xe1 -#define EGL_TOKEN_glInterleavedArrays 0xe2 -#define EGL_TOKEN_glShadeModel 0xe3 -#define EGL_TOKEN_glLightf 0xe4 -#define EGL_TOKEN_glLighti 0xe5 -#define EGL_TOKEN_glLightfv 0xe6 -#define EGL_TOKEN_glLightiv 0xe7 -#define EGL_TOKEN_glGetLightfv 0xe8 -#define EGL_TOKEN_glGetLightiv 0xe9 -#define EGL_TOKEN_glLightModelf 0xea -#define EGL_TOKEN_glLightModeli 0xeb -#define EGL_TOKEN_glLightModelfv 0xec -#define EGL_TOKEN_glLightModeliv 0xed -#define EGL_TOKEN_glMaterialf 0xee -#define EGL_TOKEN_glMateriali 0xef -#define EGL_TOKEN_glMaterialfv 0xf0 -#define EGL_TOKEN_glMaterialiv 0xf1 -#define EGL_TOKEN_glGetMaterialfv 0xf2 -#define EGL_TOKEN_glGetMaterialiv 0xf3 -#define EGL_TOKEN_glColorMaterial 0xf4 -#define EGL_TOKEN_glPixelZoom 0xf5 -#define EGL_TOKEN_glPixelStoref 0xf6 -#define EGL_TOKEN_glPixelStorei 0xf7 -#define EGL_TOKEN_glPixelTransferf 0xf8 -#define EGL_TOKEN_glPixelTransferi 0xf9 -#define EGL_TOKEN_glPixelMapfv 0xfa -#define EGL_TOKEN_glPixelMapuiv 0xfb -#define EGL_TOKEN_glPixelMapusv 0xfc -#define EGL_TOKEN_glGetPixelMapfv 0xfd -#define EGL_TOKEN_glGetPixelMapuiv 0xfe -#define EGL_TOKEN_glGetPixelMapusv 0xff -#define EGL_TOKEN_glBitmap 0x100 -#define EGL_TOKEN_glReadPixels 0x101 -#define EGL_TOKEN_glDrawPixels 0x102 -#define EGL_TOKEN_glCopyPixels 0x103 -#define EGL_TOKEN_glStencilFunc 0x104 -#define EGL_TOKEN_glStencilMask 0x105 -#define EGL_TOKEN_glStencilOp 0x106 -#define EGL_TOKEN_glClearStencil 0x107 -#define EGL_TOKEN_glTexGend 0x108 -#define EGL_TOKEN_glTexGenf 0x109 -#define EGL_TOKEN_glTexGeni 0x10a -#define EGL_TOKEN_glTexGendv 0x10b -#define EGL_TOKEN_glTexGenfv 0x10c -#define EGL_TOKEN_glTexGeniv 0x10d -#define EGL_TOKEN_glGetTexGendv 0x10e -#define EGL_TOKEN_glGetTexGenfv 0x10f -#define EGL_TOKEN_glGetTexGeniv 0x110 -#define EGL_TOKEN_glTexEnvf 0x111 -#define EGL_TOKEN_glTexEnvi 0x112 -#define EGL_TOKEN_glTexEnvfv 0x113 -#define EGL_TOKEN_glTexEnviv 0x114 -#define EGL_TOKEN_glGetTexEnvfv 0x115 -#define EGL_TOKEN_glGetTexEnviv 0x116 -#define EGL_TOKEN_glTexParameterf 0x117 -#define EGL_TOKEN_glTexParameteri 0x118 -#define EGL_TOKEN_glTexParameterfv 0x119 -#define EGL_TOKEN_glTexParameteriv 0x11a -#define EGL_TOKEN_glGetTexParameterfv 0x11b -#define EGL_TOKEN_glGetTexParameteriv 0x11c -#define EGL_TOKEN_glGetTexLevelParameterfv 0x11d -#define EGL_TOKEN_glGetTexLevelParameteriv 0x11e -#define EGL_TOKEN_glTexImage1D 0x11f -#define EGL_TOKEN_glTexImage2D 0x120 -#define EGL_TOKEN_glGetTexImage 0x121 -#define EGL_TOKEN_glGenTextures 0x122 -#define EGL_TOKEN_glDeleteTextures 0x123 -#define EGL_TOKEN_glBindTexture 0x124 -#define EGL_TOKEN_glPrioritizeTextures 0x125 -#define EGL_TOKEN_glAreTexturesResident 0x126 -#define EGL_TOKEN_glIsTexture 0x127 -#define EGL_TOKEN_glTexSubImage1D 0x128 -#define EGL_TOKEN_glTexSubImage2D 0x129 -#define EGL_TOKEN_glCopyTexImage1D 0x12a -#define EGL_TOKEN_glCopyTexImage2D 0x12b -#define EGL_TOKEN_glCopyTexSubImage1D 0x12c -#define EGL_TOKEN_glCopyTexSubImage2D 0x12d -#define EGL_TOKEN_glMap1d 0x12e -#define EGL_TOKEN_glMap1f 0x12f -#define EGL_TOKEN_glMap2d 0x130 -#define EGL_TOKEN_glMap2f 0x131 -#define EGL_TOKEN_glGetMapdv 0x132 -#define EGL_TOKEN_glGetMapfv 0x133 -#define EGL_TOKEN_glGetMapiv 0x134 -#define EGL_TOKEN_glEvalCoord1d 0x135 -#define EGL_TOKEN_glEvalCoord1f 0x136 -#define EGL_TOKEN_glEvalCoord1dv 0x137 -#define EGL_TOKEN_glEvalCoord1fv 0x138 -#define EGL_TOKEN_glEvalCoord2d 0x139 -#define EGL_TOKEN_glEvalCoord2f 0x13a -#define EGL_TOKEN_glEvalCoord2dv 0x13b -#define EGL_TOKEN_glEvalCoord2fv 0x13c -#define EGL_TOKEN_glMapGrid1d 0x13d -#define EGL_TOKEN_glMapGrid1f 0x13e -#define EGL_TOKEN_glMapGrid2d 0x13f -#define EGL_TOKEN_glMapGrid2f 0x140 -#define EGL_TOKEN_glEvalPoint1 0x141 -#define EGL_TOKEN_glEvalPoint2 0x142 -#define EGL_TOKEN_glEvalMesh1 0x143 -#define EGL_TOKEN_glEvalMesh2 0x144 -#define EGL_TOKEN_glFogf 0x145 -#define EGL_TOKEN_glFogi 0x146 -#define EGL_TOKEN_glFogfv 0x147 -#define EGL_TOKEN_glFogiv 0x148 -#define EGL_TOKEN_glFeedbackBuffer 0x149 -#define EGL_TOKEN_glPassThrough 0x14a -#define EGL_TOKEN_glSelectBuffer 0x14b -#define EGL_TOKEN_glInitNames 0x14c -#define EGL_TOKEN_glLoadName 0x14d -#define EGL_TOKEN_glPushName 0x14e -#define EGL_TOKEN_glPopName 0x14f -#define EGL_TOKEN_glDrawRangeElements 0x150 -#define EGL_TOKEN_glTexImage3D 0x151 -#define EGL_TOKEN_glTexSubImage3D 0x152 -#define EGL_TOKEN_glCopyTexSubImage3D 0x153 -#define EGL_TOKEN_glColorTable 0x154 -#define EGL_TOKEN_glColorSubTable 0x155 -#define EGL_TOKEN_glColorTableParameteriv 0x156 -#define EGL_TOKEN_glColorTableParameterfv 0x157 -#define EGL_TOKEN_glCopyColorSubTable 0x158 -#define EGL_TOKEN_glCopyColorTable 0x159 -#define EGL_TOKEN_glGetColorTable 0x15a -#define EGL_TOKEN_glGetColorTableParameterfv 0x15b -#define EGL_TOKEN_glGetColorTableParameteriv 0x15c -#define EGL_TOKEN_glBlendEquation 0x15d -#define EGL_TOKEN_glBlendColor 0x15e -#define EGL_TOKEN_glHistogram 0x15f -#define EGL_TOKEN_glResetHistogram 0x160 -#define EGL_TOKEN_glGetHistogram 0x161 -#define EGL_TOKEN_glGetHistogramParameterfv 0x162 -#define EGL_TOKEN_glGetHistogramParameteriv 0x163 -#define EGL_TOKEN_glMinmax 0x164 -#define EGL_TOKEN_glResetMinmax 0x165 -#define EGL_TOKEN_glGetMinmax 0x166 -#define EGL_TOKEN_glGetMinmaxParameterfv 0x167 -#define EGL_TOKEN_glGetMinmaxParameteriv 0x168 -#define EGL_TOKEN_glConvolutionFilter1D 0x169 -#define EGL_TOKEN_glConvolutionFilter2D 0x16a -#define EGL_TOKEN_glConvolutionParameterf 0x16b -#define EGL_TOKEN_glConvolutionParameterfv 0x16c -#define EGL_TOKEN_glConvolutionParameteri 0x16d -#define EGL_TOKEN_glConvolutionParameteriv 0x16e -#define EGL_TOKEN_glCopyConvolutionFilter1D 0x16f -#define EGL_TOKEN_glCopyConvolutionFilter2D 0x170 -#define EGL_TOKEN_glGetConvolutionFilter 0x171 -#define EGL_TOKEN_glGetConvolutionParameterfv 0x172 -#define EGL_TOKEN_glGetConvolutionParameteriv 0x173 -#define EGL_TOKEN_glSeparableFilter2D 0x174 -#define EGL_TOKEN_glGetSeparableFilter 0x175 -#define EGL_TOKEN_glActiveTexture 0x176 -#define EGL_TOKEN_glClientActiveTexture 0x177 -#define EGL_TOKEN_glCompressedTexImage1D 0x178 -#define EGL_TOKEN_glCompressedTexImage2D 0x179 -#define EGL_TOKEN_glCompressedTexImage3D 0x17a -#define EGL_TOKEN_glCompressedTexSubImage1D 0x17b -#define EGL_TOKEN_glCompressedTexSubImage2D 0x17c -#define EGL_TOKEN_glCompressedTexSubImage3D 0x17d -#define EGL_TOKEN_glGetCompressedTexImage 0x17e -#define EGL_TOKEN_glMultiTexCoord1d 0x17f -#define EGL_TOKEN_glMultiTexCoord1dv 0x180 -#define EGL_TOKEN_glMultiTexCoord1f 0x181 -#define EGL_TOKEN_glMultiTexCoord1fv 0x182 -#define EGL_TOKEN_glMultiTexCoord1i 0x183 -#define EGL_TOKEN_glMultiTexCoord1iv 0x184 -#define EGL_TOKEN_glMultiTexCoord1s 0x185 -#define EGL_TOKEN_glMultiTexCoord1sv 0x186 -#define EGL_TOKEN_glMultiTexCoord2d 0x187 -#define EGL_TOKEN_glMultiTexCoord2dv 0x188 -#define EGL_TOKEN_glMultiTexCoord2f 0x189 -#define EGL_TOKEN_glMultiTexCoord2fv 0x18a -#define EGL_TOKEN_glMultiTexCoord2i 0x18b -#define EGL_TOKEN_glMultiTexCoord2iv 0x18c -#define EGL_TOKEN_glMultiTexCoord2s 0x18d -#define EGL_TOKEN_glMultiTexCoord2sv 0x18e -#define EGL_TOKEN_glMultiTexCoord3d 0x18f -#define EGL_TOKEN_glMultiTexCoord3dv 0x190 -#define EGL_TOKEN_glMultiTexCoord3f 0x191 -#define EGL_TOKEN_glMultiTexCoord3fv 0x192 -#define EGL_TOKEN_glMultiTexCoord3i 0x193 -#define EGL_TOKEN_glMultiTexCoord3iv 0x194 -#define EGL_TOKEN_glMultiTexCoord3s 0x195 -#define EGL_TOKEN_glMultiTexCoord3sv 0x196 -#define EGL_TOKEN_glMultiTexCoord4d 0x197 -#define EGL_TOKEN_glMultiTexCoord4dv 0x198 -#define EGL_TOKEN_glMultiTexCoord4f 0x199 -#define EGL_TOKEN_glMultiTexCoord4fv 0x19a -#define EGL_TOKEN_glMultiTexCoord4i 0x19b -#define EGL_TOKEN_glMultiTexCoord4iv 0x19c -#define EGL_TOKEN_glMultiTexCoord4s 0x19d -#define EGL_TOKEN_glMultiTexCoord4sv 0x19e -#define EGL_TOKEN_glLoadTransposeMatrixd 0x19f -#define EGL_TOKEN_glLoadTransposeMatrixf 0x1a0 -#define EGL_TOKEN_glMultTransposeMatrixd 0x1a1 -#define EGL_TOKEN_glMultTransposeMatrixf 0x1a2 -#define EGL_TOKEN_glSampleCoverage 0x1a3 -#define EGL_TOKEN_glActiveTextureARB 0x1a4 -#define EGL_TOKEN_glClientActiveTextureARB 0x1a5 -#define EGL_TOKEN_glMultiTexCoord1dARB 0x1a6 -#define EGL_TOKEN_glMultiTexCoord1dvARB 0x1a7 -#define EGL_TOKEN_glMultiTexCoord1fARB 0x1a8 -#define EGL_TOKEN_glMultiTexCoord1fvARB 0x1a9 -#define EGL_TOKEN_glMultiTexCoord1iARB 0x1aa -#define EGL_TOKEN_glMultiTexCoord1ivARB 0x1ab -#define EGL_TOKEN_glMultiTexCoord1sARB 0x1ac -#define EGL_TOKEN_glMultiTexCoord1svARB 0x1ad -#define EGL_TOKEN_glMultiTexCoord2dARB 0x1ae -#define EGL_TOKEN_glMultiTexCoord2dvARB 0x1af -#define EGL_TOKEN_glMultiTexCoord2fARB 0x1b0 -#define EGL_TOKEN_glMultiTexCoord2fvARB 0x1b1 -#define EGL_TOKEN_glMultiTexCoord2iARB 0x1b2 -#define EGL_TOKEN_glMultiTexCoord2ivARB 0x1b3 -#define EGL_TOKEN_glMultiTexCoord2sARB 0x1b4 -#define EGL_TOKEN_glMultiTexCoord2svARB 0x1b5 -#define EGL_TOKEN_glMultiTexCoord3dARB 0x1b6 -#define EGL_TOKEN_glMultiTexCoord3dvARB 0x1b7 -#define EGL_TOKEN_glMultiTexCoord3fARB 0x1b8 -#define EGL_TOKEN_glMultiTexCoord3fvARB 0x1b9 -#define EGL_TOKEN_glMultiTexCoord3iARB 0x1ba -#define EGL_TOKEN_glMultiTexCoord3ivARB 0x1bb -#define EGL_TOKEN_glMultiTexCoord3sARB 0x1bc -#define EGL_TOKEN_glMultiTexCoord3svARB 0x1bd -#define EGL_TOKEN_glMultiTexCoord4dARB 0x1be -#define EGL_TOKEN_glMultiTexCoord4dvARB 0x1bf -#define EGL_TOKEN_glMultiTexCoord4fARB 0x1c0 -#define EGL_TOKEN_glMultiTexCoord4fvARB 0x1c1 -#define EGL_TOKEN_glMultiTexCoord4iARB 0x1c2 -#define EGL_TOKEN_glMultiTexCoord4ivARB 0x1c3 -#define EGL_TOKEN_glMultiTexCoord4sARB 0x1c4 -#define EGL_TOKEN_glMultiTexCoord4svARB 0x1c5 - -#endif +#ifndef EGL_TOKENS_H +#define EGL_TOKENS_H + +#define EGL_TOKEN_glClearIndex 0x0 +#define EGL_TOKEN_glClearColor 0x1 +#define EGL_TOKEN_glClear 0x2 +#define EGL_TOKEN_glIndexMask 0x3 +#define EGL_TOKEN_glColorMask 0x4 +#define EGL_TOKEN_glAlphaFunc 0x5 +#define EGL_TOKEN_glBlendFunc 0x6 +#define EGL_TOKEN_glLogicOp 0x7 +#define EGL_TOKEN_glCullFace 0x8 +#define EGL_TOKEN_glFrontFace 0x9 +#define EGL_TOKEN_glPointSize 0xa +#define EGL_TOKEN_glLineWidth 0xb +#define EGL_TOKEN_glLineStipple 0xc +#define EGL_TOKEN_glPolygonMode 0xd +#define EGL_TOKEN_glPolygonOffset 0xe +#define EGL_TOKEN_glPolygonStipple 0xf +#define EGL_TOKEN_glGetPolygonStipple 0x10 +#define EGL_TOKEN_glEdgeFlag 0x11 +#define EGL_TOKEN_glEdgeFlagv 0x12 +#define EGL_TOKEN_glScissor 0x13 +#define EGL_TOKEN_glClipPlane 0x14 +#define EGL_TOKEN_glGetClipPlane 0x15 +#define EGL_TOKEN_glDrawBuffer 0x16 +#define EGL_TOKEN_glReadBuffer 0x17 +#define EGL_TOKEN_glEnable 0x18 +#define EGL_TOKEN_glDisable 0x19 +#define EGL_TOKEN_glIsEnabled 0x1a +#define EGL_TOKEN_glEnableClientState 0x1b +#define EGL_TOKEN_glDisableClientState 0x1c +#define EGL_TOKEN_glGetBooleanv 0x1d +#define EGL_TOKEN_glGetDoublev 0x1e +#define EGL_TOKEN_glGetFloatv 0x1f +#define EGL_TOKEN_glGetIntegerv 0x20 +#define EGL_TOKEN_glPushAttrib 0x21 +#define EGL_TOKEN_glPopAttrib 0x22 +#define EGL_TOKEN_glPushClientAttrib 0x23 +#define EGL_TOKEN_glPopClientAttrib 0x24 +#define EGL_TOKEN_glRenderMode 0x25 +#define EGL_TOKEN_glGetError 0x26 +#define EGL_TOKEN_glGetString 0x27 +#define EGL_TOKEN_glFinish 0x28 +#define EGL_TOKEN_glFlush 0x29 +#define EGL_TOKEN_glHint 0x2a +#define EGL_TOKEN_glClearDepth 0x2b +#define EGL_TOKEN_glDepthFunc 0x2c +#define EGL_TOKEN_glDepthMask 0x2d +#define EGL_TOKEN_glDepthRange 0x2e +#define EGL_TOKEN_glClearAccum 0x2f +#define EGL_TOKEN_glAccum 0x30 +#define EGL_TOKEN_glMatrixMode 0x31 +#define EGL_TOKEN_glOrtho 0x32 +#define EGL_TOKEN_glFrustum 0x33 +#define EGL_TOKEN_glViewport 0x34 +#define EGL_TOKEN_glPushMatrix 0x35 +#define EGL_TOKEN_glPopMatrix 0x36 +#define EGL_TOKEN_glLoadIdentity 0x37 +#define EGL_TOKEN_glLoadMatrixd 0x38 +#define EGL_TOKEN_glLoadMatrixf 0x39 +#define EGL_TOKEN_glMultMatrixd 0x3a +#define EGL_TOKEN_glMultMatrixf 0x3b +#define EGL_TOKEN_glRotated 0x3c +#define EGL_TOKEN_glRotatef 0x3d +#define EGL_TOKEN_glScaled 0x3e +#define EGL_TOKEN_glScalef 0x3f +#define EGL_TOKEN_glTranslated 0x40 +#define EGL_TOKEN_glTranslatef 0x41 +#define EGL_TOKEN_glIsList 0x42 +#define EGL_TOKEN_glDeleteLists 0x43 +#define EGL_TOKEN_glGenLists 0x44 +#define EGL_TOKEN_glNewList 0x45 +#define EGL_TOKEN_glEndList 0x46 +#define EGL_TOKEN_glCallList 0x47 +#define EGL_TOKEN_glCallLists 0x48 +#define EGL_TOKEN_glListBase 0x49 +#define EGL_TOKEN_glBegin 0x4a +#define EGL_TOKEN_glEnd 0x4b +#define EGL_TOKEN_glVertex2d 0x4c +#define EGL_TOKEN_glVertex2f 0x4d +#define EGL_TOKEN_glVertex2i 0x4e +#define EGL_TOKEN_glVertex2s 0x4f +#define EGL_TOKEN_glVertex3d 0x50 +#define EGL_TOKEN_glVertex3f 0x51 +#define EGL_TOKEN_glVertex3i 0x52 +#define EGL_TOKEN_glVertex3s 0x53 +#define EGL_TOKEN_glVertex4d 0x54 +#define EGL_TOKEN_glVertex4f 0x55 +#define EGL_TOKEN_glVertex4i 0x56 +#define EGL_TOKEN_glVertex4s 0x57 +#define EGL_TOKEN_glVertex2dv 0x58 +#define EGL_TOKEN_glVertex2fv 0x59 +#define EGL_TOKEN_glVertex2iv 0x5a +#define EGL_TOKEN_glVertex2sv 0x5b +#define EGL_TOKEN_glVertex3dv 0x5c +#define EGL_TOKEN_glVertex3fv 0x5d +#define EGL_TOKEN_glVertex3iv 0x5e +#define EGL_TOKEN_glVertex3sv 0x5f +#define EGL_TOKEN_glVertex4dv 0x60 +#define EGL_TOKEN_glVertex4fv 0x61 +#define EGL_TOKEN_glVertex4iv 0x62 +#define EGL_TOKEN_glVertex4sv 0x63 +#define EGL_TOKEN_glNormal3b 0x64 +#define EGL_TOKEN_glNormal3d 0x65 +#define EGL_TOKEN_glNormal3f 0x66 +#define EGL_TOKEN_glNormal3i 0x67 +#define EGL_TOKEN_glNormal3s 0x68 +#define EGL_TOKEN_glNormal3bv 0x69 +#define EGL_TOKEN_glNormal3dv 0x6a +#define EGL_TOKEN_glNormal3fv 0x6b +#define EGL_TOKEN_glNormal3iv 0x6c +#define EGL_TOKEN_glNormal3sv 0x6d +#define EGL_TOKEN_glIndexd 0x6e +#define EGL_TOKEN_glIndexf 0x6f +#define EGL_TOKEN_glIndexi 0x70 +#define EGL_TOKEN_glIndexs 0x71 +#define EGL_TOKEN_glIndexub 0x72 +#define EGL_TOKEN_glIndexdv 0x73 +#define EGL_TOKEN_glIndexfv 0x74 +#define EGL_TOKEN_glIndexiv 0x75 +#define EGL_TOKEN_glIndexsv 0x76 +#define EGL_TOKEN_glIndexubv 0x77 +#define EGL_TOKEN_glColor3b 0x78 +#define EGL_TOKEN_glColor3d 0x79 +#define EGL_TOKEN_glColor3f 0x7a +#define EGL_TOKEN_glColor3i 0x7b +#define EGL_TOKEN_glColor3s 0x7c +#define EGL_TOKEN_glColor3ub 0x7d +#define EGL_TOKEN_glColor3ui 0x7e +#define EGL_TOKEN_glColor3us 0x7f +#define EGL_TOKEN_glColor4b 0x80 +#define EGL_TOKEN_glColor4d 0x81 +#define EGL_TOKEN_glColor4f 0x82 +#define EGL_TOKEN_glColor4i 0x83 +#define EGL_TOKEN_glColor4s 0x84 +#define EGL_TOKEN_glColor4ub 0x85 +#define EGL_TOKEN_glColor4ui 0x86 +#define EGL_TOKEN_glColor4us 0x87 +#define EGL_TOKEN_glColor3bv 0x88 +#define EGL_TOKEN_glColor3dv 0x89 +#define EGL_TOKEN_glColor3fv 0x8a +#define EGL_TOKEN_glColor3iv 0x8b +#define EGL_TOKEN_glColor3sv 0x8c +#define EGL_TOKEN_glColor3ubv 0x8d +#define EGL_TOKEN_glColor3uiv 0x8e +#define EGL_TOKEN_glColor3usv 0x8f +#define EGL_TOKEN_glColor4bv 0x90 +#define EGL_TOKEN_glColor4dv 0x91 +#define EGL_TOKEN_glColor4fv 0x92 +#define EGL_TOKEN_glColor4iv 0x93 +#define EGL_TOKEN_glColor4sv 0x94 +#define EGL_TOKEN_glColor4ubv 0x95 +#define EGL_TOKEN_glColor4uiv 0x96 +#define EGL_TOKEN_glColor4usv 0x97 +#define EGL_TOKEN_glTexCoord1d 0x98 +#define EGL_TOKEN_glTexCoord1f 0x99 +#define EGL_TOKEN_glTexCoord1i 0x9a +#define EGL_TOKEN_glTexCoord1s 0x9b +#define EGL_TOKEN_glTexCoord2d 0x9c +#define EGL_TOKEN_glTexCoord2f 0x9d +#define EGL_TOKEN_glTexCoord2i 0x9e +#define EGL_TOKEN_glTexCoord2s 0x9f +#define EGL_TOKEN_glTexCoord3d 0xa0 +#define EGL_TOKEN_glTexCoord3f 0xa1 +#define EGL_TOKEN_glTexCoord3i 0xa2 +#define EGL_TOKEN_glTexCoord3s 0xa3 +#define EGL_TOKEN_glTexCoord4d 0xa4 +#define EGL_TOKEN_glTexCoord4f 0xa5 +#define EGL_TOKEN_glTexCoord4i 0xa6 +#define EGL_TOKEN_glTexCoord4s 0xa7 +#define EGL_TOKEN_glTexCoord1dv 0xa8 +#define EGL_TOKEN_glTexCoord1fv 0xa9 +#define EGL_TOKEN_glTexCoord1iv 0xaa +#define EGL_TOKEN_glTexCoord1sv 0xab +#define EGL_TOKEN_glTexCoord2dv 0xac +#define EGL_TOKEN_glTexCoord2fv 0xad +#define EGL_TOKEN_glTexCoord2iv 0xae +#define EGL_TOKEN_glTexCoord2sv 0xaf +#define EGL_TOKEN_glTexCoord3dv 0xb0 +#define EGL_TOKEN_glTexCoord3fv 0xb1 +#define EGL_TOKEN_glTexCoord3iv 0xb2 +#define EGL_TOKEN_glTexCoord3sv 0xb3 +#define EGL_TOKEN_glTexCoord4dv 0xb4 +#define EGL_TOKEN_glTexCoord4fv 0xb5 +#define EGL_TOKEN_glTexCoord4iv 0xb6 +#define EGL_TOKEN_glTexCoord4sv 0xb7 +#define EGL_TOKEN_glRasterPos2d 0xb8 +#define EGL_TOKEN_glRasterPos2f 0xb9 +#define EGL_TOKEN_glRasterPos2i 0xba +#define EGL_TOKEN_glRasterPos2s 0xbb +#define EGL_TOKEN_glRasterPos3d 0xbc +#define EGL_TOKEN_glRasterPos3f 0xbd +#define EGL_TOKEN_glRasterPos3i 0xbe +#define EGL_TOKEN_glRasterPos3s 0xbf +#define EGL_TOKEN_glRasterPos4d 0xc0 +#define EGL_TOKEN_glRasterPos4f 0xc1 +#define EGL_TOKEN_glRasterPos4i 0xc2 +#define EGL_TOKEN_glRasterPos4s 0xc3 +#define EGL_TOKEN_glRasterPos2dv 0xc4 +#define EGL_TOKEN_glRasterPos2fv 0xc5 +#define EGL_TOKEN_glRasterPos2iv 0xc6 +#define EGL_TOKEN_glRasterPos2sv 0xc7 +#define EGL_TOKEN_glRasterPos3dv 0xc8 +#define EGL_TOKEN_glRasterPos3fv 0xc9 +#define EGL_TOKEN_glRasterPos3iv 0xca +#define EGL_TOKEN_glRasterPos3sv 0xcb +#define EGL_TOKEN_glRasterPos4dv 0xcc +#define EGL_TOKEN_glRasterPos4fv 0xcd +#define EGL_TOKEN_glRasterPos4iv 0xce +#define EGL_TOKEN_glRasterPos4sv 0xcf +#define EGL_TOKEN_glRectd 0xd0 +#define EGL_TOKEN_glRectf 0xd1 +#define EGL_TOKEN_glRecti 0xd2 +#define EGL_TOKEN_glRects 0xd3 +#define EGL_TOKEN_glRectdv 0xd4 +#define EGL_TOKEN_glRectfv 0xd5 +#define EGL_TOKEN_glRectiv 0xd6 +#define EGL_TOKEN_glRectsv 0xd7 +#define EGL_TOKEN_glVertexPointer 0xd8 +#define EGL_TOKEN_glNormalPointer 0xd9 +#define EGL_TOKEN_glColorPointer 0xda +#define EGL_TOKEN_glIndexPointer 0xdb +#define EGL_TOKEN_glTexCoordPointer 0xdc +#define EGL_TOKEN_glEdgeFlagPointer 0xdd +#define EGL_TOKEN_glGetPointerv 0xde +#define EGL_TOKEN_glArrayElement 0xdf +#define EGL_TOKEN_glDrawArrays 0xe0 +#define EGL_TOKEN_glDrawElements 0xe1 +#define EGL_TOKEN_glInterleavedArrays 0xe2 +#define EGL_TOKEN_glShadeModel 0xe3 +#define EGL_TOKEN_glLightf 0xe4 +#define EGL_TOKEN_glLighti 0xe5 +#define EGL_TOKEN_glLightfv 0xe6 +#define EGL_TOKEN_glLightiv 0xe7 +#define EGL_TOKEN_glGetLightfv 0xe8 +#define EGL_TOKEN_glGetLightiv 0xe9 +#define EGL_TOKEN_glLightModelf 0xea +#define EGL_TOKEN_glLightModeli 0xeb +#define EGL_TOKEN_glLightModelfv 0xec +#define EGL_TOKEN_glLightModeliv 0xed +#define EGL_TOKEN_glMaterialf 0xee +#define EGL_TOKEN_glMateriali 0xef +#define EGL_TOKEN_glMaterialfv 0xf0 +#define EGL_TOKEN_glMaterialiv 0xf1 +#define EGL_TOKEN_glGetMaterialfv 0xf2 +#define EGL_TOKEN_glGetMaterialiv 0xf3 +#define EGL_TOKEN_glColorMaterial 0xf4 +#define EGL_TOKEN_glPixelZoom 0xf5 +#define EGL_TOKEN_glPixelStoref 0xf6 +#define EGL_TOKEN_glPixelStorei 0xf7 +#define EGL_TOKEN_glPixelTransferf 0xf8 +#define EGL_TOKEN_glPixelTransferi 0xf9 +#define EGL_TOKEN_glPixelMapfv 0xfa +#define EGL_TOKEN_glPixelMapuiv 0xfb +#define EGL_TOKEN_glPixelMapusv 0xfc +#define EGL_TOKEN_glGetPixelMapfv 0xfd +#define EGL_TOKEN_glGetPixelMapuiv 0xfe +#define EGL_TOKEN_glGetPixelMapusv 0xff +#define EGL_TOKEN_glBitmap 0x100 +#define EGL_TOKEN_glReadPixels 0x101 +#define EGL_TOKEN_glDrawPixels 0x102 +#define EGL_TOKEN_glCopyPixels 0x103 +#define EGL_TOKEN_glStencilFunc 0x104 +#define EGL_TOKEN_glStencilMask 0x105 +#define EGL_TOKEN_glStencilOp 0x106 +#define EGL_TOKEN_glClearStencil 0x107 +#define EGL_TOKEN_glTexGend 0x108 +#define EGL_TOKEN_glTexGenf 0x109 +#define EGL_TOKEN_glTexGeni 0x10a +#define EGL_TOKEN_glTexGendv 0x10b +#define EGL_TOKEN_glTexGenfv 0x10c +#define EGL_TOKEN_glTexGeniv 0x10d +#define EGL_TOKEN_glGetTexGendv 0x10e +#define EGL_TOKEN_glGetTexGenfv 0x10f +#define EGL_TOKEN_glGetTexGeniv 0x110 +#define EGL_TOKEN_glTexEnvf 0x111 +#define EGL_TOKEN_glTexEnvi 0x112 +#define EGL_TOKEN_glTexEnvfv 0x113 +#define EGL_TOKEN_glTexEnviv 0x114 +#define EGL_TOKEN_glGetTexEnvfv 0x115 +#define EGL_TOKEN_glGetTexEnviv 0x116 +#define EGL_TOKEN_glTexParameterf 0x117 +#define EGL_TOKEN_glTexParameteri 0x118 +#define EGL_TOKEN_glTexParameterfv 0x119 +#define EGL_TOKEN_glTexParameteriv 0x11a +#define EGL_TOKEN_glGetTexParameterfv 0x11b +#define EGL_TOKEN_glGetTexParameteriv 0x11c +#define EGL_TOKEN_glGetTexLevelParameterfv 0x11d +#define EGL_TOKEN_glGetTexLevelParameteriv 0x11e +#define EGL_TOKEN_glTexImage1D 0x11f +#define EGL_TOKEN_glTexImage2D 0x120 +#define EGL_TOKEN_glGetTexImage 0x121 +#define EGL_TOKEN_glGenTextures 0x122 +#define EGL_TOKEN_glDeleteTextures 0x123 +#define EGL_TOKEN_glBindTexture 0x124 +#define EGL_TOKEN_glPrioritizeTextures 0x125 +#define EGL_TOKEN_glAreTexturesResident 0x126 +#define EGL_TOKEN_glIsTexture 0x127 +#define EGL_TOKEN_glTexSubImage1D 0x128 +#define EGL_TOKEN_glTexSubImage2D 0x129 +#define EGL_TOKEN_glCopyTexImage1D 0x12a +#define EGL_TOKEN_glCopyTexImage2D 0x12b +#define EGL_TOKEN_glCopyTexSubImage1D 0x12c +#define EGL_TOKEN_glCopyTexSubImage2D 0x12d +#define EGL_TOKEN_glMap1d 0x12e +#define EGL_TOKEN_glMap1f 0x12f +#define EGL_TOKEN_glMap2d 0x130 +#define EGL_TOKEN_glMap2f 0x131 +#define EGL_TOKEN_glGetMapdv 0x132 +#define EGL_TOKEN_glGetMapfv 0x133 +#define EGL_TOKEN_glGetMapiv 0x134 +#define EGL_TOKEN_glEvalCoord1d 0x135 +#define EGL_TOKEN_glEvalCoord1f 0x136 +#define EGL_TOKEN_glEvalCoord1dv 0x137 +#define EGL_TOKEN_glEvalCoord1fv 0x138 +#define EGL_TOKEN_glEvalCoord2d 0x139 +#define EGL_TOKEN_glEvalCoord2f 0x13a +#define EGL_TOKEN_glEvalCoord2dv 0x13b +#define EGL_TOKEN_glEvalCoord2fv 0x13c +#define EGL_TOKEN_glMapGrid1d 0x13d +#define EGL_TOKEN_glMapGrid1f 0x13e +#define EGL_TOKEN_glMapGrid2d 0x13f +#define EGL_TOKEN_glMapGrid2f 0x140 +#define EGL_TOKEN_glEvalPoint1 0x141 +#define EGL_TOKEN_glEvalPoint2 0x142 +#define EGL_TOKEN_glEvalMesh1 0x143 +#define EGL_TOKEN_glEvalMesh2 0x144 +#define EGL_TOKEN_glFogf 0x145 +#define EGL_TOKEN_glFogi 0x146 +#define EGL_TOKEN_glFogfv 0x147 +#define EGL_TOKEN_glFogiv 0x148 +#define EGL_TOKEN_glFeedbackBuffer 0x149 +#define EGL_TOKEN_glPassThrough 0x14a +#define EGL_TOKEN_glSelectBuffer 0x14b +#define EGL_TOKEN_glInitNames 0x14c +#define EGL_TOKEN_glLoadName 0x14d +#define EGL_TOKEN_glPushName 0x14e +#define EGL_TOKEN_glPopName 0x14f +#define EGL_TOKEN_glDrawRangeElements 0x150 +#define EGL_TOKEN_glTexImage3D 0x151 +#define EGL_TOKEN_glTexSubImage3D 0x152 +#define EGL_TOKEN_glCopyTexSubImage3D 0x153 +#define EGL_TOKEN_glColorTable 0x154 +#define EGL_TOKEN_glColorSubTable 0x155 +#define EGL_TOKEN_glColorTableParameteriv 0x156 +#define EGL_TOKEN_glColorTableParameterfv 0x157 +#define EGL_TOKEN_glCopyColorSubTable 0x158 +#define EGL_TOKEN_glCopyColorTable 0x159 +#define EGL_TOKEN_glGetColorTable 0x15a +#define EGL_TOKEN_glGetColorTableParameterfv 0x15b +#define EGL_TOKEN_glGetColorTableParameteriv 0x15c +#define EGL_TOKEN_glBlendEquation 0x15d +#define EGL_TOKEN_glBlendColor 0x15e +#define EGL_TOKEN_glHistogram 0x15f +#define EGL_TOKEN_glResetHistogram 0x160 +#define EGL_TOKEN_glGetHistogram 0x161 +#define EGL_TOKEN_glGetHistogramParameterfv 0x162 +#define EGL_TOKEN_glGetHistogramParameteriv 0x163 +#define EGL_TOKEN_glMinmax 0x164 +#define EGL_TOKEN_glResetMinmax 0x165 +#define EGL_TOKEN_glGetMinmax 0x166 +#define EGL_TOKEN_glGetMinmaxParameterfv 0x167 +#define EGL_TOKEN_glGetMinmaxParameteriv 0x168 +#define EGL_TOKEN_glConvolutionFilter1D 0x169 +#define EGL_TOKEN_glConvolutionFilter2D 0x16a +#define EGL_TOKEN_glConvolutionParameterf 0x16b +#define EGL_TOKEN_glConvolutionParameterfv 0x16c +#define EGL_TOKEN_glConvolutionParameteri 0x16d +#define EGL_TOKEN_glConvolutionParameteriv 0x16e +#define EGL_TOKEN_glCopyConvolutionFilter1D 0x16f +#define EGL_TOKEN_glCopyConvolutionFilter2D 0x170 +#define EGL_TOKEN_glGetConvolutionFilter 0x171 +#define EGL_TOKEN_glGetConvolutionParameterfv 0x172 +#define EGL_TOKEN_glGetConvolutionParameteriv 0x173 +#define EGL_TOKEN_glSeparableFilter2D 0x174 +#define EGL_TOKEN_glGetSeparableFilter 0x175 +#define EGL_TOKEN_glActiveTexture 0x176 +#define EGL_TOKEN_glClientActiveTexture 0x177 +#define EGL_TOKEN_glCompressedTexImage1D 0x178 +#define EGL_TOKEN_glCompressedTexImage2D 0x179 +#define EGL_TOKEN_glCompressedTexImage3D 0x17a +#define EGL_TOKEN_glCompressedTexSubImage1D 0x17b +#define EGL_TOKEN_glCompressedTexSubImage2D 0x17c +#define EGL_TOKEN_glCompressedTexSubImage3D 0x17d +#define EGL_TOKEN_glGetCompressedTexImage 0x17e +#define EGL_TOKEN_glMultiTexCoord1d 0x17f +#define EGL_TOKEN_glMultiTexCoord1dv 0x180 +#define EGL_TOKEN_glMultiTexCoord1f 0x181 +#define EGL_TOKEN_glMultiTexCoord1fv 0x182 +#define EGL_TOKEN_glMultiTexCoord1i 0x183 +#define EGL_TOKEN_glMultiTexCoord1iv 0x184 +#define EGL_TOKEN_glMultiTexCoord1s 0x185 +#define EGL_TOKEN_glMultiTexCoord1sv 0x186 +#define EGL_TOKEN_glMultiTexCoord2d 0x187 +#define EGL_TOKEN_glMultiTexCoord2dv 0x188 +#define EGL_TOKEN_glMultiTexCoord2f 0x189 +#define EGL_TOKEN_glMultiTexCoord2fv 0x18a +#define EGL_TOKEN_glMultiTexCoord2i 0x18b +#define EGL_TOKEN_glMultiTexCoord2iv 0x18c +#define EGL_TOKEN_glMultiTexCoord2s 0x18d +#define EGL_TOKEN_glMultiTexCoord2sv 0x18e +#define EGL_TOKEN_glMultiTexCoord3d 0x18f +#define EGL_TOKEN_glMultiTexCoord3dv 0x190 +#define EGL_TOKEN_glMultiTexCoord3f 0x191 +#define EGL_TOKEN_glMultiTexCoord3fv 0x192 +#define EGL_TOKEN_glMultiTexCoord3i 0x193 +#define EGL_TOKEN_glMultiTexCoord3iv 0x194 +#define EGL_TOKEN_glMultiTexCoord3s 0x195 +#define EGL_TOKEN_glMultiTexCoord3sv 0x196 +#define EGL_TOKEN_glMultiTexCoord4d 0x197 +#define EGL_TOKEN_glMultiTexCoord4dv 0x198 +#define EGL_TOKEN_glMultiTexCoord4f 0x199 +#define EGL_TOKEN_glMultiTexCoord4fv 0x19a +#define EGL_TOKEN_glMultiTexCoord4i 0x19b +#define EGL_TOKEN_glMultiTexCoord4iv 0x19c +#define EGL_TOKEN_glMultiTexCoord4s 0x19d +#define EGL_TOKEN_glMultiTexCoord4sv 0x19e +#define EGL_TOKEN_glLoadTransposeMatrixd 0x19f +#define EGL_TOKEN_glLoadTransposeMatrixf 0x1a0 +#define EGL_TOKEN_glMultTransposeMatrixd 0x1a1 +#define EGL_TOKEN_glMultTransposeMatrixf 0x1a2 +#define EGL_TOKEN_glSampleCoverage 0x1a3 +#define EGL_TOKEN_glActiveTextureARB 0x1a4 +#define EGL_TOKEN_glClientActiveTextureARB 0x1a5 +#define EGL_TOKEN_glMultiTexCoord1dARB 0x1a6 +#define EGL_TOKEN_glMultiTexCoord1dvARB 0x1a7 +#define EGL_TOKEN_glMultiTexCoord1fARB 0x1a8 +#define EGL_TOKEN_glMultiTexCoord1fvARB 0x1a9 +#define EGL_TOKEN_glMultiTexCoord1iARB 0x1aa +#define EGL_TOKEN_glMultiTexCoord1ivARB 0x1ab +#define EGL_TOKEN_glMultiTexCoord1sARB 0x1ac +#define EGL_TOKEN_glMultiTexCoord1svARB 0x1ad +#define EGL_TOKEN_glMultiTexCoord2dARB 0x1ae +#define EGL_TOKEN_glMultiTexCoord2dvARB 0x1af +#define EGL_TOKEN_glMultiTexCoord2fARB 0x1b0 +#define EGL_TOKEN_glMultiTexCoord2fvARB 0x1b1 +#define EGL_TOKEN_glMultiTexCoord2iARB 0x1b2 +#define EGL_TOKEN_glMultiTexCoord2ivARB 0x1b3 +#define EGL_TOKEN_glMultiTexCoord2sARB 0x1b4 +#define EGL_TOKEN_glMultiTexCoord2svARB 0x1b5 +#define EGL_TOKEN_glMultiTexCoord3dARB 0x1b6 +#define EGL_TOKEN_glMultiTexCoord3dvARB 0x1b7 +#define EGL_TOKEN_glMultiTexCoord3fARB 0x1b8 +#define EGL_TOKEN_glMultiTexCoord3fvARB 0x1b9 +#define EGL_TOKEN_glMultiTexCoord3iARB 0x1ba +#define EGL_TOKEN_glMultiTexCoord3ivARB 0x1bb +#define EGL_TOKEN_glMultiTexCoord3sARB 0x1bc +#define EGL_TOKEN_glMultiTexCoord3svARB 0x1bd +#define EGL_TOKEN_glMultiTexCoord4dARB 0x1be +#define EGL_TOKEN_glMultiTexCoord4dvARB 0x1bf +#define EGL_TOKEN_glMultiTexCoord4fARB 0x1c0 +#define EGL_TOKEN_glMultiTexCoord4fvARB 0x1c1 +#define EGL_TOKEN_glMultiTexCoord4iARB 0x1c2 +#define EGL_TOKEN_glMultiTexCoord4ivARB 0x1c3 +#define EGL_TOKEN_glMultiTexCoord4sARB 0x1c4 +#define EGL_TOKEN_glMultiTexCoord4svARB 0x1c5 + +#endif diff --git a/Glut/EmptyGL/GL/egl_void.h b/Glut/EmptyGL/GL/egl_void.h index 4acf38454..82cb7e361 100644 --- a/Glut/EmptyGL/GL/egl_void.h +++ b/Glut/EmptyGL/GL/egl_void.h @@ -1,422 +1,422 @@ -#define glClearIndex(_a0) {(void)(_a0);} -#define glClearColor(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glIndexMask(_a0) {(void)(_a0);} -#define glColorMask(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glAlphaFunc(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glBlendFunc(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glLogicOp(_a0) {(void)(_a0);} -#define glCullFace(_a0) {(void)(_a0);} -#define glFrontFace(_a0) {(void)(_a0);} -#define glPointSize(_a0) {(void)(_a0);} -#define glLineWidth(_a0) {(void)(_a0);} -#define glLineStipple(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPolygonMode(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPolygonOffset(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPolygonStipple(_a0) {(void)(_a0);} -#define glGetPolygonStipple(_a0) {(void)(_a0);} -#define glEdgeFlag(_a0) {(void)(_a0);} -#define glEdgeFlagv(_a0) {(void)(_a0);} -#define glScissor(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glClipPlane(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glGetClipPlane(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glDrawBuffer(_a0) {(void)(_a0);} -#define glReadBuffer(_a0) {(void)(_a0);} -#define glEnable(_a0) {(void)(_a0);} -#define glDisable(_a0) {(void)(_a0);} -#define glEnableClientState(_a0) {(void)(_a0);} -#define glDisableClientState(_a0) {(void)(_a0);} -#define glPushAttrib(_a0) {(void)(_a0);} -#define glPopAttrib() {} -#define glPushClientAttrib(_a0) {(void)(_a0);} -#define glPopClientAttrib() {} -#define glHint(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glClearDepth(_a0) {(void)(_a0);} -#define glDepthFunc(_a0) {(void)(_a0);} -#define glDepthMask(_a0) {(void)(_a0);} -#define glDepthRange(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glClearAccum(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glAccum(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glDeleteLists(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glNewList(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glEndList() {} -#define glCallList(_a0) {(void)(_a0);} -#define glCallLists(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glListBase(_a0) {(void)(_a0);} -#define glBegin(_a0) {(void)(_a0);} -#define glEnd() {} -#define glVertex2d(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glVertex2f(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glVertex2i(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glVertex2s(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glVertex3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glVertex3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glVertex3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glVertex3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glVertex4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glVertex4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glVertex4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glVertex4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glVertex2dv(_a0) {(void)(_a0);} -#define glVertex2fv(_a0) {(void)(_a0);} -#define glVertex2iv(_a0) {(void)(_a0);} -#define glVertex2sv(_a0) {(void)(_a0);} -#define glVertex3dv(_a0) {(void)(_a0);} -#define glVertex3fv(_a0) {(void)(_a0);} -#define glVertex3iv(_a0) {(void)(_a0);} -#define glVertex3sv(_a0) {(void)(_a0);} -#define glVertex4dv(_a0) {(void)(_a0);} -#define glVertex4fv(_a0) {(void)(_a0);} -#define glVertex4iv(_a0) {(void)(_a0);} -#define glVertex4sv(_a0) {(void)(_a0);} -#define glNormal3b(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glNormal3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glNormal3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glNormal3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glNormal3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glNormal3bv(_a0) {(void)(_a0);} -#define glNormal3dv(_a0) {(void)(_a0);} -#define glNormal3fv(_a0) {(void)(_a0);} -#define glNormal3iv(_a0) {(void)(_a0);} -#define glNormal3sv(_a0) {(void)(_a0);} -#define glIndexd(_a0) {(void)(_a0);} -#define glIndexf(_a0) {(void)(_a0);} -#define glIndexi(_a0) {(void)(_a0);} -#define glIndexs(_a0) {(void)(_a0);} -#define glIndexub(_a0) {(void)(_a0);} -#define glIndexdv(_a0) {(void)(_a0);} -#define glIndexfv(_a0) {(void)(_a0);} -#define glIndexiv(_a0) {(void)(_a0);} -#define glIndexsv(_a0) {(void)(_a0);} -#define glIndexubv(_a0) {(void)(_a0);} -#define glColor3b(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3ub(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3ui(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor3us(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColor4b(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4ub(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4ui(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor4us(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glColor3bv(_a0) {(void)(_a0);} -#define glColor3dv(_a0) {(void)(_a0);} -#define glColor3fv(_a0) {(void)(_a0);} -#define glColor3iv(_a0) {(void)(_a0);} -#define glColor3sv(_a0) {(void)(_a0);} -#define glColor3ubv(_a0) {(void)(_a0);} -#define glColor3uiv(_a0) {(void)(_a0);} -#define glColor3usv(_a0) {(void)(_a0);} -#define glColor4bv(_a0) {(void)(_a0);} -#define glColor4dv(_a0) {(void)(_a0);} -#define glColor4fv(_a0) {(void)(_a0);} -#define glColor4iv(_a0) {(void)(_a0);} -#define glColor4sv(_a0) {(void)(_a0);} -#define glColor4ubv(_a0) {(void)(_a0);} -#define glColor4uiv(_a0) {(void)(_a0);} -#define glColor4usv(_a0) {(void)(_a0);} -#define glTexCoord1d(_a0) {(void)(_a0);} -#define glTexCoord1f(_a0) {(void)(_a0);} -#define glTexCoord1i(_a0) {(void)(_a0);} -#define glTexCoord1s(_a0) {(void)(_a0);} -#define glTexCoord2d(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glTexCoord2f(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glTexCoord2i(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glTexCoord2s(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glTexCoord3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexCoord3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexCoord3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexCoord3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexCoord4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glTexCoord4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glTexCoord4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glTexCoord4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glTexCoord1dv(_a0) {(void)(_a0);} -#define glTexCoord1fv(_a0) {(void)(_a0);} -#define glTexCoord1iv(_a0) {(void)(_a0);} -#define glTexCoord1sv(_a0) {(void)(_a0);} -#define glTexCoord2dv(_a0) {(void)(_a0);} -#define glTexCoord2fv(_a0) {(void)(_a0);} -#define glTexCoord2iv(_a0) {(void)(_a0);} -#define glTexCoord2sv(_a0) {(void)(_a0);} -#define glTexCoord3dv(_a0) {(void)(_a0);} -#define glTexCoord3fv(_a0) {(void)(_a0);} -#define glTexCoord3iv(_a0) {(void)(_a0);} -#define glTexCoord3sv(_a0) {(void)(_a0);} -#define glTexCoord4dv(_a0) {(void)(_a0);} -#define glTexCoord4fv(_a0) {(void)(_a0);} -#define glTexCoord4iv(_a0) {(void)(_a0);} -#define glTexCoord4sv(_a0) {(void)(_a0);} -#define glRasterPos2d(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRasterPos2f(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRasterPos2i(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRasterPos2s(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRasterPos3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glRasterPos3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glRasterPos3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glRasterPos3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glRasterPos4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRasterPos4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRasterPos4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRasterPos4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRasterPos2dv(_a0) {(void)(_a0);} -#define glRasterPos2fv(_a0) {(void)(_a0);} -#define glRasterPos2iv(_a0) {(void)(_a0);} -#define glRasterPos2sv(_a0) {(void)(_a0);} -#define glRasterPos3dv(_a0) {(void)(_a0);} -#define glRasterPos3fv(_a0) {(void)(_a0);} -#define glRasterPos3iv(_a0) {(void)(_a0);} -#define glRasterPos3sv(_a0) {(void)(_a0);} -#define glRasterPos4dv(_a0) {(void)(_a0);} -#define glRasterPos4fv(_a0) {(void)(_a0);} -#define glRasterPos4iv(_a0) {(void)(_a0);} -#define glRasterPos4sv(_a0) {(void)(_a0);} -#define glRectd(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRectf(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRecti(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRects(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glRectdv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRectfv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRectiv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glRectsv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glVertexPointer(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glNormalPointer(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColorPointer(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glIndexPointer(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexCoordPointer(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glEdgeFlagPointer(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glGetPointerv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glArrayElement(_a0) {(void)(_a0);} -#define glDrawArrays(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glDrawElements(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glInterleavedArrays(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glShadeModel(_a0) {(void)(_a0);} -#define glLightf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glLighti(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glLightfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glLightiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetLightfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetLightiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glLightModelf(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glLightModeli(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glLightModelfv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glLightModeliv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMaterialf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMateriali(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMaterialfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMaterialiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetMaterialfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetMaterialiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColorMaterial(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPixelZoom(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPixelStoref(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPixelStorei(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPixelTransferf(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPixelTransferi(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPixelMapfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glPixelMapuiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glPixelMapusv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetPixelMapfv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glGetPixelMapuiv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glGetPixelMapusv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glBitmap(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glReadPixels(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glDrawPixels(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glCopyPixels(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glStencilFunc(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glStencilMask(_a0) {(void)(_a0);} -#define glStencilOp(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glClearStencil(_a0) {(void)(_a0);} -#define glTexGend(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexGenf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexGeni(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexGendv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexGenfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexGeniv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexGendv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexGenfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexGeniv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexEnvf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexEnvi(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexEnvfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexEnviv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexEnvfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexEnviv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexParameterf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexParameteri(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetTexLevelParameterfv(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glGetTexLevelParameteriv(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glTexImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} -#define glTexImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} -#define glGetTexImage(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glGenTextures(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glDeleteTextures(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glBindTexture(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glPrioritizeTextures(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glTexSubImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glTexSubImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} -#define glCopyTexImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glCopyTexImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} -#define glCopyTexSubImage1D(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glCopyTexSubImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} -#define glMap1d(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glMap1f(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glMap2d(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);} -#define glMap2f(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);} -#define glGetMapdv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetMapfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetMapiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glEvalCoord1d(_a0) {(void)(_a0);} -#define glEvalCoord1f(_a0) {(void)(_a0);} -#define glEvalCoord1dv(_a0) {(void)(_a0);} -#define glEvalCoord1fv(_a0) {(void)(_a0);} -#define glEvalCoord2d(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glEvalCoord2f(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glEvalCoord2dv(_a0) {(void)(_a0);} -#define glEvalCoord2fv(_a0) {(void)(_a0);} -#define glMapGrid1d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMapGrid1f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMapGrid2d(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glMapGrid2f(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glEvalPoint1(_a0) {(void)(_a0);} -#define glEvalPoint2(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glEvalMesh1(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glEvalMesh2(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glFogf(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glFogi(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glFogfv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glFogiv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glFeedbackBuffer(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glPassThrough(_a0) {(void)(_a0);} -#define glSelectBuffer(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glInitNames() {} -#define glLoadName(_a0) {(void)(_a0);} -#define glPushName(_a0) {(void)(_a0);} -#define glPopName() {} -#define glDrawRangeElements(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glTexImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);} -#define glTexSubImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9,_a10) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);(void)(_a10);} -#define glCopyTexSubImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} -#define glColorTable(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glColorSubTable(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glColorTableParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glColorTableParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glCopyColorSubTable(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glCopyColorTable(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glGetColorTable(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glGetColorTableParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetColorTableParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glBlendEquation(_a0) {(void)(_a0);} -#define glBlendColor(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glHistogram(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glResetHistogram(_a0) {(void)(_a0);} -#define glGetHistogram(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glGetHistogramParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetHistogramParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMinmax(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glResetMinmax(_a0) {(void)(_a0);} -#define glGetMinmax(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glGetMinmaxParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetMinmaxParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glConvolutionFilter1D(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glConvolutionFilter2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glConvolutionParameterf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glConvolutionParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glConvolutionParameteri(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glConvolutionParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glCopyConvolutionFilter1D(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glCopyConvolutionFilter2D(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glGetConvolutionFilter(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glGetConvolutionParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glGetConvolutionParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glSeparableFilter2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} -#define glGetSeparableFilter(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} -#define glActiveTexture(_a0) {(void)(_a0);} -#define glClientActiveTexture(_a0) {(void)(_a0);} -#define glCompressedTexImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glCompressedTexImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} -#define glCompressedTexImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} -#define glCompressedTexSubImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} -#define glCompressedTexSubImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} -#define glCompressedTexSubImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9,_a10) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);(void)(_a10);} -#define glGetCompressedTexImage(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord1d(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1dv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1f(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1fv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1i(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1iv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1s(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1sv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2dv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2fv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2iv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2sv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3dv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3fv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3iv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3sv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4d(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4dv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4f(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4fv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4i(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4iv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4s(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4sv(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glLoadTransposeMatrixd(_a0) {(void)(_a0);} -#define glLoadTransposeMatrixf(_a0) {(void)(_a0);} -#define glMultTransposeMatrixd(_a0) {(void)(_a0);} -#define glMultTransposeMatrixf(_a0) {(void)(_a0);} -#define glSampleCoverage(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glActiveTextureARB(_a0) {(void)(_a0);} -#define glClientActiveTextureARB(_a0) {(void)(_a0);} -#define glMultiTexCoord1dARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1fARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1iARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1sARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord1svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2dARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2fARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2iARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord2sARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} -#define glMultiTexCoord2svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3dARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3fARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3iARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord3sARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} -#define glMultiTexCoord3svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4dARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4fARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4iARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} -#define glMultiTexCoord4sARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} -#define glMultiTexCoord4svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glClearIndex(_a0) {(void)(_a0);} +#define glClearColor(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glIndexMask(_a0) {(void)(_a0);} +#define glColorMask(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glAlphaFunc(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glBlendFunc(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glLogicOp(_a0) {(void)(_a0);} +#define glCullFace(_a0) {(void)(_a0);} +#define glFrontFace(_a0) {(void)(_a0);} +#define glPointSize(_a0) {(void)(_a0);} +#define glLineWidth(_a0) {(void)(_a0);} +#define glLineStipple(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPolygonMode(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPolygonOffset(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPolygonStipple(_a0) {(void)(_a0);} +#define glGetPolygonStipple(_a0) {(void)(_a0);} +#define glEdgeFlag(_a0) {(void)(_a0);} +#define glEdgeFlagv(_a0) {(void)(_a0);} +#define glScissor(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glClipPlane(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glGetClipPlane(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glDrawBuffer(_a0) {(void)(_a0);} +#define glReadBuffer(_a0) {(void)(_a0);} +#define glEnable(_a0) {(void)(_a0);} +#define glDisable(_a0) {(void)(_a0);} +#define glEnableClientState(_a0) {(void)(_a0);} +#define glDisableClientState(_a0) {(void)(_a0);} +#define glPushAttrib(_a0) {(void)(_a0);} +#define glPopAttrib() {} +#define glPushClientAttrib(_a0) {(void)(_a0);} +#define glPopClientAttrib() {} +#define glHint(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glClearDepth(_a0) {(void)(_a0);} +#define glDepthFunc(_a0) {(void)(_a0);} +#define glDepthMask(_a0) {(void)(_a0);} +#define glDepthRange(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glClearAccum(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glAccum(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glDeleteLists(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glNewList(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glEndList() {} +#define glCallList(_a0) {(void)(_a0);} +#define glCallLists(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glListBase(_a0) {(void)(_a0);} +#define glBegin(_a0) {(void)(_a0);} +#define glEnd() {} +#define glVertex2d(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glVertex2f(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glVertex2i(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glVertex2s(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glVertex3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glVertex3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glVertex3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glVertex3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glVertex4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glVertex4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glVertex4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glVertex4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glVertex2dv(_a0) {(void)(_a0);} +#define glVertex2fv(_a0) {(void)(_a0);} +#define glVertex2iv(_a0) {(void)(_a0);} +#define glVertex2sv(_a0) {(void)(_a0);} +#define glVertex3dv(_a0) {(void)(_a0);} +#define glVertex3fv(_a0) {(void)(_a0);} +#define glVertex3iv(_a0) {(void)(_a0);} +#define glVertex3sv(_a0) {(void)(_a0);} +#define glVertex4dv(_a0) {(void)(_a0);} +#define glVertex4fv(_a0) {(void)(_a0);} +#define glVertex4iv(_a0) {(void)(_a0);} +#define glVertex4sv(_a0) {(void)(_a0);} +#define glNormal3b(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glNormal3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glNormal3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glNormal3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glNormal3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glNormal3bv(_a0) {(void)(_a0);} +#define glNormal3dv(_a0) {(void)(_a0);} +#define glNormal3fv(_a0) {(void)(_a0);} +#define glNormal3iv(_a0) {(void)(_a0);} +#define glNormal3sv(_a0) {(void)(_a0);} +#define glIndexd(_a0) {(void)(_a0);} +#define glIndexf(_a0) {(void)(_a0);} +#define glIndexi(_a0) {(void)(_a0);} +#define glIndexs(_a0) {(void)(_a0);} +#define glIndexub(_a0) {(void)(_a0);} +#define glIndexdv(_a0) {(void)(_a0);} +#define glIndexfv(_a0) {(void)(_a0);} +#define glIndexiv(_a0) {(void)(_a0);} +#define glIndexsv(_a0) {(void)(_a0);} +#define glIndexubv(_a0) {(void)(_a0);} +#define glColor3b(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3ub(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3ui(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor3us(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColor4b(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4ub(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4ui(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor4us(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glColor3bv(_a0) {(void)(_a0);} +#define glColor3dv(_a0) {(void)(_a0);} +#define glColor3fv(_a0) {(void)(_a0);} +#define glColor3iv(_a0) {(void)(_a0);} +#define glColor3sv(_a0) {(void)(_a0);} +#define glColor3ubv(_a0) {(void)(_a0);} +#define glColor3uiv(_a0) {(void)(_a0);} +#define glColor3usv(_a0) {(void)(_a0);} +#define glColor4bv(_a0) {(void)(_a0);} +#define glColor4dv(_a0) {(void)(_a0);} +#define glColor4fv(_a0) {(void)(_a0);} +#define glColor4iv(_a0) {(void)(_a0);} +#define glColor4sv(_a0) {(void)(_a0);} +#define glColor4ubv(_a0) {(void)(_a0);} +#define glColor4uiv(_a0) {(void)(_a0);} +#define glColor4usv(_a0) {(void)(_a0);} +#define glTexCoord1d(_a0) {(void)(_a0);} +#define glTexCoord1f(_a0) {(void)(_a0);} +#define glTexCoord1i(_a0) {(void)(_a0);} +#define glTexCoord1s(_a0) {(void)(_a0);} +#define glTexCoord2d(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glTexCoord2f(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glTexCoord2i(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glTexCoord2s(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glTexCoord3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexCoord3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexCoord3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexCoord3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexCoord4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glTexCoord4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glTexCoord4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glTexCoord4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glTexCoord1dv(_a0) {(void)(_a0);} +#define glTexCoord1fv(_a0) {(void)(_a0);} +#define glTexCoord1iv(_a0) {(void)(_a0);} +#define glTexCoord1sv(_a0) {(void)(_a0);} +#define glTexCoord2dv(_a0) {(void)(_a0);} +#define glTexCoord2fv(_a0) {(void)(_a0);} +#define glTexCoord2iv(_a0) {(void)(_a0);} +#define glTexCoord2sv(_a0) {(void)(_a0);} +#define glTexCoord3dv(_a0) {(void)(_a0);} +#define glTexCoord3fv(_a0) {(void)(_a0);} +#define glTexCoord3iv(_a0) {(void)(_a0);} +#define glTexCoord3sv(_a0) {(void)(_a0);} +#define glTexCoord4dv(_a0) {(void)(_a0);} +#define glTexCoord4fv(_a0) {(void)(_a0);} +#define glTexCoord4iv(_a0) {(void)(_a0);} +#define glTexCoord4sv(_a0) {(void)(_a0);} +#define glRasterPos2d(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRasterPos2f(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRasterPos2i(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRasterPos2s(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRasterPos3d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glRasterPos3f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glRasterPos3i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glRasterPos3s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glRasterPos4d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRasterPos4f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRasterPos4i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRasterPos4s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRasterPos2dv(_a0) {(void)(_a0);} +#define glRasterPos2fv(_a0) {(void)(_a0);} +#define glRasterPos2iv(_a0) {(void)(_a0);} +#define glRasterPos2sv(_a0) {(void)(_a0);} +#define glRasterPos3dv(_a0) {(void)(_a0);} +#define glRasterPos3fv(_a0) {(void)(_a0);} +#define glRasterPos3iv(_a0) {(void)(_a0);} +#define glRasterPos3sv(_a0) {(void)(_a0);} +#define glRasterPos4dv(_a0) {(void)(_a0);} +#define glRasterPos4fv(_a0) {(void)(_a0);} +#define glRasterPos4iv(_a0) {(void)(_a0);} +#define glRasterPos4sv(_a0) {(void)(_a0);} +#define glRectd(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRectf(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRecti(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRects(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glRectdv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRectfv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRectiv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glRectsv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glVertexPointer(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glNormalPointer(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColorPointer(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glIndexPointer(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexCoordPointer(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glEdgeFlagPointer(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glGetPointerv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glArrayElement(_a0) {(void)(_a0);} +#define glDrawArrays(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glDrawElements(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glInterleavedArrays(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glShadeModel(_a0) {(void)(_a0);} +#define glLightf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glLighti(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glLightfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glLightiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetLightfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetLightiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glLightModelf(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glLightModeli(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glLightModelfv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glLightModeliv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMaterialf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMateriali(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMaterialfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMaterialiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetMaterialfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetMaterialiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColorMaterial(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPixelZoom(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPixelStoref(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPixelStorei(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPixelTransferf(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPixelTransferi(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPixelMapfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glPixelMapuiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glPixelMapusv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetPixelMapfv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glGetPixelMapuiv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glGetPixelMapusv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glBitmap(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glReadPixels(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glDrawPixels(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glCopyPixels(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glStencilFunc(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glStencilMask(_a0) {(void)(_a0);} +#define glStencilOp(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glClearStencil(_a0) {(void)(_a0);} +#define glTexGend(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexGenf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexGeni(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexGendv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexGenfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexGeniv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexGendv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexGenfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexGeniv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexEnvf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexEnvi(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexEnvfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexEnviv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexEnvfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexEnviv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexParameterf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexParameteri(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetTexLevelParameterfv(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glGetTexLevelParameteriv(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glTexImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} +#define glTexImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} +#define glGetTexImage(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glGenTextures(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glDeleteTextures(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glBindTexture(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glPrioritizeTextures(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glTexSubImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glTexSubImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} +#define glCopyTexImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glCopyTexImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} +#define glCopyTexSubImage1D(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glCopyTexSubImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} +#define glMap1d(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glMap1f(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glMap2d(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);} +#define glMap2f(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);} +#define glGetMapdv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetMapfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetMapiv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glEvalCoord1d(_a0) {(void)(_a0);} +#define glEvalCoord1f(_a0) {(void)(_a0);} +#define glEvalCoord1dv(_a0) {(void)(_a0);} +#define glEvalCoord1fv(_a0) {(void)(_a0);} +#define glEvalCoord2d(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glEvalCoord2f(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glEvalCoord2dv(_a0) {(void)(_a0);} +#define glEvalCoord2fv(_a0) {(void)(_a0);} +#define glMapGrid1d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMapGrid1f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMapGrid2d(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glMapGrid2f(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glEvalPoint1(_a0) {(void)(_a0);} +#define glEvalPoint2(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glEvalMesh1(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glEvalMesh2(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glFogf(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glFogi(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glFogfv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glFogiv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glFeedbackBuffer(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glPassThrough(_a0) {(void)(_a0);} +#define glSelectBuffer(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glInitNames() {} +#define glLoadName(_a0) {(void)(_a0);} +#define glPushName(_a0) {(void)(_a0);} +#define glPopName() {} +#define glDrawRangeElements(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glTexImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);} +#define glTexSubImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9,_a10) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);(void)(_a10);} +#define glCopyTexSubImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} +#define glColorTable(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glColorSubTable(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glColorTableParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glColorTableParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glCopyColorSubTable(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glCopyColorTable(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glGetColorTable(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glGetColorTableParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetColorTableParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glBlendEquation(_a0) {(void)(_a0);} +#define glBlendColor(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glHistogram(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glResetHistogram(_a0) {(void)(_a0);} +#define glGetHistogram(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glGetHistogramParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetHistogramParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMinmax(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glResetMinmax(_a0) {(void)(_a0);} +#define glGetMinmax(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glGetMinmaxParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetMinmaxParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glConvolutionFilter1D(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glConvolutionFilter2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glConvolutionParameterf(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glConvolutionParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glConvolutionParameteri(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glConvolutionParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glCopyConvolutionFilter1D(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glCopyConvolutionFilter2D(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glGetConvolutionFilter(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glGetConvolutionParameterfv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glGetConvolutionParameteriv(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glSeparableFilter2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} +#define glGetSeparableFilter(_a0,_a1,_a2,_a3,_a4,_a5) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);} +#define glActiveTexture(_a0) {(void)(_a0);} +#define glClientActiveTexture(_a0) {(void)(_a0);} +#define glCompressedTexImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glCompressedTexImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);} +#define glCompressedTexImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} +#define glCompressedTexSubImage1D(_a0,_a1,_a2,_a3,_a4,_a5,_a6) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);} +#define glCompressedTexSubImage2D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);} +#define glCompressedTexSubImage3D(_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7,_a8,_a9,_a10) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);(void)(_a5);(void)(_a6);(void)(_a7);(void)(_a8);(void)(_a9);(void)(_a10);} +#define glGetCompressedTexImage(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord1d(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1dv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1f(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1fv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1i(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1iv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1s(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1sv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2d(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2dv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2f(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2fv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2i(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2iv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2s(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2sv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3d(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3dv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3f(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3fv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3i(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3iv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3s(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3sv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4d(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4dv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4f(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4fv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4i(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4iv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4s(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4sv(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glLoadTransposeMatrixd(_a0) {(void)(_a0);} +#define glLoadTransposeMatrixf(_a0) {(void)(_a0);} +#define glMultTransposeMatrixd(_a0) {(void)(_a0);} +#define glMultTransposeMatrixf(_a0) {(void)(_a0);} +#define glSampleCoverage(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glActiveTextureARB(_a0) {(void)(_a0);} +#define glClientActiveTextureARB(_a0) {(void)(_a0);} +#define glMultiTexCoord1dARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1fARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1iARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1sARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord1svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2dARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2fARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2iARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord2sARB(_a0,_a1,_a2) {(void)(_a0);(void)(_a1);(void)(_a2);} +#define glMultiTexCoord2svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3dARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3fARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3iARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord3sARB(_a0,_a1,_a2,_a3) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);} +#define glMultiTexCoord3svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4dARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4dvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4fARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4fvARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4iARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4ivARB(_a0,_a1) {(void)(_a0);(void)(_a1);} +#define glMultiTexCoord4sARB(_a0,_a1,_a2,_a3,_a4) {(void)(_a0);(void)(_a1);(void)(_a2);(void)(_a3);(void)(_a4);} +#define glMultiTexCoord4svARB(_a0,_a1) {(void)(_a0);(void)(_a1);} diff --git a/Glut/EmptyGL/GL/gl.h b/Glut/EmptyGL/GL/gl.h index 6bc09fc35..ee588a607 100644 --- a/Glut/EmptyGL/GL/gl.h +++ b/Glut/EmptyGL/GL/gl.h @@ -1,47 +1,47 @@ -#ifndef __EGL_H -#define __EGL_H - -// include types and defines - -#include - -// include log tokens - -#include - -// include simple void functions we ignore - -#include - -// include functions that need a bit of work, but we don't log - -#include - -// include functions we log - -#ifdef EGL_LOG_PTR - -extern unsigned int *EGL_LOG_PTR; - -inline void xGLL(int a) { *EGL_LOG_PTR=(unsigned int)a; EGL_LOG_PTR++; }; -inline void xGLL(unsigned int a) { *EGL_LOG_PTR=a; EGL_LOG_PTR++; }; -inline void xGLL(float a) { *(float *)EGL_LOG_PTR=a; EGL_LOG_PTR++; }; -inline void xGLL(double a) { *(float *)EGL_LOG_PTR=(float)a; EGL_LOG_PTR++; }; -inline void xGLL(const float *a) { for(int t=0;t!=16;t++) xGLL(a[t]); }; -inline void xGLL(const double *a) { for(int t=0;t!=16;t++) xGLL(a[t]); }; -#else - -inline void xGLL(int a) {}; -inline void xGLL(unsigned int a) {}; -inline void xGLL(float a) {}; -inline void xGLL(double a) {}; -inline void xGLL(const float *a) {}; -inline void xGLL(const double *a) {}; - -#endif - -// functions we might log - -#include - -#endif +#ifndef __EGL_H +#define __EGL_H + +// include types and defines + +#include + +// include log tokens + +#include + +// include simple void functions we ignore + +#include + +// include functions that need a bit of work, but we don't log + +#include + +// include functions we log + +#ifdef EGL_LOG_PTR + +extern unsigned int *EGL_LOG_PTR; + +inline void xGLL(int a) { *EGL_LOG_PTR=(unsigned int)a; EGL_LOG_PTR++; }; +inline void xGLL(unsigned int a) { *EGL_LOG_PTR=a; EGL_LOG_PTR++; }; +inline void xGLL(float a) { *(float *)EGL_LOG_PTR=a; EGL_LOG_PTR++; }; +inline void xGLL(double a) { *(float *)EGL_LOG_PTR=(float)a; EGL_LOG_PTR++; }; +inline void xGLL(const float *a) { for(int t=0;t!=16;t++) xGLL(a[t]); }; +inline void xGLL(const double *a) { for(int t=0;t!=16;t++) xGLL(a[t]); }; +#else + +inline void xGLL(int a) {}; +inline void xGLL(unsigned int a) {}; +inline void xGLL(float a) {}; +inline void xGLL(double a) {}; +inline void xGLL(const float *a) {}; +inline void xGLL(const double *a) {}; + +#endif + +// functions we might log + +#include + +#endif diff --git a/Glut/EmptyGL/GL/glu.h b/Glut/EmptyGL/GL/glu.h index ba3d67826..95a40b2cb 100644 --- a/Glut/EmptyGL/GL/glu.h +++ b/Glut/EmptyGL/GL/glu.h @@ -1,23 +1,23 @@ -#ifndef EMPTY_GLU -#define EMPTY_GLU - -inline void gluOrtho2D( int a,int b, int c ,int d ) { } ; -inline void gluLookAt( - GLfloat a,GLfloat b, GLfloat c, - GLfloat d,GLfloat e, GLfloat f, - GLfloat g,GLfloat h, GLfloat i ) { }; - -#define GLU_FILL 1 -#define GLU_SMOOTH 2 - -typedef int GLUquadric; -typedef GLUquadric GLUquadricObj; - -inline GLUquadric *gluNewQuadric() { return (GLUquadric *)1; }; -inline void gluQuadricDrawStyle( GLUquadric *o, int mode) {}; -inline void gluQuadricNormals( GLUquadric *o, int mode) {}; -inline void gluDeleteQuadric( GLUquadric *q) {}; -inline void gluDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops) {}; -inline void gluCylinder (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks) {}; -inline int gluBuild2DMipmaps (GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const void *data) { return 0;} -#endif +#ifndef EMPTY_GLU +#define EMPTY_GLU + +inline void gluOrtho2D( int a,int b, int c ,int d ) { } ; +inline void gluLookAt( + GLfloat a,GLfloat b, GLfloat c, + GLfloat d,GLfloat e, GLfloat f, + GLfloat g,GLfloat h, GLfloat i ) { }; + +#define GLU_FILL 1 +#define GLU_SMOOTH 2 + +typedef int GLUquadric; +typedef GLUquadric GLUquadricObj; + +inline GLUquadric *gluNewQuadric() { return (GLUquadric *)1; }; +inline void gluQuadricDrawStyle( GLUquadric *o, int mode) {}; +inline void gluQuadricNormals( GLUquadric *o, int mode) {}; +inline void gluDeleteQuadric( GLUquadric *q) {}; +inline void gluDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops) {}; +inline void gluCylinder (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks) {}; +inline int gluBuild2DMipmaps (GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const void *data) { return 0;} +#endif diff --git a/Glut/EmptyGL/GL/glut.h b/Glut/EmptyGL/GL/glut.h index 68f95b14d..9007ecda0 100644 --- a/Glut/EmptyGL/GL/glut.h +++ b/Glut/EmptyGL/GL/glut.h @@ -1,60 +1,60 @@ -#ifndef EMPTY_GLUT_H -#define EMPTY_GLUT_H - -#include -#include - - -#define GLUT_KEY_F1 0 -#define GLUT_KEY_F2 1 -#define GLUT_KEY_END 2 -#define GLUT_KEY_LEFT 3 -#define GLUT_KEY_RIGHT 4 -#define GLUT_KEY_UP 5 -#define GLUT_KEY_DOWN 6 -#define GLUT_KEY_PAGE_UP 7 -#define GLUT_KEY_PAGE_DOWN 8 -#define GLUT_KEY_HOME 9 -#define GLUT_KEY_F3 10 -#define GLUT_KEY_F4 11 -#define GLUT_KEY_F5 12 -#define GLUT_ACTIVE_SHIFT 13 - - -#define GLUT_DOUBLE 1 -#define GLUT_RGBA 2 -#define GLUT_DEPTH 4 -#define GLUT_STENCIL 8 -#define GLUT_WINDOW_WIDTH 16 -#define GLUT_WINDOW_HEIGHT 32 -#define GLUT_RGB 64 - - - - -inline void glutSwapBuffers() {} -inline void glutShowWindow() {} -inline void glutPostRedisplay() {} -inline void glutInit(int *argc, char **argv) {} -inline void glutInitDisplayMode( unsigned int ) {} -inline void glutInitWindowPosition(int x, int y) {} -inline void glutInitWindowSize(int x, int y) {} -inline int glutCreateWindow( const char *str) {return 0;} -inline void glutKeyboardFunc( void (*func)(unsigned char, int ,int ) ) {} -inline void glutSpecialFunc( void (*func)(int key, int x,int y) ) {} -inline void glutSpecialUpFunc( void (*func)(int key, int x,int y) ) {} -inline void glutReshapeFunc( void (*func)(int w,int h) ) {} -inline void glutDisplayFunc( void (*func)() ) {} -inline void glutIdleFunc( void (*func)() ) {} -inline void glutMotionFunc( void (*func)(int x,int y) ) {} -inline void glutMouseFunc( void (*func)(int button,int state,int x,int y) ) {} -inline void glutMainLoop() {} -inline void glutSetWindow(int bla) {} - -inline void glutSolidCube(GLfloat ) {} -inline void glutSolidSphere(GLfloat , int a , int b) {} -inline void glutSolidCone(GLfloat ,GLfloat , int a , int b) {} -inline int glutGetModifiers() { return 0;} -inline void gluPerspective(float a,float b,float c,float d) {} -inline float glutGet(int code) { return 0.f;} -#endif +#ifndef EMPTY_GLUT_H +#define EMPTY_GLUT_H + +#include +#include + + +#define GLUT_KEY_F1 0 +#define GLUT_KEY_F2 1 +#define GLUT_KEY_END 2 +#define GLUT_KEY_LEFT 3 +#define GLUT_KEY_RIGHT 4 +#define GLUT_KEY_UP 5 +#define GLUT_KEY_DOWN 6 +#define GLUT_KEY_PAGE_UP 7 +#define GLUT_KEY_PAGE_DOWN 8 +#define GLUT_KEY_HOME 9 +#define GLUT_KEY_F3 10 +#define GLUT_KEY_F4 11 +#define GLUT_KEY_F5 12 +#define GLUT_ACTIVE_SHIFT 13 + + +#define GLUT_DOUBLE 1 +#define GLUT_RGBA 2 +#define GLUT_DEPTH 4 +#define GLUT_STENCIL 8 +#define GLUT_WINDOW_WIDTH 16 +#define GLUT_WINDOW_HEIGHT 32 +#define GLUT_RGB 64 + + + + +inline void glutSwapBuffers() {} +inline void glutShowWindow() {} +inline void glutPostRedisplay() {} +inline void glutInit(int *argc, char **argv) {} +inline void glutInitDisplayMode( unsigned int ) {} +inline void glutInitWindowPosition(int x, int y) {} +inline void glutInitWindowSize(int x, int y) {} +inline int glutCreateWindow( const char *str) {return 0;} +inline void glutKeyboardFunc( void (*func)(unsigned char, int ,int ) ) {} +inline void glutSpecialFunc( void (*func)(int key, int x,int y) ) {} +inline void glutSpecialUpFunc( void (*func)(int key, int x,int y) ) {} +inline void glutReshapeFunc( void (*func)(int w,int h) ) {} +inline void glutDisplayFunc( void (*func)() ) {} +inline void glutIdleFunc( void (*func)() ) {} +inline void glutMotionFunc( void (*func)(int x,int y) ) {} +inline void glutMouseFunc( void (*func)(int button,int state,int x,int y) ) {} +inline void glutMainLoop() {} +inline void glutSetWindow(int bla) {} + +inline void glutSolidCube(GLfloat ) {} +inline void glutSolidSphere(GLfloat , int a , int b) {} +inline void glutSolidCone(GLfloat ,GLfloat , int a , int b) {} +inline int glutGetModifiers() { return 0;} +inline void gluPerspective(float a,float b,float c,float d) {} +inline float glutGet(int code) { return 0.f;} +#endif diff --git a/Glut/GL/glew.h b/Glut/GL/glew.h index c4922234c..0a31eec37 100644 --- a/Glut/GL/glew.h +++ b/Glut/GL/glew.h @@ -1,10697 +1,10697 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2002-2006, Milan Ikits -** Copyright (C) 2002-2006, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#ifndef __glew_h__ -#define __glew_h__ -#define __GLEW_H__ - -#if defined(__gl_h_) || defined(__GL_H__) -#error gl.h included before glew.h -#endif -#if defined(__glext_h_) || defined(__GLEXT_H_) -#error glext.h included before glew.h -#endif -#if defined(__gl_ATI_h_) -#error glATI.h included before glew.h -#endif - -#define __gl_h_ -#define __GL_H__ -#define __glext_h_ -#define __GLEXT_H_ -#define __gl_ATI_h_ - -#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) - -/* - * GLEW does not include to avoid name space pollution. - * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t - * defined properly. - */ -/* */ -#ifndef APIENTRY -#define GLEW_APIENTRY_DEFINED -# if defined(__CYGWIN__) || defined(__MINGW32__) -# define APIENTRY __stdcall -# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) -# define APIENTRY __stdcall -# else -# define APIENTRY -# endif -#endif -#ifndef GLAPI -# if defined(__CYGWIN__) || defined(__MINGW32__) -# define GLAPI extern -# endif -#endif -/* */ -#ifndef CALLBACK -#define GLEW_CALLBACK_DEFINED -# if defined(__CYGWIN__) || defined(__MINGW32__) -# define CALLBACK __attribute__ ((__stdcall__)) -# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -#endif -/* and */ -#ifndef WINGDIAPI -#define GLEW_WINGDIAPI_DEFINED -#define WINGDIAPI __declspec(dllimport) -#endif -/* */ -#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -#endif -/* */ -#if !defined(_W64) -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif -#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) -# ifdef _WIN64 -typedef __int64 ptrdiff_t; -# else -typedef _W64 int ptrdiff_t; -# endif -# define _PTRDIFF_T_DEFINED -# define _PTRDIFF_T_ -#endif - -#ifndef GLAPI -# if defined(__CYGWIN__) || defined(__MINGW32__) -# define GLAPI extern -# else -# define GLAPI WINGDIAPI -# endif -#endif - -#ifndef GLAPIENTRY -#define GLAPIENTRY APIENTRY -#endif - -/* - * GLEW_STATIC needs to be set when using the static version. - * GLEW_BUILD is set when building the DLL version. - */ -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#else /* _UNIX */ - -/* - * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO - * C. On my system, this amounts to _3 lines_ of included code, all of - * them pretty much harmless. If you know of a way of detecting 32 vs - * 64 _targets_ at compile time you are free to replace this with - * something that's portable. For now, _this_ is the portable solution. - * (mem, 2004-01-04) - */ - -#include - -#define GLEW_APIENTRY_DEFINED -#define APIENTRY -#define GLEWAPI extern - -/* */ -#ifndef GLAPI -#define GLAPI extern -#endif -#ifndef GLAPIENTRY -#define GLAPIENTRY -#endif - -#endif /* _WIN32 */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ - -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 - -#if defined(__APPLE__) -typedef unsigned long GLenum; -typedef unsigned long GLbitfield; -typedef unsigned long GLuint; -typedef long GLint; -typedef long GLsizei; -#else -typedef unsigned int GLenum; -typedef unsigned int GLbitfield; -typedef unsigned int GLuint; -typedef int GLint; -typedef int GLsizei; -#endif -typedef unsigned char GLboolean; -typedef signed char GLbyte; -typedef short GLshort; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void GLvoid; -#if defined(_MSC_VER) && _MSC_VER < 1310 -# ifdef _WIN64 -typedef __int64 GLint64EXT; -typedef unsigned __int64 GLuint64EXT; -# else -typedef _W64 int GLint64EXT; -typedef _W64 unsigned int GLuint64EXT; -# endif -#else -typedef signed long long GLint64EXT; -typedef unsigned long long GLuint64EXT; -#endif - -#define GL_ACCUM 0x0100 -#define GL_LOAD 0x0101 -#define GL_RETURN 0x0102 -#define GL_MULT 0x0103 -#define GL_ADD 0x0104 -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_CURRENT_BIT 0x00000001 -#define GL_POINT_BIT 0x00000002 -#define GL_LINE_BIT 0x00000004 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_HINT_BIT 0x00008000 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000fffff -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON 0x0009 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_TRUE 1 -#define GL_FALSE 0 -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A -#define GL_NONE 0 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_LINE_RESET_TOKEN 0x0707 -#define GL_EXP 0x0800 -#define GL_EXP2 0x0801 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_COEFF 0x0A00 -#define GL_ORDER 0x0A01 -#define GL_DOMAIN 0x0A02 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LIST_MODE 0x0B30 -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_SHADE_MODEL 0x0B54 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_FOG 0x0B60 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_COLOR 0x0B66 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_MATRIX_MODE 0x0BA0 -#define GL_NORMALIZE 0x0BA1 -#define GL_VIEWPORT 0x0BA2 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_INDEX_MODE 0x0C30 -#define GL_RGBA_MODE 0x0C31 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_RENDER_MODE 0x0C40 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_FOG_HINT 0x0C54 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_INDEX_BITS 0x0D51 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_LIGHT0 0x4000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_EMISSION 0x1600 -#define GL_SHININESS 0x1601 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_COLOR_INDEX 0x1900 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_BITMAP 0x1A00 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_RENDER 0x1C00 -#define GL_FEEDBACK 0x1C01 -#define GL_SELECT 0x1C02 -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_S 0x2000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 -#define GL_MODULATE 0x2100 -#define GL_DECAL 0x2101 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_ENV 0x2300 -#define GL_EYE_LINEAR 0x2400 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_SPHERE_MAP 0x2402 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_PLANE 0x2502 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_CLAMP 0x2900 -#define GL_REPEAT 0x2901 -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D -#define GL_LOGIC_OP GL_INDEX_LOGIC_OP -#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 - -GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); -GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); -GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void GLAPIENTRY glArrayElement (GLint i); -GLAPI void GLAPIENTRY glBegin (GLenum mode); -GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); -GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GLAPI void GLAPIENTRY glCallList (GLuint list); -GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); -GLAPI void GLAPIENTRY glClear (GLbitfield mask); -GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); -GLAPI void GLAPIENTRY glClearIndex (GLfloat c); -GLAPI void GLAPIENTRY glClearStencil (GLint s); -GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); -GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); -GLAPI void GLAPIENTRY glColor3iv (const GLint *v); -GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); -GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void GLAPIENTRY glColor4iv (const GLint *v); -GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); -GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); -GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); -GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); -GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glCullFace (GLenum mode); -GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); -GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GLAPI void GLAPIENTRY glDepthFunc (GLenum func); -GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); -GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); -GLAPI void GLAPIENTRY glDisable (GLenum cap); -GLAPI void GLAPIENTRY glDisableClientState (GLenum array); -GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); -GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); -GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); -GLAPI void GLAPIENTRY glEnable (GLenum cap); -GLAPI void GLAPIENTRY glEnableClientState (GLenum array); -GLAPI void GLAPIENTRY glEnd (void); -GLAPI void GLAPIENTRY glEndList (void); -GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); -GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); -GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); -GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); -GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); -GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); -GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); -GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); -GLAPI void GLAPIENTRY glFinish (void); -GLAPI void GLAPIENTRY glFlush (void); -GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glFrontFace (GLenum mode); -GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); -GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); -GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); -GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); -GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); -GLAPI GLenum GLAPIENTRY glGetError (void); -GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); -GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); -GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); -GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); -GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); -GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); -GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params); -GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); -GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); -GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); -GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); -GLAPI void GLAPIENTRY glIndexMask (GLuint mask); -GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glIndexd (GLdouble c); -GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); -GLAPI void GLAPIENTRY glIndexf (GLfloat c); -GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); -GLAPI void GLAPIENTRY glIndexi (GLint c); -GLAPI void GLAPIENTRY glIndexiv (const GLint *c); -GLAPI void GLAPIENTRY glIndexs (GLshort c); -GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); -GLAPI void GLAPIENTRY glIndexub (GLubyte c); -GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); -GLAPI void GLAPIENTRY glInitNames (void); -GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); -GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); -GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); -GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); -GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); -GLAPI void GLAPIENTRY glLineWidth (GLfloat width); -GLAPI void GLAPIENTRY glListBase (GLuint base); -GLAPI void GLAPIENTRY glLoadIdentity (void); -GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glLoadName (GLuint name); -GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); -GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); -GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); -GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); -GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); -GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); -GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); -GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); -GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); -GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void GLAPIENTRY glPassThrough (GLfloat token); -GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); -GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); -GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); -GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); -GLAPI void GLAPIENTRY glPointSize (GLfloat size); -GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); -GLAPI void GLAPIENTRY glPopAttrib (void); -GLAPI void GLAPIENTRY glPopClientAttrib (void); -GLAPI void GLAPIENTRY glPopMatrix (void); -GLAPI void GLAPIENTRY glPopName (void); -GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); -GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushMatrix (void); -GLAPI void GLAPIENTRY glPushName (GLuint name); -GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); -GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); -GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); -GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); -GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); -GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); -GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); -GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); -GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); -GLAPI void GLAPIENTRY glShadeModel (GLenum mode); -GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GLAPI void GLAPIENTRY glStencilMask (GLuint mask); -GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); -GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); -GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord1i (GLint s); -GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); -GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); -GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); -GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); -GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); -GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); -GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); -GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); -GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); -GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); -GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); -GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); - -#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) - -#endif /* GL_VERSION_1_1 */ - -/* ---------------------------------- GLU ---------------------------------- */ - -/* this is where we can safely include GLU */ -#if defined(__APPLE__) && defined(__MACH__) -#include -#else -#include -#endif - -/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 - -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E - -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); - -#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) -#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) -#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) -#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) - -#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) - -#endif /* GL_VERSION_1_2 */ - -/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 - -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_SUBTRACT 0x84E7 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#define GL_MULTISAMPLE_BIT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); - -#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) -#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) -#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) -#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) -#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) -#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) -#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) -#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) -#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) -#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) -#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) -#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) -#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) -#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) -#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) -#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) -#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) -#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) -#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) -#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) -#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) -#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) -#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) -#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) -#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) -#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) -#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) -#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) -#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) -#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) -#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) -#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) -#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) -#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) -#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) -#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) -#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) -#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) -#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) -#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) -#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) -#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) -#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) -#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) -#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) -#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) - -#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) - -#endif /* GL_VERSION_1_3 */ - -/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 - -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E - -typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); - -#define glBlendColor GLEW_GET_FUN(__glewBlendColor) -#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) -#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) -#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) -#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) -#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) -#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) -#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) -#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) -#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) -#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) -#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) -#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) -#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) -#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) -#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) -#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) -#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) -#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) -#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) -#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) -#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) -#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) -#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) -#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) -#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) -#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) -#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) -#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) -#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) -#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) -#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) -#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) -#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) -#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) -#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) -#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) -#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) -#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) -#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) -#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) -#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) -#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) -#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) -#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) - -#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) - -#endif /* GL_VERSION_1_4 */ - -/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 - -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 - -typedef ptrdiff_t GLsizeiptr; -typedef ptrdiff_t GLintptr; - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); -typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); - -#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) -#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) -#define glBufferData GLEW_GET_FUN(__glewBufferData) -#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) -#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) -#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) -#define glEndQuery GLEW_GET_FUN(__glewEndQuery) -#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) -#define glGenQueries GLEW_GET_FUN(__glewGenQueries) -#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) -#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) -#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) -#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) -#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) -#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) -#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) -#define glIsQuery GLEW_GET_FUN(__glewIsQuery) -#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) -#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) - -#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) - -#endif /* GL_VERSION_1_5 */ - -/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 - -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 - -typedef char GLchar; - -typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source); -typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLint programObj, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid*); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths); -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); - -#define glAttachShader GLEW_GET_FUN(__glewAttachShader) -#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) -#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) -#define glCompileShader GLEW_GET_FUN(__glewCompileShader) -#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) -#define glCreateShader GLEW_GET_FUN(__glewCreateShader) -#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) -#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) -#define glDetachShader GLEW_GET_FUN(__glewDetachShader) -#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) -#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) -#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) -#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) -#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) -#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) -#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) -#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) -#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) -#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) -#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) -#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) -#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) -#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) -#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) -#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) -#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) -#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) -#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) -#define glIsProgram GLEW_GET_FUN(__glewIsProgram) -#define glIsShader GLEW_GET_FUN(__glewIsShader) -#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) -#define glShaderSource GLEW_GET_FUN(__glewShaderSource) -#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) -#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) -#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) -#define glUniform1f GLEW_GET_FUN(__glewUniform1f) -#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) -#define glUniform1i GLEW_GET_FUN(__glewUniform1i) -#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) -#define glUniform2f GLEW_GET_FUN(__glewUniform2f) -#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) -#define glUniform2i GLEW_GET_FUN(__glewUniform2i) -#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) -#define glUniform3f GLEW_GET_FUN(__glewUniform3f) -#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) -#define glUniform3i GLEW_GET_FUN(__glewUniform3i) -#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) -#define glUniform4f GLEW_GET_FUN(__glewUniform4f) -#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) -#define glUniform4i GLEW_GET_FUN(__glewUniform4i) -#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) -#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) -#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) -#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) -#define glUseProgram GLEW_GET_FUN(__glewUseProgram) -#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) -#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) -#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) -#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) -#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) -#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) -#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) -#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) -#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) -#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) -#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) -#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) -#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) -#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) -#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) -#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) -#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) -#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) -#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) -#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) -#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) -#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) -#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) -#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) -#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) -#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) -#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) -#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) -#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) -#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) -#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) -#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) -#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) -#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) -#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) -#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) -#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) -#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) - -#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) - -#endif /* GL_VERSION_2_0 */ - -/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 - -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B - -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - -#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) -#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) -#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) -#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) -#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) -#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) - -#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) - -#endif /* GL_VERSION_2_1 */ - -/* -------------------------- GL_3DFX_multisample -------------------------- */ - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 - -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 - -#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) - -#endif /* GL_3DFX_multisample */ - -/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 - -typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); - -#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) - -#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) - -#endif /* GL_3DFX_tbuffer */ - -/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 - -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 - -#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) - -#endif /* GL_3DFX_texture_compression_FXT1 */ - -/* ------------------------ GL_APPLE_client_storage ------------------------ */ - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 - -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 - -#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) - -#endif /* GL_APPLE_client_storage */ - -/* ------------------------- GL_APPLE_element_array ------------------------ */ - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 - -#define GL_ELEMENT_ARRAY_APPLE 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); - -#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) -#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) -#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) -#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) -#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) - -#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) - -#endif /* GL_APPLE_element_array */ - -/* ----------------------------- GL_APPLE_fence ---------------------------- */ - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 - -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); - -#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) -#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) -#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) -#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) -#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) -#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) -#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) -#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) - -#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) - -#endif /* GL_APPLE_fence */ - -/* ------------------------- GL_APPLE_float_pixels ------------------------- */ - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 - -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F - -#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) - -#endif /* GL_APPLE_float_pixels */ - -/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ - -#ifndef GL_APPLE_pixel_buffer -#define GL_APPLE_pixel_buffer 1 - -#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 - -#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) - -#endif /* GL_APPLE_pixel_buffer */ - -/* ------------------------ GL_APPLE_specular_vector ----------------------- */ - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 - -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 - -#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) - -#endif /* GL_APPLE_specular_vector */ - -/* ------------------------- GL_APPLE_texture_range ------------------------ */ - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 - -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params); -typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer); - -#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) -#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) - -#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) - -#endif /* GL_APPLE_texture_range */ - -/* ------------------------ GL_APPLE_transform_hint ------------------------ */ - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 - -#define GL_TRANSFORM_HINT_APPLE 0x85B1 - -#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) - -#endif /* GL_APPLE_transform_hint */ - -/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); - -#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) -#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) -#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) -#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) - -#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) - -#endif /* GL_APPLE_vertex_array_object */ - -/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); - -#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) -#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) -#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) - -#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) - -#endif /* GL_APPLE_vertex_array_range */ - -/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 - -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB - -#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) - -#endif /* GL_APPLE_ycbcr_422 */ - -/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 - -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D - -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); - -#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) - -#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) - -#endif /* GL_ARB_color_buffer_float */ - -/* -------------------------- GL_ARB_depth_texture ------------------------- */ - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B - -#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) - -#endif /* GL_ARB_depth_texture */ - -/* -------------------------- GL_ARB_draw_buffers -------------------------- */ - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) - -#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) - -#endif /* GL_ARB_draw_buffers */ - -/* ------------------------ GL_ARB_fragment_program ------------------------ */ - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 - -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 - -#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) - -#endif /* GL_ARB_fragment_program */ - -/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 - -#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) - -#endif /* GL_ARB_fragment_program_shadow */ - -/* ------------------------- GL_ARB_fragment_shader ------------------------ */ - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 - -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B - -#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) - -#endif /* GL_ARB_fragment_shader */ - -/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 - -#define GL_HALF_FLOAT_ARB 0x140B - -#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) - -#endif /* GL_ARB_half_float_pixel */ - -/* ----------------------------- GL_ARB_imaging ---------------------------- */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 - -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_IGNORE_BORDER 0x8150 -#define GL_CONSTANT_BORDER 0x8151 -#define GL_WRAP_BORDER 0x8152 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); - -#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) -#define glColorTable GLEW_GET_FUN(__glewColorTable) -#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) -#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) -#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) -#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) -#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) -#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) -#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) -#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) -#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) -#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) -#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) -#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) -#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) -#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) -#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) -#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) -#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) -#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) -#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) -#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) -#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) -#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) -#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) -#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) -#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) -#define glHistogram GLEW_GET_FUN(__glewHistogram) -#define glMinmax GLEW_GET_FUN(__glewMinmax) -#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) -#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) -#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) - -#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) - -#endif /* GL_ARB_imaging */ - -/* ------------------------- GL_ARB_matrix_palette ------------------------- */ - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 - -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 - -typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); - -#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) -#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) -#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) -#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) -#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) - -#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) - -#endif /* GL_ARB_matrix_palette */ - -/* --------------------------- GL_ARB_multisample -------------------------- */ - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 - -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); - -#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) - -#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) - -#endif /* GL_ARB_multisample */ - -/* -------------------------- GL_ARB_multitexture -------------------------- */ - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); - -#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) -#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) -#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) -#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) -#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) -#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) -#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) -#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) -#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) -#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) -#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) -#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) -#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) -#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) -#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) -#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) -#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) -#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) -#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) -#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) -#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) -#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) -#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) -#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) -#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) -#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) -#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) -#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) -#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) -#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) -#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) -#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) -#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) -#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) - -#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) - -#endif /* GL_ARB_multitexture */ - -/* ------------------------- GL_ARB_occlusion_query ------------------------ */ - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 - -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); - -#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) -#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) -#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) -#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) -#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) -#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) -#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) -#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) - -#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) - -#endif /* GL_ARB_occlusion_query */ - -/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF - -#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) - -#endif /* GL_ARB_pixel_buffer_object */ - -/* ------------------------ GL_ARB_point_parameters ------------------------ */ - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 - -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params); - -#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) -#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) - -#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) - -#endif /* GL_ARB_point_parameters */ - -/* -------------------------- GL_ARB_point_sprite -------------------------- */ - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 - -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 - -#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) - -#endif /* GL_ARB_point_sprite */ - -/* ------------------------- GL_ARB_shader_objects ------------------------- */ - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 - -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 - -typedef char GLcharARB; -typedef unsigned int GLhandleARB; - -typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); -typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); - -#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) -#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) -#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) -#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) -#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) -#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) -#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) -#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) -#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) -#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) -#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) -#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) -#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) -#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) -#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) -#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) -#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) -#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) -#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) -#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) -#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) -#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) -#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) -#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) -#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) -#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) -#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) -#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) -#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) -#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) -#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) -#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) -#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) -#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) -#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) -#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) -#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) -#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) -#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) - -#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) - -#endif /* GL_ARB_shader_objects */ - -/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 - -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C - -#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) - -#endif /* GL_ARB_shading_language_100 */ - -/* ----------------------------- GL_ARB_shadow ----------------------------- */ - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 - -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E - -#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) - -#endif /* GL_ARB_shadow */ - -/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 - -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF - -#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) - -#endif /* GL_ARB_shadow_ambient */ - -/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_ARB 0x812D - -#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) - -#endif /* GL_ARB_texture_border_clamp */ - -/* ----------------------- GL_ARB_texture_compression ---------------------- */ - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 - -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); - -#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) -#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) -#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) -#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) -#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) -#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) -#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) - -#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) - -#endif /* GL_ARB_texture_compression */ - -/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 - -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C - -#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) - -#endif /* GL_ARB_texture_cube_map */ - -/* ------------------------- GL_ARB_texture_env_add ------------------------ */ - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 - -#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) - -#endif /* GL_ARB_texture_env_add */ - -/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 - -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A - -#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) - -#endif /* GL_ARB_texture_env_combine */ - -/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 - -#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) - -#endif /* GL_ARB_texture_env_crossbar */ - -/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 - -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF - -#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) - -#endif /* GL_ARB_texture_env_dot3 */ - -/* -------------------------- GL_ARB_texture_float ------------------------- */ - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 - -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 - -#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) - -#endif /* GL_ARB_texture_float */ - -/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_ARB 0x8370 - -#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) - -#endif /* GL_ARB_texture_mirrored_repeat */ - -/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 - -#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) - -#endif /* GL_ARB_texture_non_power_of_two */ - -/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 - -#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) - -#endif /* GL_ARB_texture_rectangle */ - -/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 - -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 - -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); - -#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) -#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) -#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) -#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) - -#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) - -#endif /* GL_ARB_transpose_matrix */ - -/* -------------------------- GL_ARB_vertex_blend -------------------------- */ - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 - -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F - -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); -typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); -typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); - -#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) -#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) -#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) -#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) -#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) -#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) -#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) -#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) -#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) -#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) - -#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) - -#endif /* GL_ARB_vertex_blend */ - -/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 - -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA - -typedef ptrdiff_t GLsizeiptrARB; -typedef ptrdiff_t GLintptrARB; - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); - -#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) -#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) -#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) -#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) -#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) -#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) -#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) -#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) -#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) -#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) -#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) - -#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) - -#endif /* GL_ARB_vertex_buffer_object */ - -/* ------------------------- GL_ARB_vertex_program ------------------------- */ - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 - -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF - -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); - -#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) -#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) -#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) -#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) -#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) -#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) -#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) -#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) -#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) -#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) -#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) -#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) -#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) -#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) -#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) -#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) -#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) -#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) -#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) -#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) -#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) -#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) -#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) -#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) -#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) -#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) -#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) -#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) -#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) -#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) -#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) -#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) -#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) -#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) -#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) -#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) -#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) -#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) -#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) -#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) -#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) -#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) -#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) -#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) -#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) -#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) -#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) -#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) -#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) -#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) -#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) -#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) -#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) -#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) -#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) -#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) -#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) -#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) -#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) -#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) -#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) -#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) - -#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) - -#endif /* GL_ARB_vertex_program */ - -/* -------------------------- GL_ARB_vertex_shader ------------------------- */ - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 - -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A - -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); - -#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) -#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) -#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) - -#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) - -#endif /* GL_ARB_vertex_shader */ - -/* --------------------------- GL_ARB_window_pos --------------------------- */ - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); - -#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) -#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) -#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) -#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) -#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) -#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) -#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) -#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) -#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) -#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) -#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) -#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) -#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) -#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) -#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) -#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) - -#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) - -#endif /* GL_ARB_window_pos */ - -/* ------------------------- GL_ATIX_point_sprites ------------------------- */ - -#ifndef GL_ATIX_point_sprites -#define GL_ATIX_point_sprites 1 - -#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) - -#endif /* GL_ATIX_point_sprites */ - -/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ - -#ifndef GL_ATIX_texture_env_combine3 -#define GL_ATIX_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATIX 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 -#define GL_MODULATE_SUBTRACT_ATIX 0x8746 - -#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) - -#endif /* GL_ATIX_texture_env_combine3 */ - -/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ - -#ifndef GL_ATIX_texture_env_route -#define GL_ATIX_texture_env_route 1 - -#define GL_SECONDARY_COLOR_ATIX 0x8747 -#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 -#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 - -#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) - -#endif /* GL_ATIX_texture_env_route */ - -/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ - -#ifndef GL_ATIX_vertex_shader_output_point_size -#define GL_ATIX_vertex_shader_output_point_size 1 - -#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E - -#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) - -#endif /* GL_ATIX_vertex_shader_output_point_size */ - -/* -------------------------- GL_ATI_draw_buffers -------------------------- */ - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) - -#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) - -#endif /* GL_ATI_draw_buffers */ - -/* -------------------------- GL_ATI_element_array ------------------------- */ - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 - -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); - -#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) -#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) -#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) - -#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) - -#endif /* GL_ATI_element_array */ - -/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 - -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C - -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); - -#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) -#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) -#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) -#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) - -#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) - -#endif /* GL_ATI_envmap_bumpmap */ - -/* ------------------------- GL_ATI_fragment_shader ------------------------ */ - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 - -#define GL_RED_BIT_ATI 0x00000001 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B - -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); - -#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) -#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) -#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) -#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) -#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) -#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) -#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) -#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) -#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) -#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) -#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) -#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) -#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) -#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) - -#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) - -#endif /* GL_ATI_fragment_shader */ - -/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 - -typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); - -#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) -#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) - -#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) - -#endif /* GL_ATI_map_object_buffer */ - -/* -------------------------- GL_ATI_pn_triangles -------------------------- */ - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 - -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 - -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); - -#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI) -#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI) - -#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) - -#endif /* GL_ATI_pn_triangles */ - -/* ------------------------ GL_ATI_separate_stencil ------------------------ */ - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 - -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 - -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - -#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) -#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) - -#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) - -#endif /* GL_ATI_separate_stencil */ - -/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 - -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 - -#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) - -#endif /* GL_ATI_text_fragment_shader */ - -/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ - -#ifndef GL_ATI_texture_compression_3dc -#define GL_ATI_texture_compression_3dc 1 - -#define GL_COMPRESSED_RGB_3DC_ATI 0x8837 - -#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) - -#endif /* GL_ATI_texture_compression_3dc */ - -/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 - -#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) - -#endif /* GL_ATI_texture_env_combine3 */ - -/* -------------------------- GL_ATI_texture_float ------------------------- */ - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 - -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F - -#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) - -#endif /* GL_ATI_texture_float */ - -/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 - -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 - -#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) - -#endif /* GL_ATI_texture_mirror_once */ - -/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 - -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 - -typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); -typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); -typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); - -#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) -#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) -#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) -#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) -#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) -#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) -#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) -#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) -#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) -#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) -#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) -#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) - -#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) - -#endif /* GL_ATI_vertex_array_object */ - -/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); - -#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) -#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) -#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) - -#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) - -#endif /* GL_ATI_vertex_attrib_array_object */ - -/* ------------------------- GL_ATI_vertex_streams ------------------------- */ - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 - -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_SOURCE_ATI 0x876C -#define GL_VERTEX_STREAM0_ATI 0x876D -#define GL_VERTEX_STREAM1_ATI 0x876E -#define GL_VERTEX_STREAM2_ATI 0x876F -#define GL_VERTEX_STREAM3_ATI 0x8770 -#define GL_VERTEX_STREAM4_ATI 0x8771 -#define GL_VERTEX_STREAM5_ATI 0x8772 -#define GL_VERTEX_STREAM6_ATI 0x8773 -#define GL_VERTEX_STREAM7_ATI 0x8774 - -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v); - -#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) -#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) -#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) -#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) -#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) -#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) -#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) -#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) -#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) -#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) -#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) -#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) -#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) -#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) -#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) -#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) -#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) -#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) -#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) -#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) -#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) -#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) -#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) -#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) -#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) -#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) -#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) -#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) -#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) -#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) -#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) -#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) -#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) -#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) -#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) -#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) -#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) - -#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) - -#endif /* GL_ATI_vertex_streams */ - -/* --------------------------- GL_EXT_422_pixels --------------------------- */ - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 - -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF - -#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) - -#endif /* GL_EXT_422_pixels */ - -/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ - -#ifndef GL_EXT_Cg_shader -#define GL_EXT_Cg_shader 1 - -#define GL_CG_VERTEX_SHADER_EXT 0x890E -#define GL_CG_FRAGMENT_SHADER_EXT 0x890F - -#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) - -#endif /* GL_EXT_Cg_shader */ - -/* ------------------------------ GL_EXT_abgr ------------------------------ */ - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 - -#define GL_ABGR_EXT 0x8000 - -#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) - -#endif /* GL_EXT_abgr */ - -/* ------------------------------ GL_EXT_bgra ------------------------------ */ - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 - -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 - -#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) - -#endif /* GL_EXT_bgra */ - -/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 - -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF - -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); - -#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) -#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) -#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) - -#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) - -#endif /* GL_EXT_bindable_uniform */ - -/* --------------------------- GL_EXT_blend_color -------------------------- */ - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 - -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 - -typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - -#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) - -#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) - -#endif /* GL_EXT_blend_color */ - -/* --------------------- GL_EXT_blend_equation_separate -------------------- */ - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 - -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); - -#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) - -#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) - -#endif /* GL_EXT_blend_equation_separate */ - -/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 - -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB - -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - -#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) - -#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) - -#endif /* GL_EXT_blend_func_separate */ - -/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 - -#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) - -#endif /* GL_EXT_blend_logic_op */ - -/* -------------------------- GL_EXT_blend_minmax -------------------------- */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 - -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); - -#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) - -#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) - -#endif /* GL_EXT_blend_minmax */ - -/* ------------------------- GL_EXT_blend_subtract ------------------------- */ - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 - -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B - -#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) - -#endif /* GL_EXT_blend_subtract */ - -/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 - -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 - -#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) - -#endif /* GL_EXT_clip_volume_hint */ - -/* ------------------------------ GL_EXT_cmyka ----------------------------- */ - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 - -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F - -#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) - -#endif /* GL_EXT_cmyka */ - -/* ------------------------- GL_EXT_color_subtable ------------------------- */ - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); - -#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) -#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) - -#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) - -#endif /* GL_EXT_color_subtable */ - -/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 - -typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); - -#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) -#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) - -#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) - -#endif /* GL_EXT_compiled_vertex_array */ - -/* --------------------------- GL_EXT_convolution -------------------------- */ - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 - -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 - -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); - -#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) -#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) -#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) -#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) -#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) -#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) -#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) -#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) -#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) -#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) -#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) -#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) -#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) - -#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) - -#endif /* GL_EXT_convolution */ - -/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 - -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 - -typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); -typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); - -#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) -#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) - -#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) - -#endif /* GL_EXT_coordinate_frame */ - -/* -------------------------- GL_EXT_copy_texture -------------------------- */ - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 - -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) -#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) -#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) -#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) -#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) - -#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) - -#endif /* GL_EXT_copy_texture */ - -/* --------------------------- GL_EXT_cull_vertex -------------------------- */ - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 - -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); - -#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) -#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) - -#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) - -#endif /* GL_EXT_cull_vertex */ - -/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 - -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 - -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); - -#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) - -#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) - -#endif /* GL_EXT_depth_bounds_test */ - -/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 - -typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); - -#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) -#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) -#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) -#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) -#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) -#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) - -#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) - -#endif /* GL_EXT_draw_buffers2 */ - -/* ------------------------- GL_EXT_draw_instanced ------------------------- */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); - -#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) -#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) - -#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) - -#endif /* GL_EXT_draw_instanced */ - -/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 - -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 - -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); - -#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) - -#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) - -#endif /* GL_EXT_draw_range_elements */ - -/* ---------------------------- GL_EXT_fog_coord --------------------------- */ - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 - -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 - -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); - -#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) -#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) -#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) -#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) -#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) - -#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) - -#endif /* GL_EXT_fog_coord */ - -/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ - -#ifndef GL_EXT_fragment_lighting -#define GL_EXT_fragment_lighting 1 - -#define GL_FRAGMENT_LIGHTING_EXT 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 -#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 -#define GL_LIGHT_ENV_MODE_EXT 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B -#define GL_FRAGMENT_LIGHT0_EXT 0x840C -#define GL_FRAGMENT_LIGHT7_EXT 0x8413 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); - -#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) -#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) -#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) -#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) -#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) -#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) -#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) -#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) -#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) -#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) -#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) -#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) -#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) -#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) -#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) -#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) -#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) -#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) - -#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) - -#endif /* GL_EXT_fragment_lighting */ - -/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) - -#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) - -#endif /* GL_EXT_framebuffer_blit */ - -/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) - -#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) - -#endif /* GL_EXT_framebuffer_multisample */ - -/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) -#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) -#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) -#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) -#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) -#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) -#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) -#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) -#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) -#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) -#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) -#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) -#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) -#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) -#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) -#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) -#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) - -#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) - -#endif /* GL_EXT_framebuffer_object */ - -/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA - -#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) - -#endif /* GL_EXT_framebuffer_sRGB */ - -/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) -#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) -#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) -#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) - -#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) - -#endif /* GL_EXT_geometry_shader4 */ - -/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); - -#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) -#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) - -#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) - -#endif /* GL_EXT_gpu_program_parameters */ - -/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - -#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) -#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) -#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) -#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) -#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) -#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) -#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) -#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) -#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) -#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) -#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) -#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) -#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) -#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) -#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) -#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) -#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) -#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) -#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) -#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) -#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) -#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) -#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) -#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) -#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) -#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) -#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) -#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) -#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) -#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) -#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) -#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) -#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) -#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) - -#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) - -#endif /* GL_EXT_gpu_shader4 */ - -/* ---------------------------- GL_EXT_histogram --------------------------- */ - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 - -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 - -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); - -#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) -#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) -#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) -#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) -#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) -#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) -#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) -#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) -#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) -#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) - -#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) - -#endif /* GL_EXT_histogram */ - -/* ----------------------- GL_EXT_index_array_formats ---------------------- */ - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 - -#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) - -#endif /* GL_EXT_index_array_formats */ - -/* --------------------------- GL_EXT_index_func --------------------------- */ - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 - -typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); - -#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) - -#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) - -#endif /* GL_EXT_index_func */ - -/* ------------------------- GL_EXT_index_material ------------------------- */ - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 - -typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) - -#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) - -#endif /* GL_EXT_index_material */ - -/* -------------------------- GL_EXT_index_texture ------------------------- */ - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 - -#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) - -#endif /* GL_EXT_index_texture */ - -/* -------------------------- GL_EXT_light_texture ------------------------- */ - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 - -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 - -typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) -#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) -#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) - -#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) - -#endif /* GL_EXT_light_texture */ - -/* ------------------------- GL_EXT_misc_attribute ------------------------- */ - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 - -#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) - -#endif /* GL_EXT_misc_attribute */ - -/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); - -#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) -#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) - -#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) - -#endif /* GL_EXT_multi_draw_arrays */ - -/* --------------------------- GL_EXT_multisample -------------------------- */ - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 - -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); - -#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) -#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) - -#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) - -#endif /* GL_EXT_multisample */ - -/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 - -#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) - -#endif /* GL_EXT_packed_depth_stencil */ - -/* -------------------------- GL_EXT_packed_float -------------------------- */ - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 - -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C - -#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) - -#endif /* GL_EXT_packed_float */ - -/* -------------------------- GL_EXT_packed_pixels ------------------------- */ - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 - -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 - -#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) - -#endif /* GL_EXT_packed_pixels */ - -/* ------------------------ GL_EXT_paletted_texture ------------------------ */ - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 - -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 -#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); - -#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) -#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) -#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) -#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) - -#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) - -#endif /* GL_EXT_paletted_texture */ - -/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF - -#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) - -#endif /* GL_EXT_pixel_buffer_object */ - -/* ------------------------- GL_EXT_pixel_transform ------------------------ */ - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 - -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 - -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) -#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) -#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) -#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) -#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) -#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) - -#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) - -#endif /* GL_EXT_pixel_transform */ - -/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 - -#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) - -#endif /* GL_EXT_pixel_transform_color_table */ - -/* ------------------------ GL_EXT_point_parameters ------------------------ */ - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 - -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); - -#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) -#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) - -#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) - -#endif /* GL_EXT_point_parameters */ - -/* ------------------------- GL_EXT_polygon_offset ------------------------- */ - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 - -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); - -#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) - -#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) - -#endif /* GL_EXT_polygon_offset */ - -/* ------------------------- GL_EXT_rescale_normal ------------------------- */ - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 - -#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) - -#endif /* GL_EXT_rescale_normal */ - -/* -------------------------- GL_EXT_scene_marker -------------------------- */ - -#ifndef GL_EXT_scene_marker -#define GL_EXT_scene_marker 1 - -typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); - -#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) -#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) - -#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) - -#endif /* GL_EXT_scene_marker */ - -/* ------------------------- GL_EXT_secondary_color ------------------------ */ - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 - -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E - -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); - -#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) -#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) -#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) -#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) -#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) -#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) -#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) -#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) -#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) -#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) -#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) -#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) -#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) -#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) -#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) -#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) -#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) - -#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) - -#endif /* GL_EXT_secondary_color */ - -/* --------------------- GL_EXT_separate_specular_color -------------------- */ - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 - -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA - -#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) - -#endif /* GL_EXT_separate_specular_color */ - -/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 - -#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) - -#endif /* GL_EXT_shadow_funcs */ - -/* --------------------- GL_EXT_shared_texture_palette --------------------- */ - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 - -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB - -#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) - -#endif /* GL_EXT_shared_texture_palette */ - -/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 - -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 - -#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) - -#endif /* GL_EXT_stencil_clear_tag */ - -/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 - -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 - -typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); - -#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) - -#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) - -#endif /* GL_EXT_stencil_two_side */ - -/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 - -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 - -#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) - -#endif /* GL_EXT_stencil_wrap */ - -/* --------------------------- GL_EXT_subtexture --------------------------- */ - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 - -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); - -#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) -#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) -#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) - -#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) - -#endif /* GL_EXT_subtexture */ - -/* ----------------------------- GL_EXT_texture ---------------------------- */ - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 - -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 - -#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) - -#endif /* GL_EXT_texture */ - -/* ---------------------------- GL_EXT_texture3D --------------------------- */ - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 - -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); - -#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) - -#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) - -#endif /* GL_EXT_texture3D */ - -/* -------------------------- GL_EXT_texture_array ------------------------- */ - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 - -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D - -#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) - -#endif /* GL_EXT_texture_array */ - -/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) - -#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) - -#endif /* GL_EXT_texture_buffer_object */ - -/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 - -#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) - -#endif /* GL_EXT_texture_compression_dxt1 */ - -/* -------------------- GL_EXT_texture_compression_latc -------------------- */ - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 - -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 - -#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) - -#endif /* GL_EXT_texture_compression_latc */ - -/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE - -#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) - -#endif /* GL_EXT_texture_compression_rgtc */ - -/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 - -#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) - -#endif /* GL_EXT_texture_compression_s3tc */ - -/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ - -#ifndef GL_EXT_texture_cube_map -#define GL_EXT_texture_cube_map 1 - -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C - -#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) - -#endif /* GL_EXT_texture_cube_map */ - -/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ - -#ifndef GL_EXT_texture_edge_clamp -#define GL_EXT_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_EXT 0x812F - -#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) - -#endif /* GL_EXT_texture_edge_clamp */ - -/* --------------------------- GL_EXT_texture_env -------------------------- */ - -#ifndef GL_EXT_texture_env -#define GL_EXT_texture_env 1 - -#define GL_TEXTURE_ENV0_EXT 0 -#define GL_ENV_BLEND_EXT 0 -#define GL_TEXTURE_ENV_SHIFT_EXT 0 -#define GL_ENV_REPLACE_EXT 0 -#define GL_ENV_ADD_EXT 0 -#define GL_ENV_SUBTRACT_EXT 0 -#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 -#define GL_ENV_REVERSE_SUBTRACT_EXT 0 -#define GL_ENV_REVERSE_BLEND_EXT 0 -#define GL_ENV_COPY_EXT 0 -#define GL_ENV_MODULATE_EXT 0 - -#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) - -#endif /* GL_EXT_texture_env */ - -/* ------------------------- GL_EXT_texture_env_add ------------------------ */ - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 - -#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) - -#endif /* GL_EXT_texture_env_add */ - -/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 - -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A - -#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) - -#endif /* GL_EXT_texture_env_combine */ - -/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 - -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 - -#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) - -#endif /* GL_EXT_texture_env_dot3 */ - -/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 - -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF - -#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) - -#endif /* GL_EXT_texture_filter_anisotropic */ - -/* ------------------------- GL_EXT_texture_integer ------------------------ */ - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 - -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E - -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); - -#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) -#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) -#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) -#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) -#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) -#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) - -#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) - -#endif /* GL_EXT_texture_integer */ - -/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 - -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 - -#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) - -#endif /* GL_EXT_texture_lod_bias */ - -/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 - -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 - -#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) - -#endif /* GL_EXT_texture_mirror_clamp */ - -/* ------------------------- GL_EXT_texture_object ------------------------- */ - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 - -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A - -typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); - -#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) -#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) -#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) -#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) -#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) -#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) - -#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) - -#endif /* GL_EXT_texture_object */ - -/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 - -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF - -typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); - -#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) - -#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) - -#endif /* GL_EXT_texture_perturb_normal */ - -/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ - -#ifndef GL_EXT_texture_rectangle -#define GL_EXT_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 - -#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) - -#endif /* GL_EXT_texture_rectangle */ - -/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 - -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F - -#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) - -#endif /* GL_EXT_texture_sRGB */ - -/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 - -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F - -#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) - -#endif /* GL_EXT_texture_shared_exponent */ - -/* --------------------------- GL_EXT_timer_query -------------------------- */ - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 - -#define GL_TIME_ELAPSED_EXT 0x88BF - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); - -#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) -#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) - -#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) - -#endif /* GL_EXT_timer_query */ - -/* -------------------------- GL_EXT_vertex_array -------------------------- */ - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 - -#define GL_DOUBLE_EXT 0x140A -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 - -typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); -typedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); - -#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) -#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) -#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) -#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) -#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT) -#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) -#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) -#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) -#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) - -#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) - -#endif /* GL_EXT_vertex_array */ - -/* -------------------------- GL_EXT_vertex_shader ------------------------- */ - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 - -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED - -typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); -typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data); -typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); -typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); -typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); -typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); - -#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) -#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) -#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) -#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) -#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) -#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) -#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) -#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) -#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) -#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) -#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) -#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) -#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) -#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) -#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) -#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) -#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) -#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) -#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) -#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) -#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) -#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) -#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) -#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) -#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) -#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) -#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) -#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) -#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) -#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) -#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) -#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) -#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) -#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) -#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) -#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) -#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) -#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) -#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) -#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) -#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) -#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) - -#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) - -#endif /* GL_EXT_vertex_shader */ - -/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 - -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 - -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); - -#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) -#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) -#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) - -#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) - -#endif /* GL_EXT_vertex_weighting */ - -/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 - -typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); - -#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) - -#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) - -#endif /* GL_GREMEDY_string_marker */ - -/* --------------------- GL_HP_convolution_border_modes -------------------- */ - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 - -#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) - -#endif /* GL_HP_convolution_border_modes */ - -/* ------------------------- GL_HP_image_transform ------------------------- */ - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 - -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) -#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) -#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) -#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) -#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) -#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) - -#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) - -#endif /* GL_HP_image_transform */ - -/* -------------------------- GL_HP_occlusion_test ------------------------- */ - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 - -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 - -#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) - -#endif /* GL_HP_occlusion_test */ - -/* ------------------------- GL_HP_texture_lighting ------------------------ */ - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 - -#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) - -#endif /* GL_HP_texture_lighting */ - -/* --------------------------- GL_IBM_cull_vertex -------------------------- */ - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 - -#define GL_CULL_VERTEX_IBM 103050 - -#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) - -#endif /* GL_IBM_cull_vertex */ - -/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride); - -#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) -#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) - -#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) - -#endif /* GL_IBM_multimode_draw_arrays */ - -/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 - -#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 - -#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) - -#endif /* GL_IBM_rasterpos_clip */ - -/* --------------------------- GL_IBM_static_data -------------------------- */ - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 - -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 - -#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) - -#endif /* GL_IBM_static_data */ - -/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_IBM 0x8370 - -#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) - -#endif /* GL_IBM_texture_mirrored_repeat */ - -/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 - -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); - -#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) -#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) -#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) -#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) -#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) -#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) -#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) -#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) - -#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) - -#endif /* GL_IBM_vertex_array_lists */ - -/* -------------------------- GL_INGR_color_clamp -------------------------- */ - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 - -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 - -#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) - -#endif /* GL_INGR_color_clamp */ - -/* ------------------------- GL_INGR_interlace_read ------------------------ */ - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 - -#define GL_INTERLACE_READ_INGR 0x8568 - -#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) - -#endif /* GL_INGR_interlace_read */ - -/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 - -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); - -#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) -#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) -#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) -#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) - -#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) - -#endif /* GL_INTEL_parallel_arrays */ - -/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ - -#ifndef GL_INTEL_texture_scissor -#define GL_INTEL_texture_scissor 1 - -typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); -typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); - -#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) -#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) - -#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) - -#endif /* GL_INTEL_texture_scissor */ - -/* -------------------------- GL_KTX_buffer_region ------------------------- */ - -#ifndef GL_KTX_buffer_region -#define GL_KTX_buffer_region 1 - -#define GL_KTX_FRONT_REGION 0x0 -#define GL_KTX_BACK_REGION 0x1 -#define GL_KTX_Z_REGION 0x2 -#define GL_KTX_STENCIL_REGION 0x3 - -typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); -typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT) -#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT) -#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT) -#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT) -#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT) - -#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) - -#endif /* GL_KTX_buffer_region */ - -/* ------------------------- GL_MESAX_texture_stack ------------------------ */ - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 - -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E - -#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) - -#endif /* GL_MESAX_texture_stack */ - -/* -------------------------- GL_MESA_pack_invert -------------------------- */ - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 - -#define GL_PACK_INVERT_MESA 0x8758 - -#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) - -#endif /* GL_MESA_pack_invert */ - -/* ------------------------- GL_MESA_resize_buffers ------------------------ */ - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 - -typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); - -#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) - -#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) - -#endif /* GL_MESA_resize_buffers */ - -/* --------------------------- GL_MESA_window_pos -------------------------- */ - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); - -#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) -#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) -#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) -#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) -#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) -#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) -#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) -#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) -#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) -#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) -#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) -#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) -#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) -#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) -#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) -#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) -#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) -#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) -#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) -#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) -#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) -#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) -#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) -#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) - -#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) - -#endif /* GL_MESA_window_pos */ - -/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 - -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 - -#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) - -#endif /* GL_MESA_ycbcr_texture */ - -/* --------------------------- GL_NV_blend_square -------------------------- */ - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 - -#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) - -#endif /* GL_NV_blend_square */ - -/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 - -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F - -#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) - -#endif /* GL_NV_copy_depth_to_color */ - -/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); - -#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) -#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) -#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) - -#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) - -#endif /* GL_NV_depth_buffer_float */ - -/* --------------------------- GL_NV_depth_clamp --------------------------- */ - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 - -#define GL_DEPTH_CLAMP_NV 0x864F - -#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) - -#endif /* GL_NV_depth_clamp */ - -/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ - -#ifndef GL_NV_depth_range_unclamped -#define GL_NV_depth_range_unclamped 1 - -#define GL_SAMPLE_COUNT_BITS_ARB 0x8864 -#define GL_CURRENT_SAMPLE_COUNT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLE_COUNT_ARB 0x8914 - -#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) - -#endif /* GL_NV_depth_range_unclamped */ - -/* ---------------------------- GL_NV_evaluators --------------------------- */ - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 - -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 - -typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) -#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) -#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) -#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) -#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) -#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) -#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) -#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) -#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) - -#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) - -#endif /* GL_NV_evaluators */ - -/* ------------------------------ GL_NV_fence ------------------------------ */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 - -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); -typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); - -#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) -#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) -#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) -#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) -#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) -#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) -#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) - -#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) - -#endif /* GL_NV_fence */ - -/* --------------------------- GL_NV_float_buffer -------------------------- */ - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 - -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E - -#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) - -#endif /* GL_NV_float_buffer */ - -/* --------------------------- GL_NV_fog_distance -------------------------- */ - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 - -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C - -#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) - -#endif /* GL_NV_fog_distance */ - -/* ------------------------- GL_NV_fragment_program ------------------------ */ - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 - -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); - -#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) -#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) -#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) -#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) -#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) -#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) - -#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) - -#endif /* GL_NV_fragment_program */ - -/* ------------------------ GL_NV_fragment_program2 ------------------------ */ - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 - -#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) - -#endif /* GL_NV_fragment_program2 */ - -/* ------------------------ GL_NV_fragment_program4 ------------------------ */ - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 - -#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) - -#endif /* GL_NV_fragment_program4 */ - -/* --------------------- GL_NV_fragment_program_option --------------------- */ - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 - -#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) - -#endif /* GL_NV_fragment_program_option */ - -/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 - -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) - -#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -/* ------------------------ GL_NV_geometry_program4 ------------------------ */ - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 - -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 - -#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) - -#endif /* GL_NV_geometry_program4 */ - -/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 - -#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) - -#endif /* GL_NV_geometry_shader4 */ - -/* --------------------------- GL_NV_gpu_program4 -------------------------- */ - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 - -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); - -#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) -#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) -#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) -#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) -#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) -#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) -#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) -#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) -#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) -#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) -#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) -#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) -#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) - -#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) - -#endif /* GL_NV_gpu_program4 */ - -/* ---------------------------- GL_NV_half_float --------------------------- */ - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 - -#define GL_HALF_FLOAT_NV 0x140B - -typedef unsigned short GLhalf; - -typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); -typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); -typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); - -#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) -#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) -#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) -#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) -#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) -#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) -#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) -#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) -#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) -#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) -#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) -#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) -#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) -#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) -#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) -#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) -#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) -#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) -#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) -#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) -#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) -#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) -#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) -#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) -#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) -#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) -#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) -#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) -#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) -#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) -#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) -#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) -#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) -#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) -#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) -#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) -#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) -#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) -#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) -#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) -#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) -#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) -#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) -#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) -#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) -#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) - -#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) - -#endif /* GL_NV_half_float */ - -/* ------------------------ GL_NV_light_max_exponent ----------------------- */ - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 - -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 - -#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) - -#endif /* GL_NV_light_max_exponent */ - -/* --------------------- GL_NV_multisample_filter_hint --------------------- */ - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 - -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 - -#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) - -#endif /* GL_NV_multisample_filter_hint */ - -/* ------------------------- GL_NV_occlusion_query ------------------------- */ - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 - -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 - -typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); - -#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) -#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) -#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) -#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) -#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) -#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) -#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) - -#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) - -#endif /* GL_NV_occlusion_query */ - -/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA - -#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) - -#endif /* GL_NV_packed_depth_stencil */ - -/* --------------------- GL_NV_parameter_buffer_object --------------------- */ - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 - -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 - -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); - -#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) -#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) -#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) - -#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) - -#endif /* GL_NV_parameter_buffer_object */ - -/* ------------------------- GL_NV_pixel_data_range ------------------------ */ - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 - -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D - -typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); - -#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) -#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) - -#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) - -#endif /* GL_NV_pixel_data_range */ - -/* --------------------------- GL_NV_point_sprite -------------------------- */ - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 - -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); - -#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) -#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) - -#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) - -#endif /* GL_NV_point_sprite */ - -/* ------------------------ GL_NV_primitive_restart ------------------------ */ - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 - -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); - -#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) -#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) - -#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) - -#endif /* GL_NV_primitive_restart */ - -/* ------------------------ GL_NV_register_combiners ----------------------- */ - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 - -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 - -typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); - -#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) -#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) -#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) -#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) -#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) -#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) -#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) -#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) -#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) -#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) -#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) -#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) -#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) - -#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) - -#endif /* GL_NV_register_combiners */ - -/* ----------------------- GL_NV_register_combiners2 ----------------------- */ - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 - -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 - -typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); - -#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) -#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) - -#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) - -#endif /* GL_NV_register_combiners2 */ - -/* -------------------------- GL_NV_texgen_emboss -------------------------- */ - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 - -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F - -#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) - -#endif /* GL_NV_texgen_emboss */ - -/* ------------------------ GL_NV_texgen_reflection ------------------------ */ - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 - -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 - -#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) - -#endif /* GL_NV_texgen_reflection */ - -/* --------------------- GL_NV_texture_compression_vtc --------------------- */ - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 - -#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) - -#endif /* GL_NV_texture_compression_vtc */ - -/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 - -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B - -#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) - -#endif /* GL_NV_texture_env_combine4 */ - -/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 - -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F - -#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) - -#endif /* GL_NV_texture_expand_normal */ - -/* ------------------------ GL_NV_texture_rectangle ------------------------ */ - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 - -#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) - -#endif /* GL_NV_texture_rectangle */ - -/* -------------------------- GL_NV_texture_shader ------------------------- */ - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 - -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F - -#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) - -#endif /* GL_NV_texture_shader */ - -/* ------------------------- GL_NV_texture_shader2 ------------------------- */ - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 - -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D - -#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) - -#endif /* GL_NV_texture_shader2 */ - -/* ------------------------- GL_NV_texture_shader3 ------------------------- */ - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 - -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 - -#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) - -#endif /* GL_NV_texture_shader3 */ - -/* ------------------------ GL_NV_transform_feedback ----------------------- */ - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 - -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F - -typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); - -#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) -#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) -#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) -#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) -#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) -#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) -#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) -#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) -#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) -#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) -#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) - -#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) - -#endif /* GL_NV_transform_feedback */ - -/* ------------------------ GL_NV_vertex_array_range ----------------------- */ - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); - -#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) -#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) - -#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) - -#endif /* GL_NV_vertex_array_range */ - -/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 - -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 - -#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) - -#endif /* GL_NV_vertex_array_range2 */ - -/* -------------------------- GL_NV_vertex_program ------------------------- */ - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 - -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F - -typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); - -#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) -#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) -#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) -#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) -#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) -#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) -#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) -#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) -#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) -#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) -#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) -#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) -#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) -#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) -#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) -#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) -#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) -#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) -#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) -#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) -#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) -#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) -#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) -#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) -#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) -#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) -#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) -#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) -#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) -#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) -#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) -#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) -#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) -#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) -#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) -#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) -#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) -#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) -#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) -#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) -#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) -#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) -#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) -#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) -#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) -#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) -#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) -#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) -#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) -#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) -#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) -#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) -#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) -#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) -#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) -#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) -#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) -#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) -#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) -#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) -#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) -#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) -#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) -#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) - -#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) - -#endif /* GL_NV_vertex_program */ - -/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 - -#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) - -#endif /* GL_NV_vertex_program1_1 */ - -/* ------------------------- GL_NV_vertex_program2 ------------------------- */ - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 - -#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) - -#endif /* GL_NV_vertex_program2 */ - -/* ---------------------- GL_NV_vertex_program2_option --------------------- */ - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 - -#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) - -#endif /* GL_NV_vertex_program2_option */ - -/* ------------------------- GL_NV_vertex_program3 ------------------------- */ - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 - -#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C - -#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) - -#endif /* GL_NV_vertex_program3 */ - -/* ------------------------- GL_NV_vertex_program4 ------------------------- */ - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 - -#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) - -#endif /* GL_NV_vertex_program4 */ - -/* ------------------------ GL_OES_byte_coordinates ------------------------ */ - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 - -#define GL_BYTE 0x1400 - -#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) - -#endif /* GL_OES_byte_coordinates */ - -/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 - -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 - -#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) - -#endif /* GL_OES_compressed_paletted_texture */ - -/* --------------------------- GL_OES_read_format -------------------------- */ - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 - -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B - -#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) - -#endif /* GL_OES_read_format */ - -/* ------------------------ GL_OES_single_precision ------------------------ */ - -#ifndef GL_OES_single_precision -#define GL_OES_single_precision 1 - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth); -typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); -typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); - -#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) -#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) -#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) -#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) -#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) -#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) - -#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) - -#endif /* GL_OES_single_precision */ - -/* ---------------------------- GL_OML_interlace --------------------------- */ - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 - -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 - -#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) - -#endif /* GL_OML_interlace */ - -/* ---------------------------- GL_OML_resample ---------------------------- */ - -#ifndef GL_OML_resample -#define GL_OML_resample 1 - -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 - -#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) - -#endif /* GL_OML_resample */ - -/* ---------------------------- GL_OML_subsample --------------------------- */ - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 - -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 - -#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) - -#endif /* GL_OML_subsample */ - -/* --------------------------- GL_PGI_misc_hints --------------------------- */ - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 - -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 -#define GL_CONSERVE_MEMORY_HINT_PGI 107005 -#define GL_RECLAIM_MEMORY_HINT_PGI 107006 -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 -#define GL_ALWAYS_FAST_HINT_PGI 107020 -#define GL_ALWAYS_SOFT_HINT_PGI 107021 -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 -#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 -#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 -#define GL_STRICT_LIGHTING_HINT_PGI 107031 -#define GL_STRICT_SCISSOR_HINT_PGI 107032 -#define GL_FULL_STIPPLE_HINT_PGI 107033 -#define GL_CLIP_NEAR_HINT_PGI 107040 -#define GL_CLIP_FAR_HINT_PGI 107041 -#define GL_WIDE_LINE_HINT_PGI 107042 -#define GL_BACK_NORMALS_HINT_PGI 107043 - -#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) - -#endif /* GL_PGI_misc_hints */ - -/* -------------------------- GL_PGI_vertex_hints -------------------------- */ - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 - -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_VERTEX_DATA_HINT_PGI 107050 -#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 -#define GL_MATERIAL_SIDE_HINT_PGI 107052 -#define GL_MAX_VERTEX_HINT_PGI 107053 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 - -#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) - -#endif /* GL_PGI_vertex_hints */ - -/* ----------------------- GL_REND_screen_coordinates ---------------------- */ - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 - -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 - -#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) - -#endif /* GL_REND_screen_coordinates */ - -/* ------------------------------- GL_S3_s3tc ------------------------------ */ - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 - -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 - -#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) - -#endif /* GL_S3_s3tc */ - -/* -------------------------- GL_SGIS_color_range -------------------------- */ - -#ifndef GL_SGIS_color_range -#define GL_SGIS_color_range 1 - -#define GL_EXTENDED_RANGE_SGIS 0x85A5 -#define GL_MIN_RED_SGIS 0x85A6 -#define GL_MAX_RED_SGIS 0x85A7 -#define GL_MIN_GREEN_SGIS 0x85A8 -#define GL_MAX_GREEN_SGIS 0x85A9 -#define GL_MIN_BLUE_SGIS 0x85AA -#define GL_MAX_BLUE_SGIS 0x85AB -#define GL_MIN_ALPHA_SGIS 0x85AC -#define GL_MAX_ALPHA_SGIS 0x85AD - -#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) - -#endif /* GL_SGIS_color_range */ - -/* ------------------------- GL_SGIS_detail_texture ------------------------ */ - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 - -typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); - -#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) -#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) - -#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) - -#endif /* GL_SGIS_detail_texture */ - -/* -------------------------- GL_SGIS_fog_function ------------------------- */ - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 - -typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); - -#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) -#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) - -#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) - -#endif /* GL_SGIS_fog_function */ - -/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 - -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 - -#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) - -#endif /* GL_SGIS_generate_mipmap */ - -/* -------------------------- GL_SGIS_multisample -------------------------- */ - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 - -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); - -#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) -#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) - -#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) - -#endif /* GL_SGIS_multisample */ - -/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 - -#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) - -#endif /* GL_SGIS_pixel_texture */ - -/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 - -typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); -typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); - -#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) -#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) - -#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) - -#endif /* GL_SGIS_sharpen_texture */ - -/* --------------------------- GL_SGIS_texture4D --------------------------- */ - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); - -#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) -#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) - -#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) - -#endif /* GL_SGIS_texture4D */ - -/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_SGIS 0x812D - -#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) - -#endif /* GL_SGIS_texture_border_clamp */ - -/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_SGIS 0x812F - -#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) - -#endif /* GL_SGIS_texture_edge_clamp */ - -/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 - -typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); -typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); - -#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) -#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) - -#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) - -#endif /* GL_SGIS_texture_filter4 */ - -/* -------------------------- GL_SGIS_texture_lod -------------------------- */ - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 - -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D - -#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) - -#endif /* GL_SGIS_texture_lod */ - -/* ------------------------- GL_SGIS_texture_select ------------------------ */ - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 - -#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) - -#endif /* GL_SGIS_texture_select */ - -/* ----------------------------- GL_SGIX_async ----------------------------- */ - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 - -#define GL_ASYNC_MARKER_SGIX 0x8329 - -typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); -typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); - -#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) -#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) -#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) -#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) -#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) -#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) - -#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) - -#endif /* GL_SGIX_async */ - -/* ------------------------ GL_SGIX_async_histogram ------------------------ */ - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 - -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D - -#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) - -#endif /* GL_SGIX_async_histogram */ - -/* -------------------------- GL_SGIX_async_pixel -------------------------- */ - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 - -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 - -#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) - -#endif /* GL_SGIX_async_pixel */ - -/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 - -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 - -#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) - -#endif /* GL_SGIX_blend_alpha_minmax */ - -/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 - -#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) - -#endif /* GL_SGIX_clipmap */ - -/* ------------------------- GL_SGIX_depth_texture ------------------------- */ - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 - -#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) - -#endif /* GL_SGIX_depth_texture */ - -/* -------------------------- GL_SGIX_flush_raster ------------------------- */ - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 - -typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); - -#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) - -#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) - -#endif /* GL_SGIX_flush_raster */ - -/* --------------------------- GL_SGIX_fog_offset -------------------------- */ - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 - -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 - -#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) - -#endif /* GL_SGIX_fog_offset */ - -/* -------------------------- GL_SGIX_fog_texture -------------------------- */ - -#ifndef GL_SGIX_fog_texture -#define GL_SGIX_fog_texture 1 - -#define GL_TEXTURE_FOG_SGIX 0 -#define GL_FOG_PATCHY_FACTOR_SGIX 0 -#define GL_FRAGMENT_FOG_SGIX 0 - -typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); - -#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) - -#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) - -#endif /* GL_SGIX_fog_texture */ - -/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ - -#ifndef GL_SGIX_fragment_specular_lighting -#define GL_SGIX_fragment_specular_lighting 1 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); - -#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) -#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) -#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) -#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) -#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) -#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) -#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) -#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) -#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) -#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) -#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) -#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) -#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) -#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) -#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) -#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) -#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) - -#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) - -#endif /* GL_SGIX_fragment_specular_lighting */ - -/* --------------------------- GL_SGIX_framezoom --------------------------- */ - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 - -typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); - -#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) - -#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) - -#endif /* GL_SGIX_framezoom */ - -/* --------------------------- GL_SGIX_interlace --------------------------- */ - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 - -#define GL_INTERLACE_SGIX 0x8094 - -#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) - -#endif /* GL_SGIX_interlace */ - -/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 - -#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) - -#endif /* GL_SGIX_ir_instrument1 */ - -/* ------------------------- GL_SGIX_list_priority ------------------------- */ - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 - -#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) - -#endif /* GL_SGIX_list_priority */ - -/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 - -typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); - -#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) - -#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) - -#endif /* GL_SGIX_pixel_texture */ - -/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ - -#ifndef GL_SGIX_pixel_texture_bits -#define GL_SGIX_pixel_texture_bits 1 - -#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) - -#endif /* GL_SGIX_pixel_texture_bits */ - -/* ------------------------ GL_SGIX_reference_plane ------------------------ */ - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 - -typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); - -#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) - -#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) - -#endif /* GL_SGIX_reference_plane */ - -/* ---------------------------- GL_SGIX_resample --------------------------- */ - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 - -#define GL_PACK_RESAMPLE_SGIX 0x842E -#define GL_UNPACK_RESAMPLE_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 - -#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) - -#endif /* GL_SGIX_resample */ - -/* ----------------------------- GL_SGIX_shadow ---------------------------- */ - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 - -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D - -#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) - -#endif /* GL_SGIX_shadow */ - -/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 - -#define GL_SHADOW_AMBIENT_SGIX 0x80BF - -#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) - -#endif /* GL_SGIX_shadow_ambient */ - -/* ----------------------------- GL_SGIX_sprite ---------------------------- */ - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 - -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); - -#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) -#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) -#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) -#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) - -#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) - -#endif /* GL_SGIX_sprite */ - -/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 - -typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); - -#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) - -#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) - -#endif /* GL_SGIX_tag_sample_buffer */ - -/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 - -#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) - -#endif /* GL_SGIX_texture_add_env */ - -/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 - -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B - -#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) - -#endif /* GL_SGIX_texture_coordinate_clamp */ - -/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 - -#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) - -#endif /* GL_SGIX_texture_lod_bias */ - -/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 - -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E - -#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) - -#endif /* GL_SGIX_texture_multi_buffer */ - -/* ------------------------- GL_SGIX_texture_range ------------------------- */ - -#ifndef GL_SGIX_texture_range -#define GL_SGIX_texture_range 1 - -#define GL_RGB_SIGNED_SGIX 0x85E0 -#define GL_RGBA_SIGNED_SGIX 0x85E1 -#define GL_ALPHA_SIGNED_SGIX 0x85E2 -#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 -#define GL_INTENSITY_SIGNED_SGIX 0x85E4 -#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 -#define GL_RGB16_SIGNED_SGIX 0x85E6 -#define GL_RGBA16_SIGNED_SGIX 0x85E7 -#define GL_ALPHA16_SIGNED_SGIX 0x85E8 -#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 -#define GL_INTENSITY16_SIGNED_SGIX 0x85EA -#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB -#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC -#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED -#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE -#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF -#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 -#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 -#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 -#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 -#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 -#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 -#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 -#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 -#define GL_MIN_LUMINANCE_SGIS 0x85F8 -#define GL_MAX_LUMINANCE_SGIS 0x85F9 -#define GL_MIN_INTENSITY_SGIS 0x85FA -#define GL_MAX_INTENSITY_SGIS 0x85FB - -#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) - -#endif /* GL_SGIX_texture_range */ - -/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 - -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C - -#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) - -#endif /* GL_SGIX_texture_scale_bias */ - -/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) - -#endif /* GL_SGIX_vertex_preclip */ - -/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ - -#ifndef GL_SGIX_vertex_preclip_hint -#define GL_SGIX_vertex_preclip_hint 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) - -#endif /* GL_SGIX_vertex_preclip_hint */ - -/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 - -#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) - -#endif /* GL_SGIX_ycrcb */ - -/* -------------------------- GL_SGI_color_matrix -------------------------- */ - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 - -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB - -#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) - -#endif /* GL_SGI_color_matrix */ - -/* --------------------------- GL_SGI_color_table -------------------------- */ - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 - -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); - -#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) -#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) -#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) -#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) -#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) -#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) -#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) - -#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) - -#endif /* GL_SGI_color_table */ - -/* ----------------------- GL_SGI_texture_color_table ---------------------- */ - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 - -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD - -#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) - -#endif /* GL_SGI_texture_color_table */ - -/* ------------------------- GL_SUNX_constant_data ------------------------- */ - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 - -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 - -typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); - -#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) - -#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) - -#endif /* GL_SUNX_constant_data */ - -/* -------------------- GL_SUN_convolution_border_modes -------------------- */ - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 - -#define GL_WRAP_BORDER_SUN 0x81D4 - -#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) - -#endif /* GL_SUN_convolution_border_modes */ - -/* -------------------------- GL_SUN_global_alpha -------------------------- */ - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 - -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA - -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); - -#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) -#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) -#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) -#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) -#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) -#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) -#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) -#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) - -#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) - -#endif /* GL_SUN_global_alpha */ - -/* --------------------------- GL_SUN_mesh_array --------------------------- */ - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 - -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 - -#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) - -#endif /* GL_SUN_mesh_array */ - -/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ - -#ifndef GL_SUN_read_video_pixels -#define GL_SUN_read_video_pixels 1 - -typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); - -#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) - -#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) - -#endif /* GL_SUN_read_video_pixels */ - -/* --------------------------- GL_SUN_slice_accum -------------------------- */ - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 - -#define GL_SLICE_ACCUM_SUN 0x85CC - -#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) - -#endif /* GL_SUN_slice_accum */ - -/* -------------------------- GL_SUN_triangle_list ------------------------- */ - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 - -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB - -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); - -#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) -#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) -#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) -#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) -#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) -#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) -#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) - -#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) - -#endif /* GL_SUN_triangle_list */ - -/* ----------------------------- GL_SUN_vertex ----------------------------- */ - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 - -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); - -#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) -#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) -#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) -#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) -#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) -#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) -#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) -#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) -#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) -#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) -#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) -#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) -#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) -#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) -#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) -#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) -#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) -#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) -#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) -#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) -#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) -#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) -#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) -#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) -#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) -#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) -#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) -#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) -#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) - -#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) - -#endif /* GL_SUN_vertex */ - -/* -------------------------- GL_WIN_phong_shading ------------------------- */ - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 - -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB - -#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) - -#endif /* GL_WIN_phong_shading */ - -/* -------------------------- GL_WIN_specular_fog -------------------------- */ - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 - -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC - -#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) - -#endif /* GL_WIN_specular_fog */ - -/* ---------------------------- GL_WIN_swap_hint --------------------------- */ - -#ifndef GL_WIN_swap_hint -#define GL_WIN_swap_hint 1 - -typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); - -#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) - -#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - -#if defined(GLEW_MX) && defined(_WIN32) -#define GLEW_FUN_EXPORT -#else -#define GLEW_FUN_EXPORT GLEWAPI -#endif /* GLEW_MX */ - -#if defined(GLEW_MX) -#define GLEW_VAR_EXPORT -#else -#define GLEW_VAR_EXPORT GLEWAPI -#endif /* GLEW_MX */ - -#if defined(GLEW_MX) && defined(_WIN32) -struct GLEWContextStruct -{ -#endif /* GLEW_MX */ - -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; - -GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; -GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; -GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; -GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; -GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; -GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; -GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; -GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; -GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; -GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; -GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; -GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; - -GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; -GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; -GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; -GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; -GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; -GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; -GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; -GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; -GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; -GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; -GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; -GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; -GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; -GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; -GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; - -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; - -GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; -GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; -GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; -GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; - -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; -GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; -GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; -GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; -GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; - -GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; - -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; -GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; -GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; -GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; - -GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; -GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; -GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; -GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; -GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; -GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; -GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; - -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; - -GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; -GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; -GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; -GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; -GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; -GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; - -GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; -GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; - -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; - -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; - -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; -GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; -GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; -GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; - -GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; - -GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI; -GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI; - -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; - -GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; -GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; -GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; -GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; -GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; - -GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; - -GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; -GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; - -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; - -GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; - -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; -GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; - -GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; - -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; - -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; - -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; -GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; -GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; -GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; - -GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; - -GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; - -GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; -GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; - -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; - -GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; -GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; - -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; - -GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; - -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; - -GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; -GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; - -GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; -GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; -GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; -GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; -GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; - -GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; - -GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; -GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; -GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT; -GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; -GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; - -GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; -GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; -GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; -GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; -GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; -GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; -GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; -GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; -GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; -GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; -GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; -GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; - -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; - -GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; - -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; - -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; - -GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; -GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; - -GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT; -GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT; -GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT; - -GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; - -GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; -GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; -GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; -GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; -GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; -GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; -GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; -GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; -GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; - -GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; -GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; - -GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; -GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; - -GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; -GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; - -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; -GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; -GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; - -GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; -GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; - -GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; -GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; -GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; -GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; -GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; -GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; -GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; -GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; -GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; -GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; - -GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; - -GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; - -GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; -GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; - -GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; -GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; - -GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; - -GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; - -GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; - -GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; - -GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; - -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; - -GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; - -GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; - -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; - -GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; - -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; - -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; - -GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; - -#if defined(GLEW_MX) && !defined(_WIN32) -struct GLEWContextStruct -{ -#endif /* GLEW_MX */ - -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; -GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; -GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; - -#ifdef GLEW_MX -}; /* GLEWContextStruct */ -#endif /* GLEW_MX */ - -/* ------------------------------------------------------------------------- */ - -/* error codes */ -#define GLEW_OK 0 -#define GLEW_NO_ERROR 0 -#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ -#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* GL 1.1 and up are not supported */ -#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* GLX 1.2 and up are not supported */ - -/* string codes */ -#define GLEW_VERSION 1 - -/* API */ -#ifdef GLEW_MX - -typedef struct GLEWContextStruct GLEWContext; -GLEWAPI GLenum glewContextInit (GLEWContext* ctx); -GLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name); - -#define glewInit() glewContextInit(glewGetContext()) -#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) -#define glewIsExtensionSupported(x) glewIsSupported(x) - -#ifdef _WIN32 -# define GLEW_GET_VAR(x) glewGetContext()->x -# define GLEW_GET_FUN(x) glewGetContext()->x -#else -# define GLEW_GET_VAR(x) glewGetContext()->x -# define GLEW_GET_FUN(x) x -#endif - -#else /* GLEW_MX */ - -GLEWAPI GLenum glewInit (); -GLEWAPI GLboolean glewIsSupported (const char* name); -#define glewIsExtensionSupported(x) glewIsSupported(x) - -#define GLEW_GET_VAR(x) x -#define GLEW_GET_FUN(x) x - -#endif /* GLEW_MX */ - -GLEWAPI GLboolean glewExperimental; -GLEWAPI GLboolean glewGetExtension (const char* name); -GLEWAPI const GLubyte* glewGetErrorString (GLenum error); -GLEWAPI const GLubyte* glewGetString (GLenum name); - -#ifdef __cplusplus -} -#endif - -#ifdef GLEW_APIENTRY_DEFINED -#undef GLEW_APIENTRY_DEFINED -#undef APIENTRY -#undef GLAPIENTRY -#endif - -#ifdef GLEW_CALLBACK_DEFINED -#undef GLEW_CALLBACK_DEFINED -#undef CALLBACK -#endif - -#ifdef GLEW_WINGDIAPI_DEFINED -#undef GLEW_WINGDIAPI_DEFINED -#undef WINGDIAPI -#endif - -#undef GLAPI -/* #undef GLEWAPI */ - -#endif /* __glew_h__ */ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2006, Milan Ikits +** Copyright (C) 2002-2006, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#if defined(__gl_h_) || defined(__GL_H__) +#error gl.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __GL_H__ +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* */ +#ifndef APIENTRY +#define GLEW_APIENTRY_DEFINED +# if defined(__CYGWIN__) || defined(__MINGW32__) +# define APIENTRY __stdcall +# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__CYGWIN__) || defined(__MINGW32__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__CYGWIN__) || defined(__MINGW32__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__CYGWIN__) || defined(__MINGW32__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY +#define GLEWAPI extern + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +#if defined(__APPLE__) +typedef unsigned long GLenum; +typedef unsigned long GLbitfield; +typedef unsigned long GLuint; +typedef long GLint; +typedef long GLsizei; +#else +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +#endif +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1310 +# ifdef _WIN64 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +# else +typedef _W64 int GLint64EXT; +typedef _W64 unsigned int GLuint64EXT; +# endif +#else +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#endif + +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_TRUE 1 +#define GL_FALSE 0 +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_NONE 0 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_LOGIC_OP GL_INDEX_LOGIC_OP +#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +/* this is where we can safely include GLU */ +#if defined(__APPLE__) && defined(__MACH__) +#include +#else +#include +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef char GLchar; + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLint programObj, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_RED_BIT_ATI 0x00000001 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_RGB_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GL_TEXTURE_ENV0_EXT 0 +#define GL_ENV_BLEND_EXT 0 +#define GL_TEXTURE_ENV_SHIFT_EXT 0 +#define GL_ENV_REPLACE_EXT 0 +#define GL_ENV_ADD_EXT 0 +#define GL_ENV_SUBTRACT_EXT 0 +#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 +#define GL_ENV_REVERSE_SUBTRACT_EXT 0 +#define GL_ENV_REVERSE_BLEND_EXT 0 +#define GL_ENV_COPY_EXT 0 +#define GL_ENV_MODULATE_EXT 0 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT) +#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT) +#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT) +#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT) +#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_ARB 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLE_COUNT_ARB 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GL_BYTE 0x1400 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 + +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + +#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) + +#endif /* GL_OES_compressed_paletted_texture */ + +/* --------------------------- GL_OES_read_format -------------------------- */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 + +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + +#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) + +#endif /* GL_OES_read_format */ + +/* ------------------------ GL_OES_single_precision ------------------------ */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + +#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) +#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) +#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) +#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) +#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) +#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) + +#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) + +#endif /* GL_OES_single_precision */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +#define GL_TEXTURE_FOG_SGIX 0 +#define GL_FOG_PATCHY_FACTOR_SGIX 0 +#define GL_FRAGMENT_FOG_SGIX 0 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +#if defined(GLEW_MX) && defined(_WIN32) +#define GLEW_FUN_EXPORT +#else +#define GLEW_FUN_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) +#define GLEW_VAR_EXPORT +#else +#define GLEW_VAR_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) && defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; +GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; +GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; +GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; + +#if defined(GLEW_MX) && !defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; + +#ifdef GLEW_MX +}; /* GLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* GL 1.1 and up are not supported */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* GLX 1.2 and up are not supported */ + +/* string codes */ +#define GLEW_VERSION 1 + +/* API */ +#ifdef GLEW_MX + +typedef struct GLEWContextStruct GLEWContext; +GLEWAPI GLenum glewContextInit (GLEWContext* ctx); +GLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name); + +#define glewInit() glewContextInit(glewGetContext()) +#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#ifdef _WIN32 +# define GLEW_GET_VAR(x) glewGetContext()->x +# define GLEW_GET_FUN(x) glewGetContext()->x +#else +# define GLEW_GET_VAR(x) glewGetContext()->x +# define GLEW_GET_FUN(x) x +#endif + +#else /* GLEW_MX */ + +GLEWAPI GLenum glewInit (); +GLEWAPI GLboolean glewIsSupported (const char* name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) x +#define GLEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean glewGetExtension (const char* name); +GLEWAPI const GLubyte* glewGetErrorString (GLenum error); +GLEWAPI const GLubyte* glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#undef GLAPIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff --git a/Glut/GL/glxew.h b/Glut/GL/glxew.h index f5663f353..6260436e1 100644 --- a/Glut/GL/glxew.h +++ b/Glut/GL/glxew.h @@ -1,1091 +1,1091 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2002-2006, Milan Ikits -** Copyright (C) 2002-2006, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** The contents of this file are subject to the GLX Public License Version 1.0 -** (the "License"). You may not use this file except in compliance with the -** License. You may obtain a copy of the License at Silicon Graphics, Inc., -** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 -** or at http://www.sgi.com/software/opensource/glx/license.html. -** -** Software distributed under the License is distributed on an "AS IS" -** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY -** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR -** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific -** language governing rights and limitations under the License. -** -** The Original Software is GLX version 1.2 source code, released February, -** 1999. The developer of the Original Software is Silicon Graphics, Inc. -** Those portions of the Subject Software created by Silicon Graphics, Inc. -** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. -*/ - -#ifndef __glxew_h__ -#define __glxew_h__ -#define __GLXEW_H__ - -#ifdef __glxext_h_ -#error glxext.h included before glxew.h -#endif - -#define __glxext_h_ -#define __GLX_glx_h__ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ - -#ifndef GLX_VERSION_1_0 -#define GLX_VERSION_1_0 1 - -#define GLX_USE_GL 1 -#define GLX_BUFFER_SIZE 2 -#define GLX_LEVEL 3 -#define GLX_RGBA 4 -#define GLX_DOUBLEBUFFER 5 -#define GLX_STEREO 6 -#define GLX_AUX_BUFFERS 7 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 -#define GLX_ALPHA_SIZE 11 -#define GLX_DEPTH_SIZE 12 -#define GLX_STENCIL_SIZE 13 -#define GLX_ACCUM_RED_SIZE 14 -#define GLX_ACCUM_GREEN_SIZE 15 -#define GLX_ACCUM_BLUE_SIZE 16 -#define GLX_ACCUM_ALPHA_SIZE 17 -#define GLX_BAD_SCREEN 1 -#define GLX_BAD_ATTRIBUTE 2 -#define GLX_NO_EXTENSION 3 -#define GLX_BAD_VISUAL 4 -#define GLX_BAD_CONTEXT 5 -#define GLX_BAD_VALUE 6 -#define GLX_BAD_ENUM 7 - -typedef XID GLXDrawable; -typedef XID GLXPixmap; -#ifdef __sun -typedef struct __glXcontextRec *GLXContext; -#else -typedef struct __GLXcontextRec *GLXContext; -#endif - -extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); -extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); -extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); -extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); -extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); -extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); -extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); -extern void glXDestroyContext (Display *dpy, GLXContext ctx); -extern Bool glXIsDirect (Display *dpy, GLXContext ctx); -extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLuint mask); -extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); -extern GLXContext glXGetCurrentContext (void); -extern GLXDrawable glXGetCurrentDrawable (void); -extern void glXWaitGL (void); -extern void glXWaitX (void); -extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); -extern void glXUseXFont (Font font, int first, int count, int listBase); - -#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) - -#endif /* GLX_VERSION_1_0 */ - -/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ - -#ifndef GLX_VERSION_1_1 -#define GLX_VERSION_1_1 - -#define GLX_VENDOR 0x1 -#define GLX_VERSION 0x2 -#define GLX_EXTENSIONS 0x3 - -extern const char* glXQueryExtensionsString (Display *dpy, int screen); -extern const char* glXGetClientString (Display *dpy, int name); -extern const char* glXQueryServerString (Display *dpy, int screen, int name); - -#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) - -#endif /* GLX_VERSION_1_1 */ - -/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ - -#ifndef GLX_VERSION_1_2 -#define GLX_VERSION_1_2 1 - -typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); - -#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) - -#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) - -#endif /* GLX_VERSION_1_2 */ - -/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ - -#ifndef GLX_VERSION_1_3 -#define GLX_VERSION_1_3 1 - -#define GLX_RGBA_BIT 0x00000001 -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_CONFIG_CAVEAT 0x20 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 -#define GLX_VISUAL_ID 0x800B -#define GLX_SCREEN 0x800C -#define GLX_NON_CONFORMANT_CONFIG 0x800D -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_PBUFFER_HEIGHT 0x8040 -#define GLX_PBUFFER_WIDTH 0x8041 -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 -#define GLX_DONT_CARE 0xFFFFFFFF - -typedef XID GLXFBConfigID; -typedef XID GLXWindow; -typedef XID GLXPbuffer; -typedef struct __GLXFBConfigRec *GLXFBConfig; -typedef struct { int event_type; int draw_type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; unsigned int buffer_mask; unsigned int aux_buffer; int x, y; int width, height; int count; } GLXPbufferClobberEvent; -typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; long pad[24]; } GLXEvent; - -typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); -typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); -typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); -typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); -typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); -typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); -typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); -typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); -typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); -typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); - -#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) -#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) -#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) -#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) -#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) -#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) -#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) -#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) -#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) -#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) -#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) -#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) -#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) -#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) -#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) -#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) -#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) - -#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) - -#endif /* GLX_VERSION_1_3 */ - -/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ - -#ifndef GLX_VERSION_1_4 -#define GLX_VERSION_1_4 1 - -#define GLX_SAMPLE_BUFFERS 100000 -#define GLX_SAMPLES 100001 - -extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); - -#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) - -#endif /* GLX_VERSION_1_4 */ - -/* -------------------------- GLX_3DFX_multisample ------------------------- */ - -#ifndef GLX_3DFX_multisample -#define GLX_3DFX_multisample 1 - -#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 -#define GLX_SAMPLES_3DFX 0x8051 - -#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) - -#endif /* GLX_3DFX_multisample */ - -/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ - -#ifndef GLX_ARB_fbconfig_float -#define GLX_ARB_fbconfig_float 1 - -#define GLX_RGBA_FLOAT_BIT 0x00000004 -#define GLX_RGBA_FLOAT_TYPE 0x20B9 - -#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) - -#endif /* GLX_ARB_fbconfig_float */ - -/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ - -#ifndef GLX_ARB_get_proc_address -#define GLX_ARB_get_proc_address 1 - -extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); - -#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) - -#endif /* GLX_ARB_get_proc_address */ - -/* -------------------------- GLX_ARB_multisample -------------------------- */ - -#ifndef GLX_ARB_multisample -#define GLX_ARB_multisample 1 - -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 - -#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) - -#endif /* GLX_ARB_multisample */ - -/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ - -#ifndef GLX_ATI_pixel_format_float -#define GLX_ATI_pixel_format_float 1 - -#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 - -#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) - -#endif /* GLX_ATI_pixel_format_float */ - -/* ------------------------- GLX_ATI_render_texture ------------------------ */ - -#ifndef GLX_ATI_render_texture -#define GLX_ATI_render_texture 1 - -#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 -#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 -#define GLX_TEXTURE_FORMAT_ATI 0x9802 -#define GLX_TEXTURE_TARGET_ATI 0x9803 -#define GLX_MIPMAP_TEXTURE_ATI 0x9804 -#define GLX_TEXTURE_RGB_ATI 0x9805 -#define GLX_TEXTURE_RGBA_ATI 0x9806 -#define GLX_NO_TEXTURE_ATI 0x9807 -#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 -#define GLX_TEXTURE_1D_ATI 0x9809 -#define GLX_TEXTURE_2D_ATI 0x980A -#define GLX_MIPMAP_LEVEL_ATI 0x980B -#define GLX_CUBE_MAP_FACE_ATI 0x980C -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 -#define GLX_FRONT_LEFT_ATI 0x9813 -#define GLX_FRONT_RIGHT_ATI 0x9814 -#define GLX_BACK_LEFT_ATI 0x9815 -#define GLX_BACK_RIGHT_ATI 0x9816 -#define GLX_AUX0_ATI 0x9817 -#define GLX_AUX1_ATI 0x9818 -#define GLX_AUX2_ATI 0x9819 -#define GLX_AUX3_ATI 0x981A -#define GLX_AUX4_ATI 0x981B -#define GLX_AUX5_ATI 0x981C -#define GLX_AUX6_ATI 0x981D -#define GLX_AUX7_ATI 0x981E -#define GLX_AUX8_ATI 0x981F -#define GLX_AUX9_ATI 0x9820 -#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 -#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 - -typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); -typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); - -#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) -#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) -#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) - -#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) - -#endif /* GLX_ATI_render_texture */ - -/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ - -#ifndef GLX_EXT_fbconfig_packed_float -#define GLX_EXT_fbconfig_packed_float 1 - -#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 -#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 - -#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) - -#endif /* GLX_EXT_fbconfig_packed_float */ - -/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_EXT_framebuffer_sRGB -#define GLX_EXT_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 - -#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) - -#endif /* GLX_EXT_framebuffer_sRGB */ - -/* ------------------------- GLX_EXT_import_context ------------------------ */ - -#ifndef GLX_EXT_import_context -#define GLX_EXT_import_context 1 - -#define GLX_SHARE_CONTEXT_EXT 0x800A -#define GLX_VISUAL_ID_EXT 0x800B -#define GLX_SCREEN_EXT 0x800C - -typedef XID GLXContextID; - -typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); -typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); -typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); -typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); - -#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) -#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) -#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) -#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) - -#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) - -#endif /* GLX_EXT_import_context */ - -/* -------------------------- GLX_EXT_scene_marker ------------------------- */ - -#ifndef GLX_EXT_scene_marker -#define GLX_EXT_scene_marker 1 - -#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) - -#endif /* GLX_EXT_scene_marker */ - -/* -------------------------- GLX_EXT_visual_info -------------------------- */ - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info 1 - -#define GLX_X_VISUAL_TYPE_EXT 0x22 -#define GLX_TRANSPARENT_TYPE_EXT 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 -#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 -#define GLX_NONE_EXT 0x8000 -#define GLX_TRUE_COLOR_EXT 0x8002 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#define GLX_PSEUDO_COLOR_EXT 0x8004 -#define GLX_STATIC_COLOR_EXT 0x8005 -#define GLX_GRAY_SCALE_EXT 0x8006 -#define GLX_STATIC_GRAY_EXT 0x8007 -#define GLX_TRANSPARENT_RGB_EXT 0x8008 -#define GLX_TRANSPARENT_INDEX_EXT 0x8009 - -#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) - -#endif /* GLX_EXT_visual_info */ - -/* ------------------------- GLX_EXT_visual_rating ------------------------- */ - -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating 1 - -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D - -#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) - -#endif /* GLX_EXT_visual_rating */ - -/* -------------------------- GLX_MESA_agp_offset -------------------------- */ - -#ifndef GLX_MESA_agp_offset -#define GLX_MESA_agp_offset 1 - -typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); - -#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) - -#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) - -#endif /* GLX_MESA_agp_offset */ - -/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ - -#ifndef GLX_MESA_copy_sub_buffer -#define GLX_MESA_copy_sub_buffer 1 - -typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); - -#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) - -#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) - -#endif /* GLX_MESA_copy_sub_buffer */ - -/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ - -#ifndef GLX_MESA_pixmap_colormap -#define GLX_MESA_pixmap_colormap 1 - -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); - -#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) - -#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) - -#endif /* GLX_MESA_pixmap_colormap */ - -/* ------------------------ GLX_MESA_release_buffers ----------------------- */ - -#ifndef GLX_MESA_release_buffers -#define GLX_MESA_release_buffers 1 - -typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); - -#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) - -#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) - -#endif /* GLX_MESA_release_buffers */ - -/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_MESA_set_3dfx_mode 1 - -#define GLX_3DFX_WINDOW_MODE_MESA 0x1 -#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 - -typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); - -#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) - -#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) - -#endif /* GLX_MESA_set_3dfx_mode */ - -/* -------------------------- GLX_NV_float_buffer -------------------------- */ - -#ifndef GLX_NV_float_buffer -#define GLX_NV_float_buffer 1 - -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 - -#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) - -#endif /* GLX_NV_float_buffer */ - -/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ - -#ifndef GLX_NV_vertex_array_range -#define GLX_NV_vertex_array_range 1 - -typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); - -#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) -#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) - -#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) - -#endif /* GLX_NV_vertex_array_range */ - -/* -------------------------- GLX_OML_swap_method -------------------------- */ - -#ifndef GLX_OML_swap_method -#define GLX_OML_swap_method 1 - -#define GLX_SWAP_METHOD_OML 0x8060 -#define GLX_SWAP_EXCHANGE_OML 0x8061 -#define GLX_SWAP_COPY_OML 0x8062 -#define GLX_SWAP_UNDEFINED_OML 0x8063 - -#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) - -#endif /* GLX_OML_swap_method */ - -/* -------------------------- GLX_OML_sync_control ------------------------- */ - -#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -#include -#define GLX_OML_sync_control 1 - -typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); -typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); -typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); - -#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) -#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) -#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) -#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) -#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) - -#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) - -#endif /* GLX_OML_sync_control */ - -/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ - -#ifndef GLX_SGIS_blended_overlay -#define GLX_SGIS_blended_overlay 1 - -#define GLX_BLENDED_RGBA_SGIS 0x8025 - -#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) - -#endif /* GLX_SGIS_blended_overlay */ - -/* -------------------------- GLX_SGIS_color_range ------------------------- */ - -#ifndef GLX_SGIS_color_range -#define GLX_SGIS_color_range 1 - -#define GLX_MIN_RED_SGIS 0 -#define GLX_MAX_GREEN_SGIS 0 -#define GLX_MIN_BLUE_SGIS 0 -#define GLX_MAX_ALPHA_SGIS 0 -#define GLX_MIN_GREEN_SGIS 0 -#define GLX_MIN_ALPHA_SGIS 0 -#define GLX_MAX_RED_SGIS 0 -#define GLX_EXTENDED_RANGE_SGIS 0 -#define GLX_MAX_BLUE_SGIS 0 - -#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) - -#endif /* GLX_SGIS_color_range */ - -/* -------------------------- GLX_SGIS_multisample ------------------------- */ - -#ifndef GLX_SGIS_multisample -#define GLX_SGIS_multisample 1 - -#define GLX_SAMPLE_BUFFERS_SGIS 100000 -#define GLX_SAMPLES_SGIS 100001 - -#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) - -#endif /* GLX_SGIS_multisample */ - -/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ - -#ifndef GLX_SGIS_shared_multisample -#define GLX_SGIS_shared_multisample 1 - -#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 -#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 - -#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) - -#endif /* GLX_SGIS_shared_multisample */ - -/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ - -#ifndef GLX_SGIX_fbconfig -#define GLX_SGIX_fbconfig 1 - -#define GLX_WINDOW_BIT_SGIX 0x00000001 -#define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 -#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 -#define GLX_SCREEN_EXT 0x800C -#define GLX_DRAWABLE_TYPE_SGIX 0x8010 -#define GLX_RENDER_TYPE_SGIX 0x8011 -#define GLX_X_RENDERABLE_SGIX 0x8012 -#define GLX_FBCONFIG_ID_SGIX 0x8013 -#define GLX_RGBA_TYPE_SGIX 0x8014 -#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 - -typedef XID GLXFBConfigIDSGIX; -typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; - -typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); -typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); -typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); - -#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) -#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) -#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) -#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) -#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) -#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) - -#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) - -#endif /* GLX_SGIX_fbconfig */ - -/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ - -#ifndef GLX_SGIX_pbuffer -#define GLX_SGIX_pbuffer 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 -#define GLX_PBUFFER_BIT_SGIX 0x00000004 -#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 -#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 -#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 -#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 -#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 -#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 -#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 -#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 -#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 -#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A -#define GLX_PRESERVED_CONTENTS_SGIX 0x801B -#define GLX_LARGEST_PBUFFER_SGIX 0x801C -#define GLX_WIDTH_SGIX 0x801D -#define GLX_HEIGHT_SGIX 0x801E -#define GLX_EVENT_MASK_SGIX 0x801F -#define GLX_DAMAGED_SGIX 0x8020 -#define GLX_SAVED_SGIX 0x8021 -#define GLX_WINDOW_SGIX 0x8022 -#define GLX_PBUFFER_SGIX 0x8023 -#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 - -typedef XID GLXPbufferSGIX; -typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; - -typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); -typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); -typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); - -#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) -#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) -#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) -#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) -#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) - -#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) - -#endif /* GLX_SGIX_pbuffer */ - -/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ - -#ifndef GLX_SGIX_swap_barrier -#define GLX_SGIX_swap_barrier 1 - -typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); -typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); - -#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) -#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) - -#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) - -#endif /* GLX_SGIX_swap_barrier */ - -/* -------------------------- GLX_SGIX_swap_group -------------------------- */ - -#ifndef GLX_SGIX_swap_group -#define GLX_SGIX_swap_group 1 - -typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); - -#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) - -#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) - -#endif /* GLX_SGIX_swap_group */ - -/* ------------------------- GLX_SGIX_video_resize ------------------------- */ - -#ifndef GLX_SGIX_video_resize -#define GLX_SGIX_video_resize 1 - -#define GLX_SYNC_FRAME_SGIX 0x00000000 -#define GLX_SYNC_SWAP_SGIX 0x00000001 - -typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); -typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); -typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); -typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); -typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); - -#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) -#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) -#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) -#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) -#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) - -#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) - -#endif /* GLX_SGIX_video_resize */ - -/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ - -#ifndef GLX_SGIX_visual_select_group -#define GLX_SGIX_visual_select_group 1 - -#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 - -#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) - -#endif /* GLX_SGIX_visual_select_group */ - -/* ---------------------------- GLX_SGI_cushion ---------------------------- */ - -#ifndef GLX_SGI_cushion -#define GLX_SGI_cushion 1 - -typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); - -#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) - -#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) - -#endif /* GLX_SGI_cushion */ - -/* ----------------------- GLX_SGI_make_current_read ----------------------- */ - -#ifndef GLX_SGI_make_current_read -#define GLX_SGI_make_current_read 1 - -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); -typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); - -#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) -#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) - -#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) - -#endif /* GLX_SGI_make_current_read */ - -/* -------------------------- GLX_SGI_swap_control ------------------------- */ - -#ifndef GLX_SGI_swap_control -#define GLX_SGI_swap_control 1 - -typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); - -#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) - -#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) - -#endif /* GLX_SGI_swap_control */ - -/* --------------------------- GLX_SGI_video_sync -------------------------- */ - -#ifndef GLX_SGI_video_sync -#define GLX_SGI_video_sync 1 - -typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count); -typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); - -#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) -#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) - -#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) - -#endif /* GLX_SGI_video_sync */ - -/* --------------------- GLX_SUN_get_transparent_index --------------------- */ - -#ifndef GLX_SUN_get_transparent_index -#define GLX_SUN_get_transparent_index 1 - -typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); - -#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) - -#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) - -#endif /* GLX_SUN_get_transparent_index */ - -/* -------------------------- GLX_SUN_video_resize ------------------------- */ - -#ifndef GLX_SUN_video_resize -#define GLX_SUN_video_resize 1 - -#define GLX_VIDEO_RESIZE_SUN 0x8171 -#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD - -typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); -typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); - -#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) -#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) - -#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------- */ - -#ifdef GLEW_MX -#define GLXEW_EXPORT -#else -#define GLXEW_EXPORT extern -#endif /* GLEW_MX */ - -extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; - -extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; -extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; -extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; -extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; -extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow; -extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; -extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; -extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; -extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; -extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; -extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; -extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; -extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; -extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; -extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext; -extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; -extern PFNGLXSELECTEVENTPROC __glewXSelectEvent; - -extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; -extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; -extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; - -extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; -extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; -extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; -extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; - -extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; - -extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; - -extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; - -extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; - -extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; - -extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; -extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; - -#ifdef GLX_OML_sync_control -extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; -extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; -extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; -extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; -extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; -#endif - -extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; -extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; -extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; -extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; -extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; -extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; - -extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; -extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; -extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; -extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; -extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; - -extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; -extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; - -extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; - -extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; -extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; -extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; -extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; -extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; - -extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI; - -extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; -extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; - -extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; - -extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; -extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; - -extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; - -extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; -extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; - -#if defined(GLEW_MX) -struct GLXEWContextStruct -{ -#endif /* GLEW_MX */ - -GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0; -GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1; -GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2; -GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3; -GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4; -GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample; -GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; -GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address; -GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample; -GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; -GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture; -GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; -GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; -GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context; -GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker; -GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info; -GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating; -GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset; -GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; -GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; -GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers; -GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; -GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer; -GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range; -GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method; -GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control; -GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; -GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range; -GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample; -GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; -GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig; -GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer; -GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; -GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group; -GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize; -GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; -GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion; -GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read; -GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control; -GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync; -GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; -GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize; - -#ifdef GLEW_MX -}; /* GLXEWContextStruct */ -#endif /* GLEW_MX */ - -/* ------------------------------------------------------------------------ */ - -#ifdef GLEW_MX - -typedef struct GLXEWContextStruct GLXEWContext; -extern GLenum glxewContextInit (GLXEWContext* ctx); -extern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name); - -#define glxewInit() glxewContextInit(glxewGetContext()) -#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) - -#define GLXEW_GET_VAR(x) glxewGetContext()->x -#define GLXEW_GET_FUN(x) x - -#else /* GLEW_MX */ - -#define GLXEW_GET_VAR(x) x -#define GLXEW_GET_FUN(x) x - -extern GLboolean glxewIsSupported (const char* name); - -#endif /* GLEW_MX */ - -extern GLboolean glxewGetExtension (const char* name); - -#ifdef __cplusplus -} -#endif - -#endif /* __glxew_h__ */ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2006, Milan Ikits +** Copyright (C) 2002-2006, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** The contents of this file are subject to the GLX Public License Version 1.0 +** (the "License"). You may not use this file except in compliance with the +** License. You may obtain a copy of the License at Silicon Graphics, Inc., +** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 +** or at http://www.sgi.com/software/opensource/glx/license.html. +** +** Software distributed under the License is distributed on an "AS IS" +** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY +** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR +** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific +** language governing rights and limitations under the License. +** +** The Original Software is GLX version 1.2 source code, released February, +** 1999. The developer of the Original Software is Silicon Graphics, Inc. +** Those portions of the Subject Software created by Silicon Graphics, Inc. +** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. +*/ + +#ifndef __glxew_h__ +#define __glxew_h__ +#define __GLXEW_H__ + +#ifdef __glxext_h_ +#error glxext.h included before glxew.h +#endif + +#define __glxext_h_ +#define __GLX_glx_h__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ + +#ifndef GLX_VERSION_1_0 +#define GLX_VERSION_1_0 1 + +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + +typedef XID GLXDrawable; +typedef XID GLXPixmap; +#ifdef __sun +typedef struct __glXcontextRec *GLXContext; +#else +typedef struct __GLXcontextRec *GLXContext; +#endif + +extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); +extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); +extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); +extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); +extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +extern void glXDestroyContext (Display *dpy, GLXContext ctx); +extern Bool glXIsDirect (Display *dpy, GLXContext ctx); +extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLuint mask); +extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern GLXContext glXGetCurrentContext (void); +extern GLXDrawable glXGetCurrentDrawable (void); +extern void glXWaitGL (void); +extern void glXWaitX (void); +extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); +extern void glXUseXFont (Font font, int first, int count, int listBase); + +#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) + +#endif /* GLX_VERSION_1_0 */ + +/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ + +#ifndef GLX_VERSION_1_1 +#define GLX_VERSION_1_1 + +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +extern const char* glXQueryExtensionsString (Display *dpy, int screen); +extern const char* glXGetClientString (Display *dpy, int name); +extern const char* glXQueryServerString (Display *dpy, int screen, int name); + +#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) + +#endif /* GLX_VERSION_1_1 */ + +/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ + +#ifndef GLX_VERSION_1_2 +#define GLX_VERSION_1_2 1 + +typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); + +#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) + +#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) + +#endif /* GLX_VERSION_1_2 */ + +/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 + +#define GLX_RGBA_BIT 0x00000001 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DONT_CARE 0xFFFFFFFF + +typedef XID GLXFBConfigID; +typedef XID GLXWindow; +typedef XID GLXPbuffer; +typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef struct { int event_type; int draw_type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; unsigned int buffer_mask; unsigned int aux_buffer; int x, y; int width, height; int count; } GLXPbufferClobberEvent; +typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; long pad[24]; } GLXEvent; + +typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); + +#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) +#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) +#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) +#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) +#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) +#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) +#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) +#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) +#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) +#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) +#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) +#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) +#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) +#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) +#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) +#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) +#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) + +#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) + +#endif /* GLX_VERSION_1_3 */ + +/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); + +#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) + +#endif /* GLX_VERSION_1_4 */ + +/* -------------------------- GLX_3DFX_multisample ------------------------- */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 + +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 + +#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) + +#endif /* GLX_3DFX_multisample */ + +/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 + +#define GLX_RGBA_FLOAT_BIT 0x00000004 +#define GLX_RGBA_FLOAT_TYPE 0x20B9 + +#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) + +#endif /* GLX_ARB_fbconfig_float */ + +/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); + +#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) + +#endif /* GLX_ARB_get_proc_address */ + +/* -------------------------- GLX_ARB_multisample -------------------------- */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 + +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 + +#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) + +#endif /* GLX_ARB_multisample */ + +/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ + +#ifndef GLX_ATI_pixel_format_float +#define GLX_ATI_pixel_format_float 1 + +#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 + +#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) + +#endif /* GLX_ATI_pixel_format_float */ + +/* ------------------------- GLX_ATI_render_texture ------------------------ */ + +#ifndef GLX_ATI_render_texture +#define GLX_ATI_render_texture 1 + +#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 +#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 +#define GLX_TEXTURE_FORMAT_ATI 0x9802 +#define GLX_TEXTURE_TARGET_ATI 0x9803 +#define GLX_MIPMAP_TEXTURE_ATI 0x9804 +#define GLX_TEXTURE_RGB_ATI 0x9805 +#define GLX_TEXTURE_RGBA_ATI 0x9806 +#define GLX_NO_TEXTURE_ATI 0x9807 +#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 +#define GLX_TEXTURE_1D_ATI 0x9809 +#define GLX_TEXTURE_2D_ATI 0x980A +#define GLX_MIPMAP_LEVEL_ATI 0x980B +#define GLX_CUBE_MAP_FACE_ATI 0x980C +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 +#define GLX_FRONT_LEFT_ATI 0x9813 +#define GLX_FRONT_RIGHT_ATI 0x9814 +#define GLX_BACK_LEFT_ATI 0x9815 +#define GLX_BACK_RIGHT_ATI 0x9816 +#define GLX_AUX0_ATI 0x9817 +#define GLX_AUX1_ATI 0x9818 +#define GLX_AUX2_ATI 0x9819 +#define GLX_AUX3_ATI 0x981A +#define GLX_AUX4_ATI 0x981B +#define GLX_AUX5_ATI 0x981C +#define GLX_AUX6_ATI 0x981D +#define GLX_AUX7_ATI 0x981E +#define GLX_AUX8_ATI 0x981F +#define GLX_AUX9_ATI 0x9820 +#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 +#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 + +typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); +typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); + +#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) +#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) +#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) + +#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) + +#endif /* GLX_ATI_render_texture */ + +/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 + +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 + +#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) + +#endif /* GLX_EXT_fbconfig_packed_float */ + +/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 + +#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) + +#endif /* GLX_EXT_framebuffer_sRGB */ + +/* ------------------------- GLX_EXT_import_context ------------------------ */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +typedef XID GLXContextID; + +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); + +#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) +#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) +#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) +#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) + +#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) + +#endif /* GLX_EXT_import_context */ + +/* -------------------------- GLX_EXT_scene_marker ------------------------- */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 + +#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) + +#endif /* GLX_EXT_scene_marker */ + +/* -------------------------- GLX_EXT_visual_info -------------------------- */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) + +#endif /* GLX_EXT_visual_info */ + +/* ------------------------- GLX_EXT_visual_rating ------------------------- */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) + +#endif /* GLX_EXT_visual_rating */ + +/* -------------------------- GLX_MESA_agp_offset -------------------------- */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); + +#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) + +#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) + +#endif /* GLX_MESA_agp_offset */ + +/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); + +#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) + +#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) + +#endif /* GLX_MESA_copy_sub_buffer */ + +/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); + +#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) + +#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) + +#endif /* GLX_MESA_pixmap_colormap */ + +/* ------------------------ GLX_MESA_release_buffers ----------------------- */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); + +#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) + +#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) + +#endif /* GLX_MESA_release_buffers */ + +/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); + +#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) + +#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) + +#endif /* GLX_MESA_set_3dfx_mode */ + +/* -------------------------- GLX_NV_float_buffer -------------------------- */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 + +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) + +#endif /* GLX_NV_float_buffer */ + +/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range 1 + +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); + +#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) +#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) + +#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) + +#endif /* GLX_NV_vertex_array_range */ + +/* -------------------------- GLX_OML_swap_method -------------------------- */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 + +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 + +#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) + +#endif /* GLX_OML_swap_method */ + +/* -------------------------- GLX_OML_sync_control ------------------------- */ + +#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include +#define GLX_OML_sync_control 1 + +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); + +#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) +#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) +#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) +#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) +#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) + +#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) + +#endif /* GLX_OML_sync_control */ + +/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 + +#define GLX_BLENDED_RGBA_SGIS 0x8025 + +#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) + +#endif /* GLX_SGIS_blended_overlay */ + +/* -------------------------- GLX_SGIS_color_range ------------------------- */ + +#ifndef GLX_SGIS_color_range +#define GLX_SGIS_color_range 1 + +#define GLX_MIN_RED_SGIS 0 +#define GLX_MAX_GREEN_SGIS 0 +#define GLX_MIN_BLUE_SGIS 0 +#define GLX_MAX_ALPHA_SGIS 0 +#define GLX_MIN_GREEN_SGIS 0 +#define GLX_MIN_ALPHA_SGIS 0 +#define GLX_MAX_RED_SGIS 0 +#define GLX_EXTENDED_RANGE_SGIS 0 +#define GLX_MAX_BLUE_SGIS 0 + +#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) + +#endif /* GLX_SGIS_color_range */ + +/* -------------------------- GLX_SGIS_multisample ------------------------- */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 + +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 + +#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) + +#endif /* GLX_SGIS_multisample */ + +/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 + +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 + +#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) + +#endif /* GLX_SGIS_shared_multisample */ + +/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 + +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_SCREEN_EXT 0x800C +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 + +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); + +#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) +#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) +#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) +#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) +#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) +#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) + +#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) + +#endif /* GLX_SGIX_fbconfig */ + +/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 + +typedef XID GLXPbufferSGIX; +typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; + +typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); +typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); + +#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) +#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) +#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) +#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) +#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) + +#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) + +#endif /* GLX_SGIX_pbuffer */ + +/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 + +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); + +#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) +#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) + +#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) + +#endif /* GLX_SGIX_swap_barrier */ + +/* -------------------------- GLX_SGIX_swap_group -------------------------- */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 + +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); + +#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) + +#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) + +#endif /* GLX_SGIX_swap_group */ + +/* ------------------------- GLX_SGIX_video_resize ------------------------- */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 + +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 + +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); + +#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) +#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) +#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) +#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) +#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) + +#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) + +#endif /* GLX_SGIX_video_resize */ + +/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 + +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 + +#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) + +#endif /* GLX_SGIX_visual_select_group */ + +/* ---------------------------- GLX_SGI_cushion ---------------------------- */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 + +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); + +#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) + +#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) + +#endif /* GLX_SGI_cushion */ + +/* ----------------------- GLX_SGI_make_current_read ----------------------- */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 + +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + +#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) +#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) + +#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) + +#endif /* GLX_SGI_make_current_read */ + +/* -------------------------- GLX_SGI_swap_control ------------------------- */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 + +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) + +#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) + +#endif /* GLX_SGI_swap_control */ + +/* --------------------------- GLX_SGI_video_sync -------------------------- */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); + +#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) +#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) + +#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) + +#endif /* GLX_SGI_video_sync */ + +/* --------------------- GLX_SUN_get_transparent_index --------------------- */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 + +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); + +#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) + +#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) + +#endif /* GLX_SUN_get_transparent_index */ + +/* -------------------------- GLX_SUN_video_resize ------------------------- */ + +#ifndef GLX_SUN_video_resize +#define GLX_SUN_video_resize 1 + +#define GLX_VIDEO_RESIZE_SUN 0x8171 +#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD + +typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); +typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); + +#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) +#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) + +#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define GLXEW_EXPORT +#else +#define GLXEW_EXPORT extern +#endif /* GLEW_MX */ + +extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +extern PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +#ifdef GLX_OML_sync_control +extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; +#endif + +extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; + +#if defined(GLEW_MX) +struct GLXEWContextStruct +{ +#endif /* GLEW_MX */ + +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize; + +#ifdef GLEW_MX +}; /* GLXEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------ */ + +#ifdef GLEW_MX + +typedef struct GLXEWContextStruct GLXEWContext; +extern GLenum glxewContextInit (GLXEWContext* ctx); +extern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name); + +#define glxewInit() glxewContextInit(glxewGetContext()) +#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) + +#define GLXEW_GET_VAR(x) glxewGetContext()->x +#define GLXEW_GET_FUN(x) x + +#else /* GLEW_MX */ + +#define GLXEW_GET_VAR(x) x +#define GLXEW_GET_FUN(x) x + +extern GLboolean glxewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +extern GLboolean glxewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff --git a/Glut/GL/wglew.h b/Glut/GL/wglew.h index 2cebfdfd5..895ab9cd1 100644 --- a/Glut/GL/wglew.h +++ b/Glut/GL/wglew.h @@ -1,958 +1,958 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2002-2006, Milan Ikits -** Copyright (C) 2002-2006, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef __wglew_h__ -#define __wglew_h__ -#define __WGLEW_H__ - -#ifdef __wglext_h_ -#error wglext.h included before wglew.h -#endif - -#define __wglext_h_ - -#if !defined(APIENTRY) && !defined(__CYGWIN__) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN 1 -# endif -#include -#endif - -/* - * GLEW_STATIC needs to be set when using the static version. - * GLEW_BUILD is set when building the DLL version. - */ -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* -------------------------- WGL_3DFX_multisample ------------------------- */ - -#ifndef WGL_3DFX_multisample -#define WGL_3DFX_multisample 1 - -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 - -#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) - -#endif /* WGL_3DFX_multisample */ - -/* ------------------------- WGL_3DL_stereo_control ------------------------ */ - -#ifndef WGL_3DL_stereo_control -#define WGL_3DL_stereo_control 1 - -#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 -#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 -#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 -#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 - -typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); - -#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) - -#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) - -#endif /* WGL_3DL_stereo_control */ - -/* ------------------------- WGL_ARB_buffer_region ------------------------- */ - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 - -#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 - -typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); - -#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) -#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) -#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) -#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) - -#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) - -#endif /* WGL_ARB_buffer_region */ - -/* ----------------------- WGL_ARB_extensions_string ----------------------- */ - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - -#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) - -#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) - -#endif /* WGL_ARB_extensions_string */ - -/* ----------------------- WGL_ARB_make_current_read ----------------------- */ - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) -#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) - -#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) - -#endif /* WGL_ARB_make_current_read */ - -/* -------------------------- WGL_ARB_multisample -------------------------- */ - -#ifndef WGL_ARB_multisample -#define WGL_ARB_multisample 1 - -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 - -#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) - -#endif /* WGL_ARB_multisample */ - -/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 - -DECLARE_HANDLE(HPBUFFERARB); - -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); - -#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) -#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) -#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) -#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) -#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) - -#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) - -#endif /* WGL_ARB_pbuffer */ - -/* -------------------------- WGL_ARB_pixel_format ------------------------- */ - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); - -#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) -#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) -#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) - -#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) - -#endif /* WGL_ARB_pixel_format */ - -/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ - -#ifndef WGL_ARB_pixel_format_float -#define WGL_ARB_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 - -#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) - -#endif /* WGL_ARB_pixel_format_float */ - -/* ------------------------- WGL_ARB_render_texture ------------------------ */ - -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 - -#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_MIPMAP_TEXTURE_ARB 0x2074 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 -#define WGL_TEXTURE_1D_ARB 0x2079 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_MIPMAP_LEVEL_ARB 0x207B -#define WGL_CUBE_MAP_FACE_ARB 0x207C -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 -#define WGL_FRONT_LEFT_ARB 0x2083 -#define WGL_FRONT_RIGHT_ARB 0x2084 -#define WGL_BACK_LEFT_ARB 0x2085 -#define WGL_BACK_RIGHT_ARB 0x2086 -#define WGL_AUX0_ARB 0x2087 -#define WGL_AUX1_ARB 0x2088 -#define WGL_AUX2_ARB 0x2089 -#define WGL_AUX3_ARB 0x208A -#define WGL_AUX4_ARB 0x208B -#define WGL_AUX5_ARB 0x208C -#define WGL_AUX6_ARB 0x208D -#define WGL_AUX7_ARB 0x208E -#define WGL_AUX8_ARB 0x208F -#define WGL_AUX9_ARB 0x2090 - -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); - -#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) -#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) -#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) - -#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) - -#endif /* WGL_ARB_render_texture */ - -/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ - -#ifndef WGL_ATI_pixel_format_float -#define WGL_ATI_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 -#define GL_RGBA_FLOAT_MODE_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 - -#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) - -#endif /* WGL_ATI_pixel_format_float */ - -/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ - -#ifndef WGL_ATI_render_texture_rectangle -#define WGL_ATI_render_texture_rectangle 1 - -#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 - -#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) - -#endif /* WGL_ATI_render_texture_rectangle */ - -/* -------------------------- WGL_EXT_depth_float -------------------------- */ - -#ifndef WGL_EXT_depth_float -#define WGL_EXT_depth_float 1 - -#define WGL_DEPTH_FLOAT_EXT 0x2040 - -#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) - -#endif /* WGL_EXT_depth_float */ - -/* ---------------------- WGL_EXT_display_color_table ---------------------- */ - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 - -typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); - -#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) -#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) -#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) -#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) - -#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) - -#endif /* WGL_EXT_display_color_table */ - -/* ----------------------- WGL_EXT_extensions_string ----------------------- */ - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); - -#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) - -#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) - -#endif /* WGL_EXT_extensions_string */ - -/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_EXT_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 - -#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) - -#endif /* WGL_EXT_framebuffer_sRGB */ - -/* ----------------------- WGL_EXT_make_current_read ----------------------- */ - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) -#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) - -#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) - -#endif /* WGL_EXT_make_current_read */ - -/* -------------------------- WGL_EXT_multisample -------------------------- */ - -#ifndef WGL_EXT_multisample -#define WGL_EXT_multisample 1 - -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 - -#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) - -#endif /* WGL_EXT_multisample */ - -/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_EXT 0x202D -#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WGL_PBUFFER_LARGEST_EXT 0x2033 -#define WGL_PBUFFER_WIDTH_EXT 0x2034 -#define WGL_PBUFFER_HEIGHT_EXT 0x2035 - -DECLARE_HANDLE(HPBUFFEREXT); - -typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); - -#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) -#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) -#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) -#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) -#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) - -#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) - -#endif /* WGL_EXT_pbuffer */ - -/* -------------------------- WGL_EXT_pixel_format ------------------------- */ - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); - -#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) -#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) -#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) - -#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) - -#endif /* WGL_EXT_pixel_format */ - -/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_EXT_pixel_format_packed_float 1 - -#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 - -#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) - -#endif /* WGL_EXT_pixel_format_packed_float */ - -/* -------------------------- WGL_EXT_swap_control ------------------------- */ - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 - -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); - -#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) -#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) - -#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) - -#endif /* WGL_EXT_swap_control */ - -/* --------------------- WGL_I3D_digital_video_control --------------------- */ - -#ifndef WGL_I3D_digital_video_control -#define WGL_I3D_digital_video_control 1 - -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 - -typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) -#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) - -#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) - -#endif /* WGL_I3D_digital_video_control */ - -/* ----------------------------- WGL_I3D_gamma ----------------------------- */ - -#ifndef WGL_I3D_gamma -#define WGL_I3D_gamma 1 - -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F - -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) -#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) -#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) -#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) - -#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) - -#endif /* WGL_I3D_gamma */ - -/* ---------------------------- WGL_I3D_genlock ---------------------------- */ - -#ifndef WGL_I3D_genlock -#define WGL_I3D_genlock 1 - -#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 -#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 -#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 -#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C - -typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); -typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); - -#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) -#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) -#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) -#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) -#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) -#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) -#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) -#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) -#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) -#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) -#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) -#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) - -#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) - -#endif /* WGL_I3D_genlock */ - -/* -------------------------- WGL_I3D_image_buffer ------------------------- */ - -#ifndef WGL_I3D_image_buffer -#define WGL_I3D_image_buffer 1 - -#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 -#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 - -typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); -typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); -typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); -typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); - -#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) -#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) -#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) -#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) - -#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) - -#endif /* WGL_I3D_image_buffer */ - -/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ - -#ifndef WGL_I3D_swap_frame_lock -#define WGL_I3D_swap_frame_lock 1 - -typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); - -#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) -#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) -#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) -#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) - -#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) - -#endif /* WGL_I3D_swap_frame_lock */ - -/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ - -#ifndef WGL_I3D_swap_frame_usage -#define WGL_I3D_swap_frame_usage 1 - -typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); - -#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) -#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) -#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) -#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) - -#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) - -#endif /* WGL_I3D_swap_frame_usage */ - -/* -------------------------- WGL_NV_float_buffer -------------------------- */ - -#ifndef WGL_NV_float_buffer -#define WGL_NV_float_buffer 1 - -#define WGL_FLOAT_COMPONENTS_NV 0x20B0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 -#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 -#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 -#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 -#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 - -#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) - -#endif /* WGL_NV_float_buffer */ - -/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ - -#ifndef WGL_NV_render_depth_texture -#define WGL_NV_render_depth_texture 1 - -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 - -#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) - -#endif /* WGL_NV_render_depth_texture */ - -/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_NV_render_texture_rectangle 1 - -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 -#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 - -#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) - -#endif /* WGL_NV_render_texture_rectangle */ - -/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ - -#ifndef WGL_NV_vertex_array_range -#define WGL_NV_vertex_array_range 1 - -typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); - -#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) -#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) - -#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) - -#endif /* WGL_NV_vertex_array_range */ - -/* -------------------------- WGL_OML_sync_control ------------------------- */ - -#ifndef WGL_OML_sync_control -#define WGL_OML_sync_control 1 - -typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); -typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); -typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); -typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); - -#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) -#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) -#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) -#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) -#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) -#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) - -#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -#ifdef GLEW_MX -#define WGLEW_EXPORT -#else -#define WGLEW_EXPORT GLEWAPI -#endif /* GLEW_MX */ - -#ifdef GLEW_MX -struct WGLEWContextStruct -{ -#endif /* GLEW_MX */ - -WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; - -WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; -WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; -WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; -WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; - -WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; - -WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; -WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; - -WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; -WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; -WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; -WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; -WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; - -WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; -WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; -WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; - -WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; -WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; -WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; - -WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; -WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; -WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; -WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; - -WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; - -WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; -WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; - -WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; -WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; -WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; -WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; -WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; - -WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; -WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; -WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; - -WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; -WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; - -WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; -WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; - -WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; -WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; -WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; -WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; - -WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; -WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; -WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; -WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; -WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; -WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; -WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; -WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; -WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; -WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; -WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; -WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; - -WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; -WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; -WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; -WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; - -WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; -WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; -WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; -WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; - -WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; -WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; -WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; -WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; - -WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; -WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; - -WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; -WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; -WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; -WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; -WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; -WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; -WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample; -WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control; -WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region; -WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string; -WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read; -WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample; -WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer; -WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format; -WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; -WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture; -WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; -WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; -WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float; -WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table; -WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string; -WGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; -WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read; -WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample; -WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer; -WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format; -WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; -WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control; -WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control; -WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma; -WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock; -WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer; -WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; -WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; -WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer; -WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture; -WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; -WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range; -WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control; - -#ifdef GLEW_MX -}; /* WGLEWContextStruct */ -#endif /* GLEW_MX */ - -/* ------------------------------------------------------------------------- */ - -#ifdef GLEW_MX - -typedef struct WGLEWContextStruct WGLEWContext; -GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx); -GLEWAPI GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name); - -#define wglewInit() wglewContextInit(wglewGetContext()) -#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) - -#define WGLEW_GET_VAR(x) wglewGetContext()->x -#define WGLEW_GET_FUN(x) wglewGetContext()->x - -#else /* GLEW_MX */ - -#define WGLEW_GET_VAR(x) x -#define WGLEW_GET_FUN(x) x - -GLEWAPI GLboolean wglewIsSupported (const char* name); - -#endif /* GLEW_MX */ - -GLEWAPI GLboolean wglewGetExtension (const char* name); - -#ifdef __cplusplus -} -#endif - -#undef GLEWAPI - -#endif /* __wglew_h__ */ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2006, Milan Ikits +** Copyright (C) 2002-2006, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __wglew_h__ +#define __wglew_h__ +#define __WGLEW_H__ + +#ifdef __wglext_h_ +#error wglext.h included before wglew.h +#endif + +#define __wglext_h_ + +#if !defined(APIENTRY) && !defined(__CYGWIN__) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +#include +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* -------------------------- WGL_3DFX_multisample ------------------------- */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 + +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 + +#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) + +#endif /* WGL_3DFX_multisample */ + +/* ------------------------- WGL_3DL_stereo_control ------------------------ */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 + +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 + +typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); + +#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) + +#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) + +#endif /* WGL_3DL_stereo_control */ + +/* ------------------------- WGL_ARB_buffer_region ------------------------- */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 + +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 + +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + +#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) +#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) +#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) +#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) + +#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) + +#endif /* WGL_ARB_buffer_region */ + +/* ----------------------- WGL_ARB_extensions_string ----------------------- */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + +#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) + +#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) + +#endif /* WGL_ARB_extensions_string */ + +/* ----------------------- WGL_ARB_make_current_read ----------------------- */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) +#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) + +#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) + +#endif /* WGL_ARB_make_current_read */ + +/* -------------------------- WGL_ARB_multisample -------------------------- */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) + +#endif /* WGL_ARB_multisample */ + +/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 + +DECLARE_HANDLE(HPBUFFERARB); + +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + +#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) +#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) +#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) +#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) +#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) + +#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) + +#endif /* WGL_ARB_pbuffer */ + +/* -------------------------- WGL_ARB_pixel_format ------------------------- */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); + +#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) +#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) +#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) + +#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) + +#endif /* WGL_ARB_pixel_format */ + +/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) + +#endif /* WGL_ARB_pixel_format_float */ + +/* ------------------------- WGL_ARB_render_texture ------------------------ */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 + +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 + +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); + +#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) +#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) +#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) + +#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) + +#endif /* WGL_ARB_render_texture */ + +/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + +#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) + +#endif /* WGL_ATI_pixel_format_float */ + +/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ + +#ifndef WGL_ATI_render_texture_rectangle +#define WGL_ATI_render_texture_rectangle 1 + +#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 + +#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) + +#endif /* WGL_ATI_render_texture_rectangle */ + +/* -------------------------- WGL_EXT_depth_float -------------------------- */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 + +#define WGL_DEPTH_FLOAT_EXT 0x2040 + +#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) + +#endif /* WGL_EXT_depth_float */ + +/* ---------------------- WGL_EXT_display_color_table ---------------------- */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 + +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); + +#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) +#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) + +#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) + +#endif /* WGL_EXT_display_color_table */ + +/* ----------------------- WGL_EXT_extensions_string ----------------------- */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); + +#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) + +#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) + +#endif /* WGL_EXT_extensions_string */ + +/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 + +#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) + +#endif /* WGL_EXT_framebuffer_sRGB */ + +/* ----------------------- WGL_EXT_make_current_read ----------------------- */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) +#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) + +#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) + +#endif /* WGL_EXT_make_current_read */ + +/* -------------------------- WGL_EXT_multisample -------------------------- */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 + +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 + +#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) + +#endif /* WGL_EXT_multisample */ + +/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 + +DECLARE_HANDLE(HPBUFFEREXT); + +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + +#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) +#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) +#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) +#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) +#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) + +#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) + +#endif /* WGL_EXT_pbuffer */ + +/* -------------------------- WGL_EXT_pixel_format ------------------------- */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); + +#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) +#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) +#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) + +#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) + +#endif /* WGL_EXT_pixel_format */ + +/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) + +#endif /* WGL_EXT_pixel_format_packed_float */ + +/* -------------------------- WGL_EXT_swap_control ------------------------- */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 + +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); + +#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) +#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) + +#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) + +#endif /* WGL_EXT_swap_control */ + +/* --------------------- WGL_I3D_digital_video_control --------------------- */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 + +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 + +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) + +#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) + +#endif /* WGL_I3D_digital_video_control */ + +/* ----------------------------- WGL_I3D_gamma ----------------------------- */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 + +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F + +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) +#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) +#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) +#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) + +#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) + +#endif /* WGL_I3D_gamma */ + +/* ---------------------------- WGL_I3D_genlock ---------------------------- */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 + +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C + +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); + +#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) +#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) +#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) +#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) +#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) +#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) +#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) +#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) +#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) +#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) +#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) + +#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) + +#endif /* WGL_I3D_genlock */ + +/* -------------------------- WGL_I3D_image_buffer ------------------------- */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 + +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 + +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); + +#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) +#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) +#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) +#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) + +#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) + +#endif /* WGL_I3D_image_buffer */ + +/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 + +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); + +#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) +#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) +#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) + +#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) + +#endif /* WGL_I3D_swap_frame_lock */ + +/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 + +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); + +#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) +#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) +#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) + +#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) + +#endif /* WGL_I3D_swap_frame_usage */ + +/* -------------------------- WGL_NV_float_buffer -------------------------- */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 + +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 + +#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) + +#endif /* WGL_NV_float_buffer */ + +/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 + +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 + +#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) + +#endif /* WGL_NV_render_depth_texture */ + +/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 + +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 + +#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) + +#endif /* WGL_NV_render_texture_rectangle */ + +/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 + +typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); + +#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) +#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) + +#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) + +#endif /* WGL_NV_vertex_array_range */ + +/* -------------------------- WGL_OML_sync_control ------------------------- */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 + +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); + +#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) +#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) +#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) +#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) +#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) + +#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define WGLEW_EXPORT +#else +#define WGLEW_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#ifdef GLEW_MX +struct WGLEWContextStruct +{ +#endif /* GLEW_MX */ + +WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control; + +#ifdef GLEW_MX +}; /* WGLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX + +typedef struct WGLEWContextStruct WGLEWContext; +GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx); +GLEWAPI GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name); + +#define wglewInit() wglewContextInit(wglewGetContext()) +#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) + +#define WGLEW_GET_VAR(x) wglewGetContext()->x +#define WGLEW_GET_FUN(x) wglewGetContext()->x + +#else /* GLEW_MX */ + +#define WGLEW_GET_VAR(x) x +#define WGLEW_GET_FUN(x) x + +GLEWAPI GLboolean wglewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean wglewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/INSTALL b/INSTALL index 48c8cfa14..ea37dcfc4 100644 --- a/INSTALL +++ b/INSTALL @@ -1,105 +1,105 @@ -Bullet Collision Detection and Physics Library - -** Windows Compilation ** - -Use CMake to autogenerate a build system for Windows: - - - Download/install CMake from www.cmake.org or package manager - - List available build systems by running 'cmake' in the Bullet root folder - - Create a build system using the -G option for example: - - cmake . -G "Visual Studio 9 2008" or - cmake . -G "Visual Studio 9 2008 Win64" - - -** Linux Compilation ** - - - Download/install CMake from www.cmake.org or package manager - CMake is like autoconf in that it will create build scripts which are then - used for the actual compilation - - - List available build systems by running 'cmake' in the Bullet root folder - - Create a build system using the -G option for example: - - cmake . -G "Unix Makefiles" - - - There are some options for cmake builds: - BUILD_SHARED_LIBS: default 'OFF', set to 'ON' to build .so libraries - BUILD_EXTRAS: default 'ON', compiles additional libraries in 'Extras' - BUILD_DEMOS: default 'ON', compiles applications found in 'Demos' - CMAKE_INSTALL_PREFIX: default '/usr/local', the installation path. - CMAKE_INSTALL_RPATH: if you install outside a standard ld search path, - then you should set this to the installation lib path. - CMAKE_BUILD_TYPE: default 'Release', can include debug symbols with - either 'Debug' or 'RelWithDebInfo'. - Other options may be discovered by 'cmake --help-variable-list' and - 'cmake --help-variable OPTION' - - - Run 'cmake' with desired options of the form -DOPTION=VALUE - By default this will create the usual Makefile build system, but CMake can - also produce Eclipse or KDevelop project files. See 'cmake --help' to see - what "generators" are available in your environment, selected via '-G'. - For example: - cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebugInfo - - - Assuming using the default Makefile output from cmake, run 'make' to - build, and then 'make install' if you wish to install. - - -** Mac OS X Compilation ** - - - Download/install CMake from www.cmake.org or package manager - CMake is like autoconf in that it will create build scripts which are then - used for the actual compilation - - - List available build systems by running 'cmake' in the Bullet root folder - - Create a build system using the -G option for example: - - cmake . -G Xcode - cmake . -G "Unix Makefiles" - - - There are some options for cmake builds: - BUILD_SHARED_LIBS: default 'OFF', set to 'ON' to build .dylib libraries - BUILD_EXTRAS: default 'ON', compiles additional libraries in 'Extras' - BUILD_DEMOS: default 'ON', compiles applications found in 'Demos' - CMAKE_INSTALL_PREFIX: default '/usr/local', the installation path. - CMAKE_INSTALL_NAME_DIR: if you install outside a standard ld search - path, then you should set this to the installation lib/framework path. - CMAKE_OSX_ARCHITECTURES: defaults to the native architecture, but can be - set to a semicolon separated list for fat binaries, e.g. ppc;i386;x86_64 - CMAKE_BUILD_TYPE: default 'Release', can include debug symbols with - either 'Debug' or 'RelWithDebInfo'. - - To build framework bundles: - FRAMEWORK: default 'OFF', also requires 'BUILD_SHARED_LIBS' set ON - If both FRAMEWORK and BUILD_SHARED_LIBS are set, will create - OS X style Framework Bundles which can be placed in - linked via the -framework gcc argument or drag into Xcode projects. - (If not framework, then UNIX style 'include' and 'lib' will be produced) - - Other options may be discovered by 'cmake --help-variable-list' and - 'cmake --help-variable OPTION' - - - Run 'cmake' with desired options of the form -DOPTION=VALUE - By default this will create the usual Makefile build system, but CMake can - also produce Eclipse or KDevelop project files. See 'cmake --help' to see - what "generators" are available in your environment, selected via '-G'. - For example: - cmake -DBUILD_SHARED_LIBS=ON -DFRAMEWORK=ON \ - -DCMAKE_INSTALL_PREFIX=/Library/Frameworks \ - -DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks \ - -DCMAKE_OSX_ARCHITECTURES='ppc;i386;x86_64' \ - -DCMAKE_BUILD_TYPE=RelWithDebugInfo - - - Assuming using the default Makefile output from cmake, run 'make' to build - and then 'make install'. - - -** Alternative Mac OS X and Linux via autoconf/make ** - - at the command line: - ./autogen.sh - ./configure - make - - -** For more help, visit http://www.bulletphysics.org ** +Bullet Collision Detection and Physics Library + +** Windows Compilation ** + +Use CMake to autogenerate a build system for Windows: + + - Download/install CMake from www.cmake.org or package manager + - List available build systems by running 'cmake' in the Bullet root folder + - Create a build system using the -G option for example: + + cmake . -G "Visual Studio 9 2008" or + cmake . -G "Visual Studio 9 2008 Win64" + + +** Linux Compilation ** + + - Download/install CMake from www.cmake.org or package manager + CMake is like autoconf in that it will create build scripts which are then + used for the actual compilation + + - List available build systems by running 'cmake' in the Bullet root folder + - Create a build system using the -G option for example: + + cmake . -G "Unix Makefiles" + + - There are some options for cmake builds: + BUILD_SHARED_LIBS: default 'OFF', set to 'ON' to build .so libraries + BUILD_EXTRAS: default 'ON', compiles additional libraries in 'Extras' + BUILD_DEMOS: default 'ON', compiles applications found in 'Demos' + CMAKE_INSTALL_PREFIX: default '/usr/local', the installation path. + CMAKE_INSTALL_RPATH: if you install outside a standard ld search path, + then you should set this to the installation lib path. + CMAKE_BUILD_TYPE: default 'Release', can include debug symbols with + either 'Debug' or 'RelWithDebInfo'. + Other options may be discovered by 'cmake --help-variable-list' and + 'cmake --help-variable OPTION' + + - Run 'cmake' with desired options of the form -DOPTION=VALUE + By default this will create the usual Makefile build system, but CMake can + also produce Eclipse or KDevelop project files. See 'cmake --help' to see + what "generators" are available in your environment, selected via '-G'. + For example: + cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebugInfo + + - Assuming using the default Makefile output from cmake, run 'make' to + build, and then 'make install' if you wish to install. + + +** Mac OS X Compilation ** + + - Download/install CMake from www.cmake.org or package manager + CMake is like autoconf in that it will create build scripts which are then + used for the actual compilation + + - List available build systems by running 'cmake' in the Bullet root folder + - Create a build system using the -G option for example: + + cmake . -G Xcode + cmake . -G "Unix Makefiles" + + - There are some options for cmake builds: + BUILD_SHARED_LIBS: default 'OFF', set to 'ON' to build .dylib libraries + BUILD_EXTRAS: default 'ON', compiles additional libraries in 'Extras' + BUILD_DEMOS: default 'ON', compiles applications found in 'Demos' + CMAKE_INSTALL_PREFIX: default '/usr/local', the installation path. + CMAKE_INSTALL_NAME_DIR: if you install outside a standard ld search + path, then you should set this to the installation lib/framework path. + CMAKE_OSX_ARCHITECTURES: defaults to the native architecture, but can be + set to a semicolon separated list for fat binaries, e.g. ppc;i386;x86_64 + CMAKE_BUILD_TYPE: default 'Release', can include debug symbols with + either 'Debug' or 'RelWithDebInfo'. + + To build framework bundles: + FRAMEWORK: default 'OFF', also requires 'BUILD_SHARED_LIBS' set ON + If both FRAMEWORK and BUILD_SHARED_LIBS are set, will create + OS X style Framework Bundles which can be placed in + linked via the -framework gcc argument or drag into Xcode projects. + (If not framework, then UNIX style 'include' and 'lib' will be produced) + + Other options may be discovered by 'cmake --help-variable-list' and + 'cmake --help-variable OPTION' + + - Run 'cmake' with desired options of the form -DOPTION=VALUE + By default this will create the usual Makefile build system, but CMake can + also produce Eclipse or KDevelop project files. See 'cmake --help' to see + what "generators" are available in your environment, selected via '-G'. + For example: + cmake -DBUILD_SHARED_LIBS=ON -DFRAMEWORK=ON \ + -DCMAKE_INSTALL_PREFIX=/Library/Frameworks \ + -DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks \ + -DCMAKE_OSX_ARCHITECTURES='ppc;i386;x86_64' \ + -DCMAKE_BUILD_TYPE=RelWithDebugInfo + + - Assuming using the default Makefile output from cmake, run 'make' to build + and then 'make install'. + + +** Alternative Mac OS X and Linux via autoconf/make ** + - at the command line: + ./autogen.sh + ./configure + make + + +** For more help, visit http://www.bulletphysics.org ** diff --git a/RELEASING.TXT b/RELEASING.TXT index b4fba9d50..8fba4a5a8 100644 --- a/RELEASING.TXT +++ b/RELEASING.TXT @@ -1,34 +1,34 @@ -This document details the steps necessary to package a release of Bullet. - -1) Preparing for release: - -update VERSION in several places -update ChangeLog -regenerate MSVC project files - -2) Generating the release .zip: -Do an SVN export on a Windows machine into the directory: bullet-X.YY -prepare a zip file containing the directory - -3) Generating the release .tar.gz: -Do an SVN export on a Unix machine into the directory: bullet-X.YY -prepare a .tar.gz file containing the directory - -4) Uploading release to google code: - -Google Code Bullet downloads URL: http://code.google.com/p/bullet/downloads/list - -Title of release should follow this guide line: Bullet Physics SDK (revision) - -It is better to upload the .tar.gz before the .zip so that the .zip appears first in the list - -If the release is an Alpha/Beta or RC the tags should be: Type-Source, OpSys-ALL -If the release is a final release the tags should be: Type-Source, OpSys-ALL, Featured - -5) Obsoleting old releases - -Edit the tags on old releases and add the 'Deprecated' tag - -6) Announcing final releases: - -Final release announcements are done here: http://bulletphysics.com/Bullet/phpBB3/viewforum.php?f=18 +This document details the steps necessary to package a release of Bullet. + +1) Preparing for release: + +update VERSION in several places +update ChangeLog +regenerate MSVC project files + +2) Generating the release .zip: +Do an SVN export on a Windows machine into the directory: bullet-X.YY +prepare a zip file containing the directory + +3) Generating the release .tar.gz: +Do an SVN export on a Unix machine into the directory: bullet-X.YY +prepare a .tar.gz file containing the directory + +4) Uploading release to google code: + +Google Code Bullet downloads URL: http://code.google.com/p/bullet/downloads/list + +Title of release should follow this guide line: Bullet Physics SDK (revision) + +It is better to upload the .tar.gz before the .zip so that the .zip appears first in the list + +If the release is an Alpha/Beta or RC the tags should be: Type-Source, OpSys-ALL +If the release is a final release the tags should be: Type-Source, OpSys-ALL, Featured + +5) Obsoleting old releases + +Edit the tags on old releases and add the 'Deprecated' tag + +6) Announcing final releases: + +Final release announcements are done here: http://bulletphysics.com/Bullet/phpBB3/viewforum.php?f=18 diff --git a/acinclude.m4 b/acinclude.m4 index 6dd5738eb..0505895ce 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,3054 +1,3054 @@ -# checkbuild.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_SPLIT_TUPLE(TUPLE, OUTPUT-VARIABLES) -# Split a build-tuple into its component parts. A build tuple is -# constructed by CS_CREATE_TUPLE() and is comprised of compiler flags, -# linker flags, and library references. OUTPUT-VARIABLES is a -# comma-delimited list of shell variables which should receive the -# extracted compiler flags, linker flags, and library references, -# respectively. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_SPLIT_TUPLE], - [CS_SPLIT([$1], [cs_dummy,$2], [@]) - m4_map([_CS_SPLIT_TUPLE], [$2])]) - -AC_DEFUN([_CS_SPLIT_TUPLE], - [$1=`echo $$1 | sed 'y%@%:@% %'` - ]) - - - -#------------------------------------------------------------------------------ -# CS_CREATE_TUPLE([CFLAGS], [LFLAGS], [LIBS]) -# Construct a build-tuple which is comprised of compiler flags, linker -# flags, and library references. Build tuples are encoded so as to -# preserve whitespace in each component. This makes it possible for -# macros (such as CS_BUILD_IFELSE) which employ build tuples to accept -# whitespace-delimited lists of tuples, and for shell "for" statements to -# iterate over tuple lists without compromising whitespace embedded -# within individual flags or library references. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CREATE_TUPLE], [`echo @$1@$2@$3 | sed 'y% %@%:@%'`]) - - - -#------------------------------------------------------------------------------ -# CS_LANG_CFLAGS -# Return the literal string CFLAGS if the current language is C. Return -# the literal string CXXFLAGS if the current language is C++. Generic -# compiler test macros which need to modify or save the compiler flags -# can invoke this macro to get the name of the compiler flags environment -# variable (either CFLAGS or CXXFLAGS) depending upon the current -# language. For example: -# CS_LANG_CFLAGS="$CS_LANG_CFLAGS -Wall" -# With C, this expands to: -# CFLAGS="$CFLAGS -Wall" -# With C++, it expands to: -# CXXFLAGS="$CXXFLAGS -Wall" -#------------------------------------------------------------------------------ -AC_DEFUN([CS_LANG_CFLAGS], [AC_LANG_CASE([C], [CFLAGS], [C++], [CXXFLAGS])]) - - - -#------------------------------------------------------------------------------ -# CS_BUILD_IFELSE([PROGRAM], [FLAGS], [LANGUAGE], [ACTION-IF-BUILT], -# [ACTION-IF-NOT-BUILT], [OTHER-CFLAGS], [OTHER-LFLAGS], -# [OTHER-LIBS], [INHIBIT-OTHER-FLAGS], [ERROR-REGEX]) -# Try building a program using the supplied compiler flags, linker flags, -# and library references. PROGRAM is typically a program composed via -# AC_LANG_PROGRAM(). PROGRAM may be omitted if you are interested only -# in learning if the compiler or linker respects certain flags. LANGUAGE -# is typically either C or C++ and specifies which compiler to use for -# the test. If LANGUAGE is omitted, C is used. FLAGS is a whitespace -# delimited list of build tuples. Tuples are created with -# CS_CREATE_TUPLE() and are composed of up to three elements each. The -# first element represents compiler flags, the second linker flags, and -# the third libraries used when linking the program. Each tuple from -# FLAGS is attempted in order. If you want a build attempted with no -# special flags prior to builds with specialized flags, create an empty -# tuple with CS_CREATE_TUPLE() at the start of the FLAGS list. If the -# build is successful, then the shell variables cs_build_ok is set to -# "yes", cs_build_cflags, cs_build_lflags, and cs_build_libs are set to -# the tuple elements which resulted in the successful build, and -# ACTION-IF-BUILT is invoked. Upon successful build, no further tuples -# are consulted. If no tuple results in a successful build, then -# cs_build_ok is set to "no" and ACTION-IF-NOT-BUILT is invoked. -# OTHER-CFLAGS, OTHER-LFLAGS, and OTHER-LIBS specify additional compiler -# flags, linker flags, and libraries which should be used with each tuple -# build attempt. Upon successful build, these additional flags are also -# reflected in the variables cs_build_cflags, cs_build_lflags, and -# cs_build_libs unless INHIBIT-OTHER-FLAGS is a non-empty string. The -# optional ERROR-REGEX places an additional constraint upon the build -# check. If specified, ERROR-REGEX, which is a standard `grep' regular -# expression, is applied to output captured from the compiler and linker. -# If ERROR-REGEX matches, then the build is deemed a failure, and -# cs_build_ok is set to "no". This facility is useful for broken build -# tools which emit an error message yet still return success as a result. -# In such cases, it should be possible to detect the failure by scanning -# the tools' output. -# -# IMPLEMENTATION NOTES -# -# In Autoconf 2.57 and earlier, AC_LINK_IFELSE() invokes AC_TRY_EVAL(), -# which does not provide access to the captured output. To work around -# this limitation, we temporarily re-define AC_TRY_EVAL() as -# _AC_EVAL_STDERR(), which leaves the captured output in conftest.err -# (which we must also delete). In Autoconf 2.58, however, -# AC_LINK_IFELSE() instead already invokes _AC_EVAL_STDERR() on our -# behalf, however we must be careful to apply ERROR-REGEX within the -# invocation AC_LINK_IFELSE(), since AC_LINK_IFELSE() deletes -# conftest.err before it returns. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_BUILD_IFELSE], - [AC_LANG_PUSH(m4_default([$3],[C])) - cs_cflags_save="$CS_LANG_CFLAGS" - cs_lflags_save="$LDFLAGS" - cs_libs_save="$LIBS" - cs_build_ok=no - m4_ifval([$10], [m4_pushdef([AC_TRY_EVAL], [_AC_EVAL_STDERR]($$[1]))]) - - for cs_build_item in m4_default([$2],[CS_CREATE_TUPLE()]) - do - CS_SPLIT_TUPLE( - [$cs_build_item],[cs_cflags_test,cs_lflags_test,cs_libs_test]) - CS_LANG_CFLAGS="$cs_cflags_test $6 $cs_cflags_save" - LDFLAGS="$cs_lflags_test $7 $cs_lflags_save" - LIBS="$cs_libs_test $8 $cs_libs_save" - AC_LINK_IFELSE(m4_default([$1], [AC_LANG_PROGRAM([],[])]), - [m4_ifval([$10], - [AS_IF([AC_TRY_COMMAND( - [grep "AS_ESCAPE([$10])" conftest.err >/dev/null 2>&1])], - [cs_build_ok=no], [cs_build_ok=yes])], - [cs_build_ok=yes])]) - AS_IF([test $cs_build_ok = yes], [break]) - done - - m4_ifval([$10], [m4_popdef([AC_TRY_EVAL]) rm -f conftest.err]) - CS_LANG_CFLAGS=$cs_cflags_save - LDFLAGS=$cs_lflags_save - LIBS=$cs_libs_save - AC_LANG_POP(m4_default([$3],[C])) - - AS_IF([test $cs_build_ok = yes], - [cs_build_cflags=CS_TRIM([$cs_cflags_test[]m4_ifval([$9],[],[ $6])]) - cs_build_lflags=CS_TRIM([$cs_lflags_test[]m4_ifval([$9],[],[ $7])]) - cs_build_libs=CS_TRIM([$cs_libs_test[]m4_ifval([$9],[],[ $8])]) - $4], - [$5])]) - - - -#------------------------------------------------------------------------------ -# CS_CHECK_BUILD(MESSAGE, CACHE-VAR, [PROGRAM], [FLAGS], [LANGUAGE], -# [ACTION-IF-BUILT], [ACTION-IF-NOT-BUILT], [IGNORE-CACHE], -# [OTHER-CFLAGS], [OTHER-LFLAGS], [OTHER-LIBS], -# [INHIBIT-OTHER-FLAGS], [ERROR-REGEX]) -# Like CS_BUILD_IFELSE() but also prints "checking" and result messages, -# and optionally respects the cache. Sets CACHE-VAR to "yes" upon -# success, else "no" upon failure. Additionally, sets CACHE-VAR_cflags, -# CACHE-VAR_lflags, and CACHE-VAR_libs to the values which resulted in a -# successful build. If IGNORE-CACHE is "yes", then the cache variables -# are ignored upon entry to this macro, however they are still set to -# appropriate values upon exit. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_BUILD], - [AS_IF([test "$8" != yes], - [AC_CACHE_CHECK([$1], [$2], - [CS_BUILD_IFELSE([$3], [$4], [$5], - [$2=yes - $2_cflags=$cs_build_cflags - $2_lflags=$cs_build_lflags - $2_libs=$cs_build_libs], - [$2=no], [$9], [$10], [$11], [$12], [$13])])], - [AC_MSG_CHECKING([$1]) - CS_BUILD_IFELSE([$3], [$4], [$5], - [$2=yes - $2_cflags=$cs_build_cflags - $2_lflags=$cs_build_lflags - $2_libs=$cs_build_libs], - [$2=no], [$9], [$10], [$11], [$12], [$13]) - AC_MSG_RESULT([$$2])]) - AS_IF([test $$2 = yes], [$6], - [$2_cflags='' - $2_lflags='' - $2_libs='' - $7])]) - - - -#------------------------------------------------------------------------------ -# CS_CHECK_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE], -# [ACTION-IF-RECOGNIZED], [ACTION-IF-NOT-RECOGNIZED], -# [OTHER-CFLAGS], [OTHER-LFLAGS], [OTHER-LIBS], -# [ERROR-REGEX]) -# Like CS_CHECK_BUILD(), but checks only if the compiler or linker -# recognizes a command-line option or options. MESSAGE is the "checking" -# message. CACHE-VAR is the shell cache variable which receives the flag -# or flags recognized by the compiler or linker. FLAGS is a -# whitespace-delimited list of build tuples created with -# CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in order until -# one is found which is recognized by the compiler. After that, no -# further flags are checked. LANGUAGE is typically either C or C++ and -# specifies which compiler to use for the test. If LANGUAGE is omitted, -# C is used. If a command-line option is recognized, then CACHE-VAR is -# set to the composite value of $cs_build_cflags, $cs_build_lflags, and -# $cs_build_libs of the FLAGS element which succeeded (not including the -# "other" flags) and ACTION-IF-RECOGNIZED is invoked. If no options are -# recognized, then CACHE-VAR is set to the empty string, and -# ACTION-IF-NOT-RECOGNIZED is invoked. As a convenience, in case -# comparing CACHE-VAR against the empty string to test for failure is -# undesirable, a second variable named CACHE-VAR_ok is set to the literal -# "no" upon failure, and to the same value as CACHE-VAR upon success. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_BUILD_FLAGS], - [AC_CACHE_CHECK([$1], [$2_ok], - [CS_BUILD_IFELSE([], [$3], [$4], - [$2=CS_TRIM([$cs_build_cflags $cs_build_lflags $cs_build_libs]) - $2_ok="$$2"], - [$2='' - $2_ok=no], [$7], [$8], [$9], [Y], [$10])]) - AS_IF([test "$$2_ok" != no], [$5], [$6])]) -#============================================================================== -# Copyright (C)2003-2006 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_COMMON_TOOLS_LINK -# Checks for common tools related to linking. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_COMMON_TOOLS_LINK], - [ - # The default RANLIB in Jambase is wrong on some platforms, and is also - # unsuitable during cross-compilation, so we set the value unconditionally - # (sixth argument of CS_EMIT_BUILD_PROPERTY). - AC_PROG_RANLIB - CS_EMIT_BUILD_PROPERTY([RANLIB], [$RANLIB], [], [], [], [Y]) - - CS_CHECK_TOOLS([DLLTOOL], [dlltool]) - CS_EMIT_BUILD_PROPERTY([CMD.DLLTOOL], [$DLLTOOL]) - - CS_CHECK_TOOLS([DLLWRAP], [dllwrap]) - CS_EMIT_BUILD_PROPERTY([CMD.DLLWRAP], [$DLLWRAP]) - - CS_CHECK_TOOLS([WINDRES], [windres]) - CS_EMIT_BUILD_PROPERTY([CMD.WINDRES], [$WINDRES]) - - CS_CHECK_TOOLS([STRINGS], [strings]) - CS_EMIT_BUILD_PROPERTY([CMD.STRINGS], [$STRINGS]) - - CS_CHECK_TOOLS([OBJCOPY], [objcopy]) - CS_EMIT_BUILD_PROPERTY([CMD.OBJCOPY], [$OBJCOPY]) - - CS_CHECK_LIBTOOL - CS_EMIT_BUILD_PROPERTY([LIBTOOL], [$LIBTOOL]) - CS_EMIT_BUILD_PROPERTY([APPLE_LIBTOOL], [$APPLE_LIBTOOL]) - ]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_COMMON_TOOLS_BASIC -# Checks for basic tools for building things. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_COMMON_TOOLS_BASIC], - [CS_CHECK_MKDIR - CS_EMIT_BUILD_PROPERTY([CMD.MKDIR], [$MKDIR]) - CS_EMIT_BUILD_PROPERTY([CMD.MKDIRS], [$MKDIRS]) - - CS_CHECK_PROGS([INSTALL], [install]) - CS_EMIT_BUILD_PROPERTY([INSTALL], [$INSTALL])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_COMMON_TOOLS_DOC_TEXINFO -# Checks for tools to generate documentation from texinfo files. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_COMMON_TOOLS_DOC_TEXINFO], - [CS_CHECK_PROGS([TEXI2DVI], [texi2dvi]) - CS_EMIT_BUILD_PROPERTY([CMD.TEXI2DVI], [$TEXI2DVI]) - - CS_CHECK_PROGS([TEXI2PDF], [texi2pdf]) - CS_EMIT_BUILD_PROPERTY([CMD.TEXI2PDF], [$TEXI2PDF]) - - CS_CHECK_PROGS([DVIPS], [dvips]) - CS_EMIT_BUILD_PROPERTY([CMD.DVIPS], [$DVIPS]) - - CS_CHECK_PROGS([DVIPDF], [dvipdf]) - CS_EMIT_BUILD_PROPERTY([CMD.DVIPDF], [$DVIPDF]) - - CS_CHECK_PROGS([MAKEINFO], [makeinfo]) - CS_EMIT_BUILD_PROPERTY([CMD.MAKEINFO], [$MAKEINFO])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_COMMON_TOOLS_DOC_DOXYGEN -# Checks for tools to generate source documentation via doxygen. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_COMMON_TOOLS_DOC_DOXYGEN], - [CS_CHECK_PROGS([DOXYGEN], [doxygen]) - CS_EMIT_BUILD_PROPERTY([CMD.DOXYGEN], [$DOXYGEN]) - - CS_CHECK_TOOLS([DOT], [dot]) - CS_EMIT_BUILD_PROPERTY([CMD.DOT], [$DOT])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_COMMON_LIBS -# Check for typical required libraries (libm, libmx, libdl, libnsl). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_COMMON_LIBS], - [AC_LANG_PUSH([C]) - AC_CHECK_LIB([m], [pow], [cs_cv_libm_libs=-lm], [cs_cv_libm_libs=]) - AC_CHECK_LIB([m], [cosf], [cs_cv_libm_libs=-lm]) - AC_CHECK_LIB([mx], [cosf]) - AC_CHECK_LIB([dl], [dlopen], [cs_cv_libdl_libs=-ldl], [cs_cv_libdl_libs=]) - AC_CHECK_LIB([nsl], [gethostbyname]) - AC_LANG_POP([C])]) -# checkcppunit.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_CPPUNIT([EMITTER]) -# Check if CppUnit (http://cppunit.sourceforge.net/), the unit-testing -# framework is available. The shell variable cs_cv_libcppunit is set to -# "yes" if CppUnit is discovered, else "no". If available, then the -# variables cs_cv_libcppunit_cflags, cs_cv_libcppunit_lflags, and -# cs_cv_libcppunit_libs are set. If EMITTER is provided, then -# CS_EMIT_BUILD_RESULT() is invoked with EMITTER in order to record the -# results in an output file. As a convenience, if EMITTER is the literal -# value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s default emitter -# will be used. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_CPPUNIT], - [CS_CHECK_LIB_WITH([cppunit], - [AC_LANG_PROGRAM([[#include ]], - [CppUnit::TextUi::TestRunner r; r.run();])], - [], [C++]) - - AS_IF([test $cs_cv_libcppunit = yes], - [CS_CHECK_BUILD([if cppunit is sufficiently recent], - [cs_cv_libcppunit_recent], - [AC_LANG_PROGRAM( - [[#include ]], - [CppUnit::BriefTestProgressListener b; b.startTest(0);])], - [], [C++], - [CS_EMIT_BUILD_RESULT([cs_cv_libcppunit], [CPPUNIT], - CS_EMITTER_OPTIONAL([$1]))], [], [], - [$cs_cv_libcppunit_cflags], - [$cs_cv_libcppunit_lflags], - [$cs_cv_libcppunit_libs])])]) -# checklib.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003-2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# cs_lib_paths_default -# Whitespace delimited list of directory tuples in which to search, by -# default, for external libraries. Each list item can specify an -# include|library directory tuple (for example, "/usr/include|/usr/lib"), -# or a single directory (for example, "/usr"). If the second form is -# used, then "include" and "lib" subdirectories of the directory are -# searched. If the library resources are not found, then the directory -# itself is searched. Thus, "/proj" is shorthand for -# "/proj/include|/proj/lib /proj|/proj". -# -# Present Cases: -# /usr/local -- Not all compilers search here by default, so we specify -# it manually. -# /sw -- Fink, the MacOS/X manager of Unix packages, installs here by -# default. -# /opt/local -- DarwinPorts installs here by default. -#------------------------------------------------------------------------------ -m4_define([cs_lib_paths_default], - [/usr/local/include|/usr/local/lib \ - /sw/include|/sw/lib \ - /opt/local/include|/opt/local/lib \ - /opt/include|/opt/lib]) - - - -#------------------------------------------------------------------------------ -# cs_pkg_paths_default -# Comma delimited list of additional directories in which the -# `pkg-config' command should search for its `.pc' files. -# -# Present Cases: -# /usr/local/lib/pkgconfig -- Although a common location for .pc files -# installed by "make install", many `pkg-config' commands neglect -# to search here automatically. -# /sw/lib/pkgconfig -- Fink, the MacOS/X manager of Unix packages, -# installs .pc files here by default. -# /opt/local/lib/pkgconfig -- DarwinPorts installs .pc files here by -# default. -#------------------------------------------------------------------------------ -m4_define([cs_pkg_paths_default], - [/usr/local/lib/pkgconfig, - /sw/lib/pkgconfig, - /opt/local/lib/pkgconfig, - /opt/lib/pkgconfig]) - - - -#------------------------------------------------------------------------------ -# CS_CHECK_LIB_WITH(LIBRARY, PROGRAM, [SEARCH-LIST], [LANGUAGE], -# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [OTHER-CFLAGS], -# [OTHER-LFLAGS], [OTHER-LIBS], [ALIASES]) -# Very roughly similar in concept to AC_CHECK_LIB(), but allows caller to -# to provide list of directories in which to search for LIBRARY; allows -# user to override library location via --with-LIBRARY=dir; and consults -# `pkg-config' (if present) and `LIBRARY-config' (if present, i.e. -# `sdl-config') in order to obtain compiler and linker flags. LIBRARY is -# the name of the library or MacOS/X framework which is to be located -# (for example, "readline" for `libreadline.a' or `readline.framework'). -# PROGRAM, which is typically composed with AC_LANG_PROGRAM(), is a -# program which references at least one function or symbol in LIBRARY. -# SEARCH-LIST is a whitespace-delimited list of paths in which to search -# for the library and its header files, in addition to those searched by -# the compiler and linker by default, and those referenced by the -# cs_lib_paths_default macro. Each list item can specify an -# `include|library' directory tuple (for example, -# "/usr/include|/usr/lib"), or a single directory (for example, "/usr"). -# If the second form is used, then "include" and "lib" subdirectories of -# the directory are searched. If the library resources are not found, -# then the directory itself is searched. Thus, "/proj" is shorthand for -# "/proj/include|/proj/lib /proj|/proj". Items in the search list can -# include wildcards. SEARCH-LIST can be overridden by the user with the -# --with-LIBRARY=dir option, in which case only "dir/include|dir/lib" and -# "dir|dir" are searched. If SEARCH-LIST is omitted and the user did not -# override the search list via --with-LIBRARY=dir, then only the -# directories normally searched by the compiler and the directories -# mentioned via cs_lib_paths_default are searched. LANGUAGE is typically -# either C or C++ and specifies which compiler to use for the test. If -# LANGUAGE is omitted, C is used. OTHER-CFLAGS, OTHER-LFLAGS, and -# OTHER-LIBS can specify additional compiler flags, linker flags, and -# libraries needed to successfully link with LIBRARY. The optional -# ALIASES is a comma-delimited list of library names for which to search -# in case LIBRARY is not located (for example "[sdl1.2, sdl12]" for -# libsdl1.2.a, sdl1.2.framework, libsdl12.a, and sdl12.framework). If -# the library or one of its aliases is found and can be successfully -# linked into a program, then the shell cache variable cs_cv_libLIBRARY -# is set to "yes"; cs_cv_libLIBRARY_cflags, cs_cv_libLIBRARY_lflags, and -# cs_cv_libLIBRARY_libs are set, respectively, to the compiler flags -# (including OTHER-CFLAGS), linker flags (including OTHER-LFLAGS), and -# library references (including OTHER-LIBS) which resulted in a -# successful build; and ACTION-IF-FOUND is invoked. If the library was -# not found or was unlinkable, or if the user disabled the library via -# --without-LIBRARY, then cs_cv_libLIBRARY is set to "no" and -# ACTION-IF-NOT-FOUND is invoked. Note that the exported shell variable -# names are always composed from LIBRARY regardless of whether the test -# succeeded because the primary library was discovered or one of the -# aliases. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_LIB_WITH], - [AC_ARG_WITH([$1], [AC_HELP_STRING([--with-$1=dir], - [specify location of lib$1 if not detected automatically; searches - dir/include, dir/lib, and dir])]) - - # Backward compatibility: Recognize --with-lib$1 as alias for --with-$1. - AS_IF([test -n "$with_lib$1" && test -z "$with_$1"], - [with_$1="$with_lib$1"]) - - AS_IF([test -z "$with_$1"], [with_$1=yes]) - AS_IF([test "$with_$1" != no], - [# If --with-$1 value is same as cached value, then assume other - # cached values are also valid; otherwise, ignore all cached values. - AS_IF([test "$with_$1" != "$cs_cv_with_$1"], - [cs_ignore_cache=yes], [cs_ignore_cache=no]) - - cs_check_lib_flags='' - AS_IF([test $with_$1 = yes], - [m4_foreach([cs_check_lib_alias], [$1, $10], - [_CS_CHECK_LIB_PKG_CONFIG_FLAGS([cs_check_lib_flags], - cs_check_lib_alias) - _CS_CHECK_LIB_CONFIG_FLAGS([cs_check_lib_flags], - cs_check_lib_alias) - ])]) - - AS_IF([test $with_$1 != yes], - [cs_check_lib_paths=$with_$1], - [cs_check_lib_paths="| cs_lib_paths_default $3"]) - m4_foreach([cs_check_lib_alias], [$1, $10], - [_CS_CHECK_LIB_CREATE_FLAGS([cs_check_lib_flags], - cs_check_lib_alias, [$cs_check_lib_paths]) - ]) - - CS_CHECK_BUILD([for lib$1], [cs_cv_lib$1], [$2], [$cs_check_lib_flags], - [$4], [], [], [$cs_ignore_cache], [$7], [$8], [$9])], - [cs_cv_lib$1=no]) - - cs_cv_with_$1="$with_$1" - AS_IF([test "$cs_cv_lib$1" = yes], [$5], [$6])]) - - - -#------------------------------------------------------------------------------ -# CS_CHECK_PKG_CONFIG -# Check if the `pkg-config' command is available and reasonably recent. -# This program acts as a central repository of build flags for various -# packages. For example, to determine the compiler flags for FreeType2 -# use, "pkg-config --cflags freetype2"; and "pkg-config --libs freetype2" -# to determine the linker flags. If `pkg-config' is found and is -# sufficiently recent, PKG_CONFIG is set and AC_SUBST() invoked. -#------------------------------------------------------------------------------ -m4_define([CS_PKG_CONFIG_MIN], [0.9.0]) -AC_DEFUN([CS_CHECK_PKG_CONFIG], - [AS_IF([test "$cs_prog_pkg_config_checked" != yes], - [CS_CHECK_TOOLS([PKG_CONFIG], [pkg-config]) - _CS_CHECK_PKG_CONFIG_PREPARE_PATH - cs_prog_pkg_config_checked=yes]) - AS_IF([test -z "$cs_cv_prog_pkg_config_ok"], - [AS_IF([test -n "$PKG_CONFIG"], - [AS_IF([$PKG_CONFIG --atleast-pkgconfig-version=CS_PKG_CONFIG_MIN], - [cs_cv_prog_pkg_config_ok=yes], - [cs_cv_prog_pkg_config_ok=no])], - [cs_cv_prog_pkg_config_ok=no])])]) - -AC_DEFUN([_CS_CHECK_PKG_CONFIG_PREPARE_PATH], - [PKG_CONFIG_PATH="m4_foreach([cs_pkg_path], [cs_pkg_paths_default], - [cs_pkg_path$PATH_SEPARATOR])$PKG_CONFIG_PATH" - export PKG_CONFIG_PATH]) - - - -#------------------------------------------------------------------------------ -# _CS_CHECK_LIB_PKG_CONFIG_FLAGS(VARIABLE, LIBRARY) -# Helper macro for CS_CHECK_LIB_WITH(). Checks if `pkg-config' knows -# about LIBRARY and, if so, appends a build tuple consisting of the -# compiler and linker flags reported by `pkg-config' to the list of -# tuples stored in the shell variable VARIABLE. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_CHECK_LIB_PKG_CONFIG_FLAGS], - [CS_CHECK_PKG_CONFIG - AS_IF([test $cs_cv_prog_pkg_config_ok = yes], - [AC_CACHE_CHECK([if $PKG_CONFIG recognizes $2], [_CS_CLPCF_CVAR([$2])], - [AS_IF([$PKG_CONFIG --exists $2], - [_CS_CLPCF_CVAR([$2])=yes], [_CS_CLPCF_CVAR([$2])=no])]) - AS_IF([test $_CS_CLPCF_CVAR([$2]) = yes], - [_CS_CHECK_LIB_CONFIG_PROG_FLAGS([$1], [pkg_config_$2], - [$PKG_CONFIG], [$2])])])]) - -AC_DEFUN([_CS_CLPCF_CVAR], [AS_TR_SH([cs_cv_prog_pkg_config_$1])]) - - - -#------------------------------------------------------------------------------ -# _CS_CHECK_LIB_CONFIG_FLAGS(VARIABLE, LIBRARY) -# Helper macro for CS_CHECK_LIB_WITH(). Checks if `LIBRARY-config' -# (i.e. `sdl-config') exists and, if so, appends a build tuple consisting -# of the compiler and linker flags reported by `LIBRARY-config' to the -# list of tuples stored in the shell variable VARIABLE. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_CHECK_LIB_CONFIG_FLAGS], - [CS_CHECK_TOOLS(_CS_CLCF_SHVAR([$2]), [$2-config]) - AS_IF([test -n "$_CS_CLCF_SHVAR([$2])"], - [AS_IF([test -z "$_CS_CLCF_CVAR([$2])"], - [AS_IF([$_CS_CLCF_SHVAR([$2]) --cflags --libs >/dev/null 2>&1], - [_CS_CLCF_CVAR([$2])=yes], [_CS_CLCF_CVAR([$2])=no])]) - AS_IF([test $_CS_CLCF_CVAR([$2]) = yes], - [_CS_CHECK_LIB_CONFIG_PROG_FLAGS([$1], [config_$2], - [$_CS_CLCF_SHVAR([$2])])])])]) - -AC_DEFUN([_CS_CLCF_CVAR], [AS_TR_SH([cs_cv_prog_config_$1_ok])]) -AC_DEFUN([_CS_CLCF_SHVAR], [m4_toupper(AS_TR_SH([CONFIG_$1]))]) - - - -#------------------------------------------------------------------------------ -# _CS_CHECK_LIB_CONFIG_PROG_FLAGS(VARIABLE, TAG, CONFIG-PROGRAM, [ARGS]) -# Helper macro for _CS_CHECK_LIB_PKG_CONFIG_FLAGS() and -# _CS_CHECK_LIB_CONFIG_FLAGS(). CONFIG-PROGRAM is a command which -# responds to the --cflags and --libs options and returns suitable -# compiler and linker flags for some package. ARGS, if supplied, is -# passed to CONFIG-PROGRAM after the --cflags or --libs argument. The -# results of the --cflags and --libs options are packed into a build -# tuple and appended to the list of tuples stored in the shell variable -# VARIABLE. TAG is used to compose the name of the cache variable. A good -# choice for TAG is some unique combination of the library name and -# configuration program. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_CHECK_LIB_CONFIG_PROG_FLAGS], - [AS_IF([test -z "$_CS_CLCPF_CVAR([$2])"], - [cs_check_lib_cflag=CS_RUN_PATH_NORMALIZE([$3 --cflags $4]) - cs_check_lib_lflag='' - cs_check_lib_libs=CS_RUN_PATH_NORMALIZE([$3 --libs $4]) - _CS_CLCPF_CVAR([$2])=CS_CREATE_TUPLE( - [$cs_check_lib_cflag], - [$cs_check_lib_lflag], - [$cs_check_lib_libs])]) - $1="$$1 $_CS_CLCPF_CVAR([$2])"]) - -AC_DEFUN([_CS_CLCPF_CVAR], [AS_TR_SH([cs_cv_prog_$1_flags])]) - - - -#------------------------------------------------------------------------------ -# _CS_CHECK_LIB_CREATE_FLAGS(VARIABLE, LIBRARY, PATHS) -# Helper macro for CS_CHECK_LIB_WITH(). Constructs a list of build -# tuples suitable for CS_CHECK_BUILD() and appends the tuple list to the -# shell variable VARIABLE. LIBRARY and PATHS have the same meanings as -# the like-named arguments of CS_CHECK_LIB_WITH(). -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_CHECK_LIB_CREATE_FLAGS], - [for cs_lib_item in $3 - do - case $cs_lib_item in - *\|*) CS_SPLIT( - [$cs_lib_item], [cs_check_incdir,cs_check_libdir], [|]) - _CS_CHECK_LIB_CREATE_FLAG([$1], - [$cs_check_incdir], [$cs_check_libdir], [$2]) - ;; - *) _CS_CHECK_LIB_CREATE_FLAG([$1], - [$cs_lib_item/include], [$cs_lib_item/lib], [$2]) - _CS_CHECK_LIB_CREATE_FLAG( - [$1], [$cs_lib_item], [$cs_lib_item], [$2]) - ;; - esac - done]) - - - -#------------------------------------------------------------------------------ -# _CS_CHECK_LIB_CREATE_FLAG(VARIABLE, HEADER-DIR, LIBRARY-DIR, LIBRARY) -# Helper macro for _CS_CHECK_LIB_CREATE_FLAGS(). Constructs build tuples -# suitable for CS_CHECK_BUILD() for given header and library directories, -# and appends the tuples to the shell variable VARIABLE. Synthesizes -# tuples which check for LIBRARY as a MacOS/X framework, and a standard -# link library. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_CHECK_LIB_CREATE_FLAG], - [AS_IF([test -n "$2"], [cs_check_lib_cflag="-I$2"], [cs_check_lib_cflag='']) - AS_IF([test -n "$3"], [cs_check_lib_lflag="-L$3"], [cs_check_lib_lflag='']) - AS_IF([test -n "$4"], - [cs_check_lib_libs="-l$4" - cs_check_lib_framework="-framework $4"], - [cs_check_lib_libs='' - cs_check_lib_framework='']) - $1="$$1 - CS_CREATE_TUPLE( - [$cs_check_lib_cflag], - [$cs_check_lib_lflag], - [$cs_check_lib_framework]) - CS_CREATE_TUPLE( - [$cs_check_lib_cflag], - [$cs_check_lib_lflag], - [$cs_check_lib_libs])"]) -# checklibtool.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2004 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_LIBTOOL -# Find and identify the various implementations of libtool. In -# particular, this macro is aware of GNU libtool and Apple's libtool -# (which serves a completely different purpose). On MacOS/X, GNU libtool -# is typically named glibtool, however a user might also use Fink to -# install the unadorned libtool; and the Fink-installed version might -# shadow Apple's own libtool if it appears in the PATH before the Apple -# tool. This macro jumps through the necessary hoops to distinguish and -# locate the various implementations. Sets the shell variable LIBTOOL to -# the located GNU libtool (if any), and APPLE_LIBTOOL to the located -# Apple libtool. Invokes AC_SUBST() for LIBTOOL and APPLE_LIBTOOL. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_LIBTOOL], -[# GNU: Search for libtool before glibtool since Fink version is likely newer. -m4_define([cs_lt_path_gnu], - [/sw/bin$PATH_SEPARATOR/usr/local/bin$PATH_SEPARATOR$PATH]) -AS_IF([test -z "$LIBTOOL"], - [CS_CHECK_TOOLS([LIBTOOL_TEST], [libtool glibtool gnulibtool], [], - [cs_lt_path_gnu]) - AS_IF([test -n "$LIBTOOL_TEST"], - [CS_PATH_PROG([LIBTOOL_PATH], [$LIBTOOL_TEST], [], [cs_lt_path_gnu]) - CS_LIBTOOL_CLASSIFY([$LIBTOOL_PATH], - [LIBTOOL="$LIBTOOL_PATH"], - [AS_IF([test -z "$APPLE_LIBTOOL"], [APPLE_LIBTOOL="$LIBTOOL_PATH"]) - CS_CHECK_TOOLS([LIBTOOL], [glibtool gnulibtool])])])]) -AC_SUBST([LIBTOOL]) - -# Apple: Ensure that Apple libtool will be found before GNU libtool from Fink. -m4_define([cs_lt_path_apple],[/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH]) -AS_IF([test -z "$APPLE_LIBTOOL"], - [CS_PATH_PROG([CS_LT_APPLE], [libtool], [], [cs_lt_path_apple]) - CS_LIBTOOL_CLASSIFY([$CS_LT_APPLE], [], - [APPLE_LIBTOOL="$CS_LT_APPLE"])]) -AC_SUBST([APPLE_LIBTOOL])]) - -AC_DEFUN([CS_LIBTOOL_CLASSIFY], - [AS_IF([test -n "$1"], - [AC_MSG_CHECKING([classification of $1]) - CS_LIBTOOL_GNU_IFELSE([$1], - [AC_MSG_RESULT([gnu]) - $2], - [AC_MSG_RESULT([apple]) - $3])])]) - -AC_DEFUN([CS_LIBTOOL_GNU_IFELSE], - [AS_IF([AC_RUN_LOG([$1 --version 1>&2])], [$2], [$3])]) -#============================================================================== -# Copyright (C)2003-2006 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_OPENGL -# Check for OpenGL. -# -# IMPLEMENTATION NOTES -# -# Some Mesa installations require pthread, so pthread flags are employed if -# available. -# -# The check for opengl32 needs to precede other checks because Cygwin users -# often have Mesa installed, and Mesa's OpenGL library is compiled without the -# __stdcall flags which results in link errors, whereas Microsoft's native -# opengl32 works fine. Conversely, some Unix implementations have Wine -# installed (Windows emulation layer) which includes an opengl32.so library. -# We need to avoid detection of this library on Unix since it would cause an -# undesirable dependence upon Wine. -# -# Many OpenGL libraries on Unix already contain GLX, so there is no separate -# GLX library, thus we first check for GLX using the discovered OpenGL library -# before attempting to locate a separate GLX-specific library. -# -# On MacOS/X, some users have XFree86 installed which creates a link from -# /usr/include/GL to /usr/X11R6/include/GL. We want to ignore this directory -# and instead check for Apple's OpenGL.framework, if we are not cross-building -# for Darwin. We accomplish this by placing the OpenGL.framework test ahead of -# the other tests. -# -# At least one user (Jorrit) has a strange installation in which inclusion of -# fails if an int32 is not present, thus we must take this into -# account. -#------------------------------------------------------------------------------ -m4_define([cs_define_int32], - [[#if !HAVE_TYPE_INT32 - typedef long int32; - #endif - ]]) - -# CS_GL_INCLUDE(CPP-MACRO,FALLBACK,HEADER) -AC_DEFUN([CS_GL_INCLUDE], - [[#if HAVE_WINDOWS_H - #if !HAVE_TYPE_INT32 - typedef long int32; - #endif - #include - #endif - #ifndef CS_HEADER_GLOBAL - #define CS_HEADER_GLOBAL(X,Y) CS_HEADER_GLOBAL_COMPOSE(X,Y) - #define CS_HEADER_GLOBAL_COMPOSE(X,Y) - #endif - #ifdef $1 - #include CS_HEADER_GLOBAL($1,$3) - #else - #include <$2/$3> - #endif]]) - -AC_DEFUN([CS_CHECK_OPENGL], - [AC_REQUIRE([CS_CHECK_HOST]) - AC_REQUIRE([CS_CHECK_COMMON_LIBS]) - AC_REQUIRE([CS_CHECK_PTHREAD]) - AC_REQUIRE([AC_PATH_X]) - AC_REQUIRE([AC_PATH_XTRA]) - AC_CHECK_TYPE([int32], [AC_DEFINE([HAVE_TYPE_INT32], [], - [Whether the int32 type is available])], []) - AC_CHECK_HEADERS([windows.h], [], [], [cs_define_int32]) - - # Apply plaform-specific flags if necessary. - cs_gl_plat_cflags='' - cs_gl_plat_lflags='' - cs_gl_plat_libs='' - AS_IF([test -n "$cs_cv_libm_cflags$cs_cv_libm_lflags$cs_cv_libm_libs"], - [cs_gl_plat_cflags="$cs_cv_libm_cflags $cs_gl_plat_cflags" - cs_gl_plat_lflags="$cs_cv_libm_lflags $cs_gl_plat_lflags" - cs_gl_plat_libs="$cs_cv_libm_libs $cs_gl_plat_libs"]) - AS_IF([test $cs_cv_sys_pthread = yes], - [cs_gl_plat_cflags="$cs_cv_sys_pthread_cflags $cs_gl_plat_cflags" - cs_gl_plat_lflags="$cs_cv_sys_pthread_lflags $cs_gl_plat_lflags" - cs_gl_plat_libs="$cs_cv_sys_pthread_libs $cs_gl_plat_libs"]) - AS_IF([test "$no_x" != yes], - [cs_gl_plat_cflags="$X_CFLAGS $cs_gl_plat_cflags" - cs_gl_plat_lflags="$cs_gl_plat_lflags" - cs_gl_plat_libs=" - $X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS $cs_gl_plat_libs"]) - - # Mesa requested? - AC_ARG_WITH([mesa], [AC_HELP_STRING([--with-mesa], - [use Mesa OpenGL library if available (default YES)])], - [], [with_mesa=yes]) - - AS_IF([test $with_mesa != no], - [cs_mesa_gl=CS_CREATE_TUPLE([],[],[-lMesaGL])]) - - # MacOS/X or Darwin? - AS_IF([test "x$cs_host_macosx" = "xyes"], - [cs_osx_gl=CS_CREATE_TUPLE([-DCS_OPENGL_PATH=OpenGL],[],[-framework OpenGL])]) - AS_IF([test "x$cs_host_macosx" = "xyes"], - [cs_gl_plat_lflags="$cs_plat_lflags -Wl,-dylib_file,/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"]) - - # Windows? - AS_IF([test $cs_host_family = windows], - [cs_win32_gl=CS_CREATE_TUPLE([],[],[-lopengl32])]) - - # Check for OpenGL. - CS_CHECK_BUILD([for OpenGL], [cs_cv_libgl], - [AC_LANG_PROGRAM([CS_GL_INCLUDE([CS_OPENGL_PATH],[GL],[gl.h])],[glEnd()])], - [$cs_win32_gl \ - $cs_osx_gl \ - CS_CREATE_TUPLE([],[],[-lGL]) \ - CS_CREATE_TUPLE([],[],[-lgl]) \ - $cs_mesa_gl], [], - [CS_EMIT_BUILD_RESULT([cs_cv_libgl], [GL])], [], [], - [$cs_gl_plat_cflags], [$cs_gl_plat_lflags], [$cs_gl_plat_libs])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_GLU -# Check for GLU. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_GLU], - [AC_REQUIRE([CS_CHECK_OPENGL]) - AS_IF([test $cs_cv_libgl = yes], - [AS_IF([test $with_mesa != no], - [cs_mesa_glu=CS_CREATE_TUPLE([],[],[-lMesaGLU])]) - - # MacOS/X or Darwin? - AS_IF([test "x$cs_host_macosx" = "xyes"], - [cs_osx_glu=CS_CREATE_TUPLE([-DCS_GLU_PATH=OpenGL],[],[-framework OpenGL])]) - - # Windows? - AS_IF([test $cs_host_family = windows], - [cs_win32_glu=CS_CREATE_TUPLE([],[],[-lglu32])]) - - # Check for GLU. - CS_CHECK_BUILD([for GLU], [cs_cv_libglu], - [AC_LANG_PROGRAM( - [CS_GL_INCLUDE([CS_GLU_PATH],[GL],[glu.h])], [gluNewQuadric()])], - [$cs_osx_glu \ - CS_CREATE_TUPLE() \ - $cs_win32_glu \ - CS_CREATE_TUPLE([],[],[-lGLU]) \ - CS_CREATE_TUPLE([],[],[-lglu]) \ - $cs_mesa_glu], [], - [CS_EMIT_BUILD_RESULT([cs_cv_libglu], [GLU])], [], [], - [$cs_cv_libgl_cflags], [$cs_cv_libgl_lflags], [$cs_cv_libgl_libs])])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_GLX -# Check for GLX. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_GLX], - [AC_REQUIRE([CS_CHECK_OPENGL]) - AS_IF([test $cs_cv_libgl = yes], - [AS_IF([test $with_mesa != no], - [cs_mesa_glx=CS_CREATE_TUPLE([],[],[-lMesaGLX])]) - - # Check for GLX. - AS_IF([test "$no_x" != yes], - [CS_CHECK_BUILD([for GLX], [cs_cv_libglx], - [AC_LANG_PROGRAM([[#include ]], [glXWaitGL()])], - [CS_CREATE_TUPLE() \ - CS_CREATE_TUPLE([],[],[-lGLX]) \ - CS_CREATE_TUPLE([],[],[-lglx]) \ - $cs_mesa_glx], [], - [CS_EMIT_BUILD_RESULT([cs_cv_libglx], [GLX])], [], [], - [$cs_cv_libgl_cflags], [$cs_cv_libgl_lflags], [$cs_cv_libgl_libs])])])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_GLXEXT([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# Check for GLX extensions. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_GLXEXT], - [AC_REQUIRE([CS_CHECK_GLX]) - AS_IF([test x$cs_cv_libglx = "xyes"], - [# Check for GLX extensions. - CS_CHECK_BUILD([for GLX extensions], [cs_cv_libglx_extensions], - [AC_LANG_PROGRAM( - [[#define GLX_GLXEXT_PROTOTYPES - #include ]], - [glXGetProcAddressARB(0)])], - [CS_CREATE_TUPLE( - [$cs_cv_libglx_cflags], - [$cs_cv_libglx_lflags], - [$cs_cv_libglx_libs])], - [], [$1], [$2])])]) - - - -#------------------------------------------------------------------------------ -# CS_CHECK_GLUT -# Check for GLUT. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_GLUT], - [AC_REQUIRE([CS_CHECK_GLU]) - AS_IF([test x$cs_cv_libglu = "xyes"], - [# MacOS/X or Darwin? - AS_IF([test "x$cs_host_macosx" = "xyes"], - [cs_osx_glut=CS_CREATE_TUPLE([-DCS_GLUT_PATH=GLUT],[],[-framework GLUT])]) - - # Windows? - AS_IF([test $cs_host_family = windows], - [cs_win32_glut=CS_CREATE_TUPLE([],[],[-lglut32])]) - - # Check for GLUT. - CS_CHECK_BUILD([for GLUT], [cs_cv_libglut], - [AC_LANG_PROGRAM( - [CS_GL_INCLUDE([CS_GLUT_PATH],[GL],[glut.h])], [glutSwapBuffers()])], - [$cs_osx_glut \ - CS_CREATE_TUPLE() \ - $cs_win32_glut \ - CS_CREATE_TUPLE([],[],[-lGLUT]) \ - CS_CREATE_TUPLE([],[],[-lglut])], [], - [CS_EMIT_BUILD_RESULT([cs_cv_libglut], [GLUT])], [], [], - [$cs_cv_libgl_cflags $cs_cv_libglu_cflags], - [$cs_cv_libgl_lflags $cs_cv_libglu_lflags], - [$cs_cv_libgl_libs $cs_cv_libglu_libs])])]) - -# checkpic.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_COMPILER_PIC([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check if compiler can be instructed to produce -# position-independent-code (PIC). This feature is required by some -# platforms when building plugin modules and shared libraries. If -# LANGUAGE is not provided, then `C' is assumed (other options include -# `C++'). If CACHE-VAR is not provided, then it defaults to the name -# "cs_cv_prog_compiler_pic". If a PIC-enabling option (such as `-fPIC') -# is discovered, then it is assigned to CACHE-VAR and ACTION-IF-FOUND is -# invoked; otherwise the empty string is assigned to CACHE-VAR and -# ACTION-IF-NOT-FOUND is invoked. -# -# IMPLEMENTATION NOTES -# -# On some platforms (such as Windows), the -fPIC option is superfluous -# and emits a warning "-fPIC ignored for target (all code is position -# independent)", despite the fact that the compiler accepts the option -# and returns a success code. We want to re-interpret the warning as a -# failure in order to avoid unnecessary compiler diagnostics in case the -# client inserts the result of this check into CFLAGS, for instance. We -# do so by attempting to promote warnings to errors using the result of -# CS_COMPILER_ERRORS(). As an extra safe-guard, we also scan the compiler -# output for an appropriate diagnostic because some gcc warnings fail to -# promote to error status despite use of -Werror. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_PIC], - [CS_COMPILER_ERRORS([$1], - [m4_default([$2_werror],[cs_cv_prog_compiler_pic_werror])]) - CS_CHECK_BUILD_FLAGS( - [how to enable m4_default([$1],[C]) PIC generation], - [m4_default([$2],[cs_cv_prog_compiler_pic])], - [CS_CREATE_TUPLE([-fPIC])], [$1], [$3], [$4], - [m4_default([$$2_werror],[$cs_cv_prog_compiler_pic_werror])], [], [], - [fPIC])]) - -# Backward-compatiblity alias. -AC_DEFUN([CS_CHECK_COMPILER_PIC], [CS_COMPILER_PIC([$1],[$2],[$3],[$4])]) -# checkprog.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2004 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# cs_bin_paths_default -# Comma delimited list of additional directories in which tools and -# commands might be found. -# -# Present Cases: -# /usr/local/bin -- Although a common location for executables, it is -# now-and-then absent from the default PATH setting. -# /sw/bin -- Fink, the MacOS/X manager of Unix packages, installs -# executables here. -#------------------------------------------------------------------------------ -m4_define([cs_bin_paths_default], [/usr/local/bin, /sw/bin]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_PROG(VARIABLE, PROGRAM, VALUE-IF-FOUND, [VALUE-IF-NOT-FOUND], -# [PATH], [REJECT]) -# Simple wrapper for AC_CHECK_PROG() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_PROG], - [_CS_PROG_PATH_PREPARE - AC_CHECK_PROG([$1], [$2], [$3], [$4], - m4_ifval([$5], [_CS_PROG_CLIENT_PATH([$5])]), [$6])]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_PROGS(VARIABLE, PROGRAMS, [VALUE-IF-NOT-FOUND], [PATH]) -# Simple wrapper for AC_CHECK_PROGS() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_PROGS], - [_CS_PROG_PATH_PREPARE - AC_CHECK_PROGS([$1], [$2], [$3], - m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_TOOL(VARIABLE, TOOL, [VALUE-IF-NOT-FOUND], [PATH]) -# Simple wrapper for AC_CHECK_TOOL() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_TOOL], - [_CS_PROG_PATH_PREPARE - AC_CHECK_TOOL([$1], [$2], [$3], - m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_TOOLS(VARIABLE, TOOLS, [VALUE-IF-NOT-FOUND], [PATH]) -# Simple wrapper for AC_CHECK_TOOLS() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_TOOLS], - [_CS_PROG_PATH_PREPARE - AC_CHECK_TOOLS([$1], [$2], [$3], - m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) - - -#------------------------------------------------------------------------------ -# CS_PATH_PROG(VARIABLE, PROGRAM, [VALUE-IF-NOT-FOUND], [PATH]) -# Simple wrapper for AC_PATH_PROG() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_PATH_PROG], - [_CS_PROG_PATH_PREPARE - AC_PATH_PROG([$1], [$2], [$3], - m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) - - -#------------------------------------------------------------------------------ -# CS_PATH_PROGS(VARIABLE, PROGRAMS, [VALUE-IF-NOT-FOUND], [PATH]) -# Simple wrapper for AC_PATH_PROGS() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_PATH_PROGS], - [_CS_PROG_PATH_PREPARE - AC_PATH_PROGS([$1], [$2], [$3], - m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) - - -#------------------------------------------------------------------------------ -# CS_PATH_TOOL(VARIABLE, TOOL, [VALUE-IF-NOT-FOUND], [PATH]) -# Simple wrapper for AC_PATH_TOOL() which ensures that the search path -# is augmented by the directories mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_PATH_TOOL], - [_CS_PROG_PATH_PREPARE - AC_PATH_TOOL([$1], [$2], [$3], - m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) - - -#------------------------------------------------------------------------------ -# _CS_PROG_PATH_PREPARE -# Ensure that the PATH environment variable mentions the set of -# directories listed in cs_bin_paths_default. These directories may not -# appear by default in the typical PATH, yet they might be common -# locations for tools and commands. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_PROG_PATH_PREPARE], - [AS_REQUIRE([_AS_PATH_SEPARATOR_PREPARE]) - AS_IF([test "$cs_prog_path_prepared" != yes], - [cs_prog_path_prepared=yes - PATH="$PATH[]m4_foreach([cs_bin_path], [cs_bin_paths_default], - [$PATH_SEPARATOR[]cs_bin_path])" - export PATH])]) - - -#------------------------------------------------------------------------------ -# _CS_PROG_CLIENT_PATH(CLIENT-PATH) -# Given a client-supplied replacement for PATH, augment the list by -# appending the locations mentioned in cs_bin_paths_default. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_PROG_CLIENT_PATH], - [AS_REQUIRE([_AS_PATH_SEPARATOR_PREPARE])dnl - $1[]m4_foreach([cs_bin_path], [cs_bin_paths_default], - [$PATH_SEPARATOR[]cs_bin_path])]) -# checkpthread.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003-2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_PTHREAD([REJECT-MASK]) -# Check for pthread. Also check if the pthread implementation supports -# the recursive and timed mutex extensions. (Timed mutexes are needed for -# the NPTL: New Posix Thread Library on GNU/Linux if the mutex is going -# to be used with any of the timed condition-wait functions.) The shell -# variable cs_cv_sys_pthread is set to "yes" if pthread is available, -# else "no". If available, then the variables cs_cv_sys_pthread_cflags, -# cs_cv_sys_pthread_lflags, and cs_cv_sys_pthread_libs are set. (As a -# convenience, these variables can be emitted to an output file with -# CS_EMIT_BUILD_RESULT() by passing "cs_cv_sys_pthread" as its CACHE-VAR -# argument.) If the recursive mutex extension is supported, then -# cs_cv_sys_pthread_mutex_recursive will be set with the literal name of -# the constant which must be passed to pthread_mutexattr_settype() to -# enable this feature. The constant name will be typically -# PTHREAD_MUTEX_RECURSIVE or PTHREAD_MUTEX_RECURSIVE_NP. If the recursive -# mutex extension is not available, then -# cs_cv_sys_pthread_mutex_recursive will be set to "no". If the timed -# mutex extension is supported, then cs_cv_sys_pthread_mutex_timed will -# be set with the literal name of the constant which must be passed to -# pthread_mutexattr_settype() to enable this feature. The constant name -# will be typically PTHREAD_MUTEX_TIMED or PTHREAD_MUTEX_TIMED_NP. If the -# timed mutex extension is not available, then -# cs_cv_sys_pthread_mutex_timed will be set to "no". REJECT-MASK can be -# used to limit the platforms on which the pthread test is performed. It -# is compared against $host_os; matches are rejected. If omitted, then -# the test is performed on all platforms. Examples: To avoid testing on -# Cygwin, use "cygwin*"; to avoid testing on Cygwin and AIX, use -# "cygwin*|aix*". -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_PTHREAD], - [AC_REQUIRE([AC_CANONICAL_HOST]) - case $host_os in - m4_ifval([$1], - [$1) - cs_cv_sys_pthread=no - ;; - ]) - *) - CS_CHECK_BUILD([for pthread], [cs_cv_sys_pthread], - [AC_LANG_PROGRAM( - [[#include - #include - void* worker(void* p) { (void)p; return p; }]], - [pthread_t tid; - sem_t sem; - pthread_create(&tid, 0, worker, 0); - sem_init(&sem, 0, 0); - sem_destroy(&sem);])], - [cs_pthread_flags]) - ;; - esac - _CS_CHECK_MUTEX_FEATURE([PTHREAD_MUTEX_RECURSIVE], - [cs_cv_sys_pthread_mutex_recursive], [for pthread recursive mutexes])]) - -# _CS_CHECK_MUTEX_FEATURE(FEATURE, CACHE-VAR, MESSAGE) -AC_DEFUN([_CS_CHECK_MUTEX_FEATURE], - [AS_IF([test $cs_cv_sys_pthread = yes], - [AC_CACHE_CHECK([$3], [$2], - [CS_BUILD_IFELSE( - [AC_LANG_PROGRAM( - [[#include ]], - [pthread_mutexattr_t attr; - pthread_mutexattr_settype(&attr, CS_MUTEX_FEATURE);])], - [CS_CREATE_TUPLE([-DCS_MUTEX_FEATURE=$1]) \ - CS_CREATE_TUPLE([-DCS_MUTEX_FEATURE=$1_NP])], - [], - [$2=`echo $cs_build_cflags | sed 's/.*\($1_*N*P*\).*/\1/'`], - [$2=no], - [$cs_cv_sys_pthread_cflags -D_GNU_SOURCE], - [$cs_cv_sys_pthread_lflags], - [$cs_cv_sys_pthread_libs])])], - [$2=no])]) - -#------------------------------------------------------------------------------ -# CS_CHECK_PTHREAD_ATFORK(CACHE-VAR) -# Checks whether the pthread library contains pthread_atfork(). Sets -# CACHE-VAR to "yes" or "no", according to the test result. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_PTHREAD_ATFORK], - [AS_IF([test $cs_cv_sys_pthread = yes], - [AC_CACHE_CHECK([for pthread_atfork support], [$1], - [CS_BUILD_IFELSE( - [AC_LANG_PROGRAM( - [[#include ]], - [pthread_atfork (0, 0, 0);])], - [], [], - [$1=yes], [$1=no], - [$cs_cv_sys_pthread_cflags -D_GNU_SOURCE], - [$cs_cv_sys_pthread_lflags], - [$cs_cv_sys_pthread_libs])])], - [$1=no])]) - -m4_define([cs_pthread_flags], - [CS_CREATE_TUPLE() \ - CS_CREATE_TUPLE([], [], [-lpthread]) \ - CS_CREATE_TUPLE([], [], [-lpthread -lrt]) \ - CS_CREATE_TUPLE([-pthread], [-pthread], []) \ - CS_CREATE_TUPLE([-pthread], [-pthread], [-lpthread]) \ - CS_CREATE_TUPLE([-pthread], [-pthread], [-lc_r])]) -# checktt2.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2004,2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_TEMPLATE_TOOLKIT2([EMITTER]) -# Check if Template Toolkit 2 (http://www.tt2.org/) is available. The -# shell variable cs_cv_perl_tt2 is set to "yes" if the package is -# discovered, else "no". Also sets the shell variable TTREE to the name -# path of the 'ttree' utility program and invokes AC_SUBST(). If EMITTER -# is provided and the package was discovered, then -# CS_EMIT_BUILD_PROPERTY() is invoked with EMITTER in order to record the -# value of the TTREE variable in an output file. As a convenience, if -# EMITTER is the literal value "emit" or "yes", then -# CS_EMIT_BUILD_RESULT()'s default emitter will be used. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_TEMPLATE_TOOLKIT2], - [CS_CHECK_PROGS([PERL], [perl5 perl]) - AS_IF([test -n "$PERL"], - [AC_CACHE_CHECK([for TemplateToolkit], [cs_cv_perl_tt2], - [AS_IF([AC_RUN_LOG( - [$PERL -M'Template 2.11' -MTemplate::Plugin -e 0 1>&2])], - [cs_cv_perl_tt2=yes], - [cs_cv_perl_tt2=no])]) - CS_PATH_PROGS([TTREE], [ttree]) - AS_IF([test $cs_cv_perl_tt2 = yes && test -n "$TTREE"], - [CS_EMIT_BUILD_PROPERTY([TTREE], [$TTREE], [], [], - CS_EMITTER_OPTIONAL([$1]))])])]) -# compiler.m4 -*- Autoconf -*- -#============================================================================= -# Copyright (C)2003 by Matze Braun -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================= - -#----------------------------------------------------------------------------- -# Detection of C and C++ compilers and setting flags -# -# CS_PROG_CC -# Detects the C compiler. Also takes care of the CFLAGS, CPPFLAGS and CC -# environment variables. This will filter out all -g and -O from the -# CFLAGS variable because Autoconf's -g and -O defaults are not always -# desired. This will also set the CMD.CC and COMPILER.CFLAGS variables -# in Jamconfig -# CS_PROG_CXX -# Detects the C++ compiler. Also takes care of the CXXFLAGS, CPPFLAGS -# and CXX environment variables. This will filter out all -g and -O from -# the CXXFLAGS variable because Autoconf's -g and -O defaults are not -# always desired. This will also set the CMD.C++ and COMPILER.C++FLAGS -# variables in Jamconfig -# CS_PROG_LINK -# Tries to determine a linker. This is done by checking if a C++ or -# Objecctive-C++ compiler is available in which case it is used for -# linking; otherwise the C or Objective-C compiler is used. This also -# sets the CMD.LINK and COMPILER.LFLAGS variables in Jamconfig and -# respects the LDFLAGS environment variable. Finally, checks if linker -# recognizes -shared and sets PLUGIN.LFLAGS; and checks if linker -# recognizes -soname and sets PLUGIN.LFLAGS.USE_SONAME to "yes". -#----------------------------------------------------------------------------- -AC_DEFUN([CS_PROG_CC],[ - CFLAGS="$CFLAGS" # Filter undesired flags - AS_IF([test -n "$CC"],[ - CS_EMIT_BUILD_PROPERTY([CMD.CC], [$CC]) - CS_EMIT_BUILD_PROPERTY([COMPILER.CFLAGS], [$CPPFLAGS $CFLAGS], [+]) - - # Check if compiler recognizes -pipe directive. - CS_EMIT_BUILD_FLAGS([if $CC accepts -pipe], [cs_cv_prog_cc_pipe], - [CS_CREATE_TUPLE([-pipe])], [C], [COMPILER.CFLAGS], [+]) - ]) -]) - -AC_DEFUN([CS_PROG_CXX],[ - CXXFLAGS="$CXXFLAGS" # Filter undesired flags - AS_IF([test -n "$CXX"],[ - CS_EMIT_BUILD_PROPERTY([CMD.C++], [$CXX]) - - CS_EMIT_BUILD_PROPERTY([COMPILER.C++FLAGS], [$CPPFLAGS $CXXFLAGS], [+]) - - # Check if compiler can be instructed to produce position-independent-code - # (PIC). This feature is required by some platforms when building plugin - # modules and shared libraries. - CS_COMPILER_PIC([C++], [cs_cv_prog_cxx_pic], - [CS_EMIT_BUILD_PROPERTY([COMPILER.C++FLAGS.PIC], - [$cs_cv_prog_cxx_pic])]) - ]) -]) - -AC_DEFUN([CS_PROG_LINK],[ - AC_REQUIRE([CS_PROG_CXX]) - AS_IF([test -n "$CXX"], - [CS_EMIT_BUILD_PROPERTY([CMD.LINK], [AS_ESCAPE([$(CMD.C++)])])], - [CS_EMIT_BUILD_PROPERTY([CMD.LINK], [AS_ESCAPE([$(CMD.CC)])])]) - - CS_EMIT_BUILD_PROPERTY([COMPILER.LFLAGS], [$LDFLAGS], [+]) - - # Check if compiler/linker recognizes -shared directive which is needed for - # linking plugin modules. Unfortunately, the Apple compiler (and possibly - # others) requires extra effort. Even though the compiler does not recognize - # the -shared option, it nevertheless returns a "success" result after emitting - # the warning "unrecognized option `-shared'". Worse, even -Werror fails to - # promote the warning to an error, so we must instead scan the compiler's - # output for an appropriate diagnostic. - CS_CHECK_BUILD_FLAGS([if -shared is accepted], [cs_cv_prog_link_shared], - [CS_CREATE_TUPLE([-shared $cs_cv_prog_cxx_pic])], [C++], - [CS_EMIT_BUILD_PROPERTY([PLUGIN.LFLAGS], [-shared], [+])], [], - [], [], [], [shared]) - - # Check if linker recognizes -soname which is used to assign a name internally - # to plugin modules. - CS_CHECK_BUILD([if -soname is accepted], [cs_cv_prog_link_soname], [], - [CS_CREATE_TUPLE([-Wl,-soname,foobar])], [C++], - [CS_EMIT_BUILD_PROPERTY([PLUGIN.LFLAGS.USE_SONAME], [yes])]) -]) -#------------------------------------------------------------------------------ -# Determine host platform. Recognized families: Unix, Windows, MacOS/X. -# Orginial Macros Copyright (C)2003 Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#------------------------------------------------------------------------------ - -#------------------------------------------------------------------------------ -# Determine host CPU. -# -# CS_CHECK_HOST_CPU -# Set the shell variable cs_host_cpu to a normalized form of the CPU name -# returned by config.guess/config.sub. Typically, Crystal Space's -# conception of CPU name is the same as that returned by -# config.guess/config.sub, but there may be exceptions as seen in the -# `case' statement. Also takes the normalized name, uppercases it to -# form a name suitable for the C preprocessor. Additionally sets the -# TARGET.PROCESSOR Jamconfig property. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_HOST_CPU], - [AC_REQUIRE([AC_CANONICAL_HOST]) - case $host_cpu in - [[Ii][3-9]86*|[Xx]86*]) cs_host_cpu=x86 ;; - *) cs_host_cpu=$host_cpu ;; - esac - cs_host_cpu_normalized="AS_TR_CPP([$cs_host_cpu])" - CS_JAMCONFIG_PROPERTY([TARGET.PROCESSOR], [$cs_host_cpu_normalized]) - ]) - - -#------------------------------------------------------------------------------ -# CS_CHECK_HOST -# Sets the shell variables cs_host_target cs_host_family, -# cs_host_os_normalized, and cs_host_os_normalized_uc. Emits appropriate -# CS_PLATFORM_UNIX, CS_PLATFORM_WIN32, CS_PLATFORM_MACOSX via -# AC_DEFINE(), and TARGET.OS and TARGET.OS.NORMALIZED to Jamconfig. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_HOST], - [AC_REQUIRE([AC_CANONICAL_HOST]) - CS_CHECK_HOST_CPU - cs_host_os_normalized='' - case $host_os in - mingw*|cygwin*) - cs_host_target=win32gcc - cs_host_family=windows - ;; - darwin*) - _CS_CHECK_HOST_DARWIN - ;; - *) - # Everything else is assumed to be Unix or Unix-like. - cs_host_target=unix - cs_host_family=unix - ;; - esac - - case $cs_host_family in - windows) - AC_DEFINE([CS_PLATFORM_WIN32], [], - [Define when compiling for Win32]) - AS_IF([test -z "$cs_host_os_normalized"], - [cs_host_os_normalized='Win32']) - ;; - unix) - AC_DEFINE([CS_PLATFORM_UNIX], [], - [Define when compiling for Unix and Unix-like (i.e. MacOS/X)]) - AS_IF([test -z "$cs_host_os_normalized"], - [cs_host_os_normalized='Unix']) - ;; - esac - - cs_host_os_normalized_uc="AS_TR_CPP([$cs_host_os_normalized])" - CS_JAMCONFIG_PROPERTY([TARGET.OS], [$cs_host_os_normalized_uc]) - CS_JAMCONFIG_PROPERTY([TARGET.OS.NORMALIZED], [$cs_host_os_normalized]) -]) - -AC_DEFUN([_CS_CHECK_HOST_DARWIN], - [AC_REQUIRE([CS_PROG_CC]) - AC_REQUIRE([CS_PROG_CXX]) - - # Both MacOS/X and Darwin are identified via $host_os as "darwin". We need - # a way to distinguish between the two. If Carbon.h is present, then - # assume MacOX/S; if not, assume Darwin. If --with-x=yes was invoked, and - # Carbon.h is present, then assume that user wants to cross-build for - # Darwin even though build host is MacOS/X. - # IMPLEMENTATION NOTE *1* - # The QuickTime 7.0 installer removes , which - # causes #include to fail unconditionally. Re-installing - # the QuickTime SDK should restore the header, however not all developers - # know to do this, so we work around the problem of the missing - # CarbonSound.h by #defining __CARBONSOUND__ in the test in order to - # prevent Carbon.h from attempting to #include the missing header. - # IMPLEMENTATION NOTE *2* - # At least one MacOS/X user switches between gcc 2.95 and gcc 3.3 with a - # script which toggles the values of CC, CXX, and CPP. Unfortunately, CPP - # was being set to run the preprocessor directly ("cpp", for instance) - # rather than running it via the compiler ("gcc -E", for instance). The - # problem with running the preprocessor directly is that __APPLE__ and - # __GNUC__ are not defined, which causes the Carbon.h check to fail. We - # avoid this problem by supplying a non-empty fourth argument to - # AC_CHECK_HEADER(), which causes it to test compile the header only (which - # is a more robust test), rather than also testing it via the preprocessor. - - AC_DEFINE([__CARBONSOUND__], [], - [Avoid problem caused by missing ]) - AC_CHECK_HEADER([Carbon/Carbon.h], - [cs_host_macosx=yes], [cs_host_macosx=no], [/* force compile */]) - - AS_IF([test $cs_host_macosx = yes], - [AC_MSG_CHECKING([for --with-x]) - AS_IF([test "${with_x+set}" = set && test "$with_x" = "yes"], - [AC_MSG_RESULT([yes (assume Darwin)]) - cs_host_macosx=no], - [AC_MSG_RESULT([no])])]) - - AS_IF([test $cs_host_macosx = yes], - [cs_host_target=macosx - cs_host_family=unix - cs_host_os_normalized='MacOS/X' - AC_DEFINE([CS_PLATFORM_MACOSX], [], - [Define when compiling for MacOS/X]) - - AC_CACHE_CHECK([for Objective-C compiler], [cs_cv_prog_objc], - [cs_cv_prog_objc="$CC"]) - CS_JAMCONFIG_PROPERTY([CMD.OBJC], [$cs_cv_prog_objc]) - AC_CACHE_CHECK([for Objective-C++ compiler], [cs_cv_prog_objcxx], - [cs_cv_prog_objcxx="$CXX"]) - CS_JAMCONFIG_PROPERTY([CMD.OBJC++], [$cs_cv_prog_objcxx])], - - [cs_host_target=unix - cs_host_family=unix])]) -# diagnose.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS]) -# A convenience wrapper for AC_MSG_ERROR() which invokes AC_CACHE_SAVE() -# before aborting the script. Saving the cache should make subsequent -# re-invocations of the configure script faster once the user has -# corrected the problem(s) which caused the failure. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_MSG_ERROR], - [AC_CACHE_SAVE - AC_MSG_ERROR([$1], [$2])]) -# embed.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003,2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_META_INFO_EMBED([EMITTER], [GPL-OKAY]) -# Determine if plugin meta-information should be embedded or if it should -# exist in a stand-alone .csplugin file, and check if necessary tools and -# libraries are present. Sets the shell variable -# enable_meta_info_embedding to "yes" if the user requested embedding or -# if it was enabled by default; otherwise sets it to "no". -# -# If EMITTER is provided, then a subset of the following variables -# (depending upon platform and availability) are recorded by invoking -# CS_EMIT_BUILD_PROPERTY() with EMITTER. As a convenience, if EMITTER is -# the literal value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s -# default emitter will be used. -# -# EMBED_META := yes or no -# EMBED_META.CFLAGS := compiler flags -# EMBED_META.LFLAGS := linker flags -# CMD.WINDRES := windres.exe -# OBJCOPY.AVAILABLE := yes or no -# CMD.OBJCOPY := objcopy.exe -# LIBBFD.AVAILABLE := yes or no -# LIBBFD.CFLAGS := libbfd compiler flags -# LIBBFD.LFLAGS := libbfd linker flags -# ELF.AVAILABLE := yes or no -# -# In general, clients need only concern themselves with the various -# EMBED_META-related variables. For building plugin modules, utilize -# EMBED_META.CFLAGS when compiling, and EMBED_META.LFLAGS when linking. -# -# On Unix, when CS' own ELF metadata reader can't be used (because the -# necessary header file elf.h was not found) embedding is accomplished -# via libbfd, which carries a GPL license. Projects which carry licenses -# not compatible with GPL should consider carefully before enabling -# embedding on Unix. If your project is GPL-compatible, then set GPL-OKAY -# to "yes". This will indicate that it is safe to use libbfd if the ELF -# reader can not be used. If your project is not GPL-compatible, then -# set it to "no" in order to disable embedding on Unix if the ELF reader -# is not usable. (The user can still manually override the setting via -# the --enable-meta-info-embedding option.) -# -# IMPLEMENTATION NOTES -# -# Recent versions of Mingw supply libbfd and libiberty. Since Crystal -# Space uses native Win32 API for meta-information embedding on Windows, -# we do not require these libraries on Windows. More importantly, users -# do not want to see these GPL-licensed libraries appear in the link -# statement for plugin modules, thus we explicitly disable the libbfd -# test on Windows. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_META_INFO_EMBED], - [AC_REQUIRE([AC_CANONICAL_HOST]) - _CS_META_INFO_EMBED_ENABLE([$1], [$2]) - AS_IF([test $enable_meta_info_embedding = yes], - [_CS_META_INFO_EMBED_TOOLS([$1]) - AS_IF([test $cs_header_elf_h = yes], - [CS_EMIT_BUILD_PROPERTY([ELF.AVAILABLE], [yes], [], [], - CS_EMITTER_OPTIONAL([$1]))], - [case $host_os in - mingw*|cygwin*) ;; - *) - CS_CHECK_LIBBFD([$1], - [CS_EMIT_BUILD_PROPERTY([EMBED_META.CFLAGS], - [$cs_cv_libbfd_ok_cflags], [+], [], - CS_EMITTER_OPTIONAL([$1])) - CS_EMIT_BUILD_PROPERTY([EMBED_META.LFLAGS], - [$cs_cv_libbfd_ok_lflags $cs_cv_libbfd_ok_libs], - [+], [], CS_EMITTER_OPTIONAL([$1]))]) - ;; - esac])])]) - - -#------------------------------------------------------------------------------ -# _CS_META_INFO_EMBED_ENABLE([EMITTER], [GPL-OKAY]) -# Helper for CS_META_INFO_EMBED which adds an -# --enable-meta-info-embedding option to the configure script allowing -# the user to control embedding. Sets the shell variable -# enable_meta_info_embedding to yes or no. -# -# IMPLEMENTATION NOTES -# -# On Unix, embedding is enabled by default if elf.h is found and disabled -# by default unless overridden via GPL-OKAY because libbfd carries a GPL -# license which may be incompatible with a project's own license (such as -# LGPL). -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_META_INFO_EMBED_ENABLE], - [AC_REQUIRE([CS_CHECK_HOST]) - AC_CHECK_HEADERS([elf.h], [cs_header_elf_h=yes], [cs_header_elf_h=no]) - AC_MSG_CHECKING([whether to embed plugin meta-information]) - case $cs_host_target in - unix) AS_IF([test $cs_header_elf_h = yes], - [cs_embed_meta_info_default=yes], - [cs_embed_meta_info_default=m4_ifval([$2],[$2],[no])]) ;; - *) cs_embed_meta_info_default=yes ;; - esac - AC_ARG_ENABLE([meta-info-embedding], - [AC_HELP_STRING([--enable-meta-info-embedding], - [store plugin meta-information directly inside plugin modules if - supported by platform; if disabled, meta-information is stored in - stand-alone .csplugin files; this option is enabled by default for - non-Unix platforms and on Unix platforms with ELF-format object - files; it is disabled by default on Unix platforms if ELF is not - available and the project uses a non-GPL-compatible license (such - as LGPL) since the non-ELF Unix embedding technology requires the - GPL-licensed libbfd library; if ELF is not available, enable this - option on Unix only if you are certain you want a GPL-licensed - library infecting your project])], - [], [enable_meta_info_embedding=$cs_embed_meta_info_default]) - AC_MSG_RESULT([$enable_meta_info_embedding]) - CS_EMIT_BUILD_PROPERTY([EMBED_META], [$enable_meta_info_embedding], - [], [], CS_EMITTER_OPTIONAL([$1]))]) - - - -#------------------------------------------------------------------------------ -# _CS_META_INFO_EMBED_TOOLS([EMITTER]) -# Helper for CS_META_INFO_EMBED() which searches for tools required for -# plugin meta-info embedding. -#------------------------------------------------------------------------------ -AC_DEFUN([_CS_META_INFO_EMBED_TOOLS], - [CS_CHECK_TOOLS([WINDRES], [windres]) - CS_EMIT_BUILD_PROPERTY([CMD.WINDRES], [$WINDRES], [], [], - CS_EMITTER_OPTIONAL([$1])) - - CS_CHECK_TOOLS([OBJCOPY], [objcopy]) - AS_IF([test -n "$OBJCOPY"], - [CS_EMIT_BUILD_PROPERTY([OBJCOPY.AVAILABLE], [yes], [], [], - CS_EMITTER_OPTIONAL([$1])) - CS_EMIT_BUILD_PROPERTY([CMD.OBJCOPY], [$OBJCOPY], [], [], - CS_EMITTER_OPTIONAL([$1]))])]) - - - -#------------------------------------------------------------------------------ -# CS_CHECK_LIBBFD([EMITTER], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# Exhaustive check for a usable GPL-licensed libbfd, the Binary File -# Descriptor library, a component of binutils, which allows low-level -# manipulation of executable and object files. If EMITTER is provided, -# then the following variables are recorded by invoking -# CS_EMIT_BUILD_PROPERTY() with EMITTER. As a convenience, if EMITTER is -# the literal value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s -# default emitter will be used. -# -# LIBBFD.AVAILABLE := yes or no -# LIBBFD.CFLAGS := libbfd compiler flags -# LIBBFD.LFLAGS := libbfd linker flags -# -# The shell variable cs_cv_libbfd_ok is set to yes if a usable libbfd was -# discovered, else no. If found, the additional shell variables -# cs_cv_libbfd_ok_cflags, cs_cv_libbfd_ok_lflags, and -# cs_cv_libbfd_ok_libs are also set. -# -# WARNING -# -# libbfd carries a GPL license which is incompatible with the LGPL -# license of Crystal Space. Do not use this library with projects under -# less restrictive licenses, such as LGPL. -# -# IMPLEMENTATION NOTES -# -# It seems that some platforms have two version of libiberty installed: -# one from binutils and one from gcc. The binutils version resides in -# /usr/lib, whereas the gcc version resides in the gcc installation -# directory. The gcc version, by default, takes precedence at link time -# over the binutils version. Unfortunately, in broken cases, the gcc -# version of libiberty is missing htab_create_alloc() which is required -# by some libbfd functions. The extensive secondary check of libbfd -# catches this anomalous case of broken gcc libiberty. It turns out that -# it is possible to make the linker prefer the binutils version by -# specifying -L/usr/lib, thus the extensive test attempts to do so in an -# effort to resolve this unfortunate issue. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_LIBBFD], - [CS_CHECK_LIB_WITH([bfd], - [AC_LANG_PROGRAM([[#include ]], [bfd_init();])], - [], [], [], [], [], [], [-liberty]) - - AS_IF([test $cs_cv_libbfd = yes], - [CS_CHECK_BUILD([if libbfd is usable], [cs_cv_libbfd_ok], - [AC_LANG_PROGRAM([[#include ]], - [bfd* p; - asection* s; - bfd_init(); - p = bfd_openr(0,0); - bfd_check_format(p,bfd_object); - bfd_get_section_by_name(p,0); - bfd_section_size(p,s); - bfd_get_section_contents(p,s,0,0,0); - bfd_close(p);])], - [CS_CREATE_TUPLE() CS_CREATE_TUPLE([],[-L/usr/lib],[])], - [], [], [], [], - [$cs_cv_libbfd_cflags], - [$cs_cv_libbfd_lflags], - [$cs_cv_libbfd_libs])], - [cs_cv_libbfd_ok=no]) - - AS_IF([test $cs_cv_libbfd_ok = yes], - [CS_EMIT_BUILD_RESULT([cs_cv_libbfd_ok], [LIBBFD], - CS_EMITTER_OPTIONAL([$1])) - $2], - [$3])]) -# emit.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003-2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_EMIT_BUILD_PROPERTY(KEY, VALUE, [APPEND], [EMPTY-OKAY], [EMITTER], -# [UNCONDITIONAL]) -# A utility function which invokes an emitter to record the KEY/VALUE -# tuple if VALUE is not the empty string (after leading and trailing -# whitespace is stripped). If EMPTY-OKAY is not an empty string, then the -# property is emitted even if VALUE is empty; that is, it is emitted -# unconditionally. If APPEND is the empty string, then the emitter sets -# the key's value directly (though it may be overridden by the -# environment), otherwise the emitter appends VALUE to the existing value -# of the key. EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or -# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the -# KEY/VALUE tuple; it should also accept APPEND as an optional third -# argument. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. Some -# emitters accept an optional fourth argument, UNCONDITIONAL, which -# instructs it to set KEY's value unconditionally, even if KEY already -# had been assigned a value via some other mechanism (such as imported -# from the environment, or from Jambase, in the case of -# CS_JAMCONFIG_PROPERTY). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_EMIT_BUILD_PROPERTY], - [cs_build_prop_val="$2" - cs_build_prop_val=CS_TRIM([$cs_build_prop_val]) - m4_ifval([$4], - [CS_JAMCONFIG_PROPERTY([$1], [$cs_build_prop_val], [$3])], - AS_IF([test -n "$cs_build_prop_val"], - [m4_default([$5],[CS_JAMCONFIG_PROPERTY])( - [$1], [$cs_build_prop_val], [$3], [$6])]))]) - - - -#------------------------------------------------------------------------------ -# CS_EMIT_BUILD_RESULT(CACHE-VAR, PREFIX, [EMITTER]) -# Record the results of CS_CHECK_BUILD() or CS_CHECK_LIB_WITH() via some -# emitter. If CACHE-VAR indicates that the build succeeded, then the -# following properties are emitted: -# -# PREFIX.AVAILABLE = yes -# PREFIX.CFLAGS = $CACHE-VAR_cflags -# PREFIX.LFLAGS = $CACHE-VAR_lflags $CACHE-VAR_libs -# -# EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or -# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the -# KEY/VALUE tuple. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_EMIT_BUILD_RESULT], - [AS_IF([test "$$1" = yes], - [CS_EMIT_BUILD_PROPERTY([$2.AVAILABLE], [yes], [], [], [$3]) - CS_EMIT_BUILD_PROPERTY([$2.CFLAGS], [$$1_cflags], [], [], [$3]) - CS_EMIT_BUILD_PROPERTY([$2.LFLAGS], [$$1_lflags $$1_libs], - [], [], [$3])])]) - - - -#------------------------------------------------------------------------------ -# CS_EMIT_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE], EMITTER-KEY, -# [APPEND], [ACTION-IF-RECOGNIZED], -# [ACTION-IF-NOT-RECOGNIZED], [EMITTER]) -# A convenience wrapper for CS_CHECK_BUILD_FLAGS() which also records the -# results via CS_EMIT_BUILD_PROPERTY(). Checks if the compiler or linker -# recognizes a command-line option. MESSAGE is the "checking" message. -# CACHE-VAR is the shell cache variable which receives the flag -# recognized by the compiler or linker, or "no" if the flag was not -# recognized. FLAGS is a whitespace- delimited list of build tuples -# created with CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in -# order until one is found which is recognized by the compiler. After -# that, no further flags are checked. LANGUAGE is typically either C or -# C++ and specifies which compiler to use for the test. If LANGUAGE is -# omitted, C is used. EMITTER-KEY is the name to pass as the emitter's -# "key" argument if a usable flag is encountered. If APPEND is not the -# empty string, then the discovered flag is appended to the existing -# value of the EMITTER-KEY. If the command-line option was recognized, -# then ACTION-IF-RECOGNIZED is invoked, otherwise -# ACTION-IF-NOT-RECOGNIZED is invoked. EMITTER is a macro name, such as -# CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs the -# actual task of emitting the KEY/VALUE tuple; it should also accept -# APPEND as an optional third argument. If EMITTER is omitted, -# CS_JAMCONFIG_PROPERTY is used. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_EMIT_BUILD_FLAGS], - [CS_CHECK_BUILD_FLAGS([$1], [$2], [$3], [$4], - [CS_EMIT_BUILD_PROPERTY([$5], [$$2], [$6], [], [$9]) - $7], - [$8])]) - - - -#------------------------------------------------------------------------------ -# CS_EMITTER_OPTIONAL([EMITTER]) -# The CS_EMIT_FOO() macros optionally accept an emitter. If no emitter is -# supplied to those macros, then a default emitter is chosen. Other -# macros, however, which perform testing and optionally emit the results -# may wish to interpret an omitted EMITTER as a request not to emit the -# results. CS_EMITTER_OPTIONAL() is a convenience macro to help in these -# cases. It should be passed to one of the CS_EMIT_FOO() macros in place -# of the literal EMITTER argument. It functions by re-interpretating -# EMITTER as follows: -# -# - If EMITTER is omitted, then CS_NULL_EMITTER is returned, effectively -# disabling output by the CS_EMIT_FOO() macro. -# - If EMITTER is the literal string "emit" or "yes", then it returns an -# empty string, which signals to the CS_EMIT_FOO() macro that is should -# use its default emitter. -# - Any other value for EMITTER is passed along as-is to the -# CS_EMIT_FOO() macro. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_EMITTER_OPTIONAL], - [m4_case([$1], - [], [[CS_NULL_EMITTER]], - [emit], [], - [yes], [], - [[$1]])]) - - - -#------------------------------------------------------------------------------ -# CS_NULL_EMITTER(KEY, VALUE, [APPEND]) -# A do-nothing emitter suitable for use as the EMITTER argument of one of -# the CS_EMIT_FOO() macros. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_NULL_EMITTER], [: -]) - - - -#------------------------------------------------------------------------------ -# CS_SUBST_EMITTER(KEY, VALUE, [APPEND]) -# An emitter wrapped around AC_SUBST(). Invokes -# AC_SUBST(AS_TR_SH(KEY),VALUE). The APPEND argument is ignored. -# Suitable for use as the EMITTER argument of one of the CS_EMIT_FOO() -# macros. The call to AS_TR_SH() ensures that KEY is transformed into a -# valid shell variable. For instance, if a macro attempts to emit -# MYLIB.CFLAGS and MYLIB.LFLAGS via CS_SUBST_EMITTER(), then the names -# will be transformed to MYLIB_CFLAGS and MYLIB_LFLAGS, respectively, for -# the invocation of AC_SUBST(). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_SUBST_EMITTER], [AC_SUBST(AS_TR_SH([$1]),[$2])]) - - - -#------------------------------------------------------------------------------ -# CS_DEFINE_EMITTER(KEY, VALUE, [APPEND]) -# An emitter wrapped around AC_DEFINE_UNQUOTED(). Invokes -# AC_DEFINE_UNQUOTED(AS_TR_CPP(KEY),VALUE). The APPEND argument is -# ignored. Suitable for use as the EMITTER argument of one of the -# CS_EMIT_FOO() macros. The call to AS_TR_CPP() ensures that KEY is a -# well-formed token for the C-preprocessor. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_DEFINE_EMITTER], - [AC_DEFINE_UNQUOTED(AS_TR_CPP([$1]),[$2], - [Define when feature is available])]) -# headercache.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# Text cache facility for C-style #define properties. The cache is stored in -# the shell variable cs_header_text. -# -# CS_HEADER_APPEND(TEXT) -# Append text to the C header text cache. This is a cover for -# CS_TEXT_CACHE_APPEND(). -# -# CS_HEADER_PREPEND(TEXT) -# Prepend text to the C header text cache. This is a cover for -# CS_TEXT_CACHE_PREPEND(). -# -# CS_HEADER_PROPERTY(KEY, [VALUE]) -# Append a line of the form "#define KEY VALUE" to the C header text -# cache. If the VALUE argument is omitted, then the appended line has -# the simplified form "#define KEY". -# -# CS_HEADER_OUTPUT(FILENAME) -# Instruct config.status to write the C header text cache to the given -# filename. This is a cover for CS_TEXT_CACHE_OUTPUT(). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_HEADER_APPEND], [CS_TEXT_CACHE_APPEND([cs_header_text], [$1])]) -AC_DEFUN([CS_HEADER_PREPEND], [CS_TEXT_CACHE_PREPEND([cs_header_text], [$1])]) -AC_DEFUN([CS_HEADER_PROPERTY], -[CS_HEADER_APPEND([@%:@define $1[]m4_ifval([$2], [ $2], []) -])]) -AC_DEFUN([CS_HEADER_OUTPUT], [CS_TEXT_CACHE_OUTPUT([cs_header_text], [$1])]) -#----------------------------------------------------------------------------- -# installdirs.m4 (c) Matze Braun -# Macro for emitting the installation paths gathered by Autoconf. -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# CS_OUTPUT_INSTALLDIRS([EMITTER], [RAW-BACKSLASHES]) -# Emit installation directories collected by Autoconf. EMITTER is a macro -# name, such as CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs -# the actual task of emitting the KEY/VALUE tuple. If EMITTER is omitted, -# CS_JAMCONFIG_PROPERTY is used. If RAW-BACKSLASHES is not provided, then -# backslashes in emitted values are each escaped with an additional -# backslash. If RAW-BACKSLASHES is not the null value, then backslashes are -# emitted raw. The following properties are emitted: -# -# prefix -# exec_prefix -# bindir -# sbindir -# libexecdir -# datadir -# sysconfdir -# sharedstatedir -# localstatedir -# libdir -# includedir -# oldincludedir -# infodir -# mandir -#----------------------------------------------------------------------------- -AC_DEFUN([CS_OUTPUT_INSTALLDIRS],[ -# Handle the case when no prefix is given, and the special case when a path -# contains more than 2 slashes, these paths seem to be correct but Jam fails -# on them. -AS_IF([test $prefix = NONE], - [cs_install_prefix="$ac_default_prefix"], - [cs_install_prefix=`echo "$prefix" | sed -e 's:///*:/:g'`]) -AS_IF([test $exec_prefix = NONE], - [cs_install_exec_prefix="AS_ESCAPE([$(prefix)])"], - [cs_install_exec_prefix=`echo "$exec_prefix" | sed -e 's:///*:/:g'`]) - -_CS_OUTPUT_INSTALL_DIRS([$1], [prefix], - [CS_PREPARE_INSTALLPATH([$cs_install_prefix], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [exec_prefix], - [CS_PREPARE_INSTALLPATH([$cs_install_exec_prefix], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [bindir], - [CS_PREPARE_INSTALLPATH([$bindir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [sbindir], - [CS_PREPARE_INSTALLPATH([$sbindir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [libexecdir], - [CS_PREPARE_INSTALLPATH([$libexecdir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [datadir], - [CS_PREPARE_INSTALLPATH([$datadir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [sysconfdir], - [CS_PREPARE_INSTALLPATH([$sysconfdir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [sharedstatedir], - [CS_PREPARE_INSTALLPATH([$sharedstatedir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [localstatedir], - [CS_PREPARE_INSTALLPATH([$localstatedir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [libdir], - [CS_PREPARE_INSTALLPATH([$libdir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [includedir], - [CS_PREPARE_INSTALLPATH([$includedir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [oldincludedir], - [CS_PREPARE_INSTALLPATH([$oldincludedir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [infodir], - [CS_PREPARE_INSTALLPATH([$infodir], [$2])]) -_CS_OUTPUT_INSTALL_DIRS([$1], [mandir], - [CS_PREPARE_INSTALLPATH([$mandir], [$2])]) -]) - -AC_DEFUN([_CS_OUTPUT_INSTALL_DIRS], - [m4_default([$1], [CS_JAMCONFIG_PROPERTY])([$2], [$3])]) - - -#----------------------------------------------------------------------------- -# CS_PREPARE_INSTALLPATH(VALUE, [RAW-BACKSLASHES]) -# Transform variable references of the form ${bla} to $(bla) in VALUE and -# correctly quotes backslashes. This is needed if you need to emit some of -# the paths from Autoconf. RAW-BACKSLASHES has the same meaning as in -# CS_OUTPUT_INSTALLDIRS. -#----------------------------------------------------------------------------- -AC_DEFUN([CS_PREPARE_INSTALLPATH], -[`echo "$1" | sed 's/\${\([[a-zA-Z_][a-zA-Z_]]*\)}/$(\1)/g;m4_ifval([$2], - [s/\\/\\\\/g], [s/\\\\/\\\\\\\\/g])'`]) -# jamcache.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# Text cache facility for Jam-style properties. The cache is stored in -# the shell variable cs_jamfile_text. -# -# CS_JAMCONFIG_APPEND(TEXT) -# Append text to the Jam text cache. This is a cover for -# CS_TEXT_CACHE_APPEND(). -# -# CS_JAMCONFIG_PREPEND(TEXT) -# Prepend text to the Jam text cache. This is a cover for -# CS_TEXT_CACHE_PREPEND(). -# -# CS_JAMCONFIG_PROPERTY(KEY, VALUE, [APPEND], [UNCONDITIONAL]) -# Append a line of the form "KEY ?= VALUE" to the Jam text cache. If the -# APPEND argument is not the empty string, then VALUE is appended to the -# existing value of KEY using the form "KEY += VALUE". If the -# UNCONDITIONAL argument is not empty, then the value of KEY is set -# unconditionally "KEY = VALUE", rather than via "KEY ?= VALUE". APPEND -# takes precedence over UNCONDITIONAL. Note that if VALUE references -# other Jam variables, for example $(OBJS), then be sure to protect the -# value with AS_ESCAPE(). For example: -# CS_JAMCONFIG_PROPERTY([ALLOBJS], [AS_ESCAPE([$(OBJS) $(LIBOBJS)])]) -# -# CS_JAMCONFIG_OUTPUT(FILENAME) -# Instruct config.status to write the Jam text cache to the given -# filename. This is a cover for CS_TEXT_CACHE_OUTPUT(). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_JAMCONFIG_APPEND], - [CS_TEXT_CACHE_APPEND([cs_jamconfig_text], [$1])]) -AC_DEFUN([CS_JAMCONFIG_PREPEND], - [CS_TEXT_CACHE_PREPEND([cs_jamconfig_text], [$1])]) -AC_DEFUN([CS_JAMCONFIG_PROPERTY], - [CS_JAMCONFIG_APPEND( - [$1 m4_ifval([$3], [+=], m4_ifval([$4], [=], [?=])) \"$2\" ; -])]) -AC_DEFUN([CS_JAMCONFIG_OUTPUT], - [CS_TEXT_CACHE_OUTPUT([cs_jamconfig_text], [$1])]) -# makecache.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# Text cache facility for makefile-style properties. The cache is stored in -# the shell variable cs_makefile_text. -# -# CS_MAKEFILE_APPEND(TEXT) -# Append text to the makefile text cache. This is a cover for -# CS_TEXT_CACHE_APPEND(). -# -# CS_MAKEFILE_PREPEND(TEXT) -# Prepend text to the makefile text cache. This is a cover for -# CS_TEXT_CACHE_PREPEND(). -# -# CS_MAKEFILE_PROPERTY(KEY, VALUE, [APPEND]) -# Append a line of the form "KEY = VALUE" to the makefile text cache. If -# the APPEND argument is not the empty string, then VALUE is appended to -# the existing value of KEY using the form "KEY += VALUE". Note that if -# VALUE references other makefile variables, for example $(OBJS), then be -# sure to protect the value with AS_ESCAPE(). For example: -# CS_MAKEFILE_PROPERTY([ALLOBJS], [AS_ESCAPE([$(OBJS) $(LIBOBJS)])]) -# -# CS_MAKEFILE_OUTPUT(FILENAME) -# Instruct config.status to write the makefile text cache to the given -# filename. This is a cover for CS_TEXT_CACHE_OUTPUT(). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_MAKEFILE_APPEND], - [CS_TEXT_CACHE_APPEND([cs_makefile_text], [$1])]) -AC_DEFUN([CS_MAKEFILE_PREPEND], - [CS_TEXT_CACHE_PREPEND([cs_makefile_text], [$1])]) -AC_DEFUN([CS_MAKEFILE_PROPERTY], - [CS_MAKEFILE_APPEND([$1 m4_ifval([$3], [+=], [=]) $2 -])]) -AC_DEFUN([CS_MAKEFILE_OUTPUT],[CS_TEXT_CACHE_OUTPUT([cs_makefile_text], [$1])]) -# mkdir.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_CHECK_MKDIR -# Determine how to create a directory and a directory tree. Sets the -# shell variable MKDIR to the command which creates a directory, and -# MKDIRS to the command which creates a directory tree. Invokes -# AC_SUBST() for MKDIR and MKDIRS. -# -# IMPLEMENTATION NOTES -# We need to know the exact commands, so that we can emit them, thus the -# AS_MKDIR_P function is not what we want to use here since it does not -# provide access to the commands (and might not even discover suitable -# commands). First try "mkdir -p", then try the older "mkdirs". -# Finally, if the mkdir command failed to recognize -p, then it might -# have created a directory named "-p", so clean up that bogus directory. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_CHECK_MKDIR], - [AC_CACHE_CHECK([how to create a directory], [cs_cv_shell_mkdir], - [cs_cv_shell_mkdir='mkdir']) - AC_SUBST([MKDIR], [$cs_cv_shell_mkdir]) - - AC_CACHE_CHECK([how to create a directory tree], [cs_cv_shell_mkdir_p], - [if $cs_cv_shell_mkdir -p . 2>/dev/null; then - cs_cv_shell_mkdir_p='mkdir -p' - elif mkdirs . 2>/dev/null; then - cs_cv_shell_mkdir_p='mkdirs' - fi - test -d ./-p && rmdir ./-p]) - AS_VAR_SET_IF([cs_cv_shell_mkdir_p], - [AC_SUBST([MKDIRS], [$cs_cv_shell_mkdir_p])], - [CS_MSG_ERROR([do not know how to create a directory tree])])]) - - - -#------------------------------------------------------------------------------ -# Replacement for AS_MKDIR_P() from m4sugar/m4sh.m4 which fixes two problems -# which are present in Autoconf 2.57 and probably all earlier 2.5x versions. -# This bug, along with a patch, was submitted to the Autoconf GNATS database by -# Eric Sunshine as #227 on 17-Dec-2002. The bogus "-p" directory bug was fixed -# for Autoconf 2.58 on 26-Sep-2003. The "mkdirs" optimization was not accepted -# (since it is unnecessary; it's only an optimization). -# -# 1) Removes bogus "-p" directory which the stock AS_MKDIR_P() leaves laying -# around in the working directory if the mkdir command does not recognize -# the -p option. -# 2) Takes advantage of the older "mkdirs" program if it exists and if "mkdir -# -p" does not work. -#------------------------------------------------------------------------------ -m4_defun([_AS_MKDIR_P_PREPARE], -[if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p' -elif mkdirs . 2>/dev/null; then - as_mkdir_p='mkdirs' -else - as_mkdir_p='' -fi -test -d ./-p && rmdir ./-p -])# _AS_MKDIR_P_PREPARE - -m4_define([AS_MKDIR_P], -[AS_REQUIRE([_$0_PREPARE])dnl -{ if test -n "$as_mkdir_p"; then - $as_mkdir_p $1 - else - as_dir=$1 - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`AS_DIRNAME("$as_dir")` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || AS_ERROR([cannot create directory $1]); } -])# AS_MKDIR_P -#============================================================================== -# packageinfo.m4 -# Macros for setting general info on the package, such as name and version -# numbers and propagate them to the generated make and Jam property files. -# -# Copyright (C)2003 by Matthias Braun -# Copyright (C)2003,2004 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== - -#------------------------------------------------------------------------------ -# CS_PACKAGEINFO([LONGNAME], [COPYRIGHT, [HOMEPAGE]) -# Set additional information for the package. Note that the version -# number of your application should only contain numbers, because on -# Windows you can only set numerical values in some of the file -# properties (such as versioninfo .rc files). -#------------------------------------------------------------------------------ -AC_DEFUN([CS_PACKAGEINFO], - [PACKAGE_LONGNAME="[$1]" - PACKAGE_COPYRIGHT="[$2]" - PACKAGE_HOMEPAGE="[$3]" -]) - - -#------------------------------------------------------------------------------ -# CS_EMIT_PACKAGEINFO([EMITTER]) -# Emit extended package information using the provided EMITTER. EMITTER -# is a macro name, such as CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, -# which performs the actual task of emitting the KEY/VALUE tuple. If -# EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. For backward -# compatibility, if EMITTER is the literal value "jam", then -# CS_JAMCONFIG_PROPERTY is used; if it is "make", then -# CS_MAKEFILE_PROPERTY is used; however use of these literal names is -# highly discouraged. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_EMIT_PACKAGEINFO], - [_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_NAME], [$PACKAGE_NAME]) - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_VERSION], [$PACKAGE_VERSION]) - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_STRING], [$PACKAGE_STRING]) - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_BUGREPORT], [$PACKAGE_BUGREPORT]) - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_LONGNAME], [$PACKAGE_LONGNAME]) - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_HOMEPAGE], [$PACKAGE_HOMEPAGE]) - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_COPYRIGHT], [$PACKAGE_COPYRIGHT]) - for cs_veritem in m4_translit(AC_PACKAGE_VERSION, [.], [ ]); do - _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_VERSION_LIST], [$cs_veritem], [+]) - done - ]) - -AC_DEFUN([_CS_EMIT_PACKAGEINFO], - [m4_case([$1], - [make], [CS_MAKEFILE_PROPERTY([$2], [$3], [$4])], - [jam], [CS_JAMCONFIG_PROPERTY([$2], [$3], [$4])], - [], [CS_JAMCONFIG_PROPERTY([$2], [$3], [$4])], - [$1([$2], [$3], [$4])])]) -# path.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2004 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_PATH_NORMALIZE(STRING) -# Normalize a pathname at run-time by transliterating Windows/DOS -# backslashes to forward slashes. Also collapses whitespace. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_PATH_NORMALIZE], -[`echo "x$1" | tr '\\\\' '/' | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`]) - - -#------------------------------------------------------------------------------ -# CS_RUN_PATH_NORMALIZE(COMMAND) -# Normalize the pathname emitted by COMMAND by transliterating -# Windows/DOS backslashes to forward slashes. Also collapses whitespace. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_RUN_PATH_NORMALIZE], -[`AC_RUN_LOG([$1]) | tr '\\\\' '/' | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`]) -############################################################################### -# progver.m4 -# Written by Norman Kramer -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -############################################################################### -# -# From the input pattern we create regular expressions we send through sed -# to extract the version information from the standard input to sed. -# Then we extract from the resulting version string subparts. -# The same happens with the supplied version string. It too is split into its -# subparts according to the pattern. -# Then the subparts from the gathered version string and the supplied one are -# compared. -# -# How does the pattern look like ? -# It is a sequence of 9s and _s and separators. -# 9 denotes a non empty sequence of digits. -# _ denotes a non empty sequence of characters from the class [a-zA-Z]. -# | everything behind is optional -# Everything else is treated as a separator. -# Consecutive 9s and _s are compressed to contain only one of each type. -# For instance "99_.9.__abc9_" will become "9_.9._abc9_". -# -# How we find the parts we compare ? -# From this transformed string we yield the parts we will later compare. -# We break up the string as follows: -# Any sequence of separators represent one breakup. Additional breakups are -# placed behind every 9 and _ . -# So the example from above will give: -# -# "99_.9.__abc9_" ===compress==> "9_.9._abc9_" ===breakup==> "9" "_" "9" "_" "9" "_" -# -# How we create the regular expressions ? -# We take the compressed pattern and quote every separator. -# The we replace the 9s with [0-9][0-9]* -# and the _s with [a-zA-Z][a-zA-Z]* . -# The above example will become: -# -# "99_.9.__abc9_" ===compress==> "9_.9._abc9_" ===rexify==> -# [0-9][0-9]*[a-zA-Z][a-zA-Z]*\.[0-9][0-9]*\.[a-zA-Z][a-zA-Z]*\a\b\c[0-9][0-9]*[a-zA-Z][a-zA-Z]* -# -# Voila. -# -# To yield the subparts from the string we additionally enclose the -# 9s and _s with \( and \). -# -############################################################################### - -# **************************************************************** -# ** helper definitions ** -# **************************************************************** -m4_define([CS_VCHK_RUNTH], [m4_pushdef([i], [$1])m4_if($1,0,,[CS_VCHK_RUNTH(m4_decr($1), [$2])][$2])m4_popdef([i])]) -m4_define([CS_VCHK_PREFIX], []) -m4_define([CS_VCHK_SUFFIX], []) -m4_define([CS_VCHK_GROUPPREFIX], [\(]) -m4_define([CS_VCHK_GROUPSUFFIX], [\)]) -m4_define([CS_VCHK_CHAR], [[[[a-zA-Z]]]]) -m4_define([CS_VCHK_DIGIT], [[[0-9]]]) -m4_define([CS_VCHK_SEQUENCE], [CS_VCHK_PREFIX[]CS_VCHK_SINGLE[]CS_VCHK_SINGLE[]*CS_VCHK_SUFFIX[]]) -m4_define([CS_VCHK_OPTSEQUENCE], [CS_VCHK_PREFIX[]CS_VCHK_SINGLE[]*CS_VCHK_SUFFIX[]]) -m4_define([CS_VCHK_REXSEQ], [m4_bpatsubst($1, [$2], [[]CS_VCHK_SEQUENCE[]])]) -m4_define([CS_VCHK_GROUPINGON], [m4_pushdef([CS_VCHK_PREFIX], [CS_VCHK_GROUPPREFIX])m4_pushdef([CS_VCHK_SUFFIX], [CS_VCHK_GROUPSUFFIX])]) -m4_define([CS_VCHK_GROUPINGOFF], [m4_popdef([CS_VCHK_SUFFIX])m4_popdef([CS_VCHK_PREFIX])]) -m4_define([CS_VCHK_OPTON], [m4_pushdef([CS_VCHK_SEQUENCE], [CS_VCHK_OPTSEQUENCE])]) -m4_define([CS_VCHK_OPTOFF], [m4_popdef([CS_VCHK_SEQUENCE])]) -m4_define([CS_VCHK_RMOPT], [CS_VCHK_RMCHAR([$1], m4_index([$1], [|]))]) -m4_define([CS_VCHK_RMCHAR], [m4_if($2,-1,[$1],m4_substr([$1], 0, $2)[]m4_substr([$1], m4_incr($2)))]) -m4_define([CS_VCHK_RMALL], [m4_translit([$1], [|], [])]) -m4_define([CS_VCHK_CUTOFF], [m4_if(m4_index($1,[|]),-1, [$1], [m4_substr($1, 0, m4_index($1,[|]))])]) -m4_define([CS_VCHK_CYCLEOPT], [ -m4_if($2,-1,, [m4_pushdef([i], CS_VCHK_CUTOFF([$1])) m4_pushdef([j], CS_VCHK_DUMMY_TAIL([$1])) CS_VCHK_CYCLEOPT( CS_VCHK_RMOPT([$1]), m4_index($1, [|]), [$3])$3 m4_popdef([i]) m4_popdef([j])]) -]) -m4_define([CS_VCHK_TAIL], [m4_if(m4_index($1,[|]),-1, [], [m4_substr($1, m4_incr(m4_index($1,[|])))])]) -m4_define([CS_VCHK_DUMMY_COMPRESS], [m4_bpatsubst(m4_bpatsubst([$1], [__*], [A]), [99*], [0])]) -m4_define([CS_VCHK_DUMMY_TAIL], [CS_VCHK_DUMMY_COMPRESS(m4_translit(CS_VCHK_TAIL([$1]), [|], []))]) - -# **************************************************************** -# ** FlagsOn / FlagsOff ** -# **************************************************************** -m4_define([CS_VCHK_FLAGSON], -[m4_if($#, 0, [], - $1, [], [], - [$1], [group], [CS_VCHK_GROUPINGON[]], - [$1], [opt], [CS_VCHK_OPTON[]])dnl -m4_if($#, 0, [], $1, [], [], [CS_VCHK_FLAGSON(m4_shift($@))])]) - -m4_define([CS_VCHK_FLAGSOFF], -[m4_if($#, 0, [], - $1, [], [], - $1, [group], [CS_VCHK_GROUPINGOFF[]], - [$1], [opt], [CS_VCHK_OPTOFF[]])dnl -m4_if($#, 0, [], $1, [], [], [CS_VCHK_FLAGSOFF(m4_shift($@))])]) - -# **************************************************************** -# ** rexify / sedify ** -# **************************************************************** -m4_define([CS_VCHK_REXIFY], -[m4_pushdef([CS_VCHK_SINGLE], [$1])dnl -CS_VCHK_FLAGSON(m4_shift(m4_shift(m4_shift($@))))dnl -CS_VCHK_REXSEQ([$3], [$2])dnl -CS_VCHK_FLAGSOFF(m4_shift(m4_shift(m4_shift($@))))dnl -m4_popdef([CS_VCHK_SINGLE])]) - -m4_define([CS_VCHK_QUOTESEP], [m4_bpatsubst($1, [[^9_]], [\\\&])]) - -m4_define([CS_VCHK_REXCHAR], [CS_VCHK_REXIFY([CS_VCHK_CHAR], [__*], $@)]) -m4_define([CS_VCHK_REXDIGIT], [CS_VCHK_REXIFY([CS_VCHK_DIGIT], [99*], $@)]) -m4_define([CS_VCHK_SEDIFY], [CS_VCHK_REXDIGIT([CS_VCHK_REXCHAR([CS_VCHK_QUOTESEP([$1])], m4_shift($@))], m4_shift($@))]) -m4_define([CS_VCHK_SEDEXPRALL], [/CS_VCHK_SEDIFY([$1])/!d;s/.*\(CS_VCHK_SEDIFY([$1])\).*/\1/;q]) -m4_define([CS_VCHK_SEDEXPRNTH], [/CS_VCHK_SEDIFY([$1])/!d;s/.*CS_VCHK_SEDIFY([$1],[group]).*/\$2/]) - -# **************************************************************** -# ** Pattern splitting ** -# **************************************************************** -m4_define([CS_VCHK_SPLITSEP], [CS_VCHK_REXIFY([s], [[^9_][^9_]*], $@)]) -m4_define([CS_VCHK_SPLITDIGIT], [CS_VCHK_REXIFY([d], [99*], $@)]) -m4_define([CS_VCHK_SPLITCHAR], [CS_VCHK_REXIFY([c], [__*], $@)]) - -# **************************************************************** -# ** return a list of 's' 'd' 'c' 'e' chars denoting the kind ** -# ** pattern parts: separator, digit, char, end ** -# **************************************************************** -m4_define([CS_VCHK_PATTERNLIST], [m4_pushdef([CS_VCHK_SEQUENCE], [CS_VCHK_SINGLE ])dnl -m4_translit(CS_VCHK_SPLITDIGIT([CS_VCHK_SPLITCHAR([CS_VCHK_SPLITSEP([$1])])]), [ ], m4_if([$2],[],[ ],[$2]))e[]dnl -m4_popdef([CS_VCHK_SEQUENCE])]) - -# **************************************************************** -# ** Build the shell commands we emit to the configure script. ** -# **************************************************************** -m4_define([CS_VCHK_PATCOUNT], [m4_len(m4_bpatsubst(CS_VCHK_PATTERNLIST([$1]), [[^dc]]))]) - -# **************************************************************************************** -# ** CS_VCHK_EXTRACTVERSION(EXTRACT_CALL, MIN_VERSION, PATTERN, PRGPREFIX, COMPARISION) ** -# **************************************************************************************** -m4_define([CS_VCHK_EXTRACTVERSION], -[cs_prog_$4_is_version= -cs_prog_$4_min_version= -cs_prog_$4_is_suffix= -cs_prog_$4_min_suffix= -cs_prog_$4_is_suffix_done= -cs_prog_$4_min_suffix_done= -CS_VCHK_CYCLEOPT([$3], [], -[test -z $cs_prog_$4_is_version && cs_prog_$4_is_version=`$1 | sed 'CS_VCHK_SEDEXPRALL([i])'` -test -n "$cs_prog_$4_is_version" && test -z $cs_prog_$4_is_suffix_done && { cs_prog_$4_is_suffix_done=yes ; cs_prog_$4_is_suffix=j ; } -]) -CS_VCHK_CYCLEOPT([$3], , -[test -z $cs_prog_$4_min_version && cs_prog_$4_min_version=`echo $2 | sed 'CS_VCHK_SEDEXPRALL([i])'` -test -n "$cs_prog_$4_min_version" && test -z $cs_prog_$4_min_suffix_done && { cs_prog_$4_min_suffix_done=yes ; cs_prog_$4_min_suffix=j ; } -]) -CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])], - [cs_prog_$4_is_ver_[]i=`echo ${cs_prog_$4_is_version}${cs_prog_$4_is_suffix} | sed 'CS_VCHK_SEDEXPRNTH([CS_VCHK_RMALL([$3])], [i])'` -]) -CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])], - [cs_prog_$4_min_ver_[]i=`echo $cs_prog_$4_min_version${cs_prog_$4_min_suffix} | sed 'CS_VCHK_SEDEXPRNTH([CS_VCHK_RMALL([$3])], [i])'` -]) -cs_cv_prog_$4_version_ok='' -CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])], -[test -z "$cs_cv_prog_$4_version_ok" && { expr "$cs_prog_$4_is_ver_[]i" "$5" "$cs_prog_$4_min_ver_[]i" >/dev/null || cs_cv_prog_$4_version_ok=no ; } -test -z "$cs_cv_prog_$4_version_ok" && { expr "$cs_prog_$4_min_ver_[]i" "$5" "$cs_prog_$4_is_ver_[]i" >/dev/null || cs_cv_prog_$4_version_ok=yes ; } -]) -AS_IF([test -z "$cs_cv_prog_$4_version_ok"], [cs_cv_prog_$4_version_ok=yes]) -cs_cv_prog_$4_version_ok_annotated="$cs_cv_prog_$4_version_ok" -AS_IF([test -n "$cs_prog_$4_is_version"], - [cs_cv_prog_$4_version_ok_annotated="$cs_cv_prog_$4_version_ok_annotated (version $cs_prog_$4_is_version)"]) -]) - -############################################################################## -# CS_CHECK_PROG_VERSION(PROG, EXTRACT_CALL, VERSION, PATTERN, -# [ACTION-IF-OKAY], [ACTION-IF-NOT-OKAY], [CMP]) -# Check the version of a program PROG. -# Version information is emitted by EXTRACT_CALL (for instance "bison -V"). -# The discovered program version is compared against VERSION. -# The pattern of the version string matches PATTERN -# The extracted version and the supplied version are compared with the CMP -# operator. i.e. EXTRACTED_VERSION CMP SUPPLIED_VERSION -# CMP defaults to >= if not specified. -# ACTION-IF-OKAY is invoked if comparision yields true, otherwise -# ACTION-IF-NOT-OKAY is invoked. -# -# PATTERN literals: 9 .. marks a non empty sequence of digits -# _ .. marks a non empty sequence of characters from [a-zA-Z] -# | .. everything behind is optional -# .. everything else is taken as separator - it is better -# to not try stuff like space, slash or comma. -# -# The test results in cs_cv_prog_PROG_version_ok being either yes or no. -############################################################################## -AC_DEFUN([CS_CHECK_PROG_VERSION], -[AC_CACHE_CHECK([if $1 version m4_default([$7],[>=]) $3], - [AS_TR_SH([cs_cv_prog_$1_version_ok_annotated])], - [CS_VCHK_EXTRACTVERSION([$2], [$3], [$4], AS_TR_SH([$1]), - m4_default([$7],[>=]))]) -AS_IF([test "$AS_TR_SH([cs_cv_prog_$1_version_ok])" = yes], [$5], [$6])]) -# qualify.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_SYMBOL_QUALIFIER(MESSAGE, CACHE-VAR, QUALIFIERS, [SYMBOL], [LANG], -# [ACTION-IF-ACCEPTED], [ACTION-IF-NOT-ACCEPTED]) -# Test if a symbol can be qualified by one of the elements of the -# comma-separated list of QUALIFIERS. Examples of qualifiers include -# __attribute__((deprecated)), __declspec(dllimport), etc. MESSAGE is the -# "checking" message. CACHE-VAR is the variable which receives the -# qualifier which succeeded, or the the literal "no" if none were -# accepted. SYMBOL is the symbol to which the qualifier should be -# applied. If omitted, then SYMBOL defaults to "void f();". LANG is the -# language of the test, typically "C" or "C++". It defaults to "C" if -# omitted. ACTION-IF-ACCEPTED is invoked after CACHE-VAR is set if one of -# the qualifiers is accepted, else ACTION-IF-NOT-ACCEPTED is invoked. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_SYMBOL_QUALIFIER], - [AC_CACHE_CHECK([$1], [$2], - [$2='no' - m4_foreach([cs_symbol_qualifier], [$3], - [AS_IF([test "$$2" = no], - [CS_BUILD_IFELSE( - [AC_LANG_PROGRAM( - [cs_symbol_qualifier m4_default([$4],[void f()]);], - [])], - [], [$5], [$2='cs_symbol_qualifier'], [$2='no'])])])]) - AS_IF([test $$2 != no], [$6], [$7])]) -# split.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_SPLIT(LINE, [OUTPUT-VARIABLES], [DELIMITER], [FILLER]) -# Split LINE into individual tokens. Tokens are delimited by DELIMITER, -# which is the space character if omitted. OUTPUT-VARIABLES is a -# comma-delimited list of shell variables which should receive the -# extracted tokens. If there are too few tokens to fill the output -# variables, then the excess variables will be assigned the empty string. -# If there are too few output variables, then the excess tokens will be -# ignored. If OUTPUT-VARIABLES is omitted, then the split tokens will be -# assigned to the shell meta-variables $1, $2, $3, etc. When -# OUTPUT-VARIABLES is omitted, FILLER is assigned to meta-variables in -# cases where DELIMITER delimits a zero-length token. FILLER defaults -# to "filler". For example, if DELIMITER is "+" and OUTPUT-VARIABLES is -# omitted, given the line "one++three", $1 will be "one", $2 will be -# "filler", and $3 will be "three". -#------------------------------------------------------------------------------ -AC_DEFUN([CS_SPLIT], - [m4_define([cs_split_filler], m4_default([$4],[filler])) - set cs_split_filler `echo "$1" | awk 'BEGIN { FS="m4_default([$3],[ ])" } - { for (i=1; i <= NF; ++i) - { if ($i == "") print "cs_split_filler"; else print $i } }'` - shift - m4_map([_CS_SPLIT], [$2])]) - -AC_DEFUN([_CS_SPLIT], - [AS_IF([test $[@%:@] -eq 0], [$1=''], - [AS_IF([test "$[1]" = cs_split_filler], [$1=''], [$1=$[1]]) - shift])]) -# textcache.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# Text cache facility. These macros provide a way to incrementally store -# arbitrary text in a shell variable, and to write the saved text to a file. -# -# CS_TEXT_CACHE_APPEND(VARIABLE, TEXT) -# Append text to the contents of the named shell variable. If the text -# contains references to shell variables (such as $foo), then those -# references will be expanded. If expansion is not desired, then protect -# the text with AS_ESCAPE(). -# -# CS_TEXT_CACHE_PREPEND(VARIABLE, TEXT) -# Prepend text to the contents of the named shell variable. If the text -# contains references to shell variables (such as $foo), then those -# references will be expanded. If expansion is not desired, then protect -# the text with AS_ESCAPE(). -# -# CS_TEXT_CACHE_OUTPUT(VARIABLE, FILENAME) -# Instruct config.status to write the contents of the named shell -# variable to the given filename. If the file resides in a directory, -# the directory will be created, if necessary. If the output file -# already exists, and if the cached text is identical to the contents of -# the existing file, then the existing file is left alone, thus its time -# stamp remains unmolested. This heuristic may help to minimize rebuilds -# when the file is listed as a dependency in a makefile. -# -# *NOTE* -# There is a bug in Autoconf 2.57 and probably all earlier 2.5x versions -# which results in errors if AC_CONFIG_COMMANDS is invoked for a `tag' -# which represents a file in a directory which does not yet exist. -# Unfortunately, even invoking AS_MKDIR_P in the `cmd' portion of -# AC_CONFIG_COMMANDS does not solve the problem because the generated -# configure script attempts to access information about the directory -# before AS_MKDIR_P has a chance to create it. This forces us to invoke -# AS_MKDIR_P in the third argument to AC_CONFIG_COMMANDS (the -# `init-cmds') rather than the second (the `cmds'). This is undesirable -# because it means that the directory will be created anytime -# config.status is invoked (even for a simple --help), rather than being -# created only when requested to output the text cache. This bug was -# submitted to the Autoconf GNATS database by Eric Sunshine as #228 on -# 27-Dec-2002. It was fixed for Autoconf 2.58 on 26-Sep-2003. The -# official fix makes the assumption that `tag' always represents a file -# (as opposed to some generic target), and creates the file's directory -# is not present. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_TEXT_CACHE_APPEND], [$1="${$1}$2"]) -AC_DEFUN([CS_TEXT_CACHE_PREPEND], [$1="$2${$1}"]) -AC_DEFUN([CS_TEXT_CACHE_OUTPUT], - [AC_CONFIG_COMMANDS([$2], - [echo $ECHO_N "$$1$ECHO_C" > $tmp/tcache - AS_IF([diff $2 $tmp/tcache >/dev/null 2>&1], - [AC_MSG_NOTICE([$2 is unchanged])], - [rm -f $2 - cp $tmp/tcache $2]) - rm -f $tmp/tcache], - [$1='$$1' - cs_dir=`AS_DIRNAME([$2])` - AS_ESCAPE(AS_MKDIR_P([$cs_dir]), [$`\])])]) -# trim.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2003 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_TRIM(STRING) -# Strip leading and trailing spaces from STRING and collapse internal -# runs of multiple spaces to a single space. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_TRIM], [`echo x$1 | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`]) -# warnings.m4 -*- Autoconf -*- -#============================================================================== -# Copyright (C)2005 by Eric Sunshine -# -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Library General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -# License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; if not, write to the Free Software Foundation, -# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -#============================================================================== -AC_PREREQ([2.56]) - -#------------------------------------------------------------------------------ -# CS_COMPILER_WARNINGS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check how to enable compilation warnings. If LANGUAGE is not provided, -# then `C' is assumed (other options include `C++'). If CACHE-VAR is not -# provided, then it defaults to the name -# "cs_cv_prog_compiler_enable_warnings". If an option for enabling -# warnings (such as `-Wall') is discovered, then it is assigned to -# CACHE-VAR and ACTION-IF-FOUND is invoked; otherwise the empty string is -# assigned to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. -# -# IMPLEMENTATION NOTES -# -# On some platforms, it is more appropriate to use -Wmost rather than -# -Wall even if the compiler understands both, thus we attempt -Wmost -# before -Wall. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_WARNINGS], - [CS_CHECK_BUILD_FLAGS( - [how to enable m4_default([$1],[C]) compilation warnings], - [m4_default([$2],[cs_cv_prog_compiler_enable_warnings])], - [CS_CREATE_TUPLE([-Wmost]) CS_CREATE_TUPLE([-Wall])], - [$1], [$3], [$4])]) - - - -#------------------------------------------------------------------------------ -# CS_COMPILER_ERRORS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check how to promote compilation diganostics from warning to error -# status. If LANGUAGE is not provided, then `C' is assumed (other options -# include `C++'). If CACHE-VAR is not provided, then it defaults to the -# name "cs_cv_prog_compiler_enable_errors". If an option for performing -# this promotion (such as `-Werror') is discovered, then it is assigned -# to CACHE-VAR and ACTION-IF-FOUND is invoked; otherwise the empty string -# is assigned to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_ERRORS], - [CS_CHECK_BUILD_FLAGS( - [how to treat m4_default([$1],[C]) warnings as errors], - [m4_default([$2],[cs_cv_prog_compiler_enable_errors])], - [CS_CREATE_TUPLE([-Werror])], [$1], [$3], [$4])]) - - - -#------------------------------------------------------------------------------ -# CS_COMPILER_IGNORE_UNUSED([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check how to instruct compiler to ignore unused variables and -# arguments. This option may be useful for code generated by tools, such -# as Swig, Bison, and Flex, over which the client has no control, yet -# wishes to compile without excessive diagnostic spew. If LANGUAGE is -# not provided, then `C' is assumed (other options include `C++'). If -# CACHE-VAR is not provided, then it defaults to the name -# "cs_cv_prog_compiler_ignore_unused". If an option (such as -# `-Wno-unused') is discovered, then it is assigned to CACHE-VAR and -# ACTION-IF-FOUND is invoked; otherwise the empty string is assigned to -# CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_IGNORE_UNUSED], - [CS_CHECK_BUILD_FLAGS( - [how to suppress m4_default([$1],[C]) unused variable warnings], - [m4_default([$2],[cs_cv_prog_compiler_ignore_unused])], - [CS_CREATE_TUPLE([-Wno-unused])], [$1], [$3], [$4])]) - - - -#------------------------------------------------------------------------------ -# CS_COMPILER_IGNORE_UNINITIALIZED([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check how to instruct compiler to ignore uninitialized variables. This -# option may be useful for code generated by tools, such as Swig, Bison, -# and Flex, over which the client has no control, yet wishes to compile -# without excessive diagnostic spew. If LANGUAGE is not provided, then -# `C' is assumed (other options include `C++'). If CACHE-VAR is not -# provided, then it defaults to the name -# "cs_cv_prog_compiler_ignore_uninitialized". If an option (such as -# `-Wno-uninitialized') is discovered, then it is assigned to CACHE-VAR -# and ACTION-IF-FOUND is invoked; otherwise the empty string is assigned -# to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_IGNORE_UNINITIALIZED], - [CS_CHECK_BUILD_FLAGS( - [how to suppress m4_default([$1],[C]) uninitialized warnings], - [m4_default([$2], - [cs_cv_prog_compiler_ignore_uninitialized_variables])], - [CS_CREATE_TUPLE([-Wno-uninitialized])], [$1], [$3], [$4])]) - - - -#------------------------------------------------------------------------------ -# CS_COMPILER_IGNORE_PRAGMAS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check how to instruct compiler to ignore unrecognized #pragma -# directives. This option may be useful for code which contains -# unprotected #pragmas which are not understood by all compilers. If -# LANGUAGE is not provided, then `C' is assumed (other options include -# `C++'). If CACHE-VAR is not provided, then it defaults to the name -# "cs_cv_prog_compiler_ignore_unknown_pragmas". If an option (such as -# `-Wno-unknown-pragmas') is discovered, then it is assigned to CACHE-VAR -# and ACTION-IF-FOUND is invoked; otherwise the empty string is assigned -# to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_IGNORE_PRAGMAS], - [CS_CHECK_BUILD_FLAGS( - [how to suppress m4_default([$1],[C]) unknown [#pragma] warnings], - [m4_default([$2],[cs_cv_prog_compiler_ignore_unknown_pragmas])], - [CS_CREATE_TUPLE([-Wno-unknown-pragmas])], [$1], [$3], [$4])]) - - - -#------------------------------------------------------------------------------ -# CS_COMPILER_IGNORE_LONG_DOUBLE([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# Check how to instruct compiler to suppress warnings about `long double' -# usage. This option may be useful for code generated by tools, such as -# Swig, Bison, and Flex, over which the client has no control, yet wishes -# to compile without excessive diagnostic spew. If LANGUAGE is not -# provided, then `C' is assumed (other options include `C++'). If -# CACHE-VAR is not provided, then it defaults to the name -# "cs_cv_prog_compiler_ignore_long_double". If an option (such as -# `-Wno-long-double') is discovered, then it is assigned to CACHE-VAR and -# ACTION-IF-FOUND is invoked; otherwise the empty string is assigned to -# CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. -#------------------------------------------------------------------------------ -AC_DEFUN([CS_COMPILER_IGNORE_LONG_DOUBLE], - [CS_CHECK_BUILD_FLAGS( - [how to suppress m4_default([$1],[C]) `long double' warnings], - [m4_default([$2],[cs_cv_prog_compiler_ignore_long_double])], - [CS_CREATE_TUPLE([-Wno-long-double])], [$1], [$3], [$4])]) +# checkbuild.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_SPLIT_TUPLE(TUPLE, OUTPUT-VARIABLES) +# Split a build-tuple into its component parts. A build tuple is +# constructed by CS_CREATE_TUPLE() and is comprised of compiler flags, +# linker flags, and library references. OUTPUT-VARIABLES is a +# comma-delimited list of shell variables which should receive the +# extracted compiler flags, linker flags, and library references, +# respectively. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_SPLIT_TUPLE], + [CS_SPLIT([$1], [cs_dummy,$2], [@]) + m4_map([_CS_SPLIT_TUPLE], [$2])]) + +AC_DEFUN([_CS_SPLIT_TUPLE], + [$1=`echo $$1 | sed 'y%@%:@% %'` + ]) + + + +#------------------------------------------------------------------------------ +# CS_CREATE_TUPLE([CFLAGS], [LFLAGS], [LIBS]) +# Construct a build-tuple which is comprised of compiler flags, linker +# flags, and library references. Build tuples are encoded so as to +# preserve whitespace in each component. This makes it possible for +# macros (such as CS_BUILD_IFELSE) which employ build tuples to accept +# whitespace-delimited lists of tuples, and for shell "for" statements to +# iterate over tuple lists without compromising whitespace embedded +# within individual flags or library references. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CREATE_TUPLE], [`echo @$1@$2@$3 | sed 'y% %@%:@%'`]) + + + +#------------------------------------------------------------------------------ +# CS_LANG_CFLAGS +# Return the literal string CFLAGS if the current language is C. Return +# the literal string CXXFLAGS if the current language is C++. Generic +# compiler test macros which need to modify or save the compiler flags +# can invoke this macro to get the name of the compiler flags environment +# variable (either CFLAGS or CXXFLAGS) depending upon the current +# language. For example: +# CS_LANG_CFLAGS="$CS_LANG_CFLAGS -Wall" +# With C, this expands to: +# CFLAGS="$CFLAGS -Wall" +# With C++, it expands to: +# CXXFLAGS="$CXXFLAGS -Wall" +#------------------------------------------------------------------------------ +AC_DEFUN([CS_LANG_CFLAGS], [AC_LANG_CASE([C], [CFLAGS], [C++], [CXXFLAGS])]) + + + +#------------------------------------------------------------------------------ +# CS_BUILD_IFELSE([PROGRAM], [FLAGS], [LANGUAGE], [ACTION-IF-BUILT], +# [ACTION-IF-NOT-BUILT], [OTHER-CFLAGS], [OTHER-LFLAGS], +# [OTHER-LIBS], [INHIBIT-OTHER-FLAGS], [ERROR-REGEX]) +# Try building a program using the supplied compiler flags, linker flags, +# and library references. PROGRAM is typically a program composed via +# AC_LANG_PROGRAM(). PROGRAM may be omitted if you are interested only +# in learning if the compiler or linker respects certain flags. LANGUAGE +# is typically either C or C++ and specifies which compiler to use for +# the test. If LANGUAGE is omitted, C is used. FLAGS is a whitespace +# delimited list of build tuples. Tuples are created with +# CS_CREATE_TUPLE() and are composed of up to three elements each. The +# first element represents compiler flags, the second linker flags, and +# the third libraries used when linking the program. Each tuple from +# FLAGS is attempted in order. If you want a build attempted with no +# special flags prior to builds with specialized flags, create an empty +# tuple with CS_CREATE_TUPLE() at the start of the FLAGS list. If the +# build is successful, then the shell variables cs_build_ok is set to +# "yes", cs_build_cflags, cs_build_lflags, and cs_build_libs are set to +# the tuple elements which resulted in the successful build, and +# ACTION-IF-BUILT is invoked. Upon successful build, no further tuples +# are consulted. If no tuple results in a successful build, then +# cs_build_ok is set to "no" and ACTION-IF-NOT-BUILT is invoked. +# OTHER-CFLAGS, OTHER-LFLAGS, and OTHER-LIBS specify additional compiler +# flags, linker flags, and libraries which should be used with each tuple +# build attempt. Upon successful build, these additional flags are also +# reflected in the variables cs_build_cflags, cs_build_lflags, and +# cs_build_libs unless INHIBIT-OTHER-FLAGS is a non-empty string. The +# optional ERROR-REGEX places an additional constraint upon the build +# check. If specified, ERROR-REGEX, which is a standard `grep' regular +# expression, is applied to output captured from the compiler and linker. +# If ERROR-REGEX matches, then the build is deemed a failure, and +# cs_build_ok is set to "no". This facility is useful for broken build +# tools which emit an error message yet still return success as a result. +# In such cases, it should be possible to detect the failure by scanning +# the tools' output. +# +# IMPLEMENTATION NOTES +# +# In Autoconf 2.57 and earlier, AC_LINK_IFELSE() invokes AC_TRY_EVAL(), +# which does not provide access to the captured output. To work around +# this limitation, we temporarily re-define AC_TRY_EVAL() as +# _AC_EVAL_STDERR(), which leaves the captured output in conftest.err +# (which we must also delete). In Autoconf 2.58, however, +# AC_LINK_IFELSE() instead already invokes _AC_EVAL_STDERR() on our +# behalf, however we must be careful to apply ERROR-REGEX within the +# invocation AC_LINK_IFELSE(), since AC_LINK_IFELSE() deletes +# conftest.err before it returns. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_BUILD_IFELSE], + [AC_LANG_PUSH(m4_default([$3],[C])) + cs_cflags_save="$CS_LANG_CFLAGS" + cs_lflags_save="$LDFLAGS" + cs_libs_save="$LIBS" + cs_build_ok=no + m4_ifval([$10], [m4_pushdef([AC_TRY_EVAL], [_AC_EVAL_STDERR]($$[1]))]) + + for cs_build_item in m4_default([$2],[CS_CREATE_TUPLE()]) + do + CS_SPLIT_TUPLE( + [$cs_build_item],[cs_cflags_test,cs_lflags_test,cs_libs_test]) + CS_LANG_CFLAGS="$cs_cflags_test $6 $cs_cflags_save" + LDFLAGS="$cs_lflags_test $7 $cs_lflags_save" + LIBS="$cs_libs_test $8 $cs_libs_save" + AC_LINK_IFELSE(m4_default([$1], [AC_LANG_PROGRAM([],[])]), + [m4_ifval([$10], + [AS_IF([AC_TRY_COMMAND( + [grep "AS_ESCAPE([$10])" conftest.err >/dev/null 2>&1])], + [cs_build_ok=no], [cs_build_ok=yes])], + [cs_build_ok=yes])]) + AS_IF([test $cs_build_ok = yes], [break]) + done + + m4_ifval([$10], [m4_popdef([AC_TRY_EVAL]) rm -f conftest.err]) + CS_LANG_CFLAGS=$cs_cflags_save + LDFLAGS=$cs_lflags_save + LIBS=$cs_libs_save + AC_LANG_POP(m4_default([$3],[C])) + + AS_IF([test $cs_build_ok = yes], + [cs_build_cflags=CS_TRIM([$cs_cflags_test[]m4_ifval([$9],[],[ $6])]) + cs_build_lflags=CS_TRIM([$cs_lflags_test[]m4_ifval([$9],[],[ $7])]) + cs_build_libs=CS_TRIM([$cs_libs_test[]m4_ifval([$9],[],[ $8])]) + $4], + [$5])]) + + + +#------------------------------------------------------------------------------ +# CS_CHECK_BUILD(MESSAGE, CACHE-VAR, [PROGRAM], [FLAGS], [LANGUAGE], +# [ACTION-IF-BUILT], [ACTION-IF-NOT-BUILT], [IGNORE-CACHE], +# [OTHER-CFLAGS], [OTHER-LFLAGS], [OTHER-LIBS], +# [INHIBIT-OTHER-FLAGS], [ERROR-REGEX]) +# Like CS_BUILD_IFELSE() but also prints "checking" and result messages, +# and optionally respects the cache. Sets CACHE-VAR to "yes" upon +# success, else "no" upon failure. Additionally, sets CACHE-VAR_cflags, +# CACHE-VAR_lflags, and CACHE-VAR_libs to the values which resulted in a +# successful build. If IGNORE-CACHE is "yes", then the cache variables +# are ignored upon entry to this macro, however they are still set to +# appropriate values upon exit. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_BUILD], + [AS_IF([test "$8" != yes], + [AC_CACHE_CHECK([$1], [$2], + [CS_BUILD_IFELSE([$3], [$4], [$5], + [$2=yes + $2_cflags=$cs_build_cflags + $2_lflags=$cs_build_lflags + $2_libs=$cs_build_libs], + [$2=no], [$9], [$10], [$11], [$12], [$13])])], + [AC_MSG_CHECKING([$1]) + CS_BUILD_IFELSE([$3], [$4], [$5], + [$2=yes + $2_cflags=$cs_build_cflags + $2_lflags=$cs_build_lflags + $2_libs=$cs_build_libs], + [$2=no], [$9], [$10], [$11], [$12], [$13]) + AC_MSG_RESULT([$$2])]) + AS_IF([test $$2 = yes], [$6], + [$2_cflags='' + $2_lflags='' + $2_libs='' + $7])]) + + + +#------------------------------------------------------------------------------ +# CS_CHECK_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE], +# [ACTION-IF-RECOGNIZED], [ACTION-IF-NOT-RECOGNIZED], +# [OTHER-CFLAGS], [OTHER-LFLAGS], [OTHER-LIBS], +# [ERROR-REGEX]) +# Like CS_CHECK_BUILD(), but checks only if the compiler or linker +# recognizes a command-line option or options. MESSAGE is the "checking" +# message. CACHE-VAR is the shell cache variable which receives the flag +# or flags recognized by the compiler or linker. FLAGS is a +# whitespace-delimited list of build tuples created with +# CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in order until +# one is found which is recognized by the compiler. After that, no +# further flags are checked. LANGUAGE is typically either C or C++ and +# specifies which compiler to use for the test. If LANGUAGE is omitted, +# C is used. If a command-line option is recognized, then CACHE-VAR is +# set to the composite value of $cs_build_cflags, $cs_build_lflags, and +# $cs_build_libs of the FLAGS element which succeeded (not including the +# "other" flags) and ACTION-IF-RECOGNIZED is invoked. If no options are +# recognized, then CACHE-VAR is set to the empty string, and +# ACTION-IF-NOT-RECOGNIZED is invoked. As a convenience, in case +# comparing CACHE-VAR against the empty string to test for failure is +# undesirable, a second variable named CACHE-VAR_ok is set to the literal +# "no" upon failure, and to the same value as CACHE-VAR upon success. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_BUILD_FLAGS], + [AC_CACHE_CHECK([$1], [$2_ok], + [CS_BUILD_IFELSE([], [$3], [$4], + [$2=CS_TRIM([$cs_build_cflags $cs_build_lflags $cs_build_libs]) + $2_ok="$$2"], + [$2='' + $2_ok=no], [$7], [$8], [$9], [Y], [$10])]) + AS_IF([test "$$2_ok" != no], [$5], [$6])]) +#============================================================================== +# Copyright (C)2003-2006 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_COMMON_TOOLS_LINK +# Checks for common tools related to linking. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_COMMON_TOOLS_LINK], + [ + # The default RANLIB in Jambase is wrong on some platforms, and is also + # unsuitable during cross-compilation, so we set the value unconditionally + # (sixth argument of CS_EMIT_BUILD_PROPERTY). + AC_PROG_RANLIB + CS_EMIT_BUILD_PROPERTY([RANLIB], [$RANLIB], [], [], [], [Y]) + + CS_CHECK_TOOLS([DLLTOOL], [dlltool]) + CS_EMIT_BUILD_PROPERTY([CMD.DLLTOOL], [$DLLTOOL]) + + CS_CHECK_TOOLS([DLLWRAP], [dllwrap]) + CS_EMIT_BUILD_PROPERTY([CMD.DLLWRAP], [$DLLWRAP]) + + CS_CHECK_TOOLS([WINDRES], [windres]) + CS_EMIT_BUILD_PROPERTY([CMD.WINDRES], [$WINDRES]) + + CS_CHECK_TOOLS([STRINGS], [strings]) + CS_EMIT_BUILD_PROPERTY([CMD.STRINGS], [$STRINGS]) + + CS_CHECK_TOOLS([OBJCOPY], [objcopy]) + CS_EMIT_BUILD_PROPERTY([CMD.OBJCOPY], [$OBJCOPY]) + + CS_CHECK_LIBTOOL + CS_EMIT_BUILD_PROPERTY([LIBTOOL], [$LIBTOOL]) + CS_EMIT_BUILD_PROPERTY([APPLE_LIBTOOL], [$APPLE_LIBTOOL]) + ]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_COMMON_TOOLS_BASIC +# Checks for basic tools for building things. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_COMMON_TOOLS_BASIC], + [CS_CHECK_MKDIR + CS_EMIT_BUILD_PROPERTY([CMD.MKDIR], [$MKDIR]) + CS_EMIT_BUILD_PROPERTY([CMD.MKDIRS], [$MKDIRS]) + + CS_CHECK_PROGS([INSTALL], [install]) + CS_EMIT_BUILD_PROPERTY([INSTALL], [$INSTALL])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_COMMON_TOOLS_DOC_TEXINFO +# Checks for tools to generate documentation from texinfo files. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_COMMON_TOOLS_DOC_TEXINFO], + [CS_CHECK_PROGS([TEXI2DVI], [texi2dvi]) + CS_EMIT_BUILD_PROPERTY([CMD.TEXI2DVI], [$TEXI2DVI]) + + CS_CHECK_PROGS([TEXI2PDF], [texi2pdf]) + CS_EMIT_BUILD_PROPERTY([CMD.TEXI2PDF], [$TEXI2PDF]) + + CS_CHECK_PROGS([DVIPS], [dvips]) + CS_EMIT_BUILD_PROPERTY([CMD.DVIPS], [$DVIPS]) + + CS_CHECK_PROGS([DVIPDF], [dvipdf]) + CS_EMIT_BUILD_PROPERTY([CMD.DVIPDF], [$DVIPDF]) + + CS_CHECK_PROGS([MAKEINFO], [makeinfo]) + CS_EMIT_BUILD_PROPERTY([CMD.MAKEINFO], [$MAKEINFO])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_COMMON_TOOLS_DOC_DOXYGEN +# Checks for tools to generate source documentation via doxygen. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_COMMON_TOOLS_DOC_DOXYGEN], + [CS_CHECK_PROGS([DOXYGEN], [doxygen]) + CS_EMIT_BUILD_PROPERTY([CMD.DOXYGEN], [$DOXYGEN]) + + CS_CHECK_TOOLS([DOT], [dot]) + CS_EMIT_BUILD_PROPERTY([CMD.DOT], [$DOT])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_COMMON_LIBS +# Check for typical required libraries (libm, libmx, libdl, libnsl). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_COMMON_LIBS], + [AC_LANG_PUSH([C]) + AC_CHECK_LIB([m], [pow], [cs_cv_libm_libs=-lm], [cs_cv_libm_libs=]) + AC_CHECK_LIB([m], [cosf], [cs_cv_libm_libs=-lm]) + AC_CHECK_LIB([mx], [cosf]) + AC_CHECK_LIB([dl], [dlopen], [cs_cv_libdl_libs=-ldl], [cs_cv_libdl_libs=]) + AC_CHECK_LIB([nsl], [gethostbyname]) + AC_LANG_POP([C])]) +# checkcppunit.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_CPPUNIT([EMITTER]) +# Check if CppUnit (http://cppunit.sourceforge.net/), the unit-testing +# framework is available. The shell variable cs_cv_libcppunit is set to +# "yes" if CppUnit is discovered, else "no". If available, then the +# variables cs_cv_libcppunit_cflags, cs_cv_libcppunit_lflags, and +# cs_cv_libcppunit_libs are set. If EMITTER is provided, then +# CS_EMIT_BUILD_RESULT() is invoked with EMITTER in order to record the +# results in an output file. As a convenience, if EMITTER is the literal +# value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s default emitter +# will be used. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_CPPUNIT], + [CS_CHECK_LIB_WITH([cppunit], + [AC_LANG_PROGRAM([[#include ]], + [CppUnit::TextUi::TestRunner r; r.run();])], + [], [C++]) + + AS_IF([test $cs_cv_libcppunit = yes], + [CS_CHECK_BUILD([if cppunit is sufficiently recent], + [cs_cv_libcppunit_recent], + [AC_LANG_PROGRAM( + [[#include ]], + [CppUnit::BriefTestProgressListener b; b.startTest(0);])], + [], [C++], + [CS_EMIT_BUILD_RESULT([cs_cv_libcppunit], [CPPUNIT], + CS_EMITTER_OPTIONAL([$1]))], [], [], + [$cs_cv_libcppunit_cflags], + [$cs_cv_libcppunit_lflags], + [$cs_cv_libcppunit_libs])])]) +# checklib.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003-2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# cs_lib_paths_default +# Whitespace delimited list of directory tuples in which to search, by +# default, for external libraries. Each list item can specify an +# include|library directory tuple (for example, "/usr/include|/usr/lib"), +# or a single directory (for example, "/usr"). If the second form is +# used, then "include" and "lib" subdirectories of the directory are +# searched. If the library resources are not found, then the directory +# itself is searched. Thus, "/proj" is shorthand for +# "/proj/include|/proj/lib /proj|/proj". +# +# Present Cases: +# /usr/local -- Not all compilers search here by default, so we specify +# it manually. +# /sw -- Fink, the MacOS/X manager of Unix packages, installs here by +# default. +# /opt/local -- DarwinPorts installs here by default. +#------------------------------------------------------------------------------ +m4_define([cs_lib_paths_default], + [/usr/local/include|/usr/local/lib \ + /sw/include|/sw/lib \ + /opt/local/include|/opt/local/lib \ + /opt/include|/opt/lib]) + + + +#------------------------------------------------------------------------------ +# cs_pkg_paths_default +# Comma delimited list of additional directories in which the +# `pkg-config' command should search for its `.pc' files. +# +# Present Cases: +# /usr/local/lib/pkgconfig -- Although a common location for .pc files +# installed by "make install", many `pkg-config' commands neglect +# to search here automatically. +# /sw/lib/pkgconfig -- Fink, the MacOS/X manager of Unix packages, +# installs .pc files here by default. +# /opt/local/lib/pkgconfig -- DarwinPorts installs .pc files here by +# default. +#------------------------------------------------------------------------------ +m4_define([cs_pkg_paths_default], + [/usr/local/lib/pkgconfig, + /sw/lib/pkgconfig, + /opt/local/lib/pkgconfig, + /opt/lib/pkgconfig]) + + + +#------------------------------------------------------------------------------ +# CS_CHECK_LIB_WITH(LIBRARY, PROGRAM, [SEARCH-LIST], [LANGUAGE], +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [OTHER-CFLAGS], +# [OTHER-LFLAGS], [OTHER-LIBS], [ALIASES]) +# Very roughly similar in concept to AC_CHECK_LIB(), but allows caller to +# to provide list of directories in which to search for LIBRARY; allows +# user to override library location via --with-LIBRARY=dir; and consults +# `pkg-config' (if present) and `LIBRARY-config' (if present, i.e. +# `sdl-config') in order to obtain compiler and linker flags. LIBRARY is +# the name of the library or MacOS/X framework which is to be located +# (for example, "readline" for `libreadline.a' or `readline.framework'). +# PROGRAM, which is typically composed with AC_LANG_PROGRAM(), is a +# program which references at least one function or symbol in LIBRARY. +# SEARCH-LIST is a whitespace-delimited list of paths in which to search +# for the library and its header files, in addition to those searched by +# the compiler and linker by default, and those referenced by the +# cs_lib_paths_default macro. Each list item can specify an +# `include|library' directory tuple (for example, +# "/usr/include|/usr/lib"), or a single directory (for example, "/usr"). +# If the second form is used, then "include" and "lib" subdirectories of +# the directory are searched. If the library resources are not found, +# then the directory itself is searched. Thus, "/proj" is shorthand for +# "/proj/include|/proj/lib /proj|/proj". Items in the search list can +# include wildcards. SEARCH-LIST can be overridden by the user with the +# --with-LIBRARY=dir option, in which case only "dir/include|dir/lib" and +# "dir|dir" are searched. If SEARCH-LIST is omitted and the user did not +# override the search list via --with-LIBRARY=dir, then only the +# directories normally searched by the compiler and the directories +# mentioned via cs_lib_paths_default are searched. LANGUAGE is typically +# either C or C++ and specifies which compiler to use for the test. If +# LANGUAGE is omitted, C is used. OTHER-CFLAGS, OTHER-LFLAGS, and +# OTHER-LIBS can specify additional compiler flags, linker flags, and +# libraries needed to successfully link with LIBRARY. The optional +# ALIASES is a comma-delimited list of library names for which to search +# in case LIBRARY is not located (for example "[sdl1.2, sdl12]" for +# libsdl1.2.a, sdl1.2.framework, libsdl12.a, and sdl12.framework). If +# the library or one of its aliases is found and can be successfully +# linked into a program, then the shell cache variable cs_cv_libLIBRARY +# is set to "yes"; cs_cv_libLIBRARY_cflags, cs_cv_libLIBRARY_lflags, and +# cs_cv_libLIBRARY_libs are set, respectively, to the compiler flags +# (including OTHER-CFLAGS), linker flags (including OTHER-LFLAGS), and +# library references (including OTHER-LIBS) which resulted in a +# successful build; and ACTION-IF-FOUND is invoked. If the library was +# not found or was unlinkable, or if the user disabled the library via +# --without-LIBRARY, then cs_cv_libLIBRARY is set to "no" and +# ACTION-IF-NOT-FOUND is invoked. Note that the exported shell variable +# names are always composed from LIBRARY regardless of whether the test +# succeeded because the primary library was discovered or one of the +# aliases. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_LIB_WITH], + [AC_ARG_WITH([$1], [AC_HELP_STRING([--with-$1=dir], + [specify location of lib$1 if not detected automatically; searches + dir/include, dir/lib, and dir])]) + + # Backward compatibility: Recognize --with-lib$1 as alias for --with-$1. + AS_IF([test -n "$with_lib$1" && test -z "$with_$1"], + [with_$1="$with_lib$1"]) + + AS_IF([test -z "$with_$1"], [with_$1=yes]) + AS_IF([test "$with_$1" != no], + [# If --with-$1 value is same as cached value, then assume other + # cached values are also valid; otherwise, ignore all cached values. + AS_IF([test "$with_$1" != "$cs_cv_with_$1"], + [cs_ignore_cache=yes], [cs_ignore_cache=no]) + + cs_check_lib_flags='' + AS_IF([test $with_$1 = yes], + [m4_foreach([cs_check_lib_alias], [$1, $10], + [_CS_CHECK_LIB_PKG_CONFIG_FLAGS([cs_check_lib_flags], + cs_check_lib_alias) + _CS_CHECK_LIB_CONFIG_FLAGS([cs_check_lib_flags], + cs_check_lib_alias) + ])]) + + AS_IF([test $with_$1 != yes], + [cs_check_lib_paths=$with_$1], + [cs_check_lib_paths="| cs_lib_paths_default $3"]) + m4_foreach([cs_check_lib_alias], [$1, $10], + [_CS_CHECK_LIB_CREATE_FLAGS([cs_check_lib_flags], + cs_check_lib_alias, [$cs_check_lib_paths]) + ]) + + CS_CHECK_BUILD([for lib$1], [cs_cv_lib$1], [$2], [$cs_check_lib_flags], + [$4], [], [], [$cs_ignore_cache], [$7], [$8], [$9])], + [cs_cv_lib$1=no]) + + cs_cv_with_$1="$with_$1" + AS_IF([test "$cs_cv_lib$1" = yes], [$5], [$6])]) + + + +#------------------------------------------------------------------------------ +# CS_CHECK_PKG_CONFIG +# Check if the `pkg-config' command is available and reasonably recent. +# This program acts as a central repository of build flags for various +# packages. For example, to determine the compiler flags for FreeType2 +# use, "pkg-config --cflags freetype2"; and "pkg-config --libs freetype2" +# to determine the linker flags. If `pkg-config' is found and is +# sufficiently recent, PKG_CONFIG is set and AC_SUBST() invoked. +#------------------------------------------------------------------------------ +m4_define([CS_PKG_CONFIG_MIN], [0.9.0]) +AC_DEFUN([CS_CHECK_PKG_CONFIG], + [AS_IF([test "$cs_prog_pkg_config_checked" != yes], + [CS_CHECK_TOOLS([PKG_CONFIG], [pkg-config]) + _CS_CHECK_PKG_CONFIG_PREPARE_PATH + cs_prog_pkg_config_checked=yes]) + AS_IF([test -z "$cs_cv_prog_pkg_config_ok"], + [AS_IF([test -n "$PKG_CONFIG"], + [AS_IF([$PKG_CONFIG --atleast-pkgconfig-version=CS_PKG_CONFIG_MIN], + [cs_cv_prog_pkg_config_ok=yes], + [cs_cv_prog_pkg_config_ok=no])], + [cs_cv_prog_pkg_config_ok=no])])]) + +AC_DEFUN([_CS_CHECK_PKG_CONFIG_PREPARE_PATH], + [PKG_CONFIG_PATH="m4_foreach([cs_pkg_path], [cs_pkg_paths_default], + [cs_pkg_path$PATH_SEPARATOR])$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH]) + + + +#------------------------------------------------------------------------------ +# _CS_CHECK_LIB_PKG_CONFIG_FLAGS(VARIABLE, LIBRARY) +# Helper macro for CS_CHECK_LIB_WITH(). Checks if `pkg-config' knows +# about LIBRARY and, if so, appends a build tuple consisting of the +# compiler and linker flags reported by `pkg-config' to the list of +# tuples stored in the shell variable VARIABLE. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_CHECK_LIB_PKG_CONFIG_FLAGS], + [CS_CHECK_PKG_CONFIG + AS_IF([test $cs_cv_prog_pkg_config_ok = yes], + [AC_CACHE_CHECK([if $PKG_CONFIG recognizes $2], [_CS_CLPCF_CVAR([$2])], + [AS_IF([$PKG_CONFIG --exists $2], + [_CS_CLPCF_CVAR([$2])=yes], [_CS_CLPCF_CVAR([$2])=no])]) + AS_IF([test $_CS_CLPCF_CVAR([$2]) = yes], + [_CS_CHECK_LIB_CONFIG_PROG_FLAGS([$1], [pkg_config_$2], + [$PKG_CONFIG], [$2])])])]) + +AC_DEFUN([_CS_CLPCF_CVAR], [AS_TR_SH([cs_cv_prog_pkg_config_$1])]) + + + +#------------------------------------------------------------------------------ +# _CS_CHECK_LIB_CONFIG_FLAGS(VARIABLE, LIBRARY) +# Helper macro for CS_CHECK_LIB_WITH(). Checks if `LIBRARY-config' +# (i.e. `sdl-config') exists and, if so, appends a build tuple consisting +# of the compiler and linker flags reported by `LIBRARY-config' to the +# list of tuples stored in the shell variable VARIABLE. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_CHECK_LIB_CONFIG_FLAGS], + [CS_CHECK_TOOLS(_CS_CLCF_SHVAR([$2]), [$2-config]) + AS_IF([test -n "$_CS_CLCF_SHVAR([$2])"], + [AS_IF([test -z "$_CS_CLCF_CVAR([$2])"], + [AS_IF([$_CS_CLCF_SHVAR([$2]) --cflags --libs >/dev/null 2>&1], + [_CS_CLCF_CVAR([$2])=yes], [_CS_CLCF_CVAR([$2])=no])]) + AS_IF([test $_CS_CLCF_CVAR([$2]) = yes], + [_CS_CHECK_LIB_CONFIG_PROG_FLAGS([$1], [config_$2], + [$_CS_CLCF_SHVAR([$2])])])])]) + +AC_DEFUN([_CS_CLCF_CVAR], [AS_TR_SH([cs_cv_prog_config_$1_ok])]) +AC_DEFUN([_CS_CLCF_SHVAR], [m4_toupper(AS_TR_SH([CONFIG_$1]))]) + + + +#------------------------------------------------------------------------------ +# _CS_CHECK_LIB_CONFIG_PROG_FLAGS(VARIABLE, TAG, CONFIG-PROGRAM, [ARGS]) +# Helper macro for _CS_CHECK_LIB_PKG_CONFIG_FLAGS() and +# _CS_CHECK_LIB_CONFIG_FLAGS(). CONFIG-PROGRAM is a command which +# responds to the --cflags and --libs options and returns suitable +# compiler and linker flags for some package. ARGS, if supplied, is +# passed to CONFIG-PROGRAM after the --cflags or --libs argument. The +# results of the --cflags and --libs options are packed into a build +# tuple and appended to the list of tuples stored in the shell variable +# VARIABLE. TAG is used to compose the name of the cache variable. A good +# choice for TAG is some unique combination of the library name and +# configuration program. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_CHECK_LIB_CONFIG_PROG_FLAGS], + [AS_IF([test -z "$_CS_CLCPF_CVAR([$2])"], + [cs_check_lib_cflag=CS_RUN_PATH_NORMALIZE([$3 --cflags $4]) + cs_check_lib_lflag='' + cs_check_lib_libs=CS_RUN_PATH_NORMALIZE([$3 --libs $4]) + _CS_CLCPF_CVAR([$2])=CS_CREATE_TUPLE( + [$cs_check_lib_cflag], + [$cs_check_lib_lflag], + [$cs_check_lib_libs])]) + $1="$$1 $_CS_CLCPF_CVAR([$2])"]) + +AC_DEFUN([_CS_CLCPF_CVAR], [AS_TR_SH([cs_cv_prog_$1_flags])]) + + + +#------------------------------------------------------------------------------ +# _CS_CHECK_LIB_CREATE_FLAGS(VARIABLE, LIBRARY, PATHS) +# Helper macro for CS_CHECK_LIB_WITH(). Constructs a list of build +# tuples suitable for CS_CHECK_BUILD() and appends the tuple list to the +# shell variable VARIABLE. LIBRARY and PATHS have the same meanings as +# the like-named arguments of CS_CHECK_LIB_WITH(). +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_CHECK_LIB_CREATE_FLAGS], + [for cs_lib_item in $3 + do + case $cs_lib_item in + *\|*) CS_SPLIT( + [$cs_lib_item], [cs_check_incdir,cs_check_libdir], [|]) + _CS_CHECK_LIB_CREATE_FLAG([$1], + [$cs_check_incdir], [$cs_check_libdir], [$2]) + ;; + *) _CS_CHECK_LIB_CREATE_FLAG([$1], + [$cs_lib_item/include], [$cs_lib_item/lib], [$2]) + _CS_CHECK_LIB_CREATE_FLAG( + [$1], [$cs_lib_item], [$cs_lib_item], [$2]) + ;; + esac + done]) + + + +#------------------------------------------------------------------------------ +# _CS_CHECK_LIB_CREATE_FLAG(VARIABLE, HEADER-DIR, LIBRARY-DIR, LIBRARY) +# Helper macro for _CS_CHECK_LIB_CREATE_FLAGS(). Constructs build tuples +# suitable for CS_CHECK_BUILD() for given header and library directories, +# and appends the tuples to the shell variable VARIABLE. Synthesizes +# tuples which check for LIBRARY as a MacOS/X framework, and a standard +# link library. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_CHECK_LIB_CREATE_FLAG], + [AS_IF([test -n "$2"], [cs_check_lib_cflag="-I$2"], [cs_check_lib_cflag='']) + AS_IF([test -n "$3"], [cs_check_lib_lflag="-L$3"], [cs_check_lib_lflag='']) + AS_IF([test -n "$4"], + [cs_check_lib_libs="-l$4" + cs_check_lib_framework="-framework $4"], + [cs_check_lib_libs='' + cs_check_lib_framework='']) + $1="$$1 + CS_CREATE_TUPLE( + [$cs_check_lib_cflag], + [$cs_check_lib_lflag], + [$cs_check_lib_framework]) + CS_CREATE_TUPLE( + [$cs_check_lib_cflag], + [$cs_check_lib_lflag], + [$cs_check_lib_libs])"]) +# checklibtool.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2004 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_LIBTOOL +# Find and identify the various implementations of libtool. In +# particular, this macro is aware of GNU libtool and Apple's libtool +# (which serves a completely different purpose). On MacOS/X, GNU libtool +# is typically named glibtool, however a user might also use Fink to +# install the unadorned libtool; and the Fink-installed version might +# shadow Apple's own libtool if it appears in the PATH before the Apple +# tool. This macro jumps through the necessary hoops to distinguish and +# locate the various implementations. Sets the shell variable LIBTOOL to +# the located GNU libtool (if any), and APPLE_LIBTOOL to the located +# Apple libtool. Invokes AC_SUBST() for LIBTOOL and APPLE_LIBTOOL. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_LIBTOOL], +[# GNU: Search for libtool before glibtool since Fink version is likely newer. +m4_define([cs_lt_path_gnu], + [/sw/bin$PATH_SEPARATOR/usr/local/bin$PATH_SEPARATOR$PATH]) +AS_IF([test -z "$LIBTOOL"], + [CS_CHECK_TOOLS([LIBTOOL_TEST], [libtool glibtool gnulibtool], [], + [cs_lt_path_gnu]) + AS_IF([test -n "$LIBTOOL_TEST"], + [CS_PATH_PROG([LIBTOOL_PATH], [$LIBTOOL_TEST], [], [cs_lt_path_gnu]) + CS_LIBTOOL_CLASSIFY([$LIBTOOL_PATH], + [LIBTOOL="$LIBTOOL_PATH"], + [AS_IF([test -z "$APPLE_LIBTOOL"], [APPLE_LIBTOOL="$LIBTOOL_PATH"]) + CS_CHECK_TOOLS([LIBTOOL], [glibtool gnulibtool])])])]) +AC_SUBST([LIBTOOL]) + +# Apple: Ensure that Apple libtool will be found before GNU libtool from Fink. +m4_define([cs_lt_path_apple],[/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH]) +AS_IF([test -z "$APPLE_LIBTOOL"], + [CS_PATH_PROG([CS_LT_APPLE], [libtool], [], [cs_lt_path_apple]) + CS_LIBTOOL_CLASSIFY([$CS_LT_APPLE], [], + [APPLE_LIBTOOL="$CS_LT_APPLE"])]) +AC_SUBST([APPLE_LIBTOOL])]) + +AC_DEFUN([CS_LIBTOOL_CLASSIFY], + [AS_IF([test -n "$1"], + [AC_MSG_CHECKING([classification of $1]) + CS_LIBTOOL_GNU_IFELSE([$1], + [AC_MSG_RESULT([gnu]) + $2], + [AC_MSG_RESULT([apple]) + $3])])]) + +AC_DEFUN([CS_LIBTOOL_GNU_IFELSE], + [AS_IF([AC_RUN_LOG([$1 --version 1>&2])], [$2], [$3])]) +#============================================================================== +# Copyright (C)2003-2006 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_OPENGL +# Check for OpenGL. +# +# IMPLEMENTATION NOTES +# +# Some Mesa installations require pthread, so pthread flags are employed if +# available. +# +# The check for opengl32 needs to precede other checks because Cygwin users +# often have Mesa installed, and Mesa's OpenGL library is compiled without the +# __stdcall flags which results in link errors, whereas Microsoft's native +# opengl32 works fine. Conversely, some Unix implementations have Wine +# installed (Windows emulation layer) which includes an opengl32.so library. +# We need to avoid detection of this library on Unix since it would cause an +# undesirable dependence upon Wine. +# +# Many OpenGL libraries on Unix already contain GLX, so there is no separate +# GLX library, thus we first check for GLX using the discovered OpenGL library +# before attempting to locate a separate GLX-specific library. +# +# On MacOS/X, some users have XFree86 installed which creates a link from +# /usr/include/GL to /usr/X11R6/include/GL. We want to ignore this directory +# and instead check for Apple's OpenGL.framework, if we are not cross-building +# for Darwin. We accomplish this by placing the OpenGL.framework test ahead of +# the other tests. +# +# At least one user (Jorrit) has a strange installation in which inclusion of +# fails if an int32 is not present, thus we must take this into +# account. +#------------------------------------------------------------------------------ +m4_define([cs_define_int32], + [[#if !HAVE_TYPE_INT32 + typedef long int32; + #endif + ]]) + +# CS_GL_INCLUDE(CPP-MACRO,FALLBACK,HEADER) +AC_DEFUN([CS_GL_INCLUDE], + [[#if HAVE_WINDOWS_H + #if !HAVE_TYPE_INT32 + typedef long int32; + #endif + #include + #endif + #ifndef CS_HEADER_GLOBAL + #define CS_HEADER_GLOBAL(X,Y) CS_HEADER_GLOBAL_COMPOSE(X,Y) + #define CS_HEADER_GLOBAL_COMPOSE(X,Y) + #endif + #ifdef $1 + #include CS_HEADER_GLOBAL($1,$3) + #else + #include <$2/$3> + #endif]]) + +AC_DEFUN([CS_CHECK_OPENGL], + [AC_REQUIRE([CS_CHECK_HOST]) + AC_REQUIRE([CS_CHECK_COMMON_LIBS]) + AC_REQUIRE([CS_CHECK_PTHREAD]) + AC_REQUIRE([AC_PATH_X]) + AC_REQUIRE([AC_PATH_XTRA]) + AC_CHECK_TYPE([int32], [AC_DEFINE([HAVE_TYPE_INT32], [], + [Whether the int32 type is available])], []) + AC_CHECK_HEADERS([windows.h], [], [], [cs_define_int32]) + + # Apply plaform-specific flags if necessary. + cs_gl_plat_cflags='' + cs_gl_plat_lflags='' + cs_gl_plat_libs='' + AS_IF([test -n "$cs_cv_libm_cflags$cs_cv_libm_lflags$cs_cv_libm_libs"], + [cs_gl_plat_cflags="$cs_cv_libm_cflags $cs_gl_plat_cflags" + cs_gl_plat_lflags="$cs_cv_libm_lflags $cs_gl_plat_lflags" + cs_gl_plat_libs="$cs_cv_libm_libs $cs_gl_plat_libs"]) + AS_IF([test $cs_cv_sys_pthread = yes], + [cs_gl_plat_cflags="$cs_cv_sys_pthread_cflags $cs_gl_plat_cflags" + cs_gl_plat_lflags="$cs_cv_sys_pthread_lflags $cs_gl_plat_lflags" + cs_gl_plat_libs="$cs_cv_sys_pthread_libs $cs_gl_plat_libs"]) + AS_IF([test "$no_x" != yes], + [cs_gl_plat_cflags="$X_CFLAGS $cs_gl_plat_cflags" + cs_gl_plat_lflags="$cs_gl_plat_lflags" + cs_gl_plat_libs=" + $X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS $cs_gl_plat_libs"]) + + # Mesa requested? + AC_ARG_WITH([mesa], [AC_HELP_STRING([--with-mesa], + [use Mesa OpenGL library if available (default YES)])], + [], [with_mesa=yes]) + + AS_IF([test $with_mesa != no], + [cs_mesa_gl=CS_CREATE_TUPLE([],[],[-lMesaGL])]) + + # MacOS/X or Darwin? + AS_IF([test "x$cs_host_macosx" = "xyes"], + [cs_osx_gl=CS_CREATE_TUPLE([-DCS_OPENGL_PATH=OpenGL],[],[-framework OpenGL])]) + AS_IF([test "x$cs_host_macosx" = "xyes"], + [cs_gl_plat_lflags="$cs_plat_lflags -Wl,-dylib_file,/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"]) + + # Windows? + AS_IF([test $cs_host_family = windows], + [cs_win32_gl=CS_CREATE_TUPLE([],[],[-lopengl32])]) + + # Check for OpenGL. + CS_CHECK_BUILD([for OpenGL], [cs_cv_libgl], + [AC_LANG_PROGRAM([CS_GL_INCLUDE([CS_OPENGL_PATH],[GL],[gl.h])],[glEnd()])], + [$cs_win32_gl \ + $cs_osx_gl \ + CS_CREATE_TUPLE([],[],[-lGL]) \ + CS_CREATE_TUPLE([],[],[-lgl]) \ + $cs_mesa_gl], [], + [CS_EMIT_BUILD_RESULT([cs_cv_libgl], [GL])], [], [], + [$cs_gl_plat_cflags], [$cs_gl_plat_lflags], [$cs_gl_plat_libs])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_GLU +# Check for GLU. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_GLU], + [AC_REQUIRE([CS_CHECK_OPENGL]) + AS_IF([test $cs_cv_libgl = yes], + [AS_IF([test $with_mesa != no], + [cs_mesa_glu=CS_CREATE_TUPLE([],[],[-lMesaGLU])]) + + # MacOS/X or Darwin? + AS_IF([test "x$cs_host_macosx" = "xyes"], + [cs_osx_glu=CS_CREATE_TUPLE([-DCS_GLU_PATH=OpenGL],[],[-framework OpenGL])]) + + # Windows? + AS_IF([test $cs_host_family = windows], + [cs_win32_glu=CS_CREATE_TUPLE([],[],[-lglu32])]) + + # Check for GLU. + CS_CHECK_BUILD([for GLU], [cs_cv_libglu], + [AC_LANG_PROGRAM( + [CS_GL_INCLUDE([CS_GLU_PATH],[GL],[glu.h])], [gluNewQuadric()])], + [$cs_osx_glu \ + CS_CREATE_TUPLE() \ + $cs_win32_glu \ + CS_CREATE_TUPLE([],[],[-lGLU]) \ + CS_CREATE_TUPLE([],[],[-lglu]) \ + $cs_mesa_glu], [], + [CS_EMIT_BUILD_RESULT([cs_cv_libglu], [GLU])], [], [], + [$cs_cv_libgl_cflags], [$cs_cv_libgl_lflags], [$cs_cv_libgl_libs])])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_GLX +# Check for GLX. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_GLX], + [AC_REQUIRE([CS_CHECK_OPENGL]) + AS_IF([test $cs_cv_libgl = yes], + [AS_IF([test $with_mesa != no], + [cs_mesa_glx=CS_CREATE_TUPLE([],[],[-lMesaGLX])]) + + # Check for GLX. + AS_IF([test "$no_x" != yes], + [CS_CHECK_BUILD([for GLX], [cs_cv_libglx], + [AC_LANG_PROGRAM([[#include ]], [glXWaitGL()])], + [CS_CREATE_TUPLE() \ + CS_CREATE_TUPLE([],[],[-lGLX]) \ + CS_CREATE_TUPLE([],[],[-lglx]) \ + $cs_mesa_glx], [], + [CS_EMIT_BUILD_RESULT([cs_cv_libglx], [GLX])], [], [], + [$cs_cv_libgl_cflags], [$cs_cv_libgl_lflags], [$cs_cv_libgl_libs])])])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_GLXEXT([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# Check for GLX extensions. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_GLXEXT], + [AC_REQUIRE([CS_CHECK_GLX]) + AS_IF([test x$cs_cv_libglx = "xyes"], + [# Check for GLX extensions. + CS_CHECK_BUILD([for GLX extensions], [cs_cv_libglx_extensions], + [AC_LANG_PROGRAM( + [[#define GLX_GLXEXT_PROTOTYPES + #include ]], + [glXGetProcAddressARB(0)])], + [CS_CREATE_TUPLE( + [$cs_cv_libglx_cflags], + [$cs_cv_libglx_lflags], + [$cs_cv_libglx_libs])], + [], [$1], [$2])])]) + + + +#------------------------------------------------------------------------------ +# CS_CHECK_GLUT +# Check for GLUT. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_GLUT], + [AC_REQUIRE([CS_CHECK_GLU]) + AS_IF([test x$cs_cv_libglu = "xyes"], + [# MacOS/X or Darwin? + AS_IF([test "x$cs_host_macosx" = "xyes"], + [cs_osx_glut=CS_CREATE_TUPLE([-DCS_GLUT_PATH=GLUT],[],[-framework GLUT])]) + + # Windows? + AS_IF([test $cs_host_family = windows], + [cs_win32_glut=CS_CREATE_TUPLE([],[],[-lglut32])]) + + # Check for GLUT. + CS_CHECK_BUILD([for GLUT], [cs_cv_libglut], + [AC_LANG_PROGRAM( + [CS_GL_INCLUDE([CS_GLUT_PATH],[GL],[glut.h])], [glutSwapBuffers()])], + [$cs_osx_glut \ + CS_CREATE_TUPLE() \ + $cs_win32_glut \ + CS_CREATE_TUPLE([],[],[-lGLUT]) \ + CS_CREATE_TUPLE([],[],[-lglut])], [], + [CS_EMIT_BUILD_RESULT([cs_cv_libglut], [GLUT])], [], [], + [$cs_cv_libgl_cflags $cs_cv_libglu_cflags], + [$cs_cv_libgl_lflags $cs_cv_libglu_lflags], + [$cs_cv_libgl_libs $cs_cv_libglu_libs])])]) + +# checkpic.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_COMPILER_PIC([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check if compiler can be instructed to produce +# position-independent-code (PIC). This feature is required by some +# platforms when building plugin modules and shared libraries. If +# LANGUAGE is not provided, then `C' is assumed (other options include +# `C++'). If CACHE-VAR is not provided, then it defaults to the name +# "cs_cv_prog_compiler_pic". If a PIC-enabling option (such as `-fPIC') +# is discovered, then it is assigned to CACHE-VAR and ACTION-IF-FOUND is +# invoked; otherwise the empty string is assigned to CACHE-VAR and +# ACTION-IF-NOT-FOUND is invoked. +# +# IMPLEMENTATION NOTES +# +# On some platforms (such as Windows), the -fPIC option is superfluous +# and emits a warning "-fPIC ignored for target (all code is position +# independent)", despite the fact that the compiler accepts the option +# and returns a success code. We want to re-interpret the warning as a +# failure in order to avoid unnecessary compiler diagnostics in case the +# client inserts the result of this check into CFLAGS, for instance. We +# do so by attempting to promote warnings to errors using the result of +# CS_COMPILER_ERRORS(). As an extra safe-guard, we also scan the compiler +# output for an appropriate diagnostic because some gcc warnings fail to +# promote to error status despite use of -Werror. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_PIC], + [CS_COMPILER_ERRORS([$1], + [m4_default([$2_werror],[cs_cv_prog_compiler_pic_werror])]) + CS_CHECK_BUILD_FLAGS( + [how to enable m4_default([$1],[C]) PIC generation], + [m4_default([$2],[cs_cv_prog_compiler_pic])], + [CS_CREATE_TUPLE([-fPIC])], [$1], [$3], [$4], + [m4_default([$$2_werror],[$cs_cv_prog_compiler_pic_werror])], [], [], + [fPIC])]) + +# Backward-compatiblity alias. +AC_DEFUN([CS_CHECK_COMPILER_PIC], [CS_COMPILER_PIC([$1],[$2],[$3],[$4])]) +# checkprog.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2004 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# cs_bin_paths_default +# Comma delimited list of additional directories in which tools and +# commands might be found. +# +# Present Cases: +# /usr/local/bin -- Although a common location for executables, it is +# now-and-then absent from the default PATH setting. +# /sw/bin -- Fink, the MacOS/X manager of Unix packages, installs +# executables here. +#------------------------------------------------------------------------------ +m4_define([cs_bin_paths_default], [/usr/local/bin, /sw/bin]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_PROG(VARIABLE, PROGRAM, VALUE-IF-FOUND, [VALUE-IF-NOT-FOUND], +# [PATH], [REJECT]) +# Simple wrapper for AC_CHECK_PROG() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_PROG], + [_CS_PROG_PATH_PREPARE + AC_CHECK_PROG([$1], [$2], [$3], [$4], + m4_ifval([$5], [_CS_PROG_CLIENT_PATH([$5])]), [$6])]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_PROGS(VARIABLE, PROGRAMS, [VALUE-IF-NOT-FOUND], [PATH]) +# Simple wrapper for AC_CHECK_PROGS() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_PROGS], + [_CS_PROG_PATH_PREPARE + AC_CHECK_PROGS([$1], [$2], [$3], + m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_TOOL(VARIABLE, TOOL, [VALUE-IF-NOT-FOUND], [PATH]) +# Simple wrapper for AC_CHECK_TOOL() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_TOOL], + [_CS_PROG_PATH_PREPARE + AC_CHECK_TOOL([$1], [$2], [$3], + m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_TOOLS(VARIABLE, TOOLS, [VALUE-IF-NOT-FOUND], [PATH]) +# Simple wrapper for AC_CHECK_TOOLS() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_TOOLS], + [_CS_PROG_PATH_PREPARE + AC_CHECK_TOOLS([$1], [$2], [$3], + m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) + + +#------------------------------------------------------------------------------ +# CS_PATH_PROG(VARIABLE, PROGRAM, [VALUE-IF-NOT-FOUND], [PATH]) +# Simple wrapper for AC_PATH_PROG() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_PATH_PROG], + [_CS_PROG_PATH_PREPARE + AC_PATH_PROG([$1], [$2], [$3], + m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) + + +#------------------------------------------------------------------------------ +# CS_PATH_PROGS(VARIABLE, PROGRAMS, [VALUE-IF-NOT-FOUND], [PATH]) +# Simple wrapper for AC_PATH_PROGS() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_PATH_PROGS], + [_CS_PROG_PATH_PREPARE + AC_PATH_PROGS([$1], [$2], [$3], + m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) + + +#------------------------------------------------------------------------------ +# CS_PATH_TOOL(VARIABLE, TOOL, [VALUE-IF-NOT-FOUND], [PATH]) +# Simple wrapper for AC_PATH_TOOL() which ensures that the search path +# is augmented by the directories mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_PATH_TOOL], + [_CS_PROG_PATH_PREPARE + AC_PATH_TOOL([$1], [$2], [$3], + m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))]) + + +#------------------------------------------------------------------------------ +# _CS_PROG_PATH_PREPARE +# Ensure that the PATH environment variable mentions the set of +# directories listed in cs_bin_paths_default. These directories may not +# appear by default in the typical PATH, yet they might be common +# locations for tools and commands. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_PROG_PATH_PREPARE], + [AS_REQUIRE([_AS_PATH_SEPARATOR_PREPARE]) + AS_IF([test "$cs_prog_path_prepared" != yes], + [cs_prog_path_prepared=yes + PATH="$PATH[]m4_foreach([cs_bin_path], [cs_bin_paths_default], + [$PATH_SEPARATOR[]cs_bin_path])" + export PATH])]) + + +#------------------------------------------------------------------------------ +# _CS_PROG_CLIENT_PATH(CLIENT-PATH) +# Given a client-supplied replacement for PATH, augment the list by +# appending the locations mentioned in cs_bin_paths_default. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_PROG_CLIENT_PATH], + [AS_REQUIRE([_AS_PATH_SEPARATOR_PREPARE])dnl + $1[]m4_foreach([cs_bin_path], [cs_bin_paths_default], + [$PATH_SEPARATOR[]cs_bin_path])]) +# checkpthread.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003-2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_PTHREAD([REJECT-MASK]) +# Check for pthread. Also check if the pthread implementation supports +# the recursive and timed mutex extensions. (Timed mutexes are needed for +# the NPTL: New Posix Thread Library on GNU/Linux if the mutex is going +# to be used with any of the timed condition-wait functions.) The shell +# variable cs_cv_sys_pthread is set to "yes" if pthread is available, +# else "no". If available, then the variables cs_cv_sys_pthread_cflags, +# cs_cv_sys_pthread_lflags, and cs_cv_sys_pthread_libs are set. (As a +# convenience, these variables can be emitted to an output file with +# CS_EMIT_BUILD_RESULT() by passing "cs_cv_sys_pthread" as its CACHE-VAR +# argument.) If the recursive mutex extension is supported, then +# cs_cv_sys_pthread_mutex_recursive will be set with the literal name of +# the constant which must be passed to pthread_mutexattr_settype() to +# enable this feature. The constant name will be typically +# PTHREAD_MUTEX_RECURSIVE or PTHREAD_MUTEX_RECURSIVE_NP. If the recursive +# mutex extension is not available, then +# cs_cv_sys_pthread_mutex_recursive will be set to "no". If the timed +# mutex extension is supported, then cs_cv_sys_pthread_mutex_timed will +# be set with the literal name of the constant which must be passed to +# pthread_mutexattr_settype() to enable this feature. The constant name +# will be typically PTHREAD_MUTEX_TIMED or PTHREAD_MUTEX_TIMED_NP. If the +# timed mutex extension is not available, then +# cs_cv_sys_pthread_mutex_timed will be set to "no". REJECT-MASK can be +# used to limit the platforms on which the pthread test is performed. It +# is compared against $host_os; matches are rejected. If omitted, then +# the test is performed on all platforms. Examples: To avoid testing on +# Cygwin, use "cygwin*"; to avoid testing on Cygwin and AIX, use +# "cygwin*|aix*". +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_PTHREAD], + [AC_REQUIRE([AC_CANONICAL_HOST]) + case $host_os in + m4_ifval([$1], + [$1) + cs_cv_sys_pthread=no + ;; + ]) + *) + CS_CHECK_BUILD([for pthread], [cs_cv_sys_pthread], + [AC_LANG_PROGRAM( + [[#include + #include + void* worker(void* p) { (void)p; return p; }]], + [pthread_t tid; + sem_t sem; + pthread_create(&tid, 0, worker, 0); + sem_init(&sem, 0, 0); + sem_destroy(&sem);])], + [cs_pthread_flags]) + ;; + esac + _CS_CHECK_MUTEX_FEATURE([PTHREAD_MUTEX_RECURSIVE], + [cs_cv_sys_pthread_mutex_recursive], [for pthread recursive mutexes])]) + +# _CS_CHECK_MUTEX_FEATURE(FEATURE, CACHE-VAR, MESSAGE) +AC_DEFUN([_CS_CHECK_MUTEX_FEATURE], + [AS_IF([test $cs_cv_sys_pthread = yes], + [AC_CACHE_CHECK([$3], [$2], + [CS_BUILD_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [pthread_mutexattr_t attr; + pthread_mutexattr_settype(&attr, CS_MUTEX_FEATURE);])], + [CS_CREATE_TUPLE([-DCS_MUTEX_FEATURE=$1]) \ + CS_CREATE_TUPLE([-DCS_MUTEX_FEATURE=$1_NP])], + [], + [$2=`echo $cs_build_cflags | sed 's/.*\($1_*N*P*\).*/\1/'`], + [$2=no], + [$cs_cv_sys_pthread_cflags -D_GNU_SOURCE], + [$cs_cv_sys_pthread_lflags], + [$cs_cv_sys_pthread_libs])])], + [$2=no])]) + +#------------------------------------------------------------------------------ +# CS_CHECK_PTHREAD_ATFORK(CACHE-VAR) +# Checks whether the pthread library contains pthread_atfork(). Sets +# CACHE-VAR to "yes" or "no", according to the test result. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_PTHREAD_ATFORK], + [AS_IF([test $cs_cv_sys_pthread = yes], + [AC_CACHE_CHECK([for pthread_atfork support], [$1], + [CS_BUILD_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [pthread_atfork (0, 0, 0);])], + [], [], + [$1=yes], [$1=no], + [$cs_cv_sys_pthread_cflags -D_GNU_SOURCE], + [$cs_cv_sys_pthread_lflags], + [$cs_cv_sys_pthread_libs])])], + [$1=no])]) + +m4_define([cs_pthread_flags], + [CS_CREATE_TUPLE() \ + CS_CREATE_TUPLE([], [], [-lpthread]) \ + CS_CREATE_TUPLE([], [], [-lpthread -lrt]) \ + CS_CREATE_TUPLE([-pthread], [-pthread], []) \ + CS_CREATE_TUPLE([-pthread], [-pthread], [-lpthread]) \ + CS_CREATE_TUPLE([-pthread], [-pthread], [-lc_r])]) +# checktt2.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2004,2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_TEMPLATE_TOOLKIT2([EMITTER]) +# Check if Template Toolkit 2 (http://www.tt2.org/) is available. The +# shell variable cs_cv_perl_tt2 is set to "yes" if the package is +# discovered, else "no". Also sets the shell variable TTREE to the name +# path of the 'ttree' utility program and invokes AC_SUBST(). If EMITTER +# is provided and the package was discovered, then +# CS_EMIT_BUILD_PROPERTY() is invoked with EMITTER in order to record the +# value of the TTREE variable in an output file. As a convenience, if +# EMITTER is the literal value "emit" or "yes", then +# CS_EMIT_BUILD_RESULT()'s default emitter will be used. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_TEMPLATE_TOOLKIT2], + [CS_CHECK_PROGS([PERL], [perl5 perl]) + AS_IF([test -n "$PERL"], + [AC_CACHE_CHECK([for TemplateToolkit], [cs_cv_perl_tt2], + [AS_IF([AC_RUN_LOG( + [$PERL -M'Template 2.11' -MTemplate::Plugin -e 0 1>&2])], + [cs_cv_perl_tt2=yes], + [cs_cv_perl_tt2=no])]) + CS_PATH_PROGS([TTREE], [ttree]) + AS_IF([test $cs_cv_perl_tt2 = yes && test -n "$TTREE"], + [CS_EMIT_BUILD_PROPERTY([TTREE], [$TTREE], [], [], + CS_EMITTER_OPTIONAL([$1]))])])]) +# compiler.m4 -*- Autoconf -*- +#============================================================================= +# Copyright (C)2003 by Matze Braun +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================= + +#----------------------------------------------------------------------------- +# Detection of C and C++ compilers and setting flags +# +# CS_PROG_CC +# Detects the C compiler. Also takes care of the CFLAGS, CPPFLAGS and CC +# environment variables. This will filter out all -g and -O from the +# CFLAGS variable because Autoconf's -g and -O defaults are not always +# desired. This will also set the CMD.CC and COMPILER.CFLAGS variables +# in Jamconfig +# CS_PROG_CXX +# Detects the C++ compiler. Also takes care of the CXXFLAGS, CPPFLAGS +# and CXX environment variables. This will filter out all -g and -O from +# the CXXFLAGS variable because Autoconf's -g and -O defaults are not +# always desired. This will also set the CMD.C++ and COMPILER.C++FLAGS +# variables in Jamconfig +# CS_PROG_LINK +# Tries to determine a linker. This is done by checking if a C++ or +# Objecctive-C++ compiler is available in which case it is used for +# linking; otherwise the C or Objective-C compiler is used. This also +# sets the CMD.LINK and COMPILER.LFLAGS variables in Jamconfig and +# respects the LDFLAGS environment variable. Finally, checks if linker +# recognizes -shared and sets PLUGIN.LFLAGS; and checks if linker +# recognizes -soname and sets PLUGIN.LFLAGS.USE_SONAME to "yes". +#----------------------------------------------------------------------------- +AC_DEFUN([CS_PROG_CC],[ + CFLAGS="$CFLAGS" # Filter undesired flags + AS_IF([test -n "$CC"],[ + CS_EMIT_BUILD_PROPERTY([CMD.CC], [$CC]) + CS_EMIT_BUILD_PROPERTY([COMPILER.CFLAGS], [$CPPFLAGS $CFLAGS], [+]) + + # Check if compiler recognizes -pipe directive. + CS_EMIT_BUILD_FLAGS([if $CC accepts -pipe], [cs_cv_prog_cc_pipe], + [CS_CREATE_TUPLE([-pipe])], [C], [COMPILER.CFLAGS], [+]) + ]) +]) + +AC_DEFUN([CS_PROG_CXX],[ + CXXFLAGS="$CXXFLAGS" # Filter undesired flags + AS_IF([test -n "$CXX"],[ + CS_EMIT_BUILD_PROPERTY([CMD.C++], [$CXX]) + + CS_EMIT_BUILD_PROPERTY([COMPILER.C++FLAGS], [$CPPFLAGS $CXXFLAGS], [+]) + + # Check if compiler can be instructed to produce position-independent-code + # (PIC). This feature is required by some platforms when building plugin + # modules and shared libraries. + CS_COMPILER_PIC([C++], [cs_cv_prog_cxx_pic], + [CS_EMIT_BUILD_PROPERTY([COMPILER.C++FLAGS.PIC], + [$cs_cv_prog_cxx_pic])]) + ]) +]) + +AC_DEFUN([CS_PROG_LINK],[ + AC_REQUIRE([CS_PROG_CXX]) + AS_IF([test -n "$CXX"], + [CS_EMIT_BUILD_PROPERTY([CMD.LINK], [AS_ESCAPE([$(CMD.C++)])])], + [CS_EMIT_BUILD_PROPERTY([CMD.LINK], [AS_ESCAPE([$(CMD.CC)])])]) + + CS_EMIT_BUILD_PROPERTY([COMPILER.LFLAGS], [$LDFLAGS], [+]) + + # Check if compiler/linker recognizes -shared directive which is needed for + # linking plugin modules. Unfortunately, the Apple compiler (and possibly + # others) requires extra effort. Even though the compiler does not recognize + # the -shared option, it nevertheless returns a "success" result after emitting + # the warning "unrecognized option `-shared'". Worse, even -Werror fails to + # promote the warning to an error, so we must instead scan the compiler's + # output for an appropriate diagnostic. + CS_CHECK_BUILD_FLAGS([if -shared is accepted], [cs_cv_prog_link_shared], + [CS_CREATE_TUPLE([-shared $cs_cv_prog_cxx_pic])], [C++], + [CS_EMIT_BUILD_PROPERTY([PLUGIN.LFLAGS], [-shared], [+])], [], + [], [], [], [shared]) + + # Check if linker recognizes -soname which is used to assign a name internally + # to plugin modules. + CS_CHECK_BUILD([if -soname is accepted], [cs_cv_prog_link_soname], [], + [CS_CREATE_TUPLE([-Wl,-soname,foobar])], [C++], + [CS_EMIT_BUILD_PROPERTY([PLUGIN.LFLAGS.USE_SONAME], [yes])]) +]) +#------------------------------------------------------------------------------ +# Determine host platform. Recognized families: Unix, Windows, MacOS/X. +# Orginial Macros Copyright (C)2003 Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Determine host CPU. +# +# CS_CHECK_HOST_CPU +# Set the shell variable cs_host_cpu to a normalized form of the CPU name +# returned by config.guess/config.sub. Typically, Crystal Space's +# conception of CPU name is the same as that returned by +# config.guess/config.sub, but there may be exceptions as seen in the +# `case' statement. Also takes the normalized name, uppercases it to +# form a name suitable for the C preprocessor. Additionally sets the +# TARGET.PROCESSOR Jamconfig property. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_HOST_CPU], + [AC_REQUIRE([AC_CANONICAL_HOST]) + case $host_cpu in + [[Ii][3-9]86*|[Xx]86*]) cs_host_cpu=x86 ;; + *) cs_host_cpu=$host_cpu ;; + esac + cs_host_cpu_normalized="AS_TR_CPP([$cs_host_cpu])" + CS_JAMCONFIG_PROPERTY([TARGET.PROCESSOR], [$cs_host_cpu_normalized]) + ]) + + +#------------------------------------------------------------------------------ +# CS_CHECK_HOST +# Sets the shell variables cs_host_target cs_host_family, +# cs_host_os_normalized, and cs_host_os_normalized_uc. Emits appropriate +# CS_PLATFORM_UNIX, CS_PLATFORM_WIN32, CS_PLATFORM_MACOSX via +# AC_DEFINE(), and TARGET.OS and TARGET.OS.NORMALIZED to Jamconfig. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_HOST], + [AC_REQUIRE([AC_CANONICAL_HOST]) + CS_CHECK_HOST_CPU + cs_host_os_normalized='' + case $host_os in + mingw*|cygwin*) + cs_host_target=win32gcc + cs_host_family=windows + ;; + darwin*) + _CS_CHECK_HOST_DARWIN + ;; + *) + # Everything else is assumed to be Unix or Unix-like. + cs_host_target=unix + cs_host_family=unix + ;; + esac + + case $cs_host_family in + windows) + AC_DEFINE([CS_PLATFORM_WIN32], [], + [Define when compiling for Win32]) + AS_IF([test -z "$cs_host_os_normalized"], + [cs_host_os_normalized='Win32']) + ;; + unix) + AC_DEFINE([CS_PLATFORM_UNIX], [], + [Define when compiling for Unix and Unix-like (i.e. MacOS/X)]) + AS_IF([test -z "$cs_host_os_normalized"], + [cs_host_os_normalized='Unix']) + ;; + esac + + cs_host_os_normalized_uc="AS_TR_CPP([$cs_host_os_normalized])" + CS_JAMCONFIG_PROPERTY([TARGET.OS], [$cs_host_os_normalized_uc]) + CS_JAMCONFIG_PROPERTY([TARGET.OS.NORMALIZED], [$cs_host_os_normalized]) +]) + +AC_DEFUN([_CS_CHECK_HOST_DARWIN], + [AC_REQUIRE([CS_PROG_CC]) + AC_REQUIRE([CS_PROG_CXX]) + + # Both MacOS/X and Darwin are identified via $host_os as "darwin". We need + # a way to distinguish between the two. If Carbon.h is present, then + # assume MacOX/S; if not, assume Darwin. If --with-x=yes was invoked, and + # Carbon.h is present, then assume that user wants to cross-build for + # Darwin even though build host is MacOS/X. + # IMPLEMENTATION NOTE *1* + # The QuickTime 7.0 installer removes , which + # causes #include to fail unconditionally. Re-installing + # the QuickTime SDK should restore the header, however not all developers + # know to do this, so we work around the problem of the missing + # CarbonSound.h by #defining __CARBONSOUND__ in the test in order to + # prevent Carbon.h from attempting to #include the missing header. + # IMPLEMENTATION NOTE *2* + # At least one MacOS/X user switches between gcc 2.95 and gcc 3.3 with a + # script which toggles the values of CC, CXX, and CPP. Unfortunately, CPP + # was being set to run the preprocessor directly ("cpp", for instance) + # rather than running it via the compiler ("gcc -E", for instance). The + # problem with running the preprocessor directly is that __APPLE__ and + # __GNUC__ are not defined, which causes the Carbon.h check to fail. We + # avoid this problem by supplying a non-empty fourth argument to + # AC_CHECK_HEADER(), which causes it to test compile the header only (which + # is a more robust test), rather than also testing it via the preprocessor. + + AC_DEFINE([__CARBONSOUND__], [], + [Avoid problem caused by missing ]) + AC_CHECK_HEADER([Carbon/Carbon.h], + [cs_host_macosx=yes], [cs_host_macosx=no], [/* force compile */]) + + AS_IF([test $cs_host_macosx = yes], + [AC_MSG_CHECKING([for --with-x]) + AS_IF([test "${with_x+set}" = set && test "$with_x" = "yes"], + [AC_MSG_RESULT([yes (assume Darwin)]) + cs_host_macosx=no], + [AC_MSG_RESULT([no])])]) + + AS_IF([test $cs_host_macosx = yes], + [cs_host_target=macosx + cs_host_family=unix + cs_host_os_normalized='MacOS/X' + AC_DEFINE([CS_PLATFORM_MACOSX], [], + [Define when compiling for MacOS/X]) + + AC_CACHE_CHECK([for Objective-C compiler], [cs_cv_prog_objc], + [cs_cv_prog_objc="$CC"]) + CS_JAMCONFIG_PROPERTY([CMD.OBJC], [$cs_cv_prog_objc]) + AC_CACHE_CHECK([for Objective-C++ compiler], [cs_cv_prog_objcxx], + [cs_cv_prog_objcxx="$CXX"]) + CS_JAMCONFIG_PROPERTY([CMD.OBJC++], [$cs_cv_prog_objcxx])], + + [cs_host_target=unix + cs_host_family=unix])]) +# diagnose.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS]) +# A convenience wrapper for AC_MSG_ERROR() which invokes AC_CACHE_SAVE() +# before aborting the script. Saving the cache should make subsequent +# re-invocations of the configure script faster once the user has +# corrected the problem(s) which caused the failure. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_MSG_ERROR], + [AC_CACHE_SAVE + AC_MSG_ERROR([$1], [$2])]) +# embed.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003,2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_META_INFO_EMBED([EMITTER], [GPL-OKAY]) +# Determine if plugin meta-information should be embedded or if it should +# exist in a stand-alone .csplugin file, and check if necessary tools and +# libraries are present. Sets the shell variable +# enable_meta_info_embedding to "yes" if the user requested embedding or +# if it was enabled by default; otherwise sets it to "no". +# +# If EMITTER is provided, then a subset of the following variables +# (depending upon platform and availability) are recorded by invoking +# CS_EMIT_BUILD_PROPERTY() with EMITTER. As a convenience, if EMITTER is +# the literal value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s +# default emitter will be used. +# +# EMBED_META := yes or no +# EMBED_META.CFLAGS := compiler flags +# EMBED_META.LFLAGS := linker flags +# CMD.WINDRES := windres.exe +# OBJCOPY.AVAILABLE := yes or no +# CMD.OBJCOPY := objcopy.exe +# LIBBFD.AVAILABLE := yes or no +# LIBBFD.CFLAGS := libbfd compiler flags +# LIBBFD.LFLAGS := libbfd linker flags +# ELF.AVAILABLE := yes or no +# +# In general, clients need only concern themselves with the various +# EMBED_META-related variables. For building plugin modules, utilize +# EMBED_META.CFLAGS when compiling, and EMBED_META.LFLAGS when linking. +# +# On Unix, when CS' own ELF metadata reader can't be used (because the +# necessary header file elf.h was not found) embedding is accomplished +# via libbfd, which carries a GPL license. Projects which carry licenses +# not compatible with GPL should consider carefully before enabling +# embedding on Unix. If your project is GPL-compatible, then set GPL-OKAY +# to "yes". This will indicate that it is safe to use libbfd if the ELF +# reader can not be used. If your project is not GPL-compatible, then +# set it to "no" in order to disable embedding on Unix if the ELF reader +# is not usable. (The user can still manually override the setting via +# the --enable-meta-info-embedding option.) +# +# IMPLEMENTATION NOTES +# +# Recent versions of Mingw supply libbfd and libiberty. Since Crystal +# Space uses native Win32 API for meta-information embedding on Windows, +# we do not require these libraries on Windows. More importantly, users +# do not want to see these GPL-licensed libraries appear in the link +# statement for plugin modules, thus we explicitly disable the libbfd +# test on Windows. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_META_INFO_EMBED], + [AC_REQUIRE([AC_CANONICAL_HOST]) + _CS_META_INFO_EMBED_ENABLE([$1], [$2]) + AS_IF([test $enable_meta_info_embedding = yes], + [_CS_META_INFO_EMBED_TOOLS([$1]) + AS_IF([test $cs_header_elf_h = yes], + [CS_EMIT_BUILD_PROPERTY([ELF.AVAILABLE], [yes], [], [], + CS_EMITTER_OPTIONAL([$1]))], + [case $host_os in + mingw*|cygwin*) ;; + *) + CS_CHECK_LIBBFD([$1], + [CS_EMIT_BUILD_PROPERTY([EMBED_META.CFLAGS], + [$cs_cv_libbfd_ok_cflags], [+], [], + CS_EMITTER_OPTIONAL([$1])) + CS_EMIT_BUILD_PROPERTY([EMBED_META.LFLAGS], + [$cs_cv_libbfd_ok_lflags $cs_cv_libbfd_ok_libs], + [+], [], CS_EMITTER_OPTIONAL([$1]))]) + ;; + esac])])]) + + +#------------------------------------------------------------------------------ +# _CS_META_INFO_EMBED_ENABLE([EMITTER], [GPL-OKAY]) +# Helper for CS_META_INFO_EMBED which adds an +# --enable-meta-info-embedding option to the configure script allowing +# the user to control embedding. Sets the shell variable +# enable_meta_info_embedding to yes or no. +# +# IMPLEMENTATION NOTES +# +# On Unix, embedding is enabled by default if elf.h is found and disabled +# by default unless overridden via GPL-OKAY because libbfd carries a GPL +# license which may be incompatible with a project's own license (such as +# LGPL). +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_META_INFO_EMBED_ENABLE], + [AC_REQUIRE([CS_CHECK_HOST]) + AC_CHECK_HEADERS([elf.h], [cs_header_elf_h=yes], [cs_header_elf_h=no]) + AC_MSG_CHECKING([whether to embed plugin meta-information]) + case $cs_host_target in + unix) AS_IF([test $cs_header_elf_h = yes], + [cs_embed_meta_info_default=yes], + [cs_embed_meta_info_default=m4_ifval([$2],[$2],[no])]) ;; + *) cs_embed_meta_info_default=yes ;; + esac + AC_ARG_ENABLE([meta-info-embedding], + [AC_HELP_STRING([--enable-meta-info-embedding], + [store plugin meta-information directly inside plugin modules if + supported by platform; if disabled, meta-information is stored in + stand-alone .csplugin files; this option is enabled by default for + non-Unix platforms and on Unix platforms with ELF-format object + files; it is disabled by default on Unix platforms if ELF is not + available and the project uses a non-GPL-compatible license (such + as LGPL) since the non-ELF Unix embedding technology requires the + GPL-licensed libbfd library; if ELF is not available, enable this + option on Unix only if you are certain you want a GPL-licensed + library infecting your project])], + [], [enable_meta_info_embedding=$cs_embed_meta_info_default]) + AC_MSG_RESULT([$enable_meta_info_embedding]) + CS_EMIT_BUILD_PROPERTY([EMBED_META], [$enable_meta_info_embedding], + [], [], CS_EMITTER_OPTIONAL([$1]))]) + + + +#------------------------------------------------------------------------------ +# _CS_META_INFO_EMBED_TOOLS([EMITTER]) +# Helper for CS_META_INFO_EMBED() which searches for tools required for +# plugin meta-info embedding. +#------------------------------------------------------------------------------ +AC_DEFUN([_CS_META_INFO_EMBED_TOOLS], + [CS_CHECK_TOOLS([WINDRES], [windres]) + CS_EMIT_BUILD_PROPERTY([CMD.WINDRES], [$WINDRES], [], [], + CS_EMITTER_OPTIONAL([$1])) + + CS_CHECK_TOOLS([OBJCOPY], [objcopy]) + AS_IF([test -n "$OBJCOPY"], + [CS_EMIT_BUILD_PROPERTY([OBJCOPY.AVAILABLE], [yes], [], [], + CS_EMITTER_OPTIONAL([$1])) + CS_EMIT_BUILD_PROPERTY([CMD.OBJCOPY], [$OBJCOPY], [], [], + CS_EMITTER_OPTIONAL([$1]))])]) + + + +#------------------------------------------------------------------------------ +# CS_CHECK_LIBBFD([EMITTER], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# Exhaustive check for a usable GPL-licensed libbfd, the Binary File +# Descriptor library, a component of binutils, which allows low-level +# manipulation of executable and object files. If EMITTER is provided, +# then the following variables are recorded by invoking +# CS_EMIT_BUILD_PROPERTY() with EMITTER. As a convenience, if EMITTER is +# the literal value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s +# default emitter will be used. +# +# LIBBFD.AVAILABLE := yes or no +# LIBBFD.CFLAGS := libbfd compiler flags +# LIBBFD.LFLAGS := libbfd linker flags +# +# The shell variable cs_cv_libbfd_ok is set to yes if a usable libbfd was +# discovered, else no. If found, the additional shell variables +# cs_cv_libbfd_ok_cflags, cs_cv_libbfd_ok_lflags, and +# cs_cv_libbfd_ok_libs are also set. +# +# WARNING +# +# libbfd carries a GPL license which is incompatible with the LGPL +# license of Crystal Space. Do not use this library with projects under +# less restrictive licenses, such as LGPL. +# +# IMPLEMENTATION NOTES +# +# It seems that some platforms have two version of libiberty installed: +# one from binutils and one from gcc. The binutils version resides in +# /usr/lib, whereas the gcc version resides in the gcc installation +# directory. The gcc version, by default, takes precedence at link time +# over the binutils version. Unfortunately, in broken cases, the gcc +# version of libiberty is missing htab_create_alloc() which is required +# by some libbfd functions. The extensive secondary check of libbfd +# catches this anomalous case of broken gcc libiberty. It turns out that +# it is possible to make the linker prefer the binutils version by +# specifying -L/usr/lib, thus the extensive test attempts to do so in an +# effort to resolve this unfortunate issue. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_LIBBFD], + [CS_CHECK_LIB_WITH([bfd], + [AC_LANG_PROGRAM([[#include ]], [bfd_init();])], + [], [], [], [], [], [], [-liberty]) + + AS_IF([test $cs_cv_libbfd = yes], + [CS_CHECK_BUILD([if libbfd is usable], [cs_cv_libbfd_ok], + [AC_LANG_PROGRAM([[#include ]], + [bfd* p; + asection* s; + bfd_init(); + p = bfd_openr(0,0); + bfd_check_format(p,bfd_object); + bfd_get_section_by_name(p,0); + bfd_section_size(p,s); + bfd_get_section_contents(p,s,0,0,0); + bfd_close(p);])], + [CS_CREATE_TUPLE() CS_CREATE_TUPLE([],[-L/usr/lib],[])], + [], [], [], [], + [$cs_cv_libbfd_cflags], + [$cs_cv_libbfd_lflags], + [$cs_cv_libbfd_libs])], + [cs_cv_libbfd_ok=no]) + + AS_IF([test $cs_cv_libbfd_ok = yes], + [CS_EMIT_BUILD_RESULT([cs_cv_libbfd_ok], [LIBBFD], + CS_EMITTER_OPTIONAL([$1])) + $2], + [$3])]) +# emit.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003-2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_EMIT_BUILD_PROPERTY(KEY, VALUE, [APPEND], [EMPTY-OKAY], [EMITTER], +# [UNCONDITIONAL]) +# A utility function which invokes an emitter to record the KEY/VALUE +# tuple if VALUE is not the empty string (after leading and trailing +# whitespace is stripped). If EMPTY-OKAY is not an empty string, then the +# property is emitted even if VALUE is empty; that is, it is emitted +# unconditionally. If APPEND is the empty string, then the emitter sets +# the key's value directly (though it may be overridden by the +# environment), otherwise the emitter appends VALUE to the existing value +# of the key. EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or +# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the +# KEY/VALUE tuple; it should also accept APPEND as an optional third +# argument. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. Some +# emitters accept an optional fourth argument, UNCONDITIONAL, which +# instructs it to set KEY's value unconditionally, even if KEY already +# had been assigned a value via some other mechanism (such as imported +# from the environment, or from Jambase, in the case of +# CS_JAMCONFIG_PROPERTY). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_EMIT_BUILD_PROPERTY], + [cs_build_prop_val="$2" + cs_build_prop_val=CS_TRIM([$cs_build_prop_val]) + m4_ifval([$4], + [CS_JAMCONFIG_PROPERTY([$1], [$cs_build_prop_val], [$3])], + AS_IF([test -n "$cs_build_prop_val"], + [m4_default([$5],[CS_JAMCONFIG_PROPERTY])( + [$1], [$cs_build_prop_val], [$3], [$6])]))]) + + + +#------------------------------------------------------------------------------ +# CS_EMIT_BUILD_RESULT(CACHE-VAR, PREFIX, [EMITTER]) +# Record the results of CS_CHECK_BUILD() or CS_CHECK_LIB_WITH() via some +# emitter. If CACHE-VAR indicates that the build succeeded, then the +# following properties are emitted: +# +# PREFIX.AVAILABLE = yes +# PREFIX.CFLAGS = $CACHE-VAR_cflags +# PREFIX.LFLAGS = $CACHE-VAR_lflags $CACHE-VAR_libs +# +# EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or +# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the +# KEY/VALUE tuple. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_EMIT_BUILD_RESULT], + [AS_IF([test "$$1" = yes], + [CS_EMIT_BUILD_PROPERTY([$2.AVAILABLE], [yes], [], [], [$3]) + CS_EMIT_BUILD_PROPERTY([$2.CFLAGS], [$$1_cflags], [], [], [$3]) + CS_EMIT_BUILD_PROPERTY([$2.LFLAGS], [$$1_lflags $$1_libs], + [], [], [$3])])]) + + + +#------------------------------------------------------------------------------ +# CS_EMIT_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE], EMITTER-KEY, +# [APPEND], [ACTION-IF-RECOGNIZED], +# [ACTION-IF-NOT-RECOGNIZED], [EMITTER]) +# A convenience wrapper for CS_CHECK_BUILD_FLAGS() which also records the +# results via CS_EMIT_BUILD_PROPERTY(). Checks if the compiler or linker +# recognizes a command-line option. MESSAGE is the "checking" message. +# CACHE-VAR is the shell cache variable which receives the flag +# recognized by the compiler or linker, or "no" if the flag was not +# recognized. FLAGS is a whitespace- delimited list of build tuples +# created with CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in +# order until one is found which is recognized by the compiler. After +# that, no further flags are checked. LANGUAGE is typically either C or +# C++ and specifies which compiler to use for the test. If LANGUAGE is +# omitted, C is used. EMITTER-KEY is the name to pass as the emitter's +# "key" argument if a usable flag is encountered. If APPEND is not the +# empty string, then the discovered flag is appended to the existing +# value of the EMITTER-KEY. If the command-line option was recognized, +# then ACTION-IF-RECOGNIZED is invoked, otherwise +# ACTION-IF-NOT-RECOGNIZED is invoked. EMITTER is a macro name, such as +# CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs the +# actual task of emitting the KEY/VALUE tuple; it should also accept +# APPEND as an optional third argument. If EMITTER is omitted, +# CS_JAMCONFIG_PROPERTY is used. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_EMIT_BUILD_FLAGS], + [CS_CHECK_BUILD_FLAGS([$1], [$2], [$3], [$4], + [CS_EMIT_BUILD_PROPERTY([$5], [$$2], [$6], [], [$9]) + $7], + [$8])]) + + + +#------------------------------------------------------------------------------ +# CS_EMITTER_OPTIONAL([EMITTER]) +# The CS_EMIT_FOO() macros optionally accept an emitter. If no emitter is +# supplied to those macros, then a default emitter is chosen. Other +# macros, however, which perform testing and optionally emit the results +# may wish to interpret an omitted EMITTER as a request not to emit the +# results. CS_EMITTER_OPTIONAL() is a convenience macro to help in these +# cases. It should be passed to one of the CS_EMIT_FOO() macros in place +# of the literal EMITTER argument. It functions by re-interpretating +# EMITTER as follows: +# +# - If EMITTER is omitted, then CS_NULL_EMITTER is returned, effectively +# disabling output by the CS_EMIT_FOO() macro. +# - If EMITTER is the literal string "emit" or "yes", then it returns an +# empty string, which signals to the CS_EMIT_FOO() macro that is should +# use its default emitter. +# - Any other value for EMITTER is passed along as-is to the +# CS_EMIT_FOO() macro. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_EMITTER_OPTIONAL], + [m4_case([$1], + [], [[CS_NULL_EMITTER]], + [emit], [], + [yes], [], + [[$1]])]) + + + +#------------------------------------------------------------------------------ +# CS_NULL_EMITTER(KEY, VALUE, [APPEND]) +# A do-nothing emitter suitable for use as the EMITTER argument of one of +# the CS_EMIT_FOO() macros. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_NULL_EMITTER], [: +]) + + + +#------------------------------------------------------------------------------ +# CS_SUBST_EMITTER(KEY, VALUE, [APPEND]) +# An emitter wrapped around AC_SUBST(). Invokes +# AC_SUBST(AS_TR_SH(KEY),VALUE). The APPEND argument is ignored. +# Suitable for use as the EMITTER argument of one of the CS_EMIT_FOO() +# macros. The call to AS_TR_SH() ensures that KEY is transformed into a +# valid shell variable. For instance, if a macro attempts to emit +# MYLIB.CFLAGS and MYLIB.LFLAGS via CS_SUBST_EMITTER(), then the names +# will be transformed to MYLIB_CFLAGS and MYLIB_LFLAGS, respectively, for +# the invocation of AC_SUBST(). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_SUBST_EMITTER], [AC_SUBST(AS_TR_SH([$1]),[$2])]) + + + +#------------------------------------------------------------------------------ +# CS_DEFINE_EMITTER(KEY, VALUE, [APPEND]) +# An emitter wrapped around AC_DEFINE_UNQUOTED(). Invokes +# AC_DEFINE_UNQUOTED(AS_TR_CPP(KEY),VALUE). The APPEND argument is +# ignored. Suitable for use as the EMITTER argument of one of the +# CS_EMIT_FOO() macros. The call to AS_TR_CPP() ensures that KEY is a +# well-formed token for the C-preprocessor. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_DEFINE_EMITTER], + [AC_DEFINE_UNQUOTED(AS_TR_CPP([$1]),[$2], + [Define when feature is available])]) +# headercache.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# Text cache facility for C-style #define properties. The cache is stored in +# the shell variable cs_header_text. +# +# CS_HEADER_APPEND(TEXT) +# Append text to the C header text cache. This is a cover for +# CS_TEXT_CACHE_APPEND(). +# +# CS_HEADER_PREPEND(TEXT) +# Prepend text to the C header text cache. This is a cover for +# CS_TEXT_CACHE_PREPEND(). +# +# CS_HEADER_PROPERTY(KEY, [VALUE]) +# Append a line of the form "#define KEY VALUE" to the C header text +# cache. If the VALUE argument is omitted, then the appended line has +# the simplified form "#define KEY". +# +# CS_HEADER_OUTPUT(FILENAME) +# Instruct config.status to write the C header text cache to the given +# filename. This is a cover for CS_TEXT_CACHE_OUTPUT(). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_HEADER_APPEND], [CS_TEXT_CACHE_APPEND([cs_header_text], [$1])]) +AC_DEFUN([CS_HEADER_PREPEND], [CS_TEXT_CACHE_PREPEND([cs_header_text], [$1])]) +AC_DEFUN([CS_HEADER_PROPERTY], +[CS_HEADER_APPEND([@%:@define $1[]m4_ifval([$2], [ $2], []) +])]) +AC_DEFUN([CS_HEADER_OUTPUT], [CS_TEXT_CACHE_OUTPUT([cs_header_text], [$1])]) +#----------------------------------------------------------------------------- +# installdirs.m4 (c) Matze Braun +# Macro for emitting the installation paths gathered by Autoconf. +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# CS_OUTPUT_INSTALLDIRS([EMITTER], [RAW-BACKSLASHES]) +# Emit installation directories collected by Autoconf. EMITTER is a macro +# name, such as CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs +# the actual task of emitting the KEY/VALUE tuple. If EMITTER is omitted, +# CS_JAMCONFIG_PROPERTY is used. If RAW-BACKSLASHES is not provided, then +# backslashes in emitted values are each escaped with an additional +# backslash. If RAW-BACKSLASHES is not the null value, then backslashes are +# emitted raw. The following properties are emitted: +# +# prefix +# exec_prefix +# bindir +# sbindir +# libexecdir +# datadir +# sysconfdir +# sharedstatedir +# localstatedir +# libdir +# includedir +# oldincludedir +# infodir +# mandir +#----------------------------------------------------------------------------- +AC_DEFUN([CS_OUTPUT_INSTALLDIRS],[ +# Handle the case when no prefix is given, and the special case when a path +# contains more than 2 slashes, these paths seem to be correct but Jam fails +# on them. +AS_IF([test $prefix = NONE], + [cs_install_prefix="$ac_default_prefix"], + [cs_install_prefix=`echo "$prefix" | sed -e 's:///*:/:g'`]) +AS_IF([test $exec_prefix = NONE], + [cs_install_exec_prefix="AS_ESCAPE([$(prefix)])"], + [cs_install_exec_prefix=`echo "$exec_prefix" | sed -e 's:///*:/:g'`]) + +_CS_OUTPUT_INSTALL_DIRS([$1], [prefix], + [CS_PREPARE_INSTALLPATH([$cs_install_prefix], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [exec_prefix], + [CS_PREPARE_INSTALLPATH([$cs_install_exec_prefix], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [bindir], + [CS_PREPARE_INSTALLPATH([$bindir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [sbindir], + [CS_PREPARE_INSTALLPATH([$sbindir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [libexecdir], + [CS_PREPARE_INSTALLPATH([$libexecdir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [datadir], + [CS_PREPARE_INSTALLPATH([$datadir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [sysconfdir], + [CS_PREPARE_INSTALLPATH([$sysconfdir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [sharedstatedir], + [CS_PREPARE_INSTALLPATH([$sharedstatedir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [localstatedir], + [CS_PREPARE_INSTALLPATH([$localstatedir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [libdir], + [CS_PREPARE_INSTALLPATH([$libdir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [includedir], + [CS_PREPARE_INSTALLPATH([$includedir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [oldincludedir], + [CS_PREPARE_INSTALLPATH([$oldincludedir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [infodir], + [CS_PREPARE_INSTALLPATH([$infodir], [$2])]) +_CS_OUTPUT_INSTALL_DIRS([$1], [mandir], + [CS_PREPARE_INSTALLPATH([$mandir], [$2])]) +]) + +AC_DEFUN([_CS_OUTPUT_INSTALL_DIRS], + [m4_default([$1], [CS_JAMCONFIG_PROPERTY])([$2], [$3])]) + + +#----------------------------------------------------------------------------- +# CS_PREPARE_INSTALLPATH(VALUE, [RAW-BACKSLASHES]) +# Transform variable references of the form ${bla} to $(bla) in VALUE and +# correctly quotes backslashes. This is needed if you need to emit some of +# the paths from Autoconf. RAW-BACKSLASHES has the same meaning as in +# CS_OUTPUT_INSTALLDIRS. +#----------------------------------------------------------------------------- +AC_DEFUN([CS_PREPARE_INSTALLPATH], +[`echo "$1" | sed 's/\${\([[a-zA-Z_][a-zA-Z_]]*\)}/$(\1)/g;m4_ifval([$2], + [s/\\/\\\\/g], [s/\\\\/\\\\\\\\/g])'`]) +# jamcache.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# Text cache facility for Jam-style properties. The cache is stored in +# the shell variable cs_jamfile_text. +# +# CS_JAMCONFIG_APPEND(TEXT) +# Append text to the Jam text cache. This is a cover for +# CS_TEXT_CACHE_APPEND(). +# +# CS_JAMCONFIG_PREPEND(TEXT) +# Prepend text to the Jam text cache. This is a cover for +# CS_TEXT_CACHE_PREPEND(). +# +# CS_JAMCONFIG_PROPERTY(KEY, VALUE, [APPEND], [UNCONDITIONAL]) +# Append a line of the form "KEY ?= VALUE" to the Jam text cache. If the +# APPEND argument is not the empty string, then VALUE is appended to the +# existing value of KEY using the form "KEY += VALUE". If the +# UNCONDITIONAL argument is not empty, then the value of KEY is set +# unconditionally "KEY = VALUE", rather than via "KEY ?= VALUE". APPEND +# takes precedence over UNCONDITIONAL. Note that if VALUE references +# other Jam variables, for example $(OBJS), then be sure to protect the +# value with AS_ESCAPE(). For example: +# CS_JAMCONFIG_PROPERTY([ALLOBJS], [AS_ESCAPE([$(OBJS) $(LIBOBJS)])]) +# +# CS_JAMCONFIG_OUTPUT(FILENAME) +# Instruct config.status to write the Jam text cache to the given +# filename. This is a cover for CS_TEXT_CACHE_OUTPUT(). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_JAMCONFIG_APPEND], + [CS_TEXT_CACHE_APPEND([cs_jamconfig_text], [$1])]) +AC_DEFUN([CS_JAMCONFIG_PREPEND], + [CS_TEXT_CACHE_PREPEND([cs_jamconfig_text], [$1])]) +AC_DEFUN([CS_JAMCONFIG_PROPERTY], + [CS_JAMCONFIG_APPEND( + [$1 m4_ifval([$3], [+=], m4_ifval([$4], [=], [?=])) \"$2\" ; +])]) +AC_DEFUN([CS_JAMCONFIG_OUTPUT], + [CS_TEXT_CACHE_OUTPUT([cs_jamconfig_text], [$1])]) +# makecache.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# Text cache facility for makefile-style properties. The cache is stored in +# the shell variable cs_makefile_text. +# +# CS_MAKEFILE_APPEND(TEXT) +# Append text to the makefile text cache. This is a cover for +# CS_TEXT_CACHE_APPEND(). +# +# CS_MAKEFILE_PREPEND(TEXT) +# Prepend text to the makefile text cache. This is a cover for +# CS_TEXT_CACHE_PREPEND(). +# +# CS_MAKEFILE_PROPERTY(KEY, VALUE, [APPEND]) +# Append a line of the form "KEY = VALUE" to the makefile text cache. If +# the APPEND argument is not the empty string, then VALUE is appended to +# the existing value of KEY using the form "KEY += VALUE". Note that if +# VALUE references other makefile variables, for example $(OBJS), then be +# sure to protect the value with AS_ESCAPE(). For example: +# CS_MAKEFILE_PROPERTY([ALLOBJS], [AS_ESCAPE([$(OBJS) $(LIBOBJS)])]) +# +# CS_MAKEFILE_OUTPUT(FILENAME) +# Instruct config.status to write the makefile text cache to the given +# filename. This is a cover for CS_TEXT_CACHE_OUTPUT(). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_MAKEFILE_APPEND], + [CS_TEXT_CACHE_APPEND([cs_makefile_text], [$1])]) +AC_DEFUN([CS_MAKEFILE_PREPEND], + [CS_TEXT_CACHE_PREPEND([cs_makefile_text], [$1])]) +AC_DEFUN([CS_MAKEFILE_PROPERTY], + [CS_MAKEFILE_APPEND([$1 m4_ifval([$3], [+=], [=]) $2 +])]) +AC_DEFUN([CS_MAKEFILE_OUTPUT],[CS_TEXT_CACHE_OUTPUT([cs_makefile_text], [$1])]) +# mkdir.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_CHECK_MKDIR +# Determine how to create a directory and a directory tree. Sets the +# shell variable MKDIR to the command which creates a directory, and +# MKDIRS to the command which creates a directory tree. Invokes +# AC_SUBST() for MKDIR and MKDIRS. +# +# IMPLEMENTATION NOTES +# We need to know the exact commands, so that we can emit them, thus the +# AS_MKDIR_P function is not what we want to use here since it does not +# provide access to the commands (and might not even discover suitable +# commands). First try "mkdir -p", then try the older "mkdirs". +# Finally, if the mkdir command failed to recognize -p, then it might +# have created a directory named "-p", so clean up that bogus directory. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_CHECK_MKDIR], + [AC_CACHE_CHECK([how to create a directory], [cs_cv_shell_mkdir], + [cs_cv_shell_mkdir='mkdir']) + AC_SUBST([MKDIR], [$cs_cv_shell_mkdir]) + + AC_CACHE_CHECK([how to create a directory tree], [cs_cv_shell_mkdir_p], + [if $cs_cv_shell_mkdir -p . 2>/dev/null; then + cs_cv_shell_mkdir_p='mkdir -p' + elif mkdirs . 2>/dev/null; then + cs_cv_shell_mkdir_p='mkdirs' + fi + test -d ./-p && rmdir ./-p]) + AS_VAR_SET_IF([cs_cv_shell_mkdir_p], + [AC_SUBST([MKDIRS], [$cs_cv_shell_mkdir_p])], + [CS_MSG_ERROR([do not know how to create a directory tree])])]) + + + +#------------------------------------------------------------------------------ +# Replacement for AS_MKDIR_P() from m4sugar/m4sh.m4 which fixes two problems +# which are present in Autoconf 2.57 and probably all earlier 2.5x versions. +# This bug, along with a patch, was submitted to the Autoconf GNATS database by +# Eric Sunshine as #227 on 17-Dec-2002. The bogus "-p" directory bug was fixed +# for Autoconf 2.58 on 26-Sep-2003. The "mkdirs" optimization was not accepted +# (since it is unnecessary; it's only an optimization). +# +# 1) Removes bogus "-p" directory which the stock AS_MKDIR_P() leaves laying +# around in the working directory if the mkdir command does not recognize +# the -p option. +# 2) Takes advantage of the older "mkdirs" program if it exists and if "mkdir +# -p" does not work. +#------------------------------------------------------------------------------ +m4_defun([_AS_MKDIR_P_PREPARE], +[if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p' +elif mkdirs . 2>/dev/null; then + as_mkdir_p='mkdirs' +else + as_mkdir_p='' +fi +test -d ./-p && rmdir ./-p +])# _AS_MKDIR_P_PREPARE + +m4_define([AS_MKDIR_P], +[AS_REQUIRE([_$0_PREPARE])dnl +{ if test -n "$as_mkdir_p"; then + $as_mkdir_p $1 + else + as_dir=$1 + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`AS_DIRNAME("$as_dir")` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || AS_ERROR([cannot create directory $1]); } +])# AS_MKDIR_P +#============================================================================== +# packageinfo.m4 +# Macros for setting general info on the package, such as name and version +# numbers and propagate them to the generated make and Jam property files. +# +# Copyright (C)2003 by Matthias Braun +# Copyright (C)2003,2004 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== + +#------------------------------------------------------------------------------ +# CS_PACKAGEINFO([LONGNAME], [COPYRIGHT, [HOMEPAGE]) +# Set additional information for the package. Note that the version +# number of your application should only contain numbers, because on +# Windows you can only set numerical values in some of the file +# properties (such as versioninfo .rc files). +#------------------------------------------------------------------------------ +AC_DEFUN([CS_PACKAGEINFO], + [PACKAGE_LONGNAME="[$1]" + PACKAGE_COPYRIGHT="[$2]" + PACKAGE_HOMEPAGE="[$3]" +]) + + +#------------------------------------------------------------------------------ +# CS_EMIT_PACKAGEINFO([EMITTER]) +# Emit extended package information using the provided EMITTER. EMITTER +# is a macro name, such as CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, +# which performs the actual task of emitting the KEY/VALUE tuple. If +# EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. For backward +# compatibility, if EMITTER is the literal value "jam", then +# CS_JAMCONFIG_PROPERTY is used; if it is "make", then +# CS_MAKEFILE_PROPERTY is used; however use of these literal names is +# highly discouraged. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_EMIT_PACKAGEINFO], + [_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_NAME], [$PACKAGE_NAME]) + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_VERSION], [$PACKAGE_VERSION]) + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_STRING], [$PACKAGE_STRING]) + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_BUGREPORT], [$PACKAGE_BUGREPORT]) + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_LONGNAME], [$PACKAGE_LONGNAME]) + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_HOMEPAGE], [$PACKAGE_HOMEPAGE]) + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_COPYRIGHT], [$PACKAGE_COPYRIGHT]) + for cs_veritem in m4_translit(AC_PACKAGE_VERSION, [.], [ ]); do + _CS_EMIT_PACKAGEINFO([$1], [PACKAGE_VERSION_LIST], [$cs_veritem], [+]) + done + ]) + +AC_DEFUN([_CS_EMIT_PACKAGEINFO], + [m4_case([$1], + [make], [CS_MAKEFILE_PROPERTY([$2], [$3], [$4])], + [jam], [CS_JAMCONFIG_PROPERTY([$2], [$3], [$4])], + [], [CS_JAMCONFIG_PROPERTY([$2], [$3], [$4])], + [$1([$2], [$3], [$4])])]) +# path.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2004 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_PATH_NORMALIZE(STRING) +# Normalize a pathname at run-time by transliterating Windows/DOS +# backslashes to forward slashes. Also collapses whitespace. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_PATH_NORMALIZE], +[`echo "x$1" | tr '\\\\' '/' | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`]) + + +#------------------------------------------------------------------------------ +# CS_RUN_PATH_NORMALIZE(COMMAND) +# Normalize the pathname emitted by COMMAND by transliterating +# Windows/DOS backslashes to forward slashes. Also collapses whitespace. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_RUN_PATH_NORMALIZE], +[`AC_RUN_LOG([$1]) | tr '\\\\' '/' | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`]) +############################################################################### +# progver.m4 +# Written by Norman Kramer +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +############################################################################### +# +# From the input pattern we create regular expressions we send through sed +# to extract the version information from the standard input to sed. +# Then we extract from the resulting version string subparts. +# The same happens with the supplied version string. It too is split into its +# subparts according to the pattern. +# Then the subparts from the gathered version string and the supplied one are +# compared. +# +# How does the pattern look like ? +# It is a sequence of 9s and _s and separators. +# 9 denotes a non empty sequence of digits. +# _ denotes a non empty sequence of characters from the class [a-zA-Z]. +# | everything behind is optional +# Everything else is treated as a separator. +# Consecutive 9s and _s are compressed to contain only one of each type. +# For instance "99_.9.__abc9_" will become "9_.9._abc9_". +# +# How we find the parts we compare ? +# From this transformed string we yield the parts we will later compare. +# We break up the string as follows: +# Any sequence of separators represent one breakup. Additional breakups are +# placed behind every 9 and _ . +# So the example from above will give: +# +# "99_.9.__abc9_" ===compress==> "9_.9._abc9_" ===breakup==> "9" "_" "9" "_" "9" "_" +# +# How we create the regular expressions ? +# We take the compressed pattern and quote every separator. +# The we replace the 9s with [0-9][0-9]* +# and the _s with [a-zA-Z][a-zA-Z]* . +# The above example will become: +# +# "99_.9.__abc9_" ===compress==> "9_.9._abc9_" ===rexify==> +# [0-9][0-9]*[a-zA-Z][a-zA-Z]*\.[0-9][0-9]*\.[a-zA-Z][a-zA-Z]*\a\b\c[0-9][0-9]*[a-zA-Z][a-zA-Z]* +# +# Voila. +# +# To yield the subparts from the string we additionally enclose the +# 9s and _s with \( and \). +# +############################################################################### + +# **************************************************************** +# ** helper definitions ** +# **************************************************************** +m4_define([CS_VCHK_RUNTH], [m4_pushdef([i], [$1])m4_if($1,0,,[CS_VCHK_RUNTH(m4_decr($1), [$2])][$2])m4_popdef([i])]) +m4_define([CS_VCHK_PREFIX], []) +m4_define([CS_VCHK_SUFFIX], []) +m4_define([CS_VCHK_GROUPPREFIX], [\(]) +m4_define([CS_VCHK_GROUPSUFFIX], [\)]) +m4_define([CS_VCHK_CHAR], [[[[a-zA-Z]]]]) +m4_define([CS_VCHK_DIGIT], [[[0-9]]]) +m4_define([CS_VCHK_SEQUENCE], [CS_VCHK_PREFIX[]CS_VCHK_SINGLE[]CS_VCHK_SINGLE[]*CS_VCHK_SUFFIX[]]) +m4_define([CS_VCHK_OPTSEQUENCE], [CS_VCHK_PREFIX[]CS_VCHK_SINGLE[]*CS_VCHK_SUFFIX[]]) +m4_define([CS_VCHK_REXSEQ], [m4_bpatsubst($1, [$2], [[]CS_VCHK_SEQUENCE[]])]) +m4_define([CS_VCHK_GROUPINGON], [m4_pushdef([CS_VCHK_PREFIX], [CS_VCHK_GROUPPREFIX])m4_pushdef([CS_VCHK_SUFFIX], [CS_VCHK_GROUPSUFFIX])]) +m4_define([CS_VCHK_GROUPINGOFF], [m4_popdef([CS_VCHK_SUFFIX])m4_popdef([CS_VCHK_PREFIX])]) +m4_define([CS_VCHK_OPTON], [m4_pushdef([CS_VCHK_SEQUENCE], [CS_VCHK_OPTSEQUENCE])]) +m4_define([CS_VCHK_OPTOFF], [m4_popdef([CS_VCHK_SEQUENCE])]) +m4_define([CS_VCHK_RMOPT], [CS_VCHK_RMCHAR([$1], m4_index([$1], [|]))]) +m4_define([CS_VCHK_RMCHAR], [m4_if($2,-1,[$1],m4_substr([$1], 0, $2)[]m4_substr([$1], m4_incr($2)))]) +m4_define([CS_VCHK_RMALL], [m4_translit([$1], [|], [])]) +m4_define([CS_VCHK_CUTOFF], [m4_if(m4_index($1,[|]),-1, [$1], [m4_substr($1, 0, m4_index($1,[|]))])]) +m4_define([CS_VCHK_CYCLEOPT], [ +m4_if($2,-1,, [m4_pushdef([i], CS_VCHK_CUTOFF([$1])) m4_pushdef([j], CS_VCHK_DUMMY_TAIL([$1])) CS_VCHK_CYCLEOPT( CS_VCHK_RMOPT([$1]), m4_index($1, [|]), [$3])$3 m4_popdef([i]) m4_popdef([j])]) +]) +m4_define([CS_VCHK_TAIL], [m4_if(m4_index($1,[|]),-1, [], [m4_substr($1, m4_incr(m4_index($1,[|])))])]) +m4_define([CS_VCHK_DUMMY_COMPRESS], [m4_bpatsubst(m4_bpatsubst([$1], [__*], [A]), [99*], [0])]) +m4_define([CS_VCHK_DUMMY_TAIL], [CS_VCHK_DUMMY_COMPRESS(m4_translit(CS_VCHK_TAIL([$1]), [|], []))]) + +# **************************************************************** +# ** FlagsOn / FlagsOff ** +# **************************************************************** +m4_define([CS_VCHK_FLAGSON], +[m4_if($#, 0, [], + $1, [], [], + [$1], [group], [CS_VCHK_GROUPINGON[]], + [$1], [opt], [CS_VCHK_OPTON[]])dnl +m4_if($#, 0, [], $1, [], [], [CS_VCHK_FLAGSON(m4_shift($@))])]) + +m4_define([CS_VCHK_FLAGSOFF], +[m4_if($#, 0, [], + $1, [], [], + $1, [group], [CS_VCHK_GROUPINGOFF[]], + [$1], [opt], [CS_VCHK_OPTOFF[]])dnl +m4_if($#, 0, [], $1, [], [], [CS_VCHK_FLAGSOFF(m4_shift($@))])]) + +# **************************************************************** +# ** rexify / sedify ** +# **************************************************************** +m4_define([CS_VCHK_REXIFY], +[m4_pushdef([CS_VCHK_SINGLE], [$1])dnl +CS_VCHK_FLAGSON(m4_shift(m4_shift(m4_shift($@))))dnl +CS_VCHK_REXSEQ([$3], [$2])dnl +CS_VCHK_FLAGSOFF(m4_shift(m4_shift(m4_shift($@))))dnl +m4_popdef([CS_VCHK_SINGLE])]) + +m4_define([CS_VCHK_QUOTESEP], [m4_bpatsubst($1, [[^9_]], [\\\&])]) + +m4_define([CS_VCHK_REXCHAR], [CS_VCHK_REXIFY([CS_VCHK_CHAR], [__*], $@)]) +m4_define([CS_VCHK_REXDIGIT], [CS_VCHK_REXIFY([CS_VCHK_DIGIT], [99*], $@)]) +m4_define([CS_VCHK_SEDIFY], [CS_VCHK_REXDIGIT([CS_VCHK_REXCHAR([CS_VCHK_QUOTESEP([$1])], m4_shift($@))], m4_shift($@))]) +m4_define([CS_VCHK_SEDEXPRALL], [/CS_VCHK_SEDIFY([$1])/!d;s/.*\(CS_VCHK_SEDIFY([$1])\).*/\1/;q]) +m4_define([CS_VCHK_SEDEXPRNTH], [/CS_VCHK_SEDIFY([$1])/!d;s/.*CS_VCHK_SEDIFY([$1],[group]).*/\$2/]) + +# **************************************************************** +# ** Pattern splitting ** +# **************************************************************** +m4_define([CS_VCHK_SPLITSEP], [CS_VCHK_REXIFY([s], [[^9_][^9_]*], $@)]) +m4_define([CS_VCHK_SPLITDIGIT], [CS_VCHK_REXIFY([d], [99*], $@)]) +m4_define([CS_VCHK_SPLITCHAR], [CS_VCHK_REXIFY([c], [__*], $@)]) + +# **************************************************************** +# ** return a list of 's' 'd' 'c' 'e' chars denoting the kind ** +# ** pattern parts: separator, digit, char, end ** +# **************************************************************** +m4_define([CS_VCHK_PATTERNLIST], [m4_pushdef([CS_VCHK_SEQUENCE], [CS_VCHK_SINGLE ])dnl +m4_translit(CS_VCHK_SPLITDIGIT([CS_VCHK_SPLITCHAR([CS_VCHK_SPLITSEP([$1])])]), [ ], m4_if([$2],[],[ ],[$2]))e[]dnl +m4_popdef([CS_VCHK_SEQUENCE])]) + +# **************************************************************** +# ** Build the shell commands we emit to the configure script. ** +# **************************************************************** +m4_define([CS_VCHK_PATCOUNT], [m4_len(m4_bpatsubst(CS_VCHK_PATTERNLIST([$1]), [[^dc]]))]) + +# **************************************************************************************** +# ** CS_VCHK_EXTRACTVERSION(EXTRACT_CALL, MIN_VERSION, PATTERN, PRGPREFIX, COMPARISION) ** +# **************************************************************************************** +m4_define([CS_VCHK_EXTRACTVERSION], +[cs_prog_$4_is_version= +cs_prog_$4_min_version= +cs_prog_$4_is_suffix= +cs_prog_$4_min_suffix= +cs_prog_$4_is_suffix_done= +cs_prog_$4_min_suffix_done= +CS_VCHK_CYCLEOPT([$3], [], +[test -z $cs_prog_$4_is_version && cs_prog_$4_is_version=`$1 | sed 'CS_VCHK_SEDEXPRALL([i])'` +test -n "$cs_prog_$4_is_version" && test -z $cs_prog_$4_is_suffix_done && { cs_prog_$4_is_suffix_done=yes ; cs_prog_$4_is_suffix=j ; } +]) +CS_VCHK_CYCLEOPT([$3], , +[test -z $cs_prog_$4_min_version && cs_prog_$4_min_version=`echo $2 | sed 'CS_VCHK_SEDEXPRALL([i])'` +test -n "$cs_prog_$4_min_version" && test -z $cs_prog_$4_min_suffix_done && { cs_prog_$4_min_suffix_done=yes ; cs_prog_$4_min_suffix=j ; } +]) +CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])], + [cs_prog_$4_is_ver_[]i=`echo ${cs_prog_$4_is_version}${cs_prog_$4_is_suffix} | sed 'CS_VCHK_SEDEXPRNTH([CS_VCHK_RMALL([$3])], [i])'` +]) +CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])], + [cs_prog_$4_min_ver_[]i=`echo $cs_prog_$4_min_version${cs_prog_$4_min_suffix} | sed 'CS_VCHK_SEDEXPRNTH([CS_VCHK_RMALL([$3])], [i])'` +]) +cs_cv_prog_$4_version_ok='' +CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])], +[test -z "$cs_cv_prog_$4_version_ok" && { expr "$cs_prog_$4_is_ver_[]i" "$5" "$cs_prog_$4_min_ver_[]i" >/dev/null || cs_cv_prog_$4_version_ok=no ; } +test -z "$cs_cv_prog_$4_version_ok" && { expr "$cs_prog_$4_min_ver_[]i" "$5" "$cs_prog_$4_is_ver_[]i" >/dev/null || cs_cv_prog_$4_version_ok=yes ; } +]) +AS_IF([test -z "$cs_cv_prog_$4_version_ok"], [cs_cv_prog_$4_version_ok=yes]) +cs_cv_prog_$4_version_ok_annotated="$cs_cv_prog_$4_version_ok" +AS_IF([test -n "$cs_prog_$4_is_version"], + [cs_cv_prog_$4_version_ok_annotated="$cs_cv_prog_$4_version_ok_annotated (version $cs_prog_$4_is_version)"]) +]) + +############################################################################## +# CS_CHECK_PROG_VERSION(PROG, EXTRACT_CALL, VERSION, PATTERN, +# [ACTION-IF-OKAY], [ACTION-IF-NOT-OKAY], [CMP]) +# Check the version of a program PROG. +# Version information is emitted by EXTRACT_CALL (for instance "bison -V"). +# The discovered program version is compared against VERSION. +# The pattern of the version string matches PATTERN +# The extracted version and the supplied version are compared with the CMP +# operator. i.e. EXTRACTED_VERSION CMP SUPPLIED_VERSION +# CMP defaults to >= if not specified. +# ACTION-IF-OKAY is invoked if comparision yields true, otherwise +# ACTION-IF-NOT-OKAY is invoked. +# +# PATTERN literals: 9 .. marks a non empty sequence of digits +# _ .. marks a non empty sequence of characters from [a-zA-Z] +# | .. everything behind is optional +# .. everything else is taken as separator - it is better +# to not try stuff like space, slash or comma. +# +# The test results in cs_cv_prog_PROG_version_ok being either yes or no. +############################################################################## +AC_DEFUN([CS_CHECK_PROG_VERSION], +[AC_CACHE_CHECK([if $1 version m4_default([$7],[>=]) $3], + [AS_TR_SH([cs_cv_prog_$1_version_ok_annotated])], + [CS_VCHK_EXTRACTVERSION([$2], [$3], [$4], AS_TR_SH([$1]), + m4_default([$7],[>=]))]) +AS_IF([test "$AS_TR_SH([cs_cv_prog_$1_version_ok])" = yes], [$5], [$6])]) +# qualify.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_SYMBOL_QUALIFIER(MESSAGE, CACHE-VAR, QUALIFIERS, [SYMBOL], [LANG], +# [ACTION-IF-ACCEPTED], [ACTION-IF-NOT-ACCEPTED]) +# Test if a symbol can be qualified by one of the elements of the +# comma-separated list of QUALIFIERS. Examples of qualifiers include +# __attribute__((deprecated)), __declspec(dllimport), etc. MESSAGE is the +# "checking" message. CACHE-VAR is the variable which receives the +# qualifier which succeeded, or the the literal "no" if none were +# accepted. SYMBOL is the symbol to which the qualifier should be +# applied. If omitted, then SYMBOL defaults to "void f();". LANG is the +# language of the test, typically "C" or "C++". It defaults to "C" if +# omitted. ACTION-IF-ACCEPTED is invoked after CACHE-VAR is set if one of +# the qualifiers is accepted, else ACTION-IF-NOT-ACCEPTED is invoked. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_SYMBOL_QUALIFIER], + [AC_CACHE_CHECK([$1], [$2], + [$2='no' + m4_foreach([cs_symbol_qualifier], [$3], + [AS_IF([test "$$2" = no], + [CS_BUILD_IFELSE( + [AC_LANG_PROGRAM( + [cs_symbol_qualifier m4_default([$4],[void f()]);], + [])], + [], [$5], [$2='cs_symbol_qualifier'], [$2='no'])])])]) + AS_IF([test $$2 != no], [$6], [$7])]) +# split.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_SPLIT(LINE, [OUTPUT-VARIABLES], [DELIMITER], [FILLER]) +# Split LINE into individual tokens. Tokens are delimited by DELIMITER, +# which is the space character if omitted. OUTPUT-VARIABLES is a +# comma-delimited list of shell variables which should receive the +# extracted tokens. If there are too few tokens to fill the output +# variables, then the excess variables will be assigned the empty string. +# If there are too few output variables, then the excess tokens will be +# ignored. If OUTPUT-VARIABLES is omitted, then the split tokens will be +# assigned to the shell meta-variables $1, $2, $3, etc. When +# OUTPUT-VARIABLES is omitted, FILLER is assigned to meta-variables in +# cases where DELIMITER delimits a zero-length token. FILLER defaults +# to "filler". For example, if DELIMITER is "+" and OUTPUT-VARIABLES is +# omitted, given the line "one++three", $1 will be "one", $2 will be +# "filler", and $3 will be "three". +#------------------------------------------------------------------------------ +AC_DEFUN([CS_SPLIT], + [m4_define([cs_split_filler], m4_default([$4],[filler])) + set cs_split_filler `echo "$1" | awk 'BEGIN { FS="m4_default([$3],[ ])" } + { for (i=1; i <= NF; ++i) + { if ($i == "") print "cs_split_filler"; else print $i } }'` + shift + m4_map([_CS_SPLIT], [$2])]) + +AC_DEFUN([_CS_SPLIT], + [AS_IF([test $[@%:@] -eq 0], [$1=''], + [AS_IF([test "$[1]" = cs_split_filler], [$1=''], [$1=$[1]]) + shift])]) +# textcache.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# Text cache facility. These macros provide a way to incrementally store +# arbitrary text in a shell variable, and to write the saved text to a file. +# +# CS_TEXT_CACHE_APPEND(VARIABLE, TEXT) +# Append text to the contents of the named shell variable. If the text +# contains references to shell variables (such as $foo), then those +# references will be expanded. If expansion is not desired, then protect +# the text with AS_ESCAPE(). +# +# CS_TEXT_CACHE_PREPEND(VARIABLE, TEXT) +# Prepend text to the contents of the named shell variable. If the text +# contains references to shell variables (such as $foo), then those +# references will be expanded. If expansion is not desired, then protect +# the text with AS_ESCAPE(). +# +# CS_TEXT_CACHE_OUTPUT(VARIABLE, FILENAME) +# Instruct config.status to write the contents of the named shell +# variable to the given filename. If the file resides in a directory, +# the directory will be created, if necessary. If the output file +# already exists, and if the cached text is identical to the contents of +# the existing file, then the existing file is left alone, thus its time +# stamp remains unmolested. This heuristic may help to minimize rebuilds +# when the file is listed as a dependency in a makefile. +# +# *NOTE* +# There is a bug in Autoconf 2.57 and probably all earlier 2.5x versions +# which results in errors if AC_CONFIG_COMMANDS is invoked for a `tag' +# which represents a file in a directory which does not yet exist. +# Unfortunately, even invoking AS_MKDIR_P in the `cmd' portion of +# AC_CONFIG_COMMANDS does not solve the problem because the generated +# configure script attempts to access information about the directory +# before AS_MKDIR_P has a chance to create it. This forces us to invoke +# AS_MKDIR_P in the third argument to AC_CONFIG_COMMANDS (the +# `init-cmds') rather than the second (the `cmds'). This is undesirable +# because it means that the directory will be created anytime +# config.status is invoked (even for a simple --help), rather than being +# created only when requested to output the text cache. This bug was +# submitted to the Autoconf GNATS database by Eric Sunshine as #228 on +# 27-Dec-2002. It was fixed for Autoconf 2.58 on 26-Sep-2003. The +# official fix makes the assumption that `tag' always represents a file +# (as opposed to some generic target), and creates the file's directory +# is not present. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_TEXT_CACHE_APPEND], [$1="${$1}$2"]) +AC_DEFUN([CS_TEXT_CACHE_PREPEND], [$1="$2${$1}"]) +AC_DEFUN([CS_TEXT_CACHE_OUTPUT], + [AC_CONFIG_COMMANDS([$2], + [echo $ECHO_N "$$1$ECHO_C" > $tmp/tcache + AS_IF([diff $2 $tmp/tcache >/dev/null 2>&1], + [AC_MSG_NOTICE([$2 is unchanged])], + [rm -f $2 + cp $tmp/tcache $2]) + rm -f $tmp/tcache], + [$1='$$1' + cs_dir=`AS_DIRNAME([$2])` + AS_ESCAPE(AS_MKDIR_P([$cs_dir]), [$`\])])]) +# trim.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2003 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_TRIM(STRING) +# Strip leading and trailing spaces from STRING and collapse internal +# runs of multiple spaces to a single space. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_TRIM], [`echo x$1 | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`]) +# warnings.m4 -*- Autoconf -*- +#============================================================================== +# Copyright (C)2005 by Eric Sunshine +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================== +AC_PREREQ([2.56]) + +#------------------------------------------------------------------------------ +# CS_COMPILER_WARNINGS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check how to enable compilation warnings. If LANGUAGE is not provided, +# then `C' is assumed (other options include `C++'). If CACHE-VAR is not +# provided, then it defaults to the name +# "cs_cv_prog_compiler_enable_warnings". If an option for enabling +# warnings (such as `-Wall') is discovered, then it is assigned to +# CACHE-VAR and ACTION-IF-FOUND is invoked; otherwise the empty string is +# assigned to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. +# +# IMPLEMENTATION NOTES +# +# On some platforms, it is more appropriate to use -Wmost rather than +# -Wall even if the compiler understands both, thus we attempt -Wmost +# before -Wall. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_WARNINGS], + [CS_CHECK_BUILD_FLAGS( + [how to enable m4_default([$1],[C]) compilation warnings], + [m4_default([$2],[cs_cv_prog_compiler_enable_warnings])], + [CS_CREATE_TUPLE([-Wmost]) CS_CREATE_TUPLE([-Wall])], + [$1], [$3], [$4])]) + + + +#------------------------------------------------------------------------------ +# CS_COMPILER_ERRORS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check how to promote compilation diganostics from warning to error +# status. If LANGUAGE is not provided, then `C' is assumed (other options +# include `C++'). If CACHE-VAR is not provided, then it defaults to the +# name "cs_cv_prog_compiler_enable_errors". If an option for performing +# this promotion (such as `-Werror') is discovered, then it is assigned +# to CACHE-VAR and ACTION-IF-FOUND is invoked; otherwise the empty string +# is assigned to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_ERRORS], + [CS_CHECK_BUILD_FLAGS( + [how to treat m4_default([$1],[C]) warnings as errors], + [m4_default([$2],[cs_cv_prog_compiler_enable_errors])], + [CS_CREATE_TUPLE([-Werror])], [$1], [$3], [$4])]) + + + +#------------------------------------------------------------------------------ +# CS_COMPILER_IGNORE_UNUSED([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check how to instruct compiler to ignore unused variables and +# arguments. This option may be useful for code generated by tools, such +# as Swig, Bison, and Flex, over which the client has no control, yet +# wishes to compile without excessive diagnostic spew. If LANGUAGE is +# not provided, then `C' is assumed (other options include `C++'). If +# CACHE-VAR is not provided, then it defaults to the name +# "cs_cv_prog_compiler_ignore_unused". If an option (such as +# `-Wno-unused') is discovered, then it is assigned to CACHE-VAR and +# ACTION-IF-FOUND is invoked; otherwise the empty string is assigned to +# CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_IGNORE_UNUSED], + [CS_CHECK_BUILD_FLAGS( + [how to suppress m4_default([$1],[C]) unused variable warnings], + [m4_default([$2],[cs_cv_prog_compiler_ignore_unused])], + [CS_CREATE_TUPLE([-Wno-unused])], [$1], [$3], [$4])]) + + + +#------------------------------------------------------------------------------ +# CS_COMPILER_IGNORE_UNINITIALIZED([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check how to instruct compiler to ignore uninitialized variables. This +# option may be useful for code generated by tools, such as Swig, Bison, +# and Flex, over which the client has no control, yet wishes to compile +# without excessive diagnostic spew. If LANGUAGE is not provided, then +# `C' is assumed (other options include `C++'). If CACHE-VAR is not +# provided, then it defaults to the name +# "cs_cv_prog_compiler_ignore_uninitialized". If an option (such as +# `-Wno-uninitialized') is discovered, then it is assigned to CACHE-VAR +# and ACTION-IF-FOUND is invoked; otherwise the empty string is assigned +# to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_IGNORE_UNINITIALIZED], + [CS_CHECK_BUILD_FLAGS( + [how to suppress m4_default([$1],[C]) uninitialized warnings], + [m4_default([$2], + [cs_cv_prog_compiler_ignore_uninitialized_variables])], + [CS_CREATE_TUPLE([-Wno-uninitialized])], [$1], [$3], [$4])]) + + + +#------------------------------------------------------------------------------ +# CS_COMPILER_IGNORE_PRAGMAS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check how to instruct compiler to ignore unrecognized #pragma +# directives. This option may be useful for code which contains +# unprotected #pragmas which are not understood by all compilers. If +# LANGUAGE is not provided, then `C' is assumed (other options include +# `C++'). If CACHE-VAR is not provided, then it defaults to the name +# "cs_cv_prog_compiler_ignore_unknown_pragmas". If an option (such as +# `-Wno-unknown-pragmas') is discovered, then it is assigned to CACHE-VAR +# and ACTION-IF-FOUND is invoked; otherwise the empty string is assigned +# to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_IGNORE_PRAGMAS], + [CS_CHECK_BUILD_FLAGS( + [how to suppress m4_default([$1],[C]) unknown [#pragma] warnings], + [m4_default([$2],[cs_cv_prog_compiler_ignore_unknown_pragmas])], + [CS_CREATE_TUPLE([-Wno-unknown-pragmas])], [$1], [$3], [$4])]) + + + +#------------------------------------------------------------------------------ +# CS_COMPILER_IGNORE_LONG_DOUBLE([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# Check how to instruct compiler to suppress warnings about `long double' +# usage. This option may be useful for code generated by tools, such as +# Swig, Bison, and Flex, over which the client has no control, yet wishes +# to compile without excessive diagnostic spew. If LANGUAGE is not +# provided, then `C' is assumed (other options include `C++'). If +# CACHE-VAR is not provided, then it defaults to the name +# "cs_cv_prog_compiler_ignore_long_double". If an option (such as +# `-Wno-long-double') is discovered, then it is assigned to CACHE-VAR and +# ACTION-IF-FOUND is invoked; otherwise the empty string is assigned to +# CACHE-VAR and ACTION-IF-NOT-FOUND is invoked. +#------------------------------------------------------------------------------ +AC_DEFUN([CS_COMPILER_IGNORE_LONG_DOUBLE], + [CS_CHECK_BUILD_FLAGS( + [how to suppress m4_default([$1],[C]) `long double' warnings], + [m4_default([$2],[cs_cv_prog_compiler_ignore_long_double])], + [CS_CREATE_TUPLE([-Wno-long-double])], [$1], [$3], [$4])]) diff --git a/configure.ac b/configure.ac index 3649bd471..de9048898 100644 --- a/configure.ac +++ b/configure.ac @@ -1,118 +1,118 @@ -#---------------------------------------------------------------------------- -# Autoconf input script. Invoke the ./autogen.sh script to generate a -# configure script from this file. -#---------------------------------------------------------------------------- -AC_PREREQ([2.54]) - -#---------------------------------------------------------------------------- -# Initialize Autoconf. -#---------------------------------------------------------------------------- -AC_INIT( - [bullet], - [2.76], - [bullet@erwincoumans.com]) -AC_CANONICAL_HOST -AC_CONFIG_SRCDIR([configure.ac]) -AM_INIT_AUTOMAKE -AM_PROG_CC_C_O -AC_PROG_CXX -AC_PROG_LIBTOOL - -case "$host" in - *-*-mingw*|*-*-cygwin*) - AC_DEFINE(PLATFORM_WIN32, 1, [Platform is Win32]) - opengl_LIBS="-lunsupported_platform" - PLATFORM_STRING="Win32" - ;; - *-*-linux*) - AC_DEFINE(PLATFORM_LINUX, 1, [Platform is Linux]) - opengl_LIBS="-lGL -lGLU -lglut" - PLATFORM_STRING="Linux" - ;; - *-*-darwin*) - AC_DEFINE(PLATFORM_APPLE, 1, [Platform is Apple]) - opengl_LIBS="-framework AGL -framework OpenGL -framework GLUT" - PLATFORM_STRING="Apple" - ;; - *) - AC_MSG_WARN([*** Please add $host to configure.ac checks!]) - ;; -esac -AC_SUBST(opengl_LIBS) - -case "$host" in - i?86-* | k?-* | athlon-* | pentium*-) - AC_DEFINE(ARCH_X86, 1, [Architecture is x86]) - ARCH_SPECIFIC_CFLAGS="" - ARCH_STRING="X86" - ;; - x86_64-*) - AC_DEFINE(ARCH_X86_64, 1, [Architecture is x86-64]) - ARCH_SPECIFIC_CFLAGS="-DUSE_ADDR64" - ARCH_STRING="X86-64" - ;; - ppc-* | powerpc-*) - AC_DEFINE(ARCH_PPC, 1, [Architecture is PowerPC]) - ARCH_SPECIFIC_CFLAGS="" - ARCH_STRING="PowerPC" - ;; - *) - AC_MSG_ERROR([Unknown Architecture]) - ;; -esac -AC_C_BIGENDIAN - - -#---------------------------------------------------------------------------- -# Setup for the configuration header. -#---------------------------------------------------------------------------- -AC_CONFIG_HEADERS([config.h]) -#---------------------------------------------------------------------------- -# Package configuration switches. -#---------------------------------------------------------------------------- -AC_ARG_ENABLE([multithreaded], - [AC_HELP_STRING([--enable-multithreaded], - [build BulletMultiThreaded (default NO)])], - [disable_multithreaded=no], [disable_multithreaded=yes]) -AC_MSG_CHECKING([BulletMultiThreaded]) -AS_IF([test "$disable_multithreaded" = yes], [build_multithreaded=no], [build_multithreaded=yes]) -AC_MSG_RESULT([$build_multithreaded]) -AM_CONDITIONAL([CONDITIONAL_BUILD_MULTITHREADED], [test "$build_multithreaded" = yes]) - -AC_ARG_ENABLE([demos], - [AS_HELP_STRING([--disable-demos], - [disable Bullet demos])], - [], - [enable_demos=yes]) -AM_CONDITIONAL([CONDITIONAL_BUILD_DEMOS], [false]) -if test "x$enable_demos" != xno; then - AC_MSG_NOTICE([Building Bullet demos]) - AM_CONDITIONAL([CONDITIONAL_BUILD_DEMOS],[true]) -fi - - - -AC_ARG_ENABLE([debug], - [AC_HELP_STRING([--enable-debug], - [build with debugging information (default NO)])], - [], [enable_debug=no]) - -AC_MSG_CHECKING([build mode]) -AS_IF([test $enable_debug = yes], [build_mode=debug], [build_mode=optimize]) -AC_MSG_RESULT([$build_mode]) - - - -CFLAGS="$ARCH_SPECIFIC_CFLAGS $CFLAGS" -CXXFLAGS="$ARCH_SPECIFIC_CFLAGS $CXXFLAGS $CFLAGS" -#---------------------------------------------------------------------------- -# Emit generated files. -#---------------------------------------------------------------------------- -AC_CONFIG_FILES([bullet.pc Makefile Demos/Makefile Demos/SoftDemo/Makefile Demos/AllBulletDemos/Makefile Demos/MultiThreadedDemo/Makefile Demos/ColladaDemo/Makefile Demos/OpenGL/Makefile Demos/BasicDemo/Makefile Demos/CcdPhysicsDemo/Makefile Demos/VehicleDemo/Makefile Demos/TerrainDemo/Makefile src/Makefile Extras/Makefile]) -AC_OUTPUT - -AC_MSG_NOTICE([ -You can type 'make' alternatively, you can use cmake ( http://cmake.org )or use the visual studio solution msvc folder. - -Please type 'make' to build Bullet -]) +#---------------------------------------------------------------------------- +# Autoconf input script. Invoke the ./autogen.sh script to generate a +# configure script from this file. +#---------------------------------------------------------------------------- +AC_PREREQ([2.54]) + +#---------------------------------------------------------------------------- +# Initialize Autoconf. +#---------------------------------------------------------------------------- +AC_INIT( + [bullet], + [2.76], + [bullet@erwincoumans.com]) +AC_CANONICAL_HOST +AC_CONFIG_SRCDIR([configure.ac]) +AM_INIT_AUTOMAKE +AM_PROG_CC_C_O +AC_PROG_CXX +AC_PROG_LIBTOOL + +case "$host" in + *-*-mingw*|*-*-cygwin*) + AC_DEFINE(PLATFORM_WIN32, 1, [Platform is Win32]) + opengl_LIBS="-lunsupported_platform" + PLATFORM_STRING="Win32" + ;; + *-*-linux*) + AC_DEFINE(PLATFORM_LINUX, 1, [Platform is Linux]) + opengl_LIBS="-lGL -lGLU -lglut" + PLATFORM_STRING="Linux" + ;; + *-*-darwin*) + AC_DEFINE(PLATFORM_APPLE, 1, [Platform is Apple]) + opengl_LIBS="-framework AGL -framework OpenGL -framework GLUT" + PLATFORM_STRING="Apple" + ;; + *) + AC_MSG_WARN([*** Please add $host to configure.ac checks!]) + ;; +esac +AC_SUBST(opengl_LIBS) + +case "$host" in + i?86-* | k?-* | athlon-* | pentium*-) + AC_DEFINE(ARCH_X86, 1, [Architecture is x86]) + ARCH_SPECIFIC_CFLAGS="" + ARCH_STRING="X86" + ;; + x86_64-*) + AC_DEFINE(ARCH_X86_64, 1, [Architecture is x86-64]) + ARCH_SPECIFIC_CFLAGS="-DUSE_ADDR64" + ARCH_STRING="X86-64" + ;; + ppc-* | powerpc-*) + AC_DEFINE(ARCH_PPC, 1, [Architecture is PowerPC]) + ARCH_SPECIFIC_CFLAGS="" + ARCH_STRING="PowerPC" + ;; + *) + AC_MSG_ERROR([Unknown Architecture]) + ;; +esac +AC_C_BIGENDIAN + + +#---------------------------------------------------------------------------- +# Setup for the configuration header. +#---------------------------------------------------------------------------- +AC_CONFIG_HEADERS([config.h]) +#---------------------------------------------------------------------------- +# Package configuration switches. +#---------------------------------------------------------------------------- +AC_ARG_ENABLE([multithreaded], + [AC_HELP_STRING([--enable-multithreaded], + [build BulletMultiThreaded (default NO)])], + [disable_multithreaded=no], [disable_multithreaded=yes]) +AC_MSG_CHECKING([BulletMultiThreaded]) +AS_IF([test "$disable_multithreaded" = yes], [build_multithreaded=no], [build_multithreaded=yes]) +AC_MSG_RESULT([$build_multithreaded]) +AM_CONDITIONAL([CONDITIONAL_BUILD_MULTITHREADED], [test "$build_multithreaded" = yes]) + +AC_ARG_ENABLE([demos], + [AS_HELP_STRING([--disable-demos], + [disable Bullet demos])], + [], + [enable_demos=yes]) +AM_CONDITIONAL([CONDITIONAL_BUILD_DEMOS], [false]) +if test "x$enable_demos" != xno; then + AC_MSG_NOTICE([Building Bullet demos]) + AM_CONDITIONAL([CONDITIONAL_BUILD_DEMOS],[true]) +fi + + + +AC_ARG_ENABLE([debug], + [AC_HELP_STRING([--enable-debug], + [build with debugging information (default NO)])], + [], [enable_debug=no]) + +AC_MSG_CHECKING([build mode]) +AS_IF([test $enable_debug = yes], [build_mode=debug], [build_mode=optimize]) +AC_MSG_RESULT([$build_mode]) + + + +CFLAGS="$ARCH_SPECIFIC_CFLAGS $CFLAGS" +CXXFLAGS="$ARCH_SPECIFIC_CFLAGS $CXXFLAGS $CFLAGS" +#---------------------------------------------------------------------------- +# Emit generated files. +#---------------------------------------------------------------------------- +AC_CONFIG_FILES([bullet.pc Makefile Demos/Makefile Demos/SoftDemo/Makefile Demos/AllBulletDemos/Makefile Demos/MultiThreadedDemo/Makefile Demos/ColladaDemo/Makefile Demos/OpenGL/Makefile Demos/BasicDemo/Makefile Demos/CcdPhysicsDemo/Makefile Demos/VehicleDemo/Makefile Demos/TerrainDemo/Makefile src/Makefile Extras/Makefile]) +AC_OUTPUT + +AC_MSG_NOTICE([ +You can type 'make' alternatively, you can use cmake ( http://cmake.org )or use the visual studio solution msvc folder. + +Please type 'make' to build Bullet +]) diff --git a/lib/readme.txt b/lib/readme.txt index 765f2b817..9c19ebd12 100644 --- a/lib/readme.txt +++ b/lib/readme.txt @@ -1,13 +1,13 @@ -At the moment there are no binary packages from Bullet library. -Once this is done, 3 libraries will be placed here: - -bulletmath.a -bulletcollision.a -bulletdynamics.a - -The C-API will be available in the include folder. - -For now, there is only C++ files, see src/btBulletCollisionCommon.h and src/btBulletDynamicsCommon.h - -http://bullet.sf.net -Erwin Coumans +At the moment there are no binary packages from Bullet library. +Once this is done, 3 libraries will be placed here: + +bulletmath.a +bulletcollision.a +bulletdynamics.a + +The C-API will be available in the include folder. + +For now, there is only C++ files, see src/btBulletCollisionCommon.h and src/btBulletDynamicsCommon.h + +http://bullet.sf.net +Erwin Coumans diff --git a/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp b/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp index d6b4e73a1..2182d0d7e 100644 --- a/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp +++ b/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp @@ -1,435 +1,435 @@ -/* -Bullet Continuous Collision Detection and Physics Library -* The b2CollidePolygons routines are Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com - -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. -*/ - -///btBox2dBox2dCollisionAlgorithm, with modified b2CollidePolygons routines from the Box2D library. -///The modifications include: switching from b2Vec to btVector3, redefinition of b2Dot, b2Cross - -#include "btBox2dBox2dCollisionAlgorithm.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletCollision/CollisionDispatch/btBoxBoxDetector.h" -#include "BulletCollision/CollisionShapes/btBox2dShape.h" - -#define USE_PERSISTENT_CONTACTS 1 - -btBox2dBox2dCollisionAlgorithm::btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* obj0,btCollisionObject* obj1) -: btActivatingCollisionAlgorithm(ci,obj0,obj1), -m_ownManifold(false), -m_manifoldPtr(mf) -{ - if (!m_manifoldPtr && m_dispatcher->needsCollision(obj0,obj1)) - { - m_manifoldPtr = m_dispatcher->getNewManifold(obj0,obj1); - m_ownManifold = true; - } -} - -btBox2dBox2dCollisionAlgorithm::~btBox2dBox2dCollisionAlgorithm() -{ - - if (m_ownManifold) - { - if (m_manifoldPtr) - m_dispatcher->releaseManifold(m_manifoldPtr); - } - -} - - -void b2CollidePolygons(btManifoldResult* manifold, const btBox2dShape* polyA, const btTransform& xfA, const btBox2dShape* polyB, const btTransform& xfB); - -//#include -void btBox2dBox2dCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) -{ - if (!m_manifoldPtr) - return; - - btCollisionObject* col0 = body0; - btCollisionObject* col1 = body1; - btBox2dShape* box0 = (btBox2dShape*)col0->getCollisionShape(); - btBox2dShape* box1 = (btBox2dShape*)col1->getCollisionShape(); - - resultOut->setPersistentManifold(m_manifoldPtr); - - b2CollidePolygons(resultOut,box0,col0->getWorldTransform(),box1,col1->getWorldTransform()); - - // refreshContactPoints is only necessary when using persistent contact points. otherwise all points are newly added - if (m_ownManifold) - { - resultOut->refreshContactPoints(); - } - -} - -btScalar btBox2dBox2dCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/) -{ - //not yet - return 1.f; -} - - -struct ClipVertex -{ - btVector3 v; - int id; - //b2ContactID id; - //b2ContactID id; -}; - -#define b2Dot(a,b) (a).dot(b) -#define b2Mul(a,b) (a)*(b) -#define b2MulT(a,b) (a).transpose()*(b) -#define b2Cross(a,b) (a).cross(b) -#define btCrossS(a,s) btVector3(s * a.getY(), -s * a.getX(),0.f) - -int b2_maxManifoldPoints =2; - -static int ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2], - const btVector3& normal, btScalar offset) -{ - // Start with no output points - int numOut = 0; - - // Calculate the distance of end points to the line - btScalar distance0 = b2Dot(normal, vIn[0].v) - offset; - btScalar distance1 = b2Dot(normal, vIn[1].v) - offset; - - // If the points are behind the plane - if (distance0 <= 0.0f) vOut[numOut++] = vIn[0]; - if (distance1 <= 0.0f) vOut[numOut++] = vIn[1]; - - // If the points are on different sides of the plane - if (distance0 * distance1 < 0.0f) - { - // Find intersection point of edge and plane - btScalar interp = distance0 / (distance0 - distance1); - vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); - if (distance0 > 0.0f) - { - vOut[numOut].id = vIn[0].id; - } - else - { - vOut[numOut].id = vIn[1].id; - } - ++numOut; - } - - return numOut; -} - -// Find the separation between poly1 and poly2 for a give edge normal on poly1. -static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1, int edge1, - const btBox2dShape* poly2, const btTransform& xf2) -{ - const btVector3* vertices1 = poly1->getVertices(); - const btVector3* normals1 = poly1->getNormals(); - - int count2 = poly2->getVertexCount(); - const btVector3* vertices2 = poly2->getVertices(); - - btAssert(0 <= edge1 && edge1 < poly1->getVertexCount()); - - // Convert normal from poly1's frame into poly2's frame. - btVector3 normal1World = b2Mul(xf1.getBasis(), normals1[edge1]); - btVector3 normal1 = b2MulT(xf2.getBasis(), normal1World); - - // Find support vertex on poly2 for -normal. - int index = 0; - btScalar minDot = BT_LARGE_FLOAT; - - for (int i = 0; i < count2; ++i) - { - btScalar dot = b2Dot(vertices2[i], normal1); - if (dot < minDot) - { - minDot = dot; - index = i; - } - } - - btVector3 v1 = b2Mul(xf1, vertices1[edge1]); - btVector3 v2 = b2Mul(xf2, vertices2[index]); - btScalar separation = b2Dot(v2 - v1, normal1World); - return separation; -} - -// Find the max separation between poly1 and poly2 using edge normals from poly1. -static btScalar FindMaxSeparation(int* edgeIndex, - const btBox2dShape* poly1, const btTransform& xf1, - const btBox2dShape* poly2, const btTransform& xf2) -{ - int count1 = poly1->getVertexCount(); - const btVector3* normals1 = poly1->getNormals(); - - // Vector pointing from the centroid of poly1 to the centroid of poly2. - btVector3 d = b2Mul(xf2, poly2->getCentroid()) - b2Mul(xf1, poly1->getCentroid()); - btVector3 dLocal1 = b2MulT(xf1.getBasis(), d); - - // Find edge normal on poly1 that has the largest projection onto d. - int edge = 0; - btScalar maxDot = -BT_LARGE_FLOAT; - for (int i = 0; i < count1; ++i) - { - btScalar dot = b2Dot(normals1[i], dLocal1); - if (dot > maxDot) - { - maxDot = dot; - edge = i; - } - } - - // Get the separation for the edge normal. - btScalar s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); - if (s > 0.0f) - { - return s; - } - - // Check the separation for the previous edge normal. - int prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1; - btScalar sPrev = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); - if (sPrev > 0.0f) - { - return sPrev; - } - - // Check the separation for the next edge normal. - int nextEdge = edge + 1 < count1 ? edge + 1 : 0; - btScalar sNext = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); - if (sNext > 0.0f) - { - return sNext; - } - - // Find the best edge and the search direction. - int bestEdge; - btScalar bestSeparation; - int increment; - if (sPrev > s && sPrev > sNext) - { - increment = -1; - bestEdge = prevEdge; - bestSeparation = sPrev; - } - else if (sNext > s) - { - increment = 1; - bestEdge = nextEdge; - bestSeparation = sNext; - } - else - { - *edgeIndex = edge; - return s; - } - - // Perform a local search for the best edge normal. - for ( ; ; ) - { - if (increment == -1) - edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1; - else - edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0; - - s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); - if (s > 0.0f) - { - return s; - } - - if (s > bestSeparation) - { - bestEdge = edge; - bestSeparation = s; - } - else - { - break; - } - } - - *edgeIndex = bestEdge; - return bestSeparation; -} - -static void FindIncidentEdge(ClipVertex c[2], - const btBox2dShape* poly1, const btTransform& xf1, int edge1, - const btBox2dShape* poly2, const btTransform& xf2) -{ - const btVector3* normals1 = poly1->getNormals(); - - int count2 = poly2->getVertexCount(); - const btVector3* vertices2 = poly2->getVertices(); - const btVector3* normals2 = poly2->getNormals(); - - btAssert(0 <= edge1 && edge1 < poly1->getVertexCount()); - - // Get the normal of the reference edge in poly2's frame. - btVector3 normal1 = b2MulT(xf2.getBasis(), b2Mul(xf1.getBasis(), normals1[edge1])); - - // Find the incident edge on poly2. - int index = 0; - btScalar minDot = BT_LARGE_FLOAT; - for (int i = 0; i < count2; ++i) - { - btScalar dot = b2Dot(normal1, normals2[i]); - if (dot < minDot) - { - minDot = dot; - index = i; - } - } - - // Build the clip vertices for the incident edge. - int i1 = index; - int i2 = i1 + 1 < count2 ? i1 + 1 : 0; - - c[0].v = b2Mul(xf2, vertices2[i1]); -// c[0].id.features.referenceEdge = (unsigned char)edge1; -// c[0].id.features.incidentEdge = (unsigned char)i1; -// c[0].id.features.incidentVertex = 0; - - c[1].v = b2Mul(xf2, vertices2[i2]); -// c[1].id.features.referenceEdge = (unsigned char)edge1; -// c[1].id.features.incidentEdge = (unsigned char)i2; -// c[1].id.features.incidentVertex = 1; -} - -// Find edge normal of max separation on A - return if separating axis is found -// Find edge normal of max separation on B - return if separation axis is found -// Choose reference edge as min(minA, minB) -// Find incident edge -// Clip - -// The normal points from 1 to 2 -void b2CollidePolygons(btManifoldResult* manifold, - const btBox2dShape* polyA, const btTransform& xfA, - const btBox2dShape* polyB, const btTransform& xfB) -{ - - int edgeA = 0; - btScalar separationA = FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); - if (separationA > 0.0f) - return; - - int edgeB = 0; - btScalar separationB = FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); - if (separationB > 0.0f) - return; - - const btBox2dShape* poly1; // reference poly - const btBox2dShape* poly2; // incident poly - btTransform xf1, xf2; - int edge1; // reference edge - unsigned char flip; - const btScalar k_relativeTol = 0.98f; - const btScalar k_absoluteTol = 0.001f; - - // TODO_ERIN use "radius" of poly for absolute tolerance. - if (separationB > k_relativeTol * separationA + k_absoluteTol) - { - poly1 = polyB; - poly2 = polyA; - xf1 = xfB; - xf2 = xfA; - edge1 = edgeB; - flip = 1; - } - else - { - poly1 = polyA; - poly2 = polyB; - xf1 = xfA; - xf2 = xfB; - edge1 = edgeA; - flip = 0; - } - - ClipVertex incidentEdge[2]; - FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); - - int count1 = poly1->getVertexCount(); - const btVector3* vertices1 = poly1->getVertices(); - - btVector3 v11 = vertices1[edge1]; - btVector3 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; - - btVector3 dv = v12 - v11; - btVector3 sideNormal = b2Mul(xf1.getBasis(), v12 - v11); - sideNormal.normalize(); - btVector3 frontNormal = btCrossS(sideNormal, 1.0f); - - - v11 = b2Mul(xf1, v11); - v12 = b2Mul(xf1, v12); - - btScalar frontOffset = b2Dot(frontNormal, v11); - btScalar sideOffset1 = -b2Dot(sideNormal, v11); - btScalar sideOffset2 = b2Dot(sideNormal, v12); - - // Clip incident edge against extruded edge1 side edges. - ClipVertex clipPoints1[2]; - clipPoints1[0].v.setValue(0,0,0); - clipPoints1[1].v.setValue(0,0,0); - - ClipVertex clipPoints2[2]; - clipPoints2[0].v.setValue(0,0,0); - clipPoints2[1].v.setValue(0,0,0); - - - int np; - - // Clip to box side 1 - np = ClipSegmentToLine(clipPoints1, incidentEdge, -sideNormal, sideOffset1); - - if (np < 2) - return; - - // Clip to negative box side 1 - np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2); - - if (np < 2) - { - return; - } - - // Now clipPoints2 contains the clipped points. - btVector3 manifoldNormal = flip ? -frontNormal : frontNormal; - - int pointCount = 0; - for (int i = 0; i < b2_maxManifoldPoints; ++i) - { - btScalar separation = b2Dot(frontNormal, clipPoints2[i].v) - frontOffset; - - if (separation <= 0.0f) - { - - //b2ManifoldPoint* cp = manifold->points + pointCount; - //btScalar separation = separation; - //cp->localPoint1 = b2MulT(xfA, clipPoints2[i].v); - //cp->localPoint2 = b2MulT(xfB, clipPoints2[i].v); - - manifold->addContactPoint(-manifoldNormal,clipPoints2[i].v,separation); - -// cp->id = clipPoints2[i].id; -// cp->id.features.flip = flip; - ++pointCount; - } - } - -// manifold->pointCount = pointCount;} -} +/* +Bullet Continuous Collision Detection and Physics Library +* The b2CollidePolygons routines are Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com + +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. +*/ + +///btBox2dBox2dCollisionAlgorithm, with modified b2CollidePolygons routines from the Box2D library. +///The modifications include: switching from b2Vec to btVector3, redefinition of b2Dot, b2Cross + +#include "btBox2dBox2dCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletCollision/CollisionDispatch/btBoxBoxDetector.h" +#include "BulletCollision/CollisionShapes/btBox2dShape.h" + +#define USE_PERSISTENT_CONTACTS 1 + +btBox2dBox2dCollisionAlgorithm::btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* obj0,btCollisionObject* obj1) +: btActivatingCollisionAlgorithm(ci,obj0,obj1), +m_ownManifold(false), +m_manifoldPtr(mf) +{ + if (!m_manifoldPtr && m_dispatcher->needsCollision(obj0,obj1)) + { + m_manifoldPtr = m_dispatcher->getNewManifold(obj0,obj1); + m_ownManifold = true; + } +} + +btBox2dBox2dCollisionAlgorithm::~btBox2dBox2dCollisionAlgorithm() +{ + + if (m_ownManifold) + { + if (m_manifoldPtr) + m_dispatcher->releaseManifold(m_manifoldPtr); + } + +} + + +void b2CollidePolygons(btManifoldResult* manifold, const btBox2dShape* polyA, const btTransform& xfA, const btBox2dShape* polyB, const btTransform& xfB); + +//#include +void btBox2dBox2dCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + if (!m_manifoldPtr) + return; + + btCollisionObject* col0 = body0; + btCollisionObject* col1 = body1; + btBox2dShape* box0 = (btBox2dShape*)col0->getCollisionShape(); + btBox2dShape* box1 = (btBox2dShape*)col1->getCollisionShape(); + + resultOut->setPersistentManifold(m_manifoldPtr); + + b2CollidePolygons(resultOut,box0,col0->getWorldTransform(),box1,col1->getWorldTransform()); + + // refreshContactPoints is only necessary when using persistent contact points. otherwise all points are newly added + if (m_ownManifold) + { + resultOut->refreshContactPoints(); + } + +} + +btScalar btBox2dBox2dCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/) +{ + //not yet + return 1.f; +} + + +struct ClipVertex +{ + btVector3 v; + int id; + //b2ContactID id; + //b2ContactID id; +}; + +#define b2Dot(a,b) (a).dot(b) +#define b2Mul(a,b) (a)*(b) +#define b2MulT(a,b) (a).transpose()*(b) +#define b2Cross(a,b) (a).cross(b) +#define btCrossS(a,s) btVector3(s * a.getY(), -s * a.getX(),0.f) + +int b2_maxManifoldPoints =2; + +static int ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2], + const btVector3& normal, btScalar offset) +{ + // Start with no output points + int numOut = 0; + + // Calculate the distance of end points to the line + btScalar distance0 = b2Dot(normal, vIn[0].v) - offset; + btScalar distance1 = b2Dot(normal, vIn[1].v) - offset; + + // If the points are behind the plane + if (distance0 <= 0.0f) vOut[numOut++] = vIn[0]; + if (distance1 <= 0.0f) vOut[numOut++] = vIn[1]; + + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0f) + { + // Find intersection point of edge and plane + btScalar interp = distance0 / (distance0 - distance1); + vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); + if (distance0 > 0.0f) + { + vOut[numOut].id = vIn[0].id; + } + else + { + vOut[numOut].id = vIn[1].id; + } + ++numOut; + } + + return numOut; +} + +// Find the separation between poly1 and poly2 for a give edge normal on poly1. +static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1, int edge1, + const btBox2dShape* poly2, const btTransform& xf2) +{ + const btVector3* vertices1 = poly1->getVertices(); + const btVector3* normals1 = poly1->getNormals(); + + int count2 = poly2->getVertexCount(); + const btVector3* vertices2 = poly2->getVertices(); + + btAssert(0 <= edge1 && edge1 < poly1->getVertexCount()); + + // Convert normal from poly1's frame into poly2's frame. + btVector3 normal1World = b2Mul(xf1.getBasis(), normals1[edge1]); + btVector3 normal1 = b2MulT(xf2.getBasis(), normal1World); + + // Find support vertex on poly2 for -normal. + int index = 0; + btScalar minDot = BT_LARGE_FLOAT; + + for (int i = 0; i < count2; ++i) + { + btScalar dot = b2Dot(vertices2[i], normal1); + if (dot < minDot) + { + minDot = dot; + index = i; + } + } + + btVector3 v1 = b2Mul(xf1, vertices1[edge1]); + btVector3 v2 = b2Mul(xf2, vertices2[index]); + btScalar separation = b2Dot(v2 - v1, normal1World); + return separation; +} + +// Find the max separation between poly1 and poly2 using edge normals from poly1. +static btScalar FindMaxSeparation(int* edgeIndex, + const btBox2dShape* poly1, const btTransform& xf1, + const btBox2dShape* poly2, const btTransform& xf2) +{ + int count1 = poly1->getVertexCount(); + const btVector3* normals1 = poly1->getNormals(); + + // Vector pointing from the centroid of poly1 to the centroid of poly2. + btVector3 d = b2Mul(xf2, poly2->getCentroid()) - b2Mul(xf1, poly1->getCentroid()); + btVector3 dLocal1 = b2MulT(xf1.getBasis(), d); + + // Find edge normal on poly1 that has the largest projection onto d. + int edge = 0; + btScalar maxDot = -BT_LARGE_FLOAT; + for (int i = 0; i < count1; ++i) + { + btScalar dot = b2Dot(normals1[i], dLocal1); + if (dot > maxDot) + { + maxDot = dot; + edge = i; + } + } + + // Get the separation for the edge normal. + btScalar s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); + if (s > 0.0f) + { + return s; + } + + // Check the separation for the previous edge normal. + int prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1; + btScalar sPrev = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); + if (sPrev > 0.0f) + { + return sPrev; + } + + // Check the separation for the next edge normal. + int nextEdge = edge + 1 < count1 ? edge + 1 : 0; + btScalar sNext = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); + if (sNext > 0.0f) + { + return sNext; + } + + // Find the best edge and the search direction. + int bestEdge; + btScalar bestSeparation; + int increment; + if (sPrev > s && sPrev > sNext) + { + increment = -1; + bestEdge = prevEdge; + bestSeparation = sPrev; + } + else if (sNext > s) + { + increment = 1; + bestEdge = nextEdge; + bestSeparation = sNext; + } + else + { + *edgeIndex = edge; + return s; + } + + // Perform a local search for the best edge normal. + for ( ; ; ) + { + if (increment == -1) + edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1; + else + edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0; + + s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); + if (s > 0.0f) + { + return s; + } + + if (s > bestSeparation) + { + bestEdge = edge; + bestSeparation = s; + } + else + { + break; + } + } + + *edgeIndex = bestEdge; + return bestSeparation; +} + +static void FindIncidentEdge(ClipVertex c[2], + const btBox2dShape* poly1, const btTransform& xf1, int edge1, + const btBox2dShape* poly2, const btTransform& xf2) +{ + const btVector3* normals1 = poly1->getNormals(); + + int count2 = poly2->getVertexCount(); + const btVector3* vertices2 = poly2->getVertices(); + const btVector3* normals2 = poly2->getNormals(); + + btAssert(0 <= edge1 && edge1 < poly1->getVertexCount()); + + // Get the normal of the reference edge in poly2's frame. + btVector3 normal1 = b2MulT(xf2.getBasis(), b2Mul(xf1.getBasis(), normals1[edge1])); + + // Find the incident edge on poly2. + int index = 0; + btScalar minDot = BT_LARGE_FLOAT; + for (int i = 0; i < count2; ++i) + { + btScalar dot = b2Dot(normal1, normals2[i]); + if (dot < minDot) + { + minDot = dot; + index = i; + } + } + + // Build the clip vertices for the incident edge. + int i1 = index; + int i2 = i1 + 1 < count2 ? i1 + 1 : 0; + + c[0].v = b2Mul(xf2, vertices2[i1]); +// c[0].id.features.referenceEdge = (unsigned char)edge1; +// c[0].id.features.incidentEdge = (unsigned char)i1; +// c[0].id.features.incidentVertex = 0; + + c[1].v = b2Mul(xf2, vertices2[i2]); +// c[1].id.features.referenceEdge = (unsigned char)edge1; +// c[1].id.features.incidentEdge = (unsigned char)i2; +// c[1].id.features.incidentVertex = 1; +} + +// Find edge normal of max separation on A - return if separating axis is found +// Find edge normal of max separation on B - return if separation axis is found +// Choose reference edge as min(minA, minB) +// Find incident edge +// Clip + +// The normal points from 1 to 2 +void b2CollidePolygons(btManifoldResult* manifold, + const btBox2dShape* polyA, const btTransform& xfA, + const btBox2dShape* polyB, const btTransform& xfB) +{ + + int edgeA = 0; + btScalar separationA = FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); + if (separationA > 0.0f) + return; + + int edgeB = 0; + btScalar separationB = FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); + if (separationB > 0.0f) + return; + + const btBox2dShape* poly1; // reference poly + const btBox2dShape* poly2; // incident poly + btTransform xf1, xf2; + int edge1; // reference edge + unsigned char flip; + const btScalar k_relativeTol = 0.98f; + const btScalar k_absoluteTol = 0.001f; + + // TODO_ERIN use "radius" of poly for absolute tolerance. + if (separationB > k_relativeTol * separationA + k_absoluteTol) + { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + flip = 1; + } + else + { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + flip = 0; + } + + ClipVertex incidentEdge[2]; + FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + + int count1 = poly1->getVertexCount(); + const btVector3* vertices1 = poly1->getVertices(); + + btVector3 v11 = vertices1[edge1]; + btVector3 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; + + btVector3 dv = v12 - v11; + btVector3 sideNormal = b2Mul(xf1.getBasis(), v12 - v11); + sideNormal.normalize(); + btVector3 frontNormal = btCrossS(sideNormal, 1.0f); + + + v11 = b2Mul(xf1, v11); + v12 = b2Mul(xf1, v12); + + btScalar frontOffset = b2Dot(frontNormal, v11); + btScalar sideOffset1 = -b2Dot(sideNormal, v11); + btScalar sideOffset2 = b2Dot(sideNormal, v12); + + // Clip incident edge against extruded edge1 side edges. + ClipVertex clipPoints1[2]; + clipPoints1[0].v.setValue(0,0,0); + clipPoints1[1].v.setValue(0,0,0); + + ClipVertex clipPoints2[2]; + clipPoints2[0].v.setValue(0,0,0); + clipPoints2[1].v.setValue(0,0,0); + + + int np; + + // Clip to box side 1 + np = ClipSegmentToLine(clipPoints1, incidentEdge, -sideNormal, sideOffset1); + + if (np < 2) + return; + + // Clip to negative box side 1 + np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2); + + if (np < 2) + { + return; + } + + // Now clipPoints2 contains the clipped points. + btVector3 manifoldNormal = flip ? -frontNormal : frontNormal; + + int pointCount = 0; + for (int i = 0; i < b2_maxManifoldPoints; ++i) + { + btScalar separation = b2Dot(frontNormal, clipPoints2[i].v) - frontOffset; + + if (separation <= 0.0f) + { + + //b2ManifoldPoint* cp = manifold->points + pointCount; + //btScalar separation = separation; + //cp->localPoint1 = b2MulT(xfA, clipPoints2[i].v); + //cp->localPoint2 = b2MulT(xfB, clipPoints2[i].v); + + manifold->addContactPoint(-manifoldNormal,clipPoints2[i].v,separation); + +// cp->id = clipPoints2[i].id; +// cp->id.features.flip = flip; + ++pointCount; + } + } + +// manifold->pointCount = pointCount;} +} diff --git a/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h index 2766c3fc2..213421752 100644 --- a/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h @@ -1,66 +1,66 @@ -/* -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 BOX_2D_BOX_2D__COLLISION_ALGORITHM_H -#define BOX_2D_BOX_2D__COLLISION_ALGORITHM_H - -#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" - -class btPersistentManifold; - -///box-box collision detection -class btBox2dBox2dCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - -public: - btBox2dBox2dCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) - : btActivatingCollisionAlgorithm(ci) {} - - virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); - - btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1); - - virtual ~btBox2dBox2dCollisionAlgorithm(); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - - struct CreateFunc :public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) - { - int bbsize = sizeof(btBox2dBox2dCollisionAlgorithm); - void* ptr = ci.m_dispatcher1->allocateCollisionAlgorithm(bbsize); - return new(ptr) btBox2dBox2dCollisionAlgorithm(0,ci,body0,body1); - } - }; - -}; - -#endif //BOX_2D_BOX_2D__COLLISION_ALGORITHM_H - +/* +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 BOX_2D_BOX_2D__COLLISION_ALGORITHM_H +#define BOX_2D_BOX_2D__COLLISION_ALGORITHM_H + +#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/BroadphaseCollision/btDispatcher.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" + +class btPersistentManifold; + +///box-box collision detection +class btBox2dBox2dCollisionAlgorithm : public btActivatingCollisionAlgorithm +{ + bool m_ownManifold; + btPersistentManifold* m_manifoldPtr; + +public: + btBox2dBox2dCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) + : btActivatingCollisionAlgorithm(ci) {} + + virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1); + + virtual ~btBox2dBox2dCollisionAlgorithm(); + + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + { + manifoldArray.push_back(m_manifoldPtr); + } + } + + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + int bbsize = sizeof(btBox2dBox2dCollisionAlgorithm); + void* ptr = ci.m_dispatcher1->allocateCollisionAlgorithm(bbsize); + return new(ptr) btBox2dBox2dCollisionAlgorithm(0,ci,body0,body1); + } + }; + +}; + +#endif //BOX_2D_BOX_2D__COLLISION_ALGORITHM_H + diff --git a/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp b/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp index 9d5d530c7..db7f884ac 100644 --- a/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp +++ b/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp @@ -1,247 +1,247 @@ -/* -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 "btConvex2dConvex2dAlgorithm.h" - -//#include -#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletCollision/CollisionShapes/btConvexShape.h" -#include "BulletCollision/CollisionShapes/btCapsuleShape.h" - - -#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "BulletCollision/CollisionDispatch/btManifoldResult.h" - -#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" -#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h" -#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h" - - - -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" -#include "BulletCollision/CollisionShapes/btSphereShape.h" - -#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" - -#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" - - -btConvex2dConvex2dAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) -{ - m_numPerturbationIterations = 0; - m_minimumPointsPerturbationThreshold = 3; - m_simplexSolver = simplexSolver; - m_pdSolver = pdSolver; -} - -btConvex2dConvex2dAlgorithm::CreateFunc::~CreateFunc() -{ -} - -btConvex2dConvex2dAlgorithm::btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver,int numPerturbationIterations, int minimumPointsPerturbationThreshold) -: btActivatingCollisionAlgorithm(ci,body0,body1), -m_simplexSolver(simplexSolver), -m_pdSolver(pdSolver), -m_ownManifold (false), -m_manifoldPtr(mf), -m_lowLevelOfDetail(false), - m_numPerturbationIterations(numPerturbationIterations), -m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold) -{ - (void)body0; - (void)body1; -} - - - - -btConvex2dConvex2dAlgorithm::~btConvex2dConvex2dAlgorithm() -{ - if (m_ownManifold) - { - if (m_manifoldPtr) - m_dispatcher->releaseManifold(m_manifoldPtr); - } -} - -void btConvex2dConvex2dAlgorithm ::setLowLevelOfDetail(bool useLowLevel) -{ - m_lowLevelOfDetail = useLowLevel; -} - - - -extern btScalar gContactBreakingThreshold; - - -// -// Convex-Convex collision algorithm -// -void btConvex2dConvex2dAlgorithm ::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) -{ - - if (!m_manifoldPtr) - { - //swapped? - m_manifoldPtr = m_dispatcher->getNewManifold(body0,body1); - m_ownManifold = true; - } - resultOut->setPersistentManifold(m_manifoldPtr); - - //comment-out next line to test multi-contact generation - //resultOut->getPersistentManifold()->clearManifold(); - - - btConvexShape* min0 = static_cast(body0->getCollisionShape()); - btConvexShape* min1 = static_cast(body1->getCollisionShape()); - - btVector3 normalOnB; - btVector3 pointOnBWorld; - - { - - - btGjkPairDetector::ClosestPointInput input; - - btGjkPairDetector gjkPairDetector(min0,min1,m_simplexSolver,m_pdSolver); - //TODO: if (dispatchInfo.m_useContinuous) - gjkPairDetector.setMinkowskiA(min0); - gjkPairDetector.setMinkowskiB(min1); - - { - input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold(); - input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared; - } - - input.m_stackAlloc = dispatchInfo.m_stackAllocator; - input.m_transformA = body0->getWorldTransform(); - input.m_transformB = body1->getWorldTransform(); - - gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw); - - btVector3 v0,v1; - btVector3 sepNormalWorldSpace; - - } - - if (m_ownManifold) - { - resultOut->refreshContactPoints(); - } - -} - - - - -btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) -{ - (void)resultOut; - (void)dispatchInfo; - ///Rather then checking ALL pairs, only calculate TOI when motion exceeds threshold - - ///Linear motion for one of objects needs to exceed m_ccdSquareMotionThreshold - ///col0->m_worldTransform, - btScalar resultFraction = btScalar(1.); - - - btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2(); - btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2(); - - if (squareMot0 < col0->getCcdSquareMotionThreshold() && - squareMot1 < col1->getCcdSquareMotionThreshold()) - return resultFraction; - - - //An adhoc way of testing the Continuous Collision Detection algorithms - //One object is approximated as a sphere, to simplify things - //Starting in penetration should report no time of impact - //For proper CCD, better accuracy and handling of 'allowed' penetration should be added - //also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies) - - - /// Convex0 against sphere for Convex1 - { - btConvexShape* convex0 = static_cast(col0->getCollisionShape()); - - btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation - btConvexCast::CastResult result; - btVoronoiSimplexSolver voronoiSimplex; - //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex); - ///Simplification, one object is simplified as a sphere - btGjkConvexCast ccd1( convex0 ,&sphere1,&voronoiSimplex); - //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0); - if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(), - col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result)) - { - - //store result.m_fraction in both bodies - - if (col0->getHitFraction()> result.m_fraction) - col0->setHitFraction( result.m_fraction ); - - if (col1->getHitFraction() > result.m_fraction) - col1->setHitFraction( result.m_fraction); - - if (resultFraction > result.m_fraction) - resultFraction = result.m_fraction; - - } - - - - - } - - /// Sphere (for convex0) against Convex1 - { - btConvexShape* convex1 = static_cast(col1->getCollisionShape()); - - btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation - btConvexCast::CastResult result; - btVoronoiSimplexSolver voronoiSimplex; - //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex); - ///Simplification, one object is simplified as a sphere - btGjkConvexCast ccd1(&sphere0,convex1,&voronoiSimplex); - //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0); - if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(), - col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result)) - { - - //store result.m_fraction in both bodies - - if (col0->getHitFraction() > result.m_fraction) - col0->setHitFraction( result.m_fraction); - - if (col1->getHitFraction() > result.m_fraction) - col1->setHitFraction( result.m_fraction); - - if (resultFraction > result.m_fraction) - resultFraction = result.m_fraction; - - } - } - - return resultFraction; - -} - +/* +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 "btConvex2dConvex2dAlgorithm.h" + +//#include +#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletCollision/CollisionShapes/btConvexShape.h" +#include "BulletCollision/CollisionShapes/btCapsuleShape.h" + + +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionDispatch/btManifoldResult.h" + +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h" +#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h" + + + +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" + +#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" + + +btConvex2dConvex2dAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) +{ + m_numPerturbationIterations = 0; + m_minimumPointsPerturbationThreshold = 3; + m_simplexSolver = simplexSolver; + m_pdSolver = pdSolver; +} + +btConvex2dConvex2dAlgorithm::CreateFunc::~CreateFunc() +{ +} + +btConvex2dConvex2dAlgorithm::btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver,int numPerturbationIterations, int minimumPointsPerturbationThreshold) +: btActivatingCollisionAlgorithm(ci,body0,body1), +m_simplexSolver(simplexSolver), +m_pdSolver(pdSolver), +m_ownManifold (false), +m_manifoldPtr(mf), +m_lowLevelOfDetail(false), + m_numPerturbationIterations(numPerturbationIterations), +m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold) +{ + (void)body0; + (void)body1; +} + + + + +btConvex2dConvex2dAlgorithm::~btConvex2dConvex2dAlgorithm() +{ + if (m_ownManifold) + { + if (m_manifoldPtr) + m_dispatcher->releaseManifold(m_manifoldPtr); + } +} + +void btConvex2dConvex2dAlgorithm ::setLowLevelOfDetail(bool useLowLevel) +{ + m_lowLevelOfDetail = useLowLevel; +} + + + +extern btScalar gContactBreakingThreshold; + + +// +// Convex-Convex collision algorithm +// +void btConvex2dConvex2dAlgorithm ::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + + if (!m_manifoldPtr) + { + //swapped? + m_manifoldPtr = m_dispatcher->getNewManifold(body0,body1); + m_ownManifold = true; + } + resultOut->setPersistentManifold(m_manifoldPtr); + + //comment-out next line to test multi-contact generation + //resultOut->getPersistentManifold()->clearManifold(); + + + btConvexShape* min0 = static_cast(body0->getCollisionShape()); + btConvexShape* min1 = static_cast(body1->getCollisionShape()); + + btVector3 normalOnB; + btVector3 pointOnBWorld; + + { + + + btGjkPairDetector::ClosestPointInput input; + + btGjkPairDetector gjkPairDetector(min0,min1,m_simplexSolver,m_pdSolver); + //TODO: if (dispatchInfo.m_useContinuous) + gjkPairDetector.setMinkowskiA(min0); + gjkPairDetector.setMinkowskiB(min1); + + { + input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold(); + input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared; + } + + input.m_stackAlloc = dispatchInfo.m_stackAllocator; + input.m_transformA = body0->getWorldTransform(); + input.m_transformB = body1->getWorldTransform(); + + gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw); + + btVector3 v0,v1; + btVector3 sepNormalWorldSpace; + + } + + if (m_ownManifold) + { + resultOut->refreshContactPoints(); + } + +} + + + + +btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + (void)resultOut; + (void)dispatchInfo; + ///Rather then checking ALL pairs, only calculate TOI when motion exceeds threshold + + ///Linear motion for one of objects needs to exceed m_ccdSquareMotionThreshold + ///col0->m_worldTransform, + btScalar resultFraction = btScalar(1.); + + + btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2(); + btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2(); + + if (squareMot0 < col0->getCcdSquareMotionThreshold() && + squareMot1 < col1->getCcdSquareMotionThreshold()) + return resultFraction; + + + //An adhoc way of testing the Continuous Collision Detection algorithms + //One object is approximated as a sphere, to simplify things + //Starting in penetration should report no time of impact + //For proper CCD, better accuracy and handling of 'allowed' penetration should be added + //also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies) + + + /// Convex0 against sphere for Convex1 + { + btConvexShape* convex0 = static_cast(col0->getCollisionShape()); + + btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation + btConvexCast::CastResult result; + btVoronoiSimplexSolver voronoiSimplex; + //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex); + ///Simplification, one object is simplified as a sphere + btGjkConvexCast ccd1( convex0 ,&sphere1,&voronoiSimplex); + //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0); + if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(), + col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result)) + { + + //store result.m_fraction in both bodies + + if (col0->getHitFraction()> result.m_fraction) + col0->setHitFraction( result.m_fraction ); + + if (col1->getHitFraction() > result.m_fraction) + col1->setHitFraction( result.m_fraction); + + if (resultFraction > result.m_fraction) + resultFraction = result.m_fraction; + + } + + + + + } + + /// Sphere (for convex0) against Convex1 + { + btConvexShape* convex1 = static_cast(col1->getCollisionShape()); + + btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation + btConvexCast::CastResult result; + btVoronoiSimplexSolver voronoiSimplex; + //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex); + ///Simplification, one object is simplified as a sphere + btGjkConvexCast ccd1(&sphere0,convex1,&voronoiSimplex); + //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0); + if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(), + col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result)) + { + + //store result.m_fraction in both bodies + + if (col0->getHitFraction() > result.m_fraction) + col0->setHitFraction( result.m_fraction); + + if (col1->getHitFraction() > result.m_fraction) + col1->setHitFraction( result.m_fraction); + + if (resultFraction > result.m_fraction) + resultFraction = result.m_fraction; + + } + } + + return resultFraction; + +} + diff --git a/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h b/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h index f3916bcc5..573840140 100644 --- a/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h @@ -1,95 +1,95 @@ -/* -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 CONVEX_2D_CONVEX_2D_ALGORITHM_H -#define CONVEX_2D_CONVEX_2D_ALGORITHM_H - -#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil - -class btConvexPenetrationDepthSolver; - - -///The convex2dConvex2dAlgorithm collision algorithm support 2d collision detection for btConvex2dShape -///Currently it requires the btMinkowskiPenetrationDepthSolver, it has support for 2d penetration depth computation -class btConvex2dConvex2dAlgorithm : public btActivatingCollisionAlgorithm -{ - btSimplexSolverInterface* m_simplexSolver; - btConvexPenetrationDepthSolver* m_pdSolver; - - - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - bool m_lowLevelOfDetail; - - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - -public: - - btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold); - - - virtual ~btConvex2dConvex2dAlgorithm(); - - 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) - { - ///should we use m_ownManifold to avoid adding duplicates? - if (m_manifoldPtr && m_ownManifold) - manifoldArray.push_back(m_manifoldPtr); - } - - - void setLowLevelOfDetail(bool useLowLevel); - - - const btPersistentManifold* getManifold() - { - return m_manifoldPtr; - } - - struct CreateFunc :public btCollisionAlgorithmCreateFunc - { - - btConvexPenetrationDepthSolver* m_pdSolver; - btSimplexSolverInterface* m_simplexSolver; - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - - CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); - - virtual ~CreateFunc(); - - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvex2dConvex2dAlgorithm)); - return new(mem) btConvex2dConvex2dAlgorithm(ci.m_manifold,ci,body0,body1,m_simplexSolver,m_pdSolver,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold); - } - }; - - -}; - -#endif //CONVEX_2D_CONVEX_2D_ALGORITHM_H +/* +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 CONVEX_2D_CONVEX_2D_ALGORITHM_H +#define CONVEX_2D_CONVEX_2D_ALGORITHM_H + +#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil + +class btConvexPenetrationDepthSolver; + + +///The convex2dConvex2dAlgorithm collision algorithm support 2d collision detection for btConvex2dShape +///Currently it requires the btMinkowskiPenetrationDepthSolver, it has support for 2d penetration depth computation +class btConvex2dConvex2dAlgorithm : public btActivatingCollisionAlgorithm +{ + btSimplexSolverInterface* m_simplexSolver; + btConvexPenetrationDepthSolver* m_pdSolver; + + + bool m_ownManifold; + btPersistentManifold* m_manifoldPtr; + bool m_lowLevelOfDetail; + + int m_numPerturbationIterations; + int m_minimumPointsPerturbationThreshold; + +public: + + btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold); + + + virtual ~btConvex2dConvex2dAlgorithm(); + + 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) + { + ///should we use m_ownManifold to avoid adding duplicates? + if (m_manifoldPtr && m_ownManifold) + manifoldArray.push_back(m_manifoldPtr); + } + + + void setLowLevelOfDetail(bool useLowLevel); + + + const btPersistentManifold* getManifold() + { + return m_manifoldPtr; + } + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + + btConvexPenetrationDepthSolver* m_pdSolver; + btSimplexSolverInterface* m_simplexSolver; + int m_numPerturbationIterations; + int m_minimumPointsPerturbationThreshold; + + CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); + + virtual ~CreateFunc(); + + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvex2dConvex2dAlgorithm)); + return new(mem) btConvex2dConvex2dAlgorithm(ci.m_manifold,ci,body0,body1,m_simplexSolver,m_pdSolver,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold); + } + }; + + +}; + +#endif //CONVEX_2D_CONVEX_2D_ALGORITHM_H diff --git a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp index 16e3ece7d..5cceb04db 100644 --- a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp +++ b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp @@ -1,772 +1,772 @@ -#include "btInternalEdgeUtility.h" - -#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btTriangleShape.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" -#include "LinearMath/btIDebugDraw.h" - - -//#define DEBUG_INTERNAL_EDGE - - -#ifdef DEBUG_INTERNAL_EDGE -#include -#endif //DEBUG_INTERNAL_EDGE - - -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW -static btIDebugDraw* gDebugDrawer = 0; - -void btSetDebugDrawer(btIDebugDraw* debugDrawer) -{ - gDebugDrawer = debugDrawer; -} - -static void btDebugDrawLine(const btVector3& from,const btVector3& to, const btVector3& color) -{ - if (gDebugDrawer) - gDebugDrawer->drawLine(from,to,color); -} -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - -static int btGetHash(int partId, int triangleIndex) -{ - int hash = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex; - return hash; -} - - - -static btScalar btGetAngle(const btVector3& edgeA, const btVector3& normalA,const btVector3& normalB) -{ - const btVector3 refAxis0 = edgeA; - const btVector3 refAxis1 = normalA; - const btVector3 swingAxis = normalB; - btScalar angle = btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1)); - return angle; -} - - -struct btConnectivityProcessor : public btTriangleCallback -{ - int m_partIdA; - int m_triangleIndexA; - btVector3* m_triangleVerticesA; - btTriangleInfoMap* m_triangleInfoMap; - - - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) - { - //skip self-collisions - if ((m_partIdA == partId) && (m_triangleIndexA == triangleIndex)) - return; - - //skip duplicates (disabled for now) - //if ((m_partIdA <= partId) && (m_triangleIndexA <= triangleIndex)) - // return; - - //search for shared vertices and edges - int numshared = 0; - int sharedVertsA[3]={-1,-1,-1}; - int sharedVertsB[3]={-1,-1,-1}; - - ///skip degenerate triangles - btScalar crossBSqr = ((triangle[1]-triangle[0]).cross(triangle[2]-triangle[0])).length2(); - if (crossBSqr < m_triangleInfoMap->m_equalVertexThreshold) - return; - - - btScalar crossASqr = ((m_triangleVerticesA[1]-m_triangleVerticesA[0]).cross(m_triangleVerticesA[2]-m_triangleVerticesA[0])).length2(); - ///skip degenerate triangles - if (crossASqr< m_triangleInfoMap->m_equalVertexThreshold) - return; - -#if 0 - printf("triangle A[0] = (%f,%f,%f)\ntriangle A[1] = (%f,%f,%f)\ntriangle A[2] = (%f,%f,%f)\n", - m_triangleVerticesA[0].getX(),m_triangleVerticesA[0].getY(),m_triangleVerticesA[0].getZ(), - m_triangleVerticesA[1].getX(),m_triangleVerticesA[1].getY(),m_triangleVerticesA[1].getZ(), - m_triangleVerticesA[2].getX(),m_triangleVerticesA[2].getY(),m_triangleVerticesA[2].getZ()); - - printf("partId=%d, triangleIndex=%d\n",partId,triangleIndex); - printf("triangle B[0] = (%f,%f,%f)\ntriangle B[1] = (%f,%f,%f)\ntriangle B[2] = (%f,%f,%f)\n", - triangle[0].getX(),triangle[0].getY(),triangle[0].getZ(), - triangle[1].getX(),triangle[1].getY(),triangle[1].getZ(), - triangle[2].getX(),triangle[2].getY(),triangle[2].getZ()); -#endif - - for (int i=0;i<3;i++) - { - for (int j=0;j<3;j++) - { - if ( (m_triangleVerticesA[i]-triangle[j]).length2() < m_triangleInfoMap->m_equalVertexThreshold) - { - sharedVertsA[numshared] = i; - sharedVertsB[numshared] = j; - numshared++; - ///degenerate case - if(numshared >= 3) - return; - } - } - ///degenerate case - if(numshared >= 3) - return; - } - switch (numshared) - { - case 0: - { - break; - } - case 1: - { - //shared vertex - break; - } - case 2: - { - //shared edge - //we need to make sure the edge is in the order V2V0 and not V0V2 so that the signs are correct - if (sharedVertsA[0] == 0 && sharedVertsA[1] == 2) - { - sharedVertsA[0] = 2; - sharedVertsA[1] = 0; - int tmp = sharedVertsB[1]; - sharedVertsB[1] = sharedVertsB[0]; - sharedVertsB[0] = tmp; - } - - int hash = btGetHash(m_partIdA,m_triangleIndexA); - - btTriangleInfo* info = m_triangleInfoMap->find(hash); - if (!info) - { - btTriangleInfo tmp; - m_triangleInfoMap->insert(hash,tmp); - info = m_triangleInfoMap->find(hash); - } - - int sumvertsA = sharedVertsA[0]+sharedVertsA[1]; - int otherIndexA = 3-sumvertsA; - - - btVector3 edge(m_triangleVerticesA[sharedVertsA[1]]-m_triangleVerticesA[sharedVertsA[0]]); - - btTriangleShape tA(m_triangleVerticesA[0],m_triangleVerticesA[1],m_triangleVerticesA[2]); - int otherIndexB = 3-(sharedVertsB[0]+sharedVertsB[1]); - - btTriangleShape tB(triangle[sharedVertsB[1]],triangle[sharedVertsB[0]],triangle[otherIndexB]); - //btTriangleShape tB(triangle[0],triangle[1],triangle[2]); - - btVector3 normalA; - btVector3 normalB; - tA.calcNormal(normalA); - tB.calcNormal(normalB); - edge.normalize(); - btVector3 edgeCrossA = edge.cross(normalA).normalize(); - - { - btVector3 tmp = m_triangleVerticesA[otherIndexA]-m_triangleVerticesA[sharedVertsA[0]]; - if (edgeCrossA.dot(tmp) < 0) - { - edgeCrossA*=-1; - } - } - - btVector3 edgeCrossB = edge.cross(normalB).normalize(); - - { - btVector3 tmp = triangle[otherIndexB]-triangle[sharedVertsB[0]]; - if (edgeCrossB.dot(tmp) < 0) - { - edgeCrossB*=-1; - } - } - - btScalar angle2 = 0; - btScalar ang4 = 0.f; - - - btVector3 calculatedEdge = edgeCrossA.cross(edgeCrossB); - btScalar len2 = calculatedEdge.length2(); - - btScalar correctedAngle(0); - btVector3 calculatedNormalB = normalA; - bool isConvex = false; - - if (len2m_planarEpsilon) - { - angle2 = 0.f; - ang4 = 0.f; - } else - { - - calculatedEdge.normalize(); - btVector3 calculatedNormalA = calculatedEdge.cross(edgeCrossA); - calculatedNormalA.normalize(); - angle2 = btGetAngle(calculatedNormalA,edgeCrossA,edgeCrossB); - ang4 = SIMD_PI-angle2; - btScalar dotA = normalA.dot(edgeCrossB); - ///@todo: check if we need some epsilon, due to floating point imprecision - isConvex = (dotA<0.); - - correctedAngle = isConvex ? ang4 : -ang4; - btQuaternion orn2(calculatedEdge,-correctedAngle); - calculatedNormalB = btMatrix3x3(orn2)*normalA; - - - } - - - - - - //alternatively use - //btVector3 calculatedNormalB2 = quatRotate(orn,normalA); - - - switch (sumvertsA) - { - case 1: - { - btVector3 edge = m_triangleVerticesA[0]-m_triangleVerticesA[1]; - btQuaternion orn(edge,-correctedAngle); - btVector3 computedNormalB = quatRotate(orn,normalA); - btScalar bla = computedNormalB.dot(normalB); - if (bla<0) - { - computedNormalB*=-1; - info->m_flags |= TRI_INFO_V0V1_SWAP_NORMALB; - } -#ifdef DEBUG_INTERNAL_EDGE - if ((computedNormalB-normalB).length()>0.0001) - { - printf("warning: normals not identical\n"); - } -#endif//DEBUG_INTERNAL_EDGE - - info->m_edgeV0V1Angle = -correctedAngle; - - if (isConvex) - info->m_flags |= TRI_INFO_V0V1_CONVEX; - break; - } - case 2: - { - btVector3 edge = m_triangleVerticesA[2]-m_triangleVerticesA[0]; - btQuaternion orn(edge,-correctedAngle); - btVector3 computedNormalB = quatRotate(orn,normalA); - if (computedNormalB.dot(normalB)<0) - { - computedNormalB*=-1; - info->m_flags |= TRI_INFO_V2V0_SWAP_NORMALB; - } - -#ifdef DEBUG_INTERNAL_EDGE - if ((computedNormalB-normalB).length()>0.0001) - { - printf("warning: normals not identical\n"); - } -#endif //DEBUG_INTERNAL_EDGE - info->m_edgeV2V0Angle = -correctedAngle; - if (isConvex) - info->m_flags |= TRI_INFO_V2V0_CONVEX; - break; - } - case 3: - { - btVector3 edge = m_triangleVerticesA[1]-m_triangleVerticesA[2]; - btQuaternion orn(edge,-correctedAngle); - btVector3 computedNormalB = quatRotate(orn,normalA); - if (computedNormalB.dot(normalB)<0) - { - info->m_flags |= TRI_INFO_V1V2_SWAP_NORMALB; - computedNormalB*=-1; - } -#ifdef DEBUG_INTERNAL_EDGE - if ((computedNormalB-normalB).length()>0.0001) - { - printf("warning: normals not identical\n"); - } -#endif //DEBUG_INTERNAL_EDGE - info->m_edgeV1V2Angle = -correctedAngle; - - if (isConvex) - info->m_flags |= TRI_INFO_V1V2_CONVEX; - break; - } - } - - break; - } - default: - { - // printf("warning: duplicate triangle\n"); - } - - } - } -}; -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// - -void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap) -{ - //the user pointer shouldn't already be used for other purposes, we intend to store connectivity info there! - if (trimeshShape->getTriangleInfoMap()) - return; - - trimeshShape->setTriangleInfoMap(triangleInfoMap); - - btStridingMeshInterface* meshInterface = trimeshShape->getMeshInterface(); - const btVector3& meshScaling = meshInterface->getScaling(); - - for (int partId = 0; partId< meshInterface->getNumSubParts();partId++) - { - const unsigned char *vertexbase = 0; - int numverts = 0; - PHY_ScalarType type = PHY_INTEGER; - int stride = 0; - const unsigned char *indexbase = 0; - int indexstride = 0; - int numfaces = 0; - PHY_ScalarType indicestype = PHY_INTEGER; - //PHY_ScalarType indexType=0; - - btVector3 triangleVerts[3]; - meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,partId); - btVector3 aabbMin,aabbMax; - - for (int triangleIndex = 0 ; triangleIndex < numfaces;triangleIndex++) - { - unsigned int* gfxbase = (unsigned int*)(indexbase+triangleIndex*indexstride); - - for (int j=2;j>=0;j--) - { - - int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j]; - if (type == PHY_FLOAT) - { - float* graphicsbase = (float*)(vertexbase+graphicsindex*stride); - triangleVerts[j] = btVector3( - graphicsbase[0]*meshScaling.getX(), - graphicsbase[1]*meshScaling.getY(), - graphicsbase[2]*meshScaling.getZ()); - } - else - { - double* graphicsbase = (double*)(vertexbase+graphicsindex*stride); - triangleVerts[j] = btVector3( btScalar(graphicsbase[0]*meshScaling.getX()), btScalar(graphicsbase[1]*meshScaling.getY()), btScalar(graphicsbase[2]*meshScaling.getZ())); - } - } - aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT)); - aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT)); - aabbMin.setMin(triangleVerts[0]); - aabbMax.setMax(triangleVerts[0]); - aabbMin.setMin(triangleVerts[1]); - aabbMax.setMax(triangleVerts[1]); - aabbMin.setMin(triangleVerts[2]); - aabbMax.setMax(triangleVerts[2]); - - btConnectivityProcessor connectivityProcessor; - connectivityProcessor.m_partIdA = partId; - connectivityProcessor.m_triangleIndexA = triangleIndex; - connectivityProcessor.m_triangleVerticesA = &triangleVerts[0]; - connectivityProcessor.m_triangleInfoMap = triangleInfoMap; - - trimeshShape->processAllTriangles(&connectivityProcessor,aabbMin,aabbMax); - } - - } - -} - - - - -// Given a point and a line segment (defined by two points), compute the closest point -// in the line. Cap the point at the endpoints of the line segment. -void btNearestPointInLineSegment(const btVector3 &point, const btVector3& line0, const btVector3& line1, btVector3& nearestPoint) -{ - btVector3 lineDelta = line1 - line0; - - // Handle degenerate lines - if ( lineDelta.fuzzyZero()) - { - nearestPoint = line0; - } - else - { - btScalar delta = (point-line0).dot(lineDelta) / (lineDelta).dot(lineDelta); - - // Clamp the point to conform to the segment's endpoints - if ( delta < 0 ) - delta = 0; - else if ( delta > 1 ) - delta = 1; - - nearestPoint = line0 + lineDelta*delta; - } -} - - - - -bool btClampNormal(const btVector3& edge,const btVector3& tri_normal_org,const btVector3& localContactNormalOnB, btScalar correctedEdgeAngle, btVector3 & clampedLocalNormal) -{ - btVector3 tri_normal = tri_normal_org; - //we only have a local triangle normal, not a local contact normal -> only normal in world space... - //either compute the current angle all in local space, or all in world space - - btVector3 edgeCross = edge.cross(tri_normal).normalize(); - btScalar curAngle = btGetAngle(edgeCross,tri_normal,localContactNormalOnB); - - if (correctedEdgeAngle<0) - { - if (curAngle < correctedEdgeAngle) - { - btScalar diffAngle = correctedEdgeAngle-curAngle; - btQuaternion rotation(edge,diffAngle ); - clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB; - return true; - } - } - - if (correctedEdgeAngle>=0) - { - if (curAngle > correctedEdgeAngle) - { - btScalar diffAngle = correctedEdgeAngle-curAngle; - btQuaternion rotation(edge,diffAngle ); - clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB; - return true; - } - } - return false; -} - - - -/// Changes a btManifoldPoint collision normal to the normal from the mesh. -void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* colObj0,const btCollisionObject* colObj1, int partId0, int index0, int normalAdjustFlags) -{ - //btAssert(colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE); - if (colObj0->getCollisionShape()->getShapeType() != TRIANGLE_SHAPE_PROXYTYPE) - return; - - btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)colObj0->getRootCollisionShape(); - btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*) trimesh->getTriangleInfoMap(); - if (!triangleInfoMapPtr) - return; - - int hash = btGetHash(partId0,index0); - - - btTriangleInfo* info = triangleInfoMapPtr->find(hash); - if (!info) - return; - - btScalar frontFacing = (normalAdjustFlags & BT_TRIANGLE_CONVEX_BACKFACE_MODE)==0? 1.f : -1.f; - - const btTriangleShape* tri_shape = static_cast(colObj0->getCollisionShape()); - btVector3 v0,v1,v2; - tri_shape->getVertex(0,v0); - tri_shape->getVertex(1,v1); - tri_shape->getVertex(2,v2); - - btVector3 center = (v0+v1+v2)*btScalar(1./3.); - - btVector3 red(1,0,0), green(0,1,0),blue(0,0,1),white(1,1,1),black(0,0,0); - btVector3 tri_normal; - tri_shape->calcNormal(tri_normal); - - //btScalar dot = tri_normal.dot(cp.m_normalWorldOnB); - btVector3 nearest; - btNearestPointInLineSegment(cp.m_localPointB,v0,v1,nearest); - - btVector3 contact = cp.m_localPointB; -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - const btTransform& tr = colObj0->getWorldTransform(); - btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,red); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - - - bool isNearEdge = false; - - int numConcaveEdgeHits = 0; - int numConvexEdgeHits = 0; - - btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB; - localContactNormalOnB.normalize();//is this necessary? - - if ((info->m_edgeV0V1Angle)< SIMD_2_PI) - { -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black); -#endif - btScalar len = (contact-nearest).length(); - if(lenm_edgeDistanceThreshold) - { - btVector3 edge(v0-v1); - isNearEdge = true; - - if (info->m_edgeV0V1Angle==btScalar(0)) - { - numConcaveEdgeHits++; - } else - { - - bool isEdgeConvex = (info->m_flags & TRI_INFO_V0V1_CONVEX); - btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1); - #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white); - #endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - btVector3 nA = swapFactor * tri_normal; - - btQuaternion orn(edge,info->m_edgeV0V1Angle); - btVector3 computedNormalB = quatRotate(orn,tri_normal); - if (info->m_flags & TRI_INFO_V0V1_SWAP_NORMALB) - computedNormalB*=-1; - btVector3 nB = swapFactor*computedNormalB; - - btScalar NdotA = localContactNormalOnB.dot(nA); - btScalar NdotB = localContactNormalOnB.dot(nB); - bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotBm_convexEpsilon); - -#ifdef DEBUG_INTERNAL_EDGE - { - - btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red); - } -#endif //DEBUG_INTERNAL_EDGE - - - if (backFacingNormal) - { - numConcaveEdgeHits++; - } - else - { - numConvexEdgeHits++; - btVector3 clampedLocalNormal; - bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal); - if (isClamped) - { - if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0)) - { - btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; - // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); - cp.m_normalWorldOnB = newNormal; - // Reproject collision point along normal. (what about cp.m_distance1?) - cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; - cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); - - } - } - } - } - } - } - - btNearestPointInLineSegment(contact,v1,v2,nearest); -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,green); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - if ((info->m_edgeV1V2Angle)< SIMD_2_PI) - { -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - - - btScalar len = (contact-nearest).length(); - if(lenm_edgeDistanceThreshold) - { - isNearEdge = true; -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - btVector3 edge(v1-v2); - - isNearEdge = true; - - if (info->m_edgeV1V2Angle == btScalar(0)) - { - numConcaveEdgeHits++; - } else - { - bool isEdgeConvex = (info->m_flags & TRI_INFO_V1V2_CONVEX)!=0; - btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1); - #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white); - #endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - btVector3 nA = swapFactor * tri_normal; - - btQuaternion orn(edge,info->m_edgeV1V2Angle); - btVector3 computedNormalB = quatRotate(orn,tri_normal); - if (info->m_flags & TRI_INFO_V1V2_SWAP_NORMALB) - computedNormalB*=-1; - btVector3 nB = swapFactor*computedNormalB; - -#ifdef DEBUG_INTERNAL_EDGE - { - btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red); - } -#endif //DEBUG_INTERNAL_EDGE - - - btScalar NdotA = localContactNormalOnB.dot(nA); - btScalar NdotB = localContactNormalOnB.dot(nB); - bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotBm_convexEpsilon); - - if (backFacingNormal) - { - numConcaveEdgeHits++; - } - else - { - numConvexEdgeHits++; - btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB; - btVector3 clampedLocalNormal; - bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV1V2Angle,clampedLocalNormal); - if (isClamped) - { - if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0)) - { - btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; - // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); - cp.m_normalWorldOnB = newNormal; - // Reproject collision point along normal. - cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; - cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); - } - } - } - } - } - } - - btNearestPointInLineSegment(contact,v2,v0,nearest); -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,blue); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - if ((info->m_edgeV2V0Angle)< SIMD_2_PI) - { - -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - btScalar len = (contact-nearest).length(); - if(lenm_edgeDistanceThreshold) - { - isNearEdge = true; -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - btVector3 edge(v2-v0); - - if (info->m_edgeV2V0Angle==btScalar(0)) - { - numConcaveEdgeHits++; - } else - { - - bool isEdgeConvex = (info->m_flags & TRI_INFO_V2V0_CONVEX)!=0; - btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1); - #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW - btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white); - #endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - btVector3 nA = swapFactor * tri_normal; - btQuaternion orn(edge,info->m_edgeV2V0Angle); - btVector3 computedNormalB = quatRotate(orn,tri_normal); - if (info->m_flags & TRI_INFO_V2V0_SWAP_NORMALB) - computedNormalB*=-1; - btVector3 nB = swapFactor*computedNormalB; - -#ifdef DEBUG_INTERNAL_EDGE - { - btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red); - } -#endif //DEBUG_INTERNAL_EDGE - - btScalar NdotA = localContactNormalOnB.dot(nA); - btScalar NdotB = localContactNormalOnB.dot(nB); - bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotBm_convexEpsilon); - - if (backFacingNormal) - { - numConcaveEdgeHits++; - } - else - { - numConvexEdgeHits++; - // printf("hitting convex edge\n"); - - - btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB; - btVector3 clampedLocalNormal; - bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB,info->m_edgeV2V0Angle,clampedLocalNormal); - if (isClamped) - { - if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0)) - { - btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; - // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); - cp.m_normalWorldOnB = newNormal; - // Reproject collision point along normal. - cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; - cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); - } - } - } - } - - - } - } - -#ifdef DEBUG_INTERNAL_EDGE - { - btVector3 color(0,1,1); - btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+cp.m_normalWorldOnB*10,color); - } -#endif //DEBUG_INTERNAL_EDGE - - if (isNearEdge) - { - - if (numConcaveEdgeHits>0) - { - if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED)!=0) - { - //fix tri_normal so it pointing the same direction as the current local contact normal - if (tri_normal.dot(localContactNormalOnB) < 0) - { - tri_normal *= -1; - } - cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis()*tri_normal; - } else - { - //modify the normal to be the triangle normal (or backfacing normal) - cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *(tri_normal *frontFacing); - } - - - // Reproject collision point along normal. - cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; - cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); - } - } -} +#include "btInternalEdgeUtility.h" + +#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btTriangleShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" +#include "LinearMath/btIDebugDraw.h" + + +//#define DEBUG_INTERNAL_EDGE + + +#ifdef DEBUG_INTERNAL_EDGE +#include +#endif //DEBUG_INTERNAL_EDGE + + +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW +static btIDebugDraw* gDebugDrawer = 0; + +void btSetDebugDrawer(btIDebugDraw* debugDrawer) +{ + gDebugDrawer = debugDrawer; +} + +static void btDebugDrawLine(const btVector3& from,const btVector3& to, const btVector3& color) +{ + if (gDebugDrawer) + gDebugDrawer->drawLine(from,to,color); +} +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + +static int btGetHash(int partId, int triangleIndex) +{ + int hash = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex; + return hash; +} + + + +static btScalar btGetAngle(const btVector3& edgeA, const btVector3& normalA,const btVector3& normalB) +{ + const btVector3 refAxis0 = edgeA; + const btVector3 refAxis1 = normalA; + const btVector3 swingAxis = normalB; + btScalar angle = btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1)); + return angle; +} + + +struct btConnectivityProcessor : public btTriangleCallback +{ + int m_partIdA; + int m_triangleIndexA; + btVector3* m_triangleVerticesA; + btTriangleInfoMap* m_triangleInfoMap; + + + virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) + { + //skip self-collisions + if ((m_partIdA == partId) && (m_triangleIndexA == triangleIndex)) + return; + + //skip duplicates (disabled for now) + //if ((m_partIdA <= partId) && (m_triangleIndexA <= triangleIndex)) + // return; + + //search for shared vertices and edges + int numshared = 0; + int sharedVertsA[3]={-1,-1,-1}; + int sharedVertsB[3]={-1,-1,-1}; + + ///skip degenerate triangles + btScalar crossBSqr = ((triangle[1]-triangle[0]).cross(triangle[2]-triangle[0])).length2(); + if (crossBSqr < m_triangleInfoMap->m_equalVertexThreshold) + return; + + + btScalar crossASqr = ((m_triangleVerticesA[1]-m_triangleVerticesA[0]).cross(m_triangleVerticesA[2]-m_triangleVerticesA[0])).length2(); + ///skip degenerate triangles + if (crossASqr< m_triangleInfoMap->m_equalVertexThreshold) + return; + +#if 0 + printf("triangle A[0] = (%f,%f,%f)\ntriangle A[1] = (%f,%f,%f)\ntriangle A[2] = (%f,%f,%f)\n", + m_triangleVerticesA[0].getX(),m_triangleVerticesA[0].getY(),m_triangleVerticesA[0].getZ(), + m_triangleVerticesA[1].getX(),m_triangleVerticesA[1].getY(),m_triangleVerticesA[1].getZ(), + m_triangleVerticesA[2].getX(),m_triangleVerticesA[2].getY(),m_triangleVerticesA[2].getZ()); + + printf("partId=%d, triangleIndex=%d\n",partId,triangleIndex); + printf("triangle B[0] = (%f,%f,%f)\ntriangle B[1] = (%f,%f,%f)\ntriangle B[2] = (%f,%f,%f)\n", + triangle[0].getX(),triangle[0].getY(),triangle[0].getZ(), + triangle[1].getX(),triangle[1].getY(),triangle[1].getZ(), + triangle[2].getX(),triangle[2].getY(),triangle[2].getZ()); +#endif + + for (int i=0;i<3;i++) + { + for (int j=0;j<3;j++) + { + if ( (m_triangleVerticesA[i]-triangle[j]).length2() < m_triangleInfoMap->m_equalVertexThreshold) + { + sharedVertsA[numshared] = i; + sharedVertsB[numshared] = j; + numshared++; + ///degenerate case + if(numshared >= 3) + return; + } + } + ///degenerate case + if(numshared >= 3) + return; + } + switch (numshared) + { + case 0: + { + break; + } + case 1: + { + //shared vertex + break; + } + case 2: + { + //shared edge + //we need to make sure the edge is in the order V2V0 and not V0V2 so that the signs are correct + if (sharedVertsA[0] == 0 && sharedVertsA[1] == 2) + { + sharedVertsA[0] = 2; + sharedVertsA[1] = 0; + int tmp = sharedVertsB[1]; + sharedVertsB[1] = sharedVertsB[0]; + sharedVertsB[0] = tmp; + } + + int hash = btGetHash(m_partIdA,m_triangleIndexA); + + btTriangleInfo* info = m_triangleInfoMap->find(hash); + if (!info) + { + btTriangleInfo tmp; + m_triangleInfoMap->insert(hash,tmp); + info = m_triangleInfoMap->find(hash); + } + + int sumvertsA = sharedVertsA[0]+sharedVertsA[1]; + int otherIndexA = 3-sumvertsA; + + + btVector3 edge(m_triangleVerticesA[sharedVertsA[1]]-m_triangleVerticesA[sharedVertsA[0]]); + + btTriangleShape tA(m_triangleVerticesA[0],m_triangleVerticesA[1],m_triangleVerticesA[2]); + int otherIndexB = 3-(sharedVertsB[0]+sharedVertsB[1]); + + btTriangleShape tB(triangle[sharedVertsB[1]],triangle[sharedVertsB[0]],triangle[otherIndexB]); + //btTriangleShape tB(triangle[0],triangle[1],triangle[2]); + + btVector3 normalA; + btVector3 normalB; + tA.calcNormal(normalA); + tB.calcNormal(normalB); + edge.normalize(); + btVector3 edgeCrossA = edge.cross(normalA).normalize(); + + { + btVector3 tmp = m_triangleVerticesA[otherIndexA]-m_triangleVerticesA[sharedVertsA[0]]; + if (edgeCrossA.dot(tmp) < 0) + { + edgeCrossA*=-1; + } + } + + btVector3 edgeCrossB = edge.cross(normalB).normalize(); + + { + btVector3 tmp = triangle[otherIndexB]-triangle[sharedVertsB[0]]; + if (edgeCrossB.dot(tmp) < 0) + { + edgeCrossB*=-1; + } + } + + btScalar angle2 = 0; + btScalar ang4 = 0.f; + + + btVector3 calculatedEdge = edgeCrossA.cross(edgeCrossB); + btScalar len2 = calculatedEdge.length2(); + + btScalar correctedAngle(0); + btVector3 calculatedNormalB = normalA; + bool isConvex = false; + + if (len2m_planarEpsilon) + { + angle2 = 0.f; + ang4 = 0.f; + } else + { + + calculatedEdge.normalize(); + btVector3 calculatedNormalA = calculatedEdge.cross(edgeCrossA); + calculatedNormalA.normalize(); + angle2 = btGetAngle(calculatedNormalA,edgeCrossA,edgeCrossB); + ang4 = SIMD_PI-angle2; + btScalar dotA = normalA.dot(edgeCrossB); + ///@todo: check if we need some epsilon, due to floating point imprecision + isConvex = (dotA<0.); + + correctedAngle = isConvex ? ang4 : -ang4; + btQuaternion orn2(calculatedEdge,-correctedAngle); + calculatedNormalB = btMatrix3x3(orn2)*normalA; + + + } + + + + + + //alternatively use + //btVector3 calculatedNormalB2 = quatRotate(orn,normalA); + + + switch (sumvertsA) + { + case 1: + { + btVector3 edge = m_triangleVerticesA[0]-m_triangleVerticesA[1]; + btQuaternion orn(edge,-correctedAngle); + btVector3 computedNormalB = quatRotate(orn,normalA); + btScalar bla = computedNormalB.dot(normalB); + if (bla<0) + { + computedNormalB*=-1; + info->m_flags |= TRI_INFO_V0V1_SWAP_NORMALB; + } +#ifdef DEBUG_INTERNAL_EDGE + if ((computedNormalB-normalB).length()>0.0001) + { + printf("warning: normals not identical\n"); + } +#endif//DEBUG_INTERNAL_EDGE + + info->m_edgeV0V1Angle = -correctedAngle; + + if (isConvex) + info->m_flags |= TRI_INFO_V0V1_CONVEX; + break; + } + case 2: + { + btVector3 edge = m_triangleVerticesA[2]-m_triangleVerticesA[0]; + btQuaternion orn(edge,-correctedAngle); + btVector3 computedNormalB = quatRotate(orn,normalA); + if (computedNormalB.dot(normalB)<0) + { + computedNormalB*=-1; + info->m_flags |= TRI_INFO_V2V0_SWAP_NORMALB; + } + +#ifdef DEBUG_INTERNAL_EDGE + if ((computedNormalB-normalB).length()>0.0001) + { + printf("warning: normals not identical\n"); + } +#endif //DEBUG_INTERNAL_EDGE + info->m_edgeV2V0Angle = -correctedAngle; + if (isConvex) + info->m_flags |= TRI_INFO_V2V0_CONVEX; + break; + } + case 3: + { + btVector3 edge = m_triangleVerticesA[1]-m_triangleVerticesA[2]; + btQuaternion orn(edge,-correctedAngle); + btVector3 computedNormalB = quatRotate(orn,normalA); + if (computedNormalB.dot(normalB)<0) + { + info->m_flags |= TRI_INFO_V1V2_SWAP_NORMALB; + computedNormalB*=-1; + } +#ifdef DEBUG_INTERNAL_EDGE + if ((computedNormalB-normalB).length()>0.0001) + { + printf("warning: normals not identical\n"); + } +#endif //DEBUG_INTERNAL_EDGE + info->m_edgeV1V2Angle = -correctedAngle; + + if (isConvex) + info->m_flags |= TRI_INFO_V1V2_CONVEX; + break; + } + } + + break; + } + default: + { + // printf("warning: duplicate triangle\n"); + } + + } + } +}; +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// + +void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap) +{ + //the user pointer shouldn't already be used for other purposes, we intend to store connectivity info there! + if (trimeshShape->getTriangleInfoMap()) + return; + + trimeshShape->setTriangleInfoMap(triangleInfoMap); + + btStridingMeshInterface* meshInterface = trimeshShape->getMeshInterface(); + const btVector3& meshScaling = meshInterface->getScaling(); + + for (int partId = 0; partId< meshInterface->getNumSubParts();partId++) + { + const unsigned char *vertexbase = 0; + int numverts = 0; + PHY_ScalarType type = PHY_INTEGER; + int stride = 0; + const unsigned char *indexbase = 0; + int indexstride = 0; + int numfaces = 0; + PHY_ScalarType indicestype = PHY_INTEGER; + //PHY_ScalarType indexType=0; + + btVector3 triangleVerts[3]; + meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,partId); + btVector3 aabbMin,aabbMax; + + for (int triangleIndex = 0 ; triangleIndex < numfaces;triangleIndex++) + { + unsigned int* gfxbase = (unsigned int*)(indexbase+triangleIndex*indexstride); + + for (int j=2;j>=0;j--) + { + + int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j]; + if (type == PHY_FLOAT) + { + float* graphicsbase = (float*)(vertexbase+graphicsindex*stride); + triangleVerts[j] = btVector3( + graphicsbase[0]*meshScaling.getX(), + graphicsbase[1]*meshScaling.getY(), + graphicsbase[2]*meshScaling.getZ()); + } + else + { + double* graphicsbase = (double*)(vertexbase+graphicsindex*stride); + triangleVerts[j] = btVector3( btScalar(graphicsbase[0]*meshScaling.getX()), btScalar(graphicsbase[1]*meshScaling.getY()), btScalar(graphicsbase[2]*meshScaling.getZ())); + } + } + aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT)); + aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT)); + aabbMin.setMin(triangleVerts[0]); + aabbMax.setMax(triangleVerts[0]); + aabbMin.setMin(triangleVerts[1]); + aabbMax.setMax(triangleVerts[1]); + aabbMin.setMin(triangleVerts[2]); + aabbMax.setMax(triangleVerts[2]); + + btConnectivityProcessor connectivityProcessor; + connectivityProcessor.m_partIdA = partId; + connectivityProcessor.m_triangleIndexA = triangleIndex; + connectivityProcessor.m_triangleVerticesA = &triangleVerts[0]; + connectivityProcessor.m_triangleInfoMap = triangleInfoMap; + + trimeshShape->processAllTriangles(&connectivityProcessor,aabbMin,aabbMax); + } + + } + +} + + + + +// Given a point and a line segment (defined by two points), compute the closest point +// in the line. Cap the point at the endpoints of the line segment. +void btNearestPointInLineSegment(const btVector3 &point, const btVector3& line0, const btVector3& line1, btVector3& nearestPoint) +{ + btVector3 lineDelta = line1 - line0; + + // Handle degenerate lines + if ( lineDelta.fuzzyZero()) + { + nearestPoint = line0; + } + else + { + btScalar delta = (point-line0).dot(lineDelta) / (lineDelta).dot(lineDelta); + + // Clamp the point to conform to the segment's endpoints + if ( delta < 0 ) + delta = 0; + else if ( delta > 1 ) + delta = 1; + + nearestPoint = line0 + lineDelta*delta; + } +} + + + + +bool btClampNormal(const btVector3& edge,const btVector3& tri_normal_org,const btVector3& localContactNormalOnB, btScalar correctedEdgeAngle, btVector3 & clampedLocalNormal) +{ + btVector3 tri_normal = tri_normal_org; + //we only have a local triangle normal, not a local contact normal -> only normal in world space... + //either compute the current angle all in local space, or all in world space + + btVector3 edgeCross = edge.cross(tri_normal).normalize(); + btScalar curAngle = btGetAngle(edgeCross,tri_normal,localContactNormalOnB); + + if (correctedEdgeAngle<0) + { + if (curAngle < correctedEdgeAngle) + { + btScalar diffAngle = correctedEdgeAngle-curAngle; + btQuaternion rotation(edge,diffAngle ); + clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB; + return true; + } + } + + if (correctedEdgeAngle>=0) + { + if (curAngle > correctedEdgeAngle) + { + btScalar diffAngle = correctedEdgeAngle-curAngle; + btQuaternion rotation(edge,diffAngle ); + clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB; + return true; + } + } + return false; +} + + + +/// Changes a btManifoldPoint collision normal to the normal from the mesh. +void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* colObj0,const btCollisionObject* colObj1, int partId0, int index0, int normalAdjustFlags) +{ + //btAssert(colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE); + if (colObj0->getCollisionShape()->getShapeType() != TRIANGLE_SHAPE_PROXYTYPE) + return; + + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)colObj0->getRootCollisionShape(); + btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*) trimesh->getTriangleInfoMap(); + if (!triangleInfoMapPtr) + return; + + int hash = btGetHash(partId0,index0); + + + btTriangleInfo* info = triangleInfoMapPtr->find(hash); + if (!info) + return; + + btScalar frontFacing = (normalAdjustFlags & BT_TRIANGLE_CONVEX_BACKFACE_MODE)==0? 1.f : -1.f; + + const btTriangleShape* tri_shape = static_cast(colObj0->getCollisionShape()); + btVector3 v0,v1,v2; + tri_shape->getVertex(0,v0); + tri_shape->getVertex(1,v1); + tri_shape->getVertex(2,v2); + + btVector3 center = (v0+v1+v2)*btScalar(1./3.); + + btVector3 red(1,0,0), green(0,1,0),blue(0,0,1),white(1,1,1),black(0,0,0); + btVector3 tri_normal; + tri_shape->calcNormal(tri_normal); + + //btScalar dot = tri_normal.dot(cp.m_normalWorldOnB); + btVector3 nearest; + btNearestPointInLineSegment(cp.m_localPointB,v0,v1,nearest); + + btVector3 contact = cp.m_localPointB; +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + const btTransform& tr = colObj0->getWorldTransform(); + btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,red); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + + + bool isNearEdge = false; + + int numConcaveEdgeHits = 0; + int numConvexEdgeHits = 0; + + btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB; + localContactNormalOnB.normalize();//is this necessary? + + if ((info->m_edgeV0V1Angle)< SIMD_2_PI) + { +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black); +#endif + btScalar len = (contact-nearest).length(); + if(lenm_edgeDistanceThreshold) + { + btVector3 edge(v0-v1); + isNearEdge = true; + + if (info->m_edgeV0V1Angle==btScalar(0)) + { + numConcaveEdgeHits++; + } else + { + + bool isEdgeConvex = (info->m_flags & TRI_INFO_V0V1_CONVEX); + btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1); + #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white); + #endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + btVector3 nA = swapFactor * tri_normal; + + btQuaternion orn(edge,info->m_edgeV0V1Angle); + btVector3 computedNormalB = quatRotate(orn,tri_normal); + if (info->m_flags & TRI_INFO_V0V1_SWAP_NORMALB) + computedNormalB*=-1; + btVector3 nB = swapFactor*computedNormalB; + + btScalar NdotA = localContactNormalOnB.dot(nA); + btScalar NdotB = localContactNormalOnB.dot(nB); + bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotBm_convexEpsilon); + +#ifdef DEBUG_INTERNAL_EDGE + { + + btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red); + } +#endif //DEBUG_INTERNAL_EDGE + + + if (backFacingNormal) + { + numConcaveEdgeHits++; + } + else + { + numConvexEdgeHits++; + btVector3 clampedLocalNormal; + bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal); + if (isClamped) + { + if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0)) + { + btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; + // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); + cp.m_normalWorldOnB = newNormal; + // Reproject collision point along normal. (what about cp.m_distance1?) + cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; + cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); + + } + } + } + } + } + } + + btNearestPointInLineSegment(contact,v1,v2,nearest); +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,green); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + if ((info->m_edgeV1V2Angle)< SIMD_2_PI) + { +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + + + btScalar len = (contact-nearest).length(); + if(lenm_edgeDistanceThreshold) + { + isNearEdge = true; +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + btVector3 edge(v1-v2); + + isNearEdge = true; + + if (info->m_edgeV1V2Angle == btScalar(0)) + { + numConcaveEdgeHits++; + } else + { + bool isEdgeConvex = (info->m_flags & TRI_INFO_V1V2_CONVEX)!=0; + btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1); + #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white); + #endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + btVector3 nA = swapFactor * tri_normal; + + btQuaternion orn(edge,info->m_edgeV1V2Angle); + btVector3 computedNormalB = quatRotate(orn,tri_normal); + if (info->m_flags & TRI_INFO_V1V2_SWAP_NORMALB) + computedNormalB*=-1; + btVector3 nB = swapFactor*computedNormalB; + +#ifdef DEBUG_INTERNAL_EDGE + { + btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red); + } +#endif //DEBUG_INTERNAL_EDGE + + + btScalar NdotA = localContactNormalOnB.dot(nA); + btScalar NdotB = localContactNormalOnB.dot(nB); + bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotBm_convexEpsilon); + + if (backFacingNormal) + { + numConcaveEdgeHits++; + } + else + { + numConvexEdgeHits++; + btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB; + btVector3 clampedLocalNormal; + bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV1V2Angle,clampedLocalNormal); + if (isClamped) + { + if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0)) + { + btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; + // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); + cp.m_normalWorldOnB = newNormal; + // Reproject collision point along normal. + cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; + cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); + } + } + } + } + } + } + + btNearestPointInLineSegment(contact,v2,v0,nearest); +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,blue); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + if ((info->m_edgeV2V0Angle)< SIMD_2_PI) + { + +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + btScalar len = (contact-nearest).length(); + if(lenm_edgeDistanceThreshold) + { + isNearEdge = true; +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + btVector3 edge(v2-v0); + + if (info->m_edgeV2V0Angle==btScalar(0)) + { + numConcaveEdgeHits++; + } else + { + + bool isEdgeConvex = (info->m_flags & TRI_INFO_V2V0_CONVEX)!=0; + btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1); + #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW + btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white); + #endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + btVector3 nA = swapFactor * tri_normal; + btQuaternion orn(edge,info->m_edgeV2V0Angle); + btVector3 computedNormalB = quatRotate(orn,tri_normal); + if (info->m_flags & TRI_INFO_V2V0_SWAP_NORMALB) + computedNormalB*=-1; + btVector3 nB = swapFactor*computedNormalB; + +#ifdef DEBUG_INTERNAL_EDGE + { + btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red); + } +#endif //DEBUG_INTERNAL_EDGE + + btScalar NdotA = localContactNormalOnB.dot(nA); + btScalar NdotB = localContactNormalOnB.dot(nB); + bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotBm_convexEpsilon); + + if (backFacingNormal) + { + numConcaveEdgeHits++; + } + else + { + numConvexEdgeHits++; + // printf("hitting convex edge\n"); + + + btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB; + btVector3 clampedLocalNormal; + bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB,info->m_edgeV2V0Angle,clampedLocalNormal); + if (isClamped) + { + if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0)) + { + btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; + // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); + cp.m_normalWorldOnB = newNormal; + // Reproject collision point along normal. + cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; + cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); + } + } + } + } + + + } + } + +#ifdef DEBUG_INTERNAL_EDGE + { + btVector3 color(0,1,1); + btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+cp.m_normalWorldOnB*10,color); + } +#endif //DEBUG_INTERNAL_EDGE + + if (isNearEdge) + { + + if (numConcaveEdgeHits>0) + { + if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED)!=0) + { + //fix tri_normal so it pointing the same direction as the current local contact normal + if (tri_normal.dot(localContactNormalOnB) < 0) + { + tri_normal *= -1; + } + cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis()*tri_normal; + } else + { + //modify the normal to be the triangle normal (or backfacing normal) + cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *(tri_normal *frontFacing); + } + + + // Reproject collision point along normal. + cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1; + cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB); + } + } +} diff --git a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h index 6319344ba..9efb0122b 100644 --- a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h +++ b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h @@ -1,46 +1,46 @@ - -#ifndef BT_INTERNAL_EDGE_UTILITY_H -#define BT_INTERNAL_EDGE_UTILITY_H - -#include "LinearMath/btHashMap.h" -#include "LinearMath/btVector3.h" - -#include "BulletCollision/CollisionShapes/btTriangleInfoMap.h" - -///The btInternalEdgeUtility helps to avoid or reduce artifacts due to wrong collision normals caused by internal edges. -///See also http://code.google.com/p/bullet/issues/detail?id=27 - -class btBvhTriangleMeshShape; -class btCollisionObject; -class btManifoldPoint; -class btIDebugDraw; - - - -enum btInternalEdgeAdjustFlags -{ - BT_TRIANGLE_CONVEX_BACKFACE_MODE = 1, - BT_TRIANGLE_CONCAVE_DOUBLE_SIDED = 2, //double sided options are experimental, single sided is recommended - BT_TRIANGLE_CONVEX_DOUBLE_SIDED = 4 -}; - - -///Call btGenerateInternalEdgeInfo to create triangle info, store in the shape 'userInfo' -void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap); - - -///Call the btFixMeshNormal to adjust the collision normal, using the triangle info map (generated using btGenerateInternalEdgeInfo) -///If this info map is missing, or the triangle is not store in this map, nothing will be done -void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* trimeshColObj0,const btCollisionObject* otherColObj1, int partId0, int index0, int normalAdjustFlags = 0); - -///Enable the BT_INTERNAL_EDGE_DEBUG_DRAW define and call btSetDebugDrawer, to get visual info to see if the internal edge utility works properly. -///If the utility doesn't work properly, you might have to adjust the threshold values in btTriangleInfoMap -//#define BT_INTERNAL_EDGE_DEBUG_DRAW - -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW -void btSetDebugDrawer(btIDebugDraw* debugDrawer); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - - -#endif //BT_INTERNAL_EDGE_UTILITY_H - + +#ifndef BT_INTERNAL_EDGE_UTILITY_H +#define BT_INTERNAL_EDGE_UTILITY_H + +#include "LinearMath/btHashMap.h" +#include "LinearMath/btVector3.h" + +#include "BulletCollision/CollisionShapes/btTriangleInfoMap.h" + +///The btInternalEdgeUtility helps to avoid or reduce artifacts due to wrong collision normals caused by internal edges. +///See also http://code.google.com/p/bullet/issues/detail?id=27 + +class btBvhTriangleMeshShape; +class btCollisionObject; +class btManifoldPoint; +class btIDebugDraw; + + + +enum btInternalEdgeAdjustFlags +{ + BT_TRIANGLE_CONVEX_BACKFACE_MODE = 1, + BT_TRIANGLE_CONCAVE_DOUBLE_SIDED = 2, //double sided options are experimental, single sided is recommended + BT_TRIANGLE_CONVEX_DOUBLE_SIDED = 4 +}; + + +///Call btGenerateInternalEdgeInfo to create triangle info, store in the shape 'userInfo' +void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap); + + +///Call the btFixMeshNormal to adjust the collision normal, using the triangle info map (generated using btGenerateInternalEdgeInfo) +///If this info map is missing, or the triangle is not store in this map, nothing will be done +void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* trimeshColObj0,const btCollisionObject* otherColObj1, int partId0, int index0, int normalAdjustFlags = 0); + +///Enable the BT_INTERNAL_EDGE_DEBUG_DRAW define and call btSetDebugDrawer, to get visual info to see if the internal edge utility works properly. +///If the utility doesn't work properly, you might have to adjust the threshold values in btTriangleInfoMap +//#define BT_INTERNAL_EDGE_DEBUG_DRAW + +#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW +void btSetDebugDrawer(btIDebugDraw* debugDrawer); +#endif //BT_INTERNAL_EDGE_DEBUG_DRAW + + +#endif //BT_INTERNAL_EDGE_UTILITY_H + diff --git a/src/BulletCollision/CollisionShapes/btBox2dShape.cpp b/src/BulletCollision/CollisionShapes/btBox2dShape.cpp index cfc54fc4f..ecce028c2 100644 --- a/src/BulletCollision/CollisionShapes/btBox2dShape.cpp +++ b/src/BulletCollision/CollisionShapes/btBox2dShape.cpp @@ -1,42 +1,42 @@ -/* -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 "btBox2dShape.h" - - -//{ - - -void btBox2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const -{ - btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax); -} - - -void btBox2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const -{ - //btScalar margin = btScalar(0.); - btVector3 halfExtents = getHalfExtentsWithMargin(); - - btScalar lx=btScalar(2.)*(halfExtents.x()); - btScalar ly=btScalar(2.)*(halfExtents.y()); - btScalar lz=btScalar(2.)*(halfExtents.z()); - - inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz), - mass/(btScalar(12.0)) * (lx*lx + lz*lz), - mass/(btScalar(12.0)) * (lx*lx + ly*ly)); - -} - +/* +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 "btBox2dShape.h" + + +//{ + + +void btBox2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const +{ + btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax); +} + + +void btBox2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const +{ + //btScalar margin = btScalar(0.); + btVector3 halfExtents = getHalfExtentsWithMargin(); + + btScalar lx=btScalar(2.)*(halfExtents.x()); + btScalar ly=btScalar(2.)*(halfExtents.y()); + btScalar lz=btScalar(2.)*(halfExtents.z()); + + inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz), + mass/(btScalar(12.0)) * (lx*lx + lz*lz), + mass/(btScalar(12.0)) * (lx*lx + ly*ly)); + +} + diff --git a/src/BulletCollision/CollisionShapes/btBox2dShape.h b/src/BulletCollision/CollisionShapes/btBox2dShape.h index a282e2302..fc032069c 100644 --- a/src/BulletCollision/CollisionShapes/btBox2dShape.h +++ b/src/BulletCollision/CollisionShapes/btBox2dShape.h @@ -1,363 +1,363 @@ -/* -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 OBB_BOX_2D_SHAPE_H -#define OBB_BOX_2D_SHAPE_H - -#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h" -#include "BulletCollision/CollisionShapes/btCollisionMargin.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btMinMax.h" - -///The btBox2dShape is a box primitive around the origin, its sides axis aligned with length specified by half extents, in local shape coordinates. When used as part of a btCollisionObject or btRigidBody it will be an oriented box in world space. -class btBox2dShape: public btPolyhedralConvexShape -{ - - //btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead - - btVector3 m_centroid; - btVector3 m_vertices[4]; - btVector3 m_normals[4]; - -public: - - btVector3 getHalfExtentsWithMargin() const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(),getMargin(),getMargin()); - halfExtents += margin; - return halfExtents; - } - - const btVector3& getHalfExtentsWithoutMargin() const - { - return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included - } - - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(),getMargin(),getMargin()); - halfExtents += margin; - - return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - - SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const - { - const btVector3& halfExtents = getHalfExtentsWithoutMargin(); - - return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const - { - const btVector3& halfExtents = getHalfExtentsWithoutMargin(); - - for (int i=0;i>1)) - halfExtents.y() * ((i&2)>>1), - halfExtents.z() * (1-((i&4)>>2)) - halfExtents.z() * ((i&4)>>2)); - } - - - virtual void getPlaneEquation(btVector4& plane,int i) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - switch (i) - { - case 0: - plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.),-halfExtents.x()); - break; - case 1: - plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.),-halfExtents.x()); - break; - case 2: - plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.),-halfExtents.y()); - break; - case 3: - plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.),-halfExtents.y()); - break; - case 4: - plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.),-halfExtents.z()); - break; - case 5: - plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.),-halfExtents.z()); - break; - default: - btAssert(0); - } - } - - - virtual void getEdge(int i,btVector3& pa,btVector3& pb) const - //virtual void getEdge(int i,Edge& edge) const - { - int edgeVert0 = 0; - int edgeVert1 = 0; - - switch (i) - { - case 0: - edgeVert0 = 0; - edgeVert1 = 1; - break; - case 1: - edgeVert0 = 0; - edgeVert1 = 2; - break; - case 2: - edgeVert0 = 1; - edgeVert1 = 3; - - break; - case 3: - edgeVert0 = 2; - edgeVert1 = 3; - break; - case 4: - edgeVert0 = 0; - edgeVert1 = 4; - break; - case 5: - edgeVert0 = 1; - edgeVert1 = 5; - - break; - case 6: - edgeVert0 = 2; - edgeVert1 = 6; - break; - case 7: - edgeVert0 = 3; - edgeVert1 = 7; - break; - case 8: - edgeVert0 = 4; - edgeVert1 = 5; - break; - case 9: - edgeVert0 = 4; - edgeVert1 = 6; - break; - case 10: - edgeVert0 = 5; - edgeVert1 = 7; - break; - case 11: - edgeVert0 = 6; - edgeVert1 = 7; - break; - default: - btAssert(0); - - } - - getVertex(edgeVert0,pa ); - getVertex(edgeVert1,pb ); - } - - - - - - virtual bool isInside(const btVector3& pt,btScalar tolerance) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - //btScalar minDist = 2*tolerance; - - bool result = (pt.x() <= (halfExtents.x()+tolerance)) && - (pt.x() >= (-halfExtents.x()-tolerance)) && - (pt.y() <= (halfExtents.y()+tolerance)) && - (pt.y() >= (-halfExtents.y()-tolerance)) && - (pt.z() <= (halfExtents.z()+tolerance)) && - (pt.z() >= (-halfExtents.z()-tolerance)); - - return result; - } - - - //debugging - virtual const char* getName()const - { - return "Box2d"; - } - - virtual int getNumPreferredPenetrationDirections() const - { - return 6; - } - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const - { - switch (index) - { - case 0: - penetrationVector.setValue(btScalar(1.),btScalar(0.),btScalar(0.)); - break; - case 1: - penetrationVector.setValue(btScalar(-1.),btScalar(0.),btScalar(0.)); - break; - case 2: - penetrationVector.setValue(btScalar(0.),btScalar(1.),btScalar(0.)); - break; - case 3: - penetrationVector.setValue(btScalar(0.),btScalar(-1.),btScalar(0.)); - break; - case 4: - penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(1.)); - break; - case 5: - penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(-1.)); - break; - default: - btAssert(0); - } - } - -}; - -#endif //OBB_BOX_2D_SHAPE_H - - +/* +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 OBB_BOX_2D_SHAPE_H +#define OBB_BOX_2D_SHAPE_H + +#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h" +#include "BulletCollision/CollisionShapes/btCollisionMargin.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btMinMax.h" + +///The btBox2dShape is a box primitive around the origin, its sides axis aligned with length specified by half extents, in local shape coordinates. When used as part of a btCollisionObject or btRigidBody it will be an oriented box in world space. +class btBox2dShape: public btPolyhedralConvexShape +{ + + //btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead + + btVector3 m_centroid; + btVector3 m_vertices[4]; + btVector3 m_normals[4]; + +public: + + btVector3 getHalfExtentsWithMargin() const + { + btVector3 halfExtents = getHalfExtentsWithoutMargin(); + btVector3 margin(getMargin(),getMargin(),getMargin()); + halfExtents += margin; + return halfExtents; + } + + const btVector3& getHalfExtentsWithoutMargin() const + { + return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included + } + + + virtual btVector3 localGetSupportingVertex(const btVector3& vec) const + { + btVector3 halfExtents = getHalfExtentsWithoutMargin(); + btVector3 margin(getMargin(),getMargin(),getMargin()); + halfExtents += margin; + + return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), + btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), + btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); + } + + SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const + { + const btVector3& halfExtents = getHalfExtentsWithoutMargin(); + + return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), + btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), + btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); + } + + virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const + { + const btVector3& halfExtents = getHalfExtentsWithoutMargin(); + + for (int i=0;i>1)) - halfExtents.y() * ((i&2)>>1), + halfExtents.z() * (1-((i&4)>>2)) - halfExtents.z() * ((i&4)>>2)); + } + + + virtual void getPlaneEquation(btVector4& plane,int i) const + { + btVector3 halfExtents = getHalfExtentsWithoutMargin(); + + switch (i) + { + case 0: + plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.),-halfExtents.x()); + break; + case 1: + plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.),-halfExtents.x()); + break; + case 2: + plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.),-halfExtents.y()); + break; + case 3: + plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.),-halfExtents.y()); + break; + case 4: + plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.),-halfExtents.z()); + break; + case 5: + plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.),-halfExtents.z()); + break; + default: + btAssert(0); + } + } + + + virtual void getEdge(int i,btVector3& pa,btVector3& pb) const + //virtual void getEdge(int i,Edge& edge) const + { + int edgeVert0 = 0; + int edgeVert1 = 0; + + switch (i) + { + case 0: + edgeVert0 = 0; + edgeVert1 = 1; + break; + case 1: + edgeVert0 = 0; + edgeVert1 = 2; + break; + case 2: + edgeVert0 = 1; + edgeVert1 = 3; + + break; + case 3: + edgeVert0 = 2; + edgeVert1 = 3; + break; + case 4: + edgeVert0 = 0; + edgeVert1 = 4; + break; + case 5: + edgeVert0 = 1; + edgeVert1 = 5; + + break; + case 6: + edgeVert0 = 2; + edgeVert1 = 6; + break; + case 7: + edgeVert0 = 3; + edgeVert1 = 7; + break; + case 8: + edgeVert0 = 4; + edgeVert1 = 5; + break; + case 9: + edgeVert0 = 4; + edgeVert1 = 6; + break; + case 10: + edgeVert0 = 5; + edgeVert1 = 7; + break; + case 11: + edgeVert0 = 6; + edgeVert1 = 7; + break; + default: + btAssert(0); + + } + + getVertex(edgeVert0,pa ); + getVertex(edgeVert1,pb ); + } + + + + + + virtual bool isInside(const btVector3& pt,btScalar tolerance) const + { + btVector3 halfExtents = getHalfExtentsWithoutMargin(); + + //btScalar minDist = 2*tolerance; + + bool result = (pt.x() <= (halfExtents.x()+tolerance)) && + (pt.x() >= (-halfExtents.x()-tolerance)) && + (pt.y() <= (halfExtents.y()+tolerance)) && + (pt.y() >= (-halfExtents.y()-tolerance)) && + (pt.z() <= (halfExtents.z()+tolerance)) && + (pt.z() >= (-halfExtents.z()-tolerance)); + + return result; + } + + + //debugging + virtual const char* getName()const + { + return "Box2d"; + } + + virtual int getNumPreferredPenetrationDirections() const + { + return 6; + } + + virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const + { + switch (index) + { + case 0: + penetrationVector.setValue(btScalar(1.),btScalar(0.),btScalar(0.)); + break; + case 1: + penetrationVector.setValue(btScalar(-1.),btScalar(0.),btScalar(0.)); + break; + case 2: + penetrationVector.setValue(btScalar(0.),btScalar(1.),btScalar(0.)); + break; + case 3: + penetrationVector.setValue(btScalar(0.),btScalar(-1.),btScalar(0.)); + break; + case 4: + penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(1.)); + break; + case 5: + penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(-1.)); + break; + default: + btAssert(0); + } + } + +}; + +#endif //OBB_BOX_2D_SHAPE_H + + diff --git a/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp b/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp index 1b8e3a670..10ea3e981 100644 --- a/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp +++ b/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp @@ -1,92 +1,92 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 "btConvex2dShape.h" - -btConvex2dShape::btConvex2dShape( btConvexShape* convexChildShape): -btConvexShape (), m_childConvexShape(convexChildShape) -{ - m_shapeType = CONVEX_2D_SHAPE_PROXYTYPE; -} - -btConvex2dShape::~btConvex2dShape() -{ -} - - - -btVector3 btConvex2dShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const -{ - return m_childConvexShape->localGetSupportingVertexWithoutMargin(vec); -} - -void btConvex2dShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const -{ - m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors,supportVerticesOut,numVectors); -} - - -btVector3 btConvex2dShape::localGetSupportingVertex(const btVector3& vec)const -{ - return m_childConvexShape->localGetSupportingVertex(vec); -} - - -void btConvex2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const -{ - ///this linear upscaling is not realistic, but we don't deal with large mass ratios... - m_childConvexShape->calculateLocalInertia(mass,inertia); -} - - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version -void btConvex2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const -{ - m_childConvexShape->getAabb(t,aabbMin,aabbMax); -} - -void btConvex2dShape::getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const -{ - m_childConvexShape->getAabbSlow(t,aabbMin,aabbMax); -} - -void btConvex2dShape::setLocalScaling(const btVector3& scaling) -{ - m_childConvexShape->setLocalScaling(scaling); -} - -const btVector3& btConvex2dShape::getLocalScaling() const -{ - return m_childConvexShape->getLocalScaling(); -} - -void btConvex2dShape::setMargin(btScalar margin) -{ - m_childConvexShape->setMargin(margin); -} -btScalar btConvex2dShape::getMargin() const -{ - return m_childConvexShape->getMargin(); -} - -int btConvex2dShape::getNumPreferredPenetrationDirections() const -{ - return m_childConvexShape->getNumPreferredPenetrationDirections(); -} - -void btConvex2dShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const -{ - m_childConvexShape->getPreferredPenetrationDirection(index,penetrationVector); -} +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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 "btConvex2dShape.h" + +btConvex2dShape::btConvex2dShape( btConvexShape* convexChildShape): +btConvexShape (), m_childConvexShape(convexChildShape) +{ + m_shapeType = CONVEX_2D_SHAPE_PROXYTYPE; +} + +btConvex2dShape::~btConvex2dShape() +{ +} + + + +btVector3 btConvex2dShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const +{ + return m_childConvexShape->localGetSupportingVertexWithoutMargin(vec); +} + +void btConvex2dShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const +{ + m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors,supportVerticesOut,numVectors); +} + + +btVector3 btConvex2dShape::localGetSupportingVertex(const btVector3& vec)const +{ + return m_childConvexShape->localGetSupportingVertex(vec); +} + + +void btConvex2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const +{ + ///this linear upscaling is not realistic, but we don't deal with large mass ratios... + m_childConvexShape->calculateLocalInertia(mass,inertia); +} + + + ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version +void btConvex2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const +{ + m_childConvexShape->getAabb(t,aabbMin,aabbMax); +} + +void btConvex2dShape::getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const +{ + m_childConvexShape->getAabbSlow(t,aabbMin,aabbMax); +} + +void btConvex2dShape::setLocalScaling(const btVector3& scaling) +{ + m_childConvexShape->setLocalScaling(scaling); +} + +const btVector3& btConvex2dShape::getLocalScaling() const +{ + return m_childConvexShape->getLocalScaling(); +} + +void btConvex2dShape::setMargin(btScalar margin) +{ + m_childConvexShape->setMargin(margin); +} +btScalar btConvex2dShape::getMargin() const +{ + return m_childConvexShape->getMargin(); +} + +int btConvex2dShape::getNumPreferredPenetrationDirections() const +{ + return m_childConvexShape->getNumPreferredPenetrationDirections(); +} + +void btConvex2dShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const +{ + m_childConvexShape->getPreferredPenetrationDirection(index,penetrationVector); +} diff --git a/src/BulletCollision/CollisionShapes/btConvex2dShape.h b/src/BulletCollision/CollisionShapes/btConvex2dShape.h index eb8fa8c46..58166c829 100644 --- a/src/BulletCollision/CollisionShapes/btConvex2dShape.h +++ b/src/BulletCollision/CollisionShapes/btConvex2dShape.h @@ -1,80 +1,80 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_2D_SHAPE_H -#define BT_CONVEX_2D_SHAPE_H - -#include "BulletCollision/CollisionShapes/btConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -///The btConvex2dShape allows to use arbitrary convex shapes are 2d convex shapes, with the Z component assumed to be 0. -///For 2d boxes, the btBox2dShape is recommended. -class btConvex2dShape : public btConvexShape -{ - btConvexShape* m_childConvexShape; - - public: - - btConvex2dShape( btConvexShape* convexChildShape); - - virtual ~btConvex2dShape(); - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const; - - virtual btVector3 localGetSupportingVertex(const btVector3& vec)const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const; - - virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; - - btConvexShape* getChildShape() - { - return m_childConvexShape; - } - - const btConvexShape* getChildShape() const - { - return m_childConvexShape; - } - - virtual const char* getName()const - { - return "Convex2dShape"; - } - - - - /////////////////////////// - - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; - - virtual void getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; - - virtual void setLocalScaling(const btVector3& scaling) ; - virtual const btVector3& getLocalScaling() const ; - - virtual void setMargin(btScalar margin); - virtual btScalar getMargin() const; - - virtual int getNumPreferredPenetrationDirections() const; - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const; - - -}; - -#endif //BT_CONVEX_2D_SHAPE_H +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + +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_CONVEX_2D_SHAPE_H +#define BT_CONVEX_2D_SHAPE_H + +#include "BulletCollision/CollisionShapes/btConvexShape.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types + +///The btConvex2dShape allows to use arbitrary convex shapes are 2d convex shapes, with the Z component assumed to be 0. +///For 2d boxes, the btBox2dShape is recommended. +class btConvex2dShape : public btConvexShape +{ + btConvexShape* m_childConvexShape; + + public: + + btConvex2dShape( btConvexShape* convexChildShape); + + virtual ~btConvex2dShape(); + + virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const; + + virtual btVector3 localGetSupportingVertex(const btVector3& vec)const; + + virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const; + + virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; + + btConvexShape* getChildShape() + { + return m_childConvexShape; + } + + const btConvexShape* getChildShape() const + { + return m_childConvexShape; + } + + virtual const char* getName()const + { + return "Convex2dShape"; + } + + + + /////////////////////////// + + + ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version + void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; + + virtual void getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; + + virtual void setLocalScaling(const btVector3& scaling) ; + virtual const btVector3& getLocalScaling() const ; + + virtual void setMargin(btScalar margin); + virtual btScalar getMargin() const; + + virtual int getNumPreferredPenetrationDirections() const; + + virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const; + + +}; + +#endif //BT_CONVEX_2D_SHAPE_H diff --git a/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h b/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h index f512a1aa4..282a7702e 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h +++ b/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h @@ -1,238 +1,238 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2010 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_INFO_MAP_H -#define _BT_TRIANGLE_INFO_MAP_H - - -#include "LinearMath/btHashMap.h" -#include "LinearMath/btSerializer.h" - - -///for btTriangleInfo m_flags -#define TRI_INFO_V0V1_CONVEX 1 -#define TRI_INFO_V1V2_CONVEX 2 -#define TRI_INFO_V2V0_CONVEX 4 - -#define TRI_INFO_V0V1_SWAP_NORMALB 8 -#define TRI_INFO_V1V2_SWAP_NORMALB 16 -#define TRI_INFO_V2V0_SWAP_NORMALB 32 - - -///The btTriangleInfo structure stores information to adjust collision normals to avoid collisions against internal edges -///it can be generated using -struct btTriangleInfo -{ - btTriangleInfo() - { - m_edgeV0V1Angle = SIMD_2_PI; - m_edgeV1V2Angle = SIMD_2_PI; - m_edgeV2V0Angle = SIMD_2_PI; - m_flags=0; - } - - int m_flags; - - btScalar m_edgeV0V1Angle; - btScalar m_edgeV1V2Angle; - btScalar m_edgeV2V0Angle; - -}; - -typedef btHashMap btInternalTriangleInfoMap; - - -///The btTriangleInfoMap stores edge angle information for some triangles. You can compute this information yourself or using btGenerateInternalEdgeInfo. -struct btTriangleInfoMap : public btInternalTriangleInfoMap -{ - btScalar m_convexEpsilon;///used to determine if an edge or contact normal is convex, using the dot product - btScalar m_planarEpsilon; ///used to determine if a triangle edge is planar with zero angle - btScalar m_equalVertexThreshold; ///used to compute connectivity: if the distance between two vertices is smaller than m_equalVertexThreshold, they are considered to be 'shared' - btScalar m_edgeDistanceThreshold; ///used to determine edge contacts: if the closest distance between a contact point and an edge is smaller than this distance threshold it is considered to "hit the edge" - btScalar m_zeroAreaThreshold; ///used to determine if a triangle is degenerate (length squared of cross product of 2 triangle edges < threshold) - - - btTriangleInfoMap() - { - m_convexEpsilon = 0.00f; - m_planarEpsilon = 0.0001f; - m_equalVertexThreshold = btScalar(0.0001)*btScalar(0.0001); - m_edgeDistanceThreshold = btScalar(0.1); - m_zeroAreaThreshold = btScalar(0.0001)*btScalar(0.0001); - } - virtual ~btTriangleInfoMap() {} - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - void deSerialize(struct btTriangleInfoMapData& data); - -}; - -struct btTriangleInfoData -{ - int m_flags; - float m_edgeV0V1Angle; - float m_edgeV1V2Angle; - float m_edgeV2V0Angle; -}; - -struct btTriangleInfoMapData -{ - int *m_hashTablePtr; - int *m_nextPtr; - btTriangleInfoData *m_valueArrayPtr; - int *m_keyArrayPtr; - - float m_convexEpsilon; - float m_planarEpsilon; - float m_equalVertexThreshold; - float m_edgeDistanceThreshold; - float m_zeroAreaThreshold; - - int m_nextSize; - int m_hashTableSize; - int m_numValues; - int m_numKeys; - char m_padding[4]; -}; - -SIMD_FORCE_INLINE int btTriangleInfoMap::calculateSerializeBufferSize() const -{ - return sizeof(btTriangleInfoMapData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btTriangleInfoMap::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btTriangleInfoMapData* tmapData = (btTriangleInfoMapData*) dataBuffer; - tmapData->m_convexEpsilon = m_convexEpsilon; - tmapData->m_planarEpsilon = m_planarEpsilon; - tmapData->m_equalVertexThreshold = m_equalVertexThreshold; - tmapData->m_edgeDistanceThreshold = m_edgeDistanceThreshold; - tmapData->m_zeroAreaThreshold = m_zeroAreaThreshold; - - tmapData->m_hashTableSize = m_hashTable.size(); - - tmapData->m_hashTablePtr = tmapData->m_hashTableSize ? (int*)serializer->getUniquePointer((void*)&m_hashTable[0]) : 0; - if (tmapData->m_hashTablePtr) - { - //serialize an int buffer - int sz = sizeof(int); - int numElem = tmapData->m_hashTableSize; - btChunk* chunk = serializer->allocate(sz,numElem); - int* memPtr = (int*)chunk->m_oldPtr; - for (int i=0;ifinalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_hashTable[0]); - - } - - tmapData->m_nextSize = m_next.size(); - tmapData->m_nextPtr = tmapData->m_nextSize? (int*)serializer->getUniquePointer((void*)&m_next[0]): 0; - if (tmapData->m_nextPtr) - { - int sz = sizeof(int); - int numElem = tmapData->m_nextSize; - btChunk* chunk = serializer->allocate(sz,numElem); - int* memPtr = (int*)chunk->m_oldPtr; - for (int i=0;ifinalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_next[0]); - } - - tmapData->m_numValues = m_valueArray.size(); - tmapData->m_valueArrayPtr = tmapData->m_numValues ? (btTriangleInfoData*)serializer->getUniquePointer((void*)&m_valueArray[0]): 0; - if (tmapData->m_valueArrayPtr) - { - int sz = sizeof(btTriangleInfoData); - int numElem = tmapData->m_numValues; - btChunk* chunk = serializer->allocate(sz,numElem); - btTriangleInfoData* memPtr = (btTriangleInfoData*)chunk->m_oldPtr; - for (int i=0;im_edgeV0V1Angle = m_valueArray[i].m_edgeV0V1Angle; - memPtr->m_edgeV1V2Angle = m_valueArray[i].m_edgeV1V2Angle; - memPtr->m_edgeV2V0Angle = m_valueArray[i].m_edgeV2V0Angle; - memPtr->m_flags = m_valueArray[i].m_flags; - } - serializer->finalizeChunk(chunk,"btTriangleInfoData",BT_ARRAY_CODE,(void*) &m_valueArray[0]); - } - - tmapData->m_numKeys = m_keyArray.size(); - tmapData->m_keyArrayPtr = tmapData->m_numKeys ? (int*)serializer->getUniquePointer((void*)&m_keyArray[0]) : 0; - if (tmapData->m_keyArrayPtr) - { - int sz = sizeof(int); - int numElem = tmapData->m_numValues; - btChunk* chunk = serializer->allocate(sz,numElem); - int* memPtr = (int*)chunk->m_oldPtr; - for (int i=0;ifinalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*) &m_keyArray[0]); - - } - return "btTriangleInfoMapData"; -} - - - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE void btTriangleInfoMap::deSerialize(btTriangleInfoMapData& tmapData ) -{ - - - m_convexEpsilon = tmapData.m_convexEpsilon; - m_planarEpsilon = tmapData.m_planarEpsilon; - m_equalVertexThreshold = tmapData.m_equalVertexThreshold; - m_edgeDistanceThreshold = tmapData.m_edgeDistanceThreshold; - m_zeroAreaThreshold = tmapData.m_zeroAreaThreshold; - m_hashTable.resize(tmapData.m_hashTableSize); - int i =0; - for (i=0;i btInternalTriangleInfoMap; + + +///The btTriangleInfoMap stores edge angle information for some triangles. You can compute this information yourself or using btGenerateInternalEdgeInfo. +struct btTriangleInfoMap : public btInternalTriangleInfoMap +{ + btScalar m_convexEpsilon;///used to determine if an edge or contact normal is convex, using the dot product + btScalar m_planarEpsilon; ///used to determine if a triangle edge is planar with zero angle + btScalar m_equalVertexThreshold; ///used to compute connectivity: if the distance between two vertices is smaller than m_equalVertexThreshold, they are considered to be 'shared' + btScalar m_edgeDistanceThreshold; ///used to determine edge contacts: if the closest distance between a contact point and an edge is smaller than this distance threshold it is considered to "hit the edge" + btScalar m_zeroAreaThreshold; ///used to determine if a triangle is degenerate (length squared of cross product of 2 triangle edges < threshold) + + + btTriangleInfoMap() + { + m_convexEpsilon = 0.00f; + m_planarEpsilon = 0.0001f; + m_equalVertexThreshold = btScalar(0.0001)*btScalar(0.0001); + m_edgeDistanceThreshold = btScalar(0.1); + m_zeroAreaThreshold = btScalar(0.0001)*btScalar(0.0001); + } + virtual ~btTriangleInfoMap() {} + + virtual int calculateSerializeBufferSize() const; + + ///fills the dataBuffer and returns the struct name (and 0 on failure) + virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; + + void deSerialize(struct btTriangleInfoMapData& data); + +}; + +struct btTriangleInfoData +{ + int m_flags; + float m_edgeV0V1Angle; + float m_edgeV1V2Angle; + float m_edgeV2V0Angle; +}; + +struct btTriangleInfoMapData +{ + int *m_hashTablePtr; + int *m_nextPtr; + btTriangleInfoData *m_valueArrayPtr; + int *m_keyArrayPtr; + + float m_convexEpsilon; + float m_planarEpsilon; + float m_equalVertexThreshold; + float m_edgeDistanceThreshold; + float m_zeroAreaThreshold; + + int m_nextSize; + int m_hashTableSize; + int m_numValues; + int m_numKeys; + char m_padding[4]; +}; + +SIMD_FORCE_INLINE int btTriangleInfoMap::calculateSerializeBufferSize() const +{ + return sizeof(btTriangleInfoMapData); +} + +///fills the dataBuffer and returns the struct name (and 0 on failure) +SIMD_FORCE_INLINE const char* btTriangleInfoMap::serialize(void* dataBuffer, btSerializer* serializer) const +{ + btTriangleInfoMapData* tmapData = (btTriangleInfoMapData*) dataBuffer; + tmapData->m_convexEpsilon = m_convexEpsilon; + tmapData->m_planarEpsilon = m_planarEpsilon; + tmapData->m_equalVertexThreshold = m_equalVertexThreshold; + tmapData->m_edgeDistanceThreshold = m_edgeDistanceThreshold; + tmapData->m_zeroAreaThreshold = m_zeroAreaThreshold; + + tmapData->m_hashTableSize = m_hashTable.size(); + + tmapData->m_hashTablePtr = tmapData->m_hashTableSize ? (int*)serializer->getUniquePointer((void*)&m_hashTable[0]) : 0; + if (tmapData->m_hashTablePtr) + { + //serialize an int buffer + int sz = sizeof(int); + int numElem = tmapData->m_hashTableSize; + btChunk* chunk = serializer->allocate(sz,numElem); + int* memPtr = (int*)chunk->m_oldPtr; + for (int i=0;ifinalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_hashTable[0]); + + } + + tmapData->m_nextSize = m_next.size(); + tmapData->m_nextPtr = tmapData->m_nextSize? (int*)serializer->getUniquePointer((void*)&m_next[0]): 0; + if (tmapData->m_nextPtr) + { + int sz = sizeof(int); + int numElem = tmapData->m_nextSize; + btChunk* chunk = serializer->allocate(sz,numElem); + int* memPtr = (int*)chunk->m_oldPtr; + for (int i=0;ifinalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_next[0]); + } + + tmapData->m_numValues = m_valueArray.size(); + tmapData->m_valueArrayPtr = tmapData->m_numValues ? (btTriangleInfoData*)serializer->getUniquePointer((void*)&m_valueArray[0]): 0; + if (tmapData->m_valueArrayPtr) + { + int sz = sizeof(btTriangleInfoData); + int numElem = tmapData->m_numValues; + btChunk* chunk = serializer->allocate(sz,numElem); + btTriangleInfoData* memPtr = (btTriangleInfoData*)chunk->m_oldPtr; + for (int i=0;im_edgeV0V1Angle = m_valueArray[i].m_edgeV0V1Angle; + memPtr->m_edgeV1V2Angle = m_valueArray[i].m_edgeV1V2Angle; + memPtr->m_edgeV2V0Angle = m_valueArray[i].m_edgeV2V0Angle; + memPtr->m_flags = m_valueArray[i].m_flags; + } + serializer->finalizeChunk(chunk,"btTriangleInfoData",BT_ARRAY_CODE,(void*) &m_valueArray[0]); + } + + tmapData->m_numKeys = m_keyArray.size(); + tmapData->m_keyArrayPtr = tmapData->m_numKeys ? (int*)serializer->getUniquePointer((void*)&m_keyArray[0]) : 0; + if (tmapData->m_keyArrayPtr) + { + int sz = sizeof(int); + int numElem = tmapData->m_numValues; + btChunk* chunk = serializer->allocate(sz,numElem); + int* memPtr = (int*)chunk->m_oldPtr; + for (int i=0;ifinalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*) &m_keyArray[0]); + + } + return "btTriangleInfoMapData"; +} + + + +///fills the dataBuffer and returns the struct name (and 0 on failure) +SIMD_FORCE_INLINE void btTriangleInfoMap::deSerialize(btTriangleInfoMapData& tmapData ) +{ + + + m_convexEpsilon = tmapData.m_convexEpsilon; + m_planarEpsilon = tmapData.m_planarEpsilon; + m_equalVertexThreshold = tmapData.m_equalVertexThreshold; + m_edgeDistanceThreshold = tmapData.m_edgeDistanceThreshold; + m_zeroAreaThreshold = tmapData.m_zeroAreaThreshold; + m_hashTable.resize(tmapData.m_hashTableSize); + int i =0; + for (i=0;i= 0) && (index < 6)); - m_springEnabled[index] = onOff; - if(index < 3) - { - m_linearLimits.m_enableMotor[index] = onOff; - } - else - { - m_angularLimits[index - 3].m_enableMotor = onOff; - } -} - - - -void btGeneric6DofSpringConstraint::setStiffness(int index, btScalar stiffness) -{ - btAssert((index >= 0) && (index < 6)); - m_springStiffness[index] = stiffness; -} - - -void btGeneric6DofSpringConstraint::setDamping(int index, btScalar damping) -{ - btAssert((index >= 0) && (index < 6)); - m_springDamping[index] = damping; -} - - -void btGeneric6DofSpringConstraint::setEquilibriumPoint() -{ - calculateTransforms(); - int i; - - for( i = 0; i < 3; i++) - { - m_equilibriumPoint[i] = m_calculatedLinearDiff[i]; - } - for(i = 0; i < 3; i++) - { - m_equilibriumPoint[i + 3] = m_calculatedAxisAngleDiff[i]; - } -} - - - -void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index) -{ - btAssert((index >= 0) && (index < 6)); - calculateTransforms(); - if(index < 3) - { - m_equilibriumPoint[index] = m_calculatedLinearDiff[index]; - } - else - { - m_equilibriumPoint[index] = m_calculatedAxisAngleDiff[index - 3]; - } -} - -void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index, btScalar val) -{ - btAssert((index >= 0) && (index < 6)); - m_equilibriumPoint[index] = val; -} - - -void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info) -{ - // it is assumed that calculateTransforms() have been called before this call - int i; - btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity(); - for(i = 0; i < 3; i++) - { - if(m_springEnabled[i]) - { - // get current position of constraint - btScalar currPos = m_calculatedLinearDiff[i]; - // calculate difference - btScalar delta = currPos - m_equilibriumPoint[i]; - // spring force is (delta * m_stiffness) according to Hooke's Law - btScalar force = delta * m_springStiffness[i]; - btScalar velFactor = info->fps * m_springDamping[i] / btScalar(info->m_numIterations); - m_linearLimits.m_targetVelocity[i] = velFactor * force; - m_linearLimits.m_maxMotorForce[i] = btFabs(force) / info->fps; - } - } - for(i = 0; i < 3; i++) - { - if(m_springEnabled[i + 3]) - { - // get current position of constraint - btScalar currPos = m_calculatedAxisAngleDiff[i]; - // calculate difference - btScalar delta = currPos - m_equilibriumPoint[i+3]; - // spring force is (-delta * m_stiffness) according to Hooke's Law - btScalar force = -delta * m_springStiffness[i+3]; - btScalar velFactor = info->fps * m_springDamping[i+3] / btScalar(info->m_numIterations); - m_angularLimits[i].m_targetVelocity = velFactor * force; - m_angularLimits[i].m_maxMotorForce = btFabs(force) / info->fps; - } - } -} - - -void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info) -{ - // this will be called by constraint solver at the constraint setup stage - // set current motor parameters - internalUpdateSprings(info); - // do the rest of job for constraint setup - btGeneric6DofConstraint::getInfo2(info); -} - - - - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "btGeneric6DofSpringConstraint.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "LinearMath/btTransformUtil.h" + + +btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) + : btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA) +{ + for(int i = 0; i < 6; i++) + { + m_springEnabled[i] = false; + m_equilibriumPoint[i] = btScalar(0.f); + m_springStiffness[i] = btScalar(0.f); + m_springDamping[i] = btScalar(1.f); + } +} + + +void btGeneric6DofSpringConstraint::enableSpring(int index, bool onOff) +{ + btAssert((index >= 0) && (index < 6)); + m_springEnabled[index] = onOff; + if(index < 3) + { + m_linearLimits.m_enableMotor[index] = onOff; + } + else + { + m_angularLimits[index - 3].m_enableMotor = onOff; + } +} + + + +void btGeneric6DofSpringConstraint::setStiffness(int index, btScalar stiffness) +{ + btAssert((index >= 0) && (index < 6)); + m_springStiffness[index] = stiffness; +} + + +void btGeneric6DofSpringConstraint::setDamping(int index, btScalar damping) +{ + btAssert((index >= 0) && (index < 6)); + m_springDamping[index] = damping; +} + + +void btGeneric6DofSpringConstraint::setEquilibriumPoint() +{ + calculateTransforms(); + int i; + + for( i = 0; i < 3; i++) + { + m_equilibriumPoint[i] = m_calculatedLinearDiff[i]; + } + for(i = 0; i < 3; i++) + { + m_equilibriumPoint[i + 3] = m_calculatedAxisAngleDiff[i]; + } +} + + + +void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index) +{ + btAssert((index >= 0) && (index < 6)); + calculateTransforms(); + if(index < 3) + { + m_equilibriumPoint[index] = m_calculatedLinearDiff[index]; + } + else + { + m_equilibriumPoint[index] = m_calculatedAxisAngleDiff[index - 3]; + } +} + +void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index, btScalar val) +{ + btAssert((index >= 0) && (index < 6)); + m_equilibriumPoint[index] = val; +} + + +void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info) +{ + // it is assumed that calculateTransforms() have been called before this call + int i; + btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity(); + for(i = 0; i < 3; i++) + { + if(m_springEnabled[i]) + { + // get current position of constraint + btScalar currPos = m_calculatedLinearDiff[i]; + // calculate difference + btScalar delta = currPos - m_equilibriumPoint[i]; + // spring force is (delta * m_stiffness) according to Hooke's Law + btScalar force = delta * m_springStiffness[i]; + btScalar velFactor = info->fps * m_springDamping[i] / btScalar(info->m_numIterations); + m_linearLimits.m_targetVelocity[i] = velFactor * force; + m_linearLimits.m_maxMotorForce[i] = btFabs(force) / info->fps; + } + } + for(i = 0; i < 3; i++) + { + if(m_springEnabled[i + 3]) + { + // get current position of constraint + btScalar currPos = m_calculatedAxisAngleDiff[i]; + // calculate difference + btScalar delta = currPos - m_equilibriumPoint[i+3]; + // spring force is (-delta * m_stiffness) according to Hooke's Law + btScalar force = -delta * m_springStiffness[i+3]; + btScalar velFactor = info->fps * m_springDamping[i+3] / btScalar(info->m_numIterations); + m_angularLimits[i].m_targetVelocity = velFactor * force; + m_angularLimits[i].m_maxMotorForce = btFabs(force) / info->fps; + } + } +} + + +void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info) +{ + // this will be called by constraint solver at the constraint setup stage + // set current motor parameters + internalUpdateSprings(info); + // do the rest of job for constraint setup + btGeneric6DofConstraint::getInfo2(info); +} + + + + diff --git a/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h b/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h index 4e723179c..3152a8d0e 100644 --- a/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h +++ b/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h @@ -1,55 +1,55 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 GENERIC_6DOF_SPRING_CONSTRAINT_H -#define GENERIC_6DOF_SPRING_CONSTRAINT_H - - -#include "LinearMath/btVector3.h" -#include "btTypedConstraint.h" -#include "btGeneric6DofConstraint.h" - - -/// Generic 6 DOF constraint that allows to set spring motors to any translational and rotational DOF - -/// DOF index used in enableSpring() and setStiffness() means: -/// 0 : translation X -/// 1 : translation Y -/// 2 : translation Z -/// 3 : rotation X (3rd Euler rotational around new position of X axis, range [-PI+epsilon, PI-epsilon] ) -/// 4 : rotation Y (2nd Euler rotational around new position of Y axis, range [-PI/2+epsilon, PI/2-epsilon] ) -/// 5 : rotation Z (1st Euler rotational around Z axis, range [-PI+epsilon, PI-epsilon] ) - -class btGeneric6DofSpringConstraint : public btGeneric6DofConstraint -{ -protected: - bool m_springEnabled[6]; - btScalar m_equilibriumPoint[6]; - btScalar m_springStiffness[6]; - btScalar m_springDamping[6]; // between 0 and 1 (1 == no damping) - void internalUpdateSprings(btConstraintInfo2* info); -public: - btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); - void enableSpring(int index, bool onOff); - void setStiffness(int index, btScalar stiffness); - void setDamping(int index, btScalar damping); - void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF - void setEquilibriumPoint(int index); // set the current constraint position/orientation as an equilibrium point for given DOF - void setEquilibriumPoint(int index, btScalar val); - virtual void getInfo2 (btConstraintInfo2* info); -}; - -#endif // GENERIC_6DOF_SPRING_CONSTRAINT_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 GENERIC_6DOF_SPRING_CONSTRAINT_H +#define GENERIC_6DOF_SPRING_CONSTRAINT_H + + +#include "LinearMath/btVector3.h" +#include "btTypedConstraint.h" +#include "btGeneric6DofConstraint.h" + + +/// Generic 6 DOF constraint that allows to set spring motors to any translational and rotational DOF + +/// DOF index used in enableSpring() and setStiffness() means: +/// 0 : translation X +/// 1 : translation Y +/// 2 : translation Z +/// 3 : rotation X (3rd Euler rotational around new position of X axis, range [-PI+epsilon, PI-epsilon] ) +/// 4 : rotation Y (2nd Euler rotational around new position of Y axis, range [-PI/2+epsilon, PI/2-epsilon] ) +/// 5 : rotation Z (1st Euler rotational around Z axis, range [-PI+epsilon, PI-epsilon] ) + +class btGeneric6DofSpringConstraint : public btGeneric6DofConstraint +{ +protected: + bool m_springEnabled[6]; + btScalar m_equilibriumPoint[6]; + btScalar m_springStiffness[6]; + btScalar m_springDamping[6]; // between 0 and 1 (1 == no damping) + void internalUpdateSprings(btConstraintInfo2* info); +public: + btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); + void enableSpring(int index, bool onOff); + void setStiffness(int index, btScalar stiffness); + void setDamping(int index, btScalar damping); + void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF + void setEquilibriumPoint(int index); // set the current constraint position/orientation as an equilibrium point for given DOF + void setEquilibriumPoint(int index, btScalar val); + virtual void getInfo2 (btConstraintInfo2* info); +}; + +#endif // GENERIC_6DOF_SPRING_CONSTRAINT_H + diff --git a/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp b/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp index 4d9244134..29123d526 100644 --- a/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp +++ b/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp @@ -1,66 +1,66 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "btHinge2Constraint.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "LinearMath/btTransformUtil.h" - - - -// constructor -// anchor, axis1 and axis2 are in world coordinate system -// axis1 must be orthogonal to axis2 -btHinge2Constraint::btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2) -: btGeneric6DofSpringConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true), - m_anchor(anchor), - m_axis1(axis1), - m_axis2(axis2) -{ - // build frame basis - // 6DOF constraint uses Euler angles and to define limits - // it is assumed that rotational order is : - // Z - first, allowed limits are (-PI,PI); - // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number - // used to prevent constraint from instability on poles; - // new position of X, allowed limits are (-PI,PI); - // So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs - // Build the frame in world coordinate system first - btVector3 zAxis = axis1.normalize(); - btVector3 xAxis = axis2.normalize(); - btVector3 yAxis = zAxis.cross(xAxis); // we want right coordinate system - btTransform frameInW; - frameInW.setIdentity(); - frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0], - xAxis[1], yAxis[1], zAxis[1], - xAxis[2], yAxis[2], zAxis[2]); - frameInW.setOrigin(anchor); - // now get constraint frame in local coordinate systems - m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW; - m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW; - // sei limits - setLinearLowerLimit(btVector3(0.f, 0.f, -1.f)); - setLinearUpperLimit(btVector3(0.f, 0.f, 1.f)); - // like front wheels of a car - setAngularLowerLimit(btVector3(1.f, 0.f, -SIMD_HALF_PI * 0.5f)); - setAngularUpperLimit(btVector3(-1.f, 0.f, SIMD_HALF_PI * 0.5f)); - // enable suspension - enableSpring(2, true); - setStiffness(2, SIMD_PI * SIMD_PI * 4.f); // period 1 sec for 1 kilogramm weel :-) - setDamping(2, 0.01f); - setEquilibriumPoint(); -} - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "btHinge2Constraint.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "LinearMath/btTransformUtil.h" + + + +// constructor +// anchor, axis1 and axis2 are in world coordinate system +// axis1 must be orthogonal to axis2 +btHinge2Constraint::btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2) +: btGeneric6DofSpringConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true), + m_anchor(anchor), + m_axis1(axis1), + m_axis2(axis2) +{ + // build frame basis + // 6DOF constraint uses Euler angles and to define limits + // it is assumed that rotational order is : + // Z - first, allowed limits are (-PI,PI); + // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number + // used to prevent constraint from instability on poles; + // new position of X, allowed limits are (-PI,PI); + // So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs + // Build the frame in world coordinate system first + btVector3 zAxis = axis1.normalize(); + btVector3 xAxis = axis2.normalize(); + btVector3 yAxis = zAxis.cross(xAxis); // we want right coordinate system + btTransform frameInW; + frameInW.setIdentity(); + frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0], + xAxis[1], yAxis[1], zAxis[1], + xAxis[2], yAxis[2], zAxis[2]); + frameInW.setOrigin(anchor); + // now get constraint frame in local coordinate systems + m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW; + m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW; + // sei limits + setLinearLowerLimit(btVector3(0.f, 0.f, -1.f)); + setLinearUpperLimit(btVector3(0.f, 0.f, 1.f)); + // like front wheels of a car + setAngularLowerLimit(btVector3(1.f, 0.f, -SIMD_HALF_PI * 0.5f)); + setAngularUpperLimit(btVector3(-1.f, 0.f, SIMD_HALF_PI * 0.5f)); + // enable suspension + enableSpring(2, true); + setStiffness(2, SIMD_PI * SIMD_PI * 4.f); // period 1 sec for 1 kilogramm weel :-) + setDamping(2, 0.01f); + setEquilibriumPoint(); +} + diff --git a/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h b/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h index b589687d7..15fd4a014 100644 --- a/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h +++ b/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h @@ -1,58 +1,58 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 HINGE2_CONSTRAINT_H -#define HINGE2_CONSTRAINT_H - - - -#include "LinearMath/btVector3.h" -#include "btTypedConstraint.h" -#include "btGeneric6DofSpringConstraint.h" - - - -// Constraint similar to ODE Hinge2 Joint -// has 3 degrees of frredom: -// 2 rotational degrees of freedom, similar to Euler rotations around Z (axis 1) and X (axis 2) -// 1 translational (along axis Z) with suspension spring - -class btHinge2Constraint : public btGeneric6DofSpringConstraint -{ -protected: - btVector3 m_anchor; - btVector3 m_axis1; - btVector3 m_axis2; -public: - // constructor - // anchor, axis1 and axis2 are in world coordinate system - // axis1 must be orthogonal to axis2 - btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2); - // access - const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); } - const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); } - const btVector3& getAxis1() { return m_axis1; } - const btVector3& getAxis2() { return m_axis2; } - btScalar getAngle1() { return getAngle(2); } - btScalar getAngle2() { return getAngle(0); } - // limits - void setUpperLimit(btScalar ang1max) { setAngularUpperLimit(btVector3(-1.f, 0.f, ang1max)); } - void setLowerLimit(btScalar ang1min) { setAngularLowerLimit(btVector3( 1.f, 0.f, ang1min)); } -}; - - - -#endif // HINGE2_CONSTRAINT_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 HINGE2_CONSTRAINT_H +#define HINGE2_CONSTRAINT_H + + + +#include "LinearMath/btVector3.h" +#include "btTypedConstraint.h" +#include "btGeneric6DofSpringConstraint.h" + + + +// Constraint similar to ODE Hinge2 Joint +// has 3 degrees of frredom: +// 2 rotational degrees of freedom, similar to Euler rotations around Z (axis 1) and X (axis 2) +// 1 translational (along axis Z) with suspension spring + +class btHinge2Constraint : public btGeneric6DofSpringConstraint +{ +protected: + btVector3 m_anchor; + btVector3 m_axis1; + btVector3 m_axis2; +public: + // constructor + // anchor, axis1 and axis2 are in world coordinate system + // axis1 must be orthogonal to axis2 + btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2); + // access + const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); } + const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); } + const btVector3& getAxis1() { return m_axis1; } + const btVector3& getAxis2() { return m_axis2; } + btScalar getAngle1() { return getAngle(2); } + btScalar getAngle2() { return getAngle(0); } + // limits + void setUpperLimit(btScalar ang1max) { setAngularUpperLimit(btVector3(-1.f, 0.f, ang1max)); } + void setLowerLimit(btScalar ang1min) { setAngularLowerLimit(btVector3( 1.f, 0.f, ang1min)); } +}; + + + +#endif // HINGE2_CONSTRAINT_H + diff --git a/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp b/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp index 564e5cbfb..3a4c2afa6 100644 --- a/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp +++ b/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp @@ -1,63 +1,63 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 "btUniversalConstraint.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "LinearMath/btTransformUtil.h" - - - -#define UNIV_EPS btScalar(0.01f) - - -// constructor -// anchor, axis1 and axis2 are in world coordinate system -// axis1 must be orthogonal to axis2 -btUniversalConstraint::btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2) -: btGeneric6DofConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true), - m_anchor(anchor), - m_axis1(axis1), - m_axis2(axis2) -{ - // build frame basis - // 6DOF constraint uses Euler angles and to define limits - // it is assumed that rotational order is : - // Z - first, allowed limits are (-PI,PI); - // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number - // used to prevent constraint from instability on poles; - // new position of X, allowed limits are (-PI,PI); - // So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs - // Build the frame in world coordinate system first - btVector3 zAxis = axis1.normalize(); - btVector3 yAxis = axis2.normalize(); - btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system - btTransform frameInW; - frameInW.setIdentity(); - frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0], - xAxis[1], yAxis[1], zAxis[1], - xAxis[2], yAxis[2], zAxis[2]); - frameInW.setOrigin(anchor); - // now get constraint frame in local coordinate systems - m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW; - m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW; - // sei limits - setLinearLowerLimit(btVector3(0., 0., 0.)); - setLinearUpperLimit(btVector3(0., 0., 0.)); - setAngularLowerLimit(btVector3(0.f, -SIMD_HALF_PI + UNIV_EPS, -SIMD_PI + UNIV_EPS)); - setAngularUpperLimit(btVector3(0.f, SIMD_HALF_PI - UNIV_EPS, SIMD_PI - UNIV_EPS)); -} - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 "btUniversalConstraint.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "LinearMath/btTransformUtil.h" + + + +#define UNIV_EPS btScalar(0.01f) + + +// constructor +// anchor, axis1 and axis2 are in world coordinate system +// axis1 must be orthogonal to axis2 +btUniversalConstraint::btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2) +: btGeneric6DofConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true), + m_anchor(anchor), + m_axis1(axis1), + m_axis2(axis2) +{ + // build frame basis + // 6DOF constraint uses Euler angles and to define limits + // it is assumed that rotational order is : + // Z - first, allowed limits are (-PI,PI); + // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number + // used to prevent constraint from instability on poles; + // new position of X, allowed limits are (-PI,PI); + // So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs + // Build the frame in world coordinate system first + btVector3 zAxis = axis1.normalize(); + btVector3 yAxis = axis2.normalize(); + btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system + btTransform frameInW; + frameInW.setIdentity(); + frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0], + xAxis[1], yAxis[1], zAxis[1], + xAxis[2], yAxis[2], zAxis[2]); + frameInW.setOrigin(anchor); + // now get constraint frame in local coordinate systems + m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW; + m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW; + // sei limits + setLinearLowerLimit(btVector3(0., 0., 0.)); + setLinearUpperLimit(btVector3(0., 0., 0.)); + setAngularLowerLimit(btVector3(0.f, -SIMD_HALF_PI + UNIV_EPS, -SIMD_PI + UNIV_EPS)); + setAngularUpperLimit(btVector3(0.f, SIMD_HALF_PI - UNIV_EPS, SIMD_PI - UNIV_EPS)); +} + diff --git a/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h b/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h index fdde703f7..4e64a7d7e 100644 --- a/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h +++ b/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h @@ -1,60 +1,60 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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 UNIVERSAL_CONSTRAINT_H -#define UNIVERSAL_CONSTRAINT_H - - - -#include "LinearMath/btVector3.h" -#include "btTypedConstraint.h" -#include "btGeneric6DofConstraint.h" - - - -/// Constraint similar to ODE Universal Joint -/// has 2 rotatioonal degrees of freedom, similar to Euler rotations around Z (axis 1) -/// and Y (axis 2) -/// Description from ODE manual : -/// "Given axis 1 on body 1, and axis 2 on body 2 that is perpendicular to axis 1, it keeps them perpendicular. -/// In other words, rotation of the two bodies about the direction perpendicular to the two axes will be equal." - -class btUniversalConstraint : public btGeneric6DofConstraint -{ -protected: - btVector3 m_anchor; - btVector3 m_axis1; - btVector3 m_axis2; -public: - // constructor - // anchor, axis1 and axis2 are in world coordinate system - // axis1 must be orthogonal to axis2 - btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2); - // access - const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); } - const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); } - const btVector3& getAxis1() { return m_axis1; } - const btVector3& getAxis2() { return m_axis2; } - btScalar getAngle1() { return getAngle(2); } - btScalar getAngle2() { return getAngle(1); } - // limits - void setUpperLimit(btScalar ang1max, btScalar ang2max) { setAngularUpperLimit(btVector3(0.f, ang1max, ang2max)); } - void setLowerLimit(btScalar ang1min, btScalar ang2min) { setAngularLowerLimit(btVector3(0.f, ang1min, ang2min)); } -}; - - - -#endif // UNIVERSAL_CONSTRAINT_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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 UNIVERSAL_CONSTRAINT_H +#define UNIVERSAL_CONSTRAINT_H + + + +#include "LinearMath/btVector3.h" +#include "btTypedConstraint.h" +#include "btGeneric6DofConstraint.h" + + + +/// Constraint similar to ODE Universal Joint +/// has 2 rotatioonal degrees of freedom, similar to Euler rotations around Z (axis 1) +/// and Y (axis 2) +/// Description from ODE manual : +/// "Given axis 1 on body 1, and axis 2 on body 2 that is perpendicular to axis 1, it keeps them perpendicular. +/// In other words, rotation of the two bodies about the direction perpendicular to the two axes will be equal." + +class btUniversalConstraint : public btGeneric6DofConstraint +{ +protected: + btVector3 m_anchor; + btVector3 m_axis1; + btVector3 m_axis2; +public: + // constructor + // anchor, axis1 and axis2 are in world coordinate system + // axis1 must be orthogonal to axis2 + btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2); + // access + const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); } + const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); } + const btVector3& getAxis1() { return m_axis1; } + const btVector3& getAxis2() { return m_axis2; } + btScalar getAngle1() { return getAngle(2); } + btScalar getAngle2() { return getAngle(1); } + // limits + void setUpperLimit(btScalar ang1max, btScalar ang2max) { setAngularUpperLimit(btVector3(0.f, ang1max, ang2max)); } + void setLowerLimit(btScalar ang1min, btScalar ang2min) { setAngularLowerLimit(btVector3(0.f, ang1min, ang2min)); } +}; + + + +#endif // UNIVERSAL_CONSTRAINT_H + diff --git a/src/BulletDynamics/Dynamics/btActionInterface.h b/src/BulletDynamics/Dynamics/btActionInterface.h index 1b4461349..40a07c6ea 100644 --- a/src/BulletDynamics/Dynamics/btActionInterface.h +++ b/src/BulletDynamics/Dynamics/btActionInterface.h @@ -1,50 +1,50 @@ -/* -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_ACTION_INTERFACE_H -#define _BT_ACTION_INTERFACE_H - -class btIDebugDraw; -class btCollisionWorld; - -#include "LinearMath/btScalar.h" -#include "btRigidBody.h" - -///Basic interface to allow actions such as vehicles and characters to be updated inside a btDynamicsWorld -class btActionInterface -{ -protected: - - static btRigidBody& getFixedBody() - { - static btRigidBody s_fixed(0, 0,0); - s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.))); - return s_fixed; - } - -public: - - virtual ~btActionInterface() - { - } - - virtual void updateAction( btCollisionWorld* collisionWorld, btScalar deltaTimeStep)=0; - - virtual void debugDraw(btIDebugDraw* debugDrawer) = 0; - -}; - -#endif //_BT_ACTION_INTERFACE_H - +/* +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_ACTION_INTERFACE_H +#define _BT_ACTION_INTERFACE_H + +class btIDebugDraw; +class btCollisionWorld; + +#include "LinearMath/btScalar.h" +#include "btRigidBody.h" + +///Basic interface to allow actions such as vehicles and characters to be updated inside a btDynamicsWorld +class btActionInterface +{ +protected: + + static btRigidBody& getFixedBody() + { + static btRigidBody s_fixed(0, 0,0); + s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.))); + return s_fixed; + } + +public: + + virtual ~btActionInterface() + { + } + + virtual void updateAction( btCollisionWorld* collisionWorld, btScalar deltaTimeStep)=0; + + virtual void debugDraw(btIDebugDraw* debugDrawer) = 0; + +}; + +#endif //_BT_ACTION_INTERFACE_H + diff --git a/src/BulletDynamics/Vehicle/btRaycastVehicle.h b/src/BulletDynamics/Vehicle/btRaycastVehicle.h index f980c6137..5ce80f4d2 100644 --- a/src/BulletDynamics/Vehicle/btRaycastVehicle.h +++ b/src/BulletDynamics/Vehicle/btRaycastVehicle.h @@ -1,236 +1,236 @@ -/* - * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/ - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies. - * Erwin Coumans makes no representations about the suitability - * of this software for any purpose. - * It is provided "as is" without express or implied warranty. -*/ -#ifndef RAYCASTVEHICLE_H -#define RAYCASTVEHICLE_H - -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" -#include "btVehicleRaycaster.h" -class btDynamicsWorld; -#include "LinearMath/btAlignedObjectArray.h" -#include "btWheelInfo.h" -#include "BulletDynamics/Dynamics/btActionInterface.h" - -class btVehicleTuning; - -///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle. -class btRaycastVehicle : public btActionInterface -{ - - btAlignedObjectArray m_forwardWS; - btAlignedObjectArray m_axle; - btAlignedObjectArray m_forwardImpulse; - btAlignedObjectArray m_sideImpulse; - - ///backwards compatibility - int m_userConstraintType; - int m_userConstraintId; - -public: - class btVehicleTuning - { - public: - - btVehicleTuning() - :m_suspensionStiffness(btScalar(5.88)), - m_suspensionCompression(btScalar(0.83)), - m_suspensionDamping(btScalar(0.88)), - m_maxSuspensionTravelCm(btScalar(500.)), - m_frictionSlip(btScalar(10.5)), - m_maxSuspensionForce(btScalar(6000.)) - { - } - btScalar m_suspensionStiffness; - btScalar m_suspensionCompression; - btScalar m_suspensionDamping; - btScalar m_maxSuspensionTravelCm; - btScalar m_frictionSlip; - btScalar m_maxSuspensionForce; - - }; -private: - - btScalar m_tau; - btScalar m_damping; - btVehicleRaycaster* m_vehicleRaycaster; - btScalar m_pitchControl; - btScalar m_steeringValue; - btScalar m_currentVehicleSpeedKmHour; - - btRigidBody* m_chassisBody; - - int m_indexRightAxis; - int m_indexUpAxis; - int m_indexForwardAxis; - - void defaultInit(const btVehicleTuning& tuning); - -public: - - //constructor to create a car from an existing rigidbody - btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster ); - - virtual ~btRaycastVehicle() ; - - - ///btActionInterface interface - virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step) - { - (void) collisionWorld; - updateVehicle(step); - } - - - ///btActionInterface interface - void debugDraw(btIDebugDraw* debugDrawer); - - const btTransform& getChassisWorldTransform() const; - - btScalar rayCast(btWheelInfo& wheel); - - virtual void updateVehicle(btScalar step); - - - void resetSuspension(); - - btScalar getSteeringValue(int wheel) const; - - void setSteeringValue(btScalar steering,int wheel); - - - void applyEngineForce(btScalar force, int wheel); - - const btTransform& getWheelTransformWS( int wheelIndex ) const; - - void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true ); - - void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth); - - btWheelInfo& addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel); - - inline int getNumWheels() const { - return int (m_wheelInfo.size()); - } - - btAlignedObjectArray m_wheelInfo; - - - const btWheelInfo& getWheelInfo(int index) const; - - btWheelInfo& getWheelInfo(int index); - - void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true); - - - void setBrake(btScalar brake,int wheelIndex); - - void setPitchControl(btScalar pitch) - { - m_pitchControl = pitch; - } - - void updateSuspension(btScalar deltaTime); - - virtual void updateFriction(btScalar timeStep); - - - - inline btRigidBody* getRigidBody() - { - return m_chassisBody; - } - - const btRigidBody* getRigidBody() const - { - return m_chassisBody; - } - - inline int getRightAxis() const - { - return m_indexRightAxis; - } - inline int getUpAxis() const - { - return m_indexUpAxis; - } - - inline int getForwardAxis() const - { - return m_indexForwardAxis; - } - - - ///Worldspace forward vector - btVector3 getForwardVector() const - { - const btTransform& chassisTrans = getChassisWorldTransform(); - - btVector3 forwardW ( - chassisTrans.getBasis()[0][m_indexForwardAxis], - chassisTrans.getBasis()[1][m_indexForwardAxis], - chassisTrans.getBasis()[2][m_indexForwardAxis]); - - return forwardW; - } - - ///Velocity of vehicle (positive if velocity vector has same direction as foward vector) - btScalar getCurrentSpeedKmHour() const - { - return m_currentVehicleSpeedKmHour; - } - - virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex) - { - m_indexRightAxis = rightIndex; - m_indexUpAxis = upIndex; - m_indexForwardAxis = forwardIndex; - } - - - ///backwards compatibility - int getUserConstraintType() const - { - return m_userConstraintType ; - } - - void setUserConstraintType(int userConstraintType) - { - m_userConstraintType = userConstraintType; - }; - - void setUserConstraintId(int uid) - { - m_userConstraintId = uid; - } - - int getUserConstraintId() const - { - return m_userConstraintId; - } - -}; - -class btDefaultVehicleRaycaster : public btVehicleRaycaster -{ - btDynamicsWorld* m_dynamicsWorld; -public: - btDefaultVehicleRaycaster(btDynamicsWorld* world) - :m_dynamicsWorld(world) - { - } - - virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result); - -}; - - -#endif //RAYCASTVEHICLE_H - +/* + * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/ + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies. + * Erwin Coumans makes no representations about the suitability + * of this software for any purpose. + * It is provided "as is" without express or implied warranty. +*/ +#ifndef RAYCASTVEHICLE_H +#define RAYCASTVEHICLE_H + +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" +#include "btVehicleRaycaster.h" +class btDynamicsWorld; +#include "LinearMath/btAlignedObjectArray.h" +#include "btWheelInfo.h" +#include "BulletDynamics/Dynamics/btActionInterface.h" + +class btVehicleTuning; + +///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle. +class btRaycastVehicle : public btActionInterface +{ + + btAlignedObjectArray m_forwardWS; + btAlignedObjectArray m_axle; + btAlignedObjectArray m_forwardImpulse; + btAlignedObjectArray m_sideImpulse; + + ///backwards compatibility + int m_userConstraintType; + int m_userConstraintId; + +public: + class btVehicleTuning + { + public: + + btVehicleTuning() + :m_suspensionStiffness(btScalar(5.88)), + m_suspensionCompression(btScalar(0.83)), + m_suspensionDamping(btScalar(0.88)), + m_maxSuspensionTravelCm(btScalar(500.)), + m_frictionSlip(btScalar(10.5)), + m_maxSuspensionForce(btScalar(6000.)) + { + } + btScalar m_suspensionStiffness; + btScalar m_suspensionCompression; + btScalar m_suspensionDamping; + btScalar m_maxSuspensionTravelCm; + btScalar m_frictionSlip; + btScalar m_maxSuspensionForce; + + }; +private: + + btScalar m_tau; + btScalar m_damping; + btVehicleRaycaster* m_vehicleRaycaster; + btScalar m_pitchControl; + btScalar m_steeringValue; + btScalar m_currentVehicleSpeedKmHour; + + btRigidBody* m_chassisBody; + + int m_indexRightAxis; + int m_indexUpAxis; + int m_indexForwardAxis; + + void defaultInit(const btVehicleTuning& tuning); + +public: + + //constructor to create a car from an existing rigidbody + btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster ); + + virtual ~btRaycastVehicle() ; + + + ///btActionInterface interface + virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step) + { + (void) collisionWorld; + updateVehicle(step); + } + + + ///btActionInterface interface + void debugDraw(btIDebugDraw* debugDrawer); + + const btTransform& getChassisWorldTransform() const; + + btScalar rayCast(btWheelInfo& wheel); + + virtual void updateVehicle(btScalar step); + + + void resetSuspension(); + + btScalar getSteeringValue(int wheel) const; + + void setSteeringValue(btScalar steering,int wheel); + + + void applyEngineForce(btScalar force, int wheel); + + const btTransform& getWheelTransformWS( int wheelIndex ) const; + + void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true ); + + void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth); + + btWheelInfo& addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel); + + inline int getNumWheels() const { + return int (m_wheelInfo.size()); + } + + btAlignedObjectArray m_wheelInfo; + + + const btWheelInfo& getWheelInfo(int index) const; + + btWheelInfo& getWheelInfo(int index); + + void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true); + + + void setBrake(btScalar brake,int wheelIndex); + + void setPitchControl(btScalar pitch) + { + m_pitchControl = pitch; + } + + void updateSuspension(btScalar deltaTime); + + virtual void updateFriction(btScalar timeStep); + + + + inline btRigidBody* getRigidBody() + { + return m_chassisBody; + } + + const btRigidBody* getRigidBody() const + { + return m_chassisBody; + } + + inline int getRightAxis() const + { + return m_indexRightAxis; + } + inline int getUpAxis() const + { + return m_indexUpAxis; + } + + inline int getForwardAxis() const + { + return m_indexForwardAxis; + } + + + ///Worldspace forward vector + btVector3 getForwardVector() const + { + const btTransform& chassisTrans = getChassisWorldTransform(); + + btVector3 forwardW ( + chassisTrans.getBasis()[0][m_indexForwardAxis], + chassisTrans.getBasis()[1][m_indexForwardAxis], + chassisTrans.getBasis()[2][m_indexForwardAxis]); + + return forwardW; + } + + ///Velocity of vehicle (positive if velocity vector has same direction as foward vector) + btScalar getCurrentSpeedKmHour() const + { + return m_currentVehicleSpeedKmHour; + } + + virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex) + { + m_indexRightAxis = rightIndex; + m_indexUpAxis = upIndex; + m_indexForwardAxis = forwardIndex; + } + + + ///backwards compatibility + int getUserConstraintType() const + { + return m_userConstraintType ; + } + + void setUserConstraintType(int userConstraintType) + { + m_userConstraintType = userConstraintType; + }; + + void setUserConstraintId(int uid) + { + m_userConstraintId = uid; + } + + int getUserConstraintId() const + { + return m_userConstraintId; + } + +}; + +class btDefaultVehicleRaycaster : public btVehicleRaycaster +{ + btDynamicsWorld* m_dynamicsWorld; +public: + btDefaultVehicleRaycaster(btDynamicsWorld* world) + :m_dynamicsWorld(world) + { + } + + virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result); + +}; + + +#endif //RAYCASTVEHICLE_H + diff --git a/src/BulletMultiThreaded/MiniCL.cpp b/src/BulletMultiThreaded/MiniCL.cpp index 2dbf98852..b7f5a6993 100644 --- a/src/BulletMultiThreaded/MiniCL.cpp +++ b/src/BulletMultiThreaded/MiniCL.cpp @@ -1,517 +1,517 @@ -/* - Copyright (C) 2010 Sony Computer Entertainment Inc. - All rights reserved. - -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 "MiniCL/cl.h" -#define __PHYSICS_COMMON_H__ 1 -#ifdef _WIN32 -#include "BulletMultiThreaded/Win32ThreadSupport.h" -#endif - -#include "BulletMultiThreaded/SequentialThreadSupport.h" -#include "MiniCLTaskScheduler.h" -#include "MiniCLTask/MiniCLTask.h" -#include "LinearMath/btMinMax.h" - -//#define DEBUG_MINICL_KERNELS 1 - - - - -CL_API_ENTRY cl_int CL_API_CALL clGetDeviceInfo( - cl_device_id device , - cl_device_info param_name , - size_t param_value_size , - void * param_value , - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0 -{ - - switch (param_name) - { - case CL_DEVICE_NAME: - { - char deviceName[] = "CPU"; - unsigned int nameLen = strlen(deviceName)+1; - assert(param_value_size>strlen(deviceName)); - if (nameLen < param_value_size) - { - const char* cpuName = "CPU"; - sprintf((char*)param_value,"%s",cpuName); - } else - { - printf("error: param_value_size should be at least %d, but it is %d\n",nameLen,param_value_size); - } - break; - } - case CL_DEVICE_TYPE: - { - if (param_value_size>=sizeof(cl_device_type)) - { - cl_device_type* deviceType = (cl_device_type*)param_value; - *deviceType = CL_DEVICE_TYPE_CPU; - } else - { - printf("error: param_value_size should be at least %d\n",sizeof(cl_device_type)); - } - break; - } - case CL_DEVICE_MAX_COMPUTE_UNITS: - { - if (param_value_size>=sizeof(cl_uint)) - { - cl_uint* numUnits = (cl_uint*)param_value; - *numUnits= 4; - } else - { - printf("error: param_value_size should be at least %d\n",sizeof(cl_uint)); - } - - break; - } - case CL_DEVICE_MAX_WORK_ITEM_SIZES: - { - size_t workitem_size[3]; - - if (param_value_size>=sizeof(workitem_size)) - { - size_t* workItemSize = (size_t*)param_value; - workItemSize[0] = 64; - workItemSize[1] = 24; - workItemSize[2] = 16; - } else - { - printf("error: param_value_size should be at least %d\n",sizeof(cl_uint)); - } - break; - } - case CL_DEVICE_MAX_CLOCK_FREQUENCY: - { - cl_uint* clock_frequency = (cl_uint*)param_value; - *clock_frequency = 3*1024; - break; - } - default: - { - printf("error: unsupported param_name:%d\n",param_name); - } - } - - - return 0; -} - -CL_API_ENTRY cl_int CL_API_CALL clReleaseMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0 -{ - return 0; -} - - - -CL_API_ENTRY cl_int CL_API_CALL clReleaseCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0 -{ - return 0; -} - -CL_API_ENTRY cl_int CL_API_CALL clReleaseProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0 -{ - return 0; -} - -CL_API_ENTRY cl_int CL_API_CALL clReleaseKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0 -{ - return 0; -} - - -// Enqueued Commands APIs -CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBuffer(cl_command_queue command_queue , - cl_mem buffer , - cl_bool /* blocking_read */, - size_t offset , - size_t cb , - void * ptr , - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0 -{ - MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue; - - ///wait for all work items to be completed - scheduler->flush(); - - memcpy(ptr,(char*)buffer + offset,cb); - return 0; -} - - -CL_API_ENTRY cl_int clGetProgramBuildInfo(cl_program /* program */, - cl_device_id /* device */, - cl_program_build_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0 -{ - - return 0; -} - - -// Program Object APIs -CL_API_ENTRY cl_program -clCreateProgramWithSource(cl_context context , - cl_uint /* count */, - const char ** /* strings */, - const size_t * /* lengths */, - cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 -{ - *errcode_ret = CL_SUCCESS; - return (cl_program)context; -} - -CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBuffer(cl_command_queue command_queue , - cl_mem buffer , - cl_bool /* blocking_read */, - size_t offset, - size_t cb , - const void * ptr , - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0 -{ - MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue; - - ///wait for all work items to be completed - scheduler->flush(); - - memcpy((char*)buffer + offset, ptr,cb); - return 0; -} - -CL_API_ENTRY cl_int CL_API_CALL clFlush(cl_command_queue command_queue) -{ - MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue; - ///wait for all work items to be completed - scheduler->flush(); - return 0; -} - - -CL_API_ENTRY cl_int CL_API_CALL clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, - cl_kernel clKernel , - cl_uint work_dim , - const size_t * /* global_work_offset */, - const size_t * global_work_size , - const size_t * /* local_work_size */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0 -{ - - - MiniCLKernel* kernel = (MiniCLKernel*) clKernel; - for (unsigned int ii=0;iim_scheduler->getMaxNumOutstandingTasks(); - int numWorkItems = global_work_size[ii]; - -// //at minimum 64 work items per task -// int numWorkItemsPerTask = btMax(64,numWorkItems / maxTask); - int numWorkItemsPerTask = numWorkItems / maxTask; - if (!numWorkItemsPerTask) numWorkItemsPerTask = 1; - - for (int t=0;tm_scheduler->issueTask(t, endIndex, kernel); - t = endIndex; - } - } -/* - - void* bla = 0; - - scheduler->issueTask(bla,2,3); - scheduler->flush(); - - */ - - return 0; -} - -#define LOCAL_BUF_SIZE 32768 -static int sLocalMemBuf[LOCAL_BUF_SIZE * 4 + 16]; -static int* spLocalBufCurr = NULL; -static int sLocalBufUsed = LOCAL_BUF_SIZE; // so it will be reset at the first call -static void* localBufMalloc(int size) -{ - int size16 = (size + 15) >> 4; // in 16-byte units - if((sLocalBufUsed + size16) > LOCAL_BUF_SIZE) - { // reset - spLocalBufCurr = sLocalMemBuf; - while((long)spLocalBufCurr & 0x0F) spLocalBufCurr++; // align to 16 bytes - sLocalBufUsed = 0; - } - void* ret = spLocalBufCurr; - spLocalBufCurr += size16 * 4; - sLocalBufUsed += size; - return ret; -} - - - -CL_API_ENTRY cl_int CL_API_CALL clSetKernelArg(cl_kernel clKernel , - cl_uint arg_index , - size_t arg_size , - const void * arg_value ) CL_API_SUFFIX__VERSION_1_0 -{ - MiniCLKernel* kernel = (MiniCLKernel* ) clKernel; - btAssert(arg_size <= MINICL_MAX_ARGLENGTH); - if (arg_index>MINI_CL_MAX_ARG) - { - printf("error: clSetKernelArg arg_index (%d) exceeds %d\n",arg_index,MINI_CL_MAX_ARG); - } else - { -// if (arg_size>=MINICL_MAX_ARGLENGTH) - if (arg_size != MINICL_MAX_ARGLENGTH) - { - printf("error: clSetKernelArg argdata too large: %d (maximum is %d)\n",arg_size,MINICL_MAX_ARGLENGTH); - } - else - { - if(arg_value == NULL) - { // this is only for __local memory qualifier - void* ptr = localBufMalloc(arg_size); - kernel->m_argData[arg_index] = ptr; - } - else - { - memcpy(&(kernel->m_argData[arg_index]), arg_value, arg_size); - } - kernel->m_argSizes[arg_index] = arg_size; - if(arg_index >= kernel->m_numArgs) - { - kernel->m_numArgs = arg_index + 1; - kernel->updateLauncher(); - } - } - } - return 0; -} - -// Kernel Object APIs -CL_API_ENTRY cl_kernel CL_API_CALL clCreateKernel(cl_program program , - const char * kernel_name , - cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 -{ - MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) program; - MiniCLKernel* kernel = new MiniCLKernel(); - int nameLen = strlen(kernel_name); - if(nameLen >= MINI_CL_MAX_KERNEL_NAME) - { - *errcode_ret = CL_INVALID_KERNEL_NAME; - return NULL; - } - strcpy(kernel->m_name, kernel_name); - kernel->m_numArgs = 0; - - //kernel->m_kernelProgramCommandId = scheduler->findProgramCommandIdByName(kernel_name); - //if (kernel->m_kernelProgramCommandId>=0) - //{ - // *errcode_ret = CL_SUCCESS; - //} else - //{ - // *errcode_ret = CL_INVALID_KERNEL_NAME; - //} - kernel->m_scheduler = scheduler; - if(kernel->registerSelf() == NULL) - { - *errcode_ret = CL_INVALID_KERNEL_NAME; - return NULL; - } - else - { - *errcode_ret = CL_SUCCESS; - } - - return (cl_kernel)kernel; - -} - - -CL_API_ENTRY cl_int CL_API_CALL clBuildProgram(cl_program /* program */, - cl_uint /* num_devices */, - const cl_device_id * /* device_list */, - const char * /* options */, - void (*pfn_notify)(cl_program /* program */, void * /* user_data */), - void * /* user_data */) CL_API_SUFFIX__VERSION_1_0 -{ - return CL_SUCCESS; -} - -CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBinary(cl_context context , - cl_uint /* num_devices */, - const cl_device_id * /* device_list */, - const size_t * /* lengths */, - const unsigned char ** /* binaries */, - cl_int * /* binary_status */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0 -{ - return (cl_program)context; -} - - -// Memory Object APIs -CL_API_ENTRY cl_mem CL_API_CALL clCreateBuffer(cl_context /* context */, - cl_mem_flags flags , - size_t size, - void * host_ptr , - cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 -{ - cl_mem buf = (cl_mem)malloc(size); - if ((flags&CL_MEM_COPY_HOST_PTR) && host_ptr) - { - memcpy(buf,host_ptr,size); - } - *errcode_ret = 0; - return buf; -} - -// Command Queue APIs -CL_API_ENTRY cl_command_queue CL_API_CALL clCreateCommandQueue(cl_context context , - cl_device_id /* device */, - cl_command_queue_properties /* properties */, - cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 -{ - *errcode_ret = 0; - return (cl_command_queue) context; -} - -extern CL_API_ENTRY cl_int CL_API_CALL clGetContextInfo(cl_context /* context */, - cl_context_info param_name , - size_t param_value_size , - void * param_value, - size_t * param_value_size_ret ) CL_API_SUFFIX__VERSION_1_0 -{ - - switch (param_name) - { - case CL_CONTEXT_DEVICES: - { - if (!param_value_size) - { - *param_value_size_ret = 13; - } else - { - const char* testName = "MiniCL_Test."; - sprintf((char*)param_value,"%s",testName); - } - break; - }; - default: - { - printf("unsupported\n"); - } - } - - return 0; -} - -CL_API_ENTRY cl_context CL_API_CALL clCreateContextFromType(cl_context_properties * /* properties */, - cl_device_type /* device_type */, - void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, - void * /* user_data */, - cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 -{ - int maxNumOutstandingTasks = 4; -// int maxNumOutstandingTasks = 2; -// int maxNumOutstandingTasks = 1; - gMiniCLNumOutstandingTasks = maxNumOutstandingTasks; - const int maxNumOfThreadSupports = 8; - static int sUniqueThreadSupportIndex = 0; - static char* sUniqueThreadSupportName[maxNumOfThreadSupports] = - { - "MiniCL_0", "MiniCL_1", "MiniCL_2", "MiniCL_3", "MiniCL_4", "MiniCL_5", "MiniCL_6", "MiniCL_7" - }; - -#ifdef DEBUG_MINICL_KERNELS - SequentialThreadSupport::SequentialThreadConstructionInfo stc("MiniCL",processMiniCLTask,createMiniCLLocalStoreMemory); - SequentialThreadSupport* threadSupport = new SequentialThreadSupport(stc); -#else - -#if _WIN32 - btAssert(sUniqueThreadSupportIndex < maxNumOfThreadSupports); - Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( -// "MiniCL", - sUniqueThreadSupportName[sUniqueThreadSupportIndex++], - processMiniCLTask, //processCollisionTask, - createMiniCLLocalStoreMemory,//createCollisionLocalStoreMemory, - maxNumOutstandingTasks)); -#else - ///todo: add posix thread support for other platforms - SequentialThreadSupport::SequentialThreadConstructionInfo stc("MiniCL",processMiniCLTask,createMiniCLLocalStoreMemory); - SequentialThreadSupport* threadSupport = new SequentialThreadSupport(stc); -#endif - -#endif //DEBUG_MINICL_KERNELS - - - MiniCLTaskScheduler* scheduler = new MiniCLTaskScheduler(threadSupport,maxNumOutstandingTasks); - - *errcode_ret = 0; - return (cl_context)scheduler; -} - -CL_API_ENTRY cl_int CL_API_CALL clReleaseContext(cl_context context ) CL_API_SUFFIX__VERSION_1_0 -{ - - MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) context; - - btThreadSupportInterface* threadSupport = scheduler->getThreadSupportInterface(); - delete scheduler; - delete threadSupport; - - return 0; -} -extern CL_API_ENTRY cl_int CL_API_CALL -clFinish(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0 -{ - return CL_SUCCESS; -} - - -extern CL_API_ENTRY cl_int CL_API_CALL -clGetKernelWorkGroupInfo(cl_kernel kernel , - cl_device_id /* device */, - cl_kernel_work_group_info wgi/* param_name */, - size_t sz /* param_value_size */, - void * ptr /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0 -{ - if((wgi == CL_KERNEL_WORK_GROUP_SIZE) - &&(sz == sizeof(int)) - &&(ptr != NULL)) - { - MiniCLKernel* miniCLKernel = (MiniCLKernel*)kernel; - MiniCLTaskScheduler* scheduler = miniCLKernel->m_scheduler; - *((int*)ptr) = scheduler->getMaxNumOutstandingTasks(); - return CL_SUCCESS; - } - else - { - return CL_INVALID_VALUE; - } -} +/* + Copyright (C) 2010 Sony Computer Entertainment Inc. + All rights reserved. + +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 "MiniCL/cl.h" +#define __PHYSICS_COMMON_H__ 1 +#ifdef _WIN32 +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#endif + +#include "BulletMultiThreaded/SequentialThreadSupport.h" +#include "MiniCLTaskScheduler.h" +#include "MiniCLTask/MiniCLTask.h" +#include "LinearMath/btMinMax.h" + +//#define DEBUG_MINICL_KERNELS 1 + + + + +CL_API_ENTRY cl_int CL_API_CALL clGetDeviceInfo( + cl_device_id device , + cl_device_info param_name , + size_t param_value_size , + void * param_value , + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0 +{ + + switch (param_name) + { + case CL_DEVICE_NAME: + { + char deviceName[] = "CPU"; + unsigned int nameLen = strlen(deviceName)+1; + assert(param_value_size>strlen(deviceName)); + if (nameLen < param_value_size) + { + const char* cpuName = "CPU"; + sprintf((char*)param_value,"%s",cpuName); + } else + { + printf("error: param_value_size should be at least %d, but it is %d\n",nameLen,param_value_size); + } + break; + } + case CL_DEVICE_TYPE: + { + if (param_value_size>=sizeof(cl_device_type)) + { + cl_device_type* deviceType = (cl_device_type*)param_value; + *deviceType = CL_DEVICE_TYPE_CPU; + } else + { + printf("error: param_value_size should be at least %d\n",sizeof(cl_device_type)); + } + break; + } + case CL_DEVICE_MAX_COMPUTE_UNITS: + { + if (param_value_size>=sizeof(cl_uint)) + { + cl_uint* numUnits = (cl_uint*)param_value; + *numUnits= 4; + } else + { + printf("error: param_value_size should be at least %d\n",sizeof(cl_uint)); + } + + break; + } + case CL_DEVICE_MAX_WORK_ITEM_SIZES: + { + size_t workitem_size[3]; + + if (param_value_size>=sizeof(workitem_size)) + { + size_t* workItemSize = (size_t*)param_value; + workItemSize[0] = 64; + workItemSize[1] = 24; + workItemSize[2] = 16; + } else + { + printf("error: param_value_size should be at least %d\n",sizeof(cl_uint)); + } + break; + } + case CL_DEVICE_MAX_CLOCK_FREQUENCY: + { + cl_uint* clock_frequency = (cl_uint*)param_value; + *clock_frequency = 3*1024; + break; + } + default: + { + printf("error: unsupported param_name:%d\n",param_name); + } + } + + + return 0; +} + +CL_API_ENTRY cl_int CL_API_CALL clReleaseMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0 +{ + return 0; +} + + + +CL_API_ENTRY cl_int CL_API_CALL clReleaseCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0 +{ + return 0; +} + +CL_API_ENTRY cl_int CL_API_CALL clReleaseProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0 +{ + return 0; +} + +CL_API_ENTRY cl_int CL_API_CALL clReleaseKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0 +{ + return 0; +} + + +// Enqueued Commands APIs +CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBuffer(cl_command_queue command_queue , + cl_mem buffer , + cl_bool /* blocking_read */, + size_t offset , + size_t cb , + void * ptr , + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0 +{ + MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue; + + ///wait for all work items to be completed + scheduler->flush(); + + memcpy(ptr,(char*)buffer + offset,cb); + return 0; +} + + +CL_API_ENTRY cl_int clGetProgramBuildInfo(cl_program /* program */, + cl_device_id /* device */, + cl_program_build_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0 +{ + + return 0; +} + + +// Program Object APIs +CL_API_ENTRY cl_program +clCreateProgramWithSource(cl_context context , + cl_uint /* count */, + const char ** /* strings */, + const size_t * /* lengths */, + cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 +{ + *errcode_ret = CL_SUCCESS; + return (cl_program)context; +} + +CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBuffer(cl_command_queue command_queue , + cl_mem buffer , + cl_bool /* blocking_read */, + size_t offset, + size_t cb , + const void * ptr , + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0 +{ + MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue; + + ///wait for all work items to be completed + scheduler->flush(); + + memcpy((char*)buffer + offset, ptr,cb); + return 0; +} + +CL_API_ENTRY cl_int CL_API_CALL clFlush(cl_command_queue command_queue) +{ + MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue; + ///wait for all work items to be completed + scheduler->flush(); + return 0; +} + + +CL_API_ENTRY cl_int CL_API_CALL clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, + cl_kernel clKernel , + cl_uint work_dim , + const size_t * /* global_work_offset */, + const size_t * global_work_size , + const size_t * /* local_work_size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0 +{ + + + MiniCLKernel* kernel = (MiniCLKernel*) clKernel; + for (unsigned int ii=0;iim_scheduler->getMaxNumOutstandingTasks(); + int numWorkItems = global_work_size[ii]; + +// //at minimum 64 work items per task +// int numWorkItemsPerTask = btMax(64,numWorkItems / maxTask); + int numWorkItemsPerTask = numWorkItems / maxTask; + if (!numWorkItemsPerTask) numWorkItemsPerTask = 1; + + for (int t=0;tm_scheduler->issueTask(t, endIndex, kernel); + t = endIndex; + } + } +/* + + void* bla = 0; + + scheduler->issueTask(bla,2,3); + scheduler->flush(); + + */ + + return 0; +} + +#define LOCAL_BUF_SIZE 32768 +static int sLocalMemBuf[LOCAL_BUF_SIZE * 4 + 16]; +static int* spLocalBufCurr = NULL; +static int sLocalBufUsed = LOCAL_BUF_SIZE; // so it will be reset at the first call +static void* localBufMalloc(int size) +{ + int size16 = (size + 15) >> 4; // in 16-byte units + if((sLocalBufUsed + size16) > LOCAL_BUF_SIZE) + { // reset + spLocalBufCurr = sLocalMemBuf; + while((long)spLocalBufCurr & 0x0F) spLocalBufCurr++; // align to 16 bytes + sLocalBufUsed = 0; + } + void* ret = spLocalBufCurr; + spLocalBufCurr += size16 * 4; + sLocalBufUsed += size; + return ret; +} + + + +CL_API_ENTRY cl_int CL_API_CALL clSetKernelArg(cl_kernel clKernel , + cl_uint arg_index , + size_t arg_size , + const void * arg_value ) CL_API_SUFFIX__VERSION_1_0 +{ + MiniCLKernel* kernel = (MiniCLKernel* ) clKernel; + btAssert(arg_size <= MINICL_MAX_ARGLENGTH); + if (arg_index>MINI_CL_MAX_ARG) + { + printf("error: clSetKernelArg arg_index (%d) exceeds %d\n",arg_index,MINI_CL_MAX_ARG); + } else + { +// if (arg_size>=MINICL_MAX_ARGLENGTH) + if (arg_size != MINICL_MAX_ARGLENGTH) + { + printf("error: clSetKernelArg argdata too large: %d (maximum is %d)\n",arg_size,MINICL_MAX_ARGLENGTH); + } + else + { + if(arg_value == NULL) + { // this is only for __local memory qualifier + void* ptr = localBufMalloc(arg_size); + kernel->m_argData[arg_index] = ptr; + } + else + { + memcpy(&(kernel->m_argData[arg_index]), arg_value, arg_size); + } + kernel->m_argSizes[arg_index] = arg_size; + if(arg_index >= kernel->m_numArgs) + { + kernel->m_numArgs = arg_index + 1; + kernel->updateLauncher(); + } + } + } + return 0; +} + +// Kernel Object APIs +CL_API_ENTRY cl_kernel CL_API_CALL clCreateKernel(cl_program program , + const char * kernel_name , + cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 +{ + MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) program; + MiniCLKernel* kernel = new MiniCLKernel(); + int nameLen = strlen(kernel_name); + if(nameLen >= MINI_CL_MAX_KERNEL_NAME) + { + *errcode_ret = CL_INVALID_KERNEL_NAME; + return NULL; + } + strcpy(kernel->m_name, kernel_name); + kernel->m_numArgs = 0; + + //kernel->m_kernelProgramCommandId = scheduler->findProgramCommandIdByName(kernel_name); + //if (kernel->m_kernelProgramCommandId>=0) + //{ + // *errcode_ret = CL_SUCCESS; + //} else + //{ + // *errcode_ret = CL_INVALID_KERNEL_NAME; + //} + kernel->m_scheduler = scheduler; + if(kernel->registerSelf() == NULL) + { + *errcode_ret = CL_INVALID_KERNEL_NAME; + return NULL; + } + else + { + *errcode_ret = CL_SUCCESS; + } + + return (cl_kernel)kernel; + +} + + +CL_API_ENTRY cl_int CL_API_CALL clBuildProgram(cl_program /* program */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const char * /* options */, + void (*pfn_notify)(cl_program /* program */, void * /* user_data */), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_0 +{ + return CL_SUCCESS; +} + +CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBinary(cl_context context , + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const size_t * /* lengths */, + const unsigned char ** /* binaries */, + cl_int * /* binary_status */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0 +{ + return (cl_program)context; +} + + +// Memory Object APIs +CL_API_ENTRY cl_mem CL_API_CALL clCreateBuffer(cl_context /* context */, + cl_mem_flags flags , + size_t size, + void * host_ptr , + cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 +{ + cl_mem buf = (cl_mem)malloc(size); + if ((flags&CL_MEM_COPY_HOST_PTR) && host_ptr) + { + memcpy(buf,host_ptr,size); + } + *errcode_ret = 0; + return buf; +} + +// Command Queue APIs +CL_API_ENTRY cl_command_queue CL_API_CALL clCreateCommandQueue(cl_context context , + cl_device_id /* device */, + cl_command_queue_properties /* properties */, + cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 +{ + *errcode_ret = 0; + return (cl_command_queue) context; +} + +extern CL_API_ENTRY cl_int CL_API_CALL clGetContextInfo(cl_context /* context */, + cl_context_info param_name , + size_t param_value_size , + void * param_value, + size_t * param_value_size_ret ) CL_API_SUFFIX__VERSION_1_0 +{ + + switch (param_name) + { + case CL_CONTEXT_DEVICES: + { + if (!param_value_size) + { + *param_value_size_ret = 13; + } else + { + const char* testName = "MiniCL_Test."; + sprintf((char*)param_value,"%s",testName); + } + break; + }; + default: + { + printf("unsupported\n"); + } + } + + return 0; +} + +CL_API_ENTRY cl_context CL_API_CALL clCreateContextFromType(cl_context_properties * /* properties */, + cl_device_type /* device_type */, + void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, + void * /* user_data */, + cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0 +{ + int maxNumOutstandingTasks = 4; +// int maxNumOutstandingTasks = 2; +// int maxNumOutstandingTasks = 1; + gMiniCLNumOutstandingTasks = maxNumOutstandingTasks; + const int maxNumOfThreadSupports = 8; + static int sUniqueThreadSupportIndex = 0; + static char* sUniqueThreadSupportName[maxNumOfThreadSupports] = + { + "MiniCL_0", "MiniCL_1", "MiniCL_2", "MiniCL_3", "MiniCL_4", "MiniCL_5", "MiniCL_6", "MiniCL_7" + }; + +#ifdef DEBUG_MINICL_KERNELS + SequentialThreadSupport::SequentialThreadConstructionInfo stc("MiniCL",processMiniCLTask,createMiniCLLocalStoreMemory); + SequentialThreadSupport* threadSupport = new SequentialThreadSupport(stc); +#else + +#if _WIN32 + btAssert(sUniqueThreadSupportIndex < maxNumOfThreadSupports); + Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( +// "MiniCL", + sUniqueThreadSupportName[sUniqueThreadSupportIndex++], + processMiniCLTask, //processCollisionTask, + createMiniCLLocalStoreMemory,//createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else + ///todo: add posix thread support for other platforms + SequentialThreadSupport::SequentialThreadConstructionInfo stc("MiniCL",processMiniCLTask,createMiniCLLocalStoreMemory); + SequentialThreadSupport* threadSupport = new SequentialThreadSupport(stc); +#endif + +#endif //DEBUG_MINICL_KERNELS + + + MiniCLTaskScheduler* scheduler = new MiniCLTaskScheduler(threadSupport,maxNumOutstandingTasks); + + *errcode_ret = 0; + return (cl_context)scheduler; +} + +CL_API_ENTRY cl_int CL_API_CALL clReleaseContext(cl_context context ) CL_API_SUFFIX__VERSION_1_0 +{ + + MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) context; + + btThreadSupportInterface* threadSupport = scheduler->getThreadSupportInterface(); + delete scheduler; + delete threadSupport; + + return 0; +} +extern CL_API_ENTRY cl_int CL_API_CALL +clFinish(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0 +{ + return CL_SUCCESS; +} + + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelWorkGroupInfo(cl_kernel kernel , + cl_device_id /* device */, + cl_kernel_work_group_info wgi/* param_name */, + size_t sz /* param_value_size */, + void * ptr /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0 +{ + if((wgi == CL_KERNEL_WORK_GROUP_SIZE) + &&(sz == sizeof(int)) + &&(ptr != NULL)) + { + MiniCLKernel* miniCLKernel = (MiniCLKernel*)kernel; + MiniCLTaskScheduler* scheduler = miniCLKernel->m_scheduler; + *((int*)ptr) = scheduler->getMaxNumOutstandingTasks(); + return CL_SUCCESS; + } + else + { + return CL_INVALID_VALUE; + } +} diff --git a/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.cpp b/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.cpp index 0d4799285..babb1d24a 100644 --- a/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.cpp +++ b/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.cpp @@ -1,74 +1,74 @@ -/* -Bullet Continuous Collision Detection and Physics Library, Copyright (c) 2007 Erwin Coumans - -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 "MiniCLTask.h" -#include "BulletMultiThreaded/PlatformDefinitions.h" -#include "BulletMultiThreaded/SpuFakeDma.h" -#include "LinearMath/btMinMax.h" -#include "MiniCLTask.h" -#include "BulletMultiThreaded/MiniCLTaskScheduler.h" - - -#ifdef __SPU__ -#include -#else -#include -#define spu_printf printf -#endif - -int gMiniCLNumOutstandingTasks = 0; - -struct MiniCLTask_LocalStoreMemory -{ - -}; - - -//-- MAIN METHOD -void processMiniCLTask(void* userPtr, void* lsMemory) -{ - // BT_PROFILE("processSampleTask"); - - MiniCLTask_LocalStoreMemory* localMemory = (MiniCLTask_LocalStoreMemory*)lsMemory; - - MiniCLTaskDesc* taskDescPtr = (MiniCLTaskDesc*)userPtr; - MiniCLTaskDesc& taskDesc = *taskDescPtr; - - for (unsigned int i=taskDesc.m_firstWorkUnit;im_launcher(&taskDesc, i); - } - -// printf("Compute Unit[%d] executed kernel %d work items [%d..%d)\n",taskDesc.m_taskId,taskDesc.m_kernelProgramId,taskDesc.m_firstWorkUnit,taskDesc.m_lastWorkUnit); - -} - - -#if defined(__CELLOS_LV2__) || defined (LIBSPE2) - -ATTRIBUTE_ALIGNED16(MiniCLTask_LocalStoreMemory gLocalStoreMemory); - -void* createMiniCLLocalStoreMemory() -{ - return &gLocalStoreMemory; -} -#else -void* createMiniCLLocalStoreMemory() -{ - return new MiniCLTask_LocalStoreMemory; -}; - -#endif +/* +Bullet Continuous Collision Detection and Physics Library, Copyright (c) 2007 Erwin Coumans + +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 "MiniCLTask.h" +#include "BulletMultiThreaded/PlatformDefinitions.h" +#include "BulletMultiThreaded/SpuFakeDma.h" +#include "LinearMath/btMinMax.h" +#include "MiniCLTask.h" +#include "BulletMultiThreaded/MiniCLTaskScheduler.h" + + +#ifdef __SPU__ +#include +#else +#include +#define spu_printf printf +#endif + +int gMiniCLNumOutstandingTasks = 0; + +struct MiniCLTask_LocalStoreMemory +{ + +}; + + +//-- MAIN METHOD +void processMiniCLTask(void* userPtr, void* lsMemory) +{ + // BT_PROFILE("processSampleTask"); + + MiniCLTask_LocalStoreMemory* localMemory = (MiniCLTask_LocalStoreMemory*)lsMemory; + + MiniCLTaskDesc* taskDescPtr = (MiniCLTaskDesc*)userPtr; + MiniCLTaskDesc& taskDesc = *taskDescPtr; + + for (unsigned int i=taskDesc.m_firstWorkUnit;im_launcher(&taskDesc, i); + } + +// printf("Compute Unit[%d] executed kernel %d work items [%d..%d)\n",taskDesc.m_taskId,taskDesc.m_kernelProgramId,taskDesc.m_firstWorkUnit,taskDesc.m_lastWorkUnit); + +} + + +#if defined(__CELLOS_LV2__) || defined (LIBSPE2) + +ATTRIBUTE_ALIGNED16(MiniCLTask_LocalStoreMemory gLocalStoreMemory); + +void* createMiniCLLocalStoreMemory() +{ + return &gLocalStoreMemory; +} +#else +void* createMiniCLLocalStoreMemory() +{ + return new MiniCLTask_LocalStoreMemory; +}; + +#endif diff --git a/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.h b/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.h index ca09d177a..7e78be085 100644 --- a/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.h +++ b/src/BulletMultiThreaded/MiniCLTask/MiniCLTask.h @@ -1,62 +1,62 @@ -/* -Bullet Continuous Collision Detection and Physics Library, Copyright (c) 2007 Erwin Coumans - -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 MINICL__TASK_H -#define MINICL__TASK_H - -#include "BulletMultiThreaded/PlatformDefinitions.h" -#include "LinearMath/btScalar.h" - -#include "LinearMath/btAlignedAllocator.h" - - -#define MINICL_MAX_ARGLENGTH (sizeof(void*)) -#define MINI_CL_MAX_ARG 16 -#define MINI_CL_MAX_KERNEL_NAME 256 - -struct MiniCLKernel; - -ATTRIBUTE_ALIGNED16(struct) MiniCLTaskDesc -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - MiniCLTaskDesc() - { - for (int i=0;i - -#ifdef __SPU__ - - - -void SampleThreadFunc(void* userPtr,void* lsMemory) -{ - //do nothing - printf("hello world\n"); -} - - -void* SamplelsMemoryFunc() -{ - //don't create local store memory, just return 0 - return 0; -} - - -#else - - -#include "BulletMultiThreaded/btThreadSupportInterface.h" - -//# include "SPUAssert.h" -#include - -#include "MiniCL/cl_platform.h" - -extern "C" { - extern char SPU_SAMPLE_ELF_SYMBOL[]; -} - - -MiniCLTaskScheduler::MiniCLTaskScheduler(btThreadSupportInterface* threadInterface, int maxNumOutstandingTasks) -:m_threadInterface(threadInterface), -m_maxNumOutstandingTasks(maxNumOutstandingTasks) -{ - - m_taskBusy.resize(m_maxNumOutstandingTasks); - m_spuSampleTaskDesc.resize(m_maxNumOutstandingTasks); - - m_kernels.resize(0); - - for (int i = 0; i < m_maxNumOutstandingTasks; i++) - { - m_taskBusy[i] = false; - } - m_numBusyTasks = 0; - m_currentTask = 0; - - m_initialized = false; - - m_threadInterface->startSPU(); - - -} - -MiniCLTaskScheduler::~MiniCLTaskScheduler() -{ - m_threadInterface->stopSPU(); - -} - - - -void MiniCLTaskScheduler::initialize() -{ -#ifdef DEBUG_SPU_TASK_SCHEDULING - printf("MiniCLTaskScheduler::initialize()\n"); -#endif //DEBUG_SPU_TASK_SCHEDULING - - for (int i = 0; i < m_maxNumOutstandingTasks; i++) - { - m_taskBusy[i] = false; - } - m_numBusyTasks = 0; - m_currentTask = 0; - m_initialized = true; - -} - - -void MiniCLTaskScheduler::issueTask(int firstWorkUnit, int lastWorkUnit, MiniCLKernel* kernel) -{ - -#ifdef DEBUG_SPU_TASK_SCHEDULING - printf("MiniCLTaskScheduler::issueTask (m_currentTask= %d\)n", m_currentTask); -#endif //DEBUG_SPU_TASK_SCHEDULING - - m_taskBusy[m_currentTask] = true; - m_numBusyTasks++; - - MiniCLTaskDesc& taskDesc = m_spuSampleTaskDesc[m_currentTask]; - { - // send task description in event message - taskDesc.m_firstWorkUnit = firstWorkUnit; - taskDesc.m_lastWorkUnit = lastWorkUnit; - taskDesc.m_kernel = kernel; - //some bookkeeping to recognize finished tasks - taskDesc.m_taskId = m_currentTask; - -// for (int i=0;im_numArgs; i++) - { - taskDesc.m_argSizes[i] = kernel->m_argSizes[i]; - if (taskDesc.m_argSizes[i]) - { - taskDesc.m_argData[i] = kernel->m_argData[i]; -// memcpy(&taskDesc.m_argData[i],&argData[MINICL_MAX_ARGLENGTH*i],taskDesc.m_argSizes[i]); - } - } - } - - - m_threadInterface->sendRequest(1, (ppu_address_t) &taskDesc, m_currentTask); - - // if all tasks busy, wait for spu event to clear the task. - - if (m_numBusyTasks >= m_maxNumOutstandingTasks) - { - unsigned int taskId; - unsigned int outputSize; - - for (int i=0;iwaitForResponse(&taskId, &outputSize); - - //printf("PPU: after issue, received event: %u %d\n", taskId, outputSize); - - postProcess(taskId, outputSize); - - m_taskBusy[taskId] = false; - - m_numBusyTasks--; - } - - // find new task buffer - for (int i = 0; i < m_maxNumOutstandingTasks; i++) - { - if (!m_taskBusy[i]) - { - m_currentTask = i; - break; - } - } -} - - -///Optional PPU-size post processing for each task -void MiniCLTaskScheduler::postProcess(int taskId, int outputSize) -{ - -} - - -void MiniCLTaskScheduler::flush() -{ -#ifdef DEBUG_SPU_TASK_SCHEDULING - printf("\nSpuCollisionTaskProcess::flush()\n"); -#endif //DEBUG_SPU_TASK_SCHEDULING - - - // all tasks are issued, wait for all tasks to be complete - while(m_numBusyTasks > 0) - { -// Consolidating SPU code - unsigned int taskId; - unsigned int outputSize; - - for (int i=0;iwaitForResponse(&taskId, &outputSize); - } - - //printf("PPU: flushing, received event: %u %d\n", taskId, outputSize); - - postProcess(taskId, outputSize); - - m_taskBusy[taskId] = false; - - m_numBusyTasks--; - } - - -} - - - -typedef void (*MiniCLKernelLauncher0)(int); -typedef void (*MiniCLKernelLauncher1)(void*, int); -typedef void (*MiniCLKernelLauncher2)(void*, void*, int); -typedef void (*MiniCLKernelLauncher3)(void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher4)(void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher5)(void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher6)(void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher7)(void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher8)(void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher9)(void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher10)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher11)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher12)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher13)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher14)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher15)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); -typedef void (*MiniCLKernelLauncher16)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); - - -static void kernelLauncher0(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher0)(taskDesc->m_kernel->m_launcher))(guid); -} -static void kernelLauncher1(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher1)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - guid); -} -static void kernelLauncher2(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher2)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - guid); -} -static void kernelLauncher3(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher3)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - guid); -} -static void kernelLauncher4(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher4)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - guid); -} -static void kernelLauncher5(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher5)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - guid); -} -static void kernelLauncher6(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher6)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - guid); -} -static void kernelLauncher7(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher7)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - guid); -} -static void kernelLauncher8(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher8)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - guid); -} -static void kernelLauncher9(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher9)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - guid); -} -static void kernelLauncher10(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher10)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - guid); -} -static void kernelLauncher11(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher11)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - taskDesc->m_argData[10], - guid); -} -static void kernelLauncher12(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher12)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - taskDesc->m_argData[10], - taskDesc->m_argData[11], - guid); -} -static void kernelLauncher13(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher13)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - taskDesc->m_argData[10], - taskDesc->m_argData[11], - taskDesc->m_argData[12], - guid); -} -static void kernelLauncher14(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher14)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - taskDesc->m_argData[10], - taskDesc->m_argData[11], - taskDesc->m_argData[12], - taskDesc->m_argData[13], - guid); -} -static void kernelLauncher15(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher15)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - taskDesc->m_argData[10], - taskDesc->m_argData[11], - taskDesc->m_argData[12], - taskDesc->m_argData[13], - taskDesc->m_argData[14], - guid); -} -static void kernelLauncher16(MiniCLTaskDesc* taskDesc, int guid) -{ - ((MiniCLKernelLauncher16)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], - taskDesc->m_argData[1], - taskDesc->m_argData[2], - taskDesc->m_argData[3], - taskDesc->m_argData[4], - taskDesc->m_argData[5], - taskDesc->m_argData[6], - taskDesc->m_argData[7], - taskDesc->m_argData[8], - taskDesc->m_argData[9], - taskDesc->m_argData[10], - taskDesc->m_argData[11], - taskDesc->m_argData[12], - taskDesc->m_argData[13], - taskDesc->m_argData[14], - taskDesc->m_argData[15], - guid); -} - -static kernelLauncherCB spLauncherList[MINI_CL_MAX_ARG+1] = -{ - kernelLauncher0, - kernelLauncher1, - kernelLauncher2, - kernelLauncher3, - kernelLauncher4, - kernelLauncher5, - kernelLauncher6, - kernelLauncher7, - kernelLauncher8, - kernelLauncher9, - kernelLauncher10, - kernelLauncher11, - kernelLauncher12, - kernelLauncher13, - kernelLauncher14, - kernelLauncher15, - kernelLauncher16 -}; - -void MiniCLKernel::updateLauncher() -{ - m_launcher = spLauncherList[m_numArgs]; -} - -struct MiniCLKernelDescEntry -{ - void* pCode; - char* pName; -}; -static MiniCLKernelDescEntry spKernelDesc[256]; -static int sNumKernelDesc = 0; - -MiniCLKernelDesc::MiniCLKernelDesc(void* pCode, char* pName) -{ - for(int i = 0; i < sNumKernelDesc; i++) - { - if(!strcmp(pName, spKernelDesc[i].pName)) - { // already registered - btAssert(spKernelDesc[i].pCode == pCode); - return; - } - } - spKernelDesc[sNumKernelDesc].pCode = pCode; - spKernelDesc[sNumKernelDesc].pName = pName; - sNumKernelDesc++; -} - - -MiniCLKernel* MiniCLKernel::registerSelf() -{ - m_scheduler->registerKernel(this); - for(int i = 0; i < sNumKernelDesc; i++) - { - if(!strcmp(m_name, spKernelDesc[i].pName)) - { - m_pCode = spKernelDesc[i].pCode; - return this; - } - } - return NULL; -} - -#endif - - -#endif //USE_SAMPLE_PROCESS +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com + +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. +*/ + +//#define __CELLOS_LV2__ 1 +#define __BT_SKIP_UINT64_H 1 + +#define USE_SAMPLE_PROCESS 1 +#ifdef USE_SAMPLE_PROCESS + + +#include "MiniCLTaskScheduler.h" +#include + +#ifdef __SPU__ + + + +void SampleThreadFunc(void* userPtr,void* lsMemory) +{ + //do nothing + printf("hello world\n"); +} + + +void* SamplelsMemoryFunc() +{ + //don't create local store memory, just return 0 + return 0; +} + + +#else + + +#include "BulletMultiThreaded/btThreadSupportInterface.h" + +//# include "SPUAssert.h" +#include + +#include "MiniCL/cl_platform.h" + +extern "C" { + extern char SPU_SAMPLE_ELF_SYMBOL[]; +} + + +MiniCLTaskScheduler::MiniCLTaskScheduler(btThreadSupportInterface* threadInterface, int maxNumOutstandingTasks) +:m_threadInterface(threadInterface), +m_maxNumOutstandingTasks(maxNumOutstandingTasks) +{ + + m_taskBusy.resize(m_maxNumOutstandingTasks); + m_spuSampleTaskDesc.resize(m_maxNumOutstandingTasks); + + m_kernels.resize(0); + + for (int i = 0; i < m_maxNumOutstandingTasks; i++) + { + m_taskBusy[i] = false; + } + m_numBusyTasks = 0; + m_currentTask = 0; + + m_initialized = false; + + m_threadInterface->startSPU(); + + +} + +MiniCLTaskScheduler::~MiniCLTaskScheduler() +{ + m_threadInterface->stopSPU(); + +} + + + +void MiniCLTaskScheduler::initialize() +{ +#ifdef DEBUG_SPU_TASK_SCHEDULING + printf("MiniCLTaskScheduler::initialize()\n"); +#endif //DEBUG_SPU_TASK_SCHEDULING + + for (int i = 0; i < m_maxNumOutstandingTasks; i++) + { + m_taskBusy[i] = false; + } + m_numBusyTasks = 0; + m_currentTask = 0; + m_initialized = true; + +} + + +void MiniCLTaskScheduler::issueTask(int firstWorkUnit, int lastWorkUnit, MiniCLKernel* kernel) +{ + +#ifdef DEBUG_SPU_TASK_SCHEDULING + printf("MiniCLTaskScheduler::issueTask (m_currentTask= %d\)n", m_currentTask); +#endif //DEBUG_SPU_TASK_SCHEDULING + + m_taskBusy[m_currentTask] = true; + m_numBusyTasks++; + + MiniCLTaskDesc& taskDesc = m_spuSampleTaskDesc[m_currentTask]; + { + // send task description in event message + taskDesc.m_firstWorkUnit = firstWorkUnit; + taskDesc.m_lastWorkUnit = lastWorkUnit; + taskDesc.m_kernel = kernel; + //some bookkeeping to recognize finished tasks + taskDesc.m_taskId = m_currentTask; + +// for (int i=0;im_numArgs; i++) + { + taskDesc.m_argSizes[i] = kernel->m_argSizes[i]; + if (taskDesc.m_argSizes[i]) + { + taskDesc.m_argData[i] = kernel->m_argData[i]; +// memcpy(&taskDesc.m_argData[i],&argData[MINICL_MAX_ARGLENGTH*i],taskDesc.m_argSizes[i]); + } + } + } + + + m_threadInterface->sendRequest(1, (ppu_address_t) &taskDesc, m_currentTask); + + // if all tasks busy, wait for spu event to clear the task. + + if (m_numBusyTasks >= m_maxNumOutstandingTasks) + { + unsigned int taskId; + unsigned int outputSize; + + for (int i=0;iwaitForResponse(&taskId, &outputSize); + + //printf("PPU: after issue, received event: %u %d\n", taskId, outputSize); + + postProcess(taskId, outputSize); + + m_taskBusy[taskId] = false; + + m_numBusyTasks--; + } + + // find new task buffer + for (int i = 0; i < m_maxNumOutstandingTasks; i++) + { + if (!m_taskBusy[i]) + { + m_currentTask = i; + break; + } + } +} + + +///Optional PPU-size post processing for each task +void MiniCLTaskScheduler::postProcess(int taskId, int outputSize) +{ + +} + + +void MiniCLTaskScheduler::flush() +{ +#ifdef DEBUG_SPU_TASK_SCHEDULING + printf("\nSpuCollisionTaskProcess::flush()\n"); +#endif //DEBUG_SPU_TASK_SCHEDULING + + + // all tasks are issued, wait for all tasks to be complete + while(m_numBusyTasks > 0) + { +// Consolidating SPU code + unsigned int taskId; + unsigned int outputSize; + + for (int i=0;iwaitForResponse(&taskId, &outputSize); + } + + //printf("PPU: flushing, received event: %u %d\n", taskId, outputSize); + + postProcess(taskId, outputSize); + + m_taskBusy[taskId] = false; + + m_numBusyTasks--; + } + + +} + + + +typedef void (*MiniCLKernelLauncher0)(int); +typedef void (*MiniCLKernelLauncher1)(void*, int); +typedef void (*MiniCLKernelLauncher2)(void*, void*, int); +typedef void (*MiniCLKernelLauncher3)(void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher4)(void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher5)(void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher6)(void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher7)(void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher8)(void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher9)(void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher10)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher11)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher12)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher13)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher14)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher15)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); +typedef void (*MiniCLKernelLauncher16)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, int); + + +static void kernelLauncher0(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher0)(taskDesc->m_kernel->m_launcher))(guid); +} +static void kernelLauncher1(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher1)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + guid); +} +static void kernelLauncher2(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher2)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + guid); +} +static void kernelLauncher3(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher3)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + guid); +} +static void kernelLauncher4(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher4)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + guid); +} +static void kernelLauncher5(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher5)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + guid); +} +static void kernelLauncher6(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher6)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + guid); +} +static void kernelLauncher7(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher7)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + guid); +} +static void kernelLauncher8(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher8)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + guid); +} +static void kernelLauncher9(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher9)(taskDesc->m_kernel->m_pCode))( taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + guid); +} +static void kernelLauncher10(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher10)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + guid); +} +static void kernelLauncher11(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher11)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + taskDesc->m_argData[10], + guid); +} +static void kernelLauncher12(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher12)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + taskDesc->m_argData[10], + taskDesc->m_argData[11], + guid); +} +static void kernelLauncher13(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher13)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + taskDesc->m_argData[10], + taskDesc->m_argData[11], + taskDesc->m_argData[12], + guid); +} +static void kernelLauncher14(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher14)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + taskDesc->m_argData[10], + taskDesc->m_argData[11], + taskDesc->m_argData[12], + taskDesc->m_argData[13], + guid); +} +static void kernelLauncher15(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher15)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + taskDesc->m_argData[10], + taskDesc->m_argData[11], + taskDesc->m_argData[12], + taskDesc->m_argData[13], + taskDesc->m_argData[14], + guid); +} +static void kernelLauncher16(MiniCLTaskDesc* taskDesc, int guid) +{ + ((MiniCLKernelLauncher16)(taskDesc->m_kernel->m_pCode))(taskDesc->m_argData[0], + taskDesc->m_argData[1], + taskDesc->m_argData[2], + taskDesc->m_argData[3], + taskDesc->m_argData[4], + taskDesc->m_argData[5], + taskDesc->m_argData[6], + taskDesc->m_argData[7], + taskDesc->m_argData[8], + taskDesc->m_argData[9], + taskDesc->m_argData[10], + taskDesc->m_argData[11], + taskDesc->m_argData[12], + taskDesc->m_argData[13], + taskDesc->m_argData[14], + taskDesc->m_argData[15], + guid); +} + +static kernelLauncherCB spLauncherList[MINI_CL_MAX_ARG+1] = +{ + kernelLauncher0, + kernelLauncher1, + kernelLauncher2, + kernelLauncher3, + kernelLauncher4, + kernelLauncher5, + kernelLauncher6, + kernelLauncher7, + kernelLauncher8, + kernelLauncher9, + kernelLauncher10, + kernelLauncher11, + kernelLauncher12, + kernelLauncher13, + kernelLauncher14, + kernelLauncher15, + kernelLauncher16 +}; + +void MiniCLKernel::updateLauncher() +{ + m_launcher = spLauncherList[m_numArgs]; +} + +struct MiniCLKernelDescEntry +{ + void* pCode; + char* pName; +}; +static MiniCLKernelDescEntry spKernelDesc[256]; +static int sNumKernelDesc = 0; + +MiniCLKernelDesc::MiniCLKernelDesc(void* pCode, char* pName) +{ + for(int i = 0; i < sNumKernelDesc; i++) + { + if(!strcmp(pName, spKernelDesc[i].pName)) + { // already registered + btAssert(spKernelDesc[i].pCode == pCode); + return; + } + } + spKernelDesc[sNumKernelDesc].pCode = pCode; + spKernelDesc[sNumKernelDesc].pName = pName; + sNumKernelDesc++; +} + + +MiniCLKernel* MiniCLKernel::registerSelf() +{ + m_scheduler->registerKernel(this); + for(int i = 0; i < sNumKernelDesc; i++) + { + if(!strcmp(m_name, spKernelDesc[i].pName)) + { + m_pCode = spKernelDesc[i].pCode; + return this; + } + } + return NULL; +} + +#endif + + +#endif //USE_SAMPLE_PROCESS diff --git a/src/BulletMultiThreaded/SpuFakeDma.h b/src/BulletMultiThreaded/SpuFakeDma.h index a0f256c0d..f5e49b7be 100644 --- a/src/BulletMultiThreaded/SpuFakeDma.h +++ b/src/BulletMultiThreaded/SpuFakeDma.h @@ -1,135 +1,135 @@ -/* -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 FAKE_DMA_H -#define FAKE_DMA_H - - -#include "PlatformDefinitions.h" -#include "LinearMath/btScalar.h" - - -#ifdef __SPU__ - -#ifndef USE_LIBSPE2 - -#include -#include - -#define DMA_TAG(xfer) (xfer + 1) -#define DMA_MASK(xfer) (1 << DMA_TAG(xfer)) - -#else // !USE_LIBSPE2 - -#define DMA_TAG(xfer) (xfer + 1) -#define DMA_MASK(xfer) (1 << DMA_TAG(xfer)) - -#include - -#define DEBUG_DMA -#ifdef DEBUG_DMA -#define dUASSERT(a,b) if (!(a)) { printf(b);} -#define uintsize ppu_address_t - -#define cellDmaLargeGet(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ - dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ - dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ - dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ - dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ - dUASSERT(size < 16384, "size too big: "); \ - dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ - dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ - printf("GET %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ea,(unsigned int)ls,(unsigned int)size);\ - } \ - mfc_get(ls, ea, size, tag, tid, rid) -#define cellDmaGet(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ - dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ - dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ - dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ - dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ - dUASSERT(size < 16384, "size too big: "); \ - dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ - dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ - printf("GET %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ea,(unsigned int)ls,(unsigned int)size);\ - } \ - mfc_get(ls, ea, size, tag, tid, rid) -#define cellDmaLargePut(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ - dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ - dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ - dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ - dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ - dUASSERT(size < 16384, "size too big: "); \ - dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ - dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ - printf("PUT %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ls,(unsigned int)ea,(unsigned int)size); \ - } \ - mfc_put(ls, ea, size, tag, tid, rid) -#define cellDmaSmallGet(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ - dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ - dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ - dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ - dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ - dUASSERT(size < 16384, "size too big: "); \ - dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ - dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ - printf("GET %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ea,(unsigned int)ls,(unsigned int)size);\ - } \ - mfc_get(ls, ea, size, tag, tid, rid) -#define cellDmaWaitTagStatusAll(ignore) mfc_write_tag_mask(ignore) ; mfc_read_tag_status_all() - -#else -#define cellDmaLargeGet(ls, ea, size, tag, tid, rid) mfc_get(ls, ea, size, tag, tid, rid) -#define cellDmaGet(ls, ea, size, tag, tid, rid) mfc_get(ls, ea, size, tag, tid, rid) -#define cellDmaLargePut(ls, ea, size, tag, tid, rid) mfc_put(ls, ea, size, tag, tid, rid) -#define cellDmaSmallGet(ls, ea, size, tag, tid, rid) mfc_get(ls, ea, size, tag, tid, rid) -#define cellDmaWaitTagStatusAll(ignore) mfc_write_tag_mask(ignore) ; mfc_read_tag_status_all() -#endif // DEBUG_DMA - - - - - - - - -#endif // USE_LIBSPE2 -#else // !__SPU__ -//Simulate DMA using memcpy or direct access on non-CELL platforms that don't have DMAs and SPUs (Win32, Mac, Linux etc) -//Potential to add networked simulation using this interface - -#define DMA_TAG(a) (a) -#define DMA_MASK(a) (a) - - /// cellDmaLargeGet Win32 replacements for Cell DMA to allow simulating most of the SPU code (just memcpy) - int cellDmaLargeGet(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); - int cellDmaGet(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); - /// cellDmaLargePut Win32 replacements for Cell DMA to allow simulating most of the SPU code (just memcpy) - int cellDmaLargePut(const void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); - /// cellDmaWaitTagStatusAll Win32 replacements for Cell DMA to allow simulating most of the SPU code (just memcpy) - void cellDmaWaitTagStatusAll(int ignore); - - -#endif //__CELLOS_LV2__ - -///stallingUnalignedDmaSmallGet internally uses DMA_TAG(1) -int stallingUnalignedDmaSmallGet(void *ls, uint64_t ea, uint32_t size); - - -void* cellDmaLargeGetReadOnly(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); -void* cellDmaGetReadOnly(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); -void* cellDmaSmallGetReadOnly(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); - - -#endif //FAKE_DMA_H +/* +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 FAKE_DMA_H +#define FAKE_DMA_H + + +#include "PlatformDefinitions.h" +#include "LinearMath/btScalar.h" + + +#ifdef __SPU__ + +#ifndef USE_LIBSPE2 + +#include +#include + +#define DMA_TAG(xfer) (xfer + 1) +#define DMA_MASK(xfer) (1 << DMA_TAG(xfer)) + +#else // !USE_LIBSPE2 + +#define DMA_TAG(xfer) (xfer + 1) +#define DMA_MASK(xfer) (1 << DMA_TAG(xfer)) + +#include + +#define DEBUG_DMA +#ifdef DEBUG_DMA +#define dUASSERT(a,b) if (!(a)) { printf(b);} +#define uintsize ppu_address_t + +#define cellDmaLargeGet(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ + dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ + dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ + dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ + dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ + dUASSERT(size < 16384, "size too big: "); \ + dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ + dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ + printf("GET %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ea,(unsigned int)ls,(unsigned int)size);\ + } \ + mfc_get(ls, ea, size, tag, tid, rid) +#define cellDmaGet(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ + dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ + dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ + dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ + dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ + dUASSERT(size < 16384, "size too big: "); \ + dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ + dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ + printf("GET %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ea,(unsigned int)ls,(unsigned int)size);\ + } \ + mfc_get(ls, ea, size, tag, tid, rid) +#define cellDmaLargePut(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ + dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ + dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ + dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ + dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ + dUASSERT(size < 16384, "size too big: "); \ + dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ + dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ + printf("PUT %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ls,(unsigned int)ea,(unsigned int)size); \ + } \ + mfc_put(ls, ea, size, tag, tid, rid) +#define cellDmaSmallGet(ls, ea, size, tag, tid, rid) if ( (((uintsize)ls%16) != ((uintsize)ea%16)) || ((((uintsize)ea%16) || ((uintsize)ls%16)) && (( ((uintsize)ls%16) != ((uintsize)size%16) ) || ( ((uintsize)ea%16) != ((uintsize)size%16) ) ) ) || ( ((uintsize)size%16) && ((uintsize)size!=1) && ((uintsize)size!=2) && ((uintsize)size!=4) && ((uintsize)size!=8) ) || (size >= 16384) || !(uintsize)ls || !(uintsize)ea) { \ + dUASSERT( (((uintsize)ea % 16) == 0) || (size < 16), "XDR Address not aligned: "); \ + dUASSERT( (((uintsize)ls % 16) == 0) || (size < 16), "LS Address not aligned: "); \ + dUASSERT( ((((uintsize)ls % size) == 0) && (((uintsize)ea % size) == 0)) || (size > 16), "Not naturally aligned: "); \ + dUASSERT((size == 1) || (size == 2) || (size == 4) || (size == 8) || ((size % 16) == 0), "size not a multiple of 16byte: "); \ + dUASSERT(size < 16384, "size too big: "); \ + dUASSERT( ((uintsize)ea%16)==((uintsize)ls%16), "wrong Quadword alignment of LS and EA: "); \ + dUASSERT(ea != 0, "Nullpointer EA: "); dUASSERT(ls != 0, "Nullpointer LS: ");\ + printf("GET %s:%d from: 0x%x, to: 0x%x - %d bytes\n", __FILE__, __LINE__, (unsigned int)ea,(unsigned int)ls,(unsigned int)size);\ + } \ + mfc_get(ls, ea, size, tag, tid, rid) +#define cellDmaWaitTagStatusAll(ignore) mfc_write_tag_mask(ignore) ; mfc_read_tag_status_all() + +#else +#define cellDmaLargeGet(ls, ea, size, tag, tid, rid) mfc_get(ls, ea, size, tag, tid, rid) +#define cellDmaGet(ls, ea, size, tag, tid, rid) mfc_get(ls, ea, size, tag, tid, rid) +#define cellDmaLargePut(ls, ea, size, tag, tid, rid) mfc_put(ls, ea, size, tag, tid, rid) +#define cellDmaSmallGet(ls, ea, size, tag, tid, rid) mfc_get(ls, ea, size, tag, tid, rid) +#define cellDmaWaitTagStatusAll(ignore) mfc_write_tag_mask(ignore) ; mfc_read_tag_status_all() +#endif // DEBUG_DMA + + + + + + + + +#endif // USE_LIBSPE2 +#else // !__SPU__ +//Simulate DMA using memcpy or direct access on non-CELL platforms that don't have DMAs and SPUs (Win32, Mac, Linux etc) +//Potential to add networked simulation using this interface + +#define DMA_TAG(a) (a) +#define DMA_MASK(a) (a) + + /// cellDmaLargeGet Win32 replacements for Cell DMA to allow simulating most of the SPU code (just memcpy) + int cellDmaLargeGet(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); + int cellDmaGet(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); + /// cellDmaLargePut Win32 replacements for Cell DMA to allow simulating most of the SPU code (just memcpy) + int cellDmaLargePut(const void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); + /// cellDmaWaitTagStatusAll Win32 replacements for Cell DMA to allow simulating most of the SPU code (just memcpy) + void cellDmaWaitTagStatusAll(int ignore); + + +#endif //__CELLOS_LV2__ + +///stallingUnalignedDmaSmallGet internally uses DMA_TAG(1) +int stallingUnalignedDmaSmallGet(void *ls, uint64_t ea, uint32_t size); + + +void* cellDmaLargeGetReadOnly(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); +void* cellDmaGetReadOnly(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); +void* cellDmaSmallGetReadOnly(void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid); + + +#endif //FAKE_DMA_H diff --git a/src/BulletMultiThreaded/btGpu3DGridBroadphase.cpp b/src/BulletMultiThreaded/btGpu3DGridBroadphase.cpp index ea0f7e980..84a5e59f0 100644 --- a/src/BulletMultiThreaded/btGpu3DGridBroadphase.cpp +++ b/src/BulletMultiThreaded/btGpu3DGridBroadphase.cpp @@ -1,590 +1,590 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. - -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. -*/ - -///The 3 following lines include the CPU implementation of the kernels, keep them in this order. -#include "BulletMultiThreaded/btGpuDefines.h" -#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" -#include "BulletMultiThreaded/btGpuUtilsSharedCode.h" - - - -#include "LinearMath/btAlignedAllocator.h" -#include "LinearMath/btQuickprof.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" - - - -#include "btGpuDefines.h" -#include "btGpuUtilsSharedDefs.h" - -#include "btGpu3DGridBroadphaseSharedDefs.h" - -#include "btGpu3DGridBroadphase.h" -#include //for memset - - -#include - - - -static bt3DGridBroadphaseParams s3DGridBroadphaseParams; - - - -btGpu3DGridBroadphase::btGpu3DGridBroadphase( const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell, - btScalar cellFactorAABB) : - btSimpleBroadphase(maxSmallProxies, -// new (btAlignedAlloc(sizeof(btSortedOverlappingPairCache),16)) btSortedOverlappingPairCache), - new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache), - m_bInitialized(false), - m_numBodies(0) -{ - _initialize(worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, - maxSmallProxies, maxLargeProxies, maxPairsPerBody, - maxBodiesPerCell, cellFactorAABB); -} - - - -btGpu3DGridBroadphase::btGpu3DGridBroadphase( btOverlappingPairCache* overlappingPairCache, - const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell, - btScalar cellFactorAABB) : - btSimpleBroadphase(maxSmallProxies, overlappingPairCache), - m_bInitialized(false), - m_numBodies(0) -{ - _initialize(worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, - maxSmallProxies, maxLargeProxies, maxPairsPerBody, - maxBodiesPerCell, cellFactorAABB); -} - - - -btGpu3DGridBroadphase::~btGpu3DGridBroadphase() -{ - //btSimpleBroadphase will free memory of btSortedOverlappingPairCache, because m_ownsPairCache - assert(m_bInitialized); - _finalize(); -} - - - -void btGpu3DGridBroadphase::_initialize( const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell, - btScalar cellFactorAABB) -{ - // set various paramerers - m_ownsPairCache = true; - m_params.m_gridSizeX = gridSizeX; - m_params.m_gridSizeY = gridSizeY; - m_params.m_gridSizeZ = gridSizeZ; - m_params.m_numCells = m_params.m_gridSizeX * m_params.m_gridSizeY * m_params.m_gridSizeZ; - btVector3 w_org = worldAabbMin; - m_params.m_worldOriginX = w_org.getX(); - m_params.m_worldOriginY = w_org.getY(); - m_params.m_worldOriginZ = w_org.getZ(); - btVector3 w_size = worldAabbMax - worldAabbMin; - m_params.m_cellSizeX = w_size.getX() / m_params.m_gridSizeX; - m_params.m_cellSizeY = w_size.getY() / m_params.m_gridSizeY; - m_params.m_cellSizeZ = w_size.getZ() / m_params.m_gridSizeZ; - m_maxRadius = btMin(btMin(m_params.m_cellSizeX, m_params.m_cellSizeY), m_params.m_cellSizeZ); - m_maxRadius *= btScalar(0.5f); - m_params.m_numBodies = m_numBodies; - m_params.m_maxBodiesPerCell = maxBodiesPerCell; - - m_numLargeHandles = 0; - m_maxLargeHandles = maxLargeProxies; - - m_maxPairsPerBody = maxPairsPerBody; - - m_cellFactorAABB = cellFactorAABB; - - m_LastLargeHandleIndex = -1; - - assert(!m_bInitialized); - // allocate host storage - m_hBodiesHash = new unsigned int[m_maxHandles * 2]; - memset(m_hBodiesHash, 0x00, m_maxHandles*2*sizeof(unsigned int)); - - m_hCellStart = new unsigned int[m_params.m_numCells]; - memset(m_hCellStart, 0x00, m_params.m_numCells * sizeof(unsigned int)); - - m_hPairBuffStartCurr = new unsigned int[m_maxHandles * 2 + 2]; - // --------------- for now, init with m_maxPairsPerBody for each body - m_hPairBuffStartCurr[0] = 0; - m_hPairBuffStartCurr[1] = 0; - for(int i = 1; i <= m_maxHandles; i++) - { - m_hPairBuffStartCurr[i * 2] = m_hPairBuffStartCurr[(i-1) * 2] + m_maxPairsPerBody; - m_hPairBuffStartCurr[i * 2 + 1] = 0; - } - //---------------- - unsigned int numAABB = m_maxHandles + m_maxLargeHandles; - m_hAABB = new bt3DGrid3F1U[numAABB * 2]; // AABB Min & Max - - m_hPairBuff = new unsigned int[m_maxHandles * m_maxPairsPerBody]; - memset(m_hPairBuff, 0x00, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); // needed? - - m_hPairScan = new unsigned int[m_maxHandles + 1]; - - m_hPairOut = new unsigned int[m_maxHandles * m_maxPairsPerBody]; - -// large proxies - - // allocate handles buffer and put all handles on free list - m_pLargeHandlesRawPtr = btAlignedAlloc(sizeof(btSimpleBroadphaseProxy) * m_maxLargeHandles, 16); - m_pLargeHandles = new(m_pLargeHandlesRawPtr) btSimpleBroadphaseProxy[m_maxLargeHandles]; - m_firstFreeLargeHandle = 0; - { - for (int i = m_firstFreeLargeHandle; i < m_maxLargeHandles; i++) - { - m_pLargeHandles[i].SetNextFree(i + 1); - m_pLargeHandles[i].m_uniqueId = m_maxHandles+2+i; - } - m_pLargeHandles[m_maxLargeHandles - 1].SetNextFree(0); - } - -// debug data - m_numPairsAdded = 0; - m_numOverflows = 0; - - m_bInitialized = true; -} - - - -void btGpu3DGridBroadphase::_finalize() -{ - assert(m_bInitialized); - delete [] m_hBodiesHash; - delete [] m_hCellStart; - delete [] m_hPairBuffStartCurr; - delete [] m_hAABB; - delete [] m_hPairBuff; - delete [] m_hPairScan; - delete [] m_hPairOut; - btAlignedFree(m_pLargeHandlesRawPtr); - m_bInitialized = false; -} - - - -void btGpu3DGridBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher) -{ - if(m_numHandles <= 0) - { - BT_PROFILE("addLarge2LargePairsToCache"); - addLarge2LargePairsToCache(dispatcher); - return; - } - // update constants - setParameters(&m_params); - // prepare AABB array - prepareAABB(); - // calculate hash - calcHashAABB(); - // sort bodies based on hash - sortHash(); - // find start of each cell - findCellStart(); - // findOverlappingPairs (small/small) - findOverlappingPairs(); - // findOverlappingPairs (small/large) - findPairsLarge(); - // add pairs to CPU cache - computePairCacheChanges(); - scanOverlappingPairBuff(); - squeezeOverlappingPairBuff(); - addPairsToCache(dispatcher); - // find and add large/large pairs to CPU cache - addLarge2LargePairsToCache(dispatcher); - return; -} - - - -void btGpu3DGridBroadphase::addPairsToCache(btDispatcher* dispatcher) -{ - m_numPairsAdded = 0; - m_numPairsRemoved = 0; - for(int i = 0; i < m_numHandles; i++) - { - unsigned int num = m_hPairScan[i+1] - m_hPairScan[i]; - if(!num) - { - continue; - } - unsigned int* pInp = m_hPairOut + m_hPairScan[i]; - unsigned int index0 = m_hAABB[i * 2].uw; - btSimpleBroadphaseProxy* proxy0 = &m_pHandles[index0]; - for(unsigned int j = 0; j < num; j++) - { - unsigned int indx1_s = pInp[j]; - unsigned int index1 = indx1_s & (~BT_3DGRID_PAIR_ANY_FLG); - btSimpleBroadphaseProxy* proxy1; - if(index1 < (unsigned int)m_maxHandles) - { - proxy1 = &m_pHandles[index1]; - } - else - { - index1 -= m_maxHandles; - btAssert((index1 >= 0) && (index1 < (unsigned int)m_maxLargeHandles)); - proxy1 = &m_pLargeHandles[index1]; - } - if(indx1_s & BT_3DGRID_PAIR_NEW_FLG) - { - m_pairCache->addOverlappingPair(proxy0,proxy1); - m_numPairsAdded++; - } - else - { - m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); - m_numPairsRemoved++; - } - } - } -} - - - -btBroadphaseProxy* btGpu3DGridBroadphase::createProxy( const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy) -{ - btBroadphaseProxy* proxy; - bool bIsLarge = isLargeProxy(aabbMin, aabbMax); - if(bIsLarge) - { - if (m_numLargeHandles >= m_maxLargeHandles) - { - ///you have to increase the cell size, so 'large' proxies become 'small' proxies (fitting a cell) - btAssert(0); - return 0; //should never happen, but don't let the game crash ;-) - } - btAssert((aabbMin[0]<= aabbMax[0]) && (aabbMin[1]<= aabbMax[1]) && (aabbMin[2]<= aabbMax[2])); - int newHandleIndex = allocLargeHandle(); - proxy = new (&m_pLargeHandles[newHandleIndex])btSimpleBroadphaseProxy(aabbMin,aabbMax,shapeType,userPtr,collisionFilterGroup,collisionFilterMask,multiSapProxy); - } - else - { - proxy = btSimpleBroadphase::createProxy(aabbMin, aabbMax, shapeType, userPtr, collisionFilterGroup, collisionFilterMask, dispatcher, multiSapProxy); - } - return proxy; -} - - - -void btGpu3DGridBroadphase::destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher) -{ - bool bIsLarge = isLargeProxy(proxy); - if(bIsLarge) - { - - btSimpleBroadphaseProxy* proxy0 = static_cast(proxy); - freeLargeHandle(proxy0); - m_pairCache->removeOverlappingPairsContainingProxy(proxy,dispatcher); - } - else - { - btSimpleBroadphase::destroyProxy(proxy, dispatcher); - } - return; -} - - - -void btGpu3DGridBroadphase::resetPool(btDispatcher* dispatcher) -{ - m_hPairBuffStartCurr[0] = 0; - m_hPairBuffStartCurr[1] = 0; - for(int i = 1; i <= m_maxHandles; i++) - { - m_hPairBuffStartCurr[i * 2] = m_hPairBuffStartCurr[(i-1) * 2] + m_maxPairsPerBody; - m_hPairBuffStartCurr[i * 2 + 1] = 0; - } -} - - - -bool btGpu3DGridBroadphase::isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax) -{ - btVector3 diag = aabbMax - aabbMin; - - ///use the bounding sphere radius of this bounding box, to include rotation - btScalar radius = diag.length() * btScalar(0.5f); - radius *= m_cellFactorAABB; // user-defined factor - - return (radius > m_maxRadius); -} - - - -bool btGpu3DGridBroadphase::isLargeProxy(btBroadphaseProxy* proxy) -{ - return (proxy->getUid() >= (m_maxHandles+2)); -} - - - -void btGpu3DGridBroadphase::addLarge2LargePairsToCache(btDispatcher* dispatcher) -{ - int i,j; - if (m_numLargeHandles <= 0) - { - return; - } - int new_largest_index = -1; - for(i = 0; i <= m_LastLargeHandleIndex; i++) - { - btSimpleBroadphaseProxy* proxy0 = &m_pLargeHandles[i]; - if(!proxy0->m_clientObject) - { - continue; - } - new_largest_index = i; - for(j = i + 1; j <= m_LastLargeHandleIndex; j++) - { - btSimpleBroadphaseProxy* proxy1 = &m_pLargeHandles[j]; - if(!proxy1->m_clientObject) - { - continue; - } - btAssert(proxy0 != proxy1); - btSimpleBroadphaseProxy* p0 = getSimpleProxyFromProxy(proxy0); - btSimpleBroadphaseProxy* p1 = getSimpleProxyFromProxy(proxy1); - if(aabbOverlap(p0,p1)) - { - if (!m_pairCache->findPair(proxy0,proxy1)) - { - m_pairCache->addOverlappingPair(proxy0,proxy1); - } - } - else - { - if(m_pairCache->findPair(proxy0,proxy1)) - { - m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); - } - } - } - } - m_LastLargeHandleIndex = new_largest_index; - return; -} - - - -void btGpu3DGridBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback) -{ - btSimpleBroadphase::rayTest(rayFrom, rayTo, rayCallback); - for (int i=0; i <= m_LastLargeHandleIndex; i++) - { - btSimpleBroadphaseProxy* proxy = &m_pLargeHandles[i]; - if(!proxy->m_clientObject) - { - continue; - } - rayCallback.process(proxy); - } -} - - - -// -// overrides for CPU version -// - - - -void btGpu3DGridBroadphase::prepareAABB() -{ - BT_PROFILE("prepareAABB"); - bt3DGrid3F1U* pBB = m_hAABB; - int i; - int new_largest_index = -1; - unsigned int num_small = 0; - for(i = 0; i <= m_LastHandleIndex; i++) - { - btSimpleBroadphaseProxy* proxy0 = &m_pHandles[i]; - if(!proxy0->m_clientObject) - { - continue; - } - new_largest_index = i; - pBB->fx = proxy0->m_aabbMin.getX(); - pBB->fy = proxy0->m_aabbMin.getY(); - pBB->fz = proxy0->m_aabbMin.getZ(); - pBB->uw = i; - pBB++; - pBB->fx = proxy0->m_aabbMax.getX(); - pBB->fy = proxy0->m_aabbMax.getY(); - pBB->fz = proxy0->m_aabbMax.getZ(); - pBB->uw = num_small; - pBB++; - num_small++; - } - m_LastHandleIndex = new_largest_index; - new_largest_index = -1; - unsigned int num_large = 0; - for(i = 0; i <= m_LastLargeHandleIndex; i++) - { - btSimpleBroadphaseProxy* proxy0 = &m_pLargeHandles[i]; - if(!proxy0->m_clientObject) - { - continue; - } - new_largest_index = i; - pBB->fx = proxy0->m_aabbMin.getX(); - pBB->fy = proxy0->m_aabbMin.getY(); - pBB->fz = proxy0->m_aabbMin.getZ(); - pBB->uw = i + m_maxHandles; - pBB++; - pBB->fx = proxy0->m_aabbMax.getX(); - pBB->fy = proxy0->m_aabbMax.getY(); - pBB->fz = proxy0->m_aabbMax.getZ(); - pBB->uw = num_large + m_maxHandles; - pBB++; - num_large++; - } - m_LastLargeHandleIndex = new_largest_index; - // paranoid checks - btAssert(num_small == m_numHandles); - btAssert(num_large == m_numLargeHandles); - return; -} - - - -void btGpu3DGridBroadphase::setParameters(bt3DGridBroadphaseParams* hostParams) -{ - s3DGridBroadphaseParams = *hostParams; - return; -} - - - -void btGpu3DGridBroadphase::calcHashAABB() -{ - BT_PROFILE("bt3DGrid_calcHashAABB"); - btGpu_calcHashAABB(m_hAABB, m_hBodiesHash, m_numHandles); - return; -} - - - -void btGpu3DGridBroadphase::sortHash() -{ - class bt3DGridHashKey - { - public: - unsigned int hash; - unsigned int index; - void quickSort(bt3DGridHashKey* pData, int lo, int hi) - { - int i=lo, j=hi; - bt3DGridHashKey x = pData[(lo+hi)/2]; - do - { - while(pData[i].hash > x.hash) i++; - while(x.hash > pData[j].hash) j--; - if(i <= j) - { - bt3DGridHashKey t = pData[i]; - pData[i] = pData[j]; - pData[j] = t; - i++; j--; - } - } while(i <= j); - if(lo < j) pData->quickSort(pData, lo, j); - if(i < hi) pData->quickSort(pData, i, hi); - } - }; - BT_PROFILE("bt3DGrid_sortHash"); - bt3DGridHashKey* pHash = (bt3DGridHashKey*)m_hBodiesHash; - pHash->quickSort(pHash, 0, m_numHandles - 1); - return; -} - - - -void btGpu3DGridBroadphase::findCellStart() -{ - BT_PROFILE("bt3DGrid_findCellStart"); - btGpu_findCellStart(m_hBodiesHash, m_hCellStart, m_numHandles, m_params.m_numCells); - return; -} - - - -void btGpu3DGridBroadphase::findOverlappingPairs() -{ - BT_PROFILE("bt3DGrid_findOverlappingPairs"); - btGpu_findOverlappingPairs(m_hAABB, m_hBodiesHash, m_hCellStart, m_hPairBuff, m_hPairBuffStartCurr, m_numHandles); - return; -} - - - -void btGpu3DGridBroadphase::findPairsLarge() -{ - BT_PROFILE("bt3DGrid_findPairsLarge"); - btGpu_findPairsLarge(m_hAABB, m_hBodiesHash, m_hCellStart, m_hPairBuff, m_hPairBuffStartCurr, m_numHandles, m_numLargeHandles); - return; -} - - - -void btGpu3DGridBroadphase::computePairCacheChanges() -{ - BT_PROFILE("bt3DGrid_computePairCacheChanges"); - btGpu_computePairCacheChanges(m_hPairBuff, m_hPairBuffStartCurr, m_hPairScan, m_hAABB, m_numHandles); - return; -} - - - -void btGpu3DGridBroadphase::scanOverlappingPairBuff() -{ - BT_PROFILE("bt3DGrid_scanOverlappingPairBuff"); - m_hPairScan[0] = 0; - for(int i = 1; i <= m_numHandles; i++) - { - unsigned int delta = m_hPairScan[i]; - m_hPairScan[i] = m_hPairScan[i-1] + delta; - } - return; -} - - - -void btGpu3DGridBroadphase::squeezeOverlappingPairBuff() -{ - BT_PROFILE("bt3DGrid_squeezeOverlappingPairBuff"); - btGpu_squeezeOverlappingPairBuff(m_hPairBuff, m_hPairBuffStartCurr, m_hPairScan, m_hPairOut, m_hAABB, m_numHandles); - return; -} - - - -#include "btGpu3DGridBroadphaseSharedCode.h" - - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. + +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. +*/ + +///The 3 following lines include the CPU implementation of the kernels, keep them in this order. +#include "BulletMultiThreaded/btGpuDefines.h" +#include "BulletMultiThreaded/btGpuUtilsSharedDefs.h" +#include "BulletMultiThreaded/btGpuUtilsSharedCode.h" + + + +#include "LinearMath/btAlignedAllocator.h" +#include "LinearMath/btQuickprof.h" +#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" + + + +#include "btGpuDefines.h" +#include "btGpuUtilsSharedDefs.h" + +#include "btGpu3DGridBroadphaseSharedDefs.h" + +#include "btGpu3DGridBroadphase.h" +#include //for memset + + +#include + + + +static bt3DGridBroadphaseParams s3DGridBroadphaseParams; + + + +btGpu3DGridBroadphase::btGpu3DGridBroadphase( const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell, + btScalar cellFactorAABB) : + btSimpleBroadphase(maxSmallProxies, +// new (btAlignedAlloc(sizeof(btSortedOverlappingPairCache),16)) btSortedOverlappingPairCache), + new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache), + m_bInitialized(false), + m_numBodies(0) +{ + _initialize(worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, + maxSmallProxies, maxLargeProxies, maxPairsPerBody, + maxBodiesPerCell, cellFactorAABB); +} + + + +btGpu3DGridBroadphase::btGpu3DGridBroadphase( btOverlappingPairCache* overlappingPairCache, + const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell, + btScalar cellFactorAABB) : + btSimpleBroadphase(maxSmallProxies, overlappingPairCache), + m_bInitialized(false), + m_numBodies(0) +{ + _initialize(worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, + maxSmallProxies, maxLargeProxies, maxPairsPerBody, + maxBodiesPerCell, cellFactorAABB); +} + + + +btGpu3DGridBroadphase::~btGpu3DGridBroadphase() +{ + //btSimpleBroadphase will free memory of btSortedOverlappingPairCache, because m_ownsPairCache + assert(m_bInitialized); + _finalize(); +} + + + +void btGpu3DGridBroadphase::_initialize( const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell, + btScalar cellFactorAABB) +{ + // set various paramerers + m_ownsPairCache = true; + m_params.m_gridSizeX = gridSizeX; + m_params.m_gridSizeY = gridSizeY; + m_params.m_gridSizeZ = gridSizeZ; + m_params.m_numCells = m_params.m_gridSizeX * m_params.m_gridSizeY * m_params.m_gridSizeZ; + btVector3 w_org = worldAabbMin; + m_params.m_worldOriginX = w_org.getX(); + m_params.m_worldOriginY = w_org.getY(); + m_params.m_worldOriginZ = w_org.getZ(); + btVector3 w_size = worldAabbMax - worldAabbMin; + m_params.m_cellSizeX = w_size.getX() / m_params.m_gridSizeX; + m_params.m_cellSizeY = w_size.getY() / m_params.m_gridSizeY; + m_params.m_cellSizeZ = w_size.getZ() / m_params.m_gridSizeZ; + m_maxRadius = btMin(btMin(m_params.m_cellSizeX, m_params.m_cellSizeY), m_params.m_cellSizeZ); + m_maxRadius *= btScalar(0.5f); + m_params.m_numBodies = m_numBodies; + m_params.m_maxBodiesPerCell = maxBodiesPerCell; + + m_numLargeHandles = 0; + m_maxLargeHandles = maxLargeProxies; + + m_maxPairsPerBody = maxPairsPerBody; + + m_cellFactorAABB = cellFactorAABB; + + m_LastLargeHandleIndex = -1; + + assert(!m_bInitialized); + // allocate host storage + m_hBodiesHash = new unsigned int[m_maxHandles * 2]; + memset(m_hBodiesHash, 0x00, m_maxHandles*2*sizeof(unsigned int)); + + m_hCellStart = new unsigned int[m_params.m_numCells]; + memset(m_hCellStart, 0x00, m_params.m_numCells * sizeof(unsigned int)); + + m_hPairBuffStartCurr = new unsigned int[m_maxHandles * 2 + 2]; + // --------------- for now, init with m_maxPairsPerBody for each body + m_hPairBuffStartCurr[0] = 0; + m_hPairBuffStartCurr[1] = 0; + for(int i = 1; i <= m_maxHandles; i++) + { + m_hPairBuffStartCurr[i * 2] = m_hPairBuffStartCurr[(i-1) * 2] + m_maxPairsPerBody; + m_hPairBuffStartCurr[i * 2 + 1] = 0; + } + //---------------- + unsigned int numAABB = m_maxHandles + m_maxLargeHandles; + m_hAABB = new bt3DGrid3F1U[numAABB * 2]; // AABB Min & Max + + m_hPairBuff = new unsigned int[m_maxHandles * m_maxPairsPerBody]; + memset(m_hPairBuff, 0x00, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); // needed? + + m_hPairScan = new unsigned int[m_maxHandles + 1]; + + m_hPairOut = new unsigned int[m_maxHandles * m_maxPairsPerBody]; + +// large proxies + + // allocate handles buffer and put all handles on free list + m_pLargeHandlesRawPtr = btAlignedAlloc(sizeof(btSimpleBroadphaseProxy) * m_maxLargeHandles, 16); + m_pLargeHandles = new(m_pLargeHandlesRawPtr) btSimpleBroadphaseProxy[m_maxLargeHandles]; + m_firstFreeLargeHandle = 0; + { + for (int i = m_firstFreeLargeHandle; i < m_maxLargeHandles; i++) + { + m_pLargeHandles[i].SetNextFree(i + 1); + m_pLargeHandles[i].m_uniqueId = m_maxHandles+2+i; + } + m_pLargeHandles[m_maxLargeHandles - 1].SetNextFree(0); + } + +// debug data + m_numPairsAdded = 0; + m_numOverflows = 0; + + m_bInitialized = true; +} + + + +void btGpu3DGridBroadphase::_finalize() +{ + assert(m_bInitialized); + delete [] m_hBodiesHash; + delete [] m_hCellStart; + delete [] m_hPairBuffStartCurr; + delete [] m_hAABB; + delete [] m_hPairBuff; + delete [] m_hPairScan; + delete [] m_hPairOut; + btAlignedFree(m_pLargeHandlesRawPtr); + m_bInitialized = false; +} + + + +void btGpu3DGridBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher) +{ + if(m_numHandles <= 0) + { + BT_PROFILE("addLarge2LargePairsToCache"); + addLarge2LargePairsToCache(dispatcher); + return; + } + // update constants + setParameters(&m_params); + // prepare AABB array + prepareAABB(); + // calculate hash + calcHashAABB(); + // sort bodies based on hash + sortHash(); + // find start of each cell + findCellStart(); + // findOverlappingPairs (small/small) + findOverlappingPairs(); + // findOverlappingPairs (small/large) + findPairsLarge(); + // add pairs to CPU cache + computePairCacheChanges(); + scanOverlappingPairBuff(); + squeezeOverlappingPairBuff(); + addPairsToCache(dispatcher); + // find and add large/large pairs to CPU cache + addLarge2LargePairsToCache(dispatcher); + return; +} + + + +void btGpu3DGridBroadphase::addPairsToCache(btDispatcher* dispatcher) +{ + m_numPairsAdded = 0; + m_numPairsRemoved = 0; + for(int i = 0; i < m_numHandles; i++) + { + unsigned int num = m_hPairScan[i+1] - m_hPairScan[i]; + if(!num) + { + continue; + } + unsigned int* pInp = m_hPairOut + m_hPairScan[i]; + unsigned int index0 = m_hAABB[i * 2].uw; + btSimpleBroadphaseProxy* proxy0 = &m_pHandles[index0]; + for(unsigned int j = 0; j < num; j++) + { + unsigned int indx1_s = pInp[j]; + unsigned int index1 = indx1_s & (~BT_3DGRID_PAIR_ANY_FLG); + btSimpleBroadphaseProxy* proxy1; + if(index1 < (unsigned int)m_maxHandles) + { + proxy1 = &m_pHandles[index1]; + } + else + { + index1 -= m_maxHandles; + btAssert((index1 >= 0) && (index1 < (unsigned int)m_maxLargeHandles)); + proxy1 = &m_pLargeHandles[index1]; + } + if(indx1_s & BT_3DGRID_PAIR_NEW_FLG) + { + m_pairCache->addOverlappingPair(proxy0,proxy1); + m_numPairsAdded++; + } + else + { + m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); + m_numPairsRemoved++; + } + } + } +} + + + +btBroadphaseProxy* btGpu3DGridBroadphase::createProxy( const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy) +{ + btBroadphaseProxy* proxy; + bool bIsLarge = isLargeProxy(aabbMin, aabbMax); + if(bIsLarge) + { + if (m_numLargeHandles >= m_maxLargeHandles) + { + ///you have to increase the cell size, so 'large' proxies become 'small' proxies (fitting a cell) + btAssert(0); + return 0; //should never happen, but don't let the game crash ;-) + } + btAssert((aabbMin[0]<= aabbMax[0]) && (aabbMin[1]<= aabbMax[1]) && (aabbMin[2]<= aabbMax[2])); + int newHandleIndex = allocLargeHandle(); + proxy = new (&m_pLargeHandles[newHandleIndex])btSimpleBroadphaseProxy(aabbMin,aabbMax,shapeType,userPtr,collisionFilterGroup,collisionFilterMask,multiSapProxy); + } + else + { + proxy = btSimpleBroadphase::createProxy(aabbMin, aabbMax, shapeType, userPtr, collisionFilterGroup, collisionFilterMask, dispatcher, multiSapProxy); + } + return proxy; +} + + + +void btGpu3DGridBroadphase::destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher) +{ + bool bIsLarge = isLargeProxy(proxy); + if(bIsLarge) + { + + btSimpleBroadphaseProxy* proxy0 = static_cast(proxy); + freeLargeHandle(proxy0); + m_pairCache->removeOverlappingPairsContainingProxy(proxy,dispatcher); + } + else + { + btSimpleBroadphase::destroyProxy(proxy, dispatcher); + } + return; +} + + + +void btGpu3DGridBroadphase::resetPool(btDispatcher* dispatcher) +{ + m_hPairBuffStartCurr[0] = 0; + m_hPairBuffStartCurr[1] = 0; + for(int i = 1; i <= m_maxHandles; i++) + { + m_hPairBuffStartCurr[i * 2] = m_hPairBuffStartCurr[(i-1) * 2] + m_maxPairsPerBody; + m_hPairBuffStartCurr[i * 2 + 1] = 0; + } +} + + + +bool btGpu3DGridBroadphase::isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax) +{ + btVector3 diag = aabbMax - aabbMin; + + ///use the bounding sphere radius of this bounding box, to include rotation + btScalar radius = diag.length() * btScalar(0.5f); + radius *= m_cellFactorAABB; // user-defined factor + + return (radius > m_maxRadius); +} + + + +bool btGpu3DGridBroadphase::isLargeProxy(btBroadphaseProxy* proxy) +{ + return (proxy->getUid() >= (m_maxHandles+2)); +} + + + +void btGpu3DGridBroadphase::addLarge2LargePairsToCache(btDispatcher* dispatcher) +{ + int i,j; + if (m_numLargeHandles <= 0) + { + return; + } + int new_largest_index = -1; + for(i = 0; i <= m_LastLargeHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy0 = &m_pLargeHandles[i]; + if(!proxy0->m_clientObject) + { + continue; + } + new_largest_index = i; + for(j = i + 1; j <= m_LastLargeHandleIndex; j++) + { + btSimpleBroadphaseProxy* proxy1 = &m_pLargeHandles[j]; + if(!proxy1->m_clientObject) + { + continue; + } + btAssert(proxy0 != proxy1); + btSimpleBroadphaseProxy* p0 = getSimpleProxyFromProxy(proxy0); + btSimpleBroadphaseProxy* p1 = getSimpleProxyFromProxy(proxy1); + if(aabbOverlap(p0,p1)) + { + if (!m_pairCache->findPair(proxy0,proxy1)) + { + m_pairCache->addOverlappingPair(proxy0,proxy1); + } + } + else + { + if(m_pairCache->findPair(proxy0,proxy1)) + { + m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); + } + } + } + } + m_LastLargeHandleIndex = new_largest_index; + return; +} + + + +void btGpu3DGridBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback) +{ + btSimpleBroadphase::rayTest(rayFrom, rayTo, rayCallback); + for (int i=0; i <= m_LastLargeHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy = &m_pLargeHandles[i]; + if(!proxy->m_clientObject) + { + continue; + } + rayCallback.process(proxy); + } +} + + + +// +// overrides for CPU version +// + + + +void btGpu3DGridBroadphase::prepareAABB() +{ + BT_PROFILE("prepareAABB"); + bt3DGrid3F1U* pBB = m_hAABB; + int i; + int new_largest_index = -1; + unsigned int num_small = 0; + for(i = 0; i <= m_LastHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy0 = &m_pHandles[i]; + if(!proxy0->m_clientObject) + { + continue; + } + new_largest_index = i; + pBB->fx = proxy0->m_aabbMin.getX(); + pBB->fy = proxy0->m_aabbMin.getY(); + pBB->fz = proxy0->m_aabbMin.getZ(); + pBB->uw = i; + pBB++; + pBB->fx = proxy0->m_aabbMax.getX(); + pBB->fy = proxy0->m_aabbMax.getY(); + pBB->fz = proxy0->m_aabbMax.getZ(); + pBB->uw = num_small; + pBB++; + num_small++; + } + m_LastHandleIndex = new_largest_index; + new_largest_index = -1; + unsigned int num_large = 0; + for(i = 0; i <= m_LastLargeHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy0 = &m_pLargeHandles[i]; + if(!proxy0->m_clientObject) + { + continue; + } + new_largest_index = i; + pBB->fx = proxy0->m_aabbMin.getX(); + pBB->fy = proxy0->m_aabbMin.getY(); + pBB->fz = proxy0->m_aabbMin.getZ(); + pBB->uw = i + m_maxHandles; + pBB++; + pBB->fx = proxy0->m_aabbMax.getX(); + pBB->fy = proxy0->m_aabbMax.getY(); + pBB->fz = proxy0->m_aabbMax.getZ(); + pBB->uw = num_large + m_maxHandles; + pBB++; + num_large++; + } + m_LastLargeHandleIndex = new_largest_index; + // paranoid checks + btAssert(num_small == m_numHandles); + btAssert(num_large == m_numLargeHandles); + return; +} + + + +void btGpu3DGridBroadphase::setParameters(bt3DGridBroadphaseParams* hostParams) +{ + s3DGridBroadphaseParams = *hostParams; + return; +} + + + +void btGpu3DGridBroadphase::calcHashAABB() +{ + BT_PROFILE("bt3DGrid_calcHashAABB"); + btGpu_calcHashAABB(m_hAABB, m_hBodiesHash, m_numHandles); + return; +} + + + +void btGpu3DGridBroadphase::sortHash() +{ + class bt3DGridHashKey + { + public: + unsigned int hash; + unsigned int index; + void quickSort(bt3DGridHashKey* pData, int lo, int hi) + { + int i=lo, j=hi; + bt3DGridHashKey x = pData[(lo+hi)/2]; + do + { + while(pData[i].hash > x.hash) i++; + while(x.hash > pData[j].hash) j--; + if(i <= j) + { + bt3DGridHashKey t = pData[i]; + pData[i] = pData[j]; + pData[j] = t; + i++; j--; + } + } while(i <= j); + if(lo < j) pData->quickSort(pData, lo, j); + if(i < hi) pData->quickSort(pData, i, hi); + } + }; + BT_PROFILE("bt3DGrid_sortHash"); + bt3DGridHashKey* pHash = (bt3DGridHashKey*)m_hBodiesHash; + pHash->quickSort(pHash, 0, m_numHandles - 1); + return; +} + + + +void btGpu3DGridBroadphase::findCellStart() +{ + BT_PROFILE("bt3DGrid_findCellStart"); + btGpu_findCellStart(m_hBodiesHash, m_hCellStart, m_numHandles, m_params.m_numCells); + return; +} + + + +void btGpu3DGridBroadphase::findOverlappingPairs() +{ + BT_PROFILE("bt3DGrid_findOverlappingPairs"); + btGpu_findOverlappingPairs(m_hAABB, m_hBodiesHash, m_hCellStart, m_hPairBuff, m_hPairBuffStartCurr, m_numHandles); + return; +} + + + +void btGpu3DGridBroadphase::findPairsLarge() +{ + BT_PROFILE("bt3DGrid_findPairsLarge"); + btGpu_findPairsLarge(m_hAABB, m_hBodiesHash, m_hCellStart, m_hPairBuff, m_hPairBuffStartCurr, m_numHandles, m_numLargeHandles); + return; +} + + + +void btGpu3DGridBroadphase::computePairCacheChanges() +{ + BT_PROFILE("bt3DGrid_computePairCacheChanges"); + btGpu_computePairCacheChanges(m_hPairBuff, m_hPairBuffStartCurr, m_hPairScan, m_hAABB, m_numHandles); + return; +} + + + +void btGpu3DGridBroadphase::scanOverlappingPairBuff() +{ + BT_PROFILE("bt3DGrid_scanOverlappingPairBuff"); + m_hPairScan[0] = 0; + for(int i = 1; i <= m_numHandles; i++) + { + unsigned int delta = m_hPairScan[i]; + m_hPairScan[i] = m_hPairScan[i-1] + delta; + } + return; +} + + + +void btGpu3DGridBroadphase::squeezeOverlappingPairBuff() +{ + BT_PROFILE("bt3DGrid_squeezeOverlappingPairBuff"); + btGpu_squeezeOverlappingPairBuff(m_hPairBuff, m_hPairBuffStartCurr, m_hPairScan, m_hPairOut, m_hAABB, m_numHandles); + return; +} + + + +#include "btGpu3DGridBroadphaseSharedCode.h" + + diff --git a/src/BulletMultiThreaded/btGpu3DGridBroadphase.h b/src/BulletMultiThreaded/btGpu3DGridBroadphase.h index 98d1f8c9b..1d49a0557 100644 --- a/src/BulletMultiThreaded/btGpu3DGridBroadphase.h +++ b/src/BulletMultiThreaded/btGpu3DGridBroadphase.h @@ -1,138 +1,138 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. - -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 BTGPU3DGRIDBROADPHASE_H -#define BTGPU3DGRIDBROADPHASE_H - -//---------------------------------------------------------------------------------------- - -#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" - -#include "btGpu3DGridBroadphaseSharedTypes.h" - -//---------------------------------------------------------------------------------------- - -///The btGpu3DGridBroadphase uses GPU-style code compiled for CPU to compute overlapping pairs - -class btGpu3DGridBroadphase : public btSimpleBroadphase -{ -protected: - bool m_bInitialized; - unsigned int m_numBodies; - unsigned int m_numCells; - unsigned int m_maxPairsPerBody; - btScalar m_cellFactorAABB; - unsigned int m_maxBodiesPerCell; - bt3DGridBroadphaseParams m_params; - btScalar m_maxRadius; - // CPU data - unsigned int* m_hBodiesHash; - unsigned int* m_hCellStart; - unsigned int* m_hPairBuffStartCurr; - bt3DGrid3F1U* m_hAABB; - unsigned int* m_hPairBuff; - unsigned int* m_hPairScan; - unsigned int* m_hPairOut; -// large proxies - int m_numLargeHandles; - int m_maxLargeHandles; - int m_LastLargeHandleIndex; - btSimpleBroadphaseProxy* m_pLargeHandles; - void* m_pLargeHandlesRawPtr; - int m_firstFreeLargeHandle; - int allocLargeHandle() - { - btAssert(m_numLargeHandles < m_maxLargeHandles); - int freeLargeHandle = m_firstFreeLargeHandle; - m_firstFreeLargeHandle = m_pLargeHandles[freeLargeHandle].GetNextFree(); - m_numLargeHandles++; - if(freeLargeHandle > m_LastLargeHandleIndex) - { - m_LastLargeHandleIndex = freeLargeHandle; - } - return freeLargeHandle; - } - void freeLargeHandle(btSimpleBroadphaseProxy* proxy) - { - int handle = int(proxy - m_pLargeHandles); - btAssert((handle >= 0) && (handle < m_maxHandles)); - if(handle == m_LastLargeHandleIndex) - { - m_LastLargeHandleIndex--; - } - proxy->SetNextFree(m_firstFreeLargeHandle); - m_firstFreeLargeHandle = handle; - proxy->m_clientObject = 0; - m_numLargeHandles--; - } - bool isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax); - bool isLargeProxy(btBroadphaseProxy* proxy); -// debug - unsigned int m_numPairsAdded; - unsigned int m_numPairsRemoved; - unsigned int m_numOverflows; -// -public: - btGpu3DGridBroadphase(const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell = 8, - btScalar cellFactorAABB = btScalar(1.0f)); - btGpu3DGridBroadphase( btOverlappingPairCache* overlappingPairCache, - const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell = 8, - btScalar cellFactorAABB = btScalar(1.0f)); - virtual ~btGpu3DGridBroadphase(); - virtual void calculateOverlappingPairs(btDispatcher* dispatcher); - - virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy); - virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher); - virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback); - virtual void resetPool(btDispatcher* dispatcher); - -protected: - void _initialize( const btVector3& worldAabbMin,const btVector3& worldAabbMax, - int gridSizeX, int gridSizeY, int gridSizeZ, - int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, - int maxBodiesPerCell = 8, - btScalar cellFactorAABB = btScalar(1.0f)); - void _finalize(); - void addPairsToCache(btDispatcher* dispatcher); - void addLarge2LargePairsToCache(btDispatcher* dispatcher); - -// overrides for CPU version - virtual void setParameters(bt3DGridBroadphaseParams* hostParams); - virtual void prepareAABB(); - virtual void calcHashAABB(); - virtual void sortHash(); - virtual void findCellStart(); - virtual void findOverlappingPairs(); - virtual void findPairsLarge(); - virtual void computePairCacheChanges(); - virtual void scanOverlappingPairBuff(); - virtual void squeezeOverlappingPairBuff(); -}; - -//---------------------------------------------------------------------------------------- - -#endif //BTGPU3DGRIDBROADPHASE_H - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. + +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 BTGPU3DGRIDBROADPHASE_H +#define BTGPU3DGRIDBROADPHASE_H + +//---------------------------------------------------------------------------------------- + +#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" + +#include "btGpu3DGridBroadphaseSharedTypes.h" + +//---------------------------------------------------------------------------------------- + +///The btGpu3DGridBroadphase uses GPU-style code compiled for CPU to compute overlapping pairs + +class btGpu3DGridBroadphase : public btSimpleBroadphase +{ +protected: + bool m_bInitialized; + unsigned int m_numBodies; + unsigned int m_numCells; + unsigned int m_maxPairsPerBody; + btScalar m_cellFactorAABB; + unsigned int m_maxBodiesPerCell; + bt3DGridBroadphaseParams m_params; + btScalar m_maxRadius; + // CPU data + unsigned int* m_hBodiesHash; + unsigned int* m_hCellStart; + unsigned int* m_hPairBuffStartCurr; + bt3DGrid3F1U* m_hAABB; + unsigned int* m_hPairBuff; + unsigned int* m_hPairScan; + unsigned int* m_hPairOut; +// large proxies + int m_numLargeHandles; + int m_maxLargeHandles; + int m_LastLargeHandleIndex; + btSimpleBroadphaseProxy* m_pLargeHandles; + void* m_pLargeHandlesRawPtr; + int m_firstFreeLargeHandle; + int allocLargeHandle() + { + btAssert(m_numLargeHandles < m_maxLargeHandles); + int freeLargeHandle = m_firstFreeLargeHandle; + m_firstFreeLargeHandle = m_pLargeHandles[freeLargeHandle].GetNextFree(); + m_numLargeHandles++; + if(freeLargeHandle > m_LastLargeHandleIndex) + { + m_LastLargeHandleIndex = freeLargeHandle; + } + return freeLargeHandle; + } + void freeLargeHandle(btSimpleBroadphaseProxy* proxy) + { + int handle = int(proxy - m_pLargeHandles); + btAssert((handle >= 0) && (handle < m_maxHandles)); + if(handle == m_LastLargeHandleIndex) + { + m_LastLargeHandleIndex--; + } + proxy->SetNextFree(m_firstFreeLargeHandle); + m_firstFreeLargeHandle = handle; + proxy->m_clientObject = 0; + m_numLargeHandles--; + } + bool isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax); + bool isLargeProxy(btBroadphaseProxy* proxy); +// debug + unsigned int m_numPairsAdded; + unsigned int m_numPairsRemoved; + unsigned int m_numOverflows; +// +public: + btGpu3DGridBroadphase(const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell = 8, + btScalar cellFactorAABB = btScalar(1.0f)); + btGpu3DGridBroadphase( btOverlappingPairCache* overlappingPairCache, + const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell = 8, + btScalar cellFactorAABB = btScalar(1.0f)); + virtual ~btGpu3DGridBroadphase(); + virtual void calculateOverlappingPairs(btDispatcher* dispatcher); + + virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy); + virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher); + virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback); + virtual void resetPool(btDispatcher* dispatcher); + +protected: + void _initialize( const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell = 8, + btScalar cellFactorAABB = btScalar(1.0f)); + void _finalize(); + void addPairsToCache(btDispatcher* dispatcher); + void addLarge2LargePairsToCache(btDispatcher* dispatcher); + +// overrides for CPU version + virtual void setParameters(bt3DGridBroadphaseParams* hostParams); + virtual void prepareAABB(); + virtual void calcHashAABB(); + virtual void sortHash(); + virtual void findCellStart(); + virtual void findOverlappingPairs(); + virtual void findPairsLarge(); + virtual void computePairCacheChanges(); + virtual void scanOverlappingPairBuff(); + virtual void squeezeOverlappingPairBuff(); +}; + +//---------------------------------------------------------------------------------------- + +#endif //BTGPU3DGRIDBROADPHASE_H + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- diff --git a/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedCode.h b/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedCode.h index bc4e0552b..e0afb87bb 100644 --- a/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedCode.h +++ b/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedCode.h @@ -1,430 +1,430 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. - -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. -*/ - -//---------------------------------------------------------------------------------------- - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -// K E R N E L F U N C T I O N S -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -// calculate position in uniform grid -BT_GPU___device__ int3 bt3DGrid_calcGridPos(float4 p) -{ - int3 gridPos; - gridPos.x = (int)floor((p.x - BT_GPU_params.m_worldOriginX) / BT_GPU_params.m_cellSizeX); - gridPos.y = (int)floor((p.y - BT_GPU_params.m_worldOriginY) / BT_GPU_params.m_cellSizeY); - gridPos.z = (int)floor((p.z - BT_GPU_params.m_worldOriginZ) / BT_GPU_params.m_cellSizeZ); - return gridPos; -} // bt3DGrid_calcGridPos() - -//---------------------------------------------------------------------------------------- - -// calculate address in grid from position (clamping to edges) -BT_GPU___device__ uint bt3DGrid_calcGridHash(int3 gridPos) -{ - gridPos.x = BT_GPU_max(0, BT_GPU_min(gridPos.x, (int)BT_GPU_params.m_gridSizeX - 1)); - gridPos.y = BT_GPU_max(0, BT_GPU_min(gridPos.y, (int)BT_GPU_params.m_gridSizeY - 1)); - gridPos.z = BT_GPU_max(0, BT_GPU_min(gridPos.z, (int)BT_GPU_params.m_gridSizeZ - 1)); - return BT_GPU___mul24(BT_GPU___mul24(gridPos.z, BT_GPU_params.m_gridSizeY), BT_GPU_params.m_gridSizeX) + BT_GPU___mul24(gridPos.y, BT_GPU_params.m_gridSizeX) + gridPos.x; -} // bt3DGrid_calcGridHash() - -//---------------------------------------------------------------------------------------- - -// calculate grid hash value for each body using its AABB -BT_GPU___global__ void calcHashAABBD(bt3DGrid3F1U* pAABB, uint2* pHash, uint numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - bt3DGrid3F1U bbMin = pAABB[index*2]; - bt3DGrid3F1U bbMax = pAABB[index*2 + 1]; - float4 pos; - pos.x = (bbMin.fx + bbMax.fx) * 0.5f; - pos.y = (bbMin.fy + bbMax.fy) * 0.5f; - pos.z = (bbMin.fz + bbMax.fz) * 0.5f; - // get address in grid - int3 gridPos = bt3DGrid_calcGridPos(pos); - uint gridHash = bt3DGrid_calcGridHash(gridPos); - // store grid hash and body index - pHash[index] = BT_GPU_make_uint2(gridHash, index); -} // calcHashAABBD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void findCellStartD(uint2* pHash, uint* cellStart, uint numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - uint2 sortedData = pHash[index]; - // Load hash data into shared memory so that we can look - // at neighboring body's hash value without loading - // two hash values per thread - BT_GPU___shared__ uint sharedHash[257]; - sharedHash[BT_GPU_threadIdx.x+1] = sortedData.x; - if((index > 0) && (BT_GPU_threadIdx.x == 0)) - { - // first thread in block must load neighbor body hash - volatile uint2 prevData = pHash[index-1]; - sharedHash[0] = prevData.x; - } - BT_GPU___syncthreads(); - if((index == 0) || (sortedData.x != sharedHash[BT_GPU_threadIdx.x])) - { - cellStart[sortedData.x] = index; - } -} // findCellStartD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ uint cudaTestAABBOverlap(bt3DGrid3F1U min0, bt3DGrid3F1U max0, bt3DGrid3F1U min1, bt3DGrid3F1U max1) -{ - return (min0.fx <= max1.fx)&& (min1.fx <= max0.fx) && - (min0.fy <= max1.fy)&& (min1.fy <= max0.fy) && - (min0.fz <= max1.fz)&& (min1.fz <= max0.fz); -} // cudaTestAABBOverlap() - -//---------------------------------------------------------------------------------------- - -BT_GPU___device__ void findPairsInCell( int3 gridPos, - uint index, - uint2* pHash, - uint* pCellStart, - bt3DGrid3F1U* pAABB, - uint* pPairBuff, - uint2* pPairBuffStartCurr, - uint numBodies) -{ - if ( (gridPos.x < 0) || (gridPos.x > (int)BT_GPU_params.m_gridSizeX - 1) - || (gridPos.y < 0) || (gridPos.y > (int)BT_GPU_params.m_gridSizeY - 1) - || (gridPos.z < 0) || (gridPos.z > (int)BT_GPU_params.m_gridSizeZ - 1)) - { - return; - } - uint gridHash = bt3DGrid_calcGridHash(gridPos); - // get start of bucket for this cell - uint bucketStart = pCellStart[gridHash]; - if (bucketStart == 0xffffffff) - { - return; // cell empty - } - // iterate over bodies in this cell - uint2 sortedData = pHash[index]; - uint unsorted_indx = sortedData.y; - bt3DGrid3F1U min0 = BT_GPU_FETCH(pAABB, unsorted_indx*2); - bt3DGrid3F1U max0 = BT_GPU_FETCH(pAABB, unsorted_indx*2 + 1); - uint handleIndex = min0.uw; - uint2 start_curr = pPairBuffStartCurr[handleIndex]; - uint start = start_curr.x; - uint curr = start_curr.y; - uint2 start_curr_next = pPairBuffStartCurr[handleIndex+1]; - uint curr_max = start_curr_next.x - start - 1; - uint bucketEnd = bucketStart + BT_GPU_params.m_maxBodiesPerCell; - bucketEnd = (bucketEnd > numBodies) ? numBodies : bucketEnd; - for(uint index2 = bucketStart; index2 < bucketEnd; index2++) - { - uint2 cellData = pHash[index2]; - if (cellData.x != gridHash) - { - break; // no longer in same bucket - } - uint unsorted_indx2 = cellData.y; - if (unsorted_indx2 < unsorted_indx) // check not colliding with self - { - bt3DGrid3F1U min1 = BT_GPU_FETCH(pAABB, unsorted_indx2*2); - bt3DGrid3F1U max1 = BT_GPU_FETCH(pAABB, unsorted_indx2*2 + 1); - if(cudaTestAABBOverlap(min0, max0, min1, max1)) - { - uint handleIndex2 = min1.uw; - uint k; - for(k = 0; k < curr; k++) - { - uint old_pair = pPairBuff[start+k] & (~BT_3DGRID_PAIR_ANY_FLG); - if(old_pair == handleIndex2) - { - pPairBuff[start+k] |= BT_3DGRID_PAIR_FOUND_FLG; - break; - } - } - if(k == curr) - { - if(curr >= curr_max) - { // not a good solution, but let's avoid crash - break; - } - pPairBuff[start+curr] = handleIndex2 | BT_3DGRID_PAIR_NEW_FLG; - curr++; - } - } - } - } - pPairBuffStartCurr[handleIndex] = BT_GPU_make_uint2(start, curr); - return; -} // findPairsInCell() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void findOverlappingPairsD( bt3DGrid3F1U* pAABB, uint2* pHash, uint* pCellStart, - uint* pPairBuff, uint2* pPairBuffStartCurr, uint numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - uint2 sortedData = pHash[index]; - uint unsorted_indx = sortedData.y; - bt3DGrid3F1U bbMin = BT_GPU_FETCH(pAABB, unsorted_indx*2); - bt3DGrid3F1U bbMax = BT_GPU_FETCH(pAABB, unsorted_indx*2 + 1); - float4 pos; - pos.x = (bbMin.fx + bbMax.fx) * 0.5f; - pos.y = (bbMin.fy + bbMax.fy) * 0.5f; - pos.z = (bbMin.fz + bbMax.fz) * 0.5f; - // get address in grid - int3 gridPos = bt3DGrid_calcGridPos(pos); - // examine only neighbouring cells - for(int z=-1; z<=1; z++) { - for(int y=-1; y<=1; y++) { - for(int x=-1; x<=1; x++) { - findPairsInCell(gridPos + BT_GPU_make_int3(x, y, z), index, pHash, pCellStart, pAABB, pPairBuff, pPairBuffStartCurr, numBodies); - } - } - } -} // findOverlappingPairsD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void findPairsLargeD( bt3DGrid3F1U* pAABB, uint2* pHash, uint* pCellStart, uint* pPairBuff, - uint2* pPairBuffStartCurr, uint numBodies, uint numLarge) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - uint2 sortedData = pHash[index]; - uint unsorted_indx = sortedData.y; - bt3DGrid3F1U min0 = BT_GPU_FETCH(pAABB, unsorted_indx*2); - bt3DGrid3F1U max0 = BT_GPU_FETCH(pAABB, unsorted_indx*2 + 1); - uint handleIndex = min0.uw; - uint2 start_curr = pPairBuffStartCurr[handleIndex]; - uint start = start_curr.x; - uint curr = start_curr.y; - uint2 start_curr_next = pPairBuffStartCurr[handleIndex+1]; - uint curr_max = start_curr_next.x - start - 1; - for(uint i = 0; i < numLarge; i++) - { - uint indx2 = numBodies + i; - bt3DGrid3F1U min1 = BT_GPU_FETCH(pAABB, indx2*2); - bt3DGrid3F1U max1 = BT_GPU_FETCH(pAABB, indx2*2 + 1); - if(cudaTestAABBOverlap(min0, max0, min1, max1)) - { - uint k; - uint handleIndex2 = min1.uw; - for(k = 0; k < curr; k++) - { - uint old_pair = pPairBuff[start+k] & (~BT_3DGRID_PAIR_ANY_FLG); - if(old_pair == handleIndex2) - { - pPairBuff[start+k] |= BT_3DGRID_PAIR_FOUND_FLG; - break; - } - } - if(k == curr) - { - pPairBuff[start+curr] = handleIndex2 | BT_3DGRID_PAIR_NEW_FLG; - if(curr >= curr_max) - { // not a good solution, but let's avoid crash - break; - } - curr++; - } - } - } - pPairBuffStartCurr[handleIndex] = BT_GPU_make_uint2(start, curr); - return; -} // findPairsLargeD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void computePairCacheChangesD(uint* pPairBuff, uint2* pPairBuffStartCurr, - uint* pPairScan, bt3DGrid3F1U* pAABB, uint numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - bt3DGrid3F1U bbMin = pAABB[index * 2]; - uint handleIndex = bbMin.uw; - uint2 start_curr = pPairBuffStartCurr[handleIndex]; - uint start = start_curr.x; - uint curr = start_curr.y; - uint *pInp = pPairBuff + start; - uint num_changes = 0; - for(uint k = 0; k < curr; k++, pInp++) - { - if(!((*pInp) & BT_3DGRID_PAIR_FOUND_FLG)) - { - num_changes++; - } - } - pPairScan[index+1] = num_changes; -} // computePairCacheChangesD() - -//---------------------------------------------------------------------------------------- - -BT_GPU___global__ void squeezeOverlappingPairBuffD(uint* pPairBuff, uint2* pPairBuffStartCurr, uint* pPairScan, - uint* pPairOut, bt3DGrid3F1U* pAABB, uint numBodies) -{ - int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; - if(index >= (int)numBodies) - { - return; - } - bt3DGrid3F1U bbMin = pAABB[index * 2]; - uint handleIndex = bbMin.uw; - uint2 start_curr = pPairBuffStartCurr[handleIndex]; - uint start = start_curr.x; - uint curr = start_curr.y; - uint* pInp = pPairBuff + start; - uint* pOut = pPairOut + pPairScan[index]; - uint* pOut2 = pInp; - uint num = 0; - for(uint k = 0; k < curr; k++, pInp++) - { - if(!((*pInp) & BT_3DGRID_PAIR_FOUND_FLG)) - { - *pOut = *pInp; - pOut++; - } - if((*pInp) & BT_3DGRID_PAIR_ANY_FLG) - { - *pOut2 = (*pInp) & (~BT_3DGRID_PAIR_ANY_FLG); - pOut2++; - num++; - } - } - pPairBuffStartCurr[handleIndex] = BT_GPU_make_uint2(start, num); -} // squeezeOverlappingPairBuffD() - - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -// E N D O F K E R N E L F U N C T I O N S -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -extern "C" -{ - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(calcHashAABB)(bt3DGrid3F1U* pAABB, unsigned int* hash, unsigned int numBodies) -{ - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); - // execute the kernel - BT_GPU_EXECKERNEL(numBlocks, numThreads, calcHashAABBD, (pAABB, (uint2*)hash, numBodies)); - // check if kernel invocation generated an error - BT_GPU_CHECK_ERROR("calcHashAABBD kernel execution failed"); -} // calcHashAABB() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(findCellStart(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells)) -{ - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); - BT_GPU_SAFE_CALL(BT_GPU_Memset(cellStart, 0xffffffff, numCells*sizeof(uint))); - BT_GPU_EXECKERNEL(numBlocks, numThreads, findCellStartD, ((uint2*)hash, (uint*)cellStart, numBodies)); - BT_GPU_CHECK_ERROR("Kernel execution failed: findCellStartD"); -} // findCellStart() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(findOverlappingPairs(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies)) -{ -#if B_CUDA_USE_TEX - BT_GPU_SAFE_CALL(cudaBindTexture(0, pAABBTex, pAABB, numBodies * 2 * sizeof(bt3DGrid3F1U))); -#endif - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 64, numBlocks, numThreads); - BT_GPU_EXECKERNEL(numBlocks, numThreads, findOverlappingPairsD, (pAABB,(uint2*)pHash,(uint*)pCellStart,(uint*)pPairBuff,(uint2*)pPairBuffStartCurr,numBodies)); - BT_GPU_CHECK_ERROR("Kernel execution failed: bt_CudaFindOverlappingPairsD"); -#if B_CUDA_USE_TEX - BT_GPU_SAFE_CALL(cudaUnbindTexture(pAABBTex)); -#endif -} // findOverlappingPairs() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(findPairsLarge(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies, unsigned int numLarge)) -{ -#if B_CUDA_USE_TEX - BT_GPU_SAFE_CALL(cudaBindTexture(0, pAABBTex, pAABB, (numBodies+numLarge) * 2 * sizeof(bt3DGrid3F1U))); -#endif - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 64, numBlocks, numThreads); - BT_GPU_EXECKERNEL(numBlocks, numThreads, findPairsLargeD, (pAABB,(uint2*)pHash,(uint*)pCellStart,(uint*)pPairBuff,(uint2*)pPairBuffStartCurr,numBodies,numLarge)); - BT_GPU_CHECK_ERROR("Kernel execution failed: btCuda_findPairsLargeD"); -#if B_CUDA_USE_TEX - BT_GPU_SAFE_CALL(cudaUnbindTexture(pAABBTex)); -#endif -} // findPairsLarge() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(computePairCacheChanges(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, bt3DGrid3F1U* pAABB, unsigned int numBodies)) -{ - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); - BT_GPU_EXECKERNEL(numBlocks, numThreads, computePairCacheChangesD, ((uint*)pPairBuff,(uint2*)pPairBuffStartCurr,(uint*)pPairScan,pAABB,numBodies)); - BT_GPU_CHECK_ERROR("Kernel execution failed: btCudaComputePairCacheChangesD"); -} // computePairCacheChanges() - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(squeezeOverlappingPairBuff(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, unsigned int* pPairOut, bt3DGrid3F1U* pAABB, unsigned int numBodies)) -{ - int numThreads, numBlocks; - BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); - BT_GPU_EXECKERNEL(numBlocks, numThreads, squeezeOverlappingPairBuffD, ((uint*)pPairBuff,(uint2*)pPairBuffStartCurr,(uint*)pPairScan,(uint*)pPairOut,pAABB,numBodies)); - BT_GPU_CHECK_ERROR("Kernel execution failed: btCudaSqueezeOverlappingPairBuffD"); -} // btCuda_squeezeOverlappingPairBuff() - -//------------------------------------------------------------------------------------------------ - -} // extern "C" - -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. + +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. +*/ + +//---------------------------------------------------------------------------------------- + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +// K E R N E L F U N C T I O N S +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +// calculate position in uniform grid +BT_GPU___device__ int3 bt3DGrid_calcGridPos(float4 p) +{ + int3 gridPos; + gridPos.x = (int)floor((p.x - BT_GPU_params.m_worldOriginX) / BT_GPU_params.m_cellSizeX); + gridPos.y = (int)floor((p.y - BT_GPU_params.m_worldOriginY) / BT_GPU_params.m_cellSizeY); + gridPos.z = (int)floor((p.z - BT_GPU_params.m_worldOriginZ) / BT_GPU_params.m_cellSizeZ); + return gridPos; +} // bt3DGrid_calcGridPos() + +//---------------------------------------------------------------------------------------- + +// calculate address in grid from position (clamping to edges) +BT_GPU___device__ uint bt3DGrid_calcGridHash(int3 gridPos) +{ + gridPos.x = BT_GPU_max(0, BT_GPU_min(gridPos.x, (int)BT_GPU_params.m_gridSizeX - 1)); + gridPos.y = BT_GPU_max(0, BT_GPU_min(gridPos.y, (int)BT_GPU_params.m_gridSizeY - 1)); + gridPos.z = BT_GPU_max(0, BT_GPU_min(gridPos.z, (int)BT_GPU_params.m_gridSizeZ - 1)); + return BT_GPU___mul24(BT_GPU___mul24(gridPos.z, BT_GPU_params.m_gridSizeY), BT_GPU_params.m_gridSizeX) + BT_GPU___mul24(gridPos.y, BT_GPU_params.m_gridSizeX) + gridPos.x; +} // bt3DGrid_calcGridHash() + +//---------------------------------------------------------------------------------------- + +// calculate grid hash value for each body using its AABB +BT_GPU___global__ void calcHashAABBD(bt3DGrid3F1U* pAABB, uint2* pHash, uint numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + bt3DGrid3F1U bbMin = pAABB[index*2]; + bt3DGrid3F1U bbMax = pAABB[index*2 + 1]; + float4 pos; + pos.x = (bbMin.fx + bbMax.fx) * 0.5f; + pos.y = (bbMin.fy + bbMax.fy) * 0.5f; + pos.z = (bbMin.fz + bbMax.fz) * 0.5f; + // get address in grid + int3 gridPos = bt3DGrid_calcGridPos(pos); + uint gridHash = bt3DGrid_calcGridHash(gridPos); + // store grid hash and body index + pHash[index] = BT_GPU_make_uint2(gridHash, index); +} // calcHashAABBD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void findCellStartD(uint2* pHash, uint* cellStart, uint numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + uint2 sortedData = pHash[index]; + // Load hash data into shared memory so that we can look + // at neighboring body's hash value without loading + // two hash values per thread + BT_GPU___shared__ uint sharedHash[257]; + sharedHash[BT_GPU_threadIdx.x+1] = sortedData.x; + if((index > 0) && (BT_GPU_threadIdx.x == 0)) + { + // first thread in block must load neighbor body hash + volatile uint2 prevData = pHash[index-1]; + sharedHash[0] = prevData.x; + } + BT_GPU___syncthreads(); + if((index == 0) || (sortedData.x != sharedHash[BT_GPU_threadIdx.x])) + { + cellStart[sortedData.x] = index; + } +} // findCellStartD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ uint cudaTestAABBOverlap(bt3DGrid3F1U min0, bt3DGrid3F1U max0, bt3DGrid3F1U min1, bt3DGrid3F1U max1) +{ + return (min0.fx <= max1.fx)&& (min1.fx <= max0.fx) && + (min0.fy <= max1.fy)&& (min1.fy <= max0.fy) && + (min0.fz <= max1.fz)&& (min1.fz <= max0.fz); +} // cudaTestAABBOverlap() + +//---------------------------------------------------------------------------------------- + +BT_GPU___device__ void findPairsInCell( int3 gridPos, + uint index, + uint2* pHash, + uint* pCellStart, + bt3DGrid3F1U* pAABB, + uint* pPairBuff, + uint2* pPairBuffStartCurr, + uint numBodies) +{ + if ( (gridPos.x < 0) || (gridPos.x > (int)BT_GPU_params.m_gridSizeX - 1) + || (gridPos.y < 0) || (gridPos.y > (int)BT_GPU_params.m_gridSizeY - 1) + || (gridPos.z < 0) || (gridPos.z > (int)BT_GPU_params.m_gridSizeZ - 1)) + { + return; + } + uint gridHash = bt3DGrid_calcGridHash(gridPos); + // get start of bucket for this cell + uint bucketStart = pCellStart[gridHash]; + if (bucketStart == 0xffffffff) + { + return; // cell empty + } + // iterate over bodies in this cell + uint2 sortedData = pHash[index]; + uint unsorted_indx = sortedData.y; + bt3DGrid3F1U min0 = BT_GPU_FETCH(pAABB, unsorted_indx*2); + bt3DGrid3F1U max0 = BT_GPU_FETCH(pAABB, unsorted_indx*2 + 1); + uint handleIndex = min0.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint2 start_curr_next = pPairBuffStartCurr[handleIndex+1]; + uint curr_max = start_curr_next.x - start - 1; + uint bucketEnd = bucketStart + BT_GPU_params.m_maxBodiesPerCell; + bucketEnd = (bucketEnd > numBodies) ? numBodies : bucketEnd; + for(uint index2 = bucketStart; index2 < bucketEnd; index2++) + { + uint2 cellData = pHash[index2]; + if (cellData.x != gridHash) + { + break; // no longer in same bucket + } + uint unsorted_indx2 = cellData.y; + if (unsorted_indx2 < unsorted_indx) // check not colliding with self + { + bt3DGrid3F1U min1 = BT_GPU_FETCH(pAABB, unsorted_indx2*2); + bt3DGrid3F1U max1 = BT_GPU_FETCH(pAABB, unsorted_indx2*2 + 1); + if(cudaTestAABBOverlap(min0, max0, min1, max1)) + { + uint handleIndex2 = min1.uw; + uint k; + for(k = 0; k < curr; k++) + { + uint old_pair = pPairBuff[start+k] & (~BT_3DGRID_PAIR_ANY_FLG); + if(old_pair == handleIndex2) + { + pPairBuff[start+k] |= BT_3DGRID_PAIR_FOUND_FLG; + break; + } + } + if(k == curr) + { + if(curr >= curr_max) + { // not a good solution, but let's avoid crash + break; + } + pPairBuff[start+curr] = handleIndex2 | BT_3DGRID_PAIR_NEW_FLG; + curr++; + } + } + } + } + pPairBuffStartCurr[handleIndex] = BT_GPU_make_uint2(start, curr); + return; +} // findPairsInCell() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void findOverlappingPairsD( bt3DGrid3F1U* pAABB, uint2* pHash, uint* pCellStart, + uint* pPairBuff, uint2* pPairBuffStartCurr, uint numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + uint2 sortedData = pHash[index]; + uint unsorted_indx = sortedData.y; + bt3DGrid3F1U bbMin = BT_GPU_FETCH(pAABB, unsorted_indx*2); + bt3DGrid3F1U bbMax = BT_GPU_FETCH(pAABB, unsorted_indx*2 + 1); + float4 pos; + pos.x = (bbMin.fx + bbMax.fx) * 0.5f; + pos.y = (bbMin.fy + bbMax.fy) * 0.5f; + pos.z = (bbMin.fz + bbMax.fz) * 0.5f; + // get address in grid + int3 gridPos = bt3DGrid_calcGridPos(pos); + // examine only neighbouring cells + for(int z=-1; z<=1; z++) { + for(int y=-1; y<=1; y++) { + for(int x=-1; x<=1; x++) { + findPairsInCell(gridPos + BT_GPU_make_int3(x, y, z), index, pHash, pCellStart, pAABB, pPairBuff, pPairBuffStartCurr, numBodies); + } + } + } +} // findOverlappingPairsD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void findPairsLargeD( bt3DGrid3F1U* pAABB, uint2* pHash, uint* pCellStart, uint* pPairBuff, + uint2* pPairBuffStartCurr, uint numBodies, uint numLarge) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + uint2 sortedData = pHash[index]; + uint unsorted_indx = sortedData.y; + bt3DGrid3F1U min0 = BT_GPU_FETCH(pAABB, unsorted_indx*2); + bt3DGrid3F1U max0 = BT_GPU_FETCH(pAABB, unsorted_indx*2 + 1); + uint handleIndex = min0.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint2 start_curr_next = pPairBuffStartCurr[handleIndex+1]; + uint curr_max = start_curr_next.x - start - 1; + for(uint i = 0; i < numLarge; i++) + { + uint indx2 = numBodies + i; + bt3DGrid3F1U min1 = BT_GPU_FETCH(pAABB, indx2*2); + bt3DGrid3F1U max1 = BT_GPU_FETCH(pAABB, indx2*2 + 1); + if(cudaTestAABBOverlap(min0, max0, min1, max1)) + { + uint k; + uint handleIndex2 = min1.uw; + for(k = 0; k < curr; k++) + { + uint old_pair = pPairBuff[start+k] & (~BT_3DGRID_PAIR_ANY_FLG); + if(old_pair == handleIndex2) + { + pPairBuff[start+k] |= BT_3DGRID_PAIR_FOUND_FLG; + break; + } + } + if(k == curr) + { + pPairBuff[start+curr] = handleIndex2 | BT_3DGRID_PAIR_NEW_FLG; + if(curr >= curr_max) + { // not a good solution, but let's avoid crash + break; + } + curr++; + } + } + } + pPairBuffStartCurr[handleIndex] = BT_GPU_make_uint2(start, curr); + return; +} // findPairsLargeD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void computePairCacheChangesD(uint* pPairBuff, uint2* pPairBuffStartCurr, + uint* pPairScan, bt3DGrid3F1U* pAABB, uint numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + bt3DGrid3F1U bbMin = pAABB[index * 2]; + uint handleIndex = bbMin.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint *pInp = pPairBuff + start; + uint num_changes = 0; + for(uint k = 0; k < curr; k++, pInp++) + { + if(!((*pInp) & BT_3DGRID_PAIR_FOUND_FLG)) + { + num_changes++; + } + } + pPairScan[index+1] = num_changes; +} // computePairCacheChangesD() + +//---------------------------------------------------------------------------------------- + +BT_GPU___global__ void squeezeOverlappingPairBuffD(uint* pPairBuff, uint2* pPairBuffStartCurr, uint* pPairScan, + uint* pPairOut, bt3DGrid3F1U* pAABB, uint numBodies) +{ + int index = BT_GPU___mul24(BT_GPU_blockIdx.x, BT_GPU_blockDim.x) + BT_GPU_threadIdx.x; + if(index >= (int)numBodies) + { + return; + } + bt3DGrid3F1U bbMin = pAABB[index * 2]; + uint handleIndex = bbMin.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint* pInp = pPairBuff + start; + uint* pOut = pPairOut + pPairScan[index]; + uint* pOut2 = pInp; + uint num = 0; + for(uint k = 0; k < curr; k++, pInp++) + { + if(!((*pInp) & BT_3DGRID_PAIR_FOUND_FLG)) + { + *pOut = *pInp; + pOut++; + } + if((*pInp) & BT_3DGRID_PAIR_ANY_FLG) + { + *pOut2 = (*pInp) & (~BT_3DGRID_PAIR_ANY_FLG); + pOut2++; + num++; + } + } + pPairBuffStartCurr[handleIndex] = BT_GPU_make_uint2(start, num); +} // squeezeOverlappingPairBuffD() + + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +// E N D O F K E R N E L F U N C T I O N S +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +extern "C" +{ + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(calcHashAABB)(bt3DGrid3F1U* pAABB, unsigned int* hash, unsigned int numBodies) +{ + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + // execute the kernel + BT_GPU_EXECKERNEL(numBlocks, numThreads, calcHashAABBD, (pAABB, (uint2*)hash, numBodies)); + // check if kernel invocation generated an error + BT_GPU_CHECK_ERROR("calcHashAABBD kernel execution failed"); +} // calcHashAABB() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(findCellStart(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells)) +{ + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT_GPU_SAFE_CALL(BT_GPU_Memset(cellStart, 0xffffffff, numCells*sizeof(uint))); + BT_GPU_EXECKERNEL(numBlocks, numThreads, findCellStartD, ((uint2*)hash, (uint*)cellStart, numBodies)); + BT_GPU_CHECK_ERROR("Kernel execution failed: findCellStartD"); +} // findCellStart() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(findOverlappingPairs(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies)) +{ +#if B_CUDA_USE_TEX + BT_GPU_SAFE_CALL(cudaBindTexture(0, pAABBTex, pAABB, numBodies * 2 * sizeof(bt3DGrid3F1U))); +#endif + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 64, numBlocks, numThreads); + BT_GPU_EXECKERNEL(numBlocks, numThreads, findOverlappingPairsD, (pAABB,(uint2*)pHash,(uint*)pCellStart,(uint*)pPairBuff,(uint2*)pPairBuffStartCurr,numBodies)); + BT_GPU_CHECK_ERROR("Kernel execution failed: bt_CudaFindOverlappingPairsD"); +#if B_CUDA_USE_TEX + BT_GPU_SAFE_CALL(cudaUnbindTexture(pAABBTex)); +#endif +} // findOverlappingPairs() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(findPairsLarge(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies, unsigned int numLarge)) +{ +#if B_CUDA_USE_TEX + BT_GPU_SAFE_CALL(cudaBindTexture(0, pAABBTex, pAABB, (numBodies+numLarge) * 2 * sizeof(bt3DGrid3F1U))); +#endif + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 64, numBlocks, numThreads); + BT_GPU_EXECKERNEL(numBlocks, numThreads, findPairsLargeD, (pAABB,(uint2*)pHash,(uint*)pCellStart,(uint*)pPairBuff,(uint2*)pPairBuffStartCurr,numBodies,numLarge)); + BT_GPU_CHECK_ERROR("Kernel execution failed: btCuda_findPairsLargeD"); +#if B_CUDA_USE_TEX + BT_GPU_SAFE_CALL(cudaUnbindTexture(pAABBTex)); +#endif +} // findPairsLarge() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(computePairCacheChanges(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, bt3DGrid3F1U* pAABB, unsigned int numBodies)) +{ + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT_GPU_EXECKERNEL(numBlocks, numThreads, computePairCacheChangesD, ((uint*)pPairBuff,(uint2*)pPairBuffStartCurr,(uint*)pPairScan,pAABB,numBodies)); + BT_GPU_CHECK_ERROR("Kernel execution failed: btCudaComputePairCacheChangesD"); +} // computePairCacheChanges() + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(squeezeOverlappingPairBuff(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, unsigned int* pPairOut, bt3DGrid3F1U* pAABB, unsigned int numBodies)) +{ + int numThreads, numBlocks; + BT_GPU_PREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT_GPU_EXECKERNEL(numBlocks, numThreads, squeezeOverlappingPairBuffD, ((uint*)pPairBuff,(uint2*)pPairBuffStartCurr,(uint*)pPairScan,(uint*)pPairOut,pAABB,numBodies)); + BT_GPU_CHECK_ERROR("Kernel execution failed: btCudaSqueezeOverlappingPairBuffD"); +} // btCuda_squeezeOverlappingPairBuff() + +//------------------------------------------------------------------------------------------------ + +} // extern "C" + +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ diff --git a/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h b/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h index 37122da19..607bda7ed 100644 --- a/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h +++ b/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedDefs.h @@ -1,61 +1,61 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. - -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. -*/ - -//---------------------------------------------------------------------------------------- - -// Shared definitions for GPU-based 3D Grid collision detection broadphase - -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -// Keep this file free from Bullet headers -// it is included into both CUDA and CPU code -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -//---------------------------------------------------------------------------------------- - -#ifndef BTGPU3DGRIDBROADPHASESHAREDDEFS_H -#define BTGPU3DGRIDBROADPHASESHAREDDEFS_H - -//---------------------------------------------------------------------------------------- - -#include "btGpu3DGridBroadphaseSharedTypes.h" - -//---------------------------------------------------------------------------------------- - -extern "C" -{ - -//---------------------------------------------------------------------------------------- - -void BT_GPU_PREF(calcHashAABB)(bt3DGrid3F1U* pAABB, unsigned int* hash, unsigned int numBodies); - -void BT_GPU_PREF(findCellStart)(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells); - -void BT_GPU_PREF(findOverlappingPairs)(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies); - -void BT_GPU_PREF(findPairsLarge)(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies, unsigned int numLarge); - -void BT_GPU_PREF(computePairCacheChanges)(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, bt3DGrid3F1U* pAABB, unsigned int numBodies); - -void BT_GPU_PREF(squeezeOverlappingPairBuff)(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, unsigned int* pPairOut, bt3DGrid3F1U* pAABB, unsigned int numBodies); - - -//---------------------------------------------------------------------------------------- - -} // extern "C" - -//---------------------------------------------------------------------------------------- - -#endif // BTGPU3DGRIDBROADPHASESHAREDDEFS_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. + +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. +*/ + +//---------------------------------------------------------------------------------------- + +// Shared definitions for GPU-based 3D Grid collision detection broadphase + +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Keep this file free from Bullet headers +// it is included into both CUDA and CPU code +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +//---------------------------------------------------------------------------------------- + +#ifndef BTGPU3DGRIDBROADPHASESHAREDDEFS_H +#define BTGPU3DGRIDBROADPHASESHAREDDEFS_H + +//---------------------------------------------------------------------------------------- + +#include "btGpu3DGridBroadphaseSharedTypes.h" + +//---------------------------------------------------------------------------------------- + +extern "C" +{ + +//---------------------------------------------------------------------------------------- + +void BT_GPU_PREF(calcHashAABB)(bt3DGrid3F1U* pAABB, unsigned int* hash, unsigned int numBodies); + +void BT_GPU_PREF(findCellStart)(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells); + +void BT_GPU_PREF(findOverlappingPairs)(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies); + +void BT_GPU_PREF(findPairsLarge)(bt3DGrid3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies, unsigned int numLarge); + +void BT_GPU_PREF(computePairCacheChanges)(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, bt3DGrid3F1U* pAABB, unsigned int numBodies); + +void BT_GPU_PREF(squeezeOverlappingPairBuff)(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, unsigned int* pPairOut, bt3DGrid3F1U* pAABB, unsigned int numBodies); + + +//---------------------------------------------------------------------------------------- + +} // extern "C" + +//---------------------------------------------------------------------------------------- + +#endif // BTGPU3DGRIDBROADPHASESHAREDDEFS_H + diff --git a/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedTypes.h b/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedTypes.h index f3fa5965d..616a40094 100644 --- a/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedTypes.h +++ b/src/BulletMultiThreaded/btGpu3DGridBroadphaseSharedTypes.h @@ -1,67 +1,67 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. - -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. -*/ - -//---------------------------------------------------------------------------------------- - -// Shared definitions for GPU-based 3D Grid collision detection broadphase - -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -// Keep this file free from Bullet headers -// it is included into both CUDA and CPU code -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -//---------------------------------------------------------------------------------------- - -#ifndef BTGPU3DGRIDBROADPHASESHAREDTYPES_H -#define BTGPU3DGRIDBROADPHASESHAREDTYPES_H - -//---------------------------------------------------------------------------------------- - -#define BT_3DGRID_PAIR_FOUND_FLG (0x40000000) -#define BT_3DGRID_PAIR_NEW_FLG (0x20000000) -#define BT_3DGRID_PAIR_ANY_FLG (BT_3DGRID_PAIR_FOUND_FLG | BT_3DGRID_PAIR_NEW_FLG) - -//---------------------------------------------------------------------------------------- - -struct bt3DGridBroadphaseParams -{ - unsigned int m_gridSizeX; - unsigned int m_gridSizeY; - unsigned int m_gridSizeZ; - unsigned int m_numCells; - float m_worldOriginX; - float m_worldOriginY; - float m_worldOriginZ; - float m_cellSizeX; - float m_cellSizeY; - float m_cellSizeZ; - unsigned int m_numBodies; - unsigned int m_maxBodiesPerCell; -}; - -//---------------------------------------------------------------------------------------- - -struct bt3DGrid3F1U -{ - float fx; - float fy; - float fz; - unsigned int uw; -}; - -//---------------------------------------------------------------------------------------- - -#endif // BTGPU3DGRIDBROADPHASESHAREDTYPES_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. + +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. +*/ + +//---------------------------------------------------------------------------------------- + +// Shared definitions for GPU-based 3D Grid collision detection broadphase + +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Keep this file free from Bullet headers +// it is included into both CUDA and CPU code +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +//---------------------------------------------------------------------------------------- + +#ifndef BTGPU3DGRIDBROADPHASESHAREDTYPES_H +#define BTGPU3DGRIDBROADPHASESHAREDTYPES_H + +//---------------------------------------------------------------------------------------- + +#define BT_3DGRID_PAIR_FOUND_FLG (0x40000000) +#define BT_3DGRID_PAIR_NEW_FLG (0x20000000) +#define BT_3DGRID_PAIR_ANY_FLG (BT_3DGRID_PAIR_FOUND_FLG | BT_3DGRID_PAIR_NEW_FLG) + +//---------------------------------------------------------------------------------------- + +struct bt3DGridBroadphaseParams +{ + unsigned int m_gridSizeX; + unsigned int m_gridSizeY; + unsigned int m_gridSizeZ; + unsigned int m_numCells; + float m_worldOriginX; + float m_worldOriginY; + float m_worldOriginZ; + float m_cellSizeX; + float m_cellSizeY; + float m_cellSizeZ; + unsigned int m_numBodies; + unsigned int m_maxBodiesPerCell; +}; + +//---------------------------------------------------------------------------------------- + +struct bt3DGrid3F1U +{ + float fx; + float fy; + float fz; + unsigned int uw; +}; + +//---------------------------------------------------------------------------------------- + +#endif // BTGPU3DGRIDBROADPHASESHAREDTYPES_H + diff --git a/src/BulletMultiThreaded/btGpuUtilsSharedCode.h b/src/BulletMultiThreaded/btGpuUtilsSharedCode.h index 08c81f958..5761e7901 100644 --- a/src/BulletMultiThreaded/btGpuUtilsSharedCode.h +++ b/src/BulletMultiThreaded/btGpuUtilsSharedCode.h @@ -1,55 +1,55 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. - -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. -*/ - -//---------------------------------------------------------------------------------------- - -// Shared code for GPU-based utilities - -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -// Keep this file free from Bullet headers -// will be compiled by both CPU and CUDA compilers -// file with definitions of BT_GPU_xxx should be included first -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -//---------------------------------------------------------------------------------------- - -#include "btGpuUtilsSharedDefs.h" - -//---------------------------------------------------------------------------------------- - -extern "C" -{ - -//---------------------------------------------------------------------------------------- - -//Round a / b to nearest higher integer value -int BT_GPU_PREF(iDivUp)(int a, int b) -{ - return (a % b != 0) ? (a / b + 1) : (a / b); -} // iDivUp() - -//---------------------------------------------------------------------------------------- - -// compute grid and thread block size for a given number of elements -void BT_GPU_PREF(computeGridSize)(int n, int blockSize, int &numBlocks, int &numThreads) -{ - numThreads = BT_GPU_min(blockSize, n); - numBlocks = BT_GPU_PREF(iDivUp)(n, numThreads); -} // computeGridSize() - -//---------------------------------------------------------------------------------------- - -} // extern "C" - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2009 Sony Computer Entertainment Inc. + +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. +*/ + +//---------------------------------------------------------------------------------------- + +// Shared code for GPU-based utilities + +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Keep this file free from Bullet headers +// will be compiled by both CPU and CUDA compilers +// file with definitions of BT_GPU_xxx should be included first +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +//---------------------------------------------------------------------------------------- + +#include "btGpuUtilsSharedDefs.h" + +//---------------------------------------------------------------------------------------- + +extern "C" +{ + +//---------------------------------------------------------------------------------------- + +//Round a / b to nearest higher integer value +int BT_GPU_PREF(iDivUp)(int a, int b) +{ + return (a % b != 0) ? (a / b + 1) : (a / b); +} // iDivUp() + +//---------------------------------------------------------------------------------------- + +// compute grid and thread block size for a given number of elements +void BT_GPU_PREF(computeGridSize)(int n, int blockSize, int &numBlocks, int &numThreads) +{ + numThreads = BT_GPU_min(blockSize, n); + numBlocks = BT_GPU_PREF(iDivUp)(n, numThreads); +} // computeGridSize() + +//---------------------------------------------------------------------------------------- + +} // extern "C" + diff --git a/src/BulletMultiThreaded/btGpuUtilsSharedDefs.h b/src/BulletMultiThreaded/btGpuUtilsSharedDefs.h index 8dd4f8031..dccfda54c 100644 --- a/src/BulletMultiThreaded/btGpuUtilsSharedDefs.h +++ b/src/BulletMultiThreaded/btGpuUtilsSharedDefs.h @@ -1,52 +1,52 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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. -*/ - -// Shared definitions for GPU-based utilities - -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -// Keep this file free from Bullet headers -// it is included into both CUDA and CPU code -// file with definitions of BT_GPU_xxx should be included first -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - -#ifndef BTGPUUTILSDHAREDDEFS_H -#define BTGPUUTILSDHAREDDEFS_H - - -extern "C" -{ - - -//Round a / b to nearest higher integer value -int BT_GPU_PREF(iDivUp)(int a, int b); - -// compute grid and thread block size for a given number of elements -void BT_GPU_PREF(computeGridSize)(int n, int blockSize, int &numBlocks, int &numThreads); - -void BT_GPU_PREF(allocateArray)(void** devPtr, unsigned int size); -void BT_GPU_PREF(freeArray)(void* devPtr); -void BT_GPU_PREF(copyArrayFromDevice)(void* host, const void* device, unsigned int size); -void BT_GPU_PREF(copyArrayToDevice)(void* device, const void* host, unsigned int size); -void BT_GPU_PREF(registerGLBufferObject(unsigned int vbo)); -void* BT_GPU_PREF(mapGLBufferObject(unsigned int vbo)); -void BT_GPU_PREF(unmapGLBufferObject(unsigned int vbo)); - - -} // extern "C" - - -#endif // BTGPUUTILSDHAREDDEFS_H - +/* +Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org +Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. + +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. +*/ + +// Shared definitions for GPU-based utilities + +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Keep this file free from Bullet headers +// it is included into both CUDA and CPU code +// file with definitions of BT_GPU_xxx should be included first +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +#ifndef BTGPUUTILSDHAREDDEFS_H +#define BTGPUUTILSDHAREDDEFS_H + + +extern "C" +{ + + +//Round a / b to nearest higher integer value +int BT_GPU_PREF(iDivUp)(int a, int b); + +// compute grid and thread block size for a given number of elements +void BT_GPU_PREF(computeGridSize)(int n, int blockSize, int &numBlocks, int &numThreads); + +void BT_GPU_PREF(allocateArray)(void** devPtr, unsigned int size); +void BT_GPU_PREF(freeArray)(void* devPtr); +void BT_GPU_PREF(copyArrayFromDevice)(void* host, const void* device, unsigned int size); +void BT_GPU_PREF(copyArrayToDevice)(void* device, const void* host, unsigned int size); +void BT_GPU_PREF(registerGLBufferObject(unsigned int vbo)); +void* BT_GPU_PREF(mapGLBufferObject(unsigned int vbo)); +void BT_GPU_PREF(unmapGLBufferObject(unsigned int vbo)); + + +} // extern "C" + + +#endif // BTGPUUTILSDHAREDDEFS_H + diff --git a/src/BulletMultiThreaded/btParallelConstraintSolver.cpp b/src/BulletMultiThreaded/btParallelConstraintSolver.cpp index 4667dd718..84774b227 100644 --- a/src/BulletMultiThreaded/btParallelConstraintSolver.cpp +++ b/src/BulletMultiThreaded/btParallelConstraintSolver.cpp @@ -1,74 +1,74 @@ -/* - Copyright (C) 2010 Sony Computer Entertainment Inc. - All rights reserved. - -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 "btParallelConstraintSolver.h" -#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" - -btParallelConstraintSolver::btParallelConstraintSolver() -{ - - //initialize MiniCL here - -} - -btParallelConstraintSolver::~btParallelConstraintSolver() -{ - //exit MiniCL - -} - - -btScalar btParallelConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc) -{ - { - int i; - btPersistentManifold* manifold = 0; -// btCollisionObject* colObj0=0,*colObj1=0; - - - for (i=0;i -namespace Vectormath { - -class floatInVec; - -//-------------------------------------------------------------------------------------------------- -// boolInVec class -// - -class boolInVec -{ -private: - unsigned int mData; - -public: - // Default constructor; does no initialization - // - inline boolInVec( ) { }; - - // Construct from a value converted from float - // - inline boolInVec(floatInVec vec); - - // Explicit cast from bool - // - explicit inline boolInVec(bool scalar); - - // Explicit cast to bool - // - inline bool getAsBool() const; - -#ifndef _VECTORMATH_NO_SCALAR_CAST - // Implicit cast to bool - // - inline operator bool() const; -#endif - - // Boolean negation operator - // - inline const boolInVec operator ! () const; - - // Assignment operator - // - inline boolInVec& operator = (boolInVec vec); - - // Boolean and assignment operator - // - inline boolInVec& operator &= (boolInVec vec); - - // Boolean exclusive or assignment operator - // - inline boolInVec& operator ^= (boolInVec vec); - - // Boolean or assignment operator - // - inline boolInVec& operator |= (boolInVec vec); - -}; - -// Equal operator -// -inline const boolInVec operator == (boolInVec vec0, boolInVec vec1); - -// Not equal operator -// -inline const boolInVec operator != (boolInVec vec0, boolInVec vec1); - -// And operator -// -inline const boolInVec operator & (boolInVec vec0, boolInVec vec1); - -// Exclusive or operator -// -inline const boolInVec operator ^ (boolInVec vec0, boolInVec vec1); - -// Or operator -// -inline const boolInVec operator | (boolInVec vec0, boolInVec vec1); - -// Conditionally select between two values -// -inline const boolInVec select(boolInVec vec0, boolInVec vec1, boolInVec select_vec1); - - -} // namespace Vectormath - - -//-------------------------------------------------------------------------------------------------- -// boolInVec implementation -// - -#include "floatInVec.h" - -namespace Vectormath { - -inline -boolInVec::boolInVec(floatInVec vec) -{ - *this = (vec != floatInVec(0.0f)); -} - -inline -boolInVec::boolInVec(bool scalar) -{ - mData = -(int)scalar; -} - -inline -bool -boolInVec::getAsBool() const -{ - return (mData > 0); -} - -#ifndef _VECTORMATH_NO_SCALAR_CAST -inline -boolInVec::operator bool() const -{ - return getAsBool(); -} -#endif - -inline -const boolInVec -boolInVec::operator ! () const -{ - return boolInVec(!mData); -} - -inline -boolInVec& -boolInVec::operator = (boolInVec vec) -{ - mData = vec.mData; - return *this; -} - -inline -boolInVec& -boolInVec::operator &= (boolInVec vec) -{ - *this = *this & vec; - return *this; -} - -inline -boolInVec& -boolInVec::operator ^= (boolInVec vec) -{ - *this = *this ^ vec; - return *this; -} - -inline -boolInVec& -boolInVec::operator |= (boolInVec vec) -{ - *this = *this | vec; - return *this; -} - -inline -const boolInVec -operator == (boolInVec vec0, boolInVec vec1) -{ - return boolInVec(vec0.getAsBool() == vec1.getAsBool()); -} - -inline -const boolInVec -operator != (boolInVec vec0, boolInVec vec1) -{ - return !(vec0 == vec1); -} - -inline -const boolInVec -operator & (boolInVec vec0, boolInVec vec1) -{ - return boolInVec(vec0.getAsBool() & vec1.getAsBool()); -} - -inline -const boolInVec -operator | (boolInVec vec0, boolInVec vec1) -{ - return boolInVec(vec0.getAsBool() | vec1.getAsBool()); -} - -inline -const boolInVec -operator ^ (boolInVec vec0, boolInVec vec1) -{ - return boolInVec(vec0.getAsBool() ^ vec1.getAsBool()); -} - -inline -const boolInVec -select(boolInVec vec0, boolInVec vec1, boolInVec select_vec1) -{ - return (select_vec1.getAsBool() == 0) ? vec0 : vec1; -} - -} // namespace Vectormath - -#endif // boolInVec_h +/* + Copyright (C) 2009 Sony Computer Entertainment Inc. + All rights reserved. + +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 _BOOLINVEC_H +#define _BOOLINVEC_H + +#include +namespace Vectormath { + +class floatInVec; + +//-------------------------------------------------------------------------------------------------- +// boolInVec class +// + +class boolInVec +{ +private: + unsigned int mData; + +public: + // Default constructor; does no initialization + // + inline boolInVec( ) { }; + + // Construct from a value converted from float + // + inline boolInVec(floatInVec vec); + + // Explicit cast from bool + // + explicit inline boolInVec(bool scalar); + + // Explicit cast to bool + // + inline bool getAsBool() const; + +#ifndef _VECTORMATH_NO_SCALAR_CAST + // Implicit cast to bool + // + inline operator bool() const; +#endif + + // Boolean negation operator + // + inline const boolInVec operator ! () const; + + // Assignment operator + // + inline boolInVec& operator = (boolInVec vec); + + // Boolean and assignment operator + // + inline boolInVec& operator &= (boolInVec vec); + + // Boolean exclusive or assignment operator + // + inline boolInVec& operator ^= (boolInVec vec); + + // Boolean or assignment operator + // + inline boolInVec& operator |= (boolInVec vec); + +}; + +// Equal operator +// +inline const boolInVec operator == (boolInVec vec0, boolInVec vec1); + +// Not equal operator +// +inline const boolInVec operator != (boolInVec vec0, boolInVec vec1); + +// And operator +// +inline const boolInVec operator & (boolInVec vec0, boolInVec vec1); + +// Exclusive or operator +// +inline const boolInVec operator ^ (boolInVec vec0, boolInVec vec1); + +// Or operator +// +inline const boolInVec operator | (boolInVec vec0, boolInVec vec1); + +// Conditionally select between two values +// +inline const boolInVec select(boolInVec vec0, boolInVec vec1, boolInVec select_vec1); + + +} // namespace Vectormath + + +//-------------------------------------------------------------------------------------------------- +// boolInVec implementation +// + +#include "floatInVec.h" + +namespace Vectormath { + +inline +boolInVec::boolInVec(floatInVec vec) +{ + *this = (vec != floatInVec(0.0f)); +} + +inline +boolInVec::boolInVec(bool scalar) +{ + mData = -(int)scalar; +} + +inline +bool +boolInVec::getAsBool() const +{ + return (mData > 0); +} + +#ifndef _VECTORMATH_NO_SCALAR_CAST +inline +boolInVec::operator bool() const +{ + return getAsBool(); +} +#endif + +inline +const boolInVec +boolInVec::operator ! () const +{ + return boolInVec(!mData); +} + +inline +boolInVec& +boolInVec::operator = (boolInVec vec) +{ + mData = vec.mData; + return *this; +} + +inline +boolInVec& +boolInVec::operator &= (boolInVec vec) +{ + *this = *this & vec; + return *this; +} + +inline +boolInVec& +boolInVec::operator ^= (boolInVec vec) +{ + *this = *this ^ vec; + return *this; +} + +inline +boolInVec& +boolInVec::operator |= (boolInVec vec) +{ + *this = *this | vec; + return *this; +} + +inline +const boolInVec +operator == (boolInVec vec0, boolInVec vec1) +{ + return boolInVec(vec0.getAsBool() == vec1.getAsBool()); +} + +inline +const boolInVec +operator != (boolInVec vec0, boolInVec vec1) +{ + return !(vec0 == vec1); +} + +inline +const boolInVec +operator & (boolInVec vec0, boolInVec vec1) +{ + return boolInVec(vec0.getAsBool() & vec1.getAsBool()); +} + +inline +const boolInVec +operator | (boolInVec vec0, boolInVec vec1) +{ + return boolInVec(vec0.getAsBool() | vec1.getAsBool()); +} + +inline +const boolInVec +operator ^ (boolInVec vec0, boolInVec vec1) +{ + return boolInVec(vec0.getAsBool() ^ vec1.getAsBool()); +} + +inline +const boolInVec +select(boolInVec vec0, boolInVec vec1, boolInVec select_vec1) +{ + return (select_vec1.getAsBool() == 0) ? vec0 : vec1; +} + +} // namespace Vectormath + +#endif // boolInVec_h diff --git a/src/BulletMultiThreaded/vectormath/scalar/cpp/floatInVec.h b/src/BulletMultiThreaded/vectormath/scalar/cpp/floatInVec.h index c89f84a24..12d89e43d 100644 --- a/src/BulletMultiThreaded/vectormath/scalar/cpp/floatInVec.h +++ b/src/BulletMultiThreaded/vectormath/scalar/cpp/floatInVec.h @@ -1,343 +1,343 @@ -/* - Copyright (C) 2009 Sony Computer Entertainment Inc. - All rights reserved. - -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 _FLOATINVEC_H -#define _FLOATINVEC_H - -#include -namespace Vectormath { - -class boolInVec; - -//-------------------------------------------------------------------------------------------------- -// floatInVec class -// - -// A class representing a scalar float value contained in a vector register -// This class does not support fastmath -class floatInVec -{ -private: - float mData; - -public: - // Default constructor; does no initialization - // - inline floatInVec( ) { }; - - // Construct from a value converted from bool - // - inline floatInVec(boolInVec vec); - - // Explicit cast from float - // - explicit inline floatInVec(float scalar); - - // Explicit cast to float - // - inline float getAsFloat() const; - -#ifndef _VECTORMATH_NO_SCALAR_CAST - // Implicit cast to float - // - inline operator float() const; -#endif - - // Post increment (add 1.0f) - // - inline const floatInVec operator ++ (int); - - // Post decrement (subtract 1.0f) - // - inline const floatInVec operator -- (int); - - // Pre increment (add 1.0f) - // - inline floatInVec& operator ++ (); - - // Pre decrement (subtract 1.0f) - // - inline floatInVec& operator -- (); - - // Negation operator - // - inline const floatInVec operator - () const; - - // Assignment operator - // - inline floatInVec& operator = (floatInVec vec); - - // Multiplication assignment operator - // - inline floatInVec& operator *= (floatInVec vec); - - // Division assignment operator - // - inline floatInVec& operator /= (floatInVec vec); - - // Addition assignment operator - // - inline floatInVec& operator += (floatInVec vec); - - // Subtraction assignment operator - // - inline floatInVec& operator -= (floatInVec vec); - -}; - -// Multiplication operator -// -inline const floatInVec operator * (floatInVec vec0, floatInVec vec1); - -// Division operator -// -inline const floatInVec operator / (floatInVec vec0, floatInVec vec1); - -// Addition operator -// -inline const floatInVec operator + (floatInVec vec0, floatInVec vec1); - -// Subtraction operator -// -inline const floatInVec operator - (floatInVec vec0, floatInVec vec1); - -// Less than operator -// -inline const boolInVec operator < (floatInVec vec0, floatInVec vec1); - -// Less than or equal operator -// -inline const boolInVec operator <= (floatInVec vec0, floatInVec vec1); - -// Greater than operator -// -inline const boolInVec operator > (floatInVec vec0, floatInVec vec1); - -// Greater than or equal operator -// -inline const boolInVec operator >= (floatInVec vec0, floatInVec vec1); - -// Equal operator -// -inline const boolInVec operator == (floatInVec vec0, floatInVec vec1); - -// Not equal operator -// -inline const boolInVec operator != (floatInVec vec0, floatInVec vec1); - -// Conditionally select between two values -// -inline const floatInVec select(floatInVec vec0, floatInVec vec1, boolInVec select_vec1); - - -} // namespace Vectormath - - -//-------------------------------------------------------------------------------------------------- -// floatInVec implementation -// - -#include "boolInVec.h" - -namespace Vectormath { - -inline -floatInVec::floatInVec(boolInVec vec) -{ - mData = float(vec.getAsBool()); -} - -inline -floatInVec::floatInVec(float scalar) -{ - mData = scalar; -} - -inline -float -floatInVec::getAsFloat() const -{ - return mData; -} - -#ifndef _VECTORMATH_NO_SCALAR_CAST -inline -floatInVec::operator float() const -{ - return getAsFloat(); -} -#endif - -inline -const floatInVec -floatInVec::operator ++ (int) -{ - float olddata = mData; - operator ++(); - return floatInVec(olddata); -} - -inline -const floatInVec -floatInVec::operator -- (int) -{ - float olddata = mData; - operator --(); - return floatInVec(olddata); -} - -inline -floatInVec& -floatInVec::operator ++ () -{ - *this += floatInVec(1.0f); - return *this; -} - -inline -floatInVec& -floatInVec::operator -- () -{ - *this -= floatInVec(1.0f); - return *this; -} - -inline -const floatInVec -floatInVec::operator - () const -{ - return floatInVec(-mData); -} - -inline -floatInVec& -floatInVec::operator = (floatInVec vec) -{ - mData = vec.mData; - return *this; -} - -inline -floatInVec& -floatInVec::operator *= (floatInVec vec) -{ - *this = *this * vec; - return *this; -} - -inline -floatInVec& -floatInVec::operator /= (floatInVec vec) -{ - *this = *this / vec; - return *this; -} - -inline -floatInVec& -floatInVec::operator += (floatInVec vec) -{ - *this = *this + vec; - return *this; -} - -inline -floatInVec& -floatInVec::operator -= (floatInVec vec) -{ - *this = *this - vec; - return *this; -} - -inline -const floatInVec -operator * (floatInVec vec0, floatInVec vec1) -{ - return floatInVec(vec0.getAsFloat() * vec1.getAsFloat()); -} - -inline -const floatInVec -operator / (floatInVec num, floatInVec den) -{ - return floatInVec(num.getAsFloat() / den.getAsFloat()); -} - -inline -const floatInVec -operator + (floatInVec vec0, floatInVec vec1) -{ - return floatInVec(vec0.getAsFloat() + vec1.getAsFloat()); -} - -inline -const floatInVec -operator - (floatInVec vec0, floatInVec vec1) -{ - return floatInVec(vec0.getAsFloat() - vec1.getAsFloat()); -} - -inline -const boolInVec -operator < (floatInVec vec0, floatInVec vec1) -{ - return boolInVec(vec0.getAsFloat() < vec1.getAsFloat()); -} - -inline -const boolInVec -operator <= (floatInVec vec0, floatInVec vec1) -{ - return !(vec0 > vec1); -} - -inline -const boolInVec -operator > (floatInVec vec0, floatInVec vec1) -{ - return boolInVec(vec0.getAsFloat() > vec1.getAsFloat()); -} - -inline -const boolInVec -operator >= (floatInVec vec0, floatInVec vec1) -{ - return !(vec0 < vec1); -} - -inline -const boolInVec -operator == (floatInVec vec0, floatInVec vec1) -{ - return boolInVec(vec0.getAsFloat() == vec1.getAsFloat()); -} - -inline -const boolInVec -operator != (floatInVec vec0, floatInVec vec1) -{ - return !(vec0 == vec1); -} - -inline -const floatInVec -select(floatInVec vec0, floatInVec vec1, boolInVec select_vec1) -{ - return (select_vec1.getAsBool() == 0) ? vec0 : vec1; -} - -} // namespace Vectormath - -#endif // floatInVec_h +/* + Copyright (C) 2009 Sony Computer Entertainment Inc. + All rights reserved. + +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 _FLOATINVEC_H +#define _FLOATINVEC_H + +#include +namespace Vectormath { + +class boolInVec; + +//-------------------------------------------------------------------------------------------------- +// floatInVec class +// + +// A class representing a scalar float value contained in a vector register +// This class does not support fastmath +class floatInVec +{ +private: + float mData; + +public: + // Default constructor; does no initialization + // + inline floatInVec( ) { }; + + // Construct from a value converted from bool + // + inline floatInVec(boolInVec vec); + + // Explicit cast from float + // + explicit inline floatInVec(float scalar); + + // Explicit cast to float + // + inline float getAsFloat() const; + +#ifndef _VECTORMATH_NO_SCALAR_CAST + // Implicit cast to float + // + inline operator float() const; +#endif + + // Post increment (add 1.0f) + // + inline const floatInVec operator ++ (int); + + // Post decrement (subtract 1.0f) + // + inline const floatInVec operator -- (int); + + // Pre increment (add 1.0f) + // + inline floatInVec& operator ++ (); + + // Pre decrement (subtract 1.0f) + // + inline floatInVec& operator -- (); + + // Negation operator + // + inline const floatInVec operator - () const; + + // Assignment operator + // + inline floatInVec& operator = (floatInVec vec); + + // Multiplication assignment operator + // + inline floatInVec& operator *= (floatInVec vec); + + // Division assignment operator + // + inline floatInVec& operator /= (floatInVec vec); + + // Addition assignment operator + // + inline floatInVec& operator += (floatInVec vec); + + // Subtraction assignment operator + // + inline floatInVec& operator -= (floatInVec vec); + +}; + +// Multiplication operator +// +inline const floatInVec operator * (floatInVec vec0, floatInVec vec1); + +// Division operator +// +inline const floatInVec operator / (floatInVec vec0, floatInVec vec1); + +// Addition operator +// +inline const floatInVec operator + (floatInVec vec0, floatInVec vec1); + +// Subtraction operator +// +inline const floatInVec operator - (floatInVec vec0, floatInVec vec1); + +// Less than operator +// +inline const boolInVec operator < (floatInVec vec0, floatInVec vec1); + +// Less than or equal operator +// +inline const boolInVec operator <= (floatInVec vec0, floatInVec vec1); + +// Greater than operator +// +inline const boolInVec operator > (floatInVec vec0, floatInVec vec1); + +// Greater than or equal operator +// +inline const boolInVec operator >= (floatInVec vec0, floatInVec vec1); + +// Equal operator +// +inline const boolInVec operator == (floatInVec vec0, floatInVec vec1); + +// Not equal operator +// +inline const boolInVec operator != (floatInVec vec0, floatInVec vec1); + +// Conditionally select between two values +// +inline const floatInVec select(floatInVec vec0, floatInVec vec1, boolInVec select_vec1); + + +} // namespace Vectormath + + +//-------------------------------------------------------------------------------------------------- +// floatInVec implementation +// + +#include "boolInVec.h" + +namespace Vectormath { + +inline +floatInVec::floatInVec(boolInVec vec) +{ + mData = float(vec.getAsBool()); +} + +inline +floatInVec::floatInVec(float scalar) +{ + mData = scalar; +} + +inline +float +floatInVec::getAsFloat() const +{ + return mData; +} + +#ifndef _VECTORMATH_NO_SCALAR_CAST +inline +floatInVec::operator float() const +{ + return getAsFloat(); +} +#endif + +inline +const floatInVec +floatInVec::operator ++ (int) +{ + float olddata = mData; + operator ++(); + return floatInVec(olddata); +} + +inline +const floatInVec +floatInVec::operator -- (int) +{ + float olddata = mData; + operator --(); + return floatInVec(olddata); +} + +inline +floatInVec& +floatInVec::operator ++ () +{ + *this += floatInVec(1.0f); + return *this; +} + +inline +floatInVec& +floatInVec::operator -- () +{ + *this -= floatInVec(1.0f); + return *this; +} + +inline +const floatInVec +floatInVec::operator - () const +{ + return floatInVec(-mData); +} + +inline +floatInVec& +floatInVec::operator = (floatInVec vec) +{ + mData = vec.mData; + return *this; +} + +inline +floatInVec& +floatInVec::operator *= (floatInVec vec) +{ + *this = *this * vec; + return *this; +} + +inline +floatInVec& +floatInVec::operator /= (floatInVec vec) +{ + *this = *this / vec; + return *this; +} + +inline +floatInVec& +floatInVec::operator += (floatInVec vec) +{ + *this = *this + vec; + return *this; +} + +inline +floatInVec& +floatInVec::operator -= (floatInVec vec) +{ + *this = *this - vec; + return *this; +} + +inline +const floatInVec +operator * (floatInVec vec0, floatInVec vec1) +{ + return floatInVec(vec0.getAsFloat() * vec1.getAsFloat()); +} + +inline +const floatInVec +operator / (floatInVec num, floatInVec den) +{ + return floatInVec(num.getAsFloat() / den.getAsFloat()); +} + +inline +const floatInVec +operator + (floatInVec vec0, floatInVec vec1) +{ + return floatInVec(vec0.getAsFloat() + vec1.getAsFloat()); +} + +inline +const floatInVec +operator - (floatInVec vec0, floatInVec vec1) +{ + return floatInVec(vec0.getAsFloat() - vec1.getAsFloat()); +} + +inline +const boolInVec +operator < (floatInVec vec0, floatInVec vec1) +{ + return boolInVec(vec0.getAsFloat() < vec1.getAsFloat()); +} + +inline +const boolInVec +operator <= (floatInVec vec0, floatInVec vec1) +{ + return !(vec0 > vec1); +} + +inline +const boolInVec +operator > (floatInVec vec0, floatInVec vec1) +{ + return boolInVec(vec0.getAsFloat() > vec1.getAsFloat()); +} + +inline +const boolInVec +operator >= (floatInVec vec0, floatInVec vec1) +{ + return !(vec0 < vec1); +} + +inline +const boolInVec +operator == (floatInVec vec0, floatInVec vec1) +{ + return boolInVec(vec0.getAsFloat() == vec1.getAsFloat()); +} + +inline +const boolInVec +operator != (floatInVec vec0, floatInVec vec1) +{ + return !(vec0 == vec1); +} + +inline +const floatInVec +select(floatInVec vec0, floatInVec vec1, boolInVec select_vec1) +{ + return (select_vec1.getAsBool() == 0) ? vec0 : vec1; +} + +} // namespace Vectormath + +#endif // floatInVec_h diff --git a/src/LinearMath/btSerializer.cpp b/src/LinearMath/btSerializer.cpp index 30b52f752..10f613a0a 100644 --- a/src/LinearMath/btSerializer.cpp +++ b/src/LinearMath/btSerializer.cpp @@ -1,577 +1,577 @@ -unsigned char sBulletDNAstr64[]= { -83,68,78,65,78,65,77,69,-79,0,0,0,109,95,115,105,122,101,0,109, -95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, -99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, -108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, -115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115, -116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51, -93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,109, -95,114,111,111,116,78,111,100,101,73,110,100,101,120,0,109,95,115,117,98, -116,114,101,101,83,105,122,101,0,109,95,113,117,97,110,116,105,122,101,100, -65,97,98,98,77,105,110,91,51,93,0,109,95,113,117,97,110,116,105,122, -101,100,65,97,98,98,77,97,120,91,51,93,0,109,95,97,97,98,98,77, -105,110,79,114,103,0,109,95,97,97,98,98,77,97,120,79,114,103,0,109, -95,101,115,99,97,112,101,73,110,100,101,120,0,109,95,115,117,98,80,97, -114,116,0,109,95,116,114,105,97,110,103,108,101,73,110,100,101,120,0,109, -95,112,97,100,91,52,93,0,109,95,101,115,99,97,112,101,73,110,100,101, -120,79,114,84,114,105,97,110,103,108,101,73,110,100,101,120,0,109,95,98, -118,104,65,97,98,98,77,105,110,0,109,95,98,118,104,65,97,98,98,77, -97,120,0,109,95,98,118,104,81,117,97,110,116,105,122,97,116,105,111,110, -0,109,95,99,117,114,78,111,100,101,73,110,100,101,120,0,109,95,117,115, -101,81,117,97,110,116,105,122,97,116,105,111,110,0,109,95,110,117,109,67, -111,110,116,105,103,117,111,117,115,76,101,97,102,78,111,100,101,115,0,109, -95,110,117,109,81,117,97,110,116,105,122,101,100,67,111,110,116,105,103,117, -111,117,115,78,111,100,101,115,0,42,109,95,99,111,110,116,105,103,117,111, -117,115,78,111,100,101,115,80,116,114,0,42,109,95,113,117,97,110,116,105, -122,101,100,67,111,110,116,105,103,117,111,117,115,78,111,100,101,115,80,116, -114,0,42,109,95,115,117,98,84,114,101,101,73,110,102,111,80,116,114,0, -109,95,116,114,97,118,101,114,115,97,108,77,111,100,101,0,109,95,110,117, -109,83,117,98,116,114,101,101,72,101,97,100,101,114,115,0,42,109,95,110, -97,109,101,0,109,95,115,104,97,112,101,84,121,112,101,0,109,95,112,97, -100,100,105,110,103,91,52,93,0,109,95,99,111,108,108,105,115,105,111,110, -83,104,97,112,101,68,97,116,97,0,109,95,108,111,99,97,108,83,99,97, -108,105,110,103,0,109,95,112,108,97,110,101,78,111,114,109,97,108,0,109, -95,112,108,97,110,101,67,111,110,115,116,97,110,116,0,109,95,105,109,112, -108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115, -0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109, -95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100, -105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108, -83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111, -115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99, -97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0, -109,95,118,97,108,117,101,0,109,95,112,97,100,91,50,93,0,109,95,118, -97,108,117,101,115,91,51,93,0,42,109,95,118,101,114,116,105,99,101,115, -51,102,0,42,109,95,118,101,114,116,105,99,101,115,51,100,0,42,109,95, -105,110,100,105,99,101,115,51,50,0,42,109,95,51,105,110,100,105,99,101, -115,49,54,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110, -117,109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114, -116,105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116, -114,0,109,95,115,99,97,108,105,110,103,0,109,95,110,117,109,77,101,115, -104,80,97,114,116,115,0,109,95,109,101,115,104,73,110,116,101,114,102,97, -99,101,0,42,109,95,113,117,97,110,116,105,122,101,100,70,108,111,97,116, -66,118,104,0,42,109,95,113,117,97,110,116,105,122,101,100,68,111,117,98, -108,101,66,118,104,0,42,109,95,116,114,105,97,110,103,108,101,73,110,102, -111,77,97,112,0,109,95,112,97,100,51,91,52,93,0,109,95,116,114,97, -110,115,102,111,114,109,0,42,109,95,99,104,105,108,100,83,104,97,112,101, -0,109,95,99,104,105,108,100,83,104,97,112,101,84,121,112,101,0,109,95, -99,104,105,108,100,77,97,114,103,105,110,0,42,109,95,99,104,105,108,100, -83,104,97,112,101,80,116,114,0,109,95,110,117,109,67,104,105,108,100,83, -104,97,112,101,115,0,109,95,117,112,65,120,105,115,0,109,95,102,108,97, -103,115,0,109,95,101,100,103,101,86,48,86,49,65,110,103,108,101,0,109, -95,101,100,103,101,86,49,86,50,65,110,103,108,101,0,109,95,101,100,103, -101,86,50,86,48,65,110,103,108,101,0,42,109,95,104,97,115,104,84,97, -98,108,101,80,116,114,0,42,109,95,110,101,120,116,80,116,114,0,42,109, -95,118,97,108,117,101,65,114,114,97,121,80,116,114,0,42,109,95,107,101, -121,65,114,114,97,121,80,116,114,0,109,95,99,111,110,118,101,120,69,112, -115,105,108,111,110,0,109,95,112,108,97,110,97,114,69,112,115,105,108,111, -110,0,109,95,101,113,117,97,108,86,101,114,116,101,120,84,104,114,101,115, -104,111,108,100,0,109,95,101,100,103,101,68,105,115,116,97,110,99,101,84, -104,114,101,115,104,111,108,100,0,109,95,122,101,114,111,65,114,101,97,84, -104,114,101,115,104,111,108,100,0,109,95,110,101,120,116,83,105,122,101,0, -109,95,104,97,115,104,84,97,98,108,101,83,105,122,101,0,109,95,110,117, -109,86,97,108,117,101,115,0,109,95,110,117,109,75,101,121,115,0,109,95, -103,105,109,112,97,99,116,83,117,98,84,121,112,101,0,42,109,95,117,110, -115,99,97,108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114, -0,42,109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111, -117,98,108,101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101, -100,80,111,105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52, -93,0,42,109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108, -101,0,42,109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0, -42,109,95,114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112, -101,0,109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109, -95,105,110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84, -114,97,110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97, -116,105,111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109, -95,105,110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97, -114,86,101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111, -112,105,99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99, -116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100, -0,109,95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0, -109,95,102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117, -116,105,111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109, -95,99,99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117, -115,0,109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111, -108,100,0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70, -114,105,99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70, -108,97,103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95, -99,111,109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97, -116,105,111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97, -108,84,121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101, -87,105,116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101, -99,116,68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84, -101,110,115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86, -101,108,111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108, -111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111, -114,0,109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103, -114,97,118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99, -101,108,101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116, -105,97,76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101, -0,109,95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118, -101,114,115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109, -112,105,110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110, -103,0,109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110, -103,70,97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108, -76,105,110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111, -108,100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110, -103,117,108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108, -100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103, -117,108,97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95, -108,105,110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104, -111,108,100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110, -103,84,104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111, -110,97,108,68,97,109,112,105,110,103,0,109,95,110,117,109,67,111,110,115, -116,114,97,105,110,116,82,111,119,115,0,110,117,98,0,42,109,95,114,98, -65,0,42,109,95,114,98,66,0,109,95,111,98,106,101,99,116,84,121,112, -101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,84,121, -112,101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,73, -100,0,109,95,110,101,101,100,115,70,101,101,100,98,97,99,107,0,109,95, -97,112,112,108,105,101,100,73,109,112,117,108,115,101,0,109,95,100,98,103, -68,114,97,119,83,105,122,101,0,109,95,100,105,115,97,98,108,101,67,111, -108,108,105,115,105,111,110,115,66,101,116,119,101,101,110,76,105,110,107,101, -100,66,111,100,105,101,115,0,109,95,112,97,100,52,91,52,93,0,109,95, -116,121,112,101,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,109, -95,112,105,118,111,116,73,110,65,0,109,95,112,105,118,111,116,73,110,66, -0,109,95,114,98,65,70,114,97,109,101,0,109,95,114,98,66,70,114,97, -109,101,0,109,95,117,115,101,82,101,102,101,114,101,110,99,101,70,114,97, -109,101,65,0,109,95,97,110,103,117,108,97,114,79,110,108,121,0,109,95, -101,110,97,98,108,101,65,110,103,117,108,97,114,77,111,116,111,114,0,109, -95,109,111,116,111,114,84,97,114,103,101,116,86,101,108,111,99,105,116,121, -0,109,95,109,97,120,77,111,116,111,114,73,109,112,117,108,115,101,0,109, -95,108,111,119,101,114,76,105,109,105,116,0,109,95,117,112,112,101,114,76, -105,109,105,116,0,109,95,108,105,109,105,116,83,111,102,116,110,101,115,115, -0,109,95,98,105,97,115,70,97,99,116,111,114,0,109,95,114,101,108,97, -120,97,116,105,111,110,70,97,99,116,111,114,0,109,95,115,119,105,110,103, -83,112,97,110,49,0,109,95,115,119,105,110,103,83,112,97,110,50,0,109, -95,116,119,105,115,116,83,112,97,110,0,109,95,100,97,109,112,105,110,103, -0,109,95,108,105,110,101,97,114,85,112,112,101,114,76,105,109,105,116,0, -109,95,108,105,110,101,97,114,76,111,119,101,114,76,105,109,105,116,0,109, -95,97,110,103,117,108,97,114,85,112,112,101,114,76,105,109,105,116,0,109, -95,97,110,103,117,108,97,114,76,111,119,101,114,76,105,109,105,116,0,109, -95,117,115,101,76,105,110,101,97,114,82,101,102,101,114,101,110,99,101,70, -114,97,109,101,65,0,109,95,117,115,101,79,102,102,115,101,116,70,111,114, -67,111,110,115,116,114,97,105,110,116,70,114,97,109,101,0,84,89,80,69, -58,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, -0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, -110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, -0,80,111,105,110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115, -105,99,115,83,121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98, -116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116, -86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116, -77,97,116,114,105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98, -116,77,97,116,114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97, -0,98,116,84,114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116, -97,0,98,116,84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68, -97,116,97,0,98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111, -68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78, -111,100,101,70,108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109, -105,122,101,100,66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116, -97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101, -68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70, -108,111,97,116,68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100, -66,118,104,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, -105,115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97, -116,105,99,80,108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116, -67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68, -97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100, -105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97, -112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116, -97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116, -97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105, -112,108,101,116,68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68, -97,116,97,0,98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110, -116,101,114,102,97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103, -108,101,77,101,115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114, -105,97,110,103,108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116, -67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97, -116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97, -116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97, -116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116, -97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97, -0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68, -97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112, -101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106, -101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, -105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97, -0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116, -97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68, -97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111, -49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68, -97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0, -98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97, -105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116, -50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98, -108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114, -97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110, -103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116, -97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97, -105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111, -102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108, -105,100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,0, -84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0,4,0,4,0, -8,0,0,0,16,0,48,0,16,0,16,0,32,0,48,0,96,0,64,0, --128,0,20,0,48,0,80,0,16,0,96,0,-112,0,16,0,56,0,56,0, -20,0,72,0,4,0,4,0,8,0,48,0,32,0,80,0,72,0,80,0, -32,0,64,0,64,0,16,0,72,0,80,0,-40,1,8,1,-16,1,-88,3, -8,0,56,0,0,0,88,0,120,0,96,1,-32,0,-40,0,0,1,-48,0, -83,84,82,67,47,0,0,0,10,0,3,0,4,0,0,0,4,0,1,0, -9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0,10,0,5,0, -12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0,7,0,8,0, -14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0,16,0,1,0, -14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0,18,0,2,0, -16,0,10,0,14,0,11,0,19,0,4,0,4,0,12,0,4,0,13,0, -2,0,14,0,2,0,15,0,20,0,6,0,13,0,16,0,13,0,17,0, -4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0,21,0,6,0, -14,0,16,0,14,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0, -0,0,21,0,22,0,3,0,2,0,14,0,2,0,15,0,4,0,22,0, -23,0,12,0,13,0,23,0,13,0,24,0,13,0,25,0,4,0,26,0, -4,0,27,0,4,0,28,0,4,0,29,0,20,0,30,0,22,0,31,0, -19,0,32,0,4,0,33,0,4,0,34,0,24,0,12,0,14,0,23,0, -14,0,24,0,14,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0, -4,0,29,0,21,0,30,0,22,0,31,0,4,0,33,0,4,0,34,0, -19,0,32,0,25,0,3,0,0,0,35,0,4,0,36,0,0,0,37,0, -26,0,5,0,25,0,38,0,13,0,39,0,13,0,40,0,7,0,41,0, -0,0,21,0,27,0,5,0,25,0,38,0,13,0,39,0,13,0,42,0, -7,0,43,0,4,0,44,0,28,0,2,0,13,0,45,0,7,0,46,0, -29,0,4,0,27,0,47,0,28,0,48,0,4,0,49,0,0,0,37,0, -30,0,1,0,4,0,50,0,31,0,2,0,2,0,50,0,0,0,51,0, -32,0,2,0,2,0,52,0,0,0,51,0,33,0,7,0,13,0,53,0, -14,0,54,0,30,0,55,0,32,0,56,0,31,0,57,0,4,0,58,0, -4,0,59,0,34,0,4,0,33,0,60,0,13,0,61,0,4,0,62,0, -0,0,37,0,35,0,7,0,25,0,38,0,34,0,63,0,23,0,64,0, -24,0,65,0,36,0,66,0,7,0,43,0,0,0,67,0,37,0,4,0, -17,0,68,0,25,0,69,0,4,0,70,0,7,0,71,0,38,0,4,0, -25,0,38,0,37,0,72,0,4,0,73,0,7,0,43,0,39,0,3,0, -27,0,47,0,4,0,74,0,0,0,37,0,40,0,3,0,27,0,47,0, -4,0,74,0,0,0,37,0,41,0,4,0,4,0,75,0,7,0,76,0, -7,0,77,0,7,0,78,0,36,0,14,0,4,0,79,0,4,0,80,0, -41,0,81,0,4,0,82,0,7,0,83,0,7,0,84,0,7,0,85,0, -7,0,86,0,7,0,87,0,4,0,88,0,4,0,89,0,4,0,90,0, -4,0,91,0,0,0,37,0,42,0,5,0,25,0,38,0,34,0,63,0, -13,0,39,0,7,0,43,0,4,0,92,0,43,0,5,0,27,0,47,0, -13,0,93,0,14,0,94,0,4,0,95,0,0,0,96,0,44,0,24,0, -9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,18,0,100,0, -18,0,101,0,14,0,102,0,14,0,103,0,14,0,104,0,8,0,105,0, -8,0,106,0,8,0,107,0,8,0,108,0,8,0,109,0,8,0,110,0, -8,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, -4,0,116,0,4,0,117,0,4,0,118,0,0,0,37,0,45,0,23,0, -9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,17,0,100,0, -17,0,101,0,13,0,102,0,13,0,103,0,13,0,104,0,7,0,105,0, -7,0,106,0,7,0,107,0,7,0,108,0,7,0,109,0,7,0,110,0, -7,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, -4,0,116,0,4,0,117,0,4,0,118,0,46,0,21,0,45,0,119,0, -15,0,120,0,13,0,121,0,13,0,122,0,13,0,123,0,13,0,124,0, -13,0,125,0,13,0,126,0,13,0,127,0,13,0,-128,0,13,0,-127,0, -7,0,-126,0,7,0,-125,0,7,0,-124,0,7,0,-123,0,7,0,-122,0, -7,0,-121,0,7,0,-120,0,7,0,-119,0,7,0,-118,0,4,0,-117,0, -47,0,22,0,44,0,119,0,16,0,120,0,14,0,121,0,14,0,122,0, -14,0,123,0,14,0,124,0,14,0,125,0,14,0,126,0,14,0,127,0, -14,0,-128,0,14,0,-127,0,8,0,-126,0,8,0,-125,0,8,0,-124,0, -8,0,-123,0,8,0,-122,0,8,0,-121,0,8,0,-120,0,8,0,-119,0, -8,0,-118,0,4,0,-117,0,0,0,37,0,48,0,2,0,4,0,-116,0, -4,0,-115,0,49,0,11,0,50,0,-114,0,50,0,-113,0,0,0,35,0, -4,0,-112,0,4,0,-111,0,4,0,-110,0,4,0,-109,0,7,0,-108,0, -7,0,-107,0,4,0,-106,0,0,0,-105,0,51,0,3,0,49,0,-104,0, -13,0,-103,0,13,0,-102,0,52,0,3,0,49,0,-104,0,14,0,-103,0, -14,0,-102,0,53,0,13,0,49,0,-104,0,18,0,-101,0,18,0,-100,0, -4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0, -7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, -54,0,13,0,49,0,-104,0,17,0,-101,0,17,0,-100,0,4,0,-99,0, -4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0,7,0,-94,0, -7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,55,0,11,0, -49,0,-104,0,17,0,-101,0,17,0,-100,0,7,0,-89,0,7,0,-88,0, -7,0,-87,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,7,0,-86,0, -0,0,21,0,56,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, -13,0,-85,0,13,0,-84,0,13,0,-83,0,13,0,-82,0,4,0,-81,0, -4,0,-80,0,57,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, -7,0,-85,0,7,0,-84,0,7,0,-83,0,7,0,-82,0,4,0,-81,0, -4,0,-80,0,}; -int sBulletDNAlen64= sizeof(sBulletDNAstr64); - -unsigned char sBulletDNAstr[]= { -83,68,78,65,78,65,77,69,-79,0,0,0,109,95,115,105,122,101,0,109, -95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, -99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, -108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, -115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115, -116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51, -93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,109, -95,114,111,111,116,78,111,100,101,73,110,100,101,120,0,109,95,115,117,98, -116,114,101,101,83,105,122,101,0,109,95,113,117,97,110,116,105,122,101,100, -65,97,98,98,77,105,110,91,51,93,0,109,95,113,117,97,110,116,105,122, -101,100,65,97,98,98,77,97,120,91,51,93,0,109,95,97,97,98,98,77, -105,110,79,114,103,0,109,95,97,97,98,98,77,97,120,79,114,103,0,109, -95,101,115,99,97,112,101,73,110,100,101,120,0,109,95,115,117,98,80,97, -114,116,0,109,95,116,114,105,97,110,103,108,101,73,110,100,101,120,0,109, -95,112,97,100,91,52,93,0,109,95,101,115,99,97,112,101,73,110,100,101, -120,79,114,84,114,105,97,110,103,108,101,73,110,100,101,120,0,109,95,98, -118,104,65,97,98,98,77,105,110,0,109,95,98,118,104,65,97,98,98,77, -97,120,0,109,95,98,118,104,81,117,97,110,116,105,122,97,116,105,111,110, -0,109,95,99,117,114,78,111,100,101,73,110,100,101,120,0,109,95,117,115, -101,81,117,97,110,116,105,122,97,116,105,111,110,0,109,95,110,117,109,67, -111,110,116,105,103,117,111,117,115,76,101,97,102,78,111,100,101,115,0,109, -95,110,117,109,81,117,97,110,116,105,122,101,100,67,111,110,116,105,103,117, -111,117,115,78,111,100,101,115,0,42,109,95,99,111,110,116,105,103,117,111, -117,115,78,111,100,101,115,80,116,114,0,42,109,95,113,117,97,110,116,105, -122,101,100,67,111,110,116,105,103,117,111,117,115,78,111,100,101,115,80,116, -114,0,42,109,95,115,117,98,84,114,101,101,73,110,102,111,80,116,114,0, -109,95,116,114,97,118,101,114,115,97,108,77,111,100,101,0,109,95,110,117, -109,83,117,98,116,114,101,101,72,101,97,100,101,114,115,0,42,109,95,110, -97,109,101,0,109,95,115,104,97,112,101,84,121,112,101,0,109,95,112,97, -100,100,105,110,103,91,52,93,0,109,95,99,111,108,108,105,115,105,111,110, -83,104,97,112,101,68,97,116,97,0,109,95,108,111,99,97,108,83,99,97, -108,105,110,103,0,109,95,112,108,97,110,101,78,111,114,109,97,108,0,109, -95,112,108,97,110,101,67,111,110,115,116,97,110,116,0,109,95,105,109,112, -108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115, -0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109, -95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100, -105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108, -83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111, -115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99, -97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0, -109,95,118,97,108,117,101,0,109,95,112,97,100,91,50,93,0,109,95,118, -97,108,117,101,115,91,51,93,0,42,109,95,118,101,114,116,105,99,101,115, -51,102,0,42,109,95,118,101,114,116,105,99,101,115,51,100,0,42,109,95, -105,110,100,105,99,101,115,51,50,0,42,109,95,51,105,110,100,105,99,101, -115,49,54,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110, -117,109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114, -116,105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116, -114,0,109,95,115,99,97,108,105,110,103,0,109,95,110,117,109,77,101,115, -104,80,97,114,116,115,0,109,95,109,101,115,104,73,110,116,101,114,102,97, -99,101,0,42,109,95,113,117,97,110,116,105,122,101,100,70,108,111,97,116, -66,118,104,0,42,109,95,113,117,97,110,116,105,122,101,100,68,111,117,98, -108,101,66,118,104,0,42,109,95,116,114,105,97,110,103,108,101,73,110,102, -111,77,97,112,0,109,95,112,97,100,51,91,52,93,0,109,95,116,114,97, -110,115,102,111,114,109,0,42,109,95,99,104,105,108,100,83,104,97,112,101, -0,109,95,99,104,105,108,100,83,104,97,112,101,84,121,112,101,0,109,95, -99,104,105,108,100,77,97,114,103,105,110,0,42,109,95,99,104,105,108,100, -83,104,97,112,101,80,116,114,0,109,95,110,117,109,67,104,105,108,100,83, -104,97,112,101,115,0,109,95,117,112,65,120,105,115,0,109,95,102,108,97, -103,115,0,109,95,101,100,103,101,86,48,86,49,65,110,103,108,101,0,109, -95,101,100,103,101,86,49,86,50,65,110,103,108,101,0,109,95,101,100,103, -101,86,50,86,48,65,110,103,108,101,0,42,109,95,104,97,115,104,84,97, -98,108,101,80,116,114,0,42,109,95,110,101,120,116,80,116,114,0,42,109, -95,118,97,108,117,101,65,114,114,97,121,80,116,114,0,42,109,95,107,101, -121,65,114,114,97,121,80,116,114,0,109,95,99,111,110,118,101,120,69,112, -115,105,108,111,110,0,109,95,112,108,97,110,97,114,69,112,115,105,108,111, -110,0,109,95,101,113,117,97,108,86,101,114,116,101,120,84,104,114,101,115, -104,111,108,100,0,109,95,101,100,103,101,68,105,115,116,97,110,99,101,84, -104,114,101,115,104,111,108,100,0,109,95,122,101,114,111,65,114,101,97,84, -104,114,101,115,104,111,108,100,0,109,95,110,101,120,116,83,105,122,101,0, -109,95,104,97,115,104,84,97,98,108,101,83,105,122,101,0,109,95,110,117, -109,86,97,108,117,101,115,0,109,95,110,117,109,75,101,121,115,0,109,95, -103,105,109,112,97,99,116,83,117,98,84,121,112,101,0,42,109,95,117,110, -115,99,97,108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114, -0,42,109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111, -117,98,108,101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101, -100,80,111,105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52, -93,0,42,109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108, -101,0,42,109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0, -42,109,95,114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112, -101,0,109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109, -95,105,110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84, -114,97,110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97, -116,105,111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109, -95,105,110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97, -114,86,101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111, -112,105,99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99, -116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100, -0,109,95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0, -109,95,102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117, -116,105,111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109, -95,99,99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117, -115,0,109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111, -108,100,0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70, -114,105,99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70, -108,97,103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95, -99,111,109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97, -116,105,111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97, -108,84,121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101, -87,105,116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101, -99,116,68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84, -101,110,115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86, -101,108,111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108, -111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111, -114,0,109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103, -114,97,118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99, -101,108,101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116, -105,97,76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101, -0,109,95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118, -101,114,115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109, -112,105,110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110, -103,0,109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110, -103,70,97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108, -76,105,110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111, -108,100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110, -103,117,108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108, -100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103, -117,108,97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95, -108,105,110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104, -111,108,100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110, -103,84,104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111, -110,97,108,68,97,109,112,105,110,103,0,109,95,110,117,109,67,111,110,115, -116,114,97,105,110,116,82,111,119,115,0,110,117,98,0,42,109,95,114,98, -65,0,42,109,95,114,98,66,0,109,95,111,98,106,101,99,116,84,121,112, -101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,84,121, -112,101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,73, -100,0,109,95,110,101,101,100,115,70,101,101,100,98,97,99,107,0,109,95, -97,112,112,108,105,101,100,73,109,112,117,108,115,101,0,109,95,100,98,103, -68,114,97,119,83,105,122,101,0,109,95,100,105,115,97,98,108,101,67,111, -108,108,105,115,105,111,110,115,66,101,116,119,101,101,110,76,105,110,107,101, -100,66,111,100,105,101,115,0,109,95,112,97,100,52,91,52,93,0,109,95, -116,121,112,101,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,109, -95,112,105,118,111,116,73,110,65,0,109,95,112,105,118,111,116,73,110,66, -0,109,95,114,98,65,70,114,97,109,101,0,109,95,114,98,66,70,114,97, -109,101,0,109,95,117,115,101,82,101,102,101,114,101,110,99,101,70,114,97, -109,101,65,0,109,95,97,110,103,117,108,97,114,79,110,108,121,0,109,95, -101,110,97,98,108,101,65,110,103,117,108,97,114,77,111,116,111,114,0,109, -95,109,111,116,111,114,84,97,114,103,101,116,86,101,108,111,99,105,116,121, -0,109,95,109,97,120,77,111,116,111,114,73,109,112,117,108,115,101,0,109, -95,108,111,119,101,114,76,105,109,105,116,0,109,95,117,112,112,101,114,76, -105,109,105,116,0,109,95,108,105,109,105,116,83,111,102,116,110,101,115,115, -0,109,95,98,105,97,115,70,97,99,116,111,114,0,109,95,114,101,108,97, -120,97,116,105,111,110,70,97,99,116,111,114,0,109,95,115,119,105,110,103, -83,112,97,110,49,0,109,95,115,119,105,110,103,83,112,97,110,50,0,109, -95,116,119,105,115,116,83,112,97,110,0,109,95,100,97,109,112,105,110,103, -0,109,95,108,105,110,101,97,114,85,112,112,101,114,76,105,109,105,116,0, -109,95,108,105,110,101,97,114,76,111,119,101,114,76,105,109,105,116,0,109, -95,97,110,103,117,108,97,114,85,112,112,101,114,76,105,109,105,116,0,109, -95,97,110,103,117,108,97,114,76,111,119,101,114,76,105,109,105,116,0,109, -95,117,115,101,76,105,110,101,97,114,82,101,102,101,114,101,110,99,101,70, -114,97,109,101,65,0,109,95,117,115,101,79,102,102,115,101,116,70,111,114, -67,111,110,115,116,114,97,105,110,116,70,114,97,109,101,0,84,89,80,69, -58,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, -0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, -110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, -0,80,111,105,110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115, -105,99,115,83,121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98, -116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116, -86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116, -77,97,116,114,105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98, -116,77,97,116,114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97, -0,98,116,84,114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116, -97,0,98,116,84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68, -97,116,97,0,98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111, -68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78, -111,100,101,70,108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109, -105,122,101,100,66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116, -97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101, -68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70, -108,111,97,116,68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100, -66,118,104,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, -105,115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97, -116,105,99,80,108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116, -67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68, -97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100, -105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97, -112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116, -97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116, -97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105, -112,108,101,116,68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68, -97,116,97,0,98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110, -116,101,114,102,97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103, -108,101,77,101,115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114, -105,97,110,103,108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116, -67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97, -116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97, -116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97, -116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116, -97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97, -0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68, -97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112, -101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106, -101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, -105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97, -0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116, -97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68, -97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111, -49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68, -97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0, -98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97, -105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116, -50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98, -108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114, -97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110, -103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116, -97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97, -105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111, -102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108, -105,100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,0, -84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0,4,0,4,0, -8,0,0,0,12,0,36,0,8,0,16,0,32,0,48,0,96,0,64,0, --128,0,20,0,48,0,80,0,16,0,84,0,-124,0,12,0,52,0,52,0, -20,0,64,0,4,0,4,0,8,0,28,0,28,0,60,0,56,0,76,0, -24,0,60,0,60,0,16,0,64,0,68,0,-56,1,-8,0,-32,1,-104,3, -8,0,44,0,0,0,76,0,108,0,84,1,-44,0,-52,0,-12,0,-60,0, -83,84,82,67,47,0,0,0,10,0,3,0,4,0,0,0,4,0,1,0, -9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0,10,0,5,0, -12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0,7,0,8,0, -14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0,16,0,1,0, -14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0,18,0,2,0, -16,0,10,0,14,0,11,0,19,0,4,0,4,0,12,0,4,0,13,0, -2,0,14,0,2,0,15,0,20,0,6,0,13,0,16,0,13,0,17,0, -4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0,21,0,6,0, -14,0,16,0,14,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0, -0,0,21,0,22,0,3,0,2,0,14,0,2,0,15,0,4,0,22,0, -23,0,12,0,13,0,23,0,13,0,24,0,13,0,25,0,4,0,26,0, -4,0,27,0,4,0,28,0,4,0,29,0,20,0,30,0,22,0,31,0, -19,0,32,0,4,0,33,0,4,0,34,0,24,0,12,0,14,0,23,0, -14,0,24,0,14,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0, -4,0,29,0,21,0,30,0,22,0,31,0,4,0,33,0,4,0,34,0, -19,0,32,0,25,0,3,0,0,0,35,0,4,0,36,0,0,0,37,0, -26,0,5,0,25,0,38,0,13,0,39,0,13,0,40,0,7,0,41,0, -0,0,21,0,27,0,5,0,25,0,38,0,13,0,39,0,13,0,42,0, -7,0,43,0,4,0,44,0,28,0,2,0,13,0,45,0,7,0,46,0, -29,0,4,0,27,0,47,0,28,0,48,0,4,0,49,0,0,0,37,0, -30,0,1,0,4,0,50,0,31,0,2,0,2,0,50,0,0,0,51,0, -32,0,2,0,2,0,52,0,0,0,51,0,33,0,7,0,13,0,53,0, -14,0,54,0,30,0,55,0,32,0,56,0,31,0,57,0,4,0,58,0, -4,0,59,0,34,0,4,0,33,0,60,0,13,0,61,0,4,0,62,0, -0,0,37,0,35,0,7,0,25,0,38,0,34,0,63,0,23,0,64,0, -24,0,65,0,36,0,66,0,7,0,43,0,0,0,67,0,37,0,4,0, -17,0,68,0,25,0,69,0,4,0,70,0,7,0,71,0,38,0,4,0, -25,0,38,0,37,0,72,0,4,0,73,0,7,0,43,0,39,0,3,0, -27,0,47,0,4,0,74,0,0,0,37,0,40,0,3,0,27,0,47,0, -4,0,74,0,0,0,37,0,41,0,4,0,4,0,75,0,7,0,76,0, -7,0,77,0,7,0,78,0,36,0,14,0,4,0,79,0,4,0,80,0, -41,0,81,0,4,0,82,0,7,0,83,0,7,0,84,0,7,0,85,0, -7,0,86,0,7,0,87,0,4,0,88,0,4,0,89,0,4,0,90,0, -4,0,91,0,0,0,37,0,42,0,5,0,25,0,38,0,34,0,63,0, -13,0,39,0,7,0,43,0,4,0,92,0,43,0,5,0,27,0,47,0, -13,0,93,0,14,0,94,0,4,0,95,0,0,0,96,0,44,0,24,0, -9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,18,0,100,0, -18,0,101,0,14,0,102,0,14,0,103,0,14,0,104,0,8,0,105,0, -8,0,106,0,8,0,107,0,8,0,108,0,8,0,109,0,8,0,110,0, -8,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, -4,0,116,0,4,0,117,0,4,0,118,0,0,0,37,0,45,0,23,0, -9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,17,0,100,0, -17,0,101,0,13,0,102,0,13,0,103,0,13,0,104,0,7,0,105,0, -7,0,106,0,7,0,107,0,7,0,108,0,7,0,109,0,7,0,110,0, -7,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, -4,0,116,0,4,0,117,0,4,0,118,0,46,0,21,0,45,0,119,0, -15,0,120,0,13,0,121,0,13,0,122,0,13,0,123,0,13,0,124,0, -13,0,125,0,13,0,126,0,13,0,127,0,13,0,-128,0,13,0,-127,0, -7,0,-126,0,7,0,-125,0,7,0,-124,0,7,0,-123,0,7,0,-122,0, -7,0,-121,0,7,0,-120,0,7,0,-119,0,7,0,-118,0,4,0,-117,0, -47,0,22,0,44,0,119,0,16,0,120,0,14,0,121,0,14,0,122,0, -14,0,123,0,14,0,124,0,14,0,125,0,14,0,126,0,14,0,127,0, -14,0,-128,0,14,0,-127,0,8,0,-126,0,8,0,-125,0,8,0,-124,0, -8,0,-123,0,8,0,-122,0,8,0,-121,0,8,0,-120,0,8,0,-119,0, -8,0,-118,0,4,0,-117,0,0,0,37,0,48,0,2,0,4,0,-116,0, -4,0,-115,0,49,0,11,0,50,0,-114,0,50,0,-113,0,0,0,35,0, -4,0,-112,0,4,0,-111,0,4,0,-110,0,4,0,-109,0,7,0,-108,0, -7,0,-107,0,4,0,-106,0,0,0,-105,0,51,0,3,0,49,0,-104,0, -13,0,-103,0,13,0,-102,0,52,0,3,0,49,0,-104,0,14,0,-103,0, -14,0,-102,0,53,0,13,0,49,0,-104,0,18,0,-101,0,18,0,-100,0, -4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0, -7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, -54,0,13,0,49,0,-104,0,17,0,-101,0,17,0,-100,0,4,0,-99,0, -4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0,7,0,-94,0, -7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,55,0,11,0, -49,0,-104,0,17,0,-101,0,17,0,-100,0,7,0,-89,0,7,0,-88,0, -7,0,-87,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,7,0,-86,0, -0,0,21,0,56,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, -13,0,-85,0,13,0,-84,0,13,0,-83,0,13,0,-82,0,4,0,-81,0, -4,0,-80,0,57,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, -7,0,-85,0,7,0,-84,0,7,0,-83,0,7,0,-82,0,4,0,-81,0, -4,0,-80,0,}; -int sBulletDNAlen= sizeof(sBulletDNAstr); +unsigned char sBulletDNAstr64[]= { +83,68,78,65,78,65,77,69,-79,0,0,0,109,95,115,105,122,101,0,109, +95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, +99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, +108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, +115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115, +116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51, +93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,109, +95,114,111,111,116,78,111,100,101,73,110,100,101,120,0,109,95,115,117,98, +116,114,101,101,83,105,122,101,0,109,95,113,117,97,110,116,105,122,101,100, +65,97,98,98,77,105,110,91,51,93,0,109,95,113,117,97,110,116,105,122, +101,100,65,97,98,98,77,97,120,91,51,93,0,109,95,97,97,98,98,77, +105,110,79,114,103,0,109,95,97,97,98,98,77,97,120,79,114,103,0,109, +95,101,115,99,97,112,101,73,110,100,101,120,0,109,95,115,117,98,80,97, +114,116,0,109,95,116,114,105,97,110,103,108,101,73,110,100,101,120,0,109, +95,112,97,100,91,52,93,0,109,95,101,115,99,97,112,101,73,110,100,101, +120,79,114,84,114,105,97,110,103,108,101,73,110,100,101,120,0,109,95,98, +118,104,65,97,98,98,77,105,110,0,109,95,98,118,104,65,97,98,98,77, +97,120,0,109,95,98,118,104,81,117,97,110,116,105,122,97,116,105,111,110, +0,109,95,99,117,114,78,111,100,101,73,110,100,101,120,0,109,95,117,115, +101,81,117,97,110,116,105,122,97,116,105,111,110,0,109,95,110,117,109,67, +111,110,116,105,103,117,111,117,115,76,101,97,102,78,111,100,101,115,0,109, +95,110,117,109,81,117,97,110,116,105,122,101,100,67,111,110,116,105,103,117, +111,117,115,78,111,100,101,115,0,42,109,95,99,111,110,116,105,103,117,111, +117,115,78,111,100,101,115,80,116,114,0,42,109,95,113,117,97,110,116,105, +122,101,100,67,111,110,116,105,103,117,111,117,115,78,111,100,101,115,80,116, +114,0,42,109,95,115,117,98,84,114,101,101,73,110,102,111,80,116,114,0, +109,95,116,114,97,118,101,114,115,97,108,77,111,100,101,0,109,95,110,117, +109,83,117,98,116,114,101,101,72,101,97,100,101,114,115,0,42,109,95,110, +97,109,101,0,109,95,115,104,97,112,101,84,121,112,101,0,109,95,112,97, +100,100,105,110,103,91,52,93,0,109,95,99,111,108,108,105,115,105,111,110, +83,104,97,112,101,68,97,116,97,0,109,95,108,111,99,97,108,83,99,97, +108,105,110,103,0,109,95,112,108,97,110,101,78,111,114,109,97,108,0,109, +95,112,108,97,110,101,67,111,110,115,116,97,110,116,0,109,95,105,109,112, +108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115, +0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109, +95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100, +105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108, +83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111, +115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99, +97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0, +109,95,118,97,108,117,101,0,109,95,112,97,100,91,50,93,0,109,95,118, +97,108,117,101,115,91,51,93,0,42,109,95,118,101,114,116,105,99,101,115, +51,102,0,42,109,95,118,101,114,116,105,99,101,115,51,100,0,42,109,95, +105,110,100,105,99,101,115,51,50,0,42,109,95,51,105,110,100,105,99,101, +115,49,54,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110, +117,109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114, +116,105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116, +114,0,109,95,115,99,97,108,105,110,103,0,109,95,110,117,109,77,101,115, +104,80,97,114,116,115,0,109,95,109,101,115,104,73,110,116,101,114,102,97, +99,101,0,42,109,95,113,117,97,110,116,105,122,101,100,70,108,111,97,116, +66,118,104,0,42,109,95,113,117,97,110,116,105,122,101,100,68,111,117,98, +108,101,66,118,104,0,42,109,95,116,114,105,97,110,103,108,101,73,110,102, +111,77,97,112,0,109,95,112,97,100,51,91,52,93,0,109,95,116,114,97, +110,115,102,111,114,109,0,42,109,95,99,104,105,108,100,83,104,97,112,101, +0,109,95,99,104,105,108,100,83,104,97,112,101,84,121,112,101,0,109,95, +99,104,105,108,100,77,97,114,103,105,110,0,42,109,95,99,104,105,108,100, +83,104,97,112,101,80,116,114,0,109,95,110,117,109,67,104,105,108,100,83, +104,97,112,101,115,0,109,95,117,112,65,120,105,115,0,109,95,102,108,97, +103,115,0,109,95,101,100,103,101,86,48,86,49,65,110,103,108,101,0,109, +95,101,100,103,101,86,49,86,50,65,110,103,108,101,0,109,95,101,100,103, +101,86,50,86,48,65,110,103,108,101,0,42,109,95,104,97,115,104,84,97, +98,108,101,80,116,114,0,42,109,95,110,101,120,116,80,116,114,0,42,109, +95,118,97,108,117,101,65,114,114,97,121,80,116,114,0,42,109,95,107,101, +121,65,114,114,97,121,80,116,114,0,109,95,99,111,110,118,101,120,69,112, +115,105,108,111,110,0,109,95,112,108,97,110,97,114,69,112,115,105,108,111, +110,0,109,95,101,113,117,97,108,86,101,114,116,101,120,84,104,114,101,115, +104,111,108,100,0,109,95,101,100,103,101,68,105,115,116,97,110,99,101,84, +104,114,101,115,104,111,108,100,0,109,95,122,101,114,111,65,114,101,97,84, +104,114,101,115,104,111,108,100,0,109,95,110,101,120,116,83,105,122,101,0, +109,95,104,97,115,104,84,97,98,108,101,83,105,122,101,0,109,95,110,117, +109,86,97,108,117,101,115,0,109,95,110,117,109,75,101,121,115,0,109,95, +103,105,109,112,97,99,116,83,117,98,84,121,112,101,0,42,109,95,117,110, +115,99,97,108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114, +0,42,109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111, +117,98,108,101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101, +100,80,111,105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52, +93,0,42,109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108, +101,0,42,109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0, +42,109,95,114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112, +101,0,109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109, +95,105,110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84, +114,97,110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97, +116,105,111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109, +95,105,110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97, +114,86,101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111, +112,105,99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99, +116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100, +0,109,95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0, +109,95,102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117, +116,105,111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109, +95,99,99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117, +115,0,109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111, +108,100,0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70, +114,105,99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70, +108,97,103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95, +99,111,109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97, +116,105,111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97, +108,84,121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101, +87,105,116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101, +99,116,68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84, +101,110,115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86, +101,108,111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108, +111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111, +114,0,109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103, +114,97,118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99, +101,108,101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116, +105,97,76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101, +0,109,95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118, +101,114,115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109, +112,105,110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110, +103,0,109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110, +103,70,97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108, +76,105,110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111, +108,100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110, +103,117,108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108, +100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103, +117,108,97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95, +108,105,110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104, +111,108,100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110, +103,84,104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111, +110,97,108,68,97,109,112,105,110,103,0,109,95,110,117,109,67,111,110,115, +116,114,97,105,110,116,82,111,119,115,0,110,117,98,0,42,109,95,114,98, +65,0,42,109,95,114,98,66,0,109,95,111,98,106,101,99,116,84,121,112, +101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,84,121, +112,101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,73, +100,0,109,95,110,101,101,100,115,70,101,101,100,98,97,99,107,0,109,95, +97,112,112,108,105,101,100,73,109,112,117,108,115,101,0,109,95,100,98,103, +68,114,97,119,83,105,122,101,0,109,95,100,105,115,97,98,108,101,67,111, +108,108,105,115,105,111,110,115,66,101,116,119,101,101,110,76,105,110,107,101, +100,66,111,100,105,101,115,0,109,95,112,97,100,52,91,52,93,0,109,95, +116,121,112,101,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,109, +95,112,105,118,111,116,73,110,65,0,109,95,112,105,118,111,116,73,110,66, +0,109,95,114,98,65,70,114,97,109,101,0,109,95,114,98,66,70,114,97, +109,101,0,109,95,117,115,101,82,101,102,101,114,101,110,99,101,70,114,97, +109,101,65,0,109,95,97,110,103,117,108,97,114,79,110,108,121,0,109,95, +101,110,97,98,108,101,65,110,103,117,108,97,114,77,111,116,111,114,0,109, +95,109,111,116,111,114,84,97,114,103,101,116,86,101,108,111,99,105,116,121, +0,109,95,109,97,120,77,111,116,111,114,73,109,112,117,108,115,101,0,109, +95,108,111,119,101,114,76,105,109,105,116,0,109,95,117,112,112,101,114,76, +105,109,105,116,0,109,95,108,105,109,105,116,83,111,102,116,110,101,115,115, +0,109,95,98,105,97,115,70,97,99,116,111,114,0,109,95,114,101,108,97, +120,97,116,105,111,110,70,97,99,116,111,114,0,109,95,115,119,105,110,103, +83,112,97,110,49,0,109,95,115,119,105,110,103,83,112,97,110,50,0,109, +95,116,119,105,115,116,83,112,97,110,0,109,95,100,97,109,112,105,110,103, +0,109,95,108,105,110,101,97,114,85,112,112,101,114,76,105,109,105,116,0, +109,95,108,105,110,101,97,114,76,111,119,101,114,76,105,109,105,116,0,109, +95,97,110,103,117,108,97,114,85,112,112,101,114,76,105,109,105,116,0,109, +95,97,110,103,117,108,97,114,76,111,119,101,114,76,105,109,105,116,0,109, +95,117,115,101,76,105,110,101,97,114,82,101,102,101,114,101,110,99,101,70, +114,97,109,101,65,0,109,95,117,115,101,79,102,102,115,101,116,70,111,114, +67,111,110,115,116,114,97,105,110,116,70,114,97,109,101,0,84,89,80,69, +58,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, +0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, +110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, +0,80,111,105,110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115, +105,99,115,83,121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98, +116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116, +86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116, +77,97,116,114,105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98, +116,77,97,116,114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97, +0,98,116,84,114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116, +97,0,98,116,84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68, +97,116,97,0,98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111, +68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78, +111,100,101,70,108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109, +105,122,101,100,66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116, +97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101, +68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70, +108,111,97,116,68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100, +66,118,104,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97, +116,105,99,80,108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116, +67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68, +97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100, +105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97, +112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105, +112,108,101,116,68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68, +97,116,97,0,98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110, +116,101,114,102,97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103, +108,101,77,101,115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114, +105,97,110,103,108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116, +67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97, +116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97, +116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97, +116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116, +97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97, +0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68, +97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112, +101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106, +101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97, +0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116, +97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68, +97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111, +49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68, +97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0, +98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97, +105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116, +50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98, +108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114, +97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110, +103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116, +97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97, +105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111, +102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108, +105,100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,0, +84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0,4,0,4,0, +8,0,0,0,16,0,48,0,16,0,16,0,32,0,48,0,96,0,64,0, +-128,0,20,0,48,0,80,0,16,0,96,0,-112,0,16,0,56,0,56,0, +20,0,72,0,4,0,4,0,8,0,48,0,32,0,80,0,72,0,80,0, +32,0,64,0,64,0,16,0,72,0,80,0,-40,1,8,1,-16,1,-88,3, +8,0,56,0,0,0,88,0,120,0,96,1,-32,0,-40,0,0,1,-48,0, +83,84,82,67,47,0,0,0,10,0,3,0,4,0,0,0,4,0,1,0, +9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0,10,0,5,0, +12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0,7,0,8,0, +14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0,16,0,1,0, +14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0,18,0,2,0, +16,0,10,0,14,0,11,0,19,0,4,0,4,0,12,0,4,0,13,0, +2,0,14,0,2,0,15,0,20,0,6,0,13,0,16,0,13,0,17,0, +4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0,21,0,6,0, +14,0,16,0,14,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0, +0,0,21,0,22,0,3,0,2,0,14,0,2,0,15,0,4,0,22,0, +23,0,12,0,13,0,23,0,13,0,24,0,13,0,25,0,4,0,26,0, +4,0,27,0,4,0,28,0,4,0,29,0,20,0,30,0,22,0,31,0, +19,0,32,0,4,0,33,0,4,0,34,0,24,0,12,0,14,0,23,0, +14,0,24,0,14,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0, +4,0,29,0,21,0,30,0,22,0,31,0,4,0,33,0,4,0,34,0, +19,0,32,0,25,0,3,0,0,0,35,0,4,0,36,0,0,0,37,0, +26,0,5,0,25,0,38,0,13,0,39,0,13,0,40,0,7,0,41,0, +0,0,21,0,27,0,5,0,25,0,38,0,13,0,39,0,13,0,42,0, +7,0,43,0,4,0,44,0,28,0,2,0,13,0,45,0,7,0,46,0, +29,0,4,0,27,0,47,0,28,0,48,0,4,0,49,0,0,0,37,0, +30,0,1,0,4,0,50,0,31,0,2,0,2,0,50,0,0,0,51,0, +32,0,2,0,2,0,52,0,0,0,51,0,33,0,7,0,13,0,53,0, +14,0,54,0,30,0,55,0,32,0,56,0,31,0,57,0,4,0,58,0, +4,0,59,0,34,0,4,0,33,0,60,0,13,0,61,0,4,0,62,0, +0,0,37,0,35,0,7,0,25,0,38,0,34,0,63,0,23,0,64,0, +24,0,65,0,36,0,66,0,7,0,43,0,0,0,67,0,37,0,4,0, +17,0,68,0,25,0,69,0,4,0,70,0,7,0,71,0,38,0,4,0, +25,0,38,0,37,0,72,0,4,0,73,0,7,0,43,0,39,0,3,0, +27,0,47,0,4,0,74,0,0,0,37,0,40,0,3,0,27,0,47,0, +4,0,74,0,0,0,37,0,41,0,4,0,4,0,75,0,7,0,76,0, +7,0,77,0,7,0,78,0,36,0,14,0,4,0,79,0,4,0,80,0, +41,0,81,0,4,0,82,0,7,0,83,0,7,0,84,0,7,0,85,0, +7,0,86,0,7,0,87,0,4,0,88,0,4,0,89,0,4,0,90,0, +4,0,91,0,0,0,37,0,42,0,5,0,25,0,38,0,34,0,63,0, +13,0,39,0,7,0,43,0,4,0,92,0,43,0,5,0,27,0,47,0, +13,0,93,0,14,0,94,0,4,0,95,0,0,0,96,0,44,0,24,0, +9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,18,0,100,0, +18,0,101,0,14,0,102,0,14,0,103,0,14,0,104,0,8,0,105,0, +8,0,106,0,8,0,107,0,8,0,108,0,8,0,109,0,8,0,110,0, +8,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, +4,0,116,0,4,0,117,0,4,0,118,0,0,0,37,0,45,0,23,0, +9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,17,0,100,0, +17,0,101,0,13,0,102,0,13,0,103,0,13,0,104,0,7,0,105,0, +7,0,106,0,7,0,107,0,7,0,108,0,7,0,109,0,7,0,110,0, +7,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, +4,0,116,0,4,0,117,0,4,0,118,0,46,0,21,0,45,0,119,0, +15,0,120,0,13,0,121,0,13,0,122,0,13,0,123,0,13,0,124,0, +13,0,125,0,13,0,126,0,13,0,127,0,13,0,-128,0,13,0,-127,0, +7,0,-126,0,7,0,-125,0,7,0,-124,0,7,0,-123,0,7,0,-122,0, +7,0,-121,0,7,0,-120,0,7,0,-119,0,7,0,-118,0,4,0,-117,0, +47,0,22,0,44,0,119,0,16,0,120,0,14,0,121,0,14,0,122,0, +14,0,123,0,14,0,124,0,14,0,125,0,14,0,126,0,14,0,127,0, +14,0,-128,0,14,0,-127,0,8,0,-126,0,8,0,-125,0,8,0,-124,0, +8,0,-123,0,8,0,-122,0,8,0,-121,0,8,0,-120,0,8,0,-119,0, +8,0,-118,0,4,0,-117,0,0,0,37,0,48,0,2,0,4,0,-116,0, +4,0,-115,0,49,0,11,0,50,0,-114,0,50,0,-113,0,0,0,35,0, +4,0,-112,0,4,0,-111,0,4,0,-110,0,4,0,-109,0,7,0,-108,0, +7,0,-107,0,4,0,-106,0,0,0,-105,0,51,0,3,0,49,0,-104,0, +13,0,-103,0,13,0,-102,0,52,0,3,0,49,0,-104,0,14,0,-103,0, +14,0,-102,0,53,0,13,0,49,0,-104,0,18,0,-101,0,18,0,-100,0, +4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0, +7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, +54,0,13,0,49,0,-104,0,17,0,-101,0,17,0,-100,0,4,0,-99,0, +4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0,7,0,-94,0, +7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,55,0,11,0, +49,0,-104,0,17,0,-101,0,17,0,-100,0,7,0,-89,0,7,0,-88,0, +7,0,-87,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,7,0,-86,0, +0,0,21,0,56,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, +13,0,-85,0,13,0,-84,0,13,0,-83,0,13,0,-82,0,4,0,-81,0, +4,0,-80,0,57,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, +7,0,-85,0,7,0,-84,0,7,0,-83,0,7,0,-82,0,4,0,-81,0, +4,0,-80,0,}; +int sBulletDNAlen64= sizeof(sBulletDNAstr64); + +unsigned char sBulletDNAstr[]= { +83,68,78,65,78,65,77,69,-79,0,0,0,109,95,115,105,122,101,0,109, +95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, +99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, +108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, +115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115, +116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51, +93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,109, +95,114,111,111,116,78,111,100,101,73,110,100,101,120,0,109,95,115,117,98, +116,114,101,101,83,105,122,101,0,109,95,113,117,97,110,116,105,122,101,100, +65,97,98,98,77,105,110,91,51,93,0,109,95,113,117,97,110,116,105,122, +101,100,65,97,98,98,77,97,120,91,51,93,0,109,95,97,97,98,98,77, +105,110,79,114,103,0,109,95,97,97,98,98,77,97,120,79,114,103,0,109, +95,101,115,99,97,112,101,73,110,100,101,120,0,109,95,115,117,98,80,97, +114,116,0,109,95,116,114,105,97,110,103,108,101,73,110,100,101,120,0,109, +95,112,97,100,91,52,93,0,109,95,101,115,99,97,112,101,73,110,100,101, +120,79,114,84,114,105,97,110,103,108,101,73,110,100,101,120,0,109,95,98, +118,104,65,97,98,98,77,105,110,0,109,95,98,118,104,65,97,98,98,77, +97,120,0,109,95,98,118,104,81,117,97,110,116,105,122,97,116,105,111,110, +0,109,95,99,117,114,78,111,100,101,73,110,100,101,120,0,109,95,117,115, +101,81,117,97,110,116,105,122,97,116,105,111,110,0,109,95,110,117,109,67, +111,110,116,105,103,117,111,117,115,76,101,97,102,78,111,100,101,115,0,109, +95,110,117,109,81,117,97,110,116,105,122,101,100,67,111,110,116,105,103,117, +111,117,115,78,111,100,101,115,0,42,109,95,99,111,110,116,105,103,117,111, +117,115,78,111,100,101,115,80,116,114,0,42,109,95,113,117,97,110,116,105, +122,101,100,67,111,110,116,105,103,117,111,117,115,78,111,100,101,115,80,116, +114,0,42,109,95,115,117,98,84,114,101,101,73,110,102,111,80,116,114,0, +109,95,116,114,97,118,101,114,115,97,108,77,111,100,101,0,109,95,110,117, +109,83,117,98,116,114,101,101,72,101,97,100,101,114,115,0,42,109,95,110, +97,109,101,0,109,95,115,104,97,112,101,84,121,112,101,0,109,95,112,97, +100,100,105,110,103,91,52,93,0,109,95,99,111,108,108,105,115,105,111,110, +83,104,97,112,101,68,97,116,97,0,109,95,108,111,99,97,108,83,99,97, +108,105,110,103,0,109,95,112,108,97,110,101,78,111,114,109,97,108,0,109, +95,112,108,97,110,101,67,111,110,115,116,97,110,116,0,109,95,105,109,112, +108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115, +0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109, +95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100, +105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108, +83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111, +115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99, +97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0, +109,95,118,97,108,117,101,0,109,95,112,97,100,91,50,93,0,109,95,118, +97,108,117,101,115,91,51,93,0,42,109,95,118,101,114,116,105,99,101,115, +51,102,0,42,109,95,118,101,114,116,105,99,101,115,51,100,0,42,109,95, +105,110,100,105,99,101,115,51,50,0,42,109,95,51,105,110,100,105,99,101, +115,49,54,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110, +117,109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114, +116,105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116, +114,0,109,95,115,99,97,108,105,110,103,0,109,95,110,117,109,77,101,115, +104,80,97,114,116,115,0,109,95,109,101,115,104,73,110,116,101,114,102,97, +99,101,0,42,109,95,113,117,97,110,116,105,122,101,100,70,108,111,97,116, +66,118,104,0,42,109,95,113,117,97,110,116,105,122,101,100,68,111,117,98, +108,101,66,118,104,0,42,109,95,116,114,105,97,110,103,108,101,73,110,102, +111,77,97,112,0,109,95,112,97,100,51,91,52,93,0,109,95,116,114,97, +110,115,102,111,114,109,0,42,109,95,99,104,105,108,100,83,104,97,112,101, +0,109,95,99,104,105,108,100,83,104,97,112,101,84,121,112,101,0,109,95, +99,104,105,108,100,77,97,114,103,105,110,0,42,109,95,99,104,105,108,100, +83,104,97,112,101,80,116,114,0,109,95,110,117,109,67,104,105,108,100,83, +104,97,112,101,115,0,109,95,117,112,65,120,105,115,0,109,95,102,108,97, +103,115,0,109,95,101,100,103,101,86,48,86,49,65,110,103,108,101,0,109, +95,101,100,103,101,86,49,86,50,65,110,103,108,101,0,109,95,101,100,103, +101,86,50,86,48,65,110,103,108,101,0,42,109,95,104,97,115,104,84,97, +98,108,101,80,116,114,0,42,109,95,110,101,120,116,80,116,114,0,42,109, +95,118,97,108,117,101,65,114,114,97,121,80,116,114,0,42,109,95,107,101, +121,65,114,114,97,121,80,116,114,0,109,95,99,111,110,118,101,120,69,112, +115,105,108,111,110,0,109,95,112,108,97,110,97,114,69,112,115,105,108,111, +110,0,109,95,101,113,117,97,108,86,101,114,116,101,120,84,104,114,101,115, +104,111,108,100,0,109,95,101,100,103,101,68,105,115,116,97,110,99,101,84, +104,114,101,115,104,111,108,100,0,109,95,122,101,114,111,65,114,101,97,84, +104,114,101,115,104,111,108,100,0,109,95,110,101,120,116,83,105,122,101,0, +109,95,104,97,115,104,84,97,98,108,101,83,105,122,101,0,109,95,110,117, +109,86,97,108,117,101,115,0,109,95,110,117,109,75,101,121,115,0,109,95, +103,105,109,112,97,99,116,83,117,98,84,121,112,101,0,42,109,95,117,110, +115,99,97,108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114, +0,42,109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111, +117,98,108,101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101, +100,80,111,105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52, +93,0,42,109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108, +101,0,42,109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0, +42,109,95,114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112, +101,0,109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109, +95,105,110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84, +114,97,110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97, +116,105,111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109, +95,105,110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97, +114,86,101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111, +112,105,99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99, +116,80,114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100, +0,109,95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0, +109,95,102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117, +116,105,111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109, +95,99,99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117, +115,0,109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111, +108,100,0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70, +114,105,99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70, +108,97,103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95, +99,111,109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97, +116,105,111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97, +108,84,121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101, +87,105,116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101, +99,116,68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84, +101,110,115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86, +101,108,111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108, +111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111, +114,0,109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103, +114,97,118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99, +101,108,101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116, +105,97,76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101, +0,109,95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118, +101,114,115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109, +112,105,110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110, +103,0,109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110, +103,70,97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108, +76,105,110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111, +108,100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110, +103,117,108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108, +100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103, +117,108,97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95, +108,105,110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104, +111,108,100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110, +103,84,104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111, +110,97,108,68,97,109,112,105,110,103,0,109,95,110,117,109,67,111,110,115, +116,114,97,105,110,116,82,111,119,115,0,110,117,98,0,42,109,95,114,98, +65,0,42,109,95,114,98,66,0,109,95,111,98,106,101,99,116,84,121,112, +101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,84,121, +112,101,0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,73, +100,0,109,95,110,101,101,100,115,70,101,101,100,98,97,99,107,0,109,95, +97,112,112,108,105,101,100,73,109,112,117,108,115,101,0,109,95,100,98,103, +68,114,97,119,83,105,122,101,0,109,95,100,105,115,97,98,108,101,67,111, +108,108,105,115,105,111,110,115,66,101,116,119,101,101,110,76,105,110,107,101, +100,66,111,100,105,101,115,0,109,95,112,97,100,52,91,52,93,0,109,95, +116,121,112,101,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,109, +95,112,105,118,111,116,73,110,65,0,109,95,112,105,118,111,116,73,110,66, +0,109,95,114,98,65,70,114,97,109,101,0,109,95,114,98,66,70,114,97, +109,101,0,109,95,117,115,101,82,101,102,101,114,101,110,99,101,70,114,97, +109,101,65,0,109,95,97,110,103,117,108,97,114,79,110,108,121,0,109,95, +101,110,97,98,108,101,65,110,103,117,108,97,114,77,111,116,111,114,0,109, +95,109,111,116,111,114,84,97,114,103,101,116,86,101,108,111,99,105,116,121, +0,109,95,109,97,120,77,111,116,111,114,73,109,112,117,108,115,101,0,109, +95,108,111,119,101,114,76,105,109,105,116,0,109,95,117,112,112,101,114,76, +105,109,105,116,0,109,95,108,105,109,105,116,83,111,102,116,110,101,115,115, +0,109,95,98,105,97,115,70,97,99,116,111,114,0,109,95,114,101,108,97, +120,97,116,105,111,110,70,97,99,116,111,114,0,109,95,115,119,105,110,103, +83,112,97,110,49,0,109,95,115,119,105,110,103,83,112,97,110,50,0,109, +95,116,119,105,115,116,83,112,97,110,0,109,95,100,97,109,112,105,110,103, +0,109,95,108,105,110,101,97,114,85,112,112,101,114,76,105,109,105,116,0, +109,95,108,105,110,101,97,114,76,111,119,101,114,76,105,109,105,116,0,109, +95,97,110,103,117,108,97,114,85,112,112,101,114,76,105,109,105,116,0,109, +95,97,110,103,117,108,97,114,76,111,119,101,114,76,105,109,105,116,0,109, +95,117,115,101,76,105,110,101,97,114,82,101,102,101,114,101,110,99,101,70, +114,97,109,101,65,0,109,95,117,115,101,79,102,102,115,101,116,70,111,114, +67,111,110,115,116,114,97,105,110,116,70,114,97,109,101,0,84,89,80,69, +58,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, +0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, +110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, +0,80,111,105,110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115, +105,99,115,83,121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98, +116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116, +86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116, +77,97,116,114,105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98, +116,77,97,116,114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97, +0,98,116,84,114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116, +97,0,98,116,84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68, +97,116,97,0,98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111, +68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78, +111,100,101,70,108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109, +105,122,101,100,66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116, +97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101, +68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70, +108,111,97,116,68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100, +66,118,104,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97, +116,105,99,80,108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116, +67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68, +97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100, +105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97, +112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105, +112,108,101,116,68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68, +97,116,97,0,98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110, +116,101,114,102,97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103, +108,101,77,101,115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114, +105,97,110,103,108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116, +67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97, +116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97, +116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97, +116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116, +97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97, +0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68, +97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112, +101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106, +101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97, +0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116, +97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68, +97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111, +49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68, +97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0, +98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97, +105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116, +50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98, +108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114, +97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110, +103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116, +97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97, +105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111, +102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108, +105,100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,0, +84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0,4,0,4,0, +8,0,0,0,12,0,36,0,8,0,16,0,32,0,48,0,96,0,64,0, +-128,0,20,0,48,0,80,0,16,0,84,0,-124,0,12,0,52,0,52,0, +20,0,64,0,4,0,4,0,8,0,28,0,28,0,60,0,56,0,76,0, +24,0,60,0,60,0,16,0,64,0,68,0,-56,1,-8,0,-32,1,-104,3, +8,0,44,0,0,0,76,0,108,0,84,1,-44,0,-52,0,-12,0,-60,0, +83,84,82,67,47,0,0,0,10,0,3,0,4,0,0,0,4,0,1,0, +9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0,10,0,5,0, +12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0,7,0,8,0, +14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0,16,0,1,0, +14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0,18,0,2,0, +16,0,10,0,14,0,11,0,19,0,4,0,4,0,12,0,4,0,13,0, +2,0,14,0,2,0,15,0,20,0,6,0,13,0,16,0,13,0,17,0, +4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0,21,0,6,0, +14,0,16,0,14,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0, +0,0,21,0,22,0,3,0,2,0,14,0,2,0,15,0,4,0,22,0, +23,0,12,0,13,0,23,0,13,0,24,0,13,0,25,0,4,0,26,0, +4,0,27,0,4,0,28,0,4,0,29,0,20,0,30,0,22,0,31,0, +19,0,32,0,4,0,33,0,4,0,34,0,24,0,12,0,14,0,23,0, +14,0,24,0,14,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0, +4,0,29,0,21,0,30,0,22,0,31,0,4,0,33,0,4,0,34,0, +19,0,32,0,25,0,3,0,0,0,35,0,4,0,36,0,0,0,37,0, +26,0,5,0,25,0,38,0,13,0,39,0,13,0,40,0,7,0,41,0, +0,0,21,0,27,0,5,0,25,0,38,0,13,0,39,0,13,0,42,0, +7,0,43,0,4,0,44,0,28,0,2,0,13,0,45,0,7,0,46,0, +29,0,4,0,27,0,47,0,28,0,48,0,4,0,49,0,0,0,37,0, +30,0,1,0,4,0,50,0,31,0,2,0,2,0,50,0,0,0,51,0, +32,0,2,0,2,0,52,0,0,0,51,0,33,0,7,0,13,0,53,0, +14,0,54,0,30,0,55,0,32,0,56,0,31,0,57,0,4,0,58,0, +4,0,59,0,34,0,4,0,33,0,60,0,13,0,61,0,4,0,62,0, +0,0,37,0,35,0,7,0,25,0,38,0,34,0,63,0,23,0,64,0, +24,0,65,0,36,0,66,0,7,0,43,0,0,0,67,0,37,0,4,0, +17,0,68,0,25,0,69,0,4,0,70,0,7,0,71,0,38,0,4,0, +25,0,38,0,37,0,72,0,4,0,73,0,7,0,43,0,39,0,3,0, +27,0,47,0,4,0,74,0,0,0,37,0,40,0,3,0,27,0,47,0, +4,0,74,0,0,0,37,0,41,0,4,0,4,0,75,0,7,0,76,0, +7,0,77,0,7,0,78,0,36,0,14,0,4,0,79,0,4,0,80,0, +41,0,81,0,4,0,82,0,7,0,83,0,7,0,84,0,7,0,85,0, +7,0,86,0,7,0,87,0,4,0,88,0,4,0,89,0,4,0,90,0, +4,0,91,0,0,0,37,0,42,0,5,0,25,0,38,0,34,0,63,0, +13,0,39,0,7,0,43,0,4,0,92,0,43,0,5,0,27,0,47,0, +13,0,93,0,14,0,94,0,4,0,95,0,0,0,96,0,44,0,24,0, +9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,18,0,100,0, +18,0,101,0,14,0,102,0,14,0,103,0,14,0,104,0,8,0,105,0, +8,0,106,0,8,0,107,0,8,0,108,0,8,0,109,0,8,0,110,0, +8,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, +4,0,116,0,4,0,117,0,4,0,118,0,0,0,37,0,45,0,23,0, +9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0,17,0,100,0, +17,0,101,0,13,0,102,0,13,0,103,0,13,0,104,0,7,0,105,0, +7,0,106,0,7,0,107,0,7,0,108,0,7,0,109,0,7,0,110,0, +7,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0,4,0,115,0, +4,0,116,0,4,0,117,0,4,0,118,0,46,0,21,0,45,0,119,0, +15,0,120,0,13,0,121,0,13,0,122,0,13,0,123,0,13,0,124,0, +13,0,125,0,13,0,126,0,13,0,127,0,13,0,-128,0,13,0,-127,0, +7,0,-126,0,7,0,-125,0,7,0,-124,0,7,0,-123,0,7,0,-122,0, +7,0,-121,0,7,0,-120,0,7,0,-119,0,7,0,-118,0,4,0,-117,0, +47,0,22,0,44,0,119,0,16,0,120,0,14,0,121,0,14,0,122,0, +14,0,123,0,14,0,124,0,14,0,125,0,14,0,126,0,14,0,127,0, +14,0,-128,0,14,0,-127,0,8,0,-126,0,8,0,-125,0,8,0,-124,0, +8,0,-123,0,8,0,-122,0,8,0,-121,0,8,0,-120,0,8,0,-119,0, +8,0,-118,0,4,0,-117,0,0,0,37,0,48,0,2,0,4,0,-116,0, +4,0,-115,0,49,0,11,0,50,0,-114,0,50,0,-113,0,0,0,35,0, +4,0,-112,0,4,0,-111,0,4,0,-110,0,4,0,-109,0,7,0,-108,0, +7,0,-107,0,4,0,-106,0,0,0,-105,0,51,0,3,0,49,0,-104,0, +13,0,-103,0,13,0,-102,0,52,0,3,0,49,0,-104,0,14,0,-103,0, +14,0,-102,0,53,0,13,0,49,0,-104,0,18,0,-101,0,18,0,-100,0, +4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0, +7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, +54,0,13,0,49,0,-104,0,17,0,-101,0,17,0,-100,0,4,0,-99,0, +4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0,7,0,-94,0, +7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,55,0,11,0, +49,0,-104,0,17,0,-101,0,17,0,-100,0,7,0,-89,0,7,0,-88,0, +7,0,-87,0,7,0,-92,0,7,0,-91,0,7,0,-90,0,7,0,-86,0, +0,0,21,0,56,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, +13,0,-85,0,13,0,-84,0,13,0,-83,0,13,0,-82,0,4,0,-81,0, +4,0,-80,0,57,0,9,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, +7,0,-85,0,7,0,-84,0,7,0,-83,0,7,0,-82,0,4,0,-81,0, +4,0,-80,0,}; +int sBulletDNAlen= sizeof(sBulletDNAstr); diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index 8ba59b287..57f4c1e9e 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -1,604 +1,604 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_SERIALIZER_H -#define BT_SERIALIZER_H - -#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE -#include "btStackAlloc.h" -#include "btHashMap.h" - -#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include - - - -///only the 32bit versions for now -extern unsigned char sBulletDNAstr[]; -extern int sBulletDNAlen; -extern unsigned char sBulletDNAstr64[]; -extern int sBulletDNAlen64; - -SIMD_FORCE_INLINE int btStrLen(const char* str) -{ - if (!str) - return(0); - int len = 0; - - while (*str != 0) - { - str++; - len++; - } - - return len; -} - - -class btChunk -{ -public: - int m_chunkCode; - int m_length; - void *m_oldPtr; - int m_dna_nr; - int m_number; -}; - -enum btSerializationFlags -{ - BT_SERIALIZE_NO_BVH = 1, - BT_SERIALIZE_NO_TRIANGLEINFOMAP = 2, - BT_SERIALIZE_NO_DUPLICATE_ASSERT = 4 -}; - -class btSerializer -{ - -public: - - virtual ~btSerializer() {} - - virtual const unsigned char* getBufferPointer() const = 0; - - virtual int getCurrentBufferSize() const = 0; - - virtual btChunk* allocate(size_t size, int numElements) = 0; - - virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr)= 0; - - virtual void* findPointer(void* oldPtr) = 0; - - virtual void* getUniquePointer(void*oldPtr) = 0; - - virtual void startSerialization() = 0; - - virtual void finishSerialization() = 0; - - virtual const char* findNameForPointer(const void* ptr) const = 0; - - virtual void registerNameForPointer(const void* ptr, const char* name) = 0; - - virtual void serializeName(const char* ptr) = 0; - - virtual int getSerializationFlags() const = 0; - - virtual void setSerializationFlags(int flags) = 0; - - -}; - - - -#define BT_HEADER_LENGTH 12 -#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) -# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) -#else -# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) -#endif - -#define BT_COLLISIONOBJECT_CODE MAKE_ID('C','O','B','J') -#define BT_RIGIDBODY_CODE MAKE_ID('R','B','D','Y') -#define BT_CONSTRAINT_CODE MAKE_ID('C','O','N','S') -#define BT_BOXSHAPE_CODE MAKE_ID('B','O','X','S') -#define BT_QUANTIZED_BVH_CODE MAKE_ID('Q','B','V','H') -#define BT_TRIANLGE_INFO_MAP MAKE_ID('T','M','A','P') -#define BT_SHAPE_CODE MAKE_ID('S','H','A','P') -#define BT_ARRAY_CODE MAKE_ID('A','R','A','Y') - - -struct btPointerUid -{ - union - { - void* m_ptr; - int m_uniqueIds[2]; - }; -}; - - -class btDefaultSerializer : public btSerializer -{ - - - btAlignedObjectArray mTypes; - btAlignedObjectArray mStructs; - btAlignedObjectArray mTlens; - btHashMap mStructReverse; - btHashMap mTypeLookup; - - - btHashMap m_chunkP; - - btHashMap m_nameMap; - - btHashMap m_uniquePointers; - int m_uniqueIdGenerator; - - int m_totalSize; - unsigned char* m_buffer; - int m_currentSize; - void* m_dna; - int m_dnaLength; - - int m_serializationFlags; - - - btAlignedObjectArray m_chunkPtrs; - -protected: - - virtual void* findPointer(void* oldPtr) - { - void** ptr = m_chunkP.find(oldPtr); - if (ptr && *ptr) - return *ptr; - return 0; - } - - - - - - void writeDNA() - { - unsigned char* dnaTarget = m_buffer+m_currentSize; - memcpy(dnaTarget,m_dna,m_dnaLength); - m_currentSize += m_dnaLength; - } - - int getReverseType(const char *type) const - { - - btHashString key(type); - const int* valuePtr = mTypeLookup.find(key); - if (valuePtr) - return *valuePtr; - - return -1; - } - - void initDNA(const char* bdnaOrg,int dnalen) - { - ///was already initialized - if (m_dna) - return; - - int littleEndian= 1; - littleEndian= ((char*)&littleEndian)[0]; - - - m_dna = btAlignedAlloc(dnalen,16); - memcpy(m_dna,bdnaOrg,dnalen); - m_dnaLength = dnalen; - - int *intPtr=0; - short *shtPtr=0; - char *cp = 0;int dataLen =0;long nr=0; - intPtr = (int*)m_dna; - - /* - SDNA (4 bytes) (magic number) - NAME (4 bytes) - (4 bytes) amount of names (int) - - - */ - - if (strncmp((const char*)m_dna, "SDNA", 4)==0) - { - // skip ++ NAME - intPtr++; intPtr++; - } - - // Parse names - if (!littleEndian) - *intPtr = btSwapEndian(*intPtr); - - dataLen = *intPtr; - - intPtr++; - - cp = (char*)intPtr; - int i; - for ( i=0; i amount of types (int) - - - */ - - intPtr = (int*)cp; - assert(strncmp(cp, "TYPE", 4)==0); intPtr++; - - if (!littleEndian) - *intPtr = btSwapEndian(*intPtr); - - dataLen = *intPtr; - intPtr++; - - - cp = (char*)intPtr; - for (i=0; i (short) the lengths of types - - */ - - // Parse type lens - intPtr = (int*)cp; - assert(strncmp(cp, "TLEN", 4)==0); intPtr++; - - dataLen = (int)mTypes.size(); - - shtPtr = (short*)intPtr; - for (i=0; i amount of structs (int) - - - - - - - */ - - intPtr = (int*)shtPtr; - cp = (char*)intPtr; - assert(strncmp(cp, "STRC", 4)==0); intPtr++; - - if (!littleEndian) - *intPtr = btSwapEndian(*intPtr); - dataLen = *intPtr ; - intPtr++; - - - shtPtr = (short*)intPtr; - for (i=0; im_ptr; - } - m_uniqueIdGenerator++; - - btPointerUid uid; - uid.m_uniqueIds[0] = m_uniqueIdGenerator; - uid.m_uniqueIds[1] = m_uniqueIdGenerator; - m_uniquePointers.insert(oldPtr,uid); - return uid.m_ptr; - - } - - virtual const unsigned char* getBufferPointer() const - { - return m_buffer; - } - - virtual int getCurrentBufferSize() const - { - return m_currentSize; - } - - virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr) - { - if (!(m_serializationFlags&BT_SERIALIZE_NO_DUPLICATE_ASSERT)) - { - btAssert(!findPointer(oldPtr)); - } - - chunk->m_dna_nr = getReverseType(structType); - - chunk->m_chunkCode = chunkCode; - - void* uniquePtr = getUniquePointer(oldPtr); - - m_chunkP.insert(oldPtr,uniquePtr);//chunk->m_oldPtr); - chunk->m_oldPtr = uniquePtr;//oldPtr; - - } - - - - - - virtual btChunk* allocate(size_t size, int numElements) - { - - unsigned char* ptr = m_buffer+m_currentSize; - m_currentSize += int(size)*numElements+sizeof(btChunk); - btAssert(m_currentSizem_chunkCode = 0; - chunk->m_oldPtr = data; - chunk->m_length = int(size)*numElements; - chunk->m_number = numElements; - - m_chunkPtrs.push_back(chunk); - - - return chunk; - } - - virtual const char* findNameForPointer(const void* ptr) const - { - const char*const * namePtr = m_nameMap.find(ptr); - if (namePtr && *namePtr) - return *namePtr; - return 0; - - } - - virtual void registerNameForPointer(const void* ptr, const char* name) - { - m_nameMap.insert(ptr,name); - } - - virtual void serializeName(const char* name) - { - if (name) - { - //don't serialize name twice - if (findPointer((void*)name)) - return; - - int len = btStrLen(name); - if (len) - { - - int newLen = len+1; - int padding = ((newLen+3)&~3)-newLen; - newLen += padding; - - //serialize name string now - btChunk* chunk = allocate(sizeof(char),newLen); - char* destinationName = (char*)chunk->m_oldPtr; - for (int i=0;i +#endif +#include + + + +///only the 32bit versions for now +extern unsigned char sBulletDNAstr[]; +extern int sBulletDNAlen; +extern unsigned char sBulletDNAstr64[]; +extern int sBulletDNAlen64; + +SIMD_FORCE_INLINE int btStrLen(const char* str) +{ + if (!str) + return(0); + int len = 0; + + while (*str != 0) + { + str++; + len++; + } + + return len; +} + + +class btChunk +{ +public: + int m_chunkCode; + int m_length; + void *m_oldPtr; + int m_dna_nr; + int m_number; +}; + +enum btSerializationFlags +{ + BT_SERIALIZE_NO_BVH = 1, + BT_SERIALIZE_NO_TRIANGLEINFOMAP = 2, + BT_SERIALIZE_NO_DUPLICATE_ASSERT = 4 +}; + +class btSerializer +{ + +public: + + virtual ~btSerializer() {} + + virtual const unsigned char* getBufferPointer() const = 0; + + virtual int getCurrentBufferSize() const = 0; + + virtual btChunk* allocate(size_t size, int numElements) = 0; + + virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr)= 0; + + virtual void* findPointer(void* oldPtr) = 0; + + virtual void* getUniquePointer(void*oldPtr) = 0; + + virtual void startSerialization() = 0; + + virtual void finishSerialization() = 0; + + virtual const char* findNameForPointer(const void* ptr) const = 0; + + virtual void registerNameForPointer(const void* ptr, const char* name) = 0; + + virtual void serializeName(const char* ptr) = 0; + + virtual int getSerializationFlags() const = 0; + + virtual void setSerializationFlags(int flags) = 0; + + +}; + + + +#define BT_HEADER_LENGTH 12 +#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) +# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) +#else +# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) +#endif + +#define BT_COLLISIONOBJECT_CODE MAKE_ID('C','O','B','J') +#define BT_RIGIDBODY_CODE MAKE_ID('R','B','D','Y') +#define BT_CONSTRAINT_CODE MAKE_ID('C','O','N','S') +#define BT_BOXSHAPE_CODE MAKE_ID('B','O','X','S') +#define BT_QUANTIZED_BVH_CODE MAKE_ID('Q','B','V','H') +#define BT_TRIANLGE_INFO_MAP MAKE_ID('T','M','A','P') +#define BT_SHAPE_CODE MAKE_ID('S','H','A','P') +#define BT_ARRAY_CODE MAKE_ID('A','R','A','Y') + + +struct btPointerUid +{ + union + { + void* m_ptr; + int m_uniqueIds[2]; + }; +}; + + +class btDefaultSerializer : public btSerializer +{ + + + btAlignedObjectArray mTypes; + btAlignedObjectArray mStructs; + btAlignedObjectArray mTlens; + btHashMap mStructReverse; + btHashMap mTypeLookup; + + + btHashMap m_chunkP; + + btHashMap m_nameMap; + + btHashMap m_uniquePointers; + int m_uniqueIdGenerator; + + int m_totalSize; + unsigned char* m_buffer; + int m_currentSize; + void* m_dna; + int m_dnaLength; + + int m_serializationFlags; + + + btAlignedObjectArray m_chunkPtrs; + +protected: + + virtual void* findPointer(void* oldPtr) + { + void** ptr = m_chunkP.find(oldPtr); + if (ptr && *ptr) + return *ptr; + return 0; + } + + + + + + void writeDNA() + { + unsigned char* dnaTarget = m_buffer+m_currentSize; + memcpy(dnaTarget,m_dna,m_dnaLength); + m_currentSize += m_dnaLength; + } + + int getReverseType(const char *type) const + { + + btHashString key(type); + const int* valuePtr = mTypeLookup.find(key); + if (valuePtr) + return *valuePtr; + + return -1; + } + + void initDNA(const char* bdnaOrg,int dnalen) + { + ///was already initialized + if (m_dna) + return; + + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; + + + m_dna = btAlignedAlloc(dnalen,16); + memcpy(m_dna,bdnaOrg,dnalen); + m_dnaLength = dnalen; + + int *intPtr=0; + short *shtPtr=0; + char *cp = 0;int dataLen =0;long nr=0; + intPtr = (int*)m_dna; + + /* + SDNA (4 bytes) (magic number) + NAME (4 bytes) + (4 bytes) amount of names (int) + + + */ + + if (strncmp((const char*)m_dna, "SDNA", 4)==0) + { + // skip ++ NAME + intPtr++; intPtr++; + } + + // Parse names + if (!littleEndian) + *intPtr = btSwapEndian(*intPtr); + + dataLen = *intPtr; + + intPtr++; + + cp = (char*)intPtr; + int i; + for ( i=0; i amount of types (int) + + + */ + + intPtr = (int*)cp; + assert(strncmp(cp, "TYPE", 4)==0); intPtr++; + + if (!littleEndian) + *intPtr = btSwapEndian(*intPtr); + + dataLen = *intPtr; + intPtr++; + + + cp = (char*)intPtr; + for (i=0; i (short) the lengths of types + + */ + + // Parse type lens + intPtr = (int*)cp; + assert(strncmp(cp, "TLEN", 4)==0); intPtr++; + + dataLen = (int)mTypes.size(); + + shtPtr = (short*)intPtr; + for (i=0; i amount of structs (int) + + + + + + + */ + + intPtr = (int*)shtPtr; + cp = (char*)intPtr; + assert(strncmp(cp, "STRC", 4)==0); intPtr++; + + if (!littleEndian) + *intPtr = btSwapEndian(*intPtr); + dataLen = *intPtr ; + intPtr++; + + + shtPtr = (short*)intPtr; + for (i=0; im_ptr; + } + m_uniqueIdGenerator++; + + btPointerUid uid; + uid.m_uniqueIds[0] = m_uniqueIdGenerator; + uid.m_uniqueIds[1] = m_uniqueIdGenerator; + m_uniquePointers.insert(oldPtr,uid); + return uid.m_ptr; + + } + + virtual const unsigned char* getBufferPointer() const + { + return m_buffer; + } + + virtual int getCurrentBufferSize() const + { + return m_currentSize; + } + + virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr) + { + if (!(m_serializationFlags&BT_SERIALIZE_NO_DUPLICATE_ASSERT)) + { + btAssert(!findPointer(oldPtr)); + } + + chunk->m_dna_nr = getReverseType(structType); + + chunk->m_chunkCode = chunkCode; + + void* uniquePtr = getUniquePointer(oldPtr); + + m_chunkP.insert(oldPtr,uniquePtr);//chunk->m_oldPtr); + chunk->m_oldPtr = uniquePtr;//oldPtr; + + } + + + + + + virtual btChunk* allocate(size_t size, int numElements) + { + + unsigned char* ptr = m_buffer+m_currentSize; + m_currentSize += int(size)*numElements+sizeof(btChunk); + btAssert(m_currentSizem_chunkCode = 0; + chunk->m_oldPtr = data; + chunk->m_length = int(size)*numElements; + chunk->m_number = numElements; + + m_chunkPtrs.push_back(chunk); + + + return chunk; + } + + virtual const char* findNameForPointer(const void* ptr) const + { + const char*const * namePtr = m_nameMap.find(ptr); + if (namePtr && *namePtr) + return *namePtr; + return 0; + + } + + virtual void registerNameForPointer(const void* ptr, const char* name) + { + m_nameMap.insert(ptr,name); + } + + virtual void serializeName(const char* name) + { + if (name) + { + //don't serialize name twice + if (findPointer((void*)name)) + return; + + int len = btStrLen(name); + if (len) + { + + int newLen = len+1; + int padding = ((newLen+3)&~3)-newLen; + newLen += padding; + + //serialize name string now + btChunk* chunk = allocate(sizeof(char),newLen); + char* destinationName = (char*)chunk->m_oldPtr; + for (int i=0;i -#include -#include "LinearMath/btScalar.h" - -#include "MiniCL/cl.h" - - -#define __kernel -#define __global -#define __local -#define get_global_id(a) __guid_arg -#define get_local_id(a) ((__guid_arg) % gMiniCLNumOutstandingTasks) -#define get_local_size(a) (gMiniCLNumOutstandingTasks) -#define get_group_id(a) ((__guid_arg) / gMiniCLNumOutstandingTasks) - -#define CLK_LOCAL_MEM_FENCE 0x01 -#define CLK_GLOBAL_MEM_FENCE 0x02 - -static void barrier(unsigned int a) -{ - // TODO : implement -} - -ATTRIBUTE_ALIGNED16(struct) float8 -{ - float s0; - float s1; - float s2; - float s3; - float s4; - float s5; - float s6; - float s7; - - float8(float scalar) - { - s0=s1=s2=s3=s4=s5=s6=s7=scalar; - } -}; - -ATTRIBUTE_ALIGNED16(struct) float4 -{ - float x,y,z,w; - float4() {} - float4(float v) - { - x = y = z = w = v; - } - float4 operator*(const float4& other) - { - float4 tmp; - tmp.x = x*other.x; - tmp.y = y*other.y; - tmp.z = z*other.z; - tmp.w = w*other.w; - return tmp; - } - - float4 operator*(const float& other) - { - float4 tmp; - tmp.x = x*other; - tmp.y = y*other; - tmp.z = z*other; - tmp.w = w*other; - return tmp; - } - - - - float4& operator+=(const float4& other) - { - x += other.x; - y += other.y; - z += other.z; - w += other.w; - return *this; - } - - float4& operator-=(const float4& other) - { - x -= other.x; - y -= other.y; - z -= other.z; - w -= other.w; - return *this; - } - - float4& operator *=(float scalar) - { - x *= scalar; - y *= scalar; - z *= scalar; - w *= scalar; - return (*this); - } - - - - - -}; - -static float4 fabs(const float4& a) -{ - float4 tmp; - tmp.x = a.x < 0.f ? 0.f : a.x; - tmp.y = a.y < 0.f ? 0.f : a.y; - tmp.z = a.z < 0.f ? 0.f : a.z; - tmp.w = a.w < 0.f ? 0.f : a.w; - return tmp; -} -static float4 operator+(const float4& a,const float4& b) -{ - float4 tmp; - tmp.x = a.x + b.x; - tmp.y = a.y + b.y; - tmp.z = a.z + b.z; - tmp.w = a.w + b.w; - return tmp; -} - -static float4 operator-(const float4& a,const float4& b) -{ - float4 tmp; - tmp.x = a.x - b.x; - tmp.y = a.y - b.y; - tmp.z = a.z - b.z; - tmp.w = a.w - b.w; - return tmp; -} -static float4 operator*(float a,const float4& b) -{ - float4 tmp; - tmp.x = a * b.x; - tmp.y = a * b.y; - tmp.z = a * b.z; - tmp.w = a * b.w; - return tmp; -} - - -static float dot(const float4&a ,const float4& b) -{ - float4 tmp; - tmp.x = a.x*b.x; - tmp.y = a.y*b.y; - tmp.z = a.z*b.z; - tmp.w = a.w*b.w; - return tmp.x+tmp.y+tmp.z+tmp.w; -} - -static float4 cross(const float4&a ,const float4& b) -{ - float4 tmp; - tmp.x = a.y*b.z - a.z*b.y; - tmp.y = -a.x*b.z + a.z*b.x; - tmp.z = a.x*b.y - a.y*b.x; - tmp.w = 0.f; - return tmp; -} - -static float max(float a, float b) -{ - return (a >= b) ? a : b; -} - - -static float min(float a, float b) -{ - return (a <= b) ? a : b; -} - -static float fmax(float a, float b) -{ - return (a >= b) ? a : b; -} - -static float fmin(float a, float b) -{ - return (a <= b) ? a : b; -} - -struct int2 -{ - int x,y; -}; - -struct uint2 -{ - unsigned int x,y; -}; - -//typedef int2 uint2; - -typedef unsigned int uint; - -struct int4 -{ - int x,y,z,w; -}; - -struct uint4 -{ - unsigned int x,y,z,w; - uint4() {} - uint4(uint val) { x = y = z = w = val; } - uint4& operator+=(const uint4& other) - { - x += other.x; - y += other.y; - z += other.z; - w += other.w; - return *this; - } -}; -static uint4 operator+(const uint4& a,const uint4& b) -{ - uint4 tmp; - tmp.x = a.x + b.x; - tmp.y = a.y + b.y; - tmp.z = a.z + b.z; - tmp.w = a.w + b.w; - return tmp; -} -static uint4 operator-(const uint4& a,const uint4& b) -{ - uint4 tmp; - tmp.x = a.x - b.x; - tmp.y = a.y - b.y; - tmp.z = a.z - b.z; - tmp.w = a.w - b.w; - return tmp; -} - -#define native_sqrt sqrtf -#define native_sin sinf -#define native_cos cosf -#define native_powr powf - -#define GUID_ARG ,int __guid_arg -#define GUID_ARG_VAL ,__guid_arg - - -#define as_int(a) (*((int*)&(a))) - -extern "C" int gMiniCLNumOutstandingTasks; -// extern "C" void __kernel_func(); - - +/* +Bullet Continuous Collision Detection and Physics Library, Copyright (c) 2007 Erwin Coumans + +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 +#include "LinearMath/btScalar.h" + +#include "MiniCL/cl.h" + + +#define __kernel +#define __global +#define __local +#define get_global_id(a) __guid_arg +#define get_local_id(a) ((__guid_arg) % gMiniCLNumOutstandingTasks) +#define get_local_size(a) (gMiniCLNumOutstandingTasks) +#define get_group_id(a) ((__guid_arg) / gMiniCLNumOutstandingTasks) + +#define CLK_LOCAL_MEM_FENCE 0x01 +#define CLK_GLOBAL_MEM_FENCE 0x02 + +static void barrier(unsigned int a) +{ + // TODO : implement +} + +ATTRIBUTE_ALIGNED16(struct) float8 +{ + float s0; + float s1; + float s2; + float s3; + float s4; + float s5; + float s6; + float s7; + + float8(float scalar) + { + s0=s1=s2=s3=s4=s5=s6=s7=scalar; + } +}; + +ATTRIBUTE_ALIGNED16(struct) float4 +{ + float x,y,z,w; + float4() {} + float4(float v) + { + x = y = z = w = v; + } + float4 operator*(const float4& other) + { + float4 tmp; + tmp.x = x*other.x; + tmp.y = y*other.y; + tmp.z = z*other.z; + tmp.w = w*other.w; + return tmp; + } + + float4 operator*(const float& other) + { + float4 tmp; + tmp.x = x*other; + tmp.y = y*other; + tmp.z = z*other; + tmp.w = w*other; + return tmp; + } + + + + float4& operator+=(const float4& other) + { + x += other.x; + y += other.y; + z += other.z; + w += other.w; + return *this; + } + + float4& operator-=(const float4& other) + { + x -= other.x; + y -= other.y; + z -= other.z; + w -= other.w; + return *this; + } + + float4& operator *=(float scalar) + { + x *= scalar; + y *= scalar; + z *= scalar; + w *= scalar; + return (*this); + } + + + + + +}; + +static float4 fabs(const float4& a) +{ + float4 tmp; + tmp.x = a.x < 0.f ? 0.f : a.x; + tmp.y = a.y < 0.f ? 0.f : a.y; + tmp.z = a.z < 0.f ? 0.f : a.z; + tmp.w = a.w < 0.f ? 0.f : a.w; + return tmp; +} +static float4 operator+(const float4& a,const float4& b) +{ + float4 tmp; + tmp.x = a.x + b.x; + tmp.y = a.y + b.y; + tmp.z = a.z + b.z; + tmp.w = a.w + b.w; + return tmp; +} + +static float4 operator-(const float4& a,const float4& b) +{ + float4 tmp; + tmp.x = a.x - b.x; + tmp.y = a.y - b.y; + tmp.z = a.z - b.z; + tmp.w = a.w - b.w; + return tmp; +} +static float4 operator*(float a,const float4& b) +{ + float4 tmp; + tmp.x = a * b.x; + tmp.y = a * b.y; + tmp.z = a * b.z; + tmp.w = a * b.w; + return tmp; +} + + +static float dot(const float4&a ,const float4& b) +{ + float4 tmp; + tmp.x = a.x*b.x; + tmp.y = a.y*b.y; + tmp.z = a.z*b.z; + tmp.w = a.w*b.w; + return tmp.x+tmp.y+tmp.z+tmp.w; +} + +static float4 cross(const float4&a ,const float4& b) +{ + float4 tmp; + tmp.x = a.y*b.z - a.z*b.y; + tmp.y = -a.x*b.z + a.z*b.x; + tmp.z = a.x*b.y - a.y*b.x; + tmp.w = 0.f; + return tmp; +} + +static float max(float a, float b) +{ + return (a >= b) ? a : b; +} + + +static float min(float a, float b) +{ + return (a <= b) ? a : b; +} + +static float fmax(float a, float b) +{ + return (a >= b) ? a : b; +} + +static float fmin(float a, float b) +{ + return (a <= b) ? a : b; +} + +struct int2 +{ + int x,y; +}; + +struct uint2 +{ + unsigned int x,y; +}; + +//typedef int2 uint2; + +typedef unsigned int uint; + +struct int4 +{ + int x,y,z,w; +}; + +struct uint4 +{ + unsigned int x,y,z,w; + uint4() {} + uint4(uint val) { x = y = z = w = val; } + uint4& operator+=(const uint4& other) + { + x += other.x; + y += other.y; + z += other.z; + w += other.w; + return *this; + } +}; +static uint4 operator+(const uint4& a,const uint4& b) +{ + uint4 tmp; + tmp.x = a.x + b.x; + tmp.y = a.y + b.y; + tmp.z = a.z + b.z; + tmp.w = a.w + b.w; + return tmp; +} +static uint4 operator-(const uint4& a,const uint4& b) +{ + uint4 tmp; + tmp.x = a.x - b.x; + tmp.y = a.y - b.y; + tmp.z = a.z - b.z; + tmp.w = a.w - b.w; + return tmp; +} + +#define native_sqrt sqrtf +#define native_sin sinf +#define native_cos cosf +#define native_powr powf + +#define GUID_ARG ,int __guid_arg +#define GUID_ARG_VAL ,__guid_arg + + +#define as_int(a) (*((int*)&(a))) + +extern "C" int gMiniCLNumOutstandingTasks; +// extern "C" void __kernel_func(); + + diff --git a/src/MiniCL/cl_platform.h b/src/MiniCL/cl_platform.h index ae2c71b6a..3d372e305 100644 --- a/src/MiniCL/cl_platform.h +++ b/src/MiniCL/cl_platform.h @@ -1,254 +1,254 @@ -/********************************************************************************** - * Copyright (c) 2008-2009 The Khronos Group Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and/or associated documentation files (the - * "Materials"), to deal in the Materials without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Materials, and to - * permit persons to whom the Materials are furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Materials. - * - * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - **********************************************************************************/ - -#ifndef __CL_PLATFORM_H -#define __CL_PLATFORM_H - -#define CL_PLATFORM_MINI_CL 0x12345 - -struct MiniCLKernelDesc -{ - MiniCLKernelDesc(void* pCode, char* pName); -}; - -#define MINICL_REGISTER(__kernel_func) static MiniCLKernelDesc __kernel_func##Desc((void*)__kernel_func, #__kernel_func); - - -#ifdef __APPLE__ - /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ - #include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define CL_API_ENTRY -#define CL_API_CALL -#ifdef __APPLE__ -#define CL_API_SUFFIX__VERSION_1_0 // AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER -#define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) -#else -#define CL_API_SUFFIX__VERSION_1_0 -#define CL_EXTENSION_WEAK_LINK -#endif - -#if defined (_WIN32) && ! defined (__MINGW32__) -typedef signed __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef signed __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef signed __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - -typedef int8_t cl_char; -typedef uint8_t cl_uchar; -typedef int16_t cl_short ; -typedef uint16_t cl_ushort ; -typedef int32_t cl_int ; -typedef uint32_t cl_uint ; -typedef int64_t cl_long ; -typedef uint64_t cl_ulong ; - -typedef uint16_t cl_half ; -typedef float cl_float ; -typedef double cl_double ; - - -typedef int8_t cl_char2[2] ; -typedef int8_t cl_char4[4] ; -typedef int8_t cl_char8[8] ; -typedef int8_t cl_char16[16] ; -typedef uint8_t cl_uchar2[2] ; -typedef uint8_t cl_uchar4[4] ; -typedef uint8_t cl_uchar8[8] ; -typedef uint8_t cl_uchar16[16] ; - -typedef int16_t cl_short2[2] ; -typedef int16_t cl_short4[4] ; -typedef int16_t cl_short8[8] ; -typedef int16_t cl_short16[16] ; -typedef uint16_t cl_ushort2[2] ; -typedef uint16_t cl_ushort4[4] ; -typedef uint16_t cl_ushort8[8] ; -typedef uint16_t cl_ushort16[16] ; - -typedef int32_t cl_int2[2] ; -typedef int32_t cl_int4[4] ; -typedef int32_t cl_int8[8] ; -typedef int32_t cl_int16[16] ; -typedef uint32_t cl_uint2[2] ; -typedef uint32_t cl_uint4[4] ; -typedef uint32_t cl_uint8[8] ; -typedef uint32_t cl_uint16[16] ; - -typedef int64_t cl_long2[2] ; -typedef int64_t cl_long4[4] ; -typedef int64_t cl_long8[8] ; -typedef int64_t cl_long16[16] ; -typedef uint64_t cl_ulong2[2] ; -typedef uint64_t cl_ulong4[4] ; -typedef uint64_t cl_ulong8[8] ; -typedef uint64_t cl_ulong16[16] ; - -typedef float cl_float2[2] ; -typedef float cl_float4[4] ; -typedef float cl_float8[8] ; -typedef float cl_float16[16] ; - -typedef double cl_double2[2] ; -typedef double cl_double4[4] ; -typedef double cl_double8[8] ; -typedef double cl_double16[16] ; - - -#else -#include - -/* scalar types */ -typedef int8_t cl_char; -typedef uint8_t cl_uchar; -typedef int16_t cl_short __attribute__((aligned(2))); -typedef uint16_t cl_ushort __attribute__((aligned(2))); -typedef int32_t cl_int __attribute__((aligned(4))); -typedef uint32_t cl_uint __attribute__((aligned(4))); -typedef int64_t cl_long __attribute__((aligned(8))); -typedef uint64_t cl_ulong __attribute__((aligned(8))); - -typedef uint16_t cl_half __attribute__((aligned(2))); -typedef float cl_float __attribute__((aligned(4))); -typedef double cl_double __attribute__((aligned(8))); - - -/* - * Vector types - * - * Note: OpenCL requires that all types be naturally aligned. - * This means that vector types must be naturally aligned. - * For example, a vector of four floats must be aligned to - * a 16 byte boundary (calculated as 4 * the natural 4-byte - * alignment of the float). The alignment qualifiers here - * will only function properly if your compiler supports them - * and if you don't actively work to defeat them. For example, - * in order for a cl_float4 to be 16 byte aligned in a struct, - * the start of the struct must itself be 16-byte aligned. - * - * Maintaining proper alignment is the user's responsibility. - */ -typedef int8_t cl_char2[2] __attribute__((aligned(2))); -typedef int8_t cl_char4[4] __attribute__((aligned(4))); -typedef int8_t cl_char8[8] __attribute__((aligned(8))); -typedef int8_t cl_char16[16] __attribute__((aligned(16))); -typedef uint8_t cl_uchar2[2] __attribute__((aligned(2))); -typedef uint8_t cl_uchar4[4] __attribute__((aligned(4))); -typedef uint8_t cl_uchar8[8] __attribute__((aligned(8))); -typedef uint8_t cl_uchar16[16] __attribute__((aligned(16))); - -typedef int16_t cl_short2[2] __attribute__((aligned(4))); -typedef int16_t cl_short4[4] __attribute__((aligned(8))); -typedef int16_t cl_short8[8] __attribute__((aligned(16))); -typedef int16_t cl_short16[16] __attribute__((aligned(32))); -typedef uint16_t cl_ushort2[2] __attribute__((aligned(4))); -typedef uint16_t cl_ushort4[4] __attribute__((aligned(8))); -typedef uint16_t cl_ushort8[8] __attribute__((aligned(16))); -typedef uint16_t cl_ushort16[16] __attribute__((aligned(32))); - -typedef int32_t cl_int2[2] __attribute__((aligned(8))); -typedef int32_t cl_int4[4] __attribute__((aligned(16))); -typedef int32_t cl_int8[8] __attribute__((aligned(32))); -typedef int32_t cl_int16[16] __attribute__((aligned(64))); -typedef uint32_t cl_uint2[2] __attribute__((aligned(8))); -typedef uint32_t cl_uint4[4] __attribute__((aligned(16))); -typedef uint32_t cl_uint8[8] __attribute__((aligned(32))); -typedef uint32_t cl_uint16[16] __attribute__((aligned(64))); - -typedef int64_t cl_long2[2] __attribute__((aligned(16))); -typedef int64_t cl_long4[4] __attribute__((aligned(32))); -typedef int64_t cl_long8[8] __attribute__((aligned(64))); -typedef int64_t cl_long16[16] __attribute__((aligned(128))); -typedef uint64_t cl_ulong2[2] __attribute__((aligned(16))); -typedef uint64_t cl_ulong4[4] __attribute__((aligned(32))); -typedef uint64_t cl_ulong8[8] __attribute__((aligned(64))); -typedef uint64_t cl_ulong16[16] __attribute__((aligned(128))); - -typedef float cl_float2[2] __attribute__((aligned(8))); -typedef float cl_float4[4] __attribute__((aligned(16))); -typedef float cl_float8[8] __attribute__((aligned(32))); -typedef float cl_float16[16] __attribute__((aligned(64))); - -typedef double cl_double2[2] __attribute__((aligned(16))); -typedef double cl_double4[4] __attribute__((aligned(32))); -typedef double cl_double8[8] __attribute__((aligned(64))); -typedef double cl_double16[16] __attribute__((aligned(128))); -#endif - -#include - -/* and a few goodies to go with them */ -#define CL_CHAR_BIT 8 -#define CL_SCHAR_MAX 127 -#define CL_SCHAR_MIN (-127-1) -#define CL_CHAR_MAX CL_SCHAR_MAX -#define CL_CHAR_MIN CL_SCHAR_MIN -#define CL_UCHAR_MAX 255 -#define CL_SHRT_MAX 32767 -#define CL_SHRT_MIN (-32767-1) -#define CL_USHRT_MAX 65535 -#define CL_INT_MAX 2147483647 -#define CL_INT_MIN (-2147483647-1) -#define CL_UINT_MAX 0xffffffffU -#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) -#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) -#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) - -#define CL_FLT_DIG 6 -#define CL_FLT_MANT_DIG 24 -#define CL_FLT_MAX_10_EXP +38 -#define CL_FLT_MAX_EXP +128 -#define CL_FLT_MIN_10_EXP -37 -#define CL_FLT_MIN_EXP -125 -#define CL_FLT_RADIX 2 -#define CL_FLT_MAX 0x1.fffffep127f -#define CL_FLT_MIN 0x1.0p-126f -#define CL_FLT_EPSILON 0x1.0p-23f - -#define CL_DBL_DIG 15 -#define CL_DBL_MANT_DIG 53 -#define CL_DBL_MAX_10_EXP +308 -#define CL_DBL_MAX_EXP +1024 -#define CL_DBL_MIN_10_EXP -307 -#define CL_DBL_MIN_EXP -1021 -#define CL_DBL_RADIX 2 -#define CL_DBL_MAX 0x1.fffffffffffffp1023 -#define CL_DBL_MIN 0x1.0p-1022 -#define CL_DBL_EPSILON 0x1.0p-52 - -/* There are no vector types for half */ - -#ifdef __cplusplus -} -#endif - -#endif // __CL_PLATFORM_H +/********************************************************************************** + * Copyright (c) 2008-2009 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and/or associated documentation files (the + * "Materials"), to deal in the Materials without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Materials, and to + * permit persons to whom the Materials are furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + **********************************************************************************/ + +#ifndef __CL_PLATFORM_H +#define __CL_PLATFORM_H + +#define CL_PLATFORM_MINI_CL 0x12345 + +struct MiniCLKernelDesc +{ + MiniCLKernelDesc(void* pCode, char* pName); +}; + +#define MINICL_REGISTER(__kernel_func) static MiniCLKernelDesc __kernel_func##Desc((void*)__kernel_func, #__kernel_func); + + +#ifdef __APPLE__ + /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ + #include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define CL_API_ENTRY +#define CL_API_CALL +#ifdef __APPLE__ +#define CL_API_SUFFIX__VERSION_1_0 // AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) +#else +#define CL_API_SUFFIX__VERSION_1_0 +#define CL_EXTENSION_WEAK_LINK +#endif + +#if defined (_WIN32) && ! defined (__MINGW32__) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short ; +typedef uint16_t cl_ushort ; +typedef int32_t cl_int ; +typedef uint32_t cl_uint ; +typedef int64_t cl_long ; +typedef uint64_t cl_ulong ; + +typedef uint16_t cl_half ; +typedef float cl_float ; +typedef double cl_double ; + + +typedef int8_t cl_char2[2] ; +typedef int8_t cl_char4[4] ; +typedef int8_t cl_char8[8] ; +typedef int8_t cl_char16[16] ; +typedef uint8_t cl_uchar2[2] ; +typedef uint8_t cl_uchar4[4] ; +typedef uint8_t cl_uchar8[8] ; +typedef uint8_t cl_uchar16[16] ; + +typedef int16_t cl_short2[2] ; +typedef int16_t cl_short4[4] ; +typedef int16_t cl_short8[8] ; +typedef int16_t cl_short16[16] ; +typedef uint16_t cl_ushort2[2] ; +typedef uint16_t cl_ushort4[4] ; +typedef uint16_t cl_ushort8[8] ; +typedef uint16_t cl_ushort16[16] ; + +typedef int32_t cl_int2[2] ; +typedef int32_t cl_int4[4] ; +typedef int32_t cl_int8[8] ; +typedef int32_t cl_int16[16] ; +typedef uint32_t cl_uint2[2] ; +typedef uint32_t cl_uint4[4] ; +typedef uint32_t cl_uint8[8] ; +typedef uint32_t cl_uint16[16] ; + +typedef int64_t cl_long2[2] ; +typedef int64_t cl_long4[4] ; +typedef int64_t cl_long8[8] ; +typedef int64_t cl_long16[16] ; +typedef uint64_t cl_ulong2[2] ; +typedef uint64_t cl_ulong4[4] ; +typedef uint64_t cl_ulong8[8] ; +typedef uint64_t cl_ulong16[16] ; + +typedef float cl_float2[2] ; +typedef float cl_float4[4] ; +typedef float cl_float8[8] ; +typedef float cl_float16[16] ; + +typedef double cl_double2[2] ; +typedef double cl_double4[4] ; +typedef double cl_double8[8] ; +typedef double cl_double16[16] ; + + +#else +#include + +/* scalar types */ +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short __attribute__((aligned(2))); +typedef uint16_t cl_ushort __attribute__((aligned(2))); +typedef int32_t cl_int __attribute__((aligned(4))); +typedef uint32_t cl_uint __attribute__((aligned(4))); +typedef int64_t cl_long __attribute__((aligned(8))); +typedef uint64_t cl_ulong __attribute__((aligned(8))); + +typedef uint16_t cl_half __attribute__((aligned(2))); +typedef float cl_float __attribute__((aligned(4))); +typedef double cl_double __attribute__((aligned(8))); + + +/* + * Vector types + * + * Note: OpenCL requires that all types be naturally aligned. + * This means that vector types must be naturally aligned. + * For example, a vector of four floats must be aligned to + * a 16 byte boundary (calculated as 4 * the natural 4-byte + * alignment of the float). The alignment qualifiers here + * will only function properly if your compiler supports them + * and if you don't actively work to defeat them. For example, + * in order for a cl_float4 to be 16 byte aligned in a struct, + * the start of the struct must itself be 16-byte aligned. + * + * Maintaining proper alignment is the user's responsibility. + */ +typedef int8_t cl_char2[2] __attribute__((aligned(2))); +typedef int8_t cl_char4[4] __attribute__((aligned(4))); +typedef int8_t cl_char8[8] __attribute__((aligned(8))); +typedef int8_t cl_char16[16] __attribute__((aligned(16))); +typedef uint8_t cl_uchar2[2] __attribute__((aligned(2))); +typedef uint8_t cl_uchar4[4] __attribute__((aligned(4))); +typedef uint8_t cl_uchar8[8] __attribute__((aligned(8))); +typedef uint8_t cl_uchar16[16] __attribute__((aligned(16))); + +typedef int16_t cl_short2[2] __attribute__((aligned(4))); +typedef int16_t cl_short4[4] __attribute__((aligned(8))); +typedef int16_t cl_short8[8] __attribute__((aligned(16))); +typedef int16_t cl_short16[16] __attribute__((aligned(32))); +typedef uint16_t cl_ushort2[2] __attribute__((aligned(4))); +typedef uint16_t cl_ushort4[4] __attribute__((aligned(8))); +typedef uint16_t cl_ushort8[8] __attribute__((aligned(16))); +typedef uint16_t cl_ushort16[16] __attribute__((aligned(32))); + +typedef int32_t cl_int2[2] __attribute__((aligned(8))); +typedef int32_t cl_int4[4] __attribute__((aligned(16))); +typedef int32_t cl_int8[8] __attribute__((aligned(32))); +typedef int32_t cl_int16[16] __attribute__((aligned(64))); +typedef uint32_t cl_uint2[2] __attribute__((aligned(8))); +typedef uint32_t cl_uint4[4] __attribute__((aligned(16))); +typedef uint32_t cl_uint8[8] __attribute__((aligned(32))); +typedef uint32_t cl_uint16[16] __attribute__((aligned(64))); + +typedef int64_t cl_long2[2] __attribute__((aligned(16))); +typedef int64_t cl_long4[4] __attribute__((aligned(32))); +typedef int64_t cl_long8[8] __attribute__((aligned(64))); +typedef int64_t cl_long16[16] __attribute__((aligned(128))); +typedef uint64_t cl_ulong2[2] __attribute__((aligned(16))); +typedef uint64_t cl_ulong4[4] __attribute__((aligned(32))); +typedef uint64_t cl_ulong8[8] __attribute__((aligned(64))); +typedef uint64_t cl_ulong16[16] __attribute__((aligned(128))); + +typedef float cl_float2[2] __attribute__((aligned(8))); +typedef float cl_float4[4] __attribute__((aligned(16))); +typedef float cl_float8[8] __attribute__((aligned(32))); +typedef float cl_float16[16] __attribute__((aligned(64))); + +typedef double cl_double2[2] __attribute__((aligned(16))); +typedef double cl_double4[4] __attribute__((aligned(32))); +typedef double cl_double8[8] __attribute__((aligned(64))); +typedef double cl_double16[16] __attribute__((aligned(128))); +#endif + +#include + +/* and a few goodies to go with them */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 0x1.fffffep127f +#define CL_FLT_MIN 0x1.0p-126f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 0x1.fffffffffffffp1023 +#define CL_DBL_MIN 0x1.0p-1022 +#define CL_DBL_EPSILON 0x1.0p-52 + +/* There are no vector types for half */ + +#ifdef __cplusplus +} +#endif + +#endif // __CL_PLATFORM_H diff --git a/test1.oec b/test1.oec index c32c5669f..7fac1d151 100644 --- a/test1.oec +++ b/test1.oec @@ -1,227 +1,227 @@ -# OctaveEngine Casual (Jul 14 2008) -version 2 -p 22000 1 ff 7fff66ff 13 79 0 0 13 79 0 0 0 -p 22000 1 ff 7fff66ff 12.25 77.5 0 0 12.25 77.5 0 0 0 -p 22000 1 ff 7fff66ff 12.25 78.25 0 0 12.25 78.25 0 0 0 -p 22000 1 ff 7fff66ff 13 77.5 0 0 13 77.5 0 0 0 -p 22000 1 ff 7fff66ff 13 78.25 0 0 13 78.25 0 0 0 -p 22000 1 ff 7fff66ff 13.75 77.5 0 0 13.75 77.5 0 0 0 -p 22000 1 ff 7fff66ff 13.75 78.25 0 0 13.75 78.25 0 0 0 -p 22000 2 ff 7fff66ff 14.75 73.625 0 0 14.75 73.625 0 0 0 -p 22000 2 ff 7fff66ff 15.5 73.625 0 0 15.5 73.625 0 0 0 -p 22000 2 ff 7fff66ff 16.25 73.625 0 0 16.25 73.625 0 0 0 -p 22000 2 ff 7fff66ff 17 73.625 0 0 17 73.625 0 0 0 -p 22000 2 ff 7fff66ff 17.75 73.625 0 0 17.75 73.625 0 0 0 -p 22000 2 ff 7fff66ff 18.5 73.625 0 0 18.5 73.625 0 0 0 -p 22000 3 ff 7fff66ff 26 79 0 0 26 79 0 0 0 -p 22000 3 ff 7fff66ff 26.2372 78.2885 0 0 26.2372 78.2885 0 0 0 -p 22000 3 ff 7fff66ff 26.9705 78.1313 0 0 26.9705 78.1313 0 0 0 -p 22000 3 ff 7fff66ff 27.2344 78.8334 0 0 27.2344 78.8334 0 0 0 -p 22000 3 ff 7fff66ff 27.0215 79.5525 0 0 27.0215 79.5525 0 0 0 -p 22000 3 ff 7fff66ff 26.5164 80.107 0 0 26.5164 80.107 0 0 0 -p 22000 4 ff 7fff66ff 42 73.875 0 0 42 73.875 0 0 0 -p 22000 4 ff 7fff66ff 42.5857 73.4065 0 0 42.5857 73.4065 0 0 0 -p 22000 4 ff 7fff66ff 41.8884 73.1303 0 0 41.8884 73.1303 0 0 0 -p 22000 4 ff 7fff66ff 41.3003 72.6648 0 0 41.3003 72.6648 0 0 0 -p 22000 4 ff 7fff66ff 40.6805 73.0872 0 0 40.6805 73.0872 0 0 0 -p 22000 5 ff 7fff66ff 57.125 74 0 0 57.125 74 0 0 0 -p 22000 5 ff 7fff66ff 57.7958 73.6646 0 0 57.7958 73.6646 0 0 0 -p 22000 5 ff 7fff66ff 58.1111 74.3451 0 0 58.1111 74.3451 0 0 0 -p 22000 5 ff 7fff66ff 57.5445 74.8364 0 0 57.5445 74.8364 0 0 0 -p 822000 12 ff 99cc7fff 41.875 70 0 0 41.875 70 0 0 0 -p 822000 12 ff 99cc7fff 41.125 70 0 0 41.125 70 0 0 0 -p 822000 12 ff 99cc7fff 40.3852 70.1233 0 0 40.3852 70.1233 0 0 0 -p 822000 12 ff 99cc7fff 39.6352 70.125 0 0 39.6352 70.125 0 0 0 -p 822000 12 ff 99cc7fff 38.8926 70.2299 0 0 38.8926 70.2299 0 0 0 -p 822000 12 ff 99cc7fff 38.1428 70.2495 0 0 38.1428 70.2495 0 0 0 -p 822000 12 ff 99cc7fff 37.3928 70.25 0 0 37.3928 70.25 0 0 0 -p 22000 15 ff 7fff66ff 62.25 57.625 0 0 62.25 57.625 0 0 0 -p 22000 15 ff 7fff66ff 62.9615 57.3878 0 0 62.9615 57.3878 0 0 0 -p 22000 15 ff 7fff66ff 62.8866 58.1341 0 0 62.8866 58.1341 0 0 0 -p 22000 15 ff 7fff66ff 62.2927 58.5921 0 0 62.2927 58.5921 0 0 0 -p 22000 14 ff 7fff66ff 46.875 59 0 0 46.875 59 0 0 0 -p 22000 14 ff 7fff66ff 47.3435 58.4143 0 0 47.3435 58.4143 0 0 0 -p 22000 14 ff 7fff66ff 48.0775 58.26 0 0 48.0775 58.26 0 0 0 -p 22000 14 ff 7fff66ff 48.4494 58.9113 0 0 48.4494 58.9113 0 0 0 -p 22000 14 ff 7fff66ff 48.2759 59.641 0 0 48.2759 59.641 0 0 0 -p 22000 17 ff 7fff66ff 32.625 58.625 0 0 32.625 58.625 0 0 0 -p 22000 17 ff 7fff66ff 33.2958 58.2896 0 0 33.2958 58.2896 0 0 0 -p 22000 17 ff 7fff66ff 34.045 58.2538 0 0 34.045 58.2538 0 0 0 -p 22000 17 ff 7fff66ff 34.3483 58.9397 0 0 34.3483 58.9397 0 0 0 -p 22000 16 ff 7fff66ff 23 50 0 0 23 50 0 0 0 -p 22000 16 ff 7fff66ff 23.6512 49.6279 0 0 23.6512 49.6279 0 0 0 -p 22000 16 ff 7fff66ff 24.3928 49.5162 0 0 24.3928 49.5162 0 0 0 -p 22000 16 ff 7fff66ff 24.1695 50.2321 0 0 24.1695 50.2321 0 0 0 -p 22000 18 ff 7fff66ff 18.375 59.25 0 0 18.375 59.25 0 0 0 -p 22000 18 ff 7fff66ff 18.9053 58.7197 0 0 18.9053 58.7197 0 0 0 -p 22000 18 ff 7fff66ff 19.4651 59.2189 0 0 19.4651 59.2189 0 0 0 -p 22000 18 ff 7fff66ff 19.3792 59.9639 0 0 19.3792 59.9639 0 0 0 -p 22000 7 ff 7fff66ff 44.125 51.75 0 0 44.125 51.75 0 0 0 -p 22000 7 ff 7fff66ff 44.0017 51.0102 0 0 44.0017 51.0102 0 0 0 -p 22000 7 ff 7fff66ff 44.743 51.1239 0 0 44.743 51.1239 0 0 0 -p 22000 7 ff 7fff66ff 45.0428 51.8114 0 0 45.0428 51.8114 0 0 0 -p 22000 8 ff 7fff66ff 59.125 49.375 0 0 59.125 49.375 0 0 0 -p 22000 8 ff 7fff66ff 59.125 48.625 0 0 59.125 48.625 0 0 0 -p 22000 8 ff 7fff66ff 59.7958 48.2896 0 0 59.7958 48.2896 0 0 0 -p 22000 8 ff 7fff66ff 59.9739 49.0181 0 0 59.9739 49.0181 0 0 0 -p 22000 9 ff 7fff66ff 42.5 41.625 0 0 42.5 41.625 0 0 0 -p 22000 9 ff 7fff66ff 43.0303 41.0947 0 0 43.0303 41.0947 0 0 0 -p 22000 9 ff 7fff66ff 43.7798 41.1216 0 0 43.7798 41.1216 0 0 0 -p 22000 9 ff 7fff66ff 44.3525 41.6059 0 0 44.3525 41.6059 0 0 0 -p 22000 9 ff 7fff66ff 43.9569 42.2431 0 0 43.9569 42.2431 0 0 0 -p 22000 a ff 7fff66ff 70.375 63.125 0 0 70.375 63.125 0 0 0 -p 22000 a ff 7fff66ff 70.375 62.375 0 0 70.375 62.375 0 0 0 -p 22000 a ff 7fff66ff 71.1148 62.4983 0 0 71.1148 62.4983 0 0 0 -p 22000 a ff 7fff66ff 71.2476 63.2365 0 0 71.2476 63.2365 0 0 0 -p 22000 b ff 7fff66ff 15.5 40.375 0 0 15.5 40.375 0 0 0 -p 22000 b ff 7fff66ff 16.124 39.959 0 0 16.124 39.959 0 0 0 -p 22000 b ff 7fff66ff 16.8729 39.9999 0 0 16.8729 39.9999 0 0 0 -p 22000 b ff 7fff66ff 17.2098 40.67 0 0 17.2098 40.67 0 0 0 -p 22000 c ff 7fff66ff 29.375 37.875 0 0 29.375 37.875 0 0 0 -p 22000 c ff 7fff66ff 29.791 37.251 0 0 29.791 37.251 0 0 0 -p 22000 c ff 7fff66ff 30.5326 37.139 0 0 30.5326 37.139 0 0 0 -p 22000 c ff 7fff66ff 30.6126 37.8847 0 0 30.6126 37.8847 0 0 0 -p 22000 d ff 7fff66ff 69.75 49 0 0 69.75 49 0 0 0 -p 22000 d ff 7fff66ff 69.8733 48.2602 0 0 69.8733 48.2602 0 0 0 -p 22000 d ff 7fff66ff 69.875 47.5102 0 0 69.875 47.5102 0 0 0 -p 22000 d ff 7fff66ff 69.875 46.7602 0 0 69.875 46.7602 0 0 0 -p 22000 d ff 7fff66ff 69.875 46.0102 0 0 69.875 46.0102 0 0 0 -p 22000 e ff 7fff66ff 61.625 38 0 0 61.625 38 0 0 0 -p 22000 e ff 7fff66ff 61.625 37.25 0 0 61.625 37.25 0 0 0 -p 22000 e ff 7fff66ff 61.625 36.5 0 0 61.625 36.5 0 0 0 -p 22000 e ff 7fff66ff 61.625 35.75 0 0 61.625 35.75 0 0 0 -p 22000 e ff 7fff66ff 61.625 35 0 0 61.625 35 0 0 0 -p 22000 11 ff 7fff66ff 7.25 54 0 0 7.25 54 0 0 0 -p 22000 11 ff 7fff66ff 7.25 53.25 0 0 7.25 53.25 0 0 0 -p 22000 11 ff 7fff66ff 7.25 52.5 0 0 7.25 52.5 0 0 0 -p 22000 11 ff 7fff66ff 7.25 51.75 0 0 7.25 51.75 0 0 0 -p 402000 0 ff b26666ff 55.75 70.75 0 0 55.75 70.75 0 0 0 -p 402000 0 ff b26666ff 55.75 70 0 0 55.75 70 0 0 0 -p 402000 0 ff b26666ff 56.5 70 0 0 56.5 70 0 0 0 -p 402000 0 ff b26666ff 56.5 70.75 0 0 56.5 70.75 0 0 0 -p 402000 0 ff b26666ff 57.25 70.75 0 0 57.25 70.75 0 0 0 -p 402000 0 ff b26666ff 57.25 70 0 0 57.25 70 0 0 0 -p 402000 0 ff b26666ff 58 70 0 0 58 70 0 0 0 -p 402000 0 ff b26666ff 58 70.75 0 0 58 70.75 0 0 0 -p 402000 0 ff b26666ff 58.75 70 0 0 58.75 70 0 0 0 -p 402000 0 ff b26666ff 58.75 70.75 0 0 58.75 70.75 0 0 0 -p 402000 0 ff b26666ff 59.5 70.75 0 0 59.5 70.75 0 0 0 -p 402000 0 ff b26666ff 59.5 70 0 0 59.5 70 0 0 0 -p 402000 0 ff b26666ff 60.25 70 0 0 60.25 70 0 0 0 -p 402000 0 ff b26666ff 60.25 70.75 0 0 60.25 70.75 0 0 0 -p 402000 0 ff b26666ff 61 70 0 0 61 70 0 0 0 -p 402000 0 ff b26666ff 61 70.75 0 0 61 70.75 0 0 0 -p 402000 0 ff b26666ff 43 35.5 0 0 43 35.5 0 0 0 -p 402000 0 ff b26666ff 43 34 0 0 43 34 0 0 0 -p 402000 0 ff b26666ff 43 34.75 0 0 43 34.75 0 0 0 -p 402000 0 ff b26666ff 43.75 35.5 0 0 43.75 35.5 0 0 0 -p 402000 0 ff b26666ff 43.75 34 0 0 43.75 34 0 0 0 -p 402000 0 ff b26666ff 43.75 34.75 0 0 43.75 34.75 0 0 0 -p 402000 0 ff b26666ff 44.5 34.75 0 0 44.5 34.75 0 0 0 -p 402000 0 ff b26666ff 44.5 34 0 0 44.5 34 0 0 0 -p 402000 0 ff b26666ff 45.25 34 0 0 45.25 34 0 0 0 -p 402000 0 ff b26666ff 45.25 34.75 0 0 45.25 34.75 0 0 0 -p 402000 0 ff b26666ff 46 34 0 0 46 34 0 0 0 -p 402000 0 ff b26666ff 46 34.75 0 0 46 34.75 0 0 0 -@ time 7.52012 -@ timeStep 1504 -@ scale 8 -@ timeStepsPerFrame 8 -@ framesPerSecond 25 -@ pauseFlag 1 -@ randSeed 0 -@ gravityFlag 1 -@ gravityAcceleration 0.001 -@ gravityAmplification 1 -@ gravityAngle 0 -@ boundsFlag 1 -@ boundsThickness 0.25 -@ boundsLeft 0 -@ boundsRight 94.75 -@ boundsBottom 0 -@ boundsTop 89.25 -@ boundsRadius 1 -@ standardDistance 0.75 -@ standardDensity 1.0025 -@ maxSpeed 0.5 -@ pressureCoefficient 0.05 -@ repulsionCoefficient 0.05 -@ dampingFlag 1 -@ dampingCoefficient 0.05 -@ staticPressureFlag 0 -@ staticPressureCoefficient 0.5 -@ staticPressureIteration 1 -@ staticMaxPressure 0.5 -@ springCoefficient 0.05 -@ springIteration 5 -@ elasticCoefficient 0.5 -@ elasticIteration 5 -@ mochiElasticityCoefficient 0.1 -@ mochiSpringCoefficient 0.1 -@ mochiIteration 3 -@ viscosityCoefficient 0.4 -@ viscosityIteration 5 -@ surfaceTensionCoefficient 0.1 -@ surfacePressureCoefficient 0.05 -@ surfaceTensionIteration 5 -@ powderSpringCoefficient 0.5 -@ powderDampingCoefficient 0.3 -@ powderFrictionCoefficient 0.05 -@ powderLightProbability 0.5 -@ powderExtinguishProbability 0.05 -@ powderExplosionCoefficient 1 -@ brittlenessCoefficient 0.5 -@ jetCoefficient 0.5 -@ fuelLightProbability 0.01 -@ fuelExtinguishProbability 0.0005 -@ upCoefficient 10 -@ downCoefficient 10 -@ yukiSpringCoefficient 0.02 -@ yukiMeltingProbability 0.0001 -@ resistanceFlag 0 -@ resistanceCoefficient 0.02 -@ fireFlag 1 -@ fireProbability 0.005 -@ fireLife 1000 -@ fireBuoyancyCoefficient 10 -@ splashFlag 0 -@ splashProbability 0.05 -@ splashExpansion 1e-005 -@ splashMinLife 50 -@ bubbleFlag 0 -@ bubbleProbability 0.05 -@ bubbleLife 10000 -@ bubbleBuoyancyCoefficient 20 -@ pouringFlag 0 -@ pouringRainFlag 0 -@ pouringLocation 10 -@ pouringThickness 2 -@ pouringVelocity 0.1 -@ pouringTimer 0 -@ pouringMaterial 113 -@ pouringLayer -1 -@ clearFlag 1 -@ clearColorRed 0.2 -@ clearColorBlue 0.2 -@ clearColorGreen 0.2 -@ clearColorAlpha 1 -@ mouseRadius 1 -@ mouseDelay 10 -@ mouseForce 1 -@ lineWidth 1 -@ usersCharge 0 -@ usersMaxCharge 15 -@ usersSpeedX 0.05 -@ usersSpeedY 0.15 -@ usersForceX 0.05 -@ usersForceY 0.5 -@ usersX 0 -@ usersY 0 -@ viewWidth 0 -@ viewHeight 0 -@ scrollFlag 0 -@ scrollX 0 -@ scrollY 0 -@ scrollAngle 0 -@ colorFlag 1 -@ renderMode 2 +# OctaveEngine Casual (Jul 14 2008) +version 2 +p 22000 1 ff 7fff66ff 13 79 0 0 13 79 0 0 0 +p 22000 1 ff 7fff66ff 12.25 77.5 0 0 12.25 77.5 0 0 0 +p 22000 1 ff 7fff66ff 12.25 78.25 0 0 12.25 78.25 0 0 0 +p 22000 1 ff 7fff66ff 13 77.5 0 0 13 77.5 0 0 0 +p 22000 1 ff 7fff66ff 13 78.25 0 0 13 78.25 0 0 0 +p 22000 1 ff 7fff66ff 13.75 77.5 0 0 13.75 77.5 0 0 0 +p 22000 1 ff 7fff66ff 13.75 78.25 0 0 13.75 78.25 0 0 0 +p 22000 2 ff 7fff66ff 14.75 73.625 0 0 14.75 73.625 0 0 0 +p 22000 2 ff 7fff66ff 15.5 73.625 0 0 15.5 73.625 0 0 0 +p 22000 2 ff 7fff66ff 16.25 73.625 0 0 16.25 73.625 0 0 0 +p 22000 2 ff 7fff66ff 17 73.625 0 0 17 73.625 0 0 0 +p 22000 2 ff 7fff66ff 17.75 73.625 0 0 17.75 73.625 0 0 0 +p 22000 2 ff 7fff66ff 18.5 73.625 0 0 18.5 73.625 0 0 0 +p 22000 3 ff 7fff66ff 26 79 0 0 26 79 0 0 0 +p 22000 3 ff 7fff66ff 26.2372 78.2885 0 0 26.2372 78.2885 0 0 0 +p 22000 3 ff 7fff66ff 26.9705 78.1313 0 0 26.9705 78.1313 0 0 0 +p 22000 3 ff 7fff66ff 27.2344 78.8334 0 0 27.2344 78.8334 0 0 0 +p 22000 3 ff 7fff66ff 27.0215 79.5525 0 0 27.0215 79.5525 0 0 0 +p 22000 3 ff 7fff66ff 26.5164 80.107 0 0 26.5164 80.107 0 0 0 +p 22000 4 ff 7fff66ff 42 73.875 0 0 42 73.875 0 0 0 +p 22000 4 ff 7fff66ff 42.5857 73.4065 0 0 42.5857 73.4065 0 0 0 +p 22000 4 ff 7fff66ff 41.8884 73.1303 0 0 41.8884 73.1303 0 0 0 +p 22000 4 ff 7fff66ff 41.3003 72.6648 0 0 41.3003 72.6648 0 0 0 +p 22000 4 ff 7fff66ff 40.6805 73.0872 0 0 40.6805 73.0872 0 0 0 +p 22000 5 ff 7fff66ff 57.125 74 0 0 57.125 74 0 0 0 +p 22000 5 ff 7fff66ff 57.7958 73.6646 0 0 57.7958 73.6646 0 0 0 +p 22000 5 ff 7fff66ff 58.1111 74.3451 0 0 58.1111 74.3451 0 0 0 +p 22000 5 ff 7fff66ff 57.5445 74.8364 0 0 57.5445 74.8364 0 0 0 +p 822000 12 ff 99cc7fff 41.875 70 0 0 41.875 70 0 0 0 +p 822000 12 ff 99cc7fff 41.125 70 0 0 41.125 70 0 0 0 +p 822000 12 ff 99cc7fff 40.3852 70.1233 0 0 40.3852 70.1233 0 0 0 +p 822000 12 ff 99cc7fff 39.6352 70.125 0 0 39.6352 70.125 0 0 0 +p 822000 12 ff 99cc7fff 38.8926 70.2299 0 0 38.8926 70.2299 0 0 0 +p 822000 12 ff 99cc7fff 38.1428 70.2495 0 0 38.1428 70.2495 0 0 0 +p 822000 12 ff 99cc7fff 37.3928 70.25 0 0 37.3928 70.25 0 0 0 +p 22000 15 ff 7fff66ff 62.25 57.625 0 0 62.25 57.625 0 0 0 +p 22000 15 ff 7fff66ff 62.9615 57.3878 0 0 62.9615 57.3878 0 0 0 +p 22000 15 ff 7fff66ff 62.8866 58.1341 0 0 62.8866 58.1341 0 0 0 +p 22000 15 ff 7fff66ff 62.2927 58.5921 0 0 62.2927 58.5921 0 0 0 +p 22000 14 ff 7fff66ff 46.875 59 0 0 46.875 59 0 0 0 +p 22000 14 ff 7fff66ff 47.3435 58.4143 0 0 47.3435 58.4143 0 0 0 +p 22000 14 ff 7fff66ff 48.0775 58.26 0 0 48.0775 58.26 0 0 0 +p 22000 14 ff 7fff66ff 48.4494 58.9113 0 0 48.4494 58.9113 0 0 0 +p 22000 14 ff 7fff66ff 48.2759 59.641 0 0 48.2759 59.641 0 0 0 +p 22000 17 ff 7fff66ff 32.625 58.625 0 0 32.625 58.625 0 0 0 +p 22000 17 ff 7fff66ff 33.2958 58.2896 0 0 33.2958 58.2896 0 0 0 +p 22000 17 ff 7fff66ff 34.045 58.2538 0 0 34.045 58.2538 0 0 0 +p 22000 17 ff 7fff66ff 34.3483 58.9397 0 0 34.3483 58.9397 0 0 0 +p 22000 16 ff 7fff66ff 23 50 0 0 23 50 0 0 0 +p 22000 16 ff 7fff66ff 23.6512 49.6279 0 0 23.6512 49.6279 0 0 0 +p 22000 16 ff 7fff66ff 24.3928 49.5162 0 0 24.3928 49.5162 0 0 0 +p 22000 16 ff 7fff66ff 24.1695 50.2321 0 0 24.1695 50.2321 0 0 0 +p 22000 18 ff 7fff66ff 18.375 59.25 0 0 18.375 59.25 0 0 0 +p 22000 18 ff 7fff66ff 18.9053 58.7197 0 0 18.9053 58.7197 0 0 0 +p 22000 18 ff 7fff66ff 19.4651 59.2189 0 0 19.4651 59.2189 0 0 0 +p 22000 18 ff 7fff66ff 19.3792 59.9639 0 0 19.3792 59.9639 0 0 0 +p 22000 7 ff 7fff66ff 44.125 51.75 0 0 44.125 51.75 0 0 0 +p 22000 7 ff 7fff66ff 44.0017 51.0102 0 0 44.0017 51.0102 0 0 0 +p 22000 7 ff 7fff66ff 44.743 51.1239 0 0 44.743 51.1239 0 0 0 +p 22000 7 ff 7fff66ff 45.0428 51.8114 0 0 45.0428 51.8114 0 0 0 +p 22000 8 ff 7fff66ff 59.125 49.375 0 0 59.125 49.375 0 0 0 +p 22000 8 ff 7fff66ff 59.125 48.625 0 0 59.125 48.625 0 0 0 +p 22000 8 ff 7fff66ff 59.7958 48.2896 0 0 59.7958 48.2896 0 0 0 +p 22000 8 ff 7fff66ff 59.9739 49.0181 0 0 59.9739 49.0181 0 0 0 +p 22000 9 ff 7fff66ff 42.5 41.625 0 0 42.5 41.625 0 0 0 +p 22000 9 ff 7fff66ff 43.0303 41.0947 0 0 43.0303 41.0947 0 0 0 +p 22000 9 ff 7fff66ff 43.7798 41.1216 0 0 43.7798 41.1216 0 0 0 +p 22000 9 ff 7fff66ff 44.3525 41.6059 0 0 44.3525 41.6059 0 0 0 +p 22000 9 ff 7fff66ff 43.9569 42.2431 0 0 43.9569 42.2431 0 0 0 +p 22000 a ff 7fff66ff 70.375 63.125 0 0 70.375 63.125 0 0 0 +p 22000 a ff 7fff66ff 70.375 62.375 0 0 70.375 62.375 0 0 0 +p 22000 a ff 7fff66ff 71.1148 62.4983 0 0 71.1148 62.4983 0 0 0 +p 22000 a ff 7fff66ff 71.2476 63.2365 0 0 71.2476 63.2365 0 0 0 +p 22000 b ff 7fff66ff 15.5 40.375 0 0 15.5 40.375 0 0 0 +p 22000 b ff 7fff66ff 16.124 39.959 0 0 16.124 39.959 0 0 0 +p 22000 b ff 7fff66ff 16.8729 39.9999 0 0 16.8729 39.9999 0 0 0 +p 22000 b ff 7fff66ff 17.2098 40.67 0 0 17.2098 40.67 0 0 0 +p 22000 c ff 7fff66ff 29.375 37.875 0 0 29.375 37.875 0 0 0 +p 22000 c ff 7fff66ff 29.791 37.251 0 0 29.791 37.251 0 0 0 +p 22000 c ff 7fff66ff 30.5326 37.139 0 0 30.5326 37.139 0 0 0 +p 22000 c ff 7fff66ff 30.6126 37.8847 0 0 30.6126 37.8847 0 0 0 +p 22000 d ff 7fff66ff 69.75 49 0 0 69.75 49 0 0 0 +p 22000 d ff 7fff66ff 69.8733 48.2602 0 0 69.8733 48.2602 0 0 0 +p 22000 d ff 7fff66ff 69.875 47.5102 0 0 69.875 47.5102 0 0 0 +p 22000 d ff 7fff66ff 69.875 46.7602 0 0 69.875 46.7602 0 0 0 +p 22000 d ff 7fff66ff 69.875 46.0102 0 0 69.875 46.0102 0 0 0 +p 22000 e ff 7fff66ff 61.625 38 0 0 61.625 38 0 0 0 +p 22000 e ff 7fff66ff 61.625 37.25 0 0 61.625 37.25 0 0 0 +p 22000 e ff 7fff66ff 61.625 36.5 0 0 61.625 36.5 0 0 0 +p 22000 e ff 7fff66ff 61.625 35.75 0 0 61.625 35.75 0 0 0 +p 22000 e ff 7fff66ff 61.625 35 0 0 61.625 35 0 0 0 +p 22000 11 ff 7fff66ff 7.25 54 0 0 7.25 54 0 0 0 +p 22000 11 ff 7fff66ff 7.25 53.25 0 0 7.25 53.25 0 0 0 +p 22000 11 ff 7fff66ff 7.25 52.5 0 0 7.25 52.5 0 0 0 +p 22000 11 ff 7fff66ff 7.25 51.75 0 0 7.25 51.75 0 0 0 +p 402000 0 ff b26666ff 55.75 70.75 0 0 55.75 70.75 0 0 0 +p 402000 0 ff b26666ff 55.75 70 0 0 55.75 70 0 0 0 +p 402000 0 ff b26666ff 56.5 70 0 0 56.5 70 0 0 0 +p 402000 0 ff b26666ff 56.5 70.75 0 0 56.5 70.75 0 0 0 +p 402000 0 ff b26666ff 57.25 70.75 0 0 57.25 70.75 0 0 0 +p 402000 0 ff b26666ff 57.25 70 0 0 57.25 70 0 0 0 +p 402000 0 ff b26666ff 58 70 0 0 58 70 0 0 0 +p 402000 0 ff b26666ff 58 70.75 0 0 58 70.75 0 0 0 +p 402000 0 ff b26666ff 58.75 70 0 0 58.75 70 0 0 0 +p 402000 0 ff b26666ff 58.75 70.75 0 0 58.75 70.75 0 0 0 +p 402000 0 ff b26666ff 59.5 70.75 0 0 59.5 70.75 0 0 0 +p 402000 0 ff b26666ff 59.5 70 0 0 59.5 70 0 0 0 +p 402000 0 ff b26666ff 60.25 70 0 0 60.25 70 0 0 0 +p 402000 0 ff b26666ff 60.25 70.75 0 0 60.25 70.75 0 0 0 +p 402000 0 ff b26666ff 61 70 0 0 61 70 0 0 0 +p 402000 0 ff b26666ff 61 70.75 0 0 61 70.75 0 0 0 +p 402000 0 ff b26666ff 43 35.5 0 0 43 35.5 0 0 0 +p 402000 0 ff b26666ff 43 34 0 0 43 34 0 0 0 +p 402000 0 ff b26666ff 43 34.75 0 0 43 34.75 0 0 0 +p 402000 0 ff b26666ff 43.75 35.5 0 0 43.75 35.5 0 0 0 +p 402000 0 ff b26666ff 43.75 34 0 0 43.75 34 0 0 0 +p 402000 0 ff b26666ff 43.75 34.75 0 0 43.75 34.75 0 0 0 +p 402000 0 ff b26666ff 44.5 34.75 0 0 44.5 34.75 0 0 0 +p 402000 0 ff b26666ff 44.5 34 0 0 44.5 34 0 0 0 +p 402000 0 ff b26666ff 45.25 34 0 0 45.25 34 0 0 0 +p 402000 0 ff b26666ff 45.25 34.75 0 0 45.25 34.75 0 0 0 +p 402000 0 ff b26666ff 46 34 0 0 46 34 0 0 0 +p 402000 0 ff b26666ff 46 34.75 0 0 46 34.75 0 0 0 +@ time 7.52012 +@ timeStep 1504 +@ scale 8 +@ timeStepsPerFrame 8 +@ framesPerSecond 25 +@ pauseFlag 1 +@ randSeed 0 +@ gravityFlag 1 +@ gravityAcceleration 0.001 +@ gravityAmplification 1 +@ gravityAngle 0 +@ boundsFlag 1 +@ boundsThickness 0.25 +@ boundsLeft 0 +@ boundsRight 94.75 +@ boundsBottom 0 +@ boundsTop 89.25 +@ boundsRadius 1 +@ standardDistance 0.75 +@ standardDensity 1.0025 +@ maxSpeed 0.5 +@ pressureCoefficient 0.05 +@ repulsionCoefficient 0.05 +@ dampingFlag 1 +@ dampingCoefficient 0.05 +@ staticPressureFlag 0 +@ staticPressureCoefficient 0.5 +@ staticPressureIteration 1 +@ staticMaxPressure 0.5 +@ springCoefficient 0.05 +@ springIteration 5 +@ elasticCoefficient 0.5 +@ elasticIteration 5 +@ mochiElasticityCoefficient 0.1 +@ mochiSpringCoefficient 0.1 +@ mochiIteration 3 +@ viscosityCoefficient 0.4 +@ viscosityIteration 5 +@ surfaceTensionCoefficient 0.1 +@ surfacePressureCoefficient 0.05 +@ surfaceTensionIteration 5 +@ powderSpringCoefficient 0.5 +@ powderDampingCoefficient 0.3 +@ powderFrictionCoefficient 0.05 +@ powderLightProbability 0.5 +@ powderExtinguishProbability 0.05 +@ powderExplosionCoefficient 1 +@ brittlenessCoefficient 0.5 +@ jetCoefficient 0.5 +@ fuelLightProbability 0.01 +@ fuelExtinguishProbability 0.0005 +@ upCoefficient 10 +@ downCoefficient 10 +@ yukiSpringCoefficient 0.02 +@ yukiMeltingProbability 0.0001 +@ resistanceFlag 0 +@ resistanceCoefficient 0.02 +@ fireFlag 1 +@ fireProbability 0.005 +@ fireLife 1000 +@ fireBuoyancyCoefficient 10 +@ splashFlag 0 +@ splashProbability 0.05 +@ splashExpansion 1e-005 +@ splashMinLife 50 +@ bubbleFlag 0 +@ bubbleProbability 0.05 +@ bubbleLife 10000 +@ bubbleBuoyancyCoefficient 20 +@ pouringFlag 0 +@ pouringRainFlag 0 +@ pouringLocation 10 +@ pouringThickness 2 +@ pouringVelocity 0.1 +@ pouringTimer 0 +@ pouringMaterial 113 +@ pouringLayer -1 +@ clearFlag 1 +@ clearColorRed 0.2 +@ clearColorBlue 0.2 +@ clearColorGreen 0.2 +@ clearColorAlpha 1 +@ mouseRadius 1 +@ mouseDelay 10 +@ mouseForce 1 +@ lineWidth 1 +@ usersCharge 0 +@ usersMaxCharge 15 +@ usersSpeedX 0.05 +@ usersSpeedY 0.15 +@ usersForceX 0.05 +@ usersForceY 0.5 +@ usersX 0 +@ usersY 0 +@ viewWidth 0 +@ viewHeight 0 +@ scrollFlag 0 +@ scrollX 0 +@ scrollY 0 +@ scrollAngle 0 +@ colorFlag 1 +@ renderMode 2